diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..a0fa3eff --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# editorconfig.org +root = true + +[{*.patch,syntax_test_*}] +trim_trailing_whitespace = false + +[{*.c,*.cpp,*.h}] +charset = utf-8 + +[{*.c,*.cpp,*.h,Makefile}] +trim_trailing_whitespace = true +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 2 + +[{*.py,*.conf,*.sublime-project}] +indent_style = tab +indent_size = 4 diff --git a/.gitattributes b/.gitattributes index dfe07704..2588229e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,19 @@ -# Auto detect text files and perform LF normalization +# Set the default behavior, in case people don't have core.autocrlf set. * text=auto + +# Files with Unix line endings +*.c text eol=lf +*.cpp text eol=lf +*.h text eol=lf +*.ino text eol=lf +*.py text eol=lf +*.sh text eol=lf +*.scad text eol=lf + +# Files with native line endings +# *.sln text + +# Binary files +*.png binary +*.jpg binary +*.fon binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c163d339 --- /dev/null +++ b/.gitignore @@ -0,0 +1,186 @@ +# +# 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 . +# + +# Our automatic versioning scheme generates the following file +# NEVER put it in the repository +_Version.h + +# +# OS +# +applet/ +*.DS_Store + +# +# Misc +# +*~ +*.orig +*.rej +*.bak +*.idea +*.s +*.i +*.ii +*.swp +tags + +# +# C++ +# +# Compiled Object files +*.slo +*.lo +*.o +*.obj +*.ino.cpp + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + + +# +# C +# +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su + +# PlatformIO files/dirs +.pio* +.pioenvs +.piolibdeps +.clang_complete +.gcc-flags.json +/lib/ + +# Workaround for Deviot+platformio quirks +Marlin/lib +Marlin/platformio.ini +Marlin/*/platformio.ini +Marlin/*/*/platformio.ini +Marlin/*/*/*/platformio.ini +Marlin/*/*/*/*/platformio.ini +Marlin/.travis.yml +Marlin/*/.travis.yml +Marlin/*/*/.travis.yml +Marlin/*/*/*/.travis.yml +Marlin/*/*/*/*/.travis.yml +Marlin/.gitignore +Marlin/*/.gitignore +Marlin/*/*/.gitignore +Marlin/*/*/*/.gitignore +Marlin/*/*/*/*/.gitignore +Marlin/readme.txt +Marlin/*/readme.txt +Marlin/*/*/readme.txt +Marlin/*/*/*/readme.txt +Marlin/*/*/*/*/readme.txt + +# Secure Credentials +Configuration_Secure.h + +#Visual Studio +*.sln +*.vcxproj +*.vcxproj.user +*.vcxproj.filters +Release/ +Debug/ +__vm/ +.vs/ +vc-fileutils.settings + +#Visual Studio Code +.vscode +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/*.db + +#cmake +CMakeLists.txt +src/CMakeLists.txt +CMakeListsPrivate.txt + +#CLion +cmake-build-* + +#Eclipse +.project +.cproject +.pydevproject +.settings +.classpath + +#Python +__pycache__ diff --git a/LICENSE b/LICENSE index e62ec04c..6c0e10f3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,9 @@ -GNU GENERAL PUBLIC LICENSE + + + 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. @@ -631,8 +633,8 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - Copyright (C) + {one line to give the program's name and a brief idea of what it does.} + Copyright (c) {year} {name of author} 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 @@ -652,7 +654,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Copyright (C) + {project} Copyright (c) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h new file mode 100644 index 00000000..dd14538b --- /dev/null +++ b/Marlin/Configuration.h @@ -0,0 +1,2419 @@ +/** + * 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 + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + */ +#define CONFIGURATION_H_VERSION 020007 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some standard links for getting your machine calibrated: + * + * https://reprap.org/wiki/Calibration + * https://youtu.be/wAL9d7FgInk + * http://calculator.josefprusa.cz + * 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 + * https://www.thingiverse.com/thing:298812 + */ + +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer start with one of the configuration files in the +// config/examples/delta directory and customize for your machine. +// + +//=========================================================================== +//============================= SCARA Printer =============================== +//=========================================================================== +// For a SCARA printer start with the configuration files in +// config/examples/SCARA and customize for your machine. +// + +// @section info + +// Author info of this build printed to the host during boot and M115 +#define STRING_CONFIG_H_AUTHOR "Artillery 3D" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** +#define SHOW_BOOTSCREEN + +// Show the bitmap in Marlin/_Bootscreen.h on startup. +#define SHOW_CUSTOM_BOOTSCREEN + +// Show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT -1 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// Choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_ARTILLERY_RUBY +#endif + +// Name displayed in the LCD "Ready" message and Info menu +#define CUSTOM_MACHINE_NAME "Artillery Hornet" + +// Printer's unique ID, used by some programs to differentiate between machines. +// Choose your own or use a service like https://www.uuidgenerator.net/version4 +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[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. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +// Save and restore temperature and fan speed on tool-change. +// Set standby for the unselected tool with M104/106/109 T... +#if ENABLED(SINGLENOZZLE) + //#define SINGLENOZZLE_STANDBY_TEMP + //#define SINGLENOZZLE_STANDBY_FAN +#endif + +/** + * Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. + * + * This device allows one stepper driver on a control board to drive + * two to eight stepper motors, one at a time, in a manner suitable + * for extruders. + * + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + */ +//#define MK2_MULTIPLEXER +#if ENABLED(MK2_MULTIPLEXER) + // Override the default DIO selector pins here, if needed. + // Some pins files may provide defaults for these pins. + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#endif + +/** + * Průša Multi-Material Unit v2 + * + * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. + * Requires EXTRUDERS = 5 + * + * For additional configuration see Configuration_adv.h + */ +//#define PRUSA_MMU2 + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + //#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 (single servo) or lowered/raised (dual servo) +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a solenoid docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism using movements and no solenoid + * + * project : https://www.thingiverse.com/thing:3080893 + * movements : https://youtu.be/0xCEiG9VS3k + * https://youtu.be/Bqbcs0CU2FE + */ +//#define MAGNETIC_PARKING_EXTRUDER + +#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #if ENABLED(PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // (ms) Delay for magnetic field. No delay if 0 or not defined. + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + + #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 + + #endif + +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD + +/** + * Magnetic Switching Toolhead + * + * Support swappable and dockable toolheads with a magnetic + * docking mechanism using movement and no servo. + */ +//#define MAGNETIC_SWITCHING_TOOLHEAD + +/** + * Electromagnetic Switching Toolhead + * + * Parking for CoreXY / HBot kinematics. + * Toolheads are parked at one edge and held with an electromagnet. + * Supports more than 2 Toolheads. See https://youtu.be/JolbsAKTKf4 + */ +//#define ELECTROMAGNETIC_SWITCHING_TOOLHEAD + +#if ANY(SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1) + //#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock + #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/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 + #endif +#endif + +/** + * "Mixing Extruder" + * - Adds G-codes M163 and M164 to set and "commit" the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware's 'M164 S' supporting virtual tools. + * - This implementation supports up to two mixing extruders. + * - Enable DIRECT_MIXING_IN_G1 for M165 and mixing in G1 (from Pia Taubert's reference implementation). + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands + //#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD + #if ENABLED(GRADIENT_MIX) + //#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias + #endif +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X { 0.0, 20.00 } // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Power Supply Control + * + * Enable and connect the power supply to the PS_ON_PIN. + * Specify whether the power supply is active HIGH or active LOW. + */ +//#define PSU_CONTROL +//#define PSU_NAME "Power Supply" + +#if ENABLED(PSU_CONTROL) + #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 + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define AUTO_POWER_CHAMBER_FAN + //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU over this temperature + //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU over this temperature + #define POWER_TIMEOUT 30 + #endif +#endif + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// @section temperature + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -5 : PT100 / PT1000 with MAX31865 (only for sensors 0-1) + * -3 : thermocouple with MAX31855 (only for sensors 0-1) + * -2 : thermocouple with MAX6675 (only for sensors 0-1) + * -4 : thermocouple with AD8495 + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 331 : (3.3V scaled thermistor 1 table for MEGA) + * 332 : (3.3V scaled thermistor 1 table for DUE) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 202 : 200k thermistor - Copymaster 3D + * 3 : Mendel-parts thermistor (4.7k pullup) + * 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 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) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (Used in Keenovo AC silicone mats and most Wanhao i3 machines) (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 + * 20 : Pt100 with circuit in the Ultimainboard V2.x with 5v excitation (AVR) + * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v excitation (STM32 \ LPC176x....) + * 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB) + * 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB) + * 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup) + * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 67 : 450C thermistor from SliceEngineering + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup (E3D) + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * 1000 : Custom - Specify parameters in Configuration_adv.h + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 +#define TEMP_SENSOR_6 0 +#define TEMP_SENSOR_7 0 +#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_PROBE 0 +#define TEMP_SENSOR_CHAMBER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Resistor values when using a MAX31865 (sensor -5) +// Sensor value is typically 100 (PT100) or 1000 (PT1000) +// Calibration value is typically 430 ohm for AdaFruit PT100 modules and 4300 ohm for AdaFruit PT1000 modules. +//#define MAX31865_SENSOR_OHMS 100 +//#define MAX31865_CALIBRATION_OHMS 430 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 +#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 +#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +// Below this temperature the heater will be switched off +// because it probably indicates a broken thermistor wire. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 +#define HEATER_6_MINTEMP 5 +#define HEATER_7_MINTEMP 5 +#define BED_MINTEMP 5 + +// Above this temperature the heater will be switched off. +// This can protect components from overheating, but NOT from shorts and failures. +// (Use MINTEMP for thermistor short/failure protection.) +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 +#define HEATER_6_MAXTEMP 275 +#define HEATER_7_MAXTEMP 275 +#define BED_MAXTEMP 150 + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: https://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop + +#if ENABLED(PIDTEMP) + //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM) + //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + + #if ENABLED(PID_PARAMS_PER_HOTEND) + // Specify between 1 and HOTENDS values per array. + // If fewer than EXTRUDER values are provided, the last element will be repeated. + #define DEFAULT_Kp_LIST { 22.20, 22.20 } + #define DEFAULT_Ki_LIST { 1.08, 1.08 } + #define DEFAULT_Kd_LIST { 114.00, 114.00 } + #else + #define DEFAULT_Kp 15.25 + #define DEFAULT_Ki 0.97 + #define DEFAULT_Kd 59.78 + #endif +#endif // PIDTEMP + +//=========================================================================== +//====================== PID > Bed Temperature Control ====================== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + //#define MIN_BED_POWER 0 + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + // Artillery Hornet + #define DEFAULT_bedKp 92.75 + #define DEFAULT_bedKi 15.67 + #define DEFAULT_bedKd 366.04 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +#if EITHER(PIDTEMP, PIDTEMPBED) + //#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation. + //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + #define PID_FUNCTIONAL_RANGE 25 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. +#endif + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 650 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed +#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics, +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY +//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042 + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +//#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01, + * TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, + * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] + */ +#define X_DRIVER_TYPE TMC2100 +#define Y_DRIVER_TYPE TMC2100 +#define Z_DRIVER_TYPE TMC2100 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 +//#define Z4_DRIVER_TYPE A4988 +#define E0_DRIVER_TYPE TMC2100 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 +//#define E6_DRIVER_TYPE A4988 +//#define E7_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Threshold + * + * Enable if your probe or endstops falsely trigger due to noise. + * + * - Higher values may affect repeatability or accuracy of some bed probes. + * - To fix noise install a 100nF ceramic capacitor in parallel with the switch. + * - This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, which already have the 100nF capacitor. + * + * :[2,3,4,5,6,7] + */ +//#define ENDSTOP_NOISE_THRESHOLD 2 + +// Check for stuck or disconnected endstops during homing moves. +//#define DETECT_BROKEN_ENDSTOP + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +//#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2...]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80.121, 80.121, 400, 445 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2...]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 40, 50 } + +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2...]] + */ +#define DEFAULT_MAX_ACCELERATION { 2000, 2000, 100, 10000 } + +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 800 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 10000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 2000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk limits (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) + #define DEFAULT_XJERK 10.0 + #define DEFAULT_YJERK 10.0 + #define DEFAULT_ZJERK 0.3 + + //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif +#endif + +#define DEFAULT_EJERK 5.0 // May be used by Linear Advance + +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * https://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.032 // (mm) Distance from real junction edge + #define JD_HANDLE_SMALL_SEGMENTS // Use curvature estimation instead of just the junction angle + // for small segments (< 1mm) with large junction angles (> 135°). +#endif + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See https://marlinfw.org/docs/configuration/probes.html +// + +/** + * Enable this option for a probe connected to the Z-MIN pin. + * The probe replaces the Z-MIN endstop and is used for Z homing. + * (Automatically enables USE_PROBE_FOR_Z_HOMING.) + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// Force the use of the probe for Z-axis homing +//#define USE_PROBE_FOR_Z_HOMING + +/** + * Z_MIN_PROBE_PIN + * + * Define this pin if the probe is not connected to Z_MIN_PIN. + * If not defined the default pin for the selected MOTHERBOARD + * will be used. Most of the time the default is what you want. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + */ +//#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Use the nozzle as the probe, as with a conductive + * nozzle system or a piezo-electric smart effector. + */ +//#define NOZZLE_AS_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH + +/** + * Pressure sensor with a BLTouch-like interface + */ +//#define CREALITY_TOUCH + +/** + * Touch-MI Probe by hotends.fr + * + * This probe is deployed and activated by moving the X-axis to a magnet at the edge of the bed. + * By default, the magnet is assumed to be on the left and activated by a home. If the magnet is + * on the right, enable and set TOUCH_MI_DEPLOY_XPOS to the deploy position. + * + * Also requires: BABYSTEPPING, BABYSTEP_ZPROBE_OFFSET, Z_SAFE_HOMING, + * and a minimum Z_HOMING_HEIGHT of 10. + */ +//#define TOUCH_MI_PROBE +#if ENABLED(TOUCH_MI_PROBE) + #define TOUCH_MI_RETRACT_Z 0.5 // Height at which the probe retracts + //#define TOUCH_MI_DEPLOY_XPOS (X_MAX_BED + 2) // For a magnet on the right side of the bed + //#define TOUCH_MI_MANUAL_DEPLOY // For manual deploy (LCD menu) +#endif + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// A probe deployed by moving the x-axis, such as the Wilson II's rack-and-pinion probe designed by Marty Rice. +//#define RACK_AND_PINION_PROBE +#if ENABLED(RACK_AND_PINION_PROBE) + #define Z_PROBE_DEPLOY_X X_MIN_POS + #define Z_PROBE_RETRACT_X X_MAX_POS +#endif + +// Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J +// When the pin is defined you can use M672 to set/reset the probe sensivity. +//#define DUET_SMART_EFFECTOR +#if ENABLED(DUET_SMART_EFFECTOR) + #define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin +#endif + +/** + * Use StallGuard2 to probe the bed with the nozzle. + * Requires stallGuard-capable Trinamic stepper drivers. + * CAUTION: This can damage machines with Z lead screws. + * Take extreme care when setting up this feature. + */ +//#define SENSORLESS_PROBING + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Nozzle-to-Probe offsets { X, Y, Z } + * + * - 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. + * + * 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 | 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 --+ + */ +#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } + +// Most probes should stay away from the edges of the bed, but +// with NOZZLE_AS_PROBE this can be negative for a wider probing area. +#define PROBING_MARGIN 10 + +// X and Y axis travel speed (mm/min) between probes +#define XY_PROBE_SPEED (133*60) + +// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_SPEED_FAST HOMING_FEEDRATE_Z + +// Feedrate (mm/min) for the "accurate" probe of each point +#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) + +/** + * Multiple Probing + * + * You may get improved results by probing 2 or more times. + * With EXTRA_PROBING the more atypical reading(s) will be disregarded. + * + * A total of 2 does fast/slow probes with a weighted average. + * A total of 3 or more adds more slow probes, taking the average. + */ +//#define MULTIPLE_PROBING 2 +//#define EXTRA_PROBING 1 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with NOZZLE_TO_PROBE_OFFSET, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// Before deploy/stow pause for user confirmation +//#define PAUSE_BEFORE_DEPLOY_STOW +#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) + //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// 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 + +// Turn off the display blinking that warns about possible accuracy reduction +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // Disable the extruder when not stepping +#define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR false +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR true +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false +#define INVERT_E5_DIR false +#define INVERT_E6_DIR false +#define INVERT_E7_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed + +//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding. + +//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing Z + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR 1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 220 +#define Y_BED_SIZE 220 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 250 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * 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. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #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.) + #define FILAMENT_RUNOUT_SCRIPT "M600" + + // After a runout is detected, continue printing this length of filament + // before executing the runout script. Useful for a sensor at the end of + // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. + //#define FILAMENT_RUNOUT_DISTANCE_MM 25 + + #ifdef FILAMENT_RUNOUT_DISTANCE_MM + // Enable this option to use an encoder disc that toggles the runout pin + // as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM + // large enough to avoid false positives.) + //#define FILAMENT_MOTION_SENSOR + #endif +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable + * this option to have G28 restore the prior leveling state. + */ +//#define RESTORE_LEVELING_AFTER_G28 + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. + #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for the G26 Mesh Validation Tool. + #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for the G26 Mesh Validation Tool. + #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool. + #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. + #endif + +#endif + +#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment + //#define MESH_EDIT_MENU // Add a menu to edit mesh points +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET_LFRB { 40, 40, 40, 40 } // (mm) Left, Front, Right, Back insets + #define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points + #define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points + #define LEVEL_CENTER_TOO // Move to the center after the last corner +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - 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. +// - 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 + #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing +#endif + +// Homing speeds (mm/min) +#define HOMING_FEEDRATE_XY (80*60) +#define HOMING_FEEDRATE_Z (20*60) + +// Validate that endstops are triggered on homing moves +#define VALIDATE_HOMING_ENDSTOPS + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +/** + * EEPROM + * + * Persistent storage to preserve configurable settings across reboots. + * + * M500 - Store settings to EEPROM. + * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) + * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) + */ +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. +#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load +#if ENABLED(EEPROM_SETTINGS) + #define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. +#endif + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// Preheat Constants +#define PREHEAT_1_LABEL "PLA" +#define PREHEAT_1_TEMP_HOTEND 200 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_LABEL "PETG" +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 80 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z_raise } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + //#define NOZZLE_PARK_X_ONLY // X move only is required to park + //#define NOZZLE_PARK_Y_ONLY // Y move only is required to park + #define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance + #define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions for each tool as { { X, Y, Z }, { X, Y, Z } } + // Dual hotend system may use { { -20, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }, { 420, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }} + #define NOZZLE_CLEAN_START_POINT { { 30, 30, (Z_MIN_POS + 1) } } + #define NOZZLE_CLEAN_END_POINT { { 100, 60, (Z_MIN_POS + 1) } } + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Move the nozzle to the initial position after cleaning + #define NOZZLE_CLEAN_GOBACK + + // 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" + +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +//#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 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 + //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE +#endif + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * 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 + * + * :{ '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 + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See https://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * Info Screen Style (0:Classic, 1:Průša) + * + * :[0:'Classic', 1:'Průša'] + */ +#define LCD_INFO_SCREEN_STYLE 0 + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + */ +#define SDSUPPORT + +/** + * SD CARD: SPI SPEED + * + * Enable one of the following items for a slower SPI transfer speed. + * This may be required to resolve "volume init" errors. + */ +//#define SPI_SPEED SPI_HALF_SPEED +//#define SPI_SPEED SPI_QUARTER_SPEED +//#define SPI_SPEED SPI_EIGHTH_SPEED + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// This option reverses the encoder direction for Select Screen. +// +// If CLOCKWISE normally moves LEFT this makes it go RIGHT. +// If CLOCKWISE normally moves RIGHT this makes it go LEFT. +// +//#define REVERSE_SELECT_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// https://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// https://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// https://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +// +// 3-wire SR LCD with strobe using 74HC4094 +// https://github.com/mikeshub/SailfishLCD +// Uses the code directly from Sailfish +// +//#define FF_INTERFACEBOARD + +// +// TFT GLCD Panel with Marlin UI +// Panel connected to main board by SPI or I2C interface. +// See https://github.com/Serhiy-K/TFTGLCDAdapter +// +//#define TFTGLCD_PANEL_SPI +//#define TFTGLCD_PANEL_I2C + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// 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 +// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// https://www.panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - https://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// https://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// MKS MINI12864 with graphic controller and SD support +// https://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout. +// https://www.aliexpress.com/item/33018110072.html +// +//#define MKS_LCD12864 + +// +// FYSETC variant of the MINI12864 graphic controller with SD support +// https://wiki.fysetc.com/Mini12864_Panel/ +// +#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_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// Ender-2 OEM display, a variant of the MKS_MINI_12864 +// +//#define ENDER2_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 +// A clone of the RepRapDiscount full graphics display but with +// different pins/wiring (see pins_ANET_10.h). +// +//#define ANET_FULL_GRAPHICS_LCD + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/item/32837222770.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// https://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================== OLED Displays ============================== +//============================================================================= + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + #define U8GLIB_SSD1306 + //#define U8GLIB_SH1106 +#endif + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER +// https://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#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 +// +//#define U8GLIB_SH1106_EINSTART + +// +// Overlord OLED display/controller with i2c buzzer and LEDs +// +//#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 =========================== +//============================================================================= + +// +// DGUS Touch Display with DWIN OS. (Choose one.) +// ORIGIN : https://www.aliexpress.com/item/32993409517.html +// FYSETC : https://www.aliexpress.com/item/32961471929.html +// +//#define DGUS_LCD_UI_ORIGIN +//#define DGUS_LCD_UI_FYSETC +//#define DGUS_LCD_UI_HIPRECY + +// +// Touch-screen LCD for Malyan M200/M300 printers +// +//#define MALYAN_LCD +#if ENABLED(MALYAN_LCD) + #define LCD_SERIAL_PORT 1 // Default is 1 for Malyan M200 +#endif + +// +// Touch UI for FTDI EVE (FT800/FT810) displays +// See Configuration_adv.h for all configuration options. +// +//#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 LCD_SERIAL_PORT 3 // Default is 3 for Anycubic + //#define ANYCUBIC_LCD_DEBUG +#endif + +// +// Third-party or vendor-customized controller interfaces. +// Sources should be installed in 'src/lcd/extensible_ui'. +// +//#define EXTENSIBLE_UI + +#if ENABLED(EXTENSIBLE_UI) + //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display +#endif + +//============================================================================= +//=============================== Graphical TFTs ============================== +//============================================================================= + +/** + * TFT Type - Select your Display type + * + * Available options are: + * MKS_TS35_V2_0, + * MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, + * MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R + * TFT_TRONXY_X5SA, ANYCUBIC_TFT35, LONGER_LK_TFT28 + * TFT_GENERIC + * + * For TFT_GENERIC, you need to configure these 3 options: + * Driver: TFT_DRIVER + * Current Drivers are: AUTO, ST7735, ST7789, ST7796, R61505, ILI9328, ILI9341, ILI9488 + * Resolution: TFT_WIDTH and TFT_HEIGHT + * Interface: TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI + */ +//#define TFT_GENERIC + +/** + * TFT UI - User Interface Selection. Enable one of the following options: + * + * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled + * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities + * TFT_LVGL_UI - A Modern UI using LVGL + * + * For LVGL_UI also copy the 'assets' folder from the build directory to the + * root of your SD card, together with the compiled firmware. + */ +//#define TFT_CLASSIC_UI +//#define TFT_COLOR_UI +//#define TFT_LVGL_UI + +/** + * TFT Rotation. Set to one of the following values: + * + * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y, + * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y, + * TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y, + * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION + */ +//#define TFT_ROTATION TFT_NO_ROTATION + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. +// +//#define DWIN_CREALITY_LCD + +// +// ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 +// +//#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 + //#define XPT2046_Y_OFFSET 257 +#endif + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// 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 + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @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 + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +// :[0,1,2,3,4,5,6,7] +#define SOFT_PWM_SCALE 2 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +// Support for PCA9533 PWM LED driver +//#define PCA9533 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * 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. + * + * *** 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 + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + */ +//#define RGB_LED +//#define RGBW_LED + +#if EITHER(RGB_LED, RGBW_LED) + //#define RGB_LED_R_PIN 34 + //#define RGB_LED_G_PIN 43 + //#define RGB_LED_B_PIN 35 + //#define RGB_LED_W_PIN -1 +#endif + +// 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) + #define NEOPIXEL_PIN 4 // LED driving pin + //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE + //#define NEOPIXEL2_PIN 5 + #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 +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Set to 0 to turn off servo support. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// (ms) Delay before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Edit servo angles with M281 and save to EEPROM with M500 +//#define EDITABLE_SERVO_ANGLES diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h new file mode 100644 index 00000000..cb429c3d --- /dev/null +++ b/Marlin/Configuration_adv.h @@ -0,0 +1,3589 @@ +/** + * 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 + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + */ +#define CONFIGURATION_ADV_H_VERSION 020007 + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// @section temperature + +/** + * Thermocouple sensors are quite sensitive to noise. Any noise induced in + * the sensor wires, such as by stepper motor wires run in parallel to them, + * may result in the thermocouple sensor reporting spurious errors. This + * value is the number of errors which can occur in a row before the error + * is reported. This allows us to ignore intermittent error conditions while + * still detecting an actual failure, which should result in a continuous + * stream of errors from the sensor. + * + * Set this value to 0 to fail on the first error to occur. + */ +#define THERMOCOUPLE_MAX_ERRORS 15 + +// +// Custom Thermistor 1000 parameters +// +#if TEMP_SENSOR_0 == 1000 + #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND0_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_1 == 1000 + #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND1_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_2 == 1000 + #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND2_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_3 == 1000 + #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND3_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_4 == 1000 + #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND4_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_5 == 1000 + #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND5_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_6 == 1000 + #define HOTEND6_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND6_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND6_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_7 == 1000 + #define HOTEND7_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND7_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND7_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_BED == 1000 + #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BED_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_CHAMBER == 1000 + #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define CHAMBER_BETA 3950 // Beta value +#endif + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +// +// Heated Bed Bang-Bang options +// +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS + #endif +#endif + +// +// Heated Chamber options +// +#if TEMP_SENSOR_CHAMBER + #define CHAMBER_MINTEMP 5 + #define CHAMBER_MAXTEMP 60 + #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + //#define CHAMBER_LIMIT_SWITCHING + //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin + //#define HEATER_CHAMBER_INVERTING false + + //#define CHAMBER_FAN // Enable a fan on the chamber + #if ENABLED(CHAMBER_FAN) + #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve. + #if CHAMBER_FAN_MODE == 0 + #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) + #elif CHAMBER_FAN_MODE == 1 + #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target + #elif CHAMBER_FAN_MODE == 2 + #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255) + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target + #endif + #endif + + //#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber + #if ENABLED(CHAMBER_VENT) + #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo + #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber + #define LOW_EXCESS_HEAT_LIMIT 3 + #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 + #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops + #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) + //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 + #endif + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the heated chamber. + */ +#if ENABLED(THERMAL_PROTECTION_CHAMBER) + #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius + + /** + * Heated chamber watch settings (M141/M191). + */ + #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds + #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // Add an experimental additional term to the heater power, proportional to the extrusion speed. + // A well-chosen Kc value should add just enough power to melt the increased material volume. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) // heating power = Kc * e_speed + #define LPQ_MAX_LEN 50 + #endif + + /** + * Add an experimental additional term to the heater power, proportional to the fan speed. + * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan. + * You can either just add a constant compensation with the DEFAULT_Kf value + * or follow the instruction below to get speed-dependent compensation. + * + * Constant compensation (use only with fanspeeds of 0% and 100%) + * --------------------------------------------------------------------- + * A good starting point for the Kf-value comes from the calculation: + * kf = (power_fan * eff_fan) / power_heater * 255 + * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater. + * + * Example: + * Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8 + * Kf = (2.4W * 0.8) / 40W * 255 = 12.24 + * + * Fan-speed dependent compensation + * -------------------------------- + * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%). + * Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled. + * If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature + * drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big. + * 2. Note the Kf-value for fan-speed at 100% + * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving. + * 4. Repeat step 1. and 2. for this fan speed. + * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in + * PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED + */ + //#define PID_FAN_SCALING + #if ENABLED(PID_FAN_SCALING) + //#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION + #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION) + // The alternative definition is used for an easier configuration. + // Just figure out Kf at fullspeed (255) and PID_FAN_SCALING_MIN_SPEED. + // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly. + + #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf + #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf + #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING + + #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED) + #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0 + + #else + #define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed) + #define DEFAULT_Kf 10 // A constant value added to the PID-tuner + #define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING + #endif + #endif +#endif + +/** + * Automatic Temperature Mode + * + * Dynamically adjust the hotend target temperature based on planned E moves. + * + * (Contrast with PID_EXTRUSION_SCALING, which tracks E movement and adjusts PID + * behavior using an additional kC value.) + * + * Autotemp is calculated by (mintemp + factor * mm_per_sec), capped to maxtemp. + * + * Enable Autotemp Mode with M104/M109 F S B. + * Disable by sending M104/M109 with no F parameter (or F0 with AUTOTEMP_PROPORTIONAL). + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 + // Turn on AUTOTEMP on M104/M109 by default using proportions set here + //#define AUTOTEMP_PROPORTIONAL + #if ENABLED(AUTOTEMP_PROPORTIONAL) + #define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature + #define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature + #define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F) + #endif +#endif + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min) + #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) +#endif + +/** + * Hotend Idle Timeout + * Prevent filament in the nozzle from charring and causing a critical jam. + */ +//#define HOTEND_IDLE_TIMEOUT +#if ENABLED(HOTEND_IDLE_TIMEOUT) + #define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection + #define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection + #define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout + #define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan turns on automatically whenever any driver is enabled and turns + * off (or reduces to idle speed) shortly after drivers are turned off. + */ +#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + #define CONTROLLER_FAN_PIN PC6 // 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 + #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors + //#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings + #if ENABLED(CONTROLLER_FAN_EDITABLE) + #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu + #endif +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +#define FAN_KICKSTART_TIME 100 + +// Some coolers may require a non-zero "off" state. +//#define FAN_OFF_PWM 1 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +/** + * FAST PWM FAN Settings + * + * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h) + * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a + * frequency as close as possible to the desired frequency. + * + * FAST_PWM_FAN_FREQUENCY [undefined by default] + * Set this to your desired frequency. + * If left undefined this defaults to F = F_CPU/(2*255*1) + * i.e., F = 31.4kHz on 16MHz microcontrollers or F = 39.2kHz on 20MHz microcontrollers. + * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required + * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. + * + * USE_OCR2A_AS_TOP [undefined by default] + * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: + * 16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] + * 20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] + * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of + * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) + * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. + */ +#if ENABLED(FAST_PWM_FAN) + //#define FAST_PWM_FAN_FREQUENCY 31400 + //#define USE_OCR2A_AS_TOP +#endif + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN PC7 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define E6_AUTO_FAN_PIN -1 +#define E7_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 + +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#define CHAMBER_AUTO_FAN_SPEED 255 + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#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. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define INVERT_X2_VS_X_DIR true // Set 'true' if X motors should rotate in opposite directions + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X2_ENDSTOP_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define INVERT_Y2_VS_Y_DIR true // Set 'true' if Y motors should rotate in opposite directions + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y2_ENDSTOP_ADJUSTMENT 0 + #endif +#endif + +// +// For Z set the number of stepper drivers +// +#define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many + +#if NUM_Z_STEPPER_DRIVERS > 1 + //#define Z_MULTI_ENDSTOPS + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z2_ENDSTOP_ADJUSTMENT 0 + #if NUM_Z_STEPPER_DRIVERS >= 3 + #define Z3_USE_ENDSTOP _YMAX_ + #define Z3_ENDSTOP_ADJUSTMENT 0 + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + #define Z4_USE_ENDSTOP _ZMAX_ + #define Z4_ENDSTOP_ADJUSTMENT 0 + #endif + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + * + * The following Dual X Carriage modes can be selected with M605 S: + * + * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. (M605 S0) + * + * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so + * that additional slicer support is not required. (M605 S1) + * + * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S2 to initiate duplicated movement. + * + * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S3 to initiate mirrored movement. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS + #define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage + #define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage + #define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 +#endif + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +/** + * Homing Procedure + * Homing (G28) does an indefinite move towards the endstops to establish + * the position of the toolhead relative to the workspace. + */ + +//#define SENSORLESS_BACKOFF_MM { 2, 2 } // (mm) Backoff from endstops before sensorless homing + +#define HOMING_BUMP_MM { 5, 5, 2 } // (mm) Backoff from endstops after first bump +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) + +//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (mm) Backoff from endstops after homing + +//#define QUICK_HOME // If G28 contains XY do a diagonal move first +//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X +//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first + +// @section bltouch + +#if ENABLED(BLTOUCH) + /** + * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES + * Do not activate settings that the probe might not understand. Clones might misunderstand + * advanced commands. + * + * 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" + * like they would be with a real switch. So please check the wiring first. + * + * Settings for all BLTouch and clone probes: + */ + + // Safety: The probe needs time to recognize the command. + // Minimum command delay (ms). Enable and increase if needed. + //#define BLTOUCH_DELAY 500 + + /** + * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: + */ + + // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful + // in special cases, like noisy or filtered input configurations. + //#define BLTOUCH_FORCE_SW_MODE + + /** + * Settings for BLTouch Smart 3.0 and 3.1 + * Summary: + * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes + * - High-Speed mode + * - Disable LCD voltage options + */ + + /** + * 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 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. + */ + //#define BLTOUCH_SET_5V_MODE + + /** + * Safety: Activate if connecting a probe with an unknown voltage mode. + * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 + * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) + * To preserve the life of the probe, use this once then turn it off and re-flash. + */ + //#define BLTOUCH_FORCE_MODE_SET + + /** + * Use "HIGH SPEED" mode for probing. + * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. + * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function + * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. + */ + //#define BLTOUCH_HS_MODE + + // Safety: Enable voltage mode settings in the LCD menu. + //#define BLTOUCH_LCD_VOLTAGE_MENU + +#endif // BLTOUCH + +// @section extras + +/** + * Z Steppers Auto-Alignment + * Add the G34 command to align multiple Z steppers using a bed probe. + */ +//#define Z_STEPPER_AUTO_ALIGN +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + // Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]] + // If not defined, probe limits will be used. + // Override with 'M422 S X Y' + //#define Z_STEPPER_ALIGN_XY { { 10, 190 }, { 100, 10 }, { 190, 190 } } + + /** + * Orientation for the automatically-calculated probe positions. + * Override Z stepper align points with 'M422 S X Y' + * + * 2 Steppers: (0) (1) + * | | 2 | + * | 1 2 | | + * | | 1 | + * + * 3 Steppers: (0) (1) (2) (3) + * | 3 | 1 | 2 1 | 2 | + * | | 3 | | 3 | + * | 1 2 | 2 | 3 | 1 | + * + * 4 Steppers: (0) (1) (2) (3) + * | 4 3 | 1 4 | 2 1 | 3 2 | + * | | | | | + * | 1 2 | 2 3 | 3 4 | 4 1 | + */ + #ifndef Z_STEPPER_ALIGN_XY + //#define Z_STEPPERS_ORIENTATION 0 + #endif + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Requires triple stepper drivers (i.e., set NUM_Z_STEPPER_DRIVERS to 3) + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down in case + // the stepper (spindle) position is farther out than the test point. + #define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability! + #endif + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle + #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment + #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this + #define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done? + // After G34, re-home Z (G28 Z) or just calculate it from the last probe heights? + // Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed. + #define HOME_AFTER_G34 +#endif + +// +// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe. +// +//#define ASSISTED_TRAMMING +#if ENABLED(ASSISTED_TRAMMING) + + // Define positions for probing points, use the hotend as reference not the sensor. + #define TRAMMING_POINT_XY { { 20, 20 }, { 200, 20 }, { 200, 200 }, { 20, 200 } } + + // Define positions names for probing points. + #define TRAMMING_POINT_NAME_1 "Front-Left" + #define TRAMMING_POINT_NAME_2 "Front-Right" + #define TRAMMING_POINT_NAME_3 "Back-Right" + #define TRAMMING_POINT_NAME_4 "Back-Left" + + #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation + //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first + //#define ASSISTED_TRAMMING_MENU_ITEM // Add a menu item for Assisted Tramming + + /** + * Screw thread: + * M3: 30 = Clockwise, 31 = Counter-Clockwise + * M4: 40 = Clockwise, 41 = Counter-Clockwise + * M5: 50 = Clockwise, 51 = Counter-Clockwise + */ + #define TRAMMING_SCREW_THREAD 30 + +#endif + +// @section motion + +#define AXIS_RELATIVE_MODES { false, false, false, false } + +// Add a Duplicate option for well-separated conjoined nozzles +//#define MULTI_NOZZLE_DUPLICATION + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +/** + * 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 'false' if the nozzle could fall onto your printed part! +#define DISABLE_INACTIVE_E true + +// 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 + +// 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 +#if ENABLED(SLOWDOWN) + #define SLOWDOWN_DIVISOR 2 +#endif + +/** + * XY Frequency limit + * Reduce resonance by limiting the frequency of small zigzag infill moves. + * 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. +#ifdef XY_FREQUENCY_LIMIT + #define XY_FREQUENCY_MIN_PERCENT 5 // (percent) Minimum FR percentage to apply. Set with M201 G. +#endif + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) + +// +// Backlash Compensation +// Adds extra movement to axes on direction-changes to account for backlash. +// +//#define BACKLASH_COMPENSATION +#if ENABLED(BACKLASH_COMPENSATION) + // Define values for backlash distance and correction. + // If BACKLASH_GCODE is enabled these values are the defaults. + #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) + #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments + // to reduce print artifacts. (Enabling this is costly in memory and computation!) + //#define BACKLASH_SMOOTHING_MM 3 // (mm) + + // Add runtime configuration and tuning of backlash values (M425) + //#define BACKLASH_GCODE + + #if ENABLED(BACKLASH_GCODE) + // Measure the Z backlash when probing (G29) and set with "M425 Z" + #define MEASURE_BACKLASH_WHEN_PROBING + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT + // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION + // 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/min) + #endif + #endif +#endif + +/** + * Automatic backlash, position and hotend offset calibration + * + * Enable G425 to run automatic calibration using an electrically- + * conductive cube, bolt, or washer mounted on the bed. + * + * G425 uses the probe to touch the top and sides of the calibration object + * on the bed and measures and/or correct positional offsets, axis backlash + * and hotend offsets. + * + * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within + * ±5mm of true values for G425 to succeed. + */ +//#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/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 + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + + // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM). + //#define CALIBRATION_REPORTING + + // The true location and dimension the cube/bolt/washer on the bed. + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + + // Comment out any sides which are unreachable by the probe. For best + // auto-calibration results, all sides must be reachable. + #define CALIBRATION_MEASURE_RIGHT + #define CALIBRATION_MEASURE_FRONT + #define CALIBRATION_MEASURE_LEFT + #define CALIBRATION_MEASURE_BACK + + // Probing at the exact top center only works if the center is flat. If + // probing on a screwhead or hollow washer, probe near the edges. + //#define CALIBRATION_MEASURE_AT_TOP_EDGES + + // Define the pin to read during calibration + #ifndef CALIBRATION_PIN + //#define CALIBRATION_PIN -1 // Define here to override the default pin + #define CALIBRATION_PIN_INVERTING false // Set to true to invert the custom pin + //#define CALIBRATION_PIN_PULLDOWN + #define CALIBRATION_PIN_PULLUP + #endif +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +#define ADAPTIVE_STEP_SMOOTHING + +/** + * Custom Microstepping + * Override as-needed for your setup. Up to 3 MS pins are supported. + */ +//#define MICROSTEP1 LOW,LOW,LOW +//#define MICROSTEP2 HIGH,LOW,LOW +//#define MICROSTEP4 LOW,HIGH,LOW +//#define MICROSTEP8 HIGH,HIGH,LOW +//#define MICROSTEP16 LOW,LOW,HIGH +//#define MICROSTEP32 HIGH,LOW,HIGH + +// 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] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +/** + * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro) + */ +//#define DIGIPOT_MCP4018 // Requires https://github.com/stawel/SlowSoftI2CMaster +//#define DIGIPOT_MCP4451 +#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) + #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5 + + // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. + // These correspond to the physical drivers, so be mindful if the order is changed. + #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + + //#define DIGIPOT_USE_RAW_VALUES // Use DIGIPOT_MOTOR_CURRENT raw wiper values (instead of A4988 motor currents) + + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + //#define DIGIPOT_I2C_ADDRESS_A 0x2C // Unshifted slave address for first DIGIPOT + //#define DIGIPOT_I2C_ADDRESS_B 0x2D // Unshifted slave address for second DIGIPOT +#endif + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// @section lcd + +#if EITHER(ULTIPANEL, EXTENSIBLE_UI) + #define MANUAL_FEEDRATE { 120*60, 120*60, 25*60, 5*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" + #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + #endif +#endif + +// Change values more rapidly when the encoder is rotated faster +#define ENCODER_RATE_MULTIPLIER +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed + #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed +#endif + +// Play a beep when the feedrate is changed from the Status Screen +//#define BEEP_ON_FEEDRATE_CHANGE +#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) + #define FEEDRATE_CHANGE_BEEP_DURATION 10 + #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 +#endif + +#if HAS_LCD_MENU + + // Add Probe Z Offset calibration to the Z Probe Offsets menu + #if HAS_BED_PROBE + //#define PROBE_OFFSET_WIZARD + #if ENABLED(PROBE_OFFSET_WIZARD) + #define PROBE_OFFSET_START -4.0 // Estimated nozzle-to-probe Z offset, plus a little extra + #endif + #endif + + // Include a page of printer information in the LCD Main Menu + //#define LCD_INFO_MENU + #if ENABLED(LCD_INFO_MENU) + //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages + #endif + + // BACK menu items keep the highlight at the top + //#define TURBO_BACK_MENU_ITEM + + /** + * LED Control Menu + * Add LED Control to the LCD menu + */ + //#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 + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #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 + +// Scroll a longer status message into view +//#define STATUS_MESSAGE_SCROLLING + +// On the Info Screen, display XY with one decimal place when possible +//#define LCD_DECIMAL_SMALL_XY + +// The timeout (in ms) to return to the status screen from sub-menus +//#define LCD_TIMEOUT_TO_STATUS 15000 + +// Add an 'M73' G-code to set the current percentage +#define LCD_SET_PROGRESS_MANUALLY + +// Show the E position (filament used) during printing +//#define LCD_SHOW_E_TOTAL + +#if ENABLED(SHOW_BOOTSCREEN) + #define BOOTSCREEN_TIMEOUT 2000 // (ms) Total Duration to display the boot screen(s) +#endif + +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + //#define SHOW_REMAINING_TIME // Display estimated time to completion + #if ENABLED(SHOW_REMAINING_TIME) + //#define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation + //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time + #endif + + #if HAS_MARLINUI_U8GLIB + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits + #endif + + #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif + #endif +#endif + +#if ENABLED(SDSUPPORT) + + // The standard SD detect circuit reads LOW when media is inserted and HIGH when empty. + // Enable this option and set to HIGH if your SD cards are incorrectly detected. + //#define SD_DETECT_STATE HIGH + + //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash) + + #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84" // Use "M84XYE" to keep Z enabled so your bed stays in place + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + + //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + + #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 + #endif + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) + //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss + //#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled! + //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + //#define POWER_LOSS_PULL // Set pullup / pulldown as appropriate + //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume + //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. + + // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, + // especially with "vase mode" printing. Set too high and vases cannot be continued. + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #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_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. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + // Leave the heaters on after Stop Print (not recommended!) + //#define SD_ABORT_NO_COOLDOWN + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define SD_ABORT_ON_ENDSTOP_HIT + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + + /** + * Support for USB thumb drives using an Arduino USB Host Shield or + * equivalent MAX3421E breakout board. The USB thumb drive will appear + * to Marlin as an SD card. + * + * The MAX3421E can be assigned the same pins as the SD card reader, with + * the following pin mapping: + * + * SCLK, MOSI, MISO --> SCLK, MOSI, MISO + * INT --> SD_DETECT_PIN [1] + * SS --> SDSS + * + * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. + */ + //#define USB_FLASH_DRIVE_SUPPORT + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + + /** + * USB Host Shield Library + * + * - UHS2 uses no interrupts and has been production-tested + * on a LulzBot TAZ Pro with a 32-bit Archim board. + * + * - UHS3 is newer code with better USB compatibility. But it + * is less tested and is known to interfere with Servos. + * [1] This requires USB_INTR_PIN to be interrupt-capable. + */ + //#define USE_UHS3_USB + #endif + + /** + * When using a bootloader that supports SD-Firmware-Flashing, + * add a menu item to activate SD-FW-Update on the next reboot. + * + * Requires ATMEGA2560 (Arduino Mega) + * + * Tested with this bootloader: + * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 + */ + //#define SD_FIRMWARE_UPDATE + #if ENABLED(SD_FIRMWARE_UPDATE) + #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF + #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 + #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF + #endif + + // Add an optimized binary file transfer mode, initiated with 'M28 B1' + //#define BINARY_FILE_TRANSFER + + /** + * Set this option to one of the following (or the board's defaults apply): + * + * LCD - Use the SD drive in the external LCD controller. + * ONBOARD - Use the SD drive on the control board. (No SD_DETECT_PIN. M21 to init.) + * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). + * + * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] + */ + //#define SDCARD_CONNECTION LCD + +#endif // SDSUPPORT + +/** + * By default an onboard SD card reader may be shared as a USB mass- + * storage device. This option hides the SD card from the host PC. + */ +//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if HAS_MARLINUI_U8GLIB + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Save many cycles by drawing a hollow frame or no frame on the Info Screen + //#define XYZ_NO_FRAME + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2434 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + #if ENABLED(U8GLIB_ST7920) + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + + /** + * Status (Info) Screen customizations + * These options may affect code size and screen render time. + * Custom status screens can forcibly override these settings. + */ + //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones + //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) + #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM) + #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating + #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating + #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating + //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active + //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap + //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap + //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames + //#define STATUS_HEAT_PERCENT // Show heating in a progress bar + //#define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving 399 bytes of flash) + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. + + // Frivolous Game Options + //#define MARLIN_BRICKOUT + //#define MARLIN_INVADERS + //#define MARLIN_SNAKE + //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu + +#endif // HAS_MARLINUI_U8GLIB + +// +// Additional options for DGUS / DWIN displays +// +#if HAS_DGUS_LCD + #define LCD_SERIAL_PORT 3 + #define LCD_BAUDRATE 115200 + + #define DGUS_RX_BUFFER_SIZE 128 + #define DGUS_TX_BUFFER_SIZE 48 + //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) + + #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates + + #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) + #define DGUS_PRINT_FILENAME // Display the filename during printing + #define DGUS_PREHEAT_UI // Display a preheat screen during heatup + + #if ENABLED(DGUS_LCD_UI_FYSETC) + //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for UI_FYSETC + #else + #define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY + #endif + + #define DGUS_FILAMENT_LOADUNLOAD + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + #define DGUS_FILAMENT_PURGE_LENGTH 10 + #define DGUS_FILAMENT_LOAD_LENGTH_PER_TIME 0.5 // (mm) Adjust in proportion to DGUS_UPDATE_INTERVAL_MS + #endif + + #define DGUS_UI_WAITING // Show a "waiting" screen between some screens + #if ENABLED(DGUS_UI_WAITING) + #define DGUS_UI_WAITING_STATUS 10 + #define DGUS_UI_WAITING_STATUS_PERIOD 8 // Increase to slower waiting status looping + #endif + #endif +#endif // HAS_DGUS_LCD + +// +// Touch UI for the FTDI Embedded Video Engine (EVE) +// +#if ENABLED(TOUCH_UI_FTDI_EVE) + // Display board used + //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) + //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) + //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) + //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) + //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI + //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) + + // Correct the resolution if not using the stock TFT panel. + //#define TOUCH_UI_320x240 + //#define TOUCH_UI_480x272 + //#define TOUCH_UI_800x480 + + // Mappings for boards with a standard RepRapDiscount Display connector + //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping + //#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) + // Pins for CS and MOD_RESET (PD) must be chosen + #define CLCD_MOD_RESET 9 + #define CLCD_SPI_CS 10 + + // If using software SPI, specify pins for SCLK, MOSI, MISO + //#define CLCD_USE_SOFT_SPI + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI 11 + #define CLCD_SOFT_SPI_MISO 12 + #define CLCD_SOFT_SPI_SCLK 13 + #endif + #endif + + // Display Orientation. An inverted (i.e. upside-down) display + // is supported on the FT800. The FT810 and beyond also support + // portrait and mirrored orientations. + //#define TOUCH_UI_INVERTED + //#define TOUCH_UI_PORTRAIT + //#define TOUCH_UI_MIRRORED + + // UTF8 processing and rendering. + // Unsupported characters are shown as '?'. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + // Western accents support. These accented characters use + // combined bitmaps and require relatively little storage. + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) + // Additional character groups. These characters require + // full bitmaps and take up considerable storage: + //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³ + //#define TOUCH_UI_UTF8_COPYRIGHT // © ® + //#define TOUCH_UI_UTF8_GERMANIC // ß + //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ + //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡ + //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥ + //#define TOUCH_UI_UTF8_ORDINALS // º ª + //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷ + //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ + //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ + #endif + #endif + + // Use a smaller font when labels don't fit buttons + #define TOUCH_UI_FIT_TEXT + + // Allow language selection from menu at run-time (otherwise use LCD_LANGUAGE) + //#define LCD_LANGUAGE_1 en + //#define LCD_LANGUAGE_2 fr + //#define LCD_LANGUAGE_3 de + //#define LCD_LANGUAGE_4 es + //#define LCD_LANGUAGE_5 it + + // Use a numeric passcode for "Screen lock" keypad. + // (recommended for smaller displays) + //#define TOUCH_UI_PASSCODE + + // Output extra debug info for Touch UI events + //#define TOUCH_UI_DEBUG + + // Developer menu (accessed by touching "About Printer" copyright text) + //#define TOUCH_UI_DEVELOPER_MENU +#endif + +// +// Classic UI Options +// +#if TFT_SCALED_DOGLCD + //#define TFT_MARLINUI_COLOR 0xFFFF // White + //#define TFT_MARLINBG_COLOR 0x0000 // Black + //#define TFT_DISABLED_COLOR 0x0003 // Almost black + //#define TFT_BTCANCEL_COLOR 0xF800 // Red + //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +// +// ADC Button Debounce +// +#if HAS_ADC_BUTTONS + #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast +#endif + +// @section safety + +/** + * The watchdog hardware timer will do a reset and disable all outputs + * if the firmware gets too overloaded to read the temperature sensors. + * + * If you find that watchdog reboot causes your AVR board to hang forever, + * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. + * NOTE: This method is less reliable as it can only catch hangups while + * interrupts are enabled. + */ +#define USE_WATCHDOG +#if ENABLED(USE_WATCHDOG) + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR + //#define BABYSTEP_WITHOUT_HOMING + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). + //#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_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) + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. + #if ENABLED(MOVE_Z_WHEN_IDLE) + #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. + #endif + #endif + + //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 + + //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #endif +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See https://marlinfw.org/docs/features/lin_advance.html for full instructions. + */ +//#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. + //#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration +#endif + +// @section leveling + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Probing Margins + * + * Override PROBING_MARGIN for each side of the build plate + * Useful to get probe points to exact positions on targets or + * to allow leveling to avoid plate clamps on only specific + * sides of the bed. With NOZZLE_AS_PROBE negative values are + * allowed, to permit probing outside the bed. + * + * If you are replacing the prior *_PROBE_BED_POSITION options, + * LEFT and FRONT values in most cases will map directly over + * RIGHT and REAR would be the inverse such as + * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) + * + * This will allow all positions to match at compilation, however + * should the probe position be modified with M851XY then the + * probe points will follow. This prevents any change from causing + * the probe to be unable to reach any points. + */ +#if PROBE_SELECTED && !IS_KINEMATIC + //#define PROBING_MARGIN_LEFT PROBING_MARGIN + //#define PROBING_MARGIN_RIGHT PROBING_MARGIN + //#define PROBING_MARGIN_FRONT PROBING_MARGIN + //#define PROBING_MARGIN_BACK PROBING_MARGIN +#endif + +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + +#endif + +/** + * Thermal Probe Compensation + * Probe measurements are adjusted to compensate for temperature distortion. + * Use G76 to calibrate this feature. Use M871 to set values manually. + * For a more detailed explanation of the process see G76_M871.cpp. + */ +#if HAS_BED_PROBE && TEMP_SENSOR_PROBE && TEMP_SENSOR_BED + // Enable thermal first layer compensation using bed and probe temperatures + #define PROBE_TEMP_COMPENSATION + + // Add additional compensation depending on hotend temperature + // Note: this values cannot be calibrated and have to be set manually + #if ENABLED(PROBE_TEMP_COMPENSATION) + // Park position to wait for probe cooldown + #define PTC_PARK_POS { 0, 0, 100 } + + // Probe position to probe and wait for probe to reach target temperature + #define PTC_PROBE_POS { 90, 100 } + + // Enable additional compensation using hotend temperature + // Note: this values cannot be calibrated automatically but have to be set manually + //#define USE_TEMP_EXT_COMPENSATION + + // Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START + // (e.g. 30), in steps of PTC_SAMPLE_RES (e.g. 5) with PTC_SAMPLE_COUNT (e.g. 10) samples. + + //#define PTC_SAMPLE_START 30.0f + //#define PTC_SAMPLE_RES 5.0f + //#define PTC_SAMPLE_COUNT 10U + + // Bed temperature calibration builds a similar table. + + //#define BTC_SAMPLE_START 60.0f + //#define BTC_SAMPLE_RES 5.0f + //#define BTC_SAMPLE_COUNT 10U + + // The temperature the probe should be at while taking measurements during bed temperature + // calibration. + //#define BTC_PROBE_TEMP 30.0f + + // Height above Z=0.0f to raise the nozzle. Lowering this can help the probe to heat faster. + // Note: the Z=0.0f offset is determined by the probe offset which can be set using M851. + //#define PTC_PROBE_HEATING_OFFSET 0.5f + + // Height to raise the Z-probe between heating and taking the next measurement. Some probes + // may fail to untrigger if they have been triggered for a long time, which can be solved by + // increasing the height the probe is raised to. + //#define PTC_PROBE_RAISE 15U + + // If the probe is outside of the defined range, use linear extrapolation using the closest + // point and the PTC_LINEAR_EXTRAPOLATION'th next point. E.g. if set to 4 it will use data[0] + // and data[4] to perform linear extrapolation for values below PTC_SAMPLE_START. + //#define PTC_LINEAR_EXTRAPOLATION 4 + #endif +#endif + +// @section extras + +// +// G60/G61 Position Save and Return +// +//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // (mm) Length (or minimum length) of each arc segment + //#define ARC_SEGMENTS_PER_R 1 // Max segment length, MM_PER = Min + #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle + //#define ARC_SEGMENTS_PER_SEC 50 // Use feedrate to choose segment length (with MM_PER_ARC_SEGMENT as the minimum) + #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes + //#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +/** + * Direct Stepping + * + * Comparable to the method used by Klipper, G6 direct stepping significantly + * reduces motion calculations, increases top printing speeds, and results in + * less step aliasing by calculating all motions in advance. + * Preparing your G-code: https://github.com/colinrgodsey/step-daemon + */ +//#define DIRECT_STEPPING + +/** + * G38 Probe Target + * + * This option adds G38.2 and G38.3 (probe towards target) + * and optionally G38.4 and G38.5 (probe away from target). + * Set MULTIPLE_PROBING for G38 to probe more than once. + */ +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target + #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay before and after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 +//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 0 : Minimum 500ns for LV8729, adjusted in stepper.h + * 1 : Minimum for A4988 and A5984 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 5000000 : Maximum for TMC2xxx stepper drivers + * 1000000 : Maximum for LV8729 stepper driver + * 500000 : Maximum for A4988 stepper driver + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section motion + +// 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 +#elif ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 +#else + #define BLOCK_BUFFER_SIZE 16 +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 32 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +#define RX_BUFFER_SIZE 128 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +// Add M575 G-code to change the baud rate +//#define BAUD_RATE_GCODE + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +/** + * Emergency Command Parser + * + * Add a low-level parser to intercept certain commands as they + * enter the serial receive buffer, so they cannot be blocked. + * Currently handles M108, M112, M410, M876 + * NOTE: Not yet implemented for all platforms. + */ +//#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// Printrun may have trouble receiving long strings all at once. +// 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 + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + */ +//#define FWRETRACT +#if ENABLED(FWRETRACT) + #define FWRETRACT_AUTORETRACT // Override slicer retractions + #if ENABLED(FWRETRACT_AUTORETRACT) + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #endif + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #if ENABLED(MIXING_EXTRUDER) + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + #endif +#endif + +/** + * Universal tool change settings. + * Applies to all types of extruders except where explicitly noted. + */ +#if HAS_MULTI_EXTRUDER + // Z raise distance for tool-change, as needed for some extruders + #define TOOLCHANGE_ZRAISE 2 // (mm) + //#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled) + //#define TOOLCHANGE_NO_RETURN // Never return to previous position on tool-change + #if ENABLED(TOOLCHANGE_NO_RETURN) + //#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change + #endif + + /** + * Retract and prime filament on tool-change to reduce + * ooze and stringing and to get cleaner transitions. + */ + //#define TOOLCHANGE_FILAMENT_SWAP + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + // 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/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/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 + #define TOOLCHANGE_FS_FAN_SPEED 255 // 0-255 + #define TOOLCHANGE_FS_FAN_TIME 10 // (seconds) + + // Swap uninitialized extruder with TOOLCHANGE_FS_PRIME_SPEED for all lengths (recover + prime) + // (May break filament if not retracted beforehand.) + //#define TOOLCHANGE_FS_INIT_BEFORE_SWAP + + // Prime on the first T0 (If other, TOOLCHANGE_FS_INIT_BEFORE_SWAP applied) + // Enable it (M217 V[0/1]) before printing, to avoid unwanted priming on host connect + //#define TOOLCHANGE_FS_PRIME_FIRST_USED + + /** + * Tool Change Migration + * This feature provides G-code and LCD options to switch tools mid-print. + * All applicable tool properties are migrated so the print can continue. + * Tools must be closely matching and other restrictions may apply. + * Useful to: + * - Change filament color without interruption + * - Switch spools automatically on filament runout + * - Switch to a different nozzle on an extruder jam + */ + #define TOOLCHANGE_MIGRATION_FEATURE + + #endif + + /** + * Position to park head during tool change. + * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER + */ + //#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/min) + //#define TOOLCHANGE_PARK_X_ONLY // X axis only move + //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move + #endif +#endif // HAS_MULTI_EXTRUDER + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 25 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 650 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 25 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 570 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 80 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_PURGE_RETRACT 1 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_PURGE_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 30 // (mm) An unretract is done, then this length is purged. + #define FILAMENT_UNLOAD_PURGE_FEEDRATE 6 // (mm/s) feedrate to purge before unload + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change + + #define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #if AXIS_DRIVER_TYPE_X(TMC26X) + #define X_MAX_CURRENT 1000 // (mA) + #define X_SENSE_RESISTOR 91 // (mOhms) + #define X_MICROSTEPS 16 // Number of microsteps + #endif + + #if AXIS_DRIVER_TYPE_X2(TMC26X) + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y(TMC26X) + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y2(TMC26X) + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z(TMC26X) + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z2(TMC26X) + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z3(TMC26X) + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z4(TMC26X) + #define Z4_MAX_CURRENT 1000 + #define Z4_SENSE_RESISTOR 91 + #define Z4_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E0(TMC26X) + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E1(TMC26X) + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E2(TMC26X) + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E3(TMC26X) + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E4(TMC26X) + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E5(TMC26X) + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E6(TMC26X) + #define E6_MAX_CURRENT 1000 + #define E6_SENSE_RESISTOR 91 + #define E6_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E7(TMC26X) + #define E7_MAX_CURRENT 1000 + #define E7_SENSE_RESISTOR 91 + #define E7_MICROSTEPS 16 + #endif + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode + * connect your SPI pins to the hardware SPI interface on your board and define + * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 + * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN + * to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without + * a resistor. + * The drivers can also be used with hardware serial. + * + * TMCStepper library is required to use TMC stepper drivers. + * https://github.com/teemuatlut/TMCStepper + */ +#if HAS_TRINAMIC_CONFIG + + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + #define INTERPOLATE true // Interpolate X/Y/Z_MICROSTEPS to 256 + + #if AXIS_IS_TMC(X) + #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. + #define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing + #define X_MICROSTEPS 16 // 0..256 + #define X_RSENSE 0.11 + #define X_CHAIN_POS -1 // <=0 : Not chained. 1 : MCU MOSI connected. 2 : Next in chain, ... + #endif + + #if AXIS_IS_TMC(X2) + #define X2_CURRENT 800 + #define X2_CURRENT_HOME X2_CURRENT + #define X2_MICROSTEPS 16 + #define X2_RSENSE 0.11 + #define X2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Y) + #define Y_CURRENT 800 + #define Y_CURRENT_HOME Y_CURRENT + #define Y_MICROSTEPS 16 + #define Y_RSENSE 0.11 + #define Y_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Y2) + #define Y2_CURRENT 800 + #define Y2_CURRENT_HOME Y2_CURRENT + #define Y2_MICROSTEPS 16 + #define Y2_RSENSE 0.11 + #define Y2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z) + #define Z_CURRENT 800 + #define Z_CURRENT_HOME Z_CURRENT + #define Z_MICROSTEPS 16 + #define Z_RSENSE 0.11 + #define Z_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z2) + #define Z2_CURRENT 800 + #define Z2_CURRENT_HOME Z2_CURRENT + #define Z2_MICROSTEPS 16 + #define Z2_RSENSE 0.11 + #define Z2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z3) + #define Z3_CURRENT 800 + #define Z3_CURRENT_HOME Z3_CURRENT + #define Z3_MICROSTEPS 16 + #define Z3_RSENSE 0.11 + #define Z3_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(Z4) + #define Z4_CURRENT 800 + #define Z4_CURRENT_HOME Z4_CURRENT + #define Z4_MICROSTEPS 16 + #define Z4_RSENSE 0.11 + #define Z4_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E0) + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + #define E0_RSENSE 0.11 + #define E0_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E1) + #define E1_CURRENT 800 + #define E1_MICROSTEPS 16 + #define E1_RSENSE 0.11 + #define E1_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E2) + #define E2_CURRENT 800 + #define E2_MICROSTEPS 16 + #define E2_RSENSE 0.11 + #define E2_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E3) + #define E3_CURRENT 800 + #define E3_MICROSTEPS 16 + #define E3_RSENSE 0.11 + #define E3_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E4) + #define E4_CURRENT 800 + #define E4_MICROSTEPS 16 + #define E4_RSENSE 0.11 + #define E4_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E5) + #define E5_CURRENT 800 + #define E5_MICROSTEPS 16 + #define E5_RSENSE 0.11 + #define E5_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E6) + #define E6_CURRENT 800 + #define E6_MICROSTEPS 16 + #define E6_RSENSE 0.11 + #define E6_CHAIN_POS -1 + #endif + + #if AXIS_IS_TMC(E7) + #define E7_CURRENT 800 + #define E7_MICROSTEPS 16 + #define E7_RSENSE 0.11 + #define E7_CHAIN_POS -1 + #endif + + /** + * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. + * The default pins can be found in your board's pins file. + */ + //#define X_CS_PIN -1 + //#define Y_CS_PIN -1 + //#define Z_CS_PIN -1 + //#define X2_CS_PIN -1 + //#define Y2_CS_PIN -1 + //#define Z2_CS_PIN -1 + //#define Z3_CS_PIN -1 + //#define E0_CS_PIN -1 + //#define E1_CS_PIN -1 + //#define E2_CS_PIN -1 + //#define E3_CS_PIN -1 + //#define E4_CS_PIN -1 + //#define E5_CS_PIN -1 + //#define E6_CS_PIN -1 + //#define E7_CS_PIN -1 + + /** + * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. + * Set the address using jumpers on pins MS1 and MS2. + * Address | MS1 | MS2 + * 0 | LOW | LOW + * 1 | HIGH | LOW + * 2 | LOW | HIGH + * 3 | HIGH | HIGH + * + * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers + * on the same serial port, either here or in your board's pins file. + */ + #define X_SLAVE_ADDRESS 0 + #define Y_SLAVE_ADDRESS 0 + #define Z_SLAVE_ADDRESS 0 + #define X2_SLAVE_ADDRESS 0 + #define Y2_SLAVE_ADDRESS 0 + #define Z2_SLAVE_ADDRESS 0 + #define Z3_SLAVE_ADDRESS 0 + #define Z4_SLAVE_ADDRESS 0 + #define E0_SLAVE_ADDRESS 0 + #define E1_SLAVE_ADDRESS 0 + #define E2_SLAVE_ADDRESS 0 + #define E3_SLAVE_ADDRESS 0 + #define E4_SLAVE_ADDRESS 0 + #define E5_SLAVE_ADDRESS 0 + #define E6_SLAVE_ADDRESS 0 + #define E7_SLAVE_ADDRESS 0 + + /** + * Software enable + * + * Use for drivers that do not use a dedicated enable pin, but rather handle the same + * function through a communication line such as SPI or UART. + */ + //#define SOFTWARE_DRIVER_ENABLE + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP_XY + #define STEALTHCHOP_Z + #define STEALTHCHOP_E + + /** + * Optimize spreadCycle chopper parameters by using predefined parameter sets + * or with the help of an example included in the library. + * Provided parameter sets are + * CHOPPER_DEFAULT_12V + * 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 Průša firmware for MK3 (24V) + * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 + * + * Define you own with + * { , , hysteresis_start[1..8] } + */ + #define CHOPPER_TIMING CHOPPER_DEFAULT_12V + + /** + * Monitor Trinamic drivers + * 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: + * 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. + * M122 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define Z4_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + #define E6_HYBRID_THRESHOLD 30 + #define E7_HYBRID_THRESHOLD 30 + + /** + * 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. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. + * Use M914 X Y Z to set the stall threshold at runtime: + * + * Sensitivity TMC2209 Others + * HIGHEST 255 -64 (Too sensitive => False positive) + * LOWEST 0 63 (Too insensitive => No trigger) + * + * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }. + * + * SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only *** + * Poll the driver through SPI to determine load when homing. + * Removes the need for a wire from DIAG1 to an endstop pin. + * + * 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 + + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + // TMC2209: 0...255. TMC2130: -64...63 + #define X_STALL_SENSITIVITY 8 + #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY + #define Y_STALL_SENSITIVITY 8 + #define Y2_STALL_SENSITIVITY Y_STALL_SENSITIVITY + //#define Z_STALL_SENSITIVITY 8 + //#define Z2_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define Z3_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define Z4_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define SPI_ENDSTOPS // TMC2130 only + //#define IMPROVE_HOMING_RELIABILITY + #endif + + /** + * TMC Homing stepper phase. + * + * Improve 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). + * Full step positions (128, 384, 640, 896) have the highest holding torque. + * + * Values from 0..1023, -1 to disable homing phase for that axis. + */ + //#define TMC_HOME_PHASE { 896, 896, 896 } + + /** + * Beta feature! + * Create a 50/50 square wave step pulse optimal for stepper drivers. + */ + //#define SQUARE_WAVE_STEPPING + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMCStepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_otpw(1); \ + * stepperY.intpol(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // HAS_TRINAMIC_CONFIG + +// @section L64XX + +/** + * L64XX Stepper Driver options + * + * Arduino-L6470 library (0.8.0 or higher) is required. + * https://github.com/ameyer/Arduino-L6470 + * + * Requires the following to be defined in your pins_YOUR_BOARD file + * L6470_CHAIN_SCK_PIN + * L6470_CHAIN_MISO_PIN + * L6470_CHAIN_MOSI_PIN + * L6470_CHAIN_SS_PIN + * ENABLE_RESET_L64XX_CHIPS(Q) where Q is 1 to enable and 0 to reset + */ + +#if HAS_L64XX + + //#define L6470_CHITCHAT // Display additional status info + + #if AXIS_IS_L64XX(X) + #define X_MICROSTEPS 128 // Number of microsteps (VALID: 1, 2, 4, 8, 16, 32, 128) - L6474 max is 16 + #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current + // L6470 & L6474 - VALID: 375 x (1 - 16) - 6A max - rounds down + // POWERSTEP01: VALID: 1000 x (1 - 32) - 32A max - rounds down + #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) + // L6470 & L6474 - VALID: 31.25 * (1-128) - 4A max - rounds down + // POWERSTEP01: VALID: 200 x (1 - 32) - 6.4A max - rounds down + // L6474 - STALLCURRENT setting is used to set the nominal (TVAL) current + #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - not used by L6474 + #define X_CHAIN_POS -1 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_SLEW_RATE 1 // 0-3, Slew 0 is slowest, 3 is fastest + #endif + + #if AXIS_IS_L64XX(X2) + #define X2_MICROSTEPS 128 + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS -1 + #define X2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Y) + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS -1 + #define Y_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Y2) + #define Y2_MICROSTEPS 128 + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS -1 + #define Y2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z) + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS -1 + #define Z_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z2) + #define Z2_MICROSTEPS 128 + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS -1 + #define Z2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z3) + #define Z3_MICROSTEPS 128 + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS -1 + #define Z3_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z4) + #define Z4_MICROSTEPS 128 + #define Z4_OVERCURRENT 2000 + #define Z4_STALLCURRENT 1500 + #define Z4_MAX_VOLTAGE 127 + #define Z4_CHAIN_POS -1 + #define Z4_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E0) + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS -1 + #define E0_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E1) + #define E1_MICROSTEPS 128 + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS -1 + #define E1_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E2) + #define E2_MICROSTEPS 128 + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS -1 + #define E2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E3) + #define E3_MICROSTEPS 128 + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS -1 + #define E3_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E4) + #define E4_MICROSTEPS 128 + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS -1 + #define E4_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E5) + #define E5_MICROSTEPS 128 + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS -1 + #define E5_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E6) + #define E6_MICROSTEPS 128 + #define E6_OVERCURRENT 2000 + #define E6_STALLCURRENT 1500 + #define E6_MAX_VOLTAGE 127 + #define E6_CHAIN_POS -1 + #define E6_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E7) + #define E7_MICROSTEPS 128 + #define E7_OVERCURRENT 2000 + #define E7_STALLCURRENT 1500 + #define E7_MAX_VOLTAGE 127 + #define E7_CHAIN_POS -1 + #define E7_SLEW_RATE 1 + #endif + + /** + * 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: + * 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 + * I3 - Z3 or E3 + * I4 - Z4 or E4 + * I5 - E5 + * M916 - Increase drive level until get thermal warning + * M917 - Find minimum current thresholds + * M918 - Increase speed until max or error + * M122 S0/1 - Report driver parameters + */ + //#define MONITOR_L6470_DRIVER_STATUS + + #if ENABLED(MONITOR_L6470_DRIVER_STATUS) + #define KVAL_HOLD_STEP_DOWN 1 + //#define L6470_STOP_ON_ERROR + #endif + +#endif // HAS_L64XX + +// @section i2cbus + +// +// I2C Master ID for LPC176x LCD and Digital Current control +// Does not apply to other peripherals based on the Wire library. +// +//#define I2C_MASTER_ID 1 // Set a value from 0 to 2 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +//#define EXPERIMENTAL_I2CBUS +#if ENABLED(EXPERIMENTAL_I2CBUS) + #define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave +#endif + +// @section extras + +/** + * Photo G-code + * Add the M240 G-code to take a photo. + * The photo can be triggered by a digital pin or a physical movement. + */ +//#define PHOTO_GCODE +#if ENABLED(PHOTO_GCODE) + // A position to move to (and raise Z) before taking the photo + //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) + //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) + //#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: https://www.doc-diy.net/photo/rc-1_hacked/ + //#define PHOTOGRAPH_PIN 23 + + // Canon Hack Development Kit + // https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + //#define CHDK_PIN 4 + + // Optional second move with delay to trigger the camera shutter + //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) + + // Duration to hold the switch or keep CHDK_PIN high + //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) + + /** + * PHOTO_PULSES_US may need adjustment depending on board and camera model. + * Pin must be running at 48.4kHz. + * Be sure to use a PHOTOGRAPH_PIN which can rise and fall quick enough. + * (e.g., MKS SBase temp sensor pin was too slow, so used P1.23 on J8.) + * + * Example pulse data for Nikon: https://bit.ly/2FKD0Aq + * IR Wiring: https://git.io/JvJf7 + */ + //#define PHOTO_PULSES_US { 2000, 27850, 400, 1580, 400, 3580, 400 } // (µs) Durations for each 48.4kHz oscillation + #ifdef PHOTO_PULSES_US + #define PHOTO_PULSE_DELAY_US 13 // (µs) Approximate duration of each HIGH and LOW pulse in the oscillation + #endif +#endif + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See https://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_FEATURE +//#define LASER_FEATURE +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #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 + + #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC) + + /** + * Speed / Power can be set ('M3 S') and displayed in terms of: + * - PWM255 (S0 - S255) + * - PERCENT (S0 - S100) + * - RPM (S0 - S50000) Best for use with a spindle + */ + #define CUTTER_POWER_UNIT PWM255 + + /** + * Relative Cutter Power + * Normally, 'M3 O' sets + * OCR power is relative to the range SPEED_POWER_MIN...SPEED_POWER_MAX. + * so input powers of 0...255 correspond to SPEED_POWER_MIN...SPEED_POWER_MAX + * instead of normal range (0 to SPEED_POWER_MAX). + * Best used with (e.g.) SuperPID router controller: S0 = 5,000 RPM and S255 = 30,000 RPM + */ + //#define CUTTER_POWER_RELATIVE // Set speed proportional to [SPEED_POWER_MIN...SPEED_POWER_MAX] + + #if ENABLED(SPINDLE_FEATURE) + //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction + #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction + #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed + + #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop + + /** + * M3/M4 Power Equation + * + * Each tool uses different value ranges for speed / power control. + * These parameters are used to convert between tool power units and PWM. + * + * Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE + * PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE + */ + #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage + #define SPEED_POWER_MIN 5000 // (RPM) + #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM + #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments) + + #else + + #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage + #define SPEED_POWER_MIN 0 // (%) 0-100 + #define SPEED_POWER_MAX 100 // (%) 0-100 + #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments) + + /** + * Enable inline laser power to be handled in the planner / stepper routines. + * Inline power is specified by the I (inline) flag in an M3 command (e.g., M3 S20 I) + * or by the 'S' parameter in G0/G1/G2/G3 moves (see LASER_MOVE_POWER). + * + * This allows the laser to keep in perfect sync with the planner and removes + * the powerup/down delay since lasers require negligible time. + */ + #define LASER_POWER_INLINE + + #if ENABLED(LASER_POWER_INLINE) + /** + * Scale the laser's power in proportion to the movement rate. + * + * - Sets the entry power proportional to the entry speed over the nominal speed. + * - Ramps the power up every N steps to approximate the speed trapezoid. + * - Due to the limited power resolution this is only approximate. + */ + #define LASER_POWER_INLINE_TRAPEZOID + + /** + * Continuously calculate the current power (nominal_power * current_rate / nominal_rate). + * Required for accurate power with non-trapezoidal acceleration (e.g., S_CURVE_ACCELERATION). + * This is a costly calculation so this option is discouraged on 8-bit AVR boards. + * + * LASER_POWER_INLINE_TRAPEZOID_CONT_PER defines how many step cycles there are between power updates. If your + * board isn't able to generate steps fast enough (and you are using LASER_POWER_INLINE_TRAPEZOID_CONT), increase this. + * Note that when this is zero it means it occurs every cycle; 1 means a delay wait one cycle then run, etc. + */ + //#define LASER_POWER_INLINE_TRAPEZOID_CONT + + /** + * Stepper iterations between power updates. Increase this value if the board + * can't keep up with the processing demands of LASER_POWER_INLINE_TRAPEZOID_CONT. + * Disable (or set to 0) to recalculate power on every stepper iteration. + */ + //#define LASER_POWER_INLINE_TRAPEZOID_CONT_PER 10 + + /** + * Include laser power in G0/G1/G2/G3/G5 commands with the 'S' parameter + */ + //#define LASER_MOVE_POWER + + #if ENABLED(LASER_MOVE_POWER) + // Turn off the laser on G0 moves with no power parameter. + // If a power parameter is provided, use that instead. + //#define LASER_MOVE_G0_OFF + + // Turn off the laser on G28 homing. + //#define LASER_MOVE_G28_OFF + #endif + + /** + * Inline flag inverted + * + * WARNING: M5 will NOT turn off the laser unless another move + * is done (so G-code files must end with 'M5 I'). + */ + //#define LASER_POWER_INLINE_INVERT + + /** + * Continuously apply inline power. ('M3 S3' == 'G1 S3' == 'M3 S3 I') + * + * The laser might do some weird things, so only enable this + * feature if you understand the implications. + */ + //#define LASER_POWER_INLINE_CONTINUOUS + + #else + + #define SPINDLE_LASER_POWERUP_DELAY 50 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 50 // (ms) Delay to allow the spindle to stop + + #endif + #endif +#endif + +/** + * Coolant Control + * + * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. + * + * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. + */ +//#define COOLANT_CONTROL +#if ENABLED(COOLANT_CONTROL) + #define COOLANT_MIST // Enable if mist coolant is present + #define COOLANT_FLOOD // Enable if flood coolant is present + #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed + #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * Power Monitor + * Monitor voltage (V) and/or current (A), and -when possible- power (W) + * + * Read and configure with M430 + * + * The current sensor feeds DC voltage (relative to the measured current) to an analog pin + * The voltage sensor feeds DC voltage (relative to the measured voltage) to an analog pin + */ +//#define POWER_MONITOR_CURRENT // Monitor the system current +//#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 + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT +#if ENABLED(EXTENDED_CAPABILITIES_REPORT) + //#define M115_GEOMETRY_REPORT +#endif + +/** + * Expected Printer Check + * Add the M16 G-code to compare a string to the MACHINE_NAME. + * M16 with a non-matching string causes the printer to halt. + */ +//#define EXPECTED_PRINTER_CHECK + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter (and enable volumetric). + * M200 S0/S1 to disable/enable volumetric extrusion. + */ + //#define VOLUMETRIC_DEFAULT_ON + + //#define VOLUMETRIC_EXTRUDER_LIMIT + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + /** + * Default volumetric extrusion limit in cubic mm per second (mm^3/sec). + * This factory setting applies to all extruders. + * Use 'M200 [T] L' to override and 'M502' to reset. + * A non-zero value activates Volume-based Extrusion Limiting. + */ + #define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 // (mm^3/sec) + #endif +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +// Extra options for the M114 "Current Position" report +//#define M114_DETAIL // Use 'M114` for details to check planner calculations +//#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. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +#if ENABLED(FASTER_GCODE_PARSER) + //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters +#endif + +//#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase + +//#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW + +/** + * CNC G-code options + * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. + * Note that G0 feedrates should be used with care for 3D printing (if used at all). + * High feedrates may cause ringing and harm print quality. + */ +//#define PAREN_COMMENTS // Support for parentheses-delimited comments +//#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/min) +#ifdef G0_FEEDRATE + //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode +#endif + +/** + * Startup commands + * + * Execute certain G-code commands immediately after power-on. + */ +//#define STARTUP_COMMANDS "M17 Z" + +/** + * G-code Macros + * + * Add G-codes M810-M819 to define and run G-code macros. + * Macros are not saved to EEPROM. + */ +//#define GCODE_MACROS +#if ENABLED(GCODE_MACROS) + #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used + #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro +#endif + +/** + * User-defined menu items that execute custom GCode + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define CUSTOM_USER_MENU_TITLE "Custom Commands" + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29 W" + + #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Host Action Commands + * + * Define host streamer action commands in compliance with the standard. + * + * See https://reprap.org/wiki/G-code#Action_commands + * Common commands ........ poweroff, pause, paused, resume, resumed, cancel + * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed + * + * Some features add reason codes to extend these commands. + * + * Host Prompt Support enables Marlin to use the host for user prompts so + * filament runout and other processes can be managed from the host side. + */ +//#define HOST_ACTION_COMMANDS +#if ENABLED(HOST_ACTION_COMMANDS) + //#define HOST_PROMPT_SUPPORT + //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start +#endif + +/** + * Cancel Objects + * + * Implement M486 to allow Marlin to skip objects + */ +//#define CANCEL_OBJECTS + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: https://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: https://reliabuild3d.com/ + * + * Reliabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behavior. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * Analog Joystick(s) + */ +//#define JOYSTICK +#if ENABLED(JOYSTICK) + #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 + #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 + #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 + #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 + + //#define INVERT_JOY_X // Enable if X direction is reversed + //#define INVERT_JOY_Y // Enable if Y direction is reversed + //#define INVERT_JOY_Z // Enable if Z direction is reversed + + // Use M119 with JOYSTICK_DEBUG to find reasonable values after connecting: + #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max + #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } + #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } + //#define JOYSTICK_DEBUG +#endif + +/** + * Mechanical Gantry Calibration + * Modern replacement for the Prusa TMC_Z_CALIBRATION. + * Adds capability to work with any adjustable current drivers. + * Implemented as G34 because M915 is deprecated. + */ +//#define MECHANICAL_GANTRY_CALIBRATION +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + #define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma + #define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move + #define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move + //#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction + + //#define GANTRY_CALIBRATION_SAFE_POSITION { X_CENTER, Y_CENTER } // Safe position for nozzle + //#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM + //#define GANTRY_CALIBRATION_COMMANDS_PRE "" + #define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position +#endif + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Test pattern at startup: 0=none, 1=sweep, 2=spiral + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + //#define MAX7219_REVERSE_ORDER // The individual LED matrix units may be in reversed order + //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behavior is limited to Z axis only. +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT // Marlin embedded WiFi managenent +//#define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib) + +#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) + //#define WEBSUPPORT // Start a webserver (which may include auto-discovery) + //#define OTASUPPORT // Support over-the-air firmware updates + //#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host + + /** + * To set a default WiFi SSID / Password, create a file called Configuration_Secure.h with + * the following defines, customized for your network. This specific file is excluded via + * .gitignore to prevent it from accidentally leaking to the public. + * + * #define WIFI_SSID "WiFi SSID" + * #define WIFI_PWD "WiFi Password" + */ + //#include "Configuration_Secure.h" // External file with WiFi SSID / Password +#endif + +/** + * Průša Multi-Material Unit v2 + * Enable in Configuration.h + */ +#if ENABLED(PRUSA_MMU2) + + // Serial port used for communication with MMU2. + // For AVR enable the UART port used for the MMU. (e.g., mmuSerial) + // For 32-bit boards check your HAL for available serial ports. (e.g., Serial2) + #define MMU2_SERIAL_PORT 2 + #define MMU2_SERIAL mmuSerial + + // Use hardware reset for MMU if a pin is defined for it + //#define MMU2_RST_PIN 23 + + // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) + //#define MMU2_MODE_12V + + // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout + #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" + + // Add an LCD menu for MMU2 + //#define MMU2_MENUS + #if ENABLED(MMU2_MENUS) + // Settings for filament load / unload from the LCD menu. + // 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 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } + #endif + + /** + * MMU Extruder Sensor + * + * 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. + * + * 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 + #endif + + /** + * Using a sensor like the 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) + + #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 }, \ + { -52.0, MMU2_CAN_LOAD_FEEDRATE } + + #define MMU2_CAN_LOAD_RETRACT 6.0 // (mm) Keep under the distance between Load Sequence values + #define MMU2_CAN_LOAD_DEVIATION 0.8 // (mm) Acceptable deviation + + #define MMU2_CAN_LOAD_INCREMENT 0.2 // (mm) To reuse within MMU2 module + #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ + { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } + + #endif + + //#define MMU2_DEBUG // Write debug info to serial output + +#endif // PRUSA_MMU2 + +/** + * Advanced Print Counter settings + */ +#if ENABLED(PRINTCOUNTER) + #define SERVICE_WARNING_BUZZES 3 + // Activate up to 3 service interval watchdogs + //#define SERVICE_NAME_1 "Service S" + //#define SERVICE_INTERVAL_1 100 // print hours + //#define SERVICE_NAME_2 "Service L" + //#define SERVICE_INTERVAL_2 200 // print hours + //#define SERVICE_NAME_3 "Service 3" + //#define SERVICE_INTERVAL_3 1 // print hours +#endif + +// @section develop + +// +// M100 Free Memory Watcher to debug memory usage +// +//#define M100_FREE_MEMORY_WATCHER + +// +// M42 - Set pin states +// +//#define DIRECT_PIN_CONTROL + +// +// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe +// +//#define PINS_DEBUGGING + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE diff --git a/Marlin/Makefile b/Marlin/Makefile new file mode 100644 index 00000000..49cb960b --- /dev/null +++ b/Marlin/Makefile @@ -0,0 +1,995 @@ +# Marlin Firmware Arduino Project Makefile +# +# Makefile Based on: +# Arduino 0011 Makefile +# Arduino adaptation by mellis, eighthave, oli.keller +# Marlin adaption by Daid +# Marlin 2.0 support and RELOC_WORKAROUND by @marcio-ao +# +# This has been tested with Arduino 0022. +# +# This makefile allows you to build sketches from the command line +# without the Arduino environment (or Java). +# +# Detailed instructions for using the makefile: +# +# 1. Modify the line containing "ARDUINO_INSTALL_DIR" to point to the directory that +# contains the Arduino installation (for example, under macOS, this +# might be /Applications/Arduino.app/Contents/Resources/Java). +# +# 2. Modify the line containing "UPLOAD_PORT" to refer to the filename +# representing the USB or serial connection to your Arduino board +# (e.g. UPLOAD_PORT = /dev/tty.USB0). If the exact name of this file +# changes, you can use * as a wild card (e.g. UPLOAD_PORT = /dev/tty.usb*). +# +# 3. Set the line containing "MCU" to match your board's processor. Set +# "PROG_MCU" as the AVR part name corresponding to "MCU". You can use the +# following command to get a list of correspondences: `avrdude -c alf -p x` +# Older boards are atmega8 based, newer ones like Arduino Mini, Bluetooth +# or Diecimila have the atmega168. If you're using a LilyPad Arduino, +# change F_CPU to 8000000. If you are using Gen7 electronics, you +# probably need to use 20000000. Either way, you must regenerate +# the speed lookup table with create_speed_lookuptable.py. +# +# 4. Type "make" and press enter to compile/verify your program. +# +# 5. Type "make upload", reset your Arduino board, and press enter to +# upload your program to the Arduino board. +# +# Note that all settings at the top of this file can be overridden from +# the command line with, for example, "make HARDWARE_MOTHERBOARD=71" +# +# To compile for RAMPS (atmega2560) with Arduino 1.6.9 at root/arduino you would use... +# +# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ +# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino +# +# To compile and upload simply add "upload" to the end of the line... +# +# make ARDUINO_VERSION=10609 AVR_TOOLS_PATH=/root/arduino/hardware/tools/avr/bin/ \ +# HARDWARE_MOTHERBOARD=1200 ARDUINO_INSTALL_DIR=/root/arduino upload +# +# If uploading doesn't work try adding the parameter "AVRDUDE_PROGRAMMER=wiring" or +# start upload manually (using stk500) like so: +# +# avrdude -C /root/arduino/hardware/tools/avr/etc/avrdude.conf -v -p m2560 -c stk500 \ +# -U flash:w:applet/Marlin.hex:i -P /dev/ttyUSB0 +# +# Or, try disconnecting USB to power down and then reconnecting before running avrdude. +# + +# This defines the board to compile for (see boards.h for your board's ID) +HARDWARE_MOTHERBOARD ?= 1020 + +ifeq ($(OS),Windows_NT) + # Windows + ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino + ARDUINO_USER_DIR ?= ${HOME}/Arduino +else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + # Linux + ARDUINO_INSTALL_DIR ?= /usr/share/arduino + ARDUINO_USER_DIR ?= ${HOME}/Arduino + endif + ifeq ($(UNAME_S),Darwin) + # Darwin (macOS) + ARDUINO_INSTALL_DIR ?= /Applications/Arduino.app/Contents/Java + ARDUINO_USER_DIR ?= ${HOME}/Documents/Arduino + AVR_TOOLS_PATH ?= /Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/ + endif +endif + +# Arduino source install directory, and version number +# On most linuxes this will be /usr/share/arduino +ARDUINO_INSTALL_DIR ?= ${HOME}/Arduino +ARDUINO_VERSION ?= 106 + +# The installed Libraries are in the User folder +ARDUINO_USER_DIR ?= ${HOME}/Arduino + +# You can optionally set a path to the avr-gcc tools. +# Requires a trailing slash. For example, /usr/local/avr-gcc/bin/ +AVR_TOOLS_PATH ?= + +# Programmer configuration +UPLOAD_RATE ?= 57600 +AVRDUDE_PROGRAMMER ?= arduino +# On most linuxes this will be /dev/ttyACM0 or /dev/ttyACM1 +UPLOAD_PORT ?= /dev/ttyUSB0 + +# Directory used to build files in, contains all the build files, from object +# files to the final hex file on linux it is best to put an absolute path +# like /home/username/tmp . +BUILD_DIR ?= applet + +# This defines whether Liquid_TWI2 support will be built +LIQUID_TWI2 ?= 0 + +# This defines if Wire is needed +WIRE ?= 0 + +# This defines if Tone is needed (i.e SPEAKER is defined in Configuration.h) +# Disabling this (and SPEAKER) saves approximatively 350 bytes of memory. +TONE ?= 1 + +# This defines if U8GLIB is needed (may require RELOC_WORKAROUND) +U8GLIB ?= 0 + +# This defines whether to include the Trinamic TMCStepper library +TMC ?= 0 + +# This defines whether to include the AdaFruit NeoPixel library +NEOPIXEL ?= 0 + +############ +# Try to automatically determine whether RELOC_WORKAROUND is needed based +# on GCC versions: +# 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\ ) +CC_PATCHLEVEL:=$(shell $(CC) -dM -E - < /dev/null | grep __GNUC_PATCHLEVEL__ | cut -f3 -d\ ) +CC_VER:=$(shell echo $$(( $(CC_MAJ) * 10000 + $(CC_MIN) * 100 + $(CC_PATCHLEVEL) ))) +ifeq ($(shell test $(CC_VER) -lt 40901 && echo 1),1) + @echo This version of GCC is likely broken. Enabling relocation workaround. + RELOC_WORKAROUND = 1 +endif + +############################################################################ +# Below here nothing should be changed... + +# Here the Arduino variant is selected by the board type +# HARDWARE_VARIANT = "arduino", "Sanguino", "Gen7", ... +# MCU = "atmega1280", "Mega2560", "atmega2560", "atmega644p", ... + +ifeq ($(HARDWARE_MOTHERBOARD),0) + + # No motherboard selected + +# +# RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 +# + +# MEGA/RAMPS up to 1.2 +else ifeq ($(HARDWARE_MOTHERBOARD),1000) + +# RAMPS 1.3 (Power outputs: Hotend, Fan, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1010) +# RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1011) +# RAMPS 1.3 (Power outputs: Hotend, Fan0, Fan1) +else ifeq ($(HARDWARE_MOTHERBOARD),1012) +# RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1013) +# RAMPS 1.3 (Power outputs: Spindle, Controller Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1014) + +# RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1020) +# RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1021) +# RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) +else ifeq ($(HARDWARE_MOTHERBOARD),1022) +# RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1023) +# RAMPS 1.4 (Power outputs: Spindle, Controller Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1024) + +# RAMPS Plus 3DYMY (Power outputs: Hotend, Fan, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1030) +# RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1031) +# RAMPS Plus 3DYMY (Power outputs: Hotend, Fan0, Fan1) +else ifeq ($(HARDWARE_MOTHERBOARD),1032) +# RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1033) +# RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1034) + +# +# RAMPS Derivatives - ATmega1280, ATmega2560 +# + +# 3Drag Controller +else ifeq ($(HARDWARE_MOTHERBOARD),1100) +# Velleman K8200 Controller (derived from 3Drag Controller) +else ifeq ($(HARDWARE_MOTHERBOARD),1101) +# Velleman K8400 Controller (derived from 3Drag Controller) +else ifeq ($(HARDWARE_MOTHERBOARD),1102) +# Velleman K8600 Controller (Vertex Nano) +else ifeq ($(HARDWARE_MOTHERBOARD),1103) +# Velleman K8800 Controller (Vertex Delta) +else ifeq ($(HARDWARE_MOTHERBOARD),1104) +# 2PrintBeta BAM&DICE with STK drivers +else ifeq ($(HARDWARE_MOTHERBOARD),1105) +# 2PrintBeta BAM&DICE Due with STK drivers +else ifeq ($(HARDWARE_MOTHERBOARD),1106) +# MKS BASE v1.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1107) +# MKS v1.4 with A4982 stepper drivers +else ifeq ($(HARDWARE_MOTHERBOARD),1108) +# MKS v1.5 with Allegro A4982 stepper drivers +else ifeq ($(HARDWARE_MOTHERBOARD),1109) +# MKS v1.6 with Allegro A4982 stepper drivers +else ifeq ($(HARDWARE_MOTHERBOARD),1110) +# MKS BASE 1.0 with Heroic HR4982 stepper drivers +else ifeq ($(HARDWARE_MOTHERBOARD),1111) +# MKS GEN v1.3 or 1.4 +else ifeq ($(HARDWARE_MOTHERBOARD),1112) +# MKS GEN L +else ifeq ($(HARDWARE_MOTHERBOARD),1113) +# zrib V2.0 control board (Chinese knock off RAMPS replica) +else ifeq ($(HARDWARE_MOTHERBOARD),1114) +# BigTreeTech or BIQU KFB2.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1115) +# Felix 2.0+ Electronics Board (RAMPS like) +else ifeq ($(HARDWARE_MOTHERBOARD),1116) +# Invent-A-Part RigidBoard +else ifeq ($(HARDWARE_MOTHERBOARD),1117) +# Invent-A-Part RigidBoard V2 +else ifeq ($(HARDWARE_MOTHERBOARD),1118) +# Sainsmart 2-in-1 board +else ifeq ($(HARDWARE_MOTHERBOARD),1119) +# Ultimaker +else ifeq ($(HARDWARE_MOTHERBOARD),1120) +# Ultimaker (Older electronics. Pre 1.5.4. This is rare) +else ifeq ($(HARDWARE_MOTHERBOARD),1121) + MCU ?= atmega1280 + PROG_MCU ?= m1280 + +# Azteeg X3 +else ifeq ($(HARDWARE_MOTHERBOARD),1122) +# Azteeg X3 Pro +else ifeq ($(HARDWARE_MOTHERBOARD),1123) +# Ultimainboard 2.x (Uses TEMP_SENSOR 20) +else ifeq ($(HARDWARE_MOTHERBOARD),1124) +# Rumba +else ifeq ($(HARDWARE_MOTHERBOARD),1125) +# Raise3D Rumba +else ifeq ($(HARDWARE_MOTHERBOARD),1126) +# Rapide Lite RL200 Rumba +else ifeq ($(HARDWARE_MOTHERBOARD),1127) +# Formbot T-Rex 2 Plus +else ifeq ($(HARDWARE_MOTHERBOARD),1128) +# Formbot T-Rex 3 +else ifeq ($(HARDWARE_MOTHERBOARD),1129) +# Formbot Raptor +else ifeq ($(HARDWARE_MOTHERBOARD),1130) +# Formbot Raptor 2 +else ifeq ($(HARDWARE_MOTHERBOARD),1131) +# bq ZUM Mega 3D +else ifeq ($(HARDWARE_MOTHERBOARD),1132) +# MakeBoard Mini v2.1.2 is a control board sold by MicroMake +else ifeq ($(HARDWARE_MOTHERBOARD),1133) +# TriGorilla Anycubic version 1.3 based on RAMPS EFB +else ifeq ($(HARDWARE_MOTHERBOARD),1134) +# TriGorilla Anycubic version 1.4 based on RAMPS EFB +else ifeq ($(HARDWARE_MOTHERBOARD),1135) +# TriGorilla Anycubic version 1.4 Rev 1.1 +else ifeq ($(HARDWARE_MOTHERBOARD),1136) +# Creality: Ender-4, CR-8 +else ifeq ($(HARDWARE_MOTHERBOARD),1137) +# Creality: CR10S, CR20, CR-X +else ifeq ($(HARDWARE_MOTHERBOARD),1138) +# Dagoma F5 +else ifeq ($(HARDWARE_MOTHERBOARD),1139) +# FYSETC F6 1.3 +else ifeq ($(HARDWARE_MOTHERBOARD),1140) +# FYSETC F6 1.5 +else ifeq ($(HARDWARE_MOTHERBOARD),1141) +# Duplicator i3 Plus +else ifeq ($(HARDWARE_MOTHERBOARD),1142) +# VORON +else ifeq ($(HARDWARE_MOTHERBOARD),1143) +# TRONXY V3 1.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1144) +# Z-Bolt X Series +else ifeq ($(HARDWARE_MOTHERBOARD),1145) +# TT OSCAR +else ifeq ($(HARDWARE_MOTHERBOARD),1146) +# Overlord/Overlord Pro +else ifeq ($(HARDWARE_MOTHERBOARD),1147) +# ADIMLab Gantry v1 +else ifeq ($(HARDWARE_MOTHERBOARD),1148) +# ADIMLab Gantry v2 +else ifeq ($(HARDWARE_MOTHERBOARD),1149) +# BIQU Tango V1 +else ifeq ($(HARDWARE_MOTHERBOARD),1150) +# MKS GEN L V2 +else ifeq ($(HARDWARE_MOTHERBOARD),1151) +# MKS GEN L V2.1 +else ifeq ($(HARDWARE_MOTHERBOARD),1152) +# Copymaster 3D +else ifeq ($(HARDWARE_MOTHERBOARD),1153) +# Ortur 4 +else ifeq ($(HARDWARE_MOTHERBOARD),1154) +# Tenlog D3 Hero +else ifeq ($(HARDWARE_MOTHERBOARD),1155) + +# +# RAMBo and derivatives +# + +# Rambo +else ifeq ($(HARDWARE_MOTHERBOARD),1200) +# Mini-Rambo +else ifeq ($(HARDWARE_MOTHERBOARD),1201) +# Mini-Rambo 1.0a +else ifeq ($(HARDWARE_MOTHERBOARD),1202) +# Einsy Rambo +else ifeq ($(HARDWARE_MOTHERBOARD),1203) +# Einsy Retro +else ifeq ($(HARDWARE_MOTHERBOARD),1204) +# abee Scoovo X9H +else ifeq ($(HARDWARE_MOTHERBOARD),1205) + +# +# Other ATmega1280, ATmega2560 +# + +# Cartesio CN Controls V11 +else ifeq ($(HARDWARE_MOTHERBOARD),1300) +# Cartesio CN Controls V12 +else ifeq ($(HARDWARE_MOTHERBOARD),1301) +# Cartesio CN Controls V15 +else ifeq ($(HARDWARE_MOTHERBOARD),1302) +# Cheaptronic v1.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1303) +# Cheaptronic v2.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1304) +# Makerbot Mightyboard Revision E +else ifeq ($(HARDWARE_MOTHERBOARD),1305) +# Megatronics +else ifeq ($(HARDWARE_MOTHERBOARD),1306) +# Megatronics v2.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1307) +# Megatronics v3.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1308) +# Megatronics v3.1 +else ifeq ($(HARDWARE_MOTHERBOARD),1309) +# Megatronics v3.2 +else ifeq ($(HARDWARE_MOTHERBOARD),1310) +# Elefu Ra Board (v3) +else ifeq ($(HARDWARE_MOTHERBOARD),1311) +# Leapfrog +else ifeq ($(HARDWARE_MOTHERBOARD),1312) +# Mega controller +else ifeq ($(HARDWARE_MOTHERBOARD),1313) +# Geeetech GT2560 Rev B for Mecreator2 +else ifeq ($(HARDWARE_MOTHERBOARD),1314) +# Geeetech GT2560 Rev. A +else ifeq ($(HARDWARE_MOTHERBOARD),1315) +# Geeetech GT2560 Rev. A+ (with auto level probe) +else ifeq ($(HARDWARE_MOTHERBOARD),1316) +# Geeetech GT2560 Rev B for A10(M/D) +else ifeq ($(HARDWARE_MOTHERBOARD),1317) +# Geeetech GT2560 Rev B for A20(M/D) +else ifeq ($(HARDWARE_MOTHERBOARD),1318) +# Einstart retrofit +else ifeq ($(HARDWARE_MOTHERBOARD),1319) +# Wanhao 0ne+ i3 Mini +else ifeq ($(HARDWARE_MOTHERBOARD),1320) + +# +# ATmega1281, ATmega2561 +# + +# Minitronics v1.0/1.1 +else ifeq ($(HARDWARE_MOTHERBOARD),1400) + MCU ?= atmega1281 + PROG_MCU ?= m1281 +# Silvergate v1.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1401) + MCU ?= atmega1281 + PROG_MCU ?= m1281 + +# +# Sanguinololu and Derivatives - ATmega644P, ATmega1284P +# + +# Sanguinololu < 1.2 +else ifeq ($(HARDWARE_MOTHERBOARD),1500) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p +# Sanguinololu 1.2 and above +else ifeq ($(HARDWARE_MOTHERBOARD),1501) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p +# Melzi +else ifeq ($(HARDWARE_MOTHERBOARD),1502) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p +# Melzi V2.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1503) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# Melzi with ATmega1284 (MaKr3d version) +else ifeq ($(HARDWARE_MOTHERBOARD),1504) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# Melzi Creality3D board (for CR-10 etc) +else ifeq ($(HARDWARE_MOTHERBOARD),1505) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# Melzi Malyan M150 board +else ifeq ($(HARDWARE_MOTHERBOARD),1506) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# Tronxy X5S +else ifeq ($(HARDWARE_MOTHERBOARD),1507) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# STB V1.1 +else ifeq ($(HARDWARE_MOTHERBOARD),1508) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# Azteeg X1 +else ifeq ($(HARDWARE_MOTHERBOARD),1509) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p +# Anet 1.0 (Melzi clone) +else ifeq ($(HARDWARE_MOTHERBOARD),1510) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p + +# +# Other ATmega644P, ATmega644, ATmega1284P +# + +# Gen3 Monolithic Electronics +else ifeq ($(HARDWARE_MOTHERBOARD),1600) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p +# Gen3+ +else ifeq ($(HARDWARE_MOTHERBOARD),1601) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p +# Gen6 +else ifeq ($(HARDWARE_MOTHERBOARD),1602) + HARDWARE_VARIANT ?= Gen6 + MCU ?= atmega644p + PROG_MCU ?= m644p +# Gen6 deluxe +else ifeq ($(HARDWARE_MOTHERBOARD),1603) + HARDWARE_VARIANT ?= Gen6 + MCU ?= atmega644p + PROG_MCU ?= m644p +# Gen7 custom (Alfons3 Version) +else ifeq ($(HARDWARE_MOTHERBOARD),1604) + HARDWARE_VARIANT ?= Gen7 + MCU ?= atmega644 + PROG_MCU ?= m644 + F_CPU ?= 20000000 +# Gen7 v1.1, v1.2 +else ifeq ($(HARDWARE_MOTHERBOARD),1605) + HARDWARE_VARIANT ?= Gen7 + MCU ?= atmega644p + PROG_MCU ?= m644p + F_CPU ?= 20000000 +# Gen7 v1.3 +else ifeq ($(HARDWARE_MOTHERBOARD),1606) + HARDWARE_VARIANT ?= Gen7 + MCU ?= atmega644p + PROG_MCU ?= m644p + F_CPU ?= 20000000 +# Gen7 v1.4 +else ifeq ($(HARDWARE_MOTHERBOARD),1607) + HARDWARE_VARIANT ?= Gen7 + MCU ?= atmega1284p + PROG_MCU ?= m1284p + F_CPU ?= 20000000 +# Alpha OMCA board +else ifeq ($(HARDWARE_MOTHERBOARD),1608) + HARDWARE_VARIANT ?= SanguinoA + MCU ?= atmega644 + PROG_MCU ?= m644 +# Final OMCA board +else ifeq ($(HARDWARE_MOTHERBOARD),1609) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p +# Sethi 3D_1 +else ifeq ($(HARDWARE_MOTHERBOARD),1610) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega644p + PROG_MCU ?= m644p + +# +# Teensyduino - AT90USB1286, AT90USB1286P +# + +# Teensylu +else ifeq ($(HARDWARE_MOTHERBOARD),1700) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 +# Printrboard (AT90USB1286) +else ifeq ($(HARDWARE_MOTHERBOARD),1701) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 +# Printrboard Revision F (AT90USB1286) +else ifeq ($(HARDWARE_MOTHERBOARD),1702) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 +# Brainwave (AT90USB646) +else ifeq ($(HARDWARE_MOTHERBOARD),1703) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb646 + PROG_MCU ?= usb646 +# Brainwave Pro (AT90USB1286) +else ifeq ($(HARDWARE_MOTHERBOARD),1704) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 +# SAV Mk-I (AT90USB1286) +else ifeq ($(HARDWARE_MOTHERBOARD),1705) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 +# Teensy++2.0 (AT90USB1286) +else ifeq ($(HARDWARE_MOTHERBOARD),1706) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 +# 5DPrint D8 Driver Board +else ifeq ($(HARDWARE_MOTHERBOARD),1707) + HARDWARE_VARIANT ?= Teensy + MCU ?= at90usb1286 + PROG_MCU ?= usb1286 + +# UltiMachine Archim1 (with DRV8825 drivers) +else ifeq ($(HARDWARE_MOTHERBOARD),3023) + HARDWARE_VARIANT ?= archim + MCPU = cortex-m3 + F_CPU = 84000000 + IS_MCU = 0 +# UltiMachine Archim2 (with TMC2130 drivers) +else ifeq ($(HARDWARE_MOTHERBOARD),3024) + HARDWARE_VARIANT ?= archim + MCPU = cortex-m3 + F_CPU = 84000000 + IS_MCU = 0 +endif + +# Be sure to regenerate speed_lookuptable.h with create_speed_lookuptable.py +# if you are setting this to something other than 16MHz +# Do not put the UL suffix, it's done later on. +# Set to 16Mhz if not yet set. +F_CPU ?= 16000000 + +# Set to microcontroller if IS_MCU not yet set +IS_MCU ?= 1 + +ifeq ($(IS_MCU),1) + # Set to arduino, ATmega2560 if not yet set. + HARDWARE_VARIANT ?= arduino + MCU ?= atmega2560 + PROG_MCU ?= m2560 + + TOOL_PREFIX = avr + MCU_FLAGS = -mmcu=$(MCU) + SIZE_FLAGS = --mcu=$(MCU) -C +else + TOOL_PREFIX = arm-none-eabi + CPU_FLAGS = -mthumb -mcpu=$(MCPU) + SIZE_FLAGS = -A +endif + +# Arduino contained the main source code for the Arduino +# Libraries, the "hardware variant" are for boards +# that derives from that, and their source are present in +# the main Marlin source directory + +TARGET = $(notdir $(CURDIR)) + +# VPATH tells make to look into these directory for source files, +# there is no need to specify explicit pathnames as long as the +# directory is added here + +# The Makefile for previous versions of Marlin used VPATH for all +# source files, but for Marlin 2.0, we use VPATH only for arduino +# library files. + +VPATH = . +VPATH += $(BUILD_DIR) +VPATH += $(HARDWARE_SRC) + +ifeq ($(HARDWARE_VARIANT), $(filter $(HARDWARE_VARIANT),arduino Teensy Sanguino)) + # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI + # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src +endif + +ifeq ($(IS_MCU),1) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/cores/arduino + + # Old libraries (avr-core 1.6.21 < / Arduino < 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial + # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SPI/src + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/SoftwareSerial/src +endif + +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidCrystal/src + +ifeq ($(LIQUID_TWI2), 1) + WIRE = 1 + VPATH += $(ARDUINO_INSTALL_DIR)/libraries/LiquidTWI2 +endif +ifeq ($(WIRE), 1) + # Old libraries (avr-core 1.6.21 / Arduino < 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/utility + # New libraries (avr-core >= 1.6.21 / Arduino >= 1.6.8) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/libraries/Wire/src/utility +endif +ifeq ($(NEOPIXEL), 1) +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/Adafruit_NeoPixel +endif +ifeq ($(U8GLIB), 1) +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/csrc +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/cppsrc +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/U8glib/fntsrc +endif +ifeq ($(TMC), 1) +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src +VPATH += $(ARDUINO_INSTALL_DIR)/libraries/TMCStepper/src/source +endif + +ifeq ($(HARDWARE_VARIANT), arduino) + HARDWARE_SUB_VARIANT ?= mega + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/arduino/avr/variants/$(HARDWARE_SUB_VARIANT) +else ifeq ($(HARDWARE_VARIANT), Sanguino) + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/marlin/avr/variants/sanguino +else ifeq ($(HARDWARE_VARIANT), archim) + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/libsam + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/CMSIS/Include/ + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/system/CMSIS/Device/ATMEL/ + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/cores/arduino + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/cores/arduino/avr + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/cores/arduino/USB + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/libraries/Wire/src + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/libraries/SPI/src + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/libraries/U8glib/src/clib + VPATH += $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim + LDSCRIPT = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/linker_scripts/gcc/flash.ld + LDLIBS = $(ARDUINO_INSTALL_DIR)/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/libsam_sam3x8e_gcc_rel.a +else + HARDWARE_SUB_VARIANT ?= standard + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/$(HARDWARE_VARIANT)/variants/$(HARDWARE_SUB_VARIANT) +endif + +LIB_SRC = wiring.c \ + wiring_analog.c wiring_digital.c \ + wiring_shift.c WInterrupts.c hooks.c + +ifeq ($(HARDWARE_VARIANT), archim) + LIB_ASRC += wiring_pulse_asm.S +else + LIB_SRC += wiring_pulse.c +endif + +ifeq ($(HARDWARE_VARIANT), Teensy) + LIB_SRC = wiring.c + VPATH += $(ARDUINO_INSTALL_DIR)/hardware/teensy/cores/teensy +endif + +LIB_CXXSRC = WMath.cpp WString.cpp Print.cpp SPI.cpp + +ifeq ($(NEOPIXEL), 1) + LIB_CXXSRC += Adafruit_NeoPixel.cpp +endif + +ifeq ($(LIQUID_TWI2), 0) + LIB_CXXSRC += LiquidCrystal.cpp +else + LIB_SRC += twi.c + LIB_CXXSRC += Wire.cpp LiquidTWI2.cpp +endif + +ifeq ($(WIRE), 1) + LIB_SRC += twi.c + LIB_CXXSRC += Wire.cpp +endif + +ifeq ($(TONE), 1) + LIB_CXXSRC += Tone.cpp +endif + +ifeq ($(U8GLIB), 1) + LIB_CXXSRC += U8glib.cpp + LIB_SRC += u8g_ll_api.c u8g_bitmap.c u8g_clip.c u8g_com_null.c u8g_delay.c \ + u8g_page.c u8g_pb.c u8g_pb16h1.c u8g_rect.c u8g_state.c u8g_font.c \ + u8g_font_6x13.c u8g_font_04b_03.c u8g_font_5x8.c +endif + +ifeq ($(TMC), 1) + LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \ + CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \ + DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \ + SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \ + TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp +endif + +ifeq ($(RELOC_WORKAROUND), 1) + LD_PREFIX=-nodefaultlibs + LD_SUFFIX=-lm -lgcc -lc -lgcc +endif + +#Check for Arduino 1.0.0 or higher and use the correct source files for that version +ifeq ($(shell [ $(ARDUINO_VERSION) -ge 100 ] && echo true), true) + LIB_CXXSRC += main.cpp +else + LIB_SRC += pins_arduino.c main.c +endif + +FORMAT = ihex + +# Name of this Makefile (used for "make depend"). +MAKEFILE = Makefile + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = stabs + +OPT = s + +DEFINES ?= + +# Program settings +CC = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-gcc +CXX = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-g++ +OBJCOPY = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-objcopy +OBJDUMP = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-objdump +AR = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-ar +SIZE = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-size +NM = $(AVR_TOOLS_PATH)$(TOOL_PREFIX)-nm +AVRDUDE = avrdude +REMOVE = rm -f +MV = mv -f + +# Place -D or -U options here +CDEFS = -DF_CPU=$(F_CPU)UL ${addprefix -D , $(DEFINES)} -DARDUINO=$(ARDUINO_VERSION) +CXXDEFS = $(CDEFS) + +ifeq ($(HARDWARE_VARIANT), Teensy) + CDEFS += -DUSB_SERIAL + LIB_SRC += usb.c pins_teensy.c + LIB_CXXSRC += usb_api.cpp + +else ifeq ($(HARDWARE_VARIANT), archim) + CDEFS += -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ + CDEFS += -DUSB_VID=0x27B1 -DUSB_PID=0x0001 -DUSBCON + CDEFS += '-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 + + ifeq ($(U8GLIB), 1) + LIB_SRC += u8g_com_api.c u8g_pb32h1.c + endif +endif + +# Add all the source directories as include directories too +CINCS = ${addprefix -I ,${VPATH}} +CXXINCS = ${addprefix -I ,${VPATH}} + +# Silence warnings for library code (won't work for .h files, unfortunately) +LIBWARN = -w -Wno-packed-bitfield-compat + +# Compiler flag to set the C/CPP Standard level. +CSTANDARD = -std=gnu99 +CXXSTANDARD = -std=gnu++11 +CDEBUG = -g$(DEBUG) +CWARN = -Wall -Wstrict-prototypes -Wno-packed-bitfield-compat -Wno-pragmas -Wunused-parameter +CXXWARN = -Wall -Wno-packed-bitfield-compat -Wno-pragmas -Wunused-parameter +CTUNING = -fsigned-char -funsigned-bitfields -fno-exceptions \ + -fshort-enums -ffunction-sections -fdata-sections +ifneq ($(HARDWARE_MOTHERBOARD),) + CTUNING += -DMOTHERBOARD=${HARDWARE_MOTHERBOARD} +endif + +#CEXTRA = -Wa,-adhlns=$(<:.c=.lst) +CXXEXTRA = -fno-use-cxa-atexit -fno-threadsafe-statics -fno-rtti +CFLAGS := $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CEXTRA) $(CTUNING) $(CSTANDARD) +CXXFLAGS := $(CDEFS) $(CINCS) -O$(OPT) $(CXXEXTRA) $(CTUNING) $(CXXSTANDARD) +ASFLAGS := $(CDEFS) +#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + +ifeq ($(HARDWARE_VARIANT), archim) + LD_PREFIX = -Wl,--gc-sections,-Map,Marlin.ino.map,--cref,--check-sections,--entry=Reset_Handler,--unresolved-symbols=report-all,--warn-common,--warn-section-align + LD_SUFFIX = $(LDLIBS) + + LDFLAGS = -lm -T$(LDSCRIPT) -u _sbrk -u link -u _close -u _fstat -u _isatty + LDFLAGS += -u _lseek -u _read -u _write -u _exit -u kill -u _getpid +else + LD_PREFIX = -Wl,--gc-sections,--relax + LDFLAGS = -lm + CTUNING += -flto +endif + +# Programming support using avrdude. Settings and variables. +AVRDUDE_PORT = $(UPLOAD_PORT) +AVRDUDE_WRITE_FLASH = -Uflash:w:$(BUILD_DIR)/$(TARGET).hex:i +ifeq ($(shell uname -s), Linux) + AVRDUDE_CONF = /etc/avrdude/avrdude.conf +else + AVRDUDE_CONF = $(ARDUINO_INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf +endif +AVRDUDE_FLAGS = -D -C$(AVRDUDE_CONF) \ + -p$(PROG_MCU) -P$(AVRDUDE_PORT) -c$(AVRDUDE_PROGRAMMER) \ + -b$(UPLOAD_RATE) + +# Since Marlin 2.0, the source files may be distributed into several +# different directories, so it is necessary to find them recursively + +SRC = $(shell find src -name '*.c' -type f) +CXXSRC = $(shell find src -name '*.cpp' -type f) + +# Define all object files. +OBJ = ${patsubst %.c, $(BUILD_DIR)/arduino/%.o, ${LIB_SRC}} +OBJ += ${patsubst %.cpp, $(BUILD_DIR)/arduino/%.o, ${LIB_CXXSRC}} +OBJ += ${patsubst %.S, $(BUILD_DIR)/arduino/%.o, ${LIB_ASRC}} +OBJ += ${patsubst %.c, $(BUILD_DIR)/%.o, ${SRC}} +OBJ += ${patsubst %.cpp, $(BUILD_DIR)/%.o, ${CXXSRC}} + +# Define all listing files. +LST = $(LIB_ASRC:.S=.lst) $(LIB_CXXSRC:.cpp=.lst) $(LIB_SRC:.c=.lst) + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = $(MCU_FLAGS) $(CPU_FLAGS) $(CFLAGS) -I. +ALL_CXXFLAGS = $(MCU_FLAGS) $(CPU_FLAGS) $(CXXFLAGS) +ALL_ASFLAGS = $(MCU_FLAGS) $(CPU_FLAGS) $(ASFLAGS) -x assembler-with-cpp + +# set V=1 (eg, "make V=1") to print the full commands etc. +ifneq ($V,1) + Pecho=@echo + P=@ +else + Pecho=@: + P= +endif + +# Create required build hierarchy if it does not exist + +$(shell mkdir -p $(dir $(OBJ))) + +# Default target. +all: sizeafter + +build: elf hex bin + +elf: $(BUILD_DIR)/$(TARGET).elf +bin: $(BUILD_DIR)/$(TARGET).bin +hex: $(BUILD_DIR)/$(TARGET).hex +eep: $(BUILD_DIR)/$(TARGET).eep +lss: $(BUILD_DIR)/$(TARGET).lss +sym: $(BUILD_DIR)/$(TARGET).sym + +# Program the device. +# Do not try to reset an Arduino if it's not one +upload: $(BUILD_DIR)/$(TARGET).hex +ifeq (${AVRDUDE_PROGRAMMER}, arduino) + stty hup < $(UPLOAD_PORT); true +endif + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) +ifeq (${AVRDUDE_PROGRAMMER}, arduino) + stty -hup < $(UPLOAD_PORT); true +endif + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex +ELFSIZE = $(SIZE) $(SIZE_FLAGS) $(BUILD_DIR)/$(TARGET).elf; \ + $(SIZE) $(BUILD_DIR)/$(TARGET).elf +sizebefore: + $P if [ -f $(BUILD_DIR)/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi + +sizeafter: build + $P if [ -f $(BUILD_DIR)/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ + --change-section-address .data-0x800000 \ + --change-section-address .bss-0x800000 \ + --change-section-address .noinit-0x800000 \ + --change-section-address .eeprom-0x810000 + + +coff: $(BUILD_DIR)/$(TARGET).elf + $(COFFCONVERT) -O coff-avr $(BUILD_DIR)/$(TARGET).elf $(TARGET).cof + + +extcoff: $(TARGET).elf + $(COFFCONVERT) -O coff-ext-avr $(BUILD_DIR)/$(TARGET).elf $(TARGET).cof + + +.SUFFIXES: .elf .hex .eep .lss .sym .bin +.PRECIOUS: .o + +.elf.hex: + $(Pecho) " COPY $@" + $P $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +.elf.bin: + $(Pecho) " COPY $@" + $P $(OBJCOPY) -O binary -R .eeprom $< $@ + +.elf.eep: + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +.elf.lss: + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +.elf.sym: + $(NM) -n $< > $@ + +# Link: create ELF output file from library. + +$(BUILD_DIR)/$(TARGET).elf: $(OBJ) Configuration.h + $(Pecho) " CXX $@" + $P $(CXX) $(LD_PREFIX) $(ALL_CXXFLAGS) -o $@ -L. $(OBJ) $(LDFLAGS) $(LD_SUFFIX) + +# Object files that were found in "src" will be stored in $(BUILD_DIR) +# in directories that mirror the structure of "src" + +$(BUILD_DIR)/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) + $(Pecho) " CC $<" + $P $(CC) -MMD -c $(ALL_CFLAGS) $(CWARN) $< -o $@ + +$(BUILD_DIR)/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) + $(Pecho) " CXX $<" + $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $(CXXWARN) $< -o $@ + +# Object files for Arduino libs will be created in $(BUILD_DIR)/arduino + +$(BUILD_DIR)/arduino/%.o: %.c Configuration.h Configuration_adv.h $(MAKEFILE) + $(Pecho) " CC $<" + $P $(CC) -MMD -c $(ALL_CFLAGS) $(LIBWARN) $< -o $@ + +$(BUILD_DIR)/arduino/%.o: %.cpp Configuration.h Configuration_adv.h $(MAKEFILE) + $(Pecho) " CXX $<" + $P $(CXX) -MMD -c $(ALL_CXXFLAGS) $(LIBWARN) $< -o $@ + +$(BUILD_DIR)/arduino/%.o: %.S $(MAKEFILE) + $(Pecho) " CXX $<" + $P $(CXX) -MMD -c $(ALL_ASFLAGS) $< -o $@ + +# Target: clean project. +clean: + $(Pecho) " RMDIR $(BUILD_DIR)/" + $P rm -rf $(BUILD_DIR) + + +.PHONY: all build elf hex eep lss sym program coff extcoff clean depend sizebefore sizeafter + +# Automaticaly include the dependency files created by gcc +-include ${patsubst %.o, %.d, ${OBJ}} diff --git a/Marlin/Marlin.ino b/Marlin/Marlin.ino new file mode 100644 index 00000000..57c82544 --- /dev/null +++ b/Marlin/Marlin.ino @@ -0,0 +1,57 @@ +/*============================================================================== + + Marlin Firmware + + (c) 2011-2020 MarlinFirmware + Portions of Marlin are (c) by their respective authors. + All code complies with GPLv2 and/or GPLv3 + +================================================================================ + +Greetings! Thank you for choosing Marlin 2 as your 3D printer firmware. + +To configure Marlin you must edit Configuration.h and Configuration_adv.h +located in the root 'Marlin' folder. Check our Configurations repository to +see if there's a more suitable starting-point for your specific hardware. + +Before diving in, we recommend the following essential links: + +Marlin Firmware Official Website + + - https://marlinfw.org/ + The official Marlin Firmware website contains the most up-to-date + documentation. Contributions are always welcome! + +Configuration + + - https://github.com/MarlinFirmware/Configurations + Example configurations for several printer models. + + - https://www.youtube.com/watch?v=3gwWVFtdg-4 + A good 20-minute overview of Marlin configuration by Tom Sanladerer. + (Applies to Marlin 1.0.x, so Jerk and Acceleration should be halved.) + Also... https://www.google.com/search?tbs=vid%3A1&q=configure+marlin + + - https://marlinfw.org/docs/configuration/configuration.html + Marlin's configuration options are explained in more detail here. + +Getting Help + + - 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. + + - https://github.com/MarlinFirmware/Marlin/issues + With a free GitHub account you can provide us with feedback, bug reports, + and feature requests via the Marlin Issue Queue. + +Contributing + + - https://marlinfw.org/docs/development/contributing.html + If you'd like to contribute to Marlin, read this first! + + - https://marlinfw.org/docs/development/coding_standards.html + Before submitting code get to know the Coding Standards. + + +------------------------------------------------------------------------------*/ diff --git a/Marlin/Version.h b/Marlin/Version.h new file mode 100644 index 00000000..60e068ba --- /dev/null +++ b/Marlin/Version.h @@ -0,0 +1,76 @@ +/** + * 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 + +//////////////////////////// +// VENDOR VERSION EXAMPLE // +//////////////////////////// + +/** + * Marlin release version identifier + */ +//#define SHORT_BUILD_VERSION "2.0.7.2" + +/** + * Verbose version identifier which should contain a reference to the location + * from where the binary was downloaded or the source code was compiled. + */ +//#define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION + +/** + * The STRING_DISTRIBUTION_DATE represents when the binary file was built, + * here we define this default string as the date where the latest release + * version was tagged. + */ +//#define STRING_DISTRIBUTION_DATE "2020-07-09" + +/** + * Defines a generic printer name to be output to the LCD after booting Marlin. + */ +//#define MACHINE_NAME "3D Printer" + +/** + * The SOURCE_CODE_URL is the location where users will find the Marlin Source + * Code which is installed on the device. In most cases —unless the manufacturer + * has a distinct Github fork— the Source Code URL should just be the main + * Marlin repository. + */ +//#define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" + +/** + * Default generic printer UUID. + */ +//#define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff" + +/** + * The WEBSITE_URL is the location where users can get more information such as + * documentation about a specific Marlin release. + */ +//#define WEBSITE_URL "https://marlinfw.org" + +/** + * 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 diff --git a/Marlin/_Bootscreen.h b/Marlin/_Bootscreen.h new file mode 100644 index 00000000..e35e7629 --- /dev/null +++ b/Marlin/_Bootscreen.h @@ -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 . + * + */ +#pragma once + +/** + * Made with Marlin Bitmap Converter + * http://marlinfw.org/tools/u8glib/converter.html + * + * This bitmap from the file 'EVNOVO-Artillery-Logo.jpg' + */ +#define CUSTOM_BOOTSCREEN_BMPWIDTH 54 + +const unsigned char custom_start_bmp[] PROGMEM = { + B00000000,B00000000,B01100000,B00000000,B00011000,B00000000,B00000000, + B00000000,B00000001,B11100000,B00000000,B00011110,B00000000,B00000000, + B00000000,B00000111,B11100000,B00000000,B00011111,B10000000,B00000000, + B00000000,B00001111,B11100000,B00000000,B00011111,B11100000,B00000000, + B00000000,B00111111,B11100000,B00000000,B00011111,B11110000,B00000000, + B00000000,B11111111,B11000000,B00000000,B00001111,B11111100,B00000000, + B00000011,B11111111,B00000000,B00000000,B00000011,B11111111,B00000000, + B00000111,B11111100,B00000000,B00000000,B00000000,B11111111,B10000000, + B00011111,B11111000,B00000000,B00000000,B00000000,B01111111,B11100000, + B01111111,B11100000,B00000000,B00000000,B00000000,B00011111,B11111000, + B11111111,B10000000,B00000000,B00000000,B00000000,B00000111,B11111100, + B11111110,B00000000,B00000000,B00000000,B00000000,B00000001,B11111100, + B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B11111100, + B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111100, + B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111100, + B11111000,B00000011,B00000000,B00000000,B00000011,B00000000,B01111100, + B11111000,B00000011,B11000000,B00000000,B00001111,B00000000,B01111100, + B11111000,B00000011,B11110000,B00000000,B00111111,B00000000,B01111100, + B11111000,B00000011,B11111100,B00000000,B11111111,B00000000,B01111100, + B11111000,B00000011,B11111110,B00000001,B11111111,B00000000,B01111100, + B11111000,B00000001,B11111111,B00000011,B11111110,B00000000,B01111100, + B11111000,B00000000,B11111111,B00000011,B11111100,B00000000,B01111100, + B11111000,B00000000,B00111111,B00000011,B11110000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00011111,B00000011,B11100000,B00000000,B01111100, + B11111000,B00000000,B00111111,B00000011,B11110000,B00000000,B01111100, + B11111000,B00000000,B11111111,B00000011,B11111100,B00000000,B01111100, + B11111000,B00000001,B11111111,B00000011,B11111110,B00000000,B01111100, + B11111000,B00000011,B11111110,B00000001,B11111111,B00000000,B01111100, + B11111000,B00000011,B11111100,B00000000,B11111111,B00000000,B01111100, + B11111000,B00000011,B11110000,B00000000,B00111111,B00000000,B01111100, + B11111000,B00000011,B11000000,B00000000,B00001111,B00000000,B01111100, + B11111000,B00000011,B00000000,B00000000,B00000011,B00000000,B01111100, + B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111100, + B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111100, + B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B11111100, + B11111110,B00000000,B00000000,B00000000,B00000000,B00000001,B11111100, + B11111111,B10000000,B00000000,B00000000,B00000000,B00000111,B11111100, + B01111111,B11100000,B00000000,B00000000,B00000000,B00011111,B11111000, + B00011111,B11111000,B00000000,B00000000,B00000000,B01111111,B11100000, + B00000111,B11111100,B00000000,B00000000,B00000000,B11111111,B10000000, + B00000011,B11111111,B00000000,B00000000,B00000011,B11111111,B00000000, + B00000000,B11111111,B11000000,B00000000,B00001111,B11111100,B00000000, + B00000000,B00111111,B11100000,B00000000,B00011111,B11110000,B00000000, + B00000000,B00011111,B11100000,B00000000,B00011111,B11000000,B00000000, + B00000000,B00000111,B11100000,B00000000,B00011111,B10000000,B00000000, + B00000000,B00000001,B11100000,B00000000,B00011110,B00000000,B00000000, + B00000000,B00000000,B01100000,B00000000,B00011000,B00000000,B00000000 +}; diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp new file mode 100644 index 00000000..58d57c8e --- /dev/null +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -0,0 +1,78 @@ +/** + * 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 . + * + */ +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +// ------------------------ +// Public Variables +// ------------------------ + +//uint8_t MCUSR; + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_init() { + // Init Servo Pins + #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) + #if HAS_SERVO_0 + INIT_SERVO(0); + #endif + #if HAS_SERVO_1 + INIT_SERVO(1); + #endif + #if HAS_SERVO_2 + INIT_SERVO(2); + #endif + #if HAS_SERVO_3 + INIT_SERVO(3); + #endif +} + +#if ENABLED(SDSUPPORT) + + #include "../../sd/SdFatUtil.h" + int freeMemory() { return SdFatUtil::FreeRam(); } + +#else // !SDSUPPORT + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +#endif // !SDSUPPORT + +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h new file mode 100644 index 00000000..6e0afa8f --- /dev/null +++ b/Marlin/src/HAL/AVR/HAL.h @@ -0,0 +1,191 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 "../shared/Marduino.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" +#include "math.h" + +#ifdef IS_AT90USB + #include +#else + #define HardwareSerial_h // Hack to prevent HardwareSerial.h header inclusion + #include "MarlinSerial.h" +#endif + +#include +#include +#include +#include +#include +#include + +#ifndef pgm_read_ptr + // Compatibility for avr-libc 1.8.0-4.1 included with Ubuntu for + // Windows Subsystem for Linux on Windows 10 as of 10/18/2019 + #define pgm_read_ptr_far(address_long) (void*)__ELPM_word((uint32_t)(address_long)) + #define pgm_read_ptr_near(address_short) (void*)__LPM_word((uint16_t)(address_short)) + #define pgm_read_ptr(address_short) pgm_read_ptr_near(address_short) +#endif + +// ------------------------ +// Defines +// ------------------------ + +// AVR PROGMEM extension for sprintf_P +#define S_FMT "%S" + +// AVR PROGMEM extension for string define +#define PGMSTR(NAM,STR) const char NAM[] PROGMEM = STR + +#ifndef CRITICAL_SECTION_START + #define CRITICAL_SECTION_START() unsigned char _sreg = SREG; cli() + #define CRITICAL_SECTION_END() SREG = _sreg +#endif +#define ISRS_ENABLED() TEST(SREG, SREG_I) +#define ENABLE_ISRS() sei() +#define DISABLE_ISRS() cli() + +// ------------------------ +// Types +// ------------------------ + +typedef int8_t pin_t; + +#define SHARED_SERVOS HAS_SERVOS +#define HAL_SERVO_LIB Servo + +// ------------------------ +// Public Variables +// ------------------------ + +//extern uint8_t MCUSR; + +// Serial ports +#ifdef IS_AT90USB + #define MYSERIAL0 TERN(BLUETOOTH, bluetoothSerial, Serial) +#else + #if !WITHIN(SERIAL_PORT, -1, 3) + #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif + #define MYSERIAL0 customizedSerial1 + + #ifdef SERIAL_PORT_2 + #if !WITHIN(SERIAL_PORT_2, -1, 3) + #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #endif + #define MYSERIAL1 customizedSerial2 + #endif +#endif + +#ifdef LCD_SERIAL_PORT + #if !WITHIN(LCD_SERIAL_PORT, -1, 3) + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif + #define LCD_SERIAL lcdSerial + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() + #endif +#endif + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_init(); + +//void cli(); + +//void _delay_ms(const int delay); + +inline void HAL_clear_reset_source() { MCUSR = 0; } +inline uint8_t HAL_get_reset_source() { return MCUSR; } + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +extern "C" { + int freeMemory(); +} +#pragma GCC diagnostic pop + +// ADC +#ifdef DIDR2 + #define HAL_ANALOG_SELECT(ind) do{ if (ind < 8) SBI(DIDR0, ind); else SBI(DIDR2, ind & 0x07); }while(0) +#else + #define HAL_ANALOG_SELECT(ind) SBI(DIDR0, ind); +#endif + +inline void HAL_adc_init() { + ADCSRA = _BV(ADEN) | _BV(ADSC) | _BV(ADIF) | 0x07; + DIDR0 = 0; + #ifdef DIDR2 + DIDR2 = 0; + #endif +} + +#define SET_ADMUX_ADCSRA(ch) ADMUX = _BV(REFS0) | (ch & 0x07); SBI(ADCSRA, ADSC) +#ifdef MUX5 + #define HAL_START_ADC(ch) if (ch > 7) ADCSRB = _BV(MUX5); else ADCSRB = 0; SET_ADMUX_ADCSRA(ch) +#else + #define HAL_START_ADC(ch) ADCSRB = 0; SET_ADMUX_ADCSRA(ch) +#endif + +#define HAL_ADC_VREF 5.0 +#define HAL_ADC_RESOLUTION 10 +#define HAL_READ_ADC() ADC +#define HAL_ADC_READY() !TEST(ADCSRA, ADSC) + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#define HAL_SENSITIVE_PINS 0, 1 + +#ifdef __AVR_AT90USB1286__ + #define JTAG_DISABLE() do{ MCUCR = 0x80; MCUCR = 0x80; }while(0) +#endif + +// AVR compatibility +#define strtof strtod + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +/** + * set_pwm_frequency + * Sets the frequency of the timer corresponding to the provided pin + * as close as possible to the provided desired frequency. Internally + * calculates the required waveform generation mode, prescaler and + * resolution values required and sets the timer registers accordingly. + * NOTE that the frequency is applied to all pins on the timer (Ex OC3A, OC3B and OC3B) + * NOTE that there are limitations, particularly if using TIMER2. (see Configuration_adv.h -> FAST FAN PWM Settings) + */ +void set_pwm_frequency(const pin_t pin, int f_desired); + +/** + * set_pwm_duty + * Sets the PWM duty cycle of the provided pin to the provided value + * Optionally allows inverting the duty cycle [default = false] + * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] + */ +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp new file mode 100644 index 00000000..31e58974 --- /dev/null +++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp @@ -0,0 +1,253 @@ +/** + * 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 . + * + */ + +/** + * Adapted from Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + */ + +/** + * HAL for AVR - SPI functions + */ + +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +void spiBegin() { + OUT_WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + #if DISABLED(SOFTWARE_SPI) + // SS must be in output mode even it is not chip select + //SET_OUTPUT(SS_PIN); + // set SS high - may be chip select for another SPI device + //#if SET_SPI_SS_HIGH + //WRITE(SS_PIN, HIGH); + //#endif + // set a default rate + spiInit(1); + #endif +} + +#if NONE(SOFTWARE_SPI, FORCE_SOFT_SPI) + + // ------------------------ + // Hardware SPI + // ------------------------ + + // make sure SPCR rate is in expected bits + #if (SPR0 != 0 || SPR1 != 1) + #error "unexpected SPCR bits" + #endif + + /** + * Initialize hardware SPI + * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6] + */ + void spiInit(uint8_t spiRate) { + // See avr processor documentation + CBI( + #ifdef PRR + PRR + #elif defined(PRR0) + PRR0 + #endif + , PRSPI); + + SPCR = _BV(SPE) | _BV(MSTR) | (spiRate >> 1); + SPSR = spiRate & 1 || spiRate == 6 ? 0 : _BV(SPI2X); + } + + /** SPI receive a byte */ + uint8_t spiRec() { + SPDR = 0xFF; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + return SPDR; + } + + /** SPI read data */ + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte-- == 0) return; + SPDR = 0xFF; + for (uint16_t i = 0; i < nbyte; i++) { + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + buf[i] = SPDR; + SPDR = 0xFF; + } + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + buf[nbyte] = SPDR; + } + + /** SPI send a byte */ + void spiSend(uint8_t b) { + SPDR = b; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + } + + /** SPI send block */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + } + + + /** begin spi transaction */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // Based on Arduino SPI library + // Clock settings are defined as follows. Note that this shows SPI2X + // inverted, so the bits form increasing numbers. Also note that + // fosc/64 appears twice + // SPR1 SPR0 ~SPI2X Freq + // 0 0 0 fosc/2 + // 0 0 1 fosc/4 + // 0 1 0 fosc/8 + // 0 1 1 fosc/16 + // 1 0 0 fosc/32 + // 1 0 1 fosc/64 + // 1 1 0 fosc/64 + // 1 1 1 fosc/128 + + // We find the fastest clock that is less than or equal to the + // given clock rate. The clock divider that results in clock_setting + // is 2 ^^ (clock_div + 1). If nothing is slow enough, we'll use the + // slowest (128 == 2 ^^ 7, so clock_div = 6). + uint8_t clockDiv; + + // When the clock is known at compiletime, use this if-then-else + // cascade, which the compiler knows how to completely optimize + // away. When clock is not known, use a loop instead, which generates + // shorter code. + if (__builtin_constant_p(spiClock)) { + if (spiClock >= F_CPU / 2) clockDiv = 0; + else if (spiClock >= F_CPU / 4) clockDiv = 1; + else if (spiClock >= F_CPU / 8) clockDiv = 2; + else if (spiClock >= F_CPU / 16) clockDiv = 3; + else if (spiClock >= F_CPU / 32) clockDiv = 4; + else if (spiClock >= F_CPU / 64) clockDiv = 5; + else clockDiv = 6; + } + else { + uint32_t clockSetting = F_CPU / 2; + clockDiv = 0; + while (clockDiv < 6 && spiClock < clockSetting) { + clockSetting /= 2; + clockDiv++; + } + } + + // Compensate for the duplicate fosc/64 + if (clockDiv == 6) clockDiv = 7; + + // Invert the SPI2X bit + clockDiv ^= 0x1; + + SPCR = _BV(SPE) | _BV(MSTR) | ((bitOrder == LSBFIRST) ? _BV(DORD) : 0) | + (dataMode << CPHA) | ((clockDiv >> 1) << SPR0); + SPSR = clockDiv | 0x01; + } + + +#else // SOFTWARE_SPI || FORCE_SOFT_SPI + + // ------------------------ + // Software SPI + // ------------------------ + + // nop to tune soft SPI timing + #define nop asm volatile ("\tnop\n") + + void spiInit(uint8_t) { /* do nothing */ } + + // Begin SPI transaction, set clock, bit order, data mode + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ } + + // Soft SPI receive byte + uint8_t spiRec() { + uint8_t data = 0; + // no interrupts during byte receive - about 8µs + cli(); + // output pin high - like sending 0xFF + WRITE(MOSI_PIN, HIGH); + + LOOP_L_N(i, 8) { + WRITE(SCK_PIN, HIGH); + + nop; // adjust so SCK is nice + nop; + + data <<= 1; + + if (READ(MISO_PIN)) data |= 1; + + WRITE(SCK_PIN, LOW); + } + + sei(); + return data; + } + + // Soft SPI read data + void spiRead(uint8_t* buf, uint16_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) + buf[i] = spiRec(); + } + + // Soft SPI send byte + void spiSend(uint8_t data) { + // no interrupts during byte send - about 8µs + cli(); + LOOP_L_N(i, 8) { + WRITE(SCK_PIN, LOW); + WRITE(MOSI_PIN, data & 0x80); + data <<= 1; + WRITE(SCK_PIN, HIGH); + } + + nop; // hold SCK high for a few ns + nop; + nop; + nop; + + WRITE(SCK_PIN, LOW); + + sei(); + } + + // Soft SPI send block + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiSend(token); + for (uint16_t i = 0; i < 512; i++) + spiSend(buf[i]); + } + +#endif // SOFTWARE_SPI || FORCE_SOFT_SPI + +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp new file mode 100644 index 00000000..8feac32a --- /dev/null +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -0,0 +1,802 @@ +/** + * 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 . + * + */ + +/** + * MarlinSerial.cpp - Hardware serial library for Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * Modified 23 November 2006 by David A. Mellis + * Modified 28 September 2010 by Mark Sproul + * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) + * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) + * Modified 10 June 2018 by Eduardo José Tagle (See #10991) + * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances + */ + +#ifdef __AVR__ + +// Disable HardwareSerial.cpp to support chips without a UART (Attiny, etc.) + +#include "../../inc/MarlinConfig.h" + +#if !IS_AT90USB && (defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)) + +#include "MarlinSerial.h" +#include "../../MarlinCore.h" + +#if ENABLED(DIRECT_STEPPING) + #include "../../feature/direct_stepping.h" +#endif + +template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } }; +template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 }; +template bool MarlinSerial::_written = false; +template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR; +template uint8_t MarlinSerial::rx_dropped_bytes = 0; +template uint8_t MarlinSerial::rx_buffer_overruns = 0; +template uint8_t MarlinSerial::rx_framing_errors = 0; +template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0; + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() asm volatile("": : :"memory"); + +#include "../../feature/e_parser.h" + +// "Atomically" read the RX head index value without disabling interrupts: +// This MUST be called with RX interrupts enabled, and CAN'T be called +// from the RX ISR itself! +template +FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_head() { + if (Cfg::RX_SIZE > 256) { + // Keep reading until 2 consecutive reads return the same value, + // meaning there was no update in-between caused by an interrupt. + // This works because serial RX interrupts happen at a slower rate + // than successive reads of a variable, so 2 consecutive reads with + // the same value means no interrupt updated it. + ring_buffer_pos_t vold, vnew = rx_buffer.head; + sw_barrier(); + do { + vold = vnew; + vnew = rx_buffer.head; + sw_barrier(); + } while (vold != vnew); + return vnew; + } + else { + // With an 8bit index, reads are always atomic. No need for special handling + return rx_buffer.head; + } +} + +template +volatile bool MarlinSerial::rx_tail_value_not_stable = false; +template +volatile uint16_t MarlinSerial::rx_tail_value_backup = 0; + +// Set RX tail index, taking into account the RX ISR could interrupt +// the write to this variable in the middle - So a backup strategy +// is used to ensure reads of the correct values. +// -Must NOT be called from the RX ISR - +template +FORCE_INLINE void MarlinSerial::atomic_set_rx_tail(typename MarlinSerial::ring_buffer_pos_t value) { + if (Cfg::RX_SIZE > 256) { + // Store the new value in the backup + rx_tail_value_backup = value; + sw_barrier(); + // Flag we are about to change the true value + rx_tail_value_not_stable = true; + sw_barrier(); + // Store the new value + rx_buffer.tail = value; + sw_barrier(); + // Signal the new value is completely stored into the value + rx_tail_value_not_stable = false; + sw_barrier(); + } + else + rx_buffer.tail = value; +} + +// Get the RX tail index, taking into account the read could be +// interrupting in the middle of the update of that index value +// -Called from the RX ISR - +template +FORCE_INLINE typename MarlinSerial::ring_buffer_pos_t MarlinSerial::atomic_read_rx_tail() { + if (Cfg::RX_SIZE > 256) { + // If the true index is being modified, return the backup value + if (rx_tail_value_not_stable) return rx_tail_value_backup; + } + // The true index is stable, return it + return rx_buffer.tail; +} + +// (called with RX interrupts disabled) +template +FORCE_INLINE void MarlinSerial::store_rxd_char() { + + static EmergencyParser::State emergency_state; // = EP_RESET + + // This must read the R_UCSRA register before reading the received byte to detect error causes + if (Cfg::DROPPED_RX && B_DOR && !++rx_dropped_bytes) --rx_dropped_bytes; + if (Cfg::RX_OVERRUNS && B_DOR && !++rx_buffer_overruns) --rx_buffer_overruns; + if (Cfg::RX_FRAMING_ERRORS && B_FE && !++rx_framing_errors) --rx_framing_errors; + + // Read the character from the USART + uint8_t c = R_UDR; + + #if ENABLED(DIRECT_STEPPING) + if (page_manager.maybe_store_rxd_char(c)) return; + #endif + + // Get the tail - Nothing can alter its value while this ISR is executing, but there's + // a chance that this ISR interrupted the main process while it was updating the index. + // The backup mechanism ensures the correct value is always returned. + const ring_buffer_pos_t t = atomic_read_rx_tail(); + + // Get the head pointer - This ISR is the only one that modifies its value, so it's safe to read here + ring_buffer_pos_t h = rx_buffer.head; + + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + + if (Cfg::MAX_RX_QUEUED) { + // Calculate count of bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Keep track of the maximum count of enqueued bytes + NOLESS(rx_max_enqueued, rx_count); + } + + if (Cfg::XONOFF) { + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + + // Bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (Cfg::RX_SIZE) / 8) { + + // At this point, definitely no TX interrupt was executing, since the TX ISR can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. + + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + while (!B_UDRE) { + + if (B_RXC) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Read the character from the USART + c = R_UDR; + + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + } + sw_barrier(); + } + + R_UDR = XOFF_CHAR; + + // Clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + B_TXC = 1; + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!B_UDRE) { + + if (B_RXC) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Read the character from the USART + c = R_UDR; + + if (Cfg::EMERGENCYPARSER) + emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! + } + } + } + + // Store the new head value - The main loop will retry until the value is stable + rx_buffer.head = h; +} + +// (called with TX irqs disabled) +template +FORCE_INLINE void MarlinSerial::_tx_udr_empty_irq() { + if (Cfg::TX_SIZE > 0) { + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; + + if (Cfg::XONOFF) { + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { + + // Send the character + R_UDR = XON_CHAR; + + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + B_TXC = 1; + + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + + // If nothing else to transmit, just disable TX interrupts. + if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + + return; + } + } + + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (Cfg::TX_SIZE - 1); + R_UDR = c; + tx_buffer.tail = t; + + // Clear the TXC bit (by writing a one to its bit location). + // Ensures flush() won't return until the bytes are actually written/ + B_TXC = 1; + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) B_UDRIE = 0; // (Non-atomic, could be reenabled by the main program, but eventually this will succeed) + } +} + +// Public Methods +template +void MarlinSerial::begin(const long baud) { + uint16_t baud_setting; + bool useU2X = true; + + #if F_CPU == 16000000UL && SERIAL_PORT == 0 + // Hard-coded 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) useU2X = false; + #endif + + R_UCSRA = 0; + if (useU2X) { + B_U2X = 1; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } + else + baud_setting = (F_CPU / 8 / baud - 1) / 2; + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + R_UBRRH = baud_setting >> 8; + R_UBRRL = baud_setting; + + B_RXEN = 1; + B_TXEN = 1; + B_RXCIE = 1; + if (Cfg::TX_SIZE > 0) B_UDRIE = 0; + _written = false; +} + +template +void MarlinSerial::end() { + B_RXEN = 0; + B_TXEN = 0; + B_RXCIE = 0; + B_UDRIE = 0; +} + +template +int MarlinSerial::peek() { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return h == t ? -1 : rx_buffer.buffer[t]; +} + +template +int MarlinSerial::read() { + const ring_buffer_pos_t h = atomic_read_rx_head(); + + // Read the tail. Main thread owns it, so it is safe to directly read it + ring_buffer_pos_t t = rx_buffer.tail; + + // If nothing to read, return now + if (h == t) return -1; + + // Get the next char + const int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1); + + // Advance tail - Making sure the RX ISR will always get an stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(t); + + if (Cfg::XONOFF) { + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + if (rx_count < (Cfg::RX_SIZE) / 10) { + if (Cfg::TX_SIZE > 0) { + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable them + B_UDRIE = 1; + } + else { + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!B_UDRE) sw_barrier(); + R_UDR = XON_CHAR; + } + } + } + } + + return v; +} + +template +typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() { + const ring_buffer_pos_t h = atomic_read_rx_head(), t = rx_buffer.tail; + return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1); +} + +template +void MarlinSerial::flush() { + + // Set the tail to the head: + // - Read the RX head index in a safe way. (See atomic_read_rx_head.) + // - Set the tail, making sure the RX ISR will always get a stable value, even + // if it interrupts the writing of the value of that variable in the middle. + atomic_set_rx_tail(atomic_read_rx_head()); + + if (Cfg::XONOFF) { + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + if (Cfg::TX_SIZE > 0) { + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX ISR. Non atomic, but it will eventually enable it. + B_UDRIE = 1; + } + else { + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!B_UDRE) sw_barrier(); + R_UDR = XON_CHAR; + } + } + } +} + +template +void MarlinSerial::write(const uint8_t c) { + if (Cfg::TX_SIZE == 0) { + + _written = true; + while (!B_UDRE) sw_barrier(); + R_UDR = c; + + } + else { + + _written = true; + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX ISR, but it is properly handled there + if (!B_UDRIE && B_UDRE) { + R_UDR = c; + + // clear the TXC bit -- "can be cleared by writing a one to its bit + // location". This makes sure flush() won't return until the bytes + // actually got written + B_TXC = 1; + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + + // If we can transmit another byte, do it. + if (B_UDRE) _tx_udr_empty_irq(); + + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } + } + else { + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) sw_barrier(); + } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX ISR - Non atomic, but it will eventually enable TX ISR + B_UDRIE = 1; + } +} + +template +void MarlinSerial::flushTX() { + + if (Cfg::TX_SIZE == 0) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // Wait until everything was transmitted + while (!B_TXC) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + + } + else { + + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !B_TXC) { + + // If there is more space, send an extra character + if (B_UDRE) _tx_udr_empty_irq(); + + sw_barrier(); + } + + } + else { + // Wait until everything was transmitted + while (tx_buffer.head != tx_buffer.tail || !B_TXC) sw_barrier(); + } + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } +} + +/** + * Imports from print.h + */ + +template +void MarlinSerial::print(char c, int base) { + print((long)c, base); +} + +template +void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); +} + +template +void MarlinSerial::print(int n, int base) { + print((long)n, base); +} + +template +void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); +} + +template +void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); +} + +template +void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); +} + +template +void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); +} + +template +void MarlinSerial::println() { + print('\r'); + print('\n'); +} + +template +void MarlinSerial::println(const String& s) { + print(s); + println(); +} + +template +void MarlinSerial::println(const char c[]) { + print(c); + println(); +} + +template +void MarlinSerial::println(char c, int base) { + print(c, base); + println(); +} + +template +void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); +} + +template +void MarlinSerial::println(int n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(long n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); +} + +// Private Methods + +template +void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); +} + +template +void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + LOOP_L_N(i, digits) rounding *= 0.1; + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } +} + +// Hookup ISR handlers +ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _RX_vect)) { + MarlinSerial>::store_rxd_char(); +} + +ISR(SERIAL_REGNAME(USART, SERIAL_PORT, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); +} + +// Preinstantiate +template class MarlinSerial>; + +// Instantiate +MarlinSerial> customizedSerial1; + +#ifdef SERIAL_PORT_2 + + // Hookup ISR handlers + ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART, SERIAL_PORT_2, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> customizedSerial2; + +#endif + +#ifdef MMU2_SERIAL_PORT + + ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART, MMU2_SERIAL_PORT, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> mmuSerial; + +#endif + +#ifdef LCD_SERIAL_PORT + + ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _RX_vect)) { + MarlinSerial>::store_rxd_char(); + } + + ISR(SERIAL_REGNAME(USART, LCD_SERIAL_PORT, _UDRE_vect)) { + MarlinSerial>::_tx_udr_empty_irq(); + } + + // Preinstantiate + template class MarlinSerial>; + + // Instantiate + MarlinSerial> lcdSerial; + + #if HAS_DGUS_LCD + template + typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { + const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send. + h = tx_buffer.head; // next pos for queue. + int ret = t - h - 1; + if (ret < 0) ret += Cfg::TX_SIZE + 1; + return ret; + } + #endif + +#endif + +#endif // !IS_AT90USB && (UBRRH || UBRR0H || UBRR1H || UBRR2H || UBRR3H) + +// For AT90USB targets use the UART for BT interfacing +#if BOTH(IS_AT90USB, BLUETOOTH) + HardwareSerial bluetoothSerial; +#endif + +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h new file mode 100644 index 00000000..3850e2a4 --- /dev/null +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -0,0 +1,332 @@ +/** + * 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 + +/** + * MarlinSerial.h - Hardware serial library for Wiring + * Copyright (c) 2006 Nicholas Zambetti. All right reserved. + * + * Modified 28 September 2010 by Mark Sproul + * Modified 14 February 2016 by Andreas Hardtung (added tx buffer) + * Modified 01 October 2017 by Eduardo José Tagle (added XON/XOFF) + * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances + */ + +#include + +#include "../../inc/MarlinConfigPre.h" + +#ifndef SERIAL_PORT + #define SERIAL_PORT 0 +#endif + +#ifndef USBCON + + // The presence of the UBRRH register is used to detect a UART. + #define UART_PRESENT(port) ((port == 0 && (defined(UBRRH) || defined(UBRR0H))) || \ + (port == 1 && defined(UBRR1H)) || (port == 2 && defined(UBRR2H)) || \ + (port == 3 && defined(UBRR3H))) + + // These are macros to build serial port register names for the selected SERIAL_PORT (C preprocessor + // requires two levels of indirection to expand macro values properly) + #define SERIAL_REGNAME(registerbase,number,suffix) _SERIAL_REGNAME(registerbase,number,suffix) + #if SERIAL_PORT == 0 && (!defined(UBRR0H) || !defined(UDR0)) // use un-numbered registers if necessary + #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##suffix + #else + #define _SERIAL_REGNAME(registerbase,number,suffix) registerbase##number##suffix + #endif + + // Registers used by MarlinSerial class (expanded depending on selected serial port) + + // Templated 8bit register (generic) + #define UART_REGISTER_DECL_BASE(registerbase, suffix) \ + template struct R_##registerbase##x##suffix {} + + // Templated 8bit register (specialization for each port) + #define UART_REGISTER_DECL(port, registerbase, suffix) \ + template<> struct R_##registerbase##x##suffix { \ + constexpr R_##registerbase##x##suffix(int) {} \ + FORCE_INLINE void operator=(uint8_t newVal) const { SERIAL_REGNAME(registerbase,port,suffix) = newVal; } \ + FORCE_INLINE operator uint8_t() const { return SERIAL_REGNAME(registerbase,port,suffix); } \ + } + + // Templated 1bit register (generic) + #define UART_BIT_DECL_BASE(registerbase, suffix, bit) \ + templatestruct B_##bit##x {} + + // Templated 1bit register (specialization for each port) + #define UART_BIT_DECL(port, registerbase, suffix, bit) \ + template<> struct B_##bit##x { \ + constexpr B_##bit##x(int) {} \ + FORCE_INLINE void operator=(int newVal) const { \ + if (newVal) \ + SBI(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); \ + else \ + CBI(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); \ + } \ + FORCE_INLINE operator bool() const { return TEST(SERIAL_REGNAME(registerbase,port,suffix),SERIAL_REGNAME(bit,port,)); } \ + } + + #define UART_DECL_BASE() \ + UART_REGISTER_DECL_BASE(UCSR,A);\ + UART_REGISTER_DECL_BASE(UDR,);\ + UART_REGISTER_DECL_BASE(UBRR,H);\ + UART_REGISTER_DECL_BASE(UBRR,L);\ + UART_BIT_DECL_BASE(UCSR,B,RXEN);\ + UART_BIT_DECL_BASE(UCSR,B,TXEN);\ + UART_BIT_DECL_BASE(UCSR,A,TXC);\ + UART_BIT_DECL_BASE(UCSR,B,RXCIE);\ + UART_BIT_DECL_BASE(UCSR,A,UDRE);\ + UART_BIT_DECL_BASE(UCSR,A,FE);\ + UART_BIT_DECL_BASE(UCSR,A,DOR);\ + UART_BIT_DECL_BASE(UCSR,B,UDRIE);\ + UART_BIT_DECL_BASE(UCSR,A,RXC);\ + UART_BIT_DECL_BASE(UCSR,A,U2X) + + #define UART_DECL(port) \ + UART_REGISTER_DECL(port,UCSR,A);\ + UART_REGISTER_DECL(port,UDR,);\ + UART_REGISTER_DECL(port,UBRR,H);\ + UART_REGISTER_DECL(port,UBRR,L);\ + UART_BIT_DECL(port,UCSR,B,RXEN);\ + UART_BIT_DECL(port,UCSR,B,TXEN);\ + UART_BIT_DECL(port,UCSR,A,TXC);\ + UART_BIT_DECL(port,UCSR,B,RXCIE);\ + UART_BIT_DECL(port,UCSR,A,UDRE);\ + UART_BIT_DECL(port,UCSR,A,FE);\ + UART_BIT_DECL(port,UCSR,A,DOR);\ + UART_BIT_DECL(port,UCSR,B,UDRIE);\ + UART_BIT_DECL(port,UCSR,A,RXC);\ + UART_BIT_DECL(port,UCSR,A,U2X) + + // Declare empty templates + UART_DECL_BASE(); + + // And all the specializations for each possible serial port + #if UART_PRESENT(0) + UART_DECL(0); + #endif + #if UART_PRESENT(1) + UART_DECL(1); + #endif + #if UART_PRESENT(2) + UART_DECL(2); + #endif + #if UART_PRESENT(3) + UART_DECL(3); + #endif + + #define DEC 10 + #define HEX 16 + #define OCT 8 + #define BIN 2 + #define BYTE 0 + + // Templated type selector + template struct TypeSelector { typedef T type;} ; + template struct TypeSelector { typedef F type; }; + + template + class MarlinSerial { + protected: + // Registers + static constexpr R_UCSRxA R_UCSRA = 0; + static constexpr R_UDRx R_UDR = 0; + static constexpr R_UBRRxH R_UBRRH = 0; + static constexpr R_UBRRxL R_UBRRL = 0; + + // Bits + static constexpr B_RXENx B_RXEN = 0; + static constexpr B_TXENx B_TXEN = 0; + static constexpr B_TXCx B_TXC = 0; + static constexpr B_RXCIEx B_RXCIE = 0; + static constexpr B_UDREx B_UDRE = 0; + static constexpr B_FEx B_FE = 0; + static constexpr B_DORx B_DOR = 0; + static constexpr B_UDRIEx B_UDRIE = 0; + static constexpr B_RXCx B_RXC = 0; + static constexpr B_U2Xx B_U2X = 0; + + // Base size of type on buffer size + typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t; + + struct ring_buffer_r { + volatile ring_buffer_pos_t head, tail; + unsigned char buffer[Cfg::RX_SIZE]; + }; + + struct ring_buffer_t { + volatile uint8_t head, tail; + unsigned char buffer[Cfg::TX_SIZE]; + }; + + static ring_buffer_r rx_buffer; + static ring_buffer_t tx_buffer; + static bool _written; + + static constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent + XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send + + // XON / XOFF character definitions + static constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; + static uint8_t xon_xoff_state, + rx_dropped_bytes, + rx_buffer_overruns, + rx_framing_errors; + static ring_buffer_pos_t rx_max_enqueued; + + static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_head(); + + static volatile bool rx_tail_value_not_stable; + static volatile uint16_t rx_tail_value_backup; + + static FORCE_INLINE void atomic_set_rx_tail(ring_buffer_pos_t value); + static FORCE_INLINE ring_buffer_pos_t atomic_read_rx_tail(); + + public: + + FORCE_INLINE static void store_rxd_char(); + FORCE_INLINE static void _tx_udr_empty_irq(); + + public: + MarlinSerial() {}; + static void begin(const long); + static void end(); + static int peek(); + static int read(); + static void flush(); + static ring_buffer_pos_t available(); + static void write(const uint8_t c); + static void flushTX(); + #if HAS_DGUS_LCD + static ring_buffer_pos_t get_tx_buffer_free(); + #endif + + static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } + + FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } + FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } + FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } + FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = BYTE); + static void print(unsigned char, int = BYTE); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = BYTE); + static void println(unsigned char, int = BYTE); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(); + operator bool() { return true; } + + private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); + }; + + template + struct MarlinSerialCfg { + static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = RX_BUFFER_SIZE; + static constexpr unsigned int TX_SIZE = TX_BUFFER_SIZE; + static constexpr bool XONOFF = ENABLED(SERIAL_XON_XOFF); + static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); + static constexpr bool DROPPED_RX = ENABLED(SERIAL_STATS_DROPPED_RX); + static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); + static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); + static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); + }; + extern MarlinSerial> customizedSerial1; + + #ifdef SERIAL_PORT_2 + + extern MarlinSerial> customizedSerial2; + + #endif + +#endif // !USBCON + +#ifdef MMU2_SERIAL_PORT + template + struct MMU2SerialCfg { + static constexpr int PORT = serial; + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = false; + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + static constexpr unsigned int RX_SIZE = 32; + static constexpr unsigned int TX_SIZE = 32; + static constexpr bool RX_OVERRUNS = false; + }; + + extern MarlinSerial> mmuSerial; +#endif + +#ifdef LCD_SERIAL_PORT + + template + struct LCDSerialCfg { + static constexpr int PORT = serial; + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + #if HAS_DGUS_LCD + static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; + static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; + static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); + #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + static constexpr unsigned int RX_SIZE = 64; + static constexpr unsigned int TX_SIZE = 128; + static constexpr bool RX_OVERRUNS = false; + #else + static constexpr unsigned int RX_SIZE = 64; + static constexpr unsigned int TX_SIZE = 128; + static constexpr bool RX_OVERRUNS = false + #endif + }; + + extern MarlinSerial> lcdSerial; + +#endif + +// Use the UART for Bluetooth in AT90USB configurations +#if BOTH(IS_AT90USB, BLUETOOTH) + extern HardwareSerial bluetoothSerial; +#endif diff --git a/Marlin/src/HAL/AVR/Servo.cpp b/Marlin/src/HAL/AVR/Servo.cpp new file mode 100644 index 00000000..526352b7 --- /dev/null +++ b/Marlin/src/HAL/AVR/Servo.cpp @@ -0,0 +1,216 @@ +/** + * 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 . + * + */ + +/** + * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + */ + +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include + +#include "../shared/servo.h" +#include "../shared/servo_private.h" + +static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + + +/************ static functions common to all instances ***********************/ + +static inline void handle_interrupts(timer16_Sequence_t timer, volatile uint16_t* TCNTn, volatile uint16_t* OCRnA) { + if (Channel[timer] < 0) + *TCNTn = 0; // channel set to -1 indicated that refresh interval completed so reset the timer + else { + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) + extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + } + + Channel[timer]++; // increment to the next channel + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + *OCRnA = *TCNTn + SERVO(timer, Channel[timer]).ticks; + if (SERVO(timer, Channel[timer]).Pin.isActive) // check if activated + extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high + } + else { + // finished all channels so wait for the refresh period to expire before starting over + if (((unsigned)*TCNTn) + 4 < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed + *OCRnA = (unsigned int)usToTicks(REFRESH_INTERVAL); + else + *OCRnA = *TCNTn + 4; // at least REFRESH_INTERVAL has elapsed + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +#ifndef WIRING // Wiring pre-defines signal handlers so don't define any if compiling for the Wiring platform + + // Interrupt handlers for Arduino + #ifdef _useTimer1 + SIGNAL(TIMER1_COMPA_vect) { handle_interrupts(_timer1, &TCNT1, &OCR1A); } + #endif + + #ifdef _useTimer3 + SIGNAL(TIMER3_COMPA_vect) { handle_interrupts(_timer3, &TCNT3, &OCR3A); } + #endif + + #ifdef _useTimer4 + SIGNAL(TIMER4_COMPA_vect) { handle_interrupts(_timer4, &TCNT4, &OCR4A); } + #endif + + #ifdef _useTimer5 + SIGNAL(TIMER5_COMPA_vect) { handle_interrupts(_timer5, &TCNT5, &OCR5A); } + #endif + +#else // WIRING + + // Interrupt handlers for Wiring + #ifdef _useTimer1 + void Timer1Service() { handle_interrupts(_timer1, &TCNT1, &OCR1A); } + #endif + #ifdef _useTimer3 + void Timer3Service() { handle_interrupts(_timer3, &TCNT3, &OCR3A); } + #endif + +#endif // WIRING + +/****************** end of static functions ******************************/ + +void initISR(timer16_Sequence_t timer) { + #ifdef _useTimer1 + if (timer == _timer1) { + TCCR1A = 0; // normal counting mode + TCCR1B = _BV(CS11); // set prescaler of 8 + TCNT1 = 0; // clear the timer count + #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) + SBI(TIFR, OCF1A); // clear any pending interrupts; + SBI(TIMSK, OCIE1A); // enable the output compare interrupt + #else + // here if not ATmega8 or ATmega128 + SBI(TIFR1, OCF1A); // clear any pending interrupts; + SBI(TIMSK1, OCIE1A); // enable the output compare interrupt + #endif + #ifdef WIRING + timerAttach(TIMER1OUTCOMPAREA_INT, Timer1Service); + #endif + } + #endif + + #ifdef _useTimer3 + if (timer == _timer3) { + TCCR3A = 0; // normal counting mode + TCCR3B = _BV(CS31); // set prescaler of 8 + TCNT3 = 0; // clear the timer count + #ifdef __AVR_ATmega128__ + SBI(TIFR, OCF3A); // clear any pending interrupts; + SBI(ETIMSK, OCIE3A); // enable the output compare interrupt + #else + SBI(TIFR3, OCF3A); // clear any pending interrupts; + SBI(TIMSK3, OCIE3A); // enable the output compare interrupt + #endif + #ifdef WIRING + timerAttach(TIMER3OUTCOMPAREA_INT, Timer3Service); // for Wiring platform only + #endif + } + #endif + + #ifdef _useTimer4 + if (timer == _timer4) { + TCCR4A = 0; // normal counting mode + TCCR4B = _BV(CS41); // set prescaler of 8 + TCNT4 = 0; // clear the timer count + TIFR4 = _BV(OCF4A); // clear any pending interrupts; + TIMSK4 = _BV(OCIE4A); // enable the output compare interrupt + } + #endif + + #ifdef _useTimer5 + if (timer == _timer5) { + TCCR5A = 0; // normal counting mode + TCCR5B = _BV(CS51); // set prescaler of 8 + TCNT5 = 0; // clear the timer count + TIFR5 = _BV(OCF5A); // clear any pending interrupts; + TIMSK5 = _BV(OCIE5A); // enable the output compare interrupt + } + #endif +} + +void finISR(timer16_Sequence_t timer) { + // Disable use of the given timer + #ifdef WIRING + if (timer == _timer1) { + CBI( + #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + TIMSK1 + #else + TIMSK + #endif + , OCIE1A); // disable timer 1 output compare interrupt + timerDetach(TIMER1OUTCOMPAREA_INT); + } + else if (timer == _timer3) { + CBI( + #if defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + TIMSK3 + #else + ETIMSK + #endif + , OCIE3A); // disable the timer3 output compare A interrupt + timerDetach(TIMER3OUTCOMPAREA_INT); + } + #else // !WIRING + // For arduino - in future: call here to a currently undefined function to reset the timer + UNUSED(timer); + #endif +} + +#endif // HAS_SERVOS + +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/ServoTimers.h b/Marlin/src/HAL/AVR/ServoTimers.h new file mode 100644 index 00000000..436b2814 --- /dev/null +++ b/Marlin/src/HAL/AVR/ServoTimers.h @@ -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 . + * + */ +#pragma once + +/** + * ServoTimers.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. 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 + */ + +/** + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 16 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many 16 bit timers are available. + */ + +/** + * AVR Only definitions + * -------------------- + */ + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays +#define SERVO_TIMER_PRESCALER 8 // timer prescaler + +// Say which 16 bit timers can be used and in what order +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + //#define _useTimer1 + #define _useTimer4 + #if NUM_SERVOS > SERVOS_PER_TIMER + #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 + #endif +#elif defined(__AVR_ATmega32U4__) + #define _useTimer3 +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) + #define _useTimer3 +#elif defined(__AVR_ATmega128__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega2561__) + #define _useTimer3 +#else + // everything else +#endif + +typedef enum { + #ifdef _useTimer1 + _timer1, + #endif + #ifdef _useTimer3 + _timer3, + #endif + #ifdef _useTimer4 + _timer4, + #endif + #ifdef _useTimer5 + _timer5, + #endif + _Nbr_16timers +} timer16_Sequence_t; diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp new file mode 100644 index 00000000..c7906985 --- /dev/null +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -0,0 +1,74 @@ +/** + * 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 . + * + */ +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) + +/** + * PersistentStore for Arduino-style EEPROM interface + * with implementations supplied by the framework. + */ + +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +bool PersistentStore::access_start() { 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 * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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); + 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; // always assume success for AVR's +} + +#endif // EEPROM_SETTINGS || SD_FIRMWARE_UPDATE +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h new file mode 100644 index 00000000..ae9a605a --- /dev/null +++ b/Marlin/src/HAL/AVR/endstop_interrupts.h @@ -0,0 +1,261 @@ +/** + * 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 + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate either an + * 'external interrupt' or a 'pin change interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +#include + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +/** + * Patch for pins_arduino.h (...\Arduino\hardware\arduino\avr\variants\mega\pins_arduino.h) + * + * These macros for the Arduino MEGA do not include the two connected pins on Port J (D14, D15). + * So we extend them here because these are the normal pins for Y_MIN and Y_MAX on RAMPS. + * There are more PCI-enabled processor pins on Port J, but they are not connected to Arduino MEGA. + */ +#if defined(ARDUINO_AVR_MEGA2560) || defined(ARDUINO_AVR_MEGA) + + #define digitalPinHasPCICR(p) (WITHIN(p, 10, 15) || WITHIN(p, 50, 53) || WITHIN(p, 62, 69)) + + #undef digitalPinToPCICR + #define digitalPinToPCICR(p) (digitalPinHasPCICR(p) ? (&PCICR) : nullptr) + + #undef digitalPinToPCICRbit + #define digitalPinToPCICRbit(p) (WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? 0 : \ + WITHIN(p, 14, 15) ? 1 : \ + WITHIN(p, 62, 69) ? 2 : \ + 0) + + #undef digitalPinToPCMSK + #define digitalPinToPCMSK(p) (WITHIN(p, 10, 13) || WITHIN(p, 50, 53) ? (&PCMSK0) : \ + WITHIN(p, 14, 15) ? (&PCMSK1) : \ + WITHIN(p, 62, 69) ? (&PCMSK2) : \ + nullptr) + + #undef digitalPinToPCMSKbit + #define digitalPinToPCMSKbit(p) (WITHIN(p, 10, 13) ? ((p) - 6) : \ + (p) == 14 || (p) == 51 ? 2 : \ + (p) == 15 || (p) == 52 ? 1 : \ + (p) == 50 ? 3 : \ + (p) == 53 ? 0 : \ + WITHIN(p, 62, 69) ? ((p) - 62) : \ + 0) + +#elif defined(__AVR_ATmega164A__) || defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324A__) || \ + defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega324PB__) || \ + defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284__) || \ + defined(__AVR_ATmega1284P__) + + #define digitalPinHasPCICR(p) WITHIN(p, 0, NUM_DIGITAL_PINS) + +#else + + #error "Unsupported AVR variant!" + +#endif + + +// Install Pin change interrupt for a pin. Can be called multiple times. +void pciSetup(const int8_t pin) { + if (digitalPinHasPCICR(pin)) { + SBI(*digitalPinToPCMSK(pin), digitalPinToPCMSKbit(pin)); // enable pin + SBI(PCIFR, digitalPinToPCICRbit(pin)); // clear any outstanding interrupt + SBI(PCICR, digitalPinToPCICRbit(pin)); // enable interrupt for the group + } +} + +// Handlers for pin change interrupts +#ifdef PCINT0_vect + ISR(PCINT0_vect) { endstop_ISR(); } +#endif + +#ifdef PCINT1_vect + ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); +#endif + +#ifdef PCINT2_vect + ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); +#endif + +#ifdef PCINT3_vect + ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); +#endif + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + #if HAS_X_MAX + #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(X_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(X_MAX_PIN), "X_MAX_PIN is not interrupt-capable"); + pciSetup(X_MAX_PIN); + #endif + #endif + #if HAS_X_MIN + #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(X_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(X_MIN_PIN), "X_MIN_PIN is not interrupt-capable"); + pciSetup(X_MIN_PIN); + #endif + #endif + #if HAS_Y_MAX + #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Y_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(Y_MAX_PIN), "Y_MAX_PIN is not interrupt-capable"); + pciSetup(Y_MAX_PIN); + #endif + #endif + #if HAS_Y_MIN + #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Y_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(Y_MIN_PIN), "Y_MIN_PIN is not interrupt-capable"); + pciSetup(Y_MIN_PIN); + #endif + #endif + #if HAS_Z_MAX + #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(Z_MAX_PIN), "Z_MAX_PIN is not interrupt-capable"); + pciSetup(Z_MAX_PIN); + #endif + #endif + #if HAS_Z_MIN + #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(Z_MIN_PIN), "Z_MIN_PIN is not interrupt-capable"); + pciSetup(Z_MIN_PIN); + #endif + #endif + #if HAS_X2_MAX + #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(X2_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(X2_MAX_PIN), "X2_MAX_PIN is not interrupt-capable"); + pciSetup(X2_MAX_PIN); + #endif + #endif + #if HAS_X2_MIN + #if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(X2_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(X2_MIN_PIN), "X2_MIN_PIN is not interrupt-capable"); + pciSetup(X2_MIN_PIN); + #endif + #endif + #if HAS_Y2_MAX + #if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Y2_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(Y2_MAX_PIN), "Y2_MAX_PIN is not interrupt-capable"); + pciSetup(Y2_MAX_PIN); + #endif + #endif + #if HAS_Y2_MIN + #if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Y2_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(Y2_MIN_PIN), "Y2_MIN_PIN is not interrupt-capable"); + pciSetup(Y2_MIN_PIN); + #endif + #endif + #if HAS_Z2_MAX + #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z2_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(Z2_MAX_PIN), "Z2_MAX_PIN is not interrupt-capable"); + pciSetup(Z2_MAX_PIN); + #endif + #endif + #if HAS_Z2_MIN + #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z2_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(Z2_MIN_PIN), "Z2_MIN_PIN is not interrupt-capable"); + pciSetup(Z2_MIN_PIN); + #endif + #endif + #if HAS_Z3_MAX + #if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z3_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(Z3_MAX_PIN), "Z3_MAX_PIN is not interrupt-capable"); + pciSetup(Z3_MAX_PIN); + #endif + #endif + #if HAS_Z3_MIN + #if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z3_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(Z3_MIN_PIN), "Z3_MIN_PIN is not interrupt-capable"); + pciSetup(Z3_MIN_PIN); + #endif + #endif + #if HAS_Z4_MAX + #if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z4_MAX_PIN); + #else + static_assert(digitalPinHasPCICR(Z4_MAX_PIN), "Z4_MAX_PIN is not interrupt-capable"); + pciSetup(Z4_MAX_PIN); + #endif + #endif + #if HAS_Z4_MIN + #if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z4_MIN_PIN); + #else + static_assert(digitalPinHasPCICR(Z4_MIN_PIN), "Z4_MIN_PIN is not interrupt-capable"); + pciSetup(Z4_MIN_PIN); + #endif + #endif + #if HAS_Z_MIN_PROBE_PIN + #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) + _ATTACH(Z_MIN_PROBE_PIN); + #else + static_assert(digitalPinHasPCICR(Z_MIN_PROBE_PIN), "Z_MIN_PROBE_PIN is not interrupt-capable"); + pciSetup(Z_MIN_PROBE_PIN); + #endif + #endif + + // If we arrive here without raising an assertion, each pin has either an EXT-interrupt or a PCI. +} diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp new file mode 100644 index 00000000..238c1124 --- /dev/null +++ b/Marlin/src/HAL/AVR/fast_pwm.cpp @@ -0,0 +1,282 @@ +/** + * 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 . + * + */ +#ifdef __AVR__ + +#include "../../inc/MarlinConfigPre.h" + +#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM + +#include "HAL.h" + +struct Timer { + volatile uint8_t* TCCRnQ[3]; // max 3 TCCR registers per timer + volatile uint16_t* OCRnQ[3]; // max 3 OCR registers per timer + volatile uint16_t* ICRn; // max 1 ICR register per timer + uint8_t n; // the timer number [0->5] + uint8_t q; // the timer output [0->2] (A->C) +}; + +/** + * get_pwm_timer + * Get the timer information and register of the provided pin. + * Return a Timer struct containing this information. + * Used by set_pwm_frequency, set_pwm_duty + */ +Timer get_pwm_timer(const pin_t pin) { + uint8_t q = 0; + switch (digitalPinToTimer(pin)) { + // Protect reserved timers (TIMER0 & TIMER1) + #ifdef TCCR0A + #if !AVR_AT90USB1286_FAMILY + case TIMER0A: + #endif + case TIMER0B: + #endif + #ifdef TCCR1A + case TIMER1A: case TIMER1B: + #endif + break; + #if defined(TCCR2) || defined(TCCR2A) + #ifdef TCCR2 + case TIMER2: { + Timer timer = { + /*TCCRnQ*/ { &TCCR2, nullptr, nullptr }, + /*OCRnQ*/ { (uint16_t*)&OCR2, nullptr, nullptr }, + /*ICRn*/ nullptr, + /*n, q*/ 2, 0 + }; + } + #elif defined(TCCR2A) + #if ENABLED(USE_OCR2A_AS_TOP) + case TIMER2A: break; // protect TIMER2A + case TIMER2B: { + Timer timer = { + /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr }, + /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, + /*ICRn*/ nullptr, + /*n, q*/ 2, 1 + }; + return timer; + } + #else + case TIMER2B: ++q; + case TIMER2A: { + Timer timer = { + /*TCCRnQ*/ { &TCCR2A, &TCCR2B, nullptr }, + /*OCRnQ*/ { (uint16_t*)&OCR2A, (uint16_t*)&OCR2B, nullptr }, + /*ICRn*/ nullptr, + 2, q + }; + return timer; + } + #endif + #endif + #endif + #ifdef OCR3C + case TIMER3C: ++q; + case TIMER3B: ++q; + case TIMER3A: { + Timer timer = { + /*TCCRnQ*/ { &TCCR3A, &TCCR3B, &TCCR3C }, + /*OCRnQ*/ { &OCR3A, &OCR3B, &OCR3C }, + /*ICRn*/ &ICR3, + /*n, q*/ 3, q + }; + return timer; + } + #elif defined(OCR3B) + case TIMER3B: ++q; + case TIMER3A: { + Timer timer = { + /*TCCRnQ*/ { &TCCR3A, &TCCR3B, nullptr }, + /*OCRnQ*/ { &OCR3A, &OCR3B, nullptr }, + /*ICRn*/ &ICR3, + /*n, q*/ 3, q + }; + return timer; + } + #endif + #ifdef TCCR4A + case TIMER4C: ++q; + case TIMER4B: ++q; + case TIMER4A: { + Timer timer = { + /*TCCRnQ*/ { &TCCR4A, &TCCR4B, &TCCR4C }, + /*OCRnQ*/ { &OCR4A, &OCR4B, &OCR4C }, + /*ICRn*/ &ICR4, + /*n, q*/ 4, q + }; + return timer; + } + #endif + #ifdef TCCR5A + case TIMER5C: ++q; + case TIMER5B: ++q; + case TIMER5A: { + Timer timer = { + /*TCCRnQ*/ { &TCCR5A, &TCCR5B, &TCCR5C }, + /*OCRnQ*/ { &OCR5A, &OCR5B, &OCR5C }, + /*ICRn*/ &ICR5, + /*n, q*/ 5, q + }; + return timer; + } + #endif + } + Timer timer = { + /*TCCRnQ*/ { nullptr, nullptr, nullptr }, + /*OCRnQ*/ { nullptr, nullptr, nullptr }, + /*ICRn*/ nullptr, + 0, 0 + }; + return timer; +} + +void set_pwm_frequency(const pin_t pin, int f_desired) { + Timer timer = get_pwm_timer(pin); + if (timer.n == 0) return; // Don't proceed if protected timer or not recognised + uint16_t size; + if (timer.n == 2) size = 255; else size = 65535; + + uint16_t res = 255; // resolution (TOP value) + uint8_t j = 0; // prescaler index + uint8_t wgm = 1; // waveform generation mode + + // Calculating the prescaler and resolution to use to achieve closest frequency + if (f_desired != 0) { + int f = (F_CPU) / (2 * 1024 * size) + 1; // Initialize frequency as lowest (non-zero) achievable + uint16_t prescaler[] = { 0, 1, 8, /*TIMER2 ONLY*/32, 64, /*TIMER2 ONLY*/128, 256, 1024 }; + + // loop over prescaler values + LOOP_S_L_N(i, 1, 8) { + uint16_t res_temp_fast = 255, res_temp_phase_correct = 255; + if (timer.n == 2) { + // No resolution calculation for TIMER2 unless enabled USE_OCR2A_AS_TOP + #if ENABLED(USE_OCR2A_AS_TOP) + const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired); + res_temp_fast = rtf - 1; + res_temp_phase_correct = rtf / 2; + #endif + } + else { + // Skip TIMER2 specific prescalers when not TIMER2 + if (i == 3 || i == 5) continue; + const uint16_t rtf = (F_CPU) / (prescaler[i] * f_desired); + res_temp_fast = rtf - 1; + res_temp_phase_correct = rtf / 2; + } + + LIMIT(res_temp_fast, 1U, size); + LIMIT(res_temp_phase_correct, 1U, size); + // Calculate frequencies of test prescaler and resolution values + const int f_temp_fast = (F_CPU) / (prescaler[i] * (1 + res_temp_fast)), + f_temp_phase_correct = (F_CPU) / (2 * prescaler[i] * res_temp_phase_correct), + f_diff = ABS(f - f_desired), + f_fast_diff = ABS(f_temp_fast - f_desired), + f_phase_diff = ABS(f_temp_phase_correct - f_desired); + + // If FAST values are closest to desired f + if (f_fast_diff < f_diff && f_fast_diff <= f_phase_diff) { + // Remember this combination + f = f_temp_fast; + res = res_temp_fast; + j = i; + // Set the Wave Generation Mode to FAST PWM + if (timer.n == 2) { + wgm = ( + #if ENABLED(USE_OCR2A_AS_TOP) + WGM2_FAST_PWM_OCR2A + #else + WGM2_FAST_PWM + #endif + ); + } + else wgm = WGM_FAST_PWM_ICRn; + } + // If PHASE CORRECT values are closes to desired f + else if (f_phase_diff < f_diff) { + f = f_temp_phase_correct; + res = res_temp_phase_correct; + j = i; + // Set the Wave Generation Mode to PWM PHASE CORRECT + if (timer.n == 2) { + wgm = ( + #if ENABLED(USE_OCR2A_AS_TOP) + WGM2_PWM_PC_OCR2A + #else + WGM2_PWM_PC + #endif + ); + } + else wgm = WGM_PWM_PC_ICRn; + } + } + } + _SET_WGMnQ(timer.TCCRnQ, wgm); + _SET_CSn(timer.TCCRnQ, j); + + if (timer.n == 2) { + #if ENABLED(USE_OCR2A_AS_TOP) + _SET_OCRnQ(timer.OCRnQ, 0, res); // Set OCR2A value (TOP) = res + #endif + } + else + _SET_ICRn(timer.ICRn, res); // Set ICRn value (TOP) = res +} + +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { + // If v is 0 or v_size (max), digitalWrite to LOW or HIGH. + // Note that digitalWrite also disables pwm output for us (sets COM bit to 0) + if (v == 0) + digitalWrite(pin, invert); + else if (v == v_size) + digitalWrite(pin, !invert); + else { + Timer timer = get_pwm_timer(pin); + if (timer.n == 0) return; // Don't proceed if protected timer or not recognised + // Set compare output mode to CLEAR -> SET or SET -> CLEAR (if inverted) + _SET_COMnQ(timer.TCCRnQ, (timer.q + #ifdef TCCR2 + + (timer.q == 2) // COM20 is on bit 4 of TCCR2, thus requires q + 1 in the macro + #endif + ), COM_CLEAR_SET + invert + ); + + uint16_t top; + if (timer.n == 2) { // if TIMER2 + top = ( + #if ENABLED(USE_OCR2A_AS_TOP) + *timer.OCRnQ[0] // top = OCR2A + #else + 255 // top = 0xFF (max) + #endif + ); + } + else + top = *timer.ICRn; // top = ICRn + + _SET_OCRnQ(timer.OCRnQ, timer.q, v * float(top) / float(v_size)); // Scale 8/16-bit v to top value + } +} + +#endif // NEEDS_HARDWARE_PWM +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/fastio.cpp b/Marlin/src/HAL/AVR/fastio.cpp new file mode 100644 index 00000000..b51d7f97 --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio.cpp @@ -0,0 +1,288 @@ +/** + * 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 . + * + */ + +/** + * Fast I/O for extended pins + */ + +#ifdef __AVR__ + +#include "fastio.h" + +#ifdef FASTIO_EXT_START + +#include "../shared/Marduino.h" + +#define _IS_EXT(P) WITHIN(P, FASTIO_EXT_START, FASTIO_EXT_END) + +void extDigitalWrite(const int8_t pin, const uint8_t state) { + #define _WCASE(N) case N: WRITE(N, state); break + switch (pin) { + default: digitalWrite(pin, state); + #if _IS_EXT(70) + _WCASE(70); + #endif + #if _IS_EXT(71) + _WCASE(71); + #endif + #if _IS_EXT(72) + _WCASE(72); + #endif + #if _IS_EXT(73) + _WCASE(73); + #endif + #if _IS_EXT(74) + _WCASE(74); + #endif + #if _IS_EXT(75) + _WCASE(75); + #endif + #if _IS_EXT(76) + _WCASE(76); + #endif + #if _IS_EXT(77) + _WCASE(77); + #endif + #if _IS_EXT(78) + _WCASE(78); + #endif + #if _IS_EXT(79) + _WCASE(79); + #endif + #if _IS_EXT(80) + _WCASE(80); + #endif + #if _IS_EXT(81) + _WCASE(81); + #endif + #if _IS_EXT(82) + _WCASE(82); + #endif + #if _IS_EXT(83) + _WCASE(83); + #endif + #if _IS_EXT(84) + _WCASE(84); + #endif + #if _IS_EXT(85) + _WCASE(85); + #endif + #if _IS_EXT(86) + _WCASE(86); + #endif + #if _IS_EXT(87) + _WCASE(87); + #endif + #if _IS_EXT(88) + _WCASE(88); + #endif + #if _IS_EXT(89) + _WCASE(89); + #endif + #if _IS_EXT(90) + _WCASE(90); + #endif + #if _IS_EXT(91) + _WCASE(91); + #endif + #if _IS_EXT(92) + _WCASE(92); + #endif + #if _IS_EXT(93) + _WCASE(93); + #endif + #if _IS_EXT(94) + _WCASE(94); + #endif + #if _IS_EXT(95) + _WCASE(95); + #endif + #if _IS_EXT(96) + _WCASE(96); + #endif + #if _IS_EXT(97) + _WCASE(97); + #endif + #if _IS_EXT(98) + _WCASE(98); + #endif + #if _IS_EXT(99) + _WCASE(99); + #endif + #if _IS_EXT(100) + _WCASE(100); + #endif + } +} + +uint8_t extDigitalRead(const int8_t pin) { + #define _RCASE(N) case N: return READ(N) + switch (pin) { + default: return digitalRead(pin); + #if _IS_EXT(70) + _RCASE(70); + #endif + #if _IS_EXT(71) + _RCASE(71); + #endif + #if _IS_EXT(72) + _RCASE(72); + #endif + #if _IS_EXT(73) + _RCASE(73); + #endif + #if _IS_EXT(74) + _RCASE(74); + #endif + #if _IS_EXT(75) + _RCASE(75); + #endif + #if _IS_EXT(76) + _RCASE(76); + #endif + #if _IS_EXT(77) + _RCASE(77); + #endif + #if _IS_EXT(78) + _RCASE(78); + #endif + #if _IS_EXT(79) + _RCASE(79); + #endif + #if _IS_EXT(80) + _RCASE(80); + #endif + #if _IS_EXT(81) + _RCASE(81); + #endif + #if _IS_EXT(82) + _RCASE(82); + #endif + #if _IS_EXT(83) + _RCASE(83); + #endif + #if _IS_EXT(84) + _RCASE(84); + #endif + #if _IS_EXT(85) + _RCASE(85); + #endif + #if _IS_EXT(86) + _RCASE(86); + #endif + #if _IS_EXT(87) + _RCASE(87); + #endif + #if _IS_EXT(88) + _RCASE(88); + #endif + #if _IS_EXT(89) + _RCASE(89); + #endif + #if _IS_EXT(90) + _RCASE(90); + #endif + #if _IS_EXT(91) + _RCASE(91); + #endif + #if _IS_EXT(92) + _RCASE(92); + #endif + #if _IS_EXT(93) + _RCASE(93); + #endif + #if _IS_EXT(94) + _RCASE(94); + #endif + #if _IS_EXT(95) + _RCASE(95); + #endif + #if _IS_EXT(96) + _RCASE(96); + #endif + #if _IS_EXT(97) + _RCASE(97); + #endif + #if _IS_EXT(98) + _RCASE(98); + #endif + #if _IS_EXT(99) + _RCASE(99); + #endif + #if _IS_EXT(100) + _RCASE(100); + #endif + } +} + +#if 0 +/** + * Set Timer 5 PWM frequency in Hz, from 3.8Hz up to ~16MHz + * with a minimum resolution of 100 steps. + * + * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse. + */ +uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb, const float dcc) { + float count = 0; + if (hz > 0 && (dca || dcb || dcc)) { + count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq. + uint16_t prescaler; // Range of 30.5Hz (65535) 64.5KHz (>31) + + if (count >= 255. * 256.) { prescaler = 1024; SET_CS(5, PRESCALER_1024); } + else if (count >= 255. * 64.) { prescaler = 256; SET_CS(5, PRESCALER_256); } + else if (count >= 255. * 8.) { prescaler = 64; SET_CS(5, PRESCALER_64); } + else if (count >= 255.) { prescaler = 8; SET_CS(5, PRESCALER_8); } + else { prescaler = 1; SET_CS(5, PRESCALER_1); } + + count /= float(prescaler); + const float pwm_top = round(count); // Get the rounded count + + ICR5 = (uint16_t)pwm_top - 1; // Subtract 1 for TOP + OCR5A = pwm_top * ABS(dca); // Update and scale DCs + OCR5B = pwm_top * ABS(dcb); + OCR5C = pwm_top * ABS(dcc); + _SET_COM(5, A, dca ? (dca < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); // Set compare modes + _SET_COM(5, B, dcb ? (dcb < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); + _SET_COM(5, C, dcc ? (dcc < 0 ? COM_SET_CLEAR : COM_CLEAR_SET) : COM_NORMAL); + + SET_WGM(5, FAST_PWM_ICRn); // Fast PWM with ICR5 as TOP + + //SERIAL_ECHOLNPGM("Timer 5 Settings:"); + //SERIAL_ECHOLNPAIR(" Prescaler=", prescaler); + //SERIAL_ECHOLNPAIR(" TOP=", ICR5); + //SERIAL_ECHOLNPAIR(" OCR5A=", OCR5A); + //SERIAL_ECHOLNPAIR(" OCR5B=", OCR5B); + //SERIAL_ECHOLNPAIR(" OCR5C=", OCR5C); + } + else { + // Restore the default for Timer 5 + SET_WGM(5, PWM_PC_8); // PWM 8-bit (Phase Correct) + SET_COMS(5, NORMAL, NORMAL, NORMAL); // Do nothing + SET_CS(5, PRESCALER_64); // 16MHz / 64 = 250KHz + OCR5A = OCR5B = OCR5C = 0; + } + return round(count); +} +#endif + +#endif // FASTIO_EXT_START +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h new file mode 100644 index 00000000..dd016346 --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio.h @@ -0,0 +1,373 @@ +/** + * 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 + +/** + * Fast I/O Routines for AVR + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#include + +#if defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1286P__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB646P__) || defined(__AVR_AT90USB647__) + #define AVR_AT90USB1286_FAMILY 1 +#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) + #define AVR_ATmega1284_FAMILY 1 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define AVR_ATmega2560_FAMILY 1 +#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + #define AVR_ATmega2561_FAMILY 1 +#elif defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) + #define AVR_ATmega328_FAMILY 1 +#endif + +/** + * Include Ports and Functions + */ +#if AVR_ATmega328_FAMILY + #include "fastio/fastio_168.h" +#elif AVR_ATmega1284_FAMILY + #include "fastio/fastio_644.h" +#elif AVR_ATmega2560_FAMILY + #include "fastio/fastio_1280.h" +#elif AVR_AT90USB1286_FAMILY + #include "fastio/fastio_AT90USB.h" +#elif AVR_ATmega2561_FAMILY + #include "fastio/fastio_1281.h" +#else + #error "No FastIO definition for the selected AVR Board." +#endif + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * 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) + +#define _WRITE_NC(IO,V) do{ \ + if (V) SBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ + else CBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ +}while(0) + +#define _WRITE_C(IO,V) do{ \ + uint8_t port_bits = DIO ## IO ## _WPORT; /* Get a mask from the current port bits */ \ + if (V) port_bits = ~port_bits; /* For setting bits, invert the mask */ \ + DIO ## IO ## _RPORT = port_bits & _BV(DIO ## IO ## _PIN); /* Atomically toggle the output port bits */ \ +}while(0) + +#define _WRITE(IO,V) do{ if (&(DIO ## IO ## _RPORT) < (uint8_t*)0x100) _WRITE_NC(IO,V); else _WRITE_C(IO,V); }while(0) + +#define _TOGGLE(IO) (DIO ## IO ## _RPORT = _BV(DIO ## IO ## _PIN)) + +#define _SET_INPUT(IO) CBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN) +#define _SET_OUTPUT(IO) SBI(DIO ## IO ## _DDR, DIO ## IO ## _PIN) + +#define _IS_INPUT(IO) !TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN) +#define _IS_OUTPUT(IO) TEST(DIO ## IO ## _DDR, DIO ## IO ## _PIN) + +// digitalRead/Write wrappers +#ifdef FASTIO_EXT_START + void extDigitalWrite(const int8_t pin, const uint8_t state); + uint8_t extDigitalRead(const int8_t pin); +#else + #define extDigitalWrite(IO,V) digitalWrite(IO,V) + #define extDigitalRead(IO) digitalRead(IO) +#endif + +#define READ(IO) _READ(IO) +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _WRITE(IO, HIGH); }while(0) +#define SET_INPUT_PULLDOWN SET_INPUT +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) +#define SET_PWM SET_OUTPUT + +#define IS_INPUT(IO) _IS_INPUT(IO) +#define IS_OUTPUT(IO) _IS_OUTPUT(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +/** + * Timer and Interrupt Control + */ + +// Waveform Generation Modes +enum WaveGenMode : char { + WGM_NORMAL, // 0 + WGM_PWM_PC_8, // 1 + WGM_PWM_PC_9, // 2 + WGM_PWM_PC_10, // 3 + WGM_CTC_OCRnA, // 4 COM OCnx + WGM_FAST_PWM_8, // 5 + WGM_FAST_PWM_9, // 6 + WGM_FAST_PWM_10, // 7 + WGM_PWM_PC_FC_ICRn, // 8 + WGM_PWM_PC_FC_OCRnA, // 9 COM OCnA + WGM_PWM_PC_ICRn, // 10 + WGM_PWM_PC_OCRnA, // 11 COM OCnA + WGM_CTC_ICRn, // 12 COM OCnx + WGM_reserved, // 13 + WGM_FAST_PWM_ICRn, // 14 COM OCnA + WGM_FAST_PWM_OCRnA // 15 COM OCnA +}; + +// Wavefore Generation Modes (Timer 2 only) +enum WaveGenMode2 : char { + WGM2_NORMAL, // 0 + WGM2_PWM_PC, // 1 + WGM2_CTC_OCR2A, // 2 + WGM2_FAST_PWM, // 3 + WGM2_reserved_1, // 4 + WGM2_PWM_PC_OCR2A, // 5 + WGM2_reserved_2, // 6 + WGM2_FAST_PWM_OCR2A, // 7 +}; + +// Compare Modes +enum CompareMode : char { + COM_NORMAL, // 0 + COM_TOGGLE, // 1 Non-PWM: OCnx ... Both PWM (WGM 9,11,14,15): OCnA only ... else NORMAL + COM_CLEAR_SET, // 2 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down + COM_SET_CLEAR // 3 Non-PWM: OCnx ... Fast PWM: OCnx/Bottom ... PF-FC: OCnx Up/Down +}; + +// Clock Sources +enum ClockSource : char { + CS_NONE, // 0 + CS_PRESCALER_1, // 1 + CS_PRESCALER_8, // 2 + CS_PRESCALER_64, // 3 + CS_PRESCALER_256, // 4 + CS_PRESCALER_1024, // 5 + CS_EXT_FALLING, // 6 + CS_EXT_RISING // 7 +}; + +// Clock Sources (Timer 2 only) +enum ClockSource2 : char { + CS2_NONE, // 0 + CS2_PRESCALER_1, // 1 + CS2_PRESCALER_8, // 2 + CS2_PRESCALER_32, // 3 + CS2_PRESCALER_64, // 4 + CS2_PRESCALER_128, // 5 + CS2_PRESCALER_256, // 6 + CS2_PRESCALER_1024 // 7 +}; + +// Get interrupt bits in an orderly way +// Ex: cs = GET_CS(0); coma1 = GET_COM(A,1); +#define GET_WGM(T) (((TCCR##T##A >> WGM##T##0) & 0x3) | ((TCCR##T##B >> WGM##T##2 << 2) & 0xC)) +#define GET_CS(T) ((TCCR##T##B >> CS##T##0) & 0x7) +#define GET_COM(T,Q) ((TCCR##T##Q >> COM##T##Q##0) & 0x3) +#define GET_COMA(T) GET_COM(T,A) +#define GET_COMB(T) GET_COM(T,B) +#define GET_COMC(T) GET_COM(T,C) +#define GET_ICNC(T) (!!(TCCR##T##B & _BV(ICNC##T))) +#define GET_ICES(T) (!!(TCCR##T##B & _BV(ICES##T))) +#define GET_FOC(T,Q) (!!(TCCR##T##C & _BV(FOC##T##Q))) +#define GET_FOCA(T) GET_FOC(T,A) +#define GET_FOCB(T) GET_FOC(T,B) +#define GET_FOCC(T) GET_FOC(T,C) + +// Set Wave Generation Mode bits +// Ex: SET_WGM(5,CTC_ICRn); +#define _SET_WGM(T,V) do{ \ + TCCR##T##A = (TCCR##T##A & ~(0x3 << WGM##T##0)) | (( int(V) & 0x3) << WGM##T##0); \ + TCCR##T##B = (TCCR##T##B & ~(0x3 << WGM##T##2)) | (((int(V) >> 2) & 0x3) << WGM##T##2); \ + }while(0) +#define SET_WGM(T,V) _SET_WGM(T,WGM_##V) +// Runtime (see set_pwm_frequency): +#define _SET_WGMnQ(TCCRnQ, V) do{ \ + *(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << 0)) | (( int(V) & 0x3) << 0); \ + *(TCCRnQ)[1] = (*(TCCRnQ)[1] & ~(0x3 << 3)) | (((int(V) >> 2) & 0x3) << 3); \ + }while(0) + +// Set Clock Select bits +// Ex: SET_CS3(PRESCALER_64); +#define _SET_CS(T,V) (TCCR##T##B = (TCCR##T##B & ~(0x7 << CS##T##0)) | ((int(V) & 0x7) << CS##T##0)) +#define _SET_CS0(V) _SET_CS(0,V) +#define _SET_CS1(V) _SET_CS(1,V) +#ifdef TCCR2 + #define _SET_CS2(V) (TCCR2 = (TCCR2 & ~(0x7 << CS20)) | (int(V) << CS20)) +#else + #define _SET_CS2(V) _SET_CS(2,V) +#endif +#define _SET_CS3(V) _SET_CS(3,V) +#define _SET_CS4(V) _SET_CS(4,V) +#define _SET_CS5(V) _SET_CS(5,V) +#define SET_CS0(V) _SET_CS0(CS_##V) +#define SET_CS1(V) _SET_CS1(CS_##V) +#ifdef TCCR2 + #define SET_CS2(V) _SET_CS2(CS2_##V) +#else + #define SET_CS2(V) _SET_CS2(CS_##V) +#endif +#define SET_CS3(V) _SET_CS3(CS_##V) +#define SET_CS4(V) _SET_CS4(CS_##V) +#define SET_CS5(V) _SET_CS5(CS_##V) +#define SET_CS(T,V) SET_CS##T(V) +// Runtime (see set_pwm_frequency) +#define _SET_CSn(TCCRnQ, V) do{ \ + (*(TCCRnQ)[1] = (*(TCCRnQ[1]) & ~(0x7 << 0)) | ((int(V) & 0x7) << 0)); \ + }while(0) + +// Set Compare Mode bits +// Ex: SET_COMS(4,CLEAR_SET,CLEAR_SET,CLEAR_SET); +#define _SET_COM(T,Q,V) (TCCR##T##Q = (TCCR##T##Q & ~(0x3 << COM##T##Q##0)) | (int(V) << COM##T##Q##0)) +#define SET_COM(T,Q,V) _SET_COM(T,Q,COM_##V) +#define SET_COMA(T,V) SET_COM(T,A,V) +#define SET_COMB(T,V) SET_COM(T,B,V) +#define SET_COMC(T,V) SET_COM(T,C,V) +#define SET_COMS(T,V1,V2,V3) do{ SET_COMA(T,V1); SET_COMB(T,V2); SET_COMC(T,V3); }while(0) +// Runtime (see set_pwm_duty) +#define _SET_COMnQ(TCCRnQ, Q, V) do{ \ + (*(TCCRnQ)[0] = (*(TCCRnQ)[0] & ~(0x3 << (6-2*(Q)))) | (int(V) << (6-2*(Q)))); \ + }while(0) + +// Set OCRnQ register +// Runtime (see set_pwm_duty): +#define _SET_OCRnQ(OCRnQ, Q, V) do{ \ + (*(OCRnQ)[(Q)] = (0x0000) | (int(V) & 0xFFFF)); \ + }while(0) + +// Set ICRn register (one per timer) +// Runtime (see set_pwm_frequency) +#define _SET_ICRn(ICRn, V) do{ \ + (*(ICRn) = (0x0000) | (int(V) & 0xFFFF)); \ + }while(0) + +// Set Noise Canceler bit +// Ex: SET_ICNC(2,1) +#define SET_ICNC(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICNC##T) : TCCR##T##B & ~_BV(ICNC##T)) + +// Set Input Capture Edge Select bit +// Ex: SET_ICES(5,0) +#define SET_ICES(T,V) (TCCR##T##B = (V) ? TCCR##T##B | _BV(ICES##T) : TCCR##T##B & ~_BV(ICES##T)) + +// Set Force Output Compare bit +// Ex: SET_FOC(3,A,1) +#define SET_FOC(T,Q,V) (TCCR##T##C = (V) ? TCCR##T##C | _BV(FOC##T##Q) : TCCR##T##C & ~_BV(FOC##T##Q)) +#define SET_FOCA(T,V) SET_FOC(T,A,V) +#define SET_FOCB(T,V) SET_FOC(T,B,V) +#define SET_FOCC(T,V) SET_FOC(T,C,V) + +#if 0 + +/** + * PWM availability macros + */ + +// Determine which harware PWMs are already in use +#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN) +#if PIN_EXISTS(CONTROLLER_FAN) + #define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN) +#else + #define PWM_CHK_FAN_B(P) _PWM_CHK_FAN_B(P) +#endif + +#if ANY_PIN(FAN, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7) + #if PIN_EXISTS(FAN7) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN || P == FAN7_PIN) + #elif PIN_EXISTS(FAN6) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN || P == FAN6_PIN) + #elif PIN_EXISTS(FAN5) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN || P == FAN5_PIN) + #elif PIN_EXISTS(FAN4) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN || P == FAN4_PIN) + #elif PIN_EXISTS(FAN3) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN || P == FAN3_PIN) + #elif PIN_EXISTS(FAN2) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN || P == FAN2_PIN) + #elif PIN_EXISTS(FAN1) + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN || P == FAN1_PIN) + #else + #define PWM_CHK_FAN_A(P) (P == FAN0_PIN) + #endif +#else + #define PWM_CHK_FAN_A(P) false +#endif + +#if HAS_MOTOR_CURRENT_PWM + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z || P == MOTOR_CURRENT_PWM_XY) + #elif PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E || P == MOTOR_CURRENT_PWM_Z) + #else + #define PWM_CHK_MOTOR_CURRENT(P) (P == MOTOR_CURRENT_PWM_E) + #endif +#else + #define PWM_CHK_MOTOR_CURRENT(P) false +#endif + +#ifdef NUM_SERVOS + #if AVR_ATmega2560_FAMILY + #define PWM_CHK_SERVO(P) (P == 5 || (NUM_SERVOS > 12 && P == 6) || (NUM_SERVOS > 24 && P == 46)) // PWMS 3A, 4A & 5A + #elif AVR_ATmega2561_FAMILY + #define PWM_CHK_SERVO(P) (P == 5) // PWM3A + #elif AVR_ATmega1284_FAMILY + #define PWM_CHK_SERVO(P) false + #elif AVR_AT90USB1286_FAMILY + #define PWM_CHK_SERVO(P) (P == 16) // PWM3A + #elif AVR_ATmega328_FAMILY + #define PWM_CHK_SERVO(P) false + #endif +#else + #define PWM_CHK_SERVO(P) false +#endif + +#if ENABLED(BARICUDA) + #if HAS_HEATER_1 && HAS_HEATER_2 + #define PWM_CHK_HEATER(P) (P == HEATER_1_PIN || P == HEATER_2_PIN) + #elif HAS_HEATER_1 + #define PWM_CHK_HEATER(P) (P == HEATER_1_PIN) + #endif +#else + #define PWM_CHK_HEATER(P) false +#endif + +#define PWM_CHK(P) (PWM_CHK_HEATER(P) || PWM_CHK_SERVO(P) || PWM_CHK_MOTOR_CURRENT(P) || PWM_CHK_FAN_A(P) || PWM_CHK_FAN_B(P)) + +#endif // PWM_CHK is not used in Marlin + +// define which hardware PWMs are available for the current CPU +// all timer 1 PWMS deleted from this list because they are never available +#if AVR_ATmega2560_FAMILY + #define PWM_PIN(P) ((P >= 2 && P <= 10) || P == 13 || P == 44 || P == 45 || P == 46) +#elif AVR_ATmega2561_FAMILY + #define PWM_PIN(P) ((P >= 2 && P <= 6) || P == 9) +#elif AVR_ATmega1284_FAMILY + #define PWM_PIN(P) (P == 3 || P == 4 || P == 14 || P == 15) +#elif AVR_AT90USB1286_FAMILY + #define PWM_PIN(P) (P == 0 || P == 1 || P == 14 || P == 15 || P == 16 || P == 24) +#elif AVR_ATmega328_FAMILY + #define PWM_PIN(P) (P == 3 || P == 5 || P == 6 || P == 11) +#else + #error "unknown CPU" +#endif diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1280.h b/Marlin/src/HAL/AVR/fastio/fastio_1280.h new file mode 100644 index 00000000..f482f823 --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio/fastio_1280.h @@ -0,0 +1,1114 @@ +/** + * 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 + +/** + * Pin mapping for the 1280 and 2560 + * + * Hardware Pin : 02 03 06 07 01 05 15 16 17 18 23 24 25 26 64 63 13 12 46 45 44 43 78 77 76 75 74 73 72 71 60 59 58 57 56 55 54 53 50 70 52 51 42 41 40 39 38 37 36 35 22 21 20 19 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 | 04 08 09 10 11 14 27 28 29 30 31 32 33 34 47 48 49 61 62 65 66 67 68 69 79 80 81 98 99 100 + * Port : E0 E1 E4 E5 G5 E3 H3 H4 H5 H6 B4 B5 B6 B7 J1 J0 H1 H0 D3 D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7 C7 C6 C5 C4 C3 C2 C1 C0 D7 G2 G1 G0 L7 L6 L5 L4 L3 L2 L1 L0 B3 B2 B1 B0 F0 F1 F2 F3 F4 F5 F6 F7 K0 K1 K2 K3 K4 K5 K6 K7 | E2 E6 E7 xx xx H2 H7 G3 G4 xx xx xx xx xx D4 D5 D6 xx xx J2 J3 J4 J5 J6 J7 xx xx xx xx xx + * Logical Pin : 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 78 79 80 xx xx 84 85 71 70 xx xx xx xx xx 81 82 83 xx xx 72 73 75 76 77 74 xx xx xx xx xx + */ + +#include "../fastio.h" + +// change for your board +#define DEBUG_LED DIO21 + +// UART +#define RXD DIO0 +#define TXD DIO1 + +// SPI +#define SCK DIO52 +#define MISO DIO50 +#define MOSI DIO51 +#define SS DIO53 + +// TWI (I2C) +#define SCL DIO21 +#define SDA DIO20 + +// Timers and PWM +#define OC0A DIO13 +#define OC0B DIO4 +#define OC1A DIO11 +#define OC1B DIO12 +#define OC2A DIO10 +#define OC2B DIO9 +#define OC3A DIO5 +#define OC3B DIO2 +#define OC3C DIO3 +#define OC4A DIO6 +#define OC4B DIO7 +#define OC4C DIO8 +#define OC5A DIO46 +#define OC5B DIO45 +#define OC5C DIO44 + +// Digital I/O + +#define DIO0_PIN PINE0 +#define DIO0_RPORT PINE +#define DIO0_WPORT PORTE +#define DIO0_DDR DDRE +#define DIO0_PWM nullptr + +#define DIO1_PIN PINE1 +#define DIO1_RPORT PINE +#define DIO1_WPORT PORTE +#define DIO1_DDR DDRE +#define DIO1_PWM nullptr + +#define DIO2_PIN PINE4 +#define DIO2_RPORT PINE +#define DIO2_WPORT PORTE +#define DIO2_DDR DDRE +#define DIO2_PWM &OCR3BL + +#define DIO3_PIN PINE5 +#define DIO3_RPORT PINE +#define DIO3_WPORT PORTE +#define DIO3_DDR DDRE +#define DIO3_PWM &OCR3CL + +#define DIO4_PIN PING5 +#define DIO4_RPORT PING +#define DIO4_WPORT PORTG +#define DIO4_DDR DDRG +#define DIO4_PWM &OCR0B + +#define DIO5_PIN PINE3 +#define DIO5_RPORT PINE +#define DIO5_WPORT PORTE +#define DIO5_DDR DDRE +#define DIO5_PWM &OCR3AL + +#define DIO6_PIN PINH3 +#define DIO6_RPORT PINH +#define DIO6_WPORT PORTH +#define DIO6_DDR DDRH +#define DIO6_PWM &OCR4AL + +#define DIO7_PIN PINH4 +#define DIO7_RPORT PINH +#define DIO7_WPORT PORTH +#define DIO7_DDR DDRH +#define DIO7_PWM &OCR4BL + +#define DIO8_PIN PINH5 +#define DIO8_RPORT PINH +#define DIO8_WPORT PORTH +#define DIO8_DDR DDRH +#define DIO8_PWM &OCR4CL + +#define DIO9_PIN PINH6 +#define DIO9_RPORT PINH +#define DIO9_WPORT PORTH +#define DIO9_DDR DDRH +#define DIO9_PWM &OCR2B + +#define DIO10_PIN PINB4 +#define DIO10_RPORT PINB +#define DIO10_WPORT PORTB +#define DIO10_DDR DDRB +#define DIO10_PWM &OCR2A + +#define DIO11_PIN PINB5 +#define DIO11_RPORT PINB +#define DIO11_WPORT PORTB +#define DIO11_DDR DDRB +#define DIO11_PWM nullptr + +#define DIO12_PIN PINB6 +#define DIO12_RPORT PINB +#define DIO12_WPORT PORTB +#define DIO12_DDR DDRB +#define DIO12_PWM nullptr + +#define DIO13_PIN PINB7 +#define DIO13_RPORT PINB +#define DIO13_WPORT PORTB +#define DIO13_DDR DDRB +#define DIO13_PWM &OCR0A + +#define DIO14_PIN PINJ1 +#define DIO14_RPORT PINJ +#define DIO14_WPORT PORTJ +#define DIO14_DDR DDRJ +#define DIO14_PWM nullptr + +#define DIO15_PIN PINJ0 +#define DIO15_RPORT PINJ +#define DIO15_WPORT PORTJ +#define DIO15_DDR DDRJ +#define DIO15_PWM nullptr + +#define DIO16_PIN PINH1 +#define DIO16_RPORT PINH +#define DIO16_WPORT PORTH +#define DIO16_DDR DDRH +#define DIO16_PWM nullptr + +#define DIO17_PIN PINH0 +#define DIO17_RPORT PINH +#define DIO17_WPORT PORTH +#define DIO17_DDR DDRH +#define DIO17_PWM nullptr + +#define DIO18_PIN PIND3 +#define DIO18_RPORT PIND +#define DIO18_WPORT PORTD +#define DIO18_DDR DDRD +#define DIO18_PWM nullptr + +#define DIO19_PIN PIND2 +#define DIO19_RPORT PIND +#define DIO19_WPORT PORTD +#define DIO19_DDR DDRD +#define DIO19_PWM nullptr + +#define DIO20_PIN PIND1 +#define DIO20_RPORT PIND +#define DIO20_WPORT PORTD +#define DIO20_DDR DDRD +#define DIO20_PWM nullptr + +#define DIO21_PIN PIND0 +#define DIO21_RPORT PIND +#define DIO21_WPORT PORTD +#define DIO21_DDR DDRD +#define DIO21_PWM nullptr + +#define DIO22_PIN PINA0 +#define DIO22_RPORT PINA +#define DIO22_WPORT PORTA +#define DIO22_DDR DDRA +#define DIO22_PWM nullptr + +#define DIO23_PIN PINA1 +#define DIO23_RPORT PINA +#define DIO23_WPORT PORTA +#define DIO23_DDR DDRA +#define DIO23_PWM nullptr + +#define DIO24_PIN PINA2 +#define DIO24_RPORT PINA +#define DIO24_WPORT PORTA +#define DIO24_DDR DDRA +#define DIO24_PWM nullptr + +#define DIO25_PIN PINA3 +#define DIO25_RPORT PINA +#define DIO25_WPORT PORTA +#define DIO25_DDR DDRA +#define DIO25_PWM nullptr + +#define DIO26_PIN PINA4 +#define DIO26_RPORT PINA +#define DIO26_WPORT PORTA +#define DIO26_DDR DDRA +#define DIO26_PWM nullptr + +#define DIO27_PIN PINA5 +#define DIO27_RPORT PINA +#define DIO27_WPORT PORTA +#define DIO27_DDR DDRA +#define DIO27_PWM nullptr + +#define DIO28_PIN PINA6 +#define DIO28_RPORT PINA +#define DIO28_WPORT PORTA +#define DIO28_DDR DDRA +#define DIO28_PWM nullptr + +#define DIO29_PIN PINA7 +#define DIO29_RPORT PINA +#define DIO29_WPORT PORTA +#define DIO29_DDR DDRA +#define DIO29_PWM nullptr + +#define DIO30_PIN PINC7 +#define DIO30_RPORT PINC +#define DIO30_WPORT PORTC +#define DIO30_DDR DDRC +#define DIO30_PWM nullptr + +#define DIO31_PIN PINC6 +#define DIO31_RPORT PINC +#define DIO31_WPORT PORTC +#define DIO31_DDR DDRC +#define DIO31_PWM nullptr + +#define DIO32_PIN PINC5 +#define DIO32_RPORT PINC +#define DIO32_WPORT PORTC +#define DIO32_DDR DDRC +#define DIO32_PWM nullptr + +#define DIO33_PIN PINC4 +#define DIO33_RPORT PINC +#define DIO33_WPORT PORTC +#define DIO33_DDR DDRC +#define DIO33_PWM nullptr + +#define DIO34_PIN PINC3 +#define DIO34_RPORT PINC +#define DIO34_WPORT PORTC +#define DIO34_DDR DDRC +#define DIO34_PWM nullptr + +#define DIO35_PIN PINC2 +#define DIO35_RPORT PINC +#define DIO35_WPORT PORTC +#define DIO35_DDR DDRC +#define DIO35_PWM nullptr + +#define DIO36_PIN PINC1 +#define DIO36_RPORT PINC +#define DIO36_WPORT PORTC +#define DIO36_DDR DDRC +#define DIO36_PWM nullptr + +#define DIO37_PIN PINC0 +#define DIO37_RPORT PINC +#define DIO37_WPORT PORTC +#define DIO37_DDR DDRC +#define DIO37_PWM nullptr + +#define DIO38_PIN PIND7 +#define DIO38_RPORT PIND +#define DIO38_WPORT PORTD +#define DIO38_DDR DDRD +#define DIO38_PWM nullptr + +#define DIO39_PIN PING2 +#define DIO39_RPORT PING +#define DIO39_WPORT PORTG +#define DIO39_DDR DDRG +#define DIO39_PWM nullptr + +#define DIO40_PIN PING1 +#define DIO40_RPORT PING +#define DIO40_WPORT PORTG +#define DIO40_DDR DDRG +#define DIO40_PWM nullptr + +#define DIO41_PIN PING0 +#define DIO41_RPORT PING +#define DIO41_WPORT PORTG +#define DIO41_DDR DDRG +#define DIO41_PWM nullptr + +#define DIO42_PIN PINL7 +#define DIO42_RPORT PINL +#define DIO42_WPORT PORTL +#define DIO42_DDR DDRL +#define DIO42_PWM nullptr + +#define DIO43_PIN PINL6 +#define DIO43_RPORT PINL +#define DIO43_WPORT PORTL +#define DIO43_DDR DDRL +#define DIO43_PWM nullptr + +#define DIO44_PIN PINL5 +#define DIO44_RPORT PINL +#define DIO44_WPORT PORTL +#define DIO44_DDR DDRL +#define DIO44_PWM &OCR5CL + +#define DIO45_PIN PINL4 +#define DIO45_RPORT PINL +#define DIO45_WPORT PORTL +#define DIO45_DDR DDRL +#define DIO45_PWM &OCR5BL + +#define DIO46_PIN PINL3 +#define DIO46_RPORT PINL +#define DIO46_WPORT PORTL +#define DIO46_DDR DDRL +#define DIO46_PWM &OCR5AL + +#define DIO47_PIN PINL2 +#define DIO47_RPORT PINL +#define DIO47_WPORT PORTL +#define DIO47_DDR DDRL +#define DIO47_PWM nullptr + +#define DIO48_PIN PINL1 +#define DIO48_RPORT PINL +#define DIO48_WPORT PORTL +#define DIO48_DDR DDRL +#define DIO48_PWM nullptr + +#define DIO49_PIN PINL0 +#define DIO49_RPORT PINL +#define DIO49_WPORT PORTL +#define DIO49_DDR DDRL +#define DIO49_PWM nullptr + +#define DIO50_PIN PINB3 +#define DIO50_RPORT PINB +#define DIO50_WPORT PORTB +#define DIO50_DDR DDRB +#define DIO50_PWM nullptr + +#define DIO51_PIN PINB2 +#define DIO51_RPORT PINB +#define DIO51_WPORT PORTB +#define DIO51_DDR DDRB +#define DIO51_PWM nullptr + +#define DIO52_PIN PINB1 +#define DIO52_RPORT PINB +#define DIO52_WPORT PORTB +#define DIO52_DDR DDRB +#define DIO52_PWM nullptr + +#define DIO53_PIN PINB0 +#define DIO53_RPORT PINB +#define DIO53_WPORT PORTB +#define DIO53_DDR DDRB +#define DIO53_PWM nullptr + +#define DIO54_PIN PINF0 +#define DIO54_RPORT PINF +#define DIO54_WPORT PORTF +#define DIO54_DDR DDRF +#define DIO54_PWM nullptr + +#define DIO55_PIN PINF1 +#define DIO55_RPORT PINF +#define DIO55_WPORT PORTF +#define DIO55_DDR DDRF +#define DIO55_PWM nullptr + +#define DIO56_PIN PINF2 +#define DIO56_RPORT PINF +#define DIO56_WPORT PORTF +#define DIO56_DDR DDRF +#define DIO56_PWM nullptr + +#define DIO57_PIN PINF3 +#define DIO57_RPORT PINF +#define DIO57_WPORT PORTF +#define DIO57_DDR DDRF +#define DIO57_PWM nullptr + +#define DIO58_PIN PINF4 +#define DIO58_RPORT PINF +#define DIO58_WPORT PORTF +#define DIO58_DDR DDRF +#define DIO58_PWM nullptr + +#define DIO59_PIN PINF5 +#define DIO59_RPORT PINF +#define DIO59_WPORT PORTF +#define DIO59_DDR DDRF +#define DIO59_PWM nullptr + +#define DIO60_PIN PINF6 +#define DIO60_RPORT PINF +#define DIO60_WPORT PORTF +#define DIO60_DDR DDRF +#define DIO60_PWM nullptr + +#define DIO61_PIN PINF7 +#define DIO61_RPORT PINF +#define DIO61_WPORT PORTF +#define DIO61_DDR DDRF +#define DIO61_PWM nullptr + +#define DIO62_PIN PINK0 +#define DIO62_RPORT PINK +#define DIO62_WPORT PORTK +#define DIO62_DDR DDRK +#define DIO62_PWM nullptr + +#define DIO63_PIN PINK1 +#define DIO63_RPORT PINK +#define DIO63_WPORT PORTK +#define DIO63_DDR DDRK +#define DIO63_PWM nullptr + +#define DIO64_PIN PINK2 +#define DIO64_RPORT PINK +#define DIO64_WPORT PORTK +#define DIO64_DDR DDRK +#define DIO64_PWM nullptr + +#define DIO65_PIN PINK3 +#define DIO65_RPORT PINK +#define DIO65_WPORT PORTK +#define DIO65_DDR DDRK +#define DIO65_PWM nullptr + +#define DIO66_PIN PINK4 +#define DIO66_RPORT PINK +#define DIO66_WPORT PORTK +#define DIO66_DDR DDRK +#define DIO66_PWM nullptr + +#define DIO67_PIN PINK5 +#define DIO67_RPORT PINK +#define DIO67_WPORT PORTK +#define DIO67_DDR DDRK +#define DIO67_PWM nullptr + +#define DIO68_PIN PINK6 +#define DIO68_RPORT PINK +#define DIO68_WPORT PORTK +#define DIO68_DDR DDRK +#define DIO68_PWM nullptr + +#define DIO69_PIN PINK7 +#define DIO69_RPORT PINK +#define DIO69_WPORT PORTK +#define DIO69_DDR DDRK +#define DIO69_PWM nullptr + +//#define FASTIO_EXT_START 70 +//#define FASTIO_EXT_END 85 + +#define DIO70_PIN PING4 +#define DIO70_RPORT PING +#define DIO70_WPORT PORTG +#define DIO70_DDR DDRG +#define DIO70_PWM nullptr + +#define DIO71_PIN PING3 +#define DIO71_RPORT PING +#define DIO71_WPORT PORTG +#define DIO71_DDR DDRG +#define DIO71_PWM nullptr + +#define DIO72_PIN PINJ2 +#define DIO72_RPORT PINJ +#define DIO72_WPORT PORTJ +#define DIO72_DDR DDRJ +#define DIO72_PWM nullptr + +#define DIO73_PIN PINJ3 +#define DIO73_RPORT PINJ +#define DIO73_WPORT PORTJ +#define DIO73_DDR DDRJ +#define DIO73_PWM nullptr + +#define DIO74_PIN PINJ7 +#define DIO74_RPORT PINJ +#define DIO74_WPORT PORTJ +#define DIO74_DDR DDRJ +#define DIO74_PWM nullptr + +#define DIO75_PIN PINJ4 +#define DIO75_RPORT PINJ +#define DIO75_WPORT PORTJ +#define DIO75_DDR DDRJ +#define DIO75_PWM nullptr + +#define DIO76_PIN PINJ5 +#define DIO76_RPORT PINJ +#define DIO76_WPORT PORTJ +#define DIO76_DDR DDRJ +#define DIO76_PWM nullptr + +#define DIO77_PIN PINJ6 +#define DIO77_RPORT PINJ +#define DIO77_WPORT PORTJ +#define DIO77_DDR DDRJ +#define DIO77_PWM nullptr + +#define DIO78_PIN PINE2 +#define DIO78_RPORT PINE +#define DIO78_WPORT PORTE +#define DIO78_DDR DDRE +#define DIO78_PWM nullptr + +#define DIO79_PIN PINE6 +#define DIO79_RPORT PINE +#define DIO79_WPORT PORTE +#define DIO79_DDR DDRE +#define DIO79_PWM nullptr + +#define DIO80_PIN PINE7 +#define DIO80_RPORT PINE +#define DIO80_WPORT PORTE +#define DIO80_DDR DDRE +#define DIO80_PWM nullptr + +#define DIO81_PIN PIND4 +#define DIO81_RPORT PIND +#define DIO81_WPORT PORTD +#define DIO81_DDR DDRD +#define DIO81_PWM nullptr + +#define DIO82_PIN PIND5 +#define DIO82_RPORT PIND +#define DIO82_WPORT PORTD +#define DIO82_DDR DDRD +#define DIO82_PWM nullptr + +#define DIO83_PIN PIND6 +#define DIO83_RPORT PIND +#define DIO83_WPORT PORTD +#define DIO83_DDR DDRD +#define DIO83_PWM nullptr + +#define DIO84_PIN PINH2 +#define DIO84_RPORT PINH +#define DIO84_WPORT PORTH +#define DIO84_DDR DDRH +#define DIO84_PWM nullptr + +#define DIO85_PIN PINH7 +#define DIO85_RPORT PINH +#define DIO85_WPORT PORTH +#define DIO85_DDR DDRH +#define DIO85_PWM nullptr + +#undef PA0 +#define PA0_PIN PINA0 +#define PA0_RPORT PINA +#define PA0_WPORT PORTA +#define PA0_DDR DDRA +#define PA0_PWM nullptr +#undef PA1 +#define PA1_PIN PINA1 +#define PA1_RPORT PINA +#define PA1_WPORT PORTA +#define PA1_DDR DDRA +#define PA1_PWM nullptr +#undef PA2 +#define PA2_PIN PINA2 +#define PA2_RPORT PINA +#define PA2_WPORT PORTA +#define PA2_DDR DDRA +#define PA2_PWM nullptr +#undef PA3 +#define PA3_PIN PINA3 +#define PA3_RPORT PINA +#define PA3_WPORT PORTA +#define PA3_DDR DDRA +#define PA3_PWM nullptr +#undef PA4 +#define PA4_PIN PINA4 +#define PA4_RPORT PINA +#define PA4_WPORT PORTA +#define PA4_DDR DDRA +#define PA4_PWM nullptr +#undef PA5 +#define PA5_PIN PINA5 +#define PA5_RPORT PINA +#define PA5_WPORT PORTA +#define PA5_DDR DDRA +#define PA5_PWM nullptr +#undef PA6 +#define PA6_PIN PINA6 +#define PA6_RPORT PINA +#define PA6_WPORT PORTA +#define PA6_DDR DDRA +#define PA6_PWM nullptr +#undef PA7 +#define PA7_PIN PINA7 +#define PA7_RPORT PINA +#define PA7_WPORT PORTA +#define PA7_DDR DDRA +#define PA7_PWM nullptr + +#undef PB0 +#define PB0_PIN PINB0 +#define PB0_RPORT PINB +#define PB0_WPORT PORTB +#define PB0_DDR DDRB +#define PB0_PWM nullptr +#undef PB1 +#define PB1_PIN PINB1 +#define PB1_RPORT PINB +#define PB1_WPORT PORTB +#define PB1_DDR DDRB +#define PB1_PWM nullptr +#undef PB2 +#define PB2_PIN PINB2 +#define PB2_RPORT PINB +#define PB2_WPORT PORTB +#define PB2_DDR DDRB +#define PB2_PWM nullptr +#undef PB3 +#define PB3_PIN PINB3 +#define PB3_RPORT PINB +#define PB3_WPORT PORTB +#define PB3_DDR DDRB +#define PB3_PWM nullptr +#undef PB4 +#define PB4_PIN PINB4 +#define PB4_RPORT PINB +#define PB4_WPORT PORTB +#define PB4_DDR DDRB +#define PB4_PWM &OCR2A +#undef PB5 +#define PB5_PIN PINB5 +#define PB5_RPORT PINB +#define PB5_WPORT PORTB +#define PB5_DDR DDRB +#define PB5_PWM nullptr +#undef PB6 +#define PB6_PIN PINB6 +#define PB6_RPORT PINB +#define PB6_WPORT PORTB +#define PB6_DDR DDRB +#define PB6_PWM nullptr +#undef PB7 +#define PB7_PIN PINB7 +#define PB7_RPORT PINB +#define PB7_WPORT PORTB +#define PB7_DDR DDRB +#define PB7_PWM &OCR0A + +#undef PC0 +#define PC0_PIN PINC0 +#define PC0_RPORT PINC +#define PC0_WPORT PORTC +#define PC0_DDR DDRC +#define PC0_PWM nullptr +#undef PC1 +#define PC1_PIN PINC1 +#define PC1_RPORT PINC +#define PC1_WPORT PORTC +#define PC1_DDR DDRC +#define PC1_PWM nullptr +#undef PC2 +#define PC2_PIN PINC2 +#define PC2_RPORT PINC +#define PC2_WPORT PORTC +#define PC2_DDR DDRC +#define PC2_PWM nullptr +#undef PC3 +#define PC3_PIN PINC3 +#define PC3_RPORT PINC +#define PC3_WPORT PORTC +#define PC3_DDR DDRC +#define PC3_PWM nullptr +#undef PC4 +#define PC4_PIN PINC4 +#define PC4_RPORT PINC +#define PC4_WPORT PORTC +#define PC4_DDR DDRC +#define PC4_PWM nullptr +#undef PC5 +#define PC5_PIN PINC5 +#define PC5_RPORT PINC +#define PC5_WPORT PORTC +#define PC5_DDR DDRC +#define PC5_PWM nullptr +#undef PC6 +#define PC6_PIN PINC6 +#define PC6_RPORT PINC +#define PC6_WPORT PORTC +#define PC6_DDR DDRC +#define PC6_PWM nullptr +#undef PC7 +#define PC7_PIN PINC7 +#define PC7_RPORT PINC +#define PC7_WPORT PORTC +#define PC7_DDR DDRC +#define PC7_PWM nullptr + +#undef PD0 +#define PD0_PIN PIND0 +#define PD0_RPORT PIND +#define PD0_WPORT PORTD +#define PD0_DDR DDRD +#define PD0_PWM nullptr +#undef PD1 +#define PD1_PIN PIND1 +#define PD1_RPORT PIND +#define PD1_WPORT PORTD +#define PD1_DDR DDRD +#define PD1_PWM nullptr +#undef PD2 +#define PD2_PIN PIND2 +#define PD2_RPORT PIND +#define PD2_WPORT PORTD +#define PD2_DDR DDRD +#define PD2_PWM nullptr +#undef PD3 +#define PD3_PIN PIND3 +#define PD3_RPORT PIND +#define PD3_WPORT PORTD +#define PD3_DDR DDRD +#define PD3_PWM nullptr +#undef PD4 +#define PD4_PIN PIND4 +#define PD4_RPORT PIND +#define PD4_WPORT PORTD +#define PD4_DDR DDRD +#define PD4_PWM nullptr +#undef PD5 +#define PD5_PIN PIND5 +#define PD5_RPORT PIND +#define PD5_WPORT PORTD +#define PD5_DDR DDRD +#define PD5_PWM nullptr +#undef PD6 +#define PD6_PIN PIND6 +#define PD6_RPORT PIND +#define PD6_WPORT PORTD +#define PD6_DDR DDRD +#define PD6_PWM nullptr +#undef PD7 +#define PD7_PIN PIND7 +#define PD7_RPORT PIND +#define PD7_WPORT PORTD +#define PD7_DDR DDRD +#define PD7_PWM nullptr + +#undef PE0 +#define PE0_PIN PINE0 +#define PE0_RPORT PINE +#define PE0_WPORT PORTE +#define PE0_DDR DDRE +#define PE0_PWM nullptr +#undef PE1 +#define PE1_PIN PINE1 +#define PE1_RPORT PINE +#define PE1_WPORT PORTE +#define PE1_DDR DDRE +#define PE1_PWM nullptr +#undef PE2 +#define PE2_PIN PINE2 +#define PE2_RPORT PINE +#define PE2_WPORT PORTE +#define PE2_DDR DDRE +#define PE2_PWM nullptr +#undef PE3 +#define PE3_PIN PINE3 +#define PE3_RPORT PINE +#define PE3_WPORT PORTE +#define PE3_DDR DDRE +#define PE3_PWM &OCR3AL +#undef PE4 +#define PE4_PIN PINE4 +#define PE4_RPORT PINE +#define PE4_WPORT PORTE +#define PE4_DDR DDRE +#define PE4_PWM &OCR3BL +#undef PE5 +#define PE5_PIN PINE5 +#define PE5_RPORT PINE +#define PE5_WPORT PORTE +#define PE5_DDR DDRE +#define PE5_PWM &OCR3CL +#undef PE6 +#define PE6_PIN PINE6 +#define PE6_RPORT PINE +#define PE6_WPORT PORTE +#define PE6_DDR DDRE +#define PE6_PWM nullptr +#undef PE7 +#define PE7_PIN PINE7 +#define PE7_RPORT PINE +#define PE7_WPORT PORTE +#define PE7_DDR DDRE +#define PE7_PWM nullptr + +#undef PF0 +#define PF0_PIN PINF0 +#define PF0_RPORT PINF +#define PF0_WPORT PORTF +#define PF0_DDR DDRF +#define PF0_PWM nullptr +#undef PF1 +#define PF1_PIN PINF1 +#define PF1_RPORT PINF +#define PF1_WPORT PORTF +#define PF1_DDR DDRF +#define PF1_PWM nullptr +#undef PF2 +#define PF2_PIN PINF2 +#define PF2_RPORT PINF +#define PF2_WPORT PORTF +#define PF2_DDR DDRF +#define PF2_PWM nullptr +#undef PF3 +#define PF3_PIN PINF3 +#define PF3_RPORT PINF +#define PF3_WPORT PORTF +#define PF3_DDR DDRF +#define PF3_PWM nullptr +#undef PF4 +#define PF4_PIN PINF4 +#define PF4_RPORT PINF +#define PF4_WPORT PORTF +#define PF4_DDR DDRF +#define PF4_PWM nullptr +#undef PF5 +#define PF5_PIN PINF5 +#define PF5_RPORT PINF +#define PF5_WPORT PORTF +#define PF5_DDR DDRF +#define PF5_PWM nullptr +#undef PF6 +#define PF6_PIN PINF6 +#define PF6_RPORT PINF +#define PF6_WPORT PORTF +#define PF6_DDR DDRF +#define PF6_PWM nullptr +#undef PF7 +#define PF7_PIN PINF7 +#define PF7_RPORT PINF +#define PF7_WPORT PORTF +#define PF7_DDR DDRF +#define PF7_PWM nullptr + +#undef PG0 +#define PG0_PIN PING0 +#define PG0_RPORT PING +#define PG0_WPORT PORTG +#define PG0_DDR DDRG +#define PG0_PWM nullptr +#undef PG1 +#define PG1_PIN PING1 +#define PG1_RPORT PING +#define PG1_WPORT PORTG +#define PG1_DDR DDRG +#define PG1_PWM nullptr +#undef PG2 +#define PG2_PIN PING2 +#define PG2_RPORT PING +#define PG2_WPORT PORTG +#define PG2_DDR DDRG +#define PG2_PWM nullptr +#undef PG3 +#define PG3_PIN PING3 +#define PG3_RPORT PING +#define PG3_WPORT PORTG +#define PG3_DDR DDRG +#define PG3_PWM nullptr +#undef PG4 +#define PG4_PIN PING4 +#define PG4_RPORT PING +#define PG4_WPORT PORTG +#define PG4_DDR DDRG +#define PG4_PWM nullptr +#undef PG5 +#define PG5_PIN PING5 +#define PG5_RPORT PING +#define PG5_WPORT PORTG +#define PG5_DDR DDRG +#define PG5_PWM &OCR0B + +#undef PH0 +#define PH0_PIN PINH0 +#define PH0_RPORT PINH +#define PH0_WPORT PORTH +#define PH0_DDR DDRH +#define PH0_PWM nullptr +#undef PH1 +#define PH1_PIN PINH1 +#define PH1_RPORT PINH +#define PH1_WPORT PORTH +#define PH1_DDR DDRH +#define PH1_PWM nullptr +#undef PH2 +#define PH2_PIN PINH2 +#define PH2_RPORT PINH +#define PH2_WPORT PORTH +#define PH2_DDR DDRH +#define PH2_PWM nullptr +#undef PH3 +#define PH3_PIN PINH3 +#define PH3_RPORT PINH +#define PH3_WPORT PORTH +#define PH3_DDR DDRH +#define PH3_PWM &OCR4AL +#undef PH4 +#define PH4_PIN PINH4 +#define PH4_RPORT PINH +#define PH4_WPORT PORTH +#define PH4_DDR DDRH +#define PH4_PWM &OCR4BL +#undef PH5 +#define PH5_PIN PINH5 +#define PH5_RPORT PINH +#define PH5_WPORT PORTH +#define PH5_DDR DDRH +#define PH5_PWM &OCR4CL +#undef PH6 +#define PH6_PIN PINH6 +#define PH6_RPORT PINH +#define PH6_WPORT PORTH +#define PH6_DDR DDRH +#define PH6_PWM &OCR2B +#undef PH7 +#define PH7_PIN PINH7 +#define PH7_RPORT PINH +#define PH7_WPORT PORTH +#define PH7_DDR DDRH +#define PH7_PWM nullptr + +#undef PJ0 +#define PJ0_PIN PINJ0 +#define PJ0_RPORT PINJ +#define PJ0_WPORT PORTJ +#define PJ0_DDR DDRJ +#define PJ0_PWM nullptr +#undef PJ1 +#define PJ1_PIN PINJ1 +#define PJ1_RPORT PINJ +#define PJ1_WPORT PORTJ +#define PJ1_DDR DDRJ +#define PJ1_PWM nullptr +#undef PJ2 +#define PJ2_PIN PINJ2 +#define PJ2_RPORT PINJ +#define PJ2_WPORT PORTJ +#define PJ2_DDR DDRJ +#define PJ2_PWM nullptr +#undef PJ3 +#define PJ3_PIN PINJ3 +#define PJ3_RPORT PINJ +#define PJ3_WPORT PORTJ +#define PJ3_DDR DDRJ +#define PJ3_PWM nullptr +#undef PJ4 +#define PJ4_PIN PINJ4 +#define PJ4_RPORT PINJ +#define PJ4_WPORT PORTJ +#define PJ4_DDR DDRJ +#define PJ4_PWM nullptr +#undef PJ5 +#define PJ5_PIN PINJ5 +#define PJ5_RPORT PINJ +#define PJ5_WPORT PORTJ +#define PJ5_DDR DDRJ +#define PJ5_PWM nullptr +#undef PJ6 +#define PJ6_PIN PINJ6 +#define PJ6_RPORT PINJ +#define PJ6_WPORT PORTJ +#define PJ6_DDR DDRJ +#define PJ6_PWM nullptr +#undef PJ7 +#define PJ7_PIN PINJ7 +#define PJ7_RPORT PINJ +#define PJ7_WPORT PORTJ +#define PJ7_DDR DDRJ +#define PJ7_PWM nullptr + +#undef PK0 +#define PK0_PIN PINK0 +#define PK0_RPORT PINK +#define PK0_WPORT PORTK +#define PK0_DDR DDRK +#define PK0_PWM nullptr +#undef PK1 +#define PK1_PIN PINK1 +#define PK1_RPORT PINK +#define PK1_WPORT PORTK +#define PK1_DDR DDRK +#define PK1_PWM nullptr +#undef PK2 +#define PK2_PIN PINK2 +#define PK2_RPORT PINK +#define PK2_WPORT PORTK +#define PK2_DDR DDRK +#define PK2_PWM nullptr +#undef PK3 +#define PK3_PIN PINK3 +#define PK3_RPORT PINK +#define PK3_WPORT PORTK +#define PK3_DDR DDRK +#define PK3_PWM nullptr +#undef PK4 +#define PK4_PIN PINK4 +#define PK4_RPORT PINK +#define PK4_WPORT PORTK +#define PK4_DDR DDRK +#define PK4_PWM nullptr +#undef PK5 +#define PK5_PIN PINK5 +#define PK5_RPORT PINK +#define PK5_WPORT PORTK +#define PK5_DDR DDRK +#define PK5_PWM nullptr +#undef PK6 +#define PK6_PIN PINK6 +#define PK6_RPORT PINK +#define PK6_WPORT PORTK +#define PK6_DDR DDRK +#define PK6_PWM nullptr +#undef PK7 +#define PK7_PIN PINK7 +#define PK7_RPORT PINK +#define PK7_WPORT PORTK +#define PK7_DDR DDRK +#define PK7_PWM nullptr + +#undef PL0 +#define PL0_PIN PINL0 +#define PL0_RPORT PINL +#define PL0_WPORT PORTL +#define PL0_DDR DDRL +#define PL0_PWM nullptr +#undef PL1 +#define PL1_PIN PINL1 +#define PL1_RPORT PINL +#define PL1_WPORT PORTL +#define PL1_DDR DDRL +#define PL1_PWM nullptr +#undef PL2 +#define PL2_PIN PINL2 +#define PL2_RPORT PINL +#define PL2_WPORT PORTL +#define PL2_DDR DDRL +#define PL2_PWM nullptr +#undef PL3 +#define PL3_PIN PINL3 +#define PL3_RPORT PINL +#define PL3_WPORT PORTL +#define PL3_DDR DDRL +#define PL3_PWM &OCR5AL +#undef PL4 +#define PL4_PIN PINL4 +#define PL4_RPORT PINL +#define PL4_WPORT PORTL +#define PL4_DDR DDRL +#define PL4_PWM &OCR5BL +#undef PL5 +#define PL5_PIN PINL5 +#define PL5_RPORT PINL +#define PL5_WPORT PORTL +#define PL5_DDR DDRL +#define PL5_PWM &OCR5CL +#undef PL6 +#define PL6_PIN PINL6 +#define PL6_RPORT PINL +#define PL6_WPORT PORTL +#define PL6_DDR DDRL +#define PL6_PWM nullptr +#undef PL7 +#define PL7_PIN PINL7 +#define PL7_RPORT PINL +#define PL7_WPORT PORTL +#define PL7_DDR DDRL +#define PL7_PWM nullptr diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1281.h b/Marlin/src/HAL/AVR/fastio/fastio_1281.h new file mode 100644 index 00000000..e0bc5e29 --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio/fastio_1281.h @@ -0,0 +1,715 @@ +/** + * 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 + +/** + * Pin mapping for the 1281 and 2561 + * + * Logical Pin: 38 39 40 41 42 43 44 45 16 10 11 12 06 07 08 09 30 31 32 33 34 35 36 37 17 18 19 20 21 22 23 24 00 01 13 05 02 03 14 15 46 47 48 49 50 51 52 53 25 26 27 28 29 04 + * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 G0 G1 G2 G3 G4 G5 + */ + +#include "../fastio.h" + +// change for your board +#define DEBUG_LED DIO46 + +// UART +#define RXD DIO0 +#define TXD DIO1 + +// SPI +#define SCK DIO10 +#define MISO DIO12 +#define MOSI DIO11 +#define SS DIO16 + +// TWI (I2C) +#define SCL DIO17 +#define SDA DIO18 + +// Timers and PWM +#define OC0A DIO9 +#define OC0B DIO4 +#define OC1A DIO7 +#define OC1B DIO8 +#define OC2A DIO6 +#define OC3A DIO5 +#define OC3B DIO2 +#define OC3C DIO3 + +// Digital I/O + +#define DIO0_PIN PINE0 +#define DIO0_RPORT PINE +#define DIO0_WPORT PORTE +#define DIO0_DDR DDRE +#define DIO0_PWM nullptr + +#define DIO1_PIN PINE1 +#define DIO1_RPORT PINE +#define DIO1_WPORT PORTE +#define DIO1_DDR DDRE +#define DIO1_PWM nullptr + +#define DIO2_PIN PINE4 +#define DIO2_RPORT PINE +#define DIO2_WPORT PORTE +#define DIO2_DDR DDRE +#define DIO2_PWM &OCR3BL + +#define DIO3_PIN PINE5 +#define DIO3_RPORT PINE +#define DIO3_WPORT PORTE +#define DIO3_DDR DDRE +#define DIO3_PWM &OCR3CL + +#define DIO4_PIN PING5 +#define DIO4_RPORT PING +#define DIO4_WPORT PORTG +#define DIO4_DDR DDRG +#define DIO4_PWM &OCR0B + +#define DIO5_PIN PINE3 +#define DIO5_RPORT PINE +#define DIO5_WPORT PORTE +#define DIO5_DDR DDRE +#define DIO5_PWM &OCR3AL + +#define DIO6_PIN PINB4 +#define DIO6_RPORT PINB +#define DIO6_WPORT PORTB +#define DIO6_DDR DDRB +#define DIO6_PWM &OCR2AL + +#define DIO7_PIN PINB5 +#define DIO7_RPORT PINB +#define DIO7_WPORT PORTB +#define DIO7_DDR DDRB +#define DIO7_PWM &OCR1AL + +#define DIO8_PIN PINB6 +#define DIO8_RPORT PINB +#define DIO8_WPORT PORTB +#define DIO8_DDR DDRB +#define DIO8_PWM &OCR1BL + +#define DIO9_PIN PINB7 +#define DIO9_RPORT PINB +#define DIO9_WPORT PORTB +#define DIO9_DDR DDRB +#define DIO9_PWM &OCR0AL + +#define DIO10_PIN PINB1 +#define DIO10_RPORT PINB +#define DIO10_WPORT PORTB +#define DIO10_DDR DDRB +#define DIO10_PWM nullptr + +#define DIO11_PIN PINB2 +#define DIO11_RPORT PINB +#define DIO11_WPORT PORTB +#define DIO11_DDR DDRB +#define DIO11_PWM nullptr + +#define DIO12_PIN PINB3 +#define DIO12_RPORT PINB +#define DIO12_WPORT PORTB +#define DIO12_DDR DDRB +#define DIO12_PWM nullptr + +#define DIO13_PIN PINE2 +#define DIO13_RPORT PINE +#define DIO13_WPORT PORTE +#define DIO13_DDR DDRE +#define DIO13_PWM nullptr + +#define DIO14_PIN PINE6 +#define DIO14_RPORT PINE +#define DIO14_WPORT PORTE +#define DIO14_DDR DDRE +#define DIO14_PWM nullptr + +#define DIO15_PIN PINE7 +#define DIO15_RPORT PINE +#define DIO15_WPORT PORTE +#define DIO15_DDR DDRE +#define DIO15_PWM nullptr + +#define DIO16_PIN PINB0 +#define DIO16_RPORT PINB +#define DIO16_WPORT PORTB +#define DIO16_DDR DDRB +#define DIO16_PWM nullptr + +#define DIO17_PIN PIND0 +#define DIO17_RPORT PIND +#define DIO17_WPORT PORTD +#define DIO17_DDR DDRD +#define DIO17_PWM nullptr + +#define DIO18_PIN PIND1 +#define DIO18_RPORT PIND +#define DIO18_WPORT PORTD +#define DIO18_DDR DDRD +#define DIO18_PWM nullptr + +#define DIO19_PIN PIND2 +#define DIO19_RPORT PIND +#define DIO19_WPORT PORTD +#define DIO19_DDR DDRD +#define DIO19_PWM nullptr + +#define DIO20_PIN PIND3 +#define DIO20_RPORT PIND +#define DIO20_WPORT PORTD +#define DIO20_DDR DDRD +#define DIO20_PWM nullptr + +#define DIO21_PIN PIND4 +#define DIO21_RPORT PIND +#define DIO21_WPORT PORTD +#define DIO21_DDR DDRD +#define DIO21_PWM nullptr + +#define DIO22_PIN PIND5 +#define DIO22_RPORT PIND +#define DIO22_WPORT PORTD +#define DIO22_DDR DDRD +#define DIO22_PWM nullptr + +#define DIO23_PIN PIND6 +#define DIO23_RPORT PIND +#define DIO23_WPORT PORTD +#define DIO23_DDR DDRD +#define DIO23_PWM nullptr + +#define DIO24_PIN PIND7 +#define DIO24_RPORT PIND +#define DIO24_WPORT PORTD +#define DIO24_DDR DDRD +#define DIO24_PWM nullptr + +#define DIO25_PIN PING0 +#define DIO25_RPORT PING +#define DIO25_WPORT PORTG +#define DIO25_DDR DDRG +#define DIO25_PWM nullptr + +#define DIO26_PIN PING1 +#define DIO26_RPORT PING +#define DIO26_WPORT PORTG +#define DIO26_DDR DDRG +#define DIO26_PWM nullptr + +#define DIO27_PIN PING2 +#define DIO27_RPORT PING +#define DIO27_WPORT PORTG +#define DIO27_DDR DDRG +#define DIO27_PWM nullptr + +#define DIO28_PIN PING3 +#define DIO28_RPORT PING +#define DIO28_WPORT PORTG +#define DIO28_DDR DDRG +#define DIO28_PWM nullptr + +#define DIO29_PIN PING4 +#define DIO29_RPORT PING +#define DIO29_WPORT PORTG +#define DIO29_DDR DDRG +#define DIO29_PWM nullptr + +#define DIO30_PIN PINC0 +#define DIO30_RPORT PINC +#define DIO30_WPORT PORTC +#define DIO30_DDR DDRC +#define DIO30_PWM nullptr + +#define DIO31_PIN PINC1 +#define DIO31_RPORT PINC +#define DIO31_WPORT PORTC +#define DIO31_DDR DDRC +#define DIO31_PWM nullptr + +#define DIO32_PIN PINC2 +#define DIO32_RPORT PINC +#define DIO32_WPORT PORTC +#define DIO32_DDR DDRC +#define DIO32_PWM nullptr + +#define DIO33_PIN PINC3 +#define DIO33_RPORT PINC +#define DIO33_WPORT PORTC +#define DIO33_DDR DDRC +#define DIO33_PWM nullptr + +#define DIO34_PIN PINC4 +#define DIO34_RPORT PINC +#define DIO34_WPORT PORTC +#define DIO34_DDR DDRC +#define DIO34_PWM nullptr + +#define DIO35_PIN PINC5 +#define DIO35_RPORT PINC +#define DIO35_WPORT PORTC +#define DIO35_DDR DDRC +#define DIO35_PWM nullptr + +#define DIO36_PIN PINC6 +#define DIO36_RPORT PINC +#define DIO36_WPORT PORTC +#define DIO36_DDR DDRC +#define DIO36_PWM nullptr + +#define DIO37_PIN PINC7 +#define DIO37_RPORT PINC +#define DIO37_WPORT PORTC +#define DIO37_DDR DDRC +#define DIO37_PWM nullptr + +#define DIO38_PIN PINA0 +#define DIO38_RPORT PINA +#define DIO38_WPORT PORTA +#define DIO38_DDR DDRA +#define DIO38_PWM nullptr + +#define DIO39_PIN PINA1 +#define DIO39_RPORT PINA +#define DIO39_WPORT PORTA +#define DIO39_DDR DDRA +#define DIO39_PWM nullptr + +#define DIO40_PIN PINA2 +#define DIO40_RPORT PINA +#define DIO40_WPORT PORTA +#define DIO40_DDR DDRA +#define DIO40_PWM nullptr + +#define DIO41_PIN PINA3 +#define DIO41_RPORT PINA +#define DIO41_WPORT PORTA +#define DIO41_DDR DDRA +#define DIO41_PWM nullptr + +#define DIO42_PIN PINA4 +#define DIO42_RPORT PINA +#define DIO42_WPORT PORTA +#define DIO42_DDR DDRA +#define DIO42_PWM nullptr + +#define DIO43_PIN PINA5 +#define DIO43_RPORT PINA +#define DIO43_WPORT PORTA +#define DIO43_DDR DDRA +#define DIO43_PWM nullptr + +#define DIO44_PIN PINA6 +#define DIO44_RPORT PINA +#define DIO44_WPORT PORTA +#define DIO44_DDR DDRA +#define DIO44_PWM nullptr + +#define DIO45_PIN PINA7 +#define DIO45_RPORT PINA +#define DIO45_WPORT PORTA +#define DIO45_DDR DDRA +#define DIO45_PWM nullptr + +#define DIO46_PIN PINF0 +#define DIO46_RPORT PINF +#define DIO46_WPORT PORTF +#define DIO46_DDR DDRF +#define DIO46_PWM nullptr + +#define DIO47_PIN PINF1 +#define DIO47_RPORT PINF +#define DIO47_WPORT PORTF +#define DIO47_DDR DDRF +#define DIO47_PWM nullptr + +#define DIO48_PIN PINF2 +#define DIO48_RPORT PINF +#define DIO48_WPORT PORTF +#define DIO48_DDR DDRF +#define DIO48_PWM nullptr + +#define DIO49_PIN PINF3 +#define DIO49_RPORT PINF +#define DIO49_WPORT PORTF +#define DIO49_DDR DDRF +#define DIO49_PWM nullptr + +#define DIO50_PIN PINF4 +#define DIO50_RPORT PINF +#define DIO50_WPORT PORTF +#define DIO50_DDR DDRF +#define DIO50_PWM nullptr + +#define DIO51_PIN PINF5 +#define DIO51_RPORT PINF +#define DIO51_WPORT PORTF +#define DIO51_DDR DDRF +#define DIO51_PWM nullptr + +#define DIO52_PIN PINF6 +#define DIO52_RPORT PINF +#define DIO52_WPORT PORTF +#define DIO52_DDR DDRF +#define DIO52_PWM nullptr + +#define DIO53_PIN PINF7 +#define DIO53_RPORT PINF +#define DIO53_WPORT PORTF +#define DIO53_DDR DDRF +#define DIO53_PWM nullptr + +#undef PA0 +#define PA0_PIN PINA0 +#define PA0_RPORT PINA +#define PA0_WPORT PORTA +#define PA0_DDR DDRA +#define PA0_PWM nullptr +#undef PA1 +#define PA1_PIN PINA1 +#define PA1_RPORT PINA +#define PA1_WPORT PORTA +#define PA1_DDR DDRA +#define PA1_PWM nullptr +#undef PA2 +#define PA2_PIN PINA2 +#define PA2_RPORT PINA +#define PA2_WPORT PORTA +#define PA2_DDR DDRA +#define PA2_PWM nullptr +#undef PA3 +#define PA3_PIN PINA3 +#define PA3_RPORT PINA +#define PA3_WPORT PORTA +#define PA3_DDR DDRA +#define PA3_PWM nullptr +#undef PA4 +#define PA4_PIN PINA4 +#define PA4_RPORT PINA +#define PA4_WPORT PORTA +#define PA4_DDR DDRA +#define PA4_PWM nullptr +#undef PA5 +#define PA5_PIN PINA5 +#define PA5_RPORT PINA +#define PA5_WPORT PORTA +#define PA5_DDR DDRA +#define PA5_PWM nullptr +#undef PA6 +#define PA6_PIN PINA6 +#define PA6_RPORT PINA +#define PA6_WPORT PORTA +#define PA6_DDR DDRA +#define PA6_PWM nullptr +#undef PA7 +#define PA7_PIN PINA7 +#define PA7_RPORT PINA +#define PA7_WPORT PORTA +#define PA7_DDR DDRA +#define PA7_PWM nullptr + +#undef PB0 +#define PB0_PIN PINB0 +#define PB0_RPORT PINB +#define PB0_WPORT PORTB +#define PB0_DDR DDRB +#define PB0_PWM nullptr +#undef PB1 +#define PB1_PIN PINB1 +#define PB1_RPORT PINB +#define PB1_WPORT PORTB +#define PB1_DDR DDRB +#define PB1_PWM nullptr +#undef PB2 +#define PB2_PIN PINB2 +#define PB2_RPORT PINB +#define PB2_WPORT PORTB +#define PB2_DDR DDRB +#define PB2_PWM nullptr +#undef PB3 +#define PB3_PIN PINB3 +#define PB3_RPORT PINB +#define PB3_WPORT PORTB +#define PB3_DDR DDRB +#define PB3_PWM nullptr +#undef PB4 +#define PB4_PIN PINB4 +#define PB4_RPORT PINB +#define PB4_WPORT PORTB +#define PB4_DDR DDRB +#define PB4_PWM &OCR2A +#undef PB5 +#define PB5_PIN PINB5 +#define PB5_RPORT PINB +#define PB5_WPORT PORTB +#define PB5_DDR DDRB +#define PB5_PWM nullptr +#undef PB6 +#define PB6_PIN PINB6 +#define PB6_RPORT PINB +#define PB6_WPORT PORTB +#define PB6_DDR DDRB +#define PB6_PWM nullptr +#undef PB7 +#define PB7_PIN PINB7 +#define PB7_RPORT PINB +#define PB7_WPORT PORTB +#define PB7_DDR DDRB +#define PB7_PWM &OCR0A + +#undef PC0 +#define PC0_PIN PINC0 +#define PC0_RPORT PINC +#define PC0_WPORT PORTC +#define PC0_DDR DDRC +#define PC0_PWM nullptr +#undef PC1 +#define PC1_PIN PINC1 +#define PC1_RPORT PINC +#define PC1_WPORT PORTC +#define PC1_DDR DDRC +#define PC1_PWM nullptr +#undef PC2 +#define PC2_PIN PINC2 +#define PC2_RPORT PINC +#define PC2_WPORT PORTC +#define PC2_DDR DDRC +#define PC2_PWM nullptr +#undef PC3 +#define PC3_PIN PINC3 +#define PC3_RPORT PINC +#define PC3_WPORT PORTC +#define PC3_DDR DDRC +#define PC3_PWM nullptr +#undef PC4 +#define PC4_PIN PINC4 +#define PC4_RPORT PINC +#define PC4_WPORT PORTC +#define PC4_DDR DDRC +#define PC4_PWM nullptr +#undef PC5 +#define PC5_PIN PINC5 +#define PC5_RPORT PINC +#define PC5_WPORT PORTC +#define PC5_DDR DDRC +#define PC5_PWM nullptr +#undef PC6 +#define PC6_PIN PINC6 +#define PC6_RPORT PINC +#define PC6_WPORT PORTC +#define PC6_DDR DDRC +#define PC6_PWM nullptr +#undef PC7 +#define PC7_PIN PINC7 +#define PC7_RPORT PINC +#define PC7_WPORT PORTC +#define PC7_DDR DDRC +#define PC7_PWM nullptr + +#undef PD0 +#define PD0_PIN PIND0 +#define PD0_RPORT PIND +#define PD0_WPORT PORTD +#define PD0_DDR DDRD +#define PD0_PWM nullptr +#undef PD1 +#define PD1_PIN PIND1 +#define PD1_RPORT PIND +#define PD1_WPORT PORTD +#define PD1_DDR DDRD +#define PD1_PWM nullptr +#undef PD2 +#define PD2_PIN PIND2 +#define PD2_RPORT PIND +#define PD2_WPORT PORTD +#define PD2_DDR DDRD +#define PD2_PWM nullptr +#undef PD3 +#define PD3_PIN PIND3 +#define PD3_RPORT PIND +#define PD3_WPORT PORTD +#define PD3_DDR DDRD +#define PD3_PWM nullptr +#undef PD4 +#define PD4_PIN PIND4 +#define PD4_RPORT PIND +#define PD4_WPORT PORTD +#define PD4_DDR DDRD +#define PD4_PWM nullptr +#undef PD5 +#define PD5_PIN PIND5 +#define PD5_RPORT PIND +#define PD5_WPORT PORTD +#define PD5_DDR DDRD +#define PD5_PWM nullptr +#undef PD6 +#define PD6_PIN PIND6 +#define PD6_RPORT PIND +#define PD6_WPORT PORTD +#define PD6_DDR DDRD +#define PD6_PWM nullptr +#undef PD7 +#define PD7_PIN PIND7 +#define PD7_RPORT PIND +#define PD7_WPORT PORTD +#define PD7_DDR DDRD +#define PD7_PWM nullptr + +#undef PE0 +#define PE0_PIN PINE0 +#define PE0_RPORT PINE +#define PE0_WPORT PORTE +#define PE0_DDR DDRE +#define PE0_PWM nullptr +#undef PE1 +#define PE1_PIN PINE1 +#define PE1_RPORT PINE +#define PE1_WPORT PORTE +#define PE1_DDR DDRE +#define PE1_PWM nullptr +#undef PE2 +#define PE2_PIN PINE2 +#define PE2_RPORT PINE +#define PE2_WPORT PORTE +#define PE2_DDR DDRE +#define PE2_PWM nullptr +#undef PE3 +#define PE3_PIN PINE3 +#define PE3_RPORT PINE +#define PE3_WPORT PORTE +#define PE3_DDR DDRE +#define PE3_PWM &OCR3AL +#undef PE4 +#define PE4_PIN PINE4 +#define PE4_RPORT PINE +#define PE4_WPORT PORTE +#define PE4_DDR DDRE +#define PE4_PWM &OCR3BL +#undef PE5 +#define PE5_PIN PINE5 +#define PE5_RPORT PINE +#define PE5_WPORT PORTE +#define PE5_DDR DDRE +#define PE5_PWM &OCR3CL +#undef PE6 +#define PE6_PIN PINE6 +#define PE6_RPORT PINE +#define PE6_WPORT PORTE +#define PE6_DDR DDRE +#define PE6_PWM nullptr +#undef PE7 +#define PE7_PIN PINE7 +#define PE7_RPORT PINE +#define PE7_WPORT PORTE +#define PE7_DDR DDRE +#define PE7_PWM nullptr + +#undef PF0 +#define PF0_PIN PINF0 +#define PF0_RPORT PINF +#define PF0_WPORT PORTF +#define PF0_DDR DDRF +#define PF0_PWM nullptr +#undef PF1 +#define PF1_PIN PINF1 +#define PF1_RPORT PINF +#define PF1_WPORT PORTF +#define PF1_DDR DDRF +#define PF1_PWM nullptr +#undef PF2 +#define PF2_PIN PINF2 +#define PF2_RPORT PINF +#define PF2_WPORT PORTF +#define PF2_DDR DDRF +#define PF2_PWM nullptr +#undef PF3 +#define PF3_PIN PINF3 +#define PF3_RPORT PINF +#define PF3_WPORT PORTF +#define PF3_DDR DDRF +#define PF3_PWM nullptr +#undef PF4 +#define PF4_PIN PINF4 +#define PF4_RPORT PINF +#define PF4_WPORT PORTF +#define PF4_DDR DDRF +#define PF4_PWM nullptr +#undef PF5 +#define PF5_PIN PINF5 +#define PF5_RPORT PINF +#define PF5_WPORT PORTF +#define PF5_DDR DDRF +#define PF5_PWM nullptr +#undef PF6 +#define PF6_PIN PINF6 +#define PF6_RPORT PINF +#define PF6_WPORT PORTF +#define PF6_DDR DDRF +#define PF6_PWM nullptr +#undef PF7 +#define PF7_PIN PINF7 +#define PF7_RPORT PINF +#define PF7_WPORT PORTF +#define PF7_DDR DDRF +#define PF7_PWM nullptr + +#undef PG0 +#define PG0_PIN PING0 +#define PG0_RPORT PING +#define PG0_WPORT PORTG +#define PG0_DDR DDRG +#define PG0_PWM nullptr +#undef PG1 +#define PG1_PIN PING1 +#define PG1_RPORT PING +#define PG1_WPORT PORTG +#define PG1_DDR DDRG +#define PG1_PWM nullptr +#undef PG2 +#define PG2_PIN PING2 +#define PG2_RPORT PING +#define PG2_WPORT PORTG +#define PG2_DDR DDRG +#define PG2_PWM nullptr +#undef PG3 +#define PG3_PIN PING3 +#define PG3_RPORT PING +#define PG3_WPORT PORTG +#define PG3_DDR DDRG +#define PG3_PWM nullptr +#undef PG4 +#define PG4_PIN PING4 +#define PG4_RPORT PING +#define PG4_WPORT PORTG +#define PG4_DDR DDRG +#define PG4_PWM nullptr +#undef PG5 +#define PG5_PIN PING5 +#define PG5_RPORT PING +#define PG5_WPORT PORTG +#define PG5_DDR DDRG +#define PG5_PWM &OCR0B diff --git a/Marlin/src/HAL/AVR/fastio/fastio_168.h b/Marlin/src/HAL/AVR/fastio/fastio_168.h new file mode 100644 index 00000000..8cfdd1e8 --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio/fastio_168.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 + +/** + * Pin mapping for the 168, 328, and 328P + * + * Logical Pin: 08 09 10 11 12 13 14 15 16 17 18 19 20 21 00 01 02 03 04 05 06 07 + * Port: B0 B1 B2 B3 B4 B5 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 + */ + +#include "../fastio.h" + +#define DEBUG_LED AIO5 + +// UART +#define RXD DIO0 +#define TXD DIO1 + +// SPI +#define SCK DIO13 +#define MISO DIO12 +#define MOSI DIO11 +#define SS DIO10 + +// TWI (I2C) +#define SCL AIO5 +#define SDA AIO4 + +// Timers and PWM +#define OC0A DIO6 +#define OC0B DIO5 +#define OC1A DIO9 +#define OC1B DIO10 +#define OC2A DIO11 +#define OC2B DIO3 + +// Digital I/O + +#define DIO0_PIN PIND0 +#define DIO0_RPORT PIND +#define DIO0_WPORT PORTD +#define DIO0_DDR DDRD +#define DIO0_PWM nullptr + +#define DIO1_PIN PIND1 +#define DIO1_RPORT PIND +#define DIO1_WPORT PORTD +#define DIO1_DDR DDRD +#define DIO1_PWM nullptr + +#define DIO2_PIN PIND2 +#define DIO2_RPORT PIND +#define DIO2_WPORT PORTD +#define DIO2_DDR DDRD +#define DIO2_PWM nullptr + +#define DIO3_PIN PIND3 +#define DIO3_RPORT PIND +#define DIO3_WPORT PORTD +#define DIO3_DDR DDRD +#define DIO3_PWM &OCR2B + +#define DIO4_PIN PIND4 +#define DIO4_RPORT PIND +#define DIO4_WPORT PORTD +#define DIO4_DDR DDRD +#define DIO4_PWM nullptr + +#define DIO5_PIN PIND5 +#define DIO5_RPORT PIND +#define DIO5_WPORT PORTD +#define DIO5_DDR DDRD +#define DIO5_PWM &OCR0B + +#define DIO6_PIN PIND6 +#define DIO6_RPORT PIND +#define DIO6_WPORT PORTD +#define DIO6_DDR DDRD +#define DIO6_PWM &OCR0A + +#define DIO7_PIN PIND7 +#define DIO7_RPORT PIND +#define DIO7_WPORT PORTD +#define DIO7_DDR DDRD +#define DIO7_PWM nullptr + +#define DIO8_PIN PINB0 +#define DIO8_RPORT PINB +#define DIO8_WPORT PORTB +#define DIO8_DDR DDRB +#define DIO8_PWM nullptr + +#define DIO9_PIN PINB1 +#define DIO9_RPORT PINB +#define DIO9_WPORT PORTB +#define DIO9_DDR DDRB +#define DIO9_PWM nullptr + +#define DIO10_PIN PINB2 +#define DIO10_RPORT PINB +#define DIO10_WPORT PORTB +#define DIO10_DDR DDRB +#define DIO10_PWM nullptr + +#define DIO11_PIN PINB3 +#define DIO11_RPORT PINB +#define DIO11_WPORT PORTB +#define DIO11_DDR DDRB +#define DIO11_PWM &OCR2A + +#define DIO12_PIN PINB4 +#define DIO12_RPORT PINB +#define DIO12_WPORT PORTB +#define DIO12_DDR DDRB +#define DIO12_PWM nullptr + +#define DIO13_PIN PINB5 +#define DIO13_RPORT PINB +#define DIO13_WPORT PORTB +#define DIO13_DDR DDRB +#define DIO13_PWM nullptr + +#define DIO14_PIN PINC0 +#define DIO14_RPORT PINC +#define DIO14_WPORT PORTC +#define DIO14_DDR DDRC +#define DIO14_PWM nullptr + +#define DIO15_PIN PINC1 +#define DIO15_RPORT PINC +#define DIO15_WPORT PORTC +#define DIO15_DDR DDRC +#define DIO15_PWM nullptr + +#define DIO16_PIN PINC2 +#define DIO16_RPORT PINC +#define DIO16_WPORT PORTC +#define DIO16_DDR DDRC +#define DIO16_PWM nullptr + +#define DIO17_PIN PINC3 +#define DIO17_RPORT PINC +#define DIO17_WPORT PORTC +#define DIO17_DDR DDRC +#define DIO17_PWM nullptr + +#define DIO18_PIN PINC4 +#define DIO18_RPORT PINC +#define DIO18_WPORT PORTC +#define DIO18_DDR DDRC +#define DIO18_PWM nullptr + +#define DIO19_PIN PINC5 +#define DIO19_RPORT PINC +#define DIO19_WPORT PORTC +#define DIO19_DDR DDRC +#define DIO19_PWM nullptr + +#define DIO20_PIN PINC6 +#define DIO20_RPORT PINC +#define DIO20_WPORT PORTC +#define DIO20_DDR DDRC +#define DIO20_PWM nullptr + +#define DIO21_PIN PINC7 +#define DIO21_RPORT PINC +#define DIO21_WPORT PORTC +#define DIO21_DDR DDRC +#define DIO21_PWM nullptr + +#undef PB0 +#define PB0_PIN PINB0 +#define PB0_RPORT PINB +#define PB0_WPORT PORTB +#define PB0_DDR DDRB +#define PB0_PWM nullptr + +#undef PB1 +#define PB1_PIN PINB1 +#define PB1_RPORT PINB +#define PB1_WPORT PORTB +#define PB1_DDR DDRB +#define PB1_PWM nullptr + +#undef PB2 +#define PB2_PIN PINB2 +#define PB2_RPORT PINB +#define PB2_WPORT PORTB +#define PB2_DDR DDRB +#define PB2_PWM nullptr + +#undef PB3 +#define PB3_PIN PINB3 +#define PB3_RPORT PINB +#define PB3_WPORT PORTB +#define PB3_DDR DDRB +#define PB3_PWM &OCR2A + +#undef PB4 +#define PB4_PIN PINB4 +#define PB4_RPORT PINB +#define PB4_WPORT PORTB +#define PB4_DDR DDRB +#define PB4_PWM nullptr + +#undef PB5 +#define PB5_PIN PINB5 +#define PB5_RPORT PINB +#define PB5_WPORT PORTB +#define PB5_DDR DDRB +#define PB5_PWM nullptr + +#undef PB6 +#define PB6_PIN PINB6 +#define PB6_RPORT PINB +#define PB6_WPORT PORTB +#define PB6_DDR DDRB +#define PB6_PWM nullptr + +#undef PB7 +#define PB7_PIN PINB7 +#define PB7_RPORT PINB +#define PB7_WPORT PORTB +#define PB7_DDR DDRB +#define PB7_PWM nullptr + +#undef PC0 +#define PC0_PIN PINC0 +#define PC0_RPORT PINC +#define PC0_WPORT PORTC +#define PC0_DDR DDRC +#define PC0_PWM nullptr + +#undef PC1 +#define PC1_PIN PINC1 +#define PC1_RPORT PINC +#define PC1_WPORT PORTC +#define PC1_DDR DDRC +#define PC1_PWM nullptr + +#undef PC2 +#define PC2_PIN PINC2 +#define PC2_RPORT PINC +#define PC2_WPORT PORTC +#define PC2_DDR DDRC +#define PC2_PWM nullptr + +#undef PC3 +#define PC3_PIN PINC3 +#define PC3_RPORT PINC +#define PC3_WPORT PORTC +#define PC3_DDR DDRC +#define PC3_PWM nullptr + +#undef PC4 +#define PC4_PIN PINC4 +#define PC4_RPORT PINC +#define PC4_WPORT PORTC +#define PC4_DDR DDRC +#define PC4_PWM nullptr + +#undef PC5 +#define PC5_PIN PINC5 +#define PC5_RPORT PINC +#define PC5_WPORT PORTC +#define PC5_DDR DDRC +#define PC5_PWM nullptr + +#undef PC6 +#define PC6_PIN PINC6 +#define PC6_RPORT PINC +#define PC6_WPORT PORTC +#define PC6_DDR DDRC +#define PC6_PWM nullptr + +#undef PC7 +#define PC7_PIN PINC7 +#define PC7_RPORT PINC +#define PC7_WPORT PORTC +#define PC7_DDR DDRC +#define PC7_PWM nullptr + +#undef PD0 +#define PD0_PIN PIND0 +#define PD0_RPORT PIND +#define PD0_WPORT PORTD +#define PD0_DDR DDRD +#define PD0_PWM nullptr + +#undef PD1 +#define PD1_PIN PIND1 +#define PD1_RPORT PIND +#define PD1_WPORT PORTD +#define PD1_DDR DDRD +#define PD1_PWM nullptr + +#undef PD2 +#define PD2_PIN PIND2 +#define PD2_RPORT PIND +#define PD2_WPORT PORTD +#define PD2_DDR DDRD +#define PD2_PWM nullptr + +#undef PD3 +#define PD3_PIN PIND3 +#define PD3_RPORT PIND +#define PD3_WPORT PORTD +#define PD3_DDR DDRD +#define PD3_PWM &OCR2B + +#undef PD4 +#define PD4_PIN PIND4 +#define PD4_RPORT PIND +#define PD4_WPORT PORTD +#define PD4_DDR DDRD +#define PD4_PWM nullptr + +#undef PD5 +#define PD5_PIN PIND5 +#define PD5_RPORT PIND +#define PD5_WPORT PORTD +#define PD5_DDR DDRD +#define PD5_PWM &OCR0B + +#undef PD6 +#define PD6_PIN PIND6 +#define PD6_RPORT PIND +#define PD6_WPORT PORTD +#define PD6_DDR DDRD +#define PD6_PWM &OCR0A + +#undef PD7 +#define PD7_PIN PIND7 +#define PD7_RPORT PIND +#define PD7_WPORT PORTD +#define PD7_DDR DDRD +#define PD7_PWM nullptr diff --git a/Marlin/src/HAL/AVR/fastio/fastio_644.h b/Marlin/src/HAL/AVR/fastio/fastio_644.h new file mode 100644 index 00000000..f4a9427e --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio/fastio_644.h @@ -0,0 +1,552 @@ +/** + * 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 + +/** + * Pin mapping for the 644, 644p, 644pa, and 1284p + * + * Logical Pin: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 + * Port: B0 B1 B2 B3 B4 B5 B6 B7 D0 D1 D2 D3 D4 D5 D6 D7 C0 C1 C2 C3 C4 C5 C6 C7 A7 A6 A5 A4 A3 A2 A1 A0 + */ + +/** ATMega644 + * + * +---\/---+ + * (D 0) PB0 1| |40 PA0 (AI 0 / D31) + * (D 1) PB1 2| |39 PA1 (AI 1 / D30) + * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) + * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) + * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) + * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) + * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) + * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) + * RST 9| |32 AREF + * VCC 10| |31 GND + * GND 11| |30 AVCC + * XTAL2 12| |29 PC7 (D 23) + * XTAL1 13| |28 PC6 (D 22) + * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI + * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO + * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS + * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK + * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA + * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL + * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM + * +--------+ + */ + +#include "../fastio.h" + +#define DEBUG_LED DIO0 + +// UART +#define RXD DIO8 +#define TXD DIO9 +#define RXD0 DIO8 +#define TXD0 DIO9 + +#define RXD1 DIO10 +#define TXD1 DIO11 + +// SPI +#define SCK DIO7 +#define MISO DIO6 +#define MOSI DIO5 +#define SS DIO4 + +// TWI (I2C) +#define SCL DIO16 +#define SDA DIO17 + +// Timers and PWM +#define OC0A DIO3 +#define OC0B DIO4 +#define OC1A DIO13 +#define OC1B DIO12 +#define OC2A DIO15 +#define OC2B DIO14 + +// Digital I/O + +#define DIO0_PIN PINB0 +#define DIO0_RPORT PINB +#define DIO0_WPORT PORTB +#define DIO0_DDR DDRB +#define DIO0_PWM nullptr + +#define DIO1_PIN PINB1 +#define DIO1_RPORT PINB +#define DIO1_WPORT PORTB +#define DIO1_DDR DDRB +#define DIO1_PWM nullptr + +#define DIO2_PIN PINB2 +#define DIO2_RPORT PINB +#define DIO2_WPORT PORTB +#define DIO2_DDR DDRB +#define DIO2_PWM nullptr + +#define DIO3_PIN PINB3 +#define DIO3_RPORT PINB +#define DIO3_WPORT PORTB +#define DIO3_DDR DDRB +#define DIO3_PWM &OCR0A + +#define DIO4_PIN PINB4 +#define DIO4_RPORT PINB +#define DIO4_WPORT PORTB +#define DIO4_DDR DDRB +#define DIO4_PWM &OCR0B + +#define DIO5_PIN PINB5 +#define DIO5_RPORT PINB +#define DIO5_WPORT PORTB +#define DIO5_DDR DDRB +#define DIO5_PWM nullptr + +#define DIO6_PIN PINB6 +#define DIO6_RPORT PINB +#define DIO6_WPORT PORTB +#define DIO6_DDR DDRB +#define DIO6_PWM nullptr + +#define DIO7_PIN PINB7 +#define DIO7_RPORT PINB +#define DIO7_WPORT PORTB +#define DIO7_DDR DDRB +#define DIO7_PWM nullptr + +#define DIO8_PIN PIND0 +#define DIO8_RPORT PIND +#define DIO8_WPORT PORTD +#define DIO8_DDR DDRD +#define DIO8_PWM nullptr + +#define DIO9_PIN PIND1 +#define DIO9_RPORT PIND +#define DIO9_WPORT PORTD +#define DIO9_DDR DDRD +#define DIO9_PWM nullptr + +#define DIO10_PIN PIND2 +#define DIO10_RPORT PIND +#define DIO10_WPORT PORTD +#define DIO10_DDR DDRD +#define DIO10_PWM nullptr + +#define DIO11_PIN PIND3 +#define DIO11_RPORT PIND +#define DIO11_WPORT PORTD +#define DIO11_DDR DDRD +#define DIO11_PWM nullptr + +#define DIO12_PIN PIND4 +#define DIO12_RPORT PIND +#define DIO12_WPORT PORTD +#define DIO12_DDR DDRD +#define DIO12_PWM &OCR1B + +#define DIO13_PIN PIND5 +#define DIO13_RPORT PIND +#define DIO13_WPORT PORTD +#define DIO13_DDR DDRD +#define DIO13_PWM &OCR1A + +#define DIO14_PIN PIND6 +#define DIO14_RPORT PIND +#define DIO14_WPORT PORTD +#define DIO14_DDR DDRD +#define DIO14_PWM &OCR2B + +#define DIO15_PIN PIND7 +#define DIO15_RPORT PIND +#define DIO15_WPORT PORTD +#define DIO15_DDR DDRD +#define DIO15_PWM &OCR2A + +#define DIO16_PIN PINC0 +#define DIO16_RPORT PINC +#define DIO16_WPORT PORTC +#define DIO16_DDR DDRC +#define DIO16_PWM nullptr + +#define DIO17_PIN PINC1 +#define DIO17_RPORT PINC +#define DIO17_WPORT PORTC +#define DIO17_DDR DDRC +#define DIO17_PWM nullptr + +#define DIO18_PIN PINC2 +#define DIO18_RPORT PINC +#define DIO18_WPORT PORTC +#define DIO18_DDR DDRC +#define DIO18_PWM nullptr + +#define DIO19_PIN PINC3 +#define DIO19_RPORT PINC +#define DIO19_WPORT PORTC +#define DIO19_DDR DDRC +#define DIO19_PWM nullptr + +#define DIO20_PIN PINC4 +#define DIO20_RPORT PINC +#define DIO20_WPORT PORTC +#define DIO20_DDR DDRC +#define DIO20_PWM nullptr + +#define DIO21_PIN PINC5 +#define DIO21_RPORT PINC +#define DIO21_WPORT PORTC +#define DIO21_DDR DDRC +#define DIO21_PWM nullptr + +#define DIO22_PIN PINC6 +#define DIO22_RPORT PINC +#define DIO22_WPORT PORTC +#define DIO22_DDR DDRC +#define DIO22_PWM nullptr + +#define DIO23_PIN PINC7 +#define DIO23_RPORT PINC +#define DIO23_WPORT PORTC +#define DIO23_DDR DDRC +#define DIO23_PWM nullptr + +#define DIO24_PIN PINA7 +#define DIO24_RPORT PINA +#define DIO24_WPORT PORTA +#define DIO24_DDR DDRA +#define DIO24_PWM nullptr + +#define DIO25_PIN PINA6 +#define DIO25_RPORT PINA +#define DIO25_WPORT PORTA +#define DIO25_DDR DDRA +#define DIO25_PWM nullptr + +#define DIO26_PIN PINA5 +#define DIO26_RPORT PINA +#define DIO26_WPORT PORTA +#define DIO26_DDR DDRA +#define DIO26_PWM nullptr + +#define DIO27_PIN PINA4 +#define DIO27_RPORT PINA +#define DIO27_WPORT PORTA +#define DIO27_DDR DDRA +#define DIO27_PWM nullptr + +#define DIO28_PIN PINA3 +#define DIO28_RPORT PINA +#define DIO28_WPORT PORTA +#define DIO28_DDR DDRA +#define DIO28_PWM nullptr + +#define DIO29_PIN PINA2 +#define DIO29_RPORT PINA +#define DIO29_WPORT PORTA +#define DIO29_DDR DDRA +#define DIO29_PWM nullptr + +#define DIO30_PIN PINA1 +#define DIO30_RPORT PINA +#define DIO30_WPORT PORTA +#define DIO30_DDR DDRA +#define DIO30_PWM nullptr + +#define DIO31_PIN PINA0 +#define DIO31_RPORT PINA +#define DIO31_WPORT PORTA +#define DIO31_DDR DDRA +#define DIO31_PWM nullptr + +#define AIO0_PIN PINA0 +#define AIO0_RPORT PINA +#define AIO0_WPORT PORTA +#define AIO0_DDR DDRA +#define AIO0_PWM nullptr + +#define AIO1_PIN PINA1 +#define AIO1_RPORT PINA +#define AIO1_WPORT PORTA +#define AIO1_DDR DDRA +#define AIO1_PWM nullptr + +#define AIO2_PIN PINA2 +#define AIO2_RPORT PINA +#define AIO2_WPORT PORTA +#define AIO2_DDR DDRA +#define AIO2_PWM nullptr + +#define AIO3_PIN PINA3 +#define AIO3_RPORT PINA +#define AIO3_WPORT PORTA +#define AIO3_DDR DDRA +#define AIO3_PWM nullptr + +#define AIO4_PIN PINA4 +#define AIO4_RPORT PINA +#define AIO4_WPORT PORTA +#define AIO4_DDR DDRA +#define AIO4_PWM nullptr + +#define AIO5_PIN PINA5 +#define AIO5_RPORT PINA +#define AIO5_WPORT PORTA +#define AIO5_DDR DDRA +#define AIO5_PWM nullptr + +#define AIO6_PIN PINA6 +#define AIO6_RPORT PINA +#define AIO6_WPORT PORTA +#define AIO6_DDR DDRA +#define AIO6_PWM nullptr + +#define AIO7_PIN PINA7 +#define AIO7_RPORT PINA +#define AIO7_WPORT PORTA +#define AIO7_DDR DDRA +#define AIO7_PWM nullptr + +#undef PA0 +#define PA0_PIN PINA0 +#define PA0_RPORT PINA +#define PA0_WPORT PORTA +#define PA0_DDR DDRA +#define PA0_PWM nullptr + +#undef PA1 +#define PA1_PIN PINA1 +#define PA1_RPORT PINA +#define PA1_WPORT PORTA +#define PA1_DDR DDRA +#define PA1_PWM nullptr + +#undef PA2 +#define PA2_PIN PINA2 +#define PA2_RPORT PINA +#define PA2_WPORT PORTA +#define PA2_DDR DDRA +#define PA2_PWM nullptr + +#undef PA3 +#define PA3_PIN PINA3 +#define PA3_RPORT PINA +#define PA3_WPORT PORTA +#define PA3_DDR DDRA +#define PA3_PWM nullptr + +#undef PA4 +#define PA4_PIN PINA4 +#define PA4_RPORT PINA +#define PA4_WPORT PORTA +#define PA4_DDR DDRA +#define PA4_PWM nullptr + +#undef PA5 +#define PA5_PIN PINA5 +#define PA5_RPORT PINA +#define PA5_WPORT PORTA +#define PA5_DDR DDRA +#define PA5_PWM nullptr + +#undef PA6 +#define PA6_PIN PINA6 +#define PA6_RPORT PINA +#define PA6_WPORT PORTA +#define PA6_DDR DDRA +#define PA6_PWM nullptr + +#undef PA7 +#define PA7_PIN PINA7 +#define PA7_RPORT PINA +#define PA7_WPORT PORTA +#define PA7_DDR DDRA +#define PA7_PWM nullptr + +#undef PB0 +#define PB0_PIN PINB0 +#define PB0_RPORT PINB +#define PB0_WPORT PORTB +#define PB0_DDR DDRB +#define PB0_PWM nullptr + +#undef PB1 +#define PB1_PIN PINB1 +#define PB1_RPORT PINB +#define PB1_WPORT PORTB +#define PB1_DDR DDRB +#define PB1_PWM nullptr + +#undef PB2 +#define PB2_PIN PINB2 +#define PB2_RPORT PINB +#define PB2_WPORT PORTB +#define PB2_DDR DDRB +#define PB2_PWM nullptr + +#undef PB3 +#define PB3_PIN PINB3 +#define PB3_RPORT PINB +#define PB3_WPORT PORTB +#define PB3_DDR DDRB +#define PB3_PWM &OCR0A + +#undef PB4 +#define PB4_PIN PINB4 +#define PB4_RPORT PINB +#define PB4_WPORT PORTB +#define PB4_DDR DDRB +#define PB4_PWM &OCR0B + +#undef PB5 +#define PB5_PIN PINB5 +#define PB5_RPORT PINB +#define PB5_WPORT PORTB +#define PB5_DDR DDRB +#define PB5_PWM nullptr + +#undef PB6 +#define PB6_PIN PINB6 +#define PB6_RPORT PINB +#define PB6_WPORT PORTB +#define PB6_DDR DDRB +#define PB6_PWM nullptr + +#undef PB7 +#define PB7_PIN PINB7 +#define PB7_RPORT PINB +#define PB7_WPORT PORTB +#define PB7_DDR DDRB +#define PB7_PWM nullptr + +#undef PC0 +#define PC0_PIN PINC0 +#define PC0_RPORT PINC +#define PC0_WPORT PORTC +#define PC0_DDR DDRC +#define PC0_PWM nullptr + +#undef PC1 +#define PC1_PIN PINC1 +#define PC1_RPORT PINC +#define PC1_WPORT PORTC +#define PC1_DDR DDRC +#define PC1_PWM nullptr + +#undef PC2 +#define PC2_PIN PINC2 +#define PC2_RPORT PINC +#define PC2_WPORT PORTC +#define PC2_DDR DDRC +#define PC2_PWM nullptr + +#undef PC3 +#define PC3_PIN PINC3 +#define PC3_RPORT PINC +#define PC3_WPORT PORTC +#define PC3_DDR DDRC +#define PC3_PWM nullptr + +#undef PC4 +#define PC4_PIN PINC4 +#define PC4_RPORT PINC +#define PC4_WPORT PORTC +#define PC4_DDR DDRC +#define PC4_PWM nullptr + +#undef PC5 +#define PC5_PIN PINC5 +#define PC5_RPORT PINC +#define PC5_WPORT PORTC +#define PC5_DDR DDRC +#define PC5_PWM nullptr + +#undef PC6 +#define PC6_PIN PINC6 +#define PC6_RPORT PINC +#define PC6_WPORT PORTC +#define PC6_DDR DDRC +#define PC6_PWM nullptr + +#undef PC7 +#define PC7_PIN PINC7 +#define PC7_RPORT PINC +#define PC7_WPORT PORTC +#define PC7_DDR DDRC +#define PC7_PWM nullptr + +#undef PD0 +#define PD0_PIN PIND0 +#define PD0_RPORT PIND +#define PD0_WPORT PORTD +#define PD0_DDR DDRD +#define PD0_PWM nullptr + +#undef PD1 +#define PD1_PIN PIND1 +#define PD1_RPORT PIND +#define PD1_WPORT PORTD +#define PD1_DDR DDRD +#define PD1_PWM nullptr + +#undef PD2 +#define PD2_PIN PIND2 +#define PD2_RPORT PIND +#define PD2_WPORT PORTD +#define PD2_DDR DDRD +#define PD2_PWM nullptr + +#undef PD3 +#define PD3_PIN PIND3 +#define PD3_RPORT PIND +#define PD3_WPORT PORTD +#define PD3_DDR DDRD +#define PD3_PWM nullptr + +#undef PD4 +#define PD4_PIN PIND4 +#define PD4_RPORT PIND +#define PD4_WPORT PORTD +#define PD4_DDR DDRD +#define PD4_PWM nullptr + +#undef PD5 +#define PD5_PIN PIND5 +#define PD5_RPORT PIND +#define PD5_WPORT PORTD +#define PD5_DDR DDRD +#define PD5_PWM nullptr + +#undef PD6 +#define PD6_PIN PIND6 +#define PD6_RPORT PIND +#define PD6_WPORT PORTD +#define PD6_DDR DDRD +#define PD6_PWM &OCR2B + +#undef PD7 +#define PD7_PIN PIND7 +#define PD7_RPORT PIND +#define PD7_WPORT PORTD +#define PD7_DDR DDRD +#define PD7_PWM &OCR2A diff --git a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h new file mode 100644 index 00000000..51d400b7 --- /dev/null +++ b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h @@ -0,0 +1,697 @@ +/** + * 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 + +/** + * Pin mapping (Teensy) for AT90USB646, 647, 1286, and 1287 + * + * Logical Pin: 28 29 30 31 32 33 34 35 20 21 22 23 24 25 26 27 10 11 12 13 14 15 16 17 00 01 02 03 04 05 06 07 08 09(46*47)36 37 18 19 38 39 40 41 42 43 44 45 + * Port: A0 A1 A2 A3 A4 A5 A6 A7 B0 B1 B2 B3 B4 B5 B6 B7 C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 E0 E1 E2 E3 E4 E5 E6 E7 F0 F1 F2 F3 F4 F5 F6 F7 + * The logical pins 46 and 47 are not supported by Teensyduino, but are supported below as E2 and E3 + */ + +#include "../fastio.h" + +// change for your board +#define DEBUG_LED DIO31 /* led D5 red */ + +// SPI +#define SCK DIO21 // 9 +#define MISO DIO23 // 11 +#define MOSI DIO22 // 10 +#define SS DIO20 // 8 + +// Digital I/O + +#define DIO0_PIN PIND0 +#define DIO0_RPORT PIND +#define DIO0_WPORT PORTD +#define DIO0_PWM 0 +#define DIO0_DDR DDRD + +#define DIO1_PIN PIND1 +#define DIO1_RPORT PIND +#define DIO1_WPORT PORTD +#define DIO1_PWM 0 +#define DIO1_DDR DDRD + +#define DIO2_PIN PIND2 +#define DIO2_RPORT PIND +#define DIO2_WPORT PORTD +#define DIO2_PWM 0 +#define DIO2_DDR DDRD + +#define DIO3_PIN PIND3 +#define DIO3_RPORT PIND +#define DIO3_WPORT PORTD +#define DIO3_PWM 0 +#define DIO3_DDR DDRD + +#define DIO4_PIN PIND4 +#define DIO4_RPORT PIND +#define DIO4_WPORT PORTD +#define DIO4_PWM 0 +#define DIO4_DDR DDRD + +#define DIO5_PIN PIND5 +#define DIO5_RPORT PIND +#define DIO5_WPORT PORTD +#define DIO5_PWM 0 +#define DIO5_DDR DDRD + +#define DIO6_PIN PIND6 +#define DIO6_RPORT PIND +#define DIO6_WPORT PORTD +#define DIO6_PWM 0 +#define DIO6_DDR DDRD + +#define DIO7_PIN PIND7 +#define DIO7_RPORT PIND +#define DIO7_WPORT PORTD +#define DIO7_PWM 0 +#define DIO7_DDR DDRD + +#define DIO8_PIN PINE0 +#define DIO8_RPORT PINE +#define DIO8_WPORT PORTE +#define DIO8_PWM 0 +#define DIO8_DDR DDRE + +#define DIO9_PIN PINE1 +#define DIO9_RPORT PINE +#define DIO9_WPORT PORTE +#define DIO9_PWM 0 +#define DIO9_DDR DDRE + +#define DIO10_PIN PINC0 +#define DIO10_RPORT PINC +#define DIO10_WPORT PORTC +#define DIO10_PWM 0 +#define DIO10_DDR DDRC + +#define DIO11_PIN PINC1 +#define DIO11_RPORT PINC +#define DIO11_WPORT PORTC +#define DIO11_PWM 0 +#define DIO11_DDR DDRC + +#define DIO12_PIN PINC2 +#define DIO12_RPORT PINC +#define DIO12_WPORT PORTC +#define DIO12_PWM 0 +#define DIO12_DDR DDRC + +#define DIO13_PIN PINC3 +#define DIO13_RPORT PINC +#define DIO13_WPORT PORTC +#define DIO13_PWM 0 +#define DIO13_DDR DDRC + +#define DIO14_PIN PINC4 +#define DIO14_RPORT PINC +#define DIO14_WPORT PORTC +#define DIO14_PWM 0 // OC3C +#define DIO14_DDR DDRC + +#define DIO15_PIN PINC5 +#define DIO15_RPORT PINC +#define DIO15_WPORT PORTC +#define DIO15_PWM 0 // OC3B +#define DIO15_DDR DDRC + +#define DIO16_PIN PINC6 +#define DIO16_RPORT PINC +#define DIO16_WPORT PORTC +#define DIO16_PWM 0 // OC3A +#define DIO16_DDR DDRC + +#define DIO17_PIN PINC7 +#define DIO17_RPORT PINC +#define DIO17_WPORT PORTC +#define DIO17_PWM 0 +#define DIO17_DDR DDRC + +#define DIO18_PIN PINE6 +#define DIO18_RPORT PINE +#define DIO18_WPORT PORTE +#define DIO18_PWM 0 +#define DIO18_DDR DDRE + +#define DIO19_PIN PINE7 +#define DIO19_RPORT PINE +#define DIO19_WPORT PORTE +#define DIO19_PWM 0 +#define DIO19_DDR DDRE + +#define DIO20_PIN PINB0 +#define DIO20_RPORT PINB +#define DIO20_WPORT PORTB +#define DIO20_PWM 0 +#define DIO20_DDR DDRB + +#define DIO21_PIN PINB1 +#define DIO21_RPORT PINB +#define DIO21_WPORT PORTB +#define DIO21_PWM 0 +#define DIO21_DDR DDRB + +#define DIO22_PIN PINB2 +#define DIO22_RPORT PINB +#define DIO22_WPORT PORTB +#define DIO22_PWM 0 +#define DIO22_DDR DDRB + +#define DIO23_PIN PINB3 +#define DIO23_RPORT PINB +#define DIO23_WPORT PORTB +#define DIO23_PWM 0 +#define DIO23_DDR DDRB + +#define DIO24_PIN PINB4 +#define DIO24_RPORT PINB +#define DIO24_WPORT PORTB +#define DIO24_PWM 0 // OC2A +#define DIO24_DDR DDRB + +#define DIO25_PIN PINB5 +#define DIO25_RPORT PINB +#define DIO25_WPORT PORTB +#define DIO25_PWM 0 // OC1A +#define DIO25_DDR DDRB + +#define DIO26_PIN PINB6 +#define DIO26_RPORT PINB +#define DIO26_WPORT PORTB +#define DIO26_PWM 0 // OC1B +#define DIO26_DDR DDRB + +#define DIO27_PIN PINB7 +#define DIO27_RPORT PINB +#define DIO27_WPORT PORTB +#define DIO27_PWM 0 // OC1C +#define DIO27_DDR DDRB + +#define DIO28_PIN PINA0 +#define DIO28_RPORT PINA +#define DIO28_WPORT PORTA +#define DIO28_PWM 0 +#define DIO28_DDR DDRA + +#define DIO29_PIN PINA1 +#define DIO29_RPORT PINA +#define DIO29_WPORT PORTA +#define DIO29_PWM 0 +#define DIO29_DDR DDRA + +#define DIO30_PIN PINA2 +#define DIO30_RPORT PINA +#define DIO30_WPORT PORTA +#define DIO30_PWM 0 +#define DIO30_DDR DDRA + +#define DIO31_PIN PINA3 +#define DIO31_RPORT PINA +#define DIO31_WPORT PORTA +#define DIO31_PWM 0 +#define DIO31_DDR DDRA + +#define DIO32_PIN PINA4 +#define DIO32_RPORT PINA +#define DIO32_WPORT PORTA +#define DIO32_PWM 0 +#define DIO32_DDR DDRA + +#define DIO33_PIN PINA5 +#define DIO33_RPORT PINA +#define DIO33_WPORT PORTA +#define DIO33_PWM 0 +#define DIO33_DDR DDRA + +#define DIO34_PIN PINA6 +#define DIO34_RPORT PINA +#define DIO34_WPORT PORTA +#define DIO34_PWM 0 +#define DIO34_DDR DDRA + +#define DIO35_PIN PINA7 +#define DIO35_RPORT PINA +#define DIO35_WPORT PORTA +#define DIO35_PWM 0 +#define DIO35_DDR DDRA + +#define DIO36_PIN PINE4 +#define DIO36_RPORT PINE +#define DIO36_WPORT PORTE +#define DIO36_PWM 0 +#define DIO36_DDR DDRE + +#define DIO37_PIN PINE5 +#define DIO37_RPORT PINE +#define DIO37_WPORT PORTE +#define DIO37_PWM 0 +#define DIO37_DDR DDRE + +#define DIO38_PIN PINF0 +#define DIO38_RPORT PINF +#define DIO38_WPORT PORTF +#define DIO38_PWM 0 +#define DIO38_DDR DDRF + +#define DIO39_PIN PINF1 +#define DIO39_RPORT PINF +#define DIO39_WPORT PORTF +#define DIO39_PWM 0 +#define DIO39_DDR DDRF + +#define DIO40_PIN PINF2 +#define DIO40_RPORT PINF +#define DIO40_WPORT PORTF +#define DIO40_PWM 0 +#define DIO40_DDR DDRF + +#define DIO41_PIN PINF3 +#define DIO41_RPORT PINF +#define DIO41_WPORT PORTF +#define DIO41_PWM 0 +#define DIO41_DDR DDRF + +#define DIO42_PIN PINF4 +#define DIO42_RPORT PINF +#define DIO42_WPORT PORTF +#define DIO42_PWM 0 +#define DIO42_DDR DDRF + +#define DIO43_PIN PINF5 +#define DIO43_RPORT PINF +#define DIO43_WPORT PORTF +#define DIO43_PWM 0 +#define DIO43_DDR DDRF + +#define DIO44_PIN PINF6 +#define DIO44_RPORT PINF +#define DIO44_WPORT PORTF +#define DIO44_PWM 0 +#define DIO44_DDR DDRF + +#define DIO45_PIN PINF7 +#define DIO45_RPORT PINF +#define DIO45_WPORT PORTF +#define DIO45_PWM 0 +#define DIO45_DDR DDRF + +#define AIO0_PIN PINF0 +#define AIO0_RPORT PINF +#define AIO0_WPORT PORTF +#define AIO0_PWM 0 +#define AIO0_DDR DDRF + +#define AIO1_PIN PINF1 +#define AIO1_RPORT PINF +#define AIO1_WPORT PORTF +#define AIO1_PWM 0 +#define AIO1_DDR DDRF + +#define AIO2_PIN PINF2 +#define AIO2_RPORT PINF +#define AIO2_WPORT PORTF +#define AIO2_PWM 0 +#define AIO2_DDR DDRF + +#define AIO3_PIN PINF3 +#define AIO3_RPORT PINF +#define AIO3_WPORT PORTF +#define AIO3_PWM 0 +#define AIO3_DDR DDRF + +#define AIO4_PIN PINF4 +#define AIO4_RPORT PINF +#define AIO4_WPORT PORTF +#define AIO4_PWM 0 +#define AIO4_DDR DDRF + +#define AIO5_PIN PINF5 +#define AIO5_RPORT PINF +#define AIO5_WPORT PORTF +#define AIO5_PWM 0 +#define AIO5_DDR DDRF + +#define AIO6_PIN PINF6 +#define AIO6_RPORT PINF +#define AIO6_WPORT PORTF +#define AIO6_PWM 0 +#define AIO6_DDR DDRF + +#define AIO7_PIN PINF7 +#define AIO7_RPORT PINF +#define AIO7_WPORT PORTF +#define AIO7_PWM 0 +#define AIO7_DDR DDRF + +//-- Begin not supported by Teensyduino +//-- don't use Arduino functions on these pins pinMode/digitalWrite/etc +#define DIO46_PIN PINE2 +#define DIO46_RPORT PINE +#define DIO46_WPORT PORTE +#define DIO46_PWM 0 +#define DIO46_DDR DDRE + +#define DIO47_PIN PINE3 +#define DIO47_RPORT PINE +#define DIO47_WPORT PORTE +#define DIO47_PWM 0 +#define DIO47_DDR DDRE + +#define TEENSY_E2 46 +#define TEENSY_E3 47 + +//-- end not supported by Teensyduino + +#undef PA0 +#define PA0_PIN PINA0 +#define PA0_RPORT PINA +#define PA0_WPORT PORTA +#define PA0_PWM 0 +#define PA0_DDR DDRA +#undef PA1 +#define PA1_PIN PINA1 +#define PA1_RPORT PINA +#define PA1_WPORT PORTA +#define PA1_PWM 0 +#define PA1_DDR DDRA +#undef PA2 +#define PA2_PIN PINA2 +#define PA2_RPORT PINA +#define PA2_WPORT PORTA +#define PA2_PWM 0 +#define PA2_DDR DDRA +#undef PA3 +#define PA3_PIN PINA3 +#define PA3_RPORT PINA +#define PA3_WPORT PORTA +#define PA3_PWM 0 +#define PA3_DDR DDRA +#undef PA4 +#define PA4_PIN PINA4 +#define PA4_RPORT PINA +#define PA4_WPORT PORTA +#define PA4_PWM 0 +#define PA4_DDR DDRA +#undef PA5 +#define PA5_PIN PINA5 +#define PA5_RPORT PINA +#define PA5_WPORT PORTA +#define PA5_PWM 0 +#define PA5_DDR DDRA +#undef PA6 +#define PA6_PIN PINA6 +#define PA6_RPORT PINA +#define PA6_WPORT PORTA +#define PA6_PWM 0 +#define PA6_DDR DDRA +#undef PA7 +#define PA7_PIN PINA7 +#define PA7_RPORT PINA +#define PA7_WPORT PORTA +#define PA7_PWM 0 +#define PA7_DDR DDRA + +#undef PB0 +#define PB0_PIN PINB0 +#define PB0_RPORT PINB +#define PB0_WPORT PORTB +#define PB0_PWM 0 +#define PB0_DDR DDRB +#undef PB1 +#define PB1_PIN PINB1 +#define PB1_RPORT PINB +#define PB1_WPORT PORTB +#define PB1_PWM 0 +#define PB1_DDR DDRB +#undef PB2 +#define PB2_PIN PINB2 +#define PB2_RPORT PINB +#define PB2_WPORT PORTB +#define PB2_PWM 0 +#define PB2_DDR DDRB +#undef PB3 +#define PB3_PIN PINB3 +#define PB3_RPORT PINB +#define PB3_WPORT PORTB +#define PB3_PWM 0 +#define PB3_DDR DDRB +#undef PB4 +#define PB4_PIN PINB4 +#define PB4_RPORT PINB +#define PB4_WPORT PORTB +#define PB4_PWM 0 +#define PB4_DDR DDRB +#undef PB5 +#define PB5_PIN PINB5 +#define PB5_RPORT PINB +#define PB5_WPORT PORTB +#define PB5_PWM 0 +#define PB5_DDR DDRB +#undef PB6 +#define PB6_PIN PINB6 +#define PB6_RPORT PINB +#define PB6_WPORT PORTB +#define PB6_PWM 0 +#define PB6_DDR DDRB +#undef PB7 +#define PB7_PIN PINB7 +#define PB7_RPORT PINB +#define PB7_WPORT PORTB +#define PB7_PWM 0 +#define PB7_DDR DDRB + +#undef PC0 +#define PC0_PIN PINC0 +#define PC0_RPORT PINC +#define PC0_WPORT PORTC +#define PC0_PWM 0 +#define PC0_DDR DDRC +#undef PC1 +#define PC1_PIN PINC1 +#define PC1_RPORT PINC +#define PC1_WPORT PORTC +#define PC1_PWM 0 +#define PC1_DDR DDRC +#undef PC2 +#define PC2_PIN PINC2 +#define PC2_RPORT PINC +#define PC2_WPORT PORTC +#define PC2_PWM 0 +#define PC2_DDR DDRC +#undef PC3 +#define PC3_PIN PINC3 +#define PC3_RPORT PINC +#define PC3_WPORT PORTC +#define PC3_PWM 0 +#define PC3_DDR DDRC +#undef PC4 +#define PC4_PIN PINC4 +#define PC4_RPORT PINC +#define PC4_WPORT PORTC +#define PC4_PWM 0 +#define PC4_DDR DDRC +#undef PC5 +#define PC5_PIN PINC5 +#define PC5_RPORT PINC +#define PC5_WPORT PORTC +#define PC5_PWM 0 +#define PC5_DDR DDRC +#undef PC6 +#define PC6_PIN PINC6 +#define PC6_RPORT PINC +#define PC6_WPORT PORTC +#define PC6_PWM 0 +#define PC6_DDR DDRC +#undef PC7 +#define PC7_PIN PINC7 +#define PC7_RPORT PINC +#define PC7_WPORT PORTC +#define PC7_PWM 0 +#define PC7_DDR DDRC + +#undef PD0 +#define PD0_PIN PIND0 +#define PD0_RPORT PIND +#define PD0_WPORT PORTD +#define PD0_PWM 0 // OC0B +#define PD0_DDR DDRD +#undef PD1 +#define PD1_PIN PIND1 +#define PD1_RPORT PIND +#define PD1_WPORT PORTD +#define PD1_PWM 0 // OC2B +#define PD1_DDR DDRD +#undef PD2 +#define PD2_PIN PIND2 +#define PD2_RPORT PIND +#define PD2_WPORT PORTD +#define PD2_PWM 0 +#define PD2_DDR DDRD +#undef PD3 +#define PD3_PIN PIND3 +#define PD3_RPORT PIND +#define PD3_WPORT PORTD +#define PD3_PWM 0 +#define PD3_DDR DDRD +#undef PD4 +#define PD4_PIN PIND4 +#define PD4_RPORT PIND +#define PD4_WPORT PORTD +#define PD4_PWM 0 +#define PD4_DDR DDRD +#undef PD5 +#define PD5_PIN PIND5 +#define PD5_RPORT PIND +#define PD5_WPORT PORTD +#define PD5_PWM 0 +#define PD5_DDR DDRD +#undef PD6 +#define PD6_PIN PIND6 +#define PD6_RPORT PIND +#define PD6_WPORT PORTD +#define PD6_PWM 0 +#define PD6_DDR DDRD +#undef PD7 +#define PD7_PIN PIND7 +#define PD7_RPORT PIND +#define PD7_WPORT PORTD +#define PD7_PWM 0 +#define PD7_DDR DDRD + +#undef PE0 +#define PE0_PIN PINE0 +#define PE0_RPORT PINE +#define PE0_WPORT PORTE +#define PE0_PWM 0 +#define PE0_DDR DDRE +#undef PE1 +#define PE1_PIN PINE1 +#define PE1_RPORT PINE +#define PE1_WPORT PORTE +#define PE1_PWM 0 +#define PE1_DDR DDRE +#undef PE2 +#define PE2_PIN PINE2 +#define PE2_RPORT PINE +#define PE2_WPORT PORTE +#define PE2_PWM 0 +#define PE2_DDR DDRE +#undef PE3 +#define PE3_PIN PINE3 +#define PE3_RPORT PINE +#define PE3_WPORT PORTE +#define PE3_PWM 0 +#define PE3_DDR DDRE +#undef PE4 +#define PE4_PIN PINE4 +#define PE4_RPORT PINE +#define PE4_WPORT PORTE +#define PE4_PWM 0 +#define PE4_DDR DDRE +#undef PE5 +#define PE5_PIN PINE5 +#define PE5_RPORT PINE +#define PE5_WPORT PORTE +#define PE5_PWM 0 +#define PE5_DDR DDRE +#undef PE6 +#define PE6_PIN PINE6 +#define PE6_RPORT PINE +#define PE6_WPORT PORTE +#define PE6_PWM 0 +#define PE6_DDR DDRE +#undef PE7 +#define PE7_PIN PINE7 +#define PE7_RPORT PINE +#define PE7_WPORT PORTE +#define PE7_PWM 0 +#define PE7_DDR DDRE + +#undef PF0 +#define PF0_PIN PINF0 +#define PF0_RPORT PINF +#define PF0_WPORT PORTF +#define PF0_PWM 0 +#define PF0_DDR DDRF +#undef PF1 +#define PF1_PIN PINF1 +#define PF1_RPORT PINF +#define PF1_WPORT PORTF +#define PF1_PWM 0 +#define PF1_DDR DDRF +#undef PF2 +#define PF2_PIN PINF2 +#define PF2_RPORT PINF +#define PF2_WPORT PORTF +#define PF2_PWM 0 +#define PF2_DDR DDRF +#undef PF3 +#define PF3_PIN PINF3 +#define PF3_RPORT PINF +#define PF3_WPORT PORTF +#define PF3_PWM 0 +#define PF3_DDR DDRF +#undef PF4 +#define PF4_PIN PINF4 +#define PF4_RPORT PINF +#define PF4_WPORT PORTF +#define PF4_PWM 0 +#define PF4_DDR DDRF +#undef PF5 +#define PF5_PIN PINF5 +#define PF5_RPORT PINF +#define PF5_WPORT PORTF +#define PF5_PWM 0 +#define PF5_DDR DDRF +#undef PF6 +#define PF6_PIN PINF6 +#define PF6_RPORT PINF +#define PF6_WPORT PORTF +#define PF6_PWM 0 +#define PF6_DDR DDRF +#undef PF7 +#define PF7_PIN PINF7 +#define PF7_RPORT PINF +#define PF7_WPORT PORTF +#define PF7_PWM 0 +#define PF7_DDR DDRF + + +/** + * Some of the pin mapping functions of the Teensduino extension to the Arduino IDE + * do not function the same as the other Arduino extensions. + */ + +//digitalPinToTimer(pin) function works like Arduino but Timers are not defined +#define TIMER0B 1 +#define TIMER1A 7 +#define TIMER1B 8 +#define TIMER1C 9 +#define TIMER2A 6 +#define TIMER2B 2 +#define TIMER3A 5 +#define TIMER3B 4 +#define TIMER3C 3 diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h new file mode 100644 index 00000000..a611ccd7 --- /dev/null +++ b/Marlin/src/HAL/AVR/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/AVR." +#endif diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_adv.h b/Marlin/src/HAL/AVR/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/AVR/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/AVR/inc/Conditionals_post.h b/Marlin/src/HAL/AVR/inc/Conditionals_post.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/AVR/inc/Conditionals_post.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h new file mode 100644 index 00000000..731cf928 --- /dev/null +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -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 . + * + */ +#pragma once + +/** + * Test AVR-specific configuration values for errors at compile-time. + */ + +/** + * Checks for FAST PWM + */ +#if ENABLED(FAST_PWM_FAN) && (ENABLED(USE_OCR2A_AS_TOP) && defined(TCCR2)) + #error "USE_OCR2A_AS_TOP does not apply to devices with a single output TIMER2" +#endif + +/** + * 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 && 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) + #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_PWM." +#endif + +/** + * The Trinamic library includes SoftwareSerial.h, leading to a compile error. + */ +#if BOTH(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE) + #error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." +#endif + +#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS) + #error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue." +#endif diff --git a/Marlin/src/HAL/AVR/math.h b/Marlin/src/HAL/AVR/math.h new file mode 100644 index 00000000..7ede4acc --- /dev/null +++ b/Marlin/src/HAL/AVR/math.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 + +/** + * Optimized math functions for AVR + */ + +// intRes = longIn1 * longIn2 >> 24 +// uses: +// A[tmp] to store 0 +// B[tmp] to store bits 16-23 of the 48bit result. The top bit is used to round the two byte result. +// note that the lower two bytes and the upper byte of the 48bit result are not calculated. +// this can cause the result to be out by one as the lower bytes may cause carries into the upper ones. +// B A are bits 24-39 and are the returned value +// C B A is longIn1 +// D C B A is longIn2 +// +static FORCE_INLINE uint16_t MultiU24X32toH16(uint32_t longIn1, uint32_t longIn2) { + uint8_t tmp1; + uint8_t tmp2; + uint16_t intRes; + __asm__ __volatile__( + A("clr %[tmp1]") + A("mul %A[longIn1], %B[longIn2]") + A("mov %[tmp2], r1") + A("mul %B[longIn1], %C[longIn2]") + A("movw %A[intRes], r0") + A("mul %C[longIn1], %C[longIn2]") + A("add %B[intRes], r0") + A("mul %C[longIn1], %B[longIn2]") + A("add %A[intRes], r0") + A("adc %B[intRes], r1") + A("mul %A[longIn1], %C[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %B[longIn1], %B[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %C[longIn1], %A[longIn2]") + A("add %[tmp2], r0") + A("adc %A[intRes], r1") + A("adc %B[intRes], %[tmp1]") + A("mul %B[longIn1], %A[longIn2]") + A("add %[tmp2], r1") + A("adc %A[intRes], %[tmp1]") + A("adc %B[intRes], %[tmp1]") + A("lsr %[tmp2]") + A("adc %A[intRes], %[tmp1]") + A("adc %B[intRes], %[tmp1]") + A("mul %D[longIn2], %A[longIn1]") + A("add %A[intRes], r0") + A("adc %B[intRes], r1") + A("mul %D[longIn2], %B[longIn1]") + A("add %B[intRes], r0") + A("clr r1") + : [intRes] "=&r" (intRes), + [tmp1] "=&r" (tmp1), + [tmp2] "=&r" (tmp2) + : [longIn1] "d" (longIn1), + [longIn2] "d" (longIn2) + : "cc" + ); + return intRes; +} + +// intRes = intIn1 * intIn2 >> 16 +// uses: +// r26 to store 0 +// r27 to store the byte 1 of the 24 bit result +static FORCE_INLINE uint16_t MultiU16X8toH16(uint8_t charIn1, uint16_t intIn2) { + uint8_t tmp; + uint16_t intRes; + __asm__ __volatile__ ( + A("clr %[tmp]") + A("mul %[charIn1], %B[intIn2]") + A("movw %A[intRes], r0") + A("mul %[charIn1], %A[intIn2]") + A("add %A[intRes], r1") + A("adc %B[intRes], %[tmp]") + A("lsr r0") + A("adc %A[intRes], %[tmp]") + A("adc %B[intRes], %[tmp]") + A("clr r1") + : [intRes] "=&r" (intRes), + [tmp] "=&r" (tmp) + : [charIn1] "d" (charIn1), + [intIn2] "d" (intIn2) + : "cc" + ); + return intRes; +} diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h new file mode 100644 index 00000000..dac6b1b1 --- /dev/null +++ b/Marlin/src/HAL/AVR/pinsDebug.h @@ -0,0 +1,403 @@ +/** + * 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 + +/** + * PWM print routines for Atmel 8 bit AVR CPUs + */ + +#include "../../inc/MarlinConfig.h" + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS + +#if MB(BQ_ZUM_MEGA_3D, MIGHTYBOARD_REVE, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14) + #define AVR_ATmega2560_FAMILY_PLUS_70 1 +#endif + +#if AVR_AT90USB1286_FAMILY + + // Working with Teensyduino extension so need to re-define some things + #include "pinsDebug_Teensyduino.h" + // Can't use the "digitalPinToPort" function from the Teensyduino type IDEs + // portModeRegister takes a different argument + #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) + #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) + #define digitalPinToPort_DEBUG(p) digitalPinToPort_Teensy(p) + #define GET_PINMODE(pin) (*portModeRegister(pin) & digitalPinToBitMask_DEBUG(pin)) + +#elif AVR_ATmega2560_FAMILY_PLUS_70 // So we can access/display all the pins on boards using more than 70 + + #include "pinsDebug_plus_70.h" + #define digitalPinToTimer_DEBUG(p) digitalPinToTimer_plus_70(p) + #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask_plus_70(p) + #define digitalPinToPort_DEBUG(p) digitalPinToPort_plus_70(p) + bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + +#else + + #define digitalPinToTimer_DEBUG(p) digitalPinToTimer(p) + #define digitalPinToBitMask_DEBUG(p) digitalPinToBitMask(p) + #define digitalPinToPort_DEBUG(p) digitalPinToPort(p) + bool GET_PINMODE(int8_t pin) {return *portModeRegister(digitalPinToPort_DEBUG(pin)) & digitalPinToBitMask_DEBUG(pin); } + #define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) + +#endif + +#define VALID_PIN(pin) (pin >= 0 && pin < NUM_DIGITAL_PINS ? 1 : 0) +#if AVR_ATmega1284_FAMILY + #define DIGITAL_PIN_TO_ANALOG_PIN(P) int(analogInputToDigitalPin(0) - (P)) + #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(7) && (P) <= analogInputToDigitalPin(0)) +#else + #define DIGITAL_PIN_TO_ANALOG_PIN(P) int((P) - analogInputToDigitalPin(0)) + #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && ((P) <= analogInputToDigitalPin(15) || (P) <= analogInputToDigitalPin(7))) +#endif +#define GET_ARRAY_PIN(p) pgm_read_byte(&pin_array[p].pin) +#define MULTI_NAME_PAD 26 // space needed to be pretty if not first name assigned to a pin + +void PRINT_ARRAY_NAME(uint8_t x) { + char *name_mem_pointer = (char*)pgm_read_ptr(&pin_array[x].name); + LOOP_L_N(y, MAX_NAME_LENGTH) { + char temp_char = pgm_read_byte(name_mem_pointer + y); + if (temp_char != 0) + SERIAL_CHAR(temp_char); + else { + LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' '); + break; + } + } +} + +#define GET_ARRAY_IS_DIGITAL(x) pgm_read_byte(&pin_array[x].is_digital) + + +#if defined(__AVR_ATmega1284P__) // 1284 IDE extensions set this to the number of + #undef NUM_DIGITAL_PINS // digital only pins while all other CPUs have it + #define NUM_DIGITAL_PINS 32 // set to digital only + digital/analog +#endif + +#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) +#define PWM_CASE(N,Z) \ + case TIMER##N##Z: \ + if (TCCR##N##A & (_BV(COM##N##Z##1) | _BV(COM##N##Z##0))) { \ + PWM_PRINT(OCR##N##Z); \ + return true; \ + } else return false + + + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +static bool pwm_status(uint8_t pin) { + char buffer[20]; // for the sprintf statements + + switch (digitalPinToTimer_DEBUG(pin)) { + + #if defined(TCCR0A) && defined(COM0A1) + #ifdef TIMER0A + #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs + PWM_CASE(0, A); + #endif + #endif + PWM_CASE(0, B); + #endif + + #if defined(TCCR1A) && defined(COM1A1) + PWM_CASE(1, A); + PWM_CASE(1, B); + #if defined(COM1C1) && defined(TIMER1C) + PWM_CASE(1, C); + #endif + #endif + + #if defined(TCCR2A) && defined(COM2A1) + PWM_CASE(2, A); + PWM_CASE(2, B); + #endif + + #if defined(TCCR3A) && defined(COM3A1) + PWM_CASE(3, A); + PWM_CASE(3, B); + #ifdef COM3C1 + PWM_CASE(3, C); + #endif + #endif + + #ifdef TCCR4A + PWM_CASE(4, A); + PWM_CASE(4, B); + PWM_CASE(4, C); + #endif + + #if defined(TCCR5A) && defined(COM5A1) + PWM_CASE(5, A); + PWM_CASE(5, B); + PWM_CASE(5, C); + #endif + + case NOT_ON_TIMER: + default: + return false; + } + SERIAL_ECHO_SP(2); +} // pwm_status + + +const volatile uint8_t* const PWM_other[][3] PROGMEM = { + { &TCCR0A, &TCCR0B, &TIMSK0 }, + { &TCCR1A, &TCCR1B, &TIMSK1 }, + #if defined(TCCR2A) && defined(COM2A1) + { &TCCR2A, &TCCR2B, &TIMSK2 }, + #endif + #if defined(TCCR3A) && defined(COM3A1) + { &TCCR3A, &TCCR3B, &TIMSK3 }, + #endif + #ifdef TCCR4A + { &TCCR4A, &TCCR4B, &TIMSK4 }, + #endif + #if defined(TCCR5A) && defined(COM5A1) + { &TCCR5A, &TCCR5B, &TIMSK5 }, + #endif +}; + + +const volatile uint8_t* const PWM_OCR[][3] PROGMEM = { + + #ifdef TIMER0A + { &OCR0A, &OCR0B, 0 }, + #else + { 0, &OCR0B, 0 }, + #endif + + #if defined(COM1C1) && defined(TIMER1C) + { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, (const uint8_t*)&OCR1C }, + #else + { (const uint8_t*)&OCR1A, (const uint8_t*)&OCR1B, 0 }, + #endif + + #if defined(TCCR2A) && defined(COM2A1) + { &OCR2A, &OCR2B, 0 }, + #endif + + #if defined(TCCR3A) && defined(COM3A1) + #ifdef COM3C1 + { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, (const uint8_t*)&OCR3C }, + #else + { (const uint8_t*)&OCR3A, (const uint8_t*)&OCR3B, 0 }, + #endif + #endif + + #ifdef TCCR4A + { (const uint8_t*)&OCR4A, (const uint8_t*)&OCR4B, (const uint8_t*)&OCR4C }, + #endif + + #if defined(TCCR5A) && defined(COM5A1) + { (const uint8_t*)&OCR5A, (const uint8_t*)&OCR5B, (const uint8_t*)&OCR5C }, + #endif +}; + + +#define TCCR_A(T) pgm_read_word(&PWM_other[T][0]) +#define TCCR_B(T) pgm_read_word(&PWM_other[T][1]) +#define TIMSK(T) pgm_read_word(&PWM_other[T][2]) +#define CS_0 0 +#define CS_1 1 +#define CS_2 2 +#define WGM_0 0 +#define WGM_1 1 +#define WGM_2 3 +#define WGM_3 4 +#define TOIE 0 + +#define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L]) + +static void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); } +static void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); } +static void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); } +static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); } + +inline void com_print(const uint8_t N, const uint8_t Z) { + const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); + SERIAL_ECHOPGM(" COM"); + SERIAL_CHAR('0' + N, Z); + SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03)); +} + +void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - WGM bit layout + char buffer[20]; // for the sprintf statements + const uint8_t *TCCRB = (uint8_t*)TCCR_B(T), + *TCCRA = (uint8_t*)TCCR_A(T); + uint8_t WGM = (((*TCCRB & _BV(WGM_2)) >> 1) | (*TCCRA & (_BV(WGM_0) | _BV(WGM_1)))); + if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1); + + SERIAL_ECHOPGM(" TIMER"); + SERIAL_CHAR(T + '0', L); + SERIAL_ECHO_SP(3); + + if (N == 3) { + const uint8_t *OCRVAL8 = (uint8_t*)OCR_VAL(T, L - 'A'); + PWM_PRINT(*OCRVAL8); + } + else { + const uint16_t *OCRVAL16 = (uint16_t*)OCR_VAL(T, L - 'A'); + PWM_PRINT(*OCRVAL16); + } + SERIAL_ECHOPAIR(" WGM: ", WGM); + com_print(T,L); + SERIAL_ECHOPAIR(" CS: ", (*TCCRB & (_BV(CS_0) | _BV(CS_1) | _BV(CS_2)) )); + + SERIAL_ECHOPGM(" TCCR"); + SERIAL_CHAR(T + '0'); + SERIAL_ECHOPAIR("A: ", *TCCRA); + + SERIAL_ECHOPGM(" TCCR"); + SERIAL_CHAR(T + '0'); + SERIAL_ECHOPAIR("B: ", *TCCRB); + + const uint8_t *TMSK = (uint8_t*)TIMSK(T); + SERIAL_ECHOPGM(" TIMSK"); + SERIAL_CHAR(T + '0'); + SERIAL_ECHOPAIR(": ", *TMSK); + + const uint8_t OCIE = L - 'A' + 1; + if (N == 3) { if (WGM == 0 || WGM == 2 || WGM == 4 || WGM == 6) err_is_counter(); } + else { if (WGM == 0 || WGM == 4 || WGM == 12 || WGM == 13) err_is_counter(); } + if (TEST(*TMSK, OCIE)) err_is_interrupt(); + if (TEST(*TMSK, TOIE)) err_prob_interrupt(); +} + +static void pwm_details(uint8_t pin) { + switch (digitalPinToTimer_DEBUG(pin)) { + + #if defined(TCCR0A) && defined(COM0A1) + #ifdef TIMER0A + #if !AVR_AT90USB1286_FAMILY // not available in Teensyduino type IDEs + case TIMER0A: timer_prefix(0, 'A', 3); break; + #endif + #endif + case TIMER0B: timer_prefix(0, 'B', 3); break; + #endif + + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: timer_prefix(1, 'A', 4); break; + case TIMER1B: timer_prefix(1, 'B', 4); break; + #if defined(COM1C1) && defined(TIMER1C) + case TIMER1C: timer_prefix(1, 'C', 4); break; + #endif + #endif + + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: timer_prefix(2, 'A', 3); break; + case TIMER2B: timer_prefix(2, 'B', 3); break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: timer_prefix(3, 'A', 4); break; + case TIMER3B: timer_prefix(3, 'B', 4); break; + #ifdef COM3C1 + case TIMER3C: timer_prefix(3, 'C', 4); break; + #endif + #endif + + #ifdef TCCR4A + case TIMER4A: timer_prefix(4, 'A', 4); break; + case TIMER4B: timer_prefix(4, 'B', 4); break; + case TIMER4C: timer_prefix(4, 'C', 4); break; + #endif + + #if defined(TCCR5A) && defined(COM5A1) + case TIMER5A: timer_prefix(5, 'A', 4); break; + case TIMER5B: timer_prefix(5, 'B', 4); break; + case TIMER5C: timer_prefix(5, 'C', 4); break; + #endif + + case NOT_ON_TIMER: break; + + } + SERIAL_ECHOPGM(" "); + + // on pins that have two PWMs, print info on second PWM + #if AVR_ATmega2560_FAMILY || AVR_AT90USB1286_FAMILY + // looking for port B7 - PWMs 0A and 1C + if (digitalPinToPort_DEBUG(pin) == 'B' - 64 && 0x80 == digitalPinToBitMask_DEBUG(pin)) { + #if !AVR_AT90USB1286_FAMILY + SERIAL_ECHOPGM("\n ."); + SERIAL_ECHO_SP(18); + SERIAL_ECHOPGM("TIMER1C"); + print_is_also_tied(); + timer_prefix(1, 'C', 4); + #else + SERIAL_ECHOPGM("\n ."); + SERIAL_ECHO_SP(18); + SERIAL_ECHOPGM("TIMER0A"); + print_is_also_tied(); + timer_prefix(0, 'A', 3); + #endif + } + #else + UNUSED(print_is_also_tied); + #endif +} // pwm_details + + +#ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs + int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed + const uint8_t port = digitalPinToPort_DEBUG(pin); + return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW; + } +#endif + +#ifndef PRINT_PORT + + void print_port(int8_t pin) { // print port number + #ifdef digitalPinToPort_DEBUG + uint8_t x; + SERIAL_ECHOPGM(" Port: "); + #if AVR_AT90USB1286_FAMILY + x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; + #else + x = digitalPinToPort_DEBUG(pin) + 64; + #endif + SERIAL_CHAR(x); + + #if AVR_AT90USB1286_FAMILY + if (pin == 46) + x = '2'; + else if (pin == 47) + x = '3'; + else { + uint8_t temp = digitalPinToBitMask_DEBUG(pin); + for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; + } + #else + uint8_t temp = digitalPinToBitMask_DEBUG(pin); + for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; + #endif + SERIAL_CHAR(x); + #else + SERIAL_ECHO_SP(10); + #endif + } + + #define PRINT_PORT(p) print_port(p) + +#endif + +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) diff --git a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h new file mode 100644 index 00000000..051972a8 --- /dev/null +++ b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h @@ -0,0 +1,108 @@ +/** + * 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 + +// +// some of the pin mapping functions of the Teensduino extension to the Arduino IDE +// do not function the same as the other Arduino extensions +// + + +#define TEENSYDUINO_IDE + +//digitalPinToTimer(pin) function works like Arduino but Timers are not defined +#define TIMER0B 1 +#define TIMER1A 7 +#define TIMER1B 8 +#define TIMER1C 9 +#define TIMER2A 6 +#define TIMER2B 2 +#define TIMER3A 5 +#define TIMER3B 4 +#define TIMER3C 3 + +// digitalPinToPort function just returns the pin number so need to create our own +#define PA 1 +#define PB 2 +#define PC 3 +#define PD 4 +#define PE 5 +#define PF 6 + +#undef digitalPinToPort + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { + PD, // 0 - PD0 - INT0 - PWM + PD, // 1 - PD1 - INT1 - PWM + PD, // 2 - PD2 - INT2 - RX + PD, // 3 - PD3 - INT3 - TX + PD, // 4 - PD4 + PD, // 5 - PD5 + PD, // 6 - PD6 + PD, // 7 - PD7 + PE, // 8 - PE0 + PE, // 9 - PE1 + PC, // 10 - PC0 + PC, // 11 - PC1 + PC, // 12 - PC2 + PC, // 13 - PC3 + PC, // 14 - PC4 - PWM + PC, // 15 - PC5 - PWM + PC, // 16 - PC6 - PWM + PC, // 17 - PC7 + PE, // 18 - PE6 - INT6 + PE, // 19 - PE7 - INT7 + PB, // 20 - PB0 + PB, // 21 - PB1 + PB, // 22 - PB2 + PB, // 23 - PB3 + PB, // 24 - PB4 - PWM + PB, // 25 - PB5 - PWM + PB, // 26 - PB6 - PWM + PB, // 27 - PB7 - PWM + PA, // 28 - PA0 + PA, // 29 - PA1 + PA, // 30 - PA2 + PA, // 31 - PA3 + PA, // 32 - PA4 + PA, // 33 - PA5 + PA, // 34 - PA6 + PA, // 35 - PA7 + PE, // 36 - PE4 - INT4 + PE, // 37 - PE5 - INT5 + PF, // 38 - PF0 - A0 + PF, // 39 - PF1 - A1 + PF, // 40 - PF2 - A2 + PF, // 41 - PF3 - A3 + PF, // 42 - PF4 - A4 + PF, // 43 - PF5 - A5 + PF, // 44 - PF6 - A6 + PF, // 45 - PF7 - A7 + PE, // 46 - PE2 (not defined in teensyduino) + PE, // 47 - PE3 (not defined in teensyduino) +}; + +#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) + +// digitalPinToBitMask(pin) is OK + +#define digitalRead_mod(p) extDigitalRead(p) // Teensyduino's version of digitalRead doesn't + // disable the PWMs so we can use it as is + +// portModeRegister(pin) is OK diff --git a/Marlin/src/HAL/AVR/pinsDebug_plus_70.h b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h new file mode 100644 index 00000000..db3fdf1f --- /dev/null +++ b/Marlin/src/HAL/AVR/pinsDebug_plus_70.h @@ -0,0 +1,329 @@ +/** + * 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 + +/** + * Structures for 2560 family boards that use more than 70 pins + */ + +#if MB(BQ_ZUM_MEGA_3D, MINIRAMBO, SCOOVO_X9H, TRIGORILLA_14) + #undef NUM_DIGITAL_PINS + #define NUM_DIGITAL_PINS 85 +#elif MB(MIGHTYBOARD_REVE) + #undef NUM_DIGITAL_PINS + #define NUM_DIGITAL_PINS 80 +#endif + +#define PA 1 +#define PB 2 +#define PC 3 +#define PD 4 +#define PE 5 +#define PF 6 +#define PG 7 +#define PH 8 +#define PJ 10 +#define PK 11 +#define PL 12 + +const uint8_t PROGMEM digital_pin_to_port_PGM_plus_70[] = { + // 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 ** + PG , // PG 3 ** 71 ** + PJ , // PJ 2 ** 72 ** + PJ , // PJ 3 ** 73 ** + PJ , // PJ 7 ** 74 ** + PJ , // PJ 4 ** 75 ** + PJ , // PJ 5 ** 76 ** + PJ , // PJ 6 ** 77 ** + PE , // PE 2 ** 78 ** + PE , // PE 6 ** 79 ** + PE , // PE 7 ** 80 ** + PD , // PD 4 ** 81 ** + PD , // PD 5 ** 82 ** + PD , // PD 6 ** 83 ** + PH , // PH 2 ** 84 ** + PH , // PH 7 ** 85 ** +}; + +#define digitalPinToPort_plus_70(P) ( pgm_read_byte( digital_pin_to_port_PGM_plus_70 + (P) ) ) + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM_plus_70[] = { + // 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 ** + _BV( 3 ) , // PG 3 ** 71 ** + _BV( 2 ) , // PJ 2 ** 72 ** + _BV( 3 ) , // PJ 3 ** 73 ** + _BV( 7 ) , // PJ 7 ** 74 ** + _BV( 4 ) , // PJ 4 ** 75 ** + _BV( 5 ) , // PJ 5 ** 76 ** + _BV( 6 ) , // PJ 6 ** 77 ** + _BV( 2 ) , // PE 2 ** 78 ** + _BV( 6 ) , // PE 6 ** 79 ** + _BV( 7 ) , // PE 7 ** 80 ** + _BV( 4 ) , // PD 4 ** 81 ** + _BV( 5 ) , // PD 5 ** 82 ** + _BV( 6 ) , // PD 6 ** 83 ** + _BV( 2 ) , // PH 2 ** 84 ** + _BV( 7 ) , // PH 7 ** 85 ** +}; + +#define digitalPinToBitMask_plus_70(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM_plus_70 + (P) ) ) + + +const uint8_t PROGMEM digital_pin_to_timer_PGM_plus_70[] = { + // 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 ** + NOT_ON_TIMER , // PG 3 ** 71 ** + NOT_ON_TIMER , // PJ 2 ** 72 ** + NOT_ON_TIMER , // PJ 3 ** 73 ** + NOT_ON_TIMER , // PJ 7 ** 74 ** + NOT_ON_TIMER , // PJ 4 ** 75 ** + NOT_ON_TIMER , // PJ 5 ** 76 ** + NOT_ON_TIMER , // PJ 6 ** 77 ** + NOT_ON_TIMER , // PE 2 ** 78 ** + NOT_ON_TIMER , // PE 6 ** 79 ** +}; + +#define digitalPinToTimer_plus_70(P) ( pgm_read_byte( digital_pin_to_timer_PGM_plus_70 + (P) ) ) + +/** + * Interrupts that are not implemented + * + * INT6 E6 79 + * INT7 E7 80 + * PCINT11 J2 72 + * PCINT12 J3 73 + * PCINT13 J4 75 + * PCINT14 J5 76 + * PCINT15 J6 77 + */ diff --git a/Marlin/src/HAL/AVR/spi_pins.h b/Marlin/src/HAL/AVR/spi_pins.h new file mode 100644 index 00000000..f3fa78e2 --- /dev/null +++ b/Marlin/src/HAL/AVR/spi_pins.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 + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + */ +#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined(__AVR_ATmega328P__) + #define AVR_SCK_PIN 13 + #define AVR_MISO_PIN 12 + #define AVR_MOSI_PIN 11 + #define AVR_SS_PIN 10 +#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) || defined(__AVR_ATmega1284P__) + #define AVR_SCK_PIN 7 + #define AVR_MISO_PIN 6 + #define AVR_MOSI_PIN 5 + #define AVR_SS_PIN 4 +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define AVR_SCK_PIN 52 + #define AVR_MISO_PIN 50 + #define AVR_MOSI_PIN 51 + #define AVR_SS_PIN 53 +#elif defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) + #define AVR_SCK_PIN 21 + #define AVR_MISO_PIN 23 + #define AVR_MOSI_PIN 22 + #define AVR_SS_PIN 20 +#elif defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) + #define AVR_SCK_PIN 10 + #define AVR_MISO_PIN 12 + #define AVR_MOSI_PIN 11 + #define AVR_SS_PIN 16 +#endif + +#ifndef SCK_PIN + #define SCK_PIN AVR_SCK_PIN +#endif +#ifndef MISO_PIN + #define MISO_PIN AVR_MISO_PIN +#endif +#ifndef MOSI_PIN + #define MOSI_PIN AVR_MOSI_PIN +#endif +#ifndef SS_PIN + #define SS_PIN AVR_SS_PIN +#endif diff --git a/Marlin/src/HAL/AVR/timers.h b/Marlin/src/HAL/AVR/timers.h new file mode 100644 index 00000000..82eb8b14 --- /dev/null +++ b/Marlin/src/HAL/AVR/timers.h @@ -0,0 +1,260 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 + +// ------------------------ +// Types +// ------------------------ + +typedef uint16_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFF + +// ------------------------ +// Defines +// ------------------------ + +#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 1 +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 0 +#endif + +#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0) + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_PRESCALE 8 +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A) +#define STEPPER_ISR_ENABLED() TEST(TIMSK1, OCIE1A) + +#define ENABLE_TEMPERATURE_INTERRUPT() SBI(TIMSK0, OCIE0B) +#define DISABLE_TEMPERATURE_INTERRUPT() CBI(TIMSK0, OCIE0B) +#define TEMPERATURE_ISR_ENABLED() TEST(TIMSK0, OCIE0B) + +FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t) { + switch (timer_num) { + case STEP_TIMER_NUM: + // waveform generation = 0100 = CTC + SET_WGM(1, CTC_OCRnA); + + // output mode = 00 (disconnected) + SET_COMA(1, NORMAL); + + // Set the timer pre-scaler + // Generally we use a divider of 8, resulting in a 2MHz timer + // frequency on a 16MHz MCU. If you are going to change this, be + // sure to regenerate speed_lookuptable.h with + // create_speed_lookuptable.py + SET_CS(1, PRESCALER_8); // CS 2 = 1/8 prescaler + + // Init Stepper ISR to 122 Hz for quick starting + // (F_CPU) / (STEPPER_TIMER_PRESCALE) / frequency + OCR1A = 0x4000; + TCNT1 = 0; + break; + + case TEMP_TIMER_NUM: + // Use timer0 for temperature measurement + // Interleave temperature interrupt with millies interrupt + OCR0B = 128; + break; + } +} + +#define TIMER_OCR_1 OCR1A +#define TIMER_COUNTER_1 TCNT1 + +#define TIMER_OCR_0 OCR0A +#define TIMER_COUNTER_0 TCNT0 + +#define _CAT(a,V...) a##V +#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare) +#define HAL_timer_get_compare(timer) _CAT(TIMER_OCR_, timer) +#define HAL_timer_get_count(timer) _CAT(TIMER_COUNTER_, timer) + +/** + * On AVR there is no hardware prioritization and preemption of + * interrupts, so this emulates it. The UART has first priority + * (otherwise, characters will be lost due to UART overflow). + * Then: Stepper, Endstops, Temperature, and -finally- all others. + */ +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) + +/* 18 cycles maximum latency */ +#ifndef HAL_STEP_TIMER_ISR + +#define HAL_STEP_TIMER_ISR() \ +extern "C" void TIMER1_COMPA_vect() __attribute__ ((signal, naked, used, externally_visible)); \ +extern "C" void TIMER1_COMPA_vect_bottom() asm ("TIMER1_COMPA_vect_bottom") __attribute__ ((used, externally_visible, noinline)); \ +void TIMER1_COMPA_vect() { \ + __asm__ __volatile__ ( \ + A("push r16") /* 2 Save R16 */ \ + A("in r16, __SREG__") /* 1 Get SREG */ \ + A("push r16") /* 2 Save SREG into stack */ \ + A("lds r16, %[timsk0]") /* 2 Load into R0 the Temperature timer Interrupt mask register */ \ + A("push r16") /* 2 Save TIMSK0 into the stack */ \ + A("andi r16,~%[msk0]") /* 1 Disable the temperature ISR */ \ + A("sts %[timsk0], r16") /* 2 And set the new value */ \ + A("lds r16, %[timsk1]") /* 2 Load into R0 the stepper timer Interrupt mask register [TIMSK1] */ \ + A("andi r16,~%[msk1]") /* 1 Disable the stepper ISR */ \ + A("sts %[timsk1], r16") /* 2 And set the new value */ \ + A("push r16") /* 2 Save TIMSK1 into stack */ \ + A("in r16, 0x3B") /* 1 Get RAMPZ register */ \ + A("push r16") /* 2 Save RAMPZ into stack */ \ + A("in r16, 0x3C") /* 1 Get EIND register */ \ + A("push r0") /* C runtime can modify all the following registers without restoring them */ \ + A("push r1") \ + A("push r18") \ + A("push r19") \ + A("push r20") \ + A("push r21") \ + A("push r22") \ + A("push r23") \ + A("push r24") \ + A("push r25") \ + A("push r26") \ + A("push r27") \ + A("push r30") \ + A("push r31") \ + A("clr r1") /* C runtime expects this register to be 0 */ \ + A("call TIMER1_COMPA_vect_bottom") /* Call the bottom handler - No inlining allowed, otherwise registers used are not saved */ \ + A("pop r31") \ + A("pop r30") \ + A("pop r27") \ + A("pop r26") \ + A("pop r25") \ + A("pop r24") \ + A("pop r23") \ + A("pop r22") \ + A("pop r21") \ + A("pop r20") \ + A("pop r19") \ + A("pop r18") \ + A("pop r1") \ + A("pop r0") \ + A("out 0x3C, r16") /* 1 Restore EIND register */ \ + A("pop r16") /* 2 Get the original RAMPZ register value */ \ + A("out 0x3B, r16") /* 1 Restore RAMPZ register to its original value */ \ + A("pop r16") /* 2 Get the original TIMSK1 value but with stepper ISR disabled */ \ + A("ori r16,%[msk1]") /* 1 Reenable the stepper ISR */ \ + A("cli") /* 1 Disable global interrupts - Reenabling Stepper ISR can reenter amd temperature can reenter, and we want that, if it happens, after this ISR has ended */ \ + A("sts %[timsk1], r16") /* 2 And restore the old value - This reenables the stepper ISR */ \ + A("pop r16") /* 2 Get the temperature timer Interrupt mask register [TIMSK0] */ \ + A("sts %[timsk0], r16") /* 2 And restore the old value - This reenables the temperature ISR */ \ + A("pop r16") /* 2 Get the old SREG value */ \ + A("out __SREG__, r16") /* 1 And restore the SREG value */ \ + A("pop r16") /* 2 Restore R16 value */ \ + A("reti") /* 4 Return from interrupt */ \ + : \ + : [timsk0] "i" ((uint16_t)&TIMSK0), \ + [timsk1] "i" ((uint16_t)&TIMSK1), \ + [msk0] "M" ((uint8_t)(1<. + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * 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. + */ + +#if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM) + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "../shared/Marduino.h" +#include "../shared/Delay.h" + +#include + +uint8_t u8g_bitData, u8g_bitNotData, u8g_bitClock, u8g_bitNotClock; +volatile uint8_t *u8g_outData, *u8g_outClock; + +static void u8g_com_arduino_init_shift_out(uint8_t dataPin, uint8_t clockPin) { + u8g_outData = portOutputRegister(digitalPinToPort(dataPin)); + u8g_outClock = portOutputRegister(digitalPinToPort(clockPin)); + u8g_bitData = digitalPinToBitMask(dataPin); + u8g_bitClock = digitalPinToBitMask(clockPin); + + u8g_bitNotClock = u8g_bitClock; + u8g_bitNotClock ^= 0xFF; + + u8g_bitNotData = u8g_bitData; + u8g_bitNotData ^= 0xFF; +} + +void u8g_spiSend_sw_AVR_mode_0(uint8_t val) { + uint8_t bitData = u8g_bitData, + bitNotData = u8g_bitNotData, + bitClock = u8g_bitClock, + bitNotClock = u8g_bitNotClock; + volatile uint8_t *outData = u8g_outData, + *outClock = u8g_outClock; + U8G_ATOMIC_START(); + LOOP_L_N(i, 8) { + if (val & 0x80) + *outData |= bitData; + else + *outData &= bitNotData; + *outClock |= bitClock; + val <<= 1; + *outClock &= bitNotClock; + } + U8G_ATOMIC_END(); +} + +void u8g_spiSend_sw_AVR_mode_3(uint8_t val) { + uint8_t bitData = u8g_bitData, + bitNotData = u8g_bitNotData, + bitClock = u8g_bitClock, + bitNotClock = u8g_bitNotClock; + volatile uint8_t *outData = u8g_outData, + *outClock = u8g_outClock; + U8G_ATOMIC_START(); + LOOP_L_N(i, 8) { + *outClock &= bitNotClock; + if (val & 0x80) + *outData |= bitData; + else + *outData &= bitNotData; + *outClock |= bitClock; + val <<= 1; + } + U8G_ATOMIC_END(); +} + + +#if ENABLED(FYSETC_MINI_12864) + #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_3 +#else + #define SPISEND_SW_AVR u8g_spiSend_sw_AVR_mode_0 +#endif + +uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]); + u8g_com_arduino_assign_pin_output_high(u8g); + u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); + u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, 0); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + #if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active + u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); + } + else { + u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); + u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive + } + #else + u8g_com_arduino_digital_write(u8g, U8G_PI_CS, !arg_val); + #endif + break; + + case U8G_COM_MSG_WRITE_BYTE: + SPISEND_SW_AVR(arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + SPISEND_SW_AVR(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + SPISEND_SW_AVR(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/AVR/watchdog.cpp b/Marlin/src/HAL/AVR/watchdog.cpp new file mode 100644 index 00000000..3f10c4ad --- /dev/null +++ b/Marlin/src/HAL/AVR/watchdog.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 . + * + */ +#ifdef __AVR__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +#include "../../MarlinCore.h" + +// Initialize watchdog with 8s timeout, if possible. Otherwise, make it 4s. +void watchdog_init() { + #if ENABLED(WATCHDOG_DURATION_8S) && defined(WDTO_8S) + #define WDTO_NS WDTO_8S + #else + #define WDTO_NS WDTO_4S + #endif + #if ENABLED(WATCHDOG_RESET_MANUAL) + // Enable the watchdog timer, but only for the interrupt. + // Take care, as this requires the correct order of operation, with interrupts disabled. + // See the datasheet of any AVR chip for details. + wdt_reset(); + cli(); + _WD_CONTROL_REG = _BV(_WD_CHANGE_BIT) | _BV(WDE); + _WD_CONTROL_REG = _BV(WDIE) | (WDTO_NS & 0x07) | ((WDTO_NS & 0x08) << 2); // WDTO_NS directly does not work. bit 0-2 are consecutive in the register but the highest value bit is at bit 5 + // So worked for up to WDTO_2S + sei(); + wdt_reset(); + #else + wdt_enable(WDTO_NS); // The function handles the upper bit correct. + #endif + //delay(10000); // test it! +} + +//=========================================================================== +//=================================== ISR =================================== +//=========================================================================== + +// Watchdog timer interrupt, called if main program blocks >4sec and manual reset is enabled. +#if ENABLED(WATCHDOG_RESET_MANUAL) + ISR(WDT_vect) { + sei(); // With the interrupt driven serial we need to allow interrupts. + SERIAL_ERROR_MSG(STR_WATCHDOG_FIRED); + minkill(); // interrupt-safe final kill and infinite loop + } +#endif + +#endif // USE_WATCHDOG +#endif // __AVR__ diff --git a/Marlin/src/HAL/AVR/watchdog.h b/Marlin/src/HAL/AVR/watchdog.h new file mode 100644 index 00000000..a16c88b3 --- /dev/null +++ b/Marlin/src/HAL/AVR/watchdog.h @@ -0,0 +1,31 @@ +/** + * 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 + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or AVR will go into emergency procedures. +inline void HAL_watchdog_refresh() { wdt_reset(); } diff --git a/Marlin/src/HAL/DUE/DebugMonitor.cpp b/Marlin/src/HAL/DUE/DebugMonitor.cpp new file mode 100644 index 00000000..79759151 --- /dev/null +++ b/Marlin/src/HAL/DUE/DebugMonitor.cpp @@ -0,0 +1,342 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../core/macros.h" +#include "../../core/serial.h" + +#include "../shared/backtrace/unwinder.h" +#include "../shared/backtrace/unwmemaccess.h" + +#include + +// Debug monitor that dumps to the Programming port all status when +// an exception or WDT timeout happens - And then resets the board + +// All the Monitor routines must run with interrupts disabled and +// under an ISR execution context. That is why we cannot reuse the +// Serial interrupt routines or any C runtime, as we don't know the +// state we are when running them + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); + +// (re)initialize UART0 as a monitor output to 250000,n,8,1 +static void TXBegin() { + + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( UART_IRQn ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( ID_UART ); + + // Configure PMC + pmc_enable_periph_clk( ID_UART ); + + // Disable PDC channel + UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds + UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); + + // Enable receiver and transmitter + UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; +} + +// Send character through UART with no interrupts +static void TX(char c) { + while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; + UART->UART_THR = c; +} + +// Send String through UART +static void TX(const char* s) { + while (*s) TX(*s++); +} + +static void TXDigit(uint32_t d) { + if (d < 10) TX((char)(d+'0')); + else if (d < 16) TX((char)(d+'A'-10)); + else TX('?'); +} + +// Send Hex number thru UART +static void TXHex(uint32_t v) { + TX("0x"); + for (uint8_t i = 0; i < 8; i++, v <<= 4) + TXDigit((v >> 28) & 0xF); +} + +// Send Decimal number thru UART +static void TXDec(uint32_t v) { + if (!v) { + TX('0'); + return; + } + + char nbrs[14]; + char *p = &nbrs[0]; + while (v != 0) { + *p++ = '0' + (v % 10); + v /= 10; + } + do { + p--; + TX(*p); + } while (p != &nbrs[0]); +} + +// Dump a backtrace entry +static bool UnwReportOut(void* ctx, const UnwReport* bte) { + int* p = (int*)ctx; + + (*p)++; + TX('#'); TXDec(*p); TX(" : "); + TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); + TX('+'); TXDec(bte->address - bte->function); + TX(" PC:");TXHex(bte->address); TX('\n'); + return true; +} + +#ifdef UNW_DEBUG + void UnwPrintf(const char* format, ...) { + char dest[256]; + va_list argptr; + va_start(argptr, format); + vsprintf(dest, format, argptr); + va_end(argptr); + TX(&dest[0]); + } +#endif + +/* Table of function pointers for passing to the unwinder */ +static const UnwindCallbacks UnwCallbacks = { + UnwReportOut, + UnwReadW, + UnwReadH, + UnwReadB + #ifdef UNW_DEBUG + , UnwPrintf + #endif +}; + +/** + * HardFaultHandler_C: + * This is called from the HardFault_HandlerAsm with a pointer the Fault stack + * as the parameter. We can then read the values from the stack and place them + * into local variables for ease of reading. + * We then read the various Fault Status and Address Registers to help decode + * cause of the fault. + * The function ends with a BKPT instruction to force control back into the debugger + */ +extern "C" +void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { + + static const char* causestr[] = { + "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" + }; + + UnwindFrame btf; + + // Dump report to the Programming port (interrupts are DISABLED) + TXBegin(); + TX("\n\n## Software Fault detected ##\n"); + TX("Cause: "); TX(causestr[cause]); TX('\n'); + + TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); + TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); + TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); + TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); + TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); + TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); + TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); + TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); + + // Configurable Fault Status Register + // Consists of MMSR, BFSR and UFSR + TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); + + // Hard Fault Status Register + TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); + + // Debug Fault Status Register + TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); + + // Auxiliary Fault Status Register + TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); + + // Read the Fault Address Registers. These may not contain valid values. + // Check BFARVALID/MMARVALID to see if they are valid values + // MemManage Fault Address Register + TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); + + // Bus Fault Address Register + TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); + + TX("ExcLR: "); TXHex(lr); TX('\n'); + TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); + + btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer + btf.fp = btf.sp; + btf.lr = ((unsigned long)sp[5]); + btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it + + // Perform a backtrace + TX("\nBacktrace:\n\n"); + int ctr = 0; + UnwindStart(&btf, &UnwCallbacks, &ctr); + + // Disable all NVIC interrupts + NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0xFFFFFFFF; + + // Relocate VTOR table to default position + SCB->VTOR = 0; + + // Disable USB + otg_disable(); + + // Restart watchdog + WDT_Restart(WDT); + + // Reset controller + NVIC_SystemReset(); + for (;;) WDT_Restart(WDT); +} + +__attribute__((naked)) void NMI_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#0") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void HardFault_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#1") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void MemManage_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#2") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void BusFault_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#3") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void UsageFault_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#4") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void DebugMon_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#5") + A("b HardFault_HandlerC") + ); +} + +/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ +__attribute__((naked)) void WDT_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#6") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void RSTC_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#7") + A("b HardFault_HandlerC") + ); +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp new file mode 100644 index 00000000..6ce85a46 --- /dev/null +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -0,0 +1,105 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 . + * + */ + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +#include +#include "usb/usb_task.h" + +// ------------------------ +// Public Variables +// ------------------------ + +uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +// HAL initialization task +void HAL_init() { + // Initialize the USB stack + #if ENABLED(SDSUPPORT) + OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up + #endif + usb_task_init(); +} + +// HAL idle task +void HAL_idletask() { + // Perform USB stack housekeeping + usb_task_idle(); +} + +// Disable interrupts +void cli() { noInterrupts(); } + +// Enable interrupts +void sei() { interrupts(); } + +void HAL_clear_reset_source() { } + +uint8_t HAL_get_reset_source() { + switch ((RSTC->RSTC_SR >> 8) & 0x07) { + case 0: return RST_POWER_ON; + case 1: return RST_BACKUP; + case 2: return RST_WATCHDOG; + case 3: return RST_SOFTWARE; + case 4: return RST_EXTERNAL; + default: return 0; + } +} + +void _delay_ms(const int delay_ms) { + // Todo: port for Due? + delay(delay_ms); +} + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// Return free memory between end of heap (or end bss) and whatever is current +int freeMemory() { + int free_memory, heap_end = (int)_sbrk(0); + return (int)&free_memory - (heap_end ?: (int)&_ebss); +} + +// ------------------------ +// ADC +// ------------------------ + +void HAL_adc_start_conversion(const uint8_t ch) { + HAL_adc_result = analogRead(ch); +} + +uint16_t HAL_adc_get_result() { + // nop + return HAL_adc_result; +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h new file mode 100644 index 00000000..88ace595 --- /dev/null +++ b/Marlin/src/HAL/DUE/HAL.h @@ -0,0 +1,167 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + */ + +#define CPU_32_BIT + +#include "../shared/Marduino.h" +#include "../shared/eeprom_if.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" + +#include + +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial + +// Define MYSERIAL0/1 before MarlinSerial includes! +#if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) + #define MYSERIAL0 customizedSerial1 +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#else + #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER) + #define MYSERIAL1 customizedSerial2 + #elif WITHIN(SERIAL_PORT_2, 0, 3) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #else + #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #endif +#endif + +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL lcdSerial + #elif WITHIN(LCD_SERIAL_PORT, 0, 3) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #else + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif +#endif + +#include "MarlinSerial.h" +#include "MarlinSerialUSB.h" + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +typedef int8_t pin_t; + +#define SHARED_SERVOS HAS_SERVOS +#define HAL_SERVO_LIB Servo + +// +// Interrupts +// +#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +void cli(); // Disable interrupts +void sei(); // Enable interrupts + +void HAL_clear_reset_source(); // clear reset reason +uint8_t HAL_get_reset_source(); // get reset reason + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +// +// ADC +// +extern uint16_t HAL_adc_result; // result of last ADC conversion + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) +#endif + +#define HAL_ANALOG_SELECT(ch) + +inline void HAL_adc_init() {}//todo + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t ch); +uint16_t HAL_adc_get_result(); + +// +// Pin Map +// +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +// +// Tone +// +void toneInit(); +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); +void noTone(const pin_t _pin); + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +void HAL_idletask(); +void HAL_init(); + +// +// Utility functions +// +void _delay_ms(const int delay); + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +int freeMemory(); +#pragma GCC diagnostic pop + +#ifdef __cplusplus + extern "C" { +#endif +char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s); +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp new file mode 100644 index 00000000..0451d8bc --- /dev/null +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -0,0 +1,825 @@ +/** + * 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 . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + * + * Completely rewritten and tuned by Eduardo José Tagle in 2017/2018 + * in ARM thumb2 inline assembler and tuned for maximum speed and performance + * allowing SPI clocks of up to 12 Mhz to increase SD card read/write performance + */ + +/** + * HAL for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +// ------------------------ +// Public functions +// ------------------------ + +#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI) + + // ------------------------ + // Software SPI + // ------------------------ + + // Make sure GCC optimizes this file. + // Note that this line triggers a bug in GCC which is fixed by casting. + // See the note below. + #pragma GCC optimize (3) + + typedef uint8_t (*pfnSpiTransfer)(uint8_t b); + typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte); + typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte); + + /* ---------------- Macros to be able to access definitions from asm */ + #define _PORT(IO) DIO ## IO ## _WPORT + #define _PIN_MASK(IO) MASK(DIO ## IO ## _PIN) + #define _PIN_SHIFT(IO) DIO ## IO ## _PIN + #define PORT(IO) _PORT(IO) + #define PIN_MASK(IO) _PIN_MASK(IO) + #define PIN_SHIFT(IO) _PIN_SHIFT(IO) + + // run at ~8 .. ~10Mhz - Tx version (Rx data discarded) + static uint8_t spiTransferTx0(uint8_t bout) { // using Mode 0 + uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ + uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + uint32_t idx = 0; + + /* Negate bout, as the assembler requires a negated value */ + bout = ~bout; + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + /* Bit 7 */ + A("ubfx %[idx],%[txval],#7,#1") /* Place bit 7 in bit 0 of idx*/ + + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#6,#1") /* Place bit 6 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 6 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#5,#1") /* Place bit 5 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 5 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#4,#1") /* Place bit 4 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 4 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#3,#1") /* Place bit 3 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 3 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#2,#1") /* Place bit 2 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 2 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#1,#1") /* Place bit 1 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 1 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[idx],%[txval],#0,#1") /* Place bit 0 in bit 0 of idx*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 0 */ + A("str %[mosi_mask],[%[mosi_port], %[idx],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("nop") /* Result will be 0 */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + : [idx]"+r"( idx ) + : [txval]"r"( bout ) , + [mosi_mask]"r"( MOSI_MASK ), + [mosi_port]"r"( MOSI_PORT_PLUS30 ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + + return 0; + } + + // Calculates the bit band alias address and returns a pointer address to word. + // addr: The byte address of bitbanding bit. + // bit: The bit position of bitbanding bit. + #define BITBAND_ADDRESS(addr, bit) \ + (((uint32_t)(addr) & 0xF0000000) + 0x02000000 + ((uint32_t)(addr)&0xFFFFF)*32 + (bit)*4) + + // run at ~8 .. ~10Mhz - Rx version (Tx line not altered) + static uint8_t spiTransferRx0(uint8_t) { // using Mode 0 + uint32_t bin = 0; + uint32_t work = 0; + uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + /* bit 7 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ + + /* bit 6 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ + + /* bit 5 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ + + /* bit 4 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ + + /* bit 3 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ + + /* bit 2 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ + + /* bit 1 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ + + /* bit 0 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ + + : [bin]"+r"(bin), + [work]"+r"(work) + : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + + return bin; + } + + // run at ~4Mhz + static uint8_t spiTransfer1(uint8_t b) { // using Mode 0 + int bits = 8; + do { + WRITE(MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(SCK_PIN, HIGH); + DELAY_NS(125); // 10 cycles @ 84mhz + + b |= (READ(MISO_PIN) != 0); + + WRITE(SCK_PIN, LOW); + DELAY_NS(125); // 10 cycles @ 84mhz + } while (--bits); + return b; + } + + // all the others + static uint32_t spiDelayCyclesX4 = (F_CPU) / 1000000; // 4µs => 125khz + + static uint8_t spiTransferX(uint8_t b) { // using Mode 0 + int bits = 8; + do { + WRITE(MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(SCK_PIN, HIGH); + __delay_4cycles(spiDelayCyclesX4); + + b |= (READ(MISO_PIN) != 0); + + WRITE(SCK_PIN, LOW); + __delay_4cycles(spiDelayCyclesX4); + } while (--bits); + return b; + } + + // Pointers to generic functions for byte transfers + + /** + * Note: The cast is unnecessary, but without it, this file triggers a GCC 4.8.3-2014 bug. + * Later GCC versions do not have this problem, but at this time (May 2018) Arduino still + * uses that buggy and obsolete GCC version!! + */ + static pfnSpiTransfer spiTransferRx = (pfnSpiTransfer)spiTransferX; + static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX; + + // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) + static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { + uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(MOSI_PIN)) + 0x30; /* SODR of port */ + uint32_t MOSI_MASK = PIN_MASK(MOSI_PIN); + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + uint32_t work = 0; + uint32_t txval = 0; + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + L("loop%=") + A("ldrb.w %[txval], [%[ptr]], #1") /* Load value to send, increment buffer */ + A("mvn %[txval],%[txval]") /* Negate value */ + + /* Bit 7 */ + A("ubfx %[work],%[txval],#7,#1") /* Place bit 7 in bit 0 of work*/ + + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#6,#1") /* Place bit 6 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 6 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#5,#1") /* Place bit 5 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 5 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#4,#1") /* Place bit 4 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 4 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#3,#1") /* Place bit 3 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 3 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#2,#1") /* Place bit 2 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 2 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#1,#1") /* Place bit 1 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 1 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ubfx %[work],%[txval],#0,#1") /* Place bit 0 in bit 0 of work*/ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + + /* Bit 0 */ + A("str %[mosi_mask],[%[mosi_port], %[work],LSL #2]") /* Access the proper SODR or CODR registers based on that bit */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bne.n loop%=") /* Repeat until done */ + + : [ptr]"+r" ( ptr ) , + [todo]"+r" ( todo ) , + [work]"+r"( work ) , + [txval]"+r"( txval ) + : [mosi_mask]"r"( MOSI_MASK ), + [mosi_port]"r"( MOSI_PORT_PLUS30 ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + } + + static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { + uint32_t bin = 0; + uint32_t work = 0; + uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(MISO_PIN))+0x3C, PIN_SHIFT(MISO_PIN)); /* PDSR of port in bitband area */ + uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SCK_PIN)) + 0x30; /* SODR of port */ + uint32_t SCK_MASK = PIN_MASK(SCK_PIN); + + /* The software SPI routine */ + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + + L("loop%=") + + /* bit 7 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#7,#1") /* Store read bit as the bit 7 */ + + /* bit 6 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#6,#1") /* Store read bit as the bit 6 */ + + /* bit 5 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#5,#1") /* Store read bit as the bit 5 */ + + /* bit 4 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#4,#1") /* Store read bit as the bit 4 */ + + /* bit 3 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#3,#1") /* Store read bit as the bit 3 */ + + /* bit 2 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#2,#1") /* Store read bit as the bit 2 */ + + /* bit 1 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#1,#1") /* Store read bit as the bit 1 */ + + /* bit 0 */ + A("str %[sck_mask],[%[sck_port]]") /* SODR */ + A("ldr %[work],[%[bitband_miso_port]]") /* PDSR on bitband area for required bit: work will be 1 or 0 based on port */ + A("str %[sck_mask],[%[sck_port],#0x4]") /* CODR */ + A("bfi %[bin],%[work],#0,#1") /* Store read bit as the bit 0 */ + + A("subs %[todo],#1") /* Decrement count of pending words to send, update status */ + A("strb.w %[bin], [%[ptr]], #1") /* Store read value into buffer, increment buffer pointer */ + A("bne.n loop%=") /* Repeat until done */ + + : [ptr]"+r"(ptr), + [todo]"+r"(todo), + [bin]"+r"(bin), + [work]"+r"(work) + : [bitband_miso_port]"r"( BITBAND_MISO_PORT ), + [sck_mask]"r"( SCK_MASK ), + [sck_port]"r"( SCK_PORT_PLUS30 ) + : "cc" + ); + } + + static void spiTxBlockX(const uint8_t* buf, uint32_t todo) { + do { + (void)spiTransferTx(*buf++); + } while (--todo); + } + + static void spiRxBlockX(uint8_t* buf, uint32_t todo) { + do { + *buf++ = spiTransferRx(0xFF); + } while (--todo); + } + + // Pointers to generic functions for block tranfers + static pfnSpiTxBlock spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + static pfnSpiRxBlock spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + + #if MB(ALLIGATOR) + #define _SS_WRITE(S) WRITE(SS_PIN, S) + #else + #define _SS_WRITE(S) NOOP + #endif + + void spiBegin() { + SET_OUTPUT(SS_PIN); + _SS_WRITE(HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + } + + uint8_t spiRec() { + _SS_WRITE(LOW); + WRITE(MOSI_PIN, HIGH); // Output 1s 1 + uint8_t b = spiTransferRx(0xFF); + _SS_WRITE(HIGH); + return b; + } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte) { + _SS_WRITE(LOW); + WRITE(MOSI_PIN, HIGH); // Output 1s 1 + spiRxBlock(buf, nbyte); + _SS_WRITE(HIGH); + } + } + + void spiSend(uint8_t b) { + _SS_WRITE(LOW); + (void)spiTransferTx(b); + _SS_WRITE(HIGH); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + _SS_WRITE(LOW); + (void)spiTransferTx(token); + spiTxBlock(buf, 512); + _SS_WRITE(HIGH); + } + + /** + * spiRate should be + * 0 : 8 - 10 MHz + * 1 : 4 - 5 MHz + * 2 : 2 - 2.5 MHz + * 3 : 1 - 1.25 MHz + * 4 : 500 - 625 kHz + * 5 : 250 - 312 kHz + * 6 : 125 - 156 kHz + */ + void spiInit(uint8_t spiRate) { + switch (spiRate) { + case 0: + spiTransferTx = (pfnSpiTransfer)spiTransferTx0; + spiTransferRx = (pfnSpiTransfer)spiTransferRx0; + spiTxBlock = (pfnSpiTxBlock)spiTxBlock0; + spiRxBlock = (pfnSpiRxBlock)spiRxBlock0; + break; + case 1: + spiTransferTx = (pfnSpiTransfer)spiTransfer1; + spiTransferRx = (pfnSpiTransfer)spiTransfer1; + spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + break; + default: + spiDelayCyclesX4 = ((F_CPU) / 1000000) >> (6 - spiRate); + spiTransferTx = (pfnSpiTransfer)spiTransferX; + spiTransferRx = (pfnSpiTransfer)spiTransferX; + spiTxBlock = (pfnSpiTxBlock)spiTxBlockX; + spiRxBlock = (pfnSpiRxBlock)spiRxBlockX; + break; + } + + _SS_WRITE(HIGH); + WRITE(MOSI_PIN, HIGH); + WRITE(SCK_PIN, LOW); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + } + + #pragma GCC reset_options + +#else // !SOFTWARE_SPI + + #define WHILE_TX(N) while ((SPI0->SPI_SR & SPI_SR_TDRE) == (N)) + #define WHILE_RX(N) while ((SPI0->SPI_SR & SPI_SR_RDRF) == (N)) + #define FLUSH_TX() do{ WHILE_RX(1) SPI0->SPI_RDR; }while(0) + + #if MB(ALLIGATOR) + + // slave selects controlled by SPI controller + // doesn't support changing SPI speeds for SD card + + // ------------------------ + // hardware SPI + // ------------------------ + static bool spiInitialized = false; + + void spiInit(uint8_t spiRate) { + if (spiInitialized) return; + + // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz + constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 }; + if (spiRate > 6) spiRate = 1; + + // Set SPI mode 1, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN_DAC, + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) | + SPI_CSR_DLYBCT(1)); + // Set SPI mode 0, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN_EEPROM1, SPI_CSR_NCPHA | + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) | + SPI_CSR_DLYBCT(1)); + + // Set SPI mode 0, clock, select not active after transfer, with delay between transfers + SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA | + SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDivider[spiRate]) | + SPI_CSR_DLYBCT(1)); + SPI_Enable(SPI0); + spiInitialized = true; + } + + void spiBegin() { + if (spiInitialized) return; + + // Configure SPI pins + PIO_Configure( + g_APinDescription[SCK_PIN].pPort, + g_APinDescription[SCK_PIN].ulPinType, + g_APinDescription[SCK_PIN].ulPin, + g_APinDescription[SCK_PIN].ulPinConfiguration); + PIO_Configure( + g_APinDescription[MOSI_PIN].pPort, + g_APinDescription[MOSI_PIN].ulPinType, + g_APinDescription[MOSI_PIN].ulPin, + g_APinDescription[MOSI_PIN].ulPinConfiguration); + PIO_Configure( + g_APinDescription[MISO_PIN].pPort, + g_APinDescription[MISO_PIN].ulPinType, + g_APinDescription[MISO_PIN].ulPin, + g_APinDescription[MISO_PIN].ulPinConfiguration); + + // set master mode, peripheral select, fault detection + SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PS); + SPI_Enable(SPI0); + + SET_OUTPUT(DAC0_SYNC); + #if HAS_MULTI_EXTRUDER + SET_OUTPUT(DAC1_SYNC); + WRITE(DAC1_SYNC, HIGH); + #endif + SET_OUTPUT(SPI_EEPROM1_CS); + SET_OUTPUT(SPI_EEPROM2_CS); + SET_OUTPUT(SPI_FLASH_CS); + WRITE(DAC0_SYNC, HIGH); + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM2_CS, HIGH); + WRITE(SPI_FLASH_CS, HIGH); + WRITE(SS_PIN, HIGH); + + OUT_WRITE(SDSS, LOW); + + PIO_Configure( + g_APinDescription[SPI_PIN].pPort, + g_APinDescription[SPI_PIN].ulPinType, + g_APinDescription[SPI_PIN].ulPin, + g_APinDescription[SPI_PIN].ulPinConfiguration + ); + + spiInit(1); + } + + // Read single byte from SPI + uint8_t spiRec() { + // write dummy byte with address and end transmission flag + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; + + WHILE_TX(0); + WHILE_RX(0); + + //DELAY_US(1U); + return SPI0->SPI_RDR; + } + + uint8_t spiRec(uint32_t chan) { + + WHILE_TX(0); + FLUSH_RX(); + + // write dummy byte with address and end transmission flag + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(chan) | SPI_TDR_LASTXFER; + WHILE_RX(0); + + return SPI0->SPI_RDR; + } + + // Read from SPI into buffer + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (!nbyte) return; + --nbyte; + for (int i = 0; i < nbyte; i++) { + //WHILE_TX(0); + SPI0->SPI_TDR = 0x000000FF | SPI_PCS(SPI_CHAN); + WHILE_RX(0); + buf[i] = SPI0->SPI_RDR; + //DELAY_US(1U); + } + buf[nbyte] = spiRec(); + } + + // Write single byte to SPI + void spiSend(const byte b) { + // write byte with address and end transmission flag + SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(SPI_CHAN) | SPI_TDR_LASTXFER; + WHILE_TX(0); + WHILE_RX(0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + + void spiSend(const uint8_t* buf, size_t nbyte) { + if (!nbyte) return; + --nbyte; + for (size_t i = 0; i < nbyte; i++) { + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); + WHILE_TX(0); + WHILE_RX(0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + spiSend(buf[nbyte]); + } + + void spiSend(uint32_t chan, byte b) { + WHILE_TX(0); + // write byte with address and end transmission flag + SPI0->SPI_TDR = (uint32_t)b | SPI_PCS(chan) | SPI_TDR_LASTXFER; + WHILE_RX(0); + FLUSH_RX(); + } + + void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { + if (!nbyte) return; + --nbyte; + for (size_t i = 0; i < nbyte; i++) { + WHILE_TX(0); + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(chan); + WHILE_RX(0); + FLUSH_RX(); + } + spiSend(chan, buf[nbyte]); + } + + // Write from buffer to SPI + void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN); + WHILE_TX(0); + //WHILE_RX(0); + //SPI0->SPI_RDR; + for (int i = 0; i < 511; i++) { + SPI0->SPI_TDR = (uint32_t)buf[i] | SPI_PCS(SPI_CHAN); + WHILE_TX(0); + WHILE_RX(0); + SPI0->SPI_RDR; + //DELAY_US(1U); + } + spiSend(buf[511]); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + } + + #else // U8G compatible hardware SPI + + #define SPI_MODE_0_DUE_HW 2 // DUE CPHA control bit is inverted + #define SPI_MODE_1_DUE_HW 3 + #define SPI_MODE_2_DUE_HW 0 + #define SPI_MODE_3_DUE_HW 1 + + /** + * The DUE SPI controller is set up so the upper word of the longword + * written to the transmit data register selects which SPI Chip Select + * Register is used. This allows different streams to have different SPI + * settings. + * + * In practice it's spooky. Some combinations hang the system, while others + * upset the peripheral device. + * + * SPI mode should be the same for all streams. The FYSETC_MINI_12864 gets + * upset if the clock phase changes after chip select goes active. + * + * SPI_CSR_CSAAT should be set for all streams. If not the WHILE_TX(0) + * macro returns immediately which can result in the SPI chip select going + * inactive before all the data has been sent. + * + * The TMC2130 library uses SPI0->SPI_CSR[3]. + * + * The U8G hardware SPI uses SPI0->SPI_CSR[0]. The system hangs and/or the + * FYSETC_MINI_12864 gets upset if lower baud rates are used and the SD card + * is inserted or removed. + * + * The SD card uses SPI0->SPI_CSR[3]. Efforts were made to use [1] and [2] + * but they all resulted in hangs or garbage on the LCD. + * + * The SPI controlled chip selects are NOT enabled in the GPIO controller. + * The application must control the chip select. + * + * All of the above can be avoided by defining FORCE_SOFT_SPI to force the + * display to use software SPI. + */ + + void spiInit(uint8_t spiRate=6) { // Default to slowest rate if not specified) + // Also sets U8G SPI rate to 4MHz and the SPI mode to 3 + + // 8.4 MHz, 4 MHz, 2 MHz, 1 MHz, 0.5 MHz, 0.329 MHz, 0.329 MHz + constexpr int spiDivider[] = { 10, 21, 42, 84, 168, 255, 255 }; + if (spiRate > 6) spiRate = 1; + + // Enable PIOA and SPI0 + REG_PMC_PCER0 = (1UL << ID_PIOA) | (1UL << ID_SPI0); + + // Disable PIO on A26 and A27 + REG_PIOA_PDR = 0x0C000000; + OUT_WRITE(SDSS, HIGH); + + // Reset SPI0 (from sam lib) + SPI0->SPI_CR = SPI_CR_SPIDIS; + SPI0->SPI_CR = SPI_CR_SWRST; + SPI0->SPI_CR = SPI_CR_SWRST; + SPI0->SPI_CR = SPI_CR_SPIEN; + + // TMC2103 compatible setup + // Master mode, no fault detection, PCS bits in data written to TDR select CSR register + SPI0->SPI_MR = SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS; + // SPI mode 3, 8 Bit data transfer, baud rate + SPI0->SPI_CSR[3] = SPI_CSR_SCBR(spiDivider[spiRate]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // use same CSR as TMC2130 + SPI0->SPI_CSR[0] = SPI_CSR_SCBR(spiDivider[1]) | SPI_CSR_CSAAT | SPI_MODE_3_DUE_HW; // U8G default to 4MHz + } + + void spiBegin() { spiInit(); } + + static uint8_t spiTransfer(uint8_t data) { + WHILE_TX(0); + SPI0->SPI_TDR = (uint32_t)data | 0x00070000UL; // Add TMC2130 PCS bits to every byte (use SPI0->SPI_CSR[3]) + WHILE_TX(0); + WHILE_RX(0); + return SPI0->SPI_RDR; + } + + uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); } + + void spiRead(uint8_t* buf, uint16_t nbyte) { + for (int i = 0; i < nbyte; i++) + buf[i] = spiTransfer(0xFF); + } + + void spiSend(uint8_t data) { spiTransfer(data); } + + void spiSend(const uint8_t* buf, size_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) + spiTransfer(buf[i]); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + spiTransfer(token); + for (uint16_t i = 0; i < 512; i++) + spiTransfer(buf[i]); + } + + #endif // !ALLIGATOR +#endif // !SOFTWARE_SPI + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/InterruptVectors.cpp b/Marlin/src/HAL/DUE/InterruptVectors.cpp new file mode 100644 index 00000000..e4e0ce99 --- /dev/null +++ b/Marlin/src/HAL/DUE/InterruptVectors.cpp @@ -0,0 +1,98 @@ +/** + * 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 . + * + */ + +/** + * InterruptVectors_Due.cpp - This module relocates the Interrupt vector table to SRAM, + * allowing to register new interrupt handlers at runtime. Specially valuable and needed + * because Arduino runtime allocates some interrupt handlers that we NEED to override to + * properly support extended functionality, as for example, USB host or USB device (MSD, MTP) + * and custom serial port handlers, and we don't actually want to modify and/or recompile the + * Arduino runtime. We just want to run as much as possible on Stock Arduino + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" +#include "InterruptVectors.h" + +/* The relocated Exception/Interrupt Table - According to the ARM + reference manual, alignment to 128 bytes should suffice, but in + practice, we need alignment to 256 bytes to make this work in all + cases */ +__attribute__ ((aligned(256))) +static DeviceVectors ram_tab = { nullptr }; + +/** + * This function checks if the exception/interrupt table is already in SRAM or not. + * If it is not, then it copies the ROM table to the SRAM and relocates the table + * by reprogramming the NVIC registers + */ +static pfnISR_Handler* get_relocated_table_addr() { + // Get the address of the interrupt/exception table + uint32_t isrtab = SCB->VTOR; + + // If already relocated, we are done! + if (isrtab >= IRAM0_ADDR) + return (pfnISR_Handler*)isrtab; + + // Get the address of the table stored in FLASH + const pfnISR_Handler* romtab = (const pfnISR_Handler*)isrtab; + + // Copy it to SRAM + memcpy(&ram_tab, romtab, sizeof(ram_tab)); + + // Disable global interrupts + CRITICAL_SECTION_START(); + + // Set the vector table base address to the SRAM copy + SCB->VTOR = (uint32_t)(&ram_tab); + + // Reenable interrupts + CRITICAL_SECTION_END(); + + // Return the address of the table + return (pfnISR_Handler*)(&ram_tab); +} + +pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler) { + // Get the address of the relocated table + pfnISR_Handler *isrtab = get_relocated_table_addr(); + + // Disable global interrupts + CRITICAL_SECTION_START(); + + // Get the original handler + pfnISR_Handler oldHandler = isrtab[irq + 16]; + + // Install the new one + isrtab[irq + 16] = newHandler; + + // Reenable interrupts + CRITICAL_SECTION_END(); + + // Return the original one + return oldHandler; +} + +#endif diff --git a/Marlin/src/HAL/DUE/InterruptVectors.h b/Marlin/src/HAL/DUE/InterruptVectors.h new file mode 100644 index 00000000..6faeb34b --- /dev/null +++ b/Marlin/src/HAL/DUE/InterruptVectors.h @@ -0,0 +1,45 @@ +/** + * 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 + +/** + * InterruptVectors_Due.h + * + * This module relocates the Interrupt vector table to SRAM, allowing new + * interrupt handlers to be added at runtime. This is required because the + * Arduino runtime steals interrupt handlers that Marlin MUST use to support + * extended functionality such as USB hosts and USB devices (MSD, MTP) and + * custom serial port handlers. Rather than modifying and/or recompiling the + * Arduino runtime, We just want to run as much as possible on Stock Arduino. + * + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ + +#ifdef ARDUINO_ARCH_SAM + +// ISR handler type +typedef void (*pfnISR_Handler)(); + +// Install a new interrupt vector handler for the given irq, returning the old one +pfnISR_Handler install_isr(IRQn_Type irq, pfnISR_Handler newHandler); + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp new file mode 100644 index 00000000..c9a372ee --- /dev/null +++ b/Marlin/src/HAL/DUE/MarlinSerial.cpp @@ -0,0 +1,641 @@ +/** + * 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 . + * + */ + +/** + * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#include "MarlinSerial.h" +#include "InterruptVectors.h" +#include "../../MarlinCore.h" + +template typename MarlinSerial::ring_buffer_r MarlinSerial::rx_buffer = { 0, 0, { 0 } }; +template typename MarlinSerial::ring_buffer_t MarlinSerial::tx_buffer = { 0 }; +template bool MarlinSerial::_written = false; +template uint8_t MarlinSerial::xon_xoff_state = MarlinSerial::XON_XOFF_CHAR_SENT | MarlinSerial::XON_CHAR; +template uint8_t MarlinSerial::rx_dropped_bytes = 0; +template uint8_t MarlinSerial::rx_buffer_overruns = 0; +template uint8_t MarlinSerial::rx_framing_errors = 0; +template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::rx_max_enqueued = 0; + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() asm volatile("": : :"memory"); + +#include "../../feature/e_parser.h" + +// (called with RX interrupts disabled) +template +FORCE_INLINE void MarlinSerial::store_rxd_char() { + + static EmergencyParser::State emergency_state; // = EP_RESET + + // Get the tail - Nothing can alter its value while we are at this ISR + const ring_buffer_pos_t t = rx_buffer.tail; + + // Get the head pointer + ring_buffer_pos_t h = rx_buffer.head; + + // Get the next element + ring_buffer_pos_t i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Read the character from the USART + uint8_t c = HWUART->UART_RHR; + + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the RX FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + // Calculate count of bytes stored into the RX buffer + + // Keep track of the maximum count of enqueued bytes + if (Cfg::MAX_RX_QUEUED) NOLESS(rx_max_enqueued, rx_count); + + if (Cfg::XONOFF) { + // If the last char that was sent was an XON + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XON_CHAR) { + + // Bytes stored into the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // If over 12.5% of RX buffer capacity, send XOFF before running out of + // RX buffer space .. 325 bytes @ 250kbits/s needed to let the host react + // and stop sending bytes. This translates to 13mS propagation time. + if (rx_count >= (Cfg::RX_SIZE) / 8) { + + // At this point, definitely no TX interrupt was executing, since the TX isr can't be preempted. + // Don't enable the TX interrupt here as a means to trigger the XOFF char, because if it happens + // to be in the middle of trying to disable the RX interrupt in the main program, eventually the + // enabling of the TX interrupt could be undone. The ONLY reliable thing this can do to ensure + // the sending of the XOFF char is to send it HERE AND NOW. + + // About to send the XOFF char + xon_xoff_state = XOFF_CHAR | XON_XOFF_CHAR_SENT; + + // Wait until the TX register becomes empty and send it - Here there could be a problem + // - While waiting for the TX register to empty, the RX register could receive a new + // character. This must also handle that situation! + uint32_t status; + while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { + + if (status & UART_SR_RXRDY) { + // We received a char while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Read the character from the USART + c = HWUART->UART_RHR; + + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + } + sw_barrier(); + } + + HWUART->UART_THR = XOFF_CHAR; + + // At this point there could be a race condition between the write() function + // and this sending of the XOFF char. This interrupt could happen between the + // wait to be empty TX buffer loop and the actual write of the character. Since + // the TX buffer is full because it's sending the XOFF char, the only way to be + // sure the write() function will succeed is to wait for the XOFF char to be + // completely sent. Since an extra character could be received during the wait + // it must also be handled! + while (!((status = HWUART->UART_SR) & UART_SR_TXRDY)) { + + if (status & UART_SR_RXRDY) { + // A char arrived while waiting for the TX buffer to be empty - Receive and process it! + + i = (ring_buffer_pos_t)(h + 1) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + + // Read the character from the USART + c = HWUART->UART_RHR; + + if (Cfg::EMERGENCYPARSER) emergency_parser.update(emergency_state, c); + + // If the character is to be stored at the index just before the tail + // (such that the head would advance to the current tail), the FIFO is + // full, so don't write the character or advance the head. + if (i != t) { + rx_buffer.buffer[h] = c; + h = i; + } + else if (Cfg::DROPPED_RX && !++rx_dropped_bytes) + --rx_dropped_bytes; + } + sw_barrier(); + } + + // At this point everything is ready. The write() function won't + // have any issues writing to the UART TX register if it needs to! + } + } + } + + // Store the new head value + rx_buffer.head = h; +} + +template +FORCE_INLINE void MarlinSerial::_tx_thr_empty_irq() { + if (Cfg::TX_SIZE > 0) { + // Read positions + uint8_t t = tx_buffer.tail; + const uint8_t h = tx_buffer.head; + + if (Cfg::XONOFF) { + // If an XON char is pending to be sent, do it now + if (xon_xoff_state == XON_CHAR) { + + // Send the character + HWUART->UART_THR = XON_CHAR; + + // Remember we sent it. + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + + // If nothing else to transmit, just disable TX interrupts. + if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; + + return; + } + } + + // If nothing to transmit, just disable TX interrupts. This could + // happen as the result of the non atomicity of the disabling of RX + // interrupts that could end reenabling TX interrupts as a side effect. + if (h == t) { + HWUART->UART_IDR = UART_IDR_TXRDY; + return; + } + + // There is something to TX, Send the next byte + const uint8_t c = tx_buffer.buffer[t]; + t = (t + 1) & (Cfg::TX_SIZE - 1); + HWUART->UART_THR = c; + tx_buffer.tail = t; + + // Disable interrupts if there is nothing to transmit following this byte + if (h == t) HWUART->UART_IDR = UART_IDR_TXRDY; + } +} + +template +void MarlinSerial::UART_ISR() { + const uint32_t status = HWUART->UART_SR; + + // Data received? + if (status & UART_SR_RXRDY) store_rxd_char(); + + if (Cfg::TX_SIZE > 0) { + // Something to send, and TX interrupts are enabled (meaning something to send)? + if ((status & UART_SR_TXRDY) && (HWUART->UART_IMR & UART_IMR_TXRDY)) _tx_thr_empty_irq(); + } + + // Acknowledge errors + if ((status & UART_SR_OVRE) || (status & UART_SR_FRAME)) { + if (Cfg::DROPPED_RX && (status & UART_SR_OVRE) && !++rx_dropped_bytes) --rx_dropped_bytes; + if (Cfg::RX_OVERRUNS && (status & UART_SR_OVRE) && !++rx_buffer_overruns) --rx_buffer_overruns; + if (Cfg::RX_FRAMING_ERRORS && (status & UART_SR_FRAME) && !++rx_framing_errors) --rx_framing_errors; + + // TODO: error reporting outside ISR + HWUART->UART_CR = UART_CR_RSTSTA; + } +} + +// Public Methods +template +void MarlinSerial::begin(const long baud_setting) { + + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( HWUART_IRQ ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( HWUART_IRQ_ID ); + + // Configure PMC + pmc_enable_periph_clk( HWUART_IRQ_ID ); + + // Disable PDC channel + HWUART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + HWUART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + HWUART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) + HWUART->UART_BRGR = (SystemCoreClock / (baud_setting << 4)); + + // Configure interrupts + HWUART->UART_IDR = 0xFFFFFFFF; + HWUART->UART_IER = UART_IER_RXRDY | UART_IER_OVRE | UART_IER_FRAME; + + // Install interrupt handler + install_isr(HWUART_IRQ, UART_ISR); + + // Configure priority. We need a very high priority to avoid losing characters + // and we need to be able to preempt the Stepper ISR and everything else! + // (this could probably be fixed by using DMA with the Serial port) + NVIC_SetPriority(HWUART_IRQ, 1); + + // Enable UART interrupt in NVIC + NVIC_EnableIRQ(HWUART_IRQ); + + // Enable receiver and transmitter + HWUART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; + + if (Cfg::TX_SIZE > 0) _written = false; +} + +template +void MarlinSerial::end() { + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( HWUART_IRQ ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + pmc_disable_periph_clk( HWUART_IRQ_ID ); +} + +template +int MarlinSerial::peek() { + const int v = rx_buffer.head == rx_buffer.tail ? -1 : rx_buffer.buffer[rx_buffer.tail]; + return v; +} + +template +int MarlinSerial::read() { + + const ring_buffer_pos_t h = rx_buffer.head; + ring_buffer_pos_t t = rx_buffer.tail; + + if (h == t) return -1; + + int v = rx_buffer.buffer[t]; + t = (ring_buffer_pos_t)(t + 1) & (Cfg::RX_SIZE - 1); + + // Advance tail + rx_buffer.tail = t; + + if (Cfg::XONOFF) { + // If the XOFF char was sent, or about to be sent... + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + // Get count of bytes in the RX buffer + const ring_buffer_pos_t rx_count = (ring_buffer_pos_t)(h - t) & (ring_buffer_pos_t)(Cfg::RX_SIZE - 1); + // When below 10% of RX buffer capacity, send XON before running out of RX buffer bytes + if (rx_count < (Cfg::RX_SIZE) / 10) { + if (Cfg::TX_SIZE > 0) { + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX isr. + HWUART->UART_IER = UART_IER_TXRDY; + } + else { + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = XON_CHAR; + } + } + } + } + + return v; +} + +template +typename MarlinSerial::ring_buffer_pos_t MarlinSerial::available() { + const ring_buffer_pos_t h = rx_buffer.head, t = rx_buffer.tail; + return (ring_buffer_pos_t)(Cfg::RX_SIZE + h - t) & (Cfg::RX_SIZE - 1); +} + +template +void MarlinSerial::flush() { + rx_buffer.tail = rx_buffer.head; + + if (Cfg::XONOFF) { + if ((xon_xoff_state & XON_XOFF_CHAR_MASK) == XOFF_CHAR) { + if (Cfg::TX_SIZE > 0) { + // Signal we want an XON character to be sent. + xon_xoff_state = XON_CHAR; + // Enable TX isr. + HWUART->UART_IER = UART_IER_TXRDY; + } + else { + // If not using TX interrupts, we must send the XON char now + xon_xoff_state = XON_CHAR | XON_XOFF_CHAR_SENT; + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = XON_CHAR; + } + } + } +} + +template +void MarlinSerial::write(const uint8_t c) { + _written = true; + + if (Cfg::TX_SIZE == 0) { + while (!(HWUART->UART_SR & UART_SR_TXRDY)) sw_barrier(); + HWUART->UART_THR = c; + } + else { + + // If the TX interrupts are disabled and the data register + // is empty, just write the byte to the data register and + // be done. This shortcut helps significantly improve the + // effective datarate at high (>500kbit/s) bitrates, where + // interrupt overhead becomes a slowdown. + // Yes, there is a race condition between the sending of the + // XOFF char at the RX isr, but it is properly handled there + if (!(HWUART->UART_IMR & UART_IMR_TXRDY) && (HWUART->UART_SR & UART_SR_TXRDY)) { + HWUART->UART_THR = c; + return; + } + + const uint8_t i = (tx_buffer.head + 1) & (Cfg::TX_SIZE - 1); + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Make room by polling if it is possible to transmit, and do so! + while (i == tx_buffer.tail) { + // If we can transmit another byte, do it. + if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); + // Make sure compiler rereads tx_buffer.tail + sw_barrier(); + } + } + else { + // Interrupts are enabled, just wait until there is space + while (i == tx_buffer.tail) sw_barrier(); + } + + // Store new char. head is always safe to move + tx_buffer.buffer[tx_buffer.head] = c; + tx_buffer.head = i; + + // Enable TX isr - Non atomic, but it will eventually enable TX isr + HWUART->UART_IER = UART_IER_TXRDY; + } +} + +template +void MarlinSerial::flushTX() { + // TX + + if (Cfg::TX_SIZE == 0) { + // No bytes written, no need to flush. This special case is needed since there's + // no way to force the TXC (transmit complete) bit to 1 during initialization. + if (!_written) return; + + // Wait until everything was transmitted + while (!(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + + } + else { + // If we have never written a byte, no need to flush. This special + // case is needed since there is no way to force the TXC (transmit + // complete) bit to 1 during initialization + if (!_written) return; + + // If global interrupts are disabled (as the result of being called from an ISR)... + if (!ISRS_ENABLED()) { + + // Wait until everything was transmitted - We must do polling, as interrupts are disabled + while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) { + // If there is more space, send an extra character + if (HWUART->UART_SR & UART_SR_TXRDY) _tx_thr_empty_irq(); + sw_barrier(); + } + + } + else { + // Wait until everything was transmitted + while (tx_buffer.head != tx_buffer.tail || !(HWUART->UART_SR & UART_SR_TXEMPTY)) sw_barrier(); + } + + // At this point nothing is queued anymore (DRIE is disabled) and + // the hardware finished transmission (TXC is set). + } +} + +/** + * Imports from print.h + */ + +template +void MarlinSerial::print(char c, int base) { + print((long)c, base); +} + +template +void MarlinSerial::print(unsigned char b, int base) { + print((unsigned long)b, base); +} + +template +void MarlinSerial::print(int n, int base) { + print((long)n, base); +} + +template +void MarlinSerial::print(unsigned int n, int base) { + print((unsigned long)n, base); +} + +template +void MarlinSerial::print(long n, int base) { + if (base == 0) write(n); + else if (base == 10) { + if (n < 0) { print('-'); n = -n; } + printNumber(n, 10); + } + else + printNumber(n, base); +} + +template +void MarlinSerial::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); +} + +template +void MarlinSerial::print(double n, int digits) { + printFloat(n, digits); +} + +template +void MarlinSerial::println() { + print('\r'); + print('\n'); +} + +template +void MarlinSerial::println(const String& s) { + print(s); + println(); +} + +template +void MarlinSerial::println(const char c[]) { + print(c); + println(); +} + +template +void MarlinSerial::println(char c, int base) { + print(c, base); + println(); +} + +template +void MarlinSerial::println(unsigned char b, int base) { + print(b, base); + println(); +} + +template +void MarlinSerial::println(int n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(unsigned int n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(long n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(unsigned long n, int base) { + print(n, base); + println(); +} + +template +void MarlinSerial::println(double n, int digits) { + print(n, digits); + println(); +} + +// Private Methods +template +void MarlinSerial::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); +} + +template +void MarlinSerial::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + LOOP_L_N(i, digits) rounding *= 0.1; + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } +} + +// If not using the USB port as serial port +#if SERIAL_PORT >= 0 + template class MarlinSerial>; // Define + MarlinSerial> customizedSerial1; // Instantiate +#endif + +#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 + template class MarlinSerial>; // Define + MarlinSerial> customizedSerial2; // Instantiate +#endif + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h new file mode 100644 index 00000000..a194eba2 --- /dev/null +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -0,0 +1,182 @@ +/** + * 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 + +/** + * MarlinSerial_Due.h - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ + +#include + +#include "../../inc/MarlinConfigPre.h" + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which rx_buffer_head is the index of the +// location to which to write the next incoming character and rx_buffer_tail +// is the index of the location from which to read. +// 256 is the max limit due to uint8_t head and tail. Use only powers of 2. (...,16,32,64,128,256) +#ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 +#endif +#ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 +#endif + +//#if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 +// #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." +//#elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) +// #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." +//#elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) +// #error "TX_BUFFER_SIZE must be 0, a power of 2 greater than 1, and no greater than 256." +//#endif + +// Templated type selector +template struct TypeSelector { typedef T type;} ; +template struct TypeSelector { typedef F type; }; + +// Templated structure wrapper +template struct StructWrapper { + constexpr StructWrapper(int) {} + FORCE_INLINE S* operator->() const { return (S*)addr; } +}; + +template +class MarlinSerial { +protected: + // Information for all supported UARTs + static constexpr uint32_t BASES[] = {0x400E0800U, 0x40098000U, 0x4009C000U, 0x400A0000U, 0x400A4000U}; + static constexpr IRQn_Type IRQS[] = { UART_IRQn, USART0_IRQn, USART1_IRQn, USART2_IRQn, USART3_IRQn}; + static constexpr int IRQ_IDS[] = { ID_UART, ID_USART0, ID_USART1, ID_USART2, ID_USART3}; + + // Alias for shorter code + static constexpr StructWrapper HWUART = 0; + static constexpr IRQn_Type HWUART_IRQ = IRQS[Cfg::PORT]; + static constexpr int HWUART_IRQ_ID = IRQ_IDS[Cfg::PORT]; + + // Base size of type on buffer size + typedef typename TypeSelector<(Cfg::RX_SIZE>256), uint16_t, uint8_t>::type ring_buffer_pos_t; + + struct ring_buffer_r { + volatile ring_buffer_pos_t head, tail; + unsigned char buffer[Cfg::RX_SIZE]; + }; + + struct ring_buffer_t { + volatile uint8_t head, tail; + unsigned char buffer[Cfg::TX_SIZE]; + }; + + static ring_buffer_r rx_buffer; + static ring_buffer_t tx_buffer; + static bool _written; + + static constexpr uint8_t XON_XOFF_CHAR_SENT = 0x80, // XON / XOFF Character was sent + XON_XOFF_CHAR_MASK = 0x1F; // XON / XOFF character to send + + // XON / XOFF character definitions + static constexpr uint8_t XON_CHAR = 17, XOFF_CHAR = 19; + static uint8_t xon_xoff_state, + rx_dropped_bytes, + rx_buffer_overruns, + rx_framing_errors; + static ring_buffer_pos_t rx_max_enqueued; + + FORCE_INLINE static void store_rxd_char(); + FORCE_INLINE static void _tx_thr_empty_irq(); + static void UART_ISR(); + +public: + MarlinSerial() {}; + static void begin(const long); + static void end(); + static int peek(); + static int read(); + static void flush(); + static ring_buffer_pos_t available(); + static void write(const uint8_t c); + static void flushTX(); + + static inline bool emergency_parser_enabled() { return Cfg::EMERGENCYPARSER; } + + FORCE_INLINE static uint8_t dropped() { return Cfg::DROPPED_RX ? rx_dropped_bytes : 0; } + FORCE_INLINE static uint8_t buffer_overruns() { return Cfg::RX_OVERRUNS ? rx_buffer_overruns : 0; } + FORCE_INLINE static uint8_t framing_errors() { return Cfg::RX_FRAMING_ERRORS ? rx_framing_errors : 0; } + FORCE_INLINE static ring_buffer_pos_t rxMaxEnqueued() { return Cfg::MAX_RX_QUEUED ? rx_max_enqueued : 0; } + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = 0); + static void print(unsigned char, int = 0); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = 0); + static void println(unsigned char, int = 0); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(); + operator bool() { return true; } + +private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); +}; + +// Serial port configuration +template +struct MarlinSerialCfg { + static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = RX_BUFFER_SIZE; + static constexpr unsigned int TX_SIZE = TX_BUFFER_SIZE; + static constexpr bool XONOFF = ENABLED(SERIAL_XON_XOFF); + static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); + static constexpr bool DROPPED_RX = ENABLED(SERIAL_STATS_DROPPED_RX); + static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); + static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); + static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); +}; + +#if SERIAL_PORT >= 0 + extern MarlinSerial> customizedSerial1; +#endif + +#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 + extern MarlinSerial> customizedSerial2; +#endif diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp new file mode 100644 index 00000000..a41dbfeb --- /dev/null +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp @@ -0,0 +1,290 @@ +/** + * 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 . + * + */ + +/** + * MarlinSerial_Due.cpp - Hardware serial library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti. All right reserved. + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if HAS_USB_SERIAL + +#include "MarlinSerialUSB.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +// Imports from Atmel USB Stack/CDC implementation +extern "C" { + bool usb_task_cdc_isenabled(); + bool usb_task_cdc_dtr_active(); + bool udi_cdc_is_rx_ready(); + int udi_cdc_getc(); + bool udi_cdc_is_tx_ready(); + int udi_cdc_putc(int value); +}; + +// Pending character +static int pending_char = -1; + +#if ENABLED(EMERGENCY_PARSER) + static EmergencyParser::State emergency_state; // = EP_RESET +#endif + +// Public Methods +void MarlinSerialUSB::begin(const long) {} + +void MarlinSerialUSB::end() {} + +int MarlinSerialUSB::peek() { + if (pending_char >= 0) + return pending_char; + + // If USB CDC not enumerated or not configured on the PC side + if (!usb_task_cdc_isenabled()) + return -1; + + // If no bytes sent from the PC + if (!udi_cdc_is_rx_ready()) + return -1; + + pending_char = udi_cdc_getc(); + + TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)pending_char)); + + return pending_char; +} + +int MarlinSerialUSB::read() { + if (pending_char >= 0) { + int ret = pending_char; + pending_char = -1; + return ret; + } + + // If USB CDC not enumerated or not configured on the PC side + if (!usb_task_cdc_isenabled()) + return -1; + + // If no bytes sent from the PC + if (!udi_cdc_is_rx_ready()) + return -1; + + int c = udi_cdc_getc(); + + TERN_(EMERGENCY_PARSER, emergency_parser.update(emergency_state, (char)c)); + + return c; +} + +bool MarlinSerialUSB::available() { + /* If Pending chars */ + return pending_char >= 0 || + /* or USB CDC enumerated and configured on the PC side and some + bytes where sent to us */ + (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); +} + +void MarlinSerialUSB::flush() { } +void MarlinSerialUSB::flushTX() { } + +void MarlinSerialUSB::write(const uint8_t c) { + + /* Do not even bother sending anything if USB CDC is not enumerated + or not configured on the PC side or there is no program on the PC + listening to our messages */ + if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) + return; + + /* Wait until the PC has read the pending to be sent data */ + while (usb_task_cdc_isenabled() && + usb_task_cdc_dtr_active() && + !udi_cdc_is_tx_ready()) { + }; + + /* Do not even bother sending anything if USB CDC is not enumerated + or not configured on the PC side or there is no program on the PC + listening to our messages at this point */ + if (!usb_task_cdc_isenabled() || !usb_task_cdc_dtr_active()) + return; + + // Fifo full + // udi_cdc_signal_overrun(); + udi_cdc_putc(c); +} + +/** + * Imports from print.h + */ + +void MarlinSerialUSB::print(char c, int base) { + print((long)c, base); +} + +void MarlinSerialUSB::print(unsigned char b, int base) { + print((unsigned long)b, base); +} + +void MarlinSerialUSB::print(int n, int base) { + print((long)n, base); +} + +void MarlinSerialUSB::print(unsigned int n, int base) { + print((unsigned long)n, base); +} + +void MarlinSerialUSB::print(long n, int base) { + if (base == 0) + write(n); + else if (base == 10) { + if (n < 0) { + print('-'); + n = -n; + } + printNumber(n, 10); + } + else + printNumber(n, base); +} + +void MarlinSerialUSB::print(unsigned long n, int base) { + if (base == 0) write(n); + else printNumber(n, base); +} + +void MarlinSerialUSB::print(double n, int digits) { + printFloat(n, digits); +} + +void MarlinSerialUSB::println() { + print('\r'); + print('\n'); +} + +void MarlinSerialUSB::println(const String& s) { + print(s); + println(); +} + +void MarlinSerialUSB::println(const char c[]) { + print(c); + println(); +} + +void MarlinSerialUSB::println(char c, int base) { + print(c, base); + println(); +} + +void MarlinSerialUSB::println(unsigned char b, int base) { + print(b, base); + println(); +} + +void MarlinSerialUSB::println(int n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(unsigned int n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(long n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(unsigned long n, int base) { + print(n, base); + println(); +} + +void MarlinSerialUSB::println(double n, int digits) { + print(n, digits); + println(); +} + +// Private Methods + +void MarlinSerialUSB::printNumber(unsigned long n, uint8_t base) { + if (n) { + unsigned char buf[8 * sizeof(long)]; // Enough space for base 2 + int8_t i = 0; + while (n) { + buf[i++] = n % base; + n /= base; + } + while (i--) + print((char)(buf[i] + (buf[i] < 10 ? '0' : 'A' - 10))); + } + else + print('0'); +} + +void MarlinSerialUSB::printFloat(double number, uint8_t digits) { + // Handle negative numbers + if (number < 0.0) { + print('-'); + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + LOOP_L_N(i, digits) + rounding *= 0.1; + + number += rounding; + + // Extract the integer part of the number and print it + unsigned long int_part = (unsigned long)number; + double remainder = number - (double)int_part; + print(int_part); + + // Print the decimal point, but only if there are digits beyond + if (digits) { + print('.'); + // Extract digits from the remainder one at a time + while (digits--) { + remainder *= 10.0; + int toPrint = int(remainder); + print(toPrint); + remainder -= toPrint; + } + } +} + +// Preinstantiate +#if SERIAL_PORT == -1 + MarlinSerialUSB customizedSerial1; +#endif +#if SERIAL_PORT_2 == -1 + MarlinSerialUSB customizedSerial2; +#endif + +#endif // HAS_USB_SERIAL +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h new file mode 100644 index 00000000..2e3622e5 --- /dev/null +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -0,0 +1,99 @@ +/** + * 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 + +/** + * MarlinSerialUSB_Due.h - Hardware Serial over USB (CDC) library for Arduino DUE + * Copyright (c) 2017 Eduardo José Tagle. All right reserved + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_USB_SERIAL + +#include + +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 + +class MarlinSerialUSB { + +public: + MarlinSerialUSB() {}; + static void begin(const long); + static void end(); + static int peek(); + static int read(); + static void flush(); + static void flushTX(); + static bool available(); + static void write(const uint8_t c); + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE static uint32_t dropped() { return 0; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE static int rxMaxEnqueued() { return 0; } + #endif + + FORCE_INLINE static void write(const char* str) { while (*str) write(*str++); } + FORCE_INLINE static void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE static void print(const String& s) { for (int i = 0; i < (int)s.length(); i++) write(s[i]); } + FORCE_INLINE static void print(const char* str) { write(str); } + + static void print(char, int = 0); + static void print(unsigned char, int = 0); + static void print(int, int = DEC); + static void print(unsigned int, int = DEC); + static void print(long, int = DEC); + static void print(unsigned long, int = DEC); + static void print(double, int = 2); + + static void println(const String& s); + static void println(const char[]); + static void println(char, int = 0); + static void println(unsigned char, int = 0); + static void println(int, int = DEC); + static void println(unsigned int, int = DEC); + static void println(long, int = DEC); + static void println(unsigned long, int = DEC); + static void println(double, int = 2); + static void println(); + operator bool() { return true; } + +private: + static void printNumber(unsigned long, const uint8_t); + static void printFloat(double, uint8_t); +}; + +#if SERIAL_PORT == -1 + extern MarlinSerialUSB customizedSerial1; +#endif + +#if SERIAL_PORT_2 == -1 + extern MarlinSerialUSB customizedSerial2; +#endif + +#endif // HAS_USB_SERIAL diff --git a/Marlin/src/HAL/DUE/Servo.cpp b/Marlin/src/HAL/DUE/Servo.cpp new file mode 100644 index 00000000..5524aa9c --- /dev/null +++ b/Marlin/src/HAL/DUE/Servo.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 . + * + */ + +/* + Copyright (c) 2013 Arduino LLC. 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 +*/ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "../shared/servo.h" +#include "../shared/servo_private.h" + +static volatile int8_t Channel[_Nbr_16timers]; // counter for the servo being pulsed for each timer (or -1 if refresh interval) + +// ------------------------ +/// Interrupt handler for the TC0 channel 1. +// ------------------------ +void Servo_Handler(timer16_Sequence_t timer, Tc *pTc, uint8_t channel); + +#ifdef _useTimer1 + void HANDLER_FOR_TIMER1() { Servo_Handler(_timer1, TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); } +#endif +#ifdef _useTimer2 + void HANDLER_FOR_TIMER2() { Servo_Handler(_timer2, TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); } +#endif +#ifdef _useTimer3 + void HANDLER_FOR_TIMER3() { Servo_Handler(_timer3, TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); } +#endif +#ifdef _useTimer4 + void HANDLER_FOR_TIMER4() { Servo_Handler(_timer4, TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); } +#endif +#ifdef _useTimer5 + void HANDLER_FOR_TIMER5() { Servo_Handler(_timer5, TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); } +#endif + +void Servo_Handler(timer16_Sequence_t timer, Tc *tc, uint8_t channel) { + // clear interrupt + tc->TC_CHANNEL[channel].TC_SR; + if (Channel[timer] < 0) + tc->TC_CHANNEL[channel].TC_CCR |= TC_CCR_SWTRG; // channel set to -1 indicated that refresh interval completed so reset the timer + else if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && SERVO(timer, Channel[timer]).Pin.isActive) + extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, LOW); // pulse this channel low if activated + + Channel[timer]++; // increment to the next channel + if (SERVO_INDEX(timer, Channel[timer]) < ServoCount && Channel[timer] < SERVOS_PER_TIMER) { + tc->TC_CHANNEL[channel].TC_RA = tc->TC_CHANNEL[channel].TC_CV + SERVO(timer,Channel[timer]).ticks; + if (SERVO(timer,Channel[timer]).Pin.isActive) // check if activated + extDigitalWrite(SERVO(timer, Channel[timer]).Pin.nbr, HIGH); // its an active channel so pulse it high + } + else { + // finished all channels so wait for the refresh period to expire before starting over + tc->TC_CHANNEL[channel].TC_RA = + tc->TC_CHANNEL[channel].TC_CV < usToTicks(REFRESH_INTERVAL) - 4 + ? (unsigned int)usToTicks(REFRESH_INTERVAL) // allow a few ticks to ensure the next OCR1A not missed + : tc->TC_CHANNEL[channel].TC_CV + 4; // at least REFRESH_INTERVAL has elapsed + Channel[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + } +} + +static void _initISR(Tc *tc, uint32_t channel, uint32_t id, IRQn_Type irqn) { + pmc_enable_periph_clk(id); + TC_Configure(tc, channel, + TC_CMR_TCCLKS_TIMER_CLOCK3 | // MCK/32 + TC_CMR_WAVE | // Waveform mode + TC_CMR_WAVSEL_UP_RC ); // Counter running up and reset when equals to RC + + /* 84MHz, MCK/32, for 1.5ms: 3937 */ + TC_SetRA(tc, channel, 2625); // 1ms + + /* Configure and enable interrupt */ + NVIC_EnableIRQ(irqn); + // TC_IER_CPAS: RA Compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPAS; + + // Enables the timer clock and performs a software reset to start the counting + TC_Start(tc, channel); +} + +void initISR(timer16_Sequence_t timer) { + #ifdef _useTimer1 + if (timer == _timer1) + _initISR(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1, ID_TC_FOR_TIMER1, IRQn_FOR_TIMER1); + #endif + #ifdef _useTimer2 + if (timer == _timer2) + _initISR(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2, ID_TC_FOR_TIMER2, IRQn_FOR_TIMER2); + #endif + #ifdef _useTimer3 + if (timer == _timer3) + _initISR(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3, ID_TC_FOR_TIMER3, IRQn_FOR_TIMER3); + #endif + #ifdef _useTimer4 + if (timer == _timer4) + _initISR(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4, ID_TC_FOR_TIMER4, IRQn_FOR_TIMER4); + #endif + #ifdef _useTimer5 + if (timer == _timer5) + _initISR(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5, ID_TC_FOR_TIMER5, IRQn_FOR_TIMER5); + #endif +} + +void finISR(timer16_Sequence_t) { + #ifdef _useTimer1 + TC_Stop(TC_FOR_TIMER1, CHANNEL_FOR_TIMER1); + #endif + #ifdef _useTimer2 + TC_Stop(TC_FOR_TIMER2, CHANNEL_FOR_TIMER2); + #endif + #ifdef _useTimer3 + TC_Stop(TC_FOR_TIMER3, CHANNEL_FOR_TIMER3); + #endif + #ifdef _useTimer4 + TC_Stop(TC_FOR_TIMER4, CHANNEL_FOR_TIMER4); + #endif + #ifdef _useTimer5 + TC_Stop(TC_FOR_TIMER5, CHANNEL_FOR_TIMER5); + #endif +} + +#endif // HAS_SERVOS + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/ServoTimers.h b/Marlin/src/HAL/DUE/ServoTimers.h new file mode 100644 index 00000000..c32c9382 --- /dev/null +++ b/Marlin/src/HAL/DUE/ServoTimers.h @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2013 Arduino LLC. 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 + */ + +/** + * Defines for 16 bit timers used with Servo library + * + * If _useTimerX is defined then TimerX is a 32 bit timer on the current board + * timer16_Sequence_t enumerates the sequence that the timers should be allocated + * _Nbr_16timers indicates how many timers are available. + */ + +/** + * SAM Only definitions + * -------------------- + */ + +// For SAM3X: +//!#define _useTimer1 +//!#define _useTimer2 +#define _useTimer3 +//!#define _useTimer4 +#define _useTimer5 + +#define TRIM_DURATION 2 // compensation ticks to trim adjust for digitalWrite delays +#define SERVO_TIMER_PRESCALER 32 // timer prescaler + +/* + TC0, chan 0 => TC0_Handler + TC0, chan 1 => TC1_Handler + TC0, chan 2 => TC2_Handler + TC1, chan 0 => TC3_Handler + TC1, chan 1 => TC4_Handler + TC1, chan 2 => TC5_Handler + TC2, chan 0 => TC6_Handler + TC2, chan 1 => TC7_Handler + TC2, chan 2 => TC8_Handler + */ + +#ifdef _useTimer1 + #define TC_FOR_TIMER1 TC1 + #define CHANNEL_FOR_TIMER1 0 + #define ID_TC_FOR_TIMER1 ID_TC3 + #define IRQn_FOR_TIMER1 TC3_IRQn + #define HANDLER_FOR_TIMER1 TC3_Handler +#endif +#ifdef _useTimer2 + #define TC_FOR_TIMER2 TC1 + #define CHANNEL_FOR_TIMER2 1 + #define ID_TC_FOR_TIMER2 ID_TC4 + #define IRQn_FOR_TIMER2 TC4_IRQn + #define HANDLER_FOR_TIMER2 TC4_Handler +#endif +#ifdef _useTimer3 + #define TC_FOR_TIMER3 TC1 + #define CHANNEL_FOR_TIMER3 2 + #define ID_TC_FOR_TIMER3 ID_TC5 + #define IRQn_FOR_TIMER3 TC5_IRQn + #define HANDLER_FOR_TIMER3 TC5_Handler +#endif +#ifdef _useTimer4 + #define TC_FOR_TIMER4 TC0 + #define CHANNEL_FOR_TIMER4 2 + #define ID_TC_FOR_TIMER4 ID_TC2 + #define IRQn_FOR_TIMER4 TC2_IRQn + #define HANDLER_FOR_TIMER4 TC2_Handler +#endif +#ifdef _useTimer5 + #define TC_FOR_TIMER5 TC0 + #define CHANNEL_FOR_TIMER5 0 + #define ID_TC_FOR_TIMER5 ID_TC0 + #define IRQn_FOR_TIMER5 TC0_IRQn + #define HANDLER_FOR_TIMER5 TC0_Handler +#endif + +typedef enum : unsigned char { + #ifdef _useTimer1 + _timer1, + #endif + #ifdef _useTimer2 + _timer2, + #endif + #ifdef _useTimer3 + _timer3, + #endif + #ifdef _useTimer4 + _timer4, + #endif + #ifdef _useTimer5 + _timer5, + #endif + _Nbr_16timers +} timer16_Sequence_t; diff --git a/Marlin/src/HAL/DUE/Tone.cpp b/Marlin/src/HAL/DUE/Tone.cpp new file mode 100644 index 00000000..9beb6022 --- /dev/null +++ b/Marlin/src/HAL/DUE/Tone.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 + * + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 . + * + */ + +/** + * Description: Tone function for Arduino Due and compatible (SAM3X8E) + * Derived from https://forum.arduino.cc/index.php?topic=136500.msg2903012#msg2903012 + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +static pin_t tone_pin; +volatile static int32_t toggles; + +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration) { + tone_pin = _pin; + toggles = 2 * frequency * duration / 1000; + HAL_timer_start(TONE_TIMER_NUM, 2 * frequency); +} + +void noTone(const pin_t _pin) { + HAL_timer_disable_interrupt(TONE_TIMER_NUM); + extDigitalWrite(_pin, LOW); +} + +HAL_TONE_TIMER_ISR() { + static uint8_t pin_state = 0; + HAL_timer_isr_prologue(TONE_TIMER_NUM); + + if (toggles) { + toggles--; + extDigitalWrite(tone_pin, (pin_state ^= 1)); + } + else noTone(tone_pin); // turn off interrupt +} + +#endif // ARDUINO_ARCH_SAM 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 new file mode 100644 index 00000000..be4b49c0 --- /dev/null +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_shared_hw_spi.cpp @@ -0,0 +1,149 @@ +/** + * 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 . + * + */ + + +/** + * Based on u8g_com_msp430_hw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2012, 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. + */ + +#ifdef __SAM3X8E__ + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include + +#include "../../../MarlinCore.h" + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +#include "../../shared/Marduino.h" +#include "../fastio.h" + +void u8g_SetPIOutput_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index) { + PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, + g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT +} + +void u8g_SetPILevel_DUE_hw_spi(u8g_t *u8g, uint8_t pin_index, uint8_t level) { + volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; + uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; + if (level) port->PIO_SODR = mask; + else port->PIO_CODR = mask; +} + +uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_INIT: + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, 1); + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, 1); + + u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_CS); + u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_A0); + + u8g_Delay(5); + + spiBegin(); + + #ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card + #endif + spiInit(2); + + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); + break; + + case U8G_COM_MSG_RESET: + break; + + case U8G_COM_MSG_WRITE_BYTE: + + spiSend((uint8_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB + +#endif // __SAM3X8E__ 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 new file mode 100644 index 00000000..47060d6a --- /dev/null +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_st7920_sw_spi.cpp @@ -0,0 +1,185 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * 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. + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(U8GLIB_ST7920) + +#include "../../shared/Delay.h" + +#include + +#include "u8g_com_HAL_DUE_sw_spi_shared.h" + +#define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0 + +static uint8_t rs_last_state = 255; + +static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { + if (rs != rs_last_state) { // time to send a command/data byte + rs_last_state = rs; + SPISEND_SW_DUE(rs ? 0x0FA : 0x0F8); // Command or Data + DELAY_US(40); // give the controller some time to process the data: 20 is bad, 30 is OK, 40 is safe + } + SPISEND_SW_DUE(val & 0xF0); + SPISEND_SW_DUE(val << 4); +} + +uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; + SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; + MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; + MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; + + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); + u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); + u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); + u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); + + SCK_pPio->PIO_CODR = SCK_dwMask; //SCK low - needed at power up but not after reset + MOSI_pPio->PIO_CODR = MOSI_dwMask; //MOSI low - needed at power up but not after reset + + u8g_Delay(5); + + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select + break; + + case U8G_COM_MSG_WRITE_BYTE: + + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_DUE_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#if ENABLED(LIGHTWEIGHT_UI) + #include "../../../lcd/ultralcd.h" + #include "../../shared/HAL_ST7920.h" + + #define ST7920_CS_PIN LCD_PINS_RS + + #if DOGM_SPI_DELAY_US > 0 + #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US) + #else + #define U8G_DELAY() DELAY_US(10) + #endif + + void ST7920_cs() { + WRITE(ST7920_CS_PIN, HIGH); + U8G_DELAY(); + } + + void ST7920_ncs() { + WRITE(ST7920_CS_PIN, LOW); + } + + void ST7920_set_cmd() { + SPISEND_SW_DUE(0xF8); + DELAY_US(40); + } + + void ST7920_set_dat() { + SPISEND_SW_DUE(0xFA); + DELAY_US(40); + } + + void ST7920_write_byte(const uint8_t val) { + SPISEND_SW_DUE(val & 0xF0); + SPISEND_SW_DUE(val << 4); + } +#endif // LIGHTWEIGHT_UI + +#endif // U8GLIB_ST7920 +#endif // ARDUINO_ARCH_SAM 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 new file mode 100644 index 00000000..ea7204fa --- /dev/null +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi.cpp @@ -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 . + * + */ + +/** + * Based on u8g_com_std_sw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2015, 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. + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) + +#undef SPI_SPEED +#define SPI_SPEED 2 // About 2 MHz + +#include "u8g_com_HAL_DUE_sw_spi_shared.h" + +#include "../../shared/Marduino.h" +#include "../../shared/Delay.h" + +#include + +#if ENABLED(FYSETC_MINI_12864) + #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_3 +#else + #define SPISEND_SW_DUE u8g_spiSend_sw_DUE_mode_0 +#endif + +uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + SCK_pPio = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].pPort; + SCK_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_SCK]].ulPin; + MOSI_pPio = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].pPort; + MOSI_dwMask = g_APinDescription[u8g->pin_list[U8G_PI_MOSI]].ulPin; + u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK); + u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI); + u8g_SetPIOutput_DUE(u8g, U8G_PI_CS); + u8g_SetPIOutput_DUE(u8g, U8G_PI_A0); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput_DUE(u8g, U8G_PI_RESET); + u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); + u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel_DUE(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + #if ENABLED(FYSETC_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 1); //set SCK to mode 3 idle state before CS goes active + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, LOW); + } + else { + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, HIGH); + u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0); //set SCK to mode 0 idle state after CS goes inactive + } + #else + u8g_SetPILevel_DUE(u8g, U8G_PI_CS, !arg_val); + #endif + break; + + case U8G_COM_MSG_WRITE_BYTE: + SPISEND_SW_DUE(arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + SPISEND_SW_DUE(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + SPISEND_SW_DUE(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel_DUE(u8g, U8G_PI_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920 +#endif // ARDUINO_ARCH_SAM 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 new file mode 100644 index 00000000..615a386c --- /dev/null +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp @@ -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 . + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * 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. + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "../../shared/Delay.h" + +#include + +#include "u8g_com_HAL_DUE_sw_spi_shared.h" + +void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index) { + PIO_Configure(g_APinDescription[u8g->pin_list[pin_index]].pPort, PIO_OUTPUT_1, + g_APinDescription[u8g->pin_list[pin_index]].ulPin, g_APinDescription[u8g->pin_list[pin_index]].ulPinConfiguration); // OUTPUT +} + +void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level) { + volatile Pio* port = g_APinDescription[u8g->pin_list[pin_index]].pPort; + uint32_t mask = g_APinDescription[u8g->pin_list[pin_index]].ulPin; + if (level) port->PIO_SODR = mask; else port->PIO_CODR = mask; +} + +Pio *SCK_pPio, *MOSI_pPio; +uint32_t SCK_dwMask, MOSI_dwMask; + +void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz + LOOP_L_N(i, 8) { + if (val & 0x80) + MOSI_pPio->PIO_SODR = MOSI_dwMask; + else + MOSI_pPio->PIO_CODR = MOSI_dwMask; + DELAY_NS(48); + SCK_pPio->PIO_SODR = SCK_dwMask; + DELAY_NS(905); + val <<= 1; + SCK_pPio->PIO_CODR = SCK_dwMask; + } +} + +void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz + LOOP_L_N(i, 8) { + SCK_pPio->PIO_CODR = SCK_dwMask; + DELAY_NS(50); + if (val & 0x80) + MOSI_pPio->PIO_SODR = MOSI_dwMask; + else + MOSI_pPio->PIO_CODR = MOSI_dwMask; + val <<= 1; + DELAY_NS(10); + SCK_pPio->PIO_SODR = SCK_dwMask; + DELAY_NS(70); + } +} + +#endif // HAS_MARLINUI_U8GLIB +#endif // ARDUINO_ARCH_SAM 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 new file mode 100644 index 00000000..f076c503 --- /dev/null +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.h @@ -0,0 +1,35 @@ +/** + * 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 "../../shared/Marduino.h" +#include + +void u8g_SetPIOutput_DUE(u8g_t *u8g, uint8_t pin_index); +void u8g_SetPILevel_DUE(u8g_t *u8g, uint8_t pin_index, uint8_t level); + +void u8g_spiSend_sw_DUE_mode_0(uint8_t val); +void u8g_spiSend_sw_DUE_mode_3(uint8_t val); + +extern Pio *SCK_pPio, *MOSI_pPio; +extern uint32_t SCK_dwMask, MOSI_dwMask; diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp new file mode 100644 index 00000000..6f38da09 --- /dev/null +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -0,0 +1,1011 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +/* EEPROM emulation over flash with reduced wear + * + * We will use 2 contiguous groups of pages as main and alternate. + * We want an structure that allows to read as fast as possible, + * without the need of scanning the whole FLASH memory. + * + * FLASH bits default erased state is 1, and can be set to 0 + * on a per bit basis. To reset them to 1, a full page erase + * is needed. + * + * Values are stored as differences that should be applied to a + * completely erased EEPROM (filled with 0xFFs). We just encode + * the starting address of the values to change, the length of + * the block of new values, and the values themselves. All diffs + * are accumulated into a RAM buffer, compacted into the least + * amount of non overlapping diffs possible and sorted by starting + * address before being saved into the next available page of FLASH + * of the current group. + * Once the current group is completely full, we compact it and save + * it into the other group, then erase the current group and switch + * to that new group and set it as current. + * + * The FLASH endurance is about 1/10 ... 1/100 of an EEPROM + * endurance, but EEPROM endurance is specified per byte, not + * per page. We can't emulate EE endurance with FLASH for all + * bytes, but we can emulate endurance for a given percent of + * bytes. + */ + +//#define EE_EMU_DEBUG + +#define EEPROMSize 4096 +#define PagesPerGroup 128 +#define GroupCount 2 +#define PageSize 256U + + /* Flash storage */ +typedef struct FLASH_SECTOR { + uint8_t page[PageSize]; +} FLASH_SECTOR_T; + +#define PAGE_FILL \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, \ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + +#define FLASH_INIT_FILL \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL, \ + PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL,PAGE_FILL + +/* This is the FLASH area used to emulate a 2Kbyte EEPROM -- We need this buffer aligned + to a 256 byte boundary. */ +static const uint8_t flashStorage[PagesPerGroup * GroupCount * PageSize] __attribute__ ((aligned (PageSize))) = { FLASH_INIT_FILL }; + +/* Get the address of an specific page */ +static const FLASH_SECTOR_T* getFlashStorage(int page) { + return (const FLASH_SECTOR_T*)&flashStorage[page*PageSize]; +} + +static uint8_t buffer[256] = {0}, // The RAM buffer to accumulate writes + curPage = 0, // Current FLASH page inside the group + curGroup = 0xFF; // Current FLASH group + +#define DEBUG_OUT ENABLED(EE_EMU_DEBUG) +#include "../../core/debug_out.h" + +static void ee_Dump(const int page, const void* data) { + + #ifdef EE_EMU_DEBUG + + const uint8_t* c = (const uint8_t*) data; + char buffer[80]; + + sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page); + DEBUG_ECHO(buffer); + + char* p = &buffer[0]; + for (int i = 0; i< PageSize; ++i) { + if ((i & 0xF) == 0) p += sprintf_P(p, PSTR("%04x] "), i); + + p += sprintf_P(p, PSTR(" %02x"), c[i]); + if ((i & 0xF) == 0xF) { + *p++ = '\n'; + *p = 0; + DEBUG_ECHO(buffer); + p = &buffer[0]; + } + } + + #else + UNUSED(page); + UNUSED(data); + #endif +} + +/* Flash Writing Protection Key */ +#define FWP_KEY 0x5Au + +#if SAM4S_SERIES + #define EEFC_FCR_FCMD(value) \ + ((EEFC_FCR_FCMD_Msk & ((value) << EEFC_FCR_FCMD_Pos))) + #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE | EEFC_FSR_FLERR) +#else + #define EEFC_ERROR_FLAGS (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE) +#endif + +/** + * Writes the contents of the specified page (no previous erase) + * @param page (page #) + * @param data (pointer to the data buffer) + */ +__attribute__ ((long_call, section (".ramfunc"))) +static bool ee_PageWrite(uint16_t page, const void* data) { + + uint16_t i; + uint32_t addrflash = uint32_t(getFlashStorage(page)); + + // Read the flash contents + uint32_t pageContents[PageSize>>2]; + memcpy(pageContents, (void*)addrflash, PageSize); + + // We ONLY want to toggle bits that have changed, and that have changed to 0. + // SAM3X8E tends to destroy contiguous bits if reprogrammed without erasing, so + // we try by all means to avoid this. That is why it says: "The Partial + // Programming mode works only with 128-bit (or higher) boundaries. It cannot + // be used with boundaries lower than 128 bits (8, 16 or 32-bit for example)." + // All bits that did not change, set them to 1. + for (i = 0; i > 2; i++) + pageContents[i] = (((uint32_t*)data)[i]) | (~(pageContents[i] ^ ((uint32_t*)data)[i])); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM PageWrite ", page); + DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash); + DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0)); + DEBUG_FLUSH(); + + // Get the page relative to the start of the EFC controller, and the EFC controller to use + Efc *efc; + uint16_t fpage; + if (addrflash >= IFLASH1_ADDR) { + efc = EFC1; + fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; + } + else { + efc = EFC0; + fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; + } + + // Get the page that must be unlocked, then locked + uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); + + // Disable all interrupts + __disable_irq(); + + // Get the FLASH wait states + uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; + + // Set wait states to 6 (SAM errata) + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(6); + + // Unlock the flash page + uint32_t status; + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ", page); + return false; + } + + // Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. + const uint32_t * aligned_src = (const uint32_t *) &pageContents[0]; /*data;*/ + uint32_t * p_aligned_dest = (uint32_t *) addrflash; + for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { + *p_aligned_dest++ = *aligned_src++; + } + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_WPL); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Write failure for page ", page); + + return false; + } + + // Restore original wait states + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + // Compare contents + if (memcmp(getFlashStorage(page),data,PageSize)) { + + #ifdef EE_EMU_DEBUG + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Verify Write failure for page ", page); + + ee_Dump( page, (uint32_t *)addrflash); + ee_Dump(-page, data); + + // Calculate count of changed bits + uint32_t* p1 = (uint32_t*)addrflash; + uint32_t* p2 = (uint32_t*)data; + int count = 0; + for (i =0; i> 2; i++) { + if (p1[i] != p2[i]) { + uint32_t delta = p1[i] ^ p2[i]; + while (delta) { + if ((delta&1) != 0) + count++; + delta >>= 1; + } + } + } + DEBUG_ECHOLNPAIR("--> Differing bits: ", count); + #endif + + return false; + } + + return true; +} + +/** + * Erases the contents of the specified page + * @param page (page #) + */ +__attribute__ ((long_call, section (".ramfunc"))) +static bool ee_PageErase(uint16_t page) { + + uint16_t i; + uint32_t addrflash = uint32_t(getFlashStorage(page)); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM PageErase ", page); + DEBUG_ECHOLNPAIR(" in FLASH address ", (uint32_t)addrflash); + DEBUG_ECHOLNPAIR(" base address ", (uint32_t)getFlashStorage(0)); + DEBUG_FLUSH(); + + // Get the page relative to the start of the EFC controller, and the EFC controller to use + Efc *efc; + uint16_t fpage; + if (addrflash >= IFLASH1_ADDR) { + efc = EFC1; + fpage = (addrflash - IFLASH1_ADDR) / IFLASH1_PAGE_SIZE; + } + else { + efc = EFC0; + fpage = (addrflash - IFLASH0_ADDR) / IFLASH0_PAGE_SIZE; + } + + // Get the page that must be unlocked, then locked + uint16_t lpage = fpage & (~((IFLASH0_LOCK_REGION_SIZE / IFLASH0_PAGE_SIZE) - 1)); + + // Disable all interrupts + __disable_irq(); + + // Get the FLASH wait states + uint32_t orgWS = (efc->EEFC_FMR & EEFC_FMR_FWS_Msk) >> EEFC_FMR_FWS_Pos; + + // Set wait states to 6 (SAM errata) + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(6); + + // Unlock the flash page + uint32_t status; + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(lpage) | EEFC_FCR_FCMD(EFC_FCMD_CLB); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Unlock failure for page ",page); + + return false; + } + + // Erase Write page and lock: Writing 8-bit and 16-bit data is not allowed and may lead to unpredictable data corruption. + uint32_t * p_aligned_dest = (uint32_t *) addrflash; + for (i = 0; i < (IFLASH0_PAGE_SIZE / sizeof(uint32_t)); ++i) { + *p_aligned_dest++ = 0xFFFFFFFF; + } + efc->EEFC_FCR = EEFC_FCR_FKEY(FWP_KEY) | EEFC_FCR_FARG(fpage) | EEFC_FCR_FCMD(EFC_FCMD_EWPL); + while (((status = efc->EEFC_FSR) & EEFC_FSR_FRDY) != EEFC_FSR_FRDY) { + // force compiler to not optimize this -- NOPs don't work! + __asm__ __volatile__(""); + }; + if ((status & EEFC_ERROR_FLAGS) != 0) { + + // Restore original wait states + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Erase failure for page ",page); + + return false; + } + + // Restore original wait states + efc->EEFC_FMR = (efc->EEFC_FMR & (~EEFC_FMR_FWS_Msk)) | EEFC_FMR_FWS(orgWS); + + // Reenable interrupts + __enable_irq(); + + // Check erase + uint32_t * aligned_src = (uint32_t *) addrflash; + for (i = 0; i < PageSize >> 2; i++) { + if (*aligned_src++ != 0xFFFFFFFF) { + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Verify Erase failure for page ",page); + ee_Dump(page, (uint32_t *)addrflash); + return false; + } + } + + return true; +} + +static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) { + + uint32_t baddr; + uint32_t blen; + + // If we were requested an address outside of the emulated range, fail now + if (address >= EEPROMSize) + return false; + + // Check that the value is not contained in the RAM buffer + if (!excludeRAMBuffer) { + uint16_t i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Return it! + return buffer[i + 3 + address - baddr]; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) + break; + + // Jump to the next block + i += 3 + blen; + } + } + + // It is NOT on the RAM buffer. It could be stored in FLASH. We are + // ensured on a given FLASH page, address contents are never repeated + // but on different pages, there is no such warranty, so we must go + // backwards from the last written FLASH page to the first one. + for (int page = curPage - 1; page >= 0; --page) { + + // Get a pointer to the flash page + uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + + uint16_t i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = pflash[i] | (pflash[i + 1] << 8); + + // Get the length of the block + blen = pflash[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && address < (baddr + blen)) + return pflash[i + 3 + address - baddr]; // Yes, it is contained. Return it! + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) break; + + // Jump to the next block + i += 3 + blen; + } + } + + // If reached here, value is not stored, so return its default value + return 0xFF; +} + +static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) { + uint32_t baddr, + blen, + nextAddr = 0xFFFF, + nextRange = 0; + + // Check that the value is not contained in the RAM buffer + if (!excludeRAMBuffer) { + uint16_t i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) break; + + // Check if address and address + 1 is contained in this block + if (address >= baddr && address < (baddr + blen)) + return address | ((blen - address + baddr) << 16); // Yes, it is contained. Return it! + + // Otherwise, check if we can use it as a limit + if (baddr > address && baddr < nextAddr) { + nextAddr = baddr; + nextRange = blen; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) break; + + // Jump to the next block + i += 3 + blen; + } + } + + // It is NOT on the RAM buffer. It could be stored in FLASH. We are + // ensured on a given FLASH page, address contents are never repeated + // but on different pages, there is no such warranty, so we must go + // backwards from the last written FLASH page to the first one. + for (int page = curPage - 1; page >= 0; --page) { + + // Get a pointer to the flash page + uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + + uint16_t i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + baddr = pflash[i] | (pflash[i + 1] << 8); + + // Get the length of the block + blen = pflash[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) break; + + // Check if data is contained in this block + if (address >= baddr && address < (baddr + blen)) + return address | ((blen - address + baddr) << 16); // Yes, it is contained. Return it! + + // Otherwise, check if we can use it as a limit + if (baddr > address && baddr < nextAddr) { + nextAddr = baddr; + nextRange = blen; + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) break; + + // Jump to the next block + i += 3 + blen; + } + } + + // If reached here, we will return the next valid address + return nextAddr | (nextRange << 16); +} + +static bool ee_IsPageClean(int page) { + uint32_t* pflash = (uint32_t*) getFlashStorage(page); + for (uint16_t i = 0; i < (PageSize >> 2); ++i) + if (*pflash++ != 0xFFFFFFFF) return false; + return true; +} + +static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData=0xFF) { + + // Check if RAM buffer has something to be written + bool isEmpty = true; + uint32_t* p = (uint32_t*) &buffer[0]; + for (uint16_t j = 0; j < (PageSize >> 2); j++) { + if (*p++ != 0xFFFFFFFF) { + isEmpty = false; + break; + } + } + + // If something has to be written, do so! + if (!isEmpty) { + + // Write the current ram buffer into FLASH + ee_PageWrite(curPage + curGroup * PagesPerGroup, buffer); + + // Clear the RAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Increment the page to use the next time + ++curPage; + } + + // Did we reach the maximum count of available pages per group for storage ? + if (curPage < PagesPerGroup) { + + // Do we have an override address ? + if (overrideAddress < EEPROMSize) { + + // Yes, just store the value into the RAM buffer + buffer[0] = overrideAddress & 0xFF; + buffer[0 + 1] = (overrideAddress >> 8) & 0xFF; + buffer[0 + 2] = 1; + buffer[0 + 3] = overrideData; + } + + // Done! + return true; + } + + // We have no space left on the current group - We must compact the values + uint16_t i = 0; + + // Compute the next group to use + int curwPage = 0, curwGroup = curGroup + 1; + if (curwGroup >= GroupCount) curwGroup = 0; + + uint32_t rdAddr = 0; + do { + + // Get the next valid range + uint32_t addrRange = ee_GetAddrRange(rdAddr, true); + + // Make sure not to skip the override address, if specified + int rdRange; + if (overrideAddress < EEPROMSize && + rdAddr <= overrideAddress && + (addrRange & 0xFFFF) > overrideAddress) { + + rdAddr = overrideAddress; + rdRange = 1; + } + else { + rdAddr = addrRange & 0xFFFF; + rdRange = addrRange >> 16; + } + + // If no range, break loop + if (rdRange == 0) + break; + + do { + + // Get the value + uint8_t rdValue = overrideAddress == rdAddr ? overrideData : ee_Read(rdAddr, true); + + // Do not bother storing default values + if (rdValue != 0xFF) { + + // If we have room, add it to the buffer + if (buffer[i + 2] == 0xFF) { + + // Uninitialized buffer, just add it! + buffer[i] = rdAddr & 0xFF; + buffer[i + 1] = (rdAddr >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = rdValue; + + } + else { + // Buffer already has contents. Check if we can extend it + + // Get the address of the block + uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + uint32_t blen = buffer[i + 2]; + + // Can we expand it ? + if (rdAddr == (baddr + blen) && + i < (PageSize - 4) && /* This block has a chance to contain data AND */ + buffer[i + 2] < (PageSize - i - 3)) {/* There is room for this block to be expanded */ + + // Yes, do it + ++buffer[i + 2]; + + // And store the value + buffer[i + 3 + rdAddr - baddr] = rdValue; + + } + else { + + // No, we can't expand it - Skip the existing block + i += 3 + blen; + + // Can we create a new slot ? + if (i > (PageSize - 4)) { + + // Not enough space - Write the current buffer to FLASH + ee_PageWrite(curwPage + curwGroup * PagesPerGroup, buffer); + + // Advance write page (as we are compacting, should never overflow!) + ++curwPage; + + // Clear RAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Start fresh */ + i = 0; + } + + // Enough space, add the new block + buffer[i] = rdAddr & 0xFF; + buffer[i + 1] = (rdAddr >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = rdValue; + } + } + } + + // Go to the next address + ++rdAddr; + + // Repeat for bytes of this range + } while (--rdRange); + + // Repeat until we run out of ranges + } while (rdAddr < EEPROMSize); + + // We must erase the previous group, in preparation for the next swap + for (int page = 0; page < curPage; page++) { + ee_PageErase(page + curGroup * PagesPerGroup); + } + + // Finally, Now the active group is the created new group + curGroup = curwGroup; + curPage = curwPage; + + // Done! + return true; +} + +static bool ee_Write(uint32_t address, uint8_t data) { + + // If we were requested an address outside of the emulated range, fail now + if (address >= EEPROMSize) return false; + + // Lets check if we have a block with that data previously defined. Block + // start addresses are always sorted in ascending order + uint16_t i = 0; + while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Get the address of the block + uint32_t baddr = buffer[i] | (buffer[i + 1] << 8); + + // Get the length of the block + uint32_t blen = buffer[i + 2]; + + // If we reach the end of the list, break loop + if (blen == 0xFF) + break; + + // Check if data is contained in this block + if (address >= baddr && + address < (baddr + blen)) { + + // Yes, it is contained. Just modify it + buffer[i + 3 + address - baddr] = data; + + // Done! + return true; + } + + // Maybe we could add it to the front or to the back + // of this block ? + if ((address + 1) == baddr || address == (baddr + blen)) { + + // Potentially, it could be done. But we must ensure there is room + // so we can expand the block. Lets find how much free space remains + uint32_t iend = i; + do { + uint32_t ln = buffer[iend + 2]; + if (ln == 0xFF) break; + iend += 3 + ln; + } while (iend <= (PageSize - 4)); /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + + // Here, inxt points to the first free address in the buffer. Do we have room ? + if (iend < PageSize) { + // Yes, at least a byte is free - We can expand the block + + // Do we have to insert at the beginning ? + if ((address + 1) == baddr) { + + // Insert at the beginning + + // Make room at the beginning for our byte + memmove(&buffer[i + 3 + 1], &buffer[i + 3], iend - i - 3); + + // Adjust the header and store the data + buffer[i] = address & 0xFF; + buffer[i + 1] = (address >> 8) & 0xFF; + buffer[i + 2]++; + buffer[i + 3] = data; + + } + else { + + // Insert at the end - There is a very interesting thing that could happen here: + // Maybe we could coalesce the next block with this block. Let's try to do it! + uint16_t inext = i + 3 + blen; + if (inext <= (PageSize - 4) && + (buffer[inext] | uint16_t(buffer[inext + 1] << 8)) == (baddr + blen + 1)) { + // YES! ... we can coalesce blocks! . Do it! + + // Adjust this block header to include the next one + buffer[i + 2] += buffer[inext + 2] + 1; + + // Store data at the right place + buffer[i + 3 + blen] = data; + + // Remove the next block header and append its data + memmove(&buffer[inext + 1], &buffer[inext + 3], iend - inext - 3); + + // Finally, as we have saved 2 bytes at the end, make sure to clean them + buffer[iend - 2] = 0xFF; + buffer[iend - 1] = 0xFF; + + } + else { + // NO ... No coalescing possible yet + + // Make room at the end for our byte + memmove(&buffer[i + 3 + blen + 1], &buffer[i + 3 + blen], iend - i - 3 - blen); + + // And add the data to the block + buffer[i + 2]++; + buffer[i + 3 + blen] = data; + } + } + + // Done! + return true; + } + } + + // As blocks are always sorted, if the starting address of this block is higher + // than the address we are looking for, break loop now - We wont find the value + // associated to the address + if (baddr > address) break; + + // Jump to the next block + i += 3 + blen; + } + + // Value is not stored AND we can't expand previous block to contain it. We must create a new block + + // First, lets find how much free space remains + uint32_t iend = i; + while (iend <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ + uint32_t ln = buffer[iend + 2]; + if (ln == 0xFF) break; + iend += 3 + ln; + } + + // If there is room for a new block, insert it at the proper place + if (iend <= (PageSize - 4)) { + + // We have room to create a new block. Do so --- But add + // the block at the proper position, sorted by starting + // address, so it will be possible to compact it with other blocks. + + // Make space + memmove(&buffer[i + 4], &buffer[i], iend - i); + + // And add the block + buffer[i] = address & 0xFF; + buffer[i + 1] = (address >> 8) & 0xFF; + buffer[i + 2] = 1; + buffer[i + 3] = data; + + // Done! + return true; + } + + // Not enough room to store this information on this FLASH page - Perform a + // flush and override the address with the specified contents + return ee_Flush(address, data); +} + +static void ee_Init() { + + // Just init once! + if (curGroup != 0xFF) return; + + // Clean up the SRAM buffer + memset(buffer, 0xFF, sizeof(buffer)); + + // Now, we must find out the group where settings are stored + for (curGroup = 0; curGroup < GroupCount; curGroup++) + if (!ee_IsPageClean(curGroup * PagesPerGroup)) break; + + // If all groups seem to be used, default to first group + if (curGroup >= GroupCount) curGroup = 0; + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Current Group: ",curGroup); + DEBUG_FLUSH(); + + // Now, validate that all the other group pages are empty + for (int grp = 0; grp < GroupCount; grp++) { + if (grp == curGroup) continue; + + for (int page = 0; page < PagesPerGroup; page++) { + if (!ee_IsPageClean(grp * PagesPerGroup + page)) { + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on group ", grp); + DEBUG_FLUSH(); + ee_PageErase(grp * PagesPerGroup + page); + } + } + } + + // Finally, for the active group, determine the first unused page + // and also validate that all the other ones are clean + for (curPage = 0; curPage < PagesPerGroup; curPage++) { + if (ee_IsPageClean(curGroup * PagesPerGroup + curPage)) { + ee_Dump(curGroup * PagesPerGroup + curPage, getFlashStorage(curGroup * PagesPerGroup + curPage)); + break; + } + } + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Active page: ", curPage); + DEBUG_FLUSH(); + + // Make sure the pages following the first clean one are also clean + for (int page = curPage + 1; page < PagesPerGroup; page++) { + if (!ee_IsPageClean(curGroup * PagesPerGroup + page)) { + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM Page ", page, " not clean on active group ", curGroup); + DEBUG_FLUSH(); + ee_Dump(curGroup * PagesPerGroup + page, getFlashStorage(curGroup * PagesPerGroup + page)); + ee_PageErase(curGroup * PagesPerGroup + page); + } + } +} + +/* PersistentStore -----------------------------------------------------------*/ + +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } +bool PersistentStore::access_start() { ee_Init(); return true; } +bool PersistentStore::access_finish() { ee_Flush(); return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != ee_Read(uint32_t(p))) { + ee_Write(uint32_t(p), v); + delay(2); + if (ee_Read(uint32_t(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 c = ee_Read(uint32_t(pos)); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // FLASH_EEPROM_EMULATION +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp new file mode 100644 index 00000000..4599d6a7 --- /dev/null +++ b/Marlin/src/HAL/DUE/eeprom_wired.cpp @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for I2C / SPI 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 * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/endstop_interrupts.h b/Marlin/src/HAL/DUE/endstop_interrupts.h new file mode 100644 index 00000000..999ada51 --- /dev/null +++ b/Marlin/src/HAL/DUE/endstop_interrupts.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 + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h new file mode 100644 index 00000000..28631930 --- /dev/null +++ b/Marlin/src/HAL/DUE/fastio.h @@ -0,0 +1,562 @@ +/** + * 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 + +/** + * Fast I/O Routines for SAM3X8E + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +/** + * Description: Fast IO functions for Arduino Due and compatible (SAM3X8E) + * + * For ARDUINO_ARCH_SAM + * Note the code here was specifically crafted by disassembling what GCC produces + * out of it, so GCC is able to optimize it out as much as possible to the least + * amount of instructions. Be very carefull if you modify them, as "clean code" + * leads to less efficient compiled code!! + */ + +#include + +#include "../../inc/MarlinConfigPre.h" + +/** + * Utility functions + */ + +// Due has 12 PWMs assigned to logical pins 2-13. +// 6, 7, 8 & 9 come from the PWM controller. The others come from the timers. +#define PWM_PIN(P) WITHIN(P, 2, 13) + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/cpp/Stringification.html + */ + +// Read a pin +#define _READ(IO) bool(DIO ## IO ## _WPORT -> PIO_PDSR & MASK(DIO ## IO ## _PIN)) + +// Write to a pin +#define _WRITE(IO,V) do { \ + volatile Pio* port = (DIO ## IO ## _WPORT); \ + const uint32_t mask = MASK(DIO ## IO ## _PIN); \ + if (V) port->PIO_SODR = mask; \ + else port->PIO_CODR = mask; \ +}while(0) + +// Toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +#if MB(PRINTRBOARD_G2) + + #include "fastio/G2_pins.h" + + // Set pin as input + #define _SET_INPUT(IO) do{ \ + pmc_enable_periph_clk(G2_g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure((DIO ## IO ## _WPORT), PIO_INPUT, MASK(DIO ## IO ## _PIN), 0); \ + }while(0) + + // Set pin as output + #define _SET_OUTPUT(IO) do{ \ + uint32_t mask = MASK(G2_g_APinDescription[IO].ulPeripheralId); \ + if ((PMC->PMC_PCSR0 & mask) != (mask)) PMC->PMC_PCER0 = mask; \ + volatile Pio* port = (DIO ## IO ## _WPORT); \ + mask = MASK(DIO ## IO ## _PIN); \ + if (_READ(IO)) port->PIO_SODR = mask; \ + else port->PIO_CODR = mask; \ + port->PIO_IDR = mask; \ + const uint32_t pin_config = G2_g_APinDescription[IO].ulPinConfiguration; \ + if (pin_config & PIO_PULLUP) port->PIO_PUER = mask; \ + else port->PIO_PUDR = mask; \ + if (pin_config & PIO_OPENDRAIN) port->PIO_MDER = mask; \ + else port->PIO_MDDR = mask; \ + port->PIO_PER = mask; \ + port->PIO_OER = mask; \ + g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \ + }while(0) + + /** + * Set pin as output with comments + * #define _SET_OUTPUT(IO) do{ \ + * uint32_t mask = MASK(G2_g_APinDescription[IO].ulPeripheralId); \ + * if ((PMC->PMC_PCSR0 & mask ) != (mask)) PMC->PMC_PCER0 = mask; \ // enable PIO clock if not already enabled + * + * volatile Pio* port = (DIO ## IO ## _WPORT); \ + * const uint32_t mask = MASK(DIO ## IO ## _PIN); \ + * if (_READ(IO)) port->PIO_SODR = mask; \ // set output to match input BEFORE setting direction or will glitch the output + * else port->PIO_CODR = mask; \ + * + * port->PIO_IDR = mask; \ // disable interrupt + * + * uint32_t pin_config = G2_g_APinDescription[IO].ulPinConfiguration; \ + * if (pin_config & PIO_PULLUP) pPio->PIO_PUER = mask; \ // enable pullup if necessary + * else pPio->PIO_PUDR = mask; \ + * + * if (pin_config & PIO_OPENDRAIN) port->PIO_MDER = mask; \ // Enable multi-drive if necessary + * else port->PIO_MDDR = mask; \ + * + * port->PIO_PER = mask; \ + * port->PIO_OER = mask; \ // set to output + * + * g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \ + * }while(0) + */ + +#else + + // Set pin as input + #define _SET_INPUT(IO) do{ \ + pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure(digitalPinToPort(IO), PIO_INPUT, digitalPinToBitMask(IO), 0); \ + }while(0) + + // Set pin as output + #define _SET_OUTPUT(IO) do{ \ + pmc_enable_periph_clk(g_APinDescription[IO].ulPeripheralId); \ + PIO_Configure(digitalPinToPort(IO), _READ(IO) ? PIO_OUTPUT_1 : PIO_OUTPUT_0, digitalPinToBitMask(IO), g_APinDescription[IO].ulPinConfiguration); \ + g_pinStatus[IO] = (g_pinStatus[IO] & 0xF0) | PIN_STATUS_DIGITAL_OUTPUT; \ + }while(0) +#endif + +// Set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +// Read a pin (wrapper) +#define READ(IO) _READ(IO) + +// Write to a pin (wrapper) +#define WRITE(IO,V) _WRITE(IO,V) + +// Toggle a pin (wrapper) +#define TOGGLE(IO) _TOGGLE(IO) + +// Set pin as input (wrapper) +#define SET_INPUT(IO) _SET_INPUT(IO) +// Set pin as input with pullup (wrapper) +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +// Set pin as output (wrapper) - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) +// Set pin as PWM +#define SET_PWM SET_OUTPUT + +// Check if pin is an input +#define IS_INPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) == 0) +// Check if pin is an output +#define IS_OUTPUT(IO) ((digitalPinToPort(IO)->PIO_OSR & digitalPinToBitMask(IO)) != 0) + +// Shorthand +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +/** + * Ports and functions + * Added as necessary or if I feel like it- not a comprehensive list! + */ + +// UART +#define RXD DIO0 +#define TXD DIO1 + +// TWI (I2C) +#define SCL DIO21 +#define SDA DIO20 + +/** + * pins + */ + +#define DIO0_PIN 8 +#define DIO0_WPORT PIOA + +#define DIO1_PIN 9 +#define DIO1_WPORT PIOA + +#define DIO2_PIN 25 +#define DIO2_WPORT PIOB + +#define DIO3_PIN 28 +#define DIO3_WPORT PIOC + +#define DIO4_PIN 26 +#define DIO4_WPORT PIOC + +#define DIO5_PIN 25 +#define DIO5_WPORT PIOC + +#define DIO6_PIN 24 +#define DIO6_WPORT PIOC + +#define DIO7_PIN 23 +#define DIO7_WPORT PIOC + +#define DIO8_PIN 22 +#define DIO8_WPORT PIOC + +#define DIO9_PIN 21 +#define DIO9_WPORT PIOC + +#define DIO10_PIN 29 +#define DIO10_WPORT PIOC + +#define DIO11_PIN 7 +#define DIO11_WPORT PIOD + +#define DIO12_PIN 8 +#define DIO12_WPORT PIOD + +#define DIO13_PIN 27 +#define DIO13_WPORT PIOB + +#define DIO14_PIN 4 +#define DIO14_WPORT PIOD + +#define DIO15_PIN 5 +#define DIO15_WPORT PIOD + +#define DIO16_PIN 13 +#define DIO16_WPORT PIOA + +#define DIO17_PIN 12 +#define DIO17_WPORT PIOA + +#define DIO18_PIN 11 +#define DIO18_WPORT PIOA + +#define DIO19_PIN 10 +#define DIO19_WPORT PIOA + +#define DIO20_PIN 12 +#define DIO20_WPORT PIOB + +#define DIO21_PIN 13 +#define DIO21_WPORT PIOB + +#define DIO22_PIN 26 +#define DIO22_WPORT PIOB + +#define DIO23_PIN 14 +#define DIO23_WPORT PIOA + +#define DIO24_PIN 15 +#define DIO24_WPORT PIOA + +#define DIO25_PIN 0 +#define DIO25_WPORT PIOD + +#define DIO26_PIN 1 +#define DIO26_WPORT PIOD + +#define DIO27_PIN 2 +#define DIO27_WPORT PIOD + +#define DIO28_PIN 3 +#define DIO28_WPORT PIOD + +#define DIO29_PIN 6 +#define DIO29_WPORT PIOD + +#define DIO30_PIN 9 +#define DIO30_WPORT PIOD + +#define DIO31_PIN 7 +#define DIO31_WPORT PIOA + +#define DIO32_PIN 10 +#define DIO32_WPORT PIOD + +#define DIO33_PIN 1 +#define DIO33_WPORT PIOC + +#if !MB(PRINTRBOARD_G2) // normal DUE pin mapping + + #define DIO34_PIN 2 + #define DIO34_WPORT PIOC + + #define DIO35_PIN 3 + #define DIO35_WPORT PIOC + + #define DIO36_PIN 4 + #define DIO36_WPORT PIOC + + #define DIO37_PIN 5 + #define DIO37_WPORT PIOC + + #define DIO38_PIN 6 + #define DIO38_WPORT PIOC + + #define DIO39_PIN 7 + #define DIO39_WPORT PIOC + + #define DIO40_PIN 8 + #define DIO40_WPORT PIOC + + #define DIO41_PIN 9 + #define DIO41_WPORT PIOC + +#endif // !PRINTRBOARD_G2 + +#define DIO42_PIN 19 +#define DIO42_WPORT PIOA + +#define DIO43_PIN 20 +#define DIO43_WPORT PIOA + +#define DIO44_PIN 19 +#define DIO44_WPORT PIOC + +#define DIO45_PIN 18 +#define DIO45_WPORT PIOC + +#define DIO46_PIN 17 +#define DIO46_WPORT PIOC + +#define DIO47_PIN 16 +#define DIO47_WPORT PIOC + +#define DIO48_PIN 15 +#define DIO48_WPORT PIOC + +#define DIO49_PIN 14 +#define DIO49_WPORT PIOC + +#define DIO50_PIN 13 +#define DIO50_WPORT PIOC + +#define DIO51_PIN 12 +#define DIO51_WPORT PIOC + +#define DIO52_PIN 21 +#define DIO52_WPORT PIOB + +#define DIO53_PIN 14 +#define DIO53_WPORT PIOB + +#define DIO54_PIN 16 +#define DIO54_WPORT PIOA + +#define DIO55_PIN 24 +#define DIO55_WPORT PIOA + +#define DIO56_PIN 23 +#define DIO56_WPORT PIOA + +#define DIO57_PIN 22 +#define DIO57_WPORT PIOA + +#define DIO58_PIN 6 +#define DIO58_WPORT PIOA + +#define DIO59_PIN 4 +#define DIO59_WPORT PIOA + +#define DIO60_PIN 3 +#define DIO60_WPORT PIOA + +#define DIO61_PIN 2 +#define DIO61_WPORT PIOA + +#define DIO62_PIN 17 +#define DIO62_WPORT PIOB + +#define DIO63_PIN 18 +#define DIO63_WPORT PIOB + +#define DIO64_PIN 19 +#define DIO64_WPORT PIOB + +#define DIO65_PIN 20 +#define DIO65_WPORT PIOB + +#define DIO66_PIN 15 +#define DIO66_WPORT PIOB + +#define DIO67_PIN 16 +#define DIO67_WPORT PIOB + +#define DIO68_PIN 1 +#define DIO68_WPORT PIOA + +#define DIO69_PIN 0 +#define DIO69_WPORT PIOA + +#define DIO70_PIN 17 +#define DIO70_WPORT PIOA + +#define DIO71_PIN 18 +#define DIO71_WPORT PIOA + +#define DIO72_PIN 30 +#define DIO72_WPORT PIOC + +#define DIO73_PIN 21 +#define DIO73_WPORT PIOA + +#define DIO74_PIN 25 +#define DIO74_WPORT PIOA + +#define DIO75_PIN 26 +#define DIO75_WPORT PIOA + +#define DIO76_PIN 27 +#define DIO76_WPORT PIOA + +#define DIO77_PIN 28 +#define DIO77_WPORT PIOA + +#define DIO78_PIN 23 +#define DIO78_WPORT PIOB + +#define DIO79_PIN 17 +#define DIO79_WPORT PIOA + +#define DIO80_PIN 12 +#define DIO80_WPORT PIOB + +#define DIO81_PIN 8 +#define DIO81_WPORT PIOA + +#define DIO82_PIN 11 +#define DIO82_WPORT PIOA + +#define DIO83_PIN 13 +#define DIO83_WPORT PIOA + +#define DIO84_PIN 4 +#define DIO84_WPORT PIOD + +#define DIO85_PIN 11 +#define DIO85_WPORT PIOB + +#define DIO86_PIN 21 +#define DIO86_WPORT PIOB + +#define DIO87_PIN 29 +#define DIO87_WPORT PIOA + +#define DIO88_PIN 15 +#define DIO88_WPORT PIOB + +#define DIO89_PIN 14 +#define DIO89_WPORT PIOB + +#define DIO90_PIN 1 +#define DIO90_WPORT PIOA + +#define DIO91_PIN 15 +#define DIO91_WPORT PIOB + +#if ARDUINO_SAM_ARCHIM + + #define DIO92_PIN 11 + #define DIO92_WPORT PIOC + + #define DIO93_PIN 2 + #define DIO93_WPORT PIOB + + #define DIO94_PIN 1 + #define DIO94_WPORT PIOB + + #define DIO95_PIN 0 + #define DIO95_WPORT PIOB + + #define DIO96_PIN 10 + #define DIO96_WPORT PIOC + + #define DIO97_PIN 24 + #define DIO97_WPORT PIOB + + #define DIO98_PIN 7 + #define DIO98_WPORT PIOB + + #define DIO99_PIN 6 + #define DIO99_WPORT PIOB + + #define DIO100_PIN 8 + #define DIO100_WPORT PIOB + + #define DIO101_PIN 5 + #define DIO101_WPORT PIOB + + #define DIO102_PIN 4 + #define DIO102_WPORT PIOB + + #define DIO103_PIN 3 + #define DIO103_WPORT PIOB + + #define DIO104_PIN 20 + #define DIO104_WPORT PIOC + + #define DIO105_PIN 22 + #define DIO105_WPORT PIOB + + #define DIO106_PIN 27 + #define DIO106_WPORT PIOC + + #define DIO107_PIN 10 + #define DIO107_WPORT PIOB + + #define DIO108_PIN 9 + #define DIO108_WPORT PIOB + +#else // !ARDUINO_SAM_ARCHIM + + #define DIO92_PIN 5 + #define DIO92_WPORT PIOA + + #define DIO93_PIN 12 + #define DIO93_WPORT PIOB + + #define DIO94_PIN 22 + #define DIO94_WPORT PIOB + + #define DIO95_PIN 23 + #define DIO95_WPORT PIOB + + #define DIO96_PIN 24 + #define DIO96_WPORT PIOB + + #define DIO97_PIN 20 + #define DIO97_WPORT PIOC + + #define DIO98_PIN 27 + #define DIO98_WPORT PIOC + + #define DIO99_PIN 10 + #define DIO99_WPORT PIOC + + #define DIO100_PIN 11 + #define DIO100_WPORT PIOC + +#endif // !ARDUINO_SAM_ARCHIM diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp new file mode 100644 index 00000000..d9fbabce --- /dev/null +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp @@ -0,0 +1,206 @@ +/** + * 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 . + * + */ + +/** + * The PWM module is only used to generate interrupts at specified times. It + * is NOT used to directly toggle pins. The ISR writes to the pin assigned to + * that interrupt. + * + * All PWMs use the same repetition rate. The G2 needs about 10KHz min in order to + * not have obvious ripple on the Vref signals. + * + * The data structures are setup to minimize the computation done by the ISR which + * minimizes ISR execution time. Execution times are 0.8 to 1.1 microseconds. + * + * FIve PWM interrupt sources are used. Channel 0 sets the base period. All Vref + * signals are set active when this counter overflows and resets to zero. The compare + * values in channels 1-4 are set to give the desired duty cycle for that Vref pin. + * When counter 0 matches the compare value then that channel generates an interrupt. + * The ISR checks the source of the interrupt and sets the corresponding pin inactive. + * + * Some jitter in the Vref signal is OK so the interrupt priority is left at its default value. + */ + +#include "../../../inc/MarlinConfig.h" + +#if MB(PRINTRBOARD_G2) + +#include "G2_PWM.h" + +#if PIN_EXISTS(MOTOR_CURRENT_PWM_X) + #define G2_PWM_X 1 +#else + #define G2_PWM_X 0 +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) + #define G2_PWM_Y 1 +#else + #define G2_PWM_Y 0 +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #define G2_PWM_Z 1 +#else + #define G2_PWM_Z 0 +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + #define G2_PWM_E 1 +#else + #define G2_PWM_E 0 +#endif +#define G2_MASK_X(V) (G2_PWM_X * (V)) +#define G2_MASK_Y(V) (G2_PWM_Y * (V)) +#define G2_MASK_Z(V) (G2_PWM_Z * (V)) +#define G2_MASK_E(V) (G2_PWM_E * (V)) + +volatile uint32_t *SODR_A = &PIOA->PIO_SODR, + *SODR_B = &PIOB->PIO_SODR, + *CODR_A = &PIOA->PIO_CODR, + *CODR_B = &PIOB->PIO_CODR; + +PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT; + +void Stepper::digipot_init() { + + #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) + OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) + OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0); + #endif + #if G2_PWM_Z + OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0); + #endif + #if G2_PWM_E + OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0); + #endif + + #define WPKEY (0x50574D << 8) // “PWM” in ASCII + #define WPCMD_DIS_SW 0 // command to disable Write Protect SW + #define WPRG_ALL (PWM_WPCR_WPRG0 | PWM_WPCR_WPRG1 | PWM_WPCR_WPRG2 | PWM_WPCR_WPRG3 | PWM_WPCR_WPRG4 | PWM_WPCR_WPRG5) // all Write Protect Groups + + #define PWM_CLOCK_F F_CPU / 1000000UL // set clock to 1MHz + + PMC->PMC_PCER1 = PMC_PCER1_PID36; // enable PWM controller clock (disabled on power up) + + PWM->PWM_WPCR = WPKEY | WPRG_ALL | WPCMD_DIS_SW; // enable setting of all PWM registers + PWM->PWM_CLK = PWM_CLOCK_F; // enable CLK_A and set it to 1MHz, leave CLK_B disabled + PWM->PWM_CH_NUM[0].PWM_CMR = 0b1011; // set channel 0 to Clock A input & to left aligned + if (G2_PWM_X) PWM->PWM_CH_NUM[1].PWM_CMR = 0b1011; // set channel 1 to Clock A input & to left aligned + if (G2_PWM_Y) PWM->PWM_CH_NUM[2].PWM_CMR = 0b1011; // set channel 2 to Clock A input & to left aligned + if (G2_PWM_Z) PWM->PWM_CH_NUM[3].PWM_CMR = 0b1011; // set channel 3 to Clock A input & to left aligned + if (G2_PWM_E) PWM->PWM_CH_NUM[4].PWM_CMR = 0b1011; // set channel 4 to Clock A input & to left aligned + + PWM->PWM_CH_NUM[0].PWM_CPRD = PWM_PERIOD_US; // set channel 0 Period + + PWM->PWM_IER2 = PWM_IER1_CHID0; // generate interrupt when counter0 overflows + PWM->PWM_IER2 = PWM_IER2_CMPM0 + | G2_MASK_X(PWM_IER2_CMPM1) + | G2_MASK_Y(PWM_IER2_CMPM2) + | G2_MASK_Z(PWM_IER2_CMPM3) + | G2_MASK_E(PWM_IER2_CMPM4) + ; // generate interrupt on compare event + + if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[0])); // interrupt when counter0 == CMPV - used to set Motor 1 PWM inactive + if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[0])); // interrupt when counter0 == CMPV - used to set Motor 2 PWM inactive + if (G2_PWM_Z) PWM->PWM_CMP[3].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[1])); // interrupt when counter0 == CMPV - used to set Motor 3 PWM inactive + if (G2_PWM_E) PWM->PWM_CMP[4].PWM_CMPV = 0x010000000LL | G2_VREF_COUNT(G2_VREF(motor_current_setting[2])); // interrupt when counter0 == CMPV - used to set Motor 4 PWM inactive + + if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPM = 0x0001; // enable compare event + if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPM = 0x0001; // enable compare event + if (G2_PWM_Z) PWM->PWM_CMP[3].PWM_CMPM = 0x0001; // enable compare event + if (G2_PWM_E) PWM->PWM_CMP[4].PWM_CMPM = 0x0001; // enable compare event + + PWM->PWM_SCM = PWM_SCM_UPDM_MODE0 | PWM_SCM_SYNC0 + | G2_MASK_X(PWM_SCM_SYNC1) + | G2_MASK_Y(PWM_SCM_SYNC2) + | G2_MASK_Z(PWM_SCM_SYNC3) + | G2_MASK_E(PWM_SCM_SYNC4) + ; // sync 1-4 with 0, use mode 0 for updates + + PWM->PWM_ENA = PWM_ENA_CHID0 + | G2_MASK_X(PWM_ENA_CHID1) + | G2_MASK_Y(PWM_ENA_CHID2) + | G2_MASK_Z(PWM_ENA_CHID3) + | G2_MASK_E(PWM_ENA_CHID4) + ; // enable channels used by G2 + + PWM->PWM_IER1 = PWM_IER1_CHID0 + | G2_MASK_X(PWM_IER1_CHID1) + | G2_MASK_Y(PWM_IER1_CHID2) + | G2_MASK_Z(PWM_IER1_CHID3) + | G2_MASK_E(PWM_IER1_CHID4) + ; // enable interrupts for channels used by G2 + + NVIC_EnableIRQ(PWM_IRQn); // Enable interrupt handler + NVIC_SetPriority(PWM_IRQn, NVIC_EncodePriority(0, 10, 0)); // normal priority for PWM module (can stand some jitter on the Vref signals) +} + +void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { + + if (!(PWM->PWM_CH_NUM[0].PWM_CPRD == PWM_PERIOD_US)) digipot_init(); // Init PWM system if needed + + switch (driver) { + case 0: + if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update X & Y + if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); + if (G2_PWM_X) PWM->PWM_CMP[1].PWM_CMPMUPD = 0x0001; // enable compare event + if (G2_PWM_Y) PWM->PWM_CMP[2].PWM_CMPMUPD = 0x0001; // enable compare event + if (G2_PWM_X || G2_PWM_Y) PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle + break; + case 1: + if (G2_PWM_Z) { + PWM->PWM_CMP[3].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update Z + PWM->PWM_CMP[3].PWM_CMPMUPD = 0x0001; // enable compare event + PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle + } + break; + default: + if (G2_PWM_E) { + PWM->PWM_CMP[4].PWM_CMPVUPD = 0x010000000LL | G2_VREF_COUNT(G2_VREF(current)); // update E + PWM->PWM_CMP[4].PWM_CMPMUPD = 0x0001; // enable compare event + PWM->PWM_SCUC = PWM_SCUC_UPDULOCK; // tell the PWM controller to update the values on the next cycle + } + break; + } +} + +volatile uint32_t PWM_ISR1_STATUS, PWM_ISR2_STATUS; + +void PWM_Handler() { + PWM_ISR1_STATUS = PWM->PWM_ISR1; + PWM_ISR2_STATUS = PWM->PWM_ISR2; + if (PWM_ISR1_STATUS & PWM_IER1_CHID0) { // CHAN_0 interrupt + if (G2_PWM_X) *ISR_table[0].set_register = ISR_table[0].write_mask; // set X to active + if (G2_PWM_Y) *ISR_table[1].set_register = ISR_table[1].write_mask; // set Y to active + if (G2_PWM_Z) *ISR_table[2].set_register = ISR_table[2].write_mask; // set Z to active + if (G2_PWM_E) *ISR_table[3].set_register = ISR_table[3].write_mask; // set E to active + } + else { + if (G2_PWM_X && (PWM_ISR2_STATUS & PWM_IER2_CMPM1)) *ISR_table[0].clr_register = ISR_table[0].write_mask; // set X to inactive + if (G2_PWM_Y && (PWM_ISR2_STATUS & PWM_IER2_CMPM2)) *ISR_table[1].clr_register = ISR_table[1].write_mask; // set Y to inactive + if (G2_PWM_Z && (PWM_ISR2_STATUS & PWM_IER2_CMPM3)) *ISR_table[2].clr_register = ISR_table[2].write_mask; // set Z to inactive + if (G2_PWM_E && (PWM_ISR2_STATUS & PWM_IER2_CMPM4)) *ISR_table[3].clr_register = ISR_table[3].write_mask; // set E to inactive + } + return; +} + +#endif // PRINTRBOARD_G2 diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.h b/Marlin/src/HAL/DUE/fastio/G2_PWM.h new file mode 100644 index 00000000..dc4edfff --- /dev/null +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.h @@ -0,0 +1,78 @@ +/** + * 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 + +/** + * This module is stripped down version of the LPC1768_PWM.h file from + * PR #7500. It is hardwired for the PRINTRBOARD_G2 Motor Current needs. + */ + +#include "../../../inc/MarlinConfigPre.h" +#include "../../../module/stepper.h" +//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\module\stepper.h +//C:\Users\bobku\Documents\GitHub\Marlin-Bob-2\Marlin\src\HAL\HAL_DUE\G2_PWM.h + +#define PWM_PERIOD_US 100 // base repetition rate in micro seconds + +typedef struct { // holds the data needed by the ISR to control the Vref pin + volatile uint32_t* set_register; + volatile uint32_t* clr_register; + uint32_t write_mask; +} PWM_map; + +#define G2_VREF(I) (uint32_t)(I * 5 * 0.15) // desired Vref * 1000 (scaled so don't loose accuracy in next step) + +#define G2_VREF_COUNT(Q) (uint32_t)map(constrain(Q, 500, 3.3 * 1000), 0, 3.3 * 1000, 0, PWM_PERIOD_US) // under 500 the results are very non-linear + +extern volatile uint32_t *SODR_A, *SODR_B, *CODR_A, *CODR_B; + +#define _PIN(IO) (DIO ## IO ## _PIN) + +#define PWM_MAP_INIT_ROW(IO,ZZ) { ZZ == 'A' ? SODR_A : SODR_B, ZZ == 'A' ? CODR_A : CODR_B, 1 << _PIN(IO) } + + +#define PWM_MAP_INIT { PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_X_PIN, 'B'), \ + PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Y_PIN, 'B'), \ + PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_Z_PIN, 'B'), \ + PWM_MAP_INIT_ROW(MOTOR_CURRENT_PWM_E_PIN, 'A'), \ + }; + +#define NUM_PWMS 4 + +extern PWM_map ISR_table[NUM_PWMS]; + +extern uint32_t motor_current_setting[3]; + +#define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4) +#define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0) + +#define PWM_MR0 19999 // base repetition rate minus one count - 20mS +#define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output +#define PWM_PCLKSEL0 0x00 // select clock source for prescaler - defaults to 25MHz on power up + // 0: 25MHz, 1: 100MHz, 2: 50MHz, 3: 12.5MHZ to PWM1 prescaler +#define MR0_MARGIN 200 // if channel value too close to MR0 the system locks up + +extern bool PWM_table_swap; // flag to tell the ISR that the tables have been swapped + +#define HAL_G2_PWM_ISR void PWM_Handler() + +extern volatile uint32_t PWM_ISR1_STATUS, PWM_ISR2_STATUS; diff --git a/Marlin/src/HAL/DUE/fastio/G2_pins.h b/Marlin/src/HAL/DUE/fastio/G2_pins.h new file mode 100644 index 00000000..80c87bd3 --- /dev/null +++ b/Marlin/src/HAL/DUE/fastio/G2_pins.h @@ -0,0 +1,278 @@ +/** + * 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 + +/** + * This file contains the custom port/pin definitions for the PRINTRBOARD_G2 + * motherboard. This motherboard uses the SAM3X8C which is a subset of the + * SAM3X8E used in the DUE board. It uses port/pin pairs that are not + * available using the DUE definitions. + * + * The first part is a copy of the pin descriptions in the + * "variants\arduino_due_x\variant.cpp" file but with pins 34-41 replaced by + * the G2 pins. + * + * The second part is the FASTIO port/pin definitions. + * + * THESE PINS CAN ONLY BE ACCESSED VIA FASTIO COMMANDS. + */ + +/* + Copyright (c) 2011 Arduino. 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 +*/ + +typedef struct _G2_PinDescription { + Pio* pPort; + uint32_t ulPin; + uint32_t ulPeripheralId; + EPioType ulPinType; + uint32_t ulPinConfiguration; + uint32_t ulPinAttribute; + EAnalogChannel ulAnalogChannel; /* Analog pin in the Arduino context (label on the board) */ + EAnalogChannel ulADCChannelNumber; /* ADC Channel number in the SAM device */ + EPWMChannel ulPWMChannel; + ETCChannel ulTCChannel; +} G2_PinDescription; + +/** + * This section is a copy of the pin descriptions in the "variants\arduino_due_x\variant.cpp" file + * with pins 34-41 replaced by the G2 pins. + */ + +/** + * Pins descriptions + */ +const G2_PinDescription G2_g_APinDescription[] = { + // 0 .. 53 - Digital pins + // ---------------------- + // 0/1 - UART (Serial) + { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD + { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD + + // 2 + { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0 + { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7 + { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6 + + // 5 + { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6 + { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7 + { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6 + { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5 + { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4 + // 10 + { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7 + { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8 + { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8 + + // 13 - AMBER LED + { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0 + + // 14/15 - USART3 (Serial3) + { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3 + { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3 + + // 16/17 - USART1 (Serial2) + { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1 + { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1 + + // 18/19 - USART0 (Serial1) + { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0 + { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0 + + // 20/21 - TWI1 + { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0 + { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0 + + // 22 + { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22 + { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23 + { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24 + { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25 + + // 26 + { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26 + { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27 + { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28 + { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29 + + // 30 + { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30 + { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31 + { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32 + { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33 + + // 34 + + // start of custom pins + { PIOA, PIO_PA29, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 Y_STEP_PIN + { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 Y_DIR_PIN + { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 Y_ENABLE_PIN + { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 E0_ENABLE_PIN + { PIOB, PIO_PB11, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 E0_MS1_PIN + { PIOB, PIO_PB10, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 E0_MS3_PIN + { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 HEATER_0_PIN + { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 HEATER_BED_PIN + // end of custom pins + + // 42 + { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42 + { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43 + { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44 + { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45 + + // 46 + { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46 + { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47 + { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48 + { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49 + + // 50 + { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50 + { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51 + { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 + { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 + + + // 54 .. 65 - Analog pins + // ---------------------- + { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 + { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1 + { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2 + { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3 + // 58 + { PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4 + { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5 + { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6 + { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7 + // 62 + { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8 + { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9 + { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10 + { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11 + + // 66/67 - DAC0/DAC1 + { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0 + { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1 + + // 68/69 - CANRX0/CANTX0 + { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX + { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX + + // 70/71 - TWI0 + { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1 + { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1 + + // 72/73 - LEDs + { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL + { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL + + // 74/75/76 - SPI + { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO + { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI + { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK + + // 77 - SPI CS0 + { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0 + + // 78 - SPI CS3 (unconnected) + { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3 + + // 79 .. 84 - "All pins" masks + + // 79 - TWI0 all pins + { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 80 - TWI1 all pins + { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 81 - UART (Serial) all pins + { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 82 - USART0 (Serial1) all pins + { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 83 - USART1 (Serial2) all pins + { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 84 - USART3 (Serial3) all pins + { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 85 - USB + { PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + + // 86 - SPI CS2 + { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2 + + // 87 - SPI CS1 + { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1 + + // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53) + { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1 + { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1 + + // 90 .. 91 - "All CAN pins" masks + // 90 - CAN0 all pins + { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 91 - CAN1 all pins + { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // END + { nullptr, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER } +}; + +// This section replaces the FASTIO definitions of pins 34-41 + +#define DIO34_PIN 29 +#define DIO34_WPORT PIOA // only available via FASTIO // 34 PA29 - Y_STEP_PIN + +#define DIO35_PIN 1 +#define DIO35_WPORT PIOB // only available via FASTIO // 35 PAB1 - Y_DIR_PIN + +#define DIO36_PIN 0 +#define DIO36_WPORT PIOB // only available via FASTIO // 36 PB0 - Y_ENABLE_PIN + +#define DIO37_PIN 22 +#define DIO37_WPORT PIOB // only available via FASTIO // 37 PB22 - E0_ENABLE_PIN + +#define DIO38_PIN 11 +#define DIO38_WPORT PIOB // only available via FASTIO // 38 PB11 - E0_MS1_PIN + +#define DIO39_PIN 10 +#define DIO39_WPORT PIOB // only available via FASTIO // 39 PB10 - E0_MS3_PIN + +#define DIO40_PIN 5 +#define DIO40_WPORT PIOA // only available via FASTIO // 40 PA5 - HEATER_0_PIN + +#define DIO41_PIN 24 +#define DIO41_WPORT PIOB // only available via FASTIO // 41 PB24 - HEATER_BED_PIN diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h new file mode 100644 index 00000000..58674144 --- /dev/null +++ b/Marlin/src/HAL/DUE/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/DUE." +#endif diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_adv.h b/Marlin/src/HAL/DUE/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/DUE/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_post.h b/Marlin/src/HAL/DUE/inc/Conditionals_post.h new file mode 100644 index 00000000..ce6d3fdd --- /dev/null +++ b/Marlin/src/HAL/DUE/inc/Conditionals_post.h @@ -0,0 +1,28 @@ +/** + * 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 + +#if USE_FALLBACK_EEPROM + #define FLASH_EEPROM_EMULATION +#elif EITHER(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h new file mode 100644 index 00000000..68806965 --- /dev/null +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -0,0 +1,61 @@ +/** + * 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 + +/** + * Test Arduino Due specific configuration values for errors at compile-time. + */ + +/** + * HARDWARE VS. SOFTWARE SPI COMPATIBILITY + * + * DUE selects hardware vs. software SPI depending on whether one of the hardware-controllable SDSS pins is in use. + * + * The hardware SPI controller doesn't allow software SPIs to control any shared pins. + * + * When DUE software SPI is used then Trinamic drivers must use the TMC softSPI. + * + * When DUE hardware SPI is used then a Trinamic driver can use either its hardware SPI or, if there are no shared + * pins, its software SPI. + * + * Usually the hardware SPI pins are only available to the LCD. This makes the DUE hard SPI used at the same time + * as the TMC2130 soft SPI the most common setup. + */ +#define _IS_HW_SPI(P) (defined(TMC_SW_##P) && (TMC_SW_##P == MOSI_PIN || TMC_SW_##P == MISO_PIN || TMC_SW_##P == SCK_PIN)) + +#if ENABLED(SDSUPPORT) && HAS_DRIVER(TMC2130) + #if ENABLED(TMC_USE_SW_SPI) + #if DISABLED(DUE_SOFTWARE_SPI) && (_IS_HW_SPI(MOSI) || _IS_HW_SPI(MISO) || _IS_HW_SPI(SCK)) + #error "DUE hardware SPI is required but is incompatible with TMC2130 software SPI. Either disable TMC_USE_SW_SPI or use separate pins for the two SPIs." + #endif + #elif ENABLED(DUE_SOFTWARE_SPI) + #error "DUE software SPI is required but is incompatible with TMC2130 hardware SPI. Enable TMC_USE_SW_SPI to fix." + #endif +#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 DUE." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h new file mode 100644 index 00000000..a99ca8ec --- /dev/null +++ b/Marlin/src/HAL/DUE/pinsDebug.h @@ -0,0 +1,182 @@ +/** + * 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 . + * + */ + +/** + * Support routines for Due + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#include "../shared/Marduino.h" + +/** + * Due/Marlin quirks + * + * a) determining the state of a pin + * The Due/Arduino status definitions for the g_pinStatus[pin] array are: + * #define PIN_STATUS_DIGITAL_INPUT_PULLUP (0x01) + * #define PIN_STATUS_DIGITAL_INPUT (0x02) + * #define PIN_STATUS_DIGITAL_OUTPUT (0x03) + * #define PIN_STATUS_ANALOG (0x04) + * #define PIN_STATUS_PWM (0x05) + * #define PIN_STATUS_TIMER (0x06) + * + * These are only valid if the following Due/Arduino provided functions are used: + * analogRead + * analogWrite + * digitalWrite + * pinMode + * + * The FASTIO routines do not touch the g_pinStatus[pin] array. + * + * The net result is that both the g_pinStatus[pin] array and the PIO_OSR register + * needs to be looked at when determining if a pin is an input or an output. + * + * b) Due has only pins 6, 7, 8 & 9 enabled for PWMs. FYI - they run at 1KHz + * + * c) NUM_DIGITAL_PINS does not include the analog pins + * + * d) Pins 0-78 are defined for Due but 78 has a comment of "unconnected!". 78 is + * included just in case. + */ + +#define NUMBER_PINS_TOTAL PINS_COUNT + +#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin +#define PRINT_PORT(p) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital +#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) +#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) +#define IS_ANALOG(P) WITHIN(P, char(analogInputToDigitalPin(0)), char(analogInputToDigitalPin(NUM_ANALOG_INPUTS - 1))) +#define pwm_status(pin) (((g_pinStatus[pin] & 0xF) == PIN_STATUS_PWM) && \ + ((g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) == PIN_ATTR_PWM)) +#define MULTI_NAME_PAD 14 // space needed to be pretty if not first name assigned to a pin + +bool GET_PINMODE(int8_t pin) { // 1: output, 0: input + volatile Pio* port = g_APinDescription[pin].pPort; + uint32_t mask = g_APinDescription[pin].ulPin; + uint8_t pin_status = g_pinStatus[pin] & 0xF; + return ( (pin_status == 0 && (port->PIO_OSR & mask)) + || pin_status == PIN_STATUS_DIGITAL_OUTPUT + || pwm_status(pin)); +} + + +void pwm_details(int32_t pin) { + if (pwm_status(pin)) { + uint32_t chan = g_APinDescription[pin].ulPWMChannel; + SERIAL_ECHOPAIR("PWM = ", PWM_INTERFACE->PWM_CH_NUM[chan].PWM_CDTY); + } +} + +/** + * DUE Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PA8 | "RX0" + * 1 | PA9 | "TX0" + * 2 TIOA0 | PB25 | + * 3 TIOA7 | PC28 | + * 4 NPCS1 | PA29 | + * TIOB6 | PC26 | + * 5 TIOA6 | PC25 | + * 6 PWML7 | PC24 | + * 7 PWML6 | PC23 | + * 8 PWML5 | PC22 | + * 9 PWML4 | PC21 | + * 10 NPCS0 | PA28 | + * TIOB7 | PC29 | + * 11 TIOA8 | PD7 | + * 12 TIOB8 | PD8 | + * 13 TIOB0 | PB27 | LED AMBER "L" + * 14 TXD3 | PD4 | "TX3" + * 15 RXD3 | PD5 | "RX3" + * 16 TXD1 | PA13 | "TX2" + * 17 RXD1 | PA12 | "RX2" + * 18 TXD0 | PA11 | "TX1" + * 19 RXD0 | PA10 | "RX1" + * 20 | PB12 | "SDA" + * 21 | PB13 | "SCL" + * 22 | PB26 | + * 23 | PA14 | + * 24 | PA15 | + * 25 | PD0 | + * 26 | PD1 | + * 27 | PD2 | + * 28 | PD3 | + * 29 | PD6 | + * 30 | PD9 | + * 31 | PA7 | + * 32 | PD10 | + * 33 | PC1 | + * 34 | PC2 | + * 35 | PC3 | + * 36 | PC4 | + * 37 | PC5 | + * 38 | PC6 | + * 39 | PC7 | + * 40 | PC8 | + * 41 | PC9 | + * 42 | PA19 | + * 43 | PA20 | + * 44 | PC19 | + * 45 | PC18 | + * 46 | PC17 | + * 47 | PC16 | + * 48 | PC15 | + * 49 | PC14 | + * 50 | PC13 | + * 51 | PC12 | + * 52 NPCS2 | PB21 | + * 53 | PB14 | + * 54 | PA16 | "A0" + * 55 | PA24 | "A1" + * 56 | PA23 | "A2" + * 57 | PA22 | "A3" + * 58 TIOB2 | PA6 | "A4" + * 69 | PA4 | "A5" + * 60 TIOB1 | PA3 | "A6" + * 61 TIOA1 | PA2 | "A7" + * 62 | PB17 | "A8" + * 63 | PB18 | "A9" + * 64 | PB19 | "A10" + * 65 | PB20 | "A11" + * 66 | PB15 | "DAC0" + * 67 | PB16 | "DAC1" + * 68 | PA1 | "CANRX" + * 69 | PA0 | "CANTX" + * 70 | PA17 | "SDA1" + * 71 | PA18 | "SCL1" + * 72 | PC30 | LED AMBER "RX" + * 73 | PA21 | LED AMBER "TX" + * 74 MISO | PA25 | + * 75 MOSI | PA26 | + * 76 SCLK | PA27 | + * 77 NPCS0 | PA28 | + * 78 NPCS3 | PB23 | unconnected! + * + * USB pin | PORT + * ----------------+-------- + * ID | PB11 + * VBOF | PB10 + */ diff --git a/Marlin/src/HAL/DUE/spi_pins.h b/Marlin/src/HAL/DUE/spi_pins.h new file mode 100644 index 00000000..e28eaf82 --- /dev/null +++ b/Marlin/src/HAL/DUE/spi_pins.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 + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + * + * Available chip select pins for HW SPI are 4 10 52 77 + */ +#if SDSS == 4 || SDSS == 10 || SDSS == 52 || SDSS == 77 || SDSS == 87 + #if SDSS == 4 + #define SPI_PIN 87 + #define SPI_CHAN 1 + #elif SDSS == 10 + #define SPI_PIN 77 + #define SPI_CHAN 0 + #elif SDSS == 52 + #define SPI_PIN 86 + #define SPI_CHAN 2 + #elif SDSS == 77 + #define SPI_PIN 77 + #define SPI_CHAN 0 + #else + #define SPI_PIN 87 + #define SPI_CHAN 1 + #endif + #define SCK_PIN 76 + #define MISO_PIN 74 + #define MOSI_PIN 75 +#else + // defaults + #define DUE_SOFTWARE_SPI + #ifndef SCK_PIN + #define SCK_PIN 52 + #endif + #ifndef MISO_PIN + #define MISO_PIN 50 + #endif + #ifndef MOSI_PIN + #define MOSI_PIN 51 + #endif +#endif + +/* A.28, A.29, B.21, C.26, C.29 */ +#define SS_PIN SDSS diff --git a/Marlin/src/HAL/DUE/timers.cpp b/Marlin/src/HAL/DUE/timers.cpp new file mode 100644 index 00000000..9b937d1a --- /dev/null +++ b/Marlin/src/HAL/DUE/timers.cpp @@ -0,0 +1,132 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 . + * + */ + +/** + * HAL Timers for Arduino Due and compatible (SAM3X8E) + */ + +#ifdef ARDUINO_ARCH_SAM + +// ------------------------ +// Includes +// ------------------------ +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define NUM_HARDWARE_TIMERS 9 + +// ------------------------ +// Private Variables +// ------------------------ + +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TC0, 0, TC0_IRQn, 3}, // 0 - [servo timer5] + { TC0, 1, TC1_IRQn, 0}, // 1 + { TC0, 2, TC2_IRQn, 2}, // 2 - stepper + { TC1, 0, TC3_IRQn, 0}, // 3 - stepper for BOARD_ARCHIM1 + { TC1, 1, TC4_IRQn, 15}, // 4 - temperature + { TC1, 2, TC5_IRQn, 3}, // 5 - [servo timer3] + { TC2, 0, TC6_IRQn, 14}, // 6 - tone + { TC2, 1, TC7_IRQn, 0}, // 7 + { TC2, 2, TC8_IRQn, 0}, // 8 +}; + +// ------------------------ +// Public functions +// ------------------------ + +/* + Timer_clock1: Prescaler 2 -> 42MHz + Timer_clock2: Prescaler 8 -> 10.5MHz + Timer_clock3: Prescaler 32 -> 2.625MHz + Timer_clock4: Prescaler 128 -> 656.25kHz +*/ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + Tc *tc = TimerConfig[timer_num].pTimerRegs; + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + uint32_t channel = TimerConfig[timer_num].channel; + + // Disable interrupt, just in case it was already enabled + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable timer interrupt + tc->TC_CHANNEL[channel].TC_IDR = TC_IDR_CPCS; + + // Stop timer, just in case, to be able to reconfigure it + TC_Stop(tc, channel); + + pmc_set_writeprotect(false); + pmc_enable_periph_clk((uint32_t)irq); + NVIC_SetPriority(irq, TimerConfig [timer_num].priority); + + // wave mode, reset counter on match with RC, + TC_Configure(tc, channel, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK1); + + // Set compare value + TC_SetRC(tc, channel, VARIANT_MCK / 2 / frequency); + + // And start timer + TC_Start(tc, channel); + + // enable interrupt on RC compare + tc->TC_CHANNEL[channel].TC_IER = TC_IER_CPCS; + + // Finally, enable IRQ + NVIC_EnableIRQ(irq); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_EnableIRQ(irq); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// missing from CMSIS: Check if interrupt is enabled or not +static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + return NVIC_GetEnabledIRQ(irq); +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/timers.h b/Marlin/src/HAL/DUE/timers.h new file mode 100644 index 00000000..0e1ea07c --- /dev/null +++ b/Marlin/src/HAL/DUE/timers.h @@ -0,0 +1,128 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 + +/** + * HAL Timers for Arduino Due and compatible (SAM3X8E) + */ + +#include + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 2 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 4 // Timer Index for Temperature +#endif +#ifndef TONE_TIMER_NUM + #define TONE_TIMER_NUM 6 // index of timer to use for beeper tones +#endif + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void TC2_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void TC4_Handler() +#endif +#ifndef HAL_TONE_TIMER_ISR + #define HAL_TONE_TIMER_ISR() void TC6_Handler() +#endif + +// ------------------------ +// Types +// ------------------------ + +typedef struct { + Tc *pTimerRegs; + uint16_t channel; + IRQn_Type IRQ_Id; + uint8_t priority; +} tTimerConfig; + +// ------------------------ +// Public Variables +// ------------------------ + +extern const tTimerConfig TimerConfig[]; + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC = compare; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_RC; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + return pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_CV; +} + +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); + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + const tTimerConfig * const pConfig = &TimerConfig[timer_num]; + // Reading the status register clears the interrupt flag + pConfig->pTimerRegs->TC_CHANNEL[pConfig->channel].TC_SR; +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/DUE/upload_extra_script.py b/Marlin/src/HAL/DUE/upload_extra_script.py new file mode 100644 index 00000000..d52a0a36 --- /dev/null +++ b/Marlin/src/HAL/DUE/upload_extra_script.py @@ -0,0 +1,18 @@ +# +# Set upload_command +# +# Windows: bossac.exe +# Other: leave unchanged +# + +import platform +current_OS = platform.system() + +if current_OS == 'Windows': + + Import("env") + + # Use bossac.exe on Windows + env.Replace( + UPLOADCMD="bossac --info --unlock --write --verify --reset --erase -U false --boot $SOURCE" + ) diff --git a/Marlin/src/HAL/DUE/usb/arduino_due_x.h b/Marlin/src/HAL/DUE/usb/arduino_due_x.h new file mode 100644 index 00000000..d3b333fb --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/arduino_due_x.h @@ -0,0 +1,97 @@ +/** + * \file + * + * \brief Arduino Due/X Board Definition. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +#pragma once + +/** + * Support and FAQ: visit Atmel Support + */ + +/** + * \page arduino_due_x_opfreq "Arduino Due/X - Operating frequencies" + * This page lists several definition related to the board operating frequency + * + * \section Definitions + * - \ref BOARD_FREQ_* + * - \ref BOARD_MCK + */ + +/*! Board oscillator settings */ +#define BOARD_FREQ_SLCK_XTAL (32768U) +#define BOARD_FREQ_SLCK_BYPASS (32768U) +#define BOARD_FREQ_MAINCK_XTAL (12000000U) +#define BOARD_FREQ_MAINCK_BYPASS (12000000U) + +/*! Master clock frequency */ +#define BOARD_MCK CHIP_FREQ_CPU_MAX +#define BOARD_NO_32K_XTAL + +/** board main clock xtal startup time */ +#define BOARD_OSC_STARTUP_US 15625 + +/* ------------------------------------------------------------------------ */ + +/** + * \page arduino_due_x_board_info "Arduino Due/X - Board informations" + * This page lists several definition related to the board description. + * + */ + +/* ------------------------------------------------------------------------ */ +/* USB */ +/* ------------------------------------------------------------------------ */ +/*! USB OTG VBus On/Off: Bus Power Control Port. */ +#define PIN_UOTGHS_VBOF { PIO_PB10, PIOB, ID_PIOB, PIO_PERIPH_A, PIO_PULLUP } +/*! USB OTG Identification: Mini Connector Identification Port. */ +#define PIN_UOTGHS_ID { PIO_PB11, PIOB, ID_PIOB, PIO_PERIPH_A, PIO_PULLUP } + +/*! Multiplexed pin used for USB_ID: */ +#define USB_ID PIO_PB11_IDX +#define USB_ID_GPIO (PIO_PB11_IDX) +#define USB_ID_FLAGS (PIO_PERIPH_A | PIO_DEFAULT) +/*! Multiplexed pin used for USB_VBOF: */ +#define USB_VBOF PIO_PB10_IDX +#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_STATE LOW +/* ------------------------------------------------------------------------ */ diff --git a/Marlin/src/HAL/DUE/usb/compiler.h b/Marlin/src/HAL/DUE/usb/compiler.h new file mode 100644 index 00000000..f89e554c --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/compiler.h @@ -0,0 +1,1150 @@ +/** + * \file + * + * \brief Commonly used includes, types and macros. + * + * Copyright (c) 2010-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UTILS_COMPILER_H +#define UTILS_COMPILER_H + +#include +#include +#include "arduino_due_x.h" +#include "conf_clock.h" +#ifdef SAM3XA_SERIES +#define SAM3XA 1 +#endif +#define UDD_NO_SLEEP_MGR 1 +#define pmc_is_wakeup_clocks_restored() true + +#undef udd_get_endpoint_size_max +#define UDD_USB_INT_FUN USBD_ISR + +/** + * \defgroup group_sam_utils Compiler abstraction layer and code utilities + * + * Compiler abstraction layer and code utilities for AT91SAM. + * This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * \{ + */ +#include + +#if (defined __ICCARM__) +# include +#endif + +#include +#include "preprocessor.h" + +//_____ D E C L A R A T I O N S ____________________________________________ + +#ifndef __ASSEMBLY__ // Not defined for assembling. + +#include +#include +#include +#include + +#ifdef __ICCARM__ +/*! \name Compiler Keywords + * + * Port of some keywords from GCC to IAR Embedded Workbench. + */ +//! @{ +#define __asm__ asm +#define __inline__ inline +#define __volatile__ +//! @} + +#endif + +#define FUNC_PTR void * +/** + * \def UNUSED + * \brief Marking \a v as a unused parameter or value. + */ +#ifndef UNUSED + #define UNUSED(x) ((void)(x)) +#endif + +/** + * \def unused + * \brief Marking \a v as a unused parameter or value. + */ +#define unused(v) do { (void)(v); }while(0) + +/** + * \def barrier + * \brief Memory barrier + */ +#define barrier() __DMB() + +/** + * \brief Emit the compiler pragma \a arg. + * + * \param arg The pragma directive as it would appear after \e \#pragma + * (i.e. not stringified). + */ +#define COMPILER_PRAGMA(arg) _Pragma(#arg) + +/** + * \def COMPILER_PACK_SET(alignment) + * \brief Set maximum alignment for subsequent struct and union + * definitions to \a alignment. + */ +#define COMPILER_PACK_SET(alignment) COMPILER_PRAGMA(pack(alignment)) + +/** + * \def COMPILER_PACK_RESET() + * \brief Set default alignment for subsequent struct and union + * definitions. + */ +#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack()) + + +/** + * \brief Set aligned boundary. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define COMPILER_ALIGNED(a) __attribute__((__aligned__(a))) +#elif (defined __ICCARM__) +# define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a) +#endif + +/** + * \brief Set word-aligned boundary. + */ +#if (defined __GNUC__) || defined(__CC_ARM) +#define COMPILER_WORD_ALIGNED __attribute__((__aligned__(4))) +#elif (defined __ICCARM__) +#define COMPILER_WORD_ALIGNED COMPILER_PRAGMA(data_alignment = 4) +#endif + +/** + * \def __always_inline + * \brief The function should always be inlined. + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and inline the function no matter how big it thinks it + * becomes. + */ +#ifdef __CC_ARM +# define __always_inline __forceinline +#elif (defined __GNUC__) +#ifdef __always_inline +# undef __always_inline +#endif +# define __always_inline inline __attribute__((__always_inline__)) +#elif (defined __ICCARM__) +# define __always_inline _Pragma("inline=forced") +#endif + +/** + * \def __no_inline + * \brief The function should not be inlined. + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and not inline the function. + */ +#ifdef __CC_ARM +# define __no_inline __attribute__((noinline)) +#elif (defined __GNUC__) +# define __no_inline __attribute__((__noinline__)) +#elif (defined __ICCARM__) +# define __no_inline _Pragma("inline=never") +#endif + +/*! \brief This macro is used to test fatal errors. + * + * The macro tests if the expression is false. If it is, a fatal error is + * detected and the application hangs up. If TEST_SUITE_DEFINE_ASSERT_MACRO + * is defined, a unit test version of the macro is used, to allow execution + * of further tests after a false expression. + * + * \param expr Expression to evaluate and supposed to be nonzero. + */ +#ifdef _ASSERT_ENABLE_ +# if defined(TEST_SUITE_DEFINE_ASSERT_MACRO) + // Assert() is defined in unit_test/suite.h +# include "unit_test/suite.h" +# else +#undef TEST_SUITE_DEFINE_ASSERT_MACRO +# define Assert(expr) \ + {\ + if (!(expr)) while (true);\ + } +# endif +#else +# define Assert(expr) ((void) 0) +#endif + +/* Define WEAK attribute */ +#if defined ( __CC_ARM ) /* Keil µVision 4 */ +# define WEAK __attribute__ ((weak)) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define WEAK __weak +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define WEAK __attribute__ ((weak)) +#endif + +/* Define NO_INIT attribute */ +#if 0 //ndef NO_INIT +#ifdef __CC_ARM +# define NO_INIT __attribute__((zero_init)) +#elif defined ( __ICCARM__ ) +# define NO_INIT __no_init +#elif defined ( __GNUC__ ) +# define NO_INIT __attribute__((section(".no_init"))) +#endif +#endif + +/* Define RAMFUNC attribute */ +#if defined ( __CC_ARM ) /* Keil µVision 4 */ +# define RAMFUNC __attribute__ ((section(".ramfunc"))) +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define RAMFUNC __ramfunc +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define RAMFUNC __attribute__ ((section(".ramfunc"))) +#endif + +/* Define OPTIMIZE_HIGH attribute */ +#if defined ( __CC_ARM ) /* Keil µVision 4 */ +# define OPTIMIZE_HIGH _Pragma("O3") +#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */ +# define OPTIMIZE_HIGH _Pragma("optimize=high") +#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */ +# define OPTIMIZE_HIGH __attribute__((optimize("s"))) +#endif + +/*! \name Usual Types + */ +//! @{ +typedef unsigned char Bool; //!< Boolean. +#ifndef __cplusplus +#ifndef __bool_true_false_are_defined +typedef unsigned char bool; //!< Boolean. +#endif +#endif +typedef int8_t S8 ; //!< 8-bit signed integer. +typedef uint8_t U8 ; //!< 8-bit unsigned integer. +typedef int16_t S16; //!< 16-bit signed integer. +typedef uint16_t U16; //!< 16-bit unsigned integer. +typedef uint16_t le16_t; +typedef uint16_t be16_t; +typedef int32_t S32; //!< 32-bit signed integer. +typedef uint32_t U32; //!< 32-bit unsigned integer. +typedef uint32_t le32_t; +typedef uint32_t be32_t; +typedef int64_t S64; //!< 64-bit signed integer. +typedef uint64_t U64; //!< 64-bit unsigned integer. +typedef float F32; //!< 32-bit floating-point number. +typedef double F64; //!< 64-bit floating-point number. +typedef uint32_t iram_size_t; +//! @} + + +/*! \name Status Types + */ +//! @{ +typedef bool Status_bool_t; //!< Boolean status. +typedef U8 Status_t; //!< 8-bit-coded status. +//! @} + + +/*! \name Aliasing Aggregate Types + */ +//! @{ + +//! 16-bit union. +typedef union +{ + S16 s16 ; + U16 u16 ; + S8 s8 [2]; + U8 u8 [2]; +} Union16; + +//! 32-bit union. +typedef union +{ + S32 s32 ; + U32 u32 ; + S16 s16[2]; + U16 u16[2]; + S8 s8 [4]; + U8 u8 [4]; +} Union32; + +//! 64-bit union. +typedef union +{ + S64 s64 ; + U64 u64 ; + S32 s32[2]; + U32 u32[2]; + S16 s16[4]; + U16 u16[4]; + S8 s8 [8]; + U8 u8 [8]; +} Union64; + +//! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} UnionPtr; + +//! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} UnionVPtr; + +//! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} UnionCPtr; + +//! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} UnionCVPtr; + +//! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} StructPtr; + +//! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} StructVPtr; + +//! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} StructCPtr; + +//! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} StructCVPtr; + +//! @} + +#endif // #ifndef __ASSEMBLY__ + +/*! \name Usual Constants + */ +//! @{ +#define DISABLE 0 +#define ENABLE 1 +#ifndef __cplusplus +#ifndef __bool_true_false_are_defined +#define false (1==0) +#define true (1==1) +#endif +#endif +#ifndef PASS +#define PASS 0 +#endif +#ifndef FAIL +#define FAIL 1 +#endif +#ifndef LOW +#define LOW 0x0 +#endif +#ifndef HIGH +#define HIGH 0x1 +#endif +//! @} + + +#ifndef __ASSEMBLY__ // not for assembling. + +//! \name Optimization Control +//@{ + +/** + * \def likely(exp) + * \brief The expression \a exp is likely to be true + */ +#ifndef likely +# define likely(exp) (exp) +#endif + +/** + * \def unlikely(exp) + * \brief The expression \a exp is unlikely to be true + */ +#ifndef unlikely +# define unlikely(exp) (exp) +#endif + +/** + * \def is_constant(exp) + * \brief Determine if an expression evaluates to a constant value. + * + * \param exp Any expression + * + * \return true if \a exp is constant, false otherwise. + */ +#if (defined __GNUC__) || (defined __CC_ARM) +# define is_constant(exp) __builtin_constant_p(exp) +#else +# define is_constant(exp) (0) +#endif + +//! @} + +/*! \name Bit-Field Handling + */ +//! @{ + +/*! \brief Reads the bits of a value specified by a given bit-mask. + * + * \param value Value to read bits from. + * \param mask Bit-mask indicating bits to read. + * + * \return Read bits. + */ +#define Rd_bits( value, mask) ((value) & (mask)) + +/*! \brief Writes the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write bits to. + * \param mask Bit-mask indicating bits to write. + * \param bits Bits to write. + * + * \return Resulting value with written bits. + */ +#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ + ((bits ) & (mask))) + +/*! \brief Tests the bits of a value specified by a given bit-mask. + * + * \param value Value of which to test bits. + * \param mask Bit-mask indicating bits to test. + * + * \return \c 1 if at least one of the tested bits is set, else \c 0. + */ +#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) + +/*! \brief Clears the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to clear bits. + * \param mask Bit-mask indicating bits to clear. + * + * \return Resulting value with cleared bits. + */ +#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) + +/*! \brief Sets the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to set bits. + * \param mask Bit-mask indicating bits to set. + * + * \return Resulting value with set bits. + */ +#define Set_bits(lvalue, mask) ((lvalue) |= (mask)) + +/*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to toggle bits. + * \param mask Bit-mask indicating bits to toggle. + * + * \return Resulting value with toggled bits. + */ +#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) + +/*! \brief Reads the bit-field of a value specified by a given bit-mask. + * + * \param value Value to read a bit-field from. + * \param mask Bit-mask indicating the bit-field to read. + * + * \return Read bit-field. + */ +#define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) + +/*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write a bit-field to. + * \param mask Bit-mask indicating the bit-field to write. + * \param bitfield Bit-field to write. + * + * \return Resulting value with written bit-field. + */ +#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask))) + +//! @} + + +/*! \name Zero-Bit Counting + * + * Under GCC, __builtin_clz and __builtin_ctz behave like macros when + * applied to constant expressions (values known at compile time), so they are + * more optimized than the use of the corresponding assembly instructions and + * they can be used as constant expressions e.g. to initialize objects having + * static storage duration, and like the corresponding assembly instructions + * when applied to non-constant expressions (values unknown at compile time), so + * they are more optimized than an assembly periphrasis. Hence, clz and ctz + * ensure a possible and optimized behavior for both constant and non-constant + * expressions. + */ +//! @{ + +/*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the leading zero bits. + * + * \return The count of leading zero bits in \a u. + */ +#ifndef clz +#if (defined __GNUC__) || (defined __CC_ARM) +# define clz(u) ((u) ? __builtin_clz(u) : 32) +#elif (defined __ICCARM__) +# define clz(u) ((u) ? __CLZ(u) : 32) +#else +# define clz(u) (((u) == 0) ? 32 : \ + ((u) & (1UL << 31)) ? 0 : \ + ((u) & (1UL << 30)) ? 1 : \ + ((u) & (1UL << 29)) ? 2 : \ + ((u) & (1UL << 28)) ? 3 : \ + ((u) & (1UL << 27)) ? 4 : \ + ((u) & (1UL << 26)) ? 5 : \ + ((u) & (1UL << 25)) ? 6 : \ + ((u) & (1UL << 24)) ? 7 : \ + ((u) & (1UL << 23)) ? 8 : \ + ((u) & (1UL << 22)) ? 9 : \ + ((u) & (1UL << 21)) ? 10 : \ + ((u) & (1UL << 20)) ? 11 : \ + ((u) & (1UL << 19)) ? 12 : \ + ((u) & (1UL << 18)) ? 13 : \ + ((u) & (1UL << 17)) ? 14 : \ + ((u) & (1UL << 16)) ? 15 : \ + ((u) & (1UL << 15)) ? 16 : \ + ((u) & (1UL << 14)) ? 17 : \ + ((u) & (1UL << 13)) ? 18 : \ + ((u) & (1UL << 12)) ? 19 : \ + ((u) & (1UL << 11)) ? 20 : \ + ((u) & (1UL << 10)) ? 21 : \ + ((u) & (1UL << 9)) ? 22 : \ + ((u) & (1UL << 8)) ? 23 : \ + ((u) & (1UL << 7)) ? 24 : \ + ((u) & (1UL << 6)) ? 25 : \ + ((u) & (1UL << 5)) ? 26 : \ + ((u) & (1UL << 4)) ? 27 : \ + ((u) & (1UL << 3)) ? 28 : \ + ((u) & (1UL << 2)) ? 29 : \ + ((u) & (1UL << 1)) ? 30 : \ + 31) +#endif +#endif + +/*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the trailing zero bits. + * + * \return The count of trailing zero bits in \a u. + */ +#ifndef ctz +#if (defined __GNUC__) || (defined __CC_ARM) +# define ctz(u) ((u) ? __builtin_ctz(u) : 32) +#else +# define ctz(u) ((u) & (1UL << 0) ? 0 : \ + (u) & (1UL << 1) ? 1 : \ + (u) & (1UL << 2) ? 2 : \ + (u) & (1UL << 3) ? 3 : \ + (u) & (1UL << 4) ? 4 : \ + (u) & (1UL << 5) ? 5 : \ + (u) & (1UL << 6) ? 6 : \ + (u) & (1UL << 7) ? 7 : \ + (u) & (1UL << 8) ? 8 : \ + (u) & (1UL << 9) ? 9 : \ + (u) & (1UL << 10) ? 10 : \ + (u) & (1UL << 11) ? 11 : \ + (u) & (1UL << 12) ? 12 : \ + (u) & (1UL << 13) ? 13 : \ + (u) & (1UL << 14) ? 14 : \ + (u) & (1UL << 15) ? 15 : \ + (u) & (1UL << 16) ? 16 : \ + (u) & (1UL << 17) ? 17 : \ + (u) & (1UL << 18) ? 18 : \ + (u) & (1UL << 19) ? 19 : \ + (u) & (1UL << 20) ? 20 : \ + (u) & (1UL << 21) ? 21 : \ + (u) & (1UL << 22) ? 22 : \ + (u) & (1UL << 23) ? 23 : \ + (u) & (1UL << 24) ? 24 : \ + (u) & (1UL << 25) ? 25 : \ + (u) & (1UL << 26) ? 26 : \ + (u) & (1UL << 27) ? 27 : \ + (u) & (1UL << 28) ? 28 : \ + (u) & (1UL << 29) ? 29 : \ + (u) & (1UL << 30) ? 30 : \ + (u) & (1UL << 31) ? 31 : \ + 32) +#endif +#endif + +//! @} + + +/*! \name Bit Reversing + */ +//! @{ + +/*! \brief Reverses the bits of \a u8. + * + * \param u8 U8 of which to reverse the bits. + * + * \return Value resulting from \a u8 with reversed bits. + */ +#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) + +/*! \brief Reverses the bits of \a u16. + * + * \param u16 U16 of which to reverse the bits. + * + * \return Value resulting from \a u16 with reversed bits. + */ +#define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) + +/*! \brief Reverses the bits of \a u32. + * + * \param u32 U32 of which to reverse the bits. + * + * \return Value resulting from \a u32 with reversed bits. + */ +#define bit_reverse32(u32) __RBIT(u32) + +/*! \brief Reverses the bits of \a u64. + * + * \param u64 U64 of which to reverse the bits. + * + * \return Value resulting from \a u64 with reversed bits. + */ +#define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ + ((U64)bit_reverse32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Alignment + */ +//! @{ + +/*! \brief Tests alignment of the number \a val with the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. + */ +#define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) + +/*! \brief Gets alignment of the number \a val with respect to the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Alignment of the number \a val with respect to the \a n boundary. + */ +#define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) + +/*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. + * + * \param lval Input/output lvalue. + * \param n Boundary. + * \param alg Alignment. + * + * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. + */ +#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) + +/*! \brief Aligns the number \a val with the upper \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the upper \a n boundary. + */ +#define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) + +/*! \brief Aligns the number \a val with the lower \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the lower \a n boundary. + */ +#define Align_down(val, n ) ( (val) & ~((n) - 1)) + +//! @} + +/*! \brief Calls the routine at address \a addr. + * + * It generates a long call opcode. + * + * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if + * it is invoked from the CPU supervisor mode. + * + * \param addr Address of the routine to call. + * + * \note It may be used as a long jump opcode in some special cases. + */ +#define Long_call(addr) ((*(void (*)(void))(addr))()) + + +/*! \name MCU Endianism Handling + * ARM is MCU little endianism. + */ +//! @{ +#define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. +#define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. + +#define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. +#define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. +#define MSB0W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 1st rank of \a u32. +#define MSB1W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 2nd rank of \a u32. +#define MSB2W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 3rd rank of \a u32. +#define MSB3W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 4th rank of \a u32. +#define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. +#define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. + +#define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. +#define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. +#define MSH0(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 1st rank of \a u64. +#define MSH1(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 2nd rank of \a u64. +#define MSH2(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 3rd rank of \a u64. +#define MSH3(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 4th rank of \a u64. +#define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. +#define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. +#define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. +#define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. +#define MSB0D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 1st rank of \a u64. +#define MSB1D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 2nd rank of \a u64. +#define MSB2D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 3rd rank of \a u64. +#define MSB3D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 4th rank of \a u64. +#define MSB4D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 5th rank of \a u64. +#define MSB5D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 6th rank of \a u64. +#define MSB6D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 7th rank of \a u64. +#define MSB7D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 8th rank of \a u64. +#define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. +#define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. +#define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. +#define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. +#define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. +#define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. +#define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. +#define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. + +#define BE16(x) swap16(x) +#define LE16(x) (x) + +#define le16_to_cpu(x) (x) +#define cpu_to_le16(x) (x) +#define LE16_TO_CPU(x) (x) +#define CPU_TO_LE16(x) (x) + +#define be16_to_cpu(x) swap16(x) +#define cpu_to_be16(x) swap16(x) +#define BE16_TO_CPU(x) swap16(x) +#define CPU_TO_BE16(x) swap16(x) + +#define le32_to_cpu(x) (x) +#define cpu_to_le32(x) (x) +#define LE32_TO_CPU(x) (x) +#define CPU_TO_LE32(x) (x) + +#define be32_to_cpu(x) swap32(x) +#define cpu_to_be32(x) swap32(x) +#define BE32_TO_CPU(x) swap32(x) +#define CPU_TO_BE32(x) swap32(x) +//! @} + + +/*! \name Endianism Conversion + * + * The same considerations as for clz and ctz apply here but GCC's + * __builtin_bswap_32 and __builtin_bswap_64 do not behave like macros when + * applied to constant expressions, so two sets of macros are defined here: + * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known + * at compile time); + * - swap16, swap32 and swap64 to apply to non-constant expressions (values + * unknown at compile time). + */ +//! @{ + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ + ((U16)(u16) << 8))) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ + ((U32)Swap16((U32)(u32)) << 16))) + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ + ((U64)Swap32((U64)(u64)) << 32))) + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap16(u16) Swap16(u16) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) +# define swap32(u32) ((U32)__builtin_bswap32((U32)(u32))) +#else +# define swap32(u32) Swap32(u32) +#endif + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) +# define swap64(u64) ((U64)__builtin_bswap64((U64)(u64))) +#else +# define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ + ((U64)swap32((U64)(u64)) << 32))) +#endif + +//! @} + + +/*! \name Target Abstraction + */ +//! @{ + +#define _GLOBEXT_ extern //!< extern storage-class specifier. +#define _CONST_TYPE_ const //!< const type qualifier. +#define _MEM_TYPE_SLOW_ //!< Slow memory type. +#define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. +#define _MEM_TYPE_FAST_ //!< Fast memory type. + +typedef U8 Byte; //!< 8-bit unsigned integer. + +#define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. +#define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. +#define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. +#define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. + +#define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. +#define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. +#define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. +#define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. +#define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. +#define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. + +//! @} + +/** + * \brief Calculate \f$ \left\lceil \frac{a}{b} \right\rceil \f$ using + * integer arithmetic. + * + * \param a An integer + * \param b Another integer + * + * \return (\a a / \a b) rounded up to the nearest integer. + */ +#define div_ceil(a, b) (((a) + (b) - 1) / (b)) + +#endif // #ifndef __ASSEMBLY__ + + +#ifdef __ICCARM__ +#define SHORTENUM __packed +#elif defined(__GNUC__) +#define SHORTENUM __attribute__((packed)) +#endif + +/* No operation */ +#ifdef __ICCARM__ +#define nop() __no_operation() +#elif defined(__GNUC__) +#define nop() (__NOP()) +#endif + +#define FLASH_DECLARE(x) const x +#define FLASH_EXTERN(x) extern const x +#define PGM_READ_BYTE(x) *(x) +#define PGM_READ_WORD(x) *(x) +#define PGM_READ_DWORD(x) *(x) +#define MEMCPY_ENDIAN memcpy +#define PGM_READ_BLOCK(dst, src, len) memcpy((dst), (src), (len)) + +/*Defines the Flash Storage for the request and response of MAC*/ +#define CMD_ID_OCTET (0) + +/* Converting of values from CPU endian to little endian. */ +#define CPU_ENDIAN_TO_LE16(x) (x) +#define CPU_ENDIAN_TO_LE32(x) (x) +#define CPU_ENDIAN_TO_LE64(x) (x) + +/* Converting of values from little endian to CPU endian. */ +#define LE16_TO_CPU_ENDIAN(x) (x) +#define LE32_TO_CPU_ENDIAN(x) (x) +#define LE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from little endian to CPU endian. */ +#define CLE16_TO_CPU_ENDIAN(x) (x) +#define CLE32_TO_CPU_ENDIAN(x) (x) +#define CLE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from CPU endian to little endian. */ +#define CCPU_ENDIAN_TO_LE16(x) (x) +#define CCPU_ENDIAN_TO_LE32(x) (x) +#define CCPU_ENDIAN_TO_LE64(x) (x) + +#define ADDR_COPY_DST_SRC_16(dst, src) ((dst) = (src)) +#define ADDR_COPY_DST_SRC_64(dst, src) ((dst) = (src)) + +/** + * @brief Converts a 64-Bit value into a 8 Byte array + * + * @param[in] value 64-Bit value + * @param[out] data Pointer to the 8 Byte array to be updated with 64-Bit value + * @ingroup apiPalApi + */ +static inline void convert_64_bit_to_byte_array(uint64_t value, uint8_t *data) +{ + uint8_t val_index = 0; + + while (val_index < 8) + { + data[val_index++] = value & 0xFF; + value = value >> 8; + } +} + +/** + * @brief Converts a 16-Bit value into a 2 Byte array + * + * @param[in] value 16-Bit value + * @param[out] data Pointer to the 2 Byte array to be updated with 16-Bit value + * @ingroup apiPalApi + */ +static inline void convert_16_bit_to_byte_array(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* Converts a 16-Bit value into a 2 Byte array */ +static inline void convert_spec_16_bit_to_byte_array(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* Converts a 16-Bit value into a 2 Byte array */ +static inline void convert_16_bit_to_byte_address(uint16_t value, uint8_t *data) +{ + data[0] = value & 0xFF; + data[1] = (value >> 8) & 0xFF; +} + +/* + * @brief Converts a 2 Byte array into a 16-Bit value + * + * @param data Specifies the pointer to the 2 Byte array + * + * @return 16-Bit value + * @ingroup apiPalApi + */ +static inline uint16_t convert_byte_array_to_16_bit(uint8_t *data) +{ + return (data[0] | ((uint16_t)data[1] << 8)); +} + +/* Converts a 8 Byte array into a 32-Bit value */ +static inline uint32_t convert_byte_array_to_32_bit(uint8_t *data) +{ + union + { + uint32_t u32; + uint8_t u8[8]; + }long_addr; + uint8_t index; + for (index = 0; index < 4; index++) { + long_addr.u8[index] = *data++; + } + return long_addr.u32; +} + +/** + * @brief Converts a 8 Byte array into a 64-Bit value + * + * @param data Specifies the pointer to the 8 Byte array + * + * @return 64-Bit value + * @ingroup apiPalApi + */ +static inline uint64_t convert_byte_array_to_64_bit(uint8_t *data) +{ + union + { + uint64_t u64; + uint8_t u8[8]; + } long_addr; + + uint8_t val_index; + + for (val_index = 0; val_index < 8; val_index++) + { + long_addr.u8[val_index] = *data++; + } + + return long_addr.u64; +} +/** + * \} + */ + +#endif /* UTILS_COMPILER_H */ diff --git a/Marlin/src/HAL/DUE/usb/conf_access.h b/Marlin/src/HAL/DUE/usb/conf_access.h new file mode 100644 index 00000000..f4016852 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/conf_access.h @@ -0,0 +1,116 @@ +/** + * \file + * + * \brief Memory access control configuration file. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _CONF_ACCESS_H_ +#define _CONF_ACCESS_H_ + +#include "compiler.h" +#include "../../../inc/MarlinConfigPre.h" + +/*! \name Activation of Logical Unit Numbers + */ +//! @{ + +#define LUN_0 ENABLE //!< SD/MMC Card over MCI Slot 0. +#define LUN_1 DISABLE +#define LUN_2 DISABLE +#define LUN_3 DISABLE +#define LUN_4 DISABLE +#define LUN_5 DISABLE +#define LUN_6 DISABLE +#define LUN_7 DISABLE +#define LUN_USB DISABLE +//! @} + +/*! \name LUN 0 Definitions + */ +//! @{ +#define SD_MMC_SPI_MEM LUN_0 +#define LUN_ID_SD_MMC_SPI_MEM LUN_ID_0 +#define LUN_0_INCLUDE "sd_mmc_spi_mem.h" +#define Lun_0_test_unit_ready sd_mmc_spi_test_unit_ready +#define Lun_0_read_capacity sd_mmc_spi_read_capacity +#define Lun_0_unload sd_mmc_spi_unload +#define Lun_0_wr_protect sd_mmc_spi_wr_protect +#define Lun_0_removal sd_mmc_spi_removal +#define Lun_0_usb_read_10 sd_mmc_spi_usb_read_10 +#define Lun_0_usb_write_10 sd_mmc_spi_usb_write_10 +#define LUN_0_NAME "\"SD/MMC Card\"" +//! @} + + +/*! \name Actions Associated with Memory Accesses + * + * Write here the action to associate with each memory access. + * + * \warning Be careful not to waste time in order not to disturb the functions. + */ +//! @{ +#define memory_start_read_action(nb_sectors) +#define memory_stop_read_action() +#define memory_start_write_action(nb_sectors) +#define memory_stop_write_action() +//! @} + +/*! \name Activation of Interface Features + */ +//! @{ +#define ACCESS_USB true //!< MEM <-> USB interface. +#define ACCESS_MEM_TO_RAM false //!< MEM <-> RAM interface. +#define ACCESS_STREAM false //!< Streaming MEM <-> MEM interface. +#define ACCESS_STREAM_RECORD false //!< Streaming MEM <-> MEM interface in record mode. +#define ACCESS_MEM_TO_MEM false //!< MEM <-> MEM interface. +#define ACCESS_CODEC false //!< Codec interface. +//! @} + +/*! \name Specific Options for Access Control + */ +//! @{ +#define GLOBAL_WR_PROTECT false //!< Management of a global write protection. +//! @} + + +#endif // _CONF_ACCESS_H_ diff --git a/Marlin/src/HAL/DUE/usb/conf_clock.h b/Marlin/src/HAL/DUE/usb/conf_clock.h new file mode 100644 index 00000000..97e70e99 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/conf_clock.h @@ -0,0 +1,100 @@ +/** + * \file + * + * \brief SAM3X clock configuration. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CONF_CLOCK_H_INCLUDED +#define CONF_CLOCK_H_INCLUDED + +// ===== System Clock (MCK) Source Options +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_XTAL +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_SLCK_BYPASS +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_8M_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_12M_RC +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_XTAL +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_BYPASS +#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK +//#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_UPLLCK + +// ===== System Clock (MCK) Prescaler Options (Fmck = Fsys / (SYSCLK_PRES)) +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 +#define CONFIG_SYSCLK_PRES SYSCLK_PRES_2 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_4 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_8 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_16 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_32 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_64 +//#define CONFIG_SYSCLK_PRES SYSCLK_PRES_3 + +// ===== PLL0 (A) Options (Fpll = (Fclk * PLL_mul) / PLL_div) +// Use mul and div effective values here. +#define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL +#define CONFIG_PLL0_MUL 14 +#define CONFIG_PLL0_DIV 1 + +// ===== UPLL (UTMI) Hardware fixed at 480MHz. + +// ===== USB Clock Source Options (Fusb = FpllX / USB_div) +// Use div effective value here. +//#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL0 +#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL +#define CONFIG_USBCLK_DIV 1 + +// ===== Target frequency (System clock) +// - XTAL frequency: 12MHz +// - System clock source: PLLA +// - System clock prescaler: 2 (divided by 2) +// - PLLA source: XTAL +// - PLLA output: XTAL * 14 / 1 +// - System clock is: 12 * 14 / 1 /2 = 84MHz +// ===== Target frequency (USB Clock) +// - USB clock source: UPLL +// - USB clock divider: 1 (not divided) +// - UPLL frequency: 480MHz +// - USB clock: 480 / 1 = 480MHz + + +#endif /* CONF_CLOCK_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/conf_usb.h b/Marlin/src/HAL/DUE/usb/conf_usb.h new file mode 100644 index 00000000..4de9e347 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/conf_usb.h @@ -0,0 +1,296 @@ +/** + * \file + * + * \brief USB configuration file + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _CONF_USB_H_ +#define _CONF_USB_H_ + +#undef UNUSED /* To avoid a macro clash as macros.h already defines it */ +#include "../../../inc/MarlinConfigPre.h" +#include "compiler.h" + +/** + * USB Device Configuration + * @{ + */ + +//! Device definition (mandatory) +#define USB_DEVICE_MAJOR_VERSION 1 +#define USB_DEVICE_MINOR_VERSION 0 +#define USB_DEVICE_POWER 100 // Consumption on Vbus line (mA) +#define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_BUS_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) + +/** + * Device speeds support + * Low speed not supported by CDC and MSC + * @{ + */ + +//! To define a Low speed device +//#define USB_DEVICE_LOW_SPEED + +//! To define a Full speed device +//#define USB_DEVICE_FULL_SPEED + +//! To authorize the High speed +#ifndef USB_DEVICE_FULL_SPEED + #if (UC3A3||UC3A4) + #define USB_DEVICE_HS_SUPPORT + #elif (SAM3XA||SAM3U) + #define USB_DEVICE_HS_SUPPORT + #endif +#endif +//@} + + +/** + * USB Device Callbacks definitions (Optional) + * @{ + */ +#define UDC_VBUS_EVENT(b_vbus_high) +#define UDC_SOF_EVENT() +#define UDC_SUSPEND_EVENT() +#define UDC_RESUME_EVENT() +#define UDC_GET_EXTRA_STRING() usb_task_extra_string() +#define USB_DEVICE_SPECIFIC_REQUEST() usb_task_other_requests() +//@} + +#if ENABLED(SDSUPPORT) + /** + * USB Device low level configuration + * When only one interface is used, these configurations are defined by the class module. + * For composite device, these configuration must be defined here + * @{ + */ + //! Control endpoint size + #define USB_DEVICE_EP_CTRL_SIZE 64 + + //! Two interfaces for this device (CDC COM + CDC DATA + MSC) + #define USB_DEVICE_NB_INTERFACE 3 + + //! 5 endpoints used by CDC and MSC interfaces + #if SAM3U + // (3 | USB_EP_DIR_IN) // CDC Notify endpoint + // (6 | USB_EP_DIR_IN) // CDC TX + // (5 | USB_EP_DIR_OUT) // CDC RX + // (1 | USB_EP_DIR_IN) // MSC IN + // (2 | USB_EP_DIR_OUT) // MSC OUT + # define USB_DEVICE_MAX_EP 6 + # if defined(USB_DEVICE_HS_SUPPORT) + // In HS mode, size of bulk endpoints are 512 + // If CDC and MSC endpoints all uses 2 banks, DPRAM is not enough: 4 bulk + // endpoints requires 4K bytes. So reduce the number of banks of CDC bulk + // endpoints to use less DPRAM. Keep MSC setting to keep MSC performance. + # define UDD_BULK_NB_BANK(ep) ((ep == 5 || ep== 6) ? 1 : 2) + #endif + #else + // (3 | USB_EP_DIR_IN) // CDC Notify endpoint + // (4 | USB_EP_DIR_IN) // CDC TX + // (5 | USB_EP_DIR_OUT) // CDC RX + // (1 | USB_EP_DIR_IN) // MSC IN + // (2 | USB_EP_DIR_OUT) // MSC OUT + # define USB_DEVICE_MAX_EP 5 + # if SAM3XA && defined(USB_DEVICE_HS_SUPPORT) + // In HS mode, size of bulk endpoints are 512 + // If CDC and MSC endpoints all uses 2 banks, DPRAM is not enough: 4 bulk + // endpoints requires 4K bytes. So reduce the number of banks of CDC bulk + // endpoints to use less DPRAM. Keep MSC setting to keep MSC performance. + # define UDD_BULK_NB_BANK(ep) ((ep == 4 || ep== 5) ? 1 : 2) + # endif + #endif +#endif + +//@} + +//@} + + +/** + * USB Interface Configuration + * @{ + */ +/** + * Configuration of CDC interface + * @{ + */ + +//! Define one USB communication ports +#define UDI_CDC_PORT_NB 1 + +//! Interface callback definition +#define UDI_CDC_ENABLE_EXT(port) usb_task_cdc_enable(port) +#define UDI_CDC_DISABLE_EXT(port) usb_task_cdc_disable(port) +#define UDI_CDC_RX_NOTIFY(port) usb_task_cdc_rx_notify(port) +#define UDI_CDC_TX_EMPTY_NOTIFY(port) +#define UDI_CDC_SET_CODING_EXT(port,cfg) usb_task_cdc_config(port,cfg) +#define UDI_CDC_SET_DTR_EXT(port,set) usb_task_cdc_set_dtr(port,set) +#define UDI_CDC_SET_RTS_EXT(port,set) + +//! Define it when the transfer CDC Device to Host is a low rate (<512000 bauds) +//! to reduce CDC buffers size +//#define UDI_CDC_LOW_RATE + +//! Default configuration of communication port +#define UDI_CDC_DEFAULT_RATE 115200 +#define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 +#define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE +#define UDI_CDC_DEFAULT_DATABITS 8 + +//! Enable id string of interface to add an extra USB string +#define UDI_CDC_IAD_STRING_ID 4 + +#if ENABLED(SDSUPPORT) + /** + * USB CDC low level configuration + * In standalone these configurations are defined by the CDC module. + * For composite device, these configuration must be defined here + * @{ + */ + //! Endpoint numbers definition + #if SAM3U + # define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + # define UDI_CDC_DATA_EP_IN_0 (6 | USB_EP_DIR_IN) // TX + # define UDI_CDC_DATA_EP_OUT_0 (5 | USB_EP_DIR_OUT)// RX + #else + # define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + # define UDI_CDC_DATA_EP_IN_0 (4 | USB_EP_DIR_IN) // TX + # define UDI_CDC_DATA_EP_OUT_0 (5 | USB_EP_DIR_OUT)// RX + #endif + + //! Interface numbers + #define UDI_CDC_COMM_IFACE_NUMBER_0 0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 1 + + //@} + //@} + + + /** + * Configuration of MSC interface + * @{ + */ + //! Vendor name and Product version of MSC interface + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'M', 'A', 'R', 'L', 'I', 'N', '3', 'D' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' + + //! Interface callback definition + #define UDI_MSC_ENABLE_EXT() usb_task_msc_enable() + #define UDI_MSC_DISABLE_EXT() usb_task_msc_disable() + + //! Enable id string of interface to add an extra USB string + #define UDI_MSC_STRING_ID 5 + + /** + * USB MSC low level configuration + * In standalone these configurations are defined by the MSC module. + * For composite device, these configuration must be defined here + * @{ + */ + //! Endpoint numbers definition + #define UDI_MSC_EP_IN (1 | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (2 | USB_EP_DIR_OUT) + + //! Interface number + #define UDI_MSC_IFACE_NUMBER 2 + //@} + //@} + + //@} + + + /** + * Description of Composite Device + * @{ + */ + //! USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + udi_msc_desc_t udi_msc + + //! USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + .udi_msc = UDI_MSC_DESC_FS + + //! USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + .udi_msc = UDI_MSC_DESC_HS + + //! USB Interface APIs + #define UDI_COMPOSITE_API \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + &udi_api_msc + //@} + + /** + * USB Device Driver Configuration + * @{ + */ + //@} + + //! The includes of classes and other headers must be done at the end of this file to avoid compile error + #include "udi_cdc.h" + #include "udi_msc.h" +#else + #include "udi_cdc_conf.h" +#endif + +#include "usb_task.h" + +#endif // _CONF_USB_H_ diff --git a/Marlin/src/HAL/DUE/usb/ctrl_access.c b/Marlin/src/HAL/DUE/usb/ctrl_access.c new file mode 100644 index 00000000..99f97f62 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/ctrl_access.c @@ -0,0 +1,647 @@ +/***************************************************************************** + * + * \file + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +//_____ I N C L U D E S ____________________________________________________ + +#include "compiler.h" +#include "preprocessor.h" +#ifdef FREERTOS_USED +#include "FreeRTOS.h" +#include "semphr.h" +#endif +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#ifdef FREERTOS_USED + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c true if the access was successfully locked, else \c false. + */ +#define Ctrl_access_lock() ctrl_access_lock() + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() xSemaphoreGive(ctrl_access_semphr) + +//! @} + +//! Handle to the semaphore protecting accesses to LUNs. +static xSemaphoreHandle ctrl_access_semphr = NULL; + +#else + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c true if the access was successfully locked, else \c false. + */ +#define Ctrl_access_lock() true + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() + +//! @} + +#endif // FREERTOS_USED + + +#if MAX_LUN + +/*! \brief Initializes an entry of the LUN descriptor table. + * + * \param lun Logical Unit Number. + * + * \return LUN descriptor table entry initializer. + */ +#if ACCESS_USB == true && ACCESS_MEM_TO_RAM == true +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_USB == true +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_MEM_TO_RAM == true +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#else +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _unload),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#endif + +//! LUN descriptor table. +static const struct +{ + Ctrl_status (*test_unit_ready)(void); + Ctrl_status (*read_capacity)(U32 *); + bool (*unload)(bool); + bool (*wr_protect)(void); + bool (*removal)(void); +#if ACCESS_USB == true + Ctrl_status (*usb_read_10)(U32, U16); + Ctrl_status (*usb_write_10)(U32, U16); +#endif +#if ACCESS_MEM_TO_RAM == true + Ctrl_status (*mem_2_ram)(U32, void *); + Ctrl_status (*ram_2_mem)(U32, const void *); +#endif + const char *name; +} lun_desc[MAX_LUN] = +{ +#if LUN_0 == ENABLE +# ifndef Lun_0_unload +# define Lun_0_unload NULL +# endif + Lun_desc_entry(0), +#endif +#if LUN_1 == ENABLE +# ifndef Lun_1_unload +# define Lun_1_unload NULL +# endif + Lun_desc_entry(1), +#endif +#if LUN_2 == ENABLE +# ifndef Lun_2_unload +# define Lun_2_unload NULL +# endif + Lun_desc_entry(2), +#endif +#if LUN_3 == ENABLE +# ifndef Lun_3_unload +# define Lun_3_unload NULL +# endif + Lun_desc_entry(3), +#endif +#if LUN_4 == ENABLE +# ifndef Lun_4_unload +# define Lun_4_unload NULL +# endif + Lun_desc_entry(4), +#endif +#if LUN_5 == ENABLE +# ifndef Lun_5_unload +# define Lun_5_unload NULL +# endif + Lun_desc_entry(5), +#endif +#if LUN_6 == ENABLE +# ifndef Lun_6_unload +# define Lun_6_unload NULL +# endif + Lun_desc_entry(6), +#endif +#if LUN_7 == ENABLE +# ifndef Lun_7_unload +# define Lun_7_unload NULL +# endif + Lun_desc_entry(7) +#endif +}; + +#endif + + +#if GLOBAL_WR_PROTECT == true +bool g_wr_protect; +#endif + + +/*! \name Control Interface + */ +//! @{ + + +#ifdef FREERTOS_USED + +bool ctrl_access_init(void) +{ + // If the handle to the protecting semaphore is not valid, + if (!ctrl_access_semphr) + { + // try to create the semaphore. + vSemaphoreCreateBinary(ctrl_access_semphr); + + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return false; + } + + return true; +} + + +/*! \brief Locks accesses to LUNs. + * + * \return \c true if the access was successfully locked, else \c false. + */ +static bool ctrl_access_lock(void) +{ + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return false; + + // Wait for the semaphore. + while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); + + return true; +} + +#endif // FREERTOS_USED + + +U8 get_nb_lun(void) +{ +#if MEM_USB == ENABLE +# ifndef Lun_usb_get_lun +# define Lun_usb_get_lun() host_get_lun() +# endif + U8 nb_lun; + + if (!Ctrl_access_lock()) return MAX_LUN; + + nb_lun = MAX_LUN + Lun_usb_get_lun(); + + Ctrl_access_unlock(); + + return nb_lun; +#else + return MAX_LUN; +#endif +} + + +U8 get_cur_lun(void) +{ + return LUN_ID_0; +} + + +Ctrl_status mem_test_unit_ready(U8 lun) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : +#endif +#if LUN_USB == ENABLE + Lun_usb_test_unit_ready(lun - LUN_ID_USB); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +U8 mem_sector_size(U8 lun) +{ + U8 sector_size; + + if (!Ctrl_access_lock()) return 0; + + sector_size = +#if MAX_LUN + (lun < MAX_LUN) ? 1 : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_sector_size(lun - LUN_ID_USB); +#else + 0; +#endif + + Ctrl_access_unlock(); + + return sector_size; +} + + +bool mem_unload(U8 lun, bool unload) +{ + bool unloaded; +#if !MAX_LUN || !defined(Lun_usb_unload) + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return false; + + unloaded = +#if MAX_LUN + (lun < MAX_LUN) ? + (lun_desc[lun].unload ? + lun_desc[lun].unload(unload) : !unload) : +#endif +#if LUN_USB == ENABLE +# if defined(Lun_usb_unload) + Lun_usb_unload(lun - LUN_ID_USB, unload); +# else + !unload; /* Can not unload: load success, unload fail */ +# endif +#else + false; /* No mem, unload/load fail */ +#endif + + Ctrl_access_unlock(); + + return unloaded; +} + +bool mem_wr_protect(U8 lun) +{ + bool wr_protect; + + if (!Ctrl_access_lock()) return true; + + wr_protect = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : +#endif +#if LUN_USB == ENABLE + Lun_usb_wr_protect(lun - LUN_ID_USB); +#else + true; +#endif + + Ctrl_access_unlock(); + + return wr_protect; +} + + +bool mem_removal(U8 lun) +{ + bool removal; +#if MAX_LUN==0 + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return true; + + removal = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].removal() : +#endif +#if LUN_USB == ENABLE + Lun_usb_removal(); +#else + true; +#endif + + Ctrl_access_unlock(); + + return removal; +} + + +const char *mem_name(U8 lun) +{ +#if MAX_LUN==0 + UNUSED(lun); +#endif + return +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].name : +#endif +#if LUN_USB == ENABLE + LUN_USB_NAME; +#else + NULL; +#endif +} + + +//! @} + + +#if ACCESS_USB == true + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_USB == true + + +#if ACCESS_MEM_TO_RAM == true + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) +{ + Ctrl_status status; +#if MAX_LUN==0 + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_mem_2_ram(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) +{ + Ctrl_status status; +#if MAX_LUN==0 + UNUSED(lun); +#endif + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_ram_2_mem(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_MEM_TO_RAM == true + + +#if ACCESS_STREAM == true + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + + + #if ACCESS_MEM_TO_MEM == true + +#include "fat.h" + +Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) +{ + COMPILER_ALIGNED(4) + static U8 sector_buf[FS_512B]; + Ctrl_status status = CTRL_GOOD; + + while (nb_sector--) + { + if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; + if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; + } + + return status; +} + + #endif // ACCESS_MEM_TO_MEM == true + + +Ctrl_status stream_state(U8 id) +{ + UNUSED(id); + return CTRL_GOOD; +} + + +U16 stream_stop(U8 id) +{ + UNUSED(id); + return 0; +} + + +//! @} + +#endif // ACCESS_STREAM + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/ctrl_access.h b/Marlin/src/HAL/DUE/usb/ctrl_access.h new file mode 100644 index 00000000..b3383907 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/ctrl_access.h @@ -0,0 +1,402 @@ +/***************************************************************************** + * + * \file + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + + +#ifndef _CTRL_ACCESS_H_ +#define _CTRL_ACCESS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup group_common_services_storage_ctrl_access Memory Control Access + * + * Common abstraction layer for memory interfaces. It provides interfaces between: + * Memory and USB, Memory and RAM, Memory and Memory. Common API for XMEGA and UC3. + * + * \{ + */ + +#include "compiler.h" +#include "conf_access.h" + +#ifndef SECTOR_SIZE +#define SECTOR_SIZE 512 +#endif + +//! Status returned by CTRL_ACCESS interfaces. +typedef enum +{ + CTRL_GOOD = PASS, //!< Success, memory ready. + CTRL_FAIL = FAIL, //!< An error occurred. + CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. + CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. +} Ctrl_status; + + +// FYI: Each Logical Unit Number (LUN) corresponds to a memory. + +// Check LUN defines. +#ifndef LUN_0 + #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_1 + #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_2 + #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_3 + #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_4 + #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_5 + #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_6 + #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_7 + #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_USB + #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h +#endif + +/*! \name LUN IDs + */ +//! @{ +#define LUN_ID_0 (0) //!< First static LUN. +#define LUN_ID_1 (LUN_ID_0 + LUN_0) +#define LUN_ID_2 (LUN_ID_1 + LUN_1) +#define LUN_ID_3 (LUN_ID_2 + LUN_2) +#define LUN_ID_4 (LUN_ID_3 + LUN_3) +#define LUN_ID_5 (LUN_ID_4 + LUN_4) +#define LUN_ID_6 (LUN_ID_5 + LUN_5) +#define LUN_ID_7 (LUN_ID_6 + LUN_6) +#define MAX_LUN (LUN_ID_7 + LUN_7) //!< Number of static LUNs. +#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). +//! @} + + +// Include LUN header files. +#if LUN_0 == ENABLE + #include LUN_0_INCLUDE +#endif +#if LUN_1 == ENABLE + #include LUN_1_INCLUDE +#endif +#if LUN_2 == ENABLE + #include LUN_2_INCLUDE +#endif +#if LUN_3 == ENABLE + #include LUN_3_INCLUDE +#endif +#if LUN_4 == ENABLE + #include LUN_4_INCLUDE +#endif +#if LUN_5 == ENABLE + #include LUN_5_INCLUDE +#endif +#if LUN_6 == ENABLE + #include LUN_6_INCLUDE +#endif +#if LUN_7 == ENABLE + #include LUN_7_INCLUDE +#endif +#if LUN_USB == ENABLE + #include LUN_USB_INCLUDE +#endif + + +// Check the configuration of write protection in conf_access.h. +#ifndef GLOBAL_WR_PROTECT + #error GLOBAL_WR_PROTECT must be defined as true or false in conf_access.h +#endif + + +#if GLOBAL_WR_PROTECT == true + +//! Write protect. +extern bool g_wr_protect; + +#endif + + +/*! \name Control Interface + */ +//! @{ + +#ifdef FREERTOS_USED + +/*! \brief Initializes the LUN access locker. + * + * \return \c true if the locker was successfully initialized, else \c false. + */ +extern bool ctrl_access_init(void); + +#endif // FREERTOS_USED + +/*! \brief Returns the number of LUNs. + * + * \return Number of LUNs in the system. + */ +extern U8 get_nb_lun(void); + +/*! \brief Returns the current LUN. + * + * \return Current LUN. + * + * \todo Implement. + */ +extern U8 get_cur_lun(void); + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \param lun Logical Unit Number. + * + * \return Status. + */ +extern Ctrl_status mem_test_unit_ready(U8 lun); + +/*! \brief Returns the address of the last valid sector (512 bytes) in the + * memory. + * + * \param lun Logical Unit Number. + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); + +/*! \brief Returns the size of the physical sector. + * + * \param lun Logical Unit Number. + * + * \return Sector size (unit: 512 bytes). + */ +extern U8 mem_sector_size(U8 lun); + +/*! \brief Unload/load the medium. + * + * \param lun Logical Unit Number. + * \param unload \c true to unload the medium, \c false to load the medium. + * + * \return \c true if unload/load success, else \c false. + */ +extern bool mem_unload(U8 lun, bool unload); + +/*! \brief Returns the write-protection state of the memory. + * + * \param lun Logical Unit Number. + * + * \return \c true if the memory is write-protected, else \c false. + * + * \note Only used by removable memories with hardware-specific write + * protection. + */ +extern bool mem_wr_protect(U8 lun); + +/*! \brief Tells whether the memory is removable. + * + * \param lun Logical Unit Number. + * + * \return \c true if the memory is removable, else \c false. + */ +extern bool mem_removal(U8 lun); + +/*! \brief Returns a pointer to the LUN name. + * + * \param lun Logical Unit Number. + * + * \return Pointer to the LUN name string. + */ +extern const char *mem_name(U8 lun); + +//! @} + + +#if ACCESS_USB == true + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Transfers data from the memory to USB. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); + +/*! \brief Transfers data from USB to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); + +//! @} + +#endif // ACCESS_USB == true + + +#if ACCESS_MEM_TO_RAM == true + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param ram Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param ram Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); + +//! @} + +#endif // ACCESS_MEM_TO_RAM == true + + +#if ACCESS_STREAM == true + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + +//! Erroneous streaming data transfer ID. +#define ID_STREAM_ERR 0xFF + + #if ACCESS_MEM_TO_MEM == true + +/*! \brief Copies data from one memory to another. + * + * \param src_lun Source Logical Unit Number. + * \param src_addr Source address of first memory sector to read. + * \param dest_lun Destination Logical Unit Number. + * \param dest_addr Destination address of first memory sector to write. + * \param nb_sector Number of sectors to copy. + * + * \return Status. + */ +extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); + + #endif // ACCESS_MEM_TO_MEM == true + +/*! \brief Returns the state of a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Status. + * + * \todo Implement. + */ +extern Ctrl_status stream_state(U8 id); + +/*! \brief Stops a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Number of remaining sectors. + * + * \todo Implement. + */ +extern U16 stream_stop(U8 id); + +//! @} + +#endif // ACCESS_STREAM == true + +/** + * \} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _CTRL_ACCESS_H_ diff --git a/Marlin/src/HAL/DUE/usb/genclk.h b/Marlin/src/HAL/DUE/usb/genclk.h new file mode 100644 index 00000000..cde03bc0 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/genclk.h @@ -0,0 +1,278 @@ +/** + * \file + * + * \brief Chip-specific generic clock management. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_GENCLK_H_INCLUDED +#define CHIP_GENCLK_H_INCLUDED + +#include +#include + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup genclk_group + * @{ + */ + +//! \name Programmable Clock Identifiers (PCK) +//@{ +#define GENCLK_PCK_0 0 //!< PCK0 ID +#define GENCLK_PCK_1 1 //!< PCK1 ID +#define GENCLK_PCK_2 2 //!< PCK2 ID +//@} + +//! \name Programmable Clock Sources (PCK) +//@{ + +enum genclk_source { + GENCLK_PCK_SRC_SLCK_RC = 0, //!< Internal 32kHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_SLCK_XTAL = 1, //!< External 32kHz crystal oscillator as PCK source clock + GENCLK_PCK_SRC_SLCK_BYPASS = 2, //!< External 32kHz bypass oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_4M_RC = 3, //!< Internal 4MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_8M_RC = 4, //!< Internal 8MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_12M_RC = 5, //!< Internal 12MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_XTAL = 6, //!< External crystal oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_BYPASS = 7, //!< External bypass oscillator as PCK source clock + GENCLK_PCK_SRC_PLLACK = 8, //!< Use PLLACK as PCK source clock + GENCLK_PCK_SRC_PLLBCK = 9, //!< Use PLLBCK as PCK source clock + GENCLK_PCK_SRC_MCK = 10, //!< Use Master Clk as PCK source clock +}; + +//@} + +//! \name Programmable Clock Prescalers (PCK) +//@{ + +enum genclk_divider { + GENCLK_PCK_PRES_1 = PMC_PCK_PRES_CLK_1, //!< Set PCK clock prescaler to 1 + GENCLK_PCK_PRES_2 = PMC_PCK_PRES_CLK_2, //!< Set PCK clock prescaler to 2 + GENCLK_PCK_PRES_4 = PMC_PCK_PRES_CLK_4, //!< Set PCK clock prescaler to 4 + GENCLK_PCK_PRES_8 = PMC_PCK_PRES_CLK_8, //!< Set PCK clock prescaler to 8 + GENCLK_PCK_PRES_16 = PMC_PCK_PRES_CLK_16, //!< Set PCK clock prescaler to 16 + GENCLK_PCK_PRES_32 = PMC_PCK_PRES_CLK_32, //!< Set PCK clock prescaler to 32 + GENCLK_PCK_PRES_64 = PMC_PCK_PRES_CLK_64, //!< Set PCK clock prescaler to 64 +}; + +//@} + +struct genclk_config { + uint32_t ctrl; +}; + +static inline void genclk_config_defaults(struct genclk_config *p_cfg, + uint32_t ul_id) +{ + ul_id = ul_id; + p_cfg->ctrl = 0; +} + +static inline void genclk_config_read(struct genclk_config *p_cfg, + uint32_t ul_id) +{ + p_cfg->ctrl = PMC->PMC_PCK[ul_id]; +} + +static inline void genclk_config_write(const struct genclk_config *p_cfg, + uint32_t ul_id) +{ + PMC->PMC_PCK[ul_id] = p_cfg->ctrl; +} + +//! \name Programmable Clock Source and Prescaler configuration +//@{ + +static inline void genclk_config_set_source(struct genclk_config *p_cfg, + enum genclk_source e_src) +{ + p_cfg->ctrl &= (~PMC_PCK_CSS_Msk); + + switch (e_src) { + case GENCLK_PCK_SRC_SLCK_RC: + case GENCLK_PCK_SRC_SLCK_XTAL: + case GENCLK_PCK_SRC_SLCK_BYPASS: + p_cfg->ctrl |= (PMC_PCK_CSS_SLOW_CLK); + break; + + case GENCLK_PCK_SRC_MAINCK_4M_RC: + case GENCLK_PCK_SRC_MAINCK_8M_RC: + case GENCLK_PCK_SRC_MAINCK_12M_RC: + case GENCLK_PCK_SRC_MAINCK_XTAL: + case GENCLK_PCK_SRC_MAINCK_BYPASS: + p_cfg->ctrl |= (PMC_PCK_CSS_MAIN_CLK); + break; + + case GENCLK_PCK_SRC_PLLACK: + p_cfg->ctrl |= (PMC_PCK_CSS_PLLA_CLK); + break; + + case GENCLK_PCK_SRC_PLLBCK: + p_cfg->ctrl |= (PMC_PCK_CSS_UPLL_CLK); + break; + + case GENCLK_PCK_SRC_MCK: + p_cfg->ctrl |= (PMC_PCK_CSS_MCK); + break; + } +} + +static inline void genclk_config_set_divider(struct genclk_config *p_cfg, + uint32_t e_divider) +{ + p_cfg->ctrl &= ~PMC_PCK_PRES_Msk; + p_cfg->ctrl |= e_divider; +} + +//@} + +static inline void genclk_enable(const struct genclk_config *p_cfg, + uint32_t ul_id) +{ + PMC->PMC_PCK[ul_id] = p_cfg->ctrl; + pmc_enable_pck(ul_id); +} + +static inline void genclk_disable(uint32_t ul_id) +{ + pmc_disable_pck(ul_id); +} + +static inline void genclk_enable_source(enum genclk_source e_src) +{ + switch (e_src) { + case GENCLK_PCK_SRC_SLCK_RC: + if (!osc_is_ready(OSC_SLCK_32K_RC)) { + osc_enable(OSC_SLCK_32K_RC); + osc_wait_ready(OSC_SLCK_32K_RC); + } + break; + + case GENCLK_PCK_SRC_SLCK_XTAL: + if (!osc_is_ready(OSC_SLCK_32K_XTAL)) { + osc_enable(OSC_SLCK_32K_XTAL); + osc_wait_ready(OSC_SLCK_32K_XTAL); + } + break; + + case GENCLK_PCK_SRC_SLCK_BYPASS: + if (!osc_is_ready(OSC_SLCK_32K_BYPASS)) { + osc_enable(OSC_SLCK_32K_BYPASS); + osc_wait_ready(OSC_SLCK_32K_BYPASS); + } + break; + + case GENCLK_PCK_SRC_MAINCK_4M_RC: + if (!osc_is_ready(OSC_MAINCK_4M_RC)) { + osc_enable(OSC_MAINCK_4M_RC); + osc_wait_ready(OSC_MAINCK_4M_RC); + } + break; + + case GENCLK_PCK_SRC_MAINCK_8M_RC: + if (!osc_is_ready(OSC_MAINCK_8M_RC)) { + osc_enable(OSC_MAINCK_8M_RC); + osc_wait_ready(OSC_MAINCK_8M_RC); + } + break; + + case GENCLK_PCK_SRC_MAINCK_12M_RC: + if (!osc_is_ready(OSC_MAINCK_12M_RC)) { + osc_enable(OSC_MAINCK_12M_RC); + osc_wait_ready(OSC_MAINCK_12M_RC); + } + break; + + case GENCLK_PCK_SRC_MAINCK_XTAL: + if (!osc_is_ready(OSC_MAINCK_XTAL)) { + osc_enable(OSC_MAINCK_XTAL); + osc_wait_ready(OSC_MAINCK_XTAL); + } + break; + + case GENCLK_PCK_SRC_MAINCK_BYPASS: + if (!osc_is_ready(OSC_MAINCK_BYPASS)) { + osc_enable(OSC_MAINCK_BYPASS); + osc_wait_ready(OSC_MAINCK_BYPASS); + } + break; + +#ifdef CONFIG_PLL0_SOURCE + case GENCLK_PCK_SRC_PLLACK: + pll_enable_config_defaults(0); + break; +#endif + +#ifdef CONFIG_PLL1_SOURCE + case GENCLK_PCK_SRC_PLLBCK: + pll_enable_config_defaults(1); + break; +#endif + + case GENCLK_PCK_SRC_MCK: + break; + + default: + Assert(false); + break; + } +} + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_GENCLK_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/mrepeat.h b/Marlin/src/HAL/DUE/usb/mrepeat.h new file mode 100644 index 00000000..8363d9cd --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/mrepeat.h @@ -0,0 +1,339 @@ +/** + * \file + * + * \brief Preprocessor macro repeating utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _MREPEAT_H_ +#define _MREPEAT_H_ + +/** + * \defgroup group_sam_utils_mrepeat Preprocessor - Macro Repeat + * + * \ingroup group_sam_utils + * + * \{ + */ + +#include "preprocessor.h" + + +//! Maximal number of repetitions supported by MREPEAT. +#define MREPEAT_LIMIT 256 + +/*! \brief Macro repeat. + * + * This macro represents a horizontal repetition construct. + * + * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. + * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with + * the current repetition number and the auxiliary data argument. + * \param data Auxiliary data passed to macro. + * + * \return macro(0, data) macro(1, data) ... macro(count - 1, data) + */ +#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) + +#define MREPEAT0( macro, data) +#define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) +#define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) +#define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) +#define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) +#define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) +#define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) +#define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) +#define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) +#define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) +#define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) +#define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) +#define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) +#define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) +#define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) +#define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) +#define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) +#define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) +#define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) +#define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) +#define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) +#define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) +#define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) +#define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) +#define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) +#define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) +#define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) +#define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) +#define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) +#define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) +#define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) +#define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) +#define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) +#define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) +#define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) +#define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) +#define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) +#define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) +#define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) +#define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) +#define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) +#define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) +#define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) +#define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) +#define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) +#define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) +#define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) +#define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) +#define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) +#define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) +#define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) +#define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) +#define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) +#define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) +#define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) +#define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) +#define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) +#define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) +#define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) +#define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) +#define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) +#define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) +#define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) +#define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) +#define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) +#define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) +#define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) +#define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) +#define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) +#define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) +#define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) +#define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) +#define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) +#define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) +#define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) +#define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) +#define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) +#define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) +#define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) +#define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) +#define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) +#define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) +#define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) +#define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) +#define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) +#define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) +#define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) +#define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) +#define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) +#define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) +#define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) +#define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) +#define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) +#define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) +#define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) +#define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) +#define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) +#define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) +#define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) +#define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) +#define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) +#define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) +#define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) +#define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) +#define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) +#define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) +#define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) +#define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) +#define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) +#define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) +#define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) +#define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) +#define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) +#define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) +#define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) +#define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) +#define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) +#define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) +#define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) +#define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) +#define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) +#define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) +#define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) +#define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) +#define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) +#define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) +#define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) +#define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) +#define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) +#define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) +#define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) +#define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) +#define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) +#define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) +#define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) +#define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) +#define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) +#define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) +#define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) +#define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) +#define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) +#define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) +#define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) +#define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) +#define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) +#define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) +#define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) +#define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) +#define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) +#define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) +#define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) +#define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) +#define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) +#define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) +#define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) +#define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) +#define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) +#define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) +#define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) +#define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) +#define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) +#define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) +#define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) +#define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) +#define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) +#define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) +#define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) +#define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) +#define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) +#define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) +#define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) +#define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) +#define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) +#define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) +#define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) +#define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) +#define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) +#define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) +#define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) +#define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) +#define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) +#define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) +#define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) +#define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) +#define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) +#define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) +#define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) +#define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) +#define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) +#define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) +#define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) +#define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) +#define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) +#define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) +#define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) +#define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) +#define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) +#define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) +#define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) +#define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) +#define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) +#define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) +#define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) +#define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) +#define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) +#define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) +#define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) +#define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) +#define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) +#define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) +#define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) +#define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) +#define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) +#define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) +#define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) +#define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) +#define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) +#define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) +#define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) +#define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) +#define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) +#define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) +#define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) +#define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) +#define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) +#define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) +#define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) +#define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) +#define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) +#define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) +#define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) +#define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) +#define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) +#define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) +#define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) +#define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) +#define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) +#define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) +#define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) +#define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) +#define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) +#define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) +#define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) +#define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) +#define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) +#define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) +#define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) +#define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) +#define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) +#define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) +#define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) +#define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) +#define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) +#define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) +#define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) +#define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) +#define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) + +/** + * \} + */ + +#endif // _MREPEAT_H_ diff --git a/Marlin/src/HAL/DUE/usb/osc.h b/Marlin/src/HAL/DUE/usb/osc.h new file mode 100644 index 00000000..953bcbbe --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/osc.h @@ -0,0 +1,261 @@ +/** + * \file + * + * \brief Chip-specific oscillator management functions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_OSC_H_INCLUDED +#define CHIP_OSC_H_INCLUDED + +#include "compiler.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/* + * Below BOARD_XXX macros are related to the specific board, and + * should be defined by the board code, otherwise default value are used. + */ +#ifndef BOARD_FREQ_SLCK_XTAL +# warning The board slow clock xtal frequency has not been defined. +# define BOARD_FREQ_SLCK_XTAL (32768UL) +#endif + +#ifndef BOARD_FREQ_SLCK_BYPASS +# warning The board slow clock bypass frequency has not been defined. +# define BOARD_FREQ_SLCK_BYPASS (32768UL) +#endif + +#ifndef BOARD_FREQ_MAINCK_XTAL +# warning The board main clock xtal frequency has not been defined. +# define BOARD_FREQ_MAINCK_XTAL (12000000UL) +#endif + +#ifndef BOARD_FREQ_MAINCK_BYPASS +# warning The board main clock bypass frequency has not been defined. +# define BOARD_FREQ_MAINCK_BYPASS (12000000UL) +#endif + +#ifndef BOARD_OSC_STARTUP_US +# warning The board main clock xtal startup time has not been defined. +# define BOARD_OSC_STARTUP_US (15625UL) +#endif + +/** + * \weakgroup osc_group + * @{ + */ + +//! \name Oscillator identifiers +//@{ +#define OSC_SLCK_32K_RC 0 //!< Internal 32kHz RC oscillator. +#define OSC_SLCK_32K_XTAL 1 //!< External 32kHz crystal oscillator. +#define OSC_SLCK_32K_BYPASS 2 //!< External 32kHz bypass oscillator. +#define OSC_MAINCK_4M_RC 3 //!< Internal 4MHz RC oscillator. +#define OSC_MAINCK_8M_RC 4 //!< Internal 8MHz RC oscillator. +#define OSC_MAINCK_12M_RC 5 //!< Internal 12MHz RC oscillator. +#define OSC_MAINCK_XTAL 6 //!< External crystal oscillator. +#define OSC_MAINCK_BYPASS 7 //!< External bypass oscillator. +//@} + +//! \name Oscillator clock speed in hertz +//@{ +#define OSC_SLCK_32K_RC_HZ CHIP_FREQ_SLCK_RC //!< Internal 32kHz RC oscillator. +#define OSC_SLCK_32K_XTAL_HZ BOARD_FREQ_SLCK_XTAL //!< External 32kHz crystal oscillator. +#define OSC_SLCK_32K_BYPASS_HZ BOARD_FREQ_SLCK_BYPASS //!< External 32kHz bypass oscillator. +#define OSC_MAINCK_4M_RC_HZ CHIP_FREQ_MAINCK_RC_4MHZ //!< Internal 4MHz RC oscillator. +#define OSC_MAINCK_8M_RC_HZ CHIP_FREQ_MAINCK_RC_8MHZ //!< Internal 8MHz RC oscillator. +#define OSC_MAINCK_12M_RC_HZ CHIP_FREQ_MAINCK_RC_12MHZ //!< Internal 12MHz RC oscillator. +#define OSC_MAINCK_XTAL_HZ BOARD_FREQ_MAINCK_XTAL //!< External crystal oscillator. +#define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator. +//@} + +static inline void osc_enable(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + break; + + case OSC_SLCK_32K_XTAL: + pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); + break; + + case OSC_SLCK_32K_BYPASS: + pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS); + break; + + + case OSC_MAINCK_4M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); + break; + + case OSC_MAINCK_8M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); + break; + + case OSC_MAINCK_12M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); + break; + + + case OSC_MAINCK_XTAL: + pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*, + pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, + OSC_SLCK_32K_RC_HZ)*/); + break; + + case OSC_MAINCK_BYPASS: + pmc_switch_mainck_to_xtal(PMC_OSC_BYPASS/*, + pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, + OSC_SLCK_32K_RC_HZ)*/); + break; + } +} + +static inline void osc_disable(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + case OSC_SLCK_32K_XTAL: + case OSC_SLCK_32K_BYPASS: + break; + + case OSC_MAINCK_4M_RC: + case OSC_MAINCK_8M_RC: + case OSC_MAINCK_12M_RC: + pmc_osc_disable_fastrc(); + break; + + case OSC_MAINCK_XTAL: + pmc_osc_disable_xtal(PMC_OSC_XTAL); + break; + + case OSC_MAINCK_BYPASS: + pmc_osc_disable_xtal(PMC_OSC_BYPASS); + break; + } +} + +static inline bool osc_is_ready(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + return 1; + + case OSC_SLCK_32K_XTAL: + case OSC_SLCK_32K_BYPASS: + return pmc_osc_is_ready_32kxtal(); + + case OSC_MAINCK_4M_RC: + case OSC_MAINCK_8M_RC: + case OSC_MAINCK_12M_RC: + case OSC_MAINCK_XTAL: + case OSC_MAINCK_BYPASS: + return pmc_osc_is_ready_mainck(); + } + + return 0; +} + +static inline uint32_t osc_get_rate(uint32_t ul_id) +{ + switch (ul_id) { + case OSC_SLCK_32K_RC: + return OSC_SLCK_32K_RC_HZ; + + case OSC_SLCK_32K_XTAL: + return BOARD_FREQ_SLCK_XTAL; + + case OSC_SLCK_32K_BYPASS: + return BOARD_FREQ_SLCK_BYPASS; + + case OSC_MAINCK_4M_RC: + return OSC_MAINCK_4M_RC_HZ; + + case OSC_MAINCK_8M_RC: + return OSC_MAINCK_8M_RC_HZ; + + case OSC_MAINCK_12M_RC: + return OSC_MAINCK_12M_RC_HZ; + + case OSC_MAINCK_XTAL: + return BOARD_FREQ_MAINCK_XTAL; + + case OSC_MAINCK_BYPASS: + return BOARD_FREQ_MAINCK_BYPASS; + } + + return 0; +} + +/** + * \brief Wait until the oscillator identified by \a id is ready + * + * This function will busy-wait for the oscillator identified by \a id + * to become stable and ready to use as a clock source. + * + * \param id A number identifying the oscillator to wait for. + */ +static inline void osc_wait_ready(uint8_t id) +{ + while (!osc_is_ready(id)) { + /* Do nothing */ + } +} + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_OSC_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/pll.h b/Marlin/src/HAL/DUE/usb/pll.h new file mode 100644 index 00000000..8eaf2767 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/pll.h @@ -0,0 +1,288 @@ +/** + * \file + * + * \brief Chip-specific PLL definitions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_PLL_H_INCLUDED +#define CHIP_PLL_H_INCLUDED + +#include "osc.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup pll_group + * @{ + */ + +#define PLL_OUTPUT_MIN_HZ 84000000 +#define PLL_OUTPUT_MAX_HZ 192000000 + +#define PLL_INPUT_MIN_HZ 8000000 +#define PLL_INPUT_MAX_HZ 16000000 + +#define NR_PLLS 2 +#define PLLA_ID 0 +#define UPLL_ID 1 //!< USB UTMI PLL. + +#define PLL_UPLL_HZ 480000000 + +#define PLL_COUNT 0x3FU + +enum pll_source { + PLL_SRC_MAINCK_4M_RC = OSC_MAINCK_4M_RC, //!< Internal 4MHz RC oscillator. + PLL_SRC_MAINCK_8M_RC = OSC_MAINCK_8M_RC, //!< Internal 8MHz RC oscillator. + PLL_SRC_MAINCK_12M_RC = OSC_MAINCK_12M_RC, //!< Internal 12MHz RC oscillator. + PLL_SRC_MAINCK_XTAL = OSC_MAINCK_XTAL, //!< External crystal oscillator. + PLL_SRC_MAINCK_BYPASS = OSC_MAINCK_BYPASS, //!< External bypass oscillator. + PLL_NR_SOURCES, //!< Number of PLL sources. +}; + +struct pll_config { + uint32_t ctrl; +}; + +#define pll_get_default_rate(pll_id) \ + ((osc_get_rate(CONFIG_PLL##pll_id##_SOURCE) \ + * CONFIG_PLL##pll_id##_MUL) \ + / CONFIG_PLL##pll_id##_DIV) + +/* Force UTMI PLL parameters (Hardware defined) */ +#ifdef CONFIG_PLL1_SOURCE +# undef CONFIG_PLL1_SOURCE +#endif +#ifdef CONFIG_PLL1_MUL +# undef CONFIG_PLL1_MUL +#endif +#ifdef CONFIG_PLL1_DIV +# undef CONFIG_PLL1_DIV +#endif +#define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL +#define CONFIG_PLL1_MUL 0 +#define CONFIG_PLL1_DIV 0 + +/** + * \note The SAM3X PLL hardware interprets mul as mul+1. For readability the hardware mul+1 + * is hidden in this implementation. Use mul as mul effective value. + */ +static inline void pll_config_init(struct pll_config *p_cfg, + enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul) +{ + uint32_t vco_hz; + + Assert(e_src < PLL_NR_SOURCES); + + if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */ + p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT); + } else { /* PLLA */ + /* Calculate internal VCO frequency */ + vco_hz = osc_get_rate(e_src) / ul_div; + Assert(vco_hz >= PLL_INPUT_MIN_HZ); + Assert(vco_hz <= PLL_INPUT_MAX_HZ); + + vco_hz *= ul_mul; + Assert(vco_hz >= PLL_OUTPUT_MIN_HZ); + Assert(vco_hz <= PLL_OUTPUT_MAX_HZ); + + /* PMC hardware will automatically make it mul+1 */ + p_cfg->ctrl = CKGR_PLLAR_MULA(ul_mul - 1) | CKGR_PLLAR_DIVA(ul_div) | CKGR_PLLAR_PLLACOUNT(PLL_COUNT); + } +} + +#define pll_config_defaults(cfg, pll_id) \ + pll_config_init(cfg, \ + CONFIG_PLL##pll_id##_SOURCE, \ + CONFIG_PLL##pll_id##_DIV, \ + CONFIG_PLL##pll_id##_MUL) + +static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + p_cfg->ctrl = PMC->CKGR_PLLAR; + } else { + p_cfg->ctrl = PMC->CKGR_UCKR; + } +} + +static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); // Always stop PLL first! + PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; + } else { + PMC->CKGR_UCKR = p_cfg->ctrl; + } +} + +static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); // Always stop PLL first! + PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; + } else { + PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN; + } +} + +/** + * \note This will only disable the selected PLL, not the underlying oscillator (mainck). + */ +static inline void pll_disable(uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); + } else { + PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN; + } +} + +static inline uint32_t pll_is_locked(uint32_t ul_pll_id) +{ + Assert(ul_pll_id < NR_PLLS); + + if (ul_pll_id == PLLA_ID) { + return pmc_is_locked_pllack(); + } else { + return pmc_is_locked_upll(); + } +} + +static inline void pll_enable_source(enum pll_source e_src) +{ + switch (e_src) { + case PLL_SRC_MAINCK_4M_RC: + case PLL_SRC_MAINCK_8M_RC: + case PLL_SRC_MAINCK_12M_RC: + case PLL_SRC_MAINCK_XTAL: + case PLL_SRC_MAINCK_BYPASS: + osc_enable(e_src); + osc_wait_ready(e_src); + break; + + default: + Assert(false); + break; + } +} + +static inline void pll_enable_config_defaults(unsigned int ul_pll_id) +{ + struct pll_config pllcfg; + + if (pll_is_locked(ul_pll_id)) { + return; // Pll already running + } + switch (ul_pll_id) { +#ifdef CONFIG_PLL0_SOURCE + case 0: + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL0_SOURCE, + CONFIG_PLL0_DIV, + CONFIG_PLL0_MUL); + break; +#endif +#ifdef CONFIG_PLL1_SOURCE + case 1: + pll_enable_source(CONFIG_PLL1_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL1_SOURCE, + CONFIG_PLL1_DIV, + CONFIG_PLL1_MUL); + break; +#endif + default: + Assert(false); + break; + } + pll_enable(&pllcfg, ul_pll_id); + while (!pll_is_locked(ul_pll_id)); +} + +/** + * \brief Wait for PLL \a pll_id to become locked + * + * \todo Use a timeout to avoid waiting forever and hanging the system + * + * \param pll_id The ID of the PLL to wait for. + * + * \retval STATUS_OK The PLL is now locked. + * \retval ERR_TIMEOUT Timed out waiting for PLL to become locked. + */ +static inline int pll_wait_for_lock(unsigned int pll_id) +{ + Assert(pll_id < NR_PLLS); + + while (!pll_is_locked(pll_id)) { + /* Do nothing */ + } + + return 0; +} + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_PLL_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/preprocessor.h b/Marlin/src/HAL/DUE/usb/preprocessor.h new file mode 100644 index 00000000..c12d01cb --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/preprocessor.h @@ -0,0 +1,55 @@ +/** + * \file + * + * \brief Preprocessor utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _PREPROCESSOR_H_ +#define _PREPROCESSOR_H_ + +#include "tpaste.h" +#include "stringz.h" +#include "mrepeat.h" + + +#endif // _PREPROCESSOR_H_ diff --git a/Marlin/src/HAL/DUE/usb/sbc_protocol.h b/Marlin/src/HAL/DUE/usb/sbc_protocol.h new file mode 100644 index 00000000..ab845739 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/sbc_protocol.h @@ -0,0 +1,173 @@ +/** + * \file + * + * \brief SCSI Block Commands + * + * This file contains definitions of some of the commands found in the + * SCSI SBC-2 standard. + * + * Note that the SBC specification depends on several commands defined + * by the SCSI Primary Commands (SPC) standard. Each version of the SBC + * standard is meant to be used in conjunction with a specific version + * of the SPC standard, as follows: + * - SBC depends on SPC + * - SBC-2 depends on SPC-3 + * - SBC-3 depends on SPC-4 + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _SBC_PROTOCOL_H_ +#define _SBC_PROTOCOL_H_ + + +/** + * \ingroup usb_msc_protocol + * \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions + * + * @{ + */ + +//! \name SCSI commands defined by SBC-2 +//@{ +#define SBC_FORMAT_UNIT 0x04 +#define SBC_READ6 0x08 +#define SBC_WRITE6 0x0A +#define SBC_START_STOP_UNIT 0x1B +#define SBC_READ_CAPACITY10 0x25 +#define SBC_READ10 0x28 +#define SBC_WRITE10 0x2A +#define SBC_VERIFY10 0x2F +//@} + +//! \name SBC-2 Mode page definitions +//@{ + +enum scsi_sbc_mode { + SCSI_MS_MODE_RW_ERR_RECOV = 0x01, //!< Read-Write Error Recovery mode page + SCSI_MS_MODE_FORMAT_DEVICE = 0x03, //!< Format Device mode page + SCSI_MS_MODE_FLEXIBLE_DISK = 0x05, //!< Flexible Disk mode page + SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page +}; + + +//! \name SBC-2 Device-Specific Parameter +//@{ +#define SCSI_MS_SBC_WP 0x80 //!< Write Protected +#define SCSI_MS_SBC_DPOFUA 0x10 //!< DPO and FUA supported +//@} + +/** + * \brief SBC-2 Short LBA mode parameter block descriptor + */ +struct sbc_slba_block_desc { + be32_t nr_blocks; //!< Number of Blocks + be32_t block_len; //!< Block Length +#define SBC_SLBA_BLOCK_LEN_MASK 0x00FFFFFFU //!< Mask reserved bits +}; + +/** + * \brief SBC-2 Caching mode page + */ +struct sbc_caching_mode_page { + uint8_t page_code; + uint8_t page_length; + uint8_t flags2; +#define SBC_MP_CACHE_IC (1 << 7) //!< Initiator Control +#define SBC_MP_CACHE_ABPF (1 << 6) //!< Abort Pre-Fetch +#define SBC_MP_CACHE_CAP (1 << 5) //!< Catching Analysis Permitted +#define SBC_MP_CACHE_DISC (1 << 4) //!< Discontinuity +#define SBC_MP_CACHE_SIZE (1 << 3) //!< Size enable +#define SBC_MP_CACHE_WCE (1 << 2) //!< Write back Cache Enable +#define SBC_MP_CACHE_MF (1 << 1) //!< Multiplication Factor +#define SBC_MP_CACHE_RCD (1 << 0) //!< Read Cache Disable + uint8_t retention; + be16_t dis_pf_transfer_len; + be16_t min_prefetch; + be16_t max_prefetch; + be16_t max_prefetch_ceil; + uint8_t flags12; +#define SBC_MP_CACHE_FSW (1 << 7) //!< Force Sequential Write +#define SBC_MP_CACHE_LBCSS (1 << 6) //!< Logical Blk Cache Seg Sz +#define SBC_MP_CACHE_DRA (1 << 5) //!< Disable Read-Ahead +#define SBC_MP_CACHE_NV_DIS (1 << 0) //!< Non-Volatile Cache Disable + uint8_t nr_cache_segments; + be16_t cache_segment_size; + uint8_t reserved[4]; +}; + +/** + * \brief SBC-2 Read-Write Error Recovery mode page + */ +struct sbc_rdwr_error_recovery_mode_page { + uint8_t page_code; + uint8_t page_length; +#define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A + uint8_t flags1; +#define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7) +#define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6) +#define SBC_MP_RW_ERR_RECOV_TB (1 << 5) +#define SBC_MP_RW_ERR_RECOV_RC (1 << 4) +#define SBC_MP_RW_ERR_RECOV_ERR (1 << 3) +#define SBC_MP_RW_ERR_RECOV_PER (1 << 2) +#define SBC_MP_RW_ERR_RECOV_DTE (1 << 1) +#define SBC_MP_RW_ERR_RECOV_DCR (1 << 0) + uint8_t read_retry_count; + uint8_t correction_span; + uint8_t head_offset_count; + uint8_t data_strobe_offset_count; + uint8_t flags2; + uint8_t write_retry_count; + uint8_t flags3; + be16_t recovery_time_limit; +}; +//@} + +/** + * \brief SBC-2 READ CAPACITY (10) parameter data + */ +struct sbc_read_capacity10_data { + be32_t max_lba; //!< LBA of last logical block + be32_t block_len; //!< Number of bytes in the last logical block +}; + +//@} + +#endif // _SBC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp new file mode 100644 index 00000000..ea293635 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.cpp @@ -0,0 +1,142 @@ +/** + * Interface from Atmel USB MSD to Marlin SD card + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "../../../sd/cardreader.h" +extern "C" { +#include "sd_mmc_spi_mem.h" +} + +#define SD_MMC_BLOCK_SIZE 512 + +void sd_mmc_spi_mem_init() { +} + +Ctrl_status sd_mmc_spi_test_unit_ready() { + #ifdef DISABLE_DUE_SD_MMC + return CTRL_NO_PRESENT; + #endif + if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) + return CTRL_NO_PRESENT; + return CTRL_GOOD; +} + +// NOTE: This function is defined as returning the address of the last block +// in the card, which is cardSize() - 1 +Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector) { + if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) + return CTRL_NO_PRESENT; + *nb_sector = card.getSd2Card().cardSize() - 1; + return CTRL_GOOD; +} + +bool sd_mmc_spi_unload(bool) { return true; } + +bool sd_mmc_spi_wr_protect() { return false; } + +bool sd_mmc_spi_removal() { + return (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()); +} + +#if ACCESS_USB == true +/** + * \name MEM <-> USB Interface + * @{ + */ + +#include "udi_msc.h" + +COMPILER_WORD_ALIGNED +uint8_t sector_buf[SD_MMC_BLOCK_SIZE]; + +// #define DEBUG_MMC + +Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector) { + #ifdef DISABLE_DUE_SD_MMC + return CTRL_NO_PRESENT; + #endif + if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) + return CTRL_NO_PRESENT; + + #ifdef DEBUG_MMC + { + char buffer[80]; + sprintf_P(buffer, PSTR("SDRD: %d @ 0x%08x\n"), nb_sector, addr); + PORT_REDIRECT(0); + SERIAL_ECHO(buffer); + } + #endif + + // Start reading + if (!card.getSd2Card().readStart(addr)) + return CTRL_FAIL; + + // For each specified sector + while (nb_sector--) { + + // Read a sector + card.getSd2Card().readData(sector_buf); + + // RAM -> USB + if (!udi_msc_trans_block(true, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + card.getSd2Card().readStop(); + return CTRL_FAIL; + } + } + + // Stop reading + card.getSd2Card().readStop(); + + // Done + return CTRL_GOOD; +} + +Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector) { + #ifdef DISABLE_DUE_SD_MMC + return CTRL_NO_PRESENT; + #endif + if (!IS_SD_INSERTED() || IS_SD_PRINTING() || IS_SD_FILE_OPEN() || !card.isMounted()) + return CTRL_NO_PRESENT; + + #ifdef DEBUG_MMC + { + char buffer[80]; + sprintf_P(buffer, PSTR("SDWR: %d @ 0x%08x\n"), nb_sector, addr); + PORT_REDIRECT(0); + SERIAL_ECHO(buffer); + } + #endif + + if (!card.getSd2Card().writeStart(addr, nb_sector)) + return CTRL_FAIL; + + // For each specified sector + while (nb_sector--) { + + // USB -> RAM + if (!udi_msc_trans_block(false, sector_buf, SD_MMC_BLOCK_SIZE, NULL)) { + card.getSd2Card().writeStop(); + return CTRL_FAIL; + } + + // Write a sector + card.getSd2Card().writeData(sector_buf); + } + + // Stop writing + card.getSd2Card().writeStop(); + + // Done + return CTRL_GOOD; +} + +#endif // ACCESS_USB == true + +#endif // SDSUPPORT +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h new file mode 100644 index 00000000..d77e4f95 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/sd_mmc_spi_mem.h @@ -0,0 +1,177 @@ +/***************************************************************************** + * + * \file + * + * \brief CTRL_ACCESS interface for SD/MMC card. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + + +#ifndef _SD_MMC_SPI_MEM_H_ +#define _SD_MMC_SPI_MEM_H_ + +/** + * \defgroup group_avr32_components_memory_sd_mmc_sd_mmc_spi_mem SD/MMC SPI Memory + * + * \ingroup group_avr32_components_memory_sd_mmc_sd_mmc_spi + * + * \{ + */ + +#include "conf_access.h" + +#if SD_MMC_SPI_MEM == DISABLE + #error sd_mmc_spi_mem.h is #included although SD_MMC_SPI_MEM is disabled +#endif + + +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#define SD_MMC_REMOVED 0 +#define SD_MMC_INSERTED 1 +#define SD_MMC_REMOVING 2 + + +//---- CONTROL FONCTIONS ---- +//! +//! @brief This function initializes the hw/sw resources required to drive the SD_MMC_SPI. +//!/ +extern void sd_mmc_spi_mem_init(void); + +//! +//! @brief This function tests the state of the SD_MMC memory and sends it to the Host. +//! For a PC, this device is seen as a removable media +//! Before indicating any modification of the status of the media (GOOD->NO_PRESENT or vice-versa), +//! the function must return the BUSY data to make the PC accepting the change +//! +//! @return Ctrl_status +//! Media is ready -> CTRL_GOOD +//! Media not present -> CTRL_NO_PRESENT +//! Media has changed -> CTRL_BUSY +//!/ +extern Ctrl_status sd_mmc_spi_test_unit_ready(void); + +//! +//! @brief This function gives the address of the last valid sector. +//! +//! @param *nb_sector number of sector (sector = 512B). OUT +//! +//! @return Ctrl_status +//! Media ready -> CTRL_GOOD +//! Media not present -> CTRL_NO_PRESENT +//!/ +extern Ctrl_status sd_mmc_spi_read_capacity(uint32_t *nb_sector); + +/*! \brief Unload/Load the SD/MMC card selected + * + * The START STOP UNIT SCSI optional command allows an application client to + * eject the removable medium on a LUN. + * + * \param unload \c true to unload the medium, \c false to load the medium. + * + * \return \c true if unload/load done success. + */ +extern bool sd_mmc_spi_unload(bool unload); + +//! +//! @brief This function returns the write protected status of the memory. +//! +//! Only used by memory removal with a HARDWARE SPECIFIC write protected detection +//! ! The user must unplug the memory to change this write protected status, +//! which cannot be for a SD_MMC. +//! +//! @return false -> the memory is not write-protected (always) +//!/ +extern bool sd_mmc_spi_wr_protect(void); + +//! +//! @brief This function tells if the memory has been removed or not. +//! +//! @return false -> The memory isn't removed +//! +extern bool sd_mmc_spi_removal(void); + + +//---- ACCESS DATA FONCTIONS ---- + +#if ACCESS_USB == true +// Standard functions for open in read/write mode the device + +//! +//! @brief This function performs a read operation of n sectors from a given address on. +//! (sector = 512B) +//! +//! DATA FLOW is: SD_MMC => USB +//! +//! @param addr Sector address to start the read from +//! @param nb_sector Number of sectors to transfer +//! +//! @return Ctrl_status +//! It is ready -> CTRL_GOOD +//! A error occur -> CTRL_FAIL +//! +extern Ctrl_status sd_mmc_spi_usb_read_10(uint32_t addr, uint16_t nb_sector); + +//! This function initializes the SD/MMC memory for a write operation +//! +//! DATA FLOW is: USB => SD_MMC +//! +//! (sector = 512B) +//! @param addr Sector address to start write +//! @param nb_sector Number of sectors to transfer +//! +//! @return Ctrl_status +//! It is ready -> CTRL_GOOD +//! An error occurs -> CTRL_FAIL +//! +extern Ctrl_status sd_mmc_spi_usb_write_10(uint32_t addr, uint16_t nb_sector); + +#endif // #if ACCESS_USB == true + +/** + * \} + */ + +#endif // _SD_MMC_SPI_MEM_H_ diff --git a/Marlin/src/HAL/DUE/usb/spc_protocol.h b/Marlin/src/HAL/DUE/usb/spc_protocol.h new file mode 100644 index 00000000..d67cc5c7 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/spc_protocol.h @@ -0,0 +1,337 @@ +/** + * \file + * + * \brief SCSI Primary Commands + * + * This file contains definitions of some of the commands found in the + * SPC-2 standard. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _SPC_PROTOCOL_H_ +#define _SPC_PROTOCOL_H_ + +/** + * \ingroup usb_msc_protocol + * \defgroup usb_spc_protocol SCSI Primary Commands protocol definitions + * + * @{ + */ + +//! \name SCSI commands defined by SPC-2 +//@{ +#define SPC_TEST_UNIT_READY 0x00 +#define SPC_REQUEST_SENSE 0x03 +#define SPC_INQUIRY 0x12 +#define SPC_MODE_SELECT6 0x15 +#define SPC_MODE_SENSE6 0x1A +#define SPC_SEND_DIAGNOSTIC 0x1D +#define SPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E +#define SPC_MODE_SENSE10 0x5A +#define SPC_REPORT_LUNS 0xA0 +//@} + +//! \brief May be set in byte 0 of the INQUIRY CDB +//@{ +//! Enable Vital Product Data +#define SCSI_INQ_REQ_EVPD 0x01 +//! Command Support Data specified by the PAGE OR OPERATION CODE field +#define SCSI_INQ_REQ_CMDT 0x02 +//@} + +COMPILER_PACK_SET(1) + +/** + * \brief SCSI Standard Inquiry data structure + */ +struct scsi_inquiry_data { + uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type +#define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected +#define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected +#define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported +#define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC) +#define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access +#define SCSI_INQ_DT_PRINTER 0x02 //!< Printer +#define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device +#define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device +#define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device +#define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory +#define SCSI_INQ_DT_MC 0x08 //!< Medium Changer +#define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller +#define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services +#define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access +#define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer +#define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands +#define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage +#define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral + uint8_t flags1; //!< Flags (byte 1) +#define SCSI_INQ_RMB 0x80 //!< Removable Medium + uint8_t version; //!< Version +#define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance +#define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC) +#define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2) +#define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2) +#define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3) + uint8_t flags3; //!< Flags (byte 3) +#define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported +#define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing +#define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format + uint8_t addl_len; //!< Additional Length (n-4) +#define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot + uint8_t flags5; //!< Flags (byte 5) +#define SCSI_INQ_SCCS 0x80 + uint8_t flags6; //!< Flags (byte 6) +#define SCSI_INQ_BQUE 0x80 +#define SCSI_INQ_ENCSERV 0x40 +#define SCSI_INQ_MULTIP 0x10 +#define SCSI_INQ_MCHGR 0x08 +#define SCSI_INQ_ADDR16 0x01 + uint8_t flags7; //!< Flags (byte 7) +#define SCSI_INQ_WBUS16 0x20 +#define SCSI_INQ_SYNC 0x10 +#define SCSI_INQ_LINKED 0x08 +#define SCSI_INQ_CMDQUE 0x02 + uint8_t vendor_id[8]; //!< T10 Vendor Identification + uint8_t product_id[16]; //!< Product Identification + uint8_t product_rev[4]; //!< Product Revision Level +}; + +/** + * \brief SCSI Standard Request sense data structure + */ +struct scsi_request_sense_data { + /* 1st byte: REQUEST SENSE response flags*/ + uint8_t valid_reponse_code; +#define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information +#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F +#define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors) +#define SCSI_SENSE_DEFERRED 0x71 + + /* 2nd byte */ + uint8_t obsolete; + + /* 3rd byte */ + uint8_t sense_flag_key; +#define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark. +#define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists. +#define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium. +#define SCSI_SENSE_RESERVED 0x10 //!< Reserved +#define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key + + /* 4th to 7th bytes - INFORMATION field */ + uint8_t information[4]; + + /* 8th byte - ADDITIONAL SENSE LENGTH field */ + uint8_t AddSenseLen; +#define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8) + + /* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */ + uint8_t CmdSpecINFO[4]; + + /* 13th byte - ADDITIONAL SENSE CODE field */ + uint8_t AddSenseCode; + + /* 14th byte - ADDITIONAL SENSE CODE QUALIFIER field */ + uint8_t AddSnsCodeQlfr; + + /* 15th byte - FIELD REPLACEABLE UNIT CODE field */ + uint8_t FldReplUnitCode; + + /* 16th byte */ + uint8_t SenseKeySpec[3]; +#define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information +}; + +COMPILER_PACK_RESET() + +/* Vital Product Data page codes */ +enum scsi_vpd_page_code { + SCSI_VPD_SUPPORTED_PAGES = 0x00, + SCSI_VPD_UNIT_SERIAL_NUMBER = 0x80, + SCSI_VPD_DEVICE_IDENTIFICATION = 0x83, +}; +#define SCSI_VPD_HEADER_SIZE 4 + +/* Constants associated with the Device Identification VPD page */ +#define SCSI_VPD_ID_HEADER_SIZE 4 + +#define SCSI_VPD_CODE_SET_BINARY 1 +#define SCSI_VPD_CODE_SET_ASCII 2 +#define SCSI_VPD_CODE_SET_UTF8 3 + +#define SCSI_VPD_ID_TYPE_T10 1 + + +/* Sense keys */ +enum scsi_sense_key { + SCSI_SK_NO_SENSE = 0x0, + SCSI_SK_RECOVERED_ERROR = 0x1, + SCSI_SK_NOT_READY = 0x2, + SCSI_SK_MEDIUM_ERROR = 0x3, + SCSI_SK_HARDWARE_ERROR = 0x4, + SCSI_SK_ILLEGAL_REQUEST = 0x5, + SCSI_SK_UNIT_ATTENTION = 0x6, + SCSI_SK_DATA_PROTECT = 0x7, + SCSI_SK_BLANK_CHECK = 0x8, + SCSI_SK_VENDOR_SPECIFIC = 0x9, + SCSI_SK_COPY_ABORTED = 0xA, + SCSI_SK_ABORTED_COMMAND = 0xB, + SCSI_SK_VOLUME_OVERFLOW = 0xD, + SCSI_SK_MISCOMPARE = 0xE, +}; + +/* Additional Sense Code / Additional Sense Code Qualifier pairs */ +enum scsi_asc_ascq { + SCSI_ASC_NO_ADDITIONAL_SENSE_INFO = 0x0000, + SCSI_ASC_LU_NOT_READY_REBUILD_IN_PROGRESS = 0x0405, + SCSI_ASC_WRITE_ERROR = 0x0C00, + SCSI_ASC_UNRECOVERED_READ_ERROR = 0x1100, + SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x2000, + SCSI_ASC_INVALID_FIELD_IN_CDB = 0x2400, + SCSI_ASC_WRITE_PROTECTED = 0x2700, + SCSI_ASC_NOT_READY_TO_READY_CHANGE = 0x2800, + SCSI_ASC_MEDIUM_NOT_PRESENT = 0x3A00, + SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x4400, +}; + +/** + * \brief SPC-2 Mode parameter + * This subclause describes the block descriptors and the pages + * used with MODE SELECT and MODE SENSE commands + * that are applicable to all SCSI devices. + */ +enum scsi_spc_mode { + SCSI_MS_MODE_VENDOR_SPEC = 0x00, + SCSI_MS_MODE_INFEXP = 0x1C, // Informational exceptions control page + SCSI_MS_MODE_ALL = 0x3F, +}; + +/** + * \brief SPC-2 Informational exceptions control page + * See chapter 8.3.8 + */ +struct spc_control_page_info_execpt { + uint8_t page_code; + uint8_t page_length; +#define SPC_MP_INFEXP_PAGE_LENGTH 0x0A + uint8_t flags1; +#define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control +#define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted +#define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity +#define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable +#define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable +#define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit + uint8_t mrie; +#define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00 +#define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01 +#define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02 +#define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03 +#define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04 +#define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05 +#define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06 + be32_t interval_timer; + be32_t report_count; +}; + + +enum scsi_spc_mode_sense_pc { + SCSI_MS_SENSE_PC_CURRENT = 0, + SCSI_MS_SENSE_PC_CHANGEABLE = 1, + SCSI_MS_SENSE_PC_DEFAULT = 2, + SCSI_MS_SENSE_PC_SAVED = 3, +}; + + + +static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb) +{ + return (cdb[1] >> 3) & 1; +} + +static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb) +{ + return cdb[2] & 0x3F; +} + +static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) +{ + return cdb[2] >> 6; +} + +/** + * \brief SCSI Mode Parameter Header used by MODE SELECT(6) and MODE + * SENSE(6) + */ +struct scsi_mode_param_header6 { + uint8_t mode_data_length; //!< Number of bytes after this + uint8_t medium_type; //!< Medium Type + uint8_t device_specific_parameter; //!< Defined by command set + uint8_t block_descriptor_length; //!< Length of block descriptors +}; + +/** + * \brief SCSI Mode Parameter Header used by MODE SELECT(10) and MODE + * SENSE(10) + */ +struct scsi_mode_param_header10 { + be16_t mode_data_length; //!< Number of bytes after this + uint8_t medium_type; //!< Medium Type + uint8_t device_specific_parameter; //!< Defined by command set + uint8_t flags4; //!< LONGLBA in bit 0 + uint8_t reserved; + be16_t block_descriptor_length; //!< Length of block descriptors +}; + +/** + * \brief SCSI Page_0 Mode Page header (SPF not set) + */ +struct scsi_mode_page_0_header { + uint8_t page_code; +#define SCSI_PAGE_CODE_PS (1 << 7) //!< Parameters Saveable +#define SCSI_PAGE_CODE_SPF (1 << 6) //!< SubPage Format + uint8_t page_length; //!< Number of bytes after this +#define SCSI_MS_PAGE_LEN(total) ((total) - 2) +}; + +//@} + +#endif // SPC_PROTOCOL_H_ diff --git a/Marlin/src/HAL/DUE/usb/stringz.h b/Marlin/src/HAL/DUE/usb/stringz.h new file mode 100644 index 00000000..fc9aaf38 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/stringz.h @@ -0,0 +1,85 @@ +/** + * \file + * + * \brief Preprocessor stringizing utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _STRINGZ_H_ +#define _STRINGZ_H_ + +/** + * \defgroup group_sam_utils_stringz Preprocessor - Stringize + * + * \ingroup group_sam_utils + * + * \{ + */ + +/*! \brief Stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * May be used only within macros with the token passed as an argument if the token is \#defined. + * + * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) + * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to + * writing "A0". + */ +#define STRINGZ(x) #x + +/*! \brief Absolute stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * No restriction of use if the token is \#defined. + * + * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is + * equivalent to writing "A0". + */ +#define ASTRINGZ(x) STRINGZ(x) + +/** + * \} + */ + +#endif // _STRINGZ_H_ diff --git a/Marlin/src/HAL/DUE/usb/sysclk.c b/Marlin/src/HAL/DUE/usb/sysclk.c new file mode 100644 index 00000000..cbb4e2c9 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/sysclk.c @@ -0,0 +1,122 @@ +/** + * \file + * + * \brief Chip-specific system clock management functions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "sysclk.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup sysclk_group + * @{ + */ + +#if defined(CONFIG_USBCLK_SOURCE) || defined(__DOXYGEN__) +/** + * \brief Enable full speed USB clock. + * + * \note The SAM3X PMC hardware interprets div as div+1. For readability the hardware div+1 + * is hidden in this implementation. Use div as div effective value. + * + * \param pll_id Source of the USB clock. + * \param div Actual clock divisor. Must be superior to 0. + */ +void sysclk_enable_usb(void) +{ + Assert(CONFIG_USBCLK_DIV > 0); + +#ifdef CONFIG_PLL0_SOURCE + if (CONFIG_USBCLK_SOURCE == USBCLK_SRC_PLL0) { + struct pll_config pllcfg; + + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_defaults(&pllcfg, 0); + pll_enable(&pllcfg, 0); + pll_wait_for_lock(0); + pmc_switch_udpck_to_pllack(CONFIG_USBCLK_DIV - 1); + pmc_enable_udpck(); + return; + } +#endif + + if (CONFIG_USBCLK_SOURCE == USBCLK_SRC_UPLL) { + + pmc_enable_upll_clock(); + pmc_switch_udpck_to_upllck(CONFIG_USBCLK_DIV - 1); + pmc_enable_udpck(); + return; + } +} + +/** + * \brief Disable full speed USB clock. + * + * \note This implementation does not switch off the PLL, it just turns off the USB clock. + */ +void sysclk_disable_usb(void) +{ + pmc_disable_udpck(); +} +#endif // CONFIG_USBCLK_SOURCE + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/sysclk.h b/Marlin/src/HAL/DUE/usb/sysclk.h new file mode 100644 index 00000000..16db8c86 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/sysclk.h @@ -0,0 +1,229 @@ +/** + * \file + * + * \brief Chip-specific system clock management functions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CHIP_SYSCLK_H_INCLUDED +#define CHIP_SYSCLK_H_INCLUDED + +#include "osc.h" +#include "pll.h" + +/** + * \page sysclk_quickstart Quick Start Guide for the System Clock Management service (SAM3A) + * + * This is the quick start guide for the \ref sysclk_group "System Clock Management" + * service, with step-by-step instructions on how to configure and use the service for + * specific use cases. + * + * \section sysclk_quickstart_usecases System Clock Management use cases + * - \ref sysclk_quickstart_basic + * + * \section sysclk_quickstart_basic Basic usage of the System Clock Management service + * This section will present a basic use case for the System Clock Management service. + * This use case will configure the main system clock to 84MHz, using an internal PLL + * module to multiply the frequency of a crystal attached to the microcontroller. + * + * \subsection sysclk_quickstart_use_case_1_prereq Prerequisites + * - None + * + * \subsection sysclk_quickstart_use_case_1_setup_steps Initialization code + * Add to the application initialization code: + * \code + sysclk_init(); +\endcode + * + * \subsection sysclk_quickstart_use_case_1_setup_steps_workflow Workflow + * -# Configure the system clocks according to the settings in conf_clock.h: + * \code sysclk_init(); \endcode + * + * \subsection sysclk_quickstart_use_case_1_example_code Example code + * Add or uncomment the following in your conf_clock.h header file, commenting out all other + * definitions of the same symbol(s): + * \code + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK + + // Fpll0 = (Fclk * PLL_mul) / PLL_div + #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) + #define CONFIG_PLL0_DIV 1 + + // Fbus = Fsys / BUS_div + #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 +\endcode + * + * \subsection sysclk_quickstart_use_case_1_example_workflow Workflow + * -# Configure the main system clock to use the output of the PLL module as its source: + * \code #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK \endcode + * -# Configure the PLL module to use the fast external fast crystal oscillator as its source: + * \code #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL \endcode + * -# Configure the PLL module to multiply the external fast crystal oscillator frequency up to 84MHz: + * \code + #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) + #define CONFIG_PLL0_DIV 1 +\endcode + * \note For user boards, \c BOARD_FREQ_MAINCK_XTAL should be defined in the board \c conf_board.h configuration + * file as the frequency of the fast crystal attached to the microcontroller. + * -# Configure the main clock to run at the full 84MHz, disable scaling of the main system clock speed: + * \code + #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 +\endcode + * \note Some dividers are powers of two, while others are integer division factors. Refer to the + * formulas in the conf_clock.h template commented above each division define. + */ + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +/** + * \weakgroup sysclk_group + * @{ + */ + +//! \name Configuration Symbols +//@{ +/** + * \def CONFIG_SYSCLK_SOURCE + * \brief Initial/static main system clock source + * + * The main system clock will be configured to use this clock during + * initialization. + */ +#ifndef CONFIG_SYSCLK_SOURCE +# define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC +#endif +/** + * \def CONFIG_SYSCLK_PRES + * \brief Initial CPU clock divider (mck) + * + * The MCK will run at + * \f[ + * f_{MCK} = \frac{f_{sys}}{\mathrm{CONFIG\_SYSCLK\_PRES}}\,\mbox{Hz} + * \f] + * after initialization. + */ +#ifndef CONFIG_SYSCLK_PRES +# define CONFIG_SYSCLK_PRES 0 +#endif + +//@} + +//! \name Master Clock Sources (MCK) +//@{ +#define SYSCLK_SRC_SLCK_RC 0 //!< Internal 32kHz RC oscillator as master source clock +#define SYSCLK_SRC_SLCK_XTAL 1 //!< External 32kHz crystal oscillator as master source clock +#define SYSCLK_SRC_SLCK_BYPASS 2 //!< External 32kHz bypass oscillator as master source clock +#define SYSCLK_SRC_MAINCK_4M_RC 3 //!< Internal 4MHz RC oscillator as master source clock +#define SYSCLK_SRC_MAINCK_8M_RC 4 //!< Internal 8MHz RC oscillator as master source clock +#define SYSCLK_SRC_MAINCK_12M_RC 5 //!< Internal 12MHz RC oscillator as master source clock +#define SYSCLK_SRC_MAINCK_XTAL 6 //!< External crystal oscillator as master source clock +#define SYSCLK_SRC_MAINCK_BYPASS 7 //!< External bypass oscillator as master source clock +#define SYSCLK_SRC_PLLACK 8 //!< Use PLLACK as master source clock +#define SYSCLK_SRC_UPLLCK 9 //!< Use UPLLCK as master source clock +//@} + +//! \name Master Clock Prescalers (MCK) +//@{ +#define SYSCLK_PRES_1 PMC_MCKR_PRES_CLK_1 //!< Set master clock prescaler to 1 +#define SYSCLK_PRES_2 PMC_MCKR_PRES_CLK_2 //!< Set master clock prescaler to 2 +#define SYSCLK_PRES_4 PMC_MCKR_PRES_CLK_4 //!< Set master clock prescaler to 4 +#define SYSCLK_PRES_8 PMC_MCKR_PRES_CLK_8 //!< Set master clock prescaler to 8 +#define SYSCLK_PRES_16 PMC_MCKR_PRES_CLK_16 //!< Set master clock prescaler to 16 +#define SYSCLK_PRES_32 PMC_MCKR_PRES_CLK_32 //!< Set master clock prescaler to 32 +#define SYSCLK_PRES_64 PMC_MCKR_PRES_CLK_64 //!< Set master clock prescaler to 64 +#define SYSCLK_PRES_3 PMC_MCKR_PRES_CLK_3 //!< Set master clock prescaler to 3 +//@} + +//! \name USB Clock Sources +//@{ +#define USBCLK_SRC_PLL0 0 //!< Use PLLA +#define USBCLK_SRC_UPLL 1 //!< Use UPLL +//@} + +/** + * \def CONFIG_USBCLK_SOURCE + * \brief Configuration symbol for the USB generic clock source + * + * Sets the clock source to use for the USB. The source must also be properly + * configured. + * + * Define this to one of the \c USBCLK_SRC_xxx settings. Leave it undefined if + * USB is not required. + */ +#ifdef __DOXYGEN__ +# define CONFIG_USBCLK_SOURCE +#endif + +/** + * \def CONFIG_USBCLK_DIV + * \brief Configuration symbol for the USB generic clock divider setting + * + * Sets the clock division for the USB generic clock. If a USB clock source is + * selected with CONFIG_USBCLK_SOURCE, this configuration symbol must also be + * defined. + */ +#ifdef __DOXYGEN__ +# define CONFIG_USBCLK_DIV +#endif + + +extern void sysclk_enable_usb(void); +extern void sysclk_disable_usb(void); + +//! @} + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* CHIP_SYSCLK_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/tpaste.h b/Marlin/src/HAL/DUE/usb/tpaste.h new file mode 100644 index 00000000..2ad3f275 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/tpaste.h @@ -0,0 +1,105 @@ +/** + * \file + * + * \brief Preprocessor token pasting utils. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _TPASTE_H_ +#define _TPASTE_H_ + +/** + * \defgroup group_sam_utils_tpaste Preprocessor - Token Paste + * + * \ingroup group_sam_utils + * + * \{ + */ + +/*! \name Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. + * + * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by + * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is + * equivalent to writing U32. + */ +//! @{ +#define TPASTE2( a, b) a##b +#define TPASTE3( a, b, c) a##b##c +#define TPASTE4( a, b, c, d) a##b##c##d +#define TPASTE5( a, b, c, d, e) a##b##c##d##e +#define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f +#define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g +#define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h +#define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i +#define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j +//! @} + +/*! \name Absolute Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * No restriction of use if the tokens are \#defined. + * + * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined + * as 32 is equivalent to writing U32. + */ +//! @{ +#define ATPASTE2( a, b) TPASTE2( a, b) +#define ATPASTE3( a, b, c) TPASTE3( a, b, c) +#define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) +#define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) +#define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) +#define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) +#define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) +#define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) +#define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) +//! @} + +/** + * \} + */ + +#endif // _TPASTE_H_ diff --git a/Marlin/src/HAL/DUE/usb/udc.c b/Marlin/src/HAL/DUE/usb/udc.c new file mode 100644 index 00000000..60bf0cff --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udc.c @@ -0,0 +1,1149 @@ +/** + * \file + * + * \brief USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" +#include "udc.h" + +/** + * \ingroup udc_group + * \defgroup udc_group_interne Implementation of UDC + * + * Internal implementation + * @{ + */ + +//! \name Internal variables to manage the USB device +//! @{ + +//! Device status state (see enum usb_device_status in usb_protocol.h) +static le16_t udc_device_status; + +COMPILER_WORD_ALIGNED +//! Device interface setting value +static uint8_t udc_iface_setting = 0; + +//! Device Configuration number selected by the USB host +COMPILER_WORD_ALIGNED +static uint8_t udc_num_configuration = 0; + +//! Pointer on the selected speed device configuration +static udc_config_speed_t UDC_DESC_STORAGE *udc_ptr_conf; + +//! Pointer on interface descriptor used by SETUP request. +static usb_iface_desc_t UDC_DESC_STORAGE *udc_ptr_iface; + +//! @} + + +//! \name Internal structure to store the USB device main strings +//! @{ + +/** + * \brief Language ID of USB device (US ID by default) + */ +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE usb_str_lgid_desc_t udc_string_desc_languageid = { + .desc.bLength = sizeof(usb_str_lgid_desc_t), + .desc.bDescriptorType = USB_DT_STRING, + .string = {LE16(USB_LANGID_EN_US)} +}; + +/** + * \brief USB device manufacture name storage + * String is allocated only if USB_DEVICE_MANUFACTURE_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_MANUFACTURE_NAME +static uint8_t udc_string_manufacturer_name[] = USB_DEVICE_MANUFACTURE_NAME; +# define USB_DEVICE_MANUFACTURE_NAME_SIZE \ + (sizeof(udc_string_manufacturer_name)-1) +#else +# define USB_DEVICE_MANUFACTURE_NAME_SIZE 0 +#endif + +/** + * \brief USB device product name storage + * String is allocated only if USB_DEVICE_PRODUCT_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_PRODUCT_NAME +static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME; +# define USB_DEVICE_PRODUCT_NAME_SIZE (sizeof(udc_string_product_name)-1) +#else +# define USB_DEVICE_PRODUCT_NAME_SIZE 0 +#endif + +/** + * \brief Get USB device serial number + * + * Use the define USB_DEVICE_SERIAL_NAME to set static serial number. + * + * For dynamic serial number set the define USB_DEVICE_GET_SERIAL_NAME_POINTER + * to a suitable pointer. This will also require the serial number length + * define USB_DEVICE_GET_SERIAL_NAME_LENGTH. + */ +#if defined USB_DEVICE_GET_SERIAL_NAME_POINTER + static const uint8_t *udc_get_string_serial_name(void) + { + return (const uint8_t *)USB_DEVICE_GET_SERIAL_NAME_POINTER; + } +# define USB_DEVICE_SERIAL_NAME_SIZE \ + USB_DEVICE_GET_SERIAL_NAME_LENGTH +#elif defined USB_DEVICE_SERIAL_NAME + static const uint8_t *udc_get_string_serial_name(void) + { + return (const uint8_t *)USB_DEVICE_SERIAL_NAME; + } +# define USB_DEVICE_SERIAL_NAME_SIZE \ + (sizeof(USB_DEVICE_SERIAL_NAME)-1) +#else +# define USB_DEVICE_SERIAL_NAME_SIZE 0 +#endif + +/** + * \brief USB device string descriptor + * Structure used to transfer ASCII strings to USB String descriptor structure. + */ +struct udc_string_desc_t { + usb_str_desc_t header; + le16_t string[Max(Max(USB_DEVICE_MANUFACTURE_NAME_SIZE, \ + USB_DEVICE_PRODUCT_NAME_SIZE), USB_DEVICE_SERIAL_NAME_SIZE)]; +}; +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE struct udc_string_desc_t udc_string_desc = { + .header.bDescriptorType = USB_DT_STRING +}; +//! @} + +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void) +{ + return udc_ptr_iface; +} + +/** + * \brief Returns a value to check the end of USB Configuration descriptor + * + * \return address after the last byte of USB Configuration descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_get_eof_conf(void) +{ + return (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) + udc_ptr_conf->desc + + le16_to_cpu(udc_ptr_conf->desc->wTotalLength)); +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Search specific descriptor in global interface descriptor + * + * \param desc Address of interface descriptor + * or previous specific descriptor found + * \param desc_id Descriptor ID to search + * + * \return address of specific descriptor found + * \return NULL if it is the end of global interface descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_next_desc_in_iface(usb_conf_desc_t + UDC_DESC_STORAGE * desc, uint8_t desc_id) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_eof_desc; + + ptr_eof_desc = udc_get_eof_conf(); + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + // Check the end of configuration descriptor + while (ptr_eof_desc > desc) { + // If new interface descriptor is found, + // then it is the end of the current global interface descriptor + if (USB_DT_INTERFACE == desc->bDescriptorType) { + break; // End of global interface descriptor + } + if (desc_id == desc->bDescriptorType) { + return desc; // Specific descriptor found + } + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + } + return NULL; // No specific descriptor found +} +#endif + +/** + * \brief Search an interface descriptor + * This routine updates the internal pointer udc_ptr_iface. + * + * \param iface_num Interface number to find in Configuration Descriptor + * \param setting_num Setting number of interface to find + * + * \return 1 if found or 0 if not found + */ +static bool udc_update_iface_desc(uint8_t iface_num, uint8_t setting_num) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_end_desc; + + if (0 == udc_num_configuration) { + return false; + } + + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Start at the beginning of configuration descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) + udc_ptr_conf->desc; + + // Check the end of configuration descriptor + ptr_end_desc = udc_get_eof_conf(); + while (ptr_end_desc > + (UDC_DESC_STORAGE usb_conf_desc_t *) udc_ptr_iface) { + if (USB_DT_INTERFACE == udc_ptr_iface->bDescriptorType) { + // A interface descriptor is found + // Check interface and alternate setting number + if ((iface_num == udc_ptr_iface->bInterfaceNumber) && + (setting_num == + udc_ptr_iface->bAlternateSetting)) { + return true; // Interface found + } + } + // Go to next descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) ( + (uint8_t *) udc_ptr_iface + + udc_ptr_iface->bLength); + } + return false; // Interface not found +} + +/** + * \brief Disables an usb device interface (UDI) + * This routine call the UDI corresponding to interface number + * + * \param iface_num Interface number to disable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_disable(uint8_t iface_num) +{ + udi_api_t UDC_DESC_STORAGE *udi_api; + + // Select first alternate setting of the interface + // to update udc_ptr_iface before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + +#if (0!=USB_DEVICE_MAX_EP) + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Start at the beginning of interface descriptor + { + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) + ep_desc, USB_DT_ENDPOINT); + if (NULL == ep_desc) { + break; + } + // Free the endpoint used by the interface + udd_ep_free(ep_desc->bEndpointAddress); + } + } +#endif + + // Disable interface + udi_api->disable(); + return true; +} + +/** + * \brief Enables an usb device interface (UDI) + * This routine calls the UDI corresponding + * to the interface and setting number. + * + * \param iface_num Interface number to enable + * \param setting_num Setting number to enable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_enable(uint8_t iface_num, uint8_t setting_num) +{ + // Select the interface descriptor + if (!udc_update_iface_desc(iface_num, setting_num)) { + return false; + } + +#if (0!=USB_DEVICE_MAX_EP) + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + + // Start at the beginning of the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) ep_desc, + USB_DT_ENDPOINT); + if (NULL == ep_desc) + break; + // Alloc the endpoint used by the interface + if (!udd_ep_alloc(ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + le16_to_cpu + (ep_desc->wMaxPacketSize))) { + return false; + } + } +#endif + // Enable the interface + return udc_ptr_conf->udi_apis[iface_num]->enable(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void) +{ + udd_enable(); +} + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void) +{ + udd_disable(); + udc_reset(); +} + +/** + * \brief Reset the current configuration of the USB device, + * This routines can be called by UDD when a RESET on the USB line occurs. + */ +void udc_reset(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + udc_iface_disable(iface_num); + } + } + udc_num_configuration = 0; +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + if (CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP) & udc_device_status) { + // Remote wakeup is enabled then disable it + UDC_REMOTEWAKEUP_DISABLE(); + } +#endif + udc_device_status = +#if (USB_DEVICE_ATTR & USB_CONFIG_ATTR_SELF_POWERED) + CPU_TO_LE16(USB_DEV_STATUS_SELF_POWERED); +#else + CPU_TO_LE16(USB_DEV_STATUS_BUS_POWERED); +#endif +} + +void udc_sof_notify(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (udc_ptr_conf->udi_apis[iface_num]->sof_notify != NULL) { + udc_ptr_conf->udi_apis[iface_num]->sof_notify(); + } + } + } +} + +/** + * \brief Standard device request to get device status + * + * \return true if success + */ +static bool udc_req_std_dev_get_status(void) +{ + if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) { + return false; + } + + udd_set_setup_payload( (uint8_t *) & udc_device_status, + sizeof(udc_device_status)); + return true; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to get endpoint status + * + * \return true if success + */ +static bool udc_req_std_ep_get_status(void) +{ + static le16_t udc_ep_status; + + if (udd_g_ctrlreq.req.wLength != sizeof(udc_ep_status)) { + return false; + } + + udc_ep_status = udd_ep_is_halted(udd_g_ctrlreq.req. + wIndex & 0xFF) ? CPU_TO_LE16(USB_EP_STATUS_HALTED) : 0; + + udd_set_setup_payload( (uint8_t *) & udc_ep_status, + sizeof(udc_ep_status)); + return true; +} +#endif + +/** + * \brief Standard device request to change device status + * + * \return true if success + */ +static bool udc_req_std_dev_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_DEV_FEATURE_REMOTE_WAKEUP) { + udc_device_status &= CPU_TO_LE16(~(uint32_t)USB_DEV_STATUS_REMOTEWAKEUP); +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + UDC_REMOTEWAKEUP_DISABLE(); +#endif + return true; + } + return false; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to clear endpoint feature + * + * \return true if success + */ +static bool udc_req_std_ep_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + return udd_ep_clear_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Standard device request to set a feature + * + * \return true if success + */ +static bool udc_req_std_dev_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + switch (udd_g_ctrlreq.req.wValue) { + + case USB_DEV_FEATURE_REMOTE_WAKEUP: +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + udc_device_status |= CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP); + UDC_REMOTEWAKEUP_ENABLE(); + return true; +#else + return false; +#endif + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DEV_FEATURE_TEST_MODE: + if (!udd_is_high_speed()) { + break; + } + if (udd_g_ctrlreq.req.wIndex & 0xFF) { + break; + } + // Unconfigure the device, terminating all ongoing requests + udc_reset(); + switch ((udd_g_ctrlreq.req.wIndex >> 8) & 0xFF) { + case USB_DEV_TEST_MODE_J: + udd_g_ctrlreq.callback = udd_test_mode_j; + return true; + + case USB_DEV_TEST_MODE_K: + udd_g_ctrlreq.callback = udd_test_mode_k; + return true; + + case USB_DEV_TEST_MODE_SE0_NAK: + udd_g_ctrlreq.callback = udd_test_mode_se0_nak; + return true; + + case USB_DEV_TEST_MODE_PACKET: + udd_g_ctrlreq.callback = udd_test_mode_packet; + return true; + + case USB_DEV_TEST_MODE_FORCE_ENABLE: // Only for downstream facing hub ports + default: + break; + } + break; +#endif + default: + break; + } + return false; +} + +/** + * \brief Standard endpoint request to halt an endpoint + * + * \return true if success + */ +#if (0!=USB_DEVICE_MAX_EP) +static bool udc_req_std_ep_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + udd_ep_abort(udd_g_ctrlreq.req.wIndex & 0xFF); + return udd_ep_set_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Change the address of device + * Callback called at the end of request set address + */ +static void udc_valid_address(void) +{ + udd_set_address(udd_g_ctrlreq.req.wValue & 0x7F); +} + +/** + * \brief Standard device request to set device address + * + * \return true if success + */ +static bool udc_req_std_dev_set_address(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + // The address must be changed at the end of setup request after the handshake + // then we use a callback to change address + udd_g_ctrlreq.callback = udc_valid_address; + return true; +} + +/** + * \brief Standard device request to get device string descriptor + * + * \return true if success + */ +static bool udc_req_std_dev_get_str_desc(void) +{ + uint8_t i; + const uint8_t *str; + uint8_t str_length = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xFF) { + case 0: + udd_set_setup_payload((uint8_t *) &udc_string_desc_languageid, + sizeof(udc_string_desc_languageid)); + break; + +#ifdef USB_DEVICE_MANUFACTURE_NAME + case 1: + str_length = USB_DEVICE_MANUFACTURE_NAME_SIZE; + str = udc_string_manufacturer_name; + break; +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + case 2: + str_length = USB_DEVICE_PRODUCT_NAME_SIZE; + str = udc_string_product_name; + break; +#endif +#if defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER + case 3: + str_length = USB_DEVICE_SERIAL_NAME_SIZE; + str = udc_get_string_serial_name(); + break; +#endif + default: +#ifdef UDC_GET_EXTRA_STRING + if (UDC_GET_EXTRA_STRING()) { + break; + } +#endif + return false; + } + + if (str_length) { + for(i = 0; i < str_length; i++) { + udc_string_desc.string[i] = cpu_to_le16((le16_t)str[i]); + } + + udc_string_desc.header.bLength = 2 + (str_length) * 2; + udd_set_setup_payload( + (uint8_t *) &udc_string_desc, + udc_string_desc.header.bLength); + } + + return true; +} + +/** + * \brief Standard device request to get descriptors about USB device + * + * \return true if success + */ +static bool udc_req_std_dev_get_descriptor(void) +{ + uint8_t conf_num; + + conf_num = udd_g_ctrlreq.req.wValue & 0xFF; + + // Check descriptor ID + switch ((uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + case USB_DT_DEVICE: + // Device descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (!udd_is_high_speed()) { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_hs, + udc_config.confdev_hs->bLength); + } else +#endif + { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_lsfs, + udc_config.confdev_lsfs->bLength); + } + break; + + case USB_DT_CONFIGURATION: + // Configuration descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else +#endif + { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_CONFIGURATION; + break; + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DT_DEVICE_QUALIFIER: + // Device qualifier descriptor requested + udd_set_setup_payload( (uint8_t *) udc_config.qualifier, + udc_config.qualifier->bLength); + break; + + case USB_DT_OTHER_SPEED_CONFIGURATION: + // Other configuration descriptor requested + if (!udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_OTHER_SPEED_CONFIGURATION; + break; +#endif + + case USB_DT_BOS: + // Device BOS descriptor requested + if (udc_config.conf_bos == NULL) { + return false; + } + udd_set_setup_payload( (uint8_t *) udc_config.conf_bos, + udc_config.conf_bos->wTotalLength); + break; + + case USB_DT_STRING: + // String descriptor requested + if (!udc_req_std_dev_get_str_desc()) { + return false; + } + break; + + default: + // Unknown descriptor requested + return false; + } + // if the descriptor is larger than length requested, then reduce it + if (udd_g_ctrlreq.req.wLength < udd_g_ctrlreq.payload_size) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + return true; +} + +/** + * \brief Standard device request to get configuration number + * + * \return true if success + */ +static bool udc_req_std_dev_get_configuration(void) +{ + if (udd_g_ctrlreq.req.wLength != 1) { + return false; + } + + udd_set_setup_payload(&udc_num_configuration,1); + return true; +} + +/** + * \brief Standard device request to enable a configuration + * + * \return true if success + */ +static bool udc_req_std_dev_set_configuration(void) +{ + uint8_t iface_num; + + // Check request length + if (udd_g_ctrlreq.req.wLength) { + return false; + } + // Authorize configuration only if the address is valid + if (!udd_getaddress()) { + return false; + } + // Check the configuration number requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_hs->bNumConfigurations) { + return false; + } + } else +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_lsfs->bNumConfigurations) { + return false; + } + } + + // Reset current configuration + udc_reset(); + + // Enable new configuration + udc_num_configuration = udd_g_ctrlreq.req.wValue & 0xFF; + if (udc_num_configuration == 0) { + return true; // Default empty configuration requested + } + // Update pointer of the configuration descriptor +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + udc_ptr_conf = &udc_config.conf_hs[udc_num_configuration - 1]; + } else +#endif + { + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (!udc_iface_enable(iface_num, 0)) { + return false; + } + } + return true; +} + +/** + * \brief Standard interface request + * to get the alternate setting number of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_get_setting(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (udd_g_ctrlreq.req.wLength != 1) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + // Check the interface number included in the request + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Select first alternate setting of the interface to update udc_ptr_iface + // before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Get alternate setting from UDI + udi_api = udc_ptr_conf->udi_apis[iface_num]; + udc_iface_setting = udi_api->getsetting(); + + // Link value to payload pointer of request + udd_set_setup_payload(&udc_iface_setting,1); + return true; +} + +/** + * \brief Standard interface request + * to set an alternate setting of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_set_setting(void) +{ + uint8_t iface_num, setting_num; + + if (udd_g_ctrlreq.req.wLength) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + setting_num = udd_g_ctrlreq.req.wValue & 0xFF; + + // Disable current setting + if (!udc_iface_disable(iface_num)) { + return false; + } + + // Enable new setting + return udc_iface_enable(iface_num, setting_num); +} + +/** + * \brief Main routine to manage the standard USB SETUP request + * + * \return true if the request is supported + */ +static bool udc_reqstd(void) +{ + if (Udd_setup_is_in()) { + // GET Standard Requests + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error for USB host + } + + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Get Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_dev_get_status(); + case USB_REQ_GET_DESCRIPTOR: + return udc_req_std_dev_get_descriptor(); + case USB_REQ_GET_CONFIGURATION: + return udc_req_std_dev_get_configuration(); + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Get Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_INTERFACE: + return udc_req_std_iface_get_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Get Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_ep_get_status(); + default: + break; + } + } +#endif + } else { + // SET Standard Requests + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Set Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_ADDRESS: + return udc_req_std_dev_set_address(); + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_dev_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_dev_set_feature(); + case USB_REQ_SET_CONFIGURATION: + return udc_req_std_dev_set_configuration(); + case USB_REQ_SET_DESCRIPTOR: + /* Not supported (defined as optional by the USB 2.0 spec) */ + break; + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Set Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_INTERFACE: + return udc_req_std_iface_set_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Set Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_ep_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_ep_set_feature(); + default: + break; + } + } +#endif + } + return false; +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_iface(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Check interface number + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + //* To update udc_ptr_iface with the selected interface in request + // Select first alternate setting of interface to update udc_ptr_iface + // before calling udi_api->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI corresponding to the interface number + return udi_api->setup(); +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_ep(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI + if (udi_api->setup()) { + return true; + } + } + return false; +} + +/** + * \brief Main routine to manage the USB SETUP request. + * + * This function parses a USB SETUP request and submits an appropriate + * response back to the host or, in the case of SETUP OUT requests + * with data, sets up a buffer for receiving the data payload. + * + * The main standard requests defined by the USB 2.0 standard are handled + * internally. The interface requests are sent to UDI, and the specific request + * sent to a specific application callback. + * + * \return true if the request is supported, else the request is stalled by UDD + */ +bool udc_process_setup(void) +{ + // By default no data (receive/send) and no callbacks registered + udd_g_ctrlreq.payload_size = 0; + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + + if (Udd_setup_is_in()) { + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error from USB host + } + } + + // If standard request then try to decode it in UDC + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + if (udc_reqstd()) { + return true; + } + } + + // If interface request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_INTERFACE) { + if (udc_req_iface()) { + return true; + } + } + + // If endpoint request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_ENDPOINT) { + if (udc_req_ep()) { + return true; + } + } + + // Here SETUP request unknown by UDC and UDIs +#ifdef USB_DEVICE_SPECIFIC_REQUEST + // Try to decode it in specific callback + return USB_DEVICE_SPECIFIC_REQUEST(); // Ex: Vendor request,... +#else + return false; +#endif +} + +//! @} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udc.h b/Marlin/src/HAL/DUE/usb/udc.h new file mode 100644 index 00000000..8d92eb5c --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udc.h @@ -0,0 +1,697 @@ +/** + * \file + * + * \brief Interface of the USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_H_ +#define _UDC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udc_desc.h" +#include "udd.h" + +#if USB_DEVICE_VENDOR_ID == 0 +# error USB_DEVICE_VENDOR_ID cannot be equal to 0 +#endif + +#if USB_DEVICE_PRODUCT_ID == 0 +# error USB_DEVICE_PRODUCT_ID cannot be equal to 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udc_group USB Device Controller (UDC) + * + * The UDC provides a high-level abstraction of the usb device. + * You can use these functions to control the main device state + * (start/attach/wakeup). + * + * \section USB_DEVICE_CONF USB Device Custom configuration + * The following USB Device configuration must be included in the conf_usb.h + * file of the application. + * + * USB_DEVICE_VENDOR_ID (Word)
+ * Vendor ID provided by USB org (ATMEL 0x03EB). + * + * USB_DEVICE_PRODUCT_ID (Word)
+ * Product ID (Referenced in usb_atmel.h). + * + * USB_DEVICE_MAJOR_VERSION (Byte)
+ * Major version of the device + * + * USB_DEVICE_MINOR_VERSION (Byte)
+ * Minor version of the device + * + * USB_DEVICE_MANUFACTURE_NAME (string)
+ * ASCII name for the manufacture + * + * USB_DEVICE_PRODUCT_NAME (string)
+ * ASCII name for the product + * + * USB_DEVICE_SERIAL_NAME (string)
+ * ASCII name to enable and set a serial number + * + * USB_DEVICE_POWER (Numeric)
+ * (unit mA) Maximum device power + * + * USB_DEVICE_ATTR (Byte)
+ * USB attributes available: + * - USB_CONFIG_ATTR_SELF_POWERED + * - USB_CONFIG_ATTR_REMOTE_WAKEUP + * Note: if remote wake enabled then defines remotewakeup callbacks, + * see Table 5-2. External API from UDC - Callback + * + * USB_DEVICE_LOW_SPEED (Only defined)
+ * Force the USB Device to run in low speed + * + * USB_DEVICE_HS_SUPPORT (Only defined)
+ * Authorize the USB Device to run in high speed + * + * USB_DEVICE_MAX_EP (Byte)
+ * Define the maximum endpoint number used by the USB Device.
+ * This one is already defined in UDI default configuration. + * Ex: + * - When endpoint control 0x00, endpoint 0x01 and + * endpoint 0x82 is used then USB_DEVICE_MAX_EP=2 + * - When only endpoint control 0x00 is used then USB_DEVICE_MAX_EP=0 + * - When endpoint 0x01 and endpoint 0x81 is used then USB_DEVICE_MAX_EP=1
+ * (configuration not possible on USBB interface) + * @{ + */ + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + * + * \section udc_vbus_monitoring VBus monitoring used cases + * + * The VBus monitoring is used only for USB SELF Power application. + * + * - By default the USB device is automatically attached when Vbus is high + * or when USB is start for devices without internal Vbus monitoring. + * conf_usb.h file does not contains define USB_DEVICE_ATTACH_AUTO_DISABLE. + * \code //#define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * + * - Add custom VBUS monitoring. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + // Authorize VBUS monitoring + if (!udc_include_vbus_monitoring()) { + // Implement custom VBUS monitoring via GPIO or other + } + Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other + { + // Attach USB Device + udc_attach(); + } +\endcode + * + * - Case of battery charging. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + Event VBUS present() // VBUS interrupt or GPIO interrupt or .. + { + // Authorize battery charging, but wait key press to start USB. + } + Event Key press() + { + // Stop batteries charging + // Start USB + udc_attach(); + } +\endcode + */ +static inline bool udc_include_vbus_monitoring(void) +{ + return udd_include_vbus_monitoring(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void); + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +static inline void udc_attach(void) +{ + udd_attach(); +} + + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +static inline void udc_detach(void) +{ + udd_detach(); +} + + +/*! \brief The USB driver sends a resume signal called \e "Upstream Resume" + * This is authorized only when the remote wakeup feature is enabled by host. + */ +static inline void udc_remotewakeup(void) +{ + udd_send_remotewakeup(); +} + + +/** + * \brief Returns a pointer on the current interface descriptor + * + * \return pointer on the current interface descriptor. + */ +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); + +//@} + +/** + * \ingroup usb_group + * \defgroup usb_device_group USB Stack Device + * + * This module includes USB Stack Device implementation. + * The stack is divided in three parts: + * - USB Device Controller (UDC) provides USB chapter 9 compliance + * - USB Device Interface (UDI) provides USB Class compliance + * - USB Device Driver (UDD) provides USB Driver for each Atmel MCU + + * Many USB Device applications can be implemented on Atmel MCU. + * Atmel provides many application notes for different applications: + * - AVR4900, provides general information about Device Stack + * - AVR4901, explains how to create a new class + * - AVR4902, explains how to create a composite device + * - AVR49xx, all device classes provided in ASF have an application note + * + * A basic USB knowledge is required to understand the USB Device + * Class application notes (HID,MS,CDC,PHDC,...). + * Then, to create an USB device with + * only one class provided by ASF, refer directly to the application note + * corresponding to this USB class. The USB Device application note for + * New Class and Composite is dedicated to advanced USB users. + * + * @{ + */ + +//! @} + +#ifdef __cplusplus +} +#endif + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_prereq USB Device Controller (UDC) - Prerequisites + * Common prerequisites for all USB devices. + * + * This module is based on USB device stack full interrupt driven, and supporting + * \ref sleepmgr_group sleepmgr. For AVR and SAM3/4 devices the \ref clk_group clock services + * is supported. For SAMD devices the \ref asfdoc_sam0_system_clock_group clock driver is supported. + * + * The following procedure must be executed to setup the project correctly: + * - Specify the clock configuration: + * - XMEGA USB devices need 48MHz clock input.\n + * XMEGA USB devices need CPU frequency higher than 12MHz.\n + * You can use either an internal RC48MHz auto calibrated by Start of Frames + * or an external OSC. + * - UC3 and SAM3/4 devices without USB high speed support need 48MHz clock input.\n + * You must use a PLL and an external OSC. + * - UC3 and SAM3/4 devices with USB high speed support need 12MHz clock input.\n + * You must use an external OSC. + * - UC3 devices with USBC hardware need CPU frequency higher than 25MHz. + * - SAMD devices without USB high speed support need 48MHz clock input.\n + * You should use DFLL with USBCRM. + * - In conf_board.h, the define CONF_BOARD_USB_PORT must be added to enable USB lines. + * (Not mandatory for all boards) + * - Enable interrupts + * - Initialize the clock service + * + * The usage of \ref sleepmgr_group sleepmgr service is optional, but recommended to reduce power + * consumption: + * - Initialize the sleep manager service + * - Activate sleep mode when the application is in IDLE state + * + * \subpage udc_conf_clock. + * + * for AVR and SAM3/4 devices, add to the initialization code: + * \code + sysclk_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + board_init(); + sleepmgr_init(); // Optional +\endcode + * + * For SAMD devices, add to the initialization code: + * \code + system_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + sleepmgr_init(); // Optional +\endcode + * Add to the main IDLE loop: + * \code + sleepmgr_enter_sleep(); // Optional +\endcode + * + */ + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_code USB Device Controller (UDC) - Example code + * Common example code for all USB devices. + * + * Content of conf_usb.h: + * \code + #define USB_DEVICE_VENDOR_ID 0x03EB + #define USB_DEVICE_PRODUCT_ID 0xXXXX + #define USB_DEVICE_MAJOR_VERSION 1 + #define USB_DEVICE_MINOR_VERSION 0 + #define USB_DEVICE_POWER 100 + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED +\endcode + * + * Add to application C-file: + * \code + void usb_init(void) + { + udc_start(); + } +\endcode + */ + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_flow USB Device Controller (UDC) - Workflow + * Common workflow for all USB devices. + * + * -# Ensure that conf_usb.h is available and contains the following configuration + * which is the main USB device configuration: + * - \code // Vendor ID provided by USB org (ATMEL 0x03EB) + #define USB_DEVICE_VENDOR_ID 0x03EB // Type Word + // Product ID (Atmel PID referenced in usb_atmel.h) + #define USB_DEVICE_PRODUCT_ID 0xXXXX // Type Word + // Major version of the device + #define USB_DEVICE_MAJOR_VERSION 1 // Type Byte + // Minor version of the device + #define USB_DEVICE_MINOR_VERSION 0 // Type Byte + // Maximum device power (mA) + #define USB_DEVICE_POWER 100 // Type 9-bits + // USB attributes to enable features + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED // Flags \endcode + * -# Call the USB device stack start function to enable stack and start USB: + * - \code udc_start(); \endcode + * \note In case of USB dual roles (Device and Host) managed through USB OTG connector + * (USB ID pin), the call of udc_start() must be removed and replaced by uhc_start(). + * SeRefer to "AVR4950 section 6.1 Dual roles" for further information about dual roles. + */ + +/** + * \page udc_conf_clock conf_clock.h examples with USB support + * + * Content of XMEGA conf_clock.h: + * \code + // Configuration based on internal RC: + // USB clock need of 48Mhz + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF + // CPU clock need of clock > 12MHz to run with USB (Here 24MHz) + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 +\endcode + * + * Content of conf_clock.h for AT32UC3A0, AT32UC3A1, AT32UC3B devices (USBB): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) +\endcode + * + * Content of conf_clock.h for AT32UC3A3, AT32UC3A4 devices (USBB with high speed support): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) +\endcode + * + * Content of conf_clock.h for AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U devices (USBC): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) + // CPU clock need of clock > 25MHz to run with USBC + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1 +\endcode + * + * Content of conf_clock.h for SAM3S, SAM3SD, SAM4S devices (UPD: USB Peripheral Device): + * \code + // PLL1 (B) Options (Fpll = (Fclk * PLL_mul) / PLL_div) + #define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL1_MUL 16 + #define CONFIG_PLL1_DIV 2 + // USB Clock Source Options (Fusb = FpllX / USB_div) + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 2 +\endcode + * + * Content of conf_clock.h for SAM3U device (UPDHS: USB Peripheral Device High Speed): + * \code + // USB Clock Source fixed at UPLL. +\endcode + * + * Content of conf_clock.h for SAM3X, SAM3A devices (UOTGHS: USB OTG High Speed): + * \code + // USB Clock Source fixed at UPLL. + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL + #define CONFIG_USBCLK_DIV 1 +\endcode + * + * Content of conf_clocks.h for SAMD devices (USB): + * \code + // System clock bus configuration + # define CONF_CLOCK_FLASH_WAIT_STATES 2 + + // USB Clock Source fixed at DFLL. + // SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop + # define CONF_CLOCK_DFLL_ENABLE true + # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY + # define CONF_CLOCK_DFLL_ON_DEMAND true + + // Set this to true to configure the GCLK when running clocks_init. + // If set to false, none of the GCLK generators will be configured in clocks_init(). + # define CONF_CLOCK_CONFIGURE_GCLK true + + // Configure GCLK generator 0 (Main Clock) + # define CONF_CLOCK_GCLK_0_ENABLE true + # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true + # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL + # define CONF_CLOCK_GCLK_0_PRESCALER 1 + # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false +\endcode + */ + +/** + * \page udc_use_case_1 Change USB speed + * + * In this use case, the USB device is used with different USB speeds. + * + * \section udc_use_case_1_setup Setup steps + * + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_1_usage Usage steps + * + * \subsection udc_use_case_1_usage_code Example code + * Content of conf_usb.h: + * \code + #if // Low speed + #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT + + #elif // Full speed + // #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT + + #elif // High speed + // #define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT + + #endif +\endcode + * + * \subsection udc_use_case_1_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB device low speed (1.5Mbit/s): + * - \code #define USB_DEVICE_LOW_SPEED + //#define USB_DEVICE_HS_SUPPORT \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB device full speed (12Mbit/s): + * - \code //#define USB_DEVICE_LOW_SPEED + //#define USB_DEVICE_HS_SUPPORT \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB device high speed (480Mbit/s): + * - \code //#define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT \endcode + */ + +/** + * \page udc_use_case_2 Use USB strings + * + * In this use case, the usual USB strings is added in the USB device. + * + * \section udc_use_case_2_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_2_usage Usage steps + * + * \subsection udc_use_case_2_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" + #define USB_DEVICE_PRODUCT_NAME "Product name" + #define USB_DEVICE_SERIAL_NAME "12...EF" +\endcode + * + * \subsection udc_use_case_2_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable different USB strings: + * - \code // Static ASCII name for the manufacture + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" \endcode + * - \code // Static ASCII name for the product + #define USB_DEVICE_PRODUCT_NAME "Product name" \endcode + * - \code // Static ASCII name to enable and set a serial number + #define USB_DEVICE_SERIAL_NAME "12...EF" \endcode + */ + +/** + * \page udc_use_case_3 Use USB remote wakeup feature + * + * In this use case, the USB remote wakeup feature is enabled. + * + * \section udc_use_case_3_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_3_usage Usage steps + * + * \subsection udc_use_case_3_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); +\endcode + * + * Add to application C-file: + * \code + void my_callback_remotewakeup_enable(void) + { + // Enable application wakeup events (e.g. enable GPIO interrupt) + } + void my_callback_remotewakeup_disable(void) + { + // Disable application wakeup events (e.g. disable GPIO interrupt) + } + + void my_interrupt_event(void) + { + udc_remotewakeup(); + } +\endcode + * + * \subsection udc_use_case_3_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable remote wakeup feature: + * - \code // Authorizes the remote wakeup feature + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode + * - \code // Define callback called when the host enables the remotewakeup feature + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); \endcode + * - \code // Define callback called when the host disables the remotewakeup feature + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); \endcode + * -# Send a remote wakeup (USB upstream): + * - \code udc_remotewakeup(); \endcode + */ + +/** + * \page udc_use_case_5 Bus power application recommendations + * + * In this use case, the USB device BUS power feature is enabled. + * This feature requires a correct power consumption management. + * + * \section udc_use_case_5_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_5_usage Usage steps + * + * \subsection udc_use_case_5_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void) + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void) +\endcode + * + * Add to application C-file: + * \code + void user_callback_suspend_action(void) + { + // Disable hardware component to reduce power consumption + } + void user_callback_resume_action(void) + { + // Re-enable hardware component + } +\endcode + * + * \subsection udc_use_case_5_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters: + * - \code // Authorizes the BUS power feature + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode + * - \code // Define callback called when the host suspend the USB line + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void); \endcode + * - \code // Define callback called when the host or device resume the USB line + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void); \endcode + * -# Reduce power consumption in suspend mode (max. 2.5mA on Vbus): + * - \code void user_callback_suspend_action(void) + { + turn_off_components(); + } \endcode + */ + +/** + * \page udc_use_case_6 USB dynamic serial number + * + * In this use case, the USB serial strings is dynamic. + * For a static serial string refer to \ref udc_use_case_2. + * + * \section udc_use_case_6_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_6_usage Usage steps + * + * \subsection udc_use_case_6_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_SERIAL_NAME + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 + extern uint8_t serial_number[]; +\endcode + * + * Add to application C-file: + * \code + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode + * + * \subsection udc_use_case_6_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable a USB serial number strings dynamically: + * - \code #define USB_DEVICE_SERIAL_NAME // Define this empty + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number // Give serial array pointer + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 // Give size of serial array + extern uint8_t serial_number[]; // Declare external serial array \endcode + * -# Before start USB stack, initialize the serial array + * - \code + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode + */ + + + +#endif // _UDC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udc_desc.h b/Marlin/src/HAL/DUE/usb/udc_desc.h new file mode 100644 index 00000000..052ca08e --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udc_desc.h @@ -0,0 +1,135 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_DESC_H_ +#define _UDC_DESC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup udc_group + * \defgroup udc_desc_group USB Device Descriptor + * + * @{ + */ + +/** + * \brief Defines the memory's location of USB descriptors + * + * By default the Descriptor is stored in RAM + * (UDC_DESC_STORAGE is defined empty). + * + * If you have need to free RAM space, + * it is possible to put descriptor in flash in following case: + * - USB driver authorize flash transfer (USBB on UC3 and USB on Mega) + * - USB Device is not high speed (UDC no need to change USB descriptors) + * + * For UC3 application used "const". + * + * For Mega application used "code". + */ +#define UDC_DESC_STORAGE + // Descriptor storage in internal RAM +#if (defined UDC_DATA_USE_HRAM_SUPPORT) +# if defined(__GNUC__) +# define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) +# define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) +# elif defined(__ICCAVR32__) +# define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 +# define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 +# endif +#else +# define UDC_DATA(x) COMPILER_ALIGNED(x) +# define UDC_BSS(x) COMPILER_ALIGNED(x) +#endif + + + +/** + * \brief Configuration descriptor and UDI link for one USB speed + */ +typedef struct { + //! USB configuration descriptor + usb_conf_desc_t UDC_DESC_STORAGE *desc; + //! Array of UDI API pointer + udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; +} udc_config_speed_t; + + +/** + * \brief All information about the USB Device + */ +typedef struct { + //! USB device descriptor for low or full speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; + //! USB configuration descriptor and UDI API pointers for low or full speed + udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; +#ifdef USB_DEVICE_HS_SUPPORT + //! USB device descriptor for high speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; + //! USB device qualifier, only use in high speed mode + usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; + //! USB configuration descriptor and UDI API pointers for high speed + udc_config_speed_t UDC_DESC_STORAGE *conf_hs; +#endif + usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; +} udc_config_t; + +//! Global variables of USB Device Descriptor and UDI links +extern UDC_DESC_STORAGE udc_config_t udc_config; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDC_DESC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udd.h b/Marlin/src/HAL/DUE/usb/udd.h new file mode 100644 index 00000000..7ec8c03d --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udd.h @@ -0,0 +1,396 @@ +/** + * \file + * + * \brief Common API for USB Device Drivers (UDD) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDD_H_ +#define _UDD_H_ + +#include "usb_protocol.h" +#include "udc_desc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udd_group USB Device Driver (UDD) + * + * The UDD driver provides a low-level abstraction of the device + * controller hardware. Most events coming from the hardware such as + * interrupts, which may cause the UDD to call into the UDC and UDI. + * + * @{ + */ + +//! \brief Endpoint identifier +typedef uint8_t udd_ep_id_t; + +//! \brief Endpoint transfer status +//! Returned in parameters of callback register via udd_ep_run routine. +typedef enum { + UDD_EP_TRANSFER_OK = 0, + UDD_EP_TRANSFER_ABORT = 1, +} udd_ep_status_t; + +/** + * \brief Global variable to give and record information of the setup request management + * + * This global variable allows to decode and response a setup request. + * It can be updated by udc_process_setup() from UDC or *setup() from UDIs. + */ +typedef struct { + //! Data received in USB SETUP packet + //! Note: The swap of "req.wValues" from uin16_t to le16_t is done by UDD. + usb_setup_req_t req; + + //! Point to buffer to send or fill with data following SETUP packet + //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) + uint8_t *payload; + + //! Size of buffer to send or fill, and content the number of byte transfered + uint16_t payload_size; + + //! Callback called after reception of ZLP from setup request + void (*callback)(void); + + //! Callback called when the buffer given (.payload) is full or empty. + //! This one return false to abort data transfer, or true with a new buffer in .payload. + bool (*over_under_run)(void); +} udd_ctrl_request_t; +extern udd_ctrl_request_t udd_g_ctrlreq; + +//! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer +#define Udd_setup_is_in() \ + (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer +#define Udd_setup_is_out() \ + (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype. +#define Udd_setup_type() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) + +//! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient +#define Udd_setup_recipient() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) + +/** + * \brief End of halt callback function type. + * Registered by routine udd_ep_wait_stall_clear() + * Callback called when endpoint stall is cleared. + */ +typedef void (*udd_callback_halt_cleared_t)(void); + +/** + * \brief End of transfer callback function type. + * Registered by routine udd_ep_run() + * Callback called by USB interrupt after data transfer or abort (reset,...). + * + * \param status UDD_EP_TRANSFER_OK, if transfer is complete + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param n number of data transfered + */ +typedef void (*udd_callback_trans_t) (udd_ep_status_t status, + iram_size_t nb_transfered, udd_ep_id_t ep); + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + */ +bool udd_include_vbus_monitoring(void); + +/** + * \brief Enables the USB Device mode + */ +void udd_enable(void); + +/** + * \brief Disables the USB Device mode + */ +void udd_disable(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +void udd_attach(void); + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +void udd_detach(void); + +/** + * \brief Test whether the USB Device Controller is running at high + * speed or not. + * + * \return \c true if the Device is running at high speed mode, otherwise \c false. + */ +bool udd_is_high_speed(void); + +/** + * \brief Changes the USB address of device + * + * \param address New USB address + */ +void udd_set_address(uint8_t address); + +/** + * \brief Returns the USB address of device + * + * \return USB address + */ +uint8_t udd_getaddress(void); + +/** + * \brief Returns the current start of frame number + * + * \return current start of frame number. + */ +uint16_t udd_get_frame_number(void); + +/** + * \brief Returns the current micro start of frame number + * + * \return current micro start of frame number required in high speed mode. + */ +uint16_t udd_get_micro_frame_number(void); + +/*! \brief The USB driver sends a resume signal called Upstream Resume + */ +void udd_send_remotewakeup(void); + +/** + * \brief Load setup payload + * + * \param payload Pointer on payload + * \param payload_size Size of payload + */ +void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ); + + +/** + * \name Endpoint Management + * + * The following functions allow drivers to create and remove + * endpoints, as well as set, clear and query their "halted" and + * "wedged" states. + */ +//@{ + +#if (USB_DEVICE_MAX_EP != 0) + +/** + * \brief Configures and enables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + * \param bmAttributes Attributes of endpoint declared in the descriptor. + * \param MaxEndpointSize Endpoint maximum size + * + * \return \c 1 if the endpoint is enabled, otherwise \c 0. + */ +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize); + +/** + * \brief Disables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + */ +void udd_ep_free(udd_ep_id_t ep); + +/** + * \brief Check if the endpoint \a ep is halted. + * + * \param ep The ID of the endpoint to check. + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_is_halted(udd_ep_id_t ep); + +/** + * \brief Set the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will result + * in a STALL handshake being sent. Any pending transactions will be + * performed first, however. + * + * \param ep The ID of the endpoint to be halted + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_set_halt(udd_ep_id_t ep); + +/** + * \brief Clear the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will + * be handled normally, i.e. a STALL handshake will not be sent, and + * the data toggle sequence will start at DATA0. + * + * \param ep The ID of the endpoint to be un-halted + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_clear_halt(udd_ep_id_t ep); + +/** + * \brief Registers a callback to call when endpoint halt is cleared + * + * \param ep The ID of the endpoint to use + * \param callback NULL or function to call when endpoint halt is cleared + * + * \warning if the endpoint is not halted then the \a callback is called immediately. + * + * \return \c 1 if the register is accepted, otherwise \c 0. + */ +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback); + +/** + * \brief Allows to receive or send data on an endpoint + * + * The driver uses a specific DMA USB to transfer data + * from internal RAM to endpoint, if this one is available. + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * Note: The control endpoint is not authorized. + * + * \param ep The ID of the endpoint to use + * \param b_shortpacket Enabled automatic short packet + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \warning About \a b_shortpacket, for IN endpoint it means that a short packet + * (or a Zero Length Packet) will be sent to the USB line to properly close the usb + * transfer at the end of the data transfer. + * For Bulk and Interrupt OUT endpoint, it will automatically stop the transfer + * at the end of the data transfer (received short packet). + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, + uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); +/** + * \brief Aborts transfer on going on endpoint + * + * If a transfer is on going, then it is stopped and + * the callback registered is called to signal the end of transfer. + * Note: The control endpoint is not authorized. + * + * \param ep Endpoint to abort + */ +void udd_ep_abort(udd_ep_id_t ep); + +#endif + +//@} + + +/** + * \name High speed test mode management + * + * The following functions allow the device to jump to a specific test mode required in high speed mode. + */ +//@{ +void udd_test_mode_j(void); +void udd_test_mode_k(void); +void udd_test_mode_se0_nak(void); +void udd_test_mode_packet(void); +//@} + + +/** + * \name UDC callbacks to provide for UDD + * + * The following callbacks are used by UDD. + */ +//@{ + +/** + * \brief Decodes and manages a setup request + * + * The driver call it when a SETUP packet is received. + * The \c udd_g_ctrlreq contains the data of SETUP packet. + * If this callback accepts the setup request then it must + * return \c 1 and eventually update \c udd_g_ctrlreq to send or receive data. + * + * \return \c 1 if the request is accepted, otherwise \c 0. + */ +extern bool udc_process_setup(void); + +/** + * \brief Reset the UDC + * + * The UDC must reset all configuration. + */ +extern void udc_reset(void); + +/** + * \brief To signal that a SOF is occurred + * + * The UDC must send the signal to all UDIs enabled + */ +extern void udc_sof_notify(void); + +//@} + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDD_H_ diff --git a/Marlin/src/HAL/DUE/usb/udi.h b/Marlin/src/HAL/DUE/usb/udi.h new file mode 100644 index 00000000..febf03b7 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi.h @@ -0,0 +1,133 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_H_ +#define _UDI_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udi_group USB Device Interface (UDI) + * The UDI provides a common API for all classes, + * and this is used by UDC for the main control of USB Device interface. + * @{ + */ + +/** + * \brief UDI API. + * + * The callbacks within this structure are called only by + * USB Device Controller (UDC) + * + * The udc_get_interface_desc() can be use by UDI to know the interface descriptor + * selected by UDC. + */ +typedef struct { + /** + * \brief Enable the interface. + * + * This function is called when the host selects a configuration + * to which this interface belongs through a Set Configuration + * request, and when the host selects an alternate setting of + * this interface through a Set Interface request. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ + bool (*enable)(void); + + /** + * \brief Disable the interface. + * + * This function is called when this interface is currently + * active, and + * - the host selects any configuration through a Set + * Configuration request, or + * - the host issues a USB reset, or + * - the device is detached from the host (i.e. Vbus is no + * longer present) + */ + void (*disable)(void); + + /** + * \brief Handle a control request directed at an interface. + * + * This function is called when this interface is currently + * active and the host sends a SETUP request + * with this interface as the recipient. + * + * Use udd_g_ctrlreq to decode and response to SETUP request. + * + * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. + */ + bool (*setup)(void); + + /** + * \brief Returns the current setting of the selected interface. + * + * This function is called when UDC when know alternate setting of selected interface. + * + * \return alternate setting of selected interface + */ + uint8_t (*getsetting)(void); + + /** + * \brief To signal that a SOF is occurred + */ + void (*sof_notify)(void); +} udi_api_t; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDI_H_ diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.c b/Marlin/src/HAL/DUE/usb/udi_cdc.c new file mode 100644 index 00000000..cbe23dbb --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.c @@ -0,0 +1,1155 @@ +/** + * \file + * + * \brief USB Device Communication Device Class (CDC) interface. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_cdc.h" +#include "udd.h" +#include "udc.h" +#include "udi_cdc.h" +#include + +#ifdef UDI_CDC_LOW_RATE +# ifdef USB_DEVICE_HS_SUPPORT +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# else +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_FS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_FS_SIZE) +# endif +#else +# ifdef USB_DEVICE_HS_SUPPORT +# define UDI_CDC_TX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# define UDI_CDC_RX_BUFFERS (UDI_CDC_DATA_EPS_HS_SIZE) +# else +# define UDI_CDC_TX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) +# define UDI_CDC_RX_BUFFERS (5*UDI_CDC_DATA_EPS_FS_SIZE) +# endif +#endif + +#ifndef UDI_CDC_TX_EMPTY_NOTIFY +# define UDI_CDC_TX_EMPTY_NOTIFY(port) +#endif + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_udc Interface with USB Device Core (UDC) + * + * Structures and functions required by UDC. + * + * @{ + */ +bool udi_cdc_comm_enable(void); +void udi_cdc_comm_disable(void); +bool udi_cdc_comm_setup(void); +bool udi_cdc_data_enable(void); +void udi_cdc_data_disable(void); +bool udi_cdc_data_setup(void); +uint8_t udi_cdc_getsetting(void); +void udi_cdc_data_sof_notify(void); +UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm = { + .enable = udi_cdc_comm_enable, + .disable = udi_cdc_comm_disable, + .setup = udi_cdc_comm_setup, + .getsetting = udi_cdc_getsetting, +}; +UDC_DESC_STORAGE udi_api_t udi_api_cdc_data = { + .enable = udi_cdc_data_enable, + .disable = udi_cdc_data_disable, + .setup = udi_cdc_data_setup, + .getsetting = udi_cdc_getsetting, + .sof_notify = udi_cdc_data_sof_notify, +}; +//@} + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_internal Implementation of UDI CDC + * + * Class internal implementation + * @{ + */ + +/** + * \name Internal routines + */ +//@{ + +/** + * \name Routines to control serial line + */ +//@{ + +/** + * \brief Returns the port number corresponding at current setup request + * + * \return port number + */ +static uint8_t udi_cdc_setup_to_port(void); + +/** + * \brief Sends line coding to application + * + * Called after SETUP request when line coding data is received. + */ +static void udi_cdc_line_coding_received(void); + +/** + * \brief Records new state + * + * \param port Communication port number to manage + * \param b_set State is enabled if true, else disabled + * \param bit_mask Field to process (see CDC_SERIAL_STATE_ defines) + */ +static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask); + +/** + * \brief Check and eventually notify the USB host of new state + * + * \param port Communication port number to manage + * \param ep Port communication endpoint + */ +static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep); + +/** + * \brief Ack sent of serial state message + * Callback called after serial state message sent + * + * \param status UDD_EP_TRANSFER_OK, if transfer finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data transfered + */ +static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +//@} + +/** + * \name Routines to process data transfer + */ +//@{ + +/** + * \brief Enable the reception of data from the USB host + * + * The value udi_cdc_rx_trans_sel indicate the RX buffer to fill. + * + * \param port Communication port number to manage + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +static bool udi_cdc_rx_start(uint8_t port); + +/** + * \brief Update rx buffer management with a new data + * Callback called after data reception on USB line + * + * \param status UDD_EP_TRANSFER_OK, if transfer finish + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data received + */ +static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +/** + * \brief Ack sent of tx buffer + * Callback called after data transfer on USB line + * + * \param status UDD_EP_TRANSFER_OK, if transfer finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param n number of data transfered + */ +static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep); + +/** + * \brief Send buffer on line or wait a SOF event + * + * \param port Communication port number to manage + */ +static void udi_cdc_tx_send(uint8_t port); + +//@} + +//@} + +/** + * \name Information about configuration of communication line + */ +//@{ +COMPILER_WORD_ALIGNED + static usb_cdc_line_coding_t udi_cdc_line_coding[UDI_CDC_PORT_NB]; +static bool udi_cdc_serial_state_msg_ongoing[UDI_CDC_PORT_NB]; +static volatile le16_t udi_cdc_state[UDI_CDC_PORT_NB]; +COMPILER_WORD_ALIGNED static usb_cdc_notify_serial_state_t uid_cdc_state_msg[UDI_CDC_PORT_NB]; + +//! Status of CDC COMM interfaces +static volatile uint8_t udi_cdc_nb_comm_enabled = 0; +//@} + +/** + * \name Variables to manage RX/TX transfer requests + * Two buffers for each sense are used to optimize the speed. + */ +//@{ + +//! Status of CDC DATA interfaces +static volatile uint8_t udi_cdc_nb_data_enabled = 0; +static volatile bool udi_cdc_data_running = false; +//! Buffer to receive data +COMPILER_WORD_ALIGNED static uint8_t udi_cdc_rx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_RX_BUFFERS]; +//! Data available in RX buffers +static volatile uint16_t udi_cdc_rx_buf_nb[UDI_CDC_PORT_NB][2]; +//! Give the current RX buffer used (rx0 if 0, rx1 if 1) +static volatile uint8_t udi_cdc_rx_buf_sel[UDI_CDC_PORT_NB]; +//! Read position in current RX buffer +static volatile uint16_t udi_cdc_rx_pos[UDI_CDC_PORT_NB]; +//! Signal a transfer on-going +static volatile bool udi_cdc_rx_trans_ongoing[UDI_CDC_PORT_NB]; + +//! Define a transfer halted +#define UDI_CDC_TRANS_HALTED 2 + +//! Buffer to send data +COMPILER_WORD_ALIGNED static uint8_t udi_cdc_tx_buf[UDI_CDC_PORT_NB][2][UDI_CDC_TX_BUFFERS]; +//! Data available in TX buffers +static uint16_t udi_cdc_tx_buf_nb[UDI_CDC_PORT_NB][2]; +//! Give current TX buffer used (tx0 if 0, tx1 if 1) +static volatile uint8_t udi_cdc_tx_buf_sel[UDI_CDC_PORT_NB]; +//! Value of SOF during last TX transfer +static uint16_t udi_cdc_tx_sof_num[UDI_CDC_PORT_NB]; +//! Signal a transfer on-going +static volatile bool udi_cdc_tx_trans_ongoing[UDI_CDC_PORT_NB]; +//! Signal that both buffer content data to send +static volatile bool udi_cdc_tx_both_buf_to_send[UDI_CDC_PORT_NB]; + +//@} + +bool udi_cdc_comm_enable(void) +{ + uint8_t port; + uint8_t iface_comm_num; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; + udi_cdc_nb_comm_enabled = 0; +#else + if (udi_cdc_nb_comm_enabled > UDI_CDC_PORT_NB) { + udi_cdc_nb_comm_enabled = 0; + } + port = udi_cdc_nb_comm_enabled; +#endif + + // Initialize control signal management + udi_cdc_state[port] = CPU_TO_LE16(0); + + uid_cdc_state_msg[port].header.bmRequestType = + USB_REQ_DIR_IN | USB_REQ_TYPE_CLASS | + USB_REQ_RECIP_INTERFACE; + uid_cdc_state_msg[port].header.bNotification = USB_REQ_CDC_NOTIFY_SERIAL_STATE; + uid_cdc_state_msg[port].header.wValue = LE16(0); + + switch (port) { +#define UDI_CDC_PORT_TO_IFACE_COMM(index, unused) \ + case index: \ + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_IFACE_COMM, ~) +#undef UDI_CDC_PORT_TO_IFACE_COMM + default: + iface_comm_num = UDI_CDC_COMM_IFACE_NUMBER_0; + break; + } + + uid_cdc_state_msg[port].header.wIndex = LE16(iface_comm_num); + uid_cdc_state_msg[port].header.wLength = LE16(2); + uid_cdc_state_msg[port].value = CPU_TO_LE16(0); + + udi_cdc_line_coding[port].dwDTERate = CPU_TO_LE32(UDI_CDC_DEFAULT_RATE); + udi_cdc_line_coding[port].bCharFormat = UDI_CDC_DEFAULT_STOPBITS; + udi_cdc_line_coding[port].bParityType = UDI_CDC_DEFAULT_PARITY; + udi_cdc_line_coding[port].bDataBits = UDI_CDC_DEFAULT_DATABITS; + // Call application callback + // to initialize memories or indicate that interface is enabled + UDI_CDC_SET_CODING_EXT(port,(&udi_cdc_line_coding[port])); + if (!UDI_CDC_ENABLE_EXT(port)) { + return false; + } + udi_cdc_nb_comm_enabled++; + return true; +} + +bool udi_cdc_data_enable(void) +{ + uint8_t port; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; + udi_cdc_nb_data_enabled = 0; +#else + if (udi_cdc_nb_data_enabled > UDI_CDC_PORT_NB) { + udi_cdc_nb_data_enabled = 0; + } + port = udi_cdc_nb_data_enabled; +#endif + + // Initialize TX management + udi_cdc_tx_trans_ongoing[port] = false; + udi_cdc_tx_both_buf_to_send[port] = false; + udi_cdc_tx_buf_sel[port] = 0; + udi_cdc_tx_buf_nb[port][0] = 0; + udi_cdc_tx_buf_nb[port][1] = 0; + udi_cdc_tx_sof_num[port] = 0; + udi_cdc_tx_send(port); + + // Initialize RX management + udi_cdc_rx_trans_ongoing[port] = false; + udi_cdc_rx_buf_sel[port] = 0; + udi_cdc_rx_buf_nb[port][0] = 0; + udi_cdc_rx_buf_nb[port][1] = 0; + udi_cdc_rx_pos[port] = 0; + if (!udi_cdc_rx_start(port)) { + return false; + } + udi_cdc_nb_data_enabled++; + if (udi_cdc_nb_data_enabled == UDI_CDC_PORT_NB) { + udi_cdc_data_running = true; + } + return true; +} + +void udi_cdc_comm_disable(void) +{ + Assert(udi_cdc_nb_comm_enabled != 0); + udi_cdc_nb_comm_enabled--; +} + +void udi_cdc_data_disable(void) +{ + uint8_t port; + + Assert(udi_cdc_nb_data_enabled != 0); + udi_cdc_nb_data_enabled--; + port = udi_cdc_nb_data_enabled; + UDI_CDC_DISABLE_EXT(port); + udi_cdc_data_running = false; +} + +bool udi_cdc_comm_setup(void) +{ + uint8_t port = udi_cdc_setup_to_port(); + + if (Udd_setup_is_in()) { + // GET Interface Requests + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CDC_GET_LINE_CODING: + // Get configuration of CDC line + if (sizeof(usb_cdc_line_coding_t) != + udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + udd_g_ctrlreq.payload = + (uint8_t *) & + udi_cdc_line_coding[port]; + udd_g_ctrlreq.payload_size = + sizeof(usb_cdc_line_coding_t); + return true; + } + } + } + if (Udd_setup_is_out()) { + // SET Interface Requests + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Set + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CDC_SET_LINE_CODING: + // Change configuration of CDC line + if (sizeof(usb_cdc_line_coding_t) != + udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + udd_g_ctrlreq.callback = + udi_cdc_line_coding_received; + udd_g_ctrlreq.payload = + (uint8_t *) & + udi_cdc_line_coding[port]; + udd_g_ctrlreq.payload_size = + sizeof(usb_cdc_line_coding_t); + return true; + case USB_REQ_CDC_SET_CONTROL_LINE_STATE: + // According cdc spec 1.1 chapter 6.2.14 + UDI_CDC_SET_DTR_EXT(port, (0 != + (udd_g_ctrlreq.req.wValue + & CDC_CTRL_SIGNAL_DTE_PRESENT))); + UDI_CDC_SET_RTS_EXT(port, (0 != + (udd_g_ctrlreq.req.wValue + & CDC_CTRL_SIGNAL_ACTIVATE_CARRIER))); + return true; + } + } + } + return false; // request Not supported +} + +bool udi_cdc_data_setup(void) +{ + return false; // request Not supported +} + +uint8_t udi_cdc_getsetting(void) +{ + return 0; // CDC don't have multiple alternate setting +} + +void udi_cdc_data_sof_notify(void) +{ + static uint8_t port_notify = 0; + + // A call of udi_cdc_data_sof_notify() is done for each port + udi_cdc_tx_send(port_notify); +#if UDI_CDC_PORT_NB != 1 // To optimize code + port_notify++; + if (port_notify >= UDI_CDC_PORT_NB) { + port_notify = 0; + } +#endif +} + + +// ------------------------ +//------- Internal routines to control serial line + +static uint8_t udi_cdc_setup_to_port(void) +{ + uint8_t port; + + switch (udd_g_ctrlreq.req.wIndex & 0xFF) { +#define UDI_CDC_IFACE_COMM_TO_PORT(iface, unused) \ + case UDI_CDC_COMM_IFACE_NUMBER_##iface: \ + port = iface; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_IFACE_COMM_TO_PORT, ~) +#undef UDI_CDC_IFACE_COMM_TO_PORT + default: + port = 0; + break; + } + return port; +} + +static void udi_cdc_line_coding_received(void) +{ + uint8_t port = udi_cdc_setup_to_port(); + UNUSED(port); + + UDI_CDC_SET_CODING_EXT(port, (&udi_cdc_line_coding[port])); +} + +static void udi_cdc_ctrl_state_change(uint8_t port, bool b_set, le16_t bit_mask) +{ + irqflags_t flags; + udd_ep_id_t ep_comm; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + // Update state + flags = cpu_irq_save(); // Protect udi_cdc_state + if (b_set) { + udi_cdc_state[port] |= bit_mask; + } else { + udi_cdc_state[port] &= ~(unsigned)bit_mask; + } + cpu_irq_restore(flags); + + // Send it if possible and state changed + switch (port) { +#define UDI_CDC_PORT_TO_COMM_EP(index, unused) \ + case index: \ + ep_comm = UDI_CDC_COMM_EP_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_COMM_EP, ~) +#undef UDI_CDC_PORT_TO_COMM_EP + default: + ep_comm = UDI_CDC_COMM_EP_0; + break; + } + udi_cdc_ctrl_state_notify(port, ep_comm); +} + + +static void udi_cdc_ctrl_state_notify(uint8_t port, udd_ep_id_t ep) +{ +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + // Send it if possible and state changed + if ((!udi_cdc_serial_state_msg_ongoing[port]) + && (udi_cdc_state[port] != uid_cdc_state_msg[port].value)) { + // Fill notification message + uid_cdc_state_msg[port].value = udi_cdc_state[port]; + // Send notification message + udi_cdc_serial_state_msg_ongoing[port] = + udd_ep_run(ep, + false, + (uint8_t *) & uid_cdc_state_msg[port], + sizeof(uid_cdc_state_msg[0]), + udi_cdc_serial_state_msg_sent); + } +} + + +static void udi_cdc_serial_state_msg_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t port; + UNUSED(n); + UNUSED(status); + + switch (ep) { +#define UDI_CDC_GET_PORT_FROM_COMM_EP(iface, unused) \ + case UDI_CDC_COMM_EP_##iface: \ + port = iface; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_GET_PORT_FROM_COMM_EP, ~) +#undef UDI_CDC_GET_PORT_FROM_COMM_EP + default: + port = 0; + break; + } + + udi_cdc_serial_state_msg_ongoing[port] = false; + + // For the irregular signals like break, the incoming ring signal, + // or the overrun error state, this will reset their values to zero + // and again will not send another notification until their state changes. + udi_cdc_state[port] &= ~(CDC_SERIAL_STATE_BREAK | + CDC_SERIAL_STATE_RING | + CDC_SERIAL_STATE_FRAMING | + CDC_SERIAL_STATE_PARITY | CDC_SERIAL_STATE_OVERRUN); + uid_cdc_state_msg[port].value &= ~(CDC_SERIAL_STATE_BREAK | + CDC_SERIAL_STATE_RING | + CDC_SERIAL_STATE_FRAMING | + CDC_SERIAL_STATE_PARITY | CDC_SERIAL_STATE_OVERRUN); + // Send it if possible and state changed + udi_cdc_ctrl_state_notify(port, ep); +} + + +// ------------------------ +//------- Internal routines to process data transfer + + +static bool udi_cdc_rx_start(uint8_t port) +{ + irqflags_t flags; + uint8_t buf_sel_trans; + udd_ep_id_t ep; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + flags = cpu_irq_save(); + buf_sel_trans = udi_cdc_rx_buf_sel[port]; + if (udi_cdc_rx_trans_ongoing[port] || + (udi_cdc_rx_pos[port] < udi_cdc_rx_buf_nb[port][buf_sel_trans])) { + // Transfer already on-going or current buffer no empty + cpu_irq_restore(flags); + return false; + } + + // Change current buffer + udi_cdc_rx_pos[port] = 0; + udi_cdc_rx_buf_sel[port] = (buf_sel_trans==0)?1:0; + + // Start transfer on RX + udi_cdc_rx_trans_ongoing[port] = true; + cpu_irq_restore(flags); + + if (udi_cdc_multi_is_rx_ready(port)) { + UDI_CDC_RX_NOTIFY(port); + } + // Send the buffer with enable of short packet + switch (port) { +#define UDI_CDC_PORT_TO_DATA_EP_OUT(index, unused) \ + case index: \ + ep = UDI_CDC_DATA_EP_OUT_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_DATA_EP_OUT, ~) +#undef UDI_CDC_PORT_TO_DATA_EP_OUT + default: + ep = UDI_CDC_DATA_EP_OUT_0; + break; + } + return udd_ep_run(ep, + true, + udi_cdc_rx_buf[port][buf_sel_trans], + UDI_CDC_RX_BUFFERS, + udi_cdc_data_received); +} + + +static void udi_cdc_data_received(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t buf_sel_trans; + uint8_t port; + + switch (ep) { +#define UDI_CDC_DATA_EP_OUT_TO_PORT(index, unused) \ + case UDI_CDC_DATA_EP_OUT_##index: \ + port = index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_OUT_TO_PORT, ~) +#undef UDI_CDC_DATA_EP_OUT_TO_PORT + default: + port = 0; + break; + } + + if (UDD_EP_TRANSFER_OK != status) { + // Abort reception + return; + } + buf_sel_trans = (udi_cdc_rx_buf_sel[port]==0)?1:0; + if (!n) { + udd_ep_run( ep, + true, + udi_cdc_rx_buf[port][buf_sel_trans], + UDI_CDC_RX_BUFFERS, + udi_cdc_data_received); + return; + } + udi_cdc_rx_buf_nb[port][buf_sel_trans] = n; + udi_cdc_rx_trans_ongoing[port] = false; + udi_cdc_rx_start(port); +} + + +static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep) +{ + uint8_t port; + UNUSED(n); + + switch (ep) { +#define UDI_CDC_DATA_EP_IN_TO_PORT(index, unused) \ + case UDI_CDC_DATA_EP_IN_##index: \ + port = index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_IN_TO_PORT, ~) +#undef UDI_CDC_DATA_EP_IN_TO_PORT + default: + port = 0; + break; + } + + if (UDD_EP_TRANSFER_OK != status) { + // Abort transfer + return; + } + udi_cdc_tx_buf_nb[port][(udi_cdc_tx_buf_sel[port]==0)?1:0] = 0; + udi_cdc_tx_both_buf_to_send[port] = false; + udi_cdc_tx_trans_ongoing[port] = false; + + if (n != 0) { + UDI_CDC_TX_EMPTY_NOTIFY(port); + } + udi_cdc_tx_send(port); +} + + +static void udi_cdc_tx_send(uint8_t port) +{ + irqflags_t flags; + uint8_t buf_sel_trans; + bool b_short_packet; + udd_ep_id_t ep; + static uint16_t sof_zlp_counter = 0; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + if (udi_cdc_tx_trans_ongoing[port]) { + return; // Already on going or wait next SOF to send next data + } + if (udd_is_high_speed()) { + if (udi_cdc_tx_sof_num[port] == udd_get_micro_frame_number()) { + return; // Wait next SOF to send next data + } + }else{ + if (udi_cdc_tx_sof_num[port] == udd_get_frame_number()) { + return; // Wait next SOF to send next data + } + } + + flags = cpu_irq_save(); // to protect udi_cdc_tx_buf_sel + buf_sel_trans = udi_cdc_tx_buf_sel[port]; + if (udi_cdc_tx_buf_nb[port][buf_sel_trans] == 0) { + sof_zlp_counter++; + if (((!udd_is_high_speed()) && (sof_zlp_counter < 100)) + || (udd_is_high_speed() && (sof_zlp_counter < 800))) { + cpu_irq_restore(flags); + return; + } + } + sof_zlp_counter = 0; + + if (!udi_cdc_tx_both_buf_to_send[port]) { + // Send current Buffer + // and switch the current buffer + udi_cdc_tx_buf_sel[port] = (buf_sel_trans==0)?1:0; + }else{ + // Send the other Buffer + // and no switch the current buffer + buf_sel_trans = (buf_sel_trans==0)?1:0; + } + udi_cdc_tx_trans_ongoing[port] = true; + cpu_irq_restore(flags); + + b_short_packet = (udi_cdc_tx_buf_nb[port][buf_sel_trans] != UDI_CDC_TX_BUFFERS); + if (b_short_packet) { + if (udd_is_high_speed()) { + udi_cdc_tx_sof_num[port] = udd_get_micro_frame_number(); + }else{ + udi_cdc_tx_sof_num[port] = udd_get_frame_number(); + } + }else{ + udi_cdc_tx_sof_num[port] = 0; // Force next transfer without wait SOF + } + + // Send the buffer with enable of short packet + switch (port) { +#define UDI_CDC_PORT_TO_DATA_EP_IN(index, unused) \ + case index: \ + ep = UDI_CDC_DATA_EP_IN_##index; \ + break; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_PORT_TO_DATA_EP_IN, ~) +#undef UDI_CDC_PORT_TO_DATA_EP_IN + default: + ep = UDI_CDC_DATA_EP_IN_0; + break; + } + udd_ep_run( ep, + b_short_packet, + udi_cdc_tx_buf[port][buf_sel_trans], + udi_cdc_tx_buf_nb[port][buf_sel_trans], + udi_cdc_data_sent); +} + + +// ------------------------ +//------- Application interface + + +//------- Application interface + +void udi_cdc_ctrl_signal_dcd(bool b_set) +{ + udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DCD); +} + +void udi_cdc_ctrl_signal_dsr(bool b_set) +{ + udi_cdc_ctrl_state_change(0, b_set, CDC_SERIAL_STATE_DSR); +} + +void udi_cdc_signal_framing_error(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_FRAMING); +} + +void udi_cdc_signal_parity_error(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_PARITY); +} + +void udi_cdc_signal_overrun(void) +{ + udi_cdc_ctrl_state_change(0, true, CDC_SERIAL_STATE_OVERRUN); +} + +void udi_cdc_multi_ctrl_signal_dcd(uint8_t port, bool b_set) +{ + udi_cdc_ctrl_state_change(port, b_set, CDC_SERIAL_STATE_DCD); +} + +void udi_cdc_multi_ctrl_signal_dsr(uint8_t port, bool b_set) +{ + udi_cdc_ctrl_state_change(port, b_set, CDC_SERIAL_STATE_DSR); +} + +void udi_cdc_multi_signal_framing_error(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_FRAMING); +} + +void udi_cdc_multi_signal_parity_error(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_PARITY); +} + +void udi_cdc_multi_signal_overrun(uint8_t port) +{ + udi_cdc_ctrl_state_change(port, true, CDC_SERIAL_STATE_OVERRUN); +} + +iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port) +{ + irqflags_t flags; + uint16_t pos; + iram_size_t nb_received; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + flags = cpu_irq_save(); + pos = udi_cdc_rx_pos[port]; + nb_received = udi_cdc_rx_buf_nb[port][udi_cdc_rx_buf_sel[port]] - pos; + cpu_irq_restore(flags); + return nb_received; +} + +iram_size_t udi_cdc_get_nb_received_data(void) +{ + return udi_cdc_multi_get_nb_received_data(0); +} + +bool udi_cdc_multi_is_rx_ready(uint8_t port) +{ + return (udi_cdc_multi_get_nb_received_data(port) > 0); +} + +bool udi_cdc_is_rx_ready(void) +{ + return udi_cdc_multi_is_rx_ready(0); +} + +int udi_cdc_multi_getc(uint8_t port) +{ + irqflags_t flags; + int rx_data = 0; + bool b_databit_9; + uint16_t pos; + uint8_t buf_sel; + bool again; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + b_databit_9 = (9 == udi_cdc_line_coding[port].bDataBits); + +udi_cdc_getc_process_one_byte: + // Check available data + flags = cpu_irq_save(); + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + again = pos >= udi_cdc_rx_buf_nb[port][buf_sel]; + cpu_irq_restore(flags); + while (again) { + if (!udi_cdc_data_running) { + return 0; + } + goto udi_cdc_getc_process_one_byte; + } + + // Read data + rx_data |= udi_cdc_rx_buf[port][buf_sel][pos]; + udi_cdc_rx_pos[port] = pos+1; + + udi_cdc_rx_start(port); + + if (b_databit_9) { + // Receive MSB + b_databit_9 = false; + rx_data = rx_data << 8; + goto udi_cdc_getc_process_one_byte; + } + return rx_data; +} + +int udi_cdc_getc(void) +{ + return udi_cdc_multi_getc(0); +} + +iram_size_t udi_cdc_multi_read_buf(uint8_t port, void* buf, iram_size_t size) +{ + irqflags_t flags; + uint8_t *ptr_buf = (uint8_t *)buf; + iram_size_t copy_nb; + uint16_t pos; + uint8_t buf_sel; + bool again; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + +udi_cdc_read_buf_loop_wait: + // Check available data + flags = cpu_irq_save(); + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + again = pos >= udi_cdc_rx_buf_nb[port][buf_sel]; + cpu_irq_restore(flags); + while (again) { + if (!udi_cdc_data_running) { + return size; + } + goto udi_cdc_read_buf_loop_wait; + } + + // Read data + copy_nb = udi_cdc_rx_buf_nb[port][buf_sel] - pos; + if (copy_nb>size) { + copy_nb = size; + } + memcpy(ptr_buf, &udi_cdc_rx_buf[port][buf_sel][pos], copy_nb); + udi_cdc_rx_pos[port] += copy_nb; + ptr_buf += copy_nb; + size -= copy_nb; + udi_cdc_rx_start(port); + + if (size) { + goto udi_cdc_read_buf_loop_wait; + } + return 0; +} + +static iram_size_t udi_cdc_multi_read_no_polling(uint8_t port, void* buf, iram_size_t size) +{ + uint8_t *ptr_buf = (uint8_t *)buf; + iram_size_t nb_avail_data; + uint16_t pos; + uint8_t buf_sel; + irqflags_t flags; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + //Data interface not started... exit + if (!udi_cdc_data_running) { + return 0; + } + + //Get number of available data + // Check available data + flags = cpu_irq_save(); // to protect udi_cdc_rx_pos & udi_cdc_rx_buf_sel + pos = udi_cdc_rx_pos[port]; + buf_sel = udi_cdc_rx_buf_sel[port]; + nb_avail_data = udi_cdc_rx_buf_nb[port][buf_sel] - pos; + cpu_irq_restore(flags); + //If the buffer contains less than the requested number of data, + //adjust read size + if(nb_avail_data0) { + memcpy(ptr_buf, &udi_cdc_rx_buf[port][buf_sel][pos], size); + flags = cpu_irq_save(); // to protect udi_cdc_rx_pos + udi_cdc_rx_pos[port] += size; + cpu_irq_restore(flags); + + ptr_buf += size; + udi_cdc_rx_start(port); + } + return(nb_avail_data); +} + +iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size) +{ + return udi_cdc_multi_read_no_polling(0, buf, size); +} + +iram_size_t udi_cdc_read_buf(void* buf, iram_size_t size) +{ + return udi_cdc_multi_read_buf(0, buf, size); +} + +iram_size_t __attribute__((optimize("O0"))) udi_cdc_multi_get_free_tx_buffer(uint8_t port) +{ + irqflags_t flags; + iram_size_t buf_sel_nb, retval; + uint8_t buf_sel; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + flags = cpu_irq_save(); + buf_sel = udi_cdc_tx_buf_sel[port]; + buf_sel_nb = udi_cdc_tx_buf_nb[port][buf_sel]; + if (buf_sel_nb == UDI_CDC_TX_BUFFERS) { + if ((!udi_cdc_tx_trans_ongoing[port]) + && (!udi_cdc_tx_both_buf_to_send[port])) { + /* One buffer is full, but the other buffer is not used. + * (not used = transfer on-going) + * then move to the other buffer to store data */ + udi_cdc_tx_both_buf_to_send[port] = true; + udi_cdc_tx_buf_sel[port] = (buf_sel == 0)? 1 : 0; + buf_sel_nb = 0; + } + } + retval = UDI_CDC_TX_BUFFERS - buf_sel_nb; + cpu_irq_restore(flags); + return retval; +} + +iram_size_t udi_cdc_get_free_tx_buffer(void) +{ + return udi_cdc_multi_get_free_tx_buffer(0); +} + +bool udi_cdc_multi_is_tx_ready(uint8_t port) +{ + return (udi_cdc_multi_get_free_tx_buffer(port) != 0); +} + +bool udi_cdc_is_tx_ready(void) +{ + return udi_cdc_multi_is_tx_ready(0); +} + +int udi_cdc_multi_putc(uint8_t port, int value) +{ + irqflags_t flags; + bool b_databit_9; + uint8_t buf_sel; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + b_databit_9 = (9 == udi_cdc_line_coding[port].bDataBits); + +udi_cdc_putc_process_one_byte: + // Check available space + if (!udi_cdc_multi_is_tx_ready(port)) { + if (!udi_cdc_data_running) { + return false; + } + goto udi_cdc_putc_process_one_byte; + } + + // Write value + flags = cpu_irq_save(); + buf_sel = udi_cdc_tx_buf_sel[port]; + udi_cdc_tx_buf[port][buf_sel][udi_cdc_tx_buf_nb[port][buf_sel]++] = value; + cpu_irq_restore(flags); + + if (b_databit_9) { + // Send MSB + b_databit_9 = false; + value = value >> 8; + goto udi_cdc_putc_process_one_byte; + } + return true; +} + +int udi_cdc_putc(int value) +{ + return udi_cdc_multi_putc(0, value); +} + +iram_size_t __attribute__((optimize("O0"))) udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t size) +{ + irqflags_t flags; + uint8_t buf_sel; + uint16_t buf_nb; + iram_size_t copy_nb; + uint8_t *ptr_buf = (uint8_t *)buf; + +#if UDI_CDC_PORT_NB == 1 // To optimize code + port = 0; +#endif + + if (9 == udi_cdc_line_coding[port].bDataBits) { + size *=2; + } + +udi_cdc_write_buf_loop_wait: + // Check available space + if (!udi_cdc_multi_is_tx_ready(port)) { + if (!udi_cdc_data_running) { + return size; + } + goto udi_cdc_write_buf_loop_wait; + } + + // Write values + flags = cpu_irq_save(); + buf_sel = udi_cdc_tx_buf_sel[port]; + buf_nb = udi_cdc_tx_buf_nb[port][buf_sel]; + copy_nb = UDI_CDC_TX_BUFFERS - buf_nb; + if (copy_nb > size) { + copy_nb = size; + } + memcpy(&udi_cdc_tx_buf[port][buf_sel][buf_nb], ptr_buf, copy_nb); + udi_cdc_tx_buf_nb[port][buf_sel] = buf_nb + copy_nb; + cpu_irq_restore(flags); + + // Update buffer pointer + ptr_buf = ptr_buf + copy_nb; + size -= copy_nb; + + if (size) { + goto udi_cdc_write_buf_loop_wait; + } + + return 0; +} + +iram_size_t udi_cdc_write_buf(const void* buf, iram_size_t size) +{ + return udi_cdc_multi_write_buf(0, buf, size); +} + +//@} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.h b/Marlin/src/HAL/DUE/usb/udi_cdc.h new file mode 100644 index 00000000..0ecf7bb0 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.h @@ -0,0 +1,810 @@ +/** + * \file + * + * \brief USB Device Communication Device Class (CDC) interface definitions. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_CDC_H_ +#define _UDI_CDC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_cdc.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" + +// Check the number of port +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 +#endif +#if (UDI_CDC_PORT_NB < 1) || (UDI_CDC_PORT_NB > 7) +# error UDI_CDC_PORT_NB must be between 1 and 7 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_cdc_group_udc + * @{ + */ + +//! Global structure which contains standard UDI API for UDC +extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_comm; +extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data; +//@} + +/** + * \ingroup udi_cdc_group + * \defgroup udi_cdc_group_desc USB interface descriptors + * + * The following structures provide predefined USB interface descriptors. + * It must be used to define the final USB descriptors. + */ +//@{ + +/** + * \brief Communication Class interface descriptor + * + * Interface descriptor with associated functional and endpoint + * descriptors for the CDC Communication Class interface. + */ +typedef struct { + //! Standard interface descriptor + usb_iface_desc_t iface; + //! CDC Header functional descriptor + usb_cdc_hdr_desc_t header; + //! CDC Abstract Control Model functional descriptor + usb_cdc_acm_desc_t acm; + //! CDC Union functional descriptor + usb_cdc_union_desc_t union_desc; + //! CDC Call Management functional descriptor + usb_cdc_call_mgmt_desc_t call_mgmt; + //! Notification endpoint descriptor + usb_ep_desc_t ep_notify; +} udi_cdc_comm_desc_t; + + +/** + * \brief Data Class interface descriptor + * + * Interface descriptor with associated endpoint descriptors for the + * CDC Data Class interface. + */ +typedef struct { + //! Standard interface descriptor + usb_iface_desc_t iface; + //! Data IN/OUT endpoint descriptors + usb_ep_desc_t ep_in; + usb_ep_desc_t ep_out; +} udi_cdc_data_desc_t; + + +//! CDC communication endpoints size for all speeds +#define UDI_CDC_COMM_EP_SIZE 64 +//! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) +#define UDI_CDC_DATA_EPS_FS_SIZE 64 +//! CDC data endpoints size for HS speed (512B only) +#define UDI_CDC_DATA_EPS_HS_SIZE 512 + +/** + * \name Content of interface descriptors + * Up to 7 CDC interfaces can be implemented on a USB device. + */ +//@{ +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_0 +#define UDI_CDC_IAD_STRING_ID_0 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_0 +#define UDI_CDC_COMM_STRING_ID_0 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_0 +#define UDI_CDC_DATA_STRING_ID_0 0 +#endif +#define UDI_CDC_IAD_DESC_0 UDI_CDC_IAD_DESC(0) +#define UDI_CDC_COMM_DESC_0 UDI_CDC_COMM_DESC(0) +#define UDI_CDC_DATA_DESC_0_FS UDI_CDC_DATA_DESC_FS(0) +#define UDI_CDC_DATA_DESC_0_HS UDI_CDC_DATA_DESC_HS(0) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_1 +#define UDI_CDC_IAD_STRING_ID_1 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_1 +#define UDI_CDC_COMM_STRING_ID_1 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_1 +#define UDI_CDC_DATA_STRING_ID_1 0 +#endif +#define UDI_CDC_IAD_DESC_1 UDI_CDC_IAD_DESC(1) +#define UDI_CDC_COMM_DESC_1 UDI_CDC_COMM_DESC(1) +#define UDI_CDC_DATA_DESC_1_FS UDI_CDC_DATA_DESC_FS(1) +#define UDI_CDC_DATA_DESC_1_HS UDI_CDC_DATA_DESC_HS(1) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_2 +#define UDI_CDC_IAD_STRING_ID_2 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_2 +#define UDI_CDC_COMM_STRING_ID_2 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_2 +#define UDI_CDC_DATA_STRING_ID_2 0 +#endif +#define UDI_CDC_IAD_DESC_2 UDI_CDC_IAD_DESC(2) +#define UDI_CDC_COMM_DESC_2 UDI_CDC_COMM_DESC(2) +#define UDI_CDC_DATA_DESC_2_FS UDI_CDC_DATA_DESC_FS(2) +#define UDI_CDC_DATA_DESC_2_HS UDI_CDC_DATA_DESC_HS(2) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_3 +#define UDI_CDC_IAD_STRING_ID_3 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_3 +#define UDI_CDC_COMM_STRING_ID_3 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_3 +#define UDI_CDC_DATA_STRING_ID_3 0 +#endif +#define UDI_CDC_IAD_DESC_3 UDI_CDC_IAD_DESC(3) +#define UDI_CDC_COMM_DESC_3 UDI_CDC_COMM_DESC(3) +#define UDI_CDC_DATA_DESC_3_FS UDI_CDC_DATA_DESC_FS(3) +#define UDI_CDC_DATA_DESC_3_HS UDI_CDC_DATA_DESC_HS(3) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_4 +#define UDI_CDC_IAD_STRING_ID_4 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_4 +#define UDI_CDC_COMM_STRING_ID_4 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_4 +#define UDI_CDC_DATA_STRING_ID_4 0 +#endif +#define UDI_CDC_IAD_DESC_4 UDI_CDC_IAD_DESC(4) +#define UDI_CDC_COMM_DESC_4 UDI_CDC_COMM_DESC(4) +#define UDI_CDC_DATA_DESC_4_FS UDI_CDC_DATA_DESC_FS(4) +#define UDI_CDC_DATA_DESC_4_HS UDI_CDC_DATA_DESC_HS(4) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_5 +#define UDI_CDC_IAD_STRING_ID_5 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_5 +#define UDI_CDC_COMM_STRING_ID_5 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_5 +#define UDI_CDC_DATA_STRING_ID_5 0 +#endif +#define UDI_CDC_IAD_DESC_5 UDI_CDC_IAD_DESC(5) +#define UDI_CDC_COMM_DESC_5 UDI_CDC_COMM_DESC(5) +#define UDI_CDC_DATA_DESC_5_FS UDI_CDC_DATA_DESC_FS(5) +#define UDI_CDC_DATA_DESC_5_HS UDI_CDC_DATA_DESC_HS(5) + +//! By default no string associated to these interfaces +#ifndef UDI_CDC_IAD_STRING_ID_6 +#define UDI_CDC_IAD_STRING_ID_6 0 +#endif +#ifndef UDI_CDC_COMM_STRING_ID_6 +#define UDI_CDC_COMM_STRING_ID_6 0 +#endif +#ifndef UDI_CDC_DATA_STRING_ID_6 +#define UDI_CDC_DATA_STRING_ID_6 0 +#endif +#define UDI_CDC_IAD_DESC_6 UDI_CDC_IAD_DESC(6) +#define UDI_CDC_COMM_DESC_6 UDI_CDC_COMM_DESC(6) +#define UDI_CDC_DATA_DESC_6_FS UDI_CDC_DATA_DESC_FS(6) +#define UDI_CDC_DATA_DESC_6_HS UDI_CDC_DATA_DESC_HS(6) +//@} + + +//! Content of CDC IAD interface descriptor for all speeds +#define UDI_CDC_IAD_DESC(port) { \ + .bLength = sizeof(usb_iad_desc_t),\ + .bDescriptorType = USB_DT_IAD,\ + .bInterfaceCount = 2,\ + .bFunctionClass = CDC_CLASS_COMM,\ + .bFunctionSubClass = CDC_SUBCLASS_ACM,\ + .bFunctionProtocol = CDC_PROTOCOL_V25TER,\ + .bFirstInterface = UDI_CDC_COMM_IFACE_NUMBER_##port,\ + .iFunction = UDI_CDC_IAD_STRING_ID_##port,\ + } + +//! Content of CDC COMM interface descriptor for all speeds +#define UDI_CDC_COMM_DESC(port) { \ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 1,\ + .iface.bInterfaceClass = CDC_CLASS_COMM,\ + .iface.bInterfaceSubClass = CDC_SUBCLASS_ACM,\ + .iface.bInterfaceProtocol = CDC_PROTOCOL_V25TER,\ + .header.bFunctionLength = sizeof(usb_cdc_hdr_desc_t),\ + .header.bDescriptorType = CDC_CS_INTERFACE,\ + .header.bDescriptorSubtype = CDC_SCS_HEADER,\ + .header.bcdCDC = LE16(0x0110),\ + .call_mgmt.bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t),\ + .call_mgmt.bDescriptorType = CDC_CS_INTERFACE,\ + .call_mgmt.bDescriptorSubtype = CDC_SCS_CALL_MGMT,\ + .call_mgmt.bmCapabilities = \ + CDC_CALL_MGMT_SUPPORTED | CDC_CALL_MGMT_OVER_DCI,\ + .acm.bFunctionLength = sizeof(usb_cdc_acm_desc_t),\ + .acm.bDescriptorType = CDC_CS_INTERFACE,\ + .acm.bDescriptorSubtype = CDC_SCS_ACM,\ + .acm.bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS,\ + .union_desc.bFunctionLength = sizeof(usb_cdc_union_desc_t),\ + .union_desc.bDescriptorType = CDC_CS_INTERFACE,\ + .union_desc.bDescriptorSubtype= CDC_SCS_UNION,\ + .ep_notify.bLength = sizeof(usb_ep_desc_t),\ + .ep_notify.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_notify.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_notify.wMaxPacketSize = LE16(UDI_CDC_COMM_EP_SIZE),\ + .ep_notify.bInterval = 0x10,\ + .ep_notify.bEndpointAddress = UDI_CDC_COMM_EP_##port,\ + .iface.bInterfaceNumber = UDI_CDC_COMM_IFACE_NUMBER_##port,\ + .call_mgmt.bDataInterface = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .union_desc.bMasterInterface = UDI_CDC_COMM_IFACE_NUMBER_##port,\ + .union_desc.bSlaveInterface0 = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .iface.iInterface = UDI_CDC_COMM_STRING_ID_##port,\ + } + +//! Content of CDC DATA interface descriptors +#define UDI_CDC_DATA_DESC_COMMON \ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = CDC_CLASS_DATA,\ + .iface.bInterfaceSubClass = 0,\ + .iface.bInterfaceProtocol = 0,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_in.bInterval = 0,\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_out.bInterval = 0, + +#define UDI_CDC_DATA_DESC_FS(port) { \ + UDI_CDC_DATA_DESC_COMMON \ + .ep_in.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_FS_SIZE),\ + .ep_out.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_FS_SIZE),\ + .ep_in.bEndpointAddress = UDI_CDC_DATA_EP_IN_##port,\ + .ep_out.bEndpointAddress = UDI_CDC_DATA_EP_OUT_##port,\ + .iface.bInterfaceNumber = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .iface.iInterface = UDI_CDC_DATA_STRING_ID_##port,\ + } + +#define UDI_CDC_DATA_DESC_HS(port) { \ + UDI_CDC_DATA_DESC_COMMON \ + .ep_in.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_HS_SIZE),\ + .ep_out.wMaxPacketSize = LE16(UDI_CDC_DATA_EPS_HS_SIZE),\ + .ep_in.bEndpointAddress = UDI_CDC_DATA_EP_IN_##port,\ + .ep_out.bEndpointAddress = UDI_CDC_DATA_EP_OUT_##port,\ + .iface.bInterfaceNumber = UDI_CDC_DATA_IFACE_NUMBER_##port,\ + .iface.iInterface = UDI_CDC_DATA_STRING_ID_##port,\ + } + +//@} + +/** + * \ingroup udi_group + * \defgroup udi_cdc_group USB Device Interface (UDI) for Communication Class Device (CDC) + * + * Common APIs used by high level application to use this USB class. + * + * These routines are used to transfer and control data + * to/from USB CDC endpoint. + * + * See \ref udi_cdc_quickstart. + * @{ + */ + +/** + * \name Interface for application with single CDC interface support + */ +//@{ + +/** + * \brief Notify a state change of DCD signal + * + * \param b_set DCD is enabled if true, else disabled + */ +void udi_cdc_ctrl_signal_dcd(bool b_set); + +/** + * \brief Notify a state change of DSR signal + * + * \param b_set DSR is enabled if true, else disabled + */ +void udi_cdc_ctrl_signal_dsr(bool b_set); + +/** + * \brief Notify a framing error + */ +void udi_cdc_signal_framing_error(void); + +/** + * \brief Notify a parity error + */ +void udi_cdc_signal_parity_error(void); + +/** + * \brief Notify a overrun + */ +void udi_cdc_signal_overrun(void); + +/** + * \brief Gets the number of byte received + * + * \return the number of data available + */ +iram_size_t udi_cdc_get_nb_received_data(void); + +/** + * \brief This function checks if a character has been received on the CDC line + * + * \return \c 1 if a byte is ready to be read. + */ +bool udi_cdc_is_rx_ready(void); + +/** + * \brief Waits and gets a value on CDC line + * + * \return value read on CDC line + */ +int udi_cdc_getc(void); + +/** + * \brief Reads a RAM buffer on CDC line + * + * \param buf Values read + * \param size Number of value read + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_read_buf(void* buf, iram_size_t size); + +/** + * \brief Non polling reads of a up to 'size' data from CDC line + * + * \param port Communication port number to manage + * \param buf Buffer where to store read data + * \param size Maximum number of data to read (size of buffer) + * + * \return the number of data effectively read + */ +iram_size_t udi_cdc_read_no_polling(void* buf, iram_size_t size); + +/** + * \brief Gets the number of free byte in TX buffer + * + * \return the number of free byte in TX buffer + */ +iram_size_t udi_cdc_get_free_tx_buffer(void); + +/** + * \brief This function checks if a new character sent is possible + * The type int is used to support scanf redirection from compiler LIB. + * + * \return \c 1 if a new character can be sent + */ +bool udi_cdc_is_tx_ready(void); + +/** + * \brief Puts a byte on CDC line + * The type int is used to support printf redirection from compiler LIB. + * + * \param value Value to put + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +int udi_cdc_putc(int value); + +/** + * \brief Writes a RAM buffer on CDC line + * + * \param buf Values to write + * \param size Number of value to write + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_write_buf(const void* buf, iram_size_t size); +//@} + +/** + * \name Interface for application with multi CDC interfaces support + */ +//@{ + +/** + * \brief Notify a state change of DCD signal + * + * \param port Communication port number to manage + * \param b_set DCD is enabled if true, else disabled + */ +void udi_cdc_multi_ctrl_signal_dcd(uint8_t port, bool b_set); + +/** + * \brief Notify a state change of DSR signal + * + * \param port Communication port number to manage + * \param b_set DSR is enabled if true, else disabled + */ +void udi_cdc_multi_ctrl_signal_dsr(uint8_t port, bool b_set); + +/** + * \brief Notify a framing error + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_framing_error(uint8_t port); + +/** + * \brief Notify a parity error + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_parity_error(uint8_t port); + +/** + * \brief Notify a overrun + * + * \param port Communication port number to manage + */ +void udi_cdc_multi_signal_overrun(uint8_t port); + +/** + * \brief Gets the number of byte received + * + * \param port Communication port number to manage + * + * \return the number of data available + */ +iram_size_t udi_cdc_multi_get_nb_received_data(uint8_t port); + +/** + * \brief This function checks if a character has been received on the CDC line + * + * \param port Communication port number to manage + * + * \return \c 1 if a byte is ready to be read. + */ +bool udi_cdc_multi_is_rx_ready(uint8_t port); + +/** + * \brief Waits and gets a value on CDC line + * + * \param port Communication port number to manage + * + * \return value read on CDC line + */ +int udi_cdc_multi_getc(uint8_t port); + +/** + * \brief Reads a RAM buffer on CDC line + * + * \param port Communication port number to manage + * \param buf Values read + * \param size Number of values read + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_multi_read_buf(uint8_t port, void* buf, iram_size_t size); + +/** + * \brief Gets the number of free byte in TX buffer + * + * \param port Communication port number to manage + * + * \return the number of free byte in TX buffer + */ +iram_size_t udi_cdc_multi_get_free_tx_buffer(uint8_t port); + +/** + * \brief This function checks if a new character sent is possible + * The type int is used to support scanf redirection from compiler LIB. + * + * \param port Communication port number to manage + * + * \return \c 1 if a new character can be sent + */ +bool udi_cdc_multi_is_tx_ready(uint8_t port); + +/** + * \brief Puts a byte on CDC line + * The type int is used to support printf redirection from compiler LIB. + * + * \param port Communication port number to manage + * \param value Value to put + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +int udi_cdc_multi_putc(uint8_t port, int value); + +/** + * \brief Writes a RAM buffer on CDC line + * + * \param port Communication port number to manage + * \param buf Values to write + * \param size Number of value to write + * + * \return the number of data remaining + */ +iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t size); +//@} + +//@} + +/** + * \page udi_cdc_quickstart Quick start guide for USB device Communication Class Device module (UDI CDC) + * + * This is the quick start guide for the \ref udi_cdc_group + * "USB device interface CDC module (UDI CDC)" with step-by-step instructions on + * how to configure and use the modules in a selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section udi_cdc_basic_use_case Basic use case + * In this basic use case, the "USB CDC (Single Interface Device)" module is used + * with only one communication port. + * The "USB CDC (Composite Device)" module usage is described in \ref udi_cdc_use_cases + * "Advanced use cases". + * + * \section udi_cdc_basic_use_case_setup Setup steps + * \subsection udi_cdc_basic_use_case_setup_prereq Prerequisites + * \copydetails udc_basic_use_case_setup_prereq + * \subsection udi_cdc_basic_use_case_setup_code Example code + * \copydetails udc_basic_use_case_setup_code + * \subsection udi_cdc_basic_use_case_setup_flow Workflow + * \copydetails udc_basic_use_case_setup_flow + * + * \section udi_cdc_basic_use_case_usage Usage steps + * + * \subsection udi_cdc_basic_use_case_usage_code Example code + * Content of conf_usb.h: + * \code + #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() + extern bool my_callback_cdc_enable(void); + #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() + extern void my_callback_cdc_disable(void); + #define UDI_CDC_LOW_RATE + + #define UDI_CDC_DEFAULT_RATE 115200 + #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 + #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE + #define UDI_CDC_DEFAULT_DATABITS 8 + + #include "udi_cdc_conf.h" // At the end of conf_usb.h file +\endcode + * + * Add to application C-file: + * \code + static bool my_flag_autorize_cdc_transfert = false; + bool my_callback_cdc_enable(void) + { + my_flag_autorize_cdc_transfert = true; + return true; + } + void my_callback_cdc_disable(void) + { + my_flag_autorize_cdc_transfert = false; + } + + void task(void) + { + if (my_flag_autorize_cdc_transfert) { + udi_cdc_putc('A'); + udi_cdc_getc(); + } + } +\endcode + * + * \subsection udi_cdc_basic_use_case_setup_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following configuration, + * which is the USB device CDC configuration: + * - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for CDC \endcode + * \note The USB serial number is mandatory when a CDC interface is used. + * - \code #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() + extern bool my_callback_cdc_enable(void); \endcode + * \note After the device enumeration (detecting and identifying USB devices), + * the USB host starts the device configuration. When the USB CDC interface + * from the device is accepted by the host, the USB host enables this interface and the + * UDI_CDC_ENABLE_EXT() callback function is called and return true. + * Thus, when this event is received, the data transfer on CDC interface are authorized. + * - \code #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() + extern void my_callback_cdc_disable(void); \endcode + * \note When the USB device is unplugged or is reset by the USB host, the USB + * interface is disabled and the UDI_CDC_DISABLE_EXT() callback function + * is called. Thus, the data transfer must be stopped on CDC interface. + * - \code #define UDI_CDC_LOW_RATE \endcode + * \note Define it when the transfer CDC Device to Host is a low rate + * (<512000 bauds) to reduce CDC buffers size. + * - \code #define UDI_CDC_DEFAULT_RATE 115200 + #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 + #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE + #define UDI_CDC_DEFAULT_DATABITS 8 \endcode + * \note Default configuration of communication port at startup. + * -# Send or wait data on CDC line: + * - \code // Waits and gets a value on CDC line + int udi_cdc_getc(void); + // Reads a RAM buffer on CDC line + iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size); + // Puts a byte on CDC line + int udi_cdc_putc(int value); + // Writes a RAM buffer on CDC line + iram_size_t udi_cdc_write_buf(const int* buf, iram_size_t size); \endcode + * + * \section udi_cdc_use_cases Advanced use cases + * For more advanced use of the UDI CDC module, see the following use cases: + * - \subpage udi_cdc_use_case_composite + * - \subpage udc_use_case_1 + * - \subpage udc_use_case_2 + * - \subpage udc_use_case_3 + * - \subpage udc_use_case_4 + * - \subpage udc_use_case_5 + * - \subpage udc_use_case_6 + */ + +/** + * \page udi_cdc_use_case_composite CDC in a composite device + * + * A USB Composite Device is a USB Device which uses more than one USB class. + * In this use case, the "USB CDC (Composite Device)" module is used to + * create a USB composite device. Thus, this USB module can be associated with + * 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 + * For the setup code of this use case to work, the + * \ref udi_cdc_basic_use_case "basic use case" must be followed. + * + * \section udi_cdc_use_case_composite_usage Usage steps + * + * \subsection udi_cdc_use_case_composite_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+2) + #define USB_DEVICE_MAX_EP (X+3) + + #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX + #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX + #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 + + #define UDI_COMPOSITE_DESC_T \ + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + ... +\endcode + * + * \subsection udi_cdc_use_case_composite_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB composite device configuration: + * - \code // Endpoint control size, This must be: + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 2 for CDC. + #define USB_DEVICE_NB_INTERFACE (X+2) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 3 for CDC. + #define USB_DEVICE_MAX_EP (X+3) \endcode + * -# Ensure that conf_usb.h contains the description of + * composite device: + * - \code // The endpoint numbers chosen by you for the CDC. + // The endpoint numbers starting from 1. + #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX + #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX + #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + // The interface index of an interface starting from 0 + #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB composite device configuration: + * - \code // USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + ... + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + ... \endcode + * - \note The descriptors order given in the four lists above must be the + * same as the order defined by all interface indexes. The interface index + * orders are defined through UDI_X_IFACE_NUMBER defines.\n + * Also, the CDC requires a USB Interface Association Descriptor (IAD) for + * composite device. + */ + +#ifdef __cplusplus +} +#endif +#endif // _UDI_CDC_H_ diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h b/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h new file mode 100644 index 00000000..d406a877 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_cdc_conf.h @@ -0,0 +1,156 @@ +/** + * \file + * + * \brief Default CDC configuration for a USB Device with a single interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_CDC_CONF_H_ +#define _UDI_CDC_CONF_H_ + +#include "usb_protocol_cdc.h" +#include "conf_usb.h" + +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_cdc_group_single_desc + * @{ + */ + +//! Control endpoint size (Endpoint 0) +#define USB_DEVICE_EP_CTRL_SIZE 64 + +#if XMEGA +/** + * \name Endpoint configuration on XMEGA + * The XMEGA supports a IN and OUT endpoint with the same number endpoint, + * thus XMEGA can support up to 7 CDC interfaces. + */ +//@{ +#define UDI_CDC_DATA_EP_IN_0 ( 1 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_0 ( 2 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_0 ( 2 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_1 ( 3 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_1 ( 4 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_1 ( 4 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_2 ( 5 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_2 ( 6 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_2 ( 6 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_3 ( 7 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_3 ( 8 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_3 ( 8 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_4 ( 9 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_4 (10 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_4 (10 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_5 (11 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_5 (12 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_5 (12 | USB_EP_DIR_IN) // Notify endpoint +#define UDI_CDC_DATA_EP_IN_6 (13 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_6 (14 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_6 (14 | USB_EP_DIR_IN) // Notify endpoint +//! 2 endpoints numbers used per CDC interface +#define USB_DEVICE_MAX_EP (2*UDI_CDC_PORT_NB) +//@} + +#else + +/** + * \name Default endpoint configuration + * The USBB, UDP, UDPHS and UOTGHS interfaces can support up to 2 CDC interfaces. + */ +//@{ +# if UDI_CDC_PORT_NB > 2 +# error USBB, UDP, UDPHS and UOTGHS interfaces have not enought endpoints. +# endif +#define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX +#define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX +#define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint +# if SAM3U + /* For 3U max endpoint size of 4 is 64, use 5 and 6 as bulk tx and rx */ +# define UDI_CDC_DATA_EP_IN_1 (6 | USB_EP_DIR_IN) // TX +# define UDI_CDC_DATA_EP_OUT_1 (5 | USB_EP_DIR_OUT) // RX +# define UDI_CDC_COMM_EP_1 (4 | USB_EP_DIR_IN) // Notify +# else +# define UDI_CDC_DATA_EP_IN_1 (4 | USB_EP_DIR_IN) // TX +# define UDI_CDC_DATA_EP_OUT_1 (5 | USB_EP_DIR_OUT) // RX +# define UDI_CDC_COMM_EP_1 (6 | USB_EP_DIR_IN) // Notify +# endif +//! 3 endpoints used per CDC interface +#undef USB_DEVICE_MAX_EP // undefine this definition in header file +#define USB_DEVICE_MAX_EP (3*UDI_CDC_PORT_NB) +//@} + +#endif + +/** + * \name Default Interface numbers + */ +//@{ +#define UDI_CDC_COMM_IFACE_NUMBER_0 0 +#define UDI_CDC_DATA_IFACE_NUMBER_0 1 +#define UDI_CDC_COMM_IFACE_NUMBER_1 2 +#define UDI_CDC_DATA_IFACE_NUMBER_1 3 +#define UDI_CDC_COMM_IFACE_NUMBER_2 4 +#define UDI_CDC_DATA_IFACE_NUMBER_2 5 +#define UDI_CDC_COMM_IFACE_NUMBER_3 6 +#define UDI_CDC_DATA_IFACE_NUMBER_3 7 +#define UDI_CDC_COMM_IFACE_NUMBER_4 8 +#define UDI_CDC_DATA_IFACE_NUMBER_4 9 +#define UDI_CDC_COMM_IFACE_NUMBER_5 10 +#define UDI_CDC_DATA_IFACE_NUMBER_5 11 +#define UDI_CDC_COMM_IFACE_NUMBER_6 12 +#define UDI_CDC_DATA_IFACE_NUMBER_6 13 +//@} + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _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 new file mode 100644 index 00000000..97c334e2 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_cdc_desc.c @@ -0,0 +1,261 @@ +/** + * \file + * + * \brief Default descriptors for a USB Device with a single interface CDC + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi_cdc.h" + +#if DISABLED(SDSUPPORT) + +/** + * \defgroup udi_cdc_group_single_desc USB device descriptors for a single interface + * + * The following structures provide the USB device descriptors required for + * USB Device with a single interface CDC. + * + * It is ready to use and do not require more definition. + * + * @{ + */ + +//! Two interfaces for a CDC device +#define USB_DEVICE_NB_INTERFACE (2*UDI_CDC_PORT_NB) + +#ifdef USB_DEVICE_LPM_SUPPORT +# define USB_VERSION USB_V2_1 +#else +# define USB_VERSION USB_V2_0 +#endif + +//! USB Device Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { + .bLength = sizeof(usb_dev_desc_t), + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = LE16(USB_VERSION), +#if UDI_CDC_PORT_NB > 1 + .bDeviceClass = 0, +#else + .bDeviceClass = CDC_CLASS_DEVICE, +#endif + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .idVendor = LE16(USB_DEVICE_VENDOR_ID), + .idProduct = LE16(USB_DEVICE_PRODUCT_ID), + .bcdDevice = LE16((USB_DEVICE_MAJOR_VERSION << 8) + | USB_DEVICE_MINOR_VERSION), +#ifdef USB_DEVICE_MANUFACTURE_NAME + .iManufacturer = 1, +#else + .iManufacturer = 0, // No manufacture string +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + .iProduct = 2, +#else + .iProduct = 0, // No product string +#endif +#if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER) + .iSerialNumber = 3, +#else + .iSerialNumber = 0, // No serial string +#endif + .bNumConfigurations = 1 +}; + + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Qualifier Descriptor for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { + .bLength = sizeof(usb_dev_qual_desc_t), + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + .bcdUSB = LE16(USB_VERSION), +#if UDI_CDC_PORT_NB > 1 + .bDeviceClass = 0, +#else + .bDeviceClass = CDC_CLASS_DEVICE, +#endif + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .bNumConfigurations = 1 +}; +#endif + +#ifdef USB_DEVICE_LPM_SUPPORT +//! USB Device Qualifier Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_lpm_desc_t udc_device_lpm = { + .bos.bLength = sizeof(usb_dev_bos_desc_t), + .bos.bDescriptorType = USB_DT_BOS, + .bos.wTotalLength = LE16(sizeof(usb_dev_bos_desc_t) + sizeof(usb_dev_capa_ext_desc_t)), + .bos.bNumDeviceCaps = 1, + .capa_ext.bLength = sizeof(usb_dev_capa_ext_desc_t), + .capa_ext.bDescriptorType = USB_DT_DEVICE_CAPABILITY, + .capa_ext.bDevCapabilityType = USB_DC_USB20_EXTENSION, + .capa_ext.bmAttributes = USB_DC_EXT_LPM, +}; +#endif + +//! Structure for USB Device Configuration Descriptor +COMPILER_PACK_SET(1) +typedef struct { + usb_conf_desc_t conf; +#if UDI_CDC_PORT_NB == 1 + udi_cdc_comm_desc_t udi_cdc_comm_0; + udi_cdc_data_desc_t udi_cdc_data_0; +#else +# define UDI_CDC_DESC_STRUCTURE(index, unused) \ + usb_iad_desc_t udi_cdc_iad_##index; \ + udi_cdc_comm_desc_t udi_cdc_comm_##index; \ + udi_cdc_data_desc_t udi_cdc_data_##index; + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DESC_STRUCTURE, ~) +# undef UDI_CDC_DESC_STRUCTURE +#endif +} udc_desc_t; +COMPILER_PACK_RESET() + +//! USB Device Configuration Descriptor filled for full and high speed +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_fs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), +#if UDI_CDC_PORT_NB == 1 + .udi_cdc_comm_0 = UDI_CDC_COMM_DESC_0, + .udi_cdc_data_0 = UDI_CDC_DATA_DESC_0_FS, +#else +# define UDI_CDC_DESC_FS(index, unused) \ + .udi_cdc_iad_##index = UDI_CDC_IAD_DESC_##index,\ + .udi_cdc_comm_##index = UDI_CDC_COMM_DESC_##index,\ + .udi_cdc_data_##index = UDI_CDC_DATA_DESC_##index##_FS, + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DESC_FS, ~) +# undef UDI_CDC_DESC_FS +#endif +}; + +#ifdef USB_DEVICE_HS_SUPPORT +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_hs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), +#if UDI_CDC_PORT_NB == 1 + .udi_cdc_comm_0 = UDI_CDC_COMM_DESC_0, + .udi_cdc_data_0 = UDI_CDC_DATA_DESC_0_HS, +#else +# define UDI_CDC_DESC_HS(index, unused) \ + .udi_cdc_iad_##index = UDI_CDC_IAD_DESC_##index, \ + .udi_cdc_comm_##index = UDI_CDC_COMM_DESC_##index, \ + .udi_cdc_data_##index = UDI_CDC_DATA_DESC_##index##_HS, + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DESC_HS, ~) +# undef UDI_CDC_DESC_HS +#endif +}; +#endif + +/** + * \name UDC structures which content all USB Device definitions + */ +//@{ + +//! Associate an UDI for each USB interface +UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { +# define UDI_CDC_API(index, unused) \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, + MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_API, ~) +# undef UDI_CDC_API +}; + +//! Add UDI with USB Descriptors FS & HS +UDC_DESC_STORAGE udc_config_speed_t udc_config_fs[1] = { { + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_fs, + .udi_apis = udi_apis, +}}; +#ifdef USB_DEVICE_HS_SUPPORT +UDC_DESC_STORAGE udc_config_speed_t udc_config_hs[1] = { { + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_hs, + .udi_apis = udi_apis, +}}; +#endif + +//! Add all information about USB Device in global structure for UDC +UDC_DESC_STORAGE udc_config_t udc_config = { + .confdev_lsfs = &udc_device_desc, + .conf_lsfs = udc_config_fs, +#ifdef USB_DEVICE_HS_SUPPORT + .confdev_hs = &udc_device_desc, + .qualifier = &udc_device_qual, + .conf_hs = udc_config_hs, +#endif +#ifdef USB_DEVICE_LPM_SUPPORT + .conf_bos = &udc_device_lpm.bos, +#else + .conf_bos = NULL, +#endif +}; + +//@} +//@} + +#endif // SDSUPPORT + +#endif // 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 new file mode 100644 index 00000000..da74fbe6 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_composite_desc.c @@ -0,0 +1,192 @@ +/** + * \file + * + * \brief Descriptors for an USB Composite Device + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "udd.h" +#include "udc_desc.h" + +#if ENABLED(SDSUPPORT) + +/** + * \defgroup udi_group_desc Descriptors for a USB Device + * composite + * + * @{ + */ + +/**INDENT-OFF**/ + +//! USB Device Descriptor +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { + .bLength = sizeof(usb_dev_desc_t), + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = CDC_CLASS_MULTI, + .bDeviceSubClass = CDC_SUBCLASS_ACM, + .bDeviceProtocol = CDC_PROTOCOL_V25TER, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .idVendor = LE16(USB_DEVICE_VENDOR_ID), + .idProduct = LE16(USB_DEVICE_PRODUCT_ID), + .bcdDevice = LE16((USB_DEVICE_MAJOR_VERSION << 8) + | USB_DEVICE_MINOR_VERSION), +#ifdef USB_DEVICE_MANUFACTURE_NAME + .iManufacturer = 1, +#else + .iManufacturer = 0, // No manufacture string +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + .iProduct = 2, +#else + .iProduct = 0, // No product string +#endif +#if (defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER) + .iSerialNumber = 3, +#else + .iSerialNumber = 0, // No serial string +#endif + .bNumConfigurations = 1 +}; + + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Qualifier Descriptor for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { + .bLength = sizeof(usb_dev_qual_desc_t), + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = CDC_CLASS_MULTI, + .bDeviceSubClass = CDC_SUBCLASS_ACM, + .bDeviceProtocol = CDC_PROTOCOL_V25TER, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .bNumConfigurations = 1 +}; +#endif + +//! Structure for USB Device Configuration Descriptor +COMPILER_PACK_SET(1) +typedef struct { + usb_conf_desc_t conf; + UDI_COMPOSITE_DESC_T; +} udc_desc_t; +COMPILER_PACK_RESET() + +//! USB Device Configuration Descriptor filled for FS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_fs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), + UDI_COMPOSITE_DESC_FS +}; + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Configuration Descriptor filled for HS +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udc_desc_t udc_desc_hs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), + UDI_COMPOSITE_DESC_HS +}; +#endif + + +/** + * \name UDC structures which contains all USB Device definitions + */ +//@{ + +//! Associate an UDI for each USB interface +UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { + UDI_COMPOSITE_API +}; + +//! Add UDI with USB Descriptors FS +UDC_DESC_STORAGE udc_config_speed_t udc_config_lsfs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_fs, + .udi_apis = udi_apis, +}}; + +#ifdef USB_DEVICE_HS_SUPPORT +//! Add UDI with USB Descriptors HS +UDC_DESC_STORAGE udc_config_speed_t udc_config_hs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_hs, + .udi_apis = udi_apis, +}}; +#endif + +//! Add all information about USB Device in global structure for UDC +UDC_DESC_STORAGE udc_config_t udc_config = { + .confdev_lsfs = &udc_device_desc, + .conf_lsfs = udc_config_lsfs, +#ifdef USB_DEVICE_HS_SUPPORT + .confdev_hs = &udc_device_desc, + .qualifier = &udc_device_qual, + .conf_hs = udc_config_hs, +#endif +}; + +//@} +/**INDENT-ON**/ +//@} + +#endif // ARDUINO_ARCH_SAM + +#endif // SDSUPPORT diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.c b/Marlin/src/HAL/DUE/usb/udi_msc.c new file mode 100644 index 00000000..b7c3bb5e --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_msc.c @@ -0,0 +1,1132 @@ +/** + * \file + * + * \brief USB Device Mass Storage Class (MSC) interface. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_msc.h" +#include "spc_protocol.h" +#include "sbc_protocol.h" +#include "udd.h" +#include "udc.h" +#include "udi_msc.h" +#include "ctrl_access.h" +#include + +#if ENABLED(SDSUPPORT) + +#ifndef UDI_MSC_NOTIFY_TRANS_EXT +# define UDI_MSC_NOTIFY_TRANS_EXT() +#endif + +/** + * \ingroup udi_msc_group + * \defgroup udi_msc_group_udc Interface with USB Device Core (UDC) + * + * Structures and functions required by UDC. + * + * @{ + */ +bool udi_msc_enable(void); +void udi_msc_disable(void); +bool udi_msc_setup(void); +uint8_t udi_msc_getsetting(void); + +//! Global structure which contains standard UDI API for UDC +UDC_DESC_STORAGE udi_api_t udi_api_msc = { + .enable = udi_msc_enable, + .disable = udi_msc_disable, + .setup = udi_msc_setup, + .getsetting = udi_msc_getsetting, + .sof_notify = NULL, +}; +//@} + + +/** + * \ingroup udi_msc_group + * \defgroup udi_msc_group_internal Implementation of UDI MSC + * + * Class internal implementation + * @{ + */ + +//! Static block size for all memories +#define UDI_MSC_BLOCK_SIZE 512L + +/** + * \name Variables to manage SCSI requests + */ +//@{ + +//! Structure to receive a CBW packet +UDC_BSS(4) static struct usb_msc_cbw udi_msc_cbw; +//! Structure to send a CSW packet +UDC_DATA(4) static struct usb_msc_csw udi_msc_csw = + {.dCSWSignature = CPU_TO_BE32(USB_CSW_SIGNATURE) }; +//! Number of lun +UDC_DATA(4) static uint8_t udi_msc_nb_lun = 0; +//! Structure with current SCSI sense data +UDC_BSS(4) static struct scsi_request_sense_data udi_msc_sense; + +/** + * \name Variables to manage the background read/write SCSI commands + */ +//@{ +//! True if an invalid CBW command has been detected +static bool udi_msc_b_cbw_invalid = false; +//! True if a transfer command must be processed +static bool udi_msc_b_trans_req = false; +//! True if it is a read command, else write command +static bool udi_msc_b_read; +//! Memory address to execute the command +static uint32_t udi_msc_addr; +//! Number of block to transfer +static uint16_t udi_msc_nb_block; +//! Signal end of transfer, if true +volatile bool udi_msc_b_ack_trans = true; +//! Status of transfer, aborted if true +volatile bool udi_msc_b_abort_trans; +//! Signal (re)init of transfer, if true (by reset/reconnect) +volatile bool udi_msc_b_reset_trans = true; +//@} + +//@} + + +/** + * \name Internal routines + */ +//@{ + +/** + * \name Routines to process CBW packet + */ +//@{ + +/** + * \brief Stall CBW request + */ +static void udi_msc_cbw_invalid(void); + +/** + * \brief Stall CSW request + */ +static void udi_msc_csw_invalid(void); + +/** + * \brief Links a callback and buffer on endpoint OUT reception + * + * Called by: + * - enable interface + * - at the end of previous command after sending the CSW + */ +static void udi_msc_cbw_wait(void); + +/** + * \brief Callback called after CBW reception + * Called by UDD when a transfer is finished or aborted + * + * \param status UDD_EP_TRANSFER_OK, if transfer is finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param nb_received number of data transfered + */ +static void udi_msc_cbw_received(udd_ep_status_t status, + iram_size_t nb_received, udd_ep_id_t ep); + +/** + * \brief Function to check the CBW length and direction + * Call it after SCSI command decode to check integrity of command + * + * \param alloc_len number of bytes that device want transfer + * \param dir_flag Direction of transfer (USB_CBW_DIRECTION_IN/OUT) + * + * \retval true if the command can be processed + */ +static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag); +//@} + + +/** + * \name Routines to process small data packet + */ +//@{ + +/** + * \brief Sends data on MSC IN endpoint + * Called by SCSI command which must send a data to host followed by a CSW + * + * \param buffer Internal RAM buffer to send + * \param buf_size Size of buffer to send + */ +static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size); + +/** + * \brief Callback called after data sent + * It start CSW packet process + * + * \param status UDD_EP_TRANSFER_OK, if transfer finish + * \param status UDD_EP_TRANSFER_ABORT, if transfer aborted + * \param nb_sent number of data transfered + */ +static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep); +//@} + + +/** + * \name Routines to process CSW packet + */ +//@{ + +/** + * \brief Build CSW packet and send it + * + * Called at the end of SCSI command + */ +static void udi_msc_csw_process(void); + +/** + * \brief Sends CSW + * + * Called by #udi_msc_csw_process() + * or UDD callback when endpoint halt is cleared + */ +void udi_msc_csw_send(void); + +/** + * \brief Callback called after CSW sent + * It restart CBW reception. + * + * \param status UDD_EP_TRANSFER_OK, if transfer is finished + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param nb_sent number of data transfered + */ +static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep); +//@} + + +/** + * \name Routines manage sense data + */ +//@{ + +/** + * \brief Reinitialize sense data. + */ +static void udi_msc_clear_sense(void); + +/** + * \brief Update sense data with new value to signal a fail + * + * \param sense_key Sense key + * \param add_sense Additional Sense Code + * \param lba LBA corresponding at error + */ +static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, + uint32_t lba); + +/** + * \brief Update sense data with new value to signal success + */ +static void udi_msc_sense_pass(void); + +/** + * \brief Update sense data to signal that memory is not present + */ +static void udi_msc_sense_fail_not_present(void); + +/** + * \brief Update sense data to signal that memory is busy + */ +static void udi_msc_sense_fail_busy_or_change(void); + +/** + * \brief Update sense data to signal a hardware error on memory + */ +static void udi_msc_sense_fail_hardware(void); + +/** + * \brief Update sense data to signal that memory is protected + */ +static void udi_msc_sense_fail_protected(void); + +/** + * \brief Update sense data to signal that CDB fields are not valid + */ +static void udi_msc_sense_fail_cdb_invalid(void); + +/** + * \brief Update sense data to signal that command is not supported + */ +static void udi_msc_sense_command_invalid(void); +//@} + + +/** + * \name Routines manage SCSI Commands + */ +//@{ + +/** + * \brief Process SPC Request Sense command + * Returns error information about last command + */ +static void udi_msc_spc_requestsense(void); + +/** + * \brief Process SPC Inquiry command + * Returns information (name,version) about disk + */ +static void udi_msc_spc_inquiry(void); + +/** + * \brief Checks state of disk + * + * \retval true if disk is ready, otherwise false and updates sense data + */ +static bool udi_msc_spc_testunitready_global(void); + +/** + * \brief Process test unit ready command + * Returns state of logical unit + */ +static void udi_msc_spc_testunitready(void); + +/** + * \brief Process prevent allow medium removal command + */ +static void udi_msc_spc_prevent_allow_medium_removal(void); + +/** + * \brief Process mode sense command + * + * \param b_sense10 Sense10 SCSI command, if true + * \param b_sense10 Sense6 SCSI command, if false + */ +static void udi_msc_spc_mode_sense(bool b_sense10); + +/** + * \brief Process start stop command + */ +static void udi_msc_sbc_start_stop(void); + +/** + * \brief Process read capacity command + */ +static void udi_msc_sbc_read_capacity(void); + +/** + * \brief Process read10 or write10 command + * + * \param b_read Read transfer, if true, + * \param b_read Write transfer, if false + */ +static void udi_msc_sbc_trans(bool b_read); +//@} + +//@} + + +bool udi_msc_enable(void) +{ + uint8_t lun; + udi_msc_b_trans_req = false; + udi_msc_b_cbw_invalid = false; + udi_msc_b_ack_trans = true; + udi_msc_b_reset_trans = true; + udi_msc_nb_lun = get_nb_lun(); + if (0 == udi_msc_nb_lun) + return false; // No lun available, then not authorize to enable interface + udi_msc_nb_lun--; + // Call application callback + // to initialize memories or signal that interface is enabled + if (!UDI_MSC_ENABLE_EXT()) + return false; + // Load the medium on each LUN + for (lun = 0; lun <= udi_msc_nb_lun; lun ++) { + mem_unload(lun, false); + } + // Start MSC process by CBW reception + udi_msc_cbw_wait(); + return true; +} + + +void udi_msc_disable(void) +{ + udi_msc_b_trans_req = false; + udi_msc_b_ack_trans = true; + udi_msc_b_reset_trans = true; + UDI_MSC_DISABLE_EXT(); +} + + +bool udi_msc_setup(void) +{ + if (Udd_setup_is_in()) { + // Requests Interface GET + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Get + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_MSC_GET_MAX_LUN: + // Give the number of memories available + if (1 != udd_g_ctrlreq.req.wLength) + return false; // Error for USB host + if (0 != udd_g_ctrlreq.req.wValue) + return false; + udd_g_ctrlreq.payload = &udi_msc_nb_lun; + udd_g_ctrlreq.payload_size = 1; + return true; + } + } + } + if (Udd_setup_is_out()) { + // Requests Interface SET + if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { + // Requests Class Interface Set + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_MSC_BULK_RESET: + // Reset MSC interface + if (0 != udd_g_ctrlreq.req.wLength) + return false; + if (0 != udd_g_ctrlreq.req.wValue) + return false; + udi_msc_b_cbw_invalid = false; + udi_msc_b_trans_req = false; + // Abort all tasks (transfer or clear stall wait) on endpoints + udd_ep_abort(UDI_MSC_EP_OUT); + udd_ep_abort(UDI_MSC_EP_IN); + // Restart by CBW wait + udi_msc_cbw_wait(); + return true; + } + } + } + return false; // Not supported request +} + +uint8_t udi_msc_getsetting(void) +{ + return 0; // MSC don't have multiple alternate setting +} + + +// ------------------------ +//------- Routines to process CBW packet + +static void udi_msc_cbw_invalid(void) +{ + if (!udi_msc_b_cbw_invalid) + return; // Don't re-stall endpoint if error reseted by setup + udd_ep_set_halt(UDI_MSC_EP_OUT); + // If stall cleared then re-stall it. Only Setup MSC Reset can clear it + udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid); +} + +static void udi_msc_csw_invalid(void) +{ + if (!udi_msc_b_cbw_invalid) + return; // Don't re-stall endpoint if error reseted by setup + udd_ep_set_halt(UDI_MSC_EP_IN); + // If stall cleared then re-stall it. Only Setup MSC Reset can clear it + udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid); +} + +static void udi_msc_cbw_wait(void) +{ + // Register buffer and callback on OUT endpoint + if (!udd_ep_run(UDI_MSC_EP_OUT, true, + (uint8_t *) & udi_msc_cbw, + sizeof(udi_msc_cbw), + udi_msc_cbw_received)) { + // OUT endpoint not available (halted), then wait a clear of halt. + udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_wait); + } +} + + +static void udi_msc_cbw_received(udd_ep_status_t status, + iram_size_t nb_received, udd_ep_id_t ep) +{ + UNUSED(ep); + // Check status of transfer + if (UDD_EP_TRANSFER_OK != status) { + // Transfer aborted + // Now wait MSC setup reset to relaunch CBW reception + return; + } + // Check CBW integrity: + // transfer status/CBW length/CBW signature + if ((sizeof(udi_msc_cbw) != nb_received) + || (udi_msc_cbw.dCBWSignature != + CPU_TO_BE32(USB_CBW_SIGNATURE))) { + // (5.2.1) Devices receiving a CBW with an invalid signature should stall + // further traffic on the Bulk In pipe, and either stall further traffic + // or accept and discard further traffic on the Bulk Out pipe, until + // reset recovery. + udi_msc_b_cbw_invalid = true; + udi_msc_cbw_invalid(); + udi_msc_csw_invalid(); + return; + } + // Check LUN asked + udi_msc_cbw.bCBWLUN &= USB_CBW_LUN_MASK; + if (udi_msc_cbw.bCBWLUN > udi_msc_nb_lun) { + // Bad LUN, then stop command process + udi_msc_sense_fail_cdb_invalid(); + udi_msc_csw_process(); + return; + } + // Prepare CSW residue field with the size requested + udi_msc_csw.dCSWDataResidue = + le32_to_cpu(udi_msc_cbw.dCBWDataTransferLength); + + // Decode opcode + switch (udi_msc_cbw.CDB[0]) { + case SPC_REQUEST_SENSE: + udi_msc_spc_requestsense(); + break; + + case SPC_INQUIRY: + udi_msc_spc_inquiry(); + break; + + case SPC_MODE_SENSE6: + udi_msc_spc_mode_sense(false); + break; + case SPC_MODE_SENSE10: + udi_msc_spc_mode_sense(true); + break; + + case SPC_TEST_UNIT_READY: + udi_msc_spc_testunitready(); + break; + + case SBC_READ_CAPACITY10: + udi_msc_sbc_read_capacity(); + break; + + case SBC_START_STOP_UNIT: + udi_msc_sbc_start_stop(); + break; + + // Accepts request to support plug/plug in case of card reader + case SPC_PREVENT_ALLOW_MEDIUM_REMOVAL: + udi_msc_spc_prevent_allow_medium_removal(); + break; + + // Accepts request to support full format from Windows + case SBC_VERIFY10: + udi_msc_sense_pass(); + udi_msc_csw_process(); + break; + + case SBC_READ10: + udi_msc_sbc_trans(true); + break; + + case SBC_WRITE10: + udi_msc_sbc_trans(false); + break; + + default: + udi_msc_sense_command_invalid(); + udi_msc_csw_process(); + break; + } +} + + +static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) +{ + /* + * The following cases should result in a phase error: + * - Case 2: Hn < Di + * - Case 3: Hn < Do + * - Case 7: Hi < Di + * - Case 8: Hi <> Do + * - Case 10: Ho <> Di + * - Case 13: Ho < Do + */ + if (((udi_msc_cbw.bmCBWFlags ^ dir_flag) & USB_CBW_DIRECTION_IN) + || (udi_msc_csw.dCSWDataResidue < alloc_len)) { + udi_msc_sense_fail_cdb_invalid(); + udi_msc_csw_process(); + return false; + } + + /* + * The following cases should result in a stall and nonzero + * residue: + * - Case 4: Hi > Dn + * - Case 5: Hi > Di + * - Case 9: Ho > Dn + * - Case 11: Ho > Do + */ + return true; +} + + +// ------------------------ +//------- Routines to process small data packet + +static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) +{ + // Sends data on IN endpoint + if (!udd_ep_run(UDI_MSC_EP_IN, true, + buffer, buf_size, udi_msc_data_sent)) { + // If endpoint not available, then exit process command + udi_msc_sense_fail_hardware(); + udi_msc_csw_process(); + } +} + + +static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep) +{ + UNUSED(ep); + if (UDD_EP_TRANSFER_OK != status) { + // Error protocol + // Now wait MSC setup reset to relaunch CBW reception + return; + } + // Update sense data + udi_msc_sense_pass(); + // Update CSW + udi_msc_csw.dCSWDataResidue -= nb_sent; + udi_msc_csw_process(); +} + + +// ------------------------ +//------- Routines to process CSW packet + +static void udi_msc_csw_process(void) +{ + if (0 != udi_msc_csw.dCSWDataResidue) { + // Residue not NULL + // then STALL next request from USB host on corresponding endpoint + if (udi_msc_cbw.bmCBWFlags & USB_CBW_DIRECTION_IN) + udd_ep_set_halt(UDI_MSC_EP_IN); + else + udd_ep_set_halt(UDI_MSC_EP_OUT); + } + // Prepare and send CSW + udi_msc_csw.dCSWTag = udi_msc_cbw.dCBWTag; + udi_msc_csw.dCSWDataResidue = cpu_to_le32(udi_msc_csw.dCSWDataResidue); + udi_msc_csw_send(); +} + + +void udi_msc_csw_send(void) +{ + // Sends CSW on IN endpoint + if (!udd_ep_run(UDI_MSC_EP_IN, false, + (uint8_t *) & udi_msc_csw, + sizeof(udi_msc_csw), + udi_msc_csw_sent)) { + // Endpoint not available + // then restart CSW sent when endpoint IN STALL will be cleared + udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_send); + } +} + + +static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, + udd_ep_id_t ep) +{ + UNUSED(ep); + UNUSED(status); + UNUSED(nb_sent); + // CSW is sent or not + // In all case, restart process and wait CBW + udi_msc_cbw_wait(); +} + + +// ------------------------ +//------- Routines manage sense data + +static void udi_msc_clear_sense(void) +{ + memset((uint8_t*)&udi_msc_sense, 0, sizeof(struct scsi_request_sense_data)); + udi_msc_sense.valid_reponse_code = SCSI_SENSE_VALID | SCSI_SENSE_CURRENT; + udi_msc_sense.AddSenseLen = SCSI_SENSE_ADDL_LEN(sizeof(udi_msc_sense)); +} + +static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, + uint32_t lba) +{ + udi_msc_clear_sense(); + udi_msc_csw.bCSWStatus = USB_CSW_STATUS_FAIL; + udi_msc_sense.sense_flag_key = sense_key; + udi_msc_sense.information[0] = lba >> 24; + udi_msc_sense.information[1] = lba >> 16; + udi_msc_sense.information[2] = lba >> 8; + udi_msc_sense.information[3] = lba; + udi_msc_sense.AddSenseCode = add_sense >> 8; + udi_msc_sense.AddSnsCodeQlfr = add_sense; +} + +static void udi_msc_sense_pass(void) +{ + udi_msc_clear_sense(); + udi_msc_csw.bCSWStatus = USB_CSW_STATUS_PASS; +} + + +static void udi_msc_sense_fail_not_present(void) +{ + udi_msc_sense_fail(SCSI_SK_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0); +} + +static void udi_msc_sense_fail_busy_or_change(void) +{ + udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION, + SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0); +} + +static void udi_msc_sense_fail_hardware(void) +{ + udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR, + SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0); +} + +static void udi_msc_sense_fail_protected(void) +{ + udi_msc_sense_fail(SCSI_SK_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0); +} + +static void udi_msc_sense_fail_cdb_invalid(void) +{ + udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_FIELD_IN_CDB, 0); +} + +static void udi_msc_sense_command_invalid(void) +{ + udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0); +} + + +// ------------------------ +//------- Routines manage SCSI Commands + +static void udi_msc_spc_requestsense(void) +{ + uint8_t length = udi_msc_cbw.CDB[4]; + + // Can't send more than sense data length + if (length > sizeof(udi_msc_sense)) + length = sizeof(udi_msc_sense); + + if (!udi_msc_cbw_validate(length, USB_CBW_DIRECTION_IN)) + return; + // Send sense data + udi_msc_data_send((uint8_t*)&udi_msc_sense, length); +} + + +static void udi_msc_spc_inquiry(void) +{ + uint8_t length, i; + UDC_DATA(4) + // Constant inquiry data for all LUNs + static struct scsi_inquiry_data udi_msc_inquiry_data = { + .pq_pdt = SCSI_INQ_PQ_CONNECTED | SCSI_INQ_DT_DIR_ACCESS, + .version = SCSI_INQ_VER_SPC, + .flags3 = SCSI_INQ_RSP_SPC2, + .addl_len = SCSI_INQ_ADDL_LEN(sizeof(struct scsi_inquiry_data)), + .vendor_id = {UDI_MSC_GLOBAL_VENDOR_ID}, + .product_rev = {UDI_MSC_GLOBAL_PRODUCT_VERSION}, + }; + + length = udi_msc_cbw.CDB[4]; + + // Can't send more than inquiry data length + if (length > sizeof(udi_msc_inquiry_data)) + length = sizeof(udi_msc_inquiry_data); + + if (!udi_msc_cbw_validate(length, USB_CBW_DIRECTION_IN)) + return; + if ((0 != (udi_msc_cbw.CDB[1] & (SCSI_INQ_REQ_EVPD | SCSI_INQ_REQ_CMDT))) + || (0 != udi_msc_cbw.CDB[2])) { + // CMDT and EPVD bits are not at 0 + // PAGE or OPERATION CODE fields are not empty + // = No standard inquiry asked + udi_msc_sense_fail_cdb_invalid(); // Command is unsupported + udi_msc_csw_process(); + return; + } + + udi_msc_inquiry_data.flags1 = mem_removal(udi_msc_cbw.bCBWLUN) ? + SCSI_INQ_RMB : 0; + + //* Fill product ID field + // Copy name in product id field + memcpy(udi_msc_inquiry_data.product_id, + mem_name(udi_msc_cbw.bCBWLUN)+1, // To remove first '"' + sizeof(udi_msc_inquiry_data.product_id)); + + // Search end of name '/0' or '"' + i = 0; + while (sizeof(udi_msc_inquiry_data.product_id) != i) { + if ((0 == udi_msc_inquiry_data.product_id[i]) + || ('"' == udi_msc_inquiry_data.product_id[i])) { + break; + } + i++; + } + // Padding with space char + while (sizeof(udi_msc_inquiry_data.product_id) != i) { + udi_msc_inquiry_data.product_id[i] = ' '; + i++; + } + + // Send inquiry data + udi_msc_data_send((uint8_t *) & udi_msc_inquiry_data, length); +} + + +static bool udi_msc_spc_testunitready_global(void) +{ + switch (mem_test_unit_ready(udi_msc_cbw.bCBWLUN)) { + case CTRL_GOOD: + return true; // Don't change sense data + case CTRL_BUSY: + udi_msc_sense_fail_busy_or_change(); + break; + case CTRL_NO_PRESENT: + udi_msc_sense_fail_not_present(); + break; + case CTRL_FAIL: + default: + udi_msc_sense_fail_hardware(); + break; + } + return false; +} + + +static void udi_msc_spc_testunitready(void) +{ + if (udi_msc_spc_testunitready_global()) { + // LUN ready, then update sense data with status pass + udi_msc_sense_pass(); + } + // Send status in CSW packet + udi_msc_csw_process(); +} + + +static void udi_msc_spc_mode_sense(bool b_sense10) +{ + // Union of all mode sense structures + union sense_6_10 { + struct { + struct scsi_mode_param_header6 header; + struct spc_control_page_info_execpt sense_data; + } s6; + struct { + struct scsi_mode_param_header10 header; + struct spc_control_page_info_execpt sense_data; + } s10; + }; + + uint8_t data_sense_lgt; + uint8_t mode; + uint8_t request_lgt; + uint8_t wp; + struct spc_control_page_info_execpt *ptr_mode; + UDC_BSS(4) static union sense_6_10 sense; + + // Clear all fields + memset(&sense, 0, sizeof(sense)); + + // Initialize process + if (b_sense10) { + request_lgt = udi_msc_cbw.CDB[8]; + ptr_mode = &sense.s10.sense_data; + data_sense_lgt = sizeof(struct scsi_mode_param_header10); + } else { + request_lgt = udi_msc_cbw.CDB[4]; + ptr_mode = &sense.s6.sense_data; + data_sense_lgt = sizeof(struct scsi_mode_param_header6); + } + + // No Block descriptor + + // Fill page(s) + mode = udi_msc_cbw.CDB[2] & SCSI_MS_MODE_ALL; + if ((SCSI_MS_MODE_INFEXP == mode) + || (SCSI_MS_MODE_ALL == mode)) { + // Informational exceptions control page (from SPC) + ptr_mode->page_code = + SCSI_MS_MODE_INFEXP; + ptr_mode->page_length = + SPC_MP_INFEXP_PAGE_LENGTH; + ptr_mode->mrie = + SPC_MP_INFEXP_MRIE_NO_SENSE; + data_sense_lgt += sizeof(struct spc_control_page_info_execpt); + } + // Can't send more than mode sense data length + if (request_lgt > data_sense_lgt) + request_lgt = data_sense_lgt; + if (!udi_msc_cbw_validate(request_lgt, USB_CBW_DIRECTION_IN)) + return; + + // Fill mode parameter header length + wp = (mem_wr_protect(udi_msc_cbw.bCBWLUN)) ? SCSI_MS_SBC_WP : 0; + + if (b_sense10) { + sense.s10.header.mode_data_length = + cpu_to_be16((data_sense_lgt - 2)); + //sense.s10.header.medium_type = 0; + sense.s10.header.device_specific_parameter = wp; + //sense.s10.header.block_descriptor_length = 0; + } else { + sense.s6.header.mode_data_length = data_sense_lgt - 1; + //sense.s6.header.medium_type = 0; + sense.s6.header.device_specific_parameter = wp; + //sense.s6.header.block_descriptor_length = 0; + } + + // Send mode sense data + udi_msc_data_send((uint8_t *) & sense, request_lgt); +} + + +static void udi_msc_spc_prevent_allow_medium_removal(void) +{ + uint8_t prevent = udi_msc_cbw.CDB[4]; + if (0 == prevent) { + udi_msc_sense_pass(); + } else { + udi_msc_sense_fail_cdb_invalid(); // Command is unsupported + } + udi_msc_csw_process(); +} + + +static void udi_msc_sbc_start_stop(void) +{ + bool start = 0x1 & udi_msc_cbw.CDB[4]; + bool loej = 0x2 & udi_msc_cbw.CDB[4]; + if (loej) { + mem_unload(udi_msc_cbw.bCBWLUN, !start); + } + udi_msc_sense_pass(); + udi_msc_csw_process(); +} + + +static void udi_msc_sbc_read_capacity(void) +{ + UDC_BSS(4) static struct sbc_read_capacity10_data udi_msc_capacity; + + if (!udi_msc_cbw_validate(sizeof(udi_msc_capacity), + USB_CBW_DIRECTION_IN)) + return; + + // Get capacity of LUN + switch (mem_read_capacity(udi_msc_cbw.bCBWLUN, + &udi_msc_capacity.max_lba)) { + case CTRL_GOOD: + break; + case CTRL_BUSY: + udi_msc_sense_fail_busy_or_change(); + udi_msc_csw_process(); + return; + case CTRL_NO_PRESENT: + udi_msc_sense_fail_not_present(); + udi_msc_csw_process(); + return; + default: + udi_msc_sense_fail_hardware(); + udi_msc_csw_process(); + return; + } + + // Format capacity data + udi_msc_capacity.block_len = CPU_TO_BE32(UDI_MSC_BLOCK_SIZE); + udi_msc_capacity.max_lba = cpu_to_be32(udi_msc_capacity.max_lba); + // Send the corresponding sense data + udi_msc_data_send((uint8_t *) & udi_msc_capacity, + sizeof(udi_msc_capacity)); +} + + +static void udi_msc_sbc_trans(bool b_read) +{ + uint32_t trans_size; + + if (!b_read) { + // Write operation then check Write Protect + if (mem_wr_protect(udi_msc_cbw.bCBWLUN)) { + // Write not authorized + udi_msc_sense_fail_protected(); + udi_msc_csw_process(); + return; + } + } + // Read/Write command fields (address and number of block) + MSB0(udi_msc_addr) = udi_msc_cbw.CDB[2]; + MSB1(udi_msc_addr) = udi_msc_cbw.CDB[3]; + MSB2(udi_msc_addr) = udi_msc_cbw.CDB[4]; + MSB3(udi_msc_addr) = udi_msc_cbw.CDB[5]; + MSB(udi_msc_nb_block) = udi_msc_cbw.CDB[7]; + LSB(udi_msc_nb_block) = udi_msc_cbw.CDB[8]; + + // Compute number of byte to transfer and valid it + trans_size = (uint32_t) udi_msc_nb_block *UDI_MSC_BLOCK_SIZE; + if (!udi_msc_cbw_validate(trans_size, + (b_read) ? USB_CBW_DIRECTION_IN : + USB_CBW_DIRECTION_OUT)) + return; + + // Record transfer request to do it in a task and not under interrupt + udi_msc_b_read = b_read; + udi_msc_b_trans_req = true; + UDI_MSC_NOTIFY_TRANS_EXT(); +} + + +bool udi_msc_process_trans(void) +{ + Ctrl_status status; + + if (!udi_msc_b_trans_req) + return false; // No Transfer request to do + udi_msc_b_trans_req = false; + udi_msc_b_reset_trans = false; + + // Start transfer + if (udi_msc_b_read) { + status = memory_2_usb(udi_msc_cbw.bCBWLUN, udi_msc_addr, + udi_msc_nb_block); + } else { + status = usb_2_memory(udi_msc_cbw.bCBWLUN, udi_msc_addr, + udi_msc_nb_block); + } + + // Check if transfer is aborted by reset + if (udi_msc_b_reset_trans) { + udi_msc_b_reset_trans = false; + return true; + } + + // Check status of transfer + switch (status) { + case CTRL_GOOD: + udi_msc_sense_pass(); + break; + case CTRL_BUSY: + udi_msc_sense_fail_busy_or_change(); + break; + case CTRL_NO_PRESENT: + udi_msc_sense_fail_not_present(); + break; + default: + case CTRL_FAIL: + udi_msc_sense_fail_hardware(); + break; + } + // Send status of transfer in CSW packet + udi_msc_csw_process(); + return true; +} + + +static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n, + udd_ep_id_t ep) +{ + UNUSED(ep); + UNUSED(n); + // Update variable to signal the end of transfer + udi_msc_b_abort_trans = (UDD_EP_TRANSFER_OK != status) ? true : false; + udi_msc_b_ack_trans = true; +} + + +bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, + void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)) +{ + if (!udi_msc_b_ack_trans) + return false; // No possible, transfer on going + + // Start transfer Internal RAM<->USB line + udi_msc_b_ack_trans = false; + if (!udd_ep_run((b_read) ? UDI_MSC_EP_IN : UDI_MSC_EP_OUT, + false, + block, + block_size, + (NULL == callback) ? udi_msc_trans_ack : + callback)) { + udi_msc_b_ack_trans = true; + return false; + } + if (NULL == callback) { + while (!udi_msc_b_ack_trans); + if (udi_msc_b_abort_trans) { + return false; + } + udi_msc_csw.dCSWDataResidue -= block_size; + return (!udi_msc_b_abort_trans); + } + udi_msc_csw.dCSWDataResidue -= block_size; + return true; +} + +//@} + +#endif // SDSUPPORT + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.h b/Marlin/src/HAL/DUE/usb/udi_msc.h new file mode 100644 index 00000000..730dbc8e --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/udi_msc.h @@ -0,0 +1,376 @@ +/** + * \file + * + * \brief USB Device Mass Storage Class (MSC) interface definitions. + * + * Copyright (c) 2009-2016 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_MSC_H_ +#define _UDI_MSC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_msc.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \addtogroup udi_msc_group_udc + * @{ + */ +//! Global structure which contains standard UDI interface for UDC +extern UDC_DESC_STORAGE udi_api_t udi_api_msc; +//@} + +/** + * \ingroup udi_msc_group + * \defgroup udi_msc_group USB interface descriptors + * + * The following structures provide predefined USB interface descriptors. + * It must be used to define the final USB descriptors. + */ +//@{ + +//! Interface descriptor structure for MSC +typedef struct { + usb_iface_desc_t iface; + usb_ep_desc_t ep_in; + usb_ep_desc_t ep_out; +} udi_msc_desc_t; + +//! By default no string associated to this interface +#ifndef UDI_MSC_STRING_ID +#define UDI_MSC_STRING_ID 0 +#endif + +//! MSC endpoints size for full speed +#define UDI_MSC_EPS_SIZE_FS 64 +//! MSC endpoints size for high speed +#define UDI_MSC_EPS_SIZE_HS 512 + +//! Content of MSC interface descriptor for all speeds +#define UDI_MSC_DESC \ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_MSC_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = MSC_CLASS,\ + .iface.bInterfaceSubClass = MSC_SUBCLASS_TRANSPARENT,\ + .iface.bInterfaceProtocol = MSC_PROTOCOL_BULK,\ + .iface.iInterface = UDI_MSC_STRING_ID,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bEndpointAddress = UDI_MSC_EP_IN,\ + .ep_in.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_in.bInterval = 0,\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bEndpointAddress = UDI_MSC_EP_OUT,\ + .ep_out.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_out.bInterval = 0, + +//! Content of MSC interface descriptor for full speed only +#define UDI_MSC_DESC_FS {\ + UDI_MSC_DESC \ + .ep_in.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ + .ep_out.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ + } + +//! Content of MSC interface descriptor for high speed only +#define UDI_MSC_DESC_HS {\ + UDI_MSC_DESC \ + .ep_in.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_HS),\ + .ep_out.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_HS),\ + } +//@} + + +/** + * \ingroup udi_group + * \defgroup udi_msc_group USB Device Interface (UDI) for Mass Storage Class (MSC) + * + * Common APIs used by high level application to use this USB class. + * + * These routines are used by memory to transfer its data + * to/from USB MSC endpoints. + * + * See \ref udi_msc_quickstart. + * @{ + */ + +/** + * \brief Process the background read/write commands + * + * Routine called by the main loop + */ +bool udi_msc_process_trans(void); + +/** + * \brief Transfers data to/from USB MSC endpoints + * + * + * \param b_read Memory to USB, if true + * \param block Buffer on Internal RAM to send or fill + * \param block_size Buffer size to send or fill + * \param callback Function to call at the end of transfer. + * If NULL then the routine exit when transfer is finish. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, + void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)); +//@} + +#ifdef __cplusplus +} +#endif + + +/** + * \page udi_msc_quickstart Quick start guide for USB device Mass Storage module (UDI MSC) + * + * This is the quick start guide for the \ref udi_msc_group + * "USB device interface MSC module (UDI MSC)" with step-by-step instructions on + * how to configure and use the modules in a selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section udi_msc_basic_use_case Basic use case + * In this basic use case, the "USB MSC (Single Interface Device)" module is used. + * The "USB MSC (Composite Device)" module usage is described in \ref udi_msc_use_cases + * "Advanced use cases". + * + * \section udi_msc_basic_use_case_setup Setup steps + * \subsection udi_msc_basic_use_case_setup_prereq Prerequisites + * \copydetails udc_basic_use_case_setup_prereq + * \subsection udi_msc_basic_use_case_setup_code Example code + * \copydetails udc_basic_use_case_setup_code + * \subsection udi_msc_basic_use_case_setup_flow Workflow + * \copydetails udc_basic_use_case_setup_flow + * + * \section udi_msc_basic_use_case_usage Usage steps + * + * \subsection udi_msc_basic_use_case_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' + #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() + extern bool my_callback_msc_enable(void); + #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() + extern void my_callback_msc_disable(void); + #include "udi_msc_conf.h" // At the end of conf_usb.h file +\endcode + * + * Add to application C-file: + * \code + static bool my_flag_autorize_msc_transfert = false; + bool my_callback_msc_enable(void) + { + my_flag_autorize_msc_transfert = true; + return true; + } + void my_callback_msc_disable(void) + { + my_flag_autorize_msc_transfert = false; + } + + void task(void) + { + udi_msc_process_trans(); + } +\endcode + * + * \subsection udi_msc_basic_use_case_setup_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following configuration, + * which is the USB device MSC configuration: + * - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC \endcode + * \note The USB serial number is mandatory when a MSC interface is used. + * - \code //! Vendor name and Product version of MSC interface + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' \endcode + * \note The USB MSC interface requires a vendor ID (8 ASCII characters) + * and a product version (4 ASCII characters). + * - \code #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() + extern bool my_callback_msc_enable(void); \endcode + * \note After the device enumeration (detecting and identifying USB devices), + * the USB host starts the device configuration. When the USB MSC interface + * from the device is accepted by the host, the USB host enables this interface and the + * UDI_MSC_ENABLE_EXT() callback function is called and return true. + * Thus, when this event is received, the tasks which call + * udi_msc_process_trans() must be enabled. + * - \code #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() + extern void my_callback_msc_disable(void); \endcode + * \note When the USB device is unplugged or is reset by the USB host, the USB + * interface is disabled and the UDI_MSC_DISABLE_EXT() callback function + * is called. Thus, it is recommended to disable the task which is called udi_msc_process_trans(). + * -# The MSC is automatically linked with memory control access component + * which provides the memories interfaces. However, the memory data transfers + * must be done outside USB interrupt routine. This is done in the MSC process + * ("udi_msc_process_trans()") called by main loop: + * - \code * void task(void) { + udi_msc_process_trans(); + } \endcode + * -# The MSC speed depends on task periodicity. To get the best speed + * the notification callback "UDI_MSC_NOTIFY_TRANS_EXT" can be used to wakeup + * this task (Example, through a mutex): + * - \code #define UDI_MSC_NOTIFY_TRANS_EXT() msc_notify_trans() + void msc_notify_trans(void) { + wakeup_my_task(); + } \endcode + * + * \section udi_msc_use_cases Advanced use cases + * For more advanced use of the UDI MSC module, see the following use cases: + * - \subpage udi_msc_use_case_composite + * - \subpage udc_use_case_1 + * - \subpage udc_use_case_2 + * - \subpage udc_use_case_3 + * - \subpage udc_use_case_5 + * - \subpage udc_use_case_6 + */ + +/** + * \page udi_msc_use_case_composite MSC in a composite device + * + * A USB Composite Device is a USB Device which uses more than one USB class. + * In this use case, the "USB MSC (Composite Device)" module is used to + * create a USB composite device. Thus, this USB module can be associated with + * 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 + * For the setup code of this use case to work, the + * \ref udi_msc_basic_use_case "basic use case" must be followed. + * + * \section udi_msc_use_case_composite_usage Usage steps + * + * \subsection udi_msc_use_case_composite_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+1) + #define USB_DEVICE_MAX_EP (X+2) + + #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) + #define UDI_MSC_IFACE_NUMBER X + + #define UDI_COMPOSITE_DESC_T \ + udi_msc_desc_t udi_msc; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_msc = UDI_MSC_DESC, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_msc = UDI_MSC_DESC, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_msc, \ + ... +\endcode + * + * \subsection udi_msc_use_case_composite_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB composite device configuration: + * - \code // Endpoint control size, This must be: + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 1 for MSC. + #define USB_DEVICE_NB_INTERFACE (X+1) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 2 for MSC. + #define USB_DEVICE_MAX_EP (X+2) \endcode + * -# Ensure that conf_usb.h contains the description of + * composite device: + * - \code // The endpoint numbers chosen by you for the MSC. + // The endpoint numbers starting from 1. + #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) + // The interface index of an interface starting from 0 + #define UDI_MSC_IFACE_NUMBER X \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB composite device configuration: + * - \code // USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + ... + udi_msc_desc_t udi_msc; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_msc = UDI_MSC_DESC_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_msc = UDI_MSC_DESC_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_msc, \ + ... \endcode + * - \note The descriptors order given in the four lists above must be the + * same as the order defined by all interface indexes. The interface index + * orders are defined through UDI_X_IFACE_NUMBER defines. + */ + +#endif // _UDI_MSC_H_ diff --git a/Marlin/src/HAL/DUE/usb/uotghs_device_due.c b/Marlin/src/HAL/DUE/usb/uotghs_device_due.c new file mode 100644 index 00000000..e13232a3 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/uotghs_device_due.c @@ -0,0 +1,2074 @@ +/** + * \file + * + * \brief USB Device Driver for UOTGHS. Compliant with common UDD driver. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +/* + * Support and FAQ: visit Atmel Support + */ + +#ifdef ARDUINO_ARCH_SAM + +#include "compiler.h" +#include "uotghs_device_due.h" + +#include "conf_usb.h" +#include "sysclk.h" +#include "udd.h" +#include "uotghs_otg.h" +#include + +#ifndef UDD_NO_SLEEP_MGR +# include "sleep.h" +# include "sleepmgr.h" +#endif + +#if !(SAM3XA) +# error The current UOTGHS Device Driver supports only SAM3X and SAM3A. +#endif +#ifndef UDD_USB_INT_FUN +# define UDD_USB_INT_FUN UOTGHS_Handler +#endif + +#ifndef UDD_USB_INT_LEVEL +# define UDD_USB_INT_LEVEL 5 // By default USB interrupt have low priority +#endif + +#define UDD_EP_USED(ep) (USB_DEVICE_MAX_EP >= ep) + +#if ( (UDD_EP_USED( 1) && Is_udd_endpoint_dma_supported( 1)) \ + ||(UDD_EP_USED( 2) && Is_udd_endpoint_dma_supported( 2)) \ + ||(UDD_EP_USED( 3) && Is_udd_endpoint_dma_supported( 3)) \ + ||(UDD_EP_USED( 4) && Is_udd_endpoint_dma_supported( 4)) \ + ||(UDD_EP_USED( 5) && Is_udd_endpoint_dma_supported( 5)) \ + ||(UDD_EP_USED( 6) && Is_udd_endpoint_dma_supported( 6)) \ + ||(UDD_EP_USED( 7) && Is_udd_endpoint_dma_supported( 7)) \ + ||(UDD_EP_USED( 8) && Is_udd_endpoint_dma_supported( 8)) \ + ||(UDD_EP_USED( 9) && Is_udd_endpoint_dma_supported( 9)) \ + ||(UDD_EP_USED(10) && Is_udd_endpoint_dma_supported(10)) \ + ||(UDD_EP_USED(11) && Is_udd_endpoint_dma_supported(11)) \ + ||(UDD_EP_USED(12) && Is_udd_endpoint_dma_supported(12)) \ + ||(UDD_EP_USED(13) && Is_udd_endpoint_dma_supported(13)) \ + ||(UDD_EP_USED(14) && Is_udd_endpoint_dma_supported(14)) \ + ||(UDD_EP_USED(15) && Is_udd_endpoint_dma_supported(15)) \ + ) +# define UDD_EP_DMA_SUPPORTED +#endif + +#if ( (UDD_EP_USED( 1) && !Is_udd_endpoint_dma_supported( 1)) \ + ||(UDD_EP_USED( 2) && !Is_udd_endpoint_dma_supported( 2)) \ + ||(UDD_EP_USED( 3) && !Is_udd_endpoint_dma_supported( 3)) \ + ||(UDD_EP_USED( 4) && !Is_udd_endpoint_dma_supported( 4)) \ + ||(UDD_EP_USED( 5) && !Is_udd_endpoint_dma_supported( 5)) \ + ||(UDD_EP_USED( 6) && !Is_udd_endpoint_dma_supported( 6)) \ + ||(UDD_EP_USED( 7) && !Is_udd_endpoint_dma_supported( 7)) \ + ||(UDD_EP_USED( 8) && !Is_udd_endpoint_dma_supported( 8)) \ + ||(UDD_EP_USED( 9) && !Is_udd_endpoint_dma_supported( 9)) \ + ||(UDD_EP_USED(10) && !Is_udd_endpoint_dma_supported(10)) \ + ||(UDD_EP_USED(11) && !Is_udd_endpoint_dma_supported(11)) \ + ||(UDD_EP_USED(12) && !Is_udd_endpoint_dma_supported(12)) \ + ||(UDD_EP_USED(13) && !Is_udd_endpoint_dma_supported(13)) \ + ||(UDD_EP_USED(14) && !Is_udd_endpoint_dma_supported(14)) \ + ||(UDD_EP_USED(15) && !Is_udd_endpoint_dma_supported(15)) \ + ) +# define UDD_EP_FIFO_SUPPORTED +#endif + +// for debug text +//#define dbg_print printf +#define dbg_print(...) + +/** + * \ingroup udd_group + * \defgroup udd_udphs_group USB On-The-Go High-Speed Port for device mode (UOTGHS) + * + * \section UOTGHS_CONF UOTGHS Custom configuration + * The following UOTGHS driver configuration must be included in the conf_usb.h + * file of the application. + * + * UDD_USB_INT_LEVEL
+ * Option to change the interrupt priority (0 to 15) by default 5 (recommended). + * + * UDD_USB_INT_FUN
+ * Option to fit interrupt function to what defined in exception table. + * + * UDD_ISOCHRONOUS_NB_BANK(ep)
+ * Feature to reduce or increase isochronous endpoints buffering (1 to 3). + * Default value 2. + * + * UDD_BULK_NB_BANK(ep)
+ * Feature to reduce or increase bulk endpoints buffering (1 to 2). + * Default value 2. + * + * UDD_INTERRUPT_NB_BANK(ep)
+ * Feature to reduce or increase interrupt endpoints buffering (1 to 2). + * Default value 1. + * + * \section Callbacks management + * The USB driver is fully managed by interrupt and does not request periodique + * task. Thereby, the USB events use callbacks to transfer the information. + * The callbacks are declared in static during compilation or in variable during + * code execution. + * + * Static declarations defined in conf_usb.h: + * - UDC_VBUS_EVENT(bool b_present)
+ * To signal Vbus level change + * - UDC_SUSPEND_EVENT()
+ * Called when USB bus enter in suspend mode + * - UDC_RESUME_EVENT()
+ * Called when USB bus is wakeup + * - UDC_SOF_EVENT()
+ * Called for each received SOF, Note: Each 1ms in HS/FS mode only. + * + * Dynamic callbacks, called "endpoint job" , are registered + * in udd_ep_job_t structure via the following functions: + * - udd_ep_run()
+ * To call it when a transfer is finish + * - udd_ep_wait_stall_clear()
+ * To call it when a endpoint halt is disabled + * + * \section Power mode management + * The Sleep modes authorized : + * - in USB IDLE state, the UOTGHS needs of USB clock and authorizes up to sleep mode WFI. + * - in USB SUSPEND state, the UOTGHS no needs USB clock and authorizes up to sleep mode WAIT. + * @{ + */ + +// Check USB Device configuration +#ifndef USB_DEVICE_EP_CTRL_SIZE +# error USB_DEVICE_EP_CTRL_SIZE not defined +#endif +#ifndef USB_DEVICE_MAX_EP +# error USB_DEVICE_MAX_EP not defined +#endif + +// Note: USB_DEVICE_MAX_EP does not include control endpoint +#if USB_DEVICE_MAX_EP > (UDD_MAX_PEP_NB-1) +# error USB_DEVICE_MAX_EP is too high and not supported by this part +#endif + +#define UDD_EP_ISO_NBANK_ERROR(ep) \ + ( (UDD_ISOCHRONOUS_NB_BANK(ep) < 1) \ + || (UDD_ISOCHRONOUS_NB_BANK(ep) > 3) ) +#define UDD_EP_BULK_NBANK_ERROR(ep) \ + ( (UDD_BULK_NB_BANK(ep) < 1) || (UDD_BULK_NB_BANK(ep) > 2) ) +#define UDD_EP_INT_NBANK_ERROR(ep) \ + ( (UDD_INTERRUPT_NB_BANK(ep) < 1) || (UDD_INTERRUPT_NB_BANK(ep) > 2) ) + +#define UDD_EP_ISO_NB_BANK_ERROR(ep) \ + (UDD_EP_USED(ep) && UDD_EP_ISO_NBANK_ERROR(ep)) +#define UDD_EP_BULK_NB_BANK_ERROR(ep) \ + (UDD_EP_USED(ep) && UDD_EP_ISO_NBANK_ERROR(ep)) +#define UDD_EP_INT_NB_BANK_ERROR(ep) \ + (UDD_EP_USED(ep) && UDD_EP_ISO_NBANK_ERROR(ep)) + +#define UDD_EP_NB_BANK_ERROR(ep, type) \ + (ATPASTE3(UDD_EP_, type, _NB_BANK_ERROR(ep))) + +#define UDD_ISO_NB_BANK_ERROR \ + ( UDD_EP_NB_BANK_ERROR( 1, ISO) \ + || UDD_EP_NB_BANK_ERROR( 2, ISO) \ + || UDD_EP_NB_BANK_ERROR( 3, ISO) \ + || UDD_EP_NB_BANK_ERROR( 4, ISO) \ + || UDD_EP_NB_BANK_ERROR( 5, ISO) \ + || UDD_EP_NB_BANK_ERROR( 6, ISO) \ + || UDD_EP_NB_BANK_ERROR( 7, ISO) \ + || UDD_EP_NB_BANK_ERROR( 8, ISO) \ + || UDD_EP_NB_BANK_ERROR( 9, ISO) \ + || UDD_EP_NB_BANK_ERROR(10, ISO) \ + || UDD_EP_NB_BANK_ERROR(11, ISO) \ + || UDD_EP_NB_BANK_ERROR(12, ISO) \ + || UDD_EP_NB_BANK_ERROR(13, ISO) \ + || UDD_EP_NB_BANK_ERROR(14, ISO) \ + || UDD_EP_NB_BANK_ERROR(15, ISO) ) +#define UDD_BULK_NB_BANK_ERROR \ + ( UDD_EP_NB_BANK_ERROR( 1, BULK) \ + || UDD_EP_NB_BANK_ERROR( 2, BULK) \ + || UDD_EP_NB_BANK_ERROR( 3, BULK) \ + || UDD_EP_NB_BANK_ERROR( 4, BULK) \ + || UDD_EP_NB_BANK_ERROR( 5, BULK) \ + || UDD_EP_NB_BANK_ERROR( 6, BULK) \ + || UDD_EP_NB_BANK_ERROR( 7, BULK) \ + || UDD_EP_NB_BANK_ERROR( 8, BULK) \ + || UDD_EP_NB_BANK_ERROR( 9, BULK) \ + || UDD_EP_NB_BANK_ERROR(10, BULK) \ + || UDD_EP_NB_BANK_ERROR(11, BULK) \ + || UDD_EP_NB_BANK_ERROR(12, BULK) \ + || UDD_EP_NB_BANK_ERROR(13, BULK) \ + || UDD_EP_NB_BANK_ERROR(14, BULK) \ + || UDD_EP_NB_BANK_ERROR(15, BULK) ) +#define UDD_INTERRUPT_NB_BANK_ERROR \ + ( UDD_EP_NB_BANK_ERROR( 1, INT) \ + || UDD_EP_NB_BANK_ERROR( 2, INT) \ + || UDD_EP_NB_BANK_ERROR( 3, INT) \ + || UDD_EP_NB_BANK_ERROR( 4, INT) \ + || UDD_EP_NB_BANK_ERROR( 5, INT) \ + || UDD_EP_NB_BANK_ERROR( 6, INT) \ + || UDD_EP_NB_BANK_ERROR( 7, INT) \ + || UDD_EP_NB_BANK_ERROR( 8, INT) \ + || UDD_EP_NB_BANK_ERROR( 9, INT) \ + || UDD_EP_NB_BANK_ERROR(10, INT) \ + || UDD_EP_NB_BANK_ERROR(11, INT) \ + || UDD_EP_NB_BANK_ERROR(12, INT) \ + || UDD_EP_NB_BANK_ERROR(13, INT) \ + || UDD_EP_NB_BANK_ERROR(14, INT) \ + || UDD_EP_NB_BANK_ERROR(15, INT) ) + +#ifndef UDD_ISOCHRONOUS_NB_BANK +# define UDD_ISOCHRONOUS_NB_BANK(ep) 2 +#else +# if UDD_ISO_NB_BANK_ERROR +# error UDD_ISOCHRONOUS_NB_BANK(ep) must be define within 1 to 3. +# endif +#endif + +#ifndef UDD_BULK_NB_BANK +# define UDD_BULK_NB_BANK(ep) 2 +#else +# if UDD_BULK_NB_BANK_ERROR +# error UDD_BULK_NB_BANK must be define with 1 or 2. +# endif +#endif + +#ifndef UDD_INTERRUPT_NB_BANK +# define UDD_INTERRUPT_NB_BANK(ep) 1 +#else +# if UDD_INTERRUPT_NB_BANK_ERROR +# error UDD_INTERRUPT_NB_BANK must be define with 1 or 2. +# endif +#endif + + +/** + * \name Power management routine. + */ +//@{ + +#ifndef UDD_NO_SLEEP_MGR + +//! Definition of sleep levels +#define UOTGHS_SLEEP_MODE_USB_SUSPEND SLEEPMGR_WAIT_FAST +#define UOTGHS_SLEEP_MODE_USB_IDLE SLEEPMGR_SLEEP_WFI + +//! State of USB line +static bool udd_b_idle; +//! State of sleep manager +static bool udd_b_sleep_initialized = false; + + +/*! \brief Authorize or not the CPU powerdown mode + * + * \param b_enable true to authorize idle mode + */ +static void udd_sleep_mode(bool b_idle) +{ + if (!b_idle && udd_b_idle) { + dbg_print("_S "); + sleepmgr_unlock_mode(UOTGHS_SLEEP_MODE_USB_IDLE); + } + if (b_idle && !udd_b_idle) { + dbg_print("_W "); + sleepmgr_lock_mode(UOTGHS_SLEEP_MODE_USB_IDLE); + } + udd_b_idle = b_idle; +} +#else + +static void udd_sleep_mode(bool b_idle) +{ + b_idle = b_idle; +} + +#endif // UDD_NO_SLEEP_MGR + +//@} + + +/** + * \name Control endpoint low level management routine. + * + * This function performs control endpoint mangement. + * It handle the SETUP/DATA/HANDSHAKE phases of a control transaction. + */ +//@{ + +//! Global variable to give and record information about setup request management +COMPILER_WORD_ALIGNED udd_ctrl_request_t udd_g_ctrlreq; + +//! Bit definitions about endpoint control state machine for udd_ep_control_state +typedef enum { + UDD_EPCTRL_SETUP = 0, //!< Wait a SETUP packet + UDD_EPCTRL_DATA_OUT = 1, //!< Wait a OUT data packet + UDD_EPCTRL_DATA_IN = 2, //!< Wait a IN data packet + UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP = 3, //!< Wait a IN ZLP packet + UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP = 4, //!< Wait a OUT ZLP packet + UDD_EPCTRL_STALL_REQ = 5, //!< STALL enabled on IN & OUT packet +} udd_ctrl_ep_state_t; + +//! State of the endpoint control management +static udd_ctrl_ep_state_t udd_ep_control_state; + +//! Total number of data received/sent during data packet phase with previous payload buffers +static uint16_t udd_ctrl_prev_payload_buf_cnt; + +//! Number of data received/sent to/from udd_g_ctrlreq.payload buffer +static uint16_t udd_ctrl_payload_buf_cnt; + +/** + * \brief Reset control endpoint + * + * Called after a USB line reset or when UDD is enabled + */ +static void udd_reset_ep_ctrl(void); + +/** + * \brief Reset control endpoint management + * + * Called after a USB line reset or at the end of SETUP request (after ZLP) + */ +static void udd_ctrl_init(void); + +//! \brief Managed reception of SETUP packet on control endpoint +static void udd_ctrl_setup_received(void); + +//! \brief Managed reception of IN packet on control endpoint +static void udd_ctrl_in_sent(void); + +//! \brief Managed reception of OUT packet on control endpoint +static void udd_ctrl_out_received(void); + +//! \brief Managed underflow event of IN packet on control endpoint +static void udd_ctrl_underflow(void); + +//! \brief Managed overflow event of OUT packet on control endpoint +static void udd_ctrl_overflow(void); + +//! \brief Managed stall event of IN/OUT packet on control endpoint +static void udd_ctrl_stall_data(void); + +//! \brief Send a ZLP IN on control endpoint +static void udd_ctrl_send_zlp_in(void); + +//! \brief Send a ZLP OUT on control endpoint +static void udd_ctrl_send_zlp_out(void); + +//! \brief Call callback associated to setup request +static void udd_ctrl_endofrequest(void); + + +/** + * \brief Main interrupt routine for control endpoint + * + * This switchs control endpoint events to correct sub function. + * + * \return \c 1 if an event about control endpoint is occured, otherwise \c 0. + */ +static bool udd_ctrl_interrupt(void); + +//@} + + +/** + * \name Management of bulk/interrupt/isochronous endpoints + * + * The UDD manages the data transfer on endpoints: + * - Start data tranfer on endpoint with USB Device DMA + * - Send a ZLP packet if requested + * - Call callback registered to signal end of transfer + * The transfer abort and stall feature are supported. + */ +//@{ +#if (0!=USB_DEVICE_MAX_EP) + +//! Structure definition about job registered on an endpoint +typedef struct { + union { + //! Callback to call at the end of transfer + udd_callback_trans_t call_trans; + + //! Callback to call when the endpoint halt is cleared + udd_callback_halt_cleared_t call_nohalt; + }; + //! Buffer located in internal RAM to send or fill during job + uint8_t *buf; + //! Size of buffer to send or fill + iram_size_t buf_size; + //!< Size of data transfered + iram_size_t buf_cnt; + //!< Size of data loaded (or prepared for DMA) last time + iram_size_t buf_load; + //! A job is registered on this endpoint + uint8_t busy:1; + //! A short packet is requested for this job on endpoint IN + uint8_t b_shortpacket:1; + //! A stall has been requested but not executed + uint8_t stall_requested:1; +} udd_ep_job_t; + + +//! Array to register a job on bulk/interrupt/isochronous endpoint +static udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP]; + +//! \brief Reset all job table +static void udd_ep_job_table_reset(void); + +//! \brief Abort all endpoint jobs on going +static void udd_ep_job_table_kill(void); + +#ifdef UDD_EP_FIFO_SUPPORTED + /** + * \brief Fill banks and send them + * + * \param ep endpoint number of job to abort + */ + static void udd_ep_in_sent(udd_ep_id_t ep); + + /** + * \brief Store received banks + * + * \param ep endpoint number of job to abort + */ + static void udd_ep_out_received(udd_ep_id_t ep); +#endif + +/** + * \brief Abort endpoint job on going + * + * \param ep endpoint number of job to abort + */ +static void udd_ep_abort_job(udd_ep_id_t ep); + +/** + * \brief Call the callback associated to the job which is finished + * + * \param ptr_job job to complete + * \param b_abort if true then the job has been aborted + */ +static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_num); + +#ifdef UDD_EP_DMA_SUPPORTED + /** + * \brief Start the next transfer if necessary or complet the job associated. + * + * \param ep endpoint number without direction flag + */ + static void udd_ep_trans_done(udd_ep_id_t ep); +#endif + +/** + * \brief Main interrupt routine for bulk/interrupt/isochronous endpoints + * + * This switchs endpoint events to correct sub function. + * + * \return \c 1 if an event about bulk/interrupt/isochronous endpoints has occured, otherwise \c 0. + */ +static bool udd_ep_interrupt(void); + +#endif // (0!=USB_DEVICE_MAX_EP) +//@} + + +// ------------------------ +//--- INTERNAL ROUTINES TO MANAGED GLOBAL EVENTS + +/** + * \internal + * \brief Function called by UOTGHS interrupt to manage USB Device interrupts + * + * USB Device interrupt events are splited in three parts: + * - USB line events (SOF, reset, suspend, resume, wakeup) + * - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall) + * - bulk/interrupt/isochronous endpoints events (end of data transfer) + * + * Note: + * Here, the global interrupt mask is not clear when an USB interrupt is enabled + * because this one can not be occured during the USB ISR (=during INTX is masked). + * See Technical reference $3.8.3 Masking interrupt requests in peripheral modules. + */ +#ifdef UHD_ENABLE +void udd_interrupt(void); +void udd_interrupt(void) +#else +ISR(UDD_USB_INT_FUN) +#endif +{ + /* For fast wakeup clocks restore + * In WAIT mode, clocks are switched to FASTRC. + * After wakeup clocks should be restored, before that ISR should not + * be served. + */ + if (!pmc_is_wakeup_clocks_restored() && !Is_udd_suspend()) { + cpu_irq_disable(); + return; + } + + if (Is_udd_sof()) { + udd_ack_sof(); + if (Is_udd_full_speed_mode()) { + udc_sof_notify(); + } +#ifdef UDC_SOF_EVENT + UDC_SOF_EVENT(); +#endif + goto udd_interrupt_sof_end; + } + + if (Is_udd_msof()) { + udd_ack_msof(); + udc_sof_notify(); + goto udd_interrupt_sof_end; + } + + dbg_print("%c ", udd_is_high_speed() ? 'H' : 'F'); + + if (udd_ctrl_interrupt()) { + goto udd_interrupt_end; // Interrupt acked by control endpoint managed + } + +#if (0 != USB_DEVICE_MAX_EP) + if (udd_ep_interrupt()) { + goto udd_interrupt_end; // Interrupt acked by bulk/interrupt/isochronous endpoint managed + } +#endif + + // USB bus reset detection + if (Is_udd_reset()) { + udd_ack_reset(); + dbg_print("RST "); + // Abort all jobs on-going +#if (USB_DEVICE_MAX_EP != 0) + udd_ep_job_table_kill(); +#endif + // Reset USB Device Stack Core + udc_reset(); + // Reset endpoint control + udd_reset_ep_ctrl(); + // Reset endpoint control management + udd_ctrl_init(); + goto udd_interrupt_end; + } + + if (Is_udd_suspend_interrupt_enabled() && Is_udd_suspend()) { + otg_unfreeze_clock(); + // The suspend interrupt is automatic acked when a wakeup occur + udd_disable_suspend_interrupt(); + udd_enable_wake_up_interrupt(); + otg_freeze_clock(); // Mandatory to exit of sleep mode after a wakeup event + udd_sleep_mode(false); // Enter in SUSPEND mode +#ifdef UDC_SUSPEND_EVENT + UDC_SUSPEND_EVENT(); +#endif + goto udd_interrupt_end; + } + + if (Is_udd_wake_up_interrupt_enabled() && Is_udd_wake_up()) { + // Ack wakeup interrupt and enable suspend interrupt + otg_unfreeze_clock(); + // Check USB clock ready after suspend and eventually sleep USB clock + while (!Is_otg_clock_usable()) { + if (Is_udd_suspend()) { + break; // In case of USB state change in HS + } + }; + // The wakeup interrupt is automatic acked when a suspend occur + udd_disable_wake_up_interrupt(); + udd_enable_suspend_interrupt(); + udd_sleep_mode(true); // Enter in IDLE mode +#ifdef UDC_RESUME_EVENT + UDC_RESUME_EVENT(); +#endif + goto udd_interrupt_end; + } + + if (Is_otg_vbus_transition()) { + dbg_print("VBus "); + // Ack Vbus transition and send status to high level + otg_unfreeze_clock(); + otg_ack_vbus_transition(); + otg_freeze_clock(); +#ifndef USB_DEVICE_ATTACH_AUTO_DISABLE + if (Is_otg_vbus_high()) { + udd_attach(); + } else { + udd_detach(); + } +#endif +#ifdef UDC_VBUS_EVENT + UDC_VBUS_EVENT(Is_otg_vbus_high()); +#endif + goto udd_interrupt_end; + } +udd_interrupt_end: + dbg_print("\n\r"); +udd_interrupt_sof_end: + return; +} + + +bool udd_include_vbus_monitoring(void) +{ + return true; +} + + +void udd_enable(void) +{ + irqflags_t flags; + + flags = cpu_irq_save(); + +#ifdef UHD_ENABLE + // DUAL ROLE INITIALIZATION + if (otg_dual_enable()) { + // The current mode has been started by otg_dual_enable() + cpu_irq_restore(flags); + return; + } +#else + // SINGLE DEVICE MODE INITIALIZATION + pmc_enable_periph_clk(ID_UOTGHS); + sysclk_enable_usb(); + + // Here, only the device mode is possible, then link UOTGHS interrupt to UDD interrupt + NVIC_SetPriority((IRQn_Type) ID_UOTGHS, UDD_USB_INT_LEVEL); + NVIC_EnableIRQ((IRQn_Type) ID_UOTGHS); + + // Always authorize asynchrone USB interrupts to exit of sleep mode + // For SAM USB wake up device except BACKUP mode + pmc_set_fast_startup_input(PMC_FSMR_USBAL); +#endif + +#if (defined USB_ID_GPIO) && (defined UHD_ENABLE) + // Check that the device mode is selected by ID pin + if (!Is_otg_id_device()) { + cpu_irq_restore(flags); + return; // Device is not the current mode + } +#else + // ID pin not used then force device mode + otg_disable_id_pin(); + otg_force_device_mode(); +#endif + // Enable USB hardware + otg_enable_pad(); + otg_enable(); + + // Set the USB speed requested by configuration file +#ifdef USB_DEVICE_LOW_SPEED + udd_low_speed_enable(); +#else + udd_low_speed_disable(); +# ifdef USB_DEVICE_HS_SUPPORT + udd_high_speed_enable(); +# else + udd_high_speed_disable(); +# endif +#endif // USB_DEVICE_LOW_SPEED + + // Check USB clock + otg_unfreeze_clock(); + while (!Is_otg_clock_usable()); + + // Reset internal variables +#if (0!=USB_DEVICE_MAX_EP) + udd_ep_job_table_reset(); +#endif + + otg_ack_vbus_transition(); + // Force Vbus interrupt in case of Vbus always with a high level + // This is possible with a short timing between a Host mode stop/start. + if (Is_otg_vbus_high()) { + otg_raise_vbus_transition(); + } + otg_enable_vbus_interrupt(); + otg_freeze_clock(); + +#ifndef UDD_NO_SLEEP_MGR + if (!udd_b_sleep_initialized) { + udd_b_sleep_initialized = true; + // Initialize the sleep mode authorized for the USB suspend mode + udd_b_idle = false; + sleepmgr_lock_mode(UOTGHS_SLEEP_MODE_USB_SUSPEND); + } else { + udd_sleep_mode(false); // Enter idle mode + } +#endif + + cpu_irq_restore(flags); +} + + +void udd_disable(void) +{ + irqflags_t flags; + +#ifdef UHD_ENABLE +# ifdef USB_ID_GPIO + if (Is_otg_id_host()) { + // Freeze clock to switch mode + otg_freeze_clock(); + udd_detach(); + otg_disable(); + return; // Host mode running, ignore UDD disable + } +# else + if (Is_otg_host_mode_forced()) { + return; // Host mode running, ignore UDD disable + } +# endif +#endif + + flags = cpu_irq_save(); + otg_unfreeze_clock(); + udd_detach(); +#ifndef UDD_NO_SLEEP_MGR + if (udd_b_sleep_initialized) { + udd_b_sleep_initialized = false; + sleepmgr_unlock_mode(UOTGHS_SLEEP_MODE_USB_SUSPEND); + } +#endif + +#ifndef UHD_ENABLE + otg_disable(); + otg_disable_pad(); + sysclk_disable_usb(); + pmc_disable_periph_clk(ID_UOTGHS); + // Else the USB clock disable is done by UHC which manage USB dual role +#endif + cpu_irq_restore(flags); +} + + +void udd_attach(void) +{ + irqflags_t flags; + flags = cpu_irq_save(); + + // At startup the USB bus state is unknown, + // therefore the state is considered IDLE to not miss any USB event + udd_sleep_mode(true); + otg_unfreeze_clock(); + + // This section of clock check can be improved with a chek of + // USB clock source via sysclk() + // Check USB clock because the source can be a PLL + while (!Is_otg_clock_usable()); + + // Authorize attach if Vbus is present + udd_attach_device(); + + // Enable USB line events + udd_enable_reset_interrupt(); + udd_enable_suspend_interrupt(); + udd_enable_wake_up_interrupt(); + udd_enable_sof_interrupt(); +#ifdef USB_DEVICE_HS_SUPPORT + udd_enable_msof_interrupt(); +#endif + // Reset following interupts flag + udd_ack_reset(); + udd_ack_sof(); + udd_ack_msof(); + + // The first suspend interrupt must be forced + // The first suspend interrupt is not detected else raise it + udd_raise_suspend(); + + udd_ack_wake_up(); + otg_freeze_clock(); + cpu_irq_restore(flags); +} + + +void udd_detach(void) +{ + otg_unfreeze_clock(); + + // Detach device from the bus + udd_detach_device(); + otg_freeze_clock(); + udd_sleep_mode(false); +} + + +bool udd_is_high_speed(void) +{ +#ifdef USB_DEVICE_HS_SUPPORT + return !Is_udd_full_speed_mode(); +#else + return false; +#endif +} + + +void udd_set_address(uint8_t address) +{ + udd_disable_address(); + udd_configure_address(address); + udd_enable_address(); +} + + +uint8_t udd_getaddress(void) +{ + return udd_get_configured_address(); +} + + +uint16_t udd_get_frame_number(void) +{ + return udd_frame_number(); +} + +uint16_t udd_get_micro_frame_number(void) +{ + return udd_micro_frame_number(); +} + +void udd_send_remotewakeup(void) +{ +#ifndef UDD_NO_SLEEP_MGR + if (!udd_b_idle) +#endif + { + udd_sleep_mode(true); // Enter in IDLE mode + otg_unfreeze_clock(); + udd_initiate_remote_wake_up(); + } +} + + +void udd_set_setup_payload(uint8_t *payload, uint16_t payload_size) +{ + udd_g_ctrlreq.payload = payload; + udd_g_ctrlreq.payload_size = payload_size; +} + + +#if (0 != USB_DEVICE_MAX_EP) +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize) +{ + bool b_dir_in; + uint16_t ep_allocated; + uint8_t nb_bank, bank, i; + + b_dir_in = ep & USB_EP_DIR_IN; + ep = ep & USB_EP_ADDR_MASK; + + if (ep > USB_DEVICE_MAX_EP) { + return false; + } + if (Is_udd_endpoint_enabled(ep)) { + return false; + } + dbg_print("alloc(%x, %d) ", ep, MaxEndpointSize); + + // Bank choise + switch (bmAttributes & USB_EP_TYPE_MASK) { + case USB_EP_TYPE_ISOCHRONOUS: + nb_bank = UDD_ISOCHRONOUS_NB_BANK(ep); + break; + case USB_EP_TYPE_INTERRUPT: + nb_bank = UDD_INTERRUPT_NB_BANK(ep); + break; + case USB_EP_TYPE_BULK: + nb_bank = UDD_BULK_NB_BANK(ep); + break; + default: + Assert(false); + return false; + } + switch (nb_bank) { + case 1: + bank = UOTGHS_DEVEPTCFG_EPBK_1_BANK >> + UOTGHS_DEVEPTCFG_EPBK_Pos; + break; + case 2: + bank = UOTGHS_DEVEPTCFG_EPBK_2_BANK >> + UOTGHS_DEVEPTCFG_EPBK_Pos; + break; + case 3: + bank = UOTGHS_DEVEPTCFG_EPBK_3_BANK >> + UOTGHS_DEVEPTCFG_EPBK_Pos; + break; + default: + Assert(false); + return false; + } + + // Check if endpoint size is 8,16,32,64,128,256,512 or 1023 + Assert(MaxEndpointSize < 1024); + Assert((MaxEndpointSize == 1023) + || !(MaxEndpointSize & (MaxEndpointSize - 1))); + Assert(MaxEndpointSize >= 8); + + // Set configuration of new endpoint + udd_configure_endpoint(ep, bmAttributes, (b_dir_in ? 1 : 0), + MaxEndpointSize, bank); + ep_allocated = 1 << ep; + + // Unalloc endpoints superior + for (i = USB_DEVICE_MAX_EP; i > ep; i--) { + if (Is_udd_endpoint_enabled(i)) { + ep_allocated |= 1 << i; + udd_disable_endpoint(i); + udd_unallocate_memory(i); + } + } + + // Realloc/Enable endpoints + for (i = ep; i <= USB_DEVICE_MAX_EP; i++) { + if (ep_allocated & (1 << i)) { + udd_ep_job_t *ptr_job = &udd_ep_job[i - 1]; + bool b_restart = ptr_job->busy; + // Restart running job because + // memory window slides up and its data is lost + ptr_job->busy = false; + // Re-allocate memory + udd_allocate_memory(i); + udd_enable_endpoint(i); + if (!Is_udd_endpoint_configured(i)) { + dbg_print("ErrRealloc%d ", i); + if (NULL == ptr_job->call_trans) { + return false; + } + if (Is_udd_endpoint_in(i)) { + i |= USB_EP_DIR_IN; + } + ptr_job->call_trans(UDD_EP_TRANSFER_ABORT, + ptr_job->buf_cnt, i); + return false; + } + udd_enable_endpoint_bank_autoswitch(i); + if (b_restart) { + // Re-run the job remaining part +# ifdef UDD_EP_FIFO_SUPPORTED + if (!Is_udd_endpoint_dma_supported(i) + && !Is_udd_endpoint_in(i)) { + ptr_job->buf_cnt -= ptr_job->buf_load; + } +# else + ptr_job->buf_cnt -= ptr_job->buf_load; +# endif + b_restart = udd_ep_run(Is_udd_endpoint_in(i) ? + (i | USB_EP_DIR_IN) : i, + ptr_job->b_shortpacket, + &ptr_job->buf[ptr_job->buf_cnt], + ptr_job->buf_size + - ptr_job->buf_cnt, + ptr_job->call_trans); + if (!b_restart) { + dbg_print("ErrReRun%d ", i); + return false; + } + } + } + } + return true; +} + + +void udd_ep_free(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep_index) { + return; + } + udd_disable_endpoint(ep_index); + udd_unallocate_memory(ep_index); + udd_ep_abort_job(ep); + udd_ep_job[ep_index - 1].stall_requested = false; +} + + +bool udd_ep_is_halted(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + return Is_udd_endpoint_stall_requested(ep_index); +} + + +bool udd_ep_set_halt(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + udd_ep_job_t *ptr_job = &udd_ep_job[ep_index - 1]; + irqflags_t flags; + + if (USB_DEVICE_MAX_EP < ep_index) { + return false; + } + + if (Is_udd_endpoint_stall_requested(ep_index) // Endpoint stalled + || ptr_job->stall_requested) { // Endpoint stall is requested + return true; // Already STALL + } + + if (ptr_job->busy == true) { + return false; // Job on going, stall impossible + } + + flags = cpu_irq_save(); + if ((ep & USB_EP_DIR_IN) && (0 != udd_nb_busy_bank(ep_index))) { + // Delay the stall after the end of IN transfer on USB line + ptr_job->stall_requested = true; +#ifdef UDD_EP_FIFO_SUPPORTED + udd_disable_in_send_interrupt(ep_index); + udd_enable_endpoint_bank_autoswitch(ep_index); +#endif + udd_enable_bank_interrupt(ep_index); + udd_enable_endpoint_interrupt(ep_index); + cpu_irq_restore(flags); + return true; + } + // Stall endpoint immediately + udd_disable_endpoint_bank_autoswitch(ep_index); + udd_ack_stall(ep_index); + udd_enable_stall_handshake(ep_index); + cpu_irq_restore(flags); + return true; +} + + +bool udd_ep_clear_halt(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + udd_ep_job_t *ptr_job = &udd_ep_job[ep_index - 1]; + bool b_stall_cleared = false; + + if (USB_DEVICE_MAX_EP < ep_index) + return false; + + if (ptr_job->stall_requested) { + // Endpoint stall has been requested but not done + // Remove stall request + ptr_job->stall_requested = false; + udd_disable_bank_interrupt(ep_index); + udd_disable_endpoint_interrupt(ep_index); + b_stall_cleared = true; + } + if (Is_udd_endpoint_stall_requested(ep_index)) { + if (Is_udd_stall(ep_index)) { + udd_ack_stall(ep_index); + // A packet has been stalled + // then reset datatoggle + udd_reset_data_toggle(ep_index); + } + // Disable stall + udd_disable_stall_handshake(ep_index); + udd_enable_endpoint_bank_autoswitch(ep_index); + b_stall_cleared = true; + } + if (b_stall_cleared) { + // If a job is register on clear halt action + // then execute callback + if (ptr_job->busy == true) { + ptr_job->busy = false; + ptr_job->call_nohalt(); + } + } + return true; +} + + +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, + uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ +#ifdef UDD_EP_FIFO_SUPPORTED + bool b_dir_in = Is_udd_endpoint_in(ep & USB_EP_ADDR_MASK); +#endif + udd_ep_job_t *ptr_job; + irqflags_t flags; + + ep &= USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep) { + return false; + } + + // Get job about endpoint + ptr_job = &udd_ep_job[ep - 1]; + + if ((!Is_udd_endpoint_enabled(ep)) + || Is_udd_endpoint_stall_requested(ep) + || ptr_job->stall_requested) { + return false; // Endpoint is halted + } + + flags = cpu_irq_save(); + if (ptr_job->busy == true) { + cpu_irq_restore(flags); + return false; // Job already on going + } + ptr_job->busy = true; + cpu_irq_restore(flags); + + // No job running. Let's setup a new one. + ptr_job->buf = buf; + ptr_job->buf_size = buf_size; + ptr_job->buf_cnt = 0; + ptr_job->buf_load = 0; + ptr_job->call_trans = callback; + ptr_job->b_shortpacket = b_shortpacket || (buf_size == 0); + +#ifdef UDD_EP_FIFO_SUPPORTED + // No DMA support + if (!Is_udd_endpoint_dma_supported(ep)) { + dbg_print("ex%x.%c%d\n\r", ep, b_dir_in ? 'i':'o', buf_size); + flags = cpu_irq_save(); + udd_enable_endpoint_interrupt(ep); + if (b_dir_in) { + udd_disable_endpoint_bank_autoswitch(ep); + udd_enable_in_send_interrupt(ep); + } else { + udd_disable_endpoint_bank_autoswitch(ep); + udd_enable_out_received_interrupt(ep); + } + cpu_irq_restore(flags); + return true; + } +#endif // UDD_EP_FIFO_SUPPORTED + +#ifdef UDD_EP_DMA_SUPPORTED + // Request first DMA transfer + dbg_print("(exDMA%x) ", ep); + udd_ep_trans_done(ep); + return true; +#endif +} + + +void udd_ep_abort(udd_ep_id_t ep) +{ + uint8_t ep_index = ep & USB_EP_ADDR_MASK; + +#ifdef UDD_EP_FIFO_SUPPORTED + if (!Is_udd_endpoint_dma_supported(ep_index)) { + // Disable interrupts + udd_disable_endpoint_interrupt(ep_index); + udd_disable_out_received_interrupt(ep_index); + udd_disable_in_send_interrupt(ep_index); + } else +#endif + { + // Stop DMA transfer + udd_disable_endpoint_dma_interrupt(ep_index); + udd_endpoint_dma_set_control(ep_index, 0); + } + udd_disable_endpoint_interrupt(ep_index); + // Kill IN banks + if (ep & USB_EP_DIR_IN) { + while(udd_nb_busy_bank(ep_index)) { + udd_kill_last_in_bank(ep_index); + while(Is_udd_kill_last(ep_index)); + } + } + udd_ep_abort_job(ep); +} + + +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback) +{ + udd_ep_job_t *ptr_job; + + ep &= USB_EP_ADDR_MASK; + if (USB_DEVICE_MAX_EP < ep) { + return false; + } + + ptr_job = &udd_ep_job[ep - 1]; + + if (!Is_udd_endpoint_enabled(ep)) { + return false; // Endpoint not enabled + } + + // Wait clear halt endpoint + if (ptr_job->busy == true) { + return false; // Job already on going + } + + if (Is_udd_endpoint_stall_requested(ep) + || ptr_job->stall_requested) { + // Endpoint halted then registes the callback + ptr_job->busy = true; + ptr_job->call_nohalt = callback; + } else { + // endpoint not halted then call directly callback + callback(); + } + return true; +} +#endif // (0 != USB_DEVICE_MAX_EP) + + +#ifdef USB_DEVICE_HS_SUPPORT + +void udd_test_mode_j(void) +{ + udd_enable_hs_test_mode(); + udd_enable_hs_test_mode_j(); +} + + +void udd_test_mode_k(void) +{ + udd_enable_hs_test_mode(); + udd_enable_hs_test_mode_k(); +} + + +void udd_test_mode_se0_nak(void) +{ + udd_enable_hs_test_mode(); +} + + +void udd_test_mode_packet(void) +{ + uint8_t i; + uint8_t *ptr_dest; + const uint8_t *ptr_src; + + const uint8_t test_packet[] = { + // 00000000 * 9 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 01010101 * 8 + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + // 01110111 * 8 + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + // 0, {111111S * 15}, 111111 + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, + // S, 111111S, {0111111S * 7} + 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, + // 00111111, {S0111111 * 9}, S0 + 0xFC, 0x7E, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0x7E + }; + + // Reconfigure control endpoint to bulk IN endpoint + udd_disable_endpoint(0); + udd_configure_endpoint(0, USB_EP_TYPE_BULK, 1, + 64, UOTGHS_DEVEPTCFG_EPBK_1_BANK); + udd_allocate_memory(0); + udd_enable_endpoint(0); + + udd_enable_hs_test_mode(); + udd_enable_hs_test_mode_packet(); + + // Send packet on endpoint 0 + ptr_dest = (uint8_t *) & udd_get_endpoint_fifo_access(0, 8); + ptr_src = test_packet; + + for (i = 0; i < sizeof(test_packet); i++) { + *ptr_dest++ = *ptr_src++; + } + udd_ack_fifocon(0); +} +#endif // USB_DEVICE_HS_SUPPORT + + + +// ------------------------ +//--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT + +static void udd_reset_ep_ctrl(void) +{ + irqflags_t flags; + + // Reset USB address to 0 + udd_configure_address(0); + udd_enable_address(); + + // Alloc and configure control endpoint + udd_configure_endpoint(0, + USB_EP_TYPE_CONTROL, + 0, + USB_DEVICE_EP_CTRL_SIZE, + UOTGHS_DEVEPTCFG_EPBK_1_BANK); + + udd_allocate_memory(0); + udd_enable_endpoint(0); + flags = cpu_irq_save(); + udd_enable_setup_received_interrupt(0); + udd_enable_out_received_interrupt(0); + udd_enable_endpoint_interrupt(0); + cpu_irq_restore(flags); +} + +static void udd_ctrl_init(void) +{ + irqflags_t flags; + flags = cpu_irq_save(); + + // In case of abort of IN Data Phase: + // No need to abort IN transfer (rise TXINI), + // because it is automatically done by hardware when a Setup packet is received. + // But the interrupt must be disabled to don't generate interrupt TXINI + // after SETUP reception. + udd_disable_in_send_interrupt(0); + cpu_irq_restore(flags); + + // In case of OUT ZLP event is no processed before Setup event occurs + udd_ack_out_received(0); + + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + udd_g_ctrlreq.payload_size = 0; + udd_ep_control_state = UDD_EPCTRL_SETUP; +} + + +static void udd_ctrl_setup_received(void) +{ + irqflags_t flags; + uint8_t i; + + if (UDD_EPCTRL_SETUP != udd_ep_control_state) { + // May be a hidden DATA or ZLP phase or protocol abort + udd_ctrl_endofrequest(); + + // Reinitializes control endpoint management + udd_ctrl_init(); + } + // Fill setup request structure + if (8 != udd_byte_count(0)) { + udd_ctrl_stall_data(); + udd_ack_setup_received(0); + return; // Error data number doesn't correspond to SETUP packet + } + uint8_t *ptr = (uint8_t *) & udd_get_endpoint_fifo_access(0,8); + for (i = 0; i < 8; i++) { + ((uint8_t*) &udd_g_ctrlreq.req)[i] = *ptr++; + } + // Manage LSB/MSB to fit with CPU usage + udd_g_ctrlreq.req.wValue = le16_to_cpu(udd_g_ctrlreq.req.wValue); + udd_g_ctrlreq.req.wIndex = le16_to_cpu(udd_g_ctrlreq.req.wIndex); + udd_g_ctrlreq.req.wLength = le16_to_cpu(udd_g_ctrlreq.req.wLength); + + // Decode setup request + if (udc_process_setup() == false) { + // Setup request unknow then stall it + udd_ctrl_stall_data(); + udd_ack_setup_received(0); + return; + } + udd_ack_setup_received(0); + + if (Udd_setup_is_in()) { + // IN data phase requested + udd_ctrl_prev_payload_buf_cnt = 0; + udd_ctrl_payload_buf_cnt = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_IN; + udd_ctrl_in_sent(); // Send first data transfer + } else { + if (0 == udd_g_ctrlreq.req.wLength) { + // No data phase requested + // Send IN ZLP to ACK setup request + udd_ctrl_send_zlp_in(); + return; + } + // OUT data phase requested + udd_ctrl_prev_payload_buf_cnt = 0; + udd_ctrl_payload_buf_cnt = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_OUT; + // To detect a protocol error, enable nak interrupt on data IN phase + udd_ack_nak_in(0); + flags = cpu_irq_save(); + udd_enable_nak_in_interrupt(0); + cpu_irq_restore(flags); + } +} + + +static void udd_ctrl_in_sent(void) +{ + static bool b_shortpacket = false; + uint16_t nb_remain; + uint8_t i; + uint8_t *ptr_dest, *ptr_src; + irqflags_t flags; + + flags = cpu_irq_save(); + udd_disable_in_send_interrupt(0); + cpu_irq_restore(flags); + + if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + // ZLP on IN is sent, then valid end of setup request + udd_ctrl_endofrequest(); + // Reinitializes control endpoint management + udd_ctrl_init(); + return; + } + Assert(udd_ep_control_state == UDD_EPCTRL_DATA_IN); + + nb_remain = udd_g_ctrlreq.payload_size - udd_ctrl_payload_buf_cnt; + if (0 == nb_remain) { + // All content of current buffer payload are sent + // Update number of total data sending by previous playlaod buffer + udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt; + if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_buf_cnt) + || b_shortpacket) { + // All data requested are transfered or a short packet has been sent + // then it is the end of data phase. + // Generate an OUT ZLP for handshake phase. + udd_ctrl_send_zlp_out(); + return; + } + // Need of new buffer because the data phase is not complete + if ((!udd_g_ctrlreq.over_under_run) + || (!udd_g_ctrlreq.over_under_run())) { + // Underrun then send zlp on IN + // Here nb_remain=0 and allows to send a IN ZLP + } else { + // A new payload buffer is given + udd_ctrl_payload_buf_cnt = 0; + nb_remain = udd_g_ctrlreq.payload_size; + } + } + // Continue transfer and send next data + if (nb_remain >= USB_DEVICE_EP_CTRL_SIZE) { + nb_remain = USB_DEVICE_EP_CTRL_SIZE; + b_shortpacket = false; + } else { + b_shortpacket = true; + } + // Fill buffer of endpoint control + ptr_dest = (uint8_t *) & udd_get_endpoint_fifo_access(0, 8); + ptr_src = udd_g_ctrlreq.payload + udd_ctrl_payload_buf_cnt; + // Critical section + // Only in case of DATA IN phase abort without USB Reset signal after. + // The IN data don't must be written in endpoint 0 DPRAM during + // a next setup reception in same endpoint 0 DPRAM. + // Thereby, an OUT ZLP reception must check before IN data write + // and if no OUT ZLP is received the data must be written quickly (800µs) + // before an eventually ZLP OUT and SETUP reception + flags = cpu_irq_save(); + if (Is_udd_out_received(0)) { + // IN DATA phase aborted by OUT ZLP + cpu_irq_restore(flags); + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + return; // Exit of IN DATA phase + } + // Write quickly the IN data + for (i = 0; i < nb_remain; i++) { + *ptr_dest++ = *ptr_src++; + } + udd_ctrl_payload_buf_cnt += nb_remain; + + // Validate and send the data available in the control endpoint buffer + udd_ack_in_send(0); + udd_enable_in_send_interrupt(0); + // In case of abort of DATA IN phase, no need to enable nak OUT interrupt + // because OUT endpoint is already free and ZLP OUT accepted. + cpu_irq_restore(flags); +} + + +static void udd_ctrl_out_received(void) +{ + irqflags_t flags; + uint8_t i; + uint16_t nb_data; + + if (UDD_EPCTRL_DATA_OUT != udd_ep_control_state) { + if ((UDD_EPCTRL_DATA_IN == udd_ep_control_state) + || (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == + udd_ep_control_state)) { + // End of SETUP request: + // - Data IN Phase aborted, + // - or last Data IN Phase hidden by ZLP OUT sending quiclky, + // - or ZLP OUT received normaly. + udd_ctrl_endofrequest(); + } else { + // Protocol error during SETUP request + udd_ctrl_stall_data(); + } + // Reinitializes control endpoint management + udd_ctrl_init(); + return; + } + // Read data received during OUT phase + nb_data = udd_byte_count(0); + if (udd_g_ctrlreq.payload_size < (udd_ctrl_payload_buf_cnt + nb_data)) { + // Payload buffer too small + nb_data = udd_g_ctrlreq.payload_size - udd_ctrl_payload_buf_cnt; + } + uint8_t *ptr_src = (uint8_t *) & udd_get_endpoint_fifo_access(0, 8); + uint8_t *ptr_dest = udd_g_ctrlreq.payload + udd_ctrl_payload_buf_cnt; + for (i = 0; i < nb_data; i++) { + *ptr_dest++ = *ptr_src++; + } + udd_ctrl_payload_buf_cnt += nb_data; + + if ((USB_DEVICE_EP_CTRL_SIZE != nb_data) + || (udd_g_ctrlreq.req.wLength <= + (udd_ctrl_prev_payload_buf_cnt + + udd_ctrl_payload_buf_cnt))) { + // End of reception because it is a short packet + // Before send ZLP, call intermediat calback + // in case of data receiv generate a stall + udd_g_ctrlreq.payload_size = udd_ctrl_payload_buf_cnt; + if (NULL != udd_g_ctrlreq.over_under_run) { + if (!udd_g_ctrlreq.over_under_run()) { + // Stall ZLP + udd_ctrl_stall_data(); + // Ack reception of OUT to replace NAK by a STALL + udd_ack_out_received(0); + return; + } + } + // Send IN ZLP to ACK setup request + udd_ack_out_received(0); + udd_ctrl_send_zlp_in(); + return; + } + + if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_buf_cnt) { + // Overrun then request a new payload buffer + if (!udd_g_ctrlreq.over_under_run) { + // No callback availabled to request a new payload buffer + udd_ctrl_stall_data(); + // Ack reception of OUT to replace NAK by a STALL + udd_ack_out_received(0); + return; + } + if (!udd_g_ctrlreq.over_under_run()) { + // No new payload buffer delivered + udd_ctrl_stall_data(); + // Ack reception of OUT to replace NAK by a STALL + udd_ack_out_received(0); + return; + } + // New payload buffer available + // Update number of total data received + udd_ctrl_prev_payload_buf_cnt += udd_ctrl_payload_buf_cnt; + // Reinit reception on payload buffer + udd_ctrl_payload_buf_cnt = 0; + } + // Free buffer of control endpoint to authorize next reception + udd_ack_out_received(0); + // To detect a protocol error, enable nak interrupt on data IN phase + udd_ack_nak_in(0); + flags = cpu_irq_save(); + udd_enable_nak_in_interrupt(0); + cpu_irq_restore(flags); +} + + +static void udd_ctrl_underflow(void) +{ + if (Is_udd_out_received(0)) + return; // Underflow ignored if OUT data is received + + if (UDD_EPCTRL_DATA_OUT == udd_ep_control_state) { + // Host want to stop OUT transaction + // then stop to wait OUT data phase and wait IN ZLP handshake + udd_ctrl_send_zlp_in(); + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + // A OUT handshake is waiting by device, + // but host want extra IN data then stall extra IN data + udd_enable_stall_handshake(0); + } +} + + +static void udd_ctrl_overflow(void) +{ + if (Is_udd_in_send(0)) + return; // Overflow ignored if IN data is received + + // The case of UDD_EPCTRL_DATA_IN is not managed + // because the OUT endpoint is already free and OUT ZLP accepted + + if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + // A IN handshake is waiting by device, + // but host want extra OUT data then stall extra OUT data + udd_enable_stall_handshake(0); + } +} + + +static void udd_ctrl_stall_data(void) +{ + // Stall all packets on IN & OUT control endpoint + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + udd_enable_stall_handshake(0); +} + + +static void udd_ctrl_send_zlp_in(void) +{ + irqflags_t flags; + + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP; + + // Validate and send empty IN packet on control endpoint + flags = cpu_irq_save(); + // Send ZLP on IN endpoint + udd_ack_in_send(0); + udd_enable_in_send_interrupt(0); + // To detect a protocol error, enable nak interrupt on data OUT phase + udd_ack_nak_out(0); + udd_enable_nak_out_interrupt(0); + cpu_irq_restore(flags); +} + + +static void udd_ctrl_send_zlp_out(void) +{ + irqflags_t flags; + + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + // No action is necessary to accept OUT ZLP + // because the buffer of control endpoint is already free + + // To detect a protocol error, enable nak interrupt on data IN phase + flags = cpu_irq_save(); + udd_ack_nak_in(0); + udd_enable_nak_in_interrupt(0); + cpu_irq_restore(flags); +} + + +static void udd_ctrl_endofrequest(void) +{ + // If a callback is registered then call it + if (udd_g_ctrlreq.callback) { + udd_g_ctrlreq.callback(); + } +} + + +static bool udd_ctrl_interrupt(void) +{ + + if (!Is_udd_endpoint_interrupt(0)) { + return false; // No interrupt events on control endpoint + } + + dbg_print("0: "); + + // By default disable overflow and underflow interrupt + udd_disable_nak_in_interrupt(0); + udd_disable_nak_out_interrupt(0); + + // Search event on control endpoint + if (Is_udd_setup_received(0)) { + dbg_print("stup "); + // SETUP packet received + udd_ctrl_setup_received(); + return true; + } + if (Is_udd_in_send(0) && Is_udd_in_send_interrupt_enabled(0)) { + dbg_print("in "); + // IN packet sent + udd_ctrl_in_sent(); + return true; + } + if (Is_udd_out_received(0)) { + dbg_print("out "); + // OUT packet received + udd_ctrl_out_received(); + return true; + } + if (Is_udd_nak_out(0)) { + dbg_print("nako "); + // Overflow on OUT packet + udd_ack_nak_out(0); + udd_ctrl_overflow(); + return true; + } + if (Is_udd_nak_in(0)) { + dbg_print("naki "); + // Underflow on IN packet + udd_ack_nak_in(0); + udd_ctrl_underflow(); + return true; + } + dbg_print("n%x ", UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], 0)); + return false; +} + + +// ------------------------ +//--- INTERNAL ROUTINES TO MANAGED THE BULK/INTERRUPT/ISOCHRONOUS ENDPOINTS + +#if (0 != USB_DEVICE_MAX_EP) + +static void udd_ep_job_table_reset(void) +{ + uint8_t i; + for (i = 0; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_job[i].busy = false; + udd_ep_job[i].stall_requested = false; + } +} + + +static void udd_ep_job_table_kill(void) +{ + uint8_t i; + + // For each endpoint, kill job + for (i = 0; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_finish_job(&udd_ep_job[i], true, i + 1); + } +} + + +static void udd_ep_abort_job(udd_ep_id_t ep) +{ + ep &= USB_EP_ADDR_MASK; + + // Abort job on endpoint + udd_ep_finish_job(&udd_ep_job[ep - 1], true, ep); +} + + +static void udd_ep_finish_job(udd_ep_job_t * ptr_job, bool b_abort, uint8_t ep_num) +{ + if (ptr_job->busy == false) { + return; // No on-going job + } + dbg_print("(JobE%x:%d) ", (ptr_job-udd_ep_job)+1, b_abort); + ptr_job->busy = false; + if (NULL == ptr_job->call_trans) { + return; // No callback linked to job + } + if (Is_udd_endpoint_in(ep_num)) { + ep_num |= USB_EP_DIR_IN; + } + ptr_job->call_trans((b_abort) ? UDD_EP_TRANSFER_ABORT : + UDD_EP_TRANSFER_OK, ptr_job->buf_size, ep_num); +} + +#ifdef UDD_EP_DMA_SUPPORTED +static void udd_ep_trans_done(udd_ep_id_t ep) +{ + uint32_t udd_dma_ctrl = 0; + udd_ep_job_t *ptr_job; + iram_size_t next_trans; + irqflags_t flags; + + // Get job corresponding at endpoint + ptr_job = &udd_ep_job[ep - 1]; + + if (!ptr_job->busy) { + return; // No job is running, then ignore it (system error) + } + + if (ptr_job->buf_cnt != ptr_job->buf_size) { + // Need to send or receiv other data + next_trans = ptr_job->buf_size - ptr_job->buf_cnt; + + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + // The USB hardware support a maximum + // transfer size of UDD_ENDPOINT_MAX_TRANS Bytes + next_trans = UDD_ENDPOINT_MAX_TRANS; + + // Set 0 to tranfer the maximum + udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(0); + } else { + udd_dma_ctrl = UOTGHS_DEVDMACONTROL_BUFF_LENGTH(next_trans); + } + if (Is_udd_endpoint_in(ep)) { + if (0 != (next_trans % udd_get_endpoint_size(ep))) { + // Enable short packet option + // else the DMA transfer is accepted + // and interrupt DMA valid but nothing is sent. + udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_B_EN; + // No need to request another ZLP + ptr_job->b_shortpacket = false; + } + } else { + if ((USB_EP_TYPE_ISOCHRONOUS != udd_get_endpoint_type(ep)) + || (next_trans <= (iram_size_t) udd_get_endpoint_size(ep))) { + + // Enable short packet reception + udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_TR_IT + | UOTGHS_DEVDMACONTROL_END_TR_EN; + } + } + + // Start USB DMA to fill or read fifo of the selected endpoint + udd_endpoint_dma_set_addr(ep, (uint32_t) & ptr_job->buf[ptr_job->buf_cnt]); + udd_dma_ctrl |= UOTGHS_DEVDMACONTROL_END_BUFFIT | + UOTGHS_DEVDMACONTROL_CHANN_ENB; + + + // Disable IRQs to have a short sequence + // between read of EOT_STA and DMA enable + flags = cpu_irq_save(); + if (!(udd_endpoint_dma_get_status(ep) + & UOTGHS_DEVDMASTATUS_END_TR_ST)) { + dbg_print("dmaS%x ", ep); + udd_endpoint_dma_set_control(ep, udd_dma_ctrl); + ptr_job->buf_cnt += next_trans; + ptr_job->buf_load = next_trans; + udd_enable_endpoint_dma_interrupt(ep); + cpu_irq_restore(flags); + return; + } + cpu_irq_restore(flags); + + // Here a ZLP has been recieved + // and the DMA transfer must be not started. + // It is the end of transfer + ptr_job->buf_size = ptr_job->buf_cnt; + } + if (Is_udd_endpoint_in(ep)) { + if (ptr_job->b_shortpacket) { + dbg_print("zlpS%x ", ep); + // Need to send a ZLP (No possible with USB DMA) + // enable interrupt to wait a free bank to sent ZLP + udd_ack_in_send(ep); + if (Is_udd_write_enabled(ep)) { + // Force interrupt in case of ep already free + udd_raise_in_send(ep); + } + udd_enable_in_send_interrupt(ep); + udd_enable_endpoint_interrupt(ep); + return; + } + } + dbg_print("dmaE "); + // Call callback to signal end of transfer + udd_ep_finish_job(ptr_job, false, ep); +} +#endif + +#ifdef UDD_EP_FIFO_SUPPORTED +static void udd_ep_in_sent(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job = &udd_ep_job[ep - 1]; + uint8_t *ptr_src = &ptr_job->buf[ptr_job->buf_cnt]; + uint8_t *ptr_dst = (uint8_t *) & udd_get_endpoint_fifo_access(ep, 8); + uint32_t pkt_size = udd_get_endpoint_size(ep); + uint32_t nb_data = 0, i; + uint32_t nb_remain; + irqflags_t flags; + + // All transfer done, including ZLP, Finish Job + if (ptr_job->buf_cnt >= ptr_job->buf_size && !ptr_job->b_shortpacket) { + flags = cpu_irq_save(); + udd_disable_in_send_interrupt(ep); + udd_disable_endpoint_interrupt(ep); + cpu_irq_restore(flags); + + ptr_job->buf_size = ptr_job->buf_cnt; // buf_size is passed to callback as XFR count + udd_ep_finish_job(ptr_job, false, ep); + return; + } else { + // ACK TXINI + udd_ack_in_send(ep); + // Fill FIFO + ptr_dst = (uint8_t *) & udd_get_endpoint_fifo_access(ep, 8); + ptr_src = &ptr_job->buf[ptr_job->buf_cnt]; + nb_remain = ptr_job->buf_size - ptr_job->buf_cnt; + // Fill a bank even if no data (ZLP) + nb_data = min(nb_remain, pkt_size); + // Modify job information + ptr_job->buf_cnt += nb_data; + ptr_job->buf_load = nb_data; + + // Copy buffer to FIFO + for (i = 0; i < nb_data; i++) { + *ptr_dst++ = *ptr_src++; + } + // Switch to next bank + udd_ack_fifocon(ep); + // ZLP? + if (nb_data < pkt_size) { + ptr_job->b_shortpacket = false; + } + } +} + +static void udd_ep_out_received(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job = &udd_ep_job[ep - 1]; + uint32_t nb_data = 0, i; + uint32_t nb_remain = ptr_job->buf_size - ptr_job->buf_cnt; + uint32_t pkt_size = udd_get_endpoint_size(ep); + uint8_t *ptr_src = (uint8_t *) & udd_get_endpoint_fifo_access(ep, 8); + uint8_t *ptr_dst = &ptr_job->buf[ptr_job->buf_cnt]; + bool b_full = false, b_short = false; + + // Clear RX OUT + udd_ack_out_received(ep); + + // Read byte count + nb_data = udd_byte_count(ep); + if (nb_data < pkt_size) { + b_short = true; + } + //dbg_print("o%d ", ep); + //dbg_print("%d ", nb_data); + // Copy data if there is + if (nb_data > 0) { + if (nb_data >= nb_remain) { + nb_data = nb_remain; + b_full = true; + } + // Modify job information + ptr_job->buf_cnt += nb_data; + ptr_job->buf_load = nb_data; + // Copy FIFO to buffer + for (i = 0; i < nb_data; i++) { + *ptr_dst++ = *ptr_src++; + } + } + // Clear FIFO Status + udd_ack_fifocon(ep); + // Finish job on error or short packet + if (b_full || b_short) { + //dbg_print("EoO%d\n\r", ep); + udd_disable_out_received_interrupt(ep); + udd_disable_endpoint_interrupt(ep); + ptr_job->buf_size = ptr_job->buf_cnt; // buf_size is passed to callback as XFR count + udd_ep_finish_job(ptr_job, false, ep); + } +} +#endif // #ifdef UDD_EP_FIFO_SUPPORTED + +static bool udd_ep_interrupt(void) +{ + udd_ep_id_t ep; + udd_ep_job_t *ptr_job; + + // For each endpoint different of control endpoint (0) + for (ep = 1; ep <= USB_DEVICE_MAX_EP; ep++) { + // Get job corresponding at endpoint + ptr_job = &udd_ep_job[ep - 1]; + +#ifdef UDD_EP_DMA_SUPPORTED + // Check DMA event + if (Is_udd_endpoint_dma_interrupt_enabled(ep) + && Is_udd_endpoint_dma_interrupt(ep)) { + uint32_t nb_remaining; + if (udd_endpoint_dma_get_status(ep) + & UOTGHS_DEVDMASTATUS_CHANN_ENB) { + return true; // Ignore EOT_STA interrupt + } + dbg_print("dma%x: ", ep); + udd_disable_endpoint_dma_interrupt(ep); + // Save number of data no transfered + nb_remaining = (udd_endpoint_dma_get_status(ep) & + UOTGHS_DEVDMASTATUS_BUFF_COUNT_Msk) + >> UOTGHS_DEVDMASTATUS_BUFF_COUNT_Pos; + if (nb_remaining) { + // Transfer no complete (short packet or ZLP) then: + // Update number of data transfered + ptr_job->buf_cnt -= nb_remaining; + // Set transfer complete to stop the transfer + ptr_job->buf_size = ptr_job->buf_cnt; + } + udd_ep_trans_done(ep); + return true; + } +#endif +#ifdef UDD_EP_FIFO_SUPPORTED + // Check RXRDY and TXEMPTY event for none DMA endpoints + if (!Is_udd_endpoint_dma_supported(ep) + && Is_udd_endpoint_interrupt_enabled(ep)) { + dbg_print("ep%x: ", ep); + // RXOUT: Full packet received + if (Is_udd_out_received(ep) + && Is_udd_out_received_interrupt_enabled(ep)) { + dbg_print("Out "); + udd_ep_out_received(ep); + return true; + } + // TXIN: packet sent + if (Is_udd_in_send(ep) + && Is_udd_in_send_interrupt_enabled(ep)) { + dbg_print("In "); + udd_ep_in_sent(ep); + return true; + } + // Errors: Abort? + if (Is_udd_overflow(ep) + || Is_udd_underflow(ep) + || Is_udd_crc_error(ep)) { + dbg_print("Err "); + udd_ep_abort(ep); + return true; + } + } +#endif // UDD_EP_FIFO_SUPPORTED + // Check empty bank interrupt event + if (Is_udd_endpoint_interrupt_enabled(ep)) { + dbg_print("bg%x: ", ep); + if (Is_udd_in_send_interrupt_enabled(ep) + && Is_udd_in_send(ep)) { + dbg_print("I "); + udd_disable_in_send_interrupt(ep); + // One bank is free then send a ZLP + udd_ack_in_send(ep); + udd_ack_fifocon(ep); + udd_ep_finish_job(ptr_job, false, ep); + return true; + } + if (Is_udd_bank_interrupt_enabled(ep) + && (0 == udd_nb_busy_bank(ep))) { + dbg_print("EoT "); + // End of background transfer on IN endpoint + udd_disable_bank_interrupt(ep); + udd_disable_endpoint_interrupt(ep); + + Assert(ptr_job->stall_requested); + // A stall has been requested during backgound transfer + ptr_job->stall_requested = false; + udd_disable_endpoint_bank_autoswitch(ep); + udd_enable_stall_handshake(ep); + udd_reset_data_toggle(ep); + return true; + } + } + } + return false; +} +#endif // (0 != USB_DEVICE_MAX_EP) + +//@} + +#endif // 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 new file mode 100644 index 00000000..6df26d63 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/uotghs_device_due.h @@ -0,0 +1,664 @@ +/** + * \file + * + * \brief USB Device Driver for UOTGHS. Compliant with common UDD driver. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UOTGHS_DEVICE_DUE_H_INCLUDED +#define UOTGHS_DEVICE_DUE_H_INCLUDED + +//#include "compiler.h" + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +extern "C" { +#endif +/**INDENT-ON**/ +/// @endcond + +//! \ingroup udd_group +//! \defgroup udd_udphs_group USB On-The-Go High-Speed Port for device mode (UOTGHS) +//! UOTGHS low-level driver for USB device mode +//! +//! @{ + +#ifndef UOTGHS_DEVEPTCFG_EPDIR_Pos +// Bit pos is not defined in SAM header file but we need it. +# define UOTGHS_DEVEPTCFG_EPDIR_Pos 8 +#endif + +//! @name UOTGHS Device IP properties +//! These macros give access to IP properties +//! @{ + //! Get maximal number of endpoints +#define udd_get_endpoint_max_nbr() (9) +#define UDD_MAX_PEP_NB (udd_get_endpoint_max_nbr() + 1) + //! Get maximal number of banks of endpoints +#define udd_get_endpoint_bank_max_nbr(ep) ((ep == 0) ? 1 : (( ep <= 2) ? 3 : 2)) + //! Get maximal size of endpoint (3X, 1024/64) +#define udd_get_endpoint_size_max(ep) (((ep) == 0) ? 64 : 1024) + //! Get DMA support of endpoints +#define Is_udd_endpoint_dma_supported(ep) ((((ep) >= 1) && ((ep) <= 6)) ? true : false) + //! Get High Band Width support of endpoints +#define Is_udd_endpoint_high_bw_supported(ep) (((ep) >= 2) ? true : false) +//! @} + +//! @name UOTGHS Device speeds management +//! @{ + //! Enable/disable device low-speed mode +#define udd_low_speed_enable() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_LS)) +#define udd_low_speed_disable() (Clr_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_LS)) + //! Test if device low-speed mode is forced +#define Is_udd_low_speed_enable() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_LS)) + +#ifdef UOTGHS_DEVCTRL_SPDCONF_HIGH_SPEED + //! Enable high speed mode +# define udd_high_speed_enable() (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_SPDCONF_Msk, 0)) + //! Disable high speed mode +# define udd_high_speed_disable() (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_SPDCONF_Msk, 3)) + //! Test if controller is in full speed mode +# define Is_udd_full_speed_mode() (Rd_bitfield(UOTGHS->UOTGHS_SR, UOTGHS_SR_SPEED_Msk) == UOTGHS_SR_SPEED_FULL_SPEED) +#else +# define udd_high_speed_enable() do { } while (0) +# define udd_high_speed_disable() do { } while (0) +# define Is_udd_full_speed_mode() true +#endif +//! @} + +//! @name UOTGHS Device HS test mode management +//! @{ +#ifdef UOTGHS_DEVCTRL_SPDCONF_HIGH_SPEED + //! Enable high speed test mode +# define udd_enable_hs_test_mode() (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_SPDCONF_Msk, 2)) +# define udd_enable_hs_test_mode_j() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_TSTJ)) +# define udd_enable_hs_test_mode_k() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_TSTK)) +# define udd_enable_hs_test_mode_packet() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_TSTPCKT)) +#endif +//! @} + +//! @name UOTGHS Device vbus management +//! @{ +#define udd_enable_vbus_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define udd_disable_vbus_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_udd_vbus_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_udd_vbus_high() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUS)) +#define Is_udd_vbus_low() (!Is_udd_vbus_high()) +#define udd_ack_vbus_transition() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_VBUSTIC) +#define udd_raise_vbus_transition() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_VBUSTIS) +#define Is_udd_vbus_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUSTI)) +//! @} + + +//! @name UOTGHS device attach control +//! These macros manage the UOTGHS Device attach. +//! @{ + //! Detaches from USB bus +#define udd_detach_device() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) + //! Attaches to USB bus +#define udd_attach_device() (Clr_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) + //! Test if the device is detached +#define Is_udd_detached() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_DETACH)) +//! @} + + +//! @name UOTGHS device bus events control +//! These macros manage the UOTGHS Device bus events. +//! @{ + +//! Initiates a remote wake-up event +//! @{ +#define udd_initiate_remote_wake_up() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_RMWKUP)) +#define Is_udd_pending_remote_wake_up() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_RMWKUP)) +//! @} + +//! Manage upstream resume event (=remote wakeup) +//! The USB driver sends a resume signal called "Upstream Resume" +//! @{ +#define udd_enable_remote_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_UPRSMES) +#define udd_disable_remote_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_UPRSMEC) +#define Is_udd_remote_wake_up_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_UPRSME)) +#define udd_ack_remote_wake_up_start() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_UPRSMC) +#define udd_raise_remote_wake_up_start() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_UPRSMS) +#define Is_udd_remote_wake_up_start() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_UPRSM)) +//! @} + +//! Manage downstream resume event (=remote wakeup from host) +//! The USB controller detects a valid "End of Resume" signal initiated by the host +//! @{ +#define udd_enable_resume_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_EORSMES) +#define udd_disable_resume_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_EORSMEC) +#define Is_udd_resume_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_EORSME)) +#define udd_ack_resume() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_EORSMC) +#define udd_raise_resume() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_EORSMS) +#define Is_udd_resume() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_EORSM)) +//! @} + +//! Manage wake-up event (=usb line activity) +//! The USB controller is reactivated by a filtered non-idle signal from the lines +//! @{ +#define udd_enable_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_WAKEUPES) +#define udd_disable_wake_up_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_WAKEUPEC) +#define Is_udd_wake_up_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_WAKEUPE)) +#define udd_ack_wake_up() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_WAKEUPC) +#define udd_raise_wake_up() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_WAKEUPS) +#define Is_udd_wake_up() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_WAKEUP)) +//! @} + +//! Manage reset event +//! Set when a USB "End of Reset" has been detected +//! @{ +#define udd_enable_reset_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_EORSTES) +#define udd_disable_reset_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_EORSTEC) +#define Is_udd_reset_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_EORSTE)) +#define udd_ack_reset() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_EORSTC) +#define udd_raise_reset() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_EORSTS) +#define Is_udd_reset() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_EORST)) +//! @} + +//! Manage start of frame event +//! @{ +#define udd_enable_sof_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_SOFES) +#define udd_disable_sof_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_SOFEC) +#define Is_udd_sof_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_SOFE)) +#define udd_ack_sof() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_SOFC) +#define udd_raise_sof() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_SOFS) +#define Is_udd_sof() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_SOF)) +#define udd_frame_number() (Rd_bitfield(UOTGHS->UOTGHS_DEVFNUM, UOTGHS_DEVFNUM_FNUM_Msk)) +#define Is_udd_frame_number_crc_error() (Tst_bits(UOTGHS->UOTGHS_DEVFNUM, UOTGHS_DEVFNUM_FNCERR)) +//! @} + +//! Manage Micro start of frame event (High Speed Only) +//! @{ +#define udd_enable_msof_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_MSOFES) +#define udd_disable_msof_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_MSOFEC) +#define Is_udd_msof_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_MSOFE)) +#define udd_ack_msof() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVIMR_MSOFE) +#define udd_raise_msof() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_MSOFS) +#define Is_udd_msof() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_MSOF)) +#define udd_micro_frame_number() \ + (Rd_bitfield(UOTGHS->UOTGHS_DEVFNUM, (UOTGHS_DEVFNUM_FNUM_Msk|UOTGHS_DEVFNUM_MFNUM_Msk))) +//! @} + +//! Manage suspend event +//! @{ +#define udd_enable_suspend_interrupt() (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_SUSPES) +#define udd_disable_suspend_interrupt() (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_SUSPEC) +#define Is_udd_suspend_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_SUSPE)) +#define udd_ack_suspend() (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVICR_SUSPC) +#define udd_raise_suspend() (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_SUSPS) +#define Is_udd_suspend() (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_SUSP)) +//! @} + +//! @} + +//! @name UOTGHS device address control +//! These macros manage the UOTGHS Device address. +//! @{ + //! enables USB device address +#define udd_enable_address() (Set_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_ADDEN)) + //! disables USB device address +#define udd_disable_address() (Clr_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_ADDEN)) +#define Is_udd_address_enabled() (Tst_bits(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_ADDEN)) + //! configures the USB device address +#define udd_configure_address(addr) (Wr_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_UADD_Msk, addr)) + //! gets the currently configured USB device address +#define udd_get_configured_address() (Rd_bitfield(UOTGHS->UOTGHS_DEVCTRL, UOTGHS_DEVCTRL_UADD_Msk)) +//! @} + + +//! @name UOTGHS Device endpoint drivers +//! These macros manage the common features of the endpoints. +//! @{ + +//! Generic macro for UOTGHS registers that can be arrayed +//! @{ +#define UOTGHS_ARRAY(reg,index) ((&(UOTGHS->reg))[(index)]) +//! @} + +//! @name UOTGHS Device endpoint configuration +//! @{ + //! enables the selected endpoint +#define udd_enable_endpoint(ep) (Set_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPEN0 << (ep))) + //! disables the selected endpoint +#define udd_disable_endpoint(ep) (Clr_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPEN0 << (ep))) + //! tests if the selected endpoint is enabled +#define Is_udd_endpoint_enabled(ep) (Tst_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPEN0 << (ep))) + //! resets the selected endpoint +#define udd_reset_endpoint(ep) \ + do { \ + Set_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPRST0 << (ep)); \ + Clr_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPRST0 << (ep)); \ + } while (0) + //! Tests if the selected endpoint is being reset +#define Is_udd_resetting_endpoint(ep) (Tst_bits(UOTGHS->UOTGHS_DEVEPT, UOTGHS_DEVEPT_EPRST0 << (ep))) + + //! Configures the selected endpoint type +#define udd_configure_endpoint_type(ep, type) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPTYPE_Msk, type)) + //! Gets the configured selected endpoint type +#define udd_get_endpoint_type(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPTYPE_Msk)) + //! Enables the bank autoswitch for the selected endpoint +#define udd_enable_endpoint_bank_autoswitch(ep) (Set_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_AUTOSW)) + //! Disables the bank autoswitch for the selected endpoint +#define udd_disable_endpoint_bank_autoswitch(ep) (Clr_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_AUTOSW)) +#define Is_udd_endpoint_bank_autoswitch_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_AUTOSW)) + //! Configures the selected endpoint direction +#define udd_configure_endpoint_direction(ep, dir) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPDIR, dir)) + //! Gets the configured selected endpoint direction +#define udd_get_endpoint_direction(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPDIR)) +#define Is_udd_endpoint_in(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPDIR)) + //! Bounds given integer size to allowed range and rounds it up to the nearest + //! available greater size, then applies register format of UOTGHS controller + //! for endpoint size bit-field. +#undef udd_format_endpoint_size +#define udd_format_endpoint_size(size) (32 - clz(((uint32_t)min(max(size, 8), 1024) << 1) - 1) - 1 - 3) + //! Configures the selected endpoint size +#define udd_configure_endpoint_size(ep, size) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPSIZE_Msk, udd_format_endpoint_size(size))) + //! Gets the configured selected endpoint size +#define udd_get_endpoint_size(ep) (8 << Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPSIZE_Msk)) + //! Configures the selected endpoint number of banks +#define udd_configure_endpoint_bank(ep, bank) (Wr_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPBK_Msk, bank)) + //! Gets the configured selected endpoint number of banks +#define udd_get_endpoint_bank(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPBK_Msk)+1) + //! Allocates the configuration selected endpoint in DPRAM memory +#define udd_allocate_memory(ep) (Set_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_ALLOC)) + //! un-allocates the configuration selected endpoint in DPRAM memory +#define udd_unallocate_memory(ep) (Clr_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_ALLOC)) +#define Is_udd_memory_allocated(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_ALLOC)) + + //! Configures selected endpoint in one step +#define udd_configure_endpoint(ep, type, dir, size, bank) (\ + Wr_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTCFG[0], ep), UOTGHS_DEVEPTCFG_EPTYPE_Msk |\ + UOTGHS_DEVEPTCFG_EPDIR |\ + UOTGHS_DEVEPTCFG_EPSIZE_Msk |\ + UOTGHS_DEVEPTCFG_EPBK_Msk , \ + (((uint32_t)(type) << UOTGHS_DEVEPTCFG_EPTYPE_Pos) & UOTGHS_DEVEPTCFG_EPTYPE_Msk) |\ + (((uint32_t)(dir ) << UOTGHS_DEVEPTCFG_EPDIR_Pos ) & UOTGHS_DEVEPTCFG_EPDIR) |\ + ( (uint32_t)udd_format_endpoint_size(size) << UOTGHS_DEVEPTCFG_EPSIZE_Pos) |\ + (((uint32_t)(bank) << UOTGHS_DEVEPTCFG_EPBK_Pos) & UOTGHS_DEVEPTCFG_EPBK_Msk))\ +) + //! Tests if current endpoint is configured +#define Is_udd_endpoint_configured(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_CFGOK)) + //! Returns the control direction +#define udd_control_direction() (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], EP_CONTROL), UOTGHS_DEVEPTISR_CTRLDIR)) + + //! Resets the data toggle sequence +#define udd_reset_data_toggle(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_RSTDTS) + //! Tests if the data toggle sequence is being reset +#define Is_udd_data_toggle_reset(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_RSTDT)) + //! Returns data toggle +#define udd_data_toggle(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_DTSEQ_Msk)) +//! @} + + +//! @name UOTGHS Device control endpoint +//! These macros control the endpoints. +//! @{ + +//! @name UOTGHS Device control endpoint interrupts +//! These macros control the endpoints interrupts. +//! @{ + //! Enables the selected endpoint interrupt +#define udd_enable_endpoint_interrupt(ep) (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_PEP_0 << (ep)) + //! Disables the selected endpoint interrupt +#define udd_disable_endpoint_interrupt(ep) (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_PEP_0 << (ep)) + //! Tests if the selected endpoint interrupt is enabled +#define Is_udd_endpoint_interrupt_enabled(ep) (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_PEP_0 << (ep))) + //! Tests if an interrupt is triggered by the selected endpoint +#define Is_udd_endpoint_interrupt(ep) (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_PEP_0 << (ep))) + //! Returns the lowest endpoint number generating an endpoint interrupt or MAX_PEP_NB if none +#define udd_get_interrupt_endpoint_number() (ctz(((UOTGHS->UOTGHS_DEVISR >> UOTGHS_DEVISR_PEP_Pos) & \ + (UOTGHS->UOTGHS_DEVIMR >> UOTGHS_DEVIMR_PEP_Pos)) | \ + (1 << MAX_PEP_NB))) +#define UOTGHS_DEVISR_PEP_Pos 12 +#define UOTGHS_DEVIMR_PEP_Pos 12 +//! @} + +//! @name UOTGHS Device control endpoint errors +//! These macros control the endpoint errors. +//! @{ + //! Enables the STALL handshake +#define udd_enable_stall_handshake(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_STALLRQS) + //! Disables the STALL handshake +#define udd_disable_stall_handshake(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_STALLRQC) + //! Tests if STALL handshake request is running +#define Is_udd_endpoint_stall_requested(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_STALLRQ)) + //! Tests if STALL sent +#define Is_udd_stall(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_STALLEDI)) + //! ACKs STALL sent +#define udd_ack_stall(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_STALLEDIC) + //! Raises STALL sent +#define udd_raise_stall(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_STALLEDIS) + //! Enables STALL sent interrupt +#define udd_enable_stall_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_STALLEDES) + //! Disables STALL sent interrupt +#define udd_disable_stall_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_STALLEDEC) + //! Tests if STALL sent interrupt is enabled +#define Is_udd_stall_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_STALLEDE)) + + //! Tests if NAK OUT received +#define Is_udd_nak_out(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_NAKOUTI)) + //! ACKs NAK OUT received +#define udd_ack_nak_out(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_NAKOUTIC) + //! Raises NAK OUT received +#define udd_raise_nak_out(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NAKOUTIS) + //! Enables NAK OUT interrupt +#define udd_enable_nak_out_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_NAKOUTES) + //! Disables NAK OUT interrupt +#define udd_disable_nak_out_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_NAKOUTEC) + //! Tests if NAK OUT interrupt is enabled +#define Is_udd_nak_out_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_NAKOUTE)) + + //! Tests if NAK IN received +#define Is_udd_nak_in(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_NAKINI)) + //! ACKs NAK IN received +#define udd_ack_nak_in(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_NAKINIC) + //! Raises NAK IN received +#define udd_raise_nak_in(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NAKINIS) + //! Enables NAK IN interrupt +#define udd_enable_nak_in_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_NAKINES) + //! Disables NAK IN interrupt +#define udd_disable_nak_in_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_NAKINEC) + //! Tests if NAK IN interrupt is enabled +#define Is_udd_nak_in_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_NAKINE)) + + //! ACKs endpoint isochronous overflow interrupt +#define udd_ack_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_OVERFIC) + //! Raises endpoint isochronous overflow interrupt +#define udd_raise_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_OVERFIS) + //! Tests if an overflow occurs +#define Is_udd_overflow(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_OVERFI)) + //! Enables overflow interrupt +#define udd_enable_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_OVERFES) + //! Disables overflow interrupt +#define udd_disable_overflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_OVERFEC) + //! Tests if overflow interrupt is enabled +#define Is_udd_overflow_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_OVERFE)) + + //! ACKs endpoint isochronous underflow interrupt +#define udd_ack_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_UNDERFIC) + //! Raises endpoint isochronous underflow interrupt +#define udd_raise_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_UNDERFIS) + //! Tests if an underflow occurs +#define Is_udd_underflow(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_UNDERFI)) + //! Enables underflow interrupt +#define udd_enable_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_UNDERFES) + //! Disables underflow interrupt +#define udd_disable_underflow_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_UNDERFEC) + //! Tests if underflow interrupt is enabled +#define Is_udd_underflow_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_UNDERFE)) + + //! Tests if CRC ERROR ISO OUT detected +#define Is_udd_crc_error(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_CRCERRI)) + //! ACKs CRC ERROR ISO OUT detected +#define udd_ack_crc_error(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_CRCERRIC) + //! Raises CRC ERROR ISO OUT detected +#define udd_raise_crc_error(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_CRCERRIS) + //! Enables CRC ERROR ISO OUT detected interrupt +#define udd_enable_crc_error_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_CRCERRES) + //! Disables CRC ERROR ISO OUT detected interrupt +#define udd_disable_crc_error_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_CRCERREC) + //! Tests if CRC ERROR ISO OUT detected interrupt is enabled +#define Is_udd_crc_error_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_CRCERRE)) +//! @} + +//! @name UOTGHS Device control endpoint transfer +//! These macros control the endpoint transfer. +//! @{ + + //! Tests if endpoint read allowed +#define Is_udd_read_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RWALL)) + //! Tests if endpoint write allowed +#define Is_udd_write_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RWALL)) + + //! Returns the byte count +#define udd_byte_count(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_BYCT_Msk)) + //! Clears FIFOCON bit +#define udd_ack_fifocon(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_FIFOCONC) + //! Tests if FIFOCON bit set +#define Is_udd_fifocon(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_FIFOCON)) + + //! Returns the number of busy banks +#define udd_nb_busy_bank(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_NBUSYBK_Msk)) + //! Returns the number of the current bank +#define udd_current_bank(ep) (Rd_bitfield(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_CURRBK_Msk)) + //! Kills last bank +#define udd_kill_last_in_bank(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_KILLBKS) +#define Is_udd_kill_last(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_KILLBK)) + //! Tests if last bank killed +#define Is_udd_last_in_bank_killed(ep) (!Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_KILLBK)) + //! Forces all banks full (OUT) or free (IN) interrupt +#define udd_force_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NBUSYBKS) + //! Unforces all banks full (OUT) or free (IN) interrupt +#define udd_unforce_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_NBUSYBKS) + //! Enables all banks full (OUT) or free (IN) interrupt +#define udd_enable_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_NBUSYBKES) + //! Disables all banks full (OUT) or free (IN) interrupt +#define udd_disable_bank_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_NBUSYBKEC) + //! Tests if all banks full (OUT) or free (IN) interrupt enabled +#define Is_udd_bank_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_NBUSYBKE)) + + //! Tests if SHORT PACKET received +#define Is_udd_short_packet(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_SHORTPACKET)) + //! ACKs SHORT PACKET received +#define udd_ack_short_packet(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_SHORTPACKETC) + //! Raises SHORT PACKET received +#define udd_raise_short_packet(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_SHORTPACKETS) + //! Enables SHORT PACKET received interrupt +#define udd_enable_short_packet_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_SHORTPACKETES) + //! Disables SHORT PACKET received interrupt +#define udd_disable_short_packet_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_SHORTPACKETEC) + //! Tests if SHORT PACKET received interrupt is enabled +#define Is_udd_short_packet_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_SHORTPACKETE)) + + //! Tests if SETUP received +#define Is_udd_setup_received(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RXSTPI)) + //! ACKs SETUP received +#define udd_ack_setup_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_RXSTPIC) + //! Raises SETUP received +#define udd_raise_setup_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_RXSTPIS) + //! Enables SETUP received interrupt +#define udd_enable_setup_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_RXSTPES) + //! Disables SETUP received interrupt +#define udd_disable_setup_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_RXSTPEC) + //! Tests if SETUP received interrupt is enabled +#define Is_udd_setup_received_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_RXSTPE)) + + //! Tests if OUT received +#define Is_udd_out_received(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_RXOUTI)) + //! ACKs OUT received +#define udd_ack_out_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_RXOUTIC) + //! Raises OUT received +#define udd_raise_out_received(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_RXOUTIS) + //! Enables OUT received interrupt +#define udd_enable_out_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_RXOUTES) + //! Disables OUT received interrupt +#define udd_disable_out_received_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_RXOUTEC) + //! Tests if OUT received interrupt is enabled +#define Is_udd_out_received_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_RXOUTE)) + + //! Tests if IN sending +#define Is_udd_in_send(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTISR[0], ep), UOTGHS_DEVEPTISR_TXINI)) + //! ACKs IN sending +#define udd_ack_in_send(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTICR[0], ep) = UOTGHS_DEVEPTICR_TXINIC) + //! Raises IN sending +#define udd_raise_in_send(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIFR[0], ep) = UOTGHS_DEVEPTIFR_TXINIS) + //! Enables IN sending interrupt +#define udd_enable_in_send_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0], ep) = UOTGHS_DEVEPTIER_TXINES) + //! Disables IN sending interrupt +#define udd_disable_in_send_interrupt(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0], ep) = UOTGHS_DEVEPTIDR_TXINEC) + //! Tests if IN sending interrupt is enabled +#define Is_udd_in_send_interrupt_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0], ep), UOTGHS_DEVEPTIMR_TXINE)) + + + //! Get 64-, 32-, 16- or 8-bit access to FIFO data register of selected endpoint. + //! @param ep Endpoint of which to access FIFO data register + //! @param scale Data scale in bits: 64, 32, 16 or 8 + //! @return Volatile 64-, 32-, 16- or 8-bit data pointer to FIFO data register + //! @warning It is up to the user of this macro to make sure that all accesses + //! are aligned with their natural boundaries except 64-bit accesses which + //! require only 32-bit alignment. + //! @warning It is up to the user of this macro to make sure that used HSB + //! addresses are identical to the DPRAM internal pointer modulo 32 bits. +#define udd_get_endpoint_fifo_access(ep, scale) \ + (((volatile TPASTE2(U, scale) (*)[0x8000 / ((scale) / 8)])UOTGHS_RAM_ADDR)[(ep)]) + +//! @name UOTGHS endpoint DMA drivers +//! These macros manage the common features of the endpoint DMA channels. +//! @{ + + //! Maximum transfer size on USB DMA +#define UDD_ENDPOINT_MAX_TRANS 0x10000 + //! Enables the disabling of HDMA requests by endpoint interrupts +#define udd_enable_endpoint_int_dis_hdma_req(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIER[0](ep) = UOTGHS_DEVEPTIER_EPDISHDMAS) + //! Disables the disabling of HDMA requests by endpoint interrupts +#define udd_disable_endpoint_int_dis_hdma_req(ep) (UOTGHS_ARRAY(UOTGHS_DEVEPTIDR[0](ep) = UOTGHS_DEVEPTIDR_EPDISHDMAC) + //! Tests if the disabling of HDMA requests by endpoint interrupts is enabled +#define Is_udd_endpoint_int_dis_hdma_req_enabled(ep) (Tst_bits(UOTGHS_ARRAY(UOTGHS_DEVEPTIMR[0](ep), UOTGHS_DEVEPTIMR_EPDISHDMA)) + + //! Raises the selected endpoint DMA channel interrupt +#define udd_raise_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVIFR = UOTGHS_DEVIFR_DMA_1 << ((ep) - 1)) + //! Raises the selected endpoint DMA channel interrupt +#define udd_clear_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVICR = UOTGHS_DEVISR_DMA_1 << ((ep) - 1)) + //! Tests if an interrupt is triggered by the selected endpoint DMA channel +#define Is_udd_endpoint_dma_interrupt(ep) (Tst_bits(UOTGHS->UOTGHS_DEVISR, UOTGHS_DEVISR_DMA_1 << ((ep) - 1))) + //! Enables the selected endpoint DMA channel interrupt +#define udd_enable_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVIER = UOTGHS_DEVIER_DMA_1 << ((ep) - 1)) + //! Disables the selected endpoint DMA channel interrupt +#define udd_disable_endpoint_dma_interrupt(ep) (UOTGHS->UOTGHS_DEVIDR = UOTGHS_DEVIDR_DMA_1 << ((ep) - 1)) + //! Tests if the selected endpoint DMA channel interrupt is enabled +#define Is_udd_endpoint_dma_interrupt_enabled(ep) (Tst_bits(UOTGHS->UOTGHS_DEVIMR, UOTGHS_DEVIMR_DMA_1 << ((ep) - 1))) + + //! Access points to the UOTGHS device DMA memory map with arrayed registers + //! @{ + //! Structure for DMA next descriptor register +typedef struct { + uint32_t *NXT_DSC_ADD; +} uotghs_dma_nextdesc_t; + //! Structure for DMA control register +typedef struct { + uint32_t CHANN_ENB:1, + LDNXT_DSC:1, + END_TR_EN:1, + END_B_EN:1, + END_TR_IT:1, + END_BUFFIT:1, + DESC_LD_IT:1, + BUST_LCK:1, + reserved:8, + BUFF_LENGTH:16; +} uotghs_dma_control_t; + //! Structure for DMA status register +typedef struct { + uint32_t CHANN_ENB:1, + CHANN_ACT:1, + reserved0:2, + END_TR_ST:1, + END_BF_ST:1, + DESC_LDST:1, + reserved1:9, + BUFF_COUNT:16; +} uotghs_dma_status_t; + //! Structure for DMA descriptor +typedef struct { + union { + uint32_t nextdesc; + uotghs_dma_nextdesc_t NEXTDESC; + }; + uint32_t addr; + union { + uint32_t control; + uotghs_dma_control_t CONTROL; + }; + uint32_t reserved; +} sam_uotghs_dmadesc_t, uotghs_dmadesc_t; + //! Structure for DMA registers in a channel +typedef struct { + union { + uint32_t nextdesc; + uotghs_dma_nextdesc_t NEXTDESC; + }; + uint32_t addr; + union { + uint32_t control; + uotghs_dma_control_t CONTROL; + }; + union { + unsigned long status; + uotghs_dma_status_t STATUS; + }; +} sam_uotghs_dmach_t, uotghs_dmach_t; + //! DMA channel control command +#define UDD_ENDPOINT_DMA_STOP_NOW (0) +#define UDD_ENDPOINT_DMA_RUN_AND_STOP (UOTGHS_DEVDMACONTROL_CHANN_ENB) +#define UDD_ENDPOINT_DMA_LOAD_NEXT_DESC (UOTGHS_DEVDMACONTROL_LDNXT_DSC) +#define UDD_ENDPOINT_DMA_RUN_AND_LINK (UOTGHS_DEVDMACONTROL_CHANN_ENB|UOTGHS_DEVDMACONTROL_LDNXT_DSC) + //! Structure for DMA registers +#define UOTGHS_UDDMA_ARRAY(ep) (((volatile uotghs_dmach_t *)UOTGHS->UOTGHS_DEVDMA)[(ep) - 1]) + + //! Set control desc to selected endpoint DMA channel +#define udd_endpoint_dma_set_control(ep,desc) (UOTGHS_UDDMA_ARRAY(ep).control = desc) + //! Get control desc to selected endpoint DMA channel +#define udd_endpoint_dma_get_control(ep) (UOTGHS_UDDMA_ARRAY(ep).control) + //! Set RAM address to selected endpoint DMA channel +#define udd_endpoint_dma_set_addr(ep,add) (UOTGHS_UDDMA_ARRAY(ep).addr = add) + //! Get status to selected endpoint DMA channel +#define udd_endpoint_dma_get_status(ep) (UOTGHS_UDDMA_ARRAY(ep).status) + //! @} +//! @} + +//! @} +//! @} +//! @} +//! @} + + +/// @cond 0 +/**INDENT-OFF**/ +#ifdef __cplusplus +} +#endif +/**INDENT-ON**/ +/// @endcond + +#endif /* UOTGHS_DEVICE_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/uotghs_otg.h b/Marlin/src/HAL/DUE/usb/uotghs_otg.h new file mode 100644 index 00000000..eca5e938 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/uotghs_otg.h @@ -0,0 +1,241 @@ +/** + * \file + * + * \brief USB OTG Driver for UOTGHS. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UOTGHS_OTG_H_INCLUDED +#define UOTGHS_OTG_H_INCLUDED + +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +//! \ingroup usb_group +//! \defgroup otg_group UOTGHS OTG Driver +//! UOTGHS low-level driver for OTG features +//! +//! @{ + +/** + * \brief Initialize the dual role + * This function is implemented in uotghs_host.c file. + * + * \return \c true if the ID pin management has been started, otherwise \c false. + */ +bool otg_dual_enable(void); + +/** + * \brief Uninitialize the dual role + * This function is implemented in uotghs_host.c file. + */ +void otg_dual_disable(void); + + +//! @name UOTGHS OTG ID pin management +//! The ID pin come from the USB OTG connector (A and B receptable) and +//! allows to select the USB mode host or device. +//! The UOTGHS hardware can manage it automatically. This feature is optional. +//! When USB_ID_GPIO is defined (in board.h), this feature is enabled. +//! +//! @{ + //! Enable external OTG_ID pin (listened to by USB) +#define otg_enable_id_pin() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIDE)) + //! Disable external OTG_ID pin (ignored by USB) +#define otg_disable_id_pin() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIDE)) + //! Test if external OTG_ID pin enabled (listened to by USB) +#define Is_otg_id_pin_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIDE)) + //! Disable external OTG_ID pin and force device mode +#define otg_force_device_mode() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD), otg_disable_id_pin()) + //! Test if device mode is forced +#define Is_otg_device_mode_forced() (!Is_otg_id_pin_enabled() && Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD)) + //! Disable external OTG_ID pin and force host mode +#define otg_force_host_mode() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD), otg_disable_id_pin()) + //! Test if host mode is forced +#define Is_otg_host_mode_forced() (!Is_otg_id_pin_enabled() && !Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UIMOD)) + +//! @name UOTGHS OTG ID pin interrupt management +//! These macros manage the ID pin interrupt +//! @{ +#define otg_enable_id_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_IDTE)) +#define otg_disable_id_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_IDTE)) +#define Is_otg_id_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_IDTE)) +#define Is_otg_id_device() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_ID)) +#define Is_otg_id_host() (!Is_otg_id_device()) +#define otg_ack_id_transition() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_IDTIC) +#define otg_raise_id_transition() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_IDTIS) +#define Is_otg_id_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_IDTI)) +//! @} +//! @} + +//! @name OTG Vbus management +//! @{ +#define otg_enable_vbus_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define otg_disable_vbus_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_otg_vbus_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_VBUSTE)) +#define Is_otg_vbus_high() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUS)) +#define Is_otg_vbus_low() (!Is_otg_vbus_high()) +#define otg_ack_vbus_transition() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_VBUSTIC) +#define otg_raise_vbus_transition() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_VBUSTIS) +#define Is_otg_vbus_transition() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_VBUSTI)) +//! @} + +//! @name UOTGHS OTG main management +//! These macros allows to enable/disable pad and UOTGHS hardware +//! @{ + //! Reset USB macro +#define otg_reset() \ + do { \ + UOTGHS->UOTGHS_CTRL = 0; \ + while( UOTGHS->UOTGHS_SR & 0x3FFF) {\ + UOTGHS->UOTGHS_SCR = 0xFFFFFFFF;\ + } \ + } while (0) + //! Enable USB macro +#define otg_enable() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) + //! Disable USB macro +#define otg_disable() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) +#define Is_otg_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) + + //! Enable OTG pad +#define otg_enable_pad() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_OTGPADE)) + //! Disable OTG pad +#define otg_disable_pad() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_OTGPADE)) +#define Is_otg_pad_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_OTGPADE)) + + //! Check Clock Usable + //! For parts with HS feature, this one corresponding at UTMI clock +#define Is_otg_clock_usable() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_CLKUSABLE)) + + //! Stop (freeze) internal USB clock +#define otg_freeze_clock() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_FRZCLK)) +#define otg_unfreeze_clock() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_FRZCLK)) +#define Is_otg_clock_frozen() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_FRZCLK)) + + //! Configure time-out of specified OTG timer +#define otg_configure_timeout(timer, timeout) (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk, timeout),\ + Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK)) + //! Get configured time-out of specified OTG timer +#define otg_get_timeout(timer) (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ + Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Rd_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk)) + + + //! Get the dual-role device state of the internal USB finite state machine of the UOTGHS controller +#define otg_get_fsm_drd_state() (Rd_bitfield(UOTGHS->UOTGHS_FSM, UOTGHS_FSM_DRDSTATE_Msk)) +#define Is_otg_a_suspend() (4==otg_get_fsm_drd_state()) +#define Is_otg_a_wait_vrise() (1==otg_get_fsm_drd_state()) +//! @} + +//! @name UOTGHS OTG hardware protocol +//! These macros manages the hardware OTG protocol +//! @{ + //! Initiates a Host negotiation Protocol +#define otg_device_initiate_hnp() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! Accepts a Host negotiation Protocol +#define otg_host_accept_hnp() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! Rejects a Host negotiation Protocol +#define otg_host_reject_hnp() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! initiates a Session Request Protocol +#define otg_device_initiate_srp() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPREQ)) + //! Selects VBus as SRP method +#define otg_select_vbus_srp_method() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPSEL)) +#define Is_otg_vbus_srp_method_selected() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPSEL)) + //! Selects data line as SRP method +#define otg_select_data_srp_method() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPSEL)) +#define Is_otg_data_srp_method_selected() (!Is_otg_vbus_srp_method_selected()) + //! Tests if a HNP occurs +#define Is_otg_hnp() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPREQ)) + //! Tests if a SRP from device occurs +#define Is_otg_device_srp() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPREQ)) + + //! Enables HNP error interrupt +#define otg_enable_hnp_error_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPERRE)) + //! Disables HNP error interrupt +#define otg_disable_hnp_error_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPERRE)) +#define Is_otg_hnp_error_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_HNPERRE)) + //! ACKs HNP error interrupt +#define otg_ack_hnp_error_interrupt() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_HNPERRIC) + //! Raises HNP error interrupt +#define otg_raise_hnp_error_interrupt() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_HNPERRIS) + //! Tests if a HNP error occurs +#define Is_otg_hnp_error_interrupt() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_HNPERRI)) + + //! Enables role exchange interrupt +#define otg_enable_role_exchange_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_ROLEEXE)) + //! Disables role exchange interrupt +#define otg_disable_role_exchange_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_ROLEEXE)) +#define Is_otg_role_exchange_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_ROLEEXE)) + //! ACKs role exchange interrupt +#define otg_ack_role_exchange_interrupt() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_ROLEEXIC) + //! Raises role exchange interrupt +#define otg_raise_role_exchange_interrupt() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_ROLEEXIS) + //! Tests if a role exchange occurs +#define Is_otg_role_exchange_interrupt() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_ROLEEXI)) + + //! Enables SRP interrupt +#define otg_enable_srp_interrupt() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPE)) + //! Disables SRP interrupt +#define otg_disable_srp_interrupt() (Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPE)) +#define Is_otg_srp_interrupt_enabled() (Tst_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_SRPE)) + //! ACKs SRP interrupt +#define otg_ack_srp_interrupt() (UOTGHS->UOTGHS_SCR = UOTGHS_SCR_SRPIC) + //! Raises SRP interrupt +#define otg_raise_srp_interrupt() (UOTGHS->UOTGHS_SFR = UOTGHS_SFR_SRPIS) + //! Tests if a SRP occurs +#define Is_otg_srp_interrupt() (Tst_bits(UOTGHS->UOTGHS_SR, UOTGHS_SR_SRPI)) +//! @} + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif /* UOTGHS_OTG_H_INCLUDED */ diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol.h b/Marlin/src/HAL/DUE/usb/usb_protocol.h new file mode 100644 index 00000000..ea51a868 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/usb_protocol.h @@ -0,0 +1,496 @@ +/** + * \file + * + * \brief USB protocol definitions. + * + * This file contains the USB definitions and data structures provided by the + * USB 2.0 specification. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_H_ +#define _USB_PROTOCOL_H_ + +/** + * \ingroup usb_group + * \defgroup usb_protocol_group USB Protocol Definitions + * + * This module defines constants and data structures provided by the USB + * 2.0 specification. + * + * @{ + */ + +//! Value for field bcdUSB +#define USB_V2_0 0x0200 //!< USB Specification version 2.00 +#define USB_V2_1 0x0201 //!< USB Specification version 2.01 + +/*! \name Generic definitions (Class, subclass and protocol) + */ +//! @{ +#define NO_CLASS 0x00 +#define CLASS_VENDOR_SPECIFIC 0xFF +#define NO_SUBCLASS 0x00 +#define NO_PROTOCOL 0x00 +//! @} + +//! \name IAD (Interface Association Descriptor) constants +//! @{ +#define CLASS_IAD 0xEF +#define SUB_CLASS_IAD 0x02 +#define PROTOCOL_IAD 0x01 +//! @} + +/** + * \brief USB request data transfer direction (bmRequestType) + */ +#define USB_REQ_DIR_OUT (0<<7) //!< Host to device +#define USB_REQ_DIR_IN (1<<7) //!< Device to host +#define USB_REQ_DIR_MASK (1<<7) //!< Mask + +/** + * \brief USB request types (bmRequestType) + */ +#define USB_REQ_TYPE_STANDARD (0<<5) //!< Standard request +#define USB_REQ_TYPE_CLASS (1<<5) //!< Class-specific request +#define USB_REQ_TYPE_VENDOR (2<<5) //!< Vendor-specific request +#define USB_REQ_TYPE_MASK (3<<5) //!< Mask + +/** + * \brief USB recipient codes (bmRequestType) + */ +#define USB_REQ_RECIP_DEVICE (0<<0) //!< Recipient device +#define USB_REQ_RECIP_INTERFACE (1<<0) //!< Recipient interface +#define USB_REQ_RECIP_ENDPOINT (2<<0) //!< Recipient endpoint +#define USB_REQ_RECIP_OTHER (3<<0) //!< Recipient other +#define USB_REQ_RECIP_MASK (0x1F) //!< Mask + +/** + * \brief Standard USB requests (bRequest) + */ +enum usb_reqid { + USB_REQ_GET_STATUS = 0, + USB_REQ_CLEAR_FEATURE = 1, + USB_REQ_SET_FEATURE = 3, + USB_REQ_SET_ADDRESS = 5, + USB_REQ_GET_DESCRIPTOR = 6, + USB_REQ_SET_DESCRIPTOR = 7, + USB_REQ_GET_CONFIGURATION = 8, + USB_REQ_SET_CONFIGURATION = 9, + USB_REQ_GET_INTERFACE = 10, + USB_REQ_SET_INTERFACE = 11, + USB_REQ_SYNCH_FRAME = 12, +}; + +/** + * \brief Standard USB device status flags + * + */ +enum usb_device_status { + USB_DEV_STATUS_BUS_POWERED = 0, + USB_DEV_STATUS_SELF_POWERED = 1, + USB_DEV_STATUS_REMOTEWAKEUP = 2 +}; + +/** + * \brief Standard USB Interface status flags + * + */ +enum usb_interface_status { + USB_IFACE_STATUS_RESERVED = 0 +}; + +/** + * \brief Standard USB endpoint status flags + * + */ +enum usb_endpoint_status { + USB_EP_STATUS_HALTED = 1, +}; + +/** + * \brief Standard USB device feature flags + * + * \note valid for SetFeature request. + */ +enum usb_device_feature { + USB_DEV_FEATURE_REMOTE_WAKEUP = 1, //!< Remote wakeup enabled + USB_DEV_FEATURE_TEST_MODE = 2, //!< USB test mode + USB_DEV_FEATURE_OTG_B_HNP_ENABLE = 3, + USB_DEV_FEATURE_OTG_A_HNP_SUPPORT = 4, + USB_DEV_FEATURE_OTG_A_ALT_HNP_SUPPORT = 5 +}; + +/** + * \brief Test Mode possible on HS USB device + * + * \note valid for USB_DEV_FEATURE_TEST_MODE request. + */ +enum usb_device_hs_test_mode { + USB_DEV_TEST_MODE_J = 1, + USB_DEV_TEST_MODE_K = 2, + USB_DEV_TEST_MODE_SE0_NAK = 3, + USB_DEV_TEST_MODE_PACKET = 4, + USB_DEV_TEST_MODE_FORCE_ENABLE = 5, +}; + +/** + * \brief Standard USB endpoint feature/status flags + */ +enum usb_endpoint_feature { + USB_EP_FEATURE_HALT = 0, +}; + +/** + * \brief Standard USB Test Mode Selectors + */ +enum usb_test_mode_selector { + USB_TEST_J = 0x01, + USB_TEST_K = 0x02, + USB_TEST_SE0_NAK = 0x03, + USB_TEST_PACKET = 0x04, + USB_TEST_FORCE_ENABLE = 0x05, +}; + +/** + * \brief Standard USB descriptor types + */ +enum usb_descriptor_type { + USB_DT_DEVICE = 1, + USB_DT_CONFIGURATION = 2, + USB_DT_STRING = 3, + USB_DT_INTERFACE = 4, + USB_DT_ENDPOINT = 5, + USB_DT_DEVICE_QUALIFIER = 6, + USB_DT_OTHER_SPEED_CONFIGURATION = 7, + USB_DT_INTERFACE_POWER = 8, + USB_DT_OTG = 9, + USB_DT_IAD = 0x0B, + USB_DT_BOS = 0x0F, + USB_DT_DEVICE_CAPABILITY = 0x10, +}; + +/** + * \brief USB Device Capability types + */ +enum usb_capability_type { + USB_DC_USB20_EXTENSION = 0x02, +}; + +/** + * \brief USB Device Capability - USB 2.0 Extension + * To fill bmAttributes field of usb_capa_ext_desc_t structure. + */ +enum usb_capability_extension_attr { + USB_DC_EXT_LPM = 0x00000002, +}; + +#define HIRD_50_US 0 +#define HIRD_125_US 1 +#define HIRD_200_US 2 +#define HIRD_275_US 3 +#define HIRD_350_US 4 +#define HIRD_425_US 5 +#define HIRD_500_US 6 +#define HIRD_575_US 7 +#define HIRD_650_US 8 +#define HIRD_725_US 9 +#define HIRD_800_US 10 +#define HIRD_875_US 11 +#define HIRD_950_US 12 +#define HIRD_1025_US 13 +#define HIRD_1100_US 14 +#define HIRD_1175_US 15 + +/** Fields definition from a LPM TOKEN */ +#define USB_LPM_ATTRIBUT_BLINKSTATE_MASK (0xF << 0) +#define USB_LPM_ATTRIBUT_FIRD_MASK (0xF << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE_MASK (1 << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE(value) ((value & 0xF) << 0) +#define USB_LPM_ATTRIBUT_FIRD(value) ((value & 0xF) << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE(value) ((value & 1) << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE_L1 USB_LPM_ATTRIBUT_BLINKSTATE(1) + +/** + * \brief Standard USB endpoint transfer types + */ +enum usb_ep_type { + USB_EP_TYPE_CONTROL = 0x00, + USB_EP_TYPE_ISOCHRONOUS = 0x01, + USB_EP_TYPE_BULK = 0x02, + USB_EP_TYPE_INTERRUPT = 0x03, + USB_EP_TYPE_MASK = 0x03, +}; + +/** + * \brief Standard USB language IDs for string descriptors + */ +enum usb_langid { + USB_LANGID_EN_US = 0x0409, //!< English (United States) +}; + +/** + * \brief Mask selecting the index part of an endpoint address + */ +#define USB_EP_ADDR_MASK 0x0F + +//! \brief USB address identifier +typedef uint8_t usb_add_t; + +/** + * \brief Endpoint transfer direction is IN + */ +#define USB_EP_DIR_IN 0x80 + +/** + * \brief Endpoint transfer direction is OUT + */ +#define USB_EP_DIR_OUT 0x00 + +//! \brief Endpoint identifier +typedef uint8_t usb_ep_t; + +/** + * \brief Maximum length in bytes of a USB descriptor + * + * The maximum length of a USB descriptor is limited by the 8-bit + * bLength field. + */ +#define USB_MAX_DESC_LEN 255 + +/* + * 2-byte alignment requested for all USB structures. + */ +COMPILER_PACK_SET(1) + +/** + * \brief A USB Device SETUP request + * + * The data payload of SETUP packets always follows this structure. + */ +typedef struct { + uint8_t bmRequestType; + uint8_t bRequest; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_setup_req_t; + +/** + * \brief Standard USB device descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + le16_t idVendor; + le16_t idProduct; + le16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} usb_dev_desc_t; + +/** + * \brief Standard USB device qualifier descriptor structure + * + * This descriptor contains information about the device when running at + * the "other" speed (i.e. if the device is currently operating at high + * speed, this descriptor can be used to determine what would change if + * the device was operating at full speed.) + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} usb_dev_qual_desc_t; + +/** + * \brief USB Device BOS descriptor structure + * + * The BOS descriptor (Binary device Object Store) defines a root + * descriptor that is similar to the configuration descriptor, and is + * the base descriptor for accessing a family of related descriptors. + * A host can read a BOS descriptor and learn from the wTotalLength field + * the entire size of the device-level descriptor set, or it can read in + * the entire BOS descriptor set of device capabilities. + * The host accesses this descriptor using the GetDescriptor() request. + * The descriptor type in the GetDescriptor() request is set to BOS. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumDeviceCaps; +} usb_dev_bos_desc_t; + + +/** + * \brief USB Device Capabilities - USB 2.0 Extension Descriptor structure + * + * Defines the set of USB 1.1-specific device level capabilities. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + le32_t bmAttributes; +} usb_dev_capa_ext_desc_t; + +/** + * \brief USB Device LPM Descriptor structure + * + * The BOS descriptor and capabilities descriptors for LPM. + */ +typedef struct { + usb_dev_bos_desc_t bos; + usb_dev_capa_ext_desc_t capa_ext; +} usb_dev_lpm_desc_t; + +/** + * \brief Standard USB Interface Association Descriptor structure + */ +typedef struct { + uint8_t bLength; //!< size of this descriptor in bytes + uint8_t bDescriptorType; //!< INTERFACE descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass;//!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol;//!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_association_desc_t; + + +/** + * \brief Standard USB configuration descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} usb_conf_desc_t; + + +#define USB_CONFIG_ATTR_MUST_SET (1 << 7) //!< Must always be set +#define USB_CONFIG_ATTR_BUS_POWERED (0 << 6) //!< Bus-powered +#define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) //!< Self-powered +#define USB_CONFIG_ATTR_REMOTE_WAKEUP (1 << 5) //!< remote wakeup supported + +#define USB_CONFIG_MAX_POWER(ma) (((ma) + 1) / 2) //!< Max power in mA + +/** + * \brief Standard USB association descriptor structure + */ +typedef struct { + uint8_t bLength; //!< Size of this descriptor in bytes + uint8_t bDescriptorType; //!< Interface descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass; //!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol; //!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_iad_desc_t; + +/** + * \brief Standard USB interface descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} usb_iface_desc_t; + +/** + * \brief Standard USB endpoint descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + le16_t wMaxPacketSize; + uint8_t bInterval; +} usb_ep_desc_t; + + +/** + * \brief A standard USB string descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; +} usb_str_desc_t; + +typedef struct { + usb_str_desc_t desc; + le16_t string[1]; +} usb_str_lgid_desc_t; + +COMPILER_PACK_RESET() + +//! @} + +#endif /* _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 new file mode 100644 index 00000000..d594db52 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h @@ -0,0 +1,320 @@ +/** + * \file + * + * \brief USB Communication Device Class (CDC) protocol definitions + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _USB_PROTOCOL_CDC_H_ +#define _USB_PROTOCOL_CDC_H_ + +#include "compiler.h" + +/** + * \ingroup usb_protocol_group + * \defgroup cdc_protocol_group Communication Device Class Definitions + * @{ + */ + +/** + * \name Possible values of class + */ +//@{ +#define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class +#define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface +#define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface +#define CDC_CLASS_MULTI 0xEF //!< CDC Multi-interface Function + +//@} + +//! \name USB CDC Subclass IDs +//@{ +#define CDC_SUBCLASS_DLCM 0x01 //!< Direct Line Control Model +#define CDC_SUBCLASS_ACM 0x02 //!< Abstract Control Model +#define CDC_SUBCLASS_TCM 0x03 //!< Telephone Control Model +#define CDC_SUBCLASS_MCCM 0x04 //!< Multi-Channel Control Model +#define CDC_SUBCLASS_CCM 0x05 //!< CAPI Control Model +#define CDC_SUBCLASS_ETH 0x06 //!< Ethernet Networking Control Model +#define CDC_SUBCLASS_ATM 0x07 //!< ATM Networking Control Model +//@} + +//! \name USB CDC Communication Interface Protocol IDs +//@{ +#define CDC_PROTOCOL_V25TER 0x01 //!< Common AT commands +//@} + +//! \name USB CDC Data Interface Protocol IDs +//@{ +#define CDC_PROTOCOL_I430 0x30 //!< ISDN BRI +#define CDC_PROTOCOL_HDLC 0x31 //!< HDLC +#define CDC_PROTOCOL_TRANS 0x32 //!< Transparent +#define CDC_PROTOCOL_Q921M 0x50 //!< Q.921 management protocol +#define CDC_PROTOCOL_Q921 0x51 //!< Q.931 [sic] Data link protocol +#define CDC_PROTOCOL_Q921TM 0x52 //!< Q.921 TEI-multiplexor +#define CDC_PROTOCOL_V42BIS 0x90 //!< Data compression procedures +#define CDC_PROTOCOL_Q931 0x91 //!< Euro-ISDN protocol control +#define CDC_PROTOCOL_V120 0x92 //!< V.24 rate adaption to ISDN +#define CDC_PROTOCOL_CAPI20 0x93 //!< CAPI Commands +#define CDC_PROTOCOL_HOST 0xFD //!< Host based driver +/** + * \brief Describes the Protocol Unit Functional Descriptors [sic] + * on Communication Class Interface + */ +#define CDC_PROTOCOL_PUFD 0xFE +//@} + +//! \name USB CDC Functional Descriptor Types +//@{ +#define CDC_CS_INTERFACE 0x24 //!< Interface Functional Descriptor +#define CDC_CS_ENDPOINT 0x25 //!< Endpoint Functional Descriptor +//@} + +//! \name USB CDC Functional Descriptor Subtypes +//@{ +#define CDC_SCS_HEADER 0x00 //!< Header Functional Descriptor +#define CDC_SCS_CALL_MGMT 0x01 //!< Call Management +#define CDC_SCS_ACM 0x02 //!< Abstract Control Management +#define CDC_SCS_UNION 0x06 //!< Union Functional Descriptor +//@} + +//! \name USB CDC Request IDs +//@{ +#define USB_REQ_CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define USB_REQ_CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define USB_REQ_CDC_SET_COMM_FEATURE 0x02 +#define USB_REQ_CDC_GET_COMM_FEATURE 0x03 +#define USB_REQ_CDC_CLEAR_COMM_FEATURE 0x04 +#define USB_REQ_CDC_SET_AUX_LINE_STATE 0x10 +#define USB_REQ_CDC_SET_HOOK_STATE 0x11 +#define USB_REQ_CDC_PULSE_SETUP 0x12 +#define USB_REQ_CDC_SEND_PULSE 0x13 +#define USB_REQ_CDC_SET_PULSE_TIME 0x14 +#define USB_REQ_CDC_RING_AUX_JACK 0x15 +#define USB_REQ_CDC_SET_LINE_CODING 0x20 +#define USB_REQ_CDC_GET_LINE_CODING 0x21 +#define USB_REQ_CDC_SET_CONTROL_LINE_STATE 0x22 +#define USB_REQ_CDC_SEND_BREAK 0x23 +#define USB_REQ_CDC_SET_RINGER_PARMS 0x30 +#define USB_REQ_CDC_GET_RINGER_PARMS 0x31 +#define USB_REQ_CDC_SET_OPERATION_PARMS 0x32 +#define USB_REQ_CDC_GET_OPERATION_PARMS 0x33 +#define USB_REQ_CDC_SET_LINE_PARMS 0x34 +#define USB_REQ_CDC_GET_LINE_PARMS 0x35 +#define USB_REQ_CDC_DIAL_DIGITS 0x36 +#define USB_REQ_CDC_SET_UNIT_PARAMETER 0x37 +#define USB_REQ_CDC_GET_UNIT_PARAMETER 0x38 +#define USB_REQ_CDC_CLEAR_UNIT_PARAMETER 0x39 +#define USB_REQ_CDC_GET_PROFILE 0x3A +#define USB_REQ_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define USB_REQ_CDC_SET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x41 +#define USB_REQ_CDC_GET_ETHERNET_POWER_MANAGEMENT_PATTERNFILTER 0x42 +#define USB_REQ_CDC_SET_ETHERNET_PACKET_FILTER 0x43 +#define USB_REQ_CDC_GET_ETHERNET_STATISTIC 0x44 +#define USB_REQ_CDC_SET_ATM_DATA_FORMAT 0x50 +#define USB_REQ_CDC_GET_ATM_DEVICE_STATISTICS 0x51 +#define USB_REQ_CDC_SET_ATM_DEFAULT_VC 0x52 +#define USB_REQ_CDC_GET_ATM_VC_STATISTICS 0x53 +// Added bNotification codes according cdc spec 1.1 chapter 6.3 +#define USB_REQ_CDC_NOTIFY_RING_DETECT 0x09 +#define USB_REQ_CDC_NOTIFY_SERIAL_STATE 0x20 +#define USB_REQ_CDC_NOTIFY_CALL_STATE_CHANGE 0x28 +#define USB_REQ_CDC_NOTIFY_LINE_STATE_CHANGE 0x29 +//@} + +/* + * Need to pack structures tightly, or the compiler might insert padding + * and violate the spec-mandated layout. + */ +COMPILER_PACK_SET(1) + +//! \name USB CDC Descriptors +//@{ + + +//! CDC Header Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + le16_t bcdCDC; +} usb_cdc_hdr_desc_t; + +//! CDC Call Management Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; + uint8_t bDataInterface; +} usb_cdc_call_mgmt_desc_t; + +//! CDC ACM Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; +} usb_cdc_acm_desc_t; + +//! CDC Union Functional Descriptor +typedef struct { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bMasterInterface; + uint8_t bSlaveInterface0; +} usb_cdc_union_desc_t; + + +//! \name USB CDC Call Management Capabilities +//@{ +//! Device handles call management itself +#define CDC_CALL_MGMT_SUPPORTED (1 << 0) +//! Device can send/receive call management info over a Data Class interface +#define CDC_CALL_MGMT_OVER_DCI (1 << 1) +//@} + +//! \name USB CDC ACM Capabilities +//@{ +//! Device supports the request combination of +//! Set_Comm_Feature, Clear_Comm_Feature, and Get_Comm_Feature. +#define CDC_ACM_SUPPORT_FEATURE_REQUESTS (1 << 0) +//! Device supports the request combination of +//! Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, +//! and the notification Serial_State. +#define CDC_ACM_SUPPORT_LINE_REQUESTS (1 << 1) +//! Device supports the request Send_Break +#define CDC_ACM_SUPPORT_SENDBREAK_REQUESTS (1 << 2) +//! Device supports the notification Network_Connection. +#define CDC_ACM_SUPPORT_NOTIFY_REQUESTS (1 << 3) +//@} +//@} + +//! \name USB CDC line control +//@{ + +//! \name USB CDC line coding +//@{ +//! Line Coding structure +typedef struct { + le32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; +} usb_cdc_line_coding_t; +//! Possible values of bCharFormat +enum cdc_char_format { + CDC_STOP_BITS_1 = 0, //!< 1 stop bit + CDC_STOP_BITS_1_5 = 1, //!< 1.5 stop bits + CDC_STOP_BITS_2 = 2, //!< 2 stop bits +}; +//! Possible values of bParityType +enum cdc_parity { + CDC_PAR_NONE = 0, //!< No parity + CDC_PAR_ODD = 1, //!< Odd parity + CDC_PAR_EVEN = 2, //!< Even parity + CDC_PAR_MARK = 3, //!< Parity forced to 0 (space) + CDC_PAR_SPACE = 4, //!< Parity forced to 1 (mark) +}; +//@} + +//! \name USB CDC control signals +//! spec 1.1 chapter 6.2.14 +//@{ + +//! Control signal structure +typedef struct { + uint16_t value; +} usb_cdc_control_signal_t; + +//! \name Possible values in usb_cdc_control_signal_t +//@{ +//! Carrier control for half duplex modems. +//! This signal corresponds to V.24 signal 105 and RS-232 signal RTS. +//! The device ignores the value of this bit +//! when operating in full duplex mode. +#define CDC_CTRL_SIGNAL_ACTIVATE_CARRIER (1 << 1) +//! Indicates to DCE if DTE is present or not. +//! This signal corresponds to V.24 signal 108/2 and RS-232 signal DTR. +#define CDC_CTRL_SIGNAL_DTE_PRESENT (1 << 0) +//@} +//@} + + +//! \name USB CDC notification message +//@{ + +typedef struct { + uint8_t bmRequestType; + uint8_t bNotification; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_cdc_notify_msg_t; + +//! \name USB CDC serial state +//@{* + +//! Hardware handshake support (cdc spec 1.1 chapter 6.3.5) +typedef struct { + usb_cdc_notify_msg_t header; + le16_t value; +} usb_cdc_notify_serial_state_t; + +//! \name Possible values in usb_cdc_notify_serial_state_t +//@{ +#define CDC_SERIAL_STATE_DCD CPU_TO_LE16((1<<0)) +#define CDC_SERIAL_STATE_DSR CPU_TO_LE16((1<<1)) +#define CDC_SERIAL_STATE_BREAK CPU_TO_LE16((1<<2)) +#define CDC_SERIAL_STATE_RING CPU_TO_LE16((1<<3)) +#define CDC_SERIAL_STATE_FRAMING CPU_TO_LE16((1<<4)) +#define CDC_SERIAL_STATE_PARITY CPU_TO_LE16((1<<5)) +#define CDC_SERIAL_STATE_OVERRUN CPU_TO_LE16((1<<6)) +//@} +//! @} + +//! @} + +COMPILER_PACK_RESET() + +//! @} + +#endif // _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 new file mode 100644 index 00000000..0fef3080 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h @@ -0,0 +1,147 @@ +/** + * \file + * + * \brief USB Mass Storage Class (MSC) protocol definitions. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_MSC_H_ +#define _USB_PROTOCOL_MSC_H_ + + +/** + * \ingroup usb_protocol_group + * \defgroup usb_msc_protocol USB Mass Storage Class (MSC) protocol definitions + * + * @{ + */ + +/** + * \name Possible Class value + */ +//@{ +#define MSC_CLASS 0x08 +//@} + +/** + * \name Possible SubClass value + * \note In practise, most devices should use + * #MSC_SUBCLASS_TRANSPARENT and specify the actual command set in + * the standard INQUIRY data block, even if the MSC spec indicates + * otherwise. In particular, RBC is not supported by certain major + * operating systems like Windows XP. + */ +//@{ +#define MSC_SUBCLASS_RBC 0x01 //!< Reduced Block Commands +#define MSC_SUBCLASS_ATAPI 0x02 //!< CD/DVD devices +#define MSC_SUBCLASS_QIC_157 0x03 //!< Tape devices +#define MSC_SUBCLASS_UFI 0x04 //!< Floppy disk drives +#define MSC_SUBCLASS_SFF_8070I 0x05 //!< Floppy disk drives +#define MSC_SUBCLASS_TRANSPARENT 0x06 //!< Determined by INQUIRY +//@} + +/** + * \name Possible protocol value + * \note Only the BULK protocol should be used in new designs. + */ +//@{ +#define MSC_PROTOCOL_CBI 0x00 //!< Command/Bulk/Interrupt +#define MSC_PROTOCOL_CBI_ALT 0x01 //!< W/o command completion +#define MSC_PROTOCOL_BULK 0x50 //!< Bulk-only +//@} + + +/** + * \brief MSC USB requests (bRequest) + */ +enum usb_reqid_msc { + USB_REQ_MSC_BULK_RESET = 0xFF, //!< Mass Storage Reset + USB_REQ_MSC_GET_MAX_LUN = 0xFE //!< Get Max LUN +}; + + +COMPILER_PACK_SET(1) + +/** + * \name A Command Block Wrapper (CBW). + */ +//@{ +struct usb_msc_cbw { + le32_t dCBWSignature; //!< Must contain 'USBC' + le32_t dCBWTag; //!< Unique command ID + le32_t dCBWDataTransferLength; //!< Number of bytes to transfer + uint8_t bmCBWFlags; //!< Direction in bit 7 + uint8_t bCBWLUN; //!< Logical Unit Number + uint8_t bCBWCBLength; //!< Number of valid CDB bytes + uint8_t CDB[16]; //!< SCSI Command Descriptor Block +}; + +#define USB_CBW_SIGNATURE 0x55534243 //!< dCBWSignature value +#define USB_CBW_DIRECTION_IN (1<<7) //!< Data from device to host +#define USB_CBW_DIRECTION_OUT (0<<7) //!< Data from host to device +#define USB_CBW_LUN_MASK 0x0F //!< Valid bits in bCBWLUN +#define USB_CBW_LEN_MASK 0x1F //!< Valid bits in bCBWCBLength +//@} + + +/** + * \name A Command Status Wrapper (CSW). + */ +//@{ +struct usb_msc_csw { + le32_t dCSWSignature; //!< Must contain 'USBS' + le32_t dCSWTag; //!< Same as dCBWTag + le32_t dCSWDataResidue; //!< Number of bytes not transfered + uint8_t bCSWStatus; //!< Status code +}; + +#define USB_CSW_SIGNATURE 0x55534253 //!< dCSWSignature value +#define USB_CSW_STATUS_PASS 0x00 //!< Command Passed +#define USB_CSW_STATUS_FAIL 0x01 //!< Command Failed +#define USB_CSW_STATUS_PE 0x02 //!< Phase Error +//@} + +COMPILER_PACK_RESET() + +//@} + +#endif // _USB_PROTOCOL_MSC_H_ diff --git a/Marlin/src/HAL/DUE/usb/usb_task.c b/Marlin/src/HAL/DUE/usb/usb_task.c new file mode 100644 index 00000000..66bdb265 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/usb_task.c @@ -0,0 +1,341 @@ +/** + * \file + * + * \brief Main functions for USB composite example + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ + +// Support and FAQ: visit Atmel Support + +#ifdef ARDUINO_ARCH_SAM + +#include +#include + +#include "conf_usb.h" +#include "udc.h" + +#if ENABLED(SDSUPPORT) + static volatile bool main_b_msc_enable = false; +#endif +static volatile bool main_b_cdc_enable = false; +static volatile bool main_b_dtr_active = false; + +void usb_task_idle(void) { + #if ENABLED(SDSUPPORT) + // Attend SD card access from the USB MSD -- Prioritize access to improve speed + int delay = 2; + while (main_b_msc_enable && --delay > 0) { + if (udi_msc_process_trans()) delay = 10000; + + // Reset the watchdog, just to be sure + REG_WDT_CR = WDT_CR_WDRSTT | WDT_CR_KEY(0xA5); + } + #endif +} + +#if ENABLED(SDSUPPORT) + bool usb_task_msc_enable(void) { return ((main_b_msc_enable = true)); } + void usb_task_msc_disable(void) { main_b_msc_enable = false; } + bool usb_task_msc_isenabled(void) { return main_b_msc_enable; } +#endif + +bool usb_task_cdc_enable(const uint8_t port) { UNUSED(port); return ((main_b_cdc_enable = true)); } +void usb_task_cdc_disable(const uint8_t port) { UNUSED(port); main_b_cdc_enable = false; main_b_dtr_active = false; } +bool usb_task_cdc_isenabled(void) { return main_b_cdc_enable; } + +/*! \brief Called by CDC interface + * Callback running when CDC device have received data + */ +void usb_task_cdc_rx_notify(const uint8_t port) { UNUSED(port); } + +/*! \brief Configures communication line + * + * \param cfg line configuration + */ +static uint16_t dwDTERate = 0; +void usb_task_cdc_config(const uint8_t port, usb_cdc_line_coding_t *cfg) { + UNUSED(port); + // Store last DTE rate + dwDTERate = cfg->dwDTERate; +} + +void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable) { + UNUSED(port); + // Keep DTR status + main_b_dtr_active = b_enable; + + // Implement Arduino-Compatible kludge to enter programming mode from + // the native port: + // "Auto-reset into the bootloader is triggered when the port, already + // open at 1200 bps, is closed." + + if (1200 == dwDTERate) { + // We check DTR state to determine if host port is open (bit 0 of lineState). + if (!b_enable) { + + // Set RST pin to go low for 65535 clock cycles on reset + // This helps restarting when firmware flash ends + RSTC->RSTC_MR = 0xA5000F01; + + // Schedule delayed reset + initiateReset(250); + } + else + cancelReset(); + } +} + +bool usb_task_cdc_dtr_active(void) { return main_b_dtr_active; } + +/// Microsoft WCID descriptor +typedef struct USB_MicrosoftCompatibleDescriptor_Interface { + uint8_t bFirstInterfaceNumber; + uint8_t reserved1; + uint8_t compatibleID[8]; + uint8_t subCompatibleID[8]; + uint8_t reserved2[6]; +} __attribute__((packed)) USB_MicrosoftCompatibleDescriptor_Interface; + +typedef struct USB_MicrosoftCompatibleDescriptor { + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint8_t bCount; + uint8_t reserved[7]; + USB_MicrosoftCompatibleDescriptor_Interface interfaces[]; +} __attribute__((packed)) USB_MicrosoftCompatibleDescriptor; + +// 3D Printer compatible descriptor +static USB_MicrosoftCompatibleDescriptor microsoft_compatible_id_descriptor = { + .dwLength = sizeof(USB_MicrosoftCompatibleDescriptor) + + 1*sizeof(USB_MicrosoftCompatibleDescriptor_Interface), + .bcdVersion = 0x0100, + .wIndex = 0x0004, + .bCount = 1, + .reserved = {0, 0, 0, 0, 0, 0, 0}, + .interfaces = { + { + .bFirstInterfaceNumber = 0, + .reserved1 = 1, + .compatibleID = "3DPRINT", + .subCompatibleID = {0, 0, 0, 0, 0, 0, 0, 0}, + .reserved2 = {0, 0, 0, 0, 0, 0}, + } + } +}; + +#define xstr(s) str(s) +#define str(s) #s + +#define MS3DPRINT_CONFIG u"MS3DPrintConfig" +#define MS3DPRINT_CONFIG_DATA \ + u"Base=SD\0"\ + u"Job3DOutputAreaWidth=" xstr(X_BED_SIZE) "000\0"\ + u"Job3DOutputAreaDepth=" xstr(Y_BED_SIZE) "000\0"\ + u"Job3DOutputAreaHeight=" xstr(Z_MAX_POS) "000\0"\ + u"filamentdiameter=1750\0" + +typedef struct USB_MicrosoftExtendedPropertiesDescriptor { + uint32_t dwLength; + uint16_t bcdVersion; + uint16_t wIndex; + uint16_t bCount; + uint32_t dwPropertySize; + uint32_t dwPropertyDataType; + uint16_t wPropertyNameLength; + uint16_t PropertyName[sizeof(MS3DPRINT_CONFIG)/sizeof(uint16_t)]; + uint32_t dwPropertyDataLength; + uint16_t PropertyData[sizeof(MS3DPRINT_CONFIG_DATA)/sizeof(uint16_t)]; +} __attribute__((packed)) USB_MicrosoftExtendedPropertiesDescriptor; + +static USB_MicrosoftExtendedPropertiesDescriptor microsoft_extended_properties_descriptor = { + .dwLength = sizeof(USB_MicrosoftExtendedPropertiesDescriptor), + .bcdVersion = 0x0100, + .wIndex = 0x0005, + .bCount = 1, + + .dwPropertySize = 4 + 4 + 2 + 4 + sizeof(MS3DPRINT_CONFIG) + sizeof(MS3DPRINT_CONFIG_DATA), + .dwPropertyDataType = 7, // (1=REG_SZ, 4=REG_DWORD, 7=REG_MULTI_SZ) + .wPropertyNameLength = sizeof(MS3DPRINT_CONFIG), + .PropertyName = MS3DPRINT_CONFIG, + .dwPropertyDataLength = sizeof(MS3DPRINT_CONFIG_DATA), + .PropertyData = MS3DPRINT_CONFIG_DATA +}; + +/************************************************************************************************** +** WCID configuration information +** Hooked into UDC via UDC_GET_EXTRA_STRING #define. +*/ +bool usb_task_extra_string(void) { + static uint8_t udi_msft_magic[] = "MSFT100\xEE"; + static uint8_t udi_cdc_name[] = "CDC interface"; + #if ENABLED(SDSUPPORT) + static uint8_t udi_msc_name[] = "MSC interface"; + #endif + + struct extra_strings_desc_t { + usb_str_desc_t header; + #if ENABLED(SDSUPPORT) + le16_t string[Max(Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msc_name) - 1), sizeof(udi_msft_magic) - 1)]; + #else + le16_t string[Max(sizeof(udi_cdc_name) - 1, sizeof(udi_msft_magic) - 1)]; + #endif + }; + static UDC_DESC_STORAGE struct extra_strings_desc_t extra_strings_desc = { + .header.bDescriptorType = USB_DT_STRING + }; + + uint8_t *str; + uint8_t str_lgt = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xFF) { + case UDI_CDC_IAD_STRING_ID: + str_lgt = sizeof(udi_cdc_name) - 1; + str = udi_cdc_name; + break; + #if ENABLED(SDSUPPORT) + case UDI_MSC_STRING_ID: + str_lgt = sizeof(udi_msc_name) - 1; + str = udi_msc_name; + break; + #endif + case 0xEE: + str_lgt = sizeof(udi_msft_magic) - 1; + str = udi_msft_magic; + break; + default: + return false; + } + + for (uint8_t i = 0; i < str_lgt; i++) + extra_strings_desc.string[i] = cpu_to_le16((le16_t)str[i]); + + extra_strings_desc.header.bLength = 2 + str_lgt * 2; + udd_g_ctrlreq.payload_size = extra_strings_desc.header.bLength; + udd_g_ctrlreq.payload = (uint8_t*)&extra_strings_desc; + + // if the string is larger than request length, then cut it + if (udd_g_ctrlreq.payload_size > udd_g_ctrlreq.req.wLength) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + + return true; +} + +/************************************************************************************************** +** Handle device requests that the ASF stack doesn't +*/ +bool usb_task_other_requests(void) { + uint8_t* ptr = 0; + uint16_t size = 0; + + if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) { + //if (udd_g_ctrlreq.req.bRequest == 0x30) + if (1) { + if (udd_g_ctrlreq.req.wIndex == 0x04) { + ptr = (uint8_t*)µsoft_compatible_id_descriptor; + size = (udd_g_ctrlreq.req.wLength); + if (size > microsoft_compatible_id_descriptor.dwLength) + size = microsoft_compatible_id_descriptor.dwLength; + } + else if (udd_g_ctrlreq.req.wIndex == 0x05) { + ptr = (uint8_t*)µsoft_extended_properties_descriptor; + size = (udd_g_ctrlreq.req.wLength); + if (size > microsoft_extended_properties_descriptor.dwLength) + size = microsoft_extended_properties_descriptor.dwLength; + } + else + return false; + } + } + + udd_g_ctrlreq.payload_size = size; + if (size == 0) { + udd_g_ctrlreq.callback = 0; + udd_g_ctrlreq.over_under_run = 0; + } + else + udd_g_ctrlreq.payload = ptr; + + return true; +} + +void usb_task_init(void) { + + uint16_t *ptr; + + // Disable USB peripheral so we start clean and avoid lockups + otg_disable(); + udd_disable(); + + // Set the USB interrupt to our stack + UDD_SetStack(&USBD_ISR); + + // Start USB stack to authorize VBus monitoring + udc_start(); + + // Patch in filament diameter - Be careful: String is in UNICODE (2bytes per char) + ptr = µsoft_extended_properties_descriptor.PropertyData[0]; + while (ptr[0] || ptr[1]) { // Double 0 flags end of resource + + // Found the filamentdiameter= unicode string + if (ptr[0] == 'r' && ptr[1] == '=') { + char diam[16]; + char *sptr; + + // Patch in the filament diameter + sprintf_P(diam, PSTR("%d"), (int)((DEFAULT_NOMINAL_FILAMENT_DIA) * 1000.0)); + + // And copy it to the proper place, expanding it to unicode + sptr = &diam[0]; + ptr += 2; + while (*sptr) *ptr++ = *sptr++; + + // Done! + break; + } + + // Go to the next character + ptr++; + } +} + +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/usb/usb_task.h b/Marlin/src/HAL/DUE/usb/usb_task.h new file mode 100644 index 00000000..e9831ae0 --- /dev/null +++ b/Marlin/src/HAL/DUE/usb/usb_task.h @@ -0,0 +1,134 @@ +/** + * \file + * + * \brief Declaration of main function used by Composite example 4 + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * 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. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_TASK_H_ +#define _USB_TASK_H_ + +#include "usb_protocol_cdc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \brief Called by MSC interface + * Callback running when USB Host enable MSC interface + * + * \retval true if MSC startup is ok + */ +bool usb_task_msc_enable(void); + +/*! \brief Called by MSC interface + * Callback running when USB Host disable MSC interface + */ +void usb_task_msc_disable(void); + +/*! \brief Opens the communication port + * This is called by CDC interface when USB Host enable it. + * + * \retval true if cdc startup is successfully done + */ +bool usb_task_cdc_enable(const uint8_t port); + +/*! \brief Closes the communication port + * This is called by CDC interface when USB Host disable it. + */ +void usb_task_cdc_disable(const uint8_t port); + +/*! \brief Save new DTR state to change led behavior. + * The DTR notify that the terminal have open or close the communication port. + */ +void usb_task_cdc_set_dtr(const uint8_t port, const bool b_enable); + +/*! \brief Check if MSC is enumerated and configured on the PC side + */ +bool usb_task_msc_isenabled(void); + +/*! \brief Check if CDC is enumerated and configured on the PC side + */ +bool usb_task_cdc_isenabled(void); + +/*! \brief Check if CDC is actually OPEN by an application on the PC side + * assuming DTR signal means a program is listening to messages + */ +bool usb_task_cdc_dtr_active(void); + +/*! \brief Called by UDC when USB Host request a extra string different + * of this specified in USB device descriptor + */ +bool usb_task_extra_string(void); + +/*! \brief Called by UDC when USB Host performs unknown requests + */ +bool usb_task_other_requests(void); + +/*! \brief Called by CDC interface + * Callback running when CDC device have received data + */ +void usb_task_cdc_rx_notify(const uint8_t port); + +/*! \brief Configures communication line + * + * \param cfg line configuration + */ +void usb_task_cdc_config(const uint8_t port, usb_cdc_line_coding_t *cfg); + +/*! \brief The USB device interrupt + */ +void USBD_ISR(void); + +/*! \brief USB task init + */ +void usb_task_init(void); + +/*! \brief USB task idle + */ +void usb_task_idle(void); + +#ifdef __cplusplus +} +#endif + +#endif // _USB_TASK_H_ diff --git a/Marlin/src/HAL/DUE/watchdog.cpp b/Marlin/src/HAL/DUE/watchdog.cpp new file mode 100644 index 00000000..0f469718 --- /dev/null +++ b/Marlin/src/HAL/DUE/watchdog.cpp @@ -0,0 +1,114 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfig.h" +#include "../../MarlinCore.h" +#include "watchdog.h" + +// Override Arduino runtime to either config or disable the watchdog +// +// We need to configure the watchdog as soon as possible in the boot +// process, because watchdog initialization at hardware reset on SAM3X8E +// is unreliable, and there is risk of unintended resets if we delay +// that initialization to a later time. +void watchdogSetup() { + + #if ENABLED(USE_WATCHDOG) + + // 4 seconds timeout + uint32_t timeout = 4000; + + // Calculate timeout value in WDT counter ticks: This assumes + // the slow clock is running at 32.768 kHz watchdog + // frequency is therefore 32768 / 128 = 256 Hz + timeout = (timeout << 8) / 1000; + if (timeout == 0) + timeout = 1; + else if (timeout > 0xFFF) + timeout = 0xFFF; + + // We want to enable the watchdog with the specified timeout + uint32_t value = + WDT_MR_WDV(timeout) | // With the specified timeout + WDT_MR_WDD(timeout) | // and no invalid write window + #if !(SAMV70 || SAMV71 || SAME70 || SAMS70) + WDT_MR_WDRPROC | // WDT fault resets processor only - We want + // to keep PIO controller state + #endif + WDT_MR_WDDBGHLT | // WDT stops in debug state. + WDT_MR_WDIDLEHLT; // WDT stops in idle state. + + #if ENABLED(WATCHDOG_RESET_MANUAL) + // We enable the watchdog timer, but only for the interrupt. + + // Configure WDT to only trigger an interrupt + value |= WDT_MR_WDFIEN; // Enable WDT fault interrupt. + + // Disable WDT interrupt (just in case, to avoid triggering it!) + NVIC_DisableIRQ(WDT_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Initialize WDT with the given parameters + WDT_Enable(WDT, value); + + // Configure and enable WDT interrupt. + NVIC_ClearPendingIRQ(WDT_IRQn); + NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups + NVIC_EnableIRQ(WDT_IRQn); + + #else + + // a WDT fault triggers a reset + value |= WDT_MR_WDRSTEN; + + // Initialize WDT with the given parameters + WDT_Enable(WDT, value); + + #endif + + // Reset the watchdog + WDT_Restart(WDT); + + #else + + // Make sure to completely disable the Watchdog + WDT_Disable(WDT); + + #endif +} + +#if ENABLED(USE_WATCHDOG) + // Initialize watchdog - On SAM3X, Watchdog was already configured + // and enabled or disabled at startup, so no need to reconfigure it + // here. + void watchdog_init() { + // Reset watchdog to start clean + WDT_Restart(WDT); + } +#endif // USE_WATCHDOG + +#endif diff --git a/Marlin/src/HAL/DUE/watchdog.h b/Marlin/src/HAL/DUE/watchdog.h new file mode 100644 index 00000000..5725a100 --- /dev/null +++ b/Marlin/src/HAL/DUE/watchdog.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 + +// Arduino Due core now has watchdog support + +#include "HAL.h" + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or AVR will go into emergency procedures. +inline void HAL_watchdog_refresh() { watchdogReset(); } diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp new file mode 100644 index 00000000..d4b2f42c --- /dev/null +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -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 . + * + */ + +#include "FlushableHardwareSerial.h" + +#ifdef ARDUINO_ARCH_ESP32 + +FlushableHardwareSerial::FlushableHardwareSerial(int uart_nr) + : HardwareSerial(uart_nr) +{} + +FlushableHardwareSerial flushableSerial(0); + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h new file mode 100644 index 00000000..b43caea1 --- /dev/null +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -0,0 +1,37 @@ +/** + * 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 ARDUINO_ARCH_ESP32 + +#include + +class FlushableHardwareSerial : public HardwareSerial { +public: + FlushableHardwareSerial(int uart_nr); + + inline void flushTX() { /* No need to flush the hardware serial, but defined here for compatibility. */ } +}; + +extern FlushableHardwareSerial flushableSerial; + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp new file mode 100644 index 00000000..1e00df51 --- /dev/null +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -0,0 +1,274 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#include +#include +#include +#include + +#if ENABLED(WIFISUPPORT) + #include + #include "wifi.h" + #if ENABLED(OTASUPPORT) + #include "ota.h" + #endif + #if ENABLED(WEBSUPPORT) + #include "spiffs.h" + #include "web.h" + #endif +#endif + +// ------------------------ +// Externs +// ------------------------ + +portMUX_TYPE spinlock = portMUX_INITIALIZER_UNLOCKED; + +// ------------------------ +// Local defines +// ------------------------ + +#define V_REF 1100 + +// ------------------------ +// Public Variables +// ------------------------ + +uint16_t HAL_adc_result; + +// ------------------------ +// Private Variables +// ------------------------ + +esp_adc_cal_characteristics_t characteristics[ADC_ATTEN_MAX]; +adc_atten_t attenuations[ADC1_CHANNEL_MAX] = {}; +uint32_t thresholds[ADC_ATTEN_MAX]; +volatile int numPWMUsed = 0, + pwmPins[MAX_PWM_PINS], + pwmValues[MAX_PWM_PINS]; + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(WIFI_CUSTOM_COMMAND) + + bool wifi_custom_command(char * const command_ptr) { + #if ENABLED(ESP3D_WIFISUPPORT) + return esp3dlib.parse(command_ptr); + #else + UNUSED(command_ptr); + return false; + #endif + } + +#endif + +void HAL_init() { i2s_init(); } + +void HAL_init_board() { + + #if ENABLED(ESP3D_WIFISUPPORT) + esp3dlib.init(); + #elif ENABLED(WIFISUPPORT) + wifi_init(); + TERN_(OTASUPPORT, OTA_init()); + #if ENABLED(WEBSUPPORT) + spiffs_init(); + web_init(); + #endif + server.begin(); + #endif + + // ESP32 uses a GPIO matrix that allows pins to be assigned to hardware serial ports. + // The following code initializes hardware Serial1 and Serial2 to use user-defined pins + // if they have been defined. + #if defined(HARDWARE_SERIAL1_RX) && defined(HARDWARE_SERIAL1_TX) + HardwareSerial Serial1(1); + #ifdef TMC_BAUD_RATE // use TMC_BAUD_RATE for Serial1 if defined + Serial1.begin(TMC_BAUD_RATE, SERIAL_8N1, HARDWARE_SERIAL1_RX, HARDWARE_SERIAL1_TX); + #else // use default BAUDRATE if TMC_BAUD_RATE not defined + Serial1.begin(BAUDRATE, SERIAL_8N1, HARDWARE_SERIAL1_RX, HARDWARE_SERIAL1_TX); + #endif + #endif + #if defined(HARDWARE_SERIAL2_RX) && defined(HARDWARE_SERIAL2_TX) + HardwareSerial Serial2(2); + #ifdef TMC_BAUD_RATE // use TMC_BAUD_RATE for Serial1 if defined + Serial2.begin(TMC_BAUD_RATE, SERIAL_8N1, HARDWARE_SERIAL2_RX, HARDWARE_SERIAL2_TX); + #else // use default BAUDRATE if TMC_BAUD_RATE not defined + Serial2.begin(BAUDRATE, SERIAL_8N1, HARDWARE_SERIAL2_RX, HARDWARE_SERIAL2_TX); + #endif + #endif + +} + +void HAL_idletask() { + #if BOTH(WIFISUPPORT, OTASUPPORT) + OTA_handle(); + #endif + TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask()); +} + +void HAL_clear_reset_source() { } + +uint8_t HAL_get_reset_source() { return rtc_get_reset_reason(1); } + +void _delay_ms(int delay_ms) { delay(delay_ms); } + +// return free memory between end of heap (or end bss) and whatever is current +int freeMemory() { return ESP.getFreeHeap(); } + +// ------------------------ +// ADC +// ------------------------ +#define ADC1_CHANNEL(pin) ADC1_GPIO ## pin ## _CHANNEL + +adc1_channel_t get_channel(int pin) { + switch (pin) { + case 39: return ADC1_CHANNEL(39); + case 36: return ADC1_CHANNEL(36); + case 35: return ADC1_CHANNEL(35); + case 34: return ADC1_CHANNEL(34); + case 33: return ADC1_CHANNEL(33); + case 32: return ADC1_CHANNEL(32); + } + return ADC1_CHANNEL_MAX; +} + +void adc1_set_attenuation(adc1_channel_t chan, adc_atten_t atten) { + if (attenuations[chan] != atten) { + adc1_config_channel_atten(chan, atten); + attenuations[chan] = atten; + } +} + +void HAL_adc_init() { + // Configure ADC + adc1_config_width(ADC_WIDTH_12Bit); + + // Configure channels only if used as (re-)configuring a pin for ADC that is used elsewhere might have adverse effects + TERN_(HAS_TEMP_ADC_0, adc1_set_attenuation(get_channel(TEMP_0_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_1, adc1_set_attenuation(get_channel(TEMP_1_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_2, adc1_set_attenuation(get_channel(TEMP_2_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_3, adc1_set_attenuation(get_channel(TEMP_3_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_4, adc1_set_attenuation(get_channel(TEMP_4_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_5, adc1_set_attenuation(get_channel(TEMP_5_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_6, adc2_set_attenuation(get_channel(TEMP_6_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db)); + TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db)); + TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db)); + + // Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail. + // That's why we're not setting it up here. + + // Calculate ADC characteristics (i.e., gain and offset factors for each attenuation level) + for (int i = 0; i < ADC_ATTEN_MAX; i++) { + esp_adc_cal_characterize(ADC_UNIT_1, (adc_atten_t)i, ADC_WIDTH_BIT_12, V_REF, &characteristics[i]); + + // Change attenuation 100mV below the calibrated threshold + thresholds[i] = esp_adc_cal_raw_to_voltage(4095, &characteristics[i]); + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + const adc1_channel_t chan = get_channel(adc_pin); + uint32_t mv; + esp_adc_cal_get_voltage((adc_channel_t)chan, &characteristics[attenuations[chan]], &mv); + HAL_adc_result = mv * 1023.0 / 3300.0; + + // Change the attenuation level based on the new reading + adc_atten_t atten; + if (mv < thresholds[ADC_ATTEN_DB_0] - 100) + atten = ADC_ATTEN_DB_0; + else if (mv > thresholds[ADC_ATTEN_DB_0] - 50 && mv < thresholds[ADC_ATTEN_DB_2_5] - 100) + atten = ADC_ATTEN_DB_2_5; + else if (mv > thresholds[ADC_ATTEN_DB_2_5] - 50 && mv < thresholds[ADC_ATTEN_DB_6] - 100) + atten = ADC_ATTEN_DB_6; + else if (mv > thresholds[ADC_ATTEN_DB_6] - 50) + atten = ADC_ATTEN_DB_11; + else return; + + adc1_set_attenuation(chan, atten); +} + +void analogWrite(pin_t pin, int value) { + // Use ledc hardware for internal pins + if (pin < 34) { + static int cnt_channel = 1, pin_to_channel[40] = { 0 }; + if (pin_to_channel[pin] == 0) { + ledcAttachPin(pin, cnt_channel); + ledcSetup(cnt_channel, 490, 8); + ledcWrite(cnt_channel, value); + pin_to_channel[pin] = cnt_channel++; + } + ledcWrite(pin_to_channel[pin], value); + return; + } + + int idx = -1; + + // Search Pin + for (int i = 0; i < numPWMUsed; ++i) + if (pwmPins[i] == pin) { idx = i; break; } + + // not found ? + if (idx < 0) { + // No slots remaining + if (numPWMUsed >= MAX_PWM_PINS) return; + + // Take new slot for pin + idx = numPWMUsed; + pwmPins[idx] = pin; + // Start timer on first use + if (idx == 0) HAL_timer_start(PWM_TIMER_NUM, PWM_TIMER_FREQUENCY); + + ++numPWMUsed; + } + + // Use 7bit internal value - add 1 to have 100% high at 255 + pwmValues[idx] = (value + 1) / 2; +} + +// Handle PWM timer interrupt +HAL_PWM_TIMER_ISR() { + HAL_timer_isr_prologue(PWM_TIMER_NUM); + + static uint8_t count = 0; + + for (int i = 0; i < numPWMUsed; ++i) { + if (count == 0) // Start of interval + WRITE(pwmPins[i], pwmValues[i] ? HIGH : LOW); + else if (pwmValues[i] == count) // End of duration + WRITE(pwmPins[i], LOW); + } + + // 128 for 7 Bit resolution + count = (count + 1) & 0x7F; + + HAL_timer_isr_epilogue(PWM_TIMER_NUM); +} + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h new file mode 100644 index 00000000..ebc16c95 --- /dev/null +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -0,0 +1,173 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 + +/** + * HAL for Espressif ESP32 WiFi + */ + +#define CPU_32_BIT + +#include + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" +#include "i2s.h" + +#if ENABLED(WIFISUPPORT) + #include "WebSocketSerial.h" +#endif + +#if ENABLED(ESP3D_WIFISUPPORT) + #include "esp3dlib.h" +#endif + +#include "FlushableHardwareSerial.h" + +// ------------------------ +// Defines +// ------------------------ + +extern portMUX_TYPE spinlock; + +#define MYSERIAL0 flushableSerial + +#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) + #if ENABLED(ESP3D_WIFISUPPORT) + #define MYSERIAL1 Serial2Socket + #else + #define MYSERIAL1 webSocketSerial + #endif +#endif + +#define CRITICAL_SECTION_START() portENTER_CRITICAL(&spinlock) +#define CRITICAL_SECTION_END() portEXIT_CRITICAL(&spinlock) +#define ISRS_ENABLED() (spinlock.owner == portMUX_FREE_VAL) +#define ENABLE_ISRS() if (spinlock.owner != portMUX_FREE_VAL) portEXIT_CRITICAL(&spinlock) +#define DISABLE_ISRS() portENTER_CRITICAL(&spinlock) + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +// ------------------------ +// Types +// ------------------------ + +typedef int16_t pin_t; + +#define HAL_SERVO_LIB Servo + +// ------------------------ +// Public Variables +// ------------------------ + +/** result of last ADC conversion */ +extern uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +// clear reset reason +void HAL_clear_reset_source(); + +// reset reason +uint8_t HAL_get_reset_source(); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +void _delay_ms(int delay); + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +int freeMemory(); +#pragma GCC diagnostic pop + +void analogWrite(pin_t pin, int value); + +// ADC +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_init(); + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +#define BOARD_INIT() HAL_init_board(); +void HAL_idletask(); +void HAL_init(); +void HAL_init_board(); + +// +// Delay in cycles (used by DELAY_NS / DELAY_US) +// +FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { + unsigned long start, ccount, stop; + + /** + * It's important to care for race conditions (and overflows) here. + * Race condition example: If `stop` calculates to being close to the upper boundary of + * `uint32_t` and if at the same time a longer loop interruption kicks in (e.g. due to other + * FreeRTOS tasks or interrupts), `ccount` might overflow (and therefore be below `stop` again) + * without the loop ever being able to notice that `ccount` had already been above `stop` once + * (and that therefore the number of cycles to delay has already passed). + * As DELAY_CYCLES (through DELAY_NS / DELAY_US) is used by software SPI bit banging to drive + * LCDs and therefore might be called very, very often, this seemingly improbable situation did + * actually happen in reality. It resulted in apparently random print pauses of ~17.9 seconds + * (0x100000000 / 240 MHz) or multiples thereof, essentially ruining the current print by causing + * large blobs of filament. + */ + + __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (start) ); + stop = start + x; + ccount = start; + + if (stop >= start) { + // no overflow, so only loop while in between start and stop: + // 0x00000000 -----------------start****stop-- 0xFFFFFFFF + while (ccount >= start && ccount < stop) { + __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); + } + } + else { + // stop did overflow, so only loop while outside of stop and start: + // 0x00000000 **stop-------------------start** 0xFFFFFFFF + while (ccount >= start || ccount < stop) { + __asm__ __volatile__ ( "rsr %0, ccount" : "=a" (ccount) ); + } + } + +} diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp new file mode 100644 index 00000000..8e5875fc --- /dev/null +++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp @@ -0,0 +1,115 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#include "../shared/HAL_SPI.h" + +#include +#include + +// ------------------------ +// Public Variables +// ------------------------ + +static SPISettings spiConfig; + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(SOFTWARE_SPI) + + // ------------------------ + // Software SPI + // ------------------------ + #error "Software SPI not supported for ESP32. Use Hardware SPI." + +#else + +// ------------------------ +// Hardware SPI +// ------------------------ + +void spiBegin() { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + + OUT_WRITE(SS_PIN, HIGH); +} + +void spiInit(uint8_t spiRate) { + uint32_t clock; + + switch (spiRate) { + case SPI_FULL_SPEED: clock = 16000000; break; + case SPI_HALF_SPEED: clock = 8000000; break; + case SPI_QUARTER_SPEED: clock = 4000000; break; + case SPI_EIGHTH_SPEED: clock = 2000000; break; + case SPI_SIXTEENTH_SPEED: clock = 1000000; break; + case SPI_SPEED_5: clock = 500000; break; + case SPI_SPEED_6: clock = 250000; break; + default: clock = 1000000; // Default from the SPI library + } + + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +uint8_t spiRec() { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transferBytes(0, buf, nbyte); + SPI.endTransaction(); +} + +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + SPI.writeBytes(const_cast(buf), 512); + SPI.endTransaction(); +} + +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + + SPI.beginTransaction(spiConfig); +} + +#endif // !SOFTWARE_SPI + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/Servo.cpp b/Marlin/src/HAL/ESP32/Servo.cpp new file mode 100644 index 00000000..fcf58485 --- /dev/null +++ b/Marlin/src/HAL/ESP32/Servo.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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +// Adjacent channels (0/1, 2/3 etc.) share the same timer and therefore the same frequency and resolution settings on ESP32, +// so we only allocate servo channels up high to avoid side effects with regards to analogWrite (fans, leds, laser pwm etc.) +int Servo::channel_next_free = 12; + +Servo::Servo() { + channel = channel_next_free++; +} + +int8_t Servo::attach(const int inPin) { + if (channel >= CHANNEL_MAX_NUM) return -1; + if (inPin > 0) pin = inPin; + + ledcSetup(channel, 50, 16); // channel X, 50 Hz, 16-bit depth + ledcAttachPin(pin, channel); + return true; +} + +void Servo::detach() { ledcDetachPin(pin); } + +int Servo::read() { return degrees; } + +void Servo::write(int inDegrees) { + degrees = constrain(inDegrees, MIN_ANGLE, MAX_ANGLE); + int us = map(degrees, MIN_ANGLE, MAX_ANGLE, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); + int duty = map(us, 0, TAU_USEC, 0, MAX_COMPARE); + ledcWrite(channel, duty); +} + +void Servo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[channel]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} +#endif // HAS_SERVOS + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/Servo.h b/Marlin/src/HAL/ESP32/Servo.h new file mode 100644 index 00000000..b0d92945 --- /dev/null +++ b/Marlin/src/HAL/ESP32/Servo.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 + +class Servo { + static const int MIN_ANGLE = 0, + MAX_ANGLE = 180, + MIN_PULSE_WIDTH = 544, // Shortest pulse sent to a servo + MAX_PULSE_WIDTH = 2400, // Longest pulse sent to a servo + TAU_MSEC = 20, + TAU_USEC = (TAU_MSEC * 1000), + MAX_COMPARE = ((1 << 16) - 1), // 65535 + CHANNEL_MAX_NUM = 16; + +public: + Servo(); + int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + void detach(); + void write(int degrees); // set angle + void move(const int degrees); // attach the servo, then move to value + int read(); // returns current pulse width as an angle between 0 and 180 degrees + +private: + static int channel_next_free; + int channel; + int pin; + int degrees; +}; diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp new file mode 100644 index 00000000..ca7f47a1 --- /dev/null +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp @@ -0,0 +1,152 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(WIFISUPPORT) + +#include "WebSocketSerial.h" +#include "wifi.h" +#include + +WebSocketSerial webSocketSerial; +AsyncWebSocket ws("/ws"); // TODO Move inside the class. + +// RingBuffer impl + +#define NEXT_INDEX(I, SIZE) ((I + 1) & (ring_buffer_pos_t)(SIZE - 1)) + +RingBuffer::RingBuffer(ring_buffer_pos_t size) + : data(new uint8_t[size]), + size(size), + read_index(0), + write_index(0) +{} + +RingBuffer::~RingBuffer() { delete[] data; } + +ring_buffer_pos_t RingBuffer::write(const uint8_t c) { + const ring_buffer_pos_t n = NEXT_INDEX(write_index, size); + + if (n != read_index) { + this->data[write_index] = c; + write_index = n; + return 1; + } + + // TODO: buffer is full, handle? + return 0; +} + +ring_buffer_pos_t RingBuffer::write(const uint8_t *buffer, ring_buffer_pos_t size) { + ring_buffer_pos_t written = 0; + for (ring_buffer_pos_t i = 0; i < size; i++) { + written += write(buffer[i]); + } + return written; +} + +int RingBuffer::available() { + return (size - read_index + write_index) & (size - 1); +} + +int RingBuffer::peek() { + return available() ? data[read_index] : -1; +} + +int RingBuffer::read() { + if (available()) { + const int ret = data[read_index]; + read_index = NEXT_INDEX(read_index, size); + return ret; + } + return -1; +} + +ring_buffer_pos_t RingBuffer::read(uint8_t *buffer) { + ring_buffer_pos_t len = available(); + + for (ring_buffer_pos_t i = 0; read_index != write_index; i++) { + buffer[i] = data[read_index]; + read_index = NEXT_INDEX(read_index, size); + } + + return len; +} + +void RingBuffer::flush() { read_index = write_index; } + +// WebSocketSerial impl +WebSocketSerial::WebSocketSerial() + : rx_buffer(RingBuffer(RX_BUFFER_SIZE)), + tx_buffer(RingBuffer(TX_BUFFER_SIZE)) +{} + +void WebSocketSerial::begin(const long baud_setting) { + ws.onEvent([this](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { + switch (type) { + case WS_EVT_CONNECT: client->ping(); break; // client connected + case WS_EVT_DISCONNECT: // client disconnected + case WS_EVT_ERROR: // error was received from the other end + case WS_EVT_PONG: break; // pong message was received (in response to a ping request maybe) + case WS_EVT_DATA: { // data packet + AwsFrameInfo * info = (AwsFrameInfo*)arg; + if (info->opcode == WS_TEXT || info->message_opcode == WS_TEXT) + this->rx_buffer.write(data, len); + } + } + }); + server.addHandler(&ws); +} + +void WebSocketSerial::end() { } +int WebSocketSerial::peek() { return rx_buffer.peek(); } +int WebSocketSerial::read() { return rx_buffer.read(); } +int WebSocketSerial::available() { return rx_buffer.available(); } +void WebSocketSerial::flush() { rx_buffer.flush(); } + +size_t WebSocketSerial::write(const uint8_t c) { + size_t ret = tx_buffer.write(c); + + if (ret && c == '\n') { + uint8_t tmp[TX_BUFFER_SIZE]; + ring_buffer_pos_t size = tx_buffer.read(tmp); + ws.textAll(tmp, size); + } + + return ret; +} + +size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { + size_t written = 0; + for (size_t i = 0; i < size; i++) + written += write(buffer[i]); + return written; +} + +void WebSocketSerial::flushTX() { + // No need to do anything as there's no benefit to sending partial lines over the websocket connection. +} + +#endif // WIFISUPPORT +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h new file mode 100644 index 00000000..7a25c6dc --- /dev/null +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -0,0 +1,86 @@ +/** + * 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 TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 +#endif +#if ENABLED(WIFISUPPORT) + #ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 + #endif + #if TX_BUFFER_SIZE <= 0 + #error "TX_BUFFER_SIZE is required for the WebSocket." + #endif +#endif + +typedef uint16_t ring_buffer_pos_t; + +class RingBuffer { + uint8_t *data; + ring_buffer_pos_t size, read_index, write_index; + +public: + RingBuffer(ring_buffer_pos_t size); + ~RingBuffer(); + + int available(); + int peek(); + int read(); + ring_buffer_pos_t read(uint8_t *buffer); + void flush(); + ring_buffer_pos_t write(const uint8_t c); + ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size); +}; + +class WebSocketSerial: public Stream { + RingBuffer rx_buffer; + RingBuffer tx_buffer; + +public: + WebSocketSerial(); + void begin(const long); + void end(); + int available(); + int peek(); + int read(); + void flush(); + void flushTX(); + size_t write(const uint8_t c); + size_t write(const uint8_t* buffer, size_t size); + + operator bool() { return true; } + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + FORCE_INLINE uint32_t dropped() { return 0; } + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + FORCE_INLINE int rxMaxEnqueued() { return 0; } + #endif +}; + +extern WebSocketSerial webSocketSerial; diff --git a/Marlin/src/HAL/ESP32/eeprom.cpp b/Marlin/src/HAL/ESP32/eeprom.cpp new file mode 100644 index 00000000..1bf687c6 --- /dev/null +++ b/Marlin/src/HAL/ESP32/eeprom.cpp @@ -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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../shared/eeprom_api.h" +#include + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { return EEPROM.begin(MARLIN_EEPROM_SIZE); } +bool PersistentStore::access_finish() { EEPROM.end(); return true; } + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + for (size_t i = 0; i < size; i++) { + EEPROM.write(pos++, value[i]); + crc16(crc, &value[i], 1); + } + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + for (size_t i = 0; i < size; i++) { + uint8_t c = EEPROM.read(pos++); + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + return false; +} + +#endif // EEPROM_SETTINGS +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/endstop_interrupts.h b/Marlin/src/HAL/ESP32/endstop_interrupts.h new file mode 100644 index 00000000..743ccd99 --- /dev/null +++ b/Marlin/src/HAL/ESP32/endstop_interrupts.h @@ -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 . + * + */ +#pragma once + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the stepper-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void ICACHE_RAM_ATTR endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/ESP32/fastio.h b/Marlin/src/HAL/ESP32/fastio.h new file mode 100644 index 00000000..2ded3a5f --- /dev/null +++ b/Marlin/src/HAL/ESP32/fastio.h @@ -0,0 +1,84 @@ +/** + * 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 "i2s.h" + +/** + * Utility functions + */ + +// I2S expander pin mapping. +#define IS_I2S_EXPANDER_PIN(IO) TEST(IO, 7) +#define I2S_EXPANDER_PIN_INDEX(IO) (IO & 0x7F) + +// Set pin as input +#define _SET_INPUT(IO) pinMode(IO, INPUT) + +// Set pin as output +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) + +// Set pin as input with pullup mode +#define _PULLUP(IO, v) pinMode(IO, v ? INPUT_PULLUP : INPUT) + +// Read a pin wrapper +#define READ(IO) (IS_I2S_EXPANDER_PIN(IO) ? i2s_state(I2S_EXPANDER_PIN_INDEX(IO)) : digitalRead(IO)) + +// Write to a pin wrapper +#define WRITE(IO, v) (IS_I2S_EXPANDER_PIN(IO) ? i2s_write(I2S_EXPANDER_PIN_INDEX(IO), v) : digitalWrite(IO, v)) + +// Set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) + +// Set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) + +// Set pin as output wrapper +#define SET_OUTPUT(IO) do{ _SET_OUTPUT(IO); }while(0) + +// Set pin as PWM +#define SET_PWM SET_OUTPUT + +// Set pin as output and init +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +// PWM outputs +#define PWM_PIN(P) (P < 34 || P > 127) // NOTE Pins >= 34 are input only on ESP32, so they can't be used for output. + +// Toggle pin value +#define TOGGLE(IO) WRITE(IO, !READ(IO)) + +// +// Ports and functions +// + +// UART +#define RXD 3 +#define TXD 1 + +// TWI (I2C) +#define SCL 5 +#define SDA 4 diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp new file mode 100644 index 00000000..99b2f755 --- /dev/null +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -0,0 +1,343 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfigPre.h" + +#include "i2s.h" + +#include "../shared/Marduino.h" +#include +#include +#include +#include +#include "../../module/stepper.h" + +#define DMA_BUF_COUNT 8 // number of DMA buffers to store data +#define DMA_BUF_LEN 4092 // maximum size in bytes +#define I2S_SAMPLE_SIZE 4 // 4 bytes, 32 bits per sample +#define DMA_SAMPLE_COUNT DMA_BUF_LEN / I2S_SAMPLE_SIZE // number of samples per buffer + +typedef enum { + I2S_NUM_0 = 0x0, /*!< I2S 0*/ + I2S_NUM_1 = 0x1, /*!< I2S 1*/ + I2S_NUM_MAX, +} i2s_port_t; + +typedef struct { + uint32_t **buffers; + uint32_t *current; + uint32_t rw_pos; + lldesc_t **desc; + xQueueHandle queue; +} i2s_dma_t; + +static portMUX_TYPE i2s_spinlock[I2S_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED}; +static i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0, &I2S1}; +static i2s_dma_t dma; + +// output value +uint32_t i2s_port_data = 0; + +#define I2S_ENTER_CRITICAL() portENTER_CRITICAL(&i2s_spinlock[i2s_num]) +#define I2S_EXIT_CRITICAL() portEXIT_CRITICAL(&i2s_spinlock[i2s_num]) + +static inline void gpio_matrix_out_check(uint32_t gpio, uint32_t signal_idx, bool out_inv, bool oen_inv) { + //if pin = -1, do not need to configure + if (gpio != -1) { + PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio], PIN_FUNC_GPIO); + gpio_set_direction((gpio_num_t)gpio, (gpio_mode_t)GPIO_MODE_DEF_OUTPUT); + gpio_matrix_out(gpio, signal_idx, out_inv, oen_inv); + } +} + +static esp_err_t i2s_reset_fifo(i2s_port_t i2s_num) { + I2S_ENTER_CRITICAL(); + I2S[i2s_num]->conf.rx_fifo_reset = 1; + I2S[i2s_num]->conf.rx_fifo_reset = 0; + I2S[i2s_num]->conf.tx_fifo_reset = 1; + I2S[i2s_num]->conf.tx_fifo_reset = 0; + I2S_EXIT_CRITICAL(); + + return ESP_OK; +} + +esp_err_t i2s_start(i2s_port_t i2s_num) { + //start DMA link + I2S_ENTER_CRITICAL(); + i2s_reset_fifo(i2s_num); + + //reset dma + I2S[i2s_num]->lc_conf.in_rst = 1; + I2S[i2s_num]->lc_conf.in_rst = 0; + I2S[i2s_num]->lc_conf.out_rst = 1; + I2S[i2s_num]->lc_conf.out_rst = 0; + + I2S[i2s_num]->conf.tx_reset = 1; + I2S[i2s_num]->conf.tx_reset = 0; + I2S[i2s_num]->conf.rx_reset = 1; + I2S[i2s_num]->conf.rx_reset = 0; + + I2S[i2s_num]->int_clr.val = 0xFFFFFFFF; + I2S[i2s_num]->out_link.start = 1; + I2S[i2s_num]->conf.tx_start = 1; + I2S_EXIT_CRITICAL(); + + return ESP_OK; +} + +esp_err_t i2s_stop(i2s_port_t i2s_num) { + I2S_ENTER_CRITICAL(); + I2S[i2s_num]->out_link.stop = 1; + I2S[i2s_num]->conf.tx_start = 0; + + I2S[i2s_num]->int_clr.val = I2S[i2s_num]->int_st.val; //clear pending interrupt + I2S_EXIT_CRITICAL(); + + return ESP_OK; +} + +static void IRAM_ATTR i2s_intr_handler_default(void *arg) { + int dummy; + lldesc_t *finish_desc; + portBASE_TYPE high_priority_task_awoken = pdFALSE; + + if (I2S0.int_st.out_eof) { + // Get the descriptor of the last item in the linkedlist + finish_desc = (lldesc_t*) I2S0.out_eof_des_addr; + + // If the queue is full it's because we have an underflow, + // more than buf_count isr without new data, remove the front buffer + if (xQueueIsQueueFullFromISR(dma.queue)) + xQueueReceiveFromISR(dma.queue, &dummy, &high_priority_task_awoken); + + xQueueSendFromISR(dma.queue, (void *)(&finish_desc->buf), &high_priority_task_awoken); + } + + if (high_priority_task_awoken == pdTRUE) portYIELD_FROM_ISR(); + + // clear interrupt + I2S0.int_clr.val = I2S0.int_st.val; //clear pending interrupt +} + +void stepperTask(void* parameter) { + uint32_t remaining = 0; + + while (1) { + xQueueReceive(dma.queue, &dma.current, portMAX_DELAY); + dma.rw_pos = 0; + + while (dma.rw_pos < DMA_SAMPLE_COUNT) { + // Fill with the port data post pulse_phase until the next step + if (remaining) { + i2s_push_sample(); + remaining--; + } + else { + Stepper::pulse_phase_isr(); + remaining = Stepper::block_phase_isr(); + } + } + } +} + +int i2s_init() { + periph_module_enable(PERIPH_I2S0_MODULE); + + /** + * Each i2s transfer will take + * fpll = PLL_D2_CLK -- clka_en = 0 + * + * fi2s = fpll / N + b/a -- N = clkm_div_num + * fi2s = 160MHz / 2 + * fi2s = 80MHz + * + * fbclk = fi2s / M -- M = tx_bck_div_num + * fbclk = 80MHz / 2 + * fbclk = 40MHz + * + * fwclk = fbclk / 32 + * + * for fwclk = 250kHz (4µS pulse time) + * N = 10 + * M = 20 + */ + + // Allocate the array of pointers to the buffers + dma.buffers = (uint32_t **)malloc(sizeof(uint32_t*) * DMA_BUF_COUNT); + if (dma.buffers == nullptr) return -1; + + // Allocate each buffer that can be used by the DMA controller + for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { + dma.buffers[buf_idx] = (uint32_t*) heap_caps_calloc(1, DMA_BUF_LEN, MALLOC_CAP_DMA); + if (dma.buffers[buf_idx] == nullptr) return -1; + } + + // Allocate the array of DMA descriptors + dma.desc = (lldesc_t**) malloc(sizeof(lldesc_t*) * DMA_BUF_COUNT); + if (dma.desc == nullptr) return -1; + + // Allocate each DMA descriptor that will be used by the DMA controller + for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { + dma.desc[buf_idx] = (lldesc_t*) heap_caps_malloc(sizeof(lldesc_t), MALLOC_CAP_DMA); + if (dma.desc[buf_idx] == nullptr) return -1; + } + + // Initialize + for (int buf_idx = 0; buf_idx < DMA_BUF_COUNT; buf_idx++) { + dma.desc[buf_idx]->owner = 1; + dma.desc[buf_idx]->eof = 1; // set to 1 will trigger the interrupt + dma.desc[buf_idx]->sosf = 0; + dma.desc[buf_idx]->length = DMA_BUF_LEN; + dma.desc[buf_idx]->size = DMA_BUF_LEN; + dma.desc[buf_idx]->buf = (uint8_t *) dma.buffers[buf_idx]; + dma.desc[buf_idx]->offset = 0; + dma.desc[buf_idx]->empty = (uint32_t)((buf_idx < (DMA_BUF_COUNT - 1)) ? (dma.desc[buf_idx + 1]) : dma.desc[0]); + } + + dma.queue = xQueueCreate(DMA_BUF_COUNT, sizeof(uint32_t *)); + + // Set the first DMA descriptor + I2S0.out_link.addr = (uint32_t)dma.desc[0]; + + // stop i2s + i2s_stop(I2S_NUM_0); + + // configure I2S data port interface. + i2s_reset_fifo(I2S_NUM_0); + + //reset i2s + I2S0.conf.tx_reset = 1; + I2S0.conf.tx_reset = 0; + I2S0.conf.rx_reset = 1; + I2S0.conf.rx_reset = 0; + + //reset dma + I2S0.lc_conf.in_rst = 1; + I2S0.lc_conf.in_rst = 0; + I2S0.lc_conf.out_rst = 1; + I2S0.lc_conf.out_rst = 0; + + //Enable and configure DMA + I2S0.lc_conf.check_owner = 0; + I2S0.lc_conf.out_loop_test = 0; + I2S0.lc_conf.out_auto_wrback = 0; + I2S0.lc_conf.out_data_burst_en = 0; + I2S0.lc_conf.outdscr_burst_en = 0; + I2S0.lc_conf.out_no_restart_clr = 0; + I2S0.lc_conf.indscr_burst_en = 0; + I2S0.lc_conf.out_eof_mode = 1; + + I2S0.conf2.lcd_en = 0; + I2S0.conf2.camera_en = 0; + I2S0.pdm_conf.pcm2pdm_conv_en = 0; + I2S0.pdm_conf.pdm2pcm_conv_en = 0; + + I2S0.fifo_conf.dscr_en = 0; + + I2S0.conf_chan.tx_chan_mod = ( + #if ENABLED(I2S_STEPPER_SPLIT_STREAM) + 4 + #else + 0 + #endif + ); + I2S0.fifo_conf.tx_fifo_mod = 0; + I2S0.conf.tx_mono = 0; + + I2S0.conf_chan.rx_chan_mod = 0; + I2S0.fifo_conf.rx_fifo_mod = 0; + I2S0.conf.rx_mono = 0; + + I2S0.fifo_conf.dscr_en = 1; //connect dma to fifo + + I2S0.conf.tx_start = 0; + I2S0.conf.rx_start = 0; + + I2S0.conf.tx_msb_right = 1; + I2S0.conf.tx_right_first = 1; + + I2S0.conf.tx_slave_mod = 0; // Master + I2S0.fifo_conf.tx_fifo_mod_force_en = 1; + + I2S0.pdm_conf.rx_pdm_en = 0; + I2S0.pdm_conf.tx_pdm_en = 0; + + I2S0.conf.tx_short_sync = 0; + I2S0.conf.rx_short_sync = 0; + I2S0.conf.tx_msb_shift = 0; + I2S0.conf.rx_msb_shift = 0; + + // set clock + I2S0.clkm_conf.clka_en = 0; // Use PLL/2 as reference + I2S0.clkm_conf.clkm_div_num = 10; // minimum value of 2, reset value of 4, max 256 + I2S0.clkm_conf.clkm_div_a = 0; // 0 at reset, what about divide by 0? (not an issue) + I2S0.clkm_conf.clkm_div_b = 0; // 0 at reset + + // fbck = fi2s / tx_bck_div_num + I2S0.sample_rate_conf.tx_bck_div_num = 2; // minimum value of 2 defaults to 6 + + // Enable TX interrupts + I2S0.int_ena.out_eof = 1; + I2S0.int_ena.out_dscr_err = 0; + I2S0.int_ena.out_total_eof = 0; + I2S0.int_ena.out_done = 0; + + // Allocate and Enable the I2S interrupt + intr_handle_t i2s_isr_handle; + esp_intr_alloc(ETS_I2S0_INTR_SOURCE, 0, i2s_intr_handler_default, nullptr, &i2s_isr_handle); + esp_intr_enable(i2s_isr_handle); + + // Create the task that will feed the buffer + xTaskCreatePinnedToCore(stepperTask, "StepperTask", 10000, nullptr, 1, nullptr, CONFIG_ARDUINO_RUNNING_CORE); // run I2S stepper task on same core as rest of Marlin + + // Route the i2s pins to the appropriate GPIO + gpio_matrix_out_check(I2S_DATA, I2S0O_DATA_OUT23_IDX, 0, 0); + gpio_matrix_out_check(I2S_BCK, I2S0O_BCK_OUT_IDX, 0, 0); + gpio_matrix_out_check(I2S_WS, I2S0O_WS_OUT_IDX, 0, 0); + + // Start the I2S peripheral + return i2s_start(I2S_NUM_0); +} + +void i2s_write(uint8_t pin, uint8_t val) { + #if ENABLED(I2S_STEPPER_SPLIT_STREAM) + if (pin >= 16) { + SET_BIT_TO(I2S0.conf_single_data, pin, val); + return; + } + #endif + SET_BIT_TO(i2s_port_data, pin, val); +} + +uint8_t i2s_state(uint8_t pin) { + #if ENABLED(I2S_STEPPER_SPLIT_STREAM) + if (pin >= 16) return TEST(I2S0.conf_single_data, pin); + #endif + return TEST(i2s_port_data, pin); +} + +void i2s_push_sample() { + dma.current[dma.rw_pos++] = i2s_port_data; +} + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/i2s.h b/Marlin/src/HAL/ESP32/i2s.h new file mode 100644 index 00000000..573b9838 --- /dev/null +++ b/Marlin/src/HAL/ESP32/i2s.h @@ -0,0 +1,35 @@ +/** + * 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 + +// current value of the outputs provided over i2s +extern uint32_t i2s_port_data; + +int i2s_init(); + +uint8_t i2s_state(uint8_t pin); + +void i2s_write(uint8_t pin, uint8_t val); + +void i2s_push_sample(); diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h new file mode 100644 index 00000000..4da60017 --- /dev/null +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/ESP32." +#endif diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h b/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/ESP32/inc/Conditionals_post.h b/Marlin/src/HAL/ESP32/inc/Conditionals_post.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/ESP32/inc/Conditionals_post.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h new file mode 100644 index 00000000..f57a6c59 --- /dev/null +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -0,0 +1,38 @@ +/** + * 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 + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for ESP32. 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 ESP32." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif + +#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT) + #error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT." +#endif diff --git a/Marlin/src/HAL/ESP32/ota.cpp b/Marlin/src/HAL/ESP32/ota.cpp new file mode 100644 index 00000000..69a3e25e --- /dev/null +++ b/Marlin/src/HAL/ESP32/ota.cpp @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(WIFISUPPORT, OTASUPPORT) + +#include +#include +#include +#include +#include + +void OTA_init() { + ArduinoOTA + .onStart([]() { + timer_pause(TIMER_GROUP_0, TIMER_0); + timer_pause(TIMER_GROUP_0, TIMER_1); + + // U_FLASH or U_SPIFFS + String type = (ArduinoOTA.getCommand() == U_FLASH) ? "sketch" : "filesystem"; + + // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() + Serial.println("Start updating " + type); + }) + .onEnd([]() { + Serial.println("\nEnd"); + }) + .onProgress([](unsigned int progress, unsigned int total) { + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + }) + .onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + char *str; + switch (error) { + case OTA_AUTH_ERROR: str = "Auth Failed"; break; + case OTA_BEGIN_ERROR: str = "Begin Failed"; break; + case OTA_CONNECT_ERROR: str = "Connect Failed"; break; + case OTA_RECEIVE_ERROR: str = "Receive Failed"; break; + case OTA_END_ERROR: str = "End Failed"; break; + } + Serial.println(str); + }); + + ArduinoOTA.begin(); +} + +void OTA_handle() { + ArduinoOTA.handle(); +} + +#endif // WIFISUPPORT && OTASUPPORT +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/ota.h b/Marlin/src/HAL/ESP32/ota.h new file mode 100644 index 00000000..546ace82 --- /dev/null +++ b/Marlin/src/HAL/ESP32/ota.h @@ -0,0 +1,23 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 + +void OTA_init(); +void OTA_handle(); diff --git a/Marlin/src/HAL/ESP32/servotimers.h b/Marlin/src/HAL/ESP32/servotimers.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/ESP32/servotimers.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/ESP32/spi_pins.h b/Marlin/src/HAL/ESP32/spi_pins.h new file mode 100644 index 00000000..15f8f2ab --- /dev/null +++ b/Marlin/src/HAL/ESP32/spi_pins.h @@ -0,0 +1,24 @@ +/** + * 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 + +#define SS_PIN SDSS +#define SCK_PIN 18 +#define MISO_PIN 19 +#define MOSI_PIN 23 diff --git a/Marlin/src/HAL/ESP32/spiffs.cpp b/Marlin/src/HAL/ESP32/spiffs.cpp new file mode 100644 index 00000000..a0e713bf --- /dev/null +++ b/Marlin/src/HAL/ESP32/spiffs.cpp @@ -0,0 +1,43 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(WIFISUPPORT, WEBSUPPORT) + +#include "../../core/serial.h" + +#include +#include + +bool spiffs_initialized; + +void spiffs_init() { + if (SPIFFS.begin(true)) // formatOnFail = true + spiffs_initialized = true; + else + SERIAL_ERROR_MSG("SPIFFS mount failed"); +} + +#endif // WIFISUPPORT && WEBSUPPORT +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/spiffs.h b/Marlin/src/HAL/ESP32/spiffs.h new file mode 100644 index 00000000..64ec7dd1 --- /dev/null +++ b/Marlin/src/HAL/ESP32/spiffs.h @@ -0,0 +1,26 @@ +/** + * 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 + +extern bool spiffs_initialized; + +void spiffs_init(); diff --git a/Marlin/src/HAL/ESP32/timers.cpp b/Marlin/src/HAL/ESP32/timers.cpp new file mode 100644 index 00000000..3300aea8 --- /dev/null +++ b/Marlin/src/HAL/ESP32/timers.cpp @@ -0,0 +1,171 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include +#include +#include +#include +#include + +#include "../../inc/MarlinConfig.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define NUM_HARDWARE_TIMERS 4 + +// ------------------------ +// Private Variables +// ------------------------ + +static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1}; + +const tTimerConfig TimerConfig [NUM_HARDWARE_TIMERS] = { + { TIMER_GROUP_0, TIMER_0, STEPPER_TIMER_PRESCALE, stepTC_Handler }, // 0 - Stepper + { TIMER_GROUP_0, TIMER_1, TEMP_TIMER_PRESCALE, tempTC_Handler }, // 1 - Temperature + { TIMER_GROUP_1, TIMER_0, PWM_TIMER_PRESCALE, pwmTC_Handler }, // 2 - PWM + { TIMER_GROUP_1, TIMER_1, 1, nullptr }, // 3 +}; + +// ------------------------ +// Public functions +// ------------------------ + +void IRAM_ATTR timer_isr(void *para) { + const tTimerConfig& timer = TimerConfig[(int)para]; + + // Retrieve the interrupt status and the counter value + // from the timer that reported the interrupt + uint32_t intr_status = TG[timer.group]->int_st_timers.val; + TG[timer.group]->hw_timer[timer.idx].update = 1; + + // Clear the interrupt + if (intr_status & BIT(timer.idx)) { + switch (timer.idx) { + case TIMER_0: TG[timer.group]->int_clr_timers.t0 = 1; break; + case TIMER_1: TG[timer.group]->int_clr_timers.t1 = 1; break; + case TIMER_MAX: break; + } + } + + timer.fn(); + + // After the alarm has been triggered + // Enable it again so it gets triggered the next time + TG[timer.group]->hw_timer[timer.idx].config.alarm_en = TIMER_ALARM_EN; +} + +/** + * Enable and initialize the timer + * @param timer_num timer number to initialize + * @param frequency frequency of the timer + */ +void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) { + const tTimerConfig timer = TimerConfig[timer_num]; + + timer_config_t config; + config.divider = timer.divider; + config.counter_dir = TIMER_COUNT_UP; + config.counter_en = TIMER_PAUSE; + config.alarm_en = TIMER_ALARM_EN; + config.intr_type = TIMER_INTR_LEVEL; + config.auto_reload = true; + + // Select and initialize the timer + timer_init(timer.group, timer.idx, &config); + + // Timer counter initial value and auto reload on alarm + timer_set_counter_value(timer.group, timer.idx, 0x00000000ULL); + + // Configure the alam value and the interrupt on alarm + timer_set_alarm_value(timer.group, timer.idx, (HAL_TIMER_RATE) / timer.divider / frequency - 1); + + timer_enable_intr(timer.group, timer.idx); + + timer_isr_register(timer.group, timer.idx, timer_isr, (void*)(uint32_t)timer_num, 0, nullptr); + + timer_start(timer.group, timer.idx); +} + +/** + * Set the upper value of the timer, when the timer reaches this upper value the + * interrupt should be triggered and the counter reset + * @param timer_num timer number to set the count to + * @param count threshold at which the interrupt is triggered + */ +void HAL_timer_set_compare(const uint8_t timer_num, hal_timer_t count) { + const tTimerConfig timer = TimerConfig[timer_num]; + timer_set_alarm_value(timer.group, timer.idx, count); +} + +/** + * Get the current upper value of the timer + * @param timer_num timer number to get the count from + * @return the timer current threshold for the alarm to be triggered + */ +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + + uint64_t alarm_value; + timer_get_alarm_value(timer.group, timer.idx, &alarm_value); + + return alarm_value; +} + +/** + * Get the current counter value between 0 and the maximum count (HAL_timer_set_count) + * @param timer_num timer number to get the current count + * @return the current counter of the alarm + */ +hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + uint64_t counter_value; + timer_get_counter_value(timer.group, timer.idx, &counter_value); + return counter_value; +} + +/** + * Enable timer interrupt on the timer + * @param timer_num timer number to enable interrupts on + */ +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + //const tTimerConfig timer = TimerConfig[timer_num]; + //timer_enable_intr(timer.group, timer.idx); +} + +/** + * Disable timer interrupt on the timer + * @param timer_num timer number to disable interrupts on + */ +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + //const tTimerConfig timer = TimerConfig[timer_num]; + //timer_disable_intr(timer.group, timer.idx); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + const tTimerConfig timer = TimerConfig[timer_num]; + return TG[timer.group]->int_ena.val | BIT(timer_num); +} + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/timers.h b/Marlin/src/HAL/ESP32/timers.h new file mode 100644 index 00000000..d722670f --- /dev/null +++ b/Marlin/src/HAL/ESP32/timers.h @@ -0,0 +1,135 @@ +/** + * 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 + +// Includes needed to get I2S_STEPPER_STREAM. Note that pins.h +// is included in case this header is being included early. +#include "../../inc/MarlinConfig.h" +#include "../../pins/pins.h" + +// ------------------------ +// Defines +// ------------------------ +// +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint64_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFFFFFFFFFFULL + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif +#ifndef PWM_TIMER_NUM + #define PWM_TIMER_NUM 2 // index of timer to use for PWM outputs +#endif + +#define HAL_TIMER_RATE APB_CLK_FREQ // frequency of timer peripherals + +#if ENABLED(I2S_STEPPER_STREAM) + #define STEPPER_TIMER_PRESCALE 1 + #define STEPPER_TIMER_RATE 250000 // 250khz, 4µs pulses of i2s word clock + #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs // wrong would be 0.25 +#else + #define STEPPER_TIMER_PRESCALE 40 + #define STEPPER_TIMER_RATE ((HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)) // frequency of stepper timer, 2MHz + #define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#endif + +#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define PWM_TIMER_PRESCALE 10 +#if ENABLED(FAST_PWM_FAN) + #define PWM_TIMER_FREQUENCY FAST_PWM_FAN_FREQUENCY +#else + #define PWM_TIMER_FREQUENCY (50*128) // 50Hz and 7bit resolution +#endif +#define MAX_PWM_PINS 32 // Number of PWM pin-slots + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() +#endif +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() +#endif +#ifndef HAL_PWM_TIMER_ISR + #define HAL_PWM_TIMER_ISR() extern "C" void pwmTC_Handler() +#endif + +extern "C" void tempTC_Handler(); +extern "C" void stepTC_Handler(); +extern "C" void pwmTC_Handler(); + +// ------------------------ +// Types +// ------------------------ + +typedef struct { + timer_group_t group; + timer_idx_t idx; + uint32_t divider; + void (*fn)(); +} tTimerConfig; + +// ------------------------ +// Public Variables +// ------------------------ + +extern const tTimerConfig TimerConfig[]; + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start (const uint8_t timer_num, uint32_t frequency); +void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t count); +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); +hal_timer_t HAL_timer_get_count(const uint8_t timer_num); + +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); + +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/ESP32/watchdog.cpp b/Marlin/src/HAL/ESP32/watchdog.cpp new file mode 100644 index 00000000..f6fcfa31 --- /dev/null +++ b/Marlin/src/HAL/ESP32/watchdog.cpp @@ -0,0 +1,40 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +void watchdogSetup() { + // do whatever. don't remove this function. +} + +void watchdog_init() { + // TODO +} + +#endif // USE_WATCHDOG + +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/watchdog.h b/Marlin/src/HAL/ESP32/watchdog.h new file mode 100644 index 00000000..b6c169e3 --- /dev/null +++ b/Marlin/src/HAL/ESP32/watchdog.h @@ -0,0 +1,38 @@ +/** + * 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" { +#endif + + esp_err_t esp_task_wdt_reset(); + +#ifdef __cplusplus + } +#endif + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. +inline void HAL_watchdog_refresh() { esp_task_wdt_reset(); } diff --git a/Marlin/src/HAL/ESP32/web.cpp b/Marlin/src/HAL/ESP32/web.cpp new file mode 100644 index 00000000..7a27707a --- /dev/null +++ b/Marlin/src/HAL/ESP32/web.cpp @@ -0,0 +1,47 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(WIFISUPPORT, WEBSUPPORT) + +#include "../../inc/MarlinConfig.h" + +#undef DISABLED // esp32-hal-gpio.h +#include +#include "wifi.h" + +AsyncEventSource events("/events"); // event source (Server-Sent events) + +void onNotFound(AsyncWebServerRequest *request) { + request->send(404); +} + +void web_init() { + server.addHandler(&events); // attach AsyncEventSource + server.serveStatic("/", SPIFFS, "/www").setDefaultFile("index.html"); + server.onNotFound(onNotFound); +} + +#endif // WIFISUPPORT && WEBSUPPORT +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/web.h b/Marlin/src/HAL/ESP32/web.h new file mode 100644 index 00000000..60023ac6 --- /dev/null +++ b/Marlin/src/HAL/ESP32/web.h @@ -0,0 +1,24 @@ +/** + * 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 + +void web_init(); diff --git a/Marlin/src/HAL/ESP32/wifi.cpp b/Marlin/src/HAL/ESP32/wifi.cpp new file mode 100644 index 00000000..f4cf5a60 --- /dev/null +++ b/Marlin/src/HAL/ESP32/wifi.cpp @@ -0,0 +1,66 @@ +/** + * 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 . + * + */ +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../core/serial.h" +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(WIFISUPPORT) + +#include +#include +#include +#include "wifi.h" + +AsyncWebServer server(80); + +#ifndef WIFI_HOSTNAME + #define WIFI_HOSTNAME DEFAULT_WIFI_HOSTNAME +#endif + +void wifi_init() { + + SERIAL_ECHO_MSG("Starting WiFi..."); + + WiFi.mode(WIFI_STA); + WiFi.begin(WIFI_SSID, WIFI_PWD); + + while (WiFi.waitForConnectResult() != WL_CONNECTED) { + SERIAL_ERROR_MSG("Unable to connect to WiFi with SSID '" WIFI_SSID "', restarting."); + delay(5000); + ESP.restart(); + } + + delay(10); + if (!MDNS.begin(WIFI_HOSTNAME)) { + SERIAL_ERROR_MSG("Unable to start mDNS with hostname '" WIFI_HOSTNAME "', restarting."); + delay(5000); + ESP.restart(); + } + + MDNS.addService("http", "tcp", 80); + + SERIAL_ECHOLNPAIR("Successfully connected to WiFi with SSID '" WIFI_SSID "', hostname: '" WIFI_HOSTNAME "', IP address: ", WiFi.localIP().toString().c_str()); +} + +#endif // WIFISUPPORT +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/wifi.h b/Marlin/src/HAL/ESP32/wifi.h new file mode 100644 index 00000000..759a73b2 --- /dev/null +++ b/Marlin/src/HAL/ESP32/wifi.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 + +extern AsyncWebServer server; + +#define DEFAULT_WIFI_HOSTNAME "marlin" + +void wifi_init(); diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h new file mode 100644 index 00000000..5eca2f7e --- /dev/null +++ b/Marlin/src/HAL/HAL.h @@ -0,0 +1,52 @@ +/** + * 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 "platforms.h" + +#include HAL_PATH(.,HAL.h) + +#ifdef SERIAL_PORT_2 + #define NUM_SERIAL 2 +#else + #define NUM_SERIAL 1 +#endif + +#define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) + +#ifndef I2C_ADDRESS + #define I2C_ADDRESS(A) uint8_t(A) +#endif + +// Needed for AVR sprintf_P PROGMEM extension +#ifndef S_FMT + #define S_FMT "%s" +#endif + +// String helper +#ifndef PGMSTR + #define PGMSTR(NAM,STR) const char NAM[] = STR +#endif + +inline void watchdog_refresh() { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); +} diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp new file mode 100644 index 00000000..d7d7c2d2 --- /dev/null +++ b/Marlin/src/HAL/LINUX/HAL.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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +HalSerial usb_serial; + +// U8glib required functions +extern "C" void u8g_xMicroDelay(uint16_t val) { + DELAY_US(val); +} +extern "C" void u8g_MicroDelay() { + u8g_xMicroDelay(1); +} +extern "C" void u8g_10MicroDelay() { + u8g_xMicroDelay(10); +} +extern "C" void u8g_Delay(uint16_t val) { + delay(val); +} +//************************// + +// return free heap space +int freeMemory() { + return 0; +} + +// ------------------------ +// ADC +// ------------------------ + +void HAL_adc_init() { + +} + +void HAL_adc_enable_channel(const uint8_t ch) { + +} + +uint8_t active_ch = 0; +void HAL_adc_start_conversion(const uint8_t ch) { + active_ch = ch; +} + +bool HAL_adc_finished() { + return true; +} + +uint16_t HAL_adc_get_result() { + pin_t pin = analogInputToDigitalPin(active_ch); + if (!VALID_PIN(pin)) return 0; + uint16_t data = ((Gpio::get(pin) >> 2) & 0x3FF); + return data; // return 10bit value as Marlin expects +} + +void HAL_pwm_init() { + +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h new file mode 100644 index 00000000..2e545e03 --- /dev/null +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -0,0 +1,114 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 CPU_32_BIT + +#define F_CPU 100000000 +#define SystemCoreClock F_CPU +#include +#include +#include + +#undef min +#undef max + +#include + +void _printf (const char *format, ...); +void _putc(uint8_t c); +uint8_t _getc(); + +//extern "C" volatile uint32_t _millis; + +//arduino: Print.h +#define DEC 10 +#define HEX 16 +#define OCT 8 +#define BIN 2 +//arduino: binary.h (weird defines) +#define B01 1 +#define B10 2 + +#include "hardware/Clock.h" + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" +#include "serial.h" + +#define SHARED_SERVOS HAS_SERVOS + +extern HalSerial usb_serial; +#define MYSERIAL0 usb_serial + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +// +// Interrupts +// +#define CRITICAL_SECTION_START() +#define CRITICAL_SECTION_END() +#define ISRS_ENABLED() +#define ENABLE_ISRS() +#define DISABLE_ISRS() + +inline void HAL_init() {} + +// Utility functions +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +int freeMemory(); +#pragma GCC diagnostic pop + +// ADC +#define HAL_ADC_VREF 5.0 +#define HAL_ADC_RESOLUTION 10 +#define HAL_ANALOG_SELECT(ch) HAL_adc_enable_channel(ch) +#define HAL_START_ADC(ch) HAL_adc_start_conversion(ch) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +void HAL_adc_init(); +void HAL_adc_enable_channel(const uint8_t ch); +void HAL_adc_start_conversion(const uint8_t ch); +uint16_t HAL_adc_get_result(); + +// Reset source +inline void HAL_clear_reset_source(void) {} +inline uint8_t HAL_get_reset_source(void) { return RST_POWER_ON; } + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +/* ---------------- Delay in cycles */ +FORCE_INLINE static void DELAY_CYCLES(uint64_t x) { + Clock::delayCycles(x); +} + +// Add strcmp_P if missing +#ifndef strcmp_P + #define strcmp_P(a, b) strcmp((a), (b)) +#endif diff --git a/Marlin/src/HAL/LINUX/arduino.cpp b/Marlin/src/HAL/LINUX/arduino.cpp new file mode 100644 index 00000000..4b56d02a --- /dev/null +++ b/Marlin/src/HAL/LINUX/arduino.cpp @@ -0,0 +1,101 @@ +/** + * 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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include +#include "../../inc/MarlinConfig.h" +#include "hardware/Clock.h" +#include "../shared/Delay.h" + +// Interrupts +void cli() { } // Disable +void sei() { } // Enable + +// Time functions +void _delay_ms(const int delay_ms) { + delay(delay_ms); +} + +uint32_t millis() { + return (uint32_t)Clock::millis(); +} + +// This is required for some Arduino libraries we are using +void delayMicroseconds(uint32_t us) { + Clock::delayMicros(us); +} + +extern "C" void delay(const int msec) { + Clock::delayMillis(msec); +} + +// IO functions +// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) +void pinMode(const pin_t pin, const uint8_t mode) { + if (!VALID_PIN(pin)) return; + Gpio::setMode(pin, mode); +} + +void digitalWrite(pin_t pin, uint8_t pin_status) { + if (!VALID_PIN(pin)) return; + Gpio::set(pin, pin_status); +} + +bool digitalRead(pin_t pin) { + if (!VALID_PIN(pin)) return false; + return Gpio::get(pin); +} + +void analogWrite(pin_t pin, int pwm_value) { // 1 - 254: pwm_value, 0: LOW, 255: HIGH + if (!VALID_PIN(pin)) return; + Gpio::set(pin, pwm_value); +} + +uint16_t analogRead(pin_t adc_pin) { + if (!VALID_PIN(DIGITAL_PIN_TO_ANALOG_PIN(adc_pin))) return 0; + return Gpio::get(DIGITAL_PIN_TO_ANALOG_PIN(adc_pin)); +} + +char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s) { + char format_string[20]; + snprintf(format_string, 20, "%%%d.%df", __width, __prec); + sprintf(__s, format_string, __val); + return __s; +} + +int32_t random(int32_t max) { + return rand() % max; +} + +int32_t random(int32_t min, int32_t max) { + return min + rand() % (max - min); +} + +void randomSeed(uint32_t value) { + srand(value); +} + +int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) { + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/eeprom.cpp b/Marlin/src/HAL/LINUX/eeprom.cpp new file mode 100644 index 00000000..967ca851 --- /dev/null +++ b/Marlin/src/HAL/LINUX/eeprom.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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + +#include "../shared/eeprom_api.h" +#include + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB of Emulated EEPROM +#endif + +uint8_t buffer[MARLIN_EEPROM_SIZE]; +char filename[] = "eeprom.dat"; + +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { + const char eeprom_erase_value = 0xFF; + FILE * eeprom_file = fopen(filename, "rb"); + if (eeprom_file == nullptr) return false; + + fseek(eeprom_file, 0L, SEEK_END); + std::size_t file_size = ftell(eeprom_file); + + if (file_size < MARLIN_EEPROM_SIZE) { + memset(buffer + file_size, eeprom_erase_value, MARLIN_EEPROM_SIZE - file_size); + } + else { + fseek(eeprom_file, 0L, SEEK_SET); + fread(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file); + } + + fclose(eeprom_file); + return true; +} + +bool PersistentStore::access_finish() { + FILE * eeprom_file = fopen(filename, "wb"); + if (eeprom_file == nullptr) return false; + fwrite(buffer, sizeof(uint8_t), sizeof(buffer), eeprom_file); + fclose(eeprom_file); + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + std::size_t bytes_written = 0; + + for (std::size_t i = 0; i < size; i++) { + buffer[pos+i] = value[i]; + bytes_written ++; + } + + crc16(crc, value, size); + pos = pos + size; + return (bytes_written != size); // return true for any error +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + std::size_t bytes_read = 0; + if (writing) { + for (std::size_t i = 0; i < size; i++) { + value[i] = buffer[pos+i]; + bytes_read ++; + } + crc16(crc, value, size); + } + else { + uint8_t temp[size]; + for (std::size_t i = 0; i < size; i++) { + temp[i] = buffer[pos+i]; + bytes_read ++; + } + crc16(crc, temp, size); + } + + pos = pos + size; + return bytes_read != size; // return true for any error +} + +#endif // EEPROM_SETTINGS +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/fastio.h b/Marlin/src/HAL/LINUX/fastio.h new file mode 100644 index 00000000..4567c62a --- /dev/null +++ b/Marlin/src/HAL/LINUX/fastio.h @@ -0,0 +1,111 @@ +/** + * 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 + +/** + * Fast I/O Routines for X86_64 + */ + +#include "../shared/Marduino.h" +#include + +#define SET_DIR_INPUT(IO) Gpio::setDir(IO, 1) +#define SET_DIR_OUTPUT(IO) Gpio::setDir(IO, 0) + +#define SET_MODE(IO, mode) Gpio::setMode(IO, mode) + +#define WRITE_PIN_SET(IO) Gpio::set(IO) +#define WRITE_PIN_CLR(IO) Gpio::clear(IO) + +#define READ_PIN(IO) Gpio::get(IO) +#define WRITE_PIN(IO,V) Gpio::set(IO, V) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html + */ + +/// Read a pin +#define _READ(IO) READ_PIN(IO) + +/// Write to a pin +#define _WRITE(IO,V) WRITE_PIN(IO,V) + +/// toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +/// set pin as input +#define _SET_INPUT(IO) SET_DIR_INPUT(IO) + +/// set pin as output +#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO) + +/// set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +/// set pin as input with pulldown mode +#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT) + +// hg42: all pins can be input or output (I hope) +// hg42: undefined pins create compile error (IO, is no pin) +// hg42: currently not used, but was used by pinsDebug + +/// check if pin is an input +#define _IS_INPUT(IO) (LPC1768_PIN_PIN(IO) >= 0) + +/// check if pin is an output +#define _IS_OUTPUT(IO) (LPC1768_PIN_PIN(IO) >= 0) + +/// Read a pin wrapper +#define READ(IO) _READ(IO) + +/// Write to a pin wrapper +#define WRITE(IO,V) _WRITE(IO,V) + +/// toggle a pin wrapper +#define TOGGLE(IO) _TOGGLE(IO) + +/// set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) +/// set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +/// set pin as input with pulldown wrapper +#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0) +/// set pin as output wrapper - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0) +// set pin as PWM +#define SET_PWM(IO) SET_OUTPUT(IO) + +/// check if pin is an input wrapper +#define IS_INPUT(IO) _IS_INPUT(IO) +/// check if pin is an output wrapper +#define IS_OUTPUT(IO) _IS_OUTPUT(IO) + +// Shorthand +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/LINUX/hardware/Clock.cpp b/Marlin/src/HAL/LINUX/hardware/Clock.cpp new file mode 100644 index 00000000..1984a4a4 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Clock.cpp @@ -0,0 +1,31 @@ +/** + * 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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "../../../inc/MarlinConfig.h" +#include "Clock.h" + +std::chrono::nanoseconds Clock::startup = std::chrono::high_resolution_clock::now().time_since_epoch(); +uint32_t Clock::frequency = F_CPU; +double Clock::time_multiplier = 1.0; + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Clock.h b/Marlin/src/HAL/LINUX/hardware/Clock.h new file mode 100644 index 00000000..072eacfd --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Clock.h @@ -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 . + * + */ +#pragma once + +#include +#include + +class Clock { +public: + static uint64_t ticks(uint32_t frequency = Clock::frequency) { + return (Clock::nanos() - Clock::startup.count()) / (1000000000ULL / frequency); + } + + static uint64_t nanosToTicks(uint64_t ns, uint32_t frequency = Clock::frequency) { + return ns / (1000000000ULL / frequency); + } + + // Time acceleration compensated + static uint64_t ticksToNanos(uint64_t tick, uint32_t frequency = Clock::frequency) { + return (tick * (1000000000ULL / frequency)) / Clock::time_multiplier; + } + + static void setFrequency(uint32_t freq) { + Clock::frequency = freq; + } + + // Time Acceleration compensated + static uint64_t nanos() { + auto now = std::chrono::high_resolution_clock::now().time_since_epoch(); + return (now.count() - Clock::startup.count()) * Clock::time_multiplier; + } + + static uint64_t micros() { + return Clock::nanos() / 1000; + } + + static uint64_t millis() { + return Clock::micros() / 1000; + } + + static double seconds() { + return Clock::nanos() / 1000000000.0; + } + + static void delayCycles(uint64_t cycles) { + std::this_thread::sleep_for(std::chrono::nanoseconds( (1000000000L / frequency) * cycles) / Clock::time_multiplier ); + } + + static void delayMicros(uint64_t micros) { + std::this_thread::sleep_for(std::chrono::microseconds( micros ) / Clock::time_multiplier); + } + + static void delayMillis(uint64_t millis) { + std::this_thread::sleep_for(std::chrono::milliseconds( millis ) / Clock::time_multiplier); + } + + static void delaySeconds(double secs) { + std::this_thread::sleep_for(std::chrono::duration(secs * 1000) / Clock::time_multiplier); + } + + // Will reduce timer resolution increasing likelihood of overflows + static void setTimeMultiplier(double tm) { + Clock::time_multiplier = tm; + } + +private: + static std::chrono::nanoseconds startup; + static uint32_t frequency; + static double time_multiplier; +}; diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.cpp b/Marlin/src/HAL/LINUX/hardware/Gpio.cpp new file mode 100644 index 00000000..61a7be7d --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Gpio.cpp @@ -0,0 +1,29 @@ +/** + * 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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "Gpio.h" + +pin_data Gpio::pin_map[Gpio::pin_count+1] = {}; +IOLogger* Gpio::logger = nullptr; + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Gpio.h b/Marlin/src/HAL/LINUX/hardware/Gpio.h new file mode 100644 index 00000000..9255ec1d --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Gpio.h @@ -0,0 +1,141 @@ +/** + * 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 "Clock.h" +#include "../../../inc/MarlinConfigPre.h" +#include + +typedef int16_t pin_type; + +struct GpioEvent { + enum Type { + NOP, + FALL, + RISE, + SET_VALUE, + SETM, + SETD + }; + uint64_t timestamp; + pin_type pin_id; + GpioEvent::Type event; + + GpioEvent(uint64_t timestamp, pin_type pin_id, GpioEvent::Type event){ + this->timestamp = timestamp; + this->pin_id = pin_id; + this->event = event; + } +}; + +class IOLogger { +public: + virtual ~IOLogger(){}; + virtual void log(GpioEvent ev) = 0; +}; + +class Peripheral { +public: + virtual ~Peripheral(){}; + virtual void interrupt(GpioEvent ev) = 0; + virtual void update() = 0; +}; + +struct pin_data { + uint8_t dir; + uint8_t mode; + uint16_t value; + Peripheral* cb; +}; + +class Gpio { +public: + + static const pin_type pin_count = 255; + static pin_data pin_map[pin_count+1]; + + static bool valid_pin(pin_type pin) { + return pin >= 0 && pin <= pin_count; + } + + static void set(pin_type pin) { + set(pin, 1); + } + + static void set(pin_type pin, uint16_t value) { + if (!valid_pin(pin)) return; + GpioEvent::Type evt_type = value > 1 ? GpioEvent::SET_VALUE : value > pin_map[pin].value ? GpioEvent::RISE : value < pin_map[pin].value ? GpioEvent::FALL : GpioEvent::NOP; + pin_map[pin].value = value; + GpioEvent evt(Clock::nanos(), pin, evt_type); + if (pin_map[pin].cb != nullptr) { + pin_map[pin].cb->interrupt(evt); + } + if (Gpio::logger != nullptr) Gpio::logger->log(evt); + } + + static uint16_t get(pin_type pin) { + if (!valid_pin(pin)) return 0; + return pin_map[pin].value; + } + + static void clear(pin_type pin) { + set(pin, 0); + } + + static void setMode(pin_type pin, uint8_t value) { + if (!valid_pin(pin)) return; + pin_map[pin].mode = value; + GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETM); + if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt); + if (Gpio::logger != nullptr) Gpio::logger->log(evt); + } + + static uint8_t getMode(pin_type pin) { + if (!valid_pin(pin)) return 0; + return pin_map[pin].mode; + } + + static void setDir(pin_type pin, uint8_t value) { + if (!valid_pin(pin)) return; + pin_map[pin].dir = value; + GpioEvent evt(Clock::nanos(), pin, GpioEvent::Type::SETD); + if (pin_map[pin].cb != nullptr) pin_map[pin].cb->interrupt(evt); + if (Gpio::logger != nullptr) Gpio::logger->log(evt); + } + + static uint8_t getDir(pin_type pin) { + if (!valid_pin(pin)) return 0; + return pin_map[pin].dir; + } + + static void attachPeripheral(pin_type pin, Peripheral* per) { + if (!valid_pin(pin)) return; + pin_map[pin].cb = per; + } + + static void attachLogger(IOLogger* logger) { + Gpio::logger = logger; + } + +private: + static IOLogger* logger; +}; diff --git a/Marlin/src/HAL/LINUX/hardware/Heater.cpp b/Marlin/src/HAL/LINUX/hardware/Heater.cpp new file mode 100644 index 00000000..70df8161 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Heater.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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "Clock.h" +#include +#include "../../../inc/MarlinConfig.h" + +#include "Heater.h" + +Heater::Heater(pin_t heater, pin_t adc) { + heater_state = 0; + room_temp_raw = 150; + last = Clock::micros(); + heater_pin = heater; + adc_pin = adc; + heat = 0.0; +} + +Heater::~Heater() { +} + +void Heater::update() { + // crude pwm read and cruder heat simulation + auto now = Clock::micros(); + double delta = (now - last); + if (delta > 1000 ) { + heater_state = pwmcap.update(0xFFFF * Gpio::pin_map[heater_pin].value); + last = now; + heat += (heater_state - heat) * (delta / 1000000000.0); + + NOLESS(heat, room_temp_raw); + Gpio::pin_map[analogInputToDigitalPin(adc_pin)].value = 0xFFFF - (uint16_t)heat; + } +} + +void Heater::interrupt(GpioEvent ev) { + // ununsed +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Heater.h b/Marlin/src/HAL/LINUX/hardware/Heater.h new file mode 100644 index 00000000..b17078d0 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Heater.h @@ -0,0 +1,47 @@ +/** + * 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 "Gpio.h" + +struct LowpassFilter { + uint64_t data_delay = 0; + uint16_t update(uint16_t value) { + data_delay = data_delay - (data_delay >> 6) + value; + return (uint16_t)(data_delay >> 6); + } +}; + +class Heater: public Peripheral { +public: + Heater(pin_t heater, pin_t adc); + virtual ~Heater(); + void interrupt(GpioEvent ev); + void update(); + + pin_t heater_pin, adc_pin; + uint16_t room_temp_raw; + uint16_t heater_state; + LowpassFilter pwmcap; + double heat; + uint64_t last; +}; diff --git a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp new file mode 100644 index 00000000..c11fd1f5 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.cpp @@ -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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "IOLoggerCSV.h" + +IOLoggerCSV::IOLoggerCSV(std::string filename) { + file.open(filename); +} + +IOLoggerCSV::~IOLoggerCSV() { + file.close(); +} + +void IOLoggerCSV::log(GpioEvent ev) { + std::lock_guard lock(vector_lock); + events.push_back(ev); //minimal impact to signal handler +} + +void IOLoggerCSV::flush() { + { std::lock_guard lock(vector_lock); + while (!events.empty()) { + file << events.front().timestamp << ", "<< events.front().pin_id << ", " << events.front().event << std::endl; + events.pop_front(); + } + } + file.flush(); +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h new file mode 100644 index 00000000..d8fe7383 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/IOLoggerCSV.h @@ -0,0 +1,40 @@ +/** + * 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 +#include "Gpio.h" + +class IOLoggerCSV: public IOLogger { +public: + IOLoggerCSV(std::string filename); + virtual ~IOLoggerCSV(); + void flush(); + void log(GpioEvent ev); + +private: + std::ofstream file; + std::list events; + std::mutex vector_lock; +}; diff --git a/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp b/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp new file mode 100644 index 00000000..c5b3ccc9 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/LinearAxis.cpp @@ -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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include +#include +#include "Clock.h" +#include "LinearAxis.h" + +LinearAxis::LinearAxis(pin_type enable, pin_type dir, pin_type step, pin_type end_min, pin_type end_max) { + enable_pin = enable; + dir_pin = dir; + step_pin = step; + min_pin = end_min; + max_pin = end_max; + + min_position = 50; + max_position = (200*80) + min_position; + position = rand() % ((max_position - 40) - min_position) + (min_position + 20); + last_update = Clock::nanos(); + + Gpio::attachPeripheral(step_pin, this); + +} + +LinearAxis::~LinearAxis() { + +} + +void LinearAxis::update() { + +} + +void LinearAxis::interrupt(GpioEvent ev) { + if (ev.pin_id == step_pin && !Gpio::pin_map[enable_pin].value){ + if (ev.event == GpioEvent::RISE) { + last_update = ev.timestamp; + position += -1 + 2 * Gpio::pin_map[dir_pin].value; + Gpio::pin_map[min_pin].value = (position < min_position); + //Gpio::pin_map[max_pin].value = (position > max_position); + //if (position < min_position) printf("axis(%d) endstop : pos: %d, mm: %f, min: %d\n", step_pin, position, position / 80.0, Gpio::pin_map[min_pin].value); + } + } +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/LinearAxis.h b/Marlin/src/HAL/LINUX/hardware/LinearAxis.h new file mode 100644 index 00000000..34541e79 --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/LinearAxis.h @@ -0,0 +1,45 @@ +/** + * 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 "Gpio.h" + +class LinearAxis: public Peripheral { +public: + LinearAxis(pin_type enable, pin_type dir, pin_type step, pin_type end_min, pin_type end_max); + virtual ~LinearAxis(); + void update(); + void interrupt(GpioEvent ev); + + pin_type enable_pin; + pin_type dir_pin; + pin_type step_pin; + pin_type min_pin; + pin_type max_pin; + + int32_t position; + int32_t min_position; + int32_t max_position; + uint64_t last_update; + +}; diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.cpp b/Marlin/src/HAL/LINUX/hardware/Timer.cpp new file mode 100644 index 00000000..9f0d6a8f --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Timer.cpp @@ -0,0 +1,117 @@ +/** + * 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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "Timer.h" +#include + +Timer::Timer() { + active = false; + compare = 0; + frequency = 0; + overruns = 0; + timerid = 0; + cbfn = nullptr; + period = 0; + start_time = 0; + avg_error = 0; +} + +Timer::~Timer() { + timer_delete(timerid); +} + +void Timer::init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn) { + struct sigaction sa; + struct sigevent sev; + + frequency = sim_freq; + cbfn = fn; + + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = Timer::handler; + sigemptyset(&sa.sa_mask); + if (sigaction(SIGRTMIN, &sa, nullptr) == -1) { + return; // todo: handle error + } + + sigemptyset(&mask); + sigaddset(&mask, SIGRTMIN); + + disable(); + + sev.sigev_notify = SIGEV_SIGNAL; + sev.sigev_signo = SIGRTMIN; + sev.sigev_value.sival_ptr = (void*)this; + if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) { + return; // todo: handle error + } +} + +void Timer::start(uint32_t frequency) { + setCompare(this->frequency / frequency); + //printf("timer(%ld) started\n", getID()); +} + +void Timer::enable() { + if (sigprocmask(SIG_UNBLOCK, &mask, nullptr) == -1) { + return; // todo: handle error + } + active = true; + //printf("timer(%ld) enabled\n", getID()); +} + +void Timer::disable() { + if (sigprocmask(SIG_SETMASK, &mask, nullptr) == -1) { + return; // todo: handle error + } + active = false; +} + +void Timer::setCompare(uint32_t compare) { + uint32_t nsec_offset = 0; + if (active) { + nsec_offset = Clock::nanos() - this->start_time; // calculate how long the timer would have been running for + nsec_offset = nsec_offset < 1000 ? nsec_offset : 0; // constrain, this shouldn't be needed but apparently Marlin enables interrupts on the stepper timer before initialising it, todo: investigate ?bug? + } + this->compare = compare; + uint64_t ns = Clock::ticksToNanos(compare, frequency) - nsec_offset; + struct itimerspec its; + its.it_value.tv_sec = ns / 1000000000; + its.it_value.tv_nsec = ns % 1000000000; + its.it_interval.tv_sec = its.it_value.tv_sec; + its.it_interval.tv_nsec = its.it_value.tv_nsec; + + if (timer_settime(timerid, 0, &its, nullptr) == -1) { + printf("timer(%ld) failed, compare: %d(%ld)\n", getID(), compare, its.it_value.tv_nsec); + return; // todo: handle error + } + //printf("timer(%ld) started, compare: %d(%d)\n", getID(), compare, its.it_value.tv_nsec); + this->period = its.it_value.tv_nsec; + this->start_time = Clock::nanos(); +} + +uint32_t Timer::getCount() { + return Clock::nanosToTicks(Clock::nanos() - this->start_time, frequency); +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/hardware/Timer.h b/Marlin/src/HAL/LINUX/hardware/Timer.h new file mode 100644 index 00000000..757efdcd --- /dev/null +++ b/Marlin/src/HAL/LINUX/hardware/Timer.h @@ -0,0 +1,76 @@ +/** + * 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 +#include +#include +#include + +#include "Clock.h" + +class Timer { +public: + Timer(); + virtual ~Timer(); + + typedef void (callback_fn)(); + + void init(uint32_t sig_id, uint32_t sim_freq, callback_fn* fn); + void start(uint32_t frequency); + void enable(); + bool enabled() {return active;} + void disable(); + void setCompare(uint32_t compare); + uint32_t getCount(); + uint32_t getCompare() {return compare;} + uint32_t getOverruns() {return overruns;} + uint32_t getAvgError() {return avg_error;} + + intptr_t getID() { + return (*(intptr_t*)timerid); + } + + static void handler(int sig, siginfo_t *si, void *uc){ + Timer* _this = (Timer*)si->si_value.sival_ptr; + _this->avg_error += (Clock::nanos() - _this->start_time) - _this->period; //high_resolution_clock is also limited in precision, but best we have + _this->avg_error /= 2; //very crude precision analysis (actually within +-500ns usually) + _this->start_time = Clock::nanos(); // wrap + _this->cbfn(); + _this->overruns += timer_getoverrun(_this->timerid); // even at 50Khz this doesn't stay zero, again demonstrating the limitations + // using a realtime linux kernel would help somewhat + } + +private: + bool active; + uint32_t compare; + uint32_t frequency; + uint32_t overruns; + timer_t timerid; + sigset_t mask; + callback_fn* cbfn; + uint64_t period; + uint64_t avg_error; + uint64_t start_time; +}; diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h new file mode 100644 index 00000000..99a6fc27 --- /dev/null +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/LINUX." +#endif diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h b/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/LINUX/inc/Conditionals_post.h b/Marlin/src/HAL/LINUX/inc/Conditionals_post.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/LINUX/inc/Conditionals_post.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h new file mode 100644 index 00000000..84167c97 --- /dev/null +++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h @@ -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 . + * + */ +#pragma once + +/** + * Test X86_64-specific configuration values for errors at compile-time. + */ + +// Emulating RAMPS +#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) + #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" +#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 LINUX." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h new file mode 100644 index 00000000..e28b474e --- /dev/null +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -0,0 +1,115 @@ +/** + * 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 +#include + +#include + +#define HIGH 0x01 +#define LOW 0x00 + +#define INPUT 0x00 +#define OUTPUT 0x01 +#define INPUT_PULLUP 0x02 +#define INPUT_PULLDOWN 0x03 + +#define LSBFIRST 0 +#define MSBFIRST 1 + +#define CHANGE 0x02 +#define FALLING 0x03 +#define RISING 0x04 + +typedef uint8_t byte; +#define PROGMEM +#define PSTR(v) (v) +#define PGM_P const char * + +// Used for libraries, preprocessor, and constants +#define abs(x) ((x)>0?(x):-(x)) + +#ifndef isnan + #define isnan std::isnan +#endif +#ifndef isinf + #define isinf std::isinf +#endif + +#define sq(v) ((v) * (v)) +#define square(v) sq(v) +#define constrain(value, arg_min, arg_max) ((value) < (arg_min) ? (arg_min) :((value) > (arg_max) ? (arg_max) : (value))) + +//Interrupts +void cli(); // Disable +void sei(); // Enable +void attachInterrupt(uint32_t pin, void (*callback)(), uint32_t mode); +void detachInterrupt(uint32_t pin); +extern "C" void GpioEnableInt(uint32_t port, uint32_t pin, uint32_t mode); +extern "C" void GpioDisableInt(uint32_t port, uint32_t pin); + +// Program Memory +#define pgm_read_ptr(addr) (*((void**)(addr))) +#define pgm_read_byte_near(addr) (*((uint8_t*)(addr))) +#define pgm_read_float_near(addr) (*((float*)(addr))) +#define pgm_read_word_near(addr) (*((uint16_t*)(addr))) +#define pgm_read_dword_near(addr) (*((uint32_t*)(addr))) +#define pgm_read_byte(addr) pgm_read_byte_near(addr) +#define pgm_read_float(addr) pgm_read_float_near(addr) +#define pgm_read_word(addr) pgm_read_word_near(addr) +#define pgm_read_dword(addr) pgm_read_dword_near(addr) + +using std::memcpy; +#define memcpy_P memcpy +#define sprintf_P sprintf +#define strstr_P strstr +#define strncpy_P strncpy +#define vsnprintf_P vsnprintf +#define strcpy_P strcpy +#define snprintf_P snprintf +#define strlen_P strlen + +// Time functions +extern "C" { + void delay(const int milis); +} +void _delay_ms(const int delay); +void delayMicroseconds(unsigned long); +uint32_t millis(); + +//IO functions +void pinMode(const pin_t, const uint8_t); +void digitalWrite(pin_t, uint8_t); +bool digitalRead(pin_t); +void analogWrite(pin_t, int); +uint16_t analogRead(pin_t); + +int32_t random(int32_t); +int32_t random(int32_t, int32_t); +void randomSeed(uint32_t); + +char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s); + +int map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max); diff --git a/Marlin/src/HAL/LINUX/include/pinmapping.cpp b/Marlin/src/HAL/LINUX/include/pinmapping.cpp new file mode 100644 index 00000000..870ab3a9 --- /dev/null +++ b/Marlin/src/HAL/LINUX/include/pinmapping.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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include + +#include "../../../gcode/parser.h" + +uint8_t analog_offset = NUM_DIGITAL_PINS - NUM_ANALOG_INPUTS; + +// Get the digital pin for an analog index +pin_t analogInputToDigitalPin(const int8_t p) { + return (WITHIN(p, 0, NUM_ANALOG_INPUTS) ? analog_offset + p : P_NC); +} + +// Return the index of a pin number +int16_t GET_PIN_MAP_INDEX(const pin_t pin) { + return pin; +} + +// Test whether the pin is valid +bool VALID_PIN(const pin_t p) { + return WITHIN(p, 0, NUM_DIGITAL_PINS); +} + +// Get the analog index for a digital pin +int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p) { + return (WITHIN(p, analog_offset, NUM_DIGITAL_PINS) ? p - analog_offset : P_NC); +} + +// Test whether the pin is PWM +bool PWM_PIN(const pin_t p) { + return false; +} + +// Test whether the pin is interruptable +bool INTERRUPT_PIN(const pin_t p) { + return false; +} + +// Get the pin number at the given index +pin_t GET_PIN_MAP_PIN(const int16_t ind) { + return ind; +} + +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { + return parser.intval(code, dval); +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/include/pinmapping.h b/Marlin/src/HAL/LINUX/include/pinmapping.h new file mode 100644 index 00000000..98f4b812 --- /dev/null +++ b/Marlin/src/HAL/LINUX/include/pinmapping.h @@ -0,0 +1,59 @@ +/** + * 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 +#include "../hardware/Gpio.h" + +typedef pin_type pin_t; + +#define P_NC -1 +constexpr uint16_t NUM_DIGITAL_PINS = Gpio::pin_count; +constexpr uint8_t NUM_ANALOG_INPUTS = 16; + +#define HAL_SENSITIVE_PINS + +// Get the digital pin for an analog index +pin_t analogInputToDigitalPin(const int8_t p); + +// Return the index of a pin number +int16_t GET_PIN_MAP_INDEX(const pin_t pin); + +// Test whether the pin is valid +bool VALID_PIN(const pin_t p); + +// Get the analog index for a digital pin +int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t p); + +// Test whether the pin is PWM +bool PWM_PIN(const pin_t p); + +// Test whether the pin is interruptable +bool INTERRUPT_PIN(const pin_t p); + +// Get the pin number at the given index +pin_t GET_PIN_MAP_PIN(const int16_t ind); + +// Parse a G-code word into a pin index +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h new file mode 100644 index 00000000..e9162493 --- /dev/null +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -0,0 +1,208 @@ +/** + * 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" +#if ENABLED(EMERGENCY_PARSER) + #include "../../../feature/e_parser.h" +#endif + +#include +#include + +/** + * Generic RingBuffer + * T type of the buffer array + * S size of the buffer (must be power of 2) + */ +template class RingBuffer { +public: + RingBuffer() { index_read = index_write = 0; } + uint32_t available() volatile { return index_write - index_read; } + uint32_t free() volatile { return buffer_size - available(); } + bool empty() volatile { return index_read == index_write; } + bool full() volatile { return available() == buffer_size; } + void clear() volatile { index_read = index_write = 0; } + + bool peek(T *value) volatile { + if (value == 0 || available() == 0) + return false; + *value = buffer[mask(index_read)]; + return true; + } + + int read() volatile { + if (empty()) return -1; + return buffer[mask(index_read++)]; + } + + bool write(T value) volatile { + if (full()) return false; + buffer[mask(index_write++)] = value; + return true; + } + +private: + uint32_t mask(uint32_t val) volatile { + return buffer_mask & val; + } + + static const uint32_t buffer_size = S; + static const uint32_t buffer_mask = buffer_size - 1; + volatile T buffer[buffer_size]; + volatile uint32_t index_write; + volatile uint32_t index_read; +}; + +class HalSerial { +public: + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + static inline bool emergency_parser_enabled() { return true; } + #endif + + HalSerial() { host_connected = true; } + + void begin(int32_t) {} + + void end() {} + + int peek() { + uint8_t value; + return receive_buffer.peek(&value) ? value : -1; + } + + int read() { return receive_buffer.read(); } + + size_t write(char c) { + if (!host_connected) return 0; + while (!transmit_buffer.free()); + return transmit_buffer.write(c); + } + + operator bool() { return host_connected; } + + uint16_t available() { + return (uint16_t)receive_buffer.available(); + } + + void flush() { receive_buffer.clear(); } + + uint8_t availableForWrite() { + return transmit_buffer.free() > 255 ? 255 : (uint8_t)transmit_buffer.free(); + } + + void flushTX() { + if (host_connected) + while (transmit_buffer.available()) { /* nada */ } + } + + void printf(const char *format, ...) { + static char buffer[256]; + va_list vArgs; + va_start(vArgs, format); + int length = vsnprintf((char *) buffer, 256, (char const *) format, vArgs); + va_end(vArgs); + if (length > 0 && length < 256) { + if (host_connected) { + for (int i = 0; i < length;) { + if (transmit_buffer.write(buffer[i])) { + ++i; + } + } + } + } + } + + #define DEC 10 + #define HEX 16 + #define OCT 8 + #define BIN 2 + + void print_bin(uint32_t value, uint8_t num_digits) { + uint32_t mask = 1 << (num_digits -1); + for (uint8_t i = 0; i < num_digits; i++) { + if (!(i % 4) && i) write(' '); + if (!(i % 16) && i) write(' '); + if (value & mask) write('1'); + else write('0'); + value <<= 1; + } + } + + void print(const char value[]) { printf("%s" , value); } + void print(char value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 8); + else if (nbase == OCT) printf("%3o", value); + else if (nbase == HEX) printf("%2X", value); + else if (nbase == DEC ) printf("%d", value); + else printf("%c" , value); + } + void print(unsigned char value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 8); + else if (nbase == OCT) printf("%3o", value); + else if (nbase == HEX) printf("%2X", value); + else printf("%u" , value); + } + void print(int value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 16); + else if (nbase == OCT) printf("%6o", value); + else if (nbase == HEX) printf("%4X", value); + else printf("%d", value); + } + void print(unsigned int value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 16); + else if (nbase == OCT) printf("%6o", value); + else if (nbase == HEX) printf("%4X", value); + else printf("%u" , value); + } + void print(long value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 32); + else if (nbase == OCT) printf("%11o", value); + else if (nbase == HEX) printf("%8X", value); + else printf("%ld" , value); + } + void print(unsigned long value, int nbase = 0) { + if (nbase == BIN) print_bin(value, 32); + else if (nbase == OCT) printf("%11o", value); + else if (nbase == HEX) printf("%8X", value); + else printf("%lu" , value); + } + void print(float value, int round = 6) { printf("%f" , value); } + void print(double value, int round = 6) { printf("%f" , value); } + + void println(const char value[]) { printf("%s\n" , value); } + void println(char value, int nbase = 0) { print(value, nbase); println(); } + void println(unsigned char value, int nbase = 0) { print(value, nbase); println(); } + void println(int value, int nbase = 0) { print(value, nbase); println(); } + void println(unsigned int value, int nbase = 0) { print(value, nbase); println(); } + void println(long value, int nbase = 0) { print(value, nbase); println(); } + void println(unsigned long value, int nbase = 0) { print(value, nbase); println(); } + void println(float value, int round = 6) { printf("%f\n" , value); } + void println(double value, int round = 6) { printf("%f\n" , value); } + void println() { print('\n'); } + + volatile RingBuffer receive_buffer; + volatile RingBuffer transmit_buffer; + volatile bool host_connected; +}; diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp new file mode 100644 index 00000000..481f0590 --- /dev/null +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -0,0 +1,136 @@ +/** + * 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 __PLAT_LINUX__ + +extern void setup(); +extern void loop(); + +#include + +#include +#include + +#include "../../inc/MarlinConfig.h" +#include +#include +#include "../shared/Delay.h" +#include "hardware/IOLoggerCSV.h" +#include "hardware/Heater.h" +#include "hardware/LinearAxis.h" + +// simple stdout / stdin implementation for fake serial port +void write_serial_thread() { + for (;;) { + for (std::size_t i = usb_serial.transmit_buffer.available(); i > 0; i--) { + fputc(usb_serial.transmit_buffer.read(), stdout); + } + std::this_thread::yield(); + } +} + +void read_serial_thread() { + char buffer[255] = {}; + for (;;) { + std::size_t len = _MIN(usb_serial.receive_buffer.free(), 254U); + if (fgets(buffer, len, stdin)) + for (std::size_t i = 0; i < strlen(buffer); i++) + usb_serial.receive_buffer.write(buffer[i]); + std::this_thread::yield(); + } +} + +void simulation_loop() { + Heater hotend(HEATER_0_PIN, TEMP_0_PIN); + Heater bed(HEATER_BED_PIN, TEMP_BED_PIN); + LinearAxis x_axis(X_ENABLE_PIN, X_DIR_PIN, X_STEP_PIN, X_MIN_PIN, X_MAX_PIN); + LinearAxis y_axis(Y_ENABLE_PIN, Y_DIR_PIN, Y_STEP_PIN, Y_MIN_PIN, Y_MAX_PIN); + LinearAxis z_axis(Z_ENABLE_PIN, Z_DIR_PIN, Z_STEP_PIN, Z_MIN_PIN, Z_MAX_PIN); + LinearAxis extruder0(E0_ENABLE_PIN, E0_DIR_PIN, E0_STEP_PIN, P_NC, P_NC); + + //#define GPIO_LOGGING // Full GPIO and Positional Logging + + #ifdef GPIO_LOGGING + IOLoggerCSV logger("all_gpio_log.csv"); + Gpio::attachLogger(&logger); + + std::ofstream position_log; + position_log.open("axis_position_log.csv"); + + int32_t x,y,z; + #endif + + for (;;) { + + hotend.update(); + bed.update(); + + x_axis.update(); + y_axis.update(); + z_axis.update(); + extruder0.update(); + + #ifdef GPIO_LOGGING + if (x_axis.position != x || y_axis.position != y || z_axis.position != z) { + uint64_t update = MAX3(x_axis.last_update, y_axis.last_update, z_axis.last_update); + position_log << update << ", " << x_axis.position << ", " << y_axis.position << ", " << z_axis.position << std::endl; + position_log.flush(); + x = x_axis.position; + y = y_axis.position; + z = z_axis.position; + } + // flush the logger + logger.flush(); + #endif + + std::this_thread::yield(); + } +} + +int main() { + std::thread write_serial (write_serial_thread); + std::thread read_serial (read_serial_thread); + + #ifdef MYSERIAL0 + MYSERIAL0.begin(BAUDRATE); + SERIAL_ECHOLNPGM("x86_64 Initialized"); + SERIAL_FLUSHTX(); + #endif + + Clock::setFrequency(F_CPU); + Clock::setTimeMultiplier(1.0); // some testing at 10x + + HAL_timer_init(); + + std::thread simulation (simulation_loop); + + DELAY_US(10000); + + setup(); + for (;;) { + loop(); + std::this_thread::yield(); + } + + simulation.join(); + write_serial.join(); + read_serial.join(); +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/pinsDebug.h b/Marlin/src/HAL/LINUX/pinsDebug.h new file mode 100644 index 00000000..a93ceddc --- /dev/null +++ b/Marlin/src/HAL/LINUX/pinsDebug.h @@ -0,0 +1,59 @@ +/** + * 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 . + * + */ + +/** + * Support routines for X86_64 + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define pwm_details(pin) pin = pin // do nothing // print PWM details +#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) +#define digitalRead_mod(p) digitalRead(p) +#define PRINT_PORT(p) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +// active ADC function/mode/code values for PINSEL registers +constexpr int8_t ADC_pin_mode(pin_t pin) { + return (-1); +} + +int8_t get_pin_mode(pin_t pin) { + if (!VALID_PIN(pin)) return -1; + return 0; +} + +bool GET_PINMODE(pin_t pin) { + int8_t pin_mode = get_pin_mode(pin); + if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // found an invalid pin or active analog pin + return false; + + return (Gpio::getMode(pin) != 0); //input/output state +} + +bool GET_ARRAY_IS_DIGITAL(pin_t pin) { + return (!IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin)); +} diff --git a/Marlin/src/HAL/LINUX/servo_private.h b/Marlin/src/HAL/LINUX/servo_private.h new file mode 100644 index 00000000..bcc8d203 --- /dev/null +++ b/Marlin/src/HAL/LINUX/servo_private.h @@ -0,0 +1,79 @@ +/** + * 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 + +/** + * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. 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 + */ + +/** + * Based on "servo.h - Interrupt driven Servo library for Arduino using 16 bit timers - + * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. + * + * The only modification was to update/delete macros to match the LPC176x. + */ + +#include + +// Macros +//values in microseconds +#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached +#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds + +#define MAX_SERVOS 4 + +#define INVALID_SERVO 255 // flag indicating an invalid servo index + + +// Types + +typedef struct { + uint8_t nbr : 8 ; // a pin number from 0 to 254 (255 signals invalid pin) + uint8_t isActive : 1 ; // true if this channel is enabled, pin not pulsed if false +} ServoPin_t; + +typedef struct { + ServoPin_t Pin; + unsigned int pulse_width; // pulse width in microseconds +} ServoInfo_t; + +// Global variables + +extern uint8_t ServoCount; +extern ServoInfo_t servo_info[MAX_SERVOS]; diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h new file mode 100644 index 00000000..01ba28e5 --- /dev/null +++ b/Marlin/src/HAL/LINUX/spi_pins.h @@ -0,0 +1,54 @@ +/** + * 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 "../../core/macros.h" +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_MARLINUI_U8GLIB, SDSUPPORT) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) + #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently + // needed due to the speed and mode required for communicating with each device being different. + // This requirement can be removed if the SPI access to these devices is updated to use + // spiBeginTransaction. +#endif + +/** onboard SD card */ +//#define SCK_PIN P0_07 +//#define MISO_PIN P0_08 +//#define MOSI_PIN P0_09 +//#define SS_PIN P0_06 +/** external */ +#ifndef SCK_PIN + #define SCK_PIN 50 +#endif +#ifndef MISO_PIN + #define MISO_PIN 51 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN 52 +#endif +#ifndef SS_PIN + #define SS_PIN 53 +#endif +#ifndef SDSS + #define SDSS SS_PIN +#endif diff --git a/Marlin/src/HAL/LINUX/timers.cpp b/Marlin/src/HAL/LINUX/timers.cpp new file mode 100644 index 00000000..66d80f25 --- /dev/null +++ b/Marlin/src/HAL/LINUX/timers.cpp @@ -0,0 +1,71 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 __PLAT_LINUX__ + +#include "hardware/Timer.h" + +#include "../../inc/MarlinConfig.h" + +/** + * Use POSIX signals to attempt to emulate Interrupts + * This has many limitations and is not fit for the purpose + */ + +HAL_STEP_TIMER_ISR(); +HAL_TEMP_TIMER_ISR(); + +Timer timers[2]; + +void HAL_timer_init() { + timers[0].init(0, STEPPER_TIMER_RATE, TIMER0_IRQHandler); + timers[1].init(1, TEMP_TIMER_RATE, TIMER1_IRQHandler); +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + timers[timer_num].start(frequency); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + timers[timer_num].enable(); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + timers[timer_num].disable(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + return timers[timer_num].enabled(); +} + +void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + timers[timer_num].setCompare(compare); +} + +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return timers[timer_num].getCompare(); +} + +hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + return timers[timer_num].getCount(); +} + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/timers.h b/Marlin/src/HAL/LINUX/timers.h new file mode 100644 index 00000000..1beaea95 --- /dev/null +++ b/Marlin/src/HAL/LINUX/timers.h @@ -0,0 +1,97 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 + +/** + * HAL timers for Linux X86_64 + */ + +#include + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_RATE 1000000 +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void TIMER0_IRQHandler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void TIMER1_IRQHandler() +#endif + +// PWM timer +#define HAL_PWM_TIMER +#define HAL_PWM_TIMER_ISR() extern "C" void TIMER3_IRQHandler() +#define HAL_PWM_TIMER_IRQn + + +void HAL_timer_init(); +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare); +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); +hal_timer_t HAL_timer_get_count(const uint8_t timer_num); +FORCE_INLINE static void HAL_timer_restrain(const uint8_t timer_num, const uint16_t interval_ticks) { + const hal_timer_t mincmp = HAL_timer_get_count(timer_num) + interval_ticks; + if (HAL_timer_get_compare(timer_num) < mincmp) HAL_timer_set_compare(timer_num, mincmp); +} + +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); + +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/LINUX/watchdog.cpp b/Marlin/src/HAL/LINUX/watchdog.cpp new file mode 100644 index 00000000..c15b0e31 --- /dev/null +++ b/Marlin/src/HAL/LINUX/watchdog.cpp @@ -0,0 +1,35 @@ +/** + * 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 . + * + */ +#ifdef __PLAT_LINUX__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +void watchdog_init() {} +void HAL_watchdog_refresh() {} + +#endif + +#endif // __PLAT_LINUX__ diff --git a/Marlin/src/HAL/LINUX/watchdog.h b/Marlin/src/HAL/LINUX/watchdog.h new file mode 100644 index 00000000..472624cc --- /dev/null +++ b/Marlin/src/HAL/LINUX/watchdog.h @@ -0,0 +1,27 @@ +/** + * 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 WDT_TIMEOUT 4000000 // 4 second timeout + +void watchdog_init(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp new file mode 100644 index 00000000..783b10cf --- /dev/null +++ b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp @@ -0,0 +1,322 @@ +/** + * 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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../core/macros.h" +#include "../../core/serial.h" +#include + +#include "../shared/backtrace/unwinder.h" +#include "../shared/backtrace/unwmemaccess.h" +#include "watchdog.h" +#include + + +// Debug monitor that dumps to the Programming port all status when +// an exception or WDT timeout happens - And then resets the board + +// All the Monitor routines must run with interrupts disabled and +// under an ISR execution context. That is why we cannot reuse the +// Serial interrupt routines or any C runtime, as we don't know the +// state we are when running them + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); + +// (re)initialize UART0 as a monitor output to 250000,n,8,1 +static void TXBegin() { +} + +// Send character through UART with no interrupts +static void TX(char c) { + _DBC(c); +} + +// Send String through UART +static void TX(const char* s) { + while (*s) TX(*s++); +} + +static void TXDigit(uint32_t d) { + if (d < 10) TX((char)(d+'0')); + else if (d < 16) TX((char)(d+'A'-10)); + else TX('?'); +} + +// Send Hex number thru UART +static void TXHex(uint32_t v) { + TX("0x"); + for (uint8_t i = 0; i < 8; i++, v <<= 4) + TXDigit((v >> 28) & 0xF); +} + +// Send Decimal number thru UART +static void TXDec(uint32_t v) { + if (!v) { + TX('0'); + return; + } + + char nbrs[14]; + char *p = &nbrs[0]; + while (v != 0) { + *p++ = '0' + (v % 10); + v /= 10; + } + do { + p--; + TX(*p); + } while (p != &nbrs[0]); +} + +// Dump a backtrace entry +static bool UnwReportOut(void* ctx, const UnwReport* bte) { + int* p = (int*)ctx; + + (*p)++; + TX('#'); TXDec(*p); TX(" : "); + TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); + TX('+'); TXDec(bte->address - bte->function); + TX(" PC:");TXHex(bte->address); TX('\n'); + return true; +} + +#ifdef UNW_DEBUG + void UnwPrintf(const char* format, ...) { + char dest[256]; + va_list argptr; + va_start(argptr, format); + vsprintf(dest, format, argptr); + va_end(argptr); + TX(&dest[0]); + } +#endif + +/* Table of function pointers for passing to the unwinder */ +static const UnwindCallbacks UnwCallbacks = { + UnwReportOut, + UnwReadW, + UnwReadH, + UnwReadB + #ifdef UNW_DEBUG + ,UnwPrintf + #endif +}; + + +/** + * HardFaultHandler_C: + * This is called from the HardFault_HandlerAsm with a pointer the Fault stack + * as the parameter. We can then read the values from the stack and place them + * into local variables for ease of reading. + * We then read the various Fault Status and Address Registers to help decode + * cause of the fault. + * The function ends with a BKPT instruction to force control back into the debugger + */ +extern "C" +void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { + + static const char* causestr[] = { + "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" + }; + + UnwindFrame btf; + + // Dump report to the Programming port (interrupts are DISABLED) + TXBegin(); + TX("\n\n## Software Fault detected ##\n"); + TX("Cause: "); TX(causestr[cause]); TX('\n'); + + TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); + TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); + TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); + TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); + TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); + TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); + TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); + TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); + + // Configurable Fault Status Register + // Consists of MMSR, BFSR and UFSR + TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); + + // Hard Fault Status Register + TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); + + // Debug Fault Status Register + TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); + + // Auxiliary Fault Status Register + TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); + + // Read the Fault Address Registers. These may not contain valid values. + // Check BFARVALID/MMARVALID to see if they are valid values + // MemManage Fault Address Register + TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); + + // Bus Fault Address Register + TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); + + TX("ExcLR: "); TXHex(lr); TX('\n'); + TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); + + btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer + btf.fp = btf.sp; + btf.lr = ((unsigned long)sp[5]); + btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it + + // Perform a backtrace + TX("\nBacktrace:\n\n"); + int ctr = 0; + UnwindStart(&btf, &UnwCallbacks, &ctr); + + // Disable all NVIC interrupts + NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0xFFFFFFFF; + + // Relocate VTOR table to default position + SCB->VTOR = 0; + + // Clear cause of reset to prevent entering smoothie bootstrap + HAL_clear_reset_source(); + + // Restart watchdog + #if ENABLED(USE_WATCHDOG) + //WDT_Restart(WDT); + watchdog_init(); + #endif + + // Reset controller + NVIC_SystemReset(); + + // Nothing below here is compiled because NVIC_SystemReset loops forever + + for (;;) { TERN_(USE_WATCHDOG, watchdog_init()); } +} + +extern "C" { +__attribute__((naked)) void NMI_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#0") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void HardFault_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#1") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void MemManage_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#2") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void BusFault_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#3") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void UsageFault_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#4") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void DebugMon_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#5") + A("b HardFault_HandlerC") + ); +} + +/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ +__attribute__((naked)) void WDT_IRQHandler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#6") + A("b HardFault_HandlerC") + ); +} + +__attribute__((naked)) void RSTC_Handler() { + __asm__ __volatile__ ( + ".syntax unified" "\n\t" + A("tst lr, #4") + A("ite eq") + A("mrseq r0, msp") + A("mrsne r0, psp") + A("mov r1,lr") + A("mov r2,#7") + A("b HardFault_HandlerC") + ); +} +} +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp new file mode 100644 index 00000000..939f1e8a --- /dev/null +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -0,0 +1,82 @@ +/** + * 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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" +#include "../../../gcode/parser.h" + +#if ENABLED(USE_WATCHDOG) + #include "watchdog.h" +#endif + +uint32_t HAL_adc_reading = 0; + +// U8glib required functions +extern "C" void u8g_xMicroDelay(uint16_t val) { + DELAY_US(val); +} +extern "C" void u8g_MicroDelay() { + u8g_xMicroDelay(1); +} +extern "C" void u8g_10MicroDelay() { + u8g_xMicroDelay(10); +} +extern "C" void u8g_Delay(uint16_t val) { + delay(val); +} +//************************// + +// return free heap space +int freeMemory() { + char stack_end; + void *heap_start = malloc(sizeof(uint32_t)); + if (heap_start == 0) return 0; + + uint32_t result = (uint32_t)&stack_end - (uint32_t)heap_start; + free(heap_start); + return result; +} + +// scan command line for code +// return index into pin map array if found and the pin is valid. +// return dval if not found or not a valid pin. +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval) { + const uint16_t val = (uint16_t)parser.intval(code, -1), port = val / 100, pin = val % 100; + const int16_t ind = (port < ((NUM_DIGITAL_PINS) >> 5) && pin < 32) ? ((port << 5) | pin) : -2; + return ind > -1 ? ind : dval; +} + +void flashFirmware(const int16_t) { NVIC_SystemReset(); } + +void HAL_clear_reset_source(void) { + TERN_(USE_WATCHDOG, watchdog_clear_timeout_flag()); +} + +uint8_t HAL_get_reset_source(void) { + #if ENABLED(USE_WATCHDOG) + if (watchdog_timed_out()) return RST_WATCHDOG; + #endif + return RST_POWER_ON; +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h new file mode 100644 index 00000000..cb637e71 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -0,0 +1,208 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL_LPC1768/HAL.h + * Hardware Abstraction Layer for NXP LPC1768 + */ + +#define CPU_32_BIT + +void HAL_init(); + +#include +#include +#include + +extern "C" volatile uint32_t _millis; + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" +#include "MarlinSerial.h" + +#include +#include +#include + +// i2c uses 8-bit shifted address +#define I2C_ADDRESS(A) uint8_t((A) << 1) + +// +// Default graphical display delays +// +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(600) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(750) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(750) +#endif + +#define _MSERIAL(X) MSerial##X +#define MSERIAL(X) _MSERIAL(X) +#define MSerial0 MSerial + +#if SERIAL_PORT == -1 + #define MYSERIAL0 UsbSerial +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#else + #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 UsbSerial + #elif WITHIN(SERIAL_PORT_2, 0, 3) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #else + #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #endif +#endif + +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL UsbSerial + #elif WITHIN(LCD_SERIAL_PORT, 0, 3) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #else + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif +#endif + +// +// Interrupts +// +#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +// +// Utility functions +// +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +int freeMemory(); +#pragma GCC diagnostic pop + +// +// ADC API +// + +#define ADC_MEDIAN_FILTER_SIZE (23) // Higher values increase step delay (phase shift), + // (ADC_MEDIAN_FILTER_SIZE + 1) / 2 sample step delay (12 samples @ 500Hz: 24ms phase shift) + // Memory usage per ADC channel (bytes): (6 * ADC_MEDIAN_FILTER_SIZE) + 16 + // 8 * ((6 * 23) + 16 ) = 1232 Bytes for 8 channels + +#define ADC_LOWPASS_K_VALUE (2) // Higher values increase rise time + // Rise time sample delays for 100% signal convergence on full range step + // (1 : 13, 2 : 32, 3 : 67, 4 : 139, 5 : 281, 6 : 565, 7 : 1135, 8 : 2273) + // K = 6, 565 samples, 500Hz sample rate, 1.13s convergence on full range step + // Memory usage per ADC channel (bytes): 4 (32 Bytes for 8 channels) + +#define HAL_ADC_VREF 3.3 // ADC voltage reference + +#define HAL_ADC_RESOLUTION 12 // 15 bit maximum, raw temperature is stored as int16_t +#define HAL_ADC_FILTERED // Disable oversampling done in Marlin as ADC values already filtered in HAL + +using FilteredADC = LPC176x::ADC; +extern uint32_t HAL_adc_reading; +[[gnu::always_inline]] inline void HAL_start_adc(const pin_t pin) { + HAL_adc_reading = FilteredADC::read(pin) >> (16 - HAL_ADC_RESOLUTION); // returns 16bit value, reduce to required bits +} +[[gnu::always_inline]] inline uint16_t HAL_read_adc() { + return HAL_adc_reading; +} + +#define HAL_adc_init() +#define HAL_ANALOG_SELECT(pin) FilteredADC::enable_channel(pin) +#define HAL_START_ADC(pin) HAL_start_adc(pin) +#define HAL_READ_ADC() HAL_read_adc() +#define HAL_ADC_READY() (true) + +// Test whether the pin is valid +constexpr bool VALID_PIN(const pin_t pin) { + return LPC176x::pin_is_valid(pin); +} + +// Get the analog index for a digital pin +constexpr int8_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t pin) { + return (LPC176x::pin_is_valid(pin) && LPC176x::pin_has_adc(pin)) ? pin : -1; +} + +// Return the index of a pin number +constexpr int16_t GET_PIN_MAP_INDEX(const pin_t pin) { + return LPC176x::pin_index(pin); +} + +// Get the pin number at the given index +constexpr pin_t GET_PIN_MAP_PIN(const int16_t index) { + return LPC176x::pin_index(index); +} + +// Parse a G-code word into a pin index +int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); +// P0.6 thru P0.9 are for the onboard SD card +#define HAL_SENSITIVE_PINS P0_06, P0_07, P0_08, P0_09 + +#define HAL_IDLETASK 1 +void HAL_idletask(); + +#define PLATFORM_M997_SUPPORT +void flashFirmware(const int16_t); + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +/** + * set_pwm_frequency + * Set the frequency of the timer corresponding to the provided pin + * All Hardware PWM pins run at the same frequency and all + * Software PWM pins run at the same frequency + */ +void set_pwm_frequency(const pin_t pin, int f_desired); + +/** + * set_pwm_duty + * Set the PWM duty cycle of the provided pin to the provided value + * Optionally allows inverting the duty cycle [default = false] + * Optionally allows changing the maximum size of the provided value to enable finer PWM duty control [default = 255] + */ +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size=255, const bool invert=false); + +// Reset source +void HAL_clear_reset_source(void); +uint8_t HAL_get_reset_source(void); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +// Add strcmp_P if missing +#ifndef strcmp_P + #define strcmp_P(a, b) strcmp((a), (b)) +#endif diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp new file mode 100644 index 00000000..b3d2908a --- /dev/null +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -0,0 +1,405 @@ +/** + * 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 . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + */ + +/** + * For TARGET_LPC1768 + */ + +/** + * 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. + * + * Control of the slave select pin(s) is handled by the calling routines. + * + * Some of the LCD interfaces/adapters result in the LCD SPI and the SD card + * SPI sharing pins. The SCK, MOSI & MISO pins can NOT be set/cleared with + * WRITE nor digitalWrite when the hardware SPI module within the LPC17xx is + * active. If any of these pins are shared then the software SPI must be used. + * + * A more sophisticated hardware SPI can be found at the following link. + * This implementation has not been fully debugged. + * https://github.com/MarlinFirmware/Marlin/tree/071c7a78f27078fd4aee9a3ef365fcf5e143531e + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" +#include + +// Hardware SPI and SPIClass +#include +#include + +// ------------------------ +// Public functions +// ------------------------ +#if ENABLED(LPC_SOFTWARE_SPI) + + #include + + // Software SPI + + static uint8_t SPI_speed = 0; + + static uint8_t spiTransfer(uint8_t b) { + return swSpiTransfer(b, SPI_speed, SCK_PIN, MISO_PIN, MOSI_PIN); + } + + void spiBegin() { + swSpiBegin(SCK_PIN, MISO_PIN, MOSI_PIN); + } + + void spiInit(uint8_t spiRate) { + SPI_speed = swSpiInit(spiRate, SCK_PIN, MOSI_PIN); + } + + uint8_t spiRec() { return spiTransfer(0xFF); } + + void spiRead(uint8_t*buf, uint16_t nbyte) { + for (int i = 0; i < nbyte; i++) + buf[i] = spiTransfer(0xFF); + } + + void spiSend(uint8_t b) { (void)spiTransfer(b); } + + void spiSend(const uint8_t* buf, size_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) + (void)spiTransfer(buf[i]); + } + + void spiSendBlock(uint8_t token, const uint8_t* buf) { + (void)spiTransfer(token); + for (uint16_t i = 0; i < 512; i++) + (void)spiTransfer(buf[i]); + } + +#else + + void spiBegin() { // setup SCK, MOSI & MISO pins for SSP0 + spiInit(SPI_SPEED); + } + + void spiInit(uint8_t spiRate) { + #if MISO_PIN == BOARD_SPI1_MISO_PIN + SPI.setModule(1); + #elif MISO_PIN == BOARD_SPI2_MISO_PIN + SPI.setModule(2); + #endif + SPI.setDataSize(DATA_SIZE_8BIT); + SPI.setDataMode(SPI_MODE0); + + SPI.setClock(SPISettings::spiRate2Clock(spiRate)); + SPI.begin(); + } + + static uint8_t doio(uint8_t b) { + return SPI.transfer(b & 0x00FF) & 0x00FF; + } + + void spiSend(uint8_t b) { doio(b); } + + void spiSend(const uint8_t* buf, size_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]); + } + + void spiSend(uint32_t chan, byte b) { + } + + void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { + } + + // Read single byte from SPI + uint8_t spiRec() { return doio(0xFF); } + + uint8_t spiRec(uint32_t chan) { return 0; } + + // Read from SPI into buffer + void spiRead(uint8_t *buf, uint16_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) buf[i] = doio(0xFF); + } + + uint8_t spiTransfer(uint8_t b) { + return doio(b); + } + + // Write from buffer to SPI + void spiSendBlock(uint8_t token, const uint8_t* buf) { + (void)spiTransfer(token); + for (uint16_t i = 0; i < 512; i++) + (void)spiTransfer(buf[i]); + } + + /** Begin SPI transaction, set clock, bit order, data mode */ + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + // TODO: to be implemented + + } + +#endif // LPC_SOFTWARE_SPI + +/** + * @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 +} + +// Retain the pin init state of the SPI, to avoid init more than once, +// even if more instances of SPIClass exist +static bool spiInitialised[BOARD_NR_SPI] = { false }; + +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. + + #if BOARD_NR_SPI >= 1 + _settings[0].spi_d = LPC_SSP0; + _settings[0].dataMode = SPI_MODE0; + _settings[0].dataSize = DATA_SIZE_8BIT; + _settings[0].clock = SPI_CLOCK_MAX; + //_settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + #endif + + #if BOARD_NR_SPI >= 2 + _settings[1].spi_d = LPC_SSP1; + _settings[1].dataMode = SPI_MODE0; + _settings[1].dataSize = DATA_SIZE_8BIT; + _settings[1].clock = SPI_CLOCK_MAX; + //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); + #endif + + setModule(device); + + // Init the GPDMA controller + // TODO: call once in the constructor? or each time? + GPDMA_Init(); +} + +void SPIClass::begin() { + // Init the SPI pins in the first begin call + if ((_currentSetting->spi_d == LPC_SSP0 && spiInitialised[0] == false) || + (_currentSetting->spi_d == LPC_SSP1 && spiInitialised[1] == false)) { + pin_t sck, miso, mosi; + if (_currentSetting->spi_d == LPC_SSP0) { + sck = BOARD_SPI1_SCK_PIN; + miso = BOARD_SPI1_MISO_PIN; + mosi = BOARD_SPI1_MOSI_PIN; + spiInitialised[0] = true; + } + else if (_currentSetting->spi_d == LPC_SSP1) { + sck = BOARD_SPI2_SCK_PIN; + miso = BOARD_SPI2_MISO_PIN; + mosi = BOARD_SPI2_MOSI_PIN; + spiInitialised[1] = true; + } + PINSEL_CFG_Type PinCfg; // data structure to hold init values + PinCfg.Funcnum = 2; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Pinnum = LPC176x::pin_bit(sck); + PinCfg.Portnum = LPC176x::pin_port(sck); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(sck); + + PinCfg.Pinnum = LPC176x::pin_bit(miso); + PinCfg.Portnum = LPC176x::pin_port(miso); + PINSEL_ConfigPin(&PinCfg); + SET_INPUT(miso); + + PinCfg.Pinnum = LPC176x::pin_bit(mosi); + PinCfg.Portnum = LPC176x::pin_port(mosi); + PINSEL_ConfigPin(&PinCfg); + SET_OUTPUT(mosi); + } + + updateSettings(); + SSP_Cmd(_currentSetting->spi_d, ENABLE); // start SSP running +} + +void SPIClass::beginTransaction(const SPISettings &cfg) { + setBitOrder(cfg.bitOrder); + setDataMode(cfg.dataMode); + setDataSize(cfg.dataSize); + //setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); + begin(); +} + +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); +} + +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 = length; + // 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); + + // Only increase memory if minc is true + GPDMACfg.MemoryIncrease = (minc ? GPDMA_DMACCxControl_SI : 0); + + // Setup channel with given parameter + GPDMA_Setup(&GPDMACfg); + + // Enable DMA + GPDMA_ChannelCmd(0, ENABLE); + + // Wait for data transfer + while (!GPDMA_IntGetStatus(GPDMA_STAT_RAWINTTC, 0) && !GPDMA_IntGetStatus(GPDMA_STAT_RAWINTERR, 0)) { } + + // Clear err and int + GPDMA_ClearIntPending (GPDMA_STATCLR_INTTC, 0); + GPDMA_ClearIntPending (GPDMA_STATCLR_INTERR, 0); + + // Disable DMA + GPDMA_ChannelCmd(0, DISABLE); + + 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->dataMode = 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/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp new file mode 100644 index 00000000..5374e005 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -0,0 +1,55 @@ +/** + * 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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" +#include "MarlinSerial.h" + +#if USING_SERIAL_0 + MarlinSerial MSerial(LPC_UART0); + extern "C" void UART0_IRQHandler() { + MSerial.IRQHandler(); + } +#endif + +#if USING_SERIAL_1 + MarlinSerial MSerial1((LPC_UART_TypeDef *) LPC_UART1); + extern "C" void UART1_IRQHandler() { + MSerial1.IRQHandler(); + } +#endif + +#if USING_SERIAL_2 + MarlinSerial MSerial2(LPC_UART2); + extern "C" void UART2_IRQHandler() { + MSerial2.IRQHandler(); + } +#endif + +#if USING_SERIAL_3 + MarlinSerial MSerial3(LPC_UART3); + extern "C" void UART3_IRQHandler() { + MSerial3.IRQHandler(); + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h new file mode 100644 index 00000000..8d6b6437 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.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 + +#include +#include + +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +#ifndef SERIAL_PORT + #define SERIAL_PORT 0 +#endif +#ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 +#endif +#ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 +#endif + +class MarlinSerial : public HardwareSerial { +public: + MarlinSerial(LPC_UART_TypeDef *UARTx) : + HardwareSerial(UARTx) + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + void end() {} + + #if ENABLED(EMERGENCY_PARSER) + bool recv_callback(const char c) override { + emergency_parser.update(emergency_state, c); + return true; // do not discard character + } + + EmergencyParser::State emergency_state; + static inline bool emergency_parser_enabled() { return true; } + #endif +}; + +extern MarlinSerial MSerial; +extern MarlinSerial MSerial1; +extern MarlinSerial MSerial2; +extern MarlinSerial MSerial3; diff --git a/Marlin/src/HAL/LPC1768/Servo.h b/Marlin/src/HAL/LPC1768/Servo.h new file mode 100644 index 00000000..eb12fd20 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/Servo.h @@ -0,0 +1,68 @@ +/** + * 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 + +/** + * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. 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 + */ +#pragma once + +/** + * Based on "servo.h - Interrupt driven Servo library for Arduino using 16 bit timers - + * Version 2 Copyright (c) 2009 Michael Margolis. All right reserved. + * + * The only modification was to update/delete macros to match the LPC176x. + */ + +#include + +class libServo: public Servo { + public: + void move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + + if (attach(servo_info[servoIndex].Pin.nbr) >= 0) { // try to reattach + write(value); + safe_delay(servo_delay[servoIndex]); // delay to allow servo to reach position + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } + + } +}; + +#define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/LPC1768/eeprom_flash.cpp b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp new file mode 100644 index 00000000..25584863 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/eeprom_flash.cpp @@ -0,0 +1,131 @@ +/** + * 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 . + * + */ +#ifdef TARGET_LPC1768 + +/** + * Emulate EEPROM storage using Flash Memory + * + * Use a single 32K flash sector to store EEPROM data. To reduce the + * number of erase operations a simple "levelling" scheme is used that + * maintains a number of EEPROM "slots" within the larger flash sector. + * Each slot is used in turn and the entire sector is only erased when all + * slots have been used. + * + * A simple RAM image is used to hold the EEPROM data during I/O operations + * and this is flushed to the next available slot when an update is complete. + * If RAM usage becomes an issue we could store this image in one of the two + * 16Kb I/O buffers (intended to hold DMA USB and Ethernet data, but currently + * unused). + */ +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" + +extern "C" { + #include +} + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +#define SECTOR_START(sector) ((sector < 16) ? (sector << 12) : ((sector - 14) << 15)) +#define EEPROM_SECTOR 29 +#define SECTOR_SIZE 32768 +#define EEPROM_SLOTS ((SECTOR_SIZE)/(MARLIN_EEPROM_SIZE)) +#define EEPROM_ERASE 0xFF +#define SLOT_ADDRESS(sector, slot) (((uint8_t *)SECTOR_START(sector)) + slot * (MARLIN_EEPROM_SIZE)) + +static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; +static bool eeprom_dirty = false; +static int current_slot = 0; + +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { + uint32_t first_nblank_loc, first_nblank_val; + IAP_STATUS_CODE status; + + // discover which slot we are currently using. + __disable_irq(); + status = BlankCheckSector(EEPROM_SECTOR, EEPROM_SECTOR, &first_nblank_loc, &first_nblank_val); + __enable_irq(); + + if (status == CMD_SUCCESS) { + // sector is blank so nothing stored yet + for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EEPROM_ERASE; + current_slot = EEPROM_SLOTS; + } + else { + // current slot is the first non blank one + current_slot = first_nblank_loc / (MARLIN_EEPROM_SIZE); + uint8_t *eeprom_data = SLOT_ADDRESS(EEPROM_SECTOR, current_slot); + // load current settings + for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; + } + eeprom_dirty = false; + + return true; +} + +bool PersistentStore::access_finish() { + if (eeprom_dirty) { + IAP_STATUS_CODE status; + if (--current_slot < 0) { + // all slots have been used, erase everything and start again + __disable_irq(); + status = EraseSector(EEPROM_SECTOR, EEPROM_SECTOR); + __enable_irq(); + + current_slot = EEPROM_SLOTS - 1; + } + + __disable_irq(); + status = CopyRAM2Flash(SLOT_ADDRESS(EEPROM_SECTOR, current_slot), ram_eeprom, IAP_WRITE_4096); + __enable_irq(); + + if (status != CMD_SUCCESS) return false; + eeprom_dirty = false; + } + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + for (size_t i = 0; i < size; i++) ram_eeprom[pos + i] = value[i]; + eeprom_dirty = true; + crc16(crc, value, size); + pos += size; + return false; // return true for any error +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; + if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; + crc16(crc, buff, size); + pos += size; + return false; // return true for any error +} + +#endif // FLASH_EEPROM_EMULATION +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp new file mode 100644 index 00000000..9f2475f4 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -0,0 +1,177 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SDCARD_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" + +#include +#include + +extern uint32_t MSC_Aquire_Lock(); +extern uint32_t MSC_Release_Lock(); + +FATFS fat_fs; +FIL eeprom_file; +bool eeprom_file_open = false; + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(0x1000) // 4KiB of Emulated EEPROM +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { + const char eeprom_erase_value = 0xFF; + MSC_Aquire_Lock(); + if (f_mount(&fat_fs, "", 1)) { + MSC_Release_Lock(); + return false; + } + FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ); + if (res) MSC_Release_Lock(); + + if (res == FR_OK) { + UINT bytes_written; + FSIZE_t file_size = f_size(&eeprom_file); + f_lseek(&eeprom_file, file_size); + while (file_size < capacity() && res == FR_OK) { + res = f_write(&eeprom_file, &eeprom_erase_value, 1, &bytes_written); + file_size++; + } + } + if (res == FR_OK) { + f_lseek(&eeprom_file, 0); + f_sync(&eeprom_file); + eeprom_file_open = true; + } + return res == FR_OK; +} + +bool PersistentStore::access_finish() { + f_close(&eeprom_file); + f_unmount(""); + MSC_Release_Lock(); + eeprom_file_open = false; + return true; +} + +// This extra chit-chat goes away soon, but is helpful for now +// to see errors that are happening in read_data / write_data +static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) { + PGM_P const rw_str = write ? PSTR("write") : PSTR("read"); + SERIAL_CHAR(' '); + serialprintPGM(rw_str); + SERIAL_ECHOLNPAIR("_data(", pos, ",", int(value), ",", int(size), ", ...)"); + if (total) { + SERIAL_ECHOPGM(" f_"); + serialprintPGM(rw_str); + SERIAL_ECHOPAIR("()=", int(s), "\n size=", int(size), "\n bytes_"); + serialprintPGM(write ? PSTR("written=") : PSTR("read=")); + SERIAL_ECHOLN(total); + } + else + SERIAL_ECHOLNPAIR(" f_lseek()=", int(s)); +} + +// File function return codes for type FRESULT. This goes away soon, but +// is helpful right now to see any errors in read_data and write_data. +// +// typedef enum { +// FR_OK = 0, /* (0) Succeeded */ +// FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ +// FR_INT_ERR, /* (2) Assertion failed */ +// FR_NOT_READY, /* (3) The physical drive cannot work */ +// FR_NO_FILE, /* (4) Could not find the file */ +// FR_NO_PATH, /* (5) Could not find the path */ +// FR_INVALID_NAME, /* (6) The path name format is invalid */ +// FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ +// FR_EXIST, /* (8) Access denied due to prohibited access */ +// FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ +// FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ +// FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ +// FR_NOT_ENABLED, /* (12) The volume has no work area */ +// FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ +// FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ +// FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ +// FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ +// FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ +// FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ +// FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +// } FRESULT; + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + if (!eeprom_file_open) return true; + FRESULT s; + UINT bytes_written = 0; + + s = f_lseek(&eeprom_file, pos); + if (s) { + debug_rw(true, pos, value, size, s); + return s; + } + + s = f_write(&eeprom_file, (void*)value, size, &bytes_written); + if (s) { + debug_rw(true, pos, value, size, s, bytes_written); + return s; + } + crc16(crc, value, size); + pos += size; + return bytes_written != size; // return true for any error +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + if (!eeprom_file_open) return true; + UINT bytes_read = 0; + FRESULT s; + s = f_lseek(&eeprom_file, pos); + + if (s) { + debug_rw(false, pos, value, size, s); + return true; + } + + if (writing) { + s = f_read(&eeprom_file, (void*)value, size, &bytes_read); + crc16(crc, value, size); + } + else { + uint8_t temp[size]; + s = f_read(&eeprom_file, (void*)temp, size, &bytes_read); + crc16(crc, temp, size); + } + + if (s) { + debug_rw(false, pos, value, size, s, bytes_read); + return true; + } + + pos += size; + return bytes_read != size; // return true for any error +} + +#endif // SDCARD_EEPROM_EMULATION +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp new file mode 100644 index 00000000..16c15eaf --- /dev/null +++ b/Marlin/src/HAL/LPC1768/eeprom_wired.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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with implementations supplied by the framework. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x8000 // 32KB‬ +#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; + + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + uint8_t * const p = (uint8_t * const)pos; + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + 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 { + // Read from external EEPROM + const uint8_t c = eeprom_read_byte((uint8_t*)pos); + + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/endstop_interrupts.h b/Marlin/src/HAL/LPC1768/endstop_interrupts.h new file mode 100644 index 00000000..b0d0c0ec --- /dev/null +++ b/Marlin/src/HAL/LPC1768/endstop_interrupts.h @@ -0,0 +1,125 @@ +/** + * 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 + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + #define LPC1768_PIN_INTERRUPT_M(pin) ((pin >> 0x5 & 0x7) == 0 || (pin >> 0x5 & 0x7) == 2) + + #if HAS_X_MAX + #if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN) + #error "X_MAX_PIN is not INTERRUPT-capable." + #endif + _ATTACH(X_MAX_PIN); + #endif + #if HAS_X_MIN + #if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN) + #error "X_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(X_MIN_PIN); + #endif + #if HAS_Y_MAX + #if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN) + #error "Y_MAX_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Y_MAX_PIN); + #endif + #if HAS_Y_MIN + #if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN) + #error "Y_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Y_MIN_PIN); + #endif + #if HAS_Z_MAX + #if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN) + #error "Z_MAX_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z_MAX_PIN); + #endif + #if HAS_Z_MIN + #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN) + #error "Z_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z_MIN_PIN); + #endif + #if HAS_Z2_MAX + #if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN) + #error "Z2_MAX_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z2_MAX_PIN); + #endif + #if HAS_Z2_MIN + #if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN) + #error "Z2_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z2_MIN_PIN); + #endif + #if HAS_Z3_MAX + #if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN) + #error "Z3_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z3_MAX_PIN); + #endif + #if HAS_Z3_MIN + #if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN) + #error "Z3_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z3_MIN_PIN); + #endif + #if HAS_Z4_MAX + #if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN) + #error "Z4_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z4_MAX_PIN); + #endif + #if HAS_Z4_MIN + #if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN) + #error "Z4_MIN_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z4_MIN_PIN); + #endif + #if HAS_Z_MIN_PROBE_PIN + #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN) + #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable." + #endif + _ATTACH(Z_MIN_PROBE_PIN); + #endif +} diff --git a/Marlin/src/HAL/LPC1768/fast_pwm.cpp b/Marlin/src/HAL/LPC1768/fast_pwm.cpp new file mode 100644 index 00000000..dd440b5e --- /dev/null +++ b/Marlin/src/HAL/LPC1768/fast_pwm.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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if NEEDS_HARDWARE_PWM // Specific meta-flag for features that mandate PWM + +#include + +void set_pwm_frequency(const pin_t pin, int f_desired) { + LPC176x::pwm_set_frequency(pin, f_desired); +} + +void set_pwm_duty(const pin_t pin, const uint16_t v, const uint16_t v_size/*=255*/, const bool invert/*=false*/) { + LPC176x::pwm_write_ratio(pin, invert ? 1.0f - (float)v / v_size : (float)v / v_size); +} + +#endif // NEEDS_HARDWARE_PWM +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/fastio.h b/Marlin/src/HAL/LPC1768/fastio.h new file mode 100644 index 00000000..c553ffb1 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/fastio.h @@ -0,0 +1,119 @@ +/** + * 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 + +/** + * Fast I/O Routines for LPC1768/9 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +/** + * Description: Fast IO functions LPC1768 + * + * For TARGET LPC1768 + */ + +#include "../shared/Marduino.h" + +#define PWM_PIN(P) true // all pins are PWM capable + +#define LPC_PIN(pin) LPC176x::gpio_pin(pin) +#define LPC_GPIO(port) LPC176x::gpio_port(port) + +#define SET_DIR_INPUT(IO) LPC176x::gpio_set_input(IO) +#define SET_DIR_OUTPUT(IO) LPC176x::gpio_set_output(IO) + +#define SET_MODE(IO, mode) pinMode(IO, mode) + +#define WRITE_PIN_SET(IO) LPC176x::gpio_set(IO) +#define WRITE_PIN_CLR(IO) LPC176x::gpio_clear(IO) + +#define READ_PIN(IO) LPC176x::gpio_get(IO) +#define WRITE_PIN(IO,V) LPC176x::gpio_set(IO, V) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(STEP); WRITE(STEP, HIGH); WRITE(STEP, LOW); + * + * Why double up on these macros? see https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp/Stringification.html + */ + +/// Read a pin +#define _READ(IO) READ_PIN(IO) + +/// Write to a pin +#define _WRITE(IO,V) WRITE_PIN(IO,V) + +/// toggle a pin +#define _TOGGLE(IO) _WRITE(IO, !READ(IO)) + +/// set pin as input +#define _SET_INPUT(IO) SET_DIR_INPUT(IO) + +/// set pin as output +#define _SET_OUTPUT(IO) SET_DIR_OUTPUT(IO) + +/// set pin as input with pullup mode +#define _PULLUP(IO,V) pinMode(IO, (V) ? INPUT_PULLUP : INPUT) + +/// set pin as input with pulldown mode +#define _PULLDOWN(IO,V) pinMode(IO, (V) ? INPUT_PULLDOWN : INPUT) + +/// check if pin is an input +#define _IS_INPUT(IO) (!LPC176x::gpio_get_dir(IO)) + +/// check if pin is an output +#define _IS_OUTPUT(IO) (LPC176x::gpio_get_dir(IO)) + +/// Read a pin wrapper +#define READ(IO) _READ(IO) + +/// Write to a pin wrapper +#define WRITE(IO,V) _WRITE(IO,V) + +/// toggle a pin wrapper +#define TOGGLE(IO) _TOGGLE(IO) + +/// set pin as input wrapper +#define SET_INPUT(IO) _SET_INPUT(IO) +/// set pin as input with pullup wrapper +#define SET_INPUT_PULLUP(IO) do{ _SET_INPUT(IO); _PULLUP(IO, HIGH); }while(0) +/// set pin as input with pulldown wrapper +#define SET_INPUT_PULLDOWN(IO) do{ _SET_INPUT(IO); _PULLDOWN(IO, HIGH); }while(0) +/// set pin as output wrapper - reads the pin and sets the output to that value +#define SET_OUTPUT(IO) do{ _WRITE(IO, _READ(IO)); _SET_OUTPUT(IO); }while(0) +// set pin as PWM +#define SET_PWM SET_OUTPUT + +/// check if pin is an input wrapper +#define IS_INPUT(IO) _IS_INPUT(IO) +/// check if pin is an output wrapper +#define IS_OUTPUT(IO) _IS_OUTPUT(IO) + +// Shorthand +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h new file mode 100644 index 00000000..32ef908d --- /dev/null +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_FSMC_TFT + #error "Sorry! FSMC TFT displays are not current available for HAL/LPC1768." +#endif diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h new file mode 100644 index 00000000..ce6d3fdd --- /dev/null +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h @@ -0,0 +1,28 @@ +/** + * 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 + +#if USE_FALLBACK_EEPROM + #define FLASH_EEPROM_EMULATION +#elif EITHER(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h new file mode 100644 index 00000000..f5051d32 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -0,0 +1,276 @@ +/** + * 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 + +#if PIO_PLATFORM_VERSION < 1001 + #error "nxplpc-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries. You may need to remove the platform and let it reinstall automatically." +#endif +#if PIO_FRAMEWORK_VERSION < 2005 + #error "framework-arduino-lpc176x package is out of date, Please update the PlatformIO platforms, frameworks and libraries." +#endif + +/** + * Detect an old pins file by checking for old ADC pins values. + */ +#define _OLD_TEMP_PIN(P) PIN_EXISTS(P) && _CAT(P,_PIN) <= 7 && _CAT(P,_PIN) != 2 && _CAT(P,_PIN) != 3 +#if _OLD_TEMP_PIN(TEMP_BED) + #error "TEMP_BED_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_0) + #error "TEMP_0_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_1) + #error "TEMP_1_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_2) + #error "TEMP_2_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_3) + #error "TEMP_3_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_4) + #error "TEMP_4_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_5) + #error "TEMP_5_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_6) + #error "TEMP_6_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#elif _OLD_TEMP_PIN(TEMP_7) + #error "TEMP_7_PIN must be defined using the Pn_nn or Pn_nn_An format. (See the included pins files)." +#endif +#undef _OLD_TEMP_PIN + +/** + * Because PWM hardware channels all share the same frequency, along with the + * fallback software channels, FAST_PWM_FAN is incompatible with Servos. + */ +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. + */ + +//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) +// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" +//#endif + +#if MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF) + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) + #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI." + #endif +#endif + +static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported on LPC176x."); + +/** + * Flag any serial port conflicts + * + * Port | TX | RX | + * --- | --- | --- | + * Serial | P0_02 | P0_03 | + * Serial1 | P0_15 | P0_16 | + * Serial2 | P0_10 | P0_11 | + * Serial3 | P0_00 | P0_01 | + */ +#define ANY_TX(N,V...) DO(IS_TX##N,||,V) +#define ANY_RX(N,V...) DO(IS_RX##N,||,V) + +#if USING_SERIAL_0 + #define IS_TX0(P) (P == P0_02) + #define IS_RX0(P) (P == P0_03) + #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) + #error "Serial port pins (0) conflict with Trinamic SPI pins!" + #elif ENABLED(MK2_MULTIPLEXER) && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN)) + #error "Serial port pins (0) conflict with MK2 multiplexer pins!" + #elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN)) + #error "Serial port pins (0) conflict with X/Y axis SPI pins!" + #endif + #undef IS_TX0 + #undef IS_RX0 +#endif + +#if USING_SERIAL_1 + #define IS_TX1(P) (P == P0_15) + #define IS_RX1(P) (P == P0_16) + #define _IS_TX1_1 IS_TX1 + #define _IS_RX1_1 IS_RX1 + #if IS_TX1(TMC_SW_SCK) + #error "Serial port pins (1) conflict with other pins!" + #elif HAS_WIRED_LCD + #if IS_TX1(BTN_EN2) || IS_RX1(BTN_EN1) + #error "Serial port pins (1) conflict with Encoder Buttons!" + #elif ANY_TX(1, SCK_PIN, LCD_PINS_D4, DOGLCD_SCK, LCD_RESET_PIN, LCD_PINS_RS, SHIFT_CLK) \ + || ANY_RX(1, LCD_SDSS, LCD_PINS_RS, MISO_PIN, DOGLCD_A0, SS_PIN, LCD_SDSS, DOGLCD_CS, LCD_RESET_PIN, LCD_BACKLIGHT_PIN) + #error "Serial port pins (1) conflict with LCD pins!" + #endif + #endif + #undef IS_TX1 + #undef IS_RX1 + #undef _IS_TX1_1 + #undef _IS_RX1_1 +#endif + +#if USING_SERIAL_2 + #define IS_TX2(P) (P == P0_10) + #define IS_RX2(P) (P == P0_11) + #define _IS_TX2_1 IS_TX2 + #define _IS_RX2_1 IS_RX2 + #if IS_TX2(X2_ENABLE_PIN) || ANY_RX(2, X2_DIR_PIN, X2_STEP_PIN) || (AXIS_HAS_SPI(X2) && IS_TX2(X2_CS_PIN)) + #error "Serial port pins (2) conflict with X2 pins!" + #elif IS_TX2(Y2_ENABLE_PIN) || ANY_RX(2, Y2_DIR_PIN, Y2_STEP_PIN) || (AXIS_HAS_SPI(Y2) && IS_TX2(Y2_CS_PIN)) + #error "Serial port pins (2) conflict with Y2 pins!" + #elif IS_TX2(Z2_ENABLE_PIN) || ANY_RX(2, Z2_DIR_PIN, Z2_STEP_PIN) || (AXIS_HAS_SPI(Z2) && IS_TX2(Z2_CS_PIN)) + #error "Serial port pins (2) conflict with Z2 pins!" + #elif IS_TX2(Z3_ENABLE_PIN) || ANY_RX(2, Z3_DIR_PIN, Z3_STEP_PIN) || (AXIS_HAS_SPI(Z3) && IS_TX2(Z3_CS_PIN)) + #error "Serial port pins (2) conflict with Z3 pins!" + #elif IS_TX2(Z4_ENABLE_PIN) || ANY_RX(2, Z4_DIR_PIN, Z4_STEP_PIN) || (AXIS_HAS_SPI(Z4) && IS_TX2(Z4_CS_PIN)) + #error "Serial port pins (2) conflict with Z4 pins!" + #elif ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) + #error "Serial port pins (2) conflict with other pins!" + #elif Y_HOME_DIR < 0 && IS_TX2(Y_STOP_PIN) + #error "Serial port pins (2) conflict with Y endstop pin!" + #elif HAS_CUSTOM_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN) + #error "Serial port pins (2) conflict with probe pin!" + #elif ANY_TX(2, X_ENABLE_PIN, Y_ENABLE_PIN) || ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) + #error "Serial port pins (2) conflict with X/Y stepper pins!" + #elif HAS_MULTI_EXTRUDER && (IS_TX2(E1_ENABLE_PIN) || (AXIS_HAS_SPI(E1) && IS_TX2(E1_CS_PIN))) + #error "Serial port pins (2) conflict with E1 stepper pins!" + #elif EXTRUDERS && ANY_RX(2, E0_DIR_PIN, E0_STEP_PIN) + #error "Serial port pins (2) conflict with E stepper pins!" + #endif + #undef IS_TX2 + #undef IS_RX2 + #undef _IS_TX2_1 + #undef _IS_RX2_1 +#endif + +#if USING_SERIAL_3 + #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) + #define PIN_IS_RX3(P) (P##_PIN == P0_01) + #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) + #error "Serial port pins (3) conflict with X endstop pins!" + #elif PIN_IS_TX3(Y_SERIAL_TX) || PIN_IS_TX3(Y_SERIAL_RX) || PIN_IS_RX3(X_SERIAL_TX) || PIN_IS_RX3(X_SERIAL_RX) + #error "Serial port pins (3) conflict with X/Y axis UART pins!" + #elif PIN_IS_TX3(X2_DIR) || PIN_IS_RX3(X2_STEP) + #error "Serial port pins (3) conflict with X2 pins!" + #elif PIN_IS_TX3(Y2_DIR) || PIN_IS_RX3(Y2_STEP) + #error "Serial port pins (3) conflict with Y2 pins!" + #elif PIN_IS_TX3(Z2_DIR) || PIN_IS_RX3(Z2_STEP) + #error "Serial port pins (3) conflict with Z2 pins!" + #elif PIN_IS_TX3(Z3_DIR) || PIN_IS_RX3(Z3_STEP) + #error "Serial port pins (3) conflict with Z3 pins!" + #elif PIN_IS_TX3(Z4_DIR) || PIN_IS_RX3(Z4_STEP) + #error "Serial port pins (3) conflict with Z4 pins!" + #elif HAS_MULTI_EXTRUDER && (PIN_IS_TX3(E1_DIR) || PIN_IS_RX3(E1_STEP)) + #error "Serial port pins (3) conflict with E1 pins!" + #endif + #undef PIN_IS_TX3 + #undef PIN_IS_RX3 +#endif + +#undef ANY_TX +#undef ANY_RX + +// +// Flag any i2c pin conflicts +// +#if ANY(HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC, EXPERIMENTAL_I2CBUS, I2C_POSITION_ENCODERS, PCA9632, I2C_EEPROM) + #define USEDI2CDEV_M 1 // /Wire.cpp + + #if USEDI2CDEV_M == 0 // P0_27 [D57] (AUX-1) .......... P0_28 [D58] (AUX-1) + #define PIN_IS_SDA0(P) (P##_PIN == P0_27) + #define IS_SCL0(P) (P == P0_28) + #if ENABLED(SDSUPPORT) && PIN_IS_SDA0(SD_DETECT) + #error "SDA0 overlaps with SD_DETECT_PIN!" + #elif PIN_IS_SDA0(E0_AUTO_FAN) + #error "SDA0 overlaps with E0_AUTO_FAN_PIN!" + #elif PIN_IS_SDA0(BEEPER) + #error "SDA0 overlaps with BEEPER_PIN!" + #elif IS_SCL0(BTN_ENC) + #error "SCL0 overlaps with Encoder Button!" + #elif IS_SCL0(SS_PIN) + #error "SCL0 overlaps with SS_PIN!" + #elif IS_SCL0(LCD_SDSS) + #error "SCL0 overlaps with LCD_SDSS!" + #endif + #undef PIN_IS_SDA0 + #undef IS_SCL0 + #elif USEDI2CDEV_M == 1 // P0_00 [D20] (SCA) ............ P0_01 [D21] (SCL) + #define PIN_IS_SDA1(P) (PIN_EXISTS(P) && P##_PIN == P0_00) + #define PIN_IS_SCL1(P) (P##_PIN == P0_01) + #if PIN_IS_SDA1(X_MIN) || PIN_IS_SCL1(X_MAX) + #error "One or more i2c (1) pins overlaps with X endstop pins! Disable i2c peripherals." + #elif PIN_IS_SDA1(X2_DIR) || PIN_IS_SCL1(X2_STEP) + #error "One or more i2c (1) pins overlaps with X2 pins! Disable i2c peripherals." + #elif PIN_IS_SDA1(Y2_DIR) || PIN_IS_SCL1(Y2_STEP) + #error "One or more i2c (1) pins overlaps with Y2 pins! Disable i2c peripherals." + #elif PIN_IS_SDA1(Z2_DIR) || PIN_IS_SCL1(Z2_STEP) + #error "One or more i2c (1) pins overlaps with Z2 pins! Disable i2c peripherals." + #elif PIN_IS_SDA1(Z3_DIR) || PIN_IS_SCL1(Z3_STEP) + #error "One or more i2c (1) pins overlaps with Z3 pins! Disable i2c peripherals." + #elif PIN_IS_SDA1(Z4_DIR) || PIN_IS_SCL1(Z4_STEP) + #error "One or more i2c (1) pins overlaps with Z4 pins! Disable i2c peripherals." + #elif HAS_MULTI_EXTRUDER && (PIN_IS_SDA1(E1_DIR) || PIN_IS_SCL1(E1_STEP)) + #error "One or more i2c (1) pins overlaps with E1 pins! Disable i2c peripherals." + #endif + #undef PIN_IS_SDA1 + #undef PIN_IS_SCL1 + #elif USEDI2CDEV_M == 2 // P0_10 [D38] (X_ENABLE_PIN) ... P0_11 [D55] (X_DIR_PIN) + #define PIN_IS_SDA2(P) (P##_PIN == P0_10) + #define PIN_IS_SCL2(P) (P##_PIN == P0_11) + #if PIN_IS_SDA2(Y_STOP) + #error "i2c SDA2 overlaps with Y endstop pin!" + #elif HAS_CUSTOM_PROBE_PIN && PIN_IS_SDA2(Z_MIN_PROBE) + #error "i2c SDA2 overlaps with Z probe pin!" + #elif PIN_IS_SDA2(X_ENABLE) || PIN_IS_SDA2(Y_ENABLE) + #error "i2c SDA2 overlaps with X/Y ENABLE pin!" + #elif AXIS_HAS_SPI(X) && PIN_IS_SDA2(X_CS) + #error "i2c SDA2 overlaps with X CS pin!" + #elif PIN_IS_SDA2(X2_ENABLE) + #error "i2c SDA2 overlaps with X2 enable pin! Disable i2c peripherals." + #elif PIN_IS_SDA2(Y2_ENABLE) + #error "i2c SDA2 overlaps with Y2 enable pin! Disable i2c peripherals." + #elif PIN_IS_SDA2(Z2_ENABLE) + #error "i2c SDA2 overlaps with Z2 enable pin! Disable i2c peripherals." + #elif PIN_IS_SDA2(Z3_ENABLE) + #error "i2c SDA2 overlaps with Z3 enable pin! Disable i2c peripherals." + #elif PIN_IS_SDA2(Z4_ENABLE) + #error "i2c SDA2 overlaps with Z4 enable pin! Disable i2c peripherals." + #elif HAS_MULTI_EXTRUDER && PIN_IS_SDA2(E1_ENABLE) + #error "i2c SDA2 overlaps with E1 enable pin! Disable i2c peripherals." + #elif HAS_MULTI_EXTRUDER && AXIS_HAS_SPI(E1) && PIN_IS_SDA2(E1_CS) + #error "i2c SDA2 overlaps with E1 CS pin! Disable i2c peripherals." + #elif EXTRUDERS && (PIN_IS_SDA2(E0_STEP) || PIN_IS_SDA2(E0_DIR)) + #error "i2c SCL2 overlaps with E0 STEP/DIR pin! Disable i2c peripherals." + #elif PIN_IS_SDA2(X_DIR) || PIN_IS_SDA2(Y_DIR) + #error "One or more i2c pins overlaps with X/Y DIR pin! Disable i2c peripherals." + #endif + #undef PIN_IS_SDA2 + #undef PIN_IS_SCL2 + #endif + + #undef USEDI2CDEV_M +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." +#elif ENABLED(SERIAL_STATS_DROPPED_RX) + #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/LPC1768/include/SPI.h b/Marlin/src/HAL/LPC1768/include/SPI.h new file mode 100644 index 00000000..9da2a325 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/include/SPI.h @@ -0,0 +1,176 @@ +/** + * 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 "../../shared/HAL_SPI.h" + +#include +#include +#include + +//#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 spiRate, int inBitOrder, int inDataMode) { + init_AlwaysInline(spiRate2Clock(spiRate), inBitOrder, inDataMode, DATA_SIZE_8BIT); + } + 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; } + + static inline uint32_t spiRate2Clock(uint32_t spiRate) { + uint32_t Marlin_speed[7]; // CPSR is always 2 + Marlin_speed[0] = 8333333; //(SCR: 2) desired: 8,000,000 actual: 8,333,333 +4.2% SPI_FULL_SPEED + Marlin_speed[1] = 4166667; //(SCR: 5) desired: 4,000,000 actual: 4,166,667 +4.2% SPI_HALF_SPEED + Marlin_speed[2] = 2083333; //(SCR: 11) desired: 2,000,000 actual: 2,083,333 +4.2% SPI_QUARTER_SPEED + Marlin_speed[3] = 1000000; //(SCR: 24) desired: 1,000,000 actual: 1,000,000 SPI_EIGHTH_SPEED + Marlin_speed[4] = 500000; //(SCR: 49) desired: 500,000 actual: 500,000 SPI_SPEED_5 + Marlin_speed[5] = 250000; //(SCR: 99) desired: 250,000 actual: 250,000 SPI_SPEED_6 + Marlin_speed[6] = 125000; //(SCR:199) desired: 125,000 actual: 125,000 Default from HAL.h + return Marlin_speed[spiRate > 6 ? 6 : spiRate]; + } + +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: + /** + * @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/include/digipot_mcp4451_I2C_routines.c b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c new file mode 100644 index 00000000..f442ab71 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.c @@ -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 . + * + */ + +/** + * digipot_mcp4451_I2C_routines.c + * Adapted from https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + */ + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if MB(MKS_SBASE) + +#ifdef __cplusplus + extern "C" { +#endif + +#include "digipot_mcp4451_I2C_routines.h" + +// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to +// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. + +static uint32_t _I2C_Start(LPC_I2C_TypeDef *I2Cx) { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +static void _I2C_Stop(LPC_I2C_TypeDef *I2Cx) { + // Make sure start bit is not active + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +I2C_M_SETUP_Type transferMCfg; + +#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) + +uint8_t digipot_mcp4451_start(uint8_t sla) { // send slave address and write bit + // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't + // happen which means only the value of the slave address was send. Keep looping until + // the slave address and write bit are actually sent. + do { + _I2C_Stop(I2CDEV_M); // output stop state on I2C bus + _I2C_Start(I2CDEV_M); // output start state on I2C bus + while ((I2C_status != I2C_I2STAT_M_TX_START) + && (I2C_status != I2C_I2STAT_M_TX_RESTART) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted + + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address + LPC_I2C1->I2DAT = (sla << 1) & I2C_I2DAT_BITMASK; // transmit slave address & write bit + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) + && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)) { /* wait for slaw to finish */ } + } while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); + return 1; +} + +uint8_t digipot_mcp4451_send_byte(uint8_t data) { + LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while (I2C_status != I2C_I2STAT_M_TX_DAT_ACK && I2C_status != I2C_I2STAT_M_TX_DAT_NACK); // wait for xmit to finish + return 1; +} + +#ifdef __cplusplus + } +#endif + +#endif // MB(MKS_SBASE) +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h new file mode 100644 index 00000000..9b6c62b0 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/include/digipot_mcp4451_I2C_routines.h @@ -0,0 +1,43 @@ +/** + * 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 + +/** + * digipot_mcp4451_I2C_routines.h + * Adapted from https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + */ + +#ifdef __cplusplus + extern "C" { +#endif + +#include +#include +#include +#include "i2c_util.h" + +uint8_t digipot_mcp4451_start(uint8_t sla); +uint8_t digipot_mcp4451_send_byte(uint8_t data); + +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/LPC1768/include/i2c_util.c b/Marlin/src/HAL/LPC1768/include/i2c_util.c new file mode 100644 index 00000000..e52fb7c4 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/include/i2c_util.c @@ -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 . + * + */ + +/** + * HAL_LPC1768/include/i2c_util.c + */ + +#ifdef TARGET_LPC1768 + +#include "i2c_util.h" + +#define U8G_I2C_OPT_FAST 16 // from u8g.h + +#ifdef __cplusplus + extern "C" { +#endif + +void configure_i2c(const uint8_t clock_option) { + /** + * Init I2C pin connect + */ + PINSEL_CFG_Type PinCfg; + PinCfg.OpenDrain = 0; + PinCfg.Pinmode = 0; + PinCfg.Portnum = 0; + #if I2C_MASTER_ID == 0 + PinCfg.Funcnum = 1; + PinCfg.Pinnum = 27; // SDA0 / D57 AUX-1 ... SCL0 / D58 AUX-1 + #elif I2C_MASTER_ID == 1 + PinCfg.Funcnum = 3; + PinCfg.Pinnum = 0; // SDA1 / D20 SCA ... SCL1 / D21 SCL + #elif I2C_MASTER_ID == 2 + PinCfg.Funcnum = 2; + PinCfg.Pinnum = 10; // SDA2 / D38 X_ENABLE_PIN ... SCL2 / D55 X_DIR_PIN + #endif + PINSEL_ConfigPin(&PinCfg); + PinCfg.Pinnum += 1; + PINSEL_ConfigPin(&PinCfg); + + // Initialize I2C peripheral + I2C_Init(I2CDEV_M, (clock_option & U8G_I2C_OPT_FAST) ? 400000: 100000); // LCD data rates + + // Enable Master I2C operation + I2C_Cmd(I2CDEV_M, I2C_MASTER_MODE, ENABLE); +} + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/include/i2c_util.h b/Marlin/src/HAL/LPC1768/include/i2c_util.h new file mode 100644 index 00000000..a57f68a4 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/include/i2c_util.h @@ -0,0 +1,56 @@ +/** + * 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 + +/** + * HAL_LPC1768/include/i2c_util.h + */ + +#include "../../../inc/MarlinConfigPre.h" + +#ifndef I2C_MASTER_ID + #define I2C_MASTER_ID 1 +#endif + +#if I2C_MASTER_ID == 0 + #define I2CDEV_M LPC_I2C0 +#elif I2C_MASTER_ID == 1 + #define I2CDEV_M LPC_I2C1 +#elif I2C_MASTER_ID == 2 + #define I2CDEV_M LPC_I2C2 +#else + #error "Master I2C device not defined!" +#endif + +#include +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +void configure_i2c(const uint8_t clock_option); + +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp new file mode 100644 index 00000000..0b4045cb --- /dev/null +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -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 . + * + */ +#ifdef TARGET_LPC1768 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { + #include +} + +#include "../../sd/cardreader.h" +#include "../../inc/MarlinConfig.h" +#include "../../core/millis_t.h" + +extern uint32_t MSC_SD_Init(uint8_t pdrv); +extern "C" int isLPC1769(); +extern "C" void disk_timerproc(); + +void SysTick_Callback() { disk_timerproc(); } + +void HAL_init() { + + // Init LEDs + #if PIN_EXISTS(LED) + SET_DIR_OUTPUT(LED_PIN); + WRITE_PIN_CLR(LED_PIN); + #if PIN_EXISTS(LED2) + SET_DIR_OUTPUT(LED2_PIN); + WRITE_PIN_CLR(LED2_PIN); + #if PIN_EXISTS(LED3) + SET_DIR_OUTPUT(LED3_PIN); + WRITE_PIN_CLR(LED3_PIN); + #if PIN_EXISTS(LED4) + SET_DIR_OUTPUT(LED4_PIN); + WRITE_PIN_CLR(LED4_PIN); + #endif + #endif + #endif + + // Flash status LED 3 times to indicate Marlin has started booting + LOOP_L_N(i, 6) { + TOGGLE(LED_PIN); + delay(100); + } + #endif + + // Init Servo Pins + #define INIT_SERVO(N) OUT_WRITE(SERVO##N##_PIN, LOW) + #if HAS_SERVO_0 + INIT_SERVO(0); + #endif + #if HAS_SERVO_1 + INIT_SERVO(1); + #endif + #if HAS_SERVO_2 + INIT_SERVO(2); + #endif + #if HAS_SERVO_3 + INIT_SERVO(3); + #endif + + //debug_frmwrk_init(); + //_DBG("\n\nDebug running\n"); + // Initialize the SD card chip select pins as soon as possible + #if PIN_EXISTS(SS) + OUT_WRITE(SS_PIN, HIGH); + #endif + + #if PIN_EXISTS(ONBOARD_SD_CS) && ONBOARD_SD_CS_PIN != SS_PIN + OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); + #endif + + #ifdef LPC1768_ENABLE_CLKOUT_12M + /** + * CLKOUTCFG register + * bit 8 (CLKOUT_EN) = enables CLKOUT signal. Disabled for now to prevent glitch when enabling GPIO. + * bits 7:4 (CLKOUTDIV) = set to 0 for divider setting of /1 + * bits 3:0 (CLKOUTSEL) = set to 1 to select main crystal oscillator as CLKOUT source + */ + LPC_SC->CLKOUTCFG = (0<<8)|(0<<4)|(1<<0); + // set P1.27 pin to function 01 (CLKOUT) + PINSEL_CFG_Type PinCfg; + PinCfg.Portnum = 1; + PinCfg.Pinnum = 27; + PinCfg.Funcnum = 1; // function 01 (CLKOUT) + PinCfg.OpenDrain = 0; // not open drain + PinCfg.Pinmode = 2; // no pull-up/pull-down + PINSEL_ConfigPin(&PinCfg); + // now set CLKOUT_EN bit + LPC_SC->CLKOUTCFG |= (1<<8); + #endif + + USB_Init(); // USB Initialization + USB_Connect(FALSE); // USB clear connection + delay(1000); // Give OS time to notice + USB_Connect(TRUE); + + #if DISABLED(NO_SD_HOST_DRIVE) + MSC_SD_Init(0); // Enable USB SD card access + #endif + + const millis_t usb_timeout = millis() + 2000; + while (!USB_Configuration && PENDING(millis(), usb_timeout)) { + delay(50); + HAL_idletask(); + #if PIN_EXISTS(LED) + TOGGLE(LED_PIN); // Flash quickly during USB initialization + #endif + } + + HAL_timer_init(); +} + +// HAL idle task +void HAL_idletask() { + #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 + // this will not reliably detect delete operations. To be safe we will lock + // 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()) + if (card.isMounted()) + MSC_Aquire_Lock(); + else + MSC_Release_Lock(); + #endif + // Perform USB stack housekeeping + MSC_RunDeferredCommands(); +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/pinsDebug.h b/Marlin/src/HAL/LPC1768/pinsDebug.h new file mode 100644 index 00000000..f8055160 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/pinsDebug.h @@ -0,0 +1,53 @@ +/** + * 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 . + * + */ + +/** + * Support routines for LPC1768 + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define pwm_details(pin) pin = pin // do nothing // print PWM details +#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) +#define digitalRead_mod(p) extDigitalRead(p) +#define PRINT_PORT(p) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%d.%02d"), LPC176x::pin_port(p), LPC176x::pin_bit(p)); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(Q) ((Q) == P0_29 || (Q) == P0_30 || (Q) == P2_09) // USB pins +#endif + +bool GET_PINMODE(const pin_t pin) { + if (!LPC176x::pin_is_valid(pin) || LPC176x::pin_adc_enabled(pin)) // found an invalid pin or active analog pin + return false; + + return LPC176x::gpio_direction(pin); +} + +bool GET_ARRAY_IS_DIGITAL(const pin_t pin) { + return (!LPC176x::pin_has_adc(pin) || !LPC176x::pin_adc_enabled(pin)); +} diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h new file mode 100644 index 00000000..b4da5d4d --- /dev/null +++ b/Marlin/src/HAL/LPC1768/spi_pins.h @@ -0,0 +1,54 @@ +/** + * 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 "../../core/macros.h" + +#if BOTH(SDSUPPORT, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SCK_PIN || LCD_PINS_ENABLE == MOSI_PIN || DOGLCD_SCK == SCK_PIN || DOGLCD_MOSI == MOSI_PIN) + #define LPC_SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently + // needed due to the speed and mode required for communicating with each device being different. + // This requirement can be removed if the SPI access to these devices is updated to use + // spiBeginTransaction. +#endif + +/** onboard SD card */ +//#define SCK_PIN P0_07 +//#define MISO_PIN P0_08 +//#define MOSI_PIN P0_09 +//#define SS_PIN P0_06 +/** external */ +#ifndef SCK_PIN + #define SCK_PIN P0_15 +#endif +#ifndef MISO_PIN + #define MISO_PIN P0_17 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN P0_18 +#endif +#ifndef SS_PIN + #define SS_PIN P1_23 +#endif +#if !defined(SDSS) || SDSS == P_NC // gets defaulted in pins.h + #undef SDSS + #define SDSS SS_PIN +#endif 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 00000000..84907acd --- /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 00000000..4753fdba --- /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_DRIVER 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 00000000..5f966300 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -0,0 +1,128 @@ +/** + * 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); + 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 00000000..019f75ef --- /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/HAL/LPC1768/timers.cpp b/Marlin/src/HAL/LPC1768/timers.cpp new file mode 100644 index 00000000..a7a40584 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/timers.cpp @@ -0,0 +1,65 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 . + * + */ + +/** + * Description: + * + * Timers for LPC1768 + */ + +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +void HAL_timer_init() { + SBI(LPC_SC->PCONP, SBIT_TIMER0); // Power ON Timer 0 + LPC_TIM0->PR = (HAL_TIMER_RATE) / (STEPPER_TIMER_RATE) - 1; // Use prescaler to set frequency if needed + + SBI(LPC_SC->PCONP, SBIT_TIMER1); // Power ON Timer 1 + LPC_TIM1->PR = (HAL_TIMER_RATE) / 1000000 - 1; +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + LPC_TIM0->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them + LPC_TIM0->MR0 = uint32_t(STEPPER_TIMER_RATE) / frequency; // Match value (period) to set frequency + LPC_TIM0->TCR = _BV(SBIT_CNTEN); // Counter Enable + + NVIC_SetPriority(TIMER0_IRQn, NVIC_EncodePriority(0, 1, 0)); + NVIC_EnableIRQ(TIMER0_IRQn); + break; + + case 1: + LPC_TIM1->MCR = _BV(SBIT_MR0I) | _BV(SBIT_MR0R); // Match on MR0, reset on MR0, interrupts when NVIC enables them + LPC_TIM1->MR0 = uint32_t(TEMP_TIMER_RATE) / frequency; + LPC_TIM1->TCR = _BV(SBIT_CNTEN); // Counter Enable + + NVIC_SetPriority(TIMER1_IRQn, NVIC_EncodePriority(0, 2, 0)); + NVIC_EnableIRQ(TIMER1_IRQn); + break; + + default: break; + } +} + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/timers.h b/Marlin/src/HAL/LPC1768/timers.h new file mode 100644 index 00000000..e6744fb0 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/timers.h @@ -0,0 +1,173 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * + * 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 + +/** + * HAL For LPC1768 + */ + +#include + +#include "../../core/macros.h" + +#define SBIT_TIMER0 1 +#define SBIT_TIMER1 2 + +#define SBIT_CNTEN 0 + +#define SBIT_MR0I 0 // Timer 0 Interrupt when TC matches MR0 +#define SBIT_MR0R 1 // Timer 0 Reset TC on Match +#define SBIT_MR0S 2 // Timer 0 Stop TC and PC on Match +#define SBIT_MR1I 3 +#define SBIT_MR1R 4 +#define SBIT_MR1S 5 +#define SBIT_MR2I 6 +#define SBIT_MR2R 7 +#define SBIT_MR2S 8 +#define SBIT_MR3I 9 +#define SBIT_MR3R 10 +#define SBIT_MR3S 11 + +// ------------------------ +// Defines +// ------------------------ + +#define _HAL_TIMER(T) _CAT(LPC_TIM, T) +#define _HAL_TIMER_IRQ(T) TIMER##T##_IRQn +#define __HAL_TIMER_ISR(T) extern "C" void TIMER##T##_IRQHandler() +#define _HAL_TIMER_ISR(T) __HAL_TIMER_ISR(T) + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE ((F_CPU) / 4) // frequency of timers peripherals + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif +#ifndef PWM_TIMER_NUM + #define PWM_TIMER_NUM 3 // Timer Index for PWM +#endif + +#define TEMP_TIMER_RATE 1000000 +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() _HAL_TIMER_ISR(STEP_TIMER_NUM) +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() _HAL_TIMER_ISR(TEMP_TIMER_NUM) +#endif + +// Timer references by index +#define STEP_TIMER_PTR _HAL_TIMER(STEP_TIMER_NUM) +#define TEMP_TIMER_PTR _HAL_TIMER(TEMP_TIMER_NUM) + +// ------------------------ +// Public functions +// ------------------------ +void HAL_timer_init(); +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: STEP_TIMER_PTR->MR0 = compare; break; // Stepper Timer Match Register 0 + case 1: TEMP_TIMER_PTR->MR0 = compare; break; // Temp Timer Match Register 0 + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return STEP_TIMER_PTR->MR0; // Stepper Timer Match Register 0 + case 1: return TEMP_TIMER_PTR->MR0; // Temp Timer Match Register 0 + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return STEP_TIMER_PTR->TC; // Stepper Timer Count + case 1: return TEMP_TIMER_PTR->TC; // Temp Timer Count + } + return 0; +} + +FORCE_INLINE static void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_EnableIRQ(TIMER0_IRQn); break; // Enable interrupt handler + case 1: NVIC_EnableIRQ(TIMER1_IRQn); break; // Enable interrupt handler + } +} + +FORCE_INLINE static void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DisableIRQ(TIMER0_IRQn); break; // Disable interrupt handler + case 1: NVIC_DisableIRQ(TIMER1_IRQn); break; // Disable interrupt handler + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// This function is missing from CMSIS +FORCE_INLINE static bool NVIC_GetEnableIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[((uint32_t)IRQn) >> 5] & (1 << ((uint32_t)IRQn) & 0x1F)) != 0; +} + +FORCE_INLINE static bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_GetEnableIRQ(TIMER0_IRQn); // Check if interrupt is enabled or not + case 1: return NVIC_GetEnableIRQ(TIMER1_IRQn); // Check if interrupt is enabled or not + } + return false; +} + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: SBI(STEP_TIMER_PTR->IR, SBIT_CNTEN); break; + case 1: SBI(TEMP_TIMER_PTR->IR, SBIT_CNTEN); break; + } +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp new file mode 100644 index 00000000..a48a820d --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp @@ -0,0 +1,123 @@ +/** + * 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 . + * + */ + +// adapted from I2C/master/master.c example +// https://www-users.cs.york.ac.uk/~pcc/MCP/HAPR-Course-web/CMSIS/examples/html/master_8c_source.html + +#ifdef TARGET_LPC1768 + +#include "../include/i2c_util.h" +#include "../../../core/millis_t.h" + +extern int millis(); + +#ifdef __cplusplus + extern "C" { +#endif + +////////////////////////////////////////////////////////////////////////////////////// + +// These two routines are exact copies of the lpc17xx_i2c.c routines. Couldn't link to +// to the lpc17xx_i2c.c routines so had to copy them into this file & rename them. + +static uint32_t _I2C_Start(LPC_I2C_TypeDef *I2Cx) { + // Reset STA, STO, SI + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC|I2C_I2CONCLR_STOC|I2C_I2CONCLR_STAC; + + // Enter to Master Transmitter mode + I2Cx->I2CONSET = I2C_I2CONSET_STA; + + // Wait for complete + while (!(I2Cx->I2CONSET & I2C_I2CONSET_SI)); + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + return (I2Cx->I2STAT & I2C_STAT_CODE_BITMASK); +} + +static void _I2C_Stop (LPC_I2C_TypeDef *I2Cx) { + /* Make sure start bit is not active */ + if (I2Cx->I2CONSET & I2C_I2CONSET_STA) + I2Cx->I2CONCLR = I2C_I2CONCLR_STAC; + + I2Cx->I2CONSET = I2C_I2CONSET_STO|I2C_I2CONSET_AA; + I2Cx->I2CONCLR = I2C_I2CONCLR_SIC; +} + +////////////////////////////////////////////////////////////////////////////////////// + +#define I2CDEV_S_ADDR 0x78 // from SSD1306 //actual address is 0x3C - shift left 1 with LSB set to 0 to indicate write + +#define BUFFER_SIZE 0x1 // only do single byte transfers with LCDs + +I2C_M_SETUP_Type transferMCfg; + +#define I2C_status (LPC_I2C1->I2STAT & I2C_STAT_CODE_BITMASK) + +// Send slave address and write bit +uint8_t u8g_i2c_start(const uint8_t sla) { + // Sometimes TX data ACK or NAK status is returned. That mean the start state didn't + // happen which means only the value of the slave address was send. Keep looping until + // the slave address and write bit are actually sent. + do{ + _I2C_Stop(I2CDEV_M); // output stop state on I2C bus + _I2C_Start(I2CDEV_M); // output start state on I2C bus + while ((I2C_status != I2C_I2STAT_M_TX_START) + && (I2C_status != I2C_I2STAT_M_TX_RESTART) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for start to be asserted + + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_STAC; // clear start state before tansmitting slave address + LPC_I2C1->I2DAT = I2CDEV_S_ADDR & I2C_I2DAT_BITMASK; // transmit slave address & write bit + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + while ((I2C_status != I2C_I2STAT_M_TX_SLAW_ACK) + && (I2C_status != I2C_I2STAT_M_TX_SLAW_NACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_ACK) + && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK)); //wait for slaw to finish + }while ( (I2C_status == I2C_I2STAT_M_TX_DAT_ACK) || (I2C_status == I2C_I2STAT_M_TX_DAT_NACK)); + return 1; +} + +void u8g_i2c_init(const uint8_t clock_option) { + configure_i2c(clock_option); + u8g_i2c_start(0); // Send slave address and write bit +} + +uint8_t u8g_i2c_send_byte(uint8_t data) { + #define I2C_TIMEOUT 3 + LPC_I2C1->I2DAT = data & I2C_I2DAT_BITMASK; // transmit data + LPC_I2C1->I2CONSET = I2C_I2CONSET_AA; + LPC_I2C1->I2CONCLR = I2C_I2CONCLR_SIC; + const millis_t timeout = millis() + I2C_TIMEOUT; + while ((I2C_status != I2C_I2STAT_M_TX_DAT_ACK) && (I2C_status != I2C_I2STAT_M_TX_DAT_NACK) && PENDING(millis(), timeout)); // wait for xmit to finish + // had hangs with SH1106 so added time out - have seen temporary screen corruption when this happens + return 1; +} + +void u8g_i2c_stop() { +} + + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h new file mode 100644 index 00000000..2d976c92 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.h @@ -0,0 +1,28 @@ +/** + * 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 + +void u8g_i2c_init(const uint8_t clock_options); +//uint8_t u8g_i2c_wait(uint8_t mask, uint8_t pos); +uint8_t u8g_i2c_start(uint8_t sla); +uint8_t u8g_i2c_send_byte(uint8_t data); +void u8g_i2c_stop(); diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_defines.h new file mode 100644 index 00000000..d2260037 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_defines.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 + +/** + * LPC1768 LCD-specific defines + */ + +// The following are optional depending on the platform. + +// definitions of HAL specific com and device drivers. +uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); +uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + + +// connect U8g com generic com names to the desired driver +#define U8G_COM_HW_SPI u8g_com_HAL_LPC1768_hw_spi_fn // use LPC1768 specific hardware SPI routine +#define U8G_COM_SW_SPI u8g_com_HAL_LPC1768_sw_spi_fn // use LPC1768 specific software SPI routine +#define U8G_COM_ST7920_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn +#define U8G_COM_ST7920_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn +#define U8G_COM_SSD_I2C u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + +// let these default for now +#define U8G_COM_PARALLEL u8g_com_null_fn +#define U8G_COM_T6963 u8g_com_null_fn +#define U8G_COM_FAST_PARALLEL u8g_com_null_fn +#define U8G_COM_UC_I2C u8g_com_null_fn diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h b/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h new file mode 100644 index 00000000..0b9e2b4f --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_delay.h @@ -0,0 +1,43 @@ +/** + * 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 + +/** + * LCD delay routines - used by all the drivers. + * + * These are based on the LPC1768 routines. + * + * Couldn't just call exact copies because the overhead + * results in a one microsecond delay taking about 4µS. + */ + +#ifdef __cplusplus + extern "C" { +#endif + +void U8g_delay(int msec); +void u8g_MicroDelay(); +void u8g_10MicroDelay(); + +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c new file mode 100644 index 00000000..466fc802 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.c @@ -0,0 +1,110 @@ +/** + * 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 . + * + */ + +/** + * Low level pin manipulation routines - used by all the drivers. + * + * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. + * + * Couldn't just call exact copies because the overhead killed the LCD update speed + * With an intermediate level the softspi was running in the 10-20kHz range which + * resulted in using about about 25% of the CPU's time. + */ + +#ifdef TARGET_LPC1768 + +#include +#include +#include "../../../core/macros.h" +//#include + +#define LPC_PORT_OFFSET (0x0020) +#define LPC_PIN(pin) (1UL << pin) +#define LPC_GPIO(port) ((volatile LPC_GPIO_TypeDef *)(LPC_GPIO0_BASE + LPC_PORT_OFFSET * port)) + +#define INPUT 0 +#define OUTPUT 1 +#define INPUT_PULLUP 2 + +uint8_t LPC1768_PIN_PORT(const uint8_t pin); +uint8_t LPC1768_PIN_PIN(const uint8_t pin); + +#ifdef __cplusplus + extern "C" { +#endif + +// I/O functions +// As defined by Arduino INPUT(0x0), OUTPUT(0x1), INPUT_PULLUP(0x2) +void pinMode_LCD(uint8_t pin, uint8_t mode) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + PINSEL_CFG_Type config = { LPC1768_PIN_PORT(pin), + LPC1768_PIN_PIN(pin), + PINSEL_FUNC_0, + PINSEL_PINMODE_TRISTATE, + PINSEL_PINMODE_NORMAL }; + switch (mode) { + case INPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + PINSEL_ConfigPin(&config); + break; + case OUTPUT: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR |= LPC_PIN(LPC1768_PIN_PIN(pin)); + PINSEL_ConfigPin(&config); + break; + case INPUT_PULLUP: + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIODIR &= ~LPC_PIN(LPC1768_PIN_PIN(pin)); + config.Pinmode = PINSEL_PINMODE_PULLUP; + PINSEL_ConfigPin(&config); + break; + default: break; + } +} + +void u8g_SetPinOutput(uint8_t internal_pin_number) { + pinMode_LCD(internal_pin_number, 1); // OUTPUT +} + +void u8g_SetPinInput(uint8_t internal_pin_number) { + pinMode_LCD(internal_pin_number, 0); // INPUT +} + +void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + if (pin_status) + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOSET = LPC_PIN(LPC1768_PIN_PIN(pin)); + else + LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOCLR = LPC_PIN(LPC1768_PIN_PIN(pin)); +} + +uint8_t u8g_GetPinLevel(uint8_t pin) { + #define LPC1768_PIN_PORT(pin) ((uint8_t)((pin >> 5) & 0b111)) + #define LPC1768_PIN_PIN(pin) ((uint8_t)(pin & 0b11111)) + return (uint32_t)LPC_GPIO(LPC1768_PIN_PORT(pin))->FIOPIN & LPC_PIN(LPC1768_PIN_PIN(pin)) ? 1 : 0; +} + +#ifdef __cplusplus + } +#endif + +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h new file mode 100644 index 00000000..d60d93da --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_pin_routines.h @@ -0,0 +1,37 @@ +/** + * 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 + +/** + * Low level pin manipulation routines - used by all the drivers. + * + * These are based on the LPC1768 pinMode, digitalRead & digitalWrite routines. + * + * Couldn't just call exact copies because the overhead killed the LCD update speed + * With an intermediate level the softspi was running in the 10-20kHz range which + * resulted in using about about 25% of the CPU's time. + */ + +void u8g_SetPinOutput(uint8_t internal_pin_number); +void u8g_SetPinInput(uint8_t internal_pin_number); +void u8g_SetPinLevel(uint8_t pin, uint8_t pin_status); +uint8_t u8g_GetPinLevel(uint8_t pin); 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 new file mode 100644 index 00000000..057e10e0 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_hw_spi.cpp @@ -0,0 +1,129 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_com_msp430_hw_spi.c + * + * 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. + */ + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include +#include "../../shared/HAL_SPI.h" + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_INIT: + u8g_SetPILevel(u8g, U8G_PI_CS, 1); + u8g_SetPILevel(u8g, U8G_PI_A0, 1); + u8g_SetPILevel(u8g, U8G_PI_RESET, 1); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_A0); + u8g_SetPIOutput(u8g, U8G_PI_RESET); + u8g_Delay(5); + spiBegin(); + #ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card + #endif + spiInit(SPI_SPEED); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_WRITE_BYTE: + spiSend((uint8_t)arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + spiSend(*ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB + +#endif // TARGET_LPC1768 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 new file mode 100644 index 00000000..6f7efba4 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_ssd_hw_i2c.cpp @@ -0,0 +1,198 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_com_arduino_ssd_i2c.c + * + * COM interface for Arduino (AND ATmega) and the SSDxxxx chip (SOLOMON) variant + * I2C protocol + * + * 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. + */ + +/** + * Special pin usage: + * U8G_PI_I2C_OPTION additional options + * U8G_PI_A0_STATE used to store the last value of the command/data register selection + * U8G_PI_SET_A0 1: Signal request to update I2C device with new A0_STATE, 0: Do nothing, A0_STATE matches I2C device + * U8G_PI_SCL clock line (NOT USED) + * U8G_PI_SDA data line (NOT USED) + * + * U8G_PI_RESET reset line (currently disabled, see below) + * + * Protocol: + * SLA, Cmd/Data Selection, Arguments + * The command/data register is selected by a special instruction byte, which is sent after SLA + * + * The continue bit is always 0 so that a (re)start is equired for the change from cmd to/data mode + */ + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include + +#define I2C_SLA (0x3C*2) +//#define I2C_CMD_MODE 0x080 +#define I2C_CMD_MODE 0x000 +#define I2C_DATA_MODE 0x040 + +uint8_t u8g_com_ssd_I2C_start_sequence(u8g_t *u8g) { + /* are we requested to set the a0 state? */ + if (u8g->pin_list[U8G_PI_SET_A0] == 0) return 1; + + /* setup bus, might be a repeated start */ + if (u8g_i2c_start(I2C_SLA) == 0) return 0; + if (u8g->pin_list[U8G_PI_A0_STATE] == 0) { + if (u8g_i2c_send_byte(I2C_CMD_MODE) == 0) return 0; + } + else if (u8g_i2c_send_byte(I2C_DATA_MODE) == 0) + return 0; + + u8g->pin_list[U8G_PI_SET_A0] = 0; + return 1; +} + +uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + //u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH); + //u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH); + //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: unknown mode */ + + u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]); + u8g_com_ssd_I2C_start_sequence(u8g); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + /* Currently disabled, but it could be enable. Previous restrictions have been removed */ + /* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */ + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g->pin_list[U8G_PI_A0_STATE] = 0; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */ + if (arg_val == 0 ) { + /* disable chip, send stop condition */ + u8g_i2c_stop(); + } + else { + /* enable, do nothing: any byte writing will trigger the i2c start */ + } + break; + + case U8G_COM_MSG_WRITE_BYTE: + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) { + u8g_i2c_stop(); + return 0; + } + + if (u8g_i2c_send_byte(arg_val) == 0) { + u8g_i2c_stop(); + return 0; + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) { + u8g_i2c_stop(); + return 0; + } + + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte(*ptr++) == 0) { + u8g_i2c_stop(); + return 0; + } + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + //u8g->pin_list[U8G_PI_SET_A0] = 1; + if (u8g_com_ssd_I2C_start_sequence(u8g) == 0) { + u8g_i2c_stop(); + return 0; + } + + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + if (u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0) + return 0; + ptr++; + arg_val--; + } + } + // u8g_i2c_stop(); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */ + break; + + } // switch + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB + +#endif // TARGET_LPC1768 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 new file mode 100644 index 00000000..592e27f6 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -0,0 +1,138 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_com_LPC1768_st7920_hw_spi.c + * + * 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. + */ + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include +#include "../../shared/HAL_SPI.h" +#include "../../shared/Delay.h" + +void spiBegin(); +void spiInit(uint8_t spiRate); +void spiSend(uint8_t b); +void spiSend(const uint8_t* buf, size_t n); + +static uint8_t rs_last_state = 255; + +static void u8g_com_LPC1768_st7920_write_byte_hw_spi(uint8_t rs, uint8_t val) { + + if (rs != rs_last_state) { // Time to send a command/data byte + rs_last_state = rs; + spiSend(rs ? 0x0FA : 0x0F8); // Send data or command + DELAY_US(40); // Give the controller some time: 20 is bad, 30 is OK, 40 is safe + } + + spiSend(val & 0xF0); + spiSend(val << 4); +} + +uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + u8g_SetPILevel(u8g, U8G_PI_CS, 0); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_Delay(5); + spiBegin(); + spiInit(SPI_EIGHTH_SPEED); // ST7920 max speed is about 1.1 MHz + u8g->pin_list[U8G_PI_A0_STATE] = 0; // initial RS state: command mode + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1) + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); // Note: the ST7920 has an active high chip-select + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_hw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB + +#endif // TARGET_LPC1768 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 new file mode 100644 index 00000000..10d84941 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_sw_spi.cpp @@ -0,0 +1,145 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_com_st7920_hw_spi.c + * + * 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. + */ + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(U8GLIB_ST7920) + +#include +#include +#include "../../shared/Delay.h" + +#undef SPI_SPEED +#define SPI_SPEED 3 // About 1 MHz + +static pin_t SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL; +static uint8_t SPI_speed = 0; + +static void u8g_com_LPC1768_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) { + static uint8_t rs_last_state = 255; + if (rs != rs_last_state) { + // Transfer Data (FA) or Command (F8) + swSpiTransfer(rs ? 0x0FA : 0x0F8, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + rs_last_state = rs; + DELAY_US(40); // Give the controller time to process the data: 20 is bad, 30 is OK, 40 is safe + } + swSpiTransfer(val & 0x0F0, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); + swSpiTransfer(val << 4, SPI_speed, SCK_pin_ST7920_HAL, -1, MOSI_pin_ST7920_HAL_HAL); +} + +uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + SCK_pin_ST7920_HAL = u8g->pin_list[U8G_PI_SCK]; + MOSI_pin_ST7920_HAL_HAL = u8g->pin_list[U8G_PI_MOSI]; + + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_SCK); + u8g_SetPIOutput(u8g, U8G_PI_MOSI); + u8g_Delay(5); + + SPI_speed = swSpiInit(SPI_SPEED, SCK_pin_ST7920_HAL, MOSI_pin_ST7920_HAL_HAL); + + u8g_SetPILevel(u8g, U8G_PI_CS, 0); + u8g_SetPILevel(u8g, U8G_PI_SCK, 0); + u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); + + u8g->pin_list[U8G_PI_A0_STATE] = 0; /* initial RS state: command mode */ + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g->pin_list[U8G_PI_A0_STATE] = arg_val; + break; + + case U8G_COM_MSG_CHIP_SELECT: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_CS]) u8g_SetPILevel(u8g, U8G_PI_CS, arg_val); //note: the st7920 has an active high chip select + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t*) arg_ptr; + while (arg_val > 0) { + u8g_com_LPC1768_st7920_write_byte_sw_spi(u8g->pin_list[U8G_PI_A0_STATE], *ptr++); + arg_val--; + } + } + break; + } + return 1; +} + +#endif // U8GLIB_ST7920 +#endif // TARGET_LPC1768 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 new file mode 100644 index 00000000..ca9d6ecf --- /dev/null +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -0,0 +1,207 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_com_std_sw_spi.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2015, 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. + */ + +#ifdef TARGET_LPC1768 + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB && DISABLED(U8GLIB_ST7920) + +#include + +#undef SPI_SPEED +#define SPI_SPEED 2 // About 2 MHz + +#include +#include +#include +#include + +#include + +uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { + + LOOP_L_N(i, 8) { + if (spi_speed == 0) { + LPC176x::gpio_set(mosi_pin, !!(b & 0x80)); + LPC176x::gpio_set(sck_pin, HIGH); + b <<= 1; + if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; + LPC176x::gpio_set(sck_pin, LOW); + } + else { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + LOOP_L_N(j, spi_speed) + LPC176x::gpio_set(mosi_pin, state); + + LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + LPC176x::gpio_set(sck_pin, HIGH); + + b <<= 1; + if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; + + LOOP_L_N(j, spi_speed) + LPC176x::gpio_set(sck_pin, LOW); + } + } + + return b; +} + +uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { + + LOOP_L_N(i, 8) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + if (spi_speed == 0) { + LPC176x::gpio_set(sck_pin, LOW); + LPC176x::gpio_set(mosi_pin, state); + LPC176x::gpio_set(mosi_pin, state); // need some setup time + LPC176x::gpio_set(sck_pin, HIGH); + } + else { + LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + LPC176x::gpio_set(sck_pin, LOW); + + LOOP_L_N(j, spi_speed) + LPC176x::gpio_set(mosi_pin, state); + + LOOP_L_N(j, spi_speed) + LPC176x::gpio_set(sck_pin, HIGH); + } + b <<= 1; + if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; + } + + return b; +} + +static uint8_t SPI_speed = 0; + +static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { + #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) + swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin); + #else + swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin); + #endif +} + +uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + u8g_SetPIOutput(u8g, U8G_PI_SCK); + u8g_SetPIOutput(u8g, U8G_PI_MOSI); + u8g_SetPIOutput(u8g, U8G_PI_CS); + u8g_SetPIOutput(u8g, U8G_PI_A0); + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPIOutput(u8g, U8G_PI_RESET); + SPI_speed = swSpiInit(SPI_SPEED, u8g->pin_list[U8G_PI_SCK], u8g->pin_list[U8G_PI_MOSI]); + u8g_SetPILevel(u8g, U8G_PI_SCK, 0); + u8g_SetPILevel(u8g, U8G_PI_MOSI, 0); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + if (U8G_PIN_NONE != u8g->pin_list[U8G_PI_RESET]) u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); + break; + + case U8G_COM_MSG_CHIP_SELECT: + #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active + u8g_SetPILevel(u8g, U8G_PI_CS, LOW); + } + else { + u8g_SetPILevel(u8g, U8G_PI_CS, HIGH); + u8g_SetPILevel(u8g, U8G_PI_SCK, 0); // Set SCK to mode 0 idle state after CS goes inactive + } + #else + u8g_SetPILevel(u8g, U8G_PI_CS, !arg_val); + #endif + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++); + arg_val--; + } + } + break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_LPC1768_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + u8g_SetPILevel(u8g, U8G_PI_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB && !U8GLIB_ST7920 +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py new file mode 100644 index 00000000..9b0d0617 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py @@ -0,0 +1,145 @@ +# +# sets output_port +# if target_filename is found then that drive is used +# else if target_drive is found then that drive is used +# +from __future__ import print_function + +target_filename = "FIRMWARE.CUR" +target_drive = "REARM" + +import os +import getpass +import platform + +current_OS = platform.system() +Import("env") + +def print_error(e): + print('\nUnable to find destination disk (%s)\n' \ + 'Please select it in platformio.ini using the upload_port keyword ' \ + '(https://docs.platformio.org/en/latest/projectconf/section_env_upload.html) ' \ + 'or copy the firmware (.pio/build/%s/firmware.bin) manually to the appropriate disk\n' \ + %(e, env.get('PIOENV'))) + +try: + if current_OS == 'Windows': + # + # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' + # Windows - doesn't care about the disk's name, only cares about the drive letter + # + + # + # get all drives on this computer + # + import subprocess + # typical result (string): 'Drives: C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' + driveStr = str(subprocess.check_output("fsutil fsinfo drives")) + # typical result (string): 'C:\ D:\ E:\ F:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\ Y:\ Z:\' + # driveStr = driveStr.strip().lstrip('Drives: ') <- Doesn't work in other Languages as English. In German is "Drives:" = "Laufwerke:" + FirstFound = driveStr.find(':',0,-1) # Find the first ":" and + driveStr = driveStr[FirstFound + 1 : -1] # truncate to the rest + # typical result (array of stings): ['C:\\', 'D:\\', 'E:\\', 'F:\\', + # 'G:\\', 'H:\\', 'I:\\', 'J:\\', 'K:\\', 'L:\\', 'M:\\', 'Y:\\', 'Z:\\'] + drives = driveStr.split() + + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + for drive in drives: + final_drive_name = drive.strip().rstrip('\\') # typical result (string): 'C:' + try: + volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT)) + except Exception as e: + continue + else: + if target_drive in volume_info and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = final_drive_name + if target_filename in volume_info: + if target_file_found == False: + upload_disk = final_drive_name + target_file_found = True + + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + env.Replace( + UPLOAD_PORT=upload_disk + ) + print('upload disk: ', upload_disk) + else: + print_error('Autodetect Error') + + elif current_OS == 'Linux': + # + # platformio.ini will accept this for a Linux upload port designation: 'upload_port = /media/media_name/drive' + # + upload_disk = 'Disk not found' + target_file_found = False + target_drive_found = False + drives = os.listdir(os.path.join(os.sep, 'media', getpass.getuser())) + if target_drive in drives: # If target drive is found, use it. + target_drive_found = True + upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), target_drive) + os.sep + else: + for drive in drives: + try: + files = os.listdir(os.path.join(os.sep, 'media', getpass.getuser(), drive)) + except: + continue + else: + if target_filename in files: + upload_disk = os.path.join(os.sep, 'media', getpass.getuser(), drive) + os.sep + target_file_found = True + break + # + # set upload_port to drive if found + # + + if target_file_found or target_drive_found: + env.Replace( + UPLOAD_FLAGS="-P$UPLOAD_PORT", + UPLOAD_PORT=upload_disk + ) + print('upload disk: ', upload_disk) + else: + print_error('Autodetect Error') + + elif current_OS == 'Darwin': # MAC + # + # platformio.ini will accept this for a OSX upload port designation: 'upload_port = /media/media_name/drive' + # + upload_disk = 'Disk not found' + drives = os.listdir('/Volumes') # human readable names + target_file_found = False + target_drive_found = False + if target_drive in drives and target_file_found == False: # set upload if not found target file yet + target_drive_found = True + upload_disk = '/Volumes/' + target_drive + '/' + for drive in drives: + try: + filenames = os.listdir('/Volumes/' + drive + '/') # will get an error if the drive is protected + except: + continue + else: + if target_filename in filenames: + if target_file_found == False: + upload_disk = '/Volumes/' + drive + '/' + target_file_found = True + # + # set upload_port to drive if found + # + + if target_file_found == True or target_drive_found == True: + env.Replace( + UPLOAD_PORT=upload_disk + ) + print('\nupload disk: ', upload_disk, '\n') + else: + print_error('Autodetect Error') + +except Exception as e: + print_error(str(e)) diff --git a/Marlin/src/HAL/LPC1768/usb_serial.cpp b/Marlin/src/HAL/LPC1768/usb_serial.cpp new file mode 100644 index 00000000..d225ce41 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/usb_serial.cpp @@ -0,0 +1,38 @@ +/** + * 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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + +#include "../../feature/e_parser.h" + +EmergencyParser::State emergency_state; + +bool CDC_RecvCallback(const char buffer) { + emergency_parser.update(emergency_state, buffer); + return true; +} + +#endif // EMERGENCY_PARSER +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/watchdog.cpp b/Marlin/src/HAL/LPC1768/watchdog.cpp new file mode 100644 index 00000000..3cd22d66 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/watchdog.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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include +#include "watchdog.h" + +void watchdog_init() { + #if ENABLED(WATCHDOG_RESET_MANUAL) + // We enable the watchdog timer, but only for the interrupt. + + // Configure WDT to only trigger an interrupt + // Disable WDT interrupt (just in case, to avoid triggering it!) + NVIC_DisableIRQ(WDT_IRQn); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Configure WDT to only trigger an interrupt + // Initialize WDT with the given parameters + WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_INT_ONLY); + + // Configure and enable WDT interrupt. + NVIC_ClearPendingIRQ(WDT_IRQn); + NVIC_SetPriority(WDT_IRQn, 0); // Use highest priority, so we detect all kinds of lockups + NVIC_EnableIRQ(WDT_IRQn); + #else + WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); + #endif + WDT_Start(WDT_TIMEOUT); +} + +void HAL_watchdog_refresh() { + WDT_Feed(); + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heartbeat indicator + #endif +} + +// Timeout state +bool watchdog_timed_out() { return TEST(WDT_ReadTimeOutFlag(), 0); } +void watchdog_clear_timeout_flag() { WDT_ClrTimeOutFlag(); } + +#endif // USE_WATCHDOG +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/watchdog.h b/Marlin/src/HAL/LPC1768/watchdog.h new file mode 100644 index 00000000..cc170881 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/watchdog.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 + +#define WDT_TIMEOUT 4000000 // 4 second timeout + +void watchdog_init(); +void HAL_watchdog_refresh(); + +bool watchdog_timed_out(); +void watchdog_clear_timeout_flag(); diff --git a/Marlin/src/HAL/LPC1768/win_usb_driver/lpc176x_usb_driver.inf b/Marlin/src/HAL/LPC1768/win_usb_driver/lpc176x_usb_driver.inf new file mode 100644 index 00000000..4732eb85 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/win_usb_driver/lpc176x_usb_driver.inf @@ -0,0 +1,36 @@ +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%PROVIDER% +DriverVer =04/14/2008, 5.1.2600.5512 + +[Manufacturer] +%PROVIDER%=DeviceList,ntamd64 + + +[DeviceList] +%DESCRIPTION%=LPC1768USB, USB\VID_1D50&PID_6029&MI_00 + +[DeviceList.ntamd64] +%DESCRIPTION%=LPC1768USB, USB\VID_1D50&PID_6029&MI_00 + + +[LPC1768USB] +include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=LowerFilterAddReg,SerialPropPageAddReg + +[LPC1768USB.Services] +include=mdmcpq.inf +AddService=usbser, 0x00000002, LowerFilter_Service_Inst + +[SerialPropPageAddReg] +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + + +[Strings] +PROVIDER = "marlinfw.org" +DRIVER.SVC = "Marlin USB Driver" +DESCRIPTION= "Marlin USB Serial" +COMPOSITE = "Marlin USB VCOM" \ No newline at end of file diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp new file mode 100644 index 00000000..9f24d300 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -0,0 +1,473 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 __SAMD51__ + +#include "../../inc/MarlinConfig.h" +#include +#include + +// ------------------------ +// Local defines +// ------------------------ + +#define GET_TEMP_0_ADC() TERN(HAS_TEMP_ADC_0, PIN_TO_ADC(TEMP_0_PIN), -1) +#define GET_TEMP_1_ADC() TERN(HAS_TEMP_ADC_1, PIN_TO_ADC(TEMP_1_PIN), -1) +#define GET_TEMP_2_ADC() TERN(HAS_TEMP_ADC_2, PIN_TO_ADC(TEMP_2_PIN), -1) +#define GET_TEMP_3_ADC() TERN(HAS_TEMP_ADC_3, PIN_TO_ADC(TEMP_3_PIN), -1) +#define GET_TEMP_4_ADC() TERN(HAS_TEMP_ADC_4, PIN_TO_ADC(TEMP_4_PIN), -1) +#define GET_TEMP_5_ADC() TERN(HAS_TEMP_ADC_5, PIN_TO_ADC(TEMP_5_PIN), -1) +#define GET_TEMP_6_ADC() TERN(HAS_TEMP_ADC_6, PIN_TO_ADC(TEMP_6_PIN), -1) +#define GET_TEMP_7_ADC() TERN(HAS_TEMP_ADC_7, PIN_TO_ADC(TEMP_7_PIN), -1) +#define GET_PROBE_ADC() TERN(HAS_TEMP_PROBE, PIN_TO_ADC(TEMP_PROBE_PIN), -1) +#define GET_BED_ADC() TERN(HAS_TEMP_ADC_BED, PIN_TO_ADC(TEMP_BED_PIN), -1) +#define GET_CHAMBER_ADC() TERN(HAS_TEMP_ADC_CHAMBER, PIN_TO_ADC(TEMP_CHAMBER_PIN), -1) +#define GET_FILAMENT_WIDTH_ADC() TERN(FILAMENT_WIDTH_SENSOR, PIN_TO_ADC(FILWIDTH_PIN), -1) +#define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1) + +#define IS_ADC_REQUIRED(n) ( \ + GET_TEMP_0_ADC() == n || GET_TEMP_1_ADC() == n || GET_TEMP_2_ADC() == n || GET_TEMP_3_ADC() == n \ + || GET_TEMP_4_ADC() == n || GET_TEMP_5_ADC() == n || GET_TEMP_6_ADC() == n || GET_TEMP_7_ADC() == n \ + || GET_PROBE_ADC() == n \ + || GET_BED_ADC() == n \ + || GET_CHAMBER_ADC() == n \ + || GET_FILAMENT_WIDTH_ADC() == n \ + || GET_BUTTONS_ADC() == n \ +) + +#if IS_ADC_REQUIRED(0) + #define ADC0_IS_REQUIRED 1 + #define FIRST_ADC 0 +#else + #define FIRST_ADC 1 +#endif +#if IS_ADC_REQUIRED(1) + #define ADC1_IS_REQUIRED 1 + #define LAST_ADC 1 +#else + #define LAST_ADC 0 +#endif +#if ADC0_IS_REQUIRED || ADC1_IS_REQUIRED + #define ADC_IS_REQUIRED 1 + #define DMA_IS_REQUIRED 1 +#endif + +// ------------------------ +// Types +// ------------------------ + +#if DMA_IS_REQUIRED + + // Struct must be 32 bits aligned because of DMA accesses but fields needs to be 8 bits packed + typedef struct __attribute__((aligned(4), packed)) { + ADC_INPUTCTRL_Type INPUTCTRL; + } HAL_DMA_DAC_Registers; // DMA transfered registers + +#endif + +// ------------------------ +// Private Variables +// ------------------------ + +uint16_t HAL_adc_result; + +#if ADC_IS_REQUIRED + + // Pins used by ADC inputs. Order must be ADC0 inputs first then ADC1 + const uint8_t adc_pins[] = { + // ADC0 pins + #if GET_TEMP_0_ADC() == 0 + TEMP_0_PIN, + #endif + #if GET_TEMP_1_ADC() == 0 + TEMP_1_PIN, + #endif + #if GET_TEMP_2_ADC() == 0 + TEMP_2_PIN, + #endif + #if GET_TEMP_3_ADC() == 0 + TEMP_3_PIN, + #endif + #if GET_TEMP_4_ADC() == 0 + TEMP_4_PIN, + #endif + #if GET_TEMP_5_ADC() == 0 + TEMP_5_PIN, + #endif + #if GET_TEMP_6_ADC() == 0 + TEMP_6_PIN, + #endif + #if GET_TEMP_7_ADC() == 0 + TEMP_7_PIN, + #endif + #if GET_PROBE_ADC() == 0 + TEMP_PROBE_PIN, + #endif + #if GET_BED_ADC() == 0 + TEMP_BED_PIN, + #endif + #if GET_CHAMBER_ADC() == 0 + TEMP_CHAMBER_PIN, + #endif + #if GET_FILAMENT_WIDTH_ADC() == 0 + FILWIDTH_PIN, + #endif + #if GET_BUTTONS_ADC() == 0 + ADC_KEYPAD_PIN, + #endif + // ADC1 pins + #if GET_TEMP_0_ADC() == 1 + TEMP_0_PIN, + #endif + #if GET_TEMP_1_ADC() == 1 + TEMP_1_PIN, + #endif + #if GET_TEMP_2_ADC() == 1 + TEMP_2_PIN, + #endif + #if GET_TEMP_3_ADC() == 1 + TEMP_3_PIN, + #endif + #if GET_TEMP_4_ADC() == 1 + TEMP_4_PIN, + #endif + #if GET_TEMP_5_ADC() == 1 + TEMP_5_PIN, + #endif + #if GET_TEMP_6_ADC() == 1 + TEMP_6_PIN, + #endif + #if GET_TEMP_7_ADC() == 1 + TEMP_7_PIN, + #endif + #if GET_PROBE_ADC() == 1 + TEMP_PROBE_PIN, + #endif + #if GET_BED_ADC() == 1 + TEMP_BED_PIN, + #endif + #if GET_CHAMBER_ADC() == 1 + TEMP_CHAMBER_PIN, + #endif + #if GET_FILAMENT_WIDTH_ADC() == 1 + FILWIDTH_PIN, + #endif + #if GET_BUTTONS_ADC() == 1 + ADC_KEYPAD_PIN, + #endif + }; + + uint16_t HAL_adc_results[COUNT(adc_pins)]; + + #if ADC0_IS_REQUIRED + Adafruit_ZeroDMA adc0DMAProgram, + adc0DMARead; + + const HAL_DMA_DAC_Registers adc0_dma_regs_list[] = { + #if GET_TEMP_0_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_0_PIN) }, + #endif + #if GET_TEMP_1_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_1_PIN) }, + #endif + #if GET_TEMP_2_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_2_PIN) }, + #endif + #if GET_TEMP_3_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_3_PIN) }, + #endif + #if GET_TEMP_4_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_4_PIN) }, + #endif + #if GET_TEMP_5_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_5_PIN) }, + #endif + #if GET_TEMP_6_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_6_PIN) }, + #endif + #if GET_TEMP_7_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_7_PIN) }, + #endif + #if GET_PROBE_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_PROBE_PIN) }, + #endif + #if GET_BED_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_BED_PIN) }, + #endif + #if GET_CHAMBER_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, + #endif + #if GET_FILAMENT_WIDTH_ADC() == 0 + { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, + #endif + #if GET_BUTTONS_ADC() == 0 + { PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) }, + #endif + }; + + #define ADC0_AINCOUNT COUNT(adc0_dma_regs_list) + #endif // ADC0_IS_REQUIRED + + #if ADC1_IS_REQUIRED + Adafruit_ZeroDMA adc1DMAProgram, + adc1DMARead; + + const HAL_DMA_DAC_Registers adc1_dma_regs_list[] = { + #if GET_TEMP_0_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_0_PIN) }, + #endif + #if GET_TEMP_1_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_1_PIN) }, + #endif + #if GET_TEMP_2_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_2_PIN) }, + #endif + #if GET_TEMP_3_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_3_PIN) }, + #endif + #if GET_TEMP_4_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_4_PIN) }, + #endif + #if GET_TEMP_5_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_5_PIN) }, + #endif + #if GET_TEMP_6_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_6_PIN) }, + #endif + #if GET_TEMP_7_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_7_PIN) }, + #endif + #if GET_PROBE_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_PROBE_PIN) }, + #endif + #if GET_BED_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_BED_PIN) }, + #endif + #if GET_CHAMBER_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, + #endif + #if GET_FILAMENT_WIDTH_ADC() == 1 + { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, + #endif + #if GET_BUTTONS_ADC() == 1 + { PIN_TO_INPUTCTRL(ADC_KEYPAD_PIN) }, + #endif + }; + + #define ADC1_AINCOUNT COUNT(adc1_dma_regs_list) + #endif // ADC1_IS_REQUIRED + +#endif // ADC_IS_REQUIRED + +// ------------------------ +// Private functions +// ------------------------ + +#if DMA_IS_REQUIRED + + void dma_init() { + DmacDescriptor *descriptor; + + #if ADC0_IS_REQUIRED + adc0DMAProgram.setTrigger(ADC0_DMAC_ID_SEQ); + adc0DMAProgram.setAction(DMA_TRIGGER_ACTON_BEAT); + adc0DMAProgram.loop(true); + if (adc0DMAProgram.allocate() == DMA_STATUS_OK) { + descriptor = adc0DMAProgram.addDescriptor( + (void *)adc0_dma_regs_list, // SRC + (void *)&ADC0->DSEQDATA.reg, // DEST + sizeof(adc0_dma_regs_list) / 4, // CNT + DMA_BEAT_SIZE_WORD, + true, // SRCINC + false, // DSTINC + DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE + DMA_STEPSEL_SRC // STEPSEL + ); + if (descriptor != nullptr) + descriptor->BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_BEAT; + adc0DMAProgram.startJob(); + } + + adc0DMARead.setTrigger(ADC0_DMAC_ID_RESRDY); + adc0DMARead.setAction(DMA_TRIGGER_ACTON_BEAT); + adc0DMARead.loop(true); + if (adc0DMARead.allocate() == DMA_STATUS_OK) { + adc0DMARead.addDescriptor( + (void *)&ADC0->RESULT.reg, // SRC + &HAL_adc_results, // DEST + ADC0_AINCOUNT, // CNT + DMA_BEAT_SIZE_HWORD, + false, // SRCINC + true, // DSTINC + DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE + DMA_STEPSEL_DST // STEPSEL + ); + adc0DMARead.startJob(); + } + #endif + #if ADC1_IS_REQUIRED + adc1DMAProgram.setTrigger(ADC1_DMAC_ID_SEQ); + adc1DMAProgram.setAction(DMA_TRIGGER_ACTON_BEAT); + adc1DMAProgram.loop(true); + if (adc1DMAProgram.allocate() == DMA_STATUS_OK) { + descriptor = adc1DMAProgram.addDescriptor( + (void *)adc1_dma_regs_list, // SRC + (void *)&ADC1->DSEQDATA.reg, // DEST + sizeof(adc1_dma_regs_list) / 4, // CNT + DMA_BEAT_SIZE_WORD, + true, // SRCINC + false, // DSTINC + DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE + DMA_STEPSEL_SRC // STEPSEL + ); + if (descriptor != nullptr) + descriptor->BTCTRL.bit.EVOSEL = DMA_EVENT_OUTPUT_BEAT; + adc1DMAProgram.startJob(); + } + + adc1DMARead.setTrigger(ADC1_DMAC_ID_RESRDY); + adc1DMARead.setAction(DMA_TRIGGER_ACTON_BEAT); + adc1DMARead.loop(true); + if (adc1DMARead.allocate() == DMA_STATUS_OK) { + adc1DMARead.addDescriptor( + (void *)&ADC1->RESULT.reg, // SRC + &HAL_adc_results[ADC0_AINCOUNT], // DEST + ADC1_AINCOUNT, // CNT + DMA_BEAT_SIZE_HWORD, + false, // SRCINC + true, // DSTINC + DMA_ADDRESS_INCREMENT_STEP_SIZE_1, // STEPSIZE + DMA_STEPSEL_DST // STEPSEL + ); + adc1DMARead.startJob(); + } + #endif + + DMAC->PRICTRL0.bit.RRLVLEN0 = true; // Activate round robin for DMA channels required by ADCs + } + +#endif // DMA_IS_REQUIRED + +// ------------------------ +// Public functions +// ------------------------ + +// HAL initialization task +void HAL_init() { + TERN_(DMA_IS_REQUIRED, dma_init()); + #if ENABLED(SDSUPPORT) + #if SD_CONNECTION_IS(ONBOARD) && PIN_EXISTS(SD_DETECT) + SET_INPUT_PULLUP(SD_DETECT_PIN); + #endif + OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up + #endif +} + +// HAL idle task +/* +void HAL_idletask() { +} +*/ + +void HAL_clear_reset_source() { } + +#pragma push_macro("WDT") +#undef WDT // Required to be able to use '.bit.WDT'. Compiler wrongly replace struct field with WDT define +uint8_t HAL_get_reset_source() { + RSTC_RCAUSE_Type resetCause; + + resetCause.reg = REG_RSTC_RCAUSE; + if (resetCause.bit.POR) return RST_POWER_ON; + else if (resetCause.bit.EXT) return RST_EXTERNAL; + else if (resetCause.bit.BODCORE || resetCause.bit.BODVDD) return RST_BROWN_OUT; + else if (resetCause.bit.WDT) return RST_WATCHDOG; + else if (resetCause.bit.SYST || resetCause.bit.NVM) return RST_SOFTWARE; + else if (resetCause.bit.BACKUP) return RST_BACKUP; + return 0; +} +#pragma pop_macro("WDT") + +extern "C" { + void * _sbrk(int incr); + + extern unsigned int __bss_end__; // end of bss section +} + +// Return free memory between end of heap (or end bss) and whatever is current +int freeMemory() { + int free_memory, heap_end = (int)_sbrk(0); + return (int)&free_memory - (heap_end ?: (int)&__bss_end__); +} + +// ------------------------ +// ADC +// ------------------------ + +void HAL_adc_init() { + #if ADC_IS_REQUIRED + memset(HAL_adc_results, 0xFF, sizeof(HAL_adc_results)); // Fill result with invalid values + + LOOP_L_N(pi, COUNT(adc_pins)) + pinPeripheral(adc_pins[pi], PIO_ANALOG); + + LOOP_S_LE_N(ai, FIRST_ADC, LAST_ADC) { + Adc* adc = ((Adc*[])ADC_INSTS)[ai]; + + // ADC clock setup + GCLK->PCHCTRL[ADC0_GCLK_ID + ai].bit.CHEN = false; + SYNC(GCLK->PCHCTRL[ADC0_GCLK_ID + ai].bit.CHEN); + GCLK->PCHCTRL[ADC0_GCLK_ID + ai].reg = GCLK_PCHCTRL_GEN_GCLK1 | GCLK_PCHCTRL_CHEN; // 48MHz startup code programmed + SYNC(!GCLK->PCHCTRL[ADC0_GCLK_ID + ai].bit.CHEN); + adc->CTRLA.bit.PRESCALER = ADC_CTRLA_PRESCALER_DIV32_Val; // 1.5MHZ adc clock + + // ADC setup + // Preloaded data (fixed for all ADC instances hence not loaded by DMA) + adc->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val; // VRefA pin + SYNC(adc->SYNCBUSY.bit.REFCTRL); + adc->CTRLB.bit.RESSEL = ADC_CTRLB_RESSEL_10BIT_Val; // ... ADC_CTRLB_RESSEL_16BIT_Val + SYNC(adc->SYNCBUSY.bit.CTRLB); + adc->SAMPCTRL.bit.SAMPLEN = (6 - 1); // Sampling clocks + //adc->AVGCTRL.reg = ADC_AVGCTRL_SAMPLENUM_16 | ADC_AVGCTRL_ADJRES(4); // 16 Accumulated conversions and shift 4 to get oversampled 12 bits result + //SYNC(adc->SYNCBUSY.bit.AVGCTRL); + + // Registers loaded by DMA + adc->DSEQCTRL.bit.INPUTCTRL = true; + adc->DSEQCTRL.bit.AUTOSTART = true; // Start conversion after DMA sequence + + adc->CTRLA.bit.ENABLE = true; // Enable ADC + SYNC(adc->SYNCBUSY.bit.ENABLE); + } + #endif // ADC_IS_REQUIRED +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + #if ADC_IS_REQUIRED + LOOP_L_N(pi, COUNT(adc_pins)) { + if (adc_pin == adc_pins[pi]) { + HAL_adc_result = HAL_adc_results[pi]; + return; + } + } + #endif + + HAL_adc_result = 0xFFFF; +} + +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h new file mode 100644 index 00000000..7cb3635b --- /dev/null +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -0,0 +1,149 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 CPU_32_BIT + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" + +#ifdef ADAFRUIT_GRAND_CENTRAL_M4 + #include "MarlinSerial_AGCM4.h" + + // Serial ports + + // MYSERIAL0 required before MarlinSerial includes! + + #define __MSERIAL(X) Serial##X + #define _MSERIAL(X) __MSERIAL(X) + #define MSERIAL(X) _MSERIAL(INCREMENT(X)) + + #if SERIAL_PORT == -1 + #define MYSERIAL0 Serial + #elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #else + #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif + + #ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 Serial + #elif WITHIN(SERIAL_PORT_2, 0, 3) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #else + #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." + #endif + #endif + + #ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL Serial + #elif WITHIN(LCD_SERIAL_PORT, 0, 3) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #else + #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." + #endif + #endif + +#endif // ADAFRUIT_GRAND_CENTRAL_M4 + +typedef int8_t pin_t; + +#define SHARED_SERVOS HAS_SERVOS +#define HAL_SERVO_LIB Servo + +// +// Interrupts +// +#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#define cli() __disable_irq() // Disable interrupts +#define sei() __enable_irq() // Enable interrupts + +void HAL_clear_reset_source(); // clear reset reason +uint8_t HAL_get_reset_source(); // get reset reason + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +// +// ADC +// +extern uint16_t HAL_adc_result; // Most recent ADC conversion + +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_init(); + +//#define HAL_ADC_FILTERED // Disable Marlin's oversampling. The HAL filters ADC values. +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 // ... 12 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +// +// Pin Map +// +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +// +// Tone +// +void toneInit(); +void tone(const pin_t _pin, const unsigned int frequency, const unsigned long duration=0); +void noTone(const pin_t _pin); + +// Enable hooks into idle and setup for HAL +void HAL_init(); +/* +#define HAL_IDLETASK 1 +void HAL_idletask(); +*/ + +// +// Utility functions +// +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +int freeMemory(); +#pragma GCC diagnostic pop + +#ifdef __cplusplus + extern "C" { +#endif +char *dtostrf(double __val, signed char __width, unsigned char __prec, char *__s); +#ifdef __cplusplus + } +#endif diff --git a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp new file mode 100644 index 00000000..c3acd382 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp @@ -0,0 +1,148 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 . + * + */ + +/** + * Hardware and software SPI implementations are included in this file. + * + * Control of the slave select pin(s) is handled by the calling routines and + * SAMD51 let hardware SPI handling to remove SS from its logic. + */ + +#ifdef __SAMD51__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" +#include + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +#if EITHER(SOFTWARE_SPI, FORCE_SOFT_SPI) + + // ------------------------ + // Software SPI + // ------------------------ + #error "Software SPI not supported for SAMD51. Use Hardware SPI." + +#else // !SOFTWARE_SPI + + #ifdef ADAFRUIT_GRAND_CENTRAL_M4 + #if SD_CONNECTION_IS(ONBOARD) + #define sdSPI SDCARD_SPI + #else + #define sdSPI SPI + #endif + #endif + + static SPISettings spiConfig; + + // ------------------------ + // Hardware SPI + // ------------------------ + void spiBegin() { + spiInit(SPI_HALF_SPEED); + } + + void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 8000000; break; + case SPI_HALF_SPEED: clock = 4000000; break; + case SPI_QUARTER_SPEED: clock = 2000000; break; + case SPI_EIGHTH_SPEED: clock = 1000000; break; + case SPI_SIXTEENTH_SPEED: clock = 500000; break; + case SPI_SPEED_5: clock = 250000; break; + case SPI_SPEED_6: clock = 125000; break; + default: clock = 4000000; break; // Default from the SPI library + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + sdSPI.begin(); + } + + /** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ + uint8_t spiRec() { + sdSPI.beginTransaction(spiConfig); + uint8_t returnByte = sdSPI.transfer(0xFF); + sdSPI.endTransaction(); + return returnByte; + } + + /** + * @brief Receives 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 + */ + void spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte == 0) return; + memset(buf, 0xFF, nbyte); + sdSPI.beginTransaction(spiConfig); + sdSPI.transfer(buf, nbyte); + sdSPI.endTransaction(); + } + + /** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ + void spiSend(uint8_t b) { + sdSPI.beginTransaction(spiConfig); + sdSPI.transfer(b); + sdSPI.endTransaction(); + } + + /** + * @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 Uses DMA + */ + void spiSendBlock(uint8_t token, const uint8_t* buf) { + sdSPI.beginTransaction(spiConfig); + sdSPI.transfer(token); + sdSPI.transfer((uint8_t*)buf, nullptr, 512); + sdSPI.endTransaction(); + } + + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, (BitOrder)bitOrder, dataMode); + sdSPI.beginTransaction(spiConfig); + } +#endif // !SOFTWARE_SPI + +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp new file mode 100644 index 00000000..abc5f3ac --- /dev/null +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 ADAFRUIT_GRAND_CENTRAL_M4 + +/** + * Framework doesn't define some serial to save sercom resources + * hence if these are used I need to define them + */ + +#include "../../inc/MarlinConfig.h" + +#if SERIAL_PORT == 1 || SERIAL_PORT_2 == 1 + Uart Serial2(&sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); + void SERCOM4_0_Handler() { Serial2.IrqHandler(); } + void SERCOM4_1_Handler() { Serial2.IrqHandler(); } + void SERCOM4_2_Handler() { Serial2.IrqHandler(); } + void SERCOM4_3_Handler() { Serial2.IrqHandler(); } +#endif + +#if SERIAL_PORT == 2 || SERIAL_PORT_2 == 2 + Uart Serial3(&sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); + void SERCOM1_0_Handler() { Serial3.IrqHandler(); } + void SERCOM1_1_Handler() { Serial3.IrqHandler(); } + void SERCOM1_2_Handler() { Serial3.IrqHandler(); } + void SERCOM1_3_Handler() { Serial3.IrqHandler(); } +#endif + +#if SERIAL_PORT == 3 || SERIAL_PORT_2 == 3 + Uart Serial4(&sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); + void SERCOM5_0_Handler() { Serial4.IrqHandler(); } + void SERCOM5_1_Handler() { Serial4.IrqHandler(); } + void SERCOM5_2_Handler() { Serial4.IrqHandler(); } + void SERCOM5_3_Handler() { Serial4.IrqHandler(); } +#endif + +#endif // ADAFRUIT_GRAND_CENTRAL_M4 diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h new file mode 100644 index 00000000..f3821d8d --- /dev/null +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h @@ -0,0 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 + +extern Uart Serial2; +extern Uart Serial3; +extern Uart Serial4; diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.cpp b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp new file mode 100644 index 00000000..307eb3fd --- /dev/null +++ b/Marlin/src/HAL/SAMD51/QSPIFlash.cpp @@ -0,0 +1,78 @@ +/** + * 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(QSPI_EEPROM) + +#include "QSPIFlash.h" + +#define INVALID_ADDR 0xFFFFFFFF +#define SECTOR_OF(a) (a & ~(SFLASH_SECTOR_SIZE - 1)) +#define OFFSET_OF(a) (a & (SFLASH_SECTOR_SIZE - 1)) + +Adafruit_SPIFlashBase * QSPIFlash::_flashBase = nullptr; +uint8_t QSPIFlash::_buf[SFLASH_SECTOR_SIZE]; +uint32_t QSPIFlash::_addr = INVALID_ADDR; + +void QSPIFlash::begin() { + if (_flashBase != nullptr) return; + + _flashBase = new Adafruit_SPIFlashBase(new Adafruit_FlashTransport_QSPI()); + _flashBase->begin(NULL); +} + +size_t QSPIFlash::size() { + return _flashBase->size(); +} + +uint8_t QSPIFlash::readByte(const uint32_t address) { + if (SECTOR_OF(address) == _addr) return _buf[OFFSET_OF(address)]; + + return _flashBase->read8(address); +} + +void QSPIFlash::writeByte(const uint32_t address, const uint8_t value) { + uint32_t const sector_addr = SECTOR_OF(address); + + // Page changes, flush old and update new cache + if (sector_addr != _addr) { + flush(); + _addr = sector_addr; + + // read a whole page from flash + _flashBase->readBuffer(sector_addr, _buf, SFLASH_SECTOR_SIZE); + } + + _buf[OFFSET_OF(address)] = value; +} + +void QSPIFlash::flush() { + if (_addr == INVALID_ADDR) return; + + _flashBase->eraseSector(_addr / SFLASH_SECTOR_SIZE); + _flashBase->writeBuffer(_addr, _buf, SFLASH_SECTOR_SIZE); + + _addr = INVALID_ADDR; +} + +#endif // QSPI_EEPROM diff --git a/Marlin/src/HAL/SAMD51/QSPIFlash.h b/Marlin/src/HAL/SAMD51/QSPIFlash.h new file mode 100644 index 00000000..db4abec9 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/QSPIFlash.h @@ -0,0 +1,50 @@ +/** + * @file QSPIFlash.h + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Ha Thach and Dean Miller for Adafruit Industries LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Derived from Adafruit_SPIFlash class with no SdFat references + */ + +#pragma once + +#include + +// This class extends Adafruit_SPIFlashBase by adding caching support. +// +// This class will use 4096 Bytes of RAM as a block cache. +class QSPIFlash { + public: + static void begin(); + static size_t size(); + static uint8_t readByte(const uint32_t address); + static void writeByte(const uint32_t address, const uint8_t v); + static void flush(); + + private: + static Adafruit_SPIFlashBase * _flashBase; + static uint8_t _buf[SFLASH_SECTOR_SIZE]; + static uint32_t _addr; +}; + +extern QSPIFlash qspi; diff --git a/Marlin/src/HAL/SAMD51/SAMD51.h b/Marlin/src/HAL/SAMD51/SAMD51.h new file mode 100644 index 00000000..78395614 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/SAMD51.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 SYNC(sc) while (sc) { \ + asm(""); \ + } + +// Get SAMD port/pin from specified arduino pin +#define GET_SAMD_PORT(P) _GET_SAMD_PORT(PIN_TO_SAMD_PIN(P)) +#define GET_SAMD_PIN(P) _GET_SAMD_PIN(PIN_TO_SAMD_PIN(P)) + +// Get external interrupt line associated to specified arduino pin +#define PIN_TO_EILINE(P) _SAMDPORTPIN_TO_EILINE(GET_SAMD_PORT(P), GET_SAMD_PIN(P)) + +// Get adc/ain associated to specified arduino pin +#define PIN_TO_ADC(P) (ANAPIN_TO_ADCAIN(P) >> 8) +#define PIN_TO_AIN(P) (ANAPIN_TO_ADCAIN(P) & 0xFF) + +// Private defines +#define PIN_TO_SAMD_PIN(P) DIO##P##_PIN + +#define _GET_SAMD_PORT(P) ((P) >> 5) +#define _GET_SAMD_PIN(P) ((P) & 0x1F) + +// Get external interrupt line +#define _SAMDPORTPIN_TO_EILINE(P,B) ((P == 0 && WITHIN(B, 0, 31) && B != 8 && B != 26 && B != 28 && B != 29) ? (B) & 0xF \ + : (P == 1 && (WITHIN(B, 0, 25) || WITHIN(B, 30, 31))) ? (B) & 0xF \ + : (P == 1 && WITHIN(B, 26, 29)) ? 12 + (B) - 26 \ + : (P == 2 && (WITHIN(B, 0, 6) || WITHIN(B, 10, 31)) && B != 29) ? (B) & 0xF \ + : (P == 2 && B == 7) ? 9 \ + : (P == 3 && WITHIN(B, 0, 1)) ? (B) \ + : (P == 3 && WITHIN(B, 8, 12)) ? 3 + (B) - 8 \ + : (P == 3 && WITHIN(B, 20, 21)) ? 10 + (B) - 20 \ + : -1) + +// Get adc/ain +#define ANAPIN_TO_ADCAIN(P) _PIN_TO_ADCAIN(ANAPIN_TO_SAMDPIN(P)) +#define _PIN_TO_ADCAIN(P) _SAMDPORTPIN_TO_ADCAIN(_GET_SAMD_PORT(P), _GET_SAMD_PIN(P)) + +#define _SAMDPORTPIN_TO_ADCAIN(P,B) ((P == 0 && WITHIN(B, 2, 3)) ? 0x000 + (B) - 2 \ + : (P == 0 && WITHIN(B, 4, 7)) ? 0x000 + (B) \ + : (P == 0 && WITHIN(B, 8, 9)) ? 0x100 + 2 + (B) - 8 \ + : (P == 0 && WITHIN(B, 10, 11)) ? 0x000 + (B) \ + : (P == 1 && WITHIN(B, 0, 3)) ? 0x000 + 12 + (B) \ + : (P == 1 && WITHIN(B, 4, 7)) ? 0x100 + 6 + (B) - 4 \ + : (P == 1 && WITHIN(B, 8, 9)) ? 0x100 + (B) - 8 \ + : (P == 2 && WITHIN(B, 0, 1)) ? 0x100 + 10 + (B) \ + : (P == 2 && WITHIN(B, 2, 3)) ? 0x100 + 4 + (B) - 2 \ + : (P == 2 && WITHIN(B, 30, 31)) ? 0x100 + 12 + (B) - 30 \ + : (P == 3 && WITHIN(B, 0, 1)) ? 0x100 + 14 + (B) \ + : -1) diff --git a/Marlin/src/HAL/SAMD51/Servo.cpp b/Marlin/src/HAL/SAMD51/Servo.cpp new file mode 100644 index 00000000..9bab8e89 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/Servo.cpp @@ -0,0 +1,224 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 . + * + */ + +/** + * This comes from Arduino library which at the moment is buggy and uncompilable + */ + +#ifdef __SAMD51__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "../shared/servo.h" +#include "../shared/servo_private.h" +#include "SAMD51.h" + +#define __TC_GCLK_ID(t) TC##t##_GCLK_ID +#define _TC_GCLK_ID(t) __TC_GCLK_ID(t) +#define TC_GCLK_ID _TC_GCLK_ID(SERVO_TC) + +#define _TC_PRESCALER(d) TC_CTRLA_PRESCALER_DIV##d##_Val +#define TC_PRESCALER(d) _TC_PRESCALER(d) + +#define __SERVO_IRQn(t) TC##t##_IRQn +#define _SERVO_IRQn(t) __SERVO_IRQn(t) +#define SERVO_IRQn _SERVO_IRQn(SERVO_TC) + +#define HAL_SERVO_TIMER_ISR() TC_HANDLER(SERVO_TC) + +#define TIMER_TCCHANNEL(t) ((t) & 1) +#define TC_COUNTER_START_VAL 0xFFFF + + +static volatile int8_t currentServoIndex[_Nbr_16timers]; // index for the servo being pulsed for each timer (or -1 if refresh interval) + +FORCE_INLINE static uint16_t getTimerCount() { + Tc * const tc = TimerConfig[SERVO_TC].pTc; + + tc->COUNT16.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC; + SYNC(tc->COUNT16.SYNCBUSY.bit.CTRLB || tc->COUNT16.SYNCBUSY.bit.COUNT); + + return tc->COUNT16.COUNT.reg; +} + +// ---------------------------- +// Interrupt handler for the TC +// ---------------------------- +HAL_SERVO_TIMER_ISR() { + Tc * const tc = TimerConfig[SERVO_TC].pTc; + const timer16_Sequence_t timer = + #ifndef _useTimer1 + _timer2 + #elif !defined(_useTimer2) + _timer1 + #else + (tc->COUNT16.INTFLAG.reg & tc->COUNT16.INTENSET.reg & TC_INTFLAG_MC0) ? _timer1 : _timer2 + #endif + ; + const uint8_t tcChannel = TIMER_TCCHANNEL(timer); + + if (currentServoIndex[timer] < 0) { + #if defined(_useTimer1) && defined(_useTimer2) + if (currentServoIndex[timer ^ 1] >= 0) { + // Wait for both channels + // Clear the interrupt + tc->COUNT16.INTFLAG.reg = (tcChannel == 0) ? TC_INTFLAG_MC0 : TC_INTFLAG_MC1; + return; + } + #endif + tc->COUNT16.COUNT.reg = TC_COUNTER_START_VAL; + SYNC(tc->COUNT16.SYNCBUSY.bit.COUNT); + } + else if (SERVO_INDEX(timer, currentServoIndex[timer]) < ServoCount && SERVO(timer, currentServoIndex[timer]).Pin.isActive) + digitalWrite(SERVO(timer, currentServoIndex[timer]).Pin.nbr, LOW); // pulse this channel low if activated + + // Select the next servo controlled by this timer + currentServoIndex[timer]++; + + if (SERVO_INDEX(timer, currentServoIndex[timer]) < ServoCount && currentServoIndex[timer] < SERVOS_PER_TIMER) { + if (SERVO(timer, currentServoIndex[timer]).Pin.isActive) // check if activated + digitalWrite(SERVO(timer, currentServoIndex[timer]).Pin.nbr, HIGH); // it's an active channel so pulse it high + + tc->COUNT16.CC[tcChannel].reg = getTimerCount() - (uint16_t)SERVO(timer, currentServoIndex[timer]).ticks; + } + else { + // finished all channels so wait for the refresh period to expire before starting over + currentServoIndex[timer] = -1; // this will get incremented at the end of the refresh period to start again at the first channel + + const uint16_t tcCounterValue = getTimerCount(); + + if ((TC_COUNTER_START_VAL - tcCounterValue) + 4UL < usToTicks(REFRESH_INTERVAL)) // allow a few ticks to ensure the next OCR1A not missed + tc->COUNT16.CC[tcChannel].reg = TC_COUNTER_START_VAL - (uint16_t)usToTicks(REFRESH_INTERVAL); + else + tc->COUNT16.CC[tcChannel].reg = (uint16_t)(tcCounterValue - 4UL); // at least REFRESH_INTERVAL has elapsed + } + if (tcChannel == 0) { + SYNC(tc->COUNT16.SYNCBUSY.bit.CC0); + // Clear the interrupt + tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0; + } + else { + SYNC(tc->COUNT16.SYNCBUSY.bit.CC1); + // Clear the interrupt + tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC1; + } +} + +void initISR(timer16_Sequence_t timer) { + Tc * const tc = TimerConfig[SERVO_TC].pTc; + const uint8_t tcChannel = TIMER_TCCHANNEL(timer); + + static bool initialized = false; // Servo TC has been initialized + if (!initialized) { + NVIC_DisableIRQ(SERVO_IRQn); + + // Disable the timer + tc->COUNT16.CTRLA.bit.ENABLE = false; + SYNC(tc->COUNT16.SYNCBUSY.bit.ENABLE); + + // Select GCLK0 as timer/counter input clock source + GCLK->PCHCTRL[TC_GCLK_ID].bit.CHEN = false; + SYNC(GCLK->PCHCTRL[TC_GCLK_ID].bit.CHEN); + GCLK->PCHCTRL[TC_GCLK_ID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed + SYNC(!GCLK->PCHCTRL[TC_GCLK_ID].bit.CHEN); + + // Reset the timer + tc->COUNT16.CTRLA.bit.SWRST = true; + SYNC(tc->COUNT16.SYNCBUSY.bit.SWRST); + SYNC(tc->COUNT16.CTRLA.bit.SWRST); + + // Set timer counter mode to 16 bits + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16; + + // Set timer counter mode as normal PWM + tc->COUNT16.WAVE.bit.WAVEGEN = TCC_WAVE_WAVEGEN_NPWM_Val; + + // Set the prescaler factor + tc->COUNT16.CTRLA.bit.PRESCALER = TC_PRESCALER(SERVO_TIMER_PRESCALER); + + // Count down + tc->COUNT16.CTRLBSET.reg = TC_CTRLBCLR_DIR; + SYNC(tc->COUNT16.SYNCBUSY.bit.CTRLB); + + // Reset all servo indexes + memset((void *)currentServoIndex, 0xFF, sizeof(currentServoIndex)); + + // Configure interrupt request + NVIC_ClearPendingIRQ(SERVO_IRQn); + NVIC_SetPriority(SERVO_IRQn, 5); + NVIC_EnableIRQ(SERVO_IRQn); + + initialized = true; + } + + if (!tc->COUNT16.CTRLA.bit.ENABLE) { + // Reset the timer counter + tc->COUNT16.COUNT.reg = TC_COUNTER_START_VAL; + SYNC(tc->COUNT16.SYNCBUSY.bit.COUNT); + + // Enable the timer and start it + tc->COUNT16.CTRLA.bit.ENABLE = true; + SYNC(tc->COUNT16.SYNCBUSY.bit.ENABLE); + } + // First interrupt request after 1 ms + tc->COUNT16.CC[tcChannel].reg = getTimerCount() - (uint16_t)usToTicks(1000UL); + + if (tcChannel == 0 ) { + SYNC(tc->COUNT16.SYNCBUSY.bit.CC0); + + // Clear pending match interrupt + tc->COUNT16.INTFLAG.reg = TC_INTENSET_MC0; + // Enable the match channel interrupt request + tc->COUNT16.INTENSET.reg = TC_INTENSET_MC0; + } + else { + SYNC(tc->COUNT16.SYNCBUSY.bit.CC1); + + // Clear pending match interrupt + tc->COUNT16.INTFLAG.reg = TC_INTENSET_MC1; + // Enable the match channel interrupt request + tc->COUNT16.INTENSET.reg = TC_INTENSET_MC1; + } +} + +void finISR(timer16_Sequence_t timer) { + Tc * const tc = TimerConfig[SERVO_TC].pTc; + const uint8_t tcChannel = TIMER_TCCHANNEL(timer); + + // Disable the match channel interrupt request + tc->COUNT16.INTENCLR.reg = (tcChannel == 0) ? TC_INTENCLR_MC0 : TC_INTENCLR_MC1; + + if (true + #if defined(_useTimer1) && defined(_useTimer2) + && (tc->COUNT16.INTENCLR.reg & (TC_INTENCLR_MC0|TC_INTENCLR_MC1)) == 0 + #endif + ) { + // Disable the timer if not used + tc->COUNT16.CTRLA.bit.ENABLE = false; + SYNC(tc->COUNT16.SYNCBUSY.bit.ENABLE); + } +} + +#endif // HAS_SERVOS + +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/ServoTimers.h b/Marlin/src/HAL/SAMD51/ServoTimers.h new file mode 100644 index 00000000..948d5153 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/ServoTimers.h @@ -0,0 +1,39 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 _useTimer1 +#define _useTimer2 + +#define TRIM_DURATION 5 // compensation ticks to trim adjust for digitalWrite delays +#define SERVO_TIMER_PRESCALER 64 // timer prescaler factor to 64 (avoid overflowing 16-bit clock counter, at 120MHz this is 1831 ticks per millisecond + +#define SERVO_TC 3 + +typedef enum { + #ifdef _useTimer1 + _timer1, + #endif + #ifdef _useTimer2 + _timer2, + #endif + _Nbr_16timers +} timer16_Sequence_t; diff --git a/Marlin/src/HAL/SAMD51/eeprom_flash.cpp b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp new file mode 100644 index 00000000..429ef1c2 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/eeprom_flash.cpp @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 __SAMD51__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" + +#define NVMCTRL_CMD(c) do{ \ + SYNC(!NVMCTRL->STATUS.bit.READY); \ + NVMCTRL->INTFLAG.bit.DONE = true; \ + NVMCTRL->CTRLB.reg = c | NVMCTRL_CTRLB_CMDEX_KEY; \ + SYNC(NVMCTRL->INTFLAG.bit.DONE); \ + }while(0) +#define NVMCTRL_FLUSH() do{ \ + if (NVMCTRL->SEESTAT.bit.LOAD) \ + NVMCTRL_CMD(NVMCTRL_CTRLB_CMD_SEEFLUSH); \ + }while(0) + +size_t PersistentStore::capacity() { + const uint8_t psz = NVMCTRL->SEESTAT.bit.PSZ, + sblk = NVMCTRL->SEESTAT.bit.SBLK; + + return (!psz && !sblk) ? 0 + : (psz <= 2) ? (0x200 << psz) + : (sblk == 1 || psz == 3) ? 4096 + : (sblk == 2 || psz == 4) ? 8192 + : (sblk <= 4 || psz == 5) ? 16384 + : (sblk >= 9 && psz == 7) ? 65536 + : 32768; +} + +bool PersistentStore::access_start() { + NVMCTRL->SEECFG.reg = NVMCTRL_SEECFG_WMODE_BUFFERED; // Buffered mode and segment reallocation active + if (NVMCTRL->SEESTAT.bit.RLOCK) + NVMCTRL_CMD(NVMCTRL_CTRLB_CMD_USEE); // Unlock E2P data write access + return true; +} + +bool PersistentStore::access_finish() { + NVMCTRL_FLUSH(); + if (!NVMCTRL->SEESTAT.bit.LOCK) + NVMCTRL_CMD(NVMCTRL_CTRLB_CMD_LSEE); // Lock E2P data write access + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + const uint8_t v = *value; + SYNC(NVMCTRL->SEESTAT.bit.BUSY); + if (NVMCTRL->INTFLAG.bit.SEESFULL) + NVMCTRL_FLUSH(); // Next write will trigger a sector reallocation. I need to flush 'pagebuffer' + ((volatile uint8_t *)SEEPROM_ADDR)[pos] = v; + SYNC(!NVMCTRL->INTFLAG.bit.SEEWRC); + 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*/) { + while (size--) { + SYNC(NVMCTRL->SEESTAT.bit.BUSY); + uint8_t c = ((volatile uint8_t *)SEEPROM_ADDR)[pos]; + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } + return false; +} + +#endif // FLASH_EEPROM_EMULATION +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp new file mode 100644 index 00000000..b403f793 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/eeprom_qspi.cpp @@ -0,0 +1,71 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 __SAMD51__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(QSPI_EEPROM) + +#include "../shared/eeprom_api.h" + +#include "QSPIFlash.h" + +static bool initialized; + +size_t PersistentStore::capacity() { return qspi.size(); } + +bool PersistentStore::access_start() { + if (!initialized) { + qspi.begin(); + initialized = true; + } + return true; +} + +bool PersistentStore::access_finish() { + qspi.flush(); + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + const uint8_t v = *value; + qspi.writeByte(pos, v); + 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*/) { + while (size--) { + uint8_t c = qspi.readByte(pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } + return false; +} + +#endif // QSPI_EEPROM +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp new file mode 100644 index 00000000..32831958 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp @@ -0,0 +1,74 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 __SAMD51__ + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for I2C / SPI 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--) { + const uint8_t v = *value; + uint8_t * const p = (uint8_t * const)pos; + 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*/) { + while (size--) { + uint8_t c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h new file mode 100644 index 00000000..daac7733 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/endstop_interrupts.h @@ -0,0 +1,208 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 + +/** + * Endstop interrupts for ATMEL SAMD51 based targets. + * + * On SAMD51, all pins support external interrupt capability. + * Any pin can be used for external interrupts, but there are some restrictions. + * At most 16 different external interrupts can be used at one time. + * Further, you can’t just pick any 16 pins to use. This is because every pin on the SAMD51 + * connects to what is called an EXTINT line, and only one pin per EXTINT line can be used for external + * interrupts at a time + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +#define MATCH_EILINE(P1,P2) (P1 != P2 && PIN_TO_EILINE(P1) == PIN_TO_EILINE(P2)) +#if HAS_X_MAX + #define MATCH_X_MAX_EILINE(P) MATCH_EILINE(P, X_MAX_PIN) +#else + #define MATCH_X_MAX_EILINE(P) false +#endif +#if HAS_X_MIN + #define MATCH_X_MIN_EILINE(P) MATCH_EILINE(P, X_MIN_PIN) +#else + #define MATCH_X_MIN_EILINE(P) false +#endif +#if HAS_Y_MAX + #define MATCH_Y_MAX_EILINE(P) MATCH_EILINE(P, Y_MAX_PIN) +#else + #define MATCH_Y_MAX_EILINE(P) false +#endif +#if HAS_Y_MIN + #define MATCH_Y_MIN_EILINE(P) MATCH_EILINE(P, Y_MIN_PIN) +#else + #define MATCH_Y_MIN_EILINE(P) false +#endif +#if HAS_Z_MAX + #define MATCH_Z_MAX_EILINE(P) MATCH_EILINE(P, Z_MAX_PIN) +#else + #define MATCH_Z_MAX_EILINE(P) false +#endif +#if HAS_Z_MIN + #define MATCH_Z_MIN_EILINE(P) MATCH_EILINE(P, Z_MIN_PIN) +#else + #define MATCH_Z_MIN_EILINE(P) false +#endif +#if HAS_Z2_MAX + #define MATCH_Z2_MAX_EILINE(P) MATCH_EILINE(P, Z2_MAX_PIN) +#else + #define MATCH_Z2_MAX_EILINE(P) false +#endif +#if HAS_Z2_MIN + #define MATCH_Z2_MIN_EILINE(P) MATCH_EILINE(P, Z2_MIN_PIN) +#else + #define MATCH_Z2_MIN_EILINE(P) false +#endif +#if HAS_Z3_MAX + #define MATCH_Z3_MAX_EILINE(P) MATCH_EILINE(P, Z3_MAX_PIN) +#else + #define MATCH_Z3_MAX_EILINE(P) false +#endif +#if HAS_Z3_MIN + #define MATCH_Z3_MIN_EILINE(P) MATCH_EILINE(P, Z3_MIN_PIN) +#else + #define MATCH_Z3_MIN_EILINE(P) false +#endif +#if HAS_Z4_MAX + #define MATCH_Z4_MAX_EILINE(P) MATCH_EILINE(P, Z4_MAX_PIN) +#else + #define MATCH_Z4_MAX_EILINE(P) false +#endif +#if HAS_Z4_MIN + #define MATCH_Z4_MIN_EILINE(P) MATCH_EILINE(P, Z4_MIN_PIN) +#else + #define MATCH_Z4_MIN_EILINE(P) false +#endif +#if HAS_Z_MIN_PROBE_PIN + #define MATCH_Z_MIN_PROBE_EILINE(P) MATCH_EILINE(P, Z_MIN_PROBE_PIN) +#else + #define MATCH_Z_MIN_PROBE_EILINE(P) false +#endif +#define AVAILABLE_EILINE(P) (PIN_TO_EILINE(P) != -1 \ + && !MATCH_X_MAX_EILINE(P) && !MATCH_X_MIN_EILINE(P) \ + && !MATCH_Y_MAX_EILINE(P) && !MATCH_Y_MIN_EILINE(P) \ + && !MATCH_Z_MAX_EILINE(P) && !MATCH_Z_MIN_EILINE(P) \ + && !MATCH_Z2_MAX_EILINE(P) && !MATCH_Z2_MIN_EILINE(P) \ + && !MATCH_Z3_MAX_EILINE(P) && !MATCH_Z3_MIN_EILINE(P) \ + && !MATCH_Z4_MAX_EILINE(P) && !MATCH_Z4_MIN_EILINE(P) \ + && !MATCH_Z_MIN_PROBE_EILINE(P)) + +// One ISR for all EXT-Interrupts +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 + _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 + _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 + _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 + _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 + _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 + _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 + _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 + _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 + _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 + _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 + _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 + _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 + _ATTACH(Z_MIN_PROBE_PIN); + #endif +} diff --git a/Marlin/src/HAL/SAMD51/fastio.h b/Marlin/src/HAL/SAMD51/fastio.h new file mode 100644 index 00000000..c456dfce --- /dev/null +++ b/Marlin/src/HAL/SAMD51/fastio.h @@ -0,0 +1,253 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 + +/** + * Fast IO functions for SAMD51 + */ + +#include "SAMD51.h" + +/** + * Utility functions + */ + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(IO); WRITE(IO, HIGH); WRITE(IO, LOW); + */ + +// Read a pin +#define READ(IO) ((PORT->Group[(EPortType)GET_SAMD_PORT(IO)].IN.reg & MASK(GET_SAMD_PIN(IO))) != 0) + +// Write to a pin +#define WRITE(IO,V) do{ \ + const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ + const uint32_t mask = MASK(GET_SAMD_PIN(IO)); \ + \ + if (V) PORT->Group[port].OUTSET.reg = mask; \ + else PORT->Group[port].OUTCLR.reg = mask; \ + }while(0) + +// Toggle a pin +#define TOGGLE(IO) PORT->Group[(EPortType)GET_SAMD_PORT(IO)].OUTTGL.reg = MASK(GET_SAMD_PIN(IO)); + +// Set pin as input +#define SET_INPUT(IO) do{ \ + const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ + const uint32_t pin = GET_SAMD_PIN(IO); \ + \ + PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_INEN); \ + PORT->Group[port].DIRCLR.reg = MASK(pin); \ + }while(0) +// Set pin as input with pullup +#define SET_INPUT_PULLUP(IO) do{ \ + const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ + const uint32_t pin = GET_SAMD_PIN(IO); \ + const uint32_t mask = MASK(pin); \ + \ + PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_INEN | PORT_PINCFG_PULLEN); \ + PORT->Group[port].DIRCLR.reg = mask; \ + PORT->Group[port].OUTSET.reg = mask; \ + }while(0) +// Set pin as input with pulldown +#define SET_INPUT_PULLDOWN(IO) do{ \ + const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ + const uint32_t pin = GET_SAMD_PIN(IO); \ + const uint32_t mask = MASK(pin); \ + \ + PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_INEN | PORT_PINCFG_PULLEN); \ + PORT->Group[port].DIRCLR.reg = mask; \ + PORT->Group[port].OUTCLR.reg = mask; \ + }while(0) +// Set pin as output (push pull) +#define SET_OUTPUT(IO) do{ \ + const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ + const uint32_t pin = GET_SAMD_PIN(IO); \ + \ + PORT->Group[port].DIRSET.reg = MASK(pin); \ + PORT->Group[port].PINCFG[pin].reg = 0; \ + }while(0) +// Set pin as output (open drain) +#define SET_OUTPUT_OD(IO) do{ \ + const EPortType port = (EPortType)GET_SAMD_PORT(IO); \ + const uint32_t pin = GET_SAMD_PIN(IO); \ + \ + PORT->Group[port].PINCFG[pin].reg = (uint8_t)(PORT_PINCFG_PULLEN); \ + PORT->Group[port].DIRCLR.reg = MASK(pin); \ + }while(0) +// Set pin as PWM (push pull) +#define SET_PWM SET_OUTPUT +// Set pin as PWM (open drain) +#define SET_PWM_OD SET_OUTPUT_OD + +// check if pin is an output +#define IS_OUTPUT(IO) ((PORT->Group[(EPortType)GET_SAMD_PORT(IO)].DIR.reg & MASK(GET_SAMD_PIN(IO))) \ + || (PORT->Group[(EPortType)GET_SAMD_PORT(IO)].PINCFG[GET_SAMD_PIN(IO)].reg & (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)) == PORT_PINCFG_PULLEN) +// check if pin is an input +#define IS_INPUT(IO) !IS_OUTPUT(IO) + +// Shorthand +#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) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +/** + * Ports and functions + * Added as necessary or if I feel like it- not a comprehensive list! + */ + +#ifdef ADAFRUIT_GRAND_CENTRAL_M4 + + /* + * Adafruit Grand Central M4 has a lot of PWMs the availables are listed here. + * Some of these share the same source and so can't be used in the same time + */ + #define PWM_PIN(P) (WITHIN(P, 2, 13) || WITHIN(P, 22, 23) || WITHIN(P, 44, 45) || P == 48) + + // Return fullfilled ADCx->INPUTCTRL.reg + #define PIN_TO_INPUTCTRL(P) ( (PIN_TO_AIN(P) == 0) ? ADC_INPUTCTRL_MUXPOS_AIN0 \ + : (PIN_TO_AIN(P) == 1) ? ADC_INPUTCTRL_MUXPOS_AIN1 \ + : (PIN_TO_AIN(P) == 2) ? ADC_INPUTCTRL_MUXPOS_AIN2 \ + : (PIN_TO_AIN(P) == 3) ? ADC_INPUTCTRL_MUXPOS_AIN3 \ + : (PIN_TO_AIN(P) == 4) ? ADC_INPUTCTRL_MUXPOS_AIN4 \ + : (PIN_TO_AIN(P) == 5) ? ADC_INPUTCTRL_MUXPOS_AIN5 \ + : (PIN_TO_AIN(P) == 6) ? ADC_INPUTCTRL_MUXPOS_AIN6 \ + : (PIN_TO_AIN(P) == 7) ? ADC_INPUTCTRL_MUXPOS_AIN7 \ + : (PIN_TO_AIN(P) == 8) ? ADC_INPUTCTRL_MUXPOS_AIN8 \ + : (PIN_TO_AIN(P) == 9) ? ADC_INPUTCTRL_MUXPOS_AIN9 \ + : (PIN_TO_AIN(P) == 10) ? ADC_INPUTCTRL_MUXPOS_AIN10 \ + : (PIN_TO_AIN(P) == 11) ? ADC_INPUTCTRL_MUXPOS_AIN11 \ + : (PIN_TO_AIN(P) == 12) ? ADC_INPUTCTRL_MUXPOS_AIN12 \ + : (PIN_TO_AIN(P) == 13) ? ADC_INPUTCTRL_MUXPOS_AIN13 \ + : (PIN_TO_AIN(P) == 14) ? ADC_INPUTCTRL_MUXPOS_AIN14 \ + : ADC_INPUTCTRL_MUXPOS_AIN15) + + #define ANAPIN_TO_SAMDPIN(P) ( (P == 0) ? PIN_TO_SAMD_PIN(67) \ + : (P == 1) ? PIN_TO_SAMD_PIN(68) \ + : (P == 2) ? PIN_TO_SAMD_PIN(69) \ + : (P == 3) ? PIN_TO_SAMD_PIN(70) \ + : (P == 4) ? PIN_TO_SAMD_PIN(71) \ + : (P == 5) ? PIN_TO_SAMD_PIN(72) \ + : (P == 6) ? PIN_TO_SAMD_PIN(73) \ + : (P == 7) ? PIN_TO_SAMD_PIN(74) \ + : (P == 8) ? PIN_TO_SAMD_PIN(54) \ + : (P == 9) ? PIN_TO_SAMD_PIN(55) \ + : (P == 10) ? PIN_TO_SAMD_PIN(56) \ + : (P == 11) ? PIN_TO_SAMD_PIN(57) \ + : (P == 12) ? PIN_TO_SAMD_PIN(58) \ + : (P == 13) ? PIN_TO_SAMD_PIN(59) \ + : (P == 14) ? PIN_TO_SAMD_PIN(60) \ + : (P == 15) ? PIN_TO_SAMD_PIN(61) \ + : (P == 16) ? PIN_TO_SAMD_PIN(12) \ + : (P == 17) ? PIN_TO_SAMD_PIN(13) \ + : PIN_TO_SAMD_PIN(9)) + + #define digitalPinToAnalogInput(P) (WITHIN(P, 67, 74) ? (P) - 67 : WITHIN(P, 54, 61) ? 8 + (P) - 54 : WITHIN(P, 12, 13) ? 16 + (P) - 12 : P == 9 ? 18 : -1) + + /* + * pins + */ + + // PORTA + #define DIO67_PIN PIN_PA02 // A0 + #define DIO59_PIN PIN_PA04 // A13 + #define DIO68_PIN PIN_PA05 // A1 + #define DIO60_PIN PIN_PA06 // A14 + #define DIO61_PIN PIN_PA07 // A15 + #define DIO26_PIN PIN_PA12 + #define DIO27_PIN PIN_PA13 + #define DIO28_PIN PIN_PA14 + #define DIO23_PIN PIN_PA15 + #define DIO37_PIN PIN_PA16 + #define DIO36_PIN PIN_PA17 + #define DIO35_PIN PIN_PA18 + #define DIO34_PIN PIN_PA19 + #define DIO33_PIN PIN_PA20 + #define DIO32_PIN PIN_PA21 + #define DIO31_PIN PIN_PA22 + #define DIO30_PIN PIN_PA23 + // PORTB + #define DIO12_PIN PIN_PB00 // A16 + #define DIO13_PIN PIN_PB01 // A17 + #define DIO9_PIN PIN_PB02 // A18 + #define DIO69_PIN PIN_PB03 // A2 + #define DIO74_PIN PIN_PB04 // A7 + #define DIO54_PIN PIN_PB05 // A8 + #define DIO55_PIN PIN_PB06 // A9 + #define DIO56_PIN PIN_PB07 // A10 + #define DIO57_PIN PIN_PB08 // A11 + #define DIO58_PIN PIN_PB09 // A12 + #define DIO18_PIN PIN_PB12 + #define DIO19_PIN PIN_PB13 + #define DIO39_PIN PIN_PB14 + #define DIO38_PIN PIN_PB15 + #define DIO14_PIN PIN_PB16 + #define DIO15_PIN PIN_PB17 + #define DIO8_PIN PIN_PB18 + #define DIO29_PIN PIN_PB19 + #define DIO20_PIN PIN_PB20 + #define DIO21_PIN PIN_PB21 + #define DIO10_PIN PIN_PB22 + #define DIO11_PIN PIN_PB23 + #define DIO1_PIN PIN_PB24 + #define DIO0_PIN PIN_PB25 + #define DIO83_PIN PIN_PB28 // SD_CS + #define DIO95_PIN PIN_PB31 // SD_CD + // PORTC + #define DIO70_PIN PIN_PC00 // A3 + #define DIO71_PIN PIN_PC01 // A4 + #define DIO72_PIN PIN_PC02 // A5 + #define DIO73_PIN PIN_PC03 // A6 + #define DIO48_PIN PIN_PC04 + #define DIO49_PIN PIN_PC05 + #define DIO46_PIN PIN_PC06 + #define DIO47_PIN PIN_PC07 + #define DIO45_PIN PIN_PC10 + #define DIO44_PIN PIN_PC11 + #define DIO41_PIN PIN_PC12 + #define DIO40_PIN PIN_PC13 + #define DIO43_PIN PIN_PC14 + #define DIO42_PIN PIN_PC15 + #define DIO25_PIN PIN_PC16 + #define DIO24_PIN PIN_PC17 + #define DIO2_PIN PIN_PC18 + #define DIO3_PIN PIN_PC19 + #define DIO4_PIN PIN_PC20 + #define DIO5_PIN PIN_PC21 + #define DIO16_PIN PIN_PC22 + #define DIO17_PIN PIN_PC23 + #define DIO88_PIN PIN_PC24 // NEOPIXEL + // PORTD + #define DIO53_PIN PIN_PD10 + #define DIO22_PIN PIN_PD12 + #define DIO6_PIN PIN_PD20 + #define DIO7_PIN PIN_PD21 + +#endif // ADAFRUIT_GRAND_CENTRAL_M4 diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h new file mode 100644 index 00000000..932348c5 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/SAMD51." +#endif diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h new file mode 100644 index 00000000..ce6d3fdd --- /dev/null +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h @@ -0,0 +1,28 @@ +/** + * 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 + +#if USE_FALLBACK_EEPROM + #define FLASH_EEPROM_EMULATION +#elif EITHER(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h new file mode 100644 index 00000000..5d610aca --- /dev/null +++ b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 . + * + */ + +/** + * Test SAMD51 specific configuration values for errors at compile-time. + */ + +#if ENABLED(FLASH_EEPROM_EMULATION) + #warning "Did you activate the SmartEEPROM? See https://github.com/GMagician/SAMD51-SmartEEprom-Manager/releases" +#endif + +#if defined(ADAFRUIT_GRAND_CENTRAL_M4) && SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +#if defined(MAX6675_SCK_PIN) && defined(MAX6675_DO_PIN) && (MAX6675_SCK_PIN == SCK1 || MAX6675_DO_PIN == MISO1) + #error "OnBoard SPI BUS can't be shared with other devices." +#endif + +#if SERVO_TC == RTC_TIMER_NUM + #error "Servos can't use RTC timer" +#endif + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for SAMD51. Disable EMERGENCY_PARSER to continue." +#endif + +#if ENABLED(SDIO_SUPPORT) + #error "SDIO_SUPPORT is not supported on SAMD51." +#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 SAMD51." +#endif diff --git a/Marlin/src/HAL/SAMD51/pinsDebug.h b/Marlin/src/HAL/SAMD51/pinsDebug.h new file mode 100644 index 00000000..81376db7 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/pinsDebug.h @@ -0,0 +1,153 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 NUMBER_PINS_TOTAL PINS_COUNT + +#define digitalRead_mod(p) extDigitalRead(p) +#define PRINT_PORT(p) do{ SERIAL_ECHOPGM(" Port: "); sprintf_P(buffer, PSTR("%c%02ld"), 'A' + g_APinDescription[p].ulPort, g_APinDescription[p].ulPin); SERIAL_ECHO(buffer); }while (0) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital +#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL) +#define DIGITAL_PIN_TO_ANALOG_PIN(p) digitalPinToAnalogInput(p) +#define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P)!=-1) +#define pwm_status(pin) digitalPinHasPWM(pin) +#define MULTI_NAME_PAD 27 // space needed to be pretty if not first name assigned to a pin + +// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities +// uses pin index +#define M43_NEVER_TOUCH(Q) ((Q) >= 75) + +bool GET_PINMODE(int8_t pin) { // 1: output, 0: input + const EPortType samdport = g_APinDescription[pin].ulPort; + const uint32_t samdpin = g_APinDescription[pin].ulPin; + return PORT->Group[samdport].DIR.reg & MASK(samdpin) || (PORT->Group[samdport].PINCFG[samdpin].reg & (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)) == PORT_PINCFG_PULLEN; +} + +void pwm_details(int32_t pin) { + if (pwm_status(pin)) { + //uint32_t chan = g_APinDescription[pin].ulPWMChannel TODO when fast pwm is operative; + //SERIAL_ECHOPAIR("PWM = ", duty); + } +} + +/** + * AGCM4 Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PB25 | "RX0" + * 1 | PB24 | "TX0" + * 2 | PC18 | + * 3 | PC19 | + * 4 | PC20 | + * 5 | PC21 | + * 6 | PD20 | + * 7 | PD21 | + * 8 | PB18 | + * 9 | PB2 | + * 10 | PB22 | + * 11 | PB23 | + * 12 | PB0 | "A16" + * 13 | PB1 | LED AMBER "L" / "A17" + * 14 | PB16 | "TX3" + * 15 | PB17 | "RX3" + * 16 | PC22 | "TX2" + * 17 | PC23 | "RX2" + * 18 | PB12 | "TX1" / "A18" + * 19 | PB13 | "RX1" + * 20 | PB20 | "SDA" + * 21 | PB21 | "SCL" + * 22 | PD12 | + * 23 | PA15 | + * 24 | PC17 | + * 25 | PC16 | + * 26 | PA12 | + * 27 | PA13 | + * 28 | PA14 | + * 29 | PB19 | + * 30 | PA23 | + * 31 | PA22 | + * 32 | PA21 | + * 33 | PA20 | + * 34 | PA19 | + * 35 | PA18 | + * 36 | PA17 | + * 37 | PA16 | + * 38 | PB15 | + * 39 | PB14 | + * 40 | PC13 | + * 41 | PC12 | + * 42 | PC15 | + * 43 | PC14 | + * 44 | PC11 | + * 45 | PC10 | + * 46 | PC6 | + * 47 | PC7 | + * 48 | PC4 | + * 49 | PC5 | + * 50 | PD11 | + * 51 | PD8 | + * 52 | PD9 | + * 53 | PD10 | + * 54 | PB5 | "A8" + * 55 | PB6 | "A9" + * 56 | PB7 | "A10" + * 57 | PB8 | "A11" + * 58 | PB9 | "A12" + * 69 | PA4 | "A13" + * 60 | PA6 | "A14" + * 61 | PA7 | "A15" + * 62 | PB17 | + * 63 | PB20 | + * 64 | PD11 | + * 65 | PD8 | + * 66 | PD9 | + * 67 | PA2 | "A0" / "DAC0" + * 68 | PA5 | "A1" / "DAC1" + * 69 | PB3 | "A2" + * 70 | PC0 | "A3" + * 71 | PC1 | "A4" + * 72 | PC2 | "A5" + * 73 | PC3 | "A6" + * 74 | PB4 | "A7" + * 75 | PC31 | LED GREEN "RX" + * 76 | PC30 | LED GREEN "TX" + * 77 | PA27 | USB: Host enable + * 78 | PA24 | USB: D- + * 79 | PA25 | USB: D+ + * 80 | PB29 | SD: MISO + * 81 | PB27 | SD: SCK + * 82 | PB26 | SD: MOSI + * 83 | PB28 | SD: CS + * 84 | PA3 | AREF + * 85 | PA2 | DAC0 (Duplicate) + * 86 | PA5 | DAC1 (Duplicate) + * 87 | PB1 | LED AMBER "L" (Duplicate) + * 88 | PC24 | NeoPixel + * 89 | PB10 | QSPI: SCK + * 90 | PB11 | QSPI: CS + * 91 | PA8 | QSPI: IO0 + * 92 | PA9 | QSPI: IO1 + * 93 | PA10 | QSPI: IO2 + * 94 | PA11 | QSPI: IO3 + * 95 | PB31 | SD: DETECT + */ diff --git a/Marlin/src/HAL/SAMD51/spi_pins.h b/Marlin/src/HAL/SAMD51/spi_pins.h new file mode 100644 index 00000000..5a9b1275 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/spi_pins.h @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 ADAFRUIT_GRAND_CENTRAL_M4 + + /* + * AGCM4 Default SPI Pins + * + * SS SCK MISO MOSI + * +-------------------------+ + * SPI | 53 52 50 51 | + * SPI1 | 83 81 80 82 | + * +-------------------------+ + * Any pin can be used for Chip Select (SS_PIN) + */ + #ifndef SCK_PIN + #define SCK_PIN 52 + #endif + #ifndef MISO_PIN + #define MISO_PIN 50 + #endif + #ifndef MOSI_PIN + #define MOSI_PIN 51 + #endif + #ifndef SDSS + #define SDSS 53 + #endif + +#else + + #error "Unsupported board!" + +#endif + +#define SS_PIN SDSS diff --git a/Marlin/src/HAL/SAMD51/timers.cpp b/Marlin/src/HAL/SAMD51/timers.cpp new file mode 100644 index 00000000..a68af2e0 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/timers.cpp @@ -0,0 +1,168 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 __SAMD51__ + +// -------------------------------------------------------------------------- +// Includes +// -------------------------------------------------------------------------- + +#include "../../inc/MarlinConfig.h" +#include "ServoTimers.h" // for SERVO_TC + +// -------------------------------------------------------------------------- +// Local defines +// -------------------------------------------------------------------------- + +#define NUM_HARDWARE_TIMERS 8 + +// -------------------------------------------------------------------------- +// Private Variables +// -------------------------------------------------------------------------- + +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 (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) }, + { {.pTc=TC7}, TC7_IRQn, TC_PRIORITY(7) }, + { {.pRtc=RTC}, RTC_IRQn, TC_PRIORITY(8) } // 8 - temperature (assigned priority 6) +}; + +// -------------------------------------------------------------------------- +// Private functions +// -------------------------------------------------------------------------- + +FORCE_INLINE void Disable_Irq(IRQn_Type irq) { + NVIC_DisableIRQ(irq); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + + // Disable interrupt, just in case it was already enabled + Disable_Irq(irq); + + if (timer_num == RTC_TIMER_NUM) { + Rtc * const rtc = TimerConfig[timer_num].pRtc; + + // Disable timer interrupt + rtc->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0; + + // RTC clock setup + OSC32KCTRL->RTCCTRL.reg = OSC32KCTRL_RTCCTRL_RTCSEL_XOSC32K; // External 32.768KHz oscillator + + // Stop timer, just in case, to be able to reconfigure it + rtc->MODE0.CTRLA.bit.ENABLE = false; + SYNC(rtc->MODE0.SYNCBUSY.bit.ENABLE); + + // Mode, reset counter on match + rtc->MODE0.CTRLA.reg = RTC_MODE0_CTRLA_MODE_COUNT32 | RTC_MODE0_CTRLA_MATCHCLR; + + // Set compare value + rtc->MODE0.COMP[0].reg = (32768 + frequency / 2) / frequency; + SYNC(rtc->MODE0.SYNCBUSY.bit.COMP0); + + // Enable interrupt on compare + rtc->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; // reset pending interrupt + rtc->MODE0.INTENSET.reg = RTC_MODE0_INTENSET_CMP0; // enable compare 0 interrupt + + // And start timer + rtc->MODE0.CTRLA.bit.ENABLE = true; + SYNC(rtc->MODE0.SYNCBUSY.bit.ENABLE); + } + else { + Tc * const tc = TimerConfig[timer_num].pTc; + + // Disable timer interrupt + tc->COUNT32.INTENCLR.reg = TC_INTENCLR_OVF; // disable overflow interrupt + + // TCn clock setup + const uint8_t clockID = GCLK_CLKCTRL_IDs[TCC_INST_NUM + timer_num]; // TC clock are preceeded by TCC ones + GCLK->PCHCTRL[clockID].bit.CHEN = false; + SYNC(GCLK->PCHCTRL[clockID].bit.CHEN); + GCLK->PCHCTRL[clockID].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN; // 120MHz startup code programmed + SYNC(!GCLK->PCHCTRL[clockID].bit.CHEN); + + // Stop timer, just in case, to be able to reconfigure it + tc->COUNT32.CTRLA.bit.ENABLE = false; + SYNC(tc->COUNT32.SYNCBUSY.bit.ENABLE); + + // Reset timer + tc->COUNT32.CTRLA.bit.SWRST = true; + SYNC(tc->COUNT32.SYNCBUSY.bit.SWRST); + + // Wave mode, reset counter on compare match + tc->COUNT32.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; + tc->COUNT32.CTRLA.reg = TC_CTRLA_MODE_COUNT32 | TC_CTRLA_PRESCALER_DIV1; + tc->COUNT32.CTRLBCLR.reg = TC_CTRLBCLR_DIR; + SYNC(tc->COUNT32.SYNCBUSY.bit.CTRLB); + + // Set compare value + tc->COUNT32.CC[0].reg = (HAL_TIMER_RATE) / frequency; + tc->COUNT32.COUNT.reg = 0; + + // Enable interrupt on compare + tc->COUNT32.INTFLAG.reg = TC_INTFLAG_OVF; // reset pending interrupt + tc->COUNT32.INTENSET.reg = TC_INTENSET_OVF; // enable overflow interrupt + + // And start timer + tc->COUNT32.CTRLA.bit.ENABLE = true; + SYNC(tc->COUNT32.SYNCBUSY.bit.ENABLE); + } + + // Finally, enable IRQ + NVIC_SetPriority(irq, TimerConfig[timer_num].priority); + NVIC_EnableIRQ(irq); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + NVIC_EnableIRQ(irq); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + Disable_Irq(irq); +} + +// missing from CMSIS: Check if interrupt is enabled or not +static bool NVIC_GetEnabledIRQ(IRQn_Type IRQn) { + return (NVIC->ISER[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F))) != 0; +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + const IRQn_Type irq = TimerConfig[timer_num].IRQ_Id; + return NVIC_GetEnabledIRQ(irq); +} + +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/timers.h b/Marlin/src/HAL/SAMD51/timers.h new file mode 100644 index 00000000..dc6e38b7 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/timers.h @@ -0,0 +1,143 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 + +// -------------------------------------------------------------------------- +// Defines +// -------------------------------------------------------------------------- +#define RTC_TIMER_NUM 8 // This is not a TC but a RTC + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define HAL_TIMER_RATE F_CPU // frequency of timers peripherals + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM RTC_TIMER_NUM // Timer Index for Temperature +#endif + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) +#define STEPPER_TIMER_TICKS_PER_US (STEPPER_TIMER_RATE / 1000000) // stepper timer ticks per µs +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#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 == 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() +#define TC_HANDLER(t) _TC_HANDLER(t) +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() TC_HANDLER(STEP_TIMER_NUM) +#endif +#if STEP_TIMER_NUM != PULSE_TIMER_NUM + #define HAL_PULSE_TIMER_ISR() TC_HANDLER(PULSE_TIMER_NUM) +#endif +#if TEMP_TIMER_NUM == RTC_TIMER_NUM + #define HAL_TEMP_TIMER_ISR() void RTC_Handler() +#else + #define HAL_TEMP_TIMER_ISR() TC_HANDLER(TEMP_TIMER_NUM) +#endif + +// -------------------------------------------------------------------------- +// Types +// -------------------------------------------------------------------------- + +typedef struct { + union { + Tc *pTc; + Rtc *pRtc; + }; + IRQn_Type IRQ_Id; + uint8_t priority; +} tTimerConfig; + +// -------------------------------------------------------------------------- +// Public Variables +// -------------------------------------------------------------------------- + +extern const tTimerConfig TimerConfig[]; + +// -------------------------------------------------------------------------- +// Public functions +// -------------------------------------------------------------------------- + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + // Should never be called with timer RTC_TIMER_NUM + Tc * const tc = TimerConfig[timer_num].pTc; + tc->COUNT32.CC[0].reg = compare; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + // Should never be called with timer RTC_TIMER_NUM + Tc * const tc = TimerConfig[timer_num].pTc; + return (hal_timer_t)tc->COUNT32.CC[0].reg; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + // Should never be called with timer RTC_TIMER_NUM + Tc * const tc = TimerConfig[timer_num].pTc; + tc->COUNT32.CTRLBSET.reg = TC_CTRLBCLR_CMD_READSYNC; + SYNC(tc->COUNT32.SYNCBUSY.bit.CTRLB || tc->COUNT32.SYNCBUSY.bit.COUNT); + return tc->COUNT32.COUNT.reg; +} + +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); + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (timer_num == RTC_TIMER_NUM) { + Rtc * const rtc = TimerConfig[timer_num].pRtc; + // Clear interrupt flag + rtc->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; + } + else { + Tc * const tc = TimerConfig[timer_num].pTc; + // Clear interrupt flag + tc->COUNT32.INTFLAG.reg = TC_INTFLAG_OVF; + } +} + +#define HAL_timer_isr_epilogue(timer_num) diff --git a/Marlin/src/HAL/SAMD51/watchdog.cpp b/Marlin/src/HAL/SAMD51/watchdog.cpp new file mode 100644 index 00000000..ebc8dffe --- /dev/null +++ b/Marlin/src/HAL/SAMD51/watchdog.cpp @@ -0,0 +1,52 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 __SAMD51__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + + #include "watchdog.h" + + void watchdog_init() { + // The low-power oscillator used by the WDT runs at 32,768 Hz with + // a 1:32 prescale, thus 1024 Hz, though probably not super precise. + + // Setup WDT clocks + MCLK->APBAMASK.bit.OSC32KCTRL_ = true; + MCLK->APBAMASK.bit.WDT_ = true; + OSC32KCTRL->OSCULP32K.bit.EN1K = true; // Enable out 1K (this is what WDT uses) + + WDT->CTRLA.bit.ENABLE = false; // Disable watchdog for config + SYNC(WDT->SYNCBUSY.bit.ENABLE); + + WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt + WDT->CONFIG.reg = WDT_CONFIG_PER_CYC4096; // Set at least 4s period for chip reset + + HAL_watchdog_refresh(); + + WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode + SYNC(WDT->SYNCBUSY.bit.ENABLE); + } + +#endif // USE_WATCHDOG + +#endif // __SAMD51__ diff --git a/Marlin/src/HAL/SAMD51/watchdog.h b/Marlin/src/HAL/SAMD51/watchdog.h new file mode 100644 index 00000000..2cd47882 --- /dev/null +++ b/Marlin/src/HAL/SAMD51/watchdog.h @@ -0,0 +1,31 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * SAMD51 HAL developed by Giuliano Zaro (AKA GMagician) + * + * 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 + +// Initialize watchdog with a 4 second interrupt time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or SAMD will go into emergency procedures. +inline void HAL_watchdog_refresh() { + SYNC(WDT->SYNCBUSY.bit.CLEAR); // Test first if previous is 'ongoing' to save time waiting for command execution + WDT->CLEAR.reg = WDT_CLEAR_CLEAR_KEY; +} diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp new file mode 100644 index 00000000..e067c179 --- /dev/null +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -0,0 +1,135 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "HAL.h" +#include "usb_serial.h" + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +#if ENABLED(SRAM_EEPROM_EMULATION) + #if STM32F7xx + #include + #elif STM32F4xx + #include + #else + #error "SRAM_EEPROM_EMULATION is currently only supported for STM32F4xx and STM32F7xx" + #endif +#endif + +// ------------------------ +// Public Variables +// ------------------------ + +uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +// Needed for DELAY_NS() / DELAY_US() on CORTEX-M7 +#if (defined(__arm__) || defined(__thumb__)) && __CORTEX_M == 7 + // HAL pre-initialization task + // Force the preinit function to run between the premain() and main() function + // of the STM32 arduino core + __attribute__((constructor (102))) + void HAL_preinit() { + enableCycleCounter(); + } +#endif + +// HAL initialization task +void HAL_init() { + FastIO_init(); + + #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1) + OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up + #endif + + #if PIN_EXISTS(LED) + OUT_WRITE(LED_PIN, LOW); + #endif + + #if ENABLED(SRAM_EEPROM_EMULATION) + __HAL_RCC_PWR_CLK_ENABLE(); + HAL_PWR_EnableBkUpAccess(); // Enable access to backup SRAM + __HAL_RCC_BKPSRAM_CLK_ENABLE(); + LL_PWR_EnableBkUpRegulator(); // Enable backup regulator + while (!LL_PWR_IsActiveFlag_BRR()); // Wait until backup regulator is initialized + #endif + + SetTimerInterruptPriorities(); + + TERN_(EMERGENCY_PARSER, USB_Hook_init()); +} + +void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } + +uint8_t HAL_get_reset_source() { + return + #ifdef RCC_FLAG_IWDGRST // Some sources may not exist... + RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ? RST_WATCHDOG : + #endif + #ifdef RCC_FLAG_IWDG1RST + RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDG1RST) ? RST_WATCHDOG : + #endif + #ifdef RCC_FLAG_IWDG2RST + RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_IWDG2RST) ? RST_WATCHDOG : + #endif + #ifdef RCC_FLAG_SFTRST + RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) ? RST_SOFTWARE : + #endif + #ifdef RCC_FLAG_PINRST + RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) ? RST_EXTERNAL : + #endif + #ifdef RCC_FLAG_PORRST + RESET != __HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) ? RST_POWER_ON : + #endif + 0 + ; +} + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// ------------------------ +// ADC +// ------------------------ + +// TODO: Make sure this doesn't cause any delay +void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } +uint16_t HAL_adc_get_result() { return HAL_adc_result; } + +// Reset the system (to initiate a firmware flash) +WEAK void flashFirmware(const int16_t) { NVIC_SystemReset(); } + +// Maple Compatibility +systickCallback_t systick_user_callback; +void systick_attach_callback(systickCallback_t cb) { systick_user_callback = cb; } +void HAL_SYSTICK_Callback() { if (systick_user_callback) systick_user_callback(); } + +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h new file mode 100644 index 00000000..a1f7515d --- /dev/null +++ b/Marlin/src/HAL/STM32/HAL.h @@ -0,0 +1,186 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 CPU_32_BIT + +#include "../../core/macros.h" +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" +#include "fastio.h" +#include "watchdog.h" +#include "MarlinSerial.h" + +#include "../../inc/MarlinConfigPre.h" + +#include + +#ifdef USBCON + #include +#endif + +// ------------------------ +// Defines +// ------------------------ +#define _MSERIAL(X) MSerial##X +#define MSERIAL(X) _MSERIAL(X) + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif WITHIN(SERIAL_PORT, 1, 6) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#else + #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 SerialUSB + #elif WITHIN(SERIAL_PORT_2, 1, 6) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #else + #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration." + #endif +#endif + +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL SerialUSB + #elif WITHIN(LCD_SERIAL_PORT, 1, 6) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #else + #error "LCD_SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." + #endif + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() + #endif +#endif + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() +#define cli() __disable_irq() +#define sei() __enable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +// ------------------------ +// Types +// ------------------------ + +typedef int16_t pin_t; + +#define HAL_SERVO_LIB libServo + +// ------------------------ +// Public Variables +// ------------------------ + +// result of last ADC conversion +extern uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +// Memory related +#define __bss_end __bss_end__ + +// Enable hooks into setup for HAL +void HAL_init(); + +// Clear reset reason +void HAL_clear_reset_source(); + +// Reset reason +uint8_t HAL_get_reset_source(); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +void _delay_ms(const int delay); + +extern "C" char* _sbrk(int incr); + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" + +static inline int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +#pragma GCC diagnostic pop + +// +// ADC +// + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) + +inline void HAL_adc_init() {} + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); + +uint16_t HAL_adc_get_result(); + +#define GET_PIN_MAP_PIN(index) index +#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); + +// Maple Compatibility +typedef void (*systickCallback_t)(void); +void systick_attach_callback(systickCallback_t cb); +void HAL_SYSTICK_Callback(); diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp new file mode 100644 index 00000000..f947e6ef --- /dev/null +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -0,0 +1,220 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#include + +// ------------------------ +// Public Variables +// ------------------------ + +static SPISettings spiConfig; + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(SOFTWARE_SPI) + + // ------------------------ + // Software SPI + // ------------------------ + + #include "../shared/Delay.h" + + void spiBegin(void) { + OUT_WRITE(SS_PIN, HIGH); + OUT_WRITE(SCK_PIN, HIGH); + SET_INPUT(MISO_PIN); + OUT_WRITE(MOSI_PIN, HIGH); + } + + static uint16_t delay_STM32_soft_spi; + + void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + switch (spiRate) { + case SPI_FULL_SPEED: delay_STM32_soft_spi = 125; break; // desired: 8,000,000 actual: ~1.1M + case SPI_HALF_SPEED: delay_STM32_soft_spi = 125; break; // desired: 4,000,000 actual: ~1.1M + case SPI_QUARTER_SPEED:delay_STM32_soft_spi = 250; break; // desired: 2,000,000 actual: ~890K + case SPI_EIGHTH_SPEED: delay_STM32_soft_spi = 500; break; // desired: 1,000,000 actual: ~590K + case SPI_SPEED_5: delay_STM32_soft_spi = 1000; break; // desired: 500,000 actual: ~360K + case SPI_SPEED_6: delay_STM32_soft_spi = 2000; break; // desired: 250,000 actual: ~210K + default: delay_STM32_soft_spi = 4000; break; // desired: 125,000 actual: ~123K + } + SPI.begin(); + } + + // Begin SPI transaction, set clock, bit order, data mode + void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { /* do nothing */ } + + uint8_t HAL_SPI_STM32_SpiTransfer_Mode_3(uint8_t b) { // using Mode 3 + for (uint8_t bits = 8; bits--;) { + WRITE(SCK_PIN, LOW); + WRITE(MOSI_PIN, b & 0x80); + + DELAY_NS(delay_STM32_soft_spi); + WRITE(SCK_PIN, HIGH); + DELAY_NS(delay_STM32_soft_spi); + + b <<= 1; // little setup time + b |= (READ(MISO_PIN) != 0); + } + DELAY_NS(125); + return b; + } + + // Soft SPI receive byte + uint8_t spiRec() { + DISABLE_ISRS(); // No interrupts during byte receive + const uint8_t data = HAL_SPI_STM32_SpiTransfer_Mode_3(0xFF); + ENABLE_ISRS(); // Enable interrupts + return data; + } + + // Soft SPI read data + void spiRead(uint8_t *buf, uint16_t nbyte) { + for (uint16_t i = 0; i < nbyte; i++) + buf[i] = spiRec(); + } + + // Soft SPI send byte + void spiSend(uint8_t data) { + DISABLE_ISRS(); // No interrupts during byte send + HAL_SPI_STM32_SpiTransfer_Mode_3(data); // Don't care what is received + ENABLE_ISRS(); // Enable interrupts + } + + // Soft SPI send block + void spiSendBlock(uint8_t token, const uint8_t *buf) { + spiSend(token); + for (uint16_t i = 0; i < 512; i++) + spiSend(buf[i]); + } + +#else + + // ------------------------ + // Hardware SPI + // ------------------------ + + /** + * VGPV SPI speed start and PCLK2/2, by default 108/2 = 54Mhz + */ + + /** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since stm32duino creates and initialize the SPI object + */ + void spiBegin() { + #if PIN_EXISTS(SS) + OUT_WRITE(SS_PIN, HIGH); + #endif + } + + // Configure SPI for specified SPI speed + void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 300000; break; + default: + clock = 4000000; // Default from the SPI library + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + + #if ENABLED(CUSTOM_SPI_PINS) + SPI.setMISO(MISO_PIN); + SPI.setMOSI(MOSI_PIN); + SPI.setSCLK(SCK_PIN); + SPI.setSSEL(SS_PIN); + #endif + + SPI.begin(); + } + + /** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ + uint8_t spiRec() { + uint8_t returnByte = SPI.transfer(0xFF); + 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 spiRead(uint8_t* buf, uint16_t nbyte) { + if (nbyte == 0) return; + memset(buf, 0xFF, nbyte); + SPI.transfer(buf, nbyte); + } + + /** + * @brief Send a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ + void spiSend(uint8_t b) { + SPI.transfer(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 spiSendBlock(uint8_t token, const uint8_t* buf) { + uint8_t rxBuf[512]; + SPI.transfer(token); + SPI.transfer((uint8_t*)buf, &rxBuf, 512); + } + +#endif // SOFTWARE_SPI + +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp new file mode 100644 index 00000000..a1466643 --- /dev/null +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -0,0 +1,86 @@ +/** + * 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 . + * + */ + +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" +#include "MarlinSerial.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +#ifndef USART4 + #define USART4 UART4 +#endif + +#ifndef USART5 + #define USART5 UART5 +#endif + +#define DECLARE_SERIAL_PORT(ser_num) \ + void _rx_complete_irq_ ## ser_num (serial_t * obj); \ + MarlinSerial MSerial ## ser_num (USART ## ser_num, &_rx_complete_irq_ ## ser_num); \ + void _rx_complete_irq_ ## ser_num (serial_t * obj) { MSerial ## ser_num ._rx_complete_irq(obj); } + +#define DECLARE_SERIAL_PORT_EXP(ser_num) DECLARE_SERIAL_PORT(ser_num) + +#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 + DECLARE_SERIAL_PORT_EXP(SERIAL_PORT) +#endif + +#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 + DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) +#endif + +#if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 + DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) +#endif + +void MarlinSerial::begin(unsigned long baud, uint8_t config) { + HardwareSerial::begin(baud, config); + // Replace the IRQ callback with the one we have defined + TERN_(EMERGENCY_PARSER, _serial.rx_callback = _rx_callback); +} + +// This function is Copyright (c) 2006 Nicholas Zambetti. +void MarlinSerial::_rx_complete_irq(serial_t *obj) { + // No Parity error, read byte and store it in the buffer if there is room + unsigned char c; + + if (uart_getc(obj, &c) == 0) { + + rx_buffer_index_t i = (unsigned int)(obj->rx_head + 1) % SERIAL_RX_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 != obj->rx_tail) { + obj->rx_buff[obj->rx_head] = c; + obj->rx_head = i; + } + + #if ENABLED(EMERGENCY_PARSER) + emergency_parser.update(emergency_state, c); + #endif + } +} + +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h new file mode 100644 index 00000000..3611cc78 --- /dev/null +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -0,0 +1,64 @@ +/** + * 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 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +typedef void (*usart_rx_callback_t)(serial_t * obj); + +class MarlinSerial : public HardwareSerial { +public: + MarlinSerial(void* peripheral, usart_rx_callback_t rx_callback) : + HardwareSerial(peripheral), _rx_callback(rx_callback) + #if ENABLED(EMERGENCY_PARSER) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + #if ENABLED(EMERGENCY_PARSER) + static inline bool emergency_parser_enabled() { return true; } + #endif + + void begin(unsigned long baud, uint8_t config); + inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } + + void _rx_complete_irq(serial_t* obj); + +protected: + usart_rx_callback_t _rx_callback; + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + #endif +}; + +extern MarlinSerial MSerial1; +extern MarlinSerial MSerial2; +extern MarlinSerial MSerial3; +extern MarlinSerial MSerial4; +extern MarlinSerial MSerial5; +extern MarlinSerial MSerial6; +extern MarlinSerial MSerial7; +extern MarlinSerial MSerial8; +extern MarlinSerial MSerial9; +extern MarlinSerial MSerial10; +extern MarlinSerial MSerialLP1; diff --git a/Marlin/src/HAL/STM32/README.md b/Marlin/src/HAL/STM32/README.md new file mode 100644 index 00000000..7680df66 --- /dev/null +++ b/Marlin/src/HAL/STM32/README.md @@ -0,0 +1,11 @@ +# Generic STM32 HAL based on the stm32duino core + +This HAL is intended to act as the generic STM32 HAL for all STM32 chips (The whole F, H and L family). + +Currently it supports: + * STM32F0xx + * STM32F1xx + * STM32F4xx + * STM32F7xx + +Targeting the official [Arduino STM32 Core](https://github.com/stm32duino/Arduino_Core_STM32). diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp new file mode 100644 index 00000000..6e73e87c --- /dev/null +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -0,0 +1,321 @@ +/** + * 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(SDIO_SUPPORT) && !defined(STM32GENERIC) + +#include +#include + +#if NONE(STM32F103xE, STM32F103xG, STM32F4xx, STM32F7xx) + #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" +#endif + +#ifdef USBD_USE_CDC_COMPOSITE + + // use USB drivers + + extern "C" { int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + extern SD_HandleTypeDef hsd; + } + + bool SDIO_Init() { + return hsd.State == HAL_SD_STATE_READY; // return pass/fail status + } + + bool SDIO_ReadBlock(uint32_t block, uint8_t *src) { + int8_t status = SD_MSC_Read(0, (uint8_t*)src, block, 1); // read one 512 byte block + return (bool) status; + } + + bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { + int8_t status = SD_MSC_Write(0, (uint8_t*)src, block, 1); // write one 512 byte block + return (bool) status; + } + +#else // !USBD_USE_CDC_COMPOSITE + + // use local drivers + #if defined(STM32F103xE) || defined(STM32F103xG) + #include + #include + #elif defined(STM32F4xx) + #include + #include + #include + #include + #elif defined(STM32F7xx) + #include + #include + #include + #include + #else + #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" + #endif + + SD_HandleTypeDef hsd; // create SDIO structure + + /* + 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 + #endif + + void go_to_transfer_speed() { + SD_InitTypeDef Init; + + /* Default SDIO peripheral configuration for SD card initialization */ + Init.ClockEdge = hsd.Init.ClockEdge; + Init.ClockBypass = hsd.Init.ClockBypass; + Init.ClockPowerSave = hsd.Init.ClockPowerSave; + Init.BusWide = hsd.Init.BusWide; + Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; + Init.ClockDiv = TRANSFER_CLOCK_DIV; + + /* Initialize SDIO peripheral interface with default configuration */ + SDIO_Init(hsd.Instance, Init); + } + + void SD_LowLevel_Init(void) { + uint32_t tempreg; + + __HAL_RCC_SDIO_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks + __HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks + + GPIO_InitTypeDef GPIO_InitStruct; + + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = 1; //GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + + #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 + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + #endif + + // Configure PD.02 CMD line + GPIO_InitStruct.Pin = GPIO_PIN_2; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + + #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 + tempreg |= SDIO_CLKCR_CLKEN; // Clock enabled + tempreg |= (uint32_t)0x76; // Clock Divider. Clock = 48000 / (118 + 2) = 400Khz + // Keep the rest at 0 => HW_Flow Disabled, Rising Clock Edge, Disable CLK ByPass, Bus Width = 0, Power save Disable + SDIO->CLKCR = tempreg; + + // Power up the SDIO + SDIO->POWER = 0x03; + } + + void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init + UNUSED(hsd); /* Prevent unused argument(s) compilation warning */ + __HAL_RCC_SDIO_CLK_ENABLE(); // turn on SDIO clock + } + + constexpr uint8_t SD_RETRY_COUNT = TERN(SD_CHECK_AND_RETRY, 3, 1); + + bool SDIO_Init() { + //init SDIO and get SD card info + + uint8_t retryCnt = SD_RETRY_COUNT; + + 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 + } + + go_to_transfer_speed(); + + #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; + } + if (!retry_Cnt) { // wide bus failed, go back to one bit wide mode + hsd.State = (HAL_SD_StateTypeDef) 0; // HAL_SD_STATE_RESET + 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 + } + } + #endif + + return true; + } + /* + void init_SDIO_pins(void) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + // 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; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + 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);} + + bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { + hsd.Instance = SDIO; + uint8_t retryCnt = SD_RETRY_COUNT; + + 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 + if (!--retryCnt) break; // return failing status if retries are exhausted + } + return status; + + /* + return (bool) ((status_read | status_card) ? 1 : 0); + + if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; + if (blockAddress >= SdCard.LogBlockNbr) return false; + if ((0x03 & (uint32_t)data)) return false; // misaligned data + + if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } + + if (!SDIO_CmdReadSingleBlock(blockAddress)) { + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return false; + } + + while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) {} + + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + + if (SDIO->STA & SDIO_STA_RXDAVL) { + while (SDIO->STA & SDIO_STA_RXDAVL) (void)SDIO->FIFO; + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return false; + } + + if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return false; + } + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + */ + + return true; + } + + 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 + status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK + if (!status) break; // return passing status + if (!--retryCnt) break; // return failing status if retries are exhausted + } + return status; + } + +#endif // !USBD_USE_CDC_COMPOSITE +#endif // SDIO_SUPPORT diff --git a/Marlin/src/HAL/STM32/Servo.cpp b/Marlin/src/HAL/STM32/Servo.cpp new file mode 100644 index 00000000..1cf117a0 --- /dev/null +++ b/Marlin/src/HAL/STM32/Servo.cpp @@ -0,0 +1,110 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +static uint_fast8_t servoCount = 0; +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), + value_before_pause(0) +{ + servos[servoCount++] = this; +} + +int8_t libServo::attach(const int pin) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servo_pin = 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; + auto result = stm32_servo.attach(servo_pin, min, max); + fixServoTimerInterruptPriority(); + return result; +} + +void libServo::move(const int value) { + if (attach(0) >= 0) { + stm32_servo.write(value); + safe_delay(delay); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +void libServo::pause() { + was_attached_before_pause = stm32_servo.attached(); + if (was_attached_before_pause) { + value_before_pause = stm32_servo.read(); + stm32_servo.detach(); + } +} + +void libServo::resume() { + if (was_attached_before_pause) { + attach(); + move(value_before_pause); + } +} + +void libServo::pause_all_servos() { + for (auto& servo : servos) + if (servo) servo->pause(); +} + +void libServo::resume_all_servos() { + for (auto& servo : 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 new file mode 100644 index 00000000..1527e753 --- /dev/null +++ b/Marlin/src/HAL/STM32/Servo.h @@ -0,0 +1,54 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 "../../core/millis_t.h" + +// Inherit and expand on the official library +class libServo { + public: + libServo(); + int8_t attach(const int pin = 0); // pin == 0 uses value from previous call + int8_t attach(const int pin, const int min, const int max); + void detach() { stm32_servo.detach(); } + int read() { return stm32_servo.read(); } + void move(const int value); + + void pause(); + void resume(); + + static void pause_all_servos(); + static void resume_all_servos(); + static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); + + private: + Servo stm32_servo; + + int servo_pin = 0; + millis_t delay = 0; + + bool was_attached_before_pause; + int value_before_pause; +}; diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp new file mode 100644 index 00000000..0933b9f4 --- /dev/null +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -0,0 +1,276 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" + +#if HAS_SERVOS + #include "Servo.h" + #define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() + #define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() +#else + #define PAUSE_SERVO_OUTPUT() + #define RESUME_SERVO_OUTPUT() +#endif + +/** + * The STM32 HAL supports chips that deal with "pages" and some with "sectors" and some that + * even have multiple "banks" of flash. + * + * This code is a bit of a mashup of + * framework-arduinoststm32/cores/arduino/stm32/stm32_eeprom.c + * hal/hal_lpc1768/persistent_store_flash.cpp + * + * This has only be written against those that use a single "sector" design. + * + * Those that deal with "pages" could be made to work. Looking at the STM32F07 for example, there are + * 128 "pages", each 2kB in size. If we continued with our EEPROM being 4Kb, we'd always need to operate + * on 2 of these pages. Each write, we'd use 2 different pages from a pool of pages until we are done. + */ + +#if ENABLED(FLASH_EEPROM_LEVELING) + + #include "stm32_def.h" + + #define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) + #include "src/core/debug_out.h" + + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #endif + + #ifndef FLASH_SECTOR + #define FLASH_SECTOR (FLASH_SECTOR_TOTAL - 1) + #endif + #ifndef FLASH_UNIT_SIZE + #define FLASH_UNIT_SIZE 0x20000 // 128kB + #endif + + #define FLASH_ADDRESS_START (FLASH_END - ((FLASH_SECTOR_TOTAL - (FLASH_SECTOR)) * (FLASH_UNIT_SIZE)) + 1) + #define FLASH_ADDRESS_END (FLASH_ADDRESS_START + FLASH_UNIT_SIZE - 1) + + #define EEPROM_SLOTS ((FLASH_UNIT_SIZE) / (MARLIN_EEPROM_SIZE)) + #define SLOT_ADDRESS(slot) (FLASH_ADDRESS_START + (slot * (MARLIN_EEPROM_SIZE))) + + #define UNLOCK_FLASH() if (!flash_unlocked) { \ + HAL_FLASH_Unlock(); \ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | \ + FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); \ + flash_unlocked = true; \ + } + #define LOCK_FLASH() if (flash_unlocked) { HAL_FLASH_Lock(); flash_unlocked = false; } + + #define EMPTY_UINT32 ((uint32_t)-1) + #define EMPTY_UINT8 ((uint8_t)-1) + + static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; + static int current_slot = -1; + + static_assert(0 == MARLIN_EEPROM_SIZE % 4, "MARLIN_EEPROM_SIZE must be a multiple of 4"); // Ensure copying as uint32_t is safe + static_assert(0 == FLASH_UNIT_SIZE % MARLIN_EEPROM_SIZE, "MARLIN_EEPROM_SIZE must divide evenly into your FLASH_UNIT_SIZE"); + static_assert(FLASH_UNIT_SIZE >= MARLIN_EEPROM_SIZE, "FLASH_UNIT_SIZE must be greater than or equal to your MARLIN_EEPROM_SIZE"); + static_assert(IS_FLASH_SECTOR(FLASH_SECTOR), "FLASH_SECTOR is invalid"); + static_assert(IS_POWER_OF_2(FLASH_UNIT_SIZE), "FLASH_UNIT_SIZE should be a power of 2, please check your chip's spec sheet"); + +#endif + +static bool eeprom_data_written = false; + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { + + #if ENABLED(FLASH_EEPROM_LEVELING) + + if (current_slot == -1 || eeprom_data_written) { + // This must be the first time since power on that we have accessed the storage, or someone + // loaded and called write_data and never called access_finish. + // Lets go looking for the slot that holds our configuration. + if (eeprom_data_written) DEBUG_ECHOLN("Dangling EEPROM write_data"); + uint32_t address = FLASH_ADDRESS_START; + while (address <= FLASH_ADDRESS_END) { + uint32_t address_value = (*(__IO uint32_t*)address); + if (address_value != EMPTY_UINT32) { + current_slot = (address - (FLASH_ADDRESS_START)) / (MARLIN_EEPROM_SIZE); + break; + } + address += sizeof(uint32_t); + } + if (current_slot == -1) { + // We didn't find anything, so we'll just intialize to empty + for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = EMPTY_UINT8; + current_slot = EEPROM_SLOTS; + } + else { + // load current settings + uint8_t *eeprom_data = (uint8_t *)SLOT_ADDRESS(current_slot); + for (int i = 0; i < MARLIN_EEPROM_SIZE; i++) ram_eeprom[i] = eeprom_data[i]; + DEBUG_ECHOLNPAIR("EEPROM loaded from slot ", current_slot, "."); + } + eeprom_data_written = false; + } + + #else + eeprom_buffer_fill(); + #endif + + return true; +} + +bool PersistentStore::access_finish() { + + if (eeprom_data_written) { + #ifdef STM32F4xx + // MCU may come up with flash error bits which prevent some flash operations. + // Clear flags prior to flash operations to prevent errors. + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + #endif + + #if ENABLED(FLASH_EEPROM_LEVELING) + + HAL_StatusTypeDef status = HAL_ERROR; + bool flash_unlocked = false; + + if (--current_slot < 0) { + // all slots have been used, erase everything and start again + + FLASH_EraseInitTypeDef EraseInitStruct; + uint32_t SectorError = 0; + + EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; + EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; + EraseInitStruct.Sector = FLASH_SECTOR; + EraseInitStruct.NbSectors = 1; + + current_slot = EEPROM_SLOTS - 1; + UNLOCK_FLASH(); + + PAUSE_SERVO_OUTPUT(); + DISABLE_ISRS(); + status = HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); + ENABLE_ISRS(); + RESUME_SERVO_OUTPUT(); + if (status != HAL_OK) { + DEBUG_ECHOLNPAIR("HAL_FLASHEx_Erase=", status); + DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError()); + DEBUG_ECHOLNPAIR("SectorError=", SectorError); + LOCK_FLASH(); + return false; + } + } + + UNLOCK_FLASH(); + + uint32_t offset = 0; + uint32_t address = SLOT_ADDRESS(current_slot); + uint32_t address_end = address + MARLIN_EEPROM_SIZE; + uint32_t data = 0; + + bool success = true; + + while (address < address_end) { + memcpy(&data, ram_eeprom + offset, sizeof(uint32_t)); + status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data); + if (status == HAL_OK) { + address += sizeof(uint32_t); + offset += sizeof(uint32_t); + } + else { + DEBUG_ECHOLNPAIR("HAL_FLASH_Program=", status); + DEBUG_ECHOLNPAIR("GetError=", HAL_FLASH_GetError()); + DEBUG_ECHOLNPAIR("address=", address); + success = false; + break; + } + } + + LOCK_FLASH(); + + if (success) { + eeprom_data_written = false; + DEBUG_ECHOLNPAIR("EEPROM saved to slot ", current_slot, "."); + } + + return success; + + #else + // The following was written for the STM32F4 but may work with other MCUs as well. + // Most STM32F4 flash does not allow reading from flash during erase operations. + // This takes about a second on a STM32F407 with a 128kB sector used as EEPROM. + // Interrupts during this time can have unpredictable results, such as killing Servo + // output. Servo output still glitches with interrupts disabled, but recovers after the + // erase. + PAUSE_SERVO_OUTPUT(); + DISABLE_ISRS(); + eeprom_buffer_flush(); + ENABLE_ISRS(); + RESUME_SERVO_OUTPUT(); + + eeprom_data_written = false; + #endif + } + + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t v = *value; + #if ENABLED(FLASH_EEPROM_LEVELING) + if (v != ram_eeprom[pos]) { + ram_eeprom[pos] = v; + eeprom_data_written = true; + } + #else + if (v != eeprom_buffered_read_byte(pos)) { + eeprom_buffered_write_byte(pos, v); + eeprom_data_written = true; + } + #endif + 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 { + const uint8_t c = TERN(FLASH_EEPROM_LEVELING, ram_eeprom[pos], eeprom_buffered_read_byte(pos)); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // FLASH_EEPROM_EMULATION +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32/eeprom_sdcard.cpp new file mode 100644 index 00000000..711a83ed --- /dev/null +++ b/Marlin/src/HAL/STM32/eeprom_sdcard.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 . + * + */ + +/** + * Implementation of EEPROM settings in SD Card + */ + +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SDCARD_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" +#include "../../sd/cardreader.h" + +#define EEPROM_FILENAME "eeprom.dat" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +#define _ALIGN(x) __attribute__ ((aligned(x))) +static char _ALIGN(4) HAL_eeprom_data[MARLIN_EEPROM_SIZE]; + +bool PersistentStore::access_start() { + if (!card.isMounted()) return false; + + SdFile file, root = card.getroot(); + if (!file.open(&root, EEPROM_FILENAME, O_RDONLY)) + return true; + + int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE); + if (bytes_read < 0) return false; + for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++) + HAL_eeprom_data[bytes_read] = 0xFF; + file.close(); + return true; +} + +bool PersistentStore::access_finish() { + if (!card.isMounted()) return false; + + SdFile file, root = card.getroot(); + int bytes_written = 0; + if (file.open(&root, EEPROM_FILENAME, O_CREAT | O_WRITE | O_TRUNC)) { + bytes_written = file.write(HAL_eeprom_data, MARLIN_EEPROM_SIZE); + file.close(); + } + return (bytes_written == MARLIN_EEPROM_SIZE); +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + for (size_t i = 0; i < size; i++) + HAL_eeprom_data[pos + i] = value[i]; + crc16(crc, value, size); + pos += size; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + for (size_t i = 0; i < size; i++) { + uint8_t c = HAL_eeprom_data[pos + i]; + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + pos += size; + return false; +} + +#endif // SDCARD_EEPROM_EMULATION +#endif // STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_sram.cpp b/Marlin/src/HAL/STM32/eeprom_sram.cpp new file mode 100644 index 00000000..5f6f26f9 --- /dev/null +++ b/Marlin/src/HAL/STM32/eeprom_sram.cpp @@ -0,0 +1,68 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SRAM_EEPROM_EMULATION) + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { 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; + + // Save to Backup SRAM + *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v; + + 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 { + // Read from either external EEPROM, program flash or Backup SRAM + const uint8_t c = ( *(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)) ); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // SRAM_EEPROM_EMULATION +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp new file mode 100644 index 00000000..8c46e45f --- /dev/null +++ b/Marlin/src/HAL/STM32/eeprom_wired.cpp @@ -0,0 +1,81 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#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; + + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + uint8_t * const p = (uint8_t * const)pos; + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + 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 { + // Read from either external EEPROM, program flash or Backup SRAM + const uint8_t c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/endstop_interrupts.h b/Marlin/src/HAL/STM32/endstop_interrupts.h new file mode 100644 index 00000000..fdff8cc6 --- /dev/null +++ b/Marlin/src/HAL/STM32/endstop_interrupts.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 + * Copyright (c) 2017 Victor Perez + * + * 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 "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/STM32/fastio.cpp b/Marlin/src/HAL/STM32/fastio.cpp new file mode 100644 index 00000000..0d55579d --- /dev/null +++ b/Marlin/src/HAL/STM32/fastio.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 + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +GPIO_TypeDef* FastIOPortMap[LastPort + 1]; + +void FastIO_init() { + LOOP_L_N(i, NUM_DIGITAL_PINS) + FastIOPortMap[STM_PORT(digitalPin[i])] = get_GPIO_Port(STM_PORT(digitalPin[i])); +} + +#endif diff --git a/Marlin/src/HAL/STM32/fastio.h b/Marlin/src/HAL/STM32/fastio.h new file mode 100644 index 00000000..ea28b8f3 --- /dev/null +++ b/Marlin/src/HAL/STM32/fastio.h @@ -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 + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * Fast I/O interfaces for STM32 + * These use GPIO register access for fast port manipulation. + */ + +// ------------------------ +// Public Variables +// ------------------------ + +extern GPIO_TypeDef * FastIOPortMap[]; + +// ------------------------ +// Public functions +// ------------------------ + +void FastIO_init(); // Must be called before using fast io macros + +// ------------------------ +// Defines +// ------------------------ + +#define _BV32(b) (1UL << (b)) + +#ifndef PWM + #define PWM OUTPUT +#endif + +#if defined(STM32F0xx) || defined(STM32F1xx) || defined(STM32F3xx) || defined(STM32L0xx) || defined(STM32L4xx) + #define _WRITE(IO, V) do { \ + if (V) FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \ + else FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BRR = _BV32(STM_PIN(digitalPinToPinName(IO))) ; \ + }while(0) +#else + #define _WRITE(IO, V) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->BSRR = _BV32(STM_PIN(digitalPinToPinName(IO)) + ((V) ? 0 : 16))) +#endif + +#define _READ(IO) bool(READ_BIT(FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->IDR, _BV32(STM_PIN(digitalPinToPinName(IO))))) +#define _TOGGLE(IO) (FastIOPortMap[STM_PORT(digitalPinToPinName(IO))]->ODR ^= _BV32(STM_PIN(digitalPinToPinName(IO)))) + +#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 +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) //!< Input with Pull-down activation +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) +#define SET_PWM(IO) _SET_MODE(IO, PWM) + +#define IS_INPUT(IO) +#define IS_OUTPUT(IO) + +#define PWM_PIN(P) digitalPinHasPWM(P) +#define NO_COMPILE_TIME_PWM + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/STM32/inc/Conditionals_LCD.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_post.h b/Marlin/src/HAL/STM32/inc/Conditionals_post.h new file mode 100644 index 00000000..18826e11 --- /dev/null +++ b/Marlin/src/HAL/STM32/inc/Conditionals_post.h @@ -0,0 +1,29 @@ +/** + * 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 + +// If no real or emulated EEPROM selected, fall back to SD emulation +#if USE_FALLBACK_EEPROM + #define SDCARD_EEPROM_EMULATION +#elif EITHER(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h new file mode 100644 index 00000000..30d0750d --- /dev/null +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -0,0 +1,56 @@ +/** + * 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 + +/** + * Test STM32-specific configuration values for errors at compile-time. + */ +//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) +// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" +//#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 STM32." +#endif + +#if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) + #undef SDCARD_EEPROM_EMULATION // Avoid additional error noise + #if USE_FALLBACK_EEPROM + #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." + #endif + #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." +#endif + +#if defined(STM32F4xx) && BOTH(PRINTCOUNTER, FLASH_EEPROM_EMULATION) + #warning "FLASH_EEPROM_EMULATION may cause long delays when writing and should not be used while printing." + #error "Disable PRINTCOUNTER or choose another EEPROM emulation." +#endif + +#if !defined(STM32F4xx) && ENABLED(FLASH_EEPROM_LEVELING) + #error "FLASH_EEPROM_LEVELING is currently only supported on STM32F4 hardware." +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." +#elif ENABLED(SERIAL_STATS_DROPPED_RX) + #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h new file mode 100644 index 00000000..ec08e3fd --- /dev/null +++ b/Marlin/src/HAL/STM32/pinsDebug.h @@ -0,0 +1,34 @@ +/** + * 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(NUM_DIGITAL_PINS) || defined(BOARD_NR_GPIO_PINS)) + #error "M43 not supported for this board" +#endif + +// Strange - STM32F4 comes to HAL_STM32 rather than HAL_STM32F4 for these files +#ifdef STM32F4 + #ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) + #include "pinsDebug_STM32duino.h" + #elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) + #include "pinsDebug_STM32GENERIC.h" + #else + #error "M43 not supported for this board" + #endif +#endif diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h new file mode 100644 index 00000000..9069d9f7 --- /dev/null +++ b/Marlin/src/HAL/STM32/pinsDebug_STM32GENERIC.h @@ -0,0 +1,125 @@ +/** + * 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 + +/** + * Support routines for STM32GENERIC (Maple) + */ + +/** + * Translation of routines & variables used by pinsDebug.h + */ + +#ifdef BOARD_NR_GPIO_PINS // Only in STM32GENERIC (Maple) + +#ifdef __STM32F1__ + #include "../STM32F1/fastio.h" +#elif defined(STM32F4) || defined(STM32F7) + #include "../STM32_F4_F7/fastio.h" +#else + #include "fastio.h" +#endif + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]; + +#define NUM_DIGITAL_PINS BOARD_NR_GPIO_PINS +#define NUMBER_PINS_TOTAL BOARD_NR_GPIO_PINS +#define VALID_PIN(pin) (pin >= 0 && pin < BOARD_NR_GPIO_PINS) +#define GET_ARRAY_PIN(p) pin_t(pin_array[p].pin) +#define pwm_status(pin) PWM_PIN(pin) +#define digitalRead_mod(p) extDigitalRead(p) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3hd "), int16_t(p)); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PORT(p) print_port(p) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 21 // space needed to be pretty if not first name assigned to a pin + +// pins that will cause hang/reset/disconnect in M43 Toggle and Watch utilities +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(Q) (Q >= 9 && Q <= 12) // SERIAL/USB pins PA9(TX) PA10(RX) +#endif + +static inline int8_t get_pin_mode(pin_t pin) { + return VALID_PIN(pin) ? _GET_MODE(pin) : -1; +} + +static inline pin_t DIGITAL_PIN_TO_ANALOG_PIN(pin_t pin) { + if (!VALID_PIN(pin)) return -1; + int8_t adc_channel = int8_t(PIN_MAP[pin].adc_channel); + #ifdef NUM_ANALOG_INPUTS + if (adc_channel >= NUM_ANALOG_INPUTS) adc_channel = ADCx; + #endif + return pin_t(adc_channel); +} + +static inline bool IS_ANALOG(pin_t pin) { + if (!VALID_PIN(pin)) return false; + if (PIN_MAP[pin].adc_channel != ADCx) { + #ifdef NUM_ANALOG_INPUTS + if (PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS) return false; + #endif + return _GET_MODE(pin) == GPIO_INPUT_ANALOG && !M43_NEVER_TOUCH(pin); + } + return false; +} + +static inline bool GET_PINMODE(const pin_t pin) { + return VALID_PIN(pin) && !IS_INPUT(pin); +} + +static inline bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { + const pin_t pin = GET_ARRAY_PIN(array_pin); + return (!IS_ANALOG(pin) + #ifdef NUM_ANALOG_INPUTS + || PIN_MAP[pin].adc_channel >= NUM_ANALOG_INPUTS + #endif + ); +} + +#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density + +static inline void pwm_details(const pin_t pin) { + if (PWM_PIN(pin)) { + timer_dev * const tdev = PIN_MAP[pin].timer_device; + const uint8_t channel = PIN_MAP[pin].timer_channel; + const char num = ( + #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + tdev == &timer8 ? '8' : + tdev == &timer5 ? '5' : + #endif + tdev == &timer4 ? '4' : + tdev == &timer3 ? '3' : + tdev == &timer2 ? '2' : + tdev == &timer1 ? '1' : '?' + ); + char buffer[10]; + sprintf_P(buffer, PSTR(" TIM%c CH%c"), num, ('0' + channel)); + SERIAL_ECHO(buffer); + } +} + +static inline void print_port(pin_t pin) { + const char port = 'A' + char(pin >> 4); // pin div 16 + const int16_t gbit = PIN_MAP[pin].gpio_bit; + char buffer[8]; + sprintf_P(buffer, PSTR("P%c%hd "), port, gbit); + if (gbit < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(buffer); +} + +#endif // BOARD_NR_GPIO_PINS diff --git a/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h new file mode 100644 index 00000000..71480153 --- /dev/null +++ b/Marlin/src/HAL/STM32/pinsDebug_STM32duino.h @@ -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 . + * + */ +#pragma once + +#include + +#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) + +/** + * Life gets complicated if you want an easy to use 'M43 I' output (in port/pin order) + * because the variants in this platform do not always define all the I/O port/pins + * that a CPU has. + * + * VARIABLES: + * Ard_num - Arduino pin number - defined by the platform. It is used by digitalRead and + * digitalWrite commands and by M42. + * - does not contain port/pin info + * - is not in port/pin order + * - typically a variant will only assign Ard_num to port/pins that are actually used + * Index - M43 counter - only used to get Ard_num + * x - a parameter/argument used to search the pin_array to try to find a signal name + * associated with a Ard_num + * Port_pin - port number and pin number for use with CPU registers and printing reports + * + * Since M43 uses digitalRead and digitalWrite commands, only the Port_pins with an Ard_num + * are accessed and/or displayed. + * + * Three arrays are used. + * + * digitalPin[] is provided by the platform. It consists of the Port_pin numbers in + * Arduino pin number order. + * + * pin_array is a structure generated by the pins/pinsDebug.h header file. It is generated by + * the preprocessor. Only the signals associated with enabled options are in this table. + * It contains: + * - name of the signal + * - the Ard_num assigned by the pins_YOUR_BOARD.h file using the platform defines. + * EXAMPLE: "#define KILL_PIN PB1" results in Ard_num of 57. 57 is then used as the + * argument to digitalPinToPinName(IO) to get the Port_pin number + * - if it is a digital or analog signal. PWMs are considered digital here. + * + * pin_xref is a structure generated by this header file. It is generated by the + * preprocessor. It is in port/pin order. It contains just the port/pin numbers defined by the + * platform for this variant. + * - Ard_num + * - printable version of Port_pin + * + * Routines with an "x" as a parameter/argument are used to search the pin_array to try to + * find a signal name associated with a port/pin. + * + * NOTE - the Arduino pin number is what is used by the M42 command, NOT the port/pin for that + * signal. The Arduino pin number is listed by the M43 I command. + */ + +//////////////////////////////////////////////////////// +// +// make a list of the Arduino pin numbers in the Port/Pin order +// + +#define _PIN_ADD_2(NAME_ALPHA, ARDUINO_NUM) { {NAME_ALPHA}, ARDUINO_NUM }, +#define _PIN_ADD(NAME_ALPHA, ARDUINO_NUM) { NAME_ALPHA, ARDUINO_NUM }, +#define PIN_ADD(NAME) _PIN_ADD(#NAME, NAME) + +typedef struct { + char Port_pin_alpha[5]; + pin_t Ard_num; +} XrefInfo; + +const XrefInfo pin_xref[] PROGMEM = { + #include "pins_Xref.h" +}; + +//////////////////////////////////////////////////////////// + +#define MODE_PIN_INPUT 0 // Input mode (reset state) +#define MODE_PIN_OUTPUT 1 // General purpose output mode +#define MODE_PIN_ALT 2 // Alternate function mode +#define MODE_PIN_ANALOG 3 // Analog mode + +#define PIN_NUM(P) (P & 0x000F) +#define PIN_NUM_ALPHA_LEFT(P) (((P & 0x000F) < 10) ? ('0' + (P & 0x000F)) : '1') +#define PIN_NUM_ALPHA_RIGHT(P) (((P & 0x000F) > 9) ? ('0' + (P & 0x000F) - 10) : 0 ) +#define PORT_NUM(P) ((P >> 4) & 0x0007) +#define PORT_ALPHA(P) ('A' + (P >> 4)) + +/** + * Translation of routines & variables used by pinsDebug.h + */ +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define VALID_PIN(ANUM) ((ANUM) >= 0 && (ANUM) < NUMBER_PINS_TOTAL) +#define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads +#define PRINT_PIN(Q) +#define PRINT_PORT(ANUM) port_print(ANUM) +#define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine +#define GET_PIN_MAP_PIN_M43(Index) pin_xref[Index].Ard_num + +// x is a variable used to search pin_array +#define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) +#define GET_ARRAY_PIN(x) ((pin_t) pin_array[x].pin) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define MULTI_NAME_PAD 33 // space needed to be pretty if not first name assigned to a pin + +#ifndef M43_NEVER_TOUCH + #define _M43_NEVER_TOUCH(Index) (Index >= 9 && Index <= 12) // SERIAL/USB pins: PA9(TX) PA10(RX) PA11(USB_DM) PA12(USB_DP) + #ifdef KILL_PIN + #define M43_NEVER_TOUCH(Index) m43_never_touch(Index) + + bool m43_never_touch(const pin_t Index) { + static pin_t M43_kill_index = -1; + if (M43_kill_index < 0) + for (M43_kill_index = 0; M43_kill_index < NUMBER_PINS_TOTAL; M43_kill_index++) + if (KILL_PIN == GET_PIN_MAP_PIN_M43(M43_kill_index)) break; + return _M43_NEVER_TOUCH(Index) || Index == M43_kill_index; // KILL_PIN and SERIAL/USB + } + #else + #define M43_NEVER_TOUCH(Index) _M43_NEVER_TOUCH(Index) + #endif +#endif + +uint8_t get_pin_mode(const pin_t Ard_num) { + uint32_t mode_all = 0; + const PinName dp = digitalPinToPinName(Ard_num); + switch (PORT_ALPHA(dp)) { + case 'A' : mode_all = GPIOA->MODER; break; + case 'B' : mode_all = GPIOB->MODER; break; + case 'C' : mode_all = GPIOC->MODER; break; + case 'D' : mode_all = GPIOD->MODER; break; + #ifdef PE_0 + case 'E' : mode_all = GPIOE->MODER; break; + #elif defined(PF_0) + case 'F' : mode_all = GPIOF->MODER; break; + #elif defined(PG_0) + case 'G' : mode_all = GPIOG->MODER; break; + #elif defined(PH_0) + case 'H' : mode_all = GPIOH->MODER; break; + #elif defined(PI_0) + case 'I' : mode_all = GPIOI->MODER; break; + #elif defined(PJ_0) + case 'J' : mode_all = GPIOJ->MODER; break; + #elif defined(PK_0) + case 'K' : mode_all = GPIOK->MODER; break; + #elif defined(PL_0) + case 'L' : mode_all = GPIOL->MODER; break; + #endif + } + return (mode_all >> (2 * uint8_t(PIN_NUM(dp)))) & 0x03; +} + +bool GET_PINMODE(const pin_t Ard_num) { + const uint8_t pin_mode = get_pin_mode(Ard_num); + return pin_mode == MODE_PIN_OUTPUT || pin_mode == MODE_PIN_ALT; // assume all alt definitions are PWM +} + +int8_t digital_pin_to_analog_pin(pin_t Ard_num) { + Ard_num -= NUM_ANALOG_FIRST; + return (Ard_num >= 0 && Ard_num < NUM_ANALOG_INPUTS) ? Ard_num : -1; +} + +bool IS_ANALOG(const pin_t Ard_num) { + return get_pin_mode(Ard_num) == MODE_PIN_ANALOG; +} + +bool is_digital(const pin_t x) { + const uint8_t pin_mode = get_pin_mode(pin_array[x].pin); + return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT; +} + +void port_print(const pin_t Ard_num) { + char buffer[16]; + pin_t Index; + for (Index = 0; Index < NUMBER_PINS_TOTAL; Index++) + if (Ard_num == GET_PIN_MAP_PIN_M43(Index)) break; + + const char * ppa = pin_xref[Index].Port_pin_alpha; + sprintf_P(buffer, PSTR("%s"), ppa); + SERIAL_ECHO(buffer); + if (ppa[3] == '\0') SERIAL_CHAR(' '); + + // print analog pin number + const int8_t Port_pin = digital_pin_to_analog_pin(Ard_num); + if (Port_pin >= 0) { + sprintf_P(buffer, PSTR(" (A%d) "), Port_pin); + SERIAL_ECHO(buffer); + if (Port_pin < 10) SERIAL_CHAR(' '); + } + else + SERIAL_ECHO_SP(7); + + // Print number to be used with M42 + sprintf_P(buffer, PSTR(" M42 P%d "), Ard_num); + SERIAL_ECHO(buffer); + if (Ard_num < 10) SERIAL_CHAR(' '); + if (Ard_num < 100) SERIAL_CHAR(' '); +} + +bool pwm_status(const pin_t Ard_num) { + return get_pin_mode(Ard_num) == MODE_PIN_ALT; +} + +void pwm_details(const pin_t Ard_num) { + if (pwm_status(Ard_num)) { + uint32_t alt_all = 0; + const PinName dp = digitalPinToPinName(Ard_num); + pin_t pin_number = uint8_t(PIN_NUM(dp)); + const bool over_7 = pin_number >= 8; + const uint8_t ind = over_7 ? 1 : 0; + switch (PORT_ALPHA(dp)) { // get alt function + case 'A' : alt_all = GPIOA->AFR[ind]; break; + case 'B' : alt_all = GPIOB->AFR[ind]; break; + case 'C' : alt_all = GPIOC->AFR[ind]; break; + case 'D' : alt_all = GPIOD->AFR[ind]; break; + #ifdef PE_0 + case 'E' : alt_all = GPIOE->AFR[ind]; break; + #elif defined (PF_0) + case 'F' : alt_all = GPIOF->AFR[ind]; break; + #elif defined (PG_0) + case 'G' : alt_all = GPIOG->AFR[ind]; break; + #elif defined (PH_0) + case 'H' : alt_all = GPIOH->AFR[ind]; break; + #elif defined (PI_0) + case 'I' : alt_all = GPIOI->AFR[ind]; break; + #elif defined (PJ_0) + case 'J' : alt_all = GPIOJ->AFR[ind]; break; + #elif defined (PK_0) + case 'K' : alt_all = GPIOK->AFR[ind]; break; + #elif defined (PL_0) + case 'L' : alt_all = GPIOL->AFR[ind]; break; + #endif + } + if (over_7) pin_number -= 8; + + uint8_t alt_func = (alt_all >> (4 * pin_number)) & 0x0F; + SERIAL_ECHOPAIR("Alt Function: ", alt_func); + if (alt_func < 10) SERIAL_CHAR(' '); + SERIAL_ECHOPGM(" - "); + switch (alt_func) { + case 0 : SERIAL_ECHOPGM("system (misc. I/O)"); break; + case 1 : SERIAL_ECHOPGM("TIM1/TIM2 (probably PWM)"); break; + case 2 : SERIAL_ECHOPGM("TIM3..5 (probably PWM)"); break; + case 3 : SERIAL_ECHOPGM("TIM8..11 (probably PWM)"); break; + case 4 : SERIAL_ECHOPGM("I2C1..3"); break; + case 5 : SERIAL_ECHOPGM("SPI1/SPI2"); break; + case 6 : SERIAL_ECHOPGM("SPI3"); break; + case 7 : SERIAL_ECHOPGM("USART1..3"); break; + case 8 : SERIAL_ECHOPGM("USART4..6"); break; + case 9 : SERIAL_ECHOPGM("CAN1/CAN2, TIM12..14 (probably PWM)"); break; + case 10 : SERIAL_ECHOPGM("OTG"); break; + case 11 : SERIAL_ECHOPGM("ETH"); break; + case 12 : SERIAL_ECHOPGM("FSMC, SDIO, OTG"); break; + case 13 : SERIAL_ECHOPGM("DCMI"); break; + case 14 : SERIAL_ECHOPGM("unused (shouldn't see this)"); break; + case 15 : SERIAL_ECHOPGM("EVENTOUT"); break; + } + } +} // pwm_details + +#endif // NUM_DIGITAL_PINS diff --git a/Marlin/src/HAL/STM32/pins_Xref.h b/Marlin/src/HAL/STM32/pins_Xref.h new file mode 100644 index 00000000..890e5618 --- /dev/null +++ b/Marlin/src/HAL/STM32/pins_Xref.h @@ -0,0 +1,612 @@ +/** + * 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 . + * + */ + +// +// make a list of the Arduino pin numbers in the Port/Pin order +// +#ifdef PA0 + PIN_ADD(PA0) +#endif +#ifdef PA1 + PIN_ADD(PA1) +#endif +#ifdef PA2 + PIN_ADD(PA2) +#endif +#ifdef PA3 + PIN_ADD(PA3) +#endif +#ifdef PA4 + PIN_ADD(PA4) +#endif +#ifdef PA5 + PIN_ADD(PA5) +#endif +#ifdef PA6 + PIN_ADD(PA6) +#endif +#ifdef PA7 + PIN_ADD(PA7) +#endif +#ifdef PA8 + PIN_ADD(PA8) +#endif +#ifdef PA9 + PIN_ADD(PA9) +#endif +#ifdef PA10 + PIN_ADD(PA10) +#endif +#ifdef PA11 + PIN_ADD(PA11) +#endif +#ifdef PA12 + PIN_ADD(PA12) +#endif +#ifdef PA13 + PIN_ADD(PA13) +#endif +#ifdef PA14 + PIN_ADD(PA14) +#endif +#ifdef PA15 + PIN_ADD(PA15) +#endif + +#ifdef PB0 + PIN_ADD(PB0) +#endif +#ifdef PB1 + PIN_ADD(PB1) +#endif +#ifdef PB2 + PIN_ADD(PB2) +#endif +#ifdef PB3 + PIN_ADD(PB3) +#endif +#ifdef PB4 + PIN_ADD(PB4) +#endif +#ifdef PB5 + PIN_ADD(PB5) +#endif +#ifdef PB6 + PIN_ADD(PB6) +#endif +#ifdef PB7 + PIN_ADD(PB7) +#endif +#ifdef PB8 + PIN_ADD(PB8) +#endif +#ifdef PB9 + PIN_ADD(PB9) +#endif +#ifdef PB10 + PIN_ADD(PB10) +#endif +#ifdef PB11 + PIN_ADD(PB11) +#endif +#ifdef PB12 + PIN_ADD(PB12) +#endif +#ifdef PB13 + PIN_ADD(PB13) +#endif +#ifdef PB14 + PIN_ADD(PB14) +#endif +#ifdef PB15 + PIN_ADD(PB15) +#endif + +#ifdef PC0 + PIN_ADD(PC0) +#endif +#ifdef PC1 + PIN_ADD(PC1) +#endif +#ifdef PC2 + PIN_ADD(PC2) +#endif +#ifdef PC3 + PIN_ADD(PC3) +#endif +#ifdef PC4 + PIN_ADD(PC4) +#endif +#ifdef PC5 + PIN_ADD(PC5) +#endif +#ifdef PC6 + PIN_ADD(PC6) +#endif +#ifdef PC7 + PIN_ADD(PC7) +#endif +#ifdef PC8 + PIN_ADD(PC8) +#endif +#ifdef PC9 + PIN_ADD(PC9) +#endif +#ifdef PC10 + PIN_ADD(PC10) +#endif +#ifdef PC11 + PIN_ADD(PC11) +#endif +#ifdef PC12 + PIN_ADD(PC12) +#endif +#ifdef PC13 + PIN_ADD(PC13) +#endif +#ifdef PC14 + PIN_ADD(PC14) +#endif +#ifdef PC15 + PIN_ADD(PC15) +#endif + +#ifdef PD0 + PIN_ADD(PD0) +#endif +#ifdef PD1 + PIN_ADD(PD1) +#endif +#ifdef PD2 + PIN_ADD(PD2) +#endif +#ifdef PD3 + PIN_ADD(PD3) +#endif +#ifdef PD4 + PIN_ADD(PD4) +#endif +#ifdef PD5 + PIN_ADD(PD5) +#endif +#ifdef PD6 + PIN_ADD(PD6) +#endif +#ifdef PD7 + PIN_ADD(PD7) +#endif +#ifdef PD8 + PIN_ADD(PD8) +#endif +#ifdef PD9 + PIN_ADD(PD9) +#endif +#ifdef PD10 + PIN_ADD(PD10) +#endif +#ifdef PD11 + PIN_ADD(PD11) +#endif +#ifdef PD12 + PIN_ADD(PD12) +#endif +#ifdef PD13 + PIN_ADD(PD13) +#endif +#ifdef PD14 + PIN_ADD(PD14) +#endif +#ifdef PD15 + PIN_ADD(PD15) +#endif + +#ifdef PE0 + PIN_ADD(PE0) +#endif +#ifdef PE1 + PIN_ADD(PE1) +#endif +#ifdef PE2 + PIN_ADD(PE2) +#endif +#ifdef PE3 + PIN_ADD(PE3) +#endif +#ifdef PE4 + PIN_ADD(PE4) +#endif +#ifdef PE5 + PIN_ADD(PE5) +#endif +#ifdef PE6 + PIN_ADD(PE6) +#endif +#ifdef PE7 + PIN_ADD(PE7) +#endif +#ifdef PE8 + PIN_ADD(PE8) +#endif +#ifdef PE9 + PIN_ADD(PE9) +#endif +#ifdef PE10 + PIN_ADD(PE10) +#endif +#ifdef PE11 + PIN_ADD(PE11) +#endif +#ifdef PE12 + PIN_ADD(PE12) +#endif +#ifdef PE13 + PIN_ADD(PE13) +#endif +#ifdef PE14 + PIN_ADD(PE14) +#endif +#ifdef PE15 + PIN_ADD(PE15) +#endif + +#ifdef PF0 + PIN_ADD(PF0) +#endif +#ifdef PF1 + PIN_ADD(PF1) +#endif +#ifdef PF2 + PIN_ADD(PF2) +#endif +#ifdef PF3 + PIN_ADD(PF3) +#endif +#ifdef PF4 + PIN_ADD(PF4) +#endif +#ifdef PF5 + PIN_ADD(PF5) +#endif +#ifdef PF6 + PIN_ADD(PF6) +#endif +#ifdef PF7 + PIN_ADD(PF7) +#endif +#ifdef PF8 + PIN_ADD(PF8) +#endif +#ifdef PF9 + PIN_ADD(PF9) +#endif +#ifdef PF10 + PIN_ADD(PF10) +#endif +#ifdef PF11 + PIN_ADD(PF11) +#endif +#ifdef PF12 + PIN_ADD(PF12) +#endif +#ifdef PF13 + PIN_ADD(PF13) +#endif +#ifdef PF14 + PIN_ADD(PF14) +#endif +#ifdef PF15 + PIN_ADD(PF15) +#endif + +#ifdef PG0 + PIN_ADD(PG0) +#endif +#ifdef PG1 + PIN_ADD(PG1) +#endif +#ifdef PG2 + PIN_ADD(PG2) +#endif +#ifdef PG3 + PIN_ADD(PG3) +#endif +#ifdef PG4 + PIN_ADD(PG4) +#endif +#ifdef PG5 + PIN_ADD(PG5) +#endif +#ifdef PG6 + PIN_ADD(PG6) +#endif +#ifdef PG7 + PIN_ADD(PG7) +#endif +#ifdef PG8 + PIN_ADD(PG8) +#endif +#ifdef PG9 + PIN_ADD(PG9) +#endif +#ifdef PG10 + PIN_ADD(PG10) +#endif +#ifdef PG11 + PIN_ADD(PG11) +#endif +#ifdef PG12 + PIN_ADD(PG12) +#endif +#ifdef PG13 + PIN_ADD(PG13) +#endif +#ifdef PG14 + PIN_ADD(PG14) +#endif +#ifdef PG15 + PIN_ADD(PG15) +#endif + +#ifdef PH0 + PIN_ADD(PH0) +#endif +#ifdef PH1 + PIN_ADD(PH1) +#endif +#ifdef PH2 + PIN_ADD(PH2) +#endif +#ifdef PH3 + PIN_ADD(PH3) +#endif +#ifdef PH4 + PIN_ADD(PH4) +#endif +#ifdef PH5 + PIN_ADD(PH5) +#endif +#ifdef PH6 + PIN_ADD(PH6) +#endif +#ifdef PH7 + PIN_ADD(PH7) +#endif +#ifdef PH8 + PIN_ADD(PH8) +#endif +#ifdef PH9 + PIN_ADD(PH9) +#endif +#ifdef PH10 + PIN_ADD(PH10) +#endif +#ifdef PH11 + PIN_ADD(PH11) +#endif +#ifdef PH12 + PIN_ADD(PH12) +#endif +#ifdef PH13 + PIN_ADD(PH13) +#endif +#ifdef PH14 + PIN_ADD(PH14) +#endif +#ifdef PH15 + PIN_ADD(PH15) +#endif + +#ifdef PI0 + PIN_ADD(PI0) +#endif +#ifdef PI1 + PIN_ADD(PI1) +#endif +#ifdef PI2 + PIN_ADD(PI2) +#endif +#ifdef PI3 + PIN_ADD(PI3) +#endif +#ifdef PI4 + PIN_ADD(PI4) +#endif +#ifdef PI5 + PIN_ADD(PI5) +#endif +#ifdef PI6 + PIN_ADD(PI6) +#endif +#ifdef PI7 + PIN_ADD(PI7) +#endif +#ifdef PI8 + PIN_ADD(PI8) +#endif +#ifdef PI9 + PIN_ADD(PI9) +#endif +#ifdef PI10 + PIN_ADD(PI10) +#endif +#ifdef PI11 + PIN_ADD(PI11) +#endif +#ifdef PI12 + PIN_ADD(PI12) +#endif +#ifdef PI13 + PIN_ADD(PI13) +#endif +#ifdef PI14 + PIN_ADD(PI14) +#endif +#ifdef PI15 + PIN_ADD(PI15) +#endif + +#ifdef PJ0 + PIN_ADD(PJ0) +#endif +#ifdef PJ1 + PIN_ADD(PJ1) +#endif +#ifdef PJ2 + PIN_ADD(PJ2) +#endif +#ifdef PJ3 + PIN_ADD(PJ3) +#endif +#ifdef PJ4 + PIN_ADD(PJ4) +#endif +#ifdef PJ5 + PIN_ADD(PJ5) +#endif +#ifdef PJ6 + PIN_ADD(PJ6) +#endif +#ifdef PJ7 + PIN_ADD(PJ7) +#endif +#ifdef PJ8 + PIN_ADD(PJ8) +#endif +#ifdef PJ9 + PIN_ADD(PJ9) +#endif +#ifdef PJ10 + PIN_ADD(PJ10) +#endif +#ifdef PJ11 + PIN_ADD(PJ11) +#endif +#ifdef PJ12 + PIN_ADD(PJ12) +#endif +#ifdef PJ13 + PIN_ADD(PJ13) +#endif +#ifdef PJ14 + PIN_ADD(PJ14) +#endif +#ifdef PJ15 + PIN_ADD(PJ15) +#endif + +#ifdef PK0 + PIN_ADD(PK0) +#endif +#ifdef PK1 + PIN_ADD(PK1) +#endif +#ifdef PK2 + PIN_ADD(PK2) +#endif +#ifdef PK3 + PIN_ADD(PK3) +#endif +#ifdef PK4 + PIN_ADD(PK4) +#endif +#ifdef PK5 + PIN_ADD(PK5) +#endif +#ifdef PK6 + PIN_ADD(PK6) +#endif +#ifdef PK7 + PIN_ADD(PK7) +#endif +#ifdef PK8 + PIN_ADD(PK8) +#endif +#ifdef PK9 + PIN_ADD(PK9) +#endif +#ifdef PK10 + PIN_ADD(PK10) +#endif +#ifdef PK11 + PIN_ADD(PK11) +#endif +#ifdef PK12 + PIN_ADD(PK12) +#endif +#ifdef PK13 + PIN_ADD(PK13) +#endif +#ifdef PK14 + PIN_ADD(PK14) +#endif +#ifdef PK15 + PIN_ADD(PK15) +#endif + +#ifdef PL0 + PIN_ADD(PL0) +#endif +#ifdef PL1 + PIN_ADD(PL1) +#endif +#ifdef PL2 + PIN_ADD(PL2) +#endif +#ifdef PL3 + PIN_ADD(PL3) +#endif +#ifdef PL4 + PIN_ADD(PL4) +#endif +#ifdef PL5 + PIN_ADD(PL5) +#endif +#ifdef PL6 + PIN_ADD(PL6) +#endif +#ifdef PL7 + PIN_ADD(PL7) +#endif +#ifdef PL8 + PIN_ADD(PL8) +#endif +#ifdef PL9 + PIN_ADD(PL9) +#endif +#ifdef PL10 + PIN_ADD(PL10) +#endif +#ifdef PL11 + PIN_ADD(PL11) +#endif +#ifdef PL12 + PIN_ADD(PL12) +#endif +#ifdef PL13 + PIN_ADD(PL13) +#endif +#ifdef PL14 + PIN_ADD(PL14) +#endif +#ifdef PL15 + PIN_ADD(PL15) +#endif diff --git a/Marlin/src/HAL/STM32/spi_pins.h b/Marlin/src/HAL/STM32/spi_pins.h new file mode 100644 index 00000000..176e2a7b --- /dev/null +++ b/Marlin/src/HAL/STM32/spi_pins.h @@ -0,0 +1,35 @@ +/** + * 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 + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + */ +#ifndef SCK_PIN + #define SCK_PIN PIN_SPI_SCK +#endif +#ifndef MISO_PIN + #define MISO_PIN PIN_SPI_MISO +#endif +#ifndef MOSI_PIN + #define MOSI_PIN PIN_SPI_MOSI +#endif +#ifndef SS_PIN + #define SS_PIN PIN_SPI_SS +#endif 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 00000000..3a080d5e --- /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 00000000..cbec7613 --- /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_DRIVER 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 00000000..d3eb4ba8 --- /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 00000000..d477b58c --- /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_DRIVER 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 00000000..921e377a --- /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 00000000..7a6d8439 --- /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/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp new file mode 100644 index 00000000..c0ba19ab --- /dev/null +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -0,0 +1,280 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfig.h" + +// ------------------------ +// Local defines +// ------------------------ + +#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 STEP_TIMER_IRQ_PRIO_DEFAULT +#endif +#ifndef TEMP_TIMER_IRQ_PRIO + #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 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 + +#ifdef STM32F0xx + #define MCU_TIMER_RATE (F_CPU) // Frequency of timer peripherals + #define MCU_STEP_TIMER 16 + #define MCU_TEMP_TIMER 17 +#elif defined(STM32F1xx) + #define MCU_TIMER_RATE (F_CPU) + #define MCU_STEP_TIMER 4 + #define MCU_TEMP_TIMER 2 +#elif defined(STM32F401xC) || defined(STM32F401xE) + #define MCU_TIMER_RATE (F_CPU / 2) + #define MCU_STEP_TIMER 9 + #define MCU_TEMP_TIMER 10 +#elif defined(STM32F4xx) || defined(STM32F7xx) + #define MCU_TIMER_RATE (F_CPU / 2) + #define MCU_STEP_TIMER 6 // STM32F401 has no TIM6, TIM7, or TIM8 + #define MCU_TEMP_TIMER 14 // TIM7 is consumed by Software Serial if used. +#endif + +#ifndef HAL_TIMER_RATE + #define HAL_TIMER_RATE MCU_TIMER_RATE +#endif +#ifndef STEP_TIMER + #define STEP_TIMER MCU_STEP_TIMER +#endif +#ifndef TEMP_TIMER + #define TEMP_TIMER MCU_TEMP_TIMER +#endif + +#define __TIMER_DEV(X) TIM##X +#define _TIMER_DEV(X) __TIMER_DEV(X) +#define STEP_TIMER_DEV _TIMER_DEV(STEP_TIMER) +#define TEMP_TIMER_DEV _TIMER_DEV(TEMP_TIMER) + +#define __TIMER_IRQ_NAME(X) TIM##X##_IRQn +#define _TIMER_IRQ_NAME(X) __TIMER_IRQ_NAME(X) +#define STEP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(STEP_TIMER) +#define TEMP_TIMER_IRQ_NAME _TIMER_IRQ_NAME(TEMP_TIMER) + +// ------------------------ +// Private Variables +// ------------------------ + +HardwareTimer *timer_instance[NUM_HARDWARE_TIMERS] = { NULL }; + +// ------------------------ +// Public functions +// ------------------------ + +// frequency is in Hertz +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + if (!HAL_timer_initialized(timer_num)) { + switch (timer_num) { + case STEP_TIMER_NUM: // STEPPER TIMER - use a 32bit timer if possible + timer_instance[timer_num] = new HardwareTimer(STEP_TIMER_DEV); + /* Set the prescaler to the final desired value. + * This will change the effective ISR callback frequency but when + * HAL_timer_start(timer_num=0) is called in the core for the first time + * the real frequency isn't important as long as, after boot, the ISR + * gets called with the correct prescaler and count register. So here + * we set the prescaler to the correct, final value and ignore the frequency + * asked. We will call back the ISR in 1 second to start at full speed. + * + * The proper fix, however, would be a correct initialization OR a + * HAL_timer_change(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; + case TEMP_TIMER_NUM: // TEMP TIMER - any available 16bit timer + timer_instance[timer_num] = new HardwareTimer(TEMP_TIMER_DEV); + // The prescale factor is computed automatically for HERTZ_FORMAT + timer_instance[timer_num]->setOverflow(frequency, HERTZ_FORMAT); + 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); + + // 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. + // These calls can be removed and replaced with + // timer_instance[timer_num]->setInterruptPriority + switch (timer_num) { + case STEP_TIMER_NUM: + timer_instance[timer_num]->setInterruptPriority(STEP_TIMER_IRQ_PRIO, 0); + break; + case TEMP_TIMER_NUM: + 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_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; + } + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + 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_instance[timer_num]->hasInterrupt(); +} + +void SetTimerInterruptPriorities() { + TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIO, 0)); + 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 new file mode 100644 index 00000000..5515219e --- /dev/null +++ b/Marlin/src/HAL/STM32/timers.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 "../../inc/MarlinConfig.h" + +// ------------------------ +// Defines +// ------------------------ + +#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 UINT16_MAX + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_FREQUENCY 1000 // Temperature::isr() is expected to be called at around 1kHz + +// TODO: get rid of manual rate/prescale/ticks/cycles taken for procedures in stepper.cpp +#define STEPPER_TIMER_RATE 2000000 // 2 Mhz +#define STEPPER_TIMER_PRESCALE ((HAL_TIMER_RATE)/(STEPPER_TIMER_RATE)) +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#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(); +extern void Temp_Handler(); + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void Step_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void Temp_Handler() +#endif + +// ------------------------ +// Public Variables +// ------------------------ + +extern HardwareTimer *timer_instance[]; + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +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 SetTimerInterruptPriorities(); + +// 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; +} +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + return HAL_timer_initialized(timer_num) ? timer_instance[timer_num]->getCount() : 0; +} + +// NOTE: Method name may be misleading. +// STM32 has an Auto-Reload Register (ARR) as opposed to a "compare" register +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t overflow) { + if (HAL_timer_initialized(timer_num)) { + timer_instance[timer_num]->setOverflow(overflow + 1, TICK_FORMAT); // Value decremented by setOverflow() + // wiki: "force all registers (Autoreload, prescaler, compare) to be taken into account" + // So, if the new overflow value is less than the count it will trigger a rollover interrupt. + if (overflow < timer_instance[timer_num]->getCount()) // Added 'if' here because reports say it won't boot without it + timer_instance[timer_num]->refresh(); + } +} + +#define HAL_timer_isr_prologue(TIMER_NUM) +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32/usb_serial.cpp b/Marlin/src/HAL/STM32/usb_serial.cpp new file mode 100644 index 00000000..2dd1bef1 --- /dev/null +++ b/Marlin/src/HAL/STM32/usb_serial.cpp @@ -0,0 +1,55 @@ +/** + * 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 . + * + */ + +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + +#include "usb_serial.h" +#include "../../feature/e_parser.h" + +EmergencyParser::State emergency_state = EmergencyParser::State::EP_RESET; + +int8_t (*USBD_CDC_Receive_original) (uint8_t *Buf, uint32_t *Len) = nullptr; + +static int8_t USBD_CDC_Receive_hook(uint8_t *Buf, uint32_t *Len) { + for (uint32_t i = 0; i < *Len; i++) + emergency_parser.update(emergency_state, Buf[i]); + return USBD_CDC_Receive_original(Buf, Len); +} + +typedef struct _USBD_CDC_Itf { + int8_t (* Init)(void); + int8_t (* DeInit)(void); + int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); + int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); + int8_t (* Transferred)(void); +} USBD_CDC_ItfTypeDef; + +extern USBD_CDC_ItfTypeDef USBD_CDC_fops; + +void USB_Hook_init() { + USBD_CDC_Receive_original = USBD_CDC_fops.Receive; + USBD_CDC_fops.Receive = USBD_CDC_Receive_hook; +} + +#endif // EMERGENCY_PARSER +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/usb_serial.h b/Marlin/src/HAL/STM32/usb_serial.h new file mode 100644 index 00000000..ca61b9ed --- /dev/null +++ b/Marlin/src/HAL/STM32/usb_serial.h @@ -0,0 +1,21 @@ +/** + * 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 + +void USB_Hook_init(); diff --git a/Marlin/src/HAL/STM32/watchdog.cpp b/Marlin/src/HAL/STM32/watchdog.cpp new file mode 100644 index 00000000..cc185531 --- /dev/null +++ b/Marlin/src/HAL/STM32/watchdog.cpp @@ -0,0 +1,47 @@ +/** + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(USE_WATCHDOG) + + #include "../../inc/MarlinConfig.h" + + #include "watchdog.h" + #include + + void watchdog_init() { + #if DISABLED(DISABLE_WATCHDOG_INIT) + IWatchdog.begin(4000000); // 4 sec timeout + #endif + } + + void HAL_watchdog_refresh() { + IWatchdog.reload(); + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heartbeat indicator + #endif + } + +#endif // USE_WATCHDOG +#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/HAL/STM32/watchdog.h b/Marlin/src/HAL/STM32/watchdog.h new file mode 100644 index 00000000..49a0d9c6 --- /dev/null +++ b/Marlin/src/HAL/STM32/watchdog.h @@ -0,0 +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 . + * + */ +#pragma once + +void watchdog_init(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp new file mode 100644 index 00000000..cd1efc16 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -0,0 +1,420 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" +#include "HAL.h" + +#include + +// ------------------------ +// Types +// ------------------------ + +#define __I +#define __IO volatile + typedef struct { + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + } SCB_Type; + +// ------------------------ +// Local defines +// ------------------------ + +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +// ------------------------ +// Public Variables +// ------------------------ + +#if (defined(SERIAL_USB) && !defined(USE_USB_COMPOSITE)) + USBSerial SerialUSB; +#endif + +uint16_t HAL_adc_result; + +// ------------------------ +// Private Variables +// ------------------------ +STM32ADC adc(ADC1); + +const uint8_t adc_pins[] = { + #if HAS_TEMP_ADC_0 + TEMP_0_PIN, + #endif + #if HAS_TEMP_ADC_PROBE + TEMP_PROBE_PIN, + #endif + #if HAS_HEATED_BED + TEMP_BED_PIN, + #endif + #if HAS_TEMP_CHAMBER + TEMP_CHAMBER_PIN, + #endif + #if HAS_TEMP_ADC_1 + TEMP_1_PIN, + #endif + #if HAS_TEMP_ADC_2 + TEMP_2_PIN, + #endif + #if HAS_TEMP_ADC_3 + TEMP_3_PIN, + #endif + #if HAS_TEMP_ADC_4 + TEMP_4_PIN, + #endif + #if HAS_TEMP_ADC_5 + TEMP_5_PIN, + #endif + #if HAS_TEMP_ADC_6 + TEMP_6_PIN, + #endif + #if HAS_TEMP_ADC_7 + TEMP_7_PIN, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + FILWIDTH_PIN, + #endif + #if ENABLED(ADC_KEYPAD) + ADC_KEYPAD_PIN, + #endif + #if HAS_JOY_ADC_X + JOY_X_PIN, + #endif + #if HAS_JOY_ADC_Y + JOY_Y_PIN, + #endif + #if HAS_JOY_ADC_Z + JOY_Z_PIN, + #endif + #if ENABLED(POWER_MONITOR_CURRENT) + POWER_MONITOR_CURRENT_PIN, + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + POWER_MONITOR_VOLTAGE_PIN, + #endif +}; + +enum TempPinIndex : char { + #if HAS_TEMP_ADC_0 + TEMP_0, + #endif + #if HAS_TEMP_ADC_PROBE + TEMP_PROBE, + #endif + #if HAS_HEATED_BED + TEMP_BED, + #endif + #if HAS_TEMP_CHAMBER + TEMP_CHAMBER, + #endif + #if HAS_TEMP_ADC_1 + TEMP_1, + #endif + #if HAS_TEMP_ADC_2 + TEMP_2, + #endif + #if HAS_TEMP_ADC_3 + TEMP_3, + #endif + #if HAS_TEMP_ADC_4 + TEMP_4, + #endif + #if HAS_TEMP_ADC_5 + TEMP_5, + #endif + #if HAS_TEMP_ADC_6 + TEMP_6, + #endif + #if HAS_TEMP_ADC_7 + TEMP_7, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + FILWIDTH, + #endif + #if ENABLED(ADC_KEYPAD) + ADC_KEY, + #endif + #if HAS_JOY_ADC_X + JOY_X, + #endif + #if HAS_JOY_ADC_Y + JOY_Y, + #endif + #if HAS_JOY_ADC_Z + JOY_Z, + #endif + #if ENABLED(POWER_MONITOR_CURRENT) + POWERMON_CURRENT, + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + POWERMON_VOLTS, + #endif + ADC_PIN_COUNT +}; + +uint16_t HAL_adc_results[ADC_PIN_COUNT]; + +// ------------------------ +// Private functions +// ------------------------ +static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + +// ------------------------ +// Public functions +// ------------------------ + +// +// Leave PA11/PA12 intact if USBSerial is not used +// +#if SERIAL_USB + namespace wirish { namespace priv { + #if SERIAL_PORT > 0 + #if SERIAL_PORT2 + #if SERIAL_PORT2 > 0 + void board_setup_usb() {} + #endif + #else + void board_setup_usb() {} + #endif + #endif + } } +#endif + +void HAL_init() { + NVIC_SetPriorityGrouping(0x3); + #if PIN_EXISTS(LED) + OUT_WRITE(LED_PIN, LOW); + #endif + #ifdef USE_USB_COMPOSITE + MSC_SD_init(); + #endif + #if PIN_EXISTS(USB_CONNECT) + OUT_WRITE(USB_CONNECT_PIN, !USB_CONNECT_INVERTING); // USB clear connection + delay(1000); // Give OS time to notice + OUT_WRITE(USB_CONNECT_PIN, USB_CONNECT_INVERTING); + #endif +} + +// HAL idle task +void HAL_idletask() { + #ifdef USE_USB_COMPOSITE + #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 + // this will not reliably detect delete operations. To be safe we will lock + // 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 HAS_SHARED_MEDIA*/ + #endif + // process USB mass storage device class loop + MarlinMSC.loop(); + #endif +} + +void HAL_clear_reset_source() { } + +/** + * TODO: Check this and change or remove. + */ +uint8_t HAL_get_reset_source() { return RST_POWER_ON; } + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +/** + * TODO: Change this to correct it for libmaple + */ + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// ------------------------ +// ADC +// ------------------------ +// Init the AD in continuous capture mode +void HAL_adc_init() { + // configure the ADC + adc.calibrate(); + #if F_CPU > 72000000 + adc.setSampleRate(ADC_SMPR_71_5); // 71.5 ADC cycles + #else + adc.setSampleRate(ADC_SMPR_41_5); // 41.5 ADC cycles + #endif + adc.setPins((uint8_t *)adc_pins, ADC_PIN_COUNT); + adc.setDMA(HAL_adc_results, (uint16_t)ADC_PIN_COUNT, (uint32_t)(DMA_MINC_MODE | DMA_CIRC_MODE), nullptr); + adc.setScanMode(); + adc.setContinuous(); + adc.startConversion(); +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + //TEMP_PINS pin_index; + TempPinIndex pin_index; + switch (adc_pin) { + default: return; + #if HAS_TEMP_ADC_0 + case TEMP_0_PIN: pin_index = TEMP_0; break; + #endif + #if HAS_TEMP_ADC_PROBE + case TEMP_PROBE_PIN: pin_index = TEMP_PROBE; break; + #endif + #if HAS_HEATED_BED + case TEMP_BED_PIN: pin_index = TEMP_BED; break; + #endif + #if HAS_TEMP_CHAMBER + case TEMP_CHAMBER_PIN: pin_index = TEMP_CHAMBER; break; + #endif + #if HAS_TEMP_ADC_1 + case TEMP_1_PIN: pin_index = TEMP_1; break; + #endif + #if HAS_TEMP_ADC_2 + case TEMP_2_PIN: pin_index = TEMP_2; break; + #endif + #if HAS_TEMP_ADC_3 + case TEMP_3_PIN: pin_index = TEMP_3; break; + #endif + #if HAS_TEMP_ADC_4 + case TEMP_4_PIN: pin_index = TEMP_4; break; + #endif + #if HAS_TEMP_ADC_5 + case TEMP_5_PIN: pin_index = TEMP_5; break; + #endif + #if HAS_TEMP_ADC_6 + case TEMP_6_PIN: pin_index = TEMP_6; break; + #endif + #if HAS_TEMP_ADC_7 + case TEMP_7_PIN: pin_index = TEMP_7; break; + #endif + #if HAS_JOY_ADC_X + case JOY_X_PIN: pin_index = JOY_X; break; + #endif + #if HAS_JOY_ADC_Y + case JOY_Y_PIN: pin_index = JOY_Y; break; + #endif + #if HAS_JOY_ADC_Z + case JOY_Z_PIN: pin_index = JOY_Z; break; + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + case FILWIDTH_PIN: pin_index = FILWIDTH; break; + #endif + #if ENABLED(ADC_KEYPAD) + case ADC_KEYPAD_PIN: pin_index = ADC_KEY; break; + #endif + #if ENABLED(POWER_MONITOR_CURRENT) + case POWER_MONITOR_CURRENT_PIN: pin_index = POWERMON_CURRENT; break; + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + case POWER_MONITOR_VOLTAGE_PIN: pin_index = POWERMON_VOLTS; break; + #endif + } + HAL_adc_result = (HAL_adc_results[(int)pin_index] >> 2) & 0x3FF; // shift to get 10 bits only. +} + +uint16_t HAL_adc_get_result() { return HAL_adc_result; } + +uint16_t analogRead(pin_t pin) { + const bool is_analog = _GET_MODE(pin) == GPIO_INPUT_ANALOG; + return is_analog ? analogRead(uint8_t(pin)) : 0; +} + +// Wrapper to maple unprotected analogWrite +void analogWrite(pin_t pin, int pwm_val8) { + if (PWM_PIN(pin)) + analogWrite(uint8_t(pin), pwm_val8); +} + +void flashFirmware(const int16_t) { nvic_sys_reset(); } + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h new file mode 100644 index 00000000..c10dea0e --- /dev/null +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -0,0 +1,246 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#define CPU_32_BIT + +#include "../../core/macros.h" +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" + + +#include +#include + +#include "../../inc/MarlinConfigPre.h" + +#ifdef USE_USB_COMPOSITE + #include "msc_sd.h" +#endif + +#include "MarlinSerial.h" + +// ------------------------ +// Defines +// ------------------------ + +#ifndef STM32_FLASH_SIZE + #if EITHER(MCU_STM32F103RE, MCU_STM32F103VE) + #define STM32_FLASH_SIZE 512 + #else + #define STM32_FLASH_SIZE 256 + #endif +#endif + +#ifdef SERIAL_USB + #ifndef USE_USB_COMPOSITE + #define UsbSerial Serial + #else + #define UsbSerial MarlinCompositeSerial + #endif +#endif + +#define _MSERIAL(X) MSerial##X +#define MSERIAL(X) _MSERIAL(X) + +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + #define NUM_UARTS 5 +#else + #define NUM_UARTS 3 +#endif + +#if SERIAL_PORT == -1 + #define MYSERIAL0 UsbSerial +#elif WITHIN(SERIAL_PORT, 1, NUM_UARTS) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#elif NUM_UARTS == 5 + #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." +#else + #error "SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 UsbSerial + #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #elif NUM_UARTS == 5 + #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." + #else + #error "SERIAL_PORT_2 must be -1 or from 1 to 3. Please update your configuration." + #endif +#endif + +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == -1 + #define LCD_SERIAL UsbSerial + #elif WITHIN(LCD_SERIAL_PORT, 1, NUM_UARTS) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #elif NUM_UARTS == 5 + #error "LCD_SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." + #else + #error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration." + #endif +#endif + +// Set interrupt grouping for this MCU +void HAL_init(); +#define HAL_IDLETASK 1 +void HAL_idletask(); + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#ifndef digitalPinHasPWM + #define digitalPinHasPWM(P) (PIN_MAP[P].timer_device != nullptr) + #define NO_COMPILE_TIME_PWM +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); (void)__iCliRetVal() +#define CRITICAL_SECTION_END() if (!primask) (void)__iSeiRetVal() +#define ISRS_ENABLED() (!__get_primask()) +#define ENABLE_ISRS() ((void)__iSeiRetVal()) +#define DISABLE_ISRS() ((void)__iCliRetVal()) + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +// ------------------------ +// Types +// ------------------------ + +typedef int8_t pin_t; + +// ------------------------ +// Public Variables +// ------------------------ + +// Result of last ADC conversion +extern uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +// Disable interrupts +#define cli() noInterrupts() + +// Enable interrupts +#define sei() interrupts() + +// Memory related +#define __bss_end __bss_end__ + +// Clear reset reason +void HAL_clear_reset_source(); + +// Reset reason +uint8_t HAL_get_reset_source(); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +void _delay_ms(const int delay); + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" + +/* +extern "C" { + int freeMemory(); +} +*/ + +extern "C" char* _sbrk(int incr); + +/* +static int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ + +static int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +#pragma GCC diagnostic pop + +// +// ADC +// + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT_ANALOG); + +void HAL_adc_init(); + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(); + +uint16_t analogRead(pin_t pin); // need HAL_ANALOG_SELECT() first +void analogWrite(pin_t pin, int pwm_val8); // PWM only! mul by 257 in maple!? + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY) +#define JTAGSWD_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE) + +#define PLATFORM_M997_SUPPORT +void flashFirmware(const int16_t); diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp new file mode 100644 index 00000000..76b1c3e2 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -0,0 +1,171 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + * Adapted to the STM32F1 HAL + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" +#include + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(SOFTWARE_SPI) + + // ------------------------ + // Software SPI + // ------------------------ + #error "Software SPI not supported for STM32F1. Use hardware SPI." + +#else + +// ------------------------ +// Hardware SPI +// ------------------------ + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin() { + #if PIN_EXISTS(SS) + OUT_WRITE(SS_PIN, HIGH); + #endif +} + +/** + * @brief Initialize SPI port to required speed rate and transfer mode (MSB, SPI MODE 0) + * + * @param spiRate Rate as declared in HAL.h (speed do not match AVR) + * @return Nothing + * + * @details + */ +void spiInit(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 + */ + #if SPI_DEVICE == 1 + #define SPI_CLOCK_MAX SPI_CLOCK_DIV4 + #else + #define SPI_CLOCK_MAX SPI_CLOCK_DIV2 + #endif + uint8_t clock; + 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 + } + SPI.setModule(SPI_DEVICE); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +} + +/** + * @brief Receive a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec() { + uint8_t returnByte = SPI.transfer(0xFF); + 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 spiRead(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 spiSend(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 spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.send(token); + SPI.dmaSend(const_cast(buf), 512); +} + +#if ENABLED(SPI_EEPROM) + +// Read single byte from specified SPI channel +uint8_t spiRec(uint32_t chan) { return SPI.transfer(0xFF); } + +// Write single byte to specified SPI channel +void spiSend(uint32_t chan, byte b) { SPI.send(b); } + +// Write buffer to specified SPI channel +void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { + for (size_t p = 0; p < n; p++) spiSend(chan, buf[p]); +} + +#endif // SPI_EEPROM + +#endif // SOFTWARE_SPI + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp new file mode 100644 index 00000000..ebf11cb4 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -0,0 +1,193 @@ +/** + * 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 . + * + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.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. + */ + uint32_t srflags = regs->SR, cr1its = regs->CR1; + + if ((cr1its & USART_CR1_RXNEIE) && (srflags & USART_SR_RXNE)) { + if (srflags & USART_SR_FE || srflags & USART_SR_PE ) { + // framing error or parity error + regs->DR; // Read and throw away the data, which also clears FE and PE + } + else { + 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) + if (serial.emergency_parser_enabled()) + emergency_parser.update(serial.emergency_state, c); + #endif + } + } + else if (srflags & USART_SR_ORE) { + // overrun and empty data, just do a dummy read to clear ORE + // and prevent a raise condition where a continous interrupt stream (due to ORE set) occurs + // (see chapter "Overrun error" ) in STM32 reference manual + regs->DR; + } + + // TXE signifies readiness to send a byte to DR. + if ((cr1its & USART_CR1_TXEIE) && (srflags & USART_SR_TXE)) { + if (!rb_is_empty(wb)) + regs->DR=rb_remove(wb); + else + regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE + } +} + +// Not every MarlinSerial port should handle emergency parsing. +// It would not make sense to parse GCode from TMC responses, for example. +constexpr bool serial_handles_emergency(int port) { + return false + #ifdef SERIAL_PORT + || (SERIAL_PORT) == port + #endif + #ifdef SERIAL_PORT_2 + || (SERIAL_PORT_2) == port + #endif + #ifdef LCD_SERIAL_PORT + || (LCD_SERIAL_PORT) == port + #endif + ; +} + +#define DEFINE_HWSERIAL_MARLIN(name, n) \ + MarlinSerial name(USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN, \ + serial_handles_emergency(n)); \ + 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, \ + serial_handles_emergency(n)); \ + extern "C" void __irq_usart##n(void) { \ + my_usart_irq(UART##n->rb, UART##n->wb, UART##n##_BASE, MSerial##n); \ + } + +// Instantiate all UARTs even if they are not needed +// This avoids a bunch of logic to figure out every serial +// port which may be in use on the system. +DEFINE_HWSERIAL_MARLIN(MSerial1, 1); +DEFINE_HWSERIAL_MARLIN(MSerial2, 2); +DEFINE_HWSERIAL_MARLIN(MSerial3, 3); +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4); + DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); +#endif + +// Check the type of each serial port by passing it to a template function. +// HardwareSerial is known to sometimes hang the controller when an error occurs, +// so this case will fail the static assert. All other classes are assumed to be ok. +template +constexpr bool IsSerialClassAllowed(const T&) { return true; } +constexpr bool IsSerialClassAllowed(const HardwareSerial&) { return false; } + +#define CHECK_CFG_SERIAL(A) static_assert(IsSerialClassAllowed(A), STRINGIFY(A) " is defined incorrectly"); +#define CHECK_AXIS_SERIAL(A) static_assert(IsSerialClassAllowed(A##_HARDWARE_SERIAL), STRINGIFY(A) "_HARDWARE_SERIAL must be defined in the form MSerial1, rather than Serial1"); + +// If you encounter this error, replace SerialX with MSerialX, for example MSerial3. + +// Non-TMC ports were already validated in HAL.h, so do not require verbose error messages. +#ifdef MYSERIAL0 + CHECK_CFG_SERIAL(MYSERIAL0); +#endif +#ifdef MYSERIAL1 + CHECK_CFG_SERIAL(MYSERIAL1); +#endif +#ifdef LCD_SERIAL + CHECK_CFG_SERIAL(LCD_SERIAL); +#endif +#if AXIS_HAS_HW_SERIAL(X) + CHECK_AXIS_SERIAL(X); +#endif +#if AXIS_HAS_HW_SERIAL(X2) + CHECK_AXIS_SERIAL(X2); +#endif +#if AXIS_HAS_HW_SERIAL(Y) + CHECK_AXIS_SERIAL(Y); +#endif +#if AXIS_HAS_HW_SERIAL(Y2) + CHECK_AXIS_SERIAL(Y2); +#endif +#if AXIS_HAS_HW_SERIAL(Z) + CHECK_AXIS_SERIAL(Z); +#endif +#if AXIS_HAS_HW_SERIAL(Z2) + CHECK_AXIS_SERIAL(Z2); +#endif +#if AXIS_HAS_HW_SERIAL(Z3) + CHECK_AXIS_SERIAL(Z3); +#endif +#if AXIS_HAS_HW_SERIAL(Z4) + CHECK_AXIS_SERIAL(Z4); +#endif +#if AXIS_HAS_HW_SERIAL(E0) + CHECK_AXIS_SERIAL(E0); +#endif +#if AXIS_HAS_HW_SERIAL(E1) + CHECK_AXIS_SERIAL(E1); +#endif +#if AXIS_HAS_HW_SERIAL(E2) + CHECK_AXIS_SERIAL(E2); +#endif +#if AXIS_HAS_HW_SERIAL(E3) + CHECK_AXIS_SERIAL(E3); +#endif +#if AXIS_HAS_HW_SERIAL(E4) + CHECK_AXIS_SERIAL(E4); +#endif +#if AXIS_HAS_HW_SERIAL(E5) + CHECK_AXIS_SERIAL(E5); +#endif +#if AXIS_HAS_HW_SERIAL(E6) + CHECK_AXIS_SERIAL(E6); +#endif +#if AXIS_HAS_HW_SERIAL(E7) + CHECK_AXIS_SERIAL(E7); +#endif + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h new file mode 100644 index 00000000..6aa94b64 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -0,0 +1,71 @@ +/** + * 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 + +#include "../../inc/MarlinConfigPre.h" +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +// Increase priority of serial interrupts, to reduce overflow errors +#define UART_IRQ_PRIO 1 + +class MarlinSerial : public HardwareSerial { +public: + #if ENABLED(EMERGENCY_PARSER) + const bool ep_enabled; + EmergencyParser::State emergency_state; + inline bool emergency_parser_enabled() { return ep_enabled; } + #endif + + MarlinSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin, bool TERN_(EMERGENCY_PARSER, ep_capable)) : + HardwareSerial(usart_device, tx_pin, rx_pin) + #if ENABLED(EMERGENCY_PARSER) + , ep_enabled(ep_capable) + , emergency_state(EmergencyParser::State::EP_RESET) + #endif + { } + + #ifdef UART_IRQ_PRIO + // Shadow the parent methods to set IRQ priority after begin() + void begin(uint32 baud) { + MarlinSerial::begin(baud, SERIAL_8N1); + } + + void begin(uint32 baud, uint8_t config) { + HardwareSerial::begin(baud, config); + nvic_irq_set_priority(c_dev()->irq_num, UART_IRQ_PRIO); + } + #endif +}; + +extern MarlinSerial MSerial1; +extern MarlinSerial MSerial2; +extern MarlinSerial MSerial3; +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + extern MarlinSerial MSerial4; + extern MarlinSerial MSerial5; +#endif diff --git a/Marlin/src/HAL/STM32F1/README.md b/Marlin/src/HAL/STM32F1/README.md new file mode 100644 index 00000000..b5bd5141 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/README.md @@ -0,0 +1,11 @@ +# STM32F1 + +This HAL is for STM32F103 boards used with [Arduino STM32](https://github.com/rogerclarkmelbourne/Arduino_STM32) framework. + +Currently has been tested in Malyan M200 (103CBT6), SKRmini (103RCT6), Chitu 3d (103ZET6), and various 103VET6 boards. + +### Main developers: +- Victorpv +- xC000005 +- thisiskeithb +- tpruvot diff --git a/Marlin/src/HAL/STM32F1/SPI.cpp b/Marlin/src/HAL/STM32F1/SPI.cpp new file mode 100644 index 00000000..0452cf62 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/SPI.cpp @@ -0,0 +1,718 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @author Marti Bolivar + * @brief Wirish SPI implementation. + */ + +#ifdef __STM32F1__ + +#include + +#include +#include +#include + +#include +#include + +#include "../../inc/MarlinConfig.h" +#include "spi_pins.h" + +/** Time in ms for DMA receive timeout */ +#define DMA_TIMEOUT 100 + +#if CYCLES_PER_MICROSECOND != 72 + #warning "Unexpected clock speed; SPI frequency calculation will be incorrect" +#endif + +struct spi_pins { uint8_t nss, sck, miso, mosi; }; + +static const spi_pins* dev_to_spi_pins(spi_dev *dev); +static void configure_gpios(spi_dev *dev, bool as_master); +static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq); + +#if BOARD_NR_SPI >= 3 && !defined(STM32_HIGH_DENSITY) + #error "The SPI library is misconfigured: 3 SPI ports only available on high density STM32 devices" +#endif + +static const spi_pins board_spi_pins[] __FLASH__ = { + #if BOARD_NR_SPI >= 1 + { BOARD_SPI1_NSS_PIN, + BOARD_SPI1_SCK_PIN, + BOARD_SPI1_MISO_PIN, + BOARD_SPI1_MOSI_PIN }, + #endif + #if BOARD_NR_SPI >= 2 + { BOARD_SPI2_NSS_PIN, + BOARD_SPI2_SCK_PIN, + BOARD_SPI2_MISO_PIN, + BOARD_SPI2_MOSI_PIN }, + #endif + #if BOARD_NR_SPI >= 3 + { BOARD_SPI3_NSS_PIN, + BOARD_SPI3_SCK_PIN, + BOARD_SPI3_MISO_PIN, + BOARD_SPI3_MOSI_PIN }, + #endif +}; + +#if BOARD_NR_SPI >= 1 + static void *_spi1_this; +#endif +#if BOARD_NR_SPI >= 2 + static void *_spi2_this; +#endif +#if BOARD_NR_SPI >= 3 + static void *_spi3_this; +#endif + +/** + * Constructor + */ +SPIClass::SPIClass(uint32_t spi_num) { + _currentSetting = &_settings[spi_num - 1]; // SPI channels are called 1 2 and 3 but the array is zero indexed + + switch (spi_num) { + #if BOARD_NR_SPI >= 1 + case 1: + _currentSetting->spi_d = SPI1; + _spi1_this = (void*)this; + break; + #endif + #if BOARD_NR_SPI >= 2 + case 2: + _currentSetting->spi_d = SPI2; + _spi2_this = (void*)this; + break; + #endif + #if BOARD_NR_SPI >= 3 + case 3: + _currentSetting->spi_d = SPI3; + _spi3_this = (void*)this; + break; + #endif + default: ASSERT(0); + } + + // Init things specific to each SPI device + // clock divider setup is a bit of hack, and needs to be improved at a later date. + #if BOARD_NR_SPI >= 1 + _settings[0].spi_d = SPI1; + _settings[0].clockDivider = determine_baud_rate(_settings[0].spi_d, _settings[0].clock); + _settings[0].spiDmaDev = DMA1; + _settings[0].spiTxDmaChannel = DMA_CH3; + _settings[0].spiRxDmaChannel = DMA_CH2; + #endif + #if BOARD_NR_SPI >= 2 + _settings[1].spi_d = SPI2; + _settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); + _settings[1].spiDmaDev = DMA1; + _settings[1].spiTxDmaChannel = DMA_CH5; + _settings[1].spiRxDmaChannel = DMA_CH4; + #endif + #if BOARD_NR_SPI >= 3 + _settings[2].spi_d = SPI3; + _settings[2].clockDivider = determine_baud_rate(_settings[2].spi_d, _settings[2].clock); + _settings[2].spiDmaDev = DMA2; + _settings[2].spiTxDmaChannel = DMA_CH2; + _settings[2].spiRxDmaChannel = DMA_CH1; + #endif + + // added for DMA callbacks. + _currentSetting->state = SPI_STATE_IDLE; +} + +/** + * Set up/tear down + */ +void SPIClass::updateSettings() { + uint32_t flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize | SPI_SW_SLAVE | SPI_SOFT_SS); + spi_master_enable(_currentSetting->spi_d, (spi_baud_rate)_currentSetting->clockDivider, (spi_mode)_currentSetting->dataMode, flags); +} + +void SPIClass::begin() { + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 1); + updateSettings(); + // added for DMA callbacks. + _currentSetting->state = SPI_STATE_READY; +} + +void SPIClass::beginSlave() { + spi_init(_currentSetting->spi_d); + configure_gpios(_currentSetting->spi_d, 0); + uint32_t flags = ((_currentSetting->bitOrder == MSBFIRST ? SPI_FRAME_MSB : SPI_FRAME_LSB) | _currentSetting->dataSize); + spi_slave_enable(_currentSetting->spi_d, (spi_mode)_currentSetting->dataMode, flags); + // added for DMA callbacks. + _currentSetting->state = SPI_STATE_READY; +} + +void SPIClass::end() { + if (!spi_is_enabled(_currentSetting->spi_d)) return; + + // Follows RM0008's sequence for disabling a SPI in master/slave + // full duplex mode. + while (spi_is_rx_nonempty(_currentSetting->spi_d)) { + // FIXME [0.1.0] remove this once you have an interrupt based driver + volatile uint16_t rx __attribute__((unused)) = spi_rx_reg(_currentSetting->spi_d); + } + waitSpiTxEnd(_currentSetting->spi_d); + + spi_peripheral_disable(_currentSetting->spi_d); + // added for DMA callbacks. + // Need to add unsetting the callbacks for the DMA channels. + _currentSetting->state = SPI_STATE_IDLE; +} + +/* Roger Clark added 3 functions */ +void SPIClass::setClockDivider(uint32_t clockDivider) { + _currentSetting->clockDivider = clockDivider; + uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_BR); + _currentSetting->spi_d->regs->CR1 = cr1 | (clockDivider & SPI_CR1_BR); +} + +void SPIClass::setBitOrder(BitOrder bitOrder) { + _currentSetting->bitOrder = bitOrder; + uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_LSBFIRST); + if (bitOrder == LSBFIRST) cr1 |= SPI_CR1_LSBFIRST; + _currentSetting->spi_d->regs->CR1 = cr1; +} + +/** + * Victor Perez. Added to test changing datasize from 8 to 16 bit modes on the fly. + * Input parameter should be SPI_CR1_DFF set to 0 or 1 on a 32bit word. + */ +void SPIClass::setDataSize(uint32_t datasize) { + _currentSetting->dataSize = datasize; + uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_DFF); + uint8_t en = spi_is_enabled(_currentSetting->spi_d); + spi_peripheral_disable(_currentSetting->spi_d); + _currentSetting->spi_d->regs->CR1 = cr1 | (datasize & SPI_CR1_DFF) | en; +} + +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 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 + * 1 0 1 Rising Falling + * 2 1 0 Rising Falling + * 3 1 1 Falling Rising + * + * On the STM32 it appears to be + * + * bit 1 - CPOL : Clock polarity + * (This bit should not be changed when communication is ongoing) + * 0 : CLK to 0 when idle + * 1 : CLK to 1 when idle + * + * bit 0 - CPHA : Clock phase + * (This bit should not be changed when communication is ongoing) + * 0 : The first clock transition is the first data capture edge + * 1 : The second clock transition is the first data capture edge + * + * If someone finds this is not the case or sees a logic error with this let me know ;-) + */ + _currentSetting->dataMode = dataMode; + uint32_t cr1 = _currentSetting->spi_d->regs->CR1 & ~(SPI_CR1_CPOL|SPI_CR1_CPHA); + _currentSetting->spi_d->regs->CR1 = cr1 | (dataMode & (SPI_CR1_CPOL|SPI_CR1_CPHA)); +} + +void SPIClass::beginTransaction(uint8_t pin, const SPISettings &settings) { + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + setClockDivider(determine_baud_rate(_currentSetting->spi_d, settings.clock)); + begin(); +} + +void SPIClass::beginTransactionSlave(const SPISettings &settings) { + setBitOrder(settings.bitOrder); + setDataMode(settings.dataMode); + setDataSize(settings.dataSize); + beginSlave(); +} + +void SPIClass::endTransaction() { } + +/** + * I/O + */ + +uint16_t SPIClass::read() { + while (!spi_is_rx_nonempty(_currentSetting->spi_d)) { /* nada */ } + return (uint16_t)spi_rx_reg(_currentSetting->spi_d); +} + +void SPIClass::read(uint8_t *buf, uint32_t len) { + if (len == 0) return; + spi_rx_reg(_currentSetting->spi_d); // clear the RX buffer in case a byte is waiting on it. + spi_reg_map * regs = _currentSetting->spi_d->regs; + // start sequence: write byte 0 + regs->DR = 0x00FF; // write the first byte + // main loop + while (--len) { + 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 + *buf++ = (uint8)(regs->DR); // read and store the received byte. This clears the RXNE flag. + interrupts(); // let systick do its job + } + // read remaining last byte + while (!(regs->SR & SPI_SR_RXNE)) { /* nada */ } // wait till data is available in the Rx register + *buf++ = (uint8)(regs->DR); // read and store the received byte +} + +void SPIClass::write(uint16_t data) { + /* Added for 16bit data Victor Perez. Roger Clark + * Improved speed by just directly writing the single byte to the SPI data reg and wait for completion, + * by taking the Tx code from transfer(byte) + * This almost doubles the speed of this function. + */ + spi_tx_reg(_currentSetting->spi_d, data); // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + waitSpiTxEnd(_currentSetting->spi_d); +} + +void SPIClass::write16(uint16_t data) { + // Added by stevestrong: write two consecutive bytes in 8 bit mode (DFF=0) + spi_tx_reg(_currentSetting->spi_d, data>>8); // write high byte + while (!spi_is_tx_empty(_currentSetting->spi_d)) { /* nada */ } // Wait until TXE=1 + spi_tx_reg(_currentSetting->spi_d, data); // write low byte + waitSpiTxEnd(_currentSetting->spi_d); +} + +void SPIClass::write(uint16_t data, uint32_t n) { + // Added by stevstrong: Repeatedly send same data by the specified number of times + spi_reg_map * regs = _currentSetting->spi_d->regs; + while (n--) { + regs->DR = data; // write the data to be transmitted into the SPI_DR register (this clears the TXE flag) + while (!(regs->SR & SPI_SR_TXE)) { /* nada */ } // wait till Tx empty + } + while (regs->SR & SPI_SR_BSY) { /* nada */ } // wait until BSY=0 before returning +} + +void SPIClass::write(const void *data, uint32_t length) { + spi_dev * spi_d = _currentSetting->spi_d; + spi_tx(spi_d, data, length); // data can be array of bytes or words + waitSpiTxEnd(spi_d); +} + +uint8_t SPIClass::transfer(uint8_t byte) const { + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, byte); // Write the data item to be transmitted into the SPI_DR register + waitSpiTxEnd(spi_d); + return (uint8)spi_rx_reg(spi_d); // "... and read the last received data." +} + +uint16_t SPIClass::transfer16(uint16_t data) const { + // Modified by stevestrong: write & read two consecutive bytes in 8 bit mode (DFF=0) + // This is more effective than two distinct byte transfers + spi_dev * spi_d = _currentSetting->spi_d; + spi_rx_reg(spi_d); // read any previous data + spi_tx_reg(spi_d, data>>8); // write high byte + waitSpiTxEnd(spi_d); // wait until TXE=1 and then wait until BSY=0 + uint16_t ret = spi_rx_reg(spi_d)<<8; // read and shift high byte + spi_tx_reg(spi_d, data); // write low byte + waitSpiTxEnd(spi_d); // wait until TXE=1 and then wait until BSY=0 + ret += spi_rx_reg(spi_d); // read low byte + return ret; +} + +/** + * Roger Clark and Victor Perez, 2015 + * Performs a DMA SPI transfer with at least a receive buffer. + * If a TX buffer is not provided, FF is sent over and over for the lenght of the transfer. + * On exit TX buffer is not modified, and RX buffer cotains the received data. + * Still in progress. + */ +void SPIClass::dmaTransferSet(const void *transmitBuf, void *receiveBuf) { + dma_init(_currentSetting->spiDmaDev); + //spi_rx_dma_enable(_currentSetting->spi_d); + //spi_tx_dma_enable(_currentSetting->spi_d); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &_currentSetting->spi_d->regs->DR, + dma_bit_size, receiveBuf, dma_bit_size, (DMA_MINC_MODE | DMA_TRNS_CMPLT ));// receive buffer DMA + if (!transmitBuf) { + transmitBuf = &ff; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, + dma_bit_size, (volatile void*)transmitBuf, dma_bit_size, (DMA_FROM_MEM));// Transmit FF repeatedly + } + else { + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, + dma_bit_size, (volatile void*)transmitBuf, dma_bit_size, (DMA_MINC_MODE | DMA_FROM_MEM ));// Transmit buffer DMA + } + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, DMA_PRIORITY_VERY_HIGH); +} + +uint8_t SPIClass::dmaTransferRepeat(uint16_t length) { + if (length == 0) return 0; + if (spi_is_rx_nonempty(_currentSetting->spi_d) == 1) spi_rx_reg(_currentSetting->spi_d); + _currentSetting->state = SPI_STATE_TRANSFER; + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, length); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel);// enable receive + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_rx_dma_enable(_currentSetting->spi_d); + spi_tx_dma_enable(_currentSetting->spi_d); + if (_currentSetting->receiveCallback) + return 0; + + //uint32_t m = millis(); + uint8_t b = 0; + uint32_t m = millis(); + while (!(dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)) { + // Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + + waitSpiTxEnd(_currentSetting->spi_d); // until TXE=1 and BSY=0 + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; + return b; +} + +/** + * Roger Clark and Victor Perez, 2015 + * Performs a DMA SPI transfer with at least a receive buffer. + * If a TX buffer is not provided, FF is sent over and over for the length of the transfer. + * On exit TX buffer is not modified, and RX buffer contains the received data. + * Still in progress. + */ +uint8_t SPIClass::dmaTransfer(const void *transmitBuf, void *receiveBuf, uint16_t length) { + dmaTransferSet(transmitBuf, receiveBuf); + return dmaTransferRepeat(length); +} + +/** + * Roger Clark and Victor Perez, 2015 + * Performs a DMA SPI send using a TX buffer. + * On exit TX buffer is not modified. + * Still in progress. + * 2016 - stevstrong - reworked to automatically detect bit size from SPI setting + */ +void SPIClass::dmaSendSet(const void * transmitBuf, bool minc) { + uint32_t flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + dma_init(_currentSetting->spiDmaDev); + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, dma_bit_size, + (volatile void*)transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_priority(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, DMA_PRIORITY_LOW); +} + +uint8_t SPIClass::dmaSendRepeat(uint16_t length) { + if (length == 0) return 0; + + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + _currentSetting->state = SPI_STATE_TRANSMIT; + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); // enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); + if (_currentSetting->transmitCallback) return 0; + + uint32_t m = millis(); + uint8_t b = 0; + while (!(dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)) { + // Avoid interrupts and just loop waiting for the flag to be set. + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + waitSpiTxEnd(_currentSetting->spi_d); // until TXE=1 and BSY=0 + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; + return b; +} + +uint8_t SPIClass::dmaSend(const void * transmitBuf, uint16_t length, bool minc) { + dmaSendSet(transmitBuf, minc); + return dmaSendRepeat(length); +} + +uint8_t SPIClass::dmaSendAsync(const void * transmitBuf, uint16_t length, bool minc) { + uint8_t b = 0; + + if (_currentSetting->state != SPI_STATE_READY) { + uint32_t m = millis(); + while (!(dma_get_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel) & DMA_ISR_TCIF1)) { + //Avoid interrupts and just loop waiting for the flag to be set. + //delayMicroseconds(10); + if ((millis() - m) > DMA_TIMEOUT) { b = 2; break; } + } + waitSpiTxEnd(_currentSetting->spi_d); // until TXE=1 and BSY=0 + spi_tx_dma_disable(_currentSetting->spi_d); + dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + _currentSetting->state = SPI_STATE_READY; + } + + if (length == 0) return 0; + uint32_t flags = ( (DMA_MINC_MODE*minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); + + dma_init(_currentSetting->spiDmaDev); + // TX + dma_xfer_size dma_bit_size = (_currentSetting->dataSize==DATA_SIZE_16BIT) ? DMA_SIZE_16BITS : DMA_SIZE_8BITS; + dma_setup_transfer(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &_currentSetting->spi_d->regs->DR, + dma_bit_size, (volatile void*)transmitBuf, dma_bit_size, flags);// Transmit buffer DMA + dma_set_num_transfers(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, length); + dma_clear_isr_bits(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + dma_enable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel);// enable transmit + spi_tx_dma_enable(_currentSetting->spi_d); + + _currentSetting->state = SPI_STATE_TRANSMIT; + return b; +} + + +/** + * New functions added to manage callbacks. + * Victor Perez 2017 + */ +void SPIClass::onReceive(void(*callback)()) { + _currentSetting->receiveCallback = callback; + if (callback) { + switch (_currentSetting->spi_d->clk_id) { + #if BOARD_NR_SPI >= 1 + case RCC_SPI1: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi1EventCallback); + break; + #endif + #if BOARD_NR_SPI >= 2 + case RCC_SPI2: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi2EventCallback); + break; + #endif + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel, &SPIClass::_spi3EventCallback); + break; + #endif + default: + ASSERT(0); + } + } + else { + dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + } +} + +void SPIClass::onTransmit(void(*callback)()) { + _currentSetting->transmitCallback = callback; + if (callback) { + switch (_currentSetting->spi_d->clk_id) { + #if BOARD_NR_SPI >= 1 + case RCC_SPI1: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi1EventCallback); + break; + #endif + #if BOARD_NR_SPI >= 2 + case RCC_SPI2: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi2EventCallback); + break; + #endif + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: + dma_attach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel, &SPIClass::_spi3EventCallback); + break; + #endif + default: + ASSERT(0); + } + } + else { + dma_detach_interrupt(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + } +} + +/** + * TODO: check if better to first call the customer code, next disable the DMA requests. + * Also see if we need to check whether callbacks are set or not, may be better to be checked + * during the initial setup and only set the callback to EventCallback if they are set. + */ +void SPIClass::EventCallback() { + waitSpiTxEnd(_currentSetting->spi_d); + switch (_currentSetting->state) { + case SPI_STATE_TRANSFER: + while (spi_is_rx_nonempty(_currentSetting->spi_d)) { /* nada */ } + _currentSetting->state = SPI_STATE_READY; + spi_tx_dma_disable(_currentSetting->spi_d); + spi_rx_dma_disable(_currentSetting->spi_d); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiRxDmaChannel); + if (_currentSetting->receiveCallback) + _currentSetting->receiveCallback(); + break; + case SPI_STATE_TRANSMIT: + _currentSetting->state = SPI_STATE_READY; + spi_tx_dma_disable(_currentSetting->spi_d); + //dma_disable(_currentSetting->spiDmaDev, _currentSetting->spiTxDmaChannel); + if (_currentSetting->transmitCallback) + _currentSetting->transmitCallback(); + break; + default: + break; + } +} + +void SPIClass::attachInterrupt() { + // Should be enableInterrupt() +} + +void SPIClass::detachInterrupt() { + // Should be disableInterrupt() +} + +/** + * Pin accessors + */ + +uint8_t SPIClass::misoPin() { + return dev_to_spi_pins(_currentSetting->spi_d)->miso; +} + +uint8_t SPIClass::mosiPin() { + return dev_to_spi_pins(_currentSetting->spi_d)->mosi; +} + +uint8_t SPIClass::sckPin() { + return dev_to_spi_pins(_currentSetting->spi_d)->sck; +} + +uint8_t SPIClass::nssPin() { + return dev_to_spi_pins(_currentSetting->spi_d)->nss; +} + +/** + * Deprecated functions + */ +uint8_t SPIClass::send(uint8_t data) { write(data); return 1; } +uint8_t SPIClass::send(uint8_t *buf, uint32_t len) { write(buf, len); return len; } +uint8_t SPIClass::recv() { return read(); } + +/** + * DMA call back functions, one per port. + */ +#if BOARD_NR_SPI >= 1 + void SPIClass::_spi1EventCallback() { + reinterpret_cast(_spi1_this)->EventCallback(); + } +#endif +#if BOARD_NR_SPI >= 2 + void SPIClass::_spi2EventCallback() { + reinterpret_cast(_spi2_this)->EventCallback(); + } +#endif +#if BOARD_NR_SPI >= 3 + void SPIClass::_spi3EventCallback() { + reinterpret_cast(_spi3_this)->EventCallback(); + } +#endif + +/** + * Auxiliary functions + */ +static const spi_pins* dev_to_spi_pins(spi_dev *dev) { + switch (dev->clk_id) { + #if BOARD_NR_SPI >= 1 + case RCC_SPI1: return board_spi_pins; + #endif + #if BOARD_NR_SPI >= 2 + case RCC_SPI2: return board_spi_pins + 1; + #endif + #if BOARD_NR_SPI >= 3 + case RCC_SPI3: return board_spi_pins + 2; + #endif + default: return NULL; + } +} + +static void disable_pwm(const stm32_pin_info *i) { + if (i->timer_device) + timer_set_mode(i->timer_device, i->timer_channel, TIMER_DISABLED); +} + +static void configure_gpios(spi_dev *dev, bool as_master) { + const spi_pins *pins = dev_to_spi_pins(dev); + if (!pins) return; + + const stm32_pin_info *nssi = &PIN_MAP[pins->nss], + *scki = &PIN_MAP[pins->sck], + *misoi = &PIN_MAP[pins->miso], + *mosii = &PIN_MAP[pins->mosi]; + + disable_pwm(nssi); + disable_pwm(scki); + disable_pwm(misoi); + disable_pwm(mosii); + + spi_config_gpios(dev, as_master, nssi->gpio_device, nssi->gpio_bit, + scki->gpio_device, scki->gpio_bit, misoi->gpio_bit, + mosii->gpio_bit); +} + +static const spi_baud_rate baud_rates[8] __FLASH__ = { + SPI_BAUD_PCLK_DIV_2, + SPI_BAUD_PCLK_DIV_4, + SPI_BAUD_PCLK_DIV_8, + SPI_BAUD_PCLK_DIV_16, + SPI_BAUD_PCLK_DIV_32, + SPI_BAUD_PCLK_DIV_64, + SPI_BAUD_PCLK_DIV_128, + SPI_BAUD_PCLK_DIV_256, +}; + +/** + * Note: This assumes you're on a LeafLabs-style board + * (CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). + */ +static spi_baud_rate determine_baud_rate(spi_dev *dev, uint32_t freq) { + uint32_t clock = 0; + switch (rcc_dev_clk(dev->clk_id)) { + case RCC_AHB: + case RCC_APB2: clock = STM32_PCLK2; break; // 72 Mhz + case RCC_APB1: clock = STM32_PCLK1; break; // 36 Mhz + } + clock >>= 1; + + uint8_t i = 0; + while (i < 7 && freq < clock) { clock >>= 1; i++; } + return baud_rates[i]; +} + +SPIClass SPI(SPI_DEVICE); + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/SPI.h b/Marlin/src/HAL/STM32F1/SPI.h new file mode 100644 index 00000000..0d20a465 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/SPI.h @@ -0,0 +1,420 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ +#pragma once + +#include +#include +#include + +#include +#include +#include + +// SPI_HAS_TRANSACTION means SPI has +// - beginTransaction() +// - endTransaction() +// - usingInterrupt() +// - SPISetting(clock, bitOrder, dataMode) +//#define SPI_HAS_TRANSACTION + +#define SPI_CLOCK_DIV2 SPI_BAUD_PCLK_DIV_2 +#define SPI_CLOCK_DIV4 SPI_BAUD_PCLK_DIV_4 +#define SPI_CLOCK_DIV8 SPI_BAUD_PCLK_DIV_8 +#define SPI_CLOCK_DIV16 SPI_BAUD_PCLK_DIV_16 +#define SPI_CLOCK_DIV32 SPI_BAUD_PCLK_DIV_32 +#define SPI_CLOCK_DIV64 SPI_BAUD_PCLK_DIV_64 +#define SPI_CLOCK_DIV128 SPI_BAUD_PCLK_DIV_128 +#define SPI_CLOCK_DIV256 SPI_BAUD_PCLK_DIV_256 + +/* + * Roger Clark. 20150106 + * Commented out redundant AVR defined + * +#define SPI_MODE_MASK 0x0C // CPOL = bit 3, CPHA = bit 2 on SPCR +#define SPI_CLOCK_MASK 0x03 // SPR1 = bit 1, SPR0 = bit 0 on SPCR +#define SPI_2XCLOCK_MASK 0x01 // SPI2X = bit 0 on SPSR + +// define SPI_AVR_EIMSK for AVR boards with external interrupt pins +#ifdef EIMSK + #define SPI_AVR_EIMSK EIMSK +#elif defined(GICR) + #define SPI_AVR_EIMSK GICR +#elif defined(GIMSK) + #define SPI_AVR_EIMSK GIMSK +#endif +*/ + +#ifndef STM32_LSBFIRST + #define STM32_LSBFIRST 0 +#endif +#ifndef STM32_MSBFIRST + #define STM32_MSBFIRST 1 +#endif + +// PC13 or PA4 +#define BOARD_SPI_DEFAULT_SS PA4 +//#define BOARD_SPI_DEFAULT_SS PC13 + +#define SPI_MODE0 SPI_MODE_0 +#define SPI_MODE1 SPI_MODE_1 +#define SPI_MODE2 SPI_MODE_2 +#define SPI_MODE3 SPI_MODE_3 + +#define DATA_SIZE_8BIT SPI_CR1_DFF_8_BIT +#define DATA_SIZE_16BIT SPI_CR1_DFF_16_BIT + +typedef enum { + SPI_STATE_IDLE, + SPI_STATE_READY, + SPI_STATE_RECEIVE, + SPI_STATE_TRANSMIT, + SPI_STATE_TRANSFER +} spi_mode_t; + +class SPISettings { +public: + SPISettings(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode) { + if (__builtin_constant_p(inClock)) + init_AlwaysInline(inClock, inBitOrder, inDataMode, DATA_SIZE_8BIT); + else + init_MightInline(inClock, inBitOrder, inDataMode, DATA_SIZE_8BIT); + } + SPISettings(uint32_t inClock, BitOrder 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(uint32_t inClock) { + if (__builtin_constant_p(inClock)) + init_AlwaysInline(inClock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + else + init_MightInline(inClock, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + } + SPISettings() { + init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, DATA_SIZE_8BIT); + } +private: + void init_MightInline(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) { + init_AlwaysInline(inClock, inBitOrder, inDataMode, inDataSize); + } + void init_AlwaysInline(uint32_t inClock, BitOrder inBitOrder, uint8_t inDataMode, uint32_t inDataSize) __attribute__((__always_inline__)) { + clock = inClock; + bitOrder = inBitOrder; + dataMode = inDataMode; + dataSize = inDataSize; + //state = SPI_STATE_IDLE; + } + uint32_t clock; + uint32_t dataSize; + uint32_t clockDivider; + BitOrder bitOrder; + uint8_t dataMode; + uint8_t _SSPin; + volatile spi_mode_t state; + spi_dev *spi_d; + dma_channel spiRxDmaChannel, spiTxDmaChannel; + dma_dev* spiDmaDev; + void (*receiveCallback)() = NULL; + void (*transmitCallback)() = NULL; + + friend class SPIClass; +}; + +/* + * Kept for compat. + */ +static const uint8_t ff = 0xFF; + +/** + * @brief Wirish SPI interface. + * + * This implementation uses software slave management, so the caller + * is responsible for controlling the slave select line. + */ +class SPIClass { + +public: + /** + * @param spiPortNumber Number of the SPI port to manage. + */ + SPIClass(uint32_t spiPortNumber); + + /** + * @brief Equivalent to begin(SPI_1_125MHZ, MSBFIRST, 0). + */ + void begin(); + + /** + * @brief Turn on a SPI port and set its GPIO pin modes for use as a slave. + * + * SPI port is enabled in full duplex mode, with software slave management. + * + * @param bitOrder Either LSBFIRST (little-endian) or MSBFIRST(big-endian) + * @param mode SPI mode to use + */ + void beginSlave(uint32_t bitOrder, uint32_t mode); + + /** + * @brief Equivalent to beginSlave(MSBFIRST, 0). + */ + void beginSlave(); + + /** + * @brief Disables the SPI port, but leaves its GPIO pin modes unchanged. + */ + void end(); + + void beginTransaction(const SPISettings &settings) { beginTransaction(BOARD_SPI_DEFAULT_SS, settings); } + void beginTransaction(uint8_t pin, const SPISettings &settings); + void endTransaction(); + + void beginTransactionSlave(const SPISettings &settings); + + void setClockDivider(uint32_t clockDivider); + void setBitOrder(BitOrder bitOrder); + void setDataMode(uint8_t dataMode); + + // SPI Configuration methods + void attachInterrupt(); + void detachInterrupt(); + + /* Victor Perez. Added to change datasize from 8 to 16 bit modes on the fly. + * Input parameter should be SPI_CR1_DFF set to 0 or 1 on a 32bit word. + * Requires an added function spi_data_size on STM32F1 / cores / maple / libmaple / spi.c + */ + 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 + * onTransmit used to set the callback in case of dmaSend (tx only). That function + * will NOT be called in case of TX/RX + */ + void onReceive(void(*)()); + void onTransmit(void(*)()); + + /* + * I/O + */ + + /** + * @brief Return the next unread byte/word. + * + * If there is no unread byte/word waiting, this function will block + * until one is received. + */ + uint16_t read(); + + /** + * @brief Read length bytes, storing them into buffer. + * @param buffer Buffer to store received bytes into. + * @param length Number of bytes to store in buffer. This + * function will block until the desired number of + * bytes have been read. + */ + void read(uint8_t *buffer, uint32_t length); + + /** + * @brief Transmit one byte/word. + * @param data to transmit. + */ + void write(uint16_t data); + void write16(uint16_t data); // write 2 bytes in 8 bit mode (DFF=0) + + /** + * @brief Transmit one byte/word a specified number of times. + * @param data to transmit. + */ + void write(uint16_t data, uint32_t n); + + /** + * @brief Transmit multiple bytes/words. + * @param buffer Bytes/words to transmit. + * @param length Number of bytes/words in buffer to transmit. + */ + void write(const void * buffer, uint32_t length); + + /** + * @brief Transmit a byte, then return the next unread byte. + * + * This function transmits before receiving. + * + * @param data Byte to transmit. + * @return Next unread byte. + */ + uint8_t transfer(uint8_t data) const; + uint16_t transfer16(uint16_t data) const; + + /** + * @brief Sets up a DMA Transfer for "length" bytes. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. + * + * This function transmits and receives to buffers. + * + * @param transmitBuf buffer Bytes to transmit. If passed as 0, it sends FF repeatedly for "length" bytes + * @param receiveBuf buffer Bytes to save received data. + * @param length Number of bytes in buffer to transmit. + */ + uint8_t dmaTransfer(const void * transmitBuf, void * receiveBuf, uint16_t length); + void dmaTransferSet(const void *transmitBuf, void *receiveBuf); + uint8_t dmaTransferRepeat(uint16_t length); + + /** + * @brief Sets up a DMA Transmit for SPI 8 or 16 bit transfer mode. + * The transfer mode (8 or 16 bit mode) is evaluated from the SPI peripheral setting. + * + * This function only transmits and does not care about the RX fifo. + * + * @param data buffer half words to transmit, + * @param length Number of bytes in buffer to transmit. + * @param minc Set to use Memory Increment mode, clear to use Circular mode. + */ + uint8_t dmaSend(const void * transmitBuf, uint16_t length, bool minc = 1); + void dmaSendSet(const void * transmitBuf, bool minc); + uint8_t dmaSendRepeat(uint16_t length); + + uint8_t dmaSendAsync(const void * transmitBuf, uint16_t length, bool minc = 1); + /* + * Pin accessors + */ + + /** + * @brief Return the number of the MISO (master in, slave out) pin + */ + uint8_t misoPin(); + + /** + * @brief Return the number of the MOSI (master out, slave in) pin + */ + uint8_t mosiPin(); + + /** + * @brief Return the number of the SCK (serial clock) pin + */ + uint8_t sckPin(); + + /** + * @brief Return the number of the NSS (slave select) pin + */ + uint8_t nssPin(); + + /* Escape hatch */ + + /** + * @brief Get a pointer to the underlying libmaple spi_dev for + * this HardwareSPI instance. + */ + spi_dev* c_dev() { return _currentSetting->spi_d; } + + spi_dev* dev() { return _currentSetting->spi_d; } + + /** + * @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(int spi_num) { + _currentSetting = &_settings[spi_num - 1];// SPI channels are called 1 2 and 3 but the array is zero indexed + } + + /* -- The following methods are deprecated --------------------------- */ + + /** + * @brief Deprecated. + * + * Use HardwareSPI::transfer() instead. + * + * @see HardwareSPI::transfer() + */ + uint8_t send(uint8_t data); + + /** + * @brief Deprecated. + * + * Use HardwareSPI::write() in combination with + * HardwareSPI::read() (or HardwareSPI::transfer()) instead. + * + * @see HardwareSPI::write() + * @see HardwareSPI::read() + * @see HardwareSPI::transfer() + */ + uint8_t send(uint8_t *data, uint32_t length); + + /** + * @brief Deprecated. + * + * Use HardwareSPI::read() instead. + * + * @see HardwareSPI::read() + */ + uint8_t recv(); + +private: + + SPISettings _settings[BOARD_NR_SPI]; + SPISettings *_currentSetting; + + void updateSettings(); + + /* + * Functions added for DMA transfers with Callback. + * Experimental. + */ + + void EventCallback(); + + #if BOARD_NR_SPI >= 1 + static void _spi1EventCallback(); + #endif + #if BOARD_NR_SPI >= 2 + static void _spi2EventCallback(); + #endif + #if BOARD_NR_SPI >= 3 + static void _spi3EventCallback(); + #endif + /* + spi_dev *spi_d; + uint8_t _SSPin; + uint32_t clockDivider; + uint8_t dataMode; + BitOrder bitOrder; + */ +}; + +/** + * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. + */ +static inline void waitSpiTxEnd(spi_dev *spi_d) { + while (spi_is_tx_empty(spi_d) == 0) { /* nada */ } // wait until TXE=1 + while (spi_is_busy(spi_d) != 0) { /* nada */ } // wait until BSY=0 +} + +extern SPIClass SPI; diff --git a/Marlin/src/HAL/STM32F1/Servo.cpp b/Marlin/src/HAL/STM32F1/Servo.cpp new file mode 100644 index 00000000..e1ee8314 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/Servo.cpp @@ -0,0 +1,226 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 HAS_SERVOS + +uint8_t ServoCount = 0; + +#include "Servo.h" + +//#include "Servo.h" + +#include +#include +#include +#include + +/** + * 20 millisecond period config. For a 1-based prescaler, + * + * (prescaler * overflow / CYC_MSEC) msec = 1 timer cycle = 20 msec + * => prescaler * overflow = 20 * CYC_MSEC + * + * This uses the smallest prescaler that allows an overflow < 2^16. + */ +#define MAX_OVERFLOW UINT16_MAX //((1 << 16) - 1) +#define CYC_MSEC (1000 * CYCLES_PER_MICROSECOND) +#define TAU_MSEC 20 +#define TAU_USEC (TAU_MSEC * 1000) +#define TAU_CYC (TAU_MSEC * CYC_MSEC) +#define SERVO_PRESCALER (TAU_CYC / MAX_OVERFLOW + 1) +#define SERVO_OVERFLOW ((uint16_t)round((double)TAU_CYC / SERVO_PRESCALER)) + +// Unit conversions +#define US_TO_COMPARE(us) uint16_t(map((us), 0, TAU_USEC, 0, SERVO_OVERFLOW)) +#define COMPARE_TO_US(c) uint32_t(map((c), 0, SERVO_OVERFLOW, 0, TAU_USEC)) +#define ANGLE_TO_US(a) uint16_t(map((a), minAngle, maxAngle, SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW)) +#define US_TO_ANGLE(us) int16_t(map((us), SERVO_DEFAULT_MIN_PW, SERVO_DEFAULT_MAX_PW, minAngle, maxAngle)) + +void libServo::servoWrite(uint8_t inPin, uint16_t duty_cycle) { + #ifdef SERVO0_TIMER_NUM + if (servoIndex == 0) { + pwmSetDuty(duty_cycle); + return; + } + #endif + + timer_dev *tdev = PIN_MAP[inPin].timer_device; + uint8_t tchan = PIN_MAP[inPin].timer_channel; + if (tdev) timer_set_compare(tdev, tchan, 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) { + if (servoIndex >= MAX_SERVOS) return false; + if (inPin >= BOARD_NR_GPIO_PINS) return false; + + minAngle = inMinAngle; + maxAngle = inMaxAngle; + angle = -1; + + #ifdef SERVO0_TIMER_NUM + if (servoIndex == 0 && setupSoftPWM(inPin)) { + pin = inPin; // set attached() + return true; + } + #endif + + if (!PWM_PIN(inPin)) return false; + + timer_dev *tdev = PIN_MAP[inPin].timer_device; + //uint8_t tchan = PIN_MAP[inPin].timer_channel; + + SET_PWM(inPin); + servoWrite(inPin, 0); + + timer_pause(tdev); + timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based + timer_set_reload(tdev, SERVO_OVERFLOW); + timer_generate_update(tdev); + timer_resume(tdev); + + pin = inPin; // set attached() + return true; +} + +bool libServo::detach() { + if (!attached()) return false; + angle = -1; + servoWrite(pin, 0); + return true; +} + +int32_t libServo::read() const { + if (attached()) { + #ifdef SERVO0_TIMER_NUM + if (servoIndex == 0) return angle; + #endif + timer_dev *tdev = PIN_MAP[pin].timer_device; + uint8_t tchan = PIN_MAP[pin].timer_channel; + return US_TO_ANGLE(COMPARE_TO_US(timer_get_compare(tdev, tchan))); + } + return 0; +} + +void libServo::move(const int32_t value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + + if (attached()) { + angle = constrain(value, minAngle, maxAngle); + servoWrite(pin, US_TO_COMPARE(ANGLE_TO_US(angle))); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +#ifdef SERVO0_TIMER_NUM + extern "C" void Servo_IRQHandler() { + static timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); + uint16_t SR = timer_get_status(tdev); + if (SR & TIMER_SR_CC1IF) { // channel 1 off + #ifdef SERVO0_PWM_OD + OUT_WRITE_OD(SERVO0_PIN, 1); // off + #else + OUT_WRITE(SERVO0_PIN, 0); + #endif + timer_reset_status_bit(tdev, TIMER_SR_CC1IF_BIT); + } + if (SR & TIMER_SR_CC2IF) { // channel 2 resume + #ifdef SERVO0_PWM_OD + OUT_WRITE_OD(SERVO0_PIN, 0); // on + #else + OUT_WRITE(SERVO0_PIN, 1); + #endif + timer_reset_status_bit(tdev, TIMER_SR_CC2IF_BIT); + } + } + + bool libServo::setupSoftPWM(const int32_t inPin) { + timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); + if (!tdev) return false; + #ifdef SERVO0_PWM_OD + OUT_WRITE_OD(inPin, 1); + #else + OUT_WRITE(inPin, 0); + #endif + + timer_pause(tdev); + timer_set_mode(tdev, 1, TIMER_OUTPUT_COMPARE); // counter with isr + timer_oc_set_mode(tdev, 1, TIMER_OC_MODE_FROZEN, 0); // no pin output change + timer_oc_set_mode(tdev, 2, TIMER_OC_MODE_FROZEN, 0); // no pin output change + timer_set_prescaler(tdev, SERVO_PRESCALER - 1); // prescaler is 1-based + timer_set_reload(tdev, SERVO_OVERFLOW); + timer_set_compare(tdev, 1, SERVO_OVERFLOW); + timer_set_compare(tdev, 2, SERVO_OVERFLOW); + timer_attach_interrupt(tdev, 1, Servo_IRQHandler); + timer_attach_interrupt(tdev, 2, Servo_IRQHandler); + timer_generate_update(tdev); + timer_resume(tdev); + + return true; + } + + void libServo::pwmSetDuty(const uint16_t duty_cycle) { + timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); + timer_set_compare(tdev, 1, duty_cycle); + timer_generate_update(tdev); + if (duty_cycle) { + timer_enable_irq(tdev, 1); + timer_enable_irq(tdev, 2); + } + else { + timer_disable_irq(tdev, 1); + timer_disable_irq(tdev, 2); + #ifdef SERVO0_PWM_OD + OUT_WRITE_OD(pin, 1); // off + #else + OUT_WRITE(pin, 0); + #endif + } + } + + void libServo::pauseSoftPWM() { // detach + timer_dev *tdev = get_timer_dev(SERVO0_TIMER_NUM); + timer_pause(tdev); + pwmSetDuty(0); + } + +#else + + bool libServo::setupSoftPWM(const int32_t inPin) { return false; } + void libServo::pwmSetDuty(const uint16_t duty_cycle) {} + void libServo::pauseSoftPWM() {} + +#endif + +#endif // HAS_SERVOS + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/Servo.h b/Marlin/src/HAL/STM32F1/Servo.h new file mode 100644 index 00000000..b6143de8 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/Servo.h @@ -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 + * Copyright (c) 2017 Victor Perez + * + * 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 + +// Pin number of unattached pins +#define NOT_ATTACHED (-1) +#define INVALID_SERVO 255 + +#ifndef MAX_SERVOS + #define MAX_SERVOS 3 +#endif + +#define SERVO_DEFAULT_MIN_PW 544 +#define SERVO_DEFAULT_MAX_PW 2400 +#define SERVO_DEFAULT_MIN_ANGLE 0 +#define SERVO_DEFAULT_MAX_ANGLE 180 + +#define HAL_SERVO_LIB libServo + +class libServo { + public: + libServo(); + bool attach(const int32_t pin, const int32_t minAngle=SERVO_DEFAULT_MIN_ANGLE, const int32_t maxAngle=SERVO_DEFAULT_MAX_ANGLE); + bool attached() const { return pin != NOT_ATTACHED; } + bool detach(); + void move(const int32_t value); + int32_t read() const; + private: + void servoWrite(uint8_t pin, const uint16_t duty_cycle); + + uint8_t servoIndex; // index into the channel data for this servo + int32_t pin = NOT_ATTACHED; + int32_t minAngle; + int32_t maxAngle; + int32_t angle; + + bool setupSoftPWM(const int32_t pin); + void pauseSoftPWM(); + void pwmSetDuty(const uint16_t duty_cycle); +}; diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp new file mode 100644 index 00000000..993403cf --- /dev/null +++ b/Marlin/src/HAL/STM32F1/SoftwareSerial.cpp @@ -0,0 +1,60 @@ +/** + * 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 . + * + */ +#if defined(__STM32F1__) && !defined(HAVE_SW_SERIAL) + +/** + * Empty class for Software Serial implementation (Custom RX/TX pins) + * + * TODO: Optionally use https://github.com/FYSETC/SoftwareSerialM if TMC UART is wanted + */ + +#include "SoftwareSerial.h" + +// Constructor + +SoftwareSerial::SoftwareSerial(int8_t RX_pin, int8_t TX_pin) {} + +// Public + +void SoftwareSerial::begin(const uint32_t baudrate) { +} + +bool SoftwareSerial::available() { + return false; +} + +uint8_t SoftwareSerial::read() { + return 0; +} + +uint16_t SoftwareSerial::write(uint8_t byte) { + return 0; +} + +void SoftwareSerial::flush() {} + +void SoftwareSerial::listen() { + listening = true; +} + +void SoftwareSerial::stopListening() { + listening = false; +} + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/SoftwareSerial.h b/Marlin/src/HAL/STM32F1/SoftwareSerial.h new file mode 100644 index 00000000..1c805866 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/SoftwareSerial.h @@ -0,0 +1,44 @@ +/** + * 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 + +#include + +#ifndef HAVE_SW_SERIAL + #define SW_SERIAL_PLACEHOLDER 1 +#endif + +class SoftwareSerial { +public: + SoftwareSerial(int8_t RX_pin, int8_t TX_pin); + + void begin(const uint32_t baudrate); + + bool available(); + + uint8_t read(); + uint16_t write(uint8_t byte); + void flush(); + + void listen(); + void stopListening(); + +protected: + bool listening; +}; diff --git a/Marlin/src/HAL/STM32F1/build_flags.py b/Marlin/src/HAL/STM32F1/build_flags.py new file mode 100644 index 00000000..98c871a1 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/build_flags.py @@ -0,0 +1,53 @@ +from __future__ import print_function +import sys + +#dynamic build flags for generic compile options +if __name__ == "__main__": + args = " ".join([ "-std=gnu11", + "-Os", + "-mcpu=cortex-m3", + "-mthumb", + + "-fsigned-char", + "-fno-move-loop-invariants", + "-fno-strict-aliasing", + + "--specs=nano.specs", + "--specs=nosys.specs", + + "-IMarlin/src/HAL/STM32F1", + + "-MMD", + "-MP", + "-DTARGET_STM32F1" + ]) + + for i in range(1, len(sys.argv)): + args += " " + sys.argv[i] + + print(args) + +# extra script for linker options +else: + from SCons.Script import DefaultEnvironment + env = DefaultEnvironment() + env.Append( + ARFLAGS=["rcs"], + + ASFLAGS=["-x", "assembler-with-cpp"], + + CXXFLAGS=[ + "-fabi-version=0", + "-fno-use-cxa-atexit", + "-fno-threadsafe-statics" + ], + LINKFLAGS=[ + "-Os", + "-mcpu=cortex-m3", + "-ffreestanding", + "-mthumb", + "--specs=nano.specs", + "--specs=nosys.specs", + "-u_printf_float", + ], + ) diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp new file mode 100644 index 00000000..60596054 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp @@ -0,0 +1,164 @@ +/** + * 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_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + +#include + +#undef SPI_SPEED +#define SPI_SPEED 0 // Fastest +//#define SPI_SPEED 2 // Slower + +static uint8_t SPI_speed = SPI_SPEED; + +static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { + LOOP_L_N(i, 8) { + if (spi_speed == 0) { + WRITE(DOGLCD_MOSI, !!(b & 0x80)); + WRITE(DOGLCD_SCK, HIGH); + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + WRITE(DOGLCD_SCK, LOW); + } + else { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + LOOP_L_N(j, spi_speed) + WRITE(DOGLCD_MOSI, state); + + LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + WRITE(DOGLCD_SCK, HIGH); + + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + + LOOP_L_N(j, spi_speed) + WRITE(DOGLCD_SCK, LOW); + } + } + return b; +} + +static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { + LOOP_L_N(i, 8) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + if (spi_speed == 0) { + WRITE(DOGLCD_SCK, LOW); + WRITE(DOGLCD_MOSI, state); + WRITE(DOGLCD_MOSI, state); // need some setup time + WRITE(DOGLCD_SCK, HIGH); + } + else { + LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + WRITE(DOGLCD_SCK, LOW); + + LOOP_L_N(j, spi_speed) + WRITE(DOGLCD_MOSI, state); + + LOOP_L_N(j, spi_speed) + WRITE(DOGLCD_SCK, HIGH); + } + b <<= 1; + if (miso_pin >= 0 && READ(miso_pin)) b |= 1; + } + return b; +} + +static void u8g_sw_spi_HAL_STM32F1_shift_out(uint8_t val) { + #if ENABLED(FYSETC_MINI_12864) + swSpiTransfer_mode_3(val, SPI_speed); + #else + swSpiTransfer_mode_0(val, SPI_speed); + #endif +} + +static uint8_t swSpiInit(const uint8_t spi_speed) { + #if PIN_EXISTS(LCD_RESET) + SET_OUTPUT(LCD_RESET_PIN); + #endif + SET_OUTPUT(DOGLCD_A0); + OUT_WRITE(DOGLCD_SCK, LOW); + OUT_WRITE(DOGLCD_MOSI, LOW); + OUT_WRITE(DOGLCD_CS, HIGH); + return spi_speed; +} + +uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + SPI_speed = swSpiInit(SPI_SPEED); + break; + + case U8G_COM_MSG_STOP: + break; + + case U8G_COM_MSG_RESET: + #if PIN_EXISTS(LCD_RESET) + WRITE(LCD_RESET_PIN, arg_val); + #endif + break; + + case U8G_COM_MSG_CHIP_SELECT: + #if ENABLED(FYSETC_MINI_12864) // This LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active + WRITE(DOGLCD_CS, LOW); + } + else { + WRITE(DOGLCD_CS, HIGH); + WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive + } + #else + WRITE(DOGLCD_CS, !arg_val); + #endif + break; + + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_HAL_STM32F1_shift_out(arg_val); + break; + + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_STM32F1_shift_out(*ptr++); + arg_val--; + } + } break; + + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t *ptr = (uint8_t *)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_HAL_STM32F1_shift_out(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + WRITE(DOGLCD_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI +#endif // STM32F1 diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp new file mode 100644 index 00000000..658b7cd4 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -0,0 +1,84 @@ +/** + * 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. + */ + +#ifdef __STM32F1__ + +#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 +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp new file mode 100644 index 00000000..8db8c863 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp @@ -0,0 +1,113 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 . + * + */ + +/** + * persistent_store_flash.cpp + * HAL for stm32duino and compatible (STM32F1) + * Implementation of EEPROM settings in SDCard + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" + +#include +#include + +// Store settings in the last two pages +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE ((EEPROM_PAGE_SIZE) * 2) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; +static bool eeprom_dirty = false; + +bool PersistentStore::access_start() { + const uint32_t* source = reinterpret_cast(EEPROM_PAGE0_BASE); + uint32_t* destination = reinterpret_cast(ram_eeprom); + + static_assert(0 == (MARLIN_EEPROM_SIZE) % 4, "MARLIN_EEPROM_SIZE is corrupted. (Must be a multiple of 4.)"); // Ensure copying as uint32_t is safe + constexpr size_t eeprom_size_u32 = (MARLIN_EEPROM_SIZE) / 4; + + for (size_t i = 0; i < eeprom_size_u32; ++i, ++destination, ++source) + *destination = *source; + + eeprom_dirty = false; + return true; +} + +bool PersistentStore::access_finish() { + + if (eeprom_dirty) { + FLASH_Status status; + + // Instead of erasing all (both) pages, maybe in the loop we check what page we are in, and if the + // data has changed in that page. We then erase the first time we "detect" a change. In theory, if + // nothing changed in a page, we wouldn't need to erase/write it. + // Or, instead of checking at this point, turn eeprom_dirty into an array of bool the size of number + // of pages. Inside write_data, we set the flag to true at that time if something in that + // page changes...either way, something to look at later. + FLASH_Unlock(); + + #define ACCESS_FINISHED(TF) { FLASH_Lock(); eeprom_dirty = false; return TF; } + + status = FLASH_ErasePage(EEPROM_PAGE0_BASE); + if (status != FLASH_COMPLETE) ACCESS_FINISHED(true); + status = FLASH_ErasePage(EEPROM_PAGE1_BASE); + if (status != FLASH_COMPLETE) ACCESS_FINISHED(true); + + const uint16_t *source = reinterpret_cast(ram_eeprom); + for (size_t i = 0; i < MARLIN_EEPROM_SIZE; i += 2, ++source) { + if (FLASH_ProgramHalfWord(EEPROM_PAGE0_BASE + i, *source) != FLASH_COMPLETE) + ACCESS_FINISHED(false); + } + + ACCESS_FINISHED(true); + } + + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + for (size_t i = 0; i < size; ++i) ram_eeprom[pos + i] = value[i]; + eeprom_dirty = true; + crc16(crc, value, size); + pos += size; + return false; // return true for any error +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + const uint8_t * const buff = writing ? &value[0] : &ram_eeprom[pos]; + if (writing) for (size_t i = 0; i < size; i++) value[i] = ram_eeprom[pos + i]; + crc16(crc, buff, size); + pos += size; + return false; // return true for any error +} + +#endif // FLASH_EEPROM_EMULATION +#endif // __STM32F1__ 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 00000000..ccc3fc53 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp @@ -0,0 +1,54 @@ +/** + * 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. + */ + +#ifdef __STM32F1__ + +#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 +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp b/Marlin/src/HAL/STM32F1/eeprom_sdcard.cpp new file mode 100644 index 00000000..11959191 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_sdcard.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 . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + * Implementation of EEPROM settings in SD Card + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SDCARD_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" +#include "../../sd/cardreader.h" + +#define EEPROM_FILENAME "eeprom.dat" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +#define _ALIGN(x) __attribute__ ((aligned(x))) // SDIO uint32_t* compat. +static char _ALIGN(4) HAL_eeprom_data[MARLIN_EEPROM_SIZE]; + +bool PersistentStore::access_start() { + if (!card.isMounted()) return false; + + SdFile file, root = card.getroot(); + if (!file.open(&root, EEPROM_FILENAME, O_RDONLY)) + return true; // false aborts the save + + int bytes_read = file.read(HAL_eeprom_data, MARLIN_EEPROM_SIZE); + if (bytes_read < 0) return false; + for (; bytes_read < MARLIN_EEPROM_SIZE; bytes_read++) + HAL_eeprom_data[bytes_read] = 0xFF; + file.close(); + return true; +} + +bool PersistentStore::access_finish() { + if (!card.isMounted()) return false; + + SdFile file, root = card.getroot(); + int bytes_written = 0; + if (file.open(&root, EEPROM_FILENAME, O_CREAT | O_WRITE | O_TRUNC)) { + bytes_written = file.write(HAL_eeprom_data, MARLIN_EEPROM_SIZE); + file.close(); + } + return (bytes_written == MARLIN_EEPROM_SIZE); +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + for (size_t i = 0; i < size; i++) + HAL_eeprom_data[pos + i] = value[i]; + crc16(crc, value, size); + pos += size; + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) { + for (size_t i = 0; i < size; i++) { + uint8_t c = HAL_eeprom_data[pos + i]; + if (writing) value[i] = c; + crc16(crc, &c, 1); + } + pos += size; + return false; +} + +#endif // SDCARD_EEPROM_EMULATION +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp new file mode 100644 index 00000000..fffd6cca --- /dev/null +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -0,0 +1,87 @@ +/** + * 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 . + * + */ + +/** + * HAL PersistentStore for STM32F1 + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for I2C / SPI EEPROM." +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::access_start() { + eeprom_init(); + #if ENABLED(SPI_EEPROM) + #if SPI_CHAN_EEPROM1 == 1 + SET_OUTPUT(BOARD_SPI1_SCK_PIN); + SET_OUTPUT(BOARD_SPI1_MOSI_PIN); + SET_INPUT(BOARD_SPI1_MISO_PIN); + SET_OUTPUT(SPI_EEPROM1_CS); + #endif + spiInit(0); + #endif + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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); + 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing && value) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/endstop_interrupts.h b/Marlin/src/HAL/STM32F1/endstop_interrupts.h new file mode 100644 index 00000000..bcb07d99 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/endstop_interrupts.h @@ -0,0 +1,74 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * Endstop interrupts for Libmaple STM32F1 based targets. + * + * On STM32F, all pins support external interrupt capability. + * Any pin can be used for external interrupts, but there are some restrictions. + * At most 16 different external interrupts can be used at one time. + * Further, you can’t just pick any 16 pins to use. This is because every pin on the STM32 + * connects to what is called an EXTI line, and only one pin per EXTI line can be used for external interrupts at a time + * Check the Reference Manual of the MCU to confirm which line is used by each pin + */ + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/STM32F1/fastio.h b/Marlin/src/HAL/STM32F1/fastio.h new file mode 100644 index 00000000..e0e2e03a --- /dev/null +++ b/Marlin/src/HAL/STM32F1/fastio.h @@ -0,0 +1,186 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * Fast I/O interfaces for STM32F1 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#include + +#define READ(IO) (PIN_MAP[IO].gpio_device->regs->IDR & (1U << PIN_MAP[IO].gpio_bit) ? HIGH : LOW) +#define WRITE(IO,V) (PIN_MAP[IO].gpio_device->regs->BSRR = (1U << PIN_MAP[IO].gpio_bit) << ((V) ? 0 : 16)) +#define TOGGLE(IO) (PIN_MAP[IO].gpio_device->regs->ODR = PIN_MAP[IO].gpio_device->regs->ODR ^ (1U << PIN_MAP[IO].gpio_bit)) + +#define _GET_MODE(IO) gpio_get_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit) +#define _SET_MODE(IO,M) gpio_set_mode(PIN_MAP[IO].gpio_device, PIN_MAP[IO].gpio_bit, M) +#define _SET_OUTPUT(IO) _SET_MODE(IO, GPIO_OUTPUT_PP) +#define _SET_OUTPUT_OD(IO) _SET_MODE(IO, GPIO_OUTPUT_OD) + +#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, GPIO_INPUT_FLOATING) +#define SET_INPUT_PULLUP(IO) _SET_MODE(IO, GPIO_INPUT_PU) +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, GPIO_INPUT_PD) +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) +#define SET_PWM(IO) pinMode(IO, PWM) // do{ gpio_set_mode(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit, GPIO_AF_OUTPUT_PP); timer_set_mode(PIN_MAP[pin].timer_device, PIN_MAP[pin].timer_channel, TIMER_PWM); }while(0) +#define SET_PWM_OD(IO) pinMode(IO, PWM_OPEN_DRAIN) + +#define IS_INPUT(IO) (_GET_MODE(IO) == GPIO_INPUT_FLOATING || _GET_MODE(IO) == GPIO_INPUT_ANALOG || _GET_MODE(IO) == GPIO_INPUT_PU || _GET_MODE(IO) == GPIO_INPUT_PD) +#define IS_OUTPUT(IO) (_GET_MODE(IO) == GPIO_OUTPUT_PP || _GET_MODE(IO) == GPIO_OUTPUT_OD) + +#define PWM_PIN(IO) (PIN_MAP[IO].timer_device != nullptr) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +// +// Pins Definitions +// +#define PA0 0x00 +#define PA1 0x01 +#define PA2 0x02 +#define PA3 0x03 +#define PA4 0x04 +#define PA5 0x05 +#define PA6 0x06 +#define PA7 0x07 +#define PA8 0x08 +#define PA9 0x09 +#define PA10 0x0A +#define PA11 0x0B +#define PA12 0x0C +#define PA13 0x0D +#define PA14 0x0E +#define PA15 0x0F + +#define PB0 0x10 +#define PB1 0x11 +#define PB2 0x12 +#define PB3 0x13 +#define PB4 0x14 +#define PB5 0x15 +#define PB6 0x16 +#define PB7 0x17 // 36 pins (F103T) +#define PB8 0x18 +#define PB9 0x19 +#define PB10 0x1A +#define PB11 0x1B +#define PB12 0x1C +#define PB13 0x1D +#define PB14 0x1E +#define PB15 0x1F + +#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8) + #define PC13 0x20 + #define PC14 0x21 + #define PC15 0x22 +#else + #define PC0 0x20 + #define PC1 0x21 + #define PC2 0x22 + #define PC3 0x23 + #define PC4 0x24 + #define PC5 0x25 + #define PC6 0x26 + #define PC7 0x27 + #define PC8 0x28 + #define PC9 0x29 + #define PC10 0x2A + #define PC11 0x2B + #define PC12 0x2C + #define PC13 0x2D + #define PC14 0x2E + #define PC15 0x2F +#endif + +#define PD0 0x30 +#define PD1 0x31 +#define PD2 0x32 // 64 pins (F103R) +#define PD3 0x33 +#define PD4 0x34 +#define PD5 0x35 +#define PD6 0x36 +#define PD7 0x37 +#define PD8 0x38 +#define PD9 0x39 +#define PD10 0x3A +#define PD11 0x3B +#define PD12 0x3C +#define PD13 0x3D +#define PD14 0x3E +#define PD15 0x3F + +#define PE0 0x40 +#define PE1 0x41 +#define PE2 0x42 +#define PE3 0x43 +#define PE4 0x44 +#define PE5 0x45 +#define PE6 0x46 +#define PE7 0x47 +#define PE8 0x48 +#define PE9 0x49 +#define PE10 0x4A +#define PE11 0x4B +#define PE12 0x4C +#define PE13 0x4D +#define PE14 0x4E +#define PE15 0x4F // 100 pins (F103V) + +#define PF0 0x50 +#define PF1 0x51 +#define PF2 0x52 +#define PF3 0x53 +#define PF4 0x54 +#define PF5 0x55 +#define PF6 0x56 +#define PF7 0x57 +#define PF8 0x58 +#define PF9 0x59 +#define PF10 0x5A +#define PF11 0x5B +#define PF12 0x5C +#define PF13 0x5D +#define PF14 0x5E +#define PF15 0x5F + +#define PG0 0x60 +#define PG1 0x61 +#define PG2 0x62 +#define PG3 0x63 +#define PG4 0x64 +#define PG5 0x65 +#define PG6 0x66 +#define PG7 0x67 +#define PG8 0x68 +#define PG9 0x69 +#define PG10 0x6A +#define PG11 0x6B +#define PG12 0x6C +#define PG13 0x6D +#define PG14 0x6E +#define PG15 0x6F // 144 pins (F103Z) diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h new file mode 100644 index 00000000..f52e6fec --- /dev/null +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_LCD.h @@ -0,0 +1,27 @@ +/** + * 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 + +#if ENABLED(USE_USB_COMPOSITE) + //#warning "SD_CHECK_AND_RETRY isn't needed with USE_USB_COMPOSITE." + #undef SD_CHECK_AND_RETRY +#endif diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h new file mode 100644 index 00000000..656fbe1c --- /dev/null +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.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 + +// If no real EEPROM, Flash emulation, or SRAM emulation is available fall back to SD emulation +#if USE_FALLBACK_EEPROM + #define SDCARD_EEPROM_EMULATION +#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 new file mode 100644 index 00000000..9d5026fb --- /dev/null +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -0,0 +1,53 @@ +/** + * 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 + +/** + * Test STM32F1-specific configuration values for errors at compile-time. + */ + +#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 + #warning "With TMC2208/9 consider using SoftwareSerialM with HAVE_SW_SERIAL and appropriate SS_TIMER." + #error "Missing SoftwareSerial implementation." +#endif + +#if ENABLED(SDCARD_EEPROM_EMULATION) && DISABLED(SDSUPPORT) + #undef SDCARD_EEPROM_EMULATION // Avoid additional error noise + #if USE_FALLBACK_EEPROM + #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." + #endif + #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." +#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 diff --git a/Marlin/src/HAL/STM32F1/maple_win_usb_driver/maple_serial.inf b/Marlin/src/HAL/STM32F1/maple_win_usb_driver/maple_serial.inf new file mode 100644 index 00000000..c39f4ce0 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/maple_win_usb_driver/maple_serial.inf @@ -0,0 +1,56 @@ +; +; STMicroelectronics Communication Device Class driver installation file +; (C)2006 Copyright STMicroelectronics +; + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%STM% +LayoutFile=layout.inf + +[Manufacturer] +%MFGNAME%=VirComDevice,NT,NTamd64 + +[DestinationDirs] +DefaultDestDir = 12 + +[VirComDevice.NT] +%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 +%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 + +[VirComDevice.NTamd64] +%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 +%DESCRIPTION%=DriverInstall,USB\VID_1EAF&PID_0029&MI_01 + +[DriverInstall.NT] +Include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=DriverInstall.NT.AddReg + +[DriverInstall.NT.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,usbser.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[DriverInstall.NT.Services] +AddService=usbser, 0x00000002, DriverServiceInst + +[DriverServiceInst] +DisplayName=%SERVICE% +ServiceType=1 +StartType=3 +ErrorControl=1 +ServiceBinary=%12%\usbser.sys + +;------------------------------------------------------------------------------ +; String Definitions +;------------------------------------------------------------------------------ + + +[Strings] +STM = "LeafLabs" +MFGNAME = "LeafLabs" +DESCRIPTION = "Maple R3" +SERVICE = "USB Virtual COM port" diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp new file mode 100644 index 00000000..4f44f2ee --- /dev/null +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -0,0 +1,80 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#if defined(__STM32F1__) && defined(USE_USB_COMPOSITE) + +#include "msc_sd.h" +#include "SPI.h" + +#define PRODUCT_ID 0x29 + +USBMassStorage MarlinMSC; +MarlinUSBCompositeSerial MarlinCompositeSerial; + +#include "../../inc/MarlinConfig.h" + +#if SD_CONNECTION_IS(ONBOARD) + + #include "onboard_sd.h" + + static bool MSC_Write(const uint8_t *writebuff, uint32_t startSector, uint16_t numSectors) { + return (disk_write(0, writebuff, startSector, numSectors) == RES_OK); + } + static bool MSC_Read(uint8_t *readbuff, uint32_t startSector, uint16_t numSectors) { + return (disk_read(0, readbuff, startSector, numSectors) == RES_OK); + } + +#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 + // because when MarlinCompositeSerial.begin() is used in setup() + // it clears all USBComposite devices. + MarlinCompositeSerial.begin(); + USBComposite.end(); + USBComposite.clear(); + // Set api and register mass storage + #if SD_CONNECTION_IS(ONBOARD) + uint32_t cardSize; + if (disk_initialize(0) == RES_OK) { + if (disk_ioctl(0, GET_SECTOR_COUNT, (void *)(&cardSize)) == RES_OK) { + MarlinMSC.setDriveData(0, cardSize, MSC_Read, MSC_Write); + MarlinMSC.registerComponent(); + } + } + #endif + // 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 // __STM32F1__ && USE_USB_COMPOSITE diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h new file mode 100644 index 00000000..1e4e4c44 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -0,0 +1,42 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#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; + inline bool emergency_parser_enabled() { return true; } + #endif +}; + +extern USBMassStorage MarlinMSC; +extern MarlinUSBCompositeSerial MarlinCompositeSerial; + +void MSC_SD_init(); diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.cpp b/Marlin/src/HAL/STM32F1/onboard_sd.cpp new file mode 100644 index 00000000..9c2b128d --- /dev/null +++ b/Marlin/src/HAL/STM32F1/onboard_sd.cpp @@ -0,0 +1,558 @@ +/** + * STM32F1: MMCv3/SDv1/SDv2 (SPI mode) control module + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] + * Copyright (C) 2015, ChaN, all right reserved. + * + * This software is a free software and there is NO WARRANTY. + * No restriction on use. You can use, modify and redistribute it for + * personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. + * Redistributions of source code must retain the above copyright notice. + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if SD_CONNECTION_IS(ONBOARD) + +#include "onboard_sd.h" +#include "SPI.h" +#include "fastio.h" + +#if HAS_SHARED_MEDIA + #ifndef ONBOARD_SPI_DEVICE + #define ONBOARD_SPI_DEVICE SPI_DEVICE + #endif + #define ONBOARD_SD_SPI SPI +#else + SPIClass OnboardSPI(ONBOARD_SPI_DEVICE); + #define ONBOARD_SD_SPI OnboardSPI +#endif + +#if ONBOARD_SPI_DEVICE == 1 + #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_4 +#else + #define SPI_CLOCK_MAX SPI_BAUD_PCLK_DIV_2 +#endif + +#define CS_LOW() WRITE(ONBOARD_SD_CS_PIN, LOW) /* Set OnboardSPI cs low */ +#define CS_HIGH() WRITE(ONBOARD_SD_CS_PIN, HIGH) /* Set OnboardSPI cs high */ + +#define FCLK_FAST() ONBOARD_SD_SPI.setClockDivider(SPI_CLOCK_MAX) +#define FCLK_SLOW() ONBOARD_SD_SPI.setClockDivider(SPI_BAUD_PCLK_DIV_256) + +/*-------------------------------------------------------------------------- + Module Private Functions +---------------------------------------------------------------------------*/ + +/* MMC/SD command */ +#define CMD0 (0) /* GO_IDLE_STATE */ +#define CMD1 (1) /* SEND_OP_COND (MMC) */ +#define ACMD41 (0x80+41) /* SEND_OP_COND (SDC) */ +#define CMD8 (8) /* SEND_IF_COND */ +#define CMD9 (9) /* SEND_CSD */ +#define CMD10 (10) /* SEND_CID */ +#define CMD12 (12) /* STOP_TRANSMISSION */ +#define ACMD13 (0x80+13) /* SD_STATUS (SDC) */ +#define CMD16 (16) /* SET_BLOCKLEN */ +#define CMD17 (17) /* READ_SINGLE_BLOCK */ +#define CMD18 (18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (23) /* SET_BLOCK_COUNT (MMC) */ +#define ACMD23 (0x80+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */ +#define CMD24 (24) /* WRITE_BLOCK */ +#define CMD25 (25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD32 (32) /* ERASE_ER_BLK_START */ +#define CMD33 (33) /* ERASE_ER_BLK_END */ +#define CMD38 (38) /* ERASE */ +#define CMD48 (48) /* READ_EXTR_SINGLE */ +#define CMD49 (49) /* WRITE_EXTR_SINGLE */ +#define CMD55 (55) /* APP_CMD */ +#define CMD58 (58) /* READ_OCR */ + +static volatile DSTATUS Stat = STA_NOINIT; /* Physical drive status */ +static volatile UINT timeout; +static BYTE CardType; /* Card type flags */ + +/*-----------------------------------------------------------------------*/ +/* Send/Receive data to the MMC (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +/* Exchange a byte */ +static BYTE xchg_spi ( + BYTE dat /* Data to send */ +) { + BYTE returnByte = ONBOARD_SD_SPI.transfer(dat); + return returnByte; +} + +/* Receive multiple byte */ +static void rcvr_spi_multi ( + BYTE *buff, /* Pointer to data buffer */ + UINT btr /* Number of bytes to receive (16, 64 or 512) */ +) { + ONBOARD_SD_SPI.dmaTransfer(0, const_cast(buff), btr); +} + +#if _DISKIO_WRITE + + /* Send multiple bytes */ + static void xmit_spi_multi ( + const BYTE *buff, /* Pointer to the data */ + UINT btx /* Number of bytes to send (multiple of 16) */ + ) { + ONBOARD_SD_SPI.dmaSend(const_cast(buff), btx); + } + +#endif // _DISKIO_WRITE + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static int wait_ready ( /* 1:Ready, 0:Timeout */ + UINT wt /* Timeout [ms] */ +) { + BYTE d; + + timeout = millis() + wt; + do { + d = xchg_spi(0xFF); + /* This loop takes a while. Insert rot_rdq() here for multitask environment. */ + } while (d != 0xFF && (timeout > millis())); /* Wait for card goes ready or timeout */ + + return (d == 0xFF) ? 1 : 0; +} + +/*-----------------------------------------------------------------------*/ +/* Deselect card and release SPI */ +/*-----------------------------------------------------------------------*/ + +static void deselect() { + CS_HIGH(); /* CS = H */ + xchg_spi(0xFF); /* Dummy clock (force DO hi-z for multiple slave SPI) */ +} + +/*-----------------------------------------------------------------------*/ +/* Select card and wait for ready */ +/*-----------------------------------------------------------------------*/ + +static int select() { /* 1:OK, 0:Timeout */ + CS_LOW(); /* CS = L */ + xchg_spi(0xFF); /* Dummy clock (force DO enabled) */ + + if (wait_ready(500)) return 1; /* Leading busy check: Wait for card ready */ + + deselect(); /* Timeout */ + return 0; +} + +/*-----------------------------------------------------------------------*/ +/* Control SPI module (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static void power_on() { /* Enable SSP module and attach it to I/O pads */ + ONBOARD_SD_SPI.setModule(ONBOARD_SPI_DEVICE); + ONBOARD_SD_SPI.begin(); + ONBOARD_SD_SPI.setBitOrder(MSBFIRST); + ONBOARD_SD_SPI.setDataMode(SPI_MODE0); + OUT_WRITE(ONBOARD_SD_CS_PIN, HIGH); /* Set CS# high */ +} + +static void power_off() { /* Disable SPI function */ + select(); /* Wait for card ready */ + deselect(); +} + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from the MMC */ +/*-----------------------------------------------------------------------*/ + +static int rcvr_datablock ( /* 1:OK, 0:Error */ + BYTE *buff, /* Data buffer */ + UINT btr /* Data block length (byte) */ +) { + BYTE token; + + timeout = millis() + 200; + do { /* Wait for DataStart token in timeout of 200ms */ + token = xchg_spi(0xFF); + /* This loop will take a while. Insert rot_rdq() here for multitask environment. */ + } while ((token == 0xFF) && (timeout > millis())); + if (token != 0xFE) return 0; /* Function fails if invalid DataStart token or timeout */ + + rcvr_spi_multi(buff, btr); /* Store trailing data to the buffer */ + xchg_spi(0xFF); xchg_spi(0xFF); /* Discard CRC */ + + return 1; /* Function succeeded */ +} + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to the MMC */ +/*-----------------------------------------------------------------------*/ + +#if _DISKIO_WRITE + + static int xmit_datablock ( /* 1:OK, 0:Failed */ + const BYTE *buff, /* Ponter to 512 byte data to be sent */ + BYTE token /* Token */ + ) { + BYTE resp; + + if (!wait_ready(500)) return 0; /* Leading busy check: Wait for card ready to accept data block */ + + xchg_spi(token); /* Send token */ + if (token == 0xFD) return 1; /* Do not send data if token is StopTran */ + + xmit_spi_multi(buff, 512); /* Data */ + xchg_spi(0xFF); xchg_spi(0xFF); /* Dummy CRC */ + + resp = xchg_spi(0xFF); /* Receive data resp */ + + return (resp & 0x1F) == 0x05 ? 1 : 0; /* Data was accepted or not */ + + /* Busy check is done at next transmission */ + } + +#endif // _DISKIO_WRITE + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to the MMC */ +/*-----------------------------------------------------------------------*/ + +static BYTE send_cmd ( /* Return value: R1 resp (bit7==1:Failed to send) */ + BYTE cmd, /* Command index */ + DWORD arg /* Argument */ +) { + BYTE n, res; + + if (cmd & 0x80) { /* Send a CMD55 prior to ACMD */ + cmd &= 0x7F; + res = send_cmd(CMD55, 0); + if (res > 1) return res; + } + + /* Select the card and wait for ready except to stop multiple block read */ + if (cmd != CMD12) { + deselect(); + if (!select()) return 0xFF; + } + + /* Send command packet */ + xchg_spi(0x40 | cmd); /* Start + command index */ + xchg_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xchg_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xchg_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xchg_spi((BYTE)arg); /* Argument[7..0] */ + n = 0x01; /* Dummy CRC + Stop */ + if (cmd == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */ + xchg_spi(n); + + /* Receive command resp */ + if (cmd == CMD12) xchg_spi(0xFF); /* Diacard following one byte when CMD12 */ + n = 10; /* Wait for response (10 bytes max) */ + do + res = xchg_spi(0xFF); + while ((res & 0x80) && --n); + + return res; /* Return received response */ +} + +/*-------------------------------------------------------------------------- + Public Functions +---------------------------------------------------------------------------*/ + +/*-----------------------------------------------------------------------*/ +/* Initialize disk drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive number (0) */ +) { + BYTE n, cmd, ty, ocr[4]; + + if (drv) return STA_NOINIT; /* Supports only drive 0 */ + power_on(); /* Initialize SPI */ + + if (Stat & STA_NODISK) return Stat; /* Is a card existing in the soket? */ + + FCLK_SLOW(); + for (n = 10; n; n--) xchg_spi(0xFF); /* Send 80 dummy clocks */ + + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Put the card SPI state */ + timeout = millis() + 1000; /* Initialization timeout = 1 sec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* Is the catd SDv2? */ + for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); /* Get 32 bit return value of R7 resp */ + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* Does the card support 2.7-3.6V? */ + while ((timeout > millis()) && send_cmd(ACMD41, 1UL << 30)) ; /* Wait for end of initialization with ACMD41(HCS) */ + if ((timeout > millis()) && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ + for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); + ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* Check if the card is SDv2 */ + } + } + } else { /* Not an SDv2 card */ + if (send_cmd(ACMD41, 0) <= 1) { /* SDv1 or MMCv3? */ + ty = CT_SD1; cmd = ACMD41; /* SDv1 (ACMD41(0)) */ + } else { + ty = CT_MMC; cmd = CMD1; /* MMCv3 (CMD1(0)) */ + } + while ((timeout > millis()) && send_cmd(cmd, 0)) ; /* Wait for the card leaves idle state */ + if (!(timeout > millis()) || send_cmd(CMD16, 512) != 0) /* Set block length: 512 */ + ty = 0; + } + } + CardType = ty; /* Card type */ + deselect(); + + if (ty) { /* OK */ + FCLK_FAST(); /* Set fast clock */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT flag */ + } else { /* Failed */ + power_off(); + Stat = STA_NOINIT; + } + + return Stat; +} + +/*-----------------------------------------------------------------------*/ +/* Get disk status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive number (0) */ +) { + if (drv) return STA_NOINIT; /* Supports only drive 0 */ + return Stat; /* Return disk status */ +} + +/*-----------------------------------------------------------------------*/ +/* Read sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive number (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + UINT count /* Number of sectors to read (1..128) */ +) { + BYTE cmd; + + if (drv || !count) return RES_PARERR; /* Check parameter */ + if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check if drive is ready */ + if (!(CardType & CT_BLOCK)) sector *= 512; /* LBA ot BA conversion (byte addressing cards) */ + FCLK_FAST(); + cmd = count > 1 ? CMD18 : CMD17; /* READ_MULTIPLE_BLOCK : READ_SINGLE_BLOCK */ + if (send_cmd(cmd, sector) == 0) { + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + if (cmd == CMD18) send_cmd(CMD12, 0); /* STOP_TRANSMISSION */ + } + deselect(); + + return count ? RES_ERROR : RES_OK; /* Return result */ +} + +/*-----------------------------------------------------------------------*/ +/* Write sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _DISKIO_WRITE + + DRESULT disk_write( + BYTE drv, /* Physical drive number (0) */ + const BYTE *buff, /* Ponter to the data to write */ + DWORD sector, /* Start sector number (LBA) */ + UINT count /* Number of sectors to write (1..128) */ + ) { + if (drv || !count) return RES_PARERR; /* Check parameter */ + if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check drive status */ + if (Stat & STA_PROTECT) return RES_WRPRT; /* Check write protect */ + FCLK_FAST(); + if (!(CardType & CT_BLOCK)) sector *= 512; /* LBA ==> BA conversion (byte addressing cards) */ + + if (count == 1) { /* Single sector write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) { + count = 0; + } + } + else { /* Multiple sector write */ + if (CardType & CT_SDC) send_cmd(ACMD23, count); /* Predefine number of sectors */ + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) count = 1; /* STOP_TRAN token */ + } + } + deselect(); + + return count ? RES_ERROR : RES_OK; /* Return result */ + } + +#endif // _DISKIO_WRITE + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous drive controls other than data read/write */ +/*-----------------------------------------------------------------------*/ + +#if _DISKIO_IOCTL + + DRESULT disk_ioctl ( + BYTE drv, /* Physical drive number (0) */ + BYTE cmd, /* Control command code */ + void *buff /* Pointer to the conrtol data */ + ) { + DRESULT res; + BYTE n, csd[16], *ptr = (BYTE *)buff; + DWORD *dp, st, ed, csize; + #if _DISKIO_ISDIO + SDIO_CMD *sdio = buff; + BYTE rc, *buf; + UINT dc; + #endif + + if (drv) return RES_PARERR; /* Check parameter */ + if (Stat & STA_NOINIT) return RES_NOTRDY; /* Check if drive is ready */ + + res = RES_ERROR; + FCLK_FAST(); + switch (cmd) { + case CTRL_SYNC: /* Wait for end of internal write process of the drive */ + if (select()) res = RES_OK; + break; + + case GET_SECTOR_COUNT: /* Get drive capacity in unit of sector (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + ((DWORD)(csd[7] & 63) << 16) + 1; + *(DWORD*)buff = csize << 10; + } else { /* SDC ver 1.XX or MMC ver 3 */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_BLOCK_SIZE: /* Get erase block size in unit of sector (DWORD) */ + if (CardType & CT_SD2) { /* SDC ver 2.00 */ + if (send_cmd(ACMD13, 0) == 0) { /* Read SD status */ + xchg_spi(0xFF); + if (rcvr_datablock(csd, 16)) { /* Read partial block */ + for (n = 64 - 16; n; n--) xchg_spi(0xFF); /* Purge trailing data */ + *(DWORD*)buff = 16UL << (csd[10] >> 4); + res = RES_OK; + } + } + } else { /* SDC ver 1.XX or MMC */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { /* Read CSD */ + if (CardType & CT_SD1) { /* SDC ver 1.XX */ + *(DWORD*)buff = (((csd[10] & 63) << 1) + ((WORD)(csd[11] & 128) >> 7) + 1) << ((csd[13] >> 6) - 1); + } else { /* MMC */ + *(DWORD*)buff = ((WORD)((csd[10] & 124) >> 2) + 1) * (((csd[11] & 3) << 3) + ((csd[11] & 224) >> 5) + 1); + } + res = RES_OK; + } + } + break; + + case CTRL_TRIM: /* Erase a block of sectors (used when _USE_TRIM in ffconf.h is 1) */ + if (!(CardType & CT_SDC)) break; /* Check if the card is SDC */ + if (disk_ioctl(drv, MMC_GET_CSD, csd)) break; /* Get CSD */ + if (!(csd[0] >> 6) && !(csd[10] & 0x40)) break; /* Check if sector erase can be applied to the card */ + dp = (DWORD *)buff; st = dp[0]; ed = dp[1]; /* Load sector block */ + if (!(CardType & CT_BLOCK)) { + st *= 512; ed *= 512; + } + if (send_cmd(CMD32, st) == 0 && send_cmd(CMD33, ed) == 0 && send_cmd(CMD38, 0) == 0 && wait_ready(30000)) { /* Erase sector block */ + res = RES_OK; /* FatFs does not check result of this command */ + } + break; + + /* Following commands are never used by FatFs module */ + + case MMC_GET_TYPE: /* Get MMC/SDC type (BYTE) */ + *ptr = CardType; + res = RES_OK; + break; + + case MMC_GET_CSD: /* Read CSD (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 && rcvr_datablock(ptr, 16)) { /* READ_CSD */ + res = RES_OK; + } + break; + + case MMC_GET_CID: /* Read CID (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 && rcvr_datablock(ptr, 16)) { /* READ_CID */ + res = RES_OK; + } + break; + + case MMC_GET_OCR: /* Read OCR (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 4; n; n--) *ptr++ = xchg_spi(0xFF); + res = RES_OK; + } + break; + + case MMC_GET_SDSTAT: /* Read SD status (64 bytes) */ + if (send_cmd(ACMD13, 0) == 0) { /* SD_STATUS */ + xchg_spi(0xFF); + if (rcvr_datablock(ptr, 64)) res = RES_OK; + } + break; + + #if _DISKIO_ISDIO + + case ISDIO_READ: + sdio = buff; + if (send_cmd(CMD48, 0x80000000 | sdio->func << 28 | sdio->addr << 9 | ((sdio->ndata - 1) & 0x1FF)) == 0) { + for (Timer1 = 1000; (rc = xchg_spi(0xFF)) == 0xFF && Timer1; ) ; + if (rc == 0xFE) { + for (buf = sdio->data, dc = sdio->ndata; dc; dc--) *buf++ = xchg_spi(0xFF); + for (dc = 514 - sdio->ndata; dc; dc--) xchg_spi(0xFF); + res = RES_OK; + } + } + break; + case ISDIO_WRITE: + sdio = buff; + if (send_cmd(CMD49, 0x80000000 | sdio->func << 28 | sdio->addr << 9 | ((sdio->ndata - 1) & 0x1FF)) == 0) { + xchg_spi(0xFF); xchg_spi(0xFE); + for (buf = sdio->data, dc = sdio->ndata; dc; dc--) xchg_spi(*buf++); + for (dc = 514 - sdio->ndata; dc; dc--) xchg_spi(0xFF); + if ((xchg_spi(0xFF) & 0x1F) == 0x05) res = RES_OK; + } + break; + case ISDIO_MRITE: + sdio = buff; + if (send_cmd(CMD49, 0x84000000 | sdio->func << 28 | sdio->addr << 9 | sdio->ndata >> 8) == 0) { + xchg_spi(0xFF); xchg_spi(0xFE); + xchg_spi(sdio->ndata); + for (dc = 513; dc; dc--) xchg_spi(0xFF); + if ((xchg_spi(0xFF) & 0x1F) == 0x05) res = RES_OK; + } + break; + + #endif // _DISKIO_ISDIO + + default: res = RES_PARERR; + } + + deselect(); + return res; + } + +#endif // _DISKIO_IOCTL + +#endif // SD_CONNECTION_IS(ONBOARD) +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/onboard_sd.h b/Marlin/src/HAL/STM32F1/onboard_sd.h new file mode 100644 index 00000000..1dc7ec5b --- /dev/null +++ b/Marlin/src/HAL/STM32F1/onboard_sd.h @@ -0,0 +1,96 @@ +/*----------------------------------------------------------------------- +/ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] +/ * Copyright (c) 2019 BigTreeTech [https://github.com/bigtreetech] +/ * Low level disk interface module include file (C)ChaN, 2015 +/-----------------------------------------------------------------------*/ + +#pragma once + +#define _DISKIO_WRITE 1 /* 1: Enable disk_write function */ +#define _DISKIO_IOCTL 1 /* 1: Enable disk_ioctl fucntion */ +#define _DISKIO_ISDIO 0 /* 1: Enable iSDIO control fucntion */ + +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned long DWORD; +typedef unsigned int UINT; + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +#if _DISKIO_ISDIO +/* Command structure for iSDIO ioctl command */ +typedef struct { + BYTE func; /* Function number: 0..7 */ + WORD ndata; /* Number of bytes to transfer: 1..512, or mask + data */ + DWORD addr; /* Register address: 0..0x1FFFF */ + void* data; /* Pointer to the data (to be written | read buffer) */ +} SDIO_CMD; +#endif + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + +DSTATUS disk_initialize(BYTE pdrv); +DSTATUS disk_status(BYTE pdrv); +DRESULT disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +#if _DISKIO_WRITE + DRESULT disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +#endif +#if _DISKIO_IOCTL + DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void* buff); +#endif + +/* Disk Status Bits (DSTATUS) */ +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_FORMAT 5 /* Create physical format on the media */ +#define CTRL_POWER_IDLE 6 /* Put the device idle state */ +#define CTRL_POWER_OFF 7 /* Put the device off state */ +#define CTRL_LOCK 8 /* Lock media removal */ +#define CTRL_UNLOCK 9 /* Unlock media removal */ +#define CTRL_EJECT 10 /* Eject media */ + +/* MMC/SDC specific ioctl command (Not used by FatFs) */ +#define MMC_GET_TYPE 50 /* Get card type */ +#define MMC_GET_CSD 51 /* Get CSD */ +#define MMC_GET_CID 52 /* Get CID */ +#define MMC_GET_OCR 53 /* Get OCR */ +#define MMC_GET_SDSTAT 54 /* Get SD status */ +#define ISDIO_READ 55 /* Read data form SD iSDIO register */ +#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ +#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ + +/* ATA/CF specific ioctl command (Not used by FatFs) */ +#define ATA_GET_REV 60 /* Get F/W revision */ +#define ATA_GET_MODEL 61 /* Get model name */ +#define ATA_GET_SN 62 /* Get serial number */ + +/* MMC card type flags (MMC_GET_TYPE) */ +#define CT_MMC 0x01 /* MMC ver 3 */ +#define CT_SD1 0x02 /* SD ver 1 */ +#define CT_SD2 0x04 /* SD ver 2 */ +#define CT_SDC (CT_SD1|CT_SD2) /* SD */ +#define CT_BLOCK 0x08 /* Block addressing */ diff --git a/Marlin/src/HAL/STM32F1/pinsDebug.h b/Marlin/src/HAL/STM32F1/pinsDebug.h new file mode 100644 index 00000000..2d63ebd7 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/pinsDebug.h @@ -0,0 +1,27 @@ +/** + * 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 + +#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) + #include "../STM32/pinsDebug_STM32duino.h" +#elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) + #include "../STM32/pinsDebug_STM32GENERIC.h" +#else + #error "M43 not supported for this board" +#endif diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp new file mode 100644 index 00000000..ffa6db12 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -0,0 +1,303 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 ARDUINO_ARCH_STM32F1 + +#include + +#include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density + +#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + +#include "sdio.h" + +SDIO_CardInfoTypeDef SdCard; + +bool SDIO_Init() { + uint32_t count = 0U; + SdCard.CardType = SdCard.CardVersion = SdCard.Class = SdCard.RelCardAdd = SdCard.BlockNbr = SdCard.BlockSize = SdCard.LogBlockNbr = SdCard.LogBlockSize = 0; + + sdio_begin(); + sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_1BIT); + + dma_init(SDIO_DMA_DEV); + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + dma_set_priority(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, DMA_PRIORITY_MEDIUM); + + if (!SDIO_CmdGoIdleState()) return false; + if (!SDIO_CmdGoIdleState()) return false; /* Hotplugged cards tends to miss first CMD0, so give them a second chance. */ + + SdCard.CardVersion = SDIO_CmdOperCond() ? CARD_V2_X : CARD_V1_X; + + do { + if (count++ == SDMMC_MAX_VOLT_TRIAL) return false; + SDIO_CmdAppOperCommand(SdCard.CardVersion == CARD_V2_X ? SDMMC_HIGH_CAPACITY : SDMMC_STD_CAPACITY); + } while ((SDIO_GetResponse(SDIO_RESP1) & 0x80000000) == 0); + + SdCard.CardType = (SDIO_GetResponse(SDIO_RESP1) & SDMMC_HIGH_CAPACITY) ? CARD_SDHC_SDXC : CARD_SDSC; + + if (!SDIO_CmdSendCID()) return false; + if (!SDIO_CmdSetRelAdd(&SdCard.RelCardAdd)) return false; /* Send CMD3 SET_REL_ADDR with argument 0. SD Card publishes its RCA. */ + if (!SDIO_CmdSendCSD(SdCard.RelCardAdd << 16U)) return false; + + SdCard.Class = (SDIO_GetResponse(SDIO_RESP2) >> 20U); + + if (SdCard.CardType == CARD_SDHC_SDXC) { + SdCard.LogBlockNbr = SdCard.BlockNbr = (((SDIO_GetResponse(SDIO_RESP2) & 0x0000003FU) << 26U) | ((SDIO_GetResponse(SDIO_RESP3) & 0xFFFF0000U) >> 6U)) + 1024; + SdCard.LogBlockSize = SdCard.BlockSize = 512U; + } + else { + SdCard.BlockNbr = ((((SDIO_GetResponse(SDIO_RESP2) & 0x000003FFU) << 2U ) | ((SDIO_GetResponse(SDIO_RESP3) & 0xC0000000U) >> 30U)) + 1U) * (4U << ((SDIO_GetResponse(SDIO_RESP3) & 0x00038000U) >> 15U)); + SdCard.BlockSize = 1U << ((SDIO_GetResponse(SDIO_RESP2) >> 16) & 0x0FU); + SdCard.LogBlockNbr = (SdCard.BlockNbr) * ((SdCard.BlockSize) / 512U); + SdCard.LogBlockSize = 512U; + } + + if (!SDIO_CmdSelDesel(SdCard.RelCardAdd << 16U)) return false; + if (!SDIO_CmdAppSetClearCardDetect(SdCard.RelCardAdd << 16U)) return false; + if (!SDIO_CmdAppSetBusWidth(SdCard.RelCardAdd << 16U, 2)) return false; + + sdio_set_dbus_width(SDIO_CLKCR_WIDBUS_4BIT); + sdio_set_clock(SDIO_CLOCK); + return true; +} + +bool SDIO_ReadBlock_DMA(uint32_t blockAddress, uint8_t *data) { + if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; + if (blockAddress >= SdCard.LogBlockNbr) return false; + if ((0x03 & (uint32_t)data)) return false; // misaligned data + + if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } + + dma_setup_transfer(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, &SDIO->FIFO, DMA_SIZE_32BITS, data, DMA_SIZE_32BITS, DMA_MINC_MODE); + dma_set_num_transfers(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, 128); + dma_clear_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + dma_enable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + + sdio_setup_transfer(SDIO_DATA_TIMEOUT * (F_CPU / 1000U), 512, SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN | SDIO_DIR_RX); + + if (!SDIO_CmdReadSingleBlock(blockAddress)) { + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return false; + } + + while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) { /* wait */ } + + //If there were SDIO errors, do not wait DMA. + if (SDIO->STA & SDIO_STA_TRX_ERROR_FLAGS) { + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return false; + } + + //Wait for DMA transaction to complete + while ((DMA2_BASE->ISR & (DMA_ISR_TEIF4|DMA_ISR_TCIF4)) == 0 ) { /* wait */ } + + if (DMA2_BASE->ISR & DMA_ISR_TEIF4) { + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return false; + } + + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + + if (SDIO->STA & SDIO_STA_RXDAVL) { + while (SDIO->STA & SDIO_STA_RXDAVL) (void)SDIO->FIFO; + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return false; + } + + if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return false; + } + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return true; +} + +bool SDIO_ReadBlock(uint32_t blockAddress, uint8_t *data) { + uint32_t retries = SDIO_READ_RETRIES; + while (retries--) if (SDIO_ReadBlock_DMA(blockAddress, data)) return true; + return false; +} + +uint32_t millis(); + +bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) { + if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; + if (blockAddress >= SdCard.LogBlockNbr) return false; + if ((0x03 & (uint32_t)data)) return false; // misaligned data + + if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } + + dma_setup_transfer(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, &SDIO->FIFO, DMA_SIZE_32BITS, (volatile void *) data, DMA_SIZE_32BITS, DMA_MINC_MODE | DMA_FROM_MEM); + dma_set_num_transfers(SDIO_DMA_DEV, SDIO_DMA_CHANNEL, 128); + dma_clear_isr_bits(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + dma_enable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + + if (!SDIO_CmdWriteSingleBlock(blockAddress)) { + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + return false; + } + + sdio_setup_transfer(SDIO_DATA_TIMEOUT * (F_CPU / 1000U), 512U, SDIO_BLOCKSIZE_512 | SDIO_DCTRL_DMAEN | SDIO_DCTRL_DTEN); + + while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) { /* wait */ } + + dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + + if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + return false; + } + + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); + + uint32_t timeout = millis() + SDIO_WRITE_TIMEOUT; + while (timeout > millis()) { + if (SDIO_GetCardState() == SDIO_CARD_TRANSFER) { + return true; + } + } + return false; +} + +inline uint32_t SDIO_GetCardState() { return SDIO_CmdSendStatus(SdCard.RelCardAdd << 16U) ? (SDIO_GetResponse(SDIO_RESP1) >> 9U) & 0x0FU : SDIO_CARD_ERROR; } + +// ------------------------ +// SD Commands and Responses +// ------------------------ + +void SDIO_SendCommand(uint16_t command, uint32_t argument) { SDIO->ARG = argument; SDIO->CMD = (uint32_t)(SDIO_CMD_CPSMEN | command); } +uint8_t SDIO_GetCommandResponse() { return (uint8_t)(SDIO->RESPCMD); } +uint32_t SDIO_GetResponse(uint32_t response) { return SDIO->RESP[response]; } + +bool SDIO_CmdGoIdleState() { SDIO_SendCommand(CMD0_GO_IDLE_STATE, 0); return SDIO_GetCmdError(); } +bool SDIO_CmdSendCID() { SDIO_SendCommand(CMD2_ALL_SEND_CID, 0); return SDIO_GetCmdResp2(); } +bool SDIO_CmdSetRelAdd(uint32_t *rca) { SDIO_SendCommand(CMD3_SET_REL_ADDR, 0); return SDIO_GetCmdResp6(SDMMC_CMD_SET_REL_ADDR, rca); } +bool SDIO_CmdSelDesel(uint32_t address) { SDIO_SendCommand(CMD7_SEL_DESEL_CARD, address); return SDIO_GetCmdResp1(SDMMC_CMD_SEL_DESEL_CARD); } +bool SDIO_CmdOperCond() { SDIO_SendCommand(CMD8_HS_SEND_EXT_CSD, SDMMC_CHECK_PATTERN); return SDIO_GetCmdResp7(); } +bool SDIO_CmdSendCSD(uint32_t argument) { SDIO_SendCommand(CMD9_SEND_CSD, argument); return SDIO_GetCmdResp2(); } +bool SDIO_CmdSendStatus(uint32_t argument) { SDIO_SendCommand(CMD13_SEND_STATUS, argument); return SDIO_GetCmdResp1(SDMMC_CMD_SEND_STATUS); } +bool SDIO_CmdReadSingleBlock(uint32_t address) { SDIO_SendCommand(CMD17_READ_SINGLE_BLOCK, address); return SDIO_GetCmdResp1(SDMMC_CMD_READ_SINGLE_BLOCK); } +bool SDIO_CmdWriteSingleBlock(uint32_t address) { SDIO_SendCommand(CMD24_WRITE_SINGLE_BLOCK, address); return SDIO_GetCmdResp1(SDMMC_CMD_WRITE_SINGLE_BLOCK); } +bool SDIO_CmdAppCommand(uint32_t rsa) { SDIO_SendCommand(CMD55_APP_CMD, rsa); return SDIO_GetCmdResp1(SDMMC_CMD_APP_CMD); } + +bool SDIO_CmdAppSetBusWidth(uint32_t rsa, uint32_t argument) { + if (!SDIO_CmdAppCommand(rsa)) return false; + SDIO_SendCommand(ACMD6_APP_SD_SET_BUSWIDTH, argument); + return SDIO_GetCmdResp2(); +} + +bool SDIO_CmdAppOperCommand(uint32_t sdType) { + if (!SDIO_CmdAppCommand(0)) return false; + SDIO_SendCommand(ACMD41_SD_APP_OP_COND , SDMMC_VOLTAGE_WINDOW_SD | sdType); + return SDIO_GetCmdResp3(); +} + +bool SDIO_CmdAppSetClearCardDetect(uint32_t rsa) { + if (!SDIO_CmdAppCommand(rsa)) return false; + SDIO_SendCommand(ACMD42_SD_APP_SET_CLR_CARD_DETECT, 0); + return SDIO_GetCmdResp2(); +} + +// Wait until given flags are unset or till timeout +#define SDIO_WAIT(FLAGS) do{ \ + uint32_t count = 1 + (SDIO_CMDTIMEOUT) * ((F_CPU) / 8U / 1000U); \ + do { if (!--count) return false; } while (!SDIO_GET_FLAG(FLAGS)); \ +}while(0) + +bool SDIO_GetCmdError() { + SDIO_WAIT(SDIO_STA_CMDSENT); + + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + return true; +} + +bool SDIO_GetCmdResp1(uint8_t command) { + SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); + + if (SDIO_GET_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT)) { + SDIO_CLEAR_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT); + return false; + } + if (SDIO_GetCommandResponse() != command) return false; + + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + return (SDIO_GetResponse(SDIO_RESP1) & SDMMC_OCR_ERRORBITS) == SDMMC_ALLZERO; +} + +bool SDIO_GetCmdResp2() { + SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); + + if (SDIO_GET_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT)) { + SDIO_CLEAR_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT); + return false; + } + + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + return true; +} + +bool SDIO_GetCmdResp3() { + SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); + + if (SDIO_GET_FLAG(SDIO_STA_CTIMEOUT)) { + SDIO_CLEAR_FLAG(SDIO_STA_CTIMEOUT); + return false; + } + + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + return true; +} + +bool SDIO_GetCmdResp6(uint8_t command, uint32_t *rca) { + SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); + + if (SDIO_GET_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT)) { + SDIO_CLEAR_FLAG(SDIO_STA_CCRCFAIL | SDIO_STA_CTIMEOUT); + return false; + } + if (SDIO_GetCommandResponse() != command) return false; + + SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); + if (SDIO_GetResponse(SDIO_RESP1) & (SDMMC_R6_GENERAL_UNKNOWN_ERROR | SDMMC_R6_ILLEGAL_CMD | SDMMC_R6_COM_CRC_FAILED)) return false; + + *rca = SDIO_GetResponse(SDIO_RESP1) >> 16; + return true; +} + +bool SDIO_GetCmdResp7() { + SDIO_WAIT(SDIO_STA_CCRCFAIL | SDIO_STA_CMDREND | SDIO_STA_CTIMEOUT); + + if (SDIO_GET_FLAG(SDIO_STA_CTIMEOUT)) { + SDIO_CLEAR_FLAG(SDIO_STA_CTIMEOUT); + return false; + } + + if (SDIO_GET_FLAG(SDIO_STA_CMDREND)) { SDIO_CLEAR_FLAG(SDIO_STA_CMDREND); } + return true; +} + +#endif // STM32_HIGH_DENSITY || STM32_XL_DENSITY +#endif // ARDUINO_ARCH_STM32F1 diff --git a/Marlin/src/HAL/STM32F1/sdio.h b/Marlin/src/HAL/STM32F1/sdio.h new file mode 100644 index 00000000..8777299f --- /dev/null +++ b/Marlin/src/HAL/STM32F1/sdio.h @@ -0,0 +1,155 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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" // Allow pins/pins.h to override SDIO clock / retries + +#include +#include + +// ------------------------ +// Defines +// ------------------------ + +#define SDMMC_CMD_GO_IDLE_STATE ((uint8_t)0) /* Resets the SD memory card. */ +#define SDMMC_CMD_ALL_SEND_CID ((uint8_t)2) /* Asks any card connected to the host to send the CID numbers on the CMD line. */ +#define SDMMC_CMD_SET_REL_ADDR ((uint8_t)3) /* Asks the card to publish a new relative address (RCA). */ +#define SDMMC_CMD_SEL_DESEL_CARD ((uint8_t)7) /* Selects the card by its own relative address and gets deselected by any other address */ +#define SDMMC_CMD_HS_SEND_EXT_CSD ((uint8_t)8) /* Sends SD Memory Card interface condition, which includes host supply voltage information and asks the card whether card supports voltage. */ +#define SDMMC_CMD_SEND_CSD ((uint8_t)9) /* Addressed card sends its card specific data (CSD) on the CMD line. */ +#define SDMMC_CMD_SEND_STATUS ((uint8_t)13) /*!< Addressed card sends its status register. */ +#define SDMMC_CMD_READ_SINGLE_BLOCK ((uint8_t)17) /* Reads single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of fixed 512 bytes in case of SDHC and SDXC. */ +#define SDMMC_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24) /* Writes single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of fixed 512 bytes in case of SDHC and SDXC. */ +#define SDMMC_CMD_APP_CMD ((uint8_t)55) /* Indicates to the card that the next command is an application specific command rather than a standard command. */ + +#define SDMMC_ACMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /* (ACMD6) Defines the data bus width to be used for data transfer. The allowed data bus widths are given in SCR register. */ +#define SDMMC_ACMD_SD_APP_OP_COND ((uint8_t)41) /* (ACMD41) Sends host capacity support information (HCS) and asks the accessed card to send its operating condition register (OCR) content in the response on the CMD line. */ +#define SDMMC_ACMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /* (ACMD42) Connect/Disconnect the 50 KOhm pull-up resistor on CD/DAT3 (pin 1) of the card */ + +#define CMD0_GO_IDLE_STATE (uint16_t)(SDMMC_CMD_GO_IDLE_STATE | SDIO_CMD_WAIT_NO_RESP) +#define CMD2_ALL_SEND_CID (uint16_t)(SDMMC_CMD_ALL_SEND_CID | SDIO_CMD_WAIT_LONG_RESP) +#define CMD3_SET_REL_ADDR (uint16_t)(SDMMC_CMD_SET_REL_ADDR | SDIO_CMD_WAIT_SHORT_RESP) +#define CMD7_SEL_DESEL_CARD (uint16_t)(SDMMC_CMD_SEL_DESEL_CARD | SDIO_CMD_WAIT_SHORT_RESP) +#define CMD8_HS_SEND_EXT_CSD (uint16_t)(SDMMC_CMD_HS_SEND_EXT_CSD | SDIO_CMD_WAIT_SHORT_RESP) +#define CMD9_SEND_CSD (uint16_t)(SDMMC_CMD_SEND_CSD | SDIO_CMD_WAIT_LONG_RESP) +#define CMD13_SEND_STATUS (uint16_t)(SDMMC_CMD_SEND_STATUS | SDIO_CMD_WAIT_SHORT_RESP) +#define CMD17_READ_SINGLE_BLOCK (uint16_t)(SDMMC_CMD_READ_SINGLE_BLOCK | SDIO_CMD_WAIT_SHORT_RESP) +#define CMD24_WRITE_SINGLE_BLOCK (uint16_t)(SDMMC_CMD_WRITE_SINGLE_BLOCK | SDIO_CMD_WAIT_SHORT_RESP) +#define CMD55_APP_CMD (uint16_t)(SDMMC_CMD_APP_CMD | SDIO_CMD_WAIT_SHORT_RESP) + +#define ACMD6_APP_SD_SET_BUSWIDTH (uint16_t)(SDMMC_ACMD_APP_SD_SET_BUSWIDTH | SDIO_CMD_WAIT_SHORT_RESP) +#define ACMD41_SD_APP_OP_COND (uint16_t)(SDMMC_ACMD_SD_APP_OP_COND | SDIO_CMD_WAIT_SHORT_RESP) +#define ACMD42_SD_APP_SET_CLR_CARD_DETECT (uint16_t)(SDMMC_ACMD_SD_APP_SET_CLR_CARD_DETECT | SDIO_CMD_WAIT_SHORT_RESP) + + +#define SDMMC_ALLZERO 0x00000000U +#define SDMMC_OCR_ERRORBITS 0xFDFFE008U + +#define SDMMC_R6_GENERAL_UNKNOWN_ERROR 0x00002000U +#define SDMMC_R6_ILLEGAL_CMD 0x00004000U +#define SDMMC_R6_COM_CRC_FAILED 0x00008000U + +#define SDMMC_VOLTAGE_WINDOW_SD 0x80100000U +#define SDMMC_HIGH_CAPACITY 0x40000000U +#define SDMMC_STD_CAPACITY 0x00000000U +#define SDMMC_CHECK_PATTERN 0x000001AAU + +#define SDIO_TRANSFER_MODE_BLOCK 0x00000000U +#define SDIO_DPSM_ENABLE 0x00000001U +#define SDIO_TRANSFER_DIR_TO_CARD 0x00000000U +#define SDIO_DATABLOCK_SIZE_512B 0x00000090U +#define SDIO_TRANSFER_DIR_TO_SDIO 0x00000100U +#define SDIO_DMA_ENABLE 0x00001000U + +#define CARD_V1_X 0x00000000U +#define CARD_V2_X 0x00000001U +#define CARD_SDSC 0x00000000U +#define CARD_SDHC_SDXC 0x00000001U + +#define SDIO_RESP1 0 +#define SDIO_RESP2 1 +#define SDIO_RESP3 2 +#define SDIO_RESP4 3 + +#define SDIO_GET_FLAG(__FLAG__) !!((SDIO->STA) & (__FLAG__)) +#define SDIO_CLEAR_FLAG(__FLAG__) (SDIO->ICR = (__FLAG__)) + +#define SDMMC_MAX_VOLT_TRIAL 0x00000FFFU +#define SDIO_CARD_TRANSFER 0x00000004U /* Card is in transfer state */ +#define SDIO_CARD_ERROR 0x000000FFU /* Card response Error */ +#define SDIO_CMDTIMEOUT 200U /* Command send and response timeout */ +#define SDIO_DATA_TIMEOUT 100U /* Read data transfer timeout */ +#define SDIO_WRITE_TIMEOUT 200U /* Write data transfer timeout */ + +#ifndef SDIO_CLOCK + #define SDIO_CLOCK 18000000 /* 18 MHz */ +#endif + +#ifndef SDIO_READ_RETRIES + #define SDIO_READ_RETRIES 3 +#endif + +// ------------------------ +// Types +// ------------------------ + +typedef struct { + uint32_t CardType; // Card Type + uint32_t CardVersion; // Card version + uint32_t Class; // Class of the card class + uint32_t RelCardAdd; // Relative Card Address + uint32_t BlockNbr; // Card Capacity in blocks + uint32_t BlockSize; // One block size in bytes + uint32_t LogBlockNbr; // Card logical Capacity in blocks + uint32_t LogBlockSize; // Logical block size in bytes +} SDIO_CardInfoTypeDef; + +// ------------------------ +// Public functions +// ------------------------ + +inline uint32_t SDIO_GetCardState(); + +bool SDIO_CmdGoIdleState(); +bool SDIO_CmdSendCID(); +bool SDIO_CmdSetRelAdd(uint32_t *rca); +bool SDIO_CmdSelDesel(uint32_t address); +bool SDIO_CmdOperCond(); +bool SDIO_CmdSendCSD(uint32_t argument); +bool SDIO_CmdSendStatus(uint32_t argument); +bool SDIO_CmdReadSingleBlock(uint32_t address); +bool SDIO_CmdWriteSingleBlock(uint32_t address); +bool SDIO_CmdAppCommand(uint32_t rsa); + +bool SDIO_CmdAppSetBusWidth(uint32_t rsa, uint32_t argument); +bool SDIO_CmdAppOperCommand(uint32_t sdType); +bool SDIO_CmdAppSetClearCardDetect(uint32_t rsa); + +void SDIO_SendCommand(uint16_t command, uint32_t argument); +uint8_t SDIO_GetCommandResponse(); +uint32_t SDIO_GetResponse(uint32_t response); +bool SDIO_GetCmdError(); +bool SDIO_GetCmdResp1(uint8_t command); +bool SDIO_GetCmdResp2(); +bool SDIO_GetCmdResp3(); +bool SDIO_GetCmdResp6(uint8_t command, uint32_t *rca); +bool SDIO_GetCmdResp7(); diff --git a/Marlin/src/HAL/STM32F1/spi_pins.h b/Marlin/src/HAL/STM32F1/spi_pins.h new file mode 100644 index 00000000..8f2b324f --- /dev/null +++ b/Marlin/src/HAL/STM32F1/spi_pins.h @@ -0,0 +1,58 @@ +/** + * 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 + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +/** + * STM32F1 Default SPI Pins + * + * SS SCK MISO MOSI + * +-----------------------------+ + * SPI1 | PA4 PA5 PA6 PA7 | + * SPI2 | PB12 PB13 PB14 PB15 | + * SPI3 | PA15 PB3 PB4 PB5 | + * +-----------------------------+ + * Any pin can be used for Chip Select (SS_PIN) + * SPI1 is enabled by default + */ +#ifndef SCK_PIN + #define SCK_PIN PA5 +#endif +#ifndef MISO_PIN + #define MISO_PIN PA6 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN PA7 +#endif +#ifndef SS_PIN + #define SS_PIN PA4 +#endif +#undef SDSS +#define SDSS SS_PIN + +#if ENABLED(ENABLE_SPI3) + #define SPI_DEVICE 3 +#elif ENABLED(ENABLE_SPI2) + #define SPI_DEVICE 2 +#else + #define SPI_DEVICE 1 +#endif 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 00000000..5b52fb41 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.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/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 ENABLED(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 + + 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); + if ((id & 0xFF00) == 0 && (id & 0xFF) != 0) + 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) { + #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 new file mode 100644 index 00000000..11eb1ffa --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -0,0 +1,71 @@ +/** + * 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_DRIVER 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); } + 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 new file mode 100644 index 00000000..10953899 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -0,0 +1,149 @@ +/** + * 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 OUT_WRITE(TFT_CS_PIN, HIGH) +#define TFT_CS_L OUT_WRITE(TFT_CS_PIN, LOW) + +#define TFT_DC_H OUT_WRITE(TFT_DC_PIN, HIGH) +#define TFT_DC_L OUT_WRITE(TFT_DC_PIN, LOW) + +#define TFT_RST_H OUT_WRITE(TFT_RST_PIN, HIGH) +#define TFT_RST_L OUT_WRITE(TFT_RST_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); + TFT_RST_H; + delay(100); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + // OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + TFT_BLK_H; + #endif + + 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 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(); + 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 + uint8_t d = 0; + uint32_t data = 0; + SPIx.setClockDivider(SPI_CLOCK_DIV16); + DataTransferBegin(DATASIZE_8BIT); + WriteReg(Reg); + + LOOP_L_N(i, 4) { + SPIx.read((uint8_t*)&d, 1); + data = (data << 8) | d; + } + + DataTransferEnd(); + SPIx.setClockDivider(SPI_CLOCK_MAX); + + return data >> 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(); + 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 00000000..da9a8e0c --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -0,0 +1,72 @@ +/** + * 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_DRIVER 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); } + 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/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp new file mode 100644 index 00000000..616d05fe --- /dev/null +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -0,0 +1,141 @@ +/** + * 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) { + /** + * 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 + + 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); + 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); +} + +#if ENABLED(TOUCH_BUTTONS_HW_SPI) + uint16_t XPT2046::HardwareIO(uint16_t data) { + uint16_t result = SPIx.transfer(data); + 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 00000000..019f75ef --- /dev/null +++ b/Marlin/src/HAL/STM32F1/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/HAL/STM32F1/timers.cpp b/Marlin/src/HAL/STM32F1/timers.cpp new file mode 100644 index 00000000..8c2df1e2 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/timers.cpp @@ -0,0 +1,187 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +// ------------------------ +// Local defines +// ------------------------ + +// ------------------------ +// Public functions +// ------------------------ + +/** + * Timer_clock1: Prescaler 2 -> 36 MHz + * Timer_clock2: Prescaler 8 -> 9 MHz + * Timer_clock3: Prescaler 32 -> 2.25 MHz + * Timer_clock4: Prescaler 128 -> 562.5 kHz + */ + +/** + * TODO: Calculate Timer prescale value, so we get the 32bit to adjust + */ + + + + +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; + case 2: irq_num = NVIC_TIMER2; break; + case 3: irq_num = NVIC_TIMER3; break; + case 4: irq_num = NVIC_TIMER4; break; + case 5: irq_num = NVIC_TIMER5; break; + #ifdef STM32_HIGH_DENSITY + // 6 & 7 are basic timers, avoid them + case 8: irq_num = NVIC_TIMER8_CC; break; + #endif + default: + /** + * This should never happen. Add a Sanitycheck for timer number. + * Should be a general timer since basic timers have no CC channels. + */ + 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. + */ + + switch (timer_num) { + case STEP_TIMER_NUM: + timer_pause(STEP_TIMER_DEV); + timer_set_mode(STEP_TIMER_DEV, STEP_TIMER_CHAN, TIMER_OUTPUT_COMPARE); // counter + timer_set_count(STEP_TIMER_DEV, 0); + timer_set_prescaler(STEP_TIMER_DEV, (uint16_t)(STEPPER_TIMER_PRESCALE - 1)); + timer_set_reload(STEP_TIMER_DEV, 0xFFFF); + timer_oc_set_mode(STEP_TIMER_DEV, STEP_TIMER_CHAN, TIMER_OC_MODE_FROZEN, TIMER_OC_NO_PRELOAD); // no output pin change + 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); + timer_set_interrupt_priority(STEP_TIMER_NUM, STEP_TIMER_IRQ_PRIO); + timer_generate_update(STEP_TIMER_DEV); + timer_resume(STEP_TIMER_DEV); + break; + case TEMP_TIMER_NUM: + timer_pause(TEMP_TIMER_DEV); + timer_set_mode(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, TIMER_OUTPUT_COMPARE); + timer_set_count(TEMP_TIMER_DEV, 0); + timer_set_prescaler(TEMP_TIMER_DEV, (uint16_t)(TEMP_TIMER_PRESCALE - 1)); + 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); + timer_set_interrupt_priority(TEMP_TIMER_NUM, TEMP_TIMER_IRQ_PRIO); + timer_generate_update(TEMP_TIMER_DEV); + timer_resume(TEMP_TIMER_DEV); + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: ENABLE_STEPPER_DRIVER_INTERRUPT(); break; + case TEMP_TIMER_NUM: ENABLE_TEMPERATURE_INTERRUPT(); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: DISABLE_STEPPER_DRIVER_INTERRUPT(); break; + case TEMP_TIMER_NUM: DISABLE_TEMPERATURE_INTERRUPT(); break; + } +} + +static inline bool timer_irq_enabled(const timer_dev * const dev, const uint8_t interrupt) { + return bool(*bb_perip(&(dev->regs).gen->DIER, interrupt)); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: return timer_irq_enabled(STEP_TIMER_DEV, STEP_TIMER_CHAN); + case TEMP_TIMER_NUM: return timer_irq_enabled(TEMP_TIMER_DEV, TEMP_TIMER_CHAN); + } + return false; +} + +timer_dev* get_timer_dev(int number) { + switch (number) { + #if STM32_HAVE_TIMER(1) + case 1: return &timer1; + #endif + #if STM32_HAVE_TIMER(2) + case 2: return &timer2; + #endif + #if STM32_HAVE_TIMER(3) + case 3: return &timer3; + #endif + #if STM32_HAVE_TIMER(4) + case 4: return &timer4; + #endif + #if STM32_HAVE_TIMER(5) + case 5: return &timer5; + #endif + #if STM32_HAVE_TIMER(6) + case 6: return &timer6; + #endif + #if STM32_HAVE_TIMER(7) + case 7: return &timer7; + #endif + #if STM32_HAVE_TIMER(8) + case 8: return &timer8; + #endif + #if STM32_HAVE_TIMER(9) + case 9: return &timer9; + #endif + #if STM32_HAVE_TIMER(10) + case 10: return &timer10; + #endif + #if STM32_HAVE_TIMER(11) + case 11: return &timer11; + #endif + #if STM32_HAVE_TIMER(12) + case 12: return &timer12; + #endif + #if STM32_HAVE_TIMER(13) + case 13: return &timer13; + #endif + #if STM32_HAVE_TIMER(14) + case 14: return &timer14; + #endif + default: return nullptr; + } +} + +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/timers.h b/Marlin/src/HAL/STM32F1/timers.h new file mode 100644 index 00000000..6f360f6b --- /dev/null +++ b/Marlin/src/HAL/STM32F1/timers.h @@ -0,0 +1,199 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#include +#include +#include "../../core/boards.h" + +// ------------------------ +// Defines +// ------------------------ + +/** + * TODO: Check and confirm what timer we will use for each Temps and stepper driving. + * We should probable drive temps with PWM. + */ +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint16_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE uint32_t(F_CPU) // frequency of timers peripherals + +#ifndef STEP_TIMER_CHAN + #define STEP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts +#endif +#ifndef TEMP_TIMER_CHAN + #define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts +#endif + +/** + * Note: Timers may be used by platforms and libraries + * + * FAN PWMs: + * With FAN_SOFT_PWM disabled the Temperature class uses + * FANx_PIN timers to generate FAN PWM signals. + * + * Speaker: + * When SPEAKER is enabled, one timer is allocated by maple/tone.cpp. + * - If BEEPER_PIN has a timer channel (and USE_PIN_TIMER is + * defined in tone.cpp) it uses the pin's own timer. + * - Otherwise it uses Timer 8 on boards with STM32_HIGH_DENSITY + * or Timer 4 on other boards. + */ +#ifndef STEP_TIMER_NUM + #if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8) + #define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4 + #else + #define STEP_TIMER_NUM 5 // for other boards, five is fine. + #endif +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 2 // Timer Index for Temperature + //#define TEMP_TIMER_NUM 4 // 2->4, Timer 2 for Stepper Current PWM +#endif + +#if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_E3_DIP, BTT_SKR_MINI_E3_V1_2, MKS_ROBIN_LITE) + // SKR Mini E3 boards use PA8 as FAN_PIN, so TIMER 1 is used for Fan PWM. + #ifdef STM32_HIGH_DENSITY + #define SERVO0_TIMER_NUM 8 // tone.cpp uses Timer 4 + #else + #define SERVO0_TIMER_NUM 3 // tone.cpp uses Timer 8 + #endif +#else + #define SERVO0_TIMER_NUM 1 // SERVO0 or BLTOUCH +#endif + +#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 + +#define STEPPER_TIMER_PRESCALE 18 // prescaler for setting stepper timer, 4Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +timer_dev* get_timer_dev(int number); +#define TIMER_DEV(num) get_timer_dev(num) +#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM) +#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM) + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() timer_enable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) +#define DISABLE_TEMPERATURE_INTERRUPT() timer_disable_irq(TEMP_TIMER_DEV, TEMP_TIMER_CHAN) + +#define HAL_timer_get_count(timer_num) timer_get_count(TIMER_DEV(timer_num)) + +// TODO change this + +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() +#endif +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() +#endif + +extern "C" void tempTC_Handler(); +extern "C" void stepTC_Handler(); + +// ------------------------ +// Public Variables +// ------------------------ + +//static HardwareTimer StepperTimer(STEP_TIMER_NUM); +//static HardwareTimer TempTimer(TEMP_TIMER_NUM); + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +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); + +/** + * NOTE: By default libmaple sets ARPE = 1, which means the Auto reload register is preloaded (will only update with an update event) + * Thus we have to pause the timer, update the value, refresh, resume the timer. + * That seems like a big waste of time and may be better to change the timer config to ARPE = 0, so ARR can be updated any time. + * We are using a Channel in each timer in Capture/Compare mode. We could also instead use the Time Update Event Interrupt, but need to disable ARPE + * so we can change the ARR value on the fly (without calling refresh), and not get an interrupt right there because we caused an UEV. + * This mode pretty much makes 2 timers unusable for PWM since they have their counts updated all the time on ISRs. + * The way Marlin manages timer interrupts doesn't make for an efficient usage in STM32F1 + * Todo: Look at that possibility later. + */ + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case STEP_TIMER_NUM: + // NOTE: WE have set ARPE = 0, which means the Auto reload register is not preloaded + // and there is no need to use any compare, as in the timer mode used, setting ARR to the compare value + // will result in exactly the same effect, ie trigerring an interrupt, and on top, set counter to 0 + timer_set_reload(STEP_TIMER_DEV, compare); // We reload direct ARR as needed during counting up + break; + case TEMP_TIMER_NUM: + timer_set_compare(TEMP_TIMER_DEV, TEMP_TIMER_CHAN, compare); + break; + } +} + +FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: + // No counter to clear + timer_generate_update(STEP_TIMER_DEV); + return; + case TEMP_TIMER_NUM: + timer_set_count(TEMP_TIMER_DEV, 0); + timer_generate_update(TEMP_TIMER_DEV); + return; + } +} + +#define HAL_timer_isr_epilogue(TIMER_NUM) + +// No command is available in framework to turn off ARPE bit, which is turned on by default in libmaple. +// Needed here to reset ARPE=0 for stepper timer +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. diff --git a/Marlin/src/HAL/STM32F1/watchdog.cpp b/Marlin/src/HAL/STM32F1/watchdog.cpp new file mode 100644 index 00000000..ca91a6fe --- /dev/null +++ b/Marlin/src/HAL/STM32F1/watchdog.cpp @@ -0,0 +1,61 @@ +/** + * 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 . + * + */ + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include +#include "watchdog.h" + +void HAL_watchdog_refresh() { + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // heartbeat indicator + #endif + iwdg_feed(); +} + +void watchdogSetup() { + // do whatever. don't remove this function. +} + +/** + * @brief Initialized the independent hardware watchdog. + * + * @return No return + * + * @details The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and 625 reload value (counts down to 0) + */ +void watchdog_init() { + #if DISABLED(DISABLE_WATCHDOG_INIT) + iwdg_init(IWDG_PRE_256, STM32F1_WD_RELOAD); + #endif +} + +#endif // USE_WATCHDOG +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/watchdog.h b/Marlin/src/HAL/STM32F1/watchdog.h new file mode 100644 index 00000000..7185d697 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/watchdog.h @@ -0,0 +1,44 @@ +/** + * 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 + +/** + * HAL for stm32duino.com based on Libmaple and compatible (STM32F1) + */ + +#include + +/** + * The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and + * 625 reload value (counts down to 0) + * use 1250 for 8 seconds + */ +#define STM32F1_WD_RELOAD 625 + +// Arduino STM32F1 core now has watchdog support + +// Initialize watchdog with a 4 second countdown time +void watchdog_init(); + +// Reset watchdog. MUST be called at least every 4 seconds after the +// first watchdog_init or STM32F1 will reset. +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL.cpp new file mode 100644 index 00000000..b4629d2a --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.cpp @@ -0,0 +1,95 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +#include "HAL.h" + +//#include + +// ------------------------ +// Public Variables +// ------------------------ + +uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +/* VGPV Done with defines +// disable interrupts +void cli() { noInterrupts(); } + +// enable interrupts +void sei() { interrupts(); } +*/ + +void HAL_clear_reset_source() { __HAL_RCC_CLEAR_RESET_FLAGS(); } + +uint8_t HAL_get_reset_source() { + if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) return RST_WATCHDOG; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) return RST_SOFTWARE; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) return RST_EXTERNAL; + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) return RST_POWER_ON; + return 0; +} + +void _delay_ms(const int delay_ms) { delay(delay_ms); } + +extern "C" { + extern unsigned int _ebss; // end of bss section +} + +// return free memory between end of heap (or end bss) and whatever is current + +/* +#include +//extern caddr_t _sbrk(int incr); +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((caddr_t)&_lm_heap_end) +#endif + +extern "C" { + static int freeMemory() { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + int freeMemory() { + int free_memory; + int heap_end = (int)_sbrk(0); + free_memory = ((int)&free_memory) - ((int)heap_end); + return free_memory; + } +} +*/ + +// ------------------------ +// ADC +// ------------------------ + +void HAL_adc_start_conversion(const uint8_t adc_pin) { HAL_adc_result = analogRead(adc_pin); } + +uint16_t HAL_adc_get_result() { return HAL_adc_result; } + +#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL.h b/Marlin/src/HAL/STM32_F4_F7/HAL.h new file mode 100644 index 00000000..00a65de7 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/HAL.h @@ -0,0 +1,199 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2017 Victor Perez + * + * 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 CPU_32_BIT + +#include "../../inc/MarlinConfigPre.h" + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" + +#include + +#if defined(STM32F4) && USBCON + #include +#endif + +// ------------------------ +// Defines +// ------------------------ + +// Serial override +//extern HalSerial usb_serial; + +#define _MSERIAL(X) SerialUART##X +#define MSERIAL(X) _MSERIAL(X) +#define SerialUART0 Serial1 + +#if defined(STM32F4) && SERIAL_PORT == 0 + #error "SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." +#elif SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif WITHIN(SERIAL_PORT, 0, 6) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#else + #error "SERIAL_PORT must be from -1 to 6. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if defined(STM32F4) && SERIAL_PORT_2 == 0 + #error "SERIAL_PORT_2 cannot be 0. (Port 0 does not exist.) Please update your configuration." + #elif SERIAL_PORT_2 == -1 + #define MYSERIAL1 SerialUSB + #elif WITHIN(SERIAL_PORT_2, 0, 6) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #else + #error "SERIAL_PORT_2 must be from -1 to 6. Please update your configuration." + #endif +#endif + +#ifdef LCD_SERIAL_PORT + #if defined(STM32F4) && LCD_SERIAL_PORT == 0 + #error "LCD_SERIAL_PORT cannot be 0. (Port 0 does not exist.) Please update your configuration." + #elif LCD_SERIAL_PORT == -1 + #define LCD_SERIAL SerialUSB + #elif WITHIN(LCD_SERIAL_PORT, 0, 6) + #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) + #else + #error "LCD_SERIAL_PORT must be from -1 to 6. Please update your configuration." + #endif +#endif + +/** + * TODO: review this to return 1 for pins that are not analog input + */ +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) (p) +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() +#define cli() __disable_irq() +#define sei() __enable_irq() + +// On AVR this is in math.h? +#define square(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*(addr)) + +// ------------------------ +// Types +// ------------------------ + +typedef int8_t pin_t; + +#ifdef STM32F4 + #define HAL_SERVO_LIB libServo +#endif + +// ------------------------ +// Public Variables +// ------------------------ + +// Result of last ADC conversion +extern uint16_t HAL_adc_result; + +// ------------------------ +// Public functions +// ------------------------ + +// Memory related +#define __bss_end __bss_end__ + +inline void HAL_init() {} + +// Clear reset reason +void HAL_clear_reset_source(); + +// Reset reason +uint8_t HAL_get_reset_source(); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +void _delay_ms(const int delay); + +/* +extern "C" { + int freeMemory(); +} +*/ + +extern "C" char* _sbrk(int incr); + +/* +int freeMemory() { + volatile int top; + top = (int)((char*)&top - reinterpret_cast(_sbrk(0))); + return top; +} +*/ + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" + +static inline int freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +#pragma GCC diagnostic pop + +// +// ADC +// + +#define HAL_ANALOG_SELECT(pin) pinMode(pin, INPUT) + +inline void HAL_adc_init() {} + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_result +#define HAL_ADC_READY() true + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#ifdef STM32F4 + #define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY) + #define JTAGSWD_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE) +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp new file mode 100644 index 00000000..ebd0b4ce --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/HAL_SPI.cpp @@ -0,0 +1,164 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +/** + * Software SPI functions originally from Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + */ + +/** + * Adapted to the Marlin STM32F4/7 HAL + */ + +#include "../../inc/MarlinConfig.h" + +#include +#include +#include "../shared/HAL_SPI.h" +#include "spi_pins.h" + +// ------------------------ +// Public Variables +// ------------------------ + +static SPISettings spiConfig; + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(SOFTWARE_SPI) + // ------------------------ + // Software SPI + // ------------------------ + #error "Software SPI not supported for STM32F4/7. Use Hardware SPI." +#else + +// ------------------------ +// Hardware SPI +// ------------------------ + +/** + * VGPV SPI speed start and F_CPU/2, by default 72/2 = 36Mhz + */ + +/** + * @brief Begin SPI port setup + * + * @return Nothing + * + * @details Only configures SS pin since libmaple creates and initialize the SPI object + */ +void spiBegin() { + #if !defined(SS_PIN) || SS_PIN < 0 + #error "SS_PIN not defined!" + #endif + + OUT_WRITE(SS_PIN, HIGH); +} + +/** Configure SPI for specified SPI speed */ +void spiInit(uint8_t spiRate) { + // Use datarates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 20000000; break; // 13.9mhz=20000000 6.75mhz=10000000 3.38mhz=5000000 .833mhz=1000000 + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 300000; break; + default: clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +/** + * @brief Receives a single byte from the SPI port. + * + * @return Byte received + * + * @details + */ +uint8_t spiRec() { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; +} + +/** + * @brief Receives 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 spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + #ifndef STM32GENERIC + SPI.dmaTransfer(0, const_cast(buf), nbyte); + #else + SPI.transfer((uint8_t*)buf, nbyte); + #endif + SPI.endTransaction(); +} + +/** + * @brief Sends a single byte on SPI port + * + * @param b Byte to send + * + * @details + */ +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); +} + +/** + * @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 spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPI.transfer(token); + #ifndef STM32GENERIC + SPI.dmaSend(const_cast(buf), 512); + #else + SPI.transfer((uint8_t*)buf, nullptr, 512); + #endif + SPI.endTransaction(); +} + +#endif // SOFTWARE_SPI +#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/README.md b/Marlin/src/HAL/STM32_F4_F7/README.md new file mode 100644 index 00000000..3b5a9ab0 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/README.md @@ -0,0 +1,6 @@ +# This HAL is for... + + - STM32F407 MCU with STM32Generic Arduino core by danieleff. + - STM32F765 board "The Borg" with STM32Generic. + +See the `README.md` files in HAL_STM32F4 and HAL_STM32F7 for the specifics of those hals. diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md b/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md new file mode 100644 index 00000000..10396e87 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F4/README.md @@ -0,0 +1,12 @@ +# This HAL is for the STM32F407 MCU used with STM32Generic Arduino core by danieleff. + +# Arduino core is located at: + +https://github.com/danieleff/STM32GENERIC + +Unzip it into [Arduino]/hardware folder + +# This HAL is in development. + +This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL. + diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp new file mode 100644 index 00000000..dc41f891 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.cpp @@ -0,0 +1,115 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 . + * + */ +#if defined(STM32GENERIC) && defined(STM32F4) + +#include "../../../inc/MarlinConfig.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define NUM_HARDWARE_TIMERS 2 +#define STEP_TIMER_IRQ_ID TIM5_IRQn +#define TEMP_TIMER_IRQ_ID TIM7_IRQn + +// ------------------------ +// Private Variables +// ------------------------ + +stm32_timer_t TimerHandle[NUM_HARDWARE_TIMERS]; + +// ------------------------ +// Public functions +// ------------------------ + +bool timers_initialized[NUM_HARDWARE_TIMERS] = {false}; + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + if (!timers_initialized[timer_num]) { + constexpr uint32_t step_prescaler = STEPPER_TIMER_PRESCALE - 1, + temp_prescaler = TEMP_TIMER_PRESCALE - 1; + switch (timer_num) { + case STEP_TIMER_NUM: + // STEPPER TIMER TIM5 - use a 32bit timer + __HAL_RCC_TIM5_CLK_ENABLE(); + TimerHandle[timer_num].handle.Instance = TIM5; + TimerHandle[timer_num].handle.Init.Prescaler = step_prescaler; + TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + TimerHandle[timer_num].callback = (uint32_t)TC5_Handler; + HAL_NVIC_SetPriority(STEP_TIMER_IRQ_ID, 1, 0); + break; + + case TEMP_TIMER_NUM: + // TEMP TIMER TIM7 - any available 16bit Timer (1 already used for PWM) + __HAL_RCC_TIM7_CLK_ENABLE(); + TimerHandle[timer_num].handle.Instance = TIM7; + TimerHandle[timer_num].handle.Init.Prescaler = temp_prescaler; + TimerHandle[timer_num].handle.Init.CounterMode = TIM_COUNTERMODE_UP; + TimerHandle[timer_num].handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + TimerHandle[timer_num].callback = (uint32_t)TC7_Handler; + HAL_NVIC_SetPriority(TEMP_TIMER_IRQ_ID, 2, 0); + break; + } + timers_initialized[timer_num] = true; + } + + TimerHandle[timer_num].handle.Init.Period = (((HAL_TIMER_RATE) / TimerHandle[timer_num].handle.Init.Prescaler) / frequency) - 1; + if (HAL_TIM_Base_Init(&TimerHandle[timer_num].handle) == HAL_OK) + HAL_TIM_Base_Start_IT(&TimerHandle[timer_num].handle); +} + +extern "C" void TIM5_IRQHandler() { + ((void(*)())TimerHandle[0].callback)(); +} +extern "C" void TIM7_IRQHandler() { + ((void(*)())TimerHandle[1].callback)(); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: HAL_NVIC_EnableIRQ(STEP_TIMER_IRQ_ID); break; + case TEMP_TIMER_NUM: HAL_NVIC_EnableIRQ(TEMP_TIMER_IRQ_ID); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: HAL_NVIC_DisableIRQ(STEP_TIMER_IRQ_ID); break; + case TEMP_TIMER_NUM: HAL_NVIC_DisableIRQ(TEMP_TIMER_IRQ_ID); break; + } + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case STEP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)STEP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)STEP_TIMER_IRQ_ID) & (uint32_t)0x1F)); + case TEMP_TIMER_NUM: return NVIC->ISER[(uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)TEMP_TIMER_IRQ_ID) & (uint32_t)0x1F)); + } + return false; +} + +#endif // STM32GENERIC && STM32F4 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h new file mode 100644 index 00000000..a4a7ad82 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F4/timers.h @@ -0,0 +1,134 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency + +#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +// TODO change this + +#ifdef STM32GENERIC + #define TC_TIMER_ARGS +#else + #define TC_TIMER_ARGS stimer_t *htim +#endif + +extern void TC5_Handler(TC_TIMER_ARGS); +extern void TC7_Handler(TC_TIMER_ARGS); +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void TC5_Handler(TC_TIMER_ARGS) +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void TC7_Handler(TC_TIMER_ARGS) +#endif + +// ------------------------ +// Types +// ------------------------ + +#ifdef STM32GENERIC + typedef struct { + TIM_HandleTypeDef handle; + uint32_t callback; + } tTimerConfig; + typedef tTimerConfig stm32_timer_t; +#else + typedef stimer_t stm32_timer_t; +#endif + +// ------------------------ +// Public Variables +// ------------------------ + +extern stm32_timer_t TimerHandle[]; + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +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); + +FORCE_INLINE static uint32_t HAL_timer_get_count(const uint8_t timer_num) { + return __HAL_TIM_GET_COUNTER(&TimerHandle[timer_num].handle); +} + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { + __HAL_TIM_SET_AUTORELOAD(&TimerHandle[timer_num].handle, compare); + if (HAL_timer_get_count(timer_num) >= compare) + TimerHandle[timer_num].handle.Instance->EGR |= TIM_EGR_UG; // Generate an immediate update interrupt +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return __HAL_TIM_GET_AUTORELOAD(&TimerHandle[timer_num].handle); +} + +#ifdef STM32GENERIC + FORCE_INLINE static void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (__HAL_TIM_GET_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE) == SET) + __HAL_TIM_CLEAR_FLAG(&TimerHandle[timer_num].handle, TIM_FLAG_UPDATE); + } +#else + #define HAL_timer_isr_prologue(TIMER_NUM) +#endif + +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md b/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md new file mode 100644 index 00000000..23155b42 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/README.md @@ -0,0 +1,27 @@ +# This HAL is for the STM32F765 board "The Borg" used with STM32Generic Arduino core by danieleff. + +# Original core is located at: + +https://github.com/danieleff/STM32GENERIC + +but I haven't committed the changes needed for the Borg there yet, so please use: + +https://github.com/Spawn32/STM32GENERIC + +Unzip it into [Arduino]/hardware folder + + +Download the latest GNU ARM Embedded Toolchain: + +https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads + +(The one in Arduino doesn't support STM32F7). + +Change compiler.path in platform.txt to point to the one you downloaded. + +# This HAL is in development. +# Currently only tested on "The Borg". + +You will also need the latest Arduino 1.9.0-beta or newer. + +This HAL is a modified version of Chris Barr's Picoprint STM32F4 HAL, so shouldn't be to hard to get it to work on a F4. diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp new file mode 100644 index 00000000..e67808c3 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.cpp @@ -0,0 +1,898 @@ +/** + * TMC26XStepper.cpp - - TMC26X Stepper library for Wiring/Arduino + * + * based on the stepper library by Tom Igoe, et. al. + * + * Copyright (c) 2011, Interactive Matter, Marcus Nowotny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#if defined(STM32GENERIC) && defined(STM32F7) + +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_DRIVER(TMC2660) + +#include +#include +#include "TMC2660.h" + +#include "../../../inc/MarlinConfig.h" +#include "../../../MarlinCore.h" +#include "../../../module/stepper/indirection.h" +#include "../../../module/printcounter.h" +#include "../../../libs/duration_t.h" +#include "../../../libs/hex_print.h" + +//some default values used in initialization +#define DEFAULT_MICROSTEPPING_VALUE 32 + +//TMC26X register definitions +#define DRIVER_CONTROL_REGISTER 0x0UL +#define CHOPPER_CONFIG_REGISTER 0x80000UL +#define COOL_STEP_REGISTER 0xA0000ul +#define STALL_GUARD2_LOAD_MEASURE_REGISTER 0xC0000ul +#define DRIVER_CONFIG_REGISTER 0xE0000ul + +#define REGISTER_BIT_PATTERN 0xFFFFFul + +//definitions for the driver control register +#define MICROSTEPPING_PATTERN 0xFul +#define STEP_INTERPOLATION 0x200UL +#define DOUBLE_EDGE_STEP 0x100UL +#define VSENSE 0x40UL +#define READ_MICROSTEP_POSTION 0x0UL +#define READ_STALL_GUARD_READING 0x10UL +#define READ_STALL_GUARD_AND_COOL_STEP 0x20UL +#define READ_SELECTION_PATTERN 0x30UL + +//definitions for the chopper config register +#define CHOPPER_MODE_STANDARD 0x0UL +#define CHOPPER_MODE_T_OFF_FAST_DECAY 0x4000UL +#define T_OFF_PATTERN 0xFul +#define RANDOM_TOFF_TIME 0x2000UL +#define BLANK_TIMING_PATTERN 0x18000UL +#define BLANK_TIMING_SHIFT 15 +#define HYSTERESIS_DECREMENT_PATTERN 0x1800UL +#define HYSTERESIS_DECREMENT_SHIFT 11 +#define HYSTERESIS_LOW_VALUE_PATTERN 0x780UL +#define HYSTERESIS_LOW_SHIFT 7 +#define HYSTERESIS_START_VALUE_PATTERN 0x78UL +#define HYSTERESIS_START_VALUE_SHIFT 4 +#define T_OFF_TIMING_PATERN 0xFul + +//definitions for cool step register +#define MINIMUM_CURRENT_FOURTH 0x8000UL +#define CURRENT_DOWN_STEP_SPEED_PATTERN 0x6000UL +#define SE_MAX_PATTERN 0xF00ul +#define SE_CURRENT_STEP_WIDTH_PATTERN 0x60UL +#define SE_MIN_PATTERN 0xFul + +//definitions for StallGuard2 current register +#define STALL_GUARD_FILTER_ENABLED 0x10000UL +#define STALL_GUARD_TRESHHOLD_VALUE_PATTERN 0x17F00ul +#define CURRENT_SCALING_PATTERN 0x1Ful +#define STALL_GUARD_CONFIG_PATTERN 0x17F00ul +#define STALL_GUARD_VALUE_PATTERN 0x7F00ul + +//definitions for the input from the TMC2660 +#define STATUS_STALL_GUARD_STATUS 0x1UL +#define STATUS_OVER_TEMPERATURE_SHUTDOWN 0x2UL +#define STATUS_OVER_TEMPERATURE_WARNING 0x4UL +#define STATUS_SHORT_TO_GROUND_A 0x8UL +#define STATUS_SHORT_TO_GROUND_B 0x10UL +#define STATUS_OPEN_LOAD_A 0x20UL +#define STATUS_OPEN_LOAD_B 0x40UL +#define STATUS_STAND_STILL 0x80UL +#define READOUT_VALUE_PATTERN 0xFFC00ul + +#define CPU_32_BIT + +//default values +#define INITIAL_MICROSTEPPING 0x3UL //32th microstepping + +SPIClass SPI_6(SPI6, SPI6_MOSI_PIN, SPI6_MISO_PIN, SPI6_SCK_PIN); + +#define STEPPER_SPI SPI_6 + +//debuging output + +//#define TMC_DEBUG1 + +uint8_t current_scaling = 0; + +/** + * Constructor + * number_of_steps - the steps per rotation + * cs_pin - the SPI client select pin + * dir_pin - the pin where the direction pin is connected + * step_pin - the pin where the step pin is connected + */ +TMC26XStepper::TMC26XStepper(const int16_t in_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t current, uint16_t resistor) { + // We are not started yet + started = false; + + // By default cool step is not enabled + cool_step_enabled = false; + + // Save the pins for later use + this->cs_pin = cs_pin; + this->dir_pin = dir_pin; + this->step_pin = step_pin; + + // Store the current sense resistor value for later use + this->resistor = resistor; + + // Initizalize our status values + this->steps_left = 0; + this->direction = 0; + + // Initialize register values + driver_control_register_value = DRIVER_CONTROL_REGISTER | INITIAL_MICROSTEPPING; + chopper_config_register = CHOPPER_CONFIG_REGISTER; + + // Setting the default register values + driver_control_register_value = DRIVER_CONTROL_REGISTER|INITIAL_MICROSTEPPING; + microsteps = _BV(INITIAL_MICROSTEPPING); + chopper_config_register = CHOPPER_CONFIG_REGISTER; + cool_step_register_value = COOL_STEP_REGISTER; + stallguard2_current_register_value = STALL_GUARD2_LOAD_MEASURE_REGISTER; + driver_configuration_register_value = DRIVER_CONFIG_REGISTER | READ_STALL_GUARD_READING; + + // Set the current + setCurrent(current); + // Set to a conservative start value + setConstantOffTimeChopper(7, 54, 13,12,1); + // Set a nice microstepping value + setMicrosteps(DEFAULT_MICROSTEPPING_VALUE); + // Save the number of steps + number_of_steps = in_steps; +} + + +/** + * start & configure the stepper driver + * just must be called. + */ +void TMC26XStepper::start() { + + #ifdef TMC_DEBUG1 + SERIAL_ECHOLNPGM("\n TMC26X stepper library"); + SERIAL_ECHOPAIR("\n CS pin: ", cs_pin); + SERIAL_ECHOPAIR("\n DIR pin: ", dir_pin); + SERIAL_ECHOPAIR("\n STEP pin: ", step_pin); + SERIAL_PRINTF("\n current scaling: %d", current_scaling); + SERIAL_PRINTF("\n Resistor: %d", resistor); + //SERIAL_PRINTF("\n current: %d", current); + SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); + #endif + + //set the pins as output & its initial value + pinMode(step_pin, OUTPUT); + pinMode(dir_pin, OUTPUT); + pinMode(cs_pin, OUTPUT); + extDigitalWrite(step_pin, LOW); + extDigitalWrite(dir_pin, LOW); + extDigitalWrite(cs_pin, HIGH); + + STEPPER_SPI.begin(); + STEPPER_SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE3)); + + //set the initial values + send262(driver_control_register_value); + send262(chopper_config_register); + send262(cool_step_register_value); + send262(stallguard2_current_register_value); + send262(driver_configuration_register_value); + + //save that we are in running mode + started = true; +} + +/** + * Mark the driver as unstarted to be able to start it again + */ +void TMC26XStepper::un_start() { started = false; } + + +/** + * Sets the speed in revs per minute + */ +void TMC26XStepper::setSpeed(uint16_t whatSpeed) { + this->speed = whatSpeed; + this->step_delay = 60UL * sq(1000UL) / ((uint32_t)this->number_of_steps * (uint32_t)whatSpeed * (uint32_t)this->microsteps); + #ifdef TMC_DEBUG0 // crashes + SERIAL_ECHOPAIR("\nStep delay in micros: ", this->step_delay); + #endif + // Update the next step time + this->next_step_time = this->last_step_time + this->step_delay; +} + +uint16_t TMC26XStepper::getSpeed() { return this->speed; } + +/** + * Moves the motor steps_to_move steps. + * Negative indicates the reverse direction. + */ +char TMC26XStepper::step(int16_t steps_to_move) { + if (this->steps_left == 0) { + this->steps_left = ABS(steps_to_move); // how many steps to take + + // determine direction based on whether steps_to_move is + or -: + if (steps_to_move > 0) + this->direction = 1; + else if (steps_to_move < 0) + this->direction = 0; + return 0; + } + return -1; +} + +char TMC26XStepper::move() { + // decrement the number of steps, moving one step each time: + if (this->steps_left > 0) { + uint32_t time = micros(); + // move only if the appropriate delay has passed: + + // rem if (time >= this->next_step_time) { + + if (ABS(time - this->last_step_time) > this->step_delay) { + // increment or decrement the step number, + // depending on direction: + if (this->direction == 1) + extDigitalWrite(step_pin, HIGH); + else { + extDigitalWrite(dir_pin, HIGH); + extDigitalWrite(step_pin, HIGH); + } + // get the timeStamp of when you stepped: + this->last_step_time = time; + this->next_step_time = time + this->step_delay; + // decrement the steps left: + steps_left--; + //disable the step & dir pins + extDigitalWrite(step_pin, LOW); + extDigitalWrite(dir_pin, LOW); + } + return -1; + } + return 0; +} + +char TMC26XStepper::isMoving() { return this->steps_left > 0; } + +uint16_t TMC26XStepper::getStepsLeft() { return this->steps_left; } + +char TMC26XStepper::stop() { + //note to self if the motor is currently moving + char state = isMoving(); + //stop the motor + this->steps_left = 0; + this->direction = 0; + //return if it was moving + return state; +} + +void TMC26XStepper::setCurrent(uint16_t current) { + uint8_t current_scaling = 0; + //calculate the current scaling from the max current setting (in mA) + float mASetting = (float)current, + resistor_value = (float)this->resistor; + // remove vsense flag + this->driver_configuration_register_value &= ~(VSENSE); + // Derived from I = (cs + 1) / 32 * (Vsense / Rsense) + // leading to cs = 32 * R * I / V (with V = 0,31V oder 0,165V and I = 1000 * current) + // with Rsense = 0,15 + // for vsense = 0,310V (VSENSE not set) + // or vsense = 0,165V (VSENSE set) + current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.31 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 + + // Check if the current scalingis too low + if (current_scaling < 16) { + // Set the csense bit to get a use half the sense voltage (to support lower motor currents) + this->driver_configuration_register_value |= VSENSE; + // and recalculate the current setting + current_scaling = (byte)((resistor_value * mASetting * 32.0 / (0.165 * sq(1000.0))) - 0.5); //theoretically - 1.0 for better rounding it is 0.5 + #ifdef TMC_DEBUG0 // crashes + SERIAL_ECHOPAIR("\nCS (Vsense=1): ",current_scaling); + #endif + } + #ifdef TMC_DEBUG0 // crashes + else + SERIAL_ECHOPAIR("\nCS: ", current_scaling); + #endif + + // do some sanity checks + NOMORE(current_scaling, 31); + + // delete the old value + stallguard2_current_register_value &= ~(CURRENT_SCALING_PATTERN); + // set the new current scaling + stallguard2_current_register_value |= current_scaling; + // if started we directly send it to the motor + if (started) { + send262(driver_configuration_register_value); + send262(stallguard2_current_register_value); + } +} + +uint16_t TMC26XStepper::getCurrent() { + // Calculate the current according to the datasheet to be on the safe side. + // This is not the fastest but the most accurate and illustrative way. + float result = (float)(stallguard2_current_register_value & CURRENT_SCALING_PATTERN), + resistor_value = (float)this->resistor, + voltage = (driver_configuration_register_value & VSENSE) ? 0.165 : 0.31; + result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); + return (uint16_t)result; +} + +void TMC26XStepper::setStallGuardThreshold(char stallguard_threshold, char stallguard_filter_enabled) { + // We just have 5 bits + LIMIT(stallguard_threshold, -64, 63); + + // Add trim down to 7 bits + stallguard_threshold &= 0x7F; + // Delete old StallGuard settings + stallguard2_current_register_value &= ~(STALL_GUARD_CONFIG_PATTERN); + if (stallguard_filter_enabled) + stallguard2_current_register_value |= STALL_GUARD_FILTER_ENABLED; + + // Set the new StallGuard threshold + stallguard2_current_register_value |= (((uint32_t)stallguard_threshold << 8) & STALL_GUARD_CONFIG_PATTERN); + // If started we directly send it to the motor + if (started) send262(stallguard2_current_register_value); +} + +char TMC26XStepper::getStallGuardThreshold() { + uint32_t stallguard_threshold = stallguard2_current_register_value & STALL_GUARD_VALUE_PATTERN; + //shift it down to bit 0 + stallguard_threshold >>= 8; + //convert the value to an int16_t to correctly handle the negative numbers + char result = stallguard_threshold; + //check if it is negative and fill it up with leading 1 for proper negative number representation + //rem if (result & _BV(6)) { + + if (TEST(result, 6)) result |= 0xC0; + return result; +} + +char TMC26XStepper::getStallGuardFilter() { + if (stallguard2_current_register_value & STALL_GUARD_FILTER_ENABLED) + return -1; + return 0; +} + +/** + * Set the number of microsteps per step. + * 0,2,4,8,16,32,64,128,256 is supported + * any value in between will be mapped to the next smaller value + * 0 and 1 set the motor in full step mode + */ +void TMC26XStepper::setMicrosteps(const int16_t in_steps) { + uint16_t setting_pattern; + + if (in_steps >= 256) setting_pattern = 0; + else if (in_steps >= 128) setting_pattern = 1; + else if (in_steps >= 64) setting_pattern = 2; + else if (in_steps >= 32) setting_pattern = 3; + else if (in_steps >= 16) setting_pattern = 4; + else if (in_steps >= 8) setting_pattern = 5; + else if (in_steps >= 4) setting_pattern = 6; + else if (in_steps >= 2) setting_pattern = 7; + else if (in_steps <= 1) setting_pattern = 8; // 1 and 0 lead to full step + + microsteps = _BV(8 - setting_pattern); + + #ifdef TMC_DEBUG0 // crashes + SERIAL_ECHOPAIR("\n Microstepping: ", microsteps); + #endif + + // Delete the old value + this->driver_control_register_value &= 0x000FFFF0UL; + + // Set the new value + this->driver_control_register_value |= setting_pattern; + + // If started we directly send it to the motor + if (started) send262(driver_control_register_value); + + // Recalculate the stepping delay by simply setting the speed again + this->setSpeed(this->speed); +} + +/** + * returns the effective number of microsteps at the moment + */ +int16_t TMC26XStepper::getMicrosteps() { return microsteps; } + +/** + * constant_off_time: The off time setting controls the minimum chopper frequency. + * For most applications an off time within the range of 5μs to 20μs will fit. + * 2...15: off time setting + * + * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the + * duration of the ringing on the sense resistor. For + * 0: min. setting 3: max. setting + * + * fast_decay_time_setting: Fast decay time setting. With CHM=1, these bits control the portion of fast decay for each chopper cycle. + * 0: slow decay only + * 1...15: duration of fast decay phase + * + * sine_wave_offset: Sine wave offset. With CHM=1, these bits control the sine wave offset. + * A positive offset corrects for zero crossing error. + * -3..-1: negative offset 0: no offset 1...12: positive offset + * + * use_current_comparator: Selects usage of the current comparator for termination of the fast decay cycle. + * If current comparator is enabled, it terminates the fast decay cycle in case the current + * reaches a higher negative value than the actual positive value. + * 1: enable comparator termination of fast decay cycle + * 0: end by time only + */ +void TMC26XStepper::setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, uint8_t use_current_comparator) { + // Perform some sanity checks + LIMIT(constant_off_time, 2, 15); + + // Save the constant off time + this->constant_off_time = constant_off_time; + + // Calculate the value acc to the clock cycles + const char blank_value = blank_time >= 54 ? 3 : + blank_time >= 36 ? 2 : + blank_time >= 24 ? 1 : 0; + + LIMIT(fast_decay_time_setting, 0, 15); + LIMIT(sine_wave_offset, -3, 12); + + // Shift the sine_wave_offset + sine_wave_offset += 3; + + // Calculate the register setting + // First of all delete all the values for this + chopper_config_register &= ~(_BV(12) | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); + // Set the constant off pattern + chopper_config_register |= CHOPPER_MODE_T_OFF_FAST_DECAY; + // Set the blank timing value + chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; + // Setting the constant off time + chopper_config_register |= constant_off_time; + // Set the fast decay time + // Set msb + chopper_config_register |= (((uint32_t)(fast_decay_time_setting & 0x8)) << HYSTERESIS_DECREMENT_SHIFT); + // Other bits + chopper_config_register |= (((uint32_t)(fast_decay_time_setting & 0x7)) << HYSTERESIS_START_VALUE_SHIFT); + // Set the sine wave offset + chopper_config_register |= (uint32_t)sine_wave_offset << HYSTERESIS_LOW_SHIFT; + // Using the current comparator? + if (!use_current_comparator) + chopper_config_register |= _BV(12); + + // If started we directly send it to the motor + if (started) { + // rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +/** + * constant_off_time: The off time setting controls the minimum chopper frequency. + * For most applications an off time within the range of 5μs to 20μs will fit. + * 2...15: off time setting + * + * blank_time: Selects the comparator blank time. This time needs to safely cover the switching event and the + * duration of the ringing on the sense resistor. For + * 0: min. setting 3: max. setting + * + * hysteresis_start: Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value HEND. + * 1...8 + * + * hysteresis_end: Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by HDEC. + * The sum HSTRT+HEND must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. + * -3..-1: negative HEND 0: zero HEND 1...12: positive HEND + * + * hysteresis_decrement: Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. + * 0: fast decrement 3: very slow decrement + */ + +void TMC26XStepper::setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement) { + // Perform some sanity checks + LIMIT(constant_off_time, 2, 15); + + // Save the constant off time + this->constant_off_time = constant_off_time; + + // Calculate the value acc to the clock cycles + const char blank_value = blank_time >= 54 ? 3 : + blank_time >= 36 ? 2 : + blank_time >= 24 ? 1 : 0; + + LIMIT(hysteresis_start, 1, 8); + hysteresis_start--; + + LIMIT(hysteresis_start, -3, 12); + + // Shift the hysteresis_end + hysteresis_end += 3; + + LIMIT(hysteresis_decrement, 0, 3); + + //first of all delete all the values for this + chopper_config_register &= ~(CHOPPER_MODE_T_OFF_FAST_DECAY | BLANK_TIMING_PATTERN | HYSTERESIS_DECREMENT_PATTERN | HYSTERESIS_LOW_VALUE_PATTERN | HYSTERESIS_START_VALUE_PATTERN | T_OFF_TIMING_PATERN); + + //set the blank timing value + chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; + //setting the constant off time + chopper_config_register |= constant_off_time; + //set the hysteresis_start + chopper_config_register |= ((uint32_t)hysteresis_start) << HYSTERESIS_START_VALUE_SHIFT; + //set the hysteresis end + chopper_config_register |= ((uint32_t)hysteresis_end) << HYSTERESIS_LOW_SHIFT; + //set the hystereis decrement + chopper_config_register |= ((uint32_t)blank_value) << BLANK_TIMING_SHIFT; + //if started we directly send it to the motor + if (started) { + //rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +/** + * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. + * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, thus it depends on the microstep position. + * With some motors a slightly audible beat can occur between the chopper frequencies, especially when they are near to each other. This typically occurs at a + * few microstep positions within each quarter wave. This effect normally is not audible when compared to mechanical noise generated by ball bearings, etc. + * Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. + * Hint: A common factor, which can cause motor noise, is a bad PCB layout causing coupling of both sense resistor voltages + * (please refer to sense resistor layout hint in chapter 8.1). + * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. + * It modulates the slow decay time setting when switched on by the RNDTF bit. The RNDTF feature further spreads the chopper spectrum, + * reducing electromagnetic emission on single frequencies. + */ +void TMC26XStepper::setRandomOffTime(char value) { + if (value) + chopper_config_register |= RANDOM_TOFF_TIME; + else + chopper_config_register &= ~(RANDOM_TOFF_TIME); + //if started we directly send it to the motor + if (started) { + //rem send262(driver_control_register_value); + send262(chopper_config_register); + } +} + +void TMC26XStepper::setCoolStepConfiguration( + uint16_t lower_SG_threshold, + uint16_t SG_hysteresis, + uint8_t current_decrement_step_size, + uint8_t current_increment_step_size, + uint8_t lower_current_limit +) { + // Sanitize the input values + NOMORE(lower_SG_threshold, 480); + // Divide by 32 + lower_SG_threshold >>= 5; + NOMORE(SG_hysteresis, 480); + // Divide by 32 + SG_hysteresis >>= 5; + NOMORE(current_decrement_step_size, 3); + NOMORE(current_increment_step_size, 3); + NOMORE(lower_current_limit, 1); + + // Store the lower level in order to enable/disable the cool step + this->cool_step_lower_threshold=lower_SG_threshold; + // If cool step is not enabled we delete the lower value to keep it disabled + if (!this->cool_step_enabled) lower_SG_threshold = 0; + // The good news is that we can start with a complete new cool step register value + // And simply set the values in the register + cool_step_register_value = ((uint32_t)lower_SG_threshold) + | (((uint32_t)SG_hysteresis) << 8) + | (((uint32_t)current_decrement_step_size) << 5) + | (((uint32_t)current_increment_step_size) << 13) + | (((uint32_t)lower_current_limit) << 15) + | COOL_STEP_REGISTER; // Register signature + + if (started) send262(cool_step_register_value); +} + +void TMC26XStepper::setCoolStepEnabled(boolean enabled) { + // Simply delete the lower limit to disable the cool step + cool_step_register_value &= ~SE_MIN_PATTERN; + // And set it to the proper value if cool step is to be enabled + if (enabled) + cool_step_register_value |= this->cool_step_lower_threshold; + // And save the enabled status + this->cool_step_enabled = enabled; + // Save the register value + if (started) send262(cool_step_register_value); +} + +boolean TMC26XStepper::isCoolStepEnabled() { return this->cool_step_enabled; } + +uint16_t TMC26XStepper::getCoolStepLowerSgThreshold() { + // We return our internally stored value - in order to provide the correct setting even if cool step is not enabled + return this->cool_step_lower_threshold<<5; +} + +uint16_t TMC26XStepper::getCoolStepUpperSgThreshold() { + return uint8_t((cool_step_register_value & SE_MAX_PATTERN) >> 8) << 5; +} + +uint8_t TMC26XStepper::getCoolStepCurrentIncrementSize() { + return uint8_t((cool_step_register_value & CURRENT_DOWN_STEP_SPEED_PATTERN) >> 13); +} + +uint8_t TMC26XStepper::getCoolStepNumberOfSGReadings() { + return uint8_t((cool_step_register_value & SE_CURRENT_STEP_WIDTH_PATTERN) >> 5); +} + +uint8_t TMC26XStepper::getCoolStepLowerCurrentLimit() { + return uint8_t((cool_step_register_value & MINIMUM_CURRENT_FOURTH) >> 15); +} + +void TMC26XStepper::setEnabled(boolean enabled) { + //delete the t_off in the chopper config to get sure + chopper_config_register &= ~(T_OFF_PATTERN); + if (enabled) { + //and set the t_off time + chopper_config_register |= this->constant_off_time; + } + //if not enabled we don't have to do anything since we already delete t_off from the register + if (started) send262(chopper_config_register); +} + +boolean TMC26XStepper::isEnabled() { return !!(chopper_config_register & T_OFF_PATTERN); } + +/** + * reads a value from the TMC26X status register. The value is not obtained directly but can then + * be read by the various status routines. + */ +void TMC26XStepper::readStatus(char read_value) { + uint32_t old_driver_configuration_register_value = driver_configuration_register_value; + //reset the readout configuration + driver_configuration_register_value &= ~(READ_SELECTION_PATTERN); + //this now equals TMC26X_READOUT_POSITION - so we just have to check the other two options + if (read_value == TMC26X_READOUT_STALLGUARD) + driver_configuration_register_value |= READ_STALL_GUARD_READING; + else if (read_value == TMC26X_READOUT_CURRENT) + driver_configuration_register_value |= READ_STALL_GUARD_AND_COOL_STEP; + + //all other cases are ignored to prevent funny values + //check if the readout is configured for the value we are interested in + if (driver_configuration_register_value != old_driver_configuration_register_value) { + //because then we need to write the value twice - one time for configuring, second time to get the value, see below + send262(driver_configuration_register_value); + } + //write the configuration to get the last status + send262(driver_configuration_register_value); +} + +int16_t TMC26XStepper::getMotorPosition() { + //we read it out even if we are not started yet - perhaps it is useful information for somebody + readStatus(TMC26X_READOUT_POSITION); + return getReadoutValue(); +} + +//reads the StallGuard setting from last status +//returns -1 if StallGuard information is not present +int16_t TMC26XStepper::getCurrentStallGuardReading() { + //if we don't yet started there cannot be a StallGuard value + if (!started) return -1; + //not time optimal, but solution optiomal: + //first read out the StallGuard value + readStatus(TMC26X_READOUT_STALLGUARD); + return getReadoutValue(); +} + +uint8_t TMC26XStepper::getCurrentCSReading() { + //if we don't yet started there cannot be a StallGuard value + if (!started) return 0; + //not time optimal, but solution optiomal: + //first read out the StallGuard value + readStatus(TMC26X_READOUT_CURRENT); + return (getReadoutValue() & 0x1F); +} + +uint16_t TMC26XStepper::getCurrentCurrent() { + float result = (float)getCurrentCSReading(), + resistor_value = (float)this->resistor, + voltage = (driver_configuration_register_value & VSENSE)? 0.165 : 0.31; + result = (result + 1.0) / 32.0 * voltage / resistor_value * sq(1000.0); + return (uint16_t)result; +} + +/** + * Return true if the StallGuard threshold has been reached + */ +boolean TMC26XStepper::isStallGuardOverThreshold() { + if (!this->started) return false; + return (driver_status_result & STATUS_STALL_GUARD_STATUS); +} + +/** + * returns if there is any over temperature condition: + * OVER_TEMPERATURE_PREWARING if pre warning level has been reached + * OVER_TEMPERATURE_SHUTDOWN if the temperature is so hot that the driver is shut down + * Any of those levels are not too good. + */ +char TMC26XStepper::getOverTemperature() { + if (!this->started) return 0; + + if (driver_status_result & STATUS_OVER_TEMPERATURE_SHUTDOWN) + return TMC26X_OVERTEMPERATURE_SHUTDOWN; + + if (driver_status_result & STATUS_OVER_TEMPERATURE_WARNING) + return TMC26X_OVERTEMPERATURE_PREWARING; + + return 0; +} + +// Is motor channel A shorted to ground +boolean TMC26XStepper::isShortToGroundA() { + if (!this->started) return false; + return (driver_status_result & STATUS_SHORT_TO_GROUND_A); +} + +// Is motor channel B shorted to ground +boolean TMC26XStepper::isShortToGroundB() { + if (!this->started) return false; + return (driver_status_result & STATUS_SHORT_TO_GROUND_B); +} + +// Is motor channel A connected +boolean TMC26XStepper::isOpenLoadA() { + if (!this->started) return false; + return (driver_status_result & STATUS_OPEN_LOAD_A); +} + +// Is motor channel B connected +boolean TMC26XStepper::isOpenLoadB() { + if (!this->started) return false; + return (driver_status_result & STATUS_OPEN_LOAD_B); +} + +// Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s +boolean TMC26XStepper::isStandStill() { + if (!this->started) return false; + return (driver_status_result & STATUS_STAND_STILL); +} + +//is chopper inactive since 2^20 clock cycles - defaults to ~0,08s +boolean TMC26XStepper::isStallGuardReached() { + if (!this->started) return false; + return (driver_status_result & STATUS_STALL_GUARD_STATUS); +} + +//reads the StallGuard setting from last status +//returns -1 if StallGuard information is not present +int16_t TMC26XStepper::getReadoutValue() { + return (int)(driver_status_result >> 10); +} + +int16_t TMC26XStepper::getResistor() { return this->resistor; } + +boolean TMC26XStepper::isCurrentScalingHalfed() { + return !!(this->driver_configuration_register_value & VSENSE); +} +/** + * version() returns the version of the library: + */ +int16_t TMC26XStepper::version() { return 1; } + +void TMC26XStepper::debugLastStatus() { + #ifdef TMC_DEBUG1 + if (this->started) { + if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_PREWARING) + SERIAL_ECHOLNPGM("\n WARNING: Overtemperature Prewarning!"); + else if (this->getOverTemperature()&TMC26X_OVERTEMPERATURE_SHUTDOWN) + SERIAL_ECHOLNPGM("\n ERROR: Overtemperature Shutdown!"); + + if (this->isShortToGroundA()) + SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel A!"); + + if (this->isShortToGroundB()) + SERIAL_ECHOLNPGM("\n ERROR: SHORT to ground on channel B!"); + + if (this->isOpenLoadA()) + SERIAL_ECHOLNPGM("\n ERROR: Channel A seems to be unconnected!"); + + if (this->isOpenLoadB()) + SERIAL_ECHOLNPGM("\n ERROR: Channel B seems to be unconnected!"); + + if (this->isStallGuardReached()) + SERIAL_ECHOLNPGM("\n INFO: Stall Guard level reached!"); + + if (this->isStandStill()) + SERIAL_ECHOLNPGM("\n INFO: Motor is standing still."); + + uint32_t readout_config = driver_configuration_register_value & READ_SELECTION_PATTERN; + const int16_t value = getReadoutValue(); + if (readout_config == READ_MICROSTEP_POSTION) { + SERIAL_ECHOPAIR("\n Microstep position phase A: ", value); + } + else if (readout_config == READ_STALL_GUARD_READING) { + SERIAL_ECHOPAIR("\n Stall Guard value:", value); + } + else if (readout_config == READ_STALL_GUARD_AND_COOL_STEP) { + SERIAL_ECHOPAIR("\n Approx Stall Guard: ", value & 0xF); + SERIAL_ECHOPAIR("\n Current level", value & 0x1F0); + } + } + #endif +} + +/** + * send register settings to the stepper driver via SPI + * returns the current status + */ +inline void TMC26XStepper::send262(uint32_t datagram) { + uint32_t i_datagram; + + //preserver the previous spi mode + //uint8_t oldMode = SPCR & SPI_MODE_MASK; + + //if the mode is not correct set it to mode 3 + //if (oldMode != SPI_MODE3) { + // SPI.setDataMode(SPI_MODE3); + //} + + //select the TMC driver + extDigitalWrite(cs_pin, LOW); + + //ensure that only valid bist are set (0-19) + //datagram &=REGISTER_BIT_PATTERN; + + #ifdef TMC_DEBUG1 + //SERIAL_PRINTF("Sending "); + //SERIAL_PRINTF("Sending ", datagram,HEX); + //SERIAL_ECHOPAIR("\n\nSending \n", print_hex_long(datagram)); + SERIAL_PRINTF("\n\nSending %x", datagram); + #endif + + //write/read the values + i_datagram = STEPPER_SPI.transfer((datagram >> 16) & 0xFF); + i_datagram <<= 8; + i_datagram |= STEPPER_SPI.transfer((datagram >> 8) & 0xFF); + i_datagram <<= 8; + i_datagram |= STEPPER_SPI.transfer((datagram) & 0xFF); + i_datagram >>= 4; + + #ifdef TMC_DEBUG1 + //SERIAL_PRINTF("Received "); + //SERIAL_PRINTF("Received ", i_datagram,HEX); + //SERIAL_ECHOPAIR("\n\nReceived \n", i_datagram); + SERIAL_PRINTF("\n\nReceived %x", i_datagram); + debugLastStatus(); + #endif + + //deselect the TMC chip + extDigitalWrite(cs_pin, HIGH); + + //restore the previous SPI mode if neccessary + //if the mode is not correct set it to mode 3 + //if (oldMode != SPI_MODE3) { + // SPI.setDataMode(oldMode); + //} + + //store the datagram as status result + driver_status_result = i_datagram; +} + +#endif // HAS_DRIVER(TMC2660) + +#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h new file mode 100644 index 00000000..208c3bc7 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/TMC2660.h @@ -0,0 +1,593 @@ +/** + * TMC26XStepper.h - - TMC26X Stepper library for Wiring/Arduino + * + * based on the stepper library by Tom Igoe, et. al. + * + * Copyright (c) 2011, Interactive Matter, Marcus Nowotny + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#pragma once + +#include + +//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature situation in the TMC chip +/*! + * This warning indicates that the TMC chip is too warm. + * It is still working but some parameters may be inferior. + * You should do something against it. + */ +#define TMC26X_OVERTEMPERATURE_PREWARING 1 +//! return value for TMC26XStepper.getOverTemperature() if there is a overtemperature shutdown in the TMC chip +/*! + * This warning indicates that the TMC chip is too warm to operate and has shut down to prevent damage. + * It will stop working until it cools down again. + * If you encouter this situation you must do something against it. Like reducing the current or improving the PCB layout + * and/or heat management. + */ +#define TMC26X_OVERTEMPERATURE_SHUTDOWN 2 + +//which values can be read out +/*! + * Selects to readout the microstep position from the motor. + *\sa readStatus() + */ +#define TMC26X_READOUT_POSITION 0 +/*! + * Selects to read out the StallGuard value of the motor. + *\sa readStatus() + */ +#define TMC26X_READOUT_STALLGUARD 1 +/*! + * Selects to read out the current current setting (acc. to CoolStep) and the upper bits of the StallGuard value from the motor. + *\sa readStatus(), setCurrent() + */ +#define TMC26X_READOUT_CURRENT 3 + +/*! + * Define to set the minimum current for CoolStep operation to 1/2 of the selected CS minium. + *\sa setCoolStepConfiguration() + */ +#define COOL_STEP_HALF_CS_LIMIT 0 +/*! + * Define to set the minimum current for CoolStep operation to 1/4 of the selected CS minium. + *\sa setCoolStepConfiguration() + */ +#define COOL_STEP_QUARTDER_CS_LIMIT 1 + +/*! + * \class TMC26XStepper + * \brief Class representing a TMC26X stepper driver + * + * To use one of these drivers in your code create an object of its class: + * \code + * TMC26XStepper tmc_stepper = TMC26XStepper(200,1,2,3,500); + * \endcode + * see TMC26XStepper(int16_t number_of_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t rms_current) + * + * Keep in mind that you need to start the driver with start() in order to configure the TMC26X. + * + * The most important function is move(). It checks if the motor requires a step. It's important to call move() as + * often as possible in loop(). I suggest using a very fast loop routine and always call move() at the beginning or end. + * + * To move you must set a movement speed with setSpeed(). The speed is a positive value, setting the RPM. + * + * To really move the motor you have to call step() to tell the driver to move the motor the given number + * of steps in the given direction. Positive values move the motor in one direction, negative values in the other. + * + * You can check with isMoving() if the motor is still moving or stop it abruptly with stop(). + */ +class TMC26XStepper { + public: + /*! + * \brief Create a new representation of a stepper motor connected to a TMC26X stepper driver + * + * Main constructor. If in doubt use this. All parameters must be provided as described below. + * + * \param number_of_steps Number of steps the motor has per rotation. + * \param cs_pin Arduino pin connected to the Client Select Pin (!CS) of the TMC26X for SPI. + * \param dir_pin Arduino pin connected to the DIR input of the TMC26X. + * \param step_pin Arduino pin connected to the STEP pin of the TMC26X. + * \param rms_current Maximum current to provide to the motor in mA (!). A value of 200 will send up to 200mA to the motor. + * \param resistor Current sense resistor in milli-Ohm, defaults to 0.15 Ohm (or 150 milli-Ohm) as in the TMC260 Arduino Shield. + * + * You must also call TMC26XStepper.start() to configure the stepper driver for use. + * + * By default the Constant Off Time chopper is used. See TMC26XStepper.setConstantOffTimeChopper() for details. + * This should work on most motors (YMMV). You may want to configure and use the Spread Cycle Chopper. See setSpreadCycleChopper(). + * + * By default a microstepping of 1/32 is used to provide a smooth motor run while still giving a good progression per step. + * Change stepping by sending setMicrosteps() a different value. + * \sa start(), setMicrosteps() + */ + TMC26XStepper(const int16_t in_steps, int16_t cs_pin, int16_t dir_pin, int16_t step_pin, uint16_t current, uint16_t resistor=100); //resistor=150 + + /*! + * \brief Configure and start the TMC26X stepper driver. Before this is called the stepper driver is nonfunctional. + * + * Configure the TMC26X stepper driver for the given values via SPI. + * Most member functions are non-functional if the driver has not been started, + * therefore it is best to call this in setup(). + */ + void start(); + + /*! + * \brief Reset the stepper in unconfigured mode. + * + * Allows start to be called again. It doesn't change the internal stepper + * configuration or the desired configuration. It just marks the stepper as + * not-yet-started. The stepper doesn't need to be reconfigured before + * starting again, and is not reset to any factory settings. + * It must be reset intentionally. + * (Hint: Normally you do not need this function) + */ + void un_start(); + + /*! + * \brief Set the rotation speed in RPM. + * \param whatSpeed the desired speed in RPM. + */ + void setSpeed(uint16_t whatSpeed); + + /*! + * \brief Report the currently selected speed in RPM. + * \sa setSpeed() + */ + uint16_t getSpeed(); + + /*! + * \brief Set the number of microsteps in 2^i values (rounded) up to 256 + * + * This method sets the number of microsteps per step in 2^i interval. + * It accepts 1, 2, 4, 16, 32, 64, 128 or 256 as valid microsteps. + * Other values will be rounded down to the next smaller value (e.g., 3 gives a microstepping of 2). + * You can always check the current microstepping with getMicrosteps(). + */ + void setMicrosteps(const int16_t in_steps); + + /*! + * \brief Return the effective current number of microsteps selected. + * + * Always returns the effective number of microsteps. + * This may be different from the micro-steps set in setMicrosteps() since it is rounded to 2^i. + * + * \sa setMicrosteps() + */ + int16_t getMicrosteps(); + + /*! + * \brief Initiate a movement with the given number of steps. Positive values move in one direction, negative in the other. + * + * \param number_of_steps The number of steps to move the motor. + * \return 0 if the motor was not moving and moves now. -1 if the motor is moving and the new steps could not be set. + * + * If the previous movement is incomplete the function returns -1 and doesn't change the steps to move the motor. + * If the motor does not move it returns 0. + * + * The movement direction is determined by the sign of the steps parameter. The motor direction in machine space + * cannot be determined, as it depends on the construction of the motor and how it functions in the drive system. + * + * For safety, verify with isMoving() or even use stop() to stop the motor before giving it new step directions. + * \sa isMoving(), getStepsLeft(), stop() + */ + char step(int16_t number_of_steps); + + /*! + * \brief Central movement method. Must be called as often as possible in the loop function and is very fast. + * + * Check if the motor still has to move and whether the wait-to-step interval has expired, and manages the + * number of steps remaining to fulfill the current move command. + * + * This function is implemented to be as fast as possible, so call it as often as possible in your loop. + * It should be invoked with as frequently and with as much regularity as possible. + * + * This can be called even when the motor is known not to be moving. It will simply return. + * + * The frequency with which this function is called determines the top stepping speed of the motor. + * It is recommended to call this using a hardware timer to ensure regular invocation. + * \sa step() + */ + char move(); + + /*! + * \brief Check whether the last movement command is done. + * \return 0 if the motor stops, -1 if the motor is moving. + * + * Used to determine if the motor is ready for new movements. + *\sa step(), move() + */ + char isMoving(); + + /*! + * \brief Get the number of steps left in the current movement. + * \return The number of steps left in the movement. Always positive. + */ + uint16_t getStepsLeft(); + + /*! + * \brief Stop the motor immediately. + * \return -1 if the motor was moving and is really stoped or 0 if it was not moving at all. + * + * This method directly and abruptly stops the motor and may be used as an emergency stop. + */ + char stop(); + + /*! + * \brief Set and configure the classical Constant Off Timer Chopper + * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) + * \param blank_time Comparator blank time. This duration needs to safely cover the duration of the switching event and the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting + * \param fast_decay_time_setting Fast decay time setting. Controls the portion of fast decay for each chopper cycle. 0: slow decay only, 1…15: duration of fast decay phase + * \param sine_wave_offset Sine wave offset. Controls the sine wave offset. A positive offset corrects for zero crossing error. -3…-1: negative offset, 0: no offset,1…12: positive offset + * \param use_curreent_comparator Selects usage of the current comparator for termination of the fast decay cycle. If current comparator is enabled, it terminates the fast decay cycle in case the current reaches a higher negative value than the actual positive value. (0 disable, -1 enable). + * + * The classic constant off time chopper uses a fixed portion of fast decay following each on phase. + * While the duration of the on time is determined by the chopper comparator, the fast decay time needs + * to be set by the user in a way, that the current decay is enough for the driver to be able to follow + * the falling slope of the sine wave, and on the other hand it should not be too long, in order to minimize + * motor current ripple and power dissipation. This best can be tuned using an oscilloscope or + * trying out motor smoothness at different velocities. A good starting value is a fast decay time setting + * similar to the slow decay time setting. + * After tuning of the fast decay time, the offset should be determined, in order to have a smooth zero transition. + * This is necessary, because the fast decay phase leads to the absolute value of the motor current being lower + * than the target current (see figure 17). If the zero offset is too low, the motor stands still for a short + * moment during current zero crossing, if it is set too high, it makes a larger microstep. + * Typically, a positive offset setting is required for optimum operation. + * + * \sa setSpreadCycleChoper() for other alternatives. + * \sa setRandomOffTime() for spreading the noise over a wider spectrum + */ + void setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, uint8_t use_current_comparator); + + /*! + * \brief Sets and configures with spread cycle chopper. + * \param constant_off_time The off time setting controls the minimum chopper frequency. For most applications an off time within the range of 5μs to 20μs will fit. Setting this parameter to zero completely disables all driver transistors and the motor can free-wheel. 0: chopper off, 1:15: off time setting (1 will work with minimum blank time of 24 clocks) + * \param blank_time Selects the comparator blank time. This time needs to safely cover the switching event and the duration of the ringing on the sense resistor. For most low current drivers, a setting of 1 or 2 is good. For high current applications with large MOSFETs, a setting of 2 or 3 will be required. 0 (min setting) … (3) amx setting + * \param hysteresis_start Hysteresis start setting. Please remark, that this value is an offset to the hysteresis end value. 1 … 8 + * \param hysteresis_end Hysteresis end setting. Sets the hysteresis end value after a number of decrements. Decrement interval time is controlled by hysteresis_decrement. The sum hysteresis_start + hysteresis_end must be <16. At a current setting CS of max. 30 (amplitude reduced to 240), the sum is not limited. + * \param hysteresis_decrement Hysteresis decrement setting. This setting determines the slope of the hysteresis during on time and during fast decay time. 0 (fast decrement) … 3 (slow decrement). + * + * The spreadCycle chopper scheme (pat.fil.) is a precise and simple to use chopper principle, which automatically determines + * the optimum fast decay portion for the motor. Anyhow, a number of settings can be made in order to optimally fit the driver + * to the motor. + * Each chopper cycle is comprised of an on-phase, a slow decay phase, a fast decay phase and a second slow decay phase. + * The slow decay phases limit the maximum chopper frequency and are important for low motor and driver power dissipation. + * The hysteresis start setting limits the chopper frequency by forcing the driver to introduce a minimum amount of + * current ripple into the motor coils. The motor inductivity determines the ability to follow a changing motor current. + * The duration of the on- and fast decay phase needs to cover at least the blank time, because the current comparator is + * disabled during this time. + * + * \sa setRandomOffTime() for spreading the noise over a wider spectrum + */ + void setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement); + + /*! + * \brief Use random off time for noise reduction (0 for off, -1 for on). + * \param value 0 for off, -1 for on + * + * In a constant off time chopper scheme both coil choppers run freely, i.e. are not synchronized. + * The frequency of each chopper mainly depends on the coil current and the position dependant motor coil inductivity, + * thus it depends on the microstep position. With some motors a slightly audible beat can occur between the chopper + * frequencies, especially when they are near to each other. This typically occurs at a few microstep positions within + * each quarter wave. + * This effect normally is not audible when compared to mechanical noise generated by ball bearings, + * etc. Further factors which can cause a similar effect are a poor layout of sense resistor GND connection. + * In order to minimize the effect of a beat between both chopper frequencies, an internal random generator is provided. + * It modulates the slow decay time setting when switched on. The random off time feature further spreads the chopper spectrum, + * reducing electromagnetic emission on single frequencies. + */ + void setRandomOffTime(char value); + + /*! + * \brief set the maximum motor current in mA (1000 is 1 Amp) + * Keep in mind this is the maximum peak Current. The RMS current will be 1/sqrt(2) smaller. The actual current can also be smaller + * by employing CoolStep. + * \param current the maximum motor current in mA + * \sa getCurrent(), getCurrentCurrent() + */ + void setCurrent(uint16_t current); + + /*! + * \brief readout the motor maximum current in mA (1000 is an Amp) + * This is the maximum current. to get the current current - which may be affected by CoolStep us getCurrentCurrent() + * \return the maximum motor current in milli amps + * \sa getCurrentCurrent() + */ + uint16_t getCurrent(); + + /*! + * \brief set the StallGuard threshold in order to get sensible StallGuard readings. + * \param stallguard_threshold -64 … 63 the StallGuard threshold + * \param stallguard_filter_enabled 0 if the filter is disabled, -1 if it is enabled + * + * The StallGuard threshold is used to optimize the StallGuard reading to sensible values. It should be at 0 at + * the maximum allowable load on the otor (but not before). = is a good starting point (and the default) + * If you get Stall Gaurd readings of 0 without any load or with too little laod increase the value. + * If you get readings of 1023 even with load decrease the setting. + * + * If you switch on the filter the StallGuard reading is only updated each 4th full step to reduce the noise in the + * reading. + * + * \sa getCurrentStallGuardReading() to read out the current value. + */ + void setStallGuardThreshold(char stallguard_threshold, char stallguard_filter_enabled); + + /*! + * \brief reads out the StallGuard threshold + * \return a number between -64 and 63. + */ + char getStallGuardThreshold(); + + /*! + * \brief returns the current setting of the StallGuard filter + * \return 0 if not set, -1 if set + */ + char getStallGuardFilter(); + + /*! + * \brief This method configures the CoolStep smart energy operation. You must have a proper StallGuard configuration for the motor situation (current, voltage, speed) in rder to use this feature. + * \param lower_SG_threshold Sets the lower threshold for stallGuard2TM reading. Below this value, the motor current becomes increased. Allowed values are 0...480 + * \param SG_hysteresis Sets the distance between the lower and the upper threshold for stallGuard2TM reading. Above the upper threshold (which is lower_SG_threshold+SG_hysteresis+1) the motor current becomes decreased. Allowed values are 0...480 + * \param current_decrement_step_size Sets the current decrement steps. If the StallGuard value is above the threshold the current gets decremented by this step size. 0...32 + * \param current_increment_step_size Sets the current increment step. The current becomes incremented for each measured stallGuard2TM value below the lower threshold. 0...8 + * \param lower_current_limit Sets the lower motor current limit for coolStepTM operation by scaling the CS value. Values can be COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + * The CoolStep smart energy operation automatically adjust the current sent into the motor according to the current load, + * read out by the StallGuard in order to provide the optimum torque with the minimal current consumption. + * You configure the CoolStep current regulator by defining upper and lower bounds of StallGuard readouts. If the readout is above the + * limit the current gets increased, below the limit the current gets decreased. + * You can specify the upper an lower threshold of the StallGuard readout in order to adjust the current. You can also set the number of + * StallGuard readings neccessary above or below the limit to get a more stable current adjustement. + * The current adjustement itself is configured by the number of steps the current gests in- or decreased and the absolut minimum current + * (1/2 or 1/4th otf the configured current). + * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + */ + void setCoolStepConfiguration(uint16_t lower_SG_threshold, uint16_t SG_hysteresis, uint8_t current_decrement_step_size, + uint8_t current_increment_step_size, uint8_t lower_current_limit); + + /*! + * \brief enables or disables the CoolStep smart energy operation feature. It must be configured before enabling it. + * \param enabled true if CoolStep should be enabled, false if not. + * \sa setCoolStepConfiguration() + */ + void setCoolStepEnabled(boolean enabled); + + + /*! + * \brief check if the CoolStep feature is enabled + * \sa setCoolStepEnabled() + */ + boolean isCoolStepEnabled(); + + /*! + * \brief returns the lower StallGuard threshold for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + uint16_t getCoolStepLowerSgThreshold(); + + /*! + * \brief returns the upper StallGuard threshold for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + uint16_t getCoolStepUpperSgThreshold(); + + /*! + * \brief returns the number of StallGuard readings befor CoolStep adjusts the motor current. + * \sa setCoolStepConfiguration() + */ + uint8_t getCoolStepNumberOfSGReadings(); + + /*! + * \brief returns the increment steps for the current for the CoolStep operation + * \sa setCoolStepConfiguration() + */ + uint8_t getCoolStepCurrentIncrementSize(); + + /*! + * \brief returns the absolut minium current for the CoolStep operation + * \sa setCoolStepConfiguration() + * \sa COOL_STEP_HALF_CS_LIMIT, COOL_STEP_QUARTER_CS_LIMIT + */ + uint8_t getCoolStepLowerCurrentLimit(); + + /*! + * \brief Get the current microstep position for phase A + * \return The current microstep position for phase A 0…255 + * + * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. + */ + int16_t getMotorPosition(); + + /*! + * \brief Reads the current StallGuard value. + * \return The current StallGuard value, lesser values indicate higher load, 0 means stall detected. + * Keep in mind that this routine reads and writes a value via SPI - so this may take a bit time. + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + int16_t getCurrentStallGuardReading(); + + /*! + * \brief Reads the current current setting value as fraction of the maximum current + * Returns values between 0 and 31, representing 1/32 to 32/32 (=1) + * \sa setCoolStepConfiguration() + */ + uint8_t getCurrentCSReading(); + + + /*! + *\brief a convenience method to determine if the current scaling uses 0.31V or 0.165V as reference. + *\return false if 0.13V is the reference voltage, true if 0.165V is used. + */ + boolean isCurrentScalingHalfed(); + + /*! + * \brief Reads the current current setting value and recalculates the absolute current in mA (1A would be 1000). + * This method calculates the currently used current setting (either by setting or by CoolStep) and reconstructs + * the current in mA by usinge the VSENSE and resistor value. This method uses floating point math - so it + * may not be the fastest. + * \sa getCurrentCSReading(), getResistor(), isCurrentScalingHalfed(), getCurrent() + */ + uint16_t getCurrentCurrent(); + + /*! + * \brief checks if there is a StallGuard warning in the last status + * \return 0 if there was no warning, -1 if there was some warning. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + * + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + boolean isStallGuardOverThreshold(); + + /*! + * \brief Return over temperature status of the last status readout + * return 0 is everything is OK, TMC26X_OVERTEMPERATURE_PREWARING if status is reached, TMC26X_OVERTEMPERATURE_SHUTDOWN is the chip is shutdown, -1 if the status is unknown. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + char getOverTemperature(); + + /*! + * \brief Is motor channel A shorted to ground detected in the last status readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + + boolean isShortToGroundA(); + + /*! + * \brief Is motor channel B shorted to ground detected in the last status readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isShortToGroundB(); + /*! + * \brief iIs motor channel A connected according to the last statu readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isOpenLoadA(); + + /*! + * \brief iIs motor channel A connected according to the last statu readout. + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isOpenLoadB(); + + /*! + * \brief Is chopper inactive since 2^20 clock cycles - defaults to ~0,08s + * \return true is yes, false if not. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + */ + boolean isStandStill(); + + /*! + * \brief checks if there is a StallGuard warning in the last status + * \return 0 if there was no warning, -1 if there was some warning. + * Keep in mind that this method does not enforce a readout but uses the value of the last status readout. + * You may want to use getMotorPosition() or getCurrentStallGuardReading() to enforce an updated status readout. + * + * \sa isStallGuardOverThreshold() + * TODO why? + * + * \sa setStallGuardThreshold() for tuning the readout to sensible ranges. + */ + boolean isStallGuardReached(); + + /*! + *\brief enables or disables the motor driver bridges. If disabled the motor can run freely. If enabled not. + *\param enabled a boolean value true if the motor should be enabled, false otherwise. + */ + void setEnabled(boolean enabled); + + /*! + *\brief checks if the output bridges are enabled. If the bridges are not enabled the motor can run freely + *\return true if the bridges and by that the motor driver are enabled, false if not. + *\sa setEnabled() + */ + boolean isEnabled(); + + /*! + * \brief Manually read out the status register + * This function sends a byte to the motor driver in order to get the current readout. The parameter read_value + * seletcs which value will get returned. If the read_vlaue changes in respect to the previous readout this method + * automatically send two bytes to the motor: one to set the redout and one to get the actual readout. So this method + * may take time to send and read one or two bits - depending on the previous readout. + * \param read_value selects which value to read out (0..3). You can use the defines TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, or TMC_262_READOUT_CURRENT + * \sa TMC26X_READOUT_POSITION, TMC_262_READOUT_STALLGUARD, TMC_262_READOUT_CURRENT + */ + void readStatus(char read_value); + + /*! + * \brief Returns the current sense resistor value in milliohm. + * The default value of ,15 Ohm will return 150. + */ + int16_t getResistor(); + + /*! + * \brief Prints out all the information that can be found in the last status read out - it does not force a status readout. + * The result is printed via Serial + */ + void debugLastStatus(); + + /*! + * \brief library version + * \return the version number as int. + */ + int16_t version(); + + private: + uint16_t steps_left; // The steps the motor has to do to complete the movement + int16_t direction; // Direction of rotation + uint32_t step_delay; // Delay between steps, in ms, based on speed + int16_t number_of_steps; // Total number of steps this motor can take + uint16_t speed; // Store the current speed in order to change the speed after changing microstepping + uint16_t resistor; // Current sense resitor value in milliohm + + uint32_t last_step_time, // Timestamp (ms) of the last step + next_step_time; // Timestamp (ms) of the next step + + // Driver control register copies to easily set & modify the registers + uint32_t driver_control_register_value, + chopper_config_register, + cool_step_register_value, + stallguard2_current_register_value, + driver_configuration_register_value, + driver_status_result; // The driver status result + + // Helper routione to get the top 10 bit of the readout + inline int16_t getReadoutValue(); + + // The pins for the stepper driver + uint8_t cs_pin, step_pin, dir_pin; + + // Status values + boolean started; // If the stepper has been started yet + int16_t microsteps; // The current number of micro steps + char constant_off_time; // We need to remember this value in order to enable and disable the motor + uint8_t cool_step_lower_threshold; // we need to remember the threshold to enable and disable the CoolStep feature + boolean cool_step_enabled; // We need to remember this to configure the coolstep if it si enabled + + // SPI sender + inline void send262(uint32_t datagram); +}; diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp new file mode 100644 index 00000000..f7ded745 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.cpp @@ -0,0 +1,129 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 . + * + */ +#if defined(STM32GENERIC) && defined(STM32F7) + +#include "../../../inc/MarlinConfig.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define NUM_HARDWARE_TIMERS 2 + +//#define PRESCALER 1 + +// ------------------------ +// Private Variables +// ------------------------ + +tTimerConfig timerConfig[NUM_HARDWARE_TIMERS]; + +// ------------------------ +// Public functions +// ------------------------ + +bool timers_initialized[NUM_HARDWARE_TIMERS] = { false }; + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + + if (!timers_initialized[timer_num]) { + switch (timer_num) { + case STEP_TIMER_NUM: + //STEPPER TIMER TIM5 //use a 32bit timer + __HAL_RCC_TIM5_CLK_ENABLE(); + timerConfig[0].timerdef.Instance = TIM5; + timerConfig[0].timerdef.Init.Prescaler = (STEPPER_TIMER_PRESCALE); + timerConfig[0].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; + timerConfig[0].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timerConfig[0].IRQ_Id = TIM5_IRQn; + timerConfig[0].callback = (uint32_t)TC5_Handler; + HAL_NVIC_SetPriority(timerConfig[0].IRQ_Id, 1, 0); + #if PIN_EXISTS(STEPPER_ENABLE) + OUT_WRITE(STEPPER_ENABLE_PIN, HIGH); + #endif + break; + case TEMP_TIMER_NUM: + //TEMP TIMER TIM7 // any available 16bit Timer (1 already used for PWM) + __HAL_RCC_TIM7_CLK_ENABLE(); + timerConfig[1].timerdef.Instance = TIM7; + timerConfig[1].timerdef.Init.Prescaler = (TEMP_TIMER_PRESCALE); + timerConfig[1].timerdef.Init.CounterMode = TIM_COUNTERMODE_UP; + timerConfig[1].timerdef.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + timerConfig[1].IRQ_Id = TIM7_IRQn; + timerConfig[1].callback = (uint32_t)TC7_Handler; + HAL_NVIC_SetPriority(timerConfig[1].IRQ_Id, 2, 0); + break; + } + timers_initialized[timer_num] = true; + } + + timerConfig[timer_num].timerdef.Init.Period = (((HAL_TIMER_RATE) / timerConfig[timer_num].timerdef.Init.Prescaler) / frequency) - 1; + + if (HAL_TIM_Base_Init(&timerConfig[timer_num].timerdef) == HAL_OK) + HAL_TIM_Base_Start_IT(&timerConfig[timer_num].timerdef); +} + +//forward the interrupt +extern "C" void TIM5_IRQHandler() { + ((void(*)())timerConfig[0].callback)(); +} +extern "C" void TIM7_IRQHandler() { + ((void(*)())timerConfig[1].callback)(); +} + +void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare) { + __HAL_TIM_SetAutoreload(&timerConfig[timer_num].timerdef, compare); +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + HAL_NVIC_EnableIRQ(timerConfig[timer_num].IRQ_Id); +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + HAL_NVIC_DisableIRQ(timerConfig[timer_num].IRQ_Id); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + return __HAL_TIM_GetAutoreload(&timerConfig[timer_num].timerdef); +} + +uint32_t HAL_timer_get_count(const uint8_t timer_num) { + return __HAL_TIM_GetCounter(&timerConfig[timer_num].timerdef); +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + if (__HAL_TIM_GET_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE) == SET) { + __HAL_TIM_CLEAR_FLAG(&timerConfig[timer_num].timerdef, TIM_FLAG_UPDATE); + } +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + const uint32_t IRQ_Id = uint32_t(timerConfig[timer_num].IRQ_Id); + return NVIC->ISER[IRQ_Id >> 5] & _BV32(IRQ_Id & 0x1F); +} + +#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h new file mode 100644 index 00000000..d2f78259 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/STM32F7/timers.h @@ -0,0 +1,107 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked? +#define HAL_TIMER_TYPE_MAX 0xFFFF + +#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency +#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz + +#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz +#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) +#define TEMP_ISR_ENABLED() HAL_timer_interrupt_enabled(TEMP_TIMER_NUM) + +// TODO change this + +extern void TC5_Handler(); +extern void TC7_Handler(); +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void TC5_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void TC7_Handler() +#endif + +// ------------------------ +// Types +// ------------------------ + +typedef struct { + TIM_HandleTypeDef timerdef; + IRQn_Type IRQ_Id; + uint32_t callback; +} tTimerConfig; + +// ------------------------ +// Public Variables +// ------------------------ + +//extern const tTimerConfig timerConfig[]; + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); +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); + +void HAL_timer_set_compare(const uint8_t timer_num, const uint32_t compare); +hal_timer_t HAL_timer_get_compare(const uint8_t timer_num); +uint32_t HAL_timer_get_count(const uint8_t timer_num); +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.cpp b/Marlin/src/HAL/STM32_F4_F7/Servo.cpp new file mode 100644 index 00000000..7185468f --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/Servo.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 + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +int8_t libServo::attach(const int pin) { + if (servoIndex >= MAX_SERVOS) return -1; + return super::attach(pin); +} + +int8_t libServo::attach(const int pin, const int min, const int max) { + return super::attach(pin, min, max); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +#endif // HAS_SERVOS +#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/Servo.h b/Marlin/src/HAL/STM32_F4_F7/Servo.h new file mode 100644 index 00000000..e42cc608 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/Servo.h @@ -0,0 +1,41 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 STM32F7 +// #include <../../libraries/Servo/src/Servo.h> +//#else + #include +//#endif + +// Inherit and expand on the official library +class libServo : public Servo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + private: + typedef Servo super; + uint16_t min_ticks, max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp new file mode 100644 index 00000000..e0726c7c --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.cpp @@ -0,0 +1,535 @@ +/** + ****************************************************************************** + * @file eeprom_emul.cpp + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file provides all the EEPROM emulation firmware functions. + ****************************************************************************** + * @attention + * + * Copyright © 2016 STMicroelectronics International N.V. + * 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. Redistribution 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 other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS 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. + * + ****************************************************************************** + */ +/** @addtogroup EEPROM_Emulation + * @{ + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +/* Includes ------------------------------------------------------------------*/ +#include "eeprom_emul.h" + +/* Private variables ---------------------------------------------------------*/ + +/* Global variable used to store variable value in read sequence */ +uint16_t DataVar = 0; + +/* Virtual address defined by the user: 0xFFFF value is prohibited */ +uint16_t VirtAddVarTab[NB_OF_VAR]; + +/* Private function prototypes -----------------------------------------------*/ + +static HAL_StatusTypeDef EE_Format(); +static uint16_t EE_FindValidPage(uint8_t Operation); +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data); +static uint16_t EE_VerifyPageFullyErased(uint32_t Address); + + /** + * @brief Restore the pages to a known good state in case of page's status + * corruption after a power loss. + * @param None. + * @retval - Flash error code: on write Flash error + * - FLASH_COMPLETE: on success + */ + +/* Private functions ---------------------------------------------------------*/ + +uint16_t EE_Initialize() { + /* Get Page0 and Page1 status */ + uint16_t PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS), + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + FLASH_EraseInitTypeDef pEraseInit; + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + HAL_StatusTypeDef FlashStatus; // = HAL_OK + + /* Check for invalid header states and repair if necessary */ + uint32_t SectorError; + switch (PageStatus0) { + case ERASED: + if (PageStatus1 == VALID_PAGE) { /* Page0 erased, Page1 valid */ + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + /* As the last operation, simply return the result */ + return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + } + } + else if (PageStatus1 == RECEIVE_DATA) { /* Page0 erased, Page1 receive */ + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + HAL_StatusTypeDef fStat = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (fStat != HAL_OK) return fStat; + } + /* Mark Page1 as valid */ + /* As the last operation, simply return the result */ + return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + } + else { /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + /* As the last operation, simply return the result */ + return EE_Format(); + } + break; + + case RECEIVE_DATA: + if (PageStatus1 == VALID_PAGE) { /* Page0 receive, Page1 valid */ + /* Transfer data from Page1 to Page0 */ + int16_t x = -1; + for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + if (VarIdx != x) { + /* Read the last variables' updates */ + uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page0 */ + uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page0 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + /* As the last operation, simply return the result */ + return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + } + } + else if (PageStatus1 == ERASED) { /* Page0 receive, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + HAL_StatusTypeDef fStat = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (fStat != HAL_OK) return fStat; + } + /* Mark Page0 as valid */ + /* As the last operation, simply return the result */ + return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + } + else { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + /* As the last operation, simply return the result */ + return EE_Format(); + } + break; + + case VALID_PAGE: + if (PageStatus1 == VALID_PAGE) { /* Invalid state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + FlashStatus = EE_Format(); + /* If erase/program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + else if (PageStatus1 == ERASED) { /* Page0 valid, Page1 erased */ + pEraseInit.Sector = PAGE1_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + } + else { /* Page0 valid, Page1 receive */ + /* Transfer data from Page0 to Page1 */ + int16_t x = -1; + for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx]) + x = VarIdx; + + if (VarIdx != x) { + /* Read the last variables' updates */ + uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the Page1 */ + uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + /* Mark Page1 as valid */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE1_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + /* As the last operation, simply return the result */ + return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + } + } + break; + + default: /* Any other state -> format eeprom */ + /* Erase both Page0 and Page1 and set Page0 as valid page */ + /* As the last operation, simply return the result */ + return EE_Format(); + } + + return HAL_OK; +} + +/** + * @brief Verify if specified page is fully erased. + * @param Address: page address + * This parameter can be one of the following values: + * @arg PAGE0_BASE_ADDRESS: Page0 base address + * @arg PAGE1_BASE_ADDRESS: Page1 base address + * @retval page fully erased status: + * - 0: if Page not erased + * - 1: if Page erased + */ +uint16_t EE_VerifyPageFullyErased(uint32_t Address) { + uint32_t ReadStatus = 1; + /* Check each active page address starting from end */ + while (Address <= PAGE0_END_ADDRESS) { + /* Get the current location content to be compared with virtual address */ + uint16_t AddressValue = (*(__IO uint16_t*)Address); + /* Compare the read address with the virtual address */ + if (AddressValue != ERASED) { + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + /* Next address location */ + Address += 4; + } + /* Return ReadStatus value: (0: Page not erased, 1: Sector erased) */ + return ReadStatus; +} + +/** + * @brief Returns the last stored variable data, if found, which correspond to + * the passed virtual address + * @param VirtAddress: Variable virtual address + * @param Data: Global variable contains the read variable value + * @retval Success or error status: + * - 0: if variable was found + * - 1: if the variable was not found + * - NO_VALID_PAGE: if no valid page was found. + */ +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) { + uint16_t ReadStatus = 1; + + /* Get active Page for read operation */ + uint16_t ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start and end Addresses */ + uint32_t PageStartAddress = uint32_t(EEPROM_START_ADDRESS) + uint32_t(ValidPage * (PAGE_SIZE)), + Address = PageStartAddress + PAGE_SIZE - 2; + + /* Check each active page address starting from end */ + while (Address > PageStartAddress + 2) { + /* Get the current location content to be compared with virtual address */ + uint16_t AddressValue = (*(__IO uint16_t*)Address); + + /* Compare the read address with the virtual address */ + if (AddressValue == VirtAddress) { + /* Get content of Address-2 which is variable value */ + *Data = (*(__IO uint16_t*)(Address - 2)); + /* In case variable value is read, reset ReadStatus flag */ + ReadStatus = 0; + break; + } + else /* Next address location */ + Address -= 4; + } + /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ + return ReadStatus; +} + +/** + * @brief Writes/upadtes variable data in EEPROM. + * @param VirtAddress: Variable virtual address + * @param Data: 16 bit data to be written + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data) { + /* Write the variable virtual address and value in the EEPROM */ + uint16_t Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + + /* In case the EEPROM active page is full */ + if (Status == PAGE_FULL) /* Perform Page transfer */ + Status = EE_PageTransfer(VirtAddress, Data); + + /* Return last operation status */ + return Status; +} + +/** + * @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 formatting + */ +static HAL_StatusTypeDef EE_Format() { + FLASH_EraseInitTypeDef pEraseInit; + pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS; + pEraseInit.Sector = PAGE0_ID; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + HAL_StatusTypeDef FlashStatus; // = HAL_OK + + /* Erase Page0 */ + if (!EE_VerifyPageFullyErased(PAGE0_BASE_ADDRESS)) { + uint32_t SectorError; + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + } + /* Set Page0 as valid page: Write VALID_PAGE at Page0 base address */ + FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, PAGE0_BASE_ADDRESS, VALID_PAGE); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + pEraseInit.Sector = PAGE1_ID; + /* Erase Page1 */ + if (!EE_VerifyPageFullyErased(PAGE1_BASE_ADDRESS)) { + /* As the last operation, just return the result code */ + uint32_t SectorError; + return HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + } + + return HAL_OK; +} + +/** + * @brief Find valid Page for write or read operation + * @param Operation: operation to achieve on the valid page. + * This parameter can be one of the following values: + * @arg READ_FROM_VALID_PAGE: read operation from valid page + * @arg WRITE_IN_VALID_PAGE: write operation from valid page + * @retval Valid page number (PAGE or PAGE1) or NO_VALID_PAGE in case + * of no valid page was found + */ +static uint16_t EE_FindValidPage(uint8_t Operation) { + /* Get Page0 and Page1 actual status */ + uint16_t PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS), + PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS); + + /* Write or read operation */ + switch (Operation) { + case WRITE_IN_VALID_PAGE: /* ---- Write operation ---- */ + if (PageStatus1 == VALID_PAGE) { + /* Page0 receiving data */ + return (PageStatus0 == RECEIVE_DATA) ? PAGE0 : PAGE1; + } + else if (PageStatus0 == VALID_PAGE) { + /* Page1 receiving data */ + return (PageStatus1 == RECEIVE_DATA) ? PAGE1 : PAGE0; + } + else + return NO_VALID_PAGE; /* No valid Page */ + + case READ_FROM_VALID_PAGE: /* ---- Read operation ---- */ + if (PageStatus0 == VALID_PAGE) + return PAGE0; /* Page0 valid */ + else if (PageStatus1 == VALID_PAGE) + return PAGE1; /* Page1 valid */ + else + return NO_VALID_PAGE; /* No valid Page */ + + default: + return PAGE0; /* Page0 valid */ + } +} + +/** + * @brief Verify if active page is full and Writes variable in EEPROM. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data) { + /* Get valid Page for write operation */ + uint16_t ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE); + + /* Check if there is no valid page */ + if (ValidPage == NO_VALID_PAGE) return NO_VALID_PAGE; + + /* Get the valid Page start and end Addresses */ + uint32_t Address = uint32_t(EEPROM_START_ADDRESS) + uint32_t(ValidPage * (PAGE_SIZE)), + PageEndAddress = Address + PAGE_SIZE - 1; + + /* Check each active page address starting from begining */ + while (Address < PageEndAddress) { + /* Verify if Address and Address+2 contents are 0xFFFFFFFF */ + if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF) { + /* Set variable data */ + HAL_StatusTypeDef FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address, Data); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + /* Set variable virtual address, return status */ + return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address + 2, VirtAddress); + } + else /* Next address location */ + Address += 4; + } + + /* Return PAGE_FULL in case the valid page is full */ + return PAGE_FULL; +} + +/** + * @brief Transfers last updated variables data from the full Page to + * an empty one. + * @param VirtAddress: 16 bit virtual address of the variable + * @param Data: 16 bit data to be written as variable value + * @retval Success or error status: + * - FLASH_COMPLETE: on success + * - PAGE_FULL: if valid page is full + * - NO_VALID_PAGE: if no valid page was found + * - Flash error code: on write Flash error + */ +static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data) { + /* Get active Page for read operation */ + uint16_t ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); + uint32_t NewPageAddress = EEPROM_START_ADDRESS; + uint16_t OldPageId = 0; + + if (ValidPage == PAGE1) { /* Page1 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE0_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE1_ID; + } + else if (ValidPage == PAGE0) { /* Page0 valid */ + /* New page address where variable will be moved to */ + NewPageAddress = PAGE1_BASE_ADDRESS; + /* Old page ID where variable will be taken from */ + OldPageId = PAGE0_ID; + } + else + return NO_VALID_PAGE; /* No valid Page */ + + /* Set the new Page status to RECEIVE_DATA status */ + HAL_StatusTypeDef FlashStatus = HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, RECEIVE_DATA); + /* If program operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Write the variable passed as parameter in the new active page */ + uint16_t EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + + /* Transfer process: transfer variables from old to the new active page */ + for (uint16_t VarIdx = 0; VarIdx < NB_OF_VAR; VarIdx++) { + if (VirtAddVarTab[VarIdx] != VirtAddress) { /* Check each variable except the one passed as parameter */ + /* Read the other last variable updates */ + uint16_t ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar); + /* In case variable corresponding to the virtual address was found */ + if (ReadStatus != 0x1) { + /* Transfer the variable to the new active page */ + EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar); + /* If program operation was failed, a Flash error code is returned */ + if (EepromStatus != HAL_OK) return EepromStatus; + } + } + } + + FLASH_EraseInitTypeDef pEraseInit; + pEraseInit.TypeErase = TYPEERASE_SECTORS; + pEraseInit.Sector = OldPageId; + pEraseInit.NbSectors = 1; + pEraseInit.VoltageRange = VOLTAGE_RANGE; + + /* Erase the old Page: Set old Page status to ERASED status */ + uint32_t SectorError; + FlashStatus = HAL_FLASHEx_Erase(&pEraseInit, &SectorError); + /* If erase operation was failed, a Flash error code is returned */ + if (FlashStatus != HAL_OK) return FlashStatus; + + /* Set new Page status to VALID_PAGE status */ + /* As the last operation, just return the result code */ + return HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, NewPageAddress, VALID_PAGE); +} + +#endif // FLASH_EEPROM_EMULATION +#endif // STM32GENERIC && (STM32F4 || STM32F7) + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h new file mode 100644 index 00000000..84c4c6e3 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_emul.h @@ -0,0 +1,114 @@ +/****************************************************************************** + * @file eeprom_emul.h + * @author MCD Application Team + * @version V1.2.6 + * @date 04-November-2016 + * @brief This file contains all the functions prototypes for the EEPROM + * emulation firmware library. + ****************************************************************************** + * @attention + * + * Copyright © 2016 STMicroelectronics International N.V. + * 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. Redistribution 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 other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS 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 + +// ------------------------ +// Includes +// ------------------------ + +#include "../../inc/MarlinConfig.h" + +/* Exported constants --------------------------------------------------------*/ +/* EEPROM emulation firmware error codes */ +#define EE_OK uint32_t(HAL_OK) +#define EE_ERROR uint32_t(HAL_ERROR) +#define EE_BUSY uint32_t(HAL_BUSY) +#define EE_TIMEOUT uint32_t(HAL_TIMEOUT) + +/* Define the size of the sectors to be used */ +#define PAGE_SIZE uint32_t(0x4000) /* Page size = 16KByte */ + +/* Device voltage range supposed to be [2.7V to 3.6V], the operation will + be done by word */ +#define VOLTAGE_RANGE uint8_t(VOLTAGE_RANGE_3) + +/* EEPROM start address in Flash */ +#ifdef STM32F7 + #define EEPROM_START_ADDRESS uint32_t(0x08100000) /* EEPROM emulation start address: + from sector2 : after 16KByte of used + Flash memory */ +#else + #define EEPROM_START_ADDRESS uint32_t(0x08078000) /* EEPROM emulation start address: + after 480KByte of used Flash memory */ +#endif + +/* Pages 0 and 1 base and end addresses */ +#define PAGE0_BASE_ADDRESS uint32_t(EEPROM_START_ADDRESS + 0x0000) +#define PAGE0_END_ADDRESS uint32_t(EEPROM_START_ADDRESS + PAGE_SIZE - 1) +#define PAGE0_ID FLASH_SECTOR_1 + +#define PAGE1_BASE_ADDRESS uint32_t(EEPROM_START_ADDRESS + 0x4000) +#define PAGE1_END_ADDRESS uint32_t(EEPROM_START_ADDRESS + 2 * (PAGE_SIZE) - 1) +#define PAGE1_ID FLASH_SECTOR_2 + +/* Used Flash pages for EEPROM emulation */ +#define PAGE0 uint16_t(0x0000) +#define PAGE1 uint16_t(0x0001) /* Page nb between PAGE0_BASE_ADDRESS & PAGE1_BASE_ADDRESS*/ + +/* No valid page define */ +#define NO_VALID_PAGE uint16_t(0x00AB) + +/* Page status definitions */ +#define ERASED uint16_t(0xFFFF) /* Page is empty */ +#define RECEIVE_DATA uint16_t(0xEEEE) /* Page is marked to receive data */ +#define VALID_PAGE uint16_t(0x0000) /* Page containing valid data */ + +/* Valid pages in read and write defines */ +#define READ_FROM_VALID_PAGE uint8_t(0x00) +#define WRITE_IN_VALID_PAGE uint8_t(0x01) + +/* Page full define */ +#define PAGE_FULL uint8_t(0x80) + +/* Variables' number */ +#define NB_OF_VAR uint16_t(4096) + +/* Exported functions ------------------------------------------------------- */ +uint16_t EE_Initialize(); +uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); +uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp new file mode 100644 index 00000000..00b808fd --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_flash.cpp @@ -0,0 +1,111 @@ +/** + * 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 . + * + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/eeprom_api.h" +#include "eeprom_emul.h" + +// FLASH_FLAG_PGSERR (Programming Sequence Error) was renamed to +// FLASH_FLAG_ERSERR (Erasing Sequence Error) in STM32F4/7 + +#ifdef STM32F7 + #define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR +#else + //#define FLASH_FLAG_PGSERR FLASH_FLAG_ERSERR +#endif + +void ee_write_byte(uint8_t *pos, unsigned char value) { + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + const unsigned eeprom_address = (unsigned)pos; + if (EE_WriteVariable(eeprom_address, uint16_t(value)) != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); +} + +uint8_t ee_read_byte(uint8_t *pos) { + uint16_t data = 0xFF; + const unsigned eeprom_address = (unsigned)pos; + (void)EE_ReadVariable(eeprom_address, &data); // Data unchanged on error + return uint8_t(data); +} + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for Flash-based EEPROM." +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_finish() { return true; } + +bool PersistentStore::access_start() { + static bool ee_initialized = false; + if (!ee_initialized) { + HAL_FLASH_Unlock(); + + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + + /* EEPROM Init */ + if (EE_Initialize() != EE_OK) + for (;;) HAL_Delay(1); // Spin forever until watchdog reset + + HAL_FLASH_Lock(); + ee_initialized = true; + } + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + while (size--) { + uint8_t * const p = (uint8_t * const)pos; + uint8_t v = *value; + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != ee_read_byte(p)) { + ee_write_byte(p, v); + if (ee_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 c = ee_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // FLASH_EEPROM_EMULATION +#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp new file mode 100644 index 00000000..c0d82dbd --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/eeprom_wired.cpp @@ -0,0 +1,77 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 . + * + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for I2C / SPI 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 * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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); + 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h b/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.h new file mode 100644 index 00000000..fdff8cc6 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/endstop_interrupts.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 + * Copyright (c) 2017 Victor Perez + * + * 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 "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/STM32_F4_F7/fastio.h b/Marlin/src/HAL/STM32_F4_F7/fastio.h new file mode 100644 index 00000000..f42be583 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/fastio.h @@ -0,0 +1,310 @@ +/** + * 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 + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * Fast I/O interfaces for STM32F4/7 + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef PWM + #define PWM OUTPUT +#endif + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) + +#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 OUT_WRITE(IO,V) do{ _SET_OUTPUT(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 */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) +#define SET_PWM(IO) _SET_MODE(IO, PWM) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define IS_INPUT(IO) +#define IS_OUTPUT(IO) + +#define PWM_PIN(P) true + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +// +// Pins Definitions +// +#define PORTA 0 +#define PORTB 1 +#define PORTC 2 +#define PORTD 3 +#define PORTE 4 +#define PORTF 5 +#define PORTG 6 + +#define _STM32_PIN(P,PN) ((PORT##P * 16) + PN) + +#undef PA0 +#define PA0 _STM32_PIN(A, 0) +#undef PA1 +#define PA1 _STM32_PIN(A, 1) +#undef PA2 +#define PA2 _STM32_PIN(A, 2) +#undef PA3 +#define PA3 _STM32_PIN(A, 3) +#undef PA4 +#define PA4 _STM32_PIN(A, 4) +#undef PA5 +#define PA5 _STM32_PIN(A, 5) +#undef PA6 +#define PA6 _STM32_PIN(A, 6) +#undef PA7 +#define PA7 _STM32_PIN(A, 7) +#undef PA8 +#define PA8 _STM32_PIN(A, 8) +#undef PA9 +#define PA9 _STM32_PIN(A, 9) +#undef PA10 +#define PA10 _STM32_PIN(A, 10) +#undef PA11 +#define PA11 _STM32_PIN(A, 11) +#undef PA12 +#define PA12 _STM32_PIN(A, 12) +#undef PA13 +#define PA13 _STM32_PIN(A, 13) +#undef PA14 +#define PA14 _STM32_PIN(A, 14) +#undef PA15 +#define PA15 _STM32_PIN(A, 15) + +#undef PB0 +#define PB0 _STM32_PIN(B, 0) +#undef PB1 +#define PB1 _STM32_PIN(B, 1) +#undef PB2 +#define PB2 _STM32_PIN(B, 2) +#undef PB3 +#define PB3 _STM32_PIN(B, 3) +#undef PB4 +#define PB4 _STM32_PIN(B, 4) +#undef PB5 +#define PB5 _STM32_PIN(B, 5) +#undef PB6 +#define PB6 _STM32_PIN(B, 6) +#undef PB7 +#define PB7 _STM32_PIN(B, 7) +#undef PB8 +#define PB8 _STM32_PIN(B, 8) +#undef PB9 +#define PB9 _STM32_PIN(B, 9) +#undef PB10 +#define PB10 _STM32_PIN(B, 10) +#undef PB11 +#define PB11 _STM32_PIN(B, 11) +#undef PB12 +#define PB12 _STM32_PIN(B, 12) +#undef PB13 +#define PB13 _STM32_PIN(B, 13) +#undef PB14 +#define PB14 _STM32_PIN(B, 14) +#undef PB15 +#define PB15 _STM32_PIN(B, 15) + +#undef PC0 +#define PC0 _STM32_PIN(C, 0) +#undef PC1 +#define PC1 _STM32_PIN(C, 1) +#undef PC2 +#define PC2 _STM32_PIN(C, 2) +#undef PC3 +#define PC3 _STM32_PIN(C, 3) +#undef PC4 +#define PC4 _STM32_PIN(C, 4) +#undef PC5 +#define PC5 _STM32_PIN(C, 5) +#undef PC6 +#define PC6 _STM32_PIN(C, 6) +#undef PC7 +#define PC7 _STM32_PIN(C, 7) +#undef PC8 +#define PC8 _STM32_PIN(C, 8) +#undef PC9 +#define PC9 _STM32_PIN(C, 9) +#undef PC10 +#define PC10 _STM32_PIN(C, 10) +#undef PC11 +#define PC11 _STM32_PIN(C, 11) +#undef PC12 +#define PC12 _STM32_PIN(C, 12) +#undef PC13 +#define PC13 _STM32_PIN(C, 13) +#undef PC14 +#define PC14 _STM32_PIN(C, 14) +#undef PC15 +#define PC15 _STM32_PIN(C, 15) + +#undef PD0 +#define PD0 _STM32_PIN(D, 0) +#undef PD1 +#define PD1 _STM32_PIN(D, 1) +#undef PD2 +#define PD2 _STM32_PIN(D, 2) +#undef PD3 +#define PD3 _STM32_PIN(D, 3) +#undef PD4 +#define PD4 _STM32_PIN(D, 4) +#undef PD5 +#define PD5 _STM32_PIN(D, 5) +#undef PD6 +#define PD6 _STM32_PIN(D, 6) +#undef PD7 +#define PD7 _STM32_PIN(D, 7) +#undef PD8 +#define PD8 _STM32_PIN(D, 8) +#undef PD9 +#define PD9 _STM32_PIN(D, 9) +#undef PD10 +#define PD10 _STM32_PIN(D, 10) +#undef PD11 +#define PD11 _STM32_PIN(D, 11) +#undef PD12 +#define PD12 _STM32_PIN(D, 12) +#undef PD13 +#define PD13 _STM32_PIN(D, 13) +#undef PD14 +#define PD14 _STM32_PIN(D, 14) +#undef PD15 +#define PD15 _STM32_PIN(D, 15) + +#undef PE0 +#define PE0 _STM32_PIN(E, 0) +#undef PE1 +#define PE1 _STM32_PIN(E, 1) +#undef PE2 +#define PE2 _STM32_PIN(E, 2) +#undef PE3 +#define PE3 _STM32_PIN(E, 3) +#undef PE4 +#define PE4 _STM32_PIN(E, 4) +#undef PE5 +#define PE5 _STM32_PIN(E, 5) +#undef PE6 +#define PE6 _STM32_PIN(E, 6) +#undef PE7 +#define PE7 _STM32_PIN(E, 7) +#undef PE8 +#define PE8 _STM32_PIN(E, 8) +#undef PE9 +#define PE9 _STM32_PIN(E, 9) +#undef PE10 +#define PE10 _STM32_PIN(E, 10) +#undef PE11 +#define PE11 _STM32_PIN(E, 11) +#undef PE12 +#define PE12 _STM32_PIN(E, 12) +#undef PE13 +#define PE13 _STM32_PIN(E, 13) +#undef PE14 +#define PE14 _STM32_PIN(E, 14) +#undef PE15 +#define PE15 _STM32_PIN(E, 15) + +#ifdef STM32F7 + + #undef PORTF + #define PORTF 5 + #undef PF0 + #define PF0 _STM32_PIN(F, 0) + #undef PF1 + #define PF1 _STM32_PIN(F, 1) + #undef PF2 + #define PF2 _STM32_PIN(F, 2) + #undef PF3 + #define PF3 _STM32_PIN(F, 3) + #undef PF4 + #define PF4 _STM32_PIN(F, 4) + #undef PF5 + #define PF5 _STM32_PIN(F, 5) + #undef PF6 + #define PF6 _STM32_PIN(F, 6) + #undef PF7 + #define PF7 _STM32_PIN(F, 7) + #undef PF8 + #define PF8 _STM32_PIN(F, 8) + #undef PF9 + #define PF9 _STM32_PIN(F, 9) + #undef PF10 + #define PF10 _STM32_PIN(F, 10) + #undef PF11 + #define PF11 _STM32_PIN(F, 11) + #undef PF12 + #define PF12 _STM32_PIN(F, 12) + #undef PF13 + #define PF13 _STM32_PIN(F, 13) + #undef PF14 + #define PF14 _STM32_PIN(F, 14) + #undef PF15 + #define PF15 _STM32_PIN(F, 15) + + #undef PORTG + #define PORTG 6 + #undef PG0 + #define PG0 _STM32_PIN(G, 0) + #undef PG1 + #define PG1 _STM32_PIN(G, 1) + #undef PG2 + #define PG2 _STM32_PIN(G, 2) + #undef PG3 + #define PG3 _STM32_PIN(G, 3) + #undef PG4 + #define PG4 _STM32_PIN(G, 4) + #undef PG5 + #define PG5 _STM32_PIN(G, 5) + #undef PG6 + #define PG6 _STM32_PIN(G, 6) + #undef PG7 + #define PG7 _STM32_PIN(G, 7) + #undef PG8 + #define PG8 _STM32_PIN(G, 8) + #undef PG9 + #define PG9 _STM32_PIN(G, 9) + #undef PG10 + #define PG10 _STM32_PIN(G, 10) + #undef PG11 + #define PG11 _STM32_PIN(G, 11) + #undef PG12 + #define PG12 _STM32_PIN(G, 12) + #undef PG13 + #define PG13 _STM32_PIN(G, 13) + #undef PG14 + #define PG14 _STM32_PIN(G, 14) + #undef PG15 + #define PG15 _STM32_PIN(G, 15) + +#endif // STM32GENERIC && STM32F7 diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h new file mode 100644 index 00000000..a9f1b582 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#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/STM32_F4_F7/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h new file mode 100644 index 00000000..b5d808e2 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/inc/Conditionals_post.h @@ -0,0 +1,29 @@ +/** + * 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 + +#if ENABLED(EEPROM_SETTINGS) && defined(STM32F7) + #undef USE_WIRED_EEPROM + #undef SRAM_EEPROM_EMULATION + #undef SDCARD_EEPROM_EMULATION + #define FLASH_EEPROM_EMULATION +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h new file mode 100644 index 00000000..9bb36f3b --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/inc/SanityCheck.h @@ -0,0 +1,41 @@ +/** + * 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 + +/** + * Test STM32F4/7-specific configuration values for errors at compile-time. + */ +//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11) +// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" +//#endif + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for STM32F4/7. 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 STM32F4/F7." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h b/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h new file mode 100644 index 00000000..973abb1b --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/pinsDebug.h @@ -0,0 +1,27 @@ +/** + * 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 + +#ifdef NUM_DIGITAL_PINS // Only in ST's Arduino core (STM32duino, STM32Core) + #include "../STM32/pinsDebug_STM32duino.h" +#elif defined(BOARD_NR_GPIO_PINS) // Only in STM32GENERIC (Maple) + #include "../STM32/pinsDebug_STM32GENERIC.h" +#else + #error "M43 Pins Debugging not supported for this board." +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/spi_pins.h b/Marlin/src/HAL/STM32_F4_F7/spi_pins.h new file mode 100644 index 00000000..75a6a2b2 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/spi_pins.h @@ -0,0 +1,35 @@ +/** + * 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 + +/** + * Define SPI Pins: SCK, MISO, MOSI, SS + */ +#ifndef SCK_PIN + #define SCK_PIN PA5 +#endif +#ifndef MISO_PIN + #define MISO_PIN PA6 +#endif +#ifndef MOSI_PIN + #define MOSI_PIN PA7 +#endif +#ifndef SS_PIN + #define SS_PIN PA8 +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/timers.h b/Marlin/src/HAL/STM32_F4_F7/timers.h new file mode 100644 index 00000000..4e8c8178 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/timers.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2017 Victor Perez + * + * 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 STM32F4 + #include "STM32F4/timers.h" +#else + #include "STM32F7/timers.h" +#endif diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp new file mode 100644 index 00000000..cb12ec7a --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/watchdog.cpp @@ -0,0 +1,55 @@ +/** + * 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 . + * + */ +#if defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + + #include "watchdog.h" + + IWDG_HandleTypeDef hiwdg; + + void watchdog_init() { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock + hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + //Error_Handler(); + } + else { + #if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING) + TOGGLE(LED_PIN); // heartbeat indicator + #endif + } + } + + void HAL_watchdog_refresh() { + /* Refresh IWDG: reload counter */ + if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { + /* Refresh Error */ + //Error_Handler(); + } + } + +#endif // USE_WATCHDOG +#endif // STM32GENERIC && (STM32F4 || STM32F7) diff --git a/Marlin/src/HAL/STM32_F4_F7/watchdog.h b/Marlin/src/HAL/STM32_F4_F7/watchdog.h new file mode 100644 index 00000000..3dbc2d08 --- /dev/null +++ b/Marlin/src/HAL/STM32_F4_F7/watchdog.h @@ -0,0 +1,27 @@ +/** + * 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 + +extern IWDG_HandleTypeDef hiwdg; + +void watchdog_init(); +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp new file mode 100644 index 00000000..8c3dd833 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -0,0 +1,91 @@ +/** + * 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 . + * + */ + +/** + * HAL for Teensy 3.2 (MK20DX256) + */ + +#ifdef __MK20DX256__ + +#include "HAL.h" +#include "../shared/Delay.h" + +#include + +uint16_t HAL_adc_result; + +static const uint8_t pin2sc1a[] = { + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 0, 19, 3, 31, // 0-13, we treat them as A0-A13 + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 (A0-A9) + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, // 24-33 + 0+64, 19+64, 3+64, 31+64, // 34-37 (A10-A13) + 26, 22, 23, 27, 29, 30 // 38-43: temp. sensor, VREF_OUT, A14, bandgap, VREFH, VREFL. A14 isn't connected to anything in Teensy 3.0. +}; + +/* + // disable interrupts + void cli() { noInterrupts(); } + + // enable interrupts + void sei() { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish + NVIC_ENABLE_IRQ(IRQ_FTM1); +} + +void HAL_clear_reset_source() { } + +uint8_t HAL_get_reset_source() { + switch (RCM_SRS0) { + case 128: return RST_POWER_ON; break; + case 64: return RST_EXTERNAL; break; + case 32: return RST_WATCHDOG; break; + // case 8: return RST_LOSS_OF_LOCK; break; + // case 4: return RST_LOSS_OF_CLOCK; break; + // case 2: return RST_LOW_VOLTAGE; break; + } + return 0; +} + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { ADC0_SC1A = pin2sc1a[adc_pin]; } + +uint16_t HAL_adc_get_result() { return ADC0_RA; } + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h new file mode 100644 index 00000000..8ab358e9 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -0,0 +1,124 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL for Teensy 3.2 (MK20DX256) + */ + +#define CPU_32_BIT + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" + + +#include + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +//#undef MOTHERBOARD +//#define MOTHERBOARD BOARD_TEENSY31_32 + +#define IS_32BIT_TEENSY 1 +#define IS_TEENSY_31_32 1 +#ifndef IS_TEENSY31 + #define IS_TEENSY32 1 +#endif + +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_PRIMASK()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +inline void HAL_init() {} + +// Clear the reset reason +void HAL_clear_reset_source(); + +// Get the reason for the reset +uint8_t HAL_get_reset_source(); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +extern "C" { + int freeMemory(); +} +#pragma GCC diagnostic pop + +// ADC + +void HAL_adc_init(); + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp new file mode 100644 index 00000000..cdb3f470 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp @@ -0,0 +1,130 @@ +/** + * 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 . + * + */ +#ifdef __MK20DX256__ + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +/** + * Standard SPI functions + */ + +// Initialize SPI bus +void spiBegin() { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + OUT_WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + #if 0 && DISABLED(SOFTWARE_SPI) + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif +} + +// Configure SPI for specified SPI speed +void spiInit(uint8_t spiRate) { + // Use data rates Marlin uses + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +// SPI receive a byte +uint8_t spiRec() { + SPI.beginTransaction(spiConfig); + const uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; + //SPDR = 0xFF; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //return SPDR; +} + +// SPI read data +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); + //if (nbyte-- == 0) return; + // SPDR = 0xFF; + //for (uint16_t i = 0; i < nbyte; i++) { + // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + // buf[i] = SPDR; + // SPDR = 0xFF; + //} + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //buf[nbyte] = SPDR; +} + +// SPI send a byte +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); + //SPDR = b; + //while (!TEST(SPSR, SPIF)) { /* nada */ } +} + +// SPI send block +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + + +// Begin SPI transaction, set clock, bit order, data mode +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.cpp b/Marlin/src/HAL/TEENSY31_32/Servo.cpp new file mode 100644 index 00000000..19d57cf1 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/Servo.cpp @@ -0,0 +1,54 @@ +/** + * 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 . + * + */ +#ifdef __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +uint8_t servoPin[MAX_SERVOS] = { 0 }; + +int8_t libServo::attach(const int inPin) { + if (servoIndex >= MAX_SERVOS) return -1; + if (inPin > 0) servoPin[servoIndex] = inPin; + return super::attach(servoPin[servoIndex]); +} + +int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { + if (inPin > 0) servoPin[servoIndex] = inPin; + return super::attach(servoPin[servoIndex], inMin, inMax); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +#endif // HAS_SERVOS +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/Servo.h b/Marlin/src/HAL/TEENSY31_32/Servo.h new file mode 100644 index 00000000..82b601d9 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/Servo.h @@ -0,0 +1,37 @@ +/** + * 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 + +// Inherit and expand on the official library +class libServo : public Servo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + private: + typedef Servo super; + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // index into the channel data for this servo +}; diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp new file mode 100644 index 00000000..cc5c56f7 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -0,0 +1,72 @@ +/** + * 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 __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * HAL PersistentStore for Teensy 3.2 (MK20DX256) + */ + +#include "../shared/eeprom_api.h" +#include + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { 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 * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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); + 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h new file mode 100644 index 00000000..999ada51 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.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 + +/** + * Endstop Interrupts + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/TEENSY31_32/fastio.h b/Marlin/src/HAL/TEENSY31_32/fastio.h new file mode 100644 index 00000000..9a299de9 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/fastio.h @@ -0,0 +1,98 @@ +/** + * 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 + +/** + * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) +#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * 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) + +#define _WRITE(P,V) do{ \ + if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ + else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ +}while(0) + +#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) + +#define _SET_INPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _SET_OUTPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ +}while(0) + +#define _SET_INPUT_PULLUP(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) +#define _IS_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) + +#define READ(IO) _READ(IO) + +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) +#define SET_INPUT_PULLDOWN SET_INPUT +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) +#define SET_PWM SET_OUTPUT + +#define IS_INPUT(IO) _IS_INPUT(IO) +#define IS_OUTPUT(IO) _IS_OUTPUT(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +#define PWM_PIN(P) digitalPinHasPWM(P) + +/** + * Ports, functions, and pins + */ + +#define DIO0_PIN 8 diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h new file mode 100644 index 00000000..54ec1666 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#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/TEENSY31_32/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h new file mode 100644 index 00000000..998f1dcc --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/inc/Conditionals_post.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if USE_FALLBACK_EEPROM + #define USE_WIRED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h new file mode 100644 index 00000000..3932ee6a --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h @@ -0,0 +1,38 @@ +/** + * 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 + +/** + * Test TEENSY35_36 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.1/3.2. 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 Teensy 3.1/3.2." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/TEENSY31_32/pinsDebug.h b/Marlin/src/HAL/TEENSY31_32/pinsDebug.h new file mode 100644 index 00000000..d4a91ce8 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/pinsDebug.h @@ -0,0 +1 @@ +#error "PINS_DEBUGGING is not yet supported for Teensy 3.1 / 3.2!" diff --git a/Marlin/src/HAL/TEENSY31_32/spi_pins.h b/Marlin/src/HAL/TEENSY31_32/spi_pins.h new file mode 100644 index 00000000..5754fbfe --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/spi_pins.h @@ -0,0 +1,27 @@ +/** + * 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 SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 //SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY31_32/timers.cpp b/Marlin/src/HAL/TEENSY31_32/timers.cpp new file mode 100644 index 00000000..7e01a38f --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/timers.cpp @@ -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 . + * + */ + +/** + * HAL Timers for Teensy 3.2 (MK20DX256) + */ + +#ifdef __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +/** \brief Instruction Synchronization Barrier + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. +*/ +FORCE_INLINE static void __ISB() { + __asm__ __volatile__("isb 0xF":::"memory"); +} + +/** \brief Data Synchronization Barrier + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. +*/ +FORCE_INLINE static void __DSB() { + __asm__ __volatile__("dsb 0xF":::"memory"); +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; + FTM0_SC = 0x00; // Set this to zero before changing the modulus + FTM0_CNT = 0x0000; // Reset the count to zero + FTM0_MOD = 0xFFFF; // max modulus = 65535 + FTM0_C0V = (FTM0_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value + FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 + FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + case 1: + FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 + FTM1_SC = 0x00; // Set this to zero before changing the modulus + FTM1_CNT = 0x0000; // Reset the count to zero + FTM1_MOD = 0xFFFF; // max modulus = 65535 + FTM1_C0V = (FTM1_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value 65535 + FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 + FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_IS_ENABLED(IRQ_FTM0); + case 1: return NVIC_IS_ENABLED(IRQ_FTM1); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: + FTM0_CNT = 0x0000; + FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + case 1: + FTM1_CNT = 0x0000; + FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + } +} + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/timers.h b/Marlin/src/HAL/TEENSY31_32/timers.h new file mode 100644 index 00000000..135b3288 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/timers.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 + +/** + * HAL Timers for Teensy 3.2 (MK20DX256) + */ + +#include + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define FTM0_TIMER_PRESCALE 8 +#define FTM1_TIMER_PRESCALE 4 +#define FTM0_TIMER_PRESCALE_BITS 0b011 +#define FTM1_TIMER_PRESCALE_BITS 0b010 + +#define FTM0_TIMER_RATE (F_BUS / (FTM0_TIMER_PRESCALE)) // 60MHz / 8 = 7500kHz +#define FTM1_TIMER_RATE (F_BUS / (FTM1_TIMER_PRESCALE)) // 60MHz / 4 = 15MHz + +#define HAL_TIMER_RATE (FTM0_TIMER_RATE) + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() +#endif + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: FTM0_C0V = compare; break; + case 1: FTM1_C0V = compare; break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_C0V; + case 1: return FTM1_C0V; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_CNT; + case 1: return FTM1_CNT; + } + return 0; +} + +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); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.cpp b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp new file mode 100644 index 00000000..9f7b70d9 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/watchdog.cpp @@ -0,0 +1,38 @@ +/** + * 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 . + * + */ +#ifdef __MK20DX256__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +void watchdog_init() { + WDOG_TOVALH = 0; + WDOG_TOVALL = 4000; + WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; +} + +#endif // USE_WATCHDOG + +#endif // __MK20DX256__ diff --git a/Marlin/src/HAL/TEENSY31_32/watchdog.h b/Marlin/src/HAL/TEENSY31_32/watchdog.h new file mode 100644 index 00000000..b8b46a40 --- /dev/null +++ b/Marlin/src/HAL/TEENSY31_32/watchdog.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 + +#include "HAL.h" + +// Arduino Due core now has watchdog support + +void watchdog_init(); + +inline void HAL_watchdog_refresh() { + // Watchdog refresh sequence + WDOG_REFRESH = 0xA602; + WDOG_REFRESH = 0xB480; +} diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp new file mode 100644 index 00000000..92907353 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -0,0 +1,120 @@ +/** + * 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 . + * + */ + +/** + * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include "../shared/Delay.h" + +#include + +uint16_t HAL_adc_result, HAL_adc_select; + +static const uint8_t pin2sc1a[] = { + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 3, 19+128, 14+128, 15+128, // 0-13 -> A0-A13 + 5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 are A0-A9 + 255, 255, 255, 255, 255, 255, 255, // 24-30 are digital only + 14+128, 15+128, 17, 18, 4+128, 5+128, 6+128, 7+128, 17+128, // 31-39 are A12-A20 + 255, 255, 255, 255, 255, 255, 255, 255, 255, // 40-48 are digital only + 10+128, 11+128, // 49-50 are A23-A24 + 255, 255, 255, 255, 255, 255, 255, // 51-57 are digital only + 255, 255, 255, 255, 255, 255, // 58-63 (sd card pins) are digital only + 3, 19+128, // 64-65 are A10-A11 + 23, 23+128,// 66-67 are A21-A22 (DAC pins) + 1, 1+128, // 68-69 are A25-A26 (unused USB host port on Teensy 3.5) + 26, // 70 is Temperature Sensor + 18+128 // 71 is Vref +}; + +/* + // disable interrupts + void cli() { noInterrupts(); } + + // enable interrupts + void sei() { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC0_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish + while (ADC1_SC3 & ADC_SC3_CAL) {}; // Wait for calibration to finish + NVIC_ENABLE_IRQ(IRQ_FTM1); +} + +void HAL_clear_reset_source() { } + +uint8_t HAL_get_reset_source() { + switch (RCM_SRS0) { + case 128: return RST_POWER_ON; break; + case 64: return RST_EXTERNAL; break; + case 32: return RST_WATCHDOG; break; + // case 8: return RST_LOSS_OF_LOCK; break; + // case 4: return RST_LOSS_OF_CLOCK; break; + // case 2: return RST_LOW_VOLTAGE; break; + } + return 0; +} + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + int freeMemory() { + int free_memory; + if ((int)__brkval == 0) + free_memory = ((int)&free_memory) - ((int)&__bss_end); + else + free_memory = ((int)&free_memory) - ((int)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + const uint16_t pin = pin2sc1a[adc_pin]; + if (pin == 0xFF) { + // Digital only + HAL_adc_select = -1; + } + else if (pin & 0x80) { + HAL_adc_select = 1; + ADC1_SC1A = pin & 0x7F; + } + else { + HAL_adc_select = 0; + ADC0_SC1A = pin; + } +} + +uint16_t HAL_adc_get_result() { + switch (HAL_adc_select) { + case 0: return ADC0_RA; + case 1: return ADC1_RA; + } + return 0; +} + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h new file mode 100644 index 00000000..2b735d62 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -0,0 +1,130 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#define CPU_32_BIT + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" + +#include +#include + +#define ST7920_DELAY_1 DELAY_NS(600) +#define ST7920_DELAY_2 DELAY_NS(750) +#define ST7920_DELAY_3 DELAY_NS(750) + +// ------------------------ +// Defines +// ------------------------ + +#define IS_32BIT_TEENSY 1 +#define IS_TEENSY_35_36 1 +#ifdef __MK66FX1M0__ + #define IS_TEENSY36 1 +#else // __MK64FX512__ + #define IS_TEENSY35 1 +#endif + +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif WITHIN(SERIAL_PORT, 0, 3) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_primask()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#undef sq +#define sq(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +inline void HAL_init() {} + +// Clear reset reason +void HAL_clear_reset_source(); + +// Reset reason +uint8_t HAL_get_reset_source(); + +inline void HAL_reboot() {} // reboot the board or restart the bootloader + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +extern "C" { + int freeMemory(); +} +#pragma GCC diagnostic pop + +// ADC + +void HAL_adc_init(); + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp new file mode 100644 index 00000000..b36900a3 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -0,0 +1,125 @@ +/** + * 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 . + * + */ + +/** + * HAL SPI for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +void spiBegin() { + #if !PIN_EXISTS(SS) + #error "SS_PIN not defined!" + #endif + OUT_WRITE(SS_PIN, HIGH); + SET_OUTPUT(SCK_PIN); + SET_INPUT(MISO_PIN); + SET_OUTPUT(MOSI_PIN); + + #if 0 && DISABLED(SOFTWARE_SPI) + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif +} + +void spiInit(uint8_t spiRate) { + // Use Marlin data-rates + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +uint8_t spiRec() { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; + //SPDR = 0xFF; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //return SPDR; +} + +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); + //if (nbyte-- == 0) return; + // SPDR = 0xFF; + //for (uint16_t i = 0; i < nbyte; i++) { + // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + // buf[i] = SPDR; + // SPDR = 0xFF; + //} + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //buf[nbyte] = SPDR; +} + +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); + //SPDR = b; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +} + +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + +// Begin SPI transaction, set clock, bit order, data mode +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.cpp b/Marlin/src/HAL/TEENSY35_36/Servo.cpp new file mode 100644 index 00000000..03385859 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/Servo.cpp @@ -0,0 +1,59 @@ +/** + * 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 . + * + */ + +/** + * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +uint8_t servoPin[MAX_SERVOS] = { 0 }; + +int8_t libServo::attach(const int inPin) { + if (servoIndex >= MAX_SERVOS) return -1; + if (inPin > 0) servoPin[servoIndex] = inPin; + return super::attach(servoPin[servoIndex]); +} + +int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { + if (inPin > 0) servoPin[servoIndex] = inPin; + return super::attach(servoPin[servoIndex], inMin, inMax); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +#endif // HAS_SERVOS +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/Servo.h b/Marlin/src/HAL/TEENSY35_36/Servo.h new file mode 100644 index 00000000..719011f1 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/Servo.h @@ -0,0 +1,41 @@ +/** + * 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 + +/** + * HAL Servo for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#include + +// Inherit and expand on core Servo library +class libServo : public Servo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + private: + typedef Servo super; + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // Index into the channel data for this servo +}; diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp new file mode 100644 index 00000000..ccbdc6b1 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 . + * + */ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +/** + * HAL PersistentStore for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +#include "../shared/eeprom_api.h" +#include + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { 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 * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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); + 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h new file mode 100644 index 00000000..87e6a750 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h @@ -0,0 +1,66 @@ +/** + * 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 + +/** + * HAL Endstop Interrupts for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/TEENSY35_36/fastio.h b/Marlin/src/HAL/TEENSY35_36/fastio.h new file mode 100644 index 00000000..9a299de9 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/fastio.h @@ -0,0 +1,98 @@ +/** + * 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 + +/** + * Fast I/O Routines for Teensy 3.5 and Teensy 3.6 + * Use direct port manipulation to save scads of processor time. + * Contributed by Triffid_Hunter and modified by Kliment, thinkyhead, Bob-the-Kuhn, et.al. + */ + +#ifndef MASK + #define MASK(PIN) (1 << PIN) +#endif + +#define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) +#define GPIO_BITBAND(reg, bit) (*(uint32_t *)GPIO_BITBAND_ADDR((reg), (bit))) + +/** + * Magic I/O routines + * + * Now you can simply SET_OUTPUT(PIN); WRITE(PIN, HIGH); WRITE(PIN, LOW); + * + * 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) + +#define _WRITE(P,V) do{ \ + if (V) CORE_PIN ## P ## _PORTSET = CORE_PIN ## P ## _BITMASK; \ + else CORE_PIN ## P ## _PORTCLEAR = CORE_PIN ## P ## _BITMASK; \ +}while(0) + +#define _TOGGLE(P) (*(&(CORE_PIN ## P ## _PORTCLEAR)+1) = CORE_PIN ## P ## _BITMASK) + +#define _SET_INPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1); \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _SET_OUTPUT(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE|PORT_PCR_DSE; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 1; \ +}while(0) + +#define _SET_INPUT_PULLUP(P) do{ \ + CORE_PIN ## P ## _CONFIG = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; \ + GPIO_BITBAND(CORE_PIN ## P ## _DDRREG , CORE_PIN ## P ## _BIT) = 0; \ +}while(0) + +#define _IS_INPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) +#define _IS_OUTPUT(P) ((CORE_PIN ## P ## _DDRREG & CORE_PIN ## P ## _BITMASK) == 0) + +#define READ(IO) _READ(IO) + +#define WRITE(IO,V) _WRITE(IO,V) +#define TOGGLE(IO) _TOGGLE(IO) + +#define SET_INPUT(IO) _SET_INPUT(IO) +#define SET_INPUT_PULLUP(IO) _SET_INPUT_PULLUP(IO) +#define SET_INPUT_PULLDOWN SET_INPUT +#define SET_OUTPUT(IO) _SET_OUTPUT(IO) +#define SET_PWM SET_OUTPUT + +#define IS_INPUT(IO) _IS_INPUT(IO) +#define IS_OUTPUT(IO) _IS_OUTPUT(IO) + +#define OUT_WRITE(IO,V) do{ SET_OUTPUT(IO); WRITE(IO,V); }while(0) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) + +#define PWM_PIN(P) digitalPinHasPWM(P) + +/** + * Ports, functions, and pins + */ + +#define DIO0_PIN 8 diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h new file mode 100644 index 00000000..632ee533 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY35_36." +#endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h new file mode 100644 index 00000000..998f1dcc --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/inc/Conditionals_post.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if USE_FALLBACK_EEPROM + #define USE_WIRED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h new file mode 100644 index 00000000..ee80e426 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -0,0 +1,38 @@ +/** + * 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 + +/** + * Test TEENSY35_36 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 3.5/3.6. 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 Teensy 3.5/3.6." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h new file mode 100644 index 00000000..e529fa93 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h @@ -0,0 +1,108 @@ +/** + * 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 + +/** + * HAL Pins Debugging for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +#define FTM0_CH0_PIN 22 +#define FTM0_CH1_PIN 23 +#define FTM0_CH2_PIN 9 +#define FTM0_CH3_PIN 10 +#define FTM0_CH4_PIN 6 +#define FTM0_CH5_PIN 20 +#define FTM0_CH6_PIN 21 +#define FTM0_CH7_PIN 5 +#define FTM1_CH0_PIN 3 +#define FTM1_CH1_PIN 4 +#define FTM2_CH0_PIN 29 +#define FTM2_CH1_PIN 30 +#define FTM3_CH0_PIN 2 +#define FTM3_CH1_PIN 14 +#define FTM3_CH2_PIN 7 +#define FTM3_CH3_PIN 8 +#define FTM3_CH4_PIN 35 +#define FTM3_CH5_PIN 36 +#define FTM3_CH6_PIN 37 +#define FTM3_CH7_PIN 38 +#ifdef __MK66FX1M0__ // Teensy3.6 + #define TPM1_CH0_PIN 16 + #define TPM1_CH1_PIN 17 +#endif + +#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(9)) || ((P) >= analogInputToDigitalPin(12) && (P) <= analogInputToDigitalPin(20)) + +void HAL_print_analog_pin(char buffer[], int8_t pin) { + if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); + else if (pin <= 39) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 19)); +} + +void HAL_analog_pin_state(char buffer[], int8_t pin) { + if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); + else if (pin <= 39) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 19)); +} + +#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), 22); SERIAL_ECHO(buffer); }while(0) +#define FTM_CASE(N,Z) \ + case FTM##N##_CH##Z##_PIN: \ + if (FTM##N##_C##Z##V) { \ + PWM_PRINT(FTM##N##_C##Z##V); \ + return true; \ + } else return false + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +bool HAL_pwm_status(int8_t pin) { + char buffer[20]; // for the sprintf statements + switch (pin) { + FTM_CASE(0,0); + FTM_CASE(0,1); + FTM_CASE(0,2); + FTM_CASE(0,3); + FTM_CASE(0,4); + FTM_CASE(0,5); + FTM_CASE(0,6); + FTM_CASE(0,7); + FTM_CASE(1,0); + FTM_CASE(1,1); + FTM_CASE(2,0); + FTM_CASE(2,1); + FTM_CASE(3,0); + FTM_CASE(3,1); + FTM_CASE(3,2); + FTM_CASE(3,3); + FTM_CASE(3,4); + FTM_CASE(3,5); + FTM_CASE(3,6); + FTM_CASE(3,7); + + case NOT_ON_TIMER: + default: + return false; + } + SERIAL_ECHOPGM(" "); +} + +static void HAL_pwm_details(uint8_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/TEENSY35_36/spi_pins.h b/Marlin/src/HAL/TEENSY35_36/spi_pins.h new file mode 100644 index 00000000..c76344d0 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/spi_pins.h @@ -0,0 +1,31 @@ +/** + * 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 + +/** + * HAL SPI Pins for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#define SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY35_36/timers.cpp b/Marlin/src/HAL/TEENSY35_36/timers.cpp new file mode 100644 index 00000000..8067d091 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/timers.cpp @@ -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 . + * + */ + +/** + * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +/** \brief Instruction Synchronization Barrier + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. +*/ +FORCE_INLINE static void __ISB() { + __asm__ __volatile__("isb 0xF":::"memory"); +} + +/** \brief Data Synchronization Barrier + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. +*/ +FORCE_INLINE static void __DSB() { + __asm__ __volatile__("dsb 0xF":::"memory"); +} + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + FTM0_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; + FTM0_SC = 0x00; // Set this to zero before changing the modulus + FTM0_CNT = 0x0000; // Reset the count to zero + FTM0_MOD = 0xFFFF; // max modulus = 65535 + FTM0_C0V = (FTM0_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value + FTM0_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM0_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 8 + FTM0_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + case 1: + FTM1_MODE = FTM_MODE_WPDIS | FTM_MODE_FTMEN; // Disable write protection, Enable FTM1 + FTM1_SC = 0x00; // Set this to zero before changing the modulus + FTM1_CNT = 0x0000; // Reset the count to zero + FTM1_MOD = 0xFFFF; // max modulus = 65535 + FTM1_C0V = (FTM1_TIMER_RATE) / frequency; // Initial FTM Channel 0 compare value 65535 + FTM1_SC = (FTM_SC_CLKS(0b1) & FTM_SC_CLKS_MASK) | (FTM_SC_PS(FTM1_TIMER_PRESCALE_BITS) & FTM_SC_PS_MASK); // Bus clock 60MHz divided by prescaler 4 + FTM1_C0SC = FTM_CSC_CHIE | FTM_CSC_MSA | FTM_CSC_ELSA; + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_ENABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_ENABLE_IRQ(IRQ_FTM1); break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_FTM0); break; + case 1: NVIC_DISABLE_IRQ(IRQ_FTM1); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return NVIC_IS_ENABLED(IRQ_FTM0); + case 1: return NVIC_IS_ENABLED(IRQ_FTM1); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: + FTM0_CNT = 0x0000; + FTM0_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM0_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + case 1: + FTM1_CNT = 0x0000; + FTM1_SC &= ~FTM_SC_TOF; // Clear FTM Overflow flag + FTM1_C0SC &= ~FTM_CSC_CHF; // Clear FTM Channel Compare flag + break; + } +} + +#endif // Teensy3.5 or Teensy3.6 diff --git a/Marlin/src/HAL/TEENSY35_36/timers.h b/Marlin/src/HAL/TEENSY35_36/timers.h new file mode 100644 index 00000000..5c623cd8 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/timers.h @@ -0,0 +1,112 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL Timers for Teensy 3.5 (MK64FX512) and Teensy 3.6 (MK66FX1M0) + */ + +#include + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF + +#define FTM0_TIMER_PRESCALE 8 +#define FTM1_TIMER_PRESCALE 4 +#define FTM0_TIMER_PRESCALE_BITS 0b011 +#define FTM1_TIMER_PRESCALE_BITS 0b010 + +#define FTM0_TIMER_RATE (F_BUS / FTM0_TIMER_PRESCALE) // 60MHz / 8 = 7500kHz +#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz + +#define HAL_TIMER_RATE (FTM0_TIMER_RATE) + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE HAL_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void ftm0_isr() //void TC3_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void ftm1_isr() //void TC4_Handler() +#endif + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: FTM0_C0V = compare; break; + case 1: FTM1_C0V = compare; break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_C0V; + case 1: return FTM1_C0V; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return FTM0_CNT; + case 1: return FTM1_CNT; + } + return 0; +} + +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); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.cpp b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp new file mode 100644 index 00000000..e735ee79 --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/watchdog.cpp @@ -0,0 +1,38 @@ +/** + * 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 . + * + */ +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +void watchdog_init() { + WDOG_TOVALH = 0; + WDOG_TOVALL = 4000; + WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; +} + +#endif // USE_WATCHDOG + +#endif // __MK64FX512__ || __MK66FX1M0__ diff --git a/Marlin/src/HAL/TEENSY35_36/watchdog.h b/Marlin/src/HAL/TEENSY35_36/watchdog.h new file mode 100644 index 00000000..981b1f0b --- /dev/null +++ b/Marlin/src/HAL/TEENSY35_36/watchdog.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 + +void watchdog_init(); + +inline void HAL_watchdog_refresh() { + // Watchdog refresh sequence + WDOG_REFRESH = 0xA602; + WDOG_REFRESH = 0xB480; +} diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp new file mode 100644 index 00000000..5b1b4272 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -0,0 +1,167 @@ +/** + * 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 . + * + */ + +/** + * HAL for Teensy 4.0 / 4.1 (IMXRT1062) + */ + +#ifdef __IMXRT1062__ + +#include "HAL.h" +#include "../shared/Delay.h" +#include "timers.h" + +#include + +uint16_t HAL_adc_result, HAL_adc_select; + +static const uint8_t pin2sc1a[] = { + 0x07, // 0/A0 AD_B1_02 + 0x08, // 1/A1 AD_B1_03 + 0x0C, // 2/A2 AD_B1_07 + 0x0B, // 3/A3 AD_B1_06 + 0x06, // 4/A4 AD_B1_01 + 0x05, // 5/A5 AD_B1_00 + 0x0F, // 6/A6 AD_B1_10 + 0x00, // 7/A7 AD_B1_11 + 0x0D, // 8/A8 AD_B1_08 + 0x0E, // 9/A9 AD_B1_09 + 0x01, // 24/A10 AD_B0_12 + 0x02, // 25/A11 AD_B0_13 + 0x83, // 26/A12 AD_B1_14 - only on ADC2, 3 + 0x84, // 27/A13 AD_B1_15 - only on ADC2, 4 + 0x07, // 14/A0 AD_B1_02 + 0x08, // 15/A1 AD_B1_03 + 0x0C, // 16/A2 AD_B1_07 + 0x0B, // 17/A3 AD_B1_06 + 0x06, // 18/A4 AD_B1_01 + 0x05, // 19/A5 AD_B1_00 + 0x0F, // 20/A6 AD_B1_10 + 0x00, // 21/A7 AD_B1_11 + 0x0D, // 22/A8 AD_B1_08 + 0x0E, // 23/A9 AD_B1_09 + 0x01, // 24/A10 AD_B0_12 + 0x02, // 25/A11 AD_B0_13 + 0x83, // 26/A12 AD_B1_14 - only on ADC2, 3 + 0x84, // 27/A13 AD_B1_15 - only on ADC2, 4 + #ifdef ARDUINO_TEENSY41 + 0xFF, // 28 + 0xFF, // 29 + 0xFF, // 30 + 0xFF, // 31 + 0xFF, // 32 + 0xFF, // 33 + 0xFF, // 34 + 0xFF, // 35 + 0xFF, // 36 + 0xFF, // 37 + 0x81, // 38/A14 AD_B1_12 - only on ADC2, 1 + 0x82, // 39/A15 AD_B1_13 - only on ADC2, 2 + 0x09, // 40/A16 AD_B1_04 + 0x0A, // 41/A17 AD_B1_05 + #endif +}; + +/* +// disable interrupts +void cli() { noInterrupts(); } + +// enable interrupts +void sei() { interrupts(); } +*/ + +void HAL_adc_init() { + analog_init(); + while (ADC1_GC & ADC_GC_CAL) ; + while (ADC2_GC & ADC_GC_CAL) ; +} + +void HAL_clear_reset_source() { + uint32_t reset_source = SRC_SRSR; + SRC_SRSR = reset_source; + } + +uint8_t HAL_get_reset_source() { + switch (SRC_SRSR & 0xFF) { + case 1: return RST_POWER_ON; break; + case 2: return RST_SOFTWARE; break; + case 4: return RST_EXTERNAL; break; + // case 8: return RST_BROWN_OUT; break; + case 16: return RST_WATCHDOG; break; + case 64: return RST_JTAG; break; + // case 128: return RST_OVERTEMP; break; + } + return 0; +} + +#define __bss_end _ebss + +extern "C" { + extern char __bss_end; + extern char __heap_start; + extern void* __brkval; + + // Doesn't work on Teensy 4.x + uint32_t freeMemory() { + uint32_t free_memory; + if ((uint32_t)__brkval == 0) + free_memory = ((uint32_t)&free_memory) - ((uint32_t)&__bss_end); + else + free_memory = ((uint32_t)&free_memory) - ((uint32_t)__brkval); + return free_memory; + } +} + +void HAL_adc_start_conversion(const uint8_t adc_pin) { + const uint16_t pin = pin2sc1a[adc_pin]; + if (pin == 0xFF) { + HAL_adc_select = -1; // Digital only + } + else if (pin & 0x80) { + HAL_adc_select = 1; + ADC2_HC0 = pin & 0x7F; + } + else { + HAL_adc_select = 0; + ADC1_HC0 = pin; + } +} + +uint16_t HAL_adc_get_result() { + switch (HAL_adc_select) { + case 0: + while (!(ADC1_HS & ADC_HS_COCO0)) ; // wait + return ADC1_R0; + case 1: + while (!(ADC2_HS & ADC_HS_COCO0)) ; // wait + return ADC2_R0; + } + return 0; +} + +bool is_output(uint8_t pin) { + const struct digital_pin_bitband_and_config_table_struct *p; + p = digital_pin_to_info_PGM + pin; + return (*(p->reg + 1) & p->mask); +} + +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h new file mode 100644 index 00000000..75c10e93 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -0,0 +1,148 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#define CPU_32_BIT + +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "fastio.h" +#include "watchdog.h" + +#include +#include + +//#define ST7920_DELAY_1 DELAY_NS(600) +//#define ST7920_DELAY_2 DELAY_NS(750) +//#define ST7920_DELAY_3 DELAY_NS(750) + +// ------------------------ +// Defines +// ------------------------ + +#define IS_32BIT_TEENSY 1 +#define IS_TEENSY_40_41 1 +#ifndef IS_TEENSY40 + #define IS_TEENSY41 1 +#endif + +#define _MSERIAL(X) Serial##X +#define MSERIAL(X) _MSERIAL(X) +#define Serial0 Serial + +#if SERIAL_PORT == -1 + #define MYSERIAL0 SerialUSB +#elif WITHIN(SERIAL_PORT, 0, 8) + #define MYSERIAL0 MSERIAL(SERIAL_PORT) +#else + #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." +#endif + +#ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == -1 + #define MYSERIAL1 usbSerial + #elif WITHIN(SERIAL_PORT_2, 0, 8) + #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #else + #error "SERIAL_PORT_2 must be from -1 to 8. Please update your configuration." + #endif +#endif + +#define HAL_SERVO_LIB libServo + +typedef int8_t pin_t; + +#ifndef analogInputToDigitalPin + #define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) +#endif + +#define CRITICAL_SECTION_START() uint32_t primask = __get_primask(); __disable_irq() +#define CRITICAL_SECTION_END() if (!primask) __enable_irq() +#define ISRS_ENABLED() (!__get_primask()) +#define ENABLE_ISRS() __enable_irq() +#define DISABLE_ISRS() __disable_irq() + +#undef sq +#define sq(x) ((x)*(x)) + +#ifndef strncpy_P + #define strncpy_P(dest, src, num) strncpy((dest), (src), (num)) +#endif + +// Don't place string constants in PROGMEM +#undef PSTR +#define PSTR(str) ({static const char *data = (str); &data[0];}) + +// Fix bug in pgm_read_ptr +#undef pgm_read_ptr +#define pgm_read_ptr(addr) (*((void**)(addr))) +// Add type-checking to pgm_read_word +#undef pgm_read_word +#define pgm_read_word(addr) (*((uint16_t*)(addr))) + +// Enable hooks into idle and setup for HAL +#define HAL_IDLETASK 1 +FORCE_INLINE void HAL_idletask() {} +FORCE_INLINE void HAL_init() {} + +// Clear reset reason +void HAL_clear_reset_source(); + +// Reset reason +uint8_t HAL_get_reset_source(); + +FORCE_INLINE void _delay_ms(const int delay_ms) { delay(delay_ms); } + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +extern "C" { + uint32_t freeMemory(); +} +#pragma GCC diagnostic pop + +// ADC + +void HAL_adc_init(); + +#define HAL_ADC_VREF 3.3 +#define HAL_ADC_RESOLUTION 10 +#define HAL_ADC_FILTERED // turn off ADC oversampling +#define HAL_START_ADC(pin) HAL_adc_start_conversion(pin) +#define HAL_READ_ADC() HAL_adc_get_result() +#define HAL_ADC_READY() true + +#define HAL_ANALOG_SELECT(pin) + +void HAL_adc_start_conversion(const uint8_t adc_pin); +uint16_t HAL_adc_get_result(); + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +bool is_output(uint8_t pin); diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp new file mode 100644 index 00000000..20b472aa --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp @@ -0,0 +1,143 @@ +/** + * 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 . + * + */ + +/** + * HAL SPI for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#ifdef __IMXRT1062__ + +#include "HAL.h" +#include +#include +#include "spi_pins.h" +#include "../../core/macros.h" + +static SPISettings spiConfig; + +// ------------------------ +// Public functions +// ------------------------ + +#if ENABLED(SOFTWARE_SPI) + // ------------------------ + // Software SPI + // ------------------------ + #error "Software SPI not supported for Teensy 4. Use Hardware SPI." +#else + +// ------------------------ +// Hardware SPI +// ------------------------ + +void spiBegin() { + #ifndef SS_PIN + #error "SS_PIN is not defined!" + #endif + + OUT_WRITE(SS_PIN, HIGH); + + //SET_OUTPUT(SCK_PIN); + //SET_INPUT(MISO_PIN); + //SET_OUTPUT(MOSI_PIN); + + #if 0 && DISABLED(SOFTWARE_SPI) + // set SS high - may be chip select for another SPI device + #if SET_SPI_SS_HIGH + WRITE(SS_PIN, HIGH); + #endif + // set a default rate + spiInit(SPI_HALF_SPEED); // 1 + #endif +} + +void spiInit(uint8_t spiRate) { + // Use Marlin data-rates + uint32_t clock; + switch (spiRate) { + case SPI_FULL_SPEED: clock = 10000000; break; + case SPI_HALF_SPEED: clock = 5000000; break; + case SPI_QUARTER_SPEED: clock = 2500000; break; + case SPI_EIGHTH_SPEED: clock = 1250000; break; + case SPI_SPEED_5: clock = 625000; break; + case SPI_SPEED_6: clock = 312500; break; + default: + clock = 4000000; // Default from the SPI libarary + } + spiConfig = SPISettings(clock, MSBFIRST, SPI_MODE0); + SPI.begin(); +} + +uint8_t spiRec() { + SPI.beginTransaction(spiConfig); + uint8_t returnByte = SPI.transfer(0xFF); + SPI.endTransaction(); + return returnByte; + //SPDR = 0xFF; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //return SPDR; +} + +void spiRead(uint8_t* buf, uint16_t nbyte) { + SPI.beginTransaction(spiConfig); + SPI.transfer(buf, nbyte); + SPI.endTransaction(); + //if (nbyte-- == 0) return; + // SPDR = 0xFF; + //for (uint16_t i = 0; i < nbyte; i++) { + // while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + // buf[i] = SPDR; + // SPDR = 0xFF; + //} + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } + //buf[nbyte] = SPDR; +} + +void spiSend(uint8_t b) { + SPI.beginTransaction(spiConfig); + SPI.transfer(b); + SPI.endTransaction(); + //SPDR = b; + //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } +} + +void spiSendBlock(uint8_t token, const uint8_t* buf) { + SPI.beginTransaction(spiConfig); + SPDR = token; + for (uint16_t i = 0; i < 512; i += 2) { + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i]; + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPDR = buf[i + 1]; + } + while (!TEST(SPSR, SPIF)) { /* nada */ }; + SPI.endTransaction(); +} + +// Begin SPI transaction, set clock, bit order, data mode +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode) { + spiConfig = SPISettings(spiClock, bitOrder, dataMode); + SPI.beginTransaction(spiConfig); +} + +#endif // SOFTWARE_SPI +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.cpp b/Marlin/src/HAL/TEENSY40_41/Servo.cpp new file mode 100644 index 00000000..ffb1102b --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/Servo.cpp @@ -0,0 +1,61 @@ +/** + * 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 . + * + */ + +/** + * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +int8_t libServo::attach(const int inPin) { + if (inPin > 0) servoPin = inPin; + return super::attach(servoPin); +} + +int8_t libServo::attach(const int inPin, const int inMin, const int inMax) { + if (inPin > 0) servoPin = inPin; + return super::attach(servoPin, inMin, inMax); +} + +void libServo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +void libServo::detach() { + // PWMServo library does not have detach() function + //super::detach(); +} + +#endif // HAS_SERVOS +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/Servo.h b/Marlin/src/HAL/TEENSY40_41/Servo.h new file mode 100644 index 00000000..699fd700 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/Servo.h @@ -0,0 +1,43 @@ +/** + * 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 + +/** + * HAL Servo for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#include + +// Inherit and expand on core Servo library +class libServo : public PWMServo { + public: + int8_t attach(const int pin); + int8_t attach(const int pin, const int min, const int max); + void move(const int value); + void detach(void); + private: + typedef PWMServo super; + uint8_t servoPin; + uint16_t min_ticks; + uint16_t max_ticks; + uint8_t servoIndex; // Index into the channel data for this servo +}; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp new file mode 100644 index 00000000..030a8c38 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -0,0 +1,76 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * HAL PersistentStore for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#include "../shared/eeprom_api.h" +#include + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif +size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; } + +bool PersistentStore::access_start() { 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 * const p = (uint8_t * const)pos; + uint8_t v = *value; + // 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); + 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 c = eeprom_read_byte((uint8_t*)pos); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h new file mode 100644 index 00000000..a05e9116 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h @@ -0,0 +1,66 @@ +/** + * 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 + +/** + * HAL Endstop Interrupts for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + * + * Without endstop interrupts the endstop pins must be polled continually in + * the temperature-ISR via endstops.update(), most of the time finding no change. + * With this feature endstops.update() is called only when we know that at + * least one endstop has changed state, saving valuable CPU cycles. + * + * This feature only works when all used endstop pins can generate an 'external interrupt'. + * + * Test whether pins issue interrupts on your board by flashing 'pin_interrupt_test.ino'. + * (Located in Marlin/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino) + */ + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +/** + * Endstop interrupts for Due based targets. + * On Due, all pins support external interrupt capability. + */ +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) + TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); +} diff --git a/Marlin/src/HAL/TEENSY40_41/fastio.h b/Marlin/src/HAL/TEENSY40_41/fastio.h new file mode 100644 index 00000000..52f991df --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/fastio.h @@ -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 + * Copyright (c) 2017 Victor Perez + * + * 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 + +/** + * Fast I/O interfaces for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + * These use GPIO functions instead of Direct Port Manipulation, as on AVR. + */ + +#ifndef PWM + #define PWM OUTPUT +#endif + +#define READ(IO) digitalRead(IO) +#define WRITE(IO,V) digitalWrite(IO,V) + +#define _GET_MODE(IO) !is_output(IO) +#define _SET_MODE(IO,M) pinMode(IO, M) +#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) /*!< Output Push Pull Mode & GPIO_NOPULL */ + +#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(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 */ +#define SET_INPUT_PULLDOWN(IO) _SET_MODE(IO, INPUT_PULLDOWN) /*!< Input with Pull-down activation */ +#define SET_OUTPUT(IO) OUT_WRITE(IO, LOW) +#define SET_PWM(IO) _SET_MODE(IO, PWM) + +#define TOGGLE(IO) OUT_WRITE(IO, !READ(IO)) + +#define IS_INPUT(IO) !is_output(IO) +#define IS_OUTPUT(IO) is_output(IO) + +#define PWM_PIN(P) digitalPinHasPWM(P) + +// digitalRead/Write wrappers +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO,V) digitalWrite(IO,V) diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h new file mode 100644 index 00000000..6a854092 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if HAS_SPI_TFT || HAS_FSMC_TFT + #error "Sorry! TFT displays are not available for HAL/TEENSY40_41." +#endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h new file mode 100644 index 00000000..5f1c4b16 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_adv.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h new file mode 100644 index 00000000..998f1dcc --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/Conditionals_post.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if USE_FALLBACK_EEPROM + #define USE_WIRED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h new file mode 100644 index 00000000..fbfe7b0f --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h @@ -0,0 +1,38 @@ +/** + * 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 + +/** + * Test TEENSY41 specific configuration values for errors at compile-time. + */ + +#if ENABLED(EMERGENCY_PARSER) + #error "EMERGENCY_PARSER is not yet implemented for Teensy 4.0/4.1. 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 Teensy 4.0/4.1." +#endif + +#if HAS_TMC_SW_SERIAL + #error "TMC220x Software Serial is not supported on this platform." +#endif diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h new file mode 100644 index 00000000..4ad62d00 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h @@ -0,0 +1,150 @@ +/** + * 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 + +/** + * HAL Pins Debugging for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#warning "PINS_DEBUGGING is not fully supported for Teensy 4.0 / 4.1 so 'M43' may cause hangs." + +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS + +#define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin +#define PRINT_PORT(p) +#define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) +#define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) +#define GET_ARRAY_PIN(p) pin_array[p].pin +#define GET_ARRAY_IS_DIGITAL(p) pin_array[p].is_digital +#define VALID_PIN(pin) (pin >= 0 && pin < (int8_t)NUMBER_PINS_TOTAL ? 1 : 0) +#define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) +#define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(13)) || ((P) >= analogInputToDigitalPin(14) && (P) <= analogInputToDigitalPin(17)) +#define pwm_status(pin) HAL_pwm_status(pin) +#define GET_PINMODE(PIN) (VALID_PIN(pin) && IS_OUTPUT(pin)) +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin + +struct pwm_pin_info_struct { + uint8_t type; // 0=no pwm, 1=flexpwm, 2=quad + uint8_t module; // 0-3, 0-3 + uint8_t channel; // 0=X, 1=A, 2=B + uint8_t muxval; // +}; + +#define M(a, b) ((((a) - 1) << 4) | (b)) + +const struct pwm_pin_info_struct pwm_pin_info[] = { + {1, M(1, 1), 0, 4}, // FlexPWM1_1_X 0 // AD_B0_03 + {1, M(1, 0), 0, 4}, // FlexPWM1_0_X 1 // AD_B0_02 + {1, M(4, 2), 1, 1}, // FlexPWM4_2_A 2 // EMC_04 + {1, M(4, 2), 2, 1}, // FlexPWM4_2_B 3 // EMC_05 + {1, M(2, 0), 1, 1}, // FlexPWM2_0_A 4 // EMC_06 + {1, M(2, 1), 1, 1}, // FlexPWM2_1_A 5 // EMC_08 + {1, M(2, 2), 1, 2}, // FlexPWM2_2_A 6 // B0_10 + {1, M(1, 3), 2, 6}, // FlexPWM1_3_B 7 // B1_01 + {1, M(1, 3), 1, 6}, // FlexPWM1_3_A 8 // B1_00 + {1, M(2, 2), 2, 2}, // FlexPWM2_2_B 9 // B0_11 + {2, M(1, 0), 0, 1}, // QuadTimer1_0 10 // B0_00 + {2, M(1, 2), 0, 1}, // QuadTimer1_2 11 // B0_02 + {2, M(1, 1), 0, 1}, // QuadTimer1_1 12 // B0_01 + {2, M(2, 0), 0, 1}, // QuadTimer2_0 13 // B0_03 + {2, M(3, 2), 0, 1}, // QuadTimer3_2 14 // AD_B1_02 + {2, M(3, 3), 0, 1}, // QuadTimer3_3 15 // AD_B1_03 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {2, M(3, 1), 0, 1}, // QuadTimer3_1 18 // AD_B1_01 + {2, M(3, 0), 0, 1}, // QuadTimer3_0 19 // AD_B1_00 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(4, 0), 1, 1}, // FlexPWM4_0_A 22 // AD_B1_08 + {1, M(4, 1), 1, 1}, // FlexPWM4_1_A 23 // AD_B1_09 + {1, M(1, 2), 0, 4}, // FlexPWM1_2_X 24 // AD_B0_12 + {1, M(1, 3), 0, 4}, // FlexPWM1_3_X 25 // AD_B0_13 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(3, 1), 2, 1}, // FlexPWM3_1_B 28 // EMC_32 + {1, M(3, 1), 1, 1}, // FlexPWM3_1_A 29 // EMC_31 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(2, 0), 2, 1}, // FlexPWM2_0_B 33 // EMC_07 + #ifdef ARDUINO_TEENSY40 + {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 34 // SD_B0_03 + {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 35 // SD_B0_02 + {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 36 // SD_B0_01 + {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 37 // SD_B0_00 + {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 38 // SD_B0_05 + {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 39 // SD_B0_04 + #endif + #ifdef ARDUINO_TEENSY41 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(2, 3), 1, 6}, // FlexPWM2_3_A 36 // B1_00 + {1, M(2, 3), 2, 6}, // FlexPWM2_3_B 37 // B1_01 + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {0, M(1, 0), 0, 0}, + {1, M(1, 1), 2, 1}, // FlexPWM1_1_B 42 // SD_B0_03 + {1, M(1, 1), 1, 1}, // FlexPWM1_1_A 43 // SD_B0_02 + {1, M(1, 0), 2, 1}, // FlexPWM1_0_B 44 // SD_B0_01 + {1, M(1, 0), 1, 1}, // FlexPWM1_0_A 45 // SD_B0_00 + {1, M(1, 2), 2, 1}, // FlexPWM1_2_B 46 // SD_B0_05 + {1, M(1, 2), 1, 1}, // FlexPWM1_2_A 47 // SD_B0_04 + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_0_B + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_A + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_2_B + {1, M(3, 3), 2, 1}, // FlexPWM3_3_B 51 // EMC_22 + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_B + {0, M(1, 0), 0, 0}, // duplicate FlexPWM1_1_A + {1, M(3, 0), 1, 1}, // FlexPWM3_0_A 53 // EMC_29 + #endif +}; + +void HAL_print_analog_pin(char buffer[], int8_t pin) { + if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); + else if (pin <= 41) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 24)); +} + +void HAL_analog_pin_state(char buffer[], int8_t pin) { + if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); + else if (pin <= 41) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 24)); +} + +#define PWM_PRINT(V) do{ sprintf_P(buffer, PSTR("PWM: %4d"), V); SERIAL_ECHO(buffer); }while(0) + +/** + * Print a pin's PWM status. + * Return true if it's currently a PWM pin. + */ +bool HAL_pwm_status(int8_t pin) { + char buffer[20]; // for the sprintf statements + const struct pwm_pin_info_struct *info; + + if (pin >= CORE_NUM_DIGITAL) return 0; + info = pwm_pin_info + pin; + + if (info->type == 0) return 0; + + /* TODO decode pwm value from timers */ + // for now just indicate if output is set as pwm + PWM_PRINT(*(portConfigRegister(pin)) == info->muxval); + return (*(portConfigRegister(pin)) == info->muxval); +} + +static void pwm_details(uint8_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/TEENSY40_41/spi_pins.h b/Marlin/src/HAL/TEENSY40_41/spi_pins.h new file mode 100644 index 00000000..d6f8d41b --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/spi_pins.h @@ -0,0 +1,31 @@ +/** + * 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 + +/** + * HAL SPI Pins for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#define SCK_PIN 13 +#define MISO_PIN 12 +#define MOSI_PIN 11 +#define SS_PIN 20 // SDSS // A.28, A.29, B.21, C.26, C.29 diff --git a/Marlin/src/HAL/TEENSY40_41/timers.cpp b/Marlin/src/HAL/TEENSY40_41/timers.cpp new file mode 100644 index 00000000..81c9b08c --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/timers.cpp @@ -0,0 +1,114 @@ +/** + * 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 . + * + */ + +/** + * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency) { + switch (timer_num) { + case 0: + CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode + CCM_CCGR1 |= CCM_CCGR1_GPT1_BUS(CCM_CCGR_ON); + + GPT1_CR = 0; // disable timer + GPT1_SR = 0x3F; // clear all prior status + GPT1_PR = GPT1_TIMER_PRESCALE - 1; + GPT1_CR |= GPT_CR_CLKSRC(1); //clock selection #1 (peripheral clock = 150 MHz) + GPT1_CR |= GPT_CR_ENMOD; //reset count to zero before enabling + GPT1_CR |= GPT_CR_OM1(1); // toggle mode + GPT1_OCR1 = (GPT1_TIMER_RATE / frequency) -1; // Initial compare value + GPT1_IR = GPT_IR_OF1IE; // Compare3 value + GPT1_CR |= GPT_CR_EN; //enable GPT2 counting at 150 MHz + + OUT_WRITE(15, HIGH); + attachInterruptVector(IRQ_GPT1, &stepTC_Handler); + NVIC_SET_PRIORITY(IRQ_GPT1, 16); + break; + case 1: + CCM_CSCMR1 &= ~CCM_CSCMR1_PERCLK_CLK_SEL; // turn off 24mhz mode + CCM_CCGR0 |= CCM_CCGR0_GPT2_BUS(CCM_CCGR_ON); + + GPT2_CR = 0; // disable timer + GPT2_SR = 0x3F; // clear all prior status + GPT2_PR = GPT2_TIMER_PRESCALE - 1; + GPT2_CR |= GPT_CR_CLKSRC(1); //clock selection #1 (peripheral clock = 150 MHz) + GPT2_CR |= GPT_CR_ENMOD; //reset count to zero before enabling + GPT2_CR |= GPT_CR_OM1(1); // toggle mode + GPT2_OCR1 = (GPT2_TIMER_RATE / frequency) -1; // Initial compare value + GPT2_IR = GPT_IR_OF1IE; // Compare3 value + GPT2_CR |= GPT_CR_EN; //enable GPT2 counting at 150 MHz + + OUT_WRITE(14, HIGH); + attachInterruptVector(IRQ_GPT2, &tempTC_Handler); + NVIC_SET_PRIORITY(IRQ_GPT2, 32); + break; + } +} + +void HAL_timer_enable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: + NVIC_ENABLE_IRQ(IRQ_GPT1); + break; + case 1: + NVIC_ENABLE_IRQ(IRQ_GPT2); + break; + } +} + +void HAL_timer_disable_interrupt(const uint8_t timer_num) { + switch (timer_num) { + case 0: NVIC_DISABLE_IRQ(IRQ_GPT1); break; + case 1: NVIC_DISABLE_IRQ(IRQ_GPT2); break; + } + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + asm volatile("dsb"); +} + +bool HAL_timer_interrupt_enabled(const uint8_t timer_num) { + switch (timer_num) { + case 0: return (NVIC_IS_ENABLED(IRQ_GPT1)); + case 1: return (NVIC_IS_ENABLED(IRQ_GPT2)); + } + return false; +} + +void HAL_timer_isr_prologue(const uint8_t timer_num) { + switch (timer_num) { + case 0: + GPT1_SR = GPT_IR_OF1IE; // clear OF3 bit + break; + case 1: + GPT2_SR = GPT_IR_OF1IE; // clear OF3 bit + break; + } + asm volatile("dsb"); +} + +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/timers.h b/Marlin/src/HAL/TEENSY40_41/timers.h new file mode 100644 index 00000000..7e4cd080 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/timers.h @@ -0,0 +1,119 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +/** + * HAL Timers for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#include + +// ------------------------ +// Defines +// ------------------------ + +#define FORCE_INLINE __attribute__((always_inline)) inline + +typedef uint32_t hal_timer_t; +#define HAL_TIMER_TYPE_MAX 0xFFFFFFFE + +#define GPT_TIMER_RATE F_BUS_ACTUAL // 150MHz + +#define GPT1_TIMER_PRESCALE 2 +#define GPT2_TIMER_PRESCALE 10 + +#define GPT1_TIMER_RATE (GPT_TIMER_RATE / GPT1_TIMER_PRESCALE) // 75MHz +#define GPT2_TIMER_RATE (GPT_TIMER_RATE / GPT2_TIMER_PRESCALE) // 15MHz + +#ifndef STEP_TIMER_NUM + #define STEP_TIMER_NUM 0 // Timer Index for Stepper +#endif +#ifndef PULSE_TIMER_NUM + #define PULSE_TIMER_NUM STEP_TIMER_NUM +#endif +#ifndef TEMP_TIMER_NUM + #define TEMP_TIMER_NUM 1 // Timer Index for Temperature +#endif + +#define TEMP_TIMER_RATE 1000000 +#define TEMP_TIMER_FREQUENCY 1000 + +#define STEPPER_TIMER_RATE GPT1_TIMER_RATE +#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) +#define STEPPER_TIMER_PRESCALE ((GPT_TIMER_RATE / 1000000) / STEPPER_TIMER_TICKS_PER_US) + +#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer +#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM) +#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM) +#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(STEP_TIMER_NUM) + +#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(TEMP_TIMER_NUM) +#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(TEMP_TIMER_NUM) + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() extern "C" void stepTC_Handler() // GPT1_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() extern "C" void tempTC_Handler() // GPT2_Handler() +#endif + +extern "C" void stepTC_Handler(); +extern "C" void tempTC_Handler(); + +void HAL_timer_start(const uint8_t timer_num, const uint32_t frequency); + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_num, const hal_timer_t compare) { + switch (timer_num) { + case 0: + GPT1_OCR1 = compare - 1; + break; + case 1: + GPT2_OCR1 = compare - 1; + break; + } +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_compare(const uint8_t timer_num) { + switch (timer_num) { + case 0: return GPT1_OCR1; + case 1: return GPT2_OCR1; + } + return 0; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_num) { + switch (timer_num) { + case 0: return GPT1_CNT; + case 1: return GPT2_CNT; + } + return 0; +} + +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); + +void HAL_timer_isr_prologue(const uint8_t timer_num); +//void HAL_timer_isr_epilogue(const uint8_t timer_num) {} +#define HAL_timer_isr_epilogue(TIMER_NUM) diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.cpp b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp new file mode 100644 index 00000000..8b05ddb1 --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.cpp @@ -0,0 +1,56 @@ +/** + * 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 . + * + */ + +/** + * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +#ifdef __IMXRT1062__ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(USE_WATCHDOG) + +#include "watchdog.h" + +// 4 seconds timeout +#define WDTO 4 //seconds + +uint8_t timeoutval = (WDTO - 0.5f) / 0.5f; + +void watchdog_init() { + + CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks + WDOG1_WMCR = 0; // disable power down PDE + WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); + WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; + +} + +void HAL_watchdog_refresh() { + // Watchdog refresh sequence + WDOG1_WSR = 0x5555; + WDOG1_WSR = 0xAAAA; +} + +#endif // USE_WATCHDOG +#endif // __IMXRT1062__ diff --git a/Marlin/src/HAL/TEENSY40_41/watchdog.h b/Marlin/src/HAL/TEENSY40_41/watchdog.h new file mode 100644 index 00000000..03ab151b --- /dev/null +++ b/Marlin/src/HAL/TEENSY40_41/watchdog.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 + +/** + * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) + */ + +void watchdog_init(); + +void HAL_watchdog_refresh(); diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h new file mode 100644 index 00000000..ef17d191 --- /dev/null +++ b/Marlin/src/HAL/platforms.h @@ -0,0 +1,52 @@ +/** + * 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 XSTR(V...) #V + +#ifdef __AVR__ + #define HAL_PATH(PATH, NAME) XSTR(PATH/AVR/NAME) +#elif defined(ARDUINO_ARCH_SAM) + #define HAL_PATH(PATH, NAME) XSTR(PATH/DUE/NAME) +#elif defined(__MK20DX256__) + #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY31_32/NAME) +#elif defined(__MK64FX512__) || defined(__MK66FX1M0__) + #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY35_36/NAME) +#elif defined(__IMXRT1062__) + #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY40_41/NAME) +#elif defined(TARGET_LPC1768) + #define HAL_PATH(PATH, NAME) XSTR(PATH/LPC1768/NAME) +#elif defined(__STM32F1__) || defined(TARGET_STM32F1) + #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32F1/NAME) +#elif defined(STM32GENERIC) && (defined(STM32F4) || defined(STM32F7)) + #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32_F4_F7/NAME) +#elif defined(ARDUINO_ARCH_STM32) + #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32/NAME) +#elif defined(ARDUINO_ARCH_ESP32) + #define HAL_PATH(PATH, NAME) XSTR(PATH/ESP32/NAME) +#elif defined(__PLAT_LINUX__) + #define HAL_PATH(PATH, NAME) XSTR(PATH/LINUX/NAME) +#elif defined(__SAMD51__) + #define HAL_PATH(PATH, NAME) XSTR(PATH/SAMD51/NAME) +#else + #error "Unsupported Platform!" +#endif diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h new file mode 100644 index 00000000..d98e9608 --- /dev/null +++ b/Marlin/src/HAL/shared/Delay.h @@ -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 . + * + */ +#pragma once + +/** + * Busy wait delay cycles routines: + * + * DELAY_CYCLES(count): Delay execution in cycles + * DELAY_NS(count): Delay execution in nanoseconds + * DELAY_US(count): Delay execution in microseconds + */ + +#include "../../core/macros.h" + +#if defined(__arm__) || defined(__thumb__) + + #if __CORTEX_M == 7 + + // Cortex-M3 through M7 can use the cycle counter of the DWT unit + // https://www.anthonyvh.com/2017/05/18/cortex_m-cycle_counter/ + + FORCE_INLINE static void enableCycleCounter() { + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + + #if __CORTEX_M == 7 + DWT->LAR = 0xC5ACCE55; // Unlock DWT on the M7 + #endif + + DWT->CYCCNT = 0; + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; + } + + FORCE_INLINE volatile uint32_t getCycleCount() { return DWT->CYCCNT; } + + FORCE_INLINE static void DELAY_CYCLES(const uint32_t x) { + const uint32_t endCycles = getCycleCount() + x; + while (PENDING(getCycleCount(), endCycles)) {} + } + + #else + + // https://blueprints.launchpad.net/gcc-arm-embedded/+spec/delay-cycles + + #define nop() __asm__ __volatile__("nop;\n\t":::) + + FORCE_INLINE static void __delay_4cycles(uint32_t cy) { // +1 cycle + #if ARCH_PIPELINE_RELOAD_CYCLES < 2 + #define EXTRA_NOP_CYCLES A("nop") + #else + #define EXTRA_NOP_CYCLES "" + #endif + + __asm__ __volatile__( + A(".syntax unified") // is to prevent CM0,CM1 non-unified syntax + L("1") + A("subs %[cnt],#1") + EXTRA_NOP_CYCLES + A("bne 1b") + : [cnt]"+r"(cy) // output: +r means input+output + : // input: + : "cc" // clobbers: + ); + } + + // Delay in cycles + FORCE_INLINE static void DELAY_CYCLES(uint32_t x) { + + if (__builtin_constant_p(x)) { + #define MAXNOPS 4 + + if (x <= (MAXNOPS)) { + switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } + } + else { // because of +1 cycle inside delay_4cycles + const uint32_t rem = (x - 1) % (MAXNOPS); + switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } + if ((x = (x - 1) / (MAXNOPS))) + __delay_4cycles(x); // if need more then 4 nop loop is more optimal + } + #undef MAXNOPS + } + else if ((x >>= 2)) + __delay_4cycles(x); + } + #undef nop + + #endif + +#elif defined(__AVR__) + + #define nop() __asm__ __volatile__("nop;\n\t":::) + + FORCE_INLINE static void __delay_4cycles(uint8_t cy) { + __asm__ __volatile__( + L("1") + A("dec %[cnt]") + A("nop") + A("brne 1b") + : [cnt] "+r"(cy) // output: +r means input+output + : // input: + : "cc" // clobbers: + ); + } + + // Delay in cycles + FORCE_INLINE static void DELAY_CYCLES(uint16_t x) { + + if (__builtin_constant_p(x)) { + #define MAXNOPS 4 + + if (x <= (MAXNOPS)) { + switch (x) { case 4: nop(); case 3: nop(); case 2: nop(); case 1: nop(); } + } + else { + const uint32_t rem = (x) % (MAXNOPS); + switch (rem) { case 3: nop(); case 2: nop(); case 1: nop(); } + if ((x = (x) / (MAXNOPS))) + __delay_4cycles(x); // if need more then 4 nop loop is more optimal + } + + #undef MAXNOPS + } + else if ((x >>= 2)) + __delay_4cycles(x); + } + #undef nop + +#elif defined(__PLAT_LINUX__) || defined(ESP32) + + // specified inside platform + +#else + + #error "Unsupported MCU architecture" + +#endif + +// Delay in nanoseconds +#define DELAY_NS(x) DELAY_CYCLES( (x) * (F_CPU / 1000000UL) / 1000UL ) + +// Delay in microseconds +#define DELAY_US(x) DELAY_CYCLES( (x) * (F_CPU / 1000000UL) ) diff --git a/Marlin/src/HAL/shared/HAL_SPI.h b/Marlin/src/HAL/shared/HAL_SPI.h new file mode 100644 index 00000000..59af5548 --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_SPI.h @@ -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 . + * + */ +#pragma once + +/** + * HAL/shared/HAL_SPI.h + * Core Marlin definitions for SPI, implemented in the HALs + */ + +#include "Marduino.h" +#include + +/** + * SPI speed where 0 <= index <= 6 + * + * Approximate rates : + * + * 0 : 8 - 10 MHz + * 1 : 4 - 5 MHz + * 2 : 2 - 2.5 MHz + * 3 : 1 - 1.25 MHz + * 4 : 500 - 625 kHz + * 5 : 250 - 312 kHz + * 6 : 125 - 156 kHz + * + * On AVR, actual speed is F_CPU/2^(1 + index). + * On other platforms, speed should be in range given above where possible. + */ + +#define SPI_FULL_SPEED 0 // Set SCK to max rate +#define SPI_HALF_SPEED 1 // Set SCK rate to half of max rate +#define SPI_QUARTER_SPEED 2 // Set SCK rate to quarter of max rate +#define SPI_EIGHTH_SPEED 3 // Set SCK rate to 1/8 of max rate +#define SPI_SIXTEENTH_SPEED 4 // Set SCK rate to 1/16 of max rate +#define SPI_SPEED_5 5 // Set SCK rate to 1/32 of max rate +#define SPI_SPEED_6 6 // Set SCK rate to 1/64 of max rate + +// +// Standard SPI functions +// + +// Initialize SPI bus +void spiBegin(); + +// Configure SPI for specified SPI speed +void spiInit(uint8_t spiRate); + +// Write single byte to SPI +void spiSend(uint8_t b); + +// Read single byte from SPI +uint8_t spiRec(); + +// Read from SPI into buffer +void spiRead(uint8_t* buf, uint16_t nbyte); + +// Write token and then write from 512 byte buffer to SPI (for SD card) +void spiSendBlock(uint8_t token, const uint8_t* buf); + +// Begin SPI transaction, set clock, bit order, data mode +void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); + +// +// Extended SPI functions taking a channel number (Hardware SPI only) +// + +// Write single byte to specified SPI channel +void spiSend(uint32_t chan, byte b); + +// Write buffer to specified SPI channel +void spiSend(uint32_t chan, const uint8_t* buf, size_t n); + +// Read single byte from specified SPI channel +uint8_t spiRec(uint32_t chan); diff --git a/Marlin/src/HAL/shared/HAL_ST7920.h b/Marlin/src/HAL/shared/HAL_ST7920.h new file mode 100644 index 00000000..4e362f96 --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_ST7920.h @@ -0,0 +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 . + * + */ +#pragma once + +/** + * HAL/ST7920.h + * For the HALs that provide direct access to the ST7920 display + * (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate. + */ + +#if BOTH(HAS_MARLINUI_U8GLIB, LIGHTWEIGHT_UI) + void ST7920_cs(); + void ST7920_ncs(); + void ST7920_set_cmd(); + void ST7920_set_dat(); + void ST7920_write_byte(const uint8_t data); +#endif diff --git a/Marlin/src/HAL/shared/HAL_spi_L6470.cpp b/Marlin/src/HAL/shared/HAL_spi_L6470.cpp new file mode 100644 index 00000000..bd85dbe7 --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_spi_L6470.cpp @@ -0,0 +1,139 @@ +/** + * 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 . + * + */ + +/** + * Software L6470 SPI functions originally from Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_L64XX + +#include "Delay.h" + +#include "../../core/serial.h" +#include "../../libs/L64XX/L64XX_Marlin.h" + +// Make sure GCC optimizes this file. +// Note that this line triggers a bug in GCC which is fixed by casting. +// See the note below. +#pragma GCC optimize (3) + +// run at ~4Mhz +inline uint8_t L6470_SpiTransfer_Mode_0(uint8_t b) { // using Mode 0 + for (uint8_t bits = 8; bits--;) { + WRITE(L6470_CHAIN_MOSI_PIN, b & 0x80); + b <<= 1; // little setup time + + WRITE(L6470_CHAIN_SCK_PIN, HIGH); + DELAY_NS(125); // 10 cycles @ 84mhz + + b |= (READ(L6470_CHAIN_MISO_PIN) != 0); + + WRITE(L6470_CHAIN_SCK_PIN, LOW); + DELAY_NS(125); // 10 cycles @ 84mhz + } + return b; +} + +inline uint8_t L6470_SpiTransfer_Mode_3(uint8_t b) { // using Mode 3 + for (uint8_t bits = 8; bits--;) { + WRITE(L6470_CHAIN_SCK_PIN, LOW); + WRITE(L6470_CHAIN_MOSI_PIN, b & 0x80); + + DELAY_NS(125); // 10 cycles @ 84mhz + WRITE(L6470_CHAIN_SCK_PIN, HIGH); + DELAY_NS(125); // Need more delay for fast CPUs + + b <<= 1; // little setup time + b |= (READ(L6470_CHAIN_MISO_PIN) != 0); + } + DELAY_NS(125); // 10 cycles @ 84mhz + return b; +} + +/** + * L64XX methods for SPI init and transfer + */ +void L64XX_Marlin::spi_init() { + OUT_WRITE(L6470_CHAIN_SS_PIN, HIGH); + OUT_WRITE(L6470_CHAIN_SCK_PIN, HIGH); + OUT_WRITE(L6470_CHAIN_MOSI_PIN, HIGH); + SET_INPUT(L6470_CHAIN_MISO_PIN); + + #if PIN_EXISTS(L6470_BUSY) + SET_INPUT(L6470_BUSY_PIN); + #endif + + OUT_WRITE(L6470_CHAIN_MOSI_PIN, HIGH); +} + +uint8_t L64XX_Marlin::transfer_single(uint8_t data, int16_t ss_pin) { + // First device in chain has data sent last + extDigitalWrite(ss_pin, LOW); + + DISABLE_ISRS(); // Disable interrupts during SPI transfer (can't allow partial command to chips) + const uint8_t data_out = L6470_SpiTransfer_Mode_3(data); + ENABLE_ISRS(); // Enable interrupts + + extDigitalWrite(ss_pin, HIGH); + return data_out; +} + +uint8_t L64XX_Marlin::transfer_chain(uint8_t data, int16_t ss_pin, uint8_t chain_position) { + uint8_t data_out = 0; + + // first device in chain has data sent last + extDigitalWrite(ss_pin, LOW); + + for (uint8_t i = L64XX::chain[0]; !L64xxManager.spi_abort && i >= 1; i--) { // Send data unless aborted + DISABLE_ISRS(); // Disable interrupts during SPI transfer (can't allow partial command to chips) + const uint8_t temp = L6470_SpiTransfer_Mode_3(uint8_t(i == chain_position ? data : dSPIN_NOP)); + ENABLE_ISRS(); // Enable interrupts + if (i == chain_position) data_out = temp; + } + + extDigitalWrite(ss_pin, HIGH); + return data_out; +} + +/** + * Platform-supplied L6470 buffer transfer method + */ +void L64XX_Marlin::transfer(uint8_t L6470_buf[], const uint8_t length) { + // First device in chain has its data sent last + + if (spi_active) { // Interrupted SPI transfer so need to + WRITE(L6470_CHAIN_SS_PIN, HIGH); // guarantee min high of 650ns + DELAY_US(1); + } + + WRITE(L6470_CHAIN_SS_PIN, LOW); + for (uint8_t i = length; i >= 1; i--) + L6470_SpiTransfer_Mode_3(uint8_t(L6470_buf[i])); + WRITE(L6470_CHAIN_SS_PIN, HIGH); +} + +#pragma GCC reset_options + +#endif // HAS_L64XX diff --git a/Marlin/src/HAL/shared/Marduino.h b/Marlin/src/HAL/shared/Marduino.h new file mode 100644 index 00000000..3003f3cc --- /dev/null +++ b/Marlin/src/HAL/shared/Marduino.h @@ -0,0 +1,85 @@ +/** + * 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 + +/** + * HAL/shared/Marduino.h + */ + +#undef DISABLED // Redefined by ESP32 +#undef M_PI // Redefined by all +#undef _BV // Redefined by some +#undef sq // Redefined by teensy3/wiring.h +#undef SBI // Redefined by arduino/const_functions.h +#undef CBI // Redefined by arduino/const_functions.h +#undef UNUSED // Redefined by stm32f4xx_hal_def.h + +#include // NOTE: If included earlier then this line is a NOOP + +#undef DISABLED +#define DISABLED(V...) DO(DIS,&&,V) + +#undef _BV +#define _BV(b) (1UL << (b)) + +#undef sq +#define sq(x) ((x)*(x)) + +#ifndef SBI + #define SBI(A,B) (A |= (1 << (B))) +#endif + +#ifndef CBI + #define CBI(A,B) (A &= ~(1 << (B))) +#endif + +#ifndef __AVR__ + #ifndef strchr_P // Some platforms define a macro (DUE, teensy35) + inline const char* strchr_P(const char *s, int c) { return strchr(s,c); } + //#define strchr_P(s,c) strchr(s,c) + #endif + + #ifndef snprintf_P + #define snprintf_P snprintf + #endif + #ifndef vsnprintf_P + #define vsnprintf_P vsnprintf + #endif +#endif + +// Restart causes +#define RST_POWER_ON 1 +#define RST_EXTERNAL 2 +#define RST_BROWN_OUT 4 +#define RST_WATCHDOG 8 +#define RST_JTAG 16 +#define RST_SOFTWARE 32 +#define RST_BACKUP 64 + +#ifndef M_PI + #define M_PI 3.14159265358979323846f +#endif + +// Remove compiler warning on an unused variable +#ifndef UNUSED + #define UNUSED(x) ((void)(x)) +#endif diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp new file mode 100644 index 00000000..6cf5e055 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -0,0 +1,98 @@ +/** + * 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 . + * + */ +#if defined(__arm__) || defined(__thumb__) + +#include "backtrace.h" +#include "unwinder.h" +#include "unwmemaccess.h" + +#include "../../../core/serial.h" +#include + +// Dump a backtrace entry +static bool UnwReportOut(void* ctx, const UnwReport* bte) { + int *p = (int*)ctx; + + (*p)++; + + SERIAL_CHAR('#'); SERIAL_PRINT(*p, DEC); SERIAL_ECHOPGM(" : "); + SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX); + SERIAL_CHAR('+'); SERIAL_PRINT(bte->address - bte->function,DEC); + SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n'); + return true; +} + +#ifdef UNW_DEBUG + void UnwPrintf(const char* format, ...) { + char dest[256]; + va_list argptr; + va_start(argptr, format); + vsprintf(dest, format, argptr); + va_end(argptr); + TX(&dest[0]); + } +#endif + +/* Table of function pointers for passing to the unwinder */ +static const UnwindCallbacks UnwCallbacks = { + UnwReportOut, + UnwReadW, + UnwReadH, + UnwReadB + #ifdef UNW_DEBUG + , UnwPrintf + #endif +}; + +void backtrace() { + + UnwindFrame btf; + uint32_t sp = 0, lr = 0, pc = 0; + + // Capture the values of the registers to perform the traceback + __asm__ __volatile__ ( + " mov %[lrv],lr\n" + " mov %[spv],sp\n" + " mov %[pcv],pc\n" + : [spv]"+r"( sp ), + [lrv]"+r"( lr ), + [pcv]"+r"( pc ) + :: + ); + + // Fill the traceback structure + btf.sp = sp; + btf.fp = btf.sp; + btf.lr = lr; + btf.pc = pc | 1; // Force Thumb, as CORTEX only support it + + // Perform a backtrace + SERIAL_ERROR_MSG("Backtrace:"); + int ctr = 0; + UnwindStart(&btf, &UnwCallbacks, &ctr); +} + +#else // !__arm__ && !__thumb__ + +void backtrace() {} + +#endif diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.h b/Marlin/src/HAL/shared/backtrace/backtrace.h new file mode 100644 index 00000000..fccadeda --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/backtrace.h @@ -0,0 +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 . + * + */ +#pragma once + +// Perform a backtrace to the serial port +void backtrace(); diff --git a/Marlin/src/HAL/shared/backtrace/unwarm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm.cpp new file mode 100644 index 00000000..cdc9c06c --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarm.cpp @@ -0,0 +1,175 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Utility functions and glue for ARM unwinding sub-modules. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWARM" + +#include +#include +#include +#include +#include "unwarm.h" +#include "unwarmmem.h" + +#ifdef UNW_DEBUG + +/** + * Printf wrapper. + * This is used such that alternative outputs for any output can be selected + * by modification of this wrapper function. + */ +void UnwPrintf(const char *format, ...) { + va_list args; + + va_start( args, format ); + vprintf(format, args ); +} +#endif + +/** + * Invalidate all general purpose registers. + */ +void UnwInvalidateRegisterFile(RegData *regFile) { + uint8_t t = 0; + do { + regFile[t].o = REG_VAL_INVALID; + t++; + } while (t < 13); +} + + +/** + * Initialize the data used for unwinding. + */ +void UnwInitState(UnwState * const state, /**< Pointer to structure to fill. */ + const UnwindCallbacks *cb, /**< Callbacks. */ + void *rptData, /**< Data to pass to report function. */ + uint32_t pcValue, /**< PC at which to start unwinding. */ + uint32_t spValue) { /**< SP at which to start unwinding. */ + + UnwInvalidateRegisterFile(state->regData); + + /* Store the pointer to the callbacks */ + state->cb = cb; + state->reportData = rptData; + + /* Setup the SP and PC */ + state->regData[13].v = spValue; + state->regData[13].o = REG_VAL_FROM_CONST; + state->regData[15].v = pcValue; + state->regData[15].o = REG_VAL_FROM_CONST; + + UnwPrintd3("\nInitial: PC=0x%08x SP=0x%08x\n", pcValue, spValue); + + /* Invalidate all memory addresses */ + memset(state->memData.used, 0, sizeof(state->memData.used)); +} + +// Detect if function names are available +static int __attribute__ ((noinline)) has_function_names() { + uint32_t flag_word = ((uint32_t*)(((uint32_t)(&has_function_names)) & (-4))) [-1]; + return ((flag_word & 0xFF000000) == 0xFF000000) ? 1 : 0; +} + +/** + * Call the report function to indicate some return address. + * This returns the value of the report function, which if true + * indicates that unwinding may continue. + */ +bool UnwReportRetAddr(UnwState * const state, uint32_t addr) { + + UnwReport entry; + + // We found two acceptable values. + entry.name = nullptr; + entry.address = addr & 0xFFFFFFFE; // Remove Thumb bit + entry.function = 0; + + // If there are function names, try to solve name + if (has_function_names()) { + + // Lets find the function name, if possible + + // Align address to 4 bytes + uint32_t pf = addr & (-4); + + // Scan backwards until we find the function name + uint32_t v; + while (state->cb->readW(pf-4,&v)) { + + // Check if name descriptor is valid + if ((v & 0xFFFFFF00) == 0xFF000000 && (v & 0xFF) > 1) { + // Assume the name was found! + entry.name = ((const char*)pf) - 4 - (v & 0xFF); + entry.function = pf; + break; + } + + // Go backwards to the previous word + pf -= 4; + } + } + + /* Cast away const from reportData. + * The const is only to prevent the unw module modifying the data. + */ + return state->cb->report((void *)state->reportData, &entry); +} + + +/** + * Write some register to memory. + * This will store some register and meta data onto the virtual stack. + * The address for the write + * \param state [in/out] The unwinding state. + * \param wAddr [in] The address at which to write the data. + * \param reg [in] The register to store. + * \return true if the write was successful, false otherwise. + */ +bool UnwMemWriteRegister(UnwState * const state, const uint32_t addr, const RegData * const reg) { + return UnwMemHashWrite(&state->memData, addr, reg->v, M_IsOriginValid(reg->o)); +} + +/** + * Read a register from memory. + * This will read a register from memory, and setup the meta data. + * If the register has been previously written to memory using + * UnwMemWriteRegister, the local hash will be used to return the + * value while respecting whether the data was valid or not. If the + * register was previously written and was invalid at that point, + * REG_VAL_INVALID will be returned in *reg. + * \param state [in] The unwinding state. + * \param addr [in] The address to read. + * \param reg [out] The result, containing the data value and the origin + * which will be REG_VAL_FROM_MEMORY, or REG_VAL_INVALID. + * \return true if the address could be read and *reg has been filled in. + * false is the data could not be read. + */ +bool UnwMemReadRegister(UnwState * const state, const uint32_t addr, RegData * const reg) { + bool tracked; + + // Check if the value can be found in the hash + if (UnwMemHashRead(&state->memData, addr, ®->v, &tracked)) { + reg->o = tracked ? REG_VAL_FROM_MEMORY : REG_VAL_INVALID; + return true; + } + else if (state->cb->readW(addr, ®->v)) { // Not in the hash, so read from real memory + reg->o = REG_VAL_FROM_MEMORY; + return true; + } + else return false; // Not in the hash, and failed to read from memory +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/unwarm.h b/Marlin/src/HAL/shared/backtrace/unwarm.h new file mode 100644 index 00000000..3128e354 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarm.h @@ -0,0 +1,140 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Internal interface between the ARM unwinding sub-modules. + **************************************************************************/ + +#pragma once + +#include "unwinder.h" + +/** The maximum number of instructions to interpet in a function. + * Unwinding will be unconditionally stopped and UNWIND_EXHAUSTED returned + * if more than this number of instructions are interpreted in a single + * function without unwinding a stack frame. This prevents infinite loops + * or corrupted program memory from preventing unwinding from progressing. + */ +#define UNW_MAX_INSTR_COUNT 500 + +/** The size of the hash used to track reads and writes to memory. + * This should be a prime value for efficiency. + */ +#define MEM_HASH_SIZE 31 + +/*************************************************************************** + * Type Definitions + **************************************************************************/ + +typedef enum { + /** Invalid value. */ + REG_VAL_INVALID = 0x00, + REG_VAL_FROM_STACK = 0x01, + REG_VAL_FROM_MEMORY = 0x02, + REG_VAL_FROM_CONST = 0x04, + REG_VAL_ARITHMETIC = 0x80 +} RegValOrigin; + + +/** Type for tracking information about a register. + * This stores the register value, as well as other data that helps unwinding. + */ +typedef struct { + + /** The value held in the register. */ + uint32_t v; + + /** The origin of the register value. + * This is used to track how the value in the register was loaded. + */ + int o; /* (RegValOrigin) */ +} RegData; + + +/** Structure used to track reads and writes to memory. + * This structure is used as a hash to store a small number of writes + * to memory. + */ +typedef struct { + /** Memory contents. */ + uint32_t v[MEM_HASH_SIZE]; + + /** Address at which v[n] represents. */ + uint32_t a[MEM_HASH_SIZE]; + + /** Indicates whether the data in v[n] and a[n] is occupied. + * Each bit represents one hash value. + */ + uint8_t used[(MEM_HASH_SIZE + 7) / 8]; + + /** Indicates whether the data in v[n] is valid. + * This allows a[n] to be set, but for v[n] to be marked as invalid. + * Specifically this is needed for when an untracked register value + * is written to memory. + */ + uint8_t tracked[(MEM_HASH_SIZE + 7) / 8]; +} MemData; + + +/** Structure that is used to keep track of unwinding meta-data. + * This data is passed between all the unwinding functions. + */ +typedef struct { + /** The register values and meta-data. */ + RegData regData[16]; + + /** Memory tracking data. */ + MemData memData; + + /** Pointer to the callback functions */ + const UnwindCallbacks *cb; + + /** Pointer to pass to the report function. */ + const void *reportData; +} UnwState; + +/*************************************************************************** + * Macros + **************************************************************************/ + +#define M_IsOriginValid(v) !!((v) & 0x7F) +#define M_Origin2Str(v) ((v) ? "VALID" : "INVALID") + +#ifdef UNW_DEBUG +#define UnwPrintd1(a) state->cb->printf(a) +#define UnwPrintd2(a,b) state->cb->printf(a,b) +#define UnwPrintd3(a,b,c) state->cb->printf(a,b,c) +#define UnwPrintd4(a,b,c,d) state->cb->printf(a,b,c,d) +#define UnwPrintd5(a,b,c,d,e) state->cb->printf(a,b,c,d,e) +#define UnwPrintd6(a,b,c,d,e,f) state->cb->printf(a,b,c,d,e,f) +#define UnwPrintd7(a,b,c,d,e,f,g) state->cb->printf(a,b,c,d,e,f,g) +#define UnwPrintd8(a,b,c,d,e,f,g,h) state->cb->printf(a,b,c,d,e,f,g,h) +#else +#define UnwPrintd1(a) +#define UnwPrintd2(a,b) +#define UnwPrintd3(a,b,c) +#define UnwPrintd4(a,b,c,d) +#define UnwPrintd5(a,b,c,d,e) +#define UnwPrintd6(a,b,c,d,e,f) +#define UnwPrintd7(a,b,c,d,e,f,g) +#define UnwPrintd8(a,b,c,d,e,f,g,h) +#endif + +/*************************************************************************** + * Function Prototypes + **************************************************************************/ + +UnwResult UnwStartArm(UnwState * const state); +UnwResult UnwStartThumb(UnwState * const state); +void UnwInvalidateRegisterFile(RegData *regFile); +void UnwInitState(UnwState * const state, const UnwindCallbacks *cb, void *rptData, uint32_t pcValue, uint32_t spValue); +bool UnwReportRetAddr(UnwState * const state, uint32_t addr); +bool UnwMemWriteRegister(UnwState * const state, const uint32_t addr, const RegData * const reg); +bool UnwMemReadRegister(UnwState * const state, const uint32_t addr, RegData * const reg); +void UnwMemHashGC(UnwState * const state); diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp new file mode 100644 index 00000000..0ec9bd56 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarm_arm.cpp @@ -0,0 +1,535 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Abstract interpreter for ARM mode. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWARM_ARM" + +#include +#include "unwarm.h" + +/** Check if some instruction is a data-processing instruction. + * Decodes the passed instruction, checks if it is a data-processing and + * verifies that the parameters and operation really indicate a data- + * processing instruction. This is needed because some parts of the + * instruction space under this instruction can be extended or represent + * other operations such as MRS, MSR. + * + * \param[in] inst The instruction word. + * \retval true Further decoding of the instruction indicates that this is + * a valid data-processing instruction. + * \retval false This is not a data-processing instruction, + */ +static bool isDataProc(uint32_t instr) { + uint8_t opcode = (instr & 0x01E00000) >> 21; + if ((instr & 0xFC000000) != 0xE0000000) return false; + + /* TST, TEQ, CMP and CMN all require S to be set */ + bool S = !!(instr & 0x00100000); + if (!S && opcode >= 8 && opcode <= 11) return false; + + return true; +} + +UnwResult UnwStartArm(UnwState * const state) { + bool found = false; + uint16_t t = UNW_MAX_INSTR_COUNT; + + do { + uint32_t instr; + + /* Attempt to read the instruction */ + if (!state->cb->readW(state->regData[15].v, &instr)) + return UNWIND_IREAD_W_FAIL; + + UnwPrintd4("A %x %x %08x:", state->regData[13].v, state->regData[15].v, instr); + + /* Check that the PC is still on Arm alignment */ + if (state->regData[15].v & 0x3) { + UnwPrintd1("\nError: PC misalignment\n"); + return UNWIND_INCONSISTENT; + } + + /* Check that the SP and PC have not been invalidated */ + if (!M_IsOriginValid(state->regData[13].o) || !M_IsOriginValid(state->regData[15].o)) { + UnwPrintd1("\nError: PC or SP invalidated\n"); + return UNWIND_INCONSISTENT; + } + + /* Branch and Exchange (BX) + * This is tested prior to data processing to prevent + * mis-interpretation as an invalid TEQ instruction. + */ + if ((instr & 0xFFFFFFF0) == 0xE12FFF10) { + uint8_t rn = instr & 0xF; + + UnwPrintd4("BX r%d\t ; r%d %s\n", rn, rn, M_Origin2Str(state->regData[rn].o)); + + if (!M_IsOriginValid(state->regData[rn].o)) { + UnwPrintd1("\nUnwind failure: BX to untracked register\n"); + return UNWIND_FAILURE; + } + + /* Set the new PC value */ + state->regData[15].v = state->regData[rn].v; + + /* Check if the return value is from the stack */ + if (state->regData[rn].o == REG_VAL_FROM_STACK) { + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v & (~0x1)); + + /* Report the return address */ + if (!UnwReportRetAddr(state, state->regData[rn].v)) + return UNWIND_TRUNCATED; + } + + /* Determine the return mode */ + if (state->regData[rn].v & 0x1) /* Branching to THUMB */ + return UnwStartThumb(state); + + /* Branch to ARM */ + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 4; + } + /* Branch */ + else if ((instr & 0xFF000000) == 0xEA000000) { + + int32_t offset = (instr & 0x00FFFFFF) << 2; + + /* Sign extend if needed */ + if (offset & 0x02000000) offset |= 0xFC000000; + + UnwPrintd2("B %d\n", offset); + + /* Adjust PC */ + state->regData[15].v += offset; + + /* Account for pre-fetch, where normally the PC is 8 bytes + * ahead of the instruction just executed. + */ + state->regData[15].v += 4; + } + + /* MRS */ + else if ((instr & 0xFFBF0FFF) == 0xE10F0000) { + uint8_t rd = (instr & 0x0000F000) >> 12; + #ifdef UNW_DEBUG + const bool R = !!(instr & 0x00400000); + UnwPrintd4("MRS r%d,%s\t; r%d invalidated", rd, R ? "SPSR" : "CPSR", rd); + #endif + + /* Status registers untracked */ + state->regData[rd].o = REG_VAL_INVALID; + } + /* MSR */ + else if ((instr & 0xFFB0F000) == 0xE120F000) { + #ifdef UNW_DEBUG + UnwPrintd2("MSR %s_?, ???", (instr & 0x00400000) ? "SPSR" : "CPSR"); + #endif + + /* Status registers untracked. + * Potentially this could change processor mode and switch + * banked registers r8-r14. Most likely is that r13 (sp) will + * be banked. However, invalidating r13 will stop unwinding + * when potentially this write is being used to disable/enable + * interrupts (a common case). Therefore no invalidation is + * performed. + */ + } + /* Data processing */ + else if (isDataProc(instr)) { + bool I = !!(instr & 0x02000000); + uint8_t opcode = (instr & 0x01E00000) >> 21; + #ifdef UNW_DEBUG + bool S = !!(instr & 0x00100000); + #endif + uint8_t rn = (instr & 0x000F0000) >> 16; + uint8_t rd = (instr & 0x0000F000) >> 12; + uint16_t operand2 = (instr & 0x00000FFF); + uint32_t op2val; + int op2origin; + + switch (opcode) { + case 0: UnwPrintd4("AND%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 1: UnwPrintd4("EOR%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 2: UnwPrintd4("SUB%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 3: UnwPrintd4("RSB%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 4: UnwPrintd4("ADD%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 5: UnwPrintd4("ADC%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 6: UnwPrintd4("SBC%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 7: UnwPrintd4("RSC%s r%d,r%d,", S ? "S" : "", rd, rn); break; + case 8: UnwPrintd3("TST%s r%d,", S ? "S" : "", rn); break; + case 9: UnwPrintd3("TEQ%s r%d,", S ? "S" : "", rn); break; + case 10: UnwPrintd3("CMP%s r%d,", S ? "S" : "", rn); break; + case 11: UnwPrintd3("CMN%s r%d,", S ? "S" : "", rn); break; + case 12: UnwPrintd3("ORR%s r%d,", S ? "S" : "", rn); break; + case 13: UnwPrintd3("MOV%s r%d,", S ? "S" : "", rd); break; + case 14: UnwPrintd4("BIC%s r%d,r%d", S ? "S" : "", rd, rn); break; + case 15: UnwPrintd3("MVN%s r%d,", S ? "S" : "", rd); break; + } + + /* Decode operand 2 */ + if (I) { + uint8_t shiftDist = (operand2 & 0x0F00) >> 8; + uint8_t shiftConst = (operand2 & 0x00FF); + + /* rotate const right by 2 * shiftDist */ + shiftDist *= 2; + op2val = (shiftConst >> shiftDist) | + (shiftConst << (32 - shiftDist)); + op2origin = REG_VAL_FROM_CONST; + + UnwPrintd2("#0x%x", op2val); + } + else { + + /* Register and shift */ + uint8_t rm = (operand2 & 0x000F); + uint8_t regShift = !!(operand2 & 0x0010); + uint8_t shiftType = (operand2 & 0x0060) >> 5; + uint32_t shiftDist; + #ifdef UNW_DEBUG + const char * const shiftMnu[4] = { "LSL", "LSR", "ASR", "ROR" }; + #endif + UnwPrintd2("r%d ", rm); + + /* Get the shift distance */ + if (regShift) { + uint8_t rs = (operand2 & 0x0F00) >> 8; + + if (operand2 & 0x00800) { + UnwPrintd1("\nError: Bit should be zero\n"); + return UNWIND_ILLEGAL_INSTR; + } + else if (rs == 15) { + UnwPrintd1("\nError: Cannot use R15 with register shift\n"); + return UNWIND_ILLEGAL_INSTR; + } + + /* Get shift distance */ + shiftDist = state->regData[rs].v; + op2origin = state->regData[rs].o; + + UnwPrintd7("%s r%d\t; r%d %s r%d %s", shiftMnu[shiftType], rs, rm, M_Origin2Str(state->regData[rm].o), rs, M_Origin2Str(state->regData[rs].o)); + } + else { + shiftDist = (operand2 & 0x0F80) >> 7; + op2origin = REG_VAL_FROM_CONST; + if (shiftDist) UnwPrintd3("%s #%d", shiftMnu[shiftType], shiftDist); + UnwPrintd3("\t; r%d %s", rm, M_Origin2Str(state->regData[rm].o)); + } + + /* Apply the shift type to the source register */ + switch (shiftType) { + case 0: /* logical left */ + op2val = state->regData[rm].v << shiftDist; + break; + + case 1: /* logical right */ + if (!regShift && shiftDist == 0) shiftDist = 32; + op2val = state->regData[rm].v >> shiftDist; + break; + + case 2: /* arithmetic right */ + if (!regShift && shiftDist == 0) shiftDist = 32; + + if (state->regData[rm].v & 0x80000000) { + /* Register shifts maybe greater than 32 */ + if (shiftDist >= 32) + op2val = 0xFFFFFFFF; + else + op2val = (state->regData[rm].v >> shiftDist) | (0xFFFFFFFF << (32 - shiftDist)); + } + else + op2val = state->regData[rm].v >> shiftDist; + break; + + case 3: /* rotate right */ + + if (!regShift && shiftDist == 0) { + /* Rotate right with extend. + * This uses the carry bit and so always has an + * untracked result. + */ + op2origin = REG_VAL_INVALID; + op2val = 0; + } + else { + /* Limit shift distance to 0-31 incase of register shift */ + shiftDist &= 0x1F; + + op2val = (state->regData[rm].v >> shiftDist) | + (state->regData[rm].v << (32 - shiftDist)); + } + break; + + default: + UnwPrintd2("\nError: Invalid shift type: %d\n", shiftType); + return UNWIND_FAILURE; + } + + /* Decide the data origin */ + if (M_IsOriginValid(op2origin) && M_IsOriginValid(state->regData[rm].o)) + op2origin = REG_VAL_ARITHMETIC | state->regData[rm].o; + else + op2origin = REG_VAL_INVALID; + } + + /* Propagate register validity */ + switch (opcode) { + case 0: /* AND: Rd := Op1 AND Op2 */ + case 1: /* EOR: Rd := Op1 EOR Op2 */ + case 2: /* SUB: Rd:= Op1 - Op2 */ + case 3: /* RSB: Rd:= Op2 - Op1 */ + case 4: /* ADD: Rd:= Op1 + Op2 */ + case 12: /* ORR: Rd:= Op1 OR Op2 */ + case 14: /* BIC: Rd:= Op1 AND NOT Op2 */ + if (!M_IsOriginValid(state->regData[rn].o) || + !M_IsOriginValid(op2origin)) { + state->regData[rd].o = REG_VAL_INVALID; + } + else { + state->regData[rd].o = state->regData[rn].o; + state->regData[rd].o = (RegValOrigin)(state->regData[rd].o | op2origin); + } + break; + + case 5: /* ADC: Rd:= Op1 + Op2 + C */ + case 6: /* SBC: Rd:= Op1 - Op2 + C */ + case 7: /* RSC: Rd:= Op2 - Op1 + C */ + /* CPSR is not tracked */ + state->regData[rd].o = REG_VAL_INVALID; + break; + + case 8: /* TST: set condition codes on Op1 AND Op2 */ + case 9: /* TEQ: set condition codes on Op1 EOR Op2 */ + case 10: /* CMP: set condition codes on Op1 - Op2 */ + case 11: /* CMN: set condition codes on Op1 + Op2 */ + break; + + case 13: /* MOV: Rd:= Op2 */ + case 15: /* MVN: Rd:= NOT Op2 */ + state->regData[rd].o = (RegValOrigin) op2origin; + break; + } + + /* Account for pre-fetch by temporarily adjusting PC */ + if (rn == 15) { + + /* If the shift amount is specified in the instruction, + * the PC will be 8 bytes ahead. If a register is used + * to specify the shift amount the PC will be 12 bytes + * ahead. + */ + state->regData[rn].v += ((!I && (operand2 & 0x0010)) ? 12 : 8); + } + + /* Compute values */ + switch (opcode) { + case 0: /* AND: Rd := Op1 AND Op2 */ + state->regData[rd].v = state->regData[rn].v & op2val; + break; + + case 1: /* EOR: Rd := Op1 EOR Op2 */ + state->regData[rd].v = state->regData[rn].v ^ op2val; + break; + + case 2: /* SUB: Rd:= Op1 - Op2 */ + state->regData[rd].v = state->regData[rn].v - op2val; + break; + case 3: /* RSB: Rd:= Op2 - Op1 */ + state->regData[rd].v = op2val - state->regData[rn].v; + break; + + case 4: /* ADD: Rd:= Op1 + Op2 */ + state->regData[rd].v = state->regData[rn].v + op2val; + break; + + case 5: /* ADC: Rd:= Op1 + Op2 + C */ + case 6: /* SBC: Rd:= Op1 - Op2 + C */ + case 7: /* RSC: Rd:= Op2 - Op1 + C */ + case 8: /* TST: set condition codes on Op1 AND Op2 */ + case 9: /* TEQ: set condition codes on Op1 EOR Op2 */ + case 10: /* CMP: set condition codes on Op1 - Op2 */ + case 11: /* CMN: set condition codes on Op1 + Op2 */ + UnwPrintd1("\t; ????"); + break; + + case 12: /* ORR: Rd:= Op1 OR Op2 */ + state->regData[rd].v = state->regData[rn].v | op2val; + break; + + case 13: /* MOV: Rd:= Op2 */ + state->regData[rd].v = op2val; + break; + + case 14: /* BIC: Rd:= Op1 AND NOT Op2 */ + state->regData[rd].v = state->regData[rn].v & (~op2val); + break; + + case 15: /* MVN: Rd:= NOT Op2 */ + state->regData[rd].v = ~op2val; + break; + } + + /* Remove the prefetch offset from the PC */ + if (rd != 15 && rn == 15) + state->regData[rn].v -= ((!I && (operand2 & 0x0010)) ? 12 : 8); + } + + /* Block Data Transfer + * LDM, STM + */ + else if ((instr & 0xFE000000) == 0xE8000000) { + + bool P = !!(instr & 0x01000000), + U = !!(instr & 0x00800000), + S = !!(instr & 0x00400000), + W = !!(instr & 0x00200000), + L = !!(instr & 0x00100000); + uint16_t baseReg = (instr & 0x000F0000) >> 16; + uint16_t regList = (instr & 0x0000FFFF); + uint32_t addr = state->regData[baseReg].v; + bool addrValid = M_IsOriginValid(state->regData[baseReg].o); + int8_t r; + + #ifdef UNW_DEBUG + /* Display the instruction */ + if (L) + UnwPrintd6("LDM%c%c r%d%s, {reglist}%s\n", P ? 'E' : 'F', U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); + else + UnwPrintd6("STM%c%c r%d%s, {reglist}%s\n", !P ? 'E' : 'F', !U ? 'D' : 'A', baseReg, W ? "!" : "", S ? "^" : ""); + #endif + + /* S indicates that banked registers (untracked) are used, unless + * this is a load including the PC when the S-bit indicates that + * that CPSR is loaded from SPSR (also untracked, but ignored). + */ + if (S && (!L || (regList & (0x01 << 15)) == 0)) { + UnwPrintd1("\nError:S-bit set requiring banked registers\n"); + return UNWIND_FAILURE; + } + else if (baseReg == 15) { + UnwPrintd1("\nError: r15 used as base register\n"); + return UNWIND_FAILURE; + } + else if (regList == 0) { + UnwPrintd1("\nError: Register list empty\n"); + return UNWIND_FAILURE; + } + + /* Check if ascending or descending. + * Registers are loaded/stored in order of address. + * i.e. r0 is at the lowest address, r15 at the highest. + */ + r = U ? 0 : 15; + do { + + /* Check if the register is to be transferred */ + if (regList & (0x01 << r)) { + + if (P) addr += U ? 4 : -4; + + if (L) { + + if (addrValid) { + + if (!UnwMemReadRegister(state, addr, &state->regData[r])) + return UNWIND_DREAD_W_FAIL; + + /* Update the origin if read via the stack pointer */ + if (M_IsOriginValid(state->regData[r].o) && baseReg == 13) + state->regData[r].o = REG_VAL_FROM_STACK; + + UnwPrintd5(" R%d = 0x%08x\t; r%d %s\n",r,state->regData[r].v,r, M_Origin2Str(state->regData[r].o)); + } + else { + /* Invalidate the register as the base reg was invalid */ + state->regData[r].o = REG_VAL_INVALID; + UnwPrintd2(" R%d = ???\n", r); + } + } + else { + if (addrValid && !UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DWRITE_W_FAIL; + + UnwPrintd2(" R%d = 0x%08x\n", r); + } + + if (!P) addr += U ? 4 : -4; + } + + /* Check the next register */ + r += U ? 1 : -1; + + } while (r >= 0 && r <= 15); + + /* Check the writeback bit */ + if (W) state->regData[baseReg].v = addr; + + /* Check if the PC was loaded */ + if (L && (regList & (0x01 << 15))) { + if (!M_IsOriginValid(state->regData[15].o)) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + else { + /* Store the return address */ + if (!UnwReportRetAddr(state, state->regData[15].v)) + return UNWIND_TRUNCATED; + + UnwPrintd2(" Return PC=0x%x", state->regData[15].v); + + /* Determine the return mode */ + if (state->regData[15].v & 0x1) { + /* Branching to THUMB */ + return UnwStartThumb(state); + } + else { + /* Branch to ARM */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 4; + } + } + } + } + else { + UnwPrintd1("????"); + + /* Unknown/undecoded. May alter some register, so invalidate file */ + UnwInvalidateRegisterFile(state->regData); + } + + UnwPrintd1("\n"); + + /* Should never hit the reset vector */ + if (state->regData[15].v == 0) return UNWIND_RESET; + + /* Check next address */ + state->regData[15].v += 4; + + /* Garbage collect the memory hash (used only for the stack) */ + UnwMemHashGC(state); + + if (--t == 0) return UNWIND_EXHAUSTED; + + } while (!found); + + return UNWIND_UNSUPPORTED; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp new file mode 100644 index 00000000..26ca8b26 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarm_thumb.cpp @@ -0,0 +1,1067 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Abstract interpretation for Thumb mode. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWARM_THUMB" + +#include +#include "unwarm.h" + +/** Sign extend an 11 bit value. + * This function simply inspects bit 11 of the input \a value, and if + * set, the top 5 bits are set to give a 2's compliment signed value. + * \param value The value to sign extend. + * \return The signed-11 bit value stored in a 16bit data type. + */ +static int32_t signExtend11(const uint16_t value) { + return (value & 0x400) ? value | 0xFFFFF800 : value; +} + +UnwResult UnwStartThumb(UnwState * const state) { + bool found = false; + uint16_t t = UNW_MAX_INSTR_COUNT; + uint32_t lastJumpAddr = 0; // Last JUMP address, to try to detect infinite loops + bool loopDetected = false; // If a loop was detected + + do { + uint16_t instr; + + /* Attempt to read the instruction */ + if (!state->cb->readH(state->regData[15].v & (~0x1), &instr)) + return UNWIND_IREAD_H_FAIL; + + UnwPrintd4("T %x %x %04x:", state->regData[13].v, state->regData[15].v, instr); + + /* Check that the PC is still on Thumb alignment */ + if (!(state->regData[15].v & 0x1)) { + UnwPrintd1("\nError: PC misalignment\n"); + return UNWIND_INCONSISTENT; + } + + /* Check that the SP and PC have not been invalidated */ + if (!M_IsOriginValid(state->regData[13].o) || !M_IsOriginValid(state->regData[15].o)) { + UnwPrintd1("\nError: PC or SP invalidated\n"); + return UNWIND_INCONSISTENT; + } + + /* + * Detect 32bit thumb instructions + */ + if ((instr & 0xE000) == 0xE000 && (instr & 0x1800) != 0) { + uint16_t instr2; + + /* Check next address */ + state->regData[15].v += 2; + + /* Attempt to read the 2nd part of the instruction */ + if (!state->cb->readH(state->regData[15].v & (~0x1), &instr2)) + return UNWIND_IREAD_H_FAIL; + + UnwPrintd3(" %x %04x:", state->regData[15].v, instr2); + + /* + * Load/Store multiple: Only interpret + * PUSH and POP + */ + if ((instr & 0xFE6F) == 0xE82D) { + bool L = !!(instr & 0x10); + uint16_t rList = instr2; + + if (L) { + uint8_t r; + + /* Load from memory: POP */ + UnwPrintd1("POP {Rlist}\n"); + + /* Load registers from stack */ + for (r = 0; r < 16; r++) { + if (rList & (0x1 << r)) { + + /* Read the word */ + if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DREAD_W_FAIL; + + /* Alter the origin to be from the stack if it was valid */ + if (M_IsOriginValid(state->regData[r].o)) { + + state->regData[r].o = REG_VAL_FROM_STACK; + + /* If restoring the PC */ + if (r == 15) { + + /* The bottom bit should have been set to indicate that + * the caller was from Thumb. This would allow return + * by BX for interworking APCS. + */ + if ((state->regData[15].v & 0x1) == 0) { + UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); + + /* Pop into the PC will not switch mode */ + return UNWIND_INCONSISTENT; + } + + /* Store the return address */ + if (!UnwReportRetAddr(state, state->regData[15].v)) + return UNWIND_TRUNCATED; + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v); + + /* Compensate for the auto-increment, which isn't needed here */ + state->regData[15].v -= 2; + + } + + } else { + + if (r == 15) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + } + + state->regData[13].v += 4; + + UnwPrintd3(" r%d = 0x%08x\n", r, state->regData[r].v); + } + } + } + else { + int8_t r; + + /* Store to memory: PUSH */ + UnwPrintd1("PUSH {Rlist}"); + + for (r = 15; r >= 0; r--) { + if (rList & (0x1 << r)) { + UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); + + state->regData[13].v -= 4; + + if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DWRITE_W_FAIL; + } + } + } + } + /* + * PUSH register + */ + else if (instr == 0xF84D && (instr2 & 0x0FFF) == 0x0D04) { + uint8_t r = instr2 >> 12; + + /* Store to memory: PUSH */ + UnwPrintd2("PUSH {R%d}\n", r); + UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); + + state->regData[13].v -= 4; + + if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DWRITE_W_FAIL; + } + /* + * POP register + */ + else if (instr == 0xF85D && (instr2 & 0x0FFF) == 0x0B04) { + uint8_t r = instr2 >> 12; + + /* Load from memory: POP */ + UnwPrintd2("POP {R%d}\n", r); + + /* Read the word */ + if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DREAD_W_FAIL; + + /* Alter the origin to be from the stack if it was valid */ + if (M_IsOriginValid(state->regData[r].o)) { + + state->regData[r].o = REG_VAL_FROM_STACK; + + /* If restoring the PC */ + if (r == 15) { + + /* The bottom bit should have been set to indicate that + * the caller was from Thumb. This would allow return + * by BX for interworking APCS. + */ + if ((state->regData[15].v & 0x1) == 0) { + UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); + + /* Pop into the PC will not switch mode */ + return UNWIND_INCONSISTENT; + } + + /* Store the return address */ + if (!UnwReportRetAddr(state, state->regData[15].v)) + return UNWIND_TRUNCATED; + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v); + + /* Compensate for the auto-increment, which isn't needed here */ + state->regData[15].v -= 2; + + } + + } else { + + if (r == 15) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + } + + state->regData[13].v += 4; + + UnwPrintd3(" r%d = 0x%08x\n", r, state->regData[r].v); + } + /* + * TBB / TBH + */ + else if ((instr & 0xFFF0) == 0xE8D0 && (instr2 & 0xFFE0) == 0xF000) { + /* We are only interested in + * the forms + * TBB [PC, ...] + * TBH [PC, ..., LSL #1] + * as those are used by the C compiler to implement + * the switch clauses + */ + uint8_t rn = instr & 0xF; + bool H = !!(instr2 & 0x10); + + UnwPrintd5("TB%c [r%d,r%d%s]\n", H ? 'H' : 'B', rn, (instr2 & 0xF), H ? ",LSL #1" : ""); + + // We are only interested if the RN is the PC. Let's choose the 1st destination + if (rn == 15) { + if (H) { + uint16_t rv; + if (!state->cb->readH((state->regData[15].v & (~1)) + 2, &rv)) + return UNWIND_DREAD_H_FAIL; + state->regData[15].v += rv * 2; + } + else { + uint8_t rv; + if (!state->cb->readB((state->regData[15].v & (~1)) + 2, &rv)) + return UNWIND_DREAD_B_FAIL; + state->regData[15].v += rv * 2; + } + } + } + /* + * Unconditional branch + */ + else if ((instr & 0xF800) == 0xF000 && (instr2 & 0xD000) == 0x9000) { + uint32_t v; + + uint8_t S = (instr & 0x400) >> 10; + uint16_t imm10 = (instr & 0x3FF); + uint8_t J1 = (instr2 & 0x2000) >> 13; + uint8_t J2 = (instr2 & 0x0800) >> 11; + uint16_t imm11 = (instr2 & 0x7FF); + + uint8_t I1 = J1 ^ S ^ 1; + uint8_t I2 = J2 ^ S ^ 1; + uint32_t imm32 = (S << 24) | (I1 << 23) | (I2 << 22) |(imm10 << 12) | (imm11 << 1); + if (S) imm32 |= 0xFE000000; + + UnwPrintd2("B %d \n", imm32); + + /* Update PC */ + state->regData[15].v += imm32; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Compute the jump address */ + v = state->regData[15].v + 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", v); + + /* Did we detect an infinite loop ? */ + loopDetected = lastJumpAddr == v; + + /* Remember the last address we jumped to */ + lastJumpAddr = v; + } + + /* + * Branch with link + */ + else if ((instr & 0xF800) == 0xF000 && (instr2 & 0xD000) == 0xD000) { + + uint8_t S = (instr & 0x400) >> 10; + uint16_t imm10 = (instr & 0x3FF); + uint8_t J1 = (instr2 & 0x2000) >> 13; + uint8_t J2 = (instr2 & 0x0800) >> 11; + uint16_t imm11 = (instr2 & 0x7FF); + + uint8_t I1 = J1 ^ S ^ 1; + uint8_t I2 = J2 ^ S ^ 1; + uint32_t imm32 = (S << 24) | (I1 << 23) | (I2 << 22) |(imm10 << 12) | (imm11 << 1); + if (S) imm32 |= 0xFE000000; + + UnwPrintd2("BL %d \n", imm32); + + /* Never taken, as we are unwinding the stack */ + if (0) { + + /* Store return address in LR register */ + state->regData[14].v = state->regData[15].v + 2; + state->regData[14].o = REG_VAL_FROM_CONST; + + /* Update PC */ + state->regData[15].v += imm32; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Display PC of next instruction */ + UnwPrintd2(" Return PC=%x", state->regData[15].v); + + /* Report the return address, including mode bit */ + if (!UnwReportRetAddr(state, state->regData[15].v)) + return UNWIND_TRUNCATED; + + /* Determine the new mode */ + if (state->regData[15].v & 0x1) { + /* Branching to THUMB */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 2; + } + else { + /* Branch to ARM */ + return UnwStartArm(state); + } + } + } + + /* + * Conditional branches. Usually not taken, unless infinite loop is detected + */ + else if ((instr & 0xF800) == 0xF000 && (instr2 & 0xD000) == 0x8000) { + + uint8_t S = (instr & 0x400) >> 10; + uint16_t imm6 = (instr & 0x3F); + uint8_t J1 = (instr2 & 0x2000) >> 13; + uint8_t J2 = (instr2 & 0x0800) >> 11; + uint16_t imm11 = (instr2 & 0x7FF); + + uint8_t I1 = J1 ^ S ^ 1; + uint8_t I2 = J2 ^ S ^ 1; + uint32_t imm32 = (S << 20) | (I1 << 19) | (I2 << 18) |(imm6 << 12) | (imm11 << 1); + if (S) imm32 |= 0xFFE00000; + + UnwPrintd2("Bcond %d\n", imm32); + + /* Take the jump only if a loop is detected */ + if (loopDetected) { + + /* Update PC */ + state->regData[15].v += imm32; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", state->regData[15].v + 2); + } + } + /* + * PC-relative load + * LDR Rd,[PC, #+/-imm] + */ + else if ((instr & 0xFF7F) == 0xF85F) { + uint8_t rt = (instr2 & 0xF000) >> 12; + uint8_t imm12 = (instr2 & 0x0FFF); + bool A = !!(instr & 0x80); + uint32_t address; + + /* Compute load address, adding a word to account for prefetch */ + address = (state->regData[15].v & (~0x3)) + 4; + if (A) address += imm12; + else address -= imm12; + + UnwPrintd4("LDR r%d,[PC #%c0x%08x]", rt, A?'+':'-', address); + + if (!UnwMemReadRegister(state, address, &state->regData[rt])) + return UNWIND_DREAD_W_FAIL; + } + /* + * LDR immediate. + * We are only interested when destination is PC. + * LDR Rt,[Rn , #n] + */ + else if ((instr & 0xFFF0) == 0xF8D0) { + uint8_t rn = (instr & 0xF); + uint8_t rt = (instr2 & 0xF000) >> 12; + uint16_t imm12 = (instr2 & 0xFFF); + + /* If destination is PC and we don't know the source value, then fail */ + if (!M_IsOriginValid(state->regData[rn].o)) { + state->regData[rt].o = state->regData[rn].o; + } + else { + uint32_t address = state->regData[rn].v + imm12; + if (!UnwMemReadRegister(state, address, &state->regData[rt])) + return UNWIND_DREAD_W_FAIL; + } + } + /* + * LDR immediate + * We are only interested when destination is PC. + * LDR Rt,[Rn , #-n] + * LDR Rt,[Rn], #+/-n] + * LDR Rt,[Rn, #+/-n]! + */ + else if ((instr & 0xFFF0) == 0xF850 && (instr2 & 0x0800) == 0x0800) { + uint8_t rn = (instr & 0xF); + uint8_t rt = (instr2 & 0xF000) >> 12; + uint16_t imm8 = (instr2 & 0xFF); + bool P = !!(instr2 & 0x400); + bool U = !!(instr2 & 0x200); + bool W = !!(instr2 & 0x100); + + if (!M_IsOriginValid(state->regData[rn].o)) + state->regData[rt].o = state->regData[rn].o; + else { + uint32_t offaddress = state->regData[rn].v + (U ? imm8 + imm8 : 0), + address = P ? offaddress : state->regData[rn].v; + + if (!UnwMemReadRegister(state, address, &state->regData[rt])) + return UNWIND_DREAD_W_FAIL; + + if (W) state->regData[rn].v = offaddress; + } + } + /* + * LDR (register). + * We are interested in the form + * ldr Rt, [Rn, Rm, lsl #x] + * Where Rt is PC, Rn value is known, Rm is not known or unknown + */ + else if ((instr & 0xFFF0) == 0xF850 && (instr2 & 0x0FC0) == 0x0000) { + const uint8_t rn = (instr & 0xF), + rt = (instr2 & 0xF000) >> 12, + rm = (instr2 & 0xF), + imm2 = (instr2 & 0x30) >> 4; + + if (!M_IsOriginValid(state->regData[rn].o) || !M_IsOriginValid(state->regData[rm].o)) { + + /* If Rt is PC, and Rn is known, then do an exception and assume + Rm equals 0 => This takes the first case in a switch() */ + if (rt == 15 && M_IsOriginValid(state->regData[rn].o)) { + uint32_t address = state->regData[rn].v; + if (!UnwMemReadRegister(state, address, &state->regData[rt])) + return UNWIND_DREAD_W_FAIL; + } + else /* Propagate unknown value */ + state->regData[rt].o = state->regData[rn].o; + + } + else { + uint32_t address = state->regData[rn].v + (state->regData[rm].v << imm2); + if (!UnwMemReadRegister(state, address, &state->regData[rt])) + return UNWIND_DREAD_W_FAIL; + } + } + else { + UnwPrintd1("???? (32)"); + + /* Unknown/undecoded. May alter some register, so invalidate file */ + UnwInvalidateRegisterFile(state->regData); + } + /* End of thumb 32bit code */ + + } + /* Format 1: Move shifted register + * LSL Rd, Rs, #Offset5 + * LSR Rd, Rs, #Offset5 + * ASR Rd, Rs, #Offset5 + */ + else if ((instr & 0xE000) == 0x0000 && (instr & 0x1800) != 0x1800) { + bool signExtend; + const uint8_t op = (instr & 0x1800) >> 11, + offset5 = (instr & 0x07C0) >> 6, + rs = (instr & 0x0038) >> 3, + rd = (instr & 0x0007); + + switch (op) { + case 0: /* LSL */ + UnwPrintd6("LSL r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); + state->regData[rd].v = state->regData[rs].v << offset5; + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + + case 1: /* LSR */ + UnwPrintd6("LSR r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); + state->regData[rd].v = state->regData[rs].v >> offset5; + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + + case 2: /* ASR */ + UnwPrintd6("ASL r%d, r%d, #%d\t; r%d %s", rd, rs, offset5, rs, M_Origin2Str(state->regData[rs].o)); + + signExtend = !!(state->regData[rs].v & 0x8000); + state->regData[rd].v = state->regData[rs].v >> offset5; + if (signExtend) state->regData[rd].v |= 0xFFFFFFFF << (32 - offset5); + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + } + } + /* Format 2: add/subtract + * ADD Rd, Rs, Rn + * ADD Rd, Rs, #Offset3 + * SUB Rd, Rs, Rn + * SUB Rd, Rs, #Offset3 + */ + else if ((instr & 0xF800) == 0x1800) { + bool I = !!(instr & 0x0400); + bool op = !!(instr & 0x0200); + uint8_t rn = (instr & 0x01C0) >> 6; + uint8_t rs = (instr & 0x0038) >> 3; + uint8_t rd = (instr & 0x0007); + + /* Print decoding */ + UnwPrintd6("%s r%d, r%d, %c%d\t;",op ? "SUB" : "ADD",rd, rs,I ? '#' : 'r',rn); + UnwPrintd5("r%d %s, r%d %s",rd, M_Origin2Str(state->regData[rd].o),rs, M_Origin2Str(state->regData[rs].o)); + if (!I) { + + UnwPrintd3(", r%d %s", rn, M_Origin2Str(state->regData[rn].o)); + + /* Perform calculation */ + state->regData[rd].v = state->regData[rs].v + (op ? -state->regData[rn].v : state->regData[rn].v); + + /* Propagate the origin */ + if (M_IsOriginValid(state->regData[rs].o) && M_IsOriginValid(state->regData[rn].o)) { + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + } + else + state->regData[rd].o = REG_VAL_INVALID; + } + else { + /* Perform calculation */ + state->regData[rd].v = state->regData[rs].v + (op ? -rn : rn); + + /* Propagate the origin */ + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + } + } + /* Format 3: move/compare/add/subtract immediate + * MOV Rd, #Offset8 + * CMP Rd, #Offset8 + * ADD Rd, #Offset8 + * SUB Rd, #Offset8 + */ + else if ((instr & 0xE000) == 0x2000) { + + uint8_t op = (instr & 0x1800) >> 11; + uint8_t rd = (instr & 0x0700) >> 8; + uint8_t offset8 = (instr & 0x00FF); + + switch (op) { + case 0: /* MOV */ + UnwPrintd3("MOV r%d, #0x%x", rd, offset8); + state->regData[rd].v = offset8; + state->regData[rd].o = REG_VAL_FROM_CONST; + break; + + case 1: /* CMP */ + /* Irrelevant to unwinding */ + UnwPrintd1("CMP ???"); + break; + + case 2: /* ADD */ + UnwPrintd5("ADD r%d, #0x%x\t; r%d %s", rd, offset8, rd, M_Origin2Str(state->regData[rd].o)); + state->regData[rd].v += offset8; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + + case 3: /* SUB */ + UnwPrintd5("SUB r%d, #0x%d\t; r%d %s", rd, offset8, rd, M_Origin2Str(state->regData[rd].o)); + state->regData[rd].v -= offset8; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + } + } + /* Format 4: ALU operations + * AND Rd, Rs + * EOR Rd, Rs + * LSL Rd, Rs + * LSR Rd, Rs + * ASR Rd, Rs + * ADC Rd, Rs + * SBC Rd, Rs + * ROR Rd, Rs + * TST Rd, Rs + * NEG Rd, Rs + * CMP Rd, Rs + * CMN Rd, Rs + * ORR Rd, Rs + * MUL Rd, Rs + * BIC Rd, Rs + * MVN Rd, Rs + */ + else if ((instr & 0xFC00) == 0x4000) { + uint8_t op = (instr & 0x03C0) >> 6; + uint8_t rs = (instr & 0x0038) >> 3; + uint8_t rd = (instr & 0x0007); + +#ifdef UNW_DEBUG + static const char * const mnu[16] = { + "AND", "EOR", "LSL", "LSR", + "ASR", "ADC", "SBC", "ROR", + "TST", "NEG", "CMP", "CMN", + "ORR", "MUL", "BIC", "MVN" }; +#endif + /* Print the mnemonic and registers */ + switch (op) { + case 0: /* AND */ + case 1: /* EOR */ + case 2: /* LSL */ + case 3: /* LSR */ + case 4: /* ASR */ + case 7: /* ROR */ + case 9: /* NEG */ + case 12: /* ORR */ + case 13: /* MUL */ + case 15: /* MVN */ + UnwPrintd8("%s r%d ,r%d\t; r%d %s, r%d %s",mnu[op],rd, rs, rd, M_Origin2Str(state->regData[rd].o), rs, M_Origin2Str(state->regData[rs].o)); + break; + + case 5: /* ADC */ + case 6: /* SBC */ + UnwPrintd4("%s r%d, r%d", mnu[op], rd, rs); + break; + + case 8: /* TST */ + case 10: /* CMP */ + case 11: /* CMN */ + /* Irrelevant to unwinding */ + UnwPrintd2("%s ???", mnu[op]); + break; + + case 14: /* BIC */ + UnwPrintd5("r%d ,r%d\t; r%d %s", rd, rs, rs, M_Origin2Str(state->regData[rs].o)); + break; + } + + /* Perform operation */ + switch (op) { + case 0: /* AND */ + state->regData[rd].v &= state->regData[rs].v; + break; + + case 1: /* EOR */ + state->regData[rd].v ^= state->regData[rs].v; + break; + + case 2: /* LSL */ + state->regData[rd].v <<= state->regData[rs].v; + break; + + case 3: /* LSR */ + state->regData[rd].v >>= state->regData[rs].v; + break; + + case 4: /* ASR */ + if (state->regData[rd].v & 0x80000000) { + state->regData[rd].v >>= state->regData[rs].v; + state->regData[rd].v |= 0xFFFFFFFF << (32 - state->regData[rs].v); + } + else { + state->regData[rd].v >>= state->regData[rs].v; + } + + break; + + case 5: /* ADC */ + case 6: /* SBC */ + case 8: /* TST */ + case 10: /* CMP */ + case 11: /* CMN */ + break; + + case 7: /* ROR */ + state->regData[rd].v = (state->regData[rd].v >> state->regData[rs].v) | + (state->regData[rd].v << (32 - state->regData[rs].v)); + break; + + case 9: /* NEG */ + state->regData[rd].v = -state->regData[rs].v; + break; + + case 12: /* ORR */ + state->regData[rd].v |= state->regData[rs].v; + break; + + case 13: /* MUL */ + state->regData[rd].v *= state->regData[rs].v; + break; + + case 14: /* BIC */ + state->regData[rd].v &= ~state->regData[rs].v; + break; + + case 15: /* MVN */ + state->regData[rd].v = ~state->regData[rs].v; + break; + } + + /* Propagate data origins */ + switch (op) { + case 0: /* AND */ + case 1: /* EOR */ + case 2: /* LSL */ + case 3: /* LSR */ + case 4: /* ASR */ + case 7: /* ROR */ + case 12: /* ORR */ + case 13: /* MUL */ + case 14: /* BIC */ + if (M_IsOriginValid(state->regData[rd].o) && M_IsOriginValid(state->regData[rs].o)) { + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + } + else + state->regData[rd].o = REG_VAL_INVALID; + break; + + case 5: /* ADC */ + case 6: /* SBC */ + /* C-bit not tracked */ + state->regData[rd].o = REG_VAL_INVALID; + break; + + case 8: /* TST */ + case 10: /* CMP */ + case 11: /* CMN */ + /* Nothing propagated */ + break; + + case 9: /* NEG */ + case 15: /* MVN */ + state->regData[rd].o = state->regData[rs].o; + state->regData[rd].o |= REG_VAL_ARITHMETIC; + break; + } + } + /* Format 5: Hi register operations/branch exchange + * ADD Rd, Hs + * CMP Hd, Rs + * MOV Hd, Hs + */ + else if ((instr & 0xFC00) == 0x4400) { + uint8_t op = (instr & 0x0300) >> 8; + bool h1 = (instr & 0x0080) ? true: false; + bool h2 = (instr & 0x0040) ? true: false; + uint8_t rhs = (instr & 0x0038) >> 3; + uint8_t rhd = (instr & 0x0007); + + /* Adjust the register numbers */ + if (h2) rhs += 8; + if (h1) rhd += 8; + + switch (op) { + case 0: /* ADD */ + UnwPrintd5("ADD r%d, r%d\t; r%d %s", rhd, rhs, rhs, M_Origin2Str(state->regData[rhs].o)); + state->regData[rhd].v += state->regData[rhs].v; + state->regData[rhd].o = state->regData[rhs].o; + state->regData[rhd].o |= REG_VAL_ARITHMETIC; + break; + + case 1: /* CMP */ + /* Irrelevant to unwinding */ + UnwPrintd1("CMP ???"); + break; + + case 2: /* MOV */ + UnwPrintd5("MOV r%d, r%d\t; r%d %s", rhd, rhs, rhd, M_Origin2Str(state->regData[rhs].o)); + state->regData[rhd].v = state->regData[rhs].v; + state->regData[rhd].o = state->regData[rhs].o; + break; + + case 3: /* BX */ + UnwPrintd4("BX r%d\t; r%d %s\n", rhs, rhs, M_Origin2Str(state->regData[rhs].o)); + + /* Only follow BX if the data was from the stack or BX LR */ + if (rhs == 14 || state->regData[rhs].o == REG_VAL_FROM_STACK) { + UnwPrintd2(" Return PC=0x%x\n", state->regData[rhs].v & (~0x1)); + + /* Report the return address, including mode bit */ + if (!UnwReportRetAddr(state, state->regData[rhs].v)) + return UNWIND_TRUNCATED; + + /* Update the PC */ + state->regData[15].v = state->regData[rhs].v; + + /* Determine the new mode */ + if (state->regData[rhs].v & 0x1) { + /* Branching to THUMB */ + + /* Account for the auto-increment which isn't needed */ + state->regData[15].v -= 2; + } + else /* Branch to ARM */ + return UnwStartArm(state); + } + else { + UnwPrintd4("\nError: BX to invalid register: r%d = 0x%x (%s)\n", rhs, state->regData[rhs].o, M_Origin2Str(state->regData[rhs].o)); + return UNWIND_FAILURE; + } + } + } + /* Format 9: PC-relative load + * LDR Rd,[PC, #imm] + */ + else if ((instr & 0xF800) == 0x4800) { + uint8_t rd = (instr & 0x0700) >> 8; + uint8_t word8 = (instr & 0x00FF); + uint32_t address; + + /* Compute load address, adding a word to account for prefetch */ + address = (state->regData[15].v & (~0x3)) + 4 + (word8 << 2); + + UnwPrintd3("LDR r%d, 0x%08x", rd, address); + + if (!UnwMemReadRegister(state, address, &state->regData[rd])) + return UNWIND_DREAD_W_FAIL; + } + /* Format 13: add offset to Stack Pointer + * ADD sp,#+imm + * ADD sp,#-imm + */ + else if ((instr & 0xFF00) == 0xB000) { + uint8_t value = (instr & 0x7F) * 4; + + /* Check the negative bit */ + if ((instr & 0x80) != 0) { + UnwPrintd2("SUB sp,#0x%x", value); + state->regData[13].v -= value; + } + else { + UnwPrintd2("ADD sp,#0x%x", value); + state->regData[13].v += value; + } + } + /* Format 14: push/pop registers + * PUSH {Rlist} + * PUSH {Rlist, LR} + * POP {Rlist} + * POP {Rlist, PC} + */ + else if ((instr & 0xF600) == 0xB400) { + bool L = !!(instr & 0x0800); + bool R = !!(instr & 0x0100); + uint8_t rList = (instr & 0x00FF); + + if (L) { + uint8_t r; + + /* Load from memory: POP */ + UnwPrintd2("POP {Rlist%s}\n", R ? ", PC" : ""); + + for (r = 0; r < 8; r++) { + if (rList & (0x1 << r)) { + + /* Read the word */ + if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DREAD_W_FAIL; + + /* Alter the origin to be from the stack if it was valid */ + if (M_IsOriginValid(state->regData[r].o)) + state->regData[r].o = REG_VAL_FROM_STACK; + + state->regData[13].v += 4; + + UnwPrintd3(" r%d = 0x%08x\n", r, state->regData[r].v); + } + } + + /* Check if the PC is to be popped */ + if (R) { + /* Get the return address */ + if (!UnwMemReadRegister(state, state->regData[13].v, &state->regData[15])) + return UNWIND_DREAD_W_FAIL; + + /* Alter the origin to be from the stack if it was valid */ + if (!M_IsOriginValid(state->regData[15].o)) { + /* Return address is not valid */ + UnwPrintd1("PC popped with invalid address\n"); + return UNWIND_FAILURE; + } + else { + /* The bottom bit should have been set to indicate that + * the caller was from Thumb. This would allow return + * by BX for interworking APCS. + */ + if ((state->regData[15].v & 0x1) == 0) { + UnwPrintd2("Warning: Return address not to Thumb: 0x%08x\n", state->regData[15].v); + + /* Pop into the PC will not switch mode */ + return UNWIND_INCONSISTENT; + } + + /* Store the return address */ + if (!UnwReportRetAddr(state, state->regData[15].v)) + return UNWIND_TRUNCATED; + + /* Now have the return address */ + UnwPrintd2(" Return PC=%x\n", state->regData[15].v); + + /* Update the pc */ + state->regData[13].v += 4; + + /* Compensate for the auto-increment, which isn't needed here */ + state->regData[15].v -= 2; + } + } + } + else { + int8_t r; + + /* Store to memory: PUSH */ + UnwPrintd2("PUSH {Rlist%s}", R ? ", LR" : ""); + + /* Check if the LR is to be pushed */ + if (R) { + UnwPrintd3("\n lr = 0x%08x\t; %s", state->regData[14].v, M_Origin2Str(state->regData[14].o)); + + state->regData[13].v -= 4; + + /* Write the register value to memory */ + if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[14])) + return UNWIND_DWRITE_W_FAIL; + } + + for (r = 7; r >= 0; r--) { + if (rList & (0x1 << r)) { + UnwPrintd4("\n r%d = 0x%08x\t; %s", r, state->regData[r].v, M_Origin2Str(state->regData[r].o)); + + state->regData[13].v -= 4; + + if (!UnwMemWriteRegister(state, state->regData[13].v, &state->regData[r])) + return UNWIND_DWRITE_W_FAIL; + } + } + } + } + + /* + * Conditional branches + * Bcond + */ + else if ((instr & 0xF000) == 0xD000) { + int32_t branchValue = (instr & 0xFF); + if (branchValue & 0x80) branchValue |= 0xFFFFFF00; + + /* Branch distance is twice that specified in the instruction. */ + branchValue *= 2; + + UnwPrintd2("Bcond %d \n", branchValue); + + /* Only take the branch if a loop was detected */ + if (loopDetected) { + + /* Update PC */ + state->regData[15].v += branchValue; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", state->regData[15].v + 2); + } + } + + /* Format 18: unconditional branch + * B label + */ + else if ((instr & 0xF800) == 0xE000) { + uint32_t v; + int32_t branchValue = signExtend11(instr & 0x07FF); + + /* Branch distance is twice that specified in the instruction. */ + branchValue *= 2; + + UnwPrintd2("B %d \n", branchValue); + + /* Update PC */ + state->regData[15].v += branchValue; + + /* Need to advance by a word to account for pre-fetch. + * Advance by a half word here, allowing the normal address + * advance to account for the other half word. + */ + state->regData[15].v += 2; + + /* Compute the jump address */ + v = state->regData[15].v + 2; + + /* Display PC of next instruction */ + UnwPrintd2(" New PC=%x", v); + + /* Did we detect an infinite loop ? */ + loopDetected = lastJumpAddr == v; + + /* Remember the last address we jumped to */ + lastJumpAddr = v; + } + else { + UnwPrintd1("????"); + + /* Unknown/undecoded. May alter some register, so invalidate file */ + UnwInvalidateRegisterFile(state->regData); + } + + UnwPrintd1("\n"); + + /* Should never hit the reset vector */ + if (state->regData[15].v == 0) return UNWIND_RESET; + + /* Check next address */ + state->regData[15].v += 2; + + /* Garbage collect the memory hash (used only for the stack) */ + UnwMemHashGC(state); + + if (--t == 0) return UNWIND_EXHAUSTED; + + } while (!found); + + return UNWIND_SUCCESS; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp new file mode 100644 index 00000000..bfc062af --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.cpp @@ -0,0 +1,441 @@ +/* + * Libbacktrace + * Copyright 2015 Stephen Street + * + * 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://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 + * for exceptions for debugging purposes in 2018 by Eduardo José Tagle. + */ + +#if defined(__arm__) || defined(__thumb__) + +#include "unwarmbytab.h" + +#include +#include + +/* These symbols point to the unwind index and should be provide by the linker script */ +extern "C" const UnwTabEntry __exidx_start[]; +extern "C" const UnwTabEntry __exidx_end[]; + +/* This prevents the linking of libgcc unwinder code */ +void __aeabi_unwind_cpp_pr0() {}; +void __aeabi_unwind_cpp_pr1() {}; +void __aeabi_unwind_cpp_pr2() {}; + +static inline __attribute__((always_inline)) uint32_t prel31_to_addr(const uint32_t *prel31) { + uint32_t offset = (((uint32_t)(*prel31)) << 1) >> 1; + return ((uint32_t)prel31 + offset) & 0x7FFFFFFF; +} + +static const UnwTabEntry *UnwTabSearchIndex(const UnwTabEntry *start, const UnwTabEntry *end, uint32_t ip) { + const UnwTabEntry *middle; + + /* Perform a binary search of the unwind index */ + while (start < end - 1) { + middle = start + ((end - start + 1) >> 1); + if (ip < prel31_to_addr(&middle->addr_offset)) + end = middle; + else + start = middle; + } + return start; +} + +/* + * Get the function name or nullptr if not found + */ +static const char *UnwTabGetFunctionName(const UnwindCallbacks *cb, uint32_t address) { + uint32_t flag_word = 0; + if (!cb->readW(address-4,&flag_word)) + return nullptr; + + if ((flag_word & 0xFF000000) == 0xFF000000) { + return (const char *)(address - 4 - (flag_word & 0x00FFFFFF)); + } + return nullptr; +} + +/** + * Get the next frame unwinding instruction + * + * Return either the instruction or -1 to signal no more instructions + * are available + */ +static int UnwTabGetNextInstruction(const UnwindCallbacks *cb, UnwTabState *ucb) { + int instruction; + + /* Are there more instructions */ + if (ucb->remaining == 0) + return -1; + + /* Extract the current instruction */ + uint32_t v = 0; + if (!cb->readW(ucb->current, &v)) + return -1; + instruction = (v >> (ucb->byte << 3)) & 0xFF; + + /* Move the next byte */ + --ucb->byte; + if (ucb->byte < 0) { + ucb->current += 4; + ucb->byte = 3; + } + --ucb->remaining; + + return instruction; +} + +/** + * Initialize the frame unwinding state + */ +static UnwResult UnwTabStateInit(const UnwindCallbacks *cb, UnwTabState *ucb, uint32_t instructions, const UnwindFrame *frame) { + + /* Initialize control block */ + memset(ucb, 0, sizeof(UnwTabState)); + ucb->current = instructions; + + /* Is a short unwind description */ + uint32_t v = 0; + if (!cb->readW(instructions, &v)) + return UNWIND_DREAD_W_FAIL; + + if ((v & 0xFF000000) == 0x80000000) { + ucb->remaining = 3; + ucb->byte = 2; + /* Is a long unwind description */ + } else if ((v & 0xFF000000) == 0x81000000) { + ucb->remaining = ((v & 0x00FF0000) >> 14) + 2; + ucb->byte = 1; + } else + return UNWIND_UNSUPPORTED_DWARF_PERSONALITY; + + /* Initialize the virtual register set */ + ucb->vrs[7] = frame->fp; + ucb->vrs[13] = frame->sp; + ucb->vrs[14] = frame->lr; + ucb->vrs[15] = 0; + + /* All good */ + return UNWIND_SUCCESS; +} + +/* + * Execute unwinding instructions + */ +static UnwResult UnwTabExecuteInstructions(const UnwindCallbacks *cb, UnwTabState *ucb) { + + int instruction; + uint32_t mask; + uint32_t reg; + uint32_t vsp; + + /* Consume all instruction byte */ + while ((instruction = UnwTabGetNextInstruction(cb, ucb)) != -1) { + + if ((instruction & 0xC0) == 0x00) { // ARM_EXIDX_CMD_DATA_POP + /* vsp = vsp + (xxxxxx << 2) + 4 */ + ucb->vrs[13] += ((instruction & 0x3F) << 2) + 4; + } else + if ((instruction & 0xC0) == 0x40) { // ARM_EXIDX_CMD_DATA_PUSH + /* vsp = vsp - (xxxxxx << 2) - 4 */ + ucb->vrs[13] -= ((instruction & 0x3F) << 2) - 4; + } else + if ((instruction & 0xF0) == 0x80) { + /* pop under mask {r15-r12},{r11-r4} or refuse to unwind */ + instruction = instruction << 8 | UnwTabGetNextInstruction(cb, ucb); + + /* Check for refuse to unwind */ + if (instruction == 0x8000) // ARM_EXIDX_CMD_REFUSED + return UNWIND_REFUSED; + + /* Pop registers using mask */ // ARM_EXIDX_CMD_REG_POP + vsp = ucb->vrs[13]; + mask = instruction & 0xFFF; + + reg = 4; + while (mask) { + if ((mask & 1) != 0) { + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + ucb->vrs[reg] = v; + v += 4; + } + mask >>= 1; + ++reg; + } + + /* Patch up the vrs sp if it was in the mask */ + if ((instruction & (1 << (13 - 4))) != 0) + ucb->vrs[13] = vsp; + + } else + if ((instruction & 0xF0) == 0x90 && // ARM_EXIDX_CMD_REG_TO_SP + instruction != 0x9D && + instruction != 0x9F) { + /* vsp = r[nnnn] */ + ucb->vrs[13] = ucb->vrs[instruction & 0x0F]; + } else + if ((instruction & 0xF0) == 0xA0) { // ARM_EXIDX_CMD_REG_POP + /* pop r4-r[4+nnn] or pop r4-r[4+nnn], r14*/ + vsp = ucb->vrs[13]; + + for (reg = 4; reg <= uint32_t((instruction & 0x07) + 4); ++reg) { + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + + ucb->vrs[reg] = v; + vsp += 4; + } + + if (instruction & 0x08) { // ARM_EXIDX_CMD_REG_POP + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + ucb->vrs[14] = v; + vsp += 4; + } + + ucb->vrs[13] = vsp; + + } else + if (instruction == 0xB0) { // ARM_EXIDX_CMD_FINISH + /* finished */ + if (ucb->vrs[15] == 0) + ucb->vrs[15] = ucb->vrs[14]; + + /* All done unwinding */ + return UNWIND_SUCCESS; + + } else + if (instruction == 0xB1) { // ARM_EXIDX_CMD_REG_POP + /* pop register under mask {r3,r2,r1,r0} */ + vsp = ucb->vrs[13]; + mask = UnwTabGetNextInstruction(cb, ucb); + + reg = 0; + while (mask) { + if ((mask & 1) != 0) { + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + + ucb->vrs[reg] = v; + vsp += 4; + } + mask >>= 1; + ++reg; + } + ucb->vrs[13] = (uint32_t)vsp; + + } else + if (instruction == 0xB2) { // ARM_EXIDX_CMD_DATA_POP + /* vps = vsp + 0x204 + (uleb128 << 2) */ + ucb->vrs[13] += 0x204 + (UnwTabGetNextInstruction(cb, ucb) << 2); + + } else + if (instruction == 0xB3 || // ARM_EXIDX_CMD_VFP_POP + instruction == 0xC8 || + instruction == 0xC9) { + + /* pop VFP double-precision registers */ + vsp = ucb->vrs[13]; + + /* D[ssss]-D[ssss+cccc] */ + uint32_t v; + if (!cb->readW(vsp,&v)) + return UNWIND_DREAD_W_FAIL; + + ucb->vrs[14] = v; + vsp += 4; + + if (instruction == 0xC8) { + /* D[16+sssss]-D[16+ssss+cccc] */ + ucb->vrs[14] |= 1 << 16; + } + + if (instruction != 0xB3) { + /* D[sssss]-D[ssss+cccc] */ + ucb->vrs[14] |= 1 << 17; + } + + ucb->vrs[13] = vsp; + + } else + if ((instruction & 0xF8) == 0xB8 || + (instruction & 0xF8) == 0xD0) { + + /* Pop VFP double precision registers D[8]-D[8+nnn] */ + ucb->vrs[14] = 0x80 | (instruction & 0x07); + + if ((instruction & 0xF8) == 0xD0) { + ucb->vrs[14] = 1 << 17; + } + + } else + return UNWIND_UNSUPPORTED_DWARF_INSTR; + } + + return UNWIND_SUCCESS; +} + +static inline __attribute__((always_inline)) uint32_t read_psp() { + + /* Read the current PSP and return its value as a pointer */ + uint32_t psp; + + __asm__ volatile ( + " mrs %0, psp \n" + : "=r" (psp) : : + ); + + return psp; +} + +/* + * Unwind the specified frame and goto the previous one + */ +static UnwResult UnwTabUnwindFrame(const UnwindCallbacks *cb, UnwindFrame *frame) { + + UnwResult err; + UnwTabState ucb; + const UnwTabEntry *index; + uint32_t instructions; + + /* Search the unwind index for the matching unwind table */ + index = UnwTabSearchIndex(__exidx_start, __exidx_end, frame->pc); + + /* Make sure we can unwind this frame */ + if (index->insn == 0x00000001) + return UNWIND_SUCCESS; + + /* Get the pointer to the first unwind instruction */ + if (index->insn & 0x80000000) + instructions = (uint32_t)&index->insn; + else + instructions = prel31_to_addr(&index->insn); + + /* Initialize the unwind control block */ + if ((err = UnwTabStateInit(cb, &ucb, instructions, frame)) < 0) + return err; + + /* Execute the unwind instructions */ + err = UnwTabExecuteInstructions(cb, &ucb); + if (err < 0) + return err; + + /* Set the virtual pc to the virtual lr if this is the first unwind */ + if (ucb.vrs[15] == 0) + ucb.vrs[15] = ucb.vrs[14]; + + /* Check for exception return */ + /* TODO Test with other ARM processors to verify this method. */ + if ((ucb.vrs[15] & 0xF0000000) == 0xF0000000) { + /* According to the Cortex Programming Manual (p.44), the stack address is always 8-byte aligned (Cortex-M7). + Depending on where the exception came from (MSP or PSP), we need the right SP value to work with. + + ucb.vrs[7] contains the right value, so take it and align it by 8 bytes, store it as the current + SP to work with (ucb.vrs[13]) which is then saved as the current (virtual) frame's SP. + */ + uint32_t stack; + ucb.vrs[13] = (ucb.vrs[7] & ~7); + + /* If we need to start from the MSP, we need to go down X words to find the PC, where: + X=2 if it was a non-floating-point exception + X=20 if it was a floating-point (VFP) exception + + If we need to start from the PSP, we need to go up exactly 6 words to find the PC. + See the ARMv7-M Architecture Reference Manual p.594 and Cortex-M7 Processor Programming Manual p.44/p.45 for details. + */ + if ((ucb.vrs[15] & 0xC) == 0) { + /* Return to Handler Mode: MSP (0xFFFFFF-1) */ + stack = ucb.vrs[13]; + + /* The PC is always 2 words down from the MSP, if it was a non-floating-point exception */ + stack -= 2*4; + + /* If there was a VFP exception (0xFFFFFFE1), the PC is located another 18 words down */ + if ((ucb.vrs[15] & 0xF0) == 0xE0) { + stack -= 18*4; + } + } + else { + /* Return to Thread Mode: PSP (0xFFFFFF-d) */ + stack = read_psp(); + + /* The PC is always 6 words up from the PSP */ + stack += 6*4; + } + + /* Store the PC */ + uint32_t v; + if (!cb->readW(stack,&v)) + return UNWIND_DREAD_W_FAIL; + ucb.vrs[15] = v; + stack -= 4; + + /* Store the LR */ + if (!cb->readW(stack,&v)) + return UNWIND_DREAD_W_FAIL; + ucb.vrs[14] = v; + stack -= 4; + } + + /* We are done if current frame pc is equal to the virtual pc, prevent infinite loop */ + if (frame->pc == ucb.vrs[15]) + return UNWIND_SUCCESS; + + /* Update the frame */ + frame->fp = ucb.vrs[7]; + frame->sp = ucb.vrs[13]; + frame->lr = ucb.vrs[14]; + frame->pc = ucb.vrs[15]; + + /* All good - Continue unwinding */ + return UNWIND_MORE_AVAILABLE; +} + +UnwResult UnwindByTableStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data) { + + UnwResult err = UNWIND_SUCCESS; + UnwReport entry; + + /* Use DWARF unwind information to unwind frames */ + do { + if (frame->pc == 0) { + /* Reached __exidx_end. */ + break; + } + + if (frame->pc == 0x00000001) { + /* Reached .cantunwind instruction. */ + break; + } + + /* Find the unwind index of the current frame pc */ + const UnwTabEntry *index = UnwTabSearchIndex(__exidx_start, __exidx_end, frame->pc); + + /* Clear last bit (Thumb indicator) */ + frame->pc &= 0xFFFFFFFEU; + + /* Generate the backtrace information */ + entry.address = frame->pc; + entry.function = prel31_to_addr(&index->addr_offset); + entry.name = UnwTabGetFunctionName(cb, entry.function); + if (!cb->report(data,&entry)) + break; + + /* Unwind frame and repeat */ + } while ((err = UnwTabUnwindFrame(cb, frame)) == UNWIND_MORE_AVAILABLE); + + /* All done */ + return err; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/unwarmbytab.h b/Marlin/src/HAL/shared/backtrace/unwarmbytab.h new file mode 100644 index 00000000..77a1c82d --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarmbytab.h @@ -0,0 +1,31 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Interface to the memory tracking sub-system. + **************************************************************************/ + +#pragma once + +#include "unwarm.h" + +typedef struct { + uint32_t vrs[16]; + uint32_t current; /* Address of current byte */ + int remaining; + int byte; +} UnwTabState; + +typedef struct { + uint32_t addr_offset; + uint32_t insn; +} UnwTabEntry; + +UnwResult UnwindByTableStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data); diff --git a/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp b/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp new file mode 100644 index 00000000..cf9ac414 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarmmem.cpp @@ -0,0 +1,106 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Implementation of the memory tracking sub-system. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) +#define MODULE_NAME "UNWARMMEM" + +#include +#include "unwarmmem.h" +#include "unwarm.h" + +#define M_IsIdxUsed(a, v) !!((a)[v >> 3] & (1 << (v & 0x7))) +#define M_SetIdxUsed(a, v) ((a)[v >> 3] |= (1 << (v & 0x7))) +#define M_ClrIdxUsed(a, v) ((a)[v >> 3] &= ~(1 << (v & 0x7))) + +/** Search the memory hash to see if an entry is stored in the hash already. + * This will search the hash and either return the index where the item is + * stored, or -1 if the item was not found. + */ +static int16_t memHashIndex(MemData * const memData, const uint32_t addr) { + + const uint16_t v = addr % MEM_HASH_SIZE; + uint16_t s = v; + + do { + /* Check if the element is occupied */ + if (M_IsIdxUsed(memData->used, s)) { + /* Check if it is occupied with the sought data */ + if (memData->a[s] == addr) return s; + } + else { + /* Item is free, this is where the item should be stored */ + return s; + } + + /* Search the next entry */ + s++; + if (s > MEM_HASH_SIZE) s = 0; + } while (s != v); + + /* Search failed, hash is full and the address not stored */ + return -1; +} + +bool UnwMemHashRead(MemData * const memData, uint32_t addr,uint32_t * const data, bool * const tracked) { + + const int16_t i = memHashIndex(memData, addr); + + if (i >= 0 && M_IsIdxUsed(memData->used, i) && memData->a[i] == addr) { + *data = memData->v[i]; + *tracked = M_IsIdxUsed(memData->tracked, i); + return true; + } + else { + /* Address not found in the hash */ + return false; + } +} + +bool UnwMemHashWrite(MemData * const memData, uint32_t addr, uint32_t val, bool valValid) { + const int16_t i = memHashIndex(memData, addr); + if (i < 0) return false; /* Hash full */ + + /* Store the item */ + memData->a[i] = addr; + M_SetIdxUsed(memData->used, i); + + if (valValid) { + memData->v[i] = val; + M_SetIdxUsed(memData->tracked, i); + } + else { + #ifdef UNW_DEBUG + memData->v[i] = 0xDEADBEEF; + #endif + M_ClrIdxUsed(memData->tracked, i); + } + + return true; +} + +void UnwMemHashGC(UnwState * const state) { + + const uint32_t minValidAddr = state->regData[13].v; + MemData * const memData = &state->memData; + uint16_t t; + + for (t = 0; t < MEM_HASH_SIZE; t++) { + if (M_IsIdxUsed(memData->used, t) && (memData->a[t] < minValidAddr)) { + UnwPrintd3("MemHashGC: Free elem %d, addr 0x%08x\n", t, memData->a[t]); + M_ClrIdxUsed(memData->used, t); + } + } +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/unwarmmem.h b/Marlin/src/HAL/shared/backtrace/unwarmmem.h new file mode 100644 index 00000000..588618b3 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwarmmem.h @@ -0,0 +1,21 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Interface to the memory tracking sub-system. + **************************************************************************/ + +#pragma once + +#include "unwarm.h" + +bool UnwMemHashRead(MemData * const memData, uint32_t addr, uint32_t * const data, bool * const tracked); +bool UnwMemHashWrite(MemData * const memData, uint32_t addr, uint32_t val, bool valValid); +void UnwMemHashGC(UnwState * const state); diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.cpp b/Marlin/src/HAL/shared/backtrace/unwinder.cpp new file mode 100644 index 00000000..e63af1ed --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwinder.cpp @@ -0,0 +1,52 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Implementation of the interface into the ARM unwinder. + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#define MODULE_NAME "UNWINDER" + +#include +#include +#include "unwinder.h" +#include "unwarm.h" +#include "unwarmbytab.h" + +/* These symbols point to the unwind index and should be provide by the linker script */ +extern "C" const UnwTabEntry __exidx_start[]; +extern "C" const UnwTabEntry __exidx_end[]; + +// Detect if unwind information is present or not +static int HasUnwindTableInfo() { + // > 16 because there are default entries we can't supress + return ((char*)(&__exidx_end) - (char*)(&__exidx_start)) > 16 ? 1 : 0; +} + +UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data) { + if (HasUnwindTableInfo()) { + /* We have unwind information tables */ + return UnwindByTableStart(frame, cb, data); + } + else { + + /* We don't have unwind information tables */ + UnwState state; + + /* Initialize the unwinding state */ + UnwInitState(&state, cb, data, frame->pc, frame->sp); + + /* Check the Thumb bit */ + return (frame->pc & 0x1) ? UnwStartThumb(&state) : UnwStartArm(&state); + } +} +#endif diff --git a/Marlin/src/HAL/shared/backtrace/unwinder.h b/Marlin/src/HAL/shared/backtrace/unwinder.h new file mode 100644 index 00000000..cae13795 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwinder.h @@ -0,0 +1,172 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + **************************************************************************/ +/** \file + * Interface to the ARM stack unwinding module. + **************************************************************************/ + +#pragma once + +#include + +/** \def UNW_DEBUG + * If this define is set, additional information will be produced while + * unwinding the stack to allow debug of the unwind module itself. + */ +/* #define UNW_DEBUG 1 */ + +/*************************************************************************** + * Type Definitions + **************************************************************************/ + +/** Possible results for UnwindStart to return. + */ +typedef enum { + /** Unwinding was successful and complete. */ + UNWIND_SUCCESS = 0, + + /** Not an error: More frames are available. */ + UNWIND_MORE_AVAILABLE = 1, + + /** Unsupported DWARF unwind personality. */ + UNWIND_UNSUPPORTED_DWARF_PERSONALITY = -1, + + /** Refused to perform unwind. */ + UNWIND_REFUSED = -2, + + /** Reached an invalid SP. */ + UNWIND_INVALID_SP = -3, + + /** Reached an invalid PC */ + UNWIND_INVALID_PC = -4, + + /** Unsupported DWARF instruction */ + UNWIND_UNSUPPORTED_DWARF_INSTR = -5, + + /** More than UNW_MAX_INSTR_COUNT instructions were interpreted. */ + UNWIND_EXHAUSTED = -6, + + /** Unwinding stopped because the reporting func returned false. */ + UNWIND_TRUNCATED = -7, + + /** Read data was found to be inconsistent. */ + UNWIND_INCONSISTENT = -8, + + /** Unsupported instruction or data found. */ + UNWIND_UNSUPPORTED = -9, + + /** General failure. */ + UNWIND_FAILURE = -10, + + /** Illegal instruction. */ + UNWIND_ILLEGAL_INSTR = -11, + + /** Unwinding hit the reset vector. */ + UNWIND_RESET = -12, + + /** Failed read for an instruction word. */ + UNWIND_IREAD_W_FAIL = -13, + + /** Failed read for an instruction half-word. */ + UNWIND_IREAD_H_FAIL = -14, + + /** Failed read for an instruction byte. */ + UNWIND_IREAD_B_FAIL = -15, + + /** Failed read for a data word. */ + UNWIND_DREAD_W_FAIL = -16, + + /** Failed read for a data half-word. */ + UNWIND_DREAD_H_FAIL = -17, + + /** Failed read for a data byte. */ + UNWIND_DREAD_B_FAIL = -18, + + /** Failed write for a data word. */ + UNWIND_DWRITE_W_FAIL = -19 + +} UnwResult; + +/** A backtrace report */ +typedef struct { + uint32_t function; /** Starts address of function */ + const char *name; /** Function name, or null if not available */ + uint32_t address; /** PC on that function */ +} UnwReport; + +/** Type for function pointer for result callback. + * The function is passed two parameters, the first is a void * pointer, + * and the second is the return address of the function. The bottom bit + * of the passed address indicates the execution mode; if it is set, + * the execution mode at the return address is Thumb, otherwise it is + * ARM. + * + * The return value of this function determines whether unwinding should + * continue or not. If true is returned, unwinding will continue and the + * report function maybe called again in future. If false is returned, + * unwinding will stop with UnwindStart() returning UNWIND_TRUNCATED. + */ +typedef bool (*UnwindReportFunc)(void* data, const UnwReport* bte); + +/** Structure that holds memory callback function pointers. + */ +typedef struct { + + /** Report an unwind result. */ + UnwindReportFunc report; + + /** Read a 32 bit word from memory. + * The memory address to be read is passed as \a address, and + * \a *val is expected to be populated with the read value. + * If the address cannot or should not be read, false can be + * returned to indicate that unwinding should stop. If true + * is returned, \a *val is assumed to be valid and unwinding + * will continue. + */ + bool (*readW)(const uint32_t address, uint32_t *val); + + /** Read a 16 bit half-word from memory. + * This function has the same usage as for readW, but is expected + * to read only a 16 bit value. + */ + bool (*readH)(const uint32_t address, uint16_t *val); + + /** Read a byte from memory. + * This function has the same usage as for readW, but is expected + * to read only an 8 bit value. + */ + bool (*readB)(const uint32_t address, uint8_t *val); + + #ifdef UNW_DEBUG + /** Print a formatted line for debug. */ + void (*printf)(const char *format, ...); + #endif +} UnwindCallbacks; + +/* A frame */ +typedef struct { + uint32_t fp; + uint32_t sp; + uint32_t lr; + uint32_t pc; +} UnwindFrame; + +/** Start unwinding the current stack. + * This will unwind the stack starting at the PC value supplied to in the + * link register (i.e. not a normal register) and the stack pointer value + * supplied. + * + * -If the program was compiled with -funwind-tables it will use them to + * perform the traceback. Otherwise, brute force will be employed + * -If the program was compiled with -mpoke-function-name, then you will + * get function names in the traceback. Otherwise, you will not. + */ +UnwResult UnwindStart(UnwindFrame* frame, const UnwindCallbacks *cb, void *data); diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp new file mode 100644 index 00000000..c93494d4 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -0,0 +1,195 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commercially or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liability for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Utility functions to access memory + **************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + +#include "unwmemaccess.h" +#include "../../../inc/MarlinConfig.h" + +/* 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 + +#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, NUCLEO_F767ZI) + + // 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(__IMXRT1062__) + + // For IMXRT1062 in TEENSY 4.0/4/1 + // ITCM (rwx): ORIGIN = 0x00000000, LENGTH = 512K + // DTCM (rwx): ORIGIN = 0x20000000, LENGTH = 512K + // RAM (rwx): ORIGIN = 0x20200000, LENGTH = 512K + // FLASH (rwx): ORIGIN = 0x60000000, LENGTH = 1984K + // + #define START_SRAM_ADDR 0x00000000 + #define END_SRAM_ADDR 0x20280000 + #define START_FLASH_ADDR 0x60000000 + #define END_FLASH_ADDR 0x601F0000 + +#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 + +#endif + +static bool validate_addr(uint32_t addr) { + + // Address must be in SRAM range + if (addr >= START_SRAM_ADDR && addr < END_SRAM_ADDR) + return true; + + // Or in FLASH range + if (addr >= START_FLASH_ADDR && addr < END_FLASH_ADDR) + return true; + + return false; +} + +bool UnwReadW(const uint32_t a, uint32_t *v) { + if (!validate_addr(a)) + return false; + + *v = *(uint32_t *)a; + return true; +} + +bool UnwReadH(const uint32_t a, uint16_t *v) { + if (!validate_addr(a)) + return false; + + *v = *(uint16_t *)a; + return true; +} + +bool UnwReadB(const uint32_t a, uint8_t *v) { + if (!validate_addr(a)) + return false; + + *v = *(uint8_t *)a; + return true; +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.h b/Marlin/src/HAL/shared/backtrace/unwmemaccess.h new file mode 100644 index 00000000..fe42bd94 --- /dev/null +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.h @@ -0,0 +1,22 @@ +/*************************************************************************** + * ARM Stack Unwinder, Michael.McTernan.2001@cs.bris.ac.uk + * Updated, adapted and several bug fixes on 2018 by Eduardo José Tagle + * + * This program is PUBLIC DOMAIN. + * This means that there is no copyright and anyone is able to take a copy + * for free and use it as they wish, with or without modifications, and in + * any context, commerically or otherwise. The only limitation is that I + * don't guarantee that the software is fit for any purpose or accept any + * liablity for it's use or misuse - this software is without warranty. + *************************************************************************** + * File Description: Utility functions to access memory + **************************************************************************/ + +#pragma once + +#include "unwarm.h" +#include + +bool UnwReadW(const uint32_t a, uint32_t *v); +bool UnwReadH(const uint32_t a, uint16_t *v); +bool UnwReadB(const uint32_t a, uint8_t *v); diff --git a/Marlin/src/HAL/shared/eeprom_api.cpp b/Marlin/src/HAL/shared/eeprom_api.cpp new file mode 100644 index 00000000..47cfa5a2 --- /dev/null +++ b/Marlin/src/HAL/shared/eeprom_api.cpp @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) + + #include "eeprom_api.h" + PersistentStore persistentStore; + +#endif diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h new file mode 100644 index 00000000..6445f7a4 --- /dev/null +++ b/Marlin/src/HAL/shared/eeprom_api.h @@ -0,0 +1,71 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com + * + * 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 "../../libs/crc16.h" + +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); + + // 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; + return read_data(data_pos, value, size, &crc); + } +}; + +extern PersistentStore persistentStore; diff --git a/Marlin/src/HAL/shared/eeprom_if.h b/Marlin/src/HAL/shared/eeprom_if.h new file mode 100644 index 00000000..e44da801 --- /dev/null +++ b/Marlin/src/HAL/shared/eeprom_if.h @@ -0,0 +1,29 @@ +/** + * Marlin 3D Printer Firmware + * + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com + * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com + * + * 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 + +// +// EEPROM +// +void eeprom_init(); +void eeprom_write_byte(uint8_t *pos, unsigned char value); +uint8_t eeprom_read_byte(uint8_t *pos); diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp new file mode 100644 index 00000000..cc22bf7d --- /dev/null +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -0,0 +1,78 @@ +/** + * 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(I2C_EEPROM) + +#include "eeprom_if.h" +#include + +void eeprom_init() { Wire.begin(); } + +#if ENABLED(USE_SHARED_EEPROM) + +#ifndef EEPROM_WRITE_DELAY + #define EEPROM_WRITE_DELAY 5 +#endif +#ifndef EEPROM_DEVICE_ADDRESS + #define EEPROM_DEVICE_ADDRESS 0x50 +#endif + +static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRESS); + +// ------------------------ +// Public functions +// ------------------------ + +void eeprom_write_byte(uint8_t *pos, unsigned char value) { + const unsigned eeprom_address = (unsigned)pos; + + Wire.beginTransmission(eeprom_device_address); + Wire.write(int(eeprom_address >> 8)); // MSB + Wire.write(int(eeprom_address & 0xFF)); // LSB + Wire.write(value); + Wire.endTransmission(); + + // wait for write cycle to complete + // this could be done more efficiently with "acknowledge polling" + delay(EEPROM_WRITE_DELAY); +} + +uint8_t eeprom_read_byte(uint8_t *pos) { + const unsigned eeprom_address = (unsigned)pos; + + Wire.beginTransmission(eeprom_device_address); + Wire.write(int(eeprom_address >> 8)); // MSB + Wire.write(int(eeprom_address & 0xFF)); // LSB + Wire.endTransmission(); + Wire.requestFrom(eeprom_device_address, (byte)1); + return Wire.available() ? Wire.read() : 0xFF; +} + +#endif // USE_SHARED_EEPROM +#endif // I2C_EEPROM diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp new file mode 100644 index 00000000..a341fef9 --- /dev/null +++ b/Marlin/src/HAL/shared/eeprom_if_spi.cpp @@ -0,0 +1,87 @@ +/** + * 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 SPI EEPROM. + * Enable USE_SHARED_EEPROM if not supplied by the framework. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SPI_EEPROM) + +#include "eeprom_if.h" + +void eeprom_init() {} + +#if ENABLED(USE_SHARED_EEPROM) + +#define CMD_WREN 6 // WREN +#define CMD_READ 2 // WRITE +#define CMD_WRITE 2 // WRITE + +#ifndef EEPROM_WRITE_DELAY + #define EEPROM_WRITE_DELAY 7 +#endif + +uint8_t eeprom_read_byte(uint8_t* pos) { + uint8_t v; + uint8_t eeprom_temp[3]; + + // set read location + // begin transmission from device + eeprom_temp[0] = CMD_READ; + eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; // addr High + eeprom_temp[2] = (unsigned)pos& 0xFF; // addr Low + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + v = spiRec(SPI_CHAN_EEPROM1); + WRITE(SPI_EEPROM1_CS, HIGH); + return v; +} + +void eeprom_write_byte(uint8_t* pos, uint8_t value) { + uint8_t eeprom_temp[3]; + + /*write enable*/ + eeprom_temp[0] = CMD_WREN; + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(1); + + /*write addr*/ + eeprom_temp[0] = CMD_WRITE; + eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; //addr High + eeprom_temp[2] = (unsigned)pos & 0xFF; //addr Low + WRITE(SPI_EEPROM1_CS, LOW); + spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + + spiSend(SPI_CHAN_EEPROM1, value); + WRITE(SPI_EEPROM1_CS, HIGH); + delay(EEPROM_WRITE_DELAY); // wait for page write to complete +} + +#endif // USE_SHARED_EEPROM +#endif // I2C_EEPROM diff --git a/Marlin/src/HAL/shared/esp_wifi.cpp b/Marlin/src/HAL/shared/esp_wifi.cpp new file mode 100644 index 00000000..a55f5ca3 --- /dev/null +++ b/Marlin/src/HAL/shared/esp_wifi.cpp @@ -0,0 +1,43 @@ +/** + * 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 "Delay.h" + +void esp_wifi_init(void) { // init ESP01 WIFI module pins + #if PIN_EXISTS(ESP_WIFI_MODULE_GPIO0) + OUT_WRITE(ESP_WIFI_MODULE_GPIO0_PIN, HIGH); + #endif + #if PIN_EXISTS(ESP_WIFI_MODULE_GPIO2) + OUT_WRITE(ESP_WIFI_MODULE_GPIO2_PIN, HIGH); + #endif + #if PIN_EXISTS(ESP_WIFI_MODULE_RESET) + delay(1); // power up delay (0.1mS minimum) + OUT_WRITE(ESP_WIFI_MODULE_RESET_PIN, LOW); + delay(1); + OUT_WRITE(ESP_WIFI_MODULE_RESET_PIN, HIGH); + #endif + #if PIN_EXISTS(ESP_WIFI_MODULE_ENABLE) + delay(1); // delay after reset released (0.1mS minimum) + OUT_WRITE(ESP_WIFI_MODULE_ENABLE_PIN, HIGH); + #endif +} diff --git a/Marlin/src/HAL/shared/esp_wifi.h b/Marlin/src/HAL/shared/esp_wifi.h new file mode 100644 index 00000000..84a50a94 --- /dev/null +++ b/Marlin/src/HAL/shared/esp_wifi.h @@ -0,0 +1,24 @@ +/** + * 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 + +void esp_wifi_init(); diff --git a/Marlin/src/HAL/shared/math_32bit.h b/Marlin/src/HAL/shared/math_32bit.h new file mode 100644 index 00000000..87e9e640 --- /dev/null +++ b/Marlin/src/HAL/shared/math_32bit.h @@ -0,0 +1,31 @@ +/** + * 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 "../../core/macros.h" + +/** + * Math helper functions for 32 bit CPUs + */ +static FORCE_INLINE uint32_t MultiU32X24toH32(uint32_t longIn1, uint32_t longIn2) { + return ((uint64_t)longIn1 * longIn2 + 0x00800000) >> 24; +} diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp new file mode 100644 index 00000000..cfec6f30 --- /dev/null +++ b/Marlin/src/HAL/shared/servo.cpp @@ -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 . + * + */ + +/** + * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. All right reserved. + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin) - Attach a servo motor to an i/o pin. + * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds + * Default min is 544, max is 2400 + * + * write() - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) + * writeMicroseconds() - Set the servo pulse width in microseconds. + * move(pin, angle) - Sequence of attach(pin), write(angle), safe_delay(servo_delay[servoIndex]). + * With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after servo_delay[servoIndex]. + * read() - Get the last-written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Get the last-written servo pulse width in microseconds. + * attached() - Return true if a servo is attached. + * detach() - Stop an attached servo from pulsing its i/o pin. + */ + +#include "../../inc/MarlinConfig.h" + +#if SHARED_SERVOS + +#include "servo.h" +#include "servo_private.h" + +ServoInfo_t servo_info[MAX_SERVOS]; // static array of servo info structures +uint8_t ServoCount = 0; // the total number of attached servos + +#define SERVO_MIN(v) (MIN_PULSE_WIDTH - (v) * 4) // minimum value in uS for this servo +#define SERVO_MAX(v) (MAX_PULSE_WIDTH - (v) * 4) // maximum value in uS for this servo + +/************ static functions common to all instances ***********************/ + +static boolean isTimerActive(timer16_Sequence_t timer) { + // returns true if any servo is active on this timer + LOOP_L_N(channel, SERVOS_PER_TIMER) { + if (SERVO(timer, channel).Pin.isActive) + return true; + } + return false; +} + +/****************** end of static functions ******************************/ + +Servo::Servo() { + if (ServoCount < MAX_SERVOS) { + servoIndex = ServoCount++; // assign a servo index to this instance + servo_info[servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH); // store default values - 12 Aug 2009 + } + else + servoIndex = INVALID_SERVO; // too many servos +} + +int8_t Servo::attach(const int inPin) { + return attach(inPin, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH); +} + +int8_t Servo::attach(const int inPin, const int inMin, const int inMax) { + + if (servoIndex >= MAX_SERVOS) return -1; + + if (inPin > 0) servo_info[servoIndex].Pin.nbr = inPin; + pinMode(servo_info[servoIndex].Pin.nbr, OUTPUT); // set servo pin to output + + // TODO: min/max check: ABS(min - MIN_PULSE_WIDTH) / 4 < 128 + min = (MIN_PULSE_WIDTH - inMin) / 4; //resolution of min/max is 4 uS + max = (MAX_PULSE_WIDTH - inMax) / 4; + + // initialize the timer if it has not already been initialized + timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); + if (!isTimerActive(timer)) initISR(timer); + servo_info[servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive + + return servoIndex; +} + +void Servo::detach() { + servo_info[servoIndex].Pin.isActive = false; + timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); + if (!isTimerActive(timer)) finISR(timer); +} + +void Servo::write(int value) { + if (value < MIN_PULSE_WIDTH) // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds) + value = map(constrain(value, 0, 180), 0, 180, SERVO_MIN(min), SERVO_MAX(max)); + writeMicroseconds(value); +} + +void Servo::writeMicroseconds(int value) { + // calculate and store the values for the given channel + byte channel = servoIndex; + if (channel < MAX_SERVOS) { // ensure channel is valid + // ensure pulse width is valid + value = constrain(value, SERVO_MIN(min), SERVO_MAX(max)) - (TRIM_DURATION); + value = usToTicks(value); // convert to ticks after compensating for interrupt overhead - 12 Aug 2009 + + CRITICAL_SECTION_START(); + servo_info[channel].ticks = value; + CRITICAL_SECTION_END(); + } +} + +// return the value as degrees +int Servo::read() { return map(readMicroseconds() + 1, SERVO_MIN(min), SERVO_MAX(max), 0, 180); } + +int Servo::readMicroseconds() { + return (servoIndex == INVALID_SERVO) ? 0 : ticksToUs(servo_info[servoIndex].ticks) + (TRIM_DURATION); +} + +bool Servo::attached() { return servo_info[servoIndex].Pin.isActive; } + +void Servo::move(const int value) { + constexpr uint16_t servo_delay[] = SERVO_DELAY; + static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + if (attach(0) >= 0) { + write(value); + safe_delay(servo_delay[servoIndex]); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +#endif // SHARED_SERVOS diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h new file mode 100644 index 00000000..6d850da8 --- /dev/null +++ b/Marlin/src/HAL/shared/servo.h @@ -0,0 +1,117 @@ +/** + * 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 + +/** + * servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. 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 + */ + +/** + * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. + * The servos are pulsed in the background using the value most recently written using the write() method + * + * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. + * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. + * The sequence used to seize timers is defined in timers.h + * + * The methods are: + * + * Servo - Class for manipulating servo motors connected to Arduino pins. + * + * attach(pin ) - Attaches a servo motor to an i/o pin. + * attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds + * default min is 544, max is 2400 + * + * write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds) + * writeMicroseconds() - Sets the servo pulse width in microseconds + * read() - Gets the last written servo pulse width as an angle between 0 and 180. + * readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release) + * attached() - Returns true if there is a servo attached. + * detach() - Stops an attached servos from pulsing its i/o pin. + * move(angle) - Sequence of attach(0), write(angle), + * With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY and detach. + */ + +#if IS_TEENSY32 + #include "../TEENSY31_32/Servo.h" +#elif IS_TEENSY35 || IS_TEENSY36 + #include "../TEENSY35_36/Servo.h" +#elif IS_TEENSY40 || IS_TEENSY41 + #include "../TEENSY40_41/Servo.h" +#elif defined(TARGET_LPC1768) + #include "../LPC1768/Servo.h" +#elif defined(__STM32F1__) || defined(TARGET_STM32F1) + #include "../STM32F1/Servo.h" +#elif defined(STM32GENERIC) && defined(STM32F4) + #include "../STM32_F4_F7/Servo.h" +#elif defined(ARDUINO_ARCH_STM32) + #include "../STM32/Servo.h" +#elif defined(ARDUINO_ARCH_ESP32) + #include "../ESP32/Servo.h" +#else + #include + + #if defined(__AVR__) || defined(ARDUINO_ARCH_SAM) || defined(__SAMD51__) + // we're good to go + #else + #error "This library only supports boards with an AVR, SAM3X or SAMD51 processor." + #endif + + #define Servo_VERSION 2 // software version of this library + + class Servo { + public: + Servo(); + int8_t attach(const int pin); // attach the given pin to the next free channel, set pinMode, return channel number (-1 on fail) + int8_t attach(const int pin, const int min, const int max); // as above but also sets min and max values for writes. + void detach(); + void write(int value); // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + void writeMicroseconds(int value); // write pulse width in microseconds + void move(const int value); // attach the servo, then move to value + // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds + // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach + int read(); // returns current pulse width as an angle between 0 and 180 degrees + int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) + bool attached(); // return true if this servo is attached, otherwise false + + private: + uint8_t servoIndex; // index into the channel data for this servo + int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH + int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH + }; + +#endif diff --git a/Marlin/src/HAL/shared/servo_private.h b/Marlin/src/HAL/shared/servo_private.h new file mode 100644 index 00000000..d85d8da8 --- /dev/null +++ b/Marlin/src/HAL/shared/servo_private.h @@ -0,0 +1,98 @@ +/** + * 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 + +/** + * servo_private.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 + * Copyright (c) 2009 Michael Margolis. 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 + */ + +#include + +// Architecture specific include +#ifdef __AVR__ + #include "../AVR/ServoTimers.h" +#elif defined(ARDUINO_ARCH_SAM) + #include "../DUE/ServoTimers.h" +#elif defined(__SAMD51__) + #include "../SAMD51/ServoTimers.h" +#else + #error "This library only supports boards with an AVR, SAM3X or SAMD51 processor." +#endif + +// Macros + +#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo +#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo +#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached +#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds + +#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer +#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER) + +#define INVALID_SERVO 255 // flag indicating an invalid servo index + +// Convert microseconds to ticks and back (PRESCALER depends on architecture) +#define usToTicks(_us) (clockCyclesPerMicrosecond() * (_us) / (SERVO_TIMER_PRESCALER)) +#define ticksToUs(_ticks) (unsigned(_ticks) * (SERVO_TIMER_PRESCALER) / clockCyclesPerMicrosecond()) + +// convenience macros +#define SERVO_INDEX_TO_TIMER(_servo_nbr) ((timer16_Sequence_t)(_servo_nbr / (SERVOS_PER_TIMER))) // returns the timer controlling this servo +#define SERVO_INDEX_TO_CHANNEL(_servo_nbr) (_servo_nbr % (SERVOS_PER_TIMER)) // returns the index of the servo on this timer +#define SERVO_INDEX(_timer,_channel) ((_timer*(SERVOS_PER_TIMER)) + _channel) // macro to access servo index by timer and channel +#define SERVO(_timer,_channel) (servo_info[SERVO_INDEX(_timer,_channel)]) // macro to access servo class by timer and channel + +// Types + +typedef struct { + uint8_t nbr : 7 ; // a pin number from 0 to 127 + uint8_t isActive : 1 ; // true if this channel is enabled, pin not pulsed if false +} ServoPin_t; + +typedef struct { + ServoPin_t Pin; + unsigned int ticks; +} ServoInfo_t; + +// Global variables + +extern uint8_t ServoCount; +extern ServoInfo_t servo_info[MAX_SERVOS]; + +// Public functions + +extern void initISR(timer16_Sequence_t timer); +extern void finISR(timer16_Sequence_t timer); diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp new file mode 100644 index 00000000..3a20cf3e --- /dev/null +++ b/Marlin/src/MarlinCore.cpp @@ -0,0 +1,1326 @@ +/** + * 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 . + * + */ + +/** + * About Marlin + * + * This firmware is a mashup between Sprinter and grbl. + * - https://github.com/kliment/Sprinter + * - https://github.com/grbl/grbl + */ + +#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" + +#ifdef ARDUINO + #include +#endif +#include + +#include "core/utility.h" +#include "module/motion.h" +#include "module/planner.h" +#include "module/endstops.h" +#include "module/temperature.h" +#include "module/settings.h" +#include "module/printcounter.h" // PrintCounter or Stopwatch + +#include "module/stepper.h" +#include "module/stepper/indirection.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/touch_buttons.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" + #include "lcd/extui/lib/mks_ui/mks_hardware_test.h" + #include +#endif + +#if ENABLED(DWIN_CREALITY_LCD) + #include "lcd/dwin/e3v2/dwin.h" + #include "lcd/dwin/dwin_lcd.h" + #include "lcd/dwin/e3v2/rotary_encoder.h" +#endif + +#if ENABLED(IIC_BL24CXX_EEPROM) + #include "libs/BL24CXX.h" +#endif + +#if ENABLED(DIRECT_STEPPING) + #include "feature/direct_stepping.h" +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "feature/host_actions.h" +#endif + +#if USE_BEEPER + #include "libs/buzzer.h" +#endif + +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + #include "feature/closedloop.h" +#endif + +#if HAS_MOTOR_CURRENT_I2C + #include "feature/digipot/digipot.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "feature/mixing.h" +#endif + +#if ENABLED(MAX7219_DEBUG) + #include "feature/max7219.h" +#endif + +#if HAS_COLOR_LEDS + #include "feature/leds/leds.h" +#endif + +#if ENABLED(BLTOUCH) + #include "feature/bltouch.h" +#endif + +#if ENABLED(POLL_JOG) + #include "feature/joystick.h" +#endif + +#if HAS_SERVOS + #include "module/servo.h" +#endif + +#if ENABLED(HAS_MOTOR_CURRENT_DAC) + #include "feature/dac/stepper_dac.h" +#endif + +#if ENABLED(EXPERIMENTAL_I2CBUS) + #include "feature/twibus.h" + TWIBus i2c; +#endif + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "feature/encoder_i2c.h" +#endif + +#if HAS_TRINAMIC_CONFIG && DISABLED(PSU_DEFAULT_OFF) + #include "feature/tmc_util.h" +#endif + +#if HAS_CUTTER + #include "feature/spindle_laser.h" +#endif + +#if ENABLED(SDSUPPORT) + CardReader card; +#endif + +#if ENABLED(G38_PROBE_TARGET) + uint8_t G38_move; // = 0 + bool G38_did_trigger; // = false +#endif + +#if ENABLED(DELTA) + #include "module/delta.h" +#elif IS_SCARA + #include "module/scara.h" +#endif + +#if HAS_LEVELING + #include "feature/bedlevel/bedlevel.h" +#endif + +#if BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) + #include "feature/pause.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "feature/powerloss.h" +#endif + +#if ENABLED(CANCEL_OBJECTS) + #include "feature/cancel_object.h" +#endif + +#if HAS_FILAMENT_SENSOR + #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 + +#if ENABLED(TEMP_STAT_LEDS) + #include "feature/leds/tempstat.h" +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) + #include "feature/caselight.h" +#endif + +#if HAS_FANMUX + #include "feature/fanmux.h" +#endif + +#if DO_SWITCH_EXTRUDER || ANY(SWITCHING_NOZZLE, PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER, ELECTROMAGNETIC_SWITCHING_TOOLHEAD, SWITCHING_TOOLHEAD) + #include "module/tool_change.h" +#endif + +#if ENABLED(USE_CONTROLLER_FAN) + #include "feature/controllerfan.h" +#endif + +#if ENABLED(PRUSA_MMU2) + #include "feature/mmu2/mmu2.h" +#endif + +#if HAS_L64XX + #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"); +PGMSTR(M21_STR, "M21"); +PGMSTR(M23_STR, "M23 %s"); +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:"); + +MarlinState marlin_state = MF_INITIALIZING; + +// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop +bool wait_for_heatup = true; + +// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop +#if HAS_RESUME_CONTINUE + bool wait_for_user; // = false; + + void wait_for_user_response(millis_t ms/*=0*/, const bool no_sleep/*=false*/) { + TERN(ADVANCED_PAUSE_FEATURE,,UNUSED(no_sleep)); + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = true; + if (ms) ms += millis(); // expire time + while (wait_for_user && !(ms && ELAPSED(millis(), ms))) + idle(TERN_(ADVANCED_PAUSE_FEATURE, no_sleep)); + wait_for_user = false; + } + +#endif + +#if PIN_EXISTS(CHDK) + extern millis_t chdk_timeout; +#endif + +#if ENABLED(I2C_POSITION_ENCODERS) + I2CPositionEncodersMgr I2CPEM; +#endif + +/** + * *************************************************************************** + * ******************************** FUNCTIONS ******************************** + * *************************************************************************** + */ + +void setup_killpin() { + #if HAS_KILL + #if KILL_PIN_STATE + SET_INPUT_PULLDOWN(KILL_PIN); + #else + SET_INPUT_PULLUP(KILL_PIN); + #endif + #endif +} + +void setup_powerhold() { + #if HAS_SUICIDE + OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); + #endif + #if ENABLED(PSU_CONTROL) + powersupply_on = ENABLED(PSU_DEFAULT_OFF); + if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); + #endif +} + +/** + * Stepper Reset (RigidBoard, et.al.) + */ +#if HAS_STEPPER_RESET + void disableStepperDrivers() { OUT_WRITE(STEPPER_RESET_PIN, LOW); } // Drive down to keep motor driver chips in reset + void enableStepperDrivers() { SET_INPUT(STEPPER_RESET_PIN); } // Set to input, allowing pullups to pull the pin high +#endif + +#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + + void i2c_on_receive(int bytes) { // just echo all bytes received to serial + i2c.receive(bytes); + } + + void i2c_on_request() { // just send dummy data for now + i2c.reply("Hello World!\n"); + } + +#endif + +/** + * Sensitive pin test for M42, M226 + */ + +#include "pins/sensitive_pins.h" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wnarrowing" + +bool pin_is_protected(const pin_t pin) { + static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS; + LOOP_L_N(i, COUNT(sensitive_pins)) { + pin_t sensitive_pin; + memcpy_P(&sensitive_pin, &sensitive_pins[i], sizeof(pin_t)); + if (pin == sensitive_pin) return true; + } + return false; +} + +#pragma GCC diagnostic pop + +void protected_pin_err() { + SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN); +} + +void quickstop_stepper() { + planner.quick_stop(); + planner.synchronize(); + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); +} + +void enable_e_steppers() { + #define _ENA_E(N) ENABLE_AXIS_E##N(); + REPEAT(E_STEPPERS, _ENA_E) +} + +void enable_all_steppers() { + TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); + ENABLE_AXIS_X(); + ENABLE_AXIS_Y(); + ENABLE_AXIS_Z(); + enable_e_steppers(); +} + +void disable_e_steppers() { + #define _DIS_E(N) DISABLE_AXIS_E##N(); + REPEAT(E_STEPPERS, _DIS_E) +} + +void disable_e_stepper(const uint8_t e) { + #define _CASE_DIS_E(N) case N: DISABLE_AXIS_E##N(); break; + switch (e) { + REPEAT(EXTRUDERS, _CASE_DIS_E) + } +} + +void disable_all_steppers() { + DISABLE_AXIS_X(); + DISABLE_AXIS_Y(); + DISABLE_AXIS_Z(); + disable_e_steppers(); +} + +#if ENABLED(G29_RETRY_AND_RECOVER) + + void event_probe_failure() { + #ifdef ACTION_ON_G29_FAILURE + host_action(PSTR(ACTION_ON_G29_FAILURE)); + #endif + #ifdef G29_FAILURE_COMMANDS + gcode.process_subcommands_now_P(PSTR(G29_FAILURE_COMMANDS)); + #endif + #if ENABLED(G29_HALT_ON_FAILURE) + #ifdef ACTION_ON_CANCEL + host_action_cancel(); + #endif + kill(GET_TEXT(MSG_LCD_PROBING_FAILED)); + #endif + } + + void event_probe_recover() { + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, PSTR("G29 Retrying"), DISMISS_STR)); + #ifdef ACTION_ON_G29_RECOVER + host_action(PSTR(ACTION_ON_G29_RECOVER)); + #endif + #ifdef G29_RECOVER_COMMANDS + gcode.process_subcommands_now_P(PSTR(G29_RECOVER_COMMANDS)); + #endif + } + +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "feature/pause.h" +#else + 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 + */ +bool printingIsActive() { + return !did_pause_print && (print_job_timer.isRunning() || IS_SD_PRINTING()); +} + +/** + * Printing is paused according to SD or host indicators + */ +bool printingIsPaused() { + return did_pause_print || print_job_timer.isPaused() || IS_SD_PAUSED(); +} + +void startOrResumeJob() { + if (!printingIsPaused()) { + TERN_(CANCEL_OBJECTS, cancelable.reset()); + TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator = 0); + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + ui.reset_remaining_time(); + #endif + } + print_job_timer.start(); +} + +#if ENABLED(SDSUPPORT) + + inline void abortSDPrinting() { + card.endFilePrint(TERN_(SD_RESORT, true)); + queue.clear(); + quickstop_stepper(); + print_job_timer.stop(); + #if DISABLED(SD_ABORT_NO_COOLDOWN) + thermalManager.disable_all_heaters(); + #endif + #if !HAS_CUTTER + thermalManager.zero_fan_speeds(); + #else + cutter.kill(); // Full cutter shutdown including ISR control + #endif + wait_for_heatup = false; + TERN_(POWER_LOSS_RECOVERY, recovery.purge()); + #ifdef EVENT_GCODE_SD_ABORT + queue.inject_P(PSTR(EVENT_GCODE_SD_ABORT)); + #endif + + TERN_(PASSWORD_AFTER_SD_PRINT_ABORT, password.lock_machine()); + } + + inline void finishSDPrinting() { + if (queue.enqueue_one_P(PSTR("M1001"))) { + marlin_state = MF_RUNNING; + TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); + } + } + +#endif // SDSUPPORT + +/** + * Minimal management of Marlin's core activities: + * - Keep the command buffer full + * - Check for maximum inactive time between commands + * - Check for maximum inactive time between stepper commands + * - Check if CHDK_PIN needs to go LOW + * - Check for KILL button held down + * - Check for HOME button held down + * - Check if cooling fan needs to be switched on + * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) + * - Pulse FET_SAFETY_PIN if it exists + */ +inline void manage_inactivity(const bool ignore_stepper_queue=false) { + + if (queue.length < BUFSIZE) queue.get_available_commands(); + + const millis_t ms = millis(); + + // Prevent steppers timing-out in the middle of M600 + // 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); + + // 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(); + SERIAL_ECHOLNPAIR(STR_KILL_INACTIVE_TIME, parser.command_ptr); + 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 (!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(); + + TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled()); + } + } + else + already_shutdown_steppers = false; + } + + #if PIN_EXISTS(CHDK) // Check if pin should be set to LOW (after M240 set it HIGH) + if (chdk_timeout && ELAPSED(ms, chdk_timeout)) { + chdk_timeout = 0; + WRITE(CHDK_PIN, LOW); + } + #endif + + #if HAS_KILL + + // Check if the kill button was pressed and wait just in case it was an accidental + // key kill key press + // ------------------------------------------------------------------------------- + static int killCount = 0; // make the inactivity button a bit less responsive + const int KILL_DELAY = 750; + if (kill_state()) + killCount++; + else if (killCount > 0) + killCount--; + + // Exceeded threshold and we can confirm that it was not accidental + // KILL the machine + // ---------------------------------------------------------------- + if (killCount >= KILL_DELAY) { + SERIAL_ERROR_MSG(STR_KILL_BUTTON); + kill(); + } + #endif + + #if HAS_HOME + // Handle a standalone HOME button + constexpr millis_t HOME_DEBOUNCE_DELAY = 1000UL; + static millis_t next_home_key_ms; // = 0 + if (!IS_SD_PRINTING() && !READ(HOME_PIN)) { // HOME_PIN goes LOW when pressed + const millis_t ms = millis(); + if (ELAPSED(ms, next_home_key_ms)) { + next_home_key_ms = ms + HOME_DEBOUNCE_DELAY; + LCD_MESSAGEPGM(MSG_AUTO_HOME); + queue.enqueue_now_P(G28_STR); + } + } + #endif + + TERN_(USE_CONTROLLER_FAN, controllerFan.update()); // Check if fan should be turned on to cool stepper drivers down + + TERN_(AUTO_POWER_CONTROL, powerManager.check()); + + TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); + + #if ENABLED(EXTRUDER_RUNOUT_PREVENT) + if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP + && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) + && !planner.has_blocks_queued() + ) { + #if ENABLED(SWITCHING_EXTRUDER) + bool oldstatus; + switch (active_extruder) { + default: oldstatus = E0_ENABLE_READ(); ENABLE_AXIS_E0(); break; + #if E_STEPPERS > 1 + case 2: case 3: oldstatus = E1_ENABLE_READ(); ENABLE_AXIS_E1(); break; + #if E_STEPPERS > 2 + case 4: case 5: oldstatus = E2_ENABLE_READ(); ENABLE_AXIS_E2(); break; + #if E_STEPPERS > 3 + case 6: case 7: oldstatus = E3_ENABLE_READ(); ENABLE_AXIS_E3(); break; + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #else // !SWITCHING_EXTRUDER + bool oldstatus; + switch (active_extruder) { + default: + #define _CASE_EN(N) case N: oldstatus = E##N##_ENABLE_READ(); ENABLE_AXIS_E##N(); break; + REPEAT(E_STEPPERS, _CASE_EN); + } + #endif + + const float olde = current_position.e; + current_position.e += EXTRUDER_RUNOUT_EXTRUDE; + line_to_current_position(MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED)); + current_position.e = olde; + planner.set_e_position_mm(olde); + planner.synchronize(); + + #if ENABLED(SWITCHING_EXTRUDER) + switch (active_extruder) { + default: oldstatus = E0_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 1 + case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break; + #if E_STEPPERS > 2 + case 4: case 5: oldstatus = E2_ENABLE_WRITE(oldstatus); break; + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + } + #else // !SWITCHING_EXTRUDER + switch (active_extruder) { + #define _CASE_RESTORE(N) case N: E##N##_ENABLE_WRITE(oldstatus); break; + REPEAT(E_STEPPERS, _CASE_RESTORE); + } + #endif // !SWITCHING_EXTRUDER + + gcode.reset_stepper_timeout(ms); + } + #endif // EXTRUDER_RUNOUT_PREVENT + + #if ENABLED(DUAL_X_CARRIAGE) + // handle delayed move timeout + if (delayed_move_time && ELAPSED(ms, delayed_move_time + 1000UL) && IsRunning()) { + // travel moves have been received so enact them + delayed_move_time = 0xFFFFFFFFUL; // force moves to be done + destination = current_position; + prepare_line_to_destination(); + } + #endif + + TERN_(TEMP_STAT_LEDS, handle_status_leds()); + + TERN_(MONITOR_DRIVER_STATUS, monitor_tmc_drivers()); + + TERN_(MONITOR_L6470_DRIVER_STATUS, L64xxManager.monitor_driver()); + + // Limit check_axes_activity frequency to 10Hz + static millis_t next_check_axes_ms = 0; + if (ELAPSED(ms, next_check_axes_ms)) { + planner.check_axes_activity(); + next_check_axes_ms = ms + 100UL; + } + + #if PIN_EXISTS(FET_SAFETY) + static millis_t FET_next; + if (ELAPSED(ms, FET_next)) { + FET_next = ms + FET_SAFETY_DELAY; // 2µs pulse every FET_SAFETY_DELAY mS + OUT_WRITE(FET_SAFETY_PIN, !FET_SAFETY_INVERTED); + DELAY_US(2); + WRITE(FET_SAFETY_PIN, FET_SAFETY_INVERTED); + } + #endif +} + +/** + * Standard idle routine keeps the machine alive: + * - Core Marlin activities + * - Manage heaters (and Watchdog) + * - Max7219 heartbeat, animation, etc. + * + * Only after setup() is complete: + * - Handle filament runout sensors + * - Run HAL idle tasks + * - Handle Power-Loss Recovery + * - Run StallGuard endstop checks + * - Handle SD Card insert / remove + * - Handle USB Flash Drive insert / remove + * - Announce Host Keepalive state (if any) + * - Update the Print Job Timer state + * - Update the Beeper queue + * - Read Buttons and Update the LCD + * - Run i2c Position Encoders + * - Auto-report Temperatures / SD Status + * - Update the Průša MMU2 + * - Handle Joystick jogging + */ +void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) { + + // Core Marlin activities + manage_inactivity(TERN_(ADVANCED_PAUSE_FEATURE, no_stepper_sleep)); + + // Manage Heaters (and Watchdog) + thermalManager.manage_heater(); + + // Max7219 heartbeat, animation, etc + TERN_(MAX7219_DEBUG, max7219.idle_tasks()); + + // Return if setup() isn't completed + if (marlin_state == MF_INITIALIZING) return; + + // Handle filament runout sensors + TERN_(HAS_FILAMENT_SENSOR, runout.run()); + + // Run HAL idle tasks + #ifdef HAL_IDLETASK + HAL_idletask(); + #endif + + // Handle Power-Loss Recovery + #if ENABLED(POWER_LOSS_RECOVERY) && PIN_EXISTS(POWER_LOSS) + if (printJobOngoing()) recovery.outage(); + #endif + + // Run StallGuard endstop checks + #if ENABLED(SPI_ENDSTOPS) + if (endstops.tmc_spi_homing.any + && TERN1(IMPROVE_HOMING_RELIABILITY, ELAPSED(millis(), sg_guard_period)) + ) LOOP_L_N(i, 4) // Read SGT 4 times per idle loop + if (endstops.tmc_spi_homing_check()) break; + #endif + + // Handle SD Card insert / remove + TERN_(SDSUPPORT, card.manage_media()); + + // Handle USB Flash Drive insert / remove + TERN_(USB_FLASH_DRIVE_SUPPORT, Sd2Card::idle()); + + // Announce Host Keepalive state (if any) + TERN_(HOST_KEEPALIVE_FEATURE, gcode.host_keepalive()); + + // Update the Print Job Timer state + TERN_(PRINTCOUNTER, print_job_timer.tick()); + + // Update the Beeper queue + TERN_(USE_BEEPER, buzzer.tick()); + + // Handle UI input / draw events + TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + + // Run i2c Position Encoders + #if ENABLED(I2C_POSITION_ENCODERS) + static millis_t i2cpem_next_update_ms; + if (planner.has_blocks_queued()) { + const millis_t ms = millis(); + if (ELAPSED(ms, i2cpem_next_update_ms)) { + I2CPEM.update(); + i2cpem_next_update_ms = ms + I2CPE_MIN_UPD_TIME_MS; + } + } + #endif + + // Auto-report Temperatures / SD Status + #if HAS_AUTO_REPORTING + if (!gcode.autoreport_paused) { + TERN_(AUTO_REPORT_TEMPERATURES, thermalManager.auto_report_temperatures()); + TERN_(AUTO_REPORT_SD_STATUS, card.auto_report_sd_status()); + } + #endif + + // Update the Průša MMU2 + TERN_(PRUSA_MMU2, mmu2.mmu_loop()); + + // Handle Joystick jogging + TERN_(POLL_JOG, joystick.inject_jog_moves()); + + // Direct Stepping + TERN_(DIRECT_STEPPING, page_manager.write_responses()); + + #if HAS_TFT_LVGL_UI + LV_TASK_HANDLER(); + #endif +} + +/** + * Kill all activity and lock the machine. + * After this the machine will need to be reset. + */ +void kill(PGM_P const lcd_error/*=nullptr*/, PGM_P const lcd_component/*=nullptr*/, const bool steppers_off/*=false*/) { + thermalManager.disable_all_heaters(); + + TERN_(HAS_CUTTER, cutter.kill()); // Full cutter shutdown including ISR control + + SERIAL_ERROR_MSG(STR_ERR_KILLED); + + #if HAS_DISPLAY + ui.kill_screen(lcd_error ?: GET_TEXT(MSG_KILLED), lcd_component ?: NUL_STR); + #else + UNUSED(lcd_error); + UNUSED(lcd_component); + #endif + + #if HAS_TFT_LVGL_UI + lv_draw_error_message(lcd_error); + #endif + + #ifdef ACTION_ON_KILL + host_action_kill(); + #endif + + minkill(steppers_off); +} + +void minkill(const bool steppers_off/*=false*/) { + + // Wait a short time (allows messages to get out before shutting down. + for (int i = 1000; i--;) DELAY_US(600); + + cli(); // Stop interrupts + + // Wait to ensure all interrupts stopped + for (int i = 1000; i--;) DELAY_US(250); + + // Reiterate heaters off + thermalManager.disable_all_heaters(); + + TERN_(HAS_CUTTER, cutter.kill()); // Reiterate cutter shutdown + + // Power off all steppers (for M112) or just the E steppers + steppers_off ? disable_all_steppers() : disable_e_steppers(); + + TERN_(PSU_CONTROL, PSU_OFF()); + + TERN_(HAS_SUICIDE, suicide()); + + #if HAS_KILL + + // Wait for kill to be released + while (kill_state()) watchdog_refresh(); + + // Wait for kill to be pressed + while (!kill_state()) watchdog_refresh(); + + void (*resetFunc)() = 0; // Declare resetFunc() at address 0 + resetFunc(); // Jump to address 0 + + #else + + for (;;) watchdog_refresh(); // Wait for reset + + #endif +} + +/** + * Turn off heaters and stop the print in progress + * After a stop the machine may be resumed with M999 + */ +void stop() { + thermalManager.disable_all_heaters(); // 'unpause' taken care of in here + print_job_timer.stop(); + + #if ENABLED(PROBING_FANS_OFF) + if (thermalManager.fans_paused) thermalManager.set_fans_paused(false); // put things back the way they were + #endif + + if (IsRunning()) { + SERIAL_ERROR_MSG(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + safe_delay(350); // allow enough time for messages to get out before stopping + marlin_state = MF_STOPPED; + } +} + +inline void tmc_standby_setup() { + #if PIN_EXISTS(X_STDBY) + SET_INPUT_PULLDOWN(X_STDBY_PIN); + #endif + #if PIN_EXISTS(X2_STDBY) + SET_INPUT_PULLDOWN(X2_STDBY_PIN); + #endif + #if PIN_EXISTS(Y_STDBY) + SET_INPUT_PULLDOWN(Y_STDBY_PIN); + #endif + #if PIN_EXISTS(Y2_STDBY) + SET_INPUT_PULLDOWN(Y2_STDBY_PIN); + #endif + #if PIN_EXISTS(Z_STDBY) + SET_INPUT_PULLDOWN(Z_STDBY_PIN); + #endif + #if PIN_EXISTS(Z2_STDBY) + SET_INPUT_PULLDOWN(Z2_STDBY_PIN); + #endif + #if PIN_EXISTS(Z3_STDBY) + SET_INPUT_PULLDOWN(Z3_STDBY_PIN); + #endif + #if PIN_EXISTS(Z4_STDBY) + SET_INPUT_PULLDOWN(Z4_STDBY_PIN); + #endif + #if PIN_EXISTS(E0_STDBY) + SET_INPUT_PULLDOWN(E0_STDBY_PIN); + #endif + #if PIN_EXISTS(E1_STDBY) + SET_INPUT_PULLDOWN(E1_STDBY_PIN); + #endif + #if PIN_EXISTS(E2_STDBY) + SET_INPUT_PULLDOWN(E2_STDBY_PIN); + #endif + #if PIN_EXISTS(E3_STDBY) + SET_INPUT_PULLDOWN(E3_STDBY_PIN); + #endif + #if PIN_EXISTS(E4_STDBY) + SET_INPUT_PULLDOWN(E4_STDBY_PIN); + #endif + #if PIN_EXISTS(E5_STDBY) + SET_INPUT_PULLDOWN(E5_STDBY_PIN); + #endif + #if PIN_EXISTS(E6_STDBY) + SET_INPUT_PULLDOWN(E6_STDBY_PIN); + #endif + #if PIN_EXISTS(E7_STDBY) + SET_INPUT_PULLDOWN(E7_STDBY_PIN); + #endif +} + +/** + * Marlin entry-point: Set up before the program loop + * - Set up the kill pin, filament runout, power hold + * - Start the serial port + * - Print startup messages and diagnostics + * - Get EEPROM or default settings + * - Initialize managers for: + * • temperature + * • planner + * • watchdog + * • stepper + * • photo pin + * • servos + * • LCD controller + * • Digipot I2C + * • Z probe sled + * • status LEDs + * • Max7219 + */ +void setup() { + + tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable + + #if ENABLED(MARLIN_DEV_MODE) + auto log_current_ms = [&](PGM_P const msg) { + SERIAL_ECHO_START(); + SERIAL_CHAR('['); SERIAL_ECHO(millis()); SERIAL_ECHOPGM("] "); + serialprintPGM(msg); + SERIAL_EOL(); + }; + #define SETUP_LOG(M) log_current_ms(PSTR(M)) + #else + #define SETUP_LOG(...) NOOP + #endif + #define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0) + + #if EITHER(DISABLE_DEBUG, DISABLE_JTAG) + // Disable any hardware debug to free up pins for IO + #if ENABLED(DISABLE_DEBUG) && defined(JTAGSWD_DISABLE) + JTAGSWD_DISABLE(); + #elif defined(JTAG_DISABLE) + JTAG_DISABLE(); + #else + #error "DISABLE_(DEBUG|JTAG) is not supported for the selected MCU/Board." + #endif + #endif + + MYSERIAL0.begin(BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL0 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #if HAS_MULTI_SERIAL + MYSERIAL1.begin(BAUDRATE); + serial_connect_timeout = millis() + 1000UL; + while (!MYSERIAL1 && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #endif + SERIAL_ECHO_MSG("start"); + + #if BOTH(HAS_TFT_LVGL_UI, USE_WIFI_FUNCTION) + mks_esp_wifi_init(); + WIFISERIAL.begin(WIFI_BAUDRATE); + serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + #endif + + SETUP_RUN(HAL_init()); + + #if HAS_L64XX + SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers + #endif + + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Put Smart Effector into NORMAL mode + #endif + + #if HAS_FILAMENT_SENSOR + SETUP_RUN(runout.setup()); + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + SETUP_RUN(recovery.setup()); + #endif + + SETUP_RUN(setup_killpin()); + + #if HAS_TMC220x + SETUP_RUN(tmc_serial_begin()); + #endif + + SETUP_RUN(setup_powerhold()); + + #if HAS_STEPPER_RESET + SETUP_RUN(disableStepperDrivers()); + #endif + + #if HAS_TMC_SPI + #if DISABLED(TMC_USE_SW_SPI) + SETUP_RUN(SPI.begin()); + #endif + SETUP_RUN(tmc_init_cs_pins()); + #endif + + #ifdef BOARD_INIT + SETUP_LOG("BOARD_INIT"); + BOARD_INIT(); + #endif + + SETUP_RUN(esp_wifi_init()); + + // Check startup - does nothing if bootloader sets MCUSR to 0 + const byte mcu = HAL_get_reset_source(); + 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)); + SERIAL_CHAR(' '); + SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); + SERIAL_EOL(); + #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) + SERIAL_ECHO_MSG( + " Last Updated: " STRING_DISTRIBUTION_DATE + " | Author: " STRING_CONFIG_H_AUTHOR + ); + #endif + SERIAL_ECHO_MSG("Compiled: " __DATE__); + SERIAL_ECHO_MSG(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); + + // Init buzzer pin(s) + #if USE_BEEPER + SETUP_RUN(buzzer.init()); + #endif + + // Set up LEDs early + #if HAS_COLOR_LEDS + 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 + + // UI must be initialized before EEPROM + // (because EEPROM code calls the UI). + + #if ENABLED(DWIN_CREALITY_LCD) + delay(800); // Required delay (since boot?) + SERIAL_ECHOPGM("\nDWIN handshake "); + if (DWIN_Handshake()) SERIAL_ECHOLNPGM("ok."); else SERIAL_ECHOLNPGM("error."); + DWIN_Frame_SetDir(1); // Orientation 90° + DWIN_UpdateLCD(); // Show bootscreen (first image) + #else + SETUP_RUN(ui.init()); + #if HAS_WIRED_LCD && ENABLED(SHOW_BOOTSCREEN) + SETUP_RUN(ui.show_bootscreen()); + #endif + SETUP_RUN(ui.reset_status()); // Load welcome message early. (Retained if no errors exist.) + #endif + + #if BOTH(SDSUPPORT, SDCARD_EEPROM_EMULATION) + SETUP_RUN(card.mount()); // Mount media with settings before first_load + #endif + + SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) + // This also updates variables in the planner, elsewhere + + #if HAS_TOUCH_XPT2046 + SETUP_RUN(touch.init()); + #endif + + TERN_(HAS_M206_COMMAND, current_position += home_offset); // Init current position based on home_offset + + sync_plan_position(); // Vital to init stepper/planner equivalent for current_position + + SETUP_RUN(thermalManager.init()); // Initialize temperature loop + + SETUP_RUN(print_job_timer.init()); // Initial setup of print job timer + + SETUP_RUN(endstops.init()); // Init endstops and pullups + + SETUP_RUN(stepper.init()); // Init stepper. This enables interrupts! + + #if HAS_SERVOS + SETUP_RUN(servo_init()); + #endif + + #if HAS_Z_SERVO_PROBE + SETUP_RUN(probe.servo_probe_init()); + #endif + + #if HAS_PHOTOGRAPH + OUT_WRITE(PHOTOGRAPH_PIN, LOW); + #endif + + #if HAS_CUTTER + SETUP_RUN(cutter.init()); + #endif + + #if ENABLED(COOLANT_MIST) + OUT_WRITE(COOLANT_MIST_PIN, COOLANT_MIST_INVERT); // Init Mist Coolant OFF + #endif + #if ENABLED(COOLANT_FLOOD) + OUT_WRITE(COOLANT_FLOOD_PIN, COOLANT_FLOOD_INVERT); // Init Flood Coolant OFF + #endif + + #if HAS_BED_PROBE + SETUP_RUN(endstops.enable_z_probe(false)); + #endif + + #if HAS_STEPPER_RESET + SETUP_RUN(enableStepperDrivers()); + #endif + + #if HAS_MOTOR_CURRENT_I2C + SETUP_RUN(digipot_i2c.init()); + #endif + + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + SETUP_RUN(stepper_dac.init()); + #endif + + #if EITHER(Z_PROBE_SLED, SOLENOID_PROBE) && HAS_SOLENOID_1 + OUT_WRITE(SOL1_PIN, LOW); // OFF + #endif + + #if HAS_HOME + SET_INPUT_PULLUP(HOME_PIN); + #endif + + #if PIN_EXISTS(STAT_LED_RED) + OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF + #endif + + #if PIN_EXISTS(STAT_LED_BLUE) + OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF + #endif + + #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(caselight.update_brightness()); + #endif + + #if ENABLED(MK2_MULTIPLEXER) + SETUP_LOG("MK2_MULTIPLEXER"); + SET_OUTPUT(E_MUX0_PIN); + SET_OUTPUT(E_MUX1_PIN); + SET_OUTPUT(E_MUX2_PIN); + #endif + + #if HAS_FANMUX + SETUP_RUN(fanmux_init()); + #endif + + #if ENABLED(MIXING_EXTRUDER) + SETUP_RUN(mixer.init()); + #endif + + #if ENABLED(BLTOUCH) + SETUP_RUN(bltouch.init(/*set_voltage=*/true)); + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + SETUP_RUN(I2CPEM.init()); + #endif + + #if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + SETUP_LOG("i2c..."); + i2c.onReceive(i2c_on_receive); + i2c.onRequest(i2c_on_request); + #endif + + #if DO_SWITCH_EXTRUDER + SETUP_RUN(move_extruder_servo(0)); // Initialize extruder servo + #endif + + #if ENABLED(SWITCHING_NOZZLE) + SETUP_LOG("SWITCHING_NOZZLE"); + // Initialize nozzle servo(s) + #if SWITCHING_NOZZLE_TWO_SERVOS + lower_nozzle(0); + raise_nozzle(1); + #else + move_nozzle_servo(0); + #endif + #endif + + #if ENABLED(MAGNETIC_PARKING_EXTRUDER) + SETUP_RUN(mpe_settings_init()); + #endif + + #if ENABLED(PARKING_EXTRUDER) + SETUP_RUN(pe_solenoid_init()); + #endif + + #if ENABLED(SWITCHING_TOOLHEAD) + SETUP_RUN(swt_init()); + #endif + + #if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + SETUP_RUN(est_init()); + #endif + + #if ENABLED(USE_WATCHDOG) + SETUP_RUN(watchdog_init()); // Reinit watchdog after HAL_get_reset_source call + #endif + + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + SETUP_RUN(closedloop.init()); + #endif + + #ifdef STARTUP_COMMANDS + SETUP_LOG("STARTUP_COMMANDS"); + queue.inject_P(PSTR(STARTUP_COMMANDS)); + #endif + + #if ENABLED(HOST_PROMPT_SUPPORT) + SETUP_RUN(host_action_prompt_end()); + #endif + + #if HAS_TRINAMIC_CONFIG && DISABLED(PSU_DEFAULT_OFF) + SETUP_RUN(test_tmc_connection(true, true, true, true)); + #endif + + #if ENABLED(PRUSA_MMU2) + SETUP_RUN(mmu2.init()); + #endif + + #if ENABLED(IIC_BL24CXX_EEPROM) + BL24CXX::init(); + const uint8_t err = BL24CXX::check(); + SERIAL_ECHO_TERNARY(err, "BL24CXX Check ", "failed", "succeeded", "!\n"); + #endif + + #if ENABLED(DWIN_CREALITY_LCD) + Encoder_Configuration(); + HMI_Init(); + HMI_StartFrame(true); + #endif + + #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) + ui.reset_status(true); // Show service messages or keep current status + #endif + + #if ENABLED(MAX7219_DEBUG) + SETUP_RUN(max7219.init()); + #endif + + #if ENABLED(DIRECT_STEPPING) + SETUP_RUN(page_manager.init()); + #endif + + #if HAS_TFT_LVGL_UI + #if ENABLED(SDSUPPORT) + if (!card.isMounted()) SETUP_RUN(card.mount()); // Mount SD to load graphics and fonts + #endif + 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."); +} + +/** + * The main Marlin program loop + * + * - Call idle() to handle all tasks between G-code commands + * Note that no G-codes from the queue can be executed during idle() + * but many G-codes can be called directly anytime like macros. + * - Check whether SD card auto-start is needed now. + * - Check whether SD print finishing is needed now. + * - Run one G-code command from the immediate or main command queue + * and open up one space. Commands in the main queue may come from sd + * card, host, or by direct injection. The queue will continue to fill + * as long as idle() or manage_inactivity() are being called. + */ +void loop() { + do { + idle(); + + #if ENABLED(SDSUPPORT) + card.checkautostart(); + if (card.flag.abort_sd_printing) abortSDPrinting(); + if (marlin_state == MF_SD_COMPLETE) finishSDPrinting(); + #endif + + queue.advance(); + + endstops.event_handler(); + + TERN_(HAS_TFT_LVGL_UI, printer_state_polling()); + + } while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards +} diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h new file mode 100644 index 00000000..69afc7f3 --- /dev/null +++ b/Marlin/src/MarlinCore.h @@ -0,0 +1,125 @@ +/** + * 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" + +#ifdef DEBUG_GCODE_PARSER + #include "gcode/parser.h" +#endif + +#include +#include +#include + +void stop(); + +// Pass true to keep steppers from timing out +void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep=false)); +inline void idle_no_sleep() { idle(TERN_(ADVANCED_PAUSE_FEATURE, true)); } + +#if ENABLED(EXPERIMENTAL_I2CBUS) + #include "feature/twibus.h" + extern TWIBus i2c; +#endif + +#if ENABLED(G38_PROBE_TARGET) + extern uint8_t G38_move; // Flag to tell the ISR that G38 is in progress, and the type + extern bool G38_did_trigger; // Flag from the ISR to indicate the endstop changed +#endif + +/** + * The axis order in all axis related arrays is X, Y, Z, E + */ +void enable_e_steppers(); +void enable_all_steppers(); +void disable_e_stepper(const uint8_t e); +void disable_e_steppers(); +void disable_all_steppers(); + +void kill(PGM_P const lcd_error=nullptr, PGM_P const lcd_component=nullptr, const bool steppers_off=false); +void minkill(const bool steppers_off=false); + +void quickstop_stepper(); + +// Global State of the firmware +enum MarlinState : uint8_t { + MF_INITIALIZING = 0, + MF_RUNNING = _BV(0), + MF_PAUSED = _BV(1), + MF_WAITING = _BV(2), + MF_STOPPED = _BV(3), + MF_SD_COMPLETE = _BV(4), + MF_KILLED = _BV(7) +}; + +extern MarlinState marlin_state; +inline bool IsRunning() { return marlin_state == MF_RUNNING; } +inline bool IsStopped() { return marlin_state != MF_RUNNING; } + +bool printingIsActive(); +bool printingIsPaused(); +void startOrResumeJob(); + +extern bool wait_for_heatup; + +#if HAS_RESUME_CONTINUE + extern bool wait_for_user; + void wait_for_user_response(millis_t ms=0, const bool no_sleep=false); +#endif + +#if ENABLED(PSU_CONTROL) + extern bool powersupply_on; + #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() + #else + #define PSU_ON() PSU_PIN_ON() + #define PSU_OFF() PSU_PIN_OFF() + #endif +#endif + +bool pin_is_protected(const pin_t pin); +void protected_pin_err(); + +#if HAS_SUICIDE + inline void suicide() { OUT_WRITE(SUICIDE_PIN, SUICIDE_PIN_INVERTING); } +#endif + +#if HAS_KILL + #ifndef KILL_PIN_STATE + #define KILL_PIN_STATE LOW + #endif + inline bool kill_state() { return READ(KILL_PIN) == KILL_PIN_STATE; } +#endif + +#if ENABLED(G29_RETRY_AND_RECOVER) + void event_probe_recover(); + void event_probe_failure(); +#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/core/boards.h b/Marlin/src/core/boards.h new file mode 100644 index 00000000..1b99abe3 --- /dev/null +++ b/Marlin/src/core/boards.h @@ -0,0 +1,399 @@ +/** + * 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 "macros.h" + +#define BOARD_UNKNOWN -1 + +// +// RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 +// + +#define BOARD_RAMPS_OLD 1000 // MEGA/RAMPS up to 1.2 + +#define BOARD_RAMPS_13_EFB 1010 // RAMPS 1.3 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_13_EEB 1011 // RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_13_EFF 1012 // RAMPS 1.3 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_13_EEF 1013 // RAMPS 1.3 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_13_SF 1014 // RAMPS 1.3 (Power outputs: Spindle, Controller Fan) + +#define BOARD_RAMPS_14_EFB 1020 // RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_14_EEB 1021 // RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_14_EFF 1022 // RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_14_EEF 1023 // RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_14_SF 1024 // RAMPS 1.4 (Power outputs: Spindle, Controller Fan) + +#define BOARD_RAMPS_PLUS_EFB 1030 // RAMPS Plus 3DYMY (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_PLUS_EEB 1031 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_PLUS_EFF 1032 // RAMPS Plus 3DYMY (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_PLUS_EEF 1033 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_PLUS_SF 1034 // RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) + +// +// RAMPS Derivatives - ATmega1280, ATmega2560 +// + +#define BOARD_3DRAG 1100 // 3Drag Controller +#define BOARD_K8200 1101 // Velleman K8200 Controller (derived from 3Drag Controller) +#define BOARD_K8400 1102 // Velleman K8400 Controller (derived from 3Drag Controller) +#define BOARD_K8600 1103 // Velleman K8600 Controller (Vertex Nano) +#define BOARD_K8800 1104 // Velleman K8800 Controller (Vertex Delta) +#define BOARD_BAM_DICE 1105 // 2PrintBeta BAM&DICE with STK drivers +#define BOARD_BAM_DICE_DUE 1106 // 2PrintBeta BAM&DICE Due with STK drivers +#define BOARD_MKS_BASE 1107 // MKS BASE v1.0 +#define BOARD_MKS_BASE_14 1108 // MKS BASE v1.4 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_15 1109 // MKS BASE v1.5 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_16 1110 // MKS BASE v1.6 with Allegro A4982 stepper drivers +#define BOARD_MKS_BASE_HEROIC 1111 // MKS BASE 1.0 with Heroic HR4982 stepper drivers +#define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4 +#define BOARD_MKS_GEN_L 1113 // MKS GEN L +#define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 +#define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica) +#define BOARD_FELIX2 1116 // Felix 2.0+ Electronics Board (RAMPS like) +#define BOARD_RIGIDBOARD 1117 // Invent-A-Part RigidBoard +#define BOARD_RIGIDBOARD_V2 1118 // Invent-A-Part RigidBoard V2 +#define BOARD_SAINSMART_2IN1 1119 // Sainsmart 2-in-1 board +#define BOARD_ULTIMAKER 1120 // Ultimaker +#define BOARD_ULTIMAKER_OLD 1121 // Ultimaker (Older electronics. Pre 1.5.4. This is rare) +#define BOARD_AZTEEG_X3 1122 // Azteeg X3 +#define BOARD_AZTEEG_X3_PRO 1123 // Azteeg X3 Pro +#define BOARD_ULTIMAIN_2 1124 // Ultimainboard 2.x (Uses TEMP_SENSOR 20) +#define BOARD_RUMBA 1125 // Rumba +#define BOARD_RUMBA_RAISE3D 1126 // Raise3D N series Rumba derivative +#define BOARD_RL200 1127 // Rapide Lite 200 (v1, low-cost RUMBA clone with drv) +#define BOARD_FORMBOT_TREX2PLUS 1128 // Formbot T-Rex 2 Plus +#define BOARD_FORMBOT_TREX3 1129 // Formbot T-Rex 3 +#define BOARD_FORMBOT_RAPTOR 1130 // Formbot Raptor +#define BOARD_FORMBOT_RAPTOR2 1131 // Formbot Raptor 2 +#define BOARD_BQ_ZUM_MEGA_3D 1132 // bq ZUM Mega 3D +#define BOARD_MAKEBOARD_MINI 1133 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake +#define BOARD_TRIGORILLA_13 1134 // TriGorilla Anycubic version 1.3-based on RAMPS EFB +#define BOARD_TRIGORILLA_14 1135 // ... Ver 1.4 +#define BOARD_TRIGORILLA_14_11 1136 // ... Rev 1.1 (new servo pin order) +#define BOARD_RAMPS_ENDER_4 1137 // Creality: Ender-4, CR-8 +#define BOARD_RAMPS_CREALITY 1138 // Creality: CR10S, CR20, CR-X +#define BOARD_RAMPS_DAGOMA 1139 // Dagoma F5 +#define BOARD_FYSETC_F6_13 1140 // FYSETC F6 1.3 +#define BOARD_FYSETC_F6_14 1141 // FYSETC F6 1.4 +#define BOARD_DUPLICATOR_I3_PLUS 1142 // Wanhao Duplicator i3 Plus +#define BOARD_VORON 1143 // VORON Design +#define BOARD_TRONXY_V3_1_0 1144 // Tronxy TRONXY-V3-1.0 +#define BOARD_Z_BOLT_X_SERIES 1145 // Z-Bolt X Series +#define BOARD_TT_OSCAR 1146 // TT OSCAR +#define BOARD_OVERLORD 1147 // Overlord/Overlord Pro +#define BOARD_HJC2560C_REV1 1148 // ADIMLab Gantry v1 +#define BOARD_HJC2560C_REV2 1149 // ADIMLab Gantry v2 +#define BOARD_TANGO 1150 // BIQU Tango V1 +#define BOARD_MKS_GEN_L_V2 1151 // MKS GEN L V2 +#define BOARD_MKS_GEN_L_V21 1152 // MKS GEN L V2.1 +#define BOARD_COPYMASTER_3D 1153 // Copymaster 3D +#define BOARD_ORTUR_4 1154 // Ortur 4 +#define BOARD_TENLOG_D3_HERO 1155 // Tenlog D3 Hero IDEX printer + +// +// RAMBo and derivatives +// + +#define BOARD_RAMBO 1200 // Rambo +#define BOARD_MINIRAMBO 1201 // Mini-Rambo +#define BOARD_MINIRAMBO_10A 1202 // Mini-Rambo 1.0a +#define BOARD_EINSY_RAMBO 1203 // Einsy Rambo +#define BOARD_EINSY_RETRO 1204 // Einsy Retro +#define BOARD_SCOOVO_X9H 1205 // abee Scoovo X9H + +// +// Other ATmega1280, ATmega2560 +// + +#define BOARD_CNCONTROLS_11 1300 // Cartesio CN Controls V11 +#define BOARD_CNCONTROLS_12 1301 // Cartesio CN Controls V12 +#define BOARD_CNCONTROLS_15 1302 // Cartesio CN Controls V15 +#define BOARD_CHEAPTRONIC 1303 // Cheaptronic v1.0 +#define BOARD_CHEAPTRONIC_V2 1304 // Cheaptronic v2.0 +#define BOARD_MIGHTYBOARD_REVE 1305 // Makerbot Mightyboard Revision E +#define BOARD_MEGATRONICS 1306 // Megatronics +#define BOARD_MEGATRONICS_2 1307 // Megatronics v2.0 +#define BOARD_MEGATRONICS_3 1308 // Megatronics v3.0 +#define BOARD_MEGATRONICS_31 1309 // Megatronics v3.1 +#define BOARD_MEGATRONICS_32 1310 // Megatronics v3.2 +#define BOARD_ELEFU_3 1311 // Elefu Ra Board (v3) +#define BOARD_LEAPFROG 1312 // Leapfrog +#define BOARD_MEGACONTROLLER 1313 // Mega controller +#define BOARD_GT2560_REV_A 1314 // Geeetech GT2560 Rev. A +#define BOARD_GT2560_REV_A_PLUS 1315 // Geeetech GT2560 Rev. A+ (with auto level probe) +#define BOARD_GT2560_V3 1316 // Geeetech GT2560 Rev B for A10(M/D) +#define BOARD_GT2560_V3_MC2 1317 // Geeetech GT2560 Rev B for Mecreator2 +#define BOARD_GT2560_V3_A20 1318 // Geeetech GT2560 Rev B for A20(M/D) +#define BOARD_EINSTART_S 1319 // Einstart retrofit +#define BOARD_WANHAO_ONEPLUS 1320 // Wanhao 0ne+ i3 Mini +#define BOARD_LEAPFROG_XEED2015 1321 // Leapfrog Xeed 2015 +#define BOARD_PICA_REVB 1322 // PICA Shield (original version) +#define BOARD_PICA 1323 // PICA Shield (rev C or later) +#define BOARD_INTAMSYS40 1324 // Intamsys 4.0 (Funmat HT) + +// +// ATmega1281, ATmega2561 +// + +#define BOARD_MINITRONICS 1400 // Minitronics v1.0/1.1 +#define BOARD_SILVER_GATE 1401 // Silvergate v1.0 + +// +// Sanguinololu and Derivatives - ATmega644P, ATmega1284P +// + +#define BOARD_SANGUINOLOLU_11 1500 // Sanguinololu < 1.2 +#define BOARD_SANGUINOLOLU_12 1501 // Sanguinololu 1.2 and above +#define BOARD_MELZI 1502 // Melzi +#define BOARD_MELZI_V2 1503 // Melzi V2 +#define BOARD_MELZI_MAKR3D 1504 // Melzi with ATmega1284 (MaKr3d version) +#define BOARD_MELZI_CREALITY 1505 // Melzi Creality3D board (for CR-10 etc) +#define BOARD_MELZI_MALYAN 1506 // Melzi Malyan M150 board +#define BOARD_MELZI_TRONXY 1507 // Tronxy X5S +#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 +// + +#define BOARD_GEN3_MONOLITHIC 1600 // Gen3 Monolithic Electronics +#define BOARD_GEN3_PLUS 1601 // Gen3+ +#define BOARD_GEN6 1602 // Gen6 +#define BOARD_GEN6_DELUXE 1603 // Gen6 deluxe +#define BOARD_GEN7_CUSTOM 1604 // Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics" +#define BOARD_GEN7_12 1605 // Gen7 v1.1, v1.2 +#define BOARD_GEN7_13 1606 // Gen7 v1.3 +#define BOARD_GEN7_14 1607 // Gen7 v1.4 +#define BOARD_OMCA_A 1608 // Alpha OMCA board +#define BOARD_OMCA 1609 // Final OMCA board +#define BOARD_SETHI 1610 // Sethi 3D_1 + +// +// Teensyduino - AT90USB1286, AT90USB1286P +// + +#define BOARD_TEENSYLU 1700 // Teensylu +#define BOARD_PRINTRBOARD 1701 // Printrboard (AT90USB1286) +#define BOARD_PRINTRBOARD_REVF 1702 // Printrboard Revision F (AT90USB1286) +#define BOARD_BRAINWAVE 1703 // Brainwave (AT90USB646) +#define BOARD_BRAINWAVE_PRO 1704 // Brainwave Pro (AT90USB1286) +#define BOARD_SAV_MKI 1705 // SAV Mk-I (AT90USB1286) +#define BOARD_TEENSY2 1706 // Teensy++2.0 (AT90USB1286) +#define BOARD_5DPRINT 1707 // 5DPrint D8 Driver Board + +// +// LPC1768 ARM Cortex M3 +// + +#define BOARD_RAMPS_14_RE_ARM_EFB 2000 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_14_RE_ARM_EEB 2001 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_14_RE_ARM_EFF 2002 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_14_RE_ARM_EEF 2003 // Re-ARM with RAMPS 1.4 (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_14_RE_ARM_SF 2004 // Re-ARM with RAMPS 1.4 (Power outputs: Spindle, Controller Fan) +#define BOARD_MKS_SBASE 2005 // MKS-Sbase (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_AZSMZ_MINI 2006 // AZSMZ Mini +#define BOARD_BIQU_BQ111_A4 2007 // BIQU BQ111-A4 (Power outputs: Hotend, Fan, Bed) +#define BOARD_SELENA_COMPACT 2008 // Selena Compact (Power outputs: Hotend0, Hotend1, Bed0, Bed1, Fan0, Fan1) +#define BOARD_BIQU_B300_V1_0 2009 // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver) +#define BOARD_MKS_SGEN_L 2010 // MKS-SGen-L (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_GMARSH_X6_REV1 2011 // GMARSH X6 board, revision 1 prototype +#define BOARD_BTT_SKR_V1_1 2012 // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_BTT_SKR_V1_3 2013 // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed) +#define BOARD_BTT_SKR_V1_4 2014 // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed) + +// +// LPC1769 ARM Cortex M3 +// + +#define BOARD_MKS_SGEN 2500 // MKS-SGen (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_AZTEEG_X5_GT 2501 // Azteeg X5 GT (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_AZTEEG_X5_MINI 2502 // Azteeg X5 Mini (Power outputs: Hotend0, Bed, Fan) +#define BOARD_AZTEEG_X5_MINI_WIFI 2503 // Azteeg X5 Mini Wifi (Power outputs: Hotend0, Bed, Fan) +#define BOARD_COHESION3D_REMIX 2504 // Cohesion3D ReMix +#define BOARD_COHESION3D_MINI 2505 // Cohesion3D Mini +#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) +#define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo (Power outputs: Hotend0, Hotend1, Bed, Fan0, Fan1) + +// +// SAM3X8E ARM Cortex M3 +// + +#define BOARD_DUE3DOM 3000 // DUE3DOM for Arduino DUE +#define BOARD_DUE3DOM_MINI 3001 // DUE3DOM MINI for Arduino DUE +#define BOARD_RADDS 3002 // RADDS +#define BOARD_RAMPS_FD_V1 3003 // RAMPS-FD v1 +#define BOARD_RAMPS_FD_V2 3004 // RAMPS-FD v2 +#define BOARD_RAMPS_SMART_EFB 3005 // RAMPS-SMART (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_SMART_EEB 3006 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_SMART_EFF 3007 // RAMPS-SMART (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_SMART_EEF 3008 // RAMPS-SMART (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_SMART_SF 3009 // RAMPS-SMART (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_DUO_EFB 3010 // RAMPS Duo (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_DUO_EEB 3011 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_DUO_EFF 3012 // RAMPS Duo (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_DUO_EEF 3013 // RAMPS Duo (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_DUO_SF 3014 // RAMPS Duo (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS4DUE_EFB 3015 // RAMPS4DUE (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS4DUE_EEB 3016 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS4DUE_EFF 3017 // RAMPS4DUE (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS4DUE_EEF 3018 // RAMPS4DUE (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS4DUE_SF 3019 // RAMPS4DUE (Power outputs: Spindle, Controller Fan) +#define BOARD_RURAMPS4D_11 3020 // RuRAMPS4Duo v1.1 (Power outputs: Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) +#define BOARD_RURAMPS4D_13 3021 // RuRAMPS4Duo v1.3 (Power outputs: Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) +#define BOARD_ULTRATRONICS_PRO 3022 // ReprapWorld Ultratronics Pro V1.0 +#define BOARD_ARCHIM1 3023 // UltiMachine Archim1 (with DRV8825 drivers) +#define BOARD_ARCHIM2 3024 // UltiMachine Archim2 (with TMC2130 drivers) +#define BOARD_ALLIGATOR 3025 // Alligator Board R2 +#define BOARD_CNCONTROLS_15D 3026 // Cartesio CN Controls V15 on DUE + +// +// SAM3X8C ARM Cortex M3 +// + +#define BOARD_PRINTRBOARD_G2 3100 // PRINTRBOARD G2 +#define BOARD_ADSK 3101 // Arduino DUE Shield Kit (ADSK) + +// +// STM32 ARM Cortex-M3 +// + +#define BOARD_MALYAN_M200_V2 4000 // STM32F070CB STM32F0 controller +#define BOARD_MALYAN_M300 4001 // STM32F070-based delta +#define BOARD_STM32F103RE 4002 // STM32F103RE Libmaple-based STM32F1 controller +#define BOARD_MALYAN_M200 4003 // STM32C8T6 Libmaple-based STM32F1 controller +#define BOARD_STM3R_MINI 4004 // STM32F103RE Libmaple-based STM32F1 controller +#define BOARD_GTM32_PRO_VB 4005 // STM32F103VET6 controller +#define BOARD_GTM32_MINI 4006 // STM32F103VET6 controller +#define BOARD_GTM32_MINI_A30 4007 // STM32F103VET6 controller +#define BOARD_GTM32_REV_B 4008 // STM32F103VET6 controller +#define BOARD_MORPHEUS 4009 // STM32F103C8 / STM32F103CB Libmaple-based STM32F1 controller +#define BOARD_CHITU3D 4010 // Chitu3D (STM32F103RET6) +#define BOARD_MKS_ROBIN 4011 // MKS Robin (STM32F103ZET6) +#define BOARD_MKS_ROBIN_MINI 4012 // MKS Robin Mini (STM32F103VET6) +#define BOARD_MKS_ROBIN_NANO 4013 // MKS Robin Nano (STM32F103VET6) +#define BOARD_MKS_ROBIN_NANO_V2 4014 // MKS Robin Nano V2 (STM32F103VET6) +#define BOARD_MKS_ROBIN_LITE 4015 // MKS Robin Lite/Lite2 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_LITE3 4016 // MKS Robin Lite3 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_PRO 4017 // MKS Robin Pro (STM32F103ZET6) +#define BOARD_MKS_ROBIN_E3 4018 // MKS Robin E3 (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3D 4019 // MKS Robin E3D (STM32F103RCT6) +#define BOARD_MKS_ROBIN_E3P 4020 // MKS Robin E3p (STM32F103VET6) +#define BOARD_BTT_SKR_MINI_V1_1 4021 // BigTreeTech SKR Mini v1.1 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_0 4022 // BigTreeTech SKR Mini E3 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V1_2 4023 // BigTreeTech SKR Mini E3 V1.2 (STM32F103RC) +#define BOARD_BTT_SKR_MINI_E3_V2_0 4024 // BigTreeTech SKR Mini E3 V2.0 (STM32F103RC) +#define BOARD_BTT_SKR_E3_DIP 4025 // BigTreeTech SKR E3 DIP V1.0 (STM32F103RC / STM32F103RE) +#define BOARD_JGAURORA_A5S_A1 4026 // JGAurora A5S A1 (STM32F103ZET6) +#define BOARD_FYSETC_AIO_II 4027 // FYSETC AIO_II +#define BOARD_FYSETC_CHEETAH 4028 // FYSETC Cheetah +#define BOARD_FYSETC_CHEETAH_V12 4029 // FYSETC Cheetah V1.2 +#define BOARD_LONGER3D_LK 4030 // Alfawise U20/U20+/U30 (Longer3D LK1/2) / STM32F103VET6 +#define BOARD_CCROBOT_MEEB_3DP 4031 // ccrobot-online.com MEEB_3DP (STM32F103RC) +#define BOARD_CHITU3D_V5 4032 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CHITU3D_V6 4033 // Chitu3D TronXY X5SA V5 Board +#define BOARD_CREALITY_V4 4034 // Creality v4.x (STM32F103RE) +#define BOARD_CREALITY_V427 4035 // Creality v4.2.7 (STM32F103RE) +#define BOARD_TRIGORILLA_PRO 4036 // Trigorilla Pro (STM32F103ZET6) +#define BOARD_FLY_MINI 4037 // FLY MINI (STM32F103RCT6) + +// +// ARM Cortex-M4F +// + +#define BOARD_TEENSY31_32 4100 // Teensy3.1 and Teensy3.2 +#define BOARD_TEENSY35_36 4101 // Teensy3.5 and Teensy3.6 + +// +// STM32 ARM Cortex-M4F +// + +#define BOARD_BEAST 4200 // STM32F4xxVxT6 Libmaple-based STM32F4 controller +#define BOARD_GENERIC_STM32F4 4201 // STM32 STM32GENERIC-based STM32F4 controller +#define BOARD_ARMED 4202 // Arm'ed STM32F4-based controller +#define BOARD_RUMBA32_V1_0 4203 // RUMBA32 STM32F446VET6 based controller from Aus3D +#define BOARD_RUMBA32_V1_1 4204 // RUMBA32 STM32F446VET6 based controller from Aus3D +#define BOARD_RUMBA32_MKS 4205 // RUMBA32 STM32F446VET6 based controller from Makerbase +#define BOARD_BLACK_STM32F407VE 4206 // BLACK_STM32F407VE +#define BOARD_BLACK_STM32F407ZE 4207 // BLACK_STM32F407ZE +#define BOARD_STEVAL_3DP001V1 4208 // STEVAL-3DP001V1 3D PRINTER BOARD +#define BOARD_BTT_SKR_PRO_V1_1 4209 // BigTreeTech SKR Pro v1.1 (STM32F407ZG) +#define BOARD_BTT_SKR_PRO_V1_2 4210 // BigTreeTech SKR Pro v1.2 (STM32F407ZG) +#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_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_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) +#define BOARD_ARTILLERY_RUBY 4221 // Artillery RUBY (STM32F401RCT6) + +// +// ARM Cortex M7 +// + +#define BOARD_THE_BORG 5000 // THE-BORG (Power outputs: Hotend0, Hotend1, Bed, Fan) +#define BOARD_REMRAM_V1 5001 // RemRam v1 +#define BOARD_TEENSY41 5002 // Teensy 4.1 +#define BOARD_T41U5XBB 5003 // T41U5XBB Teensy 4.1 breakout board +#define BOARD_NUCLEO_F767ZI 5004 // ST NUCLEO-F767ZI Dev Board + +// +// Espressif ESP32 WiFi +// + +#define BOARD_ESPRESSIF_ESP32 6000 // Generic ESP32 +#define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only) +#define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream) +#define BOARD_E4D_BOX 6003 // E4d@BOX + +// +// SAMD51 ARM Cortex M4 +// + +#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 +// + +#define BOARD_LINUX_RAMPS 9999 + +#define _MB_1(B) (defined(BOARD_##B) && MOTHERBOARD==BOARD_##B) +#define MB(V...) DO(MB,||,V) + +#define IS_MELZI MB(MELZI, MELZI_CREALITY, MELZI_MAKR3D, MELZI_MALYAN, MELZI_TRONXY, MELZI_V2) diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h new file mode 100644 index 00000000..6ae1b9d8 --- /dev/null +++ b/Marlin/src/core/debug_out.h @@ -0,0 +1,121 @@ +/** + * 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 . + * + */ + +// +// Serial aliases for debugging. +// Include this header after defining DEBUG_OUT +// (or not) in a given .cpp file +// + +#undef DEBUG_SECTION +#undef DEBUG_PRINT_P +#undef DEBUG_ECHO_START +#undef DEBUG_ERROR_START +#undef DEBUG_CHAR +#undef DEBUG_ECHO +#undef DEBUG_DECIMAL +#undef DEBUG_ECHO_F +#undef DEBUG_ECHOLN +#undef DEBUG_ECHOPGM +#undef DEBUG_ECHOLNPGM +#undef DEBUG_ECHOPAIR +#undef DEBUG_ECHOPAIR_P +#undef DEBUG_ECHOPAIR_F +#undef DEBUG_ECHOPAIR_F_P +#undef DEBUG_ECHOLNPAIR +#undef DEBUG_ECHOLNPAIR_P +#undef DEBUG_ECHOLNPAIR_F +#undef DEBUG_ECHOLNPAIR_F_P +#undef DEBUG_ECHO_MSG +#undef DEBUG_ERROR_MSG +#undef DEBUG_EOL +#undef DEBUG_FLUSH +#undef DEBUG_POS +#undef DEBUG_XYZ +#undef DEBUG_DELAY +#undef DEBUG_SYNCHRONIZE + +#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 + #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 + #define DEBUG_ECHOLNPGM SERIAL_ECHOLNPGM + #define DEBUG_ECHOPAIR SERIAL_ECHOPAIR + #define DEBUG_ECHOPAIR_P SERIAL_ECHOPAIR_P + #define DEBUG_ECHOPAIR_F SERIAL_ECHOPAIR_F + #define DEBUG_ECHOPAIR_F_P SERIAL_ECHOPAIR_F_P + #define DEBUG_ECHOLNPAIR SERIAL_ECHOLNPAIR + #define DEBUG_ECHOLNPAIR_P SERIAL_ECHOLNPAIR_P + #define DEBUG_ECHOLNPAIR_F SERIAL_ECHOLNPAIR_F + #define DEBUG_ECHOLNPAIR_F_P SERIAL_ECHOLNPAIR_F_P + #define DEBUG_ECHO_MSG SERIAL_ECHO_MSG + #define DEBUG_ERROR_MSG SERIAL_ERROR_MSG + #define DEBUG_EOL SERIAL_EOL + #define DEBUG_FLUSH SERIAL_FLUSH + #define DEBUG_POS SERIAL_POS + #define DEBUG_XYZ SERIAL_XYZ + #define DEBUG_DELAY(ms) serial_delay(ms) + #define DEBUG_SYNCHRONIZE() planner.synchronize() + +#else + + #define DEBUG_SECTION(...) NOOP + #define DEBUG_PRINT_P(P) NOOP + #define DEBUG_ECHO_START() NOOP + #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 + #define DEBUG_ECHOLNPGM(...) NOOP + #define DEBUG_ECHOPAIR(...) NOOP + #define DEBUG_ECHOPAIR_P(...) NOOP + #define DEBUG_ECHOPAIR_F(...) NOOP + #define DEBUG_ECHOPAIR_F_P(...) NOOP + #define DEBUG_ECHOLNPAIR(...) NOOP + #define DEBUG_ECHOLNPAIR_P(...) NOOP + #define DEBUG_ECHOLNPAIR_F(...) NOOP + #define DEBUG_ECHOLNPAIR_F_P(...) NOOP + #define DEBUG_ECHO_MSG(...) NOOP + #define DEBUG_ERROR_MSG(...) NOOP + #define DEBUG_EOL() NOOP + #define DEBUG_FLUSH() NOOP + #define DEBUG_POS(...) NOOP + #define DEBUG_XYZ(...) NOOP + #define DEBUG_DELAY(...) NOOP + #define DEBUG_SYNCHRONIZE() 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 00000000..7f39bc74 --- /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/core/drivers.h b/Marlin/src/core/drivers.h new file mode 100644 index 00000000..3a0e6209 --- /dev/null +++ b/Marlin/src/core/drivers.h @@ -0,0 +1,197 @@ +/** + * 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 + +// +// Included by MarlinConfigPre.h ahead of Configuration_adv.h. +// Don't use #if in this file for anything not defined early! +// + +#define _A4988 0x4988 +#define _A5984 0x5984 +#define _DRV8825 0x8825 +#define _LV8729 0x8729 +#define _L6470 0x6470 +#define _L6474 0x6474 +#define _L6480 0x6480 +#define _POWERSTEP01 0xF00D +#define _TB6560 0x6560 +#define _TB6600 0x6600 +#define _TMC2100 0x2100 +#define _TMC2130 0x2130A +#define _TMC2130_STANDALONE 0x2130B +#define _TMC2160 0x2160A +#define _TMC2160_STANDALONE 0x2160B +#define _TMC2208 0x2208A +#define _TMC2208_STANDALONE 0x2208B +#define _TMC2209 0x2209A +#define _TMC2209_STANDALONE 0x2209B +#define _TMC26X 0x2600A +#define _TMC26X_STANDALONE 0x2600B +#define _TMC2660 0x2660A +#define _TMC2660_STANDALONE 0x2660B +#define _TMC5130 0x5130A +#define _TMC5130_STANDALONE 0x5130B +#define _TMC5160 0x5160A +#define _TMC5160_STANDALONE 0x5160B + +#define _DRIVER_ID(V) _CAT(_, V) +#define _AXIS_DRIVER_TYPE(A,T) (_DRIVER_ID(A##_DRIVER_TYPE) == _DRIVER_ID(T)) + +#define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T) +#define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T) +#define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T) + +#define AXIS_DRIVER_TYPE_X2(T) (EITHER(X_DUAL_STEPPER_DRIVERS, DUAL_X_CARRIAGE) && _AXIS_DRIVER_TYPE(X2,T)) +#define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T)) +#define AXIS_DRIVER_TYPE_Z2(T) (NUM_Z_STEPPER_DRIVERS >= 2 && _AXIS_DRIVER_TYPE(Z2,T)) +#define AXIS_DRIVER_TYPE_Z3(T) (NUM_Z_STEPPER_DRIVERS >= 3 && _AXIS_DRIVER_TYPE(Z3,T)) +#define AXIS_DRIVER_TYPE_Z4(T) (NUM_Z_STEPPER_DRIVERS >= 4 && _AXIS_DRIVER_TYPE(Z4,T)) + +#define AXIS_DRIVER_TYPE_E(N,T) (E_STEPPERS > N && _AXIS_DRIVER_TYPE(E##N,T)) +#define AXIS_DRIVER_TYPE_E0(T) AXIS_DRIVER_TYPE_E(0,T) +#define AXIS_DRIVER_TYPE_E1(T) AXIS_DRIVER_TYPE_E(1,T) +#define AXIS_DRIVER_TYPE_E2(T) AXIS_DRIVER_TYPE_E(2,T) +#define AXIS_DRIVER_TYPE_E3(T) AXIS_DRIVER_TYPE_E(3,T) +#define AXIS_DRIVER_TYPE_E4(T) AXIS_DRIVER_TYPE_E(4,T) +#define AXIS_DRIVER_TYPE_E5(T) AXIS_DRIVER_TYPE_E(5,T) +#define AXIS_DRIVER_TYPE_E6(T) AXIS_DRIVER_TYPE_E(6,T) +#define AXIS_DRIVER_TYPE_E7(T) AXIS_DRIVER_TYPE_E(7,T) + +#define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T) + +#define _OR_ADTE(N,T) || AXIS_DRIVER_TYPE_E(N,T) +#define HAS_E_DRIVER(T) (0 RREPEAT2(E_STEPPERS, _OR_ADTE, T)) + +#define HAS_DRIVER(T) ( AXIS_DRIVER_TYPE_X(T) || AXIS_DRIVER_TYPE_Y(T) || AXIS_DRIVER_TYPE_Z(T) \ + || AXIS_DRIVER_TYPE_X2(T) || AXIS_DRIVER_TYPE_Y2(T) || AXIS_DRIVER_TYPE_Z2(T) \ + || AXIS_DRIVER_TYPE_Z3(T) || AXIS_DRIVER_TYPE_Z4(T) || HAS_E_DRIVER(T) ) + +// +// Trinamic Stepper Drivers +// + +// Test for supported TMC drivers that require advanced configuration +// Does not match standalone configurations +#if ( HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) \ + || HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) \ + || HAS_DRIVER(TMC2660) \ + || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) ) + #define HAS_TRINAMIC_CONFIG 1 +#endif + +#define HAS_TRINAMIC HAS_TRINAMIC_CONFIG + +#if ( HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \ + || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \ + || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \ + || HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) ) + #define HAS_TRINAMIC_STANDALONE 1 +#endif + +#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) + #define HAS_TMCX1X0 1 +#endif + +#if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) + #define HAS_TMC220x 1 +#endif + +#define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ + || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \ + || AXIS_DRIVER_TYPE(A,TMC2660) \ + || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) + +// Test for a driver that uses SPI - this allows checking whether a _CS_ pin +// is considered sensitive +#define AXIS_HAS_SPI(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ + || AXIS_DRIVER_TYPE(A,TMC2660) \ + || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) + +#define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) ) + +#define AXIS_HAS_RXTX AXIS_HAS_UART + +#define AXIS_HAS_HW_SERIAL(A) ( AXIS_HAS_UART(A) && defined(A##_HARDWARE_SERIAL) ) +#define AXIS_HAS_SW_SERIAL(A) ( AXIS_HAS_UART(A) && !defined(A##_HARDWARE_SERIAL) ) + +#define AXIS_HAS_STALLGUARD(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ + || AXIS_DRIVER_TYPE(A,TMC2209) \ + || AXIS_DRIVER_TYPE(A,TMC2660) \ + || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) + +#define AXIS_HAS_STEALTHCHOP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ + || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \ + || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) + +#define AXIS_HAS_SG_RESULT(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ + || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) ) + +#define AXIS_HAS_COOLSTEP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) \ + || AXIS_DRIVER_TYPE(A,TMC2209) \ + || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) + +#define _OR_EAH(N,T) || AXIS_HAS_##T(E##N) +#define E_AXIS_HAS(T) (0 _OR_EAH(0,T) _OR_EAH(1,T) _OR_EAH(2,T) _OR_EAH(3,T) _OR_EAH(4,T) _OR_EAH(5,T) _OR_EAH(6,T) _OR_EAH(7,T)) + +#define ANY_AXIS_HAS(T) ( AXIS_HAS_##T(X) || AXIS_HAS_##T(Y) || AXIS_HAS_##T(Z) \ + || AXIS_HAS_##T(X2) || AXIS_HAS_##T(Y2) || AXIS_HAS_##T(Z2) \ + || AXIS_HAS_##T(Z3) || AXIS_HAS_##T(Z4) || E_AXIS_HAS(T) ) + +#if ANY_AXIS_HAS(STEALTHCHOP) + #define HAS_STEALTHCHOP 1 +#endif +#if ANY_AXIS_HAS(STALLGUARD) + #define HAS_STALLGUARD 1 +#endif +#if ANY_AXIS_HAS(SG_RESULT) + #define HAS_SG_RESULT 1 +#endif +#if ANY_AXIS_HAS(COOLSTEP) + #define HAS_COOLSTEP 1 +#endif +#if ANY_AXIS_HAS(RXTX) + #define HAS_TMC_UART 1 +#endif +#if ANY_AXIS_HAS(SPI) + #define HAS_TMC_SPI 1 +#endif + +// +// TMC26XX Stepper Drivers +// +#if HAS_DRIVER(TMC26X) + #define HAS_TMC26X 1 +#endif + +// +// L64XX Stepper Drivers +// + +#if HAS_DRIVER(L6470) || HAS_DRIVER(L6474) || HAS_DRIVER(L6480) || HAS_DRIVER(POWERSTEP01) + #define HAS_L64XX 1 +#endif +#if HAS_L64XX && !HAS_DRIVER(L6474) + #define HAS_L64XX_NOT_L6474 1 +#endif + +#define AXIS_IS_L64XX(A) (AXIS_DRIVER_TYPE_##A(L6470) || AXIS_DRIVER_TYPE_##A(L6474) || AXIS_DRIVER_TYPE_##A(L6480) || AXIS_DRIVER_TYPE_##A(POWERSTEP01)) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h new file mode 100644 index 00000000..60d9aa6b --- /dev/null +++ b/Marlin/src/core/language.h @@ -0,0 +1,402 @@ +/** + * 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" + +#define _UxGT(a) a + +// Fallback if no language is set. DON'T CHANGE +#ifndef LCD_LANGUAGE + #define LCD_LANGUAGE en +#endif + +// For character-based LCD controllers (DISPLAY_CHARSET_HD44780) +#define JAPANESE 1 +#define WESTERN 2 +#define CYRILLIC 3 + +// NOTE: IF YOU CHANGE LANGUAGE FILES OR MERGE A FILE WITH CHANGES +// +// ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRA_LCD" / "SDSUPPORT" #define IN "Configuration.h" +// ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS +// See also https://marlinfw.org/docs/development/lcd_language.html + +// Languages +// an Aragonese +// bg Bulgarian +// ca Catalan +// cz Czech +// da Danish +// de German +// el Greek +// el_gr Greek (Greece) +// en English +// 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) + +#ifdef DEFAULT_SOURCE_CODE_URL + #undef SOURCE_CODE_URL + #define SOURCE_CODE_URL DEFAULT_SOURCE_CODE_URL +#endif + +#ifdef CUSTOM_MACHINE_NAME + #undef MACHINE_NAME + #define MACHINE_NAME CUSTOM_MACHINE_NAME +#elif defined(DEFAULT_MACHINE_NAME) + #undef MACHINE_NAME + #define MACHINE_NAME DEFAULT_MACHINE_NAME +#endif + +#ifndef MACHINE_UUID + #define MACHINE_UUID DEFAULT_MACHINE_UUID +#endif + +#define MARLIN_WEBSITE_URL "https://marlinfw.org" + +//#if !defined(STRING_SPLASH_LINE3) && defined(WEBSITE_URL) +// #define STRING_SPLASH_LINE3 WEBSITE_URL +//#endif + +// +// Common Serial Console Messages +// Don't change these strings because serial hosts look for them. +// + +#define STR_ENQUEUEING "enqueueing \"" +#define STR_POWERUP "PowerUp" +#define STR_EXTERNAL_RESET " External Reset" +#define STR_BROWNOUT_RESET " Brown out Reset" +#define STR_WATCHDOG_RESET " Watchdog Reset" +#define STR_SOFTWARE_RESET " Software Reset" +#define STR_FREE_MEMORY " Free Memory: " +#define STR_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define STR_OK "ok" +#define STR_WAIT "wait" +#define STR_STATS "Stats: " +#define STR_FILE_SAVED "Done saving file." +#define STR_ERR_LINE_NO "Line Number is not Last Line Number+1, Last Line: " +#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" +#define STR_INVALID_E_STEPPER "Invalid E stepper" +#define STR_E_STEPPER_NOT_SPECIFIED "E stepper not specified" +#define STR_INVALID_SOLENOID "Invalid solenoid" +#define STR_COUNT_X " Count X:" +#define STR_COUNT_A " Count A:" +#define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." +#define STR_ERR_KILLED "Printer halted. kill() called!" +#define STR_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define STR_BUSY_PROCESSING "busy: processing" +#define STR_BUSY_PAUSED_FOR_USER "busy: paused for user" +#define STR_BUSY_PAUSED_FOR_INPUT "busy: paused for input" +#define STR_Z_MOVE_COMP "Z_move_comp" +#define STR_RESEND "Resend: " +#define STR_UNKNOWN_COMMAND "Unknown command: \"" +#define STR_ACTIVE_EXTRUDER "Active Extruder: " +#define STR_X_MIN "x_min" +#define STR_X_MAX "x_max" +#define STR_X2_MIN "x2_min" +#define STR_X2_MAX "x2_max" +#define STR_Y_MIN "y_min" +#define STR_Y_MAX "y_max" +#define STR_Y2_MIN "y2_min" +#define STR_Y2_MAX "y2_max" +#define STR_Z_MIN "z_min" +#define STR_Z_MAX "z_max" +#define STR_Z2_MIN "z2_min" +#define STR_Z2_MAX "z2_max" +#define STR_Z3_MIN "z3_min" +#define STR_Z3_MAX "z3_max" +#define STR_Z4_MIN "z4_min" +#define STR_Z4_MAX "z4_max" +#define STR_Z_PROBE "z_probe" +#define STR_FILAMENT_RUNOUT_SENSOR "filament" +#define STR_PROBE_OFFSET "Probe Offset" +#define STR_SKEW_MIN "min_skew_factor: " +#define STR_SKEW_MAX "max_skew_factor: " +#define STR_ERR_MATERIAL_INDEX "M145 S out of range (0-1)" +#define STR_ERR_M421_PARAMETERS "M421 incorrect parameter usage" +#define STR_ERR_BAD_PLANE_MODE "G5 requires XY plane mode" +#define STR_ERR_MESH_XY "Mesh point out of range" +#define STR_ERR_ARC_ARGS "G2/G3 bad parameters" +#define STR_ERR_PROTECTED_PIN "Protected Pin" +#define STR_ERR_M420_FAILED "Failed to enable Bed Leveling" +#define STR_ERR_M428_TOO_FAR "Too far from reference point" +#define STR_ERR_M303_DISABLED "PIDTEMP disabled" +#define STR_M119_REPORT "Reporting endstop status" +#define STR_ON "ON" +#define STR_OFF "OFF" +#define STR_ENDSTOP_HIT "TRIGGERED" +#define STR_ENDSTOP_OPEN "open" +#define STR_HOTEND_OFFSET "Hotend offsets:" +#define STR_DUPLICATION_MODE "Duplication mode: " +#define STR_SOFT_ENDSTOPS "Soft endstops: " +#define STR_SOFT_MIN " Min: " +#define STR_SOFT_MAX " Max: " + +#define STR_SAVED_POS "Position saved" +#define STR_RESTORING_POS "Restoring position" +#define STR_INVALID_POS_SLOT "Invalid slot. Total: " + +#define STR_SD_CANT_OPEN_SUBDIR "Cannot open subdir " +#define STR_SD_INIT_FAIL "No SD card" +#define STR_SD_VOL_INIT_FAIL "volume.init failed" +#define STR_SD_OPENROOT_FAIL "openRoot failed" +#define STR_SD_CARD_OK "SD card ok" +#define STR_SD_WORKDIR_FAIL "workDir open failed" +#define STR_SD_OPEN_FILE_FAIL "open failed, File: " +#define STR_SD_FILE_OPENED "File opened: " +#define STR_SD_SIZE " Size: " +#define STR_SD_FILE_SELECTED "File selected" +#define STR_SD_WRITE_TO_FILE "Writing to file: " +#define STR_SD_PRINTING_BYTE "SD printing byte " +#define STR_SD_NOT_PRINTING "Not SD printing" +#define STR_SD_ERR_WRITE_TO_FILE "error writing to file" +#define STR_SD_ERR_READ "SD read error" +#define STR_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " + +#define STR_ENDSTOPS_HIT "endstops hit: " +#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_EEPROM_WRITE "Error writing to EEPROM!" + +#define STR_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle" +#define STR_FILAMENT_CHANGE_INSERT_LCD "Insert filament and press button" +#define STR_FILAMENT_CHANGE_WAIT_LCD "Press button to resume" +#define STR_FILAMENT_CHANGE_HEAT_M108 "Send M108 to heat nozzle" +#define STR_FILAMENT_CHANGE_INSERT_M108 "Insert filament and send M108" +#define STR_FILAMENT_CHANGE_WAIT_M108 "Send M108 to resume" + +#define STR_STOP_BLTOUCH "!! STOP called because of BLTouch error - restart with M999" +#define STR_STOP_UNHOMED "!! STOP called because of unhomed error - restart with M999" +#define STR_KILL_INACTIVE_TIME "!! KILL caused by too much inactive time - current command: " +#define STR_KILL_BUTTON "!! KILL caused by KILL button/pin" + +// temperature.cpp strings +#define STR_PID_AUTOTUNE_START "PID Autotune start" +#define STR_PID_BAD_EXTRUDER_NUM "PID Autotune failed! Bad extruder number" +#define STR_PID_TEMP_TOO_HIGH "PID Autotune failed! Temperature too high" +#define STR_PID_TIMEOUT "PID Autotune failed! timeout" +#define STR_BIAS " bias: " +#define STR_D_COLON " d: " +#define STR_T_MIN " min: " +#define STR_T_MAX " max: " +#define STR_KU " Ku: " +#define STR_TU " Tu: " +#define STR_CLASSIC_PID " Classic PID " +#define STR_KP " Kp: " +#define STR_KI " Ki: " +#define STR_KD " Kd: " +#define STR_PID_AUTOTUNE_FINISHED "PID Autotune finished! Put the last Kp, Ki and Kd constants from below into Configuration.h" +#define STR_PID_DEBUG " PID_DEBUG " +#define STR_PID_DEBUG_INPUT ": Input " +#define STR_PID_DEBUG_OUTPUT " Output " +#define STR_PID_DEBUG_PTERM " pTerm " +#define STR_PID_DEBUG_ITERM " iTerm " +#define STR_PID_DEBUG_DTERM " dTerm " +#define STR_PID_DEBUG_CTERM " cTerm " +#define STR_INVALID_EXTRUDER_NUM " - Invalid extruder number !" + +#define STR_HEATER_BED "bed" +#define STR_HEATER_CHAMBER "chamber" + +#define STR_STOPPED_HEATER ", system stopped! Heater_ID: " +#define STR_REDUNDANCY "Heater switched off. Temperature difference between temp sensors is too high !" +#define STR_T_HEATING_FAILED "Heating failed" +#define STR_T_THERMAL_RUNAWAY "Thermal Runaway" +#define STR_T_MAXTEMP "MAXTEMP triggered" +#define STR_T_MINTEMP "MINTEMP triggered" +#define STR_ERR_PROBING_FAILED "Probing Failed" +#define STR_ZPROBE_OUT_SER "Z Probe Past Bed" + +// Debug +#define STR_DEBUG_PREFIX "DEBUG:" +#define STR_DEBUG_OFF "off" +#define STR_DEBUG_ECHO "ECHO" +#define STR_DEBUG_INFO "INFO" +#define STR_DEBUG_ERRORS "ERRORS" +#define STR_DEBUG_DRYRUN "DRYRUN" +#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) +#define LANGUAGE_DATA_INCL(M) LANGUAGE_DATA_INCL_(M) + +#define LANGUAGE_INCL_(M) STRINGIFY_(../lcd/language/language_##M.h) +#define LANGUAGE_INCL(M) LANGUAGE_INCL_(M) + +#define STR_X "X" +#define STR_Y "Y" +#define STR_Z "Z" +#define STR_E "E" +#if IS_KINEMATIC + #define STR_A "A" + #define STR_B "B" + #define STR_C "C" +#else + #define STR_A "X" + #define STR_B "Y" + #define STR_C "Z" +#endif +#define STR_X2 "X2" +#define STR_Y2 "Y2" +#define STR_Z2 "Z2" +#define STR_Z3 "Z3" +#define STR_Z4 "Z4" + +#define LCD_STR_A STR_A +#define LCD_STR_B STR_B +#define LCD_STR_C STR_C +#define LCD_STR_E STR_E + +#if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + + // Custom characters defined in the first 8 characters of the LCD + #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! + #define LCD_STR_DEGREE "\x01" + #define LCD_STR_THERMOMETER "\x02" // Still used with string concatenation + #define LCD_STR_UPLEVEL "\x03" + #define LCD_STR_REFRESH "\x04" + #define LCD_STR_FOLDER "\x05" + #define LCD_STR_FEEDRATE "\x06" + #define LCD_STR_CLOCK "\x07" + #define LCD_STR_ARROW_RIGHT ">" /* from the default character set */ + +#else + // + // Custom characters from Marlin_symbols.fon which was merged into ISO10646-0-3.bdf + // \x00 intentionally skipped to avoid problems in strings + // + #define LCD_STR_REFRESH "\x01" + #define LCD_STR_FOLDER "\x02" + #define LCD_STR_ARROW_RIGHT "\x03" + #define LCD_STR_UPLEVEL "\x04" + #define LCD_STR_CLOCK "\x05" + #define LCD_STR_FEEDRATE "\x06" + #define LCD_STR_BEDTEMP "\x07" + #define LCD_STR_THERMOMETER "\x08" + #define LCD_STR_DEGREE "\x09" + + #define LCD_STR_SPECIAL_MAX '\x09' + // Maximum here is 0x1F because 0x20 is ' ' (space) and the normal charsets begin. + // Better stay below 0x10 because DISPLAY_CHARSET_HD44780_WESTERN begins here. + + // Symbol characters + #define LCD_STR_FILAM_DIA "\xF8" + #define LCD_STR_FILAM_MUL "\xA4" + +#endif + +/** + * Tool indexes for LCD display only + * + * By convention the LCD shows "E1" for the first extruder. + * However, internal to Marlin E0/T0 is the first tool, and + * most board silkscreens say "E0." Zero-based labels will + * make these indexes consistent but this defies expectation. + */ +#if ENABLED(NUMBER_TOOLS_FROM_0) + #define LCD_FIRST_TOOL 0 + #define LCD_STR_N0 "0" + #define LCD_STR_N1 "1" + #define LCD_STR_N2 "2" + #define LCD_STR_N3 "3" + #define LCD_STR_N4 "4" + #define LCD_STR_N5 "5" + #define LCD_STR_N6 "6" + #define LCD_STR_N7 "7" +#else + #define LCD_FIRST_TOOL 1 + #define LCD_STR_N0 "1" + #define LCD_STR_N1 "2" + #define LCD_STR_N2 "3" + #define LCD_STR_N3 "4" + #define LCD_STR_N4 "5" + #define LCD_STR_N5 "6" + #define LCD_STR_N6 "7" + #define LCD_STR_N7 "8" +#endif + +#define LCD_STR_E0 "E" LCD_STR_N0 +#define LCD_STR_E1 "E" LCD_STR_N1 +#define LCD_STR_E2 "E" LCD_STR_N2 +#define LCD_STR_E3 "E" LCD_STR_N3 +#define LCD_STR_E4 "E" LCD_STR_N4 +#define LCD_STR_E5 "E" LCD_STR_N5 +#define LCD_STR_E6 "E" LCD_STR_N6 +#define LCD_STR_E7 "E" LCD_STR_N7 + +#include "multi_language.h" // Allow multiple languages + +#include "../lcd/language/language_en.h" +#include LANGUAGE_INCL(LCD_LANGUAGE) +#include LANGUAGE_INCL(LCD_LANGUAGE_2) +#include LANGUAGE_INCL(LCD_LANGUAGE_3) +#include LANGUAGE_INCL(LCD_LANGUAGE_4) +#include LANGUAGE_INCL(LCD_LANGUAGE_5) + +#if NONE(DISPLAY_CHARSET_ISO10646_1, \ + DISPLAY_CHARSET_ISO10646_5, \ + DISPLAY_CHARSET_ISO10646_KANA, \ + DISPLAY_CHARSET_ISO10646_GREEK, \ + DISPLAY_CHARSET_ISO10646_CN, \ + DISPLAY_CHARSET_ISO10646_TR, \ + DISPLAY_CHARSET_ISO10646_PL, \ + DISPLAY_CHARSET_ISO10646_CZ, \ + DISPLAY_CHARSET_ISO10646_SK) + #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. +#endif diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h new file mode 100644 index 00000000..21bb32c4 --- /dev/null +++ b/Marlin/src/core/macros.h @@ -0,0 +1,516 @@ +/** + * 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 + +#if !defined(__has_include) + #define __has_include(...) 1 +#endif + +#define ABCE 4 +#define XYZE 4 +#define ABC 3 +#define XYZ 3 +#define XY 2 + +#define _AXIS(A) (A##_AXIS) + +#define _XMIN_ 100 +#define _YMIN_ 200 +#define _ZMIN_ 300 +#define _XMAX_ 101 +#define _YMAX_ 201 +#define _ZMAX_ 301 +#define _XDIAG_ 102 +#define _YDIAG_ 202 +#define _ZDIAG_ 302 +#define _E0DIAG_ 400 +#define _E1DIAG_ 401 +#define _E2DIAG_ 402 +#define _E3DIAG_ 403 +#define _E4DIAG_ 404 +#define _E5DIAG_ 405 +#define _E6DIAG_ 406 +#define _E7DIAG_ 407 + +#define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__ +#define FORCE_INLINE __attribute__((always_inline)) inline +#define _UNUSED __attribute__((unused)) +#define _O0 __attribute__((optimize("O0"))) +#define _Os __attribute__((optimize("Os"))) +#define _O1 __attribute__((optimize("O1"))) +#define _O2 __attribute__((optimize("O2"))) +#define _O3 __attribute__((optimize("O3"))) + +#ifndef UNUSED + #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + #define UNUSED(X) (void)X + #else + #define UNUSED(x) ((void)(x)) + #endif +#endif + +// Clock speed factors +#if !defined(CYCLES_PER_MICROSECOND) && !defined(__STM32F1__) + #define CYCLES_PER_MICROSECOND (F_CPU / 1000000UL) // 16 or 20 on AVR +#endif + +// Nanoseconds per cycle +#define NANOSECONDS_PER_CYCLE (1000000000.0 / F_CPU) + +// Macros to make a string from a macro +#define STRINGIFY_(M) #M +#define STRINGIFY(M) STRINGIFY_(M) + +#define A(CODE) " " CODE "\n\t" +#define L(CODE) CODE ":\n\t" + +// Macros for bit masks +#undef _BV +#define _BV(n) (1<<(n)) +#define TEST(n,b) (!!((n)&_BV(b))) +#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) + +#ifndef SBI + #define SBI(A,B) (A |= (1 << (B))) +#endif + +#ifndef CBI + #define CBI(A,B) (A &= ~(1 << (B))) +#endif + +#define TBI(N,B) (N ^= _BV(B)) + +#define _BV32(b) (1UL << (b)) +#define TEST32(n,b) !!((n)&_BV32(b)) +#define SBI32(n,b) (n |= _BV32(b)) +#define CBI32(n,b) (n &= ~_BV32(b)) +#define TBI32(N,B) (N ^= _BV32(B)) + +#define cu(x) ({__typeof__(x) _x = (x); (_x)*(_x)*(_x);}) +#define RADIANS(d) ((d)*float(M_PI)/180.0f) +#define DEGREES(r) ((r)*180.0f/float(M_PI)) +#define HYPOT2(x,y) (sq(x)+sq(y)) + +#define CIRCLE_AREA(R) (float(M_PI) * sq(float(R))) +#define CIRCLE_CIRC(R) (2 * float(M_PI) * float(R)) + +#define SIGN(a) ({__typeof__(a) _a = (a); (_a>0)-(_a<0);}) +#define IS_POWER_OF_2(x) ((x) && !((x) & ((x) - 1))) + +// Macros to constrain values +#ifdef __cplusplus + + // C++11 solution that is standards compliant. + template static inline constexpr void NOLESS(V& v, const N n) { + if (n > v) v = n; + } + template static inline constexpr void NOMORE(V& v, const N n) { + if (n < v) v = n; + } + template static inline constexpr void LIMIT(V& v, const N1 n1, const N2 n2) { + if (n1 > v) v = n1; + else if (n2 < v) v = n2; + } + +#else + + #define NOLESS(v, n) \ + do{ \ + __typeof__(n) _n = (n); \ + if (_n > v) v = _n; \ + }while(0) + + #define NOMORE(v, n) \ + do{ \ + __typeof__(n) _n = (n); \ + if (_n < v) v = _n; \ + }while(0) + + #define LIMIT(v, n1, n2) \ + do{ \ + __typeof__(n1) _n1 = (n1); \ + __typeof__(n2) _n2 = (n2); \ + if (_n1 > v) v = _n1; \ + else if (_n2 < v) v = _n2; \ + }while(0) + +#endif + +// Macros to chain up to 12 conditions +#define _DO_1(W,C,A) (_##W##_1(A)) +#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) +#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) +#define _DO_4(W,C,A,V...) (_##W##_1(A) C _DO_3(W,C,V)) +#define _DO_5(W,C,A,V...) (_##W##_1(A) C _DO_4(W,C,V)) +#define _DO_6(W,C,A,V...) (_##W##_1(A) C _DO_5(W,C,V)) +#define _DO_7(W,C,A,V...) (_##W##_1(A) C _DO_6(W,C,V)) +#define _DO_8(W,C,A,V...) (_##W##_1(A) C _DO_7(W,C,V)) +#define _DO_9(W,C,A,V...) (_##W##_1(A) C _DO_8(W,C,V)) +#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) +#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) +#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) +#define __DO_N(W,C,N,V...) _DO_##N(W,C,V) +#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) +#define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V) + +// Macros to support option testing +#define _CAT(a,V...) a##V +#define CAT(a,V...) _CAT(a,V) + +#define _ISENA_ ~,1 +#define _ISENA_1 ~,1 +#define _ISENA_0x1 ~,1 +#define _ISENA_true ~,1 +#define _ISENA(V...) IS_PROBE(V) + +#define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O))) +#define _DIS_1(O) NOT(_ENA_1(O)) +#define ENABLED(V...) DO(ENA,&&,V) +#define DISABLED(V...) DO(DIS,&&,V) + +#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' +#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' +#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1' +#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '' +#define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' +#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' +#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. + +#define ANY(V...) !DISABLED(V) +#define NONE(V...) DISABLED(V) +#define ALL(V...) ENABLED(V) +#define BOTH(V1,V2) ALL(V1,V2) +#define EITHER(V1,V2) ANY(V1,V2) + +// Macros to support pins/buttons exist testing +#define PIN_EXISTS(PN) (defined(PN##_PIN) && PN##_PIN >= 0) +#define _PINEX_1 PIN_EXISTS +#define PINS_EXIST(V...) DO(PINEX,&&,V) +#define ANY_PIN(V...) DO(PINEX,||,V) + +#define BUTTON_EXISTS(BN) (defined(BTN_##BN) && BTN_##BN >= 0) +#define _BTNEX_1 BUTTON_EXISTS +#define BUTTONS_EXIST(V...) DO(BTNEX,&&,V) +#define ANY_BUTTON(V...) DO(BTNEX,||,V) + +#define WITHIN(N,L,H) ((N) >= (L) && (N) <= (H)) +#define NUMERIC(a) WITHIN(a, '0', '9') +#define DECIMAL(a) (NUMERIC(a) || a == '.') +#define HEXCHR(a) (NUMERIC(a) ? (a) - '0' : WITHIN(a, 'a', 'f') ? ((a) - 'a' + 10) : WITHIN(a, 'A', 'F') ? ((a) - 'A' + 10) : -1) +#define NUMERIC_SIGNED(a) (NUMERIC(a) || (a) == '-' || (a) == '+') +#define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+') +#define COUNT(a) (sizeof(a)/sizeof(*a)) +#define ZERO(a) memset(a,0,sizeof(a)) +#define COPY(a,b) do{ \ + static_assert(sizeof(a[0]) == sizeof(b[0]), "COPY: '" STRINGIFY(a) "' and '" STRINGIFY(b) "' types (sizes) don't match!"); \ + memcpy(&a[0],&b[0],_MIN(sizeof(a),sizeof(b))); \ + }while(0) + +// Macros for initializing arrays +#define LIST_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P +#define LIST_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O +#define LIST_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N +#define LIST_13(A,B,C,D,E,F,G,H,I,J,K,L,M,...) A,B,C,D,E,F,G,H,I,J,K,L,M +#define LIST_12(A,B,C,D,E,F,G,H,I,J,K,L,...) A,B,C,D,E,F,G,H,I,J,K,L +#define LIST_11(A,B,C,D,E,F,G,H,I,J,K,...) A,B,C,D,E,F,G,H,I,J,K +#define LIST_10(A,B,C,D,E,F,G,H,I,J,...) A,B,C,D,E,F,G,H,I,J +#define LIST_9( A,B,C,D,E,F,G,H,I,...) A,B,C,D,E,F,G,H,I +#define LIST_8( A,B,C,D,E,F,G,H,...) A,B,C,D,E,F,G,H +#define LIST_7( A,B,C,D,E,F,G,...) A,B,C,D,E,F,G +#define LIST_6( A,B,C,D,E,F,...) A,B,C,D,E,F +#define LIST_5( A,B,C,D,E,...) A,B,C,D,E +#define LIST_4( A,B,C,D,...) A,B,C,D +#define LIST_3( A,B,C,...) A,B,C +#define LIST_2( A,B,...) A,B +#define LIST_1( A,...) A + +#define _LIST_N(N,V...) LIST_##N(V) +#define LIST_N(N,V...) _LIST_N(N,V) +#define ARRAY_N(N,V...) { _LIST_N(N,V) } + +#define _JOIN_1(O) (O) +#define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V))) + +#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++) +#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++) +#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N) +#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N) + +#define NOOP (void(0)) + +#define CEILING(x,y) (((x) + (y) - 1) / (y)) + +#undef ABS +#ifdef __cplusplus + template static inline constexpr const T ABS(const T v) { return v >= 0 ? v : -v; } +#else + #define ABS(a) ({__typeof__(a) _a = (a); _a >= 0 ? _a : -_a;}) +#endif + +#define UNEAR_ZERO(x) ((x) < 0.000001f) +#define NEAR_ZERO(x) WITHIN(x, -0.000001f, 0.000001f) +#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.0000005f : 0.0000005f);}) + +// +// Maths macros that can be overridden by HAL +// +#define ACOS(x) acosf(x) +#define ATAN2(y, x) atan2f(y, x) +#define POW(x, y) powf(x, y) +#define SQRT(x) sqrtf(x) +#define RSQRT(x) (1.0f / sqrtf(x)) +#define CEIL(x) ceilf(x) +#define FLOOR(x) floorf(x) +#define LROUND(x) lroundf(x) +#define FMOD(x, y) fmodf(x, y) +#define HYPOT(x,y) SQRT(HYPOT2(x,y)) + +// Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments +#define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT +#define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) + +#ifdef __cplusplus + + #ifndef _MINMAX_H_ + #define _MINMAX_H_ + + extern "C++" { + + // C++11 solution that is standards compliant. Return type is deduced automatically + template static inline constexpr auto _MIN(const L lhs, const R rhs) -> decltype(lhs + rhs) { + return lhs < rhs ? lhs : rhs; + } + template static inline constexpr auto _MAX(const L lhs, const R rhs) -> decltype(lhs + rhs) { + return lhs > rhs ? lhs : rhs; + } + template static inline constexpr const T _MIN(T V, Ts... Vs) { return _MIN(V, _MIN(Vs...)); } + template static inline constexpr const T _MAX(T V, Ts... Vs) { return _MAX(V, _MAX(Vs...)); } + + } + + #endif + +#else + + #define MIN_2(a,b) ((a)<(b)?(a):(b)) + #define MIN_3(a,V...) MIN_2(a,MIN_2(V)) + #define MIN_4(a,V...) MIN_2(a,MIN_3(V)) + #define MIN_5(a,V...) MIN_2(a,MIN_4(V)) + #define MIN_6(a,V...) MIN_2(a,MIN_5(V)) + #define MIN_7(a,V...) MIN_2(a,MIN_6(V)) + #define MIN_8(a,V...) MIN_2(a,MIN_7(V)) + #define MIN_9(a,V...) MIN_2(a,MIN_8(V)) + #define MIN_10(a,V...) MIN_2(a,MIN_9(V)) + #define __MIN_N(N,V...) MIN_##N(V) + #define _MIN_N(N,V...) __MIN_N(N,V) + #define _MIN(V...) _MIN_N(NUM_ARGS(V), V) + + #define MAX_2(a,b) ((a)>(b)?(a):(b)) + #define MAX_3(a,V...) MAX_2(a,MAX_2(V)) + #define MAX_4(a,V...) MAX_2(a,MAX_3(V)) + #define MAX_5(a,V...) MAX_2(a,MAX_4(V)) + #define MAX_6(a,V...) MAX_2(a,MAX_5(V)) + #define MAX_7(a,V...) MAX_2(a,MAX_6(V)) + #define MAX_8(a,V...) MAX_2(a,MAX_7(V)) + #define MAX_9(a,V...) MAX_2(a,MAX_8(V)) + #define MAX_10(a,V...) MAX_2(a,MAX_9(V)) + #define __MAX_N(N,V...) MAX_##N(V) + #define _MAX_N(N,V...) __MAX_N(N,V) + #define _MAX(V...) _MAX_N(NUM_ARGS(V), V) + +#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_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) + +#define ADD0(N) N +#define ADD1(N) INCREMENT_(N) +#define ADD2(N) ADD1(ADD1(N)) +#define ADD3(N) ADD1(ADD2(N)) +#define ADD4(N) ADD2(ADD2(N)) +#define ADD5(N) ADD2(ADD3(N)) +#define ADD6(N) ADD3(ADD3(N)) +#define ADD7(N) ADD3(ADD4(N)) +#define ADD8(N) ADD4(ADD4(N)) +#define ADD9(N) ADD4(ADD5(N)) +#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_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) + +#define SUB0(N) N +#define SUB1(N) DECREMENT_(N) +#define SUB2(N) SUB1(SUB1(N)) +#define SUB3(N) SUB1(SUB2(N)) +#define SUB4(N) SUB2(SUB2(N)) +#define SUB5(N) SUB2(SUB3(N)) +#define SUB6(N) SUB3(SUB3(N)) +#define SUB7(N) SUB3(SUB4(N)) +#define SUB8(N) SUB4(SUB4(N)) +#define SUB9(N) SUB4(SUB5(N)) +#define SUB10(N) SUB5(SUB5(N)) + +// +// Primitives supporting precompiler REPEAT +// +#define FIRST(a,...) a +#define SECOND(a,b,...) b +#define THIRD(a,b,c,...) c + +// Defer expansion +#define EMPTY() +#define DEFER(M) M EMPTY() +#define DEFER2(M) M EMPTY EMPTY()() +#define DEFER3(M) M EMPTY EMPTY EMPTY()()() +#define DEFER4(M) M EMPTY EMPTY EMPTY EMPTY()()()() + +// Force define expansion +#define EVAL(V...) EVAL16(V) +#define EVAL1024(V...) EVAL512(EVAL512(V)) +#define EVAL512(V...) EVAL256(EVAL256(V)) +#define EVAL256(V...) EVAL128(EVAL128(V)) +#define EVAL128(V...) EVAL64(EVAL64(V)) +#define EVAL64(V...) EVAL32(EVAL32(V)) +#define EVAL32(V...) EVAL16(EVAL16(V)) +#define EVAL16(V...) EVAL8(EVAL8(V)) +#define EVAL8(V...) EVAL4(EVAL4(V)) +#define EVAL4(V...) EVAL2(EVAL2(V)) +#define EVAL2(V...) EVAL1(EVAL1(V)) +#define EVAL1(V...) V + +#define IS_PROBE(V...) SECOND(V, 0) // Get the second item passed, or 0 +#define PROBE() ~, 1 // Second item will be 1 if this is passed +#define _NOT_0 PROBE() +#define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'. +#define _BOOL(x) NOT(NOT(x)) // NOT('0') gets '0'. Anything else gets '1'. + +#define IF_ELSE(TF) _IF_ELSE(_BOOL(TF)) +#define _IF_ELSE(TF) _CAT(_IF_, TF) + +#define _IF_1(V...) V _IF_1_ELSE +#define _IF_0(...) _IF_0_ELSE + +#define _IF_1_ELSE(...) +#define _IF_0_ELSE(V...) V + +#define HAS_ARGS(V...) _BOOL(FIRST(_END_OF_ARGUMENTS_ V)()) +#define _END_OF_ARGUMENTS_() 0 + + +// Simple Inline IF Macros, friendly to use in other macro definitions +#define IF(O, A, B) ((O) ? (A) : (B)) +#define IF_0(O, A) IF(O, A, 0) +#define IF_1(O, A) IF(O, A, 1) + +// +// REPEAT core macros. Recurse N times with ascending I. +// + +// Call OP(I) N times with ascending counter. +#define _REPEAT(_RPT_I,_RPT_N,_RPT_OP) \ + _RPT_OP(_RPT_I) \ + IF_ELSE(SUB1(_RPT_N)) \ + ( DEFER2(__REPEAT)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP) ) \ + ( /* Do nothing */ ) +#define __REPEAT() _REPEAT + +// Call OP(I, ...) N times with ascending counter. +#define _REPEAT2(_RPT_I,_RPT_N,_RPT_OP,V...) \ + _RPT_OP(_RPT_I,V) \ + IF_ELSE(SUB1(_RPT_N)) \ + ( DEFER2(__REPEAT2)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP,V) ) \ + ( /* Do nothing */ ) +#define __REPEAT2() _REPEAT2 + +// Repeat a macro passing S...N-1. +#define REPEAT_S(S,N,OP) EVAL(_REPEAT(S,SUB##S(N),OP)) +#define REPEAT(N,OP) REPEAT_S(0,N,OP) + +// Repeat a macro passing 0...N-1 plus additional arguments. +#define REPEAT2_S(S,N,OP,V...) EVAL(_REPEAT2(S,SUB##S(N),OP,V)) +#define REPEAT2(N,OP,V...) REPEAT2_S(0,N,OP,V) + +// Use RREPEAT macros with REPEAT macros for nesting +#define _RREPEAT(_RPT_I,_RPT_N,_RPT_OP) \ + _RPT_OP(_RPT_I) \ + IF_ELSE(SUB1(_RPT_N)) \ + ( DEFER2(__RREPEAT)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP) ) \ + ( /* Do nothing */ ) +#define __RREPEAT() _RREPEAT +#define _RREPEAT2(_RPT_I,_RPT_N,_RPT_OP,V...) \ + _RPT_OP(_RPT_I,V) \ + IF_ELSE(SUB1(_RPT_N)) \ + ( DEFER2(__RREPEAT2)()(ADD1(_RPT_I),SUB1(_RPT_N),_RPT_OP,V) ) \ + ( /* Do nothing */ ) +#define __RREPEAT2() _RREPEAT2 +#define RREPEAT_S(S,N,OP) EVAL1024(_RREPEAT(S,SUB##S(N),OP)) +#define RREPEAT(N,OP) RREPEAT_S(0,N,OP) +#define RREPEAT2_S(S,N,OP,V...) EVAL1024(_RREPEAT2(S,SUB##S(N),OP,V)) +#define RREPEAT2(N,OP,V...) RREPEAT2_S(0,N,OP,V) + +// See https://github.com/swansontec/map-macro +#define MAP_OUT +#define MAP_END(...) +#define MAP_GET_END() 0, MAP_END +#define MAP_NEXT0(test, next, ...) next MAP_OUT +#define MAP_NEXT1(test, next) MAP_NEXT0 (test, next, 0) +#define MAP_NEXT(test, next) MAP_NEXT1 (MAP_GET_END test, next) +#define MAP0(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP1) (f, peek, __VA_ARGS__) +#define MAP1(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP0) (f, peek, __VA_ARGS__) +#define MAP(f, ...) EVAL512 (MAP1 (f, __VA_ARGS__, (), 0)) diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h new file mode 100644 index 00000000..95bc40e1 --- /dev/null +++ b/Marlin/src/core/millis_t.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 + +#include + +typedef uint32_t millis_t; + +#define SEC_TO_MS(N) millis_t((N)*1000UL) +#define MIN_TO_MS(N) SEC_TO_MS((N)*60UL) +#define MS_TO_SEC(N) millis_t((N)/1000UL) + +#define PENDING(NOW,SOON) ((int32_t)(NOW-(SOON))<0) +#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h new file mode 100644 index 00000000..5852c439 --- /dev/null +++ b/Marlin/src/core/multi_language.h @@ -0,0 +1,83 @@ +/******************** + * multi_language.h * + ********************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ +#pragma once + +typedef const char Language_Str[]; + +#ifdef LCD_LANGUAGE_5 + #define NUM_LANGUAGES 5 +#elif defined(LCD_LANGUAGE_4) + #define NUM_LANGUAGES 4 +#elif defined(LCD_LANGUAGE_3) + #define NUM_LANGUAGES 3 +#elif defined(LCD_LANGUAGE_2) + #define NUM_LANGUAGES 2 +#else + #define NUM_LANGUAGES 1 +#endif + +// Setting the unused languages equal to each other allows +// the compiler to optimize away the conditionals + +#ifndef LCD_LANGUAGE_2 + #define LCD_LANGUAGE_2 LCD_LANGUAGE +#endif + +#ifndef LCD_LANGUAGE_3 + #define LCD_LANGUAGE_3 LCD_LANGUAGE_2 +#endif + +#ifndef LCD_LANGUAGE_4 + #define LCD_LANGUAGE_4 LCD_LANGUAGE_3 +#endif + +#ifndef LCD_LANGUAGE_5 + #define LCD_LANGUAGE_5 LCD_LANGUAGE_4 +#endif + +#define _GET_LANG(LANG) Language_##LANG +#define GET_LANG(LANG) _GET_LANG(LANG) + +#if NUM_LANGUAGES > 1 + extern uint8_t lang; + #define GET_TEXT(MSG) ( \ + lang == 0 ? GET_LANG(LCD_LANGUAGE)::MSG : \ + lang == 1 ? GET_LANG(LCD_LANGUAGE_2)::MSG : \ + lang == 2 ? GET_LANG(LCD_LANGUAGE_3)::MSG : \ + lang == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ + GET_LANG(LCD_LANGUAGE_5)::MSG \ + ) + #define MAX_LANG_CHARSIZE _MAX(GET_LANG(LCD_LANGUAGE)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_2)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_3)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_4)::CHARSIZE, \ + GET_LANG(LCD_LANGUAGE_5)::CHARSIZE) +#else + #define GET_TEXT(MSG) GET_LANG(LCD_LANGUAGE)::MSG + #define MAX_LANG_CHARSIZE GET_LANG(LCD_LANGUAGE)::CHARSIZE +#endif +#define GET_TEXT_F(MSG) (const __FlashStringHelper*)GET_TEXT(MSG) + +#define GET_LANGUAGE_NAME(INDEX) GET_LANG(LCD_LANGUAGE_##INDEX)::LANGUAGE + +#define MSG_1_LINE(A) A "\0" "\0" +#define MSG_2_LINE(A,B) A "\0" B "\0" +#define MSG_3_LINE(A,B,C) A "\0" B "\0" C diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp new file mode 100644 index 00000000..0d22f7bf --- /dev/null +++ b/Marlin/src/core/serial.cpp @@ -0,0 +1,74 @@ +/** + * 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 "serial.h" +#include "../inc/MarlinConfig.h" + +uint8_t marlin_debug_flags = MARLIN_DEBUG_NONE; + +static PGMSTR(errormagic, "Error:"); +static PGMSTR(echomagic, "echo:"); + +#if HAS_MULTI_SERIAL + int8_t serial_port_index = 0; +#endif + +void serialprintPGM(PGM_P str) { + while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c); +} +void serial_echo_start() { serialprintPGM(echomagic); } +void serial_error_start() { serialprintPGM(errormagic); } + +void serial_echopair_PGM(PGM_P const s_P, const char *v) { serialprintPGM(s_P); SERIAL_ECHO(v); } +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_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); } + +void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); } + +void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post/*=nullptr*/) { + if (pre) serialprintPGM(pre); + serialprintPGM(onoff ? on : off); + if (post) serialprintPGM(post); +} +void serialprint_onoff(const bool onoff) { serialprintPGM(onoff ? PSTR(STR_ON) : PSTR(STR_OFF)); } +void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); } +void serialprint_truefalse(const bool tf) { serialprintPGM(tf ? PSTR("true") : PSTR("false")); } + +void print_bin(uint16_t val) { + for (uint8_t i = 16; i--;) { + SERIAL_CHAR('0' + TEST(val, i)); + if (!(i & 0x3) && i) SERIAL_CHAR(' '); + } +} + +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*/) { + 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(); +} diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h new file mode 100644 index 00000000..fc830736 --- /dev/null +++ b/Marlin/src/core/serial.h @@ -0,0 +1,327 @@ +/** + * 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" + +/** + * Define debug bit-masks + */ +enum MarlinDebugFlags : uint8_t { + MARLIN_DEBUG_NONE = 0, + MARLIN_DEBUG_ECHO = _BV(0), ///< Echo commands in order as they are processed + MARLIN_DEBUG_INFO = _BV(1), ///< Print messages for code that has debug output + MARLIN_DEBUG_ERRORS = _BV(2), ///< Not implemented + MARLIN_DEBUG_DRYRUN = _BV(3), ///< Ignore temperature setting and E movement commands + MARLIN_DEBUG_COMMUNICATION = _BV(4), ///< Not implemented + #if ENABLED(DEBUG_LEVELING_FEATURE) + MARLIN_DEBUG_LEVELING = _BV(5), ///< Print detailed output for homing and leveling + MARLIN_DEBUG_MESH_ADJUST = _BV(6), ///< UBL bed leveling + #else + MARLIN_DEBUG_LEVELING = 0, + MARLIN_DEBUG_MESH_ADJUST = 0, + #endif + MARLIN_DEBUG_ALL = 0xFF +}; + +extern uint8_t marlin_debug_flags; +#define DEBUGGING(F) (marlin_debug_flags & (MARLIN_DEBUG_## F)) + +#define SERIAL_BOTH 0x7F +#if HAS_MULTI_SERIAL + extern int8_t serial_port_index; + #define _PORT_REDIRECT(n,p) REMEMBER(n,serial_port_index,p) + #define _PORT_RESTORE(n) RESTORE(n) + + #ifdef SERIAL_CATCHALL + #define SERIAL_OUT(WHAT, V...) (void)CAT(MYSERIAL,SERIAL_CATCHALL).WHAT(V) + #else + #define SERIAL_OUT(WHAT, V...) do{ \ + if (!serial_port_index || serial_port_index == SERIAL_BOTH) (void)MYSERIAL0.WHAT(V); \ + if ( serial_port_index) (void)MYSERIAL1.WHAT(V); \ + }while(0) + #endif + + #define SERIAL_ASSERT(P) if(serial_port_index!=(P)){ debugger(); } +#else + #define _PORT_REDIRECT(n,p) NOOP + #define _PORT_RESTORE(n) NOOP + #define SERIAL_OUT(WHAT, V...) (void)MYSERIAL0.WHAT(V) + #define SERIAL_ASSERT(P) NOOP +#endif + +#define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) +#define PORT_RESTORE() _PORT_RESTORE(1) + +#define SERIAL_ECHO(x) SERIAL_OUT(print, x) +#define SERIAL_ECHO_F(V...) SERIAL_OUT(print, V) +#define SERIAL_ECHOLN(x) SERIAL_OUT(println, x) +#define SERIAL_PRINT(x,b) SERIAL_OUT(print, x, b) +#define SERIAL_PRINTLN(x,b) SERIAL_OUT(println, x, b) +#define SERIAL_PRINTF(V...) SERIAL_OUT(printf, V) +#define SERIAL_FLUSH() SERIAL_OUT(flush) + +#ifdef ARDUINO_ARCH_STM32 + #define SERIAL_FLUSHTX() SERIAL_OUT(flush) +#elif TX_BUFFER_SIZE > 0 + #define SERIAL_FLUSHTX() SERIAL_OUT(flushTX) +#else + #define SERIAL_FLUSHTX() +#endif + +// Print up to 10 chars from a list +#define __CHAR_N(N,V...) _CHAR_##N(V) +#define _CHAR_N(N,V...) __CHAR_N(N,V) +#define _CHAR_1(c) SERIAL_OUT(write, c) +#define _CHAR_2(a,b) do{ _CHAR_1(a); _CHAR_1(b); }while(0) +#define _CHAR_3(a,V...) do{ _CHAR_1(a); _CHAR_2(V); }while(0) +#define _CHAR_4(a,V...) do{ _CHAR_1(a); _CHAR_3(V); }while(0) +#define _CHAR_5(a,V...) do{ _CHAR_1(a); _CHAR_4(V); }while(0) +#define _CHAR_6(a,V...) do{ _CHAR_1(a); _CHAR_5(V); }while(0) +#define _CHAR_7(a,V...) do{ _CHAR_1(a); _CHAR_6(V); }while(0) +#define _CHAR_8(a,V...) do{ _CHAR_1(a); _CHAR_7(V); }while(0) +#define _CHAR_9(a,V...) do{ _CHAR_1(a); _CHAR_8(V); }while(0) +#define _CHAR_10(a,V...) do{ _CHAR_1(a); _CHAR_9(V); }while(0) + +#define SERIAL_CHAR(V...) _CHAR_N(NUM_ARGS(V),V) + +// Print up to 12 pairs of values. Odd elements auto-wrapped in PSTR(). +#define __SEP_N(N,V...) _SEP_##N(V) +#define _SEP_N(N,V...) __SEP_N(N,V) +#define _SEP_1(PRE) SERIAL_ECHOPGM(PRE) +#define _SEP_2(PRE,V) serial_echopair_PGM(PSTR(PRE),V) +#define _SEP_3(a,b,c) do{ _SEP_2(a,b); SERIAL_ECHOPGM(c); }while(0) +#define _SEP_4(a,b,V...) do{ _SEP_2(a,b); _SEP_2(V); }while(0) +#define _SEP_5(a,b,V...) do{ _SEP_2(a,b); _SEP_3(V); }while(0) +#define _SEP_6(a,b,V...) do{ _SEP_2(a,b); _SEP_4(V); }while(0) +#define _SEP_7(a,b,V...) do{ _SEP_2(a,b); _SEP_5(V); }while(0) +#define _SEP_8(a,b,V...) do{ _SEP_2(a,b); _SEP_6(V); }while(0) +#define _SEP_9(a,b,V...) do{ _SEP_2(a,b); _SEP_7(V); }while(0) +#define _SEP_10(a,b,V...) do{ _SEP_2(a,b); _SEP_8(V); }while(0) +#define _SEP_11(a,b,V...) do{ _SEP_2(a,b); _SEP_9(V); }while(0) +#define _SEP_12(a,b,V...) do{ _SEP_2(a,b); _SEP_10(V); }while(0) +#define _SEP_13(a,b,V...) do{ _SEP_2(a,b); _SEP_11(V); }while(0) +#define _SEP_14(a,b,V...) do{ _SEP_2(a,b); _SEP_12(V); }while(0) +#define _SEP_15(a,b,V...) do{ _SEP_2(a,b); _SEP_13(V); }while(0) +#define _SEP_16(a,b,V...) do{ _SEP_2(a,b); _SEP_14(V); }while(0) +#define _SEP_17(a,b,V...) do{ _SEP_2(a,b); _SEP_15(V); }while(0) +#define _SEP_18(a,b,V...) do{ _SEP_2(a,b); _SEP_16(V); }while(0) +#define _SEP_19(a,b,V...) do{ _SEP_2(a,b); _SEP_17(V); }while(0) +#define _SEP_20(a,b,V...) do{ _SEP_2(a,b); _SEP_18(V); }while(0) +#define _SEP_21(a,b,V...) do{ _SEP_2(a,b); _SEP_19(V); }while(0) +#define _SEP_22(a,b,V...) do{ _SEP_2(a,b); _SEP_20(V); }while(0) +#define _SEP_23(a,b,V...) do{ _SEP_2(a,b); _SEP_21(V); }while(0) +#define _SEP_24(a,b,V...) do{ _SEP_2(a,b); _SEP_22(V); }while(0) + +#define SERIAL_ECHOPAIR(V...) _SEP_N(NUM_ARGS(V),V) + +// Print up to 12 pairs of values. Odd elements must be PSTR pointers. +#define __SEP_N_P(N,V...) _SEP_##N##_P(V) +#define _SEP_N_P(N,V...) __SEP_N_P(N,V) +#define _SEP_1_P(PRE) serialprintPGM(PRE) +#define _SEP_2_P(PRE,V) serial_echopair_PGM(PRE,V) +#define _SEP_3_P(a,b,c) do{ _SEP_2_P(a,b); serialprintPGM(c); }while(0) +#define _SEP_4_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_2_P(V); }while(0) +#define _SEP_5_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_3_P(V); }while(0) +#define _SEP_6_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_4_P(V); }while(0) +#define _SEP_7_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_5_P(V); }while(0) +#define _SEP_8_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_6_P(V); }while(0) +#define _SEP_9_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_7_P(V); }while(0) +#define _SEP_10_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_8_P(V); }while(0) +#define _SEP_11_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_9_P(V); }while(0) +#define _SEP_12_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_10_P(V); }while(0) +#define _SEP_13_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_11_P(V); }while(0) +#define _SEP_14_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_12_P(V); }while(0) +#define _SEP_15_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_13_P(V); }while(0) +#define _SEP_16_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_14_P(V); }while(0) +#define _SEP_17_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_15_P(V); }while(0) +#define _SEP_18_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_16_P(V); }while(0) +#define _SEP_19_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_17_P(V); }while(0) +#define _SEP_20_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_18_P(V); }while(0) +#define _SEP_21_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_19_P(V); }while(0) +#define _SEP_22_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_20_P(V); }while(0) +#define _SEP_23_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_21_P(V); }while(0) +#define _SEP_24_P(a,b,V...) do{ _SEP_2_P(a,b); _SEP_22_P(V); }while(0) + +#define SERIAL_ECHOPAIR_P(V...) _SEP_N_P(NUM_ARGS(V),V) + +// Print up to 12 pairs of values followed by newline +#define __SELP_N(N,V...) _SELP_##N(V) +#define _SELP_N(N,V...) __SELP_N(N,V) +#define _SELP_1(PRE) SERIAL_ECHOLNPGM(PRE) +#define _SELP_2(PRE,V) do{ serial_echopair_PGM(PSTR(PRE),V); SERIAL_EOL(); }while(0) +#define _SELP_3(a,b,c) do{ _SEP_2(a,b); SERIAL_ECHOLNPGM(c); }while(0) +#define _SELP_4(a,b,V...) do{ _SEP_2(a,b); _SELP_2(V); }while(0) +#define _SELP_5(a,b,V...) do{ _SEP_2(a,b); _SELP_3(V); }while(0) +#define _SELP_6(a,b,V...) do{ _SEP_2(a,b); _SELP_4(V); }while(0) +#define _SELP_7(a,b,V...) do{ _SEP_2(a,b); _SELP_5(V); }while(0) +#define _SELP_8(a,b,V...) do{ _SEP_2(a,b); _SELP_6(V); }while(0) +#define _SELP_9(a,b,V...) do{ _SEP_2(a,b); _SELP_7(V); }while(0) +#define _SELP_10(a,b,V...) do{ _SEP_2(a,b); _SELP_8(V); }while(0) +#define _SELP_11(a,b,V...) do{ _SEP_2(a,b); _SELP_9(V); }while(0) +#define _SELP_12(a,b,V...) do{ _SEP_2(a,b); _SELP_10(V); }while(0) +#define _SELP_13(a,b,V...) do{ _SEP_2(a,b); _SELP_11(V); }while(0) +#define _SELP_14(a,b,V...) do{ _SEP_2(a,b); _SELP_12(V); }while(0) +#define _SELP_15(a,b,V...) do{ _SEP_2(a,b); _SELP_13(V); }while(0) +#define _SELP_16(a,b,V...) do{ _SEP_2(a,b); _SELP_14(V); }while(0) +#define _SELP_17(a,b,V...) do{ _SEP_2(a,b); _SELP_15(V); }while(0) +#define _SELP_18(a,b,V...) do{ _SEP_2(a,b); _SELP_16(V); }while(0) +#define _SELP_19(a,b,V...) do{ _SEP_2(a,b); _SELP_17(V); }while(0) +#define _SELP_20(a,b,V...) do{ _SEP_2(a,b); _SELP_18(V); }while(0) +#define _SELP_21(a,b,V...) do{ _SEP_2(a,b); _SELP_19(V); }while(0) +#define _SELP_22(a,b,V...) do{ _SEP_2(a,b); _SELP_20(V); }while(0) +#define _SELP_23(a,b,V...) do{ _SEP_2(a,b); _SELP_21(V); }while(0) +#define _SELP_24(a,b,V...) do{ _SEP_2(a,b); _SELP_22(V); }while(0) +#define _SELP_25(a,b,V...) do{ _SEP_2(a,b); _SELP_23(V); }while(0) +#define _SELP_26(a,b,V...) do{ _SEP_2(a,b); _SELP_24(V); }while(0) +#define _SELP_27(a,b,V...) do{ _SEP_2(a,b); _SELP_25(V); }while(0) +#define _SELP_28(a,b,V...) do{ _SEP_2(a,b); _SELP_26(V); }while(0) +#define _SELP_29(a,b,V...) do{ _SEP_2(a,b); _SELP_27(V); }while(0) +#define _SELP_30(a,b,V...) do{ _SEP_2(a,b); _SELP_28(V); }while(0) // Eat two args, pass the rest up + +#define SERIAL_ECHOLNPAIR(V...) _SELP_N(NUM_ARGS(V),V) + +// Print up to 12 pairs of values followed by newline +#define __SELP_N_P(N,V...) _SELP_##N##_P(V) +#define _SELP_N_P(N,V...) __SELP_N_P(N,V) +#define _SELP_1_P(PRE) serialprintPGM(PRE) +#define _SELP_2_P(PRE,V) do{ serial_echopair_PGM(PRE,V); SERIAL_EOL(); }while(0) +#define _SELP_3_P(a,b,c) do{ _SEP_2_P(a,b); serialprintPGM(c); }while(0) +#define _SELP_4_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_2_P(V); }while(0) +#define _SELP_5_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_3_P(V); }while(0) +#define _SELP_6_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_4_P(V); }while(0) +#define _SELP_7_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_5_P(V); }while(0) +#define _SELP_8_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_6_P(V); }while(0) +#define _SELP_9_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_7_P(V); }while(0) +#define _SELP_10_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_8_P(V); }while(0) +#define _SELP_11_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_9_P(V); }while(0) +#define _SELP_12_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_10_P(V); }while(0) +#define _SELP_13_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_11_P(V); }while(0) +#define _SELP_14_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_12_P(V); }while(0) +#define _SELP_15_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_13_P(V); }while(0) +#define _SELP_16_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_14_P(V); }while(0) +#define _SELP_17_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_15_P(V); }while(0) +#define _SELP_18_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_16_P(V); }while(0) +#define _SELP_19_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_17_P(V); }while(0) +#define _SELP_20_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_18_P(V); }while(0) +#define _SELP_21_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_19_P(V); }while(0) +#define _SELP_22_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_20_P(V); }while(0) +#define _SELP_23_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_21_P(V); }while(0) +#define _SELP_24_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_22_P(V); }while(0) +#define _SELP_25_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_23_P(V); }while(0) +#define _SELP_26_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_24_P(V); }while(0) +#define _SELP_27_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_25_P(V); }while(0) +#define _SELP_28_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_26_P(V); }while(0) +#define _SELP_29_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_27_P(V); }while(0) +#define _SELP_30_P(a,b,V...) do{ _SEP_2_P(a,b); _SELP_28_P(V); }while(0) // Eat two args, pass the rest up + +#define SERIAL_ECHOLNPAIR_P(V...) _SELP_N_P(NUM_ARGS(V),V) + +// Print up to 20 comma-separated pairs of values +#define __SLST_N(N,V...) _SLST_##N(V) +#define _SLST_N(N,V...) __SLST_N(N,V) +#define _SLST_1(a) SERIAL_ECHO(a) +#define _SLST_2(a,b) do{ SERIAL_ECHO(a); SERIAL_ECHOPAIR(", ",b); }while(0) +#define _SLST_3(a,b,c) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_1(c); }while(0) +#define _SLST_4(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_2(V); }while(0) +#define _SLST_5(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_3(V); }while(0) +#define _SLST_6(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_4(V); }while(0) +#define _SLST_7(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_5(V); }while(0) +#define _SLST_8(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_6(V); }while(0) +#define _SLST_9(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_7(V); }while(0) +#define _SLST_10(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_8(V); }while(0) +#define _SLST_11(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_9(V); }while(0) +#define _SLST_12(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_10(V); }while(0) +#define _SLST_13(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_11(V); }while(0) +#define _SLST_14(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_12(V); }while(0) +#define _SLST_15(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_13(V); }while(0) +#define _SLST_16(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_14(V); }while(0) +#define _SLST_17(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_15(V); }while(0) +#define _SLST_18(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_16(V); }while(0) +#define _SLST_19(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_17(V); }while(0) +#define _SLST_20(a,b,V...) do{ SERIAL_ECHO(a); _SEP_2(", ",b); _SLST_18(V); }while(0) // Eat two args, pass the rest up + +#define SERIAL_ECHOLIST(pre,V...) do{ SERIAL_ECHOPGM(pre); _SLST_N(NUM_ARGS(V),V); }while(0) +#define SERIAL_ECHOLIST_N(N,V...) _SLST_N(N,LIST_N(N,V)) + +#define SERIAL_ECHOPGM_P(P) (serialprintPGM(P)) +#define SERIAL_ECHOLNPGM_P(P) (serialprintPGM(P "\n")) + +#define SERIAL_ECHOPGM(S) (serialprintPGM(PSTR(S))) +#define SERIAL_ECHOLNPGM(S) (serialprintPGM(PSTR(S "\n"))) + +#define SERIAL_ECHOPAIR_F_P(P,V...) do{ serialprintPGM(P); SERIAL_ECHO_F(V); }while(0) +#define SERIAL_ECHOLNPAIR_F_P(V...) do{ SERIAL_ECHOPAIR_F_P(V); SERIAL_EOL(); }while(0) + +#define SERIAL_ECHOPAIR_F(S,V...) SERIAL_ECHOPAIR_F_P(PSTR(S),V) +#define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0) + +#define SERIAL_ECHO_START() serial_echo_start() +#define SERIAL_ERROR_START() serial_error_start() +#define SERIAL_EOL() SERIAL_CHAR('\n') + +#define SERIAL_ECHO_MSG(V...) do{ SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(V); }while(0) +#define SERIAL_ERROR_MSG(V...) do{ SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR(V); }while(0) + +#define SERIAL_ECHO_SP(C) serial_spaces(C) + +#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.) +// +void serial_echopair_PGM(PGM_P const s_P, const char *v); +void serial_echopair_PGM(PGM_P const s_P, char v); +void serial_echopair_PGM(PGM_P const s_P, int v); +void serial_echopair_PGM(PGM_P const s_P, long v); +void serial_echopair_PGM(PGM_P const s_P, float v); +void serial_echopair_PGM(PGM_P const s_P, double v); +void serial_echopair_PGM(PGM_P const s_P, unsigned int v); +void serial_echopair_PGM(PGM_P const s_P, unsigned long v); +inline void serial_echopair_PGM(PGM_P const s_P, uint8_t v) { serial_echopair_PGM(s_P, (int)v); } +inline void serial_echopair_PGM(PGM_P const s_P, bool v) { serial_echopair_PGM(s_P, (int)v); } +inline void serial_echopair_PGM(PGM_P const s_P, void *v) { serial_echopair_PGM(s_P, (unsigned long)v); } + +void serialprintPGM(PGM_P str); +void serial_echo_start(); +void serial_error_start(); +void serial_ternary(const bool onoff, PGM_P const pre, PGM_P const on, PGM_P const off, PGM_P const post=nullptr); +void serialprint_onoff(const bool onoff); +void serialprintln_onoff(const bool onoff); +void serialprint_truefalse(const bool tf); +void serial_spaces(uint8_t count); + +void print_bin(const uint16_t val); +void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); + +inline void print_xyz(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) { + print_xyz(xyz.x, xyz.y, xyz.z, prefix, suffix); +} + +#define SERIAL_POS(SUFFIX,VAR) do { print_xyz(VAR, PSTR(" " STRINGIFY(VAR) "="), PSTR(" : " SUFFIX "\n")); }while(0) +#define SERIAL_XYZ(PREFIX,V...) do { print_xyz(V, PSTR(PREFIX), nullptr); }while(0) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h new file mode 100644 index 00000000..a5b78caa --- /dev/null +++ b/Marlin/src/core/types.h @@ -0,0 +1,504 @@ +/** + * 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" + +class __FlashStringHelper; +typedef const __FlashStringHelper *progmem_str; + +// +// Enumerated axis indices +// +// - X_AXIS, Y_AXIS, and Z_AXIS should be used for axes in Cartesian space +// - A_AXIS, B_AXIS, and C_AXIS should be used for Steppers, corresponding to XYZ on Cartesians +// - X_HEAD, Y_HEAD, and Z_HEAD should be used for Steppers on Core kinematics +// +enum AxisEnum : uint8_t { + X_AXIS = 0, A_AXIS = 0, + Y_AXIS = 1, B_AXIS = 1, + Z_AXIS = 2, C_AXIS = 2, + E_AXIS = 3, + X_HEAD = 4, Y_HEAD = 5, Z_HEAD = 6, + E0_AXIS = 3, + E1_AXIS, E2_AXIS, E3_AXIS, E4_AXIS, E5_AXIS, E6_AXIS, E7_AXIS, + ALL_AXES = 0xFE, NO_AXIS = 0xFF +}; + +// +// Loop over XYZE axes +// +#define LOOP_XYZ(VAR) LOOP_S_LE_N(VAR, X_AXIS, Z_AXIS) +#define LOOP_XYZE(VAR) LOOP_S_LE_N(VAR, X_AXIS, E_AXIS) +#define LOOP_XYZE_N(VAR) LOOP_S_L_N(VAR, X_AXIS, XYZE_N) +#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS) +#define LOOP_ABCE(VAR) LOOP_S_LE_N(VAR, A_AXIS, E_AXIS) +#define LOOP_ABCE_N(VAR) LOOP_S_L_N(VAR, A_AXIS, XYZE_N) + +// +// Conditional type assignment magic. For example... +// +// typename IF<(MYOPT==12), int, float>::type myvar; +// +template +struct IF { typedef R type; }; +template +struct IF { typedef L type; }; + +// +// feedRate_t is just a humble float +// +typedef float feedRate_t; + +// Conversion macros +#define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) +#define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) +#define MMS_SCALED(V) ((V) * 0.01f * feedrate_percentage) + +// +// Coordinates structures for XY, XYZ, XYZE... +// + +// Helpers +#define _RECIP(N) ((N) ? 1.0f / float(N) : 0.0f) +#define _ABS(N) ((N) < 0 ? -(N) : (N)) +#define _LS(N) (N = (T)(uint32_t(N) << v)) +#define _RS(N) (N = (T)(uint32_t(N) >> v)) +#define FI FORCE_INLINE + +// Forward declarations +template struct XYval; +template struct XYZval; +template struct XYZEval; + +typedef struct XYval xy_bool_t; +typedef struct XYZval xyz_bool_t; +typedef struct XYZEval xyze_bool_t; + +typedef struct XYval xy_char_t; +typedef struct XYZval xyz_char_t; +typedef struct XYZEval xyze_char_t; + +typedef struct XYval xy_uchar_t; +typedef struct XYZval xyz_uchar_t; +typedef struct XYZEval xyze_uchar_t; + +typedef struct XYval xy_int8_t; +typedef struct XYZval xyz_int8_t; +typedef struct XYZEval xyze_int8_t; + +typedef struct XYval xy_uint8_t; +typedef struct XYZval xyz_uint8_t; +typedef struct XYZEval xyze_uint8_t; + +typedef struct XYval xy_int_t; +typedef struct XYZval xyz_int_t; +typedef struct XYZEval xyze_int_t; + +typedef struct XYval xy_uint_t; +typedef struct XYZval xyz_uint_t; +typedef struct XYZEval xyze_uint_t; + +typedef struct XYval xy_long_t; +typedef struct XYZval xyz_long_t; +typedef struct XYZEval xyze_long_t; + +typedef struct XYval xy_ulong_t; +typedef struct XYZval xyz_ulong_t; +typedef struct XYZEval xyze_ulong_t; + +typedef struct XYZval xyz_vlong_t; +typedef struct XYZEval xyze_vlong_t; + +typedef struct XYval xy_float_t; +typedef struct XYZval xyz_float_t; +typedef struct XYZEval xyze_float_t; + +typedef struct XYval xy_feedrate_t; +typedef struct XYZval xyz_feedrate_t; +typedef struct XYZEval xyze_feedrate_t; + +typedef xy_uint8_t xy_byte_t; +typedef xyz_uint8_t xyz_byte_t; +typedef xyze_uint8_t xyze_byte_t; + +typedef xyz_long_t abc_long_t; +typedef xyze_long_t abce_long_t; +typedef xyz_ulong_t abc_ulong_t; +typedef xyze_ulong_t abce_ulong_t; + +typedef xy_float_t xy_pos_t; +typedef xyz_float_t xyz_pos_t; +typedef xyze_float_t xyze_pos_t; + +typedef xy_float_t ab_float_t; +typedef xyz_float_t abc_float_t; +typedef xyze_float_t abce_float_t; + +typedef ab_float_t ab_pos_t; +typedef abc_float_t abc_pos_t; +typedef abce_float_t abce_pos_t; + +// External conversion methods +void toLogical(xy_pos_t &raw); +void toLogical(xyz_pos_t &raw); +void toLogical(xyze_pos_t &raw); +void toNative(xy_pos_t &raw); +void toNative(xyz_pos_t &raw); +void toNative(xyze_pos_t &raw); + +// +// XY coordinates, counters, etc. +// +template +struct XYval { + union { + struct { T x, y; }; + struct { T a, b; }; + T pos[2]; + }; + FI void set(const T px) { x = px; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[XYZ]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[XYZE]) { x = arr[0]; y = arr[1]; } + #if XYZE_N > XYZE + FI void set(const T (&arr)[XYZE_N]) { x = arr[0]; y = arr[1]; } + #endif + FI void reset() { x = y = 0; } + FI T magnitude() const { return (T)sqrtf(x*x + y*y); } + FI operator T* () { return pos; } + FI operator bool() { return x || y; } + FI XYval copy() const { return *this; } + FI XYval ABS() const { return { T(_ABS(x)), T(_ABS(y)) }; } + FI XYval asInt() { return { int16_t(x), int16_t(y) }; } + FI XYval asInt() const { return { int16_t(x), int16_t(y) }; } + FI XYval asLong() { return { int32_t(x), int32_t(y) }; } + FI XYval asLong() const { return { int32_t(x), int32_t(y) }; } + FI XYval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } + FI XYval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } + FI XYval asFloat() { return { float(x), float(y) }; } + FI XYval asFloat() const { return { float(x), float(y) }; } + FI XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; } + FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; } + FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; } + FI operator XYZval() { return { x, y }; } + FI operator XYZval() const { return { x, y }; } + FI operator XYZEval() { return { x, y }; } + FI operator XYZEval() const { return { x, y }; } + FI T& operator[](const int i) { return pos[i]; } + FI const T& operator[](const int i) const { return pos[i]; } + FI XYval& operator= (const T v) { set(v, v ); return *this; } + FI XYval& operator= (const XYZval &rs) { set(rs.x, rs.y); return *this; } + FI XYval& operator= (const XYZEval &rs) { set(rs.x, rs.y); return *this; } + FI XYval operator+ (const XYval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator+ (const XYval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator- (const XYval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator- (const XYval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator* (const XYval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator* (const XYval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator/ (const XYval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator/ (const XYval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator+ (const XYZval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator+ (const XYZval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator- (const XYZval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator- (const XYZval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator* (const XYZval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator* (const XYZval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator/ (const XYZval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator/ (const XYZval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator+ (const XYZEval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator+ (const XYZEval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYval operator- (const XYZEval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator- (const XYZEval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYval operator* (const XYZEval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator* (const XYZEval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYval operator/ (const XYZEval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator/ (const XYZEval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYval operator* (const float &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator* (const float &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator* (const int &v) const { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator* (const int &v) { XYval ls = *this; ls.x *= v; ls.y *= v; return ls; } + FI XYval operator/ (const float &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator/ (const float &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator/ (const int &v) const { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator/ (const int &v) { XYval ls = *this; ls.x /= v; ls.y /= v; return ls; } + FI XYval operator>>(const int &v) const { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } + FI XYval operator>>(const int &v) { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } + FI XYval operator<<(const int &v) const { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } + FI XYval operator<<(const int &v) { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } + FI XYval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator*=(const float &v) { x *= v; y *= v; return *this; } + FI XYval& operator*=(const int &v) { x *= v; y *= v; return *this; } + FI XYval& operator>>=(const int &v) { _RS(x); _RS(y); return *this; } + FI XYval& operator<<=(const int &v) { _LS(x); _LS(y); return *this; } + FI bool operator==(const XYval &rs) { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y; } + FI bool operator==(const XYval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator!=(const XYval &rs) { return !operator==(rs); } + FI bool operator!=(const XYZval &rs) { return !operator==(rs); } + FI bool operator!=(const XYZEval &rs) { return !operator==(rs); } + FI bool operator!=(const XYval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI XYval operator-() { XYval o = *this; o.x = -x; o.y = -y; return o; } + FI const XYval operator-() const { XYval o = *this; o.x = -x; o.y = -y; return o; } +}; + +// +// XYZ coordinates, counters, etc. +// +template +struct XYZval { + union { + struct { T x, y, z; }; + struct { T a, b, c; }; + T pos[3]; + }; + FI void set(const T px) { x = px; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; } + FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; } + FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[XYZ]) { x = arr[0]; y = arr[1]; z = arr[2]; } + FI void set(const T (&arr)[XYZE]) { x = arr[0]; y = arr[1]; z = arr[2]; } + #if XYZE_N > XYZE + FI void set(const T (&arr)[XYZE_N]) { x = arr[0]; y = arr[1]; z = arr[2]; } + #endif + FI void reset() { x = y = z = 0; } + FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z); } + FI operator T* () { return pos; } + FI operator bool() { return z || x || y; } + FI XYZval copy() const { XYZval o = *this; return o; } + FI XYZval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)) }; } + FI XYZval asInt() { return { int16_t(x), int16_t(y), int16_t(z) }; } + FI XYZval asInt() const { return { int16_t(x), int16_t(y), int16_t(z) }; } + FI XYZval asLong() { return { int32_t(x), int32_t(y), int32_t(z) }; } + FI XYZval asLong() const { return { int32_t(x), int32_t(y), int32_t(z) }; } + FI XYZval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)) }; } + FI XYZval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)) }; } + FI XYZval asFloat() { return { float(x), float(y), float(z) }; } + FI XYZval asFloat() const { return { float(x), float(y), float(z) }; } + FI XYZval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z) }; } + FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; } + FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; } + FI operator XYval&() { return *(XYval*)this; } + FI operator const XYval&() const { return *(const XYval*)this; } + FI operator XYZEval() const { return { x, y, z }; } + FI T& operator[](const int i) { return pos[i]; } + FI const T& operator[](const int i) const { return pos[i]; } + FI XYZval& operator= (const T v) { set(v, v, v ); return *this; } + FI XYZval& operator= (const XYval &rs) { set(rs.x, rs.y ); return *this; } + FI XYZval& operator= (const XYZEval &rs) { set(rs.x, rs.y, rs.z); return *this; } + FI XYZval operator+ (const XYval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZval operator+ (const XYval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZval operator- (const XYval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZval operator- (const XYval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZval operator* (const XYval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZval operator* (const XYval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZval operator/ (const XYval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZval operator/ (const XYval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZval operator+ (const XYZval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator+ (const XYZval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator- (const XYZval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator- (const XYZval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator* (const XYZval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator* (const XYZval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator/ (const XYZval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator/ (const XYZval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator+ (const XYZEval &rs) const { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator+ (const XYZEval &rs) { XYZval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZval operator- (const XYZEval &rs) const { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator- (const XYZEval &rs) { XYZval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZval operator* (const XYZEval &rs) const { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator* (const XYZEval &rs) { XYZval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZval operator/ (const XYZEval &rs) const { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator/ (const XYZEval &rs) { XYZval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZval operator* (const float &v) const { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } + FI XYZval operator* (const float &v) { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } + FI XYZval operator* (const int &v) const { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } + FI XYZval operator* (const int &v) { XYZval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; return ls; } + FI XYZval operator/ (const float &v) const { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } + FI XYZval operator/ (const float &v) { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } + FI XYZval operator/ (const int &v) const { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } + FI XYZval operator/ (const int &v) { XYZval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; return ls; } + FI XYZval operator>>(const int &v) const { XYZval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); return ls; } + FI XYZval operator>>(const int &v) { XYZval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); return ls; } + FI XYZval operator<<(const int &v) const { XYZval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); return ls; } + FI XYZval operator<<(const int &v) { XYZval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); return ls; } + FI XYZval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYZval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYZval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYZval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } + FI XYZval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } + FI XYZval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } + FI XYZval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } + FI XYZval& operator/=(const XYZval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } + FI XYZval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } + FI XYZval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } + FI XYZval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } + FI XYZval& operator/=(const XYZEval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } + FI XYZval& operator*=(const float &v) { x *= v; y *= v; z *= v; return *this; } + FI XYZval& operator*=(const int &v) { x *= v; y *= v; z *= v; return *this; } + FI XYZval& operator>>=(const int &v) { _RS(x); _RS(y); _RS(z); return *this; } + FI XYZval& operator<<=(const int &v) { _LS(x); _LS(y); _LS(z); return *this; } + FI bool operator==(const XYZEval &rs) { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZEval &rs) { return !operator==(rs); } + FI bool operator==(const XYZEval &rs) const { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI XYZval operator-() { XYZval o = *this; o.x = -x; o.y = -y; o.z = -z; return o; } + FI const XYZval operator-() const { XYZval o = *this; o.x = -x; o.y = -y; o.z = -z; return o; } +}; + +// +// XYZE coordinates, counters, etc. +// +template +struct XYZEval { + union { + struct{ T x, y, z, e; }; + struct{ T a, b, c; }; + T pos[4]; + }; + FI void reset() { x = y = z = e = 0; } + FI T magnitude() const { return (T)sqrtf(x*x + y*y + z*z + e*e); } + FI operator T* () { return pos; } + FI operator bool() { return e || z || x || y; } + FI void set(const T px) { x = px; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void set(const T px, const T py, const T pz) { x = px; y = py; z = pz; } + FI void set(const T px, const T py, const T pz, const T pe) { x = px; y = py; z = pz; e = pe; } + FI void set(const XYval pxy) { x = pxy.x; y = pxy.y; } + FI void set(const XYval pxy, const T pz) { x = pxy.x; y = pxy.y; z = pz; } + FI void set(const XYZval pxyz) { x = pxyz.x; y = pxyz.y; z = pxyz.z; } + FI void set(const XYval pxy, const T pz, const T pe) { x = pxy.x; y = pxy.y; z = pz; e = pe; } + FI void set(const XYval pxy, const XYval pze) { x = pxy.x; y = pxy.y; z = pze.z; e = pze.e; } + FI void set(const XYZval pxyz, const T pe) { x = pxyz.x; y = pxyz.y; z = pxyz.z; e = pe; } + FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[XYZ]) { x = arr[0]; y = arr[1]; z = arr[2]; } + FI void set(const T (&arr)[XYZE]) { x = arr[0]; y = arr[1]; z = arr[2]; e = arr[3]; } + #if XYZE_N > XYZE + FI void set(const T (&arr)[XYZE_N]) { x = arr[0]; y = arr[1]; z = arr[2]; e = arr[3]; } + #endif + FI XYZEval copy() const { return *this; } + FI XYZEval ABS() const { return { T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(e)) }; } + FI XYZEval asInt() { return { int16_t(x), int16_t(y), int16_t(z), int16_t(e) }; } + FI XYZEval asInt() const { return { int16_t(x), int16_t(y), int16_t(z), int16_t(e) }; } + FI XYZEval asLong() { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } + FI XYZEval asLong() const { return { int32_t(x), int32_t(y), int32_t(z), int32_t(e) }; } + FI XYZEval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(e)) }; } + FI XYZEval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(e)) }; } + FI XYZEval asFloat() { return { float(x), float(y), float(z), float(e) }; } + FI XYZEval asFloat() const { return { float(x), float(y), float(z), float(e) }; } + FI XYZEval reciprocal() const { return { _RECIP(x), _RECIP(y), _RECIP(z), _RECIP(e) }; } + FI XYZEval asLogical() const { XYZEval o = asFloat(); toLogical(o); return o; } + FI XYZEval asNative() const { XYZEval o = asFloat(); toNative(o); return o; } + FI operator XYval&() { return *(XYval*)this; } + FI operator const XYval&() const { return *(const XYval*)this; } + FI operator XYZval&() { return *(XYZval*)this; } + FI operator const XYZval&() const { return *(const XYZval*)this; } + FI T& operator[](const int i) { return pos[i]; } + FI const T& operator[](const int i) const { return pos[i]; } + FI XYZEval& operator= (const T v) { set(v, v, v, v); return *this; } + FI XYZEval& operator= (const XYval &rs) { set(rs.x, rs.y); return *this; } + FI XYZEval& operator= (const XYZval &rs) { set(rs.x, rs.y, rs.z); return *this; } + FI XYZEval operator+ (const XYval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZEval operator+ (const XYval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } + FI XYZEval operator- (const XYval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZEval operator- (const XYval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } + FI XYZEval operator* (const XYval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZEval operator* (const XYval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } + FI XYZEval operator/ (const XYval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZEval operator/ (const XYval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } + FI XYZEval operator+ (const XYZval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZEval operator+ (const XYZval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; return ls; } + FI XYZEval operator- (const XYZval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZEval operator- (const XYZval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; return ls; } + FI XYZEval operator* (const XYZval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZEval operator* (const XYZval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; return ls; } + FI XYZEval operator/ (const XYZval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZEval operator/ (const XYZval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; return ls; } + FI XYZEval operator+ (const XYZEval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; ls.e += rs.e; return ls; } + FI XYZEval operator+ (const XYZEval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; ls.z += rs.z; ls.e += rs.e; return ls; } + FI XYZEval operator- (const XYZEval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; ls.e -= rs.e; return ls; } + FI XYZEval operator- (const XYZEval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; ls.z -= rs.z; ls.e -= rs.e; return ls; } + FI XYZEval operator* (const XYZEval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; ls.e *= rs.e; return ls; } + FI XYZEval operator* (const XYZEval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; ls.z *= rs.z; ls.e *= rs.e; return ls; } + FI XYZEval operator/ (const XYZEval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; ls.e /= rs.e; return ls; } + FI XYZEval operator/ (const XYZEval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; ls.z /= rs.z; ls.e /= rs.e; return ls; } + FI XYZEval operator* (const float &v) const { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator* (const float &v) { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator* (const int &v) const { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator* (const int &v) { XYZEval ls = *this; ls.x *= v; ls.y *= v; ls.z *= v; ls.e *= v; return ls; } + FI XYZEval operator/ (const float &v) const { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator/ (const float &v) { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator/ (const int &v) const { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator/ (const int &v) { XYZEval ls = *this; ls.x /= v; ls.y /= v; ls.z /= v; ls.e /= v; return ls; } + FI XYZEval operator>>(const int &v) const { XYZEval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); _RS(ls.e); return ls; } + FI XYZEval operator>>(const int &v) { XYZEval ls = *this; _RS(ls.x); _RS(ls.y); _RS(ls.z); _RS(ls.e); return ls; } + FI XYZEval operator<<(const int &v) const { XYZEval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); _LS(ls.e); return ls; } + FI XYZEval operator<<(const int &v) { XYZEval ls = *this; _LS(ls.x); _LS(ls.y); _LS(ls.z); _LS(ls.e); return ls; } + FI XYZEval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYZEval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYZEval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYZEval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } + FI XYZEval& operator+=(const XYZval &rs) { x += rs.x; y += rs.y; z += rs.z; return *this; } + FI XYZEval& operator-=(const XYZval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; return *this; } + FI XYZEval& operator*=(const XYZval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; return *this; } + FI XYZEval& operator/=(const XYZval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; return *this; } + FI XYZEval& operator+=(const XYZEval &rs) { x += rs.x; y += rs.y; z += rs.z; e += rs.e; return *this; } + FI XYZEval& operator-=(const XYZEval &rs) { x -= rs.x; y -= rs.y; z -= rs.z; e -= rs.e; return *this; } + FI XYZEval& operator*=(const XYZEval &rs) { x *= rs.x; y *= rs.y; z *= rs.z; e *= rs.e; return *this; } + FI XYZEval& operator/=(const XYZEval &rs) { x /= rs.x; y /= rs.y; z /= rs.z; e /= rs.e; return *this; } + FI XYZEval& operator*=(const T &v) { x *= v; y *= v; z *= v; e *= v; return *this; } + FI XYZEval& operator>>=(const int &v) { _RS(x); _RS(y); _RS(z); _RS(e); return *this; } + FI XYZEval& operator<<=(const int &v) { _LS(x); _LS(y); _LS(z); _LS(e); return *this; } + FI bool operator==(const XYZval &rs) { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZval &rs) { return !operator==(rs); } + FI bool operator==(const XYZval &rs) const { return x == rs.x && y == rs.y && z == rs.z; } + FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } + FI XYZEval operator-() { return { -x, -y, -z, -e }; } + FI const XYZEval operator-() const { return { -x, -y, -z, -e }; } +}; + +#undef _RECIP +#undef _ABS +#undef _LS +#undef _RS +#undef FI + +const xyze_char_t axis_codes { 'X', 'Y', 'Z', 'E' }; +#define XYZ_CHAR(A) ((char)('X' + A)) diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp new file mode 100644 index 00000000..f9995681 --- /dev/null +++ b/Marlin/src/core/utility.cpp @@ -0,0 +1,177 @@ +/** + * 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 "utility.h" + +#include "../MarlinCore.h" +#include "../module/temperature.h" + +void safe_delay(millis_t ms) { + while (ms > 50) { + ms -= 50; + delay(50); + thermalManager.manage_heater(); + } + delay(ms); + thermalManager.manage_heater(); // This keeps us safe if too many small safe_delay() calls are made +} + +// A delay to provide brittle hosts time to receive bytes +#if ENABLED(SERIAL_OVERRUN_PROTECTION) + + #include "../gcode/gcode.h" // for set_autoreport_paused + + void serial_delay(const millis_t ms) { + const bool was = gcode.set_autoreport_paused(true); + safe_delay(ms); + gcode.set_autoreport_paused(was); + } +#endif + +#if ENABLED(DEBUG_LEVELING_FEATURE) + + #include "../module/probe.h" + #include "../module/motion.h" + #include "../module/stepper.h" + #include "../libs/numtostr.h" + #include "../feature/bedlevel/bedlevel.h" + + void log_machine_info() { + SERIAL_ECHOLNPGM("Machine Type: " + TERN_(DELTA, "Delta") + TERN_(IS_SCARA, "SCARA") + TERN_(IS_CORE, "Core") + TERN_(MARKFORGED_XY, "MarkForged") + TERN_(IS_CARTESIAN, "Cartesian") + ); + + SERIAL_ECHOLNPGM("Probe: " + TERN_(PROBE_MANUALLY, "PROBE_MANUALLY") + TERN_(NOZZLE_AS_PROBE, "NOZZLE_AS_PROBE") + TERN_(FIX_MOUNTED_PROBE, "FIX_MOUNTED_PROBE") + TERN_(HAS_Z_SERVO_PROBE, TERN(BLTOUCH, "BLTOUCH", "SERVO PROBE")) + TERN_(TOUCH_MI_PROBE, "TOUCH_MI_PROBE") + TERN_(Z_PROBE_SLED, "Z_PROBE_SLED") + TERN_(Z_PROBE_ALLEN_KEY, "Z_PROBE_ALLEN_KEY") + TERN_(SOLENOID_PROBE, "SOLENOID_PROBE") + TERN(PROBE_SELECTED, "", "NONE") + ); + + #if HAS_BED_PROBE + + #if !HAS_PROBE_XY_OFFSET + SERIAL_ECHOPAIR("Probe Offset X0 Y0 Z", probe.offset.z, " ("); + #else + SERIAL_ECHOPAIR_P(PSTR("Probe Offset X"), probe.offset_xy.x, SP_Y_STR, probe.offset_xy.y, SP_Z_STR, probe.offset.z); + if (probe.offset_xy.x > 0) + SERIAL_ECHOPGM(" (Right"); + else if (probe.offset_xy.x < 0) + SERIAL_ECHOPGM(" (Left"); + else if (probe.offset_xy.y != 0) + SERIAL_ECHOPGM(" (Middle"); + else + SERIAL_ECHOPGM(" (Aligned With"); + + if (probe.offset_xy.y > 0) + serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); + else if (probe.offset_xy.y < 0) + serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); + else if (probe.offset_xy.x != 0) + SERIAL_ECHOPGM("-Center"); + + SERIAL_ECHOPGM(" & "); + + #endif + + serialprintPGM(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); + SERIAL_ECHOLNPGM(" Nozzle)"); + + #endif + + #if HAS_ABL_OR_UBL + SERIAL_ECHOPGM("Auto Bed Leveling: " + TERN_(AUTO_BED_LEVELING_LINEAR, "LINEAR") + TERN_(AUTO_BED_LEVELING_BILINEAR, "BILINEAR") + TERN_(AUTO_BED_LEVELING_3POINT, "3POINT") + TERN_(AUTO_BED_LEVELING_UBL, "UBL") + ); + + if (planner.leveling_active) { + SERIAL_ECHOLNPGM(" (enabled)"); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (planner.z_fade_height) + SERIAL_ECHOLNPAIR("Z Fade: ", planner.z_fade_height); + #endif + #if ABL_PLANAR + SERIAL_ECHOPGM("ABL Adjustment X"); + LOOP_XYZ(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_DECIMAL(v); + } + #else + #if ENABLED(AUTO_BED_LEVELING_UBL) + SERIAL_ECHOPGM("UBL Adjustment Z"); + const float rz = ubl.get_z_correction(current_position); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + SERIAL_ECHOPGM("ABL Adjustment Z"); + const float rz = bilinear_z_offset(current_position); + #endif + SERIAL_ECHO(ftostr43sign(rz, '+')); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (planner.z_fade_height) { + SERIAL_ECHOPAIR(" (", ftostr43sign(rz * planner.fade_scaling_factor_for_z(current_position.z), '+')); + SERIAL_CHAR(')'); + } + #endif + #endif + } + else + SERIAL_ECHOLNPGM(" (disabled)"); + + SERIAL_EOL(); + + #elif ENABLED(MESH_BED_LEVELING) + + SERIAL_ECHOPGM("Mesh Bed Leveling"); + if (planner.leveling_active) { + SERIAL_ECHOLNPGM(" (enabled)"); + SERIAL_ECHOPAIR("MBL Adjustment Z", ftostr43sign(mbl.get_z(current_position), '+')); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (planner.z_fade_height) { + SERIAL_ECHOPAIR(" (", ftostr43sign( + mbl.get_z(current_position, planner.fade_scaling_factor_for_z(current_position.z)), '+' + )); + SERIAL_CHAR(')'); + } + #endif + } + else + SERIAL_ECHOPGM(" (disabled)"); + + SERIAL_EOL(); + + #endif // MESH_BED_LEVELING + } + +#endif // DEBUG_LEVELING_FEATURE diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h new file mode 100644 index 00000000..645a4be8 --- /dev/null +++ b/Marlin/src/core/utility.h @@ -0,0 +1,79 @@ +/** + * 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 "../core/types.h" +#include "../core/millis_t.h" + +// Delay that ensures heaters and watchdog are kept alive +void safe_delay(millis_t ms); + +#if ENABLED(SERIAL_OVERRUN_PROTECTION) + void serial_delay(const millis_t ms); +#else + inline void serial_delay(const millis_t) {} +#endif + +#if GRID_MAX_POINTS_X && GRID_MAX_POINTS_Y + + // 16x16 bit arrays + template + struct FlagBits { + typename IF<(W>8), uint16_t, uint8_t>::type bits[H]; + void fill() { memset(bits, 0xFF, sizeof(bits)); } + void reset() { memset(bits, 0x00, sizeof(bits)); } + void unmark(const uint8_t x, const uint8_t y) { CBI(bits[y], x); } + void mark(const uint8_t x, const uint8_t y) { SBI(bits[y], x); } + bool marked(const uint8_t x, const uint8_t y) { return TEST(bits[y], x); } + inline void unmark(const xy_int8_t &xy) { unmark(xy.x, xy.y); } + inline void mark(const xy_int8_t &xy) { mark(xy.x, xy.y); } + inline bool marked(const xy_int8_t &xy) { return marked(xy.x, xy.y); } + }; + + typedef FlagBits MeshFlags; + +#endif + +#if ENABLED(DEBUG_LEVELING_FEATURE) + void log_machine_info(); +#else + #define log_machine_info() NOOP +#endif + +template +class restorer { + T& ref_; + T val_; +public: + restorer(T& perm) : ref_(perm), val_(perm) {} + restorer(T& perm, T temp_val) : ref_(perm), val_(perm) { perm = temp_val; } + ~restorer() { restore(); } + inline void restore() { ref_ = val_; } +}; + +#define REMEMBER(N,X,V...) restorer<__typeof__(X)> restorer_##N(X, ##V) +#define RESTORE(N) restorer_##N.restore() + +// Converts from an uint8_t in the range of 0-255 to an uint8_t +// in the range 0-100 while avoiding rounding artifacts +constexpr uint8_t ui8_to_percent(const uint8_t i) { return (int(i) * 100 + 127) / 255; } diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp new file mode 100644 index 00000000..b0768814 --- /dev/null +++ b/Marlin/src/feature/babystep.cpp @@ -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 . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(BABYSTEPPING) + +#include "babystep.h" +#include "../MarlinCore.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) + #include "../gcode/gcode.h" +#endif + +Babystep babystep; + +volatile int16_t Babystep::steps[BS_AXIS_IND(Z_AXIS) + 1]; +#if ENABLED(BABYSTEP_DISPLAY_TOTAL) + int16_t Babystep::axis_total[BS_TOTAL_IND(Z_AXIS) + 1]; +#endif +int16_t Babystep::accum; + +void Babystep::step_axis(const AxisEnum axis) { + const int16_t curTodo = steps[BS_AXIS_IND(axis)]; // get rid of volatile for performance + if (curTodo) { + stepper.do_babystep((AxisEnum)axis, curTodo > 0); + if (curTodo > 0) steps[BS_AXIS_IND(axis)]--; else steps[BS_AXIS_IND(axis)]++; + } +} + +void Babystep::add_mm(const AxisEnum axis, const float &mm) { + add_steps(axis, mm * planner.settings.axis_steps_per_mm[axis]); +} + +void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { + 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; + TERN_(BABYSTEP_DISPLAY_TOTAL, axis_total[BS_TOTAL_IND(axis)] += distance); + TERN_(BABYSTEP_ALWAYS_AVAILABLE, gcode.reset_stepper_timeout()); + TERN_(INTEGRATED_BABYSTEPPING, if (has_steps()) stepper.initiateBabystepping()); +} + +#endif // BABYSTEPPING diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h new file mode 100644 index 00000000..f85e5909 --- /dev/null +++ b/Marlin/src/feature/babystep.h @@ -0,0 +1,82 @@ +/** + * 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" + +#if ENABLED(INTEGRATED_BABYSTEPPING) + #define BABYSTEPS_PER_SEC 1000UL + #define BABYSTEP_TICKS ((STEPPER_TIMER_RATE) / (BABYSTEPS_PER_SEC)) +#else + #define BABYSTEPS_PER_SEC 976UL + #define BABYSTEP_TICKS ((TEMP_TIMER_RATE) / (BABYSTEPS_PER_SEC)) +#endif + +#if IS_CORE || EITHER(BABYSTEP_XY, I2C_POSITION_ENCODERS) + #define BS_AXIS_IND(A) A + #define BS_AXIS(I) AxisEnum(I) +#else + #define BS_AXIS_IND(A) 0 + #define BS_AXIS(I) Z_AXIS +#endif + +#if ENABLED(BABYSTEP_DISPLAY_TOTAL) + #if ENABLED(BABYSTEP_XY) + #define BS_TOTAL_IND(A) A + #else + #define BS_TOTAL_IND(A) 0 + #endif +#endif + +class Babystep { +public: + static volatile int16_t steps[BS_AXIS_IND(Z_AXIS) + 1]; + static int16_t accum; // Total babysteps in current edit + + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) + static int16_t axis_total[BS_TOTAL_IND(Z_AXIS) + 1]; // Total babysteps since G28 + static inline void reset_total(const AxisEnum axis) { + if (TERN1(BABYSTEP_XY, axis == Z_AXIS)) + axis_total[BS_TOTAL_IND(axis)] = 0; + } + #endif + + static void add_steps(const AxisEnum axis, const int16_t distance); + static void add_mm(const AxisEnum axis, const float &mm); + + static inline bool has_steps() { + return steps[BS_AXIS_IND(X_AXIS)] || steps[BS_AXIS_IND(Y_AXIS)] || steps[BS_AXIS_IND(Z_AXIS)]; + } + + // + // Called by the Temperature or Stepper ISR to + // apply accumulated babysteps to the axes. + // + static inline void task() { + LOOP_LE_N(i, BS_AXIS_IND(Z_AXIS)) step_axis(BS_AXIS(i)); + } + +private: + static void step_axis(const AxisEnum axis); +}; + +extern Babystep babystep; diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp new file mode 100644 index 00000000..867e9cdd --- /dev/null +++ b/Marlin/src/feature/backlash.cpp @@ -0,0 +1,146 @@ +/** + * 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(BACKLASH_COMPENSATION) + +#include "backlash.h" + +#include "../module/motion.h" +#include "../module/planner.h" + +#ifdef BACKLASH_DISTANCE_MM + #if ENABLED(BACKLASH_GCODE) + xyz_float_t Backlash::distance_mm = BACKLASH_DISTANCE_MM; + #else + const xyz_float_t Backlash::distance_mm = BACKLASH_DISTANCE_MM; + #endif +#endif + +#if ENABLED(BACKLASH_GCODE) + uint8_t Backlash::correction = (BACKLASH_CORRECTION) * 0xFF; + #ifdef BACKLASH_SMOOTHING_MM + float Backlash::smoothing_mm = BACKLASH_SMOOTHING_MM; + #endif +#endif + +#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + xyz_float_t Backlash::measured_mm{0}; + xyz_uint8_t Backlash::measured_count{0}; +#endif + +Backlash backlash; + +/** + * To minimize seams in the printed part, backlash correction only adds + * steps to the current segment (instead of creating a new segment, which + * causes discontinuities and print artifacts). + * + * With a non-zero BACKLASH_SMOOTHING_MM value the backlash correction is + * spread over multiple segments, smoothing out artifacts even more. + */ + +void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block) { + static uint8_t last_direction_bits; + uint8_t changed_dir = last_direction_bits ^ dm; + // Ignore direction change if no steps are taken in that direction + if (da == 0) CBI(changed_dir, X_AXIS); + if (db == 0) CBI(changed_dir, Y_AXIS); + if (dc == 0) CBI(changed_dir, Z_AXIS); + last_direction_bits ^= changed_dir; + + if (correction == 0) return; + + #ifdef BACKLASH_SMOOTHING_MM + // The segment proportion is a value greater than 0.0 indicating how much residual_error + // is corrected for in this segment. The contribution is based on segment length and the + // smoothing distance. Since the computation of this proportion involves a floating point + // division, defer computation until needed. + float segment_proportion = 0; + + // Residual error carried forward across multiple segments, so correction can be applied + // to segments where there is no direction change. + static xyz_long_t residual_error{0}; + #else + // No direction change, no correction. + if (!changed_dir) return; + // No leftover residual error from segment to segment + xyz_long_t residual_error{0}; + #endif + + const float f_corr = float(correction) / 255.0f; + + LOOP_XYZ(axis) { + if (distance_mm[axis]) { + const bool reversing = TEST(dm,axis); + + // When an axis changes direction, add axis backlash to the residual error + if (TEST(changed_dir, axis)) + residual_error[axis] += (reversing ? -f_corr : f_corr) * distance_mm[axis] * planner.settings.axis_steps_per_mm[axis]; + + // Decide how much of the residual error to correct in this segment + int32_t error_correction = residual_error[axis]; + #ifdef BACKLASH_SMOOTHING_MM + if (error_correction && smoothing_mm != 0) { + // Take up a portion of the residual_error in this segment, but only when + // the current segment travels in the same direction as the correction + if (reversing == (error_correction < 0)) { + if (segment_proportion == 0) + segment_proportion = _MIN(1.0f, block->millimeters / smoothing_mm); + error_correction = CEIL(segment_proportion * error_correction); + } + else + error_correction = 0; // Don't take up any backlash in this segment, as it would subtract steps + } + #endif + // Making a correction reduces the residual error and adds block steps + if (error_correction) { + block->steps[axis] += ABS(error_correction); + residual_error[axis] -= error_correction; + } + } + } +} + +#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + #if HAS_CUSTOM_PROBE_PIN + #define TEST_PROBE_PIN (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) + #else + #define TEST_PROBE_PIN (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) + #endif + + // Measure Z backlash by raising nozzle in increments until probe deactivates + void Backlash::measure_with_probe() { + if (measured_count.z == 255) return; + + const float start_height = current_position.z; + while (current_position.z < (start_height + BACKLASH_MEASUREMENT_LIMIT) && TEST_PROBE_PIN) + do_blocking_move_to_z(current_position.z + BACKLASH_MEASUREMENT_RESOLUTION, MMM_TO_MMS(BACKLASH_MEASUREMENT_FEEDRATE)); + + // The backlash from all probe points is averaged, so count the number of measurements + measured_mm.z += current_position.z - start_height; + measured_count.z++; + } +#endif + +#endif // BACKLASH_COMPENSATION diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h new file mode 100644 index 00000000..8d00570f --- /dev/null +++ b/Marlin/src/feature/backlash.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/MarlinConfigPre.h" +#include "../module/planner.h" + +constexpr uint8_t all_on = 0xFF, all_off = 0x00; + +class Backlash { +public: + #if ENABLED(BACKLASH_GCODE) + static xyz_float_t distance_mm; + static uint8_t correction; + #ifdef BACKLASH_SMOOTHING_MM + static float smoothing_mm; + #endif + + static inline void set_correction(const float &v) { correction = _MAX(0, _MIN(1.0, v)) * all_on; } + static inline float get_correction() { return float(ui8_to_percent(correction)) / 100.0f; } + #else + static constexpr uint8_t correction = (BACKLASH_CORRECTION) * 0xFF; + static const xyz_float_t distance_mm; + #ifdef BACKLASH_SMOOTHING_MM + static constexpr float smoothing_mm = BACKLASH_SMOOTHING_MM; + #endif + #endif + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + private: + static xyz_float_t measured_mm; + static xyz_uint8_t measured_count; + public: + static void measure_with_probe(); + #endif + + static inline float get_measurement(const AxisEnum a) { + // Return the measurement averaged over all readings + return TERN(MEASURE_BACKLASH_WHEN_PROBING + , measured_count[a] > 0 ? measured_mm[a] / measured_count[a] : 0 + , 0 + ); + TERN(MEASURE_BACKLASH_WHEN_PROBING,,UNUSED(a)); + } + + static inline bool has_measurement(const AxisEnum a) { + return TERN0(MEASURE_BACKLASH_WHEN_PROBING, measured_count[a] > 0); + TERN(MEASURE_BACKLASH_WHEN_PROBING,,UNUSED(a)); + } + + static inline bool has_any_measurement() { + return has_measurement(X_AXIS) || has_measurement(Y_AXIS) || has_measurement(Z_AXIS); + } + + void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const uint8_t dm, block_t * const block); +}; + +extern Backlash backlash; diff --git a/Marlin/src/feature/baricuda.cpp b/Marlin/src/feature/baricuda.cpp new file mode 100644 index 00000000..59689170 --- /dev/null +++ b/Marlin/src/feature/baricuda.cpp @@ -0,0 +1,32 @@ +/** + * 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(BARICUDA) + +#include "baricuda.h" + +uint8_t baricuda_valve_pressure = 0, + baricuda_e_to_p_pressure = 0; + +#endif // BARICUDA diff --git a/Marlin/src/feature/baricuda.h b/Marlin/src/feature/baricuda.h new file mode 100644 index 00000000..f28d07d6 --- /dev/null +++ b/Marlin/src/feature/baricuda.h @@ -0,0 +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 . + * + */ +#pragma once + +extern uint8_t baricuda_valve_pressure, + baricuda_e_to_p_pressure; diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp new file mode 100644 index 00000000..39d8815f --- /dev/null +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -0,0 +1,413 @@ +/** + * 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(AUTO_BED_LEVELING_BILINEAR) + +#include "../bedlevel.h" + +#include "../../../module/motion.h" + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../../core/debug_out.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +xy_pos_t bilinear_grid_spacing, bilinear_start; +xy_float_t bilinear_grid_factor; +bed_mesh_t z_values; + +/** + * Extrapolate a single point from its neighbors + */ +static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { + if (!isnan(z_values[x][y])) return; + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPGM("Extrapolate ["); + if (x < 10) DEBUG_CHAR(' '); + DEBUG_ECHO((int)x); + DEBUG_CHAR(xdir ? (xdir > 0 ? '+' : '-') : ' '); + DEBUG_CHAR(' '); + if (y < 10) DEBUG_CHAR(' '); + DEBUG_ECHO((int)y); + DEBUG_CHAR(ydir ? (ydir > 0 ? '+' : '-') : ' '); + DEBUG_ECHOLNPGM("]"); + } + + // Get X neighbors, Y neighbors, and XY neighbors + const uint8_t x1 = x + xdir, y1 = y + ydir, x2 = x1 + xdir, y2 = y1 + ydir; + float a1 = z_values[x1][y ], a2 = z_values[x2][y ], + b1 = z_values[x ][y1], b2 = z_values[x ][y2], + c1 = z_values[x1][y1], c2 = z_values[x2][y2]; + + // Treat far unprobed points as zero, near as equal to far + if (isnan(a2)) a2 = 0.0; + if (isnan(a1)) a1 = a2; + if (isnan(b2)) b2 = 0.0; + if (isnan(b1)) b1 = b2; + if (isnan(c2)) c2 = 0.0; + if (isnan(c1)) c1 = c2; + + const float a = 2 * a1 - a2, b = 2 * b1 - b2, c = 2 * c1 - c2; + + // Take the average instead of the median + z_values[x][y] = (a + b + c) / 3.0; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + + // Median is robust (ignores outliers). + // z_values[x][y] = (a < b) ? ((b < c) ? b : (c < a) ? a : c) + // : ((c < b) ? b : (a < c) ? a : c); +} + +//Enable this if your SCARA uses 180° of total area +//#define EXTRAPOLATE_FROM_EDGE + +#if ENABLED(EXTRAPOLATE_FROM_EDGE) + #if GRID_MAX_POINTS_X < GRID_MAX_POINTS_Y + #define HALF_IN_X + #elif GRID_MAX_POINTS_Y < GRID_MAX_POINTS_X + #define HALF_IN_Y + #endif +#endif + +/** + * Fill in the unprobed points (corners of circular print surface) + * using linear extrapolation, away from the center. + */ +void extrapolate_unprobed_bed_level() { + #ifdef HALF_IN_X + constexpr uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; + #else + constexpr uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center + ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center + xlen = ctrx1; + #endif + + #ifdef HALF_IN_Y + constexpr uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; + #else + constexpr uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center + ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center + ylen = ctry1; + #endif + + LOOP_LE_N(xo, xlen) + LOOP_LE_N(yo, ylen) { + uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; + #ifndef HALF_IN_X + const uint8_t x1 = ctrx1 - xo; + #endif + #ifndef HALF_IN_Y + const uint8_t y1 = ctry1 - yo; + #ifndef HALF_IN_X + extrapolate_one_point(x1, y1, +1, +1); // left-below + + + #endif + extrapolate_one_point(x2, y1, -1, +1); // right-below - + + #endif + #ifndef HALF_IN_X + extrapolate_one_point(x1, y2, +1, -1); // left-above + - + #endif + extrapolate_one_point(x2, y2, -1, -1); // right-above - - + } + +} + +void print_bilinear_leveling_grid() { + SERIAL_ECHOLNPGM("Bilinear Leveling Grid:"); + print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 3, + [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } + ); +} + +#if ENABLED(ABL_BILINEAR_SUBDIVISION) + + #define ABL_GRID_POINTS_VIRT_X (GRID_MAX_POINTS_X - 1) * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_GRID_POINTS_VIRT_Y (GRID_MAX_POINTS_Y - 1) * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) + #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) + float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; + xy_pos_t bilinear_grid_spacing_virt; + xy_float_t bilinear_grid_factor_virt; + + void print_bilinear_leveling_grid_virt() { + SERIAL_ECHOLNPGM("Subdivided with CATMULL ROM Leveling Grid:"); + print_2d_array(ABL_GRID_POINTS_VIRT_X, ABL_GRID_POINTS_VIRT_Y, 5, + [](const uint8_t ix, const uint8_t iy) { return z_values_virt[ix][iy]; } + ); + } + + #define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) + float bed_level_virt_coord(const uint8_t x, const uint8_t y) { + uint8_t ep = 0, ip = 1; + if (!x || x == ABL_TEMP_POINTS_X - 1) { + if (x) { + ep = GRID_MAX_POINTS_X - 1; + ip = GRID_MAX_POINTS_X - 2; + } + if (WITHIN(y, 1, ABL_TEMP_POINTS_Y - 2)) + return LINEAR_EXTRAPOLATION( + z_values[ep][y - 1], + z_values[ip][y - 1] + ); + else + return LINEAR_EXTRAPOLATION( + bed_level_virt_coord(ep + 1, y), + bed_level_virt_coord(ip + 1, y) + ); + } + if (!y || y == ABL_TEMP_POINTS_Y - 1) { + if (y) { + ep = GRID_MAX_POINTS_Y - 1; + ip = GRID_MAX_POINTS_Y - 2; + } + if (WITHIN(x, 1, ABL_TEMP_POINTS_X - 2)) + return LINEAR_EXTRAPOLATION( + z_values[x - 1][ep], + z_values[x - 1][ip] + ); + else + return LINEAR_EXTRAPOLATION( + bed_level_virt_coord(x, ep + 1), + bed_level_virt_coord(x, ip + 1) + ); + } + return z_values[x - 1][y - 1]; + } + + static float bed_level_virt_cmr(const float p[4], const uint8_t i, const float t) { + return ( + p[i-1] * -t * sq(1 - t) + + p[i] * (2 - 5 * sq(t) + 3 * t * sq(t)) + + p[i+1] * t * (1 + 4 * t - 3 * sq(t)) + - p[i+2] * sq(t) * (1 - t) + ) * 0.5f; + } + + static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { + float row[4], column[4]; + LOOP_L_N(i, 4) { + LOOP_L_N(j, 4) { + column[j] = bed_level_virt_coord(i + x - 1, j + y - 1); + } + row[i] = bed_level_virt_cmr(column, 1, ty); + } + return bed_level_virt_cmr(row, 1, tx); + } + + void bed_level_virt_interpolate() { + bilinear_grid_spacing_virt = bilinear_grid_spacing / (BILINEAR_SUBDIVISIONS); + bilinear_grid_factor_virt = bilinear_grid_spacing_virt.reciprocal(); + LOOP_L_N(y, GRID_MAX_POINTS_Y) + LOOP_L_N(x, GRID_MAX_POINTS_X) + LOOP_L_N(ty, BILINEAR_SUBDIVISIONS) + LOOP_L_N(tx, BILINEAR_SUBDIVISIONS) { + if ((ty && y == (GRID_MAX_POINTS_Y) - 1) || (tx && x == (GRID_MAX_POINTS_X) - 1)) + continue; + z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] = + bed_level_virt_2cmr( + x + 1, + y + 1, + (float)tx / (BILINEAR_SUBDIVISIONS), + (float)ty / (BILINEAR_SUBDIVISIONS) + ); + } + } +#endif // ABL_BILINEAR_SUBDIVISION + +// Refresh after other values have been updated +void refresh_bed_level() { + bilinear_grid_factor = bilinear_grid_spacing.reciprocal(); + TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); +} + +#if ENABLED(ABL_BILINEAR_SUBDIVISION) + #define ABL_BG_SPACING(A) bilinear_grid_spacing_virt.A + #define ABL_BG_FACTOR(A) bilinear_grid_factor_virt.A + #define ABL_BG_POINTS_X ABL_GRID_POINTS_VIRT_X + #define ABL_BG_POINTS_Y ABL_GRID_POINTS_VIRT_Y + #define ABL_BG_GRID(X,Y) z_values_virt[X][Y] +#else + #define ABL_BG_SPACING(A) bilinear_grid_spacing.A + #define ABL_BG_FACTOR(A) bilinear_grid_factor.A + #define ABL_BG_POINTS_X GRID_MAX_POINTS_X + #define ABL_BG_POINTS_Y GRID_MAX_POINTS_Y + #define ABL_BG_GRID(X,Y) z_values[X][Y] +#endif + +// Get the Z adjustment for non-linear bed leveling +float bilinear_z_offset(const xy_pos_t &raw) { + + static float z1, d2, z3, d4, L, D; + + static xy_pos_t prev { -999.999, -999.999 }, ratio; + + // Whole units for the grid line indices. Constrained within bounds. + static xy_int8_t thisg, nextg, lastg { -99, -99 }; + + // XY relative to the probed area + xy_pos_t rel = raw - bilinear_start.asFloat(); + + #if ENABLED(EXTRAPOLATE_BEYOND_GRID) + #define FAR_EDGE_OR_BOX 2 // Keep using the last grid box + #else + #define FAR_EDGE_OR_BOX 1 // Just use the grid far edge + #endif + + if (prev.x != rel.x) { + prev.x = rel.x; + ratio.x = rel.x * ABL_BG_FACTOR(x); + const float gx = constrain(FLOOR(ratio.x), 0, ABL_BG_POINTS_X - (FAR_EDGE_OR_BOX)); + ratio.x -= gx; // Subtract whole to get the ratio within the grid box + + #if DISABLED(EXTRAPOLATE_BEYOND_GRID) + // Beyond the grid maintain height at grid edges + NOLESS(ratio.x, 0); // Never <0 (>1 is ok when nextg.x==thisg.x) + #endif + + thisg.x = gx; + nextg.x = _MIN(thisg.x + 1, ABL_BG_POINTS_X - 1); + } + + if (prev.y != rel.y || lastg.x != thisg.x) { + + if (prev.y != rel.y) { + prev.y = rel.y; + ratio.y = rel.y * ABL_BG_FACTOR(y); + const float gy = constrain(FLOOR(ratio.y), 0, ABL_BG_POINTS_Y - (FAR_EDGE_OR_BOX)); + ratio.y -= gy; + + #if DISABLED(EXTRAPOLATE_BEYOND_GRID) + // Beyond the grid maintain height at grid edges + NOLESS(ratio.y, 0); // Never < 0.0. (> 1.0 is ok when nextg.y==thisg.y.) + #endif + + thisg.y = gy; + nextg.y = _MIN(thisg.y + 1, ABL_BG_POINTS_Y - 1); + } + + if (lastg != thisg) { + lastg = thisg; + // Z at the box corners + z1 = ABL_BG_GRID(thisg.x, thisg.y); // left-front + d2 = ABL_BG_GRID(thisg.x, nextg.y) - z1; // left-back (delta) + z3 = ABL_BG_GRID(nextg.x, thisg.y); // right-front + d4 = ABL_BG_GRID(nextg.x, nextg.y) - z3; // right-back (delta) + } + + // Bilinear interpolate. Needed since rel.y or thisg.x has changed. + L = z1 + d2 * ratio.y; // Linear interp. LF -> LB + const float R = z3 + d4 * ratio.y; // Linear interp. RF -> RB + + D = R - L; + } + + const float offset = L + ratio.x * D; // the offset almost always changes + + /* + static float last_offset = 0; + if (ABS(last_offset - offset) > 0.2) { + SERIAL_ECHOLNPAIR("Sudden Shift at x=", rel.x, " / ", bilinear_grid_spacing.x, " -> thisg.x=", thisg.x); + SERIAL_ECHOLNPAIR(" y=", rel.y, " / ", bilinear_grid_spacing.y, " -> thisg.y=", thisg.y); + SERIAL_ECHOLNPAIR(" ratio.x=", ratio.x, " ratio.y=", ratio.y); + SERIAL_ECHOLNPAIR(" z1=", z1, " z2=", z2, " z3=", z3, " z4=", z4); + SERIAL_ECHOLNPAIR(" L=", L, " R=", R, " offset=", offset); + } + last_offset = offset; + //*/ + + return offset; +} + +#if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + + #define CELL_INDEX(A,V) ((V - bilinear_start.A) * ABL_BG_FACTOR(A)) + + /** + * Prepare a bilinear-leveled linear move on Cartesian, + * splitting the move where it crosses grid borders. + */ + void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { + // Get current and destination cells for this line + xy_int_t c1 { CELL_INDEX(x, current_position.x), CELL_INDEX(y, current_position.y) }, + c2 { CELL_INDEX(x, destination.x), CELL_INDEX(y, destination.y) }; + LIMIT(c1.x, 0, ABL_BG_POINTS_X - 2); + LIMIT(c1.y, 0, ABL_BG_POINTS_Y - 2); + LIMIT(c2.x, 0, ABL_BG_POINTS_X - 2); + LIMIT(c2.y, 0, ABL_BG_POINTS_Y - 2); + + // Start and end in the same cell? No split needed. + if (c1 == c2) { + current_position = destination; + line_to_current_position(scaled_fr_mm_s); + return; + } + + #define LINE_SEGMENT_END(A) (current_position.A + (destination.A - current_position.A) * normalized_dist) + + float normalized_dist; + xyze_pos_t end; + const xy_int8_t gc { _MAX(c1.x, c2.x), _MAX(c1.y, c2.y) }; + + // Crosses on the X and not already split on this X? + // The x_splits flags are insurance against rounding errors. + if (c2.x != c1.x && TEST(x_splits, gc.x)) { + // Split on the X grid line + CBI(x_splits, gc.x); + end = destination; + destination.x = bilinear_start.x + ABL_BG_SPACING(x) * gc.x; + normalized_dist = (destination.x - current_position.x) / (end.x - current_position.x); + destination.y = LINE_SEGMENT_END(y); + } + // Crosses on the Y and not already split on this Y? + else if (c2.y != c1.y && TEST(y_splits, gc.y)) { + // Split on the Y grid line + CBI(y_splits, gc.y); + end = destination; + destination.y = bilinear_start.y + ABL_BG_SPACING(y) * gc.y; + normalized_dist = (destination.y - current_position.y) / (end.y - current_position.y); + destination.x = LINE_SEGMENT_END(x); + } + else { + // Must already have been split on these border(s) + // This should be a rare case. + current_position = destination; + line_to_current_position(scaled_fr_mm_s); + return; + } + + destination.z = LINE_SEGMENT_END(z); + destination.e = LINE_SEGMENT_END(e); + + // Do the split and look for more borders + bilinear_line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + + // Restore destination from stack + destination = end; + bilinear_line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + } + +#endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES + +#endif // AUTO_BED_LEVELING_BILINEAR diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h new file mode 100644 index 00000000..bbe2411d --- /dev/null +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -0,0 +1,45 @@ +/** + * 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" + +extern xy_pos_t bilinear_grid_spacing, bilinear_start; +extern xy_float_t bilinear_grid_factor; +extern bed_mesh_t z_values; +float bilinear_z_offset(const xy_pos_t &raw); + +void extrapolate_unprobed_bed_level(); +void print_bilinear_leveling_grid(); +void refresh_bed_level(); +#if ENABLED(ABL_BILINEAR_SUBDIVISION) + void print_bilinear_leveling_grid_virt(); + void bed_level_virt_interpolate(); +#endif + +#if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); +#endif + +#define _GET_MESH_X(I) float(bilinear_start.x + (I) * bilinear_grid_spacing.x) +#define _GET_MESH_Y(J) float(bilinear_start.y + (J) * bilinear_grid_spacing.y) +#define Z_VALUES_ARR z_values diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp new file mode 100644 index 00000000..3e9225b7 --- /dev/null +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -0,0 +1,239 @@ +/** + * 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_LEVELING + +#include "bedlevel.h" +#include "../../module/planner.h" + +#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) + #include "../../module/motion.h" +#endif + +#if ENABLED(PROBE_MANUALLY) + bool g29_in_progress = false; +#endif + +#if ENABLED(LCD_BED_LEVELING) + #include "../../lcd/ultralcd.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +bool leveling_is_valid() { + return TERN1(MESH_BED_LEVELING, mbl.has_mesh()) + && TERN1(AUTO_BED_LEVELING_BILINEAR, !!bilinear_grid_spacing.x) + && TERN1(AUTO_BED_LEVELING_UBL, ubl.mesh_is_valid()); +} + +/** + * Turn bed leveling on or off, fixing the current + * position as-needed. + * + * Disable: Current position = physical position + * Enable: Current position = "unleveled" physical position + */ +void set_bed_leveling_enabled(const bool enable/*=true*/) { + + const bool can_change = TERN1(AUTO_BED_LEVELING_BILINEAR, !enable || leveling_is_valid()); + + if (can_change && enable != planner.leveling_active) { + + planner.synchronize(); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + // Force bilinear_z_offset to re-calculate next time + const xyz_pos_t reset { -9999.999, -9999.999, 0 }; + (void)bilinear_z_offset(reset); + #endif + + if (planner.leveling_active) { // leveling from on to off + if (DEBUGGING(LEVELING)) DEBUG_POS("Leveling ON", current_position); + // change unleveled current_position to physical current_position without moving steppers. + planner.apply_leveling(current_position); + planner.leveling_active = false; // disable only AFTER calling apply_leveling + if (DEBUGGING(LEVELING)) DEBUG_POS("...Now OFF", current_position); + } + else { // leveling from off to on + if (DEBUGGING(LEVELING)) DEBUG_POS("Leveling OFF", current_position); + planner.leveling_active = true; // enable BEFORE calling unapply_leveling, otherwise ignored + // change physical current_position to unleveled current_position without moving steppers. + planner.unapply_leveling(current_position); + if (DEBUGGING(LEVELING)) DEBUG_POS("...Now ON", current_position); + } + + sync_plan_position(); + } +} + +TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved(planner.leveling_active) { + set_bed_leveling_enabled(enable); +} + +#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + + void set_z_fade_height(const float zfh, const bool do_report/*=true*/) { + + if (planner.z_fade_height == zfh) return; + + const bool leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + + planner.set_z_fade_height(zfh); + + if (leveling_was_active) { + const xyz_pos_t oldpos = current_position; + set_bed_leveling_enabled(true); + if (do_report && oldpos != current_position) + report_current_position(); + } + } + +#endif // ENABLE_LEVELING_FADE_HEIGHT + +/** + * Reset calibration results to zero. + */ +void reset_bed_level() { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("reset_bed_level"); + #if ENABLED(AUTO_BED_LEVELING_UBL) + ubl.reset(); + #else + set_bed_leveling_enabled(false); + #if ENABLED(MESH_BED_LEVELING) + mbl.reset(); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + bilinear_start.reset(); + bilinear_grid_spacing.reset(); + GRID_LOOP(x, y) { + z_values[x][y] = NAN; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, 0)); + } + #elif ABL_PLANAR + planner.bed_level_matrix.set_to_identity(); + #endif + #endif +} + +#if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) + + /** + * Enable to produce output in JSON format suitable + * for SCAD or JavaScript mesh visualizers. + * + * Visualize meshes in OpenSCAD using the included script. + * + * buildroot/shared/scripts/MarlinMesh.scad + */ + //#define SCAD_MESH_OUTPUT + + /** + * Print calibration results for plotting or manual frame adjustment. + */ + void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn) { + #ifndef SCAD_MESH_OUTPUT + LOOP_L_N(x, sx) { + serial_spaces(precision + (x < 10 ? 3 : 2)); + SERIAL_ECHO(int(x)); + } + SERIAL_EOL(); + #endif + #ifdef SCAD_MESH_OUTPUT + SERIAL_ECHOLNPGM("measured_z = ["); // open 2D array + #endif + LOOP_L_N(y, sy) { + #ifdef SCAD_MESH_OUTPUT + SERIAL_ECHOPGM(" ["); // open sub-array + #else + if (y < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(int(y)); + #endif + LOOP_L_N(x, sx) { + SERIAL_CHAR(' '); + const float offset = fn(x, y); + if (!isnan(offset)) { + if (offset >= 0) SERIAL_CHAR('+'); + SERIAL_ECHO_F(offset, int(precision)); + } + else { + #ifdef SCAD_MESH_OUTPUT + for (uint8_t i = 3; i < precision + 3; i++) + SERIAL_CHAR(' '); + SERIAL_ECHOPGM("NAN"); + #else + LOOP_L_N(i, precision + 3) + SERIAL_CHAR(i ? '=' : ' '); + #endif + } + #ifdef SCAD_MESH_OUTPUT + if (x < sx - 1) SERIAL_CHAR(','); + #endif + } + #ifdef SCAD_MESH_OUTPUT + SERIAL_CHAR(' ', ']'); // close sub-array + if (y < sy - 1) SERIAL_CHAR(','); + #endif + SERIAL_EOL(); + } + #ifdef SCAD_MESH_OUTPUT + SERIAL_ECHOPGM("];"); // close 2D array + #endif + SERIAL_EOL(); + } + +#endif // AUTO_BED_LEVELING_BILINEAR || MESH_BED_LEVELING + +#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) + + void _manual_goto_xy(const xy_pos_t &pos) { + + #ifdef MANUAL_PROBE_START_Z + constexpr float startz = _MAX(0, MANUAL_PROBE_START_Z); + #if MANUAL_PROBE_HEIGHT > 0 + do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); + do_blocking_move_to_z(startz); + #else + do_blocking_move_to_xy_z(pos, startz); + #endif + #elif MANUAL_PROBE_HEIGHT > 0 + const float prev_z = current_position.z; + do_blocking_move_to_xy_z(pos, MANUAL_PROBE_HEIGHT); + do_blocking_move_to_z(prev_z); + #else + do_blocking_move_to_xy(pos); + #endif + + current_position = pos; + + TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + } + +#endif + +#endif // HAS_LEVELING diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h new file mode 100644 index 00000000..995e9d0d --- /dev/null +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -0,0 +1,98 @@ +/** + * 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" + +#if ENABLED(PROBE_MANUALLY) + extern bool g29_in_progress; +#else + constexpr bool g29_in_progress = false; +#endif + +bool leveling_is_valid(); +void set_bed_leveling_enabled(const bool enable=true); +void reset_bed_level(); + +#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + void set_z_fade_height(const float zfh, const bool do_report=true); +#endif + +#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) + void _manual_goto_xy(const xy_pos_t &pos); +#endif + +/** + * A class to save and change the bed leveling state, + * then restore it when it goes out of scope. + */ +class TemporaryBedLevelingState { + bool saved; + public: + TemporaryBedLevelingState(const bool enable); + ~TemporaryBedLevelingState() { set_bed_leveling_enabled(saved); } +}; +#define TEMPORARY_BED_LEVELING_STATE(enable) const TemporaryBedLevelingState tbls(enable) + +#if HAS_MESH + + typedef float bed_mesh_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + #include "abl/abl.h" + #elif ENABLED(AUTO_BED_LEVELING_UBL) + #include "ubl/ubl.h" + #elif ENABLED(MESH_BED_LEVELING) + #include "mbl/mesh_bed_leveling.h" + #endif + + #define Z_VALUES(X,Y) Z_VALUES_ARR[X][Y] + #define _GET_MESH_POS(M) { _GET_MESH_X(M.a), _GET_MESH_Y(M.b) } + + #if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) + + #include + + typedef float (*element_2d_fn)(const uint8_t, const uint8_t); + + /** + * Print calibration results for plotting or manual frame adjustment. + */ + void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, element_2d_fn fn); + + #endif + + struct mesh_index_pair { + xy_int8_t pos; + float distance; // When populated, the distance from the search location + void invalidate() { pos = -1; } + bool valid() const { return pos.x >= 0 && pos.y >= 0; } + #if ENABLED(AUTO_BED_LEVELING_UBL) + xy_pos_t meshpos() { + return { ubl.mesh_index_to_xpos(pos.x), ubl.mesh_index_to_ypos(pos.y) }; + } + #endif + operator xy_int8_t&() { return pos; } + operator const xy_int8_t&() const { return pos; } + }; + +#endif diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp new file mode 100644 index 00000000..1200c2a1 --- /dev/null +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -0,0 +1,133 @@ +/** + * 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(MESH_BED_LEVELING) + + #include "../bedlevel.h" + + #include "../../../module/motion.h" + + #if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" + #endif + + mesh_bed_leveling mbl; + + float mesh_bed_leveling::z_offset, + mesh_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y], + mesh_bed_leveling::index_to_xpos[GRID_MAX_POINTS_X], + mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y]; + + mesh_bed_leveling::mesh_bed_leveling() { + LOOP_L_N(i, GRID_MAX_POINTS_X) + index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST); + LOOP_L_N(i, GRID_MAX_POINTS_Y) + index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST); + reset(); + } + + void mesh_bed_leveling::reset() { + z_offset = 0; + ZERO(z_values); + #if ENABLED(EXTENSIBLE_UI) + GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); + #endif + } + + #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + + /** + * Prepare a mesh-leveled linear move in a Cartesian setup, + * splitting the move where it crosses mesh borders. + */ + void mesh_bed_leveling::line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { + // Get current and destination cells for this line + xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); + NOMORE(scel.x, GRID_MAX_POINTS_X - 2); + NOMORE(scel.y, GRID_MAX_POINTS_Y - 2); + NOMORE(ecel.x, GRID_MAX_POINTS_X - 2); + NOMORE(ecel.y, GRID_MAX_POINTS_Y - 2); + + // Start and end in the same cell? No split needed. + if (scel == ecel) { + line_to_destination(scaled_fr_mm_s); + current_position = destination; + return; + } + + #define MBL_SEGMENT_END(A) (current_position.A + (destination.A - current_position.A) * normalized_dist) + + float normalized_dist; + xyze_pos_t dest; + const int8_t gcx = _MAX(scel.x, ecel.x), gcy = _MAX(scel.y, ecel.y); + + // Crosses on the X and not already split on this X? + // The x_splits flags are insurance against rounding errors. + if (ecel.x != scel.x && TEST(x_splits, gcx)) { + // Split on the X grid line + CBI(x_splits, gcx); + dest = destination; + destination.x = index_to_xpos[gcx]; + normalized_dist = (destination.x - current_position.x) / (dest.x - current_position.x); + destination.y = MBL_SEGMENT_END(y); + } + // Crosses on the Y and not already split on this Y? + else if (ecel.y != scel.y && TEST(y_splits, gcy)) { + // Split on the Y grid line + CBI(y_splits, gcy); + dest = destination; + destination.y = index_to_ypos[gcy]; + normalized_dist = (destination.y - current_position.y) / (dest.y - current_position.y); + destination.x = MBL_SEGMENT_END(x); + } + else { + // Must already have been split on these border(s) + // This should be a rare case. + line_to_destination(scaled_fr_mm_s); + current_position = destination; + return; + } + + destination.z = MBL_SEGMENT_END(z); + destination.e = MBL_SEGMENT_END(e); + + // Do the split and look for more borders + line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + + // Restore destination from stack + destination = dest; + line_to_destination(scaled_fr_mm_s, x_splits, y_splits); + } + + #endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES + + void mesh_bed_leveling::report_mesh() { + SERIAL_ECHOPAIR_F(STRINGIFY(GRID_MAX_POINTS_X) "x" STRINGIFY(GRID_MAX_POINTS_Y) " mesh. Z offset: ", z_offset, 5); + SERIAL_ECHOLNPGM("\nMeasured points:"); + print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 5, + [](const uint8_t ix, const uint8_t iy) { return z_values[ix][iy]; } + ); + } + +#endif // MESH_BED_LEVELING diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h new file mode 100644 index 00000000..ade7a931 --- /dev/null +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -0,0 +1,127 @@ +/** + * 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" + +enum MeshLevelingState : char { + MeshReport, // G29 S0 + MeshStart, // G29 S1 + MeshNext, // G29 S2 + MeshSet, // G29 S3 + MeshSetZOffset, // G29 S4 + MeshReset // G29 S5 +}; + +#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) +#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) +#define _GET_MESH_X(I) mbl.index_to_xpos[I] +#define _GET_MESH_Y(J) mbl.index_to_ypos[J] +#define Z_VALUES_ARR mbl.z_values + +class mesh_bed_leveling { +public: + static float z_offset, + z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y], + index_to_xpos[GRID_MAX_POINTS_X], + index_to_ypos[GRID_MAX_POINTS_Y]; + + mesh_bed_leveling(); + + static void report_mesh(); + + static void reset(); + + FORCE_INLINE static bool has_mesh() { + GRID_LOOP(x, y) if (z_values[x][y]) return true; + return false; + } + + static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + + static inline void zigzag(const int8_t index, int8_t &px, int8_t &py) { + px = index % (GRID_MAX_POINTS_X); + py = index / (GRID_MAX_POINTS_X); + if (py & 1) px = (GRID_MAX_POINTS_X - 1) - px; // Zig zag + } + + static void set_zigzag_z(const int8_t index, const float &z) { + int8_t px, py; + zigzag(index, px, py); + set_z(px, py, z); + } + + static int8_t cell_index_x(const float &x) { + int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); + return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); + } + static int8_t cell_index_y(const float &y) { + int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); + return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); + } + static inline xy_int8_t cell_indexes(const float &x, const float &y) { + return { cell_index_x(x), cell_index_y(y) }; + } + static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + + static int8_t probe_index_x(const float &x) { + int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); + return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + } + static int8_t probe_index_y(const float &y) { + int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); + return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + } + static inline xy_int8_t probe_indexes(const float &x, const float &y) { + return { probe_index_x(x), probe_index_y(y) }; + } + static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } + + static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + const float delta_z = (z2 - z1) / (a2 - a1), + delta_a = a0 - a1; + return z1 + delta_a * delta_z; + } + + static float get_z(const xy_pos_t &pos + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + , const float &factor=1.0f + #endif + ) { + #if DISABLED(ENABLE_LEVELING_FADE_HEIGHT) + constexpr float factor = 1.0f; + #endif + const xy_int8_t ind = cell_indexes(pos); + const float x1 = index_to_xpos[ind.x], x2 = index_to_xpos[ind.x+1], + y1 = index_to_xpos[ind.y], y2 = index_to_xpos[ind.y+1], + z1 = calc_z0(pos.x, x1, z_values[ind.x][ind.y ], x2, z_values[ind.x+1][ind.y ]), + z2 = calc_z0(pos.x, x1, z_values[ind.x][ind.y+1], x2, z_values[ind.x+1][ind.y+1]); + + return z_offset + calc_z0(pos.y, y1, z1, y2, z2) * factor; + } + + #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) + static void line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); + #endif +}; + +extern mesh_bed_leveling mbl; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp new file mode 100644 index 00000000..087fdf42 --- /dev/null +++ b/Marlin/src/feature/bedlevel/ubl/ubl.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 ENABLED(AUTO_BED_LEVELING_UBL) + + #include "../bedlevel.h" + + unified_bed_leveling ubl; + + #include "../../../MarlinCore.h" + #include "../../../gcode/gcode.h" + + #include "../../../module/settings.h" + #include "../../../module/planner.h" + #include "../../../module/motion.h" + #include "../../../module/probe.h" + + #if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" + #endif + + #include "math.h" + + void unified_bed_leveling::echo_name() { + SERIAL_ECHOPGM("Unified Bed Leveling"); + } + + void unified_bed_leveling::report_current_mesh() { + if (!leveling_is_valid()) return; + SERIAL_ECHO_MSG(" G29 I999"); + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" M421 I", int(x), " J", int(y)); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); + serial_delay(75); // Prevent Printrun from exploding + } + } + + void unified_bed_leveling::report_state() { + echo_name(); + SERIAL_ECHO_TERNARY(planner.leveling_active, " System v" UBL_VERSION " ", "", "in", "active\n"); + serial_delay(50); + } + + int8_t unified_bed_leveling::storage_slot; + + float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + + #define _GRIDPOS(A,N) (MESH_MIN_##A + N * (MESH_##A##_DIST)) + + const float + unified_bed_leveling::_mesh_index_to_xpos[GRID_MAX_POINTS_X] PROGMEM = ARRAY_N(GRID_MAX_POINTS_X, + _GRIDPOS(X, 0), _GRIDPOS(X, 1), _GRIDPOS(X, 2), _GRIDPOS(X, 3), + _GRIDPOS(X, 4), _GRIDPOS(X, 5), _GRIDPOS(X, 6), _GRIDPOS(X, 7), + _GRIDPOS(X, 8), _GRIDPOS(X, 9), _GRIDPOS(X, 10), _GRIDPOS(X, 11), + _GRIDPOS(X, 12), _GRIDPOS(X, 13), _GRIDPOS(X, 14), _GRIDPOS(X, 15) + ), + unified_bed_leveling::_mesh_index_to_ypos[GRID_MAX_POINTS_Y] PROGMEM = ARRAY_N(GRID_MAX_POINTS_Y, + _GRIDPOS(Y, 0), _GRIDPOS(Y, 1), _GRIDPOS(Y, 2), _GRIDPOS(Y, 3), + _GRIDPOS(Y, 4), _GRIDPOS(Y, 5), _GRIDPOS(Y, 6), _GRIDPOS(Y, 7), + _GRIDPOS(Y, 8), _GRIDPOS(Y, 9), _GRIDPOS(Y, 10), _GRIDPOS(Y, 11), + _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) + ); + + volatile int16_t unified_bed_leveling::encoder_diff; + + unified_bed_leveling::unified_bed_leveling() { + reset(); + } + + void unified_bed_leveling::reset() { + const bool was_enabled = planner.leveling_active; + set_bed_leveling_enabled(false); + storage_slot = -1; + ZERO(z_values); + #if ENABLED(EXTENSIBLE_UI) + GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); + #endif + if (was_enabled) report_current_position(); + } + + void unified_bed_leveling::invalidate() { + set_bed_leveling_enabled(false); + set_all_mesh_points_to_value(NAN); + } + + void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { + GRID_LOOP(x, y) { + z_values[x][y] = value; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); + } + } + + static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { + SERIAL_ECHO_SP(sp); + SERIAL_CHAR('('); + if (x < 100) { SERIAL_CHAR(' '); if (x < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(x); + SERIAL_CHAR(','); + if (y < 100) { SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(y); + SERIAL_CHAR(')'); + serial_delay(5); + } + + static void serial_echo_column_labels(const uint8_t sp) { + SERIAL_ECHO_SP(7); + for (int8_t i = 0; i < GRID_MAX_POINTS_X; i++) { + if (i < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(i); + SERIAL_ECHO_SP(sp); + } + serial_delay(10); + } + + /** + * Produce one of these mesh maps: + * 0: Human-readable + * 1: CSV format for spreadsheet import + * 2: TODO: Display on Graphical LCD + * 4: Compact Human-Readable + */ + void unified_bed_leveling::display_map(const int map_type) { + const bool was = gcode.set_autoreport_paused(true); + + constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] + twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each + + const bool human = !(map_type & 0x3), csv = map_type == 1, lcd = map_type == 2, comp = map_type & 0x4; + + SERIAL_ECHOPGM("\nBed Topography Report"); + if (human) { + SERIAL_ECHOLNPGM(":\n"); + serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); + serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); + SERIAL_EOL(); + serial_echo_column_labels(eachsp - 2); + } + else { + SERIAL_ECHOPGM(" for "); + serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); + } + + // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when + // moving to the XY position to be measured. This ensures better agreement between + // the current Z position after G28 and the mesh values. + const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); + + if (!lcd) SERIAL_EOL(); + for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { + + // Row Label (J index) + if (human) { + if (j < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(j); + SERIAL_ECHOPGM(" |"); + } + + // Row Values (I indexes) + LOOP_L_N(i, GRID_MAX_POINTS_X) { + + // Opening Brace or Space + const bool is_current = i == curr.x && j == curr.y; + if (human) SERIAL_CHAR(is_current ? '[' : ' '); + + // Z Value at current I, J + const float f = z_values[i][j]; + if (lcd) { + // TODO: Display on Graphical LCD + } + else if (isnan(f)) + serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); + else if (human || csv) { + if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Space for positive ('-' for negative) + SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits + } + if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); + + // Closing Brace or Space + if (human) SERIAL_CHAR(is_current ? ']' : ' '); + + SERIAL_FLUSHTX(); + idle_no_sleep(); + } + if (!lcd) SERIAL_EOL(); + + // A blank line between rows (unless compact) + if (j && human && !comp) SERIAL_ECHOLNPGM(" |"); + } + + if (human) { + serial_echo_column_labels(eachsp - 2); + SERIAL_EOL(); + serial_echo_xy(4, MESH_MIN_X, MESH_MIN_Y); + serial_echo_xy(twixt, MESH_MAX_X, MESH_MIN_Y); + SERIAL_EOL(); + SERIAL_EOL(); + } + + gcode.set_autoreport_paused(was); + } + + bool unified_bed_leveling::sanity_check() { + uint8_t error_flag = 0; + + if (settings.calc_num_meshes() < 1) { + SERIAL_ECHOLNPGM("?Mesh too big for EEPROM."); + error_flag++; + } + + return !!error_flag; + } + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h new file mode 100644 index 00000000..9ac9de18 --- /dev/null +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -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 . + * + */ +#pragma once + +//#define UBL_DEVEL_DEBUGGING + +#include "../../../module/motion.h" + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../../core/debug_out.h" + +#define UBL_VERSION "1.01" +#define UBL_OK false +#define UBL_ERR true + +enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP }; + +// External references + +struct mesh_index_pair; + +#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) +#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) + +class unified_bed_leveling { + private: + + static int g29_verbose_level, + g29_phase_value, + g29_repetition_cnt, + g29_storage_slot, + g29_map_type; + static bool g29_c_flag; + static float g29_card_thickness, + g29_constant; + static xy_pos_t g29_pos; + static xy_bool_t xy_seen; + + #if HAS_BED_PROBE + static int g29_grid_size; + #endif + + #if ENABLED(NEWPANEL) + static void move_z_with_encoder(const float &multiplier); + static float measure_point_with_encoder(); + static float measure_business_card_thickness(float in_height); + static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; + static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; + #endif + + static bool g29_parameter_parsing() _O0; + static void shift_mesh_height(); + static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; + static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); + static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); + static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); + static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { + return smart_fill_one(pos.x, pos.y, dir.x, dir.y); + } + static void smart_fill_mesh(); + + #if ENABLED(UBL_DEVEL_DEBUGGING) + static void g29_what_command(); + static void g29_eeprom_dump(); + static void g29_compare_current_mesh_to_stored_mesh(); + #endif + + public: + + static void echo_name(); + static void report_current_mesh(); + static void report_state(); + static void save_ubl_active_state_and_disable(); + static void restore_ubl_active_state_and_leave(); + static void display_map(const int) _O0; + static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; + static mesh_index_pair find_furthest_invalid_mesh_point() _O0; + static void reset(); + static void invalidate(); + static void set_all_mesh_points_to_value(const float value); + static void adjust_mesh_to_mean(const bool cflag, const float value); + static bool sanity_check(); + + static void G29() _O0; // O0 for no optimization + static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 + + static int8_t storage_slot; + + static bed_mesh_t z_values; + static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], + _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; + + #if HAS_LCD_MENU + static bool lcd_map_control; + static void steppers_were_disabled(); + #else + static inline void steppers_were_disabled() {} + #endif + + static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time + + unified_bed_leveling(); + + FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + + static int8_t cell_index_x(const float &x) { + const int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); + return constrain(cx, 0, (GRID_MAX_POINTS_X) - 1); // -1 is appropriate if we want all movement to the X_MAX + } // position. But with this defined this way, it is possible + // to extrapolate off of this point even further out. Probably + // that is OK because something else should be keeping that from + // happening and should not be worried about at this level. + static int8_t cell_index_y(const float &y) { + const int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); + return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 1); // -1 is appropriate if we want all movement to the Y_MAX + } // position. But with this defined this way, it is possible + // to extrapolate off of this point even further out. Probably + // that is OK because something else should be keeping that from + // happening and should not be worried about at this level. + + static inline xy_int8_t cell_indexes(const float &x, const float &y) { + return { cell_index_x(x), cell_index_y(y) }; + } + static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + + static int8_t closest_x_index(const float &x) { + const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); + return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + } + static int8_t closest_y_index(const float &y) { + const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); + return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + } + static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { + return { closest_x_index(xy.x), closest_y_index(xy.y) }; + } + + /** + * z2 --| + * z0 | | + * | | + (z2-z1) + * z1 | | | + * ---+-------------+--------+-- --| + * a1 a0 a2 + * |<---delta_a---------->| + * + * calc_z0 is the basis for all the Mesh Based correction. It is used to + * find the expected Z Height at a position between two known Z-Height locations. + * + * It is fairly expensive with its 4 floating point additions and 2 floating point + * multiplications. + */ + FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); + } + + /** + * z_correction_for_x_on_horizontal_mesh_line is an optimization for + * the case where the printer is making a vertical line that only crosses horizontal mesh lines. + */ + static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { + if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + + if (DEBUGGING(LEVELING)) { + if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); + DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); + } + + // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. + return ( + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + UBL_Z_RAISE_WHEN_OFF_MESH + #else + NAN + #endif + ); + } + + const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), + z1 = z_values[x1_i][yi]; + + return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. + } + + // + // See comments above for z_correction_for_x_on_horizontal_mesh_line + // + static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { + if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { + + if (DEBUGGING(LEVELING)) { + if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); + DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); + } + + // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. + return ( + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + UBL_Z_RAISE_WHEN_OFF_MESH + #else + NAN + #endif + ); + } + + const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), + z1 = z_values[xi][y1_i]; + + return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. + } + + /** + * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first + * does a linear interpolation along both of the bounding X-Mesh-Lines to find the + * Z-Height at both ends. Then it does a linear interpolation of these heights based + * on the Y position within the cell. + */ + static float get_z_correction(const float &rx0, const float &ry0) { + const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped + + /** + * Check if the requested location is off the mesh. If so, and + * UBL_Z_RAISE_WHEN_OFF_MESH is specified, that value is returned. + */ + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + if (!WITHIN(rx0, MESH_MIN_X, MESH_MAX_X) || !WITHIN(ry0, MESH_MIN_Y, MESH_MAX_Y)) + return UBL_Z_RAISE_WHEN_OFF_MESH; + #endif + + const float z1 = calc_z0(rx0, + mesh_index_to_xpos(cx), z_values[cx][cy], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); + + const float z2 = calc_z0(rx0, + mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); + + float z0 = calc_z0(ry0, + mesh_index_to_ypos(cy), z1, + mesh_index_to_ypos(cy + 1), z2); + + if (DEBUGGING(MESH_ADJUST)) { + DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); + DEBUG_CHAR(','); DEBUG_ECHO(ry0); + DEBUG_ECHOPAIR_F(") = ", z0, 6); + DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); + } + + if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN + z0 = 0.0; // in ubl.z_values[][] and propagate through the + // calculations. If our correction is NAN, we throw it out + // because part of the Mesh is undefined and we don't have the + // information we need to complete the height correction. + + if (DEBUGGING(MESH_ADJUST)) { + DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); + DEBUG_CHAR(','); + DEBUG_ECHO(ry0); + DEBUG_CHAR(')'); + DEBUG_EOL(); + } + } + return z0; + } + static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } + + static inline float mesh_index_to_xpos(const uint8_t i) { + return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); + } + static inline float mesh_index_to_ypos(const uint8_t i) { + return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); + } + + #if UBL_SEGMENTED + static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); + #else + static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); + #endif + + static inline bool mesh_is_valid() { + GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; + return true; + } + +}; // class unified_bed_leveling + +extern unified_bed_leveling ubl; + +#define _GET_MESH_X(I) ubl.mesh_index_to_xpos(I) +#define _GET_MESH_Y(J) ubl.mesh_index_to_ypos(J) +#define Z_VALUES_ARR ubl.z_values + +// Prevent debugging propagating to other files +#include "../../../core/debug_out.h" diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp new file mode 100644 index 00000000..e41af9f3 --- /dev/null +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -0,0 +1,1778 @@ +/** + * 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(AUTO_BED_LEVELING_UBL) + + #include "../bedlevel.h" + + #include "../../../MarlinCore.h" + #include "../../../HAL/shared/eeprom_api.h" + #include "../../../libs/hex_print.h" + #include "../../../module/settings.h" + #include "../../../lcd/ultralcd.h" + #include "../../../module/stepper.h" + #include "../../../module/planner.h" + #include "../../../module/motion.h" + #include "../../../module/probe.h" + #include "../../../gcode/gcode.h" + #include "../../../libs/least_squares_fit.h" + + #if HAS_MULTI_HOTEND + #include "../../../module/tool_change.h" + #endif + + #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) + #include "../../../core/debug_out.h" + + #if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" + #endif + + #include + + #define UBL_G29_P31 + + #if HAS_LCD_MENU + + 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 + #define BIG_RAISE_NOT_NEEDED 0 + + int unified_bed_leveling::g29_verbose_level, + unified_bed_leveling::g29_phase_value, + unified_bed_leveling::g29_repetition_cnt, + unified_bed_leveling::g29_storage_slot = 0, + unified_bed_leveling::g29_map_type; + bool unified_bed_leveling::g29_c_flag; + float unified_bed_leveling::g29_card_thickness = 0, + unified_bed_leveling::g29_constant = 0; + xy_bool_t unified_bed_leveling::xy_seen; + xy_pos_t unified_bed_leveling::g29_pos; + + #if HAS_BED_PROBE + int unified_bed_leveling::g29_grid_size; + #endif + + /** + * G29: Unified Bed Leveling by Roxy + * + * Parameters understood by this leveling system: + * + * A Activate Activate the Unified Bed Leveling system. + * + * B # Business Use the 'Business Card' mode of the Manual Probe subsystem with P2. + * Note: A non-compressible Spark Gap feeler gauge is recommended over a business card. + * In this mode of G29 P2, a business or index card is used as a shim that the nozzle can + * grab onto as it is lowered. In principle, the nozzle-bed distance is the same when the + * same resistance is felt in the shim. You can omit the numerical value on first invocation + * of G29 P2 B to measure shim thickness. Subsequent use of 'B' will apply the previously- + * measured thickness by default. + * + * C Continue G29 P1 C continues the generation of a partially-constructed Mesh without invalidating + * previous measurements. + * + * C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle + * location in its search for the closest unmeasured Mesh Point. Instead, attempt to + * start at one end of the uprobed points and Continue sequentially. + * + * G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. + * + * C Current G29 Z C uses the Current location (instead of bed center or nearest edge). + * + * D Disable Disable the Unified Bed Leveling system. + * + * E Stow_probe Stow the probe after each sampled point. + * + * F # Fade Fade the amount of Mesh Based Compensation over a specified height. At the + * specified height, no correction is applied and natural printer kenimatics take over. If no + * number is specified for the command, 10mm is assumed to be reasonable. + * + * H # Height With P2, 'H' specifies the Height to raise the nozzle after each manual probe of the bed. + * If omitted, the nozzle will raise by Z_CLEARANCE_BETWEEN_PROBES. + * + * H # Offset With P4, 'H' specifies the Offset above the mesh height to place the nozzle. + * If omitted, Z_CLEARANCE_BETWEEN_PROBES will be used. + * + * I # Invalidate Invalidate the specified number of Mesh Points near the given 'X' 'Y'. If X or Y are omitted, + * the nozzle location is used. If no 'I' value is given, only the point nearest to the location + * is invalidated. Use 'T' to produce a map afterward. This command is useful to invalidate a + * portion of the Mesh so it can be adjusted using other UBL tools. When attempting to invalidate + * an isolated bad mesh point, the 'T' option shows the nozzle position in the Mesh with (#). You + * can move the nozzle around and use this feature to select the center of the area (or cell) to + * invalidate. + * + * J # Grid Perform a Grid Based Leveling of the current Mesh using a grid with n points on a side. + * Not specifying a grid size will invoke the 3-Point leveling function. + * + * L Load Load Mesh from the previously activated location in the EEPROM. + * + * L # Load Load Mesh from the specified location in the EEPROM. Set this location as activated + * for subsequent Load and Store operations. + * + * The P or Phase commands are used for the bulk of the work to setup a Mesh. In general, your Mesh will + * start off being initialized with a G29 P0 or a G29 P1. Further refinement of the Mesh happens with + * each additional Phase that processes it. + * + * P0 Phase 0 Zero Mesh Data and turn off the Mesh Compensation System. This reverts the + * 3D Printer to the same state it was in before the Unified Bed Leveling Compensation + * was turned on. Setting the entire Mesh to Zero is a special case that allows + * a subsequent G or T leveling operation for backward compatibility. + * + * P1 Phase 1 Invalidate entire Mesh and continue with automatic generation of the Mesh data using + * the Z-Probe. Usually the probe can't reach all areas that the nozzle can reach. For delta + * printers only the areas where the probe and nozzle can both reach will be automatically probed. + * + * Unreachable points will be handled in Phase 2 and Phase 3. + * + * Use 'C' to leave the previous mesh intact and automatically probe needed points. This allows you + * to invalidate parts of the Mesh but still use Automatic Probing. + * + * The 'X' and 'Y' parameters prioritize where to try and measure points. If omitted, the current + * probe position is used. + * + * Use 'T' (Topology) to generate a report of mesh generation. + * + * P1 will suspend Mesh generation if the controller button is held down. Note that you may need + * to press and hold the switch for several seconds if moves are underway. + * + * P2 Phase 2 Probe unreachable points. + * + * Use 'H' to set the height between Mesh points. If omitted, Z_CLEARANCE_BETWEEN_PROBES is used. + * Smaller values will be quicker. Move the nozzle down till it barely touches the bed. Make sure the + * nozzle is clean and unobstructed. Use caution and move slowly. This can damage your printer! + * (Uses SIZE_OF_LITTLE_RAISE mm if the nozzle is moving less than BIG_RAISE_NOT_NEEDED mm.) + * + * The 'H' value can be negative if the Mesh dips in a large area. Press and hold the + * controller button to terminate the current Phase 2 command. You can then re-issue "G29 P 2" + * with an 'H' parameter more suitable for the area you're manually probing. Note that the command + * tries to start in a corner of the bed where movement will be predictable. Override the distance + * calculation location with the X and Y parameters. You can print a Mesh Map (G29 T) to see where + * the mesh is invalidated and where the nozzle needs to move to complete the command. Use 'C' to + * indicate that the search should be based on the current position. + * + * The 'B' parameter for this command is described above. It places the manual probe subsystem into + * Business Card mode where the thickness of a business card is measured and then used to accurately + * set the nozzle height in all manual probing for the duration of the command. A Business card can + * be used, but you'll get better results with a flexible Shim that doesn't compress. This makes it + * easier to produce similar amounts of force and get more accurate measurements. Google if you're + * not sure how to use a shim. + * + * The 'T' (Map) parameter helps track Mesh building progress. + * + * NOTE: P2 requires an LCD controller! + * + * P3 Phase 3 Fill the unpopulated regions of the Mesh with a fixed value. There are two different paths to + * go down: + * + * - If a 'C' constant is specified, the closest invalid mesh points to the nozzle will be filled, + * and a repeat count can then also be specified with 'R'. + * + * - Leaving out 'C' invokes Smart Fill, which scans the mesh from the edges inward looking for + * invalid mesh points. Adjacent points are used to determine the bed slope. If the bed is sloped + * upward from the invalid point, it takes the value of the nearest point. If sloped downward, it's + * replaced by a value that puts all three points in a line. This version of G29 P3 is a quick, easy + * and (usually) safe way to populate unprobed mesh regions before continuing to G26 Mesh Validation + * Pattern. Note that this populates the mesh with unverified values. Pay attention and use caution. + * + * P4 Phase 4 Fine tune the Mesh. The Delta Mesh Compensation System assumes the existence of + * an LCD Panel. It is possible to fine tune the mesh without an LCD Panel using + * G42 and M421. See the UBL documentation for further details. + * + * Phase 4 is meant to be used with G26 Mesh Validation to fine tune the mesh by direct editing + * of Mesh Points. Raise and lower points to fine tune the mesh until it gives consistently reliable + * adhesion. + * + * P4 moves to the closest Mesh Point (and/or the given X Y), raises the nozzle above the mesh height + * by the given 'H' offset (or default 0), and waits while the controller is used to adjust the nozzle + * height. On click the displayed height is saved in the mesh. + * + * Start Phase 4 at a specific location with X and Y. Adjust a specific number of Mesh Points with + * the 'R' (Repeat) parameter. (If 'R' is left out, the whole matrix is assumed.) This command can be + * terminated early (e.g., after editing the area of interest) by pressing and holding the encoder button. + * + * The general form is G29 P4 [R points] [X position] [Y position] + * + * The H [offset] parameter is useful if a shim is used to fine-tune the mesh. For a 0.4mm shim the + * command would be G29 P4 H0.4. The nozzle is moved to the shim height, you adjust height to the shim, + * and on click the height minus the shim thickness will be saved in the mesh. + * + * !!Use with caution, as a very poor mesh could cause the nozzle to crash into the bed!! + * + * NOTE: P4 is not available unless you have LCD support enabled! + * + * P5 Phase 5 Find Mean Mesh Height and Standard Deviation. Typically, it is easier to use and + * work with the Mesh if it is Mean Adjusted. You can specify a C parameter to + * Correct the Mesh to a 0.00 Mean Height. Adding a C parameter will automatically + * execute a G29 P6 C . + * + * P6 Phase 6 Shift Mesh height. The entire Mesh's height is adjusted by the height specified + * with the C parameter. Being able to adjust the height of a Mesh is useful tool. It + * can be used to compensate for poorly calibrated Z-Probes and other errors. Ideally, + * you should have the Mesh adjusted for a Mean Height of 0.00 and the Z-Probe measuring + * 0.000 at the Z Home location. + * + * Q Test Load specified Test Pattern to assist in checking correct operation of system. This + * command is not anticipated to be of much value to the typical user. It is intended + * for developers to help them verify correct operation of the Unified Bed Leveling System. + * + * R # Repeat Repeat this command the specified number of times. If no number is specified the + * command will be repeated GRID_MAX_POINTS_X * GRID_MAX_POINTS_Y times. + * + * S Store Store the current Mesh in the Activated area of the EEPROM. It will also store the + * current state of the Unified Bed Leveling system in the EEPROM. + * + * S # Store Store the current Mesh at the specified location in EEPROM. Activate this location + * for subsequent Load and Store operations. Valid storage slot numbers begin at 0 and + * extend to a limit related to the available EEPROM storage. + * + * S -1 Store Print the current Mesh as G-code that can be used to restore the mesh anytime. + * + * T Topology Display the Mesh Map Topology. + * 'T' can be used alone (e.g., G29 T) or in combination with most of the other commands. + * This option works with all Phase commands (e.g., G29 P4 R 5 T X 50 Y100 C -.1 O) + * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 + * is suitable to paste into a spreadsheet for a 3D graph of the mesh. + * + * U Unlevel Perform a probe of the outer perimeter to assist in physically leveling unlevel beds. + * Only used for G29 P1 T U. This speeds up the probing of the edge of the bed. Useful + * when the entire bed doesn't need to be probed because it will be adjusted. + * + * V # Verbosity Set the verbosity level (0-4) for extra details. (Default 0) + * + * X # X Location for this command + * + * Y # Y Location for this command + * + * With UBL_DEVEL_DEBUGGING: + * + * K # Kompare Kompare current Mesh with stored Mesh #, replacing current Mesh with the result. + * This command literally performs a diff between two Meshes. + * + * Q-1 Dump EEPROM Dump the UBL contents stored in EEPROM as HEX format. Useful for developers to help + * verify correct operation of the UBL. + * + * W What? Display valuable UBL data. + * + * + * Release Notes: + * You MUST do M502, M500 to initialize the storage. Failure to do this will cause all + * kinds of problems. Enabling EEPROM Storage is required. + * + * When you do a G28 and G29 P1 to automatically build your first mesh, you are going to notice that + * UBL probes points increasingly further from the starting location. (The starting location defaults + * to the center of the bed.) In contrast, ABL and MBL follow a zigzag pattern. The spiral pattern is + * especially better for Delta printers, since it populates the center of the mesh first, allowing for + * a quicker test print to verify settings. You don't need to populate the entire mesh to use it. + * After all, you don't want to spend a lot of time generating a mesh only to realize the resolution + * or probe offsets are incorrect. Mesh-generation gathers points starting closest to the nozzle unless + * an (X,Y) coordinate pair is given. + * + * Unified Bed Leveling uses a lot of EEPROM storage to hold its data, and it takes some effort to get + * the mesh just right. To prevent this valuable data from being destroyed as the EEPROM structure + * evolves, UBL stores all mesh data at the end of EEPROM. + * + * UBL is founded on Edward Patel's Mesh Bed Leveling code. A big 'Thanks!' to him and the creators of + * 3-Point and Grid Based leveling. Combining their contributions we now have the functionality and + * features of all three systems combined. + */ + + void unified_bed_leveling::G29() { + + bool probe_deployed = false; + if (g29_parameter_parsing()) return; // Abort on parameter error + + const int8_t p_val = parser.intval('P', -1); + const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); + TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); + + // Check for commands that require the printer to be homed + if (may_move) { + planner.synchronize(); + if (axes_should_home()) gcode.home_all_axes(); + TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); + } + + // Invalidate Mesh Points. This command is a little bit asymmetrical because + // it directly specifies the repetition count and does not use the 'R' parameter. + if (parser.seen('I')) { + uint8_t cnt = 0; + g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; + if (g29_repetition_cnt >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(NAN); + } + else { + while (g29_repetition_cnt--) { + if (cnt > 20) { cnt = 0; idle(); } + const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL mesh points to invalidate, so we ASSUME the user + // meant to invalidate the ENTIRE mesh, which cannot be done with + // find_closest_mesh_point loop which only returns REAL points. + set_all_mesh_points_to_value(NAN); + SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); + break; // No more invalid Mesh Points to populate + } + z_values[cpos.x][cpos.y] = NAN; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); + cnt++; + } + } + SERIAL_ECHOLNPGM("Locations invalidated.\n"); + } + + if (parser.seen('Q')) { + const int test_pattern = parser.has_value() ? parser.value_int() : -99; + if (!WITHIN(test_pattern, -1, 2)) { + SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); + return; + } + SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); + switch (test_pattern) { + + #if ENABLED(UBL_DEVEL_DEBUGGING) + case -1: + g29_eeprom_dump(); + break; + #endif + + case 0: + GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta + const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, + p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; + z_values[x][y] += 2.0f * HYPOT(p1, p2); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + break; + + case 1: + LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised + z_values[x][x] += 9.999f; + z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(x, x, z_values[x][x]); + ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]); + #endif + + } + break; + + case 2: + // Allow the user to specify the height because 10mm is a little extreme in some cases. + for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in + for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed + z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + break; + } + } + + #if HAS_BED_PROBE + + if (parser.seen('J')) { + save_ubl_active_state_and_disable(); + tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point + restore_ubl_active_state_and_leave(); + #if ENABLED(UBL_G29_J_RECENTER) + do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); + #endif + report_current_position(); + probe_deployed = true; + } + + #endif // HAS_BED_PROBE + + if (parser.seen('P')) { + if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { + storage_slot = 0; + SERIAL_ECHOLNPGM("Default storage slot 0 selected."); + } + + switch (g29_phase_value) { + case 0: + // + // Zero Mesh Data + // + reset(); + SERIAL_ECHOLNPGM("Mesh zeroed."); + break; + + #if HAS_BED_PROBE + + case 1: { + // + // Invalidate Entire Mesh and Automatically Probe Mesh in areas that can be reached by the probe + // + if (!parser.seen('C')) { + invalidate(); + SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); + } + if (g29_verbose_level > 1) { + SERIAL_ECHOPAIR("Probing around (", g29_pos.x); + SERIAL_CHAR(','); + SERIAL_DECIMAL(g29_pos.y); + SERIAL_ECHOLNPGM(").\n"); + } + const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; + probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); + + report_current_position(); + probe_deployed = true; + } break; + + #endif // HAS_BED_PROBE + + case 2: { + #if HAS_LCD_MENU + // + // Manually Probe Mesh in areas that can't be reached by the probe + // + SERIAL_ECHOLNPGM("Manually probing unreachable points."); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + + if (parser.seen('C') && !xy_seen) { + + /** + * Use a good default location for the path. + * The flipped > and < operators in these comparisons is intentional. + * It should cause the probed points to follow a nice path on Cartesian printers. + * It may make sense to have Delta printers default to the center of the bed. + * Until that is decided, this can be forced with the X and Y parameters. + */ + g29_pos.set( + #if IS_KINEMATIC + X_HOME_POS, Y_HOME_POS + #else + probe.offset_xy.x > 0 ? X_BED_SIZE : 0, + probe.offset_xy.y < 0 ? Y_BED_SIZE : 0 + #endif + ); + } + + if (parser.seen('B')) { + g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(float(Z_CLEARANCE_BETWEEN_PROBES)); + if (ABS(g29_card_thickness) > 1.5f) { + SERIAL_ECHOLNPGM("?Error in Business Card measurement."); + return; + } + probe_deployed = true; + } + + if (!position_is_reachable(g29_pos)) { + SERIAL_ECHOLNPGM("XY outside printable radius."); + return; + } + + const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); + manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); + + SERIAL_ECHOLNPGM("G29 P2 finished."); + + report_current_position(); + + #else + + SERIAL_ECHOLNPGM("?P2 is only available when an LCD is present."); + return; + + #endif + } break; + + case 3: { + /** + * Populate invalid mesh areas. Proceed with caution. + * Two choices are available: + * - Specify a constant with the 'C' parameter. + * - Allow 'G29 P3' to choose a 'reasonable' constant. + */ + + if (g29_c_flag) { + if (g29_repetition_cnt >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(g29_constant); + } + else { + while (g29_repetition_cnt--) { // this only populates reachable mesh points near + const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL INVALID mesh points to populate, so we ASSUME + // user meant to populate ALL INVALID mesh points to value + GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; + break; // No more invalid Mesh Points to populate + } + else { + z_values[cpos.x][cpos.y] = g29_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); + } + } + } + } + else { + const float cvf = parser.value_float(); + switch ((int)truncf(cvf * 10.0f) - 30) { // 3.1 -> 1 + #if ENABLED(UBL_G29_P31) + case 1: { + + // P3.1 use least squares fit to fill missing mesh values + // P3.10 zero weighting for distance, all grid points equal, best fit tilted plane + // P3.11 10X weighting for nearest grid points versus farthest grid points + // P3.12 100X distance weighting + // P3.13 1000X distance weighting, approaches simple average of nearest points + + const float weight_power = (cvf - 3.10f) * 100.0f, // 3.12345 -> 2.345 + weight_factor = weight_power ? POW(10.0f, weight_power) : 0; + smart_fill_wlsf(weight_factor); + } + break; + #endif + case 0: // P3 or P3.0 + default: // and anything P3.x that's not P3.1 + smart_fill_mesh(); // Do a 'Smart' fill using nearby known values + break; + } + } + break; + } + + case 4: // Fine Tune (i.e., Edit) the Mesh + #if HAS_LCD_MENU + fine_tune_mesh(g29_pos, parser.seen('T')); + #else + SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); + return; + #endif + break; + + case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; + + case 6: shift_mesh_height(); break; + } + } + + #if ENABLED(UBL_DEVEL_DEBUGGING) + + // + // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + // good to have the extra information. Soon... we prune this to just a few items + // + if (parser.seen('W')) g29_what_command(); + + // + // When we are fully debugged, this may go away. But there are some valid + // use cases for the users. So we can wait and see what to do with it. + // + + if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh + g29_compare_current_mesh_to_stored_mesh(); + + #endif // UBL_DEVEL_DEBUGGING + + + // + // Load a Mesh from the EEPROM + // + + if (parser.seen('L')) { // Load Current Mesh Data + g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; + } + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + return; + } + + settings.load_mesh(g29_storage_slot); + storage_slot = g29_storage_slot; + + SERIAL_ECHOLNPGM("Done."); + } + + // + // Store a Mesh in the EEPROM + // + + if (parser.seen('S')) { // Store (or Save) Current Mesh Data + g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + + if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the + return report_current_mesh(); // host program to be saved on the user's computer + + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + goto LEAVE; + } + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + goto LEAVE; + } + + settings.store_mesh(g29_storage_slot); + storage_slot = g29_storage_slot; + + SERIAL_ECHOLNPGM("Done."); + } + + if (parser.seen('T')) + display_map(g29_map_type); + + LEAVE: + + #if HAS_LCD_MENU + ui.reset_alert_level(); + ui.quick_feedback(); + ui.reset_status(); + ui.release(); + #endif + + #ifdef Z_PROBE_END_SCRIPT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); + if (probe_deployed) { + planner.synchronize(); + gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); + } + #else + UNUSED(probe_deployed); + #endif + + TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index)); + return; + } + + void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { + float sum = 0; + int n = 0; + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + sum += z_values[x][y]; + n++; + } + + const float mean = sum / n; + + // + // Sum the squares of difference from mean + // + float sum_of_diff_squared = 0; + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) + sum_of_diff_squared += sq(z_values[x][y] - mean); + + SERIAL_ECHOLNPAIR("# of samples: ", n); + SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); + + const float sigma = SQRT(sum_of_diff_squared / (n + 1)); + SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); + + if (cflag) + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + z_values[x][y] -= mean + value; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + } + + void unified_bed_leveling::shift_mesh_height() { + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + z_values[x][y] += g29_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + } + + #if HAS_BED_PROBE + /** + * Probe all invalidated locations of the mesh that can be reached by the probe. + * This attempts to fill in locations closest to the nozzle's start location first. + */ + void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { + probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW + + TERN_(HAS_LCD_MENU, ui.capture()); + + save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained + uint8_t count = GRID_MAX_POINTS; + + mesh_index_pair best; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); + do { + if (do_ubl_mesh_map) display_map(g29_map_type); + + const int point_num = (GRID_MAX_POINTS) - count + 1; + SERIAL_ECHOLNPAIR("\nProbing mesh point ", point_num, "/", int(GRID_MAX_POINTS), ".\n"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); + + #if HAS_LCD_MENU + if (ui.button_pressed()) { + ui.quick_feedback(false); // Preserve button state for click-and-hold + SERIAL_ECHOLNPGM("\nMesh only partially populated.\n"); + ui.wait_for_release(); + ui.quick_feedback(); + ui.release(); + probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW + return restore_ubl_active_state_and_leave(); + } + #endif + + best = do_furthest + ? find_furthest_invalid_mesh_point() + : find_closest_mesh_point_of_type(INVALID, near, true); + + if (best.pos.x >= 0) { // mesh point found and is reachable by probe + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); + const float measured_z = probe.probe_at_point( + best.meshpos(), + stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level + ); + z_values[best.pos.x][best.pos.y] = measured_z; + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); + ExtUI::onMeshUpdate(best.pos, measured_z); + #endif + } + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + + } while (best.pos.x >= 0 && --count); + + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); + + // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW + TERN_(HAS_LCD_MENU, ui.release()); + probe.stow(); + TERN_(HAS_LCD_MENU, ui.capture()); + + probe.move_z_after_probing(); + + restore_ubl_active_state_and_leave(); + + do_blocking_move_to_xy( + constrain(near.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), + constrain(near.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) + ); + } + + #endif // HAS_BED_PROBE + + #if HAS_LCD_MENU + + typedef void (*clickFunc_t)(); + + bool click_and_hold(const clickFunc_t func=nullptr) { + if (ui.button_pressed()) { + 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 + ui.quick_feedback(); + if (func) (*func)(); + ui.wait_for_release(); + return true; + } + } + } + serial_delay(15); + return false; + } + + void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { + ui.wait_for_release(); + while (!ui.button_pressed()) { + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + if (encoder_diff) { + do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); + encoder_diff = 0; + } + } + } + + float unified_bed_leveling::measure_point_with_encoder() { + KEEPALIVE_STATE(PAUSED_FOR_USER); + move_z_with_encoder(0.01f); + return current_position.z; + } + + static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } + + float unified_bed_leveling::measure_business_card_thickness(float in_height) { + 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); + //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); + planner.synchronize(); + + SERIAL_ECHOPGM("Place shim under nozzle"); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); + ui.return_to_status(); + echo_and_take_a_measurement(); + + const float z1 = measure_point_with_encoder(); + do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); + planner.synchronize(); + + SERIAL_ECHOPGM("Remove shim"); + LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); + 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); + + if (g29_verbose_level > 1) { + SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); + SERIAL_ECHOLNPGM("mm thick."); + } + + 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) { + 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); + + ui.return_to_status(); + + mesh_index_pair location; + const xy_int8_t &lpos = location.pos; + do { + location = find_closest_mesh_point_of_type(INVALID, pos); + // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. + if (!location.valid()) continue; + + const xyz_pos_t ppos = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; + + if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) + + LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); + + do_blocking_move_to(ppos); + do_z_clearance(z_clearance); + + KEEPALIVE_STATE(PAUSED_FOR_USER); + ui.capture(); + + if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + + serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); + + const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step + //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click + + move_z_with_encoder(z_step); + + if (click_and_hold()) { + SERIAL_ECHOLNPGM("\nMesh only partially populated."); + do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); + return restore_ubl_active_state_and_leave(); + } + + z_values[lpos.x][lpos.y] = current_position.z - thick; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); + + if (g29_verbose_level > 2) + SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (location.valid()); + + if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + + restore_ubl_active_state_and_leave(); + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); + } + + inline void set_message_with_feedback(PGM_P const msg_P) { + ui.set_status_P(msg_P); + ui.quick_feedback(); + } + + void abort_fine_tune() { + ui.return_to_status(); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); + } + + void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. + + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + const float h_offset = parser.seenval('H') ? parser.value_linear_units() : 0; + if (!WITHIN(h_offset, 0, 10)) { + SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); + return; + } + #endif + + mesh_index_pair location; + + if (!position_is_reachable(pos)) { + SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); + return; + } + + save_ubl_active_state_and_disable(); + + LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); + 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 + + TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset + + MeshFlags done_flags{0}; + const xy_int8_t &lpos = location.pos; + do { + location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); + + if (lpos.x < 0) break; // Stop when there are no more reachable points + + done_flags.mark(lpos); // Mark this location as 'adjusted' so a new + // location is used on the next loop + const xyz_pos_t raw = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; + + if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) + + do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance + + TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset before editing + + KEEPALIVE_STATE(PAUSED_FOR_USER); + + if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + + #if IS_TFTGLCD_PANEL + ui.ubl_plot(lpos.x, lpos.y); // update plot screen + #endif + + ui.refresh(); + + float new_z = z_values[lpos.x][lpos.y]; + if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 + new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place + + lcd_mesh_edit_setup(new_z); + + SET_SOFT_ENDSTOP_LOOSE(true); + + 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 + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (!ui.button_pressed()); + + SET_SOFT_ENDSTOP_LOOSE(false); + + if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status + + if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing + + z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); + + serial_delay(20); // No switch noise + ui.refresh(); + + } while (lpos.x >= 0 && --g29_repetition_cnt > 0); + + if (do_ubl_mesh_map) display_map(g29_map_type); + restore_ubl_active_state_and_leave(); + + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); + + LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); + SERIAL_ECHOLNPGM("Done Editing Mesh"); + + if (lcd_map_control) + ui.goto_screen(ubl_map_screen); + else + ui.return_to_status(); + } + + #endif // HAS_LCD_MENU + + bool unified_bed_leveling::g29_parameter_parsing() { + bool err_flag = false; + + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); + + g29_constant = 0; + g29_repetition_cnt = 0; + + if (parser.seen('R')) { + g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; + NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); + if (g29_repetition_cnt < 1) { + SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); + return UBL_ERR; + } + } + + g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; + if (!WITHIN(g29_verbose_level, 0, 4)) { + SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); + err_flag = true; + } + + if (parser.seen('P')) { + const int pv = parser.value_int(); + #if !HAS_BED_PROBE + if (pv == 1) { + SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n"); + err_flag = true; + } + else + #endif + { + g29_phase_value = pv; + if (!WITHIN(g29_phase_value, 0, 6)) { + SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); + err_flag = true; + } + } + } + + if (parser.seen('J')) { + #if HAS_BED_PROBE + g29_grid_size = parser.has_value() ? parser.value_int() : 0; + if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { + SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); + err_flag = true; + } + #else + SERIAL_ECHOLNPGM("G29 J action requires a probe.\n"); + err_flag = true; + #endif + } + + xy_seen.x = parser.seenval('X'); + float sx = xy_seen.x ? parser.value_float() : current_position.x; + xy_seen.y = parser.seenval('Y'); + float sy = xy_seen.y ? parser.value_float() : current_position.y; + + if (xy_seen.x != xy_seen.y) { + SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); + err_flag = true; + } + + // If X or Y are not valid, use center of the bed values + if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; + if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + + if (err_flag) return UBL_ERR; + + g29_pos.set(sx, sy); + + /** + * Activate or deactivate UBL + * Note: UBL's G29 restores the state set here when done. + * Leveling is being enabled here with old data, possibly + * none. Error handling should disable for safety... + */ + if (parser.seen('A')) { + if (parser.seen('D')) { + SERIAL_ECHOLNPGM("?Can't activate and deactivate at the same time.\n"); + return UBL_ERR; + } + set_bed_leveling_enabled(true); + report_state(); + } + else if (parser.seen('D')) { + set_bed_leveling_enabled(false); + report_state(); + } + + // Set global 'C' flag and its value + if ((g29_c_flag = parser.seen('C'))) + g29_constant = parser.value_float(); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (parser.seenval('F')) { + const float fh = parser.value_float(); + if (!WITHIN(fh, 0, 100)) { + SERIAL_ECHOLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); + return UBL_ERR; + } + set_z_fade_height(fh); + } + #endif + + g29_map_type = parser.intval('T'); + if (!WITHIN(g29_map_type, 0, 2)) { + SERIAL_ECHOLNPGM("Invalid map type.\n"); + return UBL_ERR; + } + return UBL_OK; + } + + static uint8_t ubl_state_at_invocation = 0; + + #if ENABLED(UBL_DEVEL_DEBUGGING) + static uint8_t ubl_state_recursion_chk = 0; + #endif + + void unified_bed_leveling::save_ubl_active_state_and_disable() { + #if ENABLED(UBL_DEVEL_DEBUGGING) + ubl_state_recursion_chk++; + if (ubl_state_recursion_chk != 1) { + SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); + return; + } + #endif + ubl_state_at_invocation = planner.leveling_active; + set_bed_leveling_enabled(false); + } + + 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."); + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); + return; + } + #endif + set_bed_leveling_enabled(ubl_state_at_invocation); + } + + mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { + + bool found_a_NAN = false, found_a_real = false; + + mesh_index_pair farthest { -1, -1, -99999.99 }; + + GRID_LOOP(i, j) { + if (!isnan(z_values[i][j])) continue; // Skip valid mesh points + + // Skip unreachable points + if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) + continue; + + found_a_NAN = true; + + xy_int8_t near { -1, -1 }; + float d1, d2 = 99999.9f; + GRID_LOOP(k, l) { + if (isnan(z_values[k][l])) continue; + + found_a_real = true; + + // Add in a random weighting factor that scrambles the probing of the + // last half of the mesh (when every unprobed mesh point is one index + // from a probed location). + + d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); + + if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) + d2 = d1; + near.set(i, j); + } + } + + // + // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) + // + + if (found_a_real && near.x >= 0 && d2 > farthest.distance) { + farthest.pos = near; // Found an invalid location farther from the defined mesh point + farthest.distance = d2; + } + } // GRID_LOOP + + if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing + farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2); + farthest.distance = 1; + } + return farthest; + } + + mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { + mesh_index_pair closest; + closest.invalidate(); + closest.distance = -99999.9f; + + // Get the reference position, either nozzle or probe + const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + + float best_so_far = 99999.99f; + + GRID_LOOP(i, j) { + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) + ) { + // Found a Mesh Point of the specified type! + const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + + // If using the probe as the reference there are some unreachable locations. + // Also for round beds, there are grid points outside the bed the nozzle can't reach. + // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + + if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + continue; + + // Reachable. Check if it's the best_so_far location to the nozzle. + + const xy_pos_t diff = current_position - mpos; + const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; + + // factor in the distance from the current location for the normal case + // so the nozzle isn't running all over the bed. + if (distance < best_so_far) { + best_so_far = distance; // Found a closer location with the desired value type. + closest.pos.set(i, j); + closest.distance = best_so_far; + } + } + } // GRID_LOOP + + return closest; + } + + /** + * 'Smart Fill': Scan from the outward edges of the mesh towards the center. + * If an invalid location is found, use the next two points (if valid) to + * calculate a 'reasonable' value for the unprobed mesh point. + */ + + bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { + const float v = z_values[x][y]; + if (isnan(v)) { // A NAN... + const int8_t dx = x + xdir, dy = y + ydir; + const float v1 = z_values[dx][dy]; + if (!isnan(v1)) { // ...next to a pair of real values? + const float v2 = z_values[dx + xdir][dy + ydir]; + if (!isnan(v2)) { + z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + return true; + } + } + } + return false; + } + + typedef struct { uint8_t sx, ex, sy, ey; bool yfirst; } smart_fill_info; + + void unified_bed_leveling::smart_fill_mesh() { + static const smart_fill_info + info0 PROGMEM = { 0, GRID_MAX_POINTS_X, 0, GRID_MAX_POINTS_Y - 2, false }, // Bottom of the mesh looking up + info1 PROGMEM = { 0, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - 1, 0, false }, // Top of the mesh looking down + info2 PROGMEM = { 0, GRID_MAX_POINTS_X - 2, 0, GRID_MAX_POINTS_Y, true }, // Left side of the mesh looking right + info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left + static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; + + LOOP_L_N(i, COUNT(info)) { + const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); + const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), + ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); + if (pgm_read_byte(&f->yfirst)) { + const int8_t dir = ex > sx ? 1 : -1; + for (uint8_t y = sy; y != ey; ++y) + for (uint8_t x = sx; x != ex; x += dir) + if (smart_fill_one(x, y, dir, 0)) break; + } + else { + const int8_t dir = ey > sy ? 1 : -1; + for (uint8_t x = sx; x != ex; ++x) + for (uint8_t y = sy; y != ey; y += dir) + if (smart_fill_one(x, y, 0, dir)) break; + } + } + } + + #if HAS_BED_PROBE + + //#define VALIDATE_MESH_TILT + + #include "../../../libs/vector_3.h" + + void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { + const float x_min = probe.min_x(), x_max = probe.max_x(), + y_min = probe.min_y(), y_max = probe.max_y(), + dx = (x_max - x_min) / (g29_grid_size - 1), + dy = (y_max - y_min) / (g29_grid_size - 1); + + xy_float_t points[3]; + probe.get_three_points(points); + + float measured_z; + bool abort_flag = false; + + #ifdef VALIDATE_MESH_TILT + float z1, z2, z3; // Needed for algorithm validation below + #endif + + struct linear_fit_data lsf_results; + incremental_LSF_reset(&lsf_results); + + if (do_3_pt_leveling) { + SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[0]); + #ifdef VALIDATE_MESH_TILT + z1 = measured_z; + #endif + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, points[0], measured_z); + } + + if (!abort_flag) { + SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); + #ifdef VALIDATE_MESH_TILT + z2 = measured_z; + #endif + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[1]); + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, points[1], measured_z); + } + } + + if (!abort_flag) { + SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); + #ifdef VALIDATE_MESH_TILT + z3 = measured_z; + #endif + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[2]); + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, points[2], measured_z); + } + } + + probe.stow(); + probe.move_z_after_probing(); + + if (abort_flag) { + SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); + return; + } + } + else { // !do_3_pt_leveling + + bool zig_zag = false; + + const uint16_t total_points = sq(g29_grid_size); + uint16_t point_num = 1; + + xy_pos_t rpos; + LOOP_L_N(ix, g29_grid_size) { + rpos.x = x_min + ix * dx; + LOOP_L_N(iy, g29_grid_size) { + rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); + + if (!abort_flag) { + SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); + + measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + + abort_flag = isnan(measured_z); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + const xy_pos_t lpos = rpos.asLogical(); + DEBUG_CHAR('('); + DEBUG_ECHO_F(rpos.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(rpos.y, 7); + DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(lpos.y, 7); + DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); + DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); + } + #endif + + measured_z -= get_z_correction(rpos) /* + probe.offset.z */ ; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); + + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, rpos, measured_z); + } + + point_num++; + } + + zig_zag ^= true; + } + } + probe.stow(); + probe.move_z_after_probing(); + + if (abort_flag || finish_incremental_LSF(&lsf_results)) { + SERIAL_ECHOPGM("Could not complete LSF!"); + return; + } + + vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); + + if (g29_verbose_level > 2) { + SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + SERIAL_CHAR(','); + SERIAL_ECHO_F(normal.y, 7); + SERIAL_CHAR(','); + SERIAL_ECHO_F(normal.z, 7); + SERIAL_ECHOLNPGM("]"); + } + + matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); + + GRID_LOOP(i, j) { + float mx = mesh_index_to_xpos(i), + my = mesh_index_to_ypos(j), + mz = z_values[i][j]; + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(my, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(mz, 7); + DEBUG_ECHOPGM("] ---> "); + DEBUG_DELAY(20); + } + + apply_rotation_xyz(rotation, mx, my, mz); + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(my, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(mz, 7); + DEBUG_ECHOLNPGM("]"); + DEBUG_DELAY(20); + } + + z_values[i][j] = mz - lsf_results.D; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, z_values[i][j])); + } + + if (DEBUGGING(LEVELING)) { + rotation.debug(PSTR("rotation matrix:\n")); + DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7); + DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7); + DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7); + DEBUG_DELAY(55); + + DEBUG_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(normal.y, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(normal.z, 7); + DEBUG_ECHOLNPGM("]"); + DEBUG_EOL(); + + /** + * Use the code below to check the validity of the mesh tilting algorithm. + * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only + * three points are used in the calculation. This guarantees that each probed point + * has an exact match when get_z_correction() for that location is calculated. + * The Z error between the probed point locations and the get_z_correction() + * numbers for those locations should be 0. + */ + #ifdef VALIDATE_MESH_TILT + auto d_from = []{ DEBUG_ECHOPGM("D from "); }; + auto normed = [&](const xy_pos_t &pos, const float &zadd) { + return normal.x * pos.x + normal.y * pos.y + zadd; + }; + auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { + d_from(); serialprintPGM(pre); + DEBUG_ECHO_F(normed(pos, zadd), 6); + DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); + }; + debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); + debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); + debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); + DEBUG_ECHOPAIR(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); + DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); + #endif + } // DEBUGGING(LEVELING) + + } + + #endif // HAS_BED_PROBE + + #if ENABLED(UBL_G29_P31) + void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { + + // For each undefined mesh point, compute a distance-weighted least squares fit + // from all the originally populated mesh points, weighted toward the point + // being extrapolated so that nearby points will have greater influence on + // the point being extrapolated. Then extrapolate the mesh point from WLSF. + + static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big"); + uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; + struct linear_fit_data lsf_results; + + SERIAL_ECHOPGM("Extrapolating mesh..."); + + const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); + + GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + + xy_pos_t ppos; + LOOP_L_N(ix, GRID_MAX_POINTS_X) { + ppos.x = mesh_index_to_xpos(ix); + LOOP_L_N(iy, GRID_MAX_POINTS_Y) { + ppos.y = mesh_index_to_ypos(iy); + if (isnan(z_values[ix][iy])) { + // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. + incremental_LSF_reset(&lsf_results); + xy_pos_t rpos; + LOOP_L_N(jx, GRID_MAX_POINTS_X) { + rpos.x = mesh_index_to_xpos(jx); + LOOP_L_N(jy, GRID_MAX_POINTS_Y) { + if (TEST(bitmap[jx], jy)) { + rpos.y = mesh_index_to_ypos(jy); + const float rz = z_values[jx][jy], + w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); + incremental_WLSF(&lsf_results, rpos, rz, w); + } + } + } + if (finish_incremental_LSF(&lsf_results)) { + SERIAL_ECHOLNPGM("Insufficient data"); + return; + } + const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; + z_values[ix][iy] = ez; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy])); + idle(); // housekeeping + } + } + } + + SERIAL_ECHOLNPGM("done"); + } + #endif // UBL_G29_P31 + + #if ENABLED(UBL_DEVEL_DEBUGGING) + /** + * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + * good to have the extra information. Soon... we prune this to just a few items + */ + void unified_bed_leveling::g29_what_command() { + report_state(); + + if (storage_slot == -1) + SERIAL_ECHOPGM("No Mesh Loaded."); + else + SERIAL_ECHOPAIR("Mesh ", storage_slot, " Loaded."); + SERIAL_EOL(); + serial_delay(50); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); + #endif + + adjust_mesh_to_mean(g29_c_flag, g29_constant); + + #if HAS_BED_PROBE + SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); + #endif + + SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); serial_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); + SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); + + SERIAL_ECHOPGM("X-Axis Mesh Points at: "); + LOOP_L_N(i, GRID_MAX_POINTS_X) { + SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); + SERIAL_ECHOPGM(" "); + serial_delay(25); + } + SERIAL_EOL(); + + SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); + LOOP_L_N(i, GRID_MAX_POINTS_Y) { + SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); + SERIAL_ECHOPGM(" "); + serial_delay(25); + } + SERIAL_EOL(); + + #if HAS_KILL + SERIAL_ECHOLNPAIR("Kill pin on :", int(KILL_PIN), " state:", int(kill_state())); + #endif + + SERIAL_EOL(); + serial_delay(50); + + #if ENABLED(UBL_DEVEL_DEBUGGING) + SERIAL_ECHOLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); + serial_delay(50); + + SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); + serial_delay(50); + + SERIAL_ECHOLNPAIR("sizeof(ubl) : ", (int)sizeof(ubl)); SERIAL_EOL(); + SERIAL_ECHOLNPAIR("z_value[][] size: ", (int)sizeof(z_values)); SERIAL_EOL(); + serial_delay(25); + + SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); + serial_delay(50); + + SERIAL_ECHOLNPAIR("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); + serial_delay(25); + #endif // UBL_DEVEL_DEBUGGING + + if (!sanity_check()) { + echo_name(); + SERIAL_ECHOLNPGM(" sanity checks passed."); + } + } + + /** + * When we are fully debugged, the EEPROM dump command will get deleted also. But + * right now, it is good to have the extra information. Soon... we prune this. + */ + void unified_bed_leveling::g29_eeprom_dump() { + uint8_t cccc; + + SERIAL_ECHO_MSG("EEPROM Dump:"); + persistentStore.access_start(); + for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { + if (!(i & 0x3)) idle(); + print_hex_word(i); + SERIAL_ECHOPGM(": "); + for (uint16_t j = 0; j < 16; j++) { + persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); + print_hex_byte(cccc); + SERIAL_CHAR(' '); + } + SERIAL_EOL(); + } + SERIAL_EOL(); + persistentStore.access_finish(); + } + + /** + * When we are fully debugged, this may go away. But there are some valid + * use cases for the users. So we can wait and see what to do with it. + */ + void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { + const int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; + } + + if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + return; + } + + g29_storage_slot = parser.value_int(); + + float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + settings.load_mesh(g29_storage_slot, &tmp_z_values); + + SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); + + GRID_LOOP(x, y) { + z_values[x][y] -= tmp_z_values[x][y]; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + } + + #endif // UBL_DEVEL_DEBUGGING + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp new file mode 100644 index 00000000..010b5951 --- /dev/null +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -0,0 +1,481 @@ +/** + * 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(AUTO_BED_LEVELING_UBL) + +#include "../bedlevel.h" +#include "../../../module/planner.h" +#include "../../../module/stepper.h" +#include "../../../module/motion.h" + +#if ENABLED(DELTA) + #include "../../../module/delta.h" +#endif + +#include "../../../MarlinCore.h" +#include + +#if !UBL_SEGMENTED + + void unified_bed_leveling::line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t extruder) { + /** + * Much of the nozzle movement will be within the same cell. So we will do as little computation + * as possible to determine if this is the case. If this move is within the same cell, we will + * just do the required Z-Height correction, call the Planner's buffer_line() routine, and leave + */ + #if HAS_POSITION_MODIFIERS + xyze_pos_t start = current_position, end = destination; + planner.apply_modifiers(start); + planner.apply_modifiers(end); + #else + const xyze_pos_t &start = current_position, &end = destination; + #endif + + const xy_int8_t istart = cell_indexes(start), iend = cell_indexes(end); + + // A move within the same cell needs no splitting + if (istart == iend) { + + // For a move off the bed, use a constant Z raise + if (!WITHIN(iend.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(iend.y, 0, GRID_MAX_POINTS_Y - 1)) { + + // Note: There is no Z Correction in this case. We are off the grid and don't know what + // a reasonable correction would be. If the user has specified a UBL_Z_RAISE_WHEN_OFF_MESH + // value, that will be used instead of a calculated (Bi-Linear interpolation) correction. + + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + end.z += UBL_Z_RAISE_WHEN_OFF_MESH; + #endif + planner.buffer_segment(end, scaled_fr_mm_s, extruder); + current_position = destination; + return; + } + + FINAL_MOVE: + + // The distance is always MESH_X_DIST so multiply by the constant reciprocal. + const float xratio = (end.x - mesh_index_to_xpos(iend.x)) * RECIPROCAL(MESH_X_DIST); + + float z1, z2; + if (iend.x >= GRID_MAX_POINTS_X - 1) + z1 = z2 = 0.0; + else { + z1 = z_values[iend.x ][iend.y ] + xratio * + (z_values[iend.x + 1][iend.y ] - z_values[iend.x][iend.y ]), + z2 = z_values[iend.x ][iend.y + 1] + xratio * + (z_values[iend.x + 1][iend.y + 1] - z_values[iend.x][iend.y + 1]); + } + + // X cell-fraction done. Interpolate the two Z offsets with the Y fraction for the final Z offset. + const float yratio = (end.y - mesh_index_to_ypos(iend.y)) * RECIPROCAL(MESH_Y_DIST), + z0 = iend.y < GRID_MAX_POINTS_Y - 1 ? (z1 + (z2 - z1) * yratio) * planner.fade_scaling_factor_for_z(end.z) : 0.0; + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (!isnan(z0)) end.z += z0; + planner.buffer_segment(end, scaled_fr_mm_s, extruder); + current_position = destination; + return; + } + + /** + * Past this point the move is known to cross one or more mesh lines. Check for the most common + * case - crossing only one X or Y line - after details are worked out to reduce computation. + */ + + const xy_float_t dist = end - start; + const xy_bool_t neg { dist.x < 0, dist.y < 0 }; + const xy_int8_t ineg { int8_t(neg.x), int8_t(neg.y) }; + const xy_float_t sign { neg.x ? -1.0f : 1.0f, neg.y ? -1.0f : 1.0f }; + const xy_int8_t iadd { int8_t(iend.x == istart.x ? 0 : sign.x), int8_t(iend.y == istart.y ? 0 : sign.y) }; + + /** + * Compute the extruder scaling factor for each partial move, checking for + * zero-length moves that would result in an infinite scaling factor. + * A float divide is required for this, but then it just multiplies. + * Also select a scaling factor based on the larger of the X and Y + * components. The larger of the two is used to preserve precision. + */ + + const xy_float_t ad = sign * dist; + const bool use_x_dist = ad.x > ad.y; + + float on_axis_distance = use_x_dist ? dist.x : dist.y, + e_position = end.e - start.e, + z_position = end.z - start.z; + + const float e_normalized_dist = e_position / on_axis_distance, // Allow divide by zero + z_normalized_dist = z_position / on_axis_distance; + + xy_int8_t icell = istart; + + const float ratio = dist.y / dist.x, // Allow divide by zero + c = start.y - ratio * start.x; + + const bool inf_normalized_flag = isinf(e_normalized_dist), + inf_ratio_flag = isinf(ratio); + + /** + * Handle vertical lines that stay within one column. + * These need not be perfectly vertical. + */ + if (iadd.x == 0) { // Vertical line? + icell.y += ineg.y; // Line going down? Just go to the bottom. + while (icell.y != iend.y + ineg.y) { + icell.y += iadd.y; + const float next_mesh_line_y = mesh_index_to_ypos(icell.y); + + /** + * Skip the calculations for an infinite slope. + * For others the next X is the same so this can continue. + * Calculate X at the next Y mesh line. + */ + const float rx = inf_ratio_flag ? start.x : (next_mesh_line_y - c) / ratio; + + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, icell.x, icell.y) + * planner.fade_scaling_factor_for_z(end.z); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + const float ry = mesh_index_to_ypos(icell.y); + + /** + * Without this check, it's possible to generate a zero length move, as in the case where + * the line is heading down, starting exactly on a mesh line boundary. Since this is rare + * it might be fine to remove this check and let planner.buffer_segment() filter it out. + */ + if (ry != start.y) { + if (!inf_normalized_flag) { // fall-through faster than branch + on_axis_distance = use_x_dist ? rx - start.x : ry - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; + z_position = start.z + on_axis_distance * z_normalized_dist; + } + else { + e_position = end.e; + z_position = end.z; + } + + planner.buffer_segment(rx, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder); + } //else printf("FIRST MOVE PRUNED "); + } + + // At the final destination? Usually not, but when on a Y Mesh Line it's completed. + if (xy_pos_t(current_position) != xy_pos_t(end)) + goto FINAL_MOVE; + + current_position = destination; + return; + } + + /** + * Handle horizontal lines that stay within one row. + * These need not be perfectly horizontal. + */ + if (iadd.y == 0) { // Horizontal line? + icell.x += ineg.x; // Heading left? Just go to the left edge of the cell for the first move. + while (icell.x != iend.x + ineg.x) { + icell.x += iadd.x; + const float rx = mesh_index_to_xpos(icell.x); + const float ry = ratio * rx + c; // Calculate Y at the next X mesh line + + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, icell.x, icell.y) + * planner.fade_scaling_factor_for_z(end.z); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + /** + * Without this check, it's possible to generate a zero length move, as in the case where + * the line is heading left, starting exactly on a mesh line boundary. Since this is rare + * it might be fine to remove this check and let planner.buffer_segment() filter it out. + */ + if (rx != start.x) { + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? rx - start.x : ry - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; // is based on X or Y because this is a horizontal move + z_position = start.z + on_axis_distance * z_normalized_dist; + } + else { + e_position = end.e; + z_position = end.z; + } + + if (!planner.buffer_segment(rx, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder)) + break; + } //else printf("FIRST MOVE PRUNED "); + } + + if (xy_pos_t(current_position) != xy_pos_t(end)) + goto FINAL_MOVE; + + current_position = destination; + return; + } + + /** + * Generic case of a line crossing both X and Y Mesh lines. + */ + + xy_int8_t cnt = (istart - iend).ABS(); + + icell += ineg; + + while (cnt) { + + const float next_mesh_line_x = mesh_index_to_xpos(icell.x + iadd.x), + next_mesh_line_y = mesh_index_to_ypos(icell.y + iadd.y), + ry = ratio * next_mesh_line_x + c, // Calculate Y at the next X mesh line + rx = (next_mesh_line_y - c) / ratio; // Calculate X at the next Y mesh line + // (No need to worry about ratio == 0. + // In that case, it was already detected + // as a vertical line move above.) + + if (neg.x == (rx > next_mesh_line_x)) { // Check if we hit the Y line first + // Yes! Crossing a Y Mesh Line next + float z0 = z_correction_for_x_on_horizontal_mesh_line(rx, icell.x - ineg.x, icell.y + iadd.y) + * planner.fade_scaling_factor_for_z(end.z); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? rx - start.x : next_mesh_line_y - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; + z_position = start.z + on_axis_distance * z_normalized_dist; + } + else { + e_position = end.e; + z_position = end.z; + } + if (!planner.buffer_segment(rx, next_mesh_line_y, z_position + z0, e_position, scaled_fr_mm_s, extruder)) + break; + icell.y += iadd.y; + cnt.y--; + } + else { + // Yes! Crossing a X Mesh Line next + float z0 = z_correction_for_y_on_vertical_mesh_line(ry, icell.x + iadd.x, icell.y - ineg.y) + * planner.fade_scaling_factor_for_z(end.z); + + // Undefined parts of the Mesh in z_values[][] are NAN. + // Replace NAN corrections with 0.0 to prevent NAN propagation. + if (isnan(z0)) z0 = 0.0; + + if (!inf_normalized_flag) { + on_axis_distance = use_x_dist ? next_mesh_line_x - start.x : ry - start.y; + e_position = start.e + on_axis_distance * e_normalized_dist; + z_position = start.z + on_axis_distance * z_normalized_dist; + } + else { + e_position = end.e; + z_position = end.z; + } + + if (!planner.buffer_segment(next_mesh_line_x, ry, z_position + z0, e_position, scaled_fr_mm_s, extruder)) + break; + icell.x += iadd.x; + cnt.x--; + } + + if (cnt.x < 0 || cnt.y < 0) break; // Too far! Exit the loop and go to FINAL_MOVE + } + + if (xy_pos_t(current_position) != xy_pos_t(end)) + goto FINAL_MOVE; + + current_position = destination; + } + +#else // UBL_SEGMENTED + + #if IS_SCARA + #define DELTA_SEGMENT_MIN_LENGTH 0.25 // SCARA minimum segment size is 0.25mm + #elif ENABLED(DELTA) + #define DELTA_SEGMENT_MIN_LENGTH 0.10 // mm (still subject to DELTA_SEGMENTS_PER_SECOND) + #else // CARTESIAN + #ifdef LEVELED_SEGMENT_LENGTH + #define DELTA_SEGMENT_MIN_LENGTH LEVELED_SEGMENT_LENGTH + #else + #define DELTA_SEGMENT_MIN_LENGTH 1.00 // mm (similar to G2/G3 arc segmentation) + #endif + #endif + + /** + * Prepare a segmented linear move for DELTA/SCARA/CARTESIAN with UBL and FADE semantics. + * This calls planner.buffer_segment multiple times for small incremental moves. + * Returns true if did NOT move, false if moved (requires current_position update). + */ + + bool _O2 unified_bed_leveling::line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s) { + + if (!position_is_reachable(destination)) // fail if moving outside reachable boundary + return true; // did not move, so current_position still accurate + + const xyze_pos_t total = destination - current_position; + + const float cart_xy_mm_2 = HYPOT2(total.x, total.y), + cart_xy_mm = SQRT(cart_xy_mm_2); // Total XY distance + + #if IS_KINEMATIC + const float seconds = cart_xy_mm / scaled_fr_mm_s; // Duration of XY move at requested rate + uint16_t segments = LROUND(delta_segments_per_second * seconds), // Preferred number of segments for distance @ feedrate + seglimit = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Number of segments at minimum segment length + NOMORE(segments, seglimit); // Limit to minimum segment length (fewer segments) + #else + uint16_t segments = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Cartesian fixed segment length + #endif + + NOLESS(segments, 1U); // Must have at least one segment + const float inv_segments = 1.0f / segments, // Reciprocal to save calculation + segment_xyz_mm = SQRT(cart_xy_mm_2 + sq(total.z)) * inv_segments; // Length of each segment + + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = scaled_fr_mm_s / segment_xyz_mm; + #endif + + xyze_float_t diff = total * inv_segments; + + // Note that E segment distance could vary slightly as z mesh height + // changes for each segment, but small enough to ignore. + + xyze_pos_t raw = current_position; + + // Just do plain segmentation if UBL is inactive or the target is above the fade height + if (!planner.leveling_active || !planner.leveling_active_at_z(destination.z)) { + while (--segments) { + raw += diff; + planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, segment_xyz_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + } + planner.buffer_line(destination, scaled_fr_mm_s, active_extruder, segment_xyz_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + return false; // Did not set current from destination + } + + // Otherwise perform per-segment leveling + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + const float fade_scaling_factor = planner.fade_scaling_factor_for_z(destination.z); + #endif + + // Move to first segment destination + raw += diff; + + for (;;) { // for each mesh cell encountered during the move + + // Compute mesh cell invariants that remain constant for all segments within cell. + // Note for cell index, if point is outside the mesh grid (in MESH_INSET perimeter) + // the bilinear interpolation from the adjacent cell within the mesh will still work. + // Inner loop will exit each time (because out of cell bounds) but will come back + // in top of loop and again re-find same adjacent cell and use it, just less efficient + // for mesh inset area. + + xy_int8_t icell = { + int8_t((raw.x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)), + int8_t((raw.y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)) + }; + LIMIT(icell.x, 0, (GRID_MAX_POINTS_X) - 1); + LIMIT(icell.y, 0, (GRID_MAX_POINTS_Y) - 1); + + float z_x0y0 = z_values[icell.x ][icell.y ], // z at lower left corner + z_x1y0 = z_values[icell.x+1][icell.y ], // z at upper left corner + z_x0y1 = z_values[icell.x ][icell.y+1], // z at lower right corner + z_x1y1 = z_values[icell.x+1][icell.y+1]; // z at upper right corner + + if (isnan(z_x0y0)) z_x0y0 = 0; // ideally activating planner.leveling_active (G29 A) + if (isnan(z_x1y0)) z_x1y0 = 0; // should refuse if any invalid mesh points + if (isnan(z_x0y1)) z_x0y1 = 0; // in order to avoid isnan tests per cell, + if (isnan(z_x1y1)) z_x1y1 = 0; // thus guessing zero for undefined points + + const xy_pos_t pos = { mesh_index_to_xpos(icell.x), mesh_index_to_ypos(icell.y) }; + xy_pos_t cell = raw - pos; + + const float z_xmy0 = (z_x1y0 - z_x0y0) * RECIPROCAL(MESH_X_DIST), // z slope per x along y0 (lower left to lower right) + z_xmy1 = (z_x1y1 - z_x0y1) * RECIPROCAL(MESH_X_DIST); // z slope per x along y1 (upper left to upper right) + + float z_cxy0 = z_x0y0 + z_xmy0 * cell.x; // z height along y0 at cell.x (changes for each cell.x in cell) + + const float z_cxy1 = z_x0y1 + z_xmy1 * cell.x, // z height along y1 at cell.x + z_cxyd = z_cxy1 - z_cxy0; // z height difference along cell.x from y0 to y1 + + float z_cxym = z_cxyd * RECIPROCAL(MESH_Y_DIST); // z slope per y along cell.x from pos.y to y1 (changes for each cell.x in cell) + + // float z_cxcy = z_cxy0 + z_cxym * cell.y; // interpolated mesh z height along cell.x at cell.y (do inside the segment loop) + + // As subsequent segments step through this cell, the z_cxy0 intercept will change + // and the z_cxym slope will change, both as a function of cell.x within the cell, and + // each change by a constant for fixed segment lengths. + + const float z_sxy0 = z_xmy0 * diff.x, // per-segment adjustment to z_cxy0 + z_sxym = (z_xmy1 - z_xmy0) * RECIPROCAL(MESH_Y_DIST) * diff.x; // per-segment adjustment to z_cxym + + for (;;) { // for all segments within this mesh cell + + if (--segments == 0) raw = destination; // if this is last segment, use destination for exact + + const float z_cxcy = (z_cxy0 + z_cxym * cell.y) // interpolated mesh z height along cell.x at cell.y + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + * fade_scaling_factor // apply fade factor to interpolated mesh height + #endif + ; + + planner.buffer_line(raw.x, raw.y, raw.z + z_cxcy, raw.e, scaled_fr_mm_s, active_extruder, segment_xyz_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + + if (segments == 0) // done with last segment + return false; // didn't set current from destination + + raw += diff; + cell += diff; + + if (!WITHIN(cell.x, 0, MESH_X_DIST) || !WITHIN(cell.y, 0, MESH_Y_DIST)) // done within this cell, break to next + break; + + // Next segment still within same mesh cell, adjust the per-segment + // slope and intercept to compute next z height. + + z_cxy0 += z_sxy0; // adjust z_cxy0 by per-segment z_sxy0 + z_cxym += z_sxym; // adjust z_cxym by per-segment z_sxym + + } // segment loop + } // cell loop + + return false; // caller will update current_position + } + +#endif // UBL_SEGMENTED + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/binary_stream.cpp b/Marlin/src/feature/binary_stream.cpp new file mode 100644 index 00000000..81e11033 --- /dev/null +++ b/Marlin/src/feature/binary_stream.cpp @@ -0,0 +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) + +#include "../sd/cardreader.h" +#include "binary_stream.h" + +char* SDFileTransferProtocol::Packet::Open::data = nullptr; +size_t SDFileTransferProtocol::data_waiting, SDFileTransferProtocol::transfer_timeout, SDFileTransferProtocol::idle_timeout; +bool SDFileTransferProtocol::transfer_active, SDFileTransferProtocol::dummy_transfer, SDFileTransferProtocol::compression; + +BinaryStream binaryStream[NUM_SERIAL]; + +#endif diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h new file mode 100644 index 00000000..32ebcce2 --- /dev/null +++ b/Marlin/src/feature/binary_stream.h @@ -0,0 +1,474 @@ +/** + * 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" + +#define BINARY_STREAM_COMPRESSION + +#if ENABLED(BINARY_STREAM_COMPRESSION) + #include "../libs/heatshrink/heatshrink_decoder.h" +#endif + +inline bool bs_serial_data_available(const uint8_t index) { + switch (index) { + case 0: return MYSERIAL0.available(); + #if HAS_MULTI_SERIAL + case 1: return MYSERIAL1.available(); + #endif + } + return false; +} + +inline int bs_read_serial(const uint8_t index) { + switch (index) { + case 0: return MYSERIAL0.read(); + #if HAS_MULTI_SERIAL + case 1: return MYSERIAL1.read(); + #endif + } + return -1; +} + +#if ENABLED(BINARY_STREAM_COMPRESSION) + static heatshrink_decoder hsd; + static uint8_t decode_buffer[512] = {}; +#endif + +class SDFileTransferProtocol { +private: + struct Packet { + struct [[gnu::packed]] Open { + static bool validate(char* buffer, size_t length) { + return (length > sizeof(Open) && buffer[length - 1] == '\0'); + } + static Open& decode(char* buffer) { + data = &buffer[2]; + return *reinterpret_cast(buffer); + } + bool compression_enabled() { return compression & 0x1; } + bool dummy_transfer() { return dummy & 0x1; } + static char* filename() { return data; } + private: + uint8_t dummy, compression; + static char* data; // variable length strings complicate things + }; + }; + + static bool file_open(char* filename) { + if (!dummy_transfer) { + card.mount(); + card.openFileWrite(filename); + if (!card.isFileOpen()) return false; + } + transfer_active = true; + data_waiting = 0; + TERN_(BINARY_STREAM_COMPRESSION, heatshrink_decoder_reset(&hsd)); + return true; + } + + static bool file_write(char* buffer, const size_t length) { + #if ENABLED(BINARY_STREAM_COMPRESSION) + if (compression) { + size_t total_processed = 0, processed_count = 0; + HSD_poll_res presult; + + while (total_processed < length) { + heatshrink_decoder_sink(&hsd, reinterpret_cast(&buffer[total_processed]), length - total_processed, &processed_count); + total_processed += processed_count; + do { + presult = heatshrink_decoder_poll(&hsd, &decode_buffer[data_waiting], sizeof(decode_buffer) - data_waiting, &processed_count); + data_waiting += processed_count; + if (data_waiting == sizeof(decode_buffer)) { + if (!dummy_transfer) + if (card.write(decode_buffer, data_waiting) < 0) { + return false; + } + data_waiting = 0; + } + } while (presult == HSDR_POLL_MORE); + } + return true; + } + #endif + return (dummy_transfer || card.write(buffer, length) >= 0); + } + + static bool file_close() { + if (!dummy_transfer) { + #if ENABLED(BINARY_STREAM_COMPRESSION) + // flush any buffered data + if (data_waiting) { + if (card.write(decode_buffer, data_waiting) < 0) return false; + data_waiting = 0; + } + #endif + card.closefile(); + card.release(); + } + TERN_(BINARY_STREAM_COMPRESSION, heatshrink_decoder_finish(&hsd)); + transfer_active = false; + return true; + } + + static void transfer_abort() { + if (!dummy_transfer) { + card.closefile(); + card.removeFile(card.filename); + card.release(); + TERN_(BINARY_STREAM_COMPRESSION, heatshrink_decoder_finish(&hsd)); + } + transfer_active = false; + return; + } + + enum class FileTransfer : uint8_t { QUERY, OPEN, CLOSE, WRITE, ABORT }; + + static size_t data_waiting, transfer_timeout, idle_timeout; + static bool transfer_active, dummy_transfer, compression; + +public: + + static void idle() { + // If a transfer is interrupted and a file is left open, abort it after TIMEOUT ms + const millis_t ms = millis(); + if (transfer_active && ELAPSED(ms, idle_timeout)) { + idle_timeout = ms + IDLE_PERIOD; + if (ELAPSED(ms, transfer_timeout)) transfer_abort(); + } + } + + static void process(uint8_t packet_type, char* buffer, const uint16_t length) { + transfer_timeout = millis() + TIMEOUT; + switch (static_cast(packet_type)) { + case FileTransfer::QUERY: + SERIAL_ECHOPAIR("PFT:version:", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH); + #if ENABLED(BINARY_STREAM_COMPRESSION) + SERIAL_ECHOLNPAIR(":compresion:heatshrink,", HEATSHRINK_STATIC_WINDOW_BITS, ",", HEATSHRINK_STATIC_LOOKAHEAD_BITS); + #else + SERIAL_ECHOLNPGM(":compresion:none"); + #endif + break; + case FileTransfer::OPEN: + if (transfer_active) + SERIAL_ECHOLNPGM("PFT:busy"); + else { + if (Packet::Open::validate(buffer, length)) { + auto packet = Packet::Open::decode(buffer); + compression = packet.compression_enabled(); + dummy_transfer = packet.dummy_transfer(); + if (file_open(packet.filename())) { + SERIAL_ECHOLNPGM("PFT:success"); + break; + } + } + SERIAL_ECHOLNPGM("PFT:fail"); + } + break; + case FileTransfer::CLOSE: + if (transfer_active) { + if (file_close()) + SERIAL_ECHOLNPGM("PFT:success"); + else + SERIAL_ECHOLNPGM("PFT:ioerror"); + } + else SERIAL_ECHOLNPGM("PFT:invalid"); + break; + case FileTransfer::WRITE: + if (!transfer_active) + SERIAL_ECHOLNPGM("PFT:invalid"); + else if (!file_write(buffer, length)) + SERIAL_ECHOLNPGM("PFT:ioerror"); + break; + case FileTransfer::ABORT: + transfer_abort(); + SERIAL_ECHOLNPGM("PFT:success"); + break; + default: + SERIAL_ECHOLNPGM("PTF:invalid"); + break; + } + } + + static const uint16_t VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0, TIMEOUT = 10000, IDLE_PERIOD = 1000; +}; + +class BinaryStream { +public: + enum class Protocol : uint8_t { CONTROL, FILE_TRANSFER }; + + enum class ProtocolControl : uint8_t { SYNC = 1, CLOSE }; + + enum class StreamState : uint8_t { PACKET_RESET, PACKET_WAIT, PACKET_HEADER, PACKET_DATA, PACKET_FOOTER, + PACKET_PROCESS, PACKET_RESEND, PACKET_TIMEOUT, PACKET_ERROR }; + + struct Packet { // 10 byte protocol overhead, ascii with checksum and line number has a minimum of 7 increasing with line + + union Header { + static constexpr uint16_t HEADER_TOKEN = 0xB5AD; + struct [[gnu::packed]] { + uint16_t token; // packet start token + uint8_t sync; // stream sync, resend id and packet loss detection + uint8_t meta; // 4 bit protocol, + // 4 bit packet type + uint16_t size; // data length + uint16_t checksum; // header checksum + }; + uint8_t protocol() { return (meta >> 4) & 0xF; } + uint8_t type() { return meta & 0xF; } + void reset() { token = 0; sync = 0; meta = 0; size = 0; checksum = 0; } + uint8_t data[2]; + }; + + union Footer { + struct [[gnu::packed]] { + uint16_t checksum; // full packet checksum + }; + void reset() { checksum = 0; } + uint8_t data[1]; + }; + + Header header; + Footer footer; + uint32_t bytes_received; + uint16_t checksum, header_checksum; + millis_t timeout; + char* buffer; + + void reset() { + header.reset(); + footer.reset(); + bytes_received = 0; + checksum = 0; + header_checksum = 0; + timeout = millis() + PACKET_MAX_WAIT; + buffer = nullptr; + } + } packet{}; + + void reset() { + sync = 0; + packet_retries = 0; + buffer_next_index = 0; + } + + // fletchers 16 checksum + uint32_t checksum(uint32_t cs, uint8_t value) { + uint16_t cs_low = (((cs & 0xFF) + value) % 255); + return ((((cs >> 8) + cs_low) % 255) << 8) | cs_low; + } + + // read the next byte from the data stream keeping track of + // whether the stream times out from data starvation + // takes the data variable by reference in order to return status + bool stream_read(uint8_t& data) { + if (stream_state != StreamState::PACKET_WAIT && ELAPSED(millis(), packet.timeout)) { + stream_state = StreamState::PACKET_TIMEOUT; + return false; + } + if (!bs_serial_data_available(card.transfer_port_index)) return false; + data = bs_read_serial(card.transfer_port_index); + packet.timeout = millis() + PACKET_MAX_WAIT; + return true; + } + + template + void receive(char (&buffer)[buffer_size]) { + uint8_t data = 0; + millis_t transfer_window = millis() + RX_TIMESLICE; + + #if ENABLED(SDSUPPORT) + PORT_REDIRECT(card.transfer_port_index); + #endif + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" + + while (PENDING(millis(), transfer_window)) { + switch (stream_state) { + /** + * Data stream packet handling + */ + case StreamState::PACKET_RESET: + packet.reset(); + stream_state = StreamState::PACKET_WAIT; + case StreamState::PACKET_WAIT: + if (!stream_read(data)) { idle(); return; } // no active packet so don't wait + packet.header.data[1] = data; + if (packet.header.token == packet.header.HEADER_TOKEN) { + packet.bytes_received = 2; + stream_state = StreamState::PACKET_HEADER; + } + else { + // stream corruption drop data + packet.header.data[0] = data; + } + break; + case StreamState::PACKET_HEADER: + if (!stream_read(data)) break; + + packet.header.data[packet.bytes_received++] = data; + packet.checksum = checksum(packet.checksum, data); + + // header checksum calculation can't contain the checksum + if (packet.bytes_received == sizeof(Packet::header) - 2) + packet.header_checksum = packet.checksum; + + if (packet.bytes_received == sizeof(Packet::header)) { + if (packet.header.checksum == packet.header_checksum) { + // The SYNC control packet is a special case in that it doesn't require the stream sync to be correct + if (static_cast(packet.header.protocol()) == Protocol::CONTROL && static_cast(packet.header.type()) == ProtocolControl::SYNC) { + SERIAL_ECHOLNPAIR("ss", sync, ",", buffer_size, ",", VERSION_MAJOR, ".", VERSION_MINOR, ".", VERSION_PATCH); + stream_state = StreamState::PACKET_RESET; + break; + } + if (packet.header.sync == sync) { + buffer_next_index = 0; + packet.bytes_received = 0; + if (packet.header.size) { + stream_state = StreamState::PACKET_DATA; + packet.buffer = static_cast(&buffer[0]); // multipacket buffering not implemented, always allocate whole buffer to packet + } + else + stream_state = StreamState::PACKET_PROCESS; + } + else if (packet.header.sync == sync - 1) { // ok response must have been lost + SERIAL_ECHOLNPAIR("ok", packet.header.sync); // transmit valid packet received and drop the payload + stream_state = StreamState::PACKET_RESET; + } + else if (packet_retries) { + stream_state = StreamState::PACKET_RESET; // could be packets already buffered on flow controlled connections, drop them without ack + } + else { + SERIAL_ECHO_MSG("Datastream packet out of order"); + stream_state = StreamState::PACKET_RESEND; + } + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Packet header(", packet.header.sync, "?) corrupt"); + stream_state = StreamState::PACKET_RESEND; + } + } + break; + case StreamState::PACKET_DATA: + if (!stream_read(data)) break; + + if (buffer_next_index < buffer_size) + packet.buffer[buffer_next_index] = data; + else { + SERIAL_ECHO_MSG("Datastream packet data buffer overrun"); + stream_state = StreamState::PACKET_ERROR; + break; + } + + packet.checksum = checksum(packet.checksum, data); + packet.bytes_received++; + buffer_next_index++; + + if (packet.bytes_received == packet.header.size) { + stream_state = StreamState::PACKET_FOOTER; + packet.bytes_received = 0; + } + break; + case StreamState::PACKET_FOOTER: + if (!stream_read(data)) break; + + packet.footer.data[packet.bytes_received++] = data; + if (packet.bytes_received == sizeof(Packet::footer)) { + if (packet.footer.checksum == packet.checksum) { + stream_state = StreamState::PACKET_PROCESS; + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Packet(", packet.header.sync, ") payload corrupt"); + stream_state = StreamState::PACKET_RESEND; + } + } + break; + case StreamState::PACKET_PROCESS: + sync++; + packet_retries = 0; + bytes_received += packet.header.size; + + SERIAL_ECHOLNPAIR("ok", packet.header.sync); // transmit valid packet received + dispatch(); + stream_state = StreamState::PACKET_RESET; + break; + case StreamState::PACKET_RESEND: + if (packet_retries < MAX_RETRIES || MAX_RETRIES == 0) { + packet_retries++; + stream_state = StreamState::PACKET_RESET; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Resend request ", int(packet_retries)); + SERIAL_ECHOLNPAIR("rs", sync); + } + else + stream_state = StreamState::PACKET_ERROR; + break; + case StreamState::PACKET_TIMEOUT: + SERIAL_ECHO_MSG("Datastream timeout"); + stream_state = StreamState::PACKET_RESEND; + break; + case StreamState::PACKET_ERROR: + SERIAL_ECHOLNPAIR("fe", packet.header.sync); + reset(); // reset everything, resync required + stream_state = StreamState::PACKET_RESET; + break; + } + } + + #pragma GCC diagnostic pop + } + + void dispatch() { + switch (static_cast(packet.header.protocol())) { + case Protocol::CONTROL: + switch (static_cast(packet.header.type())) { + case ProtocolControl::CLOSE: // revert back to ASCII mode + card.flag.binary_mode = false; + break; + default: + SERIAL_ECHO_MSG("Unknown BinaryProtocolControl Packet"); + } + break; + case Protocol::FILE_TRANSFER: + SDFileTransferProtocol::process(packet.header.type(), packet.buffer, packet.header.size); // send user data to be processed + break; + default: + SERIAL_ECHO_MSG("Unsupported Binary Protocol"); + } + } + + void idle() { + // Some Protocols may need periodic updates without new data + SDFileTransferProtocol::idle(); + } + + static const uint16_t PACKET_MAX_WAIT = 500, RX_TIMESLICE = 20, MAX_RETRIES = 0, VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0; + uint8_t packet_retries, sync; + uint16_t buffer_next_index; + uint32_t bytes_received; + StreamState stream_state = StreamState::PACKET_RESET; +}; + +extern BinaryStream binaryStream[NUM_SERIAL]; diff --git a/Marlin/src/feature/bltouch.cpp b/Marlin/src/feature/bltouch.cpp new file mode 100644 index 00000000..d6b1f99c --- /dev/null +++ b/Marlin/src/feature/bltouch.cpp @@ -0,0 +1,206 @@ +/** + * 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(BLTOUCH) + +#include "bltouch.h" + +BLTouch bltouch; + +bool BLTouch::last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain + +#include "../module/servo.h" + +void stop(); + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../core/debug_out.h" + +bool BLTouch::command(const BLTCommand cmd, const millis_t &ms) { + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPAIR("BLTouch Command :", cmd); + MOVE_SERVO(Z_PROBE_SERVO_NR, cmd); + safe_delay(_MAX(ms, (uint32_t)BLTOUCH_DELAY)); // BLTOUCH_DELAY is also the *minimum* delay + return triggered(); +} + +// Init the class and device. Call from setup(). +void BLTouch::init(const bool set_voltage/*=false*/) { + // Voltage Setting (if enabled). At every Marlin initialization: + // BLTOUCH < V3.0 and clones: This will be ignored by the probe + // BLTOUCH V3.0: SET_5V_MODE or SET_OD_MODE (if enabled). + // OD_MODE is the default on power on, but setting it does not hurt + // This mode will stay active until manual SET_OD_MODE or power cycle + // BLTOUCH V3.1: SET_5V_MODE or SET_OD_MODE (if enabled). + // At power on, the probe will default to the eeprom settings configured by the user + _reset(); + _stow(); + + #if ENABLED(BLTOUCH_FORCE_MODE_SET) + + constexpr bool should_set = true; + + #else + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOLNPAIR("last_written_mode - ", (int)last_written_mode); + DEBUG_ECHOLNPGM("config mode - " + #if ENABLED(BLTOUCH_SET_5V_MODE) + "BLTOUCH_SET_5V_MODE" + #else + "OD" + #endif + ); + } + + const bool should_set = last_written_mode != ENABLED(BLTOUCH_SET_5V_MODE); + + #endif + + if (should_set && set_voltage) + mode_conv_proc(ENABLED(BLTOUCH_SET_5V_MODE)); +} + +void BLTouch::clear() { + _reset(); // RESET or RESET_SW will clear an alarm condition but... + // ...it will not clear a triggered condition in SW mode when the pin is currently up + // ANTClabs <-- CODE ERROR + _stow(); // STOW will pull up the pin and clear any triggered condition unless it fails, don't care + _deploy(); // DEPLOY to test the probe. Could fail, don't care + _stow(); // STOW to be ready for meaningful work. Could fail, don't care +} + +bool BLTouch::triggered() { + return ( + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING + #else + READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING + #endif + ); +} + +bool BLTouch::deploy_proc() { + // Do a DEPLOY + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch DEPLOY requested"); + + // Attempt to DEPLOY, wait for DEPLOY_DELAY or ALARM + if (_deploy_query_alarm()) { + // The deploy might have failed or the probe is already triggered (nozzle too low?) + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch ALARM or TRIGGER after DEPLOY, recovering"); + + clear(); // Get the probe into start condition + + // Last attempt to DEPLOY + if (_deploy_query_alarm()) { + // The deploy might have failed or the probe is actually triggered (nozzle too low?) again + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Recovery Failed"); + + SERIAL_ERROR_MSG(STR_STOP_BLTOUCH); // Tell the user something is wrong, needs action + stop(); // but it's not too bad, no need to kill, allow restart + + return true; // Tell our caller we goofed in case he cares to know + } + } + + // One of the recommended ANTClabs ways to probe, using SW MODE + TERN_(BLTOUCH_FORCE_SW_MODE, _set_SW_mode()); + + // Now the probe is ready to issue a 10ms pulse when the pin goes up. + // The trigger STOW (see motion.cpp for example) will pull up the probes pin as soon as the pulse + // is registered. + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("bltouch.deploy_proc() end"); + + return false; // report success to caller +} + +bool BLTouch::stow_proc() { + // Do a STOW + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch STOW requested"); + + // A STOW will clear a triggered condition in the probe (10ms pulse). + // At the moment that we come in here, we might (pulse) or will (SW mode) see the trigger on the pin. + // So even though we know a STOW will be ignored if an ALARM condition is active, we will STOW. + // Note: If the probe is deployed AND in an ALARM condition, this STOW will not pull up the pin + // and the ALARM condition will still be there. --> ANTClabs should change this behavior maybe + + // Attempt to STOW, wait for STOW_DELAY or ALARM + if (_stow_query_alarm()) { + // The stow might have failed + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch ALARM or TRIGGER after STOW, recovering"); + + _reset(); // This RESET will then also pull up the pin. If it doesn't + // work and the pin is still down, there will no longer be + // an ALARM condition though. + // But one more STOW will catch that + // Last attempt to STOW + if (_stow_query_alarm()) { // so if there is now STILL an ALARM condition: + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch Recovery Failed"); + + SERIAL_ERROR_MSG(STR_STOP_BLTOUCH); // Tell the user something is wrong, needs action + stop(); // but it's not too bad, no need to kill, allow restart + + return true; // Tell our caller we goofed in case he cares to know + } + } + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("bltouch.stow_proc() end"); + + return false; // report success to caller +} + +bool BLTouch::status_proc() { + /** + * Return a TRUE for "YES, it is DEPLOYED" + * This function will ensure switch state is reset after execution + */ + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("BLTouch STATUS requested"); + + _set_SW_mode(); // Incidentally, _set_SW_mode() will also RESET any active alarm + const bool tr = triggered(); // If triggered in SW mode, the pin is up, it is STOWED + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch is ", (int)tr); + + if (tr) _stow(); else _deploy(); // Turn off SW mode, reset any trigger, honor pin state + return !tr; +} + +void BLTouch::mode_conv_proc(const bool M5V) { + /** + * BLTOUCH pre V3.0 and clones: No reaction at all to this sequence apart from a DEPLOY -> STOW + * BLTOUCH V3.0: This will set the mode (twice) and sadly, a STOW is needed at the end, because of the deploy + * BLTOUCH V3.1: This will set the mode and store it in the eeprom. The STOW is not needed but does not hurt + */ + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("BLTouch Set Mode - ", (int)M5V); + _deploy(); + if (M5V) _set_5V_mode(); else _set_OD_mode(); + _mode_store(); + if (M5V) _set_5V_mode(); else _set_OD_mode(); + _stow(); + last_written_mode = M5V; +} + +#endif // BLTOUCH diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h new file mode 100644 index 00000000..40685af1 --- /dev/null +++ b/Marlin/src/feature/bltouch.h @@ -0,0 +1,116 @@ +/** + * 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" + +// BLTouch commands are sent as servo angles +typedef unsigned char BLTCommand; + +#if ENABLED(CREALITY_TOUCH) + #define STOW_ALARM false + #define BLTOUCH_DEPLOY 170 + #define BLTOUCH_STOW 20 +#else + #define STOW_ALARM true + #define BLTOUCH_DEPLOY 10 + #define BLTOUCH_STOW 90 +#endif + +#define BLTOUCH_SW_MODE 60 +#define BLTOUCH_SELFTEST 120 +#define BLTOUCH_MODE_STORE 130 +#define BLTOUCH_5V_MODE 140 +#define BLTOUCH_OD_MODE 150 +#define BLTOUCH_RESET 160 + +/** + * The following commands require different minimum delays. + * + * 500ms required for a reliable Reset. + * + * 750ms required for Deploy/Stow, otherwise the alarm state + * will not be seen until the following move command. + */ + +#ifndef BLTOUCH_SET5V_DELAY + #define BLTOUCH_SET5V_DELAY 150 +#endif +#ifndef BLTOUCH_SETOD_DELAY + #define BLTOUCH_SETOD_DELAY 150 +#endif +#ifndef BLTOUCH_MODE_STORE_DELAY + #define BLTOUCH_MODE_STORE_DELAY 150 +#endif +#ifndef BLTOUCH_DEPLOY_DELAY + #define BLTOUCH_DEPLOY_DELAY 750 +#endif +#ifndef BLTOUCH_STOW_DELAY + #define BLTOUCH_STOW_DELAY 750 +#endif +#ifndef BLTOUCH_RESET_DELAY + #define BLTOUCH_RESET_DELAY 500 +#endif + +class BLTouch { +public: + static void init(const bool set_voltage=false); + static bool last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain + + // DEPLOY and STOW are wrapped for error handling - these are used by homing and by probing + FORCE_INLINE static bool deploy() { return deploy_proc(); } + FORCE_INLINE static bool stow() { return stow_proc(); } + FORCE_INLINE static bool status() { return status_proc(); } + + // Native BLTouch commands ("Underscore"...), used in lcd menus and internally + FORCE_INLINE static void _reset() { command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); } + + FORCE_INLINE static void _selftest() { command(BLTOUCH_SELFTEST, BLTOUCH_DELAY); } + + FORCE_INLINE static void _set_SW_mode() { command(BLTOUCH_SW_MODE, BLTOUCH_DELAY); } + FORCE_INLINE static void _reset_SW_mode() { if (triggered()) _stow(); else _deploy(); } + + FORCE_INLINE static void _set_5V_mode() { command(BLTOUCH_5V_MODE, BLTOUCH_SET5V_DELAY); } + FORCE_INLINE static void _set_OD_mode() { command(BLTOUCH_OD_MODE, BLTOUCH_SETOD_DELAY); } + FORCE_INLINE static void _mode_store() { command(BLTOUCH_MODE_STORE, BLTOUCH_MODE_STORE_DELAY); } + + FORCE_INLINE static void _deploy() { command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + FORCE_INLINE static void _stow() { command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY); } + + FORCE_INLINE static void mode_conv_5V() { mode_conv_proc(true); } + FORCE_INLINE static void mode_conv_OD() { mode_conv_proc(false); } + + static bool triggered(); + +private: + FORCE_INLINE static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + FORCE_INLINE static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } + + static void clear(); + static bool command(const BLTCommand cmd, const millis_t &ms); + static bool deploy_proc(); + static bool stow_proc(); + static bool status_proc(); + static void mode_conv_proc(const bool M5V); +}; + +extern BLTouch bltouch; diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp new file mode 100644 index 00000000..16f876f1 --- /dev/null +++ b/Marlin/src/feature/cancel_object.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/MarlinConfig.h" + +#if ENABLED(CANCEL_OBJECTS) + +#include "cancel_object.h" +#include "../gcode/gcode.h" +#include "../lcd/ultralcd.h" + +CancelObject cancelable; + +int8_t CancelObject::object_count, // = 0 + CancelObject::active_object = -1; +uint32_t CancelObject::canceled; // = 0x0000 +bool CancelObject::skipping; // = false + +void CancelObject::set_active_object(const int8_t obj) { + active_object = obj; + if (WITHIN(obj, 0, 31)) { + if (obj >= object_count) object_count = obj + 1; + skipping = TEST(canceled, obj); + } + else + skipping = false; + + #if HAS_DISPLAY + if (active_object >= 0) + ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); + else + ui.reset_status(); + #endif +} + +void CancelObject::cancel_object(const int8_t obj) { + if (WITHIN(obj, 0, 31)) { + SBI(canceled, obj); + if (obj == active_object) skipping = true; + } +} + +void CancelObject::uncancel_object(const int8_t obj) { + if (WITHIN(obj, 0, 31)) { + CBI(canceled, obj); + if (obj == active_object) skipping = false; + } +} + +void CancelObject::report() { + if (active_object >= 0) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Active Object: ", int(active_object)); + } + + if (canceled) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Canceled:"); + for (int i = 0; i < object_count; i++) + if (TEST(canceled, i)) { SERIAL_CHAR(' '); SERIAL_ECHO(i); } + SERIAL_EOL(); + } +} + +#endif // CANCEL_OBJECTS diff --git a/Marlin/src/feature/cancel_object.h b/Marlin/src/feature/cancel_object.h new file mode 100644 index 00000000..1d2d77f2 --- /dev/null +++ b/Marlin/src/feature/cancel_object.h @@ -0,0 +1,41 @@ +/** + * 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 + +class CancelObject { +public: + static bool skipping; + static int8_t object_count, active_object; + static uint32_t canceled; + static void set_active_object(const int8_t obj); + static void cancel_object(const int8_t obj); + static void uncancel_object(const int8_t obj); + static void report(); + static inline bool is_canceled(const int8_t obj) { return TEST(canceled, obj); } + static inline void clear_active_object() { set_active_object(-1); } + static inline void cancel_active_object() { cancel_object(active_object); } + static inline void reset() { canceled = 0x0000; object_count = 0; clear_active_object(); } +}; + +extern CancelObject cancelable; diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp new file mode 100644 index 00000000..8a128bb1 --- /dev/null +++ b/Marlin/src/feature/caselight.cpp @@ -0,0 +1,95 @@ +/** + * 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(CASE_LIGHT_ENABLE) + +#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) + LEDColor CaseLight::color = + #ifdef CASE_LIGHT_NEOPIXEL_COLOR + CASE_LIGHT_NEOPIXEL_COLOR + #else + { 255, 255, 255, 255 } + #endif + ; +#endif + +#ifndef INVERT_CASE_LIGHT + #define INVERT_CASE_LIGHT false +#endif + +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 (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 = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; + #endif + + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + + leds.set_color( + MakeLEDColor(color.r, color.g, color.b, color.w, n10ct), + false + ); + + #else // !CASE_LIGHT_USE_NEOPIXEL + + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + if (PWM_PIN(CASE_LIGHT_PIN)) + analogWrite(pin_t(CASE_LIGHT_PIN), ( + #if CASE_LIGHT_MAX_PWM == 255 + n10ct + #else + map(n10ct, 0, 255, 0, CASE_LIGHT_MAX_PWM) + #endif + )); + else + #endif + { + const bool s = on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; + WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); + } + + #endif // !CASE_LIGHT_USE_NEOPIXEL +} + +#endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h new file mode 100644 index 00000000..9d1e76da --- /dev/null +++ b/Marlin/src/feature/caselight.h @@ -0,0 +1,45 @@ +/** + * 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" + +#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/closedloop.cpp b/Marlin/src/feature/closedloop.cpp new file mode 100644 index 00000000..8a97f0c0 --- /dev/null +++ b/Marlin/src/feature/closedloop.cpp @@ -0,0 +1,43 @@ +/** + * 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(EXTERNAL_CLOSED_LOOP_CONTROLLER) + +#if !PIN_EXISTS(CLOSED_LOOP_ENABLE) || !PIN_EXISTS(CLOSED_LOOP_MOVE_COMPLETE) + #error "CLOSED_LOOP_ENABLE_PIN and CLOSED_LOOP_MOVE_COMPLETE_PIN are required for EXTERNAL_CLOSED_LOOP_CONTROLLER." +#endif + +#include "closedloop.h" + +ClosedLoop closedloop; + +void ClosedLoop::init() { + OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, LOW); + SET_INPUT_PULLUP(CLOSED_LOOP_MOVE_COMPLETE_PIN); +} + +void ClosedLoop::set(const byte val) { + OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, val); +} + +#endif // EXTERNAL_CLOSED_LOOP_CONTROLLER diff --git a/Marlin/src/feature/closedloop.h b/Marlin/src/feature/closedloop.h new file mode 100644 index 00000000..e03400c3 --- /dev/null +++ b/Marlin/src/feature/closedloop.h @@ -0,0 +1,32 @@ +/** + * 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 + +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/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp new file mode 100644 index 00000000..fa5a86b0 --- /dev/null +++ b/Marlin/src/feature/controllerfan.cpp @@ -0,0 +1,95 @@ +/** + * 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(USE_CONTROLLER_FAN) + +#include "controllerfan.h" +#include "../module/stepper/indirection.h" +#include "../module/temperature.h" + +ControllerFan controllerFan; + +uint8_t ControllerFan::speed; + +#if ENABLED(CONTROLLER_FAN_EDITABLE) + controllerFan_settings_t ControllerFan::settings; // {0} +#endif + +void ControllerFan::setup() { + SET_OUTPUT(CONTROLLER_FAN_PIN); + init(); +} + +void ControllerFan::set_fan_speed(const uint8_t s) { + speed = s < (CONTROLLERFAN_SPEED_MIN) ? 0 : s; // Fan OFF below minimum +} + +void ControllerFan::update() { + static millis_t lastMotorOn = 0, // Last time a motor was turned on + nextMotorCheck = 0; // Last time the state was checked + const millis_t ms = millis(); + if (ELAPSED(ms, nextMotorCheck)) { + nextMotorCheck = ms + 2500UL; // Not a time critical function, so only check every 2.5s + + #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 = ( + ( 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)) + lastMotorOn = ms; //... set time to NOW so the fan will turn on + + // Fan Settings. Set fan > 0: + // - If AutoMode is on and steppers have been enabled for CONTROLLERFAN_IDLE_TIME seconds. + // - If System is on idle and idle fan speed settings is activated. + set_fan_speed( + settings.auto_mode && lastMotorOn && PENDING(ms, lastMotorOn + SEC_TO_MS(settings.duration)) + ? settings.active_speed : settings.idle_speed + ); + + // Allow digital or PWM fan output (see M42 handling) + WRITE(CONTROLLER_FAN_PIN, speed); + analogWrite(pin_t(CONTROLLER_FAN_PIN), speed); + } +} + +#endif // USE_CONTROLLER_FAN diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h new file mode 100644 index 00000000..d1d39f21 --- /dev/null +++ b/Marlin/src/feature/controllerfan.h @@ -0,0 +1,72 @@ +/** + * 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" + +typedef struct { + uint8_t active_speed, // 0-255 (fullspeed); Speed with enabled stepper motors + idle_speed; // 0-255 (fullspeed); Speed after idle period with all motors are disabled + uint16_t duration; // Duration in seconds for the fan to run after all motors are disabled + bool auto_mode; // Default true +} controllerFan_settings_t; + +#ifndef CONTROLLERFAN_SPEED_ACTIVE + #define CONTROLLERFAN_SPEED_ACTIVE 255 +#endif +#ifndef CONTROLLERFAN_SPEED_IDLE + #define CONTROLLERFAN_SPEED_IDLE 0 +#endif +#ifndef CONTROLLERFAN_IDLE_TIME + #define CONTROLLERFAN_IDLE_TIME 60 +#endif + +static constexpr controllerFan_settings_t controllerFan_defaults = { + CONTROLLERFAN_SPEED_ACTIVE, + CONTROLLERFAN_SPEED_IDLE, + CONTROLLERFAN_IDLE_TIME, + true +}; + +#if ENABLED(USE_CONTROLLER_FAN) + +class ControllerFan { + private: + static uint8_t speed; + static void set_fan_speed(const uint8_t s); + + public: + #if ENABLED(CONTROLLER_FAN_EDITABLE) + static controllerFan_settings_t settings; + #else + static const controllerFan_settings_t constexpr &settings = controllerFan_defaults; + #endif + static inline bool state() { return speed > 0; } + static inline void init() { reset(); } + static inline void reset() { TERN_(CONTROLLER_FAN_EDITABLE, settings = controllerFan_defaults); } + static void setup(); + static void update(); +}; + +extern ControllerFan controllerFan; + +#endif diff --git a/Marlin/src/feature/dac/dac_dac084s085.cpp b/Marlin/src/feature/dac/dac_dac084s085.cpp new file mode 100644 index 00000000..82d17fa2 --- /dev/null +++ b/Marlin/src/feature/dac/dac_dac084s085.cpp @@ -0,0 +1,98 @@ +/*************************************************************** + * + * External DAC for Alligator Board + * + ****************************************************************/ + +#include "../../inc/MarlinConfig.h" + +#if MB(ALLIGATOR) + +#include "dac_dac084s085.h" + +#include "../../MarlinCore.h" +#include "../../module/stepper.h" +#include "../../HAL/shared/Delay.h" + +dac084s085::dac084s085() { } + +void dac084s085::begin() { + uint8_t externalDac_buf[] = { 0x20, 0x00 }; // all off + + // All SPI chip-select HIGH + SET_OUTPUT(DAC0_SYNC); + #if HAS_MULTI_EXTRUDER + SET_OUTPUT(DAC1_SYNC); + #endif + cshigh(); + spiBegin(); + + //init onboard DAC + DELAY_US(2); + WRITE(DAC0_SYNC, LOW); + DELAY_US(2); + WRITE(DAC0_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC0_SYNC, LOW); + + spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); + WRITE(DAC0_SYNC, HIGH); + + #if HAS_MULTI_EXTRUDER + //init Piggy DAC + DELAY_US(2); + WRITE(DAC1_SYNC, LOW); + DELAY_US(2); + WRITE(DAC1_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC1_SYNC, LOW); + + spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); + WRITE(DAC1_SYNC, HIGH); + #endif + + return; +} + +void dac084s085::setValue(const uint8_t channel, const uint8_t value) { + if (channel >= 7) return; // max channel (X,Y,Z,E0,E1,E2,E3) + + const uint8_t externalDac_buf[] = { + 0x10 | ((channel > 3 ? 7 : 3) - channel << 6) | (value >> 4), + 0x00 | (value << 4) + }; + + // All SPI chip-select HIGH + cshigh(); + + if (channel > 3) { // DAC Piggy E1,E2,E3 + WRITE(DAC1_SYNC, LOW); + DELAY_US(2); + WRITE(DAC1_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC1_SYNC, LOW); + } + else { // DAC onboard X,Y,Z,E0 + WRITE(DAC0_SYNC, LOW); + DELAY_US(2); + WRITE(DAC0_SYNC, HIGH); + DELAY_US(2); + WRITE(DAC0_SYNC, LOW); + } + + DELAY_US(2); + spiSend(SPI_CHAN_DAC, externalDac_buf, COUNT(externalDac_buf)); +} + +void dac084s085::cshigh() { + WRITE(DAC0_SYNC, HIGH); + #if HAS_MULTI_EXTRUDER + WRITE(DAC1_SYNC, HIGH); + #endif + WRITE(SPI_EEPROM1_CS, HIGH); + WRITE(SPI_EEPROM2_CS, HIGH); + WRITE(SPI_FLASH_CS, HIGH); + WRITE(SS_PIN, HIGH); +} + +#endif // MB(ALLIGATOR) diff --git a/Marlin/src/feature/dac/dac_dac084s085.h b/Marlin/src/feature/dac/dac_dac084s085.h new file mode 100644 index 00000000..5be0129f --- /dev/null +++ b/Marlin/src/feature/dac/dac_dac084s085.h @@ -0,0 +1,31 @@ +/** + * 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 + +class dac084s085 { + public: + dac084s085(); + static void begin(); + static void setValue(const uint8_t channel, const uint8_t value); + private: + static void cshigh(); +}; diff --git a/Marlin/src/feature/dac/dac_mcp4728.cpp b/Marlin/src/feature/dac/dac_mcp4728.cpp new file mode 100644 index 00000000..81c465cf --- /dev/null +++ b/Marlin/src/feature/dac/dac_mcp4728.cpp @@ -0,0 +1,154 @@ +/** + * 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 . + * + */ + +/** + * mcp4728.cpp - Arduino library for MicroChip MCP4728 I2C D/A converter + * + * For implementation details, please take a look at the datasheet: + * https://ww1.microchip.com/downloads/en/DeviceDoc/22187a.pdf + * + * For discussion and feedback, please go to: + * https://forum.arduino.cc/index.php/topic,51842.0.html + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(HAS_MOTOR_CURRENT_DAC) + +#include "dac_mcp4728.h" + +MCP4728 mcp4728; + +xyze_uint_t dac_values; + +/** + * Begin I2C, get current values (input register and eeprom) of mcp4728 + */ +void MCP4728::init() { + Wire.begin(); + Wire.requestFrom(I2C_ADDRESS(DAC_DEV_ADDRESS), uint8_t(24)); + while (Wire.available()) { + char deviceID = Wire.read(), + hiByte = Wire.read(), + loByte = Wire.read(); + + if (!(deviceID & 0x08)) + dac_values[(deviceID & 0x30) >> 4] = word((hiByte & 0x0F), loByte); + } +} + +/** + * Write input resister value to specified channel using fastwrite method. + * Channel : 0-3, Values : 0-4095 + */ +uint8_t MCP4728::analogWrite(const uint8_t channel, const uint16_t value) { + dac_values[channel] = value; + return fastWrite(); +} + +/** + * Write all input resistor values to EEPROM using SequencialWrite method. + * This will update both input register and EEPROM value + * This will also write current Vref, PowerDown, Gain settings to EEPROM + */ +uint8_t MCP4728::eepromWrite() { + Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); + Wire.write(SEQWRITE); + LOOP_XYZE(i) { + Wire.write(DAC_STEPPER_VREF << 7 | DAC_STEPPER_GAIN << 4 | highByte(dac_values[i])); + Wire.write(lowByte(dac_values[i])); + } + return Wire.endTransmission(); +} + +/** + * Write Voltage reference setting to all input regiters + */ +uint8_t MCP4728::setVref_all(const uint8_t value) { + Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); + Wire.write(VREFWRITE | (value ? 0x0F : 0x00)); + return Wire.endTransmission(); +} +/** + * Write Gain setting to all input regiters + */ +uint8_t MCP4728::setGain_all(const uint8_t value) { + Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); + Wire.write(GAINWRITE | (value ? 0x0F : 0x00)); + return Wire.endTransmission(); +} + +/** + * Return Input Register value + */ +uint16_t MCP4728::getValue(const uint8_t channel) { return dac_values[channel]; } + +#if 0 +/** + * Steph: Might be useful in the future + * Return Vout + */ +uint16_t MCP4728::getVout(const uint8_t channel) { + const uint32_t vref = 2048, + vOut = (vref * dac_values[channel] * (_DAC_STEPPER_GAIN + 1)) / 4096; + return _MIN(vOut, defaultVDD); +} +#endif + +/** + * Returns DAC values as a 0-100 percentage of drive strength + */ +uint8_t MCP4728::getDrvPct(const uint8_t channel) { return uint8_t(100.0 * dac_values[channel] / (DAC_STEPPER_MAX) + 0.5); } + +/** + * Receives all Drive strengths as 0-100 percent values, updates + * DAC Values array and calls fastwrite to update the DAC. + */ +void MCP4728::setDrvPct(xyze_uint8_t &pct) { + dac_values *= 0.01 * pct * (DAC_STEPPER_MAX); + fastWrite(); +} + +/** + * FastWrite input register values - All DAC ouput update. refer to DATASHEET 5.6.1 + * DAC Input and PowerDown bits update. + * No EEPROM update + */ +uint8_t MCP4728::fastWrite() { + Wire.beginTransmission(I2C_ADDRESS(DAC_DEV_ADDRESS)); + LOOP_XYZE(i) { + Wire.write(highByte(dac_values[i])); + Wire.write(lowByte(dac_values[i])); + } + return Wire.endTransmission(); +} + +/** + * Common function for simple general commands + */ +uint8_t MCP4728::simpleCommand(const byte simpleCommand) { + Wire.beginTransmission(I2C_ADDRESS(GENERALCALL)); + Wire.write(simpleCommand); + return Wire.endTransmission(); +} + +#endif // HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/feature/dac/dac_mcp4728.h b/Marlin/src/feature/dac/dac_mcp4728.h new file mode 100644 index 00000000..571716d4 --- /dev/null +++ b/Marlin/src/feature/dac/dac_mcp4728.h @@ -0,0 +1,82 @@ +/** + * 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 + +/** + * Arduino library for MicroChip MCP4728 I2C D/A converter. + */ + +#include "../../core/types.h" + +#include + +/** + * The following three macros are only used in this piece of code related to mcp4728. + * They are defined in the standard Arduino framework but could be undefined in 32 bits Arduino frameworks. + * (For instance not defined in Arduino lpc176x framework) + * So we have to define them if needed. + */ +#ifndef word + #define word(h, l) ((uint8_t) ((h << 8) | l)) +#endif + +#ifndef lowByte + #define lowByte(w) ((uint8_t) ((w) & 0xFF)) +#endif + +#ifndef highByte + #define highByte(w) ((uint8_t) ((w) >> 8)) +#endif + +#define defaultVDD DAC_STEPPER_MAX //was 5000 but differs with internal Vref +#define BASE_ADDR 0x60 +#define RESET 0b00000110 +#define WAKE 0b00001001 +#define UPDATE 0b00001000 +#define MULTIWRITE 0b01000000 +#define SINGLEWRITE 0b01011000 +#define SEQWRITE 0b01010000 +#define VREFWRITE 0b10000000 +#define GAINWRITE 0b11000000 +#define POWERDOWNWRITE 0b10100000 +#define GENERALCALL 0b00000000 +#define GAINWRITE 0b11000000 + +// This is taken from the original lib, makes it easy to edit if needed +// DAC_OR_ADDRESS defined in pins_BOARD.h file +#define DAC_DEV_ADDRESS (BASE_ADDR | DAC_OR_ADDRESS) + +class MCP4728 { +public: + static void init(); + static uint8_t analogWrite(const uint8_t channel, const uint16_t value); + static uint8_t eepromWrite(); + static uint8_t setVref_all(const uint8_t value); + static uint8_t setGain_all(const uint8_t value); + static uint16_t getValue(const uint8_t channel); + static uint8_t fastWrite(); + static uint8_t simpleCommand(const byte simpleCommand); + static uint8_t getDrvPct(const uint8_t channel); + static void setDrvPct(xyze_uint8_t &pct); +}; + +extern MCP4728 mcp4728; diff --git a/Marlin/src/feature/dac/stepper_dac.cpp b/Marlin/src/feature/dac/stepper_dac.cpp new file mode 100644 index 00000000..5f10b4cc --- /dev/null +++ b/Marlin/src/feature/dac/stepper_dac.cpp @@ -0,0 +1,99 @@ +/** + * 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 . + * + */ + +/** + * stepper_dac.cpp - To set stepper current via DAC + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(HAS_MOTOR_CURRENT_DAC) + +#include "stepper_dac.h" +#include "../../MarlinCore.h" // for SP_X_LBL... + +bool dac_present = false; +constexpr xyze_uint8_t dac_order = DAC_STEPPER_ORDER; +xyze_uint8_t dac_channel_pct = DAC_MOTOR_CURRENT_DEFAULT; + +StepperDAC stepper_dac; + +int StepperDAC::init() { + #if PIN_EXISTS(DAC_DISABLE) + OUT_WRITE(DAC_DISABLE_PIN, LOW); // set pin low to enable DAC + #endif + + mcp4728.init(); + + if (mcp4728.simpleCommand(RESET)) return -1; + + dac_present = true; + + mcp4728.setVref_all(DAC_STEPPER_VREF); + mcp4728.setGain_all(DAC_STEPPER_GAIN); + + if (mcp4728.getDrvPct(0) < 1 || mcp4728.getDrvPct(1) < 1 || mcp4728.getDrvPct(2) < 1 || mcp4728.getDrvPct(3) < 1 ) { + mcp4728.setDrvPct(dac_channel_pct); + mcp4728.eepromWrite(); + } + + return 0; +} + +void StepperDAC::set_current_value(const uint8_t channel, uint16_t val) { + if (!dac_present) return; + + NOMORE(val, uint16_t(DAC_STEPPER_MAX)); + + mcp4728.analogWrite(dac_order[channel], val); + mcp4728.simpleCommand(UPDATE); +} + +void StepperDAC::set_current_percent(const uint8_t channel, float val) { + set_current_value(channel, _MIN(val, 100.0f) * (DAC_STEPPER_MAX) / 100.0f); +} + +static float dac_perc(int8_t n) { return 100.0 * mcp4728.getValue(dac_order[n]) * RECIPROCAL(DAC_STEPPER_MAX); } +static float dac_amps(int8_t n) { return mcp4728.getDrvPct(dac_order[n]) * (DAC_STEPPER_MAX) * 0.125 * RECIPROCAL(DAC_STEPPER_SENSE); } + +uint8_t StepperDAC::get_current_percent(const AxisEnum axis) { return mcp4728.getDrvPct(dac_order[axis]); } +void StepperDAC::set_current_percents(xyze_uint8_t &pct) { + LOOP_XYZE(i) dac_channel_pct[i] = pct[dac_order[i]]; + mcp4728.setDrvPct(dac_channel_pct); +} + +void StepperDAC::print_values() { + if (!dac_present) return; + SERIAL_ECHO_MSG("Stepper current values in % (Amps):"); + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR_P( SP_X_LBL, dac_perc(X_AXIS), PSTR(" ("), dac_amps(X_AXIS), PSTR(")")); + SERIAL_ECHOPAIR_P( SP_Y_LBL, dac_perc(Y_AXIS), PSTR(" ("), dac_amps(Y_AXIS), PSTR(")")); + SERIAL_ECHOPAIR_P( SP_Z_LBL, dac_perc(Z_AXIS), PSTR(" ("), dac_amps(Z_AXIS), PSTR(")")); + SERIAL_ECHOLNPAIR_P(SP_E_LBL, dac_perc(E_AXIS), PSTR(" ("), dac_amps(E_AXIS), PSTR(")")); +} + +void StepperDAC::commit_eeprom() { + if (!dac_present) return; + mcp4728.eepromWrite(); +} + +#endif // HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/feature/dac/stepper_dac.h b/Marlin/src/feature/dac/stepper_dac.h new file mode 100644 index 00000000..6836335e --- /dev/null +++ b/Marlin/src/feature/dac/stepper_dac.h @@ -0,0 +1,41 @@ +/** + * 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 + +/** + * stepper_dac.h - To set stepper current via DAC + */ + +#include "dac_mcp4728.h" + +class StepperDAC { +public: + static int init(); + static void set_current_percent(const uint8_t channel, float val); + static void set_current_value(const uint8_t channel, uint16_t val); + static void print_values(); + static void commit_eeprom(); + static uint8_t get_current_percent(AxisEnum axis); + static void set_current_percents(xyze_uint8_t &pct); +}; + +extern StepperDAC stepper_dac; diff --git a/Marlin/src/feature/digipot/digipot.h b/Marlin/src/feature/digipot/digipot.h new file mode 100644 index 00000000..c53f8093 --- /dev/null +++ b/Marlin/src/feature/digipot/digipot.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 + +// +// Header for MCP4018 and MCP4451 current control i2c devices +// +class DigipotI2C { +public: + static void init(); + static void set_current(const uint8_t channel, const float current); +}; + +DigipotI2C digipot_i2c; diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp new file mode 100644 index 00000000..6260185f --- /dev/null +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -0,0 +1,102 @@ +/** + * 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(DIGIPOT_MCP4018) + +#include "digipot.h" + +#include +#include // https://github.com/stawel/SlowSoftI2CMaster + +// Settings for the I2C based DIGIPOT (MCP4018) based on WT150 + +#define DIGIPOT_A4988_Rsx 0.250 +#define DIGIPOT_A4988_Vrefmax 1.666 +#define DIGIPOT_MCP4018_MAX_VALUE 127 + +#define DIGIPOT_A4988_Itripmax(Vref) ((Vref) / (8.0 * DIGIPOT_A4988_Rsx)) + +#define DIGIPOT_A4988_FACTOR ((DIGIPOT_MCP4018_MAX_VALUE) / DIGIPOT_A4988_Itripmax(DIGIPOT_A4988_Vrefmax)) +#define DIGIPOT_A4988_MAX_CURRENT 2.0 + +static byte current_to_wiper(const float current) { + const int16_t value = TERN(DIGIPOT_USE_RAW_VALUES, current, CEIL(current * DIGIPOT_A4988_FACTOR)); + return byte(constrain(value, 0, DIGIPOT_MCP4018_MAX_VALUE)); +} + +static SlowSoftI2CMaster pots[DIGIPOT_I2C_NUM_CHANNELS] = { + SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_X, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 1 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Y, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 2 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_Z, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 3 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E0, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 4 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E1, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 5 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E2, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 6 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E3, DIGIPOTS_I2C_SCL) + #if DIGIPOT_I2C_NUM_CHANNELS > 7 + , SlowSoftI2CMaster(DIGIPOTS_I2C_SDA_E4, DIGIPOTS_I2C_SCL) + #endif + #endif + #endif + #endif + #endif + #endif + #endif +}; + +static void digipot_i2c_send(const uint8_t channel, const byte v) { + if (WITHIN(channel, 0, DIGIPOT_I2C_NUM_CHANNELS - 1)) { + pots[channel].i2c_start(((DIGIPOT_I2C_ADDRESS_A) << 1) | I2C_WRITE); + pots[channel].i2c_write(v); + pots[channel].i2c_stop(); + } +} + +// This is for the MCP4018 I2C based digipot +void DigipotI2C::set_current(const uint8_t channel, const float current) { + const float ival = _MIN(_MAX(current, 0), float(DIGIPOT_MCP4018_MAX_VALUE)); + digipot_i2c_send(channel, current_to_wiper(ival)); +} + +void DigipotI2C::init() { + LOOP_L_N(i, DIGIPOT_I2C_NUM_CHANNELS) pots[i].i2c_init(); + + // Init currents according to Configuration_adv.h + static const float digipot_motor_current[] PROGMEM = + #if ENABLED(DIGIPOT_USE_RAW_VALUES) + DIGIPOT_MOTOR_CURRENT + #else + DIGIPOT_I2C_MOTOR_CURRENTS + #endif + ; + LOOP_L_N(i, COUNT(digipot_motor_current)) + set_current(i, pgm_read_float(&digipot_motor_current[i])); +} + +#endif // DIGIPOT_MCP4018 diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp new file mode 100644 index 00000000..7e6ace49 --- /dev/null +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -0,0 +1,98 @@ +/** + * 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(DIGIPOT_MCP4451) + +#include "digipot.h" + +#include +#include + +#if MB(MKS_SBASE) + #include "digipot_mcp4451_I2C_routines.h" +#endif + +// Settings for the I2C based DIGIPOT (MCP4451) on Azteeg X3 Pro +#if MB(5DPRINT) + #define DIGIPOT_I2C_FACTOR 117.96f + #define DIGIPOT_I2C_MAX_CURRENT 1.736f +#elif MB(AZTEEG_X5_MINI, AZTEEG_X5_MINI_WIFI) + #define DIGIPOT_I2C_FACTOR 113.5f + #define DIGIPOT_I2C_MAX_CURRENT 2.0f +#else + #define DIGIPOT_I2C_FACTOR 106.7f + #define DIGIPOT_I2C_MAX_CURRENT 2.5f +#endif + +static byte current_to_wiper(const float current) { + return byte(TERN(DIGIPOT_USE_RAW_VALUES, current, CEIL(DIGIPOT_I2C_FACTOR * current))); +} + +static void digipot_i2c_send(const byte addr, const byte a, const byte b) { + #if MB(MKS_SBASE) + digipot_mcp4451_start(addr); + digipot_mcp4451_send_byte(a); + digipot_mcp4451_send_byte(b); + #else + Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.write(a); + Wire.write(b); + Wire.endTransmission(); + #endif +} + +// This is for the MCP4451 I2C based digipot +void DigipotI2C::set_current(const uint8_t channel, const float current) { + // These addresses are specific to Azteeg X3 Pro, can be set to others. + // In this case first digipot is at address A0=0, A1=0, second one is at A0=0, A1=1 + const byte addr = channel < 4 ? DIGIPOT_I2C_ADDRESS_A : DIGIPOT_I2C_ADDRESS_B; // channel 0-3 vs 4-7 + + // Initial setup + digipot_i2c_send(addr, 0x40, 0xFF); + digipot_i2c_send(addr, 0xA0, 0xFF); + + // Set actual wiper value + byte addresses[4] = { 0x00, 0x10, 0x60, 0x70 }; + digipot_i2c_send(addr, addresses[channel & 0x3], current_to_wiper(_MIN(float(_MAX(current, 0)), DIGIPOT_I2C_MAX_CURRENT))); +} + +void DigipotI2C::init() { + #if MB(MKS_SBASE) + configure_i2c(16); // Set clock_option to 16 ensure I2C is initialized at 400kHz + #else + Wire.begin(); + #endif + // Set up initial currents as defined in Configuration_adv.h + static const float digipot_motor_current[] PROGMEM = + #if ENABLED(DIGIPOT_USE_RAW_VALUES) + DIGIPOT_MOTOR_CURRENT + #else + DIGIPOT_I2C_MOTOR_CURRENTS + #endif + ; + LOOP_L_N(i, COUNT(digipot_motor_current)) + set_current(i, pgm_read_float(&digipot_motor_current[i])); +} + +#endif // DIGIPOT_MCP4451 diff --git a/Marlin/src/feature/direct_stepping.cpp b/Marlin/src/feature/direct_stepping.cpp new file mode 100644 index 00000000..9766d146 --- /dev/null +++ b/Marlin/src/feature/direct_stepping.cpp @@ -0,0 +1,262 @@ +/** + * 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(DIRECT_STEPPING) + +#include "direct_stepping.h" + +#include "../MarlinCore.h" + +#define CHECK_PAGE(I, R) do{ \ + if (I >= sizeof(page_states) / sizeof(page_states[0])) { \ + fatal_error = true; \ + return R; \ + } \ +}while(0) + +#define CHECK_PAGE_STATE(I, R, S) do { \ + CHECK_PAGE(I, R); \ + if (page_states[I] != S) { \ + fatal_error = true; \ + return R; \ + } \ +}while(0) + +namespace DirectStepping { + + template + State SerialPageManager::state; + + template + volatile bool SerialPageManager::fatal_error; + + template + volatile PageState SerialPageManager::page_states[Cfg::NUM_PAGES]; + + template + volatile bool SerialPageManager::page_states_dirty; + + template + uint8_t SerialPageManager::pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; + + template + uint8_t SerialPageManager::checksum; + + template + typename Cfg::write_byte_idx_t SerialPageManager::write_byte_idx; + + template + typename Cfg::page_idx_t SerialPageManager::write_page_idx; + + template + typename Cfg::write_byte_idx_t SerialPageManager::write_page_size; + + template + void SerialPageManager::init() { + for (int i = 0 ; i < Cfg::NUM_PAGES ; i++) + page_states[i] = PageState::FREE; + + fatal_error = false; + state = State::NEWLINE; + + page_states_dirty = false; + + SERIAL_ECHOLNPGM("pages_ready"); + } + + template + FORCE_INLINE bool SerialPageManager::maybe_store_rxd_char(uint8_t c) { + switch (state) { + default: + case State::MONITOR: + switch (c) { + case '\n': + case '\r': + state = State::NEWLINE; + default: + return false; + } + case State::NEWLINE: + switch (c) { + case Cfg::CONTROL_CHAR: + state = State::ADDRESS; + return true; + case '\n': + case '\r': + state = State::NEWLINE; + return false; + default: + state = State::MONITOR; + return false; + } + case State::ADDRESS: + //TODO: 16 bit address, State::ADDRESS2 + write_page_idx = c; + write_byte_idx = 0; + checksum = 0; + + CHECK_PAGE(write_page_idx, true); + + if (page_states[write_page_idx] == PageState::FAIL) { + // Special case for fail + state = State::UNFAIL; + return true; + } + + set_page_state(write_page_idx, PageState::WRITING); + + state = Cfg::DIRECTIONAL ? State::COLLECT : State::SIZE; + + return true; + case State::SIZE: + // Zero means full page size + write_page_size = c; + state = State::COLLECT; + return true; + case State::COLLECT: + pages[write_page_idx][write_byte_idx++] = c; + checksum ^= c; + + // check if still collecting + if (Cfg::PAGE_SIZE == 256) { + // special case for 8-bit, check if rolled back to 0 + if (Cfg::DIRECTIONAL || !write_page_size) { // full 256 bytes + if (write_byte_idx) return true; + } else { + if (write_byte_idx < write_page_size) return true; + } + } else if (Cfg::DIRECTIONAL) { + if (write_byte_idx != Cfg::PAGE_SIZE) return true; + } else { + if (write_byte_idx < write_page_size) return true; + } + + state = State::CHECKSUM; + return true; + case State::CHECKSUM: { + const PageState page_state = (checksum == c) ? PageState::OK : PageState::FAIL; + set_page_state(write_page_idx, page_state); + state = State::MONITOR; + return true; + } + case State::UNFAIL: + if (c == 0) { + set_page_state(write_page_idx, PageState::FREE); + } else { + fatal_error = true; + } + state = State::MONITOR; + return true; + } + } + + template + void SerialPageManager::write_responses() { + if (fatal_error) { + kill(GET_TEXT(MSG_BAD_PAGE)); + return; + } + + if (!page_states_dirty) return; + page_states_dirty = false; + + SERIAL_ECHO(Cfg::CONTROL_CHAR); + constexpr int state_bits = 2; + constexpr int n_bytes = Cfg::NUM_PAGES >> state_bits; + volatile uint8_t bits_b[n_bytes] = { 0 }; + + for (page_idx_t i = 0 ; i < Cfg::NUM_PAGES ; i++) { + bits_b[i >> state_bits] |= page_states[i] << ((i * state_bits) & 0x7); + } + + uint8_t crc = 0; + for (uint8_t i = 0 ; i < n_bytes ; i++) { + crc ^= bits_b[i]; + SERIAL_ECHO(bits_b[i]); + } + + SERIAL_ECHO(crc); + SERIAL_EOL(); + } + + template + FORCE_INLINE void SerialPageManager::set_page_state(const page_idx_t page_idx, const PageState page_state) { + CHECK_PAGE(page_idx,); + + page_states[page_idx] = page_state; + page_states_dirty = true; + } + + template <> + FORCE_INLINE uint8_t *PageManager::get_page(const page_idx_t page_idx) { + CHECK_PAGE(page_idx, nullptr); + + return pages[page_idx]; + } + + template <> + FORCE_INLINE void PageManager::free_page(const page_idx_t page_idx) { + set_page_state(page_idx, PageState::FREE); + } + +}; + +DirectStepping::PageManager page_manager; + +const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping::Config::SEGMENT_STEPS] PROGMEM = { + + #if STEPPER_PAGE_FORMAT == SP_4x4D_128 + + { 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, 1, 0 }, // 1 + { 1, 0, 1 }, // 2 + { 1, 1, 1 }, // 3 + + #elif STEPPER_PAGE_FORMAT == SP_4x1_512 + + {0} // Uncompressed format, table not used + + #endif + +}; + +#endif // DIRECT_STEPPING diff --git a/Marlin/src/feature/direct_stepping.h b/Marlin/src/feature/direct_stepping.h new file mode 100644 index 00000000..cde9d1a0 --- /dev/null +++ b/Marlin/src/feature/direct_stepping.h @@ -0,0 +1,133 @@ +/** + * 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" + +namespace DirectStepping { + + enum State : char { + MONITOR, NEWLINE, ADDRESS, SIZE, COLLECT, CHECKSUM, UNFAIL + }; + + enum PageState : uint8_t { + FREE, WRITING, OK, FAIL + }; + + // Static state used for stepping through direct stepping pages + struct page_step_state_t { + // Current page + uint8_t *page; + // Current segment + uint16_t segment_idx; + // Current steps within segment + uint8_t segment_steps; + // Segment delta + xyze_uint8_t sd; + // Block delta + xyze_int_t bd; + }; + + template + class SerialPageManager { + public: + + typedef typename Cfg::page_idx_t page_idx_t; + + static bool maybe_store_rxd_char(uint8_t c); + static void write_responses(); + + // common methods for page managers + static void init(); + static uint8_t *get_page(const page_idx_t page_idx); + static void free_page(const page_idx_t page_idx); + + protected: + + typedef typename Cfg::write_byte_idx_t write_byte_idx_t; + + static State state; + static volatile bool fatal_error; + + static volatile PageState page_states[Cfg::NUM_PAGES]; + static volatile bool page_states_dirty; + + static uint8_t pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; + static uint8_t checksum; + static write_byte_idx_t write_byte_idx; + static page_idx_t write_page_idx; + static write_byte_idx_t write_page_size; + + static void set_page_state(const page_idx_t page_idx, const PageState page_state); + }; + + template struct TypeSelector { typedef T type;} ; + template struct TypeSelector { typedef F type; }; + + template + struct config_t { + static constexpr char CONTROL_CHAR = '!'; + + static constexpr int NUM_PAGES = num_pages; + static constexpr int NUM_AXES = num_axes; + static constexpr int BITS_SEGMENT = bits_segment; + static constexpr int DIRECTIONAL = dir ? 1 : 0; + static constexpr int SEGMENTS = segments; + + static constexpr int NUM_SEGMENTS = 1 << BITS_SEGMENT; + 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; + + 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; + }; + + template + using SP_4x4D_128 = config_t; + + template + using SP_4x2_256 = config_t; + + template + using SP_4x1_512 = config_t; + + // configured types + typedef STEPPER_PAGE_FORMAT Config; + + template class PAGE_MANAGER; + typedef PAGE_MANAGER PageManager; +}; + +#define SP_4x4D_128 1 +//#define SP_4x4_128 2 +//#define SP_4x2D_256 3 +#define SP_4x2_256 4 +#define SP_4x1_512 5 + +typedef typename DirectStepping::Config::page_idx_t page_idx_t; + +// TODO: use config +typedef DirectStepping::page_step_state_t page_step_state_t; + +extern const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping::Config::SEGMENT_STEPS]; +extern DirectStepping::PageManager page_manager; diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp new file mode 100644 index 00000000..a4c2d0da --- /dev/null +++ b/Marlin/src/feature/e_parser.cpp @@ -0,0 +1,44 @@ +/** + * 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 . + * + */ + +/** + * e_parser.cpp - Intercept special commands directly in the serial stream + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + +#include "e_parser.h" + +// Static data members +bool EmergencyParser::killed_by_M112, // = false + EmergencyParser::enabled; + +#if ENABLED(HOST_PROMPT_SUPPORT) + uint8_t EmergencyParser::M876_reason; // = 0 +#endif + +// Global instance +EmergencyParser emergency_parser; + +#endif // EMERGENCY_PARSER diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h new file mode 100644 index 00000000..085cbd4e --- /dev/null +++ b/Marlin/src/feature/e_parser.h @@ -0,0 +1,186 @@ +/** + * 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 + +/** + * e_parser.h - Intercept special commands directly in the serial stream + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "host_actions.h" +#endif + +// External references +extern bool wait_for_user, wait_for_heatup; +void quickstop_stepper(); + +class EmergencyParser { + +public: + + // Currently looking for: M108, M112, M410, M876 + enum State : char { + EP_RESET, + EP_N, + EP_M, + EP_M1, + EP_M10, + EP_M108, + EP_M11, + EP_M112, + EP_M4, + EP_M41, + EP_M410, + #if ENABLED(HOST_PROMPT_SUPPORT) + EP_M8, + EP_M87, + EP_M876, + EP_M876S, + EP_M876SN, + #endif + EP_IGNORE // to '\n' + }; + + static bool killed_by_M112; + + #if ENABLED(HOST_PROMPT_SUPPORT) + static uint8_t M876_reason; + #endif + + EmergencyParser() { enable(); } + + FORCE_INLINE static void enable() { enabled = true; } + + FORCE_INLINE static void disable() { enabled = false; } + + FORCE_INLINE static void update(State &state, const uint8_t c) { + #define ISEOL(C) ((C) == '\n' || (C) == '\r') + switch (state) { + case EP_RESET: + switch (c) { + case ' ': case '\n': case '\r': break; + case 'N': state = EP_N; break; + case 'M': state = EP_M; break; + default: state = EP_IGNORE; + } + break; + + case EP_N: + switch (c) { + case '0' ... '9': + case '-': case ' ': break; + case 'M': state = EP_M; break; + default: state = EP_IGNORE; + } + break; + + case EP_M: + switch (c) { + case ' ': break; + case '1': state = EP_M1; break; + case '4': state = EP_M4; break; + #if ENABLED(HOST_PROMPT_SUPPORT) + case '8': state = EP_M8; break; + #endif + default: state = EP_IGNORE; + } + break; + + case EP_M1: + switch (c) { + case '0': state = EP_M10; break; + case '1': state = EP_M11; break; + default: state = EP_IGNORE; + } + break; + + case EP_M10: + state = (c == '8') ? EP_M108 : EP_IGNORE; + break; + + case EP_M11: + state = (c == '2') ? EP_M112 : EP_IGNORE; + break; + + case EP_M4: + state = (c == '1') ? EP_M41 : EP_IGNORE; + break; + + case EP_M41: + state = (c == '0') ? EP_M410 : EP_IGNORE; + break; + + #if ENABLED(HOST_PROMPT_SUPPORT) + case EP_M8: + state = (c == '7') ? EP_M87 : EP_IGNORE; + break; + + case EP_M87: + state = (c == '6') ? EP_M876 : EP_IGNORE; + break; + + case EP_M876: + switch (c) { + case ' ': break; + case 'S': state = EP_M876S; break; + default: state = EP_IGNORE; break; + } + break; + + case EP_M876S: + switch (c) { + case ' ': break; + case '0' ... '9': + state = EP_M876SN; + M876_reason = (uint8_t)(c - '0'); + break; + } + break; + #endif + + case EP_IGNORE: + if (ISEOL(c)) state = EP_RESET; + break; + + default: + if (ISEOL(c)) { + if (enabled) switch (state) { + case EP_M108: wait_for_user = wait_for_heatup = false; break; + case EP_M112: killed_by_M112 = true; break; + case EP_M410: quickstop_stepper(); break; + #if ENABLED(HOST_PROMPT_SUPPORT) + case EP_M876SN: host_response_handler(M876_reason); break; + #endif + default: break; + } + state = EP_RESET; + } + } + } + +private: + static bool enabled; +}; + +extern EmergencyParser emergency_parser; diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp new file mode 100644 index 00000000..8a3e959e --- /dev/null +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -0,0 +1,1138 @@ +/** + * 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 . + * + */ + +//todo: add support for multiple encoders on a single axis +//todo: add z axis auto-leveling +//todo: consolidate some of the related M codes? +//todo: add endstop-replacement mode? +//todo: try faster I2C speed; tweak TWI_FREQ (400000L, or faster?); or just TWBR = ((CPU_FREQ / 400000L) - 16) / 2; +//todo: consider Marlin-optimized Wire library; i.e. MarlinWire, like MarlinSerial + + +#include "../inc/MarlinConfig.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + +#include "encoder_i2c.h" + +#include "../module/temperature.h" +#include "../module/stepper.h" +#include "../gcode/parser.h" + +#include "../feature/babystep.h" + +#include + +void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { + encoderAxis = axis; + i2cAddress = address; + + initialized++; + + SERIAL_ECHOLNPAIR("Setting up encoder on ", axis_codes[encoderAxis], " axis, addr = ", address); + + position = get_position(); +} + +void I2CPositionEncoder::update() { + if (!initialized || !homed || !active) return; //check encoder is set up and active + + position = get_position(); + + //we don't want to stop things just because the encoder missed a message, + //so we only care about responses that indicate bad magnetic strength + + if (!passes_test(false)) { //check encoder data is good + lastErrorTime = millis(); + /* + if (trusted) { //commented out as part of the note below + trusted = false; + SERIAL_ECHOLMPAIR("Fault detected on ", axis_codes[encoderAxis], " axis encoder. Disengaging error correction until module is trusted again."); + } + */ + return; + } + + if (!trusted) { + /** + * This is commented out because it introduces error and can cause bad print quality. + * + * This code is intended to manage situations where the encoder has reported bad magnetic strength. + * This indicates that the magnetic strip was too far away from the sensor to reliably track position. + * When this happens, this code resets the offset based on where the printer thinks it is. This has been + * shown to introduce errors in actual position which result in drifting prints and poor print quality. + * Perhaps a better method would be to disable correction on the axis with a problem, report it to the + * user via the status leds on the encoder module and prompt the user to re-home the axis at which point + * the encoder would be re-enabled. + */ + + /* + // If the magnetic strength has been good for a certain time, start trusting the module again + + if (millis() - lastErrorTime > I2CPE_TIME_TRUSTED) { + trusted = true; + + SERIAL_ECHOLNPAIR("Untrusted encoder module on ", axis_codes[encoderAxis], " axis has been fault-free for set duration, reinstating error correction."); + + //the encoder likely lost its place when the error occured, so we'll reset and use the printer's + //idea of where it the axis is to re-initialize + const float pos = planner.get_axis_position_mm(encoderAxis); + int32_t positionInTicks = pos * get_ticks_unit(); + + //shift position from previous to current position + zeroOffset -= (positionInTicks - get_position()); + + #ifdef I2CPE_DEBUG + SERIAL_ECHOLNPAIR("Current position is ", pos); + SERIAL_ECHOLNPAIR("Position in encoder ticks is ", positionInTicks); + SERIAL_ECHOLNPAIR("New zero-offset of ", zeroOffset); + SERIAL_ECHOPAIR("New position reads as ", get_position()); + SERIAL_CHAR('('); + SERIAL_DECIMAL(mm_from_count(get_position())); + SERIAL_ECHOLNPGM(")"); + #endif + } + */ + return; + } + + lastPosition = position; + const millis_t positionTime = millis(); + + //only do error correction if setup and enabled + if (ec && ecMethod != I2CPE_ECM_NONE) { + + #ifdef I2CPE_EC_THRESH_PROPORTIONAL + const millis_t deltaTime = positionTime - lastPositionTime; + const uint32_t distance = ABS(position - lastPosition), + speed = distance / deltaTime; + const float threshold = constrain((speed / 50), 1, 50) * ecThreshold; + #else + const float threshold = get_error_correct_threshold(); + #endif + + //check error + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + float sum = 0, diffSum = 0; + + errIdx = (errIdx >= I2CPE_ERR_ARRAY_SIZE - 1) ? 0 : errIdx + 1; + err[errIdx] = get_axis_error_steps(false); + + LOOP_L_N(i, I2CPE_ERR_ARRAY_SIZE) { + sum += err[i]; + if (i) diffSum += ABS(err[i-1] - err[i]); + } + + const int32_t error = int32_t(sum / (I2CPE_ERR_ARRAY_SIZE + 1)); //calculate average for error + + #else + const int32_t error = get_axis_error_steps(false); + #endif + + //SERIAL_ECHOLNPAIR("Axis error steps: ", error); + + #ifdef I2CPE_ERR_THRESH_ABORT + if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.settings.axis_steps_per_mm[encoderAxis]) { + //kill(PSTR("Significant Error")); + SERIAL_ECHOLNPAIR("Axis error over threshold, aborting!", error); + safe_delay(5000); + } + #endif + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + if (errIdx == 0) { + // In order to correct for "error" but avoid correcting for noise and non-skips + // it must be > threshold and have a difference average of < 10 and be < 2000 steps + if (ABS(error) > threshold * planner.settings.axis_steps_per_mm[encoderAxis] + && diffSum < 10 * (I2CPE_ERR_ARRAY_SIZE - 1) + && ABS(error) < 2000 + ) { // Check for persistent error (skip) + errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy + if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) { + float sumP = 0; + LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; + const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE)); + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" : CORRECT ERR ", errorP * planner.steps_to_mm[encoderAxis], "mm"); + babystep.add_steps(encoderAxis, -LROUND(errorP)); + errPrstIdx = 0; + } + } + else + errPrstIdx = 0; + } + #else + if (ABS(error) > threshold * planner.settings.axis_steps_per_mm[encoderAxis]) { + //SERIAL_ECHOLN(error); + //SERIAL_ECHOLN(position); + babystep.add_steps(encoderAxis, -LROUND(error / 2)); + } + #endif + + if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) { + const millis_t ms = millis(); + if (ELAPSED(ms, nextErrorCountTime)) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" : LARGE ERR ", int(error), "; diffSum=", diffSum); + errorCount++; + nextErrorCountTime = ms + I2CPE_ERR_CNT_DEBOUNCE_MS; + } + } + } + + lastPositionTime = positionTime; +} + +void I2CPositionEncoder::set_homed() { + if (active) { + reset(); // Reset module's offset to zero (so current position is homed / zero) + delay(10); + + zeroOffset = get_raw_count(); + homed++; + trusted++; + + #ifdef I2CPE_DEBUG + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" axis encoder homed, offset of ", zeroOffset, " ticks."); + #endif + } +} + +void I2CPositionEncoder::set_unhomed() { + zeroOffset = 0; + homed = trusted = false; + + #ifdef I2CPE_DEBUG + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis encoder unhomed."); + #endif +} + +bool I2CPositionEncoder::passes_test(const bool report) { + if (report) { + if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); + SERIAL_ECHO(axis_codes[encoderAxis]); + serial_ternary(H == I2CPE_MAG_SIG_BAD, PSTR(" axis "), PSTR("magnetic strip "), PSTR("encoder ")); + switch (H) { + case I2CPE_MAG_SIG_GOOD: + case I2CPE_MAG_SIG_MID: + SERIAL_ECHO_TERNARY(H == I2CPE_MAG_SIG_GOOD, "passes test; field strength ", "good", "fair", ".\n"); + break; + default: + SERIAL_ECHOLNPGM("not detected!"); + } + } + return (H == I2CPE_MAG_SIG_GOOD || H == I2CPE_MAG_SIG_MID); +} + +float I2CPositionEncoder::get_axis_error_mm(const bool report) { + const float target = planner.get_axis_position_mm(encoderAxis), + actual = mm_from_count(position), + diff = actual - target, + error = ABS(diff) > 10000 ? 0 : diff; // Huge error is a bad reading + + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" axis target=", target, "mm; actual=", actual, "mm; err=", error, "mm"); + } + + return error; +} + +int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) { + if (!active) { + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPGM(" axis encoder not active!"); + } + return 0; + } + + float stepperTicksPerUnit; + int32_t encoderTicks = position, encoderCountInStepperTicksScaled; + //int32_t stepperTicks = stepper.position(encoderAxis); + + // With a rotary encoder we're concerned with ticks/rev; whereas with a linear we're concerned with ticks/mm + stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.settings.axis_steps_per_mm[encoderAxis]; + + //convert both 'ticks' into same units / base + encoderCountInStepperTicksScaled = LROUND((stepperTicksPerUnit * encoderTicks) / encoderTicksPerUnit); + + const int32_t target = stepper.position(encoderAxis); + int32_t error = encoderCountInStepperTicksScaled - target; + + //suppress discontinuities (might be caused by bad I2C readings...?) + const bool suppressOutput = (ABS(error - errorPrev) > 100); + + errorPrev = error; + + if (report) { + SERIAL_ECHO(axis_codes[encoderAxis]); + SERIAL_ECHOLNPAIR(" axis target=", target, "; actual=", encoderCountInStepperTicksScaled, "; err=", error); + } + + if (suppressOutput) { + if (report) SERIAL_ECHOLNPGM("!Discontinuity. Suppressing error."); + error = 0; + } + + return error; +} + +int32_t I2CPositionEncoder::get_raw_count() { + uint8_t index = 0; + i2cLong encoderCount; + + encoderCount.val = 0x00; + + if (Wire.requestFrom(I2C_ADDRESS(i2cAddress), uint8_t(3)) != 3) { + //houston, we have a problem... + H = I2CPE_MAG_SIG_NF; + return 0; + } + + while (Wire.available()) + encoderCount.bval[index++] = (uint8_t)Wire.read(); + + //extract the magnetic strength + H = (B00000011 & (encoderCount.bval[2] >> 6)); + + //extract sign bit; sign = (encoderCount.bval[2] & B00100000); + //set all upper bits to the sign value to overwrite H + encoderCount.val = (encoderCount.bval[2] & B00100000) ? (encoderCount.val | 0xFFC00000) : (encoderCount.val & 0x003FFFFF); + + if (invert) encoderCount.val *= -1; + + return encoderCount.val; +} + +bool I2CPositionEncoder::test_axis() { + //only works on XYZ cartesian machines for the time being + if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) return false; + + const float startPosition = soft_endstop.min[encoderAxis] + 10, + endPosition = soft_endstop.max[encoderAxis] - 10; + const feedRate_t fr_mm_s = FLOOR(MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY)); + + ec = false; + + xyze_pos_t startCoord, endCoord; + LOOP_XYZ(a) { + startCoord[a] = planner.get_axis_position_mm((AxisEnum)a); + endCoord[a] = planner.get_axis_position_mm((AxisEnum)a); + } + startCoord[encoderAxis] = startPosition; + endCoord[encoderAxis] = endPosition; + + planner.synchronize(); + startCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(startCoord, fr_mm_s, 0); + planner.synchronize(); + + // if the module isn't currently trusted, wait until it is (or until it should be if things are working) + if (!trusted) { + int32_t startWaitingTime = millis(); + while (!trusted && millis() - startWaitingTime < I2CPE_TIME_TRUSTED) + safe_delay(500); + } + + if (trusted) { // if trusted, commence test + endCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(endCoord, fr_mm_s, 0); + planner.synchronize(); + } + + return trusted; +} + +void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { + if (type != I2CPE_ENC_TYPE_LINEAR) { + SERIAL_ECHOLNPGM("Steps/mm calibration requires linear encoder."); + return; + } + + if (!(encoderAxis == X_AXIS || encoderAxis == Y_AXIS || encoderAxis == Z_AXIS)) { + SERIAL_ECHOLNPGM("Steps/mm calibration not supported for this axis."); + return; + } + + float old_steps_mm, new_steps_mm, + startDistance, endDistance, + travelDistance, travelledDistance, total = 0; + + int32_t startCount, stopCount; + + const feedRate_t fr_mm_s = MMM_TO_MMS((encoderAxis == Z_AXIS) ? HOMING_FEEDRATE_Z : HOMING_FEEDRATE_XY); + + bool oldec = ec; + ec = false; + + startDistance = 20; + endDistance = soft_endstop.max[encoderAxis] - 20; + travelDistance = endDistance - startDistance; + + xyze_pos_t startCoord, endCoord; + LOOP_XYZ(a) { + startCoord[a] = planner.get_axis_position_mm((AxisEnum)a); + endCoord[a] = planner.get_axis_position_mm((AxisEnum)a); + } + startCoord[encoderAxis] = startDistance; + endCoord[encoderAxis] = endDistance; + + planner.synchronize(); + + LOOP_L_N(i, iter) { + startCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(startCoord, fr_mm_s, 0); + planner.synchronize(); + + delay(250); + startCount = get_position(); + + //do_blocking_move_to(endCoord); + + endCoord.e = planner.get_axis_position_mm(E_AXIS); + planner.buffer_line(endCoord, fr_mm_s, 0); + planner.synchronize(); + + //Read encoder distance + delay(250); + stopCount = get_position(); + + travelledDistance = mm_from_count(ABS(stopCount - startCount)); + + SERIAL_ECHOLNPAIR("Attempted travel: ", travelDistance, "mm"); + SERIAL_ECHOLNPAIR(" Actual travel: ", travelledDistance, "mm"); + + //Calculate new axis steps per unit + old_steps_mm = planner.settings.axis_steps_per_mm[encoderAxis]; + new_steps_mm = (old_steps_mm * travelDistance) / travelledDistance; + + SERIAL_ECHOLNPAIR("Old steps/mm: ", old_steps_mm); + SERIAL_ECHOLNPAIR("New steps/mm: ", new_steps_mm); + + //Save new value + planner.settings.axis_steps_per_mm[encoderAxis] = new_steps_mm; + + if (iter > 1) { + total += new_steps_mm; + + // swap start and end points so next loop runs from current position + const float tempCoord = startCoord[encoderAxis]; + startCoord[encoderAxis] = endCoord[encoderAxis]; + endCoord[encoderAxis] = tempCoord; + } + } + + if (iter > 1) { + total /= (float)iter; + SERIAL_ECHOLNPAIR("Average steps/mm: ", total); + } + + ec = oldec; + + SERIAL_ECHOLNPGM("Calculated steps/mm set. Use M500 to save to EEPROM."); +} + +void I2CPositionEncoder::reset() { + Wire.beginTransmission(I2C_ADDRESS(i2cAddress)); + Wire.write(I2CPE_RESET_COUNT); + Wire.endTransmission(); + + TERN_(I2CPE_ERR_ROLLING_AVERAGE, ZERO(err)); +} + + +bool I2CPositionEncodersMgr::I2CPE_anyaxis; +uint8_t I2CPositionEncodersMgr::I2CPE_addr, + I2CPositionEncodersMgr::I2CPE_idx; +I2CPositionEncoder I2CPositionEncodersMgr::encoders[I2CPE_ENCODER_CNT]; + +void I2CPositionEncodersMgr::init() { + Wire.begin(); + + #if I2CPE_ENCODER_CNT > 0 + uint8_t i = 0; + + encoders[i].init(I2CPE_ENC_1_ADDR, I2CPE_ENC_1_AXIS); + + #ifdef I2CPE_ENC_1_TYPE + encoders[i].set_type(I2CPE_ENC_1_TYPE); + #endif + #ifdef I2CPE_ENC_1_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_1_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_1_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_1_TICKS_REV); + #endif + #ifdef I2CPE_ENC_1_INVERT + encoders[i].set_inverted(I2CPE_ENC_1_INVERT); + #endif + #ifdef I2CPE_ENC_1_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_1_EC_METHOD); + #endif + #ifdef I2CPE_ENC_1_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_1_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_1_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 1 + i++; + + encoders[i].init(I2CPE_ENC_2_ADDR, I2CPE_ENC_2_AXIS); + + #ifdef I2CPE_ENC_2_TYPE + encoders[i].set_type(I2CPE_ENC_2_TYPE); + #endif + #ifdef I2CPE_ENC_2_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_2_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_2_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_2_TICKS_REV); + #endif + #ifdef I2CPE_ENC_2_INVERT + encoders[i].set_inverted(I2CPE_ENC_2_INVERT); + #endif + #ifdef I2CPE_ENC_2_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_2_EC_METHOD); + #endif + #ifdef I2CPE_ENC_2_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_2_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_2_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 2 + i++; + + encoders[i].init(I2CPE_ENC_3_ADDR, I2CPE_ENC_3_AXIS); + + #ifdef I2CPE_ENC_3_TYPE + encoders[i].set_type(I2CPE_ENC_3_TYPE); + #endif + #ifdef I2CPE_ENC_3_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_3_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_3_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_3_TICKS_REV); + #endif + #ifdef I2CPE_ENC_3_INVERT + encoders[i].set_inverted(I2CPE_ENC_3_INVERT); + #endif + #ifdef I2CPE_ENC_3_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_3_EC_METHOD); + #endif + #ifdef I2CPE_ENC_3_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_3_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_3_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 3 + i++; + + encoders[i].init(I2CPE_ENC_4_ADDR, I2CPE_ENC_4_AXIS); + + #ifdef I2CPE_ENC_4_TYPE + encoders[i].set_type(I2CPE_ENC_4_TYPE); + #endif + #ifdef I2CPE_ENC_4_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_4_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_4_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_4_TICKS_REV); + #endif + #ifdef I2CPE_ENC_4_INVERT + encoders[i].set_inverted(I2CPE_ENC_4_INVERT); + #endif + #ifdef I2CPE_ENC_4_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_4_EC_METHOD); + #endif + #ifdef I2CPE_ENC_4_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_4_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_4_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 4 + i++; + + encoders[i].init(I2CPE_ENC_5_ADDR, I2CPE_ENC_5_AXIS); + + #ifdef I2CPE_ENC_5_TYPE + encoders[i].set_type(I2CPE_ENC_5_TYPE); + #endif + #ifdef I2CPE_ENC_5_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_5_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_5_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_5_TICKS_REV); + #endif + #ifdef I2CPE_ENC_5_INVERT + encoders[i].set_inverted(I2CPE_ENC_5_INVERT); + #endif + #ifdef I2CPE_ENC_5_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_5_EC_METHOD); + #endif + #ifdef I2CPE_ENC_5_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_5_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_5_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif + + #if I2CPE_ENCODER_CNT > 5 + i++; + + encoders[i].init(I2CPE_ENC_6_ADDR, I2CPE_ENC_6_AXIS); + + #ifdef I2CPE_ENC_6_TYPE + encoders[i].set_type(I2CPE_ENC_6_TYPE); + #endif + #ifdef I2CPE_ENC_6_TICKS_UNIT + encoders[i].set_ticks_unit(I2CPE_ENC_6_TICKS_UNIT); + #endif + #ifdef I2CPE_ENC_6_TICKS_REV + encoders[i].set_stepper_ticks(I2CPE_ENC_6_TICKS_REV); + #endif + #ifdef I2CPE_ENC_6_INVERT + encoders[i].set_inverted(I2CPE_ENC_6_INVERT); + #endif + #ifdef I2CPE_ENC_6_EC_METHOD + encoders[i].set_ec_method(I2CPE_ENC_6_EC_METHOD); + #endif + #ifdef I2CPE_ENC_6_EC_THRESH + encoders[i].set_ec_threshold(I2CPE_ENC_6_EC_THRESH); + #endif + + encoders[i].set_active(encoders[i].passes_test(true)); + + #if I2CPE_ENC_6_AXIS == E_AXIS + encoders[i].set_homed(); + #endif + #endif +} + +void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) { + CHECK_IDX(); + + if (units) + SERIAL_ECHOLN(noOffset ? encoders[idx].mm_from_count(encoders[idx].get_raw_count()) : encoders[idx].get_position_mm()); + else { + if (noOffset) { + const int32_t raw_count = encoders[idx].get_raw_count(); + SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_CHAR(' '); + + for (uint8_t j = 31; j > 0; j--) + SERIAL_ECHO((bool)(0x00000001 & (raw_count >> j))); + + SERIAL_ECHO((bool)(0x00000001 & raw_count)); + SERIAL_CHAR(' '); + SERIAL_ECHOLN(raw_count); + } + else + SERIAL_ECHOLN(encoders[idx].get_position()); + } +} + +void I2CPositionEncodersMgr::change_module_address(const uint8_t oldaddr, const uint8_t newaddr) { + // First check 'new' address is not in use + Wire.beginTransmission(I2C_ADDRESS(newaddr)); + if (!Wire.endTransmission()) { + SERIAL_ECHOLNPAIR("?There is already a device with that address on the I2C bus! (", newaddr, ")"); + return; + } + + // Now check that we can find the module on the oldaddr address + Wire.beginTransmission(I2C_ADDRESS(oldaddr)); + if (Wire.endTransmission()) { + SERIAL_ECHOLNPAIR("?No module detected at this address! (", oldaddr, ")"); + return; + } + + SERIAL_ECHOLNPAIR("Module found at ", oldaddr, ", changing address to ", newaddr); + + // Change the modules address + Wire.beginTransmission(I2C_ADDRESS(oldaddr)); + Wire.write(I2CPE_SET_ADDR); + Wire.write(newaddr); + Wire.endTransmission(); + + SERIAL_ECHOLNPGM("Address changed, resetting and waiting for confirmation.."); + + // Wait for the module to reset (can probably be improved by polling address with a timeout). + safe_delay(I2CPE_REBOOT_TIME); + + // Look for the module at the new address. + Wire.beginTransmission(I2C_ADDRESS(newaddr)); + if (Wire.endTransmission()) { + SERIAL_ECHOLNPGM("Address change failed! Check encoder module."); + return; + } + + SERIAL_ECHOLNPGM("Address change successful!"); + + // Now, if this module is configured, find which encoder instance it's supposed to correspond to + // and enable it (it will likely have failed initialization on power-up, before the address change). + const int8_t idx = idx_from_addr(newaddr); + if (idx >= 0 && !encoders[idx].get_active()) { + SERIAL_ECHO(axis_codes[encoders[idx].get_axis()]); + SERIAL_ECHOLNPGM(" axis encoder was not detected on printer startup. Trying again."); + encoders[idx].set_active(encoders[idx].passes_test(true)); + } +} + +void I2CPositionEncodersMgr::report_module_firmware(const uint8_t address) { + // First check there is a module + Wire.beginTransmission(I2C_ADDRESS(address)); + if (Wire.endTransmission()) { + SERIAL_ECHOLNPAIR("?No module detected at this address! (", address, ")"); + return; + } + + SERIAL_ECHOLNPAIR("Requesting version info from module at address ", address, ":"); + + Wire.beginTransmission(I2C_ADDRESS(address)); + Wire.write(I2CPE_SET_REPORT_MODE); + Wire.write(I2CPE_REPORT_VERSION); + Wire.endTransmission(); + + // Read value + if (Wire.requestFrom(I2C_ADDRESS(address), uint8_t(32))) { + char c; + while (Wire.available() > 0 && (c = (char)Wire.read()) > 0) + SERIAL_ECHO(c); + SERIAL_EOL(); + } + + // Set module back to normal (distance) mode + Wire.beginTransmission(I2C_ADDRESS(address)); + Wire.write(I2CPE_SET_REPORT_MODE); + Wire.write(I2CPE_REPORT_DISTANCE); + Wire.endTransmission(); +} + +int8_t I2CPositionEncodersMgr::parse() { + I2CPE_addr = 0; + + if (parser.seen('A')) { + + if (!parser.has_value()) { + SERIAL_ECHOLNPGM("?A seen, but no address specified! [30-200]"); + return I2CPE_PARSE_ERR; + }; + + I2CPE_addr = parser.value_byte(); + if (!WITHIN(I2CPE_addr, 30, 200)) { // reserve the first 30 and last 55 + SERIAL_ECHOLNPGM("?Address out of range. [30-200]"); + return I2CPE_PARSE_ERR; + } + + I2CPE_idx = idx_from_addr(I2CPE_addr); + if (I2CPE_idx >= I2CPE_ENCODER_CNT) { + SERIAL_ECHOLNPGM("?No device with this address!"); + return I2CPE_PARSE_ERR; + } + } + else if (parser.seenval('I')) { + + if (!parser.has_value()) { + SERIAL_ECHOLNPAIR("?I seen, but no index specified! [0-", I2CPE_ENCODER_CNT - 1, "]"); + return I2CPE_PARSE_ERR; + }; + + I2CPE_idx = parser.value_byte(); + if (I2CPE_idx >= I2CPE_ENCODER_CNT) { + SERIAL_ECHOLNPAIR("?Index out of range. [0-", I2CPE_ENCODER_CNT - 1, "]"); + return I2CPE_PARSE_ERR; + } + + I2CPE_addr = encoders[I2CPE_idx].get_address(); + } + else + I2CPE_idx = 0xFF; + + I2CPE_anyaxis = parser.seen_axis(); + + return I2CPE_PARSE_OK; +}; + +/** + * M860: Report the position(s) of position encoder module(s). + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * O Include homed zero-offset in returned position. + * U Units in mm or raw step count. + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M860() { + if (parse()) return; + + const bool hasU = parser.seen('U'), hasO = parser.seen('O'); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_position(idx, hasU, hasO); + } + } + } + else + report_position(I2CPE_idx, hasU, hasO); +} + +/** + * M861: Report the status of position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M861() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_status(idx); + } + } + } + else + report_status(I2CPE_idx); +} + +/** + * M862: Perform an axis continuity test for position encoder + * modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M862() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) test_axis(idx); + } + } + } + else + test_axis(I2CPE_idx); +} + +/** + * M863: Perform steps-per-mm calibration for + * position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1] + * P Number of rePeats/iterations. + * + * If A or I not specified: + * X Report on X axis encoder, if present. + * Y Report on Y axis encoder, if present. + * Z Report on Z axis encoder, if present. + * E Report on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M863() { + if (parse()) return; + + const uint8_t iterations = constrain(parser.byteval('P', 1), 1, 10); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) calibrate_steps_mm(idx, iterations); + } + } + } + else + calibrate_steps_mm(I2CPE_idx, iterations); +} + +/** + * M864: Change position encoder module I2C address. + * + * A Module current/old I2C address. If not present, + * assumes default address (030). [30, 200]. + * S Module new I2C address. [30, 200]. + * + * If S is not specified: + * X Use I2CPE_PRESET_ADDR_X (030). + * Y Use I2CPE_PRESET_ADDR_Y (031). + * Z Use I2CPE_PRESET_ADDR_Z (032). + * E Use I2CPE_PRESET_ADDR_E (033). + */ +void I2CPositionEncodersMgr::M864() { + uint8_t newAddress; + + if (parse()) return; + + if (!I2CPE_addr) I2CPE_addr = I2CPE_PRESET_ADDR_X; + + if (parser.seen('S')) { + if (!parser.has_value()) { + SERIAL_ECHOLNPGM("?S seen, but no address specified! [30-200]"); + return; + }; + + newAddress = parser.value_byte(); + if (!WITHIN(newAddress, 30, 200)) { + SERIAL_ECHOLNPGM("?New address out of range. [30-200]"); + return; + } + } + else if (!I2CPE_anyaxis) { + SERIAL_ECHOLNPGM("?You must specify S or [XYZE]."); + return; + } + else { + if (parser.seen('X')) newAddress = I2CPE_PRESET_ADDR_X; + else if (parser.seen('Y')) newAddress = I2CPE_PRESET_ADDR_Y; + else if (parser.seen('Z')) newAddress = I2CPE_PRESET_ADDR_Z; + else if (parser.seen('E')) newAddress = I2CPE_PRESET_ADDR_E; + else return; + } + + SERIAL_ECHOLNPAIR("Changing module at address ", I2CPE_addr, " to address ", newAddress); + + change_module_address(I2CPE_addr, newAddress); +} + +/** + * M865: Check position encoder module firmware version. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * + * If A or I not specified: + * X Check X axis encoder, if present. + * Y Check Y axis encoder, if present. + * Z Check Z axis encoder, if present. + * E Check E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M865() { + if (parse()) return; + + if (!I2CPE_addr) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_module_firmware(encoders[idx].get_address()); + } + } + } + else + report_module_firmware(I2CPE_addr); +} + +/** + * M866: Report or reset position encoder module error + * count. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * R Reset error counter. + * + * If A or I not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M866() { + if (parse()) return; + + const bool hasR = parser.seen('R'); + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + if (hasR) + reset_error_count(idx, AxisEnum(i)); + else + report_error_count(idx, AxisEnum(i)); + } + } + } + } + else if (hasR) + reset_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); + else + report_error_count(I2CPE_idx, encoders[I2CPE_idx].get_axis()); +} + +/** + * M867: Enable/disable or toggle error correction for position encoder modules. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * S<1|0> Enable/disable error correction. 1 enables, 0 disables. If not + * supplied, toggle. + * + * If A or I not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M867() { + if (parse()) return; + + const int8_t onoff = parser.seenval('S') ? parser.value_int() : -1; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; + enable_ec(idx, ena, AxisEnum(i)); + } + } + } + } + else { + const bool ena = onoff == -1 ? !encoders[I2CPE_idx].get_ec_enabled() : !!onoff; + enable_ec(I2CPE_idx, ena, encoders[I2CPE_idx].get_axis()); + } +} + +/** + * M868: Report or set position encoder module error correction + * threshold. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * T New error correction threshold. + * + * If A not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M868() { + if (parse()) return; + + const float newThreshold = parser.seenval('T') ? parser.value_float() : -9999; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) { + if (newThreshold != -9999) + set_ec_threshold(idx, newThreshold, encoders[idx].get_axis()); + else + get_ec_threshold(idx, encoders[idx].get_axis()); + } + } + } + } + else if (newThreshold != -9999) + set_ec_threshold(I2CPE_idx, newThreshold, encoders[I2CPE_idx].get_axis()); + else + get_ec_threshold(I2CPE_idx, encoders[I2CPE_idx].get_axis()); +} + +/** + * M869: Report position encoder module error. + * + * A Module I2C address. [30, 200]. + * I Module index. [0, I2CPE_ENCODER_CNT - 1]. + * + * If A not specified: + * X Act on X axis encoder, if present. + * Y Act on Y axis encoder, if present. + * Z Act on Z axis encoder, if present. + * E Act on E axis encoder, if present. + */ +void I2CPositionEncodersMgr::M869() { + if (parse()) return; + + if (I2CPE_idx == 0xFF) { + LOOP_XYZE(i) { + if (!I2CPE_anyaxis || parser.seen(axis_codes[i])) { + const uint8_t idx = idx_from_axis(AxisEnum(i)); + if ((int8_t)idx >= 0) report_error(idx); + } + } + } + else + report_error(I2CPE_idx); +} + +#endif // I2C_POSITION_ENCODERS diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h new file mode 100644 index 00000000..511e560b --- /dev/null +++ b/Marlin/src/feature/encoder_i2c.h @@ -0,0 +1,320 @@ +/** + * 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 "../module/planner.h" + +#include + +//=========== Advanced / Less-Common Encoder Configuration Settings ========== + +#define I2CPE_EC_THRESH_PROPORTIONAL // if enabled adjusts the error correction threshold + // proportional to the current speed of the axis allows + // for very small error margin at low speeds without + // stuttering due to reading latency at high speeds + +#define I2CPE_DEBUG // enable encoder-related debug serial echos + +#define I2CPE_REBOOT_TIME 5000 // time we wait for an encoder module to reboot + // after changing address. + +#define I2CPE_MAG_SIG_GOOD 0 +#define I2CPE_MAG_SIG_MID 1 +#define I2CPE_MAG_SIG_BAD 2 +#define I2CPE_MAG_SIG_NF 255 + +#define I2CPE_REQ_REPORT 0 +#define I2CPE_RESET_COUNT 1 +#define I2CPE_SET_ADDR 2 +#define I2CPE_SET_REPORT_MODE 3 +#define I2CPE_CLEAR_EEPROM 4 + +#define I2CPE_LED_PAR_MODE 10 +#define I2CPE_LED_PAR_BRT 11 +#define I2CPE_LED_PAR_RATE 14 + +#define I2CPE_REPORT_DISTANCE 0 +#define I2CPE_REPORT_STRENGTH 1 +#define I2CPE_REPORT_VERSION 2 + +// Default I2C addresses +#define I2CPE_PRESET_ADDR_X 30 +#define I2CPE_PRESET_ADDR_Y 31 +#define I2CPE_PRESET_ADDR_Z 32 +#define I2CPE_PRESET_ADDR_E 33 + +#define I2CPE_DEF_AXIS X_AXIS +#define I2CPE_DEF_ADDR I2CPE_PRESET_ADDR_X + +// Error event counter; tracks how many times there is an error exceeding a certain threshold +#define I2CPE_ERR_CNT_THRESH 3.00 +#define I2CPE_ERR_CNT_DEBOUNCE_MS 2000 + +#if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + #define I2CPE_ERR_ARRAY_SIZE 32 + #define I2CPE_ERR_PRST_ARRAY_SIZE 10 +#endif + +// Error Correction Methods +#define I2CPE_ECM_NONE 0 +#define I2CPE_ECM_MICROSTEP 1 +#define I2CPE_ECM_PLANNER 2 +#define I2CPE_ECM_STALLDETECT 3 + +// Encoder types +#define I2CPE_ENC_TYPE_ROTARY 0 +#define I2CPE_ENC_TYPE_LINEAR 1 + +// Parser +#define I2CPE_PARSE_ERR 1 +#define I2CPE_PARSE_OK 0 + +#define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) +#define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) + +typedef union { + volatile int32_t val = 0; + uint8_t bval[4]; +} i2cLong; + +class I2CPositionEncoder { + private: + AxisEnum encoderAxis = I2CPE_DEF_AXIS; + + uint8_t i2cAddress = I2CPE_DEF_ADDR, + ecMethod = I2CPE_DEF_EC_METHOD, + type = I2CPE_DEF_TYPE, + H = I2CPE_MAG_SIG_NF; // Magnetic field strength + + int encoderTicksPerUnit = I2CPE_DEF_ENC_TICKS_UNIT, + stepperTicks = I2CPE_DEF_TICKS_REV, + errorCount = 0, + errorPrev = 0; + + float ecThreshold = I2CPE_DEF_EC_THRESH; + + bool homed = false, + trusted = false, + initialized = false, + active = false, + invert = false, + ec = true; + + int32_t zeroOffset = 0, + lastPosition = 0, + position; + + millis_t lastPositionTime = 0, + nextErrorCountTime = 0, + lastErrorTime; + + #if ENABLED(I2CPE_ERR_ROLLING_AVERAGE) + uint8_t errIdx = 0, errPrstIdx = 0; + int err[I2CPE_ERR_ARRAY_SIZE] = { 0 }, + errPrst[I2CPE_ERR_PRST_ARRAY_SIZE] = { 0 }; + #endif + + public: + void init(const uint8_t address, const AxisEnum axis); + void reset(); + + void update(); + + void set_homed(); + void set_unhomed(); + + int32_t get_raw_count(); + + FORCE_INLINE float mm_from_count(const int32_t count) { + switch (type) { + default: return -1; + case I2CPE_ENC_TYPE_LINEAR: + return count / encoderTicksPerUnit; + case I2CPE_ENC_TYPE_ROTARY: + return (count * stepperTicks) / (encoderTicksPerUnit * planner.settings.axis_steps_per_mm[encoderAxis]); + } + } + + FORCE_INLINE float get_position_mm() { return mm_from_count(get_position()); } + FORCE_INLINE int32_t get_position() { return get_raw_count() - zeroOffset; } + + int32_t get_axis_error_steps(const bool report); + float get_axis_error_mm(const bool report); + + void calibrate_steps_mm(const uint8_t iter); + + bool passes_test(const bool report); + + bool test_axis(); + + FORCE_INLINE int get_error_count() { return errorCount; } + FORCE_INLINE void set_error_count(const int newCount) { errorCount = newCount; } + + FORCE_INLINE uint8_t get_address() { return i2cAddress; } + FORCE_INLINE void set_address(const uint8_t addr) { i2cAddress = addr; } + + FORCE_INLINE bool get_active() { return active; } + FORCE_INLINE void set_active(const bool a) { active = a; } + + FORCE_INLINE void set_inverted(const bool i) { invert = i; } + + FORCE_INLINE AxisEnum get_axis() { return encoderAxis; } + + FORCE_INLINE bool get_ec_enabled() { return ec; } + FORCE_INLINE void set_ec_enabled(const bool enabled) { ec = enabled; } + + FORCE_INLINE uint8_t get_ec_method() { return ecMethod; } + FORCE_INLINE void set_ec_method(const byte method) { ecMethod = method; } + + FORCE_INLINE float get_ec_threshold() { return ecThreshold; } + FORCE_INLINE void set_ec_threshold(const float newThreshold) { ecThreshold = newThreshold; } + + FORCE_INLINE int get_encoder_ticks_mm() { + switch (type) { + default: return 0; + case I2CPE_ENC_TYPE_LINEAR: + return encoderTicksPerUnit; + case I2CPE_ENC_TYPE_ROTARY: + return (int)((encoderTicksPerUnit / stepperTicks) * planner.settings.axis_steps_per_mm[encoderAxis]); + } + } + + FORCE_INLINE int get_ticks_unit() { return encoderTicksPerUnit; } + FORCE_INLINE void set_ticks_unit(const int ticks) { encoderTicksPerUnit = ticks; } + + FORCE_INLINE uint8_t get_type() { return type; } + FORCE_INLINE void set_type(const byte newType) { type = newType; } + + FORCE_INLINE int get_stepper_ticks() { return stepperTicks; } + FORCE_INLINE void set_stepper_ticks(const int ticks) { stepperTicks = ticks; } +}; + +class I2CPositionEncodersMgr { + private: + static bool I2CPE_anyaxis; + static uint8_t I2CPE_addr, I2CPE_idx; + + public: + + static void init(); + + // consider only updating one endoder per call / tick if encoders become too time intensive + static void update() { LOOP_PE(i) encoders[i].update(); } + + static void homed(const AxisEnum axis) { + LOOP_PE(i) + if (encoders[i].get_axis() == axis) encoders[i].set_homed(); + } + + static void unhomed(const AxisEnum axis) { + LOOP_PE(i) + if (encoders[i].get_axis() == axis) encoders[i].set_unhomed(); + } + + static void report_position(const int8_t idx, const bool units, const bool noOffset); + + static void report_status(const int8_t idx) { + CHECK_IDX(); + SERIAL_ECHOLNPAIR("Encoder ", idx, ": "); + encoders[idx].get_raw_count(); + encoders[idx].passes_test(true); + } + + static void report_error(const int8_t idx) { + CHECK_IDX(); + encoders[idx].get_axis_error_steps(true); + } + + static void test_axis(const int8_t idx) { + CHECK_IDX(); + encoders[idx].test_axis(); + } + + static void calibrate_steps_mm(const int8_t idx, const int iterations) { + CHECK_IDX(); + encoders[idx].calibrate_steps_mm(iterations); + } + + static void change_module_address(const uint8_t oldaddr, const uint8_t newaddr); + static void report_module_firmware(const uint8_t address); + + static void report_error_count(const int8_t idx, const AxisEnum axis) { + CHECK_IDX(); + SERIAL_ECHOLNPAIR("Error count on ", axis_codes[axis], " axis is ", encoders[idx].get_error_count()); + } + + static void reset_error_count(const int8_t idx, const AxisEnum axis) { + CHECK_IDX(); + encoders[idx].set_error_count(0); + SERIAL_ECHOLNPAIR("Error count on ", axis_codes[axis], " axis has been reset."); + } + + static void enable_ec(const int8_t idx, const bool enabled, const AxisEnum axis) { + CHECK_IDX(); + encoders[idx].set_ec_enabled(enabled); + SERIAL_ECHOPAIR("Error correction on ", axis_codes[axis]); + SERIAL_ECHO_TERNARY(encoders[idx].get_ec_enabled(), " axis is ", "en", "dis", "abled.\n"); + } + + 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 ", 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 ", threshold, "mm."); + } + + static int8_t idx_from_axis(const AxisEnum axis) { + LOOP_PE(i) + if (encoders[i].get_axis() == axis) return i; + return -1; + } + + static int8_t idx_from_addr(const uint8_t addr) { + LOOP_PE(i) + if (encoders[i].get_address() == addr) return i; + return -1; + } + + static int8_t parse(); + + static void M860(); + static void M861(); + static void M862(); + static void M863(); + static void M864(); + static void M865(); + static void M866(); + static void M867(); + static void M868(); + static void M869(); + + static I2CPositionEncoder encoders[I2CPE_ENCODER_CNT]; +}; + +extern I2CPositionEncodersMgr I2CPEM; diff --git a/Marlin/src/feature/fanmux.cpp b/Marlin/src/feature/fanmux.cpp new file mode 100644 index 00000000..43952ca8 --- /dev/null +++ b/Marlin/src/feature/fanmux.cpp @@ -0,0 +1,55 @@ +/** + * 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 . + * + */ + +/** + * feature/pause.cpp - Pause feature support functions + * This may be combined with related G-codes if features are consolidated. + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_FANMUX + +#include "fanmux.h" + +void fanmux_switch(const uint8_t e) { + WRITE(FANMUX0_PIN, TEST(e, 0) ? HIGH : LOW); + #if PIN_EXISTS(FANMUX1) + WRITE(FANMUX1_PIN, TEST(e, 1) ? HIGH : LOW); + #if PIN_EXISTS(FANMUX2) + WRITE(FANMUX2_PIN, TEST(e, 2) ? HIGH : LOW); + #endif + #endif +} + +void fanmux_init() { + SET_OUTPUT(FANMUX0_PIN); + #if PIN_EXISTS(FANMUX1) + SET_OUTPUT(FANMUX1_PIN); + #if PIN_EXISTS(FANMUX2) + SET_OUTPUT(FANMUX2_PIN); + #endif + #endif + fanmux_switch(0); +} + +#endif // HAS_FANMUX diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h new file mode 100644 index 00000000..b1b0c67a --- /dev/null +++ b/Marlin/src/feature/fanmux.h @@ -0,0 +1,29 @@ +/** + * 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 + +/** + * feature/fanmux.h - Cooling Fan Multiplexer support functions + */ + +extern void fanmux_switch(const uint8_t e); +extern void fanmux_init(); diff --git a/Marlin/src/feature/filwidth.cpp b/Marlin/src/feature/filwidth.cpp new file mode 100644 index 00000000..2bd9c789 --- /dev/null +++ b/Marlin/src/feature/filwidth.cpp @@ -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 . + * + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + +#include "filwidth.h" + +FilamentWidthSensor filwidth; + +bool FilamentWidthSensor::enabled; // = false; // (M405-M406) Filament Width Sensor ON/OFF. +uint32_t FilamentWidthSensor::accum; // = 0 // ADC accumulator +uint16_t FilamentWidthSensor::raw; // = 0 // Measured filament diameter - one extruder only +float FilamentWidthSensor::nominal_mm = DEFAULT_NOMINAL_FILAMENT_DIA, // (M104) Nominal filament width + FilamentWidthSensor::measured_mm = DEFAULT_MEASURED_FILAMENT_DIA, // Measured filament diameter + FilamentWidthSensor::e_count = 0, + FilamentWidthSensor::delay_dist = 0; +uint8_t FilamentWidthSensor::meas_delay_cm = MEASUREMENT_DELAY_CM; // Distance delay setting +int8_t FilamentWidthSensor::ratios[MAX_MEASUREMENT_DELAY + 1], // Ring buffer to delay measurement. (Extruder factor minus 100) + FilamentWidthSensor::index_r, // Indexes into ring buffer + FilamentWidthSensor::index_w; + +void FilamentWidthSensor::init() { + const int8_t ratio = sample_to_size_ratio(); + LOOP_L_N(i, COUNT(ratios)) ratios[i] = ratio; + index_r = index_w = 0; +} + +#endif // FILAMENT_WIDTH_SENSOR diff --git a/Marlin/src/feature/filwidth.h b/Marlin/src/feature/filwidth.h new file mode 100644 index 00000000..ef3859df --- /dev/null +++ b/Marlin/src/feature/filwidth.h @@ -0,0 +1,120 @@ +/** + * 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 "../module/planner.h" +#include "../module/thermistor/thermistors.h" + +class FilamentWidthSensor { +public: + static constexpr int MMD_CM = MAX_MEASUREMENT_DELAY + 1, MMD_MM = MMD_CM * 10; + static bool enabled; // (M405-M406) Filament Width Sensor ON/OFF. + static uint32_t accum; // ADC accumulator + static uint16_t raw; // Measured filament diameter - one extruder only + static float nominal_mm, // (M104) Nominal filament width + measured_mm, // Measured filament diameter + e_count, delay_dist; + static uint8_t meas_delay_cm; // Distance delay setting + static int8_t ratios[MMD_CM], // Ring buffer to delay measurement. (Extruder factor minus 100) + index_r, index_w; // Indexes into ring buffer + + FilamentWidthSensor() { init(); } + static void init(); + + static inline void enable(const bool ena) { enabled = ena; } + + static inline void set_delay_cm(const uint8_t cm) { + meas_delay_cm = _MIN(cm, MAX_MEASUREMENT_DELAY); + } + + /** + * Convert Filament Width (mm) to an extrusion ratio + * and reduce to an 8 bit value. + * + * A nominal width of 1.75 and measured width of 1.73 + * gives (100 * 1.75 / 1.73) for a ratio of 101 and + * a return value of 1. + */ + static int8_t sample_to_size_ratio() { + return ABS(nominal_mm - measured_mm) <= FILWIDTH_ERROR_MARGIN + ? int(100.0f * nominal_mm / measured_mm) - 100 : 0; + } + + // Apply a single ADC reading to the raw value + static void accumulate(const uint16_t adc) { + if (adc > 102) // Ignore ADC under 0.5 volts + accum += (uint32_t(adc) << 7) - (accum >> 7); + } + + // Convert raw measurement to mm + static inline float raw_to_mm(const uint16_t v) { return v * 5.0f * RECIPROCAL(float(MAX_RAW_THERMISTOR_VALUE)); } + static inline float raw_to_mm() { return raw_to_mm(raw); } + + // A scaled reading is ready + // Divide to get to 0-16384 range since we used 1/128 IIR filter approach + static inline void reading_ready() { raw = accum >> 10; } + + // Update mm from the raw measurement + static inline void update_measured_mm() { measured_mm = raw_to_mm(); } + + // Update ring buffer used to delay filament measurements + static inline void advance_e(const float &e_move) { + + // Increment counters with the E distance + e_count += e_move; + delay_dist += e_move; + + // Only get new measurements on forward E movement + if (!UNEAR_ZERO(e_count)) { + + // Loop the delay distance counter (modulus by the mm length) + while (delay_dist >= MMD_MM) delay_dist -= MMD_MM; + + // Convert into an index (cm) into the measurement array + index_r = int8_t(delay_dist * 0.1f); + + // If the ring buffer is not full... + if (index_r != index_w) { + e_count = 0; // Reset the E movement counter + const int8_t meas_sample = sample_to_size_ratio(); + do { + if (++index_w >= MMD_CM) index_w = 0; // The next unused slot + ratios[index_w] = meas_sample; // Store the measurement + } while (index_r != index_w); // More slots to fill? + } + } + } + + // Dynamically set the volumetric multiplier based on the delayed width measurement. + static inline void update_volumetric() { + if (enabled) { + int8_t read_index = index_r - meas_delay_cm; + if (read_index < 0) read_index += MMD_CM; // Loop around buffer if needed + LIMIT(read_index, 0, MAX_MEASUREMENT_DELAY); + planner.apply_filament_width_sensor(ratios[read_index]); + } + } + +}; + +extern FilamentWidthSensor filwidth; diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp new file mode 100644 index 00000000..e5c52562 --- /dev/null +++ b/Marlin/src/feature/fwretract.cpp @@ -0,0 +1,201 @@ +/** + * 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 . + * + */ + +/** + * fwretract.cpp - Implement firmware-based retraction + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(FWRETRACT) + +#include "fwretract.h" + +FWRetract fwretract; // Single instance - this calls the constructor + +#include "../module/motion.h" +#include "../module/planner.h" +#include "../module/stepper.h" + +#if ENABLED(RETRACT_SYNC_MIXING) + #include "mixing.h" +#endif + +// private: + +#if HAS_MULTI_EXTRUDER + bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted +#endif + +// public: + +fwretract_settings_t FWRetract::settings; // M207 S F Z W, M208 S F W R + +#if ENABLED(FWRETRACT_AUTORETRACT) + bool FWRetract::autoretract_enabled; // M209 S - Autoretract switch +#endif + +bool FWRetract::retracted[EXTRUDERS]; // Which extruders are currently retracted + +float FWRetract::current_retract[EXTRUDERS], // Retract value used by planner + FWRetract::current_hop; + +void FWRetract::reset() { + TERN_(FWRETRACT_AUTORETRACT, autoretract_enabled = false); + settings.retract_length = RETRACT_LENGTH; + settings.retract_feedrate_mm_s = RETRACT_FEEDRATE; + settings.retract_zraise = RETRACT_ZRAISE; + settings.retract_recover_extra = RETRACT_RECOVER_LENGTH; + settings.retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE; + settings.swap_retract_length = RETRACT_LENGTH_SWAP; + settings.swap_retract_recover_extra = RETRACT_RECOVER_LENGTH_SWAP; + settings.swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP; + current_hop = 0.0; + + LOOP_L_N(i, EXTRUDERS) { + retracted[i] = false; + TERN_(HAS_MULTI_EXTRUDER, retracted_swap[i] = false); + current_retract[i] = 0.0; + } +} + +/** + * Retract or recover according to firmware settings + * + * This function handles retract/recover moves for G10 and G11, + * plus auto-retract moves sent from G0/G1 when E-only moves are done. + * + * To simplify the logic, doubled retract/recover moves are ignored. + * + * Note: Auto-retract will apply the set Z hop in addition to any Z hop + * included in the G-code. Use M207 Z0 to to prevent double hop. + */ +void FWRetract::retract(const bool retracting + #if HAS_MULTI_EXTRUDER + , bool swapping/*=false*/ + #endif +) { + // Prevent two retracts or recovers in a row + if (retracted[active_extruder] == retracting) return; + + // Prevent two swap-retract or recovers in a row + #if HAS_MULTI_EXTRUDER + // Allow G10 S1 only after G11 + if (swapping && retracted_swap[active_extruder] == retracting) return; + // G11 priority to recover the long retract if activated + if (!retracting) swapping = retracted_swap[active_extruder]; + #else + constexpr bool swapping = false; + #endif + + /* // debugging + SERIAL_ECHOLNPAIR( + "retracting ", retracting, + " swapping ", swapping, + " active extruder ", active_extruder + ); + LOOP_L_N(i, EXTRUDERS) { + SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); + #if HAS_MULTI_EXTRUDER + SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); + #endif + } + SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); + SERIAL_ECHOLNPAIR("current_position.e ", current_position.e); + SERIAL_ECHOLNPAIR("current_hop ", current_hop); + //*/ + + const float base_retract = TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) + * (swapping ? settings.swap_retract_length : settings.retract_length); + + // The current position will be the destination for E and Z moves + destination = current_position; + + #if ENABLED(RETRACT_SYNC_MIXING) + const uint8_t old_mixing_tool = mixer.get_current_vtool(); + mixer.T(MIXER_AUTORETRACT_TOOL); + #endif + + const feedRate_t fr_max_z = planner.settings.max_feedrate_mm_s[Z_AXIS]; + if (retracting) { + // Retract by moving from a faux E position back to the current E position + current_retract[active_extruder] = base_retract; + prepare_internal_move_to_destination( // set current to destination + settings.retract_feedrate_mm_s * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) + ); + + // Is a Z hop set, and has the hop not yet been done? + if (!current_hop && settings.retract_zraise > 0.01f) { // Apply hop only once + current_hop += settings.retract_zraise; // Add to the hop total (again, only once) + // Raise up, set_current_to_destination. Maximum Z feedrate + prepare_internal_move_to_destination(fr_max_z); + } + } + else { + // If a hop was done and Z hasn't changed, undo the Z hop + if (current_hop) { + current_hop = 0; + // Lower Z, set_current_to_destination. Maximum Z feedrate + prepare_internal_move_to_destination(fr_max_z); + } + + const float extra_recover = swapping ? settings.swap_retract_recover_extra : settings.retract_recover_extra; + if (extra_recover) { + current_position.e -= extra_recover; // Adjust the current E position by the extra amount to recover + sync_plan_position_e(); // Sync the planner position so the extra amount is recovered + } + + current_retract[active_extruder] = 0; + + // Recover E, set_current_to_destination + prepare_internal_move_to_destination( + (swapping ? settings.swap_retract_recover_feedrate_mm_s : settings.retract_recover_feedrate_mm_s) + * TERN1(RETRACT_SYNC_MIXING, (MIXING_STEPPERS)) + ); + } + + TERN_(RETRACT_SYNC_MIXING, mixer.T(old_mixing_tool)); // Restore original mixing tool + + retracted[active_extruder] = retracting; // Active extruder now retracted / recovered + + // If swap retract/recover update the retracted_swap flag too + #if HAS_MULTI_EXTRUDER + if (swapping) retracted_swap[active_extruder] = retracting; + #endif + + /* // debugging + SERIAL_ECHOLNPAIR("retracting ", retracting); + SERIAL_ECHOLNPAIR("swapping ", swapping); + SERIAL_ECHOLNPAIR("active_extruder ", active_extruder); + LOOP_L_N(i, EXTRUDERS) { + SERIAL_ECHOLNPAIR("retracted[", i, "] ", retracted[i]); + #if HAS_MULTI_EXTRUDER + SERIAL_ECHOLNPAIR("retracted_swap[", i, "] ", retracted_swap[i]); + #endif + } + SERIAL_ECHOLNPAIR("current_position.z ", current_position.z); + SERIAL_ECHOLNPAIR("current_position.e ", current_position.e); + SERIAL_ECHOLNPAIR("current_hop ", current_hop); + //*/ +} + +#endif // FWRETRACT diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h new file mode 100644 index 00000000..13485196 --- /dev/null +++ b/Marlin/src/feature/fwretract.h @@ -0,0 +1,86 @@ +/** + * 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 + +/** + * fwretract.h - Define firmware-based retraction interface + */ + +#include "../inc/MarlinConfigPre.h" + +typedef struct { + float retract_length; // M207 S - G10 Retract length + feedRate_t retract_feedrate_mm_s; // M207 F - G10 Retract feedrate + float retract_zraise, // M207 Z - G10 Retract hop size + retract_recover_extra; // M208 S - G11 Recover length + feedRate_t retract_recover_feedrate_mm_s; // M208 F - G11 Recover feedrate + float swap_retract_length, // M207 W - G10 Swap Retract length + swap_retract_recover_extra; // M208 W - G11 Swap Recover length + feedRate_t swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate +} fwretract_settings_t; + +#if ENABLED(FWRETRACT) + +class FWRetract { +private: + #if HAS_MULTI_EXTRUDER + static bool retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted + #endif + +public: + static fwretract_settings_t settings; + + #if ENABLED(FWRETRACT_AUTORETRACT) + static bool autoretract_enabled; // M209 S - Autoretract switch + #else + static constexpr bool autoretract_enabled = false; + #endif + + static bool retracted[EXTRUDERS]; // Which extruders are currently retracted + static float current_retract[EXTRUDERS], // Retract value used by planner + current_hop; // Hop value used by planner + + FWRetract() { reset(); } + + static void reset(); + + static void refresh_autoretract() { + LOOP_L_N(i, EXTRUDERS) retracted[i] = false; + } + + static void enable_autoretract(const bool enable) { + #if ENABLED(FWRETRACT_AUTORETRACT) + autoretract_enabled = enable; + refresh_autoretract(); + #endif + } + + static void retract(const bool retracting + #if HAS_MULTI_EXTRUDER + , bool swapping = false + #endif + ); +}; + +extern FWRetract fwretract; + +#endif // FWRETRACT diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp new file mode 100644 index 00000000..30126392 --- /dev/null +++ b/Marlin/src/feature/host_actions.cpp @@ -0,0 +1,194 @@ +/** + * 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(HOST_ACTION_COMMANDS) + +#include "host_actions.h" + +//#define DEBUG_HOST_ACTIONS + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "pause.h" + #include "../gcode/queue.h" +#endif + +#if HAS_FILAMENT_SENSOR + #include "runout.h" +#endif + +void host_action(PGM_P const pstr, const bool eol) { + PORT_REDIRECT(SERIAL_BOTH); + SERIAL_ECHOPGM("//action:"); + serialprintPGM(pstr); + if (eol) SERIAL_EOL(); +} + +#ifdef ACTION_ON_KILL + void host_action_kill() { host_action(PSTR(ACTION_ON_KILL)); } +#endif +#ifdef ACTION_ON_PAUSE + void host_action_pause(const bool eol/*=true*/) { host_action(PSTR(ACTION_ON_PAUSE), eol); } +#endif +#ifdef ACTION_ON_PAUSED + void host_action_paused(const bool eol/*=true*/) { host_action(PSTR(ACTION_ON_PAUSED), eol); } +#endif +#ifdef ACTION_ON_RESUME + void host_action_resume() { host_action(PSTR(ACTION_ON_RESUME)); } +#endif +#ifdef ACTION_ON_RESUMED + void host_action_resumed() { host_action(PSTR(ACTION_ON_RESUMED)); } +#endif +#ifdef ACTION_ON_CANCEL + void host_action_cancel() { host_action(PSTR(ACTION_ON_CANCEL)); } +#endif +#ifdef ACTION_ON_START + void host_action_start() { host_action(PSTR(ACTION_ON_START)); } +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + + PGMSTR(CONTINUE_STR, "Continue"); + PGMSTR(DISMISS_STR, "Dismiss"); + + #if HAS_RESUME_CONTINUE + extern bool wait_for_user; + #endif + + 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_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(); + } + + 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); + SERIAL_EOL(); + } + void host_action_prompt_begin(const PromptReason reason, PGM_P const pstr, const char extra_char/*='\0'*/) { + host_action_prompt_end(); + host_prompt_reason = reason; + host_action_prompt_plus(PSTR("begin"), pstr, extra_char); + } + void host_action_prompt_button(PGM_P const pstr) { host_action_prompt_plus(PSTR("button"), pstr); } + void host_action_prompt_end() { host_action_prompt(PSTR("end")); } + void host_action_prompt_show() { host_action_prompt(PSTR("show")); } + void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1/*=nullptr*/, PGM_P const btn2/*=nullptr*/) { + host_action_prompt_begin(reason, pstr); + if (btn1) host_action_prompt_button(btn1); + if (btn2) host_action_prompt_button(btn2); + host_action_prompt_show(); + } + + void filament_load_host_prompt() { + const bool disable_to_continue = TERN0(HAS_FILAMENT_SENSOR, runout.filament_ran_out); + host_prompt_do(PROMPT_FILAMENT_RUNOUT, PSTR("Paused"), PSTR("PurgeMore"), + disable_to_continue ? PSTR("DisableRunout") : CONTINUE_STR + ); + } + + // + // Handle responses from the host, such as: + // - Filament runout responses: Purge More, Continue + // - General "Continue" response + // - Resume Print response + // - Dismissal of info + // + void host_response_handler(const uint8_t response) { + #ifdef DEBUG_HOST_ACTIONS + static PGMSTR(m876_prefix, "M876 Handle Re"); + serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("ason: ", host_prompt_reason); + serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("sponse: ", response); + #endif + PGM_P msg = PSTR("UNKNOWN STATE"); + const PromptReason hpr = host_prompt_reason; + host_prompt_reason = PROMPT_NOT_DEFINED; // Reset now ahead of logic + switch (hpr) { + case PROMPT_FILAMENT_RUNOUT: + msg = PSTR("FILAMENT_RUNOUT"); + switch (response) { + + case 0: // "Purge More" button + #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) + #endif + filament_load_host_prompt(); // Initiate another host prompt. (NOTE: The loop in load_filament may also do this!) + break; + + case 1: // "Continue" / "Disable Runout" button + #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection + #endif + #if HAS_FILAMENT_SENSOR + if (runout.filament_ran_out) { // Disable a triggered sensor + runout.enabled = false; + runout.reset(); + } + #endif + break; + } + break; + case PROMPT_USER_CONTINUE: + TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); + msg = PSTR("FILAMENT_RUNOUT_CONTINUE"); + break; + case PROMPT_PAUSE_RESUME: + msg = PSTR("LCD_PAUSE_RESUME"); + #if ENABLED(ADVANCED_PAUSE_FEATURE) + extern const char M24_STR[]; + queue.inject_P(M24_STR); + #endif + break; + case PROMPT_INFO: + msg = PSTR("GCODE_INFO"); + break; + default: break; + } + SERIAL_ECHOPGM("M876 Responding PROMPT_"); + serialprintPGM(msg); + SERIAL_EOL(); + } + +#endif // HOST_PROMPT_SUPPORT + +#endif // HOST_ACTION_COMMANDS diff --git a/Marlin/src/feature/host_actions.h b/Marlin/src/feature/host_actions.h new file mode 100644 index 00000000..09eeed23 --- /dev/null +++ b/Marlin/src/feature/host_actions.h @@ -0,0 +1,80 @@ +/** + * 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 "../HAL/shared/Marduino.h" + +void host_action(PGM_P const pstr, const bool eol=true); + +#ifdef ACTION_ON_KILL + void host_action_kill(); +#endif +#ifdef ACTION_ON_PAUSE + void host_action_pause(const bool eol=true); +#endif +#ifdef ACTION_ON_PAUSED + void host_action_paused(const bool eol=true); +#endif +#ifdef ACTION_ON_RESUME + void host_action_resume(); +#endif +#ifdef ACTION_ON_RESUMED + void host_action_resumed(); +#endif +#ifdef ACTION_ON_CANCEL + void host_action_cancel(); +#endif +#ifdef ACTION_ON_START + void host_action_start(); +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + + extern const char CONTINUE_STR[], DISMISS_STR[]; + + enum PromptReason : uint8_t { + PROMPT_NOT_DEFINED, + PROMPT_FILAMENT_RUNOUT, + PROMPT_USER_CONTINUE, + PROMPT_FILAMENT_RUNOUT_REHEAT, + PROMPT_PAUSE_RESUME, + PROMPT_INFO + }; + + extern PromptReason host_prompt_reason; + + void host_response_handler(const uint8_t response); + void host_action_notify(const char * const message); + void host_action_notify_P(PGM_P const message); + void host_action_prompt_begin(const PromptReason reason, PGM_P const pstr, const char extra_char='\0'); + void host_action_prompt_button(PGM_P const pstr); + void host_action_prompt_end(); + void host_action_prompt_show(); + void host_prompt_do(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr); + inline void host_prompt_open(const PromptReason reason, PGM_P const pstr, PGM_P const btn1=nullptr, PGM_P const btn2=nullptr) { + if (host_prompt_reason == PROMPT_NOT_DEFINED) host_prompt_do(reason, pstr, btn1, btn2); + } + + void filament_load_host_prompt(); + +#endif diff --git a/Marlin/src/feature/hotend_idle.cpp b/Marlin/src/feature/hotend_idle.cpp new file mode 100644 index 00000000..9d5594c2 --- /dev/null +++ b/Marlin/src/feature/hotend_idle.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 . + * + */ + +/** + * Hotend Idle Timeout + * Prevent filament in the nozzle from charring and causing a critical jam. + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(HOTEND_IDLE_TIMEOUT) + +#include "hotend_idle.h" +#include "../gcode/gcode.h" + +#include "../module/temperature.h" +#include "../module/motion.h" +#include "../lcd/ultralcd.h" + +extern HotendIdleProtection hotend_idle; + +millis_t HotendIdleProtection::next_protect_ms = 0; + +void HotendIdleProtection::check_hotends(const millis_t &ms) { + bool do_prot = false; + HOTEND_LOOP() { + if (thermalManager.degHotend(e) >= HOTEND_IDLE_MIN_TRIGGER) { + do_prot = true; break; + } + } + if (bool(next_protect_ms) != do_prot) + next_protect_ms = do_prot ? ms + hp_interval : 0; +} + +void HotendIdleProtection::check_e_motion(const millis_t &ms) { + static float old_e_position = 0; + if (old_e_position != current_position.e) { + old_e_position = current_position.e; // Track filament motion + if (next_protect_ms) // If some heater is on then... + next_protect_ms = ms + hp_interval; // ...delay the timeout till later + } +} + +void HotendIdleProtection::check() { + const millis_t ms = millis(); // Shared millis + + check_hotends(ms); // Any hotends need protection? + check_e_motion(ms); // Motion will protect them + + // Hot and not moving for too long... + if (next_protect_ms && ELAPSED(ms, next_protect_ms)) + timed_out(); +} + +// Lower (but don't raise) hotend / bed temperatures +void HotendIdleProtection::timed_out() { + next_protect_ms = 0; + SERIAL_ECHOLNPGM("Hotend Idle Timeout"); + LCD_MESSAGEPGM(MSG_HOTEND_IDLE_TIMEOUT); + HOTEND_LOOP() { + if ((HOTEND_IDLE_NOZZLE_TARGET) < thermalManager.degTargetHotend(e)) + thermalManager.setTargetHotend(HOTEND_IDLE_NOZZLE_TARGET, e); + } + #if HAS_HEATED_BED + if ((HOTEND_IDLE_BED_TARGET) < thermalManager.degTargetBed()) + thermalManager.setTargetBed(HOTEND_IDLE_BED_TARGET); + #endif +} + +#endif // HOTEND_IDLE_TIMEOUT diff --git a/Marlin/src/feature/hotend_idle.h b/Marlin/src/feature/hotend_idle.h new file mode 100644 index 00000000..40f557d5 --- /dev/null +++ b/Marlin/src/feature/hotend_idle.h @@ -0,0 +1,37 @@ +/** + * 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 "../core/millis_t.h" + +class HotendIdleProtection { +public: + static void check(); +private: + static constexpr millis_t hp_interval = SEC_TO_MS(HOTEND_IDLE_TIMEOUT_SEC); + static millis_t next_protect_ms; + static void check_hotends(const millis_t &ms); + static void check_e_motion(const millis_t &ms); + static void timed_out(); +}; + +extern HotendIdleProtection hotend_idle; diff --git a/Marlin/src/feature/joystick.cpp b/Marlin/src/feature/joystick.cpp new file mode 100644 index 00000000..d9c5ae7c --- /dev/null +++ b/Marlin/src/feature/joystick.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 . + * + */ + +/** + * joystick.cpp - joystick input / jogging + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(JOYSTICK) + +#include "joystick.h" + +#include "../inc/MarlinConfig.h" // for pins +#include "../module/planner.h" +#include "../module/temperature.h" + +Joystick joystick; + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#if HAS_JOY_ADC_X + temp_info_t Joystick::x; // = { 0 } + #if ENABLED(INVERT_JOY_X) + #define JOY_X(N) (16383 - (N)) + #else + #define JOY_X(N) (N) + #endif +#endif +#if HAS_JOY_ADC_Y + temp_info_t Joystick::y; // = { 0 } + #if ENABLED(INVERT_JOY_Y) + #define JOY_Y(N) (16383 - (N)) + #else + #define JOY_Y(N) (N) + #endif +#endif +#if HAS_JOY_ADC_Z + temp_info_t Joystick::z; // = { 0 } + #if ENABLED(INVERT_JOY_Z) + #define JOY_Z(N) (16383 - (N)) + #else + #define JOY_Z(N) (N) + #endif +#endif + +#if ENABLED(JOYSTICK_DEBUG) + void Joystick::report() { + SERIAL_ECHOPGM("Joystick"); + #if HAS_JOY_ADC_X + SERIAL_ECHOPAIR_P(SP_X_STR, JOY_X(x.raw)); + #endif + #if HAS_JOY_ADC_Y + SERIAL_ECHOPAIR_P(SP_Y_STR, JOY_Y(y.raw)); + #endif + #if HAS_JOY_ADC_Z + SERIAL_ECHOPAIR_P(SP_Z_STR, JOY_Z(z.raw)); + #endif + #if HAS_JOY_ADC_EN + SERIAL_ECHO_TERNARY(READ(JOY_EN_PIN), " EN=", "HIGH (dis", "LOW (en", "abled)"); + #endif + SERIAL_EOL(); + } +#endif + +#if HAS_JOY_ADC_X || HAS_JOY_ADC_Y || HAS_JOY_ADC_Z + + void Joystick::calculate(xyz_float_t &norm_jog) { + // Do nothing if enable pin (active-low) is not LOW + #if HAS_JOY_ADC_EN + if (READ(JOY_EN_PIN)) return; + #endif + + auto _normalize_joy = [](float &axis_jog, const int16_t raw, const int16_t (&joy_limits)[4]) { + if (WITHIN(raw, joy_limits[0], joy_limits[3])) { + // within limits, check deadzone + if (raw > joy_limits[2]) + axis_jog = (raw - joy_limits[2]) / float(joy_limits[3] - joy_limits[2]); + else if (raw < joy_limits[1]) + axis_jog = (raw - joy_limits[1]) / float(joy_limits[1] - joy_limits[0]); // negative value + // Map normal to jog value via quadratic relationship + axis_jog = SIGN(axis_jog) * sq(axis_jog); + } + }; + + #if HAS_JOY_ADC_X + static constexpr int16_t joy_x_limits[4] = JOY_X_LIMITS; + _normalize_joy(norm_jog.x, JOY_X(x.raw), joy_x_limits); + #endif + #if HAS_JOY_ADC_Y + static constexpr int16_t joy_y_limits[4] = JOY_Y_LIMITS; + _normalize_joy(norm_jog.y, JOY_Y(y.raw), joy_y_limits); + #endif + #if HAS_JOY_ADC_Z + static constexpr int16_t joy_z_limits[4] = JOY_Z_LIMITS; + _normalize_joy(norm_jog.z, JOY_Z(z.raw), joy_z_limits); + #endif + } + +#endif + +#if ENABLED(POLL_JOG) + + void Joystick::inject_jog_moves() { + // Recursion barrier + static bool injecting_now; // = false; + if (injecting_now) return; + + static constexpr int QUEUE_DEPTH = 5; // Insert up to this many movements + static constexpr float target_lag = 0.25f, // Aim for 1/4 second lag + seg_time = target_lag / QUEUE_DEPTH; // 0.05 seconds, short segments inserted every 1/20th of a second + static constexpr millis_t timer_limit_ms = millis_t(seg_time * 500); // 25 ms minimum delay between insertions + + // The planner can merge/collapse small moves, so the movement queue is unreliable to control the lag + static millis_t next_run = 0; + if (PENDING(millis(), next_run)) return; + next_run = millis() + timer_limit_ms; + + // Only inject a command if the planner has fewer than 5 moves and there are no unparsed commands + if (planner.movesplanned() >= QUEUE_DEPTH || queue.has_commands_queued()) + return; + + // Normalized jog values are 0 for no movement and -1 or +1 for as max feedrate (nonlinear relationship) + // Jog are initialized to zero and handling input can update values but doesn't have to + // You could use a two-axis joystick and a one-axis keypad and they might work together + xyz_float_t norm_jog{0}; + + // Use ADC values and defined limits. The active zone is normalized: -1..0 (dead) 0..1 + #if HAS_JOY_ADC_X || HAS_JOY_ADC_Y || HAS_JOY_ADC_Z + joystick.calculate(norm_jog); + #endif + + // Other non-joystick poll-based jogging could be implemented here + // with "jogging" encapsulated as a more general class. + + TERN_(EXTENSIBLE_UI, ExtUI::_joystick_update(norm_jog)); + + // norm_jog values of [-1 .. 1] maps linearly to [-feedrate .. feedrate] + xyz_float_t move_dist{0}; + float hypot2 = 0; + LOOP_XYZ(i) if (norm_jog[i]) { + move_dist[i] = seg_time * norm_jog[i] * + #if ENABLED(EXTENSIBLE_UI) + manual_feedrate_mm_s[i]; + #else + planner.settings.max_feedrate_mm_s[i]; + #endif + hypot2 += sq(move_dist[i]); + } + + if (!UNEAR_ZERO(hypot2)) { + current_position += move_dist; + apply_motion_limits(current_position); + const float length = sqrt(hypot2); + injecting_now = true; + planner.buffer_line(current_position, length / seg_time, active_extruder, length); + injecting_now = false; + } + } + +#endif // POLL_JOG + +#endif // JOYSTICK diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h new file mode 100644 index 00000000..1d25a30c --- /dev/null +++ b/Marlin/src/feature/joystick.h @@ -0,0 +1,45 @@ +/** + * 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 + +/** + * joystick.h - joystick input / jogging + */ + +#include "../inc/MarlinConfigPre.h" +#include "../core/types.h" +#include "../core/macros.h" +#include "../module/temperature.h" + +class Joystick { + friend class Temperature; + private: + TERN_(HAS_JOY_ADC_X, static temp_info_t x); + TERN_(HAS_JOY_ADC_Y, static temp_info_t y); + TERN_(HAS_JOY_ADC_Z, static temp_info_t z); + public: + TERN_(JOYSTICK_DEBUG, static void report()); + static void calculate(xyz_float_t &norm_jog); + static void inject_jog_moves(); +}; + +extern Joystick joystick; diff --git a/Marlin/src/feature/leds/blinkm.cpp b/Marlin/src/feature/leds/blinkm.cpp new file mode 100644 index 00000000..868eb4b3 --- /dev/null +++ b/Marlin/src/feature/leds/blinkm.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 . + * + */ + +/** + * blinkm.cpp - Control a BlinkM over i2c + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(BLINKM) + +#include "blinkm.h" +#include "leds.h" +#include + +void blinkm_set_led_color(const LEDColor &color) { + Wire.begin(); + Wire.beginTransmission(I2C_ADDRESS(0x09)); + Wire.write('o'); //to disable ongoing script, only needs to be used once + Wire.write('n'); + Wire.write(color.r); + Wire.write(color.g); + Wire.write(color.b); + Wire.endTransmission(); +} + +#endif // BLINKM diff --git a/Marlin/src/feature/leds/blinkm.h b/Marlin/src/feature/leds/blinkm.h new file mode 100644 index 00000000..29a9e784 --- /dev/null +++ b/Marlin/src/feature/leds/blinkm.h @@ -0,0 +1,31 @@ +/** + * 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 + +/** + * blinkm.h - Control a BlinkM over i2c + */ + +struct LEDColor; +typedef LEDColor LEDColor; + +void blinkm_set_led_color(const LEDColor &color); diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp new file mode 100644 index 00000000..ef9099fb --- /dev/null +++ b/Marlin/src/feature/leds/leds.cpp @@ -0,0 +1,200 @@ +/** + * 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 . + * + */ + +/** + * leds.cpp - Marlin RGB LED general support + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_COLOR_LEDS + +#include "leds.h" + +#if ENABLED(BLINKM) + #include "blinkm.h" +#endif + +#if ENABLED(PCA9632) + #include "pca9632.h" +#endif + +#if ENABLED(PCA9533) + #include "pca9533.h" +#endif + +#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 + ); +#endif + +#if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) + LEDColor LEDLights::color; + bool LEDLights::lights_on; +#endif + +LEDLights leds; + +void LEDLights::setup() { + #if EITHER(RGB_LED, RGBW_LED) + if (PWM_PIN(RGB_LED_R_PIN)) SET_PWM(RGB_LED_R_PIN); else SET_OUTPUT(RGB_LED_R_PIN); + if (PWM_PIN(RGB_LED_G_PIN)) SET_PWM(RGB_LED_G_PIN); else SET_OUTPUT(RGB_LED_G_PIN); + if (PWM_PIN(RGB_LED_B_PIN)) SET_PWM(RGB_LED_B_PIN); else SET_OUTPUT(RGB_LED_B_PIN); + #if ENABLED(RGBW_LED) + if (PWM_PIN(RGB_LED_W_PIN)) SET_PWM(RGB_LED_W_PIN); else SET_OUTPUT(RGB_LED_W_PIN); + #endif + #endif + TERN_(NEOPIXEL_LED, neo.init()); + TERN_(PCA9533, PCA9533_init()); + TERN_(LED_USER_PRESET_STARTUP, set_default()); +} + +void LEDLights::set_color(const LEDColor &incol + #if ENABLED(NEOPIXEL_LED) + , bool isSequence/*=false*/ + #endif +) { + + #if ENABLED(NEOPIXEL_LED) + + const uint32_t neocolor = LEDColorWhite() == incol + ? neo.Color(NEO_WHITE) + : neo.Color(incol.r, incol.g, incol.b, incol.w); + static uint16_t nextLed = 0; + + #ifdef NEOPIXEL_BKGD_LED_INDEX + if (NEOPIXEL_BKGD_LED_INDEX == nextLed) { + if (++nextLed >= neo.pixels()) nextLed = 0; + return; + } + #endif + + neo.set_brightness(incol.i); + + if (isSequence) { + neo.set_pixel_color(nextLed, neocolor); + neo.show(); + if (++nextLed >= neo.pixels()) nextLed = 0; + return; + } + + neo.set_color(neocolor); + + #endif + + #if ENABLED(BLINKM) + + // This variant uses i2c to send the RGB components to the device. + blinkm_set_led_color(incol); + + #endif + + #if EITHER(RGB_LED, RGBW_LED) + + // 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)) \ + 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); + #if ENABLED(RGBW_LED) + UPDATE_RGBW(W,w); + #endif + + #endif + + // 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 + lights_on = !incol.is_off(); + if (lights_on) color = incol; + #endif +} + +#if ENABLED(LED_CONTROL_MENU) + void LEDLights::toggle() { if (lights_on) set_off(); else update(); } +#endif + +#ifdef LED_BACKLIGHT_TIMEOUT + + millis_t LEDLights::led_off_time; // = 0 + + void LEDLights::update_timeout(const bool power_on) { + const millis_t ms = millis(); + if (power_on) + reset_timeout(ms); + else if (ELAPSED(ms, led_off_time)) + set_off(); + } + +#endif + +#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); + + #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 + +#endif // HAS_COLOR_LEDS diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h new file mode 100644 index 00000000..055ea0df --- /dev/null +++ b/Marlin/src/feature/leds/leds.h @@ -0,0 +1,253 @@ +/** + * 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 + +/** + * leds.h - Marlin general RGB LED support + */ + +#include "../../inc/MarlinConfigPre.h" + +#include + +#if ENABLED(NEOPIXEL_LED) + #include "neopixel.h" +#endif + +// A white component can be passed +#if EITHER(RGBW_LED, NEOPIXEL_LED) + #define HAS_WHITE_LED 1 +#endif + +/** + * LEDcolor type for use with leds.set_color + */ +typedef struct LEDColor { + uint8_t r, g, b + #if HAS_WHITE_LED + , w + #if ENABLED(NEOPIXEL_LED) + , i + #endif + #endif + ; + + LEDColor() : r(255), g(255), b(255) + #if HAS_WHITE_LED + , w(255) + #if ENABLED(NEOPIXEL_LED) + , i(NEOPIXEL_BRIGHTNESS) + #endif + #endif + {} + + LEDColor(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 + ) : r(r), g(g), b(b) + #if HAS_WHITE_LED + , w(w) + #if ENABLED(NEOPIXEL_LED) + , i(i) + #endif + #endif + {} + + LEDColor(const uint8_t (&rgbw)[4]) : r(rgbw[0]), g(rgbw[1]), b(rgbw[2]) + #if HAS_WHITE_LED + , w(rgbw[3]) + #if ENABLED(NEOPIXEL_LED) + , i(NEOPIXEL_BRIGHTNESS) + #endif + #endif + {} + + LEDColor& operator=(const uint8_t (&rgbw)[4]) { + r = rgbw[0]; g = rgbw[1]; b = rgbw[2]; + TERN_(HAS_WHITE_LED, w = rgbw[3]); + return *this; + } + + LEDColor& operator=(const LEDColor &right) { + if (this != &right) memcpy(this, &right, sizeof(LEDColor)); + return *this; + } + + bool operator==(const LEDColor &right) { + if (this == &right) return true; + return 0 == memcmp(this, &right, sizeof(LEDColor)); + } + + bool operator!=(const LEDColor &right) { return !operator==(right); } + + bool is_off() const { + return 3 > r + g + b + TERN0(HAS_WHITE_LED, w); + } +} LEDColor; + +/** + * Color helpers and presets + */ +#if HAS_WHITE_LED + #if ENABLED(NEOPIXEL_LED) + #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B, W, I) + #else + #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B, W) + #endif +#else + #define MakeLEDColor(R,G,B,W,I) LEDColor(R, G, B) +#endif + +#define LEDColorOff() LEDColor( 0, 0, 0) +#define LEDColorRed() LEDColor(255, 0, 0) +#if ENABLED(LED_COLORS_REDUCE_GREEN) + #define LEDColorOrange() LEDColor(255, 25, 0) + #define LEDColorYellow() LEDColor(255, 75, 0) +#else + #define LEDColorOrange() LEDColor(255, 80, 0) + #define LEDColorYellow() LEDColor(255, 255, 0) +#endif +#define LEDColorGreen() LEDColor( 0, 255, 0) +#define LEDColorBlue() LEDColor( 0, 0, 255) +#define LEDColorIndigo() LEDColor( 0, 255, 255) +#define LEDColorViolet() LEDColor(255, 0, 255) +#if HAS_WHITE_LED && DISABLED(RGB_LED) + #define LEDColorWhite() LEDColor( 0, 0, 0, 255) +#else + #define LEDColorWhite() LEDColor(255, 255, 255) +#endif + +class LEDLights { +public: + LEDLights() {} // ctor + + static void setup(); // init() + + static void set_color(const LEDColor &color + #if ENABLED(NEOPIXEL_LED) + , bool isSequence=false + #endif + ); + + static inline void set_color(uint8_t r, uint8_t g, uint8_t b + #if HAS_WHITE_LED + , uint8_t w=0 + #endif + #if ENABLED(NEOPIXEL_LED) + , uint8_t i=NEOPIXEL_BRIGHTNESS + , bool isSequence=false + #endif + ) { + set_color(MakeLEDColor(r, g, b, w, i) + #if ENABLED(NEOPIXEL_LED) + , isSequence + #endif + ); + } + + 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(LED_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(PRINTER_EVENT_LEDS) + static inline LEDColor get_color() { return lights_on ? color : LEDColorOff(); } + #endif + + #if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) + static LEDColor color; // last non-off color + static bool lights_on; // the last set color was "on" + #endif + + #if ENABLED(LED_CONTROL_MENU) + static void toggle(); // swap "off" with color + static inline void update() { set_color(color); } + #endif + + #ifdef LED_BACKLIGHT_TIMEOUT + private: + static millis_t led_off_time; + public: + static inline void reset_timeout(const millis_t &ms) { + led_off_time = ms + LED_BACKLIGHT_TIMEOUT; + if (!lights_on) set_default(); + } + static void update_timeout(const bool power_on); + #endif +}; + +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(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 + 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 new file mode 100644 index 00000000..27bbeb34 --- /dev/null +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -0,0 +1,172 @@ +/** + * 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 . + * + */ + +/** + * Marlin RGB LED general support + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(NEOPIXEL_LED) + +#include "neopixel.h" + +#if EITHER(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) + #include "../../core/utility.h" +#endif + +Marlin_NeoPixel neo; +int8_t Marlin_NeoPixel::neoindex; + +Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) + #if CONJOINED_NEOPIXEL + , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) + #endif +; + +#ifdef NEOPIXEL_BKGD_LED_INDEX + + void Marlin_NeoPixel::set_color_background() { + uint8_t background_color[4] = NEOPIXEL_BKGD_COLOR; + set_pixel_color(NEOPIXEL_BKGD_LED_INDEX, adaneo1.Color(background_color[0], background_color[1], background_color[2], background_color[3])); + } + +#endif + +void Marlin_NeoPixel::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) { + #ifdef NEOPIXEL_BKGD_LED_INDEX + if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { + set_color_background(); + continue; + } + #endif + set_pixel_color(i, color); + } + } + show(); +} + +void Marlin_NeoPixel::set_color_startup(const uint32_t color) { + for (uint16_t i = 0; i < pixels(); ++i) + set_pixel_color(i, color); + show(); +} + +void Marlin_NeoPixel::init() { + 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(500); + 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 + set_color_background(); + #endif + + #if ENABLED(LED_USER_PRESET_STARTUP) + set_color(adaneo1.Color(LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE)); + #else + set_color(adaneo1.Color(0, 0, 0, 0)); + #endif +} + +#if 0 +bool Marlin_NeoPixel::set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p) { + const uint32_t color = adaneo1.Color(r, g, b, w); + set_brightness(p); + #if DISABLED(NEOPIXEL_IS_SEQUENTIAL) + set_color(color); + return false; + #else + static uint16_t nextLed = 0; + set_pixel_color(nextLed, color); + show(); + if (++nextLed >= pixels()) nextLed = 0; + return true; + #endif +} +#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 new file mode 100644 index 00000000..42046fa5 --- /dev/null +++ b/Marlin/src/feature/leds/neopixel.h @@ -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 . + * + */ +#pragma once + +/** + * NeoPixel support + */ + +// ------------------------ +// Includes +// ------------------------ + +#include "../../inc/MarlinConfig.h" + +#include +#include + +// ------------------------ +// Defines +// ------------------------ + +#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 + #define NEOPIXEL_IS_RGBW 1 +#endif + +#if NEOPIXEL_IS_RGB + #define NEO_WHITE 255, 255, 255, 0 +#else + #define NEO_WHITE 0, 0, 0, 255 +#endif + +// ------------------------ +// Function prototypes +// ------------------------ + +class Marlin_NeoPixel { +private: + static Adafruit_NeoPixel adaneo1 + #if CONJOINED_NEOPIXEL + , adaneo2 + #endif + ; + +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); + + #ifdef NEOPIXEL_BKGD_LED_INDEX + static void set_color_background(); + #endif + + static inline void begin() { + adaneo1.begin(); + TERN_(CONJOINED_NEOPIXEL, adaneo2.begin()); + } + + static inline void set_pixel_color(const uint16_t n, const uint32_t 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); + #if MULTIPLE_NEOPIXEL_TYPES + adaneo2.setPixelColor(n, c); + #endif + #endif + } + + static inline void set_brightness(const uint8_t b) { + adaneo1.setBrightness(b); + TERN_(CONJOINED_NEOPIXEL, adaneo2.setBrightness(b)); + } + + static inline void show() { + adaneo1.show(); + #if PIN_EXISTS(NEOPIXEL2) + #if CONJOINED_NEOPIXEL + adaneo2.show(); + #else + TERN(NEOPIXEL2_SEPARATE,,adaneo1.setPin(NEOPIXEL2_PIN)); + adaneo1.show(); + adaneo1.setPin(NEOPIXEL_PIN); + #endif + #endif + } + + #if 0 + bool set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); + #endif + + // Accessors + 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); + } +}; + +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(); + adaneo.setPin(NEOPIXEL2_PIN); + } + + // 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/feature/leds/pca9533.cpp b/Marlin/src/feature/leds/pca9533.cpp new file mode 100644 index 00000000..0fd4d667 --- /dev/null +++ b/Marlin/src/feature/leds/pca9533.cpp @@ -0,0 +1,127 @@ +/* + * 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 . + * + */ + +/** + * PCA9533 LED controller driver (MightyBoard, FlashForge Creator Pro, etc.) + * by @grauerfuchs - 1 Apr 2020 + */ +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PCA9533) + +#include "pca9533.h" +#include + +void PCA9533_init() { + Wire.begin(); + PCA9533_reset(); +} + +static void PCA9533_writeAllRegisters(uint8_t psc0, uint8_t pwm0, uint8_t psc1, uint8_t pwm1, uint8_t ls0){ + uint8_t data[6] = { PCA9533_REG_PSC0 | PCA9533_REGM_AI, psc0, pwm0, psc1, pwm1, ls0 }; + Wire.beginTransmission(PCA9533_Addr >> 1); + Wire.write(data, 6); + Wire.endTransmission(); + delayMicroseconds(1); +} + +static void PCA9533_writeRegister(uint8_t reg, uint8_t val){ + uint8_t data[2] = { reg, val }; + Wire.beginTransmission(PCA9533_Addr >> 1); + Wire.write(data, 2); + Wire.endTransmission(); + delayMicroseconds(1); +} + +// Reset (clear) all registers +void PCA9533_reset() { + PCA9533_writeAllRegisters(0, 0, 0, 0, 0); +} + +// Turn all LEDs off +void PCA9533_setOff() { + PCA9533_writeRegister(PCA9533_REG_SEL, 0); +} + +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 + + uint8_t op_g = 0, op_r = 0, op_b = 0; // Opcodes - Green, Red, Blue + + // Light theory! GREEN takes priority because + // it's the most visible to the human eye. + if (green == 0) op_g = PCA9533_LED_OP_OFF; + else if (green == 255) op_g = PCA9533_LED_OP_ON; + else { r_pwm0 = green; op_g = PCA9533_LED_OP_PWM0; } + + // RED + if (red == 0) op_r = PCA9533_LED_OP_OFF; + else if (red == 255) op_r = PCA9533_LED_OP_ON; + else if (r_pwm0 == 0 || r_pwm0 == red) { + r_pwm0 = red; op_r = PCA9533_LED_OP_PWM0; + } + else { + r_pwm1 = red; op_r = PCA9533_LED_OP_PWM1; + } + + // BLUE + if (blue == 0) op_b = PCA9533_LED_OP_OFF; + else if (blue == 255) op_b = PCA9533_LED_OP_ON; + else if (r_pwm0 == 0 || r_pwm0 == blue) { + r_pwm0 = blue; op_b = PCA9533_LED_OP_PWM0; + } + else if (r_pwm1 == 0 || r_pwm1 == blue) { + r_pwm1 = blue; op_b = PCA9533_LED_OP_PWM1; + } + else { + /** + * Conflict. 3 values are requested but only 2 channels exist. + * G is on channel 0 and R is on channel 1, so work from there. + * Find the closest match, average the values, then use the free channel. + */ + uint8_t dgb = ABS(green - blue), + dgr = ABS(green - red), + dbr = ABS(blue - red); + if (dgb < dgr && dgb < dbr) { // Mix with G on channel 0. + op_b = PCA9533_LED_OP_PWM0; + r_pwm0 = uint8_t(((uint16_t)green + (uint16_t)blue) / 2); + } + else if (dbr <= dgr && dbr <= dgb) { // Mix with R on channel 1. + op_b = PCA9533_LED_OP_PWM1; + r_pwm1 = uint8_t(((uint16_t)red + (uint16_t)blue) / 2); + } + else { // Mix R+G on 0 and put B on 1. + op_r = PCA9533_LED_OP_PWM0; + r_pwm0 = uint8_t(((uint16_t)green + (uint16_t)red) / 2); + op_b = PCA9533_LED_OP_PWM1; + r_pwm1 = blue; + } + } + + // Write the changes to the hardware + PCA9533_writeAllRegisters(0, r_pwm0, 0, r_pwm1, + (op_g << PCA9533_LED_OFS_GRN) | (op_r << PCA9533_LED_OFS_RED) | (op_b << PCA9533_LED_OFS_BLU) + ); +} + +#endif // PCA9533 diff --git a/Marlin/src/feature/leds/pca9533.h b/Marlin/src/feature/leds/pca9533.h new file mode 100644 index 00000000..431058c4 --- /dev/null +++ b/Marlin/src/feature/leds/pca9533.h @@ -0,0 +1,59 @@ +/* + * 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 + +/* + * Driver for the PCA9533 LED controller found on the MightyBoard + * used by FlashForge Creator Pro, MakerBot, etc. + * Written 2020 APR 01 by grauerfuchs + */ +#include + +#define ENABLE_I2C_PULLUPS + +// Chip address (for Wire) +#define PCA9533_Addr 0xC4 + +// Control registers +#define PCA9533_REG_READ 0x00 +#define PCA9533_REG_PSC0 0x01 +#define PCA9533_REG_PWM0 0x02 +#define PCA9533_REG_PSC1 0x03 +#define PCA9533_REG_PWM1 0x04 +#define PCA9533_REG_SEL 0x05 +#define PCA9533_REGM_AI 0x10 + +// LED selector operation +#define PCA9533_LED_OP_OFF 0B00 +#define PCA9533_LED_OP_ON 0B01 +#define PCA9533_LED_OP_PWM0 0B10 +#define PCA9533_LED_OP_PWM1 0B11 + +// Select register bit offsets for LED colors +#define PCA9533_LED_OFS_RED 0 +#define PCA9533_LED_OFS_GRN 2 +#define PCA9533_LED_OFS_BLU 4 + +void PCA9533_init(); +void PCA9533_reset(); +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 new file mode 100644 index 00000000..d8af31cb --- /dev/null +++ b/Marlin/src/feature/leds/pca9632.cpp @@ -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 . + * + */ + +/** + * Driver for the Philips PCA9632 LED driver. + * Written by Robert Mendon Feb 2017. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PCA9632) + +#include "pca9632.h" +#include "leds.h" +#include + +#define PCA9632_MODE1_VALUE 0b00000001 //(ALLCALL) +#define PCA9632_MODE2_VALUE 0b00010101 //(DIMMING, INVERT, CHANGE ON STOP,TOTEM) +#define PCA9632_LEDOUT_VALUE 0b00101010 + +/* Register addresses */ +#define PCA9632_MODE1 0x00 +#define PCA9632_MODE2 0x01 +#define PCA9632_PWM0 0x02 +#define PCA9632_PWM1 0x03 +#define PCA9632_PWM2 0x04 +#define PCA9632_PWM3 0x05 +#define PCA9632_GRPPWM 0x06 +#define PCA9632_GRPFREQ 0x07 +#define PCA9632_LEDOUT 0x08 +#define PCA9632_SUBADR1 0x09 +#define PCA9632_SUBADR2 0x0A +#define PCA9632_SUBADR3 0x0B +#define PCA9632_ALLCALLADDR 0x0C + +#define PCA9632_NO_AUTOINC 0x00 +#define PCA9632_AUTO_ALL 0x80 +#define PCA9632_AUTO_IND 0xA0 +#define PCA9632_AUTOGLO 0xC0 +#define PCA9632_AUTOGI 0xE0 + +// Red=LED0 Green=LED1 Blue=LED2 +#ifndef PCA9632_RED + #define PCA9632_RED 0x00 +#endif +#ifndef PCA9632_GRN + #define PCA9632_GRN 0x02 +#endif +#ifndef PCA9632_BLU + #define PCA9632_BLU 0x04 +#endif + +// If any of the color indexes are greater than 0x04 they can't use auto increment +#if !defined(PCA9632_NO_AUTO_INC) && (PCA9632_RED > 0x04 || PCA9632_GRN > 0x04 || PCA9632_BLU > 0x04) + #define PCA9632_NO_AUTO_INC +#endif + +#define LED_OFF 0x00 +#define LED_ON 0x01 +#define LED_PWM 0x02 + +#define PCA9632_ADDRESS 0b01100000 + +byte PCA_init = 0; + +static void PCA9632_WriteRegister(const byte addr, const byte regadd, const byte value) { + Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.write(regadd); + Wire.write(value); + Wire.endTransmission(); +} + +static void PCA9632_WriteAllRegisters(const byte addr, const byte regadd, const byte vr, const byte vg, const byte vb) { + #if DISABLED(PCA9632_NO_AUTO_INC) + uint8_t data[4], len = 4; + data[0] = PCA9632_AUTO_IND | regadd; + data[1 + (PCA9632_RED >> 1)] = vr; + data[1 + (PCA9632_GRN >> 1)] = vg; + data[1 + (PCA9632_BLU >> 1)] = vb; + #else + uint8_t data[6], len = 6; + data[0] = regadd + (PCA9632_RED >> 1); + data[1] = vr; + data[2] = regadd + (PCA9632_GRN >> 1); + data[3] = vg; + data[4] = regadd + (PCA9632_BLU >> 1); + data[5] = vb; + #endif + Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.write(data, len); + Wire.endTransmission(); +} + +#if 0 + static byte PCA9632_ReadRegister(const byte addr, const byte regadd) { + Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.write(regadd); + const byte value = Wire.read(); + Wire.endTransmission(); + return value; + } +#endif + +void PCA9632_set_led_color(const LEDColor &color) { + Wire.begin(); + if (!PCA_init) { + PCA_init = 1; + PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_MODE1, PCA9632_MODE1_VALUE); + PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_MODE2, PCA9632_MODE2_VALUE); + } + + const byte LEDOUT = (color.r ? LED_PWM << PCA9632_RED : 0) + | (color.g ? LED_PWM << PCA9632_GRN : 0) + | (color.b ? LED_PWM << PCA9632_BLU : 0); + + PCA9632_WriteAllRegisters(PCA9632_ADDRESS,PCA9632_PWM0, color.r, color.g, color.b); + PCA9632_WriteRegister(PCA9632_ADDRESS,PCA9632_LEDOUT, LEDOUT); +} + +#if ENABLED(PCA9632_BUZZER) + + 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)); + Wire.endTransmission(); + } + +#endif // PCA9632_BUZZER + +#endif // PCA9632 diff --git a/Marlin/src/feature/leds/pca9632.h b/Marlin/src/feature/leds/pca9632.h new file mode 100644 index 00000000..fb59a8c1 --- /dev/null +++ b/Marlin/src/feature/leds/pca9632.h @@ -0,0 +1,37 @@ +/** + * 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 + +/** + * Driver for the Philips PCA9632 LED driver. + * Written by Robert Mendon Feb 2017. + */ + +struct LEDColor; +typedef LEDColor LEDColor; + +void PCA9632_set_led_color(const LEDColor &color); + +#if ENABLED(PCA9632_BUZZER) + #include + void PCA9632_buzz(const long, const uint16_t); +#endif diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp new file mode 100644 index 00000000..31c628c2 --- /dev/null +++ b/Marlin/src/feature/leds/printer_event_leds.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 . + * + */ + +/** + * feature/leds/printer_event_leds.cpp - LED color changing based on printer status + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(PRINTER_EVENT_LEDS) + +#include "printer_event_leds.h" + +PrinterEventLEDs printerEventLEDs; + +#if HAS_LEDS_OFF_FLAG + bool PrinterEventLEDs::leds_off_after_print; // = false +#endif + +#if HAS_TEMP_HOTEND || HAS_HEATED_BED + + uint8_t PrinterEventLEDs::old_intensity = 0; + + inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) { + return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f); + } + + inline void pel_set_rgb(const uint8_t r, const uint8_t g, const uint8_t b) { + leds.set_color( + MakeLEDColor(r, g, b, 0, neo.brightness()) + #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) + , true + #endif + ); + } + +#endif + +#if HAS_TEMP_HOTEND + + void PrinterEventLEDs::onHotendHeating(const float &start, const float ¤t, const float &target) { + const uint8_t blue = pel_intensity(start, current, target); + if (blue != old_intensity) { + old_intensity = blue; + pel_set_rgb(255, 0, 255 - blue); + } + } + +#endif + +#if HAS_HEATED_BED + + void PrinterEventLEDs::onBedHeating(const float &start, const float ¤t, const float &target) { + const uint8_t red = pel_intensity(start, current, target); + if (red != old_intensity) { + old_intensity = red; + pel_set_rgb(red, 0, 255); + } + } +#endif + +#endif // PRINTER_EVENT_LEDS diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h new file mode 100644 index 00000000..86ec292a --- /dev/null +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -0,0 +1,87 @@ +/** + * 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 + +/** + * feature/leds/printer_event_leds.h - LED color changing based on printer status + */ + +#include "leds.h" +#include "../../inc/MarlinConfig.h" + +class PrinterEventLEDs { +private: + static uint8_t old_intensity; + + #if HAS_LEDS_OFF_FLAG + static bool leds_off_after_print; + #endif + + static inline void set_done() { + #if ENABLED(LED_COLOR_PRESETS) + leds.set_default(); + #else + leds.set_off(); + #endif + } + +public: + #if HAS_TEMP_HOTEND + static inline LEDColor onHotendHeatingStart() { old_intensity = 0; return leds.get_color(); } + static void onHotendHeating(const float &start, const float ¤t, const float &target); + #endif + + #if HAS_HEATED_BED + static inline LEDColor onBedHeatingStart() { old_intensity = 127; return leds.get_color(); } + static void onBedHeating(const float &start, const float ¤t, const float &target); + #endif + + #if HAS_TEMP_HOTEND || HAS_HEATED_BED + static inline void onHeatingDone() { leds.set_white(); } + static inline void onPidTuningDone(LEDColor c) { leds.set_color(c); } + #endif + + #if ENABLED(SDSUPPORT) + + static inline void onPrintCompleted() { + leds.set_green(); + #if HAS_LEDS_OFF_FLAG + leds_off_after_print = true; + #else + safe_delay(2000); + set_done(); + #endif + } + + static inline void onResumeAfterWait() { + #if HAS_LEDS_OFF_FLAG + if (leds_off_after_print) { + set_done(); + leds_off_after_print = false; + } + #endif + } + + #endif // SDSUPPORT +}; + +extern PrinterEventLEDs printerEventLEDs; diff --git a/Marlin/src/feature/leds/tempstat.cpp b/Marlin/src/feature/leds/tempstat.cpp new file mode 100644 index 00000000..880258f8 --- /dev/null +++ b/Marlin/src/feature/leds/tempstat.cpp @@ -0,0 +1,55 @@ +/** + * 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 . + * + */ + +/** + * Marlin RGB LED general support + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(TEMP_STAT_LEDS) + +#include "tempstat.h" +#include "../../module/temperature.h" + +void handle_status_leds() { + static int8_t old_red = -1; // Invalid value to force LED initialization + static millis_t next_status_led_update_ms = 0; + if (ELAPSED(millis(), next_status_led_update_ms)) { + next_status_led_update_ms += 500; // Update every 0.5s + float max_temp = TERN0(HAS_HEATED_BED, _MAX(thermalManager.degTargetBed(), thermalManager.degBed())); + HOTEND_LOOP() + max_temp = _MAX(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); + const int8_t new_red = (max_temp > 55.0) ? HIGH : (max_temp < 54.0 || old_red < 0) ? LOW : old_red; + if (new_red != old_red) { + old_red = new_red; + #if PIN_EXISTS(STAT_LED_RED) + WRITE(STAT_LED_RED_PIN, new_red); + #endif + #if PIN_EXISTS(STAT_LED_BLUE) + WRITE(STAT_LED_BLUE_PIN, !new_red); + #endif + } + } +} + +#endif // TEMP_STAT_LEDS diff --git a/Marlin/src/feature/leds/tempstat.h b/Marlin/src/feature/leds/tempstat.h new file mode 100644 index 00000000..a8b919bd --- /dev/null +++ b/Marlin/src/feature/leds/tempstat.h @@ -0,0 +1,28 @@ +/** + * 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 + +/** + * Marlin general RGB LED support + */ + +void handle_status_leds(); diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp new file mode 100644 index 00000000..ebcb5649 --- /dev/null +++ b/Marlin/src/feature/max7219.cpp @@ -0,0 +1,700 @@ +/** + * 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 . + * + */ + +/** + * This module is off by default, but can be enabled to facilitate the display of + * extra debug information during code development. + * + * Just connect up 5V and GND to give it power, then connect up the pins assigned + * in Configuration_adv.h. For example, on the Re-ARM you could use: + * + * #define MAX7219_CLK_PIN 77 + * #define MAX7219_DIN_PIN 78 + * #define MAX7219_LOAD_PIN 79 + * + * send() is called automatically at startup, and then there are a number of + * support functions available to control the LEDs in the 8x8 grid. + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(MAX7219_DEBUG) + +#define MAX7219_ERRORS // Disable to save 406 bytes of Program Memory + +#include "max7219.h" + +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../MarlinCore.h" +#include "../HAL/shared/Delay.h" + +#if ENABLED(MAX7219_SIDE_BY_SIDE) && MAX7219_NUMBER_UNITS > 1 + #define HAS_SIDE_BY_SIDE 1 +#endif + +#if _ROT == 0 || _ROT == 180 + #define MAX7219_X_LEDS TERN(HAS_SIDE_BY_SIDE, 8, MAX7219_LINES) + #define MAX7219_Y_LEDS TERN(HAS_SIDE_BY_SIDE, MAX7219_LINES, 8) +#elif _ROT == 90 || _ROT == 270 + #define MAX7219_X_LEDS TERN(HAS_SIDE_BY_SIDE, MAX7219_LINES, 8) + #define MAX7219_Y_LEDS TERN(HAS_SIDE_BY_SIDE, 8, MAX7219_LINES) +#else + #error "MAX7219_ROTATE must be a multiple of +/- 90°." +#endif + +Max7219 max7219; + +uint8_t Max7219::led_line[MAX7219_LINES]; // = { 0 }; +uint8_t Max7219::suspended; // = 0; + +#define LINE_REG(Q) (max7219_reg_digit0 + ((Q) & 0x7)) + +#if _ROT == 0 || _ROT == 270 + #define _LED_BIT(Q) (7 - ((Q) & 0x7)) +#else + #define _LED_BIT(Q) ((Q) & 0x7) +#endif +#if _ROT == 0 || _ROT == 180 + #define LED_BIT(X,Y) _LED_BIT(X) +#else + #define LED_BIT(X,Y) _LED_BIT(Y) +#endif +#if _ROT == 0 || _ROT == 90 + #define _LED_IND(P,Q) (_LED_TOP(P) + ((Q) & 0x7)) +#else + #define _LED_IND(P,Q) (_LED_TOP(P) + (7 - ((Q) & 0x7))) +#endif + +#if HAS_SIDE_BY_SIDE + #if (_ROT == 0 || _ROT == 90) == DISABLED(MAX7219_REVERSE_ORDER) + #define _LED_TOP(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) + #else + #define _LED_TOP(Q) ((Q) & ~0x7) + #endif + #if _ROT == 0 || _ROT == 180 + #define LED_IND(X,Y) _LED_IND(Y,Y) + #elif _ROT == 90 || _ROT == 270 + #define LED_IND(X,Y) _LED_IND(X,X) + #endif +#else + #if (_ROT == 0 || _ROT == 270) == DISABLED(MAX7219_REVERSE_ORDER) + #define _LED_TOP(Q) ((Q) & ~0x7) + #else + #define _LED_TOP(Q) ((MAX7219_NUMBER_UNITS - 1 - ((Q) >> 3)) << 3) + #endif + #if _ROT == 0 || _ROT == 180 + #define LED_IND(X,Y) _LED_IND(X,Y) + #elif _ROT == 90 || _ROT == 270 + #define LED_IND(X,Y) _LED_IND(Y,X) + #endif +#endif + +#define XOR_7219(X,Y) do{ led_line[LED_IND(X,Y)] ^= _BV(LED_BIT(X,Y)); }while(0) +#define SET_7219(X,Y) do{ led_line[LED_IND(X,Y)] |= _BV(LED_BIT(X,Y)); }while(0) +#define CLR_7219(X,Y) do{ led_line[LED_IND(X,Y)] &= ~_BV(LED_BIT(X,Y)); }while(0) +#define BIT_7219(X,Y) TEST(led_line[LED_IND(X,Y)], LED_BIT(X,Y)) + +#ifdef CPU_32_BIT + #define SIG_DELAY() DELAY_US(1) // Approximate a 1µs delay on 32-bit ARM + #undef CRITICAL_SECTION_START + #undef CRITICAL_SECTION_END + #define CRITICAL_SECTION_START() NOOP + #define CRITICAL_SECTION_END() NOOP +#else + #define SIG_DELAY() DELAY_NS(250) +#endif + +void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/*=-1*/) { + #if ENABLED(MAX7219_ERRORS) + SERIAL_ECHOPGM("??? Max7219::"); + serialprintPGM(func); + SERIAL_CHAR('('); + SERIAL_ECHO(v1); + if (v2 > 0) SERIAL_ECHOPAIR(", ", v2); + SERIAL_CHAR(')'); + SERIAL_EOL(); + #else + UNUSED(func); UNUSED(v1); UNUSED(v2); + #endif +} + +/** + * Flip the lowest n_bytes of the supplied bits: + * flipped(x, 1) flips the low 8 bits of x. + * flipped(x, 2) flips the low 16 bits of x. + * flipped(x, 3) flips the low 24 bits of x. + * flipped(x, 4) flips the low 32 bits of x. + */ +inline uint32_t flipped(const uint32_t bits, const uint8_t n_bytes) { + uint32_t mask = 1, outbits = 0; + LOOP_L_N(b, n_bytes * 8) { + outbits <<= 1; + if (bits & mask) outbits |= 1; + mask <<= 1; + } + return outbits; +} + +void Max7219::noop() { + CRITICAL_SECTION_START(); + SIG_DELAY(); + WRITE(MAX7219_DIN_PIN, LOW); + for (uint8_t i = 16; i--;) { + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, LOW); + SIG_DELAY(); + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, HIGH); + SIG_DELAY(); + } + CRITICAL_SECTION_END(); +} + +void Max7219::putbyte(uint8_t data) { + CRITICAL_SECTION_START(); + for (uint8_t i = 8; i--;) { + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, LOW); // tick + SIG_DELAY(); + WRITE(MAX7219_DIN_PIN, (data & 0x80) ? HIGH : LOW); // send 1 or 0 based on data bit + SIG_DELAY(); + WRITE(MAX7219_CLK_PIN, HIGH); // tock + SIG_DELAY(); + data <<= 1; + } + CRITICAL_SECTION_END(); +} + +void Max7219::pulse_load() { + SIG_DELAY(); + WRITE(MAX7219_LOAD_PIN, LOW); // tell the chip to load the data + SIG_DELAY(); + WRITE(MAX7219_LOAD_PIN, HIGH); + SIG_DELAY(); +} + +void Max7219::send(const uint8_t reg, const uint8_t data) { + SIG_DELAY(); + CRITICAL_SECTION_START(); + SIG_DELAY(); + putbyte(reg); // specify register + SIG_DELAY(); + putbyte(data); // put data + CRITICAL_SECTION_END(); +} + +// Send out a single native row of bits to just one unit +void Max7219::refresh_unit_line(const uint8_t line) { + if (suspended) return; + #if MAX7219_NUMBER_UNITS == 1 + send(LINE_REG(line), led_line[line]); + #else + for (uint8_t u = MAX7219_NUMBER_UNITS; u--;) + if (u == (line >> 3)) send(LINE_REG(line), led_line[line]); else noop(); + #endif + pulse_load(); +} + +// Send out a single native row of bits to all units +void Max7219::refresh_line(const uint8_t line) { + if (suspended) return; + #if MAX7219_NUMBER_UNITS == 1 + refresh_unit_line(line); + #else + for (uint8_t u = MAX7219_NUMBER_UNITS; u--;) + send(LINE_REG(line), led_line[(u << 3) | (line & 0x7)]); + #endif + pulse_load(); +} + +void Max7219::set(const uint8_t line, const uint8_t bits) { + led_line[line] = bits; + refresh_unit_line(line); +} + +#if ENABLED(MAX7219_NUMERIC) + + // Draw an integer with optional leading zeros and optional decimal point + void Max7219::print(const uint8_t start, int16_t value, uint8_t size, const bool leadzero=false, bool dec=false) { + if (suspended) return; + constexpr uint8_t led_numeral[10] = { 0x7E, 0x60, 0x6D, 0x79, 0x63, 0x5B, 0x5F, 0x70, 0x7F, 0x7A }, + led_decimal = 0x80, led_minus = 0x01; + bool blank = false, neg = value < 0; + if (neg) value *= -1; + while (size--) { + const bool minus = neg && blank; + if (minus) neg = false; + send( + max7219_reg_digit0 + start + size, + minus ? led_minus : blank ? 0x00 : led_numeral[value % 10] | (dec ? led_decimal : 0x00) + ); + pulse_load(); // tell the chips to load the clocked out data + value /= 10; + if (!value && !leadzero) blank = true; + dec = false; + } + } + + // Draw a float with a decimal point and optional digits + void Max7219::print(const uint8_t start, const float value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { + if (pre_size) print(start, value, pre_size, leadzero, !!post_size); + if (post_size) { + const int16_t after = ABS(value) * (10 ^ post_size); + print(start + pre_size, after, post_size, true); + } + } + +#endif // MAX7219_NUMERIC + +// Modify a single LED bit and send the changed line +void Max7219::led_set(const uint8_t x, const uint8_t y, const bool on) { + if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_set"), x, y); + if (BIT_7219(x, y) == on) return; + XOR_7219(x, y); + refresh_unit_line(LED_IND(x, y)); +} + +void Max7219::led_on(const uint8_t x, const uint8_t y) { + if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_on"), x, y); + led_set(x, y, true); +} + +void Max7219::led_off(const uint8_t x, const uint8_t y) { + if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_off"), x, y); + led_set(x, y, false); +} + +void Max7219::led_toggle(const uint8_t x, const uint8_t y) { + if (x >= MAX7219_X_LEDS || y >= MAX7219_Y_LEDS) return error(PSTR("led_toggle"), x, y); + led_set(x, y, !BIT_7219(x, y)); +} + +void Max7219::send_row(const uint8_t row) { + if (suspended) return; + #if _ROT == 0 || _ROT == 180 // Native Lines are horizontal too + #if MAX7219_X_LEDS <= 8 + refresh_unit_line(LED_IND(0, row)); // A single unit line + #else + refresh_line(LED_IND(0, row)); // Same line, all units + #endif + #else // Native lines are vertical + UNUSED(row); + refresh(); // Actually a column + #endif +} + +void Max7219::send_column(const uint8_t col) { + if (suspended) return; + #if _ROT == 90 || _ROT == 270 // Native Lines are vertical too + #if MAX7219_Y_LEDS <= 8 + refresh_unit_line(LED_IND(col, 0)); // A single unit line + #else + refresh_line(LED_IND(col, 0)); // Same line, all units + #endif + #else // Native lines are horizontal + UNUSED(col); + refresh(); // Actually a row + #endif +} + +void Max7219::clear() { + ZERO(led_line); + refresh(); +} + +void Max7219::fill() { + memset(led_line, 0xFF, sizeof(led_line)); + refresh(); +} + +void Max7219::clear_row(const uint8_t row) { + if (row >= MAX7219_Y_LEDS) return error(PSTR("clear_row"), row); + LOOP_L_N(x, MAX7219_X_LEDS) CLR_7219(x, row); + send_row(row); +} + +void Max7219::clear_column(const uint8_t col) { + if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); + LOOP_L_N(y, MAX7219_Y_LEDS) CLR_7219(col, y); + send_column(col); +} + +/** + * Plot the low order bits of val to the specified row of the matrix. + * With 4 Max7219 units in the chain, it's possible to set 32 bits at + * once with a single call to the function (if rotated 90° or 270°). + */ +void Max7219::set_row(const uint8_t row, const uint32_t val) { + if (row >= MAX7219_Y_LEDS) return error(PSTR("set_row"), row); + uint32_t mask = _BV32(MAX7219_X_LEDS - 1); + LOOP_L_N(x, MAX7219_X_LEDS) { + if (val & mask) SET_7219(x, row); else CLR_7219(x, row); + mask >>= 1; + } + send_row(row); +} + +/** + * Plot the low order bits of val to the specified column of the matrix. + * With 4 Max7219 units in the chain, it's possible to set 32 bits at + * once with a single call to the function (if rotated 0° or 180°). + */ +void Max7219::set_column(const uint8_t col, const uint32_t val) { + if (col >= MAX7219_X_LEDS) return error(PSTR("set_column"), col); + uint32_t mask = _BV32(MAX7219_Y_LEDS - 1); + LOOP_L_N(y, MAX7219_Y_LEDS) { + if (val & mask) SET_7219(col, y); else CLR_7219(col, y); + mask >>= 1; + } + send_column(col); +} + +void Max7219::set_rows_16bits(const uint8_t y, uint32_t val) { + #if MAX7219_X_LEDS == 8 + if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_16bits"), y, val); + set_row(y + 1, val); val >>= 8; + set_row(y + 0, val); + #else // at least 16 bits on each row + if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_16bits"), y, val); + set_row(y, val); + #endif +} + +void Max7219::set_rows_32bits(const uint8_t y, uint32_t val) { + #if MAX7219_X_LEDS == 8 + if (y > MAX7219_Y_LEDS - 4) return error(PSTR("set_rows_32bits"), y, val); + set_row(y + 3, val); val >>= 8; + set_row(y + 2, val); val >>= 8; + set_row(y + 1, val); val >>= 8; + set_row(y + 0, val); + #elif MAX7219_X_LEDS == 16 + if (y > MAX7219_Y_LEDS - 2) return error(PSTR("set_rows_32bits"), y, val); + set_row(y + 1, val); val >>= 16; + set_row(y + 0, val); + #else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits + if (y > MAX7219_Y_LEDS - 1) return error(PSTR("set_rows_32bits"), y, val); + set_row(y, val); + #endif +} + +void Max7219::set_columns_16bits(const uint8_t x, uint32_t val) { + #if MAX7219_Y_LEDS == 8 + if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_columns_16bits"), x, val); + set_column(x + 0, val); val >>= 8; + set_column(x + 1, val); + #else // at least 16 bits in each column + if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_columns_16bits"), x, val); + set_column(x, val); + #endif +} + +void Max7219::set_columns_32bits(const uint8_t x, uint32_t val) { + #if MAX7219_Y_LEDS == 8 + if (x > MAX7219_X_LEDS - 4) return error(PSTR("set_rows_32bits"), x, val); + set_column(x + 3, val); val >>= 8; + set_column(x + 2, val); val >>= 8; + set_column(x + 1, val); val >>= 8; + set_column(x + 0, val); + #elif MAX7219_Y_LEDS == 16 + if (x > MAX7219_X_LEDS - 2) return error(PSTR("set_rows_32bits"), x, val); + set_column(x + 1, val); val >>= 16; + set_column(x + 0, val); + #else // at least 24 bits on each row. In the 3 matrix case, just display the low 24 bits + if (x > MAX7219_X_LEDS - 1) return error(PSTR("set_rows_32bits"), x, val); + set_column(x, val); + #endif +} + +// Initialize the Max7219 +void Max7219::register_setup() { + LOOP_L_N(i, MAX7219_NUMBER_UNITS) + send(max7219_reg_scanLimit, 0x07); + pulse_load(); // Tell the chips to load the clocked out data + + LOOP_L_N(i, MAX7219_NUMBER_UNITS) + send(max7219_reg_decodeMode, 0x00); // Using an led matrix (not digits) + pulse_load(); // Tell the chips to load the clocked out data + + LOOP_L_N(i, MAX7219_NUMBER_UNITS) + send(max7219_reg_shutdown, 0x01); // Not in shutdown mode + pulse_load(); // Tell the chips to load the clocked out data + + LOOP_L_N(i, MAX7219_NUMBER_UNITS) + send(max7219_reg_displayTest, 0x00); // No display test + pulse_load(); // Tell the chips to load the clocked out data + + LOOP_L_N(i, MAX7219_NUMBER_UNITS) + send(max7219_reg_intensity, 0x01 & 0x0F); // The first 0x0F is the value you can set + // Range: 0x00 to 0x0F + pulse_load(); // Tell the chips to load the clocked out data +} + +#ifdef MAX7219_INIT_TEST + + uint8_t test_mode = 0; + millis_t next_patt_ms; + bool patt_on; + + #if MAX7219_INIT_TEST == 2 + + #define MAX7219_LEDS (MAX7219_X_LEDS * MAX7219_Y_LEDS) + + constexpr millis_t pattern_delay = 4; + + int8_t spiralx, spiraly, spiral_dir; + IF<(MAX7219_LEDS > 255), uint16_t, uint8_t>::type spiral_count; + + void Max7219::test_pattern() { + constexpr int8_t way[][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; + led_set(spiralx, spiraly, patt_on); + const int8_t x = spiralx + way[spiral_dir][0], y = spiraly + way[spiral_dir][1]; + if (!WITHIN(x, 0, MAX7219_X_LEDS - 1) || !WITHIN(y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(x, y) == patt_on) + spiral_dir = (spiral_dir + 1) & 0x3; + spiralx += way[spiral_dir][0]; + spiraly += way[spiral_dir][1]; + if (!spiral_count--) { + if (!patt_on) + test_mode = 0; + else { + spiral_count = MAX7219_LEDS; + spiralx = spiraly = spiral_dir = 0; + patt_on = false; + } + } + } + + #else + + constexpr millis_t pattern_delay = 20; + int8_t sweep_count, sweepx, sweep_dir; + + void Max7219::test_pattern() { + set_column(sweepx, patt_on ? 0xFFFFFFFF : 0x00000000); + sweepx += sweep_dir; + if (!WITHIN(sweepx, 0, MAX7219_X_LEDS - 1)) { + if (!patt_on) { + sweep_dir *= -1; + sweepx += sweep_dir; + } + else + sweepx -= MAX7219_X_LEDS * sweep_dir; + patt_on ^= true; + next_patt_ms += 100; + if (++test_mode > 4) test_mode = 0; + } + } + + #endif + + void Max7219::run_test_pattern() { + const millis_t ms = millis(); + if (PENDING(ms, next_patt_ms)) return; + next_patt_ms = ms + pattern_delay; + test_pattern(); + } + + void Max7219::start_test_pattern() { + clear(); + test_mode = 1; + patt_on = true; + #if MAX7219_INIT_TEST == 2 + spiralx = spiraly = spiral_dir = 0; + spiral_count = MAX7219_LEDS; + #else + sweep_dir = 1; + sweepx = 0; + sweep_count = MAX7219_X_LEDS; + #endif + } + +#endif // MAX7219_INIT_TEST + +void Max7219::init() { + SET_OUTPUT(MAX7219_DIN_PIN); + SET_OUTPUT(MAX7219_CLK_PIN); + OUT_WRITE(MAX7219_LOAD_PIN, HIGH); + delay(1); + + register_setup(); + + LOOP_LE_N(i, 7) { // Empty registers to turn all LEDs off + led_line[i] = 0x00; + send(max7219_reg_digit0 + i, 0); + pulse_load(); // Tell the chips to load the clocked out data + } + + #ifdef MAX7219_INIT_TEST + start_test_pattern(); + #endif +} + +/** + * This code demonstrates some simple debugging using a single 8x8 LED Matrix. If your feature could + * benefit from matrix display, add its code here. Very little processing is required, so the 7219 is + * ideal for debugging when realtime feedback is important but serial output can't be used. + */ + +// Apply changes to update a marker +void Max7219::mark16(const uint8_t pos, const uint8_t v1, const uint8_t v2) { + #if MAX7219_X_LEDS > 8 // At least 16 LEDs on the X-Axis. Use single line. + led_off(v1 & 0xF, pos); + led_on(v2 & 0xF, pos); + #elif MAX7219_Y_LEDS > 8 // At least 16 LEDs on the Y-Axis. Use a single column. + led_off(pos, v1 & 0xF); + led_on(pos, v2 & 0xF); + #else // Single 8x8 LED matrix. Use two lines to get 16 LEDs. + led_off(v1 & 0x7, pos + (v1 >= 8)); + led_on(v2 & 0x7, pos + (v2 >= 8)); + #endif +} + +// Apply changes to update a tail-to-head range +void Max7219::range16(const uint8_t y, const uint8_t ot, const uint8_t nt, const uint8_t oh, const uint8_t nh) { + #if MAX7219_X_LEDS > 8 // At least 16 LEDs on the X-Axis. Use single line. + if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) + led_off(n & 0xF, y); + if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) + led_on(n & 0xF, y); + #elif MAX7219_Y_LEDS > 8 // At least 16 LEDs on the Y-Axis. Use a single column. + if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) + led_off(y, n & 0xF); + if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) + led_on(y, n & 0xF); + #else // Single 8x8 LED matrix. Use two lines to get 16 LEDs. + if (ot != nt) for (uint8_t n = ot & 0xF; n != (nt & 0xF) && n != (nh & 0xF); n = (n + 1) & 0xF) + led_off(n & 0x7, y + (n >= 8)); + if (oh != nh) for (uint8_t n = (oh + 1) & 0xF; n != ((nh + 1) & 0xF); n = (n + 1) & 0xF) + led_on(n & 0x7, y + (n >= 8)); + #endif +} + +// Apply changes to update a quantity +void Max7219::quantity16(const uint8_t pos, const uint8_t ov, const uint8_t nv) { + for (uint8_t i = _MIN(nv, ov); i < _MAX(nv, ov); i++) + led_set( + #if MAX7219_X_LEDS > 8 // At least 16 LEDs on the X-Axis. Use single line. + i, pos + #elif MAX7219_Y_LEDS > 8 // At least 16 LEDs on the Y-Axis. Use a single column. + pos, i + #else // Single 8x8 LED matrix. Use two lines to get 16 LEDs. + i >> 1, pos + (i & 1) + #endif + , nv >= ov + ); +} + +void Max7219::idle_tasks() { + #define MAX7219_USE_HEAD (defined(MAX7219_DEBUG_PLANNER_HEAD) || defined(MAX7219_DEBUG_PLANNER_QUEUE)) + #define MAX7219_USE_TAIL (defined(MAX7219_DEBUG_PLANNER_TAIL) || defined(MAX7219_DEBUG_PLANNER_QUEUE)) + #if MAX7219_USE_HEAD || MAX7219_USE_TAIL + CRITICAL_SECTION_START(); + #if MAX7219_USE_HEAD + const uint8_t head = planner.block_buffer_head; + #endif + #if MAX7219_USE_TAIL + const uint8_t tail = planner.block_buffer_tail; + #endif + CRITICAL_SECTION_END(); + #endif + + #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE) + static uint8_t refresh_cnt; // = 0 + constexpr uint16_t refresh_limit = 5; + static millis_t next_blink = 0; + const millis_t ms = millis(); + const bool do_blink = ELAPSED(ms, next_blink); + #else + static uint16_t refresh_cnt; // = 0 + constexpr bool do_blink = true; + constexpr uint16_t refresh_limit = 50000; + #endif + + // Some Max7219 units are vulnerable to electrical noise, especially + // with long wires next to high current wires. If the display becomes + // corrupted, this will fix it within a couple seconds. + if (do_blink && ++refresh_cnt >= refresh_limit) { + refresh_cnt = 0; + register_setup(); + } + + #ifdef MAX7219_INIT_TEST + if (test_mode) { + run_test_pattern(); + return; + } + #endif + + #if ENABLED(MAX7219_DEBUG_PRINTER_ALIVE) + if (do_blink) { + led_toggle(MAX7219_X_LEDS - 1, MAX7219_Y_LEDS - 1); + next_blink = ms + 1000; + } + #endif + + #if defined(MAX7219_DEBUG_PLANNER_HEAD) && defined(MAX7219_DEBUG_PLANNER_TAIL) && MAX7219_DEBUG_PLANNER_HEAD == MAX7219_DEBUG_PLANNER_TAIL + + static int16_t last_head_cnt = 0xF, last_tail_cnt = 0xF; + + if (last_head_cnt != head || last_tail_cnt != tail) { + range16(MAX7219_DEBUG_PLANNER_HEAD, last_tail_cnt, tail, last_head_cnt, head); + last_head_cnt = head; + last_tail_cnt = tail; + } + + #else + + #ifdef MAX7219_DEBUG_PLANNER_HEAD + static int16_t last_head_cnt = 0x1; + if (last_head_cnt != head) { + mark16(MAX7219_DEBUG_PLANNER_HEAD, last_head_cnt, head); + last_head_cnt = head; + } + #endif + + #ifdef MAX7219_DEBUG_PLANNER_TAIL + static int16_t last_tail_cnt = 0x1; + if (last_tail_cnt != tail) { + mark16(MAX7219_DEBUG_PLANNER_TAIL, last_tail_cnt, tail); + last_tail_cnt = tail; + } + #endif + + #endif + + #ifdef MAX7219_DEBUG_PLANNER_QUEUE + static int16_t last_depth = 0; + const int16_t current_depth = (head - tail + BLOCK_BUFFER_SIZE) & (BLOCK_BUFFER_SIZE - 1) & 0xF; + if (current_depth != last_depth) { + quantity16(MAX7219_DEBUG_PLANNER_QUEUE, last_depth, current_depth); + last_depth = current_depth; + } + #endif + + // After resume() automatically do a refresh() + if (suspended == 0x80) { + suspended = 0; + refresh(); + } +} + +#endif // MAX7219_DEBUG diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h new file mode 100644 index 00000000..8e98c945 --- /dev/null +++ b/Marlin/src/feature/max7219.h @@ -0,0 +1,152 @@ +/** + * 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 + +/** + * This module is off by default, but can be enabled to facilitate the display of + * extra debug information during code development. + * + * Just connect up 5V and GND to give it power, then connect up the pins assigned + * in Configuration_adv.h. For example, on the Re-ARM you could use: + * + * #define MAX7219_CLK_PIN 77 + * #define MAX7219_DIN_PIN 78 + * #define MAX7219_LOAD_PIN 79 + * + * max7219.init() is called automatically at startup, and then there are a number of + * support functions available to control the LEDs in the 8x8 grid. + * + * If you are using the Max7219 matrix for firmware debug purposes in time sensitive + * areas of the code, please be aware that the orientation (rotation) of the display can + * affect the speed. The Max7219 can update a single column fairly fast. It is much + * faster to do a Max7219_Set_Column() with a rotation of 90 or 270 degrees than to do + * a Max7219_Set_Row(). The opposite is true for rotations of 0 or 180 degrees. + */ + +#ifndef MAX7219_ROTATE + #define MAX7219_ROTATE 0 +#endif +#define _ROT ((MAX7219_ROTATE + 360) % 360) + +#ifndef MAX7219_NUMBER_UNITS + #define MAX7219_NUMBER_UNITS 1 +#endif +#define MAX7219_LINES (8 * (MAX7219_NUMBER_UNITS)) + +// +// MAX7219 registers +// +#define max7219_reg_noop 0x00 +#define max7219_reg_digit0 0x01 +#define max7219_reg_digit1 0x02 +#define max7219_reg_digit2 0x03 +#define max7219_reg_digit3 0x04 +#define max7219_reg_digit4 0x05 +#define max7219_reg_digit5 0x06 +#define max7219_reg_digit6 0x07 +#define max7219_reg_digit7 0x08 + +#define max7219_reg_decodeMode 0x09 +#define max7219_reg_intensity 0x0A +#define max7219_reg_scanLimit 0x0B +#define max7219_reg_shutdown 0x0C +#define max7219_reg_displayTest 0x0F + +class Max7219 { +public: + static uint8_t led_line[MAX7219_LINES]; + + Max7219() {} + + static void init(); + static void register_setup(); + static void putbyte(uint8_t data); + static void pulse_load(); + + // Set a single register (e.g., a whole native row) + static void send(const uint8_t reg, const uint8_t data); + + // Refresh all units + static inline void refresh() { for (uint8_t i = 0; i < 8; i++) refresh_line(i); } + + // Suspend / resume updates to the LED unit + // Use these methods to speed up multiple changes + // or to apply updates from interrupt context. + static inline void suspend() { suspended++; } + static inline void resume() { suspended--; suspended |= 0x80; } + + // Update a single native line on all units + static void refresh_line(const uint8_t line); + + // Update a single native line on just one unit + static void refresh_unit_line(const uint8_t line); + + // Set a single LED by XY coordinate + static void led_set(const uint8_t x, const uint8_t y, const bool on); + static void led_on(const uint8_t x, const uint8_t y); + static void led_off(const uint8_t x, const uint8_t y); + static void led_toggle(const uint8_t x, const uint8_t y); + + // Set all LEDs in a single column + static void set_column(const uint8_t col, const uint32_t val); + static void clear_column(const uint8_t col); + + // Set all LEDs in a single row + static void set_row(const uint8_t row, const uint32_t val); + static void clear_row(const uint8_t row); + + // 16 and 32 bit versions of Row and Column functions + // Multiple rows and columns will be used to display the value if + // the array of matrix LED's is too narrow to accomplish the goal + static void set_rows_16bits(const uint8_t y, uint32_t val); + static void set_rows_32bits(const uint8_t y, uint32_t val); + static void set_columns_16bits(const uint8_t x, uint32_t val); + static void set_columns_32bits(const uint8_t x, uint32_t val); + + // Quickly clear the whole matrix + static void clear(); + + // Quickly fill the whole matrix + static void fill(); + + // Apply custom code to update the matrix + static void idle_tasks(); + +private: + static uint8_t suspended; + static void error(const char * const func, const int32_t v1, const int32_t v2=-1); + static void noop(); + static void set(const uint8_t line, const uint8_t bits); + static void send_row(const uint8_t row); + static void send_column(const uint8_t col); + static void mark16(const uint8_t y, const uint8_t v1, const uint8_t v2); + static void range16(const uint8_t y, const uint8_t ot, const uint8_t nt, const uint8_t oh, const uint8_t nh); + static void quantity16(const uint8_t y, const uint8_t ov, const uint8_t nv); + + #ifdef MAX7219_INIT_TEST + static void test_pattern(); + static void run_test_pattern(); + static void start_test_pattern(); + #endif +}; + +extern Max7219 max7219; diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp new file mode 100644 index 00000000..b002e980 --- /dev/null +++ b/Marlin/src/feature/mixing.cpp @@ -0,0 +1,193 @@ +/** + * 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(MIXING_EXTRUDER) + +//#define MIXER_NORMALIZER_DEBUG + +#include "mixing.h" + +Mixer mixer; + +#ifdef MIXER_NORMALIZER_DEBUG + #include "../core/serial.h" +#endif + +// Used up to Planner level +uint_fast8_t Mixer::selected_vtool = 0; +float Mixer::collector[MIXING_STEPPERS]; // mix proportion. 0.0 = off, otherwise <= COLOR_A_MASK. +mixer_comp_t Mixer::color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + +// Used in Stepper +int_fast8_t Mixer::runner = 0; +mixer_comp_t Mixer::s_color[MIXING_STEPPERS]; +mixer_accu_t Mixer::accu[MIXING_STEPPERS] = { 0 }; + +#if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) + mixer_perc_t Mixer::mix[MIXING_STEPPERS]; +#endif + +void Mixer::normalize(const uint8_t tool_index) { + float cmax = 0; + #ifdef MIXER_NORMALIZER_DEBUG + float csum = 0; + #endif + MIXER_STEPPER_LOOP(i) { + const float v = collector[i]; + NOLESS(cmax, v); + #ifdef MIXER_NORMALIZER_DEBUG + csum += v; + #endif + } + #ifdef MIXER_NORMALIZER_DEBUG + SERIAL_ECHOPGM("Mixer: Old relation : [ "); + MIXER_STEPPER_LOOP(i) { + SERIAL_ECHO_F(collector[i] / csum, 3); + SERIAL_CHAR(' '); + } + SERIAL_ECHOLNPGM("]"); + #endif + + // Scale all values so their maximum is COLOR_A_MASK + const float scale = float(COLOR_A_MASK) / cmax; + MIXER_STEPPER_LOOP(i) color[tool_index][i] = collector[i] * scale; + + #ifdef MIXER_NORMALIZER_DEBUG + csum = 0; + SERIAL_ECHOPGM("Mixer: Normalize to : [ "); + MIXER_STEPPER_LOOP(i) { + SERIAL_ECHO(uint16_t(color[tool_index][i])); + SERIAL_CHAR(' '); + csum += color[tool_index][i]; + } + SERIAL_ECHOLNPGM("]"); + SERIAL_ECHOPGM("Mixer: New relation : [ "); + MIXER_STEPPER_LOOP(i) { + SERIAL_ECHO_F(uint16_t(color[tool_index][i]) / csum, 3); + SERIAL_CHAR(' '); + } + SERIAL_ECHOLNPGM("]"); + #endif + + TERN_(GRADIENT_MIX, refresh_gradient()); +} + +void Mixer::reset_vtools() { + // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. + // Every virtual tool gets a pure filament + LOOP_L_N(t, _MIN(MIXING_VIRTUAL_TOOLS, MIXING_STEPPERS)) + MIXER_STEPPER_LOOP(i) + color[t][i] = (t == i) ? COLOR_A_MASK : 0; + + // Remaining virtual tools are 100% filament 1 + #if MIXING_VIRTUAL_TOOLS > MIXING_STEPPERS + LOOP_S_L_N(t, MIXING_STEPPERS, MIXING_VIRTUAL_TOOLS) + MIXER_STEPPER_LOOP(i) + color[t][i] = (i == 0) ? COLOR_A_MASK : 0; + #endif +} + +// called at boot +void Mixer::init() { + + reset_vtools(); + + #if HAS_MIXER_SYNC_CHANNEL + // AUTORETRACT_TOOL gets the same amount of all filaments + MIXER_STEPPER_LOOP(i) + color[MIXER_AUTORETRACT_TOOL][i] = COLOR_A_MASK; + #endif + + ZERO(collector); + + #if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) + update_mix_from_vtool(); + #endif + + TERN_(GRADIENT_MIX, update_gradient_for_planner_z()); +} + +void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*=selected_vtool*/, float (&c)[MIXING_STEPPERS]/*=collector*/) { + float csum = 0, cmax = 0; + MIXER_STEPPER_LOOP(i) { + const float v = color[t][i]; + cmax = _MAX(cmax, v); + csum += v; + } + //SERIAL_ECHOPAIR("Mixer::refresh_collector(", proportion, ", ", int(t), ") cmax=", cmax, " csum=", csum, " color"); + const float inv_prop = proportion / csum; + MIXER_STEPPER_LOOP(i) { + c[i] = color[t][i] * inv_prop; + //SERIAL_ECHOPAIR(" [", int(t), "][", int(i), "] = ", int(color[t][i]), " (", c[i], ") "); + } + //SERIAL_EOL(); +} + +#if ENABLED(GRADIENT_MIX) + + #include "../module/motion.h" + #include "../module/planner.h" + + gradient_t Mixer::gradient = { + false, // enabled + {0}, // color (array) + 0, 0, // start_z, end_z + 0, 1, // start_vtool, end_vtool + {0}, {0} // start_mix[], end_mix[] + #if ENABLED(GRADIENT_VTOOL) + , -1 // vtool_index + #endif + }; + + float Mixer::prev_z; // = 0 + + void Mixer::update_gradient_for_z(const float z) { + if (z == prev_z) return; + prev_z = z; + + const float slice = gradient.end_z - gradient.start_z; + + float pct = (z - gradient.start_z) / slice; + NOLESS(pct, 0.0f); NOMORE(pct, 1.0f); + + MIXER_STEPPER_LOOP(i) { + const mixer_perc_t sm = gradient.start_mix[i]; + mix[i] = sm + (gradient.end_mix[i] - sm) * pct; + } + + copy_mix_to_color(gradient.color); + } + + void Mixer::update_gradient_for_planner_z() { + #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 + +#endif // MIXING_EXTRUDER diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h new file mode 100644 index 00000000..7fe7062a --- /dev/null +++ b/Marlin/src/feature/mixing.h @@ -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 . + * + */ +#pragma once + +#include "../inc/MarlinConfig.h" + +//#define MIXER_NORMALIZER_DEBUG + +#ifndef __AVR__ // || HAS_DUAL_MIXING + // Use 16-bit (or fastest) data for the integer mix factors + typedef uint_fast16_t mixer_comp_t; + typedef uint_fast16_t mixer_accu_t; + #define COLOR_A_MASK 0x8000 + #define COLOR_MASK 0x7FFF +#else + // Use 8-bit data for the integer mix factors + // Exactness is sacrificed for speed + #define MIXER_ACCU_SIGNED + typedef uint8_t mixer_comp_t; + typedef int8_t mixer_accu_t; + #define COLOR_A_MASK 0x80 + #define COLOR_MASK 0x7F +#endif + +typedef int8_t mixer_perc_t; + +#ifndef MIXING_VIRTUAL_TOOLS + #define MIXING_VIRTUAL_TOOLS 1 +#endif + +enum MixTool { + FIRST_USER_VIRTUAL_TOOL = 0 + , LAST_USER_VIRTUAL_TOOL = MIXING_VIRTUAL_TOOLS - 1 + , NR_USER_VIRTUAL_TOOLS + , MIXER_DIRECT_SET_TOOL = NR_USER_VIRTUAL_TOOLS + #if HAS_MIXER_SYNC_CHANNEL + , MIXER_AUTORETRACT_TOOL + #endif + , NR_MIXING_VIRTUAL_TOOLS +}; + +#define MAX_VTOOLS TERN(HAS_MIXER_SYNC_CHANNEL, 254, 255) +static_assert(NR_MIXING_VIRTUAL_TOOLS <= MAX_VTOOLS, "MIXING_VIRTUAL_TOOLS must be <= " STRINGIFY(MAX_VTOOLS) "!"); + +#define MIXER_BLOCK_FIELD mixer_comp_t b_color[MIXING_STEPPERS] +#define MIXER_POPULATE_BLOCK() mixer.populate_block(block->b_color) +#define MIXER_STEPPER_SETUP() mixer.stepper_setup(current_block->b_color) +#define MIXER_STEPPER_LOOP(VAR) for (uint_fast8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) + +#if ENABLED(GRADIENT_MIX) + + typedef struct { + bool enabled; // This gradient is enabled + mixer_comp_t color[MIXING_STEPPERS]; // The current gradient color + float start_z, end_z; // Region for gradient + int8_t start_vtool, end_vtool; // Start and end virtual tools + mixer_perc_t start_mix[MIXING_STEPPERS], // Start and end mixes from those tools + end_mix[MIXING_STEPPERS]; + TERN_(GRADIENT_VTOOL, int8_t vtool_index); // Use this virtual tool number as index + } gradient_t; + +#endif + +/** + * @brief Mixer class + * @details Contains data and behaviors for a Mixing Extruder + */ +class Mixer { + public: + + static float collector[MIXING_STEPPERS]; // M163 components, also editable from LCD + + static void init(); // Populate colors at boot time + + static void reset_vtools(); + static void refresh_collector(const float proportion=1.0, const uint8_t t=selected_vtool, float (&c)[MIXING_STEPPERS]=collector); + + // Used up to Planner level + FORCE_INLINE static void set_collector(const uint8_t c, const float f) { collector[c] = _MAX(f, 0.0f); } + + static void normalize(const uint8_t tool_index); + FORCE_INLINE static void normalize() { normalize(selected_vtool); } + + FORCE_INLINE static uint8_t get_current_vtool() { return selected_vtool; } + + FORCE_INLINE static void T(const uint_fast8_t c) { + selected_vtool = c; + TERN_(GRADIENT_VTOOL, refresh_gradient()); + TERN_(HAS_DUAL_MIXING, update_mix_from_vtool()); + } + + // Used when dealing with blocks + FORCE_INLINE static void populate_block(mixer_comp_t b_color[MIXING_STEPPERS]) { + #if ENABLED(GRADIENT_MIX) + if (gradient.enabled) { + MIXER_STEPPER_LOOP(i) b_color[i] = gradient.color[i]; + return; + } + #endif + MIXER_STEPPER_LOOP(i) b_color[i] = color[selected_vtool][i]; + } + + FORCE_INLINE static void stepper_setup(mixer_comp_t b_color[MIXING_STEPPERS]) { + MIXER_STEPPER_LOOP(i) s_color[i] = b_color[i]; + } + + #if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) + + static mixer_perc_t mix[MIXING_STEPPERS]; // Scratch array for the Mix in proportion to 100 + + static inline void copy_mix_to_color(mixer_comp_t (&tcolor)[MIXING_STEPPERS]) { + // Scale each component to the largest one in terms of COLOR_A_MASK + // So the largest component will be COLOR_A_MASK and the other will be in proportion to it + const float scale = (COLOR_A_MASK) * RECIPROCAL(_MAX( + LIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]) + )); + + // Scale all values so their maximum is COLOR_A_MASK + MIXER_STEPPER_LOOP(i) tcolor[i] = mix[i] * scale; + + #ifdef MIXER_NORMALIZER_DEBUG + SERIAL_ECHOPGM("Mix [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOPGM(" ] to Color [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(tcolor[0]), int(tcolor[1]), int(tcolor[2]), int(tcolor[3]), int(tcolor[4]), int(tcolor[5])); + SERIAL_ECHOLNPGM(" ]"); + #endif + } + + static inline void update_mix_from_vtool(const uint8_t j=selected_vtool) { + float ctot = 0; + MIXER_STEPPER_LOOP(i) ctot += color[j][i]; + //MIXER_STEPPER_LOOP(i) mix[i] = 100.0f * color[j][i] / ctot; + MIXER_STEPPER_LOOP(i) mix[i] = mixer_perc_t(100.0f * color[j][i] / ctot); + + #ifdef MIXER_NORMALIZER_DEBUG + SERIAL_ECHOPAIR("V-tool ", int(j), " [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(color[j][0]), int(color[j][1]), int(color[j][2]), int(color[j][3]), int(color[j][4]), int(color[j][5])); + SERIAL_ECHOPGM(" ] to Mix [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLNPGM(" ]"); + #endif + } + + #endif // HAS_DUAL_MIXING || GRADIENT_MIX + + #if HAS_DUAL_MIXING + + // Update the virtual tool from an edited mix + static inline void update_vtool_from_mix() { + copy_mix_to_color(color[selected_vtool]); + TERN_(GRADIENT_MIX, refresh_gradient()); + // MIXER_STEPPER_LOOP(i) collector[i] = mix[i]; + // normalize(); + } + + #endif // HAS_DUAL_MIXING + + #if ENABLED(GRADIENT_MIX) + + static gradient_t gradient; + static float prev_z; + + // Update the current mix from the gradient for a given Z + static void update_gradient_for_z(const float z); + static void update_gradient_for_planner_z(); + static inline void gradient_control(const float z) { + if (gradient.enabled) { + if (z >= gradient.end_z) + T(gradient.end_vtool); + else + update_gradient_for_z(z); + } + } + + static inline void update_mix_from_gradient() { + float ctot = 0; + MIXER_STEPPER_LOOP(i) ctot += gradient.color[i]; + MIXER_STEPPER_LOOP(i) mix[i] = (mixer_perc_t)CEIL(100.0f * gradient.color[i] / ctot); + + #ifdef MIXER_NORMALIZER_DEBUG + SERIAL_ECHOPGM("Gradient [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(gradient.color[0]), int(gradient.color[1]), int(gradient.color[2]), int(gradient.color[3]), int(gradient.color[4]), int(gradient.color[5])); + SERIAL_ECHOPGM(" ] to Mix [ "); + SERIAL_ECHOLIST_N(MIXING_STEPPERS, int(mix[0]), int(mix[1]), int(mix[2]), int(mix[3]), int(mix[4]), int(mix[5])); + SERIAL_ECHOLNPGM(" ]"); + #endif + } + + // Refresh the gradient after a change + static void refresh_gradient() { + #if ENABLED(GRADIENT_VTOOL) + const bool is_grd = (gradient.vtool_index == -1 || selected_vtool == (uint8_t)gradient.vtool_index); + #else + constexpr bool is_grd = true; + #endif + gradient.enabled = is_grd && gradient.start_vtool != gradient.end_vtool && gradient.start_z < gradient.end_z; + if (gradient.enabled) { + mixer_perc_t mix_bak[MIXING_STEPPERS]; + COPY(mix_bak, mix); + update_mix_from_vtool(gradient.start_vtool); + COPY(gradient.start_mix, mix); + update_mix_from_vtool(gradient.end_vtool); + COPY(gradient.end_mix, mix); + update_gradient_for_planner_z(); + COPY(mix, mix_bak); + prev_z = -1; + } + } + + #endif // GRADIENT_MIX + + // Used in Stepper + FORCE_INLINE static uint8_t get_stepper() { return runner; } + FORCE_INLINE static uint8_t get_next_stepper() { + for (;;) { + if (--runner < 0) runner = MIXING_STEPPERS - 1; + accu[runner] += s_color[runner]; + if ( + #ifdef MIXER_ACCU_SIGNED + accu[runner] < 0 + #else + accu[runner] & COLOR_A_MASK + #endif + ) { + accu[runner] &= COLOR_MASK; + return runner; + } + } + } + + private: + + // Used up to Planner level + static uint_fast8_t selected_vtool; + static mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + + // Used in Stepper + static int_fast8_t runner; + static mixer_comp_t s_color[MIXING_STEPPERS]; + static mixer_accu_t accu[MIXING_STEPPERS]; +}; + +extern Mixer mixer; diff --git a/Marlin/src/feature/mmu2/mmu2.cpp b/Marlin/src/feature/mmu2/mmu2.cpp new file mode 100644 index 00000000..3d635369 --- /dev/null +++ b/Marlin/src/feature/mmu2/mmu2.cpp @@ -0,0 +1,1068 @@ +/** + * 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(PRUSA_MMU2) + +#include "mmu2.h" +#include "../../lcd/menu/menu_mmu2.h" + +MMU2 mmu2; + +#include "../../gcode/gcode.h" +#include "../../lcd/ultralcd.h" +#include "../../libs/buzzer.h" +#include "../../libs/nozzle.h" +#include "../../module/temperature.h" +#include "../../module/planner.h" +#include "../../module/stepper/indirection.h" +#include "../../MarlinCore.h" + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../../feature/host_actions.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +#define DEBUG_OUT ENABLED(MMU2_DEBUG) +#include "../../core/debug_out.h" + +#define MMU_TODELAY 100 +#define MMU_TIMEOUT 10 +#define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0) +#define MMU_P0_TIMEOUT 3000UL // Timeout for P0 command: 3seconds + +#define MMU2_COMMAND(S) tx_str_P(PSTR(S "\n")) + +#if ENABLED(MMU_EXTRUDER_SENSOR) + uint8_t mmu_idl_sens = 0; + static bool mmu_loading_flag = false; +#endif + +#define MMU_CMD_NONE 0 +#define MMU_CMD_T0 0x10 +#define MMU_CMD_T1 0x11 +#define MMU_CMD_T2 0x12 +#define MMU_CMD_T3 0x13 +#define MMU_CMD_T4 0x14 +#define MMU_CMD_L0 0x20 +#define MMU_CMD_L1 0x21 +#define MMU_CMD_L2 0x22 +#define MMU_CMD_L3 0x23 +#define MMU_CMD_L4 0x24 +#define MMU_CMD_C0 0x30 +#define MMU_CMD_U0 0x40 +#define MMU_CMD_E0 0x50 +#define MMU_CMD_E1 0x51 +#define MMU_CMD_E2 0x52 +#define MMU_CMD_E3 0x53 +#define MMU_CMD_E4 0x54 +#define MMU_CMD_R0 0x60 +#define MMU_CMD_F0 0x70 +#define MMU_CMD_F1 0x71 +#define MMU_CMD_F2 0x72 +#define MMU_CMD_F3 0x73 +#define MMU_CMD_F4 0x74 + +#define MMU_REQUIRED_FW_BUILDNR TERN(MMU2_MODE_12V, 132, 126) + +#define MMU2_NO_TOOL 99 +#define MMU_BAUD 115200 + +#define mmuSerial MMU2_SERIAL + +bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved; +#if ENABLED(PRUSA_MMU2_S_MODE) + bool MMU2::mmu2s_triggered; +#endif +uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder; +int8_t MMU2::state = 0; +volatile int8_t MMU2::finda = 1; +volatile bool MMU2::finda_runout_valid; +int16_t MMU2::version = -1, MMU2::buildnr = -1; +millis_t MMU2::prev_request, MMU2::prev_P0_request; +char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE]; + +#if BOTH(HAS_LCD_MENU, MMU2_MENUS) + + struct E_Step { + float extrude; //!< extrude distance in mm + feedRate_t feedRate; //!< feed rate in mm/s + }; + + static constexpr E_Step + ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } + , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } + #if ENABLED(PRUSA_MMU2_S_MODE) + , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } + , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } + #endif + ; + +#endif // MMU2_MENUS + +MMU2::MMU2() { + rx_buffer[0] = '\0'; +} + +void MMU2::init() { + + set_runout_valid(false); + + #if PIN_EXISTS(MMU2_RST) + // TODO use macros for this + WRITE(MMU2_RST_PIN, HIGH); + SET_OUTPUT(MMU2_RST_PIN); + #endif + + mmuSerial.begin(MMU_BAUD); + extruder = MMU2_NO_TOOL; + + safe_delay(10); + reset(); + rx_buffer[0] = '\0'; + state = -1; +} + +void MMU2::reset() { + DEBUG_ECHOLNPGM("MMU <= reset"); + + #if PIN_EXISTS(MMU2_RST) + WRITE(MMU2_RST_PIN, LOW); + safe_delay(20); + WRITE(MMU2_RST_PIN, HIGH); + #else + MMU2_COMMAND("X0"); // Send soft reset + #endif +} + +uint8_t MMU2::get_current_tool() { + return extruder == MMU2_NO_TOOL ? -1 : extruder; +} + +#if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) + #define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE) +#endif + +void MMU2::mmu_loop() { + + switch (state) { + + case 0: break; + + case -1: + if (rx_start()) { + DEBUG_ECHOLNPGM("MMU => 'start'"); + DEBUG_ECHOLNPGM("MMU <= 'S1'"); + + MMU2_COMMAND("S1"); // Read Version + state = -2; + } + else if (millis() > 3000000) { + SERIAL_ECHOLNPGM("MMU not responding - DISABLED"); + state = 0; + } + break; + + case -2: + if (rx_ok()) { + sscanf(rx_buffer, "%uok\n", &version); + + DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'"); + + MMU2_COMMAND("S2"); // Read Build Number + state = -3; + } + break; + + case -3: + if (rx_ok()) { + sscanf(rx_buffer, "%uok\n", &buildnr); + + DEBUG_ECHOLNPAIR("MMU => ", buildnr); + + check_version(); + + #if ENABLED(MMU2_MODE_12V) + DEBUG_ECHOLNPGM("MMU <= 'M1'"); + + MMU2_COMMAND("M1"); // Stealth Mode + state = -5; + + #else + DEBUG_ECHOLNPGM("MMU <= 'P0'"); + + MMU2_COMMAND("P0"); // Read FINDA + state = -4; + #endif + } + break; + + #if ENABLED(MMU2_MODE_12V) + case -5: + // response to M1 + if (rx_ok()) { + DEBUG_ECHOLNPGM("MMU => ok"); + + DEBUG_ECHOLNPGM("MMU <= 'P0'"); + + MMU2_COMMAND("P0"); // Read FINDA + state = -4; + } + break; + #endif + + case -4: + if (rx_ok()) { + sscanf(rx_buffer, "%hhuok\n", &finda); + + DEBUG_ECHOLNPAIR("MMU => ", finda, "\nMMU - ENABLED"); + + enabled = true; + state = 1; + TERN_(PRUSA_MMU2_S_MODE, mmu2s_triggered = false); + } + break; + + case 1: + if (cmd) { + if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T4)) { + // tool change + int filament = cmd - MMU_CMD_T0; + DEBUG_ECHOLNPAIR("MMU <= T", filament); + tx_printf_P(PSTR("T%d\n"), filament); + TERN_(MMU_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any + state = 3; // wait for response + } + else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L4)) { + // load + int filament = cmd - MMU_CMD_L0; + DEBUG_ECHOLNPAIR("MMU <= L", filament); + tx_printf_P(PSTR("L%d\n"), filament); + state = 3; // wait for response + } + else if (cmd == MMU_CMD_C0) { + // continue loading + DEBUG_ECHOLNPGM("MMU <= 'C0'"); + MMU2_COMMAND("C0"); + state = 3; // wait for response + } + else if (cmd == MMU_CMD_U0) { + // unload current + DEBUG_ECHOLNPGM("MMU <= 'U0'"); + + MMU2_COMMAND("U0"); + state = 3; // wait for response + } + else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { + // eject filament + int filament = cmd - MMU_CMD_E0; + DEBUG_ECHOLNPAIR("MMU <= E", filament); + tx_printf_P(PSTR("E%d\n"), filament); + state = 3; // wait for response + } + else if (cmd == MMU_CMD_R0) { + // recover after eject + DEBUG_ECHOLNPGM("MMU <= 'R0'"); + MMU2_COMMAND("R0"); + state = 3; // wait for response + } + else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { + // filament type + int filament = cmd - MMU_CMD_F0; + DEBUG_ECHOPAIR("MMU <= F", filament, " "); + DEBUG_ECHO_F(cmd_arg, DEC); + DEBUG_EOL(); + tx_printf_P(PSTR("F%d %d\n"), filament, cmd_arg); + state = 3; // wait for response + } + + last_cmd = cmd; + cmd = MMU_CMD_NONE; + } + else if (ELAPSED(millis(), prev_P0_request + 300)) { + MMU2_COMMAND("P0"); // Read FINDA + state = 2; // wait for response + } + + TERN_(PRUSA_MMU2_S_MODE, check_filament()); + break; + + case 2: // response to command P0 + if (rx_ok()) { + sscanf(rx_buffer, "%hhuok\n", &finda); + + // This is super annoying. Only activate if necessary + // if (finda_runout_valid) DEBUG_ECHOLNPAIR_F("MMU <= 'P0'\nMMU => ", finda, 6); + + if (!finda && finda_runout_valid) filament_runout(); + if (cmd == 0) ready = true; + state = 1; + } + else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) + state = 1; + + TERN_(PRUSA_MMU2_S_MODE, check_filament()); + break; + + case 3: // response to mmu commands + #if ENABLED(MMU_EXTRUDER_SENSOR) + if (mmu_idl_sens) { + if (FILAMENT_PRESENT() && mmu_loading_flag) { + DEBUG_ECHOLNPGM("MMU <= 'A'"); + MMU2_COMMAND("A"); // send 'abort' request + mmu_idl_sens = 0; + DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT"); + } + } + #endif + + if (rx_ok()) { + // Response to C0 mmu command in PRUSA_MMU2_S_MODE + bool can_reset = true; + #if ENABLED(PRUSA_MMU2_S_MODE) + if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) { + can_reset = false; + // MMU ok received but filament sensor not triggered, retrying... + DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)"); + DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)"); + MMU2_COMMAND("C0"); + } + #endif + if (can_reset) { + DEBUG_ECHOLNPGM("MMU => 'ok'"); + ready = true; + state = 1; + last_cmd = MMU_CMD_NONE; + } + } + else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { + // resend request after timeout + if (last_cmd) { + DEBUG_ECHOLNPGM("MMU retry"); + cmd = last_cmd; + last_cmd = MMU_CMD_NONE; + } + state = 1; + } + TERN_(PRUSA_MMU2_S_MODE, check_filament()); + break; + } +} + +/** + * Check if MMU was started + */ +bool MMU2::rx_start() { + // check for start message + if (rx_str_P(PSTR("start\n"))) { + prev_P0_request = millis(); + return true; + } + return false; +} + +/** + * Check if the data received ends with the given string. + */ +bool MMU2::rx_str_P(const char* str) { + uint8_t i = strlen(rx_buffer); + + while (mmuSerial.available()) { + rx_buffer[i++] = mmuSerial.read(); + rx_buffer[i] = '\0'; + + if (i == sizeof(rx_buffer) - 1) { + DEBUG_ECHOLNPGM("rx buffer overrun"); + break; + } + } + + uint8_t len = strlen_P(str); + + if (i < len) return false; + + str += len; + + while (len--) { + char c0 = pgm_read_byte(str--), c1 = rx_buffer[i--]; + if (c0 == c1) continue; + if (c0 == '\r' && c1 == '\n') continue; // match cr as lf + if (c0 == '\n' && c1 == '\r') continue; // match lf as cr + return false; + } + return true; +} + +/** + * Transfer data to MMU, no argument + */ +void MMU2::tx_str_P(const char* str) { + clear_rx_buffer(); + uint8_t len = strlen_P(str); + LOOP_L_N(i, len) mmuSerial.write(pgm_read_byte(str++)); + rx_buffer[0] = '\0'; + prev_request = millis(); +} + +/** + * Transfer data to MMU, single argument + */ +void MMU2::tx_printf_P(const char* format, int argument = -1) { + clear_rx_buffer(); + uint8_t len = sprintf_P(tx_buffer, format, argument); + LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]); + rx_buffer[0] = '\0'; + prev_request = millis(); +} + +/** + * Transfer data to MMU, two arguments + */ +void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { + clear_rx_buffer(); + uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); + LOOP_L_N(i, len) mmuSerial.write(tx_buffer[i]); + rx_buffer[0] = '\0'; + prev_request = millis(); +} + +/** + * Empty the rx buffer + */ +void MMU2::clear_rx_buffer() { + while (mmuSerial.available()) mmuSerial.read(); + rx_buffer[0] = '\0'; +} + +/** + * Check if we received 'ok' from MMU + */ +bool MMU2::rx_ok() { + if (rx_str_P(PSTR("ok\n"))) { + prev_P0_request = millis(); + return true; + } + return false; +} + +/** + * Check if MMU has compatible firmware + */ +void MMU2::check_version() { + if (buildnr < MMU_REQUIRED_FW_BUILDNR) { + SERIAL_ERROR_MSG("Invalid MMU2 firmware. Version >= " STRINGIFY(MMU_REQUIRED_FW_BUILDNR) " required."); + kill(GET_TEXT(MSG_KILL_MMU2_FIRMWARE)); + } +} + +static void mmu2_not_responding() { + LCD_MESSAGEPGM(MSG_MMU2_NOT_RESPONDING); + BUZZ(100, 659); + BUZZ(200, 698); + BUZZ(100, 659); + BUZZ(300, 440); + BUZZ(100, 659); +} + +#if ENABLED(PRUSA_MMU2_S_MODE) + + bool MMU2::load_to_gears() { + command(MMU_CMD_C0); + manage_response(true, true); + LOOP_L_N(i, MMU2_C0_RETRY) { // Keep loading until filament reaches gears + if (mmu2s_triggered) break; + command(MMU_CMD_C0); + manage_response(true, true); + check_filament(); + } + const bool success = mmu2s_triggered && can_load(); + if (!success) mmu2_not_responding(); + return success; + } + + /** + * Handle tool change + */ + void MMU2::tool_change(const uint8_t index) { + + if (!enabled) return; + + set_runout_valid(false); + + if (index != extruder) { + + DISABLE_AXIS_E0(); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + + command(MMU_CMD_T0 + index); + manage_response(true, true); + + if (load_to_gears()) { + extruder = index; // filament change is finished + active_extruder = 0; + ENABLE_AXIS_E0(); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + } + ui.reset_status(); + } + + set_runout_valid(true); + } + + /** + * Handle special T?/Tx/Tc commands + * + * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically + * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. + * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. + */ + void MMU2::tool_change(const char* special) { + + if (!enabled) return; + + #if ENABLED(MMU2_MENUS) + + set_runout_valid(false); + + switch (*special) { + case '?': { + uint8_t index = mmu2_choose_filament(); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + load_filament_to_nozzle(index); + } break; + + case 'x': { + planner.synchronize(); + uint8_t index = mmu2_choose_filament(); + DISABLE_AXIS_E0(); + command(MMU_CMD_T0 + index); + manage_response(true, true); + + if (load_to_gears()) { + mmu_loop(); + ENABLE_AXIS_E0(); + extruder = index; + active_extruder = 0; + } + } break; + + case 'c': { + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + } break; + } + + set_runout_valid(true); + + #endif // MMU2_MENUS + } + +#elif ENABLED(MMU_EXTRUDER_SENSOR) + + /** + * Handle tool change + */ + void MMU2::tool_change(const uint8_t index) { + if (!enabled) return; + + set_runout_valid(false); + + if (index != extruder) { + DISABLE_AXIS_E0(); + if (FILAMENT_PRESENT()) { + DEBUG_ECHOLNPGM("Unloading\n"); + mmu_loading_flag = false; + command(MMU_CMD_U0); + manage_response(true, true); + } + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + mmu_loading_flag = true; + command(MMU_CMD_T0 + index); + manage_response(true, true); + mmu_continue_loading(); + command(MMU_CMD_C0); + extruder = index; + active_extruder = 0; + + ENABLE_AXIS_E0(); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + + ui.reset_status(); + } + + set_runout_valid(true); + } + + /** + * Handle special T?/Tx/Tc commands + * + * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically + * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. + * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. + */ + void MMU2::tool_change(const char* special) { + if (!enabled) return; + + #if ENABLED(MMU2_MENUS) + + set_runout_valid(false); + + switch (*special) { + case '?': { + DEBUG_ECHOLNPGM("case ?\n"); + uint8_t index = mmu2_choose_filament(); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + load_filament_to_nozzle(index); + } break; + + case 'x': { + DEBUG_ECHOLNPGM("case x\n"); + planner.synchronize(); + uint8_t index = mmu2_choose_filament(); + DISABLE_AXIS_E0(); + command(MMU_CMD_T0 + index); + manage_response(true, true); + mmu_continue_loading(); + command(MMU_CMD_C0); + mmu_loop(); + + ENABLE_AXIS_E0(); + extruder = index; + active_extruder = 0; + } break; + + case 'c': { + DEBUG_ECHOLNPGM("case c\n"); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + } break; + } + + set_runout_valid(true); + + #endif // MMU2_MENUS + } + + void MMU2::mmu_continue_loading() { + for (uint8_t i = 0; i < MMU_LOADING_ATTEMPTS_NR; i++) { + DEBUG_ECHOLNPAIR("Additional load attempt #", i); + if (FILAMENT_PRESENT()) break; + command(MMU_CMD_C0); + manage_response(true, true); + } + if (!FILAMENT_PRESENT()) { + DEBUG_ECHOLNPGM("Filament never reached sensor, runout"); + filament_runout(); + } + mmu_idl_sens = 0; + } + +#elif DISABLED(MMU_EXTRUDER_SENSOR) && DISABLED(PRUSA_MMU2_S_MODE) + +/** + * Handle tool change + */ +void MMU2::tool_change(const uint8_t index) { + if (!enabled) return; + + set_runout_valid(false); + + if (index != extruder) { + DISABLE_AXIS_E0(); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + command(MMU_CMD_T0 + index); + manage_response(true, true); + command(MMU_CMD_C0); + extruder = index; //filament change is finished + active_extruder = 0; + ENABLE_AXIS_E0(); + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(extruder)); + ui.reset_status(); + } + + set_runout_valid(true); +} + +/** + * Handle special T?/Tx/Tc commands + * + * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically + * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. + * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. + */ +void MMU2::tool_change(const char* special) { + if (!enabled) return; + + #if ENABLED(MMU2_MENUS) + + set_runout_valid(false); + + switch (*special) { + case '?': { + DEBUG_ECHOLNPGM("case ?\n"); + uint8_t index = mmu2_choose_filament(); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + load_filament_to_nozzle(index); + } break; + + case 'x': { + DEBUG_ECHOLNPGM("case x\n"); + planner.synchronize(); + uint8_t index = mmu2_choose_filament(); + DISABLE_AXIS_E0(); + command(MMU_CMD_T0 + index); + manage_response(true, true); + command(MMU_CMD_C0); + mmu_loop(); + + ENABLE_AXIS_E0(); + extruder = index; + active_extruder = 0; + } break; + + case 'c': { + DEBUG_ECHOLNPGM("case c\n"); + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); + execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + } break; + } + + set_runout_valid(true); + + #endif + } + +#endif // MMU_EXTRUDER_SENSOR + +/** + * Set next command + */ +void MMU2::command(const uint8_t mmu_cmd) { + if (!enabled) return; + cmd = mmu_cmd; + ready = false; +} + +/** + * Wait for response from MMU + */ +bool MMU2::get_response() { + while (cmd != MMU_CMD_NONE) idle(); + + while (!ready) { + idle(); + if (state != 3) break; + } + + const bool ret = ready; + ready = false; + + return ret; +} + +/** + * Wait for response and deal with timeout if nexcessary + */ +void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { + + constexpr xyz_pos_t park_point = NOZZLE_PARK_POINT; + bool response = false; + mmu_print_saved = false; + xyz_pos_t resume_position; + int16_t resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); + + KEEPALIVE_STATE(PAUSED_FOR_USER); + + while (!response) { + + response = get_response(); // wait for "ok" from mmu + + if (!response) { // No "ok" was received in reserved time frame, user will fix the issue on mmu unit + if (!mmu_print_saved) { // First occurrence. Save current position, park print head, disable nozzle heater. + + planner.synchronize(); + + mmu_print_saved = true; + + SERIAL_ECHOLNPGM("MMU not responding"); + + resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); + resume_position = current_position; + + if (move_axes && all_axes_homed()) + nozzle.park(0, park_point /*= NOZZLE_PARK_POINT*/); + + if (turn_off_nozzle) thermalManager.setTargetHotend(0, active_extruder); + + mmu2_not_responding(); + } + } + else if (mmu_print_saved) { + SERIAL_ECHOLNPGM("MMU starts responding\n"); + + if (turn_off_nozzle && resume_hotend_temp) { + thermalManager.setTargetHotend(resume_hotend_temp, active_extruder); + LCD_MESSAGEPGM(MSG_HEATING); + BUZZ(200, 40); + + while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(1000); + } + + if (move_axes && all_axes_homed()) { + LCD_MESSAGEPGM(MSG_MMU2_RESUMING); + BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404); + + // Move XY to starting position, then Z + do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); + + // Move Z_AXIS to saved position + do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + } + else { + BUZZ(198, 404); BUZZ(4, 0); BUZZ(198, 404); + LCD_MESSAGEPGM(MSG_MMU2_RESUMING); + } + } + } +} + +void MMU2::set_filament_type(const uint8_t index, const uint8_t filamentType) { + if (!enabled) return; + + cmd_arg = filamentType; + command(MMU_CMD_F0 + index); + + manage_response(true, true); +} + +void MMU2::filament_runout() { + queue.inject_P(PSTR(MMU2_FILAMENT_RUNOUT_SCRIPT)); + planner.synchronize(); +} + +#if ENABLED(PRUSA_MMU2_S_MODE) + + void MMU2::check_filament() { + const bool present = FILAMENT_PRESENT(); + if (cmd == MMU_CMD_NONE && last_cmd == MMU_CMD_C0) { + if (present && !mmu2s_triggered) { + DEBUG_ECHOLNPGM("MMU <= 'A'"); + tx_str_P(PSTR("A\n")); + } + // Slowly spin the extruder during C0 + else { + while (planner.movesplanned() < 3) { + current_position.e += 0.25; + line_to_current_position(MMM_TO_MMS(120)); + } + } + } + mmu2s_triggered = present; + } + + bool MMU2::can_load() { + execute_extruder_sequence((const E_Step *)can_load_sequence, COUNT(can_load_sequence)); + + int filament_detected_count = 0; + const int steps = (MMU2_CAN_LOAD_RETRACT) / (MMU2_CAN_LOAD_INCREMENT); + DEBUG_ECHOLNPGM("MMU can_load:"); + LOOP_L_N(i, steps) { + execute_extruder_sequence((const E_Step *)can_load_increment_sequence, COUNT(can_load_increment_sequence)); + check_filament(); // Don't trust the idle function + DEBUG_CHAR(mmu2s_triggered ? 'O' : 'o'); + if (mmu2s_triggered) ++filament_detected_count; + } + + if (filament_detected_count <= steps - (MMU2_CAN_LOAD_DEVIATION) / (MMU2_CAN_LOAD_INCREMENT)) { + DEBUG_ECHOLNPGM(" failed."); + return false; + } + + DEBUG_ECHOLNPGM(" succeeded."); + return true; + } +#endif + +#if BOTH(HAS_LCD_MENU, MMU2_MENUS) + + // Load filament into MMU2 + void MMU2::load_filament(const uint8_t index) { + if (!enabled) return; + command(MMU_CMD_L0 + index); + manage_response(false, false); + BUZZ(200, 404); + } + + /** + * Switch material and load to nozzle + */ + bool MMU2::load_filament_to_nozzle(const uint8_t index) { + + if (!enabled) return false; + + if (thermalManager.tooColdToExtrude(active_extruder)) { + BUZZ(200, 404); + LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); + return false; + } + + command(MMU_CMD_T0 + index); + manage_response(true, true); + + const bool success = load_to_gears(); + if (success) { + mmu_loop(); + extruder = index; + active_extruder = 0; + load_to_nozzle(); + BUZZ(200, 404); + } + return success; + } + + /** + * Load filament to nozzle of multimaterial printer + * + * This function is used only only after T? (user select filament) and M600 (change filament). + * It is not used after T0 .. T4 command (select filament), in such case, gcode is responsible for loading + * filament to nozzle. + */ + void MMU2::load_to_nozzle() { + if (!enabled) return; + execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + } + + bool MMU2::eject_filament(const uint8_t index, const bool recover) { + + if (!enabled) return false; + + if (thermalManager.tooColdToExtrude(active_extruder)) { + BUZZ(200, 404); + LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); + return false; + } + + LCD_MESSAGEPGM(MSG_MMU2_EJECTING_FILAMENT); + + ENABLE_AXIS_E0(); + current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; + line_to_current_position(2500 / 60); + planner.synchronize(); + command(MMU_CMD_E0 + index); + manage_response(false, false); + + if (recover) { + LCD_MESSAGEPGM(MSG_MMU2_EJECT_RECOVER); + BUZZ(200, 404); + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover"))); + wait_for_user_response(); + BUZZ(200, 404); + BUZZ(200, 404); + + command(MMU_CMD_R0); + manage_response(false, false); + } + + ui.reset_status(); + + // no active tool + extruder = MMU2_NO_TOOL; + + set_runout_valid(false); + + BUZZ(200, 404); + + DISABLE_AXIS_E0(); + + return true; + } + + /** + * Unload from hotend and retract to MMU + */ + bool MMU2::unload() { + + if (!enabled) return false; + + if (thermalManager.tooColdToExtrude(active_extruder)) { + BUZZ(200, 404); + LCD_ALERTMESSAGEPGM(MSG_HOTEND_TOO_COLD); + return false; + } + + filament_ramming(); + + command(MMU_CMD_U0); + manage_response(false, true); + + BUZZ(200, 404); + + // no active tool + extruder = MMU2_NO_TOOL; + + set_runout_valid(false); + + return true; + } + + /** + * Unload sequence to optimize shape of the tip of the unloaded filament + */ + void MMU2::filament_ramming() { + execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); + } + + void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { + + planner.synchronize(); + ENABLE_AXIS_E0(); + + const E_Step* step = sequence; + + LOOP_L_N(i, steps) { + const float es = pgm_read_float(&(step->extrude)); + const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate)); + + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("E step ", es, "/", fr_mm_m); + + current_position.e += es; + line_to_current_position(MMM_TO_MMS(fr_mm_m)); + planner.synchronize(); + + step++; + } + + DISABLE_AXIS_E0(); + } + +#endif // HAS_LCD_MENU && MMU2_MENUS + +#endif // PRUSA_MMU2 diff --git a/Marlin/src/feature/mmu2/mmu2.h b/Marlin/src/feature/mmu2/mmu2.h new file mode 100644 index 00000000..678f65d0 --- /dev/null +++ b/Marlin/src/feature/mmu2/mmu2.h @@ -0,0 +1,115 @@ +/** + * 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_FILAMENT_SENSOR + #include "../runout.h" +#endif + +#if SERIAL_USB + #define MMU_RX_SIZE 256 + #define MMU_TX_SIZE 256 +#else + #define MMU_RX_SIZE 16 + #define MMU_TX_SIZE 16 +#endif + +struct E_Step; + +class MMU2 { +public: + MMU2(); + + static void init(); + static void reset(); + static void mmu_loop(); + static void tool_change(const uint8_t index); + static void tool_change(const char* special); + static uint8_t get_current_tool(); + static void set_filament_type(const uint8_t index, const uint8_t type); + + #if BOTH(HAS_LCD_MENU, MMU2_MENUS) + static bool unload(); + static void load_filament(uint8_t); + static void load_all(); + static bool load_filament_to_nozzle(const uint8_t index); + static bool eject_filament(const uint8_t index, const bool recover); + #endif + +private: + static bool rx_str_P(const char* str); + static void tx_str_P(const char* str); + static void tx_printf_P(const char* format, const int argument); + static void tx_printf_P(const char* format, const int argument1, const int argument2); + static void clear_rx_buffer(); + + static bool rx_ok(); + static bool rx_start(); + static void check_version(); + + static void command(const uint8_t cmd); + static bool get_response(); + static void manage_response(const bool move_axes, const bool turn_off_nozzle); + + #if BOTH(HAS_LCD_MENU, MMU2_MENUS) + static void load_to_nozzle(); + static void filament_ramming(); + static void execute_extruder_sequence(const E_Step * sequence, int steps); + #endif + + static void filament_runout(); + + #if ENABLED(PRUSA_MMU2_S_MODE) + static bool mmu2s_triggered; + static void check_filament(); + static bool can_load(); + static bool load_to_gears(); + #else + FORCE_INLINE static bool load_to_gears() { return true; } + #endif + + #if ENABLED(MMU_EXTRUDER_SENSOR) + static void mmu_continue_loading(); + #endif + + static bool enabled, ready, mmu_print_saved; + + static uint8_t cmd, cmd_arg, last_cmd, extruder; + static int8_t state; + static volatile int8_t finda; + static volatile bool finda_runout_valid; + static int16_t version, buildnr; + static millis_t prev_request, prev_P0_request; + static char rx_buffer[MMU_RX_SIZE], tx_buffer[MMU_TX_SIZE]; + + static inline void set_runout_valid(const bool valid) { + finda_runout_valid = valid; + #if HAS_FILAMENT_SENSOR + if (valid) runout.reset(); + #endif + } + +}; + +extern MMU2 mmu2; diff --git a/Marlin/src/feature/mmu2/serial-protocol.md b/Marlin/src/feature/mmu2/serial-protocol.md new file mode 100644 index 00000000..936830e1 --- /dev/null +++ b/Marlin/src/feature/mmu2/serial-protocol.md @@ -0,0 +1,94 @@ +Startup sequence +================ + +When initialized, MMU sends + +- MMU => 'start\n' + +We follow with + +- MMU <= 'S1\n' +- MMU => 'ok*Firmware version*\n' +- MMU <= 'S2\n' +- MMU => 'ok*Build number*\n' + +#if (12V_mode) + +- MMU <= 'M1\n' +- MMU => 'ok\n' + +#endif + +- MMU <= 'P0\n' +- MMU => '*FINDA status*\n' + +Now we are sure MMU is available and ready. If there was a timeout or other communication problem somewhere, printer will be killed. + +- *Firmware version* is an integer value, but we don't care about it +- *Build number* is an integer value and has to be >=126, or =>132 if 12V mode is enabled +- *FINDA status* is 1 if the is filament loaded to the extruder, 0 otherwise + + +*Build number* is checked against the required value, if it does not match, printer is halted. + + + +Toolchange +========== + +- MMU <= 'T*Filament index*\n' + +MMU sends + +- MMU => 'ok\n' + +as soon as the filament is fed down to the extruder. We follow with + +- MMU <= 'C0\n' + +MMU will feed a few more millimeters of filament for the extruder gears to grab. +When done, the MMU sends + +- MMU => 'ok\n' + +We don't wait for a response here but immediately continue with the next gcode which should +be one or more extruder moves to feed the filament into the hotend. + + +FINDA status +============ + +- MMU <= 'P0\n' +- MMU => '*FINDA status*\n' + +*FINDA status* is 1 if the is filament loaded to the extruder, 0 otherwise. This could be used as filament runout sensor if probed regularly. + + + +Load filament +============= + +- MMU <= 'L*Filament index*\n' + +MMU will feed filament down to the extruder, when done + +- MMU => 'ok\n' + + +Unload filament +============= + +- MMU <= 'U0\n' + +MMU will retract current filament from the extruder, when done + +- MMU => 'ok\n' + + + +Eject filament +============== + +- MMU <= 'E*Filament index*\n' +- MMU => 'ok\n' + diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp new file mode 100644 index 00000000..90bb6471 --- /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 00000000..3ed584b2 --- /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/feature/pause.cpp b/Marlin/src/feature/pause.cpp new file mode 100644 index 00000000..0ab65940 --- /dev/null +++ b/Marlin/src/feature/pause.cpp @@ -0,0 +1,679 @@ +/** + * 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 . + * + */ + +/** + * feature/pause.cpp - Pause feature support functions + * This may be combined with related G-codes if features are consolidated. + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +//#define DEBUG_PAUSE_RESUME + +#include "../MarlinCore.h" +#include "../gcode/gcode.h" +#include "../module/motion.h" +#include "../module/planner.h" +#include "../module/stepper.h" +#include "../module/printcounter.h" +#include "../module/temperature.h" + +#if ENABLED(FWRETRACT) + #include "fwretract.h" +#endif + +#if HAS_FILAMENT_SENSOR + #include "runout.h" +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "host_actions.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#include "../lcd/ultralcd.h" + +#if HAS_BUZZER + #include "../libs/buzzer.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "powerloss.h" +#endif + +#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; + +#if HAS_LCD_MENU + PauseMenuResponse pause_menu_response; + PauseMode pause_mode = PAUSE_MODE_PAUSE_PRINT; +#endif + +fil_change_settings_t fc_settings[EXTRUDERS]; + +#if ENABLED(SDSUPPORT) + #include "../sd/cardreader.h" +#endif + +#if ENABLED(EMERGENCY_PARSER) + #define _PMSG(L) L##_M108 +#else + #define _PMSG(L) L##_LCD +#endif + +#if HAS_BUZZER + static void impatient_beep(const int8_t max_beep_count, const bool restart=false) { + + if (TERN0(HAS_LCD_MENU, pause_mode == PAUSE_MODE_PAUSE_PRINT)) return; + + static millis_t next_buzz = 0; + static int8_t runout_beep = 0; + + if (restart) next_buzz = runout_beep = 0; + + const bool always = max_beep_count < 0; + + const millis_t ms = millis(); + if (ELAPSED(ms, next_buzz)) { + if (always || runout_beep < max_beep_count + 5) { // Only beep as long as we're supposed to + next_buzz = ms + ((always || runout_beep < max_beep_count) ? 1000 : 500); + BUZZ(50, 880 - (runout_beep & 1) * 220); + runout_beep++; + } + } + } + inline void first_impatient_beep(const int8_t max_beep_count) { impatient_beep(max_beep_count, true); } +#else + inline void impatient_beep(const int8_t, const bool=false) {} + inline void first_impatient_beep(const int8_t) {} +#endif + +/** + * Ensure a safe temperature for extrusion + * + * - Fail if the TARGET temperature is too low + * - Display LCD placard with temperature status + * - Return when heating is done or aborted + * + * 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 (!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); + #endif + UNUSED(mode); + + if (wait) + return thermalManager.wait_for_hotend(active_extruder); + + 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; +} + +/** + * Load filament into the hotend + * + * - Fail if the a safe temperature was not reached + * - If pausing for confirmation, wait for a click or M108 + * - Show "wait for load" placard + * - Load and purge filament + * - Show "Purge more" / "Continue" menu + * - Return when "Continue" is selected + * + * Returns 'true' if load was completed, 'false' for abort + */ +bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=0*/, const int8_t max_beep_count/*=0*/, + const bool show_lcd/*=false*/, const bool pause_for_user/*=false*/, + const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ + DXC_ARGS +) { + 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 + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS, mode); + #endif + return false; + } + + if (pause_for_user) { + #if HAS_LCD_MENU + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_INSERT, mode); + #endif + SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_INSERT)); + + first_impatient_beep(max_beep_count); + + KEEPALIVE_STATE(PAUSED_FOR_USER); + #if ENABLED(HOST_PROMPT_SUPPORT) + const char tool = '0' + #if NUM_RUNOUT_SENSORS > 1 + + active_extruder + #endif + ; + host_action_prompt_begin(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool); + host_action_prompt_button(CONTINUE_STR); + host_action_prompt_show(); + #endif + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Load Filament"))); + while (wait_for_user) { + impatient_beep(max_beep_count); + idle_no_sleep(); + } + } + + #if HAS_LCD_MENU + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_LOAD, mode); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + const int8_t saved_ext = active_extruder; + const bool saved_ext_dup_mode = extruder_duplication_enabled; + active_extruder = DXC_ext; + extruder_duplication_enabled = false; + #endif + + // Slow Load filament + if (slow_load_length) unscaled_e_move(slow_load_length, FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE); + + // Fast Load Filament + if (fast_load_length) { + #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 + const float saved_acceleration = planner.settings.retract_acceleration; + planner.settings.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL; + #endif + + unscaled_e_move(fast_load_length, FILAMENT_CHANGE_FAST_LOAD_FEEDRATE); + + #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 + planner.settings.retract_acceleration = saved_acceleration; + #endif + } + + #if ENABLED(DUAL_X_CARRIAGE) // Tie the two extruders movement back together. + active_extruder = saved_ext; + extruder_duplication_enabled = saved_ext_dup_mode; + stepper.set_directions(); + #endif + + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + + #if HAS_LCD_MENU + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE); + #endif + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Filament Purging..."), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Filament Purging..."))); + wait_for_user = true; // A click or M108 breaks the purge_length loop + for (float purge_count = purge_length; purge_count > 0 && wait_for_user; --purge_count) + unscaled_e_move(1, ADVANCED_PAUSE_PURGE_FEEDRATE); + wait_for_user = false; + + #else + + do { + if (purge_length > 0) { + // "Wait for filament purge" + #if HAS_LCD_MENU + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_PURGE); + #endif + + // Extrude filament to get into hotend + unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); + } + + TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. (NOTE: host_response_handler may also do this!) + + #if HAS_LCD_MENU + if (show_lcd) { + // Show "Purge More" / "Resume" menu and wait for reply + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = false; + lcd_pause_show_message(PAUSE_MESSAGE_OPTION); + while (pause_menu_response == PAUSE_RESPONSE_WAIT_FOR) idle_no_sleep(); + } + #endif + + // Keep looping if "Purge More" was selected + } 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; +} + +/** + * Unload filament from the hotend + * + * - Fail if the a safe temperature was not reached + * - Show "wait for unload" placard + * - Retract, pause, then unload filament + * - Disable E stepper (on most machines) + * + * Returns 'true' if unload was completed, 'false' for abort + */ +bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, + const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ + #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + , const float &mix_multiplier/*=1.0*/ + #endif +) { + 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; + #endif + + if (!ensure_safe_temperature(false, mode)) { + #if HAS_LCD_MENU + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_STATUS); + #endif + return false; + } + + #if HAS_LCD_MENU + if (show_lcd) lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, mode); + #endif + + // Retract filament + unscaled_e_move(-(FILAMENT_UNLOAD_PURGE_RETRACT) * mix_multiplier, (PAUSE_PARK_RETRACT_FEEDRATE) * mix_multiplier); + + // Wait for filament to cool + safe_delay(FILAMENT_UNLOAD_PURGE_DELAY); + + // Quickly purge + unscaled_e_move((FILAMENT_UNLOAD_PURGE_RETRACT + FILAMENT_UNLOAD_PURGE_LENGTH) * mix_multiplier, + (FILAMENT_UNLOAD_PURGE_FEEDRATE) * mix_multiplier); + + // Unload filament + #if FILAMENT_CHANGE_UNLOAD_ACCEL > 0 + const float saved_acceleration = planner.settings.retract_acceleration; + planner.settings.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL; + #endif + + unscaled_e_move(unload_length * mix_multiplier, (FILAMENT_CHANGE_UNLOAD_FEEDRATE) * mix_multiplier); + + #if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0 + planner.settings.retract_acceleration = saved_acceleration; + #endif + + // Disable E steppers for manual change + #if HAS_E_STEPPER_ENABLE + disable_e_stepper(active_extruder); + safe_delay(100); + #endif + + return true; +} + +// public: + +/** + * Pause procedure + * + * - Abort if already paused + * - Send host action for pause, if configured + * - Abort if TARGET temperature is too low + * - Display "wait for start of filament change" (if a length was specified) + * - Initial retract, if current temperature is hot enough + * - Park the nozzle at the given position + * - Call unload_filament (if a length was specified) + * + * Return 'true' if pause was completed, 'false' for abort + */ +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) { + DEBUG_SECTION(pp, "pause_print", true); + DEBUG_ECHOLNPAIR("... 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 + + #if ENABLED(HOST_ACTION_COMMANDS) + #ifdef ACTION_ON_PAUSED + host_action_paused(); + #elif defined(ACTION_ON_PAUSE) + host_action_pause(); + #endif + #endif + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Pause"), DISMISS_STR)); + + // Indicate that the printer is paused + ++did_pause_print; + + // Pause the print job and timer + #if ENABLED(SDSUPPORT) + if (IS_SD_PRINTING()) { + card.pauseSDPrint(); + ++did_pause_print; // Indicate SD pause also + } + #endif + + print_job_timer.pause(); + + // Save current position + resume_position = current_position; + + // Wait for buffered blocks to complete + planner.synchronize(); + + #if ENABLED(ADVANCED_PAUSE_FANS_PAUSE) && HAS_FAN + thermalManager.set_fans_paused(true); + #endif + + // Initial retract before move to filament change position + if (retract && thermalManager.hotEnoughToExtrude(active_extruder)) { + DEBUG_ECHOLNPAIR("... retract:", retract); + 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_should_home()) + nozzle.park(0, park_point); + + #if ENABLED(DUAL_X_CARRIAGE) + const int8_t saved_ext = active_extruder; + const bool saved_ext_dup_mode = extruder_duplication_enabled; + active_extruder = DXC_ext; + extruder_duplication_enabled = false; + #endif + + if (unload_length) // Unload the filament + unload_filament(unload_length, show_lcd, PAUSE_MODE_CHANGE_FILAMENT); + + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder = saved_ext; + extruder_duplication_enabled = saved_ext_dup_mode; + stepper.set_directions(); + #endif + + return true; +} + +/** + * For Paused Print: + * - Show "Press button (or M108) to resume" + * + * For Filament Change: + * - Show "Insert filament and press button to continue" + * + * - Wait for a click before returning + * - Heaters can time out and must reheat before continuing + * + * Used by M125 and M600 + */ + +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); + + first_impatient_beep(max_beep_count); + + // Start the heater idle timers + const millis_t nozzle_timeout = SEC_TO_MS(PAUSE_PARK_NOZZLE_TIMEOUT); + + HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout); + + #if ENABLED(DUAL_X_CARRIAGE) + const int8_t saved_ext = active_extruder; + const bool saved_ext_dup_mode = extruder_duplication_enabled; + active_extruder = DXC_ext; + extruder_duplication_enabled = false; + #endif + + // Wait for filament insert by user and press button + KEEPALIVE_STATE(PAUSED_FOR_USER); + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_NOZZLE_PARKED), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_NOZZLE_PARKED))); + wait_for_user = true; // LCD click or M108 will clear this + while (wait_for_user) { + impatient_beep(max_beep_count); + + // If the nozzle has timed out... + if (!nozzle_timed_out) + HOTEND_LOOP() nozzle_timed_out |= thermalManager.heater_idle[e].timed_out; + + // Wait for the user to press the button to re-heat the nozzle, then + // re-heat the nozzle, re-show the continue prompt, restart idle timers, start over + if (nozzle_timed_out) { + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_HEAT)); + SERIAL_ECHO_MSG(_PMSG(STR_FILAMENT_CHANGE_HEAT)); + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_HEATER_TIMEOUT), GET_TEXT(MSG_REHEAT))); + + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_HEATER_TIMEOUT))); + + wait_for_user_response(0, true); // Wait for LCD click or M108 + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, GET_TEXT(MSG_REHEATING))); + + TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged_P(GET_TEXT(MSG_REHEATING))); + + // Re-enable the heaters if they timed out + HOTEND_LOOP() thermalManager.reset_hotend_idle_timer(e); + + // Wait for the heaters to reach the target temperatures + ensure_safe_temperature(false); + + // Show the prompt to continue + show_continue_prompt(is_reload); + + // Start the heater idle timers + const millis_t nozzle_timeout = SEC_TO_MS(PAUSE_PARK_NOZZLE_TIMEOUT); + + HOTEND_LOOP() thermalManager.heater_idle[e].start(nozzle_timeout); + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Reheat Done"), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Reheat finished."))); + wait_for_user = true; + nozzle_timed_out = false; + + first_impatient_beep(max_beep_count); + } + idle_no_sleep(); + } + #if ENABLED(DUAL_X_CARRIAGE) + active_extruder = saved_ext; + extruder_duplication_enabled = saved_ext_dup_mode; + stepper.set_directions(); + #endif +} + +/** + * Resume or Start print procedure + * + * - If not paused, do nothing and return + * - Reset heater idle timers + * - Load filament if specified, but only if: + * - a nozzle timed out, or + * - the nozzle is already heated. + * - Display "wait for print to resume" + * - Retract to prevent oozing + * - Move the nozzle back to resume_position + * - Unretract + * - Re-prime the nozzle... + * - FWRETRACT: Recover/prime from the prior G10. + * - !FWRETRACT: Retract by resume_position.e, if negative. + * Not sure how this logic comes into use. + * - Sync the planner E to resume_position.e + * - Send host action for resume, if configured + * - 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, + "\nextruder_duplication_enabled:", extruder_duplication_enabled, + "\nactive_extruder:", active_extruder, + "\n" + ); + //*/ + + if (!did_pause_print) return; + + // Re-enable the heaters if they timed out + bool nozzle_timed_out = false; + HOTEND_LOOP() { + nozzle_timed_out |= thermalManager.heater_idle[e].timed_out; + thermalManager.reset_hotend_idle_timer(e); + } + + if (targetTemp > thermalManager.degTargetHotend(active_extruder)) { + thermalManager.setTargetHotend(targetTemp, active_extruder); + } + + // Load the new filament + load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, PAUSE_MODE_SAME DXC_PASS); + + if (targetTemp > 0) { + thermalManager.setTargetHotend(targetTemp, active_extruder); + thermalManager.wait_for_hotend(active_extruder, false); + } + + 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)); + + if (!axes_should_home()) { + // Move XY to starting position, then Z + do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); + + // Move Z_AXIS to saved position + do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + } + + // Unretract + unscaled_e_move(PAUSE_PARK_RETRACT_LENGTH, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); + + // Intelligent resuming + #if ENABLED(FWRETRACT) + // If retracted before goto pause + if (fwretract.retracted[active_extruder]) + unscaled_e_move(-fwretract.settings.retract_length, fwretract.settings.retract_feedrate_mm_s); + #endif + + // If resume_position is negative + if (resume_position.e < 0) unscaled_e_move(resume_position.e, feedRate_t(PAUSE_PARK_RETRACT_FEEDRATE)); + #if ADVANCED_PAUSE_RESUME_PRIME != 0 + unscaled_e_move(ADVANCED_PAUSE_RESUME_PRIME, feedRate_t(ADVANCED_PAUSE_PURGE_FEEDRATE)); + #endif + + // Now all extrusion positions are resumed and ready to be confirmed + // Set extruder to saved position + planner.set_e_position_mm((destination.e = current_position.e = resume_position.e)); + + // Write PLR now to update the z axis value + TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); + + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); + + #ifdef ACTION_ON_RESUMED + host_action_resumed(); + #elif defined(ACTION_ON_RESUME) + host_action_resume(); + #endif + + --did_pause_print; + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Resuming"), DISMISS_STR)); + + #if ENABLED(SDSUPPORT) + if (did_pause_print) { card.startFileprint(); --did_pause_print; } + #endif + + #if ENABLED(ADVANCED_PAUSE_FANS_PAUSE) && HAS_FAN + thermalManager.set_fans_paused(false); + #endif + + TERN_(HAS_FILAMENT_SENSOR, runout.reset()); + + // Resume the print job timer if it was running + if (print_job_timer.isPaused()) print_job_timer.start(); + + TERN_(HAS_DISPLAY, ui.reset_status()); + TERN_(HAS_LCD_MENU, ui.return_to_status()); +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h new file mode 100644 index 00000000..016b0ce3 --- /dev/null +++ b/Marlin/src/feature/pause.h @@ -0,0 +1,103 @@ +/** + * 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 + +/** + * feature/pause.h - Pause feature support functions + * This may be combined with related G-codes if features are consolidated. + */ + +typedef struct { + float unload_length, load_length; +} fil_change_settings_t; + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +#include "../libs/nozzle.h" + +enum PauseMode : char { + PAUSE_MODE_SAME, + PAUSE_MODE_PAUSE_PRINT, + PAUSE_MODE_CHANGE_FILAMENT, + PAUSE_MODE_LOAD_FILAMENT, + PAUSE_MODE_UNLOAD_FILAMENT +}; + +enum PauseMessage : char { + PAUSE_MESSAGE_PARKING, + PAUSE_MESSAGE_CHANGING, + PAUSE_MESSAGE_WAITING, + PAUSE_MESSAGE_UNLOAD, + PAUSE_MESSAGE_INSERT, + PAUSE_MESSAGE_LOAD, + PAUSE_MESSAGE_PURGE, + PAUSE_MESSAGE_OPTION, + PAUSE_MESSAGE_RESUME, + PAUSE_MESSAGE_STATUS, + PAUSE_MESSAGE_HEAT, + PAUSE_MESSAGE_HEATING +}; + +#if HAS_LCD_MENU + enum PauseMenuResponse : char { + PAUSE_RESPONSE_WAIT_FOR, + PAUSE_RESPONSE_EXTRUDE_MORE, + PAUSE_RESPONSE_RESUME_PRINT + }; + extern PauseMenuResponse pause_menu_response; + extern PauseMode pause_mode; +#endif + +extern fil_change_settings_t fc_settings[EXTRUDERS]; + +extern uint8_t did_pause_print; + +#if ENABLED(DUAL_X_CARRIAGE) + #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); + +void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); + +void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0, int16_t targetTemp=0 DXC_PARAMS); + +bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, + const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); + +bool unload_filament(const float &unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT + #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + , const float &mix_multiplier=1.0 + #endif +); + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp new file mode 100644 index 00000000..5be554e5 --- /dev/null +++ b/Marlin/src/feature/power.cpp @@ -0,0 +1,117 @@ +/** + * 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 . + * + */ + +/** + * power.cpp - power control + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(AUTO_POWER_CONTROL) + +#include "power.h" +#include "../module/temperature.h" +#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; + +bool Power::is_power_needed() { + #if ENABLED(AUTO_POWER_FANS) + FANS_LOOP(i) if (thermalManager.fan_speed[i]) return true; + #endif + + #if ENABLED(AUTO_POWER_E_FANS) + HOTEND_LOOP() if (thermalManager.autofan_speed[e]) return true; + #endif + + #if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) + if (controllerFan.state()) return true; + #endif + + if (TERN0(AUTO_POWER_CHAMBER_FAN, thermalManager.chamberfan_speed)) + return true; + + // 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 + #if HAS_X2_ENABLE + || X2_ENABLE_READ() == X_ENABLE_ON + #endif + #if HAS_Y2_ENABLE + || Y2_ENABLE_READ() == Y_ENABLE_ON + #endif + #if HAS_Z2_ENABLE + || Z2_ENABLE_READ() == Z_ENABLE_ON + #endif + #if E_STEPPERS + #define _OR_ENABLED_E(N) || E##N##_ENABLE_READ() == E_ENABLE_ON + REPEAT(E_STEPPERS, _OR_ENABLED_E) + #endif + ) 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; + #endif + + #if HAS_HEATED_CHAMBER && AUTO_POWER_CHAMBER_TEMP + if (thermalManager.degChamber() >= AUTO_POWER_CHAMBER_TEMP) return true; + #endif + + return false; +} + +void Power::check() { + static millis_t nextPowerCheck = 0; + millis_t ms = millis(); + if (ELAPSED(ms, nextPowerCheck)) { + nextPowerCheck = ms + 2500UL; + if (is_power_needed()) + power_on(); + else if (!lastPowerOn || ELAPSED(ms, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT))) + power_off(); + } +} + +void Power::power_on() { + lastPowerOn = millis(); + if (!powersupply_on) { + PSU_PIN_ON(); + safe_delay(PSU_POWERUP_DELAY); + restore_stepper_drivers(); + TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); + } +} + +void Power::power_off() { + if (powersupply_on) PSU_PIN_OFF(); +} + +#endif // AUTO_POWER_CONTROL diff --git a/Marlin/src/feature/power.h b/Marlin/src/feature/power.h new file mode 100644 index 00000000..8b988907 --- /dev/null +++ b/Marlin/src/feature/power.h @@ -0,0 +1,40 @@ +/** + * 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 + +/** + * power.h - power control + */ + +#include "../core/millis_t.h" + +class Power { + public: + static void check(); + static void power_on(); + static void power_off(); + private: + static millis_t lastPowerOn; + static bool is_power_needed(); +}; + +extern Power powerManager; diff --git a/Marlin/src/feature/power_monitor.cpp b/Marlin/src/feature/power_monitor.cpp new file mode 100644 index 00000000..af31d156 --- /dev/null +++ b/Marlin/src/feature/power_monitor.cpp @@ -0,0 +1,75 @@ +/** + * 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_POWER_MONITOR + +#include "power_monitor.h" + +#include "../lcd/ultralcd.h" +#include "../lcd/lcdprint.h" +#include "../libs/numtostr.h" + +uint8_t PowerMonitor::flags; // = 0 + +#if ENABLED(POWER_MONITOR_CURRENT) + pm_lpf_t PowerMonitor::amps; +#endif +#if ENABLED(POWER_MONITOR_VOLTAGE) + pm_lpf_t PowerMonitor::volts; +#endif + +millis_t PowerMonitor::display_item_ms; +uint8_t PowerMonitor::display_item; + +PowerMonitor power_monitor; // Single instance - this calls the constructor + +#if HAS_MARLINUI_U8GLIB + + #if ENABLED(POWER_MONITOR_CURRENT) + void PowerMonitor::draw_current() { + const float amps = getAmps(); + lcd_put_u8str(amps < 100 ? ftostr31ns(amps) : ui16tostr4rj((uint16_t)amps)); + lcd_put_wchar('A'); + } + #endif + + #if HAS_POWER_MONITOR_VREF + void PowerMonitor::draw_voltage() { + const float volts = getVolts(); + lcd_put_u8str(volts < 100 ? ftostr31ns(volts) : ui16tostr4rj((uint16_t)volts)); + lcd_put_wchar('V'); + } + #endif + + #if HAS_POWER_MONITOR_WATTS + void PowerMonitor::draw_power() { + const float power = getPower(); + lcd_put_u8str(power < 100 ? ftostr31ns(power) : ui16tostr4rj((uint16_t)power)); + lcd_put_wchar('W'); + } + #endif + +#endif // HAS_MARLINUI_U8GLIB + +#endif // HAS_POWER_MONITOR diff --git a/Marlin/src/feature/power_monitor.h b/Marlin/src/feature/power_monitor.h new file mode 100644 index 00000000..a0eaf353 --- /dev/null +++ b/Marlin/src/feature/power_monitor.h @@ -0,0 +1,142 @@ +/** + * 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" + +#define PM_SAMPLE_RANGE 1024 +#define PM_K_VALUE 6 +#define PM_K_SCALE 6 + +template +struct pm_lpf_t { + uint32_t filter_buf; + float value; + void add_sample(const uint16_t sample) { + 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)))) + (POWER_MONITOR_CURRENT_OFFSET); + } + void reset(uint16_t reset_value = 0) { + filter_buf = uint32_t(reset_value) << (K_VALUE + K_SCALE); + capture(); + } +}; + +class PowerMonitor { +private: + #if ENABLED(POWER_MONITOR_CURRENT) + static constexpr float amps_adc_scale = float(ADC_VREF) / (POWER_MONITOR_VOLTS_PER_AMP * PM_SAMPLE_RANGE); + static pm_lpf_t amps; + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + static constexpr float volts_adc_scale = float(ADC_VREF) / (POWER_MONITOR_VOLTS_PER_VOLT * PM_SAMPLE_RANGE); + static pm_lpf_t volts; + #endif + +public: + static uint8_t flags; // M430 flags to display current + + static millis_t display_item_ms; + static uint8_t display_item; + + PowerMonitor() { reset(); } + + enum PM_Display_Bit : uint8_t { + PM_DISP_BIT_I, // Current display enable bit + PM_DISP_BIT_V, // Voltage display enable bit + PM_DISP_BIT_P // Power display enable bit + }; + + #if ENABLED(POWER_MONITOR_CURRENT) + FORCE_INLINE static float getAmps() { return amps.value; } + void add_current_sample(const uint16_t value) { amps.add_sample(value); } + #endif + + #if HAS_POWER_MONITOR_VREF + #if ENABLED(POWER_MONITOR_VOLTAGE) + FORCE_INLINE static float getVolts() { return volts.value; } + #else + FORCE_INLINE static float getVolts() { return POWER_MONITOR_FIXED_VOLTAGE; } // using a specified fixed valtage as the voltage measurement + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + void add_voltage_sample(const uint16_t value) { volts.add_sample(value); } + #endif + #endif + + #if HAS_POWER_MONITOR_WATTS + FORCE_INLINE static float getPower() { return getAmps() * getVolts(); } + #endif + + #if HAS_WIRED_LCD + #if HAS_MARLINUI_U8GLIB && 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); } + FORCE_INLINE static void set_current_display(const bool b) { SET_BIT_TO(flags, PM_DISP_BIT_I, b); } + FORCE_INLINE static void toggle_current_display() { TBI(flags, PM_DISP_BIT_I); } + #endif + #if HAS_POWER_MONITOR_VREF + 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_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_P); } + #endif + #endif + + static void reset() { + flags = 0x00; + + #if ENABLED(POWER_MONITOR_CURRENT) + amps.reset(); + #endif + + #if ENABLED(POWER_MONITOR_VOLTAGE) + volts.reset(); + #endif + + #if ENABLED(SDSUPPORT) + display_item_ms = 0; + display_item = 0; + #endif + } + + static void capture_values() { + #if ENABLED(POWER_MONITOR_CURRENT) + amps.capture(); + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + volts.capture(); + #endif + } +}; + +extern PowerMonitor power_monitor; diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp new file mode 100644 index 00000000..e4bc605b --- /dev/null +++ b/Marlin/src/feature/powerloss.cpp @@ -0,0 +1,624 @@ +/** + * 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 . + * + */ + +/** + * feature/powerloss.cpp - Resume an SD print after power-loss + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + +#include "powerloss.h" +#include "../core/macros.h" + +bool PrintJobRecovery::enabled; // Initialized by settings.load() + +SdFile PrintJobRecovery::file; +job_recovery_info_t PrintJobRecovery::info; +const char PrintJobRecovery::filename[5] = "/PLR"; +uint8_t PrintJobRecovery::queue_index_r; +uint32_t PrintJobRecovery::cmd_sdpos, // = 0 + PrintJobRecovery::sdpos[BUFSIZE]; + +#if ENABLED(DWIN_CREALITY_LCD) + bool PrintJobRecovery::dwin_flag; // = false +#endif + +#include "../sd/cardreader.h" +#include "../lcd/ultralcd.h" +#include "../gcode/queue.h" +#include "../gcode/gcode.h" +#include "../module/motion.h" +#include "../module/planner.h" +#include "../module/printcounter.h" +#include "../module/temperature.h" +#include "../core/serial.h" + +#if ENABLED(FWRETRACT) + #include "fwretract.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_POWER_LOSS_RECOVERY) +#include "../core/debug_out.h" + +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 + +/** + * Clear the recovery info + */ +void PrintJobRecovery::init() { memset(&info, 0, sizeof(info)); } + +/** + * Enable or disable then call changed() + */ +void PrintJobRecovery::enable(const bool onoff) { + enabled = onoff; + changed(); +} + +/** + * The enabled state was changed: + * - Enabled: Purge the job recovery file + * - Disabled: Write the job recovery file + */ +void PrintJobRecovery::changed() { + if (!enabled) + purge(); + else if (IS_SD_PRINTING()) + save(true); +} + +/** + * Check for Print Job Recovery during setup() + * + * If a saved state exists send 'M1000 S' to initiate job recovery. + */ +void PrintJobRecovery::check() { + //if (!card.isMounted()) card.mount(); + if (card.isMounted()) { + load(); + if (!valid()) return cancel(); + queue.inject_P(PSTR("M1000S")); + } +} + +/** + * Delete the recovery file and clear the recovery data + */ +void PrintJobRecovery::purge() { + init(); + card.removeJobRecoveryFile(); +} + +/** + * Load the recovery data, if it exists + */ +void PrintJobRecovery::load() { + if (exists()) { + open(true); + (void)file.read(&info, sizeof(info)); + close(); + } + debug(PSTR("Load")); +} + +/** + * Set info fields that won't change + */ +void PrintJobRecovery::prepare() { + card.getAbsFilename(info.sd_filename); // SD filename + cmd_sdpos = 0; +} + +/** + * Save the current machine state to the power-loss recovery file + */ +void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/) { + + #if SAVE_INFO_INTERVAL_MS > 0 + static millis_t next_save_ms; // = 0 + millis_t ms = millis(); + #endif + + #ifndef POWER_LOSS_MIN_Z_CHANGE + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // Vase-mode-friendly out of the box + #endif + + // Did Z change since the last call? + if (force + #if DISABLED(SAVE_EACH_CMD_MODE) // Always save state when enabled + #if SAVE_INFO_INTERVAL_MS > 0 // Save if interval is elapsed + || ELAPSED(ms, next_save_ms) + #endif + // Save if Z is above the last-saved position by some minimum height + || current_position.z > info.current_position.z + POWER_LOSS_MIN_Z_CHANGE + #endif + ) { + + #if SAVE_INFO_INTERVAL_MS > 0 + next_save_ms = ms + SAVE_INFO_INTERVAL_MS; + #endif + + // Set Head and Foot to matching non-zero values + if (!++info.valid_head) ++info.valid_head; // non-zero in sequence + //if (!IS_SD_PRINTING()) info.valid_head = 0; + info.valid_foot = info.valid_head; + + // 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); + + #if HAS_MULTI_EXTRUDER + info.active_extruder = active_extruder; + #endif + + #if DISABLED(NO_VOLUMETRICS) + info.volumetric_enabled = parser.volumetric_enabled; + #if HAS_MULTI_EXTRUDER + for (int8_t e = 0; e < EXTRUDERS; e++) info.filament_size[e] = planner.filament_size[e]; + #else + if (parser.volumetric_enabled) info.filament_size[0] = planner.filament_size[active_extruder]; + #endif + #endif + + #if EXTRUDERS + HOTEND_LOOP() info.target_temperature[e] = thermalManager.temp_hotend[e].target; + #endif + + TERN_(HAS_HEATED_BED, info.target_temperature_bed = thermalManager.temp_bed.target); + + #if HAS_FAN + COPY(info.fan_speed, thermalManager.fan_speed); + #endif + + #if HAS_LEVELING + info.leveling = planner.leveling_active; + info.fade = TERN0(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height); + #endif + + TERN_(GRADIENT_MIX, memcpy(&info.gradient, &mixer.gradient, sizeof(info.gradient))); + + #if ENABLED(FWRETRACT) + COPY(info.retract, fwretract.current_retract); + info.retract_hop = fwretract.current_hop; + #endif + + // Relative axis modes + info.axis_relative = gcode.axis_relative; + + // Elapsed print job time + info.print_job_elapsed = print_job_timer.duration(); + + // Misc. Marlin flags + info.flag.dryrun = !!(marlin_debug_flags & MARLIN_DEBUG_DRYRUN); + info.flag.allow_cold_extrusion = TERN0(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude); + + write(); + } +} + +#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 retract_and_lift() + lock = true; + #endif + + #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 + + // Save, including the limited Z raise + if (IS_SD_PRINTING()) save(true, zraise); + + // 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(); + // With backup power a retract and raise can be done now + retract_and_lift(zraise); + #endif + + kill(GET_TEXT(MSG_OUTAGE_RECOVERY)); + } + +#endif + +/** + * Save the recovery info the recovery file + */ +void PrintJobRecovery::write() { + + debug(PSTR("Write")); + + open(false); + file.seekSet(0); + const int16_t ret = file.write(&info, sizeof(info)); + if (ret == -1) DEBUG_ECHOLNPGM("Power-loss file write failed."); + if (!file.close()) DEBUG_ECHOLNPGM("Power-loss file close failed."); +} + +/** + * Resume the saved print job + */ +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 + + // Apply the dry-run flag if enabled + if (info.flag.dryrun) marlin_debug_flags |= MARLIN_DEBUG_DRYRUN; + + // Restore cold extrusion permission + TERN_(PREVENT_COLD_EXTRUSION, thermalManager.allow_cold_extrude = info.flag.allow_cold_extrusion); + + #if HAS_LEVELING + // Make sure leveling is off before any G92 and G28 + gcode.process_subcommands_now_P(PSTR("M420 S0 Z0")); + #endif + + // Reset E, raise Z, home XY... + #if Z_HOME_DIR > 0 + + // If Z homing goes to max, just reset E and home all + gcode.process_subcommands_now_P(PSTR( + "G92.9 E0\n" + "G28R0" + )); + + #else // "G92.9 E0 ..." + + // 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.) + + 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); + + gcode.process_subcommands_now_P(PSTR( + "G28R0" // No raise during G28 + #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME) + "XY" // Don't home Z on Cartesian unless overridden + #endif + )); + + #endif + + // Pretend that all axes are homed + set_all_homed(); + + #if ENABLED(POWER_LOSS_RECOVER_ZHOME) + // Z has been homed so restore Z to ZsavedPos + POWER_LOSS_ZRAISE + sprintf_P(cmd, PSTR("G1 F500 Z%s"), dtostrf(info.current_position.z + POWER_LOSS_ZRAISE, 1, 3, str_1)); + gcode.process_subcommands_now(cmd); + #endif + + // Recover volumetric extrusion state + #if DISABLED(NO_VOLUMETRICS) + #if HAS_MULTI_EXTRUDER + for (int8_t e = 0; e < EXTRUDERS; e++) { + 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) { + sprintf_P(cmd, PSTR("M200 T%i D0"), info.active_extruder); + gcode.process_subcommands_now(cmd); + } + #else + if (info.volumetric_enabled) { + sprintf_P(cmd, PSTR("M200 D%s"), dtostrf(info.filament_size[0], 1, 3, str_1)); + gcode.process_subcommands_now(cmd); + } + #endif + #endif + + #if HAS_HEATED_BED + const int16_t bt = info.target_temperature_bed; + if (bt) { + // Restore the bed temperature + sprintf_P(cmd, PSTR("M190 S%i"), bt); + gcode.process_subcommands_now(cmd); + } + #endif + + // Restore all hotend temperatures + #if HAS_HOTEND + HOTEND_LOOP() { + const int16_t et = info.target_temperature[e]; + if (et) { + #if HAS_MULTI_HOTEND + sprintf_P(cmd, PSTR("T%i S"), e); + gcode.process_subcommands_now(cmd); + #endif + sprintf_P(cmd, PSTR("M109 S%i"), et); + gcode.process_subcommands_now(cmd); + } + } + #endif + + // Select the previously active tool (with no_move) + #if HAS_MULTI_EXTRUDER + 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]; + if (f) { + sprintf_P(cmd, PSTR("M106 P%i S%i"), i, f); + gcode.process_subcommands_now(cmd); + } + } + + // Restore retract and hop state + #if ENABLED(FWRETRACT) + LOOP_L_N(e, EXTRUDERS) { + if (info.retract[e] != 0.0) { + fwretract.current_retract[e] = info.retract[e]; + fwretract.retracted[e] = true; + } + } + fwretract.current_hop = info.retract_hop; + #endif + + #if HAS_LEVELING + // Restore leveling state before 'G92 Z' to ensure + // the Z stepper count corresponds to the native Z. + if (info.fade || info.leveling) { + sprintf_P(cmd, PSTR("M420 S%i Z%s"), int(info.leveling), dtostrf(info.fade, 1, 1, str_1)); + gcode.process_subcommands_now(cmd); + } + #endif + + #if ENABLED(GRADIENT_MIX) + memcpy(&mixer.gradient, &info.gradient, sizeof(info.gradient)); + #endif + + // 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 + + // 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), + dtostrf(info.current_position.y, 1, 3, str_2) + ); + gcode.process_subcommands_now(cmd); + + // Move back to the saved Z + dtostrf(info.current_position.z, 1, 3, str_1); + #if Z_HOME_DIR > 0 || ENABLED(POWER_LOSS_RECOVER_ZHOME) + sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1); + #else + gcode.process_subcommands_now_P(PSTR("G1 Z0 F200")); + sprintf_P(cmd, PSTR("G92.9 Z%s"), str_1); + #endif + gcode.process_subcommands_now(cmd); + + // Restore the feedrate + sprintf_P(cmd, PSTR("G1 F%d"), info.feedrate); + gcode.process_subcommands_now(cmd); + + // Restore E position with G92.9 + sprintf_P(cmd, PSTR("G92.9 E%s"), dtostrf(info.current_position.e, 1, 3, str_1)); + gcode.process_subcommands_now(cmd); + + // Relative axis modes + gcode.axis_relative = info.axis_relative; + + TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset); + TERN_(HAS_POSITION_SHIFT, position_shift = info.position_shift); + #if HAS_HOME_OFFSET || HAS_POSITION_SHIFT + LOOP_XYZ(i) update_workspace_offset((AxisEnum)i); + #endif + + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + const uint8_t old_flags = marlin_debug_flags; + marlin_debug_flags |= MARLIN_DEBUG_ECHO; + #endif + + // Continue to apply PLR when a file is resumed! + enable(true); + + // Resume the SD file from the last position + char *fn = info.sd_filename; + extern const char M23_STR[]; + sprintf_P(cmd, M23_STR, fn); + gcode.process_subcommands_now(cmd); + sprintf_P(cmd, PSTR("M24 S%ld T%ld"), resume_sdpos, info.print_job_elapsed); + gcode.process_subcommands_now(cmd); + + TERN_(DEBUG_POWER_LOSS_RECOVERY, marlin_debug_flags = old_flags); +} + +#if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + + void PrintJobRecovery::debug(PGM_P const prefix) { + DEBUG_PRINT_P(prefix); + DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", int(info.valid_head), " valid_foot:", int(info.valid_foot)); + if (info.valid_head) { + if (info.valid_head == info.valid_foot) { + DEBUG_ECHOPGM("current_position: "); + LOOP_XYZE(i) { + if (i) DEBUG_CHAR(','); + DEBUG_DECIMAL(info.current_position[i]); + } + DEBUG_EOL(); + + DEBUG_ECHOLNPAIR("zraise: ", info.zraise); + + #if HAS_HOME_OFFSET + DEBUG_ECHOPGM("home_offset: "); + LOOP_XYZ(i) { + if (i) DEBUG_CHAR(','); + DEBUG_DECIMAL(info.home_offset[i]); + } + DEBUG_EOL(); + #endif + + #if HAS_POSITION_SHIFT + DEBUG_ECHOPGM("position_shift: "); + LOOP_XYZ(i) { + if (i) DEBUG_CHAR(','); + DEBUG_DECIMAL(info.position_shift[i]); + } + DEBUG_EOL(); + #endif + + DEBUG_ECHOLNPAIR("feedrate: ", info.feedrate); + + #if HAS_MULTI_EXTRUDER + DEBUG_ECHOLNPAIR("active_extruder: ", int(info.active_extruder)); + #endif + + #if HAS_HOTEND + DEBUG_ECHOPGM("target_temperature: "); + HOTEND_LOOP() { + DEBUG_ECHO(info.target_temperature[e]); + if (e < HOTENDS - 1) DEBUG_CHAR(','); + } + DEBUG_EOL(); + #endif + + #if HAS_HEATED_BED + DEBUG_ECHOLNPAIR("target_temperature_bed: ", info.target_temperature_bed); + #endif + + #if HAS_FAN + DEBUG_ECHOPGM("fan_speed: "); + FANS_LOOP(i) { + DEBUG_ECHO(int(info.fan_speed[i])); + if (i < FAN_COUNT - 1) DEBUG_CHAR(','); + } + DEBUG_EOL(); + #endif + + #if HAS_LEVELING + DEBUG_ECHOLNPAIR("leveling: ", int(info.leveling), " fade: ", info.fade); + #endif + #if ENABLED(FWRETRACT) + DEBUG_ECHOPGM("retract: "); + for (int8_t e = 0; e < EXTRUDERS; e++) { + DEBUG_ECHO(info.retract[e]); + if (e < EXTRUDERS - 1) DEBUG_CHAR(','); + } + DEBUG_EOL(); + DEBUG_ECHOLNPAIR("retract_hop: ", info.retract_hop); + #endif + DEBUG_ECHOLNPAIR("sd_filename: ", info.sd_filename); + DEBUG_ECHOLNPAIR("sdpos: ", info.sdpos); + DEBUG_ECHOLNPAIR("print_job_elapsed: ", info.print_job_elapsed); + DEBUG_ECHOLNPAIR("dryrun: ", int(info.flag.dryrun)); + DEBUG_ECHOLNPAIR("allow_cold_extrusion: ", int(info.flag.allow_cold_extrusion)); + } + else + DEBUG_ECHOLNPGM("INVALID DATA"); + } + DEBUG_ECHOLNPGM("---"); + } + +#endif // DEBUG_POWER_LOSS_RECOVERY + +#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h new file mode 100644 index 00000000..e31b2ec9 --- /dev/null +++ b/Marlin/src/feature/powerloss.h @@ -0,0 +1,206 @@ +/** + * 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 + +/** + * feature/powerloss.h - Resume an SD print after power-loss + */ + +#include "../sd/cardreader.h" +#include "../gcode/gcode.h" + +#include "../inc/MarlinConfig.h" + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" +#endif + +#if !defined(POWER_LOSS_STATE) && PIN_EXISTS(POWER_LOSS) + #define POWER_LOSS_STATE HIGH +#endif + +//#define DEBUG_POWER_LOSS_RECOVERY +//#define SAVE_EACH_CMD_MODE +//#define SAVE_INFO_INTERVAL_MS 0 + +typedef struct { + uint8_t valid_head; + + // Machine state + xyze_pos_t current_position; + float zraise; + + #if HAS_HOME_OFFSET + xyz_pos_t home_offset; + #endif + #if HAS_POSITION_SHIFT + xyz_pos_t position_shift; + #endif + + uint16_t feedrate; + + #if HAS_MULTI_EXTRUDER + uint8_t active_extruder; + #endif + + #if DISABLED(NO_VOLUMETRICS) + bool volumetric_enabled; + float filament_size[EXTRUDERS]; + #endif + + #if HAS_HOTEND + int16_t target_temperature[HOTENDS]; + #endif + + #if HAS_HEATED_BED + int16_t target_temperature_bed; + #endif + + #if HAS_FAN + uint8_t fan_speed[FAN_COUNT]; + #endif + + #if HAS_LEVELING + bool leveling; + float fade; + #endif + + #if ENABLED(FWRETRACT) + float retract[EXTRUDERS], retract_hop; + #endif + + // Mixing extruder and gradient + #if ENABLED(MIXING_EXTRUDER) + //uint_fast8_t selected_vtool; + //mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; + #if ENABLED(GRADIENT_MIX) + gradient_t gradient; + #endif + #endif + + // Relative axis modes + uint8_t axis_relative; + + // SD Filename and position + char sd_filename[MAXPATHNAMELENGTH]; + volatile uint32_t sdpos; + + // Job elapsed time + millis_t print_job_elapsed; + + // Misc. Marlin flags + struct { + bool dryrun:1; // M111 S8 + bool allow_cold_extrusion:1; // M302 P1 + } flag; + + uint8_t valid_foot; + + bool valid() { return valid_head && valid_head == valid_foot; } + +} job_recovery_info_t; + +class PrintJobRecovery { + public: + static const char filename[5]; + + static SdFile file; + static job_recovery_info_t info; + + static uint8_t queue_index_r; //!< Queue index of the active command + static uint32_t cmd_sdpos, //!< SD position of the next command + sdpos[BUFSIZE]; //!< SD positions of queued commands + + #if ENABLED(DWIN_CREALITY_LCD) + static bool dwin_flag; + #endif + + static void init(); + static void prepare(); + + static inline void setup() { + #if PIN_EXISTS(POWER_LOSS) + #if ENABLED(POWER_LOSS_PULL) + #if POWER_LOSS_STATE == LOW + SET_INPUT_PULLUP(POWER_LOSS_PIN); + #else + SET_INPUT_PULLDOWN(POWER_LOSS_PIN); + #endif + #else + SET_INPUT(POWER_LOSS_PIN); + #endif + #endif + } + + // Track each command's file offsets + static inline uint32_t command_sdpos() { return sdpos[queue_index_r]; } + static inline void commit_sdpos(const uint8_t index_w) { sdpos[index_w] = cmd_sdpos; } + + static bool enabled; + static void enable(const bool onoff); + static void changed(); + + static inline bool exists() { return card.jobRecoverFileExists(); } + static inline void open(const bool read) { card.openJobRecoveryFile(read); } + static inline void close() { file.close(); } + + static void check(); + static void resume(); + static void purge(); + + static inline void cancel() { purge(); card.autostart_index = 0; } + + static void load(); + 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 + + // The referenced file exists + static inline bool interrupted_file_exists() { return card.fileExists(info.sd_filename); } + + static inline bool valid() { return info.valid() && interrupted_file_exists(); } + + #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 retract_and_lift(const float &zraise); + #endif + + #if PIN_EXISTS(POWER_LOSS) + friend class GcodeSuite; + static void _outage(); + #endif +}; + +extern PrintJobRecovery recovery; diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp new file mode 100644 index 00000000..af8039d8 --- /dev/null +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -0,0 +1,240 @@ +/** + * 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(PROBE_TEMP_COMPENSATION) + +#include "probe_temp_comp.h" +#include + +ProbeTempComp temp_comp; + +int16_t ProbeTempComp::z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // = {0} + ProbeTempComp::z_offsets_bed[cali_info_init[TSI_BED].measurements]; // = {0} + +#if ENABLED(USE_TEMP_EXT_COMPENSATION) + int16_t ProbeTempComp::z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // = {0} +#endif + +int16_t *ProbeTempComp::sensor_z_offsets[TSI_COUNT] = { + ProbeTempComp::z_offsets_probe, ProbeTempComp::z_offsets_bed + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + , ProbeTempComp::z_offsets_ext + #endif +}; + +const temp_calib_t ProbeTempComp::cali_info[TSI_COUNT] = { + cali_info_init[TSI_PROBE], cali_info_init[TSI_BED] + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + , cali_info_init[TSI_EXT] + #endif +}; + +constexpr xyz_pos_t ProbeTempComp::park_point; +constexpr xy_pos_t ProbeTempComp::measure_point; +constexpr int ProbeTempComp::probe_calib_bed_temp; + +uint8_t ProbeTempComp::calib_idx; // = 0 +float ProbeTempComp::init_measurement; // = 0.0 + +void ProbeTempComp::clear_offsets(const TempSensorID tsi) { + LOOP_L_N(i, cali_info[tsi].measurements) + sensor_z_offsets[tsi][i] = 0; + calib_idx = 0; +} + +bool ProbeTempComp::set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset) { + if (idx >= cali_info[tsi].measurements) return false; + sensor_z_offsets[tsi][idx] = offset; + return true; +} + +void ProbeTempComp::print_offsets() { + LOOP_L_N(s, TSI_COUNT) { + float temp = cali_info[s].start_temp; + for (int16_t i = -1; i < cali_info[s].measurements; ++i) { + serialprintPGM(s == TSI_BED ? PSTR("Bed") : + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + s == TSI_EXT ? PSTR("Extruder") : + #endif + PSTR("Probe") + ); + SERIAL_ECHOLNPAIR( + " temp: ", temp, + "C; Offset: ", i < 0 ? 0.0f : sensor_z_offsets[s][i], " um" + ); + temp += cali_info[s].temp_res; + } + } +} + +void ProbeTempComp::prepare_new_calibration(const float &init_meas_z) { + calib_idx = 0; + init_measurement = init_meas_z; +} + +void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const float &meas_z) { + switch (tsi) { + case TSI_PROBE: + case TSI_BED: + //case TSI_EXT: + if (calib_idx >= cali_info[tsi].measurements) return; + sensor_z_offsets[tsi][calib_idx++] = static_cast(meas_z * 1000.0f - init_measurement * 1000.0f); + default: break; + } +} + +bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { + if (tsi != TSI_PROBE && tsi != TSI_BED) return false; + + if (calib_idx < 3) { + SERIAL_ECHOLNPGM("!Insufficient measurements (min. 3)."); + clear_offsets(tsi); + return false; + } + + const uint8_t measurements = cali_info[tsi].measurements; + const float start_temp = cali_info[tsi].start_temp, + res_temp = cali_info[tsi].temp_res; + int16_t * const data = sensor_z_offsets[tsi]; + + // Extrapolate + float k, d; + if (calib_idx < measurements) { + SERIAL_ECHOLNPAIR("Got ", calib_idx, " measurements. "); + if (linear_regression(tsi, k, d)) { + SERIAL_ECHOPGM("Applying linear extrapolation"); + calib_idx--; + for (; calib_idx < measurements; ++calib_idx) { + const float temp = start_temp + float(calib_idx) * res_temp; + data[calib_idx] = static_cast(k * temp + d); + } + } + else { + // Simply use the last measured value for higher temperatures + SERIAL_ECHOPGM("Failed to extrapolate"); + const int16_t last_val = data[calib_idx]; + for (; calib_idx < measurements; ++calib_idx) + data[calib_idx] = last_val; + } + SERIAL_ECHOLNPGM(" for higher temperatures."); + } + + // Sanity check + for (calib_idx = 0; calib_idx < measurements; ++calib_idx) { + // Restrict the max. offset + if (abs(data[calib_idx]) > 2000) { + SERIAL_ECHOLNPGM("!Invalid Z-offset detected (0-2)."); + clear_offsets(tsi); + return false; + } + // Restrict the max. offset difference between two probings + if (calib_idx > 0 && abs(data[calib_idx - 1] - data[calib_idx]) > 800) { + SERIAL_ECHOLNPGM("!Invalid Z-offset between two probings detected (0-0.8)."); + clear_offsets(TSI_PROBE); + return false; + } + } + + return true; +} + +void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z) { + if (WITHIN(temp, cali_info[tsi].start_temp, cali_info[tsi].end_temp)) + meas_z -= get_offset_for_temperature(tsi, temp); +} + +float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const float &temp) { + const uint8_t measurements = cali_info[tsi].measurements; + const float start_temp = cali_info[tsi].start_temp, + res_temp = cali_info[tsi].temp_res; + const int16_t * const data = sensor_z_offsets[tsi]; + + auto point = [&](uint8_t i) { + return xy_float_t({start_temp + i*res_temp, static_cast(data[i])}); + }; + + auto linear_interp = [](float x, xy_float_t p1, xy_float_t p2) { + return (p2.y - p1.y) / (p2.x - p2.y) * (x - p1.x) + p1.y; + }; + + // Linear interpolation + uint8_t idx = static_cast((temp - start_temp) / res_temp); + + // offset in um + float offset = 0.0f; + + #if !defined(PTC_LINEAR_EXTRAPOLATION) || PTC_LINEAR_EXTRAPOLATION <= 0 + if (idx < 0) + offset = 0.0f; + else if (idx > measurements - 2) + offset = static_cast(data[measurements - 1]); + #else + if (idx < 0) + offset = linear_interp(temp, point(0), point(PTC_LINEAR_EXTRAPOLATION)); + else if (idx > measurements - 2) + offset = linear_interp(temp, point(measurements - PTC_LINEAR_EXTRAPOLATION - 1), point(measurements - 1)); + #endif + else + offset = linear_interp(temp, point(idx), point(idx + 1)); + + // return offset in mm + return offset / 1000.0f; +} + +bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d) { + if (tsi != TSI_PROBE && tsi != TSI_BED) return false; + + if (!WITHIN(calib_idx, 2, cali_info[tsi].measurements)) return false; + + const float start_temp = cali_info[tsi].start_temp, + res_temp = cali_info[tsi].temp_res; + const int16_t * const data = sensor_z_offsets[tsi]; + + float sum_x = start_temp, + sum_x2 = sq(start_temp), + sum_xy = 0, sum_y = 0; + + LOOP_L_N(i, calib_idx) { + const float xi = start_temp + (i + 1) * res_temp, + yi = static_cast(data[i]); + sum_x += xi; + sum_x2 += sq(xi); + sum_xy += xi * yi; + sum_y += yi; + } + + const float denom = static_cast(calib_idx + 1) * sum_x2 - sq(sum_x); + if (fabs(denom) <= 10e-5) { + // Singularity - unable to solve + k = d = 0.0; + return false; + } + + k = (static_cast(calib_idx + 1) * sum_xy - sum_x * sum_y) / denom; + d = (sum_y - k * sum_x) / static_cast(calib_idx + 1); + + return true; +} + +#endif // PROBE_TEMP_COMPENSATION diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h new file mode 100644 index 00000000..626dd87f --- /dev/null +++ b/Marlin/src/feature/probe_temp_comp.h @@ -0,0 +1,147 @@ +/** + * 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" + +enum TempSensorID : uint8_t { + TSI_PROBE, + TSI_BED, + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + TSI_EXT, + #endif + TSI_COUNT +}; + +typedef struct { + uint8_t measurements; // Max. number of measurements to be stored (35 - 80°C) + float temp_res, // Resolution in °C between measurements + start_temp, // Base measurement; z-offset == 0 + end_temp; +} temp_calib_t; + +/** + * Probe temperature compensation implementation. + * Z-probes like the P.I.N.D.A V2 allow for compensation of + * measurement errors/shifts due to changed temperature. + */ + +// Probe temperature calibration constants +#ifndef PTC_SAMPLE_COUNT + #define PTC_SAMPLE_COUNT 10U +#endif +#ifndef PTC_SAMPLE_RES + #define PTC_SAMPLE_RES 5.0f +#endif +#ifndef PTC_SAMPLE_START + #define PTC_SAMPLE_START 30.0f +#endif +#define PTC_SAMPLE_END ((PTC_SAMPLE_START) + (PTC_SAMPLE_COUNT) * (PTC_SAMPLE_RES)) + +// Bed temperature calibration constants +#ifndef BTC_PROBE_TEMP + #define BTC_PROBE_TEMP 30.0f +#endif +#ifndef BTC_SAMPLE_COUNT + #define BTC_SAMPLE_COUNT 10U +#endif +#ifndef BTC_SAMPLE_STEP + #define BTC_SAMPLE_RES 5.0f +#endif +#ifndef BTC_SAMPLE_START + #define BTC_SAMPLE_START 60.0f +#endif +#define BTC_SAMPLE_END ((BTC_SAMPLE_START) + (BTC_SAMPLE_COUNT) * (BTC_SAMPLE_RES)) + +#ifndef PTC_PROBE_HEATING_OFFSET + #define PTC_PROBE_HEATING_OFFSET 0.5f +#endif + +#ifndef PTC_PROBE_RAISE + #define PTC_PROBE_RAISE 10.0f +#endif + +static constexpr temp_calib_t cali_info_init[TSI_COUNT] = { + { PTC_SAMPLE_COUNT, PTC_SAMPLE_RES, PTC_SAMPLE_START, PTC_SAMPLE_END }, // Probe + { BTC_SAMPLE_COUNT, BTC_SAMPLE_RES, BTC_SAMPLE_START, BTC_SAMPLE_END }, // Bed + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + { 20, 5, 180, 180 + 5 * 20 } // Extruder + #endif +}; + +class ProbeTempComp { + public: + + static const temp_calib_t cali_info[TSI_COUNT]; + + // Where to park nozzle to wait for probe cooldown + static constexpr xyz_pos_t park_point = PTC_PARK_POS; + + // XY coordinates of nozzle for probing the bed + static constexpr xy_pos_t measure_point = PTC_PROBE_POS; // Coordinates to probe + //measure_point = { 12.0f, 7.3f }; // Coordinates for the MK52 magnetic heatbed + + static constexpr int probe_calib_bed_temp = BED_MAX_TARGET, // Bed temperature while calibrating probe + bed_calib_probe_temp = BTC_PROBE_TEMP; // Probe temperature while calibrating bed + + static int16_t *sensor_z_offsets[TSI_COUNT], + z_offsets_probe[cali_info_init[TSI_PROBE].measurements], // (µm) + z_offsets_bed[cali_info_init[TSI_BED].measurements]; // (µm) + + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + static int16_t z_offsets_ext[cali_info_init[TSI_EXT].measurements]; // (µm) + #endif + + static inline void reset_index() { calib_idx = 0; }; + static inline uint8_t get_index() { return calib_idx; } + static void clear_offsets(const TempSensorID tsi); + static inline void clear_all_offsets() { + clear_offsets(TSI_BED); + clear_offsets(TSI_PROBE); + TERN_(USE_TEMP_EXT_COMPENSATION, clear_offsets(TSI_EXT)); + } + static bool set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset); + static void print_offsets(); + static void prepare_new_calibration(const float &init_meas_z); + static void push_back_new_measurement(const TempSensorID tsi, const float &meas_z); + static bool finish_calibration(const TempSensorID tsi); + static void compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z); + + private: + static uint8_t calib_idx; + + /** + * Base value. Temperature compensation values will be deltas + * to this value, set at first probe. + */ + static float init_measurement; + + static float get_offset_for_temperature(const TempSensorID tsi, const float &temp); + + /** + * Fit a linear function in measured temperature offsets + * to allow generating values of higher temperatures. + */ + static bool linear_regression(const TempSensorID tsi, float &k, float &d); +}; + +extern ProbeTempComp temp_comp; diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp new file mode 100644 index 00000000..71f31f21 --- /dev/null +++ b/Marlin/src/feature/runout.cpp @@ -0,0 +1,139 @@ +/** + * 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 . + * + */ + +/** + * feature/runout.cpp - Runout sensor support + */ + +#include "../inc/MarlinConfigPre.h" + +#if HAS_FILAMENT_SENSOR + +#include "runout.h" + +FilamentMonitor runout; + +bool FilamentMonitorBase::enabled = true, + FilamentMonitorBase::filament_ran_out; // = false + +#if ENABLED(HOST_ACTION_COMMANDS) + bool FilamentMonitorBase::host_handling; // = false +#endif + +#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + //#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE + #include "../module/tool_change.h" +#endif + +#if HAS_FILAMENT_RUNOUT_DISTANCE + float RunoutResponseDelayed::runout_distance_mm = FILAMENT_RUNOUT_DISTANCE_MM; + volatile float RunoutResponseDelayed::runout_mm_countdown[EXTRUDERS]; + #if ENABLED(FILAMENT_MOTION_SENSOR) + uint8_t FilamentSensorEncoder::motion_detected; + #endif +#else + int8_t RunoutResponseDebounced::runout_count; // = 0 +#endif + +// +// Filament Runout event handler +// +#include "../MarlinCore.h" +#include "../gcode/queue.h" + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "host_actions.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +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) { + #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())); + + #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) + const char tool = '0' + #if NUM_RUNOUT_SENSORS > 1 + + active_extruder + #endif + ; + #endif + + //action:out_of_filament + #if ENABLED(HOST_PROMPT_SUPPORT) + host_action_prompt_begin(PROMPT_FILAMENT_RUNOUT, PSTR("FilamentRunout T"), tool); + host_action_prompt_show(); + #endif + + const bool run_runout_script = !runout.host_handling; + + #if ENABLED(HOST_ACTION_COMMANDS) + if (run_runout_script + && ( strstr(FILAMENT_RUNOUT_SCRIPT, "M600") + || strstr(FILAMENT_RUNOUT_SCRIPT, "M125") + #if ENABLED(ADVANCED_PAUSE_FEATURE) + || strstr(FILAMENT_RUNOUT_SCRIPT, "M25") + #endif + ) + ) { + host_action_paused(false); + } + else { + // Legacy Repetier command for use until newer version supports standard dialog + // To be removed later when pause command also triggers dialog + #ifdef ACTION_ON_FILAMENT_RUNOUT + host_action(PSTR(ACTION_ON_FILAMENT_RUNOUT " T"), false); + SERIAL_CHAR(tool); + SERIAL_EOL(); + #endif + + host_action_pause(false); + } + SERIAL_ECHOPGM(" " ACTION_REASON_ON_FILAMENT_RUNOUT " "); + SERIAL_CHAR(tool); + SERIAL_EOL(); + #endif // HOST_ACTION_COMMANDS + + if (run_runout_script) + queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); +} + +#endif // HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h new file mode 100644 index 00000000..a7f83668 --- /dev/null +++ b/Marlin/src/feature/runout.h @@ -0,0 +1,337 @@ +/** + * 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 + +/** + * feature/runout.h - Runout sensor support + */ + +#include "../sd/cardreader.h" +#include "../module/printcounter.h" +#include "../module/planner.h" +#include "../module/stepper.h" // for block_t +#include "../gcode/queue.h" + +#include "../inc/MarlinConfig.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "pause.h" +#endif + +//#define FILAMENT_RUNOUT_SENSOR_DEBUG +#ifndef FILAMENT_RUNOUT_THRESHOLD + #define FILAMENT_RUNOUT_THRESHOLD 5 +#endif + +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; + + #if ENABLED(HOST_ACTION_COMMANDS) + static bool host_handling; + #else + static constexpr bool host_handling = false; + #endif +}; + +template +class TFilamentMonitor : public FilamentMonitorBase { + private: + typedef RESPONSE_T response_t; + typedef SENSOR_T sensor_t; + static response_t response; + static sensor_t sensor; + + public: + static inline void setup() { + sensor.setup(); + reset(); + } + + static inline void reset() { + filament_ran_out = false; + response.reset(); + } + + // Call this method when filament is present, + // so the response can reset its counter. + static inline void filament_present(const uint8_t extruder) { + response.filament_present(extruder); + } + + #if HAS_FILAMENT_RUNOUT_DISTANCE + static inline float& runout_distance() { return response.runout_distance_mm; } + static inline void set_runout_distance(const float &mm) { response.runout_distance_mm = mm; } + #endif + + // Handle a block completion. RunoutResponseDelayed uses this to + // add up the length of filament moved while the filament is out. + static inline void block_completed(const block_t* const b) { + if (enabled) { + response.block_completed(b); + sensor.block_completed(b); + } + } + + // Give the response a chance to update its counter. + static inline void run() { + if ( enabled && !filament_ran_out + && (printingIsActive() || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print)) + ) { + TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here + response.run(); + sensor.run(); + const bool ran_out = response.has_run_out(); + TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, sei()); + if (ran_out) { + filament_ran_out = true; + event_filament_runout(); + planner.synchronize(); + } + } + } +}; + +/*************************** FILAMENT PRESENCE SENSORS ***************************/ + +class FilamentSensorBase { + protected: + /** + * 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() { + #if ENABLED(FIL_RUNOUT_PULLUP) + #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLUP(P) + #elif ENABLED(FIL_RUNOUT_PULLDOWN) + #define INIT_RUNOUT_PIN(P) SET_INPUT_PULLDOWN(P) + #else + #define INIT_RUNOUT_PIN(P) SET_INPUT(P) + #endif + + #define _INIT_RUNOUT(N) INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN); + REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _INIT_RUNOUT) + #undef _INIT_RUNOUT + #undef INIT_RUNOUT_PIN + } + + // Return a bitmask of runout pin states + static inline uint8_t poll_runout_pins() { + #define _OR_RUNOUT(N) | (READ(FIL_RUNOUT##N##_PIN) ? _BV((N) - 1) : 0) + return (0 REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _OR_RUNOUT)); + #undef _OR_RUNOUT + } + + // Return a bitmask of runout flag states (1 bits always indicates runout) + static inline uint8_t poll_runout_states() { + return poll_runout_pins() + #if FIL_RUNOUT_STATE == LOW + ^ uint8_t(_BV(NUM_RUNOUT_SENSORS) - 1) + #endif + ; + } +}; + +#if ENABLED(FILAMENT_MOTION_SENSOR) + + /** + * This sensor uses a magnetic encoder disc and a Hall effect + * sensor (or a slotted disc and optical sensor). The state + * will toggle between 0 and 1 on filament movement. It can detect + * filament runout and stripouts or jams. + */ + class FilamentSensorEncoder : public FilamentSensorBase { + private: + static uint8_t motion_detected; + + static inline void poll_motion_sensor() { + static uint8_t old_state; + const uint8_t new_state = poll_runout_pins(), + change = old_state ^ new_state; + old_state = new_state; + + #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + if (change) { + SERIAL_ECHOPGM("Motion detected:"); + LOOP_L_N(e, NUM_RUNOUT_SENSORS) + if (TEST(change, e)) SERIAL_CHAR(' ', '0' + e); + SERIAL_EOL(); + } + #endif + + motion_detected |= change; + } + + public: + static inline void block_completed(const block_t* const b) { + // If the sensor wheel has moved since the last call to + // this method reset the runout counter for the extruder. + if (TEST(motion_detected, b->extruder)) + filament_present(b->extruder); + + // Clear motion triggers for next block + motion_detected = 0; + } + + static inline void run() { poll_motion_sensor(); } + }; + +#else + + /** + * This is a simple endstop switch in the path of the filament. + * It can detect filament runout, but not stripouts or jams. + */ + class FilamentSensorSwitch : public FilamentSensorBase { + private: + static inline bool poll_runout_state(const uint8_t extruder) { + const uint8_t runout_states = poll_runout_states(); + #if NUM_RUNOUT_SENSORS == 1 + UNUSED(extruder); + #else + if ( !TERN0(DUAL_X_CARRIAGE, dxc_is_duplicating()) + && !TERN0(MULTI_NOZZLE_DUPLICATION, extruder_duplication_enabled) + ) return TEST(runout_states, extruder); // A specific extruder ran out + #endif + return !!runout_states; // Any extruder ran out + } + + public: + static inline void block_completed(const block_t* const) {} + + static inline void run() { + const bool out = poll_runout_state(active_extruder); + if (!out) filament_present(active_extruder); + #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + static bool was_out = false; + if (out != was_out) { + was_out = out; + SERIAL_ECHOPGM("Filament "); + serialprintPGM(out ? PSTR("OUT\n") : PSTR("IN\n")); + } + #endif + } + }; + + +#endif // !FILAMENT_MOTION_SENSOR + +/********************************* RESPONSE TYPE *********************************/ + +#if HAS_FILAMENT_RUNOUT_DISTANCE + + // RunoutResponseDelayed triggers a runout event only if the length + // of filament specified by FILAMENT_RUNOUT_DISTANCE_MM has been fed + // during a runout condition. + class RunoutResponseDelayed { + private: + static volatile float runout_mm_countdown[EXTRUDERS]; + + public: + static float runout_distance_mm; + + static inline void reset() { + LOOP_L_N(i, EXTRUDERS) filament_present(i); + } + + static inline void run() { + #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + static millis_t t = 0; + const millis_t ms = millis(); + if (ELAPSED(ms, t)) { + t = millis() + 1000UL; + LOOP_L_N(i, EXTRUDERS) { + serialprintPGM(i ? PSTR(", ") : PSTR("Remaining mm: ")); + SERIAL_ECHO(runout_mm_countdown[i]); + } + SERIAL_EOL(); + } + #endif + } + + static inline bool has_run_out() { + return runout_mm_countdown[active_extruder] < 0; + } + + static inline void filament_present(const uint8_t extruder) { + runout_mm_countdown[extruder] = runout_distance_mm; + } + + static inline void block_completed(const block_t* const b) { + if (b->steps.x || b->steps.y || b->steps.z + || TERN0(ADVANCED_PAUSE_FEATURE, did_pause_print) // Allow pause purge move to re-trigger runout state + ) { + // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. + const uint8_t e = b->extruder; + const int32_t steps = b->steps.e; + runout_mm_countdown[e] -= (TEST(b->direction_bits, E_AXIS) ? -steps : steps) * planner.steps_to_mm[E_AXIS_N(e)]; + } + } + }; + +#else // !HAS_FILAMENT_RUNOUT_DISTANCE + + // RunoutResponseDebounced triggers a runout event after a runout + // condition has been detected runout_threshold times in a row. + + class RunoutResponseDebounced { + private: + static constexpr int8_t runout_threshold = FILAMENT_RUNOUT_THRESHOLD; + static int8_t runout_count; + public: + static inline void reset() { runout_count = runout_threshold; } + static inline void run() { if (runout_count >= 0) runout_count--; } + static inline bool has_run_out() { return runout_count < 0; } + static inline void block_completed(const block_t* const) { } + static inline void filament_present(const uint8_t) { runout_count = runout_threshold; } + }; + +#endif // !HAS_FILAMENT_RUNOUT_DISTANCE diff --git a/Marlin/src/feature/snmm.cpp b/Marlin/src/feature/snmm.cpp new file mode 100644 index 00000000..25723f7b --- /dev/null +++ b/Marlin/src/feature/snmm.cpp @@ -0,0 +1,38 @@ +/** + * 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(MK2_MULTIPLEXER) + +#include "../module/stepper.h" + +void select_multiplexed_stepper(const uint8_t e) { + planner.synchronize(); + disable_e_steppers(); + WRITE(E_MUX0_PIN, TEST(e, 0) ? HIGH : LOW); + WRITE(E_MUX1_PIN, TEST(e, 1) ? HIGH : LOW); + WRITE(E_MUX2_PIN, TEST(e, 2) ? HIGH : LOW); + safe_delay(100); +} + +#endif // MK2_MULTIPLEXER diff --git a/Marlin/src/feature/snmm.h b/Marlin/src/feature/snmm.h new file mode 100644 index 00000000..10805c8e --- /dev/null +++ b/Marlin/src/feature/snmm.h @@ -0,0 +1,24 @@ +/** + * 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 + +void select_multiplexed_stepper(const uint8_t e); diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp new file mode 100644 index 00000000..8646ec87 --- /dev/null +++ b/Marlin/src/feature/solenoid.cpp @@ -0,0 +1,98 @@ +/** + * 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 EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + +#include "solenoid.h" + +#include "../module/motion.h" // for active_extruder + +#if ENABLED(MANUAL_SOLENOID_CONTROL) + #define HAS_SOLENOID(N) HAS_SOLENOID_##N +#else + #define HAS_SOLENOID(N) (HAS_SOLENOID_##N && EXTRUDERS > N) +#endif + +// Used primarily with MANUAL_SOLENOID_CONTROL +static void set_solenoid(const uint8_t num, const bool active) { + const uint8_t value = active ? HIGH : LOW; + switch (num) { + case 0: + OUT_WRITE(SOL0_PIN, value); + break; + #if HAS_SOLENOID(1) + case 1: + OUT_WRITE(SOL1_PIN, value); + break; + #endif + #if HAS_SOLENOID(2) + case 2: + OUT_WRITE(SOL2_PIN, value); + break; + #endif + #if HAS_SOLENOID(3) + case 3: + OUT_WRITE(SOL3_PIN, value); + break; + #endif + #if HAS_SOLENOID(4) + case 4: + OUT_WRITE(SOL4_PIN, value); + break; + #endif + #if HAS_SOLENOID(5) + case 5: + OUT_WRITE(SOL5_PIN, value); + break; + #endif + default: + SERIAL_ECHO_MSG(STR_INVALID_SOLENOID); + break; + } +} + +void enable_solenoid(const uint8_t num) { set_solenoid(num, true); } +void disable_solenoid(const uint8_t num) { set_solenoid(num, false); } +void enable_solenoid_on_active_extruder() { enable_solenoid(active_extruder); } + +void disable_all_solenoids() { + disable_solenoid(0); + #if HAS_SOLENOID(1) + disable_solenoid(1); + #endif + #if HAS_SOLENOID(2) + disable_solenoid(2); + #endif + #if HAS_SOLENOID(3) + disable_solenoid(3); + #endif + #if HAS_SOLENOID(4) + disable_solenoid(4); + #endif + #if HAS_SOLENOID(5) + disable_solenoid(5); + #endif +} + +#endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL diff --git a/Marlin/src/feature/solenoid.h b/Marlin/src/feature/solenoid.h new file mode 100644 index 00000000..2ba4983f --- /dev/null +++ b/Marlin/src/feature/solenoid.h @@ -0,0 +1,27 @@ +/** + * 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 + +void enable_solenoid_on_active_extruder(); +void disable_all_solenoids(); +void enable_solenoid(const uint8_t num); +void disable_solenoid(const uint8_t num); diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp new file mode 100644 index 00000000..bc387a93 --- /dev/null +++ b/Marlin/src/feature/spindle_laser.cpp @@ -0,0 +1,118 @@ +/** + * 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 . + * + */ + +/** + * feature/spindle_laser.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_CUTTER + +#include "spindle_laser.h" + +SpindleLaser cutter; +uint8_t SpindleLaser::power; +bool SpindleLaser::isReady; // Ready to apply power setting from the UI to OCR +cutter_power_t SpindleLaser::menuPower, // Power set via LCD menu in PWM, PERCENT, or RPM + SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM + +#if ENABLED(MARLIN_DEV_MODE) + cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K +#endif +#define SPINDLE_LASER_PWM_OFF ((SPINDLE_LASER_PWM_INVERT) ? 255 : 0) + +// +// Init the cutter to a safe OFF state +// +void SpindleLaser::init() { + 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 + #endif + #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) + set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY); + TERN_(MARLIN_DEV_MODE, frequency = SPINDLE_LASER_FREQUENCY); + #endif +} + +#if ENABLED(SPINDLE_LASER_PWM) + /** + * 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_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_STATE); // Turn spindle off + analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Only write low byte + } +#endif + +// +// Set cutter ON/OFF state (and PWM) to the given cutter power value +// +void SpindleLaser::apply_power(const uint8_t opwr) { + static uint8_t last_power_applied = 0; + if (opwr == last_power_applied) return; + last_power_applied = opwr; + power = opwr; + #if ENABLED(SPINDLE_LASER_PWM) + if (cutter.unitPower == 0 && CUTTER_UNIT_IS(RPM)) { + ocr_off(); + isReady = false; + } + else if (enabled() || ENABLED(CUTTER_POWER_RELATIVE)) { + set_ocr(power); + isReady = true; + } + else { + ocr_off(); + isReady = false; + } + #else + WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); + isReady = true; + #endif +} + +#if ENABLED(SPINDLE_CHANGE_DIR) + // + // Set the spindle direction and apply immediately + // Stop on direction change if SPINDLE_STOP_ON_DIR_CHANGE is enabled + // + void SpindleLaser::set_direction(const bool reverse) { + const bool dir_state = (reverse == SPINDLE_INVERT_DIR); // Forward (M3) HIGH when not inverted + if (TERN0(SPINDLE_STOP_ON_DIR_CHANGE, enabled()) && READ(SPINDLE_DIR_PIN) != dir_state) disable(); + WRITE(SPINDLE_DIR_PIN, dir_state); + } +#endif + +#endif // HAS_CUTTER diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h new file mode 100644 index 00000000..15ff661c --- /dev/null +++ b/Marlin/src/feature/spindle_laser.h @@ -0,0 +1,282 @@ +/** + * 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 + +/** + * feature/spindle_laser.h + * Support for Laser Power or Spindle Power & Direction + */ + +#include "../inc/MarlinConfig.h" + +#include "spindle_laser_types.h" + +#if ENABLED(LASER_POWER_INLINE) + #include "../module/planner.h" +#endif + +#define PCT_TO_PWM(X) ((X) * 255 / 100) + +#ifndef SPEED_POWER_INTERCEPT + #define SPEED_POWER_INTERCEPT 0 +#endif +#define SPEED_POWER_FLOOR TERN(CUTTER_POWER_RELATIVE, SPEED_POWER_MIN, 0) + +// #define _MAP(N,S1,S2,D1,D2) ((N)*_MAX((D2)-(D1),0)/_MAX((S2)-(S1),1)+(D1)) + +class SpindleLaser { +public: + static constexpr float + min_pct = round(TERN(CUTTER_POWER_RELATIVE, 0, (100 * float(SPEED_POWER_MIN) / TERN(SPINDLE_FEATURE, float(SPEED_POWER_MAX), 100)))), + max_pct = round(TERN(SPINDLE_FEATURE, 100, float(SPEED_POWER_MAX))); + + static const inline uint8_t pct_to_ocr(const float pct) { return uint8_t(PCT_TO_PWM(pct)); } + + // cpower = configured values (ie SPEED_POWER_MAX) + static const inline uint8_t cpwr_to_pct(const cutter_cpower_t cpwr) { // configured value to pct + return unitPower ? round(100 * (cpwr - SPEED_POWER_FLOOR) / (SPEED_POWER_MAX - SPEED_POWER_FLOOR)) : 0; + } + + // Convert a configured value (cpower)(ie SPEED_POWER_STARTUP) to unit power (upwr, upower), + // which can be PWM, Percent, or RPM (rel/abs). + static const inline cutter_power_t cpwr_to_upwr(const cutter_cpower_t cpwr) { // STARTUP power to Unit power + const cutter_power_t upwr = ( + #if ENABLED(SPINDLE_FEATURE) + // Spindle configured values are in RPM + #if CUTTER_UNIT_IS(RPM) + cpwr // to RPM + #elif CUTTER_UNIT_IS(PERCENT) // to PCT + cpwr_to_pct(cpwr) + #else // to PWM + PCT_TO_PWM(cpwr_to_pct(cpwr)) + #endif + #else + // Laser configured values are in PCT + #if CUTTER_UNIT_IS(PWM255) + PCT_TO_PWM(cpwr) + #else + cpwr // to RPM/PCT + #endif + #endif + ); + return upwr; + } + + static const cutter_power_t mpower_min() { return cpwr_to_upwr(SPEED_POWER_MIN); } + static const cutter_power_t mpower_max() { return cpwr_to_upwr(SPEED_POWER_MAX); } + + static bool isReady; // Ready to apply power setting from the UI to OCR + static uint8_t power; + + #if ENABLED(MARLIN_DEV_MODE) + static cutter_frequency_t frequency; // Set PWM frequency; range: 2K-50K + #endif + + static cutter_power_t menuPower, // Power as set via LCD menu in PWM, Percentage or RPM + unitPower; // Power as displayed status in PWM, Percentage or RPM + + static void init(); + + #if ENABLED(MARLIN_DEV_MODE) + static inline void refresh_frequency() { set_pwm_frequency(pin_t(SPINDLE_LASER_PWM_PIN), frequency); } + #endif + + // Modifying this function should update everywhere + static inline bool enabled(const cutter_power_t opwr) { return opwr > 0; } + static inline bool enabled() { return enabled(power); } + + static void apply_power(const uint8_t inpow); + + FORCE_INLINE static void refresh() { apply_power(power); } + FORCE_INLINE static void set_power(const uint8_t upwr) { power = upwr; refresh(); } + + #if ENABLED(SPINDLE_LASER_PWM) + + static void set_ocr(const uint8_t ocr); + static inline void set_ocr_power(const uint8_t ocr) { power = ocr; set_ocr(ocr); } + static void ocr_off(); + // Used to update output for power->OCR translation + static inline uint8_t upower_to_ocr(const cutter_power_t upwr) { + return ( + #if CUTTER_UNIT_IS(PWM255) + uint8_t(upwr) + #elif CUTTER_UNIT_IS(PERCENT) + pct_to_ocr(upwr) + #else + uint8_t(pct_to_ocr(cpwr_to_pct(upwr))) + #endif + ); + } + + // Correct power to configured range + static inline cutter_power_t power_to_range(const cutter_power_t pwr) { + return power_to_range(pwr, ( + #if CUTTER_UNIT_IS(PWM255) + 0 + #elif CUTTER_UNIT_IS(PERCENT) + 1 + #elif CUTTER_UNIT_IS(RPM) + 2 + #else + #error "???" + #endif + )); + } + static inline cutter_power_t power_to_range(const cutter_power_t pwr, const uint8_t pwrUnit) { + if (pwr <= 0) return 0; + cutter_power_t upwr; + switch (pwrUnit) { + case 0: // PWM + upwr = cutter_power_t( + (pwr < pct_to_ocr(min_pct)) ? pct_to_ocr(min_pct) // Use minimum if set below + : (pwr > pct_to_ocr(max_pct)) ? pct_to_ocr(max_pct) // Use maximum if set above + : pwr + ); + break; + case 1: // PERCENT + upwr = cutter_power_t( + (pwr < min_pct) ? min_pct // Use minimum if set below + : (pwr > max_pct) ? max_pct // Use maximum if set above + : pwr // PCT + ); + break; + case 2: // RPM + upwr = cutter_power_t( + (pwr < SPEED_POWER_MIN) ? SPEED_POWER_MIN // Use minimum if set below + : (pwr > SPEED_POWER_MAX) ? SPEED_POWER_MAX // Use maximum if set above + : pwr // Calculate OCR value + ); + break; + default: break; + } + return upwr; + } + + #endif // SPINDLE_LASER_PWM + + static inline void set_enabled(const bool enable) { + set_power(enable ? TERN(SPINDLE_LASER_PWM, (power ?: (unitPower ? upower_to_ocr(cpwr_to_upwr(SPEED_POWER_STARTUP)) : 0)), 255) : 0); + } + + // Wait for spindle to spin up or spin down + static inline void power_delay(const bool on) { + #if DISABLED(LASER_POWER_INLINE) + safe_delay(on ? SPINDLE_LASER_POWERUP_DELAY : SPINDLE_LASER_POWERDOWN_DELAY); + #endif + } + + #if ENABLED(SPINDLE_CHANGE_DIR) + static void set_direction(const bool reverse); + #else + static inline void set_direction(const bool) {} + #endif + + static inline void disable() { isReady = false; set_enabled(false); } + + #if HAS_LCD_MENU + + static inline void enable_with_dir(const bool reverse) { + isReady = true; + const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255); + if (menuPower) + power = ocr; + else + menuPower = cpwr_to_upwr(SPEED_POWER_STARTUP); + unitPower = menuPower; + set_direction(reverse); + set_enabled(true); + } + FORCE_INLINE static void enable_forward() { enable_with_dir(false); } + FORCE_INLINE static void enable_reverse() { enable_with_dir(true); } + + #if ENABLED(SPINDLE_LASER_PWM) + static inline void update_from_mpower() { + if (isReady) power = upower_to_ocr(menuPower); + unitPower = menuPower; + } + #endif + + #endif + + #if ENABLED(LASER_POWER_INLINE) + /** + * Inline power adds extra fields to the planner block + * to handle laser power and scale to movement speed. + */ + + // Force disengage planner power control + static inline void inline_disable() { + isReady = false; + unitPower = 0; + planner.laser_inline.status.isPlanned = false; + planner.laser_inline.status.isEnabled = false; + planner.laser_inline.power = 0; + } + + // Inline modes of all other functions; all enable planner inline power control + static inline void set_inline_enabled(const bool enable) { + if (enable) + inline_power(cpwr_to_upwr(SPEED_POWER_STARTUP)); + else { + isReady = false; + unitPower = menuPower = 0; + planner.laser_inline.status.isPlanned = false; + TERN(SPINDLE_LASER_PWM, inline_ocr_power, inline_power)(0); + } + } + + // Set the power for subsequent movement blocks + static void inline_power(const cutter_power_t upwr) { + unitPower = menuPower = upwr; + #if ENABLED(SPINDLE_LASER_PWM) + #if ENABLED(SPEED_POWER_RELATIVE) && !CUTTER_UNIT_IS(RPM) // relative mode does not turn laser off at 0, except for RPM + planner.laser_inline.status.isEnabled = true; + planner.laser_inline.power = upower_to_ocr(upwr); + isReady = true; + #else + inline_ocr_power(upower_to_ocr(upwr)); + #endif + #else + planner.laser_inline.status.isEnabled = enabled(upwr); + planner.laser_inline.power = upwr; + isReady = enabled(upwr); + #endif + } + + static inline void inline_direction(const bool) { /* never */ } + + #if ENABLED(SPINDLE_LASER_PWM) + static inline void inline_ocr_power(const uint8_t ocrpwr) { + isReady = ocrpwr > 0; + planner.laser_inline.status.isEnabled = ocrpwr > 0; + planner.laser_inline.power = ocrpwr; + } + #endif + #endif // LASER_POWER_INLINE + + static inline void kill() { + TERN_(LASER_POWER_INLINE, inline_disable()); + disable(); + } +}; + +extern SpindleLaser cutter; diff --git a/Marlin/src/feature/spindle_laser_types.h b/Marlin/src/feature/spindle_laser_types.h new file mode 100644 index 00000000..181c4d73 --- /dev/null +++ b/Marlin/src/feature/spindle_laser_types.h @@ -0,0 +1,53 @@ +/** + * 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 + +/** + * feature/spindle_laser_types.h + * Support for Laser Power or Spindle Power & Direction + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(SPINDLE_FEATURE) + #define _MSG_CUTTER(M) MSG_SPINDLE_##M +#else + #define _MSG_CUTTER(M) MSG_LASER_##M +#endif +#define MSG_CUTTER(M) _MSG_CUTTER(M) + +typedef IF<(SPEED_POWER_MAX > 255), uint16_t, uint8_t>::type cutter_cpower_t; + +#if CUTTER_UNIT_IS(RPM) && SPEED_POWER_MAX > 255 + typedef uint16_t cutter_power_t; + #define CUTTER_MENU_POWER_TYPE uint16_5 + #define cutter_power2str ui16tostr5rj +#else + typedef uint8_t cutter_power_t; + #define CUTTER_MENU_POWER_TYPE uint8 + #define cutter_power2str ui8tostr3rj +#endif + +#if ENABLED(MARLIN_DEV_MODE) + typedef uint16_t cutter_frequency_t; + #define CUTTER_MENU_FREQUENCY_TYPE uint16_5 +#endif diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp new file mode 100644 index 00000000..78125307 --- /dev/null +++ b/Marlin/src/feature/tmc_util.cpp @@ -0,0 +1,1272 @@ +/** + * 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_TRINAMIC_CONFIG + +#include "tmc_util.h" +#include "../MarlinCore.h" + +#include "../module/stepper/indirection.h" +#include "../module/printcounter.h" +#include "../libs/duration_t.h" +#include "../gcode/gcode.h" + +#if ENABLED(TMC_DEBUG) + #include "../module/planner.h" + #include "../libs/hex_print.h" + #if ENABLED(MONITOR_DRIVER_STATUS) + static uint16_t report_tmc_status_interval; // = 0 + #endif +#endif + +#if HAS_LCD_MENU + #include "../module/stepper.h" +#endif + +/** + * Check for over temperature or short to ground error flags. + * Report and log warning of overtemperature condition. + * Reduce driver current in a persistent otpw condition. + * Keep track of otpw counter so we don't reduce current on a single instance, + * and so we don't repeatedly report warning before the condition is cleared. + */ +#if ENABLED(MONITOR_DRIVER_STATUS) + + struct TMC_driver_data { + uint32_t drv_status; + bool is_otpw:1, + is_ot:1, + is_s2g:1, + is_error:1 + #if ENABLED(TMC_DEBUG) + , is_stall:1 + , is_stealth:1 + , is_standstill:1 + #if HAS_STALLGUARD + , sg_result_reasonable:1 + #endif + #endif + ; + #if ENABLED(TMC_DEBUG) + #if HAS_TMCX1X0 || HAS_TMC220x + uint8_t cs_actual; + #endif + #if HAS_STALLGUARD + uint16_t sg_result; + #endif + #endif + }; + + #if HAS_TMCX1X0 + + #if ENABLED(TMC_DEBUG) + static uint32_t get_pwm_scale(TMC2130Stepper &st) { return st.PWM_SCALE(); } + #endif + + static TMC_driver_data get_driver_data(TMC2130Stepper &st) { + constexpr uint8_t OT_bp = 25, OTPW_bp = 26; + constexpr uint32_t S2G_bm = 0x18000000; + #if ENABLED(TMC_DEBUG) + constexpr uint16_t SG_RESULT_bm = 0x3FF; // 0:9 + constexpr uint8_t STEALTH_bp = 14; + constexpr uint32_t CS_ACTUAL_bm = 0x1F0000; // 16:20 + constexpr uint8_t STALL_GUARD_bp = 24; + constexpr uint8_t STST_bp = 31; + #endif + TMC_driver_data data; + const auto ds = data.drv_status = st.DRV_STATUS(); + #ifdef __AVR__ + + // 8-bit optimization saves up to 70 bytes of PROGMEM per axis + uint8_t spart; + #if ENABLED(TMC_DEBUG) + data.sg_result = ds & SG_RESULT_bm; + spart = ds >> 8; + data.is_stealth = TEST(spart, STEALTH_bp - 8); + spart = ds >> 16; + data.cs_actual = spart & (CS_ACTUAL_bm >> 16); + #endif + spart = ds >> 24; + data.is_ot = TEST(spart, OT_bp - 24); + data.is_otpw = TEST(spart, OTPW_bp - 24); + data.is_s2g = !!(spart & (S2G_bm >> 24)); + #if ENABLED(TMC_DEBUG) + data.is_stall = TEST(spart, STALL_GUARD_bp - 24); + data.is_standstill = TEST(spart, STST_bp - 24); + data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill + #endif + + #else // !__AVR__ + + data.is_ot = TEST(ds, OT_bp); + data.is_otpw = TEST(ds, OTPW_bp); + data.is_s2g = !!(ds & S2G_bm); + #if ENABLED(TMC_DEBUG) + constexpr uint8_t CS_ACTUAL_sb = 16; + data.sg_result = ds & SG_RESULT_bm; + data.is_stealth = TEST(ds, STEALTH_bp); + data.cs_actual = (ds & CS_ACTUAL_bm) >> CS_ACTUAL_sb; + data.is_stall = TEST(ds, STALL_GUARD_bp); + data.is_standstill = TEST(ds, STST_bp); + data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill + #endif + + #endif // !__AVR__ + + return data; + } + + #endif // HAS_TMCX1X0 + + #if HAS_TMC220x + + #if ENABLED(TMC_DEBUG) + static uint32_t get_pwm_scale(TMC2208Stepper &st) { return st.pwm_scale_sum(); } + #endif + + static TMC_driver_data get_driver_data(TMC2208Stepper &st) { + constexpr uint8_t OTPW_bp = 0, OT_bp = 1; + constexpr uint8_t S2G_bm = 0b11110; // 2..5 + TMC_driver_data data; + const auto ds = data.drv_status = st.DRV_STATUS(); + data.is_otpw = TEST(ds, OTPW_bp); + data.is_ot = TEST(ds, OT_bp); + data.is_s2g = !!(ds & S2G_bm); + #if ENABLED(TMC_DEBUG) + constexpr uint32_t CS_ACTUAL_bm = 0x1F0000; // 16:20 + constexpr uint8_t STEALTH_bp = 30, STST_bp = 31; + #ifdef __AVR__ + // 8-bit optimization saves up to 12 bytes of PROGMEM per axis + uint8_t spart = ds >> 16; + data.cs_actual = spart & (CS_ACTUAL_bm >> 16); + spart = ds >> 24; + data.is_stealth = TEST(spart, STEALTH_bp - 24); + data.is_standstill = TEST(spart, STST_bp - 24); + #else + constexpr uint8_t CS_ACTUAL_sb = 16; + data.cs_actual = (ds & CS_ACTUAL_bm) >> CS_ACTUAL_sb; + data.is_stealth = TEST(ds, STEALTH_bp); + data.is_standstill = TEST(ds, STST_bp); + #endif + TERN_(HAS_STALLGUARD, data.sg_result_reasonable = false); + #endif + return data; + } + + #endif // TMC2208 || TMC2209 + + #if HAS_DRIVER(TMC2660) + + #if ENABLED(TMC_DEBUG) + static uint32_t get_pwm_scale(TMC2660Stepper) { return 0; } + #endif + + static TMC_driver_data get_driver_data(TMC2660Stepper &st) { + constexpr uint8_t OT_bp = 1, OTPW_bp = 2; + constexpr uint8_t S2G_bm = 0b11000; + TMC_driver_data data; + const auto ds = data.drv_status = st.DRVSTATUS(); + uint8_t spart = ds & 0xFF; + data.is_otpw = TEST(spart, OTPW_bp); + data.is_ot = TEST(spart, OT_bp); + data.is_s2g = !!(ds & S2G_bm); + #if ENABLED(TMC_DEBUG) + constexpr uint8_t STALL_GUARD_bp = 0; + constexpr uint8_t STST_bp = 7, SG_RESULT_sp = 10; + constexpr uint32_t SG_RESULT_bm = 0xFFC00; // 10:19 + data.is_stall = TEST(spart, STALL_GUARD_bp); + data.is_standstill = TEST(spart, STST_bp); + data.sg_result = (ds & SG_RESULT_bm) >> SG_RESULT_sp; + data.sg_result_reasonable = true; + #endif + return data; + } + + #endif // TMC2660 + + #if ENABLED(STOP_ON_ERROR) + void report_driver_error(const TMC_driver_data &data) { + SERIAL_ECHOPGM(" driver error detected: 0x"); + SERIAL_PRINTLN(data.drv_status, HEX); + if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature"); + if (data.is_s2g) SERIAL_ECHOLNPGM("coil short circuit"); + TERN_(TMC_DEBUG, tmc_report_all(true, true, true, true)); + kill(PSTR("Driver error")); + } + #endif + + template + void report_driver_otpw(TMC &st) { + char timestamp[14]; + duration_t elapsed = print_job_timer.duration(); + const bool has_days = (elapsed.value > 60*60*24L); + (void)elapsed.toDigital(timestamp, has_days); + SERIAL_EOL(); + SERIAL_ECHO(timestamp); + SERIAL_ECHOPGM(": "); + st.printLabel(); + SERIAL_ECHOLNPAIR(" driver overtemperature warning! (", st.getMilliamps(), "mA)"); + } + + template + void report_polled_driver_data(TMC &st, const TMC_driver_data &data) { + const uint32_t pwm_scale = get_pwm_scale(st); + st.printLabel(); + SERIAL_CHAR(':'); SERIAL_PRINT(pwm_scale, DEC); + #if ENABLED(TMC_DEBUG) + #if HAS_TMCX1X0 || HAS_TMC220x + SERIAL_CHAR('/'); SERIAL_PRINT(data.cs_actual, DEC); + #endif + #if HAS_STALLGUARD + SERIAL_CHAR('/'); + if (data.sg_result_reasonable) + SERIAL_ECHO(data.sg_result); + else + SERIAL_CHAR('-'); + #endif + #endif + SERIAL_CHAR('|'); + if (st.error_count) SERIAL_CHAR('E'); // Error + if (data.is_ot) SERIAL_CHAR('O'); // Over-temperature + if (data.is_otpw) SERIAL_CHAR('W'); // over-temperature pre-Warning + #if ENABLED(TMC_DEBUG) + if (data.is_stall) SERIAL_CHAR('G'); // stallGuard + if (data.is_stealth) SERIAL_CHAR('T'); // stealthChop + if (data.is_standstill) SERIAL_CHAR('I'); // standstIll + #endif + if (st.flag_otpw) SERIAL_CHAR('F'); // otpw Flag + SERIAL_CHAR('|'); + if (st.otpw_count > 0) SERIAL_PRINT(st.otpw_count, DEC); + SERIAL_CHAR('\t'); + } + + #if CURRENT_STEP_DOWN > 0 + + template + void step_current_down(TMC &st) { + if (st.isEnabled()) { + const uint16_t I_rms = st.getMilliamps() - (CURRENT_STEP_DOWN); + if (I_rms > 50) { + st.rms_current(I_rms); + #if ENABLED(REPORT_CURRENT_CHANGE) + st.printLabel(); + SERIAL_ECHOLNPAIR(" current decreased to ", I_rms); + #endif + } + } + } + + #else + + #define step_current_down(...) + + #endif + + template + bool monitor_tmc_driver(TMC &st, const bool need_update_error_counters, const bool need_debug_reporting) { + TMC_driver_data data = get_driver_data(st); + if (data.drv_status == 0xFFFFFFFF || data.drv_status == 0x0) return false; + + bool should_step_down = false; + + if (need_update_error_counters) { + if (data.is_ot /* | data.s2ga | data.s2gb*/) st.error_count++; + else if (st.error_count > 0) st.error_count--; + + #if ENABLED(STOP_ON_ERROR) + if (st.error_count >= 10) { + SERIAL_EOL(); + st.printLabel(); + report_driver_error(data); + } + #endif + + // Report if a warning was triggered + if (data.is_otpw && st.otpw_count == 0) + report_driver_otpw(st); + + #if CURRENT_STEP_DOWN > 0 + // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings + if (data.is_otpw && st.otpw_count > 4 && st.isEnabled()) + should_step_down = true; + #endif + + if (data.is_otpw) { + st.otpw_count++; + st.flag_otpw = true; + } + else if (st.otpw_count > 0) st.otpw_count = 0; + } + + #if ENABLED(TMC_DEBUG) + if (need_debug_reporting) report_polled_driver_data(st, data); + #endif + + return should_step_down; + } + + void monitor_tmc_drivers() { + const millis_t ms = millis(); + + // Poll TMC drivers at the configured interval + static millis_t next_poll = 0; + const bool need_update_error_counters = ELAPSED(ms, next_poll); + if (need_update_error_counters) next_poll = ms + MONITOR_DRIVER_STATUS_INTERVAL_MS; + + // Also poll at intervals for debugging + #if ENABLED(TMC_DEBUG) + static millis_t next_debug_reporting = 0; + const bool need_debug_reporting = report_tmc_status_interval && ELAPSED(ms, next_debug_reporting); + if (need_debug_reporting) next_debug_reporting = ms + report_tmc_status_interval; + #else + constexpr bool need_debug_reporting = false; + #endif + + if (need_update_error_counters || need_debug_reporting) { + + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + { + bool result = false; + #if AXIS_IS_TMC(X) + if (monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) result = true; + #endif + #if AXIS_IS_TMC(X2) + if (monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) result = true; + #endif + if (result) { + #if AXIS_IS_TMC(X) + step_current_down(stepperX); + #endif + #if AXIS_IS_TMC(X2) + step_current_down(stepperX2); + #endif + } + } + #endif + + #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + { + bool result = false; + #if AXIS_IS_TMC(Y) + if (monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) result = true; + #endif + #if AXIS_IS_TMC(Y2) + if (monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) result = true; + #endif + if (result) { + #if AXIS_IS_TMC(Y) + step_current_down(stepperY); + #endif + #if AXIS_IS_TMC(Y2) + step_current_down(stepperY2); + #endif + } + } + #endif + + #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + { + bool result = false; + #if AXIS_IS_TMC(Z) + if (monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) result = true; + #endif + #if AXIS_IS_TMC(Z2) + if (monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) result = true; + #endif + #if AXIS_IS_TMC(Z3) + if (monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) result = true; + #endif + #if AXIS_IS_TMC(Z4) + if (monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) result = true; + #endif + if (result) { + #if AXIS_IS_TMC(Z) + step_current_down(stepperZ); + #endif + #if AXIS_IS_TMC(Z2) + step_current_down(stepperZ2); + #endif + #if AXIS_IS_TMC(Z3) + step_current_down(stepperZ3); + #endif + #if AXIS_IS_TMC(Z4) + step_current_down(stepperZ4); + #endif + } + } + #endif + + #if AXIS_IS_TMC(E0) + (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E1) + (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E2) + (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E3) + (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E4) + (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E5) + (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E6) + (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting); + #endif + #if AXIS_IS_TMC(E7) + (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting); + #endif + + if (TERN0(TMC_DEBUG, need_debug_reporting)) SERIAL_EOL(); + } + } + +#endif // MONITOR_DRIVER_STATUS + +#if ENABLED(TMC_DEBUG) + + /** + * M122 [S<0|1>] [Pnnn] Enable periodic status reports + */ + #if ENABLED(MONITOR_DRIVER_STATUS) + void tmc_set_report_interval(const uint16_t update_interval) { + if ((report_tmc_status_interval = update_interval)) + SERIAL_ECHOLNPGM("axis:pwm_scale" + #if HAS_STEALTHCHOP + "/curr_scale" + #endif + #if HAS_STALLGUARD + "/mech_load" + #endif + "|flags|warncount" + ); + } + #endif + + enum TMC_debug_enum : char { + TMC_CODES, + TMC_UART_ADDR, + TMC_ENABLED, + TMC_CURRENT, + TMC_RMS_CURRENT, + TMC_MAX_CURRENT, + TMC_IRUN, + TMC_IHOLD, + 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, + TMC_TSTEP, + TMC_TPWMTHRS, + TMC_TPWMTHRS_MMS, + TMC_OTPW, + TMC_OTPW_TRIGGERED, + TMC_TOFF, + TMC_TBL, + TMC_HEND, + TMC_HSTRT, + TMC_SGT, + TMC_MSCNT + }; + enum TMC_drv_status_enum : char { + TMC_DRV_CODES, + TMC_STST, + TMC_OLB, + TMC_OLA, + TMC_S2GB, + TMC_S2GA, + TMC_DRV_OTPW, + TMC_OT, + TMC_STALLGUARD, + TMC_DRV_CS_ACTUAL, + TMC_FSACTIVE, + TMC_SG_RESULT, + TMC_DRV_STATUS_HEX, + TMC_T157, + TMC_T150, + TMC_T143, + TMC_T120, + TMC_STEALTH, + TMC_S2VSB, + TMC_S2VSA + }; + enum TMC_get_registers_enum : char { + TMC_AXIS_CODES, + TMC_GET_GCONF, + TMC_GET_IHOLD_IRUN, + TMC_GET_GSTAT, + TMC_GET_IOIN, + TMC_GET_TPOWERDOWN, + TMC_GET_TSTEP, + TMC_GET_TPWMTHRS, + TMC_GET_TCOOLTHRS, + TMC_GET_THIGH, + TMC_GET_CHOPCONF, + TMC_GET_COOLCONF, + TMC_GET_PWMCONF, + TMC_GET_PWM_SCALE, + TMC_GET_DRV_STATUS, + TMC_GET_DRVCONF, + TMC_GET_DRVCTRL, + TMC_GET_DRVSTATUS, + TMC_GET_SGCSCONF, + TMC_GET_SMARTEN + }; + + template + static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); } + + #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) + static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { + switch (i) { + case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; + case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; + case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; + default: break; + } + } + #endif + #if HAS_TMCX1X0 + static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { + switch (i) { + case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('*'); break; + case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break; + case TMC_FSACTIVE: if (st.fsactive()) SERIAL_CHAR('*'); break; + case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; + default: break; + } + } + #endif + + #if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160) + template + void print_vsense(TMCMarlin &) { } + + template + void print_vsense(TMCMarlin &) { } + + static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) { + switch (i) { + case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; + case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; + case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break; + case TMC_GLOBAL_SCALER: + { + uint16_t value = st.GLOBAL_SCALER(); + SERIAL_PRINT(value ?: 256, DEC); + SERIAL_ECHOPGM("/256"); + } + break; + default: break; + } + } + #endif + + #if HAS_TMC220x + static void _tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { + switch (i) { + 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; + default: break; + } + } + + #if HAS_DRIVER(TMC2209) + template + static void _tmc_status(TMCMarlin &st, const TMC_debug_enum i) { + switch (i) { + case TMC_SGT: SERIAL_PRINT(st.SGTHRS(), DEC); break; + case TMC_UART_ADDR: SERIAL_PRINT(st.get_address(), DEC); break; + default: + TMC2208Stepper *parent = &st; + _tmc_status(*parent, i); + break; + } + } + #endif + + static void _tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) { + switch (i) { + case TMC_T157: if (st.t157()) SERIAL_CHAR('*'); break; + case TMC_T150: if (st.t150()) SERIAL_CHAR('*'); break; + case TMC_T143: if (st.t143()) SERIAL_CHAR('*'); break; + case TMC_T120: if (st.t120()) SERIAL_CHAR('*'); break; + case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; + default: break; + } + } + + #if HAS_DRIVER(TMC2209) + static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) { + switch (i) { + case TMC_SG_RESULT: SERIAL_PRINT(st.SG_RESULT(), DEC); break; + default: _tmc_parse_drv_status(static_cast(st), i); break; + } + } + #endif + #endif + + #if HAS_DRIVER(TMC2660) + static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { } + #endif + + template + static void tmc_status(TMC &st, const TMC_debug_enum i) { + SERIAL_CHAR('\t'); + switch (i) { + case TMC_CODES: st.printLabel(); break; + case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break; + case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; + case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; + case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; + case TMC_IRUN: + SERIAL_PRINT(st.irun(), DEC); + SERIAL_ECHOPGM("/31"); + break; + case TMC_IHOLD: + SERIAL_PRINT(st.ihold(), DEC); + SERIAL_ECHOPGM("/31"); + break; + case TMC_CS_ACTUAL: + SERIAL_PRINT(st.cs_actual(), DEC); + SERIAL_ECHOPGM("/31"); + break; + case TMC_VSENSE: print_vsense(st); break; + case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; + case TMC_TSTEP: { + const uint32_t tstep_value = st.TSTEP(); + if (tstep_value != 0xFFFFF) SERIAL_ECHO(tstep_value); else SERIAL_ECHOPGM("max"); + } break; + #if ENABLED(HYBRID_THRESHOLD) + case TMC_TPWMTHRS: SERIAL_ECHO(uint32_t(st.TPWMTHRS())); break; + case TMC_TPWMTHRS_MMS: { + const uint32_t tpwmthrs_val = st.get_pwm_thrs(); + if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-'); + } break; + #endif + case TMC_OTPW: serialprint_truefalse(st.otpw()); break; + #if ENABLED(MONITOR_DRIVER_STATUS) + case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; + #endif + case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; + 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; + } + } + + #if HAS_DRIVER(TMC2660) + template + void tmc_status(TMCMarlin &st, const TMC_debug_enum i) { + SERIAL_CHAR('\t'); + switch (i) { + case TMC_CODES: st.printLabel(); break; + case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break; + case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; + case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; + case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; + case TMC_IRUN: + SERIAL_PRINT(st.cs(), DEC); + SERIAL_ECHOPGM("/31"); + break; + case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; + case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; + //case TMC_OTPW: serialprint_truefalse(st.otpw()); break; + //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; + case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; + case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; + 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; + default: break; + } + } + #endif + + template + static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) { + SERIAL_CHAR('\t'); + switch (i) { + case TMC_DRV_CODES: st.printLabel(); break; + case TMC_STST: if (!st.stst()) SERIAL_CHAR('*'); break; + case TMC_OLB: if (st.olb()) SERIAL_CHAR('*'); break; + case TMC_OLA: if (st.ola()) SERIAL_CHAR('*'); break; + case TMC_S2GB: if (st.s2gb()) SERIAL_CHAR('*'); break; + case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('*'); break; + case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('*'); break; + case TMC_OT: if (st.ot()) SERIAL_CHAR('*'); break; + case TMC_DRV_STATUS_HEX: { + const uint32_t drv_status = st.DRV_STATUS(); + SERIAL_CHAR('\t'); + st.printLabel(); + SERIAL_CHAR('\t'); + print_hex_long(drv_status, ':'); + if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!"); + SERIAL_EOL(); + break; + } + default: _tmc_parse_drv_status(st, i); break; + } + } + + static void tmc_debug_loop(const TMC_debug_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) { + if (print_x) { + #if AXIS_IS_TMC(X) + tmc_status(stepperX, i); + #endif + #if AXIS_IS_TMC(X2) + tmc_status(stepperX2, i); + #endif + } + + if (print_y) { + #if AXIS_IS_TMC(Y) + tmc_status(stepperY, i); + #endif + #if AXIS_IS_TMC(Y2) + tmc_status(stepperY2, i); + #endif + } + + if (print_z) { + #if AXIS_IS_TMC(Z) + tmc_status(stepperZ, i); + #endif + #if AXIS_IS_TMC(Z2) + tmc_status(stepperZ2, i); + #endif + #if AXIS_IS_TMC(Z3) + tmc_status(stepperZ3, i); + #endif + #if AXIS_IS_TMC(Z4) + tmc_status(stepperZ4, i); + #endif + } + + if (print_e) { + #if AXIS_IS_TMC(E0) + tmc_status(stepperE0, i); + #endif + #if AXIS_IS_TMC(E1) + tmc_status(stepperE1, i); + #endif + #if AXIS_IS_TMC(E2) + tmc_status(stepperE2, i); + #endif + #if AXIS_IS_TMC(E3) + tmc_status(stepperE3, i); + #endif + #if AXIS_IS_TMC(E4) + tmc_status(stepperE4, i); + #endif + #if AXIS_IS_TMC(E5) + tmc_status(stepperE5, i); + #endif + #if AXIS_IS_TMC(E6) + tmc_status(stepperE6, i); + #endif + #if AXIS_IS_TMC(E7) + tmc_status(stepperE7, i); + #endif + } + + SERIAL_EOL(); + } + + static void drv_status_loop(const TMC_drv_status_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) { + if (print_x) { + #if AXIS_IS_TMC(X) + tmc_parse_drv_status(stepperX, i); + #endif + #if AXIS_IS_TMC(X2) + tmc_parse_drv_status(stepperX2, i); + #endif + } + + if (print_y) { + #if AXIS_IS_TMC(Y) + tmc_parse_drv_status(stepperY, i); + #endif + #if AXIS_IS_TMC(Y2) + tmc_parse_drv_status(stepperY2, i); + #endif + } + + if (print_z) { + #if AXIS_IS_TMC(Z) + tmc_parse_drv_status(stepperZ, i); + #endif + #if AXIS_IS_TMC(Z2) + tmc_parse_drv_status(stepperZ2, i); + #endif + #if AXIS_IS_TMC(Z3) + tmc_parse_drv_status(stepperZ3, i); + #endif + #if AXIS_IS_TMC(Z4) + tmc_parse_drv_status(stepperZ4, i); + #endif + } + + if (print_e) { + #if AXIS_IS_TMC(E0) + tmc_parse_drv_status(stepperE0, i); + #endif + #if AXIS_IS_TMC(E1) + tmc_parse_drv_status(stepperE1, i); + #endif + #if AXIS_IS_TMC(E2) + tmc_parse_drv_status(stepperE2, i); + #endif + #if AXIS_IS_TMC(E3) + tmc_parse_drv_status(stepperE3, i); + #endif + #if AXIS_IS_TMC(E4) + tmc_parse_drv_status(stepperE4, i); + #endif + #if AXIS_IS_TMC(E5) + tmc_parse_drv_status(stepperE5, i); + #endif + #if AXIS_IS_TMC(E6) + tmc_parse_drv_status(stepperE6, i); + #endif + #if AXIS_IS_TMC(E7) + tmc_parse_drv_status(stepperE7, i); + #endif + } + + SERIAL_EOL(); + } + + /** + * M122 report functions + */ + + void tmc_report_all(bool print_x, const bool print_y, const bool print_z, const bool print_e) { + #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM, print_x, print_y, print_z, print_e); }while(0) + #define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM, print_x, print_y, print_z, print_e); }while(0) + TMC_REPORT("\t", TMC_CODES); + #if HAS_DRIVER(TMC2209) + TMC_REPORT("Address\t", TMC_UART_ADDR); + #endif + TMC_REPORT("Enabled\t", TMC_ENABLED); + TMC_REPORT("Set current", TMC_CURRENT); + TMC_REPORT("RMS current", TMC_RMS_CURRENT); + TMC_REPORT("MAX current", TMC_MAX_CURRENT); + TMC_REPORT("Run current", TMC_IRUN); + TMC_REPORT("Hold current", TMC_IHOLD); + #if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160) + TMC_REPORT("Global scaler", TMC_GLOBAL_SCALER); + #endif + TMC_REPORT("CS actual", TMC_CS_ACTUAL); + TMC_REPORT("PWM scale", TMC_PWM_SCALE); + #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2224) || HAS_DRIVER(TMC2660) || HAS_TMC220x + TMC_REPORT("vsense\t", TMC_VSENSE); + #endif + TMC_REPORT("stealthChop", TMC_STEALTHCHOP); + TMC_REPORT("msteps\t", TMC_MICROSTEPS); + TMC_REPORT("tstep\t", TMC_TSTEP); + TMC_REPORT("PWM thresh.", TMC_TPWMTHRS); + TMC_REPORT("[mm/s]\t", TMC_TPWMTHRS_MMS); + TMC_REPORT("OT prewarn", TMC_OTPW); + #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); + #endif + #if HAS_TMCX1X0 + DRV_REPORT("stallguard", TMC_STALLGUARD); + DRV_REPORT("fsactive", TMC_FSACTIVE); + #endif + DRV_REPORT("stst\t", TMC_STST); + DRV_REPORT("olb\t", TMC_OLB); + DRV_REPORT("ola\t", TMC_OLA); + DRV_REPORT("s2gb\t", TMC_S2GB); + DRV_REPORT("s2ga\t", TMC_S2GA); + DRV_REPORT("otpw\t", TMC_DRV_OTPW); + DRV_REPORT("ot\t", TMC_OT); + #if HAS_TMC220x + DRV_REPORT("157C\t", TMC_T157); + DRV_REPORT("150C\t", TMC_T150); + DRV_REPORT("143C\t", TMC_T143); + DRV_REPORT("120C\t", TMC_T120); + DRV_REPORT("s2vsa\t", TMC_S2VSA); + DRV_REPORT("s2vsb\t", TMC_S2VSB); + #endif + DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX); + SERIAL_EOL(); + } + + #define PRINT_TMC_REGISTER(REG_CASE) case TMC_GET_##REG_CASE: print_hex_long(st.REG_CASE(), ':'); break + + #if HAS_TMCX1X0 + static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) { + switch (i) { + PRINT_TMC_REGISTER(TCOOLTHRS); + PRINT_TMC_REGISTER(THIGH); + PRINT_TMC_REGISTER(COOLCONF); + default: SERIAL_CHAR('\t'); break; + } + } + #endif + #if HAS_TMC220x + static void tmc_get_ic_registers(TMC2208Stepper, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); } + #endif + + #if HAS_TRINAMIC_CONFIG + template + static void tmc_get_registers(TMC &st, const TMC_get_registers_enum i) { + switch (i) { + case TMC_AXIS_CODES: SERIAL_CHAR('\t'); st.printLabel(); break; + PRINT_TMC_REGISTER(GCONF); + PRINT_TMC_REGISTER(IHOLD_IRUN); + PRINT_TMC_REGISTER(GSTAT); + PRINT_TMC_REGISTER(IOIN); + PRINT_TMC_REGISTER(TPOWERDOWN); + PRINT_TMC_REGISTER(TSTEP); + PRINT_TMC_REGISTER(TPWMTHRS); + PRINT_TMC_REGISTER(CHOPCONF); + PRINT_TMC_REGISTER(PWMCONF); + PRINT_TMC_REGISTER(PWM_SCALE); + PRINT_TMC_REGISTER(DRV_STATUS); + default: tmc_get_ic_registers(st, i); break; + } + SERIAL_CHAR('\t'); + } + #endif + #if HAS_DRIVER(TMC2660) + template + static void tmc_get_registers(TMCMarlin &st, const TMC_get_registers_enum i) { + switch (i) { + case TMC_AXIS_CODES: SERIAL_CHAR('\t'); st.printLabel(); break; + PRINT_TMC_REGISTER(DRVCONF); + PRINT_TMC_REGISTER(DRVCTRL); + PRINT_TMC_REGISTER(CHOPCONF); + PRINT_TMC_REGISTER(DRVSTATUS); + PRINT_TMC_REGISTER(SGCSCONF); + PRINT_TMC_REGISTER(SMARTEN); + default: SERIAL_CHAR('\t'); break; + } + SERIAL_CHAR('\t'); + } + #endif + + static void tmc_get_registers(TMC_get_registers_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) { + if (print_x) { + #if AXIS_IS_TMC(X) + tmc_get_registers(stepperX, i); + #endif + #if AXIS_IS_TMC(X2) + tmc_get_registers(stepperX2, i); + #endif + } + + if (print_y) { + #if AXIS_IS_TMC(Y) + tmc_get_registers(stepperY, i); + #endif + #if AXIS_IS_TMC(Y2) + tmc_get_registers(stepperY2, i); + #endif + } + + if (print_z) { + #if AXIS_IS_TMC(Z) + tmc_get_registers(stepperZ, i); + #endif + #if AXIS_IS_TMC(Z2) + tmc_get_registers(stepperZ2, i); + #endif + #if AXIS_IS_TMC(Z3) + tmc_get_registers(stepperZ3, i); + #endif + #if AXIS_IS_TMC(Z4) + tmc_get_registers(stepperZ4, i); + #endif + } + + if (print_e) { + #if AXIS_IS_TMC(E0) + tmc_get_registers(stepperE0, i); + #endif + #if AXIS_IS_TMC(E1) + tmc_get_registers(stepperE1, i); + #endif + #if AXIS_IS_TMC(E2) + tmc_get_registers(stepperE2, i); + #endif + #if AXIS_IS_TMC(E3) + tmc_get_registers(stepperE3, i); + #endif + #if AXIS_IS_TMC(E4) + tmc_get_registers(stepperE4, i); + #endif + #if AXIS_IS_TMC(E5) + tmc_get_registers(stepperE5, i); + #endif + #if AXIS_IS_TMC(E6) + tmc_get_registers(stepperE6, i); + #endif + #if AXIS_IS_TMC(E7) + tmc_get_registers(stepperE7, i); + #endif + } + + SERIAL_EOL(); + } + + void tmc_get_registers(bool print_x, bool print_y, bool print_z, bool print_e) { + #define _TMC_GET_REG(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_get_registers(ITEM, print_x, print_y, print_z, print_e); }while(0) + #define TMC_GET_REG(NAME, TABS) _TMC_GET_REG(STRINGIFY(NAME) TABS, TMC_GET_##NAME) + _TMC_GET_REG("\t", TMC_AXIS_CODES); + TMC_GET_REG(GCONF, "\t\t"); + TMC_GET_REG(IHOLD_IRUN, "\t"); + TMC_GET_REG(GSTAT, "\t\t"); + TMC_GET_REG(IOIN, "\t\t"); + TMC_GET_REG(TPOWERDOWN, "\t"); + TMC_GET_REG(TSTEP, "\t\t"); + TMC_GET_REG(TPWMTHRS, "\t"); + TMC_GET_REG(TCOOLTHRS, "\t"); + TMC_GET_REG(THIGH, "\t\t"); + TMC_GET_REG(CHOPCONF, "\t"); + TMC_GET_REG(COOLCONF, "\t"); + TMC_GET_REG(PWMCONF, "\t"); + TMC_GET_REG(PWM_SCALE, "\t"); + TMC_GET_REG(DRV_STATUS, "\t"); + } + +#endif // TMC_DEBUG + +#if USE_SENSORLESS + + bool tmc_enable_stallguard(TMC2130Stepper &st) { + const bool stealthchop_was_enabled = st.en_pwm_mode(); + + st.TCOOLTHRS(0xFFFFF); + st.en_pwm_mode(false); + st.diag1_stall(true); + + return stealthchop_was_enabled; + } + void tmc_disable_stallguard(TMC2130Stepper &st, const bool restore_stealth) { + st.TCOOLTHRS(0); + st.en_pwm_mode(restore_stealth); + st.diag1_stall(false); + } + + bool tmc_enable_stallguard(TMC2209Stepper &st) { + const bool stealthchop_was_enabled = !st.en_spreadCycle(); + + st.TCOOLTHRS(0xFFFFF); + st.en_spreadCycle(false); + return stealthchop_was_enabled; + } + void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth) { + st.en_spreadCycle(!restore_stealth); + st.TCOOLTHRS(0); + } + + bool tmc_enable_stallguard(TMC2660Stepper) { + // TODO + return false; + } + void tmc_disable_stallguard(TMC2660Stepper, const bool) {}; + +#endif // USE_SENSORLESS + +#if HAS_TMC_SPI + #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH) + void tmc_init_cs_pins() { + #if AXIS_HAS_SPI(X) + SET_CS_PIN(X); + #endif + #if AXIS_HAS_SPI(Y) + SET_CS_PIN(Y); + #endif + #if AXIS_HAS_SPI(Z) + SET_CS_PIN(Z); + #endif + #if AXIS_HAS_SPI(X2) + SET_CS_PIN(X2); + #endif + #if AXIS_HAS_SPI(Y2) + SET_CS_PIN(Y2); + #endif + #if AXIS_HAS_SPI(Z2) + SET_CS_PIN(Z2); + #endif + #if AXIS_HAS_SPI(Z3) + SET_CS_PIN(Z3); + #endif + #if AXIS_HAS_SPI(Z4) + SET_CS_PIN(Z4); + #endif + #if AXIS_HAS_SPI(E0) + SET_CS_PIN(E0); + #endif + #if AXIS_HAS_SPI(E1) + SET_CS_PIN(E1); + #endif + #if AXIS_HAS_SPI(E2) + SET_CS_PIN(E2); + #endif + #if AXIS_HAS_SPI(E3) + SET_CS_PIN(E3); + #endif + #if AXIS_HAS_SPI(E4) + SET_CS_PIN(E4); + #endif + #if AXIS_HAS_SPI(E5) + SET_CS_PIN(E5); + #endif + #if AXIS_HAS_SPI(E6) + SET_CS_PIN(E6); + #endif + #if AXIS_HAS_SPI(E7) + SET_CS_PIN(E7); + #endif + } +#endif // HAS_TMC_SPI + +template +static bool test_connection(TMC &st) { + SERIAL_ECHOPGM("Testing "); + st.printLabel(); + SERIAL_ECHOPGM(" connection... "); + const uint8_t test_result = st.test_connection(); + + if (test_result > 0) SERIAL_ECHOPGM("Error: All "); + + const char *stat; + switch (test_result) { + default: + case 0: stat = PSTR("OK"); break; + case 1: stat = PSTR("HIGH"); break; + case 2: stat = PSTR("LOW"); break; + } + serialprintPGM(stat); + SERIAL_EOL(); + + return test_result; +} + +void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z, const bool test_e) { + uint8_t axis_connection = 0; + + if (test_x) { + #if AXIS_IS_TMC(X) + axis_connection += test_connection(stepperX); + #endif + #if AXIS_IS_TMC(X2) + axis_connection += test_connection(stepperX2); + #endif + } + + if (test_y) { + #if AXIS_IS_TMC(Y) + axis_connection += test_connection(stepperY); + #endif + #if AXIS_IS_TMC(Y2) + axis_connection += test_connection(stepperY2); + #endif + } + + if (test_z) { + #if AXIS_IS_TMC(Z) + axis_connection += test_connection(stepperZ); + #endif + #if AXIS_IS_TMC(Z2) + axis_connection += test_connection(stepperZ2); + #endif + #if AXIS_IS_TMC(Z3) + axis_connection += test_connection(stepperZ3); + #endif + #if AXIS_IS_TMC(Z4) + axis_connection += test_connection(stepperZ4); + #endif + } + + if (test_e) { + #if AXIS_IS_TMC(E0) + axis_connection += test_connection(stepperE0); + #endif + #if AXIS_IS_TMC(E1) + axis_connection += test_connection(stepperE1); + #endif + #if AXIS_IS_TMC(E2) + axis_connection += test_connection(stepperE2); + #endif + #if AXIS_IS_TMC(E3) + axis_connection += test_connection(stepperE3); + #endif + #if AXIS_IS_TMC(E4) + axis_connection += test_connection(stepperE4); + #endif + #if AXIS_IS_TMC(E5) + axis_connection += test_connection(stepperE5); + #endif + #if AXIS_IS_TMC(E6) + axis_connection += test_connection(stepperE6); + #endif + #if AXIS_IS_TMC(E7) + axis_connection += test_connection(stepperE7); + #endif + } + + if (axis_connection) LCD_MESSAGEPGM(MSG_ERROR_TMC); +} + +#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h new file mode 100644 index 00000000..b65a1254 --- /dev/null +++ b/Marlin/src/feature/tmc_util.h @@ -0,0 +1,395 @@ +/** + * 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 "../lcd/ultralcd.h" + +#if HAS_TRINAMIC_CONFIG + +#include +#include "../module/planner.h" + +#define CHOPPER_DEFAULT_12V { 3, -1, 1 } +#define CHOPPER_DEFAULT_19V { 4, 1, 1 } +#define CHOPPER_DEFAULT_24V { 4, 2, 1 } +#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 +#endif + +constexpr uint16_t _tmc_thrs(const uint16_t msteps, const uint32_t thrs, const uint32_t spmm) { + return 12650000UL * msteps / (256 * thrs * spmm); +} + +template +class TMCStorage { + protected: + // Only a child class has access to constructor => Don't create on its own! "Poor man's abstract class" + TMCStorage() {} + + public: + uint16_t val_mA = 0; + + #if ENABLED(MONITOR_DRIVER_STATUS) + uint8_t otpw_count = 0, + error_count = 0; + bool flag_otpw = false; + inline bool getOTPW() { return flag_otpw; } + inline void clear_otpw() { flag_otpw = 0; } + #endif + + inline uint16_t getMilliamps() { return val_mA; } + + inline void printLabel() { + SERIAL_CHAR(AXIS_LETTER); + if (DRIVER_ID > '0') SERIAL_CHAR(DRIVER_ID); + } + + struct { + TERN_(HAS_STEALTHCHOP, bool stealthChop_enabled = false); + TERN_(HYBRID_THRESHOLD, uint8_t hybrid_thrs = 0); + TERN_(USE_SENSORLESS, int16_t homing_thrs = 0); + } stored; +}; + +template +class TMCMarlin : public TMC, public TMCStorage { + public: + TMCMarlin(const uint16_t cs_pin, const float RS) : + TMC(cs_pin, RS) + {} + TMCMarlin(const uint16_t cs_pin, const float RS, const uint8_t axis_chain_index) : + TMC(cs_pin, RS, axis_chain_index) + {} + TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK) : + TMC(CS, RS, pinMOSI, pinMISO, pinSCK) + {} + TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) : + TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index) + {} + inline uint16_t rms_current() { return TMC::rms_current(); } + inline void rms_current(uint16_t mA) { + this->val_mA = mA; + TMC::rms_current(mA); + } + inline void rms_current(const uint16_t mA, const float mult) { + this->val_mA = mA; + TMC::rms_current(mA, mult); + } + inline uint16_t get_microstep_counter() { return TMC::MSCNT(); } + + #if HAS_STEALTHCHOP + inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); } + inline bool get_stealthChop_status() { return this->en_pwm_mode(); } + inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } + #endif + + #if ENABLED(HYBRID_THRESHOLD) + uint32_t get_pwm_thrs() { + return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); + } + void set_pwm_thrs(const uint32_t thrs) { + TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); + } + #endif + + #if USE_SENSORLESS + inline int16_t homing_threshold() { return TMC::sgt(); } + void homing_threshold(int16_t sgt_val) { + sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max); + TMC::sgt(sgt_val); + TERN_(HAS_LCD_MENU, this->stored.homing_thrs = sgt_val); + } + #if ENABLED(SPI_ENDSTOPS) + bool test_stall_status(); + #endif + #endif + + #if HAS_LCD_MENU + inline void refresh_stepper_current() { rms_current(this->val_mA); } + + #if ENABLED(HYBRID_THRESHOLD) + inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #if USE_SENSORLESS + inline void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } + #endif + #endif + + static constexpr int8_t sgt_min = -64, + sgt_max = 63; +}; + +template +class TMCMarlin : public TMC2208Stepper, public TMCStorage { + public: + TMCMarlin(Stream * SerialPort, const float RS, const uint8_t) : + TMC2208Stepper(SerialPort, RS) + {} + TMCMarlin(Stream * SerialPort, const float RS, uint8_t addr, const uint16_t mul_pin1, const uint16_t mul_pin2) : + TMC2208Stepper(SerialPort, RS, addr, mul_pin1, mul_pin2) + {} + TMCMarlin(const uint16_t RX, const uint16_t TX, const float RS, const uint8_t) : + TMC2208Stepper(RX, TX, RS) + {} + + uint16_t rms_current() { return TMC2208Stepper::rms_current(); } + inline void rms_current(const uint16_t mA) { + this->val_mA = mA; + TMC2208Stepper::rms_current(mA); + } + inline void rms_current(const uint16_t mA, const float mult) { + this->val_mA = mA; + TMC2208Stepper::rms_current(mA, mult); + } + inline uint16_t get_microstep_counter() { return TMC2208Stepper::MSCNT(); } + + #if HAS_STEALTHCHOP + inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } + inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } + #endif + + #if ENABLED(HYBRID_THRESHOLD) + uint32_t get_pwm_thrs() { + return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); + } + void set_pwm_thrs(const uint32_t thrs) { + TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); + } + #endif + + #if HAS_LCD_MENU + inline void refresh_stepper_current() { rms_current(this->val_mA); } + + #if ENABLED(HYBRID_THRESHOLD) + inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #endif +}; + +template +class TMCMarlin : public TMC2209Stepper, public TMCStorage { + public: + 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) : + TMC2209Stepper(RX, TX, RS, addr) + {} + uint8_t get_address() { return slave_address; } + uint16_t rms_current() { return TMC2209Stepper::rms_current(); } + inline void rms_current(const uint16_t mA) { + this->val_mA = mA; + TMC2209Stepper::rms_current(mA); + } + inline void rms_current(const uint16_t mA, const float mult) { + this->val_mA = mA; + TMC2209Stepper::rms_current(mA, mult); + } + inline uint16_t get_microstep_counter() { return TMC2209Stepper::MSCNT(); } + + #if HAS_STEALTHCHOP + inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); } + inline bool get_stealthChop_status() { return !this->en_spreadCycle(); } + inline bool get_stored_stealthChop_status() { return this->stored.stealthChop_enabled; } + #endif + + #if ENABLED(HYBRID_THRESHOLD) + uint32_t get_pwm_thrs() { + return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]); + } + void set_pwm_thrs(const uint32_t thrs) { + TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID])); + TERN_(HAS_LCD_MENU, this->stored.hybrid_thrs = thrs); + } + #endif + #if USE_SENSORLESS + inline int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); } + void homing_threshold(int16_t sgt_val) { + sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max); + TMC2209Stepper::SGTHRS(sgt_val); + TERN_(HAS_LCD_MENU, this->stored.homing_thrs = sgt_val); + } + #endif + + #if HAS_LCD_MENU + inline void refresh_stepper_current() { rms_current(this->val_mA); } + + #if ENABLED(HYBRID_THRESHOLD) + inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); } + #endif + #if USE_SENSORLESS + inline void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } + #endif + #endif + + static constexpr uint8_t sgt_min = 0, + sgt_max = 255; +}; + +template +class TMCMarlin : public TMC2660Stepper, public TMCStorage { + public: + TMCMarlin(const uint16_t cs_pin, const float RS, const uint8_t) : + TMC2660Stepper(cs_pin, RS) + {} + TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t) : + TMC2660Stepper(CS, RS, pinMOSI, pinMISO, pinSCK) + {} + inline uint16_t rms_current() { return TMC2660Stepper::rms_current(); } + inline void rms_current(const uint16_t mA) { + this->val_mA = mA; + TMC2660Stepper::rms_current(mA); + } + inline uint16_t get_microstep_counter() { return TMC2660Stepper::mstep(); } + + #if USE_SENSORLESS + inline int16_t homing_threshold() { return TMC2660Stepper::sgt(); } + void homing_threshold(int16_t sgt_val) { + sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max); + TMC2660Stepper::sgt(sgt_val); + TERN_(HAS_LCD_MENU, this->stored.homing_thrs = sgt_val); + } + #endif + + #if HAS_LCD_MENU + inline void refresh_stepper_current() { rms_current(this->val_mA); } + + #if USE_SENSORLESS + inline void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); } + #endif + #endif + + static constexpr int8_t sgt_min = -64, + sgt_max = 63; +}; + +template +void tmc_print_current(TMC &st) { + st.printLabel(); + SERIAL_ECHOLNPAIR(" driver current: ", st.getMilliamps()); +} + +#if ENABLED(MONITOR_DRIVER_STATUS) + template + void tmc_report_otpw(TMC &st) { + st.printLabel(); + SERIAL_ECHOPGM(" temperature prewarn triggered: "); + serialprint_truefalse(st.getOTPW()); + SERIAL_EOL(); + } + template + void tmc_clear_otpw(TMC &st) { + st.clear_otpw(); + st.printLabel(); + SERIAL_ECHOLNPGM(" prewarn flag cleared"); + } +#endif +#if ENABLED(HYBRID_THRESHOLD) + template + void tmc_print_pwmthrs(TMC &st) { + st.printLabel(); + SERIAL_ECHOLNPAIR(" stealthChop max speed: ", st.get_pwm_thrs()); + } +#endif +#if USE_SENSORLESS + template + void tmc_print_sgt(TMC &st) { + st.printLabel(); + SERIAL_ECHOPGM(" homing sensitivity: "); + SERIAL_PRINTLN(st.homing_threshold(), DEC); + } +#endif + +void monitor_tmc_drivers(); +void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z, const bool test_e); + +#if ENABLED(TMC_DEBUG) + #if ENABLED(MONITOR_DRIVER_STATUS) + void tmc_set_report_interval(const uint16_t update_interval); + #endif + void tmc_report_all(const bool print_x, const bool print_y, const bool print_z, const bool print_e); + void tmc_get_registers(const bool print_x, const bool print_y, const bool print_z, const bool print_e); +#endif + +/** + * TMC2130-specific sensorless homing using stallGuard2. + * stallGuard2 only works when in spreadCycle mode. + * spreadCycle and stealthChop are mutually-exclusive. + * + * Defined here because of limitations with templates and headers. + */ +#if USE_SENSORLESS + + // Track enabled status of stealthChop and only re-enable where applicable + struct sensorless_t { bool x, y, z, x2, y2, z2, z3, z4; }; + + #if ENABLED(IMPROVE_HOMING_RELIABILITY) + extern millis_t sg_guard_period; + constexpr uint16_t default_sg_guard_duration = 400; + + struct slow_homing_t { + xy_ulong_t acceleration; + TERN_(HAS_CLASSIC_JERK, xy_float_t jerk_xy); + }; + #endif + + bool tmc_enable_stallguard(TMC2130Stepper &st); + void tmc_disable_stallguard(TMC2130Stepper &st, const bool restore_stealth); + + bool tmc_enable_stallguard(TMC2209Stepper &st); + void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth); + + bool tmc_enable_stallguard(TMC2660Stepper); + void tmc_disable_stallguard(TMC2660Stepper, const bool); + + #if ENABLED(SPI_ENDSTOPS) + + template + bool TMCMarlin::test_stall_status() { + this->switchCSpin(LOW); + + // read stallGuard flag from TMC library, will handle HW and SW SPI + TMC2130_n::DRV_STATUS_t drv_status{0}; + drv_status.sr = this->DRV_STATUS(); + + this->switchCSpin(HIGH); + + return drv_status.stallGuard; + } + #endif // SPI_ENDSTOPS + +#endif // USE_SENSORLESS + +#if HAS_TMC_SPI + void tmc_init_cs_pins(); +#endif + +#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp new file mode 100644 index 00000000..3cc20579 --- /dev/null +++ b/Marlin/src/feature/twibus.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 ENABLED(EXPERIMENTAL_I2CBUS) + +#include "twibus.h" + +#include + +TWIBus::TWIBus() { + #if I2C_SLAVE_ADDRESS == 0 + Wire.begin(); // No address joins the BUS as the master + #else + Wire.begin(I2C_SLAVE_ADDRESS); // Join the bus as a slave + #endif + reset(); +} + +void TWIBus::reset() { + buffer_s = 0; + buffer[0] = 0x00; +} + +void TWIBus::address(const uint8_t adr) { + if (!WITHIN(adr, 8, 127)) { + SERIAL_ECHO_MSG("Bad I2C address (8-127)"); + } + + addr = adr; + + debug(PSTR("address"), adr); +} + +void TWIBus::addbyte(const char c) { + if (buffer_s >= COUNT(buffer)) return; + buffer[buffer_s++] = c; + debug(PSTR("addbyte"), c); +} + +void TWIBus::addbytes(char src[], uint8_t bytes) { + debug(PSTR("addbytes"), bytes); + while (bytes--) addbyte(*src++); +} + +void TWIBus::addstring(char str[]) { + debug(PSTR("addstring"), str); + while (char c = *str++) addbyte(c); +} + +void TWIBus::send() { + debug(PSTR("send"), addr); + + Wire.beginTransmission(I2C_ADDRESS(addr)); + Wire.write(buffer, buffer_s); + Wire.endTransmission(); + + reset(); +} + +// static +void TWIBus::echoprefix(uint8_t bytes, const char pref[], uint8_t adr) { + SERIAL_ECHO_START(); + serialprintPGM(pref); + SERIAL_ECHOPAIR(": from:", adr, " bytes:", bytes, " data:"); +} + +// static +void TWIBus::echodata(uint8_t bytes, const char pref[], uint8_t adr) { + echoprefix(bytes, pref, adr); + while (bytes-- && Wire.available()) SERIAL_CHAR(Wire.read()); + SERIAL_EOL(); +} + +void TWIBus::echobuffer(const char pref[], uint8_t adr) { + echoprefix(buffer_s, pref, adr); + LOOP_L_N(i, buffer_s) SERIAL_CHAR(buffer[i]); + SERIAL_EOL(); +} + +bool TWIBus::request(const uint8_t bytes) { + if (!addr) return false; + + debug(PSTR("request"), bytes); + + // requestFrom() is a blocking function + if (Wire.requestFrom(I2C_ADDRESS(addr), bytes) == 0) { + debug("request fail", I2C_ADDRESS(addr)); + return false; + } + + return true; +} + +void TWIBus::relay(const uint8_t bytes) { + debug(PSTR("relay"), bytes); + + if (request(bytes)) + echodata(bytes, PSTR("i2c-reply"), addr); +} + +uint8_t TWIBus::capture(char *dst, const uint8_t bytes) { + reset(); + uint8_t count = 0; + while (count < bytes && Wire.available()) + dst[count++] = Wire.read(); + + debug(PSTR("capture"), count); + + return count; +} + +// static +void TWIBus::flush() { + while (Wire.available()) Wire.read(); +} + +#if I2C_SLAVE_ADDRESS > 0 + + void TWIBus::receive(uint8_t bytes) { + debug(PSTR("receive"), bytes); + echodata(bytes, PSTR("i2c-receive"), 0); + } + + void TWIBus::reply(char str[]/*=nullptr*/) { + debug(PSTR("reply"), str); + + if (str) { + reset(); + addstring(str); + } + + Wire.write(buffer, buffer_s); + + reset(); + } + +#endif + +#if ENABLED(DEBUG_TWIBUS) + + // static + void TWIBus::prefix(const char func[]) { + SERIAL_ECHOPGM("TWIBus::"); + serialprintPGM(func); + SERIAL_ECHOPGM(": "); + } + void TWIBus::debug(const char func[], uint32_t adr) { + if (DEBUGGING(INFO)) { prefix(func); SERIAL_ECHOLN(adr); } + } + void TWIBus::debug(const char func[], char c) { + if (DEBUGGING(INFO)) { prefix(func); SERIAL_ECHOLN(c); } + } + void TWIBus::debug(const char func[], char str[]) { + if (DEBUGGING(INFO)) { prefix(func); SERIAL_ECHOLN(str); } + } + +#endif + +#endif // EXPERIMENTAL_I2CBUS diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h new file mode 100644 index 00000000..82aa9aa1 --- /dev/null +++ b/Marlin/src/feature/twibus.h @@ -0,0 +1,240 @@ +/** + * 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 "../core/macros.h" + +#include + +// Print debug messages with M111 S2 (Uses 236 bytes of PROGMEM) +//#define DEBUG_TWIBUS + +typedef void (*twiReceiveFunc_t)(int bytes); +typedef void (*twiRequestFunc_t)(); + +#define TWIBUS_BUFFER_SIZE 32 + +/** + * TWIBUS class + * + * This class implements a wrapper around the two wire (I2C) bus, allowing + * Marlin to send and request data from any slave device on the bus. + * + * The two main consumers of this class are M260 and M261. M260 provides a way + * to send an I2C packet to a device (no repeated starts) by caching up to 32 + * bytes in a buffer and then sending the buffer. + * M261 requests data from a device. The received data is relayed to serial out + * for the host to interpret. + * + * For more information see + * - https://marlinfw.org/docs/gcode/M260.html + * - https://marlinfw.org/docs/gcode/M261.html + */ +class TWIBus { + private: + /** + * @brief Number of bytes on buffer + * @description Number of bytes in the buffer waiting to be flushed to the bus + */ + uint8_t buffer_s = 0; + + /** + * @brief Internal buffer + * @details A fixed buffer. TWI commands can be no longer than this. + */ + uint8_t buffer[TWIBUS_BUFFER_SIZE]; + + + public: + /** + * @brief Target device address + * @description The target device address. Persists until changed. + */ + uint8_t addr = 0; + + /** + * @brief Class constructor + * @details Initialize the TWI bus and clear the buffer + */ + TWIBus(); + + /** + * @brief Reset the buffer + * @details Set the buffer to a known-empty state + */ + void reset(); + + /** + * @brief Send the buffer data to the bus + * @details Flush the buffer to the target address + */ + void send(); + + /** + * @brief Add one byte to the buffer + * @details Add a byte to the end of the buffer. + * Silently fails if the buffer is full. + * + * @param c a data byte + */ + void addbyte(const char c); + + /** + * @brief Add some bytes to the buffer + * @details Add bytes to the end of the buffer. + * Concatenates at the buffer size. + * + * @param src source data address + * @param bytes the number of bytes to add + */ + void addbytes(char src[], uint8_t bytes); + + /** + * @brief Add a null-terminated string to the buffer + * @details Add bytes to the end of the buffer up to a nul. + * Concatenates at the buffer size. + * + * @param str source string address + */ + void addstring(char str[]); + + /** + * @brief Set the target slave address + * @details The target slave address for sending the full packet + * + * @param adr 7-bit integer address + */ + void address(const uint8_t adr); + + /** + * @brief Prefix for echo to serial + * @details Echo a label, length, address, and "data:" + * + * @param bytes the number of bytes to request + */ + static void echoprefix(uint8_t bytes, const char prefix[], uint8_t adr); + + /** + * @brief Echo data on the bus to serial + * @details Echo some number of bytes from the bus + * to serial in a parser-friendly format. + * + * @param bytes the number of bytes to request + */ + static void echodata(uint8_t bytes, const char prefix[], uint8_t adr); + + /** + * @brief Echo data in the buffer to serial + * @details Echo the entire buffer to serial + * to serial in a parser-friendly format. + * + * @param bytes the number of bytes to request + */ + void echobuffer(const char prefix[], uint8_t adr); + + /** + * @brief Request data from the slave device and wait. + * @details Request a number of bytes from a slave device. + * Wait for the data to arrive, and return true + * on success. + * + * @param bytes the number of bytes to request + * @return status of the request: true=success, false=fail + */ + bool request(const uint8_t bytes); + + /** + * @brief Capture data from the bus into the buffer. + * @details Capture data after a request has succeeded. + * + * @param bytes the number of bytes to request + * @return the number of bytes captured to the buffer + */ + uint8_t capture(char *dst, const uint8_t bytes); + + /** + * @brief Flush the i2c bus. + * @details Get all bytes on the bus and throw them away. + */ + static void flush(); + + /** + * @brief Request data from the slave device, echo to serial. + * @details Request a number of bytes from a slave device and output + * the returned data to serial in a parser-friendly format. + * + * @param bytes the number of bytes to request + */ + void relay(const uint8_t bytes); + + #if I2C_SLAVE_ADDRESS > 0 + + /** + * @brief Register a slave receive handler + * @details Set a handler to receive data addressed to us + * + * @param handler A function to handle receiving bytes + */ + inline void onReceive(const twiReceiveFunc_t handler) { Wire.onReceive(handler); } + + /** + * @brief Register a slave request handler + * @details Set a handler to send data requested from us + * + * @param handler A function to handle receiving bytes + */ + inline void onRequest(const twiRequestFunc_t handler) { Wire.onRequest(handler); } + + /** + * @brief Default handler to receive + * @details Receive bytes sent to our slave address + * and simply echo them to serial. + */ + void receive(uint8_t bytes); + + /** + * @brief Send a reply to the bus + * @details Send the buffer and clear it. + * If a string is passed, write it into the buffer first. + */ + void reply(char str[]=nullptr); + inline void reply(const char str[]) { reply((char*)str); } + + #endif + + #if ENABLED(DEBUG_TWIBUS) + /** + * @brief Prints a debug message + * @details Prints a simple debug message "TWIBus::function: value" + */ + static void prefix(const char func[]); + static void debug(const char func[], uint32_t adr); + static void debug(const char func[], char c); + static void debug(const char func[], char adr[]); + static inline void debug(const char func[], uint8_t v) { debug(func, (uint32_t)v); } + #else + static inline void debug(const char[], uint32_t) {} + static inline void debug(const char[], char) {} + static inline void debug(const char[], char[]) {} + static inline void debug(const char[], uint8_t) {} + #endif +}; diff --git a/Marlin/src/feature/z_stepper_align.cpp b/Marlin/src/feature/z_stepper_align.cpp new file mode 100644 index 00000000..87b1f6f2 --- /dev/null +++ b/Marlin/src/feature/z_stepper_align.cpp @@ -0,0 +1,137 @@ +/** + * 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 . + * + */ + +/** + * feature/z_stepper_align.cpp + */ + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + +#include "z_stepper_align.h" +#include "../module/probe.h" + +ZStepperAlign z_stepper_align; + +xy_pos_t ZStepperAlign::xy[NUM_Z_STEPPER_DRIVERS]; + +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + xy_pos_t ZStepperAlign::stepper_xy[NUM_Z_STEPPER_DRIVERS]; +#endif + +void ZStepperAlign::reset_to_default() { + #ifdef Z_STEPPER_ALIGN_XY + + constexpr xy_pos_t xy_init[] = Z_STEPPER_ALIGN_XY; + static_assert(COUNT(xy_init) == NUM_Z_STEPPER_DRIVERS, + "Z_STEPPER_ALIGN_XY requires " + #if NUM_Z_STEPPER_DRIVERS == 4 + "four {X,Y} entries (Z, Z2, Z3, and Z4)." + #elif NUM_Z_STEPPER_DRIVERS == 3 + "three {X,Y} entries (Z, Z2, and Z3)." + #else + "two {X,Y} entries (Z and Z2)." + #endif + ); + + constexpr xyz_pos_t dpo = NOZZLE_TO_PROBE_OFFSET; + + #define LTEST(N) (xy_init[N].x >= _MAX(X_MIN_BED + PROBING_MARGIN_LEFT, X_MIN_POS + dpo.x) - 0.00001f) + #define RTEST(N) (xy_init[N].x <= _MIN(X_MAX_BED - PROBING_MARGIN_RIGHT, X_MAX_POS + dpo.x) + 0.00001f) + #define FTEST(N) (xy_init[N].y >= _MAX(Y_MIN_BED + PROBING_MARGIN_FRONT, Y_MIN_POS + dpo.y) - 0.00001f) + #define BTEST(N) (xy_init[N].y <= _MIN(Y_MAX_BED - PROBING_MARGIN_BACK, Y_MAX_POS + dpo.y) + 0.00001f) + + static_assert(LTEST(0) && RTEST(0), "The 1st Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); + static_assert(FTEST(0) && BTEST(0), "The 1st Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); + static_assert(LTEST(1) && RTEST(1), "The 2nd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); + static_assert(FTEST(1) && BTEST(1), "The 2nd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); + #if NUM_Z_STEPPER_DRIVERS >= 3 + static_assert(LTEST(2) && RTEST(2), "The 3rd Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); + static_assert(FTEST(2) && BTEST(2), "The 3rd Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); + #if NUM_Z_STEPPER_DRIVERS >= 4 + static_assert(LTEST(3) && RTEST(3), "The 4th Z_STEPPER_ALIGN_XY X is unreachable with the default probe X offset."); + static_assert(FTEST(3) && BTEST(3), "The 4th Z_STEPPER_ALIGN_XY Y is unreachable with the default probe Y offset."); + #endif + #endif + + #else // !defined(Z_STEPPER_ALIGN_XY) + + const xy_pos_t xy_init[] = { + #if NUM_Z_STEPPER_DRIVERS >= 3 // First probe point... + #if !Z_STEPPERS_ORIENTATION + { probe.min_x(), probe.min_y() }, // SW + #elif Z_STEPPERS_ORIENTATION == 1 + { probe.min_x(), probe.max_y() }, // NW + #elif Z_STEPPERS_ORIENTATION == 2 + { probe.max_x(), probe.max_y() }, // NE + #elif Z_STEPPERS_ORIENTATION == 3 + { probe.max_x(), probe.min_y() }, // SE + #else + #error "Z_STEPPERS_ORIENTATION must be from 0 to 3 (first point SW, NW, NE, SE)." + #endif + #if NUM_Z_STEPPER_DRIVERS == 4 // 3 more points... + #if !Z_STEPPERS_ORIENTATION + { probe.min_x(), probe.max_y() }, { probe.max_x(), probe.max_y() }, { probe.max_x(), probe.min_y() } // SW + #elif Z_STEPPERS_ORIENTATION == 1 + { probe.max_x(), probe.max_y() }, { probe.max_x(), probe.min_y() }, { probe.min_x(), probe.min_y() } // NW + #elif Z_STEPPERS_ORIENTATION == 2 + { probe.max_x(), probe.min_y() }, { probe.min_x(), probe.min_y() }, { probe.min_x(), probe.max_y() } // NE + #elif Z_STEPPERS_ORIENTATION == 3 + { probe.min_x(), probe.min_y() }, { probe.min_x(), probe.max_y() }, { probe.max_x(), probe.max_y() } // SE + #endif + #elif !Z_STEPPERS_ORIENTATION // or 2 more points... + { probe.max_x(), probe.min_y() }, { X_CENTER, probe.max_y() } // SW + #elif Z_STEPPERS_ORIENTATION == 1 + { probe.min_x(), probe.min_y() }, { probe.max_x(), Y_CENTER } // NW + #elif Z_STEPPERS_ORIENTATION == 2 + { probe.min_x(), probe.max_y() }, { X_CENTER, probe.min_y() } // NE + #elif Z_STEPPERS_ORIENTATION == 3 + { probe.max_x(), probe.max_y() }, { probe.min_x(), Y_CENTER } // SE + #endif + #elif Z_STEPPERS_ORIENTATION + { X_CENTER, probe.min_y() }, { X_CENTER, probe.max_y() } + #else + { probe.min_x(), Y_CENTER }, { probe.max_x(), Y_CENTER } + #endif + }; + + #endif // !defined(Z_STEPPER_ALIGN_XY) + + COPY(xy, xy_init); + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + constexpr xy_pos_t stepper_xy_init[] = Z_STEPPER_ALIGN_STEPPER_XY; + static_assert( + COUNT(stepper_xy_init) == NUM_Z_STEPPER_DRIVERS, + "Z_STEPPER_ALIGN_STEPPER_XY requires " + #if NUM_Z_STEPPER_DRIVERS == 4 + "four {X,Y} entries (Z, Z2, Z3, and Z4)." + #elif NUM_Z_STEPPER_DRIVERS == 3 + "three {X,Y} entries (Z, Z2, and Z3)." + #endif + ); + COPY(stepper_xy, stepper_xy_init); + #endif +} + +#endif // Z_STEPPER_AUTO_ALIGN diff --git a/Marlin/src/feature/z_stepper_align.h b/Marlin/src/feature/z_stepper_align.h new file mode 100644 index 00000000..e1b235b5 --- /dev/null +++ b/Marlin/src/feature/z_stepper_align.h @@ -0,0 +1,41 @@ +/** + * 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 + +/** + * feature/z_stepper_align.h + */ + +#include "../inc/MarlinConfig.h" + +class ZStepperAlign { + public: + static xy_pos_t xy[NUM_Z_STEPPER_DRIVERS]; + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + static xy_pos_t stepper_xy[NUM_Z_STEPPER_DRIVERS]; + #endif + + static void reset_to_default(); +}; + +extern ZStepperAlign z_stepper_align; diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp new file mode 100644 index 00000000..661128b0 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -0,0 +1,865 @@ +/** + * 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 . + * + */ + +/** + * G26 Mesh Validation Tool + * + * G26 is a Mesh Validation Tool intended to provide support for the Marlin Unified Bed Leveling System. + * In order to fully utilize and benefit from the Marlin Unified Bed Leveling System an accurate Mesh must + * be defined. G29 is designed to allow the user to quickly validate the correctness of her Mesh. It will + * first heat the bed and nozzle. It will then print lines and circles along the Mesh Cell boundaries and + * the intersections of those lines (respectively). + * + * This action allows the user to immediately see where the Mesh is properly defined and where it needs to + * be edited. The command will generate the Mesh lines closest to the nozzle's starting position. Alternatively + * the user can specify the X and Y position of interest with command parameters. This allows the user to + * focus on a particular area of the Mesh where attention is needed. + * + * B # Bed Set the Bed Temperature. If not specified, a default of 60 C. will be assumed. + * + * C Current When searching for Mesh Intersection points to draw, use the current nozzle location + * as the base for any distance comparison. + * + * D Disable Disable the Unified Bed Leveling System. In the normal case the user is invoking this + * command to see how well a Mesh as been adjusted to match a print surface. In order to do + * this the Unified Bed Leveling System is turned on by the G26 command. The D parameter + * alters the command's normal behavior and disables the Unified Bed Leveling System even if + * it is on. + * + * 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 + * of filament that is being extruded during the printing of the various lines on the bed. + * + * K Keep-On Keep the heaters turned on at the end of the command. + * + * L # Layer Layer height. (Height of nozzle above bed) If not specified .20mm will be used. + * + * O # Ooooze How much your nozzle will Ooooze filament while getting in position to print. This + * is over kill, but using this parameter will let you get the very first 'circle' perfect + * so you have a trophy to peel off of the bed and hang up to show how perfectly you have your + * Mesh calibrated. If not specified, a filament length of .3mm is assumed. + * + * P # Prime Prime the nozzle with specified length of filament. If this parameter is not + * given, no prime action will take place. If the parameter specifies an amount, that much + * will be purged before continuing. If no amount is specified the command will start + * purging filament until the user provides an LCD Click and then it will continue with + * printing the Mesh. You can carefully remove the spent filament with a needle nose + * pliers while holding the LCD Click wheel in a depressed state. If you do not have + * an LCD, you must specify a value if you use P. + * + * Q # Multiplier Retraction Multiplier. Normally not needed. Retraction defaults to 1.0mm and + * un-retraction is at 1.2mm These numbers will be scaled by the specified amount + * + * R # Repeat Prints the number of patterns given as a parameter, starting at the current location. + * If a parameter isn't given, every point will be printed unless G26 is interrupted. + * This works the same way that the UBL G29 P4 R parameter works. + * + * NOTE: If you do not have an LCD, you -must- specify R. This is to ensure that you are + * aware that there's some risk associated with printing without the ability to abort in + * cases where mesh point Z value may be inaccurate. As above, if you do not include a + * parameter, every point will be printed. + * + * S # Nozzle Used to control the size of nozzle diameter. If not specified, a .4mm nozzle is assumed. + * + * U # Random Randomize the order that the circles are drawn on the bed. The search for the closest + * un-drawn circle is still done. But the distance to the location for each circle has a + * random number of the specified size added to it. Specifying S50 will give an interesting + * deviation from the normal behavior on a 10 x 10 Mesh. + * + * X # X Coord. Specify the starting location of the drawing activity. + * + * Y # Y Coord. Specify the starting location of the drawing activity. + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(G26_MESH_VALIDATION) + +#define G26_OK false +#define G26_ERR true + +#include "../../gcode/gcode.h" +#include "../../feature/bedlevel/bedlevel.h" + +#include "../../MarlinCore.h" +#include "../../module/planner.h" +#include "../../module/stepper.h" +#include "../../module/motion.h" +#include "../../module/tool_change.h" +#include "../../module/temperature.h" +#include "../../lcd/ultralcd.h" + +#define EXTRUSION_MULTIPLIER 1.0 +#define PRIME_LENGTH 10.0 +#define OOZE_AMOUNT 0.3 + +#define INTERSECTION_CIRCLE_RADIUS 5 +#define CROSSHAIRS_SIZE 3 + +#ifndef G26_RETRACT_MULTIPLIER + #define G26_RETRACT_MULTIPLIER 1.0 // x 1mm +#endif + +#ifndef G26_XY_FEEDRATE + #define G26_XY_FEEDRATE (PLANNER_XY_FEEDRATE() / 3.0) +#endif + +#if CROSSHAIRS_SIZE >= INTERSECTION_CIRCLE_RADIUS + #error "CROSSHAIRS_SIZE must be less than INTERSECTION_CIRCLE_RADIUS." +#endif + +#define G26_OK false +#define G26_ERR true + +#if ENABLED(ARC_SUPPORT) + void plan_arc(const xyze_pos_t &cart, const ab_float_t &offset, const uint8_t clockwise); +#endif + +constexpr float g26_e_axis_feedrate = 0.025; + +static MeshFlags circle_flags, horizontal_mesh_line_flags, vertical_mesh_line_flags; +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. + +float g26_extrusion_multiplier, + g26_retraction_multiplier, + g26_layer_height, + g26_prime_length; + +xy_pos_t g26_xy_pos; // = { 0, 0 } + +int16_t g26_bed_temp, + g26_hotend_temp; + +int8_t g26_prime_flag; + +#if HAS_LCD_MENU + + /** + * If the LCD is clicked, cancel, wait for release, return true + */ + bool user_canceled() { + if (!ui.button_pressed()) return false; // Return if the button isn't pressed + ui.set_status_P(GET_TEXT(MSG_G26_CANCELED), 99); + TERN_(HAS_LCD_MENU, ui.quick_feedback()); + ui.wait_for_release(); + return true; + } + +#endif + +mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { + float closest = 99999.99; + mesh_index_pair out_point; + + out_point.pos = -1; + + GRID_LOOP(i, j) { + if (!circle_flags.marked(i, j)) { + // We found a circle that needs to be printed + const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; + + // Get the distance to this intersection + float f = (pos - m).magnitude(); + + // It is possible that we are being called with the values + // to let us find the closest circle to the start position. + // But if this is not the case, add a small weighting to the + // distance calculation to help it choose a better place to continue. + f += (g26_xy_pos - m).magnitude() / 15.0f; + + // Add the specified amount of Random Noise to our search + if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); + + if (f < closest) { + closest = f; // Found a closer un-printed location + out_point.pos.set(i, j); // Save its data + out_point.distance = closest; + } + } + } + circle_flags.mark(out_point); // Mark this location as done. + return out_point; +} + +void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { + static float last_z = -999.99; + + const xy_pos_t dest = { rx, ry }; + + const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. + + destination = current_position; + + if (z != last_z) { + last_z = destination.z = z; + const feedRate_t feed_value = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate + prepare_internal_move_to_destination(feed_value); + destination = current_position; + } + + // If X or Y is involved do a 'normal' move. Otherwise retract/recover/hop. + destination = dest; + destination.e += e_delta; + const feedRate_t feed_value = has_xy_component ? feedRate_t(G26_XY_FEEDRATE) : planner.settings.max_feedrate_mm_s[E_AXIS] * 0.666f; + prepare_internal_move_to_destination(feed_value); + destination = current_position; +} + +FORCE_INLINE void move_to(const xyz_pos_t &where, const float &de) { move_to(where.x, where.y, where.z, de); } + +void retract_filament(const xyz_pos_t &where) { + if (!g26_retracted) { // Only retract if we are not already retracted! + g26_retracted = true; + move_to(where, -1.0f * g26_retraction_multiplier); + } +} + +// TODO: Parameterize the Z lift with a define +void retract_lift_move(const xyz_pos_t &s) { + retract_filament(destination); + move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0); // Z lift to minimize scraping + move_to(s.x, s.y, s.z + 0.5f, 0.0); // Get to the starting point with no extrusion while lifted +} + +void recover_filament(const xyz_pos_t &where) { + if (g26_retracted) { // Only un-retract if we are retracted. + move_to(where, 1.2f * g26_retraction_multiplier); + g26_retracted = false; + } +} + +/** + * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one + * to the other. But there are really three sets of coordinates involved. The first coordinate + * is the present location of the nozzle. We don't necessarily want to print from this location. + * We first need to move the nozzle to the start of line segment where we want to print. Once + * there, we can use the two coordinates supplied to draw the line. + * + * Note: Although we assume the first set of coordinates is the start of the line and the second + * set of coordinates is the end of the line, it does not always work out that way. This function + * optimizes the movement to minimize the travel distance before it can start printing. This saves + * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does + * cause a lot of very little short retracement of th nozzle when it draws the very first line + * segment of a 'circle'. The time this requires is very short and is easily saved by the other + * cases where the optimization comes into play. + */ +void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { + + // Distances to the start / end of the line + xy_float_t svec = current_position - s, evec = current_position - e; + + const float dist_start = HYPOT2(svec.x, svec.y), + dist_end = HYPOT2(evec.x, evec.y), + line_length = HYPOT(e.x - s.x, e.y - s.y); + + // If the end point of the line is closer to the nozzle, flip the direction, + // moving from the end to the start. On very small lines the optimization isn't worth it. + if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) + return print_line_from_here_to_there(e, s); + + // Decide whether to retract & lift + if (dist_start > 2.0) retract_lift_move(s); + + move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift + + const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; + + recover_filament(destination); + move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion +} + +inline bool look_for_lines_to_connect() { + xyz_pos_t s, e; + s.z = e.z = g26_layer_height; + + GRID_LOOP(i, j) { + + if (TERN0(HAS_LCD_MENU, user_canceled())) return true; + + if (i < (GRID_MAX_POINTS_X)) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X. + // Already a half circle at the edge of the bed. + + if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done + if (!horizontal_mesh_line_flags.marked(i, j)) { + // Two circles need a horizontal line to connect them + s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge + e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge + + LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); + s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + + if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) + print_line_from_here_to_there(s, e); + + horizontal_mesh_line_flags.mark(i, j); // Mark done, even if skipped + } + } + + if (j < (GRID_MAX_POINTS_Y)) { // Can't connect to anything further back than GRID_MAX_POINTS_Y. + // Already a half circle at the edge of the bed. + + if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done + if (!vertical_mesh_line_flags.marked(i, j)) { + // Two circles that need a vertical line to connect them + s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge + e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge + + s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + + if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) + print_line_from_here_to_there(s, e); + + vertical_mesh_line_flags.mark(i, j); // Mark done, even if skipped + } + } + } + } + } + return false; +} + +/** + * Turn on the bed and nozzle heat and + * wait for them to get up to temperature. + */ +inline bool turn_on_heaters() { + + SERIAL_ECHOLNPGM("Waiting for heatup."); + + #if HAS_HEATED_BED + + if (g26_bed_temp > 25) { + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); + ui.quick_feedback(); + TERN_(HAS_LCD_MENU, ui.capture()); + #endif + thermalManager.setTargetBed(g26_bed_temp); + + // Wait for the temperature to stabilize + if (!thermalManager.wait_for_bed(true + #if G26_CLICK_CAN_CANCEL + , true + #endif + ) + ) return G26_ERR; + } + + #endif // HAS_HEATED_BED + + // Start heating the active nozzle + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); + ui.quick_feedback(); + #endif + thermalManager.setTargetHotend(g26_hotend_temp, active_extruder); + + // Wait for the temperature to stabilize + if (!thermalManager.wait_for_hotend(active_extruder, true + #if G26_CLICK_CAN_CANCEL + , true + #endif + )) return G26_ERR; + + #if HAS_WIRED_LCD + ui.reset_status(); + ui.quick_feedback(); + #endif + + return G26_OK; +} + +/** + * Prime the nozzle if needed. Return true on error. + */ +inline bool prime_nozzle() { + + const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; + #if HAS_LCD_MENU && !HAS_TOUCH_XPT2046 // ui.button_pressed issue with touchscreen + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + float Total_Prime = 0.0; + #endif + + if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged + ui.capture(); + ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); + ui.chirp(); + + destination = current_position; + + recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). + + while (!ui.button_pressed()) { + ui.chirp(); + destination.e += 0.25; + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + Total_Prime += 0.25; + if (Total_Prime >= EXTRUDE_MAXLENGTH) { + ui.release(); + return G26_ERR; + } + #endif + prepare_internal_move_to_destination(fr_slow_e); + destination = current_position; + planner.synchronize(); // Without this synchronize, the purge is more consistent, + // but because the planner has a buffer, we won't be able + // to stop as quickly. So we put up with the less smooth + // action to give the user a more responsive 'Stop'. + } + + ui.wait_for_release(); + + ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); + ui.quick_feedback(); + ui.release(); + } + else + #endif + { + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); + ui.quick_feedback(); + #endif + destination = current_position; + destination.e += g26_prime_length; + prepare_internal_move_to_destination(fr_slow_e); + destination.e -= g26_prime_length; + retract_filament(destination); + } + + return G26_OK; +} + +/** + * G26: Mesh Validation Pattern generation. + * + * Used to interactively edit the mesh by placing the + * nozzle in a problem area and doing a G29 P4 R command. + * + * Parameters: + * + * B Bed Temperature + * C Continue from the Closest mesh point + * D Disable leveling before starting + * F Filament diameter + * H Hotend Temperature + * K Keep heaters on when completed + * L Layer Height + * O Ooze extrusion length + * P Prime length + * Q Retraction multiplier + * R Repetitions (number of grid points) + * S Nozzle Size (diameter) in mm + * T Tool index to change to, if included + * U Random deviation (50 if no value given) + * X X position + * Y Y position + */ +void GcodeSuite::G26() { + SERIAL_ECHOLNPGM("G26 starting..."); + + // Don't allow Mesh Validation without homing first, + // or if the parameter parsing did not go OK, abort + if (homing_needed_error()) return; + + // Change the tool first, if specified + if (parser.seenval('T')) tool_change(parser.value_int()); + + g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; + g26_retraction_multiplier = G26_RETRACT_MULTIPLIER; + g26_layer_height = MESH_TEST_LAYER_HEIGHT; + g26_prime_length = PRIME_LENGTH; + g26_bed_temp = MESH_TEST_BED_TEMP; + g26_hotend_temp = MESH_TEST_HOTEND_TEMP; + g26_prime_flag = 0; + + float g26_nozzle = MESH_TEST_NOZZLE_SIZE, + g26_filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, + g26_ooze_amount = parser.linearval('O', OOZE_AMOUNT); + + bool g26_continue_with_closest = parser.boolval('C'), + g26_keep_heaters_on = parser.boolval('K'); + + // Accept 'I' if temperature presets are defined + #if PREHEAT_COUNT + const uint8_t preset_index = parser.seenval('I') ? _MIN(parser.value_byte(), PREHEAT_COUNT - 1) + 1 : 0; + #endif + + #if HAS_HEATED_BED + + // 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 // HAS_HEATED_BED + + if (parser.seenval('L')) { + g26_layer_height = parser.value_linear_units(); + if (!WITHIN(g26_layer_height, 0.0, 2.0)) { + SERIAL_ECHOLNPGM("?Specified layer height not plausible."); + return; + } + } + + if (parser.seen('Q')) { + if (parser.has_value()) { + g26_retraction_multiplier = parser.value_float(); + if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { + SERIAL_ECHOLNPGM("?Specified Retraction Multiplier not plausible."); + return; + } + } + else { + SERIAL_ECHOLNPGM("?Retraction Multiplier must be specified."); + return; + } + } + + if (parser.seenval('S')) { + g26_nozzle = parser.value_float(); + if (!WITHIN(g26_nozzle, 0.1, 2.0)) { + SERIAL_ECHOLNPGM("?Specified nozzle size not plausible."); + return; + } + } + + if (parser.seen('P')) { + if (!parser.has_value()) { + #if HAS_LCD_MENU + g26_prime_flag = -1; + #else + SERIAL_ECHOLNPGM("?Prime length must be specified when not using an LCD."); + return; + #endif + } + else { + g26_prime_flag++; + g26_prime_length = parser.value_linear_units(); + if (!WITHIN(g26_prime_length, 0.0, 25.0)) { + SERIAL_ECHOLNPGM("?Specified prime length not plausible."); + return; + } + } + } + + if (parser.seenval('F')) { + g26_filament_diameter = parser.value_linear_units(); + if (!WITHIN(g26_filament_diameter, 1.0, 4.0)) { + SERIAL_ECHOLNPGM("?Specified filament size not plausible."); + return; + } + } + g26_extrusion_multiplier *= sq(1.75) / sq(g26_filament_diameter); // If we aren't using 1.75mm filament, we need to + // scale up or down the length needed to get the + // same volume of filament + + g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size + + // 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 + 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); + #else + if (!parser.seen('R')) { + SERIAL_ECHOLNPGM("?(R)epeat must be specified when not using an LCD."); + return; + } + else + g26_repeats = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS + 1; + #endif + if (g26_repeats < 1) { + SERIAL_ECHOLNPGM("?(R)epeat value not plausible; must be at least 1."); + 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)) { + SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds."); + return; + } + + /** + * Wait until all parameters are verified before altering the state! + */ + set_bed_leveling_enabled(!parser.seen('D')); + + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + + #if DISABLED(NO_VOLUMETRICS) + bool volumetric_was_enabled = parser.volumetric_enabled; + parser.volumetric_enabled = false; + planner.calculate_volumetric_multipliers(); + #endif + + if (turn_on_heaters() != G26_OK) goto LEAVE; + + current_position.e = 0.0; + sync_plan_position_e(); + + if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; + + /** + * Bed is preheated + * + * Nozzle is at temperature + * + * Filament is primed! + * + * It's "Show Time" !!! + */ + + circle_flags.reset(); + horizontal_mesh_line_flags.reset(); + vertical_mesh_line_flags.reset(); + + // Move nozzle to the specified height for the first layer + destination = current_position; + destination.z = g26_layer_height; + move_to(destination, 0.0); + move_to(destination, g26_ooze_amount); + + TERN_(HAS_LCD_MENU, ui.capture()); + + #if DISABLED(ARC_SUPPORT) + + /** + * Pre-generate radius offset values at 30 degree intervals to reduce CPU load. + */ + #define A_INT 30 + #define _ANGS (360 / A_INT) + #define A_CNT (_ANGS / 2) + #define _IND(A) ((A + _ANGS * 8) % _ANGS) + #define _COS(A) (trig_table[_IND(A) % A_CNT] * (_IND(A) >= A_CNT ? -1 : 1)) + #define _SIN(A) (-_COS((A + A_CNT / 2) % _ANGS)) + #if A_CNT & 1 + #error "A_CNT must be a positive value. Please change A_INT." + #endif + float trig_table[A_CNT]; + LOOP_L_N(i, A_CNT) + trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT)); + + #endif // !ARC_SUPPORT + + mesh_index_pair location; + do { + // Find the nearest confluence + location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_xy_pos); + + if (location.valid()) { + const xy_pos_t circle = _GET_MESH_POS(location.pos); + + // If this mesh location is outside the printable radius, skip it. + if (!position_is_reachable(circle)) continue; + + // Determine where to start and end the circle, + // which is always drawn counter-clockwise. + const xy_int8_t st = location; + const bool f = st.y == 0, + r = st.x >= GRID_MAX_POINTS_X - 1, + b = st.y >= GRID_MAX_POINTS_Y - 1; + + #if ENABLED(ARC_SUPPORT) + + #define ARC_LENGTH(quarters) (INTERSECTION_CIRCLE_RADIUS * M_PI * (quarters) / 2) + #define INTERSECTION_CIRCLE_DIAM ((INTERSECTION_CIRCLE_RADIUS) * 2) + + xy_float_t e = { circle.x + INTERSECTION_CIRCLE_RADIUS, circle.y }; + xyz_float_t s = e; + + // Figure out where to start and end the arc - we always print counterclockwise + float arc_length = ARC_LENGTH(4); + if (st.x == 0) { // left edge + if (!f) { s.x = circle.x; s.y -= INTERSECTION_CIRCLE_RADIUS; } + if (!b) { e.x = circle.x; e.y += INTERSECTION_CIRCLE_RADIUS; } + arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); + } + else if (r) { // right edge + if (b) s.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); + else s.set(circle.x, circle.y + INTERSECTION_CIRCLE_RADIUS); + if (f) e.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); + else e.set(circle.x, circle.y - (INTERSECTION_CIRCLE_RADIUS)); + arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); + } + else if (f) { + e.x -= INTERSECTION_CIRCLE_DIAM; + arc_length = ARC_LENGTH(2); + } + else if (b) { + s.x -= INTERSECTION_CIRCLE_DIAM; + arc_length = ARC_LENGTH(2); + } + + const ab_float_t arc_offset = circle - s; + const xy_float_t dist = current_position - s; // Distance from the start of the actual circle + const float dist_start = HYPOT2(dist.x, dist.y); + const xyze_pos_t endpoint = { + e.x, e.y, g26_layer_height, + current_position.e + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) + }; + + if (dist_start > 2.0) { + s.z = g26_layer_height + 0.5f; + retract_lift_move(s); + } + + s.z = g26_layer_height; + move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift + + recover_filament(destination); + + const feedRate_t old_feedrate = feedrate_mm_s; + feedrate_mm_s = PLANNER_XY_FEEDRATE() * 0.1f; + plan_arc(endpoint, arc_offset, false); // Draw a counter-clockwise arc + feedrate_mm_s = old_feedrate; + destination = current_position; + + if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation + + #else // !ARC_SUPPORT + + int8_t start_ind = -2, end_ind = 9; // Assume a full circle (from 5:00 to 5:00) + if (st.x == 0) { // Left edge? Just right half. + start_ind = f ? 0 : -3; // 03:00 to 12:00 for front-left + end_ind = b ? 0 : 2; // 06:00 to 03:00 for back-left + } + else if (r) { // Right edge? Just left half. + start_ind = b ? 6 : 3; // 12:00 to 09:00 for front-right + end_ind = f ? 5 : 8; // 09:00 to 06:00 for back-right + } + else if (f) { // Front edge? Just back half. + start_ind = 0; // 03:00 + end_ind = 5; // 09:00 + } + else if (b) { // Back edge? Just front half. + start_ind = 6; // 09:00 + end_ind = 11; // 03:00 + } + + for (int8_t ind = start_ind; ind <= end_ind; ind++) { + + if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation + + xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26_layer_height }, + q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26_layer_height }; + + #if IS_KINEMATIC + // Check to make sure this segment is entirely on the bed, skip if not. + if (!position_is_reachable(p) || !position_is_reachable(q)) continue; + #else + LIMIT(p.x, X_MIN_POS + 1, X_MAX_POS - 1); // Prevent hitting the endstops + LIMIT(p.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(q.x, X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(q.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + #endif + + print_line_from_here_to_there(p, q); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } + + #endif // !ARC_SUPPORT + + if (look_for_lines_to_connect()) goto LEAVE; + } + + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + + } while (--g26_repeats && location.valid()); + + LEAVE: + ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1); + + retract_filament(destination); + destination.z = Z_CLEARANCE_BETWEEN_PROBES; + move_to(destination, 0); // Raise the nozzle + + destination = g26_xy_pos; // Move back to the starting XY position + move_to(destination, 0); // Move back to the starting position + + #if DISABLED(NO_VOLUMETRICS) + parser.volumetric_enabled = volumetric_was_enabled; + planner.calculate_volumetric_multipliers(); + #endif + + TERN_(HAS_LCD_MENU, ui.release()); // Give back control of the LCD + + if (!g26_keep_heaters_on) { + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); + thermalManager.setTargetHotend(active_extruder, 0); + } +} + +#endif // G26_MESH_VALIDATION diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp new file mode 100644 index 00000000..0ede4e79 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -0,0 +1,190 @@ +/** + * 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(ASSISTED_TRAMMING) + +#include "../gcode.h" +#include "../../module/planner.h" +#include "../../module/probe.h" +#include "../../feature/bedlevel/bedlevel.h" + +#if HAS_MULTI_HOTEND + #include "../../module/tool_change.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +constexpr xy_pos_t screws_tilt_adjust_pos[] = TRAMMING_POINT_XY; + +static PGMSTR(point_name_1, TRAMMING_POINT_NAME_1); +static PGMSTR(point_name_2, TRAMMING_POINT_NAME_2); +static PGMSTR(point_name_3, TRAMMING_POINT_NAME_3); +#ifdef TRAMMING_POINT_NAME_4 + static PGMSTR(point_name_4, TRAMMING_POINT_NAME_4); + #ifdef TRAMMING_POINT_NAME_5 + static PGMSTR(point_name_5, TRAMMING_POINT_NAME_5); + #endif +#endif + +static PGM_P const tramming_point_name[] PROGMEM = { + point_name_1, point_name_2, point_name_3 + #ifdef TRAMMING_POINT_NAME_4 + , point_name_4 + #ifdef TRAMMING_POINT_NAME_5 + , point_name_5 + #endif + #endif +}; + +#define G35_PROBE_COUNT COUNT(screws_tilt_adjust_pos) + +#if !WITHIN(TRAMMING_SCREW_THREAD, 30, 51) || TRAMMING_SCREW_THREAD % 10 > 1 + #error "TRAMMING_SCREW_THREAD must be equal to 30, 31, 40, 41, 50, or 51." +#endif + +static_assert(G35_PROBE_COUNT > 2, "TRAMMING_POINT_XY requires at least 3 XY positions."); + +/** + * G35: Read bed corners to help adjust bed screws + * + * S + * + * Screw thread: 30 - Clockwise M3 + * 31 - Counter-Clockwise M3 + * 40 - Clockwise M4 + * 41 - Counter-Clockwise M4 + * 50 - Clockwise M5 + * 51 - Counter-Clockwise M5 + **/ +void GcodeSuite::G35() { + DEBUG_SECTION(log_G35, "G35", DEBUGGING(LEVELING)); + + if (DEBUGGING(LEVELING)) log_machine_info(); + + float z_measured[G35_PROBE_COUNT] = { 0 }; + + const uint8_t screw_thread = parser.byteval('S', TRAMMING_SCREW_THREAD); + if (!WITHIN(screw_thread, 30, 51) || screw_thread % 10 > 1) { + SERIAL_ECHOLNPGM("?(S)crew thread must be 30, 31, 40, 41, 50, or 51."); + return; + } + + // Wait for planner moves to finish! + planner.synchronize(); + + // Disable the leveling matrix before auto-aligning + #if HAS_LEVELING + TERN_(RESTORE_LEVELING_AFTER_G35, const bool leveling_was_active = planner.leveling_active); + set_bed_leveling_enabled(false); + #endif + + #if ENABLED(CNC_WORKSPACE_PLANES) + workspace_plane = PLANE_XY; + #endif + + // Always home with tool 0 active + #if HAS_MULTI_HOTEND + const uint8_t old_tool_index = active_extruder; + tool_change(0, true); + #endif + + #if HAS_DUPLICATION_MODE + extruder_duplication_enabled = false; + #endif + + // Home all before this procedure + home_all_axes(); + + bool err_break = false; + + // Probe all positions + LOOP_L_N(i, G35_PROBE_COUNT) { + + // In BLTOUCH HS mode, the probe travels in a deployed state. + // Users of G35 might have a badly misaligned bed, so raise Z by the + // length of the deployed pin (BLTOUCH stroke < 7mm) + current_position.z = (Z_CLEARANCE_BETWEEN_PROBES) + (7 * ENABLED(BLTOUCH_HS_MODE)); + + 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_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_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; + } + + if (!err_break) { + const float threads_factor[] = { 0.5, 0.7, 0.8 }; + + // Calculate adjusts + LOOP_S_L_N(i, 1, G35_PROBE_COUNT) { + const float diff = z_measured[0] - z_measured[i], + adjust = abs(diff) < 0.001f ? 0 : diff / threads_factor[(screw_thread - 30) / 10]; + + const int full_turns = trunc(adjust); + const float decimal_part = adjust - float(full_turns); + const int minutes = trunc(decimal_part * 60.0f); + + SERIAL_ECHOPAIR("Turn ", tramming_point_name[i], + " ", (screw_thread & 1) == (adjust > 0) ? "CCW" : "CW", + " by ", abs(full_turns), " turns"); + if (minutes) SERIAL_ECHOPAIR(" and ", abs(minutes), " minutes"); + if (ENABLED(REPORT_TRAMMING_MM)) SERIAL_ECHOPAIR(" (", -diff, "mm)"); + SERIAL_EOL(); + } + } + else + SERIAL_ECHOLNPGM("G35 aborted."); + + // Restore the active tool after homing + #if HAS_MULTI_HOTEND + tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER)); // Fetch previous toolhead if not PARKING_EXTRUDER + #endif + + #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G35) + set_bed_leveling_enabled(leveling_was_active); + #endif + + // Stow the probe, as the last call to probe.probe_at_point(...) left + // the probe deployed if it was successful. + probe.stow(); + + // After this operation the Z position needs correction + set_axis_never_homed(Z_AXIS); + + // Home Z after the alignment procedure + process_subcommands_now_P(PSTR("G28Z")); +} + +#endif // ASSISTED_TRAMMING diff --git a/Marlin/src/gcode/bedlevel/G42.cpp b/Marlin/src/gcode/bedlevel/G42.cpp new file mode 100644 index 00000000..a2896ed6 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/G42.cpp @@ -0,0 +1,73 @@ +/** + * 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_MESH + +#include "../gcode.h" +#include "../../MarlinCore.h" // for IsRunning() +#include "../../module/motion.h" +#include "../../module/probe.h" // for probe.offset +#include "../../feature/bedlevel/bedlevel.h" + +/** + * G42: Move X & Y axes to mesh coordinates (I & J) + */ +void GcodeSuite::G42() { + if (MOTION_CONDITIONS) { + const bool hasI = parser.seenval('I'); + const int8_t ix = hasI ? parser.value_int() : 0; + const bool hasJ = parser.seenval('J'); + const int8_t iy = hasJ ? parser.value_int() : 0; + + if ((hasI && !WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) || (hasJ && !WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1))) { + SERIAL_ECHOLNPGM(STR_ERR_MESH_XY); + return; + } + + // Move to current_position, as modified by I, J, P parameters + destination = current_position; + + if (hasI) destination.x = _GET_MESH_X(ix); + if (hasJ) destination.y = _GET_MESH_Y(iy); + + #if HAS_PROBE_XY_OFFSET + if (parser.boolval('P')) { + if (hasI) destination.x -= probe.offset_xy.x; + if (hasJ) destination.y -= probe.offset_xy.y; + } + #endif + + const feedRate_t fval = parser.linearval('F'), + fr_mm_s = MMM_TO_MMS(fval > 0 ? fval : 0.0f); + + // SCARA kinematic has "safe" XY raw moves + #if IS_SCARA + prepare_internal_fast_move_to_destination(fr_mm_s); + #else + prepare_internal_move_to_destination(fr_mm_s); + #endif + } +} + +#endif // HAS_MESH diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp new file mode 100644 index 00000000..96122c18 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -0,0 +1,245 @@ +/** + * 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_LEVELING + +#include "../gcode.h" +#include "../../feature/bedlevel/bedlevel.h" +#include "../../module/planner.h" +#include "../../module/probe.h" + +#if ENABLED(EEPROM_SETTINGS) + #include "../../module/settings.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +//#define M420_C_USE_MEAN + +/** + * M420: Enable/Disable Bed Leveling and/or set the Z fade height. + * + * S[bool] Turns leveling on or off + * Z[height] Sets the Z fade height (0 or none to disable) + * V[bool] Verbose - Print the leveling grid + * + * With AUTO_BED_LEVELING_UBL only: + * + * L[index] Load UBL mesh from index (0 is default) + * T[map] 0:Human-readable 1:CSV 2:"LCD" 4:Compact + * + * With mesh-based leveling only: + * + * C Center mesh on the mean of the lowest and highest + * + * With MARLIN_DEV_MODE: + * S2 Create a simple random mesh and enable + */ +void GcodeSuite::M420() { + const bool seen_S = parser.seen('S'), + to_enable = seen_S ? parser.value_bool() : planner.leveling_active; + + #if ENABLED(MARLIN_DEV_MODE) + if (parser.intval('S') == 2) { + const float x_min = probe.min_x(), x_max = probe.max_x(), + y_min = probe.min_y(), y_max = probe.max_y(); + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + bilinear_start.set(x_min, y_min); + bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1), + (y_max - y_min) / (GRID_MAX_POINTS_Y - 1)); + #endif + GRID_LOOP(x, y) { + Z_VALUES(x, y) = 0.001 * random(-200, 200); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, Z_VALUES(x, y))); + } + SERIAL_ECHOPGM("Simulated " STRINGIFY(GRID_MAX_POINTS_X) "x" STRINGIFY(GRID_MAX_POINTS_Y) " mesh "); + SERIAL_ECHOPAIR(" (", x_min); + SERIAL_CHAR(','); SERIAL_ECHO(y_min); + SERIAL_ECHOPAIR(")-(", x_max); + SERIAL_CHAR(','); SERIAL_ECHO(y_max); + SERIAL_ECHOLNPGM(")"); + } + #endif + + xyz_pos_t oldpos = current_position; + + // If disabling leveling do it right away + // (Don't disable for just M420 or M420 V) + if (seen_S && !to_enable) set_bed_leveling_enabled(false); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + // L to load a mesh from the EEPROM + if (parser.seen('L')) { + + set_bed_leveling_enabled(false); + + #if ENABLED(EEPROM_SETTINGS) + const int8_t storage_slot = parser.has_value() ? parser.value_int() : ubl.storage_slot; + const int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; + } + + if (!WITHIN(storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPGM("?Invalid storage slot."); + SERIAL_ECHOLNPAIR("?Use 0 to ", a - 1); + return; + } + + settings.load_mesh(storage_slot); + ubl.storage_slot = storage_slot; + + #else + + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; + + #endif + } + + // L or V display the map info + if (parser.seen("LV")) { + ubl.display_map(parser.byteval('T')); + SERIAL_ECHOPGM("Mesh is "); + if (!ubl.mesh_is_valid()) SERIAL_ECHOPGM("in"); + SERIAL_ECHOLNPAIR("valid\nStorage slot: ", ubl.storage_slot); + } + + #endif // AUTO_BED_LEVELING_UBL + + const bool seenV = parser.seen('V'); + + #if HAS_MESH + + if (leveling_is_valid()) { + + // Subtract the given value or the mean from all mesh values + if (parser.seen('C')) { + const float cval = parser.value_float(); + #if ENABLED(AUTO_BED_LEVELING_UBL) + + set_bed_leveling_enabled(false); + ubl.adjust_mesh_to_mean(true, cval); + + #else + + #if ENABLED(M420_C_USE_MEAN) + + // Get the sum and average of all mesh values + float mesh_sum = 0; + GRID_LOOP(x, y) mesh_sum += Z_VALUES(x, y); + const float zmean = mesh_sum / float(GRID_MAX_POINTS); + + #else + + // Find the low and high mesh values + float lo_val = 100, hi_val = -100; + GRID_LOOP(x, y) { + const float z = Z_VALUES(x, y); + NOMORE(lo_val, z); + NOLESS(hi_val, z); + } + // Take the mean of the lowest and highest + const float zmean = (lo_val + hi_val) / 2.0 + cval; + + #endif + + // If not very close to 0, adjust the mesh + if (!NEAR_ZERO(zmean)) { + set_bed_leveling_enabled(false); + // Subtract the mean from all values + GRID_LOOP(x, y) { + Z_VALUES(x, y) -= zmean; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, Z_VALUES(x, y))); + } + TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); + } + + #endif + } + + } + else if (to_enable || seenV) { + SERIAL_ECHO_MSG("Invalid mesh."); + goto EXIT_M420; + } + + #endif // HAS_MESH + + // V to print the matrix or mesh + if (seenV) { + #if ABL_PLANAR + planner.bed_level_matrix.debug(PSTR("Bed Level Correction Matrix:")); + #else + if (leveling_is_valid()) { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + print_bilinear_leveling_grid(); + TERN_(ABL_BILINEAR_SUBDIVISION, print_bilinear_leveling_grid_virt()); + #elif ENABLED(MESH_BED_LEVELING) + SERIAL_ECHOLNPGM("Mesh Bed Level data:"); + mbl.report_mesh(); + #endif + } + #endif + } + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (parser.seen('Z')) set_z_fade_height(parser.value_linear_units(), false); + #endif + + // Enable leveling if specified, or if previously active + set_bed_leveling_enabled(to_enable); + + #if HAS_MESH + EXIT_M420: + #endif + + // Error if leveling failed to enable or reenable + if (to_enable && !planner.leveling_active) + SERIAL_ERROR_MSG(STR_ERR_M420_FAILED); + + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Bed Leveling "); + serialprintln_onoff(planner.leveling_active); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Fade Height "); + if (planner.z_fade_height > 0.0) + SERIAL_ECHOLN(planner.z_fade_height); + else + SERIAL_ECHOLNPGM(STR_OFF); + #endif + + // Report change in position + if (oldpos != current_position) + report_current_position(); +} + +#endif // HAS_LEVELING diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp new file mode 100644 index 00000000..f7de6c8c --- /dev/null +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -0,0 +1,899 @@ +/** + * 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 . + * + */ + +/** + * G29.cpp - Auto Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_ABL_NOT_UBL + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" +#include "../../../module/motion.h" +#include "../../../module/planner.h" +#include "../../../module/stepper.h" +#include "../../../module/probe.h" +#include "../../queue.h" + +#if ENABLED(PROBE_TEMP_COMPENSATION) + #include "../../../feature/probe_temp_comp.h" + #include "../../../module/temperature.h" +#endif + +#if HAS_DISPLAY + #include "../../../lcd/ultralcd.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_LINEAR) + #include "../../../libs/least_squares_fit.h" +#endif + +#if ABL_PLANAR + #include "../../../libs/vector_3.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../../core/debug_out.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +#if ENABLED(DWIN_CREALITY_LCD) + #include "../../../lcd/dwin/e3v2/dwin.h" +#endif + +#if HAS_MULTI_HOTEND + #include "../../../module/tool_change.h" +#endif + +#if ABL_GRID + #if ENABLED(PROBE_Y_FIRST) + #define PR_OUTER_VAR meshCount.x + #define PR_OUTER_END abl_grid_points.x + #define PR_INNER_VAR meshCount.y + #define PR_INNER_END abl_grid_points.y + #else + #define PR_OUTER_VAR meshCount.y + #define PR_OUTER_END abl_grid_points.y + #define PR_INNER_VAR meshCount.x + #define PR_INNER_END abl_grid_points.x + #endif +#endif + +#define G29_RETURN(b) return TERN_(G29_RETRY_AND_RECOVER, b) + +/** + * G29: Detailed Z probe, probes the bed at 3 or more points. + * Will fail if the printer has not been homed with G28. + * + * Enhanced G29 Auto Bed Leveling Probe Routine + * + * O Auto-level only if needed + * + * D Dry-Run mode. Just evaluate the bed Topology - Don't apply + * or alter the bed level data. Useful to check the topology + * after a first run of G29. + * + * J Jettison current bed leveling data + * + * V Set the verbose level (0-4). Example: "G29 V3" + * + * Parameters With LINEAR leveling only: + * + * P Set the size of the grid that will be probed (P x P points). + * Example: "G29 P4" + * + * X Set the X size of the grid that will be probed (X x Y points). + * Example: "G29 X7 Y5" + * + * Y Set the Y size of the grid that will be probed (X x Y points). + * + * T Generate a Bed Topology Report. Example: "G29 P5 T" for a detailed report. + * This is useful for manual bed leveling and finding flaws in the bed (to + * assist with part placement). + * Not supported by non-linear delta printer bed leveling. + * + * Parameters With LINEAR and BILINEAR leveling only: + * + * S Set the XY travel speed between probe points (in units/min) + * + * H Set bounds to a centered square H x H units in size + * + * -or- + * + * F Set the Front limit of the probing grid + * B Set the Back limit of the probing grid + * L Set the Left limit of the probing grid + * R Set the Right limit of the probing grid + * + * Parameters with DEBUG_LEVELING_FEATURE only: + * + * C Make a totally fake grid with no actual probing. + * For use in testing when no probing is possible. + * + * Parameters with BILINEAR leveling only: + * + * Z Supply an additional Z probe offset + * + * Extra parameters with PROBE_MANUALLY: + * + * To do manual probing simply repeat G29 until the procedure is complete. + * The first G29 accepts parameters. 'G29 Q' for status, 'G29 A' to abort. + * + * Q Query leveling and G29 state + * + * A Abort current leveling procedure + * + * Extra parameters with BILINEAR only: + * + * W Write a mesh point. (If G29 is idle.) + * I X index for mesh point + * J Y index for mesh point + * X X for mesh point, overrides I + * Y Y for mesh point, overrides J + * Z Z for mesh point. Otherwise, raw current Z. + * + * Without PROBE_MANUALLY: + * + * E By default G29 will engage the Z probe, test the bed, then disengage. + * Include "E" to engage/disengage the Z probe for each sample. + * There's no extra effect if you have a fixed Z probe. + */ +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 + #if ENABLED(DEBUG_LEVELING_FEATURE) + const uint8_t old_debug_flags = marlin_debug_flags; + if (seenQ) marlin_debug_flags |= MARLIN_DEBUG_LEVELING; + 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 + + const bool seenA = TERN0(PROBE_MANUALLY, parser.seen('A')), + no_action = seenA || seenQ, + faux = ENABLED(DEBUG_LEVELING_FEATURE) && DISABLED(PROBE_MANUALLY) ? parser.boolval('C') : no_action; + + // Don't allow auto-leveling without homing first + 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"); + G29_RETURN(false); + } + + // Define local vars 'static' for manual probing, 'auto' otherwise + #define ABL_VAR TERN_(PROBE_MANUALLY, static) + + ABL_VAR int verbose_level; + ABL_VAR xy_pos_t probePos; + ABL_VAR float measured_z; + ABL_VAR bool dryrun, abl_should_enable; + + #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + ABL_VAR int abl_probe_index; + #endif + + #if ABL_GRID + + #if ENABLED(PROBE_MANUALLY) + ABL_VAR xy_int8_t meshCount; + #endif + + ABL_VAR xy_pos_t probe_position_lf, probe_position_rb; + ABL_VAR xy_float_t gridSpacing = { 0, 0 }; + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + ABL_VAR bool do_topography_map; + ABL_VAR xy_uint8_t abl_grid_points; + #else // Bilinear + constexpr xy_uint8_t abl_grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + ABL_VAR int abl_points; + #else + int constexpr abl_points = GRID_MAX_POINTS; + #endif + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + ABL_VAR float zoffset; + + #elif ENABLED(AUTO_BED_LEVELING_LINEAR) + + ABL_VAR int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + + ABL_VAR float eqnAMatrix[(GRID_MAX_POINTS) * 3], // "A" matrix of the linear system of equations + eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points + mean; + #endif + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + #if ENABLED(PROBE_MANUALLY) + int constexpr abl_points = 3; // used to show total points + #endif + + vector_3 points[3]; + probe.get_three_points(points); + + #endif // AUTO_BED_LEVELING_3POINT + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + struct linear_fit_data lsf_results; + incremental_LSF_reset(&lsf_results); + #endif + + /** + * On the initial G29 fetch command parameters. + */ + if (!g29_in_progress) { + + TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); + + #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + abl_probe_index = -1; + #endif + + abl_should_enable = planner.leveling_active; + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + const bool seen_w = parser.seen('W'); + if (seen_w) { + if (!leveling_is_valid()) { + SERIAL_ERROR_MSG("No bilinear grid"); + G29_RETURN(false); + } + + const float rz = parser.seenval('Z') ? RAW_Z_POSITION(parser.value_linear_units()) : current_position.z; + if (!WITHIN(rz, -10, 10)) { + SERIAL_ERROR_MSG("Bad Z value"); + G29_RETURN(false); + } + + const float rx = RAW_X_POSITION(parser.linearval('X', NAN)), + ry = RAW_Y_POSITION(parser.linearval('Y', NAN)); + int8_t i = parser.byteval('I', -1), j = parser.byteval('J', -1); + + if (!isnan(rx) && !isnan(ry)) { + // Get nearest i / j from rx / ry + i = (rx - bilinear_start.x + 0.5 * gridSpacing.x) / gridSpacing.x; + j = (ry - bilinear_start.y + 0.5 * gridSpacing.y) / gridSpacing.y; + LIMIT(i, 0, GRID_MAX_POINTS_X - 1); + LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); + } + if (WITHIN(i, 0, GRID_MAX_POINTS_X - 1) && WITHIN(j, 0, GRID_MAX_POINTS_Y)) { + set_bed_leveling_enabled(false); + z_values[i][j] = rz; + TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, rz)); + set_bed_leveling_enabled(abl_should_enable); + if (abl_should_enable) report_current_position(); + } + G29_RETURN(false); + } // parser.seen('W') + + #else + + constexpr bool seen_w = false; + + #endif + + // Jettison bed leveling data + if (!seen_w && parser.seen('J')) { + reset_bed_level(); + G29_RETURN(false); + } + + verbose_level = parser.intval('V'); + if (!WITHIN(verbose_level, 0, 4)) { + SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4)."); + G29_RETURN(false); + } + + dryrun = parser.boolval('D') || TERN0(PROBE_MANUALLY, no_action); + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + + do_topography_map = verbose_level > 2 || parser.boolval('T'); + + // X and Y specify points in each direction, overriding the default + // These values may be saved with the completed mesh + abl_grid_points.set( + parser.byteval('X', GRID_MAX_POINTS_X), + parser.byteval('Y', GRID_MAX_POINTS_Y) + ); + if (parser.seenval('P')) abl_grid_points.x = abl_grid_points.y = parser.value_int(); + + if (!WITHIN(abl_grid_points.x, 2, GRID_MAX_POINTS_X)) { + SERIAL_ECHOLNPGM("?Probe points (X) implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); + G29_RETURN(false); + } + if (!WITHIN(abl_grid_points.y, 2, GRID_MAX_POINTS_Y)) { + SERIAL_ECHOLNPGM("?Probe points (Y) implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); + G29_RETURN(false); + } + + abl_points = abl_grid_points.x * abl_grid_points.y; + mean = 0; + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + zoffset = parser.linearval('Z'); + + #endif + + #if ABL_GRID + + xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED)); + + const float x_min = probe.min_x(), x_max = probe.max_x(), + y_min = probe.min_y(), y_max = probe.max_y(); + + if (parser.seen('H')) { + const int16_t size = (int16_t)parser.value_linear_units(); + probe_position_lf.set( + _MAX(X_CENTER - size / 2, x_min), + _MAX(Y_CENTER - size / 2, y_min) + ); + probe_position_rb.set( + _MIN(probe_position_lf.x + size, x_max), + _MIN(probe_position_lf.y + size, y_max) + ); + } + else { + probe_position_lf.set( + parser.seenval('L') ? RAW_X_POSITION(parser.value_linear_units()) : x_min, + parser.seenval('F') ? RAW_Y_POSITION(parser.value_linear_units()) : y_min + ); + probe_position_rb.set( + parser.seenval('R') ? RAW_X_POSITION(parser.value_linear_units()) : x_max, + parser.seenval('B') ? RAW_Y_POSITION(parser.value_linear_units()) : y_max + ); + } + + if (!probe.good_bounds(probe_position_lf, probe_position_rb)) { + SERIAL_ECHOLNPGM("? (L,R,F,B) out of bounds."); + G29_RETURN(false); + } + + // probe at the points of a lattice grid + gridSpacing.set((probe_position_rb.x - probe_position_lf.x) / (abl_grid_points.x - 1), + (probe_position_rb.y - probe_position_lf.y) / (abl_grid_points.y - 1)); + + #endif // ABL_GRID + + if (verbose_level > 0) { + SERIAL_ECHOPGM("G29 Auto Bed Leveling"); + if (dryrun) SERIAL_ECHOPGM(" (DRYRUN)"); + SERIAL_EOL(); + } + + planner.synchronize(); + + if (!faux) remember_feedrate_scaling_off(); + + // Disable auto bed leveling during G29. + // Be formal so G29 can be done successively without G28. + if (!no_action) set_bed_leveling_enabled(false); + + // Deploy certain probes before starting probing + #if HAS_BED_PROBE + if (ENABLED(BLTOUCH)) + do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); + else if (probe.deploy()) { + set_bed_leveling_enabled(abl_should_enable); + G29_RETURN(false); + } + #endif + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (TERN1(PROBE_MANUALLY, !no_action) + && (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start) + ) { + // Reset grid to 0.0 or "not probed". (Also disables ABL) + reset_bed_level(); + + // Initialize a grid with the given dimensions + bilinear_grid_spacing = gridSpacing; + bilinear_start = probe_position_lf; + + // Can't re-enable (on error) until the new grid is written + abl_should_enable = false; + } + + #endif // AUTO_BED_LEVELING_BILINEAR + + #if ENABLED(AUTO_BED_LEVELING_3POINT) + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> 3-point Leveling"); + + // Probe at 3 arbitrary points + points[0].z = points[1].z = points[2].z = 0; + + #endif // AUTO_BED_LEVELING_3POINT + + } // !g29_in_progress + + #if ENABLED(PROBE_MANUALLY) + + // For manual probing, get the next index to probe now. + // On the first probe this will be incremented to 0. + if (!no_action) { + ++abl_probe_index; + g29_in_progress = true; + } + + // Abort current G29 procedure, go back to idle state + if (seenA && g29_in_progress) { + SERIAL_ECHOLNPGM("Manual G29 aborted"); + SET_SOFT_ENDSTOP_LOOSE(false); + set_bed_leveling_enabled(abl_should_enable); + g29_in_progress = false; + TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + } + + // Query G29 status + if (verbose_level || seenQ) { + SERIAL_ECHOPGM("Manual G29 "); + if (g29_in_progress) { + SERIAL_ECHOPAIR("point ", _MIN(abl_probe_index + 1, abl_points)); + SERIAL_ECHOLNPAIR(" of ", abl_points); + } + else + SERIAL_ECHOLNPGM("idle"); + } + + if (no_action) G29_RETURN(false); + + if (abl_probe_index == 0) { + // For the initial G29 S2 save software endstop state + SET_SOFT_ENDSTOP_LOOSE(true); + // Move close to the bed before the first point + do_blocking_move_to_z(0); + } + else { + + #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) + const uint16_t index = abl_probe_index - 1; + #endif + + // For G29 after adjusting Z. + // Save the previous Z before going to the next point + measured_z = current_position.z; + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + + mean += measured_z; + eqnBVector[index] = measured_z; + eqnAMatrix[index + 0 * abl_points] = probePos.x; + eqnAMatrix[index + 1 * abl_points] = probePos.y; + eqnAMatrix[index + 2 * abl_points] = 1; + + incremental_LSF(&lsf_results, probePos, measured_z); + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + points[index].z = measured_z; + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + const float newz = measured_z + zoffset; + z_values[meshCount.x][meshCount.y] = newz; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, newz)); + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_P(PSTR("Save X"), meshCount.x, SP_Y_STR, meshCount.y, SP_Z_STR, measured_z + zoffset); + + #endif + } + + // + // If there's another point to sample, move there with optional lift. + // + + #if ABL_GRID + + // Skip any unreachable points + while (abl_probe_index < abl_points) { + + // Set meshCount.x, meshCount.y based on abl_probe_index, with zig-zag + PR_OUTER_VAR = abl_probe_index / PR_INNER_END; + PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); + + // Probe in reverse order for every other row/column + const bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); + if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; + + probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + + TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = abl_probe_index); + + // Keep looping till a reachable point is found + if (position_is_reachable(probePos)) break; + ++abl_probe_index; + } + + // Is there a next point to move to? + if (abl_probe_index < abl_points) { + _manual_goto_xy(probePos); // Can be used here too! + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + SET_SOFT_ENDSTOP_LOOSE(true); + G29_RETURN(false); + } + else { + // Leveling done! Fall through to G29 finishing code below + SERIAL_ECHOLNPGM("Grid probing done."); + // Re-enable software endstops, if needed + SET_SOFT_ENDSTOP_LOOSE(false); + } + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + // Probe at 3 arbitrary points + if (abl_probe_index < abl_points) { + probePos = points[abl_probe_index]; + _manual_goto_xy(probePos); + // Disable software endstops to allow manual adjustment + // If G29 is not completed, they will not be re-enabled + SET_SOFT_ENDSTOP_LOOSE(true); + G29_RETURN(false); + } + else { + + SERIAL_ECHOLNPGM("3-point probing done."); + + // Re-enable software endstops, if needed + SET_SOFT_ENDSTOP_LOOSE(false); + + if (!dryrun) { + vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); + if (planeNormal.z < 0) planeNormal *= -1; + planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); + + // Can't re-enable (on error) until the new grid is written + abl_should_enable = false; + } + + } + + #endif // AUTO_BED_LEVELING_3POINT + + #else // !PROBE_MANUALLY + { + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; + + measured_z = 0; + + #if ABL_GRID + + bool zig = PR_OUTER_END & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION + + measured_z = 0; + + xy_int8_t meshCount; + + // Outer loop is X with PROBE_Y_FIRST enabled + // Outer loop is Y with PROBE_Y_FIRST disabled + for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { + + int8_t inStart, inStop, inInc; + + if (zig) { // Zig away from origin + inStart = 0; // Left or front + inStop = PR_INNER_END; // Right or back + inInc = 1; // Zig right + } + else { // Zag towards origin + inStart = PR_INNER_END - 1; // Right or back + inStop = -1; // Left or front + inInc = -1; // Zag left + } + + zig ^= true; // zag + + // An index to print current state + uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_END) + 1; + + // Inner loop is Y with PROBE_Y_FIRST enabled + // Inner loop is X with PROBE_Y_FIRST disabled + for (PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; pt_index++, PR_INNER_VAR += inInc) { + + probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + + TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = ++abl_probe_index); // 0... + + // 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), "/", abl_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); + + if (isnan(measured_z)) { + set_bed_leveling_enabled(abl_should_enable); + break; // Breaks out of both loops + } + + #if ENABLED(PROBE_TEMP_COMPENSATION) + temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), measured_z); + temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), measured_z); + TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), measured_z)); + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + + mean += measured_z; + eqnBVector[abl_probe_index] = measured_z; + eqnAMatrix[abl_probe_index + 0 * abl_points] = probePos.x; + eqnAMatrix[abl_probe_index + 1 * abl_points] = probePos.y; + eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; + + incremental_LSF(&lsf_results, probePos, measured_z); + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + z_values[meshCount.x][meshCount.y] = measured_z + zoffset; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, z_values[meshCount.x][meshCount.y])); + + #endif + + abl_should_enable = false; + idle_no_sleep(); + + } // inner + } // outer + + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + + // Probe at 3 arbitrary points + + LOOP_L_N(i, 3) { + 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]; + measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); + if (isnan(measured_z)) { + set_bed_leveling_enabled(abl_should_enable); + break; + } + points[i].z = measured_z; + } + + if (!dryrun && !isnan(measured_z)) { + vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); + if (planeNormal.z < 0) planeNormal *= -1; + planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); + + // Can't re-enable (on error) until the new grid is written + abl_should_enable = false; + } + + #endif // AUTO_BED_LEVELING_3POINT + + TERN_(HAS_DISPLAY, ui.reset_status()); + + // Stow the probe. No raise for FIX_MOUNTED_PROBE. + if (probe.stow()) { + set_bed_leveling_enabled(abl_should_enable); + measured_z = NAN; + } + } + #endif // !PROBE_MANUALLY + + // + // G29 Finishing Code + // + // Unless this is a dry run, auto bed leveling will + // definitely be enabled after this point. + // + // If code above wants to continue leveling, it should + // return or loop before this point. + // + + if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); + + #if ENABLED(PROBE_MANUALLY) + g29_in_progress = false; + TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + #endif + + // Calculate leveling, print reports, correct the position + if (!isnan(measured_z)) { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (!dryrun) extrapolate_unprobed_bed_level(); + print_bilinear_leveling_grid(); + + refresh_bed_level(); + + TERN_(ABL_BILINEAR_SUBDIVISION, print_bilinear_leveling_grid_virt()); + + #elif ENABLED(AUTO_BED_LEVELING_LINEAR) + + // For LINEAR leveling calculate matrix, print reports, correct the position + + /** + * solve the plane equation ax + by + d = z + * A is the matrix with rows [x y 1] for all the probed points + * B is the vector of the Z positions + * the normal vector to the plane is formed by the coefficients of the + * plane equation in the standard form, which is Vx*x+Vy*y+Vz*z+d = 0 + * so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z + */ + struct { float a, b, d; } plane_equation_coefficients; + + finish_incremental_LSF(&lsf_results); + plane_equation_coefficients.a = -lsf_results.A; // We should be able to eliminate the '-' on these three lines and down below + plane_equation_coefficients.b = -lsf_results.B; // but that is not yet tested. + plane_equation_coefficients.d = -lsf_results.D; + + mean /= abl_points; + + if (verbose_level) { + SERIAL_ECHOPAIR_F("Eqn coefficients: a: ", plane_equation_coefficients.a, 8); + SERIAL_ECHOPAIR_F(" b: ", plane_equation_coefficients.b, 8); + SERIAL_ECHOPAIR_F(" d: ", plane_equation_coefficients.d, 8); + if (verbose_level > 2) + SERIAL_ECHOPAIR_F("\nMean of sampled points: ", mean, 8); + SERIAL_EOL(); + } + + // Create the matrix but don't correct the position yet + if (!dryrun) + planner.bed_level_matrix = matrix_3x3::create_look_at( + vector_3(-plane_equation_coefficients.a, -plane_equation_coefficients.b, 1) // We can eliminate the '-' here and up above + ); + + // Show the Topography map if enabled + if (do_topography_map) { + + float min_diff = 999; + + auto print_topo_map = [&](PGM_P const title, const bool get_min) { + serialprintPGM(title); + for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { + LOOP_L_N(xx, abl_grid_points.x) { + const int ind = indexIntoAB[xx][yy]; + xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points], + eqnAMatrix[ind + 1 * abl_points], 0 }; + apply_rotation_xyz(planner.bed_level_matrix, tmp); + if (get_min) NOMORE(min_diff, eqnBVector[ind] - tmp.z); + const float subval = get_min ? mean : tmp.z + min_diff, + diff = eqnBVector[ind] - subval; + SERIAL_CHAR(' '); if (diff >= 0.0) SERIAL_CHAR('+'); // Include + for column alignment + SERIAL_ECHO_F(diff, 5); + } // xx + SERIAL_EOL(); + } // yy + SERIAL_EOL(); + }; + + print_topo_map(PSTR("\nBed Height Topography:\n" + " +--- BACK --+\n" + " | |\n" + " L | (+) | R\n" + " E | | I\n" + " F | (-) N (+) | G\n" + " T | | H\n" + " | (-) | T\n" + " | |\n" + " O-- FRONT --+\n" + " (0,0)\n"), true); + if (verbose_level > 3) + print_topo_map(PSTR("\nCorrected Bed Height vs. Bed Topology:\n"), false); + + } //do_topography_map + + #endif // AUTO_BED_LEVELING_LINEAR + + #if ABL_PLANAR + + // For LINEAR and 3POINT leveling correct the current position + + if (verbose_level > 0) + planner.bed_level_matrix.debug(PSTR("\n\nBed Level Correction Matrix:")); + + if (!dryrun) { + // + // Correct the current XYZ position based on the tilted plane. + // + + if (DEBUGGING(LEVELING)) DEBUG_POS("G29 uncorrected XYZ", current_position); + + xyze_pos_t converted = current_position; + planner.force_unapply_leveling(converted); // use conversion machinery + + // Use the last measured distance to the bed, if possible + if ( NEAR(current_position.x, probePos.x - probe.offset_xy.x) + && NEAR(current_position.y, probePos.y - probe.offset_xy.y) + ) { + const float simple_z = current_position.z - measured_z; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probed Z", simple_z, " Matrix Z", converted.z, " Discrepancy ", simple_z - converted.z); + converted.z = simple_z; + } + + // The rotated XY and corrected Z are now current_position + current_position = converted; + + if (DEBUGGING(LEVELING)) DEBUG_POS("G29 corrected XYZ", current_position); + } + + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (!dryrun) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("G29 uncorrected Z:", current_position.z); + + // Unapply the offset because it is going to be immediately applied + // and cause compensation movement in Z + const float fade_scaling_factor = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.fade_scaling_factor_for_z(current_position.z), 1); + current_position.z -= fade_scaling_factor * bilinear_z_offset(current_position); + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(" corrected Z:", current_position.z); + } + + #endif // ABL_PLANAR + + // Auto Bed Leveling is complete! Enable if possible. + planner.leveling_active = dryrun ? abl_should_enable : true; + } // !isnan(measured_z) + + // Restore state after probing + if (!faux) restore_feedrate_and_scaling(); + + // Sync the planner from the current_position + if (planner.leveling_active) sync_plan_position(); + + #if HAS_BED_PROBE + probe.move_z_after_probing(); + #endif + + #ifdef Z_PROBE_END_SCRIPT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); + planner.synchronize(); + process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); + #endif + + #if ENABLED(DWIN_CREALITY_LCD) + DWIN_CompletedLeveling(); + #endif + + report_current_position(); + + G29_RETURN(isnan(measured_z)); +} + +#endif // HAS_ABL_NOT_UBL diff --git a/Marlin/src/gcode/bedlevel/abl/M421.cpp b/Marlin/src/gcode/bedlevel/abl/M421.cpp new file mode 100644 index 00000000..182dc325 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/abl/M421.cpp @@ -0,0 +1,74 @@ +/** + * 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 . + * + */ + +/** + * M421.cpp - Auto Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_BILINEAR) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +/** + * M421: Set one or more Mesh Bed Leveling Z coordinates + * + * Usage: + * M421 I J Z + * M421 I J Q + * + * - If I is omitted, set the entire row + * - If J is omitted, set the entire column + * - If both I and J are omitted, set all + */ +void GcodeSuite::M421() { + int8_t ix = parser.intval('I', -1), iy = parser.intval('J', -1); + const bool hasZ = parser.seenval('Z'), + hasQ = !hasZ && parser.seenval('Q'); + + if (hasZ || hasQ) { + if (WITHIN(ix, -1, GRID_MAX_POINTS_X - 1) && WITHIN(iy, -1, GRID_MAX_POINTS_Y - 1)) { + const float zval = parser.value_linear_units(); + uint8_t sx = ix >= 0 ? ix : 0, ex = ix >= 0 ? ix : GRID_MAX_POINTS_X - 1, + sy = iy >= 0 ? iy : 0, ey = iy >= 0 ? iy : GRID_MAX_POINTS_Y - 1; + LOOP_S_LE_N(x, sx, ex) { + LOOP_S_LE_N(y, sy, ey) { + z_values[x][y] = zval + (hasQ ? z_values[x][y] : 0); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + } + TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); + } + else + SERIAL_ERROR_MSG(STR_ERR_MESH_XY); + } + else + SERIAL_ERROR_MSG(STR_ERR_M421_PARAMETERS); +} + +#endif // AUTO_BED_LEVELING_BILINEAR diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp new file mode 100644 index 00000000..d94c1605 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -0,0 +1,193 @@ +/** + * 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 . + * + */ + +/** + * G29.cpp - Mesh Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MESH_BED_LEVELING) + +#include "../../../feature/bedlevel/bedlevel.h" + +#include "../../gcode.h" +#include "../../queue.h" + +#include "../../../libs/buzzer.h" +#include "../../../lcd/ultralcd.h" +#include "../../../module/motion.h" +#include "../../../module/stepper.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +// Save 130 bytes with non-duplication of PSTR +inline void echo_not_entered(const char c) { SERIAL_CHAR(c); SERIAL_ECHOLNPGM(" not entered."); } + +/** + * G29: Mesh-based Z probe, probes a grid and produces a + * mesh to compensate for variable bed height + * + * Parameters With MESH_BED_LEVELING: + * + * S0 Report the current mesh values + * S1 Start probing mesh points + * S2 Probe the next mesh point + * S3 In Jn Zn.nn Manually modify a single point + * S4 Zn.nn Set z offset. Positive away from bed, negative closer to bed. + * S5 Reset and disable mesh + */ +void GcodeSuite::G29() { + + static int mbl_probe_index = -1; + + MeshLevelingState state = (MeshLevelingState)parser.byteval('S', (int8_t)MeshReport); + if (!WITHIN(state, 0, 5)) { + SERIAL_ECHOLNPGM("S out of range (0-5)."); + return; + } + + int8_t ix, iy; + + switch (state) { + case MeshReport: + SERIAL_ECHOPGM("Mesh Bed Leveling "); + if (leveling_is_valid()) { + serialprintln_onoff(planner.leveling_active); + mbl.report_mesh(); + } + else + SERIAL_ECHOLNPGM("has no data."); + break; + + case MeshStart: + mbl.reset(); + mbl_probe_index = 0; + if (!ui.wait_for_move) { + queue.inject_P(PSTR("G28\nG29 S2")); + return; + } + state = MeshNext; + + case MeshNext: + if (mbl_probe_index < 0) { + SERIAL_ECHOLNPGM("Start mesh probing with \"G29 S1\" first."); + return; + } + // For each G29 S2... + if (mbl_probe_index == 0) { + // Move close to the bed before the first point + do_blocking_move_to_z(0); + } + else { + // Save Z for the previous mesh position + mbl.set_zigzag_z(mbl_probe_index - 1, current_position.z); + SET_SOFT_ENDSTOP_LOOSE(false); + } + // If there's another point to sample, move there with optional lift. + if (mbl_probe_index < GRID_MAX_POINTS) { + // Disable software endstops to allow manual adjustment + // If G29 is left hanging without completion they won't be re-enabled! + SET_SOFT_ENDSTOP_LOOSE(true); + mbl.zigzag(mbl_probe_index++, ix, iy); + _manual_goto_xy({ mbl.index_to_xpos[ix], mbl.index_to_ypos[iy] }); + } + else { + // One last "return to the bed" (as originally coded) at completion + current_position.z = MANUAL_PROBE_HEIGHT; + line_to_current_position(); + planner.synchronize(); + + // After recording the last point, activate home and activate + mbl_probe_index = -1; + SERIAL_ECHOLNPGM("Mesh probing done."); + BUZZ(100, 659); + BUZZ(100, 698); + + home_all_axes(); + set_bed_leveling_enabled(true); + + #if ENABLED(MESH_G28_REST_ORIGIN) + current_position.z = 0; + line_to_current_position(homing_feedrate(Z_AXIS)); + planner.synchronize(); + #endif + + TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); + } + break; + + case MeshSet: + if (parser.seenval('I')) { + ix = parser.value_int(); + if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) { + SERIAL_ECHOPAIR("I out of range (0-", int(GRID_MAX_POINTS_X - 1)); + SERIAL_ECHOLNPGM(")"); + return; + } + } + else + return echo_not_entered('J'); + + if (parser.seenval('J')) { + iy = parser.value_int(); + if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { + SERIAL_ECHOPAIR("J out of range (0-", int(GRID_MAX_POINTS_Y - 1)); + SERIAL_ECHOLNPGM(")"); + return; + } + } + else + return echo_not_entered('J'); + + if (parser.seenval('Z')) { + mbl.z_values[ix][iy] = parser.value_linear_units(); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, mbl.z_values[ix][iy])); + } + else + return echo_not_entered('Z'); + break; + + case MeshSetZOffset: + if (parser.seenval('Z')) + mbl.z_offset = parser.value_linear_units(); + else + return echo_not_entered('Z'); + break; + + case MeshReset: + reset_bed_level(); + break; + + } // switch(state) + + if (state == MeshNext) { + SERIAL_ECHOPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS)); + SERIAL_ECHOLNPAIR(" of ", int(GRID_MAX_POINTS)); + } + + report_current_position(); +} + +#endif // MESH_BED_LEVELING diff --git a/Marlin/src/gcode/bedlevel/mbl/M421.cpp b/Marlin/src/gcode/bedlevel/mbl/M421.cpp new file mode 100644 index 00000000..1368ab0b --- /dev/null +++ b/Marlin/src/gcode/bedlevel/mbl/M421.cpp @@ -0,0 +1,59 @@ +/** + * 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 . + * + */ + +/** + * M421.cpp - Mesh Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(MESH_BED_LEVELING) + +#include "../../gcode.h" +#include "../../../module/motion.h" +#include "../../../feature/bedlevel/mbl/mesh_bed_leveling.h" + +/** + * M421: Set a single Mesh Bed Leveling Z coordinate + * + * Usage: + * M421 X Y Z + * M421 X Y Q + * M421 I J Z + * M421 I J Q + */ +void GcodeSuite::M421() { + const bool hasX = parser.seen('X'), hasI = parser.seen('I'); + const int8_t ix = hasI ? parser.value_int() : hasX ? mbl.probe_index_x(RAW_X_POSITION(parser.value_linear_units())) : -1; + const bool hasY = parser.seen('Y'), hasJ = parser.seen('J'); + const int8_t iy = hasJ ? parser.value_int() : hasY ? mbl.probe_index_y(RAW_Y_POSITION(parser.value_linear_units())) : -1; + const bool hasZ = parser.seen('Z'), hasQ = !hasZ && parser.seen('Q'); + + if (int(hasI && hasJ) + int(hasX && hasY) != 1 || !(hasZ || hasQ)) + SERIAL_ERROR_MSG(STR_ERR_M421_PARAMETERS); + else if (ix < 0 || iy < 0) + SERIAL_ERROR_MSG(STR_ERR_MESH_XY); + else + mbl.set_z(ix, iy, parser.value_linear_units() + (hasQ ? mbl.z_values[ix][iy] : 0)); +} + +#endif // MESH_BED_LEVELING diff --git a/Marlin/src/gcode/bedlevel/ubl/G29.cpp b/Marlin/src/gcode/bedlevel/ubl/G29.cpp new file mode 100644 index 00000000..2ef3ab4c --- /dev/null +++ b/Marlin/src/gcode/bedlevel/ubl/G29.cpp @@ -0,0 +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 . + * + */ + +/** + * G29.cpp - Unified Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" + +void GcodeSuite::G29() { ubl.G29(); } + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/gcode/bedlevel/ubl/M421.cpp b/Marlin/src/gcode/bedlevel/ubl/M421.cpp new file mode 100644 index 00000000..600c1fc8 --- /dev/null +++ b/Marlin/src/gcode/bedlevel/ubl/M421.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 . + * + */ + +/** + * unified.cpp - Unified Bed Leveling + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + +#include "../../gcode.h" +#include "../../../feature/bedlevel/bedlevel.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +/** + * M421: Set a single Mesh Bed Leveling Z coordinate + * + * Usage: + * M421 I J Z + * M421 I J Q + * M421 I J N + * M421 C Z + * M421 C Q + */ +void GcodeSuite::M421() { + xy_int8_t ij = { int8_t(parser.intval('I', -1)), int8_t(parser.intval('J', -1)) }; + const bool hasI = ij.x >= 0, + hasJ = ij.y >= 0, + hasC = parser.seen('C'), + hasN = parser.seen('N'), + hasZ = parser.seen('Z'), + hasQ = !hasZ && parser.seen('Q'); + + if (hasC) ij = ubl.find_closest_mesh_point_of_type(REAL, current_position); + + if (int(hasC) + int(hasI && hasJ) != 1 || !(hasZ || hasQ || hasN)) + SERIAL_ERROR_MSG(STR_ERR_M421_PARAMETERS); + else if (!WITHIN(ij.x, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(ij.y, 0, GRID_MAX_POINTS_Y - 1)) + SERIAL_ERROR_MSG(STR_ERR_MESH_XY); + else { + float &zval = ubl.z_values[ij.x][ij.y]; + zval = hasN ? NAN : parser.value_linear_units() + (hasQ ? zval : 0); + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ij.x, ij.y, zval)); + } +} + +#endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp new file mode 100644 index 00000000..34209568 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -0,0 +1,481 @@ +/** + * 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.h" + +#include "../../module/stepper.h" +#include "../../module/endstops.h" + +#if HAS_MULTI_HOTEND + #include "../../module/tool_change.h" +#endif + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(SENSORLESS_HOMING) + #include "../../feature/tmc_util.h" +#endif + +#include "../../module/probe.h" + +#if ENABLED(BLTOUCH) + #include "../../feature/bltouch.h" +#endif + +#include "../../lcd/ultralcd.h" +#if ENABLED(DWIN_CREALITY_LCD) + #include "../../lcd/dwin/e3v2/dwin.h" +#endif + +#if HAS_L64XX // set L6470 absolute position registers to counts + #include "../../libs/L64XX/L64XX_Marlin.h" +#endif + +#if ENABLED(LASER_MOVE_G28_OFF) + #include "../../feature/spindle_laser.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +#if ENABLED(QUICK_HOME) + + static void quick_home_xy() { + + // Pretend the current position is 0,0 + current_position.set(0.0, 0.0); + sync_plan_position(); + + const int x_axis_home_dir = x_home_dir(active_extruder); + + const float mlx = max_length(X_AXIS), + mly = max_length(Y_AXIS), + mlratio = mlx > mly ? mly / mlx : mlx / mly, + fr_mm_s = _MIN(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * SQRT(sq(mlratio) + 1.0); + + #if ENABLED(SENSORLESS_HOMING) + sensorless_t stealth_states { + tmc_enable_stallguard(stepperX) + , tmc_enable_stallguard(stepperY) + , false + , false + #if AXIS_HAS_STALLGUARD(X2) + || tmc_enable_stallguard(stepperX2) + #endif + , false + #if AXIS_HAS_STALLGUARD(Y2) + || tmc_enable_stallguard(stepperY2) + #endif + }; + #endif + + do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s); + + endstops.validate_homing_move(); + + current_position.set(0.0, 0.0); + + #if ENABLED(SENSORLESS_HOMING) + tmc_disable_stallguard(stepperX, stealth_states.x); + tmc_disable_stallguard(stepperY, stealth_states.y); + #if AXIS_HAS_STALLGUARD(X2) + tmc_disable_stallguard(stepperX2, stealth_states.x2); + #endif + #if AXIS_HAS_STALLGUARD(Y2) + tmc_disable_stallguard(stepperY2, stealth_states.y2); + #endif + #endif + } + +#endif // QUICK_HOME + +#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 (homing_needed_error(_BV(X_AXIS) | _BV(Y_AXIS))) return; + + sync_plan_position(); + + /** + * Move the Z probe (or just the nozzle) to the safe homing point + * (Z is already at the right height) + */ + destination.set(safe_homing_xy, current_position.z); + + TERN_(HOMING_Z_WITH_PROBE, destination -= probe.offset_xy); + + if (position_is_reachable(destination)) { + + if (DEBUGGING(LEVELING)) DEBUG_POS("home_z_safely", destination); + + // This causes the carriage on Dual X to unpark + TERN_(DUAL_X_CARRIAGE, active_extruder_parked = false); + + TERN_(SENSORLESS_HOMING, safe_delay(500)); // Short delay needed to settle + + do_blocking_move_to_xy(destination); + homeaxis(Z_AXIS); + } + else { + LCD_MESSAGEPGM(MSG_ZPROBE_OUT); + SERIAL_ECHO_MSG(STR_ZPROBE_OUT_SER); + } + } + +#endif // Z_SAFE_HOMING + +#if ENABLED(IMPROVE_HOMING_RELIABILITY) + + slow_homing_t begin_slow_homing() { + slow_homing_t slow_homing{0}; + slow_homing.acceleration.set(planner.settings.max_acceleration_mm_per_s2[X_AXIS], + planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + planner.settings.max_acceleration_mm_per_s2[X_AXIS] = 100; + planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = 100; + #if HAS_CLASSIC_JERK + slow_homing.jerk_xy = planner.max_jerk; + planner.max_jerk.set(0, 0); + #endif + planner.reset_acceleration_rates(); + return slow_homing; + } + + void end_slow_homing(const slow_homing_t &slow_homing) { + planner.settings.max_acceleration_mm_per_s2[X_AXIS] = slow_homing.acceleration.x; + planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = slow_homing.acceleration.y; + TERN_(HAS_CLASSIC_JERK, planner.max_jerk = slow_homing.jerk_xy); + planner.reset_acceleration_rates(); + } + +#endif // IMPROVE_HOMING_RELIABILITY + +/** + * G28: Home all axes according to settings + * + * Parameters + * + * None Home to all axes with no parameters. + * With QUICK_HOME enabled XY will home together, then Z. + * + * O Home only if position is unknown + * + * Rn Raise by n mm/inches before homing + * + * Cartesian/SCARA parameters + * + * X Home to the X endstop + * Y Home to the Y endstop + * Z Home to the Z endstop + */ +void GcodeSuite::G28() { + DEBUG_SECTION(log_G28, "G28", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) log_machine_info(); + + TERN_(LASER_MOVE_G28_OFF, cutter.set_inline_enabled(false)); // turn off laser + + TERN_(DWIN_CREALITY_LCD, HMI_flag.home_flag = true); + + #if ENABLED(DUAL_X_CARRIAGE) + bool IDEX_saved_duplication_state = extruder_duplication_enabled; + DualXMode IDEX_saved_mode = dual_x_carriage_mode; + #endif + + #if ENABLED(MARLIN_DEV_MODE) + if (parser.seen('S')) { + LOOP_XYZ(a) set_axis_is_at_home((AxisEnum)a); + sync_plan_position(); + SERIAL_ECHOLNPGM("Simulated Homing"); + report_current_position(); + return; + } + #endif + + // Home (O)nly if position is unknown + if (!homing_needed() && parser.boolval('O')) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip"); + return; + } + + planner.synchronize(); // Wait for planner moves to finish! + + SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state + + // Disable the leveling matrix before homing + #if HAS_LEVELING + + // Cancel the active G29 session + TERN_(PROBE_MANUALLY, g29_in_progress = false); + + TERN_(RESTORE_LEVELING_AFTER_G28, const bool leveling_was_active = planner.leveling_active); + set_bed_leveling_enabled(false); + #endif + + 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 + #endif + + #if HAS_HOMING_CURRENT + auto debug_current = [](PGM_P const s, const int16_t a, const int16_t b){ + serialprintPGM(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b); + }; + #if HAS_CURRENT_HOME(X) + const int16_t tmc_save_current_X = stepperX.getMilliamps(); + stepperX.rms_current(X_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(PSTR("X"), tmc_save_current_X, X_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(X2) + const int16_t tmc_save_current_X2 = stepperX2.getMilliamps(); + stepperX2.rms_current(X2_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(PSTR("X2"), tmc_save_current_X2, X2_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(Y) + const int16_t tmc_save_current_Y = stepperY.getMilliamps(); + stepperY.rms_current(Y_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(PSTR("Y"), tmc_save_current_Y, Y_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(Y2) + const int16_t tmc_save_current_Y2 = stepperY2.getMilliamps(); + stepperY2.rms_current(Y2_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(PSTR("Y2"), tmc_save_current_Y2, Y2_CURRENT_HOME); + #endif + #endif + + TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing_t slow_homing = begin_slow_homing()); + + // Always home with tool 0 active + #if HAS_MULTI_HOTEND + #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) + const uint8_t old_tool_index = active_extruder; + #endif + tool_change(0, true); + #endif + + TERN_(HAS_DUPLICATION_MODE, extruder_duplication_enabled = false); + + remember_feedrate_scaling_off(); + + endstops.enable(true); // Enable endstops for next homing move + + #if ENABLED(DELTA) + + constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a DELTA + + home_delta(); + + TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); + + #else // NOT DELTA + + const bool homeZ = parser.seen('Z'), + 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; + + #if Z_HOME_DIR > 0 // If homing away from BED do Z first + + if (doZ) homeaxis(Z_AXIS); + + #endif + + const float z_homing_height = + 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) && 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, true, DISABLED(UNKNOWN_Z_NO_RAISE)); + } + + #if ENABLED(QUICK_HOME) + + if (doX && doY) quick_home_xy(); + + #endif + + // Home Y (before X) + if (ENABLED(HOME_Y_BEFORE_X) && (doY || (ENABLED(CODEPENDENT_XY_HOMING) && doX))) + homeaxis(Y_AXIS); + + // Home X + if (doX || (doY && ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X))) { + + #if ENABLED(DUAL_X_CARRIAGE) + + // Always home the 2nd (right) extruder first + active_extruder = 1; + homeaxis(X_AXIS); + + // Remember this extruder's position for later tool change + inactive_extruder_x_pos = current_position.x; + + // Home the 1st (left) extruder + active_extruder = 0; + homeaxis(X_AXIS); + + // Consider the active extruder to be parked + raised_parked_position = current_position; + delayed_move_time = 0; + active_extruder_parked = true; + + #else + + homeaxis(X_AXIS); + + #endif + } + + // Home Y (after X) + if (DISABLED(HOME_Y_BEFORE_X) && doY) + homeaxis(Y_AXIS); + + TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); + + // Home Z last if homing towards the bed + #if Z_HOME_DIR < 0 + + if (doZ) { + TERN_(BLTOUCH, bltouch.init()); + + TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); + + probe.move_z_after_homing(); + + } // doZ + + #endif // Z_HOME_DIR < 0 + + sync_plan_position(); + + #endif // !DELTA (G28) + + /** + * Preserve DXC mode across a G28 for IDEX printers in DXC_DUPLICATION_MODE. + * This is important because it lets a user use the LCD Panel to set an IDEX Duplication mode, and + * then print a standard GCode file that contains a single print that does a G28 and has no other + * IDEX specific commands in it. + */ + #if ENABLED(DUAL_X_CARRIAGE) + + if (dxc_is_duplicating()) { + + TERN_(IMPROVE_HOMING_RELIABILITY, slow_homing = begin_slow_homing()); + + // Always home the 2nd (right) extruder first + active_extruder = 1; + homeaxis(X_AXIS); + + // Remember this extruder's position for later tool change + inactive_extruder_x_pos = current_position.x; + + // Home the 1st (left) extruder + active_extruder = 0; + homeaxis(X_AXIS); + + // Consider the active extruder to be parked + raised_parked_position = current_position; + delayed_move_time = 0; + active_extruder_parked = true; + extruder_duplication_enabled = IDEX_saved_duplication_state; + dual_x_carriage_mode = IDEX_saved_mode; + stepper.set_directions(); + + TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); + } + + #endif // DUAL_X_CARRIAGE + + endstops.not_homing(); + + // Clear endstop state for polled stallGuard endstops + TERN_(SPI_ENDSTOPS, endstops.clear_endstop_state()); + + #if BOTH(DELTA, DELTA_HOME_TO_SAFE_ZONE) + // move to a height where we can use the full xy-area + do_blocking_move_to_z(delta_clip_start_height); + #endif + + TERN_(RESTORE_LEVELING_AFTER_G28, set_bed_leveling_enabled(leveling_was_active)); + + restore_feedrate_and_scaling(); + + // Restore the active tool after homing + #if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) + tool_change(old_tool_index, NONE(PARKING_EXTRUDER, DUAL_X_CARRIAGE)); // Do move if one of these + #endif + + #if HAS_HOMING_CURRENT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current..."); + #if HAS_CURRENT_HOME(X) + stepperX.rms_current(tmc_save_current_X); + #endif + #if HAS_CURRENT_HOME(X2) + stepperX2.rms_current(tmc_save_current_X2); + #endif + #if HAS_CURRENT_HOME(Y) + stepperY.rms_current(tmc_save_current_Y); + #endif + #if HAS_CURRENT_HOME(Y2) + stepperY2.rms_current(tmc_save_current_Y2); + #endif + #endif + + ui.refresh(); + + TERN_(DWIN_CREALITY_LCD, DWIN_CompletedHoming()); + + report_current_position(); + + if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS))) + SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + + #if HAS_L64XX + // Set L6470 absolute position registers to counts + // constexpr *might* move this to PROGMEM. + // If not, this will need a PROGMEM directive and an accessor. + static constexpr AxisEnum L64XX_axis_xref[MAX_L64XX] = { + X_AXIS, Y_AXIS, Z_AXIS, + X_AXIS, Y_AXIS, Z_AXIS, Z_AXIS, + E_AXIS, E_AXIS, E_AXIS, E_AXIS, E_AXIS, E_AXIS + }; + for (uint8_t j = 1; j <= L64XX::chain[0]; j++) { + const uint8_t cv = L64XX::chain[j]; + L64xxManager.set_param((L64XX_axis_t)cv, L6470_ABS_POS, stepper.position(L64XX_axis_xref[cv])); + } + #endif +} diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp new file mode 100644 index 00000000..53af04d5 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -0,0 +1,648 @@ +/** + * 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(DELTA_AUTO_CALIBRATION) + +#include "../gcode.h" +#include "../../module/delta.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/endstops.h" +#include "../../lcd/ultralcd.h" + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#if HAS_MULTI_HOTEND + #include "../../module/tool_change.h" +#endif + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +constexpr uint8_t _7P_STEP = 1, // 7-point step - to change number of calibration points + _4P_STEP = _7P_STEP * 2, // 4-point step + NPP = _7P_STEP * 6; // number of calibration points on the radius +enum CalEnum : char { // the 7 main calibration points - add definitions if needed + CEN = 0, + __A = 1, + _AB = __A + _7P_STEP, + __B = _AB + _7P_STEP, + _BC = __B + _7P_STEP, + __C = _BC + _7P_STEP, + _CA = __C + _7P_STEP, +}; + +#define LOOP_CAL_PT(VAR, S, N) for (uint8_t VAR=S; VAR<=NPP; VAR+=N) +#define F_LOOP_CAL_PT(VAR, S, N) for (float VAR=S; VARCEN+0.9999; VAR-=N) +#define LOOP_CAL_ALL(VAR) LOOP_CAL_PT(VAR, CEN, 1) +#define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP) +#define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP) + +TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); + +float lcd_probe_pt(const xy_pos_t &xy); + +void ac_home() { + endstops.enable(true); + home_delta(); + endstops.not_homing(); +} + +void ac_setup(const bool reset_bed) { + TERN_(HAS_MULTI_HOTEND, tool_change(0, true)); + + planner.synchronize(); + remember_feedrate_scaling_off(); + + #if HAS_LEVELING + if (reset_bed) reset_bed_level(); // After full calibration bed-level data is no longer valid + #endif +} + +void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { + TERN_(DELTA_HOME_TO_SAFE_ZONE, do_blocking_move_to_z(delta_clip_start_height)); + TERN_(HAS_BED_PROBE, probe.stow()); + restore_feedrate_and_scaling(); + TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, true)); +} + +void print_signed_float(PGM_P const prefix, const float &f) { + SERIAL_ECHOPGM(" "); + serialprintPGM(prefix); + SERIAL_CHAR(':'); + if (f >= 0) SERIAL_CHAR('+'); + SERIAL_ECHO_F(f, 2); +} + +/** + * - Print the delta settings + */ +static void print_calibration_settings(const bool end_stops, const bool tower_angles) { + SERIAL_ECHOPAIR(".Height:", delta_height); + if (end_stops) { + print_signed_float(PSTR("Ex"), delta_endstop_adj.a); + print_signed_float(PSTR("Ey"), delta_endstop_adj.b); + print_signed_float(PSTR("Ez"), delta_endstop_adj.c); + } + if (end_stops && tower_angles) { + SERIAL_ECHOPAIR(" Radius:", delta_radius); + SERIAL_EOL(); + SERIAL_CHAR('.'); + SERIAL_ECHO_SP(13); + } + if (tower_angles) { + print_signed_float(PSTR("Tx"), delta_tower_angle_trim.a); + print_signed_float(PSTR("Ty"), delta_tower_angle_trim.b); + print_signed_float(PSTR("Tz"), delta_tower_angle_trim.c); + } + if ((!end_stops && tower_angles) || (end_stops && !tower_angles)) { // XOR + SERIAL_ECHOPAIR(" Radius:", delta_radius); + } + SERIAL_EOL(); +} + +/** + * - Print the probe results + */ +static void print_calibration_results(const float z_pt[NPP + 1], const bool tower_points, const bool opposite_points) { + SERIAL_ECHOPGM(". "); + print_signed_float(PSTR("c"), z_pt[CEN]); + if (tower_points) { + print_signed_float(PSTR(" x"), z_pt[__A]); + print_signed_float(PSTR(" y"), z_pt[__B]); + print_signed_float(PSTR(" z"), z_pt[__C]); + } + if (tower_points && opposite_points) { + SERIAL_EOL(); + SERIAL_CHAR('.'); + SERIAL_ECHO_SP(13); + } + if (opposite_points) { + print_signed_float(PSTR("yz"), z_pt[_BC]); + print_signed_float(PSTR("zx"), z_pt[_CA]); + print_signed_float(PSTR("xy"), z_pt[_AB]); + } + SERIAL_EOL(); +} + +/** + * - Calculate the standard deviation from the zero plane + */ +static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool _1p_cal, const bool _4p_cal, const bool _4p_opp) { + if (!_0p_cal) { + float S2 = sq(z_pt[CEN]); + int16_t N = 1; + if (!_1p_cal) { // std dev from zero plane + LOOP_CAL_ACT(rad, _4p_cal, _4p_opp) { + S2 += sq(z_pt[rad]); + N++; + } + return LROUND(SQRT(S2 / N) * 1000.0f) / 1000.0f + 0.00001f; + } + } + return 0.00001f; +} + +/** + * - Probe a point + */ +static float calibration_probe(const xy_pos_t &xy, const bool stow) { + #if HAS_BED_PROBE + return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true, false); + #else + UNUSED(stow); + return lcd_probe_pt(xy); + #endif +} + +/** + * - Probe a grid + */ +static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each) { + const bool _0p_calibration = probe_points == 0, + _1p_calibration = probe_points == 1 || probe_points == -1, + _4p_calibration = probe_points == 2, + _4p_opposite_points = _4p_calibration && !towers_set, + _7p_calibration = probe_points >= 3, + _7p_no_intermediates = probe_points == 3, + _7p_1_intermediates = probe_points == 4, + _7p_2_intermediates = probe_points == 5, + _7p_4_intermediates = probe_points == 6, + _7p_6_intermediates = probe_points == 7, + _7p_8_intermediates = probe_points == 8, + _7p_11_intermediates = probe_points == 9, + _7p_14_intermediates = probe_points == 10, + _7p_intermed_points = probe_points >= 4, + _7p_6_center = probe_points >= 5 && probe_points <= 7, + _7p_9_center = probe_points >= 8; + + LOOP_CAL_ALL(rad) z_pt[rad] = 0.0f; + + if (!_0p_calibration) { + + const float dcr = delta_calibration_radius(); + + if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center + const xy_pos_t center{0}; + z_pt[CEN] += calibration_probe(center, stow_after_each); + if (isnan(z_pt[CEN])) return false; + } + + if (_7p_calibration) { // probe extra center points + const float start = _7p_9_center ? float(_CA) + _7P_STEP / 3.0f : _7p_6_center ? float(_CA) : float(__C), + steps = _7p_9_center ? _4P_STEP / 3.0f : _7p_6_center ? _7P_STEP : _4P_STEP; + I_LOOP_CAL_PT(rad, start, steps) { + const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), + r = dcr * 0.1; + const xy_pos_t vec = { cos(a), sin(a) }; + z_pt[CEN] += calibration_probe(vec * r, stow_after_each); + if (isnan(z_pt[CEN])) return false; + } + z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points); + } + + if (!_1p_calibration) { // probe the radius + const CalEnum start = _4p_opposite_points ? _AB : __A; + const float steps = _7p_14_intermediates ? _7P_STEP / 15.0f : // 15r * 6 + 10c = 100 + _7p_11_intermediates ? _7P_STEP / 12.0f : // 12r * 6 + 9c = 81 + _7p_8_intermediates ? _7P_STEP / 9.0f : // 9r * 6 + 10c = 64 + _7p_6_intermediates ? _7P_STEP / 7.0f : // 7r * 6 + 7c = 49 + _7p_4_intermediates ? _7P_STEP / 5.0f : // 5r * 6 + 6c = 36 + _7p_2_intermediates ? _7P_STEP / 3.0f : // 3r * 6 + 7c = 25 + _7p_1_intermediates ? _7P_STEP / 2.0f : // 2r * 6 + 4c = 16 + _7p_no_intermediates ? _7P_STEP : // 1r * 6 + 3c = 9 + _4P_STEP; // .5r * 6 + 1c = 4 + bool zig_zag = true; + F_LOOP_CAL_PT(rad, start, _7p_9_center ? steps * 3 : steps) { + const int8_t offset = _7p_9_center ? 2 : 0; + for (int8_t circle = 0; circle <= offset; circle++) { + const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), + r = dcr * (1 - 0.1 * (zig_zag ? offset - circle : circle)), + interpol = FMOD(rad, 1); + const xy_pos_t vec = { cos(a), sin(a) }; + const float z_temp = calibration_probe(vec * r, stow_after_each); + if (isnan(z_temp)) return false; + // split probe point to neighbouring calibration points + z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90))); + z_pt[uint8_t(LROUND(rad - interpol)) % NPP + 1] += z_temp * sq(sin(RADIANS(interpol * 90))); + } + zig_zag = !zig_zag; + } + if (_7p_intermed_points) + LOOP_CAL_RAD(rad) + z_pt[rad] /= _7P_STEP / steps; + + do_blocking_move_to_xy(0.0f, 0.0f); + } + } + return true; +} + +/** + * kinematics routines and auto tune matrix scaling parameters: + * see https://github.com/LVD-AC/Marlin-AC/tree/1.1.x-AC/documentation for + * - formulae for approximative forward kinematics in the end-stop displacement matrix + * - definition of the matrix scaling parameters + */ +static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_at_pt_axis[NPP + 1]) { + xyz_pos_t pos{0}; + + const float dcr = delta_calibration_radius(); + LOOP_CAL_ALL(rad) { + const float a = RADIANS(210 + (360 / NPP) * (rad - 1)), + r = (rad == CEN ? 0.0f : dcr); + pos.set(cos(a) * r, sin(a) * r, z_pt[rad]); + inverse_kinematics(pos); + mm_at_pt_axis[rad] = delta; + } +} + +static void forward_kinematics_probe_points(abc_float_t mm_at_pt_axis[NPP + 1], float z_pt[NPP + 1]) { + const float r_quot = delta_calibration_radius() / delta_radius; + + #define ZPP(N,I,A) (((1.0f + r_quot * (N)) / 3.0f) * mm_at_pt_axis[I].A) + #define Z00(I, A) ZPP( 0, I, A) + #define Zp1(I, A) ZPP(+1, I, A) + #define Zm1(I, A) ZPP(-1, I, A) + #define Zp2(I, A) ZPP(+2, I, A) + #define Zm2(I, A) ZPP(-2, I, A) + + z_pt[CEN] = Z00(CEN, a) + Z00(CEN, b) + Z00(CEN, c); + z_pt[__A] = Zp2(__A, a) + Zm1(__A, b) + Zm1(__A, c); + z_pt[__B] = Zm1(__B, a) + Zp2(__B, b) + Zm1(__B, c); + z_pt[__C] = Zm1(__C, a) + Zm1(__C, b) + Zp2(__C, c); + z_pt[_BC] = Zm2(_BC, a) + Zp1(_BC, b) + Zp1(_BC, c); + z_pt[_CA] = Zp1(_CA, a) + Zm2(_CA, b) + Zp1(_CA, c); + z_pt[_AB] = Zp1(_AB, a) + Zp1(_AB, b) + Zm2(_AB, c); +} + +static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], abc_float_t delta_e, const float delta_r, abc_float_t delta_t) { + const float z_center = z_pt[CEN]; + abc_float_t diff_mm_at_pt_axis[NPP + 1], new_mm_at_pt_axis[NPP + 1]; + + reverse_kinematics_probe_points(z_pt, diff_mm_at_pt_axis); + + delta_radius += delta_r; + delta_tower_angle_trim += delta_t; + recalc_delta_settings(); + reverse_kinematics_probe_points(z_pt, new_mm_at_pt_axis); + + LOOP_CAL_ALL(rad) diff_mm_at_pt_axis[rad] -= new_mm_at_pt_axis[rad] + delta_e; + forward_kinematics_probe_points(diff_mm_at_pt_axis, z_pt); + + LOOP_CAL_RAD(rad) z_pt[rad] -= z_pt[CEN] - z_center; + z_pt[CEN] = z_center; + + delta_radius -= delta_r; + delta_tower_angle_trim -= delta_t; + recalc_delta_settings(); +} + +static float auto_tune_h() { + const float r_quot = delta_calibration_radius() / delta_radius; + return RECIPROCAL(r_quot / (2.0f / 3.0f)); // (2/3)/CR +} + +static float auto_tune_r() { + constexpr float diff = 0.01f, delta_r = diff; + float r_fac = 0.0f, z_pt[NPP + 1] = { 0.0f }; + abc_float_t delta_e = { 0.0f }, delta_t = { 0.0f }; + + calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); + r_fac = -(z_pt[__A] + z_pt[__B] + z_pt[__C] + z_pt[_BC] + z_pt[_CA] + z_pt[_AB]) / 6.0f; + r_fac = diff / r_fac / 3.0f; // 1/(3*delta_Z) + return r_fac; +} + +static float auto_tune_a() { + constexpr float diff = 0.01f, delta_r = 0.0f; + float a_fac = 0.0f, z_pt[NPP + 1] = { 0.0f }; + abc_float_t delta_e = { 0.0f }, delta_t = { 0.0f }; + + delta_t.reset(); + LOOP_XYZ(axis) { + delta_t[axis] = diff; + calc_kinematics_diff_probe_points(z_pt, delta_e, delta_r, delta_t); + delta_t[axis] = 0; + a_fac += z_pt[uint8_t((axis * _4P_STEP) - _7P_STEP + NPP) % NPP + 1] / 6.0f; + a_fac -= z_pt[uint8_t((axis * _4P_STEP) + 1 + _7P_STEP)] / 6.0f; + } + a_fac = diff / a_fac / 3.0f; // 1/(3*delta_Z) + return a_fac; +} + +/** + * G33 - Delta '1-4-7-point' Auto-Calibration + * Calibrate height, z_offset, endstops, delta radius, and tower angles. + * + * Parameters: + * + * Pn Number of probe points: + * P0 Normalizes calibration. + * P1 Calibrates height only with center probe. + * P2 Probe center and towers. Calibrate height, endstops and delta radius. + * P3 Probe all positions: center, towers and opposite towers. Calibrate all. + * P4-P10 Probe all positions at different intermediate locations and average them. + * + * T Don't calibrate tower angle corrections + * + * Cn.nn Calibration precision; when omitted calibrates to maximum precision + * + * Fn Force to run at least n iterations and take the best result + * + * Vn Verbose level: + * V0 Dry-run mode. Report settings and probe results. No calibration. + * V1 Report start and end settings only + * V2 Report settings at each iteration + * V3 Report settings and probe results + * + * E Engage the probe for each point + */ +void GcodeSuite::G33() { + + const int8_t probe_points = parser.intval('P', DELTA_CALIBRATION_DEFAULT_POINTS); + if (!WITHIN(probe_points, 0, 10)) { + SERIAL_ECHOLNPGM("?(P)oints implausible (0-10)."); + return; + } + + const bool towers_set = !parser.seen('T'); + + const float calibration_precision = parser.floatval('C', 0.0f); + if (calibration_precision < 0) { + SERIAL_ECHOLNPGM("?(C)alibration precision implausible (>=0)."); + return; + } + + const int8_t force_iterations = parser.intval('F', 0); + if (!WITHIN(force_iterations, 0, 30)) { + SERIAL_ECHOLNPGM("?(F)orce iteration implausible (0-30)."); + return; + } + + const int8_t verbose_level = parser.byteval('V', 1); + if (!WITHIN(verbose_level, 0, 3)) { + SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-3)."); + return; + } + + const bool stow_after_each = parser.seen('E'); + + const bool _0p_calibration = probe_points == 0, + _1p_calibration = probe_points == 1 || probe_points == -1, + _4p_calibration = probe_points == 2, + _4p_opposite_points = _4p_calibration && !towers_set, + _7p_9_center = probe_points >= 8, + _tower_results = (_4p_calibration && towers_set) || probe_points >= 3, + _opposite_results = (_4p_calibration && !towers_set) || probe_points >= 3, + _endstop_results = probe_points != 1 && probe_points != -1 && probe_points != 0, + _angle_results = probe_points >= 3 && towers_set; + int8_t iterations = 0; + float test_precision, + zero_std_dev = (verbose_level ? 999.0f : 0.0f), // 0.0 in dry-run mode : forced end + zero_std_dev_min = zero_std_dev, + zero_std_dev_old = zero_std_dev, + h_factor, r_factor, a_factor, + r_old = delta_radius, + h_old = delta_height; + + abc_pos_t e_old = delta_endstop_adj, a_old = delta_tower_angle_trim; + + SERIAL_ECHOLNPGM("G33 Auto Calibrate"); + + const float dcr = delta_calibration_radius(); + + if (!_1p_calibration && !_0p_calibration) { // test if the outer radius is reachable + LOOP_CAL_RAD(axis) { + const float a = RADIANS(210 + (360 / NPP) * (axis - 1)); + if (!position_is_reachable(cos(a) * dcr, sin(a) * dcr)) { + SERIAL_ECHOLNPGM("?Bed calibration radius implausible."); + return; + } + } + } + + // Report settings + PGM_P const checkingac = PSTR("Checking... AC"); + serialprintPGM(checkingac); + if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)"); + SERIAL_EOL(); + ui.set_status_P(checkingac); + + print_calibration_settings(_endstop_results, _angle_results); + + ac_setup(!_0p_calibration && !_1p_calibration); + + if (!_0p_calibration) ac_home(); + + do { // start iterations + + float z_at_pt[NPP + 1] = { 0.0f }; + + test_precision = zero_std_dev_old != 999.0f ? (zero_std_dev + zero_std_dev_old) / 2.0f : zero_std_dev; + iterations++; + + // Probe the points + zero_std_dev_old = zero_std_dev; + if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each)) { + SERIAL_ECHOLNPGM("Correct delta settings with M665 and M666"); + return ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index)); + } + zero_std_dev = std_dev_points(z_at_pt, _0p_calibration, _1p_calibration, _4p_calibration, _4p_opposite_points); + + // Solve matrices + + if ((zero_std_dev < test_precision || iterations <= force_iterations) && zero_std_dev > calibration_precision) { + + #if !HAS_BED_PROBE + test_precision = 0.0f; // forced end + #endif + + if (zero_std_dev < zero_std_dev_min) { + // set roll-back point + e_old = delta_endstop_adj; + r_old = delta_radius; + h_old = delta_height; + a_old = delta_tower_angle_trim; + } + + abc_float_t e_delta = { 0.0f }, t_delta = { 0.0f }; + float r_delta = 0.0f; + + /** + * convergence matrices: + * see https://github.com/LVD-AC/Marlin-AC/tree/1.1.x-AC/documentation for + * - definition of the matrix scaling parameters + * - matrices for 4 and 7 point calibration + */ + #define ZP(N,I) ((N) * z_at_pt[I] / 4.0f) // 4.0 = divider to normalize to integers + #define Z12(I) ZP(12, I) + #define Z4(I) ZP(4, I) + #define Z2(I) ZP(2, I) + #define Z1(I) ZP(1, I) + #define Z0(I) ZP(0, I) + + // calculate factors + if (_7p_9_center) calibration_radius_factor = 0.9f; + h_factor = auto_tune_h(); + r_factor = auto_tune_r(); + a_factor = auto_tune_a(); + calibration_radius_factor = 1.0f; + + switch (probe_points) { + case 0: + test_precision = 0.0f; // forced end + break; + + case 1: + test_precision = 0.0f; // forced end + LOOP_XYZ(axis) e_delta[axis] = +Z4(CEN); + break; + + case 2: + if (towers_set) { // see 4 point calibration (towers) matrix + e_delta.set((+Z4(__A) -Z2(__B) -Z2(__C)) * h_factor +Z4(CEN), + (-Z2(__A) +Z4(__B) -Z2(__C)) * h_factor +Z4(CEN), + (-Z2(__A) -Z2(__B) +Z4(__C)) * h_factor +Z4(CEN)); + r_delta = (+Z4(__A) +Z4(__B) +Z4(__C) -Z12(CEN)) * r_factor; + } + else { // see 4 point calibration (opposites) matrix + e_delta.set((-Z4(_BC) +Z2(_CA) +Z2(_AB)) * h_factor +Z4(CEN), + (+Z2(_BC) -Z4(_CA) +Z2(_AB)) * h_factor +Z4(CEN), + (+Z2(_BC) +Z2(_CA) -Z4(_AB)) * h_factor +Z4(CEN)); + r_delta = (+Z4(_BC) +Z4(_CA) +Z4(_AB) -Z12(CEN)) * r_factor; + } + break; + + default: // see 7 point calibration (towers & opposites) matrix + e_delta.set((+Z2(__A) -Z1(__B) -Z1(__C) -Z2(_BC) +Z1(_CA) +Z1(_AB)) * h_factor +Z4(CEN), + (-Z1(__A) +Z2(__B) -Z1(__C) +Z1(_BC) -Z2(_CA) +Z1(_AB)) * h_factor +Z4(CEN), + (-Z1(__A) -Z1(__B) +Z2(__C) +Z1(_BC) +Z1(_CA) -Z2(_AB)) * h_factor +Z4(CEN)); + r_delta = (+Z2(__A) +Z2(__B) +Z2(__C) +Z2(_BC) +Z2(_CA) +Z2(_AB) -Z12(CEN)) * r_factor; + + if (towers_set) { // see 7 point tower angle calibration (towers & opposites) matrix + t_delta.set((+Z0(__A) -Z4(__B) +Z4(__C) +Z0(_BC) -Z4(_CA) +Z4(_AB) +Z0(CEN)) * a_factor, + (+Z4(__A) +Z0(__B) -Z4(__C) +Z4(_BC) +Z0(_CA) -Z4(_AB) +Z0(CEN)) * a_factor, + (-Z4(__A) +Z4(__B) +Z0(__C) -Z4(_BC) +Z4(_CA) +Z0(_AB) +Z0(CEN)) * a_factor); + } + break; + } + delta_endstop_adj += e_delta; + delta_radius += r_delta; + delta_tower_angle_trim += t_delta; + } + else if (zero_std_dev >= test_precision) { + // roll back + delta_endstop_adj = e_old; + delta_radius = r_old; + delta_height = h_old; + delta_tower_angle_trim = a_old; + } + + if (verbose_level != 0) { // !dry run + + // Normalize angles to least-squares + if (_angle_results) { + float a_sum = 0.0f; + LOOP_XYZ(axis) a_sum += delta_tower_angle_trim[axis]; + LOOP_XYZ(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0f; + } + + // adjust delta_height and endstops by the max amount + const float z_temp = _MAX(delta_endstop_adj.a, delta_endstop_adj.b, delta_endstop_adj.c); + delta_height -= z_temp; + LOOP_XYZ(axis) delta_endstop_adj[axis] -= z_temp; + } + recalc_delta_settings(); + NOMORE(zero_std_dev_min, zero_std_dev); + + // print report + + if (verbose_level == 3) + print_calibration_results(z_at_pt, _tower_results, _opposite_results); + + if (verbose_level != 0) { // !dry run + if ((zero_std_dev >= test_precision && iterations > force_iterations) || zero_std_dev <= calibration_precision) { // end iterations + SERIAL_ECHOPGM("Calibration OK"); + SERIAL_ECHO_SP(32); + #if HAS_BED_PROBE + if (zero_std_dev >= test_precision && !_1p_calibration && !_0p_calibration) + SERIAL_ECHOPGM("rolling back."); + else + #endif + { + SERIAL_ECHOPAIR_F("std dev:", zero_std_dev_min, 3); + } + SERIAL_EOL(); + char mess[21]; + strcpy_P(mess, PSTR("Calibration sd:")); + if (zero_std_dev_min < 1) + sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev_min * 1000.0f)); + else + sprintf_P(&mess[15], PSTR("%03i.x"), (int)LROUND(zero_std_dev_min)); + ui.set_status(mess); + print_calibration_settings(_endstop_results, _angle_results); + SERIAL_ECHOLNPGM("Save with M500 and/or copy to Configuration.h"); + } + else { // !end iterations + char mess[15]; + if (iterations < 31) + sprintf_P(mess, PSTR("Iteration : %02i"), (unsigned int)iterations); + else + strcpy_P(mess, PSTR("No convergence")); + SERIAL_ECHO(mess); + SERIAL_ECHO_SP(32); + SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); + ui.set_status(mess); + if (verbose_level > 1) + print_calibration_settings(_endstop_results, _angle_results); + } + } + else { // dry run + PGM_P const enddryrun = PSTR("End DRY-RUN"); + serialprintPGM(enddryrun); + SERIAL_ECHO_SP(35); + SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); + + char mess[21]; + strcpy_P(mess, enddryrun); + strcpy_P(&mess[11], PSTR(" sd:")); + if (zero_std_dev < 1) + sprintf_P(&mess[15], PSTR("0.%03i"), (int)LROUND(zero_std_dev * 1000.0f)); + else + sprintf_P(&mess[15], PSTR("%03i.x"), (int)LROUND(zero_std_dev)); + ui.set_status(mess); + } + ac_home(); + } + while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision); + + ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index)); +} + +#endif // DELTA_AUTO_CALIBRATION diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp new file mode 100644 index 00000000..0ca4490e --- /dev/null +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -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 . + * + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/endstops.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +void GcodeSuite::G34() { + + // Home before the alignment procedure + if (!all_axes_known()) home_all_axes(); + + SET_SOFT_ENDSTOP_LOOSE(true); + TEMPORARY_BED_LEVELING_STATE(false); + TemporaryGlobalEndstopsState unlock_z(false); + + #ifdef GANTRY_CALIBRATION_COMMANDS_PRE + gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_PRE)); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Sub Commands Processed"); + #endif + + #ifdef GANTRY_CALIBRATION_SAFE_POSITION + // Move XY to safe position + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Parking XY"); + const xy_pos_t safe_pos = GANTRY_CALIBRATION_SAFE_POSITION; + do_blocking_move_to(safe_pos, MMM_TO_MMS(GANTRY_CALIBRATION_XY_PARK_FEEDRATE)); + #endif + + const float move_distance = parser.intval('Z', GANTRY_CALIBRATION_EXTRA_HEIGHT), + zbase = ENABLED(GANTRY_CALIBRATION_TO_MIN) ? Z_MIN_POS : Z_MAX_POS, + zpounce = zbase - move_distance, zgrind = zbase + move_distance; + + // Move Z to pounce position + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting Z Pounce"); + do_blocking_move_to_z(zpounce, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + + // Store current motor settings, then apply reduced value + + #define _REDUCE_CURRENT ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_I2C, HAS_TRINAMIC_CONFIG) + #if _REDUCE_CURRENT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Reducing Current"); + #endif + + #if HAS_MOTOR_CURRENT_SPI + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + stepper.set_digipot_current(Z_AXIS, target_current); + #elif HAS_MOTOR_CURRENT_PWM + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + stepper.set_digipot_current(1, target_current); + #elif HAS_MOTOR_CURRENT_DAC + const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); + const float previous_current = dac_amps(Z_AXIS, target_current); + stepper_dac.set_current_value(Z_AXIS, target_current); + #elif ENABLED(HAS_MOTOR_CURRENT_I2C) + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + previous_current = dac_amps(Z_AXIS); + digipot_i2c.set_current(Z_AXIS, target_current) + #elif HAS_TRINAMIC_CONFIG + const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); + static uint16_t previous_current_arr[NUM_Z_STEPPER_DRIVERS]; + #if AXIS_IS_TMC(Z) + previous_current_arr[0] = stepperZ.getMilliamps(); + stepperZ.rms_current(target_current); + #endif + #if AXIS_IS_TMC(Z2) + previous_current_arr[1] = stepperZ2.getMilliamps(); + stepperZ2.rms_current(target_current); + #endif + #if AXIS_IS_TMC(Z3) + previous_current_arr[2] = stepperZ3.getMilliamps(); + stepperZ3.rms_current(target_current); + #endif + #if AXIS_IS_TMC(Z4) + previous_current_arr[3] = stepperZ4.getMilliamps(); + stepperZ4.rms_current(target_current); + #endif + #endif + + // Do Final Z move to adjust + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Final Z Move"); + do_blocking_move_to_z(zgrind, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE)); + + // Back off end plate, back to normal motion range + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Z Backoff"); + do_blocking_move_to_z(zpounce, MMM_TO_MMS(GANTRY_CALIBRATION_FEEDRATE)); + + #if _REDUCE_CURRENT + // Reset current to original values + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore Current"); + #endif + + #if HAS_MOTOR_CURRENT_SPI + stepper.set_digipot_current(Z_AXIS, previous_current); + #elif HAS_MOTOR_CURRENT_PWM + stepper.set_digipot_current(1, previous_current); + #elif HAS_MOTOR_CURRENT_DAC + stepper_dac.set_current_value(Z_AXIS, previous_current); + #elif ENABLED(HAS_MOTOR_CURRENT_I2C) + digipot_i2c.set_current(Z_AXIS, previous_current) + #elif HAS_TRINAMIC_CONFIG + #if AXIS_IS_TMC(Z) + stepperZ.rms_current(previous_current_arr[0]); + #endif + #if AXIS_IS_TMC(Z2) + stepperZ2.rms_current(previous_current_arr[1]); + #endif + #if AXIS_IS_TMC(Z3) + stepperZ3.rms_current(previous_current_arr[2]); + #endif + #if AXIS_IS_TMC(Z4) + stepperZ4.rms_current(previous_current_arr[3]); + #endif + #endif + + #ifdef GANTRY_CALIBRATION_COMMANDS_POST + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Running Post Commands"); + gcode.process_subcommands_now_P(PSTR(GANTRY_CALIBRATION_COMMANDS_POST)); + #endif + + SET_SOFT_ENDSTOP_LOOSE(false); +} + +#endif // MECHANICAL_GANTRY_CALIBRATION diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp new file mode 100644 index 00000000..24292477 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -0,0 +1,514 @@ +/** + * 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(Z_STEPPER_AUTO_ALIGN) + +#include "../../feature/z_stepper_align.h" + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/planner.h" +#include "../../module/probe.h" +#include "../../lcd/ultralcd.h" // for LCD_MESSAGEPGM + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_MULTI_HOTEND + #include "../../module/tool_change.h" +#endif + +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #include "../../libs/least_squares_fit.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +/** + * G34: Z-Stepper automatic alignment + * + * I + * T + * A + * R points based on current probe offsets + */ +void GcodeSuite::G34() { + DEBUG_SECTION(log_G34, "G34", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) log_machine_info(); + + do { // break out on error + + #if NUM_Z_STEPPER_DRIVERS == 4 + SERIAL_ECHOLNPGM("Alignment for 4 steppers is Experimental!"); + #elif NUM_Z_STEPPER_DRIVERS > 4 + SERIAL_ECHOLNPGM("Alignment not supported for over 4 steppers"); + break; + #endif + + const int8_t z_auto_align_iterations = parser.intval('I', Z_STEPPER_ALIGN_ITERATIONS); + if (!WITHIN(z_auto_align_iterations, 1, 30)) { + SERIAL_ECHOLNPGM("?(I)teration out of bounds (1-30)."); + break; + } + + const float z_auto_align_accuracy = parser.floatval('T', Z_STEPPER_ALIGN_ACC); + if (!WITHIN(z_auto_align_accuracy, 0.01f, 1.0f)) { + SERIAL_ECHOLNPGM("?(T)arget accuracy out of bounds (0.01-1.0)."); + break; + } + + const float z_auto_align_amplification = + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + Z_STEPPER_ALIGN_AMP; + #else + parser.floatval('A', Z_STEPPER_ALIGN_AMP); + if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { + SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); + break; + } + #endif + + if (parser.seen('R')) z_stepper_align.reset_to_default(); + + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; + + // Wait for planner moves to finish! + planner.synchronize(); + + // Disable the leveling matrix before auto-aligning + #if HAS_LEVELING + TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); + set_bed_leveling_enabled(false); + #endif + + TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); + + // Always home with tool 0 active + #if HAS_MULTI_HOTEND + const uint8_t old_tool_index = active_extruder; + tool_change(0, true); + #endif + + TERN_(HAS_DUPLICATION_MODE, extruder_duplication_enabled = false); + + // In BLTOUCH HS mode, the probe travels in a deployed state. + // Users of G34 might have a badly misaligned bed, so raise Z by the + // length of the deployed pin (BLTOUCH stroke < 7mm) + #define Z_BASIC_CLEARANCE (Z_CLEARANCE_BETWEEN_PROBES + 7.0f * BOTH(BLTOUCH, BLTOUCH_HS_MODE)) + + // Compute a worst-case clearance height to probe from. After the first + // iteration this will be re-calculated based on the actual bed position + auto magnitude2 = [&](const uint8_t i, const uint8_t j) { + const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j]; + return HYPOT2(diff.x, diff.y); + }; + float z_probe = Z_BASIC_CLEARANCE + (G34_MAX_GRADE) * 0.01f * SQRT( + #if NUM_Z_STEPPER_DRIVERS == 3 + _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 0)) + #elif NUM_Z_STEPPER_DRIVERS == 4 + _MAX(magnitude2(0, 1), magnitude2(1, 2), magnitude2(2, 3), + magnitude2(3, 0), magnitude2(0, 2), magnitude2(1, 3)) + #else + magnitude2(0, 1) + #endif + ); + + // Home before the alignment procedure + if (!all_axes_known()) home_all_axes(); + + // Move the Z coordinate realm towards the positive - dirty trick + current_position.z += z_probe * 0.5f; + sync_plan_position(); + // Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error. + // This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration. + + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + float last_z_align_move[NUM_Z_STEPPER_DRIVERS] = ARRAY_N(NUM_Z_STEPPER_DRIVERS, 10000.0f, 10000.0f, 10000.0f, 10000.0f); + #else + float last_z_align_level_indicator = 10000.0f; + #endif + float z_measured[NUM_Z_STEPPER_DRIVERS] = { 0 }, + z_maxdiff = 0.0f, + amplification = z_auto_align_amplification; + + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + bool adjustment_reverse = false; + #endif + + #if HAS_DISPLAY + PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); + const uint8_t iter_str_len = strlen_P(msg_iteration); + #endif + + // Final z and iteration values will be used after breaking the loop + float z_measured_min; + uint8_t iteration = 0; + bool err_break = false; // To break out of nested loops + while (iteration < z_auto_align_iterations) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> probing all positions."); + + const int iter = iteration + 1; + SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); + #if HAS_DISPLAY + char str[iter_str_len + 2 + 1]; + sprintf_P(str, msg_iteration, iter); + ui.set_status(str); + #endif + + // Initialize minimum value + z_measured_min = 100000.0f; + float z_measured_max = -100000.0f; + + // Probe all positions (one per Z-Stepper) + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { + // iteration odd/even --> downward / upward stepper sequence + const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPER_DRIVERS - 1 - i : i; + + // Safe clearance even on an incline + if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe); + + if (DEBUGGING(LEVELING)) + DEBUG_ECHOLNPAIR_P(PSTR("Probing X"), z_stepper_align.xy[iprobe].x, SP_Y_STR, z_stepper_align.xy[iprobe].y); + + // Probe a Z height for each stepper. + // Probing sanity check is disabled, as it would trigger even in normal cases because + // current_position.z has been manually altered in the "dirty trick" above. + const float z_probed_height = probe.probe_at_point(z_stepper_align.xy[iprobe], raise_after, 0, true, false); + if (isnan(z_probed_height)) { + SERIAL_ECHOLNPGM("Probing failed"); + LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); + err_break = true; + break; + } + + // Add height to each value, to provide a more useful target height for + // the next iteration of probing. This allows adjustments to be made away from the bed. + z_measured[iprobe] = z_probed_height + Z_CLEARANCE_BETWEEN_PROBES; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(iprobe + 1), " measured position is ", z_measured[iprobe]); + + // Remember the minimum measurement to calculate the correction later on + z_measured_min = _MIN(z_measured_min, z_measured[iprobe]); + z_measured_max = _MAX(z_measured_max, z_measured[iprobe]); + } // for (i) + + if (err_break) break; + + // Adapt the next probe clearance height based on the new measurements. + // Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment. + z_maxdiff = z_measured_max - z_measured_min; + z_probe = Z_BASIC_CLEARANCE + z_measured_max + z_maxdiff; + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Replace the initial values in z_measured with calculated heights at + // each stepper position. This allows the adjustment algorithm to be + // shared between both possible probing mechanisms. + + // This must be done after the next z_probe height is calculated, so that + // the height is calculated from actual print area positions, and not + // extrapolated motor movements. + + // Compute the least-squares fit for all probed points. + // Calculate the Z position of each stepper and store it in z_measured. + // This allows the actual adjustment logic to be shared by both algorithms. + linear_fit_data lfd; + incremental_LSF_reset(&lfd); + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { + SERIAL_ECHOLNPAIR("PROBEPT_", int(i), ": ", z_measured[i]); + incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]); + } + finish_incremental_LSF(&lfd); + + z_measured_min = 100000.0f; + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) { + z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D); + z_measured_min = _MIN(z_measured_min, z_measured[i]); + } + + SERIAL_ECHOLNPAIR("CALCULATED STEPPER POSITIONS: Z1=", z_measured[0], " Z2=", z_measured[1], " Z3=", z_measured[2]); + #endif + + SERIAL_ECHOLNPAIR("\n" + "DIFFERENCE Z1-Z2=", ABS(z_measured[0] - z_measured[1]) + #if NUM_Z_STEPPER_DRIVERS == 3 + , " Z2-Z3=", ABS(z_measured[1] - z_measured[2]) + , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) + #endif + ); + #if HAS_DISPLAY + char fstr1[10]; + #if NUM_Z_STEPPER_DRIVERS == 2 + char msg[6 + (6 + 5) * 1 + 1]; + #else + char msg[6 + (6 + 5) * 3 + 1], fstr2[10], fstr3[10]; + #endif + sprintf_P(msg, + PSTR("Diffs Z1-Z2=%s" + #if NUM_Z_STEPPER_DRIVERS == 3 + " Z2-Z3=%s" + " Z3-Z1=%s" + #endif + ), dtostrf(ABS(z_measured[0] - z_measured[1]), 1, 3, fstr1) + #if NUM_Z_STEPPER_DRIVERS == 3 + , dtostrf(ABS(z_measured[1] - z_measured[2]), 1, 3, fstr2) + , dtostrf(ABS(z_measured[2] - z_measured[0]), 1, 3, fstr3) + #endif + ); + ui.set_status(msg); + #endif + + auto decreasing_accuracy = [](const float &v1, const float &v2){ + if (v1 < v2 * 0.7f) { + SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); + LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); + return true; + } + return false; + }; + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + + // Check if the applied corrections go in the correct direction. + // Calculate the sum of the absolute deviations from the mean of the probe measurements. + // Compare to the last iteration to ensure it's getting better. + + // Calculate mean value as a reference + float z_measured_mean = 0.0f; + LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) z_measured_mean += z_measured[zstepper]; + z_measured_mean /= NUM_Z_STEPPER_DRIVERS; + + // Calculate the sum of the absolute deviations from the mean value + float z_align_level_indicator = 0.0f; + LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) + z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean); + + // If it's getting worse, stop and throw an error + err_break = decreasing_accuracy(last_z_align_level_indicator, z_align_level_indicator); + if (err_break) break; + + last_z_align_level_indicator = z_align_level_indicator; + #endif + + // The following correction actions are to be enabled for select Z-steppers only + stepper.set_separate_multi_axis(true); + + bool success_break = true; + // Correct the individual stepper offsets + LOOP_L_N(zstepper, NUM_Z_STEPPER_DRIVERS) { + // Calculate current stepper move + float z_align_move = z_measured[zstepper] - z_measured_min; + const float z_align_abs = ABS(z_align_move); + + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Optimize one iteration's correction based on the first measurements + if (z_align_abs) amplification = (iteration == 1) ? _MIN(last_z_align_move[zstepper] / z_align_abs, 2.0f) : z_auto_align_amplification; + + // Check for less accuracy compared to last move + if (decreasing_accuracy(last_z_align_move[zstepper], z_align_abs)) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " last_z_align_move = ", last_z_align_move[zstepper]); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " z_align_abs = ", z_align_abs); + adjustment_reverse = !adjustment_reverse; + } + + // Remember the alignment for the next iteration, but only if steppers move, + // otherwise it would be just zero (in case this stepper was at z_measured_min already) + if (z_align_abs > 0) last_z_align_move[zstepper] = z_align_abs; + #endif + + // Stop early if all measured points achieve accuracy target + if (z_align_abs > z_auto_align_accuracy) success_break = false; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " corrected by ", z_align_move); + + // Lock all steppers except one + stepper.set_all_z_lock(true, zstepper); + + #if DISABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Decreasing accuracy was detected so move was inverted. + // Will match reversed Z steppers on dual steppers. Triple will need more work to map. + if (adjustment_reverse) { + z_align_move = -z_align_move; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("> Z", int(zstepper + 1), " correction reversed to ", z_align_move); + } + #endif + + // Do a move to correct part of the misalignment for the current stepper + do_blocking_move_to_z(amplification * z_align_move + current_position.z); + } // for (zstepper) + + // Back to normal stepper operations + stepper.set_all_z_lock(false); + stepper.set_separate_multi_axis(false); + + if (err_break) break; + + if (success_break) { + SERIAL_ECHOLNPGM("Target accuracy achieved."); + LCD_MESSAGEPGM(MSG_ACCURACY_ACHIEVED); + break; + } + + iteration++; + } // while (iteration < z_auto_align_iterations) + + if (err_break) + SERIAL_ECHOLNPGM("G34 aborted."); + else { + SERIAL_ECHOLNPAIR("Did ", int(iteration + (iteration != z_auto_align_iterations)), " of ", int(z_auto_align_iterations)); + SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); + } + + // Stow the probe, as the last call to probe.probe_at_point(...) left + // the probe deployed if it was successful. + probe.stow(); + + #if ENABLED(HOME_AFTER_G34) + // After this operation the z position needs correction + set_axis_never_homed(Z_AXIS); + // Home Z after the alignment procedure + process_subcommands_now_P(PSTR("G28Z")); + #else + // Use the probed height from the last iteration to determine the Z height. + // z_measured_min is used, because all steppers are aligned to z_measured_min. + // Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier. + current_position.z -= z_measured_min - (float)Z_CLEARANCE_BETWEEN_PROBES; + sync_plan_position(); + #endif + + // Restore the active tool after homing + TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, DISABLED(PARKING_EXTRUDER))); // Fetch previous tool for parking extruder + + #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) + set_bed_leveling_enabled(leveling_was_active); + #endif + + }while(0); +} + +/** + * M422: Set a Z-Stepper automatic alignment XY point. + * Use repeatedly to set multiple points. + * + * S : Index of the probe point to set + * + * With Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS: + * W : Index of the Z stepper position to set + * The W and S parameters may not be combined. + * + * S and W require an X and/or Y parameter + * X : X position to set (Unchanged if omitted) + * Y : Y position to set (Unchanged if omitted) + * + * R : Recalculate points based on current probe offsets + */ +void GcodeSuite::M422() { + + if (parser.seen('R')) { + z_stepper_align.reset_to_default(); + return; + } + + if (!parser.seen_any()) { + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) + SERIAL_ECHOLNPAIR_P(PSTR("M422 S"), int(i + 1), SP_X_STR, z_stepper_align.xy[i].x, SP_Y_STR, z_stepper_align.xy[i].y); + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + LOOP_L_N(i, NUM_Z_STEPPER_DRIVERS) + SERIAL_ECHOLNPAIR_P(PSTR("M422 W"), int(i + 1), SP_X_STR, z_stepper_align.stepper_xy[i].x, SP_Y_STR, z_stepper_align.stepper_xy[i].y); + #endif + return; + } + + const bool is_probe_point = parser.seen('S'); + + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + if (is_probe_point && parser.seen('W')) { + SERIAL_ECHOLNPGM("?(S) and (W) may not be combined."); + return; + } + #endif + + xy_pos_t *pos_dest = ( + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + !is_probe_point ? z_stepper_align.stepper_xy : + #endif + z_stepper_align.xy + ); + + if (!is_probe_point + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + && !parser.seen('W') + #endif + ) { + SERIAL_ECHOLNPGM( + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + "?(S) or (W) is required." + #else + "?(S) is required." + #endif + ); + return; + } + + // Get the Probe Position Index or Z Stepper Index + int8_t position_index; + if (is_probe_point) { + position_index = parser.intval('S') - 1; + if (!WITHIN(position_index, 0, int8_t(NUM_Z_STEPPER_DRIVERS) - 1)) { + SERIAL_ECHOLNPGM("?(S) Z-ProbePosition index invalid."); + return; + } + } + else { + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + position_index = parser.intval('W') - 1; + if (!WITHIN(position_index, 0, NUM_Z_STEPPER_DRIVERS - 1)) { + SERIAL_ECHOLNPGM("?(W) Z-Stepper index invalid."); + return; + } + #endif + } + + const xy_pos_t pos = { + parser.floatval('X', pos_dest[position_index].x), + parser.floatval('Y', pos_dest[position_index].y) + }; + + if (is_probe_point) { + if (!probe.can_reach(pos.x, Y_CENTER)) { + SERIAL_ECHOLNPGM("?(X) out of bounds."); + return; + } + if (!probe.can_reach(pos)) { + SERIAL_ECHOLNPGM("?(Y) out of bounds."); + return; + } + } + + pos_dest[position_index] = pos; +} + +#endif // Z_STEPPER_AUTO_ALIGN diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp new file mode 100644 index 00000000..8968f789 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -0,0 +1,621 @@ +/** + * 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 "../../MarlinCore.h" + +#if ENABLED(CALIBRATION_GCODE) + +#include "../gcode.h" + +#if ENABLED(BACKLASH_GCODE) + #include "../../feature/backlash.h" +#endif + +#include "../../lcd/ultralcd.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/tool_change.h" +#include "../../module/endstops.h" +#include "../../feature/bedlevel/bedlevel.h" + +#if !AXIS_CAN_CALIBRATE(X) + #undef CALIBRATION_MEASURE_LEFT + #undef CALIBRATION_MEASURE_RIGHT +#endif + +#if !AXIS_CAN_CALIBRATE(Y) + #undef CALIBRATION_MEASURE_FRONT + #undef CALIBRATION_MEASURE_BACK +#endif + +#if !AXIS_CAN_CALIBRATE(Z) + #undef CALIBRATION_MEASURE_AT_TOP_EDGES +#endif + +/** + * G425 backs away from the calibration object by various distances + * depending on the confidence level: + * + * UNKNOWN - No real notion on where the calibration object is on the bed + * UNCERTAIN - Measurement may be uncertain due to backlash + * CERTAIN - Measurement obtained with backlash compensation + */ + +#ifndef CALIBRATION_MEASUREMENT_UNKNOWN + #define CALIBRATION_MEASUREMENT_UNKNOWN 5.0 // mm +#endif +#ifndef CALIBRATION_MEASUREMENT_UNCERTAIN + #define CALIBRATION_MEASUREMENT_UNCERTAIN 1.0 // mm +#endif +#ifndef CALIBRATION_MEASUREMENT_CERTAIN + #define CALIBRATION_MEASUREMENT_CERTAIN 0.5 // mm +#endif + +#if BOTH(CALIBRATION_MEASURE_LEFT, CALIBRATION_MEASURE_RIGHT) + #define HAS_X_CENTER 1 +#endif +#if BOTH(CALIBRATION_MEASURE_FRONT, CALIBRATION_MEASURE_BACK) + #define HAS_Y_CENTER 1 +#endif + +enum side_t : uint8_t { TOP, RIGHT, FRONT, LEFT, BACK, NUM_SIDES }; + +static constexpr xyz_pos_t true_center CALIBRATION_OBJECT_CENTER; +static constexpr xyz_float_t dimensions CALIBRATION_OBJECT_DIMENSIONS; +static constexpr xy_float_t nod = { CALIBRATION_NOZZLE_OUTER_DIAMETER, CALIBRATION_NOZZLE_OUTER_DIAMETER }; + +struct measurements_t { + xyz_pos_t obj_center = true_center; // Non-static must be assigned from xyz_pos_t + + float obj_side[NUM_SIDES], backlash[NUM_SIDES]; + xyz_float_t pos_error; + + xy_float_t nozzle_outer_dimension = nod; +}; + +#if ENABLED(BACKLASH_GCODE) + #define TEMPORARY_BACKLASH_CORRECTION(value) REMEMBER(tbst, backlash.correction, value) +#else + #define TEMPORARY_BACKLASH_CORRECTION(value) +#endif + +#if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) + #define TEMPORARY_BACKLASH_SMOOTHING(value) REMEMBER(tbsm, backlash.smoothing_mm, value) +#else + #define TEMPORARY_BACKLASH_SMOOTHING(value) +#endif + +inline void calibration_move() { + do_blocking_move_to(current_position, MMM_TO_MMS(CALIBRATION_FEEDRATE_TRAVEL)); +} + +/** + * Move to the exact center above the calibration object + * + * m in - Measurement record + * uncertainty in - How far away from the object top to park + */ +inline void park_above_object(measurements_t &m, const float uncertainty) { + // Move to safe distance above calibration object + current_position.z = m.obj_center.z + dimensions.z / 2 + uncertainty; + calibration_move(); + + // Move to center of calibration object in XY + current_position = xy_pos_t(m.obj_center); + calibration_move(); +} + +#if HAS_MULTI_HOTEND + inline void set_nozzle(measurements_t &m, const uint8_t extruder) { + if (extruder != active_extruder) { + park_above_object(m, CALIBRATION_MEASUREMENT_UNKNOWN); + tool_change(extruder); + } + } +#endif + +#if HAS_HOTEND_OFFSET + + inline void normalize_hotend_offsets() { + LOOP_S_L_N(e, 1, HOTENDS) + hotend_offset[e] -= hotend_offset[0]; + hotend_offset[0].reset(); + } + +#endif + +inline bool read_calibration_pin() { + return ( + #if PIN_EXISTS(CALIBRATION) + READ(CALIBRATION_PIN) != CALIBRATION_PIN_INVERTING + #elif HAS_CUSTOM_PROBE_PIN + READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING + #else + READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING + #endif + ); +} + +/** + * Move along axis in the specified dir until the probe value becomes stop_state, + * then return the axis value. + * + * axis in - Axis along which the measurement will take place + * dir in - Direction along that axis (-1 or 1) + * stop_state in - Move until probe pin becomes this value + * fast in - Fast vs. precise measurement + */ +float measuring_movement(const AxisEnum axis, const int dir, const bool stop_state, const bool fast) { + const float step = fast ? 0.25 : CALIBRATION_MEASUREMENT_RESOLUTION; + const feedRate_t mms = fast ? MMM_TO_MMS(CALIBRATION_FEEDRATE_FAST) : MMM_TO_MMS(CALIBRATION_FEEDRATE_SLOW); + const float limit = fast ? 50 : 5; + + destination = current_position; + for (float travel = 0; travel < limit; travel += step) { + destination[axis] += dir * step; + do_blocking_move_to(destination, mms); + planner.synchronize(); + if (read_calibration_pin() == stop_state) break; + } + return destination[axis]; +} + +/** + * Move along axis until the probe is triggered. Move toolhead to its starting + * point and return the measured value. + * + * axis in - Axis along which the measurement will take place + * dir in - Direction along that axis (-1 or 1) + * stop_state in - Move until probe pin becomes this value + * backlash_ptr in/out - When not nullptr, measure and record axis backlash + * uncertainty in - If uncertainty is CALIBRATION_MEASUREMENT_UNKNOWN, do a fast probe. + */ +inline float measure(const AxisEnum axis, const int dir, const bool stop_state, float * const backlash_ptr, const float uncertainty) { + const bool fast = uncertainty == CALIBRATION_MEASUREMENT_UNKNOWN; + + // Save position + destination = current_position; + const float start_pos = destination[axis]; + const float measured_pos = measuring_movement(axis, dir, stop_state, fast); + // Measure backlash + if (backlash_ptr && !fast) { + const float release_pos = measuring_movement(axis, -dir, !stop_state, fast); + *backlash_ptr = ABS(release_pos - measured_pos); + } + // Return to starting position + destination[axis] = start_pos; + do_blocking_move_to(destination, MMM_TO_MMS(CALIBRATION_FEEDRATE_TRAVEL)); + return measured_pos; +} + +/** + * Probe one side of the calibration object + * + * m in/out - Measurement record, m.obj_center and m.obj_side will be updated. + * uncertainty in - How far away from the calibration object to begin probing + * side in - Side of probe where probe will occur + * probe_top_at_edge in - When probing sides, probe top of calibration object nearest edge + * to find out height of edge + */ +inline void probe_side(measurements_t &m, const float uncertainty, const side_t side, const bool probe_top_at_edge=false) { + const xyz_float_t dimensions = CALIBRATION_OBJECT_DIMENSIONS; + AxisEnum axis; + float dir = 1; + + park_above_object(m, uncertainty); + + switch (side) { + #if AXIS_CAN_CALIBRATE(Z) + case TOP: { + const float measurement = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty); + m.obj_center.z = measurement - dimensions.z / 2; + m.obj_side[TOP] = measurement; + return; + } + #endif + #if AXIS_CAN_CALIBRATE(X) + case LEFT: axis = X_AXIS; break; + case RIGHT: axis = X_AXIS; dir = -1; break; + #endif + #if AXIS_CAN_CALIBRATE(Y) + case FRONT: axis = Y_AXIS; break; + case BACK: axis = Y_AXIS; dir = -1; break; + #endif + default: return; + } + + if (probe_top_at_edge) { + #if AXIS_CAN_CALIBRATE(Z) + // Probe top nearest the side we are probing + current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 - m.nozzle_outer_dimension[axis]); + calibration_move(); + m.obj_side[TOP] = measure(Z_AXIS, -1, true, &m.backlash[TOP], uncertainty); + m.obj_center.z = m.obj_side[TOP] - dimensions.z / 2; + #endif + } + + if ((AXIS_CAN_CALIBRATE(X) && axis == X_AXIS) || (AXIS_CAN_CALIBRATE(Y) && axis == Y_AXIS)) { + // Move to safe distance to the side of the calibration object + current_position[axis] = m.obj_center[axis] + (-dir) * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2 + uncertainty); + calibration_move(); + + // Plunge below the side of the calibration object and measure + current_position.z = m.obj_side[TOP] - (CALIBRATION_NOZZLE_TIP_HEIGHT) * 0.7f; + calibration_move(); + const float measurement = measure(axis, dir, true, &m.backlash[side], uncertainty); + m.obj_center[axis] = measurement + dir * (dimensions[axis] / 2 + m.nozzle_outer_dimension[axis] / 2); + m.obj_side[side] = measurement; + } +} + +/** + * Probe all sides of the calibration calibration object + * + * m in/out - Measurement record: center, backlash and error values be updated. + * uncertainty in - How far away from the calibration object to begin probing + */ +inline void probe_sides(measurements_t &m, const float uncertainty) { + #if ENABLED(CALIBRATION_MEASURE_AT_TOP_EDGES) + constexpr bool probe_top_at_edge = true; + #else + // Probing at the exact center only works if the center is flat. Probing on a washer + // or bolt will require probing the top near the side edges, away from the center. + constexpr bool probe_top_at_edge = false; + probe_side(m, uncertainty, TOP); + #endif + + TERN_(CALIBRATION_MEASURE_RIGHT, probe_side(m, uncertainty, RIGHT, probe_top_at_edge)); + TERN_(CALIBRATION_MEASURE_FRONT, probe_side(m, uncertainty, FRONT, probe_top_at_edge)); + TERN_(CALIBRATION_MEASURE_LEFT, probe_side(m, uncertainty, LEFT, probe_top_at_edge)); + TERN_(CALIBRATION_MEASURE_BACK, probe_side(m, uncertainty, BACK, probe_top_at_edge)); + + // Compute the measured center of the calibration object. + TERN_(HAS_X_CENTER, m.obj_center.x = (m.obj_side[LEFT] + m.obj_side[RIGHT]) / 2); + TERN_(HAS_Y_CENTER, m.obj_center.y = (m.obj_side[FRONT] + m.obj_side[BACK]) / 2); + + // Compute the outside diameter of the nozzle at the height + // at which it makes contact with the calibration object + TERN_(HAS_X_CENTER, m.nozzle_outer_dimension.x = m.obj_side[RIGHT] - m.obj_side[LEFT] - dimensions.x); + TERN_(HAS_Y_CENTER, m.nozzle_outer_dimension.y = m.obj_side[BACK] - m.obj_side[FRONT] - dimensions.y); + + park_above_object(m, uncertainty); + + // The difference between the known and the measured location + // of the calibration object is the positional error + m.pos_error.x = (0 + #if HAS_X_CENTER + + true_center.x - m.obj_center.x + #endif + ); + m.pos_error.y = (0 + #if HAS_Y_CENTER + + true_center.y - m.obj_center.y + #endif + ); + m.pos_error.z = true_center.z - m.obj_center.z; +} + +#if ENABLED(CALIBRATION_REPORTING) + inline void report_measured_faces(const measurements_t &m) { + SERIAL_ECHOLNPGM("Sides:"); + #if AXIS_CAN_CALIBRATE(Z) + SERIAL_ECHOLNPAIR(" Top: ", m.obj_side[TOP]); + #endif + #if ENABLED(CALIBRATION_MEASURE_LEFT) + SERIAL_ECHOLNPAIR(" Left: ", m.obj_side[LEFT]); + #endif + #if ENABLED(CALIBRATION_MEASURE_RIGHT) + SERIAL_ECHOLNPAIR(" Right: ", m.obj_side[RIGHT]); + #endif + #if ENABLED(CALIBRATION_MEASURE_FRONT) + SERIAL_ECHOLNPAIR(" Front: ", m.obj_side[FRONT]); + #endif + #if ENABLED(CALIBRATION_MEASURE_BACK) + SERIAL_ECHOLNPAIR(" Back: ", m.obj_side[BACK]); + #endif + SERIAL_EOL(); + } + + inline void report_measured_center(const measurements_t &m) { + SERIAL_ECHOLNPGM("Center:"); + #if HAS_X_CENTER + SERIAL_ECHOLNPAIR_P(SP_X_STR, m.obj_center.x); + #endif + #if HAS_Y_CENTER + SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.obj_center.y); + #endif + SERIAL_ECHOLNPAIR_P(SP_Z_STR, m.obj_center.z); + SERIAL_EOL(); + } + + inline void report_measured_backlash(const measurements_t &m) { + SERIAL_ECHOLNPGM("Backlash:"); + #if AXIS_CAN_CALIBRATE(X) + #if ENABLED(CALIBRATION_MEASURE_LEFT) + SERIAL_ECHOLNPAIR(" Left: ", m.backlash[LEFT]); + #endif + #if ENABLED(CALIBRATION_MEASURE_RIGHT) + SERIAL_ECHOLNPAIR(" Right: ", m.backlash[RIGHT]); + #endif + #endif + #if AXIS_CAN_CALIBRATE(Y) + #if ENABLED(CALIBRATION_MEASURE_FRONT) + SERIAL_ECHOLNPAIR(" Front: ", m.backlash[FRONT]); + #endif + #if ENABLED(CALIBRATION_MEASURE_BACK) + SERIAL_ECHOLNPAIR(" Back: ", m.backlash[BACK]); + #endif + #endif + #if AXIS_CAN_CALIBRATE(Z) + SERIAL_ECHOLNPAIR(" Top: ", m.backlash[TOP]); + #endif + SERIAL_EOL(); + } + + inline void report_measured_positional_error(const measurements_t &m) { + SERIAL_CHAR('T'); + SERIAL_ECHO(int(active_extruder)); + SERIAL_ECHOLNPGM(" Positional Error:"); + #if HAS_X_CENTER + SERIAL_ECHOLNPAIR_P(SP_X_STR, m.pos_error.x); + #endif + #if HAS_Y_CENTER + SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.pos_error.y); + #endif + if (AXIS_CAN_CALIBRATE(Z)) SERIAL_ECHOLNPAIR_P(SP_Z_STR, m.pos_error.z); + SERIAL_EOL(); + } + + inline void report_measured_nozzle_dimensions(const measurements_t &m) { + SERIAL_ECHOLNPGM("Nozzle Tip Outer Dimensions:"); + #if HAS_X_CENTER || HAS_Y_CENTER + #if HAS_X_CENTER + SERIAL_ECHOLNPAIR_P(SP_X_STR, m.nozzle_outer_dimension.x); + #endif + #if HAS_Y_CENTER + SERIAL_ECHOLNPAIR_P(SP_Y_STR, m.nozzle_outer_dimension.y); + #endif + #else + UNUSED(m); + #endif + SERIAL_EOL(); + } + + #if HAS_HOTEND_OFFSET + // + // This function requires normalize_hotend_offsets() to be called + // + inline void report_hotend_offsets() { + LOOP_S_L_N(e, 1, HOTENDS) + SERIAL_ECHOLNPAIR_P(PSTR("T"), int(e), PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z); + } + #endif + +#endif // CALIBRATION_REPORTING + +/** + * Probe around the calibration object to measure backlash + * + * m in/out - Measurement record, updated with new readings + * uncertainty in - How far away from the object to begin probing + */ +inline void calibrate_backlash(measurements_t &m, const float uncertainty) { + // Backlash compensation should be off while measuring backlash + + { + // New scope for TEMPORARY_BACKLASH_CORRECTION + TEMPORARY_BACKLASH_CORRECTION(all_off); + TEMPORARY_BACKLASH_SMOOTHING(0.0f); + + probe_sides(m, uncertainty); + + #if ENABLED(BACKLASH_GCODE) + + #if HAS_X_CENTER + backlash.distance_mm.x = (m.backlash[LEFT] + m.backlash[RIGHT]) / 2; + #elif ENABLED(CALIBRATION_MEASURE_LEFT) + backlash.distance_mm.x = m.backlash[LEFT]; + #elif ENABLED(CALIBRATION_MEASURE_RIGHT) + backlash.distance_mm.x = m.backlash[RIGHT]; + #endif + + #if HAS_Y_CENTER + backlash.distance_mm.y = (m.backlash[FRONT] + m.backlash[BACK]) / 2; + #elif ENABLED(CALIBRATION_MEASURE_FRONT) + backlash.distance_mm.y = m.backlash[FRONT]; + #elif ENABLED(CALIBRATION_MEASURE_BACK) + backlash.distance_mm.y = m.backlash[BACK]; + #endif + + if (AXIS_CAN_CALIBRATE(Z)) backlash.distance_mm.z = m.backlash[TOP]; + #endif + } + + #if ENABLED(BACKLASH_GCODE) + // Turn on backlash compensation and move in all + // allowed directions to take up any backlash + { + // New scope for TEMPORARY_BACKLASH_CORRECTION + TEMPORARY_BACKLASH_CORRECTION(all_on); + TEMPORARY_BACKLASH_SMOOTHING(0.0f); + const xyz_float_t move = { AXIS_CAN_CALIBRATE(X) * 3, AXIS_CAN_CALIBRATE(Y) * 3, AXIS_CAN_CALIBRATE(Z) * 3 }; + current_position += move; calibration_move(); + current_position -= move; calibration_move(); + } + #endif +} + +inline void update_measurements(measurements_t &m, const AxisEnum axis) { + current_position[axis] += m.pos_error[axis]; + m.obj_center[axis] = true_center[axis]; + m.pos_error[axis] = 0; +} + +/** + * Probe around the calibration object. Adjust the position and toolhead offset + * using the deviation from the known position of the calibration object. + * + * m in/out - Measurement record, updated with new readings + * uncertainty in - How far away from the object to begin probing + * extruder in - What extruder to probe + * + * Prerequisites: + * - Call calibrate_backlash() beforehand for best accuracy + */ +inline void calibrate_toolhead(measurements_t &m, const float uncertainty, const uint8_t extruder) { + TEMPORARY_BACKLASH_CORRECTION(all_on); + TEMPORARY_BACKLASH_SMOOTHING(0.0f); + + #if HAS_MULTI_HOTEND + set_nozzle(m, extruder); + #else + UNUSED(extruder); + #endif + + probe_sides(m, uncertainty); + + // Adjust the hotend offset + #if HAS_HOTEND_OFFSET + if (ENABLED(HAS_X_CENTER) && AXIS_CAN_CALIBRATE(X)) hotend_offset[extruder].x += m.pos_error.x; + if (ENABLED(HAS_Y_CENTER) && AXIS_CAN_CALIBRATE(Y)) hotend_offset[extruder].y += m.pos_error.y; + if (AXIS_CAN_CALIBRATE(Z)) hotend_offset[extruder].z += m.pos_error.z; + normalize_hotend_offsets(); + #endif + + // Correct for positional error, so the object + // is at the known actual spot + planner.synchronize(); + if (ENABLED(HAS_X_CENTER) && AXIS_CAN_CALIBRATE(X)) update_measurements(m, X_AXIS); + if (ENABLED(HAS_Y_CENTER) && AXIS_CAN_CALIBRATE(Y)) update_measurements(m, Y_AXIS); + if (AXIS_CAN_CALIBRATE(Z)) update_measurements(m, Z_AXIS); + + sync_plan_position(); +} + +/** + * Probe around the calibration object for all toolheads, adjusting the coordinate + * system for the first nozzle and the nozzle offset for subsequent nozzles. + * + * m in/out - Measurement record, updated with new readings + * uncertainty in - How far away from the object to begin probing + */ +inline void calibrate_all_toolheads(measurements_t &m, const float uncertainty) { + TEMPORARY_BACKLASH_CORRECTION(all_on); + TEMPORARY_BACKLASH_SMOOTHING(0.0f); + + HOTEND_LOOP() calibrate_toolhead(m, uncertainty, e); + + TERN_(HAS_HOTEND_OFFSET, normalize_hotend_offsets()); + + TERN_(HAS_MULTI_HOTEND, set_nozzle(m, 0)); +} + +/** + * Perform a full auto-calibration routine: + * + * 1) For each nozzle, touch top and sides of object to determine object position and + * nozzle offsets. Do a fast but rough search over a wider area. + * 2) With the first nozzle, touch top and sides of object to determine backlash values + * for all axis (if BACKLASH_GCODE is enabled) + * 3) For each nozzle, touch top and sides of object slowly to determine precise + * position of object. Adjust coordinate system and nozzle offsets so probed object + * location corresponds to known object location with a high degree of precision. + */ +inline void calibrate_all() { + measurements_t m; + + TERN_(HAS_HOTEND_OFFSET, reset_hotend_offsets()); + + TEMPORARY_BACKLASH_CORRECTION(all_on); + TEMPORARY_BACKLASH_SMOOTHING(0.0f); + + // Do a fast and rough calibration of the toolheads + calibrate_all_toolheads(m, CALIBRATION_MEASUREMENT_UNKNOWN); + + TERN_(BACKLASH_GCODE, calibrate_backlash(m, CALIBRATION_MEASUREMENT_UNCERTAIN)); + + // Cycle the toolheads so the servos settle into their "natural" positions + #if HAS_MULTI_HOTEND + HOTEND_LOOP() set_nozzle(m, e); + #endif + + // Do a slow and precise calibration of the toolheads + calibrate_all_toolheads(m, CALIBRATION_MEASUREMENT_UNCERTAIN); + + current_position.x = X_CENTER; + calibration_move(); // Park nozzle away from calibration object +} + +/** + * G425: Perform calibration with calibration object. + * + * B - Perform calibration of backlash only. + * T - Perform calibration of toolhead only. + * V - Probe object and print position, error, backlash and hotend offset. + * U - Uncertainty, how far to start probe away from the object (mm) + * + * 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 + + if (homing_needed_error()) return; + + TEMPORARY_BED_LEVELING_STATE(false); + SET_SOFT_ENDSTOP_LOOSE(true); + + measurements_t m; + float uncertainty = parser.seenval('U') ? parser.value_float() : CALIBRATION_MEASUREMENT_UNCERTAIN; + + if (parser.seen('B')) + calibrate_backlash(m, uncertainty); + else if (parser.seen('T')) + calibrate_toolhead(m, uncertainty, parser.has_value() ? parser.value_int() : active_extruder); + #if ENABLED(CALIBRATION_REPORTING) + else if (parser.seen('V')) { + probe_sides(m, uncertainty); + SERIAL_EOL(); + report_measured_faces(m); + report_measured_center(m); + report_measured_backlash(m); + report_measured_nozzle_dimensions(m); + report_measured_positional_error(m); + #if HAS_HOTEND_OFFSET + normalize_hotend_offsets(); + report_hotend_offsets(); + #endif + } + #endif + else + calibrate_all(); + + SET_SOFT_ENDSTOP_LOOSE(false); + + #ifdef CALIBRATION_SCRIPT_POST + GcodeSuite::process_subcommands_now_P(PSTR(CALIBRATION_SCRIPT_POST)); + #endif +} + +#endif // CALIBRATION_GCODE diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp new file mode 100644 index 00000000..89393b45 --- /dev/null +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -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 . + * + */ + +/** + * G76_M871.cpp - Temperature calibration/compensation for z-probing + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PROBE_TEMP_COMPENSATION) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/probe.h" +#include "../../feature/bedlevel/bedlevel.h" +#include "../../module/temperature.h" +#include "../../module/probe.h" +#include "../../feature/probe_temp_comp.h" + +#include "../../lcd/ultralcd.h" +#include "../../MarlinCore.h" // for wait_for_heatup and idle() + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENTS_LEDS) + #include "../../feature/leds/leds.h" +#endif + +/** + * G76: calibrate probe and/or bed temperature offsets + * Notes: + * - When calibrating probe, bed temperature is held constant. + * Compensation values are deltas to first probe measurement at probe temp. = 30°C. + * - 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 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. + * + * Probe calibration: + * - Moves probe to cooldown point. + * - Heats up bed to 100°C. + * - Moves probe to probing point (1mm above heatbed). + * - Waits until probe reaches target temperature (30°C). + * - Does a z-probing (=base value) and increases target temperature by 5°C. + * - Waits until probe reaches increased target temperature. + * - Does a z-probing (delta to base value will be a compensation value) and increases target temperature by 5°C. + * - Repeats last two steps until max. temperature reached or timeout (i.e. probe does not heat up any further). + * - Compensation values of higher temperatures will be extrapolated (using linear regression first). + * While this is not exact by any means it is still better than simply using the last compensation value. + * + * Bed calibration: + * - Moves probe to cooldown point. + * - Heats up bed to 60°C. + * - Moves probe to probing point (1mm above heatbed). + * - Waits until probe reaches target temperature (30°C). + * - Does a z-probing (=base value) and increases bed temperature by 5°C. + * - Moves probe to cooldown point. + * - Waits until probe is below 30°C and bed has reached target temperature. + * - Moves probe to probing point and waits until it reaches target temperature (30°C). + * - Does a z-probing (delta to base value will be a compensation value) and increases bed temperature by 5°C. + * - Repeats last four points until max. bed temperature reached (110°C) or timeout. + * - Compensation values of higher temperatures will be extrapolated (using linear regression first). + * While this is not exact by any means it is still better than simply using the last compensation value. + * + * G76 [B | P] + * - no flag - Both calibration procedures will be run. + * - `B` - Run bed temperature calibration. + * - `P` - Run probe temperature calibration. + */ +void GcodeSuite::G76() { + // Check if heated bed is available and z-homing is done with probe + #if TEMP_SENSOR_BED == 0 || !(HOMING_Z_WITH_PROBE) + return; + #endif + + auto report_temps = [](millis_t &ntr, millis_t timeout=0) { + idle_no_sleep(); + const millis_t ms = millis(); + if (ELAPSED(ms, ntr)) { + ntr = ms + 1000; + thermalManager.print_heater_states(active_extruder); + } + return (timeout && ELAPSED(ms, timeout)); + }; + + auto wait_for_temps = [&](const float tb, const float tp, millis_t &ntr, const millis_t timeout=0) { + SERIAL_ECHOLNPGM("Waiting for bed and probe temperature."); + while (fabs(thermalManager.degBed() - tb) > 0.1f || thermalManager.degProbe() > tp) + if (report_temps(ntr, timeout)) return true; + return false; + }; + + auto g76_probe = [](const TempSensorID sid, uint16_t &targ, const xy_pos_t &nozpos) { + 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."); + else { + SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); + if (targ == cali_info_init[sid].start_temp) + temp_comp.prepare_new_calibration(measured_z); + else + temp_comp.push_back_new_measurement(sid, measured_z); + targ += cali_info_init[sid].temp_res; + } + return measured_z; + }; + + #if ENABLED(BLTOUCH) + // Make sure any BLTouch error condition is cleared + bltouch_command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); + set_bltouch_deployed(false); + #endif + + bool do_bed_cal = parser.boolval('B'), do_probe_cal = parser.boolval('P'); + if (!do_bed_cal && !do_probe_cal) do_bed_cal = do_probe_cal = true; + + // Synchronize with planner + planner.synchronize(); + + const xyz_pos_t parkpos = temp_comp.park_point, + probe_pos_xyz = xyz_pos_t(temp_comp.measure_point) + xyz_pos_t({ 0.0f, 0.0f, PTC_PROBE_HEATING_OFFSET }), + noz_pos_xyz = probe_pos_xyz - xy_pos_t(probe.offset_xy); // Nozzle position based on probe position + + if (do_bed_cal || do_probe_cal) { + // Ensure park position is reachable + bool reachable = position_is_reachable(parkpos) || WITHIN(parkpos.z, Z_MIN_POS - fslop, Z_MAX_POS + fslop); + if (!reachable) + SERIAL_ECHOLNPGM("!Park"); + else { + // Ensure probe position is reachable + reachable = probe.can_reach(probe_pos_xyz); + if (!reachable) SERIAL_ECHOLNPGM("!Probe"); + } + + if (!reachable) { + SERIAL_ECHOLNPGM(" position unreachable - aborting."); + return; + } + + process_subcommands_now_P(PSTR("G28")); + } + + remember_feedrate_scaling_off(); + + + /****************************************** + * Calibrate bed temperature offsets + ******************************************/ + + // Report temperatures every second and handle heating timeouts + millis_t next_temp_report = millis() + 1000; + + auto report_targets = [&](const uint16_t tb, const uint16_t tp) { + SERIAL_ECHOLNPAIR("Target Bed:", tb, " Probe:", tp); + }; + + if (do_bed_cal) { + + uint16_t target_bed = cali_info_init[TSI_BED].start_temp, + target_probe = temp_comp.bed_calib_probe_temp; + + SERIAL_ECHOLNPGM("Waiting for cooling."); + while (thermalManager.degBed() > target_bed || thermalManager.degProbe() > target_probe) + report_temps(next_temp_report); + + // Disable leveling so it won't mess with us + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + + for (;;) { + thermalManager.setTargetBed(target_bed); + + report_targets(target_bed, target_probe); + + // Park nozzle + do_blocking_move_to(parkpos); + + // Wait for heatbed to reach target temp and probe to cool below target temp + if (wait_for_temps(target_bed, target_probe, next_temp_report, millis() + MIN_TO_MS(15))) { + SERIAL_ECHOLNPGM("!Bed heating timeout."); + break; + } + + // Move the nozzle to the probing point and wait for the probe to reach target temp + do_blocking_move_to(noz_pos_xyz); + SERIAL_ECHOLNPGM("Waiting for probe heating."); + while (thermalManager.degProbe() < target_probe) + report_temps(next_temp_report); + + const float measured_z = g76_probe(TSI_BED, target_bed, noz_pos_xyz); + if (isnan(measured_z) || target_bed > BED_MAX_TARGET) break; + } + + SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); + if (temp_comp.finish_calibration(TSI_BED)) + SERIAL_ECHOLNPGM("Successfully calibrated bed."); + else + SERIAL_ECHOLNPGM("!Failed to calibrate bed. Values reset."); + + // Cleanup + thermalManager.setTargetBed(0); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); + } // do_bed_cal + + /******************************************** + * Calibrate probe temperature offsets + ********************************************/ + + if (do_probe_cal) { + + // Park nozzle + do_blocking_move_to(parkpos); + + // Initialize temperatures + const uint16_t target_bed = temp_comp.probe_calib_bed_temp; + thermalManager.setTargetBed(target_bed); + + uint16_t target_probe = cali_info_init[TSI_PROBE].start_temp; + + report_targets(target_bed, target_probe); + + // Wait for heatbed to reach target temp and probe to cool below target temp + wait_for_temps(target_bed, target_probe, next_temp_report); + + // Disable leveling so it won't mess with us + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + + bool timeout = false; + for (;;) { + // Move probe to probing point and wait for it to reach target temperature + do_blocking_move_to(noz_pos_xyz); + + SERIAL_ECHOLNPAIR("Waiting for probe heating. Bed:", target_bed, " Probe:", target_probe); + const millis_t probe_timeout_ms = millis() + 900UL * 1000UL; + while (thermalManager.degProbe() < target_probe) { + if (report_temps(next_temp_report, probe_timeout_ms)) { + SERIAL_ECHOLNPGM("!Probe heating timed out."); + timeout = true; + break; + } + } + if (timeout) break; + + const float measured_z = g76_probe(TSI_PROBE, target_probe, noz_pos_xyz); + if (isnan(measured_z) || target_probe > cali_info_init[TSI_PROBE].end_temp) break; + } + + SERIAL_ECHOLNPAIR("Retrieved measurements: ", temp_comp.get_index()); + if (temp_comp.finish_calibration(TSI_PROBE)) + SERIAL_ECHOPGM("Successfully calibrated"); + else + SERIAL_ECHOPGM("!Failed to calibrate"); + SERIAL_ECHOLNPGM(" probe."); + + // Cleanup + thermalManager.setTargetBed(0); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(true)); + + SERIAL_ECHOLNPGM("Final compensation values:"); + temp_comp.print_offsets(); + } // do_probe_cal + + restore_feedrate_and_scaling(); +} + +/** + * M871: Report / reset temperature compensation offsets. + * Note: This does not affect values in EEPROM until M500. + * + * M871 [ R | B | P | E ] + * + * No Parameters - Print current offset values. + * + * Select only one of these flags: + * R - Reset all offsets to zero (i.e., disable compensation). + * B - Manually set offset for bed + * P - Manually set offset for probe + * E - Manually set offset for extruder + * + * With B, P, or E: + * I[index] - Index in the array + * V[value] - Adjustment in µm + */ +void GcodeSuite::M871() { + + if (parser.seen('R')) { + // Reset z-probe offsets to factory defaults + temp_comp.clear_all_offsets(); + SERIAL_ECHOLNPGM("Offsets reset to default."); + } + else if (parser.seen("BPE")) { + if (!parser.seenval('V')) return; + const int16_t offset_val = parser.value_int(); + if (!parser.seenval('I')) return; + const int16_t idx = parser.value_int(); + const TempSensorID mod = (parser.seen('B') ? TSI_BED : + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + parser.seen('E') ? TSI_EXT : + #endif + TSI_PROBE + ); + if (idx > 0 && temp_comp.set_offset(mod, idx - 1, offset_val)) + SERIAL_ECHOLNPAIR("Set value: ", offset_val); + else + SERIAL_ECHOLNPGM("!Invalid index. Failed to set value (note: value at index 0 is constant)."); + + } + else // Print current Z-probe adjustments. Note: Values in EEPROM might differ. + temp_comp.print_offsets(); +} + +/** + * M192: Wait for probe temperature sensor to reach a target + * + * Select only one of these flags: + * R - Wait for heating or cooling + * S - Wait only for heating + */ +void GcodeSuite::M192() { + if (DEBUGGING(DRYRUN)) return; + + const bool no_wait_for_cooling = parser.seenval('S'); + if (!no_wait_for_cooling && ! parser.seenval('R')) { + SERIAL_ERROR_MSG("No target temperature set."); + return; + } + + const float target_temp = parser.value_celsius(); + ui.set_status_P(thermalManager.isProbeBelowTemp(target_temp) ? GET_TEXT(MSG_PROBE_HEATING) : GET_TEXT(MSG_PROBE_COOLING)); + thermalManager.wait_for_probe(target_temp, no_wait_for_cooling); +} + +#endif // PROBE_TEMP_COMPENSATION diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp new file mode 100644 index 00000000..9ac2380e --- /dev/null +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -0,0 +1,379 @@ +/** + * 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(M100_FREE_MEMORY_WATCHER) + +#include "../gcode.h" +#include "../queue.h" +#include "../../libs/hex_print.h" + +#include "../../MarlinCore.h" // for idle() + +/** + * M100 Free Memory Watcher + * + * This code watches the free memory block between the bottom of the heap and the top of the stack. + * This memory block is initialized and watched via the M100 command. + * + * M100 I Initializes the free memory block and prints vitals statistics about the area + * + * M100 F Identifies how much of the free memory block remains free and unused. It also + * detects and reports any corruption within the free memory block that may have + * happened due to errant firmware. + * + * M100 D Does a hex display of the free memory block along with a flag for any errant + * data that does not match the expected value. + * + * M100 C x Corrupts x locations within the free memory block. This is useful to check the + * correctness of the M100 F and M100 D commands. + * + * Also, there are two support functions that can be called from a developer's C code. + * + * uint16_t check_for_free_memory_corruption(PGM_P const free_memory_start); + * void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); + * + * Initial version by Roxy-3D + */ +#define M100_FREE_MEMORY_DUMPER // Enable for the `M100 D` Dump sub-command +#define M100_FREE_MEMORY_CORRUPTOR // Enable for the `M100 C` Corrupt sub-command + +#define TEST_BYTE ((char) 0xE5) + +#if EITHER(__AVR__, IS_32BIT_TEENSY) + + extern char __bss_end; + char *end_bss = &__bss_end, + *free_memory_start = end_bss, *free_memory_end = 0, + *stacklimit = 0, *heaplimit = 0; + + #define MEMORY_END_CORRECTION 0 + +#elif defined(TARGET_LPC1768) + + extern char __bss_end__, __StackLimit, __HeapLimit; + + char *end_bss = &__bss_end__, + *stacklimit = &__StackLimit, + *heaplimit = &__HeapLimit; + + #define MEMORY_END_CORRECTION 0x200 + + char *free_memory_start = heaplimit, + *free_memory_end = stacklimit - MEMORY_END_CORRECTION; + +#elif defined(__SAM3X8E__) + + extern char _ebss; + + char *end_bss = &_ebss, + *free_memory_start = end_bss, + *free_memory_end = 0, + *stacklimit = 0, + *heaplimit = 0; + + #define MEMORY_END_CORRECTION 0x10000 // need to stay well below 0x20080000 or M100 F crashes + +#elif defined(__SAMD51__) + + extern unsigned int __bss_end__, __StackLimit, __HeapLimit; + extern "C" void * _sbrk(int incr); + + void *end_bss = &__bss_end__, + *stacklimit = &__StackLimit, + *heaplimit = &__HeapLimit; + + #define MEMORY_END_CORRECTION 0x400 + + char *free_memory_start = (char *)_sbrk(0) + 0x200, // Leave some heap space + *free_memory_end = (char *)stacklimit - MEMORY_END_CORRECTION; + +#else + #error "M100 - unsupported CPU" +#endif + +// +// Utility functions +// + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wreturn-local-addr" + +// Location of a variable in its stack frame. +// The returned address will be above the stack (after it returns). +char *top_of_stack() { + char x; + return &x + 1; // x is pulled on return; +} + +#pragma GCC diagnostic pop + +// Count the number of test bytes at the specified location. +inline int32_t count_test_bytes(const char * const start_free_memory) { + for (uint32_t i = 0; i < 32000; i++) + if (char(start_free_memory[i]) != TEST_BYTE) + return i - 1; + + return -1; +} + +// +// M100 sub-commands +// + +#if ENABLED(M100_FREE_MEMORY_DUMPER) + /** + * M100 D + * Dump the free memory block from brkval to the stack pointer. + * malloc() eats memory from the start of the block and the stack grows + * up from the bottom of the block. Solid test bytes indicate nothing has + * used that memory yet. There should not be anything but test bytes within + * the block. If so, it may indicate memory corruption due to a bad pointer. + * Unexpected bytes are flagged in the right column. + */ + inline void dump_free_memory(char *start_free_memory, char *end_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*)(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) { + print_hex_address(start_free_memory); // Print the address + SERIAL_CHAR(':'); + LOOP_L_N(i, 16) { // and 16 data bytes + if (i == 8) SERIAL_CHAR('-'); + print_hex_byte(start_free_memory[i]); + SERIAL_CHAR(' '); + } + serial_delay(25); + SERIAL_CHAR('|'); // Point out non test bytes + LOOP_L_N(i, 16) { + char ccc = (char)start_free_memory[i]; // cast to char before automatically casting to char on assignment, in case the compiler is broken + ccc = (ccc == TEST_BYTE) ? ' ' : '?'; + SERIAL_CHAR(ccc); + } + SERIAL_EOL(); + start_free_memory += 16; + serial_delay(25); + idle(); + } + } + + void M100_dump_routine(PGM_P const title, const char * const start, const char * const end) { + serialprintPGM(title); + SERIAL_EOL(); + // + // Round the start and end locations to produce full lines of output + // + dump_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) + ); + } + +#endif // M100_FREE_MEMORY_DUMPER + +inline int check_for_free_memory_corruption(PGM_P const title) { + serialprintPGM(title); + + char *start_free_memory = free_memory_start, *end_free_memory = free_memory_end; + int n = end_free_memory - start_free_memory; + + SERIAL_ECHOPAIR("\nfmc() n=", n); + SERIAL_ECHOPAIR("\nfree_memory_start=", hex_address(free_memory_start)); + SERIAL_ECHOLNPAIR(" end_free_memory=", hex_address(end_free_memory)); + + if (end_free_memory < start_free_memory) { + SERIAL_ECHOPGM(" end_free_memory < Heap "); + // SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board + // safe_delay(5); // this code can be enabled to pause the display as soon as the + // while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch + // idle(); // being on pin-63 which is unassigend and available on most controller + // safe_delay(20); // boards. + // while ( !READ(63)) + // idle(); + serial_delay(20); + #if ENABLED(M100_FREE_MEMORY_DUMPER) + M100_dump_routine(PSTR(" Memory corruption detected with end_free_memory 8) { + // SERIAL_ECHOPAIR("Found ", j); + // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(start_free_memory + i)); + i += j; + block_cnt++; + SERIAL_ECHOPAIR(" (", block_cnt); + SERIAL_ECHOPAIR(") found=", j); + SERIAL_ECHOLNPGM(" "); + } + } + } + SERIAL_ECHOPAIR(" block_found=", block_cnt); + + if (block_cnt != 1) + SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); + + if (block_cnt == 0) // Make sure the special case of no free blocks shows up as an + block_cnt = -1; // error to the calling code! + + SERIAL_ECHOPGM(" return="); + if (block_cnt == 1) { + SERIAL_CHAR('0'); // If the block_cnt is 1, nothing has broken up the free memory + SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. + return 0; + } + SERIAL_ECHOLNPGM("true"); + return block_cnt; +} + +/** + * M100 F + * Return the number of free bytes in the memory pool, + * with other vital statistics defining the pool. + */ +inline void free_memory_pool_report(char * const start_free_memory, const int32_t size) { + int32_t max_cnt = -1, block_cnt = 0; + char *max_addr = nullptr; + // Find the longest block of test bytes in the buffer + for (int32_t i = 0; i < size; i++) { + char *addr = start_free_memory + i; + if (*addr == TEST_BYTE) { + const int32_t j = count_test_bytes(addr); + if (j > 8) { + SERIAL_ECHOPAIR("Found ", j); + SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(addr)); + if (j > max_cnt) { + max_cnt = j; + max_addr = addr; + } + i += j; + block_cnt++; + } + } + } + if (block_cnt > 1) { + SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); + SERIAL_ECHOPAIR("\nLargest free block is ", max_cnt); + SERIAL_ECHOLNPAIR(" bytes at ", hex_address(max_addr)); + } + SERIAL_ECHOLNPAIR("check_for_free_memory_corruption() = ", check_for_free_memory_corruption(PSTR("M100 F "))); +} + +#if ENABLED(M100_FREE_MEMORY_CORRUPTOR) + /** + * M100 C + * Corrupt locations in the free memory pool and report the corrupt addresses. + * This is useful to check the correctness of the M100 D and the M100 F commands. + */ + inline void corrupt_free_memory(char *start_free_memory, const uint32_t size) { + start_free_memory += 8; + const uint32_t near_top = top_of_stack() - start_free_memory - 250, // -250 to avoid interrupt activity that's altered the stack. + j = near_top / (size + 1); + + SERIAL_ECHOLNPGM("Corrupting free memory block.\n"); + for (uint32_t i = 1; i <= size; i++) { + char * const addr = start_free_memory + i * j; + *addr = i; + SERIAL_ECHOPAIR("\nCorrupting address: ", hex_address(addr)); + } + SERIAL_EOL(); + } +#endif // M100_FREE_MEMORY_CORRUPTOR + +/** + * M100 I + * Init memory for the M100 tests. (Automatically applied on the first M100.) + */ +inline void init_free_memory(char *start_free_memory, int32_t size) { + SERIAL_ECHOLNPGM("Initializing free memory block.\n\n"); + + size -= 250; // -250 to avoid interrupt activity that's altered the stack. + if (size < 0) { + SERIAL_ECHOLNPGM("Unable to initialize.\n"); + return; + } + + start_free_memory += 8; // move a few bytes away from the heap just because we don't want + // to be altering memory that close to it. + memset(start_free_memory, TEST_BYTE, size); + + SERIAL_ECHO(size); + SERIAL_ECHOLNPGM(" bytes of memory initialized.\n"); + + for (int32_t i = 0; i < size; i++) { + if (start_free_memory[i] != TEST_BYTE) { + SERIAL_ECHOPAIR("? address : ", hex_address(start_free_memory + i)); + SERIAL_ECHOLNPAIR("=", hex_byte(start_free_memory[i])); + SERIAL_EOL(); + } + } +} + +/** + * M100: Free Memory Check + */ +void GcodeSuite::M100() { + + char *sp = top_of_stack(); + if (!free_memory_end) free_memory_end = sp - MEMORY_END_CORRECTION; + SERIAL_ECHOPAIR("\nbss_end : ", hex_address(end_bss)); + if (heaplimit) SERIAL_ECHOPAIR("\n__heaplimit : ", hex_address(heaplimit)); + SERIAL_ECHOPAIR("\nfree_memory_start : ", hex_address(free_memory_start)); + if (stacklimit) SERIAL_ECHOPAIR("\n__stacklimit : ", hex_address(stacklimit)); + SERIAL_ECHOPAIR("\nfree_memory_end : ", hex_address(free_memory_end)); + if (MEMORY_END_CORRECTION) SERIAL_ECHOPAIR("\nMEMORY_END_CORRECTION: ", MEMORY_END_CORRECTION); + SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); + + // Always init on the first invocation of M100 + static bool m100_not_initialized = true; + if (m100_not_initialized || parser.seen('I')) { + m100_not_initialized = false; + init_free_memory(free_memory_start, free_memory_end - free_memory_start); + } + + #if ENABLED(M100_FREE_MEMORY_DUMPER) + if (parser.seen('D')) + return dump_free_memory(free_memory_start, free_memory_end); + #endif + + if (parser.seen('F')) + return free_memory_pool_report(free_memory_start, free_memory_end - free_memory_start); + + #if ENABLED(M100_FREE_MEMORY_CORRUPTOR) + + if (parser.seen('C')) + return corrupt_free_memory(free_memory_start, parser.value_int()); + + #endif +} + +#endif // M100_FREE_MEMORY_WATCHER diff --git a/Marlin/src/gcode/calibrate/M12.cpp b/Marlin/src/gcode/calibrate/M12.cpp new file mode 100644 index 00000000..da244543 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M12.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/MarlinConfigPre.h" + +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + +#include "../gcode.h" +#include "../../module/planner.h" +#include "../../feature/closedloop.h" + +void GcodeSuite::M12() { + + planner.synchronize(); + + if (parser.seenval('S')) + closedloop.set(parser.value_int()); // Force a CLC set + +} + +#endif diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp new file mode 100644 index 00000000..40441ac0 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M425.cpp @@ -0,0 +1,111 @@ +/** + * 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(BACKLASH_GCODE) + +#include "../../feature/backlash.h" +#include "../../module/planner.h" + +#include "../gcode.h" + +/** + * M425: Enable and tune backlash correction. + * + * F Enable/disable/fade-out backlash correction (0.0 to 1.0) + * S Distance over which backlash correction is spread + * X Set the backlash distance on X (0 to disable) + * Y ... on Y + * Z ... on Z + * X If a backlash measurement was done on X, copy that value + * Y ... on Y + * Z ... on Z + * + * Type M425 without any arguments to show active values. + */ +void GcodeSuite::M425() { + bool noArgs = true; + + auto axis_can_calibrate = [](const uint8_t a) { + switch (a) { + default: + case X_AXIS: return AXIS_CAN_CALIBRATE(X); + case Y_AXIS: return AXIS_CAN_CALIBRATE(Y); + case Z_AXIS: return AXIS_CAN_CALIBRATE(Z); + } + }; + + LOOP_XYZ(a) { + if (axis_can_calibrate(a) && parser.seen(XYZ_CHAR(a))) { + planner.synchronize(); + backlash.distance_mm[a] = parser.has_value() ? parser.value_linear_units() : backlash.get_measurement(AxisEnum(a)); + noArgs = false; + } + } + + if (parser.seen('F')) { + planner.synchronize(); + backlash.set_correction(parser.value_float()); + noArgs = false; + } + + #ifdef BACKLASH_SMOOTHING_MM + if (parser.seen('S')) { + planner.synchronize(); + backlash.smoothing_mm = parser.value_linear_units(); + noArgs = false; + } + #endif + + if (noArgs) { + SERIAL_ECHOPGM("Backlash Correction "); + if (!backlash.correction) SERIAL_ECHOPGM("in"); + SERIAL_ECHOLNPGM("active:"); + SERIAL_ECHOLNPAIR(" Correction Amount/Fade-out: F", backlash.get_correction(), " (F1.0 = full, F0.0 = none)"); + SERIAL_ECHOPGM(" Backlash Distance (mm): "); + LOOP_XYZ(a) if (axis_can_calibrate(a)) { + SERIAL_CHAR(' ', XYZ_CHAR(a)); + SERIAL_ECHO(backlash.distance_mm[a]); + SERIAL_EOL(); + } + + #ifdef BACKLASH_SMOOTHING_MM + SERIAL_ECHOLNPAIR(" Smoothing (mm): S", backlash.smoothing_mm); + #endif + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + SERIAL_ECHOPGM(" Average measured backlash (mm):"); + if (backlash.has_any_measurement()) { + LOOP_XYZ(a) if (axis_can_calibrate(a) && backlash.has_measurement(AxisEnum(a))) { + SERIAL_CHAR(' ', XYZ_CHAR(a)); + SERIAL_ECHO(backlash.get_measurement(AxisEnum(a))); + } + } + else + SERIAL_ECHOPGM(" (Not yet measured)"); + SERIAL_EOL(); + #endif + } +} + +#endif // BACKLASH_GCODE diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp new file mode 100644 index 00000000..8640dfa3 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -0,0 +1,276 @@ +/** + * 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(Z_MIN_PROBE_REPEATABILITY_TEST) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/probe.h" +#include "../../lcd/ultralcd.h" + +#include "../../feature/bedlevel/bedlevel.h" + +#if HAS_LEVELING + #include "../../module/planner.h" +#endif + +/** + * M48: Z probe repeatability measurement function. + * + * Usage: + * M48 + * P = Number of sampled points (4-50, default 10) + * X = Sample X position + * Y = Sample Y position + * V = Verbose level (0-4, default=1) + * E = Engage Z probe for each reading + * L = Number of legs of movement before probe + * S = Schizoid (Or Star if you prefer) + * + * This function requires the machine to be homed before invocation. + */ + +extern const char SP_Y_STR[]; + +void GcodeSuite::M48() { + + if (homing_needed_error()) return; + + const int8_t verbose_level = parser.byteval('V', 1); + if (!WITHIN(verbose_level, 0, 4)) { + SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4)."); + return; + } + + if (verbose_level > 0) + SERIAL_ECHOLNPGM("M48 Z-Probe Repeatability Test"); + + const int8_t n_samples = parser.byteval('P', 10); + if (!WITHIN(n_samples, 4, 50)) { + SERIAL_ECHOLNPGM("?Sample size not plausible (4-50)."); + return; + } + + const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; + + // 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(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("?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; + + if (verbose_level > 2) + SERIAL_ECHOLNPGM("Positioning the 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(); + + // 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(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_WIRED_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( + #if ENABLED(DELTA) + int(0.1250000000 * (DELTA_PRINTABLE_RADIUS)), + int(0.3333333333 * (DELTA_PRINTABLE_RADIUS)) + #else + 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) { + + // Move some distance around the perimeter + float delta_angle; + if (schizoid_flag) { + // 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 { + // Just move further along the perimeter. + delta_angle = dir * (float)random(25, 45); + } + angle += delta_angle; + + // Trig functions work without clamping, but just to be safe... + while (angle > 360.0) angle -= 360.0; + while (angle < 0.0) angle += 360.0; + + // 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 + float(cos(RADIANS(angle))) * radius, + noz_pos.y + float(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) + SERIAL_ECHOLNPAIR_P(PSTR("Going to: X"), next_pos.x, SP_Y_STR, next_pos.y); + + do_blocking_move_to_xy(next_pos); + } // n_legs loop + } // n_legs + + // Probe a single point + const float pz = probe.probe_at_point(test_position, raise_after, 0); + + // Break the loop if the probe fails + probing_good = !isnan(pz); + if (!probing_good) break; + + // 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 + } + + probe.stow(); + + if (probing_good) { + SERIAL_ECHOLNPGM("Finished!"); + dev_report(verbose_level > 0, mean, sigma, min, max, true); + + #if HAS_WIRED_LCD + // Display M48 results in the status bar + char sigma_str[8]; + ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str)); + #endif + } + + restore_feedrate_and_scaling(); + + // Re-enable bed level correction if it had been on + TERN_(HAS_LEVELING, set_bed_leveling_enabled(was_enabled)); + + report_current_position(); +} + +#endif // Z_MIN_PROBE_REPEATABILITY_TEST diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp new file mode 100644 index 00000000..557204cc --- /dev/null +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if IS_KINEMATIC + +#include "../gcode.h" +#include "../../module/motion.h" + +#if ENABLED(DELTA) + + #include "../../module/delta.h" + /** + * M665: Set delta configurations + * + * H = delta height + * L = diagonal rod + * R = delta radius + * S = segments per second + * X = Alpha (Tower 1) 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(); + if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); + if (parser.seen('R')) delta_radius = parser.value_linear_units(); + if (parser.seen('S')) delta_segments_per_second = parser.value_float(); + 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(); + } + +#elif IS_SCARA + + #include "../../module/scara.h" + + /** + * M665: Set SCARA settings + * + * Parameters: + * + * S[segments-per-second] - Segments-per-second + * P[theta-psi-offset] - Theta-Psi offset, added to the shoulder (A/X) angle + * T[theta-offset] - Theta offset, added to the elbow (B/Y) angle + * Z[z-offset] - Z offset, added to Z + * + * A, P, and X are all aliases for the shoulder angle + * B, T, and Y are all aliases for the elbow angle + */ + void GcodeSuite::M665() { + if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + + #if HAS_SCARA_OFFSET + + if (parser.seenval('Z')) scara_home_offset.z = parser.value_linear_units(); + + const bool hasA = parser.seenval('A'), hasP = parser.seenval('P'), hasX = parser.seenval('X'); + const uint8_t sumAPX = hasA + hasP + hasX; + if (sumAPX) { + if (sumAPX == 1) + scara_home_offset.a = parser.value_float(); + else { + SERIAL_ERROR_MSG("Only one of A, P, or X is allowed."); + return; + } + } + + const bool hasB = parser.seenval('B'), hasT = parser.seenval('T'), hasY = parser.seenval('Y'); + const uint8_t sumBTY = hasB + hasT + hasY; + if (sumBTY) { + if (sumBTY == 1) + scara_home_offset.b = parser.value_float(); + else { + SERIAL_ERROR_MSG("Only one of B, T, or Y is allowed."); + return; + } + } + + #endif // HAS_SCARA_OFFSET + } + +#endif + +#endif // IS_KINEMATIC diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp new file mode 100644 index 00000000..e915aa8f --- /dev/null +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -0,0 +1,105 @@ +/** + * 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(DELTA) || HAS_EXTRA_ENDSTOPS + +#include "../gcode.h" + +#if ENABLED(DELTA) + + #include "../../module/delta.h" + #include "../../module/motion.h" + + #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) + #include "../../core/debug_out.h" + + /** + * M666: Set delta endstop adjustment + */ + void GcodeSuite::M666() { + DEBUG_SECTION(log_M666, "M666", DEBUGGING(LEVELING)); + LOOP_XYZ(i) { + if (parser.seen(XYZ_CHAR(i))) { + const float v = parser.value_linear_units(); + if (v * Z_HOME_DIR <= 0) delta_endstop_adj[i] = v; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("delta_endstop_adj[", XYZ_CHAR(i), "] = ", delta_endstop_adj[i]); + } + } + } + +#elif HAS_EXTRA_ENDSTOPS + + #include "../../module/endstops.h" + + /** + * M666: Set Dual Endstops offsets for X, Y, and/or Z. + * With no parameters report current offsets. + * + * For Triple / Quad Z Endstops: + * Set Z2 Only: M666 S2 Z + * Set Z3 Only: M666 S3 Z + * Set Z4 Only: M666 S4 Z + * Set All: M666 Z + */ + void GcodeSuite::M666() { + #if ENABLED(X_DUAL_ENDSTOPS) + if (parser.seenval('X')) endstops.x2_endstop_adj = parser.value_linear_units(); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + if (parser.seenval('Y')) endstops.y2_endstop_adj = parser.value_linear_units(); + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) + if (parser.seenval('Z')) { + #if NUM_Z_STEPPER_DRIVERS >= 3 + const float z_adj = parser.value_linear_units(); + const int ind = parser.intval('S'); + if (!ind || ind == 2) endstops.z2_endstop_adj = z_adj; + if (!ind || ind == 3) endstops.z3_endstop_adj = z_adj; + #if NUM_Z_STEPPER_DRIVERS >= 4 + if (!ind || ind == 4) endstops.z4_endstop_adj = z_adj; + #endif + #else + endstops.z2_endstop_adj = parser.value_linear_units(); + #endif + } + #endif + if (!parser.seen("XYZ")) { + SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): "); + #if ENABLED(X_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR(" X2:", endstops.x2_endstop_adj); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + SERIAL_ECHOPAIR(" Y2:", endstops.y2_endstop_adj); + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) + #define _ECHO_ZADJ(N) SERIAL_ECHOPAIR(" Z" STRINGIFY(N) ":", endstops.z##N##_endstop_adj); + REPEAT_S(2, INCREMENT(NUM_Z_STEPPER_DRIVERS), _ECHO_ZADJ) + #endif + SERIAL_EOL(); + } + } + +#endif // HAS_EXTRA_ENDSTOPS + +#endif // DELTA || HAS_EXTRA_ENDSTOPS diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp new file mode 100644 index 00000000..b60f4174 --- /dev/null +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SKEW_CORRECTION_GCODE) + +#include "../gcode.h" +#include "../../module/planner.h" + +/** + * M852: Get or set the machine skew factors. Reports current values with no arguments. + * + * S[xy_factor] - Alias for 'I' + * I[xy_factor] - New XY skew factor + * J[xz_factor] - New XZ skew factor + * K[yz_factor] - New YZ skew factor + */ +void GcodeSuite::M852() { + uint8_t ijk = 0, badval = 0, setval = 0; + + if (parser.seen('I') || parser.seen('S')) { + ++ijk; + const float value = parser.value_linear_units(); + if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { + if (planner.skew_factor.xy != value) { + planner.skew_factor.xy = value; + ++setval; + } + } + else + ++badval; + } + + #if ENABLED(SKEW_CORRECTION_FOR_Z) + + if (parser.seen('J')) { + ++ijk; + const float value = parser.value_linear_units(); + if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { + if (planner.skew_factor.xz != value) { + planner.skew_factor.xz = value; + ++setval; + } + } + else + ++badval; + } + + if (parser.seen('K')) { + ++ijk; + const float value = parser.value_linear_units(); + if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) { + if (planner.skew_factor.yz != value) { + planner.skew_factor.yz = value; + ++setval; + } + } + else + ++badval; + } + + #endif + + if (badval) + SERIAL_ECHOLNPGM(STR_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " STR_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX)); + + // When skew is changed the current position changes + if (setval) { + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); + report_current_position(); + } + + if (!ijk) { + SERIAL_ECHO_START(); + serialprintPGM(GET_TEXT(MSG_SKEW_FACTOR)); + SERIAL_ECHOPAIR_F(" XY: ", planner.skew_factor.xy, 6); + #if ENABLED(SKEW_CORRECTION_FOR_Z) + SERIAL_ECHOPAIR_F(" XZ: ", planner.skew_factor.xz, 6); + SERIAL_ECHOPAIR_F(" YZ: ", planner.skew_factor.yz, 6); + #endif + SERIAL_EOL(); + } +} + +#endif // SKEW_CORRECTION_GCODE diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp new file mode 100644 index 00000000..cb17fc45 --- /dev/null +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -0,0 +1,191 @@ +/** + * 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 "../gcode.h" +#include "../../MarlinCore.h" +#include "../../module/planner.h" + +#if DISABLED(NO_VOLUMETRICS) + + /** + * M200: Set filament diameter and set E axis units to cubic units + * + * T - Optional extruder number. Current extruder if omitted. + * D - Set filament diameter and enable. D0 disables volumetric. + * S - Turn volumetric ON or OFF. + * L - Volumetric extruder limit (in mm^3/sec). L0 disables the limit. + */ + void GcodeSuite::M200() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + bool vol_enable = parser.volumetric_enabled, + can_enable = true; + + if (parser.seenval('D')) { + const float dval = parser.value_linear_units(); + if (dval) { // Set filament size for volumetric calculation + planner.set_filament_size(target_extruder, dval); + vol_enable = true; // Dn = enable for compatibility + } + else + can_enable = false; // D0 = disable for compatibility + } + + // Enable or disable with S1 / S0 + parser.volumetric_enabled = can_enable && parser.boolval('S', vol_enable); + + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + if (parser.seenval('L')) { + // Set volumetric limit (in mm^3/sec) + const float lval = parser.value_float(); + if (WITHIN(lval, 0, 20)) + planner.set_volumetric_extruder_limit(target_extruder, lval); + else + SERIAL_ECHOLNPGM("?L value out of range (0-20)."); + } + #endif + + planner.calculate_volumetric_multipliers(); + } + +#endif // !NO_VOLUMETRICS + +/** + * M201: Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000) + * + * With multiple extruders use T to specify which one. + */ +void GcodeSuite::M201() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + #ifdef XY_FREQUENCY_LIMIT + if (parser.seenval('F')) planner.set_frequency_limit(parser.value_byte()); + if (parser.seenval('G')) planner.xy_freq_min_speed_factor = constrain(parser.value_float(), 1, 100) / 100; + #endif + + LOOP_XYZE(i) { + if (parser.seen(axis_codes[i])) { + const uint8_t a = (i == E_AXIS ? uint8_t(E_AXIS_N(target_extruder)) : i); + planner.set_max_acceleration(a, parser.value_axis_units((AxisEnum)a)); + } + } +} + +/** + * M203: Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in units/sec + * + * With multiple extruders use T to specify which one. + */ +void GcodeSuite::M203() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + LOOP_XYZE(i) + if (parser.seen(axis_codes[i])) { + const uint8_t a = (i == E_AXIS ? uint8_t(E_AXIS_N(target_extruder)) : i); + planner.set_max_feedrate(a, parser.value_axis_units((AxisEnum)a)); + } +} + +/** + * M204: Set Accelerations in units/sec^2 (M204 P1200 R3000 T3000) + * + * P = Printing moves + * R = Retract only (no X, Y, Z) moves + * T = Travel (non printing) moves + */ +void GcodeSuite::M204() { + if (!parser.seen("PRST")) { + SERIAL_ECHOPAIR("Acceleration: P", planner.settings.acceleration); + SERIAL_ECHOPAIR(" R", planner.settings.retract_acceleration); + SERIAL_ECHOLNPAIR_P(SP_T_STR, planner.settings.travel_acceleration); + } + else { + //planner.synchronize(); + // 'S' for legacy compatibility. Should NOT BE USED for new development + if (parser.seenval('S')) planner.settings.travel_acceleration = planner.settings.acceleration = parser.value_linear_units(); + if (parser.seenval('P')) planner.settings.acceleration = parser.value_linear_units(); + if (parser.seenval('R')) planner.settings.retract_acceleration = parser.value_linear_units(); + if (parser.seenval('T')) planner.settings.travel_acceleration = parser.value_linear_units(); + } +} + +/** + * M205: Set Advanced Settings + * + * B = Min Segment Time (µs) + * S = Min Feed Rate (units/s) + * T = Min Travel Feed Rate (units/s) + * X = Max X Jerk (units/sec^2) + * Y = Max Y Jerk (units/sec^2) + * Z = Max Z Jerk (units/sec^2) + * E = Max E Jerk (units/sec^2) + * J = Junction Deviation (mm) (If not using CLASSIC_JERK) + */ +void GcodeSuite::M205() { + #if HAS_JUNCTION_DEVIATION + #define J_PARAM "J" + #else + #define J_PARAM + #endif + #if HAS_CLASSIC_JERK + #define XYZE_PARAM "XYZE" + #else + #define XYZE_PARAM + #endif + if (!parser.seen("BST" J_PARAM XYZE_PARAM)) return; + + //planner.synchronize(); + if (parser.seen('B')) planner.settings.min_segment_time_us = parser.value_ulong(); + if (parser.seen('S')) planner.settings.min_feedrate_mm_s = parser.value_linear_units(); + if (parser.seen('T')) planner.settings.min_travel_feedrate_mm_s = parser.value_linear_units(); + #if HAS_JUNCTION_DEVIATION + if (parser.seen('J')) { + const float junc_dev = parser.value_linear_units(); + if (WITHIN(junc_dev, 0.01f, 0.3f)) { + planner.junction_deviation_mm = junc_dev; + TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); + } + else + SERIAL_ERROR_MSG("?J out of range (0.01 to 0.3)"); + } + #endif + #if HAS_CLASSIC_JERK + if (parser.seen('X')) planner.set_max_jerk(X_AXIS, parser.value_linear_units()); + if (parser.seen('Y')) planner.set_max_jerk(Y_AXIS, parser.value_linear_units()); + if (parser.seen('Z')) { + planner.set_max_jerk(Z_AXIS, parser.value_linear_units()); + #if HAS_MESH && DISABLED(LIMITED_JERK_EDITING) + if (planner.max_jerk.z <= 0.1f) + SERIAL_ECHOLNPGM("WARNING! Low Z Jerk may lead to unwanted pauses."); + #endif + } + #if HAS_CLASSIC_E_JERK + if (parser.seen('E')) planner.set_max_jerk(E_AXIS, parser.value_linear_units()); + #endif + #endif +} diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp new file mode 100644 index 00000000..b57dec31 --- /dev/null +++ b/Marlin/src/gcode/config/M217.cpp @@ -0,0 +1,173 @@ +/** + * 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_MULTI_EXTRUDER + +#include "../gcode.h" +#include "../../module/tool_change.h" + +#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + #include "../../module/motion.h" +#endif + +#include "../../MarlinCore.h" // for SP_X_STR, etc. + +extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; + +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)); + 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), + " F", toolchange_settings.fan_speed, + " G", toolchange_settings.fan_time); + + #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + SERIAL_ECHOPAIR(" A", int(migration.automode)); + SERIAL_ECHOPAIR(" L", LINEAR_UNIT(migration.last)); + #endif + + #if ENABLED(TOOLCHANGE_PARK) + SERIAL_ECHOPAIR(" W", LINEAR_UNIT(toolchange_settings.enable_park)); + SERIAL_ECHOPAIR_P(SP_X_STR, LINEAR_UNIT(toolchange_settings.change_point.x)); + SERIAL_ECHOPAIR_P(SP_Y_STR, LINEAR_UNIT(toolchange_settings.change_point.y)); + #endif + + #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) + SERIAL_ECHOPAIR(" V", LINEAR_UNIT(enable_first_prime)); + #endif + + #else + + UNUSED(eeprom); + + #endif + + SERIAL_ECHOPAIR_P(SP_Z_STR, LINEAR_UNIT(toolchange_settings.z_raise)); + SERIAL_EOL(); +} + +/** + * M217 - Set SINGLENOZZLE toolchange parameters + * + * // Tool change command + * Q Prime active tool and exit + * + * // Tool change settings + * S[linear] Swap length + * B[linear] Extra Swap length + * E[linear] Prime length + * P[linear/m] Prime speed + * R[linear/m] Retract speed + * U[linear/m] UnRetract speed + * V[linear] 0/1 Enable auto prime first extruder used + * W[linear] 0/1 Enable park & Z Raise + * X[linear] Park X (Requires TOOLCHANGE_PARK) + * Y[linear] Park Y (Requires TOOLCHANGE_PARK) + * Z[linear] Z Raise + * F[linear] Fan Speed 0-255 + * G[linear/s] Fan time + * + * Tool migration settings + * A[0|1] Enable auto-migration on runout + * L[index] Last extruder to use for auto-migration + * + * Tool migration command + * T[index] Migrate to next extruder or the given extruder + */ +void GcodeSuite::M217() { + + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + + static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500); + + if (parser.seen('Q')) { tool_change_prime(); return; } + + if (parser.seenval('S')) { const float v = parser.value_linear_units(); toolchange_settings.swap_length = constrain(v, 0, max_extrude); } + if (parser.seenval('B')) { const float v = parser.value_linear_units(); toolchange_settings.extra_resume = constrain(v, -10, 10); } + if (parser.seenval('E')) { const float v = parser.value_linear_units(); toolchange_settings.extra_prime = constrain(v, 0, max_extrude); } + if (parser.seenval('P')) { const int16_t v = parser.value_linear_units(); toolchange_settings.prime_speed = constrain(v, 10, 5400); } + if (parser.seenval('R')) { const int16_t v = parser.value_linear_units(); toolchange_settings.retract_speed = constrain(v, 10, 5400); } + if (parser.seenval('U')) { const int16_t v = parser.value_linear_units(); toolchange_settings.unretract_speed = constrain(v, 10, 5400); } + #if TOOLCHANGE_FS_FAN >= 0 && HAS_FAN + if (parser.seenval('F')) { const int16_t v = parser.value_linear_units(); toolchange_settings.fan_speed = constrain(v, 0, 255); } + if (parser.seenval('G')) { const int16_t v = parser.value_linear_units(); toolchange_settings.fan_time = constrain(v, 1, 30); } + #endif + #endif + + #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) + if (parser.seenval('V')) { enable_first_prime = parser.value_linear_units(); } + #endif + + #if ENABLED(TOOLCHANGE_PARK) + if (parser.seenval('W')) { toolchange_settings.enable_park = parser.value_linear_units(); } + if (parser.seenval('X')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.x = constrain(v, X_MIN_POS, X_MAX_POS); } + if (parser.seenval('Y')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.y = constrain(v, Y_MIN_POS, Y_MAX_POS); } + #endif + + if (parser.seenval('Z')) { toolchange_settings.z_raise = parser.value_linear_units(); } + + #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + migration.target = 0; // 0 = disabled + + if (parser.seenval('L')) { // Last + const int16_t lval = parser.value_int(); + if (WITHIN(lval, 0, EXTRUDERS - 1)) { + migration.last = lval; + migration.automode = (active_extruder < migration.last); + } + } + + if (parser.seen('A')) // Auto on/off + migration.automode = parser.value_bool(); + + if (parser.seen('T')) { // Migrate now + if (parser.has_value()) { + const int16_t tval = parser.value_int(); + if (WITHIN(tval, 0, EXTRUDERS - 1) && tval != active_extruder) { + migration.target = tval + 1; + extruder_migration(); + migration.target = 0; // disable + return; + } + else + migration.target = 0; // disable + } + else { + extruder_migration(); + return; + } + } + + #endif + + M217_report(); +} + +#endif // HAS_MULTI_EXTRUDER diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp new file mode 100644 index 00000000..7701320e --- /dev/null +++ b/Marlin/src/gcode/config/M218.cpp @@ -0,0 +1,71 @@ +/** + * 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_HOTEND_OFFSET + +#include "../gcode.h" +#include "../../module/motion.h" + +#if ENABLED(DELTA) + #include "../../module/planner.h" +#endif + +/** + * M218 - set hotend offset (in linear units) + * + * T + * X + * Y + * Z + */ +void GcodeSuite::M218() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + if (parser.seenval('X')) hotend_offset[target_extruder].x = parser.value_linear_units(); + if (parser.seenval('Y')) hotend_offset[target_extruder].y = parser.value_linear_units(); + if (parser.seenval('Z')) hotend_offset[target_extruder].z = parser.value_linear_units(); + + if (!parser.seen("XYZ")) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(STR_HOTEND_OFFSET); + HOTEND_LOOP() { + SERIAL_CHAR(' '); + SERIAL_ECHO(hotend_offset[e].x); + SERIAL_CHAR(','); + SERIAL_ECHO(hotend_offset[e].y); + SERIAL_CHAR(','); + SERIAL_ECHO_F(hotend_offset[e].z, 3); + } + SERIAL_EOL(); + } + + #if ENABLED(DELTA) + if (target_extruder == active_extruder) + do_blocking_move_to_xy(current_position, planner.settings.max_feedrate_mm_s[X_AXIS]); + #endif +} + +#endif // HAS_HOTEND_OFFSET diff --git a/Marlin/src/gcode/config/M220.cpp b/Marlin/src/gcode/config/M220.cpp new file mode 100644 index 00000000..1bec6a77 --- /dev/null +++ b/Marlin/src/gcode/config/M220.cpp @@ -0,0 +1,53 @@ +/** + * 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 "../gcode.h" +#include "../../module/motion.h" + +/** + * M220: Set speed percentage factor, aka "Feed Rate" + * + * Parameters + * S : Set the feed rate percentage factor + * + * Report the current speed percentage factor if no parameter is specified + * + * With PRUSA_MMU2... + * B : Flag to back up the current factor + * R : Flag to restore the last-saved factor + */ +void GcodeSuite::M220() { + + #if ENABLED(PRUSA_MMU2) + static int16_t backup_feedrate_percentage = 100; + if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage; + if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage; + #endif + + if (parser.seenval('S')) feedrate_percentage = parser.value_int(); + + if (!parser.seen_any()) { + SERIAL_ECHOPAIR("FR:", feedrate_percentage); + SERIAL_CHAR('%'); + SERIAL_EOL(); + } +} diff --git a/Marlin/src/gcode/config/M221.cpp b/Marlin/src/gcode/config/M221.cpp new file mode 100644 index 00000000..7ba22d19 --- /dev/null +++ b/Marlin/src/gcode/config/M221.cpp @@ -0,0 +1,47 @@ +/** + * 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 "../gcode.h" +#include "../../module/planner.h" + +#if EXTRUDERS + +/** + * M221: Set extrusion percentage (M221 T0 S95) + */ +void GcodeSuite::M221() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + if (parser.seenval('S')) + planner.set_flow(target_extruder, parser.value_int()); + else { + SERIAL_ECHO_START(); + SERIAL_CHAR('E', '0' + target_extruder); + SERIAL_ECHOPAIR(" Flow: ", planner.flow_percentage[target_extruder]); + SERIAL_CHAR('%'); + SERIAL_EOL(); + } +} + +#endif // EXTRUDERS diff --git a/Marlin/src/gcode/config/M281.cpp b/Marlin/src/gcode/config/M281.cpp new file mode 100644 index 00000000..018ca1c0 --- /dev/null +++ b/Marlin/src/gcode/config/M281.cpp @@ -0,0 +1,68 @@ +/** + * 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(EDITABLE_SERVO_ANGLES) + +#include "../gcode.h" +#include "../../module/servo.h" + +/** + * M281 - Edit / Report Servo Angles + * + * P - Servo to update + * L - Deploy Angle + * U - Stowed Angle + */ +void GcodeSuite::M281() { + if (!parser.seenval('P')) return; + const int servo_index = parser.value_int(); + if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { + #if ENABLED(BLTOUCH) + if (servo_index == Z_PROBE_SERVO_NR) { + SERIAL_ERROR_MSG("BLTouch angles can't be changed."); + return; + } + #endif + bool angle_change = false; + if (parser.seen('L')) { + servo_angles[servo_index][0] = parser.value_int(); + angle_change = true; + } + if (parser.seen('U')) { + servo_angles[servo_index][1] = parser.value_int(); + angle_change = true; + } + if (!angle_change) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(" Servo ", servo_index, + " L", servo_angles[servo_index][0], + " U", servo_angles[servo_index][1]); + } + } + else { + SERIAL_ERROR_START(); + SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range"); + } +} + +#endif // EDITABLE_SERVO_ANGLES diff --git a/Marlin/src/gcode/config/M301.cpp b/Marlin/src/gcode/config/M301.cpp new file mode 100644 index 00000000..7b3f5760 --- /dev/null +++ b/Marlin/src/gcode/config/M301.cpp @@ -0,0 +1,91 @@ +/** + * 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(PIDTEMP) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * 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) + * + * With PID_EXTRUSION_SCALING: + * + * C[float] Kc term + * L[int] LPQ length + * + * With PID_FAN_SCALING: + * + * F[float] Kf term + */ +void GcodeSuite::M301() { + + // multi-extruder PID patch: M301 updates or prints a single extruder's PID values + // default behavior (omitting E parameter) is to update for extruder 0 only + const uint8_t e = parser.byteval('E'); // extruder being updated + + if (e < HOTENDS) { // catch bad input value + if (parser.seen('P')) PID_PARAM(Kp, e) = parser.value_float(); + if (parser.seen('I')) PID_PARAM(Ki, e) = scalePID_i(parser.value_float()); + if (parser.seen('D')) PID_PARAM(Kd, e) = scalePID_d(parser.value_float()); + #if ENABLED(PID_EXTRUSION_SCALING) + if (parser.seen('C')) PID_PARAM(Kc, e) = parser.value_float(); + if (parser.seenval('L')) thermalManager.lpq_len = parser.value_int(); + NOMORE(thermalManager.lpq_len, LPQ_MAX_LEN); + NOLESS(thermalManager.lpq_len, 0); + #endif + + #if ENABLED(PID_FAN_SCALING) + if (parser.seen('F')) PID_PARAM(Kf, e) = parser.value_float(); + #endif + + thermalManager.updatePID(); + + SERIAL_ECHO_START(); + #if ENABLED(PID_PARAMS_PER_HOTEND) + SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output + #endif + SERIAL_ECHOPAIR(" p:", PID_PARAM(Kp, e), + " i:", unscalePID_i(PID_PARAM(Ki, e)), + " d:", unscalePID_d(PID_PARAM(Kd, e))); + #if ENABLED(PID_EXTRUSION_SCALING) + SERIAL_ECHOPAIR(" c:", PID_PARAM(Kc, e)); + #endif + #if ENABLED(PID_FAN_SCALING) + SERIAL_ECHOPAIR(" f:", PID_PARAM(Kf, e)); + #endif + + SERIAL_EOL(); + } + else + SERIAL_ERROR_MSG(STR_INVALID_EXTRUDER); +} + +#endif // PIDTEMP diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp new file mode 100644 index 00000000..afdc6c9e --- /dev/null +++ b/Marlin/src/gcode/config/M302.cpp @@ -0,0 +1,63 @@ +/** + * 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(PREVENT_COLD_EXTRUSION) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M302: Allow cold extrudes, or set the minimum extrude temperature + * + * S sets the minimum extrude temperature + * P enables (1) or disables (0) cold extrusion + * + * Examples: + * + * M302 ; report current cold extrusion state + * M302 P0 ; enable cold extrusion checking + * M302 P1 ; disable cold extrusion checking + * M302 S0 ; always allow extrusion (disables checking) + * M302 S170 ; only allow extrusion above 170 + * M302 S170 P1 ; set min extrude temp to 170 but leave disabled + */ +void GcodeSuite::M302() { + const bool seen_S = parser.seen('S'); + if (seen_S) { + thermalManager.extrude_min_temp = parser.value_celsius(); + thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0); + } + + if (parser.seen('P')) + thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0) || parser.value_bool(); + else if (!seen_S) { + // Report current state + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Cold extrudes are "); + serialprintPGM(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOLNPAIR("abled (min temp ", thermalManager.extrude_min_temp, "C)"); + } +} + +#endif // PREVENT_COLD_EXTRUSION diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp new file mode 100644 index 00000000..10739be3 --- /dev/null +++ b/Marlin/src/gcode/config/M304.cpp @@ -0,0 +1,48 @@ +/** + * 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(PIDTEMPBED) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M304 - Set and/or Report the current Bed PID values + * + * P - Set the P value + * I - Set the I value + * D - Set the D value + */ +void GcodeSuite::M304() { + if (parser.seen('P')) thermalManager.temp_bed.pid.Kp = parser.value_float(); + if (parser.seen('I')) thermalManager.temp_bed.pid.Ki = scalePID_i(parser.value_float()); + if (parser.seen('D')) thermalManager.temp_bed.pid.Kd = scalePID_d(parser.value_float()); + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(" p:", thermalManager.temp_bed.pid.Kp, + " i:", unscalePID_i(thermalManager.temp_bed.pid.Ki), + " d:", unscalePID_d(thermalManager.temp_bed.pid.Kd)); +} + +#endif // PIDTEMPBED diff --git a/Marlin/src/gcode/config/M305.cpp b/Marlin/src/gcode/config/M305.cpp new file mode 100644 index 00000000..3e7206ae --- /dev/null +++ b/Marlin/src/gcode/config/M305.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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_USER_THERMISTORS + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M305: Set (or report) custom thermistor parameters + * + * P[index] Thermistor table index + * R[ohms] Pullup resistor value + * T[ohms] Resistance at 25C + * B[beta] Thermistor "beta" value + * C[coeff] Steinhart-Hart Coefficient 'C' + * + * Format: M305 P[tbl_index] R[pullup_resistor_val] T[therm_25C_resistance] B[therm_beta] C[Steinhart_Hart_C_coeff] + * + * Examples: M305 P0 R4700 T100000 B3950 C0.0 + * M305 P0 R4700 + * M305 P0 T100000 + * M305 P0 B3950 + * M305 P0 C0.0 + */ +void GcodeSuite::M305() { + const int8_t t_index = parser.intval('P', -1); + const bool do_set = parser.seen("BCRT"); + + // A valid P index is required + if (t_index >= (USER_THERMISTORS) || (do_set && t_index < 0)) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("!Invalid index. (0 <= P <= ", int(USER_THERMISTORS - 1), ")"); + } + else if (do_set) { + if (parser.seen('R')) // Pullup resistor value + if (!thermalManager.set_pull_up_res(t_index, parser.value_float())) + SERIAL_ECHO_MSG("!Invalid series resistance. (0 < R < 1000000)"); + + if (parser.seen('T')) // Resistance at 25C + if (!thermalManager.set_res25(t_index, parser.value_float())) + SERIAL_ECHO_MSG("!Invalid 25C resistance. (0 < T < 10000000)"); + + if (parser.seen('B')) // Beta value + if (!thermalManager.set_beta(t_index, parser.value_float())) + SERIAL_ECHO_MSG("!Invalid beta. (0 < B < 1000000)"); + + if (parser.seen('C')) // Steinhart-Hart C coefficient + if (!thermalManager.set_sh_coeff(t_index, parser.value_float())) + SERIAL_ECHO_MSG("!Invalid Steinhart-Hart C coeff. (-0.01 < C < +0.01)"); + } // If not setting then report parameters + else if (t_index < 0) { // ...all user thermistors + LOOP_L_N(i, USER_THERMISTORS) + thermalManager.log_user_thermistor(i); + } + else // ...one user thermistor + thermalManager.log_user_thermistor(t_index); +} + +#endif // HAS_USER_THERMISTORS diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp new file mode 100644 index 00000000..1e780ca0 --- /dev/null +++ b/Marlin/src/gcode/config/M43.cpp @@ -0,0 +1,386 @@ +/** + * 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(PINS_DEBUGGING) + +#include "../gcode.h" +#include "../../MarlinCore.h" // for pin_is_protected +#include "../../pins/pinsDebug.h" +#include "../../module/endstops.h" + +#if HAS_Z_SERVO_PROBE + #include "../../module/probe.h" + #include "../../module/servo.h" +#endif + +#if ENABLED(BLTOUCH) + #include "../../feature/bltouch.h" +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../../feature/host_actions.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +#if HAS_RESUME_CONTINUE + #include "../../lcd/ultralcd.h" +#endif + +#ifndef GET_PIN_MAP_PIN_M43 + #define GET_PIN_MAP_PIN_M43(Q) GET_PIN_MAP_PIN(Q) +#endif + +inline void toggle_pins() { + const bool ignore_protection = parser.boolval('I'); + const int repeat = parser.intval('R', 1), + start = PARSED_PIN_INDEX('S', 0), + end = PARSED_PIN_INDEX('L', NUM_DIGITAL_PINS - 1), + wait = parser.intval('W', 500); + + LOOP_S_LE_N(i, start, end) { + pin_t pin = GET_PIN_MAP_PIN_M43(i); + if (!VALID_PIN(pin)) continue; + if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) { + report_pin_state_extended(pin, ignore_protection, true, PSTR("Untouched ")); + SERIAL_EOL(); + } + else { + watchdog_refresh(); + report_pin_state_extended(pin, ignore_protection, true, PSTR("Pulsing ")); + #ifdef __STM32F1__ + const auto prior_mode = _GET_MODE(i); + #else + const bool prior_mode = GET_PINMODE(pin); + #endif + #if AVR_AT90USB1286_FAMILY // Teensy IDEs don't know about these pins so must use FASTIO + if (pin == TEENSY_E2) { + SET_OUTPUT(TEENSY_E2); + for (int16_t j = 0; j < repeat; j++) { + WRITE(TEENSY_E2, LOW); safe_delay(wait); + WRITE(TEENSY_E2, HIGH); safe_delay(wait); + WRITE(TEENSY_E2, LOW); safe_delay(wait); + } + } + else if (pin == TEENSY_E3) { + SET_OUTPUT(TEENSY_E3); + for (int16_t j = 0; j < repeat; j++) { + WRITE(TEENSY_E3, LOW); safe_delay(wait); + WRITE(TEENSY_E3, HIGH); safe_delay(wait); + WRITE(TEENSY_E3, LOW); safe_delay(wait); + } + } + else + #endif + { + pinMode(pin, OUTPUT); + for (int16_t j = 0; j < repeat; j++) { + watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); + watchdog_refresh(); extDigitalWrite(pin, 1); safe_delay(wait); + watchdog_refresh(); extDigitalWrite(pin, 0); safe_delay(wait); + watchdog_refresh(); + } + } + #ifdef __STM32F1__ + _SET_MODE(i, prior_mode); + #else + pinMode(pin, prior_mode); + #endif + } + SERIAL_EOL(); + } + SERIAL_ECHOLNPGM("Done."); + +} // toggle_pins + +inline void servo_probe_test() { + + #if !(NUM_SERVOS > 0 && HAS_SERVO_0) + + SERIAL_ERROR_MSG("SERVO not set up."); + + #elif !HAS_Z_SERVO_PROBE + + SERIAL_ERROR_MSG("Z_PROBE_SERVO_NR not set up."); + + #else // HAS_Z_SERVO_PROBE + + const uint8_t probe_index = parser.byteval('P', Z_PROBE_SERVO_NR); + + SERIAL_ECHOLNPAIR("Servo probe test\n" + ". using index: ", int(probe_index), + ", deploy angle: ", servo_angles[probe_index][0], + ", stow angle: ", servo_angles[probe_index][1] + ); + + bool deploy_state = false, stow_state; + + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + + #define PROBE_TEST_PIN Z_MIN_PIN + constexpr bool probe_inverting = Z_MIN_ENDSTOP_INVERTING; + + SERIAL_ECHOLNPAIR(". Probe Z_MIN_PIN: ", int(PROBE_TEST_PIN)); + SERIAL_ECHOPGM(". Z_MIN_ENDSTOP_INVERTING: "); + + #else + + #define PROBE_TEST_PIN Z_MIN_PROBE_PIN + constexpr bool probe_inverting = Z_MIN_PROBE_ENDSTOP_INVERTING; + + SERIAL_ECHOLNPAIR(". Probe Z_MIN_PROBE_PIN: ", int(PROBE_TEST_PIN)); + SERIAL_ECHOPGM( ". Z_MIN_PROBE_ENDSTOP_INVERTING: "); + + #endif + + serialprint_truefalse(probe_inverting); + SERIAL_EOL(); + + SET_INPUT_PULLUP(PROBE_TEST_PIN); + + // First, check for a probe that recognizes an advanced BLTouch sequence. + // In addition to STOW and DEPLOY, it uses SW MODE (and RESET in the beginning) + // to see if this is one of the following: BLTOUCH Classic 1.2, 1.3, or + // BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1. But only if the user has actually + // configured a BLTouch as being present. If the user has not configured this, + // the BLTouch will be detected in the last phase of these tests (see further on). + bool blt = false; + // This code will try to detect a BLTouch probe or clone + #if ENABLED(BLTOUCH) + SERIAL_ECHOLNPGM(". Check for BLTOUCH"); + bltouch._reset(); + bltouch._stow(); + if (probe_inverting == READ(PROBE_TEST_PIN)) { + bltouch._set_SW_mode(); + if (probe_inverting != READ(PROBE_TEST_PIN)) { + bltouch._deploy(); + if (probe_inverting == READ(PROBE_TEST_PIN)) { + bltouch._stow(); + SERIAL_ECHOLNPGM("= BLTouch Classic 1.2, 1.3, Smart 1.0, 2.0, 2.2, 3.0, 3.1 detected."); + // Check for a 3.1 by letting the user trigger it, later + blt = true; + } + } + } + #endif + + // The following code is common to all kinds of servo probes. + // Since it could be a real servo or a BLTouch (any kind) or a clone, + // use only "common" functions - i.e. SERVO_MOVE. No bltouch.xxxx stuff. + + // If it is already recognised as a being a BLTouch, no need for this test + if (!blt) { + // DEPLOY and STOW 4 times and see if the signal follows + // Then it is a mechanical switch + uint8_t i = 0; + SERIAL_ECHOLNPGM(". Deploy & stow 4 times"); + do { + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy + safe_delay(500); + deploy_state = READ(PROBE_TEST_PIN); + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow + safe_delay(500); + stow_state = READ(PROBE_TEST_PIN); + } while (++i < 4); + + if (probe_inverting != deploy_state) SERIAL_ECHOLNPGM("WARNING: INVERTING setting probably backwards."); + + if (deploy_state != stow_state) { + SERIAL_ECHOLNPGM("= Mechanical Switch detected"); + if (deploy_state) { + SERIAL_ECHOLNPAIR(" DEPLOYED state: HIGH (logic 1)", + " STOWED (triggered) state: LOW (logic 0)"); + } + else { + SERIAL_ECHOLNPAIR(" DEPLOYED state: LOW (logic 0)", + " STOWED (triggered) state: HIGH (logic 1)"); + } + #if ENABLED(BLTOUCH) + SERIAL_ECHOLNPGM("FAIL: BLTOUCH enabled - Set up this device as a Servo Probe with INVERTING set to 'true'."); + #endif + return; + } + } + + // Ask the user for a trigger event and measure the pulse width. + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy + safe_delay(500); + SERIAL_ECHOLNPGM("** Please trigger probe within 30 sec **"); + uint16_t probe_counter = 0; + + // Wait 30 seconds for user to trigger probe + for (uint16_t j = 0; j < 500 * 30 && probe_counter == 0 ; j++) { + safe_delay(2); + + if (0 == j % (500 * 1)) gcode.reset_stepper_timeout(); // Keep steppers powered + + if (deploy_state != READ(PROBE_TEST_PIN)) { // probe triggered + for (probe_counter = 0; probe_counter < 15 && deploy_state != READ(PROBE_TEST_PIN); ++probe_counter) safe_delay(2); + + SERIAL_ECHOPGM(". Pulse width"); + if (probe_counter == 15) + SERIAL_ECHOLNPGM(": 30ms or more"); + else + SERIAL_ECHOLNPAIR(" (+/- 4ms): ", probe_counter * 2); + + if (probe_counter >= 4) { + if (probe_counter == 15) { + if (blt) SERIAL_ECHOPGM("= BLTouch V3.1"); + else SERIAL_ECHOPGM("= Z Servo Probe"); + } + else SERIAL_ECHOPGM("= BLTouch pre V3.1 (or compatible)"); + SERIAL_ECHOLNPGM(" detected."); + } + else SERIAL_ECHOLNPGM("FAIL: Noise detected - please re-run test"); + + MOVE_SERVO(probe_index, servo_angles[Z_PROBE_SERVO_NR][1]); // Stow + return; + } + } + + if (!probe_counter) SERIAL_ECHOLNPGM("FAIL: No trigger detected"); + + #endif // HAS_Z_SERVO_PROBE + +} // servo_probe_test + +/** + * M43: Pin debug - report pin state, watch pins, toggle pins and servo probe test/report + * + * M43 - report name and state of pin(s) + * P Pin to read or watch. If omitted, reads all pins. + * I Flag to ignore Marlin's pin protection. + * + * M43 W - Watch pins -reporting changes- until reset, click, or M108. + * P Pin to read or watch. If omitted, read/watch all pins. + * I Flag to ignore Marlin's pin protection. + * + * M43 E - Enable / disable background endstop monitoring + * - Machine continues to operate + * - Reports changes to endstops + * - Toggles LED_PIN when an endstop changes + * - Cannot reliably catch the 5mS pulse from BLTouch type probes + * + * M43 T - Toggle pin(s) and report which pin is being toggled + * S - Start Pin number. If not given, will default to 0 + * L - End Pin number. If not given, will default to last pin defined for this board + * I - Flag to ignore Marlin's pin protection. Use with caution!!!! + * R - Repeat pulses on each pin this number of times before continueing to next pin + * W - Wait time (in miliseconds) between pulses. If not given will default to 500 + * + * M43 S - Servo probe test + * P - Probe index (optional - defaults to 0 + */ +void GcodeSuite::M43() { + + // 'T' must be first. It uses 'S' and 'E' differently. + if (parser.seen('T')) return toggle_pins(); + + // 'E' Enable or disable endstop monitoring and return + if (parser.seen('E')) { + endstops.monitor_flag = parser.value_bool(); + SERIAL_ECHOPGM("endstop monitor "); + serialprintPGM(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOLNPGM("abled"); + return; + } + + // 'S' Run servo probe test and return + if (parser.seen('S')) return servo_probe_test(); + + // 'P' Get the range of pins to test or watch + uint8_t first_pin = PARSED_PIN_INDEX('P', 0), + last_pin = parser.seenval('P') ? first_pin : NUMBER_PINS_TOTAL - 1; + + if (first_pin > last_pin) return; + + // 'I' to ignore protected pins + const bool ignore_protection = parser.boolval('I'); + + // 'W' Watch until click, M108, or reset + if (parser.boolval('W')) { + SERIAL_ECHOLNPGM("Watching pins"); + #ifdef ARDUINO_ARCH_SAM + NOLESS(first_pin, 2); // Don't hijack the UART pins + #endif + uint8_t pin_state[last_pin - first_pin + 1]; + LOOP_S_LE_N(i, first_pin, last_pin) { + pin_t pin = GET_PIN_MAP_PIN_M43(i); + if (!VALID_PIN(pin)) continue; + if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; + pinMode(pin, INPUT_PULLUP); + delay(1); + /* + if (IS_ANALOG(pin)) + pin_state[pin - first_pin] = analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)); // int16_t pin_state[...] + else + //*/ + pin_state[i - first_pin] = extDigitalRead(pin); + } + + #if HAS_RESUME_CONTINUE + KEEPALIVE_STATE(PAUSED_FOR_USER); + wait_for_user = true; + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("M43 Wait Called"), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("M43 Wait Called"))); + #endif + + for (;;) { + LOOP_S_LE_N(i, first_pin, last_pin) { + pin_t pin = GET_PIN_MAP_PIN_M43(i); + if (!VALID_PIN(pin)) continue; + if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; + const byte val = + /* + IS_ANALOG(pin) + ? analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin)) : // int16_t val + : + //*/ + extDigitalRead(pin); + if (val != pin_state[i - first_pin]) { + report_pin_state_extended(pin, ignore_protection, false); + pin_state[i - first_pin] = val; + } + } + + #if HAS_RESUME_CONTINUE + ui.update(); + if (!wait_for_user) break; + #endif + + safe_delay(200); + } + } + else { + // Report current state of selected pin(s) + LOOP_S_LE_N(i, first_pin, last_pin) { + pin_t pin = GET_PIN_MAP_PIN_M43(i); + if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); + } + } +} + +#endif // PINS_DEBUGGING diff --git a/Marlin/src/gcode/config/M540.cpp b/Marlin/src/gcode/config/M540.cpp new file mode 100644 index 00000000..54d52f3a --- /dev/null +++ b/Marlin/src/gcode/config/M540.cpp @@ -0,0 +1,40 @@ +/** + * 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(SD_ABORT_ON_ENDSTOP_HIT) + +#include "../gcode.h" +#include "../../module/stepper.h" + +/** + * M540: Set whether SD card print should abort on endstop hit (M540 S<0|1>) + */ +void GcodeSuite::M540() { + + if (parser.seen('S')) + planner.abort_on_endstop_hit = parser.value_bool(); + +} + +#endif // SD_ABORT_ON_ENDSTOP_HIT diff --git a/Marlin/src/gcode/config/M575.cpp b/Marlin/src/gcode/config/M575.cpp new file mode 100644 index 00000000..44723b7f --- /dev/null +++ b/Marlin/src/gcode/config/M575.cpp @@ -0,0 +1,75 @@ +/** + * 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(BAUD_RATE_GCODE) + +#include "../gcode.h" + +/** + * M575 - Change serial baud rate + * + * P - Serial port index. Omit for all. + * B - Baud rate (bits per second) + */ +void GcodeSuite::M575() { + 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: { + const int8_t port = parser.intval('P', -99); + const bool set0 = (port == -99 || port == 0); + if (set0) SERIAL_ECHO_MSG(" Serial ", '0', " baud rate set to ", baud); + #if HAS_MULTI_SERIAL + const bool set1 = (port == -99 || port == 1); + if (set1) SERIAL_ECHO_MSG(" Serial ", '1', " baud rate set to ", baud); + #endif + + SERIAL_FLUSH(); + + if (set0) { MYSERIAL0.end(); MYSERIAL0.begin(baud); } + + #if HAS_MULTI_SERIAL + if (set1) { MYSERIAL1.end(); MYSERIAL1.begin(baud); } + #endif + + } break; + default: SERIAL_ECHO_MSG("?(B)aud rate implausible."); + } +} + +#endif // BAUD_RATE_GCODE diff --git a/Marlin/src/gcode/config/M672.cpp b/Marlin/src/gcode/config/M672.cpp new file mode 100644 index 00000000..af742305 --- /dev/null +++ b/Marlin/src/gcode/config/M672.cpp @@ -0,0 +1,98 @@ +/** + * 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(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + +#include "../gcode.h" +#include "../../HAL/shared/Delay.h" +#include "../parser.h" + +/** + * 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 + * + * To set custom sensitivity: + * Duet: M672 S105:aaa:bbb + * Marlin: M672 Saaa + * + * (where aaa is the desired sensitivity and bbb is 255 - aaa). + * + * Revert sensitivity to factory settings: + * Duet: M672 S105:131:131 + * Marlin: M672 R + */ + +#define M672_PROGBYTE 105 // magic byte to start programming custom sensitivity +#define M672_ERASEBYTE 131 // magic byte to clear custom sensitivity + +// +// Smart Effector byte send protocol: +// +// 0 0 1 0 ... always 0010 +// b7 b6 b5 b4 ~b4 ... hi bits, NOT last bit +// b3 b2 b1 b0 ~b0 ... lo bits, NOT last bit +// +void M672_send(uint8_t b) { // bit rate requirement: 1KHz +/- 30% + LOOP_L_N(bits, 14) { + switch (bits) { + default: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); b <<= 1; break; } // send bit, shift next into place + case 7: + case 12: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); break; } // send bit. no shift + case 8: + case 13: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !(b & 0x80)); b <<= 1; break; } // send inverted previous bit + case 0: case 1: // 00 + case 3: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); break; } // 0010 + case 2: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, HIGH); break; } // 001 + } + DELAY_US(1000); + } +} + +/** + * 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); + M672_send(M672_ERASEBYTE); + } + else if (parser.seenval('S')) { + const int8_t M672_sensitivity = parser.value_byte(); + M672_send(M672_PROGBYTE); + M672_send(M672_sensitivity); + M672_send(255 - M672_sensitivity); + } + else { + SERIAL_ECHO_MSG("!'S' or 'R' parameter required."); + return; + } + + OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Keep Smart Effector in NORMAL mode +} + +#endif // DUET_SMART_EFFECTOR && SMART_EFFECTOR_MOD_PIN diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp new file mode 100644 index 00000000..0a7d52b6 --- /dev/null +++ b/Marlin/src/gcode/config/M92.cpp @@ -0,0 +1,114 @@ +/** + * 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 "../gcode.h" +#include "../../module/planner.h" + +void report_M92(const bool echo=true, const int8_t e=-1) { + if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' '); + SERIAL_ECHOPAIR_P(PSTR(" M92 X"), LINEAR_UNIT(planner.settings.axis_steps_per_mm[X_AXIS]), + SP_Y_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Y_AXIS]), + SP_Z_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Z_AXIS])); + #if DISABLED(DISTINCT_E_FACTORS) + SERIAL_ECHOPAIR_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS])); + #endif + SERIAL_EOL(); + + #if ENABLED(DISTINCT_E_FACTORS) + LOOP_L_N(i, E_STEPPERS) { + if (e >= 0 && i != e) continue; + if (echo) SERIAL_ECHO_START(); else SERIAL_CHAR(' '); + SERIAL_ECHOLNPAIR_P(PSTR(" M92 T"), (int)i, + SP_E_STR, VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS_N(i)])); + } + #endif + + UNUSED_E(e); +} + +/** + * M92: Set axis steps-per-unit for one or more axes, X, Y, Z, and E. + * (Follows the same syntax as G92) + * + * With multiple extruders use T to specify which one. + * + * If no argument is given print the current values. + * + * With MAGIC_NUMBERS_GCODE: + * Use 'H' and/or 'L' to get ideal layer-height information. + * 'H' specifies micro-steps to use. We guess if it's not supplied. + * 'L' specifies a desired layer height. Nearest good heights are shown. + */ +void GcodeSuite::M92() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + // No arguments? Show M92 report. + if (!parser.seen("XYZE" + #if ENABLED(MAGIC_NUMBERS_GCODE) + "HL" + #endif + )) return report_M92(true, target_extruder); + + LOOP_XYZE(i) { + if (parser.seenval(axis_codes[i])) { + if (i == E_AXIS) { + const float value = parser.value_per_axis_units((AxisEnum)(E_AXIS_N(target_extruder))); + if (value < 20) { + float factor = planner.settings.axis_steps_per_mm[E_AXIS_N(target_extruder)] / value; // increase e constants if M92 E14 is given for netfab. + #if HAS_CLASSIC_JERK && HAS_CLASSIC_E_JERK + planner.max_jerk.e *= factor; + #endif + planner.settings.max_feedrate_mm_s[E_AXIS_N(target_extruder)] *= factor; + planner.max_acceleration_steps_per_s2[E_AXIS_N(target_extruder)] *= factor; + } + planner.settings.axis_steps_per_mm[E_AXIS_N(target_extruder)] = value; + } + else { + planner.settings.axis_steps_per_mm[i] = parser.value_per_axis_units((AxisEnum)i); + } + } + } + planner.refresh_positioning(); + + #if ENABLED(MAGIC_NUMBERS_GCODE) + #ifndef Z_MICROSTEPS + #define Z_MICROSTEPS 16 + #endif + const float wanted = parser.floatval('L'); + if (parser.seen('H') || wanted) { + const uint16_t argH = parser.ushortval('H'), + micro_steps = argH ?: Z_MICROSTEPS; + const float z_full_step_mm = micro_steps * planner.steps_to_mm[Z_AXIS]; + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("{ micro_steps:", micro_steps, ", z_full_step_mm:", z_full_step_mm); + 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_DECIMAL(best + z_full_step_mm); } + SERIAL_CHAR(']'); + } + SERIAL_ECHOLNPGM(" }"); + } + #endif +} diff --git a/Marlin/src/gcode/control/M108_M112_M410.cpp b/Marlin/src/gcode/control/M108_M112_M410.cpp new file mode 100644 index 00000000..df145d5d --- /dev/null +++ b/Marlin/src/gcode/control/M108_M112_M410.cpp @@ -0,0 +1,55 @@ +/** + * 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 DISABLED(EMERGENCY_PARSER) + +#include "../gcode.h" +#include "../../MarlinCore.h" // for wait_for_heatup, kill, quickstop_stepper + +/** + * M108: Stop the waiting for heaters in M109, M190, M303. Does not affect the target temperature. + */ +void GcodeSuite::M108() { + TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); + wait_for_heatup = false; +} + +/** + * M112: Full Shutdown + */ +void GcodeSuite::M112() { + kill(M112_KILL_STR, nullptr, true); +} + +/** + * M410: Quickstop - Abort all planned moves + * + * This will stop the carriages mid-move, so most likely they + * will be out of sync with the stepper position after this. + */ +void GcodeSuite::M410() { + quickstop_stepper(); +} + +#endif // !EMERGENCY_PARSER diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp new file mode 100644 index 00000000..cc871bf3 --- /dev/null +++ b/Marlin/src/gcode/control/M111.cpp @@ -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 . + * + */ + +#include "../gcode.h" + +/** + * M111: Set the debug level + */ +void GcodeSuite::M111() { + if (parser.seen('S')) marlin_debug_flags = parser.byteval('S'); + + static PGMSTR(str_debug_1, STR_DEBUG_ECHO); + static PGMSTR(str_debug_2, STR_DEBUG_INFO); + static PGMSTR(str_debug_4, STR_DEBUG_ERRORS); + static PGMSTR(str_debug_8, STR_DEBUG_DRYRUN); + static PGMSTR(str_debug_16, STR_DEBUG_COMMUNICATION); + #if ENABLED(DEBUG_LEVELING_FEATURE) + static PGMSTR(str_debug_lvl, STR_DEBUG_LEVELING); + #endif + + static PGM_P const debug_strings[] PROGMEM = { + str_debug_1, str_debug_2, str_debug_4, str_debug_8, str_debug_16, + TERN_(DEBUG_LEVELING_FEATURE, str_debug_lvl) + }; + + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(STR_DEBUG_PREFIX); + if (marlin_debug_flags) { + uint8_t comma = 0; + LOOP_L_N(i, COUNT(debug_strings)) { + if (TEST(marlin_debug_flags, i)) { + if (comma++) SERIAL_CHAR(','); + serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); + } + } + } + else { + SERIAL_ECHOPGM(STR_DEBUG_OFF); + #if !IS_AT90USB + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + SERIAL_ECHOPAIR("\nBuffer Overruns: ", MYSERIAL0.buffer_overruns()); + #endif + + #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) + SERIAL_ECHOPAIR("\nFraming Errors: ", MYSERIAL0.framing_errors()); + #endif + + #if ENABLED(SERIAL_STATS_DROPPED_RX) + SERIAL_ECHOPAIR("\nDropped bytes: ", MYSERIAL0.dropped()); + #endif + + #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + SERIAL_ECHOPAIR("\nMax RX Queue Size: ", MYSERIAL0.rxMaxEnqueued()); + #endif + #endif // !IS_AT90USB + } + SERIAL_EOL(); +} diff --git a/Marlin/src/gcode/control/M120_M121.cpp b/Marlin/src/gcode/control/M120_M121.cpp new file mode 100644 index 00000000..570f2e93 --- /dev/null +++ b/Marlin/src/gcode/control/M120_M121.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 "../gcode.h" +#include "../../module/endstops.h" + +/** + * M120: Enable endstops and set non-homing endstop state to "enabled" + */ +void GcodeSuite::M120() { endstops.enable_globally(true); } + +/** + * M121: Disable endstops and set non-homing endstop state to "disabled" + */ +void GcodeSuite::M121() { endstops.enable_globally(false); } diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp new file mode 100644 index 00000000..499feef7 --- /dev/null +++ b/Marlin/src/gcode/control/M17_M18_M84.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 "../gcode.h" +#include "../../MarlinCore.h" // for stepper_inactive_time, disable_e_steppers +#include "../../lcd/ultralcd.h" +#include "../../module/stepper.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +/** + * M17: Enable stepper motors + */ +void GcodeSuite::M17() { + if (parser.seen("XYZE")) { + if (parser.seen('X')) ENABLE_AXIS_X(); + if (parser.seen('Y')) ENABLE_AXIS_Y(); + if (parser.seen('Z')) ENABLE_AXIS_Z(); + if (TERN0(HAS_E_STEPPER_ENABLE, parser.seen('E'))) enable_e_steppers(); + } + else { + LCD_MESSAGEPGM(MSG_NO_MOVE); + enable_all_steppers(); + } +} + +/** + * M18, M84: Disable stepper motors + */ +void GcodeSuite::M18_M84() { + if (parser.seenval('S')) { + reset_stepper_timeout(); + stepper_inactive_time = parser.value_millis_from_seconds(); + } + else { + if (parser.seen("XYZE")) { + planner.synchronize(); + if (parser.seen('X')) DISABLE_AXIS_X(); + if (parser.seen('Y')) DISABLE_AXIS_Y(); + if (parser.seen('Z')) DISABLE_AXIS_Z(); + if (TERN0(HAS_E_STEPPER_ENABLE, parser.seen('E'))) disable_e_steppers(); + } + else + planner.finish_and_disable(); + + TERN_(AUTO_BED_LEVELING_UBL, ubl.steppers_were_disabled()); + } +} diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp new file mode 100644 index 00000000..2049f1eb --- /dev/null +++ b/Marlin/src/gcode/control/M211.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_SOFTWARE_ENDSTOPS + +#include "../gcode.h" +#include "../../module/motion.h" + +/** + * M211: Enable, Disable, and/or Report software endstops + * + * Usage: M211 S1 to enable, M211 S0 to disable, M211 alone for report + */ +void GcodeSuite::M211() { + const xyz_pos_t l_soft_min = soft_endstop.min.asLogical(), + l_soft_max = soft_endstop.max.asLogical(); + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(STR_SOFT_ENDSTOPS); + if (parser.seen('S')) soft_endstop._enabled = parser.value_bool(); + serialprint_onoff(soft_endstop._enabled); + print_xyz(l_soft_min, PSTR(STR_SOFT_MIN), PSTR(" ")); + print_xyz(l_soft_max, PSTR(STR_SOFT_MAX)); +} + +#endif diff --git a/Marlin/src/gcode/control/M226.cpp b/Marlin/src/gcode/control/M226.cpp new file mode 100644 index 00000000..ad717e61 --- /dev/null +++ b/Marlin/src/gcode/control/M226.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/MarlinConfig.h" + +#if ENABLED(DIRECT_PIN_CONTROL) + +#include "../gcode.h" +#include "../../MarlinCore.h" // for pin_is_protected and idle() +#include "../../module/stepper.h" + +/** + * M226: Wait until the specified pin reaches the state required (M226 P S) + */ +void GcodeSuite::M226() { + if (parser.seen('P')) { + const int pin_number = PARSED_PIN_INDEX('P', 0), + pin_state = parser.intval('S', -1); // required pin state - default is inverted + const pin_t pin = GET_PIN_MAP_PIN(pin_number); + + if (WITHIN(pin_state, -1, 1) && pin > -1) { + if (pin_is_protected(pin)) + protected_pin_err(); + else { + int target = LOW; + planner.synchronize(); + pinMode(pin, INPUT); + switch (pin_state) { + case 1: target = HIGH; break; + case 0: target = LOW; break; + case -1: target = !extDigitalRead(pin); break; + } + while (int(extDigitalRead(pin)) != target) idle(); + } + } // pin_state -1 0 1 && pin > -1 + } // parser.seen('P') +} + +#endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/gcode/control/M280.cpp b/Marlin/src/gcode/control/M280.cpp new file mode 100644 index 00000000..6ccbb7be --- /dev/null +++ b/Marlin/src/gcode/control/M280.cpp @@ -0,0 +1,55 @@ +/** + * 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_SERVOS + +#include "../gcode.h" +#include "../../module/servo.h" + +/** + * M280: Get or set servo position. P [S] + */ +void GcodeSuite::M280() { + if (!parser.seen('P')) return; + const int servo_index = parser.value_int(); + if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) { + if (parser.seen('S')) { + const int a = parser.value_int(); + if (a == -1) + servo[servo_index].detach(); + else + MOVE_SERVO(servo_index, a); + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(" Servo ", servo_index, ": ", servo[servo_index].read()); + } + } + else { + SERIAL_ERROR_START(); + SERIAL_ECHOLNPAIR("Servo ", servo_index, " out of range"); + } +} + +#endif // HAS_SERVOS diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp new file mode 100644 index 00000000..1326c306 --- /dev/null +++ b/Marlin/src/gcode/control/M3-M5.cpp @@ -0,0 +1,134 @@ +/** + * 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_CUTTER + +#include "../gcode.h" +#include "../../feature/spindle_laser.h" +#include "../../module/stepper.h" + +/** + * Laser: + * M3 - Laser ON/Power (Ramped power) + * M4 - Laser ON/Power (Continuous power) + * + * Spindle: + * M3 - Spindle ON (Clockwise) + * M4 - Spindle ON (Counter-clockwise) + * + * Parameters: + * S - Set power. S0 will turn the spindle/laser off, except in relative mode. + * O - Set power and OCR (oscillator count register) + * + * If no PWM pin is defined then M3/M4 just turns it on. + * + * At least 12.8KHz (50Hz * 256) is needed for Spindle PWM. + * Hardware PWM is required on AVR. ISRs are too slow. + * + * NOTE: WGM for timers 3, 4, and 5 must be either Mode 1 or Mode 5. + * No other settings give a PWM signal that goes from 0 to 5 volts. + * + * The system automatically sets WGM to Mode 1, so no special + * initialization is needed. + * + * WGM bits for timer 2 are automatically set by the system to + * Mode 1. This produces an acceptable 0 to 5 volt signal. + * No special initialization is needed. + * + * NOTE: A minimum PWM frequency of 50 Hz is needed. All prescaler + * factors for timers 2, 3, 4, and 5 are acceptable. + * + * SPINDLE_LASER_ENA_PIN needs an external pullup or it may power on + * the spindle/laser during power-up or when connecting to the host + * (usually goes through a reset which sets all I/O pins to tri-state) + * + * PWM duty cycle goes from 0 (off) to 255 (always on). + */ +void GcodeSuite::M3_M4(const bool is_M4) { + auto get_s_power = [] { + if (parser.seenval('S')) { + const float spwr = parser.value_float(); + cutter.unitPower = TERN(SPINDLE_LASER_PWM, + cutter.power_to_range(cutter_power_t(round(spwr))), + spwr > 0 ? 255 : 0); + } + else + cutter.unitPower = cutter.cpwr_to_upwr(SPEED_POWER_STARTUP); + return cutter.unitPower; + }; + + #if ENABLED(LASER_POWER_INLINE) + if (parser.seen('I') == DISABLED(LASER_POWER_INLINE_INVERT)) { + // Laser power in inline mode + cutter.inline_direction(is_M4); // Should always be unused + #if ENABLED(SPINDLE_LASER_PWM) + if (parser.seen('O')) { + cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0); + cutter.inline_ocr_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t) + } + else + cutter.inline_power(cutter.upower_to_ocr(get_s_power())); + #else + cutter.set_inline_enabled(true); + #endif + return; + } + // Non-inline, standard case + cutter.inline_disable(); // Prevent future blocks re-setting the power + #endif + + planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power + cutter.set_direction(is_M4); + + #if ENABLED(SPINDLE_LASER_PWM) + if (parser.seenval('O')) { + cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0); + cutter.set_ocr_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t) + } + else + cutter.set_power(cutter.upower_to_ocr(get_s_power())); + #else + cutter.set_enabled(true); + #endif + cutter.menuPower = cutter.unitPower; +} + +/** + * M5 - Cutter OFF (when moves are complete) + */ +void GcodeSuite::M5() { + #if ENABLED(LASER_POWER_INLINE) + if (parser.seen('I') == DISABLED(LASER_POWER_INLINE_INVERT)) { + cutter.set_inline_enabled(false); // Laser power in inline mode + return; + } + // Non-inline, standard case + cutter.inline_disable(); // Prevent future blocks re-setting the power + #endif + planner.synchronize(); + cutter.set_enabled(false); + cutter.menuPower = cutter.unitPower; +} + +#endif // HAS_CUTTER diff --git a/Marlin/src/gcode/control/M350_M351.cpp b/Marlin/src/gcode/control/M350_M351.cpp new file mode 100644 index 00000000..463bd2ad --- /dev/null +++ b/Marlin/src/gcode/control/M350_M351.cpp @@ -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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_MICROSTEPS + +#include "../gcode.h" +#include "../../module/stepper.h" + +/** + * M350: Set axis microstepping modes. S sets mode for all drivers. + * + * Warning: Steps-per-unit remains unchanged. + */ +void GcodeSuite::M350() { + if (parser.seen('S')) LOOP_LE_N(i, 4) stepper.microstep_mode(i, parser.value_byte()); + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte()); + if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte()); + stepper.microstep_readings(); +} + +/** + * M351: Toggle MS1 MS2 pins directly with axis codes X Y Z E B + * S# determines MS1, MS2 or MS3, X# sets the pin high/low. + */ +void GcodeSuite::M351() { + if (parser.seenval('S')) switch (parser.value_byte()) { + case 1: + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1, -1); + if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1, -1); + break; + case 2: + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte(), -1); + if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte(), -1); + break; + case 3: + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, -1, parser.value_byte()); + if (parser.seenval('B')) stepper.microstep_ms(4, -1, -1, parser.value_byte()); + break; + } + stepper.microstep_readings(); +} + +#endif // HAS_MICROSTEPS diff --git a/Marlin/src/gcode/control/M380_M381.cpp b/Marlin/src/gcode/control/M380_M381.cpp new file mode 100644 index 00000000..3f5b2524 --- /dev/null +++ b/Marlin/src/gcode/control/M380_M381.cpp @@ -0,0 +1,56 @@ +/** + * 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 EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + +#include "../gcode.h" +#include "../../feature/solenoid.h" +#include "../../module/motion.h" + +/** + * M380: Enable solenoid on the active extruder + * + * S to specify a solenoid (Requires MANUAL_SOLENOID_CONTROL) + */ +void GcodeSuite::M380() { + #if ENABLED(MANUAL_SOLENOID_CONTROL) + enable_solenoid(parser.intval('S', active_extruder)); + #else + enable_solenoid_on_active_extruder(); + #endif +} + +/** + * M381: Disable all solenoids if EXT_SOLENOID + * Disable selected/active solenoid if MANUAL_SOLENOID_CONTROL + */ +void GcodeSuite::M381() { + #if ENABLED(MANUAL_SOLENOID_CONTROL) + disable_solenoid(parser.intval('S', active_extruder)); + #else + disable_all_solenoids(); + #endif +} + +#endif // EXT_SOLENOID || MANUAL_SOLENOID_CONTROL diff --git a/Marlin/src/gcode/control/M400.cpp b/Marlin/src/gcode/control/M400.cpp new file mode 100644 index 00000000..9a5ad4e9 --- /dev/null +++ b/Marlin/src/gcode/control/M400.cpp @@ -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 . + * + */ + +#include "../gcode.h" +#include "../../module/stepper.h" + +/** + * M400: Finish all moves + */ +void GcodeSuite::M400() { + + planner.synchronize(); + +} diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp new file mode 100644 index 00000000..c635c06e --- /dev/null +++ b/Marlin/src/gcode/control/M42.cpp @@ -0,0 +1,103 @@ +/** + * 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(DIRECT_PIN_CONTROL) + +#include "../gcode.h" +#include "../../MarlinCore.h" // for pin_is_protected + +#if HAS_FAN + #include "../../module/temperature.h" +#endif + +/** + * M42: Change pin status via GCode + * + * P Pin number (LED if omitted) + * For LPC1768 specify pin P1_02 as M42 P102, + * P1_20 as M42 P120, etc. + * + * S Pin status from 0 - 255 + * I Flag to ignore Marlin's pin protection + * + * M Pin mode: 0=INPUT 1=OUTPUT 2=INPUT_PULLUP 3=INPUT_PULLDOWN + */ +void GcodeSuite::M42() { + const int pin_index = PARSED_PIN_INDEX('P', GET_PIN_MAP_INDEX(LED_PIN)); + if (pin_index < 0) return; + + const pin_t pin = GET_PIN_MAP_PIN(pin_index); + + if (!parser.boolval('I') && pin_is_protected(pin)) return protected_pin_err(); + + if (parser.seenval('M')) { + switch (parser.value_byte()) { + case 0: pinMode(pin, INPUT); break; + case 1: pinMode(pin, OUTPUT); break; + case 2: pinMode(pin, INPUT_PULLUP); break; + #ifdef INPUT_PULLDOWN + case 3: pinMode(pin, INPUT_PULLDOWN); break; + #endif + default: SERIAL_ECHOLNPGM("Invalid Pin Mode"); return; + } + } + + if (!parser.seenval('S')) return; + const byte pin_status = parser.value_byte(); + + #if HAS_FAN + switch (pin) { + #if HAS_FAN0 + case FAN0_PIN: thermalManager.fan_speed[0] = pin_status; return; + #endif + #if HAS_FAN1 + case FAN1_PIN: thermalManager.fan_speed[1] = pin_status; return; + #endif + #if HAS_FAN2 + case FAN2_PIN: thermalManager.fan_speed[2] = pin_status; return; + #endif + #if HAS_FAN3 + case FAN3_PIN: thermalManager.fan_speed[3] = pin_status; return; + #endif + #if HAS_FAN4 + case FAN4_PIN: thermalManager.fan_speed[4] = pin_status; return; + #endif + #if HAS_FAN5 + case FAN5_PIN: thermalManager.fan_speed[5] = pin_status; return; + #endif + #if HAS_FAN6 + case FAN6_PIN: thermalManager.fan_speed[6] = pin_status; return; + #endif + #if HAS_FAN7 + case FAN7_PIN: thermalManager.fan_speed[7] = pin_status; return; + #endif + } + #endif + + pinMode(pin, OUTPUT); + extDigitalWrite(pin, pin_status); + analogWrite(pin, pin_status); +} + +#endif // DIRECT_PIN_CONTROL diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp new file mode 100644 index 00000000..5dc36428 --- /dev/null +++ b/Marlin/src/gcode/control/M605.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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_DUPLICATION_MODE + +//#define DEBUG_DXC_MODE + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/tool_change.h" +#include "../../module/planner.h" + +#define DEBUG_OUT ENABLED(DEBUG_DXC_MODE) +#include "../../core/debug_out.h" + +#if ENABLED(DUAL_X_CARRIAGE) + + /** + * M605: Set dual x-carriage movement mode + * + * M605 S0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. + * + * M605 S1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so that + * additional slicer support is not required. + * + * M605 S2 X R : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with "M605 S2" to initiate duplicated movement. For example, use "M605 S2 X100 R2" to + * make a copy 100mm to the right with E1 2° hotter than E0. + * + * M605 S3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * The temperature differential and initial X offset must be set with "M605 S2 X[offs] R[deg]", + * then followed by "M605 S3" to initiate mirrored movement. + * + * M605 W : IDEX What? command. + * + * Note: the X axis should be homed after changing Dual X-carriage mode. + */ + void GcodeSuite::M605() { + planner.synchronize(); + + if (parser.seen('S')) { + const DualXMode previous_mode = dual_x_carriage_mode; + + dual_x_carriage_mode = (DualXMode)parser.value_byte(); + mirrored_duplication_mode = false; + + if (dual_x_carriage_mode == DXC_MIRRORED_MODE) { + if (previous_mode != DXC_DUPLICATION_MODE) { + SERIAL_ECHOLNPGM("Printer must be in DXC_DUPLICATION_MODE prior to "); + SERIAL_ECHOLNPGM("specifying DXC_MIRRORED_MODE."); + dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + return; + } + mirrored_duplication_mode = true; + stepper.set_directions(); + float x_jog = current_position.x - .1; + for (uint8_t i = 2; --i;) { + planner.buffer_line(x_jog, current_position.y, current_position.z, current_position.e, feedrate_mm_s, 0); + x_jog += .1; + } + return; + } + + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: + case DXC_AUTO_PARK_MODE: + break; + case DXC_DUPLICATION_MODE: + // 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: + dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + break; + } + active_extruder_parked = false; + extruder_duplication_enabled = false; + stepper.set_directions(); + delayed_move_time = 0; + } + else if (!parser.seen('W')) // if no S or W parameter, the DXC mode gets reset to the user's default + dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + + #ifdef DEBUG_DXC_MODE + + if (parser.seen('W')) { + DEBUG_ECHO_START(); + DEBUG_ECHOPGM("Dual X Carriage Mode "); + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: DEBUG_ECHOPGM("FULL_CONTROL"); break; + case DXC_AUTO_PARK_MODE: DEBUG_ECHOPGM("AUTO_PARK"); break; + case DXC_DUPLICATION_MODE: DEBUG_ECHOPGM("DUPLICATION"); break; + case DXC_MIRRORED_MODE: DEBUG_ECHOPGM("MIRRORED"); break; + } + DEBUG_ECHOPAIR("\nActive Ext: ", int(active_extruder)); + if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT "); + DEBUG_ECHOPGM(" parked."); + DEBUG_ECHOPAIR("\nactive_extruder_x_pos: ", current_position.x); + DEBUG_ECHOPAIR("\ninactive_extruder_x_pos: ", inactive_extruder_x_pos); + DEBUG_ECHOPAIR("\nextruder_duplication_enabled: ", int(extruder_duplication_enabled)); + DEBUG_ECHOPAIR("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); + DEBUG_ECHOPAIR("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); + DEBUG_ECHOPAIR("\ndelayed_move_time: ", delayed_move_time); + DEBUG_ECHOPAIR("\nX1 Home X: ", x_home_pos(0), "\nX1_MIN_POS=", int(X1_MIN_POS), "\nX1_MAX_POS=", int(X1_MAX_POS)); + DEBUG_ECHOPAIR("\nX2 Home X: ", x_home_pos(1), "\nX2_MIN_POS=", int(X2_MIN_POS), "\nX2_MAX_POS=", int(X2_MAX_POS)); + DEBUG_ECHOPAIR("\nX2_HOME_DIR=", int(X2_HOME_DIR), "\nX2_HOME_POS=", int(X2_HOME_POS)); + DEBUG_ECHOPAIR("\nDEFAULT_DUAL_X_CARRIAGE_MODE=", STRINGIFY(DEFAULT_DUAL_X_CARRIAGE_MODE)); + DEBUG_ECHOPAIR("\toolchange_settings.z_raise=", toolchange_settings.z_raise); + DEBUG_ECHOPAIR("\nDEFAULT_DUPLICATION_X_OFFSET=", int(DEFAULT_DUPLICATION_X_OFFSET)); + DEBUG_EOL(); + + HOTEND_LOOP() { + DEBUG_ECHOPAIR_P(SP_T_STR, int(e)); + LOOP_XYZ(a) DEBUG_ECHOPAIR(" hotend_offset[", int(e), "].", XYZ_CHAR(a) | 0x20, "=", hotend_offset[e][a]); + DEBUG_EOL(); + } + DEBUG_EOL(); + } + #endif // DEBUG_DXC_MODE + } + +#elif ENABLED(MULTI_NOZZLE_DUPLICATION) + + /** + * M605: Set multi-nozzle duplication mode + * + * S2 - Enable duplication mode + * P[mask] - Bit-mask of nozzles to include in the duplication set. + * A value of 0 disables duplication. + * E[index] - Last nozzle index to include in the duplication set. + * A value of 0 disables duplication. + */ + void GcodeSuite::M605() { + bool ena = false; + if (parser.seen("EPS")) { + planner.synchronize(); + if (parser.seenval('P')) duplication_e_mask = parser.value_int(); // Set the mask directly + else if (parser.seenval('E')) duplication_e_mask = pow(2, parser.value_int() + 1) - 1; // Set the mask by E index + ena = (2 == parser.intval('S', extruder_duplication_enabled ? 2 : 0)); + extruder_duplication_enabled = ena && (duplication_e_mask >= 3); + } + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(STR_DUPLICATION_MODE); + serialprint_onoff(extruder_duplication_enabled); + if (ena) { + SERIAL_ECHOPGM(" ( "); + HOTEND_LOOP() if (TEST(duplication_e_mask, e)) { SERIAL_ECHO(e); SERIAL_CHAR(' '); } + SERIAL_CHAR(')'); + } + SERIAL_EOL(); + } + +#endif // MULTI_NOZZLE_DUPLICATION + +#endif // HAS_DUPICATION_MODE diff --git a/Marlin/src/gcode/control/M7-M9.cpp b/Marlin/src/gcode/control/M7-M9.cpp new file mode 100644 index 00000000..a33e4328 --- /dev/null +++ b/Marlin/src/gcode/control/M7-M9.cpp @@ -0,0 +1,63 @@ +/** + * 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(COOLANT_CONTROL) + +#include "../gcode.h" +#include "../../module/planner.h" + +#if ENABLED(COOLANT_MIST) + /** + * M7: Mist Coolant On + */ + void GcodeSuite::M7() { + planner.synchronize(); // Wait for move to arrive + WRITE(COOLANT_MIST_PIN, !(COOLANT_MIST_INVERT)); // Turn on Mist coolant + } +#endif + +#if ENABLED(COOLANT_FLOOD) + /** + * M8: Flood Coolant On + */ + void GcodeSuite::M8() { + planner.synchronize(); // Wait for move to arrive + WRITE(COOLANT_FLOOD_PIN, !(COOLANT_FLOOD_INVERT)); // Turn on Flood coolant + } +#endif + +/** + * M9: Coolant OFF + */ +void GcodeSuite::M9() { + planner.synchronize(); // Wait for move to arrive + #if ENABLED(COOLANT_MIST) + WRITE(COOLANT_MIST_PIN, COOLANT_MIST_INVERT); // Turn off Mist coolant + #endif + #if ENABLED(COOLANT_FLOOD) + WRITE(COOLANT_FLOOD_PIN, COOLANT_FLOOD_INVERT); // Turn off Flood coolant + #endif +} + +#endif // COOLANT_CONTROL diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp new file mode 100644 index 00000000..6302bb5c --- /dev/null +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -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 . + * + */ + +#include "../gcode.h" + +#include "../../module/temperature.h" +#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" + +#if HAS_SUICIDE + #include "../../MarlinCore.h" +#endif + +#if ENABLED(PSU_CONTROL) + + #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 + bool powersupply_on; + + #if HAS_TRINAMIC_CONFIG + #include "../../feature/tmc_util.h" + #endif + + /** + * M80 : Turn on the Power Supply + * M80 S : Report the current state and exit + */ + void GcodeSuite::M80() { + + // S: Report the current power supply state and exit + if (parser.seen('S')) { + serialprintPGM(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); + return; + } + + PSU_ON(); + + /** + * If you have a switch on suicide pin, this is useful + * if you want to start another print with suicide feature after + * a print without suicide... + */ + #if HAS_SUICIDE + OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); + #endif + + #if DISABLED(AUTO_POWER_CONTROL) + safe_delay(PSU_POWERUP_DELAY); + restore_stepper_drivers(); + TERN_(HAS_TRINAMIC_CONFIG, safe_delay(PSU_POWERUP_DELAY)); + #endif + + TERN_(HAS_LCD_MENU, ui.reset_status()); + } + +#endif // PSU_CONTROL + +/** + * M81: Turn off Power, including Power Supply, if there is one. + * + * This code should ALWAYS be available for FULL SHUTDOWN! + */ +void GcodeSuite::M81() { + thermalManager.disable_all_heaters(); + print_job_timer.stop(); + planner.finish_and_disable(); + + #if HAS_FAN + thermalManager.zero_fan_speeds(); + #if ENABLED(PROBING_FANS_OFF) + thermalManager.fans_paused = false; + ZERO(thermalManager.saved_fan_speed); + #endif + #endif + + safe_delay(1000); // Wait 1 second before switching off + + #if HAS_SUICIDE + suicide(); + #elif ENABLED(PSU_CONTROL) + PSU_OFF(); + #endif + + LCD_MESSAGEPGM_P(PSTR(MACHINE_NAME " " STR_OFF ".")); +} diff --git a/Marlin/src/gcode/control/M85.cpp b/Marlin/src/gcode/control/M85.cpp new file mode 100644 index 00000000..9c8c02c5 --- /dev/null +++ b/Marlin/src/gcode/control/M85.cpp @@ -0,0 +1,35 @@ +/** + * 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 "../gcode.h" + +/** + * M85: Set inactivity shutdown timer with parameter S. To disable set zero (default) + */ +void GcodeSuite::M85() { + + if (parser.seen('S')) { + reset_stepper_timeout(); + max_inactive_time = parser.value_millis_from_seconds(); + } + +} diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp new file mode 100644 index 00000000..ff9ff85b --- /dev/null +++ b/Marlin/src/gcode/control/M993_M994.cpp @@ -0,0 +1,88 @@ +/** + * 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; + } + + 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; + } + + 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/control/M997.cpp b/Marlin/src/gcode/control/M997.cpp new file mode 100644 index 00000000..cdff96f1 --- /dev/null +++ b/Marlin/src/gcode/control/M997.cpp @@ -0,0 +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 "../gcode.h" + +#if ENABLED(PLATFORM_M997_SUPPORT) + +/** + * M997: Perform in-application firmware update + */ +void GcodeSuite::M997() { + + flashFirmware(parser.intval('S')); + +} + +#endif diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp new file mode 100644 index 00000000..3bd908ca --- /dev/null +++ b/Marlin/src/gcode/control/M999.cpp @@ -0,0 +1,45 @@ +/** + * 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 "../gcode.h" + +#include "../../lcd/ultralcd.h" // for lcd_reset_alert_level +#include "../../MarlinCore.h" // for marlin_state +#include "../queue.h" // for flush_and_request_resend + +/** + * M999: Restart after being stopped + * + * Default behavior is to flush the serial buffer and request + * a resend to the host starting on the last N line received. + * + * Sending "M999 S1" will resume printing without flushing the + * existing command buffer. + */ +void GcodeSuite::M999() { + marlin_state = MF_RUNNING; + ui.reset_alert_level(); + + if (parser.boolval('S')) return; + + queue.flush_and_request_resend(); +} diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp new file mode 100644 index 00000000..d95e60ff --- /dev/null +++ b/Marlin/src/gcode/control/T.cpp @@ -0,0 +1,76 @@ +/** + * 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 "../gcode.h" +#include "../../module/tool_change.h" + +#if EITHER(HAS_MULTI_EXTRUDER, DEBUG_LEVELING_FEATURE) + #include "../../module/motion.h" +#endif + +#if ENABLED(PRUSA_MMU2) + #include "../../feature/mmu2/mmu2.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../core/debug_out.h" + +/** + * T0-T: Switch tool, usually switching extruders + * + * F[units/min] Set the movement feedrate + * S1 Don't move the tool in XY after change + * + * For PRUSA_MMU2: + * T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels. + * T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically. + * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. + * Tc Load to nozzle after filament was prepared by Tc and nozzle is already heated. + */ +void GcodeSuite::T(const int8_t tool_index) { + + DEBUG_SECTION(log_T, "T", DEBUGGING(LEVELING)); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("...(", tool_index, ")"); + + // 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 + return; + } + #endif + + #if EXTRUDERS < 2 + + tool_change(tool_index); + + #else + + tool_change( + tool_index, + (tool_index == active_extruder) || parser.boolval('S') + ); + + #endif +} diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp new file mode 100644 index 00000000..26c50a61 --- /dev/null +++ b/Marlin/src/gcode/eeprom/M500-M504.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 . + * + */ + +#include "../gcode.h" +#include "../../module/settings.h" +#include "../../core/serial.h" +#include "../../inc/MarlinConfig.h" + +/** + * M500: Store settings in EEPROM + */ +void GcodeSuite::M500() { + (void)settings.save(); +} + +/** + * M501: Read settings from EEPROM + */ +void GcodeSuite::M501() { + (void)settings.load(); +} + +/** + * M502: Revert to default settings + */ +void GcodeSuite::M502() { + (void)settings.reset(); +} + +#if DISABLED(DISABLE_M503) + + /** + * M503: print settings currently in memory + */ + void GcodeSuite::M503() { + (void)settings.report(!parser.boolval('S', true)); + } + +#endif // !DISABLE_M503 + +#if ENABLED(EEPROM_SETTINGS) + + #if ENABLED(MARLIN_DEV_MODE) + #include "../../libs/hex_print.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/gcode/feature/L6470/M122.cpp b/Marlin/src/gcode/feature/L6470/M122.cpp new file mode 100644 index 00000000..d2b7f739 --- /dev/null +++ b/Marlin/src/gcode/feature/L6470/M122.cpp @@ -0,0 +1,151 @@ +/** + * 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_L64XX + +#include "../../gcode.h" +#include "../../../libs/L64XX/L64XX_Marlin.h" +#include "../../../module/stepper/indirection.h" + +void echo_yes_no(const bool yes); + +inline void L6470_say_status(const L64XX_axis_t axis) { + if (L64xxManager.spi_abort) return; + const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; + L64xxManager.get_status(axis); + L64xxManager.say_axis(axis); + #if ENABLED(L6470_CHITCHAT) + char temp_buf[20]; + sprintf_P(temp_buf, PSTR(" status: %4x "), sh.STATUS_AXIS_RAW); + SERIAL_ECHO(temp_buf); + print_bin(sh.STATUS_AXIS_RAW); + switch (sh.STATUS_AXIS_LAYOUT) { + case L6470_STATUS_LAYOUT: serialprintPGM(PSTR(" L6470")); break; + case L6474_STATUS_LAYOUT: serialprintPGM(PSTR(" L6474")); break; + case L6480_STATUS_LAYOUT: serialprintPGM(PSTR(" L6480/powerSTEP01")); break; + } + #endif + SERIAL_ECHOPGM("\n...OUTPUT: "); + serialprintPGM(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON ")); + SERIAL_ECHOPGM(" BUSY: "); echo_yes_no((sh.STATUS_AXIS & STATUS_BUSY) == 0); + SERIAL_ECHOPGM(" DIR: "); + serialprintPGM((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE")); + if (sh.STATUS_AXIS_LAYOUT == L6480_STATUS_LAYOUT) { + SERIAL_ECHOPGM(" Last Command: "); + if (sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD) SERIAL_ECHOPGM("VALID"); + else SERIAL_ECHOPGM("ERROR"); + SERIAL_ECHOPGM("\n...THERMAL: "); + switch ((sh.STATUS_AXIS & (sh.STATUS_AXIS_TH_SD | sh.STATUS_AXIS_TH_WRN)) >> 11) { + case 0: SERIAL_ECHOPGM("DEVICE SHUTDOWN"); break; + case 1: SERIAL_ECHOPGM("BRIDGE SHUTDOWN"); break; + case 2: SERIAL_ECHOPGM("WARNING "); break; + case 3: SERIAL_ECHOPGM("OK "); break; + } + } + else { + SERIAL_ECHOPGM(" Last Command: "); + if (!(sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD)) SERIAL_ECHOPGM("IN"); + SERIAL_ECHOPGM("VALID "); + serialprintPGM(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED")); + SERIAL_ECHOPAIR("\n...THERMAL: ", !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_SD) ? "SHUTDOWN " : !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_WRN) ? "WARNING " : "OK "); + } + SERIAL_ECHOPGM(" OVERCURRENT:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_OCD) == 0); + if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) { + SERIAL_ECHOPGM(" STALL:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_STEP_LOSS_A) == 0 || (sh.STATUS_AXIS & sh.STATUS_AXIS_STEP_LOSS_B) == 0); + SERIAL_ECHOPGM(" STEP-CLOCK MODE:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_SCK_MOD) != 0); + } + else { + SERIAL_ECHOPGM(" STALL: NA " + " STEP-CLOCK MODE: NA" + " UNDER VOLTAGE LOCKOUT: "); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_UVLO) == 0); + } + SERIAL_EOL(); +} + +/** + * M122: Debug L6470 drivers + */ +void GcodeSuite::M122() { + L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status + L64xxManager.spi_active = true; // Tell set_directions() a series of SPI transfers is underway + + //if (parser.seen('S')) + // tmc_set_report_interval(parser.value_bool()); + //else + + #if AXIS_IS_L64XX(X) + L6470_say_status(X); + #endif + #if AXIS_IS_L64XX(X2) + L6470_say_status(X2); + #endif + #if AXIS_IS_L64XX(Y) + L6470_say_status(Y); + #endif + #if AXIS_IS_L64XX(Y2) + L6470_say_status(Y2); + #endif + #if AXIS_IS_L64XX(Z) + L6470_say_status(Z); + #endif + #if AXIS_IS_L64XX(Z2) + L6470_say_status(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + L6470_say_status(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + L6470_say_status(Z4); + #endif + #if AXIS_IS_L64XX(E0) + L6470_say_status(E0); + #endif + #if AXIS_IS_L64XX(E1) + L6470_say_status(E1); + #endif + #if AXIS_IS_L64XX(E2) + L6470_say_status(E2); + #endif + #if AXIS_IS_L64XX(E3) + L6470_say_status(E3); + #endif + #if AXIS_IS_L64XX(E4) + L6470_say_status(E4); + #endif + #if AXIS_IS_L64XX(E5) + L6470_say_status(E5); + #endif + #if AXIS_IS_L64XX(E6) + L6470_say_status(E6); + #endif + #if AXIS_IS_L64XX(E7) + L6470_say_status(E7); + #endif + + L64xxManager.spi_active = false; // done with all SPI transfers - clear handshake flags + L64xxManager.spi_abort = false; + L64xxManager.pause_monitor(false); +} + +#endif // HAS_L64XX diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp new file mode 100644 index 00000000..7bd446a1 --- /dev/null +++ b/Marlin/src/gcode/feature/L6470/M906.cpp @@ -0,0 +1,370 @@ +/** + * 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_L64XX + +#include "../../gcode.h" +#include "../../../libs/L64XX/L64XX_Marlin.h" +#include "../../../module/stepper/indirection.h" +#include "../../../module/planner.h" + +#define DEBUG_OUT ENABLED(L6470_CHITCHAT) +#include "../../../core/debug_out.h" + +/** + * M906: report or set KVAL_HOLD which sets the maximum effective voltage provided by the + * PWMs to the steppers + * + * On L6474 this sets the TVAL register (same address). + * + * I - select which driver(s) to change on multi-driver axis + * 0 - (default) all drivers on the axis or E0 + * 1 - monitor only X, Y, Z or E1 + * 2 - monitor only X2, Y2, Z2 or E2 + * 3 - monitor only Z3 or E3 + * 4 - monitor only Z4 or E4 + * 5 - monitor only E5 + * Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional) + * L6474 - current in mA (4A max) + * All others - 0-255 + */ + +/** + * Sets KVAL_HOLD wich affects the current being driven through the stepper. + * + * L6470 is used in the STEP-CLOCK mode. KVAL_HOLD is the only KVAL_xxx + * that affects the effective voltage seen by the stepper. + */ + +/** + * MACRO to fetch information on the items associated with current limiting + * and maximum voltage output. + * + * L6470 can be setup to shutdown if either current threshold is exceeded. + * + * L6470 output current can not be set directly. It is set indirectly by + * setting the maximum effective output voltage. + * + * Effective output voltage is set by PWM duty cycle. + * + * Maximum effective output voltage is affected by MANY variables. The main ones are: + * KVAL_HOLD + * KVAL_RUN + * KVAL_ACC + * KVAL_DEC + * Vs compensation (if enabled) + */ +void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) { + + if (L64xxManager.spi_abort) return; // don't do anything if set_directions() has occurred + + const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; + const uint16_t status = L64xxManager.get_status(axis); //also populates shadow structure + const uint8_t OverCurrent_Threshold = uint8_t(motor.GetParam(L6470_OCD_TH)); + + auto say_axis_status = [](const L64XX_axis_t axis, const uint16_t status) { + L64xxManager.say_axis(axis); + #if ENABLED(L6470_CHITCHAT) + char tmp[10]; + sprintf_P(tmp, PSTR("%4x "), status); + DEBUG_ECHOPAIR(" status: ", tmp); + print_bin(status); + #else + UNUSED(status); + #endif + SERIAL_EOL(); + }; + + char temp_buf[10]; + + switch (sh.STATUS_AXIS_LAYOUT) { + case L6470_STATUS_LAYOUT: // L6470 + case L6480_STATUS_LAYOUT: { // L6480 & powerstep01 + const uint16_t Stall_Threshold = (uint8_t)motor.GetParam(L6470_STALL_TH), + motor_status = (status & (STATUS_MOT_STATUS)) >> 5, + L6470_ADC_out = motor.GetParam(L6470_ADC_OUT), + L6470_ADC_out_limited = constrain(L6470_ADC_out, 8, 24); + const float comp_coef = 1600.0f / L6470_ADC_out_limited; + const uint16_t MicroSteps = _BV(motor.GetParam(L6470_STEP_MODE) & 0x07); + + say_axis_status(axis, sh.STATUS_AXIS_RAW); + + SERIAL_ECHOPGM("...OverCurrent Threshold: "); + sprintf_P(temp_buf, PSTR("%2d ("), OverCurrent_Threshold); + SERIAL_ECHO(temp_buf); + SERIAL_ECHO((OverCurrent_Threshold + 1) * motor.OCD_CURRENT_CONSTANT_INV); + SERIAL_ECHOPGM(" mA)"); + SERIAL_ECHOPGM(" Stall Threshold: "); + sprintf_P(temp_buf, PSTR("%2d ("), Stall_Threshold); + SERIAL_ECHO(temp_buf); + SERIAL_ECHO((Stall_Threshold + 1) * motor.STALL_CURRENT_CONSTANT_INV); + SERIAL_ECHOPGM(" mA)"); + SERIAL_ECHOPGM(" Motor Status: "); + switch (motor_status) { + case 0: SERIAL_ECHOPGM("stopped"); break; + case 1: SERIAL_ECHOPGM("accelerating"); break; + case 2: SERIAL_ECHOPGM("decelerating"); break; + case 3: SERIAL_ECHOPGM("at constant speed"); break; + } + SERIAL_EOL(); + + SERIAL_ECHOPAIR("...MicroSteps: ", MicroSteps, + " ADC_OUT: ", L6470_ADC_out); + SERIAL_ECHOPGM(" Vs_compensation: "); + serialprintPGM((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED")); + SERIAL_ECHOLNPAIR(" Compensation coefficient: ~", comp_coef * 0.01f); + + SERIAL_ECHOPAIR("...KVAL_HOLD: ", motor.GetParam(L6470_KVAL_HOLD), + " KVAL_RUN : ", motor.GetParam(L6470_KVAL_RUN), + " KVAL_ACC: ", motor.GetParam(L6470_KVAL_ACC), + " KVAL_DEC: ", motor.GetParam(L6470_KVAL_DEC), + " V motor max = "); + switch (motor_status) { + case 0: SERIAL_ECHO(motor.GetParam(L6470_KVAL_HOLD) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_HOLD)"); break; + case 1: SERIAL_ECHO(motor.GetParam(L6470_KVAL_RUN) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_RUN)"); break; + case 2: SERIAL_ECHO(motor.GetParam(L6470_KVAL_ACC) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_ACC)"); break; + case 3: SERIAL_ECHO(motor.GetParam(L6470_KVAL_DEC) * 100 / 256); SERIAL_ECHOPGM("% (KVAL_HOLD)"); break; + } + SERIAL_EOL(); + + #if ENABLED(L6470_CHITCHAT) + DEBUG_ECHOPGM("...SLEW RATE: "); + switch (sh.STATUS_AXIS_LAYOUT) { + case L6470_STATUS_LAYOUT: { + switch ((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_POW_SR) >> CONFIG_POW_SR_BIT) { + case 0: { DEBUG_ECHOLNPGM("320V/uS") ; break; } + case 1: { DEBUG_ECHOLNPGM("75V/uS") ; break; } + case 2: { DEBUG_ECHOLNPGM("110V/uS") ; break; } + case 3: { DEBUG_ECHOLNPGM("260V/uS") ; break; } + } + break; + } + case L6480_STATUS_LAYOUT: { + switch (motor.GetParam(L6470_GATECFG1) & CONFIG1_SR ) { + case CONFIG1_SR_220V_us: { DEBUG_ECHOLNPGM("220V/uS") ; break; } + case CONFIG1_SR_400V_us: { DEBUG_ECHOLNPGM("400V/uS") ; break; } + case CONFIG1_SR_520V_us: { DEBUG_ECHOLNPGM("520V/uS") ; break; } + case CONFIG1_SR_980V_us: { DEBUG_ECHOLNPGM("980V/uS") ; break; } + default: { DEBUG_ECHOLNPGM("unknown") ; break; } + } + } + } + #endif + SERIAL_EOL(); + break; + } + + case L6474_STATUS_LAYOUT: { // L6474 + const uint16_t L6470_ADC_out = motor.GetParam(L6470_ADC_OUT) & 0x1F, + L6474_TVAL_val = motor.GetParam(L6474_TVAL) & 0x7F; + + say_axis_status(axis, sh.STATUS_AXIS_RAW); + + SERIAL_ECHOPGM("...OverCurrent Threshold: "); + sprintf_P(temp_buf, PSTR("%2d ("), OverCurrent_Threshold); + SERIAL_ECHO(temp_buf); + SERIAL_ECHO((OverCurrent_Threshold + 1) * motor.OCD_CURRENT_CONSTANT_INV); + SERIAL_ECHOPGM(" mA)"); + SERIAL_ECHOPGM(" TVAL: "); + sprintf_P(temp_buf, PSTR("%2d ("), L6474_TVAL_val); + SERIAL_ECHO(temp_buf); + SERIAL_ECHO((L6474_TVAL_val + 1) * motor.STALL_CURRENT_CONSTANT_INV); + SERIAL_ECHOLNPGM(" mA) Motor Status: NA"); + + const uint16_t MicroSteps = _BV(motor.GetParam(L6470_STEP_MODE) & 0x07); //NOMORE(MicroSteps, 16); + SERIAL_ECHOPAIR("...MicroSteps: ", MicroSteps, + " ADC_OUT: ", L6470_ADC_out); + + SERIAL_ECHOLNPGM(" Vs_compensation: NA\n"); + SERIAL_ECHOLNPGM("...KVAL_HOLD: NA" + " KVAL_RUN : NA" + " KVAL_ACC: NA" + " KVAL_DEC: NA" + " V motor max = NA"); + + #if ENABLED(L6470_CHITCHAT) + DEBUG_ECHOPGM("...SLEW RATE: "); + switch ((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_POW_SR) >> CONFIG_POW_SR_BIT) { + case 0: DEBUG_ECHOLNPGM("320V/uS") ; break; + case 1: DEBUG_ECHOLNPGM("75V/uS") ; break; + case 2: DEBUG_ECHOLNPGM("110V/uS") ; break; + case 3: DEBUG_ECHOLNPGM("260V/uS") ; break; + default: DEBUG_ECHOLNPAIR("slew rate: ", (motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_POW_SR) >> CONFIG_POW_SR_BIT); break; + } + #endif + SERIAL_EOL(); + SERIAL_EOL(); + break; + } + } +} + +void GcodeSuite::M906() { + + L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status + + #define L6470_SET_KVAL_HOLD(Q) (AXIS_IS_L64XX(Q) ? stepper##Q.setTVALCurrent(value) : stepper##Q.SetParam(L6470_KVAL_HOLD, uint8_t(value))) + + DEBUG_ECHOLNPGM("M906"); + + uint8_t report_current = true; + + #if HAS_L64XX + const uint8_t index = parser.byteval('I'); + #endif + + LOOP_XYZE(i) if (uint16_t value = parser.intval(axis_codes[i])) { + + report_current = false; + + if (planner.has_blocks_queued() || planner.cleaning_buffer_counter) { + SERIAL_ECHOLNPGM("Test aborted. Can't set KVAL_HOLD while steppers are moving."); + return; + } + + switch (i) { + case X_AXIS: + #if AXIS_IS_L64XX(X) + if (index == 0) L6470_SET_KVAL_HOLD(X); + #endif + #if AXIS_IS_L64XX(X2) + if (index == 1) L6470_SET_KVAL_HOLD(X2); + #endif + break; + case Y_AXIS: + #if AXIS_IS_L64XX(Y) + if (index == 0) L6470_SET_KVAL_HOLD(Y); + #endif + #if AXIS_IS_L64XX(Y2) + if (index == 1) L6470_SET_KVAL_HOLD(Y2); + #endif + break; + case Z_AXIS: + #if AXIS_IS_L64XX(Z) + if (index == 0) L6470_SET_KVAL_HOLD(Z); + #endif + #if AXIS_IS_L64XX(Z2) + if (index == 1) L6470_SET_KVAL_HOLD(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + if (index == 2) L6470_SET_KVAL_HOLD(Z3); + #endif + #if AXIS_DRIVER_TYPE_Z4(L6470) + if (index == 3) L6470_SET_KVAL_HOLD(Z4); + #endif + break; + case E_AXIS: { + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + switch (target_extruder) { + #if AXIS_IS_L64XX(E0) + case 0: L6470_SET_KVAL_HOLD(E0); break; + #endif + #if AXIS_IS_L64XX(E1) + case 1: L6470_SET_KVAL_HOLD(E1); break; + #endif + #if AXIS_IS_L64XX(E2) + case 2: L6470_SET_KVAL_HOLD(E2); break; + #endif + #if AXIS_IS_L64XX(E3) + case 3: L6470_SET_KVAL_HOLD(E3); break; + #endif + #if AXIS_IS_L64XX(E4) + case 4: L6470_SET_KVAL_HOLD(E4); break; + #endif + #if AXIS_IS_L64XX(E5) + case 5: L6470_SET_KVAL_HOLD(E5); break; + #endif + #if AXIS_IS_L64XX(E6) + case 6: L6470_SET_KVAL_HOLD(E6); break; + #endif + #if AXIS_IS_L64XX(E7) + case 7: L6470_SET_KVAL_HOLD(E7); break; + #endif + } + } break; + } + } + + if (report_current) { + #define L64XX_REPORT_CURRENT(Q) L64XX_report_current(stepper##Q, Q) + + L64xxManager.spi_active = true; // Tell set_directions() a series of SPI transfers is underway + + #if AXIS_IS_L64XX(X) + L64XX_REPORT_CURRENT(X); + #endif + #if AXIS_IS_L64XX(X2) + L64XX_REPORT_CURRENT(X2); + #endif + #if AXIS_IS_L64XX(Y) + L64XX_REPORT_CURRENT(Y); + #endif + #if AXIS_IS_L64XX(Y2) + L64XX_REPORT_CURRENT(Y2); + #endif + #if AXIS_IS_L64XX(Z) + L64XX_REPORT_CURRENT(Z); + #endif + #if AXIS_IS_L64XX(Z2) + L64XX_REPORT_CURRENT(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + L64XX_REPORT_CURRENT(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + L64XX_REPORT_CURRENT(Z4); + #endif + #if AXIS_IS_L64XX(E0) + L64XX_REPORT_CURRENT(E0); + #endif + #if AXIS_IS_L64XX(E1) + L64XX_REPORT_CURRENT(E1); + #endif + #if AXIS_IS_L64XX(E2) + L64XX_REPORT_CURRENT(E2); + #endif + #if AXIS_IS_L64XX(E3) + L64XX_REPORT_CURRENT(E3); + #endif + #if AXIS_IS_L64XX(E4) + L64XX_REPORT_CURRENT(E4); + #endif + #if AXIS_IS_L64XX(E5) + L64XX_REPORT_CURRENT(E5); + #endif + #if AXIS_IS_L64XX(E6) + L64XX_REPORT_CURRENT(E6); + #endif + #if AXIS_IS_L64XX(E7) + L64XX_REPORT_CURRENT(E7); + #endif + + L64xxManager.spi_active = false; // done with all SPI transfers - clear handshake flags + L64xxManager.spi_abort = false; + L64xxManager.pause_monitor(false); + } +} + +#endif // HAS_L64XX diff --git a/Marlin/src/gcode/feature/L6470/M916-918.cpp b/Marlin/src/gcode/feature/L6470/M916-918.cpp new file mode 100644 index 00000000..8165b71e --- /dev/null +++ b/Marlin/src/gcode/feature/L6470/M916-918.cpp @@ -0,0 +1,651 @@ +/** + * 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 . + * + */ + +// +// NOTE: All tests assume each axis uses matching driver chips. +// + +#include "../../../inc/MarlinConfig.h" + +#if HAS_L64XX + +#include "../../gcode.h" +#include "../../../module/stepper/indirection.h" +#include "../../../module/planner.h" +#include "../../../libs/L64XX/L64XX_Marlin.h" + +#define DEBUG_OUT ENABLED(L6470_CHITCHAT) +#include "../../../core/debug_out.h" + +/** + * M916: increase KVAL_HOLD until get thermal warning + * NOTE - on L6474 it is TVAL that is used + * + * J - select which driver(s) to monitor on multi-driver axis + * 0 - (default) monitor all drivers on the axis or E0 + * 1 - monitor only X, Y, Z, E1 + * 2 - monitor only X2, Y2, Z2, E2 + * 3 - monitor only Z3, E3 + * 4 - monitor only Z4, E4 + * + * Xxxx, Yxxx, Zxxx, Exxx - axis to be monitored with displacement + * xxx (1-255) is distance moved on either side of current position + * + * F - feedrate + * optional - will use default max feedrate from configuration.h if not specified + * + * T - current (mA) setting for TVAL (0 - 4A in 31.25mA increments, rounds down) - L6474 only + * optional - will report current value from driver if not specified + * + * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) + * optional - will report current value from driver if not specified + * + * D - time (in seconds) to run each setting of KVAL_HOLD/TVAL + * optional - defaults to zero (runs each setting once) + */ + +/** + * This routine is also useful for determining the approximate KVAL_HOLD + * where the stepper stops losing steps. The sound will get noticeably quieter + * as it stops losing steps. + */ + +void GcodeSuite::M916() { + + DEBUG_ECHOLNPGM("M916"); + + L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status + + // Variables used by L64xxManager.get_user_input function - some may not be used + char axis_mon[3][3] = { {" "}, {" "}, {" "} }; // list of Axes to be monitored + L64XX_axis_t axis_index[3]; + uint16_t axis_status[3]; + uint8_t driver_count = 1; + float position_max; + float position_min; + float final_feedrate; + uint8_t kval_hold; + uint8_t OCD_TH_val = 0; + uint8_t STALL_TH_val = 0; + uint16_t over_current_threshold; + constexpr uint8_t over_current_flag = false; // M916 doesn't play with the overcurrent thresholds + + #define DRIVER_TYPE_L6474(Q) AXIS_DRIVER_TYPE_##Q(L6474) + + uint8_t j; // general purpose counter + + if (L64xxManager.get_user_input(driver_count, axis_index, axis_mon, position_max, position_min, final_feedrate, kval_hold, over_current_flag, OCD_TH_val, STALL_TH_val, over_current_threshold)) + return; // quit if invalid user input + + DEBUG_ECHOLNPAIR("feedrate = ", final_feedrate); + + planner.synchronize(); // wait for all current movement commands to complete + + const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; + for (j = 0; j < driver_count; j++) + L64xxManager.get_status(axis_index[j]); // clear out any pre-existing error flags + + char temp_axis_string[] = " "; + temp_axis_string[0] = axis_mon[0][0]; // need to have a string for use within sprintf format section + char gcode_string[80]; + uint16_t status_composite = 0; + + uint16_t M91x_counter = kval_hold; + uint16_t M91x_counter_max; + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { + M91x_counter_max = 128; // TVAL is 7 bits + LIMIT(M91x_counter, 0U, 127U); + } + else + M91x_counter_max = 256; // KVAL_HOLD is 8 bits + + uint8_t M91x_delay_s = parser.byteval('D'); // get delay in seconds + millis_t M91x_delay_ms = M91x_delay_s * 60 * 1000; + millis_t M91x_delay_end; + + DEBUG_ECHOLNPGM(".\n."); + + do { + + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) + DEBUG_ECHOLNPAIR("TVAL current (mA) = ", (M91x_counter + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV); // report TVAL current for this run + else + DEBUG_ECHOLNPAIR("kval_hold = ", M91x_counter); // report KVAL_HOLD for this run + + for (j = 0; j < driver_count; j++) + L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, M91x_counter); //set KVAL_HOLD or TVAL (same register address) + + M91x_delay_end = millis() + M91x_delay_ms; + do { + // turn the motor(s) both directions + sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(final_feedrate)); + gcode.process_subcommands_now_P(gcode_string); + + sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(final_feedrate)); + gcode.process_subcommands_now_P(gcode_string); + + // get the status after the motors have stopped + planner.synchronize(); + + status_composite = 0; // clear out the old bits + + for (j = 0; j < driver_count; j++) { + axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & sh.L6470_ERROR_MASK; // bits of interest are all active low + status_composite |= axis_status[j] ; + } + + if (status_composite) break; + } while (millis() < M91x_delay_end); + + if (status_composite) break; + + M91x_counter++; + + } while (!(status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)) && (M91x_counter < M91x_counter_max)); + + DEBUG_ECHOLNPGM("."); + + #if ENABLED(L6470_CHITCHAT) + if (status_composite) { + L64xxManager.error_status_decode(status_composite, axis_index[0], + sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, + sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, + sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); + DEBUG_ECHOLNPGM("."); + } + #endif + + if ((status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD))) + DEBUG_ECHOLNPGM(".\n.\nTest completed normally - Thermal warning/shutdown has occurred"); + else if (status_composite) + DEBUG_ECHOLNPGM(".\n.\nTest completed abnormally - non-thermal error has occured"); + else + DEBUG_ECHOLNPGM(".\n.\nTest completed normally - Unable to get to thermal warning/shutdown"); + + L64xxManager.pause_monitor(false); +} + +/** + * M917: Find minimum current thresholds + * + * Decrease OCD current until overcurrent error + * Increase OCD until overcurrent error goes away + * Decrease stall threshold until stall (not done on L6474) + * Increase stall until stall error goes away (not done on L6474) + * + * J - select which driver(s) to monitor on multi-driver axis + * 0 - (default) monitor all drivers on the axis or E0 + * 1 - monitor only X, Y, Z, E1 + * 2 - monitor only X2, Y2, Z2, E2 + * Xxxx, Yxxx, Zxxx, Exxx - axis to be monitored with displacement + * xxx (1-255) is distance moved on either side of current position + * + * F - feedrate + * optional - will use default max feedrate from Configuration.h if not specified + * + * I - starting over-current threshold + * optional - will report current value from driver if not specified + * if there are multiple drivers on the axis then all will be set the same + * + * T - current (mA) setting for TVAL (0 - 4A in 31.25mA increments, rounds down) - L6474 only + * optional - will report current value from driver if not specified + * + * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) + * optional - will report current value from driver if not specified + */ +void GcodeSuite::M917() { + + DEBUG_ECHOLNPGM("M917"); + + L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status + + char axis_mon[3][3] = { {" "}, {" "}, {" "} }; // list of Axes to be monitored + L64XX_axis_t axis_index[3]; + uint16_t axis_status[3]; + uint8_t driver_count = 1; + float position_max; + float position_min; + float final_feedrate; + uint8_t kval_hold; + uint8_t OCD_TH_val = 0; + uint8_t STALL_TH_val = 0; + uint16_t over_current_threshold; + constexpr uint8_t over_current_flag = true; + + uint8_t j; // general purpose counter + + if (L64xxManager.get_user_input(driver_count, axis_index, axis_mon, position_max, position_min, final_feedrate, kval_hold, over_current_flag, OCD_TH_val, STALL_TH_val, over_current_threshold)) + return; // quit if invalid user input + + DEBUG_ECHOLNPAIR("feedrate = ", final_feedrate); + + planner.synchronize(); // wait for all current movement commands to complete + + const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; + for (j = 0; j < driver_count; j++) + L64xxManager.get_status(axis_index[j]); // clear error flags + char temp_axis_string[] = " "; + temp_axis_string[0] = axis_mon[0][0]; // need a sprintf format string + char gcode_string[80]; + uint16_t status_composite = 0; + uint8_t test_phase = 0; // 0 - decreasing OCD - exit when OCD warning occurs (ignore STALL) + // 1 - increasing OCD - exit when OCD warning stops (ignore STALL) + // 2 - OCD finalized - decreasing STALL - exit when STALL warning happens + // 3 - OCD finalized - increasing STALL - exit when STALL warning stop + // 4 - all testing completed + DEBUG_ECHOPAIR(".\n.\n.\nover_current threshold : ", (OCD_TH_val + 1) * 375); // first status display + DEBUG_ECHOPAIR(" (OCD_TH: : ", OCD_TH_val); + if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) { + DEBUG_ECHOPAIR(") Stall threshold: ", (STALL_TH_val + 1) * 31.25); + DEBUG_ECHOPAIR(" (STALL_TH: ", STALL_TH_val); + } + DEBUG_ECHOLNPGM(")"); + + do { + + if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) DEBUG_ECHOPAIR("STALL threshold : ", (STALL_TH_val + 1) * 31.25); + DEBUG_ECHOLNPAIR(" OCD threshold : ", (OCD_TH_val + 1) * 375); + + sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(final_feedrate)); + gcode.process_subcommands_now_P(gcode_string); + + sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(final_feedrate)); + gcode.process_subcommands_now_P(gcode_string); + + planner.synchronize(); + + status_composite = 0; // clear out the old bits + + for (j = 0; j < driver_count; j++) { + axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & sh.L6470_ERROR_MASK; // bits of interest are all active low + status_composite |= axis_status[j]; + } + + if (status_composite && (status_composite & sh.STATUS_AXIS_UVLO)) { + DEBUG_ECHOLNPGM("Test aborted (Undervoltage lockout active)"); + #if ENABLED(L6470_CHITCHAT) + for (j = 0; j < driver_count; j++) { + if (j) DEBUG_ECHOPGM("..."); + L64xxManager.error_status_decode(axis_status[j], axis_index[j], + sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, + sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, + sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); + } + #endif + return; + } + + if (status_composite & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)) { + DEBUG_ECHOLNPGM("thermal problem - waiting for chip(s) to cool down "); + uint16_t status_composite_temp = 0; + uint8_t k = 0; + do { + k++; + if (!(k % 4)) { + kval_hold *= 0.95; + DEBUG_EOL(); + DEBUG_ECHOLNPAIR("Lowering KVAL_HOLD by about 5% to ", kval_hold); + for (j = 0; j < driver_count; j++) + L64xxManager.set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold); + } + DEBUG_ECHOLNPGM("."); + gcode.reset_stepper_timeout(); // reset_stepper_timeout to keep steppers powered + watchdog_refresh();; // beat the dog + safe_delay(5000); + status_composite_temp = 0; + for (j = 0; j < driver_count; j++) { + axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & sh.L6470_ERROR_MASK; // bits of interest are all active low + status_composite_temp |= axis_status[j]; + } + } + while (status_composite_temp & (sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)); + DEBUG_EOL(); + } + if (status_composite & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B | sh.STATUS_AXIS_OCD)) { + switch (test_phase) { + + case 0: { + if (status_composite & sh.STATUS_AXIS_OCD) { + // phase 0 with OCD warning - time to go to next phase + if (OCD_TH_val >= sh.AXIS_OCD_TH_MAX) { + OCD_TH_val = sh.AXIS_OCD_TH_MAX; // limit to max + test_phase = 2; // at highest value so skip phase 1 + //DEBUG_ECHOLNPGM("LOGIC E0A OCD at highest - skip to 2"); + DEBUG_ECHOLNPGM("OCD at highest - OCD finalized"); + } + else { + OCD_TH_val++; // normal exit to next phase + test_phase = 1; // setup for first pass of phase 1 + //DEBUG_ECHOLNPGM("LOGIC E0B - inc OCD & go to 1"); + DEBUG_ECHOLNPGM("inc OCD"); + } + } + else { // phase 0 without OCD warning - keep on decrementing if can + if (OCD_TH_val) { + OCD_TH_val--; // try lower value + //DEBUG_ECHOLNPGM("LOGIC E0C - dec OCD"); + DEBUG_ECHOLNPGM("dec OCD"); + } + else { + test_phase = 2; // at lowest value without warning so skip phase 1 + //DEBUG_ECHOLNPGM("LOGIC E0D - OCD at latest - go to 2"); + DEBUG_ECHOLNPGM("OCD finalized"); + } + } + } break; + + case 1: { + if (status_composite & sh.STATUS_AXIS_OCD) { + // phase 1 with OCD warning - increment if can + if (OCD_TH_val >= sh.AXIS_OCD_TH_MAX) { + OCD_TH_val = sh.AXIS_OCD_TH_MAX; // limit to max + test_phase = 2; // at highest value so go to next phase + //DEBUG_ECHOLNPGM("LOGIC E1A - OCD at max - go to 2"); + DEBUG_ECHOLNPGM("OCD finalized"); + } + else { + OCD_TH_val++; // try a higher value + //DEBUG_ECHOLNPGM("LOGIC E1B - inc OCD"); + DEBUG_ECHOLNPGM("inc OCD"); + } + } + else { // phase 1 without OCD warning - normal exit to phase 2 + test_phase = 2; + //DEBUG_ECHOLNPGM("LOGIC E1C - no OCD warning - go to 1"); + DEBUG_ECHOLNPGM("OCD finalized"); + } + } break; + + case 2: { + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 + test_phase = 4; + break; + } + if (status_composite & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B)) { + // phase 2 with stall warning - time to go to next phase + if (STALL_TH_val >= 127) { + STALL_TH_val = 127; // limit to max + //DEBUG_ECHOLNPGM("LOGIC E2A - STALL warning, STALL at max, quit"); + DEBUG_ECHOLNPGM("finished - STALL at maximum value but still have stall warning"); + test_phase = 4; + } + else { + test_phase = 3; // normal exit to next phase (found failing value of STALL) + STALL_TH_val++; // setup for first pass of phase 3 + //DEBUG_ECHOLNPGM("LOGIC E2B - INC - STALL warning, inc Stall, go to 3"); + DEBUG_ECHOLNPGM("inc Stall"); + } + } + else { // phase 2 without stall warning - decrement if can + if (STALL_TH_val) { + STALL_TH_val--; // try a lower value + //DEBUG_ECHOLNPGM("LOGIC E2C - no STALL, dec STALL"); + DEBUG_ECHOLNPGM("dec STALL"); + } + else { + DEBUG_ECHOLNPGM("finished - STALL at lowest value but still do NOT have stall warning"); + test_phase = 4; + //DEBUG_ECHOLNPGM("LOGIC E2D - no STALL, at lowest so quit"); + } + } + } break; + + case 3: { + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 + test_phase = 4; + break; + } + if (status_composite & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B)) { + // phase 3 with stall warning - increment if can + if (STALL_TH_val >= 127) { + STALL_TH_val = 127; // limit to max + DEBUG_ECHOLNPGM("finished - STALL at maximum value but still have stall warning"); + test_phase = 4; + //DEBUG_ECHOLNPGM("LOGIC E3A - STALL, at max so quit"); + } + else { + STALL_TH_val++; // still looking for passing value + //DEBUG_ECHOLNPGM("LOGIC E3B - STALL, inc stall"); + DEBUG_ECHOLNPGM("inc stall"); + } + } + else { //phase 3 without stall warning but have OCD warning + DEBUG_ECHOLNPGM("Hardware problem - OCD warning without STALL warning"); + test_phase = 4; + //DEBUG_ECHOLNPGM("LOGIC E3C - not STALLED, hardware problem (quit)"); + } + } break; + + } + + } + else { + switch (test_phase) { + case 0: { // phase 0 without OCD warning - keep on decrementing if can + if (OCD_TH_val) { + OCD_TH_val--; // try lower value + //DEBUG_ECHOLNPGM("LOGIC N0A - DEC OCD"); + DEBUG_ECHOLNPGM("DEC OCD"); + } + else { + test_phase = 2; // at lowest value without warning so skip phase 1 + //DEBUG_ECHOLNPGM("LOGIC N0B - OCD at lowest (go to phase 2)"); + DEBUG_ECHOLNPGM("OCD finalized"); + } + } break; + + case 1: //DEBUG_ECHOLNPGM("LOGIC N1 (go directly to 2)"); // phase 1 without OCD warning - drop directly to phase 2 + DEBUG_ECHOLNPGM("OCD finalized"); + + case 2: { // phase 2 without stall warning - keep on decrementing if can + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 + test_phase = 4; + break; + } + if (STALL_TH_val) { + STALL_TH_val--; // try a lower value (stay in phase 2) + //DEBUG_ECHOLNPGM("LOGIC N2B - dec STALL"); + DEBUG_ECHOLNPGM("dec STALL"); + } + else { + DEBUG_ECHOLNPGM("finished - STALL at lowest value but still no stall warning"); + test_phase = 4; + //DEBUG_ECHOLNPGM("LOGIC N2C - STALL at lowest (quit)"); + } + } break; + + case 3: { + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // skip all STALL_TH steps if L6474 + test_phase = 4; + break; + } + test_phase = 4; + //DEBUG_ECHOLNPGM("LOGIC N3 - finished!"); + DEBUG_ECHOLNPGM("finished!"); + } break; // phase 3 without any warnings - desired exit + } // + } // end of status checks + + if (test_phase != 4) { + for (j = 0; j < driver_count; j++) { // update threshold(s) + L64xxManager.set_param(axis_index[j], L6470_OCD_TH, OCD_TH_val); + if (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT) L64xxManager.set_param(axis_index[j], L6470_STALL_TH, STALL_TH_val); + if (L64xxManager.get_param(axis_index[j], L6470_OCD_TH) != OCD_TH_val) DEBUG_ECHOLNPGM("OCD mismatch"); + if ((L64xxManager.get_param(axis_index[j], L6470_STALL_TH) != STALL_TH_val) && (sh.STATUS_AXIS_LAYOUT != L6474_STATUS_LAYOUT)) DEBUG_ECHOLNPGM("STALL mismatch"); + } + } + + } while (test_phase != 4); + + DEBUG_ECHOLNPGM("."); + if (status_composite) { + #if ENABLED(L6470_CHITCHAT) + for (j = 0; j < driver_count; j++) { + if (j) DEBUG_ECHOPGM("..."); + L64xxManager.error_status_decode(axis_status[j], axis_index[j], + sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, + sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, + sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); + } + DEBUG_ECHOLNPGM("."); + #endif + DEBUG_ECHOLNPGM("Completed with errors"); + } + else + DEBUG_ECHOLNPGM("Completed with no errors"); + DEBUG_ECHOLNPGM("."); + + L64xxManager.pause_monitor(false); +} + +/** + * M918: increase speed until error or max feedrate achieved (as shown in configuration.h)) + * + * J - select which driver(s) to monitor on multi-driver axis + * 0 - (default) monitor all drivers on the axis or E0 + * 1 - monitor only X, Y, Z, E1 + * 2 - monitor only X2, Y2, Z2, E2 + * Xxxx, Yxxx, Zxxx, Exxx - axis to be monitored with displacement + * xxx (1-255) is distance moved on either side of current position + * + * I - over current threshold + * optional - will report current value from driver if not specified + * + * T - current (mA) setting for TVAL (0 - 4A in 31.25mA increments, rounds down) - L6474 only + * optional - will report current value from driver if not specified + * + * K - value for KVAL_HOLD (0 - 255) (ignored for L6474) + * optional - will report current value from driver if not specified + * + * M - value for microsteps (1 - 128) (optional) + * optional - will report current value from driver if not specified + */ +void GcodeSuite::M918() { + + DEBUG_ECHOLNPGM("M918"); + + L64xxManager.pause_monitor(true); // Keep monitor_driver() from stealing status + + char axis_mon[3][3] = { {" "}, {" "}, {" "} }; // list of Axes to be monitored + L64XX_axis_t axis_index[3]; + uint16_t axis_status[3]; + uint8_t driver_count = 1; + float position_max, position_min; + float final_feedrate; + uint8_t kval_hold; + uint8_t OCD_TH_val = 0; + uint8_t STALL_TH_val = 0; + uint16_t over_current_threshold; + constexpr uint8_t over_current_flag = true; + + const L64XX_Marlin::L64XX_shadow_t &sh = L64xxManager.shadow; + + uint8_t j; // general purpose counter + + if (L64xxManager.get_user_input(driver_count, axis_index, axis_mon, position_max, position_min, final_feedrate, kval_hold, over_current_flag, OCD_TH_val, STALL_TH_val, over_current_threshold)) + return; // quit if invalid user input + + L64xxManager.get_status(axis_index[0]); // populate shadow array + + uint8_t m_steps = parser.byteval('M'); + + if (m_steps != 0) { + LIMIT(m_steps, 1, sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT ? 16 : 128); // L6474 + + uint8_t stepVal; + for (stepVal = 0; stepVal < 8; stepVal++) { // convert to L64xx register value + if (m_steps == 1) break; + m_steps >>= 1; + } + + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) + stepVal |= 0x98; // NO SYNC + else + stepVal |= (!SYNC_EN) | SYNC_SEL_1 | stepVal; + + for (j = 0; j < driver_count; j++) { + L64xxManager.set_param(axis_index[j], dSPIN_HARD_HIZ, 0); // can't write STEP register if stepper being powered + // results in an extra NOOP being sent (data 00) + L64xxManager.set_param(axis_index[j], L6470_STEP_MODE, stepVal); // set microsteps + } + } + m_steps = L64xxManager.get_param(axis_index[0], L6470_STEP_MODE) & 0x07; // get microsteps + + DEBUG_ECHOLNPAIR("Microsteps = ", _BV(m_steps)); + DEBUG_ECHOLNPAIR("target (maximum) feedrate = ", final_feedrate); + + const float feedrate_inc = final_feedrate / 10, // Start at 1/10 of max & go up by 1/10 per step + fr_limit = final_feedrate * 0.99f; // Rounding-safe comparison value + float current_feedrate = 0; + + planner.synchronize(); // Wait for moves to complete + + for (j = 0; j < driver_count; j++) + L64xxManager.get_status(axis_index[j]); // Clear error flags + + char temp_axis_string[2] = " "; + temp_axis_string[0] = axis_mon[0][0]; // Need a sprintf format string + //temp_axis_string[1] = '\n'; + + char gcode_string[80]; + uint16_t status_composite = 0; + DEBUG_ECHOLNPGM(".\n.\n."); // Make feedrate outputs easier to read + + do { + current_feedrate += feedrate_inc; + DEBUG_ECHOLNPAIR("...feedrate = ", current_feedrate); + + sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_min), uint16_t(current_feedrate)); + gcode.process_subcommands_now_P(gcode_string); + + sprintf_P(gcode_string, PSTR("G0 %s%03d F%03d"), temp_axis_string, uint16_t(position_max), uint16_t(current_feedrate)); + gcode.process_subcommands_now_P(gcode_string); + + planner.synchronize(); + + for (j = 0; j < driver_count; j++) { + axis_status[j] = (~L64xxManager.get_status(axis_index[j])) & 0x0800; // Bits of interest are all active LOW + status_composite |= axis_status[j]; + } + if (status_composite) break; // Break on any error + } while (current_feedrate < fr_limit); + + DEBUG_ECHOPGM("Completed with "); + if (status_composite) { + DEBUG_ECHOLNPGM("errors"); + #if ENABLED(L6470_CHITCHAT) + for (j = 0; j < driver_count; j++) { + if (j) DEBUG_ECHOPGM("..."); + L64xxManager.error_status_decode(axis_status[j], axis_index[j], + sh.STATUS_AXIS_TH_SD, sh.STATUS_AXIS_TH_WRN, + sh.STATUS_AXIS_STEP_LOSS_A, sh.STATUS_AXIS_STEP_LOSS_B, + sh.STATUS_AXIS_OCD, sh.STATUS_AXIS_LAYOUT); + } + #endif + } + else + DEBUG_ECHOLNPGM("no errors"); + + L64xxManager.pause_monitor(false); +} + +#endif // HAS_L64XX diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp new file mode 100644 index 00000000..5c7155d7 --- /dev/null +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -0,0 +1,147 @@ +/** + * 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(LIN_ADVANCE) + +#include "../../gcode.h" +#include "../../../module/planner.h" +#include "../../../module/stepper.h" + +#if ENABLED(EXTRA_LIN_ADVANCE_K) + float other_extruder_advance_K[EXTRUDERS]; + uint8_t lin_adv_slot = 0; +#endif + +/** + * M900: Get or Set Linear Advance K-factor + * T Which tool to address + * K Set current advance K factor (Slot 0). + * L Set secondary advance K factor (Slot 1). Requires EXTRA_LIN_ADVANCE_K. + * S<0/1> Activate slot 0 or 1. Requires EXTRA_LIN_ADVANCE_K. + */ +void GcodeSuite::M900() { + + auto echo_value_oor = [](const char ltr, const bool ten=true) { + SERIAL_CHAR('?'); SERIAL_CHAR(ltr); + SERIAL_ECHOPGM(" value out of range"); + if (ten) SERIAL_ECHOPGM(" (0-10)"); + SERIAL_ECHOLNPGM("."); + }; + + #if EXTRUDERS < 2 + constexpr uint8_t tool_index = 0; + #else + const uint8_t tool_index = parser.intval('T', active_extruder); + if (tool_index >= EXTRUDERS) { + echo_value_oor('T', false); + return; + } + #endif + + float &kref = planner.extruder_advance_K[tool_index], newK = kref; + const float oldK = newK; + + #if ENABLED(EXTRA_LIN_ADVANCE_K) + + float &lref = other_extruder_advance_K[tool_index]; + + const bool old_slot = TEST(lin_adv_slot, tool_index), // The tool's current slot (0 or 1) + new_slot = parser.boolval('S', old_slot); // The passed slot (default = current) + + // If a new slot is being selected swap the current and + // saved K values. Do here so K/L will apply correctly. + if (new_slot != old_slot) { // Not the same slot? + SET_BIT_TO(lin_adv_slot, tool_index, new_slot); // Update the slot for the tool + newK = lref; // Get new K value from backup + lref = oldK; // Save K to backup + } + + // Set the main K value. Apply if the main slot is active. + if (parser.seenval('K')) { + const float K = parser.value_float(); + if (!WITHIN(K, 0, 10)) echo_value_oor('K'); + else if (new_slot) lref = K; // S1 Knn + else newK = K; // S0 Knn + } + + // Set the extra K value. Apply if the extra slot is active. + if (parser.seenval('L')) { + const float L = parser.value_float(); + if (!WITHIN(L, 0, 10)) echo_value_oor('L'); + else if (!new_slot) lref = L; // S0 Lnn + else newK = L; // S1 Lnn + } + + #else + + if (parser.seenval('K')) { + const float K = parser.value_float(); + if (WITHIN(K, 0, 10)) + newK = K; + else + echo_value_oor('K'); + } + + #endif + + if (newK != oldK) { + planner.synchronize(); + kref = newK; + } + + if (!parser.seen_any()) { + + #if ENABLED(EXTRA_LIN_ADVANCE_K) + + #if EXTRUDERS < 2 + SERIAL_ECHOLNPAIR("Advance S", int(new_slot), " K", kref, "(S", int(!new_slot), " K", lref, ")"); + #else + LOOP_L_N(i, EXTRUDERS) { + const bool slot = TEST(lin_adv_slot, i); + SERIAL_ECHOLNPAIR("Advance T", int(i), " S", int(slot), " K", planner.extruder_advance_K[i], + "(S", int(!slot), " K", other_extruder_advance_K[i], ")"); + SERIAL_EOL(); + } + #endif + + #else + + SERIAL_ECHO_START(); + #if EXTRUDERS < 2 + SERIAL_ECHOLNPAIR("Advance K=", planner.extruder_advance_K[0]); + #else + SERIAL_ECHOPGM("Advance K"); + LOOP_L_N(i, EXTRUDERS) { + SERIAL_CHAR(' ', '0' + i, ':'); + SERIAL_DECIMAL(planner.extruder_advance_K[i]); + } + SERIAL_EOL(); + #endif + + #endif + } + +} + +#endif // LIN_ADVANCE diff --git a/Marlin/src/gcode/feature/baricuda/M126-M129.cpp b/Marlin/src/gcode/feature/baricuda/M126-M129.cpp new file mode 100644 index 00000000..edeba0d2 --- /dev/null +++ b/Marlin/src/gcode/feature/baricuda/M126-M129.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/MarlinConfig.h" + +#if ENABLED(BARICUDA) + +#include "../../gcode.h" +#include "../../../feature/baricuda.h" + +#if HAS_HEATER_1 + + /** + * M126: Heater 1 valve open + */ + void GcodeSuite::M126() { baricuda_valve_pressure = parser.byteval('S', 255); } + + /** + * M127: Heater 1 valve close + */ + void GcodeSuite::M127() { baricuda_valve_pressure = 0; } + +#endif // HAS_HEATER_1 + +#if HAS_HEATER_2 + + /** + * M128: Heater 2 valve open + */ + void GcodeSuite::M128() { baricuda_e_to_p_pressure = parser.byteval('S', 255); } + + /** + * M129: Heater 2 valve close + */ + void GcodeSuite::M129() { baricuda_e_to_p_pressure = 0; } + +#endif // HAS_HEATER_2 + +#endif // BARICUDA diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp new file mode 100644 index 00000000..fc350d8a --- /dev/null +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -0,0 +1,204 @@ +/** + * 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(PHOTO_GCODE) + +#include "../../gcode.h" +#include "../../../module/motion.h" // for active_extruder and current_position + +#if PIN_EXISTS(CHDK) + millis_t chdk_timeout; // = 0 +#endif + +#if defined(PHOTO_POSITION) && PHOTO_DELAY_MS > 0 + #include "../../../MarlinCore.h" // for idle() +#endif + +#ifdef PHOTO_RETRACT_MM + + #define _PHOTO_RETRACT_MM (PHOTO_RETRACT_MM + 0) + + #include "../../../module/planner.h" + #include "../../../module/temperature.h" + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../../../feature/pause.h" + #endif + + #ifdef PHOTO_RETRACT_MM + inline void e_move_m240(const float length, const feedRate_t &fr_mm_s) { + if (length && thermalManager.hotEnoughToExtrude(active_extruder)) + unscaled_e_move(length, fr_mm_s); + } + #endif + +#endif + +#if PIN_EXISTS(PHOTOGRAPH) + + FORCE_INLINE void set_photo_pin(const uint8_t state) { + constexpr uint32_t pulse_length = ( + #ifdef PHOTO_PULSES_US + PHOTO_PULSE_DELAY_US + #else + 15 // 15.24 from _delay_ms(0.01524) + #endif + ); + WRITE(PHOTOGRAPH_PIN, state); + delayMicroseconds(pulse_length); + } + + FORCE_INLINE void tweak_photo_pin() { set_photo_pin(HIGH); set_photo_pin(LOW); } + + #ifdef PHOTO_PULSES_US + + inline void pulse_photo_pin(const uint32_t duration, const uint8_t state) { + if (state) { + for (const uint32_t stop = micros() + duration; micros() < stop;) + tweak_photo_pin(); + } + else + delayMicroseconds(duration); + } + + inline void spin_photo_pin() { + static constexpr uint32_t sequence[] = PHOTO_PULSES_US; + LOOP_L_N(i, COUNT(sequence)) + pulse_photo_pin(sequence[i], !(i & 1)); + } + + #else + + constexpr uint8_t NUM_PULSES = 16; + inline void spin_photo_pin() { for (uint8_t i = NUM_PULSES; i--;) tweak_photo_pin(); } + + #endif +#endif + +/** + * M240: Trigger a camera by... + * + * - CHDK : Emulate a Canon RC-1 with a configurable ON duration. + * https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + * - PHOTOGRAPH_PIN : Pulse a digital pin 16 times. + * 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. + * + * PHOTO_POSITION parameters: + * A - X offset to the return position + * B - Y offset to the return position + * F - Override the XY movement feedrate + * R - Retract/recover length (current units) + * S - Retract/recover feedrate (mm/m) + * X - Move to X before triggering the shutter + * Y - Move to Y before triggering the shutter + * Z - Raise Z by a distance before triggering the shutter + * + * PHOTO_SWITCH_POSITION parameters: + * D - Duration (ms) to hold down switch (Requires PHOTO_SWITCH_MS) + * P - Delay (ms) after triggering the shutter (Requires PHOTO_SWITCH_MS) + * I - Switch trigger position override X + * J - Switch trigger position override Y + */ +void GcodeSuite::M240() { + + #ifdef PHOTO_POSITION + + if (homing_needed_error()) return; + + const xyz_pos_t old_pos = { + current_position.x + parser.linearval('A'), + current_position.y + parser.linearval('B'), + current_position.z + }; + + #ifdef PHOTO_RETRACT_MM + const float rval = parser.seenval('R') ? parser.value_linear_units() : _PHOTO_RETRACT_MM; + feedRate_t sval = ( + #if ENABLED(ADVANCED_PAUSE_FEATURE) + PAUSE_PARK_RETRACT_FEEDRATE + #elif ENABLED(FWRETRACT) + RETRACT_FEEDRATE + #else + 45 + #endif + ); + if (parser.seenval('S')) sval = parser.value_feedrate(); + e_move_m240(-rval, sval); + #endif + + feedRate_t fr_mm_s = MMM_TO_MMS(parser.linearval('F')); + if (fr_mm_s) NOLESS(fr_mm_s, 10.0f); + + constexpr xyz_pos_t photo_position = PHOTO_POSITION; + xyz_pos_t raw = { + parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : photo_position.x, + parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_position.y, + (parser.seenval('Z') ? parser.value_linear_units() : photo_position.z) + current_position.z + }; + apply_motion_limits(raw); + do_blocking_move_to(raw, fr_mm_s); + + #ifdef PHOTO_SWITCH_POSITION + constexpr xy_pos_t photo_switch_position = PHOTO_SWITCH_POSITION; + const xy_pos_t sraw = { + parser.seenval('I') ? RAW_X_POSITION(parser.value_linear_units()) : photo_switch_position.x, + parser.seenval('J') ? RAW_Y_POSITION(parser.value_linear_units()) : photo_switch_position.y + }; + do_blocking_move_to_xy(sraw, get_homing_bump_feedrate(X_AXIS)); + #if PHOTO_SWITCH_MS > 0 + safe_delay(parser.intval('D', PHOTO_SWITCH_MS)); + #endif + do_blocking_move_to(raw); + #endif + + #endif + + #if PIN_EXISTS(CHDK) + + OUT_WRITE(CHDK_PIN, HIGH); + chdk_timeout = millis() + parser.intval('D', PHOTO_SWITCH_MS); + + #elif HAS_PHOTOGRAPH + + spin_photo_pin(); + delay(7.33); + spin_photo_pin(); + + #endif + + #ifdef PHOTO_POSITION + #if PHOTO_DELAY_MS > 0 + const millis_t timeout = millis() + parser.intval('P', PHOTO_DELAY_MS); + while (PENDING(millis(), timeout)) idle(); + #endif + do_blocking_move_to(old_pos, fr_mm_s); + #ifdef PHOTO_RETRACT_MM + e_move_m240(rval, sval); + #endif + #endif +} + +#endif // PHOTO_GCODE diff --git a/Marlin/src/gcode/feature/cancel/M486.cpp b/Marlin/src/gcode/feature/cancel/M486.cpp new file mode 100644 index 00000000..1f14ae0f --- /dev/null +++ b/Marlin/src/gcode/feature/cancel/M486.cpp @@ -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 . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(CANCEL_OBJECTS) + +#include "../../gcode.h" +#include "../../../feature/cancel_object.h" + +/** + * M486: A simple interface to cancel objects + * + * T[count] : Reset objects and/or set the count + * S : Start an object with the given index + * P : Cancel the object with the given index + * U : Un-cancel object with the given index + * C : Cancel the current object (the last index given by S) + * S-1 : Start a non-object like a brim or purge tower that should always print + */ +void GcodeSuite::M486() { + + if (parser.seen('T')) { + cancelable.reset(); + cancelable.object_count = parser.intval('T', 1); + } + + if (parser.seen('S')) + cancelable.set_active_object(parser.value_int()); + + if (parser.seen('C')) cancelable.cancel_active_object(); + + if (parser.seen('P')) cancelable.cancel_object(parser.value_int()); + + if (parser.seen('U')) cancelable.uncancel_object(parser.value_int()); +} + +#endif // CANCEL_OBJECTS diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp new file mode 100644 index 00000000..bb6b57f6 --- /dev/null +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -0,0 +1,66 @@ +/** + * 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(CASE_LIGHT_ENABLE) + +#include "../../../feature/caselight.h" +#include "../../gcode.h" + +/** + * 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(); + } + 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/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp new file mode 100644 index 00000000..216db5ba --- /dev/null +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -0,0 +1,80 @@ +/** + * 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(NOZZLE_CLEAN_FEATURE) + +#include "../../../libs/nozzle.h" + +#include "../../gcode.h" +#include "../../parser.h" +#include "../../../module/motion.h" + +#if HAS_LEVELING + #include "../../../module/planner.h" + #include "../../../feature/bedlevel/bedlevel.h" +#endif + +/** + * G12: Clean the nozzle + * + * E : 0=Never or 1=Always apply the "software endstop" limits + * P0 S : Stroke cleaning with S strokes + * P1 Sn T : Zigzag cleaning with S repeats and T zigzags + * P2 Sn R : Circle cleaning with S repeats and R radius + */ +void GcodeSuite::G12() { + // Don't allow nozzle cleaning without homing first + if (homing_needed_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); + const float radius = parser.linearval('R', NOZZLE_CLEAN_CIRCLE_RADIUS); + + const bool seenxyz = parser.seen("XYZ"); + const uint8_t cleans = (!seenxyz || parser.boolval('X') ? _BV(X_AXIS) : 0) + | (!seenxyz || parser.boolval('Y') ? _BV(Y_AXIS) : 0) + | TERN(NOZZLE_CLEAN_NO_Z, 0, (!seenxyz || parser.boolval('Z') ? _BV(Z_AXIS) : 0)) + ; + + #if HAS_LEVELING + // Disable bed leveling if cleaning Z + TEMPORARY_BED_LEVELING_STATE(!TEST(cleans, Z_AXIS) && planner.leveling_active); + #endif + + SET_SOFT_ENDSTOP_LOOSE(!parser.boolval('E')); + + nozzle.clean(pattern, strokes, radius, objects, cleans); + + SET_SOFT_ENDSTOP_LOOSE(false); +} + +#endif // NOZZLE_CLEAN_FEATURE diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp new file mode 100644 index 00000000..67d4ad8a --- /dev/null +++ b/Marlin/src/gcode/feature/controllerfan/M710.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 . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(CONTROLLER_FAN_EDITABLE) + +#include "../../gcode.h" +#include "../../../feature/controllerfan.h" + +void M710_report(const bool forReplay) { + if (!forReplay) { SERIAL_ECHOLNPGM("; Controller Fan"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR(" M710" + " S", int(controllerFan.settings.active_speed), + " I", int(controllerFan.settings.idle_speed), + " A", int(controllerFan.settings.auto_mode), + " D", controllerFan.settings.duration, + " ; (", (int(controllerFan.settings.active_speed) * 100) / 255, "%" + " ", (int(controllerFan.settings.idle_speed) * 100) / 255, "%)" + ); +} + +/** + * M710: Set controller fan settings + * + * R : Reset to defaults + * S[0-255] : Fan speed when motors are active + * I[0-255] : Fan speed when motors are idle + * A[0|1] : Turn auto mode on or off + * D : Set auto mode idle duration + * + * Examples: + * M710 ; Report current Settings + * M710 R ; Reset SIAD to defaults + * M710 I64 ; Set controller fan Idle Speed to 25% + * M710 S255 ; Set controller fan Active Speed to 100% + * M710 S0 ; Set controller fan Active Speed to OFF + * M710 I255 A0 ; Set controller fan Idle Speed to 100% with Auto Mode OFF + * M710 I127 A1 S255 D160 ; Set controller fan idle speed 50%, AutoMode On, Fan speed 100%, duration to 160 Secs + */ +void GcodeSuite::M710() { + + const bool seenR = parser.seen('R'); + if (seenR) controllerFan.reset(); + + const bool seenS = parser.seenval('S'); + if (seenS) controllerFan.settings.active_speed = parser.value_byte(); + + const bool seenI = parser.seenval('I'); + if (seenI) controllerFan.settings.idle_speed = parser.value_byte(); + + const bool seenA = parser.seenval('A'); + if (seenA) controllerFan.settings.auto_mode = parser.value_bool(); + + const bool seenD = parser.seenval('D'); + if (seenD) controllerFan.settings.duration = parser.value_ushort(); + + if (!(seenR || seenS || seenI || seenA || seenD)) + M710_report(false); +} + +#endif // CONTROLLER_FAN_EDITABLE diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp new file mode 100644 index 00000000..e4636662 --- /dev/null +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -0,0 +1,102 @@ +/** + * 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 ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) + +#include "../../gcode.h" + +#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + #include "../../../module/stepper.h" +#endif + +#if HAS_MOTOR_CURRENT_I2C + #include "../../../feature/digipot/digipot.h" +#endif + +#if ENABLED(HAS_MOTOR_CURRENT_DAC) + #include "../../../feature/dac/stepper_dac.h" +#endif + +/** + * M907: Set digital trimpot motor current using axis codes X, Y, Z, E, B, S + */ +void GcodeSuite::M907() { + #if HAS_MOTOR_CURRENT_SPI + + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.set_digipot_current(i, parser.value_int()); + if (parser.seenval('B')) stepper.set_digipot_current(4, parser.value_int()); + if (parser.seenval('S')) LOOP_LE_N(i, 4) stepper.set_digipot_current(i, parser.value_int()); + + #elif HAS_MOTOR_CURRENT_PWM + + #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY) + if (parser.seenval('X') || parser.seenval('Y')) stepper.set_digipot_current(0, parser.value_int()); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int()); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int()); + #endif + + #endif + + #if HAS_MOTOR_CURRENT_I2C + // this one uses actual amps in floating point + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) digipot_i2c.set_current(i, parser.value_float()); + // Additional extruders use B,C,D for channels 4,5,6. + // TODO: Change these parameters because 'E' is used. B? + for (uint8_t i = E_AXIS + 1; i < DIGIPOT_I2C_NUM_CHANNELS; i++) + if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float()); + #endif + + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + if (parser.seenval('S')) { + const float dac_percent = parser.value_float(); + LOOP_LE_N(i, 4) stepper_dac.set_current_percent(i, dac_percent); + } + LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper_dac.set_current_percent(i, parser.value_float()); + #endif +} + +#if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) + + /** + * M908: Control digital trimpot directly (M908 P S) + */ + void GcodeSuite::M908() { + TERN_(HAS_MOTOR_CURRENT_SPI, stepper.set_digipot_value_spi(parser.intval('P'), parser.intval('S'))); + TERN_(HAS_MOTOR_CURRENT_DAC, stepper_dac.set_current_value(parser.byteval('P', -1), parser.ushortval('S', 0))); + } + + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + + void GcodeSuite::M909() { stepper_dac.print_values(); } + void GcodeSuite::M910() { stepper_dac.commit_eeprom(); } + + #endif // HAS_MOTOR_CURRENT_DAC + +#endif // HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_DAC + +#endif // HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM || HAS_MOTOR_CURRENT_I2C || HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/gcode/feature/filwidth/M404-M407.cpp b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp new file mode 100644 index 00000000..516289fe --- /dev/null +++ b/Marlin/src/gcode/feature/filwidth/M404-M407.cpp @@ -0,0 +1,72 @@ +/** + * 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(FILAMENT_WIDTH_SENSOR) + +#include "../../../feature/filwidth.h" +#include "../../../module/planner.h" +#include "../../../module/temperature.h" +#include "../../../MarlinCore.h" +#include "../../gcode.h" + +/** + * M404: Display or set (in current units) the nominal filament width (3mm, 1.75mm ) W<3.0> + */ +void GcodeSuite::M404() { + if (parser.seenval('W')) { + filwidth.nominal_mm = parser.value_linear_units(); + planner.volumetric_area_nominal = CIRCLE_AREA(filwidth.nominal_mm * 0.5); + } + else + SERIAL_ECHOLNPAIR("Filament dia (nominal mm):", filwidth.nominal_mm); +} + +/** + * M405: Turn on filament sensor for control + */ +void GcodeSuite::M405() { + // This is technically a linear measurement, but since it's quantized to centimeters and is a different + // unit than everything else, it uses parser.value_byte() instead of parser.value_linear_units(). + if (parser.seenval('D')) + filwidth.set_delay_cm(parser.value_byte()); + + filwidth.enable(true); +} + +/** + * M406: Turn off filament sensor for control + */ +void GcodeSuite::M406() { + filwidth.enable(false); + planner.calculate_volumetric_multipliers(); // Restore correct 'volumetric_multiplier' value +} + +/** + * M407: Get measured filament diameter on serial output + */ +void GcodeSuite::M407() { + SERIAL_ECHOLNPAIR("Filament dia (measured mm):", filwidth.measured_mm); +} + +#endif // FILAMENT_WIDTH_SENSOR diff --git a/Marlin/src/gcode/feature/fwretract/G10_G11.cpp b/Marlin/src/gcode/feature/fwretract/G10_G11.cpp new file mode 100644 index 00000000..219502f2 --- /dev/null +++ b/Marlin/src/gcode/feature/fwretract/G10_G11.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 . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(FWRETRACT) + +#include "../../../feature/fwretract.h" +#include "../../gcode.h" +#include "../../../module/motion.h" + +/** + * G10 - Retract filament according to settings of M207 + * TODO: Handle 'G10 P' for tool settings and 'G10 L' for workspace settings + */ +void GcodeSuite::G10() { + #if HAS_MULTI_EXTRUDER + const bool rs = parser.boolval('S'); + #endif + fwretract.retract(true + #if HAS_MULTI_EXTRUDER + , rs + #endif + ); +} + +/** + * G11 - Recover filament according to settings of M208 + */ +void GcodeSuite::G11() { fwretract.retract(false); } + +#endif // FWRETRACT diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp new file mode 100644 index 00000000..538f16cd --- /dev/null +++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp @@ -0,0 +1,74 @@ +/** + * 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(FWRETRACT) + +#include "../../../feature/fwretract.h" +#include "../../gcode.h" + +/** + * M207: Set firmware retraction values + * + * S[+units] retract_length + * W[+units] swap_retract_length (multi-extruder) + * F[units/min] retract_feedrate_mm_s + * Z[units] retract_zraise + */ +void GcodeSuite::M207() { + if (parser.seen('S')) fwretract.settings.retract_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) fwretract.settings.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('Z')) fwretract.settings.retract_zraise = parser.value_linear_units(); + if (parser.seen('W')) fwretract.settings.swap_retract_length = parser.value_axis_units(E_AXIS); +} + +/** + * M208: Set firmware un-retraction values + * + * S[+units] retract_recover_extra (in addition to M207 S*) + * W[+units] swap_retract_recover_extra (multi-extruder) + * F[units/min] retract_recover_feedrate_mm_s + * R[units/min] swap_retract_recover_feedrate_mm_s + */ +void GcodeSuite::M208() { + if (parser.seen('S')) fwretract.settings.retract_recover_extra = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) fwretract.settings.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('R')) fwretract.settings.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('W')) fwretract.settings.swap_retract_recover_extra = parser.value_axis_units(E_AXIS); +} + +#if ENABLED(FWRETRACT_AUTORETRACT) + + /** + * M209: Enable automatic retract (M209 S1) + * For slicers that don't support G10/11, reversed extrude-only + * moves will be classified as retraction. + */ + void GcodeSuite::M209() { + if (MIN_AUTORETRACT <= MAX_AUTORETRACT && parser.seen('S')) + fwretract.enable_autoretract(parser.value_bool()); + } + +#endif // FWRETRACT_AUTORETRACT + +#endif // FWRETRACT diff --git a/Marlin/src/gcode/feature/i2c/M260_M261.cpp b/Marlin/src/gcode/feature/i2c/M260_M261.cpp new file mode 100644 index 00000000..526d9101 --- /dev/null +++ b/Marlin/src/gcode/feature/i2c/M260_M261.cpp @@ -0,0 +1,76 @@ +/** + * 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(EXPERIMENTAL_I2CBUS) + +#include "../../gcode.h" + +#include "../../../MarlinCore.h" // for i2c + +/** + * M260: Send data to a I2C slave device + * + * 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 + * + * M260 B + * M260 B + * M260 B + * + * M260 S1 ; Send the buffered data and reset the buffer + * M260 R1 ; Reset the buffer without sending data + */ +void GcodeSuite::M260() { + // Set the target address + if (parser.seen('A')) i2c.address(parser.value_byte()); + + // Add a new byte to the buffer + if (parser.seen('B')) i2c.addbyte(parser.value_byte()); + + // Flush the buffer to the bus + if (parser.seen('S')) i2c.send(); + + // Reset and rewind the buffer + else if (parser.seen('R')) i2c.reset(); +} + +/** + * M261: Request X bytes from I2C slave device + * + * Usage: M261 A B + */ +void GcodeSuite::M261() { + if (parser.seen('A')) i2c.address(parser.value_byte()); + + uint8_t bytes = parser.byteval('B', 1); + + if (i2c.addr && bytes && bytes <= TWIBUS_BUFFER_SIZE) + i2c.relay(bytes); + else + SERIAL_ERROR_MSG("Bad i2c request"); +} + +#endif diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp new file mode 100644 index 00000000..cf09bf14 --- /dev/null +++ b/Marlin/src/gcode/feature/leds/M150.cpp @@ -0,0 +1,84 @@ +/** + * 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_COLOR_LEDS + +#include "../../gcode.h" +#include "../../../feature/leds/leds.h" + +/** + * M150: Set Status LED Color - Use R-U-B-W for R-G-B-W + * and Brightness - Use P (for NEOPIXEL only) + * + * 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 + * + * With NEOPIXEL2_SEPARATE: + * S The NeoPixel strip to set. Default is index 0. + * + * Examples: + * + * M150 R255 ; Turn LED red + * M150 R255 U127 ; Turn LED orange (PWM only) + * M150 ; Turn LED off + * M150 R U B ; Turn LED white + * 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 + * M150 S1 I1 R ; Set SEPARATE index 1 to red + */ + +void GcodeSuite::M150() { + #if ENABLED(NEOPIXEL_LED) + 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 + + 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) : 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/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp new file mode 100644 index 00000000..a6ee7117 --- /dev/null +++ b/Marlin/src/gcode/feature/leds/M7219.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" + +#if ENABLED(MAX7219_GCODE) + +#include "../../gcode.h" +#include "../../../feature/max7219.h" + +/** + * M7219: Control the Max7219 LED matrix + * + * I - Initialize (clear) the matrix + * F - Fill the matrix (set all bits) + * P - Dump the led_line[] array values + * C - Set a column to the bitmask given by 'V' (Units 0-3 in portrait layout) + * R - Set a row to the bitmask given by 'V' (Units 0-3 in landscape layout) + * X - X index of an LED to set or toggle + * Y - Y index of an LED to set or toggle + * V - LED on/off state or row/column bitmask (8, 16, 24, or 32-bits) + * ('C' / 'R' can be used to update up to 4 units at once) + * + * Directly set a native matrix row to the 8-bit value 'V': + * D - Display line (0..7) + * U - Unit index (0..MAX7219_NUMBER_UNITS-1) + */ +void GcodeSuite::M7219() { + if (parser.seen('I')) { + max7219.register_setup(); + max7219.clear(); + } + + if (parser.seen('F')) max7219.fill(); + + const uint32_t v = parser.ulongval('V'); + + if (parser.seenval('R')) { + const uint8_t r = parser.value_byte(); + max7219.set_row(r, v); + } + else if (parser.seenval('C')) { + const uint8_t c = parser.value_byte(); + max7219.set_column(c, v); + } + else if (parser.seenval('X') || parser.seenval('Y')) { + const uint8_t x = parser.byteval('X'), y = parser.byteval('Y'); + if (parser.seenval('V')) + max7219.led_set(x, y, v > 0); + else + max7219.led_toggle(x, y); + } + else if (parser.seen('D')) { + const uint8_t uline = parser.value_byte() & 0x7, + line = uline + (parser.byteval('U') << 3); + if (line < MAX7219_LINES) { + max7219.led_line[line] = v; + return max7219.refresh_line(line); + } + } + + if (parser.seen('P')) { + LOOP_L_N(r, MAX7219_LINES) { + SERIAL_ECHOPGM("led_line["); + if (r < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(int(r)); + SERIAL_ECHOPGM("]="); + for (uint8_t b = 8; b--;) SERIAL_CHAR('0' + TEST(max7219.led_line[r], b)); + SERIAL_EOL(); + } + } +} + +#endif // MAX7219_GCODE diff --git a/Marlin/src/gcode/feature/macro/M810-M819.cpp b/Marlin/src/gcode/feature/macro/M810-M819.cpp new file mode 100644 index 00000000..7b9e1a13 --- /dev/null +++ b/Marlin/src/gcode/feature/macro/M810-M819.cpp @@ -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 . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(GCODE_MACROS) + +#include "../../gcode.h" +#include "../../queue.h" +#include "../../parser.h" + +char gcode_macros[GCODE_MACROS_SLOTS][GCODE_MACROS_SLOT_SIZE + 1] = {{ 0 }}; + +/** + * M810_819: Set/execute a G-code macro. + * + * Usage: + * M810 |... Set Macro 0 to the given commands, separated by the pipe character + * M810 Execute Macro 0 + */ +void GcodeSuite::M810_819() { + const uint8_t index = parser.codenum - 810; + if (index >= GCODE_MACROS_SLOTS) return; + + const size_t len = strlen(parser.string_arg); + + if (len) { + // Set a macro + if (len > GCODE_MACROS_SLOT_SIZE) + SERIAL_ERROR_MSG("Macro too long."); + else { + char c, *s = parser.string_arg, *d = gcode_macros[index]; + do { + c = *s++; + *d++ = c == '|' ? '\n' : c; + } while (c); + } + } + else { + // Execute a macro + char * const cmd = gcode_macros[index]; + if (strlen(cmd)) process_subcommands_now(cmd); + } +} + +#endif // GCODE_MACROS diff --git a/Marlin/src/gcode/feature/mixing/M163-M165.cpp b/Marlin/src/gcode/feature/mixing/M163-M165.cpp new file mode 100644 index 00000000..a4cb64e7 --- /dev/null +++ b/Marlin/src/gcode/feature/mixing/M163-M165.cpp @@ -0,0 +1,101 @@ +/** + * 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(MIXING_EXTRUDER) + +#include "../../gcode.h" +#include "../../../feature/mixing.h" + +/** + * M163: Set a single mix factor for a mixing extruder + * This is called "weight" by some systems. + * Must be followed by M164 to normalize and commit them. + * + * S[index] The channel index to set + * P[float] The mix value + */ +void GcodeSuite::M163() { + const int mix_index = parser.intval('S'); + if (mix_index < MIXING_STEPPERS) + mixer.set_collector(mix_index, parser.floatval('P')); +} + +/** + * M164: Normalize and commit the mix. + * + * S[index] The virtual tool to store + * If 'S' is omitted update the active virtual tool. + */ +void GcodeSuite::M164() { + #if MIXING_VIRTUAL_TOOLS > 1 + const int tool_index = parser.intval('S', -1); + #else + constexpr int tool_index = 0; + #endif + if (tool_index >= 0) { + if (tool_index < MIXING_VIRTUAL_TOOLS) + mixer.normalize(tool_index); + } + else + mixer.normalize(); +} + +#if ENABLED(DIRECT_MIXING_IN_G1) + + /** + * M165: Set multiple mix factors for a mixing extruder. + * Omitted factors will be set to 0. + * The mix is normalized and stored in the current virtual tool. + * + * A[factor] Mix factor for extruder stepper 1 + * B[factor] Mix factor for extruder stepper 2 + * C[factor] Mix factor for extruder stepper 3 + * D[factor] Mix factor for extruder stepper 4 + * H[factor] Mix factor for extruder stepper 5 + * I[factor] Mix factor for extruder stepper 6 + */ + void GcodeSuite::M165() { + // Get mixing parameters from the GCode + // The total "must" be 1.0 (but it will be normalized) + // If no mix factors are given, the old mix is preserved + const char mixing_codes[] = { LIST_N(MIXING_STEPPERS, 'A', 'B', 'C', 'D', 'H', 'I') }; + uint8_t mix_bits = 0; + MIXER_STEPPER_LOOP(i) { + if (parser.seenval(mixing_codes[i])) { + SBI(mix_bits, i); + mixer.set_collector(i, parser.value_float()); + } + } + // If any mixing factors were included, clear the rest + // If none were included, preserve the last mix + if (mix_bits) { + MIXER_STEPPER_LOOP(i) + if (!TEST(mix_bits, i)) mixer.set_collector(i, 0.0f); + mixer.normalize(); + } + } + +#endif // DIRECT_MIXING_IN_G1 + +#endif // MIXING_EXTRUDER diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp new file mode 100644 index 00000000..9e071a47 --- /dev/null +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -0,0 +1,103 @@ +/** + * 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(GRADIENT_MIX) + +#include "../../gcode.h" +#include "../../../module/motion.h" +#include "../../../module/planner.h" +#include "../../../feature/mixing.h" + +inline void echo_mix() { + SERIAL_ECHOPAIR(" (", int(mixer.mix[0]), "%|", int(mixer.mix[1]), "%)"); +} + +inline void echo_zt(const int t, const float &z) { + mixer.update_mix_from_vtool(t); + SERIAL_ECHOPAIR_P(SP_Z_STR, z, SP_T_STR, t); + echo_mix(); +} + +/** + * M166: Set a simple gradient mix for a two-component mixer + * based on the Geeetech A10M implementation by Jone Liu. + * + * S[bool] - Enable / disable gradients + * A[float] - Starting Z for the gradient + * Z[float] - Ending Z for the gradient. (Must be greater than the starting Z.) + * I[index] - V-Tool to use as the starting mix. + * J[index] - V-Tool to use as the ending mix. + * + * T[index] - A V-Tool index to use as an alias for the Gradient (Requires GRADIENT_VTOOL) + * T with no index clears the setting. Note: This can match the I or J value. + * + * Example: M166 S1 A0 Z20 I0 J1 + */ +void GcodeSuite::M166() { + if (parser.seenval('A')) mixer.gradient.start_z = parser.value_float(); + if (parser.seenval('Z')) mixer.gradient.end_z = parser.value_float(); + if (parser.seenval('I')) mixer.gradient.start_vtool = (uint8_t)constrain(parser.value_int(), 0, MIXING_VIRTUAL_TOOLS); + if (parser.seenval('J')) mixer.gradient.end_vtool = (uint8_t)constrain(parser.value_int(), 0, MIXING_VIRTUAL_TOOLS); + + #if ENABLED(GRADIENT_VTOOL) + if (parser.seen('T')) mixer.gradient.vtool_index = parser.byteval('T', -1); + #endif + + if (parser.seen('S')) mixer.gradient.enabled = parser.value_bool(); + + mixer.refresh_gradient(); + + SERIAL_ECHOPGM("Gradient Mix "); + serialprint_onoff(mixer.gradient.enabled); + if (mixer.gradient.enabled) { + + #if ENABLED(GRADIENT_VTOOL) + if (mixer.gradient.vtool_index >= 0) { + SERIAL_ECHOPAIR(" (T", int(mixer.gradient.vtool_index)); + SERIAL_CHAR(')'); + } + #endif + + SERIAL_ECHOPGM(" ; Start"); + echo_zt(mixer.gradient.start_vtool, mixer.gradient.start_z); + + SERIAL_ECHOPGM(" ; End"); + echo_zt(mixer.gradient.end_vtool, mixer.gradient.end_z); + + mixer.update_mix_from_gradient(); + + 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(); + } + + SERIAL_EOL(); +} + +#endif // GRADIENT_MIX 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 00000000..79f1da06 --- /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('S')) { + password.value_entry = parser.ulongval('S'); + + 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/feature/pause/G27.cpp b/Marlin/src/gcode/feature/pause/G27.cpp new file mode 100644 index 00000000..3ce618d6 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/G27.cpp @@ -0,0 +1,41 @@ +/** + * 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(NOZZLE_PARK_FEATURE) + +#include "../../gcode.h" +#include "../../../libs/nozzle.h" +#include "../../../module/motion.h" + +/** + * G27: Park the nozzle + */ +void GcodeSuite::G27() { + // Don't allow nozzle parking without homing first + if (homing_needed_error()) return; + nozzle.park(parser.ushortval('P')); +} + +#endif // NOZZLE_PARK_FEATURE diff --git a/Marlin/src/gcode/feature/pause/G60.cpp b/Marlin/src/gcode/feature/pause/G60.cpp new file mode 100644 index 00000000..6f695b99 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/G60.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/MarlinConfig.h" + +#if SAVED_POSITIONS + +#include "../../gcode.h" +#include "../../../module/motion.h" + +#define DEBUG_OUT ENABLED(SAVED_POSITIONS_DEBUG) +#include "../../../core/debug_out.h" + +/** + * G60: Save current position + * + * S - Memory slot # (0-based) to save into (default 0) + */ +void GcodeSuite::G60() { + const uint8_t slot = parser.byteval('S'); + + if (slot >= SAVED_POSITIONS) { + SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS)); + return; + } + + stored_position[slot] = current_position; + SBI(saved_slots[slot >> 3], slot & 0x07); + + #if ENABLED(SAVED_POSITIONS_DEBUG) + const xyze_pos_t &pos = stored_position[slot]; + DEBUG_ECHOPAIR_F(STR_SAVED_POS " S", slot); + DEBUG_ECHOPAIR_F(" : X", pos.x); + DEBUG_ECHOPAIR_F_P(SP_Y_STR, pos.y); + DEBUG_ECHOLNPAIR_F_P(SP_Z_STR, pos.z); + #endif +} + +#endif // SAVED_POSITIONS diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp new file mode 100644 index 00000000..d8049f02 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/G61.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/MarlinConfig.h" + +#if SAVED_POSITIONS + +#include "../../../module/planner.h" +#include "../../gcode.h" +#include "../../../module/motion.h" + +/** + * G61: Return to saved position + * + * F - Feedrate (optional) for the move back. + * S - Slot # (0-based) to restore from (default 0). + * X Y Z - Axes to restore. At least one is required. + */ +void GcodeSuite::G61(void) { + + const uint8_t slot = parser.byteval('S'); + + #if SAVED_POSITIONS < 256 + if (slot >= SAVED_POSITIONS) { + SERIAL_ERROR_MSG(STR_INVALID_POS_SLOT STRINGIFY(SAVED_POSITIONS)); + return; + } + #endif + + // No saved position? No axes being restored? + if (!TEST(saved_slots[slot >> 3], slot & 0x07) || !parser.seen("XYZ")) return; + + // Apply any given feedrate over 0.0 + const float fr = parser.linearval('F'); + if (fr > 0.0) feedrate_mm_s = MMM_TO_MMS(fr); + + SERIAL_ECHOPAIR(STR_RESTORING_POS " S", int(slot)); + LOOP_XYZ(i) { + destination[i] = parser.seen(XYZ_CHAR(i)) + ? stored_position[slot][i] + parser.value_axis_units((AxisEnum)i) + : current_position[i]; + SERIAL_CHAR(' ', XYZ_CHAR(i)); + SERIAL_ECHO_F(destination[i]); + } + SERIAL_EOL(); + + // Move to the saved position + prepare_line_to_destination(); +} + +#endif // SAVED_POSITIONS diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp new file mode 100644 index 00000000..db78e870 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M125.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/MarlinConfig.h" + +#if ENABLED(PARK_HEAD_ON_PAUSE) + +#include "../../gcode.h" +#include "../../parser.h" +#include "../../../feature/pause.h" +#include "../../../module/motion.h" +#include "../../../sd/cardreader.h" +#include "../../../module/printcounter.h" + +#if HAS_LCD_MENU + #include "../../../lcd/ultralcd.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../feature/powerloss.h" +#endif + +/** + * M125: Store current position and move to parking position. + * Called on pause (by M25) to prevent material leaking onto the + * object. On resume (M24) the head will be moved back and the + * print will resume. + * + * When not actively SD printing, M125 simply moves to the park + * position and waits, resuming with a button click or M108. + * Without PARK_HEAD_ON_PAUSE the M125 command does nothing. + * + * L = override retract length + * X = override X + * Y = override Y + * Z = override Z raise + */ +void GcodeSuite::M125() { + // Initial retract before move to filament change position + const float retract = -ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) : (PAUSE_PARK_RETRACT_LENGTH)); + + xyz_pos_t park_point = NOZZLE_PARK_POINT; + + // Move XY axes to filament change position or given position + if (parser.seenval('X')) park_point.x = RAW_X_POSITION(parser.linearval('X')); + if (parser.seenval('Y')) park_point.y = RAW_X_POSITION(parser.linearval('Y')); + + // Lift Z axis + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + #if HAS_HOTEND_OFFSET && NONE(DUAL_X_CARRIAGE, DELTA) + park_point += hotend_offset[active_extruder]; + #endif + + const bool sd_printing = TERN0(SDSUPPORT, IS_SD_PRINTING()); + + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); + + const bool show_lcd = TERN0(HAS_LCD_MENU, parser.seenval('P')); + + if (pause_print(retract, park_point, 0, show_lcd)) { + TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); + if (ENABLED(EXTENSIBLE_UI) || !sd_printing || show_lcd) { + wait_for_confirmation(false, 0); + resume_print(0, 0, -retract, 0); + } + } +} + +#endif // PARK_HEAD_ON_PAUSE diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp new file mode 100644 index 00000000..7c9be54b --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -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 . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +#include "../../gcode.h" +#include "../../../feature/pause.h" +#include "../../../module/motion.h" +#include "../../../module/printcounter.h" + +#if HAS_MULTI_EXTRUDER + #include "../../../module/tool_change.h" +#endif + +#if HAS_LCD_MENU + #include "../../../lcd/ultralcd.h" +#endif + +#if ENABLED(MMU2_MENUS) + #include "../../../lcd/menu/menu_mmu2.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../../../feature/mixing.h" +#endif + +#if HAS_FILAMENT_SENSOR + #include "../../../feature/runout.h" +#endif + +/** + * M600: Pause for filament change + * + * E[distance] - Retract the filament this far + * Z[distance] - Move the Z axis by this distance + * X[position] - Move to this X position, with Y + * Y[position] - Move to this Y position, with X + * U[distance] - Retract distance for removal (manual reload) + * L[distance] - Extrude distance for insertion (manual reload) + * B[count] - Number of times to beep, -1 for indefinite (if equipped with a buzzer) + * T[toolhead] - Select extruder for filament change + * R[temp] - Resume temperature (in current units) + * + * Default values are used for omitted arguments. + */ +void GcodeSuite::M600() { + + #if ENABLED(MIXING_EXTRUDER) + const int8_t target_e_stepper = get_target_e_stepper_from_command(); + if (target_e_stepper < 0) return; + + const uint8_t old_mixing_tool = mixer.get_current_vtool(); + mixer.T(MIXER_DIRECT_SET_TOOL); + + MIXER_STEPPER_LOOP(i) mixer.set_collector(i, i == uint8_t(target_e_stepper) ? 1.0 : 0.0); + mixer.normalize(); + + const int8_t target_extruder = active_extruder; + #else + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + int8_t DXC_ext = target_extruder; + if (!parser.seen('T')) { // If no tool index is specified, M600 was (probably) sent in response to filament runout. + // 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_STATE) ? 1 : 0; + #else + DXC_ext = active_extruder; + #endif + } + #endif + + // Show initial "wait for start" message + #if HAS_LCD_MENU && DISABLED(MMU2_MENUS) + lcd_pause_show_message(PAUSE_MESSAGE_CHANGING, PAUSE_MODE_PAUSE_PRINT, target_extruder); + #endif + + #if ENABLED(HOME_BEFORE_FILAMENT_CHANGE) + // If needed, home before parking for filament change + if (!all_axes_known()) home_all_axes(); + #endif + + #if HAS_MULTI_EXTRUDER + // Change toolhead if specified + const uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder && TERN1(DUAL_X_CARRIAGE, !dxc_is_duplicating())) + tool_change(target_extruder, false); + #endif + + // Initial retract before move to filament change position + const float retract = -ABS(parser.seen('E') ? parser.value_axis_units(E_AXIS) : (PAUSE_PARK_RETRACT_LENGTH)); + + xyz_pos_t park_point NOZZLE_PARK_POINT; + + // Lift Z axis + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + // Move XY axes to filament change position or given position + if (parser.seenval('X')) park_point.x = parser.linearval('X'); + if (parser.seenval('Y')) park_point.y = parser.linearval('Y'); + + #if HAS_HOTEND_OFFSET && NONE(DUAL_X_CARRIAGE, DELTA) + park_point += hotend_offset[active_extruder]; + #endif + + #if ENABLED(MMU2_MENUS) + // For MMU2 reset retract and load/unload values so they don't mess with MMU filament handling + constexpr float unload_length = 0.5f, + slow_load_length = 0.0f, + fast_load_length = 0.0f; + #else + // Unload filament + const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) + : fc_settings[active_extruder].unload_length); + + // Slow load filament + constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + + // Fast load filament + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : fc_settings[active_extruder].load_length); + #endif + + const int beep_count = parser.intval('B', -1 + #ifdef FILAMENT_CHANGE_ALERT_BEEPS + + 1 + FILAMENT_CHANGE_ALERT_BEEPS + #endif + ); + + if (pause_print(retract, park_point, unload_length, true DXC_PASS)) { + #if ENABLED(MMU2_MENUS) + mmu2_M600(); + resume_print(slow_load_length, fast_load_length, 0, beep_count DXC_PASS); + #else + wait_for_confirmation(true, beep_count DXC_PASS); + resume_print(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, + beep_count, (parser.seenval('R') ? parser.value_celsius() : 0) DXC_PASS); + #endif + } + + #if HAS_MULTI_EXTRUDER + // Restore toolhead if it was changed + if (active_extruder_before_filament_change != active_extruder) + tool_change(active_extruder_before_filament_change, false); + #endif + + TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp new file mode 100644 index 00000000..9c3b774b --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M603.cpp @@ -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 . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + +#include "../../gcode.h" +#include "../../../feature/pause.h" +#include "../../../module/motion.h" +#include "../../../module/printcounter.h" + +#if HAS_MULTI_EXTRUDER + #include "../../../module/tool_change.h" +#endif + +/** + * M603: Configure filament change + * + * T[toolhead] - Select extruder to configure, active extruder if not specified + * U[distance] - Retract distance for removal, for the specified extruder + * L[distance] - Extrude distance for insertion, for the specified extruder + */ +void GcodeSuite::M603() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + // Unload length + if (parser.seen('U')) { + fc_settings[target_extruder].unload_length = ABS(parser.value_axis_units(E_AXIS)); + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + NOMORE(fc_settings[target_extruder].unload_length, EXTRUDE_MAXLENGTH); + #endif + } + + // Load length + if (parser.seen('L')) { + fc_settings[target_extruder].load_length = ABS(parser.value_axis_units(E_AXIS)); + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + NOMORE(fc_settings[target_extruder].load_length, EXTRUDE_MAXLENGTH); + #endif + } +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp new file mode 100644 index 00000000..c1f72231 --- /dev/null +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -0,0 +1,242 @@ +/** + * 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(FILAMENT_LOAD_UNLOAD_GCODES) + +#include "../../gcode.h" +#include "../../../MarlinCore.h" +#include "../../../module/motion.h" +#include "../../../module/temperature.h" +#include "../../../feature/pause.h" + +#if HAS_MULTI_EXTRUDER + #include "../../../module/tool_change.h" +#endif + +#if HAS_LCD_MENU + #include "../../../lcd/ultralcd.h" +#endif + +#if ENABLED(PRUSA_MMU2) + #include "../../../feature/mmu2/mmu2.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../../../feature/mixing.h" +#endif + +/** + * M701: Load filament + * + * T - Extruder number. Required for mixing extruder. + * For non-mixing, current extruder if omitted. + * Z - Move the Z axis by this distance + * L - Extrude distance for insertion (positive value) (manual reload) + * + * Default values are used for omitted arguments. + */ +void GcodeSuite::M701() { + xyz_pos_t park_point = NOZZLE_PARK_POINT; + + #if ENABLED(NO_MOTION_BEFORE_HOMING) + // Don't raise Z if the machine isn't homed + if (axes_should_home()) park_point.z = 0; + #endif + + #if ENABLED(MIXING_EXTRUDER) + const int8_t target_e_stepper = get_target_e_stepper_from_command(); + if (target_e_stepper < 0) return; + + const uint8_t old_mixing_tool = mixer.get_current_vtool(); + mixer.T(MIXER_DIRECT_SET_TOOL); + + MIXER_STEPPER_LOOP(i) mixer.set_collector(i, (i == (uint8_t)target_e_stepper) ? 1.0 : 0.0); + mixer.normalize(); + + const int8_t target_extruder = active_extruder; + #else + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + #endif + + // Z axis lift + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + // Show initial "wait for load" message + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder)); + + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + // Change toolhead if specified + uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder) + tool_change(target_extruder, false); + #endif + + // Lift Z axis + if (park_point.z > 0) + do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + + // Load filament + #if ENABLED(PRUSA_MMU2) + mmu2.load_filament_to_nozzle(target_extruder); + #else + constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH, + slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; + const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS) + : fc_settings[active_extruder].load_length); + load_filament( + slow_load_length, fast_load_length, purge_length, + FILAMENT_CHANGE_ALERT_BEEPS, + true, // show_lcd + thermalManager.still_heating(target_extruder), // pause_for_user + PAUSE_MODE_LOAD_FILAMENT // pause_mode + #if ENABLED(DUAL_X_CARRIAGE) + , target_extruder // Dual X target + #endif + ); + #endif + + // Restore Z axis + if (park_point.z > 0) + do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + // Restore toolhead if it was changed + if (active_extruder_before_filament_change != active_extruder) + tool_change(active_extruder_before_filament_change, false); + #endif + + TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool + + // Show status screen + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); +} + +/** + * M702: Unload filament + * + * T - Extruder number. Required for mixing extruder. + * For non-mixing, if omitted, current extruder + * (or ALL extruders with FILAMENT_UNLOAD_ALL_EXTRUDERS). + * Z - Move the Z axis by this distance + * U - Retract distance for removal (manual reload) + * + * Default values are used for omitted arguments. + */ +void GcodeSuite::M702() { + xyz_pos_t park_point = NOZZLE_PARK_POINT; + + #if ENABLED(NO_MOTION_BEFORE_HOMING) + // Don't raise Z if the machine isn't homed + if (axes_should_home()) park_point.z = 0; + #endif + + #if ENABLED(MIXING_EXTRUDER) + const uint8_t old_mixing_tool = mixer.get_current_vtool(); + + #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + float mix_multiplier = 1.0; + const bool seenT = parser.seenval('T'); + if (!seenT) { + mixer.T(MIXER_AUTORETRACT_TOOL); + mix_multiplier = MIXING_STEPPERS; + } + #else + constexpr bool seenT = true; + #endif + + if (seenT) { + const int8_t target_e_stepper = get_target_e_stepper_from_command(); + if (target_e_stepper < 0) return; + mixer.T(MIXER_DIRECT_SET_TOOL); + MIXER_STEPPER_LOOP(i) mixer.set_collector(i, (i == (uint8_t)target_e_stepper) ? 1.0 : 0.0); + mixer.normalize(); + } + + const int8_t target_extruder = active_extruder; + #else + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + #endif + + // Z axis lift + if (parser.seenval('Z')) park_point.z = parser.linearval('Z'); + + // Show initial "wait for unload" message + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder)); + + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + // Change toolhead if specified + uint8_t active_extruder_before_filament_change = active_extruder; + if (active_extruder != target_extruder) + tool_change(target_extruder, false); + #endif + + // Lift Z axis + if (park_point.z > 0) + do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + + // Unload filament + #if ENABLED(PRUSA_MMU2) + mmu2.unload(); + #else + #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) + if (!parser.seenval('T')) { + HOTEND_LOOP() { + if (e != active_extruder) tool_change(e, false); + unload_filament(-fc_settings[e].unload_length, true, PAUSE_MODE_UNLOAD_FILAMENT); + } + } + else + #endif + { + // Unload length + const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) + : fc_settings[target_extruder].unload_length); + + unload_filament(unload_length, true, PAUSE_MODE_UNLOAD_FILAMENT + #if ALL(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + , mix_multiplier + #endif + ); + } + #endif + + // Restore Z axis + if (park_point.z > 0) + do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); + + #if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) + // Restore toolhead if it was changed + if (active_extruder_before_filament_change != active_extruder) + tool_change(active_extruder_before_filament_change, false); + #endif + + TERN_(MIXING_EXTRUDER, mixer.T(old_mixing_tool)); // Restore original mixing tool + + // Show status screen + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_STATUS)); +} + +#endif // ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/gcode/feature/power_monitor/M430.cpp b/Marlin/src/gcode/feature/power_monitor/M430.cpp new file mode 100644 index 00000000..7639ea96 --- /dev/null +++ b/Marlin/src/gcode/feature/power_monitor/M430.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/MarlinConfig.h" + +#if HAS_POWER_MONITOR + +#include "../../../feature/power_monitor.h" +#include "../../../MarlinCore.h" +#include "../../gcode.h" + +/** + * M430: Enable/disable current LCD display + * With no parameters report the system current draw (in Amps) + * + * I[bool] - Set Display of current on the LCD + * V[bool] - Set Display of voltage on the LCD + * W[bool] - Set Display of power on the LCD + */ +void GcodeSuite::M430() { + bool do_report = true; + #if HAS_WIRED_LCD + #if ENABLED(POWER_MONITOR_CURRENT) + if (parser.seen('I')) { power_monitor.set_current_display(parser.value_bool()); do_report = false; } + #endif + #if HAS_POWER_MONITOR_VREF + if (parser.seen('V')) { power_monitor.set_voltage_display(parser.value_bool()); do_report = false; } + #endif + #if HAS_POWER_MONITOR_WATTS + if (parser.seen('W')) { power_monitor.set_power_display(parser.value_bool()); do_report = false; } + #endif + #endif + if (do_report) { + SERIAL_ECHOLNPAIR( + #if ENABLED(POWER_MONITOR_CURRENT) + "Current: ", power_monitor.getAmps(), "A" + #if HAS_POWER_MONITOR_VREF + " " + #endif + #endif + #if HAS_POWER_MONITOR_VREF + "Voltage: ", power_monitor.getVolts(), "V" + #endif + #if HAS_POWER_MONITOR_WATTS + " Power: ", power_monitor.getPower(), "W" + #endif + ); + } +} + +#endif // HAS_POWER_MONITOR diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp new file mode 100644 index 00000000..e9477dd2 --- /dev/null +++ b/Marlin/src/gcode/feature/powerloss/M1000.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/MarlinConfig.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + +#include "../../gcode.h" +#include "../../../feature/powerloss.h" +#include "../../../module/motion.h" +#include "../../../lcd/ultralcd.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_POWER_LOSS_RECOVERY) +#include "../../../core/debug_out.h" + +void menu_job_recovery(); + +inline void plr_error(PGM_P const prefix) { + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + DEBUG_ECHO_START(); + serialprintPGM(prefix); + DEBUG_ECHOLNPGM(" Job Recovery Data"); + #else + UNUSED(prefix); + #endif +} + +#if HAS_LCD_MENU + void lcd_power_loss_recovery_cancel(); +#endif + +/** + * M1000: Resume from power-loss (undocumented) + * - With 'S' go to the Resume/Cancel menu + * - With no parameters, run recovery commands + */ +void GcodeSuite::M1000() { + + if (recovery.valid()) { + if (parser.seen('S')) { + #if HAS_LCD_MENU + ui.goto_screen(menu_job_recovery); + #elif ENABLED(DWIN_CREALITY_LCD) + recovery.dwin_flag = true; + #elif ENABLED(EXTENSIBLE_UI) + ExtUI::onPowerLossResume(); + #else + SERIAL_ECHO_MSG("Resume requires LCD."); + #endif + } + else if (parser.seen('C')) { + #if HAS_LCD_MENU + lcd_power_loss_recovery_cancel(); + #else + recovery.cancel(); + #endif + TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerStopped()); + } + else + recovery.resume(); + } + else + plr_error(recovery.info.valid_head ? PSTR("No") : PSTR("Invalid")); + +} + +#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp new file mode 100644 index 00000000..3538ccaa --- /dev/null +++ b/Marlin/src/gcode/feature/powerloss/M413.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/MarlinConfig.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + +#include "../../gcode.h" +#include "../../../feature/powerloss.h" +#include "../../../module/motion.h" +#include "../../../lcd/ultralcd.h" + +/** + * M413: Enable / Disable power-loss recovery + * + * Parameters + * S[bool] - Flag to enable / disable. + * If omitted, report current state. + */ +void GcodeSuite::M413() { + + if (parser.seen('S')) + recovery.enable(parser.value_bool()); + else { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Power-loss recovery "); + serialprintln_onoff(recovery.enabled); + } + + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + if (parser.seen("RL")) recovery.load(); + if (parser.seen('W')) recovery.save(true); + if (parser.seen('P')) recovery.purge(); + if (parser.seen('D')) recovery.debug(PSTR("M413")); + #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 +} + +#endif // POWER_LOSS_RECOVERY diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp new file mode 100644 index 00000000..91e35dbf --- /dev/null +++ b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp @@ -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 . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(PRUSA_MMU2) + +#include "../../gcode.h" +#include "../../../feature/mmu2/mmu2.h" + +/** + * M403: Set filament type for MMU2 + * + * Valid filament type values: + * + * 0 Default + * 1 Flexible + * 2 PVA + */ +void GcodeSuite::M403() { + int8_t index = parser.intval('E', -1), + type = parser.intval('F', -1); + + if (WITHIN(index, 0, 4) && WITHIN(type, 0, 2)) + mmu2.set_filament_type(index, type); + else + SERIAL_ECHO_MSG("M403 - bad arguments."); +} + +#endif // PRUSA_MMU2 diff --git a/Marlin/src/gcode/feature/runout/M412.cpp b/Marlin/src/gcode/feature/runout/M412.cpp new file mode 100644 index 00000000..130f9c83 --- /dev/null +++ b/Marlin/src/gcode/feature/runout/M412.cpp @@ -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 . + * + */ + +#include "../../../inc/MarlinConfig.h" + +#if HAS_FILAMENT_SENSOR + +#include "../../gcode.h" +#include "../../../feature/runout.h" + +/** + * 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" + TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, "D") + TERN_(HOST_ACTION_COMMANDS, "H") + )) { + #if ENABLED(HOST_ACTION_COMMANDS) + if (parser.seen('H')) runout.host_handling = parser.value_bool(); + #endif + const bool seenR = parser.seen('R'), seenS = parser.seen('S'); + if (seenR || seenS) runout.reset(); + if (seenS) runout.enabled = parser.value_bool(); + #if HAS_FILAMENT_RUNOUT_DISTANCE + if (parser.seen('D')) runout.set_runout_distance(parser.value_linear_units()); + #endif + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Filament runout "); + serialprintln_onoff(runout.enabled); + #if HAS_FILAMENT_RUNOUT_DISTANCE + SERIAL_ECHOLNPAIR("Filament runout distance (mm): ", runout.runout_distance()); + #endif + } +} + +#endif // HAS_FILAMENT_SENSOR diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp new file mode 100644 index 00000000..46e4365f --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M122.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/MarlinConfig.h" + +#if HAS_TRINAMIC_CONFIG + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper/indirection.h" + +/** + * M122: Debug TMC drivers + */ +void GcodeSuite::M122() { + xyze_bool_t print_axis = { false, false, false, false }; + bool print_all = true; + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { print_axis[i] = true; print_all = false; } + + 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; + if (parser.seen('S') && !parser.value_bool()) interval = 0; + if (parser.seenval('P')) NOMORE(interval, parser.value_ushort()); + tmc_set_report_interval(interval); + #endif + + if (parser.seen('V')) + tmc_get_registers(print_axis.x, print_axis.y, print_axis.z, print_axis.e); + else + tmc_report_all(print_axis.x, print_axis.y, print_axis.z, print_axis.e); + #endif + + test_tmc_connection(print_axis.x, print_axis.y, print_axis.z, print_axis.e); +} + +#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp new file mode 100644 index 00000000..e72d03e7 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -0,0 +1,186 @@ +/** + * 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_STEALTHCHOP + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper/indirection.h" + +template +void tmc_say_stealth_status(TMC &st) { + st.printLabel(); + SERIAL_ECHOPGM(" driver mode:\t"); + serialprintPGM(st.get_stealthChop_status() ? PSTR("stealthChop") : PSTR("spreadCycle")); + SERIAL_EOL(); +} +template +void tmc_set_stealthChop(TMC &st, const bool enable) { + st.stored.stealthChop_enabled = enable; + st.refresh_stepping_mode(); +} + +static void set_stealth_status(const bool enable, const int8_t target_extruder) { + #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable) + + #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(X2) \ + || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Y2) \ + || AXIS_HAS_STEALTHCHOP(Z) || AXIS_HAS_STEALTHCHOP(Z2) \ + || AXIS_HAS_STEALTHCHOP(Z3) || AXIS_HAS_STEALTHCHOP(Z4) + const uint8_t index = parser.byteval('I'); + #endif + + LOOP_XYZE(i) if (parser.seen(axis_codes[i])) { + switch (i) { + case X_AXIS: + #if AXIS_HAS_STEALTHCHOP(X) + if (index == 0) TMC_SET_STEALTH(X); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + if (index == 1) TMC_SET_STEALTH(X2); + #endif + break; + case Y_AXIS: + #if AXIS_HAS_STEALTHCHOP(Y) + if (index == 0) TMC_SET_STEALTH(Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + if (index == 1) TMC_SET_STEALTH(Y2); + #endif + break; + case Z_AXIS: + #if AXIS_HAS_STEALTHCHOP(Z) + if (index == 0) TMC_SET_STEALTH(Z); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + if (index == 1) TMC_SET_STEALTH(Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + if (index == 2) TMC_SET_STEALTH(Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + if (index == 3) TMC_SET_STEALTH(Z4); + #endif + break; + case E_AXIS: { + if (target_extruder < 0) return; + switch (target_extruder) { + #if AXIS_HAS_STEALTHCHOP(E0) + case 0: TMC_SET_STEALTH(E0); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + case 1: TMC_SET_STEALTH(E1); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + case 2: TMC_SET_STEALTH(E2); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + case 3: TMC_SET_STEALTH(E3); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + case 4: TMC_SET_STEALTH(E4); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + case 5: TMC_SET_STEALTH(E5); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + case 6: TMC_SET_STEALTH(E6); break; + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + case 7: TMC_SET_STEALTH(E7); break; + #endif + } + } break; + } + } +} + +static void say_stealth_status() { + #define TMC_SAY_STEALTH_STATUS(Q) tmc_say_stealth_status(stepper##Q) + + #if AXIS_HAS_STEALTHCHOP(X) + TMC_SAY_STEALTH_STATUS(X); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_SAY_STEALTH_STATUS(X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_SAY_STEALTH_STATUS(Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_SAY_STEALTH_STATUS(Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_SAY_STEALTH_STATUS(Z); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_SAY_STEALTH_STATUS(Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_SAY_STEALTH_STATUS(Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + TMC_SAY_STEALTH_STATUS(Z4); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_SAY_STEALTH_STATUS(E0); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + TMC_SAY_STEALTH_STATUS(E1); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + TMC_SAY_STEALTH_STATUS(E2); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + TMC_SAY_STEALTH_STATUS(E3); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + TMC_SAY_STEALTH_STATUS(E4); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + TMC_SAY_STEALTH_STATUS(E5); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + TMC_SAY_STEALTH_STATUS(E6); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + TMC_SAY_STEALTH_STATUS(E7); + #endif +} + +/** + * M569: Enable stealthChop on an axis + * + * S[1|0] to enable or disable + * XYZE to target an axis + * No arguments reports the stealthChop status of all capable drivers. + */ +void GcodeSuite::M569() { + if (parser.seen('S')) + set_stealth_status(parser.value_bool(), get_target_extruder_from_command()); + else + say_stealth_status(); +} + +#endif // HAS_STEALTHCHOP diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp new file mode 100644 index 00000000..e834ebd6 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -0,0 +1,173 @@ +/** + * 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_TRINAMIC_CONFIG + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper/indirection.h" + +/** + * M906: Set motor current in milliamps. + * + * Parameters: + * X[current] - Set mA current for X driver(s) + * Y[current] - Set mA current for Y driver(s) + * Z[current] - Set mA current for Z driver(s) + * E[current] - Set mA current for E driver(s) + * + * I[index] - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3; 3 for Z4.) + * T[index] - Extruder index (Zero-based. Omit for E0 only.) + * + * With no parameters report driver currents. + */ +void GcodeSuite::M906() { + #define TMC_SAY_CURRENT(Q) tmc_print_current(stepper##Q) + #define TMC_SET_CURRENT(Q) stepper##Q.rms_current(value) + + bool report = true; + + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + const uint8_t index = parser.byteval('I'); + #endif + + LOOP_XYZE(i) if (uint16_t value = parser.intval(axis_codes[i])) { + report = false; + switch (i) { + case X_AXIS: + #if AXIS_IS_TMC(X) + if (index == 0) TMC_SET_CURRENT(X); + #endif + #if AXIS_IS_TMC(X2) + if (index == 1) TMC_SET_CURRENT(X2); + #endif + break; + case Y_AXIS: + #if AXIS_IS_TMC(Y) + if (index == 0) TMC_SET_CURRENT(Y); + #endif + #if AXIS_IS_TMC(Y2) + if (index == 1) TMC_SET_CURRENT(Y2); + #endif + break; + case Z_AXIS: + #if AXIS_IS_TMC(Z) + if (index == 0) TMC_SET_CURRENT(Z); + #endif + #if AXIS_IS_TMC(Z2) + if (index == 1) TMC_SET_CURRENT(Z2); + #endif + #if AXIS_IS_TMC(Z3) + if (index == 2) TMC_SET_CURRENT(Z3); + #endif + #if AXIS_IS_TMC(Z4) + if (index == 3) TMC_SET_CURRENT(Z4); + #endif + break; + case E_AXIS: { + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + switch (target_extruder) { + #if AXIS_IS_TMC(E0) + case 0: TMC_SET_CURRENT(E0); break; + #endif + #if AXIS_IS_TMC(E1) + case 1: TMC_SET_CURRENT(E1); break; + #endif + #if AXIS_IS_TMC(E2) + case 2: TMC_SET_CURRENT(E2); break; + #endif + #if AXIS_IS_TMC(E3) + case 3: TMC_SET_CURRENT(E3); break; + #endif + #if AXIS_IS_TMC(E4) + case 4: TMC_SET_CURRENT(E4); break; + #endif + #if AXIS_IS_TMC(E5) + case 5: TMC_SET_CURRENT(E5); break; + #endif + #if AXIS_IS_TMC(E6) + case 6: TMC_SET_CURRENT(E6); break; + #endif + #if AXIS_IS_TMC(E7) + case 7: TMC_SET_CURRENT(E7); break; + #endif + } + } break; + } + } + + if (report) { + #if AXIS_IS_TMC(X) + TMC_SAY_CURRENT(X); + #endif + #if AXIS_IS_TMC(X2) + TMC_SAY_CURRENT(X2); + #endif + #if AXIS_IS_TMC(Y) + TMC_SAY_CURRENT(Y); + #endif + #if AXIS_IS_TMC(Y2) + TMC_SAY_CURRENT(Y2); + #endif + #if AXIS_IS_TMC(Z) + TMC_SAY_CURRENT(Z); + #endif + #if AXIS_IS_TMC(Z2) + TMC_SAY_CURRENT(Z2); + #endif + #if AXIS_IS_TMC(Z3) + TMC_SAY_CURRENT(Z3); + #endif + #if AXIS_IS_TMC(Z4) + TMC_SAY_CURRENT(Z4); + #endif + #if AXIS_IS_TMC(E0) + TMC_SAY_CURRENT(E0); + #endif + #if AXIS_IS_TMC(E1) + TMC_SAY_CURRENT(E1); + #endif + #if AXIS_IS_TMC(E2) + TMC_SAY_CURRENT(E2); + #endif + #if AXIS_IS_TMC(E3) + TMC_SAY_CURRENT(E3); + #endif + #if AXIS_IS_TMC(E4) + TMC_SAY_CURRENT(E4); + #endif + #if AXIS_IS_TMC(E5) + TMC_SAY_CURRENT(E5); + #endif + #if AXIS_IS_TMC(E6) + TMC_SAY_CURRENT(E6); + #endif + #if AXIS_IS_TMC(E7) + TMC_SAY_CURRENT(E7); + #endif + } +} + +#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp new file mode 100644 index 00000000..8c840db5 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -0,0 +1,429 @@ +/** + * 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_TRINAMIC_CONFIG + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" +#include "../../../module/stepper/indirection.h" +#include "../../../module/planner.h" +#include "../../queue.h" + +#if ENABLED(MONITOR_DRIVER_STATUS) + + #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160)) + #define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N)) + + #define M91x_SOME_X (M91x_USE(X) || M91x_USE(X2)) + #define M91x_SOME_Y (M91x_USE(Y) || M91x_USE(Y2)) + #define M91x_SOME_Z (M91x_USE(Z) || M91x_USE(Z2) || M91x_USE(Z3) || M91x_USE(Z4)) + #define M91x_SOME_E (M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) || M91x_USE_E(5) || M91x_USE_E(6) || M91x_USE_E(7)) + + #if !M91x_SOME_X && !M91x_SOME_Y && !M91x_SOME_Z && !M91x_SOME_E + #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160." + #endif + + /** + * M911: Report TMC stepper driver overtemperature pre-warn flag + * This flag is held by the library, persisting until cleared by M912 + */ + void GcodeSuite::M911() { + #if M91x_USE(X) + tmc_report_otpw(stepperX); + #endif + #if M91x_USE(X2) + tmc_report_otpw(stepperX2); + #endif + #if M91x_USE(Y) + tmc_report_otpw(stepperY); + #endif + #if M91x_USE(Y2) + tmc_report_otpw(stepperY2); + #endif + #if M91x_USE(Z) + tmc_report_otpw(stepperZ); + #endif + #if M91x_USE(Z2) + tmc_report_otpw(stepperZ2); + #endif + #if M91x_USE(Z3) + tmc_report_otpw(stepperZ3); + #endif + #if M91x_USE(Z4) + tmc_report_otpw(stepperZ4); + #endif + #if M91x_USE_E(0) + tmc_report_otpw(stepperE0); + #endif + #if M91x_USE_E(1) + tmc_report_otpw(stepperE1); + #endif + #if M91x_USE_E(2) + tmc_report_otpw(stepperE2); + #endif + #if M91x_USE_E(3) + tmc_report_otpw(stepperE3); + #endif + #if M91x_USE_E(4) + tmc_report_otpw(stepperE4); + #endif + #if M91x_USE_E(5) + tmc_report_otpw(stepperE5); + #endif + #if M91x_USE_E(6) + tmc_report_otpw(stepperE6); + #endif + #if M91x_USE_E(7) + tmc_report_otpw(stepperE7); + #endif + } + + /** + * M912: Clear TMC stepper driver overtemperature pre-warn flag held by the library + * Specify one or more axes with X, Y, Z, X1, Y1, Z1, X2, Y2, Z2, Z3, Z4 and E[index]. + * If no axes are given, clear all. + * + * Examples: + * M912 X ; clear X and X2 + * M912 X1 ; clear X1 only + * M912 X2 ; clear X2 only + * M912 X E ; clear X, X2, and all E + * M912 E1 ; clear E1 only + */ + void GcodeSuite::M912() { + #if M91x_SOME_X + const bool hasX = parser.seen(axis_codes.x); + #else + constexpr bool hasX = false; + #endif + + #if M91x_SOME_Y + const bool hasY = parser.seen(axis_codes.y); + #else + constexpr bool hasY = false; + #endif + + #if M91x_SOME_Z + const bool hasZ = parser.seen(axis_codes.z); + #else + constexpr bool hasZ = false; + #endif + + #if M91x_SOME_E + const bool hasE = parser.seen(axis_codes.e); + #else + constexpr bool hasE = false; + #endif + + const bool hasNone = !hasX && !hasY && !hasZ && !hasE; + + #if M91x_SOME_X + const int8_t xval = int8_t(parser.byteval(axis_codes.x, 0xFF)); + #if M91x_USE(X) + if (hasNone || xval == 1 || (hasX && xval < 0)) tmc_clear_otpw(stepperX); + #endif + #if M91x_USE(X2) + if (hasNone || xval == 2 || (hasX && xval < 0)) tmc_clear_otpw(stepperX2); + #endif + #endif + + #if M91x_SOME_Y + const int8_t yval = int8_t(parser.byteval(axis_codes.y, 0xFF)); + #if M91x_USE(Y) + if (hasNone || yval == 1 || (hasY && yval < 0)) tmc_clear_otpw(stepperY); + #endif + #if M91x_USE(Y2) + if (hasNone || yval == 2 || (hasY && yval < 0)) tmc_clear_otpw(stepperY2); + #endif + #endif + + #if M91x_SOME_Z + const int8_t zval = int8_t(parser.byteval(axis_codes.z, 0xFF)); + #if M91x_USE(Z) + if (hasNone || zval == 1 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ); + #endif + #if M91x_USE(Z2) + if (hasNone || zval == 2 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ2); + #endif + #if M91x_USE(Z3) + if (hasNone || zval == 3 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ3); + #endif + #if M91x_USE(Z4) + if (hasNone || zval == 4 || (hasZ && zval < 0)) tmc_clear_otpw(stepperZ4); + #endif + #endif + + #if M91x_SOME_E + const int8_t eval = int8_t(parser.byteval(axis_codes.e, 0xFF)); + #if M91x_USE_E(0) + if (hasNone || eval == 0 || (hasE && eval < 0)) tmc_clear_otpw(stepperE0); + #endif + #if M91x_USE_E(1) + if (hasNone || eval == 1 || (hasE && eval < 0)) tmc_clear_otpw(stepperE1); + #endif + #if M91x_USE_E(2) + if (hasNone || eval == 2 || (hasE && eval < 0)) tmc_clear_otpw(stepperE2); + #endif + #if M91x_USE_E(3) + if (hasNone || eval == 3 || (hasE && eval < 0)) tmc_clear_otpw(stepperE3); + #endif + #if M91x_USE_E(4) + if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4); + #endif + #if M91x_USE_E(5) + if (hasNone || eval == 5 || (hasE && eval < 0)) tmc_clear_otpw(stepperE5); + #endif + #if M91x_USE_E(6) + if (hasNone || eval == 6 || (hasE && eval < 0)) tmc_clear_otpw(stepperE6); + #endif + #if M91x_USE_E(7) + if (hasNone || eval == 7 || (hasE && eval < 0)) tmc_clear_otpw(stepperE7); + #endif + #endif + } + +#endif // MONITOR_DRIVER_STATUS + +/** + * M913: Set HYBRID_THRESHOLD speed. + */ +#if ENABLED(HYBRID_THRESHOLD) + void GcodeSuite::M913() { + #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) + #define TMC_SET_PWMTHRS(A,Q) stepper##Q.set_pwm_thrs(value) + #define TMC_SAY_PWMTHRS_E(E) tmc_print_pwmthrs(stepperE##E) + #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) + + bool report = true; + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + const uint8_t index = parser.byteval('I'); + #endif + LOOP_XYZE(i) if (int32_t value = parser.longval(axis_codes[i])) { + report = false; + switch (i) { + case X_AXIS: + #if AXIS_HAS_STEALTHCHOP(X) + if (index < 2) TMC_SET_PWMTHRS(X,X); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + if (!(index & 1)) TMC_SET_PWMTHRS(X,X2); + #endif + break; + case Y_AXIS: + #if AXIS_HAS_STEALTHCHOP(Y) + if (index < 2) TMC_SET_PWMTHRS(Y,Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + if (!(index & 1)) TMC_SET_PWMTHRS(Y,Y2); + #endif + break; + case Z_AXIS: + #if AXIS_HAS_STEALTHCHOP(Z) + if (index < 2) TMC_SET_PWMTHRS(Z,Z); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + if (index == 0 || index == 4) TMC_SET_PWMTHRS(Z,Z4); + #endif + break; + case E_AXIS: { + #if E_STEPPERS + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + switch (target_extruder) { + #if AXIS_HAS_STEALTHCHOP(E0) + case 0: TMC_SET_PWMTHRS_E(0); break; + #endif + #if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) + case 1: TMC_SET_PWMTHRS_E(1); break; + #endif + #if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) + case 2: TMC_SET_PWMTHRS_E(2); break; + #endif + #if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) + case 3: TMC_SET_PWMTHRS_E(3); break; + #endif + #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) + case 4: TMC_SET_PWMTHRS_E(4); break; + #endif + #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5) + case 5: TMC_SET_PWMTHRS_E(5); break; + #endif + #if E_STEPPERS > 6 && AXIS_HAS_STEALTHCHOP(E6) + case 6: TMC_SET_PWMTHRS_E(6); break; + #endif + #if E_STEPPERS > 7 && AXIS_HAS_STEALTHCHOP(E7) + case 7: TMC_SET_PWMTHRS_E(7); break; + #endif + } + #endif // E_STEPPERS + } break; + } + } + + if (report) { + #if AXIS_HAS_STEALTHCHOP(X) + TMC_SAY_PWMTHRS(X,X); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_SAY_PWMTHRS(X,X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_SAY_PWMTHRS(Y,Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_SAY_PWMTHRS(Y,Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_SAY_PWMTHRS(Z,Z); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_SAY_PWMTHRS(Z,Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_SAY_PWMTHRS(Z,Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + TMC_SAY_PWMTHRS(Z,Z4); + #endif + #if E_STEPPERS && AXIS_HAS_STEALTHCHOP(E0) + TMC_SAY_PWMTHRS_E(0); + #endif + #if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) + TMC_SAY_PWMTHRS_E(1); + #endif + #if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) + TMC_SAY_PWMTHRS_E(2); + #endif + #if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) + TMC_SAY_PWMTHRS_E(3); + #endif + #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) + TMC_SAY_PWMTHRS_E(4); + #endif + #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5) + TMC_SAY_PWMTHRS_E(5); + #endif + #if E_STEPPERS > 6 && AXIS_HAS_STEALTHCHOP(E6) + TMC_SAY_PWMTHRS_E(6); + #endif + #if E_STEPPERS > 7 && AXIS_HAS_STEALTHCHOP(E7) + TMC_SAY_PWMTHRS_E(7); + #endif + } + } +#endif // HYBRID_THRESHOLD + +/** + * M914: Set StallGuard sensitivity. + */ +#if USE_SENSORLESS + void GcodeSuite::M914() { + + bool report = true; + const uint8_t index = parser.byteval('I'); + LOOP_XYZ(i) if (parser.seen(XYZ_CHAR(i))) { + const int16_t value = parser.value_int(); + report = false; + switch (i) { + #if X_SENSORLESS + case X_AXIS: + #if AXIS_HAS_STALLGUARD(X) + if (index < 2) stepperX.homing_threshold(value); + #endif + #if AXIS_HAS_STALLGUARD(X2) + if (!(index & 1)) stepperX2.homing_threshold(value); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + #if AXIS_HAS_STALLGUARD(Y) + if (index < 2) stepperY.homing_threshold(value); + #endif + #if AXIS_HAS_STALLGUARD(Y2) + if (!(index & 1)) stepperY2.homing_threshold(value); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + #if AXIS_HAS_STALLGUARD(Z) + if (index < 2) stepperZ.homing_threshold(value); + #endif + #if AXIS_HAS_STALLGUARD(Z2) + if (index == 0 || index == 2) stepperZ2.homing_threshold(value); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + if (index == 0 || index == 3) stepperZ3.homing_threshold(value); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + if (index == 0 || index == 4) stepperZ4.homing_threshold(value); + #endif + break; + #endif + } + } + + if (report) { + #if X_SENSORLESS + #if AXIS_HAS_STALLGUARD(X) + tmc_print_sgt(stepperX); + #endif + #if AXIS_HAS_STALLGUARD(X2) + tmc_print_sgt(stepperX2); + #endif + #endif + #if Y_SENSORLESS + #if AXIS_HAS_STALLGUARD(Y) + tmc_print_sgt(stepperY); + #endif + #if AXIS_HAS_STALLGUARD(Y2) + tmc_print_sgt(stepperY2); + #endif + #endif + #if Z_SENSORLESS + #if AXIS_HAS_STALLGUARD(Z) + tmc_print_sgt(stepperZ); + #endif + #if AXIS_HAS_STALLGUARD(Z2) + tmc_print_sgt(stepperZ2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + tmc_print_sgt(stepperZ3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + tmc_print_sgt(stepperZ4); + #endif + #endif + } + } +#endif // USE_SENSORLESS + +#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp new file mode 100644 index 00000000..f2eb37b3 --- /dev/null +++ b/Marlin/src/gcode/gcode.cpp @@ -0,0 +1,1037 @@ +/** + * 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 . + * + */ + +/** + * gcode.cpp - Temporary container for all gcode handlers + * Most will migrate to classes, by feature. + */ + +#include "gcode.h" +GcodeSuite gcode; + +#if ENABLED(WIFI_CUSTOM_COMMAND) + extern bool wifi_custom_command(char * const command_ptr); +#endif + +#include "parser.h" +#include "queue.h" +#include "../module/motion.h" + +#if ENABLED(PRINTCOUNTER) + #include "../module/printcounter.h" +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../feature/host_actions.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../sd/cardreader.h" + #include "../feature/powerloss.h" +#endif + +#if ENABLED(CANCEL_OBJECTS) + #include "../feature/cancel_object.h" +#endif + +#if ENABLED(LASER_MOVE_POWER) + #include "../feature/spindle_laser.h" +#endif + +#if ENABLED(PASSWORD_FEATURE) + #include "../feature/password/password.h" +#endif + +#include "../MarlinCore.h" // for idle() + +// 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; +uint8_t GcodeSuite::axis_relative = ( + (ar_init.x ? _BV(REL_X) : 0) + | (ar_init.y ? _BV(REL_Y) : 0) + | (ar_init.z ? _BV(REL_Z) : 0) + | (ar_init.e ? _BV(REL_E) : 0) +); + +#if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) + bool GcodeSuite::autoreport_paused; // = false +#endif + +#if ENABLED(HOST_KEEPALIVE_FEATURE) + GcodeSuite::MarlinBusyState GcodeSuite::busy_state = NOT_BUSY; + uint8_t GcodeSuite::host_keepalive_interval = DEFAULT_KEEPALIVE_INTERVAL; +#endif + +#if ENABLED(CNC_WORKSPACE_PLANES) + GcodeSuite::WorkspacePlane GcodeSuite::workspace_plane = PLANE_XY; +#endif + +#if ENABLED(CNC_COORDINATE_SYSTEMS) + int8_t GcodeSuite::active_coordinate_system = -1; // machine space + xyz_pos_t GcodeSuite::coordinate_system[MAX_COORDINATE_SYSTEMS]; +#endif + +/** + * Get the target extruder from the T parameter or the active_extruder + * Return -1 if the T parameter is out of range + */ +int8_t GcodeSuite::get_target_extruder_from_command() { + if (parser.seenval('T')) { + const int8_t e = parser.value_byte(); + if (e < EXTRUDERS) return e; + SERIAL_ECHO_START(); + SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); + SERIAL_ECHOLNPAIR(" " STR_INVALID_EXTRUDER " ", int(e)); + return -1; + } + return active_extruder; +} + +/** + * Get the target e stepper from the T parameter + * Return -1 if the T parameter is out of range or unspecified + */ +int8_t GcodeSuite::get_target_e_stepper_from_command() { + const int8_t e = parser.intval('T', -1); + if (WITHIN(e, 0, E_STEPPERS - 1)) return e; + + SERIAL_ECHO_START(); + SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); + if (e == -1) + SERIAL_ECHOLNPGM(" " STR_E_STEPPER_NOT_SPECIFIED); + else + SERIAL_ECHOLNPAIR(" " STR_INVALID_E_STEPPER " ", int(e)); + return -1; +} + +/** + * Set XYZE destination and feedrate from the current GCode command + * + * - Set destination from included axis codes + * - Set to current for missing axis codes + * - Set the feedrate, if included + */ +void GcodeSuite::get_destination_from_command() { + xyze_bool_t seen = { false, false, false, false }; + + #if ENABLED(CANCEL_OBJECTS) + const bool &skip_move = cancelable.skipping; + #else + constexpr bool skip_move = false; + #endif + + // Get new XYZ position, whether absolute or relative + LOOP_XYZ(i) { + if ( (seen[i] = parser.seenval(XYZ_CHAR(i))) ) { + const float v = parser.value_axis_units((AxisEnum)i); + if (skip_move) + destination[i] = current_position[i]; + else + destination[i] = axis_is_relative(AxisEnum(i)) ? current_position[i] + v : LOGICAL_TO_NATIVE(v, i); + } + else + destination[i] = current_position[i]; + } + + // Get new E position, whether absolute or relative + if ( (seen.e = parser.seenval('E')) ) { + const float v = parser.value_axis_units(E_AXIS); + destination.e = axis_is_relative(E_AXIS) ? current_position.e + v : v; + } + else + destination.e = current_position.e; + + #if ENABLED(POWER_LOSS_RECOVERY) && !PIN_EXISTS(POWER_LOSS) + // Only update power loss recovery on moves with E + if (recovery.enabled && IS_SD_PRINTING() && seen.e && (seen.x || seen.y)) + recovery.save(); + #endif + + if (parser.linearval('F') > 0) + feedrate_mm_s = parser.value_feedrate(); + + #if ENABLED(PRINTCOUNTER) + if (!DEBUGGING(DRYRUN) && !skip_move) + print_job_timer.incFilamentUsed(destination.e - current_position.e); + #endif + + // Get ABCDHI mixing factors + #if BOTH(MIXING_EXTRUDER, DIRECT_MIXING_IN_G1) + M165(); + #endif + + #if ENABLED(LASER_MOVE_POWER) + // Set the laser power in the planner to configure this move + if (parser.seen('S')) { + const float spwr = parser.value_float(); + cutter.inline_power(TERN(SPINDLE_LASER_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0)); + } + else if (ENABLED(LASER_MOVE_G0_OFF) && parser.codenum == 0) // G0 + cutter.set_inline_enabled(false); + #endif +} + +/** + * Dwell waits immediately. It does not synchronize. Use M400 instead of G4 + */ +void GcodeSuite::dwell(millis_t time) { + time += millis(); + while (PENDING(millis(), time)) idle(); +} + +/** + * When G29_RETRY_AND_RECOVER is enabled, call G29() in + * a loop with recovery and retry handling. + */ +#if BOTH(HAS_LEVELING, G29_RETRY_AND_RECOVER) + + #ifndef G29_MAX_RETRIES + #define G29_MAX_RETRIES 0 + #endif + + void GcodeSuite::G29_with_retry() { + uint8_t retries = G29_MAX_RETRIES; + while (G29()) { // G29 should return true for failed probes ONLY + if (retries--) event_probe_recover(); + else { + event_probe_failure(); + return; + } + } + + TERN_(HOST_PROMPT_SUPPORT, host_action_prompt_end()); + + #ifdef G29_SUCCESS_COMMANDS + process_subcommands_now_P(PSTR(G29_SUCCESS_COMMANDS)); + #endif + } + +#endif // HAS_LEVELING && G29_RETRY_AND_RECOVER + +// +// Placeholders for non-migrated codes +// +#if ENABLED(M100_FREE_MEMORY_WATCHER) + extern void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); +#endif + +/** + * Process the parsed command and dispatch it to its handler + */ +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); + if (!no_ok) queue.ok_to_send(); + return; + } + #endif + + // Handle a known G, M, or T + switch (parser.command_letter) { + case 'G': switch (parser.codenum) { + + case 0: case 1: // G0: Fast Move, G1: Linear Move + G0_G1(TERN_(HAS_FAST_MOVES, parser.codenum == 0)); break; + + #if ENABLED(ARC_SUPPORT) && DISABLED(SCARA) + case 2: case 3: G2_G3(parser.codenum == 2); break; // G2: CW ARC, G3: CCW ARC + #endif + + case 4: G4(); break; // G4: Dwell + + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: G5(); break; // G5: Cubic B_spline + #endif + + #if ENABLED(DIRECT_STEPPING) + case 6: G6(); break; // G6: Direct Stepper Move + #endif + + #if ENABLED(FWRETRACT) + case 10: G10(); break; // G10: Retract / Swap Retract + case 11: G11(); break; // G11: Recover / Swap Recover + #endif + + #if ENABLED(NOZZLE_CLEAN_FEATURE) + case 12: G12(); break; // G12: Nozzle Clean + #endif + + #if ENABLED(CNC_WORKSPACE_PLANES) + case 17: G17(); break; // G17: Select Plane XY + case 18: G18(); break; // G18: Select Plane ZX + case 19: G19(); break; // G19: Select Plane YZ + #endif + + #if ENABLED(INCH_MODE_SUPPORT) + case 20: G20(); break; // G20: Inch Mode + case 21: G21(); break; // G21: MM Mode + #else + case 21: NOOP; break; // No error on unknown G21 + #endif + + #if ENABLED(G26_MESH_VALIDATION) + case 26: G26(); break; // G26: Mesh Validation Pattern generation + #endif + + #if ENABLED(NOZZLE_PARK_FEATURE) + case 27: G27(); break; // G27: Nozzle Park + #endif + + case 28: G28(); break; // G28: Home one or more axes + + #if HAS_LEVELING + case 29: // G29: Bed leveling calibration + TERN(G29_RETRY_AND_RECOVER, G29_with_retry, G29)(); + break; + #endif + + #if HAS_BED_PROBE + case 30: G30(); break; // G30: Single Z probe + #if ENABLED(Z_PROBE_SLED) + case 31: G31(); break; // G31: dock the sled + case 32: G32(); break; // G32: undock the sled + #endif + #endif + + #if ENABLED(DELTA_AUTO_CALIBRATION) + case 33: G33(); break; // G33: Delta Auto-Calibration + #endif + + #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + case 34: G34(); break; // G34: Z Stepper automatic alignment using probe + #endif + + #if ENABLED(ASSISTED_TRAMMING) + case 35: G35(); break; // G35: Read four bed corners to help adjust bed screws + #endif + + #if ENABLED(G38_PROBE_TARGET) + case 38: // G38.2, G38.3: Probe towards 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 + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + case 53: G53(); break; // G53: (prefix) Apply native workspace + case 54: G54(); break; // G54: Switch to Workspace 1 + case 55: G55(); break; // G55: Switch to Workspace 2 + case 56: G56(); break; // G56: Switch to Workspace 3 + case 57: G57(); break; // G57: Switch to Workspace 4 + case 58: G58(); break; // G58: Switch to Workspace 5 + case 59: G59(); break; // G59.0 - G59.3: Switch to Workspace 6-9 + #endif + + #if SAVED_POSITIONS + case 60: G60(); break; // G60: save current position + case 61: G61(); break; // G61: Apply/restore saved coordinates. + #endif + + #if ENABLED(PROBE_TEMP_COMPENSATION) + case 76: G76(); break; // G76: Calibrate first layer compensation values + #endif + + #if ENABLED(GCODE_MOTION_MODES) + case 80: G80(); break; // G80: Reset the current motion mode + #endif + + case 90: set_relative_mode(false); break; // G90: Absolute Mode + case 91: set_relative_mode(true); break; // G91: Relative Mode + + case 92: G92(); break; // G92: Set current axis position(s) + + #if HAS_MESH + case 42: G42(); break; // G42: Coordinated move to a mesh point + #endif + + #if ENABLED(CALIBRATION_GCODE) + case 425: G425(); break; // G425: Perform calibration with calibration cube + #endif + + #if ENABLED(DEBUG_GCODE_PARSER) + case 800: parser.debug(); break; // G800: GCode Parser Test for G + #endif + + default: parser.unknown_command_warning(); break; + } + break; + + case 'M': switch (parser.codenum) { + + #if HAS_RESUME_CONTINUE + case 0: // M0: Unconditional stop - Wait for user button press on LCD + case 1: M0_M1(); break; // M1: Conditional stop - Wait for user button press on LCD + #endif + + #if HAS_CUTTER + case 3: M3_M4(false); break; // M3: Turn ON Laser | Spindle (clockwise), set Power | Speed + case 4: M3_M4(true ); break; // M4: Turn ON Laser | Spindle (counter-clockwise), set Power | Speed + case 5: M5(); break; // M5: Turn OFF Laser | Spindle + #endif + + #if ENABLED(COOLANT_CONTROL) + #if ENABLED(COOLANT_MIST) + case 7: M7(); break; // M7: Mist coolant ON + #endif + #if ENABLED(COOLANT_FLOOD) + case 8: M8(); break; // M8: Flood coolant ON + #endif + case 9: M9(); break; // M9: Coolant OFF + #endif + + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + case 12: M12(); break; // M12: Synchronize and optionally force a CLC set + #endif + + #if ENABLED(EXPECTED_PRINTER_CHECK) + case 16: M16(); break; // M16: Expected printer check + #endif + + case 17: M17(); break; // M17: Enable all stepper motors + + #if ENABLED(SDSUPPORT) + case 20: M20(); break; // M20: List SD card + case 21: M21(); break; // M21: Init SD card + case 22: M22(); break; // M22: Release SD card + case 23: M23(); break; // M23: Select file + case 24: M24(); break; // M24: Start SD print + case 25: M25(); break; // M25: Pause SD print + case 26: M26(); break; // M26: Set SD index + case 27: M27(); break; // M27: Get SD status + case 28: M28(); break; // M28: Start SD write + case 29: M29(); break; // M29: Stop SD write + case 30: M30(); break; // M30 Delete File + case 32: M32(); break; // M32: Select file and start SD print + + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + case 33: M33(); break; // M33: Get the long full path to a file or folder + #endif + + #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + case 34: M34(); break; // M34: Set SD card sorting options + #endif + + case 928: M928(); break; // M928: Start SD write + #endif // SDSUPPORT + + case 31: M31(); break; // M31: Report time since the start of SD print or last M109 + + #if ENABLED(DIRECT_PIN_CONTROL) + case 42: M42(); break; // M42: Change pin state + #endif + + #if ENABLED(PINS_DEBUGGING) + case 43: M43(); break; // M43: Read pin state + #endif + + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + case 48: M48(); break; // M48: Z probe repeatability test + #endif + + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + case 73: M73(); break; // M73: Set progress percentage (for display on LCD) + #endif + + case 75: M75(); break; // M75: Start print timer + case 76: M76(); break; // M76: Pause print timer + case 77: M77(); break; // M77: Stop print timer + + #if ENABLED(PRINTCOUNTER) + case 78: M78(); break; // M78: Show print statistics + #endif + + #if ENABLED(M100_FREE_MEMORY_WATCHER) + case 100: M100(); break; // M100: Free Memory Report + #endif + + #if EXTRUDERS + case 104: M104(); break; // M104: Set hot end temperature + case 109: M109(); break; // M109: Wait for hotend temperature to reach target + #endif + + case 105: M105(); return; // M105: Report Temperatures (and say "ok") + + #if HAS_FAN + case 106: M106(); break; // M106: Fan On + case 107: M107(); break; // M107: Fan Off + #endif + + case 110: M110(); break; // M110: Set Current Line Number + case 111: M111(); break; // M111: Set debug level + + #if DISABLED(EMERGENCY_PARSER) + 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. + TERN_(HOST_PROMPT_SUPPORT, case 876:) // M876: Handle Host prompt responses + #else + case 108: case 112: case 410: + TERN_(HOST_PROMPT_SUPPORT, case 876:) + break; + #endif + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + case 113: M113(); break; // M113: Set Host Keepalive interval + #endif + + #if HAS_HEATED_BED + case 140: M140(); break; // M140: Set bed temperature + case 190: M190(); break; // M190: Wait for bed temperature to reach target + #endif + + #if HAS_HEATED_CHAMBER + case 141: M141(); break; // M141: Set chamber temperature + case 191: M191(); break; // M191: Wait for chamber temperature to reach target + #endif + + #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) + case 155: M155(); break; // M155: Set temperature auto-report interval + #endif + + #if ENABLED(PARK_HEAD_ON_PAUSE) + case 125: M125(); break; // M125: Store current position and move to filament change position + #endif + + #if ENABLED(BARICUDA) + // PWM for HEATER_1_PIN + #if HAS_HEATER_1 + case 126: M126(); break; // M126: valve open + case 127: M127(); break; // M127: valve closed + #endif + + // PWM for HEATER_2_PIN + #if HAS_HEATER_2 + case 128: M128(); break; // M128: valve open + case 129: M129(); break; // M129: valve closed + #endif + #endif // BARICUDA + + #if ENABLED(PSU_CONTROL) + case 80: M80(); break; // M80: Turn on Power Supply + #endif + case 81: M81(); break; // M81: Turn off Power, including Power Supply, if possible + + case 82: M82(); break; // M82: Set E axis normal mode (same as other axes) + case 83: M83(); break; // M83: Set E axis relative mode + case 18: case 84: M18_M84(); break; // M18/M84: Disable Steppers / Set Timeout + case 85: M85(); break; // M85: Set inactivity stepper shutdown timeout + case 92: M92(); break; // M92: Set the steps-per-unit for one or more axes + case 114: M114(); break; // M114: Report current position + case 115: M115(); break; // M115: Report capabilities + case 117: M117(); break; // M117: Set LCD message text, if possible + case 118: M118(); break; // M118: Display a message in the host console + case 119: M119(); break; // M119: Report endstop states + case 120: M120(); break; // M120: Enable endstops + case 121: M121(); break; // M121: Disable endstops + + #if PREHEAT_COUNT + case 145: M145(); break; // M145: Set material heatup parameters + #endif + + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + case 149: M149(); break; // M149: Set temperature units + #endif + + #if HAS_COLOR_LEDS + case 150: M150(); break; // M150: Set Status LED Color + #endif + + #if ENABLED(MIXING_EXTRUDER) + case 163: M163(); break; // M163: Set a component weight for mixing extruder + case 164: M164(); break; // M164: Save current mix as a virtual extruder + #if ENABLED(DIRECT_MIXING_IN_G1) + case 165: M165(); break; // M165: Set multiple mix weights + #endif + #if ENABLED(GRADIENT_MIX) + case 166: M166(); break; // M166: Set Gradient Mix + #endif + #endif + + #if DISABLED(NO_VOLUMETRICS) + case 200: M200(); break; // M200: Set filament diameter, E to cubic units + #endif + + case 201: M201(); break; // M201: Set max acceleration for print moves (units/s^2) + + #if 0 + case 202: M202(); break; // M202: Not used for Sprinter/grbl gen6 + #endif + + case 203: M203(); break; // M203: Set max feedrate (units/sec) + case 204: M204(); break; // M204: Set acceleration + case 205: M205(); break; // M205: Set advanced settings + + #if HAS_M206_COMMAND + case 206: M206(); break; // M206: Set home offsets + #endif + + #if ENABLED(FWRETRACT) + case 207: M207(); break; // M207: Set Retract Length, Feedrate, and Z lift + case 208: M208(); break; // M208: Set Recover (unretract) Additional Length and Feedrate + #if ENABLED(FWRETRACT_AUTORETRACT) + case 209: + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) M209(); // M209: Turn Automatic Retract Detection on/off + break; + #endif + #endif + + #if HAS_SOFTWARE_ENDSTOPS + case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops + #endif + + #if HAS_MULTI_EXTRUDER + case 217: M217(); break; // M217: Set filament swap parameters + #endif + + #if HAS_HOTEND_OFFSET + case 218: M218(); break; // M218: Set a tool offset + #endif + + case 220: M220(); break; // M220: Set Feedrate Percentage: S ("FR" on your LCD) + + #if EXTRUDERS + case 221: M221(); break; // M221: Set Flow Percentage + #endif + + #if ENABLED(DIRECT_PIN_CONTROL) + case 226: M226(); break; // M226: Wait until a pin reaches a state + #endif + + #if HAS_SERVOS + case 280: M280(); break; // M280: Set servo position absolute + #if ENABLED(EDITABLE_SERVO_ANGLES) + case 281: M281(); break; // M281: Set servo angles + #endif + #endif + + #if ENABLED(BABYSTEPPING) + case 290: M290(); break; // M290: Babystepping + #endif + + #if HAS_BUZZER + case 300: M300(); break; // M300: Play beep tone + #endif + + #if ENABLED(PIDTEMP) + case 301: M301(); break; // M301: Set hotend PID parameters + #endif + + #if ENABLED(PIDTEMPBED) + case 304: M304(); break; // M304: Set bed PID parameters + #endif + + #if ENABLED(PHOTO_GCODE) + case 240: M240(); break; // M240: Trigger a camera + #endif + + #if HAS_LCD_CONTRAST + case 250: M250(); break; // M250: Set LCD contrast + #endif + + #if ENABLED(EXPERIMENTAL_I2CBUS) + case 260: M260(); break; // M260: Send data to an i2c slave + case 261: M261(); break; // M261: Request data from an i2c slave + #endif + + #if ENABLED(PREVENT_COLD_EXTRUSION) + case 302: M302(); break; // M302: Allow cold extrudes (set the minimum extrude temperature) + #endif + + #if HAS_PID_HEATING + case 303: M303(); break; // M303: PID autotune + #endif + + #if HAS_USER_THERMISTORS + case 305: M305(); break; // M305: Set user thermistor parameters + #endif + + #if ENABLED(REPETIER_GCODE_M360) + case 360: M360(); break; // M360: Firmware settings + #endif + + #if ENABLED(MORGAN_SCARA) + case 360: if (M360()) return; break; // M360: SCARA Theta pos1 + case 361: if (M361()) return; break; // M361: SCARA Theta pos2 + case 362: if (M362()) return; break; // M362: SCARA Psi pos1 + case 363: if (M363()) return; break; // M363: SCARA Psi pos2 + case 364: if (M364()) return; break; // M364: SCARA Psi pos3 (90 deg to Theta) + #endif + + #if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + case 380: M380(); break; // M380: Activate solenoid on active (or specified) extruder + case 381: M381(); break; // M381: Disable all solenoids or, if MANUAL_SOLENOID_CONTROL, active (or specified) solenoid + #endif + + case 400: M400(); break; // M400: Finish all moves + + #if HAS_BED_PROBE + case 401: M401(); break; // M401: Deploy probe + case 402: M402(); break; // M402: Stow probe + #endif + + #if ENABLED(PRUSA_MMU2) + case 403: M403(); break; + #endif + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + case 404: M404(); break; // M404: Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or display nominal filament width + case 405: M405(); break; // M405: Turn on filament sensor for control + case 406: M406(); break; // M406: Turn off filament sensor for control + case 407: M407(); break; // M407: Display measured filament diameter + #endif + + #if HAS_FILAMENT_SENSOR + case 412: M412(); break; // M412: Enable/Disable filament runout detection + #endif + + #if HAS_LEVELING + case 420: M420(); break; // M420: Enable/Disable Bed Leveling + #endif + + #if HAS_MESH + case 421: M421(); break; // M421: Set a Mesh Bed Leveling Z coordinate + #endif + + #if ENABLED(BACKLASH_GCODE) + case 425: M425(); break; // M425: Tune backlash compensation + #endif + + #if HAS_M206_COMMAND + case 428: M428(); break; // M428: Apply current_position to home_offset + #endif + + #if HAS_POWER_MONITOR + case 430: M430(); break; // M430: Read the system current (A), voltage (V), and power (W) + #endif + + #if ENABLED(CANCEL_OBJECTS) + case 486: M486(); break; // M486: Identify and cancel objects + #endif + + case 500: M500(); break; // M500: Store settings in EEPROM + case 501: M501(); break; // M501: Read settings from EEPROM + case 502: M502(); break; // M502: Revert to default settings + #if DISABLED(DISABLE_M503) + case 503: M503(); break; // M503: print settings currently in memory + #endif + #if ENABLED(EEPROM_SETTINGS) + 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 + + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + case 540: M540(); break; // M540: Set abort on endstop hit for SD printing + #endif + + #if ENABLED(BAUD_RATE_GCODE) + case 575: M575(); break; // M575: Set serial baudrate + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + case 600: M600(); break; // M600: Pause for Filament Change + case 603: M603(); break; // M603: Configure Filament Change + #endif + + #if HAS_DUPLICATION_MODE + case 605: M605(); break; // M605: Set Dual X Carriage movement mode + #endif + + #if ENABLED(DELTA) + case 665: M665(); break; // M665: Set delta configurations + #endif + + #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS + case 666: M666(); break; // M666: Set delta or multiple endstop adjustment + #endif + + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + case 672: M672(); break; // M672: Set/clear Duet Smart Effector sensitivity + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + case 701: M701(); break; // M701: Load Filament + case 702: M702(); break; // M702: Unload Filament + #endif + + #if ENABLED(CONTROLLER_FAN_EDITABLE) + case 710: M710(); break; // M710: Set Controller Fan settings + #endif + + #if ENABLED(GCODE_MACROS) + case 810: case 811: case 812: case 813: case 814: + case 815: case 816: case 817: case 818: case 819: + M810_819(); break; // M810-M819: Define/execute G-code macro + #endif + + #if HAS_BED_PROBE + case 851: M851(); break; // M851: Set Z Probe Z Offset + #endif + + #if ENABLED(SKEW_CORRECTION_GCODE) + case 852: M852(); break; // M852: Set Skew factors + #endif + + #if ENABLED(PROBE_TEMP_COMPENSATION) + case 192: M192(); break; // M192: Wait for probe temp + case 871: M871(); break; // M871: Print/reset/clear first layer temperature offset values + #endif + + #if ENABLED(LIN_ADVANCE) + case 900: M900(); break; // M900: Set advance K factor. + #endif + + #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) + case 907: M907(); break; // M907: Set digital trimpot motor current using axis codes. + #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) + case 908: M908(); break; // M908: Control digital trimpot directly. + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + case 909: M909(); break; // M909: Print digipot/DAC current value + case 910: M910(); break; // M910: Commit digipot/DAC value to external EEPROM + #endif + #endif + #endif + + #if HAS_TRINAMIC_CONFIG + case 122: M122(); break; // M122: Report driver configuration and status + case 906: M906(); break; // M906: Set motor current in milliamps using axis codes X, Y, Z, E + #if HAS_STEALTHCHOP + case 569: M569(); break; // M569: Enable stealthChop on an axis. + #endif + #if ENABLED(MONITOR_DRIVER_STATUS) + case 911: M911(); break; // M911: Report TMC2130 prewarn triggered flags + case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags + #endif + #if ENABLED(HYBRID_THRESHOLD) + case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed. + #endif + #if USE_SENSORLESS + case 914: M914(); break; // M914: Set StallGuard sensitivity. + #endif + #endif + + #if HAS_L64XX + case 122: M122(); break; // M122: Report status + case 906: M906(); break; // M906: Set or get motor drive level + case 916: M916(); break; // M916: L6470 tuning: Increase drive level until thermal warning + case 917: M917(); break; // M917: L6470 tuning: Find minimum current thresholds + case 918: M918(); break; // M918: L6470 tuning: Increase speed until max or error + #endif + + #if HAS_MICROSTEPS + case 350: M350(); break; // M350: Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers. + case 351: M351(); break; // M351: Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low. + #endif + + #if ENABLED(CASE_LIGHT_ENABLE) + case 355: M355(); break; // M355: Set case light brightness + #endif + + #if ENABLED(DEBUG_GCODE_PARSER) + case 800: parser.debug(); break; // M800: GCode Parser Test for M + #endif + + #if ENABLED(I2C_POSITION_ENCODERS) + case 860: M860(); break; // M860: Report encoder module position + case 861: M861(); break; // M861: Report encoder module status + case 862: M862(); break; // M862: Perform axis test + case 863: M863(); break; // M863: Calibrate steps/mm + case 864: M864(); break; // M864: Change module address + case 865: M865(); break; // M865: Check module firmware version + case 866: M866(); break; // M866: Report axis error count + case 867: M867(); break; // M867: Toggle error correction + case 868: M868(); break; // M868: Set error correction threshold + case 869: M869(); break; // M869: Report axis error + #endif + + #if ENABLED(MAGNETIC_PARKING_EXTRUDER) + case 951: M951(); break; // M951: Set Magnetic Parking Extruder parameters + #endif + + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe + #endif + + #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 + + #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 + + case 999: M999(); break; // M999: Restart after being Stopped + + #if ENABLED(POWER_LOSS_RECOVERY) + case 413: M413(); break; // M413: Enable/disable/query Power-Loss Recovery + case 1000: M1000(); break; // M1000: [INTERNAL] Resume from power-loss + #endif + + #if ENABLED(SDSUPPORT) + case 1001: M1001(); break; // M1001: [INTERNAL] Handle SD completion + #endif + + #if ENABLED(MAX7219_GCODE) + case 7219: M7219(); break; // M7219: Set LEDs, columns, and rows + #endif + + default: parser.unknown_command_warning(); break; + } + break; + + case 'T': T(parser.codenum); break; // Tn: Tool Change + + #if ENABLED(MARLIN_DEV_MODE) + case 'D': D(parser.codenum); break; // Dn: Debug codes + #endif + + default: + #if ENABLED(WIFI_CUSTOM_COMMAND) + if (wifi_custom_command(parser.command_ptr)) break; + #endif + parser.unknown_command_warning(); + } + + if (!no_ok) queue.ok_to_send(); +} + +/** + * Process a single command and dispatch it to its handler + * This is called from the main loop() + */ +void GcodeSuite::process_next_command() { + char * const current_command = queue.command_buffer[queue.index_r]; + + PORT_REDIRECT(queue.port[queue.index_r]); + + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.queue_index_r = queue.index_r; + #endif + + if (DEBUGGING(ECHO)) { + SERIAL_ECHO_START(); + SERIAL_ECHOLN(current_command); + #if ENABLED(M100_FREE_MEMORY_DUMPER) + SERIAL_ECHOPAIR("slot:", queue.index_r); + M100_dump_routine(PSTR(" Command Queue:"), &queue.command_buffer[0][0], &queue.command_buffer[BUFSIZE - 1][MAX_CMD_SIZE - 1]); + #endif + } + + // Parse the next command in the queue + parser.parse(current_command); + process_parsed_command(); +} + +/** + * Run a series of commands, bypassing the command queue to allow + * G-code "macros" to be called from within other G-code handlers. + */ + +void GcodeSuite::process_subcommands_now_P(PGM_P pgcode) { + char * const saved_cmd = parser.command_ptr; // Save the parser state + for (;;) { + PGM_P const delim = strchr_P(pgcode, '\n'); // Get address of next newline + const size_t len = delim ? delim - pgcode : strlen_P(pgcode); // Get the command length + char cmd[len + 1]; // Allocate a stack buffer + strncpy_P(cmd, pgcode, len); // Copy the command to the stack + cmd[len] = '\0'; // End with a nul + parser.parse(cmd); // Parse the command + process_parsed_command(true); // Process it + if (!delim) break; // Last command? + pgcode = delim + 1; // Get the next command + } + parser.parse(saved_cmd); // Restore the parser state +} + +void GcodeSuite::process_subcommands_now(char * gcode) { + char * const saved_cmd = parser.command_ptr; // Save the parser state + for (;;) { + char * const delim = strchr(gcode, '\n'); // Get address of next newline + if (delim) *delim = '\0'; // Replace with nul + parser.parse(gcode); // Parse the current command + if (delim) *delim = '\n'; // Put back the newline + process_parsed_command(true); // Process it + if (!delim) break; // Last command? + gcode = delim + 1; // Get the next command + } + parser.parse(saved_cmd); // Restore the parser state +} + +#if ENABLED(HOST_KEEPALIVE_FEATURE) + + /** + * Output a "busy" message at regular intervals + * while the machine is not accepting commands. + */ + void GcodeSuite::host_keepalive() { + const millis_t ms = millis(); + static millis_t next_busy_signal_ms = 0; + if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) { + if (PENDING(ms, next_busy_signal_ms)) return; + switch (busy_state) { + case IN_HANDLER: + case IN_PROCESS: + SERIAL_ECHO_MSG(STR_BUSY_PROCESSING); + break; + case PAUSED_FOR_USER: + SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_USER); + break; + case PAUSED_FOR_INPUT: + SERIAL_ECHO_MSG(STR_BUSY_PAUSED_FOR_INPUT); + break; + default: + break; + } + } + next_busy_signal_ms = ms + SEC_TO_MS(host_keepalive_interval); + } + +#endif // HOST_KEEPALIVE_FEATURE diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h new file mode 100644 index 00000000..3d745eff --- /dev/null +++ b/Marlin/src/gcode/gcode.h @@ -0,0 +1,892 @@ +/** + * 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 + +/** + * gcode.h - Temporary container for all gcode handlers + */ + +/** + * ----------------- + * G-Codes in Marlin + * ----------------- + * + * Helpful G-code references: + * - https://marlinfw.org/meta/gcode + * - https://reprap.org/wiki/G-code + * - https://linuxcnc.org/docs/html/gcode.html + * + * Help to document Marlin's G-codes online: + * - https://github.com/MarlinFirmware/MarlinDocumentation + * + * ----------------- + * + * "G" Codes + * + * G0 -> G1 + * G1 - Coordinated Movement X Y Z E + * G2 - CW ARC + * G3 - CCW ARC + * G4 - Dwell S or P + * G5 - Cubic B-spline with XYZE destination and IJPQ offsets + * G10 - Retract filament according to settings of M207 (Requires FWRETRACT) + * G11 - Retract recover filament according to settings of M208 (Requires FWRETRACT) + * G12 - Clean tool (Requires NOZZLE_CLEAN_FEATURE) + * G17 - Select Plane XY (Requires CNC_WORKSPACE_PLANES) + * G18 - Select Plane ZX (Requires CNC_WORKSPACE_PLANES) + * G19 - Select Plane YZ (Requires CNC_WORKSPACE_PLANES) + * G20 - Set input units to inches (Requires INCH_MODE_SUPPORT) + * G21 - Set input units to millimeters (Requires INCH_MODE_SUPPORT) + * G26 - Mesh Validation Pattern (Requires G26_MESH_VALIDATION) + * G27 - Park Nozzle (Requires NOZZLE_PARK_FEATURE) + * G28 - Home one or more axes + * G29 - Start or continue the bed leveling probe procedure (Requires bed leveling) + * G30 - Single Z probe, probes bed at X Y location (defaults to current XY location) + * G31 - Dock sled (Z_PROBE_SLED only) + * G32 - Undock sled (Z_PROBE_SLED only) + * G33 - Delta Auto-Calibration (Requires DELTA_AUTO_CALIBRATION) + * G34 - Z Stepper automatic alignment using probe: I T A (Requires Z_STEPPER_AUTO_ALIGN) + * G35 - Read bed corners to help adjust bed screws: T (Requires ASSISTED_TRAMMING) + * G38 - Probe in any direction using the Z_MIN_PROBE (Requires G38_PROBE_TARGET) + * G42 - Coordinated move to a mesh point (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BLINEAR, or AUTO_BED_LEVELING_UBL) + * G60 - Save current position. (Requires SAVED_POSITIONS) + * G61 - Apply/restore saved coordinates. (Requires SAVED_POSITIONS) + * G76 - Calibrate first layer temperature offsets. (Requires PROBE_TEMP_COMPENSATION) + * G80 - Cancel current motion mode (Requires GCODE_MOTION_MODES) + * G90 - Use Absolute Coordinates + * G91 - Use Relative Coordinates + * G92 - Set current position to coordinates given + * + * "M" Codes + * + * M0 - Unconditional stop - Wait for user to press a button on the LCD (Only if ULTRA_LCD is enabled) + * M1 -> M0 + * M3 - Turn ON Laser | Spindle (clockwise), set Power | Speed. (Requires SPINDLE_FEATURE or LASER_FEATURE) + * M4 - Turn ON Laser | Spindle (counter-clockwise), set Power | Speed. (Requires SPINDLE_FEATURE or LASER_FEATURE) + * M5 - Turn OFF Laser | Spindle. (Requires SPINDLE_FEATURE or LASER_FEATURE) + * M7 - Turn mist coolant ON. (Requires COOLANT_CONTROL) + * M8 - Turn flood coolant ON. (Requires COOLANT_CONTROL) + * M9 - Turn coolant OFF. (Requires COOLANT_CONTROL) + * M12 - Set up closed loop control system. (Requires EXTERNAL_CLOSED_LOOP_CONTROLLER) + * M16 - Expected printer check. (Requires EXPECTED_PRINTER_CHECK) + * M17 - Enable/Power all stepper motors + * M18 - Disable all stepper motors; same as M84 + * M20 - List SD card. (Requires SDSUPPORT) + * M21 - Init SD card. (Requires SDSUPPORT) + * M22 - Release SD card. (Requires SDSUPPORT) + * M23 - Select SD file: "M23 /path/file.gco". (Requires SDSUPPORT) + * M24 - Start/resume SD print. (Requires SDSUPPORT) + * M25 - Pause SD print. (Requires SDSUPPORT) + * M26 - Set SD position in bytes: "M26 S12345". (Requires SDSUPPORT) + * M27 - Report SD print status. (Requires SDSUPPORT) + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. + * M28 - Start SD write: "M28 /path/file.gco". (Requires SDSUPPORT) + * M29 - Stop SD write. (Requires SDSUPPORT) + * M30 - Delete file from SD: "M30 /path/file.gco" + * M31 - Report time since last M109 or SD card start to serial. + * M32 - Select file and start SD print: "M32 [S] !/path/file.gco#". (Requires SDSUPPORT) + * Use P to run other files as sub-programs: "M32 P !filename#" + * The '#' is necessary when calling from within sd files, as it stops buffer prereading + * M33 - Get the longname version of a path. (Requires LONG_FILENAME_HOST_SUPPORT) + * M34 - Set SD Card sorting options. (Requires SDCARD_SORT_ALPHA) + * M42 - Change pin status via gcode: M42 P S. LED pin assumed if P is omitted. (Requires DIRECT_PIN_CONTROL) + * M43 - Display pin status, watch pins for changes, watch endstops & toggle LED, Z servo probe test, toggle pins + * M48 - Measure Z Probe repeatability: M48 P X Y V E L S. (Requires Z_MIN_PROBE_REPEATABILITY_TEST) + * M73 - Set the progress percentage. (Requires LCD_SET_PROGRESS_MANUALLY) + * M75 - Start the print job timer. + * M76 - Pause the print job timer. + * M77 - Stop the print job timer. + * M78 - Show statistical information about the print jobs. (Requires PRINTCOUNTER) + * M80 - Turn on Power Supply. (Requires PSU_CONTROL) + * M81 - Turn off Power Supply. (Requires PSU_CONTROL) + * M82 - Set E codes absolute (default). + * M83 - Set E codes relative while in Absolute (G90) mode. + * M84 - Disable steppers until next move, or use S to specify an idle + * duration after which steppers should turn off. S0 disables the timeout. + * M85 - Set inactivity shutdown timer with parameter S. To disable set zero (default) + * M92 - Set planner.settings.axis_steps_per_mm for one or more axes. + * M100 - Watch Free Memory (for debugging) (Requires M100_FREE_MEMORY_WATCHER) + * M104 - Set extruder target temp. + * M105 - Report current temperatures. + * M106 - Set print fan speed. + * M107 - Print fan off. + * M108 - Break out of heating loops (M109, M190, M303). With no controller, breaks out of M0/M1. (Requires EMERGENCY_PARSER) + * M109 - S Wait for extruder current temp to reach target temp. ** Wait only when heating! ** + * R Wait for extruder current temp to reach target temp. ** Wait for heating or cooling. ** + * If AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F + * M110 - Set the current line number. (Used by host printing) + * M111 - Set debug flags: "M111 S". See flag bits defined in enum.h. + * M112 - Full Shutdown. + * M113 - Get or set the timeout interval for Host Keepalive "busy" messages. (Requires HOST_KEEPALIVE_FEATURE) + * M114 - Report current position. + * M115 - Report capabilities. (Extended capabilities requires EXTENDED_CAPABILITIES_REPORT) + * M117 - Display a message on the controller screen. (Requires an LCD) + * M118 - Display a message in the host console. + * M119 - Report endstops status. + * M120 - Enable endstops detection. + * M121 - Disable endstops detection. + * M122 - Debug stepper (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) + * M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE) + * M126 - Solenoid Air Valve Open. (Requires BARICUDA) + * M127 - Solenoid Air Valve Closed. (Requires BARICUDA) + * M128 - EtoP Open. (Requires BARICUDA) + * M129 - EtoP Closed. (Requires BARICUDA) + * M140 - Set bed target temp. S + * 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 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) + * M165 - Set the mix for the mixing extruder (and current virtual tool) with parameters ABCDHI. (Requires MIXING_EXTRUDER and DIRECT_MIXING_IN_G1) + * M166 - Set the Gradient Mix for the mixing extruder. (Requires GRADIENT_MIX) + * M190 - S Wait for bed current temp to reach target temp. ** Wait only when heating! ** + * R Wait for bed current temp to reach target temp. ** Wait for heating or cooling. ** + * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) + * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" + * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** + * M203 - Set maximum feedrate: "M203 X Y Z E" in units/sec. + * M204 - Set default acceleration in units/sec^2: P R T + * M205 - Set advanced settings. Current units apply: + S T minimum speeds + B + X, Y, Z, E + * M206 - Set additional homing offset. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) + * M207 - Set Retract Length: S, Feedrate: F, and Z lift: Z. (Requires FWRETRACT) + * M208 - Set Recover (unretract) Additional (!) Length: S and Feedrate: F. (Requires FWRETRACT) + * M209 - Turn Automatic Retract Detection on/off: S<0|1> (For slicers that don't support G10/11). (Requires FWRETRACT_AUTORETRACT) + Every normal extrude-only move will be classified as retract depending on the direction. + * M211 - Enable, Disable, and/or Report software endstops: S<0|1> (Requires MIN_SOFTWARE_ENDSTOPS or MAX_SOFTWARE_ENDSTOPS) + * M217 - Set filament swap parameters: "M217 S P R". (Requires SINGLENOZZLE) + * M218 - Set/get a tool offset: "M218 T X Y". (Requires 2 or more extruders) + * M220 - Set Feedrate Percentage: "M220 S" (i.e., "FR" on the LCD) + * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires PRUSA_MMU2) + * M221 - Set Flow Percentage: "M221 S" + * M226 - Wait until a pin is in a given state: "M226 P S" (Requires DIRECT_PIN_CONTROL) + * M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE) + * M250 - Set LCD contrast: "M250 C" (0-63). (Requires LCD support) + * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS) + * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS) + * M280 - Set servo position absolute: "M280 P S". (Requires servos) + * M281 - Set servo min|max position: "M281 P L U". (Requires EDITABLE_SERVO_ANGLES) + * M290 - Babystepping (Requires BABYSTEPPING) + * M300 - Play beep sound S P + * M301 - Set PID parameters P I and D. (Requires PIDTEMP) + * M302 - Allow cold extrudes, or set the minimum extrude S. (Requires PREVENT_COLD_EXTRUSION) + * M303 - PID relay autotune S sets the target temperature. Default 150C. (Requires PIDTEMP) + * M304 - Set bed PID parameters P I and D. (Requires PIDTEMPBED) + * M305 - Set user thermistor parameters R T and P. (Requires TEMP_SENSOR_x 1000) + * M350 - Set microstepping mode. (Requires digital microstepping pins.) + * M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.) + * M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN) + * M380 - Activate solenoid on active extruder. (Requires EXT_SOLENOID) + * M381 - Disable all solenoids. (Requires EXT_SOLENOID) + * M400 - Finish all moves. + * M401 - Deploy and activate Z probe. (Requires a probe) + * M402 - Deactivate and stow Z probe. (Requires a probe) + * M403 - Set filament type for PRUSA MMU2 + * M404 - Display or set the Nominal Filament Width: "W". (Requires FILAMENT_WIDTH_SENSOR) + * M405 - Enable Filament Sensor flow control. "M405 D". (Requires FILAMENT_WIDTH_SENSOR) + * M406 - Disable Filament Sensor flow control. (Requires FILAMENT_WIDTH_SENSOR) + * M407 - Display measured filament diameter in millimeters. (Requires FILAMENT_WIDTH_SENSOR) + * M410 - Quickstop. Abort all planned moves. + * M412 - Enable / Disable Filament Runout Detection. (Requires FILAMENT_RUNOUT_SENSOR) + * M413 - Enable / Disable Power-Loss Recovery. (Requires POWER_LOSS_RECOVERY) + * M420 - Enable/Disable Leveling (with current values) S1=enable S0=disable (Requires MESH_BED_LEVELING or ABL) + * M421 - Set a single Z coordinate in the Mesh Leveling grid. X Y Z (Requires MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_UBL) + * M422 - Set Z Stepper automatic alignment position using probe. X Y A (Requires Z_STEPPER_AUTO_ALIGN) + * M425 - Enable/Disable and tune backlash correction. (Requires BACKLASH_COMPENSATION and BACKLASH_GCODE) + * M428 - Set the home_offset based on the current_position. Nearest edge applies. (Disabled by NO_WORKSPACE_OFFSETS or DELTA) + * M430 - Read the system current, voltage, and power (Requires POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE, or POWER_MONITOR_FIXED_VOLTAGE) + * M486 - Identify and cancel objects. (Requires CANCEL_OBJECTS) + * M500 - Store parameters in EEPROM. (Requires EEPROM_SETTINGS) + * M501 - Restore parameters from EEPROM. (Requires EEPROM_SETTINGS) + * 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) + * M600 - Pause for filament change: "M600 X Y Z E L". (Requires ADVANCED_PAUSE_FEATURE) + * M603 - Configure filament change: "M603 T U L". (Requires ADVANCED_PAUSE_FEATURE) + * 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 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) + * M851 - Set Z probe's XYZ offsets in current units. (Negative values: X=left, Y=front, Z=below) + * M852 - Set skew factors: "M852 [I] [J] [K]". (Requires SKEW_CORRECTION_GCODE, and SKEW_CORRECTION_FOR_Z for IJ) + * M860 - Report the position of position encoder modules. + * M861 - Report the status of position encoder modules. + * M862 - Perform an axis continuity test for position encoder modules. + * M863 - Perform steps-per-mm calibration for position encoder modules. + * M864 - Change position encoder module I2C address. + * M865 - Check position encoder module firmware version. + * M866 - Report or reset position encoder module error count. + * M867 - Enable/disable or toggle error correction for position encoder modules. + * M868 - Report or set position encoder module error correction threshold. + * M869 - Report position encoder module error. + * M871 - Print/reset/clear first layer temperature offset values. (Requires PROBE_TEMP_COMPENSATION) + * M192 - Wait for probe temp (Requires PROBE_TEMP_COMPENSATION) + * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) + * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) + * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) + * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) + * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) + * M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC) + * M911 - Report stepper driver overtemperature pre-warn condition. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) + * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) + * M916 - L6470 tuning: Increase KVAL_HOLD until thermal warning. (Requires at least one _DRIVER_TYPE L6470) + * M917 - L6470 tuning: Find minimum current thresholds. (Requires at least one _DRIVER_TYPE L6470) + * M918 - L6470 tuning: Increase speed until max or error. (Requires at least one _DRIVER_TYPE L6470) + * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) + * M7219 - Control Max7219 Matrix LEDs. (Requires MAX7219_GCODE) + * + * M360 - SCARA calibration: Move to cal-position ThetaA (0 deg calibration) + * M361 - SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) + * M362 - SCARA calibration: Move to cal-position PsiA (0 deg calibration) + * M363 - SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) + * M364 - SCARA calibration: Move to cal-position PSIC (90 deg to Theta calibration position) + * + * ************ 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 + * D... - Custom Development G-code. Add hooks to 'gcode_D.cpp' for developers to test features. (Requires MARLIN_DEV_MODE) + * + * "T" Codes + * + * T0-T3 - Select an extruder (tool) by index: "T F" + */ + +#include "../inc/MarlinConfig.h" +#include "parser.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "../feature/encoder_i2c.h" +#endif + +#if IS_SCARA || defined(G0_FEEDRATE) + #define HAS_FAST_MOVES 1 +#endif + +enum AxisRelative : uint8_t { REL_X, REL_Y, REL_Z, REL_E, E_MODE_ABS, E_MODE_REL }; + +class GcodeSuite { +public: + + static uint8_t axis_relative; + + static inline bool axis_is_relative(const AxisEnum a) { + if (a == E_AXIS) { + if (TEST(axis_relative, E_MODE_REL)) return true; + if (TEST(axis_relative, E_MODE_ABS)) return false; + } + return TEST(axis_relative, a); + } + static inline void set_relative_mode(const bool rel) { + axis_relative = rel ? _BV(REL_X) | _BV(REL_Y) | _BV(REL_Z) | _BV(REL_E) : 0; + } + static inline void set_e_relative() { + CBI(axis_relative, E_MODE_ABS); + SBI(axis_relative, E_MODE_REL); + } + static inline void set_e_absolute() { + CBI(axis_relative, E_MODE_REL); + SBI(axis_relative, E_MODE_ABS); + } + + #if ENABLED(CNC_WORKSPACE_PLANES) + /** + * Workspace planes only apply to G2/G3 moves + * (and "canned cycles" - not a current feature) + */ + enum WorkspacePlane : char { PLANE_XY, PLANE_ZX, PLANE_YZ }; + static WorkspacePlane workspace_plane; + #endif + + #define MAX_COORDINATE_SYSTEMS 9 + #if ENABLED(CNC_COORDINATE_SYSTEMS) + static int8_t active_coordinate_system; + static xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; + static bool select_coordinate_system(const int8_t _new); + #endif + + 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(); + static void get_destination_from_command(); + + static void process_parsed_command(const bool no_ok=false); + static void process_next_command(); + + // Execute G-code in-place, preserving current G-code parameters + static void process_subcommands_now_P(PGM_P pgcode); + static void process_subcommands_now(char * gcode); + + static inline void home_all_axes() { + extern const char G28_STR[]; + process_subcommands_now_P(G28_STR); + } + + #if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) + static bool autoreport_paused; + static inline bool set_autoreport_paused(const bool p) { + const bool was = autoreport_paused; + autoreport_paused = p; + return was; + } + #else + static constexpr bool autoreport_paused = false; + static inline bool set_autoreport_paused(const bool) { return false; } + #endif + + #if ENABLED(HOST_KEEPALIVE_FEATURE) + /** + * States for managing Marlin and host communication + * Marlin sends messages if blocked or busy + */ + enum MarlinBusyState : char { + NOT_BUSY, // Not in a handler + IN_HANDLER, // Processing a GCode + IN_PROCESS, // Known to be blocking command input (as in G29) + PAUSED_FOR_USER, // Blocking pending any input + PAUSED_FOR_INPUT // Blocking pending text input (concept) + }; + + static MarlinBusyState busy_state; + static uint8_t host_keepalive_interval; + + static void host_keepalive(); + + #define KEEPALIVE_STATE(N) REMEMBER(_KA_, gcode.busy_state, gcode.N) + #else + #define KEEPALIVE_STATE(N) NOOP + #endif + + static void dwell(millis_t time); + +private: + + TERN_(MARLIN_DEV_MODE, static void D(const int16_t dcode)); + + static void G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move=false)); + + TERN_(ARC_SUPPORT, static void G2_G3(const bool clockwise)); + + static void G4(); + + TERN_(BEZIER_CURVE_SUPPORT, static void G5()); + + TERN_(DIRECT_STEPPING, static void G6()); + + #if ENABLED(FWRETRACT) + static void G10(); + static void G11(); + #endif + + TERN_(NOZZLE_CLEAN_FEATURE, static void G12()); + + #if ENABLED(CNC_WORKSPACE_PLANES) + static void G17(); + static void G18(); + static void G19(); + #endif + + #if ENABLED(INCH_MODE_SUPPORT) + static void G20(); + static void G21(); + #endif + + TERN_(G26_MESH_VALIDATION, static void G26()); + + TERN_(NOZZLE_PARK_FEATURE, static void G27()); + + static void G28(); + + #if HAS_LEVELING + #if ENABLED(G29_RETRY_AND_RECOVER) + static void G29_with_retry(); + #define G29_TYPE bool + #else + #define G29_TYPE void + #endif + static G29_TYPE G29(); + #endif + + #if HAS_BED_PROBE + static void G30(); + #if ENABLED(Z_PROBE_SLED) + static void G31(); + static void G32(); + #endif + #endif + + TERN_(DELTA_AUTO_CALIBRATION, static void G33()); + + #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + static void G34(); + #endif + + TERN_(Z_STEPPER_AUTO_ALIGN, static void M422()); + + TERN_(ASSISTED_TRAMMING, static void G35()); + + TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode)); + + TERN_(HAS_MESH, static void G42()); + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + static void G53(); + static void G54(); + static void G55(); + static void G56(); + static void G57(); + static void G58(); + static void G59(); + #endif + + TERN_(PROBE_TEMP_COMPENSATION, static void G76()); + + #if SAVED_POSITIONS + static void G60(); + static void G61(); + #endif + + TERN_(GCODE_MOTION_MODES, static void G80()); + + static void G92(); + + TERN_(CALIBRATION_GCODE, static void G425()); + + TERN_(HAS_RESUME_CONTINUE, static void M0_M1()); + + #if HAS_CUTTER + static void M3_M4(const bool is_M4); + static void M5(); + #endif + + #if ENABLED(COOLANT_CONTROL) + TERN_(COOLANT_MIST, static void M7()); + TERN_(COOLANT_FLOOD, static void M8()); + static void M9(); + #endif + + TERN_(EXTERNAL_CLOSED_LOOP_CONTROLLER, static void M12()); + + TERN_(EXPECTED_PRINTER_CHECK, static void M16()); + + static void M17(); + + static void M18_M84(); + + #if ENABLED(SDSUPPORT) + static void M20(); + static void M21(); + static void M22(); + static void M23(); + static void M24(); + static void M25(); + static void M26(); + static void M27(); + static void M28(); + static void M29(); + static void M30(); + #endif + + static void M31(); + + #if ENABLED(SDSUPPORT) + static void M32(); + TERN_(LONG_FILENAME_HOST_SUPPORT, static void M33()); + #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + static void M34(); + #endif + #endif + + TERN_(DIRECT_PIN_CONTROL, static void M42()); + TERN_(PINS_DEBUGGING, static void M43()); + + TERN_(Z_MIN_PROBE_REPEATABILITY_TEST, static void M48()); + + TERN_(LCD_SET_PROGRESS_MANUALLY, static void M73()); + + static void M75(); + static void M76(); + static void M77(); + + TERN_(PRINTCOUNTER, static void M78()); + + TERN_(PSU_CONTROL, static void M80()); + + static void M81(); + static void M82(); + static void M83(); + static void M85(); + static void M92(); + + TERN_(M100_FREE_MEMORY_WATCHER, static void M100()); + + #if EXTRUDERS + static void M104(); + static void M109(); + #endif + + static void M105(); + + #if HAS_FAN + static void M106(); + static void M107(); + #endif + + #if DISABLED(EMERGENCY_PARSER) + static void M108(); + static void M112(); + static void M410(); + TERN_(HOST_PROMPT_SUPPORT, static void M876()); + #endif + + static void M110(); + static void M111(); + + TERN_(HOST_KEEPALIVE_FEATURE, static void M113()); + + static void M114(); + static void M115(); + static void M117(); + static void M118(); + static void M119(); + static void M120(); + static void M121(); + + TERN_(PARK_HEAD_ON_PAUSE, static void M125()); + + #if ENABLED(BARICUDA) + #if HAS_HEATER_1 + static void M126(); + static void M127(); + #endif + #if HAS_HEATER_2 + static void M128(); + static void M129(); + #endif + #endif + + #if HAS_HEATED_BED + static void M140(); + static void M190(); + #endif + + #if HAS_HEATED_CHAMBER + static void M141(); + static void M191(); + #endif + + #if PREHEAT_COUNT + static void M145(); + #endif + + TERN_(TEMPERATURE_UNITS_SUPPORT, static void M149()); + + TERN_(HAS_COLOR_LEDS, static void M150()); + + #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) + static void M155(); + #endif + + #if ENABLED(MIXING_EXTRUDER) + static void M163(); + static void M164(); + TERN_(DIRECT_MIXING_IN_G1, static void M165()); + TERN_(GRADIENT_MIX, static void M166()); + #endif + + static void M200(); + static void M201(); + + #if 0 + static void M202(); // Not used for Sprinter/grbl gen6 + #endif + + static void M203(); + static void M204(); + static void M205(); + + TERN_(HAS_M206_COMMAND, static void M206()); + + #if ENABLED(FWRETRACT) + static void M207(); + static void M208(); + TERN_(FWRETRACT_AUTORETRACT, static void M209()); + #endif + + static void M211(); + + TERN_(HAS_MULTI_EXTRUDER, static void M217()); + + TERN_(HAS_HOTEND_OFFSET, static void M218()); + + static void M220(); + + #if EXTRUDERS + static void M221(); + #endif + + TERN_(DIRECT_PIN_CONTROL, static void M226()); + + TERN_(PHOTO_GCODE, static void M240()); + + TERN_(HAS_LCD_CONTRAST, static void M250()); + + #if ENABLED(EXPERIMENTAL_I2CBUS) + static void M260(); + static void M261(); + #endif + + #if HAS_SERVOS + static void M280(); + TERN_(EDITABLE_SERVO_ANGLES, static void M281()); + #endif + + TERN_(BABYSTEPPING, static void M290()); + + TERN_(HAS_BUZZER, static void M300()); + + TERN_(PIDTEMP, static void M301()); + + TERN_(PREVENT_COLD_EXTRUSION, static void M302()); + + TERN_(HAS_PID_HEATING, static void M303()); + + TERN_(PIDTEMPBED, static void M304()); + + TERN_(HAS_USER_THERMISTORS, static void M305()); + + #if HAS_MICROSTEPS + static void M350(); + static void M351(); + #endif + + TERN_(CASE_LIGHT_ENABLE, static void M355()); + + TERN_(REPETIER_GCODE_M360, static void M360()); + + #if ENABLED(MORGAN_SCARA) + static bool M360(); + static bool M361(); + static bool M362(); + static bool M363(); + static bool M364(); + #endif + + #if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + static void M380(); + static void M381(); + #endif + + static void M400(); + + #if HAS_BED_PROBE + static void M401(); + static void M402(); + #endif + + TERN_(PRUSA_MMU2, static void M403()); + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + static void M404(); + static void M405(); + static void M406(); + static void M407(); + #endif + + TERN_(HAS_FILAMENT_SENSOR, static void M412()); + + #if HAS_LEVELING + static void M420(); + static void M421(); + #endif + + TERN_(BACKLASH_GCODE, static void M425()); + + TERN_(HAS_M206_COMMAND, static void M428()); + + TERN_(HAS_POWER_MONITOR, static void M430()); + + TERN_(CANCEL_OBJECTS, static void M486()); + + static void M500(); + static void M501(); + static void M502(); + #if DISABLED(DISABLE_M503) + static void M503(); + #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()); + + TERN_(BAUD_RATE_GCODE, static void M575()); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + static void M600(); + static void M603(); + #endif + + TERN_(HAS_DUPLICATION_MODE, static void M605()); + + TERN_(IS_KINEMATIC, static void M665()); + + #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS + static void M666(); + #endif + + #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + static void M672(); + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + static void M701(); + static void M702(); + #endif + + TERN_(GCODE_MACROS, static void M810_819()); + + TERN_(HAS_BED_PROBE, static void M851()); + + TERN_(SKEW_CORRECTION_GCODE, static void M852()); + + #if ENABLED(I2C_POSITION_ENCODERS) + FORCE_INLINE static void M860() { I2CPEM.M860(); } + FORCE_INLINE static void M861() { I2CPEM.M861(); } + FORCE_INLINE static void M862() { I2CPEM.M862(); } + FORCE_INLINE static void M863() { I2CPEM.M863(); } + FORCE_INLINE static void M864() { I2CPEM.M864(); } + FORCE_INLINE static void M865() { I2CPEM.M865(); } + FORCE_INLINE static void M866() { I2CPEM.M866(); } + FORCE_INLINE static void M867() { I2CPEM.M867(); } + FORCE_INLINE static void M868() { I2CPEM.M868(); } + FORCE_INLINE static void M869() { I2CPEM.M869(); } + #endif + + #if ENABLED(PROBE_TEMP_COMPENSATION) + static void M192(); + static void M871(); + #endif + + TERN_(LIN_ADVANCE, static void M900()); + + #if HAS_TRINAMIC_CONFIG + static void M122(); + static void M906(); + TERN_(HAS_STEALTHCHOP, static void M569()); + #if ENABLED(MONITOR_DRIVER_STATUS) + static void M911(); + static void M912(); + #endif + TERN_(HYBRID_THRESHOLD, static void M913()); + TERN_(USE_SENSORLESS, static void M914()); + #endif + + #if HAS_L64XX + static void M122(); + static void M906(); + static void M916(); + static void M917(); + static void M918(); + #endif + + #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) + static void M907(); + #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) + static void M908(); + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + static void M909(); + static void M910(); + #endif + #endif + #endif + + TERN_(SDSUPPORT, static void M928()); + + TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); + + 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(); + + #if ENABLED(POWER_LOSS_RECOVERY) + static void M413(); + static void M1000(); + #endif + + TERN_(SDSUPPORT, static void M1001()); + + TERN_(MAX7219_GCODE, static void M7219()); + + TERN_(CONTROLLER_FAN_EDITABLE, static void M710()); + + static void T(const int8_t tool_index); + +}; + +extern GcodeSuite gcode; diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp new file mode 100644 index 00000000..1f38a85b --- /dev/null +++ b/Marlin/src/gcode/gcode_d.cpp @@ -0,0 +1,191 @@ +/** + * 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(MARLIN_DEV_MODE) + + #include "gcode.h" + #include "../module/settings.h" + #include "../module/temperature.h" + #include "../libs/hex_print.h" + #include "../HAL/shared/eeprom_if.h" + #include "../HAL/shared/Delay.h" + + /** + * Dn: G-code for development and testing + * + * See https://reprap.org/wiki/G-code#D:_Debug_codes + * + * Put whatever else you need here to test ongoing development. + */ + void GcodeSuite::D(const int16_t dcode) { + switch (dcode) { + + case -1: + for (;;); // forever + + case 0: + HAL_reboot(); + break; + + case 1: { + // Zero or pattern-fill the EEPROM data + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + size_t total = persistentStore.capacity(); + int pos = 0; + const uint8_t value = 0x0; + while(total--) { + persistentStore.write_data(pos, &value, 1); + } + persistentStore.access_finish(); + #else + settings.reset(); + settings.save(); + #endif + HAL_reboot(); + } break; + + case 2: { // D2 Read / Write SRAM + #define SRAM_SIZE 8192 + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + NOMORE(addr, (size_t)(SRAM_SIZE - 1)); + NOMORE(len, SRAM_SIZE - addr); + if (parser.seenval('X')) { + // Write the hex bytes after the X + uint16_t val = parser.hex_val('X'); + while (len--) { + *pointer = val; + pointer++; + } + } + else { + while (len--) print_hex_byte(*(pointer++)); + SERIAL_EOL(); + } + } break; + + #if ENABLED(EEPROM_SETTINGS) + case 3: { // D3 Read / Write EEPROM + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) + #endif + NOMORE(addr, (size_t)(MARLIN_EEPROM_SIZE - 1)); + NOMORE(len, MARLIN_EEPROM_SIZE - addr); + if (parser.seenval('X')) { + uint16_t val = parser.hex_val('X'); + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + while(len--) { + int pos = 0; + persistentStore.write_data(pos, (uint8_t *)&val, sizeof(val)); + } + SERIAL_EOL(); + persistentStore.access_finish(); + #else + SERIAL_ECHOLN("NO EEPROM"); + #endif + } + else { + while (len--) { + // Read bytes from EEPROM + #if ENABLED(EEPROM_SETTINGS) + persistentStore.access_start(); + uint8_t val; + while(len--) { + int pos = 0; + if (!persistentStore.read_data(pos, (uint8_t *)&val, sizeof(val))) { + print_hex_byte(val); + } + } + SERIAL_EOL(); + persistentStore.access_finish(); + #else + SERIAL_ECHOLN("NO EEPROM"); + #endif + } + SERIAL_EOL(); + } + } break; + #endif + + case 4: { // D4 Read / Write PIN + // const uint8_t pin = parser.byteval('P'); + // const bool is_out = parser.boolval('F'), + // val = parser.byteval('V', LOW); + if (parser.seenval('X')) { + // TODO: Write the hex bytes after the X + //while (len--) { + //} + } + else { + // while (len--) { + // TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(*(adr++)); + // } + SERIAL_EOL(); + } + } break; + + case 5: { // D4 Read / Write onboard Flash + #define FLASH_SIZE 1024 + uint8_t *pointer = parser.hex_adr_val('A'); + uint16_t len = parser.ushortval('C', 1); + uintptr_t addr = (uintptr_t)pointer; + NOMORE(addr, (size_t)(FLASH_SIZE - 1)); + NOMORE(len, FLASH_SIZE - addr); + if (parser.seenval('X')) { + // TODO: Write the hex bytes after the X + //while (len--) { + //} + } + else { + // while (len--) { + // TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(adr++)); + // } + SERIAL_EOL(); + } + } break; + + case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) + SERIAL_ECHOLN("Disabling heaters and attempting to trigger Watchdog"); + SERIAL_ECHOLN("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); + thermalManager.disable_all_heaters(); + delay(1000); // Allow time to print + DISABLE_ISRS(); + // Use a low-level delay that does not rely on interrupts to function + // Do not spin forever, to avoid thermal risks if heaters are enabled and + // watchdog does not work. + DELAY_US(10000000); + ENABLE_ISRS(); + SERIAL_ECHOLN("FAILURE: Watchdog did not trigger board reset."); + } + } + } + +#endif diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp new file mode 100644 index 00000000..7510eaba --- /dev/null +++ b/Marlin/src/gcode/geometry/G17-G19.cpp @@ -0,0 +1,53 @@ +/** + * 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(CNC_WORKSPACE_PLANES) + +#include "../gcode.h" + +inline void report_workspace_plane() { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Workspace Plane "); + serialprintPGM( + gcode.workspace_plane == GcodeSuite::PLANE_YZ ? PSTR("YZ\n") + : gcode.workspace_plane == GcodeSuite::PLANE_ZX ? PSTR("ZX\n") + : PSTR("XY\n") + ); +} + +inline void set_workspace_plane(const GcodeSuite::WorkspacePlane plane) { + gcode.workspace_plane = plane; + if (DEBUGGING(INFO)) report_workspace_plane(); +} + +/** + * G17: Select Plane XY + * G18: Select Plane ZX + * G19: Select Plane YZ + */ +void GcodeSuite::G17() { set_workspace_plane(PLANE_XY); } +void GcodeSuite::G18() { set_workspace_plane(PLANE_ZX); } +void GcodeSuite::G19() { set_workspace_plane(PLANE_YZ); } + +#endif // CNC_WORKSPACE_PLANES diff --git a/Marlin/src/gcode/geometry/G53-G59.cpp b/Marlin/src/gcode/geometry/G53-G59.cpp new file mode 100644 index 00000000..05bc5227 --- /dev/null +++ b/Marlin/src/gcode/geometry/G53-G59.cpp @@ -0,0 +1,101 @@ +/** + * 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 "../gcode.h" +#include "../../module/motion.h" + +#if ENABLED(CNC_COORDINATE_SYSTEMS) + +#include "../../module/stepper.h" + +//#define DEBUG_M53 + +/** + * Select a coordinate system and update the workspace offset. + * System index -1 is used to specify machine-native. + */ +bool GcodeSuite::select_coordinate_system(const int8_t _new) { + if (active_coordinate_system == _new) return false; + active_coordinate_system = _new; + xyz_float_t new_offset{0}; + if (WITHIN(_new, 0, MAX_COORDINATE_SYSTEMS - 1)) + new_offset = coordinate_system[_new]; + LOOP_XYZ(i) { + if (position_shift[i] != new_offset[i]) { + position_shift[i] = new_offset[i]; + update_workspace_offset((AxisEnum)i); + } + } + return true; +} + +/** + * G53: Apply native workspace to the current move + * + * In CNC G-code G53 is a modifier. + * It precedes a movement command (or other modifiers) on the same line. + * This is the first command to use parser.chain() to make this possible. + * + * Marlin also uses G53 on a line by itself to go back to native space. + */ +void GcodeSuite::G53() { + const int8_t old_system = active_coordinate_system; + select_coordinate_system(-1); // Always remove workspace offsets + #ifdef DEBUG_M53 + SERIAL_ECHOLNPGM("Go to native space"); + report_current_position(); + #endif + + if (parser.chain()) { // Command to chain? + process_parsed_command(); // ...process the chained command + select_coordinate_system(old_system); + #ifdef DEBUG_M53 + SERIAL_ECHOLNPAIR("Go back to workspace ", old_system); + report_current_position(); + #endif + } +} + +/** + * G54-G59.3: Select a new workspace + * + * A workspace is an XYZ offset to the machine native space. + * All workspaces default to 0,0,0 at start, or with EEPROM + * support they may be restored from a previous session. + * + * G92 is used to set the current workspace's offset. + */ +void G54_59(uint8_t subcode=0) { + const int8_t _space = parser.codenum - 54 + subcode; + if (gcode.select_coordinate_system(_space)) { + SERIAL_ECHOLNPAIR("Select workspace ", _space); + report_current_position(); + } +} +void GcodeSuite::G54() { G54_59(); } +void GcodeSuite::G55() { G54_59(); } +void GcodeSuite::G56() { G54_59(); } +void GcodeSuite::G57() { G54_59(); } +void GcodeSuite::G58() { G54_59(); } +void GcodeSuite::G59() { G54_59(parser.subcode); } + +#endif // CNC_COORDINATE_SYSTEMS diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp new file mode 100644 index 00000000..1a0382ed --- /dev/null +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -0,0 +1,105 @@ +/** + * 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 "../gcode.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" + +#if ENABLED(I2C_POSITION_ENCODERS) + #include "../../feature/encoder_i2c.h" +#endif + +/** + * G92: Set current position to given X Y Z E + */ +void GcodeSuite::G92() { + + bool sync_E = false, sync_XYZ = false; + + #if ENABLED(USE_GCODE_SUBCODES) + const uint8_t subcode_G92 = parser.subcode; + #else + constexpr uint8_t subcode_G92 = 0; + #endif + + switch (subcode_G92) { + default: break; + #if ENABLED(CNC_COORDINATE_SYSTEMS) + case 1: { + // Zero the G92 values and restore current position + #if !IS_SCARA + LOOP_XYZ(i) if (position_shift[i]) { + position_shift[i] = 0; + update_workspace_offset((AxisEnum)i); + } + #endif // Not SCARA + } return; + #endif + #if ENABLED(POWER_LOSS_RECOVERY) + case 9: { + LOOP_XYZE(i) { + if (parser.seenval(axis_codes[i])) { + current_position[i] = parser.value_axis_units((AxisEnum)i); + if (i == E_AXIS) sync_E = true; else sync_XYZ = true; + } + } + } break; + #endif + case 0: { + LOOP_XYZE(i) { + if (parser.seenval(axis_codes[i])) { + const float l = parser.value_axis_units((AxisEnum)i), + v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), + d = v - current_position[i]; + if (!NEAR_ZERO(d)) { + #if IS_SCARA || !HAS_POSITION_SHIFT + if (i == E_AXIS) sync_E = true; else sync_XYZ = true; + current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior + #elif HAS_POSITION_SHIFT + if (i == E_AXIS) { + sync_E = true; + current_position.e = v; // When using coordinate spaces, only E is set directly + } + else { + position_shift[i] += d; // Other axes simply offset the coordinate space + update_workspace_offset((AxisEnum)i); + } + #endif + } + } + } + } break; + } + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + // Apply workspace offset to the active coordinate system + if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) + coordinate_system[active_coordinate_system] = position_shift; + #endif + + if (sync_XYZ) sync_plan_position(); + else if (sync_E) sync_plan_position_e(); + + #if DISABLED(DIRECT_STEPPING) + report_current_position(); + #endif +} diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp new file mode 100644 index 00000000..a477a1a5 --- /dev/null +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -0,0 +1,86 @@ +/** + * 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_M206_COMMAND + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../lcd/ultralcd.h" +#include "../../libs/buzzer.h" + +/** + * M206: Set Additional Homing Offset (X Y Z). SCARA aliases T=X, P=Y + * + * *** @thinkyhead: I recommend deprecating M206 for SCARA in favor of M665. + * *** M206 for SCARA will remain enabled in 1.1.x for compatibility. + * *** In the 2.0 release, it will simply be disabled by default. + */ +void GcodeSuite::M206() { + LOOP_XYZ(i) + if (parser.seen(XYZ_CHAR(i))) + set_home_offset((AxisEnum)i, parser.value_linear_units()); + + #if ENABLED(MORGAN_SCARA) + if (parser.seen('T')) set_home_offset(A_AXIS, parser.value_float()); // Theta + if (parser.seen('P')) set_home_offset(B_AXIS, parser.value_float()); // Psi + #endif + + report_current_position(); +} + +/** + * M428: Set home_offset based on the distance between the + * current_position and the nearest "reference point." + * If an axis is past center its endstop position + * is the reference-point. Otherwise it uses 0. This allows + * the Z offset to be set near the bed when using a max endstop. + * + * M428 can't be used more than 2cm away from 0 or an endstop. + * + * Use M206 to set these values directly. + */ +void GcodeSuite::M428() { + if (homing_needed_error()) return; + + xyz_float_t diff; + LOOP_XYZ(i) { + diff[i] = base_home_pos((AxisEnum)i) - current_position[i]; + if (!WITHIN(diff[i], -20, 20) && home_dir((AxisEnum)i) > 0) + diff[i] = -current_position[i]; + if (!WITHIN(diff[i], -20, 20)) { + SERIAL_ERROR_MSG(STR_ERR_M428_TOO_FAR); + LCD_ALERTMESSAGEPGM_P(PSTR("Err: Too far!")); + BUZZ(200, 40); + return; + } + } + + LOOP_XYZ(i) set_home_offset((AxisEnum)i, diff[i]); + report_current_position(); + LCD_MESSAGEPGM(MSG_HOME_OFFSETS_APPLIED); + BUZZ(100, 659); + BUZZ(100, 698); +} + +#endif // HAS_M206_COMMAND diff --git a/Marlin/src/gcode/host/M110.cpp b/Marlin/src/gcode/host/M110.cpp new file mode 100644 index 00000000..b12b38ea --- /dev/null +++ b/Marlin/src/gcode/host/M110.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 "../gcode.h" +#include "../queue.h" // for last_N + +/** + * M110: Set Current Line Number + */ +void GcodeSuite::M110() { + + if (parser.seenval('N')) + queue.last_N[queue.command_port()] = parser.value_long(); + +} diff --git a/Marlin/src/gcode/host/M113.cpp b/Marlin/src/gcode/host/M113.cpp new file mode 100644 index 00000000..ce826d6a --- /dev/null +++ b/Marlin/src/gcode/host/M113.cpp @@ -0,0 +1,45 @@ +/** + * 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(HOST_KEEPALIVE_FEATURE) + +#include "../gcode.h" + +/** + * M113: Get or set Host Keepalive interval (0 to disable) + * + * S Optional. Set the keepalive interval. + */ +void GcodeSuite::M113() { + if (parser.seenval('S')) { + host_keepalive_interval = parser.value_byte(); + NOMORE(host_keepalive_interval, 60); + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("M113 S", (unsigned long)host_keepalive_interval); + } +} + +#endif // HOST_KEEPALIVE_FEATURE diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp new file mode 100644 index 00000000..85a38f64 --- /dev/null +++ b/Marlin/src/gcode/host/M114.cpp @@ -0,0 +1,219 @@ +/** + * 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.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" + +#if ENABLED(M114_DETAIL) + + #if HAS_L64XX + #include "../../libs/L64XX/L64XX_Marlin.h" + #define DEBUG_OUT ENABLED(L6470_CHITCHAT) + #include "../../core/debug_out.h" + #endif + + void report_xyze(const xyze_pos_t &pos, const uint8_t n=XYZE, const uint8_t precision=3) { + char str[12]; + LOOP_L_N(a, n) { + SERIAL_CHAR(' ', axis_codes[a], ':'); + if (pos[a] >= 0) SERIAL_CHAR(' '); + SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); + } + SERIAL_EOL(); + } + inline void report_xyz(const xyze_pos_t &pos) { report_xyze(pos, XYZ); } + + void report_xyz(const xyz_pos_t &pos, const uint8_t precision=3) { + char str[12]; + LOOP_XYZ(a) { + SERIAL_CHAR(' ', XYZ_CHAR(a), ':'); + SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); + } + SERIAL_EOL(); + } + + void report_current_position_detail() { + + // Position as sent by G-code + SERIAL_ECHOPGM("\nLogical:"); + report_xyz(current_position.asLogical()); + + // Cartesian position in native machine space + SERIAL_ECHOPGM("Raw: "); + report_xyz(current_position); + + xyze_pos_t leveled = current_position; + + #if HAS_LEVELING + // Current position with leveling applied + SERIAL_ECHOPGM("Leveled:"); + planner.apply_leveling(leveled); + report_xyz(leveled); + + // Test planner un-leveling. This should match the Raw result. + SERIAL_ECHOPGM("UnLevel:"); + xyze_pos_t unleveled = leveled; + planner.unapply_leveling(unleveled); + report_xyz(unleveled); + #endif + + #if IS_KINEMATIC + // Kinematics applied to the leveled position + #if IS_SCARA + SERIAL_ECHOPGM("ScaraK: "); + #else + SERIAL_ECHOPGM("DeltaK: "); + #endif + inverse_kinematics(leveled); // writes delta[] + report_xyz(delta); + #endif + + planner.synchronize(); + + #if HAS_L64XX + char temp_buf[80]; + int32_t temp; + //#define ABS_POS_SIGN_MASK 0b1111 1111 1110 0000 0000 0000 0000 0000 + #define ABS_POS_SIGN_MASK 0b11111111111000000000000000000000 + #define REPORT_ABSOLUTE_POS(Q) do{ \ + L64xxManager.say_axis(Q, false); \ + temp = L6470_GETPARAM(L6470_ABS_POS,Q); \ + if (temp & ABS_POS_SIGN_MASK) temp |= ABS_POS_SIGN_MASK; \ + sprintf_P(temp_buf, PSTR(":%8ld "), temp); \ + DEBUG_ECHO(temp_buf); \ + }while(0) + + DEBUG_ECHOPGM("\nL6470:"); + #if AXIS_IS_L64XX(X) + REPORT_ABSOLUTE_POS(X); + #endif + #if AXIS_IS_L64XX(X2) + REPORT_ABSOLUTE_POS(X2); + #endif + #if AXIS_IS_L64XX(Y) + REPORT_ABSOLUTE_POS(Y); + #endif + #if AXIS_IS_L64XX(Y2) + REPORT_ABSOLUTE_POS(Y2); + #endif + #if AXIS_IS_L64XX(Z) + REPORT_ABSOLUTE_POS(Z); + #endif + #if AXIS_IS_L64XX(Z2) + REPORT_ABSOLUTE_POS(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + REPORT_ABSOLUTE_POS(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + REPORT_ABSOLUTE_POS(Z4); + #endif + #if AXIS_IS_L64XX(E0) + REPORT_ABSOLUTE_POS(E0); + #endif + #if AXIS_IS_L64XX(E1) + REPORT_ABSOLUTE_POS(E1); + #endif + #if AXIS_IS_L64XX(E2) + REPORT_ABSOLUTE_POS(E2); + #endif + #if AXIS_IS_L64XX(E3) + REPORT_ABSOLUTE_POS(E3); + #endif + #if AXIS_IS_L64XX(E4) + REPORT_ABSOLUTE_POS(E4); + #endif + #if AXIS_IS_L64XX(E5) + REPORT_ABSOLUTE_POS(E5); + #endif + #if AXIS_IS_L64XX(E6) + REPORT_ABSOLUTE_POS(E6); + #endif + #if AXIS_IS_L64XX(E7) + REPORT_ABSOLUTE_POS(E7); + #endif + SERIAL_EOL(); + #endif // HAS_L64XX + + SERIAL_ECHOPGM("Stepper:"); + LOOP_XYZE(i) { + SERIAL_CHAR(' ', axis_codes[i], ':'); + SERIAL_ECHO(stepper.position((AxisEnum)i)); + } + SERIAL_EOL(); + + #if IS_SCARA + const xy_float_t deg = { + planner.get_axis_position_degrees(A_AXIS), + planner.get_axis_position_degrees(B_AXIS) + }; + SERIAL_ECHOPGM("Degrees:"); + report_xyze(deg, 2); + #endif + + SERIAL_ECHOPGM("FromStp:"); + get_cartesian_from_steppers(); // writes 'cartes' (with forward kinematics) + xyze_pos_t from_steppers = { cartes.x, cartes.y, cartes.z, planner.get_axis_position_mm(E_AXIS) }; + report_xyze(from_steppers); + + const xyze_float_t diff = from_steppers - leveled; + SERIAL_ECHOPGM("Diff: "); + report_xyze(diff); + } + +#endif // M114_DETAIL + +/** + * M114: Report the current position to host. + * Since steppers are moving, the count positions are + * projected by using planner calculations. + * D - Report more detail. This syncs the planner. (Requires M114_DETAIL) + * E - Report E stepper position (Requires M114_DETAIL) + * R - Report the realtime position instead of projected. + */ +void GcodeSuite::M114() { + + #if ENABLED(M114_DETAIL) + if (parser.seen('D')) { + #if DISABLED(M114_LEGACY) + planner.synchronize(); + #endif + report_current_position(); + report_current_position_detail(); + return; + } + if (parser.seen('E')) { + SERIAL_ECHOLNPAIR("Count E:", stepper.position(E_AXIS)); + return; + } + #endif + + #if ENABLED(M114_REALTIME) + if (parser.seen('R')) { report_real_position(); return; } + #endif + + TERN_(M114_LEGACY, planner.synchronize()); + report_current_position_projected(); +} diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp new file mode 100644 index 00000000..53c5163b --- /dev/null +++ b/Marlin/src/gcode/host/M115.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 "../gcode.h" +#include "../../inc/MarlinConfig.h" + +#if ENABLED(M115_GEOMETRY_REPORT) + #include "../../module/motion.h" +#endif + +#if ENABLED(EXTENDED_CAPABILITIES_REPORT) + static void cap_line(PGM_P const name, bool ena=false) { + SERIAL_ECHOPGM("Cap:"); + serialprintPGM(name); + SERIAL_CHAR(':'); + SERIAL_ECHOLN(int(ena ? 1 : 0)); + } +#endif + +/** + * M115: Capabilities string and extended capabilities report + * If a capability is not reported, hosts should assume + * the capability is not present. + */ +void GcodeSuite::M115() { + SERIAL_ECHOLNPGM( + "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " (" __DATE__ " " __TIME__ ") " + "SOURCE_CODE_URL:" SOURCE_CODE_URL " " + "PROTOCOL_VERSION:" PROTOCOL_VERSION " " + "MACHINE_TYPE:" MACHINE_NAME " " + "EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " " + #ifdef MACHINE_UUID + "UUID:" MACHINE_UUID + #endif + ); + + #if ENABLED(EXTENDED_CAPABILITIES_REPORT) + + // PAREN_COMMENTS + TERN_(PAREN_COMMENTS, cap_line(PSTR("PAREN_COMMENTS"), true)); + + // QUOTED_STRINGS + TERN_(GCODE_QUOTED_STRINGS, cap_line(PSTR("QUOTED_STRINGS"), true)); + + // SERIAL_XON_XOFF + cap_line(PSTR("SERIAL_XON_XOFF"), ENABLED(SERIAL_XON_XOFF)); + + // BINARY_FILE_TRANSFER (M28 B1) + cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); + + // EEPROM (M500, M501) + cap_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); + + // Volumetric Extrusion (M200) + cap_line(PSTR("VOLUMETRIC"), DISABLED(NO_VOLUMETRICS)); + + // AUTOREPORT_TEMP (M155) + cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES)); + + // PROGRESS (M530 S L, M531 , M532 X L) + cap_line(PSTR("PROGRESS")); + + // Print Job timer M75, M76, M77 + cap_line(PSTR("PRINT_JOB"), true); + + // 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)); + + // MESH_REPORT (M420 V) + cap_line(PSTR("LEVELING_DATA"), ENABLED(HAS_LEVELING)); + + // BUILD_PERCENT (M73) + cap_line(PSTR("BUILD_PERCENT"), ENABLED(LCD_SET_PROGRESS_MANUALLY)); + + // SOFTWARE_POWER (M80, M81) + cap_line(PSTR("SOFTWARE_POWER"), ENABLED(PSU_CONTROL)); + + // TOGGLE_LIGHTS (M355) + 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)); + + // PROMPT SUPPORT (M876) + cap_line(PSTR("PROMPT_SUPPORT"), ENABLED(HOST_PROMPT_SUPPORT)); + + // SDCARD (M20, M23, M24, etc.) + cap_line(PSTR("SDCARD"), ENABLED(SDSUPPORT)); + + // AUTOREPORT_SD_STATUS (M27 extension) + cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS)); + + // LONG_FILENAME_HOST_SUPPORT (M33) + cap_line(PSTR("LONG_FILENAME"), ENABLED(LONG_FILENAME_HOST_SUPPORT)); + + // THERMAL_PROTECTION + cap_line(PSTR("THERMAL_PROTECTION"), ENABLED(THERMALLY_SAFE)); + + // MOTION_MODES (M80-M89) + cap_line(PSTR("MOTION_MODES"), ENABLED(GCODE_MOTION_MODES)); + + // ARC_SUPPORT (G2-G3) + cap_line(PSTR("ARCS"), ENABLED(ARC_SUPPORT)); + + // BABYSTEPPING (M290) + cap_line(PSTR("BABYSTEPPING"), ENABLED(BABYSTEPPING)); + + // CHAMBER_TEMPERATURE (M141, M191) + cap_line(PSTR("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); + + // Machine Geometry + #if ENABLED(M115_GEOMETRY_REPORT) + const xyz_pos_t dmin = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, + dmax = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; + 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(); + SERIAL_ECHOLNPAIR( + "area:{" + "full:{" + "min:{x:", lmin.x, ",y:", lmin.y, ",z:", lmin.z, "}," + "max:{x:", lmax.x, ",y:", lmax.y, ",z:", lmax.z, "}" + "}," + "work:{" + "min:{x:", wmin.x, ",y:", wmin.y, ",z:", wmin.z, "}," + "max:{x:", wmax.x, ",y:", wmax.y, ",z:", wmax.z, "}", + "}" + "}" + ); + #endif + + #endif // EXTENDED_CAPABILITIES_REPORT +} diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp new file mode 100644 index 00000000..3be29025 --- /dev/null +++ b/Marlin/src/gcode/host/M118.cpp @@ -0,0 +1,73 @@ +/** + * 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 "../gcode.h" +#include "../../core/serial.h" + +/** + * M118: Display a message in the host console. + * + * A1 Prepend '// ' for an action command, as in OctoPrint + * E1 Have the host 'echo:' the text + * Pn Redirect to another serial port + * 0 : Announce to all ports + * 1-9 : Serial ports 1 to 9 + */ +void GcodeSuite::M118() { + bool hasE = false, hasA = false; + #if HAS_MULTI_SERIAL + int8_t port = -1; // Assume no redirect + #endif + char *p = parser.string_arg; + for (uint8_t i = 3; i--;) { + // A1, E1, and Pn are always parsed out + if (!( ((p[0] == 'A' || p[0] == 'E') && p[1] == '1') || (p[0] == 'P' && NUMERIC(p[1])) )) break; + switch (p[0]) { + case 'A': hasA = true; break; + case 'E': hasE = true; break; + #if HAS_MULTI_SERIAL + case 'P': port = p[1] - '0'; break; + #endif + } + p += 2; + while (*p == ' ') ++p; + } + + #if HAS_MULTI_SERIAL + const int8_t old_serial = serial_port_index; + if (WITHIN(port, 0, NUM_SERIAL)) + serial_port_index = ( + port == 0 ? SERIAL_BOTH + : port == 1 ? SERIAL_PORT + #ifdef SERIAL_PORT_2 + : port == 2 ? SERIAL_PORT_2 + #endif + : SERIAL_PORT + ); + #endif + + if (hasE) SERIAL_ECHO_START(); + if (hasA) SERIAL_ECHOPGM("// "); + SERIAL_ECHOLN(p); + + TERN_(HAS_MULTI_SERIAL, serial_port_index = old_serial); +} diff --git a/Marlin/src/gcode/host/M119.cpp b/Marlin/src/gcode/host/M119.cpp new file mode 100644 index 00000000..f0066bdd --- /dev/null +++ b/Marlin/src/gcode/host/M119.cpp @@ -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 . + * + */ + +#include "../gcode.h" +#include "../../module/endstops.h" + +/** + * M119: Output endstop states to serial output + */ +void GcodeSuite::M119() { + + endstops.report_states(); + +} diff --git a/Marlin/src/gcode/host/M16.cpp b/Marlin/src/gcode/host/M16.cpp new file mode 100644 index 00000000..1ac85803 --- /dev/null +++ b/Marlin/src/gcode/host/M16.cpp @@ -0,0 +1,40 @@ +/** + * 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(EXPECTED_PRINTER_CHECK) + +#include "../gcode.h" +#include "../../MarlinCore.h" + +/** + * M16: Expected Printer Check + */ +void GcodeSuite::M16() { + + if (strcmp_P(parser.string_arg, PSTR(MACHINE_NAME))) + kill(GET_TEXT(MSG_KILL_EXPECTED_PRINTER)); + +} + +#endif diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp new file mode 100644 index 00000000..9970dc4d --- /dev/null +++ b/Marlin/src/gcode/host/M360.cpp @@ -0,0 +1,189 @@ +/** + * 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(REPETIER_GCODE_M360) + +#include "../gcode.h" + +#include "../../module/motion.h" +#include "../../module/planner.h" + +static void config_prefix(PGM_P const name, PGM_P const pref=nullptr) { + SERIAL_ECHOPGM("Config:"); + if (pref) serialprintPGM(pref); + serialprintPGM(name); + SERIAL_CHAR(':'); +} +static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr) { + config_prefix(name, pref); + SERIAL_ECHOLN(val); +} + +/** + * M360: Report Firmware configuration + * in RepRapFirmware-compatible format + */ +void GcodeSuite::M360() { + PGMSTR(X_STR, "X"); + PGMSTR(Y_STR, "Y"); + PGMSTR(Z_STR, "Z"); + PGMSTR(JERK_STR, "Jerk"); + + // + // Basics and Enabled items + // + config_line(PSTR("Baudrate"), BAUDRATE); + config_line(PSTR("InputBuffer"), MAX_CMD_SIZE); + config_line(PSTR("PrintlineCache"), BUFSIZE); + config_line(PSTR("MixingExtruder"), ENABLED(MIXING_EXTRUDER)); + config_line(PSTR("SDCard"), ENABLED(SDSUPPORT)); + config_line(PSTR("Fan"), ENABLED(HAS_FAN)); + config_line(PSTR("LCD"), ENABLED(HAS_DISPLAY)); + config_line(PSTR("SoftwarePowerSwitch"), 1); + config_line(PSTR("SupportLocalFilamentchange"), ENABLED(ADVANCED_PAUSE_FEATURE)); + config_line(PSTR("CaseLights"), ENABLED(CASE_LIGHT_ENABLE)); + config_line(PSTR("ZProbe"), ENABLED(HAS_BED_PROBE)); + config_line(PSTR("Autolevel"), ENABLED(HAS_LEVELING)); + config_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); + + // + // Homing Directions + // + PGMSTR(H_DIR_STR, "HomeDir"); + config_line(H_DIR_STR, X_HOME_DIR, X_STR); + config_line(H_DIR_STR, Y_HOME_DIR, Y_STR); + config_line(H_DIR_STR, Z_HOME_DIR, Z_STR); + + // + // XYZ Axis Jerk + // + #if HAS_CLASSIC_JERK + if (planner.max_jerk.x == planner.max_jerk.y) + config_line(PSTR("XY"), planner.max_jerk.x, JERK_STR); + else { + config_line(X_STR, planner.max_jerk.x, JERK_STR); + config_line(Y_STR, planner.max_jerk.y, JERK_STR); + } + config_line(Z_STR, planner.max_jerk.z, JERK_STR); + #endif + + // + // Firmware Retraction + // + config_line(PSTR("SupportG10G11"), ENABLED(FWRETRACT)); + #if ENABLED(FWRETRACT) + PGMSTR(RET_STR, "Retraction"); + PGMSTR(UNRET_STR, "RetractionUndo"); + PGMSTR(SPEED_STR, "Speed"); + // M10 Retract with swap (long) moves + config_line(PSTR("Length"), fwretract.settings.retract_length, RET_STR); + config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR); + config_line(PSTR("ZLift"), fwretract.settings.retract_zraise, RET_STR); + config_line(PSTR("LongLength"), fwretract.settings.swap_retract_length, RET_STR); + // M11 Recover (undo) with swap (long) moves + config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR); + config_line(PSTR("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR); + config_line(PSTR("ExtraLongLength"), fwretract.settings.swap_retract_recover_extra, UNRET_STR); + config_line(PSTR("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR); + #endif + + // + // Workspace boundaries + // + const xyz_pos_t dmin = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, + dmax = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; + xyz_pos_t cmin = dmin, cmax = dmax; + apply_motion_limits(cmin); + apply_motion_limits(cmax); + const xyz_pos_t wmin = cmin.asLogical(), wmax = cmax.asLogical(); + + PGMSTR(MIN_STR, "Min"); + PGMSTR(MAX_STR, "Max"); + PGMSTR(SIZE_STR, "Size"); + config_line(MIN_STR, wmin.x, X_STR); + config_line(MIN_STR, wmin.y, Y_STR); + config_line(MIN_STR, wmin.z, Z_STR); + config_line(MAX_STR, wmax.x, X_STR); + config_line(MAX_STR, wmax.y, Y_STR); + config_line(MAX_STR, wmax.z, Z_STR); + config_line(SIZE_STR, wmax.x - wmin.x, X_STR); + config_line(SIZE_STR, wmax.y - wmin.y, Y_STR); + config_line(SIZE_STR, wmax.z - wmin.z, Z_STR); + + // + // Print and Travel Acceleration + // + #define _ACCEL(A,B) _MIN(planner.settings.max_acceleration_mm_per_s2[A##_AXIS], planner.settings.B) + PGMSTR(P_ACC_STR, "PrintAccel"); + PGMSTR(T_ACC_STR, "TravelAccel"); + config_line(P_ACC_STR, _ACCEL(X, acceleration), X_STR); + config_line(P_ACC_STR, _ACCEL(Y, acceleration), Y_STR); + config_line(P_ACC_STR, _ACCEL(Z, acceleration), Z_STR); + config_line(T_ACC_STR, _ACCEL(X, travel_acceleration), X_STR); + config_line(T_ACC_STR, _ACCEL(Y, travel_acceleration), Y_STR); + config_line(T_ACC_STR, _ACCEL(Z, travel_acceleration), Z_STR); + + config_prefix(PSTR("PrinterType")); + SERIAL_ECHOLNPGM( + TERN_(DELTA, "Delta") + TERN_(IS_SCARA, "SCARA") + TERN_(IS_CORE, "Core") + TERN_(MARKFORGED_XY, "MarkForged") + TERN_(IS_CARTESIAN, "Cartesian") + ); + + // + // Heated Bed + // + config_line(PSTR("HeatedBed"), ENABLED(HAS_HEATED_BED)); + #if HAS_HEATED_BED + config_line(PSTR("MaxBedTemp"), BED_MAX_TARGET); + #endif + + // + // Per-Extruder settings + // + config_line(PSTR("NumExtruder"), EXTRUDERS); + #if EXTRUDERS + #define DIAM_VALUE(N) TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[N]) + #if HAS_LINEAR_E_JERK + #define E_JERK_VAL(N) planner.max_e_jerk[E_INDEX_N(N)] + #elif HAS_CLASSIC_JERK + #define E_JERK_VAL(N) planner.max_jerk.e + #else + #define E_JERK_VAL(N) DEFAULT_EJERK + #endif + #define _EXTR_ITEM(N) do{ \ + PGMSTR(EXTR_STR, "Extr." STRINGIFY(INCREMENT(N)) ":"); \ + config_line(JERK_STR, E_JERK_VAL(N), EXTR_STR); \ + config_line(PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(N)], EXTR_STR); \ + config_line(PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(N)], EXTR_STR); \ + config_line(PSTR("Diameter"), DIAM_VALUE(N), EXTR_STR); \ + config_line(PSTR("MaxTemp"), (HEATER_##N##_MAXTEMP) - (HOTEND_OVERSHOOT), EXTR_STR); \ + }while(0) + + REPEAT(EXTRUDERS, _EXTR_ITEM); + #endif +} + +#endif diff --git a/Marlin/src/gcode/host/M876.cpp b/Marlin/src/gcode/host/M876.cpp new file mode 100644 index 00000000..0d8256cf --- /dev/null +++ b/Marlin/src/gcode/host/M876.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(HOST_PROMPT_SUPPORT) && DISABLED(EMERGENCY_PARSER) + +#include "../../feature/host_actions.h" +#include "../gcode.h" +#include "../../MarlinCore.h" + +/** + * M876: Handle Prompt Response + */ +void GcodeSuite::M876() { + + if (parser.seenval('S')) host_response_handler((uint8_t)parser.value_int()); + +} + +#endif // HOST_PROMPT_SUPPORT && !EMERGENCY_PARSER diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp new file mode 100644 index 00000000..1d18b706 --- /dev/null +++ b/Marlin/src/gcode/lcd/M0_M1.cpp @@ -0,0 +1,87 @@ +/** + * 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_RESUME_CONTINUE + +#include "../../inc/MarlinConfig.h" + +#include "../gcode.h" + +#include "../../module/planner.h" // for synchronize() +#include "../../MarlinCore.h" // for wait_for_user_response() + +#if HAS_LCD_MENU + #include "../../lcd/ultralcd.h" +#elif ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../../feature/host_actions.h" +#endif + +/** + * M0: Unconditional stop - Wait for user button press on LCD + * M1: Conditional stop - Wait for user button press on LCD + */ +void GcodeSuite::M0_M1() { + millis_t ms = 0; + if (parser.seenval('P')) ms = parser.value_millis(); // Milliseconds to wait + if (parser.seenval('S')) ms = parser.value_millis_from_seconds(); // Seconds to wait + + planner.synchronize(); + + #if HAS_LCD_MENU + + if (parser.string_arg) + ui.set_status(parser.string_arg, true); + else { + LCD_MESSAGEPGM(MSG_USERWAIT); + #if ENABLED(LCD_PROGRESS_BAR) && PROGRESS_MSG_EXPIRE > 0 + ui.reset_progress_bar_timeout(); + #endif + } + + #elif ENABLED(EXTENSIBLE_UI) + if (parser.string_arg) + ExtUI::onUserConfirmRequired(parser.string_arg); // Can this take an SRAM string?? + else + ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_USERWAIT)); + #else + + if (parser.string_arg) { + SERIAL_ECHO_START(); + SERIAL_ECHOLN(parser.string_arg); + } + + #endif + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, parser.codenum ? PSTR("M1 Stop") : PSTR("M0 Stop"), CONTINUE_STR)); + + wait_for_user_response(ms); + + TERN_(HAS_LCD_MENU, ui.reset_status()); +} + +#endif // HAS_RESUME_CONTINUE diff --git a/Marlin/src/gcode/lcd/M117.cpp b/Marlin/src/gcode/lcd/M117.cpp new file mode 100644 index 00000000..8459135f --- /dev/null +++ b/Marlin/src/gcode/lcd/M117.cpp @@ -0,0 +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 "../gcode.h" +#include "../../lcd/ultralcd.h" + +/** + * M117: Set LCD Status Message + */ +void GcodeSuite::M117() { + + if (parser.string_arg && parser.string_arg[0]) + ui.set_status(parser.string_arg); + else + ui.reset_status(); + +} diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp new file mode 100644 index 00000000..abd4dcc7 --- /dev/null +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -0,0 +1,59 @@ +/** + * 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 PREHEAT_COUNT + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" + +/** + * M145: Set the heatup state for a material in the LCD menu + * + * S + * H + * B + * F + */ +void GcodeSuite::M145() { + const uint8_t material = (uint8_t)parser.intval('S'); + if (material >= PREHEAT_COUNT) + SERIAL_ERROR_MSG(STR_ERR_MATERIAL_INDEX); + else { + 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)); + #endif + #if HAS_HEATED_BED + 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 // PREHEAT_COUNT diff --git a/Marlin/src/gcode/lcd/M250.cpp b/Marlin/src/gcode/lcd/M250.cpp new file mode 100644 index 00000000..f42daaea --- /dev/null +++ b/Marlin/src/gcode/lcd/M250.cpp @@ -0,0 +1,38 @@ +/** + * 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_LCD_CONTRAST + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" + +/** + * M250: Read and optionally set the LCD contrast + */ +void GcodeSuite::M250() { + if (parser.seen('C')) ui.set_contrast(parser.value_int()); + SERIAL_ECHOLNPAIR("LCD Contrast: ", ui.contrast); +} + +#endif // HAS_LCD_CONTRAST diff --git a/Marlin/src/gcode/lcd/M300.cpp b/Marlin/src/gcode/lcd/M300.cpp new file mode 100644 index 00000000..56d9ee5d --- /dev/null +++ b/Marlin/src/gcode/lcd/M300.cpp @@ -0,0 +1,45 @@ +/** + * 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_BUZZER + +#include "../gcode.h" + +#include "../../lcd/ultralcd.h" // i2c-based BUZZ +#include "../../libs/buzzer.h" // Buzzer, if possible + +/** + * M300: Play beep sound S P + */ +void GcodeSuite::M300() { + uint16_t const frequency = parser.ushortval('S', 260); + uint16_t duration = parser.ushortval('P', 1000); + + // Limits the tone duration to 0-5 seconds. + NOMORE(duration, 5000U); + + BUZZ(duration, frequency); +} + +#endif // HAS_BUZZER diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp new file mode 100644 index 00000000..7a545441 --- /dev/null +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -0,0 +1,48 @@ +/** + * 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(LCD_SET_PROGRESS_MANUALLY) + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" +#include "../../sd/cardreader.h" + +/** + * M73: Set percentage complete (for display on LCD) + * + * Example: + * M73 P25 ; Set progress to 25% + */ +void GcodeSuite::M73() { + if (parser.seen('P')) + ui.set_progress((PROGRESS_SCALE) > 1 + ? parser.value_float() * (PROGRESS_SCALE) + : parser.value_byte() + ); + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + if (parser.seen('R')) ui.set_remaining_time(60 * parser.value_ulong()); + #endif +} + +#endif // LCD_SET_PROGRESS_MANUALLY diff --git a/Marlin/src/gcode/lcd/M995.cpp b/Marlin/src/gcode/lcd/M995.cpp new file mode 100644 index 00000000..72d0d29f --- /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/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp new file mode 100644 index 00000000..9ac49bd9 --- /dev/null +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -0,0 +1,121 @@ +/** + * 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 "../gcode.h" +#include "../../module/motion.h" + +#include "../../MarlinCore.h" + +#if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) + #include "../../feature/fwretract.h" +#endif + +#include "../../sd/cardreader.h" + +#if ENABLED(NANODLP_Z_SYNC) + #include "../../module/stepper.h" +#endif + +extern xyze_pos_t destination; + +#if ENABLED(VARIABLE_G0_FEEDRATE) + feedRate_t fast_move_feedrate = MMM_TO_MMS(G0_FEEDRATE); +#endif + +/** + * G0, G1: Coordinated movement of X Y Z E axes + */ +void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { + + if (IsRunning() + #if ENABLED(NO_MOTION_BEFORE_HOMING) + && !homing_needed_error( + (parser.seen('X') ? _BV(X_AXIS) : 0) + | (parser.seen('Y') ? _BV(Y_AXIS) : 0) + | (parser.seen('Z') ? _BV(Z_AXIS) : 0) ) + #endif + ) { + + #ifdef G0_FEEDRATE + feedRate_t old_feedrate; + #if ENABLED(VARIABLE_G0_FEEDRATE) + if (fast_move) { + old_feedrate = feedrate_mm_s; // Back up the (old) motion mode feedrate + feedrate_mm_s = fast_move_feedrate; // Get G0 feedrate from last usage + } + #endif + #endif + + get_destination_from_command(); // Get X Y Z E F (and set cutter power) + + #ifdef G0_FEEDRATE + if (fast_move) { + #if ENABLED(VARIABLE_G0_FEEDRATE) + fast_move_feedrate = feedrate_mm_s; // Save feedrate for the next G0 + #else + old_feedrate = feedrate_mm_s; // Back up the (new) motion mode feedrate + feedrate_mm_s = MMM_TO_MMS(G0_FEEDRATE); // Get the fixed G0 feedrate + #endif + } + #endif + + #if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) + + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { + // When M209 Autoretract is enabled, convert E-only moves to firmware retract/recover moves + if (fwretract.autoretract_enabled && parser.seen('E') && !(parser.seen('X') || parser.seen('Y') || parser.seen('Z'))) { + const float echange = destination.e - current_position.e; + // Is this a retract or recover move? + if (WITHIN(ABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) { + current_position.e = destination.e; // Hide a G1-based retract/recover from calculations + sync_plan_position_e(); // AND from the planner + return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored) + } + } + } + + #endif // FWRETRACT + + #if IS_SCARA + fast_move ? prepare_fast_move_to_destination() : prepare_line_to_destination(); + #else + prepare_line_to_destination(); + #endif + + #ifdef G0_FEEDRATE + // Restore the motion mode feedrate + if (fast_move) feedrate_mm_s = old_feedrate; + #endif + + #if ENABLED(NANODLP_Z_SYNC) + #if ENABLED(NANODLP_ALL_AXIS) + #define _MOVE_SYNC parser.seenval('X') || parser.seenval('Y') || parser.seenval('Z') // For any move wait and output sync message + #else + #define _MOVE_SYNC parser.seenval('Z') // Only for Z move + #endif + if (_MOVE_SYNC) { + planner.synchronize(); + SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + } + #endif + } +} diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp new file mode 100644 index 00000000..61d9f1d3 --- /dev/null +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -0,0 +1,340 @@ +/** + * 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(ARC_SUPPORT) + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/temperature.h" + +#if ENABLED(DELTA) + #include "../../module/delta.h" +#elif ENABLED(SCARA) + #include "../../module/scara.h" +#endif + +#if N_ARC_CORRECTION < 1 + #undef N_ARC_CORRECTION + #define N_ARC_CORRECTION 1 +#endif + +/** + * Plan an arc in 2 dimensions + * + * The arc is approximated by generating many small linear segments. + * The length of each segment is configured in MM_PER_ARC_SEGMENT (Default 1mm) + * Arcs should only be made relatively large (over 5mm), as larger arcs with + * larger segments will tend to be more efficient. Your slicer should have + * options for G2/G3 arc generation. In future these options may be GCode tunable. + */ +void plan_arc( + const xyze_pos_t &cart, // Destination position + const ab_float_t &offset, // Center of rotation relative to current_position + const uint8_t clockwise // Clockwise? +) { + #if ENABLED(CNC_WORKSPACE_PLANES) + AxisEnum p_axis, q_axis, l_axis; + switch (gcode.workspace_plane) { + default: + case GcodeSuite::PLANE_XY: p_axis = X_AXIS; q_axis = Y_AXIS; l_axis = Z_AXIS; break; + case GcodeSuite::PLANE_YZ: p_axis = Y_AXIS; q_axis = Z_AXIS; l_axis = X_AXIS; break; + case GcodeSuite::PLANE_ZX: p_axis = Z_AXIS; q_axis = X_AXIS; l_axis = Y_AXIS; break; + } + #else + constexpr AxisEnum p_axis = X_AXIS, q_axis = Y_AXIS, l_axis = Z_AXIS; + #endif + + // Radius vector from center to current location + ab_float_t rvec = -offset; + + const float radius = HYPOT(rvec.a, rvec.b), + center_P = current_position[p_axis] - rvec.a, + center_Q = current_position[q_axis] - rvec.b, + rt_X = cart[p_axis] - center_P, + rt_Y = cart[q_axis] - center_Q, + start_L = current_position[l_axis], + linear_travel = cart[l_axis] - start_L, + extruder_travel = cart.e - current_position.e; + + // CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required. + float angular_travel = ATAN2(rvec.a * rt_Y - rvec.b * rt_X, rvec.a * rt_X + rvec.b * rt_Y); + if (angular_travel < 0) angular_travel += RADIANS(360); + #ifdef MIN_ARC_SEGMENTS + uint16_t min_segments = CEIL((MIN_ARC_SEGMENTS) * (angular_travel / RADIANS(360))); + NOLESS(min_segments, 1U); + #else + constexpr uint16_t min_segments = 1; + #endif + if (clockwise) angular_travel -= RADIANS(360); + + // Make a circle if the angular rotation is 0 and the target is current position + if (angular_travel == 0 && current_position[p_axis] == cart[p_axis] && current_position[q_axis] == cart[q_axis]) { + angular_travel = RADIANS(360); + #ifdef MIN_ARC_SEGMENTS + min_segments = MIN_ARC_SEGMENTS; + #endif + } + + const float flat_mm = radius * angular_travel, + mm_of_travel = linear_travel ? HYPOT(flat_mm, linear_travel) : ABS(flat_mm); + if (mm_of_travel < 0.001f) return; + + const feedRate_t scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); + + // Start with a nominal segment length + float seg_length = ( + #ifdef ARC_SEGMENTS_PER_R + constrain(MM_PER_ARC_SEGMENT * radius, MM_PER_ARC_SEGMENT, ARC_SEGMENTS_PER_R) + #elif ARC_SEGMENTS_PER_SEC + _MAX(scaled_fr_mm_s * RECIPROCAL(ARC_SEGMENTS_PER_SEC), MM_PER_ARC_SEGMENT) + #else + MM_PER_ARC_SEGMENT + #endif + ); + // Divide total travel by nominal segment length + uint16_t segments = FLOOR(mm_of_travel / seg_length); + NOLESS(segments, min_segments); // At least some segments + seg_length = mm_of_travel / segments; + + /** + * Vector rotation by transformation matrix: r is the original vector, r_T is the rotated vector, + * and phi is the angle of rotation. Based on the solution approach by Jens Geisler. + * r_T = [cos(phi) -sin(phi); + * sin(phi) cos(phi)] * r ; + * + * For arc generation, the center of the circle is the axis of rotation and the radius vector is + * defined from the circle center to the initial position. Each line segment is formed by successive + * vector rotations. This requires only two cos() and sin() computations to form the rotation + * matrix for the duration of the entire arc. Error may accumulate from numerical round-off, since + * all double numbers are single precision on the Arduino. (True double precision will not have + * round off issues for CNC applications.) Single precision error can accumulate to be greater than + * tool precision in some cases. Therefore, arc path correction is implemented. + * + * Small angle approximation may be used to reduce computation overhead further. This approximation + * holds for everything, but very small circles and large MM_PER_ARC_SEGMENT values. In other words, + * theta_per_segment would need to be greater than 0.1 rad and N_ARC_CORRECTION would need to be large + * to cause an appreciable drift error. N_ARC_CORRECTION~=25 is more than small enough to correct for + * numerical drift error. N_ARC_CORRECTION may be on the order a hundred(s) before error becomes an + * issue for CNC machines with the single precision Arduino calculations. + * + * This approximation also allows plan_arc to immediately insert a line segment into the planner + * without the initial overhead of computing cos() or sin(). By the time the arc needs to be applied + * a correction, the planner should have caught up to the lag caused by the initial plan_arc overhead. + * This is important when there are successive arc motions. + */ + // Vector rotation matrix values + xyze_pos_t raw; + const float theta_per_segment = angular_travel / segments, + linear_per_segment = linear_travel / segments, + extruder_per_segment = extruder_travel / segments, + sq_theta_per_segment = sq(theta_per_segment), + sin_T = theta_per_segment - sq_theta_per_segment*theta_per_segment/6, + cos_T = 1 - 0.5f * sq_theta_per_segment; // Small angle approximation + + // Initialize the linear axis + raw[l_axis] = current_position[l_axis]; + + // Initialize the extruder axis + raw.e = current_position.e; + + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = scaled_fr_mm_s / seg_length; + #endif + + millis_t next_idle_ms = millis() + 200UL; + + #if N_ARC_CORRECTION > 1 + int8_t arc_recalc_count = N_ARC_CORRECTION; + #endif + + for (uint16_t i = 1; i < segments; i++) { // Iterate (segments-1) times + + thermalManager.manage_heater(); + if (ELAPSED(millis(), next_idle_ms)) { + next_idle_ms = millis() + 200UL; + idle(); + } + + #if N_ARC_CORRECTION > 1 + if (--arc_recalc_count) { + // Apply vector rotation matrix to previous rvec.a / 1 + const float r_new_Y = rvec.a * sin_T + rvec.b * cos_T; + rvec.a = rvec.a * cos_T - rvec.b * sin_T; + rvec.b = r_new_Y; + } + else + #endif + { + #if N_ARC_CORRECTION > 1 + arc_recalc_count = N_ARC_CORRECTION; + #endif + + // Arc correction to radius vector. Computed only every N_ARC_CORRECTION increments. + // Compute exact location by applying transformation matrix from initial radius vector(=-offset). + // To reduce stuttering, the sin and cos could be computed at different times. + // For now, compute both at the same time. + const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment); + rvec.a = -offset[0] * cos_Ti + offset[1] * sin_Ti; + rvec.b = -offset[0] * sin_Ti - offset[1] * cos_Ti; + } + + // Update raw location + raw[p_axis] = center_P + rvec.a; + raw[q_axis] = center_Q + rvec.b; + #if ENABLED(AUTO_BED_LEVELING_UBL) + raw[l_axis] = start_L; + UNUSED(linear_per_segment); + #else + raw[l_axis] += linear_per_segment; + #endif + raw.e += extruder_per_segment; + + apply_motion_limits(raw); + + #if HAS_LEVELING && !PLANNER_LEVELING + planner.apply_leveling(raw); + #endif + + if (!planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, 0 + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + )) break; + } + + // Ensure last segment arrives at target location. + raw = cart; + TERN_(AUTO_BED_LEVELING_UBL, raw[l_axis] = start_L); + + apply_motion_limits(raw); + + #if HAS_LEVELING && !PLANNER_LEVELING + planner.apply_leveling(raw); + #endif + + planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, 0 + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + + TERN_(AUTO_BED_LEVELING_UBL, raw[l_axis] = start_L); + current_position = raw; + +} // plan_arc + +/** + * G2: Clockwise Arc + * G3: Counterclockwise Arc + * + * This command has two forms: IJ-form (JK, KI) and R-form. + * + * - Depending on the current Workspace Plane orientation, + * use parameters IJ/JK/KI to specify the XY/YZ/ZX offsets. + * At least one of the IJ/JK/KI parameters is required. + * XY/YZ/ZX can be omitted to do a complete circle. + * The given XY/YZ/ZX is not error-checked. The arc ends + * based on the angle of the destination. + * Mixing IJ/JK/KI with R will throw an error. + * + * - R specifies the radius. X or Y (Y or Z / Z or X) is required. + * Omitting both XY/YZ/ZX will throw an error. + * XY/YZ/ZX must differ from the current XY/YZ/ZX. + * Mixing R with IJ/JK/KI will throw an error. + * + * - P specifies the number of full circles to do + * before the specified arc move. + * + * Examples: + * + * G2 I10 ; CW circle centered at X+10 + * G3 X20 Y12 R14 ; CCW circle with r=14 ending at X20 Y12 + */ +void GcodeSuite::G2_G3(const bool clockwise) { + if (MOTION_CONDITIONS) { + + #if ENABLED(SF_ARC_FIX) + const bool relative_mode_backup = relative_mode; + relative_mode = true; + #endif + + get_destination_from_command(); // Get X Y Z E F (and set cutter power) + + TERN_(SF_ARC_FIX, relative_mode = relative_mode_backup); + + ab_float_t arc_offset = { 0, 0 }; + if (parser.seenval('R')) { + const float r = parser.value_linear_units(); + if (r) { + const xy_pos_t p1 = current_position, p2 = destination; + if (p1 != p2) { + const xy_pos_t d2 = (p2 - p1) * 0.5f; // XY vector to midpoint of move from current + const float e = clockwise ^ (r < 0) ? -1 : 1, // clockwise -1/1, counterclockwise 1/-1 + len = d2.magnitude(), // Distance to mid-point of move from current + h2 = (r - len) * (r + len), // factored to reduce rounding error + h = (h2 >= 0) ? SQRT(h2) : 0.0f; // Distance to the arc pivot-point from midpoint + const xy_pos_t s = { -d2.y, d2.x }; // Perpendicular bisector. (Divide by len for unit vector.) + arc_offset = d2 + s / len * e * h; // The calculated offset (mid-point if |r| <= len) + } + } + } + else { + #if ENABLED(CNC_WORKSPACE_PLANES) + char achar, bchar; + switch (gcode.workspace_plane) { + default: + case GcodeSuite::PLANE_XY: achar = 'I'; bchar = 'J'; break; + case GcodeSuite::PLANE_YZ: achar = 'J'; bchar = 'K'; break; + case GcodeSuite::PLANE_ZX: achar = 'K'; bchar = 'I'; break; + } + #else + constexpr char achar = 'I', bchar = 'J'; + #endif + if (parser.seenval(achar)) arc_offset.a = parser.value_linear_units(); + if (parser.seenval(bchar)) arc_offset.b = parser.value_linear_units(); + } + + if (arc_offset) { + + #if ENABLED(ARC_P_CIRCLES) + // P indicates number of circles to do + int8_t circles_to_do = parser.byteval('P'); + if (!WITHIN(circles_to_do, 0, 100)) + SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS); + + while (circles_to_do--) + plan_arc(current_position, arc_offset, clockwise); + #endif + + // Send the arc to the planner + plan_arc(destination, arc_offset, clockwise); + reset_stepper_timeout(); + } + else + SERIAL_ERROR_MSG(STR_ERR_ARC_ARGS); + } +} + +#endif // ARC_SUPPORT diff --git a/Marlin/src/gcode/motion/G4.cpp b/Marlin/src/gcode/motion/G4.cpp new file mode 100644 index 00000000..3a37fe5b --- /dev/null +++ b/Marlin/src/gcode/motion/G4.cpp @@ -0,0 +1,44 @@ +/** + * 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 "../gcode.h" +#include "../../module/stepper.h" +#include "../../lcd/ultralcd.h" + +/** + * G4: Dwell S or P + */ +void GcodeSuite::G4() { + millis_t dwell_ms = 0; + + if (parser.seenval('P')) dwell_ms = parser.value_millis(); // milliseconds to wait + if (parser.seenval('S')) dwell_ms = parser.value_millis_from_seconds(); // seconds to wait + + planner.synchronize(); + #if ENABLED(NANODLP_Z_SYNC) + SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + #endif + + if (!ui.has_status()) LCD_MESSAGEPGM(MSG_DWELL); + + dwell(dwell_ms); +} diff --git a/Marlin/src/gcode/motion/G5.cpp b/Marlin/src/gcode/motion/G5.cpp new file mode 100644 index 00000000..2c98fae8 --- /dev/null +++ b/Marlin/src/gcode/motion/G5.cpp @@ -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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(BEZIER_CURVE_SUPPORT) + +#include "../../module/motion.h" +#include "../../module/planner_bezier.h" + +/** + * Parameters interpreted according to: + * 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. + */ + +#include "../gcode.h" +#include "../../MarlinCore.h" // for IsRunning() + +/** + * G5: Cubic B-spline + */ +void GcodeSuite::G5() { + if (MOTION_CONDITIONS) { + + #if ENABLED(CNC_WORKSPACE_PLANES) + if (workspace_plane != PLANE_XY) { + SERIAL_ERROR_MSG(STR_ERR_BAD_PLANE_MODE); + return; + } + #endif + + get_destination_from_command(); + + const xy_pos_t offsets[2] = { + { parser.linearval('I'), parser.linearval('J') }, + { parser.linearval('P'), parser.linearval('Q') } + }; + + cubic_b_spline(current_position, destination, offsets, MMS_SCALED(feedrate_mm_s), active_extruder); + current_position = destination; + } +} + +#endif // BEZIER_CURVE_SUPPORT diff --git a/Marlin/src/gcode/motion/G6.cpp b/Marlin/src/gcode/motion/G6.cpp new file mode 100644 index 00000000..168dc28a --- /dev/null +++ b/Marlin/src/gcode/motion/G6.cpp @@ -0,0 +1,61 @@ +/** + * 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(DIRECT_STEPPING) + +#include "../../feature/direct_stepping.h" + +#include "../gcode.h" +#include "../../module/planner.h" + +/** + * G6: Direct Stepper Move + */ +void GcodeSuite::G6() { + // TODO: feedrate support? + if (parser.seen('R')) + planner.last_page_step_rate = parser.value_ulong(); + + if (!DirectStepping::Config::DIRECTIONAL) { + if (parser.seen('X')) planner.last_page_dir.x = !!parser.value_byte(); + if (parser.seen('Y')) planner.last_page_dir.y = !!parser.value_byte(); + if (parser.seen('Z')) planner.last_page_dir.z = !!parser.value_byte(); + if (parser.seen('E')) planner.last_page_dir.e = !!parser.value_byte(); + } + + // No index means we just set the state + if (!parser.seen('I')) return; + + // No speed is set, can't schedule the move + if (!planner.last_page_step_rate) return; + + const page_idx_t page_idx = (page_idx_t) parser.value_ulong(); + + uint16_t num_steps = DirectStepping::Config::TOTAL_STEPS; + if (parser.seen('S')) num_steps = parser.value_ushort(); + + planner.buffer_page(page_idx, 0, num_steps); + reset_stepper_timeout(); +} + +#endif // DIRECT_STEPPING diff --git a/Marlin/src/gcode/motion/G80.cpp b/Marlin/src/gcode/motion/G80.cpp new file mode 100644 index 00000000..f674596d --- /dev/null +++ b/Marlin/src/gcode/motion/G80.cpp @@ -0,0 +1,38 @@ +/** + * 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(GCODE_MOTION_MODES) + +#include "../gcode.h" + +/** + * G80: Cancel current motion mode + */ +void GcodeSuite::G80() { + + parser.cancel_motion_mode(); + +} + +#endif // GCODE_MOTION_MODES diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp new file mode 100644 index 00000000..18cc161f --- /dev/null +++ b/Marlin/src/gcode/motion/M290.cpp @@ -0,0 +1,137 @@ +/** + * 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(BABYSTEPPING) + +#include "../gcode.h" +#include "../../feature/babystep.h" +#include "../../module/probe.h" +#include "../../module/temperature.h" +#include "../../module/planner.h" + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../core/serial.h" +#endif + +#if ENABLED(MESH_BED_LEVELING) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + + FORCE_INLINE void mod_probe_offset(const float &offs) { + if (TERN1(BABYSTEP_HOTEND_Z_OFFSET, active_extruder == 0)) { + probe.offset.z += offs; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); + } + else { + #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) + hotend_offset[active_extruder].z -= offs; + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET STR_Z ": ", hotend_offset[active_extruder].z); + #endif + } + } + +#endif + +/** + * M290: Babystepping + * + * Send 'R' or no parameters for a report. + * + * X - Distance to step X + * Y - Distance to step Y + * Z - Distance to step Z + * S - Distance to step Z (alias for Z) + * + * With BABYSTEP_ZPROBE_OFFSET: + * P0 - Don't adjust the Z probe offset + */ +void GcodeSuite::M290() { + #if ENABLED(BABYSTEP_XY) + LOOP_XYZ(a) + if (parser.seenval(XYZ_CHAR(a)) || (a == Z_AXIS && parser.seenval('S'))) { + const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2); + babystep.add_mm((AxisEnum)a, offs); + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_probe_offset(offs); + #endif + } + #else + if (parser.seenval('Z') || parser.seenval('S')) { + const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2); + babystep.add_mm(Z_AXIS, offs); + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (!parser.seen('P') || parser.value_bool()) mod_probe_offset(offs); + #endif + } + #endif + + if (!parser.seen("XYZ") || parser.seen('R')) { + SERIAL_ECHO_START(); + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + SERIAL_ECHOLNPAIR(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); + #endif + + #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) + { + SERIAL_ECHOLNPAIR_P( + PSTR("Hotend "), int(active_extruder) + #if ENABLED(BABYSTEP_XY) + , PSTR("Offset X"), hotend_offset[active_extruder].x + , SP_Y_STR, hotend_offset[active_extruder].y + , SP_Z_STR + #else + , PSTR("Offset Z") + #endif + , hotend_offset[active_extruder].z + ); + } + #endif + + #if ENABLED(MESH_BED_LEVELING) + SERIAL_ECHOLNPAIR("MBL Adjust Z", mbl.z_offset); + #endif + + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) + { + SERIAL_ECHOLNPAIR_P( + #if ENABLED(BABYSTEP_XY) + PSTR("Babystep X"), babystep.axis_total[X_AXIS] + , SP_Y_STR, babystep.axis_total[Y_AXIS] + , SP_Z_STR + #else + PSTR("Babystep Z") + #endif + , babystep.axis_total[BS_TOTAL_IND(Z_AXIS)] + ); + } + #endif + } +} + +#endif // BABYSTEPPING diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp new file mode 100644 index 00000000..9c5085b9 --- /dev/null +++ b/Marlin/src/gcode/parser.cpp @@ -0,0 +1,410 @@ +/** + * 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 . + * + */ + +/** + * parser.cpp - Parser for a GCode line, providing a parameter interface. + */ + +#include "parser.h" + +#include "../MarlinCore.h" + +#if HAS_MULTI_SERIAL + #include "queue.h" +#endif + +// Must be declared for allocation and to satisfy the linker +// Zero values need no initialization. + +bool GCodeParser::volumetric_enabled; + +#if ENABLED(INCH_MODE_SUPPORT) + float GCodeParser::linear_unit_factor, GCodeParser::volumetric_unit_factor; +#endif + +#if ENABLED(TEMPERATURE_UNITS_SUPPORT) + TempUnit GCodeParser::input_temp_units = TEMPUNIT_C; +#endif + +char *GCodeParser::command_ptr, + *GCodeParser::string_arg, + *GCodeParser::value_ptr; +char GCodeParser::command_letter; +int GCodeParser::codenum; + +#if ENABLED(USE_GCODE_SUBCODES) + uint8_t GCodeParser::subcode; +#endif + +#if ENABLED(GCODE_MOTION_MODES) + int16_t GCodeParser::motion_mode_codenum = -1; + #if ENABLED(USE_GCODE_SUBCODES) + uint8_t GCodeParser::motion_mode_subcode; + #endif +#endif + +#if ENABLED(FASTER_GCODE_PARSER) + // Optimized Parameters + uint32_t GCodeParser::codebits; // found bits + uint8_t GCodeParser::param[26]; // parameter offsets from command_ptr +#else + char *GCodeParser::command_args; // start of parameters +#endif + +// Create a global instance of the GCode parser singleton +GCodeParser parser; + +/** + * Clear all code-seen (and value pointers) + * + * Since each param is set/cleared on seen codes, + * this may be optimized by commenting out ZERO(param) + */ +void GCodeParser::reset() { + string_arg = nullptr; // No whole line argument + command_letter = '?'; // No command letter + codenum = 0; // No command code + TERN_(USE_GCODE_SUBCODES, subcode = 0); // No command sub-code + #if ENABLED(FASTER_GCODE_PARSER) + codebits = 0; // No codes yet + //ZERO(param); // No parameters (should be safe to comment out this line) + #endif +} + +#if ENABLED(GCODE_QUOTED_STRINGS) + + // Pass the address after the first quote (if any) + char* GCodeParser::unescape_string(char* &src) { + if (*src == '"') ++src; // Skip the leading quote + char * const out = src; // Start of the string + char *dst = src; // Prepare to unescape and terminate + for (;;) { + char c = *src++; // Get the next char + switch (c) { + case '\\': c = *src++; break; // Get the escaped char + case '"' : c = '\0'; break; // Convert bare quote to nul + } + if (!(*dst++ = c)) break; // Copy and break on nul + } + return out; + } + +#endif + +// Populate all fields by parsing a single line of GCode +// 58 bytes of SRAM are used to speed up seen/value +void GCodeParser::parse(char *p) { + + reset(); // No codes to report + + auto uppercase = [](char c) { + if (TERN0(GCODE_CASE_INSENSITIVE, WITHIN(c, 'a', 'z'))) + c += 'A' - 'a'; + return c; + }; + + // Skip spaces + while (*p == ' ') ++p; + + // Skip N[-0-9] if included in the command line + if (uppercase(*p) == 'N' && NUMERIC_SIGNED(p[1])) { + //TERN_(FASTER_GCODE_PARSER, set('N', p + 1)); // (optional) Set the 'N' parameter value + p += 2; // skip N[-0-9] + while (NUMERIC(*p)) ++p; // skip [0-9]* + while (*p == ' ') ++p; // skip [ ]* + } + + // *p now points to the current command, which should be G, M, or T + command_ptr = p; + + // Get the command letter, which must be G, M, or T + const char letter = uppercase(*p++); + + // Nullify asterisk and trailing whitespace + char *starpos = strchr(p, '*'); + if (starpos) { + --starpos; // * + while (*starpos == ' ') --starpos; // spaces... + starpos[1] = '\0'; + } + + #if ANY(MARLIN_DEV_MODE, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SIGNED_CODENUM 1 + #endif + + // Bail if the letter is not G, M, or T + // (or a valid parameter for the current motion mode) + switch (letter) { + + case 'G': case 'M': case 'T': TERN_(MARLIN_DEV_MODE, case 'D':) + // Skip spaces to get the numeric part + while (*p == ' ') p++; + + #if ENABLED(PRUSA_MMU2) + if (letter == 'T') { + // check for special MMU2 T?/Tx/Tc commands + if (*p == '?' || *p == 'x' || *p == 'c') { + command_letter = letter; + string_arg = p; + return; + } + } + #endif + + // Bail if there's no command code number + if (!TERN(SIGNED_CODENUM, NUMERIC_SIGNED(*p), NUMERIC(*p))) return; + + // Save the command letter at this point + // A '?' signifies an unknown command + command_letter = letter; + + { + #if ENABLED(SIGNED_CODENUM) + int sign = 1; // Allow for a negative code like D-1 or T-1 + if (*p == '-') { sign = -1; ++p; } + #endif + + // Get the code number - integer digits only + codenum = 0; + + do { codenum = codenum * 10 + *p++ - '0'; } while (NUMERIC(*p)); + + // Apply the sign, if any + TERN_(SIGNED_CODENUM, codenum *= sign); + } + + // Allow for decimal point in command + #if ENABLED(USE_GCODE_SUBCODES) + if (*p == '.') { + p++; + while (NUMERIC(*p)) + subcode = subcode * 10 + *p++ - '0'; + } + #endif + + // Skip all spaces to get to the first argument, or nul + while (*p == ' ') p++; + + #if ENABLED(GCODE_MOTION_MODES) + if (letter == 'G' + && (codenum <= TERN(ARC_SUPPORT, 3, 1) || codenum == 5 || TERN0(G38_PROBE_TARGET, codenum == 38)) + ) { + motion_mode_codenum = codenum; + TERN_(USE_GCODE_SUBCODES, motion_mode_subcode = subcode); + } + #endif + + break; + + #if ENABLED(GCODE_MOTION_MODES) + #if ENABLED(ARC_SUPPORT) + case 'I' ... 'J': case 'R': + if (motion_mode_codenum != 2 && motion_mode_codenum != 3) return; + #endif + case 'P' ... 'Q': + if (motion_mode_codenum != 5) return; + case 'X' ... 'Z': case 'E' ... 'F': + if (motion_mode_codenum < 0) return; + command_letter = 'G'; + codenum = motion_mode_codenum; + TERN_(USE_GCODE_SUBCODES, subcode = motion_mode_subcode); + p--; // Back up one character to use the current parameter + break; + #endif // GCODE_MOTION_MODES + + default: return; + } + + // The command parameters (if any) start here, for sure! + + #if DISABLED(FASTER_GCODE_PARSER) + command_args = p; // Scan for parameters in seen() + #endif + + // Only use string_arg for these M codes + if (letter == 'M') switch (codenum) { + #if ENABLED(GCODE_MACROS) + case 810 ... 819: + #endif + #if ENABLED(EXPECTED_PRINTER_CHECK) + case 16: + #endif + case 23: case 28: case 30: case 117 ... 118: case 928: + string_arg = unescape_string(p); + return; + default: break; + } + + #if ENABLED(DEBUG_GCODE_PARSER) + const bool debug = codenum == 800; + #endif + + /** + * Find all parameters, set flags and pointers for fast parsing + * + * Most codes ignore 'string_arg', but those that want a string will get the right pointer. + * The following loop assigns the first "parameter" having no numeric value to 'string_arg'. + * This allows M0/M1 with expire time to work: "M0 S5 You Win!" + * For 'M118' you must use 'E1' and 'A1' rather than just 'E' or 'A' + */ + #if ENABLED(GCODE_QUOTED_STRINGS) + bool quoted_string_arg = false; + #endif + string_arg = nullptr; + while (const char param = uppercase(*p++)) { // Get the next parameter. A NUL ends the loop + + // Special handling for M32 [P] !/path/to/file.g# + // The path must be the last parameter + if (param == '!' && letter == 'M' && codenum == 32) { + string_arg = p; // Name starts after '!' + char * const lb = strchr(p, '#'); // Already seen '#' as SD char (to pause buffering) + if (lb) *lb = '\0'; // Safe to mark the end of the filename + return; + } + + #if ENABLED(GCODE_QUOTED_STRINGS) + if (!quoted_string_arg && param == '"') { + quoted_string_arg = true; + string_arg = unescape_string(p); + } + #endif + + #if ENABLED(FASTER_GCODE_PARSER) + // Arguments MUST be uppercase for fast GCode parsing + #define PARAM_OK(P) WITHIN((P), 'A', 'Z') + #else + #define PARAM_OK(P) true + #endif + + if (PARAM_OK(param)) { + + while (*p == ' ') p++; // Skip spaces between parameters & values + + #if ENABLED(GCODE_QUOTED_STRINGS) + const bool is_str = (*p == '"'), has_val = is_str || valid_float(p); + char * const valptr = has_val ? is_str ? unescape_string(p) : p : nullptr; + #else + const bool has_val = valid_float(p); + #if ENABLED(FASTER_GCODE_PARSER) + char * const valptr = has_val ? p : nullptr; + #endif + #endif + + #if ENABLED(DEBUG_GCODE_PARSER) + if (debug) { + SERIAL_ECHOPAIR("Got param ", param, " at index ", (int)(p - command_ptr - 1)); + if (has_val) SERIAL_ECHOPGM(" (has_val)"); + } + #endif + + if (!has_val && !string_arg) { // No value? First time, keep as string_arg + string_arg = p - 1; + #if ENABLED(DEBUG_GCODE_PARSER) + if (debug) SERIAL_ECHOPAIR(" string_arg: ", hex_address((void*)string_arg)); // DEBUG + #endif + } + + if (TERN0(DEBUG_GCODE_PARSER, debug)) SERIAL_EOL(); + + TERN_(FASTER_GCODE_PARSER, set(param, valptr)); // Set parameter exists and pointer (nullptr for no value) + } + else if (!string_arg) { // Not A-Z? First time, keep as the string_arg + string_arg = p - 1; + #if ENABLED(DEBUG_GCODE_PARSER) + if (debug) SERIAL_ECHOPAIR(" string_arg: ", hex_address((void*)string_arg)); // DEBUG + #endif + } + + if (!WITHIN(*p, 'A', 'Z')) { // Another parameter right away? + while (*p && DECIMAL_SIGNED(*p)) p++; // Skip over the value section of a parameter + while (*p == ' ') p++; // Skip over all spaces + } + } +} + +#if ENABLED(CNC_COORDINATE_SYSTEMS) + + // Parse the next parameter as a new command + bool GCodeParser::chain() { + #if ENABLED(FASTER_GCODE_PARSER) + char *next_command = command_ptr; + if (next_command) { + while (*next_command && *next_command != ' ') ++next_command; + while (*next_command == ' ') ++next_command; + if (!*next_command) next_command = nullptr; + } + #else + const char *next_command = command_args; + #endif + if (next_command) parse(next_command); + return !!next_command; + } + +#endif // CNC_COORDINATE_SYSTEMS + +void GCodeParser::unknown_command_warning() { + SERIAL_ECHO_MSG(STR_UNKNOWN_COMMAND, command_ptr, "\""); +} + +#if ENABLED(DEBUG_GCODE_PARSER) + + void GCodeParser::debug() { + SERIAL_ECHOPAIR("Command: ", command_ptr, " (", command_letter); + SERIAL_ECHO(codenum); + SERIAL_ECHOLNPGM(")"); + #if ENABLED(FASTER_GCODE_PARSER) + SERIAL_ECHOPGM(" args: { "); + for (char c = 'A'; c <= 'Z'; ++c) if (seen(c)) SERIAL_CHAR(c, ' '); + SERIAL_CHAR('}'); + #else + SERIAL_ECHOPAIR(" args: { ", command_args, " }"); + #endif + if (string_arg) { + SERIAL_ECHOPAIR(" string: \"", string_arg); + SERIAL_CHAR('"'); + } + SERIAL_ECHOLNPGM("\n"); + for (char c = 'A'; c <= 'Z'; ++c) { + if (seen(c)) { + SERIAL_ECHOPAIR("Code '", c); SERIAL_ECHOPGM("':"); + if (has_value()) { + SERIAL_ECHOLNPAIR( + "\n float: ", value_float(), + "\n long: ", value_long(), + "\n ulong: ", value_ulong(), + "\n millis: ", value_millis(), + "\n sec-ms: ", value_millis_from_seconds(), + "\n int: ", value_int(), + "\n ushort: ", value_ushort(), + "\n byte: ", (int)value_byte(), + "\n bool: ", (int)value_bool(), + "\n linear: ", value_linear_units(), + "\n celsius: ", value_celsius() + ); + } + else + SERIAL_ECHOLNPGM(" (no value)"); + } + } + } + +#endif // DEBUG_GCODE_PARSER diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h new file mode 100644 index 00000000..42b85ca2 --- /dev/null +++ b/Marlin/src/gcode/parser.h @@ -0,0 +1,434 @@ +/** + * 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 + +/** + * parser.h - Parser for a GCode line, providing a parameter interface. + * Codes like M149 control the way the GCode parser behaves, + * so settings for these codes are located in this class. + */ + +#include "../inc/MarlinConfig.h" + +//#define DEBUG_GCODE_PARSER +#if ENABLED(DEBUG_GCODE_PARSER) + #include "../libs/hex_print.h" +#endif + +#if ENABLED(TEMPERATURE_UNITS_SUPPORT) + typedef enum : uint8_t { TEMPUNIT_C, TEMPUNIT_K, TEMPUNIT_F } TempUnit; +#endif + +#if ENABLED(INCH_MODE_SUPPORT) + typedef enum : uint8_t { LINEARUNIT_MM, LINEARUNIT_INCH } LinearUnit; +#endif + +/** + * GCode parser + * + * - Parse a single gcode line for its letter, code, subcode, and parameters + * - FASTER_GCODE_PARSER: + * - Flags existing params (1 bit each) + * - Stores value offsets (1 byte each) + * - Provide accessors for parameters: + * - Parameter exists + * - Parameter has value + * - Parameter value in different units and types + */ +class GCodeParser { + +private: + static char *value_ptr; // Set by seen, used to fetch the value + + #if ENABLED(FASTER_GCODE_PARSER) + static uint32_t codebits; // Parameters pre-scanned + static uint8_t param[26]; // For A-Z, offsets into command args + #else + static char *command_args; // Args start here, for slow scan + #endif + +public: + + // Global states for GCode-level units features + + static bool volumetric_enabled; + + #if ENABLED(INCH_MODE_SUPPORT) + static float linear_unit_factor, volumetric_unit_factor; + #endif + + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + static TempUnit input_temp_units; + #endif + + // Command line state + static char *command_ptr, // The command, so it can be echoed + *string_arg, // string of command line + command_letter; // G, M, or T + static int codenum; // 123 + #if ENABLED(USE_GCODE_SUBCODES) + static uint8_t subcode; // .1 + #endif + + #if ENABLED(GCODE_MOTION_MODES) + static int16_t motion_mode_codenum; + #if ENABLED(USE_GCODE_SUBCODES) + static uint8_t motion_mode_subcode; + #endif + FORCE_INLINE static void cancel_motion_mode() { motion_mode_codenum = -1; } + #endif + + #if ENABLED(DEBUG_GCODE_PARSER) + static void debug(); + #endif + + // Reset is done before parsing + static void reset(); + + #define LETTER_BIT(N) ((N) - 'A') + + FORCE_INLINE static bool valid_signless(const char * const p) { + return NUMERIC(p[0]) || (p[0] == '.' && NUMERIC(p[1])); // .?[0-9] + } + + FORCE_INLINE static bool valid_float(const char * const p) { + return valid_signless(p) || ((p[0] == '-' || p[0] == '+') && valid_signless(&p[1])); // [-+]?.?[0-9] + } + + FORCE_INLINE static bool valid_number(const char * const p) { + // TODO: With MARLIN_DEV_MODE allow HEX values starting with "x" + return valid_float(p); + } + + #if ENABLED(FASTER_GCODE_PARSER) + + FORCE_INLINE static bool valid_int(const char * const p) { + return NUMERIC(p[0]) || ((p[0] == '-' || p[0] == '+') && NUMERIC(p[1])); // [-+]?[0-9] + } + + // Set the flag and pointer for a parameter + static inline void set(const char c, char * const ptr) { + const uint8_t ind = LETTER_BIT(c); + if (ind >= COUNT(param)) return; // Only A-Z + SBI32(codebits, ind); // parameter exists + param[ind] = ptr ? ptr - command_ptr : 0; // parameter offset or 0 + #if ENABLED(DEBUG_GCODE_PARSER) + if (codenum == 800) { + SERIAL_ECHOPAIR("Set bit ", (int)ind, " of codebits (", hex_address((void*)(codebits >> 16))); + print_hex_word((uint16_t)(codebits & 0xFFFF)); + SERIAL_ECHOLNPAIR(") | param = ", (int)param[ind]); + } + #endif + } + + // Code seen bit was set. If not found, value_ptr is unchanged. + // This allows "if (seen('A')||seen('B'))" to use the last-found value. + static inline bool seen(const char c) { + const uint8_t ind = LETTER_BIT(c); + if (ind >= COUNT(param)) return false; // Only A-Z + const bool b = TEST32(codebits, ind); + if (b) { + if (param[ind]) { + char * const ptr = command_ptr + param[ind]; + value_ptr = valid_number(ptr) ? ptr : nullptr; + } + else + value_ptr = nullptr; + } + return b; + } + + FORCE_INLINE static constexpr uint32_t letter_bits(const char * const str) { + return (str[0] ? _BV32(LETTER_BIT(str[0])) | + (str[1] ? _BV32(LETTER_BIT(str[1])) | + (str[2] ? _BV32(LETTER_BIT(str[2])) | + (str[3] ? _BV32(LETTER_BIT(str[3])) | + (str[4] ? _BV32(LETTER_BIT(str[4])) | + (str[5] ? _BV32(LETTER_BIT(str[5])) | + (str[6] ? _BV32(LETTER_BIT(str[6])) | + (str[7] ? _BV32(LETTER_BIT(str[7])) | + (str[8] ? _BV32(LETTER_BIT(str[8])) | + (str[9] ? _BV32(LETTER_BIT(str[9])) + : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0); + } + + // At least one of a list of code letters was seen + #ifdef CPU_32_BIT + FORCE_INLINE static bool seen(const char * const str) { return !!(codebits & letter_bits(str)); } + #else + FORCE_INLINE static bool seen(const char * const str) { + const uint32_t letrbits = letter_bits(str); + const uint8_t * const cb = (uint8_t*)&codebits; + const uint8_t * const lb = (uint8_t*)&letrbits; + return (cb[0] & lb[0]) || (cb[1] & lb[1]) || (cb[2] & lb[2]) || (cb[3] & lb[3]); + } + #endif + + static inline bool seen_any() { return !!codebits; } + + FORCE_INLINE static bool seen_test(const char c) { return TEST32(codebits, LETTER_BIT(c)); } + + #else // !FASTER_GCODE_PARSER + + #if ENABLED(GCODE_CASE_INSENSITIVE) + FORCE_INLINE static char* strgchr(char *p, char g) { + auto uppercase = [](char c) { + return c + (WITHIN(c, 'a', 'z') ? 'A' - 'a' : 0); + }; + const char d = uppercase(g); + for (char cc; (cc = uppercase(*p)); p++) if (cc == d) return p; + return nullptr; + } + #else + #define strgchr strchr + #endif + + // Code is found in the string. If not found, value_ptr is unchanged. + // This allows "if (seen('A')||seen('B'))" to use the last-found value. + static inline bool seen(const char c) { + char *p = strgchr(command_args, c); + const bool b = !!p; + if (b) value_ptr = valid_number(&p[1]) ? &p[1] : nullptr; + return b; + } + + static inline bool seen_any() { return *command_args == '\0'; } + + FORCE_INLINE static bool seen_test(const char c) { return (bool)strgchr(command_args, c); } + + // At least one of a list of code letters was seen + static inline bool seen(const char * const str) { + for (uint8_t i = 0; const char c = str[i]; i++) + if (seen_test(c)) return true; + return false; + } + + #endif // !FASTER_GCODE_PARSER + + // Seen any axis parameter + static inline bool seen_axis() { + return seen_test('X') || seen_test('Y') || seen_test('Z') || seen_test('E'); + } + + #if ENABLED(GCODE_QUOTED_STRINGS) + static char* unescape_string(char* &src); + #else + FORCE_INLINE static char* unescape_string(char* &src) { return src; } + #endif + + // Populate all fields by parsing a single line of GCode + // This uses 54 bytes of SRAM to speed up seen/value + static void parse(char * p); + + #if ENABLED(CNC_COORDINATE_SYSTEMS) + // Parse the next parameter as a new command + static bool chain(); + #endif + + // The code value pointer was set + FORCE_INLINE static bool has_value() { return value_ptr != nullptr; } + + // Seen a parameter with a value + static inline bool seenval(const char c) { return seen(c) && has_value(); } + + // The value as a string + static inline char* value_string() { return value_ptr; } + + // Float removes 'E' to prevent scientific notation interpretation + static inline float value_float() { + if (value_ptr) { + char *e = value_ptr; + for (;;) { + const char c = *e; + if (c == '\0' || c == ' ') break; + if (c == 'E' || c == 'e') { + *e = '\0'; + const float ret = strtof(value_ptr, nullptr); + *e = c; + return ret; + } + ++e; + } + return strtof(value_ptr, nullptr); + } + return 0; + } + + // Code value as a long or ulong + static inline int32_t value_long() { return value_ptr ? strtol(value_ptr, nullptr, 10) : 0L; } + static inline uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, nullptr, 10) : 0UL; } + + // Code value for use as time + static inline millis_t value_millis() { return value_ulong(); } + static inline millis_t value_millis_from_seconds() { return (millis_t)(value_float() * 1000); } + + // Reduce to fewer bits + static inline int16_t value_int() { return (int16_t)value_long(); } + static inline uint16_t value_ushort() { return (uint16_t)value_long(); } + static inline uint8_t value_byte() { return (uint8_t)constrain(value_long(), 0, 255); } + + // Bool is true with no value or non-zero + static inline bool value_bool() { return !has_value() || !!value_byte(); } + + // Units modes: Inches, Fahrenheit, Kelvin + + #if ENABLED(INCH_MODE_SUPPORT) + static inline float mm_to_linear_unit(const float mm) { return mm / linear_unit_factor; } + static inline float mm_to_volumetric_unit(const float mm) { return mm / (volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } + + // Init linear units by constructor + GCodeParser() { set_input_linear_units(LINEARUNIT_MM); } + + static inline void set_input_linear_units(const LinearUnit units) { + switch (units) { + default: + case LINEARUNIT_MM: linear_unit_factor = 1.0f; break; + case LINEARUNIT_INCH: linear_unit_factor = 25.4f; break; + } + volumetric_unit_factor = POW(linear_unit_factor, 3); + } + + static inline float axis_unit_factor(const AxisEnum axis) { + return (axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); + } + + static inline float linear_value_to_mm(const float v) { return v * linear_unit_factor; } + static inline float axis_value_to_mm(const AxisEnum axis, const float v) { return v * axis_unit_factor(axis); } + static inline float per_axis_value(const AxisEnum axis, const float v) { return v / axis_unit_factor(axis); } + + #else + + static inline float mm_to_linear_unit(const float mm) { return mm; } + static inline float mm_to_volumetric_unit(const float mm) { return mm; } + + static inline float linear_value_to_mm(const float v) { return v; } + static inline float axis_value_to_mm(const AxisEnum, const float v) { return v; } + static inline float per_axis_value(const AxisEnum, const float v) { return v; } + + #endif + + #define LINEAR_UNIT(V) parser.mm_to_linear_unit(V) + #define VOLUMETRIC_UNIT(V) parser.mm_to_volumetric_unit(V) + + static inline float value_linear_units() { return linear_value_to_mm(value_float()); } + static inline float value_axis_units(const AxisEnum axis) { return axis_value_to_mm(axis, value_float()); } + static inline float value_per_axis_units(const AxisEnum axis) { return per_axis_value(axis, value_float()); } + + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + + static inline void set_input_temp_units(const TempUnit units) { input_temp_units = units; } + + #if HAS_LCD_MENU && DISABLED(DISABLE_M503) + + static inline char temp_units_code() { + return input_temp_units == TEMPUNIT_K ? 'K' : input_temp_units == TEMPUNIT_F ? 'F' : 'C'; + } + static inline PGM_P temp_units_name() { + return input_temp_units == TEMPUNIT_K ? PSTR("Kelvin") : input_temp_units == TEMPUNIT_F ? PSTR("Fahrenheit") : PSTR("Celsius"); + } + static inline float to_temp_units(const float &f) { + switch (input_temp_units) { + case TEMPUNIT_F: + return f * 0.5555555556f + 32; + case TEMPUNIT_K: + return f + 273.15f; + case TEMPUNIT_C: + default: + return f; + } + } + + #endif // HAS_LCD_MENU && !DISABLE_M503 + + static inline float value_celsius() { + const float f = value_float(); + switch (input_temp_units) { + case TEMPUNIT_F: + return (f - 32) * 0.5555555556f; + case TEMPUNIT_K: + return f - 273.15f; + case TEMPUNIT_C: + default: + return f; + } + } + + static inline float value_celsius_diff() { + switch (input_temp_units) { + case TEMPUNIT_F: + return value_float() * 0.5555555556f; + case TEMPUNIT_C: + case TEMPUNIT_K: + default: + return value_float(); + } + } + + #define TEMP_UNIT(N) parser.to_temp_units(N) + + #else // !TEMPERATURE_UNITS_SUPPORT + + static inline float value_celsius() { return value_float(); } + static inline float value_celsius_diff() { return value_float(); } + + #define TEMP_UNIT(N) (N) + + #endif // !TEMPERATURE_UNITS_SUPPORT + + static inline feedRate_t value_feedrate() { return MMM_TO_MMS(value_linear_units()); } + + void unknown_command_warning(); + + // Provide simple value accessors with default option + static inline char* stringval(const char c, char * const dval=nullptr) { return seenval(c) ? value_string() : dval; } + static inline float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } + static inline bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } + static inline uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } + static inline int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } + static inline uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } + static inline int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } + static inline uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } + static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } + static inline float celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } + + #if ENABLED(MARLIN_DEV_MODE) + + static inline uint8_t* hex_adr_val(const char c, uint8_t * const dval=nullptr) { + if (!seen(c) || *value_ptr != 'x') return dval; + uint8_t *out = nullptr; + for (char *vp = value_ptr + 1; HEXCHR(*vp) >= 0; vp++) + out = (uint8_t*)((uintptr_t(out) << 8) | HEXCHR(*vp)); + return out; + } + + static inline uint16_t hex_val(const char c, uint16_t const dval=0) { + if (!seen(c) || *value_ptr != 'x') return dval; + uint16_t out = 0; + for (char *vp = value_ptr + 1; HEXCHR(*vp) >= 0; vp++) + out = ((out) << 8) | HEXCHR(*vp); + return out; + } + + #endif +}; + +extern GCodeParser parser; diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp new file mode 100644 index 00000000..4347f55a --- /dev/null +++ b/Marlin/src/gcode/probe/G30.cpp @@ -0,0 +1,66 @@ +/** + * 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_BED_PROBE + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/probe.h" +#include "../../feature/bedlevel/bedlevel.h" + +/** + * G30: Do a single Z probe at the current XY + * + * Parameters: + * + * X Probe X position (default current X) + * Y Probe Y position (default current Y) + * E Engage the probe for each probe (default 1) + */ +void GcodeSuite::G30() { + + const xy_pos_t pos = { parser.linearval('X', current_position.x + probe.offset_xy.x), + parser.linearval('Y', current_position.y + probe.offset_xy.y) }; + + if (!probe.can_reach(pos)) return; + + // Disable leveling so the planner won't mess with us + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + + remember_feedrate_scaling_off(); + + 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: ", pos.x, " Y: ", pos.y, " Z: ", measured_z); + + restore_feedrate_and_scaling(); + + if (raise_after == PROBE_PT_STOW) + probe.move_z_after_probing(); + + report_current_position(); +} + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/probe/G31_G32.cpp b/Marlin/src/gcode/probe/G31_G32.cpp new file mode 100644 index 00000000..af44257d --- /dev/null +++ b/Marlin/src/gcode/probe/G31_G32.cpp @@ -0,0 +1,40 @@ +/** + * 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(Z_PROBE_SLED) + +#include "../gcode.h" +#include "../../module/probe.h" + +/** + * G31: Deploy the Z probe + */ +void GcodeSuite::G31() { probe.deploy(); } + +/** + * G32: Stow the Z probe + */ +void GcodeSuite::G32() { probe.stow(); } + +#endif // Z_PROBE_SLED diff --git a/Marlin/src/gcode/probe/G38.cpp b/Marlin/src/gcode/probe/G38.cpp new file mode 100644 index 00000000..b06cd473 --- /dev/null +++ b/Marlin/src/gcode/probe/G38.cpp @@ -0,0 +1,133 @@ +/** + * 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(G38_PROBE_TARGET) + +#include "../gcode.h" + +#include "../../module/endstops.h" +#include "../../module/motion.h" +#include "../../module/stepper.h" +#include "../../module/probe.h" + +inline void G38_single_probe(const uint8_t move_value) { + endstops.enable(true); + G38_move = move_value; + prepare_line_to_destination(); + planner.synchronize(); + G38_move = 0; + endstops.hit_on_purpose(); + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); +} + +inline bool G38_run_probe() { + + bool G38_pass_fail = false; + + #if MULTIPLE_PROBING > 1 + // Get direction of move and retract + xyz_float_t retract_mm; + LOOP_XYZ(i) { + const float dist = destination[i] - current_position[i]; + retract_mm[i] = ABS(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm((AxisEnum)i) * (dist > 0 ? -1 : 1); + } + #endif + + planner.synchronize(); // wait until the machine is idle + + // Move flag value + #if ENABLED(G38_PROBE_AWAY) + const uint8_t move_value = parser.subcode; + #else + constexpr uint8_t move_value = 1; + #endif + + G38_did_trigger = false; + + // Move until destination reached or target hit + G38_single_probe(move_value); + + if (G38_did_trigger) { + + G38_pass_fail = true; + + #if MULTIPLE_PROBING > 1 + // Move away by the retract distance + destination = current_position + retract_mm; + endstops.enable(false); + prepare_line_to_destination(); + planner.synchronize(); + + REMEMBER(fr, feedrate_mm_s, feedrate_mm_s * 0.25); + + // Bump the target more slowly + destination -= retract_mm * 2; + + G38_single_probe(move_value); + #endif + } + + endstops.not_homing(); + return G38_pass_fail; +} + +/** + * G38 Probe Target + * + * G38.2 - Probe toward workpiece, stop on contact, signal error if failure + * G38.3 - Probe toward workpiece, stop on contact + * + * With G38_PROBE_AWAY: + * + * G38.4 - Probe away from workpiece, stop on contact break, signal error if failure + * G38.5 - Probe away from workpiece, stop on contact break + */ +void GcodeSuite::G38(const int8_t subcode) { + // Get X Y Z E F + get_destination_from_command(); + + remember_feedrate_scaling_off(); + + const bool error_on_fail = + #if ENABLED(G38_PROBE_AWAY) + !TEST(subcode, 0) + #else + (subcode == 2) + #endif + ; + + // If any axis has enough movement, do the move + LOOP_XYZ(i) + if (ABS(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) { + if (!parser.seenval('F')) feedrate_mm_s = homing_feedrate((AxisEnum)i); + // If G38.2 fails throw an error + if (!G38_run_probe() && error_on_fail) SERIAL_ERROR_MSG("Failed to reach target"); + break; + } + + restore_feedrate_and_scaling(); +} + +#endif // G38_PROBE_TARGET diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp new file mode 100644 index 00000000..8e9bd11b --- /dev/null +++ b/Marlin/src/gcode/probe/M401_M402.cpp @@ -0,0 +1,48 @@ +/** + * 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_BED_PROBE + +#include "../gcode.h" +#include "../../module/motion.h" +#include "../../module/probe.h" + +/** + * M401: Deploy and activate the Z probe + */ +void GcodeSuite::M401() { + probe.deploy(); + report_current_position(); +} + +/** + * M402: Deactivate and stow the Z probe + */ +void GcodeSuite::M402() { + probe.stow(); + probe.move_z_after_probing(); + report_current_position(); +} + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/probe/M851.cpp b/Marlin/src/gcode/probe/M851.cpp new file mode 100644 index 00000000..ee60e9eb --- /dev/null +++ b/Marlin/src/gcode/probe/M851.cpp @@ -0,0 +1,99 @@ +/** + * 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_BED_PROBE + +#include "../gcode.h" +#include "../../feature/bedlevel/bedlevel.h" +#include "../../module/probe.h" + +extern const char SP_Y_STR[], SP_Z_STR[]; + +/** + * M851: Set the nozzle-to-probe offsets in current units + */ +void GcodeSuite::M851() { + + // Show usage with no parameters + if (!parser.seen("XYZ")) { + SERIAL_ECHOLNPAIR_P( + #if HAS_PROBE_XY_OFFSET + PSTR(STR_PROBE_OFFSET " X"), probe.offset_xy.x, SP_Y_STR, probe.offset_xy.y, SP_Z_STR + #else + PSTR(STR_PROBE_OFFSET " X0 Y0 Z") + #endif + , probe.offset.z + ); + return; + } + + // Start with current offsets and modify + xyz_pos_t offs = probe.offset; + + // Assume no errors + bool ok = true; + + if (parser.seenval('X')) { + const float x = parser.value_float(); + #if HAS_PROBE_XY_OFFSET + if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) + offs.x = x; + else { + SERIAL_ECHOLNPAIR("?X out of range (-", int(X_BED_SIZE), " to ", int(X_BED_SIZE), ")"); + ok = false; + } + #else + if (x) SERIAL_ECHOLNPAIR("?X must be 0 (NOZZLE_AS_PROBE)."); // ...but let 'ok' stay true + #endif + } + + if (parser.seenval('Y')) { + const float y = parser.value_float(); + #if HAS_PROBE_XY_OFFSET + if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) + offs.y = y; + else { + SERIAL_ECHOLNPAIR("?Y out of range (-", int(Y_BED_SIZE), " to ", int(Y_BED_SIZE), ")"); + ok = false; + } + #else + if (y) SERIAL_ECHOLNPAIR("?Y must be 0 (NOZZLE_AS_PROBE)."); // ...but let 'ok' stay true + #endif + } + + if (parser.seenval('Z')) { + const float z = parser.value_float(); + if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + offs.z = z; + else { + SERIAL_ECHOLNPAIR("?Z out of range (", int(Z_PROBE_OFFSET_RANGE_MIN), " to ", int(Z_PROBE_OFFSET_RANGE_MAX), ")"); + ok = false; + } + } + + // Save the new offsets + if (ok) probe.offset = offs; +} + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/gcode/probe/M951.cpp b/Marlin/src/gcode/probe/M951.cpp new file mode 100644 index 00000000..f461fc2b --- /dev/null +++ b/Marlin/src/gcode/probe/M951.cpp @@ -0,0 +1,71 @@ +/** + * 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(MAGNETIC_PARKING_EXTRUDER) + +#include "../gcode.h" +#include "../../module/tool_change.h" +#include "../../module/motion.h" + +mpe_settings_t mpe_settings; + +inline void mpe_settings_report() { + SERIAL_ECHO_MSG("Magnetic Parking Extruder"); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("L: Left parking :", mpe_settings.parking_xpos[0]); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("R: Right parking :", mpe_settings.parking_xpos[1]); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("I: Grab Offset :", mpe_settings.grab_distance); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("J: Normal speed :", long(MMS_TO_MMM(mpe_settings.slow_feedrate))); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("H: High speed :", long(MMS_TO_MMM(mpe_settings.fast_feedrate))); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("D: Distance trav.:", mpe_settings.travel_distance); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("C: Compenstion :", mpe_settings.compensation_factor); +} + +void mpe_settings_init() { + constexpr float pex[2] = PARKING_EXTRUDER_PARKING_X; + mpe_settings.parking_xpos[0] = pex[0]; // M951 L + mpe_settings.parking_xpos[1] = pex[1]; // M951 R + mpe_settings.grab_distance = PARKING_EXTRUDER_GRAB_DISTANCE; // M951 I + TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, mpe_settings.grab_distance * -1)); + mpe_settings.slow_feedrate = MMM_TO_MMS(MPE_SLOW_SPEED); // M951 J + mpe_settings.fast_feedrate = MMM_TO_MMS(MPE_FAST_SPEED); // M951 H + mpe_settings.travel_distance = MPE_TRAVEL_DISTANCE; // M951 D + mpe_settings.compensation_factor = MPE_COMPENSATION; // M951 C + mpe_settings_report(); +} + +void GcodeSuite::M951() { + if (parser.seenval('L')) mpe_settings.parking_xpos[0] = parser.value_linear_units(); + if (parser.seenval('R')) mpe_settings.parking_xpos[1] = parser.value_linear_units(); + if (parser.seenval('I')) { + mpe_settings.grab_distance = parser.value_linear_units(); + TERN_(HAS_HOME_OFFSET, set_home_offset(X_AXIS, mpe_settings.grab_distance * -1)); + } + if (parser.seenval('J')) mpe_settings.slow_feedrate = MMM_TO_MMS(parser.value_linear_units()); + if (parser.seenval('H')) mpe_settings.fast_feedrate = MMM_TO_MMS(parser.value_linear_units()); + if (parser.seenval('D')) mpe_settings.travel_distance = parser.value_linear_units(); + if (parser.seenval('C')) mpe_settings.compensation_factor = parser.value_float(); + if (!parser.seen("CDHIJLR")) mpe_settings_report(); +} + +#endif // MAGNETIC_PARKING_EXTRUDER diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp new file mode 100644 index 00000000..a02d2c01 --- /dev/null +++ b/Marlin/src/gcode/queue.cpp @@ -0,0 +1,660 @@ +/** + * 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 . + * + */ + +/** + * queue.cpp - The G-code command queue + */ + +#include "queue.h" +GCodeQueue queue; + +#include "gcode.h" + +#include "../lcd/ultralcd.h" +#include "../sd/cardreader.h" +#include "../module/planner.h" +#include "../module/temperature.h" +#include "../MarlinCore.h" + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../feature/leds/printer_event_leds.h" +#endif + +#if ENABLED(BINARY_FILE_TRANSFER) + #include "../feature/binary_stream.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/powerloss.h" +#endif + +/** + * GCode line number handling. Hosts may opt to include line numbers when + * sending commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ +long GCodeQueue::last_N[NUM_SERIAL]; + +/** + * GCode Command Queue + * A simple ring buffer of BUFSIZE command strings. + * + * Commands are copied into this buffer by the command injectors + * (immediate, serial, sd card) and they are processed sequentially by + * the main loop. The gcode.process_next_command method parses the next + * command and hands off execution to individual handler functions. + */ +uint8_t GCodeQueue::length = 0, // Count of commands in the queue + GCodeQueue::index_r = 0, // Ring buffer read position + GCodeQueue::index_w = 0; // Ring buffer write position + +char GCodeQueue::command_buffer[BUFSIZE][MAX_CMD_SIZE]; + +/* + * The port that the command was received on + */ +#if HAS_MULTI_SERIAL + int16_t GCodeQueue::port[BUFSIZE]; +#endif + +/** + * Serial command injection + */ + +// Number of characters read in the current line of serial input +static int serial_count[NUM_SERIAL] = { 0 }; + +bool send_ok[BUFSIZE]; + +/** + * Next Injected PROGMEM Command pointer. (nullptr == empty) + * Internal commands are enqueued ahead of serial / SD commands. + */ +PGM_P GCodeQueue::injected_commands_P; // = nullptr + +/** + * Injected SRAM Commands + */ +char GCodeQueue::injected_commands[64]; // = { 0 } + +GCodeQueue::GCodeQueue() { + // Send "ok" after commands by default + LOOP_L_N(i, COUNT(send_ok)) send_ok[i] = true; +} + +/** + * Check whether there are any commands yet to be executed + */ +bool GCodeQueue::has_commands_queued() { + return queue.length || injected_commands_P || injected_commands[0]; +} + +/** + * Clear the Marlin command queue + */ +void GCodeQueue::clear() { + index_r = index_w = length = 0; +} + +/** + * Once a new command is in the ring buffer, call this to commit it + */ +void GCodeQueue::_commit_command(bool say_ok + #if HAS_MULTI_SERIAL + , int16_t p/*=-1*/ + #endif +) { + send_ok[index_w] = say_ok; + TERN_(HAS_MULTI_SERIAL, port[index_w] = p); + TERN_(POWER_LOSS_RECOVERY, recovery.commit_sdpos(index_w)); + if (++index_w >= BUFSIZE) index_w = 0; + length++; +} + +/** + * Copy a command from RAM into the main command buffer. + * Return true if the command was successfully added. + * Return false for a full buffer, or if the 'command' is a comment. + */ +bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ + #if HAS_MULTI_SERIAL + , int16_t pn/*=-1*/ + #endif +) { + if (*cmd == ';' || length >= BUFSIZE) return false; + strcpy(command_buffer[index_w], cmd); + _commit_command(say_ok + #if HAS_MULTI_SERIAL + , pn + #endif + ); + return true; +} + +#define ISEOL(C) ((C) == '\n' || (C) == '\r') + +/** + * Enqueue with Serial Echo + * Return true if the command was consumed + */ +bool GCodeQueue::enqueue_one(const char* cmd) { + + //SERIAL_ECHOPGM("enqueue_one(\""); + //SERIAL_ECHO(cmd); + //SERIAL_ECHOPGM("\") \n"); + + if (*cmd == 0 || ISEOL(*cmd)) return true; + + if (_enqueue(cmd)) { + SERIAL_ECHO_MSG(STR_ENQUEUEING, cmd, "\""); + return true; + } + return false; +} + +/** + * Process the next "immediate" command from PROGMEM. + * Return 'true' if any commands were processed. + */ +bool GCodeQueue::process_injected_command_P() { + if (injected_commands_P == nullptr) return false; + + char c; + size_t i = 0; + while ((c = pgm_read_byte(&injected_commands_P[i])) && c != '\n') i++; + + // Extract current command and move pointer to next command + char cmd[i + 1]; + memcpy_P(cmd, injected_commands_P, i); + cmd[i] = '\0'; + injected_commands_P = c ? injected_commands_P + i + 1 : nullptr; + + // Execute command if non-blank + if (i) { + parser.parse(cmd); + gcode.process_parsed_command(); + } + return true; +} + +/** + * Process the next "immediate" command from SRAM. + * Return 'true' if any commands were processed. + */ +bool GCodeQueue::process_injected_command() { + if (injected_commands[0] == '\0') return false; + + char c; + size_t i = 0; + while ((c = injected_commands[i]) && c != '\n') i++; + + // Execute a non-blank command + if (i) { + injected_commands[i] = '\0'; + parser.parse(injected_commands); + gcode.process_parsed_command(); + } + + // Copy the next command into place + for ( + uint8_t d = 0, s = i + !!c; // dst, src + (injected_commands[d] = injected_commands[s]); // copy, exit if 0 + d++, s++ // next dst, src + ); + + return true; +} + +/** + * Enqueue and return only when commands are actually enqueued. + * Never call this from a G-code handler! + */ +void GCodeQueue::enqueue_one_now(const char* cmd) { while (!enqueue_one(cmd)) idle(); } + +/** + * Attempt to enqueue a single G-code command + * and return 'true' if successful. + */ +bool GCodeQueue::enqueue_one_P(PGM_P const pgcode) { + size_t i = 0; + PGM_P p = pgcode; + char c; + while ((c = pgm_read_byte(&p[i])) && c != '\n') i++; + char cmd[i + 1]; + memcpy_P(cmd, p, i); + cmd[i] = '\0'; + return _enqueue(cmd); +} + +/** + * Enqueue from program memory and return only when commands are actually enqueued + * Never call this from a G-code handler! + */ +void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { + size_t i = 0; + PGM_P p = pgcode; + for (;;) { + char c; + while ((c = pgm_read_byte(&p[i])) && c != '\n') i++; + char cmd[i + 1]; + memcpy_P(cmd, p, i); + cmd[i] = '\0'; + enqueue_one_now(cmd); + if (!c) break; + p += i + 1; + } +} + +/** + * Send an "ok" message to the host, indicating + * that a command was successfully processed. + * + * If ADVANCED_OK is enabled also include: + * N Line number of the command, if any + * P Planner space remaining + * B Block queue space remaining + */ +void GCodeQueue::ok_to_send() { + #if HAS_MULTI_SERIAL + const int16_t pn = command_port(); + if (pn < 0) return; + PORT_REDIRECT(pn); // Reply to the serial port that sent the command + #endif + if (!send_ok[index_r]) return; + SERIAL_ECHOPGM(STR_OK); + #if ENABLED(ADVANCED_OK) + char* p = command_buffer[index_r]; + if (*p == 'N') { + SERIAL_ECHO(' '); + SERIAL_ECHO(*p++); + while (NUMERIC_SIGNED(*p)) + SERIAL_ECHO(*p++); + } + SERIAL_ECHOPAIR_P(SP_P_STR, int(planner.moves_free()), + SP_B_STR, int(BUFSIZE - length)); + #endif + SERIAL_EOL(); +} + +/** + * Send a "Resend: nnn" message to the host to + * indicate that a command needs to be re-sent. + */ +void GCodeQueue::flush_and_request_resend() { + const int16_t pn = command_port(); + #if HAS_MULTI_SERIAL + if (pn < 0) return; + PORT_REDIRECT(pn); // Reply to the serial port that sent the command + #endif + SERIAL_FLUSH(); + SERIAL_ECHOPGM(STR_RESEND); + SERIAL_ECHOLN(last_N[pn] + 1); + ok_to_send(); +} + +inline bool serial_data_available() { + return MYSERIAL0.available() || TERN0(HAS_MULTI_SERIAL, MYSERIAL1.available()); +} + +inline int read_serial(const uint8_t index) { + switch (index) { + case 0: return MYSERIAL0.read(); + #if HAS_MULTI_SERIAL + case 1: return MYSERIAL1.read(); + #endif + default: return -1; + } +} + +void GCodeQueue::gcode_line_error(PGM_P const err, const int8_t pn) { + PORT_REDIRECT(pn); // Reply to the serial port that sent the command + SERIAL_ERROR_START(); + serialprintPGM(err); + SERIAL_ECHOLN(last_N[pn]); + while (read_serial(pn) != -1); // Clear out the RX buffer + flush_and_request_resend(); + serial_count[pn] = 0; +} + +FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc + const char * const m29 = strstr_P(cmd, PSTR("M29")); + return m29 && !NUMERIC(m29[3]); +} + +#define PS_NORMAL 0 +#define PS_EOL 1 +#define PS_QUOTED 2 +#define PS_PAREN 3 +#define PS_ESC 4 + +inline void process_stream_char(const char c, uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind) { + + if (sis == PS_EOL) return; // EOL comment or overflow + + #if ENABLED(PAREN_COMMENTS) + else if (sis == PS_PAREN) { // Inline comment + if (c == ')') sis = PS_NORMAL; + return; + } + #endif + + else if (sis >= PS_ESC) // End escaped char + sis -= PS_ESC; + + else if (c == '\\') { // Start escaped char + sis += PS_ESC; + if (sis == PS_ESC) return; // Keep if quoting + } + + #if ENABLED(GCODE_QUOTED_STRINGS) + + else if (sis == PS_QUOTED) { + if (c == '"') sis = PS_NORMAL; // End quoted string + } + else if (c == '"') // Start quoted string + sis = PS_QUOTED; + + #endif + + else if (c == ';') { // Start end-of-line comment + sis = PS_EOL; + return; + } + + #if ENABLED(PAREN_COMMENTS) + else if (c == '(') { // Start inline comment + sis = PS_PAREN; + return; + } + #endif + + // Backspace erases previous characters + if (c == 0x08) { + if (ind) buff[--ind] = '\0'; + } + else { + buff[ind++] = c; + if (ind >= MAX_CMD_SIZE - 1) + sis = PS_EOL; // Skip the rest on overflow + } +} + +/** + * Handle a line being completed. For an empty line + * keep sensor readings going and watchdog alive. + */ +inline bool process_line_done(uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind) { + sis = PS_NORMAL; + buff[ind] = 0; + if (ind) { ind = 0; return false; } + thermalManager.manage_heater(); + return true; +} + +/** + * Get all commands waiting on the serial port and queue them. + * Exit when the buffer is full or when no more characters are + * left on the serial port. + */ +void GCodeQueue::get_serial_commands() { + static char serial_line_buffer[NUM_SERIAL][MAX_CMD_SIZE]; + + static uint8_t serial_input_state[NUM_SERIAL] = { PS_NORMAL }; + + #if ENABLED(BINARY_FILE_TRANSFER) + if (card.flag.binary_mode) { + /** + * For binary stream file transfer, use serial_line_buffer as the working + * receive buffer (which limits the packet size to MAX_CMD_SIZE). + * The receive buffer also limits the packet size for reliable transmission. + */ + binaryStream[card.transfer_port_index].receive(serial_line_buffer[card.transfer_port_index]); + return; + } + #endif + + // If the command buffer is empty for too long, + // send "wait" to indicate Marlin is still waiting. + #if NO_TIMEOUTS > 0 + static millis_t last_command_time = 0; + const millis_t ms = millis(); + if (length == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + SERIAL_ECHOLNPGM(STR_WAIT); + last_command_time = ms; + } + #endif + + /** + * Loop while serial characters are incoming and the queue is not full + */ + while (length < BUFSIZE && serial_data_available()) { + LOOP_L_N(i, NUM_SERIAL) { + + const int c = read_serial(i); + if (c < 0) continue; + + const char serial_char = c; + + if (ISEOL(serial_char)) { + + // Reset our state, continue if the line was empty + if (process_line_done(serial_input_state[i], serial_line_buffer[i], serial_count[i])) + continue; + + char* command = serial_line_buffer[i]; + + while (*command == ' ') command++; // Skip leading spaces + char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line + + if (npos) { + + bool M110 = strstr_P(command, PSTR("M110")) != nullptr; + + if (M110) { + char* n2pos = strchr(command + 4, 'N'); + if (n2pos) npos = n2pos; + } + + const long gcode_N = strtol(npos + 1, nullptr, 10); + + if (gcode_N != last_N[i] + 1 && !M110) + return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); + + char *apos = strrchr(command, '*'); + if (apos) { + uint8_t checksum = 0, count = uint8_t(apos - command); + while (count) checksum ^= command[--count]; + if (strtol(apos + 1, nullptr, 10) != checksum) + return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), i); + } + else + return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + + last_N[i] = gcode_N; + } + #if ENABLED(SDSUPPORT) + // Pronterface "M29" and "M29 " has no line number + else if (card.flag.saving && !is_M29(command)) + return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); + #endif + + // + // Movement commands give an alert when the machine is stopped + // + + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + switch (strtol(gpos + 1, nullptr, 10)) { + case 0: case 1: + #if ENABLED(ARC_SUPPORT) + case 2: case 3: + #endif + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: + #endif + PORT_REDIRECT(i); // Reply to the serial port that sent the command + SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } + } + } + + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (strcmp_P(command, PSTR("M108")) == 0) { + wait_for_heatup = false; + TERN_(HAS_LCD_MENU, wait_for_user = false); + } + if (strcmp_P(command, PSTR("M112")) == 0) kill(M112_KILL_STR, nullptr, true); + if (strcmp_P(command, PSTR("M410")) == 0) quickstop_stepper(); + #endif + + #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 + last_command_time = ms; + #endif + + // Add the command to the queue + _enqueue(serial_line_buffer[i], true + #if HAS_MULTI_SERIAL + , i + #endif + ); + } + else + process_stream_char(serial_char, serial_input_state[i], serial_line_buffer[i], serial_count[i]); + + } // for NUM_SERIAL + } // queue has space, serial has data +} + +#if ENABLED(SDSUPPORT) + + /** + * Get lines from the SD Card until the command buffer is full + * or until the end of the file is reached. Because this method + * always receives complete command-lines, they can go directly + * into the main command queue. + */ + inline void GCodeQueue::get_sdcard_commands() { + static uint8_t sd_input_state = PS_NORMAL; + + if (!IS_SD_PRINTING()) return; + + int sd_count = 0; + bool card_eof = card.eof(); + while (length < BUFSIZE && !card_eof) { + const int16_t n = card.get(); + card_eof = card.eof(); + if (n < 0 && !card_eof) { SERIAL_ERROR_MSG(STR_SD_ERR_READ); continue; } + + const char sd_char = (char)n; + const bool is_eol = ISEOL(sd_char); + if (is_eol || card_eof) { + + // Reset stream state, terminate the buffer, and commit a non-empty command + if (!is_eol && sd_count) ++sd_count; // End of file with no newline + if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) { + _commit_command(false); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.cmd_sdpos = card.getIndex(); // Prime for the NEXT _commit_command + #endif + } + + if (card_eof) card.fileHasFinished(); // Handle end of file reached + } + else + process_stream_char(sd_char, sd_input_state, command_buffer[index_w], sd_count); + + } + } + +#endif // SDSUPPORT + +/** + * Add to the circular command queue the next command from: + * - The command-injection queues (injected_commands_P, injected_commands) + * - The active serial input (usually USB) + * - The SD card file being actively printed + */ +void GCodeQueue::get_available_commands() { + + get_serial_commands(); + + TERN_(SDSUPPORT, get_sdcard_commands()); +} + +/** + * Get the next command in the queue, optionally log it to SD, then dispatch it + */ +void GCodeQueue::advance() { + + // Process immediate commands + if (process_injected_command_P() || process_injected_command()) return; + + // Return if the G-code buffer is empty + if (!length) return; + + #if ENABLED(SDSUPPORT) + + if (card.flag.saving) { + char* command = command_buffer[index_r]; + if (is_M29(command)) { + // M29 closes the file + card.closefile(); + SERIAL_ECHOLNPGM(STR_FILE_SAVED); + + #if !IS_AT90USB + #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 + + ok_to_send(); + } + else { + // Write the string from the read buffer to SD + card.write_command(command); + if (card.flag.logging) + gcode.process_next_command(); // The card is saving because it's logging + else + ok_to_send(); + } + } + else + gcode.process_next_command(); + + #else + + gcode.process_next_command(); + + #endif // SDSUPPORT + + // The queue may be reset by a command handler or by code invoked by idle() within a handler + --length; + if (++index_r >= BUFSIZE) index_r = 0; + +} diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h new file mode 100644 index 00000000..966af287 --- /dev/null +++ b/Marlin/src/gcode/queue.h @@ -0,0 +1,188 @@ +/** + * 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 + +/** + * queue.h - The G-code command queue, which holds commands before they + * go to the parser and dispatcher. + */ + +#include "../inc/MarlinConfig.h" + +class GCodeQueue { +public: + /** + * GCode line number handling. Hosts may include line numbers when sending + * commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ + + static long last_N[NUM_SERIAL]; + + /** + * GCode Command Queue + * A simple ring buffer of BUFSIZE command strings. + * + * Commands are copied into this buffer by the command injectors + * (immediate, serial, sd card) and they are processed sequentially by + * the main loop. The gcode.process_next_command method parses the next + * command and hands off execution to individual handler functions. + */ + static uint8_t length, // Count of commands in the queue + index_r; // Ring buffer read position + + static char command_buffer[BUFSIZE][MAX_CMD_SIZE]; + + /** + * The port that the command was received on + */ + #if HAS_MULTI_SERIAL + static int16_t port[BUFSIZE]; + #endif + + static int16_t command_port() { + return TERN0(HAS_MULTI_SERIAL, port[index_r]); + } + + GCodeQueue(); + + /** + * Clear the Marlin command queue + */ + static void clear(); + + /** + * Next Injected Command (PROGMEM) pointer. (nullptr == empty) + * Internal commands are enqueued ahead of serial / SD commands. + */ + static PGM_P injected_commands_P; + + /** + * Injected Commands (SRAM) + */ + static char injected_commands[64]; + + /** + * Enqueue command(s) to run from PROGMEM. Drained by process_injected_command_P(). + * Don't inject comments or use leading spaces! + * Aborts the current PROGMEM queue so only use for one or two commands. + */ + static inline void inject_P(PGM_P const pgcode) { injected_commands_P = pgcode; } + + /** + * Enqueue command(s) to run from SRAM. Drained by process_injected_command(). + * Aborts the current SRAM queue so only use for one or two commands. + */ + static inline void inject(char * const gcode) { + strncpy(injected_commands, gcode, sizeof(injected_commands) - 1); + } + + /** + * Enqueue and return only when commands are actually enqueued + */ + static void enqueue_one_now(const char* cmd); + + /** + * Attempt to enqueue a single G-code command + * and return 'true' if successful. + */ + static bool enqueue_one_P(PGM_P const pgcode); + + /** + * Enqueue from program memory and return only when commands are actually enqueued + */ + static void enqueue_now_P(PGM_P const cmd); + + /** + * Check whether there are any commands yet to be executed + */ + static bool has_commands_queued(); + + /** + * Get the next command in the queue, optionally log it to SD, then dispatch it + */ + static void advance(); + + /** + * Add to the circular command queue the next command from: + * - The command-injection queue (injected_commands_P) + * - The active serial input (usually USB) + * - The SD card file being actively printed + */ + static void get_available_commands(); + + /** + * Send an "ok" message to the host, indicating + * that a command was successfully processed. + * + * If ADVANCED_OK is enabled also include: + * N Line number of the command, if any + * P Planner space remaining + * B Block queue space remaining + */ + static void ok_to_send(); + + /** + * Clear the serial line and request a resend of + * the next expected line number. + */ + static void flush_and_request_resend(); + +private: + + static uint8_t index_w; // Ring buffer write position + + static void get_serial_commands(); + + #if ENABLED(SDSUPPORT) + static void get_sdcard_commands(); + #endif + + static void _commit_command(bool say_ok + #if HAS_MULTI_SERIAL + , int16_t p=-1 + #endif + ); + + static bool _enqueue(const char* cmd, bool say_ok=false + #if HAS_MULTI_SERIAL + , int16_t p=-1 + #endif + ); + + // Process the next "immediate" command (PROGMEM) + static bool process_injected_command_P(); + + // Process the next "immediate" command (SRAM) + static bool process_injected_command(); + + /** + * Enqueue with Serial Echo + * Return true on success + */ + static bool enqueue_one(const char* cmd); + + static void gcode_line_error(PGM_P const err, const int8_t pn); + +}; + +extern GCodeQueue queue; diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp new file mode 100644 index 00000000..562beee4 --- /dev/null +++ b/Marlin/src/gcode/scara/M360-M364.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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(MORGAN_SCARA) + +#include "../gcode.h" +#include "../../module/scara.h" +#include "../../module/motion.h" +#include "../../MarlinCore.h" // for IsRunning() + +inline bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { + if (IsRunning()) { + forward_kinematics_SCARA(delta_a, delta_b); + do_blocking_move_to_xy(cartes); + return true; + } + return false; +} + +/** + * M360: SCARA calibration: Move to cal-position ThetaA (0 deg calibration) + */ +bool GcodeSuite::M360() { + SERIAL_ECHOLNPGM(" Cal: Theta 0"); + return SCARA_move_to_cal(0, 120); +} + +/** + * M361: SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree) + */ +bool GcodeSuite::M361() { + SERIAL_ECHOLNPGM(" Cal: Theta 90"); + return SCARA_move_to_cal(90, 130); +} + +/** + * M362: SCARA calibration: Move to cal-position PsiA (0 deg calibration) + */ +bool GcodeSuite::M362() { + SERIAL_ECHOLNPGM(" Cal: Psi 0"); + return SCARA_move_to_cal(60, 180); +} + +/** + * M363: SCARA calibration: Move to cal-position PsiB (90 deg calibration - steps per degree) + */ +bool GcodeSuite::M363() { + SERIAL_ECHOLNPGM(" Cal: Psi 90"); + return SCARA_move_to_cal(50, 90); +} + +/** + * M364: SCARA calibration: Move to cal-position PsiC (90 deg to Theta calibration position) + */ +bool GcodeSuite::M364() { + SERIAL_ECHOLNPGM(" Cal: Theta-Psi 90"); + return SCARA_move_to_cal(45, 135); +} + +#endif // MORGAN_SCARA diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp new file mode 100644 index 00000000..b28429f6 --- /dev/null +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -0,0 +1,103 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../module/printcounter.h" + +#ifdef SD_FINISHED_RELEASECOMMAND + #include "../queue.h" +#endif + +#if EITHER(LCD_SET_PROGRESS_MANUALLY, SD_REPRINT_LAST_SELECTED_FILE) + #include "../../lcd/ultralcd.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../feature/powerloss.h" +#endif + +#if HAS_LEDS_OFF_FLAG + #include "../../MarlinCore.h" // for wait_for_user_response + #include "../../feature/leds/printer_event_leds.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "../../feature/host_actions.h" +#endif + +#ifndef PE_LEDS_COMPLETED_TIME + #define PE_LEDS_COMPLETED_TIME (30*60) +#endif + +/** + * M1001: Execute actions for SD print completion + */ +void GcodeSuite::M1001() { + + // Report total print time + const bool long_print = print_job_timer.duration() > 60; + if (long_print) gcode.process_subcommands_now_P(PSTR("M31")); + + // Stop the print job timer + gcode.process_subcommands_now_P(PSTR("M77")); + + // Set the progress bar "done" state + TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress_done()); + + // Purge the recovery file + TERN_(POWER_LOSS_RECOVERY, recovery.purge()); + + // Announce SD file completion + { + PORT_REDIRECT(SERIAL_BOTH); + SERIAL_ECHOLNPGM(STR_FILE_PRINTED); + } + + // Update the status LED color + #if HAS_LEDS_OFF_FLAG + if (long_print) { + printerEventLEDs.onPrintCompleted(); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_PRINT_DONE))); + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_PRINT_DONE), CONTINUE_STR)); + wait_for_user_response(1000UL * TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30)); + printerEventLEDs.onResumeAfterWait(); + } + #endif + + // Inject SD_FINISHED_RELEASECOMMAND, if any + #ifdef SD_FINISHED_RELEASECOMMAND + queue.inject_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + #endif + + // Re-select the last printed file in the UI + TERN_(SD_REPRINT_LAST_SELECTED_FILE, ui.reselect_last_file()); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp new file mode 100644 index 00000000..7ac4affd --- /dev/null +++ b/Marlin/src/gcode/sd/M20.cpp @@ -0,0 +1,43 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M20: List SD card to serial output + */ +void GcodeSuite::M20() { + 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/gcode/sd/M21_M22.cpp b/Marlin/src/gcode/sd/M21_M22.cpp new file mode 100644 index 00000000..a618bc0b --- /dev/null +++ b/Marlin/src/gcode/sd/M21_M22.cpp @@ -0,0 +1,44 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M21: Init SD Card + */ +void GcodeSuite::M21() { card.mount(); } + +/** + * M22: Release SD Card + */ +void GcodeSuite::M22() { + + if (!IS_SD_PRINTING()) card.release(); + +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M23.cpp b/Marlin/src/gcode/sd/M23.cpp new file mode 100644 index 00000000..b88f66b5 --- /dev/null +++ b/Marlin/src/gcode/sd/M23.cpp @@ -0,0 +1,44 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../lcd/ultralcd.h" + +/** + * M23: Open a file + * + * The path is relative to the root directory + */ +void GcodeSuite::M23() { + // Simplify3D includes the size, so zero out all spaces (#7227) + for (char *fn = parser.string_arg; *fn; ++fn) if (*fn == ' ') *fn = '\0'; + card.openFileRead(parser.string_arg); + + TERN_(LCD_SET_PROGRESS_MANUALLY, ui.set_progress(0)); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp new file mode 100644 index 00000000..bdb37f60 --- /dev/null +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -0,0 +1,115 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../module/printcounter.h" +#include "../../lcd/ultralcd.h" + +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../feature/pause.h" +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "../../feature/host_actions.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../feature/powerloss.h" +#endif + +#include "../../MarlinCore.h" // for startOrResumeJob + +/** + * M24: Start or Resume SD Print + */ +void GcodeSuite::M24() { + + #if ENABLED(POWER_LOSS_RECOVERY) + if (parser.seenval('S')) card.setIndex(parser.value_long()); + if (parser.seenval('T')) print_job_timer.resume(parser.value_long()); + #endif + + #if ENABLED(PARK_HEAD_ON_PAUSE) + if (did_pause_print) { + resume_print(); // will call print_job_timer.start() + return; + } + #endif + + if (card.isFileOpen()) { + card.startFileprint(); // SD card will now be read for commands + startOrResumeJob(); // Start (or resume) the print job timer + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + } + + #if ENABLED(HOST_ACTION_COMMANDS) + #ifdef ACTION_ON_RESUME + host_action_resume(); + #endif + TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("Resuming SD"), DISMISS_STR)); + #endif + + ui.reset_status(); +} + +/** + * M25: Pause SD Print + */ +void GcodeSuite::M25() { + + #if ENABLED(PARK_HEAD_ON_PAUSE) + + M125(); + + #else + + // Set initial pause flag to prevent more commands from landing in the queue while we try to pause + #if ENABLED(SDSUPPORT) + if (IS_SD_PRINTING()) card.pauseSDPrint(); + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + if (recovery.enabled) recovery.save(true); + #endif + + print_job_timer.pause(); + + #if DISABLED(DWIN_CREALITY_LCD) + ui.reset_status(); + #endif + + #if ENABLED(HOST_ACTION_COMMANDS) + TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("Pause SD"), PSTR("Resume"))); + #ifdef ACTION_ON_PAUSE + host_action_pause(); + #endif + #endif + + #endif +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M26.cpp b/Marlin/src/gcode/sd/M26.cpp new file mode 100644 index 00000000..e0557bfa --- /dev/null +++ b/Marlin/src/gcode/sd/M26.cpp @@ -0,0 +1,38 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M26: Set SD Card file index + */ +void GcodeSuite::M26() { + if (card.isMounted() && parser.seenval('S')) + card.setIndex(parser.value_long()); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M27.cpp b/Marlin/src/gcode/sd/M27.cpp new file mode 100644 index 00000000..8592b8af --- /dev/null +++ b/Marlin/src/gcode/sd/M27.cpp @@ -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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M27: Get SD Card status + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. + */ +void GcodeSuite::M27() { + if (parser.seen('C')) { + SERIAL_ECHOPGM("Current file: "); + card.printFilename(); + } + + #if ENABLED(AUTO_REPORT_SD_STATUS) + else if (parser.seenval('S')) + card.set_auto_report_interval(parser.value_byte()); + #endif + + else + card.report_status(); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp new file mode 100644 index 00000000..6f3f2450 --- /dev/null +++ b/Marlin/src/gcode/sd/M28_M29.cpp @@ -0,0 +1,72 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +#if HAS_MULTI_SERIAL + #include "../queue.h" +#endif + +/** + * M28: Start SD Write + */ +void GcodeSuite::M28() { + + #if ENABLED(BINARY_FILE_TRANSFER) + + bool binary_mode = false; + char *p = parser.string_arg; + if (p[0] == 'B' && NUMERIC(p[1])) { + binary_mode = p[1] > '0'; + p += 2; + while (*p == ' ') ++p; + } + + // Binary transfer mode + if ((card.flag.binary_mode = binary_mode)) { + SERIAL_ECHO_MSG("Switching to Binary Protocol"); + TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.port[queue.index_r]); + } + else + card.openFileWrite(p); + + #else + + card.openFileWrite(parser.string_arg); + + #endif +} + +/** + * M29: Stop SD Write + * (Processed in write-to-file routine) + */ +void GcodeSuite::M29() { + card.flag.saving = false; +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M30.cpp b/Marlin/src/gcode/sd/M30.cpp new file mode 100644 index 00000000..b95a895f --- /dev/null +++ b/Marlin/src/gcode/sd/M30.cpp @@ -0,0 +1,40 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M30 : Delete SD Card file + */ +void GcodeSuite::M30() { + if (card.isMounted()) { + card.closefile(); + card.removeFile(parser.string_arg); + } +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M32.cpp b/Marlin/src/gcode/sd/M32.cpp new file mode 100644 index 00000000..55ec6ea4 --- /dev/null +++ b/Marlin/src/gcode/sd/M32.cpp @@ -0,0 +1,59 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" +#include "../../module/planner.h" // for synchronize() + +#include "../../MarlinCore.h" // for startOrResumeJob + +/** + * M32: Select file and start SD Print + * + * Examples: + * + * M32 !PATH/TO/FILE.GCO# ; Start FILE.GCO + * M32 P !PATH/TO/FILE.GCO# ; Start FILE.GCO as a procedure + * M32 S60 !PATH/TO/FILE.GCO# ; Start FILE.GCO at byte 60 + */ +void GcodeSuite::M32() { + if (IS_SD_PRINTING()) planner.synchronize(); + + if (card.isMounted()) { + const uint8_t call_procedure = parser.boolval('P'); + + card.openFileRead(parser.string_arg, call_procedure); + + if (parser.seenval('S')) card.setIndex(parser.value_long()); + + card.startFileprint(); + + // Procedure calls count as normal print time. + if (!call_procedure) startOrResumeJob(); + } +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M33.cpp b/Marlin/src/gcode/sd/M33.cpp new file mode 100644 index 00000000..b611c8bc --- /dev/null +++ b/Marlin/src/gcode/sd/M33.cpp @@ -0,0 +1,48 @@ +/** + * 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(LONG_FILENAME_HOST_SUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M33: Get the long full path of a file or folder + * + * Parameters: + * Case-insensitive DOS-style path to a file or folder + * + * Example: + * M33 miscel~1/armchair/armcha~1.gco + * + * Output: + * /Miscellaneous/Armchair/Armchair.gcode + */ +void GcodeSuite::M33() { + + card.printLongPath(parser.string_arg); + +} + +#endif // LONG_FILENAME_HOST_SUPPORT diff --git a/Marlin/src/gcode/sd/M34.cpp b/Marlin/src/gcode/sd/M34.cpp new file mode 100644 index 00000000..2dd7dc58 --- /dev/null +++ b/Marlin/src/gcode/sd/M34.cpp @@ -0,0 +1,42 @@ +/** + * 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 BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M34: Set SD Card Sorting Options + */ +void GcodeSuite::M34() { + if (parser.seen('S')) card.setSortOn(parser.value_bool()); + if (parser.seenval('F')) { + const int v = parser.value_long(); + card.setSortFolders(v < 0 ? -1 : v > 0 ? 1 : 0); + } + //if (parser.seen('R')) card.setSortReverse(parser.value_bool()); +} + +#endif // SDCARD_SORT_ALPHA && SDSORT_GCODE diff --git a/Marlin/src/gcode/sd/M524.cpp b/Marlin/src/gcode/sd/M524.cpp new file mode 100644 index 00000000..089d2e2f --- /dev/null +++ b/Marlin/src/gcode/sd/M524.cpp @@ -0,0 +1,42 @@ +/** + * 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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M524: Abort the current SD print job (started with M24) + */ +void GcodeSuite::M524() { + + if (IS_SD_PRINTING()) + card.flag.abort_sd_printing = true; + else if (card.isMounted()) + card.closefile(); + +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/sd/M928.cpp b/Marlin/src/gcode/sd/M928.cpp new file mode 100644 index 00000000..03a7877a --- /dev/null +++ b/Marlin/src/gcode/sd/M928.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(SDSUPPORT) + +#include "../gcode.h" +#include "../../sd/cardreader.h" + +/** + * M928: Start SD Logging + */ +void GcodeSuite::M928() { + + card.openLogFile(parser.string_arg); + +} + +#endif // SDSUPPORT diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp new file mode 100644 index 00000000..b39108bb --- /dev/null +++ b/Marlin/src/gcode/stats/M31.cpp @@ -0,0 +1,40 @@ +/** + * 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 "../gcode.h" +#include "../../core/serial.h" +#include "../../module/printcounter.h" +#include "../../libs/duration_t.h" +#include "../../lcd/ultralcd.h" + +/** + * M31: Get the time since the start of SD Print (or last M109) + */ +void GcodeSuite::M31() { + char buffer[21]; + duration_t(print_job_timer.duration()).toString(buffer); + + ui.set_status(buffer); + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Print time: ", buffer); +} diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp new file mode 100644 index 00000000..908e6e5a --- /dev/null +++ b/Marlin/src/gcode/stats/M75-M78.cpp @@ -0,0 +1,73 @@ +/** + * 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 "../gcode.h" +#include "../../module/printcounter.h" +#include "../../lcd/ultralcd.h" + +#include "../../MarlinCore.h" // for startOrResumeJob + +/** + * M75: Start print timer + */ +void GcodeSuite::M75() { + startOrResumeJob(); +} + +/** + * M76: Pause print timer + */ +void GcodeSuite::M76() { + print_job_timer.pause(); +} + +/** + * M77: Stop print timer + */ +void GcodeSuite::M77() { + print_job_timer.stop(); +} + +#if ENABLED(PRINTCOUNTER) + +/** + * M78: Show print statistics + */ +void GcodeSuite::M78() { + if (parser.intval('S') == 78) { // "M78 S78" will reset the statistics + print_job_timer.initStats(); + ui.reset_status(); + return; + } + + #if HAS_SERVICE_INTERVALS + if (parser.seenval('R')) { + print_job_timer.resetServiceInterval(parser.value_int()); + ui.reset_status(); + return; + } + #endif + + print_job_timer.showStats(); +} + +#endif // PRINTCOUNTER diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp new file mode 100644 index 00000000..a289983b --- /dev/null +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -0,0 +1,200 @@ +/** + * 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 . + * + */ + +/** + * gcode/temp/M104_M109.cpp + * + * Hotend target temperature control + */ + +#include "../../inc/MarlinConfigPre.h" + +#if EXTRUDERS + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../lcd/ultralcd.h" + +#include "../../MarlinCore.h" // for startOrResumeJob, etc. + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" + #if ENABLED(CANCEL_OBJECTS) + #include "../../feature/cancel_object.h" + #endif +#endif + +#if ENABLED(SINGLENOZZLE) + #include "../../module/tool_change.h" +#endif + +/** + * 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() { + + if (DEBUGGING(DRYRUN)) return; + + #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 + constexpr int8_t target_extruder = 0; + #else + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + #endif + + 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; + #endif + thermalManager.setTargetHotend(temp, target_extruder); + + #if ENABLED(DUAL_X_CARRIAGE) + if (dxc_is_duplicating() && target_extruder == 0) + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); + #endif + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Stop the timer at the end of print. Start is managed by 'heat and wait' M109. + * Hotends use EXTRUDE_MINTEMP / 2 to allow nozzles to be put into hot standby + * mode, for instance in a dual extruder setup, without affecting the running + * print timer. + */ + thermalManager.check_timer_autostart(false, true); + #endif + } + + TERN_(AUTOTEMP, planner.autotemp_M104_M109()); +} + +/** + * 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 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() { + + if (DEBUGGING(DRYRUN)) return; + + #if ENABLED(MIXING_EXTRUDER) && MIXING_VIRTUAL_TOOLS > 1 + constexpr int8_t target_extruder = 0; + #else + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + #endif + + 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; + #endif + thermalManager.setTargetHotend(temp, target_extruder); + + #if ENABLED(DUAL_X_CARRIAGE) + if (dxc_is_duplicating() && target_extruder == 0) + thermalManager.setTargetHotend(temp ? temp + duplicate_extruder_temp_offset : 0, 1); + #endif + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Use half EXTRUDE_MINTEMP to allow nozzles to be put into hot + * standby mode, (e.g., in a dual extruder setup) without affecting + * the running print timer. + */ + thermalManager.check_timer_autostart(true, true); + #endif + + #if HAS_DISPLAY + if (thermalManager.isHeatingHotend(target_extruder) || !no_wait_for_cooling) + thermalManager.set_heating_message(target_extruder); + #endif + } + + TERN_(AUTOTEMP, planner.autotemp_M104_M109()); + + if (got_temp) + (void)thermalManager.wait_for_hotend(target_extruder, no_wait_for_cooling); +} + +#endif // EXTRUDERS diff --git a/Marlin/src/gcode/temp/M105.cpp b/Marlin/src/gcode/temp/M105.cpp new file mode 100644 index 00000000..eefc3ae9 --- /dev/null +++ b/Marlin/src/gcode/temp/M105.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 . + * + */ + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M105: Read hot end and bed temperature + */ +void GcodeSuite::M105() { + + const int8_t target_extruder = get_target_extruder_from_command(); + if (target_extruder < 0) return; + + SERIAL_ECHOPGM(STR_OK); + + #if HAS_TEMP_SENSOR + + thermalManager.print_heater_states(target_extruder + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + , parser.boolval('R') + #endif + ); + + SERIAL_EOL(); + + #else + + SERIAL_ECHOLNPGM(" T:0"); // Some hosts send M105 to test the serial connection + + #endif +} diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp new file mode 100644 index 00000000..17ff8c3c --- /dev/null +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -0,0 +1,95 @@ +/** + * 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_FAN + +#include "../gcode.h" +#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 +#else + #define _ALT_P _MIN(active_extruder, FAN_COUNT - 1) + #define _CNT_P FAN_COUNT +#endif + +/** + * 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 + * + * With EXTRA_FAN_SPEED enabled: + * + * T Restore/Use/Set Temporary Speed: + * 1 = Restore previous speed after T2 + * 2 = Use temporary speed set with T3-255 + * 3-255 = Set the speed for use with T2 + */ +void GcodeSuite::M106() { + const uint8_t pfan = parser.byteval('P', _ALT_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(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 + + if (!got_preset && parser.seenval('S')) + speed = parser.value_ushort(); + + // Set speed, with constraint + thermalManager.set_fan_speed(pfan, speed); + } +} + +/** + * M107: Fan Off + */ +void GcodeSuite::M107() { + const uint8_t p = parser.byteval('P', _ALT_P); + thermalManager.set_fan_speed(p, 0); +} + +#endif // HAS_FAN diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp new file mode 100644 index 00000000..9438b9e0 --- /dev/null +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -0,0 +1,138 @@ +/** + * 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 . + * + */ + +/** + * gcode/temp/M140_M190.cpp + * + * Bed target temperature control + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_HEATED_BED + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../module/motion.h" +#include "../../lcd/ultralcd.h" + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../../feature/leds/leds.h" +#endif + +#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob + +/** + * 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; + + 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) + /** + * Stop the timer at the end of print. Hotend, bed target, and chamber + * temperatures need to be set below mintemp. Order of M140, M104, and M141 + * at the end of the print does not matter. + */ + thermalManager.check_timer_autostart(false, true); + #endif + } +} + +/** + * 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. + * + * 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; + + 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()); + } + + 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)); + + thermalManager.wait_for_bed(no_wait_for_cooling); +} + +#endif // HAS_HEATED_BED diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp new file mode 100644 index 00000000..41a79825 --- /dev/null +++ b/Marlin/src/gcode/temp/M141_M191.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 . + * + */ + +/** + * gcode/temp/M141_M191.cpp + * + * Chamber target temperature control + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_HEATED_CHAMBER + +#include "../gcode.h" +#include "../../module/temperature.h" + +#include "../../module/motion.h" +#include "../../lcd/ultralcd.h" + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "../../module/printcounter.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../../feature/leds/leds.h" +#endif + +#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob + +/** + * M141: Set chamber temperature + */ +void GcodeSuite::M141() { + if (DEBUGGING(DRYRUN)) return; + if (parser.seenval('S')) { + thermalManager.setTargetChamber(parser.value_celsius()); + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Stop the timer at the end of print. Hotend, bed target, and chamber + * temperatures need to be set below mintemp. Order of M140, M104, and M141 + * at the end of the print does not matter. + */ + thermalManager.check_timer_autostart(false, true); + #endif + } +} + +/** + * M191: Sxxx Wait for chamber current temp to reach target temp. Waits only when heating + * Rxxx Wait for chamber current temp to reach target temp. Waits when heating and cooling + */ +void GcodeSuite::M191() { + if (DEBUGGING(DRYRUN)) return; + + const bool no_wait_for_cooling = parser.seenval('S'); + if (no_wait_for_cooling || parser.seenval('R')) { + thermalManager.setTargetChamber(parser.value_celsius()); + TERN_(PRINTJOB_TIMER_AUTOSTART, thermalManager.check_timer_autostart(true, false)); + } + else return; + + const bool is_heating = thermalManager.isHeatingChamber(); + if (is_heating || !no_wait_for_cooling) { + ui.set_status_P(is_heating ? GET_TEXT(MSG_CHAMBER_HEATING) : GET_TEXT(MSG_CHAMBER_COOLING)); + thermalManager.wait_for_chamber(false); + } +} + +#endif // HAS_HEATED_CHAMBER diff --git a/Marlin/src/gcode/temp/M155.cpp b/Marlin/src/gcode/temp/M155.cpp new file mode 100644 index 00000000..30129a0e --- /dev/null +++ b/Marlin/src/gcode/temp/M155.cpp @@ -0,0 +1,40 @@ +/** + * 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 BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M155: Set temperature auto-report interval. M155 S + */ +void GcodeSuite::M155() { + + if (parser.seenval('S')) + thermalManager.set_auto_report_interval(parser.value_byte()); + +} + +#endif // AUTO_REPORT_TEMPERATURES && HAS_TEMP_SENSOR diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp new file mode 100644 index 00000000..ccce09b4 --- /dev/null +++ b/Marlin/src/gcode/temp/M303.cpp @@ -0,0 +1,85 @@ +/** + * 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_PID_HEATING + +#include "../gcode.h" +#include "../../lcd/ultralcd.h" +#include "../../module/temperature.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +/** + * M303: PID relay autotune + * + * S Set the target temperature. (Default: 150C / 70C) + * E Extruder number to tune, or -1 for the bed. (Default: E0) + * C Number of times to repeat the procedure. (Minimum: 3, Default: 5) + * U Flag to apply the result to the current PID values + * + * With PID_DEBUG: + * D Toggle PID debugging and EXIT without further action. + */ + +#if ENABLED(PID_DEBUG) + bool pid_debug_flag = 0; +#endif + +void GcodeSuite::M303() { + + #if ENABLED(PID_DEBUG) + if (parser.seen('D')) { + pid_debug_flag = !pid_debug_flag; + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("PID Debug "); + serialprintln_onoff(pid_debug_flag); + return; + } + #endif + + #define SI TERN(PIDTEMPBED, H_BED, H_E0) + #define EI TERN(PIDTEMP, HOTENDS - 1, H_BED) + const heater_id_t e = (heater_id_t)parser.intval('E'); + if (!WITHIN(e, SI, EI)) { + SERIAL_ECHOLNPGM(STR_PID_BAD_EXTRUDER_NUM); + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); + return; + } + + const int c = parser.intval('C', 5); + const bool u = parser.boolval('U'); + 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); + #endif + + ui.set_status(GET_TEXT(MSG_PID_AUTOTUNE)); + thermalManager.PID_autotune(temp, e, c, u); + ui.reset_status(); +} + +#endif // HAS_PID_HEATING diff --git a/Marlin/src/gcode/units/G20_G21.cpp b/Marlin/src/gcode/units/G20_G21.cpp new file mode 100644 index 00000000..6f1d5adb --- /dev/null +++ b/Marlin/src/gcode/units/G20_G21.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(INCH_MODE_SUPPORT) + +#include "../gcode.h" + +/** + * G20: Set input mode to inches + */ +void GcodeSuite::G20() { parser.set_input_linear_units(LINEARUNIT_INCH); } + +/** + * G21: Set input mode to millimeters + */ +void GcodeSuite::G21() { parser.set_input_linear_units(LINEARUNIT_MM); } + +#endif // INCH_MODE_SUPPORT diff --git a/Marlin/src/gcode/units/M149.cpp b/Marlin/src/gcode/units/M149.cpp new file mode 100644 index 00000000..5d9f8320 --- /dev/null +++ b/Marlin/src/gcode/units/M149.cpp @@ -0,0 +1,38 @@ +/** + * 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(TEMPERATURE_UNITS_SUPPORT) + +#include "../gcode.h" + +/** + * M149: Set temperature units + */ +void GcodeSuite::M149() { + if (parser.seenval('C')) parser.set_input_temp_units(TEMPUNIT_C); + else if (parser.seenval('K')) parser.set_input_temp_units(TEMPUNIT_K); + else if (parser.seenval('F')) parser.set_input_temp_units(TEMPUNIT_F); +} + +#endif // TEMPERATURE_UNITS_SUPPORT diff --git a/Marlin/src/gcode/units/M82_M83.cpp b/Marlin/src/gcode/units/M82_M83.cpp new file mode 100644 index 00000000..d93f0ea5 --- /dev/null +++ b/Marlin/src/gcode/units/M82_M83.cpp @@ -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 . + * + */ + +#include "../gcode.h" + +/** + * M82: Set E codes absolute (default) + */ +void GcodeSuite::M82() { set_e_absolute(); } + +/** + * M83: Set E codes relative while in Absolute Coordinates (G90) mode + */ +void GcodeSuite::M83() { set_e_relative(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h new file mode 100644 index 00000000..45921f7b --- /dev/null +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -0,0 +1,948 @@ +/** + * 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 + +/** + * Conditionals_LCD.h + * 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 +#elif ENABLED(DELTA) + #define IS_KINEMATIC 1 +#else + #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 + +#elif ENABLED(CARTESIO_UI) + + #define DOGLCD + #define IS_ULTIPANEL 1 + +#elif EITHER(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) + + #define IS_DWIN_MARLINUI 1 + #define IS_ULTIPANEL 1 + +#elif ENABLED(ZONESTAR_LCD) + + #define ADC_KEYPAD + #define IS_RRW_KEYPAD + #define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 + #define ADC_KEY_NUM 8 + #define IS_ULTIPANEL 1 + + // This helps to implement ADC_KEYPAD menus + #define REVERSE_MENU_DIRECTION + #define ENCODER_PULSES_PER_STEP 1 + #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 1 + #define ENCODER_PULSES_PER_STEP 2 + +#elif EITHER(ANET_FULL_GRAPHICS_LCD, BQ_LCD_SMART_CONTROLLER) + + #define IS_RRD_FG_SC + +#elif ANY(miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864) + + #define DOGLCD + #define IS_ULTIPANEL 1 + + #if ENABLED(miniVIKI) + #define U8GLIB_ST7565_64128N + #elif ENABLED(VIKI2) + #define U8GLIB_ST7565_64128N + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define U8GLIB_LM6059_AF + #elif ENABLED(AZSMZ_12864) + #define U8GLIB_ST7565_64128N + #endif + +#elif ENABLED(OLED_PANEL_TINYBOY2) + + #define IS_U8GLIB_SSD1306 + #define IS_ULTIPANEL 1 + +#elif ENABLED(RA_CONTROL_PANEL) + + #define LCD_I2C_TYPE_PCA8574 + #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander + #define IS_ULTIPANEL 1 + +#elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define DOGLCD + #define U8GLIB_ST7920 + #define IS_ULTIPANEL 1 + +#elif ENABLED(CR10_STOCKDISPLAY) + + #define IS_RRD_FG_SC + #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) + + #define IS_RRD_SC + #define U8GLIB_SH1106 + +#elif ENABLED(MKS_12864OLED_SSD1306) + + #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 + #define DOGLCD + #define IS_ULTIPANEL 1 + #define LED_COLORS_REDUCE_GREEN + #if ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) + #define LED_BACKLIGHT_TIMEOUT 10000 + #endif + + // Require LED backlighting enabled + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #define RGB_LED + #elif ENABLED(FYSETC_MINI_12864_2_1) + #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 + //#define NEOPIXEL_STARTUP_TEST + #endif + +#elif ENABLED(ULTI_CONTROLLER) + + #define IS_ULTIPANEL 1 + #define U8GLIB_SSD1309 + #define LCD_RESET_PIN LCD_PINS_D6 // This controller need a reset pin + #define ENCODER_PULSES_PER_STEP 2 + #define ENCODER_STEPS_PER_MENU_ITEM 2 + +#elif ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) + + #define IS_RRD_SC + #define LCD_WIDTH 16 + #define LCD_HEIGHT 2 + +#elif EITHER(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) + + #define IS_TFTGLCD_PANEL 1 + #define IS_ULTIPANEL 1 // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD + + #if ENABLED(SDSUPPORT) && DISABLED(LCD_PROGRESS_BAR) + #define LCD_PROGRESS_BAR + #endif + #if ENABLED(TFTGLCD_PANEL_I2C) + #define LCD_I2C_ADDRESS 0x27 // Must be equal to panel's I2C slave addres + #endif + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD, used for both I2C and SPI buses (LiquidTWI2 not required) + #define STD_ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + #define LCD_WIDTH 20 // 20 or 24 chars in line + #define LCD_HEIGHT 10 // Character lines + #define LCD_CONTRAST_MIN 127 + #define LCD_CONTRAST_MAX 255 + #define DEFAULT_LCD_CONTRAST 250 + #define CONVERT_TO_EXT_ASCII // Use extended 128-255 symbols from ASCII table. + // At this time present conversion only for cyrillic - bg, ru and uk languages. + // First 7 ASCII symbols in panel font must be replaced with Marlin's special symbols. +#endif + +#if ENABLED(IS_RRD_FG_SC) + #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +#endif + +#if EITHER(MAKRPANEL, MINIPANEL) + #define IS_ULTIPANEL 1 + #define DOGLCD + #if ENABLED(MAKRPANEL) + #define U8GLIB_ST7565_64128N + #endif +#endif + +#if ENABLED(IS_U8GLIB_SSD1306) + #define U8GLIB_SSD1306 +#endif + +#if ENABLED(OVERLORD_OLED) + #define IS_ULTIPANEL 1 + #define U8GLIB_SH1106 + /** + * PCA9632 for buzzer and LEDs via i2c + * No auto-inc, red and green leds switched, buzzer + */ + #define PCA9632 + #define PCA9632_NO_AUTO_INC + #define PCA9632_GRN 0x00 + #define PCA9632_RED 0x02 + #define PCA9632_BUZZER + #define PCA9632_BUZZER_DATA { 0x09, 0x02 } + + #define ENCODER_PULSES_PER_STEP 1 // Overlord uses buttons + #define ENCODER_STEPS_PER_MENU_ITEM 1 +#endif + +// 128x64 I2C OLED LCDs - SSD1306/SSD1309/SH1106 +#if ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) + #define HAS_U8GLIB_I2C_OLED 1 +#endif +#if HAS_U8GLIB_I2C_OLED + #define IS_ULTRA_LCD + #define DOGLCD +#endif + +// ST7920-based graphical displays +#if ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, LCD_FOR_MELZI, SILVER_GATE_GLCD_CONTROLLER) + #define DOGLCD + #define U8GLIB_ST7920 + #define IS_RRD_SC +#endif + +// RepRapDiscount LCD or Graphical LCD with rotary click encoder +#if ENABLED(IS_RRD_SC) + #define REPRAP_DISCOUNT_SMART_CONTROLLER +#endif + +/** + * SPI Ultipanels + */ + +// Basic Ultipanel-like displays +#if ANY(ULTIMAKERCONTROLLER, REPRAP_DISCOUNT_SMART_CONTROLLER, G3D_PANEL, RIGIDBOT_PANEL, PANEL_ONE, U8GLIB_SH1106) + #define IS_ULTIPANEL 1 +#endif + +// Einstart OLED has Cardinal nav via pins defined in pins_EINSTART-S.h +#if ENABLED(U8GLIB_SH1106_EINSTART) + #define DOGLCD + #define IS_ULTIPANEL 1 +#endif + +// Compatibility +#if ENABLED(FSMC_GRAPHICAL_TFT) + #define TFT_CLASSIC_UI + #define TFT_INTERFACE_FSMC + #define TFT_GENERIC +#elif ENABLED(SPI_GRAPHICAL_TFT) + #define TFT_CLASSIC_UI + #define TFT_INTERFACE_SPI + #define TFT_GENERIC +#elif EITHER(TFT_320x240, TFT_480x320) + #define TFT_COLOR_UI + #define TFT_INTERFACE_FSMC + #define TFT_GENERIC +#elif EITHER(TFT_320x240_SPI, TFT_480x320_SPI) + #define TFT_COLOR_UI + #define TFT_INTERFACE_SPI + #define TFT_GENERIC +#elif ENABLED(TFT_LVGL_UI_FSMC) + #define TFT_LVGL_UI + #define TFT_INTERFACE_FSMC + #define TFT_GENERIC +#elif ENABLED(TFT_LVGL_UI_SPI) + #define TFT_LVGL_UI + #define TFT_INTERFACE_SPI + #define TFT_GENERIC +#endif + +// FSMC/SPI TFT Panels (LVGL) +#if ENABLED(TFT_LVGL_UI) + #define HAS_TFT_LVGL_UI 1 +#endif + +// FSMC/SPI TFT Panels +#if ENABLED(TFT_CLASSIC_UI) + #define TFT_SCALED_DOGLCD 1 +#endif + +#if TFT_SCALED_DOGLCD + #define DOGLCD + #define IS_ULTIPANEL 1 + #define DELAYED_BACKLIGHT_INIT +#elif ENABLED(TFT_LVGL_UI) + #define DELAYED_BACKLIGHT_INIT +#endif + +// Color UI +#if ENABLED(TFT_COLOR_UI) + #define HAS_GRAPHICAL_TFT 1 + #define IS_ULTIPANEL 1 +#endif + +/** + * I2C Panels + */ + +#if EITHER(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) + + #define LCD_I2C_TYPE_PCF8575 + #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander + + #if ENABLED(LCD_SAINSMART_I2C_2004) + #define LCD_WIDTH 20 + #define LCD_HEIGHT 4 + #endif + +#elif ENABLED(LCD_I2C_PANELOLU2) + + // PANELOLU2 LCD with status LEDs, separate encoder and click inputs + + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (optional) + #define IS_ULTIPANEL 1 + +#elif ENABLED(LCD_I2C_VIKI) + + /** + * Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs + * + * This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) + * Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. + * Note: The pause/stop/resume LCD button pin should be connected to the Arduino + * BTN_ENC pin (or set BTN_ENC to -1 if not used) + */ + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER // Enable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) + #define IS_ULTIPANEL 1 + + #define ENCODER_FEEDRATE_DEADZONE 4 + + #define STD_ENCODER_PULSES_PER_STEP 1 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 2 + +#elif ENABLED(G3D_PANEL) + + #define STD_ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + +#elif ANY(REPRAP_DISCOUNT_SMART_CONTROLLER, miniVIKI, VIKI2, ELB_FULL_GRAPHIC_CONTROLLER, AZSMZ_12864, OLED_PANEL_TINYBOY2, BQ_LCD_SMART_CONTROLLER, LCD_I2C_PANELOLU2) + + #define STD_ENCODER_PULSES_PER_STEP 4 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + +#endif + +#ifndef STD_ENCODER_PULSES_PER_STEP + #if ENABLED(TOUCH_SCREEN) + #define STD_ENCODER_PULSES_PER_STEP 2 + #else + #define STD_ENCODER_PULSES_PER_STEP 5 + #endif +#endif +#ifndef STD_ENCODER_STEPS_PER_MENU_ITEM + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 +#endif +#ifndef ENCODER_PULSES_PER_STEP + #define ENCODER_PULSES_PER_STEP STD_ENCODER_PULSES_PER_STEP +#endif +#ifndef ENCODER_STEPS_PER_MENU_ITEM + #define ENCODER_STEPS_PER_MENU_ITEM STD_ENCODER_STEPS_PER_MENU_ITEM +#endif +#ifndef ENCODER_FEEDRATE_DEADZONE + #define ENCODER_FEEDRATE_DEADZONE 6 +#endif + +// Shift register panels +// --------------------- +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +#if ENABLED(FF_INTERFACEBOARD) + #define SR_LCD_3W_NL // Non latching 3 wire shift register + #define IS_ULTIPANEL 1 +#elif ENABLED(SAV_3DLCD) + #define SR_LCD_2W_NL // Non latching 2 wire shift register + #define IS_ULTIPANEL 1 +#endif + +#if ENABLED(IS_ULTIPANEL) + #define ULTIPANEL +#endif +#if ENABLED(ULTIPANEL) + #define IS_ULTRA_LCD + #define NEWPANEL +#endif +#if ENABLED(IS_ULTRA_LCD) + #define ULTRA_LCD +#endif + +#if ENABLED(IS_RRW_KEYPAD) + #define REPRAPWORLD_KEYPAD +#endif + +// Keypad needs a move step +#if ENABLED(REPRAPWORLD_KEYPAD) + #define NEWPANEL + #ifndef REPRAPWORLD_KEYPAD_MOVE_STEP + #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 + #endif +#endif + +// Aliases for LCD features +#if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) + #define HAS_DGUS_LCD 1 +#endif + +// Extensible UI serial touch screens. (See src/lcd/extui) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #define IS_EXTUI + #define EXTENSIBLE_UI +#endif + +// Aliases for LCD features +#if EITHER(ULTRA_LCD, EXTENSIBLE_UI) + #define HAS_DISPLAY 1 +#endif + +#if ENABLED(ULTRA_LCD) + #define HAS_WIRED_LCD 1 + #if ENABLED(DOGLCD) + #define HAS_MARLINUI_U8GLIB 1 + #elif IS_TFTGLCD_PANEL + // Neither DOGM nor HD44780. Fully customized interface. + #elif DISABLED(HAS_GRAPHICAL_TFT) + #define HAS_MARLINUI_HD44780 1 + #endif +#endif + +#if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) + #define HAS_LCD_MENU 1 +#endif +#if ENABLED(ADC_KEYPAD) + #define HAS_ADC_BUTTONS 1 +#endif + +#if HAS_MARLINUI_U8GLIB + #ifndef LCD_PIXEL_WIDTH + #define LCD_PIXEL_WIDTH 128 + #endif + #ifndef LCD_PIXEL_HEIGHT + #define LCD_PIXEL_HEIGHT 64 + #endif +#endif + +/** + * Extruders have some combination of stepper motors and hotends + * so we separate these concepts into the defines: + * + * EXTRUDERS - Number of Selectable Tools + * HOTENDS - Number of hotends, whether connected or separate + * E_STEPPERS - Number of actual E stepper motors + * E_MANUAL - Number of E steppers for LCD move options + */ + +#if EXTRUDERS == 0 + #undef EXTRUDERS + #define EXTRUDERS 0 + #undef SINGLENOZZLE + #undef SWITCHING_EXTRUDER + #undef SWITCHING_NOZZLE + #undef MIXING_EXTRUDER + #undef MK2_MULTIPLEXER + #undef PRUSA_MMU2 + #undef HOTEND_IDLE_TIMEOUT +#elif EXTRUDERS > 1 + #define HAS_MULTI_EXTRUDER 1 +#endif + +#if ENABLED(SWITCHING_EXTRUDER) // One stepper for every two EXTRUDERS + #if EXTRUDERS > 4 + #define E_STEPPERS 3 + #elif EXTRUDERS > 2 + #define E_STEPPERS 2 + #else + #define E_STEPPERS 1 + #endif + #if DISABLED(SWITCHING_NOZZLE) + #define HOTENDS E_STEPPERS + #endif +#elif ENABLED(MIXING_EXTRUDER) + #define E_STEPPERS MIXING_STEPPERS + #define E_MANUAL 1 + #if MIXING_STEPPERS == 2 + #define HAS_DUAL_MIXING 1 + #endif +#elif ENABLED(SWITCHING_TOOLHEAD) + #define E_STEPPERS EXTRUDERS + #define E_MANUAL EXTRUDERS +#elif ENABLED(PRUSA_MMU2) + #define E_STEPPERS 1 +#endif + +// No inactive extruders with MK2_MULTIPLEXER or SWITCHING_NOZZLE +#if EITHER(MK2_MULTIPLEXER, SWITCHING_NOZZLE) + #undef DISABLE_INACTIVE_EXTRUDER +#endif + +// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE +#if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2) + #define SINGLENOZZLE +#endif + +#if EITHER(SINGLENOZZLE, MIXING_EXTRUDER) // One hotend, one thermistor, no XY offset + #undef HOTENDS + #define HOTENDS 1 + #undef HOTEND_OFFSET_X + #undef HOTEND_OFFSET_Y +#endif + +#ifndef HOTENDS + #define HOTENDS EXTRUDERS +#endif +#ifndef E_STEPPERS + #define E_STEPPERS EXTRUDERS +#endif +#ifndef E_MANUAL + #define E_MANUAL EXTRUDERS +#endif + +#if HOTENDS + #define HAS_HOTEND 1 + #ifndef HOTEND_OVERSHOOT + #define HOTEND_OVERSHOOT 15 + #endif + #if HOTENDS > 1 + #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 +#define HOTEND_LOOP() for (int8_t e = 0; e < HOTENDS; e++) +#define ARRAY_BY_EXTRUDERS(V...) ARRAY_N(EXTRUDERS, V) +#define ARRAY_BY_EXTRUDERS1(v1) ARRAY_BY_EXTRUDERS(v1, v1, v1, v1, v1, v1, v1, v1) +#define ARRAY_BY_HOTENDS(V...) ARRAY_N(HOTENDS, V) +#define ARRAY_BY_HOTENDS1(v1) ARRAY_BY_HOTENDS(v1, v1, v1, v1, v1, v1, v1, v1) + +#if ENABLED(SWITCHING_EXTRUDER) && (DISABLED(SWITCHING_NOZZLE) || SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR) + #define DO_SWITCH_EXTRUDER 1 +#endif + +/** + * Default hotend offsets, if not defined + */ +#if HAS_HOTEND_OFFSET + #ifndef HOTEND_OFFSET_X + #define HOTEND_OFFSET_X { 0 } // X offsets for each extruder + #endif + #ifndef HOTEND_OFFSET_Y + #define HOTEND_OFFSET_Y { 0 } // Y offsets for each extruder + #endif + #ifndef HOTEND_OFFSET_Z + #define HOTEND_OFFSET_Z { 0 } // Z offsets for each extruder + #endif +#endif + +/** + * DISTINCT_E_FACTORS affects how some E factors are accessed + */ +#if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1 + #define DISTINCT_E E_STEPPERS + #define XYZE_N (XYZ + E_STEPPERS) + #define E_INDEX_N(E) (E) + #define E_AXIS_N(E) AxisEnum(E_AXIS + E) + #define UNUSED_E(E) NOOP +#else + #undef DISTINCT_E_FACTORS + #define DISTINCT_E 1 + #define XYZE_N XYZE + #define E_INDEX_N(E) 0 + #define E_AXIS_N(E) E_AXIS + #define UNUSED_E(E) UNUSED(E) +#endif + +#if ENABLED(DWIN_CREALITY_LCD) + #define SERIAL_CATCHALL 0 +#endif + +// Pressure sensor with a BLTouch-like interface +#if ENABLED(CREALITY_TOUCH) + #define BLTOUCH +#endif + +/** + * The BLTouch Probe emulates a servo probe + * and uses "special" angles for its state. + */ +#if ENABLED(BLTOUCH) + #ifndef Z_PROBE_SERVO_NR + #define Z_PROBE_SERVO_NR 0 + #endif + #undef DEACTIVATE_SERVOS_AFTER_MOVE + + // Always disable probe pin inverting for BLTouch + #undef Z_MIN_PROBE_ENDSTOP_INVERTING + #define Z_MIN_PROBE_ENDSTOP_INVERTING false + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #undef Z_MIN_ENDSTOP_INVERTING + #define Z_MIN_ENDSTOP_INVERTING false + #endif +#endif + +/** + * Set a flag for a servo probe (or BLTouch) + */ +#ifdef Z_PROBE_SERVO_NR + #define HAS_Z_SERVO_PROBE 1 +#endif +#if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) + #define HAS_SERVO_ANGLES 1 +#endif +#if !HAS_SERVO_ANGLES + #undef EDITABLE_SERVO_ANGLES +#endif + +/** + * Set flags for enabled probes + */ +#if ANY(HAS_Z_SERVO_PROBE, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE) + #define HAS_BED_PROBE 1 +#endif + +#if ANY(HAS_BED_PROBE, PROBE_MANUALLY, MESH_BED_LEVELING) + #define PROBE_SELECTED 1 +#endif + +#if HAS_BED_PROBE + #if DISABLED(NOZZLE_AS_PROBE) + #define HAS_PROBE_XY_OFFSET 1 + #endif + #if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define HAS_CUSTOM_PROBE_PIN 1 + #endif + #if Z_HOME_DIR < 0 && (!HAS_CUSTOM_PROBE_PIN || ENABLED(USE_PROBE_FOR_Z_HOMING)) + #define HOMING_Z_WITH_PROBE 1 + #endif + #ifndef Z_PROBE_LOW_POINT + #define Z_PROBE_LOW_POINT -5 + #endif + #if ENABLED(Z_PROBE_ALLEN_KEY) + #define PROBE_TRIGGERED_WHEN_STOWED_TEST 1 // Extra test for Allen Key Probe + #endif + #if MULTIPLE_PROBING > 1 + #if EXTRA_PROBING > 0 + #define TOTAL_PROBING (MULTIPLE_PROBING + EXTRA_PROBING) + #else + #define TOTAL_PROBING MULTIPLE_PROBING + #endif + #endif +#else + // Clear probe pin settings when no probe is selected + #undef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN +#endif + +/** + * Set granular options based on the specific type of leveling + */ +#if ENABLED(AUTO_BED_LEVELING_UBL) + #undef LCD_BED_LEVELING + #if ENABLED(DELTA) + #define UBL_SEGMENTED 1 + #endif +#endif +#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) + #define ABL_PLANAR 1 +#endif +#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) + #define ABL_GRID 1 +#endif +#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT) + #define HAS_ABL_NOT_UBL 1 +#endif +#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING) + #define HAS_MESH 1 +#endif +#if EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT) + #define NEEDS_THREE_PROBE_POINTS 1 +#endif +#if EITHER(HAS_ABL_NOT_UBL, AUTO_BED_LEVELING_UBL) + #define HAS_ABL_OR_UBL 1 + #if DISABLED(PROBE_MANUALLY) + #define HAS_AUTOLEVEL 1 + #endif +#endif +#if EITHER(HAS_ABL_OR_UBL, MESH_BED_LEVELING) + #define HAS_LEVELING 1 + #if DISABLED(AUTO_BED_LEVELING_UBL) + #define PLANNER_LEVELING 1 + #endif +#endif +#if EITHER(HAS_ABL_OR_UBL, Z_MIN_PROBE_REPEATABILITY_TEST) + #define HAS_PROBING_PROCEDURE 1 +#endif +#if !HAS_LEVELING + #undef RESTORE_LEVELING_AFTER_G28 +#endif + +#ifdef GRID_MAX_POINTS_X + #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) + #define GRID_LOOP(A,B) LOOP_L_N(A, GRID_MAX_POINTS_X) LOOP_L_N(B, GRID_MAX_POINTS_Y) +#endif + +#ifndef INVERT_X_DIR + #define INVERT_X_DIR false +#endif +#ifndef INVERT_Y_DIR + #define INVERT_Y_DIR false +#endif +#ifndef INVERT_Z_DIR + #define INVERT_Z_DIR false +#endif +#ifndef INVERT_E_DIR + #define INVERT_E_DIR false +#endif + +#if ENABLED(SLIM_LCD_MENUS) + #define BOOT_MARLIN_LOGO_SMALL +#endif + +// This flag indicates some kind of jerk storage is needed +#if EITHER(CLASSIC_JERK, IS_KINEMATIC) + #define HAS_CLASSIC_JERK 1 +#endif + +#if DISABLED(CLASSIC_JERK) + #define HAS_JUNCTION_DEVIATION 1 +#endif + +// E jerk exists with JD disabled (of course) but also when Linear Advance is disabled on Delta/SCARA +#if ENABLED(CLASSIC_JERK) || (IS_KINEMATIC && DISABLED(LIN_ADVANCE)) + #define HAS_CLASSIC_E_JERK 1 +#endif + +#ifndef SPI_SPEED + #define SPI_SPEED SPI_FULL_SPEED +#endif + +#if SERIAL_PORT == -1 || SERIAL_PORT_2 == -1 + #define HAS_USB_SERIAL 1 +#endif + +/** + * This setting is also used by M109 when trying to calculate + * a ballpark safe margin to prevent wait-forever situation. + */ +#ifndef EXTRUDE_MINTEMP + #define EXTRUDE_MINTEMP 170 +#endif + +/** + * TFT Displays + * + * Configure parameters for TFT displays: + * - TFT_DEFAULT_ORIENTATION + * - TFT_DRIVER + * - TFT_WIDTH + * - TFT_HEIGHT + * - TFT_INTERFACE_(SPI|FSMC) + * - TFT_COLOR + * - GRAPHICAL_TFT_UPSCALE + */ +#if ENABLED(MKS_TS35_V2_0) + // Most common: ST7796 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_INTERFACE_SPI + #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(MKS_ROBIN_TFT24) + // Most common: ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT28) + // Most common: ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT32) + // Most common: ST7789 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT35) + // Most common: ILI9488 + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(MKS_ROBIN_TFT43) + #define TFT_DEFAULT_ORIENTATION 0 + #define TFT_DRIVER SSD1963 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 272 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(MKS_ROBIN_TFT_V1_1R) + // ILI9328 or R61505 + #define TFT_DEFAULT_ORIENTATION (TFT_INVERT_X | TFT_INVERT_Y | TFT_EXCHANGE_XY) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif EITHER(TFT_TRONXY_X5SA, ANYCUBIC_TFT35) + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_DRIVER ILI9488 + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 3 +#elif ENABLED(LONGER_LK_TFT28) + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + #define TFT_INTERFACE_FSMC + #define GRAPHICAL_TFT_UPSCALE 2 +#elif ENABLED(TFT_GENERIC) + #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) +#endif + +// FSMC/SPI TFT Panels using standard HAL/tft/tft_(fsmc|spi).h +#if ENABLED(TFT_INTERFACE_FSMC) + #define HAS_FSMC_TFT 1 + #if ENABLED(TFT_CLASSIC_UI) + #define FSMC_GRAPHICAL_TFT + #elif ENABLED(TFT_LVGL_UI) + #define TFT_LVGL_UI_FSMC + #endif +#elif ENABLED(TFT_INTERFACE_SPI) + #define HAS_SPI_TFT 1 + #if ENABLED(TFT_CLASSIC_UI) + #define SPI_GRAPHICAL_TFT + #elif ENABLED(TFT_LVGL_UI) + #define TFT_LVGL_UI_SPI + #endif +#endif + +#if ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 240 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_320x240_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_320x240 + #endif +#elif ENABLED(TFT_COLOR_UI) && TFT_HEIGHT == 320 + #if ENABLED(TFT_INTERFACE_SPI) + #define TFT_480x320_SPI + #elif ENABLED(TFT_INTERFACE_FSMC) + #define TFT_480x320 + #endif +#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 + +// 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/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h new file mode 100644 index 00000000..bab05e5f --- /dev/null +++ b/Marlin/src/inc/Conditionals_adv.h @@ -0,0 +1,503 @@ +/** + * 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 + +/** + * Conditionals_adv.h + * Defines that depend on advanced configuration. + */ + +#ifdef SWITCHING_NOZZLE_E1_SERVO_NR + #define SWITCHING_NOZZLE_TWO_SERVOS 1 +#endif + +// Determine NUM_SERVOS if none was supplied +#ifndef NUM_SERVOS + #define NUM_SERVOS 0 + #if ANY(CHAMBER_VENT, HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) + #if NUM_SERVOS <= Z_PROBE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (Z_PROBE_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= CHAMBER_VENT_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (CHAMBER_VENT_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_TOOLHEAD_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_TOOLHEAD_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_NOZZLE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_NOZZLE_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_NOZZLE_E1_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_NOZZLE_E1_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_EXTRUDER_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_EXTRUDER_SERVO_NR + 1) + #endif + #if NUM_SERVOS <= SWITCHING_EXTRUDER_E23_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS (SWITCHING_EXTRUDER_E23_SERVO_NR + 1) + #endif + #endif +#endif + +// Convenience override for a BLTouch alone +#if ENABLED(BLTOUCH) && NUM_SERVOS == 1 + #undef SERVO_DELAY + #define SERVO_DELAY { 50 } +#endif + +#if EXTRUDERS == 0 + #define NO_VOLUMETRICS + #undef TEMP_SENSOR_0 + #undef TEMP_SENSOR_1 + #undef TEMP_SENSOR_2 + #undef TEMP_SENSOR_3 + #undef TEMP_SENSOR_4 + #undef TEMP_SENSOR_5 + #undef TEMP_SENSOR_6 + #undef TEMP_SENSOR_7 + #undef FWRETRACT + #undef PIDTEMP + #undef AUTOTEMP + #undef PID_EXTRUSION_SCALING + #undef LIN_ADVANCE + #undef FILAMENT_RUNOUT_SENSOR + #undef ADVANCED_PAUSE_FEATURE + #undef FILAMENT_RUNOUT_DISTANCE_MM + #undef FILAMENT_LOAD_UNLOAD_GCODES + #undef DISABLE_INACTIVE_EXTRUDER + #undef FILAMENT_LOAD_UNLOAD_GCODES + #undef EXTRUDER_RUNOUT_PREVENT + #undef PREVENT_COLD_EXTRUSION + #undef PREVENT_LENGTHY_EXTRUDE + #undef THERMAL_PROTECTION_HOTENDS + #undef THERMAL_PROTECTION_PERIOD + #undef WATCH_TEMP_PERIOD + #undef SHOW_TEMP_ADC_VALUES +#endif + +#if TEMP_SENSOR_BED == 0 + #undef THERMAL_PROTECTION_BED + #undef THERMAL_PROTECTION_BED_PERIOD +#endif + +#if TEMP_SENSOR_CHAMBER == 0 + #undef THERMAL_PROTECTION_CHAMBER +#endif + +#if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) + #define HAS_MIXER_SYNC_CHANNEL 1 +#endif + +#if EITHER(DUAL_X_CARRIAGE, MULTI_NOZZLE_DUPLICATION) + #define HAS_DUPLICATION_MODE 1 +#endif + +#if ENABLED(PRINTCOUNTER) && (SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0) + #define HAS_SERVICE_INTERVALS 1 +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define HAS_FILAMENT_SENSOR 1 + #ifdef FILAMENT_RUNOUT_DISTANCE_MM + #define HAS_FILAMENT_RUNOUT_DISTANCE 1 + #endif +#endif + +// Let SD_FINISHED_RELEASECOMMAND stand in for SD_FINISHED_STEPPERRELEASE +#if ENABLED(SD_FINISHED_STEPPERRELEASE) + #ifndef SD_FINISHED_RELEASECOMMAND + #define SD_FINISHED_RELEASECOMMAND "M84" // planner.finish_and_disable() + #endif +#else + #undef SD_FINISHED_RELEASECOMMAND +#endif + +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) + #define HAS_PRINT_PROGRESS 1 +#endif + +#if HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME) + #define HAS_PRINT_PROGRESS_PERMYRIAD 1 +#endif + +#if ANY(MARLIN_BRICKOUT, MARLIN_INVADERS, MARLIN_SNAKE, MARLIN_MAZE) + #define HAS_GAMES 1 + #if (1 < ENABLED(MARLIN_BRICKOUT) + ENABLED(MARLIN_INVADERS) + ENABLED(MARLIN_SNAKE) + ENABLED(MARLIN_MAZE)) + #define HAS_GAME_MENU 1 + #endif +#endif + +#if ANY(FWRETRACT, HAS_LEVELING, SKEW_CORRECTION) + #define HAS_POSITION_MODIFIERS 1 +#endif + +#if ANY(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS, Z_MULTI_ENDSTOPS) + #define HAS_EXTRA_ENDSTOPS 1 +#endif +#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) + #define HAS_SOFTWARE_ENDSTOPS 1 +#endif +#if ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS, DWIN_CREALITY_LCD) + #define HAS_RESUME_CONTINUE 1 +#endif + +#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) + #define HAS_COLOR_LEDS 1 +#endif +#if ALL(HAS_RESUME_CONTINUE, PRINTER_EVENT_LEDS, SDSUPPORT) + #define HAS_LEDS_OFF_FLAG 1 +#endif + +#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) + #define HAS_MOTOR_CURRENT_I2C 1 +#endif + +// Multiple Z steppers +#ifndef NUM_Z_STEPPER_DRIVERS + #define NUM_Z_STEPPER_DRIVERS 1 +#endif + +#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + #undef Z_STEPPER_ALIGN_AMP +#endif +#ifndef Z_STEPPER_ALIGN_AMP + #define Z_STEPPER_ALIGN_AMP 1.0 +#endif + +// +// Spindle/Laser power display types +// Defined here so sanity checks can use them +// +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #define HAS_CUTTER 1 + #define _CUTTER_POWER_PWM255 1 + #define _CUTTER_POWER_PERCENT 2 + #define _CUTTER_POWER_RPM 3 + #define _CUTTER_POWER(V) _CAT(_CUTTER_POWER_, V) + #define CUTTER_UNIT_IS(V) (_CUTTER_POWER(CUTTER_POWER_UNIT) == _CUTTER_POWER(V)) +#endif + +// Add features that need hardware PWM here +#if ANY(FAST_PWM_FAN, SPINDLE_LASER_PWM) + #define NEEDS_HARDWARE_PWM 1 +#endif + +#if defined(__AVR__) && defined(USBCON) + #define IS_AT90USB 1 + #undef SERIAL_XON_XOFF // Not supported on USB-native devices +#else + // Define constants and variables for buffering serial data. + // Use only 0 or powers of 2 greater than 1 + // : [0, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, ...] + #ifndef RX_BUFFER_SIZE + #define RX_BUFFER_SIZE 128 + #endif + // 256 is the max TX buffer limit due to uint8_t head and tail + // : [0, 4, 8, 16, 32, 64, 128, 256] + #ifndef TX_BUFFER_SIZE + #define TX_BUFFER_SIZE 32 + #endif +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #ifndef ACTION_ON_PAUSE + #define ACTION_ON_PAUSE "pause" + #endif + #ifndef ACTION_ON_PAUSED + #define ACTION_ON_PAUSED "paused" + #endif + #ifndef ACTION_ON_RESUME + #define ACTION_ON_RESUME "resume" + #endif + #ifndef ACTION_ON_RESUMED + #define ACTION_ON_RESUMED "resumed" + #endif + #ifndef ACTION_ON_CANCEL + #define ACTION_ON_CANCEL "cancel" + #endif + #ifndef ACTION_ON_START + #define ACTION_ON_START "start" + #endif + #ifndef ACTION_ON_KILL + #define ACTION_ON_KILL "poweroff" + #endif + #if HAS_FILAMENT_SENSOR + #ifndef ACTION_ON_FILAMENT_RUNOUT + #define ACTION_ON_FILAMENT_RUNOUT "filament_runout" + #endif + #ifndef ACTION_REASON_ON_FILAMENT_RUNOUT + #define ACTION_REASON_ON_FILAMENT_RUNOUT "filament_runout" + #endif + #endif + #if ENABLED(G29_RETRY_AND_RECOVER) + #ifndef ACTION_ON_G29_RECOVER + #define ACTION_ON_G29_RECOVER "probe_rewipe" + #endif + #ifndef ACTION_ON_G29_FAILURE + #define ACTION_ON_G29_FAILURE "probe_failed" + #endif + #endif +#endif + +#if EITHER(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) + #define LED_CONTROL_MENU + #define LED_USER_PRESET_STARTUP + #define LED_COLOR_PRESETS + #ifndef LED_USER_PRESET_GREEN + #define LED_USER_PRESET_GREEN 128 + #endif + #ifndef LED_USER_PRESET_BLUE + #define LED_USER_PRESET_BLUE 0 + #endif + #ifndef LED_USER_PRESET_BRIGHTNESS + #define LED_USER_PRESET_BRIGHTNESS 255 + #endif +#endif + +// Set defaults for unspecified LED user colors +#if ENABLED(LED_CONTROL_MENU) + #ifndef LED_USER_PRESET_RED + #define LED_USER_PRESET_RED 255 + #endif + #ifndef LED_USER_PRESET_GREEN + #define LED_USER_PRESET_GREEN 255 + #endif + #ifndef LED_USER_PRESET_BLUE + #define LED_USER_PRESET_BLUE 255 + #endif + #ifndef LED_USER_PRESET_WHITE + #define LED_USER_PRESET_WHITE 0 + #endif + #ifndef LED_USER_PRESET_BRIGHTNESS + #ifdef NEOPIXEL_BRIGHTNESS + #define LED_USER_PRESET_BRIGHTNESS NEOPIXEL_BRIGHTNESS + #else + #define LED_USER_PRESET_BRIGHTNESS 255 + #endif + #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 +#endif + +// Full Touch Screen needs 'tft/xpt2046' +#if EITHER(TOUCH_SCREEN, HAS_TFT_LVGL_UI) + #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 +#endif + +// Poll-based jogging for joystick and other devices +#if ENABLED(JOYSTICK) + #define POLL_JOG +#endif + +/** + * Driver Timings (in nanoseconds) + * NOTE: Driver timing order is longest-to-shortest duration. + * Preserve this ordering when adding new drivers. + */ +#ifndef MINIMUM_STEPPER_POST_DIR_DELAY + #if HAS_DRIVER(TB6560) + #define MINIMUM_STEPPER_POST_DIR_DELAY 15000 + #elif HAS_DRIVER(TB6600) + #define MINIMUM_STEPPER_POST_DIR_DELAY 1500 + #elif HAS_DRIVER(DRV8825) + #define MINIMUM_STEPPER_POST_DIR_DELAY 650 + #elif HAS_DRIVER(LV8729) + #define MINIMUM_STEPPER_POST_DIR_DELAY 500 + #elif HAS_DRIVER(A5984) + #define MINIMUM_STEPPER_POST_DIR_DELAY 400 + #elif HAS_DRIVER(A4988) + #define MINIMUM_STEPPER_POST_DIR_DELAY 200 + #elif HAS_TRINAMIC_CONFIG || HAS_TRINAMIC_STANDALONE + #define MINIMUM_STEPPER_POST_DIR_DELAY 60 + #else + #define MINIMUM_STEPPER_POST_DIR_DELAY 0 // Expect at least 10µS since one Stepper ISR must transpire + #endif +#endif + +#ifndef MINIMUM_STEPPER_PRE_DIR_DELAY + #define MINIMUM_STEPPER_PRE_DIR_DELAY MINIMUM_STEPPER_POST_DIR_DELAY +#endif + +#ifndef MINIMUM_STEPPER_PULSE + #if HAS_DRIVER(TB6560) + #define MINIMUM_STEPPER_PULSE 30 + #elif HAS_DRIVER(TB6600) + #define MINIMUM_STEPPER_PULSE 3 + #elif HAS_DRIVER(DRV8825) + #define MINIMUM_STEPPER_PULSE 2 + #elif HAS_DRIVER(A4988) || HAS_DRIVER(A5984) + #define MINIMUM_STEPPER_PULSE 1 + #elif HAS_TRINAMIC_CONFIG || HAS_TRINAMIC_STANDALONE + #define MINIMUM_STEPPER_PULSE 0 + #elif HAS_DRIVER(LV8729) + #define MINIMUM_STEPPER_PULSE 0 + #else + #define MINIMUM_STEPPER_PULSE 2 + #endif +#endif + +#ifndef MAXIMUM_STEPPER_RATE + #if HAS_DRIVER(TB6560) + #define MAXIMUM_STEPPER_RATE 15000 + #elif HAS_DRIVER(TB6600) + #define MAXIMUM_STEPPER_RATE 150000 + #elif HAS_DRIVER(DRV8825) + #define MAXIMUM_STEPPER_RATE 250000 + #elif HAS_DRIVER(A4988) + #define MAXIMUM_STEPPER_RATE 500000 + #elif HAS_DRIVER(LV8729) + #define MAXIMUM_STEPPER_RATE 1000000 + #elif HAS_TRINAMIC_CONFIG || HAS_TRINAMIC_STANDALONE + #define MAXIMUM_STEPPER_RATE 5000000 + #else + #define MAXIMUM_STEPPER_RATE 250000 + #endif +#endif + +#if ENABLED(DIRECT_STEPPING) + #ifndef STEPPER_PAGES + #define STEPPER_PAGES 16 + #endif + #ifndef STEPPER_PAGE_FORMAT + #define STEPPER_PAGE_FORMAT SP_4x2_256 + #endif + #ifndef PAGE_MANAGER + #define PAGE_MANAGER SerialPageManager + #endif +#endif + +// +// SD Card connection methods +// Defined here so pins and sanity checks can use them +// +#if ENABLED(SDSUPPORT) + #define _SDCARD_LCD 1 + #define _SDCARD_ONBOARD 2 + #define _SDCARD_CUSTOM_CABLE 3 + #define _SDCARD_ID(V) _CAT(_SDCARD_, V) + #define SD_CONNECTION_IS(V) (_SDCARD_ID(SDCARD_CONNECTION) == _SDCARD_ID(V)) +#else + #define SD_CONNECTION_IS(...) 0 +#endif + +// Power Monitor sensors +#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) + #define HAS_POWER_MONITOR 1 +#endif +#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) + #define HAS_POWER_MONITOR_WATTS 1 +#endif + +// Flag if an EEPROM type is pre-selected +#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 + +// 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 + +// Flag the indexed serial ports that are in use +#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) +#if ANY_SERIAL_IS(-1) + #define USING_SERIAL_DEFAULT +#endif +#if ANY_SERIAL_IS(0) + #define USING_SERIAL_0 1 +#endif +#if ANY_SERIAL_IS(1) + #define USING_SERIAL_1 1 +#endif +#if ANY_SERIAL_IS(2) + #define USING_SERIAL_2 1 +#endif +#if ANY_SERIAL_IS(3) + #define USING_SERIAL_3 1 +#endif +#if ANY_SERIAL_IS(4) + #define USING_SERIAL_4 1 +#endif +#if ANY_SERIAL_IS(5) + #define USING_SERIAL_5 1 +#endif +#if ANY_SERIAL_IS(6) + #define USING_SERIAL_6 1 +#endif +#if ANY_SERIAL_IS(7) + #define USING_SERIAL_7 1 +#endif +#if ANY_SERIAL_IS(8) + #define USING_SERIAL_8 1 +#endif +#undef ANY_SERIAL_IS diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h new file mode 100644 index 00000000..798bf009 --- /dev/null +++ b/Marlin/src/inc/Conditionals_post.h @@ -0,0 +1,2637 @@ +/** + * 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 + +/** + * Conditionals_post.h + * Defines that depend on configuration but are not editable. + */ + +#ifdef GITHUB_ACTIONS + // Extras for CI testing +#endif + +// ADC +#ifdef BOARD_ADC_VREF + #define ADC_VREF BOARD_ADC_VREF +#else + #define ADC_VREF HAL_ADC_VREF +#endif + +// Linear advance uses Jerk since E is an isolated axis +#if BOTH(HAS_JUNCTION_DEVIATION, LIN_ADVANCE) + #define HAS_LINEAR_E_JERK 1 +#endif + +// Determine which type of 'EEPROM' is in use +#if ENABLED(EEPROM_SETTINGS) + // EEPROM type may be defined by compile flags, configs, HALs, or pins + // Set additional flags to let HALs choose in their Conditionals_post.h + #if ANY(FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SDCARD_EEPROM_EMULATION, QSPI_EEPROM) + #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 +#else + #undef I2C_EEPROM + #undef SPI_EEPROM + #undef QSPI_EEPROM + #undef SDCARD_EEPROM_EMULATION + #undef SRAM_EEPROM_EMULATION + #undef FLASH_EEPROM_EMULATION + #undef IIC_BL24CXX_EEPROM +#endif + +#ifdef TEENSYDUINO + #undef max + #define max(a,b) ((a)>(b)?(a):(b)) + #undef min + #define min(a,b) ((a)<(b)?(a):(b)) + + #undef NOT_A_PIN // Override Teensyduino legacy CapSense define work-around + #define NOT_A_PIN 0 // For PINS_DEBUGGING +#endif + +/** + * Axis lengths and center + */ +#define X_MAX_LENGTH (X_MAX_POS - (X_MIN_POS)) +#define Y_MAX_LENGTH (Y_MAX_POS - (Y_MIN_POS)) +#define Z_MAX_LENGTH (Z_MAX_POS - (Z_MIN_POS)) + +// Defined only if the sanity-check is bypassed +#ifndef X_BED_SIZE + #define X_BED_SIZE X_MAX_LENGTH +#endif +#ifndef Y_BED_SIZE + #define Y_BED_SIZE Y_MAX_LENGTH +#endif + +// Require 0,0 bed center for Delta and SCARA +#if IS_KINEMATIC + #define BED_CENTER_AT_0_0 +#endif + +// Define center values for future use +#define _X_HALF_BED ((X_BED_SIZE) / 2) +#define _Y_HALF_BED ((Y_BED_SIZE) / 2) +#define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED) +#define Y_CENTER TERN(BED_CENTER_AT_0_0, 0, _Y_HALF_BED) + +// Get the linear boundaries of the bed +#define X_MIN_BED (X_CENTER - _X_HALF_BED) +#define X_MAX_BED (X_MIN_BED + X_BED_SIZE) +#define Y_MIN_BED (Y_CENTER - _Y_HALF_BED) +#define Y_MAX_BED (Y_MIN_BED + Y_BED_SIZE) + +/** + * Dual X Carriage + */ +#if ENABLED(DUAL_X_CARRIAGE) + #ifndef X1_MIN_POS + #define X1_MIN_POS X_MIN_POS + #endif + #ifndef X1_MAX_POS + #define X1_MAX_POS X_BED_SIZE + #endif +#endif + +/** + * CoreXY, CoreXZ, and CoreYZ - and their reverse + */ +#if EITHER(COREXY, COREYX) + #define CORE_IS_XY 1 +#endif +#if EITHER(COREXZ, COREZX) + #define CORE_IS_XZ 1 +#endif +#if EITHER(COREYZ, COREZY) + #define CORE_IS_YZ 1 +#endif +#if CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ + #define IS_CORE 1 +#endif +#if IS_CORE + #if CORE_IS_XY + #define CORE_AXIS_1 A_AXIS + #define CORE_AXIS_2 B_AXIS + #define NORMAL_AXIS Z_AXIS + #elif CORE_IS_XZ + #define CORE_AXIS_1 A_AXIS + #define NORMAL_AXIS Y_AXIS + #define CORE_AXIS_2 C_AXIS + #elif CORE_IS_YZ + #define NORMAL_AXIS X_AXIS + #define CORE_AXIS_1 B_AXIS + #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 EITHER(IS_CORE, MARKFORGED_XY) + #define CAN_CALIBRATE(A,B) (_AXIS(A) == B) + #else + #define CAN_CALIBRATE(A,B) 1 + #endif +#endif +#define AXIS_CAN_CALIBRATE(A) CAN_CALIBRATE(A,NORMAL_AXIS) + +/** + * No adjustable bed on non-cartesians + */ +#if IS_KINEMATIC + #undef LEVEL_BED_CORNERS +#endif + +/** + * SCARA cannot use SLOWDOWN and requires QUICKHOME + * Printable radius assumes joints can fully extend + */ +#if IS_SCARA + #undef SLOWDOWN + #define QUICK_HOME + #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) +#endif + +/** + * Set the home position based on settings or manual overrides + */ +#ifdef MANUAL_X_HOME_POS + #define X_HOME_POS MANUAL_X_HOME_POS +#else + #define X_END_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) + #if ENABLED(BED_CENTER_AT_0_0) + #define X_HOME_POS TERN(DELTA, 0, X_END_POS) + #else + #define X_HOME_POS TERN(DELTA, X_MIN_POS + (X_BED_SIZE) * 0.5, X_END_POS) + #endif +#endif + +#ifdef MANUAL_Y_HOME_POS + #define Y_HOME_POS MANUAL_Y_HOME_POS +#else + #define Y_END_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) + #if ENABLED(BED_CENTER_AT_0_0) + #define Y_HOME_POS TERN(DELTA, 0, Y_END_POS) + #else + #define Y_HOME_POS TERN(DELTA, Y_MIN_POS + (Y_BED_SIZE) * 0.5, Y_END_POS) + #endif +#endif + +#ifdef MANUAL_Z_HOME_POS + #define Z_HOME_POS MANUAL_Z_HOME_POS +#else + #define Z_HOME_POS (Z_HOME_DIR < 0 ? Z_MIN_POS : Z_MAX_POS) +#endif + +/** + * If DELTA_HEIGHT isn't defined use the old setting + */ +#if ENABLED(DELTA) && !defined(DELTA_HEIGHT) + #define DELTA_HEIGHT Z_HOME_POS +#endif + +/** + * Z Sled Probe requires Z_SAFE_HOMING + */ +#if ENABLED(Z_PROBE_SLED) + #define Z_SAFE_HOMING +#endif + +/** + * DELTA should ignore Z_SAFE_HOMING and SLOWDOWN + */ +#if ENABLED(DELTA) + #undef Z_SAFE_HOMING + #undef SLOWDOWN +#endif + +#ifndef MESH_INSET + #define MESH_INSET 0 +#endif + +/** + * Safe Homing Options + */ +#if ENABLED(Z_SAFE_HOMING) + #if ENABLED(AUTO_BED_LEVELING_UBL) + // Home close to center so grid points have z heights very close to 0 + #define _SAFE_POINT(A) (((GRID_MAX_POINTS_##A) / 2) * (A##_BED_SIZE - 2 * (MESH_INSET)) / (GRID_MAX_POINTS_##A - 1) + MESH_INSET) + #else + #define _SAFE_POINT(A) A##_CENTER + #endif + #ifndef Z_SAFE_HOMING_X_POINT + #define Z_SAFE_HOMING_X_POINT _SAFE_POINT(X) + #endif + #ifndef Z_SAFE_HOMING_Y_POINT + #define Z_SAFE_HOMING_Y_POINT _SAFE_POINT(Y) + #endif +#endif + +/** + * Host keep alive + */ +#ifndef DEFAULT_KEEPALIVE_INTERVAL + #define DEFAULT_KEEPALIVE_INTERVAL 2 +#endif + +/** + * Provide a MAX_AUTORETRACT for older configs + */ +#if ENABLED(FWRETRACT) && !defined(MAX_AUTORETRACT) + #define MAX_AUTORETRACT 99 +#endif + +/** + * Provide a DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT in case NO_VOLUMETRICS is enabled + */ +#ifndef DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT + #define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 +#endif + +/** + * LCD Contrast for Graphical Displays + */ +#if ENABLED(CARTESIO_UI) + #define _LCD_CONTRAST_MIN 60 + #define _LCD_CONTRAST_INIT 90 + #define _LCD_CONTRAST_MAX 140 +#elif ENABLED(miniVIKI) + #define _LCD_CONTRAST_MIN 75 + #define _LCD_CONTRAST_INIT 95 + #define _LCD_CONTRAST_MAX 115 +#elif ENABLED(VIKI2) + #define _LCD_CONTRAST_INIT 140 +#elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define _LCD_CONTRAST_MIN 90 + #define _LCD_CONTRAST_INIT 110 + #define _LCD_CONTRAST_MAX 130 +#elif ENABLED(AZSMZ_12864) + #define _LCD_CONTRAST_MIN 120 + #define _LCD_CONTRAST_INIT 190 +#elif ENABLED(MKS_LCD12864) + #define _LCD_CONTRAST_MIN 120 + #define _LCD_CONTRAST_INIT 205 +#elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #define _LCD_CONTRAST_MIN 120 + #define _LCD_CONTRAST_INIT 195 +#elif ENABLED(FYSETC_MINI_12864) + #define _LCD_CONTRAST_INIT 220 +#elif ENABLED(ULTI_CONTROLLER) + #define _LCD_CONTRAST_INIT 127 + #define _LCD_CONTRAST_MAX 254 +#elif ENABLED(MAKRPANEL) + #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 +#elif IS_TFTGLCD_PANEL + #define _LCD_CONTRAST_MIN 0 + #define _LCD_CONTRAST_INIT 250 + #define _LCD_CONTRAST_MAX 255 +#endif + +#ifdef _LCD_CONTRAST_INIT + #define HAS_LCD_CONTRAST 1 +#endif + +#if HAS_LCD_CONTRAST + #ifndef LCD_CONTRAST_MIN + #ifdef _LCD_CONTRAST_MIN + #define LCD_CONTRAST_MIN _LCD_CONTRAST_MIN + #else + #define LCD_CONTRAST_MIN 0 + #endif + #endif + #ifndef LCD_CONTRAST_INIT + #define LCD_CONTRAST_INIT _LCD_CONTRAST_INIT + #endif + #ifndef LCD_CONTRAST_MAX + #ifdef _LCD_CONTRAST_MAX + #define LCD_CONTRAST_MAX _LCD_CONTRAST_MAX + #elif _LCD_CONTRAST_INIT > 63 + #define LCD_CONTRAST_MAX 255 + #else + #define LCD_CONTRAST_MAX 63 // ST7567 6-bits contrast + #endif + #endif + #ifndef DEFAULT_LCD_CONTRAST + #define DEFAULT_LCD_CONTRAST LCD_CONTRAST_INIT + #endif +#endif + +/** + * Override the SD_DETECT_STATE set in Configuration_adv.h + * and enable sharing of onboard SD host drives (all platforms but AGCM4) + */ +#if ENABLED(SDSUPPORT) + + #if SD_CONNECTION_IS(ONBOARD) && DISABLED(NO_SD_HOST_DRIVE) && !defined(ARDUINO_GRAND_CENTRAL_M4) + // + // The external SD card is not used. Hardware SPI is used to access the card. + // When sharing the SD card with a PC we want the menu options to + // mount/unmount the card and refresh it. So we disable card detect. + // + #undef SD_DETECT_PIN + #define HAS_SHARED_MEDIA 1 + #endif + + #if PIN_EXISTS(SD_DETECT) + #if HAS_LCD_MENU && (SD_CONNECTION_IS(LCD) || !defined(SDCARD_CONNECTION)) + #undef SD_DETECT_STATE + #if ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define SD_DETECT_STATE HIGH + #endif + #endif + #ifndef SD_DETECT_STATE + #define SD_DETECT_STATE LOW + #endif + #endif + +#endif + +#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 + +/** + * Set defaults for missing (newer) options + */ +#ifndef DISABLE_INACTIVE_X + #define DISABLE_INACTIVE_X DISABLE_X +#endif +#ifndef DISABLE_INACTIVE_Y + #define DISABLE_INACTIVE_Y DISABLE_Y +#endif +#ifndef DISABLE_INACTIVE_Z + #define DISABLE_INACTIVE_Z DISABLE_Z +#endif +#ifndef DISABLE_INACTIVE_E + #define DISABLE_INACTIVE_E DISABLE_E +#endif + +/** + * Power Supply + */ +#ifndef PSU_NAME + #if DISABLED(PSU_CONTROL) + #define PSU_NAME "Generic" // No control + #elif PSU_ACTIVE_STATE + #define PSU_NAME "XBox" // X-Box 360 (203W) + #else + #define PSU_NAME "ATX" // ATX style + #endif +#endif + +#if !defined(PSU_POWERUP_DELAY) && ENABLED(PSU_CONTROL) + #define PSU_POWERUP_DELAY 250 +#endif + +/** + * Temp Sensor defines + */ + +#define ANY_TEMP_SENSOR_IS(n) (TEMP_SENSOR_0 == (n) || TEMP_SENSOR_1 == (n) || TEMP_SENSOR_2 == (n) || TEMP_SENSOR_3 == (n) || TEMP_SENSOR_4 == (n) || TEMP_SENSOR_5 == (n) || TEMP_SENSOR_6 == (n) || TEMP_SENSOR_7 == (n) || TEMP_SENSOR_BED == (n) || TEMP_SENSOR_PROBE == (n) || TEMP_SENSOR_CHAMBER == (n)) + +#if ANY_TEMP_SENSOR_IS(1000) + #define HAS_USER_THERMISTORS 1 +#endif + +#if TEMP_SENSOR_0 == -5 || TEMP_SENSOR_0 == -3 || TEMP_SENSOR_0 == -2 + #define HEATER_0_USES_MAX6675 + #if TEMP_SENSOR_0 == -3 + #define HEATER_0_MAX6675_TMIN -270 + #define HEATER_0_MAX6675_TMAX 1800 + #else + #define HEATER_0_MAX6675_TMIN 0 + #define HEATER_0_MAX6675_TMAX 1024 + #endif + #if TEMP_SENSOR_0 == -5 + #define MAX6675_IS_MAX31865 + #elif TEMP_SENSOR_0 == -3 + #define MAX6675_IS_MAX31855 + #endif +#elif TEMP_SENSOR_0 == -4 + #define HEATER_0_USES_AD8495 +#elif TEMP_SENSOR_0 == -1 + #define HEATER_0_USES_AD595 +#elif TEMP_SENSOR_0 > 0 + #define THERMISTOR_HEATER_0 TEMP_SENSOR_0 + #define HEATER_0_USES_THERMISTOR + #if TEMP_SENSOR_0 == 1000 + #define HEATER_0_USER_THERMISTOR + #endif +#else + #undef HEATER_0_MINTEMP + #undef HEATER_0_MAXTEMP +#endif + +#if TEMP_SENSOR_1 == -5 || TEMP_SENSOR_1 == -3 || TEMP_SENSOR_1 == -2 + #define HEATER_1_USES_MAX6675 + #if TEMP_SENSOR_1 == -3 + #define HEATER_1_MAX6675_TMIN -270 + #define HEATER_1_MAX6675_TMAX 1800 + #else + #define HEATER_1_MAX6675_TMIN 0 + #define HEATER_1_MAX6675_TMAX 1024 + #endif + #if TEMP_SENSOR_1 != TEMP_SENSOR_0 + #if TEMP_SENSOR_1 == -5 + #error "If MAX31865 Thermocouple (-5) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." + #elif TEMP_SENSOR_1 == -3 + #error "If MAX31855 Thermocouple (-3) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." + #elif TEMP_SENSOR_1 == -2 + #error "If MAX6675 Thermocouple (-2) is used for TEMP_SENSOR_1 then TEMP_SENSOR_0 must match." + #endif + #endif +#elif TEMP_SENSOR_1 == -4 + #define HEATER_1_USES_AD8495 +#elif TEMP_SENSOR_1 == -1 + #define HEATER_1_USES_AD595 +#elif TEMP_SENSOR_1 > 0 + #define THERMISTOR_HEATER_1 TEMP_SENSOR_1 + #define HEATER_1_USES_THERMISTOR + #if TEMP_SENSOR_1 == 1000 + #define HEATER_1_USER_THERMISTOR + #endif +#else + #undef HEATER_1_MINTEMP + #undef HEATER_1_MAXTEMP +#endif + +#if TEMP_SENSOR_2 == -4 + #define HEATER_2_USES_AD8495 +#elif TEMP_SENSOR_2 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_2." +#elif TEMP_SENSOR_2 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_2." +#elif TEMP_SENSOR_2 == -1 + #define HEATER_2_USES_AD595 +#elif TEMP_SENSOR_2 > 0 + #define THERMISTOR_HEATER_2 TEMP_SENSOR_2 + #define HEATER_2_USES_THERMISTOR + #if TEMP_SENSOR_2 == 1000 + #define HEATER_2_USER_THERMISTOR + #endif +#else + #undef HEATER_2_MINTEMP + #undef HEATER_2_MAXTEMP +#endif + +#if TEMP_SENSOR_3 == -4 + #define HEATER_3_USES_AD8495 +#elif TEMP_SENSOR_3 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_3." +#elif TEMP_SENSOR_3 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_3." +#elif TEMP_SENSOR_3 == -1 + #define HEATER_3_USES_AD595 +#elif TEMP_SENSOR_3 > 0 + #define THERMISTOR_HEATER_3 TEMP_SENSOR_3 + #define HEATER_3_USES_THERMISTOR + #if TEMP_SENSOR_3 == 1000 + #define HEATER_3_USER_THERMISTOR + #endif +#else + #undef HEATER_3_MINTEMP + #undef HEATER_3_MAXTEMP +#endif + +#if TEMP_SENSOR_4 == -4 + #define HEATER_4_USES_AD8495 +#elif TEMP_SENSOR_4 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_4." +#elif TEMP_SENSOR_4 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_4." +#elif TEMP_SENSOR_4 == -1 + #define HEATER_4_USES_AD595 +#elif TEMP_SENSOR_4 > 0 + #define THERMISTOR_HEATER_4 TEMP_SENSOR_4 + #define HEATER_4_USES_THERMISTOR + #if TEMP_SENSOR_4 == 1000 + #define HEATER_4_USER_THERMISTOR + #endif +#else + #undef HEATER_4_MINTEMP + #undef HEATER_4_MAXTEMP +#endif + +#if TEMP_SENSOR_5 == -4 + #define HEATER_5_USES_AD8495 +#elif TEMP_SENSOR_5 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5." +#elif TEMP_SENSOR_5 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5." +#elif TEMP_SENSOR_5 == -1 + #define HEATER_5_USES_AD595 +#elif TEMP_SENSOR_5 > 0 + #define THERMISTOR_HEATER_5 TEMP_SENSOR_5 + #define HEATER_5_USES_THERMISTOR + #if TEMP_SENSOR_5 == 1000 + #define HEATER_5_USER_THERMISTOR + #endif +#else + #undef HEATER_5_MINTEMP + #undef HEATER_5_MAXTEMP +#endif + +#if TEMP_SENSOR_6 == -4 + #define HEATER_6_USES_AD8495 +#elif TEMP_SENSOR_6 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_6." +#elif TEMP_SENSOR_6 == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_6." +#elif TEMP_SENSOR_6 == -1 + #define HEATER_6_USES_AD595 +#elif TEMP_SENSOR_6 > 0 + #define THERMISTOR_HEATER_6 TEMP_SENSOR_6 + #define HEATER_6_USES_THERMISTOR + #if TEMP_SENSOR_6 == 1000 + #define HEATER_6_USER_THERMISTOR + #endif +#else + #undef HEATER_6_MINTEMP + #undef HEATER_6_MAXTEMP +#endif + +#if TEMP_SENSOR_7 == -4 + #define HEATER_7_USES_AD8495 +#elif TEMP_SENSOR_7 == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_7." +#elif TEMP_SENSOR_7 == -2 + #error "MAX7775 Thermocouples (-2) not supported for TEMP_SENSOR_7." +#elif TEMP_SENSOR_7 == -1 + #define HEATER_7_USES_AD595 +#elif TEMP_SENSOR_7 > 0 + #define THERMISTOR_HEATER_7 TEMP_SENSOR_7 + #define HEATER_7_USES_THERMISTOR + #if TEMP_SENSOR_7 == 1000 + #define HEATER_7_USER_THERMISTOR + #endif +#else + #undef HEATER_7_MINTEMP + #undef HEATER_7_MAXTEMP +#endif + +#if TEMP_SENSOR_BED == -4 + #define HEATER_BED_USES_AD8495 +#elif TEMP_SENSOR_BED == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_BED." +#elif TEMP_SENSOR_BED == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BED." +#elif TEMP_SENSOR_BED == -1 + #define HEATER_BED_USES_AD595 +#elif TEMP_SENSOR_BED > 0 + #define THERMISTORBED TEMP_SENSOR_BED + #define HEATER_BED_USES_THERMISTOR + #if TEMP_SENSOR_BED == 1000 + #define HEATER_BED_USER_THERMISTOR + #endif +#else + #undef BED_MINTEMP + #undef BED_MAXTEMP +#endif + +#if TEMP_SENSOR_CHAMBER == -4 + #define HEATER_CHAMBER_USES_AD8495 +#elif TEMP_SENSOR_CHAMBER == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_CHAMBER." +#elif TEMP_SENSOR_CHAMBER == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_CHAMBER." +#elif TEMP_SENSOR_CHAMBER == -1 + #define HEATER_CHAMBER_USES_AD595 +#elif TEMP_SENSOR_CHAMBER > 0 + #define THERMISTORCHAMBER TEMP_SENSOR_CHAMBER + #define HEATER_CHAMBER_USES_THERMISTOR + #if TEMP_SENSOR_CHAMBER == 1000 + #define HEATER_CHAMBER_USER_THERMISTOR + #endif +#else + #undef CHAMBER_MINTEMP + #undef CHAMBER_MAXTEMP +#endif + +#if TEMP_SENSOR_PROBE == -4 + #define HEATER_PROBE_USES_AD8495 +#elif TEMP_SENSOR_PROBE == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_PROBE." +#elif TEMP_SENSOR_PROBE == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_PROBE." +#elif TEMP_SENSOR_PROBE == -1 + #define HEATER_PROBE_USES_AD595 +#elif TEMP_SENSOR_PROBE > 0 + #define THERMISTORPROBE TEMP_SENSOR_PROBE + #define PROBE_USES_THERMISTOR + #if TEMP_SENSOR_PROBE == 1000 + #define PROBE_USER_THERMISTOR + #endif +#endif + +#define HOTEND_USES_THERMISTOR ANY( \ + HEATER_0_USES_THERMISTOR, HEATER_1_USES_THERMISTOR, HEATER_2_USES_THERMISTOR, HEATER_3_USES_THERMISTOR, \ + HEATER_4_USES_THERMISTOR, HEATER_5_USES_THERMISTOR, HEATER_6_USES_THERMISTOR, HEATER_7_USES_THERMISTOR ) + +/** + * X_DUAL_ENDSTOPS endstop reassignment + */ +#if ENABLED(X_DUAL_ENDSTOPS) + #if X_HOME_DIR > 0 + #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_ + #define X2_MAX_PIN X_MIN_PIN + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MAX_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MAX_PIN Y_MIN_PIN + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MAX_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MAX_PIN Z_MIN_PIN + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MAX_PIN Z_MAX_PIN + #elif X2_USE_ENDSTOP == _XDIAG_ + #define X2_MAX_PIN X_DIAG_PIN + #elif X2_USE_ENDSTOP == _YDIAG_ + #define X2_MAX_PIN Y_DIAG_PIN + #elif X2_USE_ENDSTOP == _ZDIAG_ + #define X2_MAX_PIN Z_DIAG_PIN + #elif X2_USE_ENDSTOP == _E0DIAG_ + #define X2_MAX_PIN E0_DIAG_PIN + #elif X2_USE_ENDSTOP == _E1DIAG_ + #define X2_MAX_PIN E1_DIAG_PIN + #elif X2_USE_ENDSTOP == _E2DIAG_ + #define X2_MAX_PIN E2_DIAG_PIN + #elif X2_USE_ENDSTOP == _E3DIAG_ + #define X2_MAX_PIN E3_DIAG_PIN + #elif X2_USE_ENDSTOP == _E4DIAG_ + #define X2_MAX_PIN E4_DIAG_PIN + #elif X2_USE_ENDSTOP == _E5DIAG_ + #define X2_MAX_PIN E5_DIAG_PIN + #elif X2_USE_ENDSTOP == _E6DIAG_ + #define X2_MAX_PIN E6_DIAG_PIN + #elif X2_USE_ENDSTOP == _E7DIAG_ + #define X2_MAX_PIN E7_DIAG_PIN + #endif + #endif + #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 + #elif X2_USE_ENDSTOP == _XMAX_ + #define X2_MIN_PIN X_MAX_PIN + #elif X2_USE_ENDSTOP == _YMIN_ + #define X2_MIN_PIN Y_MIN_PIN + #elif X2_USE_ENDSTOP == _YMAX_ + #define X2_MIN_PIN Y_MAX_PIN + #elif X2_USE_ENDSTOP == _ZMIN_ + #define X2_MIN_PIN Z_MIN_PIN + #elif X2_USE_ENDSTOP == _ZMAX_ + #define X2_MIN_PIN Z_MAX_PIN + #elif X2_USE_ENDSTOP == _XDIAG_ + #define X2_MIN_PIN X_DIAG_PIN + #elif X2_USE_ENDSTOP == _YDIAG_ + #define X2_MIN_PIN Y_DIAG_PIN + #elif X2_USE_ENDSTOP == _ZDIAG_ + #define X2_MIN_PIN Z_DIAG_PIN + #elif X2_USE_ENDSTOP == _E0DIAG_ + #define X2_MIN_PIN E0_DIAG_PIN + #elif X2_USE_ENDSTOP == _E1DIAG_ + #define X2_MIN_PIN E1_DIAG_PIN + #elif X2_USE_ENDSTOP == _E2DIAG_ + #define X2_MIN_PIN E2_DIAG_PIN + #elif X2_USE_ENDSTOP == _E3DIAG_ + #define X2_MIN_PIN E3_DIAG_PIN + #elif X2_USE_ENDSTOP == _E4DIAG_ + #define X2_MIN_PIN E4_DIAG_PIN + #elif X2_USE_ENDSTOP == _E5DIAG_ + #define X2_MIN_PIN E5_DIAG_PIN + #elif X2_USE_ENDSTOP == _E6DIAG_ + #define X2_MIN_PIN E6_DIAG_PIN + #elif X2_USE_ENDSTOP == _E7DIAG_ + #define X2_MIN_PIN E7_DIAG_PIN + #endif + #endif + #ifndef X2_MAX_ENDSTOP_INVERTING + #define X2_MAX_ENDSTOP_INVERTING false + #endif + #endif +#endif + +/** + * Y_DUAL_ENDSTOPS endstop reassignment + */ +#if ENABLED(Y_DUAL_ENDSTOPS) + #if Y_HOME_DIR > 0 + #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_ + #define Y2_MAX_PIN X_MIN_PIN + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MAX_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MAX_PIN Y_MIN_PIN + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MAX_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MAX_PIN Z_MIN_PIN + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MAX_PIN Z_MAX_PIN + #elif Y2_USE_ENDSTOP == _XDIAG_ + #define Y2_MAX_PIN X_DIAG_PIN + #elif Y2_USE_ENDSTOP == _YDIAG_ + #define Y2_MAX_PIN Y_DIAG_PIN + #elif Y2_USE_ENDSTOP == _ZDIAG_ + #define Y2_MAX_PIN Z_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E0DIAG_ + #define Y2_MAX_PIN E0_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E1DIAG_ + #define Y2_MAX_PIN E1_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E2DIAG_ + #define Y2_MAX_PIN E2_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E3DIAG_ + #define Y2_MAX_PIN E3_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E4DIAG_ + #define Y2_MAX_PIN E4_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E5DIAG_ + #define Y2_MAX_PIN E5_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E6DIAG_ + #define Y2_MAX_PIN E6_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E7DIAG_ + #define Y2_MAX_PIN E7_DIAG_PIN + #endif + #endif + #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 + #elif Y2_USE_ENDSTOP == _XMAX_ + #define Y2_MIN_PIN X_MAX_PIN + #elif Y2_USE_ENDSTOP == _YMIN_ + #define Y2_MIN_PIN Y_MIN_PIN + #elif Y2_USE_ENDSTOP == _YMAX_ + #define Y2_MIN_PIN Y_MAX_PIN + #elif Y2_USE_ENDSTOP == _ZMIN_ + #define Y2_MIN_PIN Z_MIN_PIN + #elif Y2_USE_ENDSTOP == _ZMAX_ + #define Y2_MIN_PIN Z_MAX_PIN + #elif Y2_USE_ENDSTOP == _XDIAG_ + #define Y2_MIN_PIN X_DIAG_PIN + #elif Y2_USE_ENDSTOP == _YDIAG_ + #define Y2_MIN_PIN Y_DIAG_PIN + #elif Y2_USE_ENDSTOP == _ZDIAG_ + #define Y2_MIN_PIN Z_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E0DIAG_ + #define Y2_MIN_PIN E0_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E1DIAG_ + #define Y2_MIN_PIN E1_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E2DIAG_ + #define Y2_MIN_PIN E2_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E3DIAG_ + #define Y2_MIN_PIN E3_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E4DIAG_ + #define Y2_MIN_PIN E4_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E5DIAG_ + #define Y2_MIN_PIN E5_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E6DIAG_ + #define Y2_MIN_PIN E6_DIAG_PIN + #elif Y2_USE_ENDSTOP == _E7DIAG_ + #define Y2_MIN_PIN E7_DIAG_PIN + #endif + #endif + #ifndef Y2_MAX_ENDSTOP_INVERTING + #define Y2_MAX_ENDSTOP_INVERTING false + #endif + #endif +#endif + +/** + * Z_MULTI_ENDSTOPS endstop reassignment + */ +#if ENABLED(Z_MULTI_ENDSTOPS) + + #if Z_HOME_DIR > 0 + #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_ + #define Z2_MAX_PIN X_MIN_PIN + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MAX_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MAX_PIN Y_MIN_PIN + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MAX_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MAX_PIN Z_MIN_PIN + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MAX_PIN Z_MAX_PIN + #elif Z2_USE_ENDSTOP == _XDIAG_ + #define Z2_MAX_PIN X_DIAG_PIN + #elif Z2_USE_ENDSTOP == _YDIAG_ + #define Z2_MAX_PIN Y_DIAG_PIN + #elif Z2_USE_ENDSTOP == _ZDIAG_ + #define Z2_MAX_PIN Z_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E0DIAG_ + #define Z2_MAX_PIN E0_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E1DIAG_ + #define Z2_MAX_PIN E1_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E2DIAG_ + #define Z2_MAX_PIN E2_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E3DIAG_ + #define Z2_MAX_PIN E3_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E4DIAG_ + #define Z2_MAX_PIN E4_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E5DIAG_ + #define Z2_MAX_PIN E5_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E6DIAG_ + #define Z2_MAX_PIN E6_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E7DIAG_ + #define Z2_MAX_PIN E7_DIAG_PIN + #endif + #endif + #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 + #elif Z2_USE_ENDSTOP == _XMAX_ + #define Z2_MIN_PIN X_MAX_PIN + #elif Z2_USE_ENDSTOP == _YMIN_ + #define Z2_MIN_PIN Y_MIN_PIN + #elif Z2_USE_ENDSTOP == _YMAX_ + #define Z2_MIN_PIN Y_MAX_PIN + #elif Z2_USE_ENDSTOP == _ZMIN_ + #define Z2_MIN_PIN Z_MIN_PIN + #elif Z2_USE_ENDSTOP == _ZMAX_ + #define Z2_MIN_PIN Z_MAX_PIN + #elif Z2_USE_ENDSTOP == _XDIAG_ + #define Z2_MIN_PIN X_DIAG_PIN + #elif Z2_USE_ENDSTOP == _YDIAG_ + #define Z2_MIN_PIN Y_DIAG_PIN + #elif Z2_USE_ENDSTOP == _ZDIAG_ + #define Z2_MIN_PIN Z_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E0DIAG_ + #define Z2_MIN_PIN E0_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E1DIAG_ + #define Z2_MIN_PIN E1_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E2DIAG_ + #define Z2_MIN_PIN E2_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E3DIAG_ + #define Z2_MIN_PIN E3_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E4DIAG_ + #define Z2_MIN_PIN E4_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E5DIAG_ + #define Z2_MIN_PIN E5_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E6DIAG_ + #define Z2_MIN_PIN E6_DIAG_PIN + #elif Z2_USE_ENDSTOP == _E7DIAG_ + #define Z2_MIN_PIN E7_DIAG_PIN + #endif + #endif + #ifndef Z2_MAX_ENDSTOP_INVERTING + #define Z2_MAX_ENDSTOP_INVERTING false + #endif + #endif + + #if NUM_Z_STEPPER_DRIVERS >= 3 + #if Z_HOME_DIR > 0 + #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_ + #define Z3_MAX_PIN X_MIN_PIN + #elif Z3_USE_ENDSTOP == _XMAX_ + #define Z3_MAX_PIN X_MAX_PIN + #elif Z3_USE_ENDSTOP == _YMIN_ + #define Z3_MAX_PIN Y_MIN_PIN + #elif Z3_USE_ENDSTOP == _YMAX_ + #define Z3_MAX_PIN Y_MAX_PIN + #elif Z3_USE_ENDSTOP == _ZMIN_ + #define Z3_MAX_PIN Z_MIN_PIN + #elif Z3_USE_ENDSTOP == _ZMAX_ + #define Z3_MAX_PIN Z_MAX_PIN + #elif Z3_USE_ENDSTOP == _XDIAG_ + #define Z3_MAX_PIN X_DIAG_PIN + #elif Z3_USE_ENDSTOP == _YDIAG_ + #define Z3_MAX_PIN Y_DIAG_PIN + #elif Z3_USE_ENDSTOP == _ZDIAG_ + #define Z3_MAX_PIN Z_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E0DIAG_ + #define Z3_MAX_PIN E0_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E1DIAG_ + #define Z3_MAX_PIN E1_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E2DIAG_ + #define Z3_MAX_PIN E2_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E3DIAG_ + #define Z3_MAX_PIN E3_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E4DIAG_ + #define Z3_MAX_PIN E4_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E5DIAG_ + #define Z3_MAX_PIN E5_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E6DIAG_ + #define Z3_MAX_PIN E6_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E7DIAG_ + #define Z3_MAX_PIN E7_DIAG_PIN + #endif + #endif + #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 + #elif Z3_USE_ENDSTOP == _XMAX_ + #define Z3_MIN_PIN X_MAX_PIN + #elif Z3_USE_ENDSTOP == _YMIN_ + #define Z3_MIN_PIN Y_MIN_PIN + #elif Z3_USE_ENDSTOP == _YMAX_ + #define Z3_MIN_PIN Y_MAX_PIN + #elif Z3_USE_ENDSTOP == _ZMIN_ + #define Z3_MIN_PIN Z_MIN_PIN + #elif Z3_USE_ENDSTOP == _ZMAX_ + #define Z3_MIN_PIN Z_MAX_PIN + #elif Z3_USE_ENDSTOP == _XDIAG_ + #define Z3_MIN_PIN X_DIAG_PIN + #elif Z3_USE_ENDSTOP == _YDIAG_ + #define Z3_MIN_PIN Y_DIAG_PIN + #elif Z3_USE_ENDSTOP == _ZDIAG_ + #define Z3_MIN_PIN Z_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E0DIAG_ + #define Z3_MIN_PIN E0_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E1DIAG_ + #define Z3_MIN_PIN E1_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E2DIAG_ + #define Z3_MIN_PIN E2_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E3DIAG_ + #define Z3_MIN_PIN E3_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E4DIAG_ + #define Z3_MIN_PIN E4_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E5DIAG_ + #define Z3_MIN_PIN E5_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E6DIAG_ + #define Z3_MIN_PIN E6_DIAG_PIN + #elif Z3_USE_ENDSTOP == _E7DIAG_ + #define Z3_MIN_PIN E7_DIAG_PIN + #endif + #endif + #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 + #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_ + #define Z4_MAX_PIN X_MIN_PIN + #elif Z4_USE_ENDSTOP == _XMAX_ + #define Z4_MAX_PIN X_MAX_PIN + #elif Z4_USE_ENDSTOP == _YMIN_ + #define Z4_MAX_PIN Y_MIN_PIN + #elif Z4_USE_ENDSTOP == _YMAX_ + #define Z4_MAX_PIN Y_MAX_PIN + #elif Z4_USE_ENDSTOP == _ZMIN_ + #define Z4_MAX_PIN Z_MIN_PIN + #elif Z4_USE_ENDSTOP == _ZMAX_ + #define Z4_MAX_PIN Z_MAX_PIN + #elif Z4_USE_ENDSTOP == _XDIAG_ + #define Z4_MAX_PIN X_DIAG_PIN + #elif Z4_USE_ENDSTOP == _YDIAG_ + #define Z4_MAX_PIN Y_DIAG_PIN + #elif Z4_USE_ENDSTOP == _ZDIAG_ + #define Z4_MAX_PIN Z_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E0DIAG_ + #define Z4_MAX_PIN E0_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E1DIAG_ + #define Z4_MAX_PIN E1_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E2DIAG_ + #define Z4_MAX_PIN E2_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E3DIAG_ + #define Z4_MAX_PIN E3_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E4DIAG_ + #define Z4_MAX_PIN E4_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E5DIAG_ + #define Z4_MAX_PIN E5_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E6DIAG_ + #define Z4_MAX_PIN E6_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E7DIAG_ + #define Z4_MAX_PIN E7_DIAG_PIN + #endif + #endif + #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 + #elif Z4_USE_ENDSTOP == _XMAX_ + #define Z4_MIN_PIN X_MAX_PIN + #elif Z4_USE_ENDSTOP == _YMIN_ + #define Z4_MIN_PIN Y_MIN_PIN + #elif Z4_USE_ENDSTOP == _YMAX_ + #define Z4_MIN_PIN Y_MAX_PIN + #elif Z4_USE_ENDSTOP == _ZMIN_ + #define Z4_MIN_PIN Z_MIN_PIN + #elif Z4_USE_ENDSTOP == _ZMAX_ + #define Z4_MIN_PIN Z_MAX_PIN + #elif Z4_USE_ENDSTOP == _XDIAG_ + #define Z4_MIN_PIN X_DIAG_PIN + #elif Z4_USE_ENDSTOP == _YDIAG_ + #define Z4_MIN_PIN Y_DIAG_PIN + #elif Z4_USE_ENDSTOP == _ZDIAG_ + #define Z4_MIN_PIN Z_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E0DIAG_ + #define Z4_MIN_PIN E0_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E1DIAG_ + #define Z4_MIN_PIN E1_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E2DIAG_ + #define Z4_MIN_PIN E2_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E3DIAG_ + #define Z4_MIN_PIN E3_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E4DIAG_ + #define Z4_MIN_PIN E4_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E5DIAG_ + #define Z4_MIN_PIN E5_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E6DIAG_ + #define Z4_MIN_PIN E6_DIAG_PIN + #elif Z4_USE_ENDSTOP == _E7DIAG_ + #define Z4_MIN_PIN E7_DIAG_PIN + #endif + #endif + #ifndef Z4_MAX_ENDSTOP_INVERTING + #define Z4_MAX_ENDSTOP_INVERTING false + #endif + #endif + #endif + +#endif // Z_MULTI_ENDSTOPS + +/** + * Set ENDSTOPPULLUPS for active endstop switches + */ +#if ENABLED(ENDSTOPPULLUPS) + #if ENABLED(USE_XMAX_PLUG) + #define ENDSTOPPULLUP_XMAX + #endif + #if ENABLED(USE_YMAX_PLUG) + #define ENDSTOPPULLUP_YMAX + #endif + #if ENABLED(USE_ZMAX_PLUG) + #define ENDSTOPPULLUP_ZMAX + #endif + #if ENABLED(USE_XMIN_PLUG) + #define ENDSTOPPULLUP_XMIN + #endif + #if ENABLED(USE_YMIN_PLUG) + #define ENDSTOPPULLUP_YMIN + #endif + #if ENABLED(USE_ZMIN_PLUG) + #define ENDSTOPPULLUP_ZMIN + #endif +#endif + +/** + * Set ENDSTOPPULLDOWNS for active endstop switches + */ +#if ENABLED(ENDSTOPPULLDOWNS) + #if ENABLED(USE_XMAX_PLUG) + #define ENDSTOPPULLDOWN_XMAX + #endif + #if ENABLED(USE_YMAX_PLUG) + #define ENDSTOPPULLDOWN_YMAX + #endif + #if ENABLED(USE_ZMAX_PLUG) + #define ENDSTOPPULLDOWN_ZMAX + #endif + #if ENABLED(USE_XMIN_PLUG) + #define ENDSTOPPULLDOWN_XMIN + #endif + #if ENABLED(USE_YMIN_PLUG) + #define ENDSTOPPULLDOWN_YMIN + #endif + #if ENABLED(USE_ZMIN_PLUG) + #define ENDSTOPPULLDOWN_ZMIN + #endif +#endif + +/** + * Shorthand for pin tests, used wherever needed + */ + +// Steppers +#if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) + #define HAS_X_ENABLE 1 +#endif +#if PIN_EXISTS(X_DIR) + #define HAS_X_DIR 1 +#endif +#if PIN_EXISTS(X_STEP) + #define HAS_X_STEP 1 +#endif +#if PIN_EXISTS(X_MS1) + #define HAS_X_MS_PINS 1 +#endif + +#if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) + #define HAS_X2_ENABLE 1 +#endif +#if PIN_EXISTS(X2_DIR) + #define HAS_X2_DIR 1 +#endif +#if PIN_EXISTS(X2_STEP) + #define HAS_X2_STEP 1 +#endif +#if PIN_EXISTS(X2_MS1) + #define HAS_X2_MS_PINS 1 +#endif + +#if PIN_EXISTS(Y_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y)) + #define HAS_Y_ENABLE 1 +#endif +#if PIN_EXISTS(Y_DIR) + #define HAS_Y_DIR 1 +#endif +#if PIN_EXISTS(Y_STEP) + #define HAS_Y_STEP 1 +#endif +#if PIN_EXISTS(Y_MS1) + #define HAS_Y_MS_PINS 1 +#endif + +#if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) + #define HAS_Y2_ENABLE 1 +#endif +#if PIN_EXISTS(Y2_DIR) + #define HAS_Y2_DIR 1 +#endif +#if PIN_EXISTS(Y2_STEP) + #define HAS_Y2_STEP 1 +#endif +#if PIN_EXISTS(Y2_MS1) + #define HAS_Y2_MS_PINS 1 +#endif + +#if PIN_EXISTS(Z_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z)) + #define HAS_Z_ENABLE 1 +#endif +#if PIN_EXISTS(Z_DIR) + #define HAS_Z_DIR 1 +#endif +#if PIN_EXISTS(Z_STEP) + #define HAS_Z_STEP 1 +#endif +#if PIN_EXISTS(Z_MS1) + #define HAS_Z_MS_PINS 1 +#endif + +#if PIN_EXISTS(Z2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)) + #define HAS_Z2_ENABLE 1 +#endif +#if PIN_EXISTS(Z2_DIR) + #define HAS_Z2_DIR 1 +#endif +#if PIN_EXISTS(Z2_STEP) + #define HAS_Z2_STEP 1 +#endif +#if PIN_EXISTS(Z2_MS1) + #define HAS_Z2_MS_PINS 1 +#endif + +#if PIN_EXISTS(Z3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z3)) + #define HAS_Z3_ENABLE 1 +#endif +#if PIN_EXISTS(Z3_DIR) + #define HAS_Z3_DIR 1 +#endif +#if PIN_EXISTS(Z3_STEP) + #define HAS_Z3_STEP 1 +#endif +#if PIN_EXISTS(Z3_MS1) + #define HAS_Z3_MS_PINS 1 +#endif + +#if PIN_EXISTS(Z4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z4)) + #define HAS_Z4_ENABLE 1 +#endif +#if PIN_EXISTS(Z4_DIR) + #define HAS_Z4_DIR 1 +#endif +#if PIN_EXISTS(Z4_STEP) + #define HAS_Z4_STEP 1 +#endif +#if PIN_EXISTS(Z4_MS1) + #define HAS_Z4_MS_PINS 1 +#endif + +// Extruder steppers and solenoids +#if PIN_EXISTS(E0_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)) + #define HAS_E0_ENABLE 1 +#endif +#if PIN_EXISTS(E0_DIR) + #define HAS_E0_DIR 1 +#endif +#if PIN_EXISTS(E0_STEP) + #define HAS_E0_STEP 1 +#endif +#if PIN_EXISTS(E0_MS1) + #define HAS_E0_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL0) + #define HAS_SOLENOID_0 1 +#endif + +#if PIN_EXISTS(E1_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) + #define HAS_E1_ENABLE 1 +#endif +#if PIN_EXISTS(E1_DIR) + #define HAS_E1_DIR 1 +#endif +#if PIN_EXISTS(E1_STEP) + #define HAS_E1_STEP 1 +#endif +#if PIN_EXISTS(E1_MS1) + #define HAS_E1_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL1) + #define HAS_SOLENOID_1 1 +#endif + +#if PIN_EXISTS(E2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)) + #define HAS_E2_ENABLE 1 +#endif +#if PIN_EXISTS(E2_DIR) + #define HAS_E2_DIR 1 +#endif +#if PIN_EXISTS(E2_STEP) + #define HAS_E2_STEP 1 +#endif +#if PIN_EXISTS(E2_MS1) + #define HAS_E2_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL2) + #define HAS_SOLENOID_2 1 +#endif + +#if PIN_EXISTS(E3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)) + #define HAS_E3_ENABLE 1 +#endif +#if PIN_EXISTS(E3_DIR) + #define HAS_E3_DIR 1 +#endif +#if PIN_EXISTS(E3_STEP) + #define HAS_E3_STEP 1 +#endif +#if PIN_EXISTS(E3_MS1) + #define HAS_E3_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL3) + #define HAS_SOLENOID_3 1 +#endif + +#if PIN_EXISTS(E4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)) + #define HAS_E4_ENABLE 1 +#endif +#if PIN_EXISTS(E4_DIR) + #define HAS_E4_DIR 1 +#endif +#if PIN_EXISTS(E4_STEP) + #define HAS_E4_STEP 1 +#endif +#if PIN_EXISTS(E4_MS1) + #define HAS_E4_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL4) + #define HAS_SOLENOID_4 1 +#endif + +#if PIN_EXISTS(E5_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)) + #define HAS_E5_ENABLE 1 +#endif +#if PIN_EXISTS(E5_DIR) + #define HAS_E5_DIR 1 +#endif +#if PIN_EXISTS(E5_STEP) + #define HAS_E5_STEP 1 +#endif +#if PIN_EXISTS(E5_MS1) + #define HAS_E5_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL5) + #define HAS_SOLENOID_5 1 +#endif + +#if PIN_EXISTS(E6_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6)) + #define HAS_E6_ENABLE 1 +#endif +#if PIN_EXISTS(E6_DIR) + #define HAS_E6_DIR 1 +#endif +#if PIN_EXISTS(E6_STEP) + #define HAS_E6_STEP 1 +#endif +#if PIN_EXISTS(E6_MS1) + #define HAS_E6_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL6) + #define HAS_SOLENOID_6 1 +#endif + +#if PIN_EXISTS(E7_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7)) + #define HAS_E7_ENABLE 1 +#endif +#if PIN_EXISTS(E7_DIR) + #define HAS_E7_DIR 1 +#endif +#if PIN_EXISTS(E7_STEP) + #define HAS_E7_STEP 1 +#endif +#if PIN_EXISTS(E7_MS1) + #define HAS_E7_MS_PINS 1 +#endif +#if PIN_EXISTS(SOL7) + #define HAS_SOLENOID_7 1 +#endif + +// +// Trinamic Stepper Drivers +// + +#if HAS_TRINAMIC_CONFIG + #if ANY(STEALTHCHOP_XY, STEALTHCHOP_Z, STEALTHCHOP_E) + #define STEALTHCHOP_ENABLED 1 + #endif + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + #define USE_SENSORLESS 1 + #endif + // Disable Z axis sensorless homing if a probe is used to home the Z axis + #if HOMING_Z_WITH_PROBE + #undef Z_STALL_SENSITIVITY + #undef Z2_STALL_SENSITIVITY + #undef Z3_STALL_SENSITIVITY + #undef Z4_STALL_SENSITIVITY + #endif + #if defined(X_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X) + #define X_SENSORLESS 1 + #endif + #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) + #define X2_SENSORLESS 1 + #endif + #if defined(Y_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y) + #define Y_SENSORLESS 1 + #endif + #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) + #define Y2_SENSORLESS 1 + #endif + #if defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z) + #define Z_SENSORLESS 1 + #endif + #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) + #define Z2_SENSORLESS 1 + #endif + #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) + #define Z3_SENSORLESS 1 + #endif + #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) + #define Z4_SENSORLESS 1 + #endif + #if ENABLED(SPI_ENDSTOPS) + #define X_SPI_SENSORLESS X_SENSORLESS + #define Y_SPI_SENSORLESS Y_SENSORLESS + #define Z_SPI_SENSORLESS Z_SENSORLESS + #endif +#endif + +#if (HAS_E_DRIVER(TMC2660) \ + || ( E0_ENABLE_PIN != X_ENABLE_PIN && E1_ENABLE_PIN != X_ENABLE_PIN \ + && E0_ENABLE_PIN != Y_ENABLE_PIN && E1_ENABLE_PIN != Y_ENABLE_PIN ) ) + #define HAS_E_STEPPER_ENABLE 1 +#endif + +#if ANY_AXIS_HAS(HW_SERIAL) + #define HAS_TMC_HW_SERIAL 1 +#endif +#if ANY_AXIS_HAS(SW_SERIAL) + #define HAS_TMC_SW_SERIAL 1 +#endif + +// +// Endstops and bed probe +// + +// 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 == 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##_) +#define IS_Z3_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && Z3_USE_ENDSTOP == _##A##M##_) +#define IS_Z4_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && Z4_USE_ENDSTOP == _##A##M##_) + +#define _HAS_STOP(A,M) (PIN_EXISTS(A##_##M) && !IS_PROBE_PIN(A,M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_ENDSTOP(A,M) && !IS_Z3_ENDSTOP(A,M) && !IS_Z4_ENDSTOP(A,M)) +#if _HAS_STOP(X,MIN) + #define HAS_X_MIN 1 +#endif +#if _HAS_STOP(X,MAX) + #define HAS_X_MAX 1 +#endif +#if _HAS_STOP(Y,MIN) + #define HAS_Y_MIN 1 +#endif +#if _HAS_STOP(Y,MAX) + #define HAS_Y_MAX 1 +#endif +#if _HAS_STOP(Z,MIN) + #define HAS_Z_MIN 1 +#endif +#if _HAS_STOP(Z,MAX) + #define HAS_Z_MAX 1 +#endif +#if _HAS_STOP(X,STOP) + #define HAS_X_STOP 1 +#endif +#if _HAS_STOP(Y,STOP) + #define HAS_Y_STOP 1 +#endif +#if _HAS_STOP(Z,STOP) + #define HAS_Z_STOP 1 +#endif +#if PIN_EXISTS(X2_MIN) + #define HAS_X2_MIN 1 +#endif +#if PIN_EXISTS(X2_MAX) + #define HAS_X2_MAX 1 +#endif +#if PIN_EXISTS(Y2_MIN) + #define HAS_Y2_MIN 1 +#endif +#if PIN_EXISTS(Y2_MAX) + #define HAS_Y2_MAX 1 +#endif +#if PIN_EXISTS(Z2_MIN) + #define HAS_Z2_MIN 1 +#endif +#if PIN_EXISTS(Z2_MAX) + #define HAS_Z2_MAX 1 +#endif +#if PIN_EXISTS(Z3_MIN) + #define HAS_Z3_MIN 1 +#endif +#if PIN_EXISTS(Z3_MAX) + #define HAS_Z3_MAX 1 +#endif +#if PIN_EXISTS(Z4_MIN) + #define HAS_Z4_MIN 1 +#endif +#if PIN_EXISTS(Z4_MAX) + #define HAS_Z4_MAX 1 +#endif +#if HAS_CUSTOM_PROBE_PIN && PIN_EXISTS(Z_MIN_PROBE) + #define HAS_Z_MIN_PROBE_PIN 1 +#endif + +// +// ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) +// +#define HAS_ADC_TEST(P) (PIN_EXISTS(TEMP_##P) && TEMP_SENSOR_##P != 0 && DISABLED(HEATER_##P##_USES_MAX6675)) +#if HAS_ADC_TEST(0) + #define HAS_TEMP_ADC_0 1 +#endif +#if HAS_ADC_TEST(1) + #define HAS_TEMP_ADC_1 1 +#endif +#if HAS_ADC_TEST(2) + #define HAS_TEMP_ADC_2 1 +#endif +#if HAS_ADC_TEST(3) + #define HAS_TEMP_ADC_3 1 +#endif +#if HAS_ADC_TEST(4) + #define HAS_TEMP_ADC_4 1 +#endif +#if HAS_ADC_TEST(5) + #define HAS_TEMP_ADC_5 1 +#endif +#if HAS_ADC_TEST(6) + #define HAS_TEMP_ADC_6 1 +#endif +#if HAS_ADC_TEST(7) + #define HAS_TEMP_ADC_7 1 +#endif +#if HAS_ADC_TEST(BED) + #define HAS_TEMP_ADC_BED 1 +#endif +#if HAS_ADC_TEST(PROBE) + #define HAS_TEMP_ADC_PROBE 1 +#endif +#if HAS_ADC_TEST(CHAMBER) + #define HAS_TEMP_ADC_CHAMBER 1 +#endif + +#if HAS_HOTEND && EITHER(HAS_TEMP_ADC_0, HEATER_0_USES_MAX6675) + #define HAS_TEMP_HOTEND 1 +#endif +#define HAS_TEMP_BED HAS_TEMP_ADC_BED +#define HAS_TEMP_PROBE HAS_TEMP_ADC_PROBE +#define HAS_TEMP_CHAMBER HAS_TEMP_ADC_CHAMBER + +#if ENABLED(JOYSTICK) + #if PIN_EXISTS(JOY_X) + #define HAS_JOY_ADC_X 1 + #endif + #if PIN_EXISTS(JOY_Y) + #define HAS_JOY_ADC_Y 1 + #endif + #if PIN_EXISTS(JOY_Z) + #define HAS_JOY_ADC_Z 1 + #endif + #if PIN_EXISTS(JOY_EN) + #define HAS_JOY_ADC_EN 1 + #endif +#endif + +// Heaters +#if PIN_EXISTS(HEATER_0) + #define HAS_HEATER_0 1 +#endif +#if PIN_EXISTS(HEATER_1) + #define HAS_HEATER_1 1 +#endif +#if PIN_EXISTS(HEATER_2) + #define HAS_HEATER_2 1 +#endif +#if PIN_EXISTS(HEATER_3) + #define HAS_HEATER_3 1 +#endif +#if PIN_EXISTS(HEATER_4) + #define HAS_HEATER_4 1 +#endif +#if PIN_EXISTS(HEATER_5) + #define HAS_HEATER_5 1 +#endif +#if PIN_EXISTS(HEATER_6) + #define HAS_HEATER_6 1 +#endif +#if PIN_EXISTS(HEATER_7) + #define HAS_HEATER_7 1 +#endif +#if PIN_EXISTS(HEATER_BED) + #define HAS_HEATER_BED 1 +#endif + +// Shorthand for common combinations +#if HAS_TEMP_BED && HAS_HEATER_BED + #define HAS_HEATED_BED 1 + #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 +#endif +#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE + #define HAS_TEMP_SENSOR 1 +#endif +#if HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER) + #define HAS_HEATED_CHAMBER 1 +#endif + +// PID heating +#if !HAS_HEATED_BED + #undef PIDTEMPBED +#endif +#if EITHER(PIDTEMP, PIDTEMPBED) + #define HAS_PID_HEATING 1 +#endif +#if BOTH(PIDTEMP, PIDTEMPBED) + #define HAS_PID_FOR_BOTH 1 +#endif + +// Thermal protection +#if BOTH(HAS_HEATED_BED, THERMAL_PROTECTION_BED) + #define HAS_THERMALLY_PROTECTED_BED 1 +#endif +#if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 + #define WATCH_HOTENDS 1 +#endif +#if HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0 + #define WATCH_BED 1 +#endif +#if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0 + #define WATCH_CHAMBER 1 +#endif +#if (ENABLED(THERMAL_PROTECTION_HOTENDS) || !EXTRUDERS) \ + && (ENABLED(THERMAL_PROTECTION_BED) || !HAS_HEATED_BED) \ + && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) + #define THERMALLY_SAFE 1 +#endif + +// Auto fans +#if HAS_HOTEND && PIN_EXISTS(E0_AUTO_FAN) + #define HAS_AUTO_FAN_0 1 +#endif +#if HAS_MULTI_HOTEND && PIN_EXISTS(E1_AUTO_FAN) + #define HAS_AUTO_FAN_1 1 +#endif +#if HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN) + #define HAS_AUTO_FAN_2 1 +#endif +#if HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN) + #define HAS_AUTO_FAN_3 1 +#endif +#if HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN) + #define HAS_AUTO_FAN_4 1 +#endif +#if HOTENDS > 5 && PIN_EXISTS(E5_AUTO_FAN) + #define HAS_AUTO_FAN_5 1 +#endif +#if HOTENDS > 6 && PIN_EXISTS(E6_AUTO_FAN) + #define HAS_AUTO_FAN_6 1 +#endif +#if HOTENDS > 7 && PIN_EXISTS(E7_AUTO_FAN) + #define HAS_AUTO_FAN_7 1 +#endif +#if HAS_TEMP_CHAMBER && PIN_EXISTS(CHAMBER_AUTO_FAN) + #define HAS_AUTO_CHAMBER_FAN 1 +#endif + +#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN) + #define HAS_AUTO_FAN 1 +#endif +#define _FANOVERLAP(A,B) (A##_AUTO_FAN_PIN == E##B##_AUTO_FAN_PIN) +#if HAS_AUTO_FAN && (_FANOVERLAP(CHAMBER,0) || _FANOVERLAP(CHAMBER,1) || _FANOVERLAP(CHAMBER,2) || _FANOVERLAP(CHAMBER,3) || _FANOVERLAP(CHAMBER,4) || _FANOVERLAP(CHAMBER,5) || _FANOVERLAP(CHAMBER,6) || _FANOVERLAP(CHAMBER,7)) + #define AUTO_CHAMBER_IS_E 1 +#endif + +#if !HAS_TEMP_SENSOR + #undef AUTO_REPORT_TEMPERATURES +#endif +#if EITHER(AUTO_REPORT_TEMPERATURES, AUTO_REPORT_SD_STATUS) + #define HAS_AUTO_REPORTING 1 +#endif + +#if !HAS_AUTO_CHAMBER_FAN || AUTO_CHAMBER_IS_E + #undef AUTO_POWER_CHAMBER_FAN +#endif + +// 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 +#if _HAS_FAN(1) + #define HAS_FAN1 1 +#endif +#if _HAS_FAN(2) + #define HAS_FAN2 1 +#endif +#if _HAS_FAN(3) + #define HAS_FAN3 1 +#endif +#if _HAS_FAN(4) + #define HAS_FAN4 1 +#endif +#if _HAS_FAN(5) + #define HAS_FAN5 1 +#endif +#if _HAS_FAN(6) + #define HAS_FAN6 1 +#endif +#if _HAS_FAN(7) + #define HAS_FAN7 1 +#endif +#undef _NOT_E_AUTO +#undef _HAS_FAN +#if PIN_EXISTS(CONTROLLER_FAN) + #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 +#endif +#if PIN_EXISTS(SERVO1) && NUM_SERVOS > 1 + #define HAS_SERVO_1 1 +#endif +#if PIN_EXISTS(SERVO2) && NUM_SERVOS > 2 + #define HAS_SERVO_2 1 +#endif +#if PIN_EXISTS(SERVO3) && NUM_SERVOS > 3 + #define HAS_SERVO_3 1 +#endif +#if NUM_SERVOS > 0 + #define HAS_SERVOS 1 +#endif + +// Sensors +#if PIN_EXISTS(FILWIDTH) + #define HAS_FILAMENT_WIDTH_SENSOR 1 +#endif + +// User Interface +#if PIN_EXISTS(HOME) + #define HAS_HOME 1 +#endif +#if PIN_EXISTS(KILL) + #define HAS_KILL 1 +#endif +#if PIN_EXISTS(SUICIDE) + #define HAS_SUICIDE 1 +#endif +#if PIN_EXISTS(PHOTOGRAPH) + #define HAS_PHOTOGRAPH 1 +#endif + +// Digital control +#if PIN_EXISTS(STEPPER_RESET) + #define HAS_STEPPER_RESET 1 +#endif +#if PIN_EXISTS(DIGIPOTSS) + #define HAS_MOTOR_CURRENT_SPI 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) + #define HAS_MOTOR_CURRENT_PWM 1 +#endif + +#if ANY(HAS_Z_MS_PINS, HAS_Z2_MS_PINS, HAS_Z3_MS_PINS, HAS_Z4_MS_PINS) + #define HAS_SOME_Z_MS_PINS 1 +#endif +#if ANY(HAS_E0_MS_PINS, HAS_E1_MS_PINS, HAS_E2_MS_PINS, HAS_E3_MS_PINS, HAS_E4_MS_PINS, HAS_E5_MS_PINS, HAS_E6_MS_PINS, HAS_E7_MS_PINS) + #define HAS_SOME_E_MS_PINS 1 +#endif +#if ANY(HAS_X_MS_PINS, HAS_X2_MS_PINS, HAS_Y_MS_PINS, HAS_Y2_MS_PINS, HAS_SOME_Z_MS_PINS, HAS_SOME_E_MS_PINS) + #define HAS_MICROSTEPS 1 +#endif + +#if HAS_MICROSTEPS + + // MS1 MS2 MS3 Stepper Driver Microstepping mode table + #ifndef MICROSTEP1 + #define MICROSTEP1 LOW,LOW,LOW + #endif + #if ENABLED(HEROIC_STEPPER_DRIVERS) + #ifndef MICROSTEP128 + #define MICROSTEP128 LOW,HIGH,LOW + #endif + #else + #ifndef MICROSTEP2 + #define MICROSTEP2 HIGH,LOW,LOW + #endif + #ifndef MICROSTEP4 + #define MICROSTEP4 LOW,HIGH,LOW + #endif + #endif + #ifndef MICROSTEP8 + #define MICROSTEP8 HIGH,HIGH,LOW + #endif + #ifdef __SAM3X8E__ + #if MB(ALLIGATOR) + #ifndef MICROSTEP16 + #define MICROSTEP16 LOW,LOW,LOW + #endif + #ifndef MICROSTEP32 + #define MICROSTEP32 HIGH,HIGH,LOW + #endif + #else + #ifndef MICROSTEP16 + #define MICROSTEP16 HIGH,HIGH,LOW + #endif + #endif + #else + #ifndef MICROSTEP16 + #define MICROSTEP16 HIGH,HIGH,LOW + #endif + #endif + + #ifdef MICROSTEP1 + #define HAS_MICROSTEP1 1 + #endif + #ifdef MICROSTEP2 + #define HAS_MICROSTEP2 1 + #endif + #ifdef MICROSTEP4 + #define HAS_MICROSTEP4 1 + #endif + #ifdef MICROSTEP8 + #define HAS_MICROSTEP8 1 + #endif + #ifdef MICROSTEP16 + #define HAS_MICROSTEP16 1 + #endif + #ifdef MICROSTEP32 + #define HAS_MICROSTEP32 1 + #endif + #ifdef MICROSTEP64 + #define HAS_MICROSTEP64 1 + #endif + #ifdef MICROSTEP128 + #define HAS_MICROSTEP128 1 + #endif + +#endif // HAS_MICROSTEPS + +/** + * Heater signal inversion defaults + */ + +#if HAS_HEATER_0 && !defined(HEATER_0_INVERTING) + #define HEATER_0_INVERTING false +#endif +#if HAS_HEATER_1 && !defined(HEATER_1_INVERTING) + #define HEATER_1_INVERTING false +#endif +#if HAS_HEATER_2 && !defined(HEATER_2_INVERTING) + #define HEATER_2_INVERTING false +#endif +#if HAS_HEATER_3 && !defined(HEATER_3_INVERTING) + #define HEATER_3_INVERTING false +#endif +#if HAS_HEATER_4 && !defined(HEATER_4_INVERTING) + #define HEATER_4_INVERTING false +#endif +#if HAS_HEATER_5 && !defined(HEATER_5_INVERTING) + #define HEATER_5_INVERTING false +#endif +#if HAS_HEATER_6 && !defined(HEATER_6_INVERTING) + #define HEATER_6_INVERTING false +#endif +#if HAS_HEATER_7 && !defined(HEATER_7_INVERTING) + #define HEATER_7_INVERTING false +#endif + +/** + * Helper Macros for heaters and extruder fan + */ + +#define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, (v) ^ HEATER_0_INVERTING) +#if EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) + #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, (v) ^ HEATER_1_INVERTING) + #if HOTENDS > 2 + #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, (v) ^ HEATER_2_INVERTING) + #if HOTENDS > 3 + #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, (v) ^ HEATER_3_INVERTING) + #if HOTENDS > 4 + #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, (v) ^ HEATER_4_INVERTING) + #if HOTENDS > 5 + #define WRITE_HEATER_5(v) WRITE(HEATER_5_PIN, (v) ^ HEATER_5_INVERTING) + #if HOTENDS > 6 + #define WRITE_HEATER_6(v) WRITE(HEATER_6_PIN, (v) ^ HEATER_6_INVERTING) + #if HOTENDS > 7 + #define WRITE_HEATER_7(v) WRITE(HEATER_7_PIN, (v) ^ HEATER_7_INVERTING) + #endif // HOTENDS > 7 + #endif // HOTENDS > 6 + #endif // HOTENDS > 5 + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 +#endif // HAS_MULTI_HOTEND || HEATERS_PARALLEL +#if ENABLED(HEATERS_PARALLEL) + #define WRITE_HEATER_0(v) { WRITE_HEATER_0P(v); WRITE_HEATER_1(v); } +#else + #define WRITE_HEATER_0(v) WRITE_HEATER_0P(v) +#endif + +#ifndef MIN_POWER + #define MIN_POWER 0 +#endif + +/** + * Heated bed requires settings + */ +#if HAS_HEATED_BED + #ifndef MIN_BED_POWER + #define MIN_BED_POWER 0 + #endif + #ifndef MAX_BED_POWER + #define MAX_BED_POWER 255 + #endif + #ifndef HEATER_BED_INVERTING + #define HEATER_BED_INVERTING false + #endif + #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, (v) ^ HEATER_BED_INVERTING) +#endif + +/** + * Heated chamber requires settings + */ +#if HAS_HEATED_CHAMBER + #ifndef MAX_CHAMBER_POWER + #define MAX_CHAMBER_POWER 255 + #endif + #ifndef HEATER_CHAMBER_INVERTING + #define HEATER_CHAMBER_INVERTING false + #endif + #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) + #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 + +/** + * Up to 3 PWM fans + */ +#ifndef FAN_INVERTING + #define FAN_INVERTING false +#endif + +#if HAS_FAN7 + #define FAN_COUNT 8 +#elif HAS_FAN6 + #define FAN_COUNT 7 +#elif HAS_FAN5 + #define FAN_COUNT 6 +#elif HAS_FAN4 + #define FAN_COUNT 5 +#elif HAS_FAN3 + #define FAN_COUNT 4 +#elif HAS_FAN2 + #define FAN_COUNT 3 +#elif HAS_FAN1 + #define FAN_COUNT 2 +#elif HAS_FAN0 + #define FAN_COUNT 1 +#else + #define FAN_COUNT 0 +#endif + +#if FAN_COUNT > 0 + #define HAS_FAN 1 + #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING) +#endif + +/** + * Part Cooling fan multipliexer + */ +#if PIN_EXISTS(FANMUX0) + #define HAS_FANMUX 1 +#endif + +/** + * MIN/MAX fan PWM scaling + */ +#ifndef FAN_OFF_PWM + #define FAN_OFF_PWM 0 +#endif +#ifndef FAN_MIN_PWM + #if FAN_OFF_PWM > 0 + #define FAN_MIN_PWM (FAN_OFF_PWM + 1) + #else + #define FAN_MIN_PWM 0 + #endif +#endif +#ifndef FAN_MAX_PWM + #define FAN_MAX_PWM 255 +#endif +#if FAN_MIN_PWM < 0 || FAN_MIN_PWM > 255 + #error "FAN_MIN_PWM must be a value from 0 to 255." +#elif FAN_MAX_PWM < 0 || FAN_MAX_PWM > 255 + #error "FAN_MAX_PWM must be a value from 0 to 255." +#elif FAN_MIN_PWM > FAN_MAX_PWM + #error "FAN_MIN_PWM must be less than or equal to FAN_MAX_PWM." +#elif FAN_OFF_PWM > FAN_MIN_PWM + #error "FAN_OFF_PWM must be less than or equal to FAN_MIN_PWM." +#endif + +/** + * FAST PWM FAN Settings + */ +#if ENABLED(FAST_PWM_FAN) && !defined(FAST_PWM_FAN_FREQUENCY) + #define FAST_PWM_FAN_FREQUENCY ((F_CPU) / (2 * 255 * 1)) // Fan frequency default +#endif + +/** + * MIN/MAX case light PWM scaling + */ +#if ENABLED(CASE_LIGHT_ENABLE) + #ifndef CASE_LIGHT_MAX_PWM + #define CASE_LIGHT_MAX_PWM 255 + #elif !WITHIN(CASE_LIGHT_MAX_PWM, 1, 255) + #error "CASE_LIGHT_MAX_PWM must be a value from 1 to 255." + #endif +#endif + +/** + * Bed Probe dependencies + */ +#if HAS_BED_PROBE + #if BOTH(ENDSTOPPULLUPS, HAS_Z_MIN_PROBE_PIN) + #define ENDSTOPPULLUP_ZMIN_PROBE + #endif + #ifndef Z_PROBE_OFFSET_RANGE_MIN + #define Z_PROBE_OFFSET_RANGE_MIN -20 + #endif + #ifndef Z_PROBE_OFFSET_RANGE_MAX + #define Z_PROBE_OFFSET_RANGE_MAX 20 + #endif + #ifndef XY_PROBE_SPEED + #ifdef HOMING_FEEDRATE_XY + #define XY_PROBE_SPEED HOMING_FEEDRATE_XY + #else + #define XY_PROBE_SPEED 4000 + #endif + #endif + #ifndef NOZZLE_TO_PROBE_OFFSET + #define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 } + #endif +#else + #undef NOZZLE_TO_PROBE_OFFSET +#endif + +/** + * XYZ Bed Skew Correction + */ +#if ENABLED(SKEW_CORRECTION) + #define SKEW_FACTOR_MIN -1 + #define SKEW_FACTOR_MAX 1 + + #define _GET_SIDE(a,b,c) (SQRT(2*sq(a)+2*sq(b)-4*sq(c))*0.5) + #define _SKEW_SIDE(a,b,c) tan(M_PI*0.5-acos((sq(a)-sq(b)-sq(c))/(2*c*b))) + #define _SKEW_FACTOR(a,b,c) _SKEW_SIDE(float(a),_GET_SIDE(float(a),float(b),float(c)),float(c)) + + #ifndef XY_SKEW_FACTOR + #if defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD) + #define XY_SKEW_FACTOR _SKEW_FACTOR(XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD) + #else + #define XY_SKEW_FACTOR 0.0 + #endif + #endif + #ifndef XZ_SKEW_FACTOR + #if defined(XY_SIDE_AD) && !defined(XZ_SIDE_AD) + #define XZ_SIDE_AD XY_SIDE_AD + #endif + #if defined(XZ_DIAG_AC) && defined(XZ_DIAG_BD) && defined(XZ_SIDE_AD) + #define XZ_SKEW_FACTOR _SKEW_FACTOR(XZ_DIAG_AC, XZ_DIAG_BD, XZ_SIDE_AD) + #else + #define XZ_SKEW_FACTOR 0.0 + #endif + #endif + #ifndef YZ_SKEW_FACTOR + #if defined(YZ_DIAG_AC) && defined(YZ_DIAG_BD) && defined(YZ_SIDE_AD) + #define YZ_SKEW_FACTOR _SKEW_FACTOR(YZ_DIAG_AC, YZ_DIAG_BD, YZ_SIDE_AD) + #else + #define YZ_SKEW_FACTOR 0.0 + #endif + #endif +#endif // SKEW_CORRECTION + +/** + * Heater, Fan, and Probe interactions + */ +#if FAN_COUNT == 0 + #undef PROBING_FANS_OFF + #undef ADAPTIVE_FAN_SLOWING + #undef NO_FAN_SLOWING_IN_PID_TUNING +#endif + +#if HAS_BED_PROBE && (EITHER(PROBING_HEATERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0) + #define QUIET_PROBING 1 +#endif +#if EITHER(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF) + #define HEATER_IDLE_HANDLER 1 +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) && !defined(FILAMENT_CHANGE_SLOW_LOAD_LENGTH) + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 +#endif + +#if HAS_MULTI_EXTRUDER && !defined(TOOLCHANGE_FS_EXTRA_PRIME) + #define TOOLCHANGE_FS_EXTRA_PRIME 0 +#endif + +/** + * Only constrain Z on DELTA / SCARA machines + */ +#if IS_KINEMATIC + #undef MIN_SOFTWARE_ENDSTOP_X + #undef MIN_SOFTWARE_ENDSTOP_Y + #undef MAX_SOFTWARE_ENDSTOP_X + #undef MAX_SOFTWARE_ENDSTOP_Y +#endif + +/** + * Bed Probing bounds + */ + +#ifndef PROBING_MARGIN + #define PROBING_MARGIN 0 +#endif + +#if IS_KINEMATIC + #undef PROBING_MARGIN_LEFT + #undef PROBING_MARGIN_RIGHT + #undef PROBING_MARGIN_FRONT + #undef PROBING_MARGIN_BACK + #define PROBING_MARGIN_LEFT 0 + #define PROBING_MARGIN_RIGHT 0 + #define PROBING_MARGIN_FRONT 0 + #define PROBING_MARGIN_BACK 0 +#else + #ifndef PROBING_MARGIN_LEFT + #define PROBING_MARGIN_LEFT PROBING_MARGIN + #endif + #ifndef PROBING_MARGIN_RIGHT + #define PROBING_MARGIN_RIGHT PROBING_MARGIN + #endif + #ifndef PROBING_MARGIN_FRONT + #define PROBING_MARGIN_FRONT PROBING_MARGIN + #endif + #ifndef PROBING_MARGIN_BACK + #define PROBING_MARGIN_BACK PROBING_MARGIN + #endif +#endif + +#if ENABLED(DELTA) + /** + * Delta radius/rod trimmers/angle trimmers + */ + #ifndef DELTA_ENDSTOP_ADJ + #define DELTA_ENDSTOP_ADJ { 0, 0, 0 } + #endif + #ifndef DELTA_TOWER_ANGLE_TRIM + #define DELTA_TOWER_ANGLE_TRIM { 0, 0, 0 } + #endif + #ifndef DELTA_RADIUS_TRIM_TOWER + #define DELTA_RADIUS_TRIM_TOWER { 0, 0, 0 } + #endif + #ifndef DELTA_DIAGONAL_ROD_TRIM_TOWER + #define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0, 0, 0 } + #endif +#endif + +#if ENABLED(SEGMENT_LEVELED_MOVES) && !defined(LEVELED_SEGMENT_LENGTH) + #define LEVELED_SEGMENT_LENGTH 5 +#endif + +/** + * Default mesh area is an area with an inset margin on the print area. + */ +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + #if IS_KINEMATIC + // Probing points may be verified at compile time within the radius + // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(DELTA_PRINTABLE_RADIUS),"bad probe point!") + // so that may be added to SanityCheck.h in the future. + #define _MESH_MIN_X (X_MIN_BED + MESH_INSET) + #define _MESH_MIN_Y (Y_MIN_BED + MESH_INSET) + #define _MESH_MAX_X (X_MAX_BED - (MESH_INSET)) + #define _MESH_MAX_Y (Y_MAX_BED - (MESH_INSET)) + #else + // Boundaries for Cartesian probing based on set limits + #define _MESH_MIN_X (_MAX(X_MIN_BED + MESH_INSET, X_MIN_POS)) // UBL is careful not to probe off the bed. It does not + #define _MESH_MIN_Y (_MAX(Y_MIN_BED + MESH_INSET, Y_MIN_POS)) // need NOZZLE_TO_PROBE_OFFSET in the mesh dimensions + #define _MESH_MAX_X (_MIN(X_MAX_BED - (MESH_INSET), X_MAX_POS)) + #define _MESH_MAX_Y (_MIN(Y_MAX_BED - (MESH_INSET), Y_MAX_POS)) + #endif + + // These may be overridden in Configuration.h if a smaller area is desired + #ifndef MESH_MIN_X + #define MESH_MIN_X _MESH_MIN_X + #endif + #ifndef MESH_MIN_Y + #define MESH_MIN_Y _MESH_MIN_Y + #endif + #ifndef MESH_MAX_X + #define MESH_MAX_X _MESH_MAX_X + #endif + #ifndef MESH_MAX_Y + #define MESH_MAX_Y _MESH_MAX_Y + #endif +#else + #undef MESH_MIN_X + #undef MESH_MIN_Y + #undef MESH_MAX_X + #undef MESH_MAX_Y +#endif + +#define _POINT_COUNT (defined(PROBE_PT_1_X) + defined(PROBE_PT_2_X) + defined(PROBE_PT_3_X) + defined(PROBE_PT_1_Y) + defined(PROBE_PT_2_Y) + defined(PROBE_PT_3_Y)) +#if _POINT_COUNT == 6 + #define HAS_FIXED_3POINT 1 +#elif _POINT_COUNT > 0 + #error "For 3-Point Leveling all XY points must be defined (or none for the defaults)." +#endif +#undef _POINT_COUNT + +/** + * Buzzer/Speaker + */ +#if PIN_EXISTS(BEEPER) || ANY(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) + #define HAS_BUZZER 1 + #if PIN_EXISTS(BEEPER) + #define USE_BEEPER 1 + #endif +#endif + +#if ENABLED(LCD_USE_I2C_BUZZER) + #ifndef LCD_FEEDBACK_FREQUENCY_HZ + #define LCD_FEEDBACK_FREQUENCY_HZ 1000 + #endif + #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS + #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 + #endif +#elif HAS_BUZZER + #ifndef LCD_FEEDBACK_FREQUENCY_HZ + #define LCD_FEEDBACK_FREQUENCY_HZ 5000 + #endif + #ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS + #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 + #endif +#endif + +#if HAS_BUZZER && LCD_FEEDBACK_FREQUENCY_DURATION_MS && LCD_FEEDBACK_FREQUENCY_HZ + #define HAS_CHIRP 1 +#endif + +/** + * Make sure DOGLCD_SCK and DOGLCD_MOSI are defined. + */ +#if HAS_MARLINUI_U8GLIB + #ifndef DOGLCD_SCK + #define DOGLCD_SCK SCK_PIN + #endif + #ifndef DOGLCD_MOSI + #define DOGLCD_MOSI MOSI_PIN + #endif +#endif + +/** + * Z_HOMING_HEIGHT / Z_CLEARANCE_BETWEEN_PROBES + */ +#ifndef Z_HOMING_HEIGHT + #ifdef Z_CLEARANCE_BETWEEN_PROBES + #define Z_HOMING_HEIGHT Z_CLEARANCE_BETWEEN_PROBES + #else + #define Z_HOMING_HEIGHT 0 + #endif +#endif + +#if PROBE_SELECTED + #ifndef Z_CLEARANCE_BETWEEN_PROBES + #define Z_CLEARANCE_BETWEEN_PROBES Z_HOMING_HEIGHT + #endif + #if Z_CLEARANCE_BETWEEN_PROBES > Z_HOMING_HEIGHT + #define MANUAL_PROBE_HEIGHT Z_CLEARANCE_BETWEEN_PROBES + #else + #define MANUAL_PROBE_HEIGHT Z_HOMING_HEIGHT + #endif + #ifndef Z_CLEARANCE_MULTI_PROBE + #define Z_CLEARANCE_MULTI_PROBE Z_CLEARANCE_BETWEEN_PROBES + #endif + #if ENABLED(BLTOUCH) && !defined(BLTOUCH_DELAY) + #define BLTOUCH_DELAY 500 + #endif +#endif + +#ifndef __SAM3X8E__ //todo: hal: broken hal encapsulation + #undef UI_VOLTAGE_LEVEL + #undef RADDS_DISPLAY + #undef MOTOR_CURRENT +#endif + +// Updated G92 behavior shifts the workspace +#if DISABLED(NO_WORKSPACE_OFFSETS) + #define HAS_POSITION_SHIFT 1 + #if IS_CARTESIAN + #define HAS_HOME_OFFSET 1 // The home offset also shifts the coordinate space + #define HAS_WORKSPACE_OFFSET 1 // Cumulative offset to workspace to save some calculation + #define HAS_M206_COMMAND 1 // M206 sets the home offset for Cartesian machines + #elif IS_SCARA + #define HAS_SCARA_OFFSET 1 // The SCARA home offset applies only on G28 + #endif +#endif + +// LCD timeout to status screen default is 15s +#ifndef LCD_TIMEOUT_TO_STATUS + #define LCD_TIMEOUT_TO_STATUS 15000 +#endif + +// Add commands that need sub-codes to this list +#if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY) + #define USE_GCODE_SUBCODES +#endif + +// Parking Extruder +#if ENABLED(PARKING_EXTRUDER) + #ifndef PARKING_EXTRUDER_GRAB_DISTANCE + #define PARKING_EXTRUDER_GRAB_DISTANCE 0 + #endif + #ifndef PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE HIGH + #endif +#endif + +// Number of VFAT entries used. Each entry has 13 UTF-16 characters +#if EITHER(SCROLL_LONG_FILENAMES, DWIN_CREALITY_LCD) + #define MAX_VFAT_ENTRIES (5) +#else + #define MAX_VFAT_ENTRIES (2) +#endif + +// Nozzle park for Delta +#if BOTH(NOZZLE_PARK_FEATURE, DELTA) + #undef NOZZLE_PARK_Z_FEEDRATE + #define NOZZLE_PARK_Z_FEEDRATE NOZZLE_PARK_XY_FEEDRATE +#endif + +// Force SDCARD_SORT_ALPHA to be enabled for Graphical LCD on LPC1768 +// on boards where SD card and LCD display share the same SPI bus +// because of a bug in the shared SPI implementation. (See #8122) +#if defined(TARGET_LPC1768) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && (SCK_PIN == LCD_PINS_D4) + #define SDCARD_SORT_ALPHA // Keep one directory level in RAM. Changing directory levels + // may still glitch the screen, but LCD updates clean it up. + #undef SDSORT_LIMIT + #undef SDSORT_USES_RAM + #undef SDSORT_USES_STACK + #undef SDSORT_CACHE_NAMES + #define SDSORT_LIMIT 64 + #define SDSORT_USES_RAM true + #define SDSORT_USES_STACK false + #define SDSORT_CACHE_NAMES true + #ifndef FOLDER_SORTING + #define FOLDER_SORTING -1 + #endif + #ifndef SDSORT_GCODE + #define SDSORT_GCODE false + #endif + #ifndef SDSORT_DYNAMIC_RAM + #define SDSORT_DYNAMIC_RAM false + #endif + #ifndef SDSORT_CACHE_VFATS + #define SDSORT_CACHE_VFATS 2 + #endif +#endif + +// Defined here to catch the above defines +#if ENABLED(SDCARD_SORT_ALPHA) && (FOLDER_SORTING || ENABLED(SDSORT_GCODE)) + #define HAS_FOLDER_SORTING 1 +#endif + +#if HAS_WIRED_LCD + // Get LCD character width/height, which may be overridden by pins, configs, etc. + #ifndef LCD_WIDTH + #if HAS_MARLINUI_U8GLIB + #define LCD_WIDTH 21 + #else + #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) + #endif + #endif + #ifndef LCD_HEIGHT + #if HAS_MARLINUI_U8GLIB + #define LCD_HEIGHT 5 + #else + #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) + #endif + #endif +#endif + +#if BUTTONS_EXIST(EN1, EN2, ENC) + #define HAS_ROTARY_ENCODER 1 +#endif + +#if !NUM_SERIAL + #undef BAUD_RATE_GCODE +#elif NUM_SERIAL > 1 + #define HAS_MULTI_SERIAL 1 +#endif diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h new file mode 100644 index 00000000..2eafa2b4 --- /dev/null +++ b/Marlin/src/inc/MarlinConfig.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 + +// +// Prefix header for all Marlin sources +// + +#include "MarlinConfigPre.h" + +#ifndef __MARLIN_DEPS__ + #include "../HAL/HAL.h" +#endif + +#include "../pins/pins.h" + +#ifndef __MARLIN_DEPS__ + #include HAL_PATH(../HAL, timers.h) + #include HAL_PATH(../HAL, spi_pins.h) +#endif + +#include "Conditionals_post.h" + +#ifndef __MARLIN_DEPS__ + + #include HAL_PATH(../HAL, inc/Conditionals_post.h) + + #include "../core/types.h" // Ahead of sanity-checks + + #include "SanityCheck.h" + #include HAL_PATH(../HAL, inc/SanityCheck.h) + + // Include all core headers + #include "../core/language.h" + #include "../core/utility.h" + #include "../core/serial.h" + +#endif diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h new file mode 100644 index 00000000..dfa0adba --- /dev/null +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -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 . + * + */ +#pragma once + +#ifndef __MARLIN_FIRMWARE__ +#define __MARLIN_FIRMWARE__ +#endif + +// +// Prefix header to acquire configurations +// +#include + +#ifndef __MARLIN_DEPS__ + #include "../HAL/platforms.h" +#endif + +#include "../core/boards.h" +#include "../core/macros.h" +#include "../../Configuration.h" + +#ifdef CUSTOM_VERSION_FILE + #if __has_include(STRINGIFY(../../CUSTOM_VERSION_FILE)) + #include STRINGIFY(../../CUSTOM_VERSION_FILE) + #endif +#endif + +#include "Version.h" + +#include "Conditionals_LCD.h" + +#ifndef __MARLIN_DEPS__ + #include HAL_PATH(../HAL, inc/Conditionals_LCD.h) +#endif + +#include "../core/drivers.h" +#include "../../Configuration_adv.h" + +#include "Conditionals_adv.h" + +#ifndef __MARLIN_DEPS__ + #include HAL_PATH(../HAL, inc/Conditionals_adv.h) +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h new file mode 100644 index 00000000..2cffde09 --- /dev/null +++ b/Marlin/src/inc/SanityCheck.h @@ -0,0 +1,3200 @@ +/** + * 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 + +/** + * SanityCheck.h + * + * Test configuration values for errors at compile-time. + */ + +/** + * Require gcc 4.7 or newer (first included with Arduino 1.6.8) for C++11 features. + */ +#if __cplusplus < 201103L + #error "Marlin requires C++11 support (gcc >= 4.7, Arduino IDE >= 1.6.8). Please upgrade your toolchain." +#endif + +// Make sure macros aren't borked +#define TEST1 +#define TEST2 1 +#define TEST3 0 +#define TEST4 true +#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) + #error "ENABLED is borked!" +#endif +#if BOTH(TEST0, TEST1) + #error "BOTH is borked!" +#endif +#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 NONE(TEST0, TEST1, TEST2, TEST4) || !NONE(TEST0, TEST3) + #error "NONE is borked!" +#endif +#undef TEST1 +#undef TEST2 +#undef TEST3 +#undef TEST4 + +/** + * We try our best to include sanity checks for all changed configuration + * directives because users have a tendency to use outdated config files with + * the bleeding-edge source code, but sometimes this is not enough. This check + * forces a minimum config file revision. Otherwise Marlin will not build. + */ +#define HEXIFY(H) _CAT(0x,H) +#if !defined(CONFIGURATION_H_VERSION) || HEXIFY(CONFIGURATION_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_H_VERSION) + #error "You are using an old Configuration.h file, update it before building Marlin." +#endif + +#if !defined(CONFIGURATION_ADV_H_VERSION) || HEXIFY(CONFIGURATION_ADV_H_VERSION) < HEXIFY(REQUIRED_CONFIGURATION_ADV_H_VERSION) + #error "You are using an old Configuration_adv.h file, update it before building Marlin." +#endif +#undef HEXIFY + +/** + * Warnings for old configurations + */ +#ifndef MOTHERBOARD + #error "MOTHERBOARD is required. Please update your configuration." +#elif !defined(X_BED_SIZE) || !defined(Y_BED_SIZE) + #error "X_BED_SIZE and Y_BED_SIZE are now required! Please update your configuration." +#elif WATCH_TEMP_PERIOD > 500 + #error "WATCH_TEMP_PERIOD now uses seconds instead of milliseconds." +#elif DISABLED(THERMAL_PROTECTION_HOTENDS) && (defined(WATCH_TEMP_PERIOD) || defined(THERMAL_PROTECTION_PERIOD)) + #error "Thermal Runaway Protection for hotends is now enabled with THERMAL_PROTECTION_HOTENDS." +#elif DISABLED(THERMAL_PROTECTION_BED) && defined(THERMAL_PROTECTION_BED_PERIOD) + #error "Thermal Runaway Protection for the bed is now enabled with THERMAL_PROTECTION_BED." +#elif (CORE_IS_XZ || CORE_IS_YZ) && ENABLED(Z_LATE_ENABLE) + #error "Z_LATE_ENABLE can't be used with COREXZ, COREZX, COREYZ, or COREZY." +#elif defined(X_HOME_RETRACT_MM) + #error "[XYZ]_HOME_RETRACT_MM settings have been renamed [XYZ]_HOME_BUMP_MM." +#elif defined(SDCARDDETECTINVERTED) + #error "SDCARDDETECTINVERTED is now SD_DETECT_STATE (HIGH). Please update your configuration." +#elif defined(SD_DETECT_INVERTED) + #error "SD_DETECT_INVERTED is now SD_DETECT_STATE (HIGH). Please update your configuration." +#elif defined(BTENABLED) + #error "BTENABLED is now BLUETOOTH. Please update your configuration." +#elif defined(CUSTOM_MENDEL_NAME) + #error "CUSTOM_MENDEL_NAME is now CUSTOM_MACHINE_NAME. Please update your configuration." +#elif defined(HAS_AUTOMATIC_VERSIONING) + #error "HAS_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." +#elif defined(USE_AUTOMATIC_VERSIONING) + #error "USE_AUTOMATIC_VERSIONING is now CUSTOM_VERSION_FILE. Please update your configuration." +#elif defined(SDSLOW) + #error "SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead." +#elif defined(SDEXTRASLOW) + #error "SDEXTRASLOW deprecated. Set SPI_SPEED to SPI_QUARTER_SPEED instead." +#elif defined(FILAMENT_SENSOR) + #error "FILAMENT_SENSOR is now FILAMENT_WIDTH_SENSOR. Please update your configuration." +#elif defined(ENDSTOPPULLUP_FIL_RUNOUT) + #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULLUP. Please update your configuration." +#elif defined(DISABLE_MAX_ENDSTOPS) || defined(DISABLE_MIN_ENDSTOPS) + #error "DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Use individual USE_*_PLUG options instead." +#elif defined(LANGUAGE_INCLUDE) + #error "LANGUAGE_INCLUDE has been replaced by LCD_LANGUAGE. Please update your configuration." +#elif defined(EXTRUDER_OFFSET_X) || defined(EXTRUDER_OFFSET_Y) + #error "EXTRUDER_OFFSET_[XY] is deprecated. Use HOTEND_OFFSET_[XY] instead." +#elif defined(PID_PARAMS_PER_EXTRUDER) + #error "PID_PARAMS_PER_EXTRUDER is deprecated. Use PID_PARAMS_PER_HOTEND instead." +#elif defined(EXTRUDER_WATTS) || defined(BED_WATTS) + #error "EXTRUDER_WATTS and BED_WATTS are deprecated. Remove them from your configuration." +#elif defined(SERVO_ENDSTOP_ANGLES) + #error "SERVO_ENDSTOP_ANGLES is deprecated. Use Z_SERVO_ANGLES instead." +#elif defined(X_ENDSTOP_SERVO_NR) || defined(Y_ENDSTOP_SERVO_NR) + #error "X_ENDSTOP_SERVO_NR and Y_ENDSTOP_SERVO_NR are deprecated and should be removed." +#elif defined(Z_ENDSTOP_SERVO_NR) + #error "Z_ENDSTOP_SERVO_NR is now Z_PROBE_SERVO_NR. Please update your configuration." +#elif defined(DEFAULT_XYJERK) + #error "DEFAULT_XYJERK is deprecated. Use DEFAULT_XJERK and DEFAULT_YJERK instead." +#elif defined(XY_TRAVEL_SPEED) + #error "XY_TRAVEL_SPEED is deprecated. Use XY_PROBE_SPEED instead." +#elif defined(PROBE_SERVO_DEACTIVATION_DELAY) + #error "PROBE_SERVO_DEACTIVATION_DELAY is deprecated. Use DEACTIVATE_SERVOS_AFTER_MOVE instead." +#elif defined(SERVO_DEACTIVATION_DELAY) + #error "SERVO_DEACTIVATION_DELAY is deprecated. Use SERVO_DELAY instead." +#elif ENABLED(FILAMENTCHANGEENABLE) + #error "FILAMENTCHANGEENABLE is now ADVANCED_PAUSE_FEATURE. Please update your configuration." +#elif ENABLED(FILAMENT_CHANGE_FEATURE) + #error "FILAMENT_CHANGE_FEATURE is now ADVANCED_PAUSE_FEATURE. Please update your configuration." +#elif defined(FILAMENT_CHANGE_X_POS) || defined(FILAMENT_CHANGE_Y_POS) + #error "FILAMENT_CHANGE_[XY]_POS is now set with NOZZLE_PARK_POINT. Please update your configuration." +#elif defined(FILAMENT_CHANGE_Z_ADD) + #error "FILAMENT_CHANGE_Z_ADD is now set with NOZZLE_PARK_POINT. Please update your configuration." +#elif defined(FILAMENT_CHANGE_XY_FEEDRATE) + #error "FILAMENT_CHANGE_XY_FEEDRATE is now NOZZLE_PARK_XY_FEEDRATE. Please update your configuration." +#elif defined(FILAMENT_CHANGE_Z_FEEDRATE) + #error "FILAMENT_CHANGE_Z_FEEDRATE is now NOZZLE_PARK_Z_FEEDRATE. Please update your configuration." +#elif defined(PAUSE_PARK_X_POS) || defined(PAUSE_PARK_Y_POS) + #error "PAUSE_PARK_[XY]_POS is now set with NOZZLE_PARK_POINT. Please update your configuration." +#elif defined(PAUSE_PARK_Z_ADD) + #error "PAUSE_PARK_Z_ADD is now set with NOZZLE_PARK_POINT. Please update your configuration." +#elif defined(PAUSE_PARK_XY_FEEDRATE) + #error "PAUSE_PARK_XY_FEEDRATE is now NOZZLE_PARK_XY_FEEDRATE. Please update your configuration." +#elif defined(PAUSE_PARK_Z_FEEDRATE) + #error "PAUSE_PARK_Z_FEEDRATE is now NOZZLE_PARK_Z_FEEDRATE. Please update your configuration." +#elif defined(FILAMENT_CHANGE_RETRACT_FEEDRATE) + #error "FILAMENT_CHANGE_RETRACT_FEEDRATE is now PAUSE_PARK_RETRACT_FEEDRATE. Please update your configuration." +#elif defined(FILAMENT_CHANGE_RETRACT_LENGTH) + #error "FILAMENT_CHANGE_RETRACT_LENGTH is now PAUSE_PARK_RETRACT_LENGTH. Please update your configuration." +#elif defined(FILAMENT_CHANGE_EXTRUDE_FEEDRATE) + #error "FILAMENT_CHANGE_EXTRUDE_FEEDRATE is now ADVANCED_PAUSE_PURGE_FEEDRATE. Please update your configuration." +#elif defined(ADVANCED_PAUSE_EXTRUDE_FEEDRATE) + #error "ADVANCED_PAUSE_EXTRUDE_FEEDRATE is now ADVANCED_PAUSE_PURGE_FEEDRATE. Please update your configuration." +#elif defined(FILAMENT_CHANGE_EXTRUDE_LENGTH) + #error "FILAMENT_CHANGE_EXTRUDE_LENGTH is now ADVANCED_PAUSE_PURGE_LENGTH. Please update your configuration." +#elif defined(ADVANCED_PAUSE_EXTRUDE_LENGTH) + #error "ADVANCED_PAUSE_EXTRUDE_LENGTH is now ADVANCED_PAUSE_PURGE_LENGTH. Please update your configuration." +#elif defined(FILAMENT_CHANGE_NOZZLE_TIMEOUT) + #error "FILAMENT_CHANGE_NOZZLE_TIMEOUT is now PAUSE_PARK_NOZZLE_TIMEOUT. Please update your configuration." +#elif defined(FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS) + #error "FILAMENT_CHANGE_NUMBER_OF_ALERT_BEEPS is now FILAMENT_CHANGE_ALERT_BEEPS. Please update your configuration." +#elif defined(FILAMENT_CHANGE_NO_STEPPER_TIMEOUT) + #error "FILAMENT_CHANGE_NO_STEPPER_TIMEOUT is now PAUSE_PARK_NO_STEPPER_TIMEOUT. Please update your configuration." +#elif defined(PLA_PREHEAT_HOTEND_TEMP) + #error "PLA_PREHEAT_HOTEND_TEMP is now PREHEAT_1_TEMP_HOTEND. Please update your configuration." +#elif defined(PLA_PREHEAT_HPB_TEMP) + #error "PLA_PREHEAT_HPB_TEMP is now PREHEAT_1_TEMP_BED. Please update your configuration." +#elif defined(PLA_PREHEAT_FAN_SPEED) + #error "PLA_PREHEAT_FAN_SPEED is now PREHEAT_1_FAN_SPEED. Please update your configuration." +#elif defined(ABS_PREHEAT_HOTEND_TEMP) + #error "ABS_PREHEAT_HOTEND_TEMP is now PREHEAT_2_TEMP_HOTEND. Please update your configuration." +#elif defined(ABS_PREHEAT_HPB_TEMP) + #error "ABS_PREHEAT_HPB_TEMP is now PREHEAT_2_TEMP_BED. Please update your configuration." +#elif defined(ABS_PREHEAT_FAN_SPEED) + #error "ABS_PREHEAT_FAN_SPEED is now PREHEAT_2_FAN_SPEED. Please update your configuration." +#elif defined(ENDSTOPS_ONLY_FOR_HOMING) + #error "ENDSTOPS_ONLY_FOR_HOMING is deprecated. Use (disable) ENDSTOPS_ALWAYS_ON_DEFAULT instead." +#elif defined(HOMING_FEEDRATE) + #error "HOMING_FEEDRATE is deprecated. Set individual rates with HOMING_FEEDRATE_(XY|Z|E) instead." +#elif defined(MANUAL_HOME_POSITIONS) + #error "MANUAL_HOME_POSITIONS is deprecated. Set MANUAL_[XYZ]_HOME_POS as-needed instead." +#elif defined(PID_ADD_EXTRUSION_RATE) + #error "PID_ADD_EXTRUSION_RATE is now PID_EXTRUSION_SCALING and is DISABLED by default. Are you sure you want to use this option? Please update your configuration." +#elif defined(Z_RAISE_BEFORE_HOMING) + #error "Z_RAISE_BEFORE_HOMING is now Z_HOMING_HEIGHT. Please update your configuration." +#elif defined(MIN_Z_HEIGHT_FOR_HOMING) + #error "MIN_Z_HEIGHT_FOR_HOMING is now Z_HOMING_HEIGHT. Please update your configuration." +#elif defined(Z_RAISE_BEFORE_PROBING) || defined(Z_RAISE_AFTER_PROBING) + #error "Z_RAISE_(BEFORE|AFTER)_PROBING are deprecated. Use Z_CLEARANCE_DEPLOY_PROBE and Z_AFTER_PROBING instead." +#elif defined(Z_RAISE_PROBE_DEPLOY_STOW) || defined(Z_RAISE_BETWEEN_PROBINGS) + #error "Z_RAISE_PROBE_DEPLOY_STOW and Z_RAISE_BETWEEN_PROBINGS are now Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES. Please update your configuration." +#elif defined(Z_PROBE_DEPLOY_HEIGHT) || defined(Z_PROBE_TRAVEL_HEIGHT) + #error "Z_PROBE_DEPLOY_HEIGHT and Z_PROBE_TRAVEL_HEIGHT are now Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES. Please update your configuration." +#elif defined(MANUAL_BED_LEVELING) + #error "MANUAL_BED_LEVELING is now LCD_BED_LEVELING. Please update your configuration." +#elif defined(MESH_HOME_SEARCH_Z) + #error "MESH_HOME_SEARCH_Z is now LCD_PROBE_Z_RANGE. Please update your configuration." +#elif defined(MANUAL_PROBE_Z_RANGE) + #error "MANUAL_PROBE_Z_RANGE is now LCD_PROBE_Z_RANGE. Please update your configuration." +#elif !defined(MIN_STEPS_PER_SEGMENT) + #error Please replace "const int dropsegments" with "#define MIN_STEPS_PER_SEGMENT" (and increase by 1) in Configuration_adv.h. +#elif MIN_STEPS_PER_SEGMENT <= 0 + #error "MIN_STEPS_PER_SEGMENT must be at least 1. Please update your Configuration_adv.h." +#elif defined(PREVENT_DANGEROUS_EXTRUDE) + #error "PREVENT_DANGEROUS_EXTRUDE is now PREVENT_COLD_EXTRUSION. Please update your configuration." +#elif defined(SCARA) + #error "SCARA is now MORGAN_SCARA. Please update your configuration." +#elif defined(ENABLE_AUTO_BED_LEVELING) + #error "ENABLE_AUTO_BED_LEVELING is deprecated. Specify AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_3POINT." +#elif defined(AUTO_BED_LEVELING_FEATURE) + #error "AUTO_BED_LEVELING_FEATURE is deprecated. Specify AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, or AUTO_BED_LEVELING_3POINT." +#elif defined(ABL_GRID_POINTS) + #error "ABL_GRID_POINTS is now GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y. Please update your configuration." +#elif defined(ABL_GRID_POINTS_X) || defined(ABL_GRID_POINTS_Y) + #error "ABL_GRID_POINTS_[XY] is now GRID_MAX_POINTS_[XY]. Please update your configuration." +#elif defined(ABL_GRID_MAX_POINTS_X) || defined(ABL_GRID_MAX_POINTS_Y) + #error "ABL_GRID_MAX_POINTS_[XY] is now GRID_MAX_POINTS_[XY]. Please update your configuration." +#elif defined(MESH_NUM_X_POINTS) || defined(MESH_NUM_Y_POINTS) + #error "MESH_NUM_[XY]_POINTS is now GRID_MAX_POINTS_[XY]. Please update your configuration." +#elif defined(UBL_MESH_NUM_X_POINTS) || defined(UBL_MESH_NUM_Y_POINTS) + #error "UBL_MESH_NUM_[XY]_POINTS is now GRID_MAX_POINTS_[XY]. Please update your configuration." +#elif defined(UBL_G26_MESH_VALIDATION) + #error "UBL_G26_MESH_VALIDATION is now G26_MESH_VALIDATION. Please update your configuration." +#elif defined(UBL_MESH_EDIT_ENABLED) + #error "UBL_MESH_EDIT_ENABLED is now G26_MESH_VALIDATION. Please update your configuration." +#elif defined(UBL_MESH_EDITING) + #error "UBL_MESH_EDITING is now G26_MESH_VALIDATION. Please update your configuration." +#elif defined(BLTOUCH_HEATERS_OFF) + #error "BLTOUCH_HEATERS_OFF is now PROBING_HEATERS_OFF. Please update your configuration." +#elif defined(BLTOUCH_V3) + #error "BLTOUCH_V3 is obsolete. Please update your configuration." +#elif defined(BLTOUCH_FORCE_OPEN_DRAIN_MODE) + #error "BLTOUCH_FORCE_OPEN_DRAIN_MODE is obsolete. Please update your configuration." +#elif defined(BEEPER) + #error "BEEPER is now BEEPER_PIN. Please update your pins definitions." +#elif defined(SDCARDDETECT) + #error "SDCARDDETECT is now SD_DETECT_PIN. Please update your pins definitions." +#elif defined(STAT_LED_RED) || defined(STAT_LED_BLUE) + #error "STAT_LED_RED/STAT_LED_BLUE are now STAT_LED_RED_PIN/STAT_LED_BLUE_PIN. Please update your pins definitions." +#elif defined(LCD_PIN_BL) + #error "LCD_PIN_BL is now LCD_BACKLIGHT_PIN. Please update your pins definitions." +#elif defined(LCD_PIN_RESET) + #error "LCD_PIN_RESET is now LCD_RESET_PIN. Please update your pins definitions." +#elif defined(EXTRUDER_0_AUTO_FAN_PIN) || defined(EXTRUDER_1_AUTO_FAN_PIN) || defined(EXTRUDER_2_AUTO_FAN_PIN) || defined(EXTRUDER_3_AUTO_FAN_PIN) + #error "EXTRUDER_[0123]_AUTO_FAN_PIN is now E[0123]_AUTO_FAN_PIN. Please update your Configuration_adv.h." +#elif defined(PID_FAN_SCALING) && !HAS_FAN + #error "PID_FAN_SCALING needs at least one fan enabled." +#elif defined(min_software_endstops) || defined(max_software_endstops) + #error "(min|max)_software_endstops are now (MIN|MAX)_SOFTWARE_ENDSTOPS. Please update your configuration." +#elif ENABLED(Z_PROBE_SLED) && defined(SLED_PIN) + #error "Replace SLED_PIN with SOL1_PIN (applies to both Z_PROBE_SLED and SOLENOID_PROBE)." +#elif defined(CONTROLLERFAN_PIN) + #error "CONTROLLERFAN_PIN is now CONTROLLER_FAN_PIN, enabled with USE_CONTROLLER_FAN. Please update your Configuration_adv.h." +#elif defined(CONTROLLERFAN_SPEED) + #error "CONTROLLERFAN_SPEED is now CONTROLLERFAN_SPEED_ACTIVE. Please update your Configuration_adv.h." +#elif defined(CONTROLLERFAN_SECS) + #error "CONTROLLERFAN_SECS is now CONTROLLERFAN_IDLE_TIME. Please update your Configuration_adv.h." +#elif defined(MIN_RETRACT) + #error "MIN_RETRACT is now MIN_AUTORETRACT and MAX_AUTORETRACT. Please update your Configuration_adv.h." +#elif defined(ADVANCE) + #error "ADVANCE was removed in Marlin 1.1.6. Please use LIN_ADVANCE." +#elif defined(LIN_ADVANCE_E_D_RATIO) + #error "LIN_ADVANCE (1.5) no longer uses LIN_ADVANCE_E_D_RATIO. Check your configuration." +#elif defined(NEOPIXEL_RGBW_LED) + #error "NEOPIXEL_RGBW_LED is now NEOPIXEL_LED. Please update your configuration." +#elif ENABLED(DELTA) && defined(DELTA_PROBEABLE_RADIUS) + #error "Remove DELTA_PROBEABLE_RADIUS and use PROBING_MARGIN to inset the probe area instead." +#elif ENABLED(DELTA) && defined(DELTA_CALIBRATION_RADIUS) + #error "Remove DELTA_CALIBRATION_RADIUS and use PROBING_MARGIN to inset the probe area instead." +#elif defined(UBL_MESH_INSET) + #error "UBL_MESH_INSET is now just MESH_INSET. Please update your configuration." +#elif defined(UBL_MESH_MIN_X) || defined(UBL_MESH_MIN_Y) || defined(UBL_MESH_MAX_X) || defined(UBL_MESH_MAX_Y) + #error "UBL_MESH_(MIN|MAX)_[XY] is now just MESH_(MIN|MAX)_[XY]. Please update your configuration." +#elif defined(ABL_PROBE_PT_1_X) || defined(ABL_PROBE_PT_1_Y) || defined(ABL_PROBE_PT_2_X) || defined(ABL_PROBE_PT_2_Y) || defined(ABL_PROBE_PT_3_X) || defined(ABL_PROBE_PT_3_Y) + #error "ABL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." +#elif defined(UBL_PROBE_PT_1_X) || defined(UBL_PROBE_PT_1_Y) || defined(UBL_PROBE_PT_2_X) || defined(UBL_PROBE_PT_2_Y) || defined(UBL_PROBE_PT_3_X) || defined(UBL_PROBE_PT_3_Y) + #error "UBL_PROBE_PT_[123]_[XY] is no longer required. Please remove it from Configuration.h." +#elif defined(MIN_PROBE_EDGE) + #error "MIN_PROBE_EDGE is now called PROBING_MARGIN. Please update your configuration." +#elif defined(MIN_PROBE_EDGE_LEFT) + #error "MIN_PROBE_EDGE_LEFT is now called PROBING_MARGIN_LEFT. Please update your configuration." +#elif defined(MIN_PROBE_EDGE_RIGHT) + #error "MIN_PROBE_EDGE_RIGHT is now called PROBING_MARGIN_RIGHT. Please update your configuration." +#elif defined(MIN_PROBE_EDGE_FRONT) + #error "MIN_PROBE_EDGE_FRONT is now called PROBING_MARGIN_FRONT. Please update your configuration." +#elif defined(MIN_PROBE_EDGE_BACK) + #error "MIN_PROBE_EDGE_BACK is now called PROBING_MARGIN_BACK. Please update your configuration." +#elif defined(LEFT_PROBE_BED_POSITION) + #error "LEFT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_LEFT instead." +#elif defined(RIGHT_PROBE_BED_POSITION) + #error "RIGHT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_RIGHT instead." +#elif defined(FRONT_PROBE_BED_POSITION) + #error "FRONT_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_FRONT instead." +#elif defined(BACK_PROBE_BED_POSITION) + #error "BACK_PROBE_BED_POSITION is obsolete. Set a margin with PROBING_MARGIN or PROBING_MARGIN_BACK instead." +#elif defined(ENABLE_MESH_EDIT_GFX_OVERLAY) + #error "ENABLE_MESH_EDIT_GFX_OVERLAY is now MESH_EDIT_GFX_OVERLAY. Please update your configuration." +#elif defined(BABYSTEP_ZPROBE_GFX_REVERSE) + #error "BABYSTEP_ZPROBE_GFX_REVERSE is now set by OVERLAY_GFX_REVERSE. Please update your configurations." +#elif defined(UBL_GRANULAR_SEGMENTATION_FOR_CARTESIAN) + #error "UBL_GRANULAR_SEGMENTATION_FOR_CARTESIAN is now SEGMENT_LEVELED_MOVES. Please update your configuration." +#elif HAS_PID_HEATING && (defined(K1) || !defined(PID_K1)) + #error "K1 is now PID_K1. Please update your configuration." +#elif defined(PROBE_DOUBLE_TOUCH) + #error "PROBE_DOUBLE_TOUCH is now MULTIPLE_PROBING. Please update your configuration." +#elif defined(ANET_KEYPAD_LCD) + #error "ANET_KEYPAD_LCD is now ZONESTAR_LCD. Please update your configuration." +#elif defined(LCD_I2C_SAINSMART_YWROBOT) + #error "LCD_I2C_SAINSMART_YWROBOT is now LCD_SAINSMART_I2C_(1602|2004). Please update your configuration." +#elif defined(MEASURED_LOWER_LIMIT) || defined(MEASURED_UPPER_LIMIT) + #error "MEASURED_(UPPER|LOWER)_LIMIT is now FILWIDTH_ERROR_MARGIN. Please update your configuration." +#elif defined(HAVE_TMCDRIVER) + #error "HAVE_TMCDRIVER is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." +#elif defined(STEALTHCHOP) + #error "STEALTHCHOP is now STEALTHCHOP_(XY|Z|E). Please update your Configuration_adv.h." +#elif defined(HAVE_TMC26X) + #error "HAVE_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." +#elif defined(HAVE_TMC2130) + #error "HAVE_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." +#elif defined(HAVE_TMC2208) + #error "HAVE_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." +#elif defined(HAVE_L6470DRIVER) + #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." +#elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \ + || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) || defined(E5_IS_TMC) || defined(E6_IS_TMC) || defined(E7_IS_TMC) + #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." +#elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) || defined(Z3_IS_TMC26X) \ + || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) || defined(E5_IS_TMC26X) || defined(E6_IS_TMC26X) || defined(E7_IS_TMC26X) + #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h." +#elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) || defined(Z3_IS_TMC2130) \ + || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) || defined(E5_IS_TMC2130) || defined(E6_IS_TMC2130) || defined(E7_IS_TMC2130) + #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h." +#elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) || defined(Z3_IS_TMC2208) \ + || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) || defined(E5_IS_TMC2208) || defined(E6_IS_TMC2208) || defined(E7_IS_TMC2208) + #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h." +#elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) || defined(Z3_IS_L6470) \ + || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) || defined(E5_IS_L6470) || defined(E6_IS_L6470) || defined(E7_IS_L6470) + #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h." +#elif defined(AUTOMATIC_CURRENT_CONTROL) + #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS. Please update your configuration." +#elif defined(FILAMENT_CHANGE_LOAD_LENGTH) + #error "FILAMENT_CHANGE_LOAD_LENGTH is now FILAMENT_CHANGE_FAST_LOAD_LENGTH. Please update your configuration." +#elif defined(LEVEL_CORNERS_INSET) + #error "LEVEL_CORNERS_INSET is now LEVEL_CORNERS_INSET_LFRB . Please update your Configuration.h." +#elif ENABLED(LEVEL_BED_CORNERS) && !defined(LEVEL_CORNERS_INSET_LFRB) + #error "LEVEL_BED_CORNERS requires LEVEL_CORNERS_INSET_LFRB values. Please update your Configuration.h." +#elif defined(BEZIER_JERK_CONTROL) + #error "BEZIER_JERK_CONTROL is now S_CURVE_ACCELERATION. Please update your configuration." +#elif HAS_JUNCTION_DEVIATION && defined(JUNCTION_DEVIATION_FACTOR) + #error "JUNCTION_DEVIATION_FACTOR is now JUNCTION_DEVIATION_MM. Please update your configuration." +#elif defined(JUNCTION_ACCELERATION_FACTOR) + #error "JUNCTION_ACCELERATION_FACTOR is obsolete. Delete it from Configuration_adv.h." +#elif defined(JUNCTION_ACCELERATION) + #error "JUNCTION_ACCELERATION is obsolete. Delete it from Configuration_adv.h." +#elif defined(MAX7219_DEBUG_STEPPER_HEAD) + #error "MAX7219_DEBUG_STEPPER_HEAD is now MAX7219_DEBUG_PLANNER_HEAD. Please update your configuration." +#elif defined(MAX7219_DEBUG_STEPPER_TAIL) + #error "MAX7219_DEBUG_STEPPER_TAIL is now MAX7219_DEBUG_PLANNER_TAIL. Please update your configuration." +#elif defined(MAX7219_DEBUG_STEPPER_QUEUE) + #error "MAX7219_DEBUG_STEPPER_QUEUE is now MAX7219_DEBUG_PLANNER_QUEUE. Please update your configuration." +#elif defined(ENDSTOP_NOISE_FILTER) + #error "ENDSTOP_NOISE_FILTER is now ENDSTOP_NOISE_THRESHOLD [2-7]. Please update your configuration." +#elif defined(RETRACT_ZLIFT) + #error "RETRACT_ZLIFT is now RETRACT_ZRAISE. Please update your Configuration_adv.h." +#elif defined(TOOLCHANGE_PARK_ZLIFT) || defined(TOOLCHANGE_UNPARK_ZLIFT) + #error "TOOLCHANGE_PARK_ZLIFT and TOOLCHANGE_UNPARK_ZLIFT are now TOOLCHANGE_ZRAISE. Please update your configuration." +#elif defined(SINGLENOZZLE_TOOLCHANGE_ZRAISE) + #error "SINGLENOZZLE_TOOLCHANGE_ZRAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." +#elif defined(SINGLENOZZLE_SWAP_LENGTH) + #error "SINGLENOZZLE_SWAP_LENGTH is now TOOLCHANGE_FIL_SWAP_LENGTH. Please update your configuration." +#elif defined(SINGLENOZZLE_SWAP_RETRACT_SPEED) + #error "SINGLENOZZLE_SWAP_RETRACT_SPEED is now TOOLCHANGE_FIL_SWAP_RETRACT_SPEED. Please update your configuration." +#elif defined(SINGLENOZZLE_SWAP_PRIME_SPEED) + #error "SINGLENOZZLE_SWAP_PRIME_SPEED is now TOOLCHANGE_FIL_SWAP_PRIME_SPEED. Please update your configuration." +#elif defined(SINGLENOZZLE_SWAP_PARK) + #error "SINGLENOZZLE_SWAP_PARK is now TOOLCHANGE_PARK. Please update your configuration." +#elif defined(SINGLENOZZLE_TOOLCHANGE_XY) + #error "SINGLENOZZLE_TOOLCHANGE_XY is now TOOLCHANGE_PARK_XY. Please update your configuration." +#elif defined(SINGLENOZZLE_PARK_XY_FEEDRATE) + #error "SINGLENOZZLE_PARK_XY_FEEDRATE is now TOOLCHANGE_PARK_XY_FEEDRATE. Please update your configuration." +#elif defined(PARKING_EXTRUDER_SECURITY_RAISE) + #error "PARKING_EXTRUDER_SECURITY_RAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." +#elif defined(SWITCHING_TOOLHEAD_SECURITY_RAISE) + #error "SWITCHING_TOOLHEAD_SECURITY_RAISE is now TOOLCHANGE_ZRAISE. Please update your configuration." +#elif defined(G0_FEEDRATE) && G0_FEEDRATE == 0 + #error "G0_FEEDRATE is now used to set the G0 feedrate. Please update your configuration." +#elif defined(MBL_Z_STEP) + #error "MBL_Z_STEP is now MESH_EDIT_Z_STEP. Please update your configuration." +#elif defined(CHDK) + #error "CHDK is now CHDK_PIN. Please update your Configuration_adv.h." +#elif defined(MAX6675_SS) + #error "MAX6675_SS is now MAX6675_SS_PIN. Please update your configuration and/or pins." +#elif defined(MAX6675_SS2) + #error "MAX6675_SS2 is now MAX6675_SS2_PIN. Please update your configuration and/or pins." +#elif defined(SPINDLE_LASER_ENABLE) + #error "SPINDLE_LASER_ENABLE is now SPINDLE_FEATURE or LASER_FEATURE. Please update your Configuration_adv.h." +#elif defined(SPINDLE_LASER_ENABLE_PIN) + #error "SPINDLE_LASER_ENABLE_PIN is now SPINDLE_LASER_ENA_PIN. Please update your Configuration_adv.h and/or pins." +#elif defined(SPINDLE_DIR_CHANGE) + #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_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) + #error "CHAMBER_HEATER_PIN is now HEATER_CHAMBER_PIN. Please update your configuration and/or pins." +#elif defined(TMC_Z_CALIBRATION) + #error "TMC_Z_CALIBRATION has been deprecated in favor of MECHANICAL_GANTRY_CALIBRATION. Please update your configuration." +#elif defined(Z_MIN_PROBE_ENDSTOP) + #error "Z_MIN_PROBE_ENDSTOP is no longer required. Please remove it from Configuration.h." +#elif defined(DUAL_NOZZLE_DUPLICATION_MODE) + #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION. Please update your configuration." +#elif defined(MENU_ITEM_CASE_LIGHT) + #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU. Please update your configuration." +#elif defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) + #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT. Please update your Configuration_adv.h." +#elif defined(LPC_SD_LCD) || defined(LPC_SD_ONBOARD) || defined(LPC_SD_CUSTOM_CABLE) + #error "LPC_SD_(LCD|ONBOARD|CUSTOM_CABLE) are now SDCARD_CONNECTION. Please update your Configuration_adv.h." +#elif defined(USB_SD_DISABLED) + #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_STATE to 'LOW'." +#elif POWER_SUPPLY == 2 + #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) + #error "MKS_ROBIN_TFT is now FSMC_GRAPHICAL_TFT. 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) + #error "STRING_SPLASH_LINE[12] are now obsolete. Please remove them from Configuration.h." +#elif defined(Z_PROBE_ALLEN_KEY_DEPLOY_1_X) || defined(Z_PROBE_ALLEN_KEY_STOW_1_X) + #error "Z_PROBE_ALLEN_KEY_(DEPLOY|STOW) coordinates are now a single setting. Please update your configuration." +#elif defined(X_PROBE_OFFSET_FROM_EXTRUDER) || defined(Y_PROBE_OFFSET_FROM_EXTRUDER) || defined(Z_PROBE_OFFSET_FROM_EXTRUDER) + #error "[XYZ]_PROBE_OFFSET_FROM_EXTRUDER is now NOZZLE_TO_PROBE_OFFSET. Please update your configuration." +#elif defined(MIN_PROBE_X) || defined(MIN_PROBE_Y) || defined(MAX_PROBE_X) || defined(MAX_PROBE_Y) + #error "(MIN|MAX)_PROBE_[XY] are now calculated at runtime. Please remove them from Configuration.h." +#elif defined(Z_STEPPER_ALIGN_X) || defined(Z_STEPPER_ALIGN_X) + #error "Z_STEPPER_ALIGN_X and Z_STEPPER_ALIGN_Y are now combined as Z_STEPPER_ALIGN_XY. Please update your Configuration_adv.h." +#elif defined(JUNCTION_DEVIATION) + #error "JUNCTION_DEVIATION is no longer required. (See CLASSIC_JERK). Please remove it from Configuration.h." +#elif defined(BABYSTEP_MULTIPLICATOR) + #error "BABYSTEP_MULTIPLICATOR is now BABYSTEP_MULTIPLICATOR_[XY|Z]. Please update Configuration_adv.h." +#elif defined(LULZBOT_TOUCH_UI) + #error "LULZBOT_TOUCH_UI is now TOUCH_UI_FTDI_EVE. Please update your configuration." +#elif defined(PS_DEFAULT_OFF) + #error "PS_DEFAULT_OFF is now PSU_DEFAULT_OFF. Please update your configuration." +#elif defined(FILAMENT_UNLOAD_RETRACT_LENGTH) + #error "FILAMENT_UNLOAD_RETRACT_LENGTH is now FILAMENT_UNLOAD_PURGE_RETRACT. Please update Configuration_adv.h." +#elif defined(FILAMENT_UNLOAD_DELAY) + #error "FILAMENT_UNLOAD_DELAY is now FILAMENT_UNLOAD_PURGE_DELAY. Please update Configuration_adv.h." +#elif defined(HOME_USING_SPREADCYCLE) + #error "HOME_USING_SPREADCYCLE is now obsolete. Please remove it from Configuration_adv.h." +#elif defined(DGUS_LCD) + #error "DGUS_LCD is now DGUS_LCD_UI_(ORIGIN|FYSETC|HIPRECY). Please update your configuration." +#elif defined(DGUS_SERIAL_PORT) + #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." +#elif defined(DGUS_BAUDRATE) + #error "DGUS_BAUDRATE is now LCD_BAUDRATE. Please update your configuration." +#elif defined(DGUS_STATS_RX_BUFFER_OVERRUNS) + #error "DGUS_STATS_RX_BUFFER_OVERRUNS is now STATS_RX_BUFFER_OVERRUNS. Please update your configuration." +#elif defined(DGUS_SERIAL_PORT) + #error "DGUS_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." +#elif defined(ANYCUBIC_LCD_SERIAL_PORT) + #error "ANYCUBIC_LCD_SERIAL_PORT is now LCD_SERIAL_PORT. Please update your configuration." +#elif defined(INTERNAL_SERIAL_PORT) + #error "INTERNAL_SERIAL_PORT is now MMU2_SERIAL_PORT. Please update your configuration." +#elif defined(X_DUAL_ENDSTOPS_ADJUSTMENT) + #error "X_DUAL_ENDSTOPS_ADJUSTMENT is now X2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." +#elif defined(Y_DUAL_ENDSTOPS_ADJUSTMENT) + #error "Y_DUAL_ENDSTOPS_ADJUSTMENT is now Y2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." +#elif defined(Z_DUAL_ENDSTOPS_ADJUSTMENT) + #error "Z_DUAL_ENDSTOPS_ADJUSTMENT is now Z2_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." +#elif defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT2) || defined(Z_TRIPLE_ENDSTOPS_ADJUSTMENT3) + #error "Z_TRIPLE_ENDSTOPS_ADJUSTMENT[23] is now Z[23]_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." +#elif defined(Z_QUAD_ENDSTOPS_ADJUSTMENT2) || defined(Z_QUAD_ENDSTOPS_ADJUSTMENT3) || defined(Z_QUAD_ENDSTOPS_ADJUSTMENT4) + #error "Z_QUAD_ENDSTOPS_ADJUSTMENT[234] is now Z[234]_ENDSTOP_ADJUSTMENT. Please update Configuration_adv.h." +#elif defined(Z_DUAL_STEPPER_DRIVERS) + #error "Z_DUAL_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 2. Please update Configuration_adv.h." +#elif defined(Z_TRIPLE_STEPPER_DRIVERS) + #error "Z_TRIPLE_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 3. Please update Configuration_adv.h." +#elif defined(Z_QUAD_STEPPER_DRIVERS) + #error "Z_QUAD_STEPPER_DRIVERS is now NUM_Z_STEPPER_DRIVERS with a value of 4. Please update Configuration_adv.h." +#elif defined(Z_DUAL_ENDSTOPS) + #error "Z_DUAL_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." +#elif defined(Z_TRIPLE_ENDSTOPS) + #error "Z_TRIPLE_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." +#elif defined(Z_QUAD_ENDSTOPS) + #error "Z_QUAD_ENDSTOPS is now Z_MULTI_ENDSTOPS. Please update Configuration_adv.h." +#elif defined(DUGS_UI_MOVE_DIS_OPTION) + #error "DUGS_UI_MOVE_DIS_OPTION is spelled DGUS_UI_MOVE_DIS_OPTION. Please update Configuration_adv.h." +#elif defined(ORIG_E0_AUTO_FAN_PIN) || defined(ORIG_E1_AUTO_FAN_PIN) || defined(ORIG_E2_AUTO_FAN_PIN) || defined(ORIG_E3_AUTO_FAN_PIN) || defined(ORIG_E4_AUTO_FAN_PIN) || defined(ORIG_E5_AUTO_FAN_PIN) || defined(ORIG_E6_AUTO_FAN_PIN) || defined(ORIG_E7_AUTO_FAN_PIN) + #error "ORIG_Ex_AUTO_FAN_PIN is now just Ex_AUTO_FAN_PIN. Make sure your pins are up to date." +#elif defined(ORIG_CHAMBER_AUTO_FAN_PIN) + #error "ORIG_CHAMBER_AUTO_FAN_PIN is now just CHAMBER_AUTO_FAN_PIN. Make sure your pins are up to date." +#elif defined(HOMING_BACKOFF_MM) + #error "HOMING_BACKOFF_MM is now HOMING_BACKOFF_POST_MM. Please update Configuration_adv.h." +#elif defined(X_HOME_BUMP_MM) || defined(Y_HOME_BUMP_MM) || defined(Z_HOME_BUMP_MM) + #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." +#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) + #error "EVENT_GCODE_SD_STOP is now EVENT_GCODE_SD_ABORT. Please update your Configuration.h." +#elif defined(GRAPHICAL_TFT_ROTATE_180) + #error "GRAPHICAL_TFT_ROTATE_180 is now TFT_ROTATION set to TFT_ROTATE_180. Please update your Configuration.h." +#elif defined(FIL_RUNOUT_INVERTING) + #if FIL_RUNOUT_INVERTING + #error "FIL_RUNOUT_INVERTING true is now FIL_RUNOUT_STATE HIGH. Please update your Configuration.h." + #else + #error "FIL_RUNOUT_INVERTING false is now FIL_RUNOUT_STATE LOW. Please update your Configuration.h." + #endif +#endif + +/** + * Probe temp compensation requirements + */ +#if ENABLED(PROBE_TEMP_COMPENSATION) + #if defined(PTC_PARK_POS_X) || defined(PTC_PARK_POS_Y) || defined(PTC_PARK_POS_Z) + #error "PTC_PARK_POS_[XYZ] is now PTC_PARK_POS (array). Please update Configuration_adv.h." + #elif !defined(PTC_PARK_POS) + #error "PROBE_TEMP_COMPENSATION requires PTC_PARK_POS." + #elif defined(PTC_PROBE_POS_X) || defined(PTC_PROBE_POS_Y) + #error "PTC_PROBE_POS_[XY] is now PTC_PROBE_POS (array). Please update Configuration_adv.h." + #elif !defined(PTC_PROBE_POS) + #error "PROBE_TEMP_COMPENSATION requires PTC_PROBE_POS." + #endif +#endif + +/** + * Marlin release, version and default string + */ +#ifndef SHORT_BUILD_VERSION + #error "SHORT_BUILD_VERSION must be specified." +#elif !defined(DETAILED_BUILD_VERSION) + #error "BUILD_VERSION must be specified." +#elif !defined(STRING_DISTRIBUTION_DATE) + #error "STRING_DISTRIBUTION_DATE must be specified." +#elif !defined(PROTOCOL_VERSION) + #error "PROTOCOL_VERSION must be specified." +#elif !defined(MACHINE_NAME) + #error "MACHINE_NAME must be specified." +#elif !defined(SOURCE_CODE_URL) + #error "SOURCE_CODE_URL must be specified." +#elif !defined(DEFAULT_MACHINE_UUID) + #error "DEFAULT_MACHINE_UUID must be specified." +#elif !defined(WEBSITE_URL) + #error "WEBSITE_URL must be specified." +#endif + +/** + * Serial + */ +#if !IS_AT90USB + #if ENABLED(SERIAL_XON_XOFF) && RX_BUFFER_SIZE < 1024 + #error "SERIAL_XON_XOFF requires RX_BUFFER_SIZE >= 1024 for reliable transfers without drops." + #elif RX_BUFFER_SIZE && (RX_BUFFER_SIZE < 2 || !IS_POWER_OF_2(RX_BUFFER_SIZE)) + #error "RX_BUFFER_SIZE must be a power of 2 greater than 1." + #elif TX_BUFFER_SIZE && (TX_BUFFER_SIZE < 2 || TX_BUFFER_SIZE > 256 || !IS_POWER_OF_2(TX_BUFFER_SIZE)) + #error "TX_BUFFER_SIZE must be 0 or a power of 2 between 1 and 256." + #endif +#elif ANY(SERIAL_XON_XOFF, SERIAL_STATS_MAX_RX_QUEUED, SERIAL_STATS_DROPPED_RX) + #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." +#endif + +#ifndef SERIAL_PORT + #error "SERIAL_PORT must be defined in Configuration.h" +#elif defined(SERIAL_PORT_2) && SERIAL_PORT_2 == SERIAL_PORT + #error "SERIAL_PORT_2 cannot be the same as SERIAL_PORT. Please update your configuration." +#endif + +/** + * Multiple Stepper Drivers Per Axis + */ +#define GOOD_AXIS_PINS(A) (HAS_##A##_ENABLE && HAS_##A##_STEP && HAS_##A##_DIR) +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #if ENABLED(DUAL_X_CARRIAGE) + #error "DUAL_X_CARRIAGE is not compatible with X_DUAL_STEPPER_DRIVERS." + #elif !GOOD_AXIS_PINS(X) + #error "X_DUAL_STEPPER_DRIVERS requires X2 pins to be defined." + #endif +#endif + +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) && !GOOD_AXIS_PINS(Y) + #error "Y_DUAL_STEPPER_DRIVERS requires Y2 pins to be defined." +#elif !WITHIN(NUM_Z_STEPPER_DRIVERS, 1, 4) + #error "NUM_Z_STEPPER_DRIVERS must be an integer from 1 to 4." +#elif NUM_Z_STEPPER_DRIVERS == 2 && !GOOD_AXIS_PINS(Z2) + #error "If NUM_Z_STEPPER_DRIVERS is 2, you must define stepper pins for Z2." +#elif NUM_Z_STEPPER_DRIVERS == 3 && !(GOOD_AXIS_PINS(Z2) && GOOD_AXIS_PINS(Z3)) + #error "If NUM_Z_STEPPER_DRIVERS is 3, you must define stepper pins for Z2 and Z3." +#elif NUM_Z_STEPPER_DRIVERS == 4 && !(GOOD_AXIS_PINS(Z2) && GOOD_AXIS_PINS(Z3) && GOOD_AXIS_PINS(Z4)) + #error "If NUM_Z_STEPPER_DRIVERS is 4, you must define stepper pins for Z2, Z3, and Z4." +#endif + +/** + * Validate that the bed size fits + */ +static_assert(X_MAX_LENGTH >= X_BED_SIZE, "Movement bounds (X_MIN_POS, X_MAX_POS) are too narrow to contain X_BED_SIZE."); +static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS) are too narrow to contain Y_BED_SIZE."); + +/** + * Granular software endstops (Marlin >= 1.1.7) + */ +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) && DISABLED(MIN_SOFTWARE_ENDSTOP_Z) + #if IS_KINEMATIC + #error "MIN_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MIN_SOFTWARE_ENDSTOP_Z." + #elif NONE(MIN_SOFTWARE_ENDSTOP_X, MIN_SOFTWARE_ENDSTOP_Y) + #error "MIN_SOFTWARE_ENDSTOPS requires at least one of the MIN_SOFTWARE_ENDSTOP_[XYZ] options." + #endif +#endif + +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) && DISABLED(MAX_SOFTWARE_ENDSTOP_Z) + #if IS_KINEMATIC + #error "MAX_SOFTWARE_ENDSTOPS on DELTA/SCARA also requires MAX_SOFTWARE_ENDSTOP_Z." + #elif NONE(MAX_SOFTWARE_ENDSTOP_X, MAX_SOFTWARE_ENDSTOP_Y) + #error "MAX_SOFTWARE_ENDSTOPS requires at least one of the MAX_SOFTWARE_ENDSTOP_[XYZ] options." + #endif +#endif + +#if !defined(TARGET_LPC1768) && ANY( \ + ENDSTOPPULLDOWNS, \ + ENDSTOPPULLDOWN_XMAX, ENDSTOPPULLDOWN_YMAX, \ + ENDSTOPPULLDOWN_ZMAX, ENDSTOPPULLDOWN_XMIN, \ + ENDSTOPPULLDOWN_YMIN, ENDSTOPPULLDOWN_ZMIN \ + ) + #error "PULLDOWN pin mode is not available on the selected board." +#endif + +#if BOTH(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS) + #error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS." +#elif BOTH(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN) + #error "Enable only one of FIL_RUNOUT_PULLUP or FIL_RUNOUT_PULLDOWN." +#elif BOTH(ENDSTOPPULLUP_XMAX, ENDSTOPPULLDOWN_XMAX) + #error "Enable only one of ENDSTOPPULLUP_X_MAX or ENDSTOPPULLDOWN_X_MAX." +#elif BOTH(ENDSTOPPULLUP_YMAX, ENDSTOPPULLDOWN_YMAX) + #error "Enable only one of ENDSTOPPULLUP_Y_MAX or ENDSTOPPULLDOWN_Y_MAX." +#elif BOTH(ENDSTOPPULLUP_ZMAX, ENDSTOPPULLDOWN_ZMAX) + #error "Enable only one of ENDSTOPPULLUP_Z_MAX or ENDSTOPPULLDOWN_Z_MAX." +#elif BOTH(ENDSTOPPULLUP_XMIN, ENDSTOPPULLDOWN_XMIN) + #error "Enable only one of ENDSTOPPULLUP_X_MIN or ENDSTOPPULLDOWN_X_MIN." +#elif BOTH(ENDSTOPPULLUP_YMIN, ENDSTOPPULLDOWN_YMIN) + #error "Enable only one of ENDSTOPPULLUP_Y_MIN or ENDSTOPPULLDOWN_Y_MIN." +#elif BOTH(ENDSTOPPULLUP_ZMIN, ENDSTOPPULLDOWN_ZMIN) + #error "Enable only one of ENDSTOPPULLUP_Z_MIN or ENDSTOPPULLDOWN_Z_MIN." +#endif + +/** + * LCD Info Screen Style + */ +#if LCD_INFO_SCREEN_STYLE > 0 + #if HAS_MARLINUI_U8GLIB || LCD_WIDTH < 20 || LCD_HEIGHT < 4 + #error "Alternative LCD_INFO_SCREEN_STYLE requires 20x4 Character LCD." + #elif LCD_INFO_SCREEN_STYLE > 1 + #error "LCD_INFO_SCREEN_STYLE only has options 0 and 1 at this time." + #endif +#endif + +/** + * Progress Bar + */ +#if ENABLED(LCD_PROGRESS_BAR) + #if NONE(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) + #error "LCD_PROGRESS_BAR requires SDSUPPORT or LCD_SET_PROGRESS_MANUALLY." + #elif NONE(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + #error "LCD_PROGRESS_BAR only applies to HD44780 character LCD and TFTGLCD_PANEL_(SPI|I2C)." + #elif HAS_MARLINUI_U8GLIB + #error "LCD_PROGRESS_BAR does not apply to graphical displays." + #elif ENABLED(FILAMENT_LCD_DISPLAY) + #error "LCD_PROGRESS_BAR and FILAMENT_LCD_DISPLAY are not fully compatible. Comment out this line to use both." + #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_MARLINUI_U8GLIB, HAS_GRAPHICAL_TFT, HAS_MARLINUI_HD44780, EXTENSIBLE_UI) + #error "LCD_SET_PROGRESS_MANUALLY requires LCD_PROGRESS_BAR, Character LCD, Graphical LCD, TFT, or EXTENSIBLE_UI." +#endif + +#if !HAS_LCD_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + #error "SD_REPRINT_LAST_SELECTED_FILE currently requires a Marlin-native LCD menu." +#endif + +/** + * Custom Boot and Status screens + */ +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE) + #error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE." +#elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB + #error "CUSTOM_STATUS_SCREEN_IMAGE requires a Graphical LCD." +#endif + +/** + * LCD Lightweight Screen Style + */ +#if ENABLED(LIGHTWEIGHT_UI) && DISABLED(U8GLIB_ST7920) + #error "LIGHTWEIGHT_UI requires a U8GLIB_ST7920-based display." +#endif + +/** + * SD File Sorting + */ +#if ENABLED(SDCARD_SORT_ALPHA) + #if SDSORT_LIMIT > 256 + #error "SDSORT_LIMIT must be 256 or smaller." + #elif SDSORT_LIMIT < 10 + #error "SDSORT_LIMIT should be greater than 9 to be useful." + #elif DISABLED(SDSORT_USES_RAM) + #if ENABLED(SDSORT_DYNAMIC_RAM) + #error "SDSORT_DYNAMIC_RAM requires SDSORT_USES_RAM (which reads the directory into RAM)." + #elif ENABLED(SDSORT_CACHE_NAMES) + #error "SDSORT_CACHE_NAMES requires SDSORT_USES_RAM (which reads the directory into RAM)." + #endif + #endif + + #if ENABLED(SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM) + #if SDSORT_CACHE_VFATS < 2 + #error "SDSORT_CACHE_VFATS must be 2 or greater!" + #elif SDSORT_CACHE_VFATS > MAX_VFAT_ENTRIES + #undef SDSORT_CACHE_VFATS + #define SDSORT_CACHE_VFATS MAX_VFAT_ENTRIES + #warning "SDSORT_CACHE_VFATS was reduced to MAX_VFAT_ENTRIES!" + #endif + #endif +#endif + +#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 + +/** + * I2C Position Encoders + */ +#if ENABLED(I2C_POSITION_ENCODERS) + #if !BOTH(BABYSTEPPING, BABYSTEP_XY) + #error "I2C_POSITION_ENCODERS requires BABYSTEPPING and BABYSTEP_XY." + #elif !WITHIN(I2CPE_ENCODER_CNT, 1, 5) + #error "I2CPE_ENCODER_CNT must be between 1 and 5." + #endif +#endif + +/** + * Babystepping + */ +#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) + #error "MESH_BED_LEVELING and BABYSTEP_ZPROBE_OFFSET is not a valid combination" + #elif ENABLED(BABYSTEP_ZPROBE_OFFSET) && !HAS_BED_PROBE + #error "BABYSTEP_ZPROBE_OFFSET requires a probe." + #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && !HAS_MARLINUI_U8GLIB + #error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a Graphical LCD." + #elif ENABLED(BABYSTEP_ZPROBE_GFX_OVERLAY) && DISABLED(BABYSTEP_ZPROBE_OFFSET) + #error "BABYSTEP_ZPROBE_GFX_OVERLAY requires a BABYSTEP_ZPROBE_OFFSET." + #elif ENABLED(BABYSTEP_HOTEND_Z_OFFSET) && !HAS_HOTEND_OFFSET + #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 + #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 + +/** + * Filament Runout needs one or more pins and either SD Support or Auto print start detection + */ +#if HAS_FILAMENT_SENSOR + #if !PIN_EXISTS(FIL_RUNOUT) + #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." + #elif NUM_RUNOUT_SENSORS > E_STEPPERS + #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." + #elif NUM_RUNOUT_SENSORS > 1 && !PIN_EXISTS(FIL_RUNOUT2) + #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 1 requires FIL_RUNOUT2_PIN." + #elif NUM_RUNOUT_SENSORS > 2 && !PIN_EXISTS(FIL_RUNOUT3) + #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 2 requires FIL_RUNOUT3_PIN." + #elif NUM_RUNOUT_SENSORS > 3 && !PIN_EXISTS(FIL_RUNOUT4) + #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN." + #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5) + #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN." + #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6) + #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN." + #elif NONE(SDSUPPORT, PRINTJOB_TIMER_AUTOSTART) + #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART." + #elif FILAMENT_RUNOUT_DISTANCE_MM < 0 + #error "FILAMENT_RUNOUT_DISTANCE_MM must be greater than or equal to zero." + #elif DISABLED(ADVANCED_PAUSE_FEATURE) + static_assert(nullptr == strstr(FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with FILAMENT_RUNOUT_SENSOR."); + #endif +#endif + +/** + * Advanced Pause + */ +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #if !HAS_RESUME_CONTINUE + #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) + #error "ADVANCED_PAUSE_FEATURE requires FILAMENT_UNLOAD_PURGE_FEEDRATE. Please add it to Configuration_adv.h." + #elif ENABLED(EXTRUDER_RUNOUT_PREVENT) + #error "EXTRUDER_RUNOUT_PREVENT is incompatible with ADVANCED_PAUSE_FEATURE." + #elif ENABLED(PARK_HEAD_ON_PAUSE) && NONE(SDSUPPORT, NEWPANEL, EMERGENCY_PARSER) + #error "PARK_HEAD_ON_PAUSE requires SDSUPPORT, EMERGENCY_PARSER, or an LCD controller." + #elif ENABLED(HOME_BEFORE_FILAMENT_CHANGE) && DISABLED(PAUSE_PARK_NO_STEPPER_TIMEOUT) + #error "HOME_BEFORE_FILAMENT_CHANGE requires PAUSE_PARK_NO_STEPPER_TIMEOUT." + #elif ENABLED(PREVENT_LENGTHY_EXTRUDE) && FILAMENT_CHANGE_UNLOAD_LENGTH > EXTRUDE_MAXLENGTH + #error "FILAMENT_CHANGE_UNLOAD_LENGTH must be less than or equal to EXTRUDE_MAXLENGTH." + #elif ENABLED(PREVENT_LENGTHY_EXTRUDE) && FILAMENT_CHANGE_SLOW_LOAD_LENGTH > EXTRUDE_MAXLENGTH + #error "FILAMENT_CHANGE_SLOW_LOAD_LENGTH must be less than or equal to EXTRUDE_MAXLENGTH." + #elif ENABLED(PREVENT_LENGTHY_EXTRUDE) && FILAMENT_CHANGE_FAST_LOAD_LENGTH > EXTRUDE_MAXLENGTH + #error "FILAMENT_CHANGE_FAST_LOAD_LENGTH must be less than or equal to EXTRUDE_MAXLENGTH." + #endif +#endif + +#if ENABLED(NOZZLE_PARK_FEATURE) + constexpr float npp[] = NOZZLE_PARK_POINT; + static_assert(COUNT(npp) == XYZ, "NOZZLE_PARK_POINT requires X, Y, and Z values."); + constexpr xyz_pos_t npp_xyz = NOZZLE_PARK_POINT; + static_assert(WITHIN(npp_xyz.x, X_MIN_POS, X_MAX_POS), "NOZZLE_PARK_POINT.X is out of bounds (X_MIN_POS, X_MAX_POS)."); + static_assert(WITHIN(npp_xyz.y, Y_MIN_POS, Y_MAX_POS), "NOZZLE_PARK_POINT.Y is out of bounds (Y_MIN_POS, Y_MAX_POS)."); + static_assert(WITHIN(npp_xyz.z, Z_MIN_POS, Z_MAX_POS), "NOZZLE_PARK_POINT.Z is out of bounds (Z_MIN_POS, Z_MAX_POS)."); +#endif + +/** + * Individual axis homing is useless for DELTAS + */ +#if BOTH(INDIVIDUAL_AXIS_HOMING_MENU, DELTA) + #error "INDIVIDUAL_AXIS_HOMING_MENU is incompatible with DELTA kinematics." +#endif + +/** + * Options only for EXTRUDERS > 1 + */ +#if HAS_MULTI_EXTRUDER + + #if EXTRUDERS > 8 + #error "Marlin supports a maximum of 8 EXTRUDERS." + #endif + + #if ENABLED(HEATERS_PARALLEL) + #error "EXTRUDERS must be 1 with HEATERS_PARALLEL." + #endif + + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + #ifndef TOOLCHANGE_FS_LENGTH + #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_LENGTH. Please update your Configuration_adv.h." + #elif !defined(TOOLCHANGE_FS_RETRACT_SPEED) + #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_RETRACT_SPEED. Please update your Configuration_adv.h." + #elif !defined(TOOLCHANGE_FS_PRIME_SPEED) + #error "TOOLCHANGE_FILAMENT_SWAP requires TOOLCHANGE_FS_PRIME_SPEED. Please update your Configuration_adv.h." + #endif + #endif + + #if ENABLED(TOOLCHANGE_PARK) + #ifndef TOOLCHANGE_PARK_XY + #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY. Please update your Configuration." + #elif !defined(TOOLCHANGE_PARK_XY_FEEDRATE) + #error "TOOLCHANGE_PARK requires TOOLCHANGE_PARK_XY_FEEDRATE. Please update your Configuration." + #endif + #endif + + #ifndef TOOLCHANGE_ZRAISE + #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1. Please update your Configuration_adv.h." + #endif + +#elif ENABLED(MK2_MULTIPLEXER) + #error "MK2_MULTIPLEXER requires 2 or more EXTRUDERS." +#elif ENABLED(SINGLENOZZLE) + #error "SINGLENOZZLE requires 2 or more EXTRUDERS." +#endif + +/** + * Sanity checking for the Průša MK2 Multiplexer + */ +#ifdef SNMM + #error "SNMM is now MK2_MULTIPLEXER. Please update your configuration." +#endif + +/** + * A Dual Nozzle carriage with switching servo + */ +#if ENABLED(SWITCHING_NOZZLE) + #if ENABLED(DUAL_X_CARRIAGE) + #error "SWITCHING_NOZZLE and DUAL_X_CARRIAGE are incompatible." + #elif ENABLED(SINGLENOZZLE) + #error "SWITCHING_NOZZLE and SINGLENOZZLE are incompatible." + #elif EXTRUDERS != 2 + #error "SWITCHING_NOZZLE requires exactly 2 EXTRUDERS." + #elif NUM_SERVOS < 1 + #error "SWITCHING_NOZZLE requires NUM_SERVOS >= 1." + #endif + + #ifndef SWITCHING_NOZZLE_SERVO_NR + #error "SWITCHING_NOZZLE requires SWITCHING_NOZZLE_SERVO_NR." + #elif SWITCHING_NOZZLE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your SWITCHING_NOZZLE." + #elif SWITCHING_NOZZLE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your SWITCHING_NOZZLE." + #elif SWITCHING_NOZZLE_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your SWITCHING_NOZZLE." + #elif SWITCHING_NOZZLE_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your SWITCHING_NOZZLE." + #endif + + #ifdef SWITCHING_NOZZLE_E1_SERVO_NR + #if SWITCHING_NOZZLE_E1_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR + #error "SWITCHING_NOZZLE_E1_SERVO_NR must be different from SWITCHING_NOZZLE_SERVO_NR." + #elif SWITCHING_NOZZLE_E1_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your SWITCHING_NOZZLE." + #elif SWITCHING_NOZZLE_E1_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your SWITCHING_NOZZLE." + #elif SWITCHING_NOZZLE_E1_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your SWITCHING_NOZZLE." + #elif SWITCHING_NOZZLE_E1_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your SWITCHING_NOZZLE." + #endif + #endif +#endif + +/** + * Single Stepper Dual Extruder with switching servo + */ +#if ENABLED(SWITCHING_EXTRUDER) + #if NUM_SERVOS < 1 + #error "SWITCHING_EXTRUDER requires NUM_SERVOS >= 1." + #elif SWITCHING_EXTRUDER_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your SWITCHING_EXTRUDER." + #endif + #if EXTRUDERS > 3 + #if NUM_SERVOS < 2 + #error "SWITCHING_EXTRUDER with 4 extruders requires NUM_SERVOS >= 2." + #elif SWITCHING_EXTRUDER_E23_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_E23_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_E23_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_E23_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your SWITCHING_EXTRUDER." + #elif SWITCHING_EXTRUDER_E23_SERVO_NR == SWITCHING_EXTRUDER_SERVO_NR + #error "SWITCHING_EXTRUDER_E23_SERVO_NR should be a different extruder from SWITCHING_EXTRUDER_SERVO_NR." + #endif + #endif +#endif + +/** + * Mixing Extruder requirements + */ +#if ENABLED(MIXING_EXTRUDER) + #if HAS_MULTI_EXTRUDER + #error "For MIXING_EXTRUDER set MIXING_STEPPERS > 1 instead of EXTRUDERS > 1." + #elif MIXING_STEPPERS < 2 + #error "You must set MIXING_STEPPERS >= 2 for a mixing extruder." + #elif ENABLED(FILAMENT_SENSOR) + #error "MIXING_EXTRUDER is incompatible with FILAMENT_SENSOR. Comment out this line to use it anyway." + #elif ENABLED(SWITCHING_EXTRUDER) + #error "Please select either MIXING_EXTRUDER or SWITCHING_EXTRUDER, not both." + #elif ENABLED(SINGLENOZZLE) + #error "MIXING_EXTRUDER is incompatible with SINGLENOZZLE." + #endif +#endif + +/** + * Linear Advance 1.5 - Check K value range + */ +#if ENABLED(LIN_ADVANCE) + static_assert( + WITHIN(LIN_ADVANCE_K, 0, 10), + "LIN_ADVANCE_K must be a value from 0 to 10 (Changed in LIN_ADVANCE v1.5, Marlin 1.1.9)." + ); + #if ENABLED(S_CURVE_ACCELERATION) && DISABLED(EXPERIMENTAL_SCURVE) + #error "LIN_ADVANCE and S_CURVE_ACCELERATION may not play well together! Enable EXPERIMENTAL_SCURVE to continue." + #endif +#endif + +/** + * Special tool-changing options + */ +#if 1 < 0 \ + + ENABLED(SINGLENOZZLE) \ + + ENABLED(DUAL_X_CARRIAGE) \ + + ENABLED(PARKING_EXTRUDER) \ + + ENABLED(MAGNETIC_PARKING_EXTRUDER) \ + + ENABLED(SWITCHING_TOOLHEAD) \ + + ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) \ + + ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #error "Please select only one of SINGLENOZZLE, DUAL_X_CARRIAGE, PARKING_EXTRUDER, SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, or ELECTROMAGNETIC_SWITCHING_TOOLHEAD." +#endif + +/** + * (Magnetic) Parking Extruder requirements + */ +#if ANY(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) + #if ENABLED(EXT_SOLENOID) + #error "(MAGNETIC_)PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)" + #elif EXTRUDERS != 2 + #error "(MAGNETIC_)PARKING_EXTRUDER requires exactly 2 EXTRUDERS." + #elif !defined(PARKING_EXTRUDER_PARKING_X) + #error "(MAGNETIC_)PARKING_EXTRUDER requires PARKING_EXTRUDER_PARKING_X." + #elif !defined(TOOLCHANGE_ZRAISE) + #error "(MAGNETIC_)PARKING_EXTRUDER requires TOOLCHANGE_ZRAISE." + #elif TOOLCHANGE_ZRAISE < 0 + #error "TOOLCHANGE_ZRAISE must be 0 or higher." + #elif ENABLED(PARKING_EXTRUDER) + #if !PINS_EXIST(SOL0, SOL1) + #error "PARKING_EXTRUDER requires SOL0_PIN and SOL1_PIN." + #elif !defined(PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE) || !WITHIN(PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE, LOW, HIGH) + #error "PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE must be defined as HIGH or LOW." + #elif !defined(PARKING_EXTRUDER_SOLENOIDS_DELAY) || !WITHIN(PARKING_EXTRUDER_SOLENOIDS_DELAY, 0, 2000) + #error "PARKING_EXTRUDER_SOLENOIDS_DELAY must be between 0 and 2000 (ms)." + #endif + #endif +#endif + +/** + * Switching Toolhead requirements + */ +#if ENABLED(SWITCHING_TOOLHEAD) + #ifndef SWITCHING_TOOLHEAD_SERVO_NR + #error "SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_SERVO_NR." + #elif EXTRUDERS < 2 + #error "SWITCHING_TOOLHEAD requires at least 2 EXTRUDERS." + #elif NUM_SERVOS < (SWITCHING_TOOLHEAD_SERVO_NR - 1) + #if SWITCHING_TOOLHEAD_SERVO_NR == 0 + #error "A SWITCHING_TOOLHEAD_SERVO_NR of 0 requires NUM_SERVOS >= 1." + #elif SWITCHING_TOOLHEAD_SERVO_NR == 1 + #error "A SWITCHING_TOOLHEAD_SERVO_NR of 1 requires NUM_SERVOS >= 2." + #elif SWITCHING_TOOLHEAD_SERVO_NR == 2 + #error "A SWITCHING_TOOLHEAD_SERVO_NR of 2 requires NUM_SERVOS >= 3." + #elif SWITCHING_TOOLHEAD_SERVO_NR == 3 + #error "A SWITCHING_TOOLHEAD_SERVO_NR of 3 requires NUM_SERVOS >= 4." + #endif + #elif !defined(TOOLCHANGE_ZRAISE) + #error "SWITCHING_TOOLHEAD requires TOOLCHANGE_ZRAISE." + #elif TOOLCHANGE_ZRAISE < 0 + #error "TOOLCHANGE_ZRAISE must be 0 or higher." + #endif +#endif + +/** + * (Electro)magnetic Switching Toolhead requirements + */ +#if EITHER(MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #ifndef SWITCHING_TOOLHEAD_Y_POS + #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_POS" + #elif !defined(SWITCHING_TOOLHEAD_X_POS) + #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_X_POS" + #elif !defined(SWITCHING_TOOLHEAD_Z_HOP) + #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Z_HOP." + #elif !defined(SWITCHING_TOOLHEAD_Y_CLEAR) + #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_CLEAR." + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #if ENABLED(EXT_SOLENOID) + #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD and EXT_SOLENOID are incompatible. (Pins are used twice.)" + #elif !PIN_EXISTS(SOL0) + #error "(ELECTRO)MAGNETIC_SWITCHING_TOOLHEAD requires SOL0_PIN." + #endif + #endif +#endif + +/** + * Part-Cooling Fan Multiplexer requirements + */ +#if PIN_EXISTS(FANMUX1) + #if !HAS_FANMUX + #error "FANMUX0_PIN must be set before FANMUX1_PIN can be set." + #endif +#elif PIN_EXISTS(FANMUX2) + #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 + */ +#if NUM_SERVOS > NUM_SERVO_PLUGS + #error "The selected board doesn't support enough servos for your configuration. Reduce NUM_SERVOS." +#endif + +/** + * Servo deactivation depends on servo endstops, switching nozzle, or switching extruder + */ +#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && !HAS_Z_SERVO_PROBE && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) + #error "Z_PROBE_SERVO_NR, switching nozzle, switching toolhead or switching extruder is required for DEACTIVATE_SERVOS_AFTER_MOVE." +#endif + +/** + * Required LCD language + */ +#if HAS_MARLINUI_HD44780 && !defined(DISPLAY_CHARSET_HD44780) + #error "You must set DISPLAY_CHARSET_HD44780 to JAPANESE, WESTERN or CYRILLIC for your LCD controller." +#endif + +/** + * Bed Heating Options - PID vs Limit Switching + */ +#if BOTH(PIDTEMPBED, BED_LIMIT_SWITCHING) + #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." +#endif + +/** + * Kinematics + */ + +/** + * Allow only one kinematic type to be defined + */ +#if 1 < 0 \ + + ENABLED(DELTA) \ + + ENABLED(MORGAN_SCARA) \ + + ENABLED(COREXY) \ + + ENABLED(COREXZ) \ + + ENABLED(COREYZ) \ + + ENABLED(COREYX) \ + + ENABLED(COREZX) \ + + ENABLED(COREZY) \ + + ENABLED(MARKFORGED_XY) + #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." +#endif + +/** + * Delta requirements + */ +#if ENABLED(DELTA) + #if NONE(USE_XMAX_PLUG, USE_YMAX_PLUG, USE_ZMAX_PLUG) + #error "You probably want to use Max Endstops for DELTA!" + #elif ENABLED(ENABLE_LEVELING_FADE_HEIGHT) && DISABLED(AUTO_BED_LEVELING_BILINEAR) && !UBL_SEGMENTED + #error "ENABLE_LEVELING_FADE_HEIGHT on DELTA requires AUTO_BED_LEVELING_BILINEAR or AUTO_BED_LEVELING_UBL." + #elif ENABLED(DELTA_AUTO_CALIBRATION) && !(HAS_BED_PROBE || HAS_LCD_MENU) + #error "DELTA_AUTO_CALIBRATION requires a probe or LCD Controller." + #elif ENABLED(DELTA_CALIBRATION_MENU) && !HAS_LCD_MENU + #error "DELTA_CALIBRATION_MENU requires an LCD Controller." + #elif ABL_GRID + #if (GRID_MAX_POINTS_X & 1) == 0 || (GRID_MAX_POINTS_Y & 1) == 0 + #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be odd numbers." + #elif GRID_MAX_POINTS_X < 3 + #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be 3 or higher." + #endif + #endif +#endif + +/** + * Junction deviation is incompatible with kinematic systems. + */ +#if HAS_JUNCTION_DEVIATION && IS_KINEMATIC + #error "CLASSIC_JERK is required for DELTA and SCARA." +#endif + +/** + * Probes + */ + +/** + * Allow only one probe option to be defined + */ +#if 1 < 0 \ + + ENABLED(PROBE_MANUALLY) \ + + ENABLED(FIX_MOUNTED_PROBE) \ + + ENABLED(NOZZLE_AS_PROBE) \ + + (HAS_Z_SERVO_PROBE && DISABLED(BLTOUCH)) \ + + ENABLED(BLTOUCH) && DISABLED(CREALITY_TOUCH) \ + + ENABLED(CREALITY_TOUCH) \ + + ENABLED(TOUCH_MI_PROBE) \ + + ENABLED(SOLENOID_PROBE) \ + + ENABLED(Z_PROBE_ALLEN_KEY) \ + + ENABLED(Z_PROBE_SLED) \ + + ENABLED(RACK_AND_PINION_PROBE) \ + + ENABLED(SENSORLESS_PROBING) + #error "Please enable only one probe option: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." +#endif + +#if HAS_BED_PROBE + + /** + * Z_PROBE_SLED is incompatible with DELTA + */ + #if BOTH(Z_PROBE_SLED, DELTA) + #error "You cannot use Z_PROBE_SLED with DELTA." + #endif + + /** + * SOLENOID_PROBE requirements + */ + #if ENABLED(SOLENOID_PROBE) + #if ENABLED(EXT_SOLENOID) + #error "SOLENOID_PROBE is incompatible with EXT_SOLENOID." + #elif !HAS_SOLENOID_1 + #error "SOLENOID_PROBE requires SOL1_PIN. It can be added to your Configuration.h." + #endif + #endif + + /** + * NUM_SERVOS is required for a Z servo probe + */ + #if HAS_Z_SERVO_PROBE + #if !NUM_SERVOS + #error "NUM_SERVOS is required for a Z servo probe (Z_PROBE_SERVO_NR)." + #elif Z_PROBE_SERVO_NR >= NUM_SERVOS + #error "Z_PROBE_SERVO_NR must be smaller than NUM_SERVOS." + #elif Z_PROBE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your servo or BLTOUCH probe." + #elif Z_PROBE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your servo or BLTOUCH probe." + #elif Z_PROBE_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your servo or BLTOUCH probe." + #elif Z_PROBE_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your servo or BLTOUCH probe." + #endif + #endif + + #if ENABLED(BLTOUCH) + #if BLTOUCH_DELAY < 200 + #error "BLTOUCH_DELAY less than 200 is unsafe and is not supported." + #elif DISABLED(BLTOUCH_SET_5V_MODE) && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE) + #error "BLTOUCH without BLTOUCH_SET_5V_MODE requires ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN or ENDSTOPPULLUP_ZMIN_PROBE." + #endif + #endif + + #if ENABLED(RACK_AND_PINION_PROBE) && !(defined(Z_PROBE_DEPLOY_X) && defined(Z_PROBE_RETRACT_X)) + #error "RACK_AND_PINION_PROBE requires Z_PROBE_DEPLOY_X and Z_PROBE_RETRACT_X." + #endif + + /** + * Touch-MI probe requirements + */ + #if ENABLED(TOUCH_MI_PROBE) + #if DISABLED(Z_SAFE_HOMING) + #error "TOUCH_MI_PROBE requires Z_SAFE_HOMING." + #elif !defined(TOUCH_MI_RETRACT_Z) + #error "TOUCH_MI_PROBE requires TOUCH_MI_RETRACT_Z." + #elif defined(Z_AFTER_PROBING) + #error "TOUCH_MI_PROBE requires Z_AFTER_PROBING to be disabled." + #elif Z_HOMING_HEIGHT < 10 + #error "TOUCH_MI_PROBE requires Z_HOMING_HEIGHT >= 10." + #elif Z_MIN_PROBE_ENDSTOP_INVERTING + #error "TOUCH_MI_PROBE requires Z_MIN_PROBE_ENDSTOP_INVERTING to be set to false." + #elif DISABLED(BABYSTEP_ZPROBE_OFFSET) + #error "TOUCH_MI_PROBE requires BABYSTEPPING with BABYSTEP_ZPROBE_OFFSET." + #elif !HAS_RESUME_CONTINUE + #error "TOUCH_MI_PROBE currently requires an LCD controller or EMERGENCY_PARSER." + #endif + #endif + + /** + * Require pin options and pins to be defined + */ + #if ENABLED(SENSORLESS_PROBING) + #if ENABLED(DELTA) && !(AXIS_HAS_STALLGUARD(X) && AXIS_HAS_STALLGUARD(Y) && AXIS_HAS_STALLGUARD(Z)) + #error "SENSORLESS_PROBING requires TMC2130/2160/2209/5130/5160 drivers on X, Y, and Z." + #elif !AXIS_HAS_STALLGUARD(Z) + #error "SENSORLESS_PROBING requires a TMC2130/2160/2209/5130/5160 driver on Z." + #endif + #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #if DISABLED(USE_ZMIN_PLUG) + #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires USE_ZMIN_PLUG to be enabled." + #elif !HAS_Z_MIN + #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires the Z_MIN_PIN to be defined." + #elif Z_MIN_PROBE_ENDSTOP_INVERTING != Z_MIN_ENDSTOP_INVERTING + #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires Z_MIN_ENDSTOP_INVERTING to match Z_MIN_PROBE_ENDSTOP_INVERTING." + #endif + #elif !HAS_Z_MIN_PROBE_PIN + #error "Z_MIN_PROBE_PIN must be defined if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN is not enabled." + #endif + + #if ENABLED(NOZZLE_AS_PROBE) + constexpr float sanity_nozzle_to_probe_offset[] = NOZZLE_TO_PROBE_OFFSET; + static_assert(sanity_nozzle_to_probe_offset[0] == 0.0 && sanity_nozzle_to_probe_offset[1] == 0.0, + "NOZZLE_AS_PROBE requires the X,Y offsets in NOZZLE_TO_PROBE_OFFSET to be 0,0."); + #endif + + #if DISABLED(NOZZLE_AS_PROBE) + static_assert(PROBING_MARGIN >= 0, "PROBING_MARGIN must be >= 0."); + static_assert(PROBING_MARGIN_BACK >= 0, "PROBING_MARGIN_BACK must be >= 0."); + static_assert(PROBING_MARGIN_FRONT >= 0, "PROBING_MARGIN_FRONT must be >= 0."); + static_assert(PROBING_MARGIN_LEFT >= 0, "PROBING_MARGIN_LEFT must be >= 0."); + 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##_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."); + static_assert(PROBING_MARGIN_LEFT < _MARGIN(X), "PROBING_MARGIN_LEFT is too large."); + static_assert(PROBING_MARGIN_RIGHT < _MARGIN(X), "PROBING_MARGIN_RIGHT is too large."); + #undef _MARGIN + + /** + * Make sure Z raise values are set + */ + #ifndef Z_CLEARANCE_DEPLOY_PROBE + #error "You must define Z_CLEARANCE_DEPLOY_PROBE in your configuration." + #elif !defined(Z_CLEARANCE_BETWEEN_PROBES) + #error "You must define Z_CLEARANCE_BETWEEN_PROBES in your configuration." + #elif Z_CLEARANCE_DEPLOY_PROBE < 0 + #error "Probes need Z_CLEARANCE_DEPLOY_PROBE >= 0." + #elif Z_CLEARANCE_BETWEEN_PROBES < 0 + #error "Probes need Z_CLEARANCE_BETWEEN_PROBES >= 0." + #elif Z_AFTER_PROBING < 0 + #error "Probes need Z_AFTER_PROBING >= 0." + #endif + + #if MULTIPLE_PROBING > 0 || EXTRA_PROBING > 0 + #if MULTIPLE_PROBING == 0 + #error "EXTRA_PROBING requires MULTIPLE_PROBING." + #elif MULTIPLE_PROBING < 2 + #error "MULTIPLE_PROBING must be 2 or more." + #elif MULTIPLE_PROBING <= EXTRA_PROBING + #error "EXTRA_PROBING must be less than MULTIPLE_PROBING." + #endif + #endif + + #if Z_PROBE_LOW_POINT > 0 + #error "Z_PROBE_LOW_POINT must be less than or equal to 0." + #endif + + #if HOMING_Z_WITH_PROBE && IS_CARTESIAN && DISABLED(Z_SAFE_HOMING) + #error "Z_SAFE_HOMING is recommended when homing with a probe. Enable it or comment out this line to continue." + #endif + +#else + + /** + * Require some kind of probe for bed leveling and probe testing + */ + #if HAS_ABL_NOT_UBL && !PROBE_SELECTED + #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo." + #endif + + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + #error "Z_MIN_PROBE_REPEATABILITY_TEST requires a probe: FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or Z Servo." + #endif + +#endif + +/** + * Allow only one bed leveling option to be defined + */ +#if 1 < 0 \ + + ENABLED(AUTO_BED_LEVELING_LINEAR) \ + + ENABLED(AUTO_BED_LEVELING_3POINT) \ + + ENABLED(AUTO_BED_LEVELING_BILINEAR) \ + + ENABLED(AUTO_BED_LEVELING_UBL) \ + + ENABLED(MESH_BED_LEVELING) + #error "Select only one of: MESH_BED_LEVELING, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR or AUTO_BED_LEVELING_UBL." +#endif + +/** + * Bed Leveling Requirements + */ + +#if ENABLED(AUTO_BED_LEVELING_UBL) + + /** + * Unified Bed Leveling + */ + + // Hide PROBE_MANUALLY from the rest of the code + #undef PROBE_MANUALLY + + #if IS_SCARA + #error "AUTO_BED_LEVELING_UBL does not yet support SCARA printers." + #elif DISABLED(EEPROM_SETTINGS) + #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS. Please update your configuration." + #elif !WITHIN(GRID_MAX_POINTS_X, 3, 15) || !WITHIN(GRID_MAX_POINTS_Y, 3, 15) + #error "GRID_MAX_POINTS_[XY] must be a whole number between 3 and 15." + #elif !defined(RESTORE_LEVELING_AFTER_G28) + #error "AUTO_BED_LEVELING_UBL used to enable RESTORE_LEVELING_AFTER_G28. To keep this behavior enable RESTORE_LEVELING_AFTER_G28. Otherwise define it as 'false'." + #endif + +#elif HAS_ABL_NOT_UBL + + /** + * Auto Bed Leveling + */ + + /** + * Delta and SCARA have limited bed leveling options + */ + #if IS_SCARA && DISABLED(AUTO_BED_LEVELING_BILINEAR) + #error "SCARA machines can only use the AUTO_BED_LEVELING_BILINEAR leveling option." + #endif + +#elif ENABLED(MESH_BED_LEVELING) + + // Hide PROBE_MANUALLY from the rest of the code + #undef PROBE_MANUALLY + + /** + * Mesh Bed Leveling + */ + + #if ENABLED(DELTA) + #error "MESH_BED_LEVELING is not compatible with DELTA printers." + #elif GRID_MAX_POINTS_X > 9 || GRID_MAX_POINTS_Y > 9 + #error "GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y must be less than 10 for MBL." + #endif + +#endif + +#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 +#endif + +#if ENABLED(MESH_EDIT_GFX_OVERLAY) && !BOTH(AUTO_BED_LEVELING_UBL, HAS_MARLINUI_U8GLIB) + #error "MESH_EDIT_GFX_OVERLAY requires AUTO_BED_LEVELING_UBL and a Graphical LCD." +#endif + +#if ENABLED(G29_RETRY_AND_RECOVER) + #if ENABLED(AUTO_BED_LEVELING_UBL) + #error "G29_RETRY_AND_RECOVER is not compatible with UBL." + #elif ENABLED(MESH_BED_LEVELING) + #error "G29_RETRY_AND_RECOVER is not compatible with MESH_BED_LEVELING." + #endif +#endif + +/** + * LCD_BED_LEVELING requirements + */ +#if ENABLED(LCD_BED_LEVELING) + #if !HAS_LCD_MENU + #error "LCD_BED_LEVELING requires a programmable LCD controller." + #elif !(ENABLED(MESH_BED_LEVELING) || HAS_ABL_NOT_UBL) + #error "LCD_BED_LEVELING requires MESH_BED_LEVELING or AUTO_BED_LEVELING." + #endif +#endif + +/** + * Homing + */ +constexpr float hbm[] = HOMING_BUMP_MM; +static_assert(COUNT(hbm) == XYZ, "HOMING_BUMP_MM requires X, Y, and Z elements."); +static_assert(hbm[X_AXIS] >= 0, "HOMING_BUMP_MM.X must be greater than or equal to 0."); +static_assert(hbm[Y_AXIS] >= 0, "HOMING_BUMP_MM.Y must be greater than or equal to 0."); +static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal to 0."); + +#if ENABLED(CODEPENDENT_XY_HOMING) + #if ENABLED(QUICK_HOME) + #error "QUICK_HOME is incompatible with CODEPENDENT_XY_HOMING." + #elif IS_KINEMATIC + #error "CODEPENDENT_XY_HOMING requires a Cartesian setup." + #endif +#endif + +/** + * Make sure Z_SAFE_HOMING point is reachable + */ +#if ENABLED(Z_SAFE_HOMING) + static_assert(WITHIN(Z_SAFE_HOMING_X_POINT, X_MIN_POS, X_MAX_POS), "Z_SAFE_HOMING_X_POINT can't be reached by the nozzle."); + static_assert(WITHIN(Z_SAFE_HOMING_Y_POINT, Y_MIN_POS, Y_MAX_POS), "Z_SAFE_HOMING_Y_POINT can't be reached by the nozzle."); +#endif + +/** + * Make sure DISABLE_[XYZ] compatible with selected homing options + */ +#if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z) + #if EITHER(HOME_AFTER_DEACTIVATE, Z_SAFE_HOMING) + #error "DISABLE_[XYZ] is not compatible with HOME_AFTER_DEACTIVATE or Z_SAFE_HOMING." + #endif +#endif + +/** + * Filament Width Sensor + */ +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #if !HAS_FILAMENT_WIDTH_SENSOR + #error "FILAMENT_WIDTH_SENSOR requires a FILWIDTH_PIN to be defined." + #elif ENABLED(NO_VOLUMETRICS) + #error "FILAMENT_WIDTH_SENSOR requires NO_VOLUMETRICS to be disabled." + #endif +#endif + +/** + * System Power Sensor + */ +#if ENABLED(POWER_MONITOR_CURRENT) && !PIN_EXISTS(POWER_MONITOR_CURRENT) + #error "POWER_MONITOR_CURRENT requires a valid POWER_MONITOR_CURRENT_PIN." +#elif ENABLED(POWER_MONITOR_VOLTAGE) && !PIN_EXISTS(POWER_MONITOR_VOLTAGE) + #error "POWER_MONITOR_VOLTAGE requires POWER_MONITOR_VOLTAGE_PIN to be defined." +#elif BOTH(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) && POWER_MONITOR_CURRENT_PIN == POWER_MONITOR_VOLTAGE_PIN + #error "POWER_MONITOR_CURRENT_PIN and POWER_MONITOR_VOLTAGE_PIN must be different." +#endif + +/** + * Volumetric Extruder Limit + */ +#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + #if ENABLED(NO_VOLUMETRICS) + #error "VOLUMETRIC_EXTRUDER_LIMIT requires NO_VOLUMETRICS to be disabled." + #elif MIN_STEPS_PER_SEGMENT > 1 + #error "VOLUMETRIC_EXTRUDER_LIMIT is not compatible with MIN_STEPS_PER_SEGMENT greater than 1." + #endif +#endif + +/** + * ULTIPANEL encoder + */ +#if ENABLED(ULTIPANEL) && NONE(NEWPANEL, SR_LCD_2W_NL) && !defined(SHIFT_CLK) + #error "ULTIPANEL requires some kind of encoder." +#endif + +#if ENCODER_PULSES_PER_STEP < 0 + #error "ENCODER_PULSES_PER_STEP should not be negative, use REVERSE_MENU_DIRECTION instead." +#endif + +/** + * SAV_3DGLCD display options + */ +#if ENABLED(SAV_3DGLCD) + #if NONE(U8GLIB_SSD1306, U8GLIB_SH1106) + #error "Enable a SAV_3DGLCD display type: U8GLIB_SSD1306 or U8GLIB_SH1106." + #elif BOTH(U8GLIB_SSD1306, U8GLIB_SH1106) + #error "Only enable one SAV_3DGLCD display type: U8GLIB_SSD1306 or U8GLIB_SH1106." + #endif +#endif + +/** + * Allen Key + * Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis. + */ +#if ENABLED(Z_PROBE_ALLEN_KEY) && (Z_HOME_DIR < 0) && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #error "You can't home to a z min endstop with a Z_PROBE_ALLEN_KEY." +#endif + +/** + * Dual X Carriage requirements + */ +#if ENABLED(DUAL_X_CARRIAGE) + #if EXTRUDERS < 2 + #error "DUAL_X_CARRIAGE requires 2 (or more) extruders." + #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 + #error "DUAL_X_CARRIAGE requires USE_XMAX_PLUG and an X Max Endstop." + #elif !defined(X2_HOME_POS) || !defined(X2_MIN_POS) || !defined(X2_MAX_POS) + #error "DUAL_X_CARRIAGE requires X2_HOME_POS, X2_MIN_POS, and X2_MAX_POS." + #elif X_HOME_DIR != -1 || X2_HOME_DIR != 1 + #error "DUAL_X_CARRIAGE requires X_HOME_DIR -1 and X2_HOME_DIR 1." + #endif +#endif + +#undef GOOD_AXIS_PINS + +/** + * Make sure auto fan pins don't conflict with the fan pin + */ +#if HAS_AUTO_FAN + #if HAS_FAN0 + #if E0_AUTO_FAN_PIN == FAN_PIN + #error "You cannot set E0_AUTO_FAN_PIN equal to FAN_PIN." + #elif E1_AUTO_FAN_PIN == FAN_PIN + #error "You cannot set E1_AUTO_FAN_PIN equal to FAN_PIN." + #elif E2_AUTO_FAN_PIN == FAN_PIN + #error "You cannot set E2_AUTO_FAN_PIN equal to FAN_PIN." + #elif E3_AUTO_FAN_PIN == FAN_PIN + #error "You cannot set E3_AUTO_FAN_PIN equal to FAN_PIN." + #endif + #endif +#endif + +#if HAS_FAN0 && CONTROLLER_FAN_PIN == FAN_PIN + #error "You cannot set CONTROLLER_FAN_PIN equal to FAN_PIN." +#endif + +#if ENABLED(USE_CONTROLLER_FAN) + #if !HAS_CONTROLLER_FAN + #error "USE_CONTROLLER_FAN requires a CONTROLLER_FAN_PIN. Define in Configuration_adv.h." + #elif E0_AUTO_FAN_PIN == CONTROLLER_FAN_PIN + #error "You cannot set E0_AUTO_FAN_PIN equal to CONTROLLER_FAN_PIN." + #elif E1_AUTO_FAN_PIN == CONTROLLER_FAN_PIN + #error "You cannot set E1_AUTO_FAN_PIN equal to CONTROLLER_FAN_PIN." + #elif E2_AUTO_FAN_PIN == CONTROLLER_FAN_PIN + #error "You cannot set E2_AUTO_FAN_PIN equal to CONTROLLER_FAN_PIN." + #elif E3_AUTO_FAN_PIN == CONTROLLER_FAN_PIN + #error "You cannot set E3_AUTO_FAN_PIN equal to CONTROLLER_FAN_PIN." + #endif +#endif + +/** + * Case Light requirements + */ +#if ENABLED(CASE_LIGHT_ENABLE) + #if !PIN_EXISTS(CASE_LIGHT) + #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN to be defined." + #elif CASE_LIGHT_PIN == FAN_PIN + #error "CASE_LIGHT_PIN conflicts with FAN_PIN. Resolve before continuing." + #endif +#endif + +/** + * Required custom thermistor settings + */ +#if ENABLED(HEATER_0_USER_THERMISTOR) && !(defined(HOTEND0_PULLUP_RESISTOR_OHMS) && defined(HOTEND0_RESISTANCE_25C_OHMS) && defined(HOTEND0_BETA)) + #error "TEMP_SENSOR_0 1000 requires HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS and HOTEND0_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_1_USER_THERMISTOR) && !(defined(HOTEND1_PULLUP_RESISTOR_OHMS) && defined(HOTEND1_RESISTANCE_25C_OHMS) && defined(HOTEND1_BETA)) + #error "TEMP_SENSOR_1 1000 requires HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS and HOTEND1_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_2_USER_THERMISTOR) && !(defined(HOTEND2_PULLUP_RESISTOR_OHMS) && defined(HOTEND2_RESISTANCE_25C_OHMS) && defined(HOTEND2_BETA)) + #error "TEMP_SENSOR_2 1000 requires HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS and HOTEND2_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_3_USER_THERMISTOR) && !(defined(HOTEND3_PULLUP_RESISTOR_OHMS) && defined(HOTEND3_RESISTANCE_25C_OHMS) && defined(HOTEND3_BETA)) + #error "TEMP_SENSOR_3 1000 requires HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS and HOTEND3_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_4_USER_THERMISTOR) && !(defined(HOTEND4_PULLUP_RESISTOR_OHMS) && defined(HOTEND4_RESISTANCE_25C_OHMS) && defined(HOTEND4_BETA)) + #error "TEMP_SENSOR_4 1000 requires HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS and HOTEND4_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_5_USER_THERMISTOR) && !(defined(HOTEND5_PULLUP_RESISTOR_OHMS) && defined(HOTEND5_RESISTANCE_25C_OHMS) && defined(HOTEND5_BETA)) + #error "TEMP_SENSOR_5 1000 requires HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS and HOTEND5_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_6_USER_THERMISTOR) && !(defined(HOTEND6_PULLUP_RESISTOR_OHMS) && defined(HOTEND6_RESISTANCE_25C_OHMS) && defined(HOTEND6_BETA)) + #error "TEMP_SENSOR_6 1000 requires HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS and HOTEND6_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_7_USER_THERMISTOR) && !(defined(HOTEND7_PULLUP_RESISTOR_OHMS) && defined(HOTEND7_RESISTANCE_25C_OHMS) && defined(HOTEND7_BETA)) + #error "TEMP_SENSOR_7 1000 requires HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS and HOTEND7_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_BED_USER_THERMISTOR) && !(defined(BED_PULLUP_RESISTOR_OHMS) && defined(BED_RESISTANCE_25C_OHMS) && defined(BED_BETA)) + #error "TEMP_SENSOR_BED 1000 requires BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS and BED_BETA in Configuration_adv.h." +#elif ENABLED(HEATER_CHAMBER_USER_THERMISTOR) && !(defined(CHAMBER_PULLUP_RESISTOR_OHMS) && defined(CHAMBER_RESISTANCE_25C_OHMS) && defined(CHAMBER_BETA)) + #error "TEMP_SENSOR_CHAMBER 1000 requires CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS and CHAMBER_BETA in Configuration_adv.h." +#endif + +/** + * A Sensor ID has to be set for each heater + */ + +#if HAS_MULTI_HOTEND + #if ENABLED(HEATER_1_USES_MAX6675) && !PIN_EXISTS(MAX6675_SS2) + #error "MAX6675_SS2_PIN (required for TEMP_SENSOR_1) not defined for this board." + #elif TEMP_SENSOR_1 == 0 + #error "TEMP_SENSOR_1 is required with 2 or more HOTENDS." + #elif !ANY_PIN(TEMP_1, MAX6675_SS2) + #error "TEMP_1_PIN not defined for this board." + #elif ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + #error "HOTENDS must be 1 with TEMP_SENSOR_1_AS_REDUNDANT." + #endif + #if HOTENDS > 2 + #if TEMP_SENSOR_2 == 0 + #error "TEMP_SENSOR_2 is required with 3 or more HOTENDS." + #elif !HAS_HEATER_2 + #error "HEATER_2_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_2) + #error "TEMP_2_PIN not defined for this board." + #endif + #if HOTENDS > 3 + #if TEMP_SENSOR_3 == 0 + #error "TEMP_SENSOR_3 is required with 4 or more HOTENDS." + #elif !HAS_HEATER_3 + #error "HEATER_3_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_3) + #error "TEMP_3_PIN not defined for this board." + #endif + #if HOTENDS > 4 + #if TEMP_SENSOR_4 == 0 + #error "TEMP_SENSOR_4 is required with 5 or more HOTENDS." + #elif !HAS_HEATER_4 + #error "HEATER_4_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_4) + #error "TEMP_4_PIN not defined for this board." + #endif + #if HOTENDS > 5 + #if TEMP_SENSOR_5 == 0 + #error "TEMP_SENSOR_5 is required with 6 HOTENDS." + #elif !HAS_HEATER_5 + #error "HEATER_5_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_5) + #error "TEMP_5_PIN not defined for this board." + #endif + #if HOTENDS > 6 + #if TEMP_SENSOR_6 == 0 + #error "TEMP_SENSOR_6 is required with 6 HOTENDS." + #elif !HAS_HEATER_6 + #error "HEATER_6_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_6) + #error "TEMP_6_PIN not defined for this board." + #endif + #if HOTENDS > 7 + #if TEMP_SENSOR_7 == 0 + #error "TEMP_SENSOR_7 is required with 7 HOTENDS." + #elif !HAS_HEATER_7 + #error "HEATER_7_PIN not defined for this board." + #elif !PIN_EXISTS(TEMP_7) + #error "TEMP_7_PIN not defined for this board." + #endif + #elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 7 HOTENDS." + #endif + #elif TEMP_SENSOR_6 != 0 + #error "TEMP_SENSOR_6 shouldn't be set with only 6 HOTENDS." + #elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 6 HOTENDS." + #endif + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS." + #elif TEMP_SENSOR_6 != 0 + #error "TEMP_SENSOR_6 shouldn't be set with only 5 HOTENDS." + #elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 5 HOTENDS." + #endif + #elif TEMP_SENSOR_4 != 0 + #error "TEMP_SENSOR_4 shouldn't be set with only 4 HOTENDS." + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 4 HOTENDS." + #elif TEMP_SENSOR_6 != 0 + #error "TEMP_SENSOR_6 shouldn't be set with only 4 HOTENDS." + #elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 4 HOTENDS." + #endif + #elif TEMP_SENSOR_3 != 0 + #error "TEMP_SENSOR_3 shouldn't be set with only 3 HOTENDS." + #elif TEMP_SENSOR_4 != 0 + #error "TEMP_SENSOR_4 shouldn't be set with only 3 HOTENDS." + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 3 HOTENDS." + #elif TEMP_SENSOR_6 != 0 + #error "TEMP_SENSOR_6 shouldn't be set with only 3 HOTENDS." + #elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 3 HOTENDS." + #endif + #elif TEMP_SENSOR_2 != 0 + #error "TEMP_SENSOR_2 shouldn't be set with only 2 HOTENDS." + #elif TEMP_SENSOR_3 != 0 + #error "TEMP_SENSOR_3 shouldn't be set with only 2 HOTENDS." + #elif TEMP_SENSOR_4 != 0 + #error "TEMP_SENSOR_4 shouldn't be set with only 2 HOTENDS." + #elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 2 HOTENDS." + #elif TEMP_SENSOR_6 != 0 + #error "TEMP_SENSOR_6 shouldn't be set with only 2 HOTENDS." + #elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 2 HOTENDS." + #endif +#elif TEMP_SENSOR_1 != 0 && DISABLED(TEMP_SENSOR_1_AS_REDUNDANT) + #error "TEMP_SENSOR_1 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_2 != 0 + #error "TEMP_SENSOR_2 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_3 != 0 + #error "TEMP_SENSOR_3 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_4 != 0 + #error "TEMP_SENSOR_4 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_5 != 0 + #error "TEMP_SENSOR_5 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_6 != 0 + #error "TEMP_SENSOR_6 shouldn't be set with only 1 HOTEND." +#elif TEMP_SENSOR_7 != 0 + #error "TEMP_SENSOR_7 shouldn't be set with only 1 HOTEND." +#endif + +#if TEMP_SENSOR_CHAMBER && !PIN_EXISTS(TEMP_CHAMBER) + #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN. Please add it to your configuration." +#endif + +#if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) + #error "CHAMBER_FAN_MODE must be between 0 and 2. Please update your Configuration_adv.h." +#endif + +#if ENABLED(CHAMBER_VENT) + #ifndef CHAMBER_VENT_SERVO_NR + #error "CHAMBER_VENT_SERVO_NR is required for CHAMBER SERVO. Update your Configuration_adv.h." + #elif !NUM_SERVOS + #error "NUM_SERVOS is required for a Heated Chamber vent servo (CHAMBER_VENT_SERVO_NR)." + #elif CHAMBER_VENT_SERVO_NR >= NUM_SERVOS + #error "CHAMBER_VENT_SERVO_NR must be smaller than NUM_SERVOS." + #elif HAS_Z_SERVO_PROBE && CHAMBER_VENT_SERVO_NR == Z_PROBE_SERVO_NR + #error "CHAMBER SERVO is already used by BLTOUCH. Please change." + #elif CHAMBER_VENT_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) + #error "SERVO0_PIN must be defined for your Heated Chamber vent servo." + #elif CHAMBER_VENT_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) + #error "SERVO1_PIN must be defined for your Heated Chamber vent servo." + #elif CHAMBER_VENT_SERVO_NR == 2 && !PIN_EXISTS(SERVO2) + #error "SERVO2_PIN must be defined for your Heated Chamber vent servo." + #elif CHAMBER_VENT_SERVO_NR == 3 && !PIN_EXISTS(SERVO3) + #error "SERVO3_PIN must be defined for your Heated Chamber vent servo." + #endif +#endif + +#if TEMP_SENSOR_PROBE + #if !PIN_EXISTS(TEMP_PROBE) + #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN. Please add it to your configuration." + #elif !HAS_TEMP_ADC_PROBE + #error "TEMP_PROBE_PIN must be an ADC pin." + #elif !ENABLED(FIX_MOUNTED_PROBE) + #error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE." + #endif +#endif + +#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) && TEMP_SENSOR_1 == 0 + #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." +#endif + +#if ENABLED(MAX6675_IS_MAX31865) && (!defined(MAX31865_SENSOR_OHMS) || !defined(MAX31865_CALIBRATION_OHMS)) + #error "MAX31865_SENSOR_OHMS and MAX31865_CALIBRATION_OHMS must be set in Configuration.h when using a MAX31865 temperature sensor." +#endif + +/** + * Test Heater, Temp Sensor, and Extruder Pins + */ +#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." +#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 + */ +#if ENABLED(TEMP_STAT_LEDS) && !ANY_PIN(STAT_LED_RED, STAT_LED_BLUE) + #error "TEMP_STAT_LEDS requires STAT_LED_RED_PIN or STAT_LED_BLUE_PIN, preferably both." +#endif + +/** + * LED Control Menu + */ +#if ENABLED(LED_CONTROL_MENU) && !HAS_COLOR_LEDS + #error "LED_CONTROL_MENU requires BLINKM, RGB_LED, RGBW_LED, PCA9533, PCA9632, or NEOPIXEL_LED." +#endif + +/** + * LED Backlight Timeout + */ +#if defined(LED_BACKLIGHT_TIMEOUT) && !(ENABLED(PSU_CONTROL) && EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1)) + #error "LED_BACKLIGHT_TIMEOUT requires a FYSETC Mini Panel and a Power Switch." +#endif + +/** + * Basic multi hotend duplication mode + */ +#if ENABLED(MULTI_NOZZLE_DUPLICATION) + #if HOTENDS < 2 + #error "MULTI_NOZZLE_DUPLICATION requires 2 or more hotends." + #elif ENABLED(DUAL_X_CARRIAGE) + #error "MULTI_NOZZLE_DUPLICATION is incompatible with DUAL_X_CARRIAGE." + #elif ENABLED(SINGLENOZZLE) + #error "MULTI_NOZZLE_DUPLICATION is incompatible with SINGLENOZZLE." + #elif ENABLED(MIXING_EXTRUDER) + #error "MULTI_NOZZLE_DUPLICATION is incompatible with MIXING_EXTRUDER." + #elif ENABLED(SWITCHING_EXTRUDER) + #error "MULTI_NOZZLE_DUPLICATION is incompatible with SWITCHING_EXTRUDER." + #endif +#endif + +/** + * Test Extruder Stepper Pins + */ +#if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only + #if E_STEPPERS + #if !(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." + #endif + #if E_STEPPERS > 1 + #if !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) + #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 2 + #if !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) + #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 3 + #if !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) + #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 4 + #if !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) + #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 5 + #if !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) + #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 6 + #if !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) + #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." + #endif + #if E_STEPPERS > 7 + #if !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) + #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." + #endif + #endif // E_STEPPERS > 7 + #endif // E_STEPPERS > 6 + #endif // E_STEPPERS > 5 + #endif // E_STEPPERS > 4 + #endif // E_STEPPERS > 3 + #endif // E_STEPPERS > 2 + #endif // E_STEPPERS > 1 + #endif // E_STEPPERS +#endif + +/** + * Endstop Tests + */ + +#define _PLUG_UNUSED_TEST(A,P) (DISABLED(USE_##P##MIN_PLUG, USE_##P##MAX_PLUG) \ + && !(ENABLED(A##_DUAL_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) \ + && !(ENABLED(A##_MULTI_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) ) +#define _AXIS_PLUG_UNUSED_TEST(A) (_PLUG_UNUSED_TEST(A,X) && _PLUG_UNUSED_TEST(A,Y) && _PLUG_UNUSED_TEST(A,Z)) + +// At least 3 endstop plugs must be used +#if _AXIS_PLUG_UNUSED_TEST(X) + #error "You must enable USE_XMIN_PLUG or USE_XMAX_PLUG." +#endif +#if _AXIS_PLUG_UNUSED_TEST(Y) + #error "You must enable USE_YMIN_PLUG or USE_YMAX_PLUG." +#endif +#if _AXIS_PLUG_UNUSED_TEST(Z) + #error "You must enable USE_ZMIN_PLUG or USE_ZMAX_PLUG." +#endif + +// Delta and Cartesian use 3 homing endstops +#if !IS_SCARA + #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG) + #error "Enable USE_XMIN_PLUG when homing X to MIN." + #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG) + #error "Enable USE_XMAX_PLUG when homing X to MAX." + #elif Y_HOME_DIR < 0 && DISABLED(USE_YMIN_PLUG) + #error "Enable USE_YMIN_PLUG when homing Y to MIN." + #elif Y_HOME_DIR > 0 && DISABLED(USE_YMAX_PLUG) + #error "Enable USE_YMAX_PLUG when homing Y to MAX." + #endif +#endif + +// Z homing direction and plug usage flags +#if Z_HOME_DIR < 0 && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) + #error "Enable USE_ZMIN_PLUG when homing Z to MIN." +#elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) + #error "Z_HOME_DIR must be -1 when homing Z with the probe." +#elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) + #error "Enable USE_ZMAX_PLUG when homing Z to MAX." +#endif + +// Dual/multiple endstops requirements +#if ENABLED(X_DUAL_ENDSTOPS) + #if !X2_USE_ENDSTOP + #error "You must set X2_USE_ENDSTOP with X_DUAL_ENDSTOPS." + #elif X2_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when X2_USE_ENDSTOP is _XMIN_." + #elif X2_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when X2_USE_ENDSTOP is _XMAX_." + #elif X2_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when X2_USE_ENDSTOP is _YMIN_." + #elif X2_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when X2_USE_ENDSTOP is _YMAX_." + #elif X2_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when X2_USE_ENDSTOP is _ZMIN_." + #elif X2_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when X2_USE_ENDSTOP is _ZMAX_." + #elif !HAS_X2_MIN && !HAS_X2_MAX + #error "X2_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #elif ENABLED(DELTA) + #error "X_DUAL_ENDSTOPS is not compatible with DELTA." + #endif +#endif +#if ENABLED(Y_DUAL_ENDSTOPS) + #if !Y2_USE_ENDSTOP + #error "You must set Y2_USE_ENDSTOP with Y_DUAL_ENDSTOPS." + #elif Y2_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when Y2_USE_ENDSTOP is _XMIN_." + #elif Y2_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when Y2_USE_ENDSTOP is _XMAX_." + #elif Y2_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when Y2_USE_ENDSTOP is _YMIN_." + #elif Y2_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when Y2_USE_ENDSTOP is _YMAX_." + #elif Y2_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when Y2_USE_ENDSTOP is _ZMIN_." + #elif Y2_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when Y2_USE_ENDSTOP is _ZMAX_." + #elif !HAS_Y2_MIN && !HAS_Y2_MAX + #error "Y2_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #elif ENABLED(DELTA) + #error "Y_DUAL_ENDSTOPS is not compatible with DELTA." + #endif +#endif + +#if ENABLED(Z_MULTI_ENDSTOPS) + #if !Z2_USE_ENDSTOP + #error "You must set Z2_USE_ENDSTOP with Z_MULTI_ENDSTOPS when NUM_Z_STEPPER_DRIVERS >= 2." + #elif Z2_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when Z2_USE_ENDSTOP is _XMIN_." + #elif Z2_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when Z2_USE_ENDSTOP is _XMAX_." + #elif Z2_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when Z2_USE_ENDSTOP is _YMIN_." + #elif Z2_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when Z2_USE_ENDSTOP is _YMAX_." + #elif Z2_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when Z2_USE_ENDSTOP is _ZMIN_." + #elif Z2_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when Z2_USE_ENDSTOP is _ZMAX_." + #elif !HAS_Z2_MIN && !HAS_Z2_MAX + #error "Z2_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #elif ENABLED(DELTA) + #error "Z_MULTI_ENDSTOPS is not compatible with DELTA." + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 + #if !Z3_USE_ENDSTOP + #error "You must set Z3_USE_ENDSTOP with Z_MULTI_ENDSTOPS when NUM_Z_STEPPER_DRIVERS >= 3." + #elif Z3_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when Z3_USE_ENDSTOP is _XMIN_." + #elif Z3_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when Z3_USE_ENDSTOP is _XMAX_." + #elif Z3_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when Z3_USE_ENDSTOP is _YMIN_." + #elif Z3_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when Z3_USE_ENDSTOP is _YMAX_." + #elif Z3_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when Z3_USE_ENDSTOP is _ZMIN_." + #elif Z3_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when Z3_USE_ENDSTOP is _ZMAX_." + #elif !HAS_Z3_MIN && !HAS_Z3_MAX + #error "Z3_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #endif + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + #if !Z4_USE_ENDSTOP + #error "You must set Z4_USE_ENDSTOP with Z_MULTI_ENDSTOPS when NUM_Z_STEPPER_DRIVERS >= 4." + #elif Z4_USE_ENDSTOP == _XMIN_ && DISABLED(USE_XMIN_PLUG) + #error "USE_XMIN_PLUG is required when Z4_USE_ENDSTOP is _XMIN_." + #elif Z4_USE_ENDSTOP == _XMAX_ && DISABLED(USE_XMAX_PLUG) + #error "USE_XMAX_PLUG is required when Z4_USE_ENDSTOP is _XMAX_." + #elif Z4_USE_ENDSTOP == _YMIN_ && DISABLED(USE_YMIN_PLUG) + #error "USE_YMIN_PLUG is required when Z4_USE_ENDSTOP is _YMIN_." + #elif Z4_USE_ENDSTOP == _YMAX_ && DISABLED(USE_YMAX_PLUG) + #error "USE_YMAX_PLUG is required when Z4_USE_ENDSTOP is _YMAX_." + #elif Z4_USE_ENDSTOP == _ZMIN_ && DISABLED(USE_ZMIN_PLUG) + #error "USE_ZMIN_PLUG is required when Z4_USE_ENDSTOP is _ZMIN_." + #elif Z4_USE_ENDSTOP == _ZMAX_ && DISABLED(USE_ZMAX_PLUG) + #error "USE_ZMAX_PLUG is required when Z4_USE_ENDSTOP is _ZMAX_." + #elif !HAS_Z4_MIN && !HAS_Z4_MAX + #error "Z4_USE_ENDSTOP has been assigned to a nonexistent endstop!" + #endif + #endif +#endif + +#if defined(ENDSTOP_NOISE_THRESHOLD) && !WITHIN(ENDSTOP_NOISE_THRESHOLD, 2, 7) + #error "ENDSTOP_NOISE_THRESHOLD must be an integer from 2 to 7." +#endif + +/** + * Emergency Command Parser + */ +#if BOTH(IS_AT90USB, EMERGENCY_PARSER) + #error "EMERGENCY_PARSER does not work on boards with AT90USB processors (USBCON)." +#endif + +/** + * I2C bus + */ +#if ENABLED(EXPERIMENTAL_I2CBUS) && I2C_SLAVE_ADDRESS > 0 + #if I2C_SLAVE_ADDRESS < 8 + #error "I2C_SLAVE_ADDRESS can't be less than 8. (Addresses 0 - 7 are reserved.)" + #elif I2C_SLAVE_ADDRESS > 127 + #error "I2C_SLAVE_ADDRESS can't be over 127. (Only 7 bits allowed.)" + #endif +#endif + +/** + * G35 Assisted Tramming + */ +#if ENABLED(ASSISTED_TRAMMING) && !HAS_BED_PROBE + #error "ASSISTED_TRAMMING requires a bed probe." +#endif + +/** + * G38 Probe Target + */ +#if ENABLED(G38_PROBE_TARGET) + #if !HAS_BED_PROBE + #error "G38_PROBE_TARGET requires a bed probe." + #elif !IS_CARTESIAN + #error "G38_PROBE_TARGET requires a Cartesian machine." + #endif +#endif + +/** + * RGB_LED Requirements + */ +#define _RGB_TEST (PINS_EXIST(RGB_LED_R, RGB_LED_G, RGB_LED_B)) +#if ENABLED(PRINTER_EVENT_LEDS) && !HAS_COLOR_LEDS + #error "PRINTER_EVENT_LEDS requires BLINKM, PCA9533, PCA9632, RGB_LED, RGBW_LED or NEOPIXEL_LED." +#elif ENABLED(RGB_LED) + #if !_RGB_TEST + #error "RGB_LED requires RGB_LED_R_PIN, RGB_LED_G_PIN, and RGB_LED_B_PIN." + #elif ENABLED(RGBW_LED) + #error "Please enable only one of RGB_LED and RGBW_LED." + #endif +#elif ENABLED(RGBW_LED) + #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 +#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." + #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 +#endif + +#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 + #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(_TEST_PWM(E0_AUTO_FAN_PIN), "E0" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_1 + static_assert(_TEST_PWM(E1_AUTO_FAN_PIN), "E1" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_2 + static_assert(_TEST_PWM(E2_AUTO_FAN_PIN), "E2" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_3 + static_assert(_TEST_PWM(E3_AUTO_FAN_PIN), "E3" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_4 + static_assert(_TEST_PWM(E4_AUTO_FAN_PIN), "E4" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_5 + static_assert(_TEST_PWM(E5_AUTO_FAN_PIN), "E5" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_6 + static_assert(_TEST_PWM(E6_AUTO_FAN_PIN), "E6" AF_ERR_SUFF); + #elif HAS_AUTO_FAN_7 + static_assert(_TEST_PWM(E7_AUTO_FAN_PIN), "E7" AF_ERR_SUFF); + #endif +#endif + +/** + * Make sure only one EEPROM type is enabled + */ +#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(IIC_BL24CXX_EEPROM) + #error "Please select only one method of EEPROM Persistent Storage." + #endif +#endif + +/** + * Make sure features that need to write to the SD card can + */ +#if ENABLED(SDCARD_READONLY) && ANY(POWER_LOSS_RECOVERY, BINARY_FILE_TRANSFER, SDCARD_EEPROM_EMULATION) + #undef SDCARD_READONLY + #if ENABLED(POWER_LOSS_RECOVERY) + #warning "Either disable SDCARD_READONLY or disable POWER_LOSS_RECOVERY." + #elif ENABLED(BINARY_FILE_TRANSFER) + #warning "Either disable SDCARD_READONLY or disable BINARY_FILE_TRANSFER." + #elif ENABLED(SDCARD_EEPROM_EMULATION) + #warning "Either disable SDCARD_READONLY or disable SDCARD_EEPROM_EMULATION." + #endif +#endif + +/** + * Make sure only one display is enabled + */ +#if 1 < 0 \ + + (ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) && DISABLED(IS_RRD_SC)) \ + + (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) && NONE(MKS_MINI_12864, ENDER2_STOCKDISPLAY)) \ + + (ENABLED(MKS_MINI_12864) && DISABLED(MKS_LCD12864)) \ + + (ENABLED(EXTENSIBLE_UI) && DISABLED(IS_EXTUI)) \ + + (ENABLED(ULTIPANEL) && DISABLED(IS_ULTIPANEL)) \ + + ENABLED(RADDS_DISPLAY) \ + + ENABLED(ULTIMAKERCONTROLLER) \ + + ENABLED(PANEL_ONE) \ + + ENABLED(G3D_PANEL) \ + + ENABLED(RIGIDBOT_PANEL) \ + + ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ + + ENABLED(ZONESTAR_LCD) \ + + ENABLED(RA_CONTROL_PANEL) \ + + ENABLED(LCD_SAINSMART_I2C_1602) \ + + ENABLED(LCD_SAINSMART_I2C_2004) \ + + ENABLED(LCM1602) \ + + ENABLED(LCD_I2C_PANELOLU2) \ + + ENABLED(LCD_I2C_VIKI) \ + + ENABLED(SAV_3DLCD) \ + + ENABLED(FF_INTERFACEBOARD) \ + + ENABLED(REPRAPWORLD_GRAPHICAL_LCD) \ + + ENABLED(VIKI2) \ + + ENABLED(miniVIKI) \ + + ENABLED(MAKRPANEL) \ + + ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) \ + + ENABLED(BQ_LCD_SMART_CONTROLLER) \ + + ENABLED(CARTESIO_UI) \ + + ENABLED(LCD_FOR_MELZI) \ + + ENABLED(ULTI_CONTROLLER) \ + + ENABLED(MKS_LCD12864) \ + + ENABLED(ENDER2_STOCKDISPLAY) \ + + ENABLED(FYSETC_MINI_12864_X_X) \ + + ENABLED(FYSETC_MINI_12864_1_2) \ + + ENABLED(FYSETC_MINI_12864_2_0) \ + + ENABLED(FYSETC_MINI_12864_2_1) \ + + ENABLED(FYSETC_GENERIC_12864_1_1) \ + + ENABLED(CR10_STOCKDISPLAY) \ + + ENABLED(DWIN_CREALITY_LCD) \ + + ENABLED(ANET_FULL_GRAPHICS_LCD) \ + + ENABLED(AZSMZ_12864) \ + + ENABLED(SILVER_GATE_GLCD_CONTROLLER) \ + + ENABLED(SAV_3DGLCD) \ + + 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) \ + + ENABLED(DGUS_LCD_UI_ORIGIN) \ + + ENABLED(DGUS_LCD_UI_FYSETC) \ + + 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) \ + + ENABLED(ANYCUBIC_LCD_I3MEGA) \ + + ENABLED(ANYCUBIC_LCD_CHIRON) \ + + ENABLED(TFTGLCD_PANEL_SPI) \ + + ENABLED(TFTGLCD_PANEL_I2C) + #error "Please select only one LCD controller option." +#endif + +#undef IS_RRD_SC +#undef IS_RRD_FG_SC +#undef IS_ULTRA_LCD +#undef IS_U8GLIB_SSD1306 +#undef IS_RRW_KEYPAD +#undef IS_EXTUI +#undef IS_ULTIPANEL + +#if 1 < ENABLED(LCD_SCREEN_ROT_0) + ENABLED(LCD_SCREEN_ROT_90) + ENABLED(LCD_SCREEN_ROT_180) + ENABLED(LCD_SCREEN_ROT_270) + #error "Please enable only one LCD_SCREEN_ROT_* option: 0, 90, 180, or 270." +#endif + +/** + * Serial displays require a dedicated serial port + */ +#ifdef LCD_SERIAL_PORT + #if LCD_SERIAL_PORT == SERIAL_PORT + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT. Please update your configuration." + #elif defined(SERIAL_PORT_2) && LCD_SERIAL_PORT == SERIAL_PORT_2 + #error "LCD_SERIAL_PORT cannot be the same as SERIAL_PORT_2. Please update your configuration." + #endif +#else + #if HAS_DGUS_LCD + #error "The DGUS LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #error "The ANYCUBIC LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #elif ENABLED(MALYAN_LCD) + #error "MALYAN_LCD requires LCD_SERIAL_PORT to be defined in Configuration.h" + #endif +#endif + +/** + * FYSETC Mini 12864 RGB backlighting required + */ +#if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) && DISABLED(RGB_LED) + #error "RGB_LED is required for FYSETC_MINI_12864 1.2 and 2.0." +#elif EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) && DISABLED(LED_USER_PRESET_STARTUP) + #error "LED_USER_PRESET_STARTUP is required for FYSETC_MINI_12864 2.x displays." +#endif + +/** + * Check existing CS pins against enabled TMC SPI drivers. + */ +#define INVALID_TMC_SPI(ST) (AXIS_HAS_SPI(ST) && !PIN_EXISTS(ST##_CS)) +#if INVALID_TMC_SPI(X) + #error "An SPI driven TMC driver on X requires X_CS_PIN." +#elif INVALID_TMC_SPI(X2) + #error "An SPI driven TMC driver on X2 requires X2_CS_PIN." +#elif INVALID_TMC_SPI(Y) + #error "An SPI driven TMC driver on Y requires Y_CS_PIN." +#elif INVALID_TMC_SPI(Y2) + #error "An SPI driven TMC driver on Y2 requires Y2_CS_PIN." +#elif INVALID_TMC_SPI(Z) + #error "An SPI driven TMC driver on Z requires Z_CS_PIN." +#elif INVALID_TMC_SPI(Z2) + #error "An SPI driven TMC driver on Z2 requires Z2_CS_PIN." +#elif INVALID_TMC_SPI(Z3) + #error "An SPI driven TMC driver on Z3 requires Z3_CS_PIN." +#elif INVALID_TMC_SPI(Z4) + #error "An SPI driven TMC driver on Z4 requires Z4_CS_PIN." +#elif INVALID_TMC_SPI(E0) + #error "An SPI driven TMC driver on E0 requires E0_CS_PIN." +#elif INVALID_TMC_SPI(E1) + #error "An SPI driven TMC driver on E1 requires E1_CS_PIN." +#elif INVALID_TMC_SPI(E2) + #error "An SPI driven TMC driver on E2 requires E2_CS_PIN." +#elif INVALID_TMC_SPI(E3) + #error "An SPI driven TMC driver on E3 requires E3_CS_PIN." +#elif INVALID_TMC_SPI(E4) + #error "An SPI driven TMC driver on E4 requires E4_CS_PIN." +#elif INVALID_TMC_SPI(E5) + #error "An SPI driven TMC driver on E5 requires E5_CS_PIN." +#elif INVALID_TMC_SPI(E6) + #error "An SPI driven TMC driver on E6 requires E6_CS_PIN." +#elif INVALID_TMC_SPI(E7) + #error "An SPI driven TMC driver on E7 requires E7_CS_PIN." +#endif +#undef INVALID_TMC_SPI + +/** + * Check existing RX/TX pins against enable TMC UART drivers. + */ +#define INVALID_TMC_UART(ST) (AXIS_HAS_UART(ST) && !(defined(ST##_HARDWARE_SERIAL) || (PINS_EXIST(ST##_SERIAL_RX, ST##_SERIAL_TX)))) +#if INVALID_TMC_UART(X) + #error "TMC2208 or TMC2209 on X requires X_HARDWARE_SERIAL or X_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(X2) + #error "TMC2208 or TMC2209 on X2 requires X2_HARDWARE_SERIAL or X2_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(Y) + #error "TMC2208 or TMC2209 on Y requires Y_HARDWARE_SERIAL or Y_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(Y2) + #error "TMC2208 or TMC2209 on Y2 requires Y2_HARDWARE_SERIAL or Y2_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(Z) + #error "TMC2208 or TMC2209 on Z requires Z_HARDWARE_SERIAL or Z_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(Z2) + #error "TMC2208 or TMC2209 on Z2 requires Z2_HARDWARE_SERIAL or Z2_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(Z3) + #error "TMC2208 or TMC2209 on Z3 requires Z3_HARDWARE_SERIAL or Z3_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(Z4) + #error "TMC2208 or TMC2209 on Z4 requires Z4_HARDWARE_SERIAL or Z4_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E0) + #error "TMC2208 or TMC2209 on E0 requires E0_HARDWARE_SERIAL or E0_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E1) + #error "TMC2208 or TMC2209 on E1 requires E1_HARDWARE_SERIAL or E1_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E2) + #error "TMC2208 or TMC2209 on E2 requires E2_HARDWARE_SERIAL or E2_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E3) + #error "TMC2208 or TMC2209 on E3 requires E3_HARDWARE_SERIAL or E3_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E4) + #error "TMC2208 or TMC2209 on E4 requires E4_HARDWARE_SERIAL or E4_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E5) + #error "TMC2208 or TMC2209 on E5 requires E5_HARDWARE_SERIAL or E5_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E6) + #error "TMC2208 or TMC2209 on E6 requires E6_HARDWARE_SERIAL or E6_SERIAL_(RX|TX)_PIN." +#elif INVALID_TMC_UART(E7) + #error "TMC2208 or TMC2209 on E7 requires E7_HARDWARE_SERIAL or E7_SERIAL_(RX|TX)_PIN." +#endif +#undef INVALID_TMC_UART + +/** + * TMC2209 slave address values + */ +#define INVALID_TMC_ADDRESS(ST) static_assert(0 <= ST##_SLAVE_ADDRESS && ST##_SLAVE_ADDRESS <= 3, "TMC2209 slave address must be 0, 1, 2 or 3") +#if AXIS_DRIVER_TYPE_X(TMC2209) + INVALID_TMC_ADDRESS(X); +#elif AXIS_DRIVER_TYPE_X2(TMC2209) + INVALID_TMC_ADDRESS(X2); +#elif AXIS_DRIVER_TYPE_Y(TMC2209) + INVALID_TMC_ADDRESS(Y); +#elif AXIS_DRIVER_TYPE_Y2(TMC2209) + INVALID_TMC_ADDRESS(Y2); +#elif AXIS_DRIVER_TYPE_Z(TMC2209) + INVALID_TMC_ADDRESS(Z); +#elif AXIS_DRIVER_TYPE_Z2(TMC2209) + INVALID_TMC_ADDRESS(Z2); +#elif AXIS_DRIVER_TYPE_Z3(TMC2209) + INVALID_TMC_ADDRESS(Z3); +#elif AXIS_DRIVER_TYPE_Z4(TMC2209) + INVALID_TMC_ADDRESS(Z4); +#elif AXIS_DRIVER_TYPE_E0(TMC2209) + INVALID_TMC_ADDRESS(E0); +#elif AXIS_DRIVER_TYPE_E1(TMC2209) + INVALID_TMC_ADDRESS(E1); +#elif AXIS_DRIVER_TYPE_E2(TMC2209) + INVALID_TMC_ADDRESS(E2); +#elif AXIS_DRIVER_TYPE_E3(TMC2209) + INVALID_TMC_ADDRESS(E3); +#elif AXIS_DRIVER_TYPE_E4(TMC2209) + INVALID_TMC_ADDRESS(E4); +#elif AXIS_DRIVER_TYPE_E5(TMC2209) + INVALID_TMC_ADDRESS(E5); +#elif AXIS_DRIVER_TYPE_E6(TMC2209) + INVALID_TMC_ADDRESS(E6); +#elif AXIS_DRIVER_TYPE_E7(TMC2209) + INVALID_TMC_ADDRESS(E7); +#endif +#undef INVALID_TMC_ADDRESS + +#define _TMC_MICROSTEP_IS_VALID(MS) (MS == 0 || MS == 2 || MS == 4 || MS == 8 || MS == 16 || MS == 32 || MS == 64 || MS == 128 || MS == 256) +#define TMC_MICROSTEP_IS_VALID(M) (!AXIS_IS_TMC(M) || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) +#define INVALID_TMC_MS(ST) static_assert(0, "Invalid " STRINGIFY(ST) "_MICROSTEPS. Valid values are 0, 2, 4, 8, 16, 32, 64, 128, and 256.") + +#if !TMC_MICROSTEP_IS_VALID(X) + INVALID_TMC_MS(X); +#elif !TMC_MICROSTEP_IS_VALID(Y) + INVALID_TMC_MS(Y) +#elif !TMC_MICROSTEP_IS_VALID(Z) + INVALID_TMC_MS(Z) +#elif !TMC_MICROSTEP_IS_VALID(X2) + INVALID_TMC_MS(X2); +#elif !TMC_MICROSTEP_IS_VALID(Y2) + INVALID_TMC_MS(Y2) +#elif !TMC_MICROSTEP_IS_VALID(Z2) + INVALID_TMC_MS(Z2) +#elif !TMC_MICROSTEP_IS_VALID(Z3) + INVALID_TMC_MS(Z3) +#elif !TMC_MICROSTEP_IS_VALID(Z4) + INVALID_TMC_MS(Z4) +#elif !TMC_MICROSTEP_IS_VALID(E0) + INVALID_TMC_MS(E0) +#elif !TMC_MICROSTEP_IS_VALID(E1) + INVALID_TMC_MS(E1) +#elif !TMC_MICROSTEP_IS_VALID(E2) + INVALID_TMC_MS(E2) +#elif !TMC_MICROSTEP_IS_VALID(E3) + INVALID_TMC_MS(E3) +#elif !TMC_MICROSTEP_IS_VALID(E4) + INVALID_TMC_MS(E4) +#elif !TMC_MICROSTEP_IS_VALID(E5) + INVALID_TMC_MS(E5) +#elif !TMC_MICROSTEP_IS_VALID(E6) + INVALID_TMC_MS(E6) +#elif !TMC_MICROSTEP_IS_VALID(E7) + INVALID_TMC_MS(E7) +#endif +#undef INVALID_TMC_MS +#undef TMC_MICROSTEP_IS_VALID +#undef _TMC_MICROSTEP_IS_VALID + +#if ENABLED(DELTA) && (ENABLED(STEALTHCHOP_XY) != ENABLED(STEALTHCHOP_Z)) + #error "STEALTHCHOP_XY and STEALTHCHOP_Z must be the same on DELTA." +#endif + +#if ENABLED(SENSORLESS_HOMING) + // Require STEALTHCHOP for SENSORLESS_HOMING on DELTA as the transition from spreadCycle to stealthChop + // is necessary in order to reset the stallGuard indication between the initial movement of all three + // towers to +Z and the individual homing of each tower. This restriction can be removed once a means of + // clearing the stallGuard activated status is found. + + // Stall detection DIAG = HIGH : TMC2209 + // Stall detection DIAG = LOW : TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 + #define X_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(X,TMC2209) + #define Y_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Y,TMC2209) + #define Z_ENDSTOP_INVERTING !AXIS_DRIVER_TYPE(Z,TMC2209) + + #if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z) + #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z." + #elif X_SENSORLESS && X_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMIN) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMIN (or ENDSTOPPULLUPS) when homing to X_MIN." + #elif X_SENSORLESS && X_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_XMAX) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_XMAX (or ENDSTOPPULLUPS) when homing to X_MAX." + #elif Y_SENSORLESS && Y_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMIN) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMIN (or ENDSTOPPULLUPS) when homing to Y_MIN." + #elif Y_SENSORLESS && Y_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_YMAX) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_YMAX (or ENDSTOPPULLUPS) when homing to Y_MAX." + #elif Z_SENSORLESS && Z_HOME_DIR < 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMIN (or ENDSTOPPULLUPS) when homing to Z_MIN." + #elif Z_SENSORLESS && Z_HOME_DIR > 0 && NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMAX) + #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_ZMAX (or ENDSTOPPULLUPS) when homing to Z_MAX." + #elif X_SENSORLESS && X_HOME_DIR < 0 && X_MIN_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING + #if X_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = true when homing to X_MIN." + #else + #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to X_MIN." + #endif + #elif X_SENSORLESS && X_HOME_DIR > 0 && X_MAX_ENDSTOP_INVERTING != X_ENDSTOP_INVERTING + #if X_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = true when homing to X_MAX." + #else + #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to X_MAX." + #endif + #elif Y_SENSORLESS && Y_HOME_DIR < 0 && Y_MIN_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING + #if Y_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = true when homing to Y_MIN." + #else + #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MIN." + #endif + #elif Y_SENSORLESS && Y_HOME_DIR > 0 && Y_MAX_ENDSTOP_INVERTING != Y_ENDSTOP_INVERTING + #if Y_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = true when homing to Y_MAX." + #else + #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Y_MAX." + #endif + #elif Z_SENSORLESS && Z_HOME_DIR < 0 && Z_MIN_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING + #if Z_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = true when homing to Z_MIN." + #else + #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MIN." + #endif + #elif Z_SENSORLESS && Z_HOME_DIR > 0 && Z_MAX_ENDSTOP_INVERTING != Z_ENDSTOP_INVERTING + #if Z_ENDSTOP_INVERTING + #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = true when homing to Z_MAX." + #else + #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_INVERTING = false when homing TMC2209 to Z_MAX." + #endif + #elif ENDSTOP_NOISE_THRESHOLD + #error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_THRESHOLD." + #elif !(X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS) + #error "SENSORLESS_HOMING requires a TMC stepper driver with StallGuard on X, Y, or Z axes." + #endif + + #undef X_ENDSTOP_INVERTING + #undef Y_ENDSTOP_INVERTING + #undef Z_ENDSTOP_INVERTING +#endif + +// Sensorless probing requirements +#if ENABLED(SENSORLESS_PROBING) + #if ENABLED(DELTA) && !(X_SENSORLESS && Y_SENSORLESS && Z_SENSORLESS) + #error "SENSORLESS_PROBING for DELTA requires TMC stepper drivers with StallGuard on X, Y, and Z axes." + #elif !Z_SENSORLESS + #error "SENSORLESS_PROBING requires a TMC stepper driver with StallGuard on Z." + #endif +#endif + +// Sensorless homing is required for both combined steppers in an H-bot +#if CORE_IS_XY && X_SENSORLESS != Y_SENSORLESS + #error "CoreXY requires both X and Y to use sensorless homing if either one does." +#elif CORE_IS_XZ && X_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE + #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 +#if ENABLED(HYBRID_THRESHOLD) && !STEALTHCHOP_ENABLED + #error "Enable STEALTHCHOP_(XY|Z|E) to use HYBRID_THRESHOLD." +#elif ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD + #error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers." +#elif ENABLED(SENSORLESS_PROBING) && !HAS_STALLGUARD + #error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers." +#elif STEALTHCHOP_ENABLED && !HAS_STEALTHCHOP + #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers." +#endif + +/** + * TMC SPI Chaining + */ +#define IN_CHAIN(A) ((A##_CHAIN_POS > 0) && !HAS_L64XX) +#if IN_CHAIN(X ) || IN_CHAIN(Y ) || IN_CHAIN(Z ) || IN_CHAIN(X2) || IN_CHAIN(Y2) || IN_CHAIN(Z2) || IN_CHAIN(Z3) || IN_CHAIN(Z4) \ + || IN_CHAIN(E0) || IN_CHAIN(E1) || IN_CHAIN(E2) || IN_CHAIN(E3) || IN_CHAIN(E4) || IN_CHAIN(E5) || IN_CHAIN(E6) || IN_CHAIN(E7) + #define BAD_CHAIN(A) (IN_CHAIN(A) && !PIN_EXISTS(A##_CS)) + #if BAD_CHAIN(X ) || BAD_CHAIN(Y ) || BAD_CHAIN(Z ) || BAD_CHAIN(X2) || BAD_CHAIN(Y2) || BAD_CHAIN(Z2) || BAD_CHAIN(Z3) || BAD_CHAIN(Z4) \ + || BAD_CHAIN(E0) || BAD_CHAIN(E1) || BAD_CHAIN(E2) || BAD_CHAIN(E3) || BAD_CHAIN(E4) || BAD_CHAIN(E5) || BAD_CHAIN(E6) || BAD_CHAIN(E7) + #error "All chained TMC drivers need a CS pin." + #else + #if IN_CHAIN(X) + #define CS_COMPARE X_CS_PIN + #elif IN_CHAIN(Y) + #define CS_COMPARE Y_CS_PIN + #elif IN_CHAIN(Z) + #define CS_COMPARE Z_CS_PIN + #elif IN_CHAIN(X2) + #define CS_COMPARE X2_CS_PIN + #elif IN_CHAIN(Y2) + #define CS_COMPARE Y2_CS_PIN + #elif IN_CHAIN(Z2) + #define CS_COMPARE Z2_CS_PIN + #elif IN_CHAIN(Z3) + #define CS_COMPARE Z3_CS_PIN + #elif IN_CHAIN(E0) + #define CS_COMPARE E0_CS_PIN + #elif IN_CHAIN(E1) + #define CS_COMPARE E1_CS_PIN + #elif IN_CHAIN(E2) + #define CS_COMPARE E2_CS_PIN + #elif IN_CHAIN(E3) + #define CS_COMPARE E3_CS_PIN + #elif IN_CHAIN(E4) + #define CS_COMPARE E4_CS_PIN + #elif IN_CHAIN(E5) + #define CS_COMPARE E5_CS_PIN + #elif IN_CHAIN(E6) + #define CS_COMPARE E6_CS_PIN + #elif IN_CHAIN(E7) + #define CS_COMPARE E7_CS_PIN + #endif + #define BAD_CS_PIN(A) (IN_CHAIN(A) && A##_CS_PIN != CS_COMPARE) + #if BAD_CS_PIN(X ) || BAD_CS_PIN(Y ) || BAD_CS_PIN(Z ) || BAD_CS_PIN(X2) || BAD_CS_PIN(Y2) || BAD_CS_PIN(Z2) || BAD_CS_PIN(Z3) || BAD_CS_PIN(Z4) \ + || BAD_CS_PIN(E0) || BAD_CS_PIN(E1) || BAD_CS_PIN(E2) || BAD_CS_PIN(E3) || BAD_CS_PIN(E4) || BAD_CS_PIN(E5) || BAD_CS_PIN(E6) || BAD_CS_PIN(E7) + #error "All chained TMC drivers must use the same CS pin." + #endif + #undef BAD_CS_PIN + #undef CS_COMPARE + #endif + #undef BAD_CHAIN +#endif +#undef IN_CHAIN + +/** + * Digipot requirement + */ +#if HAS_MOTOR_CURRENT_I2C + #if BOTH(DIGIPOT_MCP4018, DIGIPOT_MCP4451) + #error "Enable only one of DIGIPOT_MCP4018 or DIGIPOT_MCP4451." + #elif !MB(MKS_SBASE) \ + && (!defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1)) + #error "DIGIPOT_MCP4018/4451 requires DIGIPOTS_I2C_SDA_* pins to be defined." + #endif +#endif + +/** + * Check per-axis initializers for errors + */ +constexpr float sanity_arr_1[] = DEFAULT_AXIS_STEPS_PER_UNIT, + sanity_arr_2[] = DEFAULT_MAX_FEEDRATE, + sanity_arr_3[] = DEFAULT_MAX_ACCELERATION; + +#define _ARR_TEST(N,I) (sanity_arr_##N[_MIN(I,int(COUNT(sanity_arr_##N))-1)] > 0) + +static_assert(COUNT(sanity_arr_1) >= XYZE, "DEFAULT_AXIS_STEPS_PER_UNIT requires X, Y, Z and E elements."); +static_assert(COUNT(sanity_arr_1) <= XYZE_N, "DEFAULT_AXIS_STEPS_PER_UNIT has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); +static_assert( _ARR_TEST(1,0) && _ARR_TEST(1,1) && _ARR_TEST(1,2) + && _ARR_TEST(1,3) && _ARR_TEST(1,4) && _ARR_TEST(1,5) + && _ARR_TEST(1,6) && _ARR_TEST(1,7) && _ARR_TEST(1,8), + "DEFAULT_AXIS_STEPS_PER_UNIT values must be positive."); + +static_assert(COUNT(sanity_arr_2) >= XYZE, "DEFAULT_MAX_FEEDRATE requires X, Y, Z and E elements."); +static_assert(COUNT(sanity_arr_2) <= XYZE_N, "DEFAULT_MAX_FEEDRATE has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); +static_assert( _ARR_TEST(2,0) && _ARR_TEST(2,1) && _ARR_TEST(2,2) + && _ARR_TEST(2,3) && _ARR_TEST(2,4) && _ARR_TEST(2,5) + && _ARR_TEST(2,6) && _ARR_TEST(2,7) && _ARR_TEST(2,8), + "DEFAULT_MAX_FEEDRATE values must be positive."); + +static_assert(COUNT(sanity_arr_3) >= XYZE, "DEFAULT_MAX_ACCELERATION requires X, Y, Z and E elements."); +static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too many elements. (Did you forget to enable DISTINCT_E_FACTORS?)"); +static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) + && _ARR_TEST(3,3) && _ARR_TEST(3,4) && _ARR_TEST(3,5) + && _ARR_TEST(3,6) && _ARR_TEST(3,7) && _ARR_TEST(3,8), + "DEFAULT_MAX_ACCELERATION values must be positive."); + +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #ifdef MAX_ACCEL_EDIT_VALUES + constexpr float sanity_arr_4[] = MAX_ACCEL_EDIT_VALUES; + static_assert(COUNT(sanity_arr_4) >= XYZE, "MAX_ACCEL_EDIT_VALUES requires X, Y, Z and E elements."); + static_assert(COUNT(sanity_arr_4) <= XYZE, "MAX_ACCEL_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); + static_assert( _ARR_TEST(4,0) && _ARR_TEST(4,1) && _ARR_TEST(4,2) + && _ARR_TEST(4,3) && _ARR_TEST(4,4) && _ARR_TEST(4,5) + && _ARR_TEST(4,6) && _ARR_TEST(4,7) && _ARR_TEST(4,8), + "MAX_ACCEL_EDIT_VALUES values must be positive."); + #endif +#endif + +#if ENABLED(LIMITED_MAX_FR_EDITING) + #ifdef MAX_FEEDRATE_EDIT_VALUES + constexpr float sanity_arr_5[] = MAX_FEEDRATE_EDIT_VALUES; + static_assert(COUNT(sanity_arr_5) >= XYZE, "MAX_FEEDRATE_EDIT_VALUES requires X, Y, Z and E elements."); + static_assert(COUNT(sanity_arr_5) <= XYZE, "MAX_FEEDRATE_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); + static_assert( _ARR_TEST(5,0) && _ARR_TEST(5,1) && _ARR_TEST(5,2) + && _ARR_TEST(5,3) && _ARR_TEST(5,4) && _ARR_TEST(5,5) + && _ARR_TEST(5,6) && _ARR_TEST(5,7) && _ARR_TEST(5,8), + "MAX_FEEDRATE_EDIT_VALUES values must be positive."); + #endif +#endif + +#if ENABLED(LIMITED_JERK_EDITING) + #ifdef MAX_JERK_EDIT_VALUES + constexpr float sanity_arr_6[] = MAX_JERK_EDIT_VALUES; + static_assert(COUNT(sanity_arr_6) >= XYZE, "MAX_JERK_EDIT_VALUES requires X, Y, Z and E elements."); + static_assert(COUNT(sanity_arr_6) <= XYZE, "MAX_JERK_EDIT_VALUES has too many elements. X, Y, Z and E elements only."); + static_assert( _ARR_TEST(6,0) && _ARR_TEST(6,1) && _ARR_TEST(6,2) + && _ARR_TEST(6,3) && _ARR_TEST(6,4) && _ARR_TEST(6,5) + && _ARR_TEST(6,6) && _ARR_TEST(6,7) && _ARR_TEST(6,8), + "MAX_JERK_EDIT_VALUES values must be positive."); + #endif +#endif + +#undef _ARR_TEST + +#if BOTH(CNC_COORDINATE_SYSTEMS, NO_WORKSPACE_OFFSETS) + #error "CNC_COORDINATE_SYSTEMS is incompatible with NO_WORKSPACE_OFFSETS." +#endif + +#if !BLOCK_BUFFER_SIZE || !IS_POWER_OF_2(BLOCK_BUFFER_SIZE) + #error "BLOCK_BUFFER_SIZE must be a power of 2." +#endif + +#if ENABLED(LED_CONTROL_MENU) && DISABLED(ULTIPANEL) + #error "LED_CONTROL_MENU requires an LCD controller." +#endif + +#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) && DISABLED(NEOPIXEL_LED) + #error "CASE_LIGHT_USE_NEOPIXEL requires NEOPIXEL_LED." +#endif + +#if ENABLED(SKEW_CORRECTION) + #if !defined(XY_SKEW_FACTOR) && !(defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD)) + #error "SKEW_CORRECTION requires XY_SKEW_FACTOR or XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD." + #endif + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #if !defined(XZ_SKEW_FACTOR) && !(defined(XZ_DIAG_AC) && defined(XZ_DIAG_BD) && defined(XZ_SIDE_AD)) + #error "SKEW_CORRECTION requires XZ_SKEW_FACTOR or XZ_DIAG_AC, XZ_DIAG_BD, XZ_SIDE_AD." + #endif + #if !defined(YZ_SKEW_FACTOR) && !(defined(YZ_DIAG_AC) && defined(YZ_DIAG_BD) && defined(YZ_SIDE_AD)) + #error "SKEW_CORRECTION requires YZ_SKEW_FACTOR or YZ_DIAG_AC, YZ_DIAG_BD, YZ_SIDE_AD." + #endif + #endif +#endif + +#if ENABLED(BACKUP_POWER_SUPPLY) && !PIN_EXISTS(POWER_LOSS) + #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." +#endif + +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + #if NUM_Z_STEPPER_DRIVERS <= 1 + #error "Z_STEPPER_AUTO_ALIGN requires NUM_Z_STEPPER_DRIVERS greater than 1." + #elif !HAS_BED_PROBE + #error "Z_STEPPER_AUTO_ALIGN requires a Z-bed probe." + #elif ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) && NUM_Z_STEPPER_DRIVERS < 3 + #error "Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS requires NUM_Z_STEPPER_DRIVERS to be 3 or 4." + #endif +#endif + +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + #if NONE(HAS_MOTOR_CURRENT_DAC, HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC, HAS_TRINAMIC_CONFIG, HAS_MOTOR_CURRENT_PWM) + #error "It is highly recommended to have adjustable current drivers to prevent damage. Disable this line to continue anyway." + #elif !defined(GANTRY_CALIBRATION_CURRENT) + #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_CURRENT to be set." + #elif !defined(GANTRY_CALIBRATION_EXTRA_HEIGHT) + #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_EXTRA_HEIGHT to be set." + #elif !defined(GANTRY_CALIBRATION_FEEDRATE) + #error "MECHANICAL_GANTRY_CALIBRATION Requires GANTRY_CALIBRATION_FEEDRATE to be set." + #endif + #if defined(GANTRY_CALIBRATION_SAFE_POSITION) && !defined(GANTRY_CALIBRATION_XY_PARK_FEEDRATE) + #error "GANTRY_CALIBRATION_SAFE_POSITION Requires GANTRY_CALIBRATION_XY_PARK_FEEDRATE to be set." + #endif +#endif + +#if BOTH(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + #error "You cannot use Z_STEPPER_AUTO_ALIGN and MECHANICAL_GANTRY_CALIBRATION at the same time." +#endif + +#if ENABLED(PRINTCOUNTER) && DISABLED(EEPROM_SETTINGS) + #error "PRINTCOUNTER requires EEPROM_SETTINGS. Please update your Configuration." +#endif + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && !PINS_EXIST(USB_CS, USB_INTR) + #error "USB_CS_PIN and USB_INTR_PIN are required for USB_FLASH_DRIVE_SUPPORT." +#endif + +#if ENABLED(SD_FIRMWARE_UPDATE) && !defined(__AVR_ATmega2560__) + #error "SD_FIRMWARE_UPDATE requires an ATmega2560-based (Arduino Mega) board." +#endif + +#if ENABLED(GCODE_MACROS) && !WITHIN(GCODE_MACROS_SLOTS, 1, 10) + #error "GCODE_MACROS_SLOTS must be a number from 1 to 10." +#endif + +#if ENABLED(CUSTOM_USER_MENUS) + #ifdef USER_GCODE_1 + constexpr char _chr1 = USER_GCODE_1[strlen(USER_GCODE_1) - 1]; + static_assert(_chr1 != '\n' && _chr1 != '\r', "USER_GCODE_1 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_2 + constexpr char _chr2 = USER_GCODE_2[strlen(USER_GCODE_2) - 1]; + static_assert(_chr2 != '\n' && _chr2 != '\r', "USER_GCODE_2 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_3 + constexpr char _chr3 = USER_GCODE_3[strlen(USER_GCODE_3) - 1]; + static_assert(_chr3 != '\n' && _chr3 != '\r', "USER_GCODE_3 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_4 + constexpr char _chr4 = USER_GCODE_4[strlen(USER_GCODE_4) - 1]; + static_assert(_chr4 != '\n' && _chr4 != '\r', "USER_GCODE_4 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_5 + constexpr char _chr5 = USER_GCODE_5[strlen(USER_GCODE_5) - 1]; + static_assert(_chr5 != '\n' && _chr5 != '\r', "USER_GCODE_5 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_6 + constexpr char _chr6 = USER_GCODE_6[strlen(USER_GCODE_6) - 1]; + static_assert(_chr6 != '\n' && _chr6 != '\r', "USER_GCODE_6 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_7 + constexpr char _chr7 = USER_GCODE_7[strlen(USER_GCODE_7) - 1]; + static_assert(_chr7 != '\n' && _chr7 != '\r', "USER_GCODE_7 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_8 + constexpr char _chr8 = USER_GCODE_8[strlen(USER_GCODE_8) - 1]; + static_assert(_chr8 != '\n' && _chr8 != '\r', "USER_GCODE_8 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_9 + constexpr char _chr9 = USER_GCODE_9[strlen(USER_GCODE_9) - 1]; + static_assert(_chr9 != '\n' && _chr9 != '\r', "USER_GCODE_9 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_10 + constexpr char _chr10 = USER_GCODE_10[strlen(USER_GCODE_10) - 1]; + static_assert(_chr10 != '\n' && _chr10 != '\r', "USER_GCODE_10 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_11 + constexpr char _chr11 = USER_GCODE_11[strlen(USER_GCODE_11) - 1]; + static_assert(_chr11 != '\n' && _chr11 != '\r', "USER_GCODE_11 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_12 + constexpr char _chr12 = USER_GCODE_12[strlen(USER_GCODE_12) - 1]; + static_assert(_chr12 != '\n' && _chr12 != '\r', "USER_GCODE_12 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_13 + constexpr char _chr13 = USER_GCODE_13[strlen(USER_GCODE_13) - 1]; + static_assert(_chr13 != '\n' && _chr13 != '\r', "USER_GCODE_13 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_14 + constexpr char _chr14 = USER_GCODE_14[strlen(USER_GCODE_14) - 1]; + static_assert(_chr14 != '\n' && _chr14 != '\r', "USER_GCODE_14 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_15 + constexpr char _chr15 = USER_GCODE_15[strlen(USER_GCODE_15) - 1]; + static_assert(_chr15 != '\n' && _chr15 != '\r', "USER_GCODE_15 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_16 + constexpr char _chr16 = USER_GCODE_16[strlen(USER_GCODE_16) - 1]; + static_assert(_chr16 != '\n' && _chr16 != '\r', "USER_GCODE_16 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_17 + constexpr char _chr17 = USER_GCODE_17[strlen(USER_GCODE_17) - 1]; + static_assert(_chr17 != '\n' && _chr17 != '\r', "USER_GCODE_17 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_18 + constexpr char _chr18 = USER_GCODE_18[strlen(USER_GCODE_18) - 1]; + static_assert(_chr18 != '\n' && _chr18 != '\r', "USER_GCODE_18 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_19 + constexpr char _chr19 = USER_GCODE_19[strlen(USER_GCODE_19) - 1]; + static_assert(_chr19 != '\n' && _chr19 != '\r', "USER_GCODE_19 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_20 + constexpr char _chr20 = USER_GCODE_20[strlen(USER_GCODE_20) - 1]; + static_assert(_chr20 != '\n' && _chr20 != '\r', "USER_GCODE_20 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_21 + constexpr char _chr21 = USER_GCODE_21[strlen(USER_GCODE_21) - 1]; + static_assert(_chr21 != '\n' && _chr21 != '\r', "USER_GCODE_21 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_22 + constexpr char _chr22 = USER_GCODE_22[strlen(USER_GCODE_22) - 1]; + static_assert(_chr22 != '\n' && _chr22 != '\r', "USER_GCODE_22 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_23 + constexpr char _chr23 = USER_GCODE_23[strlen(USER_GCODE_23) - 1]; + static_assert(_chr23 != '\n' && _chr23 != '\r', "USER_GCODE_23 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_24 + constexpr char _chr24 = USER_GCODE_24[strlen(USER_GCODE_24) - 1]; + static_assert(_chr24 != '\n' && _chr24 != '\r', "USER_GCODE_24 cannot have a newline at the end. Please remove it."); + #endif + #ifdef USER_GCODE_25 + constexpr char _chr25 = USER_GCODE_25[strlen(USER_GCODE_25) - 1]; + static_assert(_chr25 != '\n' && _chr25 != '\r', "USER_GCODE_25 cannot have a newline at the end. Please remove it."); + #endif +#endif + +#if ENABLED(BACKLASH_COMPENSATION) + #ifndef BACKLASH_DISTANCE_MM + #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], + "BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " with your CORE system."); + #endif +#endif + +#if ENABLED(GRADIENT_MIX) && MIXING_VIRTUAL_TOOLS < 2 + #error "GRADIENT_MIX requires 2 or more MIXING_VIRTUAL_TOOLS." +#endif + +/** + * Photo G-code requirements + */ +#if ENABLED(PHOTO_GCODE) + #if (PIN_EXISTS(CHDK) + PIN_EXISTS(PHOTOGRAPH) + defined(PHOTO_SWITCH_POSITION)) > 1 + #error "Please define only one of CHDK_PIN, PHOTOGRAPH_PIN, or PHOTO_SWITCH_POSITION." + #elif defined(PHOTO_SWITCH_POSITION) && !defined(PHOTO_POSITION) + #error "PHOTO_SWITCH_POSITION requires PHOTO_POSITION. Please update your Configuration_adv.h." + #elif PIN_EXISTS(CHDK) && defined(CHDK_DELAY) + #error "CHDK_DELAY has been replaced by PHOTO_SWITCH_MS. Please update your Configuration_adv.h." + #elif PIN_EXISTS(CHDK) && !defined(PHOTO_SWITCH_MS) + #error "PHOTO_SWITCH_MS is required with CHDK_PIN. Please update your Configuration_adv.h." + #elif defined(PHOTO_RETRACT_MM) + static_assert(PHOTO_RETRACT_MM + 0 >= 0, "PHOTO_RETRACT_MM must be >= 0."); + #endif +#endif + +/** + * Průša MMU2 requirements + */ +#if ENABLED(PRUSA_MMU2) + #if EXTRUDERS != 5 + #error "PRUSA_MMU2 requires EXTRUDERS = 5." + #elif DISABLED(NOZZLE_PARK_FEATURE) + #error "PRUSA_MMU2 requires NOZZLE_PARK_FEATURE. Enable it to continue." + #elif EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR) + #error "PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." + #elif BOTH(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) + #error "Enable only one of PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR." + #elif DISABLED(ADVANCED_PAUSE_FEATURE) + static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2."); + #endif +#endif + +/** + * Advanced PRINTCOUNTER settings + */ +#if ENABLED(PRINTCOUNTER) + #if defined(SERVICE_INTERVAL_1) != defined(SERVICE_NAME_1) + #error "Both SERVICE_NAME_1 and SERVICE_INTERVAL_1 are required." + #elif defined(SERVICE_INTERVAL_2) != defined(SERVICE_NAME_2) + #error "Both SERVICE_NAME_2 and SERVICE_INTERVAL_2 are required." + #elif defined(SERVICE_INTERVAL_3) != defined(SERVICE_NAME_3) + #error "Both SERVICE_NAME_3 and SERVICE_INTERVAL_3 are required." + #endif +#endif + +/** + * Require soft endstops for certain setups + */ +#if !BOTH(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) + #if ENABLED(DUAL_X_CARRIAGE) + #error "DUAL_X_CARRIAGE requires both MIN_ and MAX_SOFTWARE_ENDSTOPS." + #elif HAS_HOTEND_OFFSET + #error "MIN_ and MAX_SOFTWARE_ENDSTOPS are both required with offset hotends." + #endif +#endif + +/** + * Ensure this option is set intentionally + */ +#if ENABLED(PSU_CONTROL) + #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 +#elif ENABLED(AUTO_POWER_CONTROL) + #error "AUTO_POWER_CONTROL requires PSU_CONTROL." +#endif + +#if HAS_CUTTER + #ifndef CUTTER_POWER_UNIT + #error "CUTTER_POWER_UNIT is required with a spindle or laser. Please update your Configuration_adv.h." + #elif !CUTTER_UNIT_IS(PWM255) && !CUTTER_UNIT_IS(PERCENT) && !CUTTER_UNIT_IS(RPM) + #error "CUTTER_POWER_UNIT must be PWM255, PERCENT, or RPM. Please update your Configuration_adv.h." + #endif + + #if ENABLED(LASER_POWER_INLINE) + #if ENABLED(SPINDLE_CHANGE_DIR) + #error "SPINDLE_CHANGE_DIR and LASER_POWER_INLINE are incompatible." + #elif ENABLED(LASER_MOVE_G0_OFF) && DISABLED(LASER_MOVE_POWER) + #error "LASER_MOVE_G0_OFF requires LASER_MOVE_POWER. Please update your Configuration_adv.h." + #endif + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + #if DISABLED(SPINDLE_LASER_PWM) + #error "LASER_POWER_INLINE_TRAPEZOID requires SPINDLE_LASER_PWM to function." + #elif ENABLED(S_CURVE_ACCELERATION) + //#ifndef LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN + // #define LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN + // #warning "Combining LASER_POWER_INLINE_TRAPEZOID with S_CURVE_ACCELERATION may result in unintended behavior." + //#endif + #endif + #endif + #if ENABLED(LASER_POWER_INLINE_INVERT) + //#ifndef LASER_POWER_INLINE_INVERT_WARN + // #define LASER_POWER_INLINE_INVERT_WARN + // #warning "Enabling LASER_POWER_INLINE_INVERT means that `M5` won't kill the laser immediately; use `M5 I` instead." + //#endif + #endif + #else + #if SPINDLE_LASER_POWERUP_DELAY < 1 + #error "SPINDLE_LASER_POWERUP_DELAY must be greater than 0." + #elif SPINDLE_LASER_POWERDOWN_DELAY < 1 + #error "SPINDLE_LASER_POWERDOWN_DELAY must be greater than 0." + #elif ENABLED(LASER_MOVE_POWER) + #error "LASER_MOVE_POWER requires LASER_POWER_INLINE." + #elif ANY(LASER_POWER_INLINE_TRAPEZOID, LASER_POWER_INLINE_INVERT, LASER_MOVE_G0_OFF, LASER_MOVE_POWER) + #error "Enabled an inline laser feature without inline laser power being enabled." + #endif + #endif + #define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == SPINDLE_LASER_PWM_PIN) + #if BOTH(SPINDLE_FEATURE, LASER_FEATURE) + #error "Enable only one of SPINDLE_FEATURE or LASER_FEATURE." + #elif !PIN_EXISTS(SPINDLE_LASER_ENA) + #error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN." + #elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR) + #error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR." + #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 !_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." + #elif !(defined(SPEED_POWER_INTERCEPT) && defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP)) + #error "SPINDLE_LASER_PWM equation constant(s) missing." + #elif _PIN_CONFLICT(X_MIN) + #error "SPINDLE_LASER_PWM pin conflicts with X_MIN_PIN." + #elif _PIN_CONFLICT(X_MAX) + #error "SPINDLE_LASER_PWM pin conflicts with X_MAX_PIN." + #elif _PIN_CONFLICT(Z_STEP) + #error "SPINDLE_LASER_PWM pin conflicts with Z_STEP_PIN." + #elif _PIN_CONFLICT(CASE_LIGHT) + #error "SPINDLE_LASER_PWM_PIN conflicts with CASE_LIGHT_PIN." + #elif _PIN_CONFLICT(E0_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E0_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E1_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E1_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E2_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E2_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E3_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E3_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E4_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E4_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E5_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E5_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E6_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E6_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(E7_AUTO_FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with E7_AUTO_FAN_PIN." + #elif _PIN_CONFLICT(FAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN_PIN." + #elif _PIN_CONFLICT(FAN1) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN1_PIN." + #elif _PIN_CONFLICT(FAN2) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN2_PIN." + #elif _PIN_CONFLICT(FAN3) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN3_PIN." + #elif _PIN_CONFLICT(FAN4) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN4_PIN." + #elif _PIN_CONFLICT(FAN5) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN5_PIN." + #elif _PIN_CONFLICT(FAN6) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN6_PIN." + #elif _PIN_CONFLICT(FAN7) + #error "SPINDLE_LASER_PWM_PIN conflicts with FAN7_PIN." + #elif _PIN_CONFLICT(CONTROLLERFAN) + #error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN." + #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY) + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY." + #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z) + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z." + #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E) + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E." + #endif + #endif + #undef _PIN_CONFLICT +#endif + +#if !HAS_MARLINUI_U8GLIB + #if ENABLED(PRINT_PROGRESS_SHOW_DECIMALS) + #error "PRINT_PROGRESS_SHOW_DECIMALS currently requires a Graphical LCD." + #endif +#endif + +#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 + +/** + * Check to make sure MONITOR_DRIVER_STATUS isn't enabled + * on boards where TMC drivers share the SPI bus with SD. + */ +#if HAS_TMC_SPI && ALL(MONITOR_DRIVER_STATUS, SDSUPPORT, USES_SHARED_SPI) + #error "MONITOR_DRIVER_STATUS and SDSUPPORT cannot be used together on boards with shared SPI." +#endif + +// G60/G61 Position Save +#if SAVED_POSITIONS > 256 + #error "SAVED_POSITIONS must be an integer from 0 to 256." +#endif + +/** + * Stepper Chunk support + */ +#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_SCREEN) + #ifndef XPT2046_X_CALIBRATION + #error "XPT2046_X_CALIBRATION must be defined with TOUCH_SCREEN." + #endif + #ifndef XPT2046_Y_CALIBRATION + #error "XPT2046_Y_CALIBRATION must be defined with TOUCH_SCREEN." + #endif + #ifndef XPT2046_X_OFFSET + #error "XPT2046_X_OFFSET must be defined with TOUCH_SCREEN." + #endif + #ifndef XPT2046_Y_OFFSET + #error "XPT2046_Y_OFFSET must be defined with TOUCH_SCREEN." + #endif +#endif + +/** + * Sanity check for WIFI + */ +#if EITHER(ESP3D_WIFISUPPORT, WIFISUPPORT) && DISABLED(ARDUINO_ARCH_ESP32) + #error "ESP3D_WIFISUPPORT or WIFISUPPORT requires an ESP32 MOTHERBOARD." +#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/inc/Version.h b/Marlin/src/inc/Version.h new file mode 100644 index 00000000..00ca9406 --- /dev/null +++ b/Marlin/src/inc/Version.h @@ -0,0 +1,122 @@ +/** + * 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 + +/** + * Release version. Leave the Marlin version or apply a custom scheme. + */ +#ifndef SHORT_BUILD_VERSION + #define SHORT_BUILD_VERSION "2.0.7.2" +#endif + +/** + * Verbose version identifier containing a unique identifier, such as the + * vendor name, download location, GitHub account, etc. + */ +#ifndef DETAILED_BUILD_VERSION + #define DETAILED_BUILD_VERSION SHORT_BUILD_VERSION +#endif + +/** + * The STRING_DISTRIBUTION_DATE represents when the binary file was built, + * here we define this default string as the date where the latest release + * version was tagged. + */ +#ifndef STRING_DISTRIBUTION_DATE + #define STRING_DISTRIBUTION_DATE "2020-10-15" +#endif + +/** + * Minimum Configuration.h and Configuration_adv.h file versions. + * Set based on the release version number. Used to catch an attempt to use + * older configurations. Override these if using a custom versioning scheme + * to alert users to major changes. + */ + +#define MARLIN_HEX_VERSION 020007 +#ifndef REQUIRED_CONFIGURATION_H_VERSION + #define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION +#endif +#ifndef REQUIRED_CONFIGURATION_ADV_H_VERSION + #define REQUIRED_CONFIGURATION_ADV_H_VERSION MARLIN_HEX_VERSION +#endif + +/** + * The protocol for communication to the host. Protocol indicates communication + * standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc. + * (Other behaviors are given by the firmware version and capabilities report.) + */ +#ifndef PROTOCOL_VERSION + #define PROTOCOL_VERSION "1.0" +#endif + +/** + * Define a generic printer name to be output to the LCD after booting Marlin. + */ +#ifndef MACHINE_NAME + #define MACHINE_NAME "3D Printer" +#endif + +/** + * Website where users can find Marlin source code for the binary installed on the + * device. Override this if you provide public source code download. (GPLv3 requires + * providing the source code to your customers.) + */ +#ifndef SOURCE_CODE_URL + #define SOURCE_CODE_URL "https://github.com/MarlinFirmware/Marlin" +#endif + +/** + * Default generic printer UUID. + */ +#ifndef DEFAULT_MACHINE_UUID + #define DEFAULT_MACHINE_UUID "cede2a2f-41a2-4748-9b12-c55c62f367ff" +#endif + + /** + * The WEBSITE_URL is the location where users can get more information such as + * documentation about a specific Marlin release. Displayed in the Info Menu. + */ +#ifndef WEBSITE_URL + #define WEBSITE_URL "https://marlinfw.org" +#endif + +/** + * Set the vendor info the serial USB interface, if changable + * Currently only supported by DUE platform + */ +#ifndef USB_DEVICE_VENDOR_ID + #define USB_DEVICE_VENDOR_ID 0x03EB /* ATMEL VID */ +#endif +#ifndef USB_DEVICE_PRODUCT_ID + #define USB_DEVICE_PRODUCT_ID 0x2424 /* MSC / CDC */ +#endif +//! USB Device string definitions (Optional) +#ifndef USB_DEVICE_MANUFACTURE_NAME + #define USB_DEVICE_MANUFACTURE_NAME WEBSITE_URL +#endif +#ifdef CUSTOM_MACHINE_NAME + #define USB_DEVICE_PRODUCT_NAME CUSTOM_MACHINE_NAME +#else + #define USB_DEVICE_PRODUCT_NAME MACHINE_NAME +#endif +#define USB_DEVICE_SERIAL_NAME "123985739853" diff --git a/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp new file mode 100644 index 00000000..aa3c3c04 --- /dev/null +++ b/Marlin/src/lcd/HD44780/lcdprint_hd44780.cpp @@ -0,0 +1,1122 @@ +/** + * @file lcdprint_hd44780.cpp + * @brief LCD print api for HD44780 + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +/** + * Due to the limitation of the HD44780 hardware, the current available LCD modules can only support + * Western(English), Cyrillic(Russian), Kana(Japanese) charsets. + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_HD44780 + +#include "../ultralcd.h" +#include "../../MarlinCore.h" + +#include "ultralcd_HD44780.h" + +#include + +extern LCD_CLASS lcd; + +int lcd_glyph_height() { return 1; } + +typedef struct _hd44780_charmap_t { + wchar_t uchar; // the unicode char + uint8_t idx; // the glyph of the char in the ROM + uint8_t idx2; // the char used to be combined with the idx to simulate a single char +} hd44780_charmap_t; + +#ifdef __AVR__ + #define IV(a) U##a +#else + #define IV(a) L##a +#endif + +static const hd44780_charmap_t g_hd44780_charmap_device[] PROGMEM = { + // sorted by uchar: + #if DISPLAY_CHARSET_HD44780 == JAPANESE + + {IV('¢'), 0xEC, 0}, // A2 + {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('ä'), 0xE1, 0}, // E4 + {IV('ö'), 0xEF, 0}, // F6 + {IV('÷'), 0xFD, 0}, // 00F7 + {IV('ü'), 0xF5, 0}, // 00FC + {IV('ˣ'), 0xEB, 0}, // 02E3 + + {IV('·'), 0xA5, 0}, // 0387 + {IV('Ώ'), 0xF4, 0}, // 038F + {IV('Θ'), 0xF2, 0}, // 0398, Theta + {IV('Ξ'), 0xE3, 0}, // 039E, Xi + {IV('Σ'), 0xF6, 0}, // 03A3, Sigma + {IV('Ω'), 0xF4, 0}, // 03A9, Omega + {IV('ά'), 0xE0, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('α'), 0xE0, 0}, // 03B1, alpha + {IV('β'), 0xE2, 0}, // 03B2, beta + {IV('ε'), 0xE3, 0}, // 03B5, epsilon + {IV('θ'), 0xF2, 0}, // 03B8, theta + {IV('μ'), 0xE4, 0}, // 03BC, mu + {IV('ξ'), 0xE3, 0}, // 03BE, xi + {IV('π'), 0xF7, 0}, // 03C0, pi + {IV('ρ'), 0xE6, 0}, // 03C1, rho + {IV('σ'), 0xE5, 0}, // 03C3, sigma + + {IV('←'), 0x7F, 0}, // 2190 + {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) + {IV('√'), 0xE8, 0}, // 221A + {IV('∞'), 0xF3, 0}, // 221E + {IV('█'), 0xFF, 0}, // 2588 + + //{IV(''), 0xA0, 0}, + {IV('。'), 0xA1, 0}, + {IV('「'), 0xA2, 0}, + {IV('」'), 0xA3, 0}, + {IV('゛'), 0xDE, 0}, // ‶ + {IV('゜'), 0xDF, 0}, // '〫' + {IV('゠'), '=', 0}, + {IV('ァ'), 0xA7, 0}, + {IV('ア'), 0xB1, 0}, + {IV('ィ'), 0xA8, 0}, + {IV('イ'), 0xB2, 0}, + {IV('ゥ'), 0xA9, 0}, + {IV('ウ'), 0xB3, 0}, + {IV('ェ'), 0xAA, 0}, + {IV('エ'), 0xB4, 0}, + {IV('ォ'), 0xAB, 0}, + + {IV('オ'), 0xB5, 0}, + {IV('カ'), 0xB6, 0}, + {IV('ガ'), 0xB6, 0xDE}, + {IV('キ'), 0xB7, 0}, + {IV('ギ'), 0xB7, 0xDE}, + {IV('ク'), 0xB8, 0}, + {IV('グ'), 0xB8, 0xDE}, + {IV('ケ'), 0xB9, 0}, + {IV('ゲ'), 0xB9, 0xDE}, + {IV('コ'), 0xBA, 0}, + {IV('ゴ'), 0xBA, 0xDE}, + {IV('サ'), 0xBB, 0}, + {IV('ザ'), 0xBB, 0xDE}, + {IV('シ'), 0xBC, 0}, + {IV('ジ'), 0xBC, 0xDE}, + {IV('ス'), 0xBD, 0}, + {IV('ズ'), 0xBD, 0xDE}, + {IV('セ'), 0xBE, 0}, + {IV('ゼ'), 0xBE, 0xDE}, + {IV('ソ'), 0xBF, 0}, + {IV('ゾ'), 0xBF, 0xDE}, + + {IV('タ'), 0xC0, 0}, + {IV('ダ'), 0xC0, 0xDE}, + {IV('チ'), 0xC1, 0}, + {IV('ヂ'), 0xC1, 0xDE}, + {IV('ッ'), 0xAF, 0}, + {IV('ツ'), 0xC2, 0}, + {IV('ヅ'), 0xC2, 0xDE}, + {IV('テ'), 0xC3, 0}, + {IV('デ'), 0xC3, 0xDE}, + {IV('ト'), 0xC4, 0}, + {IV('ド'), 0xC4, 0xDE}, + {IV('ナ'), 0xC5, 0}, + {IV('ニ'), 0xC6, 0}, + {IV('ヌ'), 0xC7, 0}, + {IV('ネ'), 0xC8, 0}, + {IV('ノ'), 0xC9, 0}, + {IV('ハ'), 0xCA, 0}, + {IV('バ'), 0xCA, 0xDE}, + {IV('パ'), 0xCA, 0xDF}, + {IV('ヒ'), 0xCB, 0}, + {IV('ビ'), 0xCB, 0xDE}, + {IV('ピ'), 0xCB, 0xDF}, + {IV('フ'), 0xCC, 0}, + {IV('ブ'), 0xCC, 0xDE}, + {IV('プ'), 0xCC, 0xDF}, + {IV('ヘ'), 0xCD, 0}, + {IV('ベ'), 0xCD, 0xDE}, + {IV('ペ'), 0xCD, 0xDF}, + {IV('ホ'), 0xCE, 0}, + {IV('ボ'), 0xCE, 0xDE}, + {IV('ポ'), 0xCE, 0xDF}, + {IV('マ'), 0xCF, 0}, + + {IV('ミ'), 0xD0, 0}, + {IV('ム'), 0xD1, 0}, + {IV('メ'), 0xD2, 0}, + {IV('モ'), 0xD3, 0}, + {IV('ャ'), 0xAC, 0}, + {IV('ヤ'), 0xD4, 0}, + {IV('ュ'), 0xAD, 0}, + {IV('ユ'), 0xD5, 0}, + {IV('ョ'), 0xAE, 0}, + {IV('ヨ'), 0xD6, 0}, + {IV('ラ'), 0xD7, 0}, + {IV('リ'), 0xD8, 0}, + {IV('ル'), 0xD9, 0}, + {IV('レ'), 0xDA, 0}, + {IV('ロ'), 0xDB, 0}, + {IV('ワ'), 0xDC, 0}, + {IV('ヲ'), 0xA6, 0}, + {IV('ン'), 0xDD, 0}, + {IV('ヴ'), 0xB3, 0xDE}, + {IV('ヷ'), 0xDC, 0xDE}, + {IV('ヺ'), 0xA6, 0xDE}, + {IV('・'), 0xA5, 0}, + {IV('ー'), 0xB0, 0}, + {IV('ヽ'), 0xA4, 0}, + + //{IV('g'), 0xE7, 0}, // error + //{IV(''), 0xE9, 0}, + //{IV('j'), 0xEA, 0}, // error + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + + //{IV('p'), 0xF0, 0}, // error + //{IV('q'), 0xF1, 0}, // error + //{IV(''), 0xF8, 0}, + //{IV('y'), 0xF9, 0}, // error + {IV('万'), 0xFB, 0}, + {IV('円'), 0xFC, 0}, + {IV('千'), 0xFA, 0}, + //{IV(''), 0xFE, 0}, + + //、・ヲァィゥェォャュョッー + {IV('、'), 0xA4, 0}, //ヽ + {IV('・'), 0xA5, 0}, //・ + {IV('ヲ'), 0xA6, 0}, //ヲ + {IV('ァ'), 0xA7, 0}, //ァ + {IV('ィ'), 0xA8, 0}, //ィ + {IV('ゥ'), 0xA9, 0}, //ゥ + {IV('ェ'), 0xAA, 0}, //ェ + {IV('ォ'), 0xAB, 0}, //ォ + {IV('ャ'), 0xAC, 0}, //ャ + {IV('ュ'), 0xAD, 0}, //ュ + {IV('ョ'), 0xAE, 0}, //ョ + {IV('ッ'), 0xAF, 0}, //ッ + {IV('ー'), 0xB0, 0}, //ー + + //アイウエオカキクケコサシスセ + {IV('ア'), 0xB1, 0}, //ア + {IV('イ'), 0xB2, 0}, //イ + {IV('ウ'), 0xB3, 0}, //ウ + {IV('エ'), 0xB4, 0}, //エ + {IV('オ'), 0xB5, 0}, //オ + {IV('カ'), 0xB6, 0}, //カ + {IV('キ'), 0xB7, 0}, //キ + {IV('ク'), 0xB8, 0}, //ク + {IV('ケ'), 0xB9, 0}, //ケ + {IV('コ'), 0xBA, 0}, //コ + {IV('サ'), 0xBB, 0}, //サ + {IV('シ'), 0xBC, 0}, //シ + {IV('ス'), 0xBD, 0}, //ス + {IV('セ'), 0xBE, 0}, //セ + + //ソタチツテトナニヌネノハヒフ + {IV('ソ'), 0xBF, 0}, //ソ + {IV('タ'), 0xC0, 0}, //タ + {IV('チ'), 0xC1, 0}, //チ + {IV('ツ'), 0xC2, 0}, //ツ + {IV('テ'), 0xC3, 0}, //テ + {IV('ト'), 0xC4, 0}, //ト + {IV('ナ'), 0xC5, 0}, //ナ + {IV('ニ'), 0xC6, 0}, //ニ + {IV('ヌ'), 0xC7, 0}, //ヌ + {IV('ネ'), 0xC8, 0}, //ネ + {IV('ノ'), 0xC9, 0}, //ノ + {IV('ハ'), 0xCA, 0}, //ハ + {IV('ヒ'), 0xCB, 0}, //ヒ + {IV('フ'), 0xCC, 0}, //フ + + //ヘホマミムメモヤユヨラリルレロワン゙゚ + {IV('ヘ'), 0xCD, 0}, //ヘ + {IV('ホ'), 0xCE, 0}, //ホ + {IV('マ'), 0xCF, 0}, //マ + {IV('ミ'), 0xD0, 0}, //ミ + {IV('ム'), 0xD1, 0}, //ム + {IV('メ'), 0xD2, 0}, //メ + {IV('モ'), 0xD3, 0}, //モ + {IV('ヤ'), 0xD4, 0}, //ヤ + {IV('ユ'), 0xD5, 0}, //ユ + {IV('ヨ'), 0xD6, 0}, //ヨ + {IV('ラ'), 0xD7, 0}, //ラ + {IV('リ'), 0xD8, 0}, //リ + {IV('ル'), 0xD9, 0}, //ル + {IV('レ'), 0xDA, 0}, //レ + {IV('ロ'), 0xDB, 0}, //ロ + {IV('ワ'), 0xDC, 0}, //ワ + {IV('ン'), 0xDD, 0}, //ン + {IV('゙'), 0xDE, 0}, // ゛ + {IV('゚'), 0xDF, 0}, // ゜ + + {IV('¥'), 0x5C, 0}, + + #elif DISPLAY_CHARSET_HD44780 == WESTERN + // 0x10 -- 0x1F (except 0x1C) + // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) + + {IV('¡'), 0xA9, 0}, + {IV('¢'), 0xA4, 0}, + {IV('£'), 0xA5, 0}, + {IV('¥'), 0xA6, 0}, + {IV('§'), 0xD2, 0}, // section sign + {IV('©'), 0xCF, 0}, + + {IV('ª'), 0x9D, 0}, + {IV('«'), 0xBB, 0}, + {IV('®'), 0xCE, 0}, + + {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) + //{IV(''), 0xD1, 0}, + {IV('±'), 0x10, 0}, //∓± + //{'='), 0x1C, 0}, // error + {IV('²'), 0x1E, 0}, + {IV('³'), 0x1F, 0}, + {IV('¶'), 0xD3, 0}, // pilcrow sign + {IV('º'), 0x9E, 0}, + {IV('»'), 0xBC, 0}, // 00BB + //{IV(''), 0xB3, 0}, // error + //{IV(''), 0xB4, 0}, // error + {IV('¼'), 0xB6, 0}, // 00BC + {IV('½'), 0xB5, 0}, // 00BD + //{IV('¾'), '3', 0}, // 00BE + {IV('¿'), 0x9F, 0}, // 00BF + + {IV('Â'), 0x8F, 0}, + {IV('Ã'), 0xAA, 0}, + {IV('Ä'), 0x8E, 0}, + {IV('Æ'), 0x92, 0}, + {IV('Ç'), 0x80, 0}, + {IV('É'), 0x90, 0}, + {IV('Ñ'), 0x9C, 0}, + {IV('Õ'), 0xAC, 0}, + {IV('Ö'), 0x99, 0}, + {IV('×'), 0xB7, 0}, + {IV('Ø'), 0xAE, 0}, + {IV('Ü'), 0x9A, 0}, + {IV('à'), 0x85, 0}, + {IV('á'), 0xA0, 0}, + {IV('â'), 0x83, 0}, + {IV('ã'), 0xAB, 0}, + {IV('ä'), 0x84, 0}, + {IV('å'), 0x86, 0}, + {IV('æ'), 0x91, 0}, + {IV('ç'), 0x87, 0}, + {IV('è'), 0x8A, 0}, + {IV('é'), 0x82, 0}, + {IV('ê'), 0x88, 0}, + {IV('ë'), 0x89, 0}, + {IV('ì'), 0x8D, 0}, + {IV('í'), 0xA1, 0}, + {IV('î'), 0x8C, 0}, + {IV('ï'), 0x8B, 0}, + + {IV('ñ'), 0x9B, 0}, + {IV('ò'), 0x95, 0}, + {IV('ó'), 0xA2, 0}, + {IV('ô'), 0x93, 0}, + {IV('õ'), 0xAD, 0}, + {IV('ö'), 0x94, 0}, + {IV('÷'), 0xB8, 0}, + {IV('ø'), 0xAF, 0}, + {IV('ù'), 0x97, 0}, + {IV('ú'), 0xA3, 0}, + {IV('û'), 0x96, 0}, + {IV('ü'), 0x81, 0}, + {IV('ÿ'), 0x98, 0}, + + //{IV(''), 0xB0, 0}, // error + //{IV(''), 0xB1, 0}, // error + {IV('ƒ'), 0xA8, 0}, // 0192 + + {IV('Ύ'), 0xDB, 0}, // 038E + {IV('Ώ'), 0xDE, 0}, // 038F + {IV('ΐ'), 0xE7, 0}, // 0390 + + {IV('Γ'), 0xD4, 0}, // 0393, Gamma + {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿ + {IV('Θ'), 0xD6, 0}, // 0398, Theta + {IV('Λ'), 0xD7, 0}, // 039B, Lambda + {IV('Ξ'), 0xD8, 0}, // 039E, Xi + {IV('Π'), 0xD9, 0}, // Pi + {IV('Σ'), 0xDA, 0}, // Sigma + {IV('Υ'), 0xDB, 0}, // Upsilon + {IV('Φ'), 0xDC, 0}, // Phi + {IV('Ψ'), 0xDD, 0}, // Psi + {IV('Ω'), 0xDE, 0}, // Omega + + {IV('ά'), 0xDF, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('ή'), 0xE5, 0}, // 03AE + {IV('ί'), 0xE7, 0}, // 03AF + {IV('ΰ'), 0xF1, 0}, // 03B0 + + {IV('α'), 0xDF, 0}, // alpha + {IV('β'), 0xE0, 0}, // beta + {IV('γ'), 0xE1, 0}, // gamma + {IV('δ'), 0xE2, 0}, // delta + {IV('ε'), 0xE3, 0}, // epsilon + {IV('ζ'), 0xE4, 0}, // zeta + {IV('η'), 0xE5, 0}, // eta + {IV('θ'), 0xE6, 0}, // theta + {IV('ι'), 0xE7, 0}, // lota + {IV('κ'), 0xE8, 0}, // kappa + {IV('λ'), 0xE9, 0}, // lambda + {IV('μ'), 0xEA, 0}, // mu + {IV('ν'), 0xEB, 0}, // nu + {IV('ξ'), 0xEC, 0}, // xi + {IV('π'), 0xED, 0}, // pi + {IV('ρ'), 0xEE, 0}, // rho + {IV('σ'), 0xEF, 0}, // sigma + + {IV('τ'), 0xF0, 0}, // tau + {IV('υ'), 0xF1, 0}, // upsilon + {IV('χ'), 0xF2, 0}, // chi + {IV('ψ'), 0xF3, 0}, // psi + {IV('ω'), 0xF4, 0}, // 03C9, omega + {IV('ϊ'), 0xE7, 0}, // 03CA + {IV('ϋ'), 0xF1, 0}, // 03CB + {IV('ύ'), 0xF1, 0}, // 03CD + {IV('ώ'), 0xF4, 0}, // 03CE + + {IV('•'), 0xCD, 0}, // · + {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158 + {IV('™'), 0xD0, 0}, + {IV('↤'), 0xF9, 0}, // ⟻ + {IV('↵'), 0xC4, 0}, + {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('⇥'), 0xFB, 0}, + {IV('√'), 0xBE, 0}, // √ + {IV('∞'), 0xC2, 0}, // infinity + {IV('∫'), 0x1B, 0}, + {IV('∼'), 0x1D, 0}, + {IV('≈'), 0x1A, 0}, + {IV('≠'), 0xBD, 0}, + {IV('≡'), 0x11, 0}, + {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ + {IV('≥'), 0xBA, 0}, + //{IV(''), 0xBF, 0}, // error + + {IV('⌠'), 0xC0, 0}, + {IV('⌡'), 0xC1, 0}, + + {IV('⎧'), 0x14, 0}, + {IV('⎩'), 0x15, 0}, + {IV('⎫'), 0x16, 0}, + {IV('⎭'), 0x17, 0}, + {IV('⎰'), 0x18, 0}, + {IV('⎱'), 0x19, 0}, + + {IV('⎲'), 0x12, 0}, + {IV('⎳'), 0x13, 0}, + + {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) + {IV('┌'), 0xC9, 0}, + {IV('┐'), 0xCA, 0}, + {IV('└'), 0xCB, 0}, + {IV('┘'), 0xCC, 0}, + {IV('◸'), 0xC3, 0}, // ◿ + {IV('⭠'), 0xC8, 0}, + {IV('⭡'), 0xC5, 0}, + {IV('⭢'), 0xC7, 0}, + {IV('⭣'), 0xC6, 0}, + + + {IV('⯆'), 0xF5, 0}, + {IV('⯇'), 0xF7, 0}, // ⯅ + {IV('⯈'), 0xF6, 0}, + //{IV(''), 0xF8, 0}, // error + //{IV(''), 0xFA, 0}, // error + //{IV(''), 0xFC, 0}, // error + //{IV(''), 0xFD, 0}, // error + //{IV(''), 0xFE, 0}, // error + //{IV(''), 0xFF, 0}, // error + + #elif DISPLAY_CHARSET_HD44780 == CYRILLIC + + {IV('¢'), 0x5C, 0}, // 00A2 + {IV('£'), 0xCF, 0}, // 00A3 + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + + //{IV(''), 0x80, 0}, + //{IV(''), 0x81, 0}, + //{IV(''), 0x82, 0}, + //{IV(''), 0x83, 0}, + //{IV(''), 0x84, 0}, + //{IV(''), 0x85, 0}, + //{IV(''), 0x86, 0}, + //{IV(''), 0x87, 0}, + //{IV(''), 0x88, 0}, + //{IV(''), 0x89, 0}, + //{IV(''), 0x8A, 0}, + //{IV(''), 0x8B, 0}, + //{IV(''), 0x8C, 0}, + //{IV(''), 0x8D, 0}, + //{IV(''), 0x8E, 0}, + //{IV(''), 0x8F, 0}, + + //{IV(''), 0x90, 0}, + //{IV(''), 0x91, 0}, + //{IV(''), 0x92, 0}, + //{IV(''), 0x93, 0}, + //{IV(''), 0x94, 0}, + //{IV(''), 0x95, 0}, + //{IV(''), 0x96, 0}, + //{IV(''), 0x97, 0}, + //{IV(''), 0x98, 0}, + //{IV(''), 0x99, 0}, + //{IV(''), 0x9A, 0}, + //{IV(''), 0x9B, 0}, + //{IV(''), 0x9C, 0}, + //{IV(''), 0x9D, 0}, + //{IV(''), 0x9E, 0}, + //{IV(''), 0x9F, 0}, + + + {IV('¼'), 0xF0, 0}, // 00BC + {IV('⅓'), 0xF1, 0}, + {IV('½'), 0xF2, 0}, // 00BD + {IV('¾'), 0xF3, 0}, // 00BE + {IV('¿'), 0xCD, 0}, // 00BF + + #if ENABLED(DISPLAY_CHARSET_ISO10646_5) + + // Map Cyrillic to HD44780 extended CYRILLIC where possible + {IV('Ё'), 0xA2, 0}, // 0401 + {IV('А'), 'A', 0}, // 0410 + {IV('Б'), 0xA0, 0}, + {IV('В'), 'B', 0}, + {IV('Г'), 0xA1, 0}, + {IV('Д'), 0xE0, 0}, + {IV('Е'), 'E', 0}, + {IV('Ж'), 0xA3, 0}, + {IV('З'), 0xA4, 0}, + {IV('И'), 0xA5, 0}, + {IV('Й'), 0xA6, 0}, + {IV('К'), 'K', 0}, + {IV('Л'), 0xA7, 0}, + {IV('М'), 'M', 0}, + {IV('Н'), 'H', 0}, + {IV('О'), 'O', 0}, + {IV('П'), 0xA8, 0}, + {IV('Р'), 'P', 0}, + {IV('С'), 'C', 0}, + {IV('Т'), 'T', 0}, + {IV('У'), 0xA9, 0}, + {IV('Ф'), 0xAA, 0}, + {IV('Х'), 'X', 0}, + {IV('Ц'), 0xE1, 0}, + {IV('Ч'), 0xAB, 0}, + {IV('Ш'), 0xAC, 0}, + {IV('Щ'), 0xE2, 0}, + {IV('Ъ'), 0xAD, 0}, + {IV('Ы'), 0xAE, 0}, + {IV('Ь'), 'b', 0}, + {IV('Э'), 0xAF, 0}, + {IV('Ю'), 0xB0, 0}, + {IV('Я'), 0xB1, 0}, + {IV('а'), 'a', 0}, + + {IV('б'), 0xB2, 0}, + {IV('в'), 0xB3, 0}, + {IV('г'), 0xB4, 0}, + {IV('д'), 0xE3, 0}, + {IV('е'), 'e', 0}, + {IV('ж'), 0xB6, 0}, + {IV('з'), 0xB7, 0}, + {IV('и'), 0xB8, 0}, + {IV('й'), 0xB9, 0}, + {IV('к'), 0xBA, 0}, //клмноп + {IV('л'), 0xBB, 0}, + {IV('м'), 0xBC, 0}, + {IV('н'), 0xBD, 0}, + {IV('о'), 'o', 0}, + {IV('п'), 0xBE, 0}, + {IV('р'), 'p', 0}, + {IV('с'), 'c', 0}, + {IV('т'), 0xBF, 0}, + + {IV('у'), 'y', 0}, + {IV('ф'), 0xE4, 0}, + {IV('х'), 'x', 0}, + {IV('ц'), 0xE5, 0}, + {IV('ч'), 0xC0, 0}, + {IV('ш'), 0xC1, 0}, + {IV('щ'), 0xE6, 0}, + {IV('ъ'), 0xC2, 0}, + {IV('ы'), 0xC3, 0}, + {IV('ь'), 0xC4, 0}, + {IV('э'), 0xC5, 0}, + {IV('ю'), 0xC6, 0}, + {IV('я'), 0xC7, 0}, // 044F + {IV('ё'), 0xB5, 0}, // 0451 + //{IV(''), 0xC8, 0}, + //{IV(''), 0xC9, 0}, + //{IV(''), 0xCA, 0}, + //{IV(''), 0xCB, 0}, + //{IV(''), 0xCC, 0}, + //{IV(''), 0xCD, 0}, + //{IV(''), 0xCE, 0}, + + //{IV(''), 0xD0, 0}, + //{IV(''), 0xD1, 0}, + //{IV(''), 0xD2, 0}, + //{IV(''), 0xD3, 0}, + //{IV(''), 0xD4, 0}, + //{IV(''), 0xD5, 0}, + //{IV(''), 0xD6, 0}, + //{IV(''), 0xD7, 0}, + //{IV(''), 0xD8, 0}, + //{IV(''), 0xDB, 0}, + //{IV(''), 0xDC, 0}, + //{IV(''), 0xDD, 0}, + //{IV(''), 0xDE, 0}, + //{IV(''), 0xDF, 0}, + + //{IV(''), 0xE7, 0}, + //{IV(''), 0xE8, 0}, + //{IV(''), 0xE9, 0}, + //{IV(''), 0xEA, 0}, + //{IV(''), 0xEB, 0}, + //{IV(''), 0xEC, 0}, + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + //{IV(''), 0xEF, 0}, + + //{IV(''), 0xF4, 0}, + //{IV(''), 0xF5, 0}, + //{IV(''), 0xF6, 0}, + //{IV(''), 0xF7, 0}, + //{IV(''), 0xF8, 0}, + //{IV(''), 0xF9, 0}, + //{IV(''), 0xFA, 0}, + //{IV(''), 0xFB, 0}, + //{IV(''), 0xFC, 0}, + //{IV(''), 0xFD, 0}, + //{IV(''), 0xFE, 0}, + //{IV(''), 0xFF, 0}, + + #endif + + {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓ + {IV('↓'), 0xDA, 0}, // 2193 + #endif +}; + +// the plain ASCII replacement for various char +static const hd44780_charmap_t g_hd44780_charmap_common[] PROGMEM = { + {IV('¡'), 'i', 0}, // A1 + {IV('¢'), 'c', 0}, // A2 + {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) + + // Map WESTERN code to plain ASCII + {IV('Á'), 'A', 0}, // C1 + {IV('Â'), 'A', 0}, // C2 + {IV('Ã'), 'A', 0}, // C3 + {IV('Ä'), 'A', 0}, // C4 + {IV('Å'), 'A', 0}, // C5 + {IV('Æ'), 'A', 'E'}, // C6 + {IV('Ç'), 'C', 0}, // C7 + {IV('È'), 'E', 0}, // C8 + {IV('É'), 'E', 0}, // C9 + {IV('Í'), 'I', 0}, // CD + {IV('Ñ'), 'N', 0}, // D1 + {IV('Õ'), 'O', 0}, // D5 + {IV('Ö'), 'O', 0}, // D6 + {IV('×'), 'x', 0}, // D7 + {IV('Ü'), 'U', 0}, // DC + {IV('Ý'), 'Y', 0}, // DD + {IV('à'), 'a', 0}, // E0 + {IV('á'), 'a', 0}, + {IV('â'), 'a', 0}, + {IV('ã'), 'a', 0}, + {IV('ä'), 'a', 0}, + {IV('å'), 'a', 0}, + {IV('æ'), 'a', 'e'}, + {IV('ç'), 'c', 0}, + {IV('è'), 'e', 0}, // 00E8 + {IV('é'), 'e', 0}, + {IV('ê'), 'e', 0}, + {IV('ë'), 'e', 0}, + {IV('ì'), 'i', 0}, // 00EC + {IV('í'), 'i', 0}, + {IV('î'), 'i', 0}, + {IV('ï'), 'i', 0}, // 00EF + + {IV('ñ'), 'n', 0}, // 00F1 + {IV('ò'), 'o', 0}, + {IV('ó'), 'o', 0}, + {IV('ô'), 'o', 0}, + {IV('õ'), 'o', 0}, + {IV('ö'), 'o', 0}, + //{IV('÷'), 0xB8, 0}, + {IV('ø'), 'o', 0}, + {IV('ù'), 'u', 0}, + {IV('ú'), 'u', 0}, + {IV('û'), 'u', 0}, + {IV('ü'), 'u', 0}, // FC + {IV('ý'), 'y', 0}, // FD + {IV('ÿ'), 'y', 0}, // FF + + {IV('Ą'), 'A', 0}, // 0104 + {IV('ą'), 'a', 0}, // 0105 + {IV('Ć'), 'C', 0}, // 0106 + {IV('ć'), 'c', 0}, // 0107 + {IV('Č'), 'C', 0}, // 010C + {IV('č'), 'c', 0}, // 010D + {IV('Ď'), 'D', 0}, // 010E + {IV('ď'), 'd', 0}, // 010F + {IV('đ'), 'd', 0}, // 0111 + {IV('ę'), 'e', 0}, // 0119 + {IV('Ě'), 'E', 0}, // 011A + {IV('ě'), 'e', 0}, // 011B + {IV('ğ'), 'g', 0}, // 011F + {IV('İ'), 'I', 0}, // 0130 + {IV('ı'), 'i', 0}, // 0131 + + {IV('Ł'), 'L', 0}, // 0141 + {IV('ł'), 'l', 0}, // 0142 + {IV('Ń'), 'N', 0}, // 0143 + {IV('ń'), 'n', 0}, // 0144 + {IV('ň'), 'n', 0}, // 0148 + + {IV('Ř'), 'R', 0}, // 0158 + {IV('ř'), 'r', 0}, // 0159 + {IV('Ś'), 'S', 0}, // 015A + {IV('ś'), 's', 0}, // 015B + {IV('ş'), 's', 0}, // 015F + {IV('Š'), 'S', 0}, // 0160 + {IV('š'), 's', 0}, // 0161 + {IV('ť'), 't', 0}, // 0165 + {IV('ů'), 'u', 0}, // 016F + {IV('ż'), 'z', 0}, // 017C + {IV('Ž'), 'Z', 0}, // 017D + {IV('ž'), 'z', 0}, // 017E + {IV('ƒ'), 'f', 0}, // 0192 + + {IV('ˣ'), 'x', 0}, // 02E3 + + #if ENABLED(DISPLAY_CHARSET_ISO10646_VI) + + // Map Vietnamese phonetics + + //{IV('à'), 'a', 0}, {IV('À'), 'A', 0}, + {IV('ạ'), 'a', 0}, {IV('Ạ'), 'A', 0}, + {IV('ả'), 'a', 0}, {IV('Ả'), 'A', 0}, + //{IV('ã'), 'a', 0}, {IV('Ã'), 'A', 0}, + //{IV('á'), 'á', 0}, {IV('Á'), 'A', 0}, + {IV('Ạ'), 'A', 0}, + {IV('ă'), 'a', 0}, {IV('Ă'), 'A', 0}, + {IV('ằ'), 'a', 0}, {IV('Ằ'), 'A', 0}, + {IV('ẳ'), 'a', 0}, {IV('Ẳ'), 'A', 0}, + {IV('ẵ'), 'a', 0}, {IV('Ẵ'), 'A', 0}, + {IV('ắ'), 'a', 0}, {IV('Ắ'), 'A', 0}, + {IV('ặ'), 'a', 0}, {IV('Ặ'), 'A', 0}, + {IV('â'), 'a', 0}, {IV('Â'), 'A', 0}, + {IV('ầ'), 'a', 0}, {IV('Ầ'), 'A', 0}, + {IV('ẩ'), 'a', 0}, {IV('Ẩ'), 'A', 0}, + {IV('ẫ'), 'a', 0}, {IV('Ẫ'), 'A', 0}, + {IV('ấ'), 'a', 0}, {IV('Ấ'), 'A', 0}, + {IV('ậ'), 'a', 0}, {IV('Ậ'), 'A', 0}, + //{IV('đ'), 'd', 0}, + {IV('Đ'), 'D', 0}, + {IV('e'), 'e', 0}, {IV('E'), 'E', 0}, + {IV('è'), 'e', 0}, {IV('È'), 'E', 0}, + {IV('ẻ'), 'e', 0}, {IV('Ẻ'), 'E', 0}, + {IV('ẽ'), 'e', 0}, {IV('Ẽ'), 'E', 0}, + {IV('é'), 'e', 0}, {IV('É'), 'E', 0}, + {IV('ẹ'), 'e', 0}, {IV('Ẹ'), 'E', 0}, + {IV('ê'), 'e', 0}, {IV('Ê'), 'E', 0}, + {IV('ề'), 'e', 0}, {IV('Ề'), 'E', 0}, + {IV('ể'), 'e', 0}, {IV('Ể'), 'E', 0}, + {IV('ễ'), 'e', 0}, {IV('Ễ'), 'E', 0}, + {IV('ế'), 'e', 0}, {IV('Ế'), 'E', 0}, + {IV('ệ'), 'e', 0}, {IV('Ệ'), 'E', 0}, + {IV('i'), 'i', 0}, {IV('I'), 'I', 0}, + //{IV('ì'), 'ì', 0}, {IV('Ì'), 'Ì', 0}, + {IV('ỉ'), 'ỉ', 0}, {IV('Ỉ'), 'Ỉ', 0}, + {IV('ĩ'), 'ĩ', 0}, {IV('Ĩ'), 'Ĩ', 0}, + {IV('í'), 'í', 0}, {IV('Í'), 'Í', 0}, + {IV('ị'), 'ị', 0}, {IV('Ị'), 'Ị', 0}, + {IV('o'), 'o', 0}, {IV('O'), 'O', 0}, + {IV('ò'), 'o', 0}, {IV('Ò'), 'O', 0}, + {IV('ỏ'), 'o', 0}, {IV('Ỏ'), 'O', 0}, + {IV('õ'), 'o', 0}, {IV('Õ'), 'O', 0}, + {IV('ó'), 'o', 0}, {IV('Ó'), 'O', 0}, + {IV('ọ'), 'o', 0}, {IV('Ọ'), 'O', 0}, + {IV('ô'), 'o', 0}, {IV('Ô'), 'O', 0}, + {IV('ồ'), 'o', 0}, {IV('Ồ'), 'O', 0}, + {IV('ổ'), 'o', 0}, {IV('Ổ'), 'O', 0}, + {IV('ỗ'), 'o', 0}, {IV('Ỗ'), 'O', 0}, + {IV('ố'), 'o', 0}, {IV('Ố'), 'O', 0}, + {IV('ộ'), 'o', 0}, {IV('Ộ'), 'O', 0}, + {IV('ơ'), 'o', 0}, {IV('Ơ'), 'O', 0}, + {IV('ờ'), 'o', 0}, {IV('Ờ'), 'O', 0}, + {IV('ở'), 'o', 0}, {IV('Ở'), 'O', 0}, + {IV('ỡ'), 'o', 0}, {IV('Ỡ'), 'O', 0}, + {IV('ớ'), 'o', 0}, {IV('Ớ'), 'O', 0}, + {IV('ợ'), 'o', 0}, {IV('Ợ'), 'O', 0}, + {IV('ù'), 'u', 0}, {IV('Ù'), 'U', 0}, + {IV('ủ'), 'u', 0}, {IV('Ủ'), 'U', 0}, + {IV('ũ'), 'u', 0}, {IV('Ũ'), 'U', 0}, + //{IV('ú'), 'u', 0}, {IV('Ú'), 'U', 0}, + {IV('ụ'), 'u', 0}, {IV('Ụ'), 'U', 0}, + {IV('ư'), 'u', 0}, {IV('Ư'), 'U', 0}, + {IV('ừ'), 'u', 0}, {IV('Ừ'), 'U', 0}, + {IV('ử'), 'u', 0}, {IV('Ử'), 'U', 0}, + {IV('ữ'), 'u', 0}, {IV('Ữ'), 'U', 0}, + {IV('ứ'), 'u', 0}, {IV('Ứ'), 'U', 0}, + {IV('ự'), 'u', 0}, {IV('Ự'), 'U', 0}, + {IV('y'), 'y', 0}, {IV('Y'), 'Y', 0}, + + #endif + + #if ENABLED(DISPLAY_CHARSET_ISO10646_GREEK) + + {IV('΄'), '\'', 0}, // 0384 + {IV('΅'), '\'', 0}, // 0385 + {IV('Ά'), 'A', 0}, // 0386 + {IV('·'), '.', 0}, // 0387 + {IV('Έ'), 'E', 0}, // 0388 + {IV('Ή'), 'H', 0}, // 0389 + {IV('Ί'), 'I', 0}, // 038A + {IV('Ό'), 'O', 0}, // 038C + {IV('Ύ'), 'Y', 0}, // 038E + {IV('Ώ'), 'O', 0}, // 038F + {IV('ΐ'), 'i', 0}, // 0390 + {IV('Α'), 'A', 0}, // 0391 + {IV('Β'), 'B', 0}, // 0392 + {IV('Γ'), 'T', 0}, // 0393, Gamma + {IV('Δ'), '4', 0}, // 0394, Delta, ◿ + {IV('Ε'), 'E', 0}, // 0395 + {IV('Ζ'), 'Z', 0}, // 0396 + {IV('Η'), 'H', 0}, // 0397 + {IV('Θ'), '0', 0}, // 0398, Theta + {IV('Ι'), 'I', 0}, // 0399 + {IV('Κ'), 'K', 0}, // 039A + {IV('Λ'), '^', 0}, // 039B, Lambda + {IV('Μ'), 'M', 0}, // 039C + {IV('Ν'), 'N', 0}, // 039D + {IV('Ξ'), '3', 0}, // 039E, Xi + {IV('Ο'), 'O', 0}, // 039F + {IV('Π'), 'n', 0}, // 03A0, Pi + {IV('Ρ'), 'P', 0}, // 03A1 + {IV('Σ'), 'E', 0}, // 03A3, Sigma + {IV('Τ'), 'T', 0}, // 03A4 + {IV('Υ'), 'Y', 0}, // 03A5, Upsilon + {IV('Φ'), 'p', 0}, // 03A6, Phi + {IV('Χ'), 'X', 0}, // 03A7 + {IV('Ψ'), 'P', 0}, // 03A8, Psi + {IV('Ω'), 'O', 0}, // 03A9, Omega + {IV('Ϊ'), 'I', 0}, // 03AA + {IV('Ϋ'), 'Y', 0}, // 03AB + {IV('ά'), 'a', 0}, // 03AC + {IV('έ'), 'e', 0}, // 03AD + {IV('ή'), 'n', 0}, // 03AE + {IV('ί'), 'i', 0}, // 03AF + {IV('ΰ'), 'v', 0}, // 03B0 + {IV('α'), 'a', 0}, // 03B1, alpha + {IV('β'), 'B', 0}, // 03B2, beta + {IV('γ'), 'v', 0}, // 03B3, gamma + {IV('δ'), 'd', 0}, // 03B4, delta + {IV('ε'), 'e', 0}, // 03B5, epsilon + {IV('ζ'), 'Z', 0}, // 03B6, zeta + {IV('η'), 'n', 0}, // 03B7, eta + {IV('θ'), '0', 0}, // 03B8, theta + {IV('ι'), 'i', 0}, // 03B9, lota + {IV('κ'), 'k', 0}, // 03BA, kappa + {IV('λ'), 'L', 0}, // 03BB, lambda + {IV('μ'), 'u', 0}, // 03BC, mu + {IV('ν'), 'v', 0}, // 03BD, nu + {IV('ξ'), 'e', 0}, // 03BE, xi + {IV('ο'), 'o', 0}, // 03BF + {IV('π'), 'n', 0}, // 03C0, pi + {IV('ρ'), 'p', 0}, // 03C1, rho + {IV('ς'), 'c', 0}, // 03C2 + {IV('σ'), 'o', 0}, // 03C3, sigma + {IV('τ'), 't', 0}, // 03C4, tau + {IV('υ'), 'v', 0}, // 03C5, upsilon + {IV('φ'), 'p', 0}, // 03C6 + {IV('χ'), 'X', 0}, // 03C7, chi + {IV('ψ'), 'W', 0}, // 03C8, psi + {IV('ω'), 'w', 0}, // 03C9, omega + {IV('ϊ'), 'i', 0}, // 03CA + {IV('ϋ'), 'v', 0}, // 03CB + {IV('ό'), 'o', 0}, // 03CC + {IV('ύ'), 'v', 0}, // 03CD + {IV('ώ'), 'w', 0}, // 03CE + + #endif + + #if ENABLED(DISPLAY_CHARSET_ISO10646_5) + // Map CYRILLIC code to plain ASCII + {IV('Ё'), 'E', 0}, // 0401 + {IV('А'), 'A', 0}, // 0410 + {IV('Б'), 'b', 0}, // 0411 + {IV('В'), 'B', 0}, // 0412 + {IV('Г'), 'T', 0}, // 0413 + {IV('Д'), 'Q', 0}, // 0414 + {IV('Е'), 'E', 0}, // 0415 + {IV('Ж'), '*', 0}, // 0416 + {IV('З'), 'E', 0}, // 0417 + {IV('И'), 'N', 0}, // 0418 + {IV('Й'), 'N', 0}, // 0419 + {IV('К'), 'K', 0}, // 041A + {IV('Л'), 'T', 0}, // 041B + {IV('М'), 'M', 0}, // 041C + {IV('Н'), 'H', 0}, // 041D + {IV('О'), 'O', 0}, // 041E + {IV('П'), 'n', 0}, // 041F + {IV('Р'), 'P', 0}, // 0420 + {IV('С'), 'C', 0}, // 0421 + {IV('Т'), 'T', 0}, // 0422 + {IV('У'), 'Y', 0}, + {IV('Ф'), 'o', 0}, + {IV('Х'), 'X', 0}, + {IV('Ц'), 'U', 0}, + {IV('Ч'), 'y', 0}, + {IV('Ш'), 'W', 0}, + {IV('Щ'), 'W', 0}, + {IV('Ъ'), 'b', 0}, + {IV('Ы'), 'b', '|'}, + {IV('Ь'), 'b'}, + {IV('Э'), 'e'}, + {IV('Ю'), '|', 'O'}, + {IV('Я'), '9', '|'}, // 042F + + {IV('а'), 'a', 0}, // 0430 + {IV('б'), '6', 0}, // 0431 + {IV('в'), 'B', 0}, // 0432, + {IV('г'), 'r', 0}, // 0433 + {IV('д'), 'a', 0}, // 0434, + {IV('е'), 'e', 0}, // 0435 + {IV('ж'), '*', 0}, // 0436 + {IV('з'), 'e', 0}, // 0437, + {IV('и'), 'u', 0}, // 0438 + {IV('й'), 'u', 0}, // 0439, + {IV('к'), 'k', 0}, // 043A + {IV('л'), 'n', 0}, + {IV('м'), 'm', 0}, + {IV('н'), 'H', 0}, + {IV('о'), 'o', 0}, + {IV('п'), 'n', 0}, + {IV('р'), 'p', 0}, + {IV('с'), 'c', 0}, + {IV('т'), 't', 0}, + {IV('у'), 'y', 0}, + {IV('ф'), 'q', 'p'}, + {IV('х'), 'x', 0}, + {IV('ц'), 'u', 0}, + {IV('ч'), 'y', 0}, + {IV('ш'), 'w', 0}, + {IV('щ'), 'w', 0}, + {IV('ъ'), 'b', 0}, + {IV('ы'), 'b', '|'}, + {IV('ь'), 'b', 0}, + {IV('э'), 'e', 0}, + {IV('ю'), '|', 'o'}, + {IV('я'), 'g', 0}, // 044F + {IV('ё'), 'e', 0}, // 0451 + + #endif + + {IV('•'), '.', 0}, // 2022 · + {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158 + {IV('™'), 'T', 'M'}, // 2122 + {IV('←'), '<', '-'}, // 2190 + {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03) + //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('∼'), '~', 0}, // 223C + {IV('≈'), '~', '='}, // 2248 + {IV('≠'), '!', '='}, // 2260 + {IV('≡'), '=', 0}, // 2261 + {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ + {IV('≥'), '>', '='}, // 2265 + {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) + + {IV('゠'), '=', 0}, // 30A0 + + // ⏰⏱⏲⏳◴◵◶◷ + // ⏻⏼♁♂ + //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) + {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) + {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02) + //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) +}; + +/* return v1 - v2 */ +static int hd44780_charmap_compare(hd44780_charmap_t * v1, hd44780_charmap_t * v2) { + return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0; +} + +static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { + hd44780_charmap_t localval; + hd44780_charmap_t *p_hd44780_charmap = (hd44780_charmap_t *)userdata; + memcpy_P(&localval, p_hd44780_charmap + idx, sizeof(localval)); + return hd44780_charmap_compare(&localval, (hd44780_charmap_t *)data_pin); +} + +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { lcd.setCursor(col, row); } + +void lcd_put_int(const int i) { lcd.print(i); } + +// return < 0 on error +// return the advanced cols +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + + // find the HD44780 internal ROM first + int ret; + size_t idx = 0; + hd44780_charmap_t pinval; + hd44780_charmap_t *copy_address = nullptr; + pinval.uchar = c; + pinval.idx = -1; + + if (max_length < 1) return 0; + + // TODO: fix the '\\' that doesn't exist in the HD44870 + if (c < 128) { + lcd.write((uint8_t)c); + return 1; + } + copy_address = nullptr; + ret = pf_bsearch_r((void *)g_hd44780_charmap_device, COUNT(g_hd44780_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) { + copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_device + idx); + } + else { + ret = pf_bsearch_r((void *)g_hd44780_charmap_common, COUNT(g_hd44780_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) copy_address = (hd44780_charmap_t *)(g_hd44780_charmap_common + idx); + } + + if (ret >= 0) { + hd44780_charmap_t localval; + // found + memcpy_P(&localval, copy_address, sizeof(localval)); + lcd.write(localval.idx); + if (max_length >= 2 && localval.idx2 > 0) { + lcd.write(localval.idx2); + return 2; + } + return 1; + } + + // Not found, print '?' instead + lcd.write((uint8_t)'?'); + return 1; +} + +/** + * @brief Draw a UTF-8 string + * + * @param utf8_str : the UTF-8 string + * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the number of pixels advanced + * + * Draw a UTF-8 string + */ +static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { + pixel_len_t ret = 0; + uint8_t *p = (uint8_t *)utf8_str; + while (ret < max_length) { + wchar_t ch = 0; + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + ret += lcd_put_wchar_max(ch, max_length - ret); + } + return (int)ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); +} + +#if ENABLED(DEBUG_LCDPRINT) + + int test_hd44780_charmap(hd44780_charmap_t *data, size_t size, char *name, char flg_show_contents) { + int ret; + size_t idx = 0; + hd44780_charmap_t preval = {0, 0, 0}; + hd44780_charmap_t pinval = {0, 0, 0}; + char flg_error = 0; + + int i; + + TRACE("Test %s\n", name); + + for (i = 0; i < size; i ++) { + memcpy_P(&pinval, &(data[i]), sizeof(pinval)); + + if (flg_show_contents) { + #if 1 + TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #else + TRACE("[% 4d]", i); + TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); + TRACE("0x%02X,", (unsigned int)(pinval.idx)); + TRACE("0x%02X,", (unsigned int)(pinval.idx2)); + TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #endif + } + if (preval.uchar >= pinval.uchar) { + flg_error = 1; + //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + memcpy(&preval, &pinval, sizeof(pinval)); + + ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret < 0) { + flg_error = 1; + TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + if (idx != i) { + flg_error = 1; + TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + } + if (flg_error) { + TRACE("\nError: in array %s\n\n", name); + return -1; + } + TRACE("\nPASS array %s\n\n", name); + return 0; + } + + int test_hd44780_charmap_all() { + int flg_error = 0; + if (test_hd44780_charmap(g_hd44780_charmap_device, COUNT(g_hd44780_charmap_device), "g_hd44780_charmap_device", 0) < 0) { + flg_error = 1; + test_hd44780_charmap(g_hd44780_charmap_device, COUNT(g_hd44780_charmap_device), "g_hd44780_charmap_device", 1); + } + if (test_hd44780_charmap(g_hd44780_charmap_common, COUNT(g_hd44780_charmap_common), "g_hd44780_charmap_common", 0) < 0) { + flg_error = 1; + test_hd44780_charmap(g_hd44780_charmap_common, COUNT(g_hd44780_charmap_common), "g_hd44780_charmap_common", 1); + } + if (flg_error) { + TRACE("\nFAILED in hd44780 tests!\n"); + return -1; + } + TRACE("\nPASS in hd44780 tests.\n"); + return 0; + } + +#endif // DEBUG_LCDPRINT + +#endif // HAS_MARLINUI_HD44780 diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp new file mode 100644 index 00000000..e6cc2274 --- /dev/null +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.cpp @@ -0,0 +1,1520 @@ +/** + * 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_MARLINUI_HD44780 + +/** + * ultralcd_HD44780.cpp + * + * LCD display implementations for Hitachi HD44780. + * These are the most common LCD character displays. + */ + +#include "ultralcd_HD44780.h" +#include "../ultralcd.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 + +// +// Create LCD instance and chipset-specific information +// + +#if ENABLED(LCD_I2C_TYPE_PCF8575) + + LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_I2C_PIN_EN, LCD_I2C_PIN_RW, LCD_I2C_PIN_RS, LCD_I2C_PIN_D4, LCD_I2C_PIN_D5, LCD_I2C_PIN_D6, LCD_I2C_PIN_D7); + +#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) + + LCD_CLASS lcd(LCD_I2C_ADDRESS + #ifdef DETECT_DEVICE + , 1 + #endif + ); + +#elif ENABLED(LCD_I2C_TYPE_PCA8574) + + LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); + +#elif ENABLED(SR_LCD_2W_NL) + + // 2 wire Non-latching LCD SR from: + // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection + + LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN + #if PIN_EXISTS(SR_STROBE) + , SR_STROBE_PIN + #endif + ); + +#elif ENABLED(SR_LCD_3W_NL) + + // NewLiquidCrystal was not working + // https://github.com/mikeshub/SailfishLCD + // uses the code directly from Sailfish + + LCD_CLASS lcd(SR_STROBE_PIN, SR_DATA_PIN, SR_CLK_PIN); + +#elif ENABLED(LCM1602) + + LCD_CLASS lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); + +#else + + // Standard direct-connected LCD implementations + LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5, LCD_PINS_D6, LCD_PINS_D7); + +#endif + +static void createChar_P(const char c, const byte * const ptr) { + byte temp[8]; + LOOP_L_N(i, 8) + temp[i] = pgm_read_byte(&ptr[i]); + lcd.createChar(c, temp); +} + +#if ENABLED(LCD_PROGRESS_BAR) + #define LCD_STR_PROGRESS "\x03\x04\x05" +#endif + +#if ENABLED(LCD_USE_I2C_BUZZER) + void MarlinUI::buzz(const long duration, const uint16_t freq) { + lcd.buzz(duration, freq); + } +#endif + +void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARSET_INFO*/) { + #if NONE(LCD_PROGRESS_BAR, SHOW_BOOTSCREEN) + UNUSED(screen_charset); + #endif + + // CHARSET_BOOT + #if ENABLED(SHOW_BOOTSCREEN) + const static PROGMEM byte corner[4][8] = { { + B00000, + B00000, + B00000, + B00000, + B00001, + B00010, + B00100, + B00100 + }, { + B00000, + B00000, + B00000, + B11100, + B11100, + B01100, + B00100, + B00100 + }, { + B00100, + B00010, + B00001, + B00000, + B00000, + B00000, + B00000, + B00000 + }, { + B00100, + B01000, + B10000, + B00000, + B00000, + B00000, + B00000, + B00000 + } }; + #endif // SHOW_BOOTSCREEN + + // CHARSET_INFO + const static PROGMEM byte bedTemp[8] = { + B00000, + B11111, + B10101, + B10001, + B10101, + B11111, + B00000, + B00000 + }; + + const static PROGMEM byte degree[8] = { + B01100, + B10010, + B10010, + B01100, + B00000, + B00000, + B00000, + B00000 + }; + + const static PROGMEM byte thermometer[8] = { + B00100, + B01010, + B01010, + B01010, + B01010, + B10001, + B10001, + B01110 + }; + + const static PROGMEM byte uplevel[8] = { + B00100, + B01110, + B11111, + B00100, + B11100, + B00000, + B00000, + B00000 + }; + + const static PROGMEM byte feedrate[8] = { + #if LCD_INFO_SCREEN_STYLE == 1 + B00000, + B00100, + B10010, + B01001, + B10010, + B00100, + B00000, + B00000 + #else + B11100, + B10000, + B11000, + B10111, + B00101, + B00110, + B00101, + B00000 + #endif + }; + + const static PROGMEM byte clock[8] = { + B00000, + B01110, + B10011, + B10101, + B10001, + B01110, + B00000, + B00000 + }; + + #if ENABLED(LCD_PROGRESS_BAR) + + // CHARSET_INFO + const static PROGMEM byte progress[3][8] = { { + B00000, + B10000, + B10000, + B10000, + B10000, + B10000, + B10000, + B00000 + }, { + B00000, + B10100, + B10100, + B10100, + B10100, + B10100, + B10100, + B00000 + }, { + B00000, + B10101, + B10101, + B10101, + B10101, + B10101, + B10101, + B00000 + } }; + + #endif // LCD_PROGRESS_BAR + + #if BOTH(SDSUPPORT, HAS_LCD_MENU) + + // CHARSET_MENU + const static PROGMEM byte refresh[8] = { + B00000, + B00110, + B11001, + B11000, + B00011, + B10011, + B01100, + B00000, + }; + const static PROGMEM byte folder[8] = { + B00000, + B11100, + B11111, + B10001, + B10001, + B11111, + B00000, + B00000 + }; + + #endif // SDSUPPORT + + #if ENABLED(SHOW_BOOTSCREEN) + // Set boot screen corner characters + if (screen_charset == CHARSET_BOOT) { + for (uint8_t i = 4; i--;) + createChar_P(i, corner[i]); + } + else + #endif + { // Info Screen uses 5 special characters + createChar_P(LCD_STR_BEDTEMP[0], bedTemp); + createChar_P(LCD_STR_DEGREE[0], degree); + createChar_P(LCD_STR_THERMOMETER[0], thermometer); + createChar_P(LCD_STR_FEEDRATE[0], feedrate); + createChar_P(LCD_STR_CLOCK[0], clock); + + #if ENABLED(LCD_PROGRESS_BAR) + if (screen_charset == CHARSET_INFO) { // 3 Progress bar characters for info screen + for (int16_t i = 3; i--;) + createChar_P(LCD_STR_PROGRESS[i], progress[i]); + } + else + #endif + { + createChar_P(LCD_STR_UPLEVEL[0], uplevel); + #if BOTH(SDSUPPORT, HAS_LCD_MENU) + // SD Card sub-menu special characters + createChar_P(LCD_STR_REFRESH[0], refresh); + createChar_P(LCD_STR_FOLDER[0], folder); + #endif + } + } + +} + +void MarlinUI::init_lcd() { + + #if ENABLED(LCD_I2C_TYPE_PCF8575) + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + #ifdef LCD_I2C_PIN_BL + lcd.setBacklightPin(LCD_I2C_PIN_BL, POSITIVE); + lcd.setBacklight(HIGH); + #endif + + #elif ENABLED(LCD_I2C_TYPE_MCP23017) + lcd.setMCPType(LTI_TYPE_MCP23017); + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + update_indicators(); + + #elif ENABLED(LCD_I2C_TYPE_MCP23008) + lcd.setMCPType(LTI_TYPE_MCP23008); + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + + #elif ENABLED(LCD_I2C_TYPE_PCA8574) + lcd.init(); + lcd.backlight(); + + #else + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + #endif + + set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU); + + lcd.clear(); +} + +bool MarlinUI::detected() { + return (true + #if EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) && defined(DETECT_DEVICE) + && lcd.LcdDetected() == 1 + #endif + ); +} + +#if HAS_SLOW_BUTTONS + uint8_t MarlinUI::read_slow_buttons() { + #if ENABLED(LCD_I2C_TYPE_MCP23017) + // Reading these buttons is too slow for interrupt context + // so they are read during LCD update in the main loop. + uint8_t slow_bits = lcd.readButtons() + #if !BUTTON_EXISTS(ENC) + << B_I2C_BTN_OFFSET + #endif + ; + #if ENABLED(LCD_I2C_VIKI) + if ((slow_bits & (B_MI | B_RI)) && PENDING(millis(), next_button_update_ms)) // LCD clicked + slow_bits &= ~(B_MI | B_RI); // Disable LCD clicked buttons if screen is updated + #endif + return slow_bits; + #endif // LCD_I2C_TYPE_MCP23017 + } +#endif + +void MarlinUI::clear_lcd() { lcd.clear(); } + +#if ENABLED(SHOW_BOOTSCREEN) + + void lcd_erase_line(const lcd_uint_t line) { + lcd_moveto(0, line); + for (uint8_t i = LCD_WIDTH + 1; --i;) + lcd_put_wchar(' '); + } + + // Scroll the PSTR 'text' in a 'len' wide field for 'time' milliseconds at position col,line + void lcd_scroll(const lcd_uint_t col, const lcd_uint_t line, PGM_P const text, const uint8_t len, const int16_t time) { + uint8_t slen = utf8_strlen_P(text); + if (slen < len) { + lcd_put_u8str_max_P(col, line, text, len); + for (; slen < len; ++slen) lcd_put_wchar(' '); + safe_delay(time); + } + else { + PGM_P p = text; + int dly = time / _MAX(slen, 1); + LOOP_LE_N(i, slen) { + + // Print the text at the correct place + lcd_put_u8str_max_P(col, line, p, len); + + // Fill with spaces + for (uint8_t ix = slen - i; ix < len; ++ix) lcd_put_wchar(' '); + + // Delay + safe_delay(dly); + + // Advance to the next UTF8 valid position + p++; + while (!START_OF_UTF8_CHAR(pgm_read_byte(p))) p++; + } + } + } + + static void logo_lines(PGM_P const extra) { + int16_t indent = (LCD_WIDTH - 8 - utf8_strlen_P(extra)) / 2; + lcd_put_wchar(indent, 0, '\x00'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x01'); + lcd_put_u8str_P(indent, 1, PSTR("|Marlin|")); lcd_put_u8str_P(extra); + lcd_put_wchar(indent, 2, '\x02'); lcd_put_u8str_P(PSTR( "------" )); lcd_put_wchar('\x03'); + } + + void MarlinUI::show_bootscreen() { + set_custom_characters(CHARSET_BOOT); + lcd.clear(); + + #define LCD_EXTRA_SPACE (LCD_WIDTH-8) + + #define CENTER_OR_SCROLL(STRING,DELAY) \ + lcd_erase_line(3); \ + if (utf8_strlen(STRING) <= LCD_WIDTH) { \ + lcd_put_u8str_P((LCD_WIDTH - utf8_strlen_P(PSTR(STRING))) / 2, 3, PSTR(STRING)); \ + safe_delay(DELAY); \ + } \ + else { \ + lcd_scroll(0, 3, PSTR(STRING), LCD_WIDTH, DELAY); \ + } + + // + // Show the Marlin logo with splash line 1 + // + if (LCD_EXTRA_SPACE >= utf8_strlen(SHORT_BUILD_VERSION) + 1) { + // + // Show the Marlin logo, splash line1, and splash line 2 + // + logo_lines(PSTR(" " SHORT_BUILD_VERSION)); + CENTER_OR_SCROLL(MARLIN_WEBSITE_URL, 2000); + } + else { + // + // Show the Marlin logo and short build version + // After a delay show the website URL + // + extern const char NUL_STR[]; + logo_lines(NUL_STR); + CENTER_OR_SCROLL(SHORT_BUILD_VERSION, 1500); + CENTER_OR_SCROLL(MARLIN_WEBSITE_URL, 1500); + #ifdef STRING_SPLASH_LINE3 + CENTER_OR_SCROLL(STRING_SPLASH_LINE3, 1500); + #endif + } + + lcd.clear(); + safe_delay(100); + set_custom_characters(CHARSET_INFO); + lcd.clear(); + } + +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + lcd_put_u8str(0, 0, status_message); + lcd_uint_t y = 2; + #if LCD_HEIGHT >= 4 + lcd_put_u8str_P(0, y++, GET_TEXT(MSG_HALTED)); + #endif + lcd_put_u8str_P(0, y, GET_TEXT(MSG_PLEASE_RESET)); +} + +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + lcd_put_wchar('X' + uint8_t(axis)); + if (blink) + lcd_put_u8str(value); + else { + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); + else { + #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + #endif + lcd_put_u8str(value); + } + } +} + +FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { + #if HAS_HEATED_BED + const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); + const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + #else + const float t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); + #endif + + if (prefix >= 0) lcd_put_wchar(prefix); + + lcd_put_u8str(i16tostr3rj(t1 + 0.5)); + lcd_put_wchar('/'); + + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #else + if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { + lcd_put_wchar(' '); + if (t2 >= 10) lcd_put_wchar(' '); + if (t2 >= 100) lcd_put_wchar(' '); + } + else + #endif + lcd_put_u8str(i16tostr3left(t2 + 0.5)); + + if (prefix >= 0) { + lcd_put_wchar(LCD_STR_DEGREE[0]); + lcd_put_wchar(' '); + if (t2 < 10) lcd_put_wchar(' '); + } +} + +FORCE_INLINE void _draw_bed_status(const bool blink) { + _draw_heater_status(H_BED, TERN0(HAS_LEVELING, blink && planner.leveling_active) ? '_' : LCD_STR_BEDTEMP[0], blink); +} + +#if HAS_PRINT_PROGRESS + + FORCE_INLINE void _draw_print_progress() { + const uint8_t progress = ui.get_progress_percent(); + lcd_put_u8str_P(PSTR(TERN(SDSUPPORT, "SD", "P:"))); + if (progress) + lcd_put_u8str(ui8tostr3rj(progress)); + else + lcd_put_u8str_P(PSTR("---")); + lcd_put_wchar('%'); + } + +#endif + +#if ENABLED(LCD_PROGRESS_BAR) + + void MarlinUI::draw_progress_bar(const uint8_t percent) { + const int16_t tix = (int16_t)(percent * (LCD_WIDTH) * 3) / 100, + cel = tix / 3, + rem = tix % 3; + uint8_t i = LCD_WIDTH; + char msg[LCD_WIDTH + 1], b = ' '; + msg[LCD_WIDTH] = '\0'; + while (i--) { + if (i == cel - 1) + b = LCD_STR_PROGRESS[2]; + else if (i == cel && rem != 0) + b = LCD_STR_PROGRESS[rem - 1]; + msg[i] = b; + } + lcd_put_u8str(msg); + } + +#endif // LCD_PROGRESS_BAR + +void MarlinUI::draw_status_message(const bool blink) { + + lcd_moveto(0, LCD_HEIGHT - 1); + + #if ENABLED(LCD_PROGRESS_BAR) + + // Draw the progress bar if the message has shown long enough + // or if there is no message set. + if (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !has_status()) { + const uint8_t progress = get_progress_percent(); + if (progress > 2) return draw_progress_bar(progress); + } + + #elif BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + + // Alternate Status message and Filament display + if (ELAPSED(millis(), next_filament_display)) { + lcd_put_u8str_P(PSTR("Dia ")); + lcd_put_u8str(ftostr12ns(filwidth.measured_mm)); + lcd_put_u8str_P(PSTR(" V")); + lcd_put_u8str(i16tostr3rj(planner.volumetric_percent(parser.volumetric_enabled))); + lcd_put_wchar('%'); + return; + } + + #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + static bool last_blink = false; + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(status_message); + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { lcd_put_wchar(' '); ++slen; } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + // and the string remaining length + uint8_t rlen; + const char *stat = status_and_len(rlen); + lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space + + // If the remaining string doesn't completely fill the screen + if (rlen < LCD_WIDTH) { + lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + if (--chars) { // Draw a second dot if there's space + lcd_put_wchar('.'); + if (--chars) + lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + } + } + if (last_blink != blink) { + last_blink = blink; + advance_status_scroll(); + } + } + #else + UNUSED(blink); + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(status_message); + + // Just print the string to the LCD + lcd_put_u8str_max(status_message, LCD_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd_put_wchar(' '); + ++slen; + } + #endif +} + +/** + * LCD_INFO_SCREEN_STYLE 0 : Classic Status Screen + * + * 16x2 |000/000 B000/000| + * |0123456789012345| + * + * 16x4 |000/000 B000/000| + * |SD---% Z 000.00| + * |F---% T--:--| + * |0123456789012345| + * + * 20x2 |T000/000° B000/000° | + * |01234567890123456789| + * + * 20x4 |T000/000° B000/000° | + * |X 000 Y 000 Z000.000| + * |F---% SD---% T--:--| + * |01234567890123456789| + * + * LCD_INFO_SCREEN_STYLE 1 : Průša-style Status Screen + * + * |T000/000° Z 000.00 | + * |B000/000° F---% | + * |SD---% T--:-- | + * |01234567890123456789| + * + * |T000/000° Z 000.00 | + * |T000/000° F---% | + * |B000/000° SD---% | + * |01234567890123456789| + */ + +void MarlinUI::draw_status_screen() { + + const bool blink = get_blink(); + lcd_moveto(0, 0); + + #if LCD_INFO_SCREEN_STYLE == 0 + + // ========== Line 1 ========== + + #if LCD_WIDTH < 20 + + // + // Hotend 0 Temperature + // + _draw_heater_status(H_E0, -1, blink); + + // + // Hotend 1 or Bed Temperature + // + #if HAS_MULTI_HOTEND + lcd_moveto(8, 0); + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + lcd_moveto(8, 0); + _draw_bed_status(blink); + #endif + + #else // LCD_WIDTH >= 20 + + // + // Hotend 0 Temperature + // + _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); + + // + // Hotend 1 or Bed Temperature + // + #if HAS_MULTI_HOTEND + lcd_moveto(10, 0); + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + lcd_moveto(10, 0); + _draw_bed_status(blink); + #endif + + #endif // LCD_WIDTH >= 20 + + // ========== Line 2 ========== + + #if LCD_HEIGHT > 2 + + #if LCD_WIDTH < 20 + + #if HAS_PRINT_PROGRESS + lcd_moveto(0, 2); + _draw_print_progress(); + #endif + + #else // LCD_WIDTH >= 20 + + lcd_moveto(0, 1); + + // If the first line has two extruder temps, + // show more temperatures on the next line + + #if HOTENDS > 2 || (HAS_MULTI_HOTEND && HAS_HEATED_BED) + + #if HOTENDS > 2 + _draw_heater_status(H_E2, LCD_STR_THERMOMETER[0], blink); + lcd_moveto(10, 1); + #endif + + _draw_bed_status(blink); + + #else // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) + + #if HAS_DUAL_MIXING + + // Two-component mix / gradient instead of XY + + char mixer_messages[12]; + const char *mix_label; + #if ENABLED(GRADIENT_MIX) + if (mixer.gradient.enabled) { + mixer.update_mix_from_gradient(); + mix_label = "Gr"; + } + else + #endif + { + mixer.update_mix_from_vtool(); + mix_label = "Mx"; + } + sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); + lcd_put_u8str(mixer_messages); + + #else // !HAS_DUAL_MIXING + + 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 + sprintf_P(tmp, PSTR("E %ld%cm "), uint32_t(_MAX(e_move_accumulator, 0.0f)) / escale, escale == 10 ? 'c' : 'm'); // 1234567mm + 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 + + #endif // HOTENDS <= 2 && (HOTENDS <= 1 || !HAS_HEATED_BED) + + #endif // LCD_WIDTH >= 20 + + lcd_moveto(LCD_WIDTH - 8, 1); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); + + #if HAS_LEVELING && !HAS_HEATED_BED + lcd_put_wchar(planner.leveling_active || blink ? '_' : ' '); + #endif + + #endif // LCD_HEIGHT > 2 + + // ========== Line 3 ========== + + #if LCD_HEIGHT > 3 + + lcd_put_wchar(0, 2, LCD_STR_FEEDRATE[0]); + lcd_put_u8str(i16tostr3rj(feedrate_percentage)); + lcd_put_wchar('%'); + + char buffer[14]; + uint8_t timepos = 0; + #if ENABLED(SHOW_REMAINING_TIME) + const bool show_remain = TERN1(ROTATE_PROGRESS_DISPLAY, blink) && (printingIsActive() || marlin_state == MF_SD_COMPLETE); + if (show_remain) { + #if ENABLED(USE_M73_REMAINING_TIME) + duration_t remaining = get_remaining_time(); + #else + uint8_t progress = get_progress_percent(); + uint32_t elapsed = print_job_timer.duration(); + duration_t remaining = (progress > 0) ? ((elapsed * 25600 / progress) >> 8) - elapsed : 0; + #endif + const uint8_t len = remaining.toDigital(buffer); + timepos = LCD_WIDTH - 1 - len; + lcd_put_wchar(timepos, 2, 'R'); + } + #else + constexpr bool show_remain = false; + #endif + + if (!show_remain) { + duration_t elapsed = print_job_timer.duration(); + const uint8_t len = elapsed.toDigital(buffer); + timepos = LCD_WIDTH - 1 - len; + lcd_put_wchar(timepos, 2, LCD_STR_CLOCK[0]); + } + lcd_put_u8str(buffer); + + #if LCD_WIDTH >= 20 + lcd_moveto(timepos - 7, 2); + #if HAS_PRINT_PROGRESS + _draw_print_progress(); + #else + char c; + uint16_t per; + #if HAS_FAN0 + if (true + #if EXTRUDERS && ENABLED(ADAPTIVE_FAN_SLOWING) + && (blink || thermalManager.fan_speed_scaler[0] < 128) + #endif + ) { + uint16_t spd = thermalManager.fan_speed[0]; + if (blink) c = 'F'; + #if ENABLED(ADAPTIVE_FAN_SLOWING) + else { c = '*'; spd = thermalManager.scaledFanSpeed(0, spd); } + #endif + per = thermalManager.fanPercent(spd); + } + else + #endif + { + #if EXTRUDERS + c = 'E'; + per = planner.flow_percentage[0]; + #endif + } + lcd_put_wchar(c); + lcd_put_u8str(i16tostr3rj(per)); + lcd_put_wchar('%'); + #endif + #endif + + #endif // LCD_HEIGHT > 3 + + #elif LCD_INFO_SCREEN_STYLE == 1 + + // ========== Line 1 ========== + + // + // Hotend 0 Temperature + // + _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); + + // + // Z Coordinate + // + lcd_moveto(LCD_WIDTH - 9, 0); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); + + #if HAS_LEVELING && (HAS_MULTI_HOTEND || !HAS_HEATED_BED) + lcd_put_wchar(LCD_WIDTH - 1, 0, planner.leveling_active || blink ? '_' : ' '); + #endif + + // ========== Line 2 ========== + + // + // Hotend 1 or Bed Temperature + // + lcd_moveto(0, 1); + #if HAS_MULTI_HOTEND + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + _draw_bed_status(blink); + #endif + + lcd_put_wchar(LCD_WIDTH - 9, 1, LCD_STR_FEEDRATE[0]); + lcd_put_u8str(i16tostr3rj(feedrate_percentage)); + lcd_put_wchar('%'); + + // ========== Line 3 ========== + + // + // SD Percent, Hotend 2, or Bed + // + lcd_moveto(0, 2); + #if HOTENDS > 2 + _draw_heater_status(H_E2, LCD_STR_THERMOMETER[0], blink); + #elif HAS_MULTI_HOTEND && HAS_HEATED_BED + _draw_bed_status(blink); + #elif HAS_PRINT_PROGRESS + #define DREW_PRINT_PROGRESS + _draw_print_progress(); + #endif + + // + // Elapsed Time or SD Percent + // + lcd_moveto(LCD_WIDTH - 9, 2); + #if HAS_PRINT_PROGRESS && !defined(DREW_PRINT_PROGRESS) + _draw_print_progress(); + #else + duration_t elapsed = print_job_timer.duration(); + char buffer[14]; + (void)elapsed.toDigital(buffer); + lcd_put_wchar(LCD_STR_CLOCK[0]); + lcd_put_u8str(buffer); + #endif + + #endif // LCD_INFO_SCREEN_STYLE 1 + + // ========= Last Line ======== + + // + // Status Message (which may be a Progress Bar or Filament display) + // + draw_status_message(blink); +} + +#if HAS_LCD_MENU + + #include "../menu/menu.h" + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + if (row < LCD_HEIGHT) { + lcd_moveto(LCD_WIDTH - 9, row); + _draw_heater_status((heater_id_t)extruder, LCD_STR_THERMOMETER[0], get_blink()); + } + } + + #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 vstr/*=nullptr*/) { + int8_t n = LCD_WIDTH; + lcd_moveto(0, row); + 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--; } + } + 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(' '); + } + + // 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, 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 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, itemString, LCD_WIDTH - 2 - vlen); + if (vlen) { + lcd_put_wchar(':'); + for (; n; --n) lcd_put_wchar(' '); + if (pgm) lcd_put_u8str_P(inStr); else lcd_put_u8str(inStr); + } + } + + // 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(':'); 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); + } + } + + // 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*/) { + ui.draw_select_screen_prompt(pref, string, suff); + SETCURSOR(0, LCD_HEIGHT - 1); + lcd_put_wchar(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd_put_wchar(yesno ? ' ' : ']'); + SETCURSOR_RJ(utf8_strlen_P(yes) + 2, LCD_HEIGHT - 1); + lcd_put_wchar(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd_put_wchar(yesno ? ']' : ' '); + } + + #if ENABLED(SDSUPPORT) + + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + lcd_put_wchar(0, row, sel ? LCD_STR_ARROW_RIGHT[0] : ' '); + constexpr uint8_t maxlen = LCD_WIDTH - 2; + uint8_t n = maxlen - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), maxlen); + for (; n; --n) lcd_put_wchar(' '); + lcd_put_wchar(isDir ? LCD_STR_FOLDER[0] : ' '); + } + + #endif + + #if ENABLED(LCD_HAS_STATUS_INDICATORS) + + void MarlinUI::update_indicators() { + // Set the LEDS - referred to as backlights by the LiquidTWI2 library + static uint8_t ledsprev = 0; + uint8_t leds = 0; + + if (TERN0(HAS_HEATED_BED, thermalManager.degTargetBed() > 0)) leds |= LED_A; + if (TERN0(HAS_HOTEND, thermalManager.degTargetHotend(0) > 0)) leds |= LED_B; + + #if HAS_FAN + if ( TERN0(HAS_FAN0, thermalManager.fan_speed[0]) + || TERN0(HAS_FAN1, thermalManager.fan_speed[1]) + || TERN0(HAS_FAN2, thermalManager.fan_speed[2]) + || TERN0(HAS_FAN3, thermalManager.fan_speed[3]) + || TERN0(HAS_FAN4, thermalManager.fan_speed[4]) + || TERN0(HAS_FAN5, thermalManager.fan_speed[5]) + || TERN0(HAS_FAN6, thermalManager.fan_speed[6]) + || TERN0(HAS_FAN7, thermalManager.fan_speed[7]) + ) leds |= LED_C; + #endif // HAS_FAN + + if (TERN0(HAS_MULTI_HOTEND, thermalManager.degTargetHotend(1) > 0)) leds |= LED_C; + + if (leds != ledsprev) { + lcd.setBacklight(leds); + ledsprev = leds; + } + } + + #endif // LCD_HAS_STATUS_INDICATORS + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + #define HD44780_CHAR_WIDTH 5 + #define HD44780_CHAR_HEIGHT 8 + #define MESH_MAP_COLS 7 + #define MESH_MAP_ROWS 4 + + #define CHAR_LINE_TOP 0 + #define CHAR_LINE_BOT 1 + #define CHAR_EDGE_L 2 + #define CHAR_EDGE_R 3 + #define CHAR_UL_UL 4 + #define CHAR_LR_UL 5 + #define CHAR_UL_LR 6 + #define CHAR_LR_LR 7 + + #define TOP_LEFT _BV(0) + #define TOP_RIGHT _BV(1) + #define LOWER_LEFT _BV(2) + #define LOWER_RIGHT _BV(3) + + /** + * Possible map screens: + * + * 16x2 |X000.00 Y000.00| + * |(00,00) Z00.000| + * + * 20x2 | X:000.00 Y:000.00 | + * | (00,00) Z:00.000 | + * + * 16x4 |+-------+(00,00)| + * || |X000.00| + * || |Y000.00| + * |+-------+Z00.000| + * + * 20x4 | +-------+ (00,00) | + * | | | X:000.00| + * | | | Y:000.00| + * | +-------+ Z:00.000| + */ + + typedef struct { + uint8_t custom_char_bits[HD44780_CHAR_HEIGHT]; + } custom_char; + + typedef struct { + lcd_uint_t column, row, + x_pixel_offset, y_pixel_offset; + uint8_t x_pixel_mask; + } coordinate; + + void add_edges_to_custom_char(custom_char &custom, const coordinate &ul, const coordinate &lr, const coordinate &brc, const uint8_t cell_location); + FORCE_INLINE static void clear_custom_char(custom_char * const cc) { ZERO(cc->custom_char_bits); } + + coordinate pixel_location(int16_t x, int16_t y) { + coordinate ret_val; + int16_t xp, yp, r, c; + + x++; y++; // +1 because lines on the left and top + + c = x / (HD44780_CHAR_WIDTH); + r = y / (HD44780_CHAR_HEIGHT); + + ret_val.column = c; + ret_val.row = r; + + xp = x - c * (HD44780_CHAR_WIDTH); // Get the pixel offsets into the character cell + xp = HD44780_CHAR_WIDTH - 1 - xp; // Column within relevant character cell (0 on the right) + yp = y - r * (HD44780_CHAR_HEIGHT); + + ret_val.x_pixel_mask = _BV(xp); + ret_val.x_pixel_offset = xp; + ret_val.y_pixel_offset = yp; + return ret_val; + } + + inline coordinate pixel_location(const lcd_uint_t x, const lcd_uint_t y) { return pixel_location((int16_t)x, (int16_t)y); } + + void prep_and_put_map_char(custom_char &chrdata, const coordinate &ul, const coordinate &lr, const coordinate &brc, const uint8_t cl, const char c, const lcd_uint_t x, const lcd_uint_t y) { + add_edges_to_custom_char(chrdata, ul, lr, brc, cl); + lcd.createChar(c, (uint8_t*)&chrdata); + lcd_put_wchar(x, y, c); + } + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + + #if LCD_WIDTH >= 20 + #define _LCD_W_POS 12 + #define _PLOT_X 1 + #define _MAP_X 3 + #define _LABEL(C,X,Y) lcd_put_u8str_P(X, Y, C) + #define _XLABEL(X,Y) _LABEL(X_LBL,X,Y) + #define _YLABEL(X,Y) _LABEL(Y_LBL,X,Y) + #define _ZLABEL(X,Y) _LABEL(Z_LBL,X,Y) + #else + #define _LCD_W_POS 8 + #define _PLOT_X 0 + #define _MAP_X 1 + #define _LABEL(X,Y,C) lcd_put_wchar(X, Y, C) + #define _XLABEL(X,Y) _LABEL('X',X,Y) + #define _YLABEL(X,Y) _LABEL('Y',X,Y) + #define _ZLABEL(X,Y) _LABEL('Z',X,Y) + #endif + + #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display + + /** + * Show X and Y positions + */ + _XLABEL(_PLOT_X, 0); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(ubl.mesh_index_to_xpos(x_plot)))); + _YLABEL(_LCD_W_POS, 0); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(ubl.mesh_index_to_ypos(y_plot)))); + + lcd_moveto(_PLOT_X, 0); + + #else // 16x4 or 20x4 display + + coordinate upper_left, lower_right, bottom_right_corner; + custom_char new_char; + uint8_t i, n, n_rows, n_cols; + lcd_uint_t j, k, l, m, bottom_line, right_edge, + x_map_pixels, y_map_pixels, + pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt, + suppress_x_offset = 0, suppress_y_offset = 0; + + const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; + + upper_left.column = 0; + upper_left.row = 0; + lower_right.column = 0; + lower_right.row = 0; + + clear_lcd(); + + x_map_pixels = (HD44780_CHAR_WIDTH) * (MESH_MAP_COLS) - 2; // Minus 2 because we are drawing a box around the map + y_map_pixels = (HD44780_CHAR_HEIGHT) * (MESH_MAP_ROWS) - 2; + + pixels_per_x_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X); + pixels_per_y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y); + + if (pixels_per_x_mesh_pnt >= HD44780_CHAR_WIDTH) { // There are only 2 custom characters available, so the X + pixels_per_x_mesh_pnt = HD44780_CHAR_WIDTH; // Size of the mesh point needs to fit within them independent + suppress_x_offset = 1; // Of where the starting pixel is located. + } + + if (pixels_per_y_mesh_pnt >= HD44780_CHAR_HEIGHT) { // There are only 2 custom characters available, so the Y + pixels_per_y_mesh_pnt = HD44780_CHAR_HEIGHT; // Size of the mesh point needs to fit within them independent + suppress_y_offset = 1; // Of where the starting pixel is located. + } + + x_map_pixels = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X); // Now we have the right number of pixels to make both + y_map_pixels = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y); // Directions fit nicely + + right_edge = pixels_per_x_mesh_pnt * (GRID_MAX_POINTS_X) + 1; // Find location of right edge within the character cell + bottom_line = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 1; // Find location of bottome line within the character cell + + n_rows = bottom_line / (HD44780_CHAR_HEIGHT) + 1; + n_cols = right_edge / (HD44780_CHAR_WIDTH) + 1; + + for (i = 0; i < n_cols; i++) { + lcd_put_wchar(i, 0, CHAR_LINE_TOP); // Box Top line + lcd_put_wchar(i, n_rows - 1, CHAR_LINE_BOT); // Box Bottom line + } + + for (j = 0; j < n_rows; j++) { + lcd_put_wchar(0, j, CHAR_EDGE_L); // Box Left edge + lcd_put_wchar(n_cols - 1, j, CHAR_EDGE_R); // Box Right edge + } + + /** + * If the entire 4th row is not in use, do not put vertical bars all the way down to the bottom of the display + */ + + k = pixels_per_y_mesh_pnt * (GRID_MAX_POINTS_Y) + 2; + l = (HD44780_CHAR_HEIGHT) * n_rows; + if (l > k && l - k >= (HD44780_CHAR_HEIGHT) / 2) { + lcd_put_wchar(0, n_rows - 1, ' '); // Box Left edge + lcd_put_wchar(n_cols - 1, n_rows - 1, ' '); // Box Right edge + } + + clear_custom_char(&new_char); + new_char.custom_char_bits[0] = 0b11111U; // Char #0 is used for the box top line + lcd.createChar(CHAR_LINE_TOP, (uint8_t*)&new_char); + + clear_custom_char(&new_char); + k = (GRID_MAX_POINTS_Y) * pixels_per_y_mesh_pnt + 1; // Row of pixels for the bottom box line + l = k % (HD44780_CHAR_HEIGHT); // Row within relevant character cell + new_char.custom_char_bits[l] = 0b11111U; // Char #1 is used for the box bottom line + lcd.createChar(CHAR_LINE_BOT, (uint8_t*)&new_char); + + clear_custom_char(&new_char); + for (j = 0; j < HD44780_CHAR_HEIGHT; j++) + new_char.custom_char_bits[j] = 0b10000U; // Char #2 is used for the box left edge + lcd.createChar(CHAR_EDGE_L, (uint8_t*)&new_char); + + clear_custom_char(&new_char); + m = (GRID_MAX_POINTS_X) * pixels_per_x_mesh_pnt + 1; // Column of pixels for the right box line + n = m % (HD44780_CHAR_WIDTH); // Column within relevant character cell + i = HD44780_CHAR_WIDTH - 1 - n; // Column within relevant character cell (0 on the right) + for (j = 0; j < HD44780_CHAR_HEIGHT; j++) + new_char.custom_char_bits[j] = (uint8_t)_BV(i); // Char #3 is used for the box right edge + lcd.createChar(CHAR_EDGE_R, (uint8_t*)&new_char); + + i = x_plot * pixels_per_x_mesh_pnt - suppress_x_offset; + j = y_plot_inv * pixels_per_y_mesh_pnt - suppress_y_offset; + upper_left = pixel_location(i, j); + + k = (x_plot + 1) * pixels_per_x_mesh_pnt - 1 - suppress_x_offset; + l = (y_plot_inv + 1) * pixels_per_y_mesh_pnt - 1 - suppress_y_offset; + lower_right = pixel_location(k, l); + + bottom_right_corner = pixel_location(x_map_pixels, y_map_pixels); + + /** + * First, handle the simple case where everything is within a single character cell. + * If part of the Mesh Plot is outside of this character cell, we will follow up + * and deal with that next. + */ + + clear_custom_char(&new_char); + const lcd_uint_t ypix = _MIN(upper_left.y_pixel_offset + pixels_per_y_mesh_pnt, HD44780_CHAR_HEIGHT); + for (j = upper_left.y_pixel_offset; j < ypix; j++) { + i = upper_left.x_pixel_mask; + for (k = 0; k < pixels_per_x_mesh_pnt; k++) { + new_char.custom_char_bits[j] |= i; + i >>= 1; + } + } + + prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, TOP_LEFT, CHAR_UL_UL, upper_left.column, upper_left.row); + + /** + * Next, check for two side by side character cells being used to display the Mesh Point + * If found... do the right hand character cell next. + */ + if (upper_left.column == lower_right.column - 1) { + l = upper_left.x_pixel_offset; + clear_custom_char(&new_char); + for (j = upper_left.y_pixel_offset; j < ypix; j++) { + i = _BV(HD44780_CHAR_WIDTH - 1); // Fill in the left side of the right character cell + for (k = 0; k < pixels_per_x_mesh_pnt - 1 - l; k++) { + new_char.custom_char_bits[j] |= i; + i >>= 1; + } + } + prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, TOP_RIGHT, CHAR_LR_UL, lower_right.column, upper_left.row); + } + + /** + * Next, check for two character cells stacked on top of each other being used to display the Mesh Point + */ + if (upper_left.row == lower_right.row - 1) { + l = HD44780_CHAR_HEIGHT - upper_left.y_pixel_offset; // Number of pixel rows in top character cell + k = pixels_per_y_mesh_pnt - l; // Number of pixel rows in bottom character cell + clear_custom_char(&new_char); + for (j = 0; j < k; j++) { + i = upper_left.x_pixel_mask; + for (m = 0; m < pixels_per_x_mesh_pnt; m++) { // Fill in the top side of the bottom character cell + new_char.custom_char_bits[j] |= i; + if (!(i >>= 1)) break; + } + } + prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, LOWER_LEFT, CHAR_UL_LR, upper_left.column, lower_right.row); + } + + /** + * Next, check for four character cells being used to display the Mesh Point. If that is + * what is here, we work to fill in the character cell that is down one and to the right one + * from the upper_left character cell. + */ + + if (upper_left.column == lower_right.column - 1 && upper_left.row == lower_right.row - 1) { + l = HD44780_CHAR_HEIGHT - upper_left.y_pixel_offset; // Number of pixel rows in top character cell + k = pixels_per_y_mesh_pnt - l; // Number of pixel rows in bottom character cell + clear_custom_char(&new_char); + for (j = 0; j < k; j++) { + l = upper_left.x_pixel_offset; + i = _BV(HD44780_CHAR_WIDTH - 1); // Fill in the left side of the right character cell + for (m = 0; m < pixels_per_x_mesh_pnt - 1 - l; m++) { // Fill in the top side of the bottom character cell + new_char.custom_char_bits[j] |= i; + i >>= 1; + } + } + prep_and_put_map_char(new_char, upper_left, lower_right, bottom_right_corner, LOWER_RIGHT, CHAR_LR_LR, lower_right.column, lower_right.row); + } + + #endif + + /** + * Print plot position + */ + lcd_put_wchar(_LCD_W_POS, 0, '('); + lcd_put_u8str(ui8tostr3rj(x_plot)); + lcd_put_wchar(','); + lcd_put_u8str(ui8tostr3rj(y_plot)); + lcd_put_wchar(')'); + + #if LCD_HEIGHT <= 3 // 16x2 or 20x2 display + + /** + * Print Z values + */ + _ZLABEL(_LCD_W_POS, 1); + if (!isnan(ubl.z_values[x_plot][y_plot])) + lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); + else + lcd_put_u8str_P(PSTR(" -----")); + + #else // 16x4 or 20x4 display + + /** + * Show all values at right of screen + */ + _XLABEL(_LCD_W_POS, 1); + lcd_put_u8str(ftostr52(LOGICAL_X_POSITION(ubl.mesh_index_to_xpos(x_plot)))); + _YLABEL(_LCD_W_POS, 2); + lcd_put_u8str(ftostr52(LOGICAL_Y_POSITION(ubl.mesh_index_to_ypos(y_plot)))); + + /** + * Show the location value + */ + _ZLABEL(_LCD_W_POS, 3); + if (!isnan(ubl.z_values[x_plot][y_plot])) + lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); + else + lcd_put_u8str_P(PSTR(" -----")); + + #endif // LCD_HEIGHT > 3 + } + + void add_edges_to_custom_char(custom_char &custom, const coordinate &ul, const coordinate &lr, const coordinate &brc, const uint8_t cell_location) { + uint8_t i, k; + int16_t n_rows = lr.row - ul.row + 1, + n_cols = lr.column - ul.column + 1; + + /** + * Check if Top line of box needs to be filled in + */ + + if (ul.row == 0 && (cell_location & (TOP_LEFT|TOP_RIGHT))) { // Only fill in the top line for the top character cells + + if (n_cols == 1) { + if (ul.column != brc.column) + custom.custom_char_bits[0] = 0xFF; // Single column in middle + else + for (i = brc.x_pixel_offset; i < HD44780_CHAR_WIDTH; i++) // Single column on right side + SBI(custom.custom_char_bits[0], i); + } + else if ((cell_location & TOP_LEFT) || lr.column != brc.column) // Multiple column in the middle or with right cell in middle + custom.custom_char_bits[0] = 0xFF; + else + for (i = brc.x_pixel_offset; i < HD44780_CHAR_WIDTH; i++) + SBI(custom.custom_char_bits[0], i); + } + + /** + * Check if left line of box needs to be filled in + */ + if (cell_location & (TOP_LEFT|LOWER_LEFT)) { + if (ul.column == 0) { // Left column of characters on LCD Display + k = ul.row == brc.row ? brc.y_pixel_offset : HD44780_CHAR_HEIGHT; // If it isn't the last row... do the full character cell + for (i = 0; i < k; i++) + SBI(custom.custom_char_bits[i], HD44780_CHAR_WIDTH - 1); + } + } + + /** + * Check if bottom line of box needs to be filled in + */ + + // Single row of mesh plot cells + if (n_rows == 1 /* && (cell_location & (TOP_LEFT|TOP_RIGHT)) */ && ul.row == brc.row) { + if (n_cols == 1) // Single row, single column case + k = ul.column == brc.column ? brc.x_pixel_mask : 0x01; + else if (cell_location & TOP_RIGHT) // Single row, multiple column case + k = lr.column == brc.column ? brc.x_pixel_mask : 0x01; + else // Single row, left of multiple columns + k = 0x01; + while (k < _BV(HD44780_CHAR_WIDTH)) { + custom.custom_char_bits[brc.y_pixel_offset] |= k; + k <<= 1; + } + } + + // Double row of characters on LCD Display + // And this is a bottom custom character + if (n_rows == 2 && (cell_location & (LOWER_LEFT|LOWER_RIGHT)) && lr.row == brc.row) { + if (n_cols == 1) // Double row, single column case + k = ul.column == brc.column ? brc.x_pixel_mask : 0x01; + else if (cell_location & LOWER_RIGHT) // Double row, multiple column case + k = lr.column == brc.column ? brc.x_pixel_mask : 0x01; + else // Double row, left of multiple columns + k = 0x01; + while (k < _BV(HD44780_CHAR_WIDTH)) { + custom.custom_char_bits[brc.y_pixel_offset] |= k; + k <<= 1; + } + } + + /** + * Check if right line of box needs to be filled in + */ + + // Nothing to do if the lower right part of the mesh pnt isn't in the same column as the box line + if (lr.column == brc.column) { + // This mesh point is in the same character cell as the right box line + if (ul.column == brc.column || (cell_location & (TOP_RIGHT|LOWER_RIGHT))) { + // If not the last row... do the full character cell + k = ul.row == brc.row ? brc.y_pixel_offset : HD44780_CHAR_HEIGHT; + for (i = 0; i < k; i++) custom.custom_char_bits[i] |= brc.x_pixel_mask; + } + } + } + + #endif // AUTO_BED_LEVELING_UBL + +#endif // HAS_LCD_MENU + +#endif // HAS_MARLINUI_HD44780 diff --git a/Marlin/src/lcd/HD44780/ultralcd_HD44780.h b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h new file mode 100644 index 00000000..604d26a0 --- /dev/null +++ b/Marlin/src/lcd/HD44780/ultralcd_HD44780.h @@ -0,0 +1,102 @@ +/** + * 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 + +/** + * Hitachi HD44780 display defines and headers + */ + +#include "../../inc/MarlinConfig.h" + +#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 + #define LCD_I2C_PIN_RW 1 + #define LCD_I2C_PIN_RS 0 + #define LCD_I2C_PIN_D4 4 + #define LCD_I2C_PIN_D5 5 + #define LCD_I2C_PIN_D6 6 + #define LCD_I2C_PIN_D7 7 + + #include + #include + #include + #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 + #define LED_B 0x02 //010 + #define LED_C 0x01 //001 + + #include + #include + #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 + #include + #include + #define LCD_CLASS LiquidCrystal_SR + +#elif ENABLED(SR_LCD_3W_NL) + + // 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" +#include "../lcdprint.h" diff --git a/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp new file mode 100644 index 00000000..51681a80 --- /dev/null +++ b/Marlin/src/lcd/TFTGLCD/lcdprint_TFTGLCD.cpp @@ -0,0 +1,1142 @@ +/** + * 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_TFTGLCD.cpp + * @brief LCD print API for TFT-GLCD interface + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +/** + * The TFTGLCD only supports ??? languages. + */ + +#include "../../inc/MarlinConfigPre.h" + +#if IS_TFTGLCD_PANEL + +#include "../ultralcd.h" +#include "../../MarlinCore.h" +#include "../../libs/numtostr.h" + +#include "ultralcd_TFTGLCD.h" + +#include + +int lcd_glyph_height(void) { return 1; } + +typedef struct _TFTGLCD_charmap_t { + wchar_t uchar; // the unicode char + uint8_t idx; // the glyph of the char in the ROM + uint8_t idx2; // the char used to be combined with the idx to simulate a single char +} TFTGLCD_charmap_t; + +#ifdef __AVR__ + #define IV(a) U##a +#else + #define IV(a) L##a +#endif + +static const TFTGLCD_charmap_t g_TFTGLCD_charmap_device[] PROGMEM = { + // sorted by uchar: + #if DISPLAY_CHARSET_HD44780 == JAPANESE + + {IV('¢'), 0xEC, 0}, // A2 + {IV('°'), 0xDF, 0}, // B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('ä'), 0xE1, 0}, // E4 + {IV('ö'), 0xEF, 0}, // F6 + {IV('÷'), 0xFD, 0}, // 00F7 + {IV('ü'), 0xF5, 0}, // 00FC + {IV('ˣ'), 0xEB, 0}, // 02E3 + + {IV('·'), 0xA5, 0}, // 0387 + {IV('Ώ'), 0xF4, 0}, // 038F + {IV('Θ'), 0xF2, 0}, // 0398, Theta + {IV('Ξ'), 0xE3, 0}, // 039E, Xi + {IV('Σ'), 0xF6, 0}, // 03A3, Sigma + {IV('Ω'), 0xF4, 0}, // 03A9, Omega + {IV('ά'), 0xE0, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('α'), 0xE0, 0}, // 03B1, alpha + {IV('β'), 0xE2, 0}, // 03B2, beta + {IV('ε'), 0xE3, 0}, // 03B5, epsilon + {IV('θ'), 0xF2, 0}, // 03B8, theta + {IV('μ'), 0xE4, 0}, // 03BC, mu + {IV('ξ'), 0xE3, 0}, // 03BE, xi + {IV('π'), 0xF7, 0}, // 03C0, pi + {IV('ρ'), 0xE6, 0}, // 03C1, rho + {IV('σ'), 0xE5, 0}, // 03C3, sigma + + {IV('←'), 0x7F, 0}, // 2190 + {IV('→'), 0x7E, 0}, // 2192, Marlin special: '⮈⮉⮊⮋➤→' LCD_STR_ARROW_RIGHT (0x03) + {IV('√'), 0xE8, 0}, // 221A + {IV('∞'), 0xF3, 0}, // 221E + {IV('█'), 0xFF, 0}, // 2588 + + //{IV(''), 0xA0, 0}, + {IV('。'), 0xA1, 0}, + {IV('「'), 0xA2, 0}, + {IV('」'), 0xA3, 0}, + {IV('゛'), 0xDE, 0}, // ‶ + {IV('゜'), 0xDF, 0}, // '〫' + {IV('゠'), '=', 0}, + {IV('ァ'), 0xA7, 0}, + {IV('ア'), 0xB1, 0}, + {IV('ィ'), 0xA8, 0}, + {IV('イ'), 0xB2, 0}, + {IV('ゥ'), 0xA9, 0}, + {IV('ウ'), 0xB3, 0}, + {IV('ェ'), 0xAA, 0}, + {IV('エ'), 0xB4, 0}, + {IV('ォ'), 0xAB, 0}, + + {IV('オ'), 0xB5, 0}, + {IV('カ'), 0xB6, 0}, + {IV('ガ'), 0xB6, 0xDE}, + {IV('キ'), 0xB7, 0}, + {IV('ギ'), 0xB7, 0xDE}, // + {IV('ク'), 0xB8, 0}, + {IV('グ'), 0xB8, 0xDE}, + {IV('ケ'), 0xB9, 0}, + {IV('ゲ'), 0xB9, 0xDE}, + {IV('コ'), 0xBA, 0}, + {IV('ゴ'), 0xBA, 0xDE}, + {IV('サ'), 0xBB, 0}, + {IV('ザ'), 0xBB, 0xDE}, + {IV('シ'), 0xBC, 0}, + {IV('ジ'), 0xBC, 0xDE}, + {IV('ス'), 0xBD, 0}, + {IV('ズ'), 0xBD, 0xDE}, + {IV('セ'), 0xBE, 0}, + {IV('ゼ'), 0xBE, 0xDE}, + {IV('ソ'), 0xBF, 0}, + {IV('ゾ'), 0xBF, 0xDE}, + + {IV('タ'), 0xC0, 0}, + {IV('ダ'), 0xC0, 0xDE}, + {IV('チ'), 0xC1, 0}, + {IV('ヂ'), 0xC1, 0xDE}, + {IV('ッ'), 0xAF, 0}, + {IV('ツ'), 0xC2, 0}, + {IV('ヅ'), 0xC2, 0xDE}, + {IV('テ'), 0xC3, 0}, + {IV('デ'), 0xC3, 0xDE}, + {IV('ト'), 0xC4, 0}, + {IV('ド'), 0xC4, 0xDE}, + {IV('ナ'), 0xC5, 0}, + {IV('ニ'), 0xC6, 0}, + {IV('ヌ'), 0xC7, 0}, + {IV('ネ'), 0xC8, 0}, + {IV('ノ'), 0xC9, 0}, + {IV('ハ'), 0xCA, 0}, + {IV('バ'), 0xCA, 0xDE}, + {IV('パ'), 0xCA, 0xDF}, + {IV('ヒ'), 0xCB, 0}, + {IV('ビ'), 0xCB, 0xDE}, + {IV('ピ'), 0xCB, 0xDF}, + {IV('フ'), 0xCC, 0}, + {IV('ブ'), 0xCC, 0xDE}, + {IV('プ'), 0xCC, 0xDF}, + {IV('ヘ'), 0xCD, 0}, + {IV('ベ'), 0xCD, 0xDE}, + {IV('ペ'), 0xCD, 0xDF}, + {IV('ホ'), 0xCE, 0}, + {IV('ボ'), 0xCE, 0xDE}, + {IV('ポ'), 0xCE, 0xDF}, + {IV('マ'), 0xCF, 0}, + + {IV('ミ'), 0xD0, 0}, + {IV('ム'), 0xD1, 0}, + {IV('メ'), 0xD2, 0}, + {IV('モ'), 0xD3, 0}, + {IV('ャ'), 0xAC, 0}, + {IV('ヤ'), 0xD4, 0}, + {IV('ュ'), 0xAD, 0}, + {IV('ユ'), 0xD5, 0}, + {IV('ョ'), 0xAE, 0}, + {IV('ヨ'), 0xD6, 0}, + {IV('ラ'), 0xD7, 0}, + {IV('リ'), 0xD8, 0}, + {IV('ル'), 0xD9, 0}, + {IV('レ'), 0xDA, 0}, + {IV('ロ'), 0xDB, 0}, + {IV('ワ'), 0xDC, 0}, + {IV('ヲ'), 0xA6, 0}, + {IV('ン'), 0xDD, 0}, + {IV('ヴ'), 0xB3, 0xDE}, + {IV('ヷ'), 0xDC, 0xDE}, + {IV('ヺ'), 0xA6, 0xDE}, + {IV('・'), 0xA5, 0}, + {IV('ー'), 0xB0, 0}, + {IV('ヽ'), 0xA4, 0}, + + //{IV('g'), 0xE7, 0}, // error + //{IV(''), 0xE9, 0}, + //{IV('j'), 0xEA, 0}, // error + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + + //{IV('p'), 0xF0, 0}, // error + //{IV('q'), 0xF1, 0}, // error + //{IV(''), 0xF8, 0}, + //{IV('y'), 0xF9, 0}, // error + {IV('万'), 0xFB, 0}, + {IV('円'), 0xFC, 0}, + {IV('千'), 0xFA, 0}, + //{IV(''), 0xFE, 0}, + + //、・ヲァィゥェォャュョッー + {IV('、'), 0xA4, 0}, //ヽ + {IV('・'), 0xA5, 0}, //・ + {IV('ヲ'), 0xA6, 0}, //ヲ + {IV('ァ'), 0xA7, 0}, //ァ + {IV('ィ'), 0xA8, 0}, //ィ + {IV('ゥ'), 0xA9, 0}, //ゥ + {IV('ェ'), 0xAA, 0}, //ェ + {IV('ォ'), 0xAB, 0}, //ォ + {IV('ャ'), 0xAC, 0}, //ャ + {IV('ュ'), 0xAD, 0}, //ュ + {IV('ョ'), 0xAE, 0}, //ョ + {IV('ッ'), 0xAF, 0}, //ッ + {IV('ー'), 0xB0, 0}, //ー + + //アイウエオカキクケコサシスセ + {IV('ア'), 0xB1, 0}, //ア + {IV('イ'), 0xB2, 0}, //イ + {IV('ウ'), 0xB3, 0}, //ウ + {IV('エ'), 0xB4, 0}, //エ + {IV('オ'), 0xB5, 0}, //オ + {IV('カ'), 0xB6, 0}, //カ + {IV('キ'), 0xB7, 0}, //キ + {IV('ク'), 0xB8, 0}, //ク + {IV('ケ'), 0xB9, 0}, //ケ + {IV('コ'), 0xBA, 0}, //コ + {IV('サ'), 0xBB, 0}, //サ + {IV('シ'), 0xBC, 0}, //シ + {IV('ス'), 0xBD, 0}, //ス + {IV('セ'), 0xBE, 0}, //セ + + //ソタチツテトナニヌネノハヒフ + {IV('ソ'), 0xBF, 0}, //ソ + {IV('タ'), 0xC0, 0}, //タ + {IV('チ'), 0xC1, 0}, //チ + {IV('ツ'), 0xC2, 0}, //ツ + {IV('テ'), 0xC3, 0}, //テ + {IV('ト'), 0xC4, 0}, //ト + {IV('ナ'), 0xC5, 0}, //ナ + {IV('ニ'), 0xC6, 0}, //ニ + {IV('ヌ'), 0xC7, 0}, //ヌ + {IV('ネ'), 0xC8, 0}, //ネ + {IV('ノ'), 0xC9, 0}, //ノ + {IV('ハ'), 0xCA, 0}, //ハ + {IV('ヒ'), 0xCB, 0}, //ヒ + {IV('フ'), 0xCC, 0}, //フ + + //ヘホマミムメモヤユヨラリルレロワン゙゚ + {IV('ヘ'), 0xCD, 0}, //ヘ + {IV('ホ'), 0xCE, 0}, //ホ + {IV('マ'), 0xCF, 0}, //マ + {IV('ミ'), 0xD0, 0}, //ミ + {IV('ム'), 0xD1, 0}, //ム + {IV('メ'), 0xD2, 0}, //メ + {IV('モ'), 0xD3, 0}, //モ + {IV('ヤ'), 0xD4, 0}, //ヤ + {IV('ユ'), 0xD5, 0}, //ユ + {IV('ヨ'), 0xD6, 0}, //ヨ + {IV('ラ'), 0xD7, 0}, //ラ + {IV('リ'), 0xD8, 0}, //リ + {IV('ル'), 0xD9, 0}, //ル + {IV('レ'), 0xDA, 0}, //レ + {IV('ロ'), 0xDB, 0}, //ロ + {IV('ワ'), 0xDC, 0}, //ワ + {IV('ン'), 0xDD, 0}, //ン + {IV('゙'), 0xDE, 0}, // ゛ + {IV('゚'), 0xDF, 0}, // ゜ + + {IV('¥'), 0x5C, 0}, + + #elif DISPLAY_CHARSET_HD44780 == WESTERN + // 0x10 -- 0x1F (except 0x1C) + // 0x80 -- 0xFF (except 0xA7,0xB0,0xB1,0xB3,0xB4,0xBF,0xD1,0xF8,0xFA,0xFC-0xFF) + + {IV('¡'), 0xA9, 0}, + {IV('¢'), 0xA4, 0}, + {IV('£'), 0xA5, 0}, + {IV('¥'), 0xA6, 0}, + {IV('§'), 0xD2, 0}, // section sign + {IV('©'), 0xCF, 0}, + + {IV('ª'), 0x9D, 0}, + {IV('«'), 0xBB, 0}, + {IV('®'), 0xCE, 0}, + + {IV('°'), 0xB2, 0}, // Marlin special: '°' LCD_STR_DEGREE (0x09) + //{IV(''), 0xD1, 0}, + {IV('±'), 0x10, 0}, //∓± + //{'='), 0x1C, 0}, // error + {IV('²'), 0x1E, 0}, + {IV('³'), 0x1F, 0}, + {IV('¶'), 0xD3, 0}, // pilcrow sign + {IV('º'), 0x9E, 0}, + {IV('»'), 0xBC, 0}, // 00BB + //{IV(''), 0xB3, 0}, // error + //{IV(''), 0xB4, 0}, // error + {IV('¼'), 0xB6, 0}, // 00BC + {IV('½'), 0xB5, 0}, // 00BD + //{IV('¾'), '3', 0}, // 00BE + {IV('¿'), 0x9F, 0}, // 00BF + + {IV('Â'), 0x8F, 0}, + {IV('Ã'), 0xAA, 0}, + {IV('Ä'), 0x8E, 0}, + {IV('Æ'), 0x92, 0}, + {IV('Ç'), 0x80, 0}, + {IV('É'), 0x90, 0}, + {IV('Ñ'), 0x9C, 0}, + {IV('Õ'), 0xAC, 0}, + {IV('Ö'), 0x99, 0}, + {IV('×'), 0xB7, 0}, + {IV('Ø'), 0xAE, 0}, + {IV('Ü'), 0x9A, 0}, + {IV('à'), 0x85, 0}, + {IV('á'), 0xA0, 0}, + {IV('â'), 0x83, 0}, + {IV('ã'), 0xAB, 0}, + {IV('ä'), 0x84, 0}, + {IV('å'), 0x86, 0}, + {IV('æ'), 0x91, 0}, + {IV('ç'), 0x87, 0}, + {IV('è'), 0x8A, 0}, + {IV('é'), 0x82, 0}, + {IV('ê'), 0x88, 0}, + {IV('ë'), 0x89, 0}, + {IV('ì'), 0x8D, 0}, + {IV('í'), 0xA1, 0}, + {IV('î'), 0x8C, 0}, + {IV('ï'), 0x8B, 0}, + + {IV('ñ'), 0x9B, 0}, + {IV('ò'), 0x95, 0}, + {IV('ó'), 0xA2, 0}, + {IV('ô'), 0x93, 0}, + {IV('õ'), 0xAD, 0}, + {IV('ö'), 0x94, 0}, + {IV('÷'), 0xB8, 0}, + {IV('ø'), 0xAF, 0}, + {IV('ù'), 0x97, 0}, + {IV('ú'), 0xA3, 0}, + {IV('û'), 0x96, 0}, + {IV('ü'), 0x81, 0}, + {IV('ÿ'), 0x98, 0}, + + //{IV(''), 0xB0, 0}, // error + //{IV(''), 0xB1, 0}, // error + {IV('ƒ'), 0xA8, 0}, // 0192 + + {IV('Ύ'), 0xDB, 0}, // 038E + {IV('Ώ'), 0xDE, 0}, // 038F + {IV('ΐ'), 0xE7, 0}, // 0390 + + {IV('Γ'), 0xD4, 0}, // 0393, Gamma + {IV('Δ'), 0xD5, 0}, // 0394, Delta, ◿ + {IV('Θ'), 0xD6, 0}, // 0398, Theta + {IV('Λ'), 0xD7, 0}, // 039B, Lambda + {IV('Ξ'), 0xD8, 0}, // 039E, Xi + {IV('Π'), 0xD9, 0}, // Pi + {IV('Σ'), 0xDA, 0}, // Sigma + {IV('Υ'), 0xDB, 0}, // Upsilon + {IV('Φ'), 0xDC, 0}, // Phi + {IV('Ψ'), 0xDD, 0}, // Psi + {IV('Ω'), 0xDE, 0}, // Omega + + {IV('ά'), 0xDF, 0}, // 03AC + {IV('έ'), 0xE3, 0}, // 03AD + {IV('ή'), 0xE5, 0}, // 03AE + {IV('ί'), 0xE7, 0}, // 03AF + {IV('ΰ'), 0xF1, 0}, // 03B0 + + {IV('α'), 0xDF, 0}, // alpha + {IV('β'), 0xE0, 0}, // beta + {IV('γ'), 0xE1, 0}, // gamma + {IV('δ'), 0xE2, 0}, // delta + {IV('ε'), 0xE3, 0}, // epsilon + {IV('ζ'), 0xE4, 0}, // zeta + {IV('η'), 0xE5, 0}, // eta + {IV('θ'), 0xE6, 0}, // theta + {IV('ι'), 0xE7, 0}, // lota + {IV('κ'), 0xE8, 0}, // kappa + {IV('λ'), 0xE9, 0}, // lambda + {IV('μ'), 0xEA, 0}, // mu + {IV('ν'), 0xEB, 0}, // nu + {IV('ξ'), 0xEC, 0}, // xi + {IV('π'), 0xED, 0}, // pi + {IV('ρ'), 0xEE, 0}, // rho + {IV('σ'), 0xEF, 0}, // sigma + + {IV('τ'), 0xF0, 0}, // tau + {IV('υ'), 0xF1, 0}, // upsilon + {IV('χ'), 0xF2, 0}, // chi + {IV('ψ'), 0xF3, 0}, // psi + {IV('ω'), 0xF4, 0}, // 03C9, omega + {IV('ϊ'), 0xE7, 0}, // 03CA + {IV('ϋ'), 0xF1, 0}, // 03CB + {IV('ύ'), 0xF1, 0}, // 03CD + {IV('ώ'), 0xF4, 0}, // 03CE + + {IV('•'), 0xCD, 0}, // · + {IV('℞'), 0xA7, 0}, // ℞ Pt ASCII 158 + {IV('™'), 0xD0, 0}, + {IV('↤'), 0xF9, 0}, // ⟻ + {IV('↵'), 0xC4, 0}, + {IV('↻'), 0x04, 0}, // Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('⇥'), 0xFB, 0}, + {IV('√'), 0xBE, 0}, // √ + {IV('∞'), 0xC2, 0}, // infinity + {IV('∫'), 0x1B, 0}, + {IV('∼'), 0x1D, 0}, + {IV('≈'), 0x1A, 0}, + {IV('≠'), 0xBD, 0}, + {IV('≡'), 0x11, 0}, + {IV('≤'), 0xB9, 0},// ≤≥ ⩽⩾ + {IV('≥'), 0xBA, 0}, + //{IV(''), 0xBF, 0}, // error + + {IV('⌠'), 0xC0, 0}, + {IV('⌡'), 0xC1, 0}, + + {IV('⎧'), 0x14, 0}, + {IV('⎩'), 0x15, 0}, + {IV('⎫'), 0x16, 0}, + {IV('⎭'), 0x17, 0}, + {IV('⎰'), 0x18, 0}, + {IV('⎱'), 0x19, 0}, + {IV('⎲'), 0x12, 0}, + {IV('⎳'), 0x13, 0}, + + {IV('⏱'), 0x07, 0}, // Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) + {IV('┌'), 0xC9, 0}, + {IV('┐'), 0xCA, 0}, + {IV('└'), 0xCB, 0}, + {IV('┘'), 0xCC, 0}, + {IV('◸'), 0xC3, 0}, // ◿ + {IV('⭠'), 0xC8, 0}, + {IV('⭡'), 0xC5, 0}, + {IV('⭢'), 0xC7, 0}, + {IV('⭣'), 0xC6, 0}, + + + {IV('⯆'), 0xF5, 0}, + {IV('⯇'), 0xF7, 0}, // ⯅ + {IV('⯈'), 0xF6, 0}, + //{IV(''), 0xF8, 0}, // error + //{IV(''), 0xFA, 0}, // error + //{IV(''), 0xFC, 0}, // error + //{IV(''), 0xFD, 0}, // error + //{IV(''), 0xFE, 0}, // error + //{IV(''), 0xFF, 0}, // error + + #elif DISPLAY_CHARSET_HD44780 == CYRILLIC + + #ifdef CONVERT_TO_EXT_ASCII + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + {IV('²'), 0x0E, 0}, // 0x32 if no special symbol in panel font + {IV('³'), 0x0F, 0}, // 0x33 if no special symbol in panel font + + // translate to cp866 codepage + //first ASCII symbols in panel font must be replaced with Marlin special symbols + {IV('Ё'), 0xF0, 0}, // 0401 + {IV('Є'), 0xF2, 0}, // 0404 + {IV('І'), 'I', 0}, // 0406 + {IV('Ї'), 0xF4, 0}, // 0407 + {IV('Ў'), 0xF6, 0}, // 040E + {IV('А'), 0x80, 0}, // 0410 + {IV('Б'), 0x81, 0}, + {IV('В'), 0x82, 0}, + {IV('Г'), 0x83, 0}, + {IV('Д'), 0x84, 0}, + {IV('Е'), 0x85, 0}, + {IV('Ж'), 0x86, 0}, + {IV('З'), 0x87, 0}, + {IV('И'), 0x88, 0}, + {IV('Й'), 0x89, 0}, + {IV('К'), 0x8A, 0}, + {IV('Л'), 0x8B, 0}, + {IV('М'), 0x8C, 0}, + {IV('Н'), 0x8D, 0}, + {IV('О'), 0x8E, 0}, + {IV('П'), 0x8F, 0}, + {IV('Р'), 0x90, 0}, + {IV('С'), 0x91, 0}, + {IV('Т'), 0x92, 0}, + {IV('У'), 0x93, 0}, + {IV('Ф'), 0x94, 0}, + {IV('Х'), 0x95, 0}, + {IV('Ц'), 0x96, 0}, + {IV('Ч'), 0x97, 0}, + {IV('Ш'), 0x98, 0}, + {IV('Щ'), 0x99, 0}, + {IV('Ъ'), 0x9A, 0}, + {IV('Ы'), 0x9B, 0}, + {IV('Ь'), 0x9C, 0}, + {IV('Э'), 0x9D, 0}, + {IV('Ю'), 0x9E, 0}, + {IV('Я'), 0x9F, 0}, + + {IV('а'), 0xA0, 0}, + {IV('б'), 0xA1, 0}, + {IV('в'), 0xA2, 0}, + {IV('г'), 0xA3, 0}, + {IV('д'), 0xA4, 0}, + {IV('е'), 0xA5, 0}, + {IV('ж'), 0xA6, 0}, + {IV('з'), 0xA7, 0}, + {IV('и'), 0xA8, 0}, + {IV('й'), 0xA9, 0}, + {IV('к'), 0xAA, 0}, + {IV('л'), 0xAB, 0}, + {IV('м'), 0xAC, 0}, + {IV('н'), 0xAD, 0}, + {IV('о'), 0xAE, 0}, + {IV('п'), 0xAF, 0}, + {IV('р'), 0xE0, 0}, + {IV('с'), 0xE1, 0}, + {IV('т'), 0xE2, 0}, + {IV('у'), 0xE3, 0}, + {IV('ф'), 0xE4, 0}, + {IV('х'), 0xE5, 0}, + {IV('ц'), 0xE6, 0}, + {IV('ч'), 0xE7, 0}, + {IV('ш'), 0xE8, 0}, + {IV('щ'), 0xE9, 0}, + {IV('ъ'), 0xEA, 0}, + {IV('ы'), 0xEB, 0}, + {IV('ь'), 0xEC, 0}, + {IV('э'), 0xED, 0}, + {IV('ю'), 0xEE, 0}, + {IV('я'), 0xEF, 0}, // 044F + {IV('ё'), 0xF1, 0}, // 0451 + {IV('є'), 0xF3, 0}, // 0454 + {IV('і'), 'i', 0}, // 0456 + {IV('ї'), 0xF5, 0}, // 0457 + {IV('ў'), 0xF7, 0}, // 045E + + #else + + {IV('¢'), 0x5C, 0}, // 00A2 + {IV('£'), 0xCF, 0}, // 00A3 + {IV('°'), 0x01, 0}, // 00B0, Marlin special: '°' LCD_STR_DEGREE (0x09) + + //{IV(''), 0x80, 0}, + //{IV(''), 0x81, 0}, + //{IV(''), 0x82, 0}, + //{IV(''), 0x83, 0}, + //{IV(''), 0x84, 0}, + //{IV(''), 0x85, 0}, + //{IV(''), 0x86, 0}, + //{IV(''), 0x87, 0}, + //{IV(''), 0x88, 0}, + //{IV(''), 0x89, 0}, + //{IV(''), 0x8A, 0}, + //{IV(''), 0x8B, 0}, + //{IV(''), 0x8C, 0}, + //{IV(''), 0x8D, 0}, + //{IV(''), 0x8E, 0}, + //{IV(''), 0x8F, 0}, + + //{IV(''), 0x90, 0}, + //{IV(''), 0x91, 0}, + //{IV(''), 0x92, 0}, + //{IV(''), 0x93, 0}, + //{IV(''), 0x94, 0}, + //{IV(''), 0x95, 0}, + //{IV(''), 0x96, 0}, + //{IV(''), 0x97, 0}, + //{IV(''), 0x98, 0}, + //{IV(''), 0x99, 0}, + //{IV(''), 0x9A, 0}, + //{IV(''), 0x9B, 0}, + //{IV(''), 0x9C, 0}, + //{IV(''), 0x9D, 0}, + //{IV(''), 0x9E, 0}, + //{IV(''), 0x9F, 0}, + + {IV('¼'), 0xF0, 0}, // 00BC + {IV('⅓'), 0xF1, 0}, + {IV('½'), 0xF2, 0}, // 00BD + {IV('¾'), 0xF3, 0}, // 00BE + {IV('¿'), 0xCD, 0}, // 00BF + + {IV('Ё'), 0xA2, 0}, // 0401 + {IV('А'), 'A', 0}, // 0410 + {IV('Б'), 0xA0, 0}, + {IV('В'), 'B', 0}, + {IV('Г'), 0xA1, 0}, + {IV('Д'), 0xE0, 0}, + {IV('Е'), 'E', 0}, + {IV('Ж'), 0xA3, 0}, + {IV('З'), 0xA4, 0}, + {IV('И'), 0xA5, 0}, + {IV('Й'), 0xA6, 0}, + {IV('К'), 'K', 0}, + {IV('Л'), 0xA7, 0}, + {IV('М'), 'M', 0}, + {IV('Н'), 'H', 0}, + {IV('О'), 'O', 0}, + {IV('П'), 0xA8, 0}, + {IV('Р'), 'P', 0}, + {IV('С'), 'C', 0}, + {IV('Т'), 'T', 0}, + {IV('У'), 0xA9, 0}, + {IV('Ф'), 0xAA, 0}, + {IV('Х'), 'X', 0}, + {IV('Ц'), 0xE1, 0}, + {IV('Ч'), 0xAB, 0}, + {IV('Ш'), 0xAC, 0}, + {IV('Щ'), 0xE2, 0}, + {IV('Ъ'), 0xAD, 0}, + {IV('Ы'), 0xAE, 0}, + {IV('Ь'), 'b', 0}, + {IV('Э'), 0xAF, 0}, + {IV('Ю'), 0xB0, 0}, + {IV('Я'), 0xB1, 0}, + {IV('а'), 'a', 0}, + + {IV('б'), 0xB2, 0}, + {IV('в'), 0xB3, 0}, + {IV('г'), 0xB4, 0}, + {IV('д'), 0xE3, 0}, + {IV('е'), 'e', 0}, + {IV('ж'), 0xB6, 0}, + {IV('з'), 0xB7, 0}, + {IV('и'), 0xB8, 0}, + {IV('й'), 0xB9, 0}, + {IV('к'), 0xBA, 0}, + {IV('л'), 0xBB, 0}, + {IV('м'), 0xBC, 0}, + {IV('н'), 0xBD, 0}, + {IV('о'), 'o', 0}, + {IV('п'), 0xBE, 0}, + {IV('р'), 'p', 0}, + {IV('с'), 'c', 0}, + {IV('т'), 0xBF, 0}, + + {IV('у'), 'y', 0}, + {IV('ф'), 0xE4, 0}, + {IV('х'), 'x', 0}, + {IV('ц'), 0xE5, 0}, + {IV('ч'), 0xC0, 0}, + {IV('ш'), 0xC1, 0}, + {IV('щ'), 0xE6, 0}, + {IV('ъ'), 0xC2, 0}, + {IV('ы'), 0xC3, 0}, + {IV('ь'), 0xC4, 0}, + {IV('э'), 0xC5, 0}, + {IV('ю'), 0xC6, 0}, + {IV('я'), 0xC7, 0}, // 044F + {IV('ё'), 0xB5, 0}, // 0451 + //{IV(''), 0xC8, 0}, + //{IV(''), 0xC9, 0}, + //{IV(''), 0xCA, 0}, + //{IV(''), 0xCB, 0}, + //{IV(''), 0xCC, 0}, + //{IV(''), 0xCD, 0}, + //{IV(''), 0xCE, 0}, + + //{IV(''), 0xD0, 0}, + //{IV(''), 0xD1, 0}, + //{IV(''), 0xD2, 0}, + //{IV(''), 0xD3, 0}, + //{IV(''), 0xD4, 0}, + //{IV(''), 0xD5, 0}, + //{IV(''), 0xD6, 0}, + //{IV(''), 0xD7, 0}, + //{IV(''), 0xD8, 0}, + //{IV(''), 0xDB, 0}, + //{IV(''), 0xDC, 0}, + //{IV(''), 0xDD, 0}, + //{IV(''), 0xDE, 0}, + //{IV(''), 0xDF, 0}, + + //{IV(''), 0xE7, 0}, + //{IV(''), 0xE8, 0}, + //{IV(''), 0xE9, 0}, + //{IV(''), 0xEA, 0}, + //{IV(''), 0xEB, 0}, + //{IV(''), 0xEC, 0}, + //{IV(''), 0xED, 0}, + //{IV(''), 0xEE, 0}, + //{IV(''), 0xEF, 0}, + + //{IV(''), 0xF4, 0}, + //{IV(''), 0xF5, 0}, + //{IV(''), 0xF6, 0}, + //{IV(''), 0xF7, 0}, + //{IV(''), 0xF8, 0}, + //{IV(''), 0xF9, 0}, + //{IV(''), 0xFA, 0}, + //{IV(''), 0xFB, 0}, + //{IV(''), 0xFC, 0}, + //{IV(''), 0xFD, 0}, + //{IV(''), 0xFE, 0}, + //{IV(''), 0xFF, 0}, + + {IV('↑'), 0xD9, 0}, // 2191 ←↑→↓ + {IV('↓'), 0xDA, 0}, // 2193 + + #endif + + #endif +}; + +// the plain ASCII replacement for various char +static const TFTGLCD_charmap_t g_TFTGLCD_charmap_common[] PROGMEM = { + {IV('¡'), 'i', 0}, // A1 + {IV('¢'), 'c', 0}, // A2 + {IV('°'), 0x09, 0}, // B0 Marlin special: '°' LCD_STR_DEGREE (0x09) + + #ifndef CONVERT_TO_EXT_ASCII //this time CONVERT_TO_EXT_ASCII works only with en, ru and uk languages + + // map WESTERN code to the plain ASCII + {IV('Á'), 'A', 0}, // C1 + {IV('Â'), 'A', 0}, // C2 + {IV('Ã'), 'A', 0}, // C3 + {IV('Ä'), 'A', 0}, // C4 + {IV('Å'), 'A', 0}, // C5 + {IV('Æ'), 'A', 'E'}, // C6 + {IV('Ç'), 'C', 0}, // C7 + {IV('È'), 'E', 0}, // C8 + {IV('É'), 'E', 0}, // C9 + {IV('Í'), 'I', 0}, // CD + {IV('Ñ'), 'N', 0}, // D1 + {IV('Õ'), 'O', 0}, // D5 + {IV('Ö'), 'O', 0}, // D6 + {IV('×'), 'x', 0}, // D7 + {IV('Ü'), 'U', 0}, // DC + {IV('Ý'), 'Y', 0}, // DD + {IV('à'), 'a', 0}, // E0 + {IV('á'), 'a', 0}, + {IV('â'), 'a', 0}, + {IV('ã'), 'a', 0}, + {IV('ä'), 'a', 0}, + {IV('å'), 'a', 0}, + {IV('æ'), 'a', 'e'}, + {IV('ç'), 'c', 0}, + {IV('è'), 'e', 0}, // 00E8 + {IV('é'), 'e', 0}, + {IV('ê'), 'e', 0}, + {IV('ë'), 'e', 0}, + {IV('ì'), 'i', 0}, // 00EC + {IV('í'), 'i', 0}, + {IV('î'), 'i', 0}, + {IV('ï'), 'i', 0}, // 00EF + + {IV('ñ'), 'n', 0}, // 00F1 + {IV('ò'), 'o', 0}, + {IV('ó'), 'o', 0}, + {IV('ô'), 'o', 0}, + {IV('õ'), 'o', 0}, + {IV('ö'), 'o', 0}, + //{IV('÷'), 0xB8, 0}, + {IV('ø'), 'o', 0}, + {IV('ù'), 'u', 0}, + {IV('ú'), 'u', 0}, + {IV('û'), 'u', 0}, + {IV('ü'), 'u', 0}, // FC + {IV('ý'), 'y', 0}, // FD + {IV('ÿ'), 'y', 0}, // FF + + {IV('Ą'), 'A', 0}, // 0104 + {IV('ą'), 'a', 0}, // 0105 + {IV('Ć'), 'C', 0}, // 0106 + {IV('ć'), 'c', 0}, // 0107 + {IV('Č'), 'C', 0}, // 010C + {IV('č'), 'c', 0}, // 010D + {IV('Ď'), 'D', 0}, // 010E + {IV('ď'), 'd', 0}, // 010F + {IV('đ'), 'd', 0}, // 0111 + {IV('ę'), 'e', 0}, // 0119 + {IV('ğ'), 'g', 0}, // 011F + {IV('İ'), 'I', 0}, // 0130 + {IV('ı'), 'i', 0}, // 0131 + + {IV('Ł'), 'L', 0}, // 0141 + {IV('ł'), 'l', 0}, // 0142 + {IV('Ń'), 'N', 0}, // 0143 + {IV('ń'), 'n', 0}, // 0144 + {IV('ň'), 'n', 0}, // 0148 + + {IV('ř'), 'r', 0}, // 0159 + {IV('Ś'), 'S', 0}, // 015A + {IV('ś'), 's', 0}, // 015B + {IV('ş'), 's', 0}, // 015F + {IV('Š'), 'S', 0}, // 0160 + {IV('š'), 's', 0}, // 0161 + {IV('ť'), 't', 0}, // 0165 + {IV('ů'), 'u', 0}, // 016F + {IV('ż'), 'z', 0}, // 017C + {IV('Ž'), 'Z', 0}, // 017D + {IV('ž'), 'z', 0}, // 017E + {IV('ƒ'), 'f', 0}, // 0192 + + {IV('ˣ'), 'x', 0}, // 02E3 + + {IV('΄'), '\'', 0}, // 0384 + {IV('΅'), '\'', 0}, // 0385 + {IV('Ά'), 'A', 0}, // 0386 + {IV('·'), '.', 0}, // 0387 + {IV('Έ'), 'E', 0}, // 0388 + {IV('Ή'), 'H', 0}, // 0389 + {IV('Ί'), 'I', 0}, // 038A + {IV('Ό'), 'O', 0}, // 038C + {IV('Ύ'), 'Y', 0}, // 038E + {IV('Ώ'), 'O', 0}, // 038F + {IV('ΐ'), 'i', 0}, // 0390 + {IV('Α'), 'A', 0}, // 0391 + {IV('Β'), 'B', 0}, // 0392 + {IV('Γ'), 'T', 0}, // 0393, Gamma + {IV('Δ'), '4', 0}, // 0394, Delta, ◿ + {IV('Ε'), 'E', 0}, // 0395 + {IV('Ζ'), 'Z', 0}, // 0396 + {IV('Η'), 'H', 0}, // 0397 + {IV('Θ'), '0', 0}, // 0398, Theta + {IV('Ι'), 'I', 0}, // 0399 + {IV('Κ'), 'K', 0}, // 039A + {IV('Λ'), '^', 0}, // 039B, Lambda + {IV('Μ'), 'M', 0}, // 039C + {IV('Ν'), 'N', 0}, // 039D + {IV('Ξ'), '3', 0}, // 039E, Xi + {IV('Ο'), 'O', 0}, // 039F + {IV('Π'), 'n', 0}, // 03A0, Pi + {IV('Ρ'), 'P', 0}, // 03A1 + {IV('Σ'), 'E', 0}, // 03A3, Sigma + {IV('Τ'), 'T', 0}, // 03A4 + {IV('Υ'), 'Y', 0}, // 03A5, Upsilon + {IV('Φ'), 'p', 0}, // 03A6, Phi + {IV('Χ'), 'X', 0}, // 03A7 + {IV('Ψ'), 'P', 0}, // 03A8, Psi + {IV('Ω'), 'O', 0}, // 03A9, Omega + {IV('Ϊ'), 'I', 0}, // 03AA + {IV('Ϋ'), 'Y', 0}, // 03AB + {IV('ά'), 'a', 0}, // 03AC + {IV('έ'), 'e', 0}, // 03AD + {IV('ή'), 'n', 0}, // 03AE + {IV('ί'), 'i', 0}, // 03AF + {IV('ΰ'), 'v', 0}, // 03B0 + {IV('α'), 'a', 0}, // 03B1, alpha + {IV('β'), 'B', 0}, // 03B2, beta + {IV('γ'), 'v', 0}, // 03B3, gamma + {IV('δ'), 'd', 0}, // 03B4, delta + {IV('ε'), 'e', 0}, // 03B5, epsilon + {IV('ζ'), 'Z', 0}, // 03B6, zeta + {IV('η'), 'n', 0}, // 03B7, eta + {IV('θ'), '0', 0}, // 03B8, theta + {IV('ι'), 'i', 0}, // 03B9, lota + {IV('κ'), 'k', 0}, // 03BA, kappa + {IV('λ'), 'L', 0}, // 03BB, lambda + {IV('μ'), 'u', 0}, // 03BC, mu + {IV('ν'), 'v', 0}, // 03BD, nu + {IV('ξ'), 'e', 0}, // 03BE, xi + {IV('ο'), 'o', 0}, // 03BF + {IV('π'), 'n', 0}, // 03C0, pi + {IV('ρ'), 'p', 0}, // 03C1, rho + {IV('ς'), 'c', 0}, // 03C2 + {IV('σ'), 'o', 0}, // 03C3, sigma + {IV('τ'), 't', 0}, // 03C4, tau + {IV('υ'), 'v', 0}, // 03C5, upsilon + {IV('φ'), 'p', 0}, // 03C6 + {IV('χ'), 'X', 0}, // 03C7, chi + {IV('ψ'), 'W', 0}, // 03C8, psi + {IV('ω'), 'w', 0}, // 03C9, omega + {IV('ϊ'), 'i', 0}, // 03CA + {IV('ϋ'), 'v', 0}, // 03CB + {IV('ό'), 'o', 0}, // 03CC + {IV('ύ'), 'v', 0}, // 03CD + {IV('ώ'), 'w', 0}, // 03CE + + // map CYRILLIC code to the plain ASCII + {IV('А'), 'A', 0}, // 0410 + {IV('Б'), 'b', 0}, // 0411 + {IV('В'), 'B', 0}, // 0412 + {IV('Г'), 'T', 0}, // 0413 + {IV('Д'), 'Q', 0}, // 0414 + {IV('Е'), 'E', 0}, // 0415 + {IV('Ж'), '*', 0}, // 0416 + {IV('З'), 'E', 0}, // 0417 + {IV('И'), 'N', 0}, // 0418 + {IV('Й'), 'N', 0}, // 0419 + {IV('К'), 'K', 0}, // 041A + {IV('Л'), 'T', 0}, // 041B + {IV('М'), 'M', 0}, // 041C + {IV('Н'), 'H', 0}, // 041D + {IV('О'), 'O', 0}, // 041E + {IV('П'), 'n', 0}, // 041F + {IV('Р'), 'P', 0}, // 0420 + {IV('С'), 'C', 0}, // 0421 + {IV('Т'), 'T', 0}, // 0422 + {IV('У'), 'Y', 0}, + {IV('Ф'), 'o', 0}, + {IV('Х'), 'X', 0}, + {IV('Ц'), 'U', 0}, + {IV('Ч'), 'y', 0}, + {IV('Ш'), 'W', 0}, + {IV('Щ'), 'W', 0}, + {IV('Ъ'), 'b', 0}, + {IV('Ы'), 'b', '|'}, + {IV('Ь'), 'b'}, + {IV('Э'), 'e'}, + {IV('Ю'), '|', 'O'}, + {IV('Я'), '9', '|'}, // 042F + + {IV('а'), 'a', 0}, // 0430 + {IV('б'), '6', 0}, // 0431 + {IV('в'), 'B', 0}, // 0432, + {IV('г'), 'r', 0}, // 0433 + {IV('д'), 'a', 0}, // 0434, + {IV('е'), 'e', 0}, // 0435 + {IV('ж'), '*', 0}, // 0436 + {IV('з'), 'e', 0}, // 0437, + {IV('и'), 'u', 0}, // 0438 + {IV('й'), 'u', 0}, // 0439, + {IV('к'), 'k', 0}, // 043A + {IV('л'), 'n', 0}, + {IV('м'), 'm', 0}, + {IV('н'), 'H', 0}, + {IV('о'), 'o', 0}, + {IV('п'), 'n', 0}, + {IV('р'), 'p', 0}, + {IV('с'), 'c', 0}, + {IV('т'), 't', 0}, + {IV('у'), 'y', 0}, + {IV('ф'), 'q', 'p'}, + {IV('х'), 'x', 0}, + {IV('ц'), 'u', 0}, + {IV('ч'), 'y', 0}, + {IV('ш'), 'w', 0}, + {IV('щ'), 'w', 0}, + {IV('ъ'), 'b', 0}, + {IV('ы'), 'b', '|'}, + {IV('ь'), 'b', 0}, + {IV('э'), 'e', 0}, + {IV('ю'), '|', 'o'}, + {IV('я'), 'g', 0}, // 044F + + #endif + + {IV('•'), '.', 0}, // 2022 · + {IV('℞'), 'P', 'x'}, // 211E ℞ Pt ASCII 158 + {IV('™'), 'T', 'M'}, // 2122 + {IV('←'), '<', '-'}, // 2190 + {IV('→'), '-', '>'}, // 2192, Marlin special: '⮈⮉⮊⮋➤→⏵➟➠➡' LCD_STR_ARROW_RIGHT (0x03) + //{IV('↰'), '<', 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↰'), 0x03, 0}, // 21B0, Marlin special: '⮥⮭⮉⇧↑↰⤴' LCD_STR_UPLEVEL (0x04) + {IV('↻'), 0x04, 0}, // 21BB Marlin special: '↻↺⟳⟲' LCD_STR_REFRESH (0x01) + {IV('∼'), '~', 0}, // 223C + {IV('≈'), '~', '='}, // 2248 + {IV('≠'), '!', '='}, // 2260 + {IV('≡'), '=', 0}, // 2261 + {IV('≤'), '<', '='},// 2264, ≤≥ ⩽⩾ + {IV('≥'), '>', '='}, // 2265 + {IV('⏱'), 0x07, 0}, // 23F1, Marlin special: '🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 ⌚⌛⏰⏱⏳⧖⧗' LCD_STR_CLOCK (0x05) + + {IV('゠'), '=', 0}, // 30A0 + + // ⏰⏱⏲⏳◴◵◶◷ + // ⏻⏼♁♂ + //{IV(''), 0x00, 0}, // Marlin special: '' LCD_STR_BEDTEMP (0x07) + {IV('🌡'), 0x02, 0}, // D83CDF21 Marlin special: '🌡' LCD_STR_THERMOMETER (0x08) + {IV('📂'), 0x05, 0}, // D83DDCC2 Marlin special: '📁📂' LCD_STR_FOLDER (0x02) + //{IV(''), 0x06, 0}, // Marlin special: '' LCD_STR_FEEDRATE (0x06) +}; + +/* return v1 - v2 */ +static int TFTGLCD_charmap_compare(TFTGLCD_charmap_t * v1, TFTGLCD_charmap_t * v2) { + return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0; +} + +static int pf_bsearch_cb_comp_hd4map_pgm(void *userdata, size_t idx, void * data_pin) { + TFTGLCD_charmap_t localval; + TFTGLCD_charmap_t *p_TFTGLCD_charmap = (TFTGLCD_charmap_t *)userdata; + memcpy_P(&localval, p_TFTGLCD_charmap + idx, sizeof(localval)); + return TFTGLCD_charmap_compare(&localval, (TFTGLCD_charmap_t *)data_pin); +} + +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { lcd.setCursor(col, row); } + +void lcd_put_int(const int i) { + const char* str = i16tostr3left(i); + while (*str) lcd.write(*str++); +} + +// return < 0 on error +// return the advanced cols +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + + // find the HD44780 internal ROM first + int ret; + size_t idx = 0; + TFTGLCD_charmap_t pinval; + TFTGLCD_charmap_t *copy_address = nullptr; + pinval.uchar = c; + pinval.idx = -1; + + if (max_length < 1) return 0; + + if (c < 128) { + lcd.write((uint8_t)c); + return 1; + } + copy_address = nullptr; + ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) { + copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_device + idx); + } + else { + ret = pf_bsearch_r((void *)g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret >= 0) copy_address = (TFTGLCD_charmap_t *)(g_TFTGLCD_charmap_common + idx); + } + + if (ret >= 0) { + TFTGLCD_charmap_t localval; + // found + memcpy_P(&localval, copy_address, sizeof(localval)); + lcd.write(localval.idx); + if (max_length >= 2 && localval.idx2 > 0) { + lcd.write(localval.idx2); + return 2; + } + return 1; + } + + // Not found, print '?' instead + lcd.write((uint8_t)'?'); + return 1; +} + +/** + * @brief Draw a UTF-8 string + * + * @param utf8_str : the UTF-8 string + * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM) + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the number of pixels advanced + * + * Draw a UTF-8 string + */ +static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) { + pixel_len_t ret = 0; + uint8_t *p = (uint8_t *)utf8_str; + while (ret < max_length) { + wchar_t ch = 0; + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + ret += lcd_put_wchar_max(ch, max_length - ret); + } + return (int)ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length); +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length); +} + +#if ENABLED(DEBUG_LCDPRINT) + + int test_TFTGLCD_charmap(TFTGLCD_charmap_t *data, size_t size, char *name, char flg_show_contents) { + int ret; + size_t idx = 0; + TFTGLCD_charmap_t preval = {0, 0, 0}; + TFTGLCD_charmap_t pinval = {0, 0, 0}; + char flg_error = 0; + + int i; + + TRACE("Test %s\n", name); + + for (i = 0; i < size; i ++) { + memcpy_P(&pinval, &(data[i]), sizeof(pinval)); + + if (flg_show_contents) { + #if 1 + TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #else + TRACE("[% 4d]", i); + TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar); + TRACE("0x%02X,", (unsigned int)(pinval.idx)); + TRACE("0x%02X,", (unsigned int)(pinval.idx2)); + TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR")); + #endif + } + if (preval.uchar >= pinval.uchar) { + flg_error = 1; + //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + memcpy(&preval, &pinval, sizeof(pinval)); + + ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_hd4map_pgm, (void *)&pinval, &idx); + if (ret < 0) { + flg_error = 1; + TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + if (idx != i) { + flg_error = 1; + TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar); + //return -1; + } + } + if (flg_error) { + TRACE("\nError: in array %s\n\n", name); + return -1; + } + TRACE("\nPASS array %s\n\n", name); + return 0; + } + + int test_TFTGLCD_charmap_all(void) { + int flg_error = 0; + if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 0) < 0) { + flg_error = 1; + test_TFTGLCD_charmap(g_TFTGLCD_charmap_device, COUNT(g_TFTGLCD_charmap_device), "g_TFTGLCD_charmap_device", 1); + } + if (test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 0) < 0) { + flg_error = 1; + test_TFTGLCD_charmap(g_TFTGLCD_charmap_common, COUNT(g_TFTGLCD_charmap_common), "g_TFTGLCD_charmap_common", 1); + } + if (flg_error) { + TRACE("\nFAILED in hd44780 tests!\n"); + return -1; + } + TRACE("\nPASS in hd44780 tests.\n"); + return 0; + } + +#endif // DEBUG_LCDPRINT + +#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp new file mode 100644 index 00000000..c02a5536 --- /dev/null +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.cpp @@ -0,0 +1,964 @@ +/** + * 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 IS_TFTGLCD_PANEL + +/** + * ultralcd_TFTGLCD.cpp + * + * Implementation of the LCD display routines for a TFT GLCD displays with external controller. + * This display looks as a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER but has good text font + * and supports color output. + */ + +#if NONE(__AVR__, TARGET_LPC1768, __STM32F1__, STM32F4xx) + #warning "Selected platform not yet tested. Please contribute your good pin mappings." +#endif + +#if ENABLED(TFTGLCD_PANEL_SPI) + #include +#else + #include +#endif + +#include "ultralcd_TFTGLCD.h" +#include "../ultralcd.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 + +TFTGLCD lcd; + +#define ICON_LOGO B00000001 +#define ICON_TEMP1 B00000010 //hotend 1 +#define ICON_TEMP2 B00000100 //hotend 2 +#define ICON_TEMP3 B00001000 //hotend 3 +#define ICON_BED B00010000 +#define ICON_FAN B00100000 +#define ICON_HOT B01000000 //when any T > 50deg +#define PIC_MASK 0x7F + +// LEDs not used, for compatibility with Smoothieware +#define LED_HOTEND_ON B00000001 +#define LED_BED_ON B00000010 +#define LED_FAN_ON B00000100 +#define LED_HOT B00001000 +#define LED_MASK 0x0F + +#define FBSIZE (LCD_WIDTH * LCD_HEIGHT + 2) +#define MIDDLE_Y ((LCD_HEIGHT - 1) / 2) + +// Markers for change line colors +#define COLOR_EDIT '#' +#define COLOR_ERROR '!' + +#ifdef CONVERT_TO_EXT_ASCII //use standart pseudographic symbols in ASCII table + #define LR 179 //vertical line + #define TRC 191 //top right corner + #define BLC 192 //bottom left corner + #define GL 196 //horizontal line + #define BRC 217 //bottom right corner, should be replaced to 12 for some languages + #define TLC 218 //top left corner, should be replaced to 13 for some languages +#else //next symbols must be present in panel font + #define LR 8 //equal to 179 + #define TRC 9 //equal to 191 + #define BLC 10 //equal to 192 + #define GL 11 //equal to 196 + #define BRC 12 //equal to 217 + #define TLC 13 //equal to 218 +#endif + +#define Marlin 0x01 + +enum Commands { // based on Smoothieware commands + GET_SPI_DATA = 0, + READ_BUTTONS, // read buttons + READ_ENCODER, // read encoder + LCD_WRITE, // write all screen to LCD + BUZZER, // beep buzzer + CONTRAST, // set contrast (brightnes) + // Other commands... 0xE0 thru 0xFF + GET_LCD_ROW = 0xE0, // for detect panel + GET_LCD_COL, // reserved for compatibility with Smoothieware, not used + LCD_PUT, // write one line to LCD + CLR_SCREEN, + INIT_SCREEN = 0xFE // clear panel buffer +}; + +static unsigned char framebuffer[FBSIZE]; +static unsigned char *fb; +static uint8_t cour_line; +static uint8_t picBits, ledBits, hotBits; +static uint8_t PanelDetected = 0; + +// Different platforms use different SPI methods +#if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + #define SPI_SEND_ONE(V) SPI.transfer(V); + #define SPI_SEND_TWO(V) SPI.transfer16(V); +#elif defined(STM32F4xx) + #define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE); + #define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE); +#elif defined(ARDUINO_ARCH_ESP32) + #define SPI_SEND_ONE(V) SPI.write(V); + #define SPI_SEND_TWO(V) SPI.write16(V); +#endif + +#if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) + #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L); +#elif defined(STM32F4xx) + #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE); +#elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32) + #define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0) +#endif + +// Constructor +TFTGLCD::TFTGLCD() {} + +// Clear local buffer +void TFTGLCD::clear_buffer() { + memset(&framebuffer[0], ' ', FBSIZE - 2); + framebuffer[FBSIZE - 1] = framebuffer[FBSIZE - 2] = 0; + picBits = ledBits = 0; +} + +// Clear panel's screen +void TFTGLCD::clr_screen() { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(CLR_SCREEN); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address + Wire.write(CLR_SCREEN); + Wire.endTransmission(); //transmit data + #endif +} + +// Set new text cursor position +void TFTGLCD::setCursor(uint8_t col, uint8_t row) { + fb = &framebuffer[0] + col + row * LCD_WIDTH; + cour_line = row; +} + +// Send char to buffer +void TFTGLCD::write(char c) { + *fb++ = c; +} + +// Send text line to buffer +void TFTGLCD::print(const char *line) { + while (*line) *fb++ = *line++; +} + +// For menu +void TFTGLCD::print_line() { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(LCD_PUT); + SPI_SEND_ONE(cour_line); + SPI_SEND_SOME(framebuffer, LCD_WIDTH, cour_line * LCD_WIDTH); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); //set I2C device address + Wire.write(LCD_PUT); + Wire.write(cour_line); + Wire.write(&framebuffer[cour_line * LCD_WIDTH], LCD_WIDTH); //transfer 1 line to txBuffer + Wire.endTransmission(); //transmit data + safe_delay(1); + #endif +} + +void TFTGLCD::print_screen(){ + if (!PanelDetected) return; + framebuffer[FBSIZE - 2] = picBits & PIC_MASK; + framebuffer[FBSIZE - 1] = ledBits; + #if ENABLED(TFTGLCD_PANEL_SPI) + // Send all framebuffer to panel + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(LCD_WRITE); + SPI_SEND_SOME(framebuffer, FBSIZE, 0); + WRITE(TFTGLCD_CS, HIGH); + #else + uint8_t r; + // Send framebuffer to panel by line + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + // First line + Wire.write(LCD_WRITE); + Wire.write(&framebuffer[0], LCD_WIDTH); + Wire.endTransmission(); + for (r = 1; r < (LCD_HEIGHT - 1); r++) { + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH); + Wire.endTransmission(); + } + // Last line + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(&framebuffer[r * LCD_WIDTH], LCD_WIDTH); + Wire.write(&framebuffer[FBSIZE - 2], 2); + Wire.endTransmission(); + #endif +} + +void TFTGLCD::setContrast(uint16_t contrast) { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(CONTRAST); + SPI_SEND_ONE((uint8_t)contrast); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(CONTRAST); + Wire.write((uint8_t)contrast); + Wire.endTransmission(); + #endif +} + +extern volatile int8_t encoderDiff; + +// Read buttons and encoder states +uint8_t MarlinUI::read_slow_buttons(void) { + if (!PanelDetected) return 0; + #if ENABLED(TFTGLCD_PANEL_SPI) + uint8_t b = 0; + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(READ_ENCODER); + #ifndef STM32F4xx + WRITE(TFTGLCD_CS, LOW); // for delay + #endif + encoderDiff += SPI_SEND_ONE(READ_BUTTONS); + #ifndef STM32F4xx + WRITE(TFTGLCD_CS, LOW); // for delay + WRITE(TFTGLCD_CS, LOW); + #endif + b = SPI_SEND_ONE(GET_SPI_DATA); + WRITE(TFTGLCD_CS, HIGH); + return b; + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(READ_ENCODER); + Wire.endTransmission(); + #ifdef __AVR__ + Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); + #elif defined(__STM32F1__) + Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); + #elif EITHER(STM32F4xx, TARGET_LPC1768) + Wire.requestFrom(LCD_I2C_ADDRESS, 2); + #endif + encoderDiff += Wire.read(); + return Wire.read(); //buttons + #endif +} + +// Duration in ms, freq in Hz +void MarlinUI::buzz(const long duration, const uint16_t freq) { + if (!PanelDetected) return; + #if ENABLED(TFTGLCD_PANEL_SPI) + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(BUZZER); + SPI_SEND_TWO((uint16_t)duration); + SPI_SEND_TWO(freq); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write(BUZZER); + Wire.write((uint8_t)(duration >> 8)); + Wire.write((uint8_t)duration); + Wire.write((uint8_t)(freq >> 8)); + Wire.write((uint8_t)freq); + Wire.endTransmission(); + #endif +} + +void MarlinUI::init_lcd() { + uint8_t t; + lcd.clear_buffer(); + t = 0; + #if ENABLED(TFTGLCD_PANEL_SPI) + // SPI speed must be less 10MHz + SET_OUTPUT(TFTGLCD_CS); + WRITE(TFTGLCD_CS, HIGH); + spiInit(TERN(__STM32F1__, SPI_QUARTER_SPEED, SPI_FULL_SPEED)); + WRITE(TFTGLCD_CS, LOW); + SPI_SEND_ONE(GET_LCD_ROW); + t = SPI_SEND_ONE(GET_SPI_DATA); + #else + #ifdef TARGET_LPC1768 + Wire.begin(); //init twi/I2C + #else + Wire.begin((uint8_t)LCD_I2C_ADDRESS); //init twi/I2C + #endif + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write((uint8_t)GET_LCD_ROW); // put command to buffer + Wire.endTransmission(); // send buffer + #ifdef __AVR__ + Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 1, 0, 0, 1); + #elif ANY(__STM32F1__, STM32F4xx, TARGET_LPC1768) + Wire.requestFrom(LCD_I2C_ADDRESS, 1); + #endif + t = (uint8_t)Wire.read(); + #endif + + if (t == LCD_HEIGHT) { + PanelDetected = 1; + #if ENABLED(TFTGLCD_PANEL_SPI) + SPI_SEND_ONE(INIT_SCREEN); + SPI_SEND_ONE(Marlin); + WRITE(TFTGLCD_CS, HIGH); + #else + Wire.beginTransmission((uint8_t)LCD_I2C_ADDRESS); + Wire.write((uint8_t)INIT_SCREEN); + Wire.write(Marlin); + Wire.endTransmission(); + #endif + } + else + PanelDetected = 0; + safe_delay(100); +} + +bool MarlinUI::detected() { + return PanelDetected; +} + +void MarlinUI::clear_lcd() { + if (!PanelDetected) return; + lcd.clr_screen(); + lcd.clear_buffer(); +} + +int16_t MarlinUI::contrast; // Initialized by settings.load() + +void MarlinUI::set_contrast(const int16_t value) { + contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX); + lcd.setContrast(contrast); +} + +static void center_text_P(PGM_P pstart, uint8_t y) { + uint8_t len = utf8_strlen_P(pstart); + if (len < LCD_WIDTH) + lcd.setCursor((LCD_WIDTH - len) / 2, y); + else + lcd.setCursor(0, y); + lcd_put_u8str_P(pstart); +} + +#if ENABLED(SHOW_BOOTSCREEN) + + void MarlinUI::show_bootscreen() { + if (!PanelDetected) return; + // + // Show the Marlin logo, splash line1, and splash line 2 + // + uint8_t indent = (LCD_WIDTH - 8) / 2; + // symbols 217 (bottom right corner) and 218 (top left corner) are using for letters in some languages + // and they should be moved to begining ASCII table as spetial symbols + lcd.setCursor(indent, 0); lcd.write(TLC); lcd_put_u8str_P(PSTR("------")); lcd.write(TRC); + lcd.setCursor(indent, 1); lcd.write(LR); lcd_put_u8str_P(PSTR("Marlin")); lcd.write(LR); + lcd.setCursor(indent, 2); lcd.write(BLC); lcd_put_u8str_P(PSTR("------")); lcd.write(BRC); + center_text_P(PSTR(SHORT_BUILD_VERSION), 3); + center_text_P(PSTR(MARLIN_WEBSITE_URL), 4); + picBits = ICON_LOGO; + lcd.print_screen(); + safe_delay(1500); + } + +#endif // SHOW_BOOTSCREEN + +void MarlinUI::draw_kill_screen() { + if (!PanelDetected) return; + lcd.clear_buffer(); + lcd.setCursor(0, 3); lcd.write(COLOR_ERROR); + lcd.setCursor((LCD_WIDTH - utf8_strlen(status_message)) / 2 + 1, 3); + lcd_put_u8str(status_message); + center_text_P(GET_TEXT(MSG_HALTED), 5); + center_text_P(GET_TEXT(MSG_PLEASE_RESET), 6); + lcd.print_screen(); +} + +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + lcd.write('X' + uint8_t(axis)); + if (blink) + lcd.print(value); + else { + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd.write(c <= '.' ? c : '?'); + else { + #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + #endif + lcd_put_u8str(value); + } + } +} + +FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *prefix, const bool blink) { + uint8_t pic_hot_bits; + #if HAS_HEATED_BED + const bool isBed = heater_id < 0; + const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)); + const float t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + #else + const float t1 = thermalManager.degHotend(heater_id); + const float t2 = thermalManager.degTargetHotend(heater_id); + #endif + + #if HOTENDS < 2 + if (heater_id == H_E0) { + lcd.setCursor(2, 5); lcd.print(prefix); //HE + lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(1, 7); + } + else { + lcd.setCursor(6, 5); lcd.print(prefix); //BED + lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(6, 7); + } + #else + if (heater_id > H_BED) { + lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); //HE1 or HE2 or HE3 + lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(heater_id * 4, 7); + } + else { + lcd.setCursor(13, 5); lcd.print(prefix); //BED + lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(13, 7); + } + #endif // HOTENDS <= 1 + + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #else + if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { + lcd.write(' '); + if (t2 >= 10) lcd.write(' '); + if (t2 >= 100) lcd.write(' '); + } + else + #endif // !HEATER_IDLE_HANDLER + lcd.print(i16tostr3rj(t2 + 0.5)); + + switch (heater_id) { + case H_BED: pic_hot_bits = ICON_BED; break; + case H_E0: pic_hot_bits = ICON_TEMP1; break; + case H_E1: pic_hot_bits = ICON_TEMP2; break; + case H_E2: pic_hot_bits = ICON_TEMP3; + default: break; + } + + if (t2) picBits |= pic_hot_bits; + else picBits &= ~pic_hot_bits; + + if (t1 > 50) hotBits |= pic_hot_bits; + else hotBits &= ~pic_hot_bits; + + if (hotBits) picBits |= ICON_HOT; + else picBits &= ~ICON_HOT; +} + +#if HAS_PRINT_PROGRESS + + FORCE_INLINE void _draw_print_progress() { + if (!PanelDetected) return; + const uint8_t progress = ui._get_progress(); + #if ENABLED(SDSUPPORT) + lcd_put_u8str_P(PSTR("SD")); + #elif ENABLED(LCD_SET_PROGRESS_MANUALLY) + lcd_put_u8str_P(PSTR("P:")); + #endif + if (progress) + lcd.print(ui8tostr3rj(progress)); + else + lcd_put_u8str_P(PSTR("---")); + lcd.write('%'); + } + +#endif // HAS_PRINT_PROGRESS + +#if ENABLED(LCD_PROGRESS_BAR) + + void MarlinUI::draw_progress_bar(const uint8_t percent) { + if (!PanelDetected) return; + if (fb == &framebuffer[0] + LCD_WIDTH * 2) { // For status screen + lcd.write('%'); lcd.write(percent); + } + else { // For progress bar test + lcd.setCursor(LCD_WIDTH / 2 - 2, MIDDLE_Y); + lcd.print(i16tostr3rj(percent)); lcd.write('%'); + lcd.print_line(); + lcd.setCursor(0, MIDDLE_Y + 1); + lcd.write('%'); lcd.write(percent); + lcd.print_line(); + } + } + +#endif + +void MarlinUI::draw_status_message(const bool blink) { + if (!PanelDetected) return; + lcd.setCursor(0, 3); + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + + // Alternate Status message and Filament display + if (ELAPSED(millis(), next_filament_display)) { + lcd_put_u8str_P(PSTR("Dia ")); + lcd.print(ftostr12ns(filament_width_meas)); + lcd_put_u8str_P(PSTR(" V")); + lcd.print(i16tostr3rj(100.0 * ( + parser.volumetric_enabled + ? planner.volumetric_area_nominal / planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + : planner.volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + ) + )); + lcd.write('%'); + return; + } + + #endif // FILAMENT_LCD_DISPLAY && SDSUPPORT + + // Get the UTF8 character count of the string + uint8_t slen = utf8_strlen(status_message); + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + + static bool last_blink = false; + + // If the string fits into the LCD, just print it and do not scroll it + if (slen <= LCD_WIDTH) { + + // The string isn't scrolling and may not fill the screen + lcd_put_u8str(status_message); + + // Fill the rest with spaces + while (slen < LCD_WIDTH) { lcd.write(' '); ++slen; } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + // and the string remaining length + uint8_t rlen; + const char *stat = status_and_len(rlen); + lcd_put_u8str_max(stat, LCD_WIDTH); // The string leaves space + + // If the remaining string doesn't completely fill the screen + if (rlen < LCD_WIDTH) { + lcd.write('.'); // Always at 1+ spaces left, draw a dot + uint8_t chars = LCD_WIDTH - rlen; // Amount of space left in characters + if (--chars) { // Draw a second dot if there's space + lcd.write('.'); + if (--chars) + lcd_put_u8str_max(status_message, chars); // Print a second copy of the message + } + } + if (last_blink != blink) { + last_blink = blink; + advance_status_scroll(); + } + } + + #else + + UNUSED(blink); + + // Just print the string to the LCD + lcd_put_u8str_max(status_message, LCD_WIDTH); + + // Fill the rest with spaces if there are missing spaces + while (slen < LCD_WIDTH) { + lcd.write(' '); + ++slen; + } + + #endif +} + +/** +Possible status screens: + +Equal to 20x10 text LCD + +|X 000 Y 000 Z 000.00| +|FR100% SD100% C--:--| +| Progress bar line | +|Status message | +| | +| HE BED FAN | +| ttc ttc % | ttc - current temperature +| tts tts %%% | tts - setted temperature, %%% - percent for FAN +| ICO ICO ICO ICO | ICO - icon 48x48, placed in 2 text lines +| ICO ICO ICO ICO | ICO / + +or + +|X 000 Y 000 Z 000.00| +|FR100% SD100% C--:--| +| Progress bar line | +|Status message | +| | +|HE1 HE2 HE3 BED ICO| +|ttc ttc ttc ttc ICO| +|tts tts tts tts %%%| +|ICO ICO ICO ICO ICO| +|ICO ICO ICO ICO ICO| + +or + +Equal to 24x10 text LCD + +|X 000 Y 000 Z 000.00 | +|FR100% SD100% C--:--| +| Progress bar line | +|Status message | +| | +|HE1 HE2 HE3 BED FAN | +|ttc ttc ttc ttc % | +|tts tts tts tts %%% | +|ICO ICO ICO ICO ICO ICO| +|ICO ICO ICO ICO ICO ICO| +*/ + +void MarlinUI::draw_status_screen() { + if (!PanelDetected) return; + + const bool blink = get_blink(); + + lcd.clear_buffer(); + + // + // Line 1 - XYZ coordinates + // + + lcd.setCursor(0, 0); + _draw_axis_value(X_AXIS, ftostr4sign(LOGICAL_X_POSITION(current_position[X_AXIS])), blink); lcd.write(' '); + _draw_axis_value(Y_AXIS, ftostr4sign(LOGICAL_Y_POSITION(current_position[Y_AXIS])), blink); lcd.write(' '); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position[Z_AXIS])), blink); + + #if HAS_LEVELING && !HAS_HEATED_BED + lcd.write(planner.leveling_active || blink ? '_' : ' '); + #endif + + // + // Line 2 - feedrate, , time + // + + lcd.setCursor(0, 1); + lcd_put_u8str_P(PSTR("FR")); lcd.print(i16tostr3rj(feedrate_percentage)); lcd.write('%'); + + #if BOTH(SDSUPPORT, HAS_PRINT_PROGRESS) + lcd.setCursor(LCD_WIDTH / 2 - 3, 1); + _draw_print_progress(); + #endif + + char buffer[10]; + duration_t elapsed = print_job_timer.duration(); + uint8_t len = elapsed.toDigital(buffer); + + lcd.setCursor((LCD_WIDTH - 1) - len, 1); + lcd.write(0x07); lcd.print(buffer); // LCD_CLOCK_CHAR + + // + // Line 3 - progressbar + // + + lcd.setCursor(0, 2); + #if ENABLED(LCD_PROGRESS_BAR) + draw_progress_bar(_get_progress()); + #else + lcd.write('%'); lcd.write(0); + #endif + + // + // Line 4 - Status Message (which may be a Filament display) + // + + draw_status_message(blink); + + // + // Line 5 + // + + #if HOTENDS <= 1 || (HOTENDS <= 2 && !HAS_HEATED_BED) + #if DUAL_MIXING_EXTRUDER + lcd.setCursor(0, 4); + // Two-component mix / gradient instead of XY + char mixer_messages[12]; + const char *mix_label; + #if ENABLED(GRADIENT_MIX) + if (mixer.gradient.enabled) { + mixer.update_mix_from_gradient(); + mix_label = "Gr"; + } + else + #endif + { + mixer.update_mix_from_vtool(); + mix_label = "Mx"; + } + sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); + lcd_put_u8str(mixer_messages); + #endif + #endif + + // + // Line 6..8 Temperatures, FAN + // + + #if HOTENDS < 2 + _draw_heater_status(H_E0, "HE", blink); // Hotend Temperature + #else + _draw_heater_status(H_E0, "HE1", blink); // Hotend 1 Temperature + _draw_heater_status(H_E1, "HE2", blink); // Hotend 2 Temperature + #if HOTENDS > 2 + _draw_heater_status(H_E2, "HE3", blink); // Hotend 3 Temperature + #endif + #endif // HOTENDS <= 1 + + #if HAS_HEATED_BED + #if HAS_LEVELING + _draw_heater_status(H_BED, (planner.leveling_active && blink ? "___" : "BED"), blink); + #else + _draw_heater_status(H_BED, "BED", blink); + #endif + #endif // HAS_HEATED_BED + + #if FAN_COUNT > 0 + uint16_t spd = thermalManager.fan_speed[0]; + + #if ENABLED(ADAPTIVE_FAN_SLOWING) + if (!blink) spd = thermalManager.scaledFanSpeed(0, spd); + #endif + + uint16_t per = thermalManager.fanPercent(spd); + #if HOTENDS < 2 + #define FANX 11 + #else + #define FANX 17 + #endif + lcd.setCursor(FANX, 5); lcd_put_u8str_P(PSTR("FAN")); + lcd.setCursor(FANX + 1, 6); lcd.write('%'); + lcd.setCursor(FANX, 7); + lcd.print(i16tostr3rj(per)); + + if (TERN0(HAS_FAN0, thermalManager.fan_speed[0]) || TERN0(HAS_FAN1, thermalManager.fan_speed[1]) || TERN0(HAS_FAN2, thermalManager.fan_speed[2])) + picBits |= ICON_FAN; + else + picBits &= ~ICON_FAN; + + #endif // FAN_COUNT > 0 + + // + // Line 9, 10 - icons + // + lcd.print_screen(); +} + +#if HAS_LCD_MENU + + #include "../menu/menu.h" + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + if (!PanelDetected) return; + lcd.setCursor((LCD_WIDTH - 14) / 2, row + 1); + lcd.write(0x02); lcd_put_u8str_P(" E"); lcd.write('1' + extruder); lcd.write(' '); + lcd.print(i16tostr3rj(thermalManager.degHotend(extruder))); lcd.write(0x01); lcd.write('/'); + lcd.print(i16tostr3rj(thermalManager.degTargetHotend(extruder))); lcd.write(0x01); + lcd.print_line(); + } + + #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*/) { + if (!PanelDetected) return; + uint8_t n = LCD_WIDTH; + lcd.setCursor(0, row); + if ((style & SS_CENTER) && !valstr) { + int8_t pad = (LCD_WIDTH - utf8_strlen_P(pstr)) / 2; + while (--pad >= 0) { lcd.write(' '); n--; } + } + n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, n); + if (valstr) n -= lcd_put_u8str_max(valstr, n); + for (; n; --n) lcd.write(' '); + lcd.print_line(); + } + + // 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) { + if (!PanelDetected) return; + lcd.setCursor(0, row); + lcd.write(sel ? pre_char : ' '); + uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2); + for (; n; --n) lcd.write(' '); + lcd.write(post_char); + lcd.print_line(); + } + + // 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) { + if (!PanelDetected) return; + const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0; + lcd.setCursor(0, row); + lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' '); + uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); + if (vlen) { + lcd.write(':'); + for (; n; --n) lcd.write(' '); + if (pgm) lcd_put_u8str_P(data); else lcd_put_u8str(data); + } + lcd.print_line(); + } + + // Low-level draw_edit_screen can be used to draw an edit screen from anyplace + // This line moves to the last line of the screen for UBL plot screen on the panel side + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + if (!PanelDetected) return; + ui.encoder_direction_normal(); + const uint8_t y = TERN0(AUTO_BED_LEVELING_UBL, ui.external_control) ? LCD_HEIGHT - 1 : MIDDLE_Y; + lcd.setCursor(0, y); + lcd.write(COLOR_EDIT); + lcd_put_u8str_P(pstr); + if (value != nullptr) { + lcd.write(':'); + lcd.setCursor((LCD_WIDTH - 1) - (utf8_strlen(value) + 1), y); // Right-justified, padded by spaces + lcd.write(' '); // Overwrite char if value gets shorter + lcd.print(value); + lcd.write(' '); + lcd.print_line(); + } + } + + // 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, PGM_P const suff) { + if (!PanelDetected) return; + ui.draw_select_screen_prompt(pref, string, suff); + lcd.setCursor(0, MIDDLE_Y); + lcd.write(COLOR_EDIT); + lcd.write(yesno ? ' ' : '['); lcd_put_u8str_P(no); lcd.write(yesno ? ' ' : ']'); + lcd.setCursor(LCD_WIDTH - utf8_strlen_P(yes) - 3, MIDDLE_Y); + lcd.write(yesno ? '[' : ' '); lcd_put_u8str_P(yes); lcd.write(yesno ? ']' : ' '); + lcd.print_line(); + } + + #if ENABLED(SDSUPPORT) + + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + if (!PanelDetected) return; + lcd.setCursor(0, row); + lcd.write(sel ? LCD_STR_ARROW_RIGHT[0] : ' '); + constexpr uint8_t maxlen = LCD_WIDTH - 2; + uint8_t n = maxlen - lcd_put_u8str_max(ui.scrolled_filename(theCard, maxlen, row, sel), maxlen); + for (; n; --n) lcd.write(' '); + lcd.write(isDir ? LCD_STR_FOLDER[0] : ' '); + lcd.print_line(); + } + + #endif // SDSUPPORT + + #if ENABLED(LCD_HAS_STATUS_INDICATORS) + + void MarlinUI::update_indicators() {} + + #endif // LCD_HAS_STATUS_INDICATORS + + #if ENABLED(AUTO_BED_LEVELING_UBL) + /** + * Map screen: + * |/---------\ (00,00) | + * || . . . . | X:000.00| + * || . . . . | Y:000.00| + * || . . . . | Z:00.000| + * || . . . . | | + * || . . . . | | + * || . . . . | | + * |+---------/ | + * | | + * |____________________| + */ + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + if (!PanelDetected) return; + + #define _LCD_W_POS 12 + + lcd.clear_buffer(); + + //print only top left corner. All frame with grid points will be printed by panel + lcd.setCursor(0, 0); + *fb++ = TLC; //top left corner - marker for plot parameters + *fb = (GRID_MAX_POINTS_X << 4) + GRID_MAX_POINTS_Y; //set mesh size + + // Print plot position + lcd.setCursor(_LCD_W_POS, 0); + *fb++ = '('; lcd.print(i16tostr3left(x_plot)); + *fb++ = ','; lcd.print(i16tostr3left(y_plot)); *fb = ')'; + + // Show all values + lcd.setCursor(_LCD_W_POS, 1); lcd_put_u8str_P(PSTR("X:")); + lcd.print(ftostr52(LOGICAL_X_POSITION(pgm_read_float(&ubl._mesh_index_to_xpos[x_plot])))); + lcd.setCursor(_LCD_W_POS, 2); lcd_put_u8str_P(PSTR("Y:")); + lcd.print(ftostr52(LOGICAL_Y_POSITION(pgm_read_float(&ubl._mesh_index_to_ypos[y_plot])))); + + // Show the location value + lcd.setCursor(_LCD_W_POS, 3); lcd_put_u8str_P(PSTR("Z:")); + + if (!isnan(ubl.z_values[x_plot][y_plot])) + lcd.print(ftostr43sign(ubl.z_values[x_plot][y_plot])); + else + lcd_put_u8str_P(PSTR(" -----")); + + center_text_P(GET_TEXT(MSG_UBL_FINE_TUNE_MESH), 8); + + lcd.print_screen(); + } + + #endif // AUTO_BED_LEVELING_UBL + +#endif // HAS_LCD_MENU + +#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h new file mode 100644 index 00000000..eedcc4af --- /dev/null +++ b/Marlin/src/lcd/TFTGLCD/ultralcd_TFTGLCD.h @@ -0,0 +1,75 @@ +/** + * 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 + +/** + * Implementation of the LCD display routines for a TFT GLCD displays with external controller. + */ + +#include "../../inc/MarlinConfig.h" + +#if IS_TFTGLCD_PANEL + +#include "../../libs/duration_t.h" + +//////////////////////////////////// +// Set up 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 +class TFTGLCD { + private: + public: + TFTGLCD(); + void clear_buffer(); + void clr_screen(); + void setCursor(uint8_t col, uint8_t row); + void write(char c); + void print(const char *line); + void print_line(); + void print_screen(); + void redraw_screen(); + void setContrast(uint16_t contrast); +}; + +extern TFTGLCD lcd; + +#include "../fontutils.h" +#include "../lcdprint.h" + +// Use panel encoder - free old encoder pins +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC +#define BTN_EN1 -1 +#define BTN_EN2 -1 +#define BTN_ENC -1 + +#ifndef EN_C + #define EN_C 4 //for click +#endif + +#endif // IS_TFTGLCD_PANEL diff --git a/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h new file mode 100644 index 00000000..1511c699 --- /dev/null +++ b/Marlin/src/lcd/dogm/HAL_LCD_class_defines.h @@ -0,0 +1,109 @@ +/** + * 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" + +// use this file to create the public interface for device drivers that are NOT in the U8G library + +extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi; +extern u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi; + +class U8GLIB_64128N_2X_HAL : public U8GLIB { +public: + U8GLIB_64128N_2X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } + U8GLIB_64128N_2X_HAL(pin_t cs, pin_t a0, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7565_64128n_HAL_2x_hw_spi, (uint8_t)cs, (uint8_t)a0, (uint8_t)reset) + { } +}; + +extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi; +extern u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi; + +class U8GLIB_ST7920_128X64_4X_HAL : public U8GLIB { +public: + U8GLIB_ST7920_128X64_4X_HAL(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } + U8GLIB_ST7920_128X64_4X_HAL(pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_HAL_4x_hw_spi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } +}; + +// +// AVR version uses ultralcd_st7920_u8glib_rrd_AVR.cpp +// HAL version uses u8g_dev_st7920_128x64_HAL.cpp +// +extern u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi; + +class U8GLIB_ST7920_128X64_RRD : public U8GLIB { +public: + U8GLIB_ST7920_128X64_RRD(pin_t sck, pin_t mosi, pin_t cs, pin_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_st7920_128x64_rrd_sw_spi, (uint8_t)sck, (uint8_t)mosi, (uint8_t)cs, U8G_PIN_NONE, (uint8_t)reset) // a0 = U8G_PIN_NONE + { } +}; + +extern u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire; + +class U8GLIB_SH1106_128X64_2X_I2C_2_WIRE : public U8GLIB { +public: + U8GLIB_SH1106_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_sh1106_128x64_2x_i2c_2_wire, options) + { } +}; + +extern u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire; + +class U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE : public U8GLIB { +public: + U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE(uint8_t options = U8G_I2C_OPT_NONE) + : U8GLIB(&u8g_dev_ssd1306_128x64_2x_i2c_2_wire, options) + { } +}; + +// +// Very basic support for 320x240 TFT screen +// Tested on MKS Robin TFT_V2.0 with ST7789V controller +// +extern u8g_dev_t u8g_dev_tft_320x240_upscale_from_128x64; + +class U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 : public U8GLIB { +public: + U8GLIB_TFT_320X240_UPSCALE_FROM_128X64(uint8_t cs, uint8_t rs, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_tft_320x240_upscale_from_128x64, cs, rs, reset) + { } +}; + + +extern u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, u8g_dev_uc1701_mini12864_HAL_2x_hw_spi; + +class U8GLIB_MINI12864_2X_HAL : public U8GLIB { +public: + U8GLIB_MINI12864_2X_HAL(uint8_t sck, uint8_t mosi, uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_sw_spi, sck, mosi, cs, a0, reset) + { } + U8GLIB_MINI12864_2X_HAL(uint8_t cs, uint8_t a0, uint8_t reset = U8G_PIN_NONE) + : U8GLIB(&u8g_dev_uc1701_mini12864_HAL_2x_hw_spi, cs, a0, reset) + { } +}; diff --git a/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h new file mode 100644 index 00000000..da7d4f6f --- /dev/null +++ b/Marlin/src/lcd/dogm/HAL_LCD_com_defines.h @@ -0,0 +1,120 @@ +/** + * 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 + +// Use this file to select the com driver for device drivers that are NOT in the U8G library + +#include + +#ifndef U8G_HAL_LINKS // Defined by LPC1768/9 environments in platform.ini + + #ifdef __SAM3X8E__ + + uint8_t u8g_com_HAL_DUE_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + uint8_t u8g_com_HAL_DUE_shared_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_DUE_sw_spi_fn + #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_DUE_shared_hw_spi_fn + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_DUE_ST7920_sw_spi_fn + + #elif defined(__SAMD51__) + + #define U8G_COM_HAL_HW_SPI_FN u8g_com_samd51_hw_spi_fn + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_samd51_st7920_hw_spi_fn + + #elif defined(__STM32F1__) + + uint8_t u8g_com_HAL_STM32F1_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + uint8_t u8g_com_stm32duino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_STM32F1_sw_spi_fn + #define U8G_COM_HAL_HW_SPI_FN u8g_com_stm32duino_hw_spi_fn + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_std_sw_spi_fn + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_stm32duino_hw_spi_fn + + #elif defined(ARDUINO_ARCH_STM32) + + uint8_t u8g_com_stm32duino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_HW_SPI_FN u8g_com_stm32duino_hw_spi_fn + + #elif defined(__AVR__) + + uint8_t u8g_com_HAL_AVR_sw_sp_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_AVR_sw_sp_fn + + #endif + + #ifndef U8G_COM_HAL_SW_SPI_FN + #define U8G_COM_HAL_SW_SPI_FN u8g_com_arduino_std_sw_spi_fn + #endif + #ifndef U8G_COM_HAL_HW_SPI_FN + #define U8G_COM_HAL_HW_SPI_FN u8g_com_arduino_hw_spi_fn + #endif + #ifndef U8G_COM_ST7920_HAL_SW_SPI + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_arduino_st7920_spi_fn + #endif + #ifndef U8G_COM_ST7920_HAL_HW_SPI + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_arduino_st7920_hw_spi_fn + #endif + + // This can't be invoked from the current platformio.ini + #ifdef TARGET_LPC1768 + uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #endif + + #define U8G_COM_SSD_I2C_HAL u8g_com_arduino_ssd_i2c_fn + +#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); + uint8_t u8g_com_HAL_LPC1768_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + uint8_t u8g_com_HAL_LPC1768_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + uint8_t u8g_com_HAL_LPC1768_ST7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + uint8_t u8g_com_HAL_LPC1768_ssd_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); + #define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_LPC1768_sw_spi_fn + #define U8G_COM_HAL_HW_SPI_FN u8g_com_HAL_LPC1768_hw_spi_fn + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_HAL_LPC1768_ST7920_sw_spi_fn + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_HAL_LPC1768_ST7920_hw_spi_fn + #define U8G_COM_SSD_I2C_HAL u8g_com_HAL_LPC1768_ssd_hw_i2c_fn + +#endif + +#ifndef U8G_COM_HAL_SW_SPI_FN + #define U8G_COM_HAL_SW_SPI_FN u8g_com_null_fn +#endif +#ifndef U8G_COM_HAL_HW_SPI_FN + #define U8G_COM_HAL_HW_SPI_FN u8g_com_null_fn +#endif +#ifndef U8G_COM_ST7920_HAL_SW_SPI + #define U8G_COM_ST7920_HAL_SW_SPI u8g_com_null_fn +#endif +#ifndef U8G_COM_ST7920_HAL_HW_SPI + #define U8G_COM_ST7920_HAL_HW_SPI u8g_com_null_fn +#endif +#ifndef U8G_COM_SSD_I2C_HAL + #define U8G_COM_SSD_I2C_HAL u8g_com_null_fn +#endif +#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/dogm_Bootscreen.h b/Marlin/src/lcd/dogm/dogm_Bootscreen.h new file mode 100644 index 00000000..c9001119 --- /dev/null +++ b/Marlin/src/lcd/dogm/dogm_Bootscreen.h @@ -0,0 +1,521 @@ +/** + * 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 + +/** + * Standard Marlin Boot Screen bitmaps + * + * Use the Marlin Bitmap Converter to make your own: + * https://marlinfw.org/tools/u8glib/converter.html + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + + #include "../../../_Bootscreen.h" + + #ifndef CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH + #define CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH CEILING(CUSTOM_BOOTSCREEN_BMPWIDTH, 8) + #endif + #ifndef CUSTOM_BOOTSCREEN_BMPHEIGHT + #define CUSTOM_BOOTSCREEN_BMPHEIGHT (sizeof(custom_start_bmp) / (CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH)) + #endif + +#endif + +#if ENABLED(BOOT_MARLIN_LOGO_SMALL) + + #define START_BMPWIDTH 56 + + const unsigned char start_bmp[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00001100,B00110000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00001100,B00110000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, + B10001100,B00110000,B11000111,B10000011,B10001100,B00110000,B11100111, + B10001100,B00110000,B11001111,B11000111,B11001100,B00110001,B11110011, + B10001100,B00110000,B11011100,B11101100,B11101100,B00110011,B10111001, + B10001100,B00110000,B11011000,B01101100,B01101100,B00110011,B00011001, + B10001100,B00110000,B11010000,B01101100,B00001100,B00110011,B00011001, + B10001100,B00110000,B11011000,B01101100,B00001100,B00110011,B00011001, + B10001100,B00110000,B11011100,B01101100,B00001110,B00111011,B00011001, + B10001100,B00110000,B11001111,B01111100,B00000111,B10011111,B00011001, + B10001100,B00110000,B11000111,B01111100,B00000011,B10001111,B00011001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + #if ENABLED(BOOT_MARLIN_LOGO_ANIMATED) + + const unsigned char start_bmp1[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + const unsigned char start_bmp2[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00000000,B00000000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00000000,B00000000,B00001111, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000111, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000011, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000000,B00000000,B00000000,B00000000,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + const unsigned char start_bmp3[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00000000,B00000000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00000000,B00000000,B00001111, + B10001100,B00110000,B11000111,B10000000,B00000000,B00000000,B00000111, + B10001100,B00110000,B11001111,B11000000,B00000000,B00000000,B00000011, + B10001100,B00110000,B11011100,B11100000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11011000,B01100000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11010000,B01100000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11011000,B01100000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11011100,B01100000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11001111,B01110000,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000111,B01110000,B00000000,B00000000,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + const unsigned char start_bmp4[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00000000,B00000000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00000000,B00000000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00000000,B00000000,B00001111, + B10001100,B00110000,B11000111,B10000011,B10000000,B00000000,B00000111, + B10001100,B00110000,B11001111,B11000111,B11000000,B00000000,B00000011, + B10001100,B00110000,B11011100,B11101100,B11100000,B00000000,B00000001, + B10001100,B00110000,B11011000,B01101100,B01100000,B00000000,B00000001, + B10001100,B00110000,B11010000,B01101100,B00000000,B00000000,B00000001, + B10001100,B00110000,B11011000,B01101100,B00000000,B00000000,B00000001, + B10001100,B00110000,B11011100,B01101100,B00000000,B00000000,B00000001, + B10001100,B00110000,B11001111,B01111100,B00000000,B00000000,B00000001, + B10001100,B00110000,B11000111,B01111100,B00000000,B00000000,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + const unsigned char start_bmp5[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00001100,B00000000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00001100,B00000000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, + B10001100,B00110000,B11000111,B10000011,B10001100,B00000000,B00000111, + B10001100,B00110000,B11001111,B11000111,B11001100,B00000000,B00000011, + B10001100,B00110000,B11011100,B11101100,B11101100,B00000000,B00000001, + B10001100,B00110000,B11011000,B01101100,B01101100,B00000000,B00000001, + B10001100,B00110000,B11010000,B01101100,B00001100,B00000000,B00000001, + B10001100,B00110000,B11011000,B01101100,B00001100,B00000000,B00000001, + B10001100,B00110000,B11011100,B01101100,B00001110,B00000000,B00000001, + B10001100,B00110000,B11001111,B01111100,B00000111,B10000000,B00000001, + B10001100,B00110000,B11000111,B01111100,B00000011,B10000000,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + const unsigned char start_bmp6[] PROGMEM = { + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B10000011,B11001111,B00000000,B00000000,B00001100,B00110000,B00111111, + B10000111,B11111111,B10000000,B00000000,B00001100,B00110000,B00011111, + B10000110,B01111001,B10000000,B00000000,B00001100,B00000000,B00001111, + B10001100,B00110000,B11000111,B10000011,B10001100,B00110000,B00000111, + B10001100,B00110000,B11001111,B11000111,B11001100,B00110000,B00000011, + B10001100,B00110000,B11011100,B11101100,B11101100,B00110000,B00000001, + B10001100,B00110000,B11011000,B01101100,B01101100,B00110000,B00000001, + B10001100,B00110000,B11010000,B01101100,B00001100,B00110000,B00000001, + B10001100,B00110000,B11011000,B01101100,B00001100,B00110000,B00000001, + B10001100,B00110000,B11011100,B01101100,B00001110,B00111000,B00000001, + B10001100,B00110000,B11001111,B01111100,B00000111,B10011100,B00000001, + B10001100,B00110000,B11000111,B01111100,B00000011,B10001100,B00000001, + B01000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010, + B01100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000110, + B00011111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111000 + }; + + #endif + +#else + + #define START_BMPWIDTH 112 + + const unsigned char start_bmp[] PROGMEM = { + 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 + }; + + #if ENABLED(BOOT_MARLIN_LOGO_ANIMATED) + + const unsigned char start_bmp1[] PROGMEM = { + 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,B00000000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,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 + }; + + const unsigned char start_bmp2[] PROGMEM = { + 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,B00000000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, + B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,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 + }; + + const unsigned char start_bmp3[] PROGMEM = { + 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,B00000000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, + B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,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 + }; + + const unsigned char start_bmp4[] PROGMEM = { + 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,B00000000,B00000000,B00000000,B00111111,B11111111, + B11000000,B00001111,B11000000,B11111100,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B11111111, + B11000001,B11111000,B01111111,B10000111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001,B11111111, + B11000001,B11110000,B00111111,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B11111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B00011111,B00000000,B00000011,B11100000,B00000000,B00000000,B00000000,B00000000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B00000000,B00000000,B00000000,B00000000,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B00000000,B00000000,B00000000,B00000000,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B00000000,B00000000,B00000000,B00000000,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B00000000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,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 + }; + + const unsigned char start_bmp5[] PROGMEM = { + 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,B00000000,B00000000,B00011111,B11111111, + B11000000,B00111111,B11100001,B11111111,B00000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00001111,B11111111, + B11000000,B01111111,B11110011,B11111111,B10000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,B00000000,B00000111,B11111111, + B11000000,B11111111,B11111111,B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B01111000,B00000000,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,B00000000,B00000000,B00000000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00000000,B00000000,B00000000,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00000000,B00000000,B00000000,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00000000,B00000000,B00000000,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00000000,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B00000000,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B00000000,B00000000,B00000000,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 + }; + + const unsigned char start_bmp6[] PROGMEM = { + 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,B00000000,B00000000,B01111111, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B11000000,B00001111,B11111000,B01111000,B00111100,B00000000,B00000000,B00111111, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B11100000,B00011111,B11111100,B01111000,B00111100,B00000000,B00000000,B00011111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B11110000,B00111111,B11111110,B01111000,B00111100,B00000000,B00000000,B00001111, + B11000001,B11100000,B00011110,B00000001,B11100011,B11110011,B11111000,B00111111,B00111110,B01111000,B00111100,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11100000,B11111100,B01111100,B00011111,B01111000,B00111100,B00000000,B00000000,B00000111, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B01111100,B01111100,B00001111,B01111000,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B01111100,B01111000,B00001111,B01111000,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B10000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100111,B11000000,B00111100,B01111000,B00000000,B01111000,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11100000,B00111100,B01111000,B00000000,B01111100,B00111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100011,B11111111,B00111111,B11111000,B00000000,B01111111,B10111100,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100001,B11111111,B00111111,B11111000,B00000000,B00111111,B10111111,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B11111111,B00111111,B11111000,B00000000,B00011111,B10111111,B00000000,B00000000,B00000011, + B11000001,B11100000,B00011110,B00000001,B11100000,B01111111,B00111111,B11111000,B00000000,B00001111,B10111111,B00000000,B00000000,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 + +#endif + +#if ENABLED(BOOT_MARLIN_LOGO_ANIMATED) + #ifndef MARLIN_BOOTSCREEN_FRAME_TIME + #define MARLIN_BOOTSCREEN_FRAME_TIME 100 // (ms) + #endif + const unsigned char * const marlin_bootscreen_animation[] PROGMEM = { + start_bmp1, start_bmp2, start_bmp3, start_bmp4, start_bmp5, start_bmp6, start_bmp + }; +#endif + +#ifndef START_BMP_BYTEWIDTH + #define START_BMP_BYTEWIDTH CEILING(START_BMPWIDTH, 8) +#endif +#ifndef START_BMPHEIGHT + #define START_BMPHEIGHT (sizeof(start_bmp) / (START_BMP_BYTEWIDTH)) +#endif + +static_assert(sizeof(start_bmp) == (START_BMP_BYTEWIDTH) * (START_BMPHEIGHT), "Bootscreen (start_bmp) dimensions don't match data."); diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h new file mode 100644 index 00000000..c6ad566c --- /dev/null +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -0,0 +1,1788 @@ +/** + * 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 + +/** + * Standard Marlin Status Screen bitmaps + * + * Use the Marlin Bitmap Converter to make your own: + * https://marlinfw.org/tools/u8glib/converter.html + */ + +#include "../../inc/MarlinConfig.h" +#include "ultralcd_DOGM.h" + +#define BW(N) ((N + 7) / 8) + +#if ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && DISABLED(STATUS_COMBINE_HEATERS) + + #undef STATUS_HEATERS_X + #undef STATUS_BED_X + /** + * Custom _Statusscreen.h files can define: + * - A custom logo image + * - A custom heater bitmap + * - A custom fan bitmap / animation + * + * See the included examples for guidance + */ + #include "../../../_Statusscreen.h" + + #ifdef STATUS_SCREENWIDTH + #error "Your custom _Statusscreen.h needs to be converted for Marlin 2.0." + #endif + +#endif + +// +// Default Status Screen Heater or Hotends bitmaps +// +#if !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH + + #if ENABLED(STATUS_COMBINE_HEATERS) + + #undef STATUS_HOTEND_ANIM + #undef STATUS_BED_ANIM + #define STATUS_HEATERS_XSPACE 24 + + // + // Status Screen Combined Heater bitmaps + // + #if HAS_HEATED_BED && HOTENDS <= 4 + + #if HOTENDS == 0 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, + B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #elif HOTENDS == 1 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #elif HOTENDS == 2 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000000,B00000000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00000000,B00000000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00000000,B00000000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000000,B00000000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #elif HOTENDS == 3 + + #define STATUS_HEATERS_WIDTH 96 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #else // HOTENDS > 3 + + #define STATUS_HEATERS_WIDTH 120 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00000100,B00010000,B01000000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00000010,B00001000,B00100000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00000100,B00010000,B01000000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00001000,B00100000,B10000000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00010000,B01000001,B00000000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00001000,B00100000,B10000000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00000100,B00010000,B01000000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00000000,B00000000,B00000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00011111,B11111111,B11111000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00011111,B11111111,B11111000 + }; + + #endif // HOTENDS + + #define STATUS_BED_TEXT_X (STATUS_HEATERS_WIDTH - 10) + + #else // !HAS_HEATED_BED || HOTENDS > 3 + + #if HOTENDS == 0 + + #define STATUS_HEATERS_WIDTH 0 + + #elif HOTENDS == 1 + + #define STATUS_HEATERS_WIDTH 12 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00011111,B11100000, + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #elif HOTENDS == 2 + + #define STATUS_HEATERS_WIDTH 36 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000, + B00111100,B11110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000, + B00011110,B11100000,B00000000,B00011101,B11100000, + B00111110,B11110000,B00000000,B00111011,B11110000, + B00111110,B11110000,B00000000,B00111000,B01110000, + B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #elif HOTENDS == 3 + + #define STATUS_HEATERS_WIDTH 60 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #elif HOTENDS == 4 + + #define STATUS_HEATERS_WIDTH 84 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #else // HOTENDS > 4 + + #define STATUS_HEATERS_WIDTH 108 + + const unsigned char status_heaters_bmp[] PROGMEM = { + B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000, + B00111110,B11110000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111000,B01110000, + B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B11110000, + B00111010,B11110000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111000,B11110000, + B00011110,B11100000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00011111,B01100000, + B00011110,B11100000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00011111,B01100000, + B00111110,B11110000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000, + B00111110,B11110000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00111100,B11110000, + B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000, + B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000, + B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000, + B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000 + }; + + #endif // HOTENDS + + #endif // !HAS_HEATED_BED || HOTENDS > 3 + + #else // !STATUS_COMBINE_HEATERS + + // + // Status Screen Hotends bitmaps + // + #if HAS_HOTEND + + #define STATUS_HOTEND1_WIDTH 16 + + #define MAX_HOTEND_BITMAPS 5 + #if HOTENDS > MAX_HOTEND_BITMAPS + #define STATUS_HOTEND_BITMAPS MAX_HOTEND_BITMAPS + #else + #define STATUS_HOTEND_BITMAPS HOTENDS + #endif + + #if HOTENDS == 1 || ENABLED(STATUS_HOTEND_NUMBERLESS) + + const unsigned char status_hotend_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00011111,B11100000, + B00011111,B11100000, + B00111111,B11110000, + B00111111,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100000,B00010000, + B00100000,B00010000, + B00010000,B00100000, + B00010000,B00100000, + B00100000,B00010000, + B00100000,B00010000, + B00110000,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #endif + + #elif HOTENDS >= 2 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend1_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111110,B11110000, + B00111100,B11110000, + B00011010,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + B00111110,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend1_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100001,B00010000, + B00100011,B00010000, + B00010101,B00100000, + B00010001,B00100000, + B00100001,B00010000, + B00100001,B00010000, + B00110001,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend2_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011110,B11100000, + B00111101,B11110000, + B00111011,B11110000, + B00111000,B01110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend2_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010001,B00100000, + B00100010,B00010000, + B00100100,B00010000, + B00110111,B10110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend1_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111110,B11110000, + B00111100,B11110000, + B00111010,B11110000, + B00011110,B11100000, + B00011110,B11100000, + B00111110,B11110000, + B00111110,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend2_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011110,B11100000, + B00011101,B11100000, + B00111011,B11110000, + B00111000,B01110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #if STATUS_HOTEND_BITMAPS >= 3 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend3_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111100,B11110000, + B00111011,B01110000, + B00011111,B01100000, + B00011100,B11100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend3_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100011,B00010000, + B00100100,B10010000, + B00010000,B10100000, + B00010011,B00100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend3_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111100,B11110000, + B00111011,B01110000, + B00111111,B01110000, + B00011100,B11100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #endif + + #if STATUS_HOTEND_BITMAPS >= 4 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend4_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011011,B01100000, + B00111000,B00110000, + B00111111,B01110000, + B00111111,B01110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend4_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100100,B10010000, + B00100100,B10010000, + B00010100,B10100000, + B00010100,B10100000, + B00100111,B11010000, + B00100000,B10010000, + B00110000,B10110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend4_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111011,B01110000, + B00111011,B01110000, + B00111011,B01110000, + B00011011,B01100000, + B00011000,B00100000, + B00111111,B01110000, + B00111111,B01110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #endif + + #if STATUS_HOTEND_BITMAPS >= 5 + + #ifdef STATUS_HOTEND_ANIM + + const unsigned char status_hotend5_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111111,B11110000, + B00111000,B01110000, + B00111011,B11110000, + B00011000,B11100000, + B00011111,B01100000, + B00111111,B01110000, + B00111011,B01110000, + B00111100,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + const unsigned char status_hotend5_b_bmp[] PROGMEM = { + B00011111,B11100000, + B00100000,B00010000, + B00100111,B10010000, + B00100100,B00010000, + B00010111,B00100000, + B00010000,B10100000, + B00100000,B10010000, + B00100100,B10010000, + B00110011,B00110000, + B00001000,B01000000, + B00000100,B10000000, + B00000011,B00000000 + }; + + #else + + const unsigned char status_hotend5_a_bmp[] PROGMEM = { + B00011111,B11100000, + B00111000,B01110000, + B00111011,B11110000, + B00111000,B11110000, + B00011111,B01100000, + B00011111,B01100000, + B00111011,B01110000, + B00111100,B11110000, + B00111111,B11110000, + B00001111,B11000000, + B00000111,B10000000, + B00000011,B00000000 + }; + + #endif + + #endif + + #endif + + #else + #define STATUS_HEATERS_HEIGHT 20 + #endif + + #endif + +#endif // !STATUS_HEATERS_WIDTH && !STATUS_HOTEND1_WIDTH + +// LASER / SPINDLE +#if !STATUS_CUTTER_WIDTH && HAS_CUTTER + #define STATUS_CUTTER_WIDTH 24 + #define STATUS_CUTTER_X 80 + #if ENABLED(LASER_FEATURE) + #ifdef STATUS_CUTTER_ANIM + const unsigned char status_cutter_on_bmp[] PROGMEM = { + B00000000,B00100100,B00000000, + B00000000,B01100110,B00000000, + B00000000,B11000011,B00000000, + B00000001,B10011001,B10000000, + B00000011,B00100100,B11000000, + B00000000,B01000010,B00000000, + B00000000,B01000010,B00000000, + B00000011,B00100100,B11000000, + B00000001,B10011001,B10000000, + B00000000,B11000011,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00100100,B00000000 + }; + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000000,B00100100,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00000000,B00000000, + B00000001,B00000000,B10000000, + B00000011,B00000000,B11000000, + B00000000,B00011000,B00000000, + B00000000,B00011000,B00000000, + B00000011,B00000000,B11000000, + B00000001,B00000000,B10000000, + B00000000,B00000000,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00100100,B00000000 + }; + #else + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000000,B00100100,B00000000, + B00000000,B01100110,B00000000, + B00000000,B11000011,B00000000, + B00000001,B10000001,B10000000, + B00000011,B00000000,B11000000, + B00000000,B00000000,B00000000, + B00000000,B00000000,B00000000, + B00000011,B00000000,B11000000, + B00000001,B10000001,B10000000, + B00000000,B11000011,B00000000, + B00000000,B01100110,B00000000, + B00000000,B00100100,B00000000 + }; + #endif + #else + #ifdef STATUS_CUTTER_ANIM + const unsigned char status_cutter_on_bmp[] PROGMEM = { + B00000001,B11111110,B10000000, + B00000000,B11000000,B00000000, + B00000001,B10000000,B10000000, + B00000001,B00000000,B10000000, + B00000001,B11111100,B10000000, + B00000000,B11100000,B00000000, + B00000001,B11000000,B10000000, + B00000000,B10000001,B00000000, + B00000000,B01111010,B00000000, + B00000000,B00110100,B00000000, + B00000000,B00011000,B00000000, + B00000000,B00000000,B00000000 + }; + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000001,B11111110,B10000000, + B00000000,B11000000,B00000000, + B00000001,B10000000,B10000000, + B00000001,B00000000,B10000000, + B00000001,B11111100,B10000000, + B00000000,B11100000,B00000000, + B00000001,B11000000,B10000000, + B00000000,B10000001,B00000000, + B00000000,B01111010,B00000000, + B00000000,B00110100,B00000000, + B00000000,B00011000,B00000000, + B00000000,B00000000,B00000000 + }; + #else + const unsigned char status_cutter_bmp[] PROGMEM = { + B00000001,B11000010,B10000000, + B00000001,B00011100,B10000000, + B00000000,B11100001,B00000000, + B00000001,B00001110,B10000000, + B00000001,B01110000,B10000000, + B00000000,B10000111,B10000000, + B00000001,B00111111,B10000000, + B00000000,B11111111,B00000000, + B00000000,B01111110,B00000000, + B00000000,B00111100,B00000000, + B00000000,B00011000,B00000000, + B00000000,B00000000,B00000000 + }; + #endif + #endif +#endif // LASER / SPINDLE + +// +// Default Status Screen Bed bitmaps +// +#if !STATUS_BED_WIDTH && HAS_HEATED_BED && DISABLED(STATUS_COMBINE_HEATERS) + + #if ENABLED(STATUS_ALT_BED_BITMAP) + + #define STATUS_BED_ANIM + #define STATUS_BED_WIDTH 24 + #ifndef STATUS_BED_X + #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #endif + #define STATUS_BED_TEXT_X (STATUS_BED_X + 11) + + const unsigned char status_bed_bmp[] PROGMEM = { + B11111111,B11111111,B11000000, + B01000000,B00000000,B00100000, + B00100000,B00000000,B00010000, + B00010000,B00000000,B00001000, + B00001000,B00000000,B00000100, + B00000100,B00000000,B00000010, + B00000011,B11111111,B11111111 + }; + + const unsigned char status_bed_on_bmp[] PROGMEM = { + B00000010,B00100010,B00000000, + B00000100,B01000100,B00000000, + B00000100,B01000100,B00000000, + B00000010,B00100010,B00000000, + B00000001,B00010001,B00000000, + B11111111,B11111111,B11000000, + B01000000,B10001000,B10100000, + B00100001,B00010001,B00010000, + B00010010,B00100010,B00001000, + B00001000,B00000000,B00000100, + B00000100,B00000000,B00000010, + B00000011,B11111111,B11111111 + }; + + #else + + #define STATUS_BED_WIDTH 21 + #ifndef STATUS_BED_X + #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_BED_BYTEWIDTH + STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #endif + + #ifdef STATUS_BED_ANIM + + const unsigned char status_bed_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + const unsigned char status_bed_on_bmp[] PROGMEM = { + B00000100,B00010000,B01000000, + B00000010,B00001000,B00100000, + B00000010,B00001000,B00100000, + B00000100,B00010000,B01000000, + B00001000,B00100000,B10000000, + B00010000,B01000001,B00000000, + B00010000,B01000001,B00000000, + B00001000,B00100000,B10000000, + B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + #else + + const unsigned char status_bed_bmp[] PROGMEM = { + B00000100,B00010000,B01000000, + B00000010,B00001000,B00100000, + B00000010,B00001000,B00100000, + B00000100,B00010000,B01000000, + B00001000,B00100000,B10000000, + B00010000,B01000001,B00000000, + B00010000,B01000001,B00000000, + B00001000,B00100000,B10000000, + B00000100,B00010000,B01000000, + B00000000,B00000000,B00000000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + #endif + + #endif +#endif + +#ifndef STATUS_BED_WIDTH + #define STATUS_BED_WIDTH 0 +#endif + +#if !STATUS_CHAMBER_WIDTH && HAS_TEMP_CHAMBER && ((HOTENDS <= 4 && !HAS_HEATED_BED) || (HOTENDS <= 3 && HAS_HEATED_BED)) + #define STATUS_CHAMBER_WIDTH 21 + #if STATUS_HEATERS_WIDTH + #if ENABLED(STATUS_COMBINE_HEATERS) + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_CHAMBER_BYTEWIDTH) * 8) + #elif HAS_FAN0 && HAS_HEATED_BED && HOTENDS <= 2 + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - 2 - (STATUS_HEATERS_BYTEWIDTH - STATUS_CHAMBER_BYTEWIDTH) * 8) + #elif HAS_FAN0 && !HAS_HEATED_BED + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #else + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH) * 8) + #endif + #endif + + #ifdef STATUS_CHAMBER_ANIM + + const unsigned char status_chamber_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00010000,B00000000,B00001000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + const unsigned char status_chamber_on_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00010000,B00000000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B01000010,B00001000, + B00010000,B01000010,B00001000, + B00010000,B10000100,B00001000, + B00010001,B00001000,B00001000, + B00010001,B00001000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B00000000,B00001000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + #else + + const unsigned char status_chamber_bmp[] PROGMEM = { + B00011111,B11111111,B11111000, + B00010000,B00000000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B01000010,B00001000, + B00010000,B01000010,B00001000, + B00010000,B10000100,B00001000, + B00010001,B00001000,B00001000, + B00010001,B00001000,B00001000, + B00010000,B10000100,B00001000, + B00010000,B00000000,B00001000, + B00011111,B11111111,B11111000, + B00011111,B11111111,B11111000 + }; + + #endif +#endif + +#ifndef STATUS_CHAMBER_WIDTH + #define STATUS_CHAMBER_WIDTH 0 +#endif + +// 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 +#if !HAS_FAN0 || (HOTENDS == 5 || (HOTENDS == 4 && BED_OR_CHAMBER) || BOTH(STATUS_COMBINE_HEATERS, HAS_HEATED_CHAMBER)) + #undef STATUS_FAN_FRAMES +#elif !STATUS_FAN_FRAMES + #define STATUS_FAN_FRAMES 2 +#elif STATUS_FAN_FRAMES > 4 + #error "A maximum of 4 fan animation frames is currently supported." +#endif + +#if HOTENDS > 4 + #undef STATUS_LOGO_WIDTH + #undef STATUS_HEATERS_XSPACE + #define STATUS_HEATERS_XSPACE 24 +#endif + +// +// Provide default Fan Bitmaps +// +#if !STATUS_FAN_WIDTH && STATUS_FAN_FRAMES > 0 + + // Provide a fan animation if none exists + + #if STATUS_FAN_FRAMES <= 2 + + #define STATUS_FAN_Y 2 + #define STATUS_FAN_WIDTH 20 + + #if ENABLED(STATUS_ALT_FAN_BITMAP) + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00000001,B11111110,B00000000, + B00000110,B00000001,B10000000, + B00001000,B11111100,B01000000, + B00010000,B11111100,B00100000, + B00010000,B01111000,B00100000, + B00100000,B00110000,B00010000, + B00101100,B00000000,B11010000, + B00101110,B00110001,B11010000, + B00101111,B01111011,B11010000, + B00101111,B01111011,B11010000, + B00101110,B00110001,B11010000, + B00101100,B00000000,B11010000, + B00100000,B00110000,B00010000, + B00010000,B01111000,B00100000, + B00010000,B11111100,B00100000, + B00001000,B11111100,B01000000, + B00000110,B00000001,B10000000, + B00000001,B11111110,B00000000 + }; + + #if STATUS_FAN_FRAMES == 2 + const unsigned char status_fan1_bmp[] PROGMEM = { + B00000001,B11111110,B00000000, + B00000110,B00000001,B10000000, + B00001001,B10000110,B01000000, + B00010011,B10000111,B00100000, + B00010111,B10000111,B10100000, + B00101111,B10000111,B11010000, + B00101111,B00000011,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101111,B00000011,B11010000, + B00101111,B10000111,B11010000, + B00010111,B10000111,B10100000, + B00010011,B10000111,B00100000, + B00001001,B10000110,B01000000, + B00000110,B00000001,B10000000, + B00000001,B11111110,B00000000 + }; + #endif + + #else // !STATUS_ALT_FAN_BITMAP + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00111111,B11111111,B11110000, + B00111000,B00000000,B01110000, + B00110000,B11111100,B00110000, + B00100000,B11111100,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101100,B00000000,B11010000, + B00101110,B00110001,B11010000, + B00101111,B01111011,B11010000, + B00101111,B01111011,B11010000, + B00101110,B00110001,B11010000, + B00101100,B00000000,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B11111100,B00010000, + B00110000,B11111100,B00110000, + B00111000,B00000000,B01110000, + B00111111,B11111111,B11110000 + }; + + #if STATUS_FAN_FRAMES == 2 + const unsigned char status_fan1_bmp[] PROGMEM = { + B00111111,B11111111,B11110000, + B00111000,B00000000,B01110000, + B00110001,B10000110,B00110000, + B00100011,B10000111,B00010000, + B00100111,B10000111,B10010000, + B00101111,B10000111,B11010000, + B00101111,B00000011,B11010000, + B00100000,B00110000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B01111000,B00010000, + B00100000,B00110000,B00010000, + B00101111,B00000011,B11010000, + B00101111,B10000111,B11010000, + B00100111,B10000111,B10010000, + B00100011,B10000111,B00010000, + B00110001,B10000110,B00110000, + B00111000,B00000000,B01110000, + B00111111,B11111111,B11110000 + }; + #endif + + #endif // !STATUS_ALT_FAN_BITMAP + + #elif STATUS_FAN_FRAMES == 3 + + #define STATUS_FAN_WIDTH 20 + + #if ENABLED(STATUS_ALT_FAN_BITMAP) + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001001,B00000001,B00100000, + B00010111,B10000011,B11010000, + B00010111,B10000011,B11010000, + B00101111,B11000111,B11101000, + B00100111,B11000111,B11001000, + B00100001,B11111111,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100001,B11111111,B00001000, + B00100111,B11000111,B11001000, + B00101111,B11000111,B11101000, + B00010111,B10000011,B11010000, + B00010111,B10000011,B11010000, + B00001001,B00000001,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00110000,B11000000, + B00001001,B11110000,B00100000, + B00010001,B11110000,B00010000, + B00010000,B11110000,B00010000, + B00100000,B11110000,B01101000, + B00100000,B00110001,B11101000, + B00100000,B00111001,B11101000, + B00100000,B01111111,B11111000, + B00111111,B11111111,B11111000, + B00111111,B11111100,B00001000, + B00101111,B00111000,B00001000, + B00101110,B00011000,B00001000, + B00101100,B00011110,B00001000, + B00010000,B00011110,B00010000, + B00010000,B00011111,B00010000, + B00001000,B00011111,B00100000, + B00000110,B00011000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00011000,B11000000, + B00001000,B00011111,B00100000, + B00010000,B00011111,B10010000, + B00010100,B00011111,B00010000, + B00101110,B00011110,B00001000, + B00101111,B00011100,B00001000, + B00101111,B10111000,B00001000, + B00111111,B11111100,B00001000, + B00111111,B11111111,B11111000, + B00100000,B01111111,B11111000, + B00100000,B00111011,B11101000, + B00100000,B01110001,B11101000, + B00100000,B11110000,B11101000, + B00010001,B11110000,B01010000, + B00010011,B11110000,B00010000, + B00001001,B11110000,B00100000, + B00000110,B00110000,B11000000, + B00000001,B11111111,B00000000 + }; + + #else // !STATUS_ALT_FAN_BITMAP + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111001,B00000001,B00111000, + B00110111,B10000011,B11011000, + B00110111,B10000011,B11011000, + B00101111,B11000111,B11101000, + B00100111,B11000111,B11001000, + B00100001,B11111111,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100000,B01111100,B00001000, + B00100001,B11111111,B00001000, + B00100111,B11000111,B11001000, + B00101111,B11000111,B11101000, + B00110111,B10000011,B11011000, + B00110111,B10000011,B11011000, + B00111001,B00000001,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00110000,B11111000, + B00111001,B11110000,B00111000, + B00110001,B11110000,B00011000, + B00110000,B11110000,B00011000, + B00100000,B11110000,B01101000, + B00100000,B00110001,B11101000, + B00100000,B00111001,B11101000, + B00100000,B01111111,B11111000, + B00111111,B11111111,B11111000, + B00111111,B11111100,B00001000, + B00101111,B00111000,B00001000, + B00101110,B00011000,B00001000, + B00101100,B00011110,B00001000, + B00110000,B00011110,B00011000, + B00110000,B00011111,B00011000, + B00111000,B00011111,B00111000, + B00111110,B00011000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00011000,B11111000, + B00111000,B00011111,B00111000, + B00110000,B00011111,B10011000, + B00110100,B00011111,B00011000, + B00101110,B00011110,B00001000, + B00101111,B00011100,B00001000, + B00101111,B10111000,B00001000, + B00111111,B11111100,B00001000, + B00111111,B11111111,B11111000, + B00100000,B01111111,B11111000, + B00100000,B00111011,B11101000, + B00100000,B01110001,B11101000, + B00100000,B11110000,B11101000, + B00110001,B11110000,B01011000, + B00110011,B11110000,B00011000, + B00111001,B11110000,B00111000, + B00111110,B00110000,B11111000, + B00111111,B11111111,B11111000 + }; + + #endif // !STATUS_ALT_FAN_BITMAP + + #elif STATUS_FAN_FRAMES == 4 + + #define STATUS_FAN_WIDTH 20 + + #if ENABLED(STATUS_ALT_FAN_BITMAP) + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001000,B00111111,B00100000, + B00010000,B01111110,B00010000, + B00010000,B01111100,B00010000, + B00101000,B01111100,B00001000, + B00101100,B00111000,B00001000, + B00101111,B00111001,B11001000, + B00101111,B11111111,B11101000, + B00101111,B11000111,B11101000, + B00101111,B11111111,B11101000, + B00100111,B00111001,B11101000, + B00100000,B00111000,B01101000, + B00100000,B01111100,B00101000, + B00010000,B01111100,B00010000, + B00010000,B11111100,B00010000, + B00001001,B11111000,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001000,B00001111,B00100000, + B00010100,B00011111,B11010000, + B00010110,B00011111,B10010000, + B00101111,B00011111,B00001000, + B00101111,B10011110,B00001000, + B00101111,B11111100,B00001000, + B00101111,B11011100,B00001000, + B00100111,B11101111,B11001000, + B00100000,B01110111,B11101000, + B00100000,B01111111,B11101000, + B00100000,B11110011,B11101000, + B00100001,B11110001,B11101000, + B00010011,B11110000,B11010000, + B00010111,B11110000,B01010000, + B00001001,B11100000,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B10000000,B11000000, + B00001001,B10000000,B00100000, + B00010111,B10000001,B11010000, + B00010111,B11000011,B11010000, + B00100111,B11000111,B11101000, + B00100011,B11000111,B11111000, + B00100001,B11111111,B10001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100011,B11111111,B00001000, + B00111111,B11000111,B10001000, + B00101111,B11000111,B11001000, + B00010111,B10000111,B11010000, + B00010111,B00000011,B11010000, + B00001000,B00000011,B00100000, + B00000110,B00000010,B11000000, + B00000001,B11111111,B00000000 + }; + const unsigned char status_fan3_bmp[] PROGMEM = { + B00000001,B11111111,B00000000, + B00000110,B00000000,B11000000, + B00001001,B11110000,B00100000, + B00010001,B11100000,B00010000, + B00010001,B11100000,B00010000, + B00100001,B11100001,B11101000, + B00100000,B11110011,B11101000, + B00100000,B01111111,B11101000, + B00100000,B01110111,B11101000, + B00101000,B11101110,B00101000, + B00101111,B11011100,B00001000, + B00101111,B11111100,B00001000, + B00101111,B10011110,B00001000, + B00101111,B00001111,B00001000, + B00010000,B00001111,B00010000, + B00010000,B00001111,B00010000, + B00001000,B00011111,B00100000, + B00000110,B00000000,B11000000, + B00000001,B11111111,B00000000 + }; + + #else // !STATUS_ALT_FAN_BITMAP + + const unsigned char status_fan0_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111000,B00111111,B00111000, + B00110000,B01111110,B00011000, + B00110000,B01111100,B00011000, + B00101000,B01111100,B00001000, + B00101100,B00111000,B00001000, + B00101111,B00111001,B11001000, + B00101111,B11111111,B11101000, + B00101111,B11000111,B11101000, + B00101111,B11111111,B11101000, + B00100111,B00111001,B11101000, + B00100000,B00111000,B01101000, + B00100000,B01111100,B00101000, + B00110000,B01111100,B00011000, + B00110000,B11111100,B00011000, + B00111001,B11111000,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan1_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111000,B00001111,B00111000, + B00110100,B00011111,B11011000, + B00110110,B00011111,B10011000, + B00101111,B00011111,B00001000, + B00101111,B10011110,B00001000, + B00101111,B11111100,B00001000, + B00101111,B11011100,B00001000, + B00100111,B11101111,B11001000, + B00100000,B01110111,B11101000, + B00100000,B01111111,B11101000, + B00100000,B11110011,B11101000, + B00100001,B11110001,B11101000, + B00110011,B11110000,B11011000, + B00110111,B11110000,B01011000, + B00111001,B11100000,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan2_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B10000000,B11111000, + B00111001,B10000000,B00111000, + B00110111,B10000001,B11011000, + B00110111,B11000011,B11011000, + B00100111,B11000111,B11101000, + B00100011,B11000111,B11111000, + B00100001,B11111111,B10001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100000,B01101100,B00001000, + B00100011,B11111111,B00001000, + B00111111,B11000111,B10001000, + B00101111,B11000111,B11001000, + B00110111,B10000111,B11011000, + B00110111,B00000011,B11011000, + B00111000,B00000011,B00111000, + B00111110,B00000010,B11111000, + B00111111,B11111111,B11111000 + }; + const unsigned char status_fan3_bmp[] PROGMEM = { + B00111111,B11111111,B11111000, + B00111110,B00000000,B11111000, + B00111001,B11110000,B00111000, + B00110001,B11100000,B00011000, + B00110001,B11100000,B00011000, + B00100001,B11100001,B11101000, + B00100000,B11110011,B11101000, + B00100000,B01111111,B11101000, + B00100000,B01110111,B11101000, + B00101000,B11101110,B00101000, + B00101111,B11011100,B00001000, + B00101111,B11111100,B00001000, + B00101111,B10011110,B00001000, + B00101111,B00001111,B00001000, + B00110000,B00001111,B00011000, + B00110000,B00001111,B00011000, + B00111000,B00011111,B00111000, + B00111110,B00000000,B11111000, + B00111111,B11111111,B11111000 + }; + + #endif // !STATUS_ALT_FAN_BITMAP + + #endif +#else + #undef STATUS_FAN_FRAMES + #define STATUS_FAN_WIDTH 0 +#endif + +#define _EXTRA_WIDTH (STATUS_FAN_WIDTH + STATUS_CHAMBER_WIDTH + STATUS_BED_WIDTH) + +// +// Heater Bitmap X Space Requirements +// +#if !defined(STATUS_HEATERS_XSPACE) && (STATUS_HOTEND1_WIDTH || STATUS_HEATERS_WIDTH) + #if (HOTENDS == 3 || HOTENDS == 4) && ENABLED(STATUS_COMBINE_HEATERS) + // If more heaters or they're combined, 3 bytes + #define STATUS_HEATERS_XSPACE 24 + #elif STATUS_LOGO_WIDTH > (LCD_PIXEL_WIDTH - (_EXTRA_WIDTH) - 26 * (HOTENDS)) // 128 - (20 + 24 + 26) == 58 + // If the logo won't fit at 26 width + #define STATUS_HEATERS_XSPACE 24 + #else + #define STATUS_HEATERS_XSPACE 26 + #endif +#endif + +#if ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) + + // + // Disable the logo bitmap if insufficient space + // + #if STATUS_HEATERS_XSPACE + #define _HEATERS_WIDTH (HOTENDS * (STATUS_HEATERS_XSPACE)) // as many hotends as possible + #elif STATUS_HEATERS_WIDTH + #define _HEATERS_WIDTH STATUS_HEATERS_WIDTH + #elif HOTENDS + #error "Status screen heaters region was not specified." + #endif + #if STATUS_LOGO_WIDTH > (LCD_PIXEL_WIDTH - (_EXTRA_WIDTH + _HEATERS_WIDTH)) + #warning "Unable to fit custom Status Screen logo. Disabling." + #undef STATUS_LOGO_WIDTH + #endif + + #if !defined(STATUS_HEATERS_X) && ((HAS_MULTI_HOTEND && STATUS_LOGO_WIDTH && BED_OR_CHAMBER_OR_FAN) || (HOTENDS >= 3 && !BED_OR_CHAMBER_OR_FAN)) + #define _STATUS_HEATERS_X(H,S,N) ((LCD_PIXEL_WIDTH - (H * (S + N)) - (_EXTRA_WIDTH) + (STATUS_LOGO_WIDTH)) / 2) + #if STATUS_HOTEND1_WIDTH + #if HOTENDS > 2 + #define STATUS_HEATERS_X _STATUS_HEATERS_X(HOTENDS, STATUS_HOTEND1_WIDTH, 6) + #else + #define STATUS_HEATERS_X _STATUS_HEATERS_X(HOTENDS, STATUS_HOTEND1_WIDTH, 4) + #endif + #else + #define STATUS_HEATERS_X _STATUS_HEATERS_X(1, STATUS_HEATERS_WIDTH, 4) + #endif + #endif + +#endif + +// +// Custom Logo Bitmap Properties +// +#ifndef STATUS_LOGO_WIDTH + #define STATUS_LOGO_WIDTH 0 +#endif +#ifndef STATUS_LOGO_BYTEWIDTH + #define STATUS_LOGO_BYTEWIDTH BW(STATUS_LOGO_WIDTH) +#endif +#if STATUS_LOGO_WIDTH + #ifndef STATUS_LOGO_X + #define STATUS_LOGO_X 0 + #endif + #ifndef STATUS_LOGO_Y + #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)) + #endif + static_assert( + sizeof(status_logo_bmp) == (STATUS_LOGO_BYTEWIDTH) * (STATUS_LOGO_HEIGHT), + "Status logo bitmap (status_logo_bmp) dimensions don't match data." + ); +#endif + +// +// Hotend Heater Bitmap starting X position +// +#if !defined(STATUS_HEATERS_X) && (STATUS_HOTEND1_WIDTH || STATUS_HEATERS_WIDTH) + #if STATUS_LOGO_BYTEWIDTH + #define STATUS_HEATERS_X (STATUS_LOGO_BYTEWIDTH * 8) + #elif ((STATUS_CHAMBER_WIDTH || STATUS_FAN_WIDTH) && (STATUS_BED_WIDTH && STATUS_HOTEND_BITMAPS == 3)) || \ + ((STATUS_CHAMBER_WIDTH || STATUS_FAN_WIDTH || STATUS_BED_WIDTH) && STATUS_HOTEND_BITMAPS == 4) + #define STATUS_HEATERS_X 5 + #else + #if BOTH(STATUS_COMBINE_HEATERS, HAS_HEATED_BED) && HOTENDS <= 4 + #define STATUS_HEATERS_X 5 + #else + #define STATUS_HEATERS_X 8 // Like the included bitmaps + #endif + #endif +#endif + +#if STATUS_HOTEND1_WIDTH + + // + // Hotend images. A base hotend image and optional "ON" state image. + // + #ifndef STATUS_HOTEND_BITMAPS + #define STATUS_HOTEND_BITMAPS 1 + #endif + + #ifndef STATUS_HOTEND2_WIDTH + #define STATUS_HOTEND2_WIDTH STATUS_HOTEND1_WIDTH + #endif + #ifndef STATUS_HOTEND3_WIDTH + #define STATUS_HOTEND3_WIDTH STATUS_HOTEND2_WIDTH + #endif + #ifndef STATUS_HOTEND4_WIDTH + #define STATUS_HOTEND4_WIDTH STATUS_HOTEND3_WIDTH + #endif + #ifndef STATUS_HOTEND5_WIDTH + #define STATUS_HOTEND5_WIDTH STATUS_HOTEND4_WIDTH + #endif + #ifndef STATUS_HOTEND6_WIDTH + #define STATUS_HOTEND6_WIDTH STATUS_HOTEND5_WIDTH + #endif + #ifndef STATUS_HOTEND7_WIDTH + #define STATUS_HOTEND7_WIDTH STATUS_HOTEND6_WIDTH + #endif + #ifndef STATUS_HOTEND8_WIDTH + #define STATUS_HOTEND8_WIDTH STATUS_HOTEND7_WIDTH + #endif + + constexpr uint8_t status_hotend_width[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_WIDTH, STATUS_HOTEND2_WIDTH, STATUS_HOTEND3_WIDTH, STATUS_HOTEND4_WIDTH, STATUS_HOTEND5_WIDTH, STATUS_HOTEND6_WIDTH, STATUS_HOTEND7_WIDTH, STATUS_HOTEND8_WIDTH); + #define STATUS_HOTEND_WIDTH(N) status_hotend_width[N] + + #ifndef STATUS_HOTEND1_BYTEWIDTH + #define STATUS_HOTEND1_BYTEWIDTH BW(STATUS_HOTEND1_WIDTH) + #endif + #ifndef STATUS_HOTEND2_BYTEWIDTH + #define STATUS_HOTEND2_BYTEWIDTH BW(STATUS_HOTEND2_WIDTH) + #endif + #ifndef STATUS_HOTEND3_BYTEWIDTH + #define STATUS_HOTEND3_BYTEWIDTH BW(STATUS_HOTEND3_WIDTH) + #endif + #ifndef STATUS_HOTEND4_BYTEWIDTH + #define STATUS_HOTEND4_BYTEWIDTH BW(STATUS_HOTEND4_WIDTH) + #endif + #ifndef STATUS_HOTEND5_BYTEWIDTH + #define STATUS_HOTEND5_BYTEWIDTH BW(STATUS_HOTEND5_WIDTH) + #endif + #ifndef STATUS_HOTEND6_BYTEWIDTH + #define STATUS_HOTEND6_BYTEWIDTH BW(STATUS_HOTEND6_WIDTH) + #endif + #ifndef STATUS_HOTEND7_BYTEWIDTH + #define STATUS_HOTEND7_BYTEWIDTH BW(STATUS_HOTEND7_WIDTH) + #endif + #ifndef STATUS_HOTEND8_BYTEWIDTH + #define STATUS_HOTEND8_BYTEWIDTH BW(STATUS_HOTEND8_WIDTH) + #endif + + constexpr uint8_t status_hotend_bytewidth[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_BYTEWIDTH, STATUS_HOTEND2_BYTEWIDTH, STATUS_HOTEND3_BYTEWIDTH, STATUS_HOTEND4_BYTEWIDTH, STATUS_HOTEND5_BYTEWIDTH, STATUS_HOTEND6_BYTEWIDTH, STATUS_HOTEND7_BYTEWIDTH, STATUS_HOTEND8_BYTEWIDTH); + #define STATUS_HOTEND_BYTEWIDTH(N) status_hotend_bytewidth[N] + + #ifndef STATUS_HOTEND1_X + #define STATUS_HOTEND1_X STATUS_HEATERS_X + #endif + #ifndef STATUS_HOTEND2_X + #define STATUS_HOTEND2_X STATUS_HOTEND1_X + STATUS_HEATERS_XSPACE + #endif + + #if HOTENDS > 2 + #ifndef STATUS_HOTEND3_X + #define STATUS_HOTEND3_X STATUS_HOTEND2_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND4_X + #define STATUS_HOTEND4_X STATUS_HOTEND3_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND5_X + #define STATUS_HOTEND5_X STATUS_HOTEND4_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND6_X + #define STATUS_HOTEND6_X STATUS_HOTEND5_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND7_X + #define STATUS_HOTEND7_X STATUS_HOTEND6_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND8_X + #define STATUS_HOTEND8_X STATUS_HOTEND7_X + STATUS_HEATERS_XSPACE + #endif + + constexpr uint8_t status_hotend_x[HOTENDS] = ARRAY_N(HOTENDS, STATUS_HOTEND1_X, STATUS_HOTEND2_X, STATUS_HOTEND3_X, STATUS_HOTEND4_X, STATUS_HOTEND5_X, STATUS_HOTEND6_X, STATUS_HOTEND7_X, STATUS_HOTEND8_X); + #define STATUS_HOTEND_X(N) status_hotend_x[N] + #elif HAS_MULTI_HOTEND + #define STATUS_HOTEND_X(N) ((N) ? STATUS_HOTEND2_X : STATUS_HOTEND1_X) + #else + #define STATUS_HOTEND_X(N) STATUS_HOTEND1_X + #endif + + #ifndef STATUS_HOTEND_TEXT_X + #ifdef STATUS_HOTEND1_TEXT_X + #ifndef STATUS_HOTEND2_TEXT_X + #define STATUS_HOTEND2_TEXT_X STATUS_HOTEND1_TEXT_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND3_TEXT_X + #define STATUS_HOTEND3_TEXT_X STATUS_HOTEND2_TEXT_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND4_TEXT_X + #define STATUS_HOTEND4_TEXT_X STATUS_HOTEND3_TEXT_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND5_TEXT_X + #define STATUS_HOTEND5_TEXT_X STATUS_HOTEND4_TEXT_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND6_TEXT_X + #define STATUS_HOTEND6_TEXT_X STATUS_HOTEND5_TEXT_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND7_TEXT_X + #define STATUS_HOTEND7_TEXT_X STATUS_HOTEND6_TEXT_X + STATUS_HEATERS_XSPACE + #endif + #ifndef STATUS_HOTEND8_TEXT_X + #define STATUS_HOTEND8_TEXT_X STATUS_HOTEND7_TEXT_X + STATUS_HEATERS_XSPACE + #endif + constexpr uint8_t status_hotend_text_x[] = ARRAY_N(HOTENDS, STATUS_HOTEND1_TEXT_X, STATUS_HOTEND2_TEXT_X, STATUS_HOTEND3_TEXT_X, STATUS_HOTEND4_TEXT_X, STATUS_HOTEND5_TEXT_X, STATUS_HOTEND6_TEXT_X, STATUS_HOTEND7_TEXT_X, STATUS_HOTEND8_TEXT_X); + #define STATUS_HOTEND_TEXT_X(N) status_hotend_text_x[N] + #else + #define STATUS_HOTEND_TEXT_X(N) (STATUS_HOTEND1_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) + #endif + #endif + + #if STATUS_HOTEND_BITMAPS > 1 && DISABLED(STATUS_HOTEND_NUMBERLESS) + #define TEST_BITMAP_OFF status_hotend1_a_bmp + #define TEST_BITMAP_ON status_hotend1_b_bmp + #else + #define TEST_BITMAP_OFF status_hotend_a_bmp + #define TEST_BITMAP_ON status_hotend_b_bmp + #endif + #ifndef STATUS_HEATERS_HEIGHT + #define STATUS_HEATERS_HEIGHT (sizeof(TEST_BITMAP_OFF) / (STATUS_HOTEND1_BYTEWIDTH)) + #endif + #ifndef STATUS_HEATERS_Y + #define STATUS_HEATERS_Y (20 - (STATUS_HEATERS_HEIGHT)) + #endif + + #define HOTEND0_BITMAP_SIZE (STATUS_HOTEND1_BYTEWIDTH) * (STATUS_HEATERS_HEIGHT) + static_assert( + sizeof(TEST_BITMAP_OFF) == HOTEND0_BITMAP_SIZE, + "Status hotend bitmap (" STRINGIFY(TEST_BITMAP_OFF) ") dimensions don't match data." + ); + #ifdef STATUS_HOTEND_ANIM + static_assert( + sizeof(TEST_BITMAP_ON) == HOTEND0_BITMAP_SIZE, + "Status hotend bitmaps (" STRINGIFY(TEST_BITMAP_OFF) " and " STRINGIFY(TEST_BITMAP_ON) ") dimensions don't match." + ); + #endif + +#elif STATUS_HEATERS_WIDTH + + #ifndef STATUS_HEATERS_XSPACE + #define STATUS_HEATERS_XSPACE 24 + #endif + #ifndef STATUS_HOTEND_WIDTH + #define STATUS_HOTEND_WIDTH(N) 10 + #endif + #ifndef STATUS_HOTEND_X + #define STATUS_HOTEND_X(N) (STATUS_HEATERS_X + 2 + (N) * (STATUS_HEATERS_XSPACE)) + #endif + #ifndef STATUS_HOTEND_TEXT_X + #if HOTENDS == 4 && STATUS_LOGO_WIDTH + #define STATUS_HOTEND_TEXT_X(N) (STATUS_HEATERS_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) + #else + #define STATUS_HOTEND_TEXT_X(N) (STATUS_HEATERS_X + 6 + (N) * (STATUS_HEATERS_XSPACE)) + #endif + #endif + #ifndef STATUS_HEATERS_BYTEWIDTH + #define STATUS_HEATERS_BYTEWIDTH BW(STATUS_HEATERS_WIDTH) + #endif + #ifndef STATUS_HEATERS_HEIGHT + #define STATUS_HEATERS_HEIGHT (sizeof(status_heaters_bmp) / (STATUS_HEATERS_BYTEWIDTH)) + #endif + #ifndef STATUS_HEATERS_Y + #define STATUS_HEATERS_Y (20 - (STATUS_HEATERS_HEIGHT)) + #endif + + static_assert( + sizeof(status_heaters_bmp) == (STATUS_HEATERS_BYTEWIDTH) * (STATUS_HEATERS_HEIGHT), + "Status heaters bitmap (status_heaters_bmp) dimensions don't match data." + ); + +#else // HOTENDS == 0 + + #define STATUS_HOTEND_TEXT_X(N) 0 + #define STATUS_HEATERS_Y 0 + +#endif + +// +// Cutter Bitmap Properties +// +#ifndef STATUS_CUTTER_BYTEWIDTH + #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH) +#endif +#if STATUS_CUTTER_WIDTH + + #ifndef STATUS_CUTTER_X + #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_CUTTER_HEIGHT + #ifdef STATUS_CUTTER_ANIM + #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #else + #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #endif + #endif + + #ifndef STATUS_CUTTER_Y + #define STATUS_CUTTER_Y(S) 4 + #endif + + #ifndef STATUS_CUTTER_TEXT_X + #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1) + #endif + + #ifndef STATUS_CUTTER_TEXT_Y + #define STATUS_CUTTER_TEXT_Y 28 + #endif + + static_assert( + sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)), + "Status cutter bitmap (status_cutter_bmp) dimensions don't match data." + ); + #ifdef STATUS_CUTTER_ANIM + static_assert( + sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)), + "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data." + ); + #endif + +#endif + +// +// Chamber Bitmap Properties +// +#ifndef STATUS_CHAMBER_BYTEWIDTH + #define STATUS_CHAMBER_BYTEWIDTH BW(STATUS_CHAMBER_WIDTH) +#endif +#if STATUS_CHAMBER_WIDTH + + #ifndef STATUS_CHAMBER_X + #define STATUS_CHAMBER_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_CHAMBER_HEIGHT + #ifdef STATUS_CHAMBER_ANIM + #define STATUS_CHAMBER_HEIGHT(S) ((S) ? sizeof(status_chamber_on_bmp) / (STATUS_CHAMBER_BYTEWIDTH) : sizeof(status_chamber_bmp) / (STATUS_CHAMBER_BYTEWIDTH)) + #else + #define STATUS_CHAMBER_HEIGHT(S) (sizeof(status_chamber_bmp) / (STATUS_CHAMBER_BYTEWIDTH)) + #endif + #endif + + #ifndef STATUS_CHAMBER_Y + #define STATUS_CHAMBER_Y(S) (20 - STATUS_CHAMBER_HEIGHT(S)) + #endif + + #ifndef STATUS_CHAMBER_TEXT_X + #define STATUS_CHAMBER_TEXT_X (STATUS_CHAMBER_X + 11) + #endif + + static_assert( + sizeof(status_chamber_bmp) == (STATUS_CHAMBER_BYTEWIDTH) * (STATUS_CHAMBER_HEIGHT(0)), + "Status chamber bitmap (status_chamber_bmp) dimensions don't match data." + ); + #ifdef STATUS_CHAMBER_ANIM + static_assert( + sizeof(status_chamber_on_bmp) == (STATUS_CHAMBER_BYTEWIDTH) * (STATUS_CHAMBER_HEIGHT(1)), + "Status chamber bitmap (status_chamber_on_bmp) dimensions don't match data." + ); + #endif + +#endif + +// +// Bed Bitmap Properties +// +#ifndef STATUS_BED_BYTEWIDTH + #define STATUS_BED_BYTEWIDTH BW(STATUS_BED_WIDTH) +#endif +#if STATUS_BED_WIDTH && !STATUS_HEATERS_WIDTH + + #ifndef STATUS_BED_X + #define STATUS_BED_X (LCD_PIXEL_WIDTH - (STATUS_CHAMBER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_BED_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_BED_HEIGHT + #ifdef STATUS_BED_ANIM + #define STATUS_BED_HEIGHT(S) ((S) ? sizeof(status_bed_on_bmp) / (STATUS_BED_BYTEWIDTH) : sizeof(status_bed_bmp) / (STATUS_BED_BYTEWIDTH)) + #else + #define STATUS_BED_HEIGHT(S) (sizeof(status_bed_bmp) / (STATUS_BED_BYTEWIDTH)) + #endif + #endif + + #ifndef STATUS_BED_Y + #define STATUS_BED_Y(S) (20 - STATUS_BED_HEIGHT(S)) + #endif + + #ifndef STATUS_BED_TEXT_X + #define STATUS_BED_TEXT_X (STATUS_BED_X + 9) + #endif + + static_assert( + sizeof(status_bed_bmp) == (STATUS_BED_BYTEWIDTH) * (STATUS_BED_HEIGHT(0)), + "Status bed bitmap (status_bed_bmp) dimensions don't match data." + ); + #ifdef STATUS_BED_ANIM + static_assert( + sizeof(status_bed_on_bmp) == (STATUS_BED_BYTEWIDTH) * (STATUS_BED_HEIGHT(1)), + "Status bed bitmap (status_bed_on_bmp) dimensions don't match data." + ); + #endif +#endif + +// +// Fan Bitmap Properties +// +#ifndef STATUS_FAN_BYTEWIDTH + #define STATUS_FAN_BYTEWIDTH BW(STATUS_FAN_WIDTH) +#endif +#if STATUS_FAN_FRAMES + #ifndef STATUS_FAN_X + #define STATUS_FAN_X (LCD_PIXEL_WIDTH - (STATUS_FAN_BYTEWIDTH) * 8) + #endif + #ifndef STATUS_FAN_Y + #define STATUS_FAN_Y 1 + #endif + #ifndef STATUS_FAN_TEXT_X + #define STATUS_FAN_TEXT_X (STATUS_FAN_X - 1) + #endif + #ifndef STATUS_FAN_TEXT_Y + #define STATUS_FAN_TEXT_Y 28 + #endif + #ifndef STATUS_FAN_HEIGHT + #define STATUS_FAN_HEIGHT (sizeof(status_fan0_bmp) / (STATUS_FAN_BYTEWIDTH)) + #endif + #define FAN_BMP_SIZE (STATUS_FAN_BYTEWIDTH) * (STATUS_FAN_HEIGHT) + static_assert(sizeof(status_fan0_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan0_bmp) dimensions don't match data."); + #if STATUS_FAN_FRAMES > 1 + static_assert(sizeof(status_fan1_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan1_bmp) dimensions don't match data."); + #if STATUS_FAN_FRAMES > 2 + static_assert(sizeof(status_fan2_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan2_bmp) dimensions don't match data."); + #if STATUS_FAN_FRAMES > 3 + static_assert(sizeof(status_fan3_bmp) == FAN_BMP_SIZE, "Status fan bitmap (status_fan3_bmp) dimensions don't match data."); + #endif + #endif + #endif +#endif + +#if STATUS_LOGO_WIDTH && ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) + #define DO_DRAW_LOGO 1 +#endif +#if HOTENDS > 0 + #define DO_DRAW_HOTENDS 1 +#endif +#if HAS_HEATED_BED && HOTENDS <= 4 + #define DO_DRAW_BED 1 +#endif +#if HAS_CUTTER && !DO_DRAW_BED + #define DO_DRAW_CUTTER 1 +#endif +#if HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4 + #define DO_DRAW_CHAMBER 1 +#endif +#if HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES) + #define DO_DRAW_FAN 1 +#endif +#if BOTH(HAS_HOTEND, STATUS_HOTEND_ANIM) + #define ANIM_HOTEND 1 +#endif +#if BOTH(DO_DRAW_BED, STATUS_BED_ANIM) + #define ANIM_BED 1 +#endif +#if BOTH(DO_DRAW_CHAMBER, STATUS_CHAMBER_ANIM) + #define ANIM_CHAMBER 1 +#endif +#if BOTH(DO_DRAW_CUTTER, STATUS_CUTTER_ANIM) + #define ANIM_CUTTER 1 +#endif +#if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER + #define ANIM_HBCC 1 +#endif diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h new file mode 100644 index 00000000..cd9cb3cd --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_6x9_marlin.h @@ -0,0 +1,189 @@ +/** + * 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 + +/** + Fontname: -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 + Copyright: Public domain font. Share and enjoy. + Capital A Height: 6, '1' Height: 6 + Calculated Max Values w= 6 h= 9 x= 5 y= 5 dx= 6 dy= 0 ascent= 7 len= 9 + Font Bounding box w= 6 h= 9 x= 0 y=-2 + Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 + Pure Font ascent = 6 descent=-2 + X Font ascent = 6 descent=-2 + Max Font ascent = 7 descent=-2 +*/ +#include +const u8g_fntpgm_uint8_t u8g_font_6x9[2434] U8G_FONT_SECTION(".progmem.u8g_font_6x9") = { + 0x00,0x06,0x09,0x00,0xFE,0x06,0x02,0x0F,0x03,0x84,0x01,0xFF,0xFE,0x07,0xFE,0x06, + 0xFE,0x05,0x07,0x07,0x00,0x00,0x00,0x40,0xF0,0xC8,0x88,0x98,0x78,0x10,0x05,0x07, + 0x07,0x00,0x00,0x00,0xC0,0xF8,0x88,0x88,0x88,0x88,0xF8,0x05,0x05,0x05,0x00,0x00, + 0x01,0x20,0x30,0xF8,0x30,0x20,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xF8,0x20, + 0x20,0x20,0xE0,0x05,0x07,0x07,0x00,0x00,0x00,0x20,0x70,0xA8,0xB8,0x88,0x70,0x20, + 0x06,0x05,0x05,0x00,0x00,0x00,0xB0,0xD8,0x6C,0xD8,0xB0,0x05,0x08,0x08,0x00,0x00, + 0xFF,0xF8,0xA8,0x88,0x88,0x88,0x88,0xA8,0xF8,0x05,0x09,0x09,0x00,0x00,0xFE,0x20, + 0x50,0x50,0x50,0x50,0x88,0xA8,0x88,0x70,0x03,0x03,0x03,0x00,0x00,0x03,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,0x06,0x06, + 0x06,0x02,0x00,0x80,0x80,0x80,0x80,0x00,0x80,0x03,0x03,0x03,0x06,0x01,0x03,0xA0, + 0xA0,0xA0,0x05,0x07,0x07,0x06,0x00,0xFF,0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x05, + 0x09,0x09,0x06,0x00,0xFE,0x20,0x70,0xA8,0xA0,0x70,0x28,0xA8,0x70,0x20,0x06,0x08, + 0x08,0x06,0x00,0xFF,0x40,0xA8,0x48,0x10,0x20,0x48,0x54,0x08,0x05,0x07,0x07,0x06, + 0x00,0xFF,0x60,0x90,0x90,0x60,0x98,0x90,0x68,0x01,0x03,0x03,0x06,0x02,0x03,0x80, + 0x80,0x80,0x02,0x07,0x07,0x06,0x02,0xFF,0x40,0x80,0x80,0x80,0x80,0x80,0x40,0x02, + 0x07,0x07,0x06,0x02,0xFF,0x80,0x40,0x40,0x40,0x40,0x40,0x80,0x05,0x05,0x05,0x06, + 0x00,0x00,0x88,0x50,0xF8,0x50,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x20,0x20,0xF8, + 0x20,0x20,0x02,0x04,0x04,0x06,0x02,0xFE,0xC0,0x40,0x40,0x80,0x05,0x01,0x01,0x06, + 0x00,0x02,0xF8,0x02,0x02,0x02,0x06,0x02,0x00,0xC0,0xC0,0x04,0x06,0x06,0x06,0x01, + 0x00,0x10,0x10,0x20,0x40,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90, + 0x90,0x90,0x60,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0xC0,0x40,0x40,0x40,0xE0,0x04, + 0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x10,0x20,0x40,0xF0,0x04,0x06,0x06,0x06,0x01, + 0x00,0xF0,0x20,0x60,0x10,0x10,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x30,0x50, + 0x90,0xF8,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xF0,0x80,0xE0,0x10,0x10,0xE0,0x04, + 0x06,0x06,0x06,0x01,0x00,0x60,0x80,0xE0,0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01, + 0x00,0xF0,0x10,0x10,0x20,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x60, + 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x90,0x70,0x10,0x60,0x02, + 0x05,0x05,0x06,0x02,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x02,0x07,0x07,0x06,0x02,0xFE, + 0xC0,0xC0,0x00,0xC0,0x40,0x40,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x18,0x60,0x80, + 0x60,0x18,0x05,0x03,0x03,0x06,0x00,0x01,0xF8,0x00,0xF8,0x05,0x05,0x05,0x06,0x00, + 0x00,0xC0,0x30,0x08,0x30,0xC0,0x04,0x07,0x07,0x06,0x01,0x00,0x60,0x90,0x10,0x60, + 0x40,0x00,0x40,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x90,0xA8,0xB0,0x80,0x70,0x05, + 0x06,0x06,0x06,0x00,0x00,0x20,0x50,0x88,0xF8,0x88,0x88,0x05,0x06,0x06,0x06,0x00, + 0x00,0xF0,0x88,0xF0,0x88,0x88,0xF0,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, + 0x80,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x04, + 0x06,0x06,0x06,0x01,0x00,0xF0,0x80,0xE0,0x80,0x80,0xF0,0x04,0x06,0x06,0x06,0x01, + 0x00,0xF0,0x80,0xE0,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0x80, + 0xB0,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0xF0,0x90,0x90,0x90,0x03, + 0x06,0x06,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0xE0,0x05,0x06,0x06,0x06,0x00, + 0x00,0x38,0x10,0x10,0x10,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x90,0xA0,0xC0, + 0xA0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0x05, + 0x06,0x06,0x06,0x00,0x00,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x04,0x06,0x06,0x06,0x01, + 0x00,0x90,0xD0,0xB0,0x90,0x90,0x90,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x88,0x88, + 0x88,0x88,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x90,0x90,0xE0,0x80,0x80,0x04, + 0x07,0x07,0x06,0x01,0xFF,0x60,0x90,0x90,0xD0,0xB0,0x60,0x10,0x04,0x06,0x06,0x06, + 0x01,0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90, + 0x40,0x20,0x90,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20, + 0x04,0x06,0x06,0x06,0x01,0x00,0x90,0x90,0x90,0x90,0x90,0x60,0x04,0x06,0x06,0x06, + 0x01,0x00,0x90,0x90,0x90,0xF0,0x60,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88, + 0xA8,0xA8,0xD8,0x88,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88, + 0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06, + 0x01,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x03,0x06,0x06,0x06,0x01,0x00,0xE0,0x80, + 0x80,0x80,0x80,0xE0,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0x40,0x20,0x10,0x10, + 0x03,0x06,0x06,0x06,0x01,0x00,0xE0,0x20,0x20,0x20,0x20,0xE0,0x05,0x03,0x03,0x06, + 0x00,0x03,0x20,0x50,0x88,0x05,0x01,0x01,0x06,0x00,0xFE,0xF8,0x02,0x02,0x02,0x06, + 0x02,0x04,0x80,0x40,0x04,0x04,0x04,0x06,0x01,0x00,0x70,0x90,0x90,0x70,0x04,0x06, + 0x06,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0x90,0xE0,0x04,0x04,0x04,0x06,0x01,0x00, + 0x70,0x80,0x80,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x10,0x10,0x70,0x90,0x90,0x70, + 0x04,0x04,0x04,0x06,0x01,0x00,0x60,0xB0,0xC0,0x70,0x04,0x06,0x06,0x06,0x01,0x00, + 0x20,0x50,0x40,0xE0,0x40,0x40,0x04,0x06,0x06,0x06,0x01,0xFE,0x60,0x90,0x90,0x70, + 0x10,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x03,0x06, + 0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x08,0x08,0x06,0x01,0xFE, + 0x20,0x00,0x60,0x20,0x20,0x20,0xA0,0x40,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0x80, + 0xA0,0xC0,0xA0,0x90,0x03,0x06,0x06,0x06,0x01,0x00,0xC0,0x40,0x40,0x40,0x40,0xE0, + 0x05,0x04,0x04,0x06,0x00,0x00,0xD0,0xA8,0xA8,0x88,0x04,0x04,0x04,0x06,0x01,0x00, + 0xE0,0x90,0x90,0x90,0x04,0x04,0x04,0x06,0x01,0x00,0x60,0x90,0x90,0x60,0x04,0x06, + 0x06,0x06,0x01,0xFE,0xE0,0x90,0x90,0xE0,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xFE, + 0x70,0x90,0x90,0x70,0x10,0x10,0x04,0x04,0x04,0x06,0x01,0x00,0xA0,0xD0,0x80,0x80, + 0x04,0x04,0x04,0x06,0x01,0x00,0x70,0xC0,0x30,0xE0,0x04,0x06,0x06,0x06,0x01,0x00, + 0x40,0x40,0xE0,0x40,0x50,0x20,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x90,0x70, + 0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x90,0x60,0x60,0x05,0x04,0x04,0x06,0x00,0x00, + 0x88,0xA8,0xA8,0x50,0x04,0x04,0x04,0x06,0x01,0x00,0x90,0x60,0x60,0x90,0x04,0x06, + 0x06,0x06,0x01,0xFE,0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x04,0x04,0x06,0x01,0x00, + 0xF0,0x20,0x40,0xF0,0x03,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x40,0x80,0x40,0x40, + 0x20,0x01,0x07,0x07,0x06,0x02,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x03,0x07, + 0x07,0x06,0x01,0x00,0x80,0x40,0x40,0x20,0x40,0x40,0x80,0x04,0x02,0x02,0x06,0x01, + 0x03,0x50,0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x06,0x06,0x06,0x02,0x00, + 0x80,0x00,0x80,0x80,0x80,0x80,0x04,0x06,0x06,0x06,0x01,0xFF,0x20,0x70,0xA0,0xA0, + 0x70,0x20,0x05,0x07,0x07,0x06,0x00,0xFF,0x30,0x48,0x40,0xF0,0x40,0x40,0xF8,0x05, + 0x05,0x05,0x06,0x00,0x00,0xA8,0x50,0x88,0x50,0xA8,0x05,0x06,0x06,0x06,0x00,0x00, + 0x88,0x50,0xF8,0x20,0xF8,0x20,0x01,0x07,0x07,0x06,0x02,0xFF,0x80,0x80,0x80,0x00, + 0x80,0x80,0x80,0x04,0x07,0x07,0x06,0x01,0xFF,0x70,0x80,0x60,0x90,0x60,0x10,0xE0, + 0x03,0x01,0x01,0x06,0x01,0x05,0xA0,0x06,0x07,0x07,0x06,0x00,0x00,0x78,0x84,0x94, + 0xA4,0x94,0x84,0x78,0x03,0x05,0x05,0x06,0x01,0x01,0x60,0xA0,0x60,0x00,0xE0,0x05, + 0x05,0x05,0x06,0x00,0x00,0x28,0x50,0xA0,0x50,0x28,0x04,0x03,0x03,0x06,0x01,0x00, + 0xF0,0x10,0x10,0x04,0x01,0x01,0x06,0x01,0x02,0xF0,0x06,0x07,0x07,0x06,0x00,0x00, + 0x78,0x84,0xB4,0xA4,0xA4,0x84,0x78,0x04,0x01,0x01,0x06,0x01,0x05,0xF0,0x04,0x03, + 0x03,0x06,0x01,0x02,0x60,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0xFF,0x20,0x20,0xF8, + 0x20,0x20,0x00,0xF8,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xA0,0x20,0x40,0xE0,0x03, + 0x05,0x05,0x06,0x01,0x01,0xC0,0x20,0x40,0x20,0xC0,0x02,0x02,0x02,0x06,0x02,0x04, + 0x40,0x80,0x04,0x05,0x05,0x06,0x01,0xFF,0x90,0x90,0xB0,0xD0,0x80,0x05,0x06,0x06, + 0x06,0x00,0x00,0x78,0xE8,0xE8,0x68,0x28,0x28,0x01,0x01,0x01,0x06,0x02,0x02,0x80, + 0x02,0x02,0x02,0x06,0x02,0xFE,0x40,0x80,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xC0, + 0x40,0x40,0xE0,0x03,0x05,0x05,0x06,0x01,0x01,0x40,0xA0,0x40,0x00,0xE0,0x05,0x05, + 0x05,0x06,0x00,0x00,0xA0,0x50,0x28,0x50,0xA0,0x05,0x08,0x08,0x06,0x00,0xFF,0x40, + 0xC0,0x40,0x50,0x70,0x30,0x78,0x10,0x05,0x08,0x08,0x06,0x00,0xFF,0x40,0xC0,0x40, + 0x50,0x68,0x08,0x10,0x38,0x05,0x08,0x08,0x06,0x00,0xFF,0xC0,0x20,0x40,0x30,0xF0, + 0x30,0x78,0x10,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x00,0x20,0x60,0x80,0x90,0x60, + 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07, + 0x06,0x00,0x00,0x10,0x20,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x28,0x50,0x20, + 0x50,0x70,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x20,0x50,0x70,0x88, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x50,0x20,0x50,0x70,0x88,0x88,0x05,0x06, + 0x06,0x06,0x00,0x00,0x78,0xA0,0xF0,0xA0,0xA0,0xB8,0x04,0x08,0x08,0x06,0x01,0xFE, + 0x60,0x90,0x80,0x80,0x90,0x60,0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20, + 0xF0,0x80,0xE0,0x80,0xF0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0xF0,0x80,0xE0, + 0x80,0xF0,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0xF0,0x80,0xE0,0x80,0xF0,0x04, + 0x07,0x07,0x06,0x01,0x00,0x50,0x00,0xF0,0x80,0xE0,0x80,0xF0,0x03,0x07,0x07,0x06, + 0x01,0x00,0x80,0x40,0xE0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0x20, + 0x40,0xE0,0x40,0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0x40,0xA0,0xE0,0x40, + 0x40,0x40,0xE0,0x03,0x07,0x07,0x06,0x01,0x00,0xA0,0x00,0xE0,0x40,0x40,0x40,0xE0, + 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x48,0xE8,0x48,0x48,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x50,0xA0,0x90,0xD0,0xB0,0x90,0x90,0x04,0x07,0x07,0x06,0x01,0x00,0x40, + 0x20,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x60,0x90, + 0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x60,0x90,0x90,0x90,0x60, + 0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x60,0x90,0x90,0x90,0x60,0x04,0x07,0x07, + 0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0x50,0x20,0x50,0x88,0x04,0x08,0x08,0x06,0x01,0xFF,0x10,0x70,0xB0,0xB0,0xD0, + 0xD0,0xE0,0x80,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x90,0x90,0x90,0x90,0x60, + 0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07, + 0x06,0x01,0x00,0x20,0x50,0x90,0x90,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00, + 0x50,0x00,0x90,0x90,0x90,0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x20,0x88, + 0x50,0x20,0x20,0x20,0x04,0x06,0x06,0x06,0x01,0x00,0x80,0xE0,0x90,0x90,0xE0,0x80, + 0x04,0x06,0x06,0x06,0x01,0x00,0x60,0x90,0xA0,0xA0,0x90,0xA0,0x04,0x07,0x07,0x06, + 0x01,0x00,0x40,0x20,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x40,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x70, + 0x90,0x90,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0x70,0x90,0x90,0x70, + 0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x70,0x90,0x90,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x50,0x20,0x70,0x90,0x90,0x70,0x05,0x04,0x04,0x06,0x00,0x00,0x70, + 0xA8,0xB0,0x78,0x04,0x06,0x06,0x06,0x01,0xFE,0x70,0x80,0x80,0x70,0x20,0x40,0x04, + 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0xB0,0xC0,0x70,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x40,0x00,0x60,0xB0,0xC0,0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x50,0x00,0x60,0xB0,0xC0,0x70,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0xB0, + 0xC0,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0x80,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03, + 0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x07,0x07,0x06, + 0x01,0x00,0x40,0xA0,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,0x06,0x01,0x00,0xA0, + 0x00,0xC0,0x40,0x40,0xE0,0x04,0x07,0x07,0x06,0x01,0x00,0x30,0x60,0x10,0x70,0x90, + 0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0xE0,0x90,0x90,0x90,0x04, + 0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06, + 0x01,0x00,0x20,0x40,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x20, + 0x50,0x00,0x60,0x90,0x90,0x60,0x04,0x07,0x07,0x06,0x01,0x00,0x50,0xA0,0x00,0x60, + 0x90,0x90,0x60,0x04,0x06,0x06,0x06,0x01,0x00,0x50,0x00,0x60,0x90,0x90,0x60,0x05, + 0x05,0x05,0x06,0x00,0x00,0x20,0x00,0xF8,0x00,0x20,0x04,0x04,0x04,0x06,0x01,0x00, + 0x70,0xB0,0xD0,0xE0,0x04,0x07,0x07,0x06,0x01,0x00,0x40,0x20,0x00,0x90,0x90,0x90, + 0x70,0x04,0x07,0x07,0x06,0x01,0x00,0x20,0x40,0x00,0x90,0x90,0x90,0x70,0x04,0x07, + 0x07,0x06,0x01,0x00,0x20,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x06,0x06,0x06,0x01, + 0x00,0x50,0x00,0x90,0x90,0x90,0x70,0x04,0x09,0x09,0x06,0x01,0xFE,0x20,0x40,0x00, + 0x90,0x90,0x90,0x70,0x90,0x60,0x04,0x08,0x08,0x06,0x01,0xFE,0x80,0x80,0xE0,0x90, + 0x90,0xE0,0x80,0x80,0x04,0x08,0x08,0x06,0x01,0xFE,0x50,0x00,0x90,0x90,0x90,0x70, + 0x90,0x60}; diff --git a/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h new file mode 100644 index 00000000..b4b615da --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h @@ -0,0 +1,301 @@ +/** + * 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 + +#if defined(__AVR__) && ENABLED(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= 7 h=10 x= 5 y= 5 dx= 7 dy= 0 ascent= 8 len=10 + Font Bounding box w=12 h=15 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 +*/ +const u8g_fntpgm_uint8_t ISO10646_1_5x7[1324] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x07,0x02,0x25,0x03,0xBB,0x01,0x7F,0xFE,0x08,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,0x05,0x05,0x07,0x00,0x01,0xD8,0x6C,0x36,0x6C,0xD8, + 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,0x03,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 + // 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= 7 h=10 x= 5 y= 7 dx= 7 dy= 0 ascent=10 len=10 + Font Bounding box w=12 h=15 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 +*/ +const u8g_fntpgm_uint8_t ISO10646_1_5x7[2647] U8G_FONT_SECTION("ISO10646_1_5x7") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x07,0x02,0x25,0x03,0xBB,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,0x05,0x05,0x07,0x00,0x01,0xD8,0x6C,0x36,0x6C,0xD8, + 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,0x03,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 diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_an.h b/Marlin/src/lcd/dogm/fontdata/langdata_an.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_an.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/dogm/fontdata/langdata_bg.h b/Marlin/src/lcd/dogm/fontdata/langdata_bg.h new file mode 100644 index 00000000..c506f879 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_bg.h @@ -0,0 +1,77 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_8_144_149[96] U8G_FONT_SECTION("fontpage_8_144_149") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x95,0x00,0x07,0xFF,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, + 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8 + }; +const u8g_fntpgm_uint8_t fontpage_8_151_152[43] U8G_FONT_SECTION("fontpage_8_151_152") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x97,0x98,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_8_154_164[160] U8G_FONT_SECTION("fontpage_8_154_164") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0xA4,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88, + 0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88, + 0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x80,0x80,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, + 0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20 + }; +const u8g_fntpgm_uint8_t fontpage_8_166_166[32] U8G_FONT_SECTION("fontpage_8_166_166") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08 + }; +const u8g_fntpgm_uint8_t fontpage_8_175_195[260] U8G_FONT_SECTION("fontpage_8_175_195") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xC3,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, + 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, + 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_197_200[63] U8G_FONT_SECTION("fontpage_8_197_200") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC8,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07,0x07,0x06, + 0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xF8}; +const u8g_fntpgm_uint8_t fontpage_8_202_202[28] U8G_FONT_SECTION("fontpage_8_202_202") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCA,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCF,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06, + 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 144, 149, fontpage_8_144_149), // 'А' -- 'Е' + FONTDATA_ITEM(8, 151, 152, fontpage_8_151_152), // 'З' -- 'И' + FONTDATA_ITEM(8, 154, 164, fontpage_8_154_164), // 'К' -- 'Ф' + FONTDATA_ITEM(8, 166, 166, fontpage_8_166_166), // 'Ц' -- 'Ц' + FONTDATA_ITEM(8, 175, 195, fontpage_8_175_195), // 'Я' -- 'у' + FONTDATA_ITEM(8, 197, 200, fontpage_8_197_200), // 'х' -- 'ш' + FONTDATA_ITEM(8, 202, 202, fontpage_8_202_202), // 'ъ' -- 'ъ' + FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ca.h b/Marlin/src/lcd/dogm/fontdata/langdata_ca.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ca.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/dogm/fontdata/langdata_cz.h b/Marlin/src/lcd/dogm/fontdata/langdata_cz.h new file mode 100644 index 00000000..754459d9 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_cz.h @@ -0,0 +1,54 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_143_143[33] U8G_FONT_SECTION("fontpage_2_143_143") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8F,0x8F,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_2_154_155[47] U8G_FONT_SECTION("fontpage_2_154_155") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9B,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0xF0,0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_200_200[31] U8G_FONT_SECTION("fontpage_2_200_200") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_216_217[47] U8G_FONT_SECTION("fontpage_2_216_217") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD9,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; +const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, + 0x18}; +const u8g_fntpgm_uint8_t fontpage_2_239_239[31] U8G_FONT_SECTION("fontpage_2_239_239") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x20,0x50,0x20,0x88,0x88,0x88,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFE,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80, + 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č' + FONTDATA_ITEM(2, 143, 143, fontpage_2_143_143), // 'ď' -- 'ď' + FONTDATA_ITEM(2, 154, 155, fontpage_2_154_155), // 'Ě' -- 'ě' + FONTDATA_ITEM(2, 200, 200, fontpage_2_200_200), // 'ň' -- 'ň' + FONTDATA_ITEM(2, 216, 217, fontpage_2_216_217), // 'Ř' -- 'ř' + FONTDATA_ITEM(2, 224, 225, fontpage_2_224_225), // 'Š' -- 'š' + FONTDATA_ITEM(2, 229, 229, fontpage_2_229_229), // 'ť' -- 'ť' + FONTDATA_ITEM(2, 239, 239, fontpage_2_239_239), // 'ů' -- 'ů' + FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_da.h b/Marlin/src/lcd/dogm/fontdata/langdata_da.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_da.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/dogm/fontdata/langdata_de.h b/Marlin/src/lcd/dogm/fontdata/langdata_de.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_de.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/dogm/fontdata/langdata_el.h b/Marlin/src/lcd/dogm/fontdata/langdata_el.h new file mode 100644 index 00000000..4b545f22 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_el.h @@ -0,0 +1,90 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x80,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8}; +const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x9D,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80, + 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, + 0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0, + 0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 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}; +const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x40,0x20,0x10,0x20,0x40,0xF8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, + 0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAF,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0A,0x0A, + 0x06,0x00,0xFE,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xA0,0x40}; +const u8g_fntpgm_uint8_t fontpage_7_177_181[80] U8G_FONT_SECTION("fontpage_7_177_181") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB5,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, + 0x00,0xFE,0x60,0x90,0x90,0xB0,0x88,0x88,0xF0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xFE,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_7_183_199[226] U8G_FONT_SECTION("fontpage_7_183_199") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xC7,0x00,0x09,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, + 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xF0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, + 0x00,0x80,0x80,0x80,0xA0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0, + 0x90,0x05,0x09,0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0xF8,0x20, + 0x40,0x70,0x80,0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88, + 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xF8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, + 0x06,0x00,0xFE,0x70,0x88,0x88,0xC8,0xB0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE, + 0x70,0x88,0x80,0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88, + 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, + 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x10,0xA8, + 0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50}; +const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCE,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xA8,0xA8,0x50}; +const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' + FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν' + FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' + FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' + FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' + FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε' + FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ' + FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' + FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ' + FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h b/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h new file mode 100644 index 00000000..4b545f22 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_el_gr.h @@ -0,0 +1,90 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_7_136_136[33] U8G_FONT_SECTION("fontpage_7_136_136") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x80,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8}; +const u8g_fntpgm_uint8_t fontpage_7_145_157[186] U8G_FONT_SECTION("fontpage_7_145_157") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x9D,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20, + 0x50,0x50,0x88,0x88,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80, + 0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x03,0x07,0x07,0x06,0x01,0x00,0xE0, + 0x40,0x40,0x40,0x40,0x40,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0, + 0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88, + 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}; +const u8g_fntpgm_uint8_t fontpage_7_159_161[56] U8G_FONT_SECTION("fontpage_7_159_161") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9F,0xA1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_7_163_167[82] U8G_FONT_SECTION("fontpage_7_163_167") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA7,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x40,0x20,0x10,0x20,0x40,0xF8,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70, + 0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_172_175[75] U8G_FONT_SECTION("fontpage_7_172_175") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAF,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x68,0x90,0x90,0x90,0x68,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x88,0x70,0x05,0x0A,0x0A, + 0x06,0x00,0xFE,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x03,0x08,0x08, + 0x06,0x01,0x00,0x40,0x80,0x00,0x80,0x80,0x80,0xA0,0x40}; +const u8g_fntpgm_uint8_t fontpage_7_177_181[80] U8G_FONT_SECTION("fontpage_7_177_181") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB5,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x68,0x90,0x90,0x90,0x68,0x05,0x09,0x09,0x06, + 0x00,0xFE,0x60,0x90,0x90,0xB0,0x88,0x88,0xF0,0x80,0x80,0x05,0x07,0x07,0x06,0x00, + 0xFE,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x80, + 0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x60,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_7_183_199[226] U8G_FONT_SECTION("fontpage_7_183_199") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xC7,0x00,0x09,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0xB0,0xC8,0x88,0x88,0x88,0x08,0x08,0x04,0x07, + 0x07,0x06,0x01,0x00,0x60,0x90,0x90,0xF0,0x90,0x90,0x60,0x03,0x05,0x05,0x06,0x02, + 0x00,0x80,0x80,0x80,0xA0,0x40,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0, + 0x90,0x05,0x09,0x09,0x06,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x50,0x50,0x88,0x88, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x98,0xE8,0x80,0x80,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0xF8,0x20, + 0x40,0x70,0x80,0x80,0x70,0x08,0x10,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88, + 0x88,0x70,0x06,0x05,0x05,0x06,0x00,0x00,0xF8,0x50,0x50,0x54,0x48,0x05,0x07,0x07, + 0x06,0x00,0xFE,0x70,0x88,0x88,0xC8,0xB0,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0xFE, + 0x70,0x88,0x80,0x80,0x70,0x08,0x30,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x90,0x88, + 0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x28,0x10,0x05,0x05,0x05, + 0x06,0x00,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x10,0xA8, + 0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x50,0x20,0x50, + 0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_7_201_201[28] U8G_FONT_SECTION("fontpage_7_201_201") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50}; +const u8g_fntpgm_uint8_t fontpage_7_204_206[59] U8G_FONT_SECTION("fontpage_7_204_206") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCE,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70,0x05, + 0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x90,0x88,0x88,0x88,0x70,0x05,0x08,0x08, + 0x06,0x00,0x00,0x10,0x20,0x00,0x50,0x88,0xA8,0xA8,0x50}; +const u8g_fntpgm_uint8_t fontpage_64_166_166[24] U8G_FONT_SECTION("fontpage_64_166_166") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x01,0x00,0x00, + 0x00,0x05,0x01,0x01,0x06,0x00,0x00,0xA8}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(7, 136, 136, fontpage_7_136_136), // 'Έ' -- 'Έ' + FONTDATA_ITEM(7, 145, 157, fontpage_7_145_157), // 'Α' -- 'Ν' + FONTDATA_ITEM(7, 159, 161, fontpage_7_159_161), // 'Ο' -- 'Ρ' + FONTDATA_ITEM(7, 163, 167, fontpage_7_163_167), // 'Σ' -- 'Χ' + FONTDATA_ITEM(7, 172, 175, fontpage_7_172_175), // 'ά' -- 'ί' + FONTDATA_ITEM(7, 177, 181, fontpage_7_177_181), // 'α' -- 'ε' + FONTDATA_ITEM(7, 183, 199, fontpage_7_183_199), // 'η' -- 'χ' + FONTDATA_ITEM(7, 201, 201, fontpage_7_201_201), // 'ω' -- 'ω' + FONTDATA_ITEM(7, 204, 206, fontpage_7_204_206), // 'ό' -- 'ώ' + FONTDATA_ITEM(64, 166, 166, fontpage_64_166_166), // '…' -- '…' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_en.h b/Marlin/src/lcd/dogm/fontdata/langdata_en.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_en.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/dogm/fontdata/langdata_es.h b/Marlin/src/lcd/dogm/fontdata/langdata_es.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_es.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/dogm/fontdata/langdata_eu.h b/Marlin/src/lcd/dogm/fontdata/langdata_eu.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_eu.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/dogm/fontdata/langdata_fi.h b/Marlin/src/lcd/dogm/fontdata/langdata_fi.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_fi.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/dogm/fontdata/langdata_fr.h b/Marlin/src/lcd/dogm/fontdata/langdata_fr.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_fr.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/dogm/fontdata/langdata_gl.h b/Marlin/src/lcd/dogm/fontdata/langdata_gl.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_gl.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/dogm/fontdata/langdata_hr.h b/Marlin/src/lcd/dogm/fontdata/langdata_hr.h new file mode 100644 index 00000000..cdb2cc7d --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_hr.h @@ -0,0 +1,32 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_140_141[47] U8G_FONT_SECTION("fontpage_2_140_141") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_145_145[31] U8G_FONT_SECTION("fontpage_2_145_145") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x08,0x00,0x00, + 0x00,0x06,0x08,0x08,0x06,0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_225_225[31] U8G_FONT_SECTION("fontpage_2_225_225") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; +const u8g_fntpgm_uint8_t fontpage_2_254_254[31] U8G_FONT_SECTION("fontpage_2_254_254") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' + FONTDATA_ITEM(2, 140, 141, fontpage_2_140_141), // 'Č' -- 'č' + FONTDATA_ITEM(2, 145, 145, fontpage_2_145_145), // 'đ' -- 'đ' + FONTDATA_ITEM(2, 225, 225, fontpage_2_225_225), // 'š' -- 'š' + FONTDATA_ITEM(2, 254, 254, fontpage_2_254_254), // 'ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_hu.h b/Marlin/src/lcd/dogm/fontdata/langdata_hu.h new file mode 100644 index 00000000..8c15a389 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_hu.h @@ -0,0 +1,15 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_241_241[31] U8G_FONT_SECTION("fontpage_2_241_241") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x88,0x70}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 241, 241, fontpage_2_241_241), // 'ű' -- 'ű' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_it.h b/Marlin/src/lcd/dogm/fontdata/langdata_it.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_it.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/dogm/fontdata/langdata_jp_kana.h b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h new file mode 100644 index 00000000..01316d4c --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_jp_kana.h @@ -0,0 +1,111 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_97_161_164[65] U8G_FONT_SECTION("fontpage_97_161_164") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA4,0x00,0x07,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0x60,0x40,0x80,0x05,0x07,0x07,0x06, + 0x00,0x00,0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x10, + 0x20,0x60,0xA0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20,0x60,0xA0,0x20, + 0x20}; +const u8g_fntpgm_uint8_t fontpage_97_166_166[30] U8G_FONT_SECTION("fontpage_97_166_166") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA6,0xA6,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x88,0x88,0x08,0x10,0x60}; +const u8g_fntpgm_uint8_t fontpage_97_168_168[29] U8G_FONT_SECTION("fontpage_97_168_168") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0xF8}; +const u8g_fntpgm_uint8_t fontpage_97_170_187[268] U8G_FONT_SECTION("fontpage_97_170_187") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xBB,0x00,0x0D,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x05,0x07, + 0x07,0x06,0x00,0x00,0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00, + 0x00,0x28,0x08,0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0xF8,0x20,0x20,0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20, + 0xF8,0x20,0x20,0xF8,0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88, + 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05, + 0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x06, + 0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x09,0x09,0x06,0x00,0x00, + 0x28,0x28,0x00,0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x50, + 0xF8,0x50,0x50,0x50,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xF8, + 0x50,0x50,0x50,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0xC8,0x08,0x10, + 0xE0,0x07,0x0D,0x0D,0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xC0,0x08, + 0xC8,0x08,0x10,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88, + 0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05, + 0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x38}; +const u8g_fntpgm_uint8_t fontpage_97_189_193[85] U8G_FONT_SECTION("fontpage_97_189_193") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBD,0xC1,0x00,0x09,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x09,0x09, + 0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x05,0x07,0x07,0x06, + 0x00,0x00,0x40,0x78,0x48,0xA8,0x18,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28, + 0x08,0x40,0x78,0x48,0xA8,0x18,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60, + 0x20,0xF8,0x20,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_97_195_211[241] U8G_FONT_SECTION("fontpage_97_195_211") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xD3,0x00,0x09,0x00,0x00, + 0x00,0x05,0x04,0x04,0x06,0x00,0x00,0xA8,0xA8,0x08,0x30,0x05,0x06,0x06,0x06,0x00, + 0x00,0xA8,0xA8,0xA8,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, + 0xA8,0xA8,0xA8,0x08,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x20, + 0x20,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xF8,0x20,0x20, + 0x20,0x40,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x04, + 0x09,0x09,0x06,0x01,0x00,0x50,0x10,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x05,0x07, + 0x07,0x06,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00, + 0x00,0x70,0x00,0x00,0x00,0x00,0xF8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28, + 0x10,0x28,0xC0,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xA8,0x20, + 0x03,0x06,0x06,0x06,0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06, + 0x00,0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, + 0x00,0x10,0x50,0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, + 0x10,0x50,0x50,0x48,0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xE0,0x80, + 0x80,0x70,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xE0,0x80,0x80, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_97_213_217[84] U8G_FONT_SECTION("fontpage_97_213_217") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD9,0x00,0x09,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09, + 0x06,0x00,0x00,0x28,0x28,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06, + 0x00,0x00,0x18,0x18,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00, + 0x01,0x60,0xA0,0x10,0x10,0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60, + 0xA0,0x10,0x10,0x08}; +const u8g_fntpgm_uint8_t fontpage_97_219_220[45] U8G_FONT_SECTION("fontpage_97_219_220") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDC,0x00,0x09,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20}; +const u8g_fntpgm_uint8_t fontpage_97_222_223[41] U8G_FONT_SECTION("fontpage_97_222_223") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDF,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0x08,0x50,0x20,0x10,0x04,0x06,0x06, + 0x06,0x01,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x30}; +const u8g_fntpgm_uint8_t fontpage_97_225_237[174] U8G_FONT_SECTION("fontpage_97_225_237") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xED,0x00,0x07,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xC0,0x05,0x06,0x06, + 0x06,0x00,0x00,0xF0,0x40,0xF8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40, + 0xF8,0x48,0x50,0x40,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40, + 0x40,0x04,0x05,0x05,0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x05,0x06,0x06,0x06, + 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10, + 0xF0,0x10,0xF0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06, + 0x00,0x00,0x10,0x90,0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x20,0xA0,0xA0,0xA8,0xA8,0xB0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88, + 0xB0,0xC0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xF8}; +const u8g_fntpgm_uint8_t fontpage_97_242_243[41] U8G_FONT_SECTION("fontpage_97_242_243") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF2,0xF3,0x00,0x06,0x00,0x00, + 0x00,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x10,0x60,0x05,0x06,0x06, + 0x06,0x00,0x00,0xC0,0x08,0x08,0x08,0x10,0xE0}; +const u8g_fntpgm_uint8_t fontpage_97_252_252[25] U8G_FONT_SECTION("fontpage_97_252_252") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x05,0x00,0x00, + 0x00,0x05,0x02,0x02,0x06,0x00,0x03,0x80,0x78}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(97, 161, 164, fontpage_97_161_164), // 'ァ' -- 'イ' + FONTDATA_ITEM(97, 166, 166, fontpage_97_166_166), // 'ウ' -- 'ウ' + FONTDATA_ITEM(97, 168, 168, fontpage_97_168_168), // 'エ' -- 'エ' + FONTDATA_ITEM(97, 170, 187, fontpage_97_170_187), // 'オ' -- 'セ' + FONTDATA_ITEM(97, 189, 193, fontpage_97_189_193), // 'ソ' -- 'チ' + FONTDATA_ITEM(97, 195, 211, fontpage_97_195_211), // 'ッ' -- 'ビ' + FONTDATA_ITEM(97, 213, 217, fontpage_97_213_217), // 'フ' -- 'ベ' + FONTDATA_ITEM(97, 219, 220, fontpage_97_219_220), // 'ホ' -- 'ボ' + FONTDATA_ITEM(97, 222, 223, fontpage_97_222_223), // 'マ' -- 'ミ' + FONTDATA_ITEM(97, 225, 237, fontpage_97_225_237), // 'メ' -- 'ロ' + FONTDATA_ITEM(97, 242, 243, fontpage_97_242_243), // 'ヲ' -- 'ン' + FONTDATA_ITEM(97, 252, 252, fontpage_97_252_252), // 'ー' -- 'ー' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h b/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h new file mode 100644 index 00000000..6b48434a --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ko_KR.h @@ -0,0 +1,547 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_344_240_240[34] U8G_FONT_SECTION("fontpage_344_240_240") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x17,0x21,0x41,0x81,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_345_224_224[41] U8G_FONT_SECTION("fontpage_345_224_224") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x08, + 0x80,0x08,0x80,0x09,0x00,0x08,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_347_248_248[41] U8G_FONT_SECTION("fontpage_347_248_248") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00, + 0x80,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_348_137_137[45] U8G_FONT_SECTION("fontpage_348_137_137") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x00,0x80,0x00,0x80,0x01,0x00,0xFF, + 0xC0,0x00,0x00,0x20,0x80,0x20,0x80,0x3F,0x00,0x20,0x80,0x3F,0x00}; +const u8g_fntpgm_uint8_t fontpage_348_176_176[34] U8G_FONT_SECTION("fontpage_348_176_176") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x11,0x21,0x41,0x81,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_348_197_197[34] U8G_FONT_SECTION("fontpage_348_197_197") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x21,0xC1,0x1E,0x21,0x41, + 0x21,0x1E}; +const u8g_fntpgm_uint8_t fontpage_352_196_196[41] U8G_FONT_SECTION("fontpage_352_196_196") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x7F,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08, + 0x80,0x08,0x80,0x10,0x80,0x11,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_353_180_180[34] U8G_FONT_SECTION("fontpage_353_180_180") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x85,0x85,0x85,0x85,0x87,0x85,0x85,0xFD,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_354_248_248[41] U8G_FONT_SECTION("fontpage_354_248_248") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, + 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_356_132_132[43] U8G_FONT_SECTION("fontpage_356_132_132") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFF,0x00, + 0x00,0x0A,0x0A,0x14,0x0A,0x00,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, + 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_356_244_244[43] U8G_FONT_SECTION("fontpage_356_244_244") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFF,0x00, + 0x00,0x0A,0x0A,0x14,0x0A,0x00,0xFF,0x20,0x00,0x20,0x00,0x20,0x00,0x3F,0x80,0x00, + 0x00,0x00,0x00,0xFF,0xC0,0x12,0x00,0x12,0x00,0x12,0x00}; +const u8g_fntpgm_uint8_t fontpage_357_200_200[34] U8G_FONT_SECTION("fontpage_357_200_200") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x7D,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_357_228_228[45] U8G_FONT_SECTION("fontpage_357_228_228") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE4,0xE4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0x81, + 0x80,0x81,0x00,0x81,0x00,0xFD,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_357_249_249[45] U8G_FONT_SECTION("fontpage_357_249_249") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF9,0xF9,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0x81,0x00,0x81,0x80,0x81, + 0x00,0xFD,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x3E,0x00}; +const u8g_fntpgm_uint8_t fontpage_359_196_196[41] U8G_FONT_SECTION("fontpage_359_196_196") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3F, + 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_359_204_204[45] U8G_FONT_SECTION("fontpage_359_204_204") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x00,0x3F,0x80,0x04,0x00,0xFF, + 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_359_217_217[45] U8G_FONT_SECTION("fontpage_359_217_217") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x3F,0x80,0x04, + 0x00,0xFF,0xC0,0x00,0x00,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00}; +const u8g_fntpgm_uint8_t fontpage_360_152_152[45] U8G_FONT_SECTION("fontpage_360_152_152") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7E, + 0x80,0x10,0x80,0x10,0x80,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_360_156_156[45] U8G_FONT_SECTION("fontpage_360_156_156") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x7C,0x80,0x10, + 0x80,0x10,0x80,0xFF,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_360_168_168[34] U8G_FONT_SECTION("fontpage_360_168_168") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0xF9,0x21,0xFF,0x00,0x7F,0x41, + 0x41,0x7F}; +const u8g_fntpgm_uint8_t fontpage_361_164_164[45] U8G_FONT_SECTION("fontpage_361_164_164") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7C,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7C, + 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_361_220_220[41] U8G_FONT_SECTION("fontpage_361_220_220") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_362_148_148[34] U8G_FONT_SECTION("fontpage_362_148_148") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0x81,0x81,0x81,0x81,0xFD,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_366_252_252[45] U8G_FONT_SECTION("fontpage_366_252_252") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x09,0x00,0xF9,0x00,0x81, + 0x80,0x81,0x00,0x81,0x00,0xFD,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_367_236_236[34] U8G_FONT_SECTION("fontpage_367_236_236") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xEC,0xEC,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF1,0x09,0x09,0xF1,0x87,0x81,0x81,0xF9,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_368_136_136[34] U8G_FONT_SECTION("fontpage_368_136_136") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x15,0x15,0xF5,0x8D,0x85,0x85,0xFD,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_368_165_165[34] U8G_FONT_SECTION("fontpage_368_165_165") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF1,0x17,0xF1,0x87,0x81,0xF9,0x00,0x7F,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_368_220_220[41] U8G_FONT_SECTION("fontpage_368_220_220") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_369_204_204[41] U8G_FONT_SECTION("fontpage_369_204_204") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_370_244_244[41] U8G_FONT_SECTION("fontpage_370_244_244") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_371_172_172[34] U8G_FONT_SECTION("fontpage_371_172_172") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0xF9,0x81,0x81,0x81,0xFD,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_371_176_176[34] U8G_FONT_SECTION("fontpage_371_176_176") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0xF9,0x81,0x81,0xFD,0x01,0x20, + 0x20,0x3F}; +const u8g_fntpgm_uint8_t fontpage_371_189_189[34] U8G_FONT_SECTION("fontpage_371_189_189") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0xF9,0x81,0x81,0xFD,0x00,0x41,0x3F, + 0x41,0x3F}; +const u8g_fntpgm_uint8_t fontpage_371_193_193[34] U8G_FONT_SECTION("fontpage_371_193_193") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0xF9,0x81,0x81,0xFD,0x01,0x3E,0x21, + 0x21,0x3E}; +const u8g_fntpgm_uint8_t fontpage_372_200_200[34] U8G_FONT_SECTION("fontpage_372_200_200") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x8F,0x89,0xF9,0x00,0x3F,0x41, + 0x41,0x3F}; +const u8g_fntpgm_uint8_t fontpage_372_212_212[34] U8G_FONT_SECTION("fontpage_372_212_212") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x95,0x95,0x9D,0x95,0x95,0x95,0xF5,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_372_244_244[34] U8G_FONT_SECTION("fontpage_372_244_244") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x8F,0x89,0x8F,0xF9,0x01,0x21,0x20, + 0x20,0x3F}; +const u8g_fntpgm_uint8_t fontpage_373_168_168[41] U8G_FONT_SECTION("fontpage_373_168_168") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3F, + 0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_373_187_187[45] U8G_FONT_SECTION("fontpage_373_187_187") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBB,0xBB,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x20,0x80,0x20,0x80,0x3F,0x00,0x04, + 0x00,0xFF,0xC0,0x00,0x00,0x04,0x00,0x0C,0x00,0x1A,0x00,0x61,0x80}; +const u8g_fntpgm_uint8_t fontpage_375_248_248[34] U8G_FONT_SECTION("fontpage_375_248_248") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x89,0x89,0x89,0x89,0xF9,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_376_128_128[34] U8G_FONT_SECTION("fontpage_376_128_128") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x89,0x89,0x89,0xF9,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; +const u8g_fntpgm_uint8_t fontpage_376_148_148[45] U8G_FONT_SECTION("fontpage_376_148_148") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x89,0x00,0x89,0x00,0x89,0x00,0xF9,0x00,0x89, + 0x80,0x89,0x00,0x89,0x00,0xF9,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_377_132_132[34] U8G_FONT_SECTION("fontpage_377_132_132") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x89,0x89,0x89,0xFF,0x89,0x89,0x89,0xF9,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_377_160_160[34] U8G_FONT_SECTION("fontpage_377_160_160") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x95,0x95,0x95,0xF5,0x9D,0x95,0x95,0xF5,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_377_168_168[34] U8G_FONT_SECTION("fontpage_377_168_168") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x95,0x95,0xFD,0x95,0xF5,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; +const u8g_fntpgm_uint8_t fontpage_377_248_248[45] U8G_FONT_SECTION("fontpage_377_248_248") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x20,0x80,0x20,0x80,0x3F,0x00,0x20,0x80,0x3F, + 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_380_196_196[34] U8G_FONT_SECTION("fontpage_380_196_196") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x89,0x89,0x89,0xF9,0x89,0x89,0x89,0xF9,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_385_172_172[45] U8G_FONT_SECTION("fontpage_385_172_172") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x61, + 0x80,0x51,0x00,0x99,0x00,0x89,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_385_189_189[45] U8G_FONT_SECTION("fontpage_385_189_189") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBD,0xBD,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x21,0x00,0x21,0x00,0x21,0x00,0x51,0x80,0xD9, + 0x00,0x89,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; +const u8g_fntpgm_uint8_t fontpage_385_200_200[34] U8G_FONT_SECTION("fontpage_385_200_200") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x25,0x25,0x25,0x45,0x67,0x65,0x95,0x95,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_386_164_164[34] U8G_FONT_SECTION("fontpage_386_164_164") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x27,0x51,0x89,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; +const u8g_fntpgm_uint8_t fontpage_387_140_141[69] U8G_FONT_SECTION("fontpage_387_140_141") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x8C,0x8D,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x31, + 0x00,0x44,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x04, + 0x00,0x0C,0x00,0x13,0x00,0x65,0x80,0x04,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x00, + 0x80,0x00,0x80,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_389_164_164[41] U8G_FONT_SECTION("fontpage_389_164_164") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x31, + 0x00,0x40,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_389_172_172[45] U8G_FONT_SECTION("fontpage_389_172_172") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x04,0x00,0x1A,0x00,0x61,0x80,0x00,0x00,0xFF, + 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_389_220_221[51] U8G_FONT_SECTION("fontpage_389_220_221") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xDC,0xDD,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x21,0x21,0x21,0x51,0xC9,0x89,0x01, + 0x01,0x01,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x21,0x21,0x21,0x51,0xD9,0x89,0x00,0x7F, + 0x01,0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_395_180_180[34] U8G_FONT_SECTION("fontpage_395_180_180") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB4,0xB4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x8F,0x89,0x89,0x89,0x71,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_395_198_198[45] U8G_FONT_SECTION("fontpage_395_198_198") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x89,0x00,0x8F,0x00,0x89,0x00,0x89, + 0x00,0x71,0x00,0x00,0x00,0x4A,0x00,0x72,0x00,0x4D,0x00,0x74,0x80}; +const u8g_fntpgm_uint8_t fontpage_395_209_209[34] U8G_FONT_SECTION("fontpage_395_209_209") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x65,0x95,0x95,0x9D,0x95,0x65,0x00,0x7F,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_395_212_212[45] U8G_FONT_SECTION("fontpage_395_212_212") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x65,0x00,0x95,0x00,0x95,0x00,0x9D,0x00,0x95, + 0x00,0x65,0x00,0x05,0x00,0x25,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_395_244_244[34] U8G_FONT_SECTION("fontpage_395_244_244") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x8F,0x89,0x8F,0x71,0x00,0x3F,0x01,0x3F, + 0x40,0x3F}; +const u8g_fntpgm_uint8_t fontpage_396_136_136[34] U8G_FONT_SECTION("fontpage_396_136_136") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x65,0x95,0x9D,0x95,0x95,0x9D,0x95,0x65,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_396_164_164[41] U8G_FONT_SECTION("fontpage_396_164_164") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, + 0x00,0x1E,0x00,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_396_168_168[45] U8G_FONT_SECTION("fontpage_396_168_168") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00,0x04, + 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x20,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_396_196_196[45] U8G_FONT_SECTION("fontpage_396_196_196") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x44,0x80,0x44,0x80,0x44,0x80,0x38, + 0xC0,0x10,0x80,0xFE,0x80,0x00,0x80,0x20,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_397_208_208[34] U8G_FONT_SECTION("fontpage_397_208_208") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x71,0x01,0xFF,0x21,0x27,0x41, + 0x40,0x7F}; +const u8g_fntpgm_uint8_t fontpage_398_132_132[45] U8G_FONT_SECTION("fontpage_398_132_132") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x44,0x80,0x42,0x80,0x44,0x80,0x38, + 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_398_188_188[41] U8G_FONT_SECTION("fontpage_398_188_188") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x21, + 0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_398_204_204[45] U8G_FONT_SECTION("fontpage_398_204_204") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x21,0x00,0x21,0x00,0x1E,0x00,0x00, + 0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x20,0x80,0x20,0x80,0x3F,0x00}; +const u8g_fntpgm_uint8_t fontpage_398_244_244[34] U8G_FONT_SECTION("fontpage_398_244_244") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x49,0x89,0x89,0x89,0x89,0x49,0x71,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_398_252_253[51] U8G_FONT_SECTION("fontpage_398_252_253") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFC,0xFD,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x71,0x00,0x3F,0x01,0x3F, + 0x40,0x3F,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x71,0x00,0x77,0x11, + 0x71,0x41,0x79}; +const u8g_fntpgm_uint8_t fontpage_399_133_133[34] U8G_FONT_SECTION("fontpage_399_133_133") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x85,0x85,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x89,0x89,0x89,0x89,0x71,0x00,0x41,0x3F, + 0x41,0x3F}; +const u8g_fntpgm_uint8_t fontpage_399_144_145[73] U8G_FONT_SECTION("fontpage_399_144_145") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x11,0x00,0x21, + 0x80,0x71,0x00,0xC9,0x00,0x85,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x09,0x0B,0x16, + 0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x49,0x00,0x85,0x00,0x00, + 0x00,0x7E,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_399_152_152[45] U8G_FONT_SECTION("fontpage_399_152_152") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x11,0x00,0x11,0x80,0x79,0x00,0x85, + 0x00,0x00,0x00,0x7E,0x00,0x01,0x00,0x7E,0x00,0x40,0x00,0x7F,0x00}; +const u8g_fntpgm_uint8_t fontpage_399_165_165[45] U8G_FONT_SECTION("fontpage_399_165_165") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x11,0x00,0x31,0x80,0x79, + 0x00,0x85,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x3E,0x00}; +const u8g_fntpgm_uint8_t fontpage_399_172_172[45] U8G_FONT_SECTION("fontpage_399_172_172") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7A,0x80,0x0A,0x80,0x0A,0x80,0x12,0x80,0x13, + 0x80,0x2A,0x80,0x6A,0x80,0xC6,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; +const u8g_fntpgm_uint8_t fontpage_400_128_128[34] U8G_FONT_SECTION("fontpage_400_128_128") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x11,0x17,0x31,0x71,0xC9,0x85,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_400_132_132[34] U8G_FONT_SECTION("fontpage_400_132_132") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x17,0x31,0x49,0x85,0x01,0x21,0x20, + 0x20,0x3F}; +const u8g_fntpgm_uint8_t fontpage_400_149_149[34] U8G_FONT_SECTION("fontpage_400_149_149") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x17,0x31,0x49,0x85,0x00,0x3E,0x21, + 0x21,0x3E}; +const u8g_fntpgm_uint8_t fontpage_400_156_156[45] U8G_FONT_SECTION("fontpage_400_156_156") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x7A,0x80,0x0A,0x80,0x0A,0x80,0x16,0x80,0x12, + 0x80,0x2A,0x80,0x4A,0x80,0x86,0x80,0x02,0x80,0x02,0x80,0x02,0x80}; +const u8g_fntpgm_uint8_t fontpage_401_253_253[45] U8G_FONT_SECTION("fontpage_401_253_253") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xFD,0xFD,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, + 0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x00,0x80,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_402_128_128[45] U8G_FONT_SECTION("fontpage_402_128_128") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, + 0x00,0xFF,0xC0,0x04,0x00,0x24,0x00,0x24,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_402_145_145[45] U8G_FONT_SECTION("fontpage_402_145_145") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x91,0x91,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x01,0x00,0x0E,0x00,0x71,0x80,0x00, + 0x00,0xFF,0xC0,0x04,0x00,0x1F,0x00,0x20,0x80,0x20,0x80,0x1F,0x00}; +const u8g_fntpgm_uint8_t fontpage_403_144_144[45] U8G_FONT_SECTION("fontpage_403_144_144") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x3F,0x00,0x0E,0x00,0x71,0x80,0x00,0x00,0xFF, + 0xC0,0x00,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_403_192_192[34] U8G_FONT_SECTION("fontpage_403_192_192") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x09,0x11,0x31,0x31,0xC9,0x85,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_409_152_152[34] U8G_FONT_SECTION("fontpage_409_152_152") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x11,0x17,0x31,0x49,0x85,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_410_136_136[41] U8G_FONT_SECTION("fontpage_410_136_136") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x1E,0x00,0x00,0x00,0x3F,0x00,0x02,0x00,0x0E, + 0x00,0x71,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_411_149_149[45] U8G_FONT_SECTION("fontpage_411_149_149") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x73, + 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_411_156_156[47] U8G_FONT_SECTION("fontpage_411_156_156") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFD,0x00, + 0x00,0x0A,0x0C,0x18,0x0A,0x00,0xFD,0x1E,0x00,0x00,0x00,0x3F,0x00,0x1A,0x00,0x21, + 0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x00,0x80,0x3F,0x00,0x20,0x00,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_411_164_164[45] U8G_FONT_SECTION("fontpage_411_164_164") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA4,0xA4,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x1E,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x73, + 0x80,0x00,0x00,0xFF,0xC0,0x04,0x00,0x3F,0x00,0x20,0x80,0x3F,0x00}; +const u8g_fntpgm_uint8_t fontpage_411_232_232[45] U8G_FONT_SECTION("fontpage_411_232_232") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x00,0x80,0x7C,0x80,0x18,0x80,0x66, + 0x80,0x00,0x80,0xFE,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_412_216_216[34] U8G_FONT_SECTION("fontpage_412_216_216") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x09,0x11,0x31,0x49,0x85,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_412_232_232[34] U8G_FONT_SECTION("fontpage_412_232_232") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE8,0xE8,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xF9,0x09,0x31,0xCD,0x00,0x3F,0x41, + 0x41,0x3F}; +const u8g_fntpgm_uint8_t fontpage_412_244_244[45] U8G_FONT_SECTION("fontpage_412_244_244") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xF4,0xF4,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x09,0x00,0x09,0x00,0xF1,0x00,0x11, + 0x80,0x21,0x00,0x41,0x00,0x81,0x00,0x01,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_414_156_156[34] U8G_FONT_SECTION("fontpage_414_156_156") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x09,0x0F,0xF1,0x11,0x2F,0x41,0x81,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_417_209_209[45] U8G_FONT_SECTION("fontpage_417_209_209") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0xF9,0x00,0x81,0x00,0xF9,0x80,0x81,0x00,0x81, + 0x00,0xFD,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; +const u8g_fntpgm_uint8_t fontpage_418_176_176[34] U8G_FONT_SECTION("fontpage_418_176_176") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB0,0xB0,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF9,0x81,0x81,0xF7,0x81,0x81,0x81,0xF9,0x01, + 0x01,0x01}; +const u8g_fntpgm_uint8_t fontpage_418_204_204[34] U8G_FONT_SECTION("fontpage_418_204_204") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0xF5,0x85,0x85,0xED,0x85,0x85,0x85,0xFD,0x05, + 0x05,0x05}; +const u8g_fntpgm_uint8_t fontpage_419_160_160[41] U8G_FONT_SECTION("fontpage_419_160_160") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_421_184_184[41] U8G_FONT_SECTION("fontpage_421_184_184") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xB8,0xB8,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x20, + 0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_423_156_156[45] U8G_FONT_SECTION("fontpage_423_156_156") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x9C,0x9C,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0xFA,0x80,0x4A,0x80,0x4E,0x80,0x4A,0x80,0x4A, + 0x80,0xFE,0x80,0x02,0x80,0x12,0x80,0x10,0x00,0x10,0x00,0x1F,0xC0}; +const u8g_fntpgm_uint8_t fontpage_426_132_132[41] U8G_FONT_SECTION("fontpage_426_132_132") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x09,0x00,0x00, + 0x00,0x0A,0x09,0x12,0x0A,0x00,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x12,0x00,0x12, + 0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_426_216_216[45] U8G_FONT_SECTION("fontpage_426_216_216") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x01,0x00,0xFD,0x00,0x01,0x00,0x71, + 0x80,0x89,0x00,0x89,0x00,0x89,0x00,0x71,0x00,0x01,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_426_233_233[45] U8G_FONT_SECTION("fontpage_426_233_233") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x09,0xFE,0x00, + 0x00,0x09,0x0B,0x16,0x0A,0x01,0xFE,0x71,0x00,0x01,0x00,0xFD,0x00,0x49,0x80,0x89, + 0x00,0x79,0x00,0x00,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x7E,0x00}; +const u8g_fntpgm_uint8_t fontpage_428_200_200[45] U8G_FONT_SECTION("fontpage_428_200_200") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x0E,0x00,0x00,0x00,0x7F,0x80,0x21,0x00,0x1E, + 0x00,0x04,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x20,0x80,0x3F,0x00}; +const u8g_fntpgm_uint8_t fontpage_428_212_212[45] U8G_FONT_SECTION("fontpage_428_212_212") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x09,0xFE,0x00, + 0x00,0x0A,0x0B,0x16,0x0A,0x00,0xFE,0x38,0x80,0x00,0x80,0x7E,0x80,0x00,0x80,0x38, + 0x80,0x44,0xC0,0x3C,0x80,0x10,0x80,0xFE,0x80,0x00,0x80,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_431_136_136[34] U8G_FONT_SECTION("fontpage_431_136_136") = { + 0x00,0x0B,0x0D,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x00,0x09,0xFE,0x00, + 0x00,0x08,0x0B,0x0B,0x0A,0x01,0xFE,0x71,0x01,0xFD,0x01,0x71,0x49,0x89,0x49,0x71, + 0x01,0x01}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(344, 240, 240, fontpage_344_240_240), // '거' -- '거' + FONTDATA_ITEM(345, 224, 224, fontpage_345_224_224), // '고' -- '고' + FONTDATA_ITEM(347, 248, 248, fontpage_347_248_248), // '그' -- '그' + FONTDATA_ITEM(348, 137, 137, fontpage_348_137_137), // '급' -- '급' + FONTDATA_ITEM(348, 176, 176, fontpage_348_176_176), // '기' -- '기' + FONTDATA_ITEM(348, 197, 197, fontpage_348_197_197), // '깅' -- '깅' + FONTDATA_ITEM(352, 196, 196, fontpage_352_196_196), // '끄' -- '끄' + FONTDATA_ITEM(353, 180, 180, fontpage_353_180_180), // '내' -- '내' + FONTDATA_ITEM(354, 248, 248, fontpage_354_248_248), // '노' -- '노' + FONTDATA_ITEM(356, 132, 132, fontpage_356_132_132), // '누' -- '누' + FONTDATA_ITEM(356, 244, 244, fontpage_356_244_244), // '뉴' -- '뉴' + FONTDATA_ITEM(357, 200, 200, fontpage_357_200_200), // '니' -- '니' + FONTDATA_ITEM(357, 228, 228, fontpage_357_228_228), // '다' -- '다' + FONTDATA_ITEM(357, 249, 249, fontpage_357_249_249), // '당' -- '당' + FONTDATA_ITEM(359, 196, 196, fontpage_359_196_196), // '도' -- '도' + FONTDATA_ITEM(359, 204, 204, fontpage_359_204_204), // '돌' -- '돌' + FONTDATA_ITEM(359, 217, 217, fontpage_359_217_217), // '동' -- '동' + FONTDATA_ITEM(360, 152, 152, fontpage_360_152_152), // '되' -- '되' + FONTDATA_ITEM(360, 156, 156, fontpage_360_156_156), // '된' -- '된' + FONTDATA_ITEM(360, 168, 168, fontpage_360_168_168), // '됨' -- '됨' + FONTDATA_ITEM(361, 164, 164, fontpage_361_164_164), // '뒤' -- '뒤' + FONTDATA_ITEM(361, 220, 220, fontpage_361_220_220), // '드' -- '드' + FONTDATA_ITEM(362, 148, 148, fontpage_362_148_148), // '디' -- '디' + FONTDATA_ITEM(366, 252, 252, fontpage_366_252_252), // '라' -- '라' + FONTDATA_ITEM(367, 236, 236, fontpage_367_236_236), // '러' -- '러' + FONTDATA_ITEM(368, 136, 136, fontpage_368_136_136), // '레' -- '레' + FONTDATA_ITEM(368, 165, 165, fontpage_368_165_165), // '력' -- '력' + FONTDATA_ITEM(368, 220, 220, fontpage_368_220_220), // '로' -- '로' + FONTDATA_ITEM(369, 204, 204, fontpage_369_204_204), // '료' -- '료' + FONTDATA_ITEM(370, 244, 244, fontpage_370_244_244), // '르' -- '르' + FONTDATA_ITEM(371, 172, 172, fontpage_371_172_172), // '리' -- '리' + FONTDATA_ITEM(371, 176, 176, fontpage_371_176_176), // '린' -- '린' + FONTDATA_ITEM(371, 189, 189, fontpage_371_189_189), // '립' -- '립' + FONTDATA_ITEM(371, 193, 193, fontpage_371_193_193), // '링' -- '링' + FONTDATA_ITEM(372, 200, 200, fontpage_372_200_200), // '멈' -- '멈' + FONTDATA_ITEM(372, 212, 212, fontpage_372_212_212), // '메' -- '메' + FONTDATA_ITEM(372, 244, 244, fontpage_372_244_244), // '면' -- '면' + FONTDATA_ITEM(373, 168, 168, fontpage_373_168_168), // '모' -- '모' + FONTDATA_ITEM(373, 187, 187, fontpage_373_187_187), // '못' -- '못' + FONTDATA_ITEM(375, 248, 248, fontpage_375_248_248), // '미' -- '미' + FONTDATA_ITEM(376, 128, 128, fontpage_376_128_128), // '밀' -- '밀' + FONTDATA_ITEM(376, 148, 148, fontpage_376_148_148), // '바' -- '바' + FONTDATA_ITEM(377, 132, 132, fontpage_377_132_132), // '버' -- '버' + FONTDATA_ITEM(377, 160, 160, fontpage_377_160_160), // '베' -- '베' + FONTDATA_ITEM(377, 168, 168, fontpage_377_168_168), // '벨' -- '벨' + FONTDATA_ITEM(377, 248, 248, fontpage_377_248_248), // '본' -- '본' + FONTDATA_ITEM(380, 196, 196, fontpage_380_196_196), // '비' -- '비' + FONTDATA_ITEM(385, 172, 172, fontpage_385_172_172), // '사' -- '사' + FONTDATA_ITEM(385, 189, 189, fontpage_385_189_189), // '삽' -- '삽' + FONTDATA_ITEM(385, 200, 200, fontpage_385_200_200), // '새' -- '새' + FONTDATA_ITEM(386, 164, 164, fontpage_386_164_164), // '설' -- '설' + FONTDATA_ITEM(387, 140, 141, fontpage_387_140_141), // '소' -- '속' + FONTDATA_ITEM(389, 164, 164, fontpage_389_164_164), // '스' -- '스' + FONTDATA_ITEM(389, 172, 172, fontpage_389_172_172), // '슬' -- '슬' + FONTDATA_ITEM(389, 220, 221, fontpage_389_220_221), // '시' -- '식' + FONTDATA_ITEM(395, 180, 180, fontpage_395_180_180), // '어' -- '어' + FONTDATA_ITEM(395, 198, 198, fontpage_395_198_198), // '없' -- '없' + FONTDATA_ITEM(395, 209, 209, fontpage_395_209_209), // '엑' -- '엑' + FONTDATA_ITEM(395, 212, 212, fontpage_395_212_212), // '엔' -- '엔' + FONTDATA_ITEM(395, 244, 244, fontpage_395_244_244), // '열' -- '열' + FONTDATA_ITEM(396, 136, 136, fontpage_396_136_136), // '예' -- '예' + FONTDATA_ITEM(396, 164, 164, fontpage_396_164_164), // '오' -- '오' + FONTDATA_ITEM(396, 168, 168, fontpage_396_168_168), // '온' -- '온' + FONTDATA_ITEM(396, 196, 196, fontpage_396_196_196), // '완' -- '완' + FONTDATA_ITEM(397, 208, 208, fontpage_397_208_208), // '원' -- '원' + FONTDATA_ITEM(398, 132, 132, fontpage_398_132_132), // '위' -- '위' + FONTDATA_ITEM(398, 188, 188, fontpage_398_188_188), // '으' -- '으' + FONTDATA_ITEM(398, 204, 204, fontpage_398_204_204), // '음' -- '음' + FONTDATA_ITEM(398, 244, 244, fontpage_398_244_244), // '이' -- '이' + FONTDATA_ITEM(398, 252, 253, fontpage_398_252_253), // '일' -- '읽' + FONTDATA_ITEM(399, 133, 133, fontpage_399_133_133), // '입' -- '입' + FONTDATA_ITEM(399, 144, 145, fontpage_399_144_145), // '자' -- '작' + FONTDATA_ITEM(399, 152, 152, fontpage_399_152_152), // '잘' -- '잘' + FONTDATA_ITEM(399, 165, 165, fontpage_399_165_165), // '장' -- '장' + FONTDATA_ITEM(399, 172, 172, fontpage_399_172_172), // '재' -- '재' + FONTDATA_ITEM(400, 128, 128, fontpage_400_128_128), // '저' -- '저' + FONTDATA_ITEM(400, 132, 132, fontpage_400_132_132), // '전' -- '전' + FONTDATA_ITEM(400, 149, 149, fontpage_400_149_149), // '정' -- '정' + FONTDATA_ITEM(400, 156, 156, fontpage_400_156_156), // '제' -- '제' + FONTDATA_ITEM(401, 253, 253, fontpage_401_253_253), // '죽' -- '죽' + FONTDATA_ITEM(402, 128, 128, fontpage_402_128_128), // '준' -- '준' + FONTDATA_ITEM(402, 145, 145, fontpage_402_145_145), // '중' -- '중' + FONTDATA_ITEM(403, 144, 144, fontpage_403_144_144), // '즐' -- '즐' + FONTDATA_ITEM(403, 192, 192, fontpage_403_192_192), // '지' -- '지' + FONTDATA_ITEM(409, 152, 152, fontpage_409_152_152), // '처' -- '처' + FONTDATA_ITEM(410, 136, 136, fontpage_410_136_136), // '초' -- '초' + FONTDATA_ITEM(411, 149, 149, fontpage_411_149_149), // '축' -- '축' + FONTDATA_ITEM(411, 156, 156, fontpage_411_156_156), // '출' -- '출' + FONTDATA_ITEM(411, 164, 164, fontpage_411_164_164), // '춤' -- '춤' + FONTDATA_ITEM(411, 232, 232, fontpage_411_232_232), // '취' -- '취' + FONTDATA_ITEM(412, 216, 216, fontpage_412_216_216), // '치' -- '치' + FONTDATA_ITEM(412, 232, 232, fontpage_412_232_232), // '침' -- '침' + FONTDATA_ITEM(412, 244, 244, fontpage_412_244_244), // '카' -- '카' + FONTDATA_ITEM(414, 156, 156, fontpage_414_156_156), // '켜' -- '켜' + FONTDATA_ITEM(417, 209, 209, fontpage_417_209_209), // '탑' -- '탑' + FONTDATA_ITEM(418, 176, 176, fontpage_418_176_176), // '터' -- '터' + FONTDATA_ITEM(418, 204, 204, fontpage_418_204_204), // '테' -- '테' + FONTDATA_ITEM(419, 160, 160, fontpage_419_160_160), // '토' -- '토' + FONTDATA_ITEM(421, 184, 184, fontpage_421_184_184), // '트' -- '트' + FONTDATA_ITEM(423, 156, 156, fontpage_423_156_156), // '펜' -- '펜' + FONTDATA_ITEM(426, 132, 132, fontpage_426_132_132), // '프' -- '프' + FONTDATA_ITEM(426, 216, 216, fontpage_426_216_216), // '하' -- '하' + FONTDATA_ITEM(426, 233, 233, fontpage_426_233_233), // '합' -- '합' + FONTDATA_ITEM(428, 200, 200, fontpage_428_200_200), // '홈' -- '홈' + FONTDATA_ITEM(428, 212, 212, fontpage_428_212_212), // '화' -- '화' + FONTDATA_ITEM(431, 136, 136, fontpage_431_136_136), // '히' -- '히' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_nl.h b/Marlin/src/lcd/dogm/fontdata/langdata_nl.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_nl.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/dogm/fontdata/langdata_pl.h b/Marlin/src/lcd/dogm/fontdata/langdata_pl.h new file mode 100644 index 00000000..926f0752 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_pl.h @@ -0,0 +1,40 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_132_133[45] U8G_FONT_SECTION("fontpage_2_132_133") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x10,0x08, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x08,0x78,0x88,0x78,0x20,0x30}; +const u8g_fntpgm_uint8_t fontpage_2_135_135[31] U8G_FONT_SECTION("fontpage_2_135_135") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x87,0x87,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_2_153_153[30] U8G_FONT_SECTION("fontpage_2_153_153") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x99,0x99,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0xFE,0x70,0x88,0xF0,0x80,0x70,0x20,0x30}; +const u8g_fntpgm_uint8_t fontpage_2_193_196[73] U8G_FONT_SECTION("fontpage_2_193_196") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC4,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0x60,0xC0,0x40,0x40,0x78,0x03,0x07, + 0x07,0x06,0x01,0x00,0xC0,0x40,0x60,0xC0,0x40,0x40,0xE0,0x05,0x0A,0x0A,0x06,0x00, + 0x00,0x10,0x20,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x05,0x08,0x08,0x06,0x00, + 0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_218_219[47] U8G_FONT_SECTION("fontpage_2_218_219") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDA,0xDB,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x10,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; +const u8g_fntpgm_uint8_t fontpage_2_252_252[30] U8G_FONT_SECTION("fontpage_2_252_252") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 132, 133, fontpage_2_132_133), // 'Ą' -- 'ą' + FONTDATA_ITEM(2, 135, 135, fontpage_2_135_135), // 'ć' -- 'ć' + FONTDATA_ITEM(2, 153, 153, fontpage_2_153_153), // 'ę' -- 'ę' + FONTDATA_ITEM(2, 193, 196, fontpage_2_193_196), // 'Ł' -- 'ń' + FONTDATA_ITEM(2, 218, 219, fontpage_2_218_219), // 'Ś' -- 'ś' + FONTDATA_ITEM(2, 252, 252, fontpage_2_252_252), // 'ż' -- 'ż' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_pt.h b/Marlin/src/lcd/dogm/fontdata/langdata_pt.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_pt.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/dogm/fontdata/langdata_pt_br.h b/Marlin/src/lcd/dogm/fontdata/langdata_pt_br.h new file mode 100644 index 00000000..ffda8276 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_pt_br.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/dogm/fontdata/langdata_ro.h b/Marlin/src/lcd/dogm/fontdata/langdata_ro.h new file mode 100644 index 00000000..ffda8276 --- /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/dogm/fontdata/langdata_ru.h b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h new file mode 100644 index 00000000..4edd6e74 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_ru.h @@ -0,0 +1,73 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_8_144_168[348] U8G_FONT_SECTION("fontpage_8_144_168") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, + 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, + 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,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,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, + 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, + 0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8}; +const u8g_fntpgm_uint8_t fontpage_8_171_173[56] U8G_FONT_SECTION("fontpage_8_171_173") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAB,0xAD,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0xA8,0xC8,0x04,0x07, + 0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x08,0x78,0x08,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_175_207[400] U8G_FONT_SECTION("fontpage_8_175_207") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xCF,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, + 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, + 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8,0xA8,0xA8, + 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, + 0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08,0x05,0x05, + 0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x88,0xC8,0xA8,0xC8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0xE0,0x04, + 0x05,0x05,0x06,0x01,0x00,0xE0,0x10,0x70,0x10,0xE0,0x05,0x05,0x05,0x06,0x00,0x00, + 0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70,0x50,0x90 + }; +const u8g_fntpgm_uint8_t fontpage_8_209_209[30] U8G_FONT_SECTION("fontpage_8_209_209") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 144, 168, fontpage_8_144_168), // 'А' -- 'Ш' + FONTDATA_ITEM(8, 171, 173, fontpage_8_171_173), // 'Ы' -- 'Э' + FONTDATA_ITEM(8, 175, 207, fontpage_8_175_207), // 'Я' -- 'я' + FONTDATA_ITEM(8, 209, 209, fontpage_8_209_209), // 'ё' -- 'ё' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_sk.h b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h new file mode 100644 index 00000000..d2e7ec2c --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_sk.h @@ -0,0 +1,48 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_140_143[79] U8G_FONT_SECTION("fontpage_2_140_143") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8F,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x88,0x70,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x06, + 0x0A,0x0A,0x06,0x00,0x00,0x14,0x08,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_186_186[33] U8G_FONT_SECTION("fontpage_2_186_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, + 0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88}; +const u8g_fntpgm_uint8_t fontpage_2_224_225[47] U8G_FONT_SECTION("fontpage_2_224_225") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE0,0xE1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88, + 0x70,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0x78,0x80,0x70,0x08,0xF0}; +const u8g_fntpgm_uint8_t fontpage_2_229_229[33] U8G_FONT_SECTION("fontpage_2_229_229") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x20, + 0x18}; +const u8g_fntpgm_uint8_t fontpage_2_253_254[47] U8G_FONT_SECTION("fontpage_2_253_254") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFD,0xFE,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80, + 0xF8,0x05,0x08,0x08,0x06,0x00,0x00,0x50,0x20,0x00,0xF8,0x10,0x20,0x40,0xF8}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +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), // 'ť' -- 'ť' + FONTDATA_ITEM(2, 253, 254, fontpage_2_253_254), // 'Ž' -- 'ž' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_test.h b/Marlin/src/lcd/dogm/fontdata/langdata_test.h new file mode 100644 index 00000000..c397d8b4 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_test.h @@ -0,0 +1,231 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_8_128_255[1677] U8G_FONT_SECTION("fontpage_8_128_255") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80, + 0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, + 0x05,0x09,0x09,0x06,0x00,0xFE,0xE0,0x40,0x40,0x70,0x48,0x48,0x48,0x08,0x30,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0xF0,0x80,0x88,0x70,0x05,0x07,0x07,0x06, + 0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x03,0x07,0x07,0x06,0x01,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,0x38,0x10,0x10,0x10,0x10, + 0x90,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x60,0xA0,0xA0,0xB0,0xA8,0xA8,0xB0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xA0,0xA0,0xA0,0xF0,0xA8,0xA8,0xB0,0x05,0x07,0x07,0x06, + 0x00,0x00,0xE0,0x40,0x40,0x70,0x48,0x48,0x48,0x05,0x0A,0x0A,0x06,0x00,0x00,0x10, + 0x20,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x40, + 0x20,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88, + 0x70,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x88, + 0x88,0x88,0x88,0x88,0x88,0xF8,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88, + 0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88, + 0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0x50,0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00, + 0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70, + 0x20,0x70,0xA8,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88, + 0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A, + 0x0A,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88, + 0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06, + 0x00,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x80,0x80,0x80,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,0x78,0x08,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07, + 0x06,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE, + 0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88, + 0x88,0x88,0x78,0x08,0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, + 0xA8,0xA8,0xF8,0x05,0x09,0x09,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x70,0x05, + 0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0xA8,0xC8,0x04,0x07,0x07,0x06, + 0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x88,0x08,0x78,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0xA8,0xA8,0xE8, + 0xA8,0xA8,0x90,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88, + 0xF0,0x88,0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06, + 0x06,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x70,0x88,0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88, + 0x98,0xA8,0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05, + 0x05,0x05,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00, + 0x88,0xD8,0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88, + 0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0xF8,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88, + 0xF0,0x80,0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05, + 0x05,0x06,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88, + 0x88,0x88,0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8, + 0xA8,0xA8,0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05, + 0x06,0x00,0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8, + 0xA8,0xA8,0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08, + 0x05,0x05,0x05,0x06,0x00,0x00,0xC0,0x40,0x70,0x48,0x70,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0xC8,0xA8,0xC8,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90, + 0xE0,0x04,0x05,0x05,0x06,0x01,0x00,0xE0,0x10,0x70,0x10,0xE0,0x05,0x05,0x05,0x06, + 0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x90,0x70, + 0x50,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF0,0x80,0x70, + 0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x00,0x70,0x88,0xF0,0x80,0x70,0x05,0x09,0x09, + 0x06,0x00,0xFE,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x08,0x10,0x05,0x08,0x08,0x06, + 0x00,0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0x80,0x80,0x04,0x05,0x05,0x06,0x01,0x00, + 0x70,0x80,0xE0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x78,0x80,0x70,0x08,0xF0, + 0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06,0x06, + 0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0,0x04,0x08,0x08,0x06,0x01,0xFE,0x10,0x00, + 0x30,0x10,0x10,0x10,0x90,0x60,0x05,0x05,0x05,0x06,0x00,0x00,0x60,0xA0,0xB0,0xA8, + 0xB0,0x05,0x05,0x05,0x06,0x00,0x00,0xA0,0xA0,0xF0,0xA8,0xB0,0x05,0x07,0x07,0x06, + 0x00,0x00,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x04,0x08,0x08,0x06,0x01,0x00,0x20, + 0x40,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x08,0x08,0x06,0x00,0x00,0x40,0x20,0x00, + 0x88,0x98,0xA8,0xC8,0x88,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x88,0x70,0x00,0x88,0x88, + 0x88,0x88,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88,0x88,0xF8, + 0x20,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x05, + 0x05,0x05,0x06,0x00,0x00,0x50,0x88,0xA8,0xA8,0x50,0x05,0x07,0x07,0x06,0x00,0x00, + 0x40,0xF0,0x40,0x70,0x48,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF0, + 0x40,0x70,0x48,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x98,0xA0,0xA0,0xF8,0xA0,0xA0, + 0x98,0x05,0x05,0x05,0x06,0x00,0x00,0x98,0xA0,0xF8,0xA0,0x98,0x05,0x07,0x07,0x06, + 0x00,0x00,0x20,0x50,0x50,0x88,0xF8,0xA8,0xA8,0x05,0x06,0x06,0x06,0x00,0x00,0x20, + 0x50,0x50,0x88,0xF8,0xA8,0x05,0x07,0x07,0x06,0x00,0x00,0x90,0x90,0xB8,0xF8,0xB8, + 0xB8,0xB8,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0x90,0xF8,0xB8,0xB8,0x05,0x08,0x08, + 0x06,0x00,0x00,0xF8,0x88,0x50,0x50,0x70,0xA8,0xA8,0xA8,0x05,0x06,0x06,0x06,0x00, + 0x00,0xF8,0x88,0x50,0x70,0xA8,0xA8,0x06,0x08,0x08,0x06,0x00,0x00,0xFC,0xC4,0xA8, + 0x90,0xF8,0xB8,0xB8,0xA8,0x06,0x06,0x06,0x06,0x00,0x00,0xFC,0xA8,0x90,0xF8,0xB8, + 0xA8,0x05,0x0C,0x0C,0x06,0x00,0xFE,0x50,0x20,0x00,0x70,0x88,0x08,0x30,0x08,0x08, + 0x70,0x80,0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x50,0x20,0x00,0x70,0x88,0x30,0x08, + 0x70,0x80,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x20,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF8,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20, + 0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x0A,0x0A,0x06,0x00, + 0x00,0x90,0x48,0x00,0x88,0x90,0x90,0x50,0x50,0x50,0x20,0x05,0x08,0x08,0x06,0x00, + 0x00,0x90,0x48,0x00,0x88,0x90,0x50,0x50,0x20,0x05,0x09,0x09,0x06,0x00,0xFE,0x40, + 0xA0,0xA0,0xB8,0xB8,0xB8,0x58,0x08,0x10,0x05,0x07,0x07,0x06,0x00,0xFE,0x58,0xB8, + 0xB8,0xB8,0x58,0x08,0x10,0x05,0x0A,0x0A,0x06,0x00,0xFF,0x20,0x70,0xA8,0x88,0x88, + 0x88,0x88,0xA8,0x70,0x20,0x05,0x08,0x08,0x06,0x00,0xFF,0x20,0x70,0xA8,0x88,0x88, + 0xA8,0x70,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x70,0x00,0x20,0x20,0x88,0x88,0x88, + 0xA8,0x50,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0x20,0xA8,0x88,0xA8,0x50,0x05, + 0x0A,0x0A,0x06,0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x05, + 0x08,0x08,0x06,0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0xA8,0xA8,0x50}; +const u8g_fntpgm_uint8_t fontpage_97_129_191[911] U8G_FONT_SECTION("fontpage_97_129_191") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x81,0xBF,0x00,0x0D,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x04,0x00,0x4E,0x00,0x55,0x00,0x64, + 0x80,0x48,0x40,0xA8,0x40,0x90,0x40,0x90,0x80,0x61,0x00,0x06,0x00,0x08,0x0B,0x0B, + 0x0C,0x01,0xFF,0x20,0x10,0x70,0x1C,0x28,0xE2,0x39,0x21,0x21,0x12,0x0C,0x08,0x07, + 0x07,0x0C,0x02,0xFF,0x28,0x2E,0xF5,0x21,0x16,0x10,0x10,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x02,0x00,0x37,0x00,0x20,0x00,0x13,0xC0,0x9C,0x20,0x70,0x20,0x09,0xC0,0x08, + 0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x07,0x07,0x07,0x0C,0x03,0xFF,0x10,0x9C,0xB2, + 0xD2,0x9C,0x10,0x20,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x82,0x00,0x47,0x80, + 0x4A,0x40,0x52,0x20,0x62,0x20,0x6A,0x40,0x47,0x80,0x42,0x00,0x04,0x00,0x08,0x00, + 0x07,0x07,0x07,0x0C,0x02,0xFF,0x10,0x1C,0x10,0x10,0x78,0x96,0x60,0x09,0x0B,0x16, + 0x0C,0x01,0xFF,0x10,0x00,0x08,0x00,0x09,0x80,0x0E,0x00,0x08,0x00,0x08,0x00,0x08, + 0x00,0x78,0x00,0x8E,0x00,0x89,0x80,0x70,0x00,0x07,0x0B,0x0B,0x0C,0x02,0xFF,0x20, + 0x18,0x40,0x80,0x80,0xBC,0xC2,0x82,0x02,0x0C,0x70,0x07,0x0B,0x0B,0x0C,0x02,0xFF, + 0x88,0x54,0x52,0x62,0x62,0x42,0x42,0x04,0x04,0x08,0x10,0x08,0x0A,0x0A,0x0C,0x01, + 0xFF,0x4E,0x34,0x08,0x10,0x3E,0x61,0x81,0x19,0x26,0x1C,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x20,0x00,0x10,0x00,0x13,0x00,0x34,0x80,0xD8,0x80,0x10,0x80,0x10,0x80,0x30, + 0x80,0x50,0x80,0xB0,0x60,0x10,0x00,0x08,0x0A,0x0A,0x0C,0x01,0xFF,0x4E,0x34,0x08, + 0x10,0x3E,0x61,0x81,0x01,0x06,0x18,0x08,0x07,0x07,0x0C,0x02,0xFF,0x40,0x30,0xEE, + 0x31,0x61,0xA2,0x24,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x10,0x00,0x10,0x00, + 0x9B,0x80,0x7C,0x40,0x10,0x20,0x10,0x20,0x30,0x20,0x50,0x40,0xB1,0x80,0x10,0x00, + 0x0A,0x0A,0x14,0x0C,0x01,0xFF,0x4E,0x00,0x34,0x00,0x04,0x00,0x1F,0x00,0x28,0x80, + 0x48,0x40,0x90,0x40,0x96,0x40,0x69,0x80,0x47,0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF, + 0x20,0x00,0x1F,0x00,0x04,0x00,0x1F,0x00,0x20,0x80,0x4C,0x80,0x13,0x00,0x0C,0x00, + 0x00,0x00,0x59,0x80,0x86,0x40,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00, + 0x9E,0x00,0x70,0x00,0x21,0x80,0x72,0x00,0x8C,0x00,0x14,0x00,0x24,0x00,0x20,0x00, + 0x1F,0x00,0x0A,0x0A,0x14,0x0C,0x01,0xFF,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00, + 0x10,0x00,0x38,0x00,0x24,0x00,0x44,0x40,0x44,0x80,0x83,0x00,0x0A,0x0B,0x16,0x0C, + 0x00,0xFF,0x10,0x00,0x0C,0x80,0x00,0x40,0x1D,0x00,0xE2,0x80,0x02,0x00,0x02,0x00, + 0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0xFF,0xFF,0xFF,0xFF,0x04,0x03,0x03,0x06, + 0x00,0x05,0x20,0x90,0x40,0xFF,0x04,0x03,0x03,0x06,0x00,0x05,0x20,0x90,0x40,0x03, + 0x03,0x03,0x06,0x00,0x05,0x40,0xA0,0x40,0xFF,0xFF,0xFF,0x05,0x03,0x03,0x06,0x00, + 0x03,0xF8,0x00,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0x60,0x40,0x80,0x05, + 0x07,0x07,0x06,0x00,0x00,0xF8,0x08,0x28,0x30,0x20,0x20,0x40,0x04,0x05,0x05,0x06, + 0x00,0x00,0x10,0x20,0x60,0xA0,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x10,0x20, + 0x60,0xA0,0x20,0x20,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xF0,0x90,0x10,0x20,0x05, + 0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x88,0x88,0x08,0x10,0x60,0x03,0x04,0x04,0x06, + 0x00,0x00,0xE0,0x40,0x40,0xE0,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x20,0x20,0x20, + 0x20,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0x20,0xF0,0x20,0x60,0xA0,0x05,0x07,0x07, + 0x06,0x00,0x00,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x05,0x07,0x07,0x06,0x00,0x00, + 0x40,0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40, + 0xF8,0x48,0x48,0x48,0x48,0x98,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0xF8,0x20,0x20, + 0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x20,0x20,0xF8, + 0x10,0x10,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0x88,0x08,0x10,0x60,0x05, + 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x40,0x78,0x48,0x88,0x08,0x10,0x60,0x05,0x07, + 0x07,0x06,0x00,0x00,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00, + 0x00,0x28,0x28,0x80,0xF8,0x90,0x90,0x10,0x10,0x20,0x05,0x06,0x06,0x06,0x00,0x00, + 0xF8,0x08,0x08,0x08,0x08,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xF8, + 0x08,0x08,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00,0x00,0x50,0xF8,0x50,0x50,0x50, + 0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x50,0xF8,0x50,0x50,0x50,0x10, + 0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0xC8,0x08,0x10,0xE0,0x07,0x0D,0x0D, + 0x06,0x00,0x00,0x02,0x00,0x00,0x00,0x28,0x28,0x00,0xC0,0x08,0xC8,0x08,0x10,0xE0, + 0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05,0x09,0x09,0x06, + 0x00,0x00,0x28,0x28,0x00,0x70,0x10,0x10,0x20,0x50,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x38,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08, + 0x40,0x40,0xF8,0x48,0x50,0x40,0x38,0x05,0x06,0x06,0x06,0x00,0x00,0x88,0x48,0x48, + 0x10,0x10,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x88,0x48,0x48,0x10, + 0x10,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x78,0x48,0xA8,0x18,0x10,0x60}; +const u8g_fntpgm_uint8_t fontpage_97_193_255[822] U8G_FONT_SECTION("fontpage_97_193_255") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xFF,0x00,0x09,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0x60,0x20,0xF8,0x20,0x20,0x40,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x08,0x10,0x60,0x20,0xF8,0x20,0x20,0x40,0x05,0x04,0x04, + 0x06,0x00,0x00,0xA8,0xA8,0x08,0x30,0x05,0x06,0x06,0x06,0x00,0x00,0xA8,0xA8,0xA8, + 0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xA8,0xA8,0xA8,0x08, + 0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x05, + 0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x70,0x00,0xF8,0x20,0x20,0x20,0x40,0x04,0x07, + 0x07,0x06,0x01,0x00,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x04,0x09,0x09,0x06,0x01, + 0x00,0x50,0x10,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00, + 0x20,0x20,0xF8,0x20,0x20,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x00,0x00, + 0x00,0x00,0xF8,0x05,0x06,0x06,0x06,0x00,0x00,0x78,0x08,0x28,0x10,0x28,0xC0,0x05, + 0x07,0x07,0x06,0x00,0x00,0x20,0x70,0x10,0x20,0x70,0xA8,0x20,0x03,0x06,0x06,0x06, + 0x01,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x05,0x06,0x06,0x06,0x00,0x00,0x10,0x50, + 0x50,0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x10,0x50,0x50, + 0x48,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00,0x10,0x50,0x50,0x48, + 0x88,0x88,0x04,0x06,0x06,0x06,0x00,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x09, + 0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x09,0x09, + 0x06,0x00,0x00,0x18,0x18,0x00,0x80,0x90,0xE0,0x80,0x80,0x70,0x05,0x06,0x06,0x06, + 0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28, + 0x00,0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x18,0x18,0x00, + 0xF8,0x08,0x08,0x08,0x10,0x60,0x05,0x05,0x05,0x06,0x00,0x01,0x60,0xA0,0x10,0x10, + 0x08,0x05,0x08,0x08,0x06,0x00,0x01,0x28,0x28,0x00,0x60,0xA0,0x10,0x10,0x08,0x05, + 0x08,0x08,0x06,0x00,0x01,0x18,0x18,0x00,0x60,0xA0,0x10,0x10,0x08,0x05,0x07,0x07, + 0x06,0x00,0x00,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09,0x09,0x06,0x00,0x00, + 0x28,0x08,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x09,0x09,0x06,0x00,0x00,0x18, + 0x18,0x20,0xF8,0x20,0xA8,0xA8,0xA8,0x20,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x08, + 0x08,0x50,0x20,0x10,0x04,0x06,0x06,0x06,0x01,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x30, + 0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0x20,0x40,0x48,0xF8,0x08,0x05,0x06,0x06, + 0x06,0x00,0x00,0x08,0x48,0x30,0x10,0x28,0xC0,0x05,0x06,0x06,0x06,0x00,0x00,0xF0, + 0x40,0xF8,0x40,0x40,0x38,0x05,0x05,0x05,0x06,0x00,0x00,0x40,0xF8,0x48,0x50,0x40, + 0x05,0x07,0x07,0x06,0x00,0x00,0x40,0x40,0xF8,0x48,0x50,0x40,0x40,0x04,0x05,0x05, + 0x06,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x05,0x06,0x06,0x06,0x00,0x00,0x70,0x10, + 0x10,0x10,0x10,0xF8,0x04,0x05,0x05,0x06,0x00,0x00,0xF0,0x10,0xF0,0x10,0xF0,0x05, + 0x06,0x06,0x06,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0xF8,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x00,0xF8,0x08,0x08,0x10,0x60,0x04,0x07,0x07,0x06,0x00,0x00,0x10,0x90, + 0x90,0x90,0x90,0x10,0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x20,0x20,0xA0,0xA0,0xA8, + 0xA8,0xB0,0x05,0x06,0x06,0x06,0x00,0x00,0x80,0x80,0x80,0x88,0xB0,0xC0,0x05,0x06, + 0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xF8,0x04,0x05,0x05,0x06,0x00,0x00, + 0xF0,0x90,0x10,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xF8,0x88,0x88,0x08,0x10, + 0x60,0x05,0x07,0x07,0x06,0x00,0x00,0x10,0xF8,0x50,0x50,0xF8,0x10,0x10,0x05,0x06, + 0x06,0x06,0x00,0x00,0x70,0x10,0x20,0x20,0x20,0xF8,0x05,0x06,0x06,0x06,0x00,0x00, + 0xF8,0x08,0xF8,0x08,0x10,0x60,0x05,0x06,0x06,0x06,0x00,0x00,0xC0,0x08,0x08,0x08, + 0x10,0xE0,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x20,0xF8,0x88,0x88,0x08,0x10, + 0x60,0x04,0x05,0x05,0x06,0x00,0x00,0x40,0xF0,0x50,0x50,0xB0,0x04,0x05,0x05,0x06, + 0x00,0x00,0x80,0xF0,0xA0,0x20,0x40,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00, + 0xF8,0x88,0x88,0x08,0x10,0x60,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x08,0x10,0xF8, + 0x50,0x50,0xF8,0x10,0x10,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0x70,0x10, + 0x20,0x20,0x20,0xF8,0x05,0x09,0x09,0x06,0x00,0x00,0x28,0x28,0x00,0xF8,0x08,0xF8, + 0x08,0x10,0x60,0x02,0x02,0x02,0x06,0x02,0x03,0xC0,0xC0,0x05,0x02,0x02,0x06,0x00, + 0x03,0x80,0x78,0x05,0x04,0x04,0x06,0x00,0x02,0x80,0x60,0x10,0x08,0x05,0x07,0x07, + 0x06,0x00,0x02,0x28,0x28,0x00,0x80,0x60,0x10,0x08,0x05,0x06,0x06,0x06,0x00,0x00, + 0xF8,0x08,0x08,0x08,0x08,0x08}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 128, 255, fontpage_8_128_255), // 'Ѐ' -- 'ѿ' + FONTDATA_ITEM(97, 129, 191, fontpage_97_129_191), // 'め' -- 'タ' + FONTDATA_ITEM(97, 193, 255, fontpage_97_193_255), // 'チ' -- 'ヿ' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_tr.h b/Marlin/src/lcd/dogm/fontdata/langdata_tr.h new file mode 100644 index 00000000..a4068e10 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_tr.h @@ -0,0 +1,27 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_158_159[49] U8G_FONT_SECTION("fontpage_2_158_159") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9F,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x80,0x80,0x98,0x88, + 0x70,0x05,0x0A,0x0A,0x06,0x00,0xFE,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_2_176_177[43] U8G_FONT_SECTION("fontpage_2_176_177") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB0,0xB1,0x00,0x09,0x00,0x00, + 0x00,0x03,0x09,0x09,0x06,0x01,0x00,0x40,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0, + 0x03,0x05,0x05,0x06,0x01,0x00,0xC0,0x40,0x40,0x40,0xE0}; +const u8g_fntpgm_uint8_t fontpage_2_222_223[45] U8G_FONT_SECTION("fontpage_2_222_223") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDE,0xDF,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x06,0x00,0xFE,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x10,0x60, + 0x05,0x07,0x07,0x06,0x00,0xFE,0x78,0x80,0x70,0x08,0xF0,0x10,0x60}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 158, 159, fontpage_2_158_159), // 'Ğ' -- 'ğ' + FONTDATA_ITEM(2, 176, 177, fontpage_2_176_177), // 'İ' -- 'ı' + FONTDATA_ITEM(2, 222, 223, fontpage_2_222_223), // 'Ş' -- 'ş' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_uk.h b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h new file mode 100644 index 00000000..47ec9399 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_uk.h @@ -0,0 +1,85 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_8_134_134[30] U8G_FONT_SECTION("fontpage_8_134_134") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x86,0x86,0x00,0x07,0x00,0x00, + 0x00,0x03,0x07,0x07,0x06,0x01,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0xE0}; +const u8g_fntpgm_uint8_t fontpage_8_144_169[363] U8G_FONT_SECTION("fontpage_8_144_169") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0xA9,0x00,0x0A,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0xF0,0x80,0x80,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00, + 0x00,0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80, + 0x80,0x80,0x80,0x80,0x80,0x05,0x08,0x08,0x06,0x00,0xFF,0x30,0x50,0x50,0x50,0x50, + 0x50,0xF8,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8, + 0x05,0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x05,0x07,0x07, + 0x06,0x00,0x00,0x70,0x88,0x08,0x70,0x08,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x0A,0x0A,0x06,0x00,0x00,0x88,0x70,0x00, + 0x88,0x88,0x98,0xA8,0xC8,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x90,0xA0, + 0xC0,0xA0,0x90,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48, + 0x88,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x05,0x07, + 0x07,0x06,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00, + 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0xF8,0x88, + 0x88,0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x88,0x88,0xF0,0x80, + 0x80,0x80,0x05,0x07,0x07,0x06,0x00,0x00,0x70,0x88,0x80,0x80,0x80,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,0x78,0x08,0x70,0x05,0x07,0x07,0x06,0x00,0x00,0x20, + 0x70,0xA8,0xA8,0xA8,0x70,0x20,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x50,0x20, + 0x50,0x88,0x88,0x05,0x09,0x09,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0x90,0x90,0xF8, + 0x08,0x08,0x05,0x07,0x07,0x06,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x05, + 0x07,0x07,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x05,0x09,0x09,0x06, + 0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}; +const u8g_fntpgm_uint8_t fontpage_8_172_172[30] U8G_FONT_SECTION("fontpage_8_172_172") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAC,0xAC,0x00,0x07,0x00,0x00, + 0x00,0x04,0x07,0x07,0x06,0x01,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0xE0}; +const u8g_fntpgm_uint8_t fontpage_8_175_201[334] U8G_FONT_SECTION("fontpage_8_175_201") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xC9,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x78,0x88,0x88,0x78,0x28,0x48,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x05,0x07,0x07,0x06,0x00,0x00,0x70, + 0x80,0xF0,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF0,0x88,0xF0,0x88, + 0xF0,0x05,0x05,0x05,0x06,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x05,0x06,0x06,0x06, + 0x00,0xFF,0x30,0x50,0x50,0x50,0xF8,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88, + 0xF0,0x80,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0x70,0x20,0x70,0xA8,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x30,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0x88, + 0x98,0xA8,0xC8,0x88,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x88,0x98,0xA8, + 0xC8,0x88,0x04,0x05,0x05,0x06,0x01,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x05,0x05,0x05, + 0x06,0x00,0x00,0x38,0x48,0x48,0x48,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0xD8, + 0xA8,0x88,0x88,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x05,0x05, + 0x05,0x06,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x05,0x05,0x05,0x06,0x00,0x00,0xF8, + 0x88,0x88,0x88,0x88,0x05,0x07,0x07,0x06,0x00,0xFE,0xF0,0x88,0x88,0x88,0xF0,0x80, + 0x80,0x05,0x05,0x05,0x06,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x05,0x05,0x05,0x06, + 0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x05,0x07,0x07,0x06,0x00,0xFE,0x88,0x88,0x88, + 0x88,0x78,0x08,0x70,0x05,0x09,0x09,0x06,0x00,0xFE,0x20,0x20,0x70,0xA8,0xA8,0xA8, + 0x70,0x20,0x20,0x05,0x05,0x05,0x06,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x05,0x07, + 0x07,0x06,0x00,0xFE,0x90,0x90,0x90,0x90,0xF8,0x08,0x08,0x05,0x05,0x05,0x06,0x00, + 0x00,0x88,0x88,0x78,0x08,0x08,0x05,0x05,0x05,0x06,0x00,0x00,0xA8,0xA8,0xA8,0xA8, + 0xF8,0x05,0x07,0x07,0x06,0x00,0xFE,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}; +const u8g_fntpgm_uint8_t fontpage_8_204_204[28] U8G_FONT_SECTION("fontpage_8_204_204") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x80,0x80,0xE0,0x90,0xE0}; +const u8g_fntpgm_uint8_t fontpage_8_206_207[39] U8G_FONT_SECTION("fontpage_8_206_207") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCF,0x00,0x05,0x00,0x00, + 0x00,0x05,0x05,0x05,0x06,0x00,0x00,0x90,0xA8,0xE8,0xA8,0x90,0x04,0x05,0x05,0x06, + 0x01,0x00,0x70,0x90,0x70,0x50,0x90}; +const u8g_fntpgm_uint8_t fontpage_8_212_212[28] U8G_FONT_SECTION("fontpage_8_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x05,0x00,0x00, + 0x00,0x04,0x05,0x05,0x06,0x01,0x00,0x70,0x80,0xE0,0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_8_214_215[41] U8G_FONT_SECTION("fontpage_8_214_215") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD6,0xD7,0x00,0x06,0x00,0x00, + 0x00,0x03,0x06,0x06,0x06,0x01,0x00,0x40,0x00,0xC0,0x40,0x40,0xE0,0x03,0x06,0x06, + 0x06,0x01,0x00,0xA0,0x00,0xC0,0x40,0x40,0xE0}; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(8, 134, 134, fontpage_8_134_134), // 'І' -- 'І' + FONTDATA_ITEM(8, 144, 169, fontpage_8_144_169), // 'А' -- 'Щ' + FONTDATA_ITEM(8, 172, 172, fontpage_8_172_172), // 'Ь' -- 'Ь' + FONTDATA_ITEM(8, 175, 201, fontpage_8_175_201), // 'Я' -- 'щ' + FONTDATA_ITEM(8, 204, 204, fontpage_8_204_204), // 'ь' -- 'ь' + FONTDATA_ITEM(8, 206, 207, fontpage_8_206_207), // 'ю' -- 'я' + FONTDATA_ITEM(8, 212, 212, fontpage_8_212_212), // 'є' -- 'є' + FONTDATA_ITEM(8, 214, 215, fontpage_8_214_215), // 'і' -- 'ї' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_vi.h b/Marlin/src/lcd/dogm/fontdata/langdata_vi.h new file mode 100644 index 00000000..a8a0c5c1 --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_vi.h @@ -0,0 +1,227 @@ +/** + * 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 + +const u8g_fntpgm_uint8_t fontpage_2_131_131[31] U8G_FONT_SECTION("fontpage_2_131_131") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_144_145[44] U8G_FONT_SECTION("fontpage_2_144_145") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x90,0x91,0x00,0x08,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0xF0,0x48,0x48,0xE8,0x48,0x48,0xF0,0x06,0x08, + 0x08,0x06,0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_2_169_169[31] U8G_FONT_SECTION("fontpage_2_169_169") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x08,0x00,0x00, + 0x00,0x04,0x08,0x08,0x06,0x00,0x00,0x50,0xA0,0x00,0x60,0x20,0x20,0x20,0x70}; +const u8g_fntpgm_uint8_t fontpage_3_161_161[30] U8G_FONT_SECTION("fontpage_3_161_161") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x07,0x00,0x00, + 0x00,0x05,0x07,0x07,0x06,0x00,0x00,0x08,0x08,0x70,0x88,0x88,0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_3_175_176[43] U8G_FONT_SECTION("fontpage_3_175_176") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xB0,0x00,0x08,0x00,0x00, + 0x00,0x05,0x08,0x08,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0x90,0x90,0x90,0x60,0x05, + 0x06,0x06,0x06,0x00,0x00,0x08,0x98,0x90,0x90,0xB0,0x50}; +const u8g_fntpgm_uint8_t fontpage_6_131_131[25] U8G_FONT_SECTION("fontpage_6_131_131") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x83,0x83,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x02,0x02,0x06,0x00,0x08,0x68,0xB0}; +const u8g_fntpgm_uint8_t fontpage_6_137_137[26] U8G_FONT_SECTION("fontpage_6_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0x00,0x00, + 0x00,0x03,0x03,0x03,0x06,0x01,0x07,0xC0,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_6_163_163[24] U8G_FONT_SECTION("fontpage_6_163_163") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x00,0xFE,0x00, + 0x00,0x01,0x01,0x01,0x06,0x02,0xFE,0x80}; +const u8g_fntpgm_uint8_t fontpage_6_192_193[33] U8G_FONT_SECTION("fontpage_6_192_193") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xC1,0x00,0x0A,0x00,0x00, + 0x00,0x02,0x02,0x02,0x06,0x01,0x08,0x80,0x40,0x02,0x02,0x02,0x06,0x02,0x08,0x40, + 0x80}; +const u8g_fntpgm_uint8_t fontpage_61_161_161[30] U8G_FONT_SECTION("fontpage_61_161_161") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA1,0xA1,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x70,0x08,0x78,0x88,0x78,0x00,0x20}; +const u8g_fntpgm_uint8_t fontpage_61_163_163[32] U8G_FONT_SECTION("fontpage_61_163_163") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x09,0x00,0x00, + 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x78 + }; +const u8g_fntpgm_uint8_t fontpage_61_165_165[33] U8G_FONT_SECTION("fontpage_61_165_165") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA5,0xA5,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_61_167_167[33] U8G_FONT_SECTION("fontpage_61_167_167") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA7,0xA7,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x30,0x48,0x00,0x70,0x08,0x78,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_61_169_169[34] U8G_FONT_SECTION("fontpage_61_169_169") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0B,0x00,0x00, + 0x00,0x06,0x0B,0x0B,0x07,0x00,0x00,0x0C,0x04,0x08,0x30,0x48,0x00,0x70,0x08,0x78, + 0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_61_173_173[33] U8G_FONT_SECTION("fontpage_61_173_173") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAD,0xAD,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x78,0x00, + 0x20}; +const u8g_fntpgm_uint8_t fontpage_61_175_175[33] U8G_FONT_SECTION("fontpage_61_175_175") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAF,0xAF,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_61_177_177[33] U8G_FONT_SECTION("fontpage_61_177_177") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB1,0xB1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x40,0x20,0x48,0x30,0x00,0x70,0x08,0x78,0x88, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_61_179_179[34] U8G_FONT_SECTION("fontpage_61_179_179") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB3,0xB3,0x00,0x0B,0x00,0x00, + 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x18,0x08,0x10,0x48,0x30,0x00,0x70,0x08,0x78, + 0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_61_181_181[34] U8G_FONT_SECTION("fontpage_61_181_181") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB5,0xB5,0x00,0x0B,0x00,0x00, + 0x00,0x06,0x0B,0x0B,0x07,0x00,0x00,0x14,0x28,0x00,0x48,0x30,0x00,0x70,0x08,0x78, + 0x88,0x78}; +const u8g_fntpgm_uint8_t fontpage_61_183_183[33] U8G_FONT_SECTION("fontpage_61_183_183") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB7,0xB7,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x78,0x00, + 0x20}; +const u8g_fntpgm_uint8_t fontpage_61_191_191[33] U8G_FONT_SECTION("fontpage_61_191_191") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0xF0,0x80, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_61_193_193[33] U8G_FONT_SECTION("fontpage_61_193_193") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC1,0xC1,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0xF0,0x80, + 0x78}; +const u8g_fntpgm_uint8_t fontpage_61_195_195[34] U8G_FONT_SECTION("fontpage_61_195_195") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0B,0x00,0x00, + 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x18,0x08,0x10,0x60,0x90,0x00,0x60,0x90,0xF0, + 0x80,0x70}; +const u8g_fntpgm_uint8_t fontpage_61_199_199[33] U8G_FONT_SECTION("fontpage_61_199_199") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC7,0xC7,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x20,0x50,0x00,0x70,0x88,0xF0,0x80,0x78,0x00, + 0x20}; +const u8g_fntpgm_uint8_t fontpage_61_201_201[32] U8G_FONT_SECTION("fontpage_61_201_201") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC9,0xC9,0x00,0x09,0x00,0x00, + 0x00,0x03,0x09,0x09,0x07,0x02,0x00,0x60,0x20,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0 + }; +const u8g_fntpgm_uint8_t fontpage_61_203_203[32] U8G_FONT_SECTION("fontpage_61_203_203") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCB,0xCB,0x00,0x07,0xFE,0x00, + 0x00,0x03,0x09,0x09,0x07,0x02,0xFE,0x40,0x00,0xC0,0x40,0x40,0x40,0xE0,0x00,0x40 + }; +const u8g_fntpgm_uint8_t fontpage_61_205_205[30] U8G_FONT_SECTION("fontpage_61_205_205") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCD,0xCD,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x70,0x88,0x88,0x88,0x70,0x00,0x20}; +const u8g_fntpgm_uint8_t fontpage_61_207_207[32] U8G_FONT_SECTION("fontpage_61_207_207") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCF,0xCF,0x00,0x09,0x00,0x00, + 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_209_209[33] U8G_FONT_SECTION("fontpage_61_209_209") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x04,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_61_211_211[33] U8G_FONT_SECTION("fontpage_61_211_211") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD3,0xD3,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x10,0x08,0x20,0x50,0x00,0x70,0x88,0x88,0x88, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_61_213_213[33] U8G_FONT_SECTION("fontpage_61_213_213") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x18,0x08,0x30,0x50,0x00,0x70,0x88,0x88,0x88, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_61_215_215[34] U8G_FONT_SECTION("fontpage_61_215_215") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD7,0xD7,0x00,0x0B,0x00,0x00, + 0x00,0x05,0x0B,0x0B,0x07,0x00,0x00,0x28,0x50,0x00,0x20,0x50,0x00,0x70,0x88,0x88, + 0x88,0x70}; +const u8g_fntpgm_uint8_t fontpage_61_217_217[33] U8G_FONT_SECTION("fontpage_61_217_217") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0x00,0x08,0xFE,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0xFE,0x20,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00, + 0x20}; +const u8g_fntpgm_uint8_t fontpage_61_219_219[32] U8G_FONT_SECTION("fontpage_61_219_219") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x09,0x00,0x00, + 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_221_221[32] U8G_FONT_SECTION("fontpage_61_221_221") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDD,0xDD,0x00,0x09,0x00,0x00, + 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x80,0x40,0x10,0x08,0x70,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_223_223[33] U8G_FONT_SECTION("fontpage_61_223_223") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDF,0xDF,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x60,0x20,0x40,0x10,0x08,0x70,0x88,0x88,0x88, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_61_225_225[32] U8G_FONT_SECTION("fontpage_61_225_225") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE1,0xE1,0x00,0x09,0x00,0x00, + 0x00,0x05,0x09,0x09,0x07,0x00,0x00,0x50,0xA0,0x10,0x08,0x70,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_227_227[32] U8G_FONT_SECTION("fontpage_61_227_227") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE3,0xE3,0x00,0x07,0xFE,0x00, + 0x00,0x05,0x09,0x09,0x00,0x00,0xFE,0x10,0x08,0x70,0x88,0x88,0x88,0x70,0x00,0x20 + }; +const u8g_fntpgm_uint8_t fontpage_61_229_229[30] U8G_FONT_SECTION("fontpage_61_229_229") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE5,0xE5,0x00,0x05,0xFE,0x00, + 0x00,0x05,0x07,0x07,0x07,0x00,0xFE,0x88,0x88,0x88,0x88,0x70,0x00,0x20}; +const u8g_fntpgm_uint8_t fontpage_61_231_231[33] U8G_FONT_SECTION("fontpage_61_231_231") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0x00,0x00, + 0x00,0x05,0x0A,0x0A,0x07,0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x88,0x88,0x88,0x88, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_61_233_233[32] U8G_FONT_SECTION("fontpage_61_233_233") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE9,0xE9,0x00,0x09,0x00,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x10,0x20,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_235_235[32] U8G_FONT_SECTION("fontpage_61_235_235") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x09,0x00,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x40,0x20,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_237_237[33] U8G_FONT_SECTION("fontpage_61_237_237") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0x00,0x00, + 0x00,0x06,0x0A,0x0A,0x07,0x00,0x00,0x30,0x10,0x20,0x0C,0x04,0x88,0x88,0x88,0x88, + 0x70}; +const u8g_fntpgm_uint8_t fontpage_61_239_239[32] U8G_FONT_SECTION("fontpage_61_239_239") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEF,0xEF,0x00,0x09,0x00,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0x00,0x28,0x50,0x0C,0x04,0x88,0x88,0x88,0x88,0x70 + }; +const u8g_fntpgm_uint8_t fontpage_61_241_241[32] U8G_FONT_SECTION("fontpage_61_241_241") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF1,0x00,0x07,0xFE,0x00, + 0x00,0x06,0x09,0x09,0x07,0x00,0xFE,0x0C,0x04,0x88,0x88,0x88,0x88,0x70,0x00,0x20 + }; + +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = { + FONTDATA_ITEM(2, 131, 131, fontpage_2_131_131), // 'ă' -- 'ă' + FONTDATA_ITEM(2, 144, 145, fontpage_2_144_145), // 'Đ' -- 'đ' + FONTDATA_ITEM(2, 169, 169, fontpage_2_169_169), // 'ĩ' -- 'ĩ' + FONTDATA_ITEM(3, 161, 161, fontpage_3_161_161), // 'ơ' -- 'ơ' + FONTDATA_ITEM(3, 175, 176, fontpage_3_175_176), // 'Ư' -- 'ư' + FONTDATA_ITEM(6, 131, 131, fontpage_6_131_131), // '̃' -- '̃' + FONTDATA_ITEM(6, 137, 137, fontpage_6_137_137), // '̉' -- '̉' + FONTDATA_ITEM(6, 163, 163, fontpage_6_163_163), // '̣' -- '̣' + FONTDATA_ITEM(6, 192, 193, fontpage_6_192_193), // '̀' -- '́' + FONTDATA_ITEM(61, 161, 161, fontpage_61_161_161), // 'ạ' -- 'ạ' + FONTDATA_ITEM(61, 163, 163, fontpage_61_163_163), // 'ả' -- 'ả' + FONTDATA_ITEM(61, 165, 165, fontpage_61_165_165), // 'ấ' -- 'ấ' + FONTDATA_ITEM(61, 167, 167, fontpage_61_167_167), // 'ầ' -- 'ầ' + FONTDATA_ITEM(61, 169, 169, fontpage_61_169_169), // 'ẩ' -- 'ẩ' + FONTDATA_ITEM(61, 173, 173, fontpage_61_173_173), // 'ậ' -- 'ậ' + FONTDATA_ITEM(61, 175, 175, fontpage_61_175_175), // 'ắ' -- 'ắ' + FONTDATA_ITEM(61, 177, 177, fontpage_61_177_177), // 'ằ' -- 'ằ' + FONTDATA_ITEM(61, 179, 179, fontpage_61_179_179), // 'ẳ' -- 'ẳ' + FONTDATA_ITEM(61, 181, 181, fontpage_61_181_181), // 'ẵ' -- 'ẵ' + FONTDATA_ITEM(61, 183, 183, fontpage_61_183_183), // 'ặ' -- 'ặ' + FONTDATA_ITEM(61, 191, 191, fontpage_61_191_191), // 'ế' -- 'ế' + FONTDATA_ITEM(61, 193, 193, fontpage_61_193_193), // 'ề' -- 'ề' + FONTDATA_ITEM(61, 195, 195, fontpage_61_195_195), // 'ể' -- 'ể' + FONTDATA_ITEM(61, 199, 199, fontpage_61_199_199), // 'ệ' -- 'ệ' + FONTDATA_ITEM(61, 201, 201, fontpage_61_201_201), // 'ỉ' -- 'ỉ' + FONTDATA_ITEM(61, 203, 203, fontpage_61_203_203), // 'ị' -- 'ị' + FONTDATA_ITEM(61, 205, 205, fontpage_61_205_205), // 'ọ' -- 'ọ' + FONTDATA_ITEM(61, 207, 207, fontpage_61_207_207), // 'ỏ' -- 'ỏ' + FONTDATA_ITEM(61, 209, 209, fontpage_61_209_209), // 'ố' -- 'ố' + FONTDATA_ITEM(61, 211, 211, fontpage_61_211_211), // 'ồ' -- 'ồ' + FONTDATA_ITEM(61, 213, 213, fontpage_61_213_213), // 'ổ' -- 'ổ' + FONTDATA_ITEM(61, 215, 215, fontpage_61_215_215), // 'ỗ' -- 'ỗ' + FONTDATA_ITEM(61, 217, 217, fontpage_61_217_217), // 'ộ' -- 'ộ' + FONTDATA_ITEM(61, 219, 219, fontpage_61_219_219), // 'ớ' -- 'ớ' + FONTDATA_ITEM(61, 221, 221, fontpage_61_221_221), // 'ờ' -- 'ờ' + FONTDATA_ITEM(61, 223, 223, fontpage_61_223_223), // 'ở' -- 'ở' + FONTDATA_ITEM(61, 225, 225, fontpage_61_225_225), // 'ỡ' -- 'ỡ' + FONTDATA_ITEM(61, 227, 227, fontpage_61_227_227), // 'ợ' -- 'ợ' + FONTDATA_ITEM(61, 229, 229, fontpage_61_229_229), // 'ụ' -- 'ụ' + FONTDATA_ITEM(61, 231, 231, fontpage_61_231_231), // 'ủ' -- 'ủ' + FONTDATA_ITEM(61, 233, 233, fontpage_61_233_233), // 'ứ' -- 'ứ' + FONTDATA_ITEM(61, 235, 235, fontpage_61_235_235), // 'ừ' -- 'ừ' + FONTDATA_ITEM(61, 237, 237, fontpage_61_237_237), // 'ử' -- 'ử' + FONTDATA_ITEM(61, 239, 239, fontpage_61_239_239), // 'ữ' -- 'ữ' + FONTDATA_ITEM(61, 241, 241, fontpage_61_241_241), // 'ự' -- 'ự' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h new file mode 100644 index 00000000..491d480a --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_CN.h @@ -0,0 +1,1823 @@ +/** + * 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 + +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}; +const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0B,0x02,0x04,0x0C,0x00,0x04,0x00,0x40,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x04, + 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, + 0x00}; +const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156_141_141") = { + 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, + 0x80,0x10,0x80,0x21,0x00,0x42,0x00,0xF7,0xC0,0x00,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_156_170_170[45] U8G_FONT_SECTION("fontpage_156_170_170") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAA,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x49, + 0x00,0x88,0xC0,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { + 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_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, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xE0}; +const u8g_fntpgm_uint8_t fontpage_157_134_134[45] U8G_FONT_SECTION("fontpage_157_134_134") = { + 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, + 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x00,0x21,0x20,0xC0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_157_206_206[45] U8G_FONT_SECTION("fontpage_157_206_206") = { + 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_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,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, + 0x20,0xA7,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xC0}; +const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_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,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, + 0x00,0xAF,0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_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,0x12,0x00,0x11,0x00,0x2F,0xE0,0x20,0x00,0x67, + 0xC0,0xA0,0x00,0x27,0xC0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0}; +const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { + 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, + 0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xE0,0x2A,0xA0,0x3A,0xA0,0x28,0x60}; +const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_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,0x22,0x00,0x3F,0xE0,0x20,0x00,0x4F,0xC0,0x48, + 0x40,0xDF,0xE0,0x50,0x20,0x4F,0xC0,0x41,0x00,0x41,0x00,0x47,0x00}; +const u8g_fntpgm_uint8_t fontpage_161_168_168[45] U8G_FONT_SECTION("fontpage_161_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,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_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,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, + 0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_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,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0}; +const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_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,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; +const u8g_fntpgm_uint8_t fontpage_162_243_243[45] U8G_FONT_SECTION("fontpage_162_243_243") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x11,0x00,0x7F,0xC0,0x04,0x00,0x04, + 0x00,0xFF,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; +const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_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,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, + 0x60,0x41,0x00,0x4F,0xC0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x89,0x00,0x4F,0xE0,0x59,0x00,0x09, + 0x00,0x2F,0xC0,0x29,0x00,0xCF,0xC0,0x49,0x00,0x49,0x00,0x4F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_163_250_251[73] U8G_FONT_SECTION("fontpage_163_250_251") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFA,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x7F, + 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_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,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, + 0xA0,0x24,0xA0,0x24,0xA0,0x38,0xA0,0x22,0x20,0x22,0x20,0x1E,0x60}; +const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_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,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, + 0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x10,0x20,0x1E,0x20,0xE0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x50,0xA0,0x7E,0xA0,0x90,0xA0,0xFE, + 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, + 0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x87,0x00}; +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, + 0x20,0x21,0x20,0x21,0x20,0x49,0x20,0xFA,0x20,0x0A,0x20,0x04,0xC0}; +const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { + 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, + 0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_207_207[45] U8G_FONT_SECTION("fontpage_166_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,0x42,0x00,0x42,0x00,0x4F,0x80,0xE2,0x80,0x42, + 0x80,0x4A,0xC0,0x52,0xA0,0x44,0x80,0x44,0x80,0x4A,0x80,0x51,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_213_213[45] U8G_FONT_SECTION("fontpage_166_213_213") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0x0A,0x00,0x7F,0xC0,0x44,0x40,0x7F, + 0xC0,0x44,0x40,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_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,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_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,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, + 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, + 0xC0,0x28,0x40,0x2F,0xC0,0x22,0x00,0x2A,0x80,0x52,0x60,0xA6,0x20}; +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,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, + 0x40,0x79,0x40,0x48,0x80,0x4C,0x80,0xF9,0x40,0x0A,0x40,0x0C,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_216_216[45] U8G_FONT_SECTION("fontpage_167_216_216") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0xFF,0xC0,0x12,0x00,0x52,0x80,0x92, + 0x40,0x00,0x00,0x7F,0x80,0x12,0x00,0x0C,0x00,0x12,0x00,0xE1,0xC0}; +const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { + 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_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, + 0x00,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7A,0x40,0x4A,0xC0,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { + 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, + 0x40,0xAF,0xE0,0xE8,0x20,0xA9,0x20,0x09,0x20,0x02,0x80,0x0C,0x60}; +const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_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,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, + 0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0x80,0x40,0xFF,0xC0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_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,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, + 0x40,0x92,0x40,0xE9,0xC0,0x84,0x40,0x88,0x40,0x84,0x40,0xFF,0xC0}; +const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { + 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, + 0x40,0x21,0x40,0x2F,0xE0,0x31,0x00,0xC2,0x80,0x04,0x40,0x18,0x20}; +const u8g_fntpgm_uint8_t fontpage_175_139_139[45] U8G_FONT_SECTION("fontpage_175_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,0x7E,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29, + 0x40,0x28,0x40,0x4C,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_175_171_171[45] U8G_FONT_SECTION("fontpage_175_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,0x22,0x00,0xFF,0x80,0x22,0x80,0x36,0xA0,0xE3, + 0xA0,0x2C,0xE0,0x64,0x00,0x04,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x21,0x00,0xF7,0xC0,0x24, + 0x40,0x27,0x40,0x25,0xC0,0x34,0x40,0xEF,0xE0,0x02,0x80,0x0C,0x60}; +const u8g_fntpgm_uint8_t fontpage_177_243_243[45] U8G_FONT_SECTION("fontpage_177_243_243") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0xC0,0x00, + 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x20,0x21,0x20,0xC0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_178_135_135[45] U8G_FONT_SECTION("fontpage_178_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,0x10,0x00,0x1F,0x80,0x31,0x00,0x4E,0x00,0x0B, + 0x00,0x30,0xE0,0xFF,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_178_141_141[45] U8G_FONT_SECTION("fontpage_178_141_141") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x3F,0xE0,0x60,0x80,0xBF,0x80,0x20, + 0x80,0x3F,0x80,0x10,0x00,0x3F,0x80,0xC9,0x00,0x06,0x00,0xF9,0xE0}; +const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x45, + 0x80,0xA5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x1F,0x00,0x21,0x00,0x52,0x00,0x0C, + 0x00,0x34,0x00,0xCF,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xF8,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_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,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, + 0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xC4,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_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,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, + 0xE0,0x48,0x00,0x53,0xE0,0x32,0x20,0x2A,0x20,0x4B,0xE0,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_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,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0xC0,0x20, + 0x80,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x0E,0x00,0x09,0x80,0x70,0x60}; +const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x00, + 0x00,0x7F,0xE0,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0}; +const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x80,0x40,0x3F, + 0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { + 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_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, + 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, + 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_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,0x11,0x00,0xFD,0x40,0x01,0x20,0x7F,0xE0,0x4A, + 0x80,0x7A,0x80,0x12,0x80,0x5A,0xA0,0x56,0xA0,0x92,0xA0,0x34,0x60}; +const u8g_fntpgm_uint8_t fontpage_184_207_207[45] U8G_FONT_SECTION("fontpage_184_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,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x28,0x40,0x24, + 0x80,0x3F,0xE0,0x24,0x80,0x3F,0xE0,0x24,0x80,0x48,0x80,0x90,0x80}; +const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { + 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, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7F,0xC0}; +const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_188_246_246[45] U8G_FONT_SECTION("fontpage_188_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,0x20,0x80,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F, + 0xE0,0x42,0x00,0x47,0x00,0x4A,0x80,0x52,0x40,0xA2,0x20,0x82,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_148_148[45] U8G_FONT_SECTION("fontpage_189_148_148") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x02,0x00,0x7F,0xE0,0x40,0x00,0x44, + 0x40,0x52,0x40,0x4A,0x40,0x48,0x80,0x40,0x80,0x81,0x00,0x9F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_189_159_159[45] U8G_FONT_SECTION("fontpage_189_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,0x02,0x00,0x3F,0xE0,0x2A,0x80,0x2A,0x40,0x3F, + 0xE0,0x24,0x00,0x27,0xC0,0x2A,0x40,0x31,0x80,0x42,0x40,0x8C,0x20}; +const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_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,0x04,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49, + 0x00,0x4F,0x00,0x40,0x00,0x5F,0x80,0x49,0x00,0x86,0x00,0xB9,0xC0}; +const u8g_fntpgm_uint8_t fontpage_190_128_128[45] U8G_FONT_SECTION("fontpage_190_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,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, + 0x40,0x97,0xC0,0x90,0x40,0x90,0x40,0x20,0x40,0x4F,0xC0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_191_132_133[73] U8G_FONT_SECTION("fontpage_191_132_133") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x85,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x17,0xC0,0x20,0x80,0x49,0x00,0x92,0x80,0x24, + 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, + 0x40,0xC3,0x40,0x5D,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; +const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { + 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, + 0x00,0xB1,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_192_187_187[45] U8G_FONT_SECTION("fontpage_192_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,0x11,0x00,0x0A,0x00,0x3F,0x80,0x20,0x80,0x20, + 0x80,0x3F,0x80,0x20,0x80,0x04,0x40,0x52,0xA0,0x50,0xA0,0x8F,0x80}; +const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_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,0x2F,0xE0,0xB2,0x00,0xAA,0x80,0xA4, + 0x80,0xA5,0xA0,0x2A,0xC0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_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,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_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, + 0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_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,0x18,0x60,0x63,0x80,0x42,0x00,0x7A,0x00,0x4B, + 0xE0,0x4A,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_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,0x04,0x00,0x7F,0xE0,0x40,0x20,0x7F,0xE0,0x40, + 0x00,0x7D,0xE0,0x44,0x20,0x54,0xA0,0x4C,0x60,0x54,0xA0,0xA9,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_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,0x03,0xC0,0x7C,0x00,0x04,0x00,0x7F,0xC0,0x04, + 0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_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,0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0xE3,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_231_231[45] U8G_FONT_SECTION("fontpage_196_231_231") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x22,0x00,0xFF,0x80,0x22,0x80,0x2A, + 0x80,0x36,0x80,0x62,0x80,0xA7,0xA0,0x24,0xA0,0xA8,0xA0,0x50,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_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,0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x2F, + 0xC0,0x34,0x80,0x64,0x80,0xA4,0x80,0x25,0xA0,0x26,0xA0,0xE4,0x60}; +const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { + 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, + 0xA0,0x34,0xA0,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x27,0xE0,0xE4,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0xFF,0xE0,0x22,0x00,0x2B, + 0xC0,0x32,0x40,0x65,0x40,0xA4,0x80,0x28,0x80,0x29,0x40,0xE6,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_233_233[45] U8G_FONT_SECTION("fontpage_197_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,0x2F,0xE0,0x22,0x40,0xF9,0x80,0x22,0x40,0x2C, + 0x20,0x31,0x00,0x67,0xC0,0xA1,0x00,0x2F,0xE0,0x21,0x00,0xE1,0x00}; +const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0xFF,0xE0,0x25,0x20,0x29, + 0x00,0x37,0xE0,0x62,0x40,0xA6,0x40,0x21,0x80,0x22,0x80,0xEC,0x60}; +const u8g_fntpgm_uint8_t fontpage_198_161_161[45] U8G_FONT_SECTION("fontpage_198_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,0x25,0x20,0xFB,0x40,0x21,0x00,0x2F, + 0xE0,0x30,0x20,0x60,0x20,0xA7,0xE0,0x20,0x20,0x20,0x20,0xEF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_198_164_164[45] U8G_FONT_SECTION("fontpage_198_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,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, + 0x40,0x35,0x40,0x6F,0xE0,0xA1,0x00,0x22,0x80,0x24,0x40,0xE8,0x20}; +const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0xE0,0xF9,0x00,0x27,0xC0,0x2C, + 0x40,0x37,0xC0,0x64,0x40,0xA7,0xC0,0x21,0x00,0x2F,0xE0,0xE1,0x00}; +const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_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,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, + 0x00,0x35,0x60,0x69,0x20,0xAD,0x60,0x29,0x20,0x29,0x20,0xEF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x93,0xE0,0x94,0x40,0x9A, + 0x40,0x92,0x40,0xB2,0x80,0xD1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_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,0x21,0x00,0x11,0x00,0xFD,0xE0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4A,0x40,0x94,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_240_240[45] U8G_FONT_SECTION("fontpage_202_240_240") = { + 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, + 0x80,0x22,0x80,0x30,0xE0,0x6F,0x80,0xA0,0x80,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { + 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, + 0xE0,0x0A,0x00,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0}; +const u8g_fntpgm_uint8_t fontpage_203_246_246[45] U8G_FONT_SECTION("fontpage_203_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,0x00,0x80,0xF0,0x80,0x9F,0xE0,0x90,0x80,0x94, + 0x80,0xF2,0x80,0x92,0x80,0x90,0x80,0x90,0x80,0xF0,0x80,0x03,0x80}; +const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_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,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, + 0x80,0xF4,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80}; +const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_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,0xE0,0xFF,0x00,0x55,0xE0,0x7D,0x40,0x55, + 0x40,0xFF,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_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,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x22,0x40,0x3F, + 0xC0,0x22,0x40,0x3F,0xC0,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_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,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x48,0x00,0x7F,0xC0,0x4A,0x40,0x79,0x80,0xC9,0x80,0x0E,0x60}; +const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { + 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, + 0x80,0x74,0x80,0x6C,0x80,0xA4,0x80,0xA4,0x80,0x28,0xA0,0x30,0xE0}; +const u8g_fntpgm_uint8_t fontpage_206_192_192[45] U8G_FONT_SECTION("fontpage_206_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,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, + 0x00,0x35,0x80,0xC4,0x60,0x3F,0x80,0x15,0x00,0x24,0x80,0xDC,0x40}; +const u8g_fntpgm_uint8_t fontpage_206_229_229[45] U8G_FONT_SECTION("fontpage_206_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,0x04,0x00,0x7F,0xC0,0x24,0x80,0x15,0x00,0xFF, + 0xE0,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x60,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_206_255_255[45] U8G_FONT_SECTION("fontpage_206_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,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, + 0x00,0x69,0x00,0xA7,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_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,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x22, + 0x80,0x74,0x40,0x6A,0xA0,0xA2,0x80,0x21,0x00,0x22,0x80,0x2C,0x60}; +const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { + 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, + 0xC0,0x70,0x00,0x69,0x20,0xA4,0xA0,0x22,0x40,0x22,0x80,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_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,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, + 0x20,0x27,0xC0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x22,0x80,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_214_226_227[71] U8G_FONT_SECTION("fontpage_214_226_227") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE3,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xC0,0x0B,0x0A,0x14, + 0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24, + 0x00,0x24,0x00,0x24,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_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,0x04,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0xFF, + 0xE0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xF8,0x00}; +const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xF6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xB4,0x40,0xC4,0x40,0x83,0xC0}; +const u8g_fntpgm_uint8_t fontpage_217_161_161[45] U8G_FONT_SECTION("fontpage_217_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,0x47,0x80,0x24,0x80,0x84,0x80,0x48,0xE0,0x10, + 0x00,0x2F,0xC0,0x24,0x80,0x42,0x80,0xC3,0x00,0x44,0x80,0x58,0x60}; +const u8g_fntpgm_uint8_t fontpage_217_226_226[45] U8G_FONT_SECTION("fontpage_217_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,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, + 0xA0,0x2A,0xA0,0x2A,0xA0,0xC8,0xA0,0x54,0x20,0x62,0x20,0x40,0xE0}; +const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_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,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xE0,0x14, + 0x20,0x27,0xE0,0x24,0x20,0xC7,0xE0,0x44,0x20,0x44,0x20,0x44,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_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,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, + 0x00,0x2F,0xE0,0x24,0x40,0xC7,0x40,0x45,0xC0,0x44,0x40,0x44,0xC0}; +const u8g_fntpgm_uint8_t fontpage_220_169_169[45] U8G_FONT_SECTION("fontpage_220_169_169") = { + 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_222_143_143[45] U8G_FONT_SECTION("fontpage_222_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,0x4F,0xE0,0x28,0x20,0x0F,0xE0,0x98,0x00,0x5F, + 0xE0,0x29,0x00,0x2F,0xE0,0xCD,0xA0,0x4B,0x60,0x5D,0xA0,0x49,0x60}; +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, + 0xA0,0x3E,0xA0,0x28,0xA0,0xDF,0xA0,0x4A,0x40,0x52,0xA0,0x65,0x20}; +const u8g_fntpgm_uint8_t fontpage_224_239_239[45] U8G_FONT_SECTION("fontpage_224_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,0x10,0x00,0x17,0xE0,0x54,0x80,0x58,0x80,0x50, + 0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x28,0x80,0x44,0x80,0x81,0x80}; +const u8g_fntpgm_uint8_t fontpage_225_185_185[45] U8G_FONT_SECTION("fontpage_225_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,0x04,0x00,0x07,0xC0,0x04,0x00,0x3F, + 0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x52,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_225_237_237[45] U8G_FONT_SECTION("fontpage_225_237_237") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0xF7,0x80,0x22,0x80,0x32,0x80,0x66, + 0x80,0xA3,0x80,0x24,0xA0,0x68,0x60,0x00,0x00,0x52,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_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,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, + 0xE0,0x30,0x80,0x6F,0xE0,0xA4,0x80,0x22,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_231_135_135[45] U8G_FONT_SECTION("fontpage_231_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,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, + 0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xC0}; +const u8g_fntpgm_uint8_t fontpage_234_181_181[45] U8G_FONT_SECTION("fontpage_234_181_181") = { + 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, + 0xFF,0x81}; +const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { + 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, + 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_238_129_129[45] U8G_FONT_SECTION("fontpage_238_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,0x04,0x00,0x14,0x80,0x25,0x60,0x46,0x20,0x1F, + 0x80,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80}; +const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_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,0x07,0xE0,0xF4,0x20,0x97,0xE0,0xF4,0x80,0x94, + 0x80,0x97,0xE0,0xF4,0x80,0x94,0x80,0xF4,0xA0,0x96,0x60,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_240_238_238[45] U8G_FONT_SECTION("fontpage_240_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,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_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, + 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_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, + 0xE0,0x08,0x80,0x3F,0x00,0x08,0x80,0x7F,0xC0,0x24,0x80,0xCC,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_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,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, + 0xE0,0x2E,0x00,0x42,0x40,0xF2,0x80,0x09,0x20,0x32,0xA0,0xCC,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_198_198[45] U8G_FONT_SECTION("fontpage_253_198_198") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x00,0x27,0xE0,0x44,0xA0,0x54,0xA0,0xE4, + 0xA0,0x27,0xE0,0x44,0xA0,0xF4,0xA0,0x04,0xA0,0x37,0xE0,0xC4,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_200_200[45] U8G_FONT_SECTION("fontpage_253_200_200") = { + 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, + 0xE0,0x22,0xA0,0x42,0x80,0xF2,0x80,0x02,0xA0,0x34,0xA0,0xC8,0xE0}; +const u8g_fntpgm_uint8_t fontpage_253_231_231[45] U8G_FONT_SECTION("fontpage_253_231_231") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE7,0xE7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x80,0x26,0xA0,0x45,0xC0,0x54,0x80,0xE7, + 0xE0,0x24,0x80,0x45,0xC0,0xF6,0xA0,0x04,0x80,0x34,0x80,0xC7,0xE0}; +const u8g_fntpgm_uint8_t fontpage_253_234_234[45] U8G_FONT_SECTION("fontpage_253_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,0x21,0x00,0x27,0xA0,0x49,0x40,0x57,0xE0,0xE1, + 0x00,0x23,0xE0,0x46,0x20,0xF3,0xE0,0x0A,0x20,0x33,0xE0,0xC2,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_237_237[45] U8G_FONT_SECTION("fontpage_253_237_237") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xED,0xED,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xC0,0x41,0x00,0x57,0xE0,0xE4, + 0xA0,0x2A,0x80,0x44,0x80,0xEF,0xE0,0x01,0x00,0x32,0xC0,0xCC,0x20}; +const u8g_fntpgm_uint8_t fontpage_253_255_255[45] U8G_FONT_SECTION("fontpage_253_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,0x27,0xC0,0x20,0x40,0x43,0xC0,0xF0,0x40,0x2F, + 0xE0,0x41,0x20,0xF5,0x40,0x03,0x80,0x35,0x40,0xC9,0x20,0x03,0x00}; +const u8g_fntpgm_uint8_t fontpage_254_150_150[45] U8G_FONT_SECTION("fontpage_254_150_150") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x48,0x20,0x5F,0xE0,0xE8, + 0x00,0x2F,0xE0,0x4A,0xA0,0xFF,0xE0,0x0A,0xA0,0x3A,0xA0,0xC8,0x60}; +const u8g_fntpgm_uint8_t fontpage_254_186_186[45] U8G_FONT_SECTION("fontpage_254_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,0x41,0x00,0x41,0x00,0x7B,0xC0,0xA1,0x40,0x21, + 0x40,0xFF,0xE0,0x21,0x00,0xA9,0x00,0xAA,0x80,0xFA,0x40,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_254_209_209[45] U8G_FONT_SECTION("fontpage_254_209_209") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD1,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xFF,0xC0,0x80,0x40,0x91,0x40,0xD5,0x40,0xA2, + 0x40,0x92,0x40,0xAD,0x40,0xC5,0x40,0x88,0x40,0x80,0x40,0x81,0xC0}; +const u8g_fntpgm_uint8_t fontpage_254_238_238[45] U8G_FONT_SECTION("fontpage_254_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,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x04,0x00,0xFF, + 0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_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,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, + 0xFE,0x82}; +const u8g_fntpgm_uint8_t fontpage_259_243_243[45] U8G_FONT_SECTION("fontpage_259_243_243") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x08,0x00,0x11,0x00,0x20,0x80,0x7F, + 0xC0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_263_220_220[45] U8G_FONT_SECTION("fontpage_263_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,0x11,0x00,0xFF,0xE0,0x11,0x00,0x01,0xC0,0x7E, + 0x80,0x28,0x80,0x15,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60}; +const u8g_fntpgm_uint8_t fontpage_265_221_221[45] U8G_FONT_SECTION("fontpage_265_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,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, + 0xE0,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_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,0x40,0x80,0x20,0x80,0xFF,0xE0,0x14,0xA0,0x2C, + 0x80,0x77,0xE0,0xAD,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { + 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, + 0x40,0x3F,0xC0,0x24,0x40,0x3F,0xC0,0x24,0x40,0x45,0x40,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_279_161_161[45] U8G_FONT_SECTION("fontpage_279_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,0x41,0x00,0x21,0x00,0x01,0x00,0x0F,0xE0,0xE1, + 0x00,0x21,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x01,0x00}; +const u8g_fntpgm_uint8_t fontpage_279_174_174[45] U8G_FONT_SECTION("fontpage_279_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,0x42,0x00,0x21,0x40,0x05,0x40,0x04,0x40,0xE4, + 0x40,0x22,0x80,0x22,0x80,0x29,0x00,0x32,0x80,0x24,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_190_190[45] U8G_FONT_SECTION("fontpage_279_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,0x47,0x80,0x24,0x80,0x04,0x80,0x08,0xE0,0xE0, + 0x00,0x2F,0xC0,0x24,0x40,0x22,0x80,0x31,0x00,0x22,0x80,0x1C,0x60}; +const u8g_fntpgm_uint8_t fontpage_279_213_213[45] U8G_FONT_SECTION("fontpage_279_213_213") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x40,0x21,0x20,0x1F,0xE0,0x01,0x00,0xEF, + 0x00,0x25,0x00,0x25,0x00,0x24,0xA0,0x26,0xA0,0x38,0x60,0x20,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_239_239[45] U8G_FONT_SECTION("fontpage_279_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,0x47,0xC0,0x24,0x40,0x04,0x40,0x07,0xC0,0xE0, + 0x00,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x32,0x80,0x24,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_279_247_247[45] U8G_FONT_SECTION("fontpage_279_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,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, + 0xE0,0x28,0x20,0x2B,0xA0,0x2A,0xA0,0x3B,0xA0,0x28,0x20,0x10,0xE0}; +const u8g_fntpgm_uint8_t fontpage_282_165_165[45] U8G_FONT_SECTION("fontpage_282_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,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, + 0xA0,0xFC,0xA0,0x27,0xE0,0x3C,0xA0,0xE4,0xA0,0x27,0xE0,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_253_253[45] U8G_FONT_SECTION("fontpage_286_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,0x11,0x00,0x7D,0x40,0x11,0x20,0xFF,0xE0,0x21, + 0x00,0xFD,0x20,0x51,0x40,0x7C,0x80,0x10,0xA0,0xFD,0x60,0x12,0x20}; +const u8g_fntpgm_uint8_t fontpage_287_145_145[45] U8G_FONT_SECTION("fontpage_287_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,0x23,0xC0,0xFA,0x40,0x43,0xC0,0x60,0x00,0xA7, + 0xE0,0xFA,0x40,0x23,0x40,0x3A,0xC0,0xE2,0x60,0x2F,0xC0,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_287_147_147[45] U8G_FONT_SECTION("fontpage_287_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,0x41,0x00,0x42,0x80,0xF4,0x40,0x4B,0xA0,0xA0, + 0x00,0xFE,0x20,0x2A,0xA0,0x3E,0xA0,0xEA,0xA0,0x2E,0xA0,0x2A,0x60}; +const u8g_fntpgm_uint8_t fontpage_287_185_185[45] U8G_FONT_SECTION("fontpage_287_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,0x41,0x00,0x21,0x00,0x2F,0xE0,0x01,0x20,0xE1, + 0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0xC0,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_287_193_193[45] U8G_FONT_SECTION("fontpage_287_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,0x40,0xC0,0x27,0x00,0x21,0x00,0x01,0x00,0xEF, + 0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_287_208_209[73] U8G_FONT_SECTION("fontpage_287_208_209") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD0,0xD1,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xC0,0x20,0x00,0x20,0x00,0x0F,0xE0,0xE2, + 0x00,0x22,0x80,0x24,0x40,0x2F,0xA0,0x24,0x20,0x50,0x00,0x8F,0xE0,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x40,0xC0,0x27,0x00,0x24,0x00,0x07,0xE0,0xE4,0x80,0x24,0x80,0x24, + 0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xE0,0xE6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_287_216_216[45] U8G_FONT_SECTION("fontpage_287_216_216") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xE0,0x20,0x80,0x21,0x00,0x01,0x00,0xE3, + 0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_287_219_219[45] U8G_FONT_SECTION("fontpage_287_219_219") = { + 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, + 0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,0x4E,0x40,0xB0,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_137_137[45] U8G_FONT_SECTION("fontpage_288_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x45,0x00,0x25,0x00,0x27,0xC0,0x09,0x00,0xEF, + 0xE0,0x22,0x80,0x22,0xA0,0x24,0xA0,0x28,0x60,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_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,0x41,0x00,0x3F,0xE0,0x21,0x00,0x0F,0xE0,0xE9, + 0x20,0x2F,0xE0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_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,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, + 0x60,0x31,0x00,0x6F,0xC0,0xA1,0x00,0xAF,0xE0,0x21,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_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,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x24,0x80,0x3F, + 0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_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,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_297_136_136[45] U8G_FONT_SECTION("fontpage_297_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,0x40,0x80,0x40,0x80,0x78,0x80,0x80,0x80,0xFB, + 0xE0,0x20,0x80,0xF8,0x80,0x20,0x80,0x28,0x80,0x30,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_297_174_174[45] U8G_FONT_SECTION("fontpage_297_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,0x40,0x00,0x47,0xC0,0x79,0x40,0x81,0x40,0xF9, + 0x40,0x27,0xC0,0xFA,0x40,0x22,0x40,0x2A,0x40,0x32,0x40,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_298_153_153[45] U8G_FONT_SECTION("fontpage_298_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,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_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, + 0x00,0xFF,0xC0,0x28,0x00,0x24,0x00,0x22,0x00,0x29,0x00,0x30,0xC0}; +const u8g_fntpgm_uint8_t fontpage_299_237_237[45] U8G_FONT_SECTION("fontpage_299_237_237") = { + 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, + 0x60,0x91,0x00,0x97,0xE0,0xD5,0x00,0xAF,0xE0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_208_208[45] U8G_FONT_SECTION("fontpage_300_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,0xF7,0xC0,0x94,0x40,0xA7,0xC0,0xC4,0x40,0xA7, + 0xC0,0x95,0x00,0x95,0x20,0xD5,0x40,0xA4,0x80,0x85,0x40,0x86,0x20}; +const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { + 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, + 0x00,0xFF,0xE0,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_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,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, + 0x20,0x25,0x20,0x25,0x20,0x3D,0x20,0xC1,0x80,0x02,0x40,0x0C,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_132_132[45] U8G_FONT_SECTION("fontpage_305_132_132") = { + 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, + 0xA0,0x32,0xA0,0x4A,0xA0,0xFE,0xA0,0x4A,0xA0,0x79,0x40,0x4E,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_206_206[45] U8G_FONT_SECTION("fontpage_305_206_206") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCE,0xCE,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0x80,0x40,0x80,0x42,0x80,0x52,0x80,0x4C, + 0x80,0x44,0x80,0x4C,0x80,0x52,0x80,0x62,0xA0,0x80,0x60,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_306_241_241[45] U8G_FONT_SECTION("fontpage_306_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,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, + 0xA0,0x7A,0x40,0x0A,0x40,0xEA,0xA0,0x0B,0x20,0x0A,0x00,0x33,0xE0}; +const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11, + 0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0}; +const u8g_fntpgm_uint8_t fontpage_317_196_196[45] U8G_FONT_SECTION("fontpage_317_196_196") = { + 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, 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, 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, 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, 250, 251, fontpage_163_250_251), // '出' -- '击' + 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, 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), // '升' -- '升' + 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, 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), // '取' -- '取' + 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, 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), // '垫' -- '垫' + FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // '填' -- '填' + FONTDATA_ITEM(177, 243, 243, fontpage_177_243_243), // '壳' -- '壳' + FONTDATA_ITEM(178, 135, 135, fontpage_178_135_135), // '备' -- '备' + FONTDATA_ITEM(178, 141, 141, fontpage_178_141_141), // '复' -- '复' + FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' + FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' + 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), // '存' -- '存' + FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' + 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, 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), // '并' -- '并' + FONTDATA_ITEM(189, 138, 138, fontpage_189_138_138), // '床' -- '床' + FONTDATA_ITEM(189, 148, 148, fontpage_189_148_148), // '应' -- '应' + 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(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), // '扇' -- '扇' + FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' + FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' + 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, 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), // '格' -- '格' + 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(222, 143, 143, fontpage_222_143_143), // '漏' -- '漏' + 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, 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, 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), // '绪' -- '绪' + FONTDATA_ITEM(253, 237, 237, fontpage_253_237_237), // '续' -- '续' + FONTDATA_ITEM(253, 255, 255, fontpage_253_255_255), // '绿' -- '绿' + FONTDATA_ITEM(254, 150, 150, fontpage_254_150_150), // '编' -- '编' + FONTDATA_ITEM(254, 186, 186, fontpage_254_186_186), // '缺' -- '缺' + 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(259, 243, 243, fontpage_259_243_243), // '至' -- '至' + 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), // '议' -- '议' + FONTDATA_ITEM(279, 190, 190, fontpage_279_190_190), // '设' -- '设' + 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), // '辑' -- '辑' + FONTDATA_ITEM(287, 147, 147, fontpage_287_147_147), // '输' -- '输' + FONTDATA_ITEM(287, 185, 185, fontpage_287_185_185), // '边' -- '边' + FONTDATA_ITEM(287, 193, 193, fontpage_287_193_193), // '迁' -- '迁' + FONTDATA_ITEM(287, 208, 209, fontpage_287_208_209), // '运' -- '近' + 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, 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, 208, 208, fontpage_300_208_208), // '限' -- '限' + 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, 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), // '黄' -- '黄' + 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), // ':' -- ':' +}; diff --git a/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h b/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h new file mode 100644 index 00000000..8eee544e --- /dev/null +++ b/Marlin/src/lcd/dogm/fontdata/langdata_zh_TW.h @@ -0,0 +1,1521 @@ +/** + * 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 + +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}; +const u8g_fntpgm_uint8_t fontpage_156_128_128[27] U8G_FONT_SECTION("fontpage_156_128_128") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x06,0x00,0x00, + 0x00,0x0B,0x02,0x04,0x0C,0x00,0x04,0x00,0x40,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_156_137_139[97] U8G_FONT_SECTION("fontpage_156_137_139") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x8B,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x0B,0x0B,0x16,0x0C,0x00, + 0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04, + 0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0B,0x0A,0x14,0x0C,0x00,0xFF,0xFF,0xE0,0x04, + 0x00,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04, + 0x00}; +const u8g_fntpgm_uint8_t fontpage_156_141_141[45] U8G_FONT_SECTION("fontpage_156_141_141") = { + 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_166_166[45] U8G_FONT_SECTION("fontpage_156_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,0x20,0x80,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x4A, + 0x40,0x4A,0x40,0x2A,0x40,0x2A,0x80,0x0A,0x00,0x0A,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_156_173_173[45] U8G_FONT_SECTION("fontpage_156_173_173") = { + 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_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, + 0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x48,0x00,0x87,0xE0}; +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, + 0x00,0xFF,0xE0,0x80,0x20,0x1F,0x00,0x11,0x00,0x21,0x20,0xC0,0xE0}; +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, + 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}; +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, + 0x20,0xA7,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x24,0x40,0x28,0xC0}; +const u8g_fntpgm_uint8_t fontpage_158_145_145[45] U8G_FONT_SECTION("fontpage_158_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,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_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_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_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_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, + 0x00,0xAF,0xE0,0x21,0x00,0x23,0x80,0x25,0x40,0x29,0x20,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_159_225_225[45] U8G_FONT_SECTION("fontpage_159_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,0x12,0x00,0x11,0x00,0x2F,0xE0,0x20,0x00,0x67, + 0xC0,0xA0,0x00,0x27,0xC0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0}; +const u8g_fntpgm_uint8_t fontpage_160_139_139[45] U8G_FONT_SECTION("fontpage_160_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,0x2F,0xE0,0x29,0x20,0x29,0x20,0x2F,0xE0,0x69, + 0x20,0xAB,0xA0,0x2A,0xA0,0x2B,0xA0,0x28,0x20,0x2F,0xE0,0x28,0x20}; +const u8g_fntpgm_uint8_t fontpage_160_188_188[45] U8G_FONT_SECTION("fontpage_160_188_188") = { + 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_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, + 0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xE0,0x2A,0xA0,0x3A,0xA0,0x28,0x60}; +const u8g_fntpgm_uint8_t fontpage_160_220_220[45] U8G_FONT_SECTION("fontpage_160_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,0x22,0x00,0x3F,0xE0,0x20,0x00,0x4F,0xC0,0x48, + 0x40,0xDF,0xE0,0x50,0x20,0x4F,0xC0,0x41,0x00,0x41,0x00,0x47,0x00}; +const u8g_fntpgm_uint8_t fontpage_160_245_245[45] U8G_FONT_SECTION("fontpage_160_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,0x22,0x00,0x23,0xE0,0x22,0x00,0x2F,0xC0,0x68, + 0x40,0xAF,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x38,0x60}; +const u8g_fntpgm_uint8_t fontpage_161_153_153[45] U8G_FONT_SECTION("fontpage_161_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,0x24,0x80,0x2F,0xC0,0x24,0x80,0x3F,0xE0,0x64, + 0x00,0xAF,0xE0,0x29,0x20,0x3F,0xE0,0x29,0x20,0x2F,0xE0,0x29,0x20}; +const u8g_fntpgm_uint8_t fontpage_161_179_179[45] U8G_FONT_SECTION("fontpage_161_179_179") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB3,0xB3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x3F,0xE0,0x2A,0x40,0x2F,0xC0,0x6A, + 0x40,0xBF,0xC0,0x22,0x80,0x3F,0xE0,0x28,0x80,0x24,0x80,0x21,0x80}; +const u8g_fntpgm_uint8_t fontpage_161_190_190[45] U8G_FONT_SECTION("fontpage_161_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,0x10,0x80,0x2B,0xE0,0x2A,0x20,0x6F, + 0xE0,0xAA,0x20,0x2B,0xE0,0x2E,0x20,0x2B,0xE0,0x31,0x40,0x26,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_178_178[45] U8G_FONT_SECTION("fontpage_162_178_178") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x80,0x3D,0xE0,0x40,0xA0,0x5D,0xE0,0xC0, + 0x80,0x5D,0xE0,0x43,0x20,0x5D,0xE0,0x55,0x20,0x5D,0xE0,0x55,0x20}; +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_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,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, + 0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20}; +const u8g_fntpgm_uint8_t fontpage_162_232_232[45] U8G_FONT_SECTION("fontpage_162_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,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF, + 0x60,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0}; +const u8g_fntpgm_uint8_t fontpage_162_241_241[45] U8G_FONT_SECTION("fontpage_162_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,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11, + 0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x40}; +const u8g_fntpgm_uint8_t fontpage_162_247_247[45] U8G_FONT_SECTION("fontpage_162_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,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, + 0x60,0x41,0x00,0x4F,0xC0,0x80,0x80,0x87,0x00,0x81,0x00,0x00,0x80}; +const u8g_fntpgm_uint8_t fontpage_163_198_198[45] U8G_FONT_SECTION("fontpage_163_198_198") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x0A,0x00,0x89,0x00,0x4F,0xE0,0x59,0x00,0x09, + 0x00,0x2F,0xC0,0x29,0x00,0xCF,0xC0,0x49,0x00,0x49,0x00,0x4F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_163_250_250[45] U8G_FONT_SECTION("fontpage_163_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,0x44,0x40,0x44,0x40,0x44,0x40,0x7F, + 0xC0,0x04,0x00,0x84,0x20,0x84,0x20,0x84,0x20,0x84,0x20,0xFF,0xE0}; +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, + 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}; +const u8g_fntpgm_uint8_t fontpage_164_151_151[45] U8G_FONT_SECTION("fontpage_164_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,0x7E,0x20,0x10,0x20,0x11,0x20,0x3D,0x20,0x25, + 0x20,0x65,0x20,0x99,0x20,0x09,0x20,0x10,0x20,0x20,0x20,0xC0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_164_157_157[45] U8G_FONT_SECTION("fontpage_164_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,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_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, + 0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x10,0x20,0x1E,0x20,0xE0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_164_182_183[73] U8G_FONT_SECTION("fontpage_164_182_183") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB7,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x10,0x20,0x50,0xA0,0x7E,0xA0,0x90,0xA0,0xFE, + 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_245_245[45] U8G_FONT_SECTION("fontpage_164_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,0x10,0x20,0x28,0x20,0x54,0xA0,0xFE,0xA0,0x44, + 0xA0,0x7C,0xA0,0x44,0xA0,0x7C,0xA0,0xC4,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, + 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_213_213[45] U8G_FONT_SECTION("fontpage_165_213_213") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD5,0xD5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x78,0x80,0x10,0x80,0xFE,0x80,0x55,0xE0,0x7C, + 0xA0,0x54,0xA0,0x7C,0xA0,0x10,0xA0,0x7D,0x20,0x11,0x20,0xFE,0x60}; +const u8g_fntpgm_uint8_t fontpage_166_150_150[45] U8G_FONT_SECTION("fontpage_166_150_150") = { + 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_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, + 0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_212_212[45] U8G_FONT_SECTION("fontpage_166_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x27,0xC0,0x22,0x40,0xFA,0x40,0x24, + 0x80,0x24,0x80,0x3F,0xE0,0x2A,0xA0,0x2A,0xA0,0x33,0x20,0x24,0x40}; +const u8g_fntpgm_uint8_t fontpage_166_225_225[45] U8G_FONT_SECTION("fontpage_166_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,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, + 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}; +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, + 0x20,0x11,0x20,0x5D,0x20,0x51,0x20,0x51,0xA0,0x5D,0x40,0xE1,0x00}; +const u8g_fntpgm_uint8_t fontpage_166_251_251[45] U8G_FONT_SECTION("fontpage_166_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,0x28,0x00,0x25,0xE0,0x53,0x20,0x99,0x20,0x25, + 0x20,0x43,0x20,0xBD,0x20,0x25,0xA0,0x25,0x40,0x3D,0x00,0x25,0x00}; +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, + 0xC0,0x28,0x40,0x2F,0xC0,0x22,0x00,0x2A,0x80,0x52,0x60,0xA6,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_205_205[45] U8G_FONT_SECTION("fontpage_167_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,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, + 0x40,0x79,0x40,0x48,0x80,0x4C,0x80,0xF9,0x40,0x0A,0x40,0x0C,0x20}; +const u8g_fntpgm_uint8_t fontpage_167_240_240[45] U8G_FONT_SECTION("fontpage_167_240_240") = { + 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_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_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_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_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, + 0x00,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7A,0x40,0x4A,0xC0,0x02,0x00}; +const u8g_fntpgm_uint8_t fontpage_169_140_140[45] U8G_FONT_SECTION("fontpage_169_140_140") = { + 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_170_223_223[45] U8G_FONT_SECTION("fontpage_170_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,0x11,0x00,0x7D,0x00,0x45,0xE0,0x7D,0x40,0x43, + 0x40,0x5D,0x40,0x55,0x40,0x54,0x80,0x94,0x80,0x9D,0x40,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_171_174_174[45] U8G_FONT_SECTION("fontpage_171_174_174") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xAE,0xAE,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0xF3,0xC0,0x92,0x40,0x92,0x40,0xFF,0xC0,0x44, + 0x80,0x7F,0x80,0x44,0x80,0x7F,0x80,0x04,0x00,0xFF,0xC0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_172_180_180[45] U8G_FONT_SECTION("fontpage_172_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,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, + 0x40,0x92,0x40,0x9E,0x40,0x92,0x40,0x80,0x40,0xFF,0xC0,0x80,0x40}; +const u8g_fntpgm_uint8_t fontpage_173_224_224[45] U8G_FONT_SECTION("fontpage_173_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,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_174_150_150[45] U8G_FONT_SECTION("fontpage_174_150_150") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFF,0xE0,0x91,0x20,0x9F,0x20,0x84,0x20,0xFF, + 0xE0,0xAA,0xA0,0xAE,0xA0,0xA0,0xA0,0xBF,0xA0,0x80,0x20,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_174_168_168[45] U8G_FONT_SECTION("fontpage_174_168_168") = { + 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_175_139_139[45] U8G_FONT_SECTION("fontpage_175_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,0x7E,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29, + 0x40,0x28,0x40,0x4C,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_175_247_247[45] U8G_FONT_SECTION("fontpage_175_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,0x21,0x00,0xF9,0x00,0x27,0xC0,0xF9,0x40,0x55, + 0x40,0xFB,0x40,0x21,0x40,0xF9,0xC0,0x22,0x40,0x24,0x20,0x28,0x20}; +const u8g_fntpgm_uint8_t fontpage_176_202_202[45] U8G_FONT_SECTION("fontpage_176_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,0x22,0x00,0x2F,0xE0,0x29,0x20,0xFF,0xE0,0x29, + 0x20,0x2F,0xE0,0x21,0x40,0x33,0xA0,0xE5,0xE0,0x09,0x20,0x10,0xE0}; +const u8g_fntpgm_uint8_t fontpage_176_235_235[45] U8G_FONT_SECTION("fontpage_176_235_235") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xEB,0xEB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x2F,0xE0,0x21,0x00,0xF7,0xC0,0x24, + 0x40,0x27,0x40,0x25,0xC0,0x34,0x40,0xEF,0xE0,0x02,0x80,0x0C,0x60}; +const u8g_fntpgm_uint8_t fontpage_177_138_138[45] U8G_FONT_SECTION("fontpage_177_138_138") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x23,0xC0,0xF9,0x40,0x51,0x40,0xFB, + 0x40,0x22,0xC0,0xFC,0x20,0x24,0x20,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_178_150_150[45] U8G_FONT_SECTION("fontpage_178_150_150") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x45, + 0x80,0xA5,0x40,0x19,0x20,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_154_154[45] U8G_FONT_SECTION("fontpage_178_154_154") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x08,0x00,0x1F,0x00,0x21,0x00,0x52,0x00,0x0C, + 0x00,0x34,0x00,0xCF,0x80,0x10,0x80,0x69,0x00,0x06,0x00,0xF8,0x00}; +const u8g_fntpgm_uint8_t fontpage_178_160_160[45] U8G_FONT_SECTION("fontpage_178_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,0x21,0x00,0x79,0xE0,0x8A,0x20,0x50,0x20,0x23, + 0xA0,0xFA,0xA0,0x2A,0xA0,0xCB,0xA0,0x28,0x20,0x11,0x20,0xE0,0xC0}; +const u8g_fntpgm_uint8_t fontpage_178_167_167[45] U8G_FONT_SECTION("fontpage_178_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,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04, + 0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_169_170[73] U8G_FONT_SECTION("fontpage_178_169_170") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xAA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF, + 0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A, + 0x00,0x11,0x00,0x19,0x00,0x24,0x80,0xC4,0x60}; +const u8g_fntpgm_uint8_t fontpage_178_177_177[45] U8G_FONT_SECTION("fontpage_178_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,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_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, + 0xE0,0x48,0x00,0x53,0xE0,0x32,0x20,0x2A,0x20,0x4B,0xE0,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_181_146_146[45] U8G_FONT_SECTION("fontpage_181_146_146") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x24,0x40,0x2F,0xE0,0x24,0x40,0xF7,0xC0,0x54, + 0x40,0x57,0xC0,0x51,0x00,0x2F,0xE0,0x33,0x80,0x4D,0x40,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_182_208_208[45] U8G_FONT_SECTION("fontpage_182_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,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_182_216_216[45] U8G_FONT_SECTION("fontpage_182_216_216") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x08,0x00,0xFF,0xE0,0x10,0x00,0x2F,0xC0,0x20, + 0x80,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_183_137_137[45] U8G_FONT_SECTION("fontpage_183_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x88,0x40,0x08, + 0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x0E,0x00,0x09,0x80,0x70,0x60}; +const u8g_fntpgm_uint8_t fontpage_183_140_140[45] U8G_FONT_SECTION("fontpage_183_140_140") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x40,0x00, + 0x00,0x7F,0xE0,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0}; +const u8g_fntpgm_uint8_t fontpage_183_154_154[45] U8G_FONT_SECTION("fontpage_183_154_154") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9A,0x9A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0x7F,0xE0,0x40,0x20,0x80,0x40,0x3F, + 0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x54,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_183_162_162[45] U8G_FONT_SECTION("fontpage_183_162_162") = { + 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_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_184_141_141[45] U8G_FONT_SECTION("fontpage_184_141_141") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x28,0x40,0xAA,0x40,0x6C,0x40,0xFF,0xE0,0x28, + 0x40,0x7D,0x40,0x10,0xC0,0x7C,0x40,0x10,0x40,0x1D,0x40,0xE0,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, + 0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x14,0x00,0x08,0x00}; +const u8g_fntpgm_uint8_t fontpage_184_177_177[45] U8G_FONT_SECTION("fontpage_184_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,0x11,0x00,0xFD,0x40,0x01,0x20,0x7F,0xE0,0x4A, + 0x80,0x7A,0x80,0x12,0x80,0x5A,0xA0,0x56,0xA0,0x92,0xA0,0x34,0x60}; +const u8g_fntpgm_uint8_t fontpage_187_229_229[41] U8G_FONT_SECTION("fontpage_187_229_229") = { + 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, + 0x00,0x80,0x00,0x80,0x40,0x80,0x40,0x80,0x40,0x7F,0xC0}; +const u8g_fntpgm_uint8_t fontpage_188_243_243[45] U8G_FONT_SECTION("fontpage_188_243_243") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF3,0xF3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x04, + 0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_138_138[45] U8G_FONT_SECTION("fontpage_189_138_138") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F, + 0xE0,0x42,0x00,0x47,0x00,0x4A,0x80,0x52,0x40,0xA2,0x20,0x82,0x00}; +const u8g_fntpgm_uint8_t fontpage_189_166_166[45] U8G_FONT_SECTION("fontpage_189_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,0x04,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49, + 0x00,0x4F,0x00,0x40,0x00,0x5F,0x80,0x49,0x00,0x86,0x00,0xB9,0xC0}; +const u8g_fntpgm_uint8_t fontpage_189_226_226[45] U8G_FONT_SECTION("fontpage_189_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,0x04,0x00,0x7F,0xE0,0x55,0x40,0x48,0xA0,0x7D, + 0xC0,0x45,0x20,0x5E,0x00,0x51,0xC0,0x5D,0x40,0x84,0x80,0x9B,0x60}; +const u8g_fntpgm_uint8_t fontpage_189_250_250[45] U8G_FONT_SECTION("fontpage_189_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,0x02,0x00,0xEF,0xC0,0x22,0x40,0x5F,0xE0,0xE2, + 0x40,0x2F,0xC0,0xA2,0x00,0x6F,0xE0,0x22,0x00,0x52,0x00,0x8F,0xE0}; +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_191_133_133[45] U8G_FONT_SECTION("fontpage_191_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,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_140_140[45] U8G_FONT_SECTION("fontpage_191_140_140") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x24,0x80,0x47,0x00,0x92,0x40,0x2F, + 0xE0,0x64,0x20,0xA7,0xC0,0x2C,0x40,0x32,0x80,0x23,0x80,0x2C,0x60}; +const u8g_fntpgm_uint8_t fontpage_191_145_145[45] U8G_FONT_SECTION("fontpage_191_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,0x1F,0xE0,0x25,0x40,0x45,0x40,0x9A,0x80,0x25, + 0x40,0x65,0x40,0xA0,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_191_158_158[45] U8G_FONT_SECTION("fontpage_191_158_158") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x9E,0x9E,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x40,0x22,0x40,0x45,0xA0,0x99,0x20,0x20, + 0x00,0x65,0x00,0xA5,0x00,0x25,0xE0,0x25,0x00,0x2B,0x00,0x31,0xE0}; +const u8g_fntpgm_uint8_t fontpage_191_169_169[45] U8G_FONT_SECTION("fontpage_191_169_169") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA9,0xA9,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x14,0x00,0x27,0xE0,0x4C,0x40,0x97,0xC0,0x24, + 0x40,0x67,0xC0,0xA4,0x00,0x27,0xC0,0x2C,0x80,0x33,0x00,0x2C,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, + 0x40,0xC3,0x40,0x5D,0x40,0x54,0x80,0x56,0x80,0x55,0x40,0x62,0x20}; +const u8g_fntpgm_uint8_t fontpage_191_195_195[45] U8G_FONT_SECTION("fontpage_191_195_195") = { + 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_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, + 0x00,0xB1,0x00,0x27,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_192_226_226[45] U8G_FONT_SECTION("fontpage_192_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,0x2F,0xE0,0xB2,0x00,0xAA,0x80,0xA4, + 0x80,0xA5,0xA0,0x2A,0xC0,0x30,0x80,0x21,0x40,0x22,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_192_239_239[45] U8G_FONT_SECTION("fontpage_192_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,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_195_182_182[45] U8G_FONT_SECTION("fontpage_195_182_182") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xE0,0xB2,0x80,0xAF,0xE0,0xA4, + 0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x25,0x40,0x2C,0xA0,0x33,0xA0}; +const u8g_fntpgm_uint8_t fontpage_195_201_201[45] U8G_FONT_SECTION("fontpage_195_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,0x02,0x00,0x7F,0xE0,0x4A,0x80,0x57,0xE0,0x7C, + 0x80,0x57,0xC0,0x54,0x80,0x57,0xE0,0x4A,0x40,0xA8,0xA0,0x4F,0xA0}; +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_196_182_182[45] U8G_FONT_SECTION("fontpage_196_182_182") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x00,0xFF,0x01,0xC0,0x3E,0x00,0x20,0x00,0x3F,0xC0,0x20, + 0x40,0x20,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x40,0x00,0x80,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_192_192[45] U8G_FONT_SECTION("fontpage_196_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,0x18,0x60,0x63,0x80,0x42,0x00,0x7A,0x00,0x4B, + 0xE0,0x4A,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x88,0x40}; +const u8g_fntpgm_uint8_t fontpage_196_199_199[45] U8G_FONT_SECTION("fontpage_196_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,0x04,0x00,0x7F,0xE0,0x40,0x20,0x7F,0xE0,0x40, + 0x00,0x7D,0xE0,0x44,0x20,0x54,0xA0,0x4C,0x60,0x54,0xA0,0xA9,0x60}; +const u8g_fntpgm_uint8_t fontpage_196_203_203[45] U8G_FONT_SECTION("fontpage_196_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,0x03,0xC0,0x7C,0x00,0x04,0x00,0x7F,0xC0,0x04, + 0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00}; +const u8g_fntpgm_uint8_t fontpage_196_211_211[45] U8G_FONT_SECTION("fontpage_196_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,0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x28, + 0x80,0x30,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0xE3,0x80}; +const u8g_fntpgm_uint8_t fontpage_196_249_249[45] U8G_FONT_SECTION("fontpage_196_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,0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x2F, + 0xC0,0x34,0x80,0x64,0x80,0xA4,0x80,0x25,0xA0,0x26,0xA0,0xE4,0x60}; +const u8g_fntpgm_uint8_t fontpage_197_150_150[45] U8G_FONT_SECTION("fontpage_197_150_150") = { + 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_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, + 0xA0,0x34,0xA0,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x27,0xE0,0xE4,0x20}; +const u8g_fntpgm_uint8_t fontpage_197_212_212[45] U8G_FONT_SECTION("fontpage_197_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x80,0x22,0x40,0xFF,0xE0,0x22,0x00,0x2B, + 0xC0,0x32,0x40,0x65,0x40,0xA4,0x80,0x28,0x80,0x29,0x40,0xE6,0x20}; +const u8g_fntpgm_uint8_t fontpage_198_137_137[45] U8G_FONT_SECTION("fontpage_198_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0xFF,0xE0,0x25,0x20,0x29, + 0x00,0x37,0xE0,0x62,0x40,0xA6,0x40,0x21,0x80,0x22,0x80,0xEC,0x60}; +const u8g_fntpgm_uint8_t fontpage_199_137_137[45] U8G_FONT_SECTION("fontpage_199_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x21,0xE0,0xF9,0x00,0x27,0xC0,0x2C, + 0x40,0x37,0xC0,0x64,0x40,0xA7,0xC0,0x21,0x00,0x2F,0xE0,0xE1,0x00}; +const u8g_fntpgm_uint8_t fontpage_199_162_162[45] U8G_FONT_SECTION("fontpage_199_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,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, + 0x00,0x35,0x60,0x69,0x20,0xAD,0x60,0x29,0x20,0x29,0x20,0xEF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_199_219_219[45] U8G_FONT_SECTION("fontpage_199_219_219") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDB,0xDB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0xF4,0x80,0x2F,0xE0,0x2A, + 0xA0,0x3A,0xA0,0x6C,0x60,0xA1,0x00,0x2F,0xE0,0x22,0x80,0xEC,0x60}; +const u8g_fntpgm_uint8_t fontpage_201_199_199[45] U8G_FONT_SECTION("fontpage_201_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,0x2F,0xE0,0x2A,0xA0,0xFF,0xE0,0x21,0x00,0x2F, + 0xE0,0x32,0x80,0xE7,0xC0,0x21,0x00,0x2F,0xE0,0xA1,0x00,0x61,0x00}; +const u8g_fntpgm_uint8_t fontpage_201_202_203[73] U8G_FONT_SECTION("fontpage_201_202_203") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xCA,0xCB,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFD,0xC0,0xA9,0x40,0xF9,0x60,0xAB,0xC0,0xFD, + 0x40,0xA9,0x80,0xAB,0x60,0xFE,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x29,0x20,0x25,0x40,0xFF,0xE0,0x2A,0xA0,0x2B,0x80,0x30,0x00,0xEF, + 0xE0,0x29,0x20,0x2F,0xE0,0xA9,0x20,0x6F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_201_224_224[45] U8G_FONT_SECTION("fontpage_201_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,0x21,0x00,0x2F,0xE0,0xFA,0xA0,0x25,0x40,0x2D, + 0x60,0x35,0x40,0xE4,0x40,0x27,0xC0,0x24,0x40,0xA7,0xC0,0x68,0x40}; +const u8g_fntpgm_uint8_t fontpage_202_182_182[45] U8G_FONT_SECTION("fontpage_202_182_182") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB6,0xB6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x12,0x00,0x12,0x00,0x93,0xE0,0x94,0x40,0x9A, + 0x40,0x92,0x40,0xB2,0x80,0xD1,0x00,0x91,0x80,0x12,0x40,0x14,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_190_190[45] U8G_FONT_SECTION("fontpage_202_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,0x21,0x00,0x11,0x00,0xFD,0xE0,0x22,0x40,0x25, + 0x40,0x39,0x40,0x29,0x40,0x28,0x80,0x49,0x80,0x4A,0x40,0x94,0x20}; +const u8g_fntpgm_uint8_t fontpage_202_215_215[45] U8G_FONT_SECTION("fontpage_202_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,0x7D,0x00,0x45,0x00,0x7D,0xE0,0x47,0x40,0x7D, + 0x40,0x45,0x40,0x7D,0x40,0x45,0x40,0x28,0x80,0x45,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_202_248_248[45] U8G_FONT_SECTION("fontpage_202_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,0x11,0x00,0x7D,0x00,0x55,0xE0,0xFF,0x40,0x55, + 0x40,0xFD,0x40,0x95,0x40,0xFF,0x40,0x28,0x80,0x19,0x40,0xE6,0x20}; +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, + 0x80,0x22,0x80,0x30,0xE0,0x6F,0x80,0xA0,0x80,0x20,0x80,0x20,0x80}; +const u8g_fntpgm_uint8_t fontpage_203_156_156[45] U8G_FONT_SECTION("fontpage_203_156_156") = { + 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_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_183_183[45] U8G_FONT_SECTION("fontpage_203_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,0xAA,0x40,0xFD,0x80,0x95,0x00,0xAB,0x00,0xFF, + 0xE0,0xA9,0x40,0xAB,0x40,0xFD,0x40,0x95,0x40,0xAB,0x40,0xFE,0x40}; +const u8g_fntpgm_uint8_t fontpage_203_188_188[45] U8G_FONT_SECTION("fontpage_203_188_188") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x20,0x80,0x10,0x80,0xFD,0x40,0x21,0x40,0x3A, + 0x20,0x2C,0x80,0x28,0x40,0x28,0x40,0x49,0x00,0x48,0x80,0x98,0x40}; +const u8g_fntpgm_uint8_t fontpage_204_135_135[45] U8G_FONT_SECTION("fontpage_204_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,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x3F, + 0xC0,0x79,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0xC1,0x00}; +const u8g_fntpgm_uint8_t fontpage_204_142_142[45] U8G_FONT_SECTION("fontpage_204_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,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_204_194_194[45] U8G_FONT_SECTION("fontpage_204_194_194") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC2,0xC2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x01,0x00,0xF7,0xC0,0x91,0x00,0x91,0x00,0xFF, + 0xE0,0x90,0x80,0x9F,0xE0,0x94,0x80,0xF2,0x80,0x00,0x80,0x03,0x80}; +const u8g_fntpgm_uint8_t fontpage_205_171_171[45] U8G_FONT_SECTION("fontpage_205_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,0xE0,0xFF,0x00,0x55,0xE0,0x7D,0x40,0x55, + 0x40,0xFF,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40}; +const u8g_fntpgm_uint8_t fontpage_205_244_244[45] U8G_FONT_SECTION("fontpage_205_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,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x22,0x40,0x3F, + 0xC0,0x22,0x40,0x3F,0xC0,0x0A,0x00,0x04,0x00,0x1B,0x00,0xE0,0xE0}; +const u8g_fntpgm_uint8_t fontpage_206_128_128[45] U8G_FONT_SECTION("fontpage_206_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,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x48,0x00,0x7F,0xC0,0x4A,0x40,0x79,0x80,0xC9,0x80,0x0E,0x60}; +const u8g_fntpgm_uint8_t fontpage_206_137_137[45] U8G_FONT_SECTION("fontpage_206_137_137") = { + 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_255_255[45] U8G_FONT_SECTION("fontpage_206_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,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_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, + 0x00,0x69,0x00,0xA7,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_208_161_161[45] U8G_FONT_SECTION("fontpage_208_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,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x22, + 0x80,0x74,0x40,0x6A,0xA0,0xA2,0x80,0x21,0x00,0x22,0x80,0x2C,0x60}; +const u8g_fntpgm_uint8_t fontpage_208_188_188[45] U8G_FONT_SECTION("fontpage_208_188_188") = { + 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_157_157[45] U8G_FONT_SECTION("fontpage_209_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,0x24,0x00,0x27,0xE0,0x5A,0x40,0x51,0x80,0xDE, + 0x60,0x51,0x00,0x5F,0xE0,0x51,0x00,0x45,0x40,0x49,0x20,0x53,0x20}; +const u8g_fntpgm_uint8_t fontpage_209_196_196[45] U8G_FONT_SECTION("fontpage_209_196_196") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC4,0xC4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x20,0x80,0x7F,0xC0,0x24, + 0x80,0xFF,0xE0,0x24,0x80,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60}; +const u8g_fntpgm_uint8_t fontpage_211_253_253[45] U8G_FONT_SECTION("fontpage_211_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,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_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, + 0x20,0x27,0xC0,0x64,0x40,0xA7,0xC0,0x24,0x40,0x22,0x80,0x2F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_212_223_223[45] U8G_FONT_SECTION("fontpage_212_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,0x25,0x40,0x29,0xA0,0xFF,0x40,0x25,0x20,0x6F, + 0xE0,0x75,0x40,0xAF,0xE0,0xA5,0x40,0x26,0xA0,0x29,0x60,0x32,0x20}; +const u8g_fntpgm_uint8_t fontpage_213_162_162[45] U8G_FONT_SECTION("fontpage_213_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,0x21,0x00,0x22,0x80,0xF4,0x40,0x2B,0xA0,0x60, + 0x00,0x7E,0xE0,0xAA,0xA0,0xAE,0xE0,0x24,0x40,0x2A,0xC0,0x31,0x20}; +const u8g_fntpgm_uint8_t fontpage_214_226_227[71] U8G_FONT_SECTION("fontpage_214_226_227") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE2,0xE3,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27, + 0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xC0,0x0B,0x0A,0x14, + 0x0C,0x00,0xFF,0xFF,0xE0,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24, + 0x00,0x24,0x00,0x24,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_214_229_229[45] U8G_FONT_SECTION("fontpage_214_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,0x04,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0xFF, + 0xE0,0x04,0x00,0x14,0x40,0x24,0x80,0x41,0x00,0x06,0x00,0xF8,0x00}; +const u8g_fntpgm_uint8_t fontpage_214_248_248[45] U8G_FONT_SECTION("fontpage_214_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,0x43,0xC0,0xF0,0x40,0x93,0xC0,0xF8,0x40,0x8F, + 0xE0,0xFC,0xA0,0x20,0x80,0xBB,0xE0,0xA2,0xA0,0xBA,0xE0,0xE0,0x80}; +const u8g_fntpgm_uint8_t fontpage_215_188_188[45] U8G_FONT_SECTION("fontpage_215_188_188") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xBC,0xBC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0xC0,0xFD,0x40,0x11,0x40,0xFF,0x60,0x84, + 0x00,0x7B,0xE0,0x01,0x40,0x79,0x40,0x4A,0x80,0x4D,0x40,0x82,0x20}; +const u8g_fntpgm_uint8_t fontpage_215_212_212[45] U8G_FONT_SECTION("fontpage_215_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x84,0x00,0x84,0x00,0x84,0x80,0x85,0x00,0xF6, + 0x00,0x84,0x00,0x84,0x00,0x84,0x00,0xB4,0x40,0xC4,0x40,0x83,0xC0}; +const u8g_fntpgm_uint8_t fontpage_217_146_146[45] U8G_FONT_SECTION("fontpage_217_146_146") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x92,0x92,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x23,0xC0,0x84,0x40,0x59,0x40,0x10, + 0x80,0x27,0xC0,0x24,0x40,0xC2,0x80,0x41,0x00,0x46,0x80,0x58,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_136_136[45] U8G_FONT_SECTION("fontpage_219_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,0x49,0x20,0x25,0x40,0x81,0x00,0x57,0xE0,0x14, + 0x20,0x27,0xE0,0x24,0x20,0xC7,0xE0,0x44,0x20,0x44,0x20,0x44,0x60}; +const u8g_fntpgm_uint8_t fontpage_219_225_225[45] U8G_FONT_SECTION("fontpage_219_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,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_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, + 0x00,0x2F,0xE0,0x24,0x40,0xC7,0x40,0x45,0xC0,0x44,0x40,0x44,0xC0}; +const u8g_fntpgm_uint8_t fontpage_220_172_172[45] U8G_FONT_SECTION("fontpage_220_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,0x4E,0x20,0x2A,0xA0,0x0A,0xA0,0x8E,0xA0,0x5A, + 0xA0,0x2E,0xA0,0x2A,0xA0,0xCA,0xA0,0x4E,0x20,0x4A,0x20,0x51,0x60}; +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_150_150[45] U8G_FONT_SECTION("fontpage_221_150_150") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x96,0x96,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x85,0x00,0x4F,0xE0,0x99,0x00,0x4F,0xC0,0x49, + 0x00,0xCF,0xC0,0x49,0x00,0x4F,0xE0,0x04,0x00,0xFF,0xE0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_221_171_171[45] U8G_FONT_SECTION("fontpage_221_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,0x47,0xC0,0x25,0x40,0x06,0xC0,0x84,0x40,0x47, + 0xC0,0x20,0x00,0x2F,0xE0,0xCA,0xA0,0x4A,0xA0,0x4A,0xA0,0x5F,0xE0}; +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, + 0xA0,0x3E,0xA0,0x28,0xA0,0xDF,0xA0,0x4A,0x40,0x52,0xA0,0x65,0x20}; +const u8g_fntpgm_uint8_t fontpage_226_161_161[45] U8G_FONT_SECTION("fontpage_226_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,0x40,0x00,0x7F,0xE0,0xAA,0x80,0x2A,0x80,0xFF, + 0xE0,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x12,0x40,0x49,0x20,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_227_177_177[45] U8G_FONT_SECTION("fontpage_227_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,0xF9,0x00,0x23,0xC0,0xFD,0x40,0x53, + 0x40,0xA9,0x40,0xFA,0xE0,0x22,0x20,0xFA,0x40,0x49,0x20,0x89,0x20}; +const u8g_fntpgm_uint8_t fontpage_227_200_200[45] U8G_FONT_SECTION("fontpage_227_200_200") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x2F,0xA0,0x2B,0x40,0xAC,0x80,0xB7,0xC0,0xA8, + 0x20,0x37,0xC0,0x24,0x40,0x27,0xC0,0x52,0x80,0x49,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_228_199_199[45] U8G_FONT_SECTION("fontpage_228_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,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_231_135_135[45] U8G_FONT_SECTION("fontpage_231_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,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_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, + 0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x84,0x40,0x84,0xC0}; +const u8g_fntpgm_uint8_t fontpage_234_204_204[45] U8G_FONT_SECTION("fontpage_234_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,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F, + 0xC0,0x0A,0x00,0x31,0x80,0xD1,0x60,0x11,0x00,0x21,0x00,0x41,0x00}; +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, + 0xFF,0x81}; +const u8g_fntpgm_uint8_t fontpage_237_132_132[45] U8G_FONT_SECTION("fontpage_237_132_132") = { + 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_227_227[45] U8G_FONT_SECTION("fontpage_237_227_227") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE3,0xE3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0xA1,0x00,0xF9,0xE0,0x8A,0x00,0xFA, + 0x80,0xA0,0x40,0xFC,0x00,0x00,0x00,0x7F,0xC0,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, + 0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_238_160_160[45] U8G_FONT_SECTION("fontpage_238_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,0x07,0xE0,0xF4,0x20,0x97,0xE0,0xF4,0x80,0x94, + 0x80,0x97,0xE0,0xF4,0x80,0x94,0x80,0xF4,0xA0,0x96,0x60,0x04,0x20}; +const u8g_fntpgm_uint8_t fontpage_240_141_141[45] U8G_FONT_SECTION("fontpage_240_141_141") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x02,0x00,0xFA,0x00,0x23,0xE0,0x24,0x20,0x79, + 0x40,0xC9,0x00,0x49,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x08,0x20}; +const u8g_fntpgm_uint8_t fontpage_241_186_186[45] U8G_FONT_SECTION("fontpage_241_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,0x01,0x00,0xFF,0xE0,0x2A,0x20,0x22,0x80,0x77, + 0xE0,0xD4,0x80,0x5F,0xE0,0x54,0x80,0x77,0xE0,0x54,0x80,0x07,0xE0}; +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, + 0x80,0x36,0x80,0x29,0xE0,0x62,0x20,0xA5,0x40,0x20,0x80,0x27,0x00}; +const u8g_fntpgm_uint8_t fontpage_244_205_205[45] U8G_FONT_SECTION("fontpage_244_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,0x11,0x00,0xEF,0xE0,0x21,0x00,0xFF,0xC0,0x21, + 0x00,0x2F,0xE0,0x34,0x40,0x6F,0xC0,0xA4,0x40,0x27,0xC0,0x2C,0x60}; +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_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_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_249_251_251[45] U8G_FONT_SECTION("fontpage_249_251_251") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFB,0xFB,0x00,0x0A,0xFF,0x00, + 0x00,0x09,0x0B,0x16,0x0C,0x01,0xFF,0x03,0x80,0xFC,0x00,0x11,0x00,0x7E,0x00,0x08, + 0x00,0x11,0x00,0xFF,0x80,0x08,0x80,0x2A,0x00,0x49,0x00,0x98,0x80}; +const u8g_fntpgm_uint8_t fontpage_250_133_133[45] U8G_FONT_SECTION("fontpage_250_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,0x20,0x00,0x27,0xC0,0x41,0x00,0xF1,0x00,0x21, + 0x00,0x51,0x00,0xE9,0x00,0x01,0x00,0x51,0x00,0xA9,0x00,0xAF,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, + 0xE0,0x08,0x80,0x3F,0x00,0x08,0x80,0x7F,0xC0,0x24,0x80,0xCC,0x60}; +const u8g_fntpgm_uint8_t fontpage_250_176_176[45] U8G_FONT_SECTION("fontpage_250_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,0x20,0x00,0x27,0xE0,0x55,0x20,0xF5,0x20,0x25, + 0x20,0x57,0xE0,0xED,0x20,0x05,0x20,0x55,0x20,0xAF,0xE0,0xAC,0x20}; +const u8g_fntpgm_uint8_t fontpage_250_194_194[45] U8G_FONT_SECTION("fontpage_250_194_194") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC2,0xC2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x22,0x00,0x23,0xC0,0x54,0x40,0xF2,0x80,0x21, + 0x00,0x52,0x80,0xEC,0x60,0x01,0x00,0x50,0x80,0xAB,0x00,0x80,0xC0}; +const u8g_fntpgm_uint8_t fontpage_250_241_242[73] U8G_FONT_SECTION("fontpage_250_241_242") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF1,0xF2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x20,0x80,0x57,0xE0,0xF1,0x00,0x22, + 0x40,0x57,0xA0,0xE8,0x00,0x02,0x80,0x52,0xA0,0xAC,0xA0,0xA8,0x60,0x0B,0x0B,0x16, + 0x0C,0x00,0xFF,0x21,0x00,0x21,0x00,0x52,0x40,0xF7,0x80,0x21,0x40,0x57,0xE0,0xE8, + 0x80,0x02,0xC0,0x54,0xA0,0xA8,0xA0,0xA9,0x80}; +const u8g_fntpgm_uint8_t fontpage_251_160_160[45] U8G_FONT_SECTION("fontpage_251_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,0x23,0xC0,0x22,0x40,0x57,0x80,0xF0,0x80,0x2F, + 0xE0,0x51,0x20,0xED,0x40,0x03,0x80,0x55,0x40,0xA9,0x20,0xAF,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_178_178[45] U8G_FONT_SECTION("fontpage_251_178_178") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xE0,0x24,0x20,0x55,0x60,0xF4,0xA0,0x27, + 0xE0,0x54,0xA0,0xEF,0xE0,0x05,0x20,0x55,0xE0,0xAC,0x20,0xAC,0x60}; +const u8g_fntpgm_uint8_t fontpage_251_210_210[45] U8G_FONT_SECTION("fontpage_251_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,0x21,0x20,0x27,0xA0,0x51,0x40,0xFF,0xE0,0x21, + 0x00,0x53,0xE0,0xEE,0x20,0x03,0xE0,0x52,0x20,0xAB,0xE0,0xAA,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_218_218[45] U8G_FONT_SECTION("fontpage_251_218_218") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xDA,0xDA,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x27,0xC0,0x54,0x40,0xF7,0xC0,0x24, + 0x40,0x57,0xC0,0xE9,0x20,0x07,0x40,0x53,0x80,0xAD,0x40,0xAB,0x20}; +const u8g_fntpgm_uint8_t fontpage_251_232_232[45] U8G_FONT_SECTION("fontpage_251_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,0x21,0x00,0x2F,0xE0,0x58,0x20,0xFF,0xE0,0x28, + 0x00,0x5F,0xE0,0xEA,0xA0,0x0F,0xE0,0x5A,0xA0,0xAA,0xA0,0xAA,0x60}; +const u8g_fntpgm_uint8_t fontpage_252_174_174[45] U8G_FONT_SECTION("fontpage_252_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,0x21,0x00,0x27,0xE0,0x44,0x20,0xFB,0xE0,0x24, + 0x80,0x5D,0xE0,0xF5,0x20,0x05,0xE0,0x55,0x20,0xAD,0xE0,0xA5,0x20}; +const u8g_fntpgm_uint8_t fontpage_252_189_189[45] U8G_FONT_SECTION("fontpage_252_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,0x21,0x00,0x27,0xE0,0x55,0x60,0xF6,0xA0,0x25, + 0x20,0x56,0xA0,0xEF,0xE0,0x01,0x40,0x56,0xA0,0xAA,0x60,0xA9,0xC0}; +const u8g_fntpgm_uint8_t fontpage_252_252_252[45] U8G_FONT_SECTION("fontpage_252_252_252") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4A,0x40,0x4D,0xA0,0x8A,0x40,0xFD,0xA0,0x28, + 0x00,0x4F,0xE0,0xFA,0x40,0x0D,0xA0,0x5A,0x40,0xAD,0xA0,0xAF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_253_140_140[45] U8G_FONT_SECTION("fontpage_253_140_140") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8C,0x8C,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x4F,0xE0,0x91,0x00,0xEF,0xE0,0x2A, + 0xA0,0x5F,0xE0,0xF4,0x40,0x07,0xC0,0x54,0x40,0xAF,0xC0,0xAC,0x60}; +const u8g_fntpgm_uint8_t fontpage_253_162_162[45] U8G_FONT_SECTION("fontpage_253_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,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_254_238_238[45] U8G_FONT_SECTION("fontpage_254_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,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x04,0x00,0xFF, + 0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_254_242_242[45] U8G_FONT_SECTION("fontpage_254_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,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_240_240[45] U8G_FONT_SECTION("fontpage_256_240_240") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xF9,0x00,0x57,0xE0,0x56,0xA0,0x75,0x20,0x56, + 0xA0,0x77,0xE0,0x51,0x00,0x52,0xC0,0xFE,0x20,0x12,0x60,0x11,0xC0}; +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, + 0xFE,0x82}; +const u8g_fntpgm_uint8_t fontpage_267_205_205[45] U8G_FONT_SECTION("fontpage_267_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,0x11,0x00,0xFF,0xE0,0x91,0x00,0xF9,0xE0,0x8A, + 0x80,0xFC,0x40,0x90,0x00,0xFF,0xC0,0x4A,0x40,0x4A,0x40,0xFF,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, + 0xE0,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x23,0x80}; +const u8g_fntpgm_uint8_t fontpage_272_232_232[45] U8G_FONT_SECTION("fontpage_272_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,0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04, + 0x00,0xFF,0xE0,0x0A,0x40,0x12,0x80,0x31,0x00,0xD4,0x80,0x18,0x60}; +const u8g_fntpgm_uint8_t fontpage_273_171_171[45] U8G_FONT_SECTION("fontpage_273_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,0x40,0x80,0x20,0x80,0xFF,0xE0,0x14,0xA0,0x2C, + 0x80,0x77,0xE0,0xAD,0x40,0x25,0x40,0x24,0x80,0x29,0x40,0x36,0x20}; +const u8g_fntpgm_uint8_t fontpage_273_197_197[45] U8G_FONT_SECTION("fontpage_273_197_197") = { + 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_273_221_221[45] U8G_FONT_SECTION("fontpage_273_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,0x51,0x00,0x7F,0xE0,0x11,0x00,0xF1,0x00,0x57, + 0xC0,0x84,0x00,0xFF,0xE0,0x14,0x80,0x33,0x00,0xD5,0x80,0x18,0x60}; +const u8g_fntpgm_uint8_t fontpage_274_135_135[45] U8G_FONT_SECTION("fontpage_274_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,0x44,0x00,0x27,0xE0,0xF8,0x00,0x17,0xC0,0x2C, + 0x40,0x77,0xC0,0xAC,0x40,0x27,0xC0,0x2C,0x40,0x33,0x80,0x2C,0x60}; +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, + 0x40,0x3F,0xC0,0x24,0x40,0x3F,0xC0,0x24,0x40,0x45,0x40,0x80,0x80}; +const u8g_fntpgm_uint8_t fontpage_276_136_136[45] U8G_FONT_SECTION("fontpage_276_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,0x20,0x80,0x10,0x80,0xFC,0x80,0x00,0x80,0x7F, + 0xE0,0x00,0x80,0x78,0x80,0x00,0x80,0x78,0x80,0x48,0x80,0x78,0x80}; +const u8g_fntpgm_uint8_t fontpage_276_138_138[45] U8G_FONT_SECTION("fontpage_276_138_138") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x4F,0xC0,0xF2,0x40,0x02,0x40,0xF2,0x40,0x02, + 0x40,0xFF,0xC0,0x02,0x40,0xF2,0x40,0x92,0x60,0xF2,0x60,0x92,0x20}; +const u8g_fntpgm_uint8_t fontpage_276_152_152[45] U8G_FONT_SECTION("fontpage_276_152_152") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x00,0xF7,0xC0,0x00,0x40,0xF0,0x40,0x07, + 0xC0,0xF4,0x40,0x04,0x00,0xF4,0x00,0x94,0x20,0xF4,0x20,0x93,0xE0}; +const u8g_fntpgm_uint8_t fontpage_276_173_173[45] U8G_FONT_SECTION("fontpage_276_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,0x47,0x80,0xF4,0x80,0x04,0x80,0xF4,0xE0,0x08, + 0x00,0xF7,0xC0,0x04,0x40,0xF2,0x80,0x91,0x00,0xF2,0x80,0x9C,0x60}; +const u8g_fntpgm_uint8_t fontpage_276_230_230[45] U8G_FONT_SECTION("fontpage_276_230_230") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xE6,0xE6,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0xC0,0xF0,0xA0,0x0F,0xE0,0xF0,0x80,0x07, + 0x80,0xF2,0x80,0x02,0x80,0xF2,0x80,0x93,0xA0,0xFC,0x60,0x90,0x20}; +const u8g_fntpgm_uint8_t fontpage_277_141_141[45] U8G_FONT_SECTION("fontpage_277_141_141") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8D,0x8D,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x47,0xE0,0xF9,0x20,0x05,0x20,0xF5,0x20,0x02, + 0xE0,0xF4,0x40,0x03,0x00,0xF2,0xA0,0x96,0x20,0xFA,0x40,0x91,0xC0}; +const u8g_fntpgm_uint8_t fontpage_277_164_164[45] U8G_FONT_SECTION("fontpage_277_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,0x47,0xC0,0xF4,0x40,0x04,0x40,0xF7,0xC0,0x00, + 0x00,0xF7,0xC0,0x01,0x00,0xFF,0xE0,0x92,0x80,0xF4,0x40,0x98,0x20}; +const u8g_fntpgm_uint8_t fontpage_277_191_191[45] U8G_FONT_SECTION("fontpage_277_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,0x47,0xE0,0xF4,0x20,0x05,0x20,0xF7,0xA0,0x05, + 0x20,0xF7,0xE0,0x04,0x20,0xF7,0xA0,0x96,0xA0,0xF7,0xA0,0x98,0x60}; +const u8g_fntpgm_uint8_t fontpage_277_203_203[45] U8G_FONT_SECTION("fontpage_277_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,0x41,0x00,0xFF,0xE0,0x01,0x00,0xF7,0xC0,0x01, + 0x00,0xFF,0xE0,0x04,0x40,0xF7,0xC0,0x94,0x40,0xF7,0xC0,0x94,0x40}; +const u8g_fntpgm_uint8_t fontpage_278_240_240[45] U8G_FONT_SECTION("fontpage_278_240_240") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x40,0xFF,0xE0,0x01,0x00,0xF7,0xC0,0x01, + 0x00,0xFF,0xE0,0x04,0xA0,0xFF,0xE0,0x94,0xA0,0xFE,0x40,0x95,0xA0}; +const u8g_fntpgm_uint8_t fontpage_279_128_128[45] U8G_FONT_SECTION("fontpage_279_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,0x41,0x00,0xFF,0xE0,0x01,0x00,0xFF,0xE0,0x0A, + 0xA0,0xFF,0xE0,0x04,0x40,0xF7,0xC0,0x94,0x40,0xF7,0xC0,0x9C,0x60}; +const u8g_fntpgm_uint8_t fontpage_279_138_138[45] U8G_FONT_SECTION("fontpage_279_138_138") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x44,0x40,0xAE,0xA0,0x40,0x40,0xAE,0xA0,0xEA, + 0xE0,0x5E,0x40,0xA0,0xA0,0x1F,0xC0,0x69,0x00,0x06,0x00,0x79,0xE0}; +const u8g_fntpgm_uint8_t fontpage_281_199_199[45] U8G_FONT_SECTION("fontpage_281_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,0x88,0x00,0x5F,0xC0,0x22,0x40,0xFF,0x00,0x61, + 0xC0,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0xE1,0xC0}; +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_285_202_202[45] U8G_FONT_SECTION("fontpage_285_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,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x24, + 0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00}; +const u8g_fntpgm_uint8_t fontpage_285_223_223[45] U8G_FONT_SECTION("fontpage_285_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,0x22,0x00,0xFA,0x00,0x23,0xE0,0xFD,0x20,0xA9, + 0x40,0xF9,0x00,0xA9,0x00,0xF9,0x80,0x22,0x80,0xFA,0x40,0x24,0x20}; +const u8g_fntpgm_uint8_t fontpage_285_248_248[45] U8G_FONT_SECTION("fontpage_285_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,0x20,0x80,0xF8,0x80,0x23,0xE0,0xFA,0xA0,0xAA, + 0xA0,0xFA,0xA0,0xAB,0xE0,0xFA,0xA0,0x22,0xA0,0xFB,0xE0,0x22,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_137_137[45] U8G_FONT_SECTION("fontpage_286_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x80,0x7D,0x40,0x11,0x00,0xFF,0xE0,0x11, + 0x00,0xFF,0x20,0x55,0x40,0x7C,0x80,0x54,0xA0,0xFF,0x60,0x12,0x20}; +const u8g_fntpgm_uint8_t fontpage_286_175_175[45] U8G_FONT_SECTION("fontpage_286_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,0x23,0xC0,0xFA,0x40,0x23,0xC0,0xF8,0x00,0xAF, + 0xE0,0xFA,0x40,0xAB,0xC0,0xFA,0x40,0x22,0xE0,0xFF,0x40,0x20,0x40}; +const u8g_fntpgm_uint8_t fontpage_286_184_184[45] U8G_FONT_SECTION("fontpage_286_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,0x21,0x00,0xFA,0x80,0x24,0x60,0xFB,0x80,0xAE, + 0x20,0xFA,0xA0,0xAE,0xA0,0xFA,0xA0,0x2E,0xA0,0xFA,0x20,0x2A,0x60}; +const u8g_fntpgm_uint8_t fontpage_286_201_201[45] U8G_FONT_SECTION("fontpage_286_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,0x21,0x00,0xFF,0xE0,0x25,0x40,0xFF,0xC0,0xAD, + 0x40,0xFF,0xC0,0xA9,0x60,0xFF,0xE0,0x24,0x40,0xFA,0x40,0x20,0xC0}; +const u8g_fntpgm_uint8_t fontpage_287_209_209[45] U8G_FONT_SECTION("fontpage_287_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,0x40,0xC0,0x27,0x00,0x24,0x00,0x07,0xE0,0xE4, + 0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_287_212_212[45] U8G_FONT_SECTION("fontpage_287_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x40,0x60,0x27,0x80,0x24,0x00,0x07,0xE0,0xE6, + 0x20,0x25,0x40,0x24,0x80,0x29,0x40,0x26,0x20,0x50,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, + 0xC0,0x48,0x00,0x4B,0x40,0x48,0x80,0x4E,0x40,0xB0,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_159_159[45] U8G_FONT_SECTION("fontpage_288_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,0x41,0x00,0x3F,0xE0,0x21,0x00,0x0F,0xE0,0xE9, + 0x20,0x2F,0xE0,0x23,0x80,0x25,0x40,0x29,0x20,0x51,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_163_163[45] U8G_FONT_SECTION("fontpage_288_163_163") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xA3,0xA3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x2F,0xE0,0x25,0x40,0x07,0xC0,0xE5, + 0x40,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x50,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_178_178[45] U8G_FONT_SECTION("fontpage_288_178_178") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xB2,0xB2,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x43,0x00,0x24,0x80,0x27,0xE0,0x0C,0x80,0xF7, + 0xE0,0x24,0x80,0x27,0xE0,0x24,0x80,0x27,0xE0,0x54,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_203_203[45] U8G_FONT_SECTION("fontpage_288_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,0x4F,0xE0,0x29,0x20,0x2F,0xE0,0x05,0x40,0xE7, + 0xC0,0x25,0x40,0x27,0xC0,0x21,0x00,0x2F,0xE0,0x51,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_212_212[45] U8G_FONT_SECTION("fontpage_288_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x41,0x00,0x27,0xC0,0x21,0x00,0x0F,0xE0,0xE2, + 0x80,0x2F,0xE0,0x21,0x00,0x2F,0xE0,0x21,0x00,0x51,0x00,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_288_248_248[45] U8G_FONT_SECTION("fontpage_288_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,0x4E,0xE0,0x2A,0xA0,0x2E,0xE0,0x08,0x80,0xEA, + 0xA0,0x2F,0xE0,0x22,0x80,0x2F,0xE0,0x22,0x40,0x54,0x20,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_289_132_132[45] U8G_FONT_SECTION("fontpage_289_132_132") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x9F,0xC0,0x55,0x40,0x5F,0xC0,0x00,0x00,0xFF, + 0xE0,0x28,0x80,0x2F,0xA0,0x27,0x40,0x2A,0x80,0x52,0x40,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_289_138_138[45] U8G_FONT_SECTION("fontpage_289_138_138") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x8A,0x8A,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x42,0x00,0x2F,0xC0,0x28,0x40,0x1F,0xE0,0xF4, + 0xA0,0x29,0x40,0x3F,0xE0,0x22,0x00,0x27,0xC0,0x58,0xC0,0x8F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_289_232_232[45] U8G_FONT_SECTION("fontpage_289_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,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_291_203_203[45] U8G_FONT_SECTION("fontpage_291_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,0xFF,0xE0,0x2A,0xA0,0xAF,0xE0,0x71,0x00,0xFF, + 0xE0,0x22,0x80,0x77,0xE0,0x69,0x00,0xA7,0xE0,0xA1,0x00,0x21,0x00}; +const u8g_fntpgm_uint8_t fontpage_291_205_205[45] U8G_FONT_SECTION("fontpage_291_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,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x24,0x80,0x3F, + 0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_291_207_207[45] U8G_FONT_SECTION("fontpage_291_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,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF, + 0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0}; +const u8g_fntpgm_uint8_t fontpage_291_221_221[45] U8G_FONT_SECTION("fontpage_291_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,0x20,0x80,0x50,0x80,0x88,0x80,0x78,0x80,0x27, + 0xE0,0xF8,0x80,0x20,0x80,0xA8,0x80,0x70,0x80,0x38,0x80,0xC0,0x80}; +const u8g_fntpgm_uint8_t fontpage_292_149_149[45] U8G_FONT_SECTION("fontpage_292_149_149") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x95,0x95,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x27,0xC0,0x31,0x40,0x49,0x40,0xF9,0x40,0x21, + 0x40,0xFF,0xC0,0x22,0x40,0xAA,0x40,0x72,0x40,0x3A,0x40,0xC7,0xE0}; +const u8g_fntpgm_uint8_t fontpage_294_175_175[45] U8G_FONT_SECTION("fontpage_294_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,0x22,0x40,0x57,0xE0,0x8A,0x40,0x7A,0x40,0x27, + 0xE0,0xF8,0x00,0x23,0xE0,0xAA,0x20,0x73,0xE0,0x3A,0x20,0xE3,0xE0}; +const u8g_fntpgm_uint8_t fontpage_294_245_245[45] U8G_FONT_SECTION("fontpage_294_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,0x2C,0x80,0x25,0xE0,0x54,0xA0,0xFB,0xE0,0x2C, + 0xA0,0xF7,0xE0,0x24,0x80,0xB7,0xE0,0x6C,0x80,0x34,0x80,0xCB,0xE0}; +const u8g_fntpgm_uint8_t fontpage_298_247_247[45] U8G_FONT_SECTION("fontpage_298_247_247") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xF7,0xF7,0x00,0x0A,0xFF,0x00, + 0x00,0x0A,0x0B,0x16,0x0C,0x01,0xFF,0x3F,0x80,0x20,0x00,0x3F,0x00,0x20,0x00,0x3F, + 0x00,0x20,0x00,0xFF,0xC0,0x24,0x80,0x23,0x00,0x29,0x00,0x30,0xC0}; +const u8g_fntpgm_uint8_t fontpage_299_137_137[45] U8G_FONT_SECTION("fontpage_299_137_137") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x89,0x89,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, + 0xE0,0x82,0x20,0xBF,0xA0,0x8A,0x20,0x92,0x20,0xA2,0x20,0x86,0xE0}; +const u8g_fntpgm_uint8_t fontpage_299_139_139[45] U8G_FONT_SECTION("fontpage_299_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,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, + 0xE0,0x80,0x20,0x9F,0x20,0x8A,0x20,0xBF,0xA0,0x8A,0x20,0x92,0xE0}; +const u8g_fntpgm_uint8_t fontpage_299_147_147[45] U8G_FONT_SECTION("fontpage_299_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,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xFB, + 0xE0,0x9F,0x20,0x91,0x20,0x9F,0x20,0x91,0x20,0x9F,0x20,0x80,0xE0}; +const u8g_fntpgm_uint8_t fontpage_299_220_220[45] U8G_FONT_SECTION("fontpage_299_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,0xFB,0xE0,0x8A,0x20,0xFB,0xE0,0x8A,0x20,0xF5, + 0xE0,0xAA,0xA0,0xBB,0xA0,0xAA,0xA0,0xBB,0xA0,0x8A,0x20,0xB2,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, + 0x60,0x91,0x00,0x97,0xE0,0xD5,0x00,0xAF,0xE0,0x81,0x00,0x81,0x00}; +const u8g_fntpgm_uint8_t fontpage_300_228_228[45] U8G_FONT_SECTION("fontpage_300_228_228") = { + 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_301_142_142[45] U8G_FONT_SECTION("fontpage_301_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,0xF8,0x80,0x98,0xA0,0xAE,0xC0,0xC8,0xA0,0xAE, + 0xE0,0x92,0x00,0x97,0xC0,0xF4,0x40,0xA7,0xC0,0x84,0x40,0x87,0xC0}; +const u8g_fntpgm_uint8_t fontpage_301_217_217[45] U8G_FONT_SECTION("fontpage_301_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,0x2A,0x80,0x3F,0xE0,0x6A,0x80,0xBF,0xC0,0x2A, + 0x80,0x3F,0xE0,0x00,0x00,0x3F,0xC0,0x08,0x80,0x07,0x00,0x78,0xE0}; +const u8g_fntpgm_uint8_t fontpage_301_226_226[45] U8G_FONT_SECTION("fontpage_301_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,0x11,0x80,0xFD,0x40,0x55,0xE0,0x6F,0x40,0x55, + 0xE0,0x7D,0x40,0x21,0x40,0xFD,0xE0,0xAD,0x40,0xB5,0x40,0x8D,0xE0}; +const u8g_fntpgm_uint8_t fontpage_301_251_251[45] U8G_FONT_SECTION("fontpage_301_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,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xA4,0xA0,0x7F, + 0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x04,0x20,0x07,0xE0}; +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, + 0x00,0xFF,0xE0,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80}; +const u8g_fntpgm_uint8_t fontpage_302_222_222[45] U8G_FONT_SECTION("fontpage_302_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,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_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_133_133[45] U8G_FONT_SECTION("fontpage_304_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,0x07,0xE0,0xF9,0x00,0x27,0xE0,0x24,0x20,0x27, + 0xE0,0x24,0x20,0x3F,0xE0,0xC4,0x20,0x07,0xE0,0x02,0x40,0x0C,0x20}; +const u8g_fntpgm_uint8_t fontpage_304_144_144[45] U8G_FONT_SECTION("fontpage_304_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,0xFF,0xE0,0x91,0x00,0x67,0xC0,0x24,0x40,0xFF, + 0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x22,0x80,0xEC,0x60}; +const u8g_fntpgm_uint8_t fontpage_304_205_205[45] U8G_FONT_SECTION("fontpage_304_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,0x23,0xE0,0xFC,0x80,0xA7,0xE0,0x3A,0x20,0x4B, + 0xE0,0xB2,0x20,0x4B,0xE0,0xFE,0x20,0x4B,0xE0,0x79,0x40,0x4E,0x20}; +const u8g_fntpgm_uint8_t fontpage_304_222_222[45] U8G_FONT_SECTION("fontpage_304_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,0xAB,0xE0,0x70,0x80,0x23,0xE0,0xFA,0x20,0x73, + 0xE0,0xAA,0x20,0x23,0xE0,0xFA,0x20,0x23,0xE0,0x51,0x40,0x8E,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_168_168[45] U8G_FONT_SECTION("fontpage_305_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,0x3F,0xC0,0x21,0x40,0x2E,0x40,0x24,0x40,0x3F, + 0x40,0x35,0x40,0x3F,0x40,0x25,0x40,0x27,0x60,0x5C,0xA0,0x88,0x20}; +const u8g_fntpgm_uint8_t fontpage_305_253_253[45] U8G_FONT_SECTION("fontpage_305_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,0x22,0x00,0x52,0x00,0xAB,0xE0,0xFC,0x20,0x8B, + 0xA0,0xFA,0xA0,0x8B,0xA0,0xFA,0x40,0x92,0x20,0xAA,0x20,0xC9,0xE0}; +const u8g_fntpgm_uint8_t fontpage_306_152_152[45] U8G_FONT_SECTION("fontpage_306_152_152") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x98,0x98,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x21,0x00,0x52,0x80,0xAC,0x40,0xF8,0x20,0x8F, + 0xC0,0xF9,0x00,0x8F,0xE0,0xF9,0x00,0x95,0x40,0xB9,0x20,0xCB,0x00}; +const u8g_fntpgm_uint8_t fontpage_307_172_172[45] U8G_FONT_SECTION("fontpage_307_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,0x3F,0xC0,0x24,0x00,0x3F,0x80,0x24,0x00,0x3F, + 0x80,0x24,0x00,0x3F,0xE0,0x00,0x20,0x55,0x20,0x4A,0xA0,0x8A,0xC0}; +const u8g_fntpgm_uint8_t fontpage_308_197_197[45] U8G_FONT_SECTION("fontpage_308_197_197") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC5,0xC5,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x7F,0xE0,0x54,0x00,0x7D,0xC0,0x55,0x40,0x7D, + 0xC0,0x54,0x00,0x7F,0xE0,0x5E,0xA0,0xAF,0xE0,0xAC,0x00,0x17,0xE0}; +const u8g_fntpgm_uint8_t fontpage_309_212_212[45] U8G_FONT_SECTION("fontpage_309_212_212") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD4,0xD4,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x79,0x40,0x6B,0xE0,0x5A,0xA0,0xFF,0xE0,0x86, + 0xA0,0x7F,0xE0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x79,0x80,0x4F,0xE0}; +const u8g_fntpgm_uint8_t fontpage_309_216_216[45] U8G_FONT_SECTION("fontpage_309_216_216") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11, + 0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0}; +const u8g_fntpgm_uint8_t fontpage_317_195_195[45] U8G_FONT_SECTION("fontpage_317_195_195") = { + 0x00,0x0C,0x0F,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0xC3,0xC3,0x00,0x0A,0xFF,0x00, + 0x00,0x0B,0x0B,0x16,0x0C,0x00,0xFF,0x11,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x00, + 0x00,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0xC0,0x60}; +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_202_202[45] U8G_FONT_SECTION("fontpage_318_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,0xFF,0xE0,0x0A,0x40,0xF5,0x80,0x55, + 0x40,0x95,0xA0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xC0,0x80}; +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(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, 166, 166, fontpage_156_166_166), // '並' -- '並' + FONTDATA_ITEM(156, 173, 173, fontpage_156_173_173), // '中' -- '中' + FONTDATA_ITEM(156, 187, 187, fontpage_156_187_187), // '主' -- '主' + FONTDATA_ITEM(156, 203, 203, fontpage_156_203_203), // '之' -- '之' + FONTDATA_ITEM(157, 164, 164, fontpage_157_164_164), // '交' -- '交' + FONTDATA_ITEM(157, 174, 174, fontpage_157_174_174), // '亮' -- '亮' + FONTDATA_ITEM(157, 228, 228, fontpage_157_228_228), // '令' -- '令' + 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, 205, 206, fontpage_158_205_206), // '位' -- '低' + FONTDATA_ITEM(158, 220, 220, fontpage_158_220_220), // '作' -- '作' + FONTDATA_ITEM(159, 155, 155, fontpage_159_155_155), // '供' -- '供' + FONTDATA_ITEM(159, 221, 221, fontpage_159_221_221), // '保' -- '保' + FONTDATA_ITEM(159, 225, 225, fontpage_159_225_225), // '信' -- '信' + FONTDATA_ITEM(160, 139, 139, fontpage_160_139_139), // '個' -- '個' + FONTDATA_ITEM(160, 188, 188, fontpage_160_188_188), // '值' -- '值' + FONTDATA_ITEM(160, 207, 207, fontpage_160_207_207), // '偏' -- '偏' + FONTDATA_ITEM(160, 220, 220, fontpage_160_220_220), // '停' -- '停' + FONTDATA_ITEM(160, 245, 245, fontpage_160_245_245), // '偵' -- '偵' + FONTDATA_ITEM(161, 153, 153, fontpage_161_153_153), // '備' -- '備' + FONTDATA_ITEM(161, 179, 179, fontpage_161_179_179), // '傳' -- '傳' + FONTDATA_ITEM(161, 190, 190, fontpage_161_190_190), // '傾' -- '傾' + FONTDATA_ITEM(162, 178, 178, fontpage_162_178_178), // '儲' -- '儲' + FONTDATA_ITEM(162, 197, 197, fontpage_162_197_197), // '充' -- '充' + 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, 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, 250, 250, fontpage_163_250_250), // '出' -- '出' + FONTDATA_ITEM(164, 134, 134, fontpage_164_134_134), // '分' -- '分' + FONTDATA_ITEM(164, 151, 151, fontpage_164_151_151), // '列' -- '列' + FONTDATA_ITEM(164, 157, 157, fontpage_164_157_157), // '初' -- '初' + FONTDATA_ITEM(164, 176, 176, fontpage_164_176_176), // '到' -- '到' + FONTDATA_ITEM(164, 182, 183, fontpage_164_182_183), // '制' -- '刷' + FONTDATA_ITEM(164, 245, 245, fontpage_164_245_245), // '創' -- '創' + FONTDATA_ITEM(165, 155, 155, fontpage_165_155_155), // '力' -- '力' + FONTDATA_ITEM(165, 160, 160, fontpage_165_160_160), // '加' -- '加' + FONTDATA_ITEM(165, 213, 213, fontpage_165_213_213), // '動' -- '動' + FONTDATA_ITEM(166, 150, 150, fontpage_166_150_150), // '化' -- '化' + FONTDATA_ITEM(166, 202, 202, fontpage_166_202_202), // '半' -- '半' + FONTDATA_ITEM(166, 212, 212, fontpage_166_212_212), // '協' -- '協' + FONTDATA_ITEM(166, 225, 225, fontpage_166_225_225), // '卡' -- '卡' + FONTDATA_ITEM(166, 240, 240, fontpage_166_240_240), // '印' -- '印' + FONTDATA_ITEM(166, 248, 248, fontpage_166_248_248), // '卸' -- '卸' + FONTDATA_ITEM(166, 251, 251, fontpage_166_251_251), // '卻' -- '卻' + FONTDATA_ITEM(167, 159, 159, fontpage_167_159_159), // '原' -- '原' + FONTDATA_ITEM(167, 205, 205, fontpage_167_205_205), // '反' -- '反' + FONTDATA_ITEM(167, 214, 214, fontpage_167_214_214), // '取' -- '取' + FONTDATA_ITEM(167, 240, 240, fontpage_167_240_240), // '台' -- '台' + FONTDATA_ITEM(168, 136, 136, fontpage_168_136_136), // '合' -- '合' + FONTDATA_ITEM(168, 166, 166, fontpage_168_166_166), // '否' -- '否' + FONTDATA_ITEM(168, 202, 202, fontpage_168_202_202), // '告' -- '告' + FONTDATA_ITEM(168, 253, 253, fontpage_168_253_253), // '命' -- '命' + FONTDATA_ITEM(169, 140, 140, fontpage_169_140_140), // '和' -- '和' + FONTDATA_ITEM(170, 223, 223, fontpage_170_223_223), // '啟' -- '啟' + FONTDATA_ITEM(171, 174, 174, fontpage_171_174_174), // '單' -- '單' + 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(174, 150, 150, fontpage_174_150_150), // '圖' -- '圖' + FONTDATA_ITEM(174, 168, 168, fontpage_174_168_168), // '在' -- '在' + FONTDATA_ITEM(175, 139, 139, fontpage_175_139_139), // '型' -- '型' + FONTDATA_ITEM(175, 247, 247, fontpage_175_247_247), // '執' -- '執' + FONTDATA_ITEM(176, 202, 202, fontpage_176_202_202), // '塊' -- '塊' + FONTDATA_ITEM(176, 235, 235, fontpage_176_235_235), // '填' -- '填' + FONTDATA_ITEM(177, 138, 138, fontpage_177_138_138), // '墊' -- '墊' + FONTDATA_ITEM(178, 150, 150, fontpage_178_150_150), // '外' -- '外' + FONTDATA_ITEM(178, 154, 154, fontpage_178_154_154), // '多' -- '多' + FONTDATA_ITEM(178, 160, 160, fontpage_178_160_160), // '夠' -- '夠' + 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(179, 203, 203, fontpage_179_203_203), // '始' -- '始' + FONTDATA_ITEM(181, 146, 146, fontpage_181_146_146), // '媒' -- '媒' + FONTDATA_ITEM(182, 208, 208, fontpage_182_208_208), // '子' -- '子' + FONTDATA_ITEM(182, 216, 216, fontpage_182_216_216), // '存' -- '存' + FONTDATA_ITEM(183, 137, 137, fontpage_183_137_137), // '安' -- '安' + 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, 185, 185, fontpage_183_185_185), // '容' -- '容' + FONTDATA_ITEM(184, 141, 141, fontpage_184_141_141), // '對' -- '對' + FONTDATA_ITEM(184, 143, 143, fontpage_184_143_143), // '小' -- '小' + FONTDATA_ITEM(184, 177, 177, fontpage_184_177_177), // '就' -- '就' + 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(189, 138, 138, fontpage_189_138_138), // '床' -- '床' + FONTDATA_ITEM(189, 166, 166, fontpage_189_166_166), // '度' -- '度' + FONTDATA_ITEM(189, 226, 226, fontpage_189_226_226), // '廢' -- '廢' + FONTDATA_ITEM(189, 250, 250, fontpage_189_250_250), // '建' -- '建' + FONTDATA_ITEM(190, 149, 149, fontpage_190_149_149), // '引' -- '引' + FONTDATA_ITEM(191, 133, 133, fontpage_191_133_133), // '待' -- '待' + FONTDATA_ITEM(191, 140, 140, fontpage_191_140_140), // '後' -- '後' + FONTDATA_ITEM(191, 145, 145, fontpage_191_145_145), // '徑' -- '徑' + FONTDATA_ITEM(191, 158, 158, fontpage_191_158_158), // '從' -- '從' + FONTDATA_ITEM(191, 169, 169, fontpage_191_169_169), // '復' -- '復' + FONTDATA_ITEM(191, 174, 174, fontpage_191_174_174), // '微' -- '微' + FONTDATA_ITEM(191, 195, 195, fontpage_191_195_195), // '心' -- '心' + FONTDATA_ITEM(192, 167, 167, fontpage_192_167_167), // '性' -- '性' + FONTDATA_ITEM(192, 226, 226, fontpage_192_226_226), // '恢' -- '恢' + FONTDATA_ITEM(192, 239, 239, fontpage_192_239_239), // '息' -- '息' + FONTDATA_ITEM(195, 182, 182, fontpage_195_182_182), // '憶' -- '憶' + FONTDATA_ITEM(195, 201, 201, fontpage_195_201_201), // '應' -- '應' + FONTDATA_ITEM(196, 144, 144, fontpage_196_144_144), // '成' -- '成' + FONTDATA_ITEM(196, 182, 182, fontpage_196_182_182), // '戶' -- '戶' + FONTDATA_ITEM(196, 192, 192, fontpage_196_192_192), // '所' -- '所' + FONTDATA_ITEM(196, 199, 199, fontpage_196_199_199), // '扇' -- '扇' + FONTDATA_ITEM(196, 203, 203, fontpage_196_203_203), // '手' -- '手' + FONTDATA_ITEM(196, 211, 211, fontpage_196_211_211), // '打' -- '打' + FONTDATA_ITEM(196, 249, 249, fontpage_196_249_249), // '批' -- '批' + FONTDATA_ITEM(197, 150, 150, fontpage_197_150_150), // '抖' -- '抖' + FONTDATA_ITEM(197, 189, 189, fontpage_197_189_189), // '抽' -- '抽' + FONTDATA_ITEM(197, 212, 212, fontpage_197_212_212), // '拔' -- '拔' + FONTDATA_ITEM(198, 137, 137, fontpage_198_137_137), // '按' -- '按' + 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(199, 219, 219, fontpage_199_219_219), // '換' -- '換' + FONTDATA_ITEM(201, 199, 199, fontpage_201_199_199), // '擇' -- '擇' + FONTDATA_ITEM(201, 202, 203, fontpage_201_202_203), // '擊' -- '擋' + FONTDATA_ITEM(201, 224, 224, fontpage_201_224_224), // '擠' -- '擠' + FONTDATA_ITEM(202, 182, 182, fontpage_202_182_182), // '收' -- '收' + FONTDATA_ITEM(202, 190, 190, fontpage_202_190_190), // '放' -- '放' + FONTDATA_ITEM(202, 215, 215, fontpage_202_215_215), // '敗' -- '敗' + FONTDATA_ITEM(202, 244, 244, fontpage_202_244_244), // '整' -- '整' + FONTDATA_ITEM(202, 248, 248, fontpage_202_248_248), // '數' -- '數' + FONTDATA_ITEM(203, 153, 153, fontpage_203_153_153), // '料' -- '料' + FONTDATA_ITEM(203, 156, 156, fontpage_203_156_156), // '斜' -- '斜' + FONTDATA_ITEM(203, 176, 176, fontpage_203_176_176), // '新' -- '新' + FONTDATA_ITEM(203, 183, 183, fontpage_203_183_183), // '斷' -- '斷' + FONTDATA_ITEM(203, 188, 188, fontpage_203_188_188), // '於' -- '於' + FONTDATA_ITEM(204, 135, 135, fontpage_204_135_135), // '昇' -- '昇' + FONTDATA_ITEM(204, 142, 142, fontpage_204_142_142), // '明' -- '明' + FONTDATA_ITEM(204, 175, 175, fontpage_204_175_175), // '是' -- '是' + FONTDATA_ITEM(204, 194, 194, fontpage_204_194_194), // '時' -- '時' + 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, 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, 157, 157, fontpage_209_157_157), // '條' -- '條' + FONTDATA_ITEM(209, 196, 196, fontpage_209_196_196), // '棄' -- '棄' + FONTDATA_ITEM(211, 253, 253, fontpage_211_253_253), // '槽' -- '槽' + FONTDATA_ITEM(212, 217, 217, fontpage_212_217_217), // '橙' -- '橙' + FONTDATA_ITEM(212, 223, 223, fontpage_212_223_223), // '機' -- '機' + FONTDATA_ITEM(213, 162, 162, fontpage_213_162_162), // '檢' -- '檢' + FONTDATA_ITEM(214, 226, 227, fontpage_214_226_227), // '止' -- '正' + FONTDATA_ITEM(214, 229, 229, fontpage_214_229_229), // '步' -- '步' + FONTDATA_ITEM(214, 248, 248, fontpage_214_248_248), // '歸' -- '歸' + FONTDATA_ITEM(215, 188, 188, fontpage_215_188_188), // '殼' -- '殼' + FONTDATA_ITEM(215, 212, 212, fontpage_215_212_212), // '比' -- '比' + FONTDATA_ITEM(217, 146, 146, fontpage_217_146_146), // '沒' -- '沒' + FONTDATA_ITEM(219, 136, 136, fontpage_219_136_136), // '消' -- '消' + FONTDATA_ITEM(219, 225, 225, fontpage_219_225_225), // '淡' -- '淡' + FONTDATA_ITEM(220, 133, 133, fontpage_220_133_133), // '清' -- '清' + FONTDATA_ITEM(220, 172, 172, fontpage_220_172_172), // '測' -- '測' + FONTDATA_ITEM(221, 144, 144, fontpage_221_144_144), // '源' -- '源' + FONTDATA_ITEM(221, 150, 150, fontpage_221_150_150), // '準' -- '準' + FONTDATA_ITEM(221, 171, 171, fontpage_221_171_171), // '溫' -- '溫' + FONTDATA_ITEM(223, 192, 192, fontpage_223_192_192), // '激' -- '激' + FONTDATA_ITEM(226, 161, 161, fontpage_226_161_161), // '無' -- '無' + FONTDATA_ITEM(227, 177, 177, fontpage_227_177_177), // '熱' -- '熱' + FONTDATA_ITEM(227, 200, 200, fontpage_227_200_200), // '燈' -- '燈' + FONTDATA_ITEM(228, 199, 199, fontpage_228_199_199), // '片' -- '片' + FONTDATA_ITEM(228, 233, 233, fontpage_228_233_233), // '物' -- '物' + FONTDATA_ITEM(231, 135, 135, fontpage_231_135_135), // '率' -- '率' + FONTDATA_ITEM(234, 168, 168, fontpage_234_168_168), // '用' -- '用' + FONTDATA_ITEM(234, 204, 204, fontpage_234_204_204), // '界' -- '界' + FONTDATA_ITEM(236, 253, 253, fontpage_236_253_253), // '白' -- '白' + FONTDATA_ITEM(237, 132, 132, fontpage_237_132_132), // '的' -- '的' + FONTDATA_ITEM(237, 227, 227, fontpage_237_227_227), // '監' -- '監' + FONTDATA_ITEM(237, 244, 244, fontpage_237_244_244), // '直' -- '直' + FONTDATA_ITEM(238, 160, 160, fontpage_238_160_160), // '眠' -- '眠' + FONTDATA_ITEM(240, 141, 141, fontpage_240_141_141), // '砍' -- '砍' + FONTDATA_ITEM(241, 186, 186, fontpage_241_186_186), // '確' -- '確' + FONTDATA_ITEM(243, 251, 251, fontpage_243_251_251), // '移' -- '移' + FONTDATA_ITEM(244, 205, 205, fontpage_244_205_205), // '積' -- '積' + FONTDATA_ITEM(245, 239, 239, fontpage_245_239_239), // '端' -- '端' + FONTDATA_ITEM(246, 201, 201, fontpage_246_201_201), // '等' -- '等' + FONTDATA_ITEM(247, 161, 161, fontpage_247_161_161), // '管' -- '管' + FONTDATA_ITEM(247, 177, 177, fontpage_247_177_177), // '箱' -- '箱' + FONTDATA_ITEM(249, 251, 251, fontpage_249_251_251), // '系' -- '系' + FONTDATA_ITEM(250, 133, 133, fontpage_250_133_133), // '紅' -- '紅' + FONTDATA_ITEM(250, 162, 162, fontpage_250_162_162), // '索' -- '索' + FONTDATA_ITEM(250, 171, 171, fontpage_250_171_171), // '紫' -- '紫' + FONTDATA_ITEM(250, 176, 176, fontpage_250_176_176), // '細' -- '細' + FONTDATA_ITEM(250, 194, 194, fontpage_250_194_194), // '終' -- '終' + FONTDATA_ITEM(250, 241, 242, fontpage_250_241_242), // '統' -- '絲' + FONTDATA_ITEM(251, 160, 160, fontpage_251_160_160), // '綠' -- '綠' + FONTDATA_ITEM(251, 178, 178, fontpage_251_178_178), // '網' -- '網' + FONTDATA_ITEM(251, 210, 210, fontpage_251_210_210), // '緒' -- '緒' + FONTDATA_ITEM(251, 218, 218, fontpage_251_218_218), // '線' -- '線' + FONTDATA_ITEM(251, 232, 232, fontpage_251_232_232), // '編' -- '編' + FONTDATA_ITEM(252, 174, 174, fontpage_252_174_174), // '縮' -- '縮' + FONTDATA_ITEM(252, 189, 189, fontpage_252_189_189), // '總' -- '總' + FONTDATA_ITEM(252, 252, 252, fontpage_252_252_252), // '繼' -- '繼' + FONTDATA_ITEM(253, 140, 140, fontpage_253_140_140), // '續' -- '續' + FONTDATA_ITEM(253, 162, 162, fontpage_253_162_162), // '红' -- '红' + FONTDATA_ITEM(254, 238, 238, fontpage_254_238_238), // '置' -- '置' + FONTDATA_ITEM(254, 242, 242, fontpage_254_242_242), // '署' -- '署' + FONTDATA_ITEM(256, 240, 240, fontpage_256_240_240), // '聰' -- '聰' + FONTDATA_ITEM(259, 234, 234, fontpage_259_234_234), // '自' -- '自' + FONTDATA_ITEM(267, 205, 205, fontpage_267_205_205), // '藍' -- '藍' + FONTDATA_ITEM(272, 204, 204, fontpage_272_204_204), // '行' -- '行' + FONTDATA_ITEM(272, 232, 232, fontpage_272_232_232), // '表' -- '表' + FONTDATA_ITEM(273, 171, 171, fontpage_273_171_171), // '被' -- '被' + FONTDATA_ITEM(273, 197, 197, fontpage_273_197_197), // '装' -- '装' + FONTDATA_ITEM(273, 221, 221, fontpage_273_221_221), // '裝' -- '裝' + FONTDATA_ITEM(274, 135, 135, fontpage_274_135_135), // '複' -- '複' + FONTDATA_ITEM(275, 210, 210, fontpage_275_210_210), // '角' -- '角' + FONTDATA_ITEM(276, 136, 136, fontpage_276_136_136), // '計' -- '計' + FONTDATA_ITEM(276, 138, 138, fontpage_276_138_138), // '訊' -- '訊' + FONTDATA_ITEM(276, 152, 152, fontpage_276_152_152), // '記' -- '記' + FONTDATA_ITEM(276, 173, 173, fontpage_276_173_173), // '設' -- '設' + FONTDATA_ITEM(276, 230, 230, fontpage_276_230_230), // '試' -- '試' + FONTDATA_ITEM(277, 141, 141, fontpage_277_141_141), // '認' -- '認' + FONTDATA_ITEM(277, 164, 164, fontpage_277_164_164), // '誤' -- '誤' + FONTDATA_ITEM(277, 191, 191, fontpage_277_191_191), // '調' -- '調' + FONTDATA_ITEM(277, 203, 203, fontpage_277_203_203), // '請' -- '請' + FONTDATA_ITEM(278, 240, 240, fontpage_278_240_240), // '議' -- '議' + FONTDATA_ITEM(279, 128, 128, fontpage_279_128_128), // '讀' -- '讀' + FONTDATA_ITEM(279, 138, 138, fontpage_279_138_138), // '變' -- '變' + FONTDATA_ITEM(281, 199, 199, fontpage_281_199_199), // '資' -- '資' + FONTDATA_ITEM(283, 221, 221, fontpage_283_221_221), // '距' -- '距' + FONTDATA_ITEM(285, 202, 202, fontpage_285_202_202), // '車' -- '車' + FONTDATA_ITEM(285, 223, 223, fontpage_285_223_223), // '軟' -- '軟' + FONTDATA_ITEM(285, 248, 248, fontpage_285_248_248), // '軸' -- '軸' + FONTDATA_ITEM(286, 137, 137, fontpage_286_137_137), // '載' -- '載' + FONTDATA_ITEM(286, 175, 175, fontpage_286_175_175), // '輯' -- '輯' + FONTDATA_ITEM(286, 184, 184, fontpage_286_184_184), // '輸' -- '輸' + FONTDATA_ITEM(286, 201, 201, fontpage_286_201_201), // '轉' -- '轉' + FONTDATA_ITEM(287, 209, 209, fontpage_287_209_209), // '近' -- '近' + FONTDATA_ITEM(287, 212, 212, fontpage_287_212_212), // '返' -- '返' + FONTDATA_ITEM(288, 128, 128, fontpage_288_128_128), // '退' -- '退' + FONTDATA_ITEM(288, 159, 159, fontpage_288_159_159), // '速' -- '速' + FONTDATA_ITEM(288, 163, 163, fontpage_288_163_163), // '連' -- '連' + FONTDATA_ITEM(288, 178, 178, fontpage_288_178_178), // '進' -- '進' + FONTDATA_ITEM(288, 203, 203, fontpage_288_203_203), // '運' -- '運' + FONTDATA_ITEM(288, 212, 212, fontpage_288_212_212), // '達' -- '達' + FONTDATA_ITEM(288, 248, 248, fontpage_288_248_248), // '選' -- '選' + FONTDATA_ITEM(289, 132, 132, fontpage_289_132_132), // '還' -- '還' + FONTDATA_ITEM(289, 138, 138, fontpage_289_138_138), // '邊' -- '邊' + FONTDATA_ITEM(289, 232, 232, fontpage_289_232_232), // '部' -- '部' + FONTDATA_ITEM(291, 203, 203, fontpage_291_203_203), // '釋' -- '釋' + FONTDATA_ITEM(291, 205, 205, fontpage_291_205_205), // '重' -- '重' + FONTDATA_ITEM(291, 207, 207, fontpage_291_207_207), // '量' -- '量' + FONTDATA_ITEM(291, 221, 221, fontpage_291_221_221), // '針' -- '針' + FONTDATA_ITEM(292, 149, 149, fontpage_292_149_149), // '鈕' -- '鈕' + FONTDATA_ITEM(294, 175, 175, fontpage_294_175_175), // '錯' -- '錯' + FONTDATA_ITEM(294, 245, 245, fontpage_294_245_245), // '鍵' -- '鍵' + FONTDATA_ITEM(298, 247, 247, fontpage_298_247_247), // '長' -- '長' + FONTDATA_ITEM(299, 137, 137, fontpage_299_137_137), // '閉' -- '閉' + FONTDATA_ITEM(299, 139, 139, fontpage_299_139_139), // '開' -- '開' + FONTDATA_ITEM(299, 147, 147, fontpage_299_147_147), // '間' -- '間' + FONTDATA_ITEM(299, 220, 220, fontpage_299_220_220), // '關' -- '關' + FONTDATA_ITEM(300, 205, 205, fontpage_300_205_205), // '降' -- '降' + FONTDATA_ITEM(300, 228, 228, fontpage_300_228_228), // '除' -- '除' + FONTDATA_ITEM(301, 142, 142, fontpage_301_142_142), // '階' -- '階' + FONTDATA_ITEM(301, 217, 217, fontpage_301_217_217), // '雙' -- '雙' + FONTDATA_ITEM(301, 226, 226, fontpage_301_226_226), // '離' -- '離' + FONTDATA_ITEM(301, 251, 251, fontpage_301_251_251), // '電' -- '電' + FONTDATA_ITEM(302, 210, 210, fontpage_302_210_210), // '青' -- '青' + FONTDATA_ITEM(302, 222, 222, fontpage_302_222_222), // '非' -- '非' + FONTDATA_ITEM(302, 226, 226, fontpage_302_226_226), // '面' -- '面' + FONTDATA_ITEM(304, 133, 133, fontpage_304_133_133), // '項' -- '項' + FONTDATA_ITEM(304, 144, 144, fontpage_304_144_144), // '預' -- '預' + FONTDATA_ITEM(304, 205, 205, fontpage_304_205_205), // '額' -- '額' + FONTDATA_ITEM(304, 222, 222, fontpage_304_222_222), // '類' -- '類' + FONTDATA_ITEM(305, 168, 168, fontpage_305_168_168), // '風' -- '風' + FONTDATA_ITEM(305, 253, 253, fontpage_305_253_253), // '飽' -- '飽' + FONTDATA_ITEM(306, 152, 152, fontpage_306_152_152), // '餘' -- '餘' + FONTDATA_ITEM(307, 172, 172, fontpage_307_172_172), // '馬' -- '馬' + FONTDATA_ITEM(308, 197, 197, fontpage_308_197_197), // '驅' -- '驅' + FONTDATA_ITEM(309, 212, 212, fontpage_309_212_212), // '體' -- '體' + FONTDATA_ITEM(309, 216, 216, fontpage_309_216_216), // '高' -- '高' + FONTDATA_ITEM(317, 195, 195, fontpage_317_195_195), // '黃' -- '黃' + FONTDATA_ITEM(317, 222, 222, fontpage_317_222_222), // '點' -- '點' + FONTDATA_ITEM(318, 202, 202, fontpage_318_202_202), // '齊' -- '齊' + FONTDATA_ITEM(510, 154, 154, fontpage_510_154_154), // ':' -- ':' +}; diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp new file mode 100644 index 00000000..a6bdb373 --- /dev/null +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -0,0 +1,56 @@ +/** + * @file lcdprint_u8g.cpp + * @brief LCD print api for u8glib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "ultralcd_DOGM.h" + +#include "../ultralcd.h" +#include "../../MarlinCore.h" + +#include "../fontutils.h" +#include "u8g_fontutf8.h" +#include "../lcdprint.h" + +int lcd_glyph_height() { return u8g_GetFontBBXHeight(u8g.getU8g()); } + +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) { u8g.setPrintPos(col, row); } + +void lcd_put_int(const int i) { u8g.print(i); } + +// return < 0 on error +// return the advanced pixels +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) { + if (c < 256) { + u8g.print((char)c); + return u8g_GetFontBBXWidth(u8g.getU8g()); + } + u8g_uint_t x = u8g.getPrintCol(), y = u8g.getPrintRow(), + ret = uxg_DrawWchar(u8g.getU8g(), x, y, c, max_length); + u8g.setPrintPos(x + ret, y); + return ret; +} + +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) { + u8g_uint_t x = u8g.getPrintCol(), y = u8g.getPrintRow(), + ret = uxg_DrawUtf8Str(u8g.getU8g(), x, y, utf8_str, max_length); + u8g.setPrintPos(x + ret, y); + return ret; +} + +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) { + u8g_uint_t x = u8g.getPrintCol(), y = u8g.getPrintRow(), + ret = uxg_DrawUtf8StrP(u8g.getU8g(), x, y, utf8_str_P, max_length); + u8g.setPrintPos(x + ret, y); + return ret; +} + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp new file mode 100644 index 00000000..98792420 --- /dev/null +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -0,0 +1,916 @@ +/** + * 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 . + * + */ + +// +// status_screen_DOGM.cpp +// Standard Status Screen for Graphical Display +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB && DISABLED(LIGHTWEIGHT_UI) + +#include "dogm_Statusscreen.h" +#include "ultralcd_DOGM.h" +#include "../ultralcd.h" +#include "../lcdprint.h" +#include "../../libs/numtostr.h" + +#include "../../module/motion.h" +#include "../../module/temperature.h" + +#if ENABLED(FILAMENT_LCD_DISPLAY) + #include "../../feature/filwidth.h" + #include "../../module/planner.h" + #include "../../gcode/parser.h" +#endif + +#if HAS_CUTTER + #include "../../feature/spindle_laser.h" +#endif + +#if HAS_POWER_MONITOR + #include "../../feature/power_monitor.h" +#endif + +#if ENABLED(SDSUPPORT) + #include "../../sd/cardreader.h" +#endif + +#if HAS_PRINT_PROGRESS + #include "../../module/printcounter.h" +#endif + +#if HAS_DUAL_MIXING + #include "../../feature/mixing.h" +#endif + +#define X_LABEL_POS 3 +#define X_VALUE_POS 11 +#define XYZ_SPACING 37 +#define XYZ_BASELINE (30 + INFO_FONT_ASCENT) +#define EXTRAS_BASELINE (40 + INFO_FONT_ASCENT) +#define STATUS_BASELINE (LCD_PIXEL_HEIGHT - INFO_FONT_DESCENT) + +#if ANIM_HBCC + enum HeatBits : uint8_t { + HEATBIT_HOTEND, + HEATBIT_BED = HOTENDS, + HEATBIT_CHAMBER, + HEATBIT_CUTTER + }; + IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits; +#endif + +#if ANIM_HOTEND + #define HOTEND_ALT(N) TEST(heat_bits, HEATBIT_HOTEND + N) +#else + #define HOTEND_ALT(N) false +#endif +#if ANIM_BED + #define BED_ALT() TEST(heat_bits, HEATBIT_BED) +#else + #define BED_ALT() false +#endif +#if ANIM_CHAMBER + #define CHAMBER_ALT() TEST(heat_bits, HEATBIT_CHAMBER) +#else + #define CHAMBER_ALT() false +#endif +#if ANIM_CUTTER + #define CUTTER_ALT(N) TEST(heat_bits, HEATBIT_CUTTER) +#else + #define CUTTER_ALT() false +#endif + +#if DO_DRAW_HOTENDS + #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) + #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1) +#endif + +#if HAS_POWER_MONITOR + + void display_power_monitor(const uint8_t x, const uint8_t y) { + + 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 + // 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 + for (uint8_t i = 0; i < 3; i++) { + #if ENABLED(POWER_MONITOR_CURRENT) + if (power_monitor.display_item == 0 && !iflag) ++power_monitor.display_item; + #endif + #if HAS_POWER_MONITOR_VREF + if (power_monitor.display_item == 1 && !vflag) ++power_monitor.display_item; + #endif + #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; + } + + switch (power_monitor.display_item) { + #if ENABLED(POWER_MONITOR_CURRENT) // Current + case 0: if (iflag) power_monitor.draw_current(); break; + #endif + #if HAS_POWER_MONITOR_VREF // Voltage + case 1: if (vflag) power_monitor.draw_voltage(); break; + #endif + #if HAS_POWER_MONITOR_WATTS // Power + case 2: if (wflag) power_monitor.draw_power(); break; + #endif + default: break; + } + } +#endif + +#define PROGRESS_BAR_X 54 +#define PROGRESS_BAR_Y (EXTRAS_BASELINE + 1) +#define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) + +FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, const uint8_t ty) { + const char *str = i16tostr3rj(temp); + const uint8_t len = str[0] != ' ' ? 3 : str[1] != ' ' ? 2 : 1; + lcd_put_u8str(tx - len * (INFO_FONT_WIDTH) / 2 + 1, ty, &str[3-len]); + lcd_put_wchar(LCD_STR_DEGREE[0]); +} + +#if DO_DRAW_HOTENDS + + // Draw hotend bitmap with current and target temperatures + FORCE_INLINE void _draw_hotend_status(const heater_id_t heater_id, const bool blink) { + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #endif + + const bool isHeat = HOTEND_ALT(heater_id); + + const uint8_t tx = STATUS_HOTEND_TEXT_X(heater_id); + + const float temp = thermalManager.degHotend(heater_id), + target = thermalManager.degTargetHotend(heater_id); + + #if DISABLED(STATUS_HOTEND_ANIM) + #define STATIC_HOTEND true + #define HOTEND_DOT isHeat + #else + #define STATIC_HOTEND false + #define HOTEND_DOT false + #endif + + #if ANIM_HOTEND && BOTH(STATUS_HOTEND_INVERTED, STATUS_HOTEND_NUMBERLESS) + #define OFF_BMP(N) status_hotend_b_bmp + #define ON_BMP(N) status_hotend_a_bmp + #elif ANIM_HOTEND && DISABLED(STATUS_HOTEND_INVERTED) && ENABLED(STATUS_HOTEND_NUMBERLESS) + #define OFF_BMP(N) status_hotend_a_bmp + #define ON_BMP(N) status_hotend_b_bmp + #elif BOTH(ANIM_HOTEND, STATUS_HOTEND_INVERTED) + #define OFF_BMP(N) status_hotend##N##_b_bmp + #define ON_BMP(N) status_hotend##N##_a_bmp + #else + #define OFF_BMP(N) status_hotend##N##_a_bmp + #define ON_BMP(N) status_hotend##N##_b_bmp + #endif + + #if STATUS_HOTEND_BITMAPS > 1 + static const unsigned char* const status_hotend_gfx[STATUS_HOTEND_BITMAPS] PROGMEM = ARRAY_N(STATUS_HOTEND_BITMAPS, OFF_BMP(1), OFF_BMP(2), OFF_BMP(3), OFF_BMP(4), OFF_BMP(5), OFF_BMP(6)); + #if ANIM_HOTEND + static const unsigned char* const status_hotend_on_gfx[STATUS_HOTEND_BITMAPS] PROGMEM = ARRAY_N(STATUS_HOTEND_BITMAPS, ON_BMP(1), ON_BMP(2), ON_BMP(3), ON_BMP(4), ON_BMP(5), ON_BMP(6)); + #define HOTEND_BITMAP(N,S) (unsigned char*)pgm_read_ptr((S) ? &status_hotend_on_gfx[(N) % (STATUS_HOTEND_BITMAPS)] : &status_hotend_gfx[(N) % (STATUS_HOTEND_BITMAPS)]) + #else + #define HOTEND_BITMAP(N,S) (unsigned char*)pgm_read_ptr(&status_hotend_gfx[(N) % (STATUS_HOTEND_BITMAPS)]) + #endif + #elif ANIM_HOTEND + #define HOTEND_BITMAP(N,S) ((S) ? ON_BMP() : OFF_BMP()) + #else + #define HOTEND_BITMAP(N,S) status_hotend_a_bmp + #endif + + if (PAGE_CONTAINS(STATUS_HEATERS_Y, STATUS_HEATERS_BOT)) { + + #define BAR_TALL (STATUS_HEATERS_HEIGHT - 2) + + const float prop = target - 20, + perc = prop > 0 && temp >= 20 ? (temp - 20) / prop : 0; + uint8_t tall = uint8_t(perc * BAR_TALL + 0.5f); + NOMORE(tall, BAR_TALL); + + #if ANIM_HOTEND + // Draw hotend bitmap, either whole or split by the heating percent + const uint8_t hx = STATUS_HOTEND_X(heater_id), + bw = STATUS_HOTEND_BYTEWIDTH(heater_id); + #if ENABLED(STATUS_HEAT_PERCENT) + if (isHeat && tall <= BAR_TALL) { + const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall; + u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, ph, HOTEND_BITMAP(heater_id, false)); + u8g.drawBitmapP(hx, STATUS_HEATERS_Y + ph, bw, tall + 1, HOTEND_BITMAP(heater_id, true) + ph * bw); + } + else + #endif + u8g.drawBitmapP(hx, STATUS_HEATERS_Y, bw, STATUS_HEATERS_HEIGHT, HOTEND_BITMAP(heater_id, isHeat)); + #endif + + } // PAGE_CONTAINS + + if (PAGE_UNDER(7)) { + #if HEATER_IDLE_HANDLER + const bool dodraw = (blink || !thermalManager.heater_idle[heater_id].timed_out); + #else + constexpr bool dodraw = true; + #endif + if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); + } + + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_temp(temp + 0.5f, tx, 28); + + if (STATIC_HOTEND && HOTEND_DOT && PAGE_CONTAINS(17, 19)) { + u8g.setColorIndex(0); // set to white on black + u8g.drawBox(tx, 20 - 3, 2, 2); + u8g.setColorIndex(1); // restore black on white + } + + } + +#endif // DO_DRAW_HOTENDS + +#if DO_DRAW_BED + + // Draw bed bitmap with current and target temperatures + FORCE_INLINE void _draw_bed_status(const bool blink) { + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #endif + + const uint8_t tx = STATUS_BED_TEXT_X; + + const float temp = thermalManager.degBed(), + target = thermalManager.degTargetBed(); + + #if ENABLED(STATUS_HEAT_PERCENT) || DISABLED(STATUS_BED_ANIM) + const bool isHeat = BED_ALT(); + #endif + + #if DISABLED(STATUS_BED_ANIM) + #define STATIC_BED true + #define BED_DOT isHeat + #else + #define STATIC_BED false + #define BED_DOT false + #endif + + if (PAGE_CONTAINS(STATUS_HEATERS_Y, STATUS_HEATERS_BOT)) { + + #define BAR_TALL (STATUS_HEATERS_HEIGHT - 2) + + const float prop = target - 20, + perc = prop > 0 && temp >= 20 ? (temp - 20) / prop : 0; + uint8_t tall = uint8_t(perc * BAR_TALL + 0.5f); + NOMORE(tall, BAR_TALL); + + // Draw a heating progress bar, if specified + #if ENABLED(STATUS_HEAT_PERCENT) + + if (isHeat) { + const uint8_t bx = STATUS_BED_X + STATUS_BED_WIDTH; + u8g.drawFrame(bx, STATUS_HEATERS_Y, 3, STATUS_HEATERS_HEIGHT); + if (tall) { + const uint8_t ph = STATUS_HEATERS_HEIGHT - 1 - tall; + if (PAGE_OVER(STATUS_HEATERS_Y + ph)) + u8g.drawVLine(bx + 1, STATUS_HEATERS_Y + ph, tall); + } + } + + #endif + + } // PAGE_CONTAINS + + if (PAGE_UNDER(7)) { + #if HEATER_IDLE_HANDLER + const bool dodraw = (blink || !thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); + #else + constexpr bool dodraw = true; + #endif + if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); + } + + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_temp(temp + 0.5f, tx, 28); + + if (STATIC_BED && BED_DOT && PAGE_CONTAINS(17, 19)) { + u8g.setColorIndex(0); // set to white on black + u8g.drawBox(tx, 20 - 2, 2, 2); + u8g.setColorIndex(1); // restore black on white + } + + } + +#endif // DO_DRAW_BED + +#if DO_DRAW_CHAMBER + + FORCE_INLINE void _draw_chamber_status() { + #if HAS_HEATED_CHAMBER + if (PAGE_UNDER(7)) + _draw_centered_temp(thermalManager.degTargetChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 7); + #endif + + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_temp(thermalManager.degChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 28); + } + +#endif // DO_DRAW_CHAMBER + +// +// Before homing, blink '123' <-> '???'. +// Homed but unknown... '123' <-> ' '. +// Homed and known, display constantly. +// +FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink) { + const AxisEnum a = TERN(LCD_SHOW_E_TOTAL, axis == E_AXIS ? X_AXIS : axis, axis); + const uint8_t offs = (XYZ_SPACING) * a; + lcd_put_wchar(X_LABEL_POS + offs, XYZ_BASELINE, axis_codes[axis]); + lcd_moveto(X_VALUE_POS + offs, XYZ_BASELINE); + if (blink) + lcd_put_u8str(value); + else { + if (!TEST(axis_homed, axis)) + while (const char c = *value++) lcd_put_wchar(c <= '.' ? c : '?'); + else { + #if NONE(HOME_AFTER_DEACTIVATE, DISABLE_REDUCED_ACCURACY_WARNING) + if (!TEST(axis_known_position, axis)) + lcd_put_u8str_P(axis == Z_AXIS ? PSTR(" ") : PSTR(" ")); + else + #endif + lcd_put_u8str(value); + } + } +} + +void MarlinUI::draw_status_screen() { + + static char xstring[TERN(LCD_SHOW_E_TOTAL, 12, 5)], ystring[5], zstring[8]; + #if ENABLED(FILAMENT_LCD_DISPLAY) + static char wstring[5], mstring[4]; + #endif + + #if HAS_PRINT_PROGRESS + #if DISABLED(DOGM_SD_PERCENT) + #define _SD_INFO_X(len) (PROGRESS_BAR_X + (PROGRESS_BAR_WIDTH) / 2 - (len) * (MENU_FONT_WIDTH) / 2) + #else + #define _SD_INFO_X(len) (LCD_PIXEL_WIDTH - (len) * (MENU_FONT_WIDTH)) + #endif + + #if ENABLED(DOGM_SD_PERCENT) + static char progress_string[5]; + #endif + static uint8_t lastElapsed = 0xFF, lastProgress = 0xFF; + static u8g_uint_t elapsed_x_pos = 0, progress_bar_solid_width = 0; + static char elapsed_string[16]; + #if ENABLED(SHOW_REMAINING_TIME) + static u8g_uint_t estimation_x_pos = 0; + static char estimation_string[10]; + #if BOTH(DOGM_SD_PERCENT, ROTATE_PROGRESS_DISPLAY) + static u8g_uint_t progress_x_pos = 0; + static uint8_t progress_state = 0; + static bool prev_blink = 0; + #endif + #endif + #endif + + 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) { + #if ANIM_HBCC + uint8_t new_bits = 0; + #if ANIM_HOTEND + HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, HEATBIT_HOTEND + e); + #endif + if (TERN0(ANIM_BED, thermalManager.isHeatingBed())) SBI(new_bits, HEATBIT_BED); + #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER + if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER); + #endif + if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, HEATBIT_CUTTER); + heat_bits = new_bits; + #endif + + const xyz_pos_t lpos = current_position.asLogical(); + strcpy(zstring, ftostr52sp(lpos.z)); + + 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)); + strcpy(mstring, i16tostr3rj(planner.volumetric_percent(parser.volumetric_enabled))); + #endif + + // Progress / elapsed / estimation updates and string formatting to avoid float math on each LCD draw + #if HAS_PRINT_PROGRESS + const progress_t progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, get_progress_permyriad, get_progress_percent)(); + duration_t elapsed = print_job_timer.duration(); + const uint8_t p = progress & 0xFF, ev = elapsed.value & 0xFF; + if (p != lastProgress) { + lastProgress = p; + + progress_bar_solid_width = u8g_uint_t((PROGRESS_BAR_WIDTH - 2) * (progress / (PROGRESS_SCALE)) * 0.01f); + + #if ENABLED(DOGM_SD_PERCENT) + if (progress == 0) { + progress_string[0] = '\0'; + #if ENABLED(SHOW_REMAINING_TIME) + estimation_string[0] = '\0'; + estimation_x_pos = _SD_INFO_X(0); + #endif + } + else + strcpy(progress_string, TERN(PRINT_PROGRESS_SHOW_DECIMALS, permyriadtostr4(progress), ui8tostr3rj(progress / (PROGRESS_SCALE)))); + + #if BOTH(SHOW_REMAINING_TIME, ROTATE_PROGRESS_DISPLAY) // Tri-state progress display mode + progress_x_pos = _SD_INFO_X(strlen(progress_string) + 1); + #endif + #endif + } + + constexpr bool can_show_days = DISABLED(DOGM_SD_PERCENT) || ENABLED(ROTATE_PROGRESS_DISPLAY); + if (ev != lastElapsed) { + lastElapsed = ev; + const uint8_t len = elapsed.toDigital(elapsed_string, can_show_days && elapsed.value >= 60*60*24L); + elapsed_x_pos = _SD_INFO_X(len); + + #if ENABLED(SHOW_REMAINING_TIME) + if (!(ev & 0x3)) { + uint32_t timeval = (0 + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + + get_remaining_time() + #endif + ); + if (!timeval && progress > 0) timeval = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + if (!timeval) { + estimation_string[0] = '\0'; + estimation_x_pos = _SD_INFO_X(0); + } + else { + duration_t estimation = timeval; + const uint8_t len = estimation.toDigital(estimation_string, can_show_days && estimation.value >= 60*60*24L); + estimation_x_pos = _SD_INFO_X(len + #if !BOTH(DOGM_SD_PERCENT, ROTATE_PROGRESS_DISPLAY) + + 1 + #endif + ); + } + } + #endif + } + #endif + } + + const bool blink = get_blink(); + + // Status Menu Font + set_font(FONT_STATUSMENU); + + #if DO_DRAW_LOGO + if (PAGE_CONTAINS(STATUS_LOGO_Y, STATUS_LOGO_Y + STATUS_LOGO_HEIGHT - 1)) + u8g.drawBitmapP(STATUS_LOGO_X, STATUS_LOGO_Y, STATUS_LOGO_BYTEWIDTH, STATUS_LOGO_HEIGHT, status_logo_bmp); + #endif + + #if STATUS_HEATERS_WIDTH + // Draw all heaters (and maybe the bed) in one go + if (PAGE_CONTAINS(STATUS_HEATERS_Y, STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1)) + u8g.drawBitmapP(STATUS_HEATERS_X, STATUS_HEATERS_Y, STATUS_HEATERS_BYTEWIDTH, STATUS_HEATERS_HEIGHT, status_heaters_bmp); + #endif + + #if DO_DRAW_CUTTER && DISABLED(STATUS_COMBINE_HEATERS) + #if ANIM_CUTTER + #define CUTTER_BITMAP(S) ((S) ? status_cutter_on_bmp : status_cutter_bmp) + #else + #define CUTTER_BITMAP(S) status_cutter_bmp + #endif + const uint8_t cuttery = STATUS_CUTTER_Y(CUTTER_ALT()), + cutterh = STATUS_CUTTER_HEIGHT(CUTTER_ALT()); + if (PAGE_CONTAINS(cuttery, cuttery + cutterh - 1)) + u8g.drawBitmapP(STATUS_CUTTER_X, cuttery, STATUS_CUTTER_BYTEWIDTH, cutterh, CUTTER_BITMAP(CUTTER_ALT())); + #endif + + #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS) + #if ANIM_BED + #define BED_BITMAP(S) ((S) ? status_bed_on_bmp : status_bed_bmp) + #else + #define BED_BITMAP(S) status_bed_bmp + #endif + const uint8_t bedy = STATUS_BED_Y(BED_ALT()), + bedh = STATUS_BED_HEIGHT(BED_ALT()); + if (PAGE_CONTAINS(bedy, bedy + bedh - 1)) + u8g.drawBitmapP(STATUS_BED_X, bedy, STATUS_BED_BYTEWIDTH, bedh, BED_BITMAP(BED_ALT())); + #endif + + #if DO_DRAW_CHAMBER && DISABLED(STATUS_COMBINE_HEATERS) + #if ANIM_CHAMBER + #define CHAMBER_BITMAP(S) ((S) ? status_chamber_on_bmp : status_chamber_bmp) + #else + #define CHAMBER_BITMAP(S) status_chamber_bmp + #endif + const uint8_t chambery = STATUS_CHAMBER_Y(CHAMBER_ALT()), + chamberh = STATUS_CHAMBER_HEIGHT(CHAMBER_ALT()); + if (PAGE_CONTAINS(chambery, chambery + chamberh - 1)) + u8g.drawBitmapP(STATUS_CHAMBER_X, chambery, STATUS_CHAMBER_BYTEWIDTH, chamberh, CHAMBER_BITMAP(CHAMBER_ALT())); + #endif + + #if DO_DRAW_FAN + #if STATUS_FAN_FRAMES > 2 + static bool old_blink; + static uint8_t fan_frame; + if (old_blink != blink) { + old_blink = blink; + if (!thermalManager.fan_speed[0] || ++fan_frame >= STATUS_FAN_FRAMES) fan_frame = 0; + } + #endif + if (PAGE_CONTAINS(STATUS_FAN_Y, STATUS_FAN_Y + STATUS_FAN_HEIGHT - 1)) + u8g.drawBitmapP(STATUS_FAN_X, STATUS_FAN_Y, STATUS_FAN_BYTEWIDTH, STATUS_FAN_HEIGHT, + #if STATUS_FAN_FRAMES > 2 + fan_frame == 1 ? status_fan1_bmp : + fan_frame == 2 ? status_fan2_bmp : + #if STATUS_FAN_FRAMES > 3 + fan_frame == 3 ? status_fan3_bmp : + #endif + #elif STATUS_FAN_FRAMES > 1 + blink && thermalManager.fan_speed[0] ? status_fan1_bmp : + #endif + status_fan0_bmp + ); + #endif + + // + // Temperature Graphics and Info + // + if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) { + // Extruders + #if DO_DRAW_HOTENDS + LOOP_L_N(e, MAX_HOTEND_DRAW) + _draw_hotend_status((heater_id_t)e, blink); + #endif + + // Laser / Spindle + #if DO_DRAW_CUTTER + if (cutter.isReady && PAGE_CONTAINS(STATUS_CUTTER_TEXT_Y - INFO_FONT_ASCENT, STATUS_CUTTER_TEXT_Y - 1)) { + #if CUTTER_UNIT_IS(PERCENT) + lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, cutter_power2str(cutter.unitPower)); + lcd_put_wchar('%'); + #elif CUTTER_UNIT_IS(RPM) + lcd_put_u8str(STATUS_CUTTER_TEXT_X - 2, STATUS_CUTTER_TEXT_Y, ftostr51rj(float(cutter.unitPower) / 1000)); + lcd_put_wchar('K'); + #else + lcd_put_u8str(STATUS_CUTTER_TEXT_X, STATUS_CUTTER_TEXT_Y, cutter_power2str(cutter.unitPower)); + #endif + } + #endif + + // Heated Bed + TERN_(DO_DRAW_BED, _draw_bed_status(blink)); + + // Heated Chamber + TERN_(DO_DRAW_CHAMBER, _draw_chamber_status()); + + // Fan, if a bitmap was provided + #if DO_DRAW_FAN + if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { + char c = '%'; + uint16_t spd = thermalManager.fan_speed[0]; + if (spd) { + #if ENABLED(ADAPTIVE_FAN_SLOWING) + if (!blink && thermalManager.fan_speed_scaler[0] < 128) { + spd = thermalManager.scaledFanSpeed(0, spd); + c = '*'; + } + #endif + lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.fanPercent(spd))); + lcd_put_wchar(c); + } + } + #endif + } + + #if ENABLED(SDSUPPORT) + // + // SD Card Symbol + // + if (card.isFileOpen() && PAGE_CONTAINS(42, 51)) { + // Upper box + u8g.drawBox(42, 42, 8, 7); // 42-48 (or 41-47) + // Right edge + u8g.drawBox(50, 44, 2, 5); // 44-48 (or 43-47) + // Bottom hollow box + u8g.drawFrame(42, 49, 10, 4); // 49-52 (or 48-51) + // Corner pixel + u8g.drawPixel(50, 43); // 43 (or 42) + } + #endif // SDSUPPORT + + #if HAS_PRINT_PROGRESS + // + // Progress bar frame + // + + if (PAGE_CONTAINS(PROGRESS_BAR_Y, PROGRESS_BAR_Y + 3)) + u8g.drawFrame(PROGRESS_BAR_X, PROGRESS_BAR_Y, PROGRESS_BAR_WIDTH, 4); + + // + // Progress bar solid part + // + + if (PAGE_CONTAINS(PROGRESS_BAR_Y + 1, PROGRESS_BAR_Y + 2)) + u8g.drawBox(PROGRESS_BAR_X + 1, PROGRESS_BAR_Y + 1, progress_bar_solid_width, 2); + + if (PAGE_CONTAINS(EXTRAS_BASELINE - INFO_FONT_ASCENT, EXTRAS_BASELINE - 1)) { + + #if ALL(DOGM_SD_PERCENT, SHOW_REMAINING_TIME, ROTATE_PROGRESS_DISPLAY) + + if (prev_blink != blink) { + prev_blink = blink; + if (++progress_state >= 3) progress_state = 0; + } + + if (progress_state == 0) { + if (progress_string[0]) { + lcd_put_u8str(progress_x_pos, EXTRAS_BASELINE, progress_string); + lcd_put_wchar('%'); + } + } + else if (progress_state == 2 && estimation_string[0]) { + lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, PSTR("R:")); + lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); + } + else if (elapsed_string[0]) { + lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, E_LBL); + lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); + } + + #else // !DOGM_SD_PERCENT || !SHOW_REMAINING_TIME || !ROTATE_PROGRESS_DISPLAY + + // + // SD Percent Complete + // + + #if ENABLED(DOGM_SD_PERCENT) + if (progress_string[0]) { + lcd_put_u8str(55, EXTRAS_BASELINE, progress_string); // Percent complete + lcd_put_wchar('%'); + } + #endif + + // + // Elapsed Time + // + + #if ENABLED(SHOW_REMAINING_TIME) + if (blink && estimation_string[0]) { + lcd_put_wchar(estimation_x_pos, EXTRAS_BASELINE, 'R'); + lcd_put_u8str(estimation_string); + } + else + #endif + lcd_put_u8str(elapsed_x_pos, EXTRAS_BASELINE, elapsed_string); + + #endif // !DOGM_SD_PERCENT || !SHOW_REMAINING_TIME || !ROTATE_PROGRESS_DISPLAY + } + + #endif // HAS_PRINT_PROGRESS + + // + // XYZ Coordinates + // + + #if EITHER(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) + #define XYZ_FRAME_TOP 29 + #define XYZ_FRAME_HEIGHT INFO_FONT_ASCENT + 3 + #else + #define XYZ_FRAME_TOP 30 + #define XYZ_FRAME_HEIGHT INFO_FONT_ASCENT + 1 + #endif + + if (PAGE_CONTAINS(XYZ_FRAME_TOP, XYZ_FRAME_TOP + XYZ_FRAME_HEIGHT - 1)) { + + #if DISABLED(XYZ_NO_FRAME) + #if ENABLED(XYZ_HOLLOW_FRAME) + u8g.drawFrame(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 29-40 7: 29-39 + #else + u8g.drawBox(0, XYZ_FRAME_TOP, LCD_PIXEL_WIDTH, XYZ_FRAME_HEIGHT); // 8: 30-39 7: 30-37 + #endif + #endif + + if (PAGE_CONTAINS(XYZ_BASELINE - (INFO_FONT_ASCENT - 1), XYZ_BASELINE)) { + + #if NONE(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) + u8g.setColorIndex(0); // white on black + #endif + + #if HAS_DUAL_MIXING + + // Two-component mix / gradient instead of XY + + char mixer_messages[15]; + PGM_P mix_label; + #if ENABLED(GRADIENT_MIX) + if (mixer.gradient.enabled) { + mixer.update_mix_from_gradient(); + mix_label = PSTR("Gr"); + } + else + #endif + { + mixer.update_mix_from_vtool(); + mix_label = PSTR("Mx"); + } + sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); + lcd_put_u8str(X_LABEL_POS, XYZ_BASELINE, mixer_messages); + + #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 + + _draw_axis_value(Z_AXIS, zstring, blink); + + #if NONE(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) + u8g.setColorIndex(1); // black on white + #endif + } + } + + // + // Feedrate + // + #define EXTRAS_2_BASELINE (EXTRAS_BASELINE + 3) + + if (PAGE_CONTAINS(EXTRAS_2_BASELINE - INFO_FONT_ASCENT, EXTRAS_2_BASELINE - 1)) { + set_font(FONT_MENU); + lcd_put_wchar(3, EXTRAS_2_BASELINE, LCD_STR_FEEDRATE[0]); + + set_font(FONT_STATUSMENU); + lcd_put_u8str(12, EXTRAS_2_BASELINE, i16tostr3rj(feedrate_percentage)); + lcd_put_wchar('%'); + + // + // Filament sensor display if SD is disabled + // + #if ENABLED(FILAMENT_LCD_DISPLAY) && DISABLED(SDSUPPORT) + lcd_put_u8str(56, EXTRAS_2_BASELINE, wstring); + lcd_put_u8str(102, EXTRAS_2_BASELINE, mstring); + lcd_put_wchar('%'); + set_font(FONT_MENU); + lcd_put_wchar(47, EXTRAS_2_BASELINE, LCD_STR_FILAM_DIA[0]); // lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); + lcd_put_wchar(93, EXTRAS_2_BASELINE, LCD_STR_FILAM_MUL[0]); + #endif + } + + // + // Status line + // + if (PAGE_CONTAINS(STATUS_BASELINE - INFO_FONT_ASCENT, STATUS_BASELINE + INFO_FONT_DESCENT)) { + lcd_moveto(0, STATUS_BASELINE); + + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + // Alternate Status message and Filament display + if (ELAPSED(millis(), next_filament_display)) { + lcd_put_u8str_P(PSTR(LCD_STR_FILAM_DIA)); + lcd_put_wchar(':'); + lcd_put_u8str(wstring); + lcd_put_u8str_P(PSTR(" " LCD_STR_FILAM_MUL)); + lcd_put_wchar(':'); + lcd_put_u8str(mstring); + lcd_put_wchar('%'); + return; + } + #endif + + draw_status_message(blink); + } +} + +void MarlinUI::draw_status_message(const bool blink) { + + // Get the UTF8 character count of the string + uint8_t lcd_width = LCD_WIDTH, pixel_width = LCD_PIXEL_WIDTH, + slen = utf8_strlen(status_message); + + #if HAS_POWER_MONITOR + if (power_monitor.display_enabled()) { + // make room at the end of the status line for the power monitor reading + lcd_width -= 6; + pixel_width -= (MENU_FONT_WIDTH) * 6; + } + #endif + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + + static bool last_blink = false; + + if (slen <= lcd_width) { + // The string fits within the line. Print with no scrolling + lcd_put_u8str(status_message); + while (slen < lcd_width) { lcd_put_wchar(' '); ++slen; } + } + else { + // String is longer than the available space + + // Get a pointer to the next valid UTF8 character + // and the string remaining length + uint8_t rlen; + const char *stat = status_and_len(rlen); + lcd_put_u8str_max(stat, pixel_width); + + // If the remaining string doesn't completely fill the screen + if (rlen < lcd_width) { + lcd_put_wchar('.'); // Always at 1+ spaces left, draw a dot + uint8_t chars = lcd_width - rlen; // Amount of space left in characters + if (--chars) { // Draw a second dot if there's space + lcd_put_wchar('.'); + if (--chars) { // Print a second copy of the message + lcd_put_u8str_max(status_message, pixel_width - (rlen + 2) * (MENU_FONT_WIDTH)); + lcd_put_wchar(' '); + } + } + } + + if (last_blink != blink) { + last_blink = blink; + advance_status_scroll(); + } + } + + #else // !STATUS_MESSAGE_SCROLLING + + UNUSED(blink); + + // Just print the string to the LCD + lcd_put_u8str_max(status_message, pixel_width); + + // Fill the rest with spaces + for (; slen < lcd_width; ++slen) lcd_put_wchar(' '); + + #endif // !STATUS_MESSAGE_SCROLLING + + #if HAS_POWER_MONITOR + display_power_monitor(pixel_width + MENU_FONT_WIDTH, STATUS_BASELINE); + #endif +} + +#endif // HAS_MARLINUI_U8GLIB && !LIGHTWEIGHT_UI diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp new file mode 100644 index 00000000..806f370d --- /dev/null +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -0,0 +1,918 @@ +/** + * Lightweight Status Screen for the RepRapDiscount Full + * Graphics Smart Controller (ST7920-based 128x64 LCD) + * + * (c) 2017 Aleph Objects, Inc. + * + * The code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + */ + +/** + * Implementation of a Status Screen for the RepRapDiscount + * Full Graphics Smart Controller using native ST7920 commands + * instead of U8Glib. + * + * This alternative Status Screen makes use of the built-in character + * generation capabilities of the ST7920 to update the Status Screen + * with less SPI traffic and CPU use. In particular: + * + * - The fan and bed animations are handled using custom characters + * that are stored in CGRAM. This allows for the animation to be + * updated by writing a single character to the text-buffer (DDRAM). + * + * - All the information in the Status Screen is text that is written + * to DDRAM, so the work of generating the bitmaps is offloaded to + * the ST7920 rather than being render by U8Glib on the MCU. + * + * - The graphics buffer (GDRAM) is only used for static graphics + * elements (nozzle and feedrate bitmaps) and for the progress + * bar, so updates are sporadic. + */ + +// +// status_screen_lite_ST7920.cpp +// Lightweight Status Screen for Graphical Display +// + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(LIGHTWEIGHT_UI) + +#include "status_screen_lite_ST7920.h" + +#include "../ultralcd.h" +#include "../fontutils.h" +#include "../lcdprint.h" +#include "../../libs/duration_t.h" +#include "../../module/motion.h" +#include "../../module/printcounter.h" +#include "../../module/temperature.h" + +#if ENABLED(SDSUPPORT) + #include "../../sd/cardreader.h" +#endif + +#if ENABLED(LCD_SHOW_E_TOTAL) + #include "../../MarlinCore.h" // for printingIsActive +#endif + +#define TEXT_MODE_LCD_WIDTH 16 + +#define BUFFER_WIDTH 256 +#define BUFFER_HEIGHT 32 + +#define DDRAM_LINE_1 0x00 +#define DDRAM_LINE_2 0x10 +#define DDRAM_LINE_3 0x08 +#define DDRAM_LINE_4 0x18 + +ST7920_Lite_Status_Screen::st7920_state_t ST7920_Lite_Status_Screen::current_bits; + +void ST7920_Lite_Status_Screen::cmd(const uint8_t cmd) { + if (!current_bits.synced || !current_bits.cmd) { + current_bits.synced = true; + current_bits.cmd = true; + sync_cmd(); + } + write_byte(cmd); +} + +void ST7920_Lite_Status_Screen::begin_data() { + if (!current_bits.synced || current_bits.cmd) { + current_bits.synced = true; + current_bits.cmd = false; + sync_dat(); + } +} + +void ST7920_Lite_Status_Screen::write_str(const char *str) { + while (*str) write_byte(*str++); +} + +void ST7920_Lite_Status_Screen::write_str(const char *str, uint8_t len) { + while (*str && len--) write_byte(*str++); +} + +void ST7920_Lite_Status_Screen::write_str_P(PGM_P const str) { + PGM_P p_str = (PGM_P)str; + while (char c = pgm_read_byte(p_str++)) write_byte(c); +} + +void ST7920_Lite_Status_Screen::write_number(const int16_t value, const uint8_t digits/*=3*/) { + char str[7]; + PGM_P fmt; + switch (digits) { + case 6: fmt = PSTR("%6d"); break; + case 5: fmt = PSTR("%5d"); break; + case 4: fmt = PSTR("%4d"); break; + case 3: fmt = PSTR("%3d"); break; + case 2: fmt = PSTR("%2d"); break; + case 1: fmt = PSTR("%1d"); break; + default: return; + } + sprintf_P(str, fmt, value); + write_str(str); +} + +void ST7920_Lite_Status_Screen::display_status(const bool display_on, const bool cursor_on, const bool blink_on) { + extended_function_set(false); + cmd(0b00001000 | + (display_on ? 0b0100 : 0) | + (cursor_on ? 0b0010 : 0) | + (blink_on ? 0b0001 : 0) + ); +} + +// Sets the extended and graphics bits simultaneously, regardless of +// the current state. This is a helper function for extended_function_set() +// and graphics() +void ST7920_Lite_Status_Screen::_extended_function_set(const bool extended, const bool graphics) { + cmd( 0b00100000 | + (extended ? 0b00000100 : 0) | + (graphics ? 0b00000010 : 0) + ); + current_bits.extended = extended; + current_bits.graphics = graphics; +} + +void ST7920_Lite_Status_Screen::extended_function_set(const bool extended) { + if (extended != current_bits.extended) + _extended_function_set(extended, current_bits.graphics); +} + +void ST7920_Lite_Status_Screen::graphics(const bool graphics) { + if (graphics != current_bits.graphics) + _extended_function_set(current_bits.extended, graphics); +} + +void ST7920_Lite_Status_Screen::entry_mode_select(const bool ac_increase, const bool shift) { + extended_function_set(false); + cmd(0b00000100 | + (ac_increase ? 0b00000010 : 0) | + (shift ? 0b00000001 : 0) + ); +} + +// Sets the sa bit regardless of the current state. This is a helper +// function for scroll_or_addr_select() +void ST7920_Lite_Status_Screen::_scroll_or_addr_select(const bool sa) { + extended_function_set(true); + cmd(0b00000010 | (sa ? 0b00000001 : 0)); + current_bits.sa = sa; +} + +void ST7920_Lite_Status_Screen::scroll_or_addr_select(const bool sa) { + if (sa != current_bits.sa) + _scroll_or_addr_select(sa); +} + +void ST7920_Lite_Status_Screen::set_ddram_address(const uint8_t addr) { + extended_function_set(false); + cmd(0b10000000 | (addr & 0b00111111)); +} + +void ST7920_Lite_Status_Screen::set_cgram_address(const uint8_t addr) { + extended_function_set(false); + cmd(0b01000000 | (addr & 0b00111111)); +} + +void ST7920_Lite_Status_Screen::set_gdram_address(const uint8_t x, const uint8_t y) { + extended_function_set(true); + cmd(0b10000000 | (y & 0b01111111)); + cmd(0b10000000 | (x & 0b00001111)); +} + +void ST7920_Lite_Status_Screen::clear() { + extended_function_set(false); + cmd(0x00000001); + delay(15); //delay for CGRAM clear +} + +void ST7920_Lite_Status_Screen::home() { + extended_function_set(false); + cmd(0x00000010); +} + +/* This fills the entire text buffer with spaces */ +void ST7920_Lite_Status_Screen::clear_ddram() { + set_ddram_address(DDRAM_LINE_1); + begin_data(); + for (uint8_t i = 64; i--;) write_byte(' '); +} + +/* This fills the entire graphics buffer with zeros */ +void ST7920_Lite_Status_Screen::clear_gdram() { + LOOP_L_N(y, BUFFER_HEIGHT) { + set_gdram_address(0, y); + begin_data(); + for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0); + } +} + +void ST7920_Lite_Status_Screen::load_cgram_icon(const uint16_t addr, const void *data) { + const uint16_t *p_word = (const uint16_t *)data; + set_cgram_address(addr); + begin_data(); + for (uint8_t i = 16; i--;) + write_word(pgm_read_word(p_word++)); +} + +/** + * Draw an icon in GDRAM. Position specified in DDRAM + * coordinates. i.e., X from 1 to 8, Y from 1 to 4. + */ +void ST7920_Lite_Status_Screen::draw_gdram_icon(uint8_t x, uint8_t y, const void *data) { + const uint16_t *p_word = (const uint16_t *)data; + // Handle display folding + if (y > 1) y -= 2, x += 8; + for (int i = 0; i < 16; i++) { + set_gdram_address(x, i + y * 16); + begin_data(); + write_word(pgm_read_word(p_word++)); + } +} + +/************************** ICON DEFINITIONS *************************************/ + +#define CGRAM_ICON_1_ADDR 0x00 +#define CGRAM_ICON_2_ADDR 0x10 +#define CGRAM_ICON_3_ADDR 0x20 +#define CGRAM_ICON_4_ADDR 0x30 + +#define CGRAM_ICON_1_WORD 0x00 +#define CGRAM_ICON_2_WORD 0x02 +#define CGRAM_ICON_3_WORD 0x04 +#define CGRAM_ICON_4_WORD 0x06 + +const uint8_t degree_symbol_y_top = 1; +PROGMEM const uint8_t degree_symbol[] = { + 0b00110000, + 0b01001000, + 0b01001000, + 0b00110000, +}; + +const uint16_t nozzle_icon[] PROGMEM = { + 0b0000000000000000, + 0b0000000000000000, + 0b0000111111110000, + 0b0001111111111000, + 0b0001111111111000, + 0b0001111111111000, + 0b0000111111110000, + 0b0000111111110000, + 0b0001111111111000, + 0b0001111111111000, + 0b0001111111111000, + 0b0000011111100000, + 0b0000001111000000, + 0b0000000110000000, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t bed_icon[] PROGMEM = { + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0111111111111110, + 0b0111111111111110, + 0b0110000000000110, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t heat1_icon[] PROGMEM = { + 0b0000000000000000, + 0b0010001000100000, + 0b0001000100010000, + 0b0000100010001000, + 0b0000100010001000, + 0b0001000100010000, + 0b0010001000100000, + 0b0010001000100000, + 0b0001000100010000, + 0b0000100010001000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t heat2_icon[] PROGMEM = { + 0b0000000000000000, + 0b0000100010001000, + 0b0000100010001000, + 0b0001000100010000, + 0b0010001000100000, + 0b0010001000100000, + 0b0001000100010000, + 0b0000100010001000, + 0b0000100010001000, + 0b0001000100010000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t fan1_icon[] PROGMEM = { + 0b0000000000000000, + 0b0111111111111110, + 0b0111000000001110, + 0b0110001111000110, + 0b0100001111000010, + 0b0100000110000010, + 0b0101100000011010, + 0b0101110110111010, + 0b0101100000011010, + 0b0100000110000010, + 0b0100001111000010, + 0b0110001111000110, + 0b0111000000001110, + 0b0111111111111110, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t fan2_icon[] PROGMEM = { + 0b0000000000000000, + 0b0111111111111110, + 0b0111000000001110, + 0b0110010000100110, + 0b0100111001110010, + 0b0101111001111010, + 0b0100110000110010, + 0b0100000110000010, + 0b0100110000110010, + 0b0101111001111010, + 0b0100111001110010, + 0b0110010000100110, + 0b0111000000001110, + 0b0111111111111110, + 0b0000000000000000, + 0b0000000000000000 +}; + +const uint16_t feedrate_icon[] PROGMEM = { + 0b0000000000000000, + 0b0111111000000000, + 0b0110000000000000, + 0b0110000000000000, + 0b0110000000000000, + 0b0111111011111000, + 0b0110000011001100, + 0b0110000011001100, + 0b0110000011001100, + 0b0110000011111000, + 0b0000000011001100, + 0b0000000011001100, + 0b0000000011001100, + 0b0000000011001100, + 0b0000000000000000, + 0b0000000000000000 +}; + +/************************** MAIN SCREEN *************************************/ + +/** + * The ST7920 has no degree character, so draw it to GDRAM. + * This function takes character position xy + * i.e., x is [0-15], while the y position is [0-3] + */ +void ST7920_Lite_Status_Screen::draw_degree_symbol(uint8_t x, uint8_t y, const bool draw) { + const uint8_t *p_bytes = degree_symbol; + // Handle display folding + if (y > 1) y -= 2, x += 16; + const bool oddChar = x & 1; + const uint8_t x_word = x >> 1, + y_top = degree_symbol_y_top, + y_bot = y_top + COUNT(degree_symbol); + LOOP_S_L_N(i, y_top, y_bot) { + uint8_t byte = pgm_read_byte(p_bytes++); + set_gdram_address(x_word, i + y * 16); + begin_data(); + if (draw) { + write_byte(oddChar ? 0x00 : byte); + write_byte(oddChar ? byte : 0x00); + } + else + write_word(0x0000); + } +} + +void ST7920_Lite_Status_Screen::draw_static_elements() { + scroll_or_addr_select(0); + + // Load the animated bed and fan icons + load_cgram_icon(CGRAM_ICON_1_ADDR, heat1_icon); + load_cgram_icon(CGRAM_ICON_2_ADDR, heat2_icon); + load_cgram_icon(CGRAM_ICON_3_ADDR, fan1_icon); + load_cgram_icon(CGRAM_ICON_4_ADDR, fan2_icon); + + // Draw the static icons in GDRAM + draw_gdram_icon(0, 0, nozzle_icon); + #if HAS_MULTI_HOTEND + draw_gdram_icon(0, 1, nozzle_icon); + draw_gdram_icon(0, 2, bed_icon); + #else + draw_gdram_icon(0, 1, bed_icon); + #endif + draw_gdram_icon(5, 1, feedrate_icon); + + // Draw the initial fan icon + draw_fan_icon(false); +} + +/** + * Although this is undocumented, the ST7920 allows the character + * data buffer (DDRAM) to be used in conjunction with the graphics + * bitmap buffer (CGRAM). The contents of the graphics buffer is + * XORed with the data from the character generator. This allows + * us to make the progess bar out of graphical data (the bar) and + * text data (the percentage). + */ +void ST7920_Lite_Status_Screen::draw_progress_bar(const uint8_t value) { + #if HOTENDS == 1 + // If we have only one extruder, draw a long progress bar on the third line + constexpr uint8_t top = 1, // Top in pixels + bottom = 13, // Bottom in pixels + left = 12, // Left edge, in 16-bit words + width = 4; // Width of progress bar, in 16-bit words + #else + constexpr uint8_t top = 16 + 1, + bottom = 16 + 13, + left = 5, + width = 3; + #endif + const uint8_t char_pcnt = 100 / width; // How many percent does each 16-bit word represent? + + // Draw the progress bar as a bitmap in CGRAM + LOOP_S_LE_N(y, top, bottom) { + set_gdram_address(left, y); + begin_data(); + LOOP_L_N(x, width) { + uint16_t gfx_word = 0x0000; + if ((x + 1) * char_pcnt <= value) + gfx_word = 0xFFFF; // Draw completely filled bytes + else if ((x * char_pcnt) < value) + gfx_word = int(0x8000) >> (value % char_pcnt) * 16 / char_pcnt; // Draw partially filled bytes + + // Draw the frame around the progress bar + if (y == top || y == bottom) + gfx_word = 0xFFFF; // Draw top/bottom border + else if (x == width - 1) + gfx_word |= 0x0001; // Draw right border + else if (x == 0) + gfx_word |= 0x8000; // Draw left border + write_word(gfx_word); + } + } + + // Draw the percentage as text in DDRAM + #if HOTENDS == 1 + set_ddram_address(DDRAM_LINE_3 + 4); + begin_data(); + write_byte(' '); + #else + set_ddram_address(DDRAM_LINE_2 + left); + begin_data(); + #endif + + // Draw centered + if (value > 9) { + write_number(value, 4); + write_str_P(PSTR("% ")); + } + else { + write_number(value, 3); + write_str_P(PSTR("% ")); + } +} + +void ST7920_Lite_Status_Screen::draw_fan_icon(const bool whichIcon) { + set_ddram_address(DDRAM_LINE_1 + 5); + begin_data(); + write_word(whichIcon ? CGRAM_ICON_3_WORD : CGRAM_ICON_4_WORD); +} + +void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool heating) { + set_ddram_address( + #if HOTENDS == 1 + DDRAM_LINE_2 + #else + DDRAM_LINE_3 + #endif + ); + begin_data(); + if (heating) + write_word(whichIcon ? CGRAM_ICON_1_WORD : CGRAM_ICON_2_WORD); + else { + write_byte(' '); + write_byte(' '); + } +} + +#define FAR(a,b) (((a > b) ? (a-b) : (b-a)) > 2) + +static struct { + bool E1_show_target : 1; + bool E2_show_target : 1; + TERN_(HAS_HEATED_BED, bool bed_show_target : 1); +} display_state = { + true, true, TERN_(HAS_HEATED_BED, true) +}; + +void ST7920_Lite_Status_Screen::draw_temps(uint8_t line, const int16_t temp, const int16_t target, bool showTarget, bool targetStateChange) { + switch (line) { + case 0: set_ddram_address(DDRAM_LINE_1 + 1); break; + case 1: set_ddram_address(DDRAM_LINE_2 + 1); break; + case 2: set_ddram_address(DDRAM_LINE_3 + 1); break; + case 3: set_ddram_address(DDRAM_LINE_3 + 1); break; + } + begin_data(); + write_number(temp); + + if (showTarget) { + write_byte('\x1A'); + write_number(target); + }; + + if (targetStateChange) { + if (!showTarget) write_str_P(PSTR(" ")); + draw_degree_symbol(5, line, !showTarget); + draw_degree_symbol(9, line, showTarget); + } +} + +void ST7920_Lite_Status_Screen::draw_extruder_1_temp(const int16_t temp, const int16_t target, bool forceUpdate) { + const bool show_target = target && FAR(temp, target); + draw_temps(0, temp, target, show_target, display_state.E1_show_target != show_target || forceUpdate); + display_state.E1_show_target = show_target; +} + +void ST7920_Lite_Status_Screen::draw_extruder_2_temp(const int16_t temp, const int16_t target, bool forceUpdate) { + const bool show_target = target && FAR(temp, target); + draw_temps(1, temp, target, show_target, display_state.E2_show_target != show_target || forceUpdate); + display_state.E2_show_target = show_target; +} + +#if HAS_HEATED_BED + void ST7920_Lite_Status_Screen::draw_bed_temp(const int16_t temp, const int16_t target, bool forceUpdate) { + const bool show_target = target && FAR(temp, target); + draw_temps(TERN(HAS_MULTI_HOTEND, 2, 1), temp, target, show_target, display_state.bed_show_target != show_target || forceUpdate); + display_state.bed_show_target = show_target; + } +#endif + +void ST7920_Lite_Status_Screen::draw_fan_speed(const uint8_t value) { + set_ddram_address(DDRAM_LINE_1 + 6); + begin_data(); + write_number(value, 3); + write_byte('%'); +} + +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]; + int str_length = elapsed.toDigital(str); + str[str_length++] = suffix; + begin_data(); + write_str(str, str_length); +} + +void ST7920_Lite_Status_Screen::draw_feedrate_percentage(const uint16_t percentage) { + // We only have enough room for the feedrate when + // we have one extruder + #if HOTENDS == 1 + set_ddram_address(DDRAM_LINE_2 + 6); + begin_data(); + write_number(percentage, 3); + write_byte('%'); + #else + UNUSED(percentage); + #endif +} + +void ST7920_Lite_Status_Screen::draw_status_message() { + const char *str = ui.status_message; + + set_ddram_address(DDRAM_LINE_4); + begin_data(); + #if ENABLED(STATUS_MESSAGE_SCROLLING) + uint8_t slen = utf8_strlen(str); + + if (slen <= TEXT_MODE_LCD_WIDTH) { + // String fits the LCD, so just print it + write_str(str); + while (slen < TEXT_MODE_LCD_WIDTH) { write_byte(' '); ++slen; } + } + else { + // String is larger than the available space in screen. + + // Get a pointer to the next valid UTF8 character + // and the string remaining length + uint8_t rlen; + const char *stat = ui.status_and_len(rlen); + write_str(stat, TEXT_MODE_LCD_WIDTH); + + // If the remaining string doesn't completely fill the screen + if (rlen < TEXT_MODE_LCD_WIDTH) { + write_byte('.'); // Always at 1+ spaces left, draw a dot + uint8_t chars = TEXT_MODE_LCD_WIDTH - rlen; // Amount of space left in characters + if (--chars) { // Draw a second dot if there's space + write_byte('.'); + if (--chars) write_str(str, chars); // Print a second copy of the message + } + } + ui.advance_status_scroll(); + } + + #else + + uint8_t slen = utf8_strlen(str); + write_str(str, TEXT_MODE_LCD_WIDTH); + for (; slen < TEXT_MODE_LCD_WIDTH; ++slen) write_byte(' '); + + #endif +} + +void ST7920_Lite_Status_Screen::draw_position(const xyze_pos_t &pos, const bool position_known) { + char str[7]; + set_ddram_address(DDRAM_LINE_4); + begin_data(); + + // If position is unknown, flash the labels. + const unsigned char alt_label = position_known ? 0 : (ui.get_blink() ? ' ' : 0); + + if (TERN1(LCD_SHOW_E_TOTAL, !printingIsActive())) { + write_byte(alt_label ? alt_label : 'X'); + write_str(dtostrf(pos.x, -4, 0, str), 4); + + write_byte(alt_label ? alt_label : 'Y'); + write_str(dtostrf(pos.y, -4, 0, str), 4); + } + else { + #if ENABLED(LCD_SHOW_E_TOTAL) + char tmp[15]; + const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm + sprintf_P(tmp, PSTR("E%-7ld%cm "), uint32_t(_MAX(e_move_accumulator, 0.0f)) / escale, escale == 10 ? 'c' : 'm'); // 1234567mm + write_str(tmp); + #endif + } + + write_byte(alt_label ? alt_label : 'Z'); + write_str(dtostrf(pos.z, -5, 1, str), 5); +} + +bool ST7920_Lite_Status_Screen::indicators_changed() { + // We only add the target temperatures to the checksum + // because the actual temps fluctuate so by updating + // them only during blinks we gain a bit of stability. + const bool blink = ui.get_blink(); + const uint16_t feedrate_perc = feedrate_percentage; + const uint16_t fs = thermalManager.scaledFanSpeed(0); + const int16_t extruder_1_target = thermalManager.degTargetHotend(0); + #if HAS_MULTI_HOTEND + const int16_t extruder_2_target = thermalManager.degTargetHotend(1); + #endif + #if HAS_HEATED_BED + const int16_t bed_target = thermalManager.degTargetBed(); + #endif + static uint16_t last_checksum = 0; + const uint16_t checksum = blink ^ feedrate_perc ^ fs ^ extruder_1_target + ^ TERN0(HAS_MULTI_HOTEND, extruder_2_target) + ^ TERN0(HAS_HEATED_BED, bed_target); + if (last_checksum == checksum) return false; + last_checksum = checksum; + return true; +} + +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); + #if HAS_MULTI_HOTEND + const int16_t extruder_2_temp = thermalManager.degHotend(1), + extruder_2_target = thermalManager.degTargetHotend(1); + #endif + #if HAS_HEATED_BED + const int16_t bed_temp = thermalManager.degBed(), + bed_target = thermalManager.degTargetBed(); + #endif + + draw_extruder_1_temp(extruder_1_temp, extruder_1_target, forceUpdate); + TERN_(HAS_MULTI_HOTEND, draw_extruder_2_temp(extruder_2_temp, extruder_2_target, forceUpdate)); + TERN_(HAS_HEATED_BED, draw_bed_temp(bed_temp, bed_target, forceUpdate)); + + uint16_t spd = thermalManager.fan_speed[0]; + + #if ENABLED(ADAPTIVE_FAN_SLOWING) + if (!blink && thermalManager.fan_speed_scaler[0] < 128) + spd = thermalManager.scaledFanSpeed(0, spd); + #endif + + draw_fan_speed(thermalManager.fanPercent(spd)); + + // 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 + if (spd) draw_fan_icon(blink); + TERN_(HAS_HEATED_BED, draw_heat_icon(bed_target > 0 && blink, bed_target > 0)); + } +} + +bool ST7920_Lite_Status_Screen::position_changed() { + const xyz_pos_t pos = current_position; + const uint8_t checksum = uint8_t(pos.x) ^ uint8_t(pos.y) ^ uint8_t(pos.z); + static uint8_t last_checksum = 0, changed = last_checksum != checksum; + if (changed) last_checksum = checksum; + return changed; +} + +bool ST7920_Lite_Status_Screen::status_changed() { + uint8_t checksum = 0; + for (const char *p = ui.status_message; *p; p++) checksum ^= *p; + static uint8_t last_checksum = 0; + bool changed = last_checksum != checksum; + if (changed) last_checksum = checksum; + return changed; +} + +bool ST7920_Lite_Status_Screen::blink_changed() { + static uint8_t last_blink = 0; + const bool blink = ui.get_blink(), changed = last_blink != blink; + if (changed) last_blink = blink; + return changed; +} + +#ifndef STATUS_EXPIRE_SECONDS + #define STATUS_EXPIRE_SECONDS 20 +#endif + +void ST7920_Lite_Status_Screen::update_status_or_position(bool forceUpdate) { + + #if STATUS_EXPIRE_SECONDS + static uint8_t countdown = 0; + #endif + + /** + * There's only enough room for either the status message or the position, + * so draw one or the other. When the status message changes, show it for + * a few seconds, then return to the position display once the head moves. + * + * countdown > 1 -- Show status + * countdown = 1 -- Show status, until movement + * countdown = 0 -- Show position + * + * If STATUS_EXPIRE_SECONDS is zero, only the status is shown. + */ + if (forceUpdate || status_changed()) { + TERN_(STATUS_MESSAGE_SCROLLING, ui.status_scroll_offset = 0); + #if STATUS_EXPIRE_SECONDS + countdown = ui.status_message[0] ? STATUS_EXPIRE_SECONDS : 0; + #endif + draw_status_message(); + blink_changed(); // Clear changed flag + } + #if !STATUS_EXPIRE_SECONDS + else if (TERN0(STATUS_MESSAGE_SCROLLING, blink_changed())) + draw_status_message(); + #else + else if (blink_changed()) { + if (countdown > 1) { + countdown--; + TERN_(STATUS_MESSAGE_SCROLLING, draw_status_message()); + } + else if (countdown > 0) { + if (position_changed()) { + countdown--; + forceUpdate = true; + } + TERN_(STATUS_MESSAGE_SCROLLING, draw_status_message()); + } + } + + if (countdown == 0 && (forceUpdate || position_changed() + || TERN(DISABLE_REDUCED_ACCURACY_WARNING, 0, blink_changed()) + )) draw_position(current_position, TERN(DISABLE_REDUCED_ACCURACY_WARNING, 1, all_axes_known())); + #endif +} + +void ST7920_Lite_Status_Screen::update_progress(const bool forceUpdate) { + #if EITHER(LCD_SET_PROGRESS_MANUALLY, SDSUPPORT) + + // Since the progress bar involves writing + // quite a few bytes to GDRAM, only do this + // when an update is actually necessary. + + static uint8_t last_progress = 0; + const uint8_t progress = ui.get_progress_percent(); + if (forceUpdate || last_progress != progress) { + last_progress = progress; + draw_progress_bar(progress); + } + + #else + + UNUSED(forceUpdate); + + #endif // LCD_SET_PROGRESS_MANUALLY || SDSUPPORT +} + +void ST7920_Lite_Status_Screen::update(const bool forceUpdate) { + cs(); + update_indicators(forceUpdate); + update_status_or_position(forceUpdate); + update_progress(forceUpdate); + ncs(); +} + +void ST7920_Lite_Status_Screen::reset_state_from_unknown() { + _extended_function_set(true, true); // Do it twice as only one bit + _extended_function_set(true, true); // get set at a time. + _scroll_or_addr_select(false); +} + +void ST7920_Lite_Status_Screen::on_entry() { + cs(); + reset_state_from_unknown(); + clear(); + clear_gdram(); + draw_static_elements(); + update(true); + ncs(); +} + +void ST7920_Lite_Status_Screen::on_exit() { + cs(); + clear(); + _extended_function_set(true, true); // Restore state to what u8g expects. + ncs(); +} + +// Called prior to the KILL screen to +// clear the screen, preventing a garbled display. +void ST7920_Lite_Status_Screen::clear_text_buffer() { + cs(); + reset_state_from_unknown(); + clear(); + _extended_function_set(true, true); // Restore state to what u8g expects. + ncs(); +} + +void MarlinUI::draw_status_screen() { + ST7920_Lite_Status_Screen::update(false); +} + +// This method is called before each screen update and +// fires on_entry() and on_exit() events upon entering +// or exiting the Status Screen. +void MarlinUI::lcd_in_status(const bool inStatus) { + static bool lastInStatus = false; + if (lastInStatus == inStatus) return; + if ((lastInStatus = inStatus)) + ST7920_Lite_Status_Screen::on_entry(); + else + ST7920_Lite_Status_Screen::on_exit(); +} + +#endif // LIGHTWEIGHT_UI diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h new file mode 100644 index 00000000..b2172464 --- /dev/null +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h @@ -0,0 +1,106 @@ +/** + * Lightweight Status Screen for the RepRapDiscount Full + * Graphics Smart Controller (ST7920-based 128x64 LCD) + * + * (c) 2017 Aleph Objects, Inc. + * + * The code in this page is free software: you can + * redistribute it and/or modify it under the terms of the GNU + * General Public License (GNU GPL) as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) + * any later version. The code is distributed WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. + */ +#pragma once + +#include "../../HAL/shared/HAL_ST7920.h" + +#include "../../core/types.h" +#include "../../core/macros.h" +#include "../../libs/duration_t.h" + +class ST7920_Lite_Status_Screen { + private: + static struct st7920_state_t { + uint8_t synced : 1; // Whether a sync has been sent + uint8_t cmd : 1; // Whether the sync was cmd or data + uint8_t extended : 1; + uint8_t graphics : 1; + uint8_t sa : 1; + } current_bits; + + static void cs() { ST7920_cs(); current_bits.synced = false; } + static void ncs() { ST7920_cs(); current_bits.synced = false; } + static void sync_cmd() { ST7920_set_cmd(); } + static void sync_dat() { ST7920_set_dat(); } + static void write_byte(const uint8_t w) { ST7920_write_byte(w); } + + FORCE_INLINE static void write_word(const uint16_t w) { + write_byte((w >> 8) & 0xFF); + write_byte((w >> 0) & 0xFF); + } + + static void cmd(const uint8_t cmd); + static void begin_data(); + + static void write_str(const char *str); + static void write_str(const char *str, const uint8_t len); + static void write_str_P(PGM_P const str); + static void write_number(const int16_t value, const uint8_t digits=3); + + static void _extended_function_set(const bool extended, const bool graphics); + static void _scroll_or_addr_select(const bool sa); + static void reset_state_from_unknown(); + + static void home(); + static void display_status(const bool display_on, const bool cursor_on, const bool blink_on); + static void extended_function_set(const bool extended); + static void graphics(const bool graphics); + static void entry_mode_select(const bool ac_increase, const bool shift); + static void scroll_or_addr_select(const bool sa); + static void set_ddram_address(const uint8_t addr); + static void set_cgram_address(const uint8_t addr); + static void set_gdram_address(const uint8_t x, const uint8_t y); + + static void clear(); + static void clear_ddram(); + static void clear_gdram(); + + static void load_cgram_icon(const uint16_t addr, const void *data); + static void draw_gdram_icon(uint8_t x, uint8_t y, const void *data); + + static uint8_t string_checksum(const char *str); + + protected: + static void draw_degree_symbol(uint8_t x, uint8_t y, const bool draw); + static void draw_static_elements(); + static void draw_progress_bar(const uint8_t value); + 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_fan_speed(const uint8_t value); + 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 bool indicators_changed(); + static bool position_changed(); + static bool blink_changed(); + static bool status_changed(); + + static void update_indicators(const bool forceUpdate); + static void update_position(const bool forceUpdate, bool resetChecksum); + static void update_status_or_position(bool forceUpdate); + static void update_progress(const bool forceUpdate); + + public: + static void update(const bool forceUpdate); + static void on_entry(); + static void on_exit(); + static void clear_text_buffer(); +}; 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 new file mode 100644 index 00000000..f97a3233 --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -0,0 +1,303 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_dev_ssd1306_128x64.c + * + * Universal 8bit Graphics Library + * + * Copyright (c) 2015, 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. + */ + +/** + * These routines are meant for two wire I2C interfaces. + * + * Three and four wire I2C interfaces have an A0 line. That line is + * used to switch between command and data modes. + * + * The two wire LCDs use an instruction byte to signal if data or + * command info is to follow. The command stream needs the instruction + * byte between eack command byte. The data stream needs one at the + * beginning. + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq); + +// The sh1106 is compatible to the ssd1306, but is 132x64. 128x64 display area is centered within +// the 132x64. + +static const uint8_t u8g_dev_sh1106_128x64_data_start_2_wire[] PROGMEM = { + 0x010, // set upper 4 bit of the col adr to 0 + 0x002, // set lower 4 bit of the col adr to 2 (centered display with ssd1306) + U8G_ESC_END // end of sequence +}; + +#define SH1106_PAGE_ADR(N) (0x20), (N) +#define SH1106_COLUMN_RANGE(N) (0x21), (((N) >> 8) & 0xFF), ((N) & 0xFF) +#define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) +#define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) +#define SH1106_START_LINE(N) (0x40 | (N)) +#define SH1106_CONTRAST(N) (0x81), (N) +#define SH1106_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) +#define SH1106_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) +#define SH1106_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) +#define SH1106_INVERTED(N) ((N) ? 0xA7 : 0xA6) +#define SH1106_MUX_RATIO(N) (0xA8), (N) +#define SH1106_ON(N) ((N) ? 0xAF : 0xAE) +#define SH1106_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define SH1106_DISP_OFFS(N) (0xD3), (N) +#define SH1106_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) +#define SH1106_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) +#define SH1106_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) +#define SH1106_VCOM_DESEL(N) (0xDB), (N) +#define SH1106_NOOP() (0xE3) + +static const uint8_t u8g_dev_sh1106_128x64_init_seq_2_wire[] PROGMEM = { + U8G_ESC_ADR(0), // Initiate command mode + SH1106_ON(0), // Display off, sleep mode + SH1106_MUX_RATIO(0x3F), // Mux ratio + SH1106_DISP_OFFS(0), // Display offset + SH1106_START_LINE(0), // Start line + SH1106_ADC_REVERSE(1), // Segment remap A0/A1 + SH1106_OUT_MODE(1), // C0: scan dir normal, C8: reverse + SH1106_COM_CONFIG(1), // Com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + SH1106_CONTRAST(0xCF), // [2] set contrast control + SH1106_PAGE_ADR(0x02), // 2012-05-27: page addressing mode + SH1106_COLUMN_RANGE(0x281), // Set column range from 0 through 131 + SH1106_PAGE_RANGE(0, 7), // Set page range from 0 through 7 + SH1106_CHARGE_PER(0x1, 0xF), // [2] pre-charge period 0x22/F1 + SH1106_VCOM_DESEL(0x40), // Vcomh deselect level + SH1106_ALL_PIX(0), // Output ram to display + SH1106_INVERTED(0), // Normal display mode + SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + SH1106_CHARGE_PUMP(1), // [2] charge pump setting (P62): 0x14 enable, 0x10 disable + SH1106_SCROLL(0), // 2012-05-27: Deactivate scroll + SH1106_ON(1), // Display on + U8G_ESC_END // End of sequence +}; + +uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_init_seq_2_wire); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2+1)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_SLEEP_ON: + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf}; +u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire = { u8g_dev_sh1106_128x64_2x_2_wire_fn, &u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; + +///////////////////////////////////////////////////////////////////////////////////////////// + +static const uint8_t u8g_dev_ssd1306_128x64_data_start_2_wire[] PROGMEM = { + 0x010, // set upper 4 bit of the col adr to 0 + 0x000, // set lower 4 bit of the col adr to 0 + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_ssd1306_128x64_init_seq_2_wire[] PROGMEM = { + U8G_ESC_ADR(0), // initiate command mode + 0x0AE, // display off, sleep mode + 0x0A8, 0x03F, // mux ratio + 0x0D3, 0x00, // display offset + 0x040, // start line + 0x0A1, // segment remap a0/a1 + 0x0C8, // c0: scan dir normal, c8: reverse + 0x0DA, 0x012, // com pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + 0x081, 0x0CF, // [2] set contrast control + 0x020, 0x002, // 2012-05-27: page addressing mode + 0x21, 0, 0x7F, // set column range from 0 through 127 + 0x22, 0, 7, // set page range from 0 through 7 + 0x0D9, 0x0F1, // [2] pre-charge period 0x022/f1 + 0x0DB, 0x040, // vcomh deselect level + 0x0A4, // output ram to display + 0x0A6, // none inverted normal display mode + 0x0D5, 0x080, // clock divide ratio (0x00=1) and oscillator frequency (0x8) + 0x08D, 0x014, // [2] charge pump setting (p62): 0x014 enable, 0x010 disable + 0x02E, // 2012-05-27: Deactivate scroll + 0x0AF, // display on + U8G_ESC_END // end of sequence +}; + +uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_init_seq_2_wire); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + u8g_SetAddress(u8g, dev, 0); // instruction mode + u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); + u8g_WriteByte(u8g, dev, 0x0B0 | (pb->p.page*2+1)); // select current page + u8g_SetAddress(u8g, dev, 1); // data mode + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_SLEEP_ON: + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + + +uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf}; +u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_wire_fn, &u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; + + +///////////////////////////////////////////////////////////////////////////////////////////// + +// This routine adds the instruction byte in between the command bytes. This makes the init +// sequences a lot easier to read. + +#define I2C_CMD_MODE 0x080 + +uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq) { + uint8_t is_escape = 0; + uint8_t value; + for (;;) { + value = u8g_pgm_read(esc_seq); + if (is_escape == 0) { + if (value != 255) { + if (u8g_WriteByte(u8g, dev, value) == 0 ) + return 0; + if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0 ) + return 0; + } + else { + is_escape = 1; + } + } + else { + if (value == 255) { + if (u8g_WriteByte(u8g, dev, value) == 0 ) + return 0; + if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0 ) + return 0; + } + else if (value == 254) { + break; + } + else if (value >= 0x0F0) { + /* not yet used, do nothing */ + } + else if (value >= 0xE0 ) { + u8g_SetAddress(u8g, dev, value & 0x0F); + } + else if (value >= 0xD0) { + u8g_SetChipSelect(u8g, dev, value & 0x0F); + } + else if (value >= 0xC0) { + u8g_SetResetLow(u8g, dev); + value &= 0x0F; + value <<= 4; + value+=2; + u8g_Delay(value); + u8g_SetResetHigh(u8g, dev); + u8g_Delay(value); + } + else if (value >= 0xBE) { /* not yet implemented */ + /* u8g_SetVCC(u8g, dev, value & 0x01); */ + } + else if (value <= 127) { + u8g_Delay(value); + } + is_escape = 0; + } + esc_seq++; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.cpp new file mode 100644 index 00000000..84c10dbb --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_st7565_64128n_HAL.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 . + * + */ + +/** + * Based on u8g_dev_st7565_64128n_HAL.c (Displaytech) + * + * 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" + +#if HAS_MARLINUI_U8GLIB + +#include +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +#define ST7565_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) +#define ST7565_BIAS_MODE(N) ((N) ? 0xA3 : 0xA2) +#define ST7565_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) +#define ST7565_INVERTED(N) ((N) ? 0xA7 : 0xA6) +#define ST7565_ON(N) ((N) ? 0xAF : 0xAE) +#define ST7565_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define ST7565_POWER_CONTROL(N) (0x28 | (N)) +#define ST7565_V0_RATIO(N) (0x10 | ((N) & 0x7)) +#define ST7565_V5_RATIO(N) (0x20 | ((N) & 0x7)) +#define ST7565_CONTRAST(N) (0x81), (N) + +#define ST7565_COLUMN_ADR(N) (0x10 | (((N) >> 4) & 0xF)), ((N) & 0xF) +#define ST7565_PAGE_ADR(N) (0xB0 | (N)) +#define ST7565_START_LINE(N) (0x40 | (N)) +#define ST7565_SLEEP_MODE() (0xAC) // ,(N) needed? +#define ST7565_NOOP() (0xE3) + +/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ +static const uint8_t u8g_dev_st7565_64128n_HAL_init_seq[] PROGMEM = { + U8G_ESC_CS(0), // disable chip + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ + + ST7565_BIAS_MODE(0), // 0xA2: LCD bias 1/9 (according to Displaytech 64128N datasheet) + ST7565_ADC_REVERSE(0), // Normal ADC Select (according to Displaytech 64128N datasheet) + + ST7565_OUT_MODE(1), // common output mode: set scan direction + ST7565_START_LINE(0), // Display start line for Displaytech 64128N + + ST7565_POWER_CONTROL(0x4), // power control: turn on voltage converter + U8G_ESC_DLY(50), // delay 50 ms + + ST7565_POWER_CONTROL(0x6), // power control: turn on voltage regulator + U8G_ESC_DLY(50), // delay 50 ms + + ST7565_POWER_CONTROL(0x7), // power control: turn on voltage follower + U8G_ESC_DLY(50), // delay 50 ms + + ST7565_V0_RATIO(0), // Set V0 voltage resistor ratio. Setting for controlling brightness of Displaytech 64128N + + ST7565_INVERTED(0), // display normal, bit val 0: LCD pixel off. + + ST7565_CONTRAST(0x1E), // Contrast value. Setting for controlling brightness of Displaytech 64128N + + ST7565_ON(1), // display on + + U8G_ESC_DLY(100), // delay 100 ms + ST7565_ALL_PIX(1), // display all points, ST7565 + U8G_ESC_DLY(100), // delay 100 ms + U8G_ESC_DLY(100), // delay 100 ms + ST7565_ALL_PIX(0), // normal display + U8G_ESC_CS(0), // disable chip + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_st7565_64128n_HAL_data_start[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + ST7565_COLUMN_ADR(0x00), // high 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N + U8G_ESC_END // end of sequence +}; + +static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_on[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + ST7565_SLEEP_MODE(), // static indicator off + //0x00, // indicator register set (not sure if this is required) + ST7565_ON(0), // display off + ST7565_ALL_PIX(1), // all points on + U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 + U8G_ESC_END // end of sequence + }; + +static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_off[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + ST7565_ALL_PIX(0), // all points off + ST7565_ON(1), // display on + U8G_ESC_DLY(50), // delay 50 ms + U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 + U8G_ESC_END // end of sequence +}; + +uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); /* select current page (ST7565R) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_off); + return 1; + } + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_st7565_64128n_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_init_seq); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); /* select current page (ST7565R) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); /* select current page (ST7565R) */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } + break; + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x81); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + case U8G_DEV_MSG_SLEEP_ON: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_on); + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_sleep_off); + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_SW_SPI_FN); + +uint8_t u8g_dev_st7565_64128n_HAL_2x_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_st7565_64128n_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_st7565_64128n_HAL_2x_buf}; +u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_sw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN }; + + +U8G_PB_DEV(u8g_dev_st7565_64128n_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_st7565_64128n_HAL_fn, U8G_COM_HAL_HW_SPI_FN); +u8g_dev_t u8g_dev_st7565_64128n_HAL_2x_hw_spi = { u8g_dev_st7565_64128n_HAL_2x_fn, &u8g_dev_st7565_64128n_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp new file mode 100644 index 00000000..740436d9 --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -0,0 +1,208 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_dev_st7920_128x64.c + * + * 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/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "HAL_LCD_com_defines.h" + +#define PAGE_HEIGHT 8 + +/* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ +static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { + U8G_ESC_CS(0), // disable chip + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay) + U8G_ESC_DLY(100), // 8 Dez 2012: additional delay 100 ms because of reset + U8G_ESC_CS(1), // enable chip + U8G_ESC_DLY(50), // delay 50 ms + + 0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0) + 0x00C, // display on, cursor & blink off; 0x08: all off + 0x006, // Entry mode: Cursor move to right, DDRAM address counter (AC) plus 1, no shift + 0x002, // disable scroll, enable CGRAM adress + 0x001, // clear RAM, needs 1.6 ms + U8G_ESC_DLY(100), // delay 100 ms + + U8G_ESC_CS(0), // disable chip + U8G_ESC_END // end of sequence +}; + +void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { + u8g_SetChipSelect(u8g, dev, 1); + u8g_Delay(1); + u8g_SetAddress(u8g, dev, 0); // cmd mode + u8g_WriteByte(u8g, dev, 0x08); //display off, cursor+blink off + u8g_WriteByte(u8g, dev, 0x3E); //extended mode + GDRAM active + LOOP_L_N(y, (LCD_PIXEL_HEIGHT) / 2) { //clear GDRAM + u8g_WriteByte(u8g, dev, 0x80 | y); //set y + u8g_WriteByte(u8g, dev, 0x80); //set x = 0 + u8g_SetAddress(u8g, dev, 1); /* data mode */ + LOOP_L_N(i, 2 * (LCD_PIXEL_WIDTH) / 8) //2x width clears both segments + u8g_WriteByte(u8g, dev, 0); + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + } + + u8g_WriteByte(u8g, dev, 0x0C); //display on, cursor+blink off + + u8g_SetChipSelect(u8g, dev, 0); +} + +uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq); + clear_graphics_DRAM(u8g, dev); + break; + case U8G_DEV_MSG_STOP: + break; + case U8G_DEV_MSG_PAGE_NEXT: { + uint8_t y, i; + uint8_t *ptr; + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetChipSelect(u8g, dev, 1); + y = pb->p.page_y0; + ptr = (uint8_t *)pb->buf; + for (i = 0; i < 8; i ++) { + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + + if (y < 32) { + u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + } + else { + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + } + + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); + ptr += (LCD_PIXEL_WIDTH) / 8; + y++; + } + u8g_SetChipSelect(u8g, dev, 0); + } + break; + } + return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq); + clear_graphics_DRAM(u8g, dev); + break; + + case U8G_DEV_MSG_STOP: + break; + + case U8G_DEV_MSG_PAGE_NEXT: { + uint8_t y, i; + uint8_t *ptr; + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetChipSelect(u8g, dev, 1); + y = pb->p.page_y0; + ptr = (uint8_t *)pb->buf; + for (i = 0; i < 32; i ++) { + u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + + if (y < 32) { + u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + } + else { + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ + u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + } + + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); + ptr += (LCD_PIXEL_WIDTH) / 8; + y++; + } + u8g_SetChipSelect(u8g, dev, 0); + } + break; + } + return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_sw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_SW_SPI); + +#define QWIDTH ((LCD_PIXEL_WIDTH) * 4) +uint8_t u8g_dev_st7920_128x64_HAL_4x_buf[QWIDTH] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_st7920_128x64_HAL_4x_pb = { { 32, LCD_PIXEL_HEIGHT, 0, 0, 0 }, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_HAL_4x_buf}; +u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; + +U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); +u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; + +#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) + // Also use this device for HAL version of rrd class. This results in the same device being used + // for the ST7920 for HAL systems no matter what is selected in ultralcd_impl_DOGM.h. + u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; +#endif + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp new file mode 100644 index 00000000..d18b6179 --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -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 . + * + */ + +/** + * 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" + +#if HAS_MARLINUI_U8GLIB && (PIN_EXISTS(FSMC_CS) || ENABLED(SPI_GRAPHICAL_TFT)) + +#include "HAL_LCD_com_defines.h" +#include "ultralcd_DOGM.h" + +#include + +#if EITHER(LCD_USE_DMA_FSMC, LCD_USE_DMA_SPI) + #define HAS_LCD_IO 1 +#endif + +#include "../tft_io/tft_io.h" +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) * (GRAPHICAL_TFT_UPSCALE)) +#define UPSCALE(A,M) (UPSCALE0(M) + (A)) +#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 + +#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_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_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 + +#ifndef TFT_MARLINUI_COLOR + #define TFT_MARLINUI_COLOR COLOR_WHITE +#endif +#ifndef TFT_MARLINBG_COLOR + #define TFT_MARLINBG_COLOR COLOR_BLACK +#endif +#ifndef TFT_DISABLED_COLOR + #define TFT_DISABLED_COLOR COLOR_DARK +#endif +#ifndef TFT_BTCANCEL_COLOR + #define TFT_BTCANCEL_COLOR COLOR_RED +#endif +#ifndef TFT_BTARROWS_COLOR + #define TFT_BTARROWS_COLOR COLOR_BLUE +#endif +#ifndef TFT_BTOKMENU_COLOR + #define TFT_BTOKMENU_COLOR COLOR_RED +#endif + +static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { + tftio.set_window(Xmin, Ymin, Xmax, Ymax); +} + +#if HAS_TOUCH_XPT2046 + + static const uint8_t buttonD[] = { + B01111111,B11111111,B11111111,B11111110, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00011000,B00110000,B00000001, + B10000000,B00001100,B01100000,B00000001, + B10000000,B00000110,B11000000,B00000001, + B10000000,B00000011,B10000000,B00000001, + B10000000,B00000011,B10000000,B00000001, + B10000000,B00000110,B11000000,B00000001, + B10000000,B00001100,B01100000,B00000001, + B10000000,B00011000,B00110000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B01111111,B11111111,B11111111,B11111110, + }; + + #if ENABLED(REVERSE_MENU_DIRECTION) + + static const uint8_t buttonA[] = { + B01111111,B11111111,B11111111,B11111110, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00111111,B11100001, + B10000111,B11111100,B00111111,B11100001, + B10000011,B11111000,B00000000,B00000001, + B10000001,B11110000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B01000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B01111111,B11111111,B11111111,B11111110, + }; + static const uint8_t buttonB[] = { + B01111111,B11111111,B11111111,B11111110, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B01100000,B00000010,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00001111,B10000001, + B10000000,B01100000,B00011111,B11000001, + B10000111,B11111110,B00111111,B11100001, + B10000111,B11111110,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B01111111,B11111111,B11111111,B11111110, + }; + + #else + + static const uint8_t buttonA[] = { + B01111111,B11111111,B11111111,B11111110, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B01000000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000001,B11110000,B00000000,B00000001, + B10000011,B11111000,B00000000,B00000001, + B10000111,B11111100,B00111111,B11100001, + B10000000,B11100000,B00111111,B11100001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B11100000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B01111111,B11111111,B11111111,B11111110, + }; + + static const uint8_t buttonB[] = { + B01111111,B11111111,B11111111,B11111110, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000111,B00000001, + B10000111,B11111110,B00000111,B00000001, + B10000111,B11111110,B00111111,B11100001, + B10000000,B01100000,B00011111,B11000001, + B10000000,B01100000,B00001111,B10000001, + B10000000,B01100000,B00000111,B00000001, + B10000000,B01100000,B00000010,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B01111111,B11111111,B11111111,B11111110, + }; + + #endif + + static const uint8_t buttonC[] = { + B01111111,B11111111,B11111111,B11111110, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00011100,B00000001, + B10000000,B00000100,B00011100,B00000001, + B10000000,B00001100,B00011100,B00000001, + B10000000,B00011111,B11111100,B00000001, + B10000000,B00111111,B11111100,B00000001, + B10000000,B00011111,B11111100,B00000001, + B10000000,B00001100,B00000000,B00000001, + B10000000,B00000100,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B10000000,B00000000,B00000000,B00000001, + B01111111,B11111111,B11111111,B11111110, + }; + + #define BUTTON_SIZE_X 32 + #define BUTTON_SIZE_Y 20 + + // 14, 90, 166, 242, 185 are the original values upscaled 2x. + #define BUTTOND_X_LO UPSCALE0(14 / 2) + #define BUTTOND_X_HI (UPSCALE(BUTTOND_X_LO, 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 UPSCALE0(166 / 2) + #define BUTTONB_X_HI (UPSCALE(BUTTONB_X_LO, 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 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(GRAPHICAL_TFT_UPSCALE)]; + + if (length > BUTTON_SIZE_X) return; + + for (uint16_t i = 0; i < height; i++) { + uint16_t k = 0; + for (uint16_t j = 0; j < length; j++) { + uint16_t v = TFT_MARLINBG_COLOR; + if (*(data + (i * (length >> 3) + (j >> 3))) & (0x80 >> (j & 7))) + v = color; + else + v = TFT_MARLINBG_COLOR; + LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = v; + } + #if HAS_LCD_IO + 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]; + + tftio.WriteSequence(buffer, length * sq(GRAPHICAL_TFT_UPSCALE)); + #else + for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) + u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); + #endif + } + } + +#endif // HAS_TOUCH_XPT2046 + +// Used to fill RGB565 (16bits) background +inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { + uint16_t* wptr = (uint16_t*)ptr; + for (size_t i = 0; i < cnt; i += 2) { *wptr = fill; wptr++; } +} + +static bool preinit = true; +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 HAS_LCD_IO + static uint16_t bufferA[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)], bufferB[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; + uint16_t* buffer = &bufferA[0]; + #else + 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, NULL); + tftio.Init(); + tftio.InitTFT(); + + if (preinit) { + preinit = false; + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); + } + + // Clear Screen + setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); + #if HAS_LCD_IO + tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); + #else + 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 + #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); + + 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); + drawImage(buttonB, u8g, dev, 32, 20, TFT_BTARROWS_COLOR); + + 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 + + return 0; + + case U8G_DEV_MSG_STOP: preinit = true; break; + + case U8G_DEV_MSG_PAGE_FIRST: + page = 0; + setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); + break; + + case U8G_DEV_MSG_PAGE_NEXT: + if (++page > (HEIGHT / PAGE_HEIGHT)) return 1; + + LOOP_L_N(y, PAGE_HEIGHT) { + uint32_t k = 0; + #if HAS_LCD_IO + buffer = (y & 1) ? bufferB : bufferA; + #endif + 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, GRAPHICAL_TFT_UPSCALE) buffer[k++] = c; + } + #if HAS_LCD_IO + 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]; + + tftio.WriteSequence(buffer, COUNT(bufferA)); + #else + uint8_t* bufptr = (uint8_t*) buffer; + 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]); + } + } + #endif + } + break; + + case U8G_DEV_MSG_SLEEP_ON: + // Enter Sleep Mode (10h) + return 1; + case U8G_DEV_MSG_SLEEP_OFF: + // Sleep Out (11h) + return 1; + } + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + +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; + } + + 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); + 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_16BIT); + 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_MARLINUI_U8GLIB && FSMC_CS diff --git a/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp new file mode 100644 index 00000000..172afbd7 --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_dev_uc1701_mini12864_HAL.cpp @@ -0,0 +1,213 @@ +/** + * 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 . + * + */ + +/** + * Based on u8g_dev_uc1701_mini12864.c (dealextreme) + * + * 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/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "HAL_LCD_com_defines.h" + +#define WIDTH 128 +#define HEIGHT 64 +#define PAGE_HEIGHT 8 + +#define UC1701_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) +#define UC1701_BIAS_MODE(N) ((N) ? 0xA3 : 0xA2) +#define UC1701_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) +#define UC1701_INVERTED(N) ((N) ? 0xA7 : 0xA6) +#define UC1701_ON(N) ((N) ? 0xAF : 0xAE) +#define UC1701_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define UC1701_POWER_CONTROL(N) (0x28 | (N)) +#define UC1701_V5_RATIO(N) (0x20 | ((N) & 0x7)) +#define UC1701_CONTRAST(N) (0x81), (N) + +#define UC1701_COLUMN_HI(N) (0x10 | (((N) >> 4) & 0xF)) +#define UC1701_COLUMN_ADR(N) UC1701_COLUMN_HI(N), ((N) & 0xF) +#define UC1701_PAGE_ADR(N) (0xB0 | (N)) +#define UC1701_START_LINE(N) (0x40 | (N)) +#define UC1701_INDICATOR(N) (0xAC), (N) +#define UC1701_RESET() (0xE2) +#define UC1701_NOOP() (0xE3) +#define UC1701_BOOST_RATIO(N) (0xF8), (N) + +static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { + U8G_ESC_CS(0), // disable chip + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_RST(1), // do reset low pulse with (1*16)+2 milliseconds + U8G_ESC_CS(1), // enable chip + + UC1701_RESET(), // soft reset + UC1701_START_LINE(0), // set display start line to 0 + UC1701_ADC_REVERSE(0), // ADC set to reverse + UC1701_OUT_MODE(1), // common output mode + UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_BIAS_MODE(0), // LCD bias 1/9 + UC1701_POWER_CONTROL(0x7), // all power control circuits on + UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x + UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large + UC1701_CONTRAST(0x27), // set contrast + UC1701_INDICATOR(0), // indicator disable + UC1701_ON(1), // display on + + U8G_ESC_CS(0), // disable chip + U8G_ESC_DLY(100), // delay 100 ms + U8G_ESC_CS(1), // enable chip + + UC1701_ALL_PIX(1), // display all points, ST7565 + U8G_ESC_CS(0), // disable chip + U8G_ESC_DLY(100), // delay 100 ms + U8G_ESC_DLY(100), // delay 100 ms + 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 +}; + +static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { + U8G_ESC_ADR(0), // instruction mode + U8G_ESC_CS(1), // enable chip + #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, FYSETC_MINI_12864) + UC1701_START_LINE(0), // set display start line to 0 + UC1701_ADC_REVERSE(0), // ADC set to reverse + UC1701_OUT_MODE(1), // common output mode + UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_BIAS_MODE(0), // LCD bias 1/9 + UC1701_POWER_CONTROL(0x7),// all power control circuits on + UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x + UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large + UC1701_INDICATOR(0), // indicator disable + UC1701_ON(1), // display on + UC1701_COLUMN_HI(0), // set upper 4 bit of the col adr to 0 + U8G_ESC_END, // end of sequence + U8G_ESC_DLY(5) // delay 5 ms + #else + UC1701_COLUMN_ADR(0), // address 0 + U8G_ESC_END // end of sequence + #endif +}; + +uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); + break; + + case U8G_DEV_MSG_STOP: break; + + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; + u8g_SetChipSelect(u8g, dev, 0); + } break; + + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } + return u8g_dev_pb8v1_base_fn(u8g, dev, msg, arg); +} + +uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + switch (msg) { + case U8G_DEV_MSG_INIT: + u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_300NS); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_init_seq); + break; + + case U8G_DEV_MSG_STOP: break; + + case U8G_DEV_MSG_PAGE_NEXT: { + u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); + u8g_SetChipSelect(u8g, dev, 0); + u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */ + u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); + u8g_SetChipSelect(u8g, dev, 0); + } break; + + case U8G_DEV_MSG_CONTRAST: + u8g_SetChipSelect(u8g, dev, 1); + u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_WriteByte(u8g, dev, 0x081); + u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); + u8g_SetChipSelect(u8g, dev, 0); + return 1; + } + return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); +} + +U8G_PB_DEV(u8g_dev_uc1701_mini12864_HAL_sw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_uc1701_mini12864_HAL_fn, U8G_COM_HAL_SW_SPI_FN); +U8G_PB_DEV(u8g_dev_uc1701_mini12864_HAL_hw_spi, WIDTH, HEIGHT, PAGE_HEIGHT, u8g_dev_uc1701_mini12864_HAL_fn, U8G_COM_HAL_HW_SPI_FN); + +uint8_t u8g_dev_uc1701_mini12864_HAL_2x_buf[WIDTH*2] U8G_NOCOMMON ; +u8g_pb_t u8g_dev_uc1701_mini12864_HAL_2x_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_uc1701_mini12864_HAL_2x_buf}; +u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_sw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_SW_SPI_FN }; +u8g_dev_t u8g_dev_uc1701_mini12864_HAL_2x_hw_spi = { u8g_dev_uc1701_mini12864_HAL_2x_fn, &u8g_dev_uc1701_mini12864_HAL_2x_pb, U8G_COM_HAL_HW_SPI_FN }; + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp new file mode 100644 index 00000000..89bdb09e --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp @@ -0,0 +1,315 @@ +/** + * @file u8g_fontutf8.cpp + * @brief font api for u8g lib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright GPL/BSD + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include +#include "../fontutils.h" +#include "u8g_fontutf8.h" + +typedef void font_t; + +/** + * @brief the callback function to draw something + * + * @param userdata : User's data + * @param msg : the u8g's string + * @param fnt_current : the font + * + * @return 0 on success, 1 to force quit, <0 on error + * + * Get the screen pixel width of a ROM UTF-8 string + */ +typedef int (* fontgroup_cb_draw_t)(void *userdata, const font_t *fnt_current, const char *msg); + +/* return v1 - v2 */ +static int fontinfo_compare(uxg_fontinfo_t * v1, uxg_fontinfo_t * v2) { + if (v1->page < v2->page) return -1; + else if (v1->page > v2->page) return 1; + + if (v1->end < v2->begin) return -1; + else if (v1->begin > v2->end) return 1; + + return 0; +} + +/*"data_list[idx] - *data_pin"*/ +static int pf_bsearch_cb_comp_fntifo_pgm (void *userdata, size_t idx, void *data_pin) { + uxg_fontinfo_t *fntinfo = (uxg_fontinfo_t*)userdata; + uxg_fontinfo_t localval; + memcpy_P(&localval, fntinfo + idx, sizeof(localval)); + return fontinfo_compare(&localval, (uxg_fontinfo_t*)data_pin); +} + +typedef struct _font_group_t { + const uxg_fontinfo_t * m_fntifo; + int m_fntinfo_num; +} font_group_t; + +static int fontgroup_init(font_group_t * root, const uxg_fontinfo_t * fntinfo, int number) { + root->m_fntifo = fntinfo; + root->m_fntinfo_num = number; + return 0; +} + +static const font_t* fontgroup_find(font_group_t * root, wchar_t val) { + uxg_fontinfo_t vcmp = {(uint16_t)(val / 128), (uint8_t)(val % 128 + 128), (uint8_t)(val % 128 + 128), 0, 0}; + size_t idx = 0; + + if (val < 256) return nullptr; + + if (pf_bsearch_r((void*)root->m_fntifo, root->m_fntinfo_num, pf_bsearch_cb_comp_fntifo_pgm, (void*)&vcmp, &idx) < 0) + return nullptr; + + memcpy_P(&vcmp, root->m_fntifo + idx, sizeof(vcmp)); + return vcmp.fntdata; +} + +static void fontgroup_drawwchar(font_group_t *group, const font_t *fnt_default, wchar_t val, void * userdata, fontgroup_cb_draw_t cb_draw_ram) { + uint8_t buf[2] = {0, 0}; + const font_t * fntpqm = (font_t*)fontgroup_find(group, val); + if (!fntpqm) { + // Unknown char, use default font + buf[0] = (uint8_t)(val & 0xFF); + fntpqm = fnt_default; + } + if (fnt_default != fntpqm) { + buf[0] = (uint8_t)(val & 0x7F); + buf[0] |= 0x80; // use upper page to avoid 0x00 error in C. you may want to generate the font data + } + + cb_draw_ram (userdata, fntpqm, (char*) buf); +} + +/** + * @brief try to process a utf8 string + * + * @param pu8g : U8G pointer + * @param fnt_default : the default font + * @param utf8_msg : the UTF-8 string + * @param cb_read_byte : how to read the utf8_msg, from RAM or ROM (call read_byte_ram or pgm_read_byte) + * @param userdata : User's data + * @param cb_draw_ram : the callback function of userdata to draw a !RAM! string (actually it is to draw a one byte string in RAM) + * + * @return N/A + * + * Get the screen pixel width of a ROM UTF-8 string + */ +static void fontgroup_drawstring(font_group_t *group, const font_t *fnt_default, const char *utf8_msg, read_byte_cb_t cb_read_byte, void * userdata, fontgroup_cb_draw_t cb_draw_ram) { + uint8_t *p = (uint8_t*)utf8_msg; + for (;;) { + wchar_t val = 0; + p = get_utf8_value_cb(p, cb_read_byte, &val); + if (!val) break; + fontgroup_drawwchar(group, fnt_default, val, userdata, cb_draw_ram); + } +} + +static bool flag_fontgroup_was_inited = false; +static font_group_t g_fontgroup_root = { nullptr, 0 }; + +/** + * @brief check if font is loaded + */ +static inline bool uxg_Utf8FontIsInited() { return flag_fontgroup_was_inited; } + +int uxg_SetUtf8Fonts (const uxg_fontinfo_t * fntinfo, int number) { + flag_fontgroup_was_inited = 1; + return fontgroup_init(&g_fontgroup_root, fntinfo, number); +} + +struct _uxg_drawu8_data_t { + u8g_t *pu8g; + unsigned int x; + unsigned int y; + unsigned int adv; + unsigned int max_width; // the max pixel width of the string allowed + const void * fnt_prev; +}; + +static int fontgroup_cb_draw_u8g(void *userdata, const font_t *fnt_current, const char *msg) { + struct _uxg_drawu8_data_t * pdata = (_uxg_drawu8_data_t*)userdata; + + if (pdata->fnt_prev != fnt_current) { + u8g_SetFont(pdata->pu8g, (const u8g_fntpgm_uint8_t*)fnt_current); + pdata->fnt_prev = fnt_current; + } + if ((pdata->max_width != PIXEL_LEN_NOLIMIT) && (pdata->adv + u8g_GetStrPixelWidth(pdata->pu8g, (char*)msg) > pdata->max_width)) + return 1; + pdata->adv += u8g_DrawStr(pdata->pu8g, pdata->x + pdata->adv, pdata->y, (char*) msg); + return 0; +} + +/** + * @brief Draw a wchar_t at the specified position + * + * @param pu8g : U8G pointer + * @param x : position x axis + * @param y : position y axis + * @param ch : the wchar_t + * @param max_width : the pixel width of the string allowed + * + * @return number of pixels advanced + * + * Draw a UTF-8 string at the specified position + */ +unsigned int uxg_DrawWchar(u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t ch, pixel_len_t max_width) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) { + u8g_DrawStrP(pu8g, x, y, (const u8g_pgm_uint8_t *)PSTR("Err: utf8 font not initialized.")); + return 0; + } + data.pu8g = pu8g; + data.x = x; + data.y = y; + data.adv = 0; + data.max_width = max_width; + data.fnt_prev = nullptr; + fontgroup_drawwchar(group, fnt_default, ch, (void*)&data, fontgroup_cb_draw_u8g); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +/** + * @brief Draw a UTF-8 string at the specified position + * + * @param pu8g : U8G pointer + * @param x : position x axis + * @param y : position y axis + * @param utf8_msg : the UTF-8 string + * @param max_width : the pixel width of the string allowed + * + * @return number of pixels advanced + * + * Draw a UTF-8 string at the specified position + */ +unsigned int uxg_DrawUtf8Str(u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_width) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) { + u8g_DrawStrP(pu8g, x, y, (const u8g_pgm_uint8_t *)PSTR("Err: utf8 font not initialized.")); + return 0; + } + data.pu8g = pu8g; + data.x = x; + data.y = y; + data.adv = 0; + data.max_width = max_width; + data.fnt_prev = nullptr; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_ram, (void*)&data, fontgroup_cb_draw_u8g); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +/** + * @brief Draw a ROM UTF-8 string at the specified position + * + * @param pu8g : U8G pointer + * @param x : position x axis + * @param y : position y axis + * @param utf8_msg : the UTF-8 string + * @param max_width : the pixel width of the string allowed + * + * @return number of pixels advanced + * + * Draw a ROM UTF-8 string at the specified position + */ +unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, PGM_P utf8_msg, pixel_len_t max_width) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) { + u8g_DrawStrP(pu8g, x, y, (const u8g_pgm_uint8_t *)PSTR("Err: utf8 font not initialized.")); + return 0; + } + data.pu8g = pu8g; + data.x = x; + data.y = y; + data.adv = 0; + data.max_width = max_width; + data.fnt_prev = nullptr; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_rom, (void*)&data, fontgroup_cb_draw_u8g); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +static int fontgroup_cb_draw_u8gstrlen(void *userdata, const font_t *fnt_current, const char *msg) { + struct _uxg_drawu8_data_t * pdata = (_uxg_drawu8_data_t*)userdata; + + if (pdata->fnt_prev != fnt_current) { + u8g_SetFont(pdata->pu8g, (const u8g_fntpgm_uint8_t*)fnt_current); + pdata->fnt_prev = fnt_current; + } + pdata->adv += u8g_GetStrPixelWidth(pdata->pu8g, (char*)msg); + return 0; +} + +/** + * @brief Get the screen pixel width of a UTF-8 string + * + * @param pu8g : U8G pointer + * @param utf8_msg : the UTF-8 string + * + * @return the pixel width + * + * Get the screen pixel width of a UTF-8 string + */ +int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) return -1; + + memset(&data, 0, sizeof(data)); + data.pu8g = pu8g; + data.adv = 0; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_ram, (void*)&data, fontgroup_cb_draw_u8gstrlen); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + + return data.adv; +} + +/** + * @brief Get the screen pixel width of a ROM UTF-8 string + * + * @param pu8g : U8G pointer + * @param utf8_msg : the UTF-8 string + * + * @return the pixel width + * + * Get the screen pixel width of a ROM UTF-8 string + */ +int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg) { + struct _uxg_drawu8_data_t data; + font_group_t *group = &g_fontgroup_root; + const font_t *fnt_default = uxg_GetFont(pu8g); + + if (!uxg_Utf8FontIsInited()) return -1; + + memset(&data, 0, sizeof(data)); + data.pu8g = pu8g; + data.adv = 0; + fontgroup_drawstring(group, fnt_default, utf8_msg, read_byte_rom, (void*)&data, fontgroup_cb_draw_u8gstrlen); + u8g_SetFont(pu8g, (const u8g_fntpgm_uint8_t*)fnt_default); + return data.adv; +} + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.h b/Marlin/src/lcd/dogm/u8g_fontutf8.h new file mode 100644 index 00000000..34e365cf --- /dev/null +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.h @@ -0,0 +1,37 @@ +/** + * @file fontutf8.h + * @brief font api for u8g lib + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright GPL/BSD + */ +#pragma once + +#include +#include "../fontutils.h" + +// the macro to indicate a UTF-8 string +// You should to save the C/C++ source in UTF-8 encoding! +// Once you change your UTF-8 strings, you need to call the script uxggenpages.sh to create the font data file fontutf8-data.h +#define _UxGT(a) a + +typedef struct _uxg_fontinfo_t { + uint16_t page; + uint8_t begin; + uint8_t end; + uint16_t size; + const u8g_fntpgm_uint8_t *fntdata; +} uxg_fontinfo_t; + +int uxg_SetUtf8Fonts(const uxg_fontinfo_t * fntinfo, int number); // fntinfo is type of PROGMEM + +unsigned int uxg_DrawWchar(u8g_t *pu8g, unsigned int x, unsigned int y, wchar_t ch, pixel_len_t max_length); + +unsigned int uxg_DrawUtf8Str(u8g_t *pu8g, unsigned int x, unsigned int y, const char *utf8_msg, pixel_len_t max_length); +unsigned int uxg_DrawUtf8StrP(u8g_t *pu8g, unsigned int x, unsigned int y, PGM_P utf8_msg, pixel_len_t max_length); + +int uxg_GetUtf8StrPixelWidth(u8g_t *pu8g, const char *utf8_msg); +int uxg_GetUtf8StrPixelWidthP(u8g_t *pu8g, PGM_P utf8_msg); + +#define uxg_GetFont(puxg) ((puxg)->font) diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp new file mode 100644 index 00000000..c48abac8 --- /dev/null +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.cpp @@ -0,0 +1,690 @@ +/** + * 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 . + * + */ + +/** + * lcd/dogm/ultralcd_DOGM.h + * + * Implementation of the LCD display routines for a DOGM128 graphic display. + * by STB for ErikZalm/Marlin. Common LCD 128x64 pixel graphic displays. + * + * 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: https://opensource.org/licenses/BSD-3-Clause + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + +#include "ultralcd_DOGM.h" +#include "u8g_fontutf8.h" + +#if ENABLED(SHOW_BOOTSCREEN) + #include "dogm_Bootscreen.h" +#endif + +#include "../lcdprint.h" +#include "../fontutils.h" +#include "../../libs/numtostr.h" +#include "../ultralcd.h" + +#include "../../sd/cardreader.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" + +#if ENABLED(SDSUPPORT) + #include "../../libs/duration_t.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +/** + * Include all needed font files + * (See https://marlinfw.org/docs/development/fonts.html) + */ +#include "fontdata/fontdata_ISO10646_1.h" +#if ENABLED(USE_SMALL_INFOFONT) + #include "fontdata/fontdata_6x9_marlin.h" + #define FONT_STATUSMENU_NAME u8g_font_6x9 +#else + #define FONT_STATUSMENU_NAME MENU_FONT_NAME +#endif + +U8G_CLASS u8g(U8G_PARAM); + +#include LANGUAGE_DATA_INCL(LCD_LANGUAGE) + +#if HAS_LCD_CONTRAST + + int16_t MarlinUI::contrast = DEFAULT_LCD_CONTRAST; + + void MarlinUI::set_contrast(const int16_t value) { + contrast = constrain(value, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX); + u8g.setContrast(contrast); + } + +#endif + +void MarlinUI::set_font(const MarlinFont font_nr) { + static char currentfont = 0; + if (font_nr != currentfont) { + switch ((currentfont = font_nr)) { + case FONT_STATUSMENU : u8g.setFont(FONT_STATUSMENU_NAME); break; + case FONT_EDIT : u8g.setFont(EDIT_FONT_NAME); break; + default: + case FONT_MENU : u8g.setFont(MENU_FONT_NAME); break; + } + } +} + +bool MarlinUI::detected() { return true; } + +#if ENABLED(SHOW_BOOTSCREEN) + + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + // Draws a slice of a particular frame of the custom bootscreen, without the u8g loop + void MarlinUI::draw_custom_bootscreen(const uint8_t frame/*=0*/) { + constexpr u8g_uint_t left = u8g_uint_t((LCD_PIXEL_WIDTH - (CUSTOM_BOOTSCREEN_BMPWIDTH)) / 2), + top = u8g_uint_t((LCD_PIXEL_HEIGHT - (CUSTOM_BOOTSCREEN_BMPHEIGHT)) / 2); + #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) + constexpr u8g_uint_t right = left + CUSTOM_BOOTSCREEN_BMPWIDTH, + bottom = top + CUSTOM_BOOTSCREEN_BMPHEIGHT; + #endif + + const u8g_pgm_uint8_t * const bmp = + #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED) + (u8g_pgm_uint8_t*)pgm_read_ptr(&custom_bootscreen_animation[frame]) + #else + custom_start_bmp + #endif + ; + TERN(CUSTOM_BOOTSCREEN_ANIMATED,,UNUSED(frame)); + + u8g.drawBitmapP(left, top, CUSTOM_BOOTSCREEN_BMP_BYTEWIDTH, CUSTOM_BOOTSCREEN_BMPHEIGHT, bmp); + + #if ENABLED(CUSTOM_BOOTSCREEN_INVERTED) + if (frame == 0) { + u8g.setColorIndex(1); + if (top) u8g.drawBox(0, 0, LCD_PIXEL_WIDTH, top); + if (left) u8g.drawBox(0, top, left, CUSTOM_BOOTSCREEN_BMPHEIGHT); + if (right < LCD_PIXEL_WIDTH) u8g.drawBox(right, top, LCD_PIXEL_WIDTH - right, CUSTOM_BOOTSCREEN_BMPHEIGHT); + if (bottom < LCD_PIXEL_HEIGHT) u8g.drawBox(0, bottom, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT - bottom); + } + #endif + } + + // Shows the custom bootscreen, with the u8g loop, animations and delays + void MarlinUI::show_custom_bootscreen() { + #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED) + constexpr millis_t d = 0; + constexpr uint8_t f = 0; + #else + constexpr millis_t d = CUSTOM_BOOTSCREEN_FRAME_TIME; + LOOP_L_N(f, COUNT(custom_bootscreen_animation)) + #endif + { + u8g.firstPage(); + do { draw_custom_bootscreen(f); } while (u8g.nextPage()); + if (d) safe_delay(d); + } + + #ifndef CUSTOM_BOOTSCREEN_TIMEOUT + #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 + #endif + safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + } + #endif // SHOW_CUSTOM_BOOTSCREEN + + // Two-part needed to display all info + constexpr bool two_part = ((LCD_PIXEL_HEIGHT) - (START_BMPHEIGHT)) < ((MENU_FONT_ASCENT) * 2); + + // Draw the static Marlin bootscreen from a u8g loop + // or the animated boot screen within its own u8g loop + void MarlinUI::draw_marlin_bootscreen(const bool line2/*=false*/) { + + // Determine text space needed + constexpr u8g_uint_t text_width_1 = u8g_uint_t((sizeof(SHORT_BUILD_VERSION) - 1) * (MENU_FONT_WIDTH)), + text_width_2 = u8g_uint_t((sizeof(MARLIN_WEBSITE_URL) - 1) * (MENU_FONT_WIDTH)), + text_max_width = _MAX(text_width_1, text_width_2), + text_total_height = (MENU_FONT_HEIGHT) * 2, + width = LCD_PIXEL_WIDTH, height = LCD_PIXEL_HEIGHT, + rspace = width - (START_BMPWIDTH); + + u8g_int_t offx, offy, txt_base, txt_offx_1, txt_offx_2; + + // Can the text fit to the right of the bitmap? + if (text_max_width < rspace) { + constexpr int8_t inter = (width - text_max_width - (START_BMPWIDTH)) / 3; // Evenly distribute horizontal space + offx = inter; // First the boot logo... + offy = (height - (START_BMPHEIGHT)) / 2; // ...V-aligned in the full height + txt_offx_1 = txt_offx_2 = inter + (START_BMPWIDTH) + inter; // Text right of the bitmap + txt_base = (height + MENU_FONT_ASCENT + text_total_height - (MENU_FONT_HEIGHT)) / 2; // Text vertical center + } + else { + constexpr int8_t inter = (height - text_total_height - (START_BMPHEIGHT)) / 3; // Evenly distribute vertical space + offx = rspace / 2; // Center the boot logo in the whole space + offy = inter; // V-align boot logo proportionally + txt_offx_1 = (width - text_width_1) / 2; // Text 1 centered + txt_offx_2 = (width - text_width_2) / 2; // Text 2 centered + txt_base = offy + START_BMPHEIGHT + offy + text_total_height - (MENU_FONT_DESCENT); // Even spacing looks best + } + NOLESS(offx, 0); + NOLESS(offy, 0); + + auto _draw_bootscreen_bmp = [&](const uint8_t *bitmap) { + u8g.drawBitmapP(offx, offy, START_BMP_BYTEWIDTH, START_BMPHEIGHT, bitmap); + set_font(FONT_MENU); + if (!two_part || !line2) lcd_put_u8str_P(txt_offx_1, txt_base - (MENU_FONT_HEIGHT), PSTR(SHORT_BUILD_VERSION)); + if (!two_part || line2) lcd_put_u8str_P(txt_offx_2, txt_base, PSTR(MARLIN_WEBSITE_URL)); + }; + + auto draw_bootscreen_bmp = [&](const uint8_t *bitmap) { + u8g.firstPage(); do { _draw_bootscreen_bmp(bitmap); } while (u8g.nextPage()); + }; + + #if DISABLED(BOOT_MARLIN_LOGO_ANIMATED) + draw_bootscreen_bmp(start_bmp); + #else + constexpr millis_t d = MARLIN_BOOTSCREEN_FRAME_TIME; + LOOP_L_N(f, COUNT(marlin_bootscreen_animation)) { + draw_bootscreen_bmp((uint8_t*)pgm_read_ptr(&marlin_bootscreen_animation[f])); + if (d) safe_delay(d); + } + #endif + } + + // Show the Marlin bootscreen, with the u8g loop and delays + void MarlinUI::show_marlin_bootscreen() { + constexpr uint8_t pages = two_part ? 2 : 1; + for (uint8_t q = pages; q--;) { + draw_marlin_bootscreen(q == 0); + safe_delay((BOOTSCREEN_TIMEOUT) / pages); + } + } + + void MarlinUI::show_bootscreen() { + TERN_(SHOW_CUSTOM_BOOTSCREEN, show_custom_bootscreen()); + show_marlin_bootscreen(); + } + +#endif // SHOW_BOOTSCREEN + +#if ENABLED(LIGHTWEIGHT_UI) + #include "status_screen_lite_ST7920.h" +#endif + +// Initialize or re-initialize the LCD +void MarlinUI::init_lcd() { + #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(); + #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)); +} + +// The kill screen is displayed for unrecoverable conditions +void MarlinUI::draw_kill_screen() { + TERN_(LIGHTWEIGHT_UI, ST7920_Lite_Status_Screen::clear_text_buffer()); + const u8g_uint_t h4 = u8g.getHeight() / 4; + u8g.firstPage(); + do { + set_font(FONT_MENU); + lcd_put_u8str(0, h4 * 1, status_message); + lcd_put_u8str_P(0, h4 * 2, GET_TEXT(MSG_HALTED)); + lcd_put_u8str_P(0, h4 * 3, GET_TEXT(MSG_PLEASE_RESET)); + } while (u8g.nextPage()); +} + +void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop + +#if HAS_LCD_MENU + + #include "../menu/menu.h" + + u8g_uint_t row_y1, row_y2; + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + + void MarlinUI::draw_hotend_status(const uint8_t row, const uint8_t extruder) { + row_y1 = row * (MENU_FONT_HEIGHT) + 1; + row_y2 = row_y1 + MENU_FONT_HEIGHT - 1; + + if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return; + + lcd_put_wchar(LCD_PIXEL_WIDTH - 11 * (MENU_FONT_WIDTH), row_y2, 'E'); + lcd_put_wchar((char)('1' + extruder)); + lcd_put_wchar(' '); + lcd_put_u8str(i16tostr3rj(thermalManager.degHotend(extruder))); + lcd_put_wchar('/'); + + if (get_blink() || !thermalManager.heater_idle[extruder].timed_out) + lcd_put_u8str(i16tostr3rj(thermalManager.degTargetHotend(extruder))); + } + + #endif // ADVANCED_PAUSE_FEATURE + + // 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; + + if (!PAGE_CONTAINS(row_y1 + 1, row_y2 + 2)) return false; + + if (sel) { + #if ENABLED(MENU_HOLLOW_FRAME) + u8g.drawHLine(0, row_y1 + 1, LCD_PIXEL_WIDTH); + u8g.drawHLine(0, row_y2 + 2, LCD_PIXEL_WIDTH); + #else + u8g.setColorIndex(1); // solid outline + u8g.drawBox(0, row_y1 + 2, LCD_PIXEL_WIDTH, MENU_FONT_HEIGHT - 1); + u8g.setColorIndex(0); // inverted text + #endif + } + #if DISABLED(MENU_HOLLOW_FRAME) + else u8g.setColorIndex(1); // solid text + #endif + + if (!PAGE_CONTAINS(row_y1, row_y2)) return false; + + lcd_moveto(0, row_y2); + return true; + } + + // 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 vstr/*=nullptr*/) { + + if (mark_as_selected(row, style & SS_INVERT)) { + + pixel_len_t n = LCD_PIXEL_WIDTH; // pixel width of string allowed + + 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(' '); + } + + 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(' '); + } + } + + // 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, 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(' '); + } + } + + // 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 inStr, const bool pgm) { + if (mark_as_selected(row, sel)) { + 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, 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(inStr); else lcd_put_u8str((char*)inStr); + } + } + } + + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + ui.encoder_direction_normal(); + + const u8g_uint_t labellen = utf8_strlen_P(pstr), vallen = utf8_strlen(value); + bool extra_row = labellen > LCD_WIDTH - 2 - vallen; + + #if ENABLED(USE_BIG_EDIT_FONT) + // Use the menu font if the label won't fit on a single line + constexpr u8g_uint_t lcd_edit_width = (LCD_PIXEL_WIDTH) / (EDIT_FONT_WIDTH); + u8g_uint_t lcd_chr_fit, one_chr_width; + if (labellen <= lcd_edit_width - 1) { + if (labellen + vallen + 1 > lcd_edit_width) extra_row = true; + lcd_chr_fit = lcd_edit_width + 1; + one_chr_width = EDIT_FONT_WIDTH; + ui.set_font(FONT_EDIT); + } + else { + lcd_chr_fit = LCD_WIDTH; + one_chr_width = MENU_FONT_WIDTH; + ui.set_font(FONT_MENU); + } + #else + constexpr u8g_uint_t lcd_chr_fit = LCD_WIDTH, + one_chr_width = MENU_FONT_WIDTH; + #endif + + // Center the label and value lines on the middle line + u8g_uint_t baseline = extra_row ? (LCD_PIXEL_HEIGHT) / 2 - 1 + : (LCD_PIXEL_HEIGHT + EDIT_FONT_ASCENT) / 2; + + // 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, itemString); + + // If a value is included, print a colon, then print the value right-justified + if (value != nullptr) { + lcd_put_wchar(':'); + if (extra_row) { + // Assume that value is numeric (with no descender) + baseline += EDIT_FONT_ASCENT + 2; + onpage = PAGE_CONTAINS(baseline - (EDIT_FONT_ASCENT - 1), baseline); + } + if (onpage) { + lcd_put_wchar(((lcd_chr_fit - 1) - (vallen + 1)) * one_chr_width, baseline, ' '); // Right-justified, padded, add a leading space + 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) { + 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); + u8g.setColorIndex(0); + } + lcd_put_u8str_P(bx, by, pstr); + if (inv) u8g.setColorIndex(1); + } + + 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*/) { + ui.draw_select_screen_prompt(pref, string, suff); + draw_boxed_string(1, LCD_HEIGHT - 1, no, !yesno); + draw_boxed_string(LCD_WIDTH - (utf8_strlen_P(yes) + 1), LCD_HEIGHT - 1, yes, yesno); + } + + #if ENABLED(SDSUPPORT) + + void MenuItem_sdbase::draw(const bool sel, const uint8_t row, PGM_P const, CardReader &theCard, const bool isDir) { + if (mark_as_selected(row, sel)) { + if (isDir) lcd_put_wchar(LCD_STR_FOLDER[0]); + constexpr uint8_t maxlen = LCD_WIDTH - 1; + 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(' '); + } + } + + #endif // SDSUPPORT + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + /** + * UBL LCD "radar" map data + */ + #define MAP_UPPER_LEFT_CORNER_X 35 // These probably should be moved to the .h file But for now, + #define MAP_UPPER_LEFT_CORNER_Y 8 // it is easier to play with things having them here + #define MAP_MAX_PIXELS_X 53 + #define MAP_MAX_PIXELS_Y 49 + + void MarlinUI::ubl_plot(const uint8_t x_plot, const uint8_t y_plot) { + // Scale the box pixels appropriately + u8g_uint_t x_map_pixels = ((MAP_MAX_PIXELS_X - 4) / (GRID_MAX_POINTS_X)) * (GRID_MAX_POINTS_X), + y_map_pixels = ((MAP_MAX_PIXELS_Y - 4) / (GRID_MAX_POINTS_Y)) * (GRID_MAX_POINTS_Y), + + pixels_per_x_mesh_pnt = x_map_pixels / (GRID_MAX_POINTS_X), + pixels_per_y_mesh_pnt = y_map_pixels / (GRID_MAX_POINTS_Y), + + x_offset = MAP_UPPER_LEFT_CORNER_X + 1 + (MAP_MAX_PIXELS_X - x_map_pixels - 2) / 2, + y_offset = MAP_UPPER_LEFT_CORNER_Y + 1 + (MAP_MAX_PIXELS_Y - y_map_pixels - 2) / 2; + + // Clear the Mesh Map + + if (PAGE_CONTAINS(y_offset - 2, y_offset + y_map_pixels + 4)) { + u8g.setColorIndex(1); // First draw the bigger box in White so we have a border around the mesh map box + u8g.drawBox(x_offset - 2, y_offset - 2, x_map_pixels + 4, y_map_pixels + 4); + if (PAGE_CONTAINS(y_offset, y_offset + y_map_pixels)) { + u8g.setColorIndex(0); // Now actually clear the mesh map box + u8g.drawBox(x_offset, y_offset, x_map_pixels, y_map_pixels); + } + } + + // Display Mesh Point Locations + + u8g.setColorIndex(1); + const u8g_uint_t sx = x_offset + pixels_per_x_mesh_pnt / 2; + u8g_uint_t y = y_offset + pixels_per_y_mesh_pnt / 2; + for (uint8_t j = 0; j < GRID_MAX_POINTS_Y; j++, y += pixels_per_y_mesh_pnt) + if (PAGE_CONTAINS(y, y)) + for (uint8_t i = 0, x = sx; i < GRID_MAX_POINTS_X; i++, x += pixels_per_x_mesh_pnt) + u8g.drawBox(x, y, 1, 1); + + // Fill in the Specified Mesh Point + + const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; // The origin is typically in the lower right corner. We need to + // invert the Y to get it to plot in the right location. + + const u8g_uint_t by = y_offset + y_plot_inv * pixels_per_y_mesh_pnt; + if (PAGE_CONTAINS(by, by + pixels_per_y_mesh_pnt)) + u8g.drawBox( + x_offset + x_plot * pixels_per_x_mesh_pnt, by, + pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt + ); + + // Put Relevant Text on Display + + // Show X and Y positions at top of screen + u8g.setColorIndex(1); + if (PAGE_UNDER(7)) { + const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, + lpos = pos.asLogical(); + lcd_put_u8str_P(5, 7, X_LBL); + lcd_put_u8str(ftostr52(lpos.x)); + lcd_put_u8str_P(74, 7, Y_LBL); + lcd_put_u8str(ftostr52(lpos.y)); + } + + // Print plot position + if (PAGE_CONTAINS(LCD_PIXEL_HEIGHT - (INFO_FONT_HEIGHT - 1), LCD_PIXEL_HEIGHT)) { + lcd_put_wchar(5, LCD_PIXEL_HEIGHT, '('); + u8g.print(x_plot); + lcd_put_wchar(','); + u8g.print(y_plot); + lcd_put_wchar(')'); + + // Show the location value + lcd_put_u8str_P(74, LCD_PIXEL_HEIGHT, Z_LBL); + if (!isnan(ubl.z_values[x_plot][y_plot])) + lcd_put_u8str(ftostr43sign(ubl.z_values[x_plot][y_plot])); + else + lcd_put_u8str_P(PSTR(" -----")); + } + + } + + #endif // AUTO_BED_LEVELING_UBL + + #if EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + + const unsigned char cw_bmp[] PROGMEM = { + B00000000,B11111110,B00000000, + B00000011,B11111111,B10000000, + B00000111,B11000111,B11000000, + B00000111,B00000001,B11100000, + B00000000,B00000000,B11100000, + B00000000,B00000000,B11110000, + B00000000,B00000000,B01110000, + B00000100,B00000000,B01110000, + B00001110,B00000000,B01110000, + B00011111,B00000000,B01110000, + B00111111,B10000000,B11110000, + B00001110,B00000000,B11100000, + B00001111,B00000001,B11100000, + B00000111,B11000111,B11000000, + B00000011,B11111111,B10000000, + B00000000,B11111110,B00000000 + }; + + const unsigned char ccw_bmp[] PROGMEM = { + B00000000,B11111110,B00000000, + B00000011,B11111111,B10000000, + B00000111,B11000111,B11000000, + B00001111,B00000001,B11100000, + B00001110,B00000000,B11100000, + B00111111,B10000000,B11110000, + B00011111,B00000000,B01110000, + B00001110,B00000000,B01110000, + B00000100,B00000000,B01110000, + B00000000,B00000000,B01110000, + B00000000,B00000000,B11110000, + B00000000,B00000000,B11100000, + B00000111,B00000001,B11100000, + B00000111,B11000111,B11000000, + B00000011,B11111111,B10000000, + B00000000,B11111110,B00000000 + }; + + const unsigned char up_arrow_bmp[] PROGMEM = { + B00000100,B00000000, + B00001110,B00000000, + B00011111,B00000000, + B00111111,B10000000, + B01111111,B11000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000 + }; + + const unsigned char down_arrow_bmp[] PROGMEM = { + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B01111111,B11000000, + B00111111,B10000000, + B00011111,B00000000, + B00001110,B00000000, + B00000100,B00000000 + }; + + const unsigned char offset_bedline_bmp[] PROGMEM = { + B11111111,B11111111,B11111111 + }; + + const unsigned char nozzle_bmp[] PROGMEM = { + B01111111,B10000000, + B11111111,B11000000, + B11111111,B11000000, + B11111111,B11000000, + B01111111,B10000000, + B01111111,B10000000, + B11111111,B11000000, + B11111111,B11000000, + B11111111,B11000000, + B00111111,B00000000, + B00011110,B00000000, + B00001100,B00000000 + }; + + void _lcd_zoffset_overlay_gfx(const float zvalue) { + // Determine whether the user is raising or lowering the nozzle. + static int8_t dir; + static float old_zvalue; + if (zvalue != old_zvalue) { + dir = zvalue ? zvalue < old_zvalue ? -1 : 1 : 0; + old_zvalue = zvalue; + } + + #if ENABLED(OVERLAY_GFX_REVERSE) + const unsigned char *rot_up = ccw_bmp, *rot_down = cw_bmp; + #else + const unsigned char *rot_up = cw_bmp, *rot_down = ccw_bmp; + #endif + + #if ENABLED(USE_BIG_EDIT_FONT) + const int left = 0, right = 45, nozzle = 95; + #else + const int left = 5, right = 90, nozzle = 60; + #endif + + // Draw a representation of the nozzle + if (PAGE_CONTAINS(3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); + if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20, 3, 1, offset_bedline_bmp); + + // Draw cw/ccw indicator and up/down arrows. + if (PAGE_CONTAINS(47, 62)) { + u8g.drawBitmapP(right + 0, 48 - dir, 2, 13, up_arrow_bmp); + u8g.drawBitmapP(left + 0, 49 - dir, 2, 13, down_arrow_bmp); + u8g.drawBitmapP(left + 13, 47, 3, 16, rot_down); + u8g.drawBitmapP(right + 13, 47, 3, 16, rot_up); + } + } + + #endif // BABYSTEP_ZPROBE_GFX_OVERLAY || MESH_EDIT_GFX_OVERLAY + +#endif // HAS_LCD_MENU + +#endif // HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/dogm/ultralcd_DOGM.h b/Marlin/src/lcd/dogm/ultralcd_DOGM.h new file mode 100644 index 00000000..228cee68 --- /dev/null +++ b/Marlin/src/lcd/dogm/ultralcd_DOGM.h @@ -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 . + * + */ +#pragma once + +/** + * lcd/dogm/ultralcd_DOGM.h + */ + +#include "../../inc/MarlinConfigPre.h" + +#include +#include "HAL_LCD_class_defines.h" + +//#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 + #else + #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS + #endif + +#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.) + #define U8G_PARAM LCD_PINS_RS + #else + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) + #else + #define U8G_CLASS U8GLIB_ST7920_128X64_RRD // Adjust stripes with PAGE_HEIGHT in ultralcd_st7920_u8glib_rrd.h + #endif + #define U8G_PARAM LCD_PINS_D4, LCD_PINS_ENABLE, LCD_PINS_RS // AVR version ignores these pin settings + // HAL version uses these pin settings + #endif + +#elif ENABLED(CARTESIO_UI) + + // CartesioUI LCD + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_DOGM128_2X // 4 stripes + #define FORCE_SOFT_SPI // SW-SPI + #else + #define U8G_CLASS U8GLIB_DOGM128_2X // 4 stripes (HW-SPI) + #endif + +#elif ENABLED(U8GLIB_LM6059_AF) + + // Based on the Adafruit ST7565 (https://www.adafruit.com/products/250) + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_LM6059 // 8 stripes (HW-SPI) + #else + #define U8G_CLASS U8GLIB_LM6059_2X // 4 stripes (HW-SPI) + #endif + +#elif ENABLED(U8GLIB_ST7565_64128N) + + // MaKrPanel, Mini Viki, Viki 2.0, AZSMZ 12864 ST7565 controller + + #define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) + #define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI) + #if SMART_RAMPS || DOGLCD_SCK != SCK_PIN || DOGLCD_MOSI != MOSI_PIN + #define FORCE_SOFT_SPI // SW-SPI + #endif + +#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 + + #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(ZONESTAR_12864OLED_SSD1306) + + // Zonestar SSD1306 OLED SPI LCD + + #define FORCE_SOFT_SPI // SW-SPI + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SH1306_128X64_2X // 4 stripes + #else + #define U8G_CLASS U8GLIB_SH1306_128X64 // 8 stripes + #endif + +#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(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 + +#elif ENABLED(U8GLIB_SH1106) + + // Generic SH1106 OLED I2C LCD + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SH1106_128X64_2X_I2C_2_WIRE // 4 stripes + #else + #define U8G_CLASS U8GLIB_SH1106_128X64_2X // 4 stripes + #endif + #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C + +#elif ENABLED(U8GLIB_SSD1309) + + // Generic support for SSD1309 OLED I2C LCDs + + #define U8G_CLASS U8GLIB_SSD1309_128X64 + #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C + +#elif ENABLED(U8GLIB_SSD1306) + + // Generic SSD1306 OLED I2C LCD + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X_I2C_2_WIRE // 4 stripes + #else + #define U8G_CLASS U8GLIB_SSD1306_128X64_2X // 4 stripes + #endif + #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) + +#elif TFT_SCALED_DOGLCD + + // Unspecified 320x240 TFT pre-initialized by built-in bootloader + + #define U8G_CLASS U8GLIB_TFT_320X240_UPSCALE_FROM_128X64 + #if ENABLED(FSMC_GRAPHICAL_TFT) + #define U8G_PARAM FSMC_CS_PIN, FSMC_RS_PIN + #else + #define U8G_PARAM -1, -1 + #endif + +#else + + #if ENABLED(ALTERNATIVE_LCD) + #define U8G_CLASS U8GLIB_DOGM128 // 8 stripes (HW-SPI) + #else + #define U8G_CLASS U8GLIB_DOGM128_2X // 4 stripes (HW-SPI) + #endif + +#endif + +// Use HW-SPI if no other option is specified +#ifndef U8G_PARAM + #if ENABLED(FORCE_SOFT_SPI) + #define U8G_PARAM DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, DOGLCD_A0 // SW-SPI + #else + #define U8G_PARAM DOGLCD_CS, DOGLCD_A0 // HW-SPI + #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? + +extern U8G_CLASS u8g; diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp new file mode 100644 index 00000000..e6bd80c2 --- /dev/null +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -0,0 +1,168 @@ +/** + * 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 . + * + */ + +// NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the +// file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. + +#include "../../inc/MarlinConfigPre.h" + +#if !defined(U8G_HAL_LINKS) && ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(U8GLIB_ST7920) + +#include "ultralcd_st7920_u8glib_rrd_AVR.h" + +#ifndef 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 + #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 + #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 + #define ST7920_DAT(V) ((V) & 0x80) +#endif +#define ST7920_SND_BIT do{ \ + WRITE(ST7920_CLK_PIN, LOW); ST7920_DELAY_1; \ + WRITE(ST7920_DAT_PIN, ST7920_DAT(val)); ST7920_DELAY_2; \ + WRITE(ST7920_CLK_PIN, HIGH); ST7920_DELAY_3; \ + val <<= 1; }while(0) + +// Optimize this code with -O3 +#pragma GCC optimize (3) + +void ST7920_SWSPI_SND_8BIT(uint8_t val) { + ST7920_SND_BIT; // 1 + ST7920_SND_BIT; // 2 + ST7920_SND_BIT; // 3 + ST7920_SND_BIT; // 4 + ST7920_SND_BIT; // 5 + ST7920_SND_BIT; // 6 + ST7920_SND_BIT; // 7 + ST7920_SND_BIT; // 8 +} + +uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { + uint8_t i, y; + switch (msg) { + case U8G_DEV_MSG_INIT: { + OUT_WRITE(ST7920_CS_PIN, LOW); + OUT_WRITE(ST7920_DAT_PIN, LOW); + OUT_WRITE(ST7920_CLK_PIN, HIGH); + + ST7920_CS(); + u8g_Delay(120); // Initial delay for boot up + ST7920_SET_CMD(); + ST7920_WRITE_BYTE(0x20); // Non-extended mode + ST7920_WRITE_BYTE(0x08); // Display off, cursor+blink off + ST7920_WRITE_BYTE(0x01); // Clear DDRAM ram + u8g_Delay(15); // Delay for DDRAM clear + ST7920_WRITE_BYTE(0x24); // Extended mode + ST7920_WRITE_BYTE(0x26); // Extended mode + GDRAM active + for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { // Clear GDRAM + ST7920_WRITE_BYTE(0x80 | y); // Set y + ST7920_WRITE_BYTE(0x80); // Set x = 0 + ST7920_SET_DAT(); + for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) // 2x width clears both segments + ST7920_WRITE_BYTE(0); + ST7920_SET_CMD(); + } + ST7920_WRITE_BYTE(0x0C); // Display on, cursor+blink off + ST7920_NCS(); + } + break; + + case U8G_DEV_MSG_STOP: break; + + case U8G_DEV_MSG_PAGE_NEXT: { + uint8_t* ptr; + u8g_pb_t* pb = (u8g_pb_t*)(dev->dev_mem); + y = pb->p.page_y0; + ptr = (uint8_t*)pb->buf; + + ST7920_CS(); + for (i = 0; i < PAGE_HEIGHT; i ++) { + ST7920_SET_CMD(); + if (y < 32) { + ST7920_WRITE_BYTE(0x80 | y); // y + ST7920_WRITE_BYTE(0x80); // x = 0 + } + else { + ST7920_WRITE_BYTE(0x80 | (y - 32)); // y + ST7920_WRITE_BYTE(0x80 | 8); // x = 64 + } + ST7920_SET_DAT(); + ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); // ptr incremented inside of macro! + y++; + } + ST7920_NCS(); + } + break; + } + #if PAGE_HEIGHT == 8 + return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); + #elif PAGE_HEIGHT == 16 + return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg); + #else + return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); + #endif +} + +uint8_t u8g_dev_st7920_128x64_rrd_buf[(LCD_PIXEL_WIDTH) * (PAGE_HEIGHT) / 8] U8G_NOCOMMON; +u8g_pb_t u8g_dev_st7920_128x64_rrd_pb = { { PAGE_HEIGHT, LCD_PIXEL_HEIGHT, 0, 0, 0 }, LCD_PIXEL_WIDTH, u8g_dev_st7920_128x64_rrd_buf }; +u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8g_dev_st7920_128x64_rrd_pb, &u8g_com_null_fn }; + +#pragma GCC reset_options + +#if ENABLED(LIGHTWEIGHT_UI) + #include "../../HAL/shared/HAL_ST7920.h" + void ST7920_cs() { ST7920_CS(); } + void ST7920_ncs() { ST7920_NCS(); } + void ST7920_set_cmd() { ST7920_SET_CMD(); } + void ST7920_set_dat() { ST7920_SET_DAT(); } + void ST7920_write_byte(const uint8_t val) { ST7920_WRITE_BYTE(val); } +#endif + +#endif // U8GLIB_ST7920 +#endif // !U8G_HAL_LINKS && (__AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32) diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h new file mode 100644 index 00000000..70be70ea --- /dev/null +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.h @@ -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 . + * + */ +#pragma once + +// NOTE - the HAL version of the rrd device uses a generic ST7920 device. See the +// file u8g_dev_st7920_128x64_HAL.cpp for the HAL version. + +#include "../../inc/MarlinConfig.h" +#include "../../HAL/shared/Delay.h" + +#define ST7920_CLK_PIN LCD_PINS_D4 +#define ST7920_DAT_PIN LCD_PINS_ENABLE +#define ST7920_CS_PIN LCD_PINS_RS + +//#define PAGE_HEIGHT 8 // 128 byte framebuffer +#define PAGE_HEIGHT 16 // 256 byte framebuffer +//#define PAGE_HEIGHT 32 // 512 byte framebuffer + +#include + +// If you want you can define your own set of delays in Configuration.h +//#define ST7920_DELAY_1 DELAY_NS(0) +//#define ST7920_DELAY_2 DELAY_NS(0) +//#define ST7920_DELAY_3 DELAY_NS(0) + +#if F_CPU >= 20000000 + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(50) +#elif MB(3DRAG, K8200, K8400) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(188) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(MINIRAMBO, EINSY_RAMBO, EINSY_RETRO, SILVER_GATE) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(250) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(RAMBO) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(0) +#elif MB(BQ_ZUM_MEGA_3D) + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(189) +#elif defined(ARDUINO_ARCH_STM32) + #define CPU_ST7920_DELAY_1 DELAY_NS(300) + #define CPU_ST7920_DELAY_2 DELAY_NS(40) + #define CPU_ST7920_DELAY_3 DELAY_NS(340) +#elif F_CPU == 16000000 + #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_2 DELAY_NS(0) + #define CPU_ST7920_DELAY_3 DELAY_NS(63) +#else + #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" +#endif + +void ST7920_SWSPI_SND_8BIT(uint8_t val); + +#if DOGM_SPI_DELAY_US > 0 + #define U8G_DELAY() DELAY_US(DOGM_SPI_DELAY_US) +#else + #define U8G_DELAY() DELAY_US(10) +#endif + +#define ST7920_CS() { WRITE(ST7920_CS_PIN,1); U8G_DELAY(); } +#define ST7920_NCS() { WRITE(ST7920_CS_PIN,0); } +#define ST7920_SET_CMD() { ST7920_SWSPI_SND_8BIT(0xF8); U8G_DELAY(); } +#define ST7920_SET_DAT() { ST7920_SWSPI_SND_8BIT(0xFA); U8G_DELAY(); } +#define ST7920_WRITE_BYTE(a) { ST7920_SWSPI_SND_8BIT((uint8_t)((a)&0xF0u)); ST7920_SWSPI_SND_8BIT((uint8_t)((a)<<4U)); U8G_DELAY(); } +#define ST7920_WRITE_BYTES(p,l) { for (uint8_t i = l + 1; --i;) { ST7920_SWSPI_SND_8BIT(*p&0xF0); ST7920_SWSPI_SND_8BIT(*p<<4); p++; } U8G_DELAY(); } diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp new file mode 100644 index 00000000..7d1528be --- /dev/null +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -0,0 +1,455 @@ +/** + * 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 dwin_lcd.cpp + * @author LEO / Creality3D + * @date 2019/07/18 + * @version 2.0.1 + * @brief DWIN screen control functions + ********************************************************************************/ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(DWIN_CREALITY_LCD) + +#include "../../inc/MarlinConfig.h" + +#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 }; +uint8_t DWIN_BufTail[4] = { 0xCC, 0x33, 0xC3, 0x3C }; +uint8_t databuf[26] = { 0 }; +uint8_t receivedType; + +int recnum = 0; + +inline void DWIN_Byte(size_t &i, const uint16_t bval) { + DWIN_SendBuf[++i] = bval; +} + +inline void DWIN_Word(size_t &i, const uint16_t wval) { + DWIN_SendBuf[++i] = wval >> 8; + DWIN_SendBuf[++i] = wval & 0xFF; +} + +inline void DWIN_Long(size_t &i, const uint32_t lval) { + DWIN_SendBuf[++i] = (lval >> 24) & 0xFF; + DWIN_SendBuf[++i] = (lval >> 16) & 0xFF; + DWIN_SendBuf[++i] = (lval >> 8) & 0xFF; + DWIN_SendBuf[++i] = lval & 0xFF; +} + +inline void DWIN_String(size_t &i, char * const string) { + const size_t len = _MIN(sizeof(DWIN_SendBuf) - i, strlen(string)); + memcpy(&DWIN_SendBuf[i+1], string, len); + i += 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]); delayMicroseconds(1); } + LOOP_L_N(n, 4) { MYSERIAL1.write(DWIN_BufTail[n]); delayMicroseconds(1); } +} + +/*-------------------------------------- System variable function --------------------------------------*/ + +// Handshake (1: Success, 0: Fail) +bool DWIN_Handshake(void) { + size_t i = 0; + DWIN_Byte(i, 0x00); + DWIN_Send(i); + + while (MYSERIAL1.available() > 0 && recnum < (signed)sizeof(databuf)) { + databuf[recnum] = MYSERIAL1.read(); + // ignore the invalid data + if (databuf[0] != FHONE) { // prevent the program from running. + if (recnum > 0) { + recnum = 0; + ZERO(databuf); + } + continue; + } + delay(10); + recnum++; + } + + return ( recnum >= 3 + && databuf[0] == FHONE + && databuf[1] == '\0' + && databuf[2] == 'O' + && databuf[3] == 'K' ); +} + +// Set the backlight luminance +// luminance: (0x00-0xFF) +void DWIN_Backlight_SetLuminance(const uint8_t luminance) { + size_t i = 0; + DWIN_Byte(i, 0x30); + DWIN_Byte(i, _MAX(luminance, 0x1F)); + DWIN_Send(i); +} + +// 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); + DWIN_Byte(i, 0x5A); + DWIN_Byte(i, 0xA5); + DWIN_Byte(i, dir); + DWIN_Send(i); +} + +// Update display +void DWIN_UpdateLCD(void) { + size_t i = 0; + DWIN_Byte(i, 0x3D); + DWIN_Send(i); +} + +/*---------------------------------------- Drawing functions ----------------------------------------*/ + +// Clear screen +// color: Clear screen color +void DWIN_Frame_Clear(const uint16_t color) { + size_t i = 0; + DWIN_Byte(i, 0x01); + DWIN_Word(i, color); + DWIN_Send(i); +} + +// Draw a point +// width: point width 0x01-0x0F +// height: point height 0x01-0x0F +// x,y: upper left point +void DWIN_Draw_Point(uint8_t width, uint8_t height, uint16_t x, uint16_t y) { + size_t i = 0; + DWIN_Byte(i, 0x02); + DWIN_Byte(i, width); + DWIN_Byte(i, height); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_Send(i); +} + +// 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); + DWIN_Word(i, color); + DWIN_Word(i, xStart); + DWIN_Word(i, yStart); + DWIN_Word(i, xEnd); + DWIN_Word(i, yEnd); + DWIN_Send(i); +} + +// 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; + DWIN_Byte(i, 0x05); + DWIN_Byte(i, mode); + DWIN_Word(i, color); + DWIN_Word(i, xStart); + DWIN_Word(i, yStart); + DWIN_Word(i, xEnd); + DWIN_Word(i, yEnd); + DWIN_Send(i); +} + +// 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; + DWIN_Byte(i, 0x09); + DWIN_Byte(i, (mode << 7) | dir); + DWIN_Word(i, dis); + DWIN_Word(i, color); + DWIN_Word(i, xStart); + DWIN_Word(i, yStart); + DWIN_Word(i, xEnd); + DWIN_Word(i, yEnd); + DWIN_Send(i); +} + +/*---------------------------------------- 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); + // Bit 7: widthAdjust + // Bit 6: bShow + // Bit 5-4: Unused (0) + // Bit 3-0: size + 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); + // Bit 7: bshow + // Bit 6: 1 = signed; 0 = unsigned number; + // Bit 5: zeroFill + // Bit 4: zeroMode + // Bit 3-0: size + DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); + DWIN_Word(i, color); + DWIN_Word(i, bColor); + DWIN_Byte(i, iNum); + DWIN_Byte(i, 0); // fNum + DWIN_Word(i, x); + DWIN_Word(i, y); + #if 0 + for (char count = 0; count < 8; count++) { + DWIN_Byte(i, value); + value >>= 8; + if (!(value & 0xFF)) break; + } + #else + // Write a big-endian 64 bit integer + const size_t p = i + 1; + for (char count = 8; count--;) { // 7..0 + ++i; + DWIN_SendBuf[p + count] = value; + value >>= 8; + } + #endif + + DWIN_Send(i); +} + +// 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) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); + DWIN_Word(i, color); + DWIN_Word(i, bColor); + DWIN_Byte(i, iNum); + DWIN_Byte(i, fNum); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_Long(i, value); + /* + DWIN_Byte(i, fvalue[3]); + DWIN_Byte(i, fvalue[2]); + DWIN_Byte(i, fvalue[1]); + DWIN_Byte(i, fvalue[0]); + */ + DWIN_Send(i); +} + +/*---------------------------------------- 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 +} + +// 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 + size_t i = 0; + DWIN_Byte(i, 0x23); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_Byte(i, 0x80 | libID); + DWIN_Byte(i, picID); + DWIN_Send(i); +} + +// 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); + DWIN_Byte(i, n); + DWIN_Byte(i, id); + DWIN_Send(i); +} + +// 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; + DWIN_Byte(i, 0x27); + DWIN_Byte(i, 0x80 | cacheID); + DWIN_Word(i, xStart); + DWIN_Word(i, yStart); + DWIN_Word(i, xEnd); + DWIN_Word(i, yEnd); + DWIN_Word(i, x); + DWIN_Word(i, y); + DWIN_Send(i); +} + +// Animate a series of icons +// animID: Animation ID; 0x00-0x0F +// animate: true on; false off; +// libID: Icon library ID +// picIDs: Icon starting ID +// picIDe: Icon ending ID +// x/y: Upper-left point +// interval: Display time interval, unit 10mS +void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval) { + NOMORE(x, DWIN_WIDTH - 1); + NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl + size_t i = 0; + DWIN_Byte(i, 0x28); + DWIN_Word(i, x); + DWIN_Word(i, y); + // Bit 7: animation on or off + // Bit 6: start from begin or end + // Bit 5-4: unused (0) + // Bit 3-0: animID + DWIN_Byte(i, (animate * 0x80) | 0x40 | animID); + DWIN_Byte(i, libID); + DWIN_Byte(i, picIDs); + DWIN_Byte(i, picIDe); + DWIN_Byte(i, interval); + DWIN_Send(i); +} + +// Animation Control +// state: 16 bits, each bit is the state of an animation id +void DWIN_ICON_AnimationControl(uint16_t state) { + size_t i = 0; + DWIN_Byte(i, 0x28); + DWIN_Word(i, state); + DWIN_Send(i); +} + +/*---------------------------------------- Memory functions ----------------------------------------*/ +// The LCD has an additional 32KB SRAM and 16KB Flash + +// Data can be written to the sram and save to one of the jpeg page files + +// Write Data Memory +// command 0x31 +// Type: Write memory selection; 0x5A=SRAM; 0xA5=Flash +// Address: Write data memory address; 0x000-0x7FFF for SRAM; 0x000-0x3FFF for Flash +// Data: data +// +// Flash writing returns 0xA5 0x4F 0x4B + +// Read Data Memory +// command 0x32 +// Type: Read memory selection; 0x5A=SRAM; 0xA5=Flash +// Address: Read data memory address; 0x000-0x7FFF for SRAM; 0x000-0x3FFF for Flash +// Length: leangth of data to read; 0x01-0xF0 +// +// Response: +// Type, Address, Length, Data + +// Write Picture Memory +// Write the contents of the 32KB SRAM data memory into the designated image memory space +// Issued: 0x5A, 0xA5, PIC_ID +// Response: 0xA5 0x4F 0x4B +// +// command 0x33 +// 0x5A, 0xA5 +// PicId: Picture Memory location, 0x00-0x0F +// +// Flash writing returns 0xA5 0x4F 0x4B + +#endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/dwin_lcd.h b/Marlin/src/lcd/dwin/dwin_lcd.h new file mode 100644 index 00000000..9ae6d076 --- /dev/null +++ b/Marlin/src/lcd/dwin/dwin_lcd.h @@ -0,0 +1,213 @@ +/** + * 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 + +/******************************************************************************** + * @file dwin_lcd.h + * @author LEO / Creality3D + * @date 2019/07/18 + * @version 2.0.1 + * @brief 迪文屏控制操作函数 + ********************************************************************************/ + +#include + +#define RECEIVED_NO_DATA 0x00 +#define RECEIVED_SHAKE_HAND_ACK 0x01 + +#define FHONE 0xAA + +#define DWIN_SCROLL_UP 2 +#define DWIN_SCROLL_DOWN 3 + +#define DWIN_WIDTH 272 +#define DWIN_HEIGHT 480 + +/*-------------------------------------- System variable function --------------------------------------*/ + +// Handshake (1: Success, 0: Fail) +bool DWIN_Handshake(void); + +// Common DWIN startup +void DWIN_Startup(void); + +// Set the backlight luminance +// luminance: (0x00-0xFF) +void DWIN_Backlight_SetLuminance(const uint8_t luminance); + +// 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); + +/*---------------------------------------- Drawing functions ----------------------------------------*/ + +// Clear screen +// color: Clear screen color +void DWIN_Frame_Clear(const uint16_t color); + +// Draw a point +// width: point width 0x01-0x0F +// height: point height 0x01-0x0F +// x,y: upper left point +void DWIN_Draw_Point(uint8_t width, uint8_t height, uint16_t x, uint16_t 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); + +// 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); + +// 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); + +/*---------------------------------------- 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); + +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); + +// 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); + +/*---------------------------------------- Picture related functions ----------------------------------------*/ + +// Draw JPG and cached in #0 virtual display area +// id: Picture ID +void DWIN_JPG_ShowAndCache(const uint8_t id); + +// 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); + +// 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); + +// 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); } + +// 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); + +// Animate a series of icons +// animID: Animation ID up to 16 +// animate: animation on or off +// libID: Icon library ID +// picIDs: Icon starting ID +// picIDe: Icon ending ID +// x/y: Upper-left point +// interval: Display time interval, unit 10mS +void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, + uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval); + +// Animation Control +// state: 16 bits, each bit is the state of an animation id +void DWIN_ICON_AnimationControl(uint16_t state); diff --git a/Marlin/src/lcd/dwin/e3v2/README.md b/Marlin/src/lcd/dwin/e3v2/README.md new file mode 100644 index 00000000..10b05455 --- /dev/null +++ b/Marlin/src/lcd/dwin/e3v2/README.md @@ -0,0 +1,7 @@ +# DWIN for Creality Ender 3 v2 + +Marlin's Ender 3 v2 support requires the `DWIN_SET` included with the Ender 3 V2 [example configuration](https://github.com/MarlinFirmware/Configurations/tree/bugfix-2.0.x/config/examples/Creality/Ender-3%20V2). + +## Easy Install + +Copy the `DWIN_SET` folder onto a Micro-SD card and insert the card into the slot on the DWIN screen. Cycle the machine and wait for the screen to go from blue to orange. Turn the machine off and remove the SD card. When you turn on the machine the screen will display a "Creality" loading screen. diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp new file mode 100644 index 00000000..28087497 --- /dev/null +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -0,0 +1,3702 @@ +/** + * 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 . + * + */ + +/** + * DWIN by Creality3D + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(DWIN_CREALITY_LCD) + +#include "dwin.h" + +#if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) && DISABLED(PROBE_MANUALLY) + #define HAS_ONESTEP_LEVELING 1 +#endif + +#if ANY(BABYSTEPPING, HAS_BED_PROBE, HAS_WORKSPACE_OFFSET) + #define HAS_ZOFFSET_ITEM 1 +#endif + +#if !HAS_BED_PROBE && ENABLED(BABYSTEPPING) + #define JUST_BABYSTEP 1 +#endif + +#include +#include +#include + +#include "../../fontutils.h" +#include "../../ultralcd.h" + +#include "../../../sd/cardreader.h" + +#include "../../../MarlinCore.h" +#include "../../../core/serial.h" +#include "../../../core/macros.h" +#include "../../../gcode/queue.h" + +#include "../../../module/temperature.h" +#include "../../../module/printcounter.h" +#include "../../../module/motion.h" +#include "../../../module/planner.h" + +#if ENABLED(EEPROM_SETTINGS) + #include "../../../module/settings.h" +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "../../../feature/host_actions.h" +#endif + +#if HAS_ONESTEP_LEVELING + #include "../../../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_BED_PROBE + #include "../../../module/probe.h" +#endif + +#if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + #include "../../../feature/babystep.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../feature/powerloss.h" +#endif + +#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 + +#define USE_STRING_HEADINGS + +#define DWIN_FONT_MENU font8x16 +#define DWIN_FONT_STAT font10x20 +#define DWIN_FONT_HEAD font10x20 + +#define MENU_CHAR_LIMIT 24 +#define STATUS_Y 360 + +// 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_MAXJERK 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 + MLINE * (L)) + +#define BABY_Z_VAR TERN(HAS_BED_PROBE, probe.offset.z, dwin_zoffset) + +/* Value Init */ +HMI_value_t HMI_ValueStruct; +HMI_Flag_t HMI_flag{0}; + +millis_t dwin_heat_time = 0; + +uint8_t checkkey = 0; + +typedef struct { + uint8_t now, last; + void set(uint8_t v) { now = last = v; } + void reset() { set(0); } + bool changed() { bool c = (now != last); if (c) last = now; return c; } + bool dec() { if (now) now--; return changed(); } + bool inc(uint8_t v) { if (now < (v - 1)) now++; else now = (v - 1); return changed(); } +} 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_jerk{0} + , select_step{0} + ; + +uint8_t index_file = MROWS, + index_prepare = MROWS, + index_control = MROWS, + index_leveling = MROWS, + index_tune = MROWS; + +bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home + +constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; +constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; +constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; +constexpr float default_axis_steps_per_unit[] = DEFAULT_AXIS_STEPS_PER_UNIT; + +uint8_t Percentrecord = 0; +uint16_t remain_time = 0; + +#if ENABLED(PAUSE_HEAT) + #if HAS_HOTEND + uint16_t temphot = 0; + #endif + #if HAS_HEATED_BED + uint16_t tempbed = 0; + #endif +#endif + +#if HAS_ZOFFSET_ITEM + float dwin_zoffset = 0, last_zoffset = 0; +#endif + +#define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) + // BL24CXX::check() uses 0x00 + +inline bool HMI_IsChinese() { return HMI_flag.language == DWIN_CHINESE; } + +void HMI_SetLanguageCache() { + DWIN_JPG_CacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English); +} + +void HMI_SetLanguage() { + #if ENABLED(EEPROM_SETTINGS) + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); + #endif + HMI_SetLanguageCache(); +} + +void HMI_ToggleLanguage() { + HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; + HMI_SetLanguageCache(); + #if ENABLED(EEPROM_SETTINGS) + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); + #endif +} + +void DWIN_Draw_Signed_Float(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, Color_White, bColor, x - 6, y, F("-")); + DWIN_Draw_FloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, -value); + } + else { + DWIN_Draw_String(false, true, size, Color_White, bColor, x - 6, y, F(" ")); + DWIN_Draw_FloatValue(true, true, 0, size, Color_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_Draw_Rectangle(0, Color_White, 17, 130, 126, 229); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 58, 201); + else + DWIN_Frame_AreaCopy(1, 1, 451, 31, 463, 57, 201); + } + else { + DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 58, 201); + else + DWIN_Frame_AreaCopy(1, 1, 423, 31, 435, 57, 201); + } +} + +void ICON_Prepare() { + if (select_page.now == 1) { + DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); + DWIN_Draw_Rectangle(0, Color_White, 145, 130, 254, 229); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 31, 447, 58, 460, 186, 201); + else + DWIN_Frame_AreaCopy(1, 33, 451, 82, 466, 175, 201); + } + else { + DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 31, 405, 58, 420, 186, 201); + else + DWIN_Frame_AreaCopy(1, 33, 423, 82, 438, 175, 201); + } +} + +void ICON_Control() { + if (select_page.now == 2) { + DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); + DWIN_Draw_Rectangle(0, Color_White, 17, 246, 126, 345); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 61, 447, 88, 460, 58, 318); + else + DWIN_Frame_AreaCopy(1, 85, 451, 132, 463, 48, 318); + } + else { + DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 61, 405, 88, 420, 58, 318); + else + DWIN_Frame_AreaCopy(1, 85, 423, 132, 434, 48, 318); + } +} + +void ICON_StartInfo(bool show) { + if (show) { + DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); + DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 91, 447, 118, 460, 186, 318); + else + DWIN_Frame_AreaCopy(1, 132, 451, 159, 466, 186, 318); + } + else { + DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 91, 405, 118, 420, 186, 318); + else + DWIN_Frame_AreaCopy(1, 132, 423, 159, 435, 186, 318); + } +} + +void ICON_Leveling(bool show) { + if (show) { + DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); + DWIN_Draw_Rectangle(0, Color_White, 145, 246, 254, 345); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 211, 447, 238, 460, 186, 318); + else + DWIN_Frame_AreaCopy(1, 84, 437, 120, 449, 182, 318); + } + else { + DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 211, 405, 238, 420, 186, 318); + else + DWIN_Frame_AreaCopy(1, 84, 465, 120, 478, 182, 318); + } +} + +void ICON_Tune() { + if (select_print.now == 0) { + DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); + DWIN_Draw_Rectangle(0, Color_White, 8, 252, 87, 351); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 121, 447, 148, 458, 34, 325); + else + DWIN_Frame_AreaCopy(1, 0, 466, 34, 476, 31, 325); + } + else { + DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 121, 405, 148, 420, 34, 325); + else + DWIN_Frame_AreaCopy(1, 0, 438, 32, 448, 31, 325); + } +} + +void ICON_Pause() { + if (select_print.now == 1) { + DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); + DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 181, 447, 208, 459, 124, 325); + else + DWIN_Frame_AreaCopy(1, 177, 451, 216, 462, 116, 325); + } + else { + DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 181, 405, 208, 420, 124, 325); + else + DWIN_Frame_AreaCopy(1, 177, 423, 215, 433, 116, 325); + } +} + +void ICON_Continue() { + if (select_print.now == 1) { + DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); + DWIN_Draw_Rectangle(0, Color_White, 96, 252, 175, 351); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 1, 447, 28, 460, 124, 325); + else + DWIN_Frame_AreaCopy(1, 1, 452, 32, 464, 121, 325); + } + else { + DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 1, 405, 28, 420, 124, 325); + else + DWIN_Frame_AreaCopy(1, 1, 424, 31, 434, 121, 325); + } +} + +void ICON_Stop() { + if (select_print.now == 2) { + DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); + DWIN_Draw_Rectangle(0, Color_White, 184, 252, 263, 351); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 151, 447, 178, 459, 210, 325); + else + DWIN_Frame_AreaCopy(1, 218, 452, 249, 466, 209, 325); + } + else { + DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 151, 405, 178, 420, 210, 325); + else + DWIN_Frame_AreaCopy(1, 218, 423, 247, 436, 209, 325); + } +} + +inline void Clear_Title_Bar() { + DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, 0, DWIN_WIDTH, 30); +} + +inline void Draw_Title(const char * const title) { + DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); +} + +inline void Draw_Title(const __FlashStringHelper * title) { + DWIN_Draw_String(false, false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, (char*)title); +} + +inline void Clear_Menu_Area() { + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); +} + +inline void Clear_Main_Window() { + Clear_Title_Bar(); + Clear_Menu_Area(); +} + +inline void Clear_Popup_Area() { + Clear_Title_Bar(); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); +} + +void Draw_Popup_Bkgd_105() { + DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 105, 258, 374); +} + +inline void Draw_More_Icon(const uint8_t line) { + DWIN_ICON_Show(ICON, ICON_More, 226, MBASE(line) - 3); +} + +inline void Draw_Menu_Cursor(const uint8_t line) { + // DWIN_ICON_Show(ICON,ICON_Rectangle, 0, MBASE(line) - 18); + DWIN_Draw_Rectangle(1, Rectangle_Color, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); +} + +inline void Erase_Menu_Cursor(const uint8_t line) { + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); +} + +inline void Move_Highlight(const int16_t from, const uint16_t newline) { + Erase_Menu_Cursor(newline - from); + Draw_Menu_Cursor(newline); +} + +inline void Add_Menu_Line() { + Move_Highlight(1, MROWS); + DWIN_Draw_Line(Line_Color, 16, MBASE(MROWS + 1) - 20, 256, MBASE(MROWS + 1) - 19); +} + +inline void Scroll_Menu(const uint8_t dir) { + DWIN_Frame_AreaMove(1, dir, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); + switch (dir) { + case DWIN_SCROLL_DOWN: Move_Highlight(-1, 0); break; + case DWIN_SCROLL_UP: Add_Menu_Line(); break; + } +} + +inline uint16_t nr_sd_menu_items() { + return card.get_num_Files() + !card.flag.workDirIsRoot; +} + +inline void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { + DWIN_ICON_Show(ICON, icon, 26, MBASE(line) - 3); +} + +inline void Erase_Menu_Text(const uint8_t line) { + DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); +} + +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, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); + if (icon) Draw_Menu_Icon(line, icon); + DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); +} + +// The "Back" label is always on the first line +inline void Draw_Back_Label() { + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 129, 72, 156, 84, LBLX, MBASE(0)); + else + DWIN_Frame_AreaCopy(1, 226, 179, 256, 189, LBLX, MBASE(0)); +} + +// Draw "Back" line at the top +inline void Draw_Back_First(const bool is_sel=true) { + Draw_Menu_Line(0, ICON_Back); + Draw_Back_Label(); + if (is_sel) Draw_Menu_Cursor(0); +} + +inline bool Apply_Encoder(const ENCODER_DiffState &encoder_diffState, auto &valref) { + if (encoder_diffState == ENCODER_DIFF_CW) + valref += EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_CCW) + valref -= EncoderRate.encoderMoveValue; + else if (encoder_diffState == ENCODER_DIFF_ENTER) + return true; + return false; +} + +// +// Draw Menus +// + +#define MOTION_CASE_RATE 1 +#define MOTION_CASE_ACCEL 2 +#define MOTION_CASE_JERK (MOTION_CASE_ACCEL + ENABLED(HAS_CLASSIC_JERK)) +#define MOTION_CASE_STEPS (MOTION_CASE_JERK + 1) +#define MOTION_CASE_TOTAL MOTION_CASE_STEPS + +#define PREPARE_CASE_MOVE 1 +#define PREPARE_CASE_DISA 2 +#define PREPARE_CASE_HOME 3 +#define PREPARE_CASE_ZOFF (PREPARE_CASE_HOME + ENABLED(HAS_ZOFFSET_ITEM)) +#define PREPARE_CASE_PLA (PREPARE_CASE_ZOFF + ENABLED(HAS_HOTEND)) +#define PREPARE_CASE_ABS (PREPARE_CASE_PLA + ENABLED(HAS_HOTEND)) +#define PREPARE_CASE_COOL (PREPARE_CASE_ABS + EITHER(HAS_HOTEND, HAS_HEATED_BED)) +#define PREPARE_CASE_LANG (PREPARE_CASE_COOL + 1) +#define PREPARE_CASE_TOTAL PREPARE_CASE_LANG + +#define CONTROL_CASE_TEMP 1 +#define CONTROL_CASE_MOVE (CONTROL_CASE_TEMP + 1) +#define CONTROL_CASE_SAVE (CONTROL_CASE_MOVE + ENABLED(EEPROM_SETTINGS)) +#define CONTROL_CASE_LOAD (CONTROL_CASE_SAVE + ENABLED(EEPROM_SETTINGS)) +#define CONTROL_CASE_RESET (CONTROL_CASE_LOAD + ENABLED(EEPROM_SETTINGS)) +#define CONTROL_CASE_INFO (CONTROL_CASE_RESET + 1) +#define CONTROL_CASE_TOTAL CONTROL_CASE_INFO + +#define TUNE_CASE_SPEED 1 +#define TUNE_CASE_TEMP (TUNE_CASE_SPEED + ENABLED(HAS_HOTEND)) +#define TUNE_CASE_BED (TUNE_CASE_TEMP + ENABLED(HAS_HEATED_BED)) +#define TUNE_CASE_FAN (TUNE_CASE_BED + ENABLED(HAS_FAN)) +#define TUNE_CASE_ZOFF (TUNE_CASE_FAN + ENABLED(HAS_ZOFFSET_ITEM)) +#define TUNE_CASE_TOTAL TUNE_CASE_ZOFF + +#define TEMP_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_BED (TEMP_CASE_TEMP + ENABLED(HAS_HEATED_BED)) +#define TEMP_CASE_FAN (TEMP_CASE_BED + ENABLED(HAS_FAN)) +#define TEMP_CASE_PLA (TEMP_CASE_FAN + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_ABS (TEMP_CASE_PLA + ENABLED(HAS_HOTEND)) +#define TEMP_CASE_TOTAL TEMP_CASE_ABS + +#define PREHEAT_CASE_TEMP (0 + ENABLED(HAS_HOTEND)) +#define PREHEAT_CASE_BED (PREHEAT_CASE_TEMP + ENABLED(HAS_HEATED_BED)) +#define PREHEAT_CASE_FAN (PREHEAT_CASE_BED + ENABLED(HAS_FAN)) +#define PREHEAT_CASE_SAVE (PREHEAT_CASE_FAN + ENABLED(EEPROM_SETTINGS)) +#define PREHEAT_CASE_TOTAL PREHEAT_CASE_SAVE + +// +// Draw Menus +// + +inline void draw_move_en(const uint16_t line) { + DWIN_Frame_AreaCopy(1, 69, 61, 102, 71, LBLX, line); // "Move" +} + +inline void DWIN_Frame_TitleCopy(uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { DWIN_Frame_AreaCopy(id, x1, y1, x2, y2, 14, 8); } + +inline void Item_Prepare_Move(const uint8_t row) { + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 159, 70, 200, 84, LBLX, MBASE(row)); + else + draw_move_en(MBASE(row)); // "Move >" + Draw_Menu_Line(row, ICON_Axis); + Draw_More_Icon(row); +} + +inline void Item_Prepare_Disable(const uint8_t row) { + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 204, 70, 259, 82, LBLX, MBASE(row)); + else + DWIN_Frame_AreaCopy(1, 103, 59, 200, 74, LBLX, MBASE(row)); // "Disable Stepper" + Draw_Menu_Line(row, ICON_CloseMotor); +} + +inline void Item_Prepare_Home(const uint8_t row) { + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 0, 89, 41, 101, LBLX, MBASE(row)); + else + DWIN_Frame_AreaCopy(1, 202, 61, 271, 71, LBLX, MBASE(row)); // "Auto Home" + Draw_Menu_Line(row, ICON_Homing); +} + +#if HAS_ZOFFSET_ITEM + + inline void Item_Prepare_Offset(const uint8_t row) { + if (HMI_IsChinese()) { + #if HAS_BED_PROBE + DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(row)); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + #else + DWIN_Frame_AreaCopy(1, 43, 89, 98, 101, LBLX, MBASE(row)); + #endif + } + else { + #if HAS_BED_PROBE + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(row)); // "Z-Offset" + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(row), BABY_Z_VAR * 100); + #else + DWIN_Frame_AreaCopy(1, 1, 76, 106, 86, LBLX, MBASE(row)); // "..." + #endif + } + Draw_Menu_Line(row, ICON_SetHome); + } + +#endif + +#if HAS_HOTEND + inline void Item_Prepare_PLA(const uint8_t row) { + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 100, 89, 151, 101, LBLX, MBASE(row)); + } + else { + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(row)); // "PLA" + } + Draw_Menu_Line(row, ICON_PLAPreheat); + } + + inline void Item_Prepare_ABS(const uint8_t row) { + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 180, 89, 233, 100, LBLX, MBASE(row)); + } + else { + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(row)); // "Preheat" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(row)); // "ABS" + } + Draw_Menu_Line(row, ICON_ABSPreheat); + } +#endif + +#if HAS_PREHEAT + inline void Item_Prepare_Cool(const uint8_t row) { + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 1, 104, 56, 117, LBLX, MBASE(row)); + else + DWIN_Frame_AreaCopy(1, 200, 76, 264, 86, LBLX, MBASE(row)); // "Cooldown" + Draw_Menu_Line(row, ICON_Cool); + } +#endif + +inline void Item_Prepare_Lang(const uint8_t row) { + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 239, 134, 266, 146, LBLX, MBASE(row)); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("CN")); + } + else { + DWIN_Frame_AreaCopy(1, 0, 194, 121, 207, LBLX, MBASE(row)); // "Language selection" + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 226, MBASE(row), F("EN")); + } + Draw_Menu_Icon(row, ICON_Language); +} + +inline void Draw_Prepare_Menu() { + Clear_Main_Window(); + + 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_IsChinese()) { + DWIN_Frame_TitleCopy(1, 133, 1, 160, 13); // "Prepare" + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_PREPARE)); + #else + DWIN_Frame_TitleCopy(1, 178, 2, 229, 14); // "Prepare" + #endif + } + + if (PVISI(0)) Draw_Back_First(select_prepare.now == 0); // < Back + if (PVISI(PREPARE_CASE_MOVE)) Item_Prepare_Move(PSCROL(PREPARE_CASE_MOVE)); // Move > + if (PVISI(PREPARE_CASE_DISA)) Item_Prepare_Disable(PSCROL(PREPARE_CASE_DISA)); // Disable Stepper + if (PVISI(PREPARE_CASE_HOME)) Item_Prepare_Home(PSCROL(PREPARE_CASE_HOME)); // Auto Home + #if HAS_ZOFFSET_ITEM + if (PVISI(PREPARE_CASE_ZOFF)) Item_Prepare_Offset(PSCROL(PREPARE_CASE_ZOFF)); // Edit Z-Offset / Babystep / Set Home Offset + #endif + #if HAS_HOTEND + if (PVISI(PREPARE_CASE_PLA)) Item_Prepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA + if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS + #endif + #if HAS_PREHEAT + if (PVISI(PREPARE_CASE_COOL)) Item_Prepare_Cool(PSCROL(PREPARE_CASE_COOL)); // Cooldown + #endif + if (PVISI(PREPARE_CASE_LANG)) Item_Prepare_Lang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN + + if (select_prepare.now) Draw_Menu_Cursor(PSCROL(select_prepare.now)); +} + +inline void Draw_Control_Menu() { + Clear_Main_Window(); + + #if CONTROL_CASE_TOTAL >= 6 + const int16_t scroll = MROWS - index_control; // Scrolled-up lines + #define CSCROL(L) (scroll + (L)) + #else + #define CSCROL(L) (L) + #endif + #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 (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 103, 1, 130, 14); // "Control" + + DWIN_Frame_AreaCopy(1, 57, 104, 84, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > + DWIN_Frame_AreaCopy(1, 87, 104, 114, 116, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > + + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 117, 104, 172, 116, LBLX, CLINE(CONTROL_CASE_SAVE)); // Store Configuration + DWIN_Frame_AreaCopy(1, 174, 103, 229, 116, LBLX, CLINE(CONTROL_CASE_LOAD)); // Read Configuration + DWIN_Frame_AreaCopy(1, 1, 118, 56, 131, LBLX, CLINE(CONTROL_CASE_RESET)); // Reset Configuration + #endif + + if (CVISI(CONTROL_CASE_INFO)) + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, CLINE(CONTROL_CASE_TEMP)); // Info > + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_CONTROL)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_TEMP), GET_TEXT_F(MSG_TEMPERATURE)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_MOVE), GET_TEXT_F(MSG_MOTION)); + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); + #endif + if (CVISI(CONTROL_CASE_INFO)) DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(CONTROL_CASE_INFO), F("Info")); + #else + DWIN_Frame_TitleCopy(1, 128, 2, 176, 12); // "Control" + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX, CLINE(CONTROL_CASE_TEMP)); // Temperature > + DWIN_Frame_AreaCopy(1, 84, 89, 128, 99, LBLX, CLINE(CONTROL_CASE_MOVE)); // Motion > + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 148, 89, 268, 101, LBLX , CLINE(CONTROL_CASE_SAVE // "Store Configuration" + DWIN_Frame_AreaCopy(1, 26, 104, 57, 114, LBLX , CLINE(CONTROL_CASE_LOAD)); // "Read" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 34, CLINE(CONTROL_CASE_LOAD)); // "Configuration" + DWIN_Frame_AreaCopy(1, 59, 104, 93, 114, LBLX , CLINE(CONTROL_CASE_RESET)); // "Reset" + DWIN_Frame_AreaCopy(1, 182, 89, 268, 101, LBLX + 37, CLINE(CONTROL_CASE_RESET)); // "Configuration" + #endif + if (CVISI(CONTROL_CASE_INFO)) DWIN_Frame_AreaCopy(1, 0, 104, 25, 115, LBLX, CLINE(CONTROL_CASE_INFO)); // Info > + #endif + } + + if (select_control.now && CVISI(select_control.now)) + Draw_Menu_Cursor(CSCROL(select_control.now)); + + // Draw icons and lines + uint8_t i = 0; + #define _TEMP_ICON(N) do{ ++i; if (CVISI(i)) Draw_Menu_Line(CSCROL(i), ICON_Temperature + (N) - 1); }while(0) + + _TEMP_ICON(CONTROL_CASE_TEMP); + if (CVISI(i)) Draw_More_Icon(CSCROL(i)); + + _TEMP_ICON(CONTROL_CASE_MOVE); + Draw_More_Icon(CSCROL(i)); + + #if ENABLED(EEPROM_SETTINGS) + _TEMP_ICON(CONTROL_CASE_SAVE); + _TEMP_ICON(CONTROL_CASE_LOAD); + _TEMP_ICON(CONTROL_CASE_RESET); + #endif + + _TEMP_ICON(CONTROL_CASE_INFO); + if (CVISI(CONTROL_CASE_INFO)) Draw_More_Icon(CSCROL(i)); +} + +inline void Draw_Tune_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 73, 2, 100, 13, 14, 9); + DWIN_Frame_AreaCopy(1, 116, 164, 171, 176, LBLX, MBASE(TUNE_CASE_SPEED)); + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TUNE_CASE_TEMP)); + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(TUNE_CASE_BED)); + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(TUNE_CASE_FAN)); + #endif + #if HAS_ZOFFSET_ITEM + DWIN_Frame_AreaCopy(1, 174, 164, 223, 177, LBLX, MBASE(TUNE_CASE_ZOFF)); + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_TUNE)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_SPEED), GET_TEXT_F(MSG_SPEED)); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + #endif + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TUNE_CASE_ZOFF), GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + #else + DWIN_Frame_AreaCopy(1, 94, 2, 126, 12, 14, 9); + DWIN_Frame_AreaCopy(1, 1, 179, 92, 190, LBLX, MBASE(TUNE_CASE_SPEED)); // Print speed + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TUNE_CASE_TEMP)); // Hotend... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TUNE_CASE_TEMP)); // ...Temperature + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(TUNE_CASE_BED)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(TUNE_CASE_BED)); // ...Temperature + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(TUNE_CASE_FAN)); // Fan speed + #endif + #if HAS_ZOFFSET_ITEM + DWIN_Frame_AreaCopy(1, 93, 179, 141, 189, LBLX, MBASE(TUNE_CASE_ZOFF)); // Z-offset + #endif + #endif + } + + Draw_Back_First(select_tune.now == 0); + if (select_tune.now) Draw_Menu_Cursor(select_tune.now); + + Draw_Menu_Line(TUNE_CASE_SPEED, ICON_Speed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_SPEED), feedrate_percentage); + + #if HAS_HOTEND + Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN), thermalManager.fan_speed[0]); + #endif + #if HAS_ZOFFSET_ITEM + Draw_Menu_Line(TUNE_CASE_ZOFF, ICON_Zoffset); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(TUNE_CASE_ZOFF), BABY_Z_VAR * 100); + #endif +} + +inline void draw_max_en(const uint16_t line) { + DWIN_Frame_AreaCopy(1, 245, 119, 269, 129, LBLX, line); // "Max" +} +inline void draw_max_accel_en(const uint16_t line) { + draw_max_en(line); + DWIN_Frame_AreaCopy(1, 1, 135, 79, 145, LBLX + 27, line); // "Acceleration" +} +inline void draw_speed_en(const uint16_t inset, const uint16_t line) { + DWIN_Frame_AreaCopy(1, 184, 119, 224, 132, LBLX + inset, line); // "Speed" +} +inline void draw_jerk_en(const uint16_t line) { + DWIN_Frame_AreaCopy(1, 64, 119, 106, 129, LBLX + 27, line); // "Jerk" +} +inline void draw_steps_per_mm(const uint16_t line) { + DWIN_Frame_AreaCopy(1, 1, 151, 101, 161, LBLX, line); // "Steps-per-mm" +} +inline void say_x(const uint16_t inset, const uint16_t line) { + DWIN_Frame_AreaCopy(1, 95, 104, 102, 114, LBLX + inset, line); // "X" +} +inline void say_y(const uint16_t inset, const uint16_t line) { + DWIN_Frame_AreaCopy(1, 104, 104, 110, 114, LBLX + inset, line); // "Y" +} +inline void say_z(const uint16_t inset, const uint16_t line) { + DWIN_Frame_AreaCopy(1, 112, 104, 120, 114, LBLX + inset, line); // "Z" +} +inline void say_e(const uint16_t inset, const uint16_t line) { + DWIN_Frame_AreaCopy(1, 237, 119, 244, 129, LBLX + inset, line); // "E" +} + +inline void Draw_Motion_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Motion" + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, MBASE(MOTION_CASE_RATE)); // Max speed + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_ACCEL)); // Max... + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(MOTION_CASE_ACCEL) + 1); // ...Acceleration + #if HAS_CLASSIC_JERK + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(MOTION_CASE_JERK)); // Max... + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(MOTION_CASE_JERK) + 1); // ... + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 54, MBASE(MOTION_CASE_JERK)); // ...Jerk + #endif + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(MOTION_CASE_STEPS)); // Flow ratio + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_MOTION)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_RATE), F("Feedrate")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_ACCEL), GET_TEXT_F(MSG_ACCELERATION)); + #if HAS_CLASSIC_JERK + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_JERK), GET_TEXT_F(MSG_JERK)); + #endif + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(MOTION_CASE_STEPS), GET_TEXT_F(MSG_STEPS_PER_MM)); + #else + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Motion" + draw_max_en(MBASE(MOTION_CASE_RATE)); draw_speed_en(27, MBASE(MOTION_CASE_RATE)); // "Max Speed" + draw_max_accel_en(MBASE(MOTION_CASE_ACCEL)); // "Max Acceleration" + #if HAS_CLASSIC_JERK + draw_max_en(MBASE(MOTION_CASE_JERK)); draw_jerk_en(MBASE(MOTION_CASE_JERK)); // "Max Jerk" + #endif + draw_steps_per_mm(MBASE(MOTION_CASE_STEPS)); // "Steps-per-mm" + #endif + } + + Draw_Back_First(select_motion.now == 0); + if (select_motion.now) Draw_Menu_Cursor(select_motion.now); + + uint8_t i = 0; + #define _MOTION_ICON(N) Draw_Menu_Line(++i, ICON_MaxSpeed + (N) - 1) + _MOTION_ICON(MOTION_CASE_RATE); Draw_More_Icon(i); + _MOTION_ICON(MOTION_CASE_ACCEL); Draw_More_Icon(i); + #if HAS_CLASSIC_JERK + _MOTION_ICON(MOTION_CASE_JERK); Draw_More_Icon(i); + #endif + _MOTION_ICON(MOTION_CASE_STEPS); Draw_More_Icon(i); +} + +// +// Draw Popup Windows +// +#if HAS_HOTEND || HAS_HEATED_BED + + void DWIN_Popup_Temperature(const bool toohigh) { + Clear_Popup_Area(); + Draw_Popup_Bkgd_105(); + if (toohigh) { + DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); + DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); + DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + } + else { + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too high")); + } + } + else { + DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); + DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + } + else { + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too low")); + } + } + } + +#endif + +inline void Draw_Popup_Bkgd_60() { + DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 60, 258, 330); +} + +#if HAS_HOTEND + + void Popup_Window_ETempTooLow() { + Clear_Main_Window(); + Draw_Popup_Bkgd_60(); + DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240); + DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 102, 240); + DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); + } + else { + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, 20, 235, F("Nozzle is too cold")); + DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); + } + } + +#endif + +void Popup_Window_Resume() { + Clear_Popup_Area(); + Draw_Popup_Bkgd_105(); + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135); + DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192); + DWIN_ICON_Show(ICON, ICON_Cancel_C, 26, 307); + DWIN_ICON_Show(ICON, ICON_Continue_C, 146, 307); + } + else { + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); + DWIN_ICON_Show(ICON, ICON_Cancel_E, 26, 307); + DWIN_ICON_Show(ICON, ICON_Continue_E, 146, 307); + } +} + +void Popup_Window_Home(const bool parking/*=false*/) { + Clear_Main_Window(); + Draw_Popup_Bkgd_60(); + DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); + if (HMI_IsChinese()) { + 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, Popup_Text_Color, Color_Bg_Window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + } +} + +#if HAS_ONESTEP_LEVELING + + void Popup_Window_Leveling() { + Clear_Main_Window(); + Draw_Popup_Bkgd_60(); + DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); + if (HMI_IsChinese()) { + 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, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + } + } + +#endif + +void Draw_Select_Highlight(const bool sel) { + HMI_flag.select_flag = sel; + const uint16_t c1 = sel ? Select_Color : Color_Bg_Window, + c2 = sel ? Color_Bg_Window : Select_Color; + DWIN_Draw_Rectangle(0, c1, 25, 279, 126, 318); + DWIN_Draw_Rectangle(0, c1, 24, 278, 127, 319); + DWIN_Draw_Rectangle(0, c2, 145, 279, 246, 318); + DWIN_Draw_Rectangle(0, c2, 144, 278, 247, 319); +} + +void Popup_window_PauseOrStop() { + Clear_Main_Window(); + Draw_Popup_Bkgd_60(); + if (HMI_IsChinese()) { + 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); + DWIN_ICON_Show(ICON, ICON_Confirm_C, 26, 280); + DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); + } + else { + if (select_print.now == 1) DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == 2) DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); + DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); + DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); + } + Draw_Select_Highlight(true); +} + +void Draw_Printing_Screen() { + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 30, 1, 71, 14, 14, 9); // Tune + DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 41, 188); // Pause + DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 176, 188); // Stop + } + else { + DWIN_Frame_AreaCopy(1, 40, 2, 92, 14, 14, 9); // Tune + DWIN_Frame_AreaCopy(1, 0, 44, 96, 58, 41, 188); // Pause + DWIN_Frame_AreaCopy(1, 98, 44, 152, 58, 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, Color_Bg_Black, 2, 117, 133, Percentrecord); + DWIN_Draw_String(false, false, font8x16, Percent_Color, Color_Bg_Black, 133, 133, F("%")); +} + +void Draw_Print_ProgressElapsed() { + duration_t elapsed = print_job_timer.duration(); // print timer + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 42, 212, elapsed.value / 3600); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 58, 212, F(":")); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 66, 212, (elapsed.value % 3600) / 60); +} + +void Draw_Print_ProgressRemain() { + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 176, 212, remain_time / 3600); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, 192, 212, F(":")); + DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, 200, 212, (remain_time % 3600) / 60); +} + +void Goto_PrintProcess() { + checkkey = PrintProcess; + + Clear_Main_Window(); + Draw_Printing_Screen(); + + ICON_Tune(); + if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); + ICON_Stop(); + + // Copy into filebuf string before entry + char * const name = card.longest_filename(); + const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, npos, 60, name); + + DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 193); + DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 191); + + Draw_Print_ProgressBar(); + Draw_Print_ProgressElapsed(); + Draw_Print_ProgressRemain(); +} + +void Goto_MainMenu() { + checkkey = MainMenu; + + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_AreaCopy(1, 2, 2, 27, 14, 14, 9); // "Home" + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_MAIN)); + #else + DWIN_Frame_AreaCopy(1, 0, 2, 39, 12, 14, 9); + #endif + } + + DWIN_ICON_Show(ICON, ICON_LOGO, 71, 52); + + ICON_Print(); + ICON_Prepare(); + ICON_Control(); + TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(select_page.now == 3); +} + +inline ENCODER_DiffState get_encoder_state() { + static millis_t Encoder_ms = 0; + 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; + return state; +} + +void HMI_Move_X() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scale)) { + checkkey = AxisMove; + EncoderRate.enabled = false; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + if (!planner.is_full()) { + // Wait for planner moves to finish! + planner.synchronize(); + planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder); + } + DWIN_UpdateLCD(); + return; + } + NOLESS(HMI_ValueStruct.Move_X_scale, (X_MIN_POS) * MINUNITMULT); + NOMORE(HMI_ValueStruct.Move_X_scale, (X_MAX_POS) * MINUNITMULT); + current_position.x = HMI_ValueStruct.Move_X_scale / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_UpdateLCD(); + } +} + +void HMI_Move_Y() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scale)) { + checkkey = AxisMove; + EncoderRate.enabled = false; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + if (!planner.is_full()) { + // Wait for planner moves to finish! + planner.synchronize(); + planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_XY), active_extruder); + } + DWIN_UpdateLCD(); + return; + } + NOLESS(HMI_ValueStruct.Move_Y_scale, (Y_MIN_POS) * MINUNITMULT); + NOMORE(HMI_ValueStruct.Move_Y_scale, (Y_MAX_POS) * MINUNITMULT); + current_position.y = HMI_ValueStruct.Move_Y_scale / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_UpdateLCD(); + } +} + +void HMI_Move_Z() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scale)) { + checkkey = AxisMove; + EncoderRate.enabled = false; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + if (!planner.is_full()) { + // Wait for planner moves to finish! + planner.synchronize(); + planner.buffer_line(current_position, MMM_TO_MMS(HOMING_FEEDRATE_Z), active_extruder); + } + DWIN_UpdateLCD(); + return; + } + NOLESS(HMI_ValueStruct.Move_Z_scale, Z_MIN_POS * MINUNITMULT); + NOMORE(HMI_ValueStruct.Move_Z_scale, Z_MAX_POS * MINUNITMULT); + current_position.z = HMI_ValueStruct.Move_Z_scale / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_UpdateLCD(); + } +} + +#if HAS_HOTEND + + void HMI_Move_E() { + static float last_E_scale = 0; + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scale)) { + checkkey = AxisMove; + EncoderRate.enabled = false; + last_E_scale = HMI_ValueStruct.Move_E_scale; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_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; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + DWIN_UpdateLCD(); + } + } + +#endif + +#if HAS_ZOFFSET_ITEM + + bool printer_busy() { return planner.movesplanned() || printingIsActive(); } + + void HMI_Zoffset() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t zoff_line; + switch (HMI_ValueStruct.show_mode) { + case -4: zoff_line = PREPARE_CASE_ZOFF + MROWS - index_prepare; break; + default: zoff_line = TUNE_CASE_ZOFF + MROWS - index_tune; + } + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.offset_value)) { + EncoderRate.enabled = false; + #if HAS_BED_PROBE + probe.offset.z = dwin_zoffset; + TERN_(EEPROM_SETTINGS, settings.save()); + #endif + if (HMI_ValueStruct.show_mode == -4) { + checkkey = Prepare; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); + } + else { + checkkey = Tune; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 2, 2, 202, MBASE(zoff_line), TERN(HAS_BED_PROBE, BABY_Z_VAR * 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); + last_zoffset = dwin_zoffset; + dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f; + #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) + babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); + #endif + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(zoff_line), HMI_ValueStruct.offset_value); + DWIN_UpdateLCD(); + } + } + +#endif // HAS_ZOFFSET_ITEM + +#if HAS_HOTEND + + void HMI_ETemp() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t temp_line; + switch (HMI_ValueStruct.show_mode) { + case -1: temp_line = TEMP_CASE_TEMP; break; + case -2: temp_line = PREHEAT_CASE_TEMP; break; + case -3: temp_line = PREHEAT_CASE_TEMP; break; + default: temp_line = TUNE_CASE_TEMP + MROWS - index_tune; + } + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.E_Temp)) { + EncoderRate.enabled = false; + if (HMI_ValueStruct.show_mode == -1) { // temperature + checkkey = TemperatureID; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), 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, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), 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, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), ui.material_preset[1].hotend_temp); + return; + } + else { // tune + checkkey = Tune; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(temp_line), 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 + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); + } + } + +#endif // HAS_HOTEND + +#if HAS_HEATED_BED + + void HMI_BedTemp() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t bed_line; + switch (HMI_ValueStruct.show_mode) { + case -1: bed_line = TEMP_CASE_BED; break; + case -2: bed_line = PREHEAT_CASE_BED; break; + case -3: bed_line = PREHEAT_CASE_BED; break; + default: bed_line = TUNE_CASE_BED + MROWS - index_tune; + } + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Bed_Temp)) { + EncoderRate.enabled = false; + if (HMI_ValueStruct.show_mode == -1) { + checkkey = TemperatureID; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), 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, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), 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, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), ui.material_preset[1].bed_temp); + return; + } + else { + checkkey = Tune; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); + } + thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); + return; + } + // Bed_Temp limit + NOMORE(HMI_ValueStruct.Bed_Temp, BED_MAX_TARGET); + NOLESS(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP); + // Bed_Temp value + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); + } + } + +#endif // HAS_HEATED_BED + +#if HAS_PREHEAT + + void HMI_FanSpeed() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + uint8_t fan_line; + switch (HMI_ValueStruct.show_mode) { + case -1: fan_line = TEMP_CASE_FAN; break; + case -2: fan_line = PREHEAT_CASE_FAN; break; + case -3: fan_line = PREHEAT_CASE_FAN; break; + default: fan_line = TUNE_CASE_FAN + MROWS - index_tune; + } + + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Fan_speed)) { + EncoderRate.enabled = false; + if (HMI_ValueStruct.show_mode == -1) { + checkkey = TemperatureID; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), 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, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), 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, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), ui.material_preset[1].fan_speed); + return; + } + else { + checkkey = Tune; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(fan_line), 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 + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); + } + } + +#endif // HAS_PREHEAT + +void HMI_PrintSpeed() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.print_speed)) { + checkkey = Tune; + EncoderRate.enabled = false; + feedrate_percentage = HMI_ValueStruct.print_speed; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(select_tune.now + 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); + // print_speed value + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(select_tune.now + MROWS - index_tune), HMI_ValueStruct.print_speed); + } +} + +void HMI_MaxFeedspeedXYZE() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Feedspeed)) { + checkkey = MaxSpeed; + EncoderRate.enabled = false; + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + return; + } + // MaxFeedspeed limit + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_axis] * 2); + if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; + // MaxFeedspeed value + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + } +} + +void HMI_MaxAccelerationXYZE() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Acceleration)) { + checkkey = MaxAcceleration; + EncoderRate.enabled = false; + if (HMI_flag.acc_axis == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); + else if (HMI_flag.acc_axis == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); + else if (HMI_flag.acc_axis == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); + #if HAS_HOTEND + else if (HMI_flag.acc_axis == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); + #endif + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + return; + } + // MaxAcceleration limit + if (WITHIN(HMI_flag.acc_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_axis] * 2); + if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; + // MaxAcceleration value + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + } +} + +#if HAS_CLASSIC_JERK + + void HMI_MaxJerkXYZE() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk)) { + checkkey = MaxJerk; + EncoderRate.enabled = false; + if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + planner.set_max_jerk(HMI_flag.step_axis, HMI_ValueStruct.Max_Jerk / 10); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + return; + } + // MaxJerk limit + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Jerk, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Jerk, (MIN_MAXJERK) * MINUNITMULT); + // MaxJerk value + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + } + } + +#endif // HAS_CLASSIC_JERK + +void HMI_StepXYZE() { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step)) { + checkkey = Step; + EncoderRate.enabled = false; + if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step / 10; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + return; + } + // Step limit + if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + NOMORE(HMI_ValueStruct.Max_Step, default_axis_steps_per_unit[HMI_flag.step_axis] * 2 * MINUNITMULT); + NOLESS(HMI_ValueStruct.Max_Step, MIN_STEP); + // Step value + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + } +} + +void update_variable() { + #if HAS_HOTEND + static float last_temp_hotend_target = 0, last_temp_hotend_current = 0; + #endif + #if HAS_HEATED_BED + static float last_temp_bed_target = 0, last_temp_bed_current = 0; + #endif + #if HAS_FAN + static uint8_t last_fan_speed = 0; + #endif + + /* Tune page temperature update */ + if (checkkey == Tune) { + #if HAS_HOTEND + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + if (last_temp_bed_target != thermalManager.temp_bed.target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + if (last_fan_speed != thermalManager.fan_speed[0]) { + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + last_fan_speed = thermalManager.fan_speed[0]; + } + #endif + } + + /* Temperature page temperature update */ + if (checkkey == TemperatureID) { + #if HAS_HOTEND + if (last_temp_hotend_target != thermalManager.temp_hotend[0].target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_TEMP), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + if (last_temp_bed_target != thermalManager.temp_bed.target) + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_BED), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + if (last_fan_speed != thermalManager.fan_speed[0]) { + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TEMP_CASE_FAN), thermalManager.fan_speed[0]); + last_fan_speed = thermalManager.fan_speed[0]; + } + #endif + } + + /* Bottom temperature update */ + #if HAS_HOTEND + if (last_temp_hotend_current != thermalManager.temp_hotend[0].celsius) { + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_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, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + last_temp_hotend_target = thermalManager.temp_hotend[0].target; + } + #endif + #if HAS_HEATED_BED + if (last_temp_bed_current != thermalManager.temp_bed.celsius) { + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_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, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + last_temp_bed_target = thermalManager.temp_bed.target; + } + #endif + static uint16_t last_speed = 0; + if (last_speed != feedrate_percentage) { + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); + last_speed = feedrate_percentage; + } + #if HAS_ZOFFSET_ITEM + if (last_zoffset != BABY_Z_VAR) { + DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178 + STAT_CHR_W, 429, BABY_Z_VAR * 100); + last_zoffset = BABY_Z_VAR; + } + #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. + */ + +#ifndef strcasecmp_P + #define strcasecmp_P(a, b) strcasecmp((a), (b)) +#endif + +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 + + // 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) + + size_t 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 + + // Copy down to 0 + while (pos--) dst[pos] = src[pos]; +} + +inline void HMI_SDCardInit() { card.cdroot(); } + +void MarlinUI::refresh() { /* Nothing to see here */ } + +#define ICON_Folder ICON_More + +#if ENABLED(SCROLL_LONG_FILENAMES) + + char shift_name[LONG_FILENAME_LENGTH + 1]; + int8_t shift_amt; // = 0 + millis_t shift_ms; // = 0 + + // Init the shift name based on the highlighted item + 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 ".." + 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); + } + } + + inline void Init_SDItem_Shift() { + shift_amt = 0; + shift_ms = select_file.now > 0 && strlen(shift_name) > MENU_CHAR_LIMIT + ? millis() + 750UL : 0; + } + +#endif + +/** + * 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; + if (is_subdir && item == 0) { + Draw_Menu_Line(row, ICON_Folder, ".."); + return; + } + + card.getfilename_sorted(item - is_subdir); + char * const name = card.longest_filename(); + + #if ENABLED(SCROLL_LONG_FILENAMES) + // Init the current selected name + // This is used during scroll drawing + if (item == select_file.now - 1) { + make_name_without_ext(shift_name, name, 100); + Init_SDItem_Shift(); + } + #endif + + // Draw the file/folder with name aligned left + char str[strlen(name) + 1]; + make_name_without_ext(str, name); + Draw_Menu_Line(row, card.flag.filenameIsDir ? ICON_Folder : ICON_File, str); +} + +#if ENABLED(SCROLL_LONG_FILENAMES) + + inline void Draw_SDItem_Shifted(int8_t &shift) { + // Limit to the number of chars past the cutoff + const size_t len = strlen(shift_name); + NOMORE(shift, _MAX(len - MENU_CHAR_LIMIT, 0U)); + + // Shorten to the available space + const size_t lastchar = _MIN((signed)len, shift + MENU_CHAR_LIMIT); + + const char c = shift_name[lastchar]; + shift_name[lastchar] = '\0'; + + 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]); + + shift_name[lastchar] = c; + } + +#endif + +// Redraw the first set of SD Files +inline void Redraw_SD_List() { + select_file.reset(); + index_file = MROWS; + + Clear_Menu_Area(); // Leave title bar unchanged + + Draw_Back_First(); + + if (card.isMounted()) { + // As many files as will fit + LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) + Draw_SDItem(i, i + 1); + + TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); + } + else { + DWIN_Draw_Rectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); + DWIN_Draw_String(false, false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); + } +} + +bool DWIN_lcd_sd_status = false; + +inline void SDCard_Up() { + card.cdup(); + Redraw_SD_List(); + DWIN_lcd_sd_status = false; // On next DWIN_Update +} + +inline void SDCard_Folder(char * const dirname) { + card.cd(dirname); + Redraw_SD_List(); + DWIN_lcd_sd_status = false; // On next DWIN_Update +} + +// +// Watch for media mount / unmount +// +void HMI_SDCardUpdate() { + 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)); + if (DWIN_lcd_sd_status) { + if (checkkey == SelectFile) + Redraw_SD_List(); + } + else { + // clean file icon + 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 = wait_for_user = false; + dwin_abort_flag = true; // Reset feedrate, return to Home + } + } + DWIN_UpdateLCD(); + } +} + +// +// The status area is always on-screen, except during +// full-screen modal dialogs. (TODO: Keep alive during dialogs) +// +void Draw_Status_Area(const bool with_update) { + + // Clear the bottom area of the screen + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); + + // + // Status Area + // + #if HAS_HOTEND + DWIN_ICON_Show(ICON, ICON_HotendTemp, 13, 381); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33, 382, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_hotend[0].target); + #endif + #if HOTENDS > 1 + // DWIN_ICON_Show(ICON,ICON_HotendTemp, 13, 381); + #endif + + #if HAS_HEATED_BED + DWIN_ICON_Show(ICON, ICON_BedTemp, 158, 381); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178, 382, thermalManager.temp_bed.celsius); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 178 + 3 * STAT_CHR_W + 5, 383, F("/")); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 178 + 4 * STAT_CHR_W + 6, 382, thermalManager.temp_bed.target); + #endif + + DWIN_ICON_Show(ICON, ICON_Speed, 13, 429); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 33 + 2 * STAT_CHR_W, 429, feedrate_percentage); + DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 33 + 5 * STAT_CHR_W + 2, 429, F("%")); + + #if HAS_ZOFFSET_ITEM + DWIN_ICON_Show(ICON, ICON_Zoffset, 158, 428); + DWIN_Draw_Signed_Float(DWIN_FONT_STAT, Color_Bg_Black, 2, 2, 178, 429, BABY_Z_VAR * 100); + #endif + + if (with_update) { + DWIN_UpdateLCD(); + delay(5); + } +} + +void HMI_StartFrame(const bool with_update) { + Goto_MainMenu(); + Draw_Status_Area(with_update); +} + +inline void Draw_Info_Menu() { + Clear_Main_Window(); + + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, (char*)MACHINE_SIZE); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, (char*)SHORT_BUILD_VERSION); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 30, 17, 57, 29); // "Info" + + DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); + DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); + DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE_C) * MENU_CHR_W) / 2, 268, (char*)CORP_WEBSITE_C); + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); + #else + DWIN_Frame_TitleCopy(1, 190, 16, 215, 26); // "Info" + #endif + + DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); + DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); + DWIN_Frame_AreaCopy(1, 0, 165, 94, 175, 89, 248); + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_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); + } +} + +inline void Draw_Print_File_Menu() { + Clear_Title_Bar(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 0, 31, 55, 44); // "Print file" + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("Print file"); // TODO: GET_TEXT_F + #else + DWIN_Frame_TitleCopy(1, 52, 31, 137, 41); // "Print file" + #endif + } + + Redraw_SD_List(); +} + +/* Main Process */ +void HMI_MainMenu() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_page.inc(4)) { + switch (select_page.now) { + 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_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(1); break; + } + } + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_page.dec()) { + switch (select_page.now) { + case 0: ICON_Print(); ICON_Prepare(); break; + case 1: ICON_Prepare(); ICON_Control(); 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; + } + } + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_page.now) { + case 0: // Print File + checkkey = SelectFile; + Draw_Print_File_Menu(); + break; + + case 1: // Prepare + checkkey = Prepare; + select_prepare.reset(); + index_prepare = MROWS; + Draw_Prepare_Menu(); + break; + + case 2: // Control + checkkey = Control; + select_control.reset(); + index_control = MROWS; + Draw_Control_Menu(); + break; + + case 3: // Leveling or Info + #if HAS_ONESTEP_LEVELING + checkkey = Leveling; + HMI_Leveling(); + #else + checkkey = Info; + Draw_Info_Menu(); + #endif + break; + } + } + DWIN_UpdateLCD(); +} + +// Select (and Print) File +void HMI_SelectFile() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + + const uint16_t hasUpDir = !card.flag.workDirIsRoot; + + if (encoder_diffState == ENCODER_DIFF_NO) { + #if ENABLED(SCROLL_LONG_FILENAMES) + if (shift_ms && select_file.now >= 1 + hasUpDir) { + // Scroll selected filename every second + const millis_t ms = millis(); + if (ELAPSED(ms, shift_ms)) { + const bool was_reset = shift_amt < 0; + shift_ms = ms + 375UL + was_reset * 250UL; // ms per character + int8_t shift_new = shift_amt + 1; // Try to shift by... + Draw_SDItem_Shifted(shift_new); // Draw the item + if (!was_reset && shift_new == 0) // Was it limited to 0? + shift_ms = 0; // No scrolling needed + else if (shift_new == shift_amt) // Scroll reached the end + shift_new = -1; // Reset + shift_amt = shift_new; // Set new scroll + } + } + #endif + return; + } + + // First pause is long. Easy. + // On reset, long pause must be after 0. + + const uint16_t fullCnt = nr_sd_menu_items(); + + if (encoder_diffState == ENCODER_DIFF_CW && fullCnt) { + if (select_file.inc(1 + fullCnt)) { + const uint8_t itemnum = select_file.now - 1; // -1 for "Back" + if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted + Erase_Menu_Text(itemnum + 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 + Scroll_Menu(DWIN_SCROLL_UP); + Draw_SDItem(itemnum, MROWS); // Draw and init the shift name + } + else { + Move_Highlight(1, select_file.now + MROWS - index_file); // Just move highlight + TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name + } + TERN_(SCROLL_LONG_FILENAMES, 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 (TERN0(SCROLL_LONG_FILENAMES, 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 + Scroll_Menu(DWIN_SCROLL_DOWN); + if (index_file == MROWS) { + Draw_Back_First(); + TERN_(SCROLL_LONG_FILENAMES, shift_ms = 0); + } + 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 + TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name + } + TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); // Reset left. Init timer. + } + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (select_file.now == 0) { // Back + select_page.set(0); + Goto_MainMenu(); + } + else if (hasUpDir && select_file.now == 1) { // CD-Up + SDCard_Up(); + goto HMI_SelectFileExit; + } + else { + const uint16_t filenum = select_file.now - 1 - hasUpDir; + card.getfilename_sorted(SD_ORDER(filenum, card.get_num_Files())); + + // Enter that folder! + if (card.flag.filenameIsDir) { + SDCard_Folder(card.filename); + goto HMI_SelectFileExit; + } + + // Reset highlight for next entry + select_print.reset(); + select_file.reset(); + + // Start choice and print SD file + HMI_flag.heat_flag = true; + HMI_flag.print_finish = false; + HMI_ValueStruct.show_mode = 0; + + card.openAndPrintFile(card.filename); + + #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; + #endif + + Goto_PrintProcess(); + } + } +HMI_SelectFileExit: + DWIN_UpdateLCD(); +} + +/* Printing */ +void HMI_Printing() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + if (HMI_flag.done_confirm_flag) { + if (encoder_diffState == ENCODER_DIFF_ENTER) { + HMI_flag.done_confirm_flag = false; + dwin_abort_flag = true; // Reset feedrate, return to Home + } + return; + } + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_print.inc(3)) { + switch (select_print.now) { + case 0: ICON_Tune(); break; + case 1: + ICON_Tune(); + if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); + break; + case 2: + if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); + ICON_Stop(); + break; + } + } + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_print.dec()) { + switch (select_print.now) { + case 0: + ICON_Tune(); + if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); + break; + case 1: + if (printingIsPaused()) ICON_Continue(); else ICON_Pause(); + ICON_Stop(); + break; + case 2: ICON_Stop(); break; + } + } + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_print.now) { + case 0: // Tune + checkkey = Tune; + HMI_ValueStruct.show_mode = 0; + select_tune.reset(); + index_tune = MROWS; + Draw_Tune_Menu(); + break; + case 1: // Pause + if (HMI_flag.pause_flag) { + ICON_Pause(); + + char cmd[40]; + cmd[0] = '\0'; + + #if ENABLED(PAUSE_HEAT) + #if HAS_HEATED_BED + if (tempbed) sprintf_P(cmd, PSTR("M190 S%i\n"), tempbed); + #endif + #if HAS_HOTEND + if (temphot) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), temphot); + #endif + #endif + + strcat_P(cmd, PSTR("M24")); + queue.inject(cmd); + } + else { + HMI_flag.select_flag = true; + checkkey = Print_window; + Popup_window_PauseOrStop(); + } + break; + + case 2: // Stop + HMI_flag.select_flag = true; + checkkey = Print_window; + Popup_window_PauseOrStop(); + break; + + default: break; + } + } + DWIN_UpdateLCD(); +} + +/* Pause and Stop window */ +void HMI_PauseOrStop() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + if (encoder_diffState == ENCODER_DIFF_CW) + Draw_Select_Highlight(false); + 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) { + HMI_flag.pause_action = true; + ICON_Continue(); + #if ENABLED(POWER_LOSS_RECOVERY) + if (recovery.enabled) recovery.save(true); + #endif + queue.inject_P(PSTR("M25")); + } + else { + // cancel pause + } + Goto_PrintProcess(); + } + else if (select_print.now == 2) { // stop window + if (HMI_flag.select_flag) { + checkkey = Back_Main; + if (HMI_flag.home_flag) planner.synchronize(); // Wait for planner moves to finish! + wait_for_heatup = wait_for_user = false; // Stop waiting for heating/user + card.flag.abort_sd_printing = true; // Let the main loop handle SD abort + dwin_abort_flag = true; // Reset feedrate, return to Home + #ifdef ACTION_ON_CANCEL + host_action_cancel(); + #endif + Popup_Window_Home(true); + } + else + Goto_PrintProcess(); // cancel stop + } + } + DWIN_UpdateLCD(); +} + +inline void Draw_Move_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 192, 1, 233, 14); // "Move" + DWIN_Frame_AreaCopy(1, 58, 118, 106, 132, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 109, 118, 157, 132, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 160, 118, 209, 132, LBLX, MBASE(3)); + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 212, 118, 253, 131, LBLX, MBASE(4)); + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); + #else + DWIN_Frame_TitleCopy(1, 231, 2, 265, 12); // "Move" + #endif + draw_move_en(MBASE(1)); say_x(36, MBASE(1)); // "Move X" + draw_move_en(MBASE(2)); say_y(36, MBASE(2)); // "Move Y" + draw_move_en(MBASE(3)); say_z(36, MBASE(3)); // "Move Z" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 123, 192, 176, 202, LBLX, MBASE(4)); // "Extruder" + #endif + } + + Draw_Back_First(select_axis.now == 0); + if (select_axis.now) Draw_Menu_Cursor(select_axis.now); + + // Draw separators and icons + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) 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() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_prepare.inc(1 + PREPARE_CASE_TOTAL)) { + if (select_prepare.now > MROWS && select_prepare.now > index_prepare) { + index_prepare = select_prepare.now; + + // Scroll up and draw a blank bottom line + Scroll_Menu(DWIN_SCROLL_UP); + 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 HAS_HOTEND + if (index_prepare == PREPARE_CASE_ABS) Item_Prepare_ABS(MROWS); + #endif + #if HAS_PREHEAT + if (index_prepare == PREPARE_CASE_COOL) Item_Prepare_Cool(MROWS); + #endif + if (index_prepare == PREPARE_CASE_LANG) Item_Prepare_Lang(MROWS); + } + 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) { + 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); + + if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); + + if (index_prepare == 6) Item_Prepare_Move(0); + else if (index_prepare == 7) Item_Prepare_Disable(0); + else if (index_prepare == 8) Item_Prepare_Home(0); + } + else { + Move_Highlight(-1, select_prepare.now + MROWS - index_prepare); + } + } + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_prepare.now) { + case 0: // Back + select_page.set(1); + Goto_MainMenu(); + break; + case PREPARE_CASE_MOVE: // Axis move + checkkey = AxisMove; + select_axis.reset(); + Draw_Move_Menu(); + + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), current_position.x * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), current_position.y * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), current_position.z * MINUNITMULT); + #if HAS_HOTEND + queue.inject_P(PSTR("G92 E0")); + current_position.e = HMI_ValueStruct.Move_E_scale = 0; + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); + #endif + break; + case PREPARE_CASE_DISA: // Disable steppers + queue.inject_P(PSTR("M84")); + break; + case PREPARE_CASE_HOME: // Homing + checkkey = Last_Prepare; + index_prepare = MROWS; + queue.inject_P(PSTR("G28")); // G28 will set home_flag + Popup_Window_Home(); + break; + #if HAS_ZOFFSET_ITEM + case PREPARE_CASE_ZOFF: // Z-offset + #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + checkkey = Homeoffset; + HMI_ValueStruct.show_mode = -4; + HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(PREPARE_CASE_ZOFF + MROWS - index_prepare), HMI_ValueStruct.offset_value); + EncoderRate.enabled = true; + #else + // Apply workspace offset, making the current position 0,0,0 + queue.inject_P(PSTR("G92 X0 Y0 Z0")); + HMI_AudioFeedback(); + #endif + break; + #endif + #if HAS_HOTEND + case PREPARE_CASE_PLA: // PLA preheat + 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 PREPARE_CASE_ABS: // ABS preheat + 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; + #endif + #if HAS_PREHEAT + case PREPARE_CASE_COOL: // Cool + TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); + #if HAS_HOTEND || HAS_HEATED_BED + thermalManager.disable_all_heaters(); + #endif + break; + #endif + case PREPARE_CASE_LANG: // Toggle Language + HMI_ToggleLanguage(); + Draw_Prepare_Menu(); + break; + default: break; + } + } + DWIN_UpdateLCD(); +} + +void Draw_Temperature_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 236, 2, 263, 13); // "Temperature" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX, MBASE(TEMP_CASE_TEMP)); + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX, MBASE(TEMP_CASE_BED)); + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX, MBASE(TEMP_CASE_FAN)); + #endif + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 100, 89, 178, 101, LBLX, MBASE(TEMP_CASE_PLA)); + DWIN_Frame_AreaCopy(1, 180, 89, 260, 100, LBLX, MBASE(TEMP_CASE_ABS)); + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_TEMP), GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + #endif + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_BED), GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_PLA), F("PLA Preheat Settings")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(TEMP_CASE_ABS), F("ABS Preheat Settings")); + #endif + #else + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "Temperature" + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX, MBASE(TEMP_CASE_TEMP)); // Nozzle... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 44, MBASE(TEMP_CASE_TEMP)); // ...Temperature + #endif + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX, MBASE(TEMP_CASE_BED)); // Bed... + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 27, MBASE(TEMP_CASE_BED)); // ...Temperature + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX, MBASE(TEMP_CASE_FAN)); // Fan speed + #endif + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(TEMP_CASE_PLA)); // Preheat... + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX + 52, MBASE(TEMP_CASE_PLA)); // ...PLA + DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 79, MBASE(TEMP_CASE_PLA)); // PLA setting + DWIN_Frame_AreaCopy(1, 107, 76, 156, 86, LBLX, MBASE(TEMP_CASE_ABS)); // Preheat... + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 52, MBASE(TEMP_CASE_ABS)); // ...ABS + DWIN_Frame_AreaCopy(1, 131, 119, 182, 132, LBLX + 81, MBASE(TEMP_CASE_ABS)); // ABS setting + #endif + #endif + } + + Draw_Back_First(select_temp.now == 0); + if (select_temp.now) Draw_Menu_Cursor(select_temp.now); + + // Draw icons and lines + uint8_t i = 0; + #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) + #if HAS_HOTEND + _TMENU_ICON(TEMP_CASE_TEMP); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); + #endif + #if HAS_HEATED_BED + _TMENU_ICON(TEMP_CASE_BED); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_bed.target); + #endif + #if HAS_FAN + _TMENU_ICON(TEMP_CASE_FAN); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.fan_speed[0]); + #endif + #if HAS_HOTEND + // PLA/ABS items have submenus + _TMENU_ICON(TEMP_CASE_PLA); + Draw_More_Icon(i); + _TMENU_ICON(TEMP_CASE_ABS); + Draw_More_Icon(i); + #endif +} + +/* Control */ +void HMI_Control() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_control.inc(1 + CONTROL_CASE_TOTAL)) { + 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 + index_control - 1); + Draw_More_Icon(CONTROL_CASE_TEMP + MROWS - index_control); // Temperature > + Draw_More_Icon(CONTROL_CASE_MOVE + MROWS - index_control); // Motion > + if (index_control > MROWS) { + Draw_More_Icon(CONTROL_CASE_INFO + MROWS - index_control); // Info > + if (HMI_IsChinese()) + DWIN_Frame_AreaCopy(1, 231, 104, 258, 116, LBLX, MBASE(CONTROL_CASE_INFO - 1)); + else + DWIN_Frame_AreaCopy(1, 0, 104, 24, 114, LBLX, MBASE(CONTROL_CASE_INFO - 1)); + } + } + 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) { + 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 > + } + else { + Move_Highlight(-1, select_control.now + MROWS - index_control); + } + } + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_control.now) { + case 0: // Back + select_page.set(2); + Goto_MainMenu(); + break; + case CONTROL_CASE_TEMP: // Temperature + checkkey = TemperatureID; + HMI_ValueStruct.show_mode = -1; + select_temp.reset(); + Draw_Temperature_Menu(); + break; + case CONTROL_CASE_MOVE: // Motion + checkkey = Motion; + select_motion.reset(); + Draw_Motion_Menu(); + break; + #if ENABLED(EEPROM_SETTINGS) + case CONTROL_CASE_SAVE: { // Write EEPROM + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + case CONTROL_CASE_LOAD: { // Read EEPROM + const bool success = settings.load(); + HMI_AudioFeedback(success); + } break; + case CONTROL_CASE_RESET: // Reset EEPROM + settings.reset(); + HMI_AudioFeedback(); + break; + #endif + case CONTROL_CASE_INFO: // Info + checkkey = Info; + Draw_Info_Menu(); + break; + default: break; + } + } + DWIN_UpdateLCD(); +} + + +#if HAS_ONESTEP_LEVELING + + /* Leveling */ + void HMI_Leveling() { + Popup_Window_Leveling(); + DWIN_UpdateLCD(); + queue.inject_P(PSTR("G28O\nG29")); + } + +#endif + +/* Axis Move */ +void HMI_AxisMove() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + #if ENABLED(PREVENT_COLD_EXTRUSION) + // popup window resume + if (HMI_flag.ETempTooLow_flag) { + if (encoder_diffState == ENCODER_DIFF_ENTER) { + HMI_flag.ETempTooLow_flag = false; + current_position.e = HMI_ValueStruct.Move_E_scale = 0; + Draw_Move_Menu(); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + DWIN_Draw_Signed_Float(font8x16, Color_Bg_Black, 3, 1, 216, MBASE(4), 0); + DWIN_UpdateLCD(); + } + return; + } + #endif + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_axis.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_axis.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_axis.dec()) Move_Highlight(-1, select_axis.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_axis.now) { + case 0: // Back + checkkey = Prepare; + select_prepare.set(1); + index_prepare = MROWS; + Draw_Prepare_Menu(); + break; + case 1: // X axis move + checkkey = Move_X; + HMI_ValueStruct.Move_X_scale = current_position.x * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(1), HMI_ValueStruct.Move_X_scale); + EncoderRate.enabled = true; + break; + case 2: // Y axis move + checkkey = Move_Y; + HMI_ValueStruct.Move_Y_scale = current_position.y * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(2), HMI_ValueStruct.Move_Y_scale); + EncoderRate.enabled = true; + break; + case 3: // Z axis move + checkkey = Move_Z; + HMI_ValueStruct.Move_Z_scale = current_position.z * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 216, MBASE(3), HMI_ValueStruct.Move_Z_scale); + EncoderRate.enabled = true; + 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 = true; + Popup_Window_ETempTooLow(); + DWIN_UpdateLCD(); + return; + } + #endif + checkkey = Extruder; + HMI_ValueStruct.Move_E_scale = current_position.e * MINUNITMULT; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 3, 1, 216, MBASE(4), HMI_ValueStruct.Move_E_scale); + EncoderRate.enabled = true; + break; + #endif + } + } + DWIN_UpdateLCD(); +} + +/* TemperatureID */ +void HMI_Temperature() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_temp.inc(1 + TEMP_CASE_TOTAL)) Move_Highlight(1, select_temp.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_temp.dec()) Move_Highlight(-1, select_temp.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_temp.now) { + case 0: // Back + checkkey = Control; + select_control.set(1); + index_control = MROWS; + Draw_Control_Menu(); + break; + #if HAS_HOTEND + case TEMP_CASE_TEMP: // Nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case TEMP_CASE_BED: // Bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case TEMP_CASE_FAN: // Fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HOTEND + case TEMP_CASE_PLA: { // PLA preheat setting + checkkey = PLAPreheat; + select_PLA.reset(); + HMI_ValueStruct.show_mode = -2; + + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 59, 16, 139, 29); // "PLA Settings" + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_BED)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(PREHEAT_CASE_BED)); // PLA bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 100, 89, 124, 101, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("PLA Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + #endif + #else + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(PREHEAT_CASE_BED) + 3); // PLA bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration + #endif + #endif + } + + Draw_Back_First(); + + uint8_t i = 0; + Draw_Menu_Line(++i, ICON_SetEndTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].hotend_temp); + #if HAS_HEATED_BED + Draw_Menu_Line(++i, ICON_SetBedTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].bed_temp); + #endif + #if HAS_FAN + Draw_Menu_Line(++i, ICON_FanSpeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[0].fan_speed); + #endif + #if ENABLED(EEPROM_SETTINGS) + Draw_Menu_Line(++i, ICON_WriteEEPROM); + #endif + } break; + + case TEMP_CASE_ABS: { // ABS preheat setting + checkkey = ABSPreheat; + select_ABS.reset(); + HMI_ValueStruct.show_mode = -3; + + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 142, 16, 223, 29); // "ABS Settings" + + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 134, 56, 146, LBLX + 24, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_BED)); + DWIN_Frame_AreaCopy(1, 58, 134, 113, 146, LBLX + 24, MBASE(PREHEAT_CASE_BED)); // ABS bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 115, 134, 170, 146, LBLX + 24, MBASE(PREHEAT_CASE_FAN)); // ABS fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 72, 148, 151, 162, LBLX, MBASE(PREHEAT_CASE_SAVE)); + DWIN_Frame_AreaCopy(1, 180, 89, 204, 100, LBLX + 28, MBASE(PREHEAT_CASE_SAVE) + 2); // Save ABS configuration + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("ABS Settings"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); + #if HAS_HEATED_BED + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_BED), F("Bed Temp")); + #endif + #if HAS_FAN + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_FAN), GET_TEXT_F(MSG_FAN_SPEED)); + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(PREHEAT_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); + #endif + #else + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "ABS Settings" + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // ABS nozzle temp + #if HAS_HEATED_BED + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 54, MBASE(PREHEAT_CASE_BED) + 3); // ABS bed temp + #endif + #if HAS_FAN + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX, MBASE(PREHEAT_CASE_FAN)); + DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // ABS fan speed + #endif + #if ENABLED(EEPROM_SETTINGS) + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); + DWIN_Frame_AreaCopy(1, 172, 76, 198, 86, LBLX + 33, MBASE(PREHEAT_CASE_SAVE)); // Save ABS configuration + #endif + #endif + } + + Draw_Back_First(); + + uint8_t i = 0; + Draw_Menu_Line(++i, ICON_SetEndTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].hotend_temp); + #if HAS_HEATED_BED + Draw_Menu_Line(++i, ICON_SetBedTemp); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].bed_temp); + #endif + #if HAS_FAN + Draw_Menu_Line(++i, ICON_FanSpeed); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), ui.material_preset[1].fan_speed); + #endif + #if ENABLED(EEPROM_SETTINGS) + Draw_Menu_Line(++i, ICON_WriteEEPROM); + #endif + + } break; + + #endif // HAS_HOTEND + } + } + DWIN_UpdateLCD(); +} + +inline void Draw_Max_Speed_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Max Speed (mm/s)" + + auto say_max_speed = [](const uint16_t row) { + DWIN_Frame_AreaCopy(1, 173, 133, 228, 147, LBLX, row); // "Max speed" + }; + + say_max_speed(MBASE(1)); // "Max speed" + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(1)); // X + say_max_speed(MBASE(2)); // "Max speed" + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(2) + 3); // Y + say_max_speed(MBASE(3)); // "Max speed" + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(3) + 3); // Z + #if HAS_HOTEND + say_max_speed(MBASE(4)); // "Max speed" + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 58, MBASE(4) + 3); // E + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title("Max Speed (mm/s)"); // TODO: GET_TEXT_F + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Feedrate X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Feedrate Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Feedrate Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Feedrate E")); + #endif + #else + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Max Speed (mm/s)" + + draw_max_en(MBASE(1)); // "Max" + DWIN_Frame_AreaCopy(1, 184, 119, 234, 132, LBLX + 27, MBASE(1)); // "Speed X" + + draw_max_en(MBASE(2)); // "Max" + draw_speed_en(27, MBASE(2)); // "Speed" + say_y(70, MBASE(2)); // "Y" + + draw_max_en(MBASE(3)); // "Max" + draw_speed_en(27, MBASE(3)); // "Speed" + say_z(70, MBASE(3)); // "Z" + + #if HAS_HOTEND + draw_max_en(MBASE(4)); // "Max" + draw_speed_en(27, MBASE(4)); // "Speed" + say_e(70, MBASE(4)); // "E" + #endif + #endif + } + + Draw_Back_First(); + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(1), planner.settings.max_feedrate_mm_s[X_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(2), planner.settings.max_feedrate_mm_s[Y_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(3), planner.settings.max_feedrate_mm_s[Z_AXIS]); + #if HAS_HOTEND + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(4), planner.settings.max_feedrate_mm_s[E_AXIS]); + #endif +} + +inline void Draw_Max_Accel_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Acceleration" + + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 71, MBASE(1)); // Max acceleration X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 71, MBASE(2) + 2); // Max acceleration Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 71, MBASE(3) + 2); // Max acceleration Z + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 71, MBASE(4) + 2); // Max acceleration E + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Accel X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Accel Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Accel Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Accel E")); + #endif + #else + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Acceleration" + draw_max_accel_en(MBASE(1)); say_x(108, MBASE(1)); // "Max Acceleration X" + draw_max_accel_en(MBASE(2)); say_y(108, MBASE(2)); // "Max Acceleration Y" + draw_max_accel_en(MBASE(3)); say_z(108, MBASE(3)); // "Max Acceleration Z" + #if HAS_HOTEND + draw_max_accel_en(MBASE(4)); say_e(108, MBASE(4)); // "Max Acceleration E" + #endif + #endif + } + + Draw_Back_First(); + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(1), planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(2), planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(3), planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + #if HAS_HOTEND + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(4), planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + #endif +} + +inline void Draw_Max_Jerk_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Jerk" + + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(1)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(1) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(1)); // Max Jerk speed X + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(2) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(2) + 3); // Max Jerk speed Y + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(3)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(3) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(3) + 3); // Max Jerk speed Z + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 173, 133, 200, 147, LBLX , MBASE(4)); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(4) + 1); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 83, MBASE(4) + 3); // Max Jerk speed E + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_JERK)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Max Jerk X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Max Jerk Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Max Jerk Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Max Jerk E")); + #endif + #else + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Jerk" + draw_max_en(MBASE(1)); // "Max" + draw_jerk_en(MBASE(1)); // "Jerk" + draw_speed_en(72, MBASE(1)); // "Speed" + say_x(115, MBASE(1)); // "X" + + draw_max_en(MBASE(2)); // "Max" + draw_jerk_en(MBASE(2)); // "Jerk" + draw_speed_en(72, MBASE(2)); // "Speed" + say_y(115, MBASE(2)); // "Y" + + draw_max_en(MBASE(3)); // "Max" + draw_jerk_en(MBASE(3)); // "Jerk" + draw_speed_en(72, MBASE(3)); // "Speed" + say_z(115, MBASE(3)); // "Z" + + #if HAS_HOTEND + draw_max_en(MBASE(4)); // "Max" + draw_jerk_en(MBASE(4)); // "Jerk" + draw_speed_en(72, MBASE(4)); // "Speed" + say_e(115, MBASE(4)); // "E" + #endif + #endif + } + + Draw_Back_First(); + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.max_jerk[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.max_jerk[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.max_jerk[Z_AXIS] * MINUNITMULT); + #if HAS_HOTEND + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.max_jerk[E_AXIS] * MINUNITMULT); + #endif +} + +inline void Draw_Steps_Menu() { + Clear_Main_Window(); + + if (HMI_IsChinese()) { + DWIN_Frame_TitleCopy(1, 1, 16, 28, 28); // "Steps per mm" + + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(1)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 44, MBASE(1)); // Transmission Ratio X + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(2)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 44, MBASE(2) + 3); // Transmission Ratio Y + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(3)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 44, MBASE(3) + 3); // Transmission Ratio Z + #if HAS_HOTEND + DWIN_Frame_AreaCopy(1, 153, 148, 194, 161, LBLX, MBASE(4)); + DWIN_Frame_AreaCopy(1, 18, 150, 25, 160, LBLX + 44, MBASE(4) + 3); // Transmission Ratio E + #endif + } + else { + #ifdef USE_STRING_HEADINGS + Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(1), F("Steps/mm X")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(2), F("Steps/mm Y")); + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(3), F("Steps/mm Z")); + #if HAS_HOTEND + DWIN_Draw_String(false, true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(4), F("Steps/mm E")); + #endif + #else + DWIN_Frame_TitleCopy(1, 144, 16, 189, 26); // "Steps per mm" + draw_steps_per_mm(MBASE(1)); say_x(103, MBASE(1)); // "Steps-per-mm X" + draw_steps_per_mm(MBASE(2)); say_y(103, MBASE(2)); // "Y" + draw_steps_per_mm(MBASE(3)); say_z(103, MBASE(3)); // "Z" + #if HAS_HOTEND + draw_steps_per_mm(MBASE(4)); say_e(103, MBASE(4)); // "E" + #endif + #endif + } + + Draw_Back_First(); + LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_StepX + i); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(1), planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(2), planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(3), planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); + #if HAS_HOTEND + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(4), planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); + #endif +} + +/* Motion */ +void HMI_Motion() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_motion.inc(1 + MOTION_CASE_TOTAL)) Move_Highlight(1, select_motion.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_motion.dec()) Move_Highlight(-1, select_motion.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_motion.now) { + case 0: // Back + checkkey = Control; + select_control.set(CONTROL_CASE_MOVE); + index_control = MROWS; + Draw_Control_Menu(); + break; + case MOTION_CASE_RATE: // Max speed + checkkey = MaxSpeed; + select_speed.reset(); + Draw_Max_Speed_Menu(); + break; + case MOTION_CASE_ACCEL: // Max acceleration + checkkey = MaxAcceleration; + select_acc.reset(); + Draw_Max_Accel_Menu(); + break; + #if HAS_CLASSIC_JERK + case MOTION_CASE_JERK: // Max jerk + checkkey = MaxJerk; + select_jerk.reset(); + Draw_Max_Jerk_Menu(); + break; + #endif + case MOTION_CASE_STEPS: // Steps per mm + checkkey = Step; + select_step.reset(); + Draw_Steps_Menu(); + break; + default: break; + } + } + DWIN_UpdateLCD(); +} + +/* Info */ +void HMI_Info() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + if (encoder_diffState == ENCODER_DIFF_ENTER) { + #if HAS_ONESTEP_LEVELING + checkkey = Control; + select_control.set(CONTROL_CASE_INFO); + Draw_Control_Menu(); + #else + select_page.set(3); + Goto_MainMenu(); + #endif + } + DWIN_UpdateLCD(); +} + +/* Tune */ +void HMI_Tune() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_tune.inc(1 + TUNE_CASE_TOTAL)) { + if (select_tune.now > MROWS && select_tune.now > index_tune) { + index_tune = select_tune.now; + Scroll_Menu(DWIN_SCROLL_UP); + } + 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) { + 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 if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_tune.now) { + case 0: { // Back + select_print.set(0); + Goto_PrintProcess(); + } + break; + case TUNE_CASE_SPEED: // Print speed + checkkey = PrintSpeed; + HMI_ValueStruct.print_speed = feedrate_percentage; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); + EncoderRate.enabled = true; + break; + #if HAS_HOTEND + case TUNE_CASE_TEMP: // Nozzle temp + checkkey = ETemp; + HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case TUNE_CASE_BED: // Bed temp + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case TUNE_CASE_FAN: // Fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + EncoderRate.enabled = true; + break; + #endif + #if HAS_ZOFFSET_ITEM + case TUNE_CASE_ZOFF: // Z-offset + #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + checkkey = Homeoffset; + HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; + DWIN_Draw_Signed_Float(font8x16, Select_Color, 2, 2, 202, MBASE(TUNE_CASE_ZOFF + MROWS - index_tune), HMI_ValueStruct.offset_value); + EncoderRate.enabled = true; + #else + // Apply workspace offset, making the current position 0,0,0 + queue.inject_P(PSTR("G92 X0 Y0 Z0")); + HMI_AudioFeedback(); + #endif + break; + #endif + default: break; + } + } + DWIN_UpdateLCD(); +} + +#if HAS_PREHEAT + + /* PLA Preheat */ + void HMI_PLAPreheatSetting() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_PLA.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_PLA.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_PLA.dec()) Move_Highlight(-1, select_PLA.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_PLA.now) { + case 0: // Back + checkkey = TemperatureID; + select_temp.now = TEMP_CASE_PLA; + HMI_ValueStruct.show_mode = -1; + Draw_Temperature_Menu(); + break; + #if HAS_HOTEND + case PREHEAT_CASE_TEMP: // Nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[0].hotend_temp); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case PREHEAT_CASE_BED: // Bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[0].bed_temp); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case PREHEAT_CASE_FAN: // Fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[0].fan_speed); + EncoderRate.enabled = true; + break; + #endif + #if ENABLED(EEPROM_SETTINGS) + case 4: { // Save PLA configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif + default: break; + } + } + DWIN_UpdateLCD(); + } + + /* ABS Preheat */ + void HMI_ABSPreheatSetting() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_ABS.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + switch (select_ABS.now) { + case 0: // Back + checkkey = TemperatureID; + select_temp.now = TEMP_CASE_ABS; + HMI_ValueStruct.show_mode = -1; + Draw_Temperature_Menu(); + break; + #if HAS_HOTEND + case PREHEAT_CASE_TEMP: // Set nozzle temperature + checkkey = ETemp; + HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_TEMP), ui.material_preset[1].hotend_temp); + EncoderRate.enabled = true; + break; + #endif + #if HAS_HEATED_BED + case PREHEAT_CASE_BED: // Set bed temperature + checkkey = BedTemp; + HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_BED), ui.material_preset[1].bed_temp); + EncoderRate.enabled = true; + break; + #endif + #if HAS_FAN + case PREHEAT_CASE_FAN: // Set fan speed + checkkey = FanSpeed; + HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(PREHEAT_CASE_FAN), ui.material_preset[1].fan_speed); + EncoderRate.enabled = true; + break; + #endif + #if ENABLED(EEPROM_SETTINGS) + case PREHEAT_CASE_SAVE: { // Save ABS configuration + const bool success = settings.save(); + HMI_AudioFeedback(success); + } break; + #endif + default: break; + } + } + DWIN_UpdateLCD(); + } + +#endif + +/* Max Speed */ +void HMI_MaxSpeed() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_speed.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_speed.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_speed.dec()) Move_Highlight(-1, select_speed.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (WITHIN(select_speed.now, 1, 4)) { + checkkey = MaxSpeed_value; + HMI_flag.feedspeed_axis = AxisEnum(select_speed.now - 1); + HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_axis]; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); + EncoderRate.enabled = true; + } + else { // Back + checkkey = Motion; + select_motion.now = MOTION_CASE_RATE; + Draw_Motion_Menu(); + } + } + DWIN_UpdateLCD(); +} + +/* Max Acceleration */ +void HMI_MaxAcceleration() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_acc.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_acc.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_acc.dec()) Move_Highlight(-1, select_acc.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (WITHIN(select_acc.now, 1, 4)) { + checkkey = MaxAcceleration_value; + HMI_flag.acc_axis = AxisEnum(select_acc.now - 1); + HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_axis]; + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); + EncoderRate.enabled = true; + } + else { // Back + checkkey = Motion; + select_motion.now = MOTION_CASE_ACCEL; + Draw_Motion_Menu(); + } + } + DWIN_UpdateLCD(); +} + +#if HAS_CLASSIC_JERK + /* Max Jerk */ + void HMI_MaxJerk() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_jerk.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_jerk.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (WITHIN(select_jerk.now, 1, 4)) { + checkkey = MaxJerk_value; + HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); + HMI_ValueStruct.Max_Jerk = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk); + EncoderRate.enabled = true; + } + else { // Back + checkkey = Motion; + select_motion.now = MOTION_CASE_JERK; + Draw_Motion_Menu(); + } + } + DWIN_UpdateLCD(); + } +#endif // HAS_CLASSIC_JERK + +/* Step */ +void HMI_Step() { + ENCODER_DiffState encoder_diffState = get_encoder_state(); + if (encoder_diffState == ENCODER_DIFF_NO) return; + + // Avoid flicker by updating only the previous menu + if (encoder_diffState == ENCODER_DIFF_CW) { + if (select_step.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_step.now); + } + else if (encoder_diffState == ENCODER_DIFF_CCW) { + if (select_step.dec()) Move_Highlight(-1, select_step.now); + } + else if (encoder_diffState == ENCODER_DIFF_ENTER) { + if (WITHIN(select_step.now, 1, 4)) { + checkkey = Step_value; + HMI_flag.step_axis = AxisEnum(select_step.now - 1); + HMI_ValueStruct.Max_Step = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; + DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step); + EncoderRate.enabled = true; + } + else { // Back + checkkey = Motion; + select_motion.now = MOTION_CASE_STEPS; + Draw_Motion_Menu(); + } + } + DWIN_UpdateLCD(); +} + +void HMI_Init() { + HMI_SDCardInit(); + + for (uint16_t t = 0; t <= 100; t += 2) { + DWIN_ICON_Show(ICON, ICON_Bar, 15, 260); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); + DWIN_UpdateLCD(); + delay(20); + } + + HMI_SetLanguage(); +} + +void DWIN_Update() { + EachMomentUpdate(); // Status update + HMI_SDCardUpdate(); // SD card update + DWIN_HandleScreen(); // Rotary encoder update +} + +void EachMomentUpdate() { + static millis_t next_rts_update_ms = 0; + const millis_t ms = millis(); + if (PENDING(ms, next_rts_update_ms)) return; + next_rts_update_ms = ms + DWIN_SCROLL_UPDATE_INTERVAL; + + // variable update + update_variable(); + + if (checkkey == PrintProcess) { + // if print done + if (HMI_flag.print_finish && !HMI_flag.done_confirm_flag) { + HMI_flag.print_finish = false; + HMI_flag.done_confirm_flag = true; + + TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); + + planner.finish_and_disable(); + + // show percent bar and value + Percentrecord = 0; + Draw_Print_ProgressBar(); + + // show print done confirm + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); + DWIN_ICON_Show(ICON, HMI_IsChinese() ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); + } + else if (HMI_flag.pause_flag != printingIsPaused()) { + // print status update + HMI_flag.pause_flag = printingIsPaused(); + if (HMI_flag.pause_flag) ICON_Continue(); else ICON_Pause(); + } + } + + // pause after homing + if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { + HMI_flag.pause_action = false; + #if ENABLED(PAUSE_HEAT) + #if HAS_HEATED_BED + tempbed = thermalManager.temp_bed.target; + #endif + #if HAS_HOTEND + temphot = thermalManager.temp_hotend[0].target; + #endif + thermalManager.disable_all_heaters(); + #endif + queue.inject_P(PSTR("G1 F1200 X0 Y0")); + } + + if (card.isPrinting() && checkkey == PrintProcess) { // print process + const uint8_t card_pct = card.percentDone(); + static uint8_t last_cardpercentValue = 101; + if (last_cardpercentValue != card_pct) { // print percent + last_cardpercentValue = card_pct; + if (card_pct) { + Percentrecord = card_pct; + Draw_Print_ProgressBar(); + } + } + + duration_t elapsed = print_job_timer.duration(); // print timer + + // Print time so far + static uint16_t last_Printtime = 0; + const uint16_t min = (elapsed.value % 3600) / 60; + if (last_Printtime != min) { // 1 minute update + last_Printtime = min; + Draw_Print_ProgressElapsed(); + } + + // Estimate remaining time every 20 seconds + static millis_t next_remain_time_update = 0; + if (Percentrecord > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { + remain_time = (elapsed.value - dwin_heat_time) / (Percentrecord * 0.01f) - (elapsed.value - dwin_heat_time); + next_remain_time_update += 20 * 1000UL; + Draw_Print_ProgressRemain(); + } + } + else if (dwin_abort_flag && !HMI_flag.home_flag) { // Print Stop + dwin_abort_flag = false; + HMI_ValueStruct.print_speed = feedrate_percentage = 100; + dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); + select_page.set(0); + Goto_MainMenu(); + } + #if ENABLED(POWER_LOSS_RECOVERY) + else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off + static bool recovery_flag = false; + + recovery.dwin_flag = false; + recovery_flag = true; + + auto update_selection = [&](const bool sel) { + HMI_flag.select_flag = sel; + const uint16_t c1 = sel ? Color_Bg_Window : Select_Color; + DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); + DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); + const uint16_t c2 = sel ? Select_Color : Color_Bg_Window; + DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); + DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); + }; + + Popup_Window_Resume(); + update_selection(true); + + // TODO: Get the name of the current file from someplace + // + //(void)recovery.interrupted_file_exists(); + char * const name = card.longest_filename(); + const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; + DWIN_Draw_String(false, true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); + DWIN_UpdateLCD(); + + while (recovery_flag) { + ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); + if (encoder_diffState != ENCODER_DIFF_NO) { + if (encoder_diffState == ENCODER_DIFF_ENTER) { + recovery_flag = false; + if (HMI_flag.select_flag) break; + TERN_(POWER_LOSS_RECOVERY, queue.inject_P(PSTR("M1000C"))); + HMI_StartFrame(true); + return; + } + else + update_selection(encoder_diffState == ENCODER_DIFF_CW); + + DWIN_UpdateLCD(); + } + } + + select_print.set(0); + HMI_ValueStruct.show_mode = 0; + queue.inject_P(PSTR("M1000")); + Goto_PrintProcess(); + Draw_Status_Area(true); + } + #endif + DWIN_UpdateLCD(); +} + +void DWIN_HandleScreen() { + switch (checkkey) { + case MainMenu: HMI_MainMenu(); break; + case SelectFile: HMI_SelectFile(); break; + case Prepare: HMI_Prepare(); break; + case Control: HMI_Control(); break; + case Leveling: break; + case PrintProcess: HMI_Printing(); break; + case Print_window: HMI_PauseOrStop(); break; + case AxisMove: HMI_AxisMove(); break; + case TemperatureID: HMI_Temperature(); break; + case Motion: HMI_Motion(); break; + case Info: HMI_Info(); break; + case Tune: HMI_Tune(); break; + #if HAS_PREHEAT + case PLAPreheat: HMI_PLAPreheatSetting(); break; + case ABSPreheat: HMI_ABSPreheatSetting(); break; + #endif + case MaxSpeed: HMI_MaxSpeed(); break; + case MaxAcceleration: HMI_MaxAcceleration(); break; + case MaxJerk: HMI_MaxJerk(); break; + case Step: HMI_Step(); break; + case Move_X: HMI_Move_X(); break; + case Move_Y: HMI_Move_Y(); break; + case Move_Z: HMI_Move_Z(); break; + #if HAS_HOTEND + case Extruder: HMI_Move_E(); break; + case ETemp: HMI_ETemp(); break; + #endif + #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + case Homeoffset: HMI_Zoffset(); break; + #endif + #if HAS_HEATED_BED + case BedTemp: HMI_BedTemp(); break; + #endif + #if HAS_PREHEAT + case FanSpeed: HMI_FanSpeed(); break; + #endif + case PrintSpeed: HMI_PrintSpeed(); break; + case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; + case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; + case MaxJerk_value: HMI_MaxJerkXYZE(); break; + case Step_value: HMI_StepXYZE(); break; + default: break; + } +} + +void DWIN_CompletedHoming() { + HMI_flag.home_flag = false; + if (checkkey == Last_Prepare) { + checkkey = Prepare; + select_prepare.now = PREPARE_CASE_HOME; + index_prepare = MROWS; + Draw_Prepare_Menu(); + } + else if (checkkey == Back_Main) { + HMI_ValueStruct.print_speed = feedrate_percentage = 100; + dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); + planner.finish_and_disable(); + Goto_MainMenu(); + } +} + +void DWIN_CompletedLeveling() { + if (checkkey == Leveling) Goto_MainMenu(); +} + +#endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h new file mode 100644 index 00000000..5bff2e9f --- /dev/null +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -0,0 +1,373 @@ +/** + * 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 + +/** + * DWIN by Creality3D + */ + +#include "../dwin_lcd.h" +#include "rotary_encoder.h" +#include "../../../libs/BL24CXX.h" + +#include "../../../inc/MarlinConfigPre.h" + +#if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) && PREHEAT_COUNT + #define HAS_PREHEAT 1 + #if PREHEAT_COUNT < 2 + #error "Creality DWIN requires two material preheat presets." + #endif +#endif + +enum processID : uint8_t { + // Process ID + MainMenu, + SelectFile, + Prepare, + Control, + Leveling, + PrintProcess, + AxisMove, + TemperatureID, + Motion, + Info, + Tune, + #if HAS_PREHEAT + PLAPreheat, + ABSPreheat, + #endif + MaxSpeed, + MaxSpeed_value, + MaxAcceleration, + MaxAcceleration_value, + MaxJerk, + MaxJerk_value, + Step, + Step_value, + + // Last Process ID + Last_Prepare, + + // Back Process ID + Back_Main, + Back_Print, + + // Date variable ID + Move_X, + Move_Y, + Move_Z, + #if HAS_HOTEND + Extruder, + ETemp, + #endif + Homeoffset, + #if HAS_HEATED_BED + BedTemp, + #endif + #if HAS_FAN + FanSpeed, + #endif + PrintSpeed, + + // Window ID + Print_window, + Popup_Window +}; + +// Picture ID +#define Start_Process 0 +#define Language_English 1 +#define Language_Chinese 2 + +// ICON ID +#define ICON 0x09 +#define ICON_LOGO 0 +#define ICON_Print_0 1 +#define ICON_Print_1 2 +#define ICON_Prepare_0 3 +#define ICON_Prepare_1 4 +#define ICON_Control_0 5 +#define ICON_Control_1 6 +#define ICON_Leveling_0 7 +#define ICON_Leveling_1 8 +#define ICON_HotendTemp 9 +#define ICON_BedTemp 10 +#define ICON_Speed 11 +#define ICON_Zoffset 12 +#define ICON_Back 13 +#define ICON_File 14 +#define ICON_PrintTime 15 +#define ICON_RemainTime 16 +#define ICON_Setup_0 17 +#define ICON_Setup_1 18 +#define ICON_Pause_0 19 +#define ICON_Pause_1 20 +#define ICON_Continue_0 21 +#define ICON_Continue_1 22 +#define ICON_Stop_0 23 +#define ICON_Stop_1 24 +#define ICON_Bar 25 +#define ICON_More 26 + +#define ICON_Axis 27 +#define ICON_CloseMotor 28 +#define ICON_Homing 29 +#define ICON_SetHome 30 +#define ICON_PLAPreheat 31 +#define ICON_ABSPreheat 32 +#define ICON_Cool 33 +#define ICON_Language 34 + +#define ICON_MoveX 35 +#define ICON_MoveY 36 +#define ICON_MoveZ 37 +#define ICON_Extruder 38 + +#define ICON_Temperature 40 +#define ICON_Motion 41 +#define ICON_WriteEEPROM 42 +#define ICON_ReadEEPROM 43 +#define ICON_ResumeEEPROM 44 +#define ICON_Info 45 + +#define ICON_SetEndTemp 46 +#define ICON_SetBedTemp 47 +#define ICON_FanSpeed 48 +#define ICON_SetPLAPreheat 49 +#define ICON_SetABSPreheat 50 + +#define ICON_MaxSpeed 51 +#define ICON_MaxAccelerated 52 +#define ICON_MaxJerk 53 +#define ICON_Step 54 +#define ICON_PrintSize 55 +#define ICON_Version 56 +#define ICON_Contact 57 +#define ICON_StockConfiguraton 58 +#define ICON_MaxSpeedX 59 +#define ICON_MaxSpeedY 60 +#define ICON_MaxSpeedZ 61 +#define ICON_MaxSpeedE 62 +#define ICON_MaxAccX 63 +#define ICON_MaxAccY 64 +#define ICON_MaxAccZ 65 +#define ICON_MaxAccE 66 +#define ICON_MaxSpeedJerkX 67 +#define ICON_MaxSpeedJerkY 68 +#define ICON_MaxSpeedJerkZ 69 +#define ICON_MaxSpeedJerkE 70 +#define ICON_StepX 71 +#define ICON_StepY 72 +#define ICON_StepZ 73 +#define ICON_StepE 74 +#define ICON_Setspeed 75 +#define ICON_SetZOffset 76 +#define ICON_Rectangle 77 +#define ICON_BLTouch 78 +#define ICON_TempTooLow 79 +#define ICON_AutoLeveling 80 +#define ICON_TempTooHigh 81 +#define ICON_NoTips_C 82 +#define ICON_NoTips_E 83 +#define ICON_Continue_C 84 +#define ICON_Continue_E 85 +#define ICON_Cancel_C 86 +#define ICON_Cancel_E 87 +#define ICON_Confirm_C 88 +#define ICON_Confirm_E 89 +#define ICON_Info_0 90 +#define ICON_Info_1 91 + +/** + * 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 +#define font12x24 0x03 +#define font14x28 0x04 +#define font16x32 0x05 +#define font20x40 0x06 +#define font24x48 0x07 +#define font28x56 0x08 +#define font32x64 0x09 + +// Color +#define Color_White 0xFFFF +#define Color_Yellow 0xFF0F +#define Color_Bg_Window 0x31E8 // Popup background color +#define Color_Bg_Blue 0x1125 // Dark blue background color +#define Color_Bg_Black 0x0841 // Black background color +#define Color_Bg_Red 0xF00F // Red background color +#define Popup_Text_Color 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 uint8_t checkkey; +extern float zprobe_zoffset; +extern char print_filename[16]; + +extern millis_t dwin_heat_time; + +typedef struct { + TERN_(HAS_HOTEND, int16_t E_Temp = 0); + TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); + TERN_(HAS_PREHEAT, int16_t Fan_speed = 0); + int16_t print_speed = 100; + float Max_Feedspeed = 0; + float Max_Acceleration = 0; + float Max_Jerk = 0; + float Max_Step = 0; + float Move_X_scale = 0; + float Move_Y_scale = 0; + float Move_Z_scale = 0; + #if HAS_HOTEND + float Move_E_scale = 0; + #endif + float offset_value = 0; + char show_mode = 0; // -1: Temperature control 0: Printing temperature +} HMI_value_t; + +#define DWIN_CHINESE 123 +#define DWIN_ENGLISH 0 + +typedef struct { + uint8_t language; + bool pause_flag:1; + bool pause_action:1; + bool print_finish:1; + bool done_confirm_flag:1; + bool select_flag:1; + bool home_flag:1; + bool heat_flag:1; // 0: heating done 1: during heating + #if ENABLED(PREVENT_COLD_EXTRUSION) + bool ETempTooLow_flag:1; + #endif + #if HAS_LEVELING + bool leveling_offset_flag:1; + #endif + #if HAS_FAN + AxisEnum feedspeed_axis; + #endif + AxisEnum acc_axis, jerk_axis, step_axis; +} HMI_Flag_t; + +extern HMI_value_t HMI_ValueStruct; +extern HMI_Flag_t HMI_flag; + +// Show ICO +void ICON_Print(bool show); +void ICON_Prepare(bool show); +void ICON_Control(bool show); +void ICON_Leveling(bool show); +void ICON_StartInfo(bool show); + +void ICON_Setting(bool show); +void ICON_Pause(bool show); +void ICON_Continue(bool show); +void ICON_Stop(bool show); + +#if HAS_HOTEND || HAS_HEATED_BED + // Popup message window + void DWIN_Popup_Temperature(const bool toohigh); +#endif + +#if HAS_HOTEND + void Popup_Window_ETempTooLow(); +#endif + +void Popup_Window_Resume(); +void Popup_Window_Home(const bool parking=false); +void Popup_Window_Leveling(); + +void Goto_PrintProcess(); +void Goto_MainMenu(); + +// Variable control +void HMI_Move_X(); +void HMI_Move_Y(); +void HMI_Move_Z(); +void HMI_Move_E(); + +void HMI_Zoffset(); + +TERN_(HAS_HOTEND, void HMI_ETemp()); +TERN_(HAS_HEATED_BED, void HMI_BedTemp()); +TERN_(HAS_FAN, void HMI_FanSpeed()); + +void HMI_PrintSpeed(); + +void HMI_MaxFeedspeedXYZE(); +void HMI_MaxAccelerationXYZE(); +void HMI_MaxJerkXYZE(); +void HMI_StepXYZE(); + +void update_variable(); +void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); + +// SD Card +void HMI_SDCardInit(); +void HMI_SDCardUpdate(); + +// Main Process +void Icon_print(bool value); +void Icon_control(bool value); +void Icon_temperature(bool value); +void Icon_leveling(bool value); + +// Other +void Draw_Status_Area(const bool with_update); // Status Area +void HMI_StartFrame(const bool with_update); // Prepare the menu view +void HMI_MainMenu(); // Main process screen +void HMI_SelectFile(); // File page +void HMI_Printing(); // Print page +void HMI_Prepare(); // Prepare page +void HMI_Control(); // Control page +void HMI_Leveling(); // Level the page +void HMI_AxisMove(); // Axis movement menu +void HMI_Temperature(); // Temperature menu +void HMI_Motion(); // Sports menu +void HMI_Info(); // Information menu +void HMI_Tune(); // Adjust the menu + +#if HAS_PREHEAT + void HMI_PLAPreheatSetting(); // PLA warm-up setting + void HMI_ABSPreheatSetting(); // ABS warm-up setting +#endif + +void HMI_MaxSpeed(); // Maximum speed submenu +void HMI_MaxAcceleration(); // Maximum acceleration submenu +void HMI_MaxJerk(); // Maximum jerk speed submenu +void HMI_Step(); // Transmission ratio + +void HMI_Init(); +void DWIN_Update(); +void EachMomentUpdate(); +void DWIN_HandleScreen(); + +void DWIN_CompletedHoming(); +void DWIN_CompletedLeveling(); diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp new file mode 100644 index 00000000..d39c6cfb --- /dev/null +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.cpp @@ -0,0 +1,254 @@ +/** + * 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 rotary_encoder.cpp + * @author LEO / Creality3D + * @date 2019/07/06 + * @version 2.0.1 + * @brief Rotary encoder functions + *****************************************************************************/ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(DWIN_CREALITY_LCD) + +#include "rotary_encoder.h" + +#include "../../../MarlinCore.h" +#include "../../../HAL/shared/Delay.h" + +#if HAS_BUZZER + #include "../../../libs/buzzer.h" +#endif + +#include + +ENCODER_Rate EncoderRate; + +// Buzzer +void Encoder_tick(void) { + WRITE(BEEPER_PIN, 1); + delay(10); + WRITE(BEEPER_PIN, 0); +} + +// Encoder initialization +void Encoder_Configuration(void) { + #if BUTTON_EXISTS(EN1) + SET_INPUT_PULLUP(BTN_EN1); + #endif + #if BUTTON_EXISTS(EN2) + SET_INPUT_PULLUP(BTN_EN2); + #endif + #if BUTTON_EXISTS(ENC) + SET_INPUT_PULLUP(BTN_ENC); + #endif + #ifdef BEEPER_PIN + SET_OUTPUT(BEEPER_PIN); + #endif +} + +// Analyze encoder value and return state +ENCODER_DiffState Encoder_ReceiveAnalyze(void) { + const millis_t now = millis(); + static unsigned char lastEncoderBits; + unsigned char newbutton = 0; + static signed char temp_diff = 0; + + ENCODER_DiffState temp_diffState = ENCODER_DIFF_NO; + if (BUTTON_PRESSED(EN1)) newbutton |= 0x01; + if (BUTTON_PRESSED(EN2)) newbutton |= 0x02; + if (BUTTON_PRESSED(ENC)) { + static millis_t next_click_update_ms; + if (ELAPSED(now, next_click_update_ms)) { + next_click_update_ms = millis() + 300; + Encoder_tick(); + #if PIN_EXISTS(LCD_LED) + //LED_Action(); + #endif + 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; + } + if (newbutton != lastEncoderBits) { + switch (newbutton) { + case ENCODER_PHASE_0: { + if (lastEncoderBits == ENCODER_PHASE_3) temp_diff++; + else if (lastEncoderBits == ENCODER_PHASE_1) temp_diff--; + }break; + case ENCODER_PHASE_1: { + if (lastEncoderBits == ENCODER_PHASE_0) temp_diff++; + else if (lastEncoderBits == ENCODER_PHASE_2) temp_diff--; + }break; + case ENCODER_PHASE_2: { + if (lastEncoderBits == ENCODER_PHASE_1) temp_diff++; + else if (lastEncoderBits == ENCODER_PHASE_3) temp_diff--; + }break; + case ENCODER_PHASE_3: { + if (lastEncoderBits == ENCODER_PHASE_2) temp_diff++; + else if (lastEncoderBits == ENCODER_PHASE_0) temp_diff--; + }break; + } + lastEncoderBits = newbutton; + } + + if (abs(temp_diff) >= ENCODER_PULSES_PER_STEP) { + if (temp_diff > 0) temp_diffState = ENCODER_DIFF_CW; + else temp_diffState = ENCODER_DIFF_CCW; + + #if ENABLED(ENCODER_RATE_MULTIPLIER) + + millis_t ms = millis(); + int32_t encoderMultiplier = 1; + + // if must encoder rati multiplier + if (EncoderRate.enabled) { + const float abs_diff = ABS(temp_diff), + encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); + if (EncoderRate.lastEncoderTime) { + // Note that the rate is always calculated between two passes through the + // loop and that the abs of the temp_diff value is tracked. + const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000; + if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; + else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; + else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5; + } + EncoderRate.lastEncoderTime = ms; + } + #else + constexpr int32_t encoderMultiplier = 1; + #endif // ENCODER_RATE_MULTIPLIER + + // EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); + EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); + if (EncoderRate.encoderMoveValue < 0) EncoderRate.encoderMoveValue = -EncoderRate.encoderMoveValue; + + temp_diff = 0; + } + return temp_diffState; +} + +#if PIN_EXISTS(LCD_LED) + + // Take the low 24 valid bits 24Bit: G7 G6 G5 G4 G3 G2 G1 G0 R7 R6 R5 R4 R3 R2 R1 R0 B7 B6 B5 B4 B3 B2 B1 B0 + unsigned int LED_DataArray[LED_NUM]; + + // LED light operation + void LED_Action(void) { + LED_Control(RGB_SCALE_WARM_WHITE,0x0F); + delay(30); + LED_Control(RGB_SCALE_WARM_WHITE,0x00); + } + + // LED initialization + void LED_Configuration(void) { + SET_OUTPUT(LCD_LED_PIN); + } + + // LED write data + void LED_WriteData(void) { + unsigned char tempCounter_LED, tempCounter_Bit; + for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) { + for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) { + if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) { + LED_DATA_HIGH; + DELAY_NS(300); + LED_DATA_LOW; + DELAY_NS(200); + } + else { + LED_DATA_HIGH; + LED_DATA_LOW; + DELAY_NS(200); + } + } + } + } + + // LED control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) + void LED_Control(unsigned char RGB_Scale, unsigned char luminance) { + unsigned char temp_Counter; + for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { + LED_DataArray[temp_Counter] = 0; + switch (RGB_Scale) { + case RGB_SCALE_R10_G7_B5: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*5/10; break; + case RGB_SCALE_R10_G7_B4: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*7/10) << 16 | luminance*4/10; break; + case RGB_SCALE_R10_G8_B7: LED_DataArray[temp_Counter] = (luminance*10/10) << 8 | (luminance*8/10) << 16 | luminance*7/10; break; + } + } + LED_WriteData(); + } + + // LED gradient control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) + // change_Time: gradient time (ms) + void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval) { + unsigned char temp_Counter; + unsigned char LED_R_Data[LED_NUM], LED_G_Data[LED_NUM], LED_B_Data[LED_NUM]; + bool LED_R_Flag = 0, LED_G_Flag = 0, LED_B_Flag = 0; + + for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { + switch (RGB_Scale) { + case RGB_SCALE_R10_G7_B5: { + LED_R_Data[temp_Counter] = luminance*10/10; + LED_G_Data[temp_Counter] = luminance*7/10; + LED_B_Data[temp_Counter] = luminance*5/10; + }break; + case RGB_SCALE_R10_G7_B4: { + LED_R_Data[temp_Counter] = luminance*10/10; + LED_G_Data[temp_Counter] = luminance*7/10; + LED_B_Data[temp_Counter] = luminance*4/10; + }break; + case RGB_SCALE_R10_G8_B7: { + LED_R_Data[temp_Counter] = luminance*10/10; + LED_G_Data[temp_Counter] = luminance*8/10; + LED_B_Data[temp_Counter] = luminance*7/10; + }break; + } + } + for (temp_Counter = 0; temp_Counter < LED_NUM; temp_Counter++) { + if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) > LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000100; + else if ((unsigned char)(LED_DataArray[temp_Counter] >> 8) < LED_R_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000100; + while (1) { + else LED_R_Flag = 1; + if ((unsigned char)(LED_DataArray[temp_Counter]>>16) > LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x010000; + else if ((unsigned char)(LED_DataArray[temp_Counter]>>16) < LED_G_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x010000; + else LED_G_Flag = 1; + if ((unsigned char)LED_DataArray[temp_Counter] > LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] -= 0x000001; + else if ((unsigned char)LED_DataArray[temp_Counter] < LED_B_Data[temp_Counter]) LED_DataArray[temp_Counter] += 0x000001; + else LED_B_Flag = 1; + } + LED_WriteData(); + if (LED_R_Flag && LED_G_Flag && LED_B_Flag) break; + else delay(change_Interval); + } + } + +#endif // LCD_LED + +#endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.h new file mode 100644 index 00000000..93e54839 --- /dev/null +++ b/Marlin/src/lcd/dwin/e3v2/rotary_encoder.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 + +/***************************************************************************** + * @file rotary_encoder.h + * @author LEO / Creality3D + * @date 2019/07/06 + * @version 2.0.1 + * @brief Rotary encoder functions + ****************************************************************************/ + +#include "../../../inc/MarlinConfig.h" +#include "../../../MarlinCore.h" + +/*********************** Encoder Set ***********************/ + +#define ENCODER_PHASE_0 0 +#define ENCODER_PHASE_1 2 +#define ENCODER_PHASE_2 3 +#define ENCODER_PHASE_3 1 + +#define ENCODER_PULSES_PER_STEP 4 + +#define BUTTON_PRESSED(BN) !READ(BTN_## BN) + +typedef struct { + bool enabled = false; + int encoderMoveValue = 0; + millis_t lastEncoderTime = 0; +} ENCODER_Rate; + +extern ENCODER_Rate EncoderRate; + +typedef enum { + ENCODER_DIFF_NO = 0, // no state + ENCODER_DIFF_CW = 1, // clockwise rotation + ENCODER_DIFF_CCW = 2, // counterclockwise rotation + ENCODER_DIFF_ENTER = 3 // click +} ENCODER_DiffState; + +// Encoder initialization +void Encoder_Configuration(void); + +// Analyze encoder value and return state +ENCODER_DiffState Encoder_ReceiveAnalyze(void); + +/*********************** Encoder LED ***********************/ + +#if PIN_EXISTS(LCD_LED) + + #define LED_NUM 4 + #define LED_DATA_HIGH WRITE(LCD_LED_PIN, 1) + #define LED_DATA_LOW WRITE(LCD_LED_PIN, 0) + + #define RGB_SCALE_R10_G7_B5 1 + #define RGB_SCALE_R10_G7_B4 2 + #define RGB_SCALE_R10_G8_B7 3 + #define RGB_SCALE_NEUTRAL_WHITE RGB_SCALE_R10_G7_B5 + #define RGB_SCALE_WARM_WHITE RGB_SCALE_R10_G7_B4 + #define RGB_SCALE_COOL_WHITE RGB_SCALE_R10_G8_B7 + + extern unsigned int LED_DataArray[LED_NUM]; + + // LED light operation + void LED_Action(void); + + // LED initialization + void LED_Configuration(void); + + // LED write data + void LED_WriteData(void); + + // LED control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) + void LED_Control(unsigned char RGB_Scale, unsigned char luminance); + + // LED gradient control + // RGB_Scale: RGB color ratio + // luminance: brightness (0~0xFF) + // change_Time: gradient time (ms) + void LED_GraduallyControl(unsigned char RGB_Scale, unsigned char luminance, unsigned int change_Interval); + +#endif // LCD_LED 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 00000000..a7f9a7a0 --- /dev/null +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -0,0 +1,121 @@ +/** + * 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 . + * + */ + +/** + * lcd/extui/anycubic_chiron_lcd.cpp + * + * Anycubic Chiron TFT support for Marlin + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "ui_api.h" +#include "lib/anycubic_chiron/chiron_tft.h" + +using namespace Anycubic; + +namespace ExtUI { + + void onStartup() { Chiron.Startup(); } + + void onIdle() { Chiron.IdleLoop(); } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { + Chiron.PrinterKilled(error,component); + } + + void onMediaInserted() { Chiron.MediaEvent(AC_media_inserted); } + void onMediaError() { Chiron.MediaEvent(AC_media_error); } + void onMediaRemoved() { Chiron.MediaEvent(AC_media_removed); } + + void onPlayTone(const uint16_t frequency, const uint16_t duration) { + #if ENABLED(SPEAKER) + ::tone(BEEPER_PIN, frequency, duration); + #endif + } + + void onPrintTimerStarted() { Chiron.TimerEvent(AC_timer_started); } + void onPrintTimerPaused() { Chiron.TimerEvent(AC_timer_paused); } + void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); } + void onFilamentRunout(const extruder_t) { Chiron.FilamentRunout(); } + void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); } + void onStatusChanged(const char * const msg) { Chiron.StatusChange(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. + } + + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + // Called to indicate a special condition + //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " state:", state); + } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + // Called on resume from power-loss + void onPowerLossResume() { Chiron.PowerLossRecovery(); } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + } + #endif +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp new file mode 100644 index 00000000..15526d16 --- /dev/null +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.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 . + * + */ + +/** + * anycubic_i3mega_lcd.cpp + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_I3MEGA) + +#include "lib/anycubic_i3mega/anycubic_i3mega_lcd.h" +#include "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_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp new file mode 100644 index 00000000..d175b5ac --- /dev/null +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -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 . + * + */ + +/** + * dgus_lcd.cpp + * + * DGUS implementation for Marlin by coldtobi, Feb-May 2019 + */ + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_DGUS_LCD + +#include "ui_api.h" +#include "lib/dgus/DGUSDisplay.h" +#include "lib/dgus/DGUSDisplayDef.h" +#include "lib/dgus/DGUSScreenHandler.h" + +extern const char NUL_STR[]; + +namespace ExtUI { + + void onStartup() { + dgusdisplay.InitDisplay(); + ScreenHandler.UpdateScreenVPData(); + } + + void onIdle() { ScreenHandler.loop(); } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { + ScreenHandler.sendinfoscreen(GET_TEXT(MSG_HALTED), error, NUL_STR, GET_TEXT(MSG_PLEASE_RESET), true, true, true, true); + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_KILL); + while (!ScreenHandler.loop()); // Wait while anything is left to be sent + } + + void onMediaInserted() { TERN_(SDSUPPORT, ScreenHandler.SDCardInserted()); } + void onMediaError() { TERN_(SDSUPPORT, ScreenHandler.SDCardError()); } + void onMediaRemoved() { TERN_(SDSUPPORT, ScreenHandler.SDCardRemoved()); } + + void onPlayTone(const uint16_t frequency, const uint16_t duration) {} + void onPrintTimerStarted() {} + void onPrintTimerPaused() {} + void onPrintTimerStopped() {} + void onFilamentRunout(const extruder_t extruder) {} + + void onUserConfirmRequired(const char * const msg) { + if (msg) { + ScreenHandler.sendinfoscreen(PSTR("Please confirm."), nullptr, msg, nullptr, true, true, false, true); + ScreenHandler.SetupConfirmAction(ExtUI::setUserConfirmed); + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP ) { + ScreenHandler.SetupConfirmAction(nullptr); + ScreenHandler.PopToOldScreen(); + } + } + + void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(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. + } + + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + // Called to indicate a special condition + } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { + // Called on resume from power-loss + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); + } + #endif + + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + switch (rst) { + case PID_BAD_EXTRUDER_NUM: + ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_BAD_EXTRUDER_NUM)); + break; + case PID_TEMP_TOO_HIGH: + ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_TEMP_TOO_HIGH)); + break; + case PID_TUNING_TIMEOUT: + ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_TIMEOUT)); + break; + case PID_DONE: + ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_AUTOTUNE_DONE)); + break; + } + ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); + } + #endif + +} +#endif // HAS_DGUS_LCD diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp new file mode 100644 index 00000000..a5ef5652 --- /dev/null +++ b/Marlin/src/lcd/extui/example.cpp @@ -0,0 +1,115 @@ +/********************* + * example.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 "../../inc/MarlinConfigPre.h" + +#if BOTH(EXTUI_EXAMPLE, EXTENSIBLE_UI) + +#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 +// ExtUI methods in "../ui_api.h" +// +// Although it may be possible to access other state +// variables from Marlin, using the API here possibly +// helps ensure future compatibility. + +namespace ExtUI { + void onStartup() { + /* Initialize the display module here. The following + * routines are available for access to the GPIO pins: + * + * SET_OUTPUT(pin) + * SET_INPUT_PULLUP(pin) + * SET_INPUT(pin) + * WRITE(pin,value) + * READ(pin) + */ + } + void onIdle() {} + void onPrinterKilled(PGM_P const error, PGM_P const component) {} + void onMediaInserted() {}; + void onMediaError() {}; + void onMediaRemoved() {}; + void onPlayTone(const uint16_t frequency, const uint16_t duration) {} + void onPrintTimerStarted() {} + void onPrintTimerPaused() {} + void onPrintTimerStopped() {} + void onFilamentRunout(const extruder_t extruder) {} + void onUserConfirmRequired(const char * const 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. + } + + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + // Called to indicate a special condition + } + #endif + + #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 // EXTUI_EXAMPLE && EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp new file mode 100644 index 00000000..fb4c84ab --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -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 . + * + */ + +/** + * lcd/extui/lib/FileNavigator.cpp + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +/*************************************************************************** + * The AC panel wants files in block of 4 and can only display a flat list * + * This library allows full folder traversal. * + ***************************************************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "FileNavigator.h" +#include "chiron_tft.h" + +using namespace ExtUI; + +namespace Anycubic { + + FileList FileNavigator::filelist; // Instance of the Marlin file API + char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path + uint16_t FileNavigator::lastindex; + uint8_t FileNavigator::folderdepth; + uint16_t FileNavigator::currentindex; // override the panel request + + FileNavigator::FileNavigator() { reset(); } + + void FileNavigator::reset() { + currentfoldername[0] = '\0'; + folderdepth = 0; + currentindex = 0; + lastindex = 0; + // Start at root folder + while (!filelist.isAtRootDir()) filelist.upDir(); + refresh(); + } + + void FileNavigator::refresh() { filelist.refresh(); } + + void FileNavigator::getFiles(uint16_t index) { + uint8_t files = 4; + if (index == 0) currentindex = 0; + + // Each time we change folder we reset the file index to 0 and keep track + // of the current position as the TFT panel isnt aware of folders trees. + if (index > 0) { + --currentindex; // go back a file to take account off the .. we added to the root. + if (index > lastindex) + currentindex += files; + else + currentindex = currentindex < 4 ? 0 : currentindex - files; + } + lastindex = index; + + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("index=", index, " currentindex=", currentindex); + #endif + + if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder + TFTSer.println("<<"); + TFTSer.println(".."); + files--; + } + + for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { + if (filelist.seek(seek)) { + sendFile(); + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + #endif + } + } + } + + void FileNavigator::sendFile() { + // send the file and folder info to the panel + // this info will be returned when the file is selected + // Permitted special characters in file name -_*#~ + // Panel can display 22 characters per line + if (filelist.isDir()) { + //TFTSer.print(currentfoldername); + TFTSer.println(filelist.shortFilename()); + TFTSer.print(filelist.shortFilename()); + TFTSer.println("/"); + } + else { + // Logical Name + TFTSer.print("/"); + if (folderdepth > 0) TFTSer.print(currentfoldername); + + TFTSer.println(filelist.shortFilename()); + + // Display Name + TFTSer.println(filelist.longFilename()); + } + } + void FileNavigator::changeDIR(char *folder) { + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder); + #endif + if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth + strcat(currentfoldername, folder); + strcat(currentfoldername, "/"); + filelist.changeDir(folder); + refresh(); + folderdepth++; + currentindex = 0; + } + + void FileNavigator::upDIR() { + filelist.upDir(); + refresh(); + folderdepth--; + currentindex = 0; + // Remove the last child folder from the stored path + if (folderdepth == 0) { + currentfoldername[0] = '\0'; + reset(); + } + else { + char *pos = nullptr; + for (uint8_t f = 0; f < folderdepth; f++) + pos = strchr(currentfoldername, '/'); + + *(pos + 1) = '\0'; + } + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername); + #endif + } + + char* FileNavigator::getCurrentFolderName() { return currentfoldername; } +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h new file mode 100644 index 00000000..8e03614a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.h @@ -0,0 +1,56 @@ +/** + * 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 + +/** + * lcd/extui/lib/FileNavigator.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#include "chiron_tft_defs.h" +#include "../../ui_api.h" + +using namespace ExtUI; + +namespace Anycubic { + class FileNavigator { + public: + FileNavigator(); + void reset(); + void getFiles(uint16_t); + void upDIR(); + void changeDIR(char *); + void sendFile(); + void refresh(); + char * getCurrentFolderName(); + private: + static FileList filelist; + static char currentfoldername[MAX_PATH_LEN]; + static uint16_t lastindex; + static uint8_t folderdepth; + static uint16_t currentindex; + }; + extern FileNavigator filenavigator; +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.cpp new file mode 100644 index 00000000..f09c4db3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.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 . + * + */ + +/** + * lcd/extui/lib/Tunes.cpp + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +/*********************************************************************** + * A Utility to play tunes using the buzzer in the printer controller. * + * See Tunes.h for note and tune definitions. * + ***********************************************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "Tunes.h" +#include "../../ui_api.h" + +namespace Anycubic { + + void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed=1) { + uint8_t pos = 1; + uint16_t wholenotelen = tune[0] / speed; + do { + uint16_t freq = tune[pos]; + uint16_t notelen = wholenotelen / tune[pos + 1]; + + ::tone(beeperPin, freq, notelen); + ExtUI::delay_ms(notelen); + pos += 2; + + if (pos >= MAX_TUNE_LENGTH) break; + } while (tune[pos] != n_END); + } + +} + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h new file mode 100644 index 00000000..1bafec43 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/Tunes.h @@ -0,0 +1,224 @@ +/** + * 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 + +/** + * lcd/extui/lib/Tunes.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +/************************************************************************** + * Notes definition from https://pages.mtu.edu/~suits/NoteFreqCalcs.html * + * * + * The format of a tune is: * + * {,,, ,, ... } * + * * + * 1) The first value is the length of a whole note in milliseconds * + * 2) Then a sequence of pitch and duration pairs * + * 3) Finally the END marker so your tunes can be any length up to * + * MAX_TUNE_LEN * + *************************************************************************/ + +#include + +#define MAX_TUNE_LENGTH 128 + +// Special notes! +#define n_P 0 // silence or pause +#define n_END 10000 // end of tune marker + +// Note duration divisors +#define l_T1 1 +#define l_T2 2 +#define l_T3 3 +#define l_T4 4 +#define l_T8 8 +#define l_T16 16 + +// Note Frequency +#define n_C0 16 +#define n_CS0 17 +#define n_D0 18 +#define n_DS0 19 +#define n_E0 21 +#define n_F0 22 +#define n_FS0 23 +#define n_G0 25 +#define n_GS0 26 +#define n_A0 28 +#define n_AS0 29 +#define n_B0 31 +#define n_C1 33 +#define n_CS1 35 +#define n_D1 37 +#define n_DS1 39 +#define n_E1 41 +#define n_F1 44 +#define n_FS1 46 +#define n_G1 49 +#define n_GS1 52 +#define n_A1 55 +#define n_AS1 58 +#define n_B1 62 +#define n_C2 65 +#define n_CS2 69 +#define n_D2 73 +#define n_DS2 78 +#define n_E2 82 +#define n_F2 87 +#define n_FS2 93 +#define n_G2 98 +#define n_GS2 104 +#define n_A2 110 +#define n_AS2 117 +#define n_B2 123 +#define n_C3 131 +#define n_CS3 139 +#define n_D3 147 +#define n_DS3 156 +#define n_E3 165 +#define n_F3 175 +#define n_FS3 185 +#define n_G3 196 +#define n_GS3 208 +#define n_A3 220 +#define n_AS3 233 +#define n_B3 247 +#define n_C4 262 +#define n_CS4 277 +#define n_D4 294 +#define n_DS4 311 +#define n_E4 330 +#define n_F4 349 +#define n_FS4 370 +#define n_G4 392 +#define n_GS4 415 +#define n_A4 440 +#define n_AS4 466 +#define n_B4 494 +#define n_C5 523 +#define n_CS5 554 +#define n_D5 587 +#define n_DS5 622 +#define n_E5 659 +#define n_F5 698 +#define n_FS5 740 +#define n_G5 784 +#define n_GS5 831 +#define n_A5 880 +#define n_AS5 932 +#define n_B5 988 +#define n_C6 1047 +#define n_CS6 1109 +#define n_D6 1175 +#define n_DS6 1245 +#define n_E6 1319 +#define n_F6 1397 +#define n_FS6 1480 +#define n_G6 1568 +#define n_GS6 1661 +#define n_A6 1760 +#define n_AS6 1865 +#define n_B6 1976 +#define n_C7 2093 +#define n_CS7 2217 +#define n_D7 2349 +#define n_DS7 2489 +#define n_E7 2637 +#define n_F7 2794 +#define n_FS7 2960 +#define n_G7 3136 +#define n_GS7 3322 +#define n_A7 3520 +#define n_AS7 3729 +#define n_B7 3951 +#define n_C8 4186 +#define n_CS8 4435 +#define n_D8 4699 +#define n_DS8 4978 +#define n_E8 5274 +#define n_F8 5587 +#define n_FS8 5920 +#define n_G8 6272 +#define n_GS8 6645 +#define n_A8 7040 +#define n_AS8 7459 +#define n_B8 7902 + +namespace Anycubic { + + void PlayTune(uint8_t beeperPin, const uint16_t *tune, uint8_t speed); + + // Only uncomment the tunes you are using to save memory + // This will help you write tunes! + // https://www.apronus.com/music/flashpiano.htm + + const uint16_t SOS[] = { + 250, + n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1, + n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T3, n_G6,l_T1, n_P,l_T1, + n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T3, n_G6,l_T3, n_P,l_T1, + n_END + }; + + const uint16_t BeepBeep[] = { + 500, + n_C7,l_T8, n_P,l_T16, n_C7,l_T8, n_P,l_T8, + n_END + }; + + const uint16_t BeepBeepBeeep[] = { + 1000, + n_G7,l_T4, n_P,l_T16, n_G7,l_T4, n_P,l_T8, n_G7,l_T2, + n_END + }; + + const uint16_t Anycubic_PowerOn[] = { + 1000, + n_F7,l_T8, n_P,l_T8, n_C7,l_T8, n_P,l_T8, n_D7,l_T8, n_P,l_T8, + n_E7,l_T8, n_P,l_T8, n_D7,l_T4, n_P,l_T4, n_G7,l_T4, n_P,l_T4, + n_A7,l_T2, n_P,l_T1, + n_END + }; + + const uint16_t GB_PowerOn[] = { + 500, + n_C6,l_T4, n_P,l_T16, n_C7,l_T2, n_P,l_T8, + n_END + }; + + const uint16_t Heater_Timedout[] = { + 1000, + n_C6,l_T1, + n_END + }; + + const uint16_t FilamentOut[] = { + 1000, + n_AS7,l_T4, n_P,l_T16, n_FS7,l_T2, + n_END + }; + +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp new file mode 100644 index 00000000..5e492573 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -0,0 +1,896 @@ +/** + * 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 . + * + */ + +/** + * lcd/extui/lib/chiron_tft.cpp + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(ANYCUBIC_LCD_CHIRON) + +#include "chiron_tft.h" +#include "Tunes.h" +#include "FileNavigator.h" + +#include "../../../../gcode/queue.h" +#include "../../../../sd/cardreader.h" +#include "../../../../libs/numtostr.h" +#include "../../../../MarlinCore.h" +namespace Anycubic { + + printer_state_t ChironTFT::printer_state; + paused_state_t ChironTFT::pause_state; + heater_state_t ChironTFT::hotend_state; + heater_state_t ChironTFT::hotbed_state; + xy_uint8_t ChironTFT::selectedmeshpoint; + char ChironTFT::selectedfile[MAX_PATH_LEN]; + char ChironTFT::panel_command[MAX_CMND_LEN]; + uint8_t ChironTFT::command_len; + float ChironTFT::live_Zoffset; + file_menu_t ChironTFT::file_menu; + + ChironTFT::ChironTFT(){} + + void ChironTFT::Startup() { + selectedfile[0] = '\0'; + panel_command[0] = '\0'; + command_len = 0; + printer_state = AC_printer_idle; + pause_state = AC_paused_idle; + hotend_state = AC_heater_off; + hotbed_state = AC_heater_off; + live_Zoffset = 0.0; + file_menu = AC_menu_file; + + // Setup pins for powerloss detection + // Two IO pins are connected on the Trigorilla Board + // On a power interruption the OUTAGECON_PIN goes low. + + #if ENABLED(POWER_LOSS_RECOVERY) + OUT_WRITE(OUTAGECON_PIN, HIGH); + #endif + + // Filament runout is handled by Marlin settings in Configuration.h + // set FIL_RUNOUT_STATE HIGH // Pin state indicating that filament is NOT present. + // enable FIL_RUNOUT_PULLUP + + TFTSer.begin(115200); + + // Signal Board has reset + SendtoTFTLN(AC_msg_main_board_has_reset); + + safe_delay(200); + + // Enable levelling and Disable end stops during print + // as Z home places nozzle above the bed so we need to allow it past the end stops + injectCommands_P(AC_cmnd_enable_levelling); //M211 S0\n")); + + // Startup tunes are defined in Tunes.h + //PlayTune(BEEPER_PIN, Anycubic_PowerOn, 1); + PlayTune(BEEPER_PIN, GB_PowerOn, 1); + #if ACDEBUGLEVEL + SERIAL_ECHOLNPAIR("AC Debug Level ", ACDEBUGLEVEL); + #endif + SendtoTFTLN(AC_msg_ready); + } + + void ChironTFT::IdleLoop() { + if (ReadTFTCommand()) { + ProcessPanelRequest(); + command_len = 0; + } + CheckHeaters(); + } + + void ChironTFT::PrinterKilled(PGM_P error,PGM_P component) { + SendtoTFTLN(AC_msg_kill_lcd); + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("PrinterKilled()\nerror: ", error , "\ncomponent: ", component); + #endif + } + + void ChironTFT::MediaEvent(media_event_t event) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("ProcessMediaStatus() ", event); + #endif + switch (event) { + case AC_media_inserted: + SendtoTFTLN(AC_msg_sd_card_inserted); + break; + + case AC_media_removed: + SendtoTFTLN(AC_msg_sd_card_removed); + break; + + case AC_media_error: + SendtoTFTLN(AC_msg_no_sd_card); + break; + } + } + + void ChironTFT::TimerEvent(timer_event_t event) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("TimerEvent() ", event); + SERIAL_ECHOLNPAIR("Printer State: ", printer_state); + #endif + + switch (event) { + case AC_timer_started: { + live_Zoffset = 0.0; // reset print offset + setSoftEndstopState(false); // disable endstops to print + printer_state = AC_printer_printing; + SendtoTFTLN(AC_msg_print_from_sd_card); + } break; + + case AC_timer_paused: { + printer_state = AC_printer_paused; + pause_state = AC_paused_idle; + SendtoTFTLN(AC_msg_paused); + } break; + + case AC_timer_stopped: { + if (printer_state != AC_printer_idle) { + printer_state = AC_printer_stopping; + SendtoTFTLN(AC_msg_print_complete); + } + setSoftEndstopState(true); // enable endstops + } break; + } + } + + void ChironTFT::FilamentRunout() { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("FilamentRunout() printer_state ", printer_state); + #endif + // 1 Signal filament out + SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); + //printer_state = AC_printer_filament_out; + PlayTune(BEEPER_PIN, FilamentOut, 1); + } + + void ChironTFT::ConfirmationRequest(const char * const msg) { + // M108 continue + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); + #endif + switch (printer_state) { + case AC_printer_pausing: { + if ( (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) || (strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0 ) ) { + SendtoTFTLN(AC_msg_paused); // enable continue button + printer_state = AC_printer_paused; + } + } break; + + case AC_printer_resuming_from_power_outage: + case AC_printer_printing: + case AC_printer_paused: { + // Heater timout, send acknowledgement + if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0 ) { + pause_state = AC_paused_heater_timed_out; + SendtoTFTLN(AC_msg_paused); // enable continue button + PlayTune(BEEPER_PIN,Heater_Timedout,1); + } + // Reheat finished, send acknowledgement + else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0 ) { + pause_state = AC_paused_idle; + SendtoTFTLN(AC_msg_paused); // enable continue button + } + // Filament Purging, send acknowledgement enter run mode + else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0 ) { + pause_state = AC_paused_purging_filament; + SendtoTFTLN(AC_msg_paused); // enable continue button + } + } break; + default: + break; + } + } + + void ChironTFT::StatusChange(const char * const msg) { + #if ACDEBUG(AC_MARLIN) + SERIAL_ECHOLNPAIR("StatusChange() ", msg); + SERIAL_ECHOLNPAIR("printer_state:", printer_state); + #endif + bool msg_matched = false; + // The only way to get printer status is to parse messages + // Use the state to minimise the work we do here. + switch (printer_state) { + case AC_printer_probing: { + // If probing completes ok save the mesh and park + if (strcmp_P(msg, MARLIN_msg_ready) == 0 ) { + injectCommands_P(PSTR("M500\nG27")); + SendtoTFTLN(AC_msg_probing_complete); + printer_state = AC_printer_idle; + msg_matched = true; + } + // If probing fails dont save the mesh raise the probe above the bad point + if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0 ) { + PlayTune(BEEPER_PIN, BeepBeepBeeep, 1); + injectCommands_P(PSTR("G1 Z50 F500")); + SendtoTFTLN(AC_msg_probing_complete); + printer_state = AC_printer_idle; + msg_matched = true; + } + } break; + + case AC_printer_printing: { + if (strcmp_P(msg, MARLIN_msg_reheating) == 0 ) { + SendtoTFTLN(AC_msg_paused); // enable continue button + msg_matched = true; + } + } break; + + case AC_printer_pausing: { + if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 ) { + SendtoTFTLN(AC_msg_paused); + printer_state = AC_printer_paused; + pause_state = AC_paused_idle; + msg_matched = true; + } + } break; + + case AC_printer_stopping: { + if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0 ) { + SendtoTFTLN(AC_msg_stop); + printer_state = AC_printer_idle; + msg_matched = true; + } + } break; + default: + break; + } + + // If not matched earlier see if this was a heater message + if (!msg_matched) { + if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { + SendtoTFTLN(AC_msg_nozzle_heating); + hotend_state = AC_heater_temp_set; + } + else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { + SendtoTFTLN(AC_msg_bed_heating); + hotbed_state = AC_heater_temp_set; + } + } + } + + void ChironTFT::PowerLossRecovery() { + printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. + PlayTune(BEEPER_PIN, SOS, 1); + SERIAL_ECHOLNPGM("Resuming from power outage..."); + SERIAL_ECHOLNPGM("Select SD file then press resume"); + } + + void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel + #if ACDEBUG(AC_SOME) + serialprintPGM(str); + #endif + while (const char c = pgm_read_byte(str++)) TFTSer.print(c); + } + + void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { + if (str != nullptr) { + #if ACDEBUG(AC_SOME) + SERIAL_ECHO("> "); + #endif + SendtoTFT(str); + #if ACDEBUG(AC_SOME) + SERIAL_EOL(); + #endif + } + TFTSer.println(""); + } + + bool ChironTFT::ReadTFTCommand() { + bool command_ready = false; + while( (TFTSer.available() > 0) && (command_len < MAX_CMND_LEN) ) { + panel_command[command_len] = TFTSer.read(); + if(panel_command[command_len] == '\n') { + command_ready = true; + break; + } + command_len++; + } + + if(command_ready) { + panel_command[command_len] = 0x00; + #if ACDEBUG(AC_ALL) + SERIAL_ECHOLNPAIR("< ", panel_command); + #endif + #if ACDEBUG(AC_SOME) + // Ignore status request commands + uint8_t req = atoi(&panel_command[1]); + if (req > 7 && req != 20) { + SERIAL_ECHOLNPAIR("> ", panel_command); + SERIAL_ECHOLNPAIR("printer_state:", printer_state); + } + #endif + } + return command_ready; + } + + int8_t ChironTFT::Findcmndpos(const char * buff, char q) { + bool found = false; + int8_t pos = 0; + do { + if (buff[pos] == q) { + found = true; + break; + } + pos ++; + } while(pos < MAX_CMND_LEN); + if (found) return pos; + return -1; + } + + void ChironTFT::CheckHeaters() { + uint8_t faultDuration = 0; float temp = 0; + + // if the hotend temp is abnormal, confirm state before signalling panel + temp = getActualTemp_celsius(E0); + if ( (temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ) { + do { + faultDuration ++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR("Extruder temp abnormal! : ", temp); + break; + } + delay_ms(500); + temp = getActualTemp_celsius(E0); + } while ((temp <= HEATER_0_MINTEMP) || (temp >= HEATER_0_MAXTEMP) ); + } + + // if the hotbed temp is abnormal, confirm state before signalling panel + faultDuration = 0; + temp = getActualTemp_celsius(BED); + if ( (temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ) { + do { + faultDuration ++; + if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { + SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + SERIAL_ECHOLNPAIR_P("Bed temp abnormal! : ", temp); + break; + } + delay_ms(500); + temp = getActualTemp_celsius(E0); + } while ((temp <= BED_MINTEMP) || (temp >= BED_MAXTEMP) ); + } + + // Update panel with hotend heater status + if (hotend_state != AC_heater_temp_reached) { + if ( WITHIN( getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1 ) ) { + SendtoTFTLN(AC_msg_nozzle_heating_done); + hotend_state = AC_heater_temp_reached; + } + } + + // Update panel with bed heater status + if (hotbed_state != AC_heater_temp_reached) { + if ( WITHIN( getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5 ) ) { + SendtoTFTLN(AC_msg_bed_heating_done); + hotbed_state = AC_heater_temp_reached; + } + } + } + + void ChironTFT::SendFileList(int8_t startindex) { + // respond to panel request for 4 files starting at index + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("## SendFileList ## ", startindex); + #endif + SendtoTFTLN(PSTR("FN ")); + filenavigator.getFiles(startindex); + SendtoTFTLN(PSTR("END")); + } + + void ChironTFT::SelectFile() { + strncpy(selectedfile,panel_command+4,command_len-4); + selectedfile[command_len-5] = '\0'; + #if ACDEBUG(AC_FILE) + SERIAL_ECHOLNPAIR_F(" Selected File: ",selectedfile); + #endif + switch (selectedfile[0]) { + case '/': // Valid file selected + SendtoTFTLN(AC_msg_sd_file_open_success); + break; + + case '<': // .. (go up folder level) + filenavigator.upDIR(); + SendtoTFTLN(AC_msg_sd_file_open_failed); + SendFileList( 0 ); + break; + default: // enter sub folder + filenavigator.changeDIR(selectedfile); + SendtoTFTLN(AC_msg_sd_file_open_failed); + SendFileList( 0 ); + break; + } + } + + void ChironTFT::InjectCommandandWait(PGM_P cmd) { + //injectCommands_P(cmnd); queue.enqueue_now_P(cmd); + //SERIAL_ECHOLN(PSTR("Inject>")); + } + + void ChironTFT::ProcessPanelRequest() { + // Break these up into logical blocks // as its easier to navigate than one huge switch case! + int8_t req = atoi(&panel_command[1]); + + // Information requests A0 - A8 and A33 + if (req <= 8 || req == 33) PanelInfo(req); + + // Simple Actions A9 - A28 + else if ( req <= 28) PanelAction(req); + + // Process Initiation + else if (req <= 34) PanelProcess(req); + + else SendtoTFTLN(); + } + + void ChironTFT::PanelInfo(uint8_t req) { + // information requests A0-A8 and A33 + switch (req) { + case 0: // A0 Get HOTEND Temp + SendtoTFT(PSTR("A0V ")); + TFTSer.println(getActualTemp_celsius(E0)); + break; + + case 1: // A1 Get HOTEND Target Temp + SendtoTFT(PSTR("A1V ")); + TFTSer.println(getTargetTemp_celsius(E0)); + break; + + case 2: // A2 Get BED Temp + SendtoTFT(PSTR("A2V ")); + TFTSer.println(getActualTemp_celsius(BED)); + break; + + case 3: // A3 Get BED Target Temp + SendtoTFT(PSTR("A3V ")); + TFTSer.println(getTargetTemp_celsius(BED)); + break; + + case 4: // A4 Get FAN Speed + SendtoTFT(PSTR("A4V ")); + TFTSer.println(getActualFan_percent(FAN0)); + break; + + case 5: // A5 Get Current Coordinates + SendtoTFT(PSTR("A5V X: ")); + TFTSer.print(getAxisPosition_mm(X)); + SendtoTFT(PSTR(" Y: ")); + TFTSer.print(getAxisPosition_mm(Y)); + SendtoTFT(PSTR(" Z: ")); + TFTSer.println(getAxisPosition_mm(Z)); + break; + + case 6: // A6 Get printing progress + if (isPrintingFromMedia()) { + SendtoTFT(PSTR("A6V ")); + TFTSer.println(ui8tostr2(getProgress_percent())); + + } + else + SendtoTFTLN(PSTR("A6V ---")); + break; + + case 7: { // A7 Get Printing Time + uint32_t time = getProgress_seconds_elapsed() / 60; + SendtoTFT(PSTR("A7V ")); + TFTSer.print(ui8tostr2(time / 60)); + SendtoTFT(PSTR(" H ")); + TFTSer.print(ui8tostr2(time % 60)); + SendtoTFT(PSTR(" M")); + #if ACDEBUG(AC_ALL) + SERIAL_ECHOLNPAIR("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); + #endif + } break; + + case 8: // A8 Get SD Card list A8 S0 + if (!isMediaInserted()) safe_delay(500); + if (!isMediaInserted()) // Make sure the card is removed + SendtoTFTLN(AC_msg_no_sd_card); + else if (panel_command[3] == 'S') + SendFileList( atoi( &panel_command[4] ) ); + break; + + case 33: // A33 Get firmware info + SendtoTFT(PSTR("J33 ")); + SendtoTFTLN(PSTR(SHORT_BUILD_VERSION)); + break; + } + } + + void ChironTFT::PanelAction(uint8_t req) { + switch (req) { + case 9: // A9 Pause SD print + if (isPrintingFromMedia()) { + SendtoTFTLN(AC_msg_pause); + pausePrint(); + printer_state = AC_printer_pausing; + } + else + SendtoTFTLN(AC_msg_stop); + break; + + case 10: // A10 Resume SD Print + if (pause_state == AC_paused_idle || printer_state == AC_printer_resuming_from_power_outage) + resumePrint(); + else + setUserConfirmed(); + break; + + case 11: // A11 Stop SD print + if (isPrintingFromMedia()) { + printer_state = AC_printer_stopping; + stopPrint(); + } + else { + if (printer_state == AC_printer_resuming_from_power_outage) + injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery + SendtoTFTLN(AC_msg_stop); + printer_state = AC_printer_idle; + } + break; + + case 12: // A12 Kill printer + kill(); // from marlincore.h + break; + + case 13: // A13 Select file + SelectFile(); + break; + + case 14: { // A14 Start Printing + // Allows printer to restart the job if we dont want to recover + if (printer_state == AC_printer_resuming_from_power_outage) { + injectCommands_P(PSTR("M1000 C\n")); // Cancel recovery + printer_state = AC_printer_idle; + } + #if ACDebugLevel >= 1 + SERIAL_ECHOLNPAIR_F("Print: ", selectedfile); + #endif + // the card library needs a path starting // but the File api doesn't... + char file[MAX_PATH_LEN]; + file[0] = '/'; + strcpy(file + 1, selectedfile); + printFile(file); + SendtoTFTLN(AC_msg_print_from_sd_card); + } break; + + case 15: // A15 Resuming from outage + if (printer_state == AC_printer_resuming_from_power_outage) + // Need to home here to restore the Z position + injectCommands_P(AC_cmnd_power_loss_recovery); + + injectCommands_P(PSTR("M1000\n")); // home and start recovery + break; + + case 16: { // A16 Set HotEnd temp A17 S170 + const float set_Htemp = atof(&panel_command[5]); + hotend_state = set_Htemp ? AC_heater_temp_set : AC_heater_off; + switch ((char)panel_command[4]) { + // Set Temp + case 'S': case 'C': setTargetTemp_celsius(set_Htemp, E0); + } + } break; + + case 17: { // A17 Set bed temp + const float set_Btemp = atof(&panel_command[5]); + hotbed_state = set_Btemp ? AC_heater_temp_set : AC_heater_off; + if (panel_command[4] == 'S') + setTargetTemp_celsius(set_Btemp, BED); + } break; + + case 18: // A18 Set Fan Speed + if (panel_command[4] == 'S') + setTargetFan_percent(atof(&panel_command[5]), FAN0); + break; + + case 19: // A19 Motors off + if (!isPrinting()) { + disable_all_steppers(); // from marlincore.h + SendtoTFTLN(AC_msg_ready); + } + break; + + case 20: // A20 Read/write print speed + if (panel_command[4] == 'S') + setFeedrate_percent(atoi(&panel_command[5])); + else { + SendtoTFT(PSTR("A20V ")); + TFTSer.println(getFeedrate_percent()); + } + break; + + case 21: // A21 Home Axis A21 X + if (!isPrinting()) { + switch ((char)panel_command[4]) { + case 'X': injectCommands_P(PSTR("G28 X\n")); break; + case 'Y': injectCommands_P(PSTR("G28 Y\n")); break; + case 'Z': injectCommands_P(PSTR("G28 Z\n")); break; + case 'C': injectCommands_P(PSTR("G28\n")); break; + } + } + break; + + case 22: // A22 Move Axis A22 Y +10F3000 + // Ignore request if printing + if (!isPrinting()) { + // setAxisPosition_mm() uses pre defined manual feedrates so ignore the feedrate from the panel + setSoftEndstopState(true); // enable endstops + float newposition = atof(&panel_command[6]); + + #if ACDEBUG(AC_ACTION) + SERIAL_ECHOLNPAIR("Nudge ", panel_command[4], " axis ", newposition); + #endif + + switch (panel_command[4]) { + case 'X': setAxisPosition_mm(getAxisPosition_mm(X) + newposition, X); break; + case 'Y': setAxisPosition_mm(getAxisPosition_mm(Y) + newposition, Y); break; + case 'Z': setAxisPosition_mm(getAxisPosition_mm(Z) + newposition, Z); break; + case 'E': // The only time we get this command is from the filament load/unload menu + // the standard movement is too slow so we will use the load unlod GCode to speed it up a bit + if (canMove(E0) && !commandsInQueue()) + injectCommands_P(newposition > 0 ? AC_cmnd_manual_load_filament : AC_cmnd_manual_unload_filament); + break; + } + } + break; + + case 23: // A23 Preheat PLA + // Ignore request if printing + if (!isPrinting()) { + // Temps defined in configuration.h + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); + SendtoTFTLN(); + hotbed_state = AC_heater_temp_set; + hotend_state = AC_heater_temp_set; + } + break; + + case 24: // A24 Preheat ABS + // Ignore request if printing + if (!isPrinting()) { + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); + SendtoTFTLN(); + hotbed_state = AC_heater_temp_set; + hotend_state = AC_heater_temp_set; + } + break; + + case 25: // A25 Cool Down + // Ignore request if printing + if (!isPrinting()) { + setTargetTemp_celsius(0, E0); + setTargetTemp_celsius(0, BED); + SendtoTFTLN(AC_msg_ready); + hotbed_state = AC_heater_off; + hotend_state = AC_heater_off; + } + break; + + case 26: // A26 Refresh SD + // M22 M21 maybe needed here to reset sd card + filenavigator.reset(); + break; + + case 27: // A27 Servo Angles adjust + break; + + case 28: // A28 Filament set A28 O/C + // Ignore request if printing + if (isPrinting()) break; + SendtoTFTLN(); + break; + } + } + + void ChironTFT::PanelProcess(uint8_t req) { + switch (req) { + case 29: { // A29 Read Mesh Point A29 X1 Y1 + xy_uint8_t pos; + float pos_z; + pos.x = atoi(&panel_command[5]); + pos.y = atoi(&panel_command[8]); + pos_z = getMeshPoint(pos); + + SendtoTFT(PSTR("A29V ")); + TFTSer.println(pos_z * 100); + if (!isPrinting()) { + setSoftEndstopState(true); // disable endstops + // If the same meshpoint is selected twice in a row, move the head to that ready for adjustment + if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { + if (!isPositionKnown()) + injectCommands_P(PSTR("G28\n")); // home + + if (isPositionKnown()) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); + #endif + // Go up before moving + setAxisPosition_mm(3.0,Z); + + setAxisPosition_mm(17 + (93 * pos.x), X); + setAxisPosition_mm(20 + (93 * pos.y), Y); + setAxisPosition_mm(0.0, Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Current Z: ", getAxisPosition_mm(Z)); + #endif + } + } + selectedmeshpoint.x = pos.x; + selectedmeshpoint.y = pos.y; + } + } break; + + case 30: { // A30 Auto leveling + if (panel_command[3] == 'S') { // Start probing + // Ignore request if printing + if (isPrinting()) + SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling + else { + injectCommands_P(isMachineHomed() ? PSTR("G29") : PSTR("G28\nG29")); + printer_state = AC_printer_probing; + SendtoTFTLN(AC_msg_start_probing); + } + } + else SendtoTFTLN(AC_msg_start_probing); + } break; + + case 31: { // A31 Adjust all Probe Points + switch (panel_command[3]) { + case 'C': // Restore and apply original offsets + if (!isPrinting()) { + injectCommands_P(PSTR("M501\nM420 S1\n")); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + } + break; + case 'D': // Save Z Offset tables and restore levelling state + if (!isPrinting()) { + setAxisPosition_mm(1.0,Z); + injectCommands_P(PSTR("M500\n")); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + } + break; + case 'G': // Get current offset + SendtoTFT(PSTR("A31V ")); + // When printing use the live z Offset position + // we will use babystepping to move the print head + if (isPrinting()) + TFTSer.println(live_Zoffset); + else { + TFTSer.println(getZOffset_mm()); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + } + break; + case 'S': { // Set offset (adjusts all points by value) + float Zshift = atof(&panel_command[4]); + setSoftEndstopState(false); // disable endstops + // Allow temporary Z position nudging during print + // From the levelling panel use the all points UI to adjust the print pos. + if (isPrinting()) { + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); + #endif + if (isAxisPositionKnown(Z)) { + #if ACDEBUG(AC_INFO) + const float currZpos = getAxisPosition_mm(Z); + SERIAL_ECHOLNPAIR("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + #endif + // Use babystepping to adjust the head position + int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Steps to move Z: ", steps); + #endif + babystepAxis_steps(steps, Z); + live_Zoffset += Zshift; + } + SendtoTFT(PSTR("A31V ")); + TFTSer.println(live_Zoffset); + } + else { + GRID_LOOP(x, y) { + const xy_uint8_t pos { x, y }; + const float currval = getMeshPoint(pos); + setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); + } + const float currZOffset = getZOffset_mm(); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); + #endif + + setZOffset_mm(currZOffset + Zshift); + SendtoTFT(PSTR("A31V ")); + TFTSer.println(getZOffset_mm()); + + if (isAxisPositionKnown(Z)) { + // Move Z axis + const float currZpos = getAxisPosition_mm(Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + #endif + setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z); + } + } + } break; + } // end switch + } break; + + case 32: { // A32 clean leveling beep flag + // Ignore request if printing + //if (isPrinting()) break; + //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); + //TFTSer.println(""); + } break; + + // A33 firmware info request seet PanelInfo() + + case 34: { // A34 Adjust single mesh point A34 C/S X1 Y1 V123 + if (panel_command[3] == 'C') { // Restore original offsets + injectCommands_P(PSTR("M501\nM420 S1")); + selectedmeshpoint.x = 99; + selectedmeshpoint.y = 99; + //printer_state = AC_printer_idle; + } + else { + xy_uint8_t pos; + pos.x = atoi(&panel_command[5]); + pos.y = atoi(&panel_command[8]); + + float currmesh = getMeshPoint(pos); + float newval = atof(&panel_command[11])/100; + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Change mesh point x:", pos.x, " y:", pos.y); + SERIAL_ECHOLNPAIR("from ", currmesh, " to ", newval); + #endif + // Update Meshpoint + setMeshPoint(pos,newval); + if ( (printer_state == AC_printer_idle) || (printer_state == AC_printer_probing) ) {//!isPrinting()) { + // if we are at the current mesh point indicated on the panel Move Z pos +/- 0.05mm ( The panel changes the mesh value by +/- 0.05mm on each button press) + if ((selectedmeshpoint.x == pos.x) && (selectedmeshpoint.y == pos.y)) { + setSoftEndstopState(false); + float currZpos = getAxisPosition_mm(Z); + #if ACDEBUG(AC_INFO) + SERIAL_ECHOLNPAIR("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); + #endif + setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z); + } + } + } + } break; + } + } +} // namespace + +#endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h new file mode 100644 index 00000000..267f2fe9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.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 + +/** + * lcd/extui/lib/chiron_tft.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#include "chiron_tft_defs.h" +#include "../../../../inc/MarlinConfigPre.h" +#include "../../ui_api.h" +namespace Anycubic { + + class ChironTFT { + static printer_state_t printer_state; + static paused_state_t pause_state; + static heater_state_t hotend_state; + static heater_state_t hotbed_state; + static xy_uint8_t selectedmeshpoint; + static char panel_command[MAX_CMND_LEN]; + static uint8_t command_len; + static char selectedfile[MAX_PATH_LEN]; + static float live_Zoffset; + static file_menu_t file_menu; + public: + ChironTFT(); + void Startup(); + void IdleLoop(); + void PrinterKilled(PGM_P,PGM_P); + void MediaEvent(media_event_t); + void TimerEvent(timer_event_t); + void FilamentRunout(); + void ConfirmationRequest(const char * const ); + void StatusChange(const char * const ); + void PowerLossRecovery(); + + private: + void SendtoTFT(PGM_P); + void SendtoTFTLN(PGM_P); + bool ReadTFTCommand(); + int8_t Findcmndpos(const char *, char); + void CheckHeaters(); + void SendFileList(int8_t); + void SelectFile(); + void InjectCommandandWait(PGM_P); + void ProcessPanelRequest(); + void PanelInfo(uint8_t); + void PanelAction(uint8_t); + void PanelProcess(uint8_t); + }; + + extern ChironTFT Chiron; + +} diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h new file mode 100644 index 00000000..937bdfde --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -0,0 +1,151 @@ +/** + * 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 . + * + */ + +/** + * lcd/extui/lib/chiron_defs.h + * + * Extensible_UI implementation for Anycubic Chiron + * Written By Nick Wells, 2020 [https://github.com/SwiftNick] + * (not affiliated with Anycubic, Ltd.) + */ + +#pragma once +#include "../../../../inc/MarlinConfigPre.h" +//#define ACDEBUGLEVEL 255 + +#if ACDEBUGLEVEL + // Bit-masks for selective debug: + enum ACDebugMask : uint8_t { + AC_INFO = 1, + AC_ACTION = 2, + AC_FILE = 4, + AC_PANEL = 8, + AC_MARLIN = 16, + AC_SOME = 32, + AC_ALL = 64 + }; + #define ACDEBUG(mask) ( ((mask) & ACDEBUGLEVEL) == mask ) // Debug flag macro +#else + #define ACDEBUG(mask) false +#endif + +#define TFTSer LCD_SERIAL // Serial interface for TFT panel now uses marlinserial +#define MAX_FOLDER_DEPTH 4 // Limit folder depth TFT has a limit for the file path +#define MAX_CMND_LEN 16 * MAX_FOLDER_DEPTH // Maximum Length for a Panel command +#define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path + +#define AC_HEATER_FAULT_VALIDATION_TIME 5 // number of 1/2 second loops before signalling a heater fault +#define AC_LOWEST_MESHPOINT_VAL -7.00 // The lowest value you can set for a single mesh point offset + + // TFT panel commands +#define AC_msg_sd_card_inserted PSTR("J00") +#define AC_msg_sd_card_removed PSTR("J01") +#define AC_msg_no_sd_card PSTR("J02") +#define AC_msg_usb_connected PSTR("J03") +#define AC_msg_print_from_sd_card PSTR("J04") +#define AC_msg_pause PSTR("J05") +#define AC_msg_nozzle_heating PSTR("J06") +#define AC_msg_nozzle_heating_done PSTR("J07") +#define AC_msg_bed_heating PSTR("J08") +#define AC_msg_bed_heating_done PSTR("J09") +#define AC_msg_nozzle_temp_abnormal PSTR("J10") +#define AC_msg_kill_lcd PSTR("J11") +#define AC_msg_ready PSTR("J12") +#define AC_msg_low_nozzle_temp PSTR("J13") +#define AC_msg_print_complete PSTR("J14") +#define AC_msg_filament_out_alert PSTR("J15") +#define AC_msg_stop PSTR("J16") +#define AC_msg_main_board_has_reset PSTR("J17") +#define AC_msg_paused PSTR("J18") +#define AC_msg_j19_unknown PSTR("J19") +#define AC_msg_sd_file_open_success PSTR("J20") +#define AC_msg_sd_file_open_failed PSTR("J21") +#define AC_msg_level_monitor_finished PSTR("J22") +#define AC_msg_filament_out_block PSTR("J23") +#define AC_msg_probing_not_allowed PSTR("J24") +#define AC_msg_probing_complete PSTR("J25") +#define AC_msg_start_probing PSTR("J26") +#define AC_msg_version PSTR("J27") + +#define MARLIN_msg_start_probing PSTR("Probing Point 1/25") +#define MARLIN_msg_probing_failed PSTR("Probing Failed") +#define MARLIN_msg_ready PSTR("3D Printer Ready.") +#define MARLIN_msg_print_paused PSTR("Print Paused") +#define MARLIN_msg_print_aborted PSTR("Print Aborted") +#define MARLIN_msg_extruder_heating PSTR("E Heating...") +#define MARLIN_msg_bed_heating PSTR("Bed Heating...") + +#define MARLIN_msg_nozzle_parked PSTR("Nozzle Parked") +#define MARLIN_msg_heater_timeout PSTR("Heater Timeout") +#define MARLIN_msg_reheating PSTR("Reheating...") +#define MARLIN_msg_reheat_done PSTR("Reheat finished.") +#define MARLIN_msg_filament_purging PSTR("Filament Purging...") +#define MARLIN_msg_special_pause PSTR("PB") +#define AC_cmnd_auto_unload_filament PSTR("M701") // Use Marlin unload routine +#define AC_cmnd_auto_load_filament PSTR("M702 M0 PB") // Use Marlin load routing then pause for user to clean nozzle + +#define AC_cmnd_manual_load_filament PSTR("M83\nG1 E50 F700\nM82") // replace the manual panel commands with something a little faster +#define AC_cmnd_manual_unload_filament PSTR("M83\nG1 E-50 F1200\nM82") +#define AC_cmnd_enable_levelling PSTR("M420 S1 V1") +#define AC_cmnd_power_loss_recovery PSTR("G28 X Y R5\nG28 Z") // Lift, home X and Y then home Z when in 'safe' position + +namespace Anycubic { + enum heater_state_t : uint8_t { + AC_heater_off, + AC_heater_temp_set, + AC_heater_temp_reached + }; + + enum paused_state_t : uint8_t { + AC_paused_heater_timed_out, + AC_paused_purging_filament, + AC_paused_idle + }; + + enum printer_state_t : uint8_t { + AC_printer_idle, + AC_printer_probing, + AC_printer_printing, + AC_printer_pausing, + AC_printer_paused, + AC_printer_stopping, + AC_printer_resuming_from_power_outage + }; + + enum timer_event_t : uint8_t { + AC_timer_started, + AC_timer_paused, + AC_timer_stopped + }; + + enum media_event_t : uint8_t { + AC_media_inserted, + AC_media_removed, + AC_media_error + }; + enum file_menu_t : uint8_t { + AC_menu_file, + AC_menu_command, + AC_menu_change_to_file, + AC_menu_change_to_command + }; +} 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 new file mode 100644 index 00000000..efbc57e6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -0,0 +1,1032 @@ +/** + * 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 + * + * 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_LCD_I3MEGA) + +#include "anycubic_i3mega_lcd.h" +#include "../../ui_api.h" + +#include "../../../../libs/numtostr.h" +#include "../../../../module/motion.h" // for A20 read printing speed feedrate_percentage +#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../inc/MarlinConfig.h" + +// 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(i16tostr3rj(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; + +static void sendNewLine(void) { + LCD_SERIAL.write('\r'); + LCD_SERIAL.write('\n'); +} + +static void send(const char *str) { + 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++)) + LCD_SERIAL.write(c); +} + +static void sendLine_P(PGM_P str) { + send_P(str); + sendNewLine(); +} + +AnycubicTFTClass::AnycubicTFTClass() {} + +void AnycubicTFTClass::OnSetup() { + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 115200 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); + + 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 + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + SET_INPUT_PULLUP(SD_DETECT_PIN); + #endif + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + SET_INPUT_PULLUP(FIL_RUNOUT_PIN); + #endif + + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + + // DoSDCardStateCheck(); + SENDLINE_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_LCD_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_LCD_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 + SENDLINE_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() { + SENDLINE_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); +} + +void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { + #if ENABLED(ANYCUBIC_LCD_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); + SERIAL_ECHO(ui8tostr2(isInserted)); + SERIAL_EOL(); + #endif + DoSDCardStateCheck(); +} + +void AnycubicTFTClass::OnSDCardError() { + #if ENABLED(ANYCUBIC_LCD_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); + #endif + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); +} + +void AnycubicTFTClass::OnFilamentRunout() { + #if ENABLED(ANYCUBIC_LCD_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); + #endif + DoFilamentRunoutCheck(); +} + +void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { + #if ENABLED(ANYCUBIC_LCD_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 + 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 + 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 + // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + + // enable continue button + 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 + 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 + SENDLINE_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_LCD_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; + ExtUI::FileList currentFileList; + + SENDLINE_PGM("FN "); // Filelist start + + if (!ExtUI::isMediaInserted() && !SpecialMenu) { + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); + + SENDLINE_PGM(""); + SENDLINE_PGM(""); + } + else { + if (CodeSeen('S')) + selectedNumber = CodeValue(); + + if (SpecialMenu) + RenderSpecialMenu(selectedNumber); + else if (selectedNumber <= currentFileList.count()) + RenderCurrentFolder(selectedNumber); + } + SENDLINE_PGM("END"); // Filelist stop + #endif // SDSUPPORT +} + +void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { + switch (selectedNumber) { + #if ENABLED(PROBE_MANUALLY) + case 0: // First Page + 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 + 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 + 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 + 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 + SENDLINE_PGM("<05FWDeflts>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<06SvEEPROM>"); + SENDLINE_PGM(""); + SENDLINE_PGM("<07SendM108>"); + SENDLINE_PGM(""); + SENDLINE_PGM(""); + SENDLINE_PGM(""); + 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()) { + SENDLINE_PGM(""); + SENDLINE_PGM(""); + } + else { + SENDLINE_PGM("/.."); + SENDLINE_PGM("/.."); + } + } + else { + currentFileList.seek(cnt - 1, false); + + #if ENABLED(ANYCUBIC_LCD_DEBUG) + SERIAL_ECHOLN(currentFileList.filename()); + #endif + if (currentFileList.isDir()) { + SEND_PGM("/"); + SENDLINE(currentFileList.shortFilename()); + SEND_PGM("/"); + SENDLINE(currentFileList.filename()); + + } + else { + SENDLINE(currentFileList.shortFilename()); + SENDLINE(currentFileList.filename()); + } + } + } +} + +void AnycubicTFTClass::OnPrintTimerStarted() { + #if ENABLED(SDSUPPORT) + if (mediaPrintingState == AMPRINTSTATE_PRINTING) + SENDLINE_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; + 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 +} + +void AnycubicTFTClass::GetCommandFromTFT() { + char *starpos = NULL; + while (LCD_SERIAL.available() > 0 && TFTbuflen < TFTBUFSIZE) { + serial3_char = LCD_SERIAL.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_LCD_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); + 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); + 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); + 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); + SEND_PGM_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); + SEND_PGM_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); + SEND_PGM("A5V X: "); + LCD_SERIAL.print(xPostition); + SEND_PGM(" Y: "); + LCD_SERIAL.print(yPostition); + SEND_PGM(" Z: "); + LCD_SERIAL.print(zPostition); + SENDLINE_PGM(""); + } break; + + case 6: // A6 GET SD CARD PRINTING STATUS + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia()) { + SEND_PGM("A6V "); + if (ExtUI::isMediaInserted()) + SENDLINE(ui8tostr3rj(ExtUI::getProgress_percent())); + else + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); + } + else + SENDLINE_PGM("A6V ---"); + #endif + break; + + case 7: { // A7 GET PRINTING TIME + const uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + SEND_PGM("A7V "); + if (elapsedSeconds != 0) { // print time + const uint32_t elapsedMinutes = elapsedSeconds / 60; + SEND(ui8tostr2(elapsedMinutes / 60)); + SEND_PGM(" H "); + SEND(ui8tostr2(elapsedMinutes % 60)); + SENDLINE_PGM(" M"); + } + else + SENDLINE_PGM(" 999:999"); + } + 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 + TERN_(SDSUPPORT, StopPrint()); + 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; + 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; + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); + } + else { + SelectedDirectory[0] = 0; + + if (starpos != NULL) + *(starpos - 1) = '\0'; + + strcpy(SelectedFile, TFTstrchr_pointer + 4); + SENDLINE_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); + SENDLINE_PGM(""); + } + 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(); + } + + SENDLINE_PGM(""); + break; + + case 20: // A20 read printing speed + if (CodeSeen('S')) + feedrate_percentage = constrain(CodeValue(), 40, 999); + else + SEND_PGM_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_LCD_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); + SERIAL_ECHOLN(fullCommandStr); + #endif + ExtUI::injectCommands(fullCommandStr); + } + } + SENDLINE_PGM(""); + 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); + SENDLINE_PGM("OK"); + } + 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); + SENDLINE_PGM("OK"); + } + 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); + + SENDLINE_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 { + SENDLINE_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; + SENDLINE_PGM(""); + break; + + case 33: // A33 get version info + SEND_PGM("J33 "); + SENDLINE_PGM(DETAILED_BUILD_VERSION); + 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) + SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); + else + SENDLINE_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 + SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); + } + else { + SENDLINE_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_LCD_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 + 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")); + ExtUI::pausePrint(); + } + #endif +} + +void AnycubicTFTClass::ResumePrint() { + #if ENABLED(SDSUPPORT) + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + if (READ(FIL_RUNOUT_PIN)) { + #if ENABLED(ANYCUBIC_LCD_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 + SENDLINE_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 + // SENDLINE_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; + + SENDLINE_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; + 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")); + ExtUI::stopPrint(); + #endif +} + +#endif // ANYCUBIC_LCD_I3MEGA diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h new file mode 100644 index 00000000..a4ecf560 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -0,0 +1,96 @@ +/** + * 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 + * + * 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 + +#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/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp new file mode 100644 index 00000000..8577b76c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.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 . + * + */ + +/* DGUS implementation written by coldtobi in 2019 for Marlin */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_DGUS_LCD + +#if HOTENDS > 2 + #error "More than 2 hotends not implemented on the Display UI design." +#endif + +#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 + +#include "DGUSDisplay.h" +#include "DGUSVPVariable.h" +#include "DGUSDisplayDef.h" + +// Preamble... 2 Bytes, usually 0x5A 0xA5, but configurable +constexpr uint8_t DGUS_HEADER1 = 0x5A; +constexpr uint8_t DGUS_HEADER2 = 0xA5; + +constexpr uint8_t DGUS_CMD_WRITEVAR = 0x82; +constexpr uint8_t DGUS_CMD_READVAR = 0x83; + +#if ENABLED(DEBUG_DGUSLCD) + bool dguslcd_local_debug; // = false; +#endif + +void DGUSDisplay::InitDisplay() { + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 115200 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); + if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) + RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); +} + +void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { + const char* myvalues = static_cast(values); + bool strend = !myvalues; + WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); + while (valueslen--) { + char x; + if (!strend) x = *myvalues++; + if ((isstr && !x) || strend) { + strend = true; + x = ' '; + } + LCD_SERIAL.write(x); + } +} + +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, 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]; + 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; + WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); + while (valueslen--) { + char x; + if (!strend) x = pgm_read_byte(myvalues++); + if ((isstr && !x) || strend) { + strend = true; + x = ' '; + } + LCD_SERIAL.write(x); + } +} + +void DGUSDisplay::ProcessRx() { + + #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) + if (!LCD_SERIAL.available() && LCD_SERIAL.buffer_overruns()) { + // Overrun, but reset the flag only when the buffer is empty + // We want to extract as many as valid datagrams possible... + DEBUG_ECHOPGM("OVFL"); + rx_datagram_state = DGUS_IDLE; + //LCD_SERIAL.reset_rx_overun(); + LCD_SERIAL.flush(); + } + #endif + + uint8_t receivedbyte; + while (LCD_SERIAL.available()) { + switch (rx_datagram_state) { + + case DGUS_IDLE: // Waiting for the first header byte + receivedbyte = LCD_SERIAL.read(); + //DEBUG_ECHOPAIR("< ",x); + if (DGUS_HEADER1 == receivedbyte) rx_datagram_state = DGUS_HEADER1_SEEN; + break; + + case DGUS_HEADER1_SEEN: // Waiting for the second header byte + receivedbyte = LCD_SERIAL.read(); + //DEBUG_ECHOPAIR(" ",x); + rx_datagram_state = (DGUS_HEADER2 == receivedbyte) ? DGUS_HEADER2_SEEN : DGUS_IDLE; + break; + + case DGUS_HEADER2_SEEN: // Waiting for the length byte + rx_datagram_len = LCD_SERIAL.read(); + DEBUG_ECHOPAIR(" (", rx_datagram_len, ") "); + + // Telegram min len is 3 (command and one word of payload) + rx_datagram_state = WITHIN(rx_datagram_len, 3, DGUS_RX_BUFFER_SIZE) ? DGUS_WAIT_TELEGRAM : DGUS_IDLE; + break; + + case DGUS_WAIT_TELEGRAM: // wait for complete datagram to arrive. + if (LCD_SERIAL.available() < rx_datagram_len) return; + + Initialized = true; // We've talked to it, so we defined it as initialized. + uint8_t command = LCD_SERIAL.read(); + + DEBUG_ECHOPAIR("# ", command); + + uint8_t readlen = rx_datagram_len - 1; // command is part of len. + unsigned char tmp[rx_datagram_len - 1]; + unsigned char *ptmp = tmp; + while (readlen--) { + receivedbyte = LCD_SERIAL.read(); + DEBUG_ECHOPAIR(" ", receivedbyte); + *ptmp++ = receivedbyte; + } + DEBUG_ECHOPGM(" # "); + // mostly we'll get this: 5A A5 03 82 4F 4B -- ACK on 0x82, so discard it. + if (command == DGUS_CMD_WRITEVAR && 'O' == tmp[0] && 'K' == tmp[1]) { + DEBUG_ECHOLNPGM(">"); + rx_datagram_state = DGUS_IDLE; + break; + } + + /* AutoUpload, (and answer to) Command 0x83 : + | tmp[0 1 2 3 4 ... ] + | Example 5A A5 06 83 20 01 01 78 01 …… + | / / | | \ / | \ \ + | Header | | | | \_____\_ DATA (Words!) + | DatagramLen / VPAdr | + | 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) + //DEBUG_ECHOPAIR(" vp=", vp, " dlen=", dlen); + DGUS_VP_Variable ramcopy; + if (populate_VPVar(vp, &ramcopy)) { + if (ramcopy.set_by_display_handler) + ramcopy.set_by_display_handler(ramcopy, &tmp[3]); + else + DEBUG_ECHOLNPGM(" VPVar found, no handler."); + } + else + DEBUG_ECHOLNPAIR(" VPVar not found:", vp); + + rx_datagram_state = DGUS_IDLE; + break; + } + + // discard anything else + rx_datagram_state = DGUS_IDLE; + } + } +} + +size_t DGUSDisplay::GetFreeTxBuffer() { return SERIAL_GET_TX_BUFFER_FREE(); } + +void DGUSDisplay::WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen) { + LCD_SERIAL.write(DGUS_HEADER1); + LCD_SERIAL.write(DGUS_HEADER2); + LCD_SERIAL.write(payloadlen + 3); + LCD_SERIAL.write(cmd); + LCD_SERIAL.write(adr >> 8); + LCD_SERIAL.write(adr & 0xFF); +} + +void DGUSDisplay::WritePGM(const char str[], uint8_t len) { + while (len--) LCD_SERIAL.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 new file mode 100644 index 00000000..ee536ea2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -0,0 +1,117 @@ +/** + * 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 + +/* DGUS implementation written by coldtobi in 2019 for Marlin */ + +#include "../../../../inc/MarlinConfigPre.h" + +#include "../../../../MarlinCore.h" +#if HAS_BED_PROBE + #include "../../../../module/probe.h" +#endif +#include "DGUSVPVariable.h" + +enum DGUSLCD_Screens : uint8_t; + +#define DEBUG_OUT ENABLED(DEBUG_DGUSLCD) +#include "../../../../core/debug_out.h" + +typedef enum : uint8_t { + DGUS_IDLE, //< waiting for DGUS_HEADER1. + DGUS_HEADER1_SEEN, //< DGUS_HEADER1 received + DGUS_HEADER2_SEEN, //< DGUS_HEADER2 received + DGUS_WAIT_TELEGRAM, //< LEN received, Waiting for to receive all bytes. +} rx_datagram_state_t; + +// Low-Level access to the display. +class DGUSDisplay { +public: + + DGUSDisplay() = default; + + static void InitDisplay(); + + // 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, 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) + + // Force display into another screen. + // (And trigger update of containing VPs) + // (to implement a pop up message, which may not be nested) + static void RequestScreen(DGUSLCD_Screens screen); + + // Periodic tasks, eg. Rx-Queue handling. + static void loop(); + +public: + // Helper for users of this class to estimate if an interaction would be blocking. + static size_t GetFreeTxBuffer(); + + // Checks two things: Can we confirm the presence of the display and has we initiliazed it. + // (both boils down that the display answered to our chatting) + static inline bool isInitialized() { return Initialized; } + +private: + static void WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen); + 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 +constexpr float cpow(const float x, const int y) { return y == 0 ? 1.0 : x * cpow(x, y - 1); } + +/// Find the flash address of a DGUS_VP_Variable for the VP. +extern const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); + +/// Helper to populate a DGUS_VP_Variable for a given VP. Return false if not found. +extern bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h new file mode 100644 index 00000000..b34a0487 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h @@ -0,0 +1,54 @@ +/** + * 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 + +/* DGUS implementation written by coldtobi in 2019 for Marlin */ + +#include "DGUSVPVariable.h" + +#include + +// This file defines the interaction between Marlin and the display firmware. + +// information on which screen which VP is displayed +// As this is a sparse table, two arrays are needed: +// one to list the VPs of one screen and one to map screens to the lists. +// (Strictly this would not be necessary, but allows to only send data the display needs and reducing load on Marlin) +struct VPMapping { + const uint8_t screen; + const uint16_t *VPList; // The list is null-terminated. +}; + +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) + #include "fysetc/DGUSDisplayDef.h" +#elif ENABLED(DGUS_LCD_UI_HIPRECY) + #include "hiprecy/DGUSDisplayDef.h" +#endif 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 00000000..7988985c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -0,0 +1,1140 @@ +/** + * 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); + if (var.size > 1) + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + else + dgusdisplay.WriteVariable(var.VP, *(int8_t*)var.memadr); + } +} + +// 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); + dgusdisplay.WriteVariable(var.VP, tmp); + } +} + +// 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); + dgusdisplay.WriteVariable(var.VP, tmp); +} + +// 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; + 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; + 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, 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 00000000..df738dbf --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h @@ -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 . + * + */ +#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); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + /// 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); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + /// 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 new file mode 100644 index 00000000..8c193c7c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSVPVariable.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 + +/** + * DGUSVPVariable.h + * + * Created on: Feb 9, 2019 + * Author: tobi + */ + +struct DGUS_VP_Variable { + uint16_t VP; + void* memadr; // If nullptr, the value cannot be uploaded to the display. + uint8_t size; + + // Callback that will be called if the display modified the value. + // nullptr makes it readonly for the display. + void (*set_by_display_handler)(DGUS_VP_Variable &var, void *val_ptr); + void (*send_to_display_handler)(DGUS_VP_Variable &var); + + template + DGUS_VP_Variable& operator =(T &o) { + *(T*)memadr = o; // warning this is not typesafe. + // TODO: Call out the display or mark as dirty for the next update. + return *this; + } +}; diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp new file mode 100644 index 00000000..3beed892 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -0,0 +1,486 @@ +/** + * 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 . + * + */ + +/* DGUS VPs changed by George Fu in 2019 for Marlin */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_FYSETC) + +#include "../DGUSDisplayDef.h" +#include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" + +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" + +#include "../../../ui_api.h" +#include "../../../../ultralcd.h" + +#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + uint16_t distanceToMove = 10; +#endif + +const uint16_t VPList_Boot[] PROGMEM = { + VP_MARLIN_VERSION, + 0x0000 +}; + +const uint16_t VPList_Main[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded. */ + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, VP_BED_STATUS, + #endif + #if HAS_FAN + VP_Fan0_Percentage, VP_FAN0_STATUS, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + VP_PrintProgress_Percentage, + #endif + 0x0000 +}; + +const uint16_t VPList_Temp[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_Status[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded */ + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + #if HAS_FAN + VP_Fan0_Percentage, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + VP_PrintProgress_Percentage, + 0x0000 +}; + +const uint16_t VPList_Status2[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded */ + #if HOTENDS >= 1 + VP_Flowrate_E0, + #endif + #if HOTENDS >= 2 + VP_Flowrate_E1, + #endif + VP_PrintProgress_Percentage, + VP_PrintTime, + 0x0000 +}; + +const uint16_t VPList_Preheat[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_ManualMove[] PROGMEM = { + VP_XPos, VP_YPos, VP_ZPos, + 0x0000 +}; + +const uint16_t VPList_ManualExtrude[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + VP_EPos, + 0x0000 +}; + +const uint16_t VPList_FanAndFeedrate[] PROGMEM = { + VP_Feedrate_Percentage, VP_Fan0_Percentage, + 0x0000 +}; + +const uint16_t VPList_SD_FlowRates[] PROGMEM = { + VP_Flowrate_E0, VP_Flowrate_E1, + 0x0000 +}; + +const uint16_t VPList_Filament_heating[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + VP_E0_FILAMENT_LOAD_UNLOAD, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + VP_E1_FILAMENT_LOAD_UNLOAD, + #endif + 0x0000 +}; + +const uint16_t VPList_Filament_load_unload[] PROGMEM = { + #if HOTENDS >= 1 + VP_E0_FILAMENT_LOAD_UNLOAD, + #endif + #if HOTENDS >= 2 + VP_E1_FILAMENT_LOAD_UNLOAD, + #endif + 0x0000 +}; + +const uint16_t VPList_SDFileList[] PROGMEM = { + VP_SD_FileName0, VP_SD_FileName1, VP_SD_FileName2, VP_SD_FileName3, VP_SD_FileName4, + 0x0000 +}; + +const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { + VP_PrintProgress_Percentage, VP_PrintTime, + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + #if HAS_FAN + VP_Fan0_Percentage, + #if FAN_COUNT > 1 + VP_Fan1_Percentage, + #endif + #endif + VP_Flowrate_E0, + 0x0000 +}; + +const uint16_t VPList_SDPrintTune[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, VP_Flowrate_E0, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, VP_Flowrate_E1, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + VP_Feedrate_Percentage, + VP_SD_Print_ProbeOffsetZ, + 0x0000 +}; + +const uint16_t VPList_StepPerMM[] PROGMEM = { + VP_X_STEP_PER_MM, + VP_Y_STEP_PER_MM, + VP_Z_STEP_PER_MM, + #if HOTENDS >= 1 + VP_E0_STEP_PER_MM, + #endif + #if HOTENDS >= 2 + VP_E1_STEP_PER_MM, + #endif + 0x0000 +}; + +const uint16_t VPList_PIDE0[] PROGMEM = { + #if ENABLED(PIDTEMP) + VP_E0_PID_P, + VP_E0_PID_I, + VP_E0_PID_D, + #endif + 0x0000 +}; + +const uint16_t VPList_PIDBED[] PROGMEM = { + #if ENABLED(PIDTEMP) + VP_BED_PID_P, + VP_BED_PID_I, + VP_BED_PID_D, + #endif + 0x0000 +}; + +const uint16_t VPList_Infos[] PROGMEM = { + VP_MARLIN_VERSION, + VP_PrintTime, + #if ENABLED(PRINTCOUNTER) + VP_PrintAccTime, + VP_PrintsTotal, + #endif + 0x0000 +}; + +const uint16_t VPList_PIDTuningWaiting[] PROGMEM = { + VP_WAITING_STATUS, + 0x0000 +}; + +const uint16_t VPList_FLCPreheat[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_FLCPrinting[] PROGMEM = { + #if HOTENDS >= 1 + VP_SD_Print_ProbeOffsetZ, + #endif + 0x0000 +}; + +const uint16_t VPList_Z_Offset[] PROGMEM = { + #if HOTENDS >= 1 + VP_SD_Print_ProbeOffsetZ, + #endif + 0x0000 +}; + +const struct VPMapping VPMap[] PROGMEM = { + { DGUSLCD_SCREEN_BOOT, VPList_Boot }, + { DGUSLCD_SCREEN_MAIN, VPList_Main }, + { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, + { DGUSLCD_SCREEN_STATUS, VPList_Status }, + { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, + { DGUSLCD_SCREEN_PREHEAT, VPList_Preheat }, + { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, + { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, + { DGUSLCD_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, + { DGUSLCD_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, + { DGUSLCD_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, + { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, + { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, + { DGUSLCD_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, + { DGUSLCD_SCREEN_WAITING, VPList_PIDTuningWaiting }, + { DGUSLCD_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, + { DGUSLCD_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, + { DGUSLCD_SCREEN_Z_OFFSET, VPList_Z_Offset }, + { DGUSLCD_SCREEN_STEPPERMM, VPList_StepPerMM }, + { DGUSLCD_SCREEN_PID_E, VPList_PIDE0 }, + { DGUSLCD_SCREEN_PID_BED, VPList_PIDBED }, + { DGUSLCD_SCREEN_INFOS, VPList_Infos }, + { 0 , nullptr } // List is terminated with an nullptr as table entry. +}; + +const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; + +// Helper to define a DGUS_VP_Variable for common use cases. +#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=sizeof(VPADRVAR), \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } + +// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) +#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=STRLEN, \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } + +const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { + // Helper to detect touch events + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + #endif + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), + #endif + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + 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, &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, &ScreenHandler.HandleMotorLockUnlock, nullptr), + #if ENABLED(POWER_LOSS_RECOVERY) + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), + #endif + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), + #if ENABLED(SINGLE_Z_CALIBRATION) + VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), + #endif + + #if ENABLED(FIRST_LAYER_CAL) + 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 =&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 =&ScreenHandler.DGUSLCD_SendStringToDisplay }, + + // 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_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, &ScreenHandler.HandlePreheat, nullptr), + #endif + #if ENABLED(PIDTEMP) + 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, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), + #endif + #endif + #if HOTENDS >= 2 + 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, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + 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, 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, 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], 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, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), + + // Position Data + 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, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), + + // Print Time + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), + #if ENABLED(PRINTCOUNTER) + 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], 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)], 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)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + #endif + + // SDCard File listing. + #if ENABLED(SDSUPPORT) + 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, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + #if ENABLED(BABYSTEPPING) + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + #endif + #endif + #endif + + #if ENABLED(DGUS_UI_WAITING) + 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 = &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. +}; + +#endif // DGUS_LCD_UI_FYSETC diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h new file mode 100644 index 00000000..f6a65fe8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.h @@ -0,0 +1,294 @@ +/** + * 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 + +enum DGUSLCD_Screens : uint8_t { + DGUSLCD_SCREEN_BOOT = 0, + DGUSLCD_SCREEN_MAIN = 1, + DGUSLCD_SCREEN_STATUS = 1, + DGUSLCD_SCREEN_STATUS2 = 1, + DGUSLCD_SCREEN_TEMPERATURE = 10, + DGUSLCD_SCREEN_PREHEAT = 18, + DGUSLCD_SCREEN_POWER_LOSS = 100, + DGUSLCD_SCREEN_MANUALMOVE = 192, + DGUSLCD_SCREEN_UTILITY = 120, + DGUSLCD_SCREEN_FILAMENT_HEATING = 146, + DGUSLCD_SCREEN_FILAMENT_LOADING = 148, + DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, + DGUSLCD_SCREEN_MANUALEXTRUDE = 160, + DGUSLCD_SCREEN_SDFILELIST = 71, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 73, + DGUSLCD_SCREEN_SDPRINTTUNE = 75, + DGUSLCD_SCREEN_FLC_PREHEAT = 94, + DGUSLCD_SCREEN_FLC_PRINTING = 96, + DGUSLCD_SCREEN_STEPPERMM = 212, + DGUSLCD_SCREEN_PID_E = 214, + DGUSLCD_SCREEN_PID_BED = 218, + DGUSLCD_SCREEN_Z_OFFSET = 222, + DGUSLCD_SCREEN_INFOS = 36, + DGUSLCD_SCREEN_CONFIRM = 240, + DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUSLCD_SCREEN_WAITING = 251, + DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUSLDC_SCREEN_UNUSED = 255 +}; + +// Display Memory layout used (T5UID) +// Except system variables this is arbitrary, just to organize stuff.... + +// 0x0000 .. 0x0FFF -- System variables and reserved by the display +// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version +// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) +// 0x3000 .. 0x4FFF -- Marlin Data to be displayed +// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused + +// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, +// so that we can keep variables nicely together in the address space. + +// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. +constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible +constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible +constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. +constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. + +// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. +constexpr uint16_t VP_MSGSTR1 = 0x1100; +constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... +constexpr uint16_t VP_MSGSTR2 = 0x1140; +constexpr uint8_t VP_MSGSTR2_LEN = 0x20; +constexpr uint16_t VP_MSGSTR3 = 0x1180; +constexpr uint8_t VP_MSGSTR3_LEN = 0x20; +constexpr uint16_t VP_MSGSTR4 = 0x11C0; +constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + +// Screenchange request for screens that only make sense when printer is idle. +// e.g movement is only allowed if printer is not printing. +// Marlin must confirm by setting the screen manually. +constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; +constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. +constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= +constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. + +constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. + +// Buttons on the SD-Card File listing. +constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down +constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. +constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + +constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints +constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) +constexpr uint16_t VP_SD_Print_Setting = 0x2040; +constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up + +// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values +// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) +// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us +// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. +constexpr uint16_t VP_MOVE_X = 0x2100; +constexpr uint16_t VP_MOVE_Y = 0x2102; +constexpr uint16_t VP_MOVE_Z = 0x2104; +constexpr uint16_t VP_MOVE_E0 = 0x2110; +constexpr uint16_t VP_MOVE_E1 = 0x2112; +//constexpr uint16_t VP_MOVE_E2 = 0x2114; +//constexpr uint16_t VP_MOVE_E3 = 0x2116; +//constexpr uint16_t VP_MOVE_E4 = 0x2118; +//constexpr uint16_t VP_MOVE_E5 = 0x211A; +constexpr uint16_t VP_HOME_ALL = 0x2120; +constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; + +// Power loss recovery +constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; + +// Fan Control Buttons , switch between "off" and "on" +constexpr uint16_t VP_FAN0_CONTROL = 0x2200; +constexpr uint16_t VP_FAN1_CONTROL = 0x2202; +constexpr uint16_t VP_FAN2_CONTROL = 0x2204; +constexpr uint16_t VP_FAN3_CONTROL = 0x2206; + +// Heater Control Buttons , triged between "cool down" and "heat PLA" state +constexpr uint16_t VP_E0_CONTROL = 0x2210; +constexpr uint16_t VP_E1_CONTROL = 0x2212; +//constexpr uint16_t VP_E2_CONTROL = 0x2214; +//constexpr uint16_t VP_E3_CONTROL = 0x2216; +//constexpr uint16_t VP_E4_CONTROL = 0x2218; +//constexpr uint16_t VP_E5_CONTROL = 0x221A; +constexpr uint16_t VP_BED_CONTROL = 0x221C; + +// Preheat +constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; +constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; +//constexpr uint16_t VP_E2_BED_PREHEAT = 0x2224; +//constexpr uint16_t VP_E3_BED_PREHEAT = 0x2226; +//constexpr uint16_t VP_E4_BED_PREHEAT = 0x2228; +//constexpr uint16_t VP_E5_BED_PREHEAT = 0x222A; + +// Filament load and unload +constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; +constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; + +// Settings store , reset +constexpr uint16_t VP_SETTINGS = 0x2400; + +// PID autotune +constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; +constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; +//constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; +//constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; +//constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; +//constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; +constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; + +// Calibrate Z +constexpr uint16_t VP_Z_CALIBRATE = 0x2430; + +// First layer cal +constexpr uint16_t VP_Z_FIRST_LAYER_CAL = 0x2500; // Data: 0 - Cancel first layer cal progress, >0 filament type have loaded + +// Firmware version on the boot screen. +constexpr uint16_t VP_MARLIN_VERSION = 0x3000; +constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + +// Place for status messages. +constexpr uint16_t VP_M117 = 0x3020; +constexpr uint8_t VP_M117_LEN = 0x20; + +// Temperatures. +constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer +constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer +constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer + +// reserved to support up to 6 Extruders: +constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer +//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer +//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer +//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer +//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer +//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer +//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer + +constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer +constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer + +constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer +constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer + +// reserved for up to 6 Extruders: +//constexpr uint16_t VP_Flowrate_E2 = 0x3094; +//constexpr uint16_t VP_Flowrate_E3 = 0x3096; +//constexpr uint16_t VP_Flowrate_E4 = 0x3098; +//constexpr uint16_t VP_Flowrate_E5 = 0x309A; + +constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan1_Percentage = 0x3102; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan2_Percentage = 0x3104; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan3_Percentage = 0x3106; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Feedrate_Percentage = 0x3108; // 2 Byte Integer (0..100) + +// Actual Position +constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy +constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy +constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy + +constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy + +constexpr uint16_t VP_PrintProgress_Percentage = 0x3130; // 2 Byte Integer (0..100) + +constexpr uint16_t VP_PrintTime = 0x3140; +constexpr uint16_t VP_PrintTime_LEN = 32; + +constexpr uint16_t VP_PrintAccTime = 0x3160; +constexpr uint16_t VP_PrintAccTime_LEN = 32; + +constexpr uint16_t VP_PrintsTotal = 0x3180; +constexpr uint16_t VP_PrintsTotal_LEN = 16; + +// SDCard File Listing +constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. +constexpr uint16_t DGUS_SD_FILESPERSCREEN = 5; // FIXME move that info to the display and read it from there. +constexpr uint16_t VP_SD_FileName0 = 0x3200; +constexpr uint16_t VP_SD_FileName1 = 0x3220; +constexpr uint16_t VP_SD_FileName2 = 0x3240; +constexpr uint16_t VP_SD_FileName3 = 0x3260; +constexpr uint16_t VP_SD_FileName4 = 0x3280; + +constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; // +constexpr uint16_t VP_SD_Print_Filename = 0x32C0; + +// Fan status +constexpr uint16_t VP_FAN0_STATUS = 0x3300; +constexpr uint16_t VP_FAN1_STATUS = 0x3302; +constexpr uint16_t VP_FAN2_STATUS = 0x3304; +constexpr uint16_t VP_FAN3_STATUS = 0x3306; + +// Heater status +constexpr uint16_t VP_E0_STATUS = 0x3310; +constexpr uint16_t VP_E1_STATUS = 0x3312; +//constexpr uint16_t VP_E2_STATUS = 0x3314; +//constexpr uint16_t VP_E3_STATUS = 0x3316; +//constexpr uint16_t VP_E4_STATUS = 0x3318; +//constexpr uint16_t VP_E5_STATUS = 0x331A; +constexpr uint16_t VP_BED_STATUS = 0x331C; + +constexpr uint16_t VP_MOVE_OPTION = 0x3400; + +// Step per mm +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , 2 byte unsigned int , 0~1638.4 +//constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; +constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; +//constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; +constexpr uint16_t VP_Z_STEP_PER_MM = 0x3608; +//constexpr uint16_t VP_Z2_STEP_PER_MM = 0x360A; +constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; +constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; +//constexpr uint16_t VP_E2_STEP_PER_MM = 0x3614; +//constexpr uint16_t VP_E3_STEP_PER_MM = 0x3616; +//constexpr uint16_t VP_E4_STEP_PER_MM = 0x3618; +//constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; + +// PIDs +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 +constexpr uint16_t VP_E0_PID_I = 0x3702; +constexpr uint16_t VP_E0_PID_D = 0x3704; +constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , 2 byte unsigned int , 0~1638.4 +constexpr uint16_t VP_E1_PID_I = 0x3708; +constexpr uint16_t VP_E1_PID_D = 0x370A; +constexpr uint16_t VP_BED_PID_P = 0x3710; +constexpr uint16_t VP_BED_PID_I = 0x3712; +constexpr uint16_t VP_BED_PID_D = 0x3714; + +// Wating screen status +constexpr uint16_t VP_WAITING_STATUS = 0x3800; + +// SPs for certain variables... +// located at 0x5000 and up +// Not used yet! +// This can be used e.g to make controls / data display invisible +constexpr uint16_t SP_T_E0_Is = 0x5000; +constexpr uint16_t SP_T_E0_Set = 0x5010; +constexpr uint16_t SP_T_E1_Is = 0x5020; +constexpr uint16_t SP_T_Bed_Is = 0x5030; +constexpr uint16_t SP_T_Bed_Set = 0x5040; diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp new file mode 100644 index 00000000..82c06d7a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -0,0 +1,485 @@ +/** + * 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 . + * + */ + +/* DGUS VPs changed by George Fu in 2019 for Marlin */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_HIPRECY) + +#include "../DGUSDisplayDef.h" +#include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" + +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" + +#include "../../../ui_api.h" +#include "../../../../ultralcd.h" + +#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + uint16_t distanceToMove = 10; +#endif + +const uint16_t VPList_Boot[] PROGMEM = { + VP_MARLIN_VERSION, + 0x0000 +}; + +const uint16_t VPList_Main[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded. */ + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, VP_BED_STATUS, + #endif + #if HAS_FAN + VP_Fan0_Percentage, VP_FAN0_STATUS, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + VP_PrintProgress_Percentage, + #endif + 0x0000 +}; + +const uint16_t VPList_Temp[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_Status[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded */ + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + #if HAS_FAN + VP_Fan0_Percentage, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + VP_PrintProgress_Percentage, + 0x0000 +}; + +const uint16_t VPList_Status2[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded */ + #if HOTENDS >= 1 + VP_Flowrate_E0, + #endif + #if HOTENDS >= 2 + VP_Flowrate_E1, + #endif + VP_PrintProgress_Percentage, + VP_PrintTime, + 0x0000 +}; + +const uint16_t VPList_Preheat[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_ManualMove[] PROGMEM = { + VP_XPos, VP_YPos, VP_ZPos, + 0x0000 +}; + +const uint16_t VPList_ManualExtrude[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + VP_EPos, + 0x0000 +}; + +const uint16_t VPList_FanAndFeedrate[] PROGMEM = { + VP_Feedrate_Percentage, VP_Fan0_Percentage, + 0x0000 +}; + +const uint16_t VPList_SD_FlowRates[] PROGMEM = { + VP_Flowrate_E0, VP_Flowrate_E1, + 0x0000 +}; + +const uint16_t VPList_Filament_heating[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + VP_E0_FILAMENT_LOAD_UNLOAD, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_Filament_load_unload[] PROGMEM = { + #if HOTENDS >= 1 + VP_E0_FILAMENT_LOAD_UNLOAD, + #endif + #if HOTENDS >= 2 + VP_E1_FILAMENT_LOAD_UNLOAD, + #endif + 0x0000 +}; + +const uint16_t VPList_SDFileList[] PROGMEM = { + VP_SD_FileName0, VP_SD_FileName1, VP_SD_FileName2, VP_SD_FileName3, VP_SD_FileName4, + 0x0000 +}; + +const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { + VP_PrintProgress_Percentage, VP_PrintTime, + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + #if HAS_FAN + VP_Fan0_Percentage, + #if FAN_COUNT > 1 + VP_Fan1_Percentage, + #endif + #endif + VP_Flowrate_E0, + 0x0000 +}; + +const uint16_t VPList_SDPrintTune[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + VP_Feedrate_Percentage, + #if HAS_FAN + VP_Fan0_Percentage, + #endif + VP_Flowrate_E0, + VP_SD_Print_ProbeOffsetZ, + 0x0000 +}; + +const uint16_t VPList_StepPerMM[] PROGMEM = { + VP_X_STEP_PER_MM, + VP_Y_STEP_PER_MM, + VP_Z_STEP_PER_MM, + #if HOTENDS >= 1 + VP_E0_STEP_PER_MM, + #endif + #if HOTENDS >= 2 + VP_E1_STEP_PER_MM, + #endif + 0x0000 +}; + +const uint16_t VPList_PIDE0[] PROGMEM = { + #if ENABLED(PIDTEMP) + VP_E0_PID_P, + VP_E0_PID_I, + VP_E0_PID_D, + #endif + 0x0000 +}; + +const uint16_t VPList_PIDBED[] PROGMEM = { + #if ENABLED(PIDTEMP) + VP_BED_PID_P, + VP_BED_PID_I, + VP_BED_PID_D, + #endif + 0x0000 +}; + +const uint16_t VPList_Infos[] PROGMEM = { + VP_MARLIN_VERSION, + VP_PrintTime, + #if ENABLED(PRINTCOUNTER) + VP_PrintAccTime, + VP_PrintsTotal, + #endif + 0x0000 +}; + +const uint16_t VPList_PIDTuningWaiting[] PROGMEM = { + VP_WAITING_STATUS, + 0x0000 +}; + +const uint16_t VPList_FLCPreheat[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_FLCPrinting[] PROGMEM = { + #if HOTENDS >= 1 + VP_SD_Print_ProbeOffsetZ, + #endif + 0x0000 +}; + +const uint16_t VPList_Z_Offset[] PROGMEM = { + #if HOTENDS >= 1 + VP_SD_Print_ProbeOffsetZ, + #endif + 0x0000 +}; + +const struct VPMapping VPMap[] PROGMEM = { + { DGUSLCD_SCREEN_BOOT, VPList_Boot }, + { DGUSLCD_SCREEN_MAIN, VPList_Main }, + { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, + { DGUSLCD_SCREEN_STATUS, VPList_Status }, + { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, + { DGUSLCD_SCREEN_PREHEAT, VPList_Preheat }, + { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, + { DGUSLCD_SCREEN_Z_OFFSET, VPList_Z_Offset }, + { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, + { DGUSLCD_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, + { DGUSLCD_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, + { DGUSLCD_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, + { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, + { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, + { DGUSLCD_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, + { DGUSLCD_SCREEN_WAITING, VPList_PIDTuningWaiting }, + { DGUSLCD_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, + { DGUSLCD_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, + { DGUSLCD_SCREEN_STEPPERMM, VPList_StepPerMM }, + { DGUSLCD_SCREEN_PID_E, VPList_PIDE0 }, + { DGUSLCD_SCREEN_PID_BED, VPList_PIDBED }, + { DGUSLCD_SCREEN_INFOS, VPList_Infos }, + { 0 , nullptr } // List is terminated with an nullptr as table entry. +}; + +const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; + +// Helper to define a DGUS_VP_Variable for common use cases. +#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=sizeof(VPADRVAR), \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } + +// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) +#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=STRLEN, \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } + +const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { + // Helper to detect touch events + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + #endif + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), + + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), + #endif + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + 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, &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, &ScreenHandler.HandleMotorLockUnlock, nullptr), + #if ENABLED(POWER_LOSS_RECOVERY) + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), + #endif + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), + #if ENABLED(SINGLE_Z_CALIBRATION) + VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), + #endif + #if ENABLED(FIRST_LAYER_CAL) + 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 =&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 =&ScreenHandler.DGUSLCD_SendStringToDisplay }, + + // 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_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, &ScreenHandler.HandlePreheat, nullptr), + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + 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, 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, 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, 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, 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], 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, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), + + // Position Data + 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, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), + + // Print Time + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay ), + #if ENABLED(PRINTCOUNTER) + 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], 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)], 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)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + #endif + + // SDCard File listing. + #if ENABLED(SDSUPPORT) + 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, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + #if ENABLED(BABYSTEPPING) + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + #endif + #endif + #endif + + #if ENABLED(DGUS_UI_WAITING) + 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 = &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. +}; + +#endif // DGUS_LCD_UI_HIPRECY diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h new file mode 100644 index 00000000..3ff5e06d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.h @@ -0,0 +1,290 @@ +/** + * 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 + +enum DGUSLCD_Screens : uint8_t { + DGUSLCD_SCREEN_BOOT = 160, + DGUSLCD_SCREEN_MAIN = 1, + DGUSLCD_SCREEN_STATUS = 1, + DGUSLCD_SCREEN_STATUS2 = 1, + DGUSLCD_SCREEN_POWER_LOSS = 17, + DGUSLCD_SCREEN_TEMPERATURE = 40, + DGUSLCD_SCREEN_MANUALMOVE = 86, + DGUSLCD_SCREEN_PREHEAT = 48, + DGUSLCD_SCREEN_UTILITY = 70, + DGUSLCD_SCREEN_FILAMENT_HEATING = 80, + DGUSLCD_SCREEN_FILAMENT_LOADING = 76, + DGUSLCD_SCREEN_FILAMENT_UNLOADING = 82, + DGUSLCD_SCREEN_MANUALEXTRUDE = 84, + DGUSLCD_SCREEN_Z_OFFSET = 88, + DGUSLCD_SCREEN_SDFILELIST = 3, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 7, + DGUSLCD_SCREEN_SDPRINTTUNE = 9, + DGUSLCD_SCREEN_FLC_PREHEAT = 94, + DGUSLCD_SCREEN_FLC_PRINTING = 96, + DGUSLCD_SCREEN_STEPPERMM = 122, + DGUSLCD_SCREEN_PID_E = 126, + DGUSLCD_SCREEN_PID_BED = 128, + DGUSLCD_SCREEN_INFOS = 131, + DGUSLCD_SCREEN_CONFIRM = 240, + DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUSLCD_SCREEN_WAITING = 251, + DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUSLDC_SCREEN_UNUSED = 255 +}; + +// Display Memory layout used (T5UID) +// Except system variables this is arbitrary, just to organize stuff.... + +// 0x0000 .. 0x0FFF -- System variables and reserved by the display +// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version +// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) +// 0x3000 .. 0x4FFF -- Marlin Data to be displayed +// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused + +// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, +// so that we can keep variables nicely together in the address space. + +// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. +constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible +constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible +constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. +constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. + +// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. +constexpr uint16_t VP_MSGSTR1 = 0x1100; +constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... +constexpr uint16_t VP_MSGSTR2 = 0x1140; +constexpr uint8_t VP_MSGSTR2_LEN = 0x20; +constexpr uint16_t VP_MSGSTR3 = 0x1180; +constexpr uint8_t VP_MSGSTR3_LEN = 0x20; +constexpr uint16_t VP_MSGSTR4 = 0x11C0; +constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + +// Screenchange request for screens that only make sense when printer is idle. +// e.g movement is only allowed if printer is not printing. +// Marlin must confirm by setting the screen manually. +constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; +constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. +constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= +constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. + +constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. + +// Buttons on the SD-Card File listing. +constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down +constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. +constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + +constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints +constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) +constexpr uint16_t VP_SD_Print_Setting = 0x2040; +constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up + +// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values +// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) +// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us +// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. +constexpr uint16_t VP_MOVE_X = 0x2100; +constexpr uint16_t VP_MOVE_Y = 0x2102; +constexpr uint16_t VP_MOVE_Z = 0x2104; +constexpr uint16_t VP_MOVE_E0 = 0x2110; +constexpr uint16_t VP_MOVE_E1 = 0x2112; +//constexpr uint16_t VP_MOVE_E2 = 0x2114; +//constexpr uint16_t VP_MOVE_E3 = 0x2116; +//constexpr uint16_t VP_MOVE_E4 = 0x2118; +//constexpr uint16_t VP_MOVE_E5 = 0x211A; +constexpr uint16_t VP_HOME_ALL = 0x2120; +constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; + +// Power loss recovery +constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; + +// Fan Control Buttons , switch between "off" and "on" +constexpr uint16_t VP_FAN0_CONTROL = 0x2200; +constexpr uint16_t VP_FAN1_CONTROL = 0x2202; +//constexpr uint16_t VP_FAN2_CONTROL = 0x2204; +//constexpr uint16_t VP_FAN3_CONTROL = 0x2206; + +// Heater Control Buttons , triged between "cool down" and "heat PLA" state +constexpr uint16_t VP_E0_CONTROL = 0x2210; +constexpr uint16_t VP_E1_CONTROL = 0x2212; +//constexpr uint16_t VP_E2_CONTROL = 0x2214; +//constexpr uint16_t VP_E3_CONTROL = 0x2216; +//constexpr uint16_t VP_E4_CONTROL = 0x2218; +//constexpr uint16_t VP_E5_CONTROL = 0x221A; +constexpr uint16_t VP_BED_CONTROL = 0x221C; + +// Preheat +constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; +//constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; +//constexpr uint16_t VP_E2_BED_PREHEAT = 0x2224; +//constexpr uint16_t VP_E3_BED_PREHEAT = 0x2226; +//constexpr uint16_t VP_E4_BED_PREHEAT = 0x2228; +//constexpr uint16_t VP_E5_BED_PREHEAT = 0x222A; + +// Filament load and unload +constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; + +// Settings store , reset +constexpr uint16_t VP_SETTINGS = 0x2400; + +// PID autotune +constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; +//constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; +//constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; +//constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; +//constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; +//constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; +constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; + +// Calibrate Z +constexpr uint16_t VP_Z_CALIBRATE = 0x2430; + +// First layer cal +constexpr uint16_t VP_Z_FIRST_LAYER_CAL = 0x2500; // Data: 0 - Cancel first layer cal progress, >0 filament type have loaded + +// Firmware version on the boot screen. +constexpr uint16_t VP_MARLIN_VERSION = 0x3000; +constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + +// Place for status messages. +constexpr uint16_t VP_M117 = 0x3020; +constexpr uint8_t VP_M117_LEN = 0x20; + +// Temperatures. +constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer +constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer +constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer + +// reserved to support up to 6 Extruders: +//constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer +//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer +//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer +//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer +//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer +//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer +//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer + +constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer +constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer + +constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer +constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer + +// reserved for up to 6 Extruders: +//constexpr uint16_t VP_Flowrate_E2 = 0x3094; +//constexpr uint16_t VP_Flowrate_E3 = 0x3096; +//constexpr uint16_t VP_Flowrate_E4 = 0x3098; +//constexpr uint16_t VP_Flowrate_E5 = 0x309A; + +constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan1_Percentage = 0x3102; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan2_Percentage = 0x3104; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan3_Percentage = 0x3106; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Feedrate_Percentage = 0x3108; // 2 Byte Integer (0..100) + +// Actual Position +constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy +constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy +constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy + +constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy + +constexpr uint16_t VP_PrintProgress_Percentage = 0x3130; // 2 Byte Integer (0..100) + +constexpr uint16_t VP_PrintTime = 0x3140; +constexpr uint16_t VP_PrintTime_LEN = 32; + +constexpr uint16_t VP_PrintAccTime = 0x3160; +constexpr uint16_t VP_PrintAccTime_LEN = 32; + +constexpr uint16_t VP_PrintsTotal = 0x3180; +constexpr uint16_t VP_PrintsTotal_LEN = 16; + +// SDCard File Listing +constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. +constexpr uint16_t DGUS_SD_FILESPERSCREEN = 5; // FIXME move that info to the display and read it from there. +constexpr uint16_t VP_SD_FileName0 = 0x3200; +constexpr uint16_t VP_SD_FileName1 = 0x3220; +constexpr uint16_t VP_SD_FileName2 = 0x3240; +constexpr uint16_t VP_SD_FileName3 = 0x3260; +constexpr uint16_t VP_SD_FileName4 = 0x3280; + +constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; // + +constexpr uint16_t VP_SD_Print_Filename = 0x32C0; // +// Fan status +constexpr uint16_t VP_FAN0_STATUS = 0x3300; +constexpr uint16_t VP_FAN1_STATUS = 0x3302; +//constexpr uint16_t VP_FAN2_STATUS = 0x3304; +//constexpr uint16_t VP_FAN3_STATUS = 0x3306; + +// Heater status +constexpr uint16_t VP_E0_STATUS = 0x3310; +//constexpr uint16_t VP_E1_STATUS = 0x3312; +//constexpr uint16_t VP_E2_STATUS = 0x3314; +//constexpr uint16_t VP_E3_STATUS = 0x3316; +//constexpr uint16_t VP_E4_STATUS = 0x3318; +//constexpr uint16_t VP_E5_STATUS = 0x331A; +constexpr uint16_t VP_BED_STATUS = 0x331C; + +constexpr uint16_t VP_MOVE_OPTION = 0x3400; + +// Step per mm +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , 2 byte unsigned int , 0~1638.4 +//constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; +constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; +//constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; +constexpr uint16_t VP_Z_STEP_PER_MM = 0x3608; +//constexpr uint16_t VP_Z2_STEP_PER_MM = 0x360A; +constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; +//constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; +//constexpr uint16_t VP_E2_STEP_PER_MM = 0x3614; +//constexpr uint16_t VP_E3_STEP_PER_MM = 0x3616; +//constexpr uint16_t VP_E4_STEP_PER_MM = 0x3618; +//constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; + +// PIDs +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 +constexpr uint16_t VP_E0_PID_I = 0x3702; +constexpr uint16_t VP_E0_PID_D = 0x3704; +constexpr uint16_t VP_BED_PID_P = 0x3710; +constexpr uint16_t VP_BED_PID_I = 0x3712; +constexpr uint16_t VP_BED_PID_D = 0x3714; + +// Wating screen status +constexpr uint16_t VP_WAITING_STATUS = 0x3800; + +// SPs for certain variables... +// located at 0x5000 and up +// Not used yet! +// This can be used e.g to make controls / data display invisible +constexpr uint16_t SP_T_E0_Is = 0x5000; +constexpr uint16_t SP_T_E0_Set = 0x5010; +constexpr uint16_t SP_T_E1_Is = 0x5020; +constexpr uint16_t SP_T_Bed_Is = 0x5030; +constexpr uint16_t SP_T_Bed_Set = 0x5040; diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp new file mode 100644 index 00000000..f9d4351e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -0,0 +1,310 @@ +/** + * 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 . + * + */ + +/* DGUS implementation written by coldtobi in 2019 for Marlin */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_ORIGIN) + +#include "../DGUSDisplayDef.h" +#include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" + +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#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, + 0x0000 +}; + +const uint16_t VPList_Main[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded. */ + 0x0000 +}; + +const uint16_t VPList_Temp[] PROGMEM = { + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + 0x0000 +}; + +const uint16_t VPList_Status[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded */ + #if HOTENDS >= 1 + VP_T_E0_Is, VP_T_E0_Set, + #endif + #if HOTENDS >= 2 + VP_T_E1_Is, VP_T_E1_Set, + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, + #endif + #if HAS_FAN + VP_Fan0_Percentage, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + VP_PrintProgress_Percentage, + 0x0000 +}; + +const uint16_t VPList_Status2[] PROGMEM = { + /* VP_M117, for completeness, but it cannot be auto-uploaded */ + #if HOTENDS >= 1 + VP_Flowrate_E0, + #endif + #if HOTENDS >= 2 + VP_Flowrate_E1, + #endif + VP_PrintProgress_Percentage, + VP_PrintTime, + 0x0000 +}; + +const uint16_t VPList_ManualMove[] PROGMEM = { + VP_XPos, VP_YPos, VP_ZPos, + 0x0000 +}; + +const uint16_t VPList_ManualExtrude[] PROGMEM = { + VP_EPos, + 0x0000 +}; + +const uint16_t VPList_FanAndFeedrate[] PROGMEM = { + VP_Feedrate_Percentage, VP_Fan0_Percentage, + 0x0000 +}; + +const uint16_t VPList_SD_FlowRates[] PROGMEM = { + VP_Flowrate_E0, VP_Flowrate_E1, + 0x0000 +}; + +const uint16_t VPList_SDFileList[] PROGMEM = { + VP_SD_FileName0, VP_SD_FileName1, VP_SD_FileName2, VP_SD_FileName3, VP_SD_FileName4, + 0x0000 +}; + +const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { + VP_PrintProgress_Percentage, VP_PrintTime, + 0x0000 +}; + +const struct VPMapping VPMap[] PROGMEM = { + { DGUSLCD_SCREEN_BOOT, VPList_Boot }, + { DGUSLCD_SCREEN_MAIN, VPList_Main }, + { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, + { DGUSLCD_SCREEN_STATUS, VPList_Status }, + { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, + { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, + { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, + { DGUSLCD_SCREEN_FANANDFEEDRATE, VPList_FanAndFeedrate }, + { DGUSLCD_SCREEN_FLOWRATES, VPList_SD_FlowRates }, + { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, + { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, + { 0 , nullptr } // List is terminated with an nullptr as table entry. +}; + +const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; + +// Helper to define a DGUS_VP_Variable for common use cases. +#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=sizeof(VPADRVAR), \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } + +// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) +#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR ) { .VP=VPADR, .memadr=VPADRVAR, .size=STRLEN, \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR } + +const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { + // Helper to detect touch events + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + #endif + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), + + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + VPHELPER(VP_MOVE_OPTION, &distanceToMove, &ScreenHandler.HandleManualMoveOption, nullptr), + #endif + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + 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, &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, &ScreenHandler.HandleMotorLockUnlock, nullptr), + #if ENABLED(POWER_LOSS_RECOVERY) + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), + #endif + 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 =&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 =&ScreenHandler.DGUSLCD_SendStringToDisplay }, + + // Temperature Data + #if HOTENDS >= 1 + 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), + 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, &ScreenHandler.HandlePreheat, nullptr), + #endif + #if ENABLED(PIDTEMP) + 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, &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, 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, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + #endif + #if HAS_HEATED_BED + 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, 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], 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, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay ), + + // Position Data + 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, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay ), + + // Print Time + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay ), + #if ENABLED(PRINTCOUNTER) + 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], 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)], 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)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + #endif + + // SDCard File listing. + #if ENABLED(SDSUPPORT) + 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, ScreenHandler.HandleProbeOffsetZChanged, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + #if ENABLED(BABYSTEPPING) + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + #endif + #endif + #endif + + #if ENABLED(DGUS_UI_WAITING) + 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 = &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. +}; + +#endif // DGUS_LCD_UI_ORIGIN diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h new file mode 100644 index 00000000..451c11ad --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.h @@ -0,0 +1,280 @@ +/** + * 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 + +enum DGUSLCD_Screens : uint8_t { + DGUSLCD_SCREEN_BOOT = 0, + DGUSLCD_SCREEN_MAIN = 10, + DGUSLCD_SCREEN_TEMPERATURE = 20, + DGUSLCD_SCREEN_STATUS = 30, + DGUSLCD_SCREEN_STATUS2 = 32, + DGUSLCD_SCREEN_MANUALMOVE = 40, + DGUSLCD_SCREEN_MANUALEXTRUDE=42, + DGUSLCD_SCREEN_FANANDFEEDRATE = 44, + DGUSLCD_SCREEN_FLOWRATES = 46, + DGUSLCD_SCREEN_SDFILELIST = 50, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 52, + DGUSLCD_SCREEN_POWER_LOSS = 100, + DGUSLCD_SCREEN_PREHEAT=120, + DGUSLCD_SCREEN_UTILITY=110, + DGUSLCD_SCREEN_FILAMENT_HEATING=146, + DGUSLCD_SCREEN_FILAMENT_LOADING=148, + DGUSLCD_SCREEN_FILAMENT_UNLOADING=158, + DGUSLCD_SCREEN_SDPRINTTUNE = 170, + DGUSLCD_SCREEN_CONFIRM = 240, + DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUSLCD_SCREEN_WAITING = 251, + DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUSLDC_SCREEN_UNUSED = 255 +}; + +// Display Memory layout used (T5UID) +// Except system variables this is arbitrary, just to organize stuff.... + +// 0x0000 .. 0x0FFF -- System variables and reserved by the display +// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version +// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) +// 0x3000 .. 0x4FFF -- Marlin Data to be displayed +// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused + +// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, +// so that we can keep variables nicely together in the address space. + +// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. +constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible +constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible +constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. +constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. + +// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. +constexpr uint16_t VP_MSGSTR1 = 0x1100; +constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... +constexpr uint16_t VP_MSGSTR2 = 0x1140; +constexpr uint8_t VP_MSGSTR2_LEN = 0x20; +constexpr uint16_t VP_MSGSTR3 = 0x1180; +constexpr uint8_t VP_MSGSTR3_LEN = 0x20; +constexpr uint16_t VP_MSGSTR4 = 0x11C0; +constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + +// Screenchange request for screens that only make sense when printer is idle. +// e.g movement is only allowed if printer is not printing. +// Marlin must confirm by setting the screen manually. +constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; +constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. +constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= +constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. + +constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. + +// Buttons on the SD-Card File listing. +constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down +constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. +constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + +constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints +constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) +constexpr uint16_t VP_SD_Print_Setting = 0x2040; +constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up + +// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values +// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) +// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us +// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. +constexpr uint16_t VP_MOVE_X = 0x2100; +constexpr uint16_t VP_MOVE_Y = 0x2102; +constexpr uint16_t VP_MOVE_Z = 0x2104; +constexpr uint16_t VP_MOVE_E0 = 0x2110; +constexpr uint16_t VP_MOVE_E1 = 0x2112; +//constexpr uint16_t VP_MOVE_E2 = 0x2114; +//constexpr uint16_t VP_MOVE_E3 = 0x2116; +//constexpr uint16_t VP_MOVE_E4 = 0x2118; +//constexpr uint16_t VP_MOVE_E5 = 0x211A; +constexpr uint16_t VP_HOME_ALL = 0x2120; +constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; + +// Power loss recovery +constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; + +// Fan Control Buttons , switch between "off" and "on" +constexpr uint16_t VP_FAN0_CONTROL = 0x2200; +constexpr uint16_t VP_FAN1_CONTROL = 0x2202; +//constexpr uint16_t VP_FAN2_CONTROL = 0x2204; +//constexpr uint16_t VP_FAN3_CONTROL = 0x2206; + +// Heater Control Buttons , triged between "cool down" and "heat PLA" state +constexpr uint16_t VP_E0_CONTROL = 0x2210; +constexpr uint16_t VP_E1_CONTROL = 0x2212; +//constexpr uint16_t VP_E2_CONTROL = 0x2214; +//constexpr uint16_t VP_E3_CONTROL = 0x2216; +//constexpr uint16_t VP_E4_CONTROL = 0x2218; +//constexpr uint16_t VP_E5_CONTROL = 0x221A; +constexpr uint16_t VP_BED_CONTROL = 0x221C; + +// Preheat +constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; +constexpr uint16_t VP_E1_BED_CONTROL = 0x2222; +//constexpr uint16_t VP_E2_BED_CONTROL = 0x2224; +//constexpr uint16_t VP_E3_BED_CONTROL = 0x2226; +//constexpr uint16_t VP_E4_BED_CONTROL = 0x2228; +//constexpr uint16_t VP_E5_BED_CONTROL = 0x222A; + +// Filament load and unload +constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; +constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; + +// Settings store , reset +constexpr uint16_t VP_SETTINGS = 0x2400; + +// PID autotune +constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; +//constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; +//constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; +//constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; +//constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; +//constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; +constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; + +// Firmware version on the boot screen. +constexpr uint16_t VP_MARLIN_VERSION = 0x3000; +constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + +// Place for status messages. +constexpr uint16_t VP_M117 = 0x3020; +constexpr uint8_t VP_M117_LEN = 0x20; + +// Temperatures. +constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer +constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer +constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer + +// reserved to support up to 6 Extruders: +//constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer +//constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer +//constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer +//constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer +//constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer +//constexpr uint16_t VP_T_E4_Is = 0x3074; // 4 Byte Integer +//constexpr uint16_t VP_T_E4_Set = 0x3076; // 2 Byte Integer +//constexpr uint16_t VP_T_E5_Is = 0x3078; // 4 Byte Integer +//constexpr uint16_t VP_T_E5_Set = 0x307A; // 2 Byte Integer + +constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer +constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer + +constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer +constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer + +// reserved for up to 6 Extruders: +//constexpr uint16_t VP_Flowrate_E2 = 0x3094; +//constexpr uint16_t VP_Flowrate_E3 = 0x3096; +//constexpr uint16_t VP_Flowrate_E4 = 0x3098; +//constexpr uint16_t VP_Flowrate_E5 = 0x309A; + +constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) +constexpr uint16_t VP_Fan1_Percentage = 0x33A2; // 2 Byte Integer (0..100) +//constexpr uint16_t VP_Fan2_Percentage = 0x33A4; // 2 Byte Integer (0..100) +//constexpr uint16_t VP_Fan3_Percentage = 0x33A6; // 2 Byte Integer (0..100) + +constexpr uint16_t VP_Feedrate_Percentage = 0x3102; // 2 Byte Integer (0..100) +constexpr uint16_t VP_PrintProgress_Percentage = 0x3104; // 2 Byte Integer (0..100) + +constexpr uint16_t VP_PrintTime = 0x3106; +constexpr uint16_t VP_PrintTime_LEN = 10; + +constexpr uint16_t VP_PrintAccTime = 0x3160; +constexpr uint16_t VP_PrintAccTime_LEN = 32; + +constexpr uint16_t VP_PrintsTotal = 0x3180; +constexpr uint16_t VP_PrintsTotal_LEN = 16; + +// Actual Position +constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy +constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy +constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy + +constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy + +// SDCard File Listing +constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. +constexpr uint16_t DGUS_SD_FILESPERSCREEN = 5; // FIXME move that info to the display and read it from there. +constexpr uint16_t VP_SD_FileName0 = 0x3200; +constexpr uint16_t VP_SD_FileName1 = 0x3220; +constexpr uint16_t VP_SD_FileName2 = 0x3240; +constexpr uint16_t VP_SD_FileName3 = 0x3260; +constexpr uint16_t VP_SD_FileName4 = 0x3280; + +constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; // +constexpr uint16_t VP_SD_Print_Filename = 0x32C0; // + +// Fan status +constexpr uint16_t VP_FAN0_STATUS = 0x3300; +constexpr uint16_t VP_FAN1_STATUS = 0x3302; +//constexpr uint16_t VP_FAN2_STATUS = 0x3304; +//constexpr uint16_t VP_FAN3_STATUS = 0x3306; + +// Heater status +constexpr uint16_t VP_E0_STATUS = 0x3310; +//constexpr uint16_t VP_E1_STATUS = 0x3312; +//constexpr uint16_t VP_E2_STATUS = 0x3314; +//constexpr uint16_t VP_E3_STATUS = 0x3316; +//constexpr uint16_t VP_E4_STATUS = 0x3318; +//constexpr uint16_t VP_E5_STATUS = 0x331A; +constexpr uint16_t VP_BED_STATUS = 0x331C; + +constexpr uint16_t VP_MOVE_OPTION = 0x3400; + +// Step per mm +constexpr uint16_t VP_X_STEP_PER_MM = 0x3600; // at the moment , 2 byte unsigned int , 0~1638.4 +//constexpr uint16_t VP_X2_STEP_PER_MM = 0x3602; +constexpr uint16_t VP_Y_STEP_PER_MM = 0x3604; +//constexpr uint16_t VP_Y2_STEP_PER_MM = 0x3606; +constexpr uint16_t VP_Z_STEP_PER_MM = 0x3608; +//constexpr uint16_t VP_Z2_STEP_PER_MM = 0x360A; +constexpr uint16_t VP_E0_STEP_PER_MM = 0x3610; +//constexpr uint16_t VP_E1_STEP_PER_MM = 0x3612; +//constexpr uint16_t VP_E2_STEP_PER_MM = 0x3614; +//constexpr uint16_t VP_E3_STEP_PER_MM = 0x3616; +//constexpr uint16_t VP_E4_STEP_PER_MM = 0x3618; +//constexpr uint16_t VP_E5_STEP_PER_MM = 0x361A; + +// PIDs +constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 +constexpr uint16_t VP_E0_PID_I = 0x3702; +constexpr uint16_t VP_E0_PID_D = 0x3704; +constexpr uint16_t VP_BED_PID_P = 0x3710; +constexpr uint16_t VP_BED_PID_I = 0x3712; +constexpr uint16_t VP_BED_PID_D = 0x3714; + +// Wating screen status +constexpr uint16_t VP_WAITING_STATUS = 0x3800; + +// SPs for certain variables... +// located at 0x5000 and up +// Not used yet! +// This can be used e.g to make controls / data display invisible +constexpr uint16_t SP_T_E0_Is = 0x5000; +constexpr uint16_t SP_T_E0_Set = 0x5010; +constexpr uint16_t SP_T_E1_Is = 0x5020; +constexpr uint16_t SP_T_Bed_Is = 0x5030; +constexpr uint16_t SP_T_Bed_Set = 0x5040; 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 new file mode 100644 index 00000000..2c466ffd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.cpp @@ -0,0 +1,553 @@ +/********************* + * flash_storage.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../compat.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "../ftdi_eve_lib/ftdi_eve_lib.h" + +#include "media_file_reader.h" +#include "flash_storage.h" + +// The following must be changed whenever the layout of the flash +// data is changed in a manner that would render the data invalid. + +constexpr uint32_t flash_eeprom_version = 1; + +/* SPI Flash Memory Map: + * + * The following offsets and sizes are specified in 4k erase units: + * + * Page Size Description + * 0 16 DATA STORAGE AREA + * 16 1 VERSIONING DATA + * 17 inf MEDIA STORAGE AREA + */ + +#define DATA_STORAGE_SIZE_64K + +using namespace FTDI::SPI; +using namespace FTDI::SPI::most_significant_byte_first; + +bool UIFlashStorage::is_present = false; + +#ifdef SPI_FLASH_SS +/************************** SPI Flash Chip Interface **************************/ + + void SPIFlash::wait_while_busy() { + uint8_t status; + safe_delay(1); + do { + spi_flash_select(); + spi_write_8(READ_STATUS_1); + status = spi_read_8(); + spi_flash_deselect(); + safe_delay(1); + } while (status & 1); + } + + void SPIFlash::erase_sector_4k(uint32_t addr) { + spi_flash_select(); + spi_write_8(WRITE_ENABLE); + spi_flash_deselect(); + + spi_flash_select(); + spi_write_8(ERASE_4K); + spi_write_24(addr); + spi_flash_deselect(); + + wait_while_busy(); + } + + void SPIFlash::erase_sector_64k(uint32_t addr) { + spi_flash_select(); + spi_write_8(WRITE_ENABLE); + spi_flash_deselect(); + + spi_flash_select(); + spi_write_8(ERASE_64K); + spi_write_24(addr); + spi_flash_deselect(); + + wait_while_busy(); + } + + void SPIFlash::spi_write_begin(uint32_t addr) { + spi_flash_select(); + spi_write_8(WRITE_ENABLE); + spi_flash_deselect(); + + spi_flash_select(); + spi_write_8(PAGE_PROGRAM); + spi_write_24(addr); + } + + void SPIFlash::spi_write_end() { + spi_flash_deselect(); + wait_while_busy(); + } + + void SPIFlash::spi_read_begin(uint32_t addr) { + spi_flash_select(); + spi_write_8(READ_DATA); + spi_write_24(addr); + } + + void SPIFlash::spi_read_end() { + spi_flash_deselect(); + } + + void SPIFlash::erase_chip() { + spi_flash_select(); + spi_write_8(WRITE_ENABLE); + spi_flash_deselect(); + + spi_flash_select(); + spi_write_8(ERASE_CHIP); + spi_flash_deselect(); + wait_while_busy(); + } + + void SPIFlash::read_jedec_id(uint8_t &manufacturer_id, uint8_t &device_type, uint8_t &capacity) { + spi_flash_select(); + spi_write_8(READ_JEDEC_ID); + manufacturer_id = spi_recv(); + device_type = spi_recv(); + capacity = spi_recv(); + spi_flash_deselect (); + } + + /* This function writes "size" bytes from "data" starting at addr, while properly + * taking into account the special case of writing across a 256 byte page boundary. + * Returns the addr directly after the write. + */ + uint32_t SPIFlash::write(uint32_t addr, const void *_data, size_t size) { + const uint8_t *data = (const uint8_t*) _data; + while (size) { + const uint32_t page_start = addr & 0xFFFF00ul; + const uint32_t page_end = page_start + 256; + const uint32_t write_size = min(page_end - addr, size); + spi_write_begin(addr); + spi_write_bulk(data, write_size); + spi_write_end(); + addr += write_size; + size -= write_size; + data += write_size; + } + return addr; + } + + uint32_t SPIFlash::read(uint32_t addr, void *data, size_t size) { + spi_read_begin(addr); + spi_read_bulk(data, size); + spi_read_end(); + return addr + size; + } + + /********************************** UTILITY ROUTINES *********************************/ + + bool UIFlashStorage::check_known_device() { + uint8_t manufacturer_id, device_type, capacity; + read_jedec_id(manufacturer_id, device_type, capacity); + + const bool is_known = + ((manufacturer_id == 0xEF) && (device_type == 0x40) && (capacity == 0x15)) || // unknown + ((manufacturer_id == 0x01) && (device_type == 0x40) && (capacity == 0x15)) || // Cypress S25FL116K + ((manufacturer_id == 0xEF) && (device_type == 0x14) && (capacity == 0x15)) || // Winbond W25Q16JV + ((manufacturer_id == 0x1F) && (device_type == 0x86) && (capacity == 0x01)) ; // Adesto AT255F161 + + if (!is_known) { + SERIAL_ECHO_MSG("Unable to locate supported SPI Flash Memory."); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" Manufacturer ID, got: ", manufacturer_id); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" Device Type , got: ", device_type); + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(" Capacity , got: ", capacity); + } + + return is_known; + } + + void UIFlashStorage::initialize() { + for (uint8_t i = 0; i < 10; i++) { + if (check_known_device()) { + is_present = true; + break; + } + safe_delay(1000); + } + } + + /**************************** DATA STORAGE AREA (first 4K or 64k) ********************/ + + #ifdef DATA_STORAGE_SIZE_64K + constexpr uint32_t data_storage_area_size = 64 * 1024; // Large erase unit + #else + constexpr uint32_t data_storage_area_size = 4 * 1024; // Small erase unit + #endif + + /* In order to provide some degree of wear leveling, each data write to the + * SPI Flash chip is appended to data that was already written before, until + * the data storage area is completely filled. New data is written preceeded + * with a 32-bit delimiter 'LULZ', so that we can distinguish written and + * unwritten data: + * + * 'LULZ' <--- 1st record delimiter + * + * + * + * 'LULZ' <--- 2nd record delimiter + * + * + * + * ... + * 'LULZ' <--- Last record delimiter + * + * + * + * 0xFF <--- Start of free space + * 0xFF + * ... + * + * This function walks down the data storage area, verifying that the + * delimiters are either 'LULZ' or 0xFFFFFFFF. In the case that an invalid + * delimiter is found, this function returns -1, indicating that the Flash + * data is invalid (this will happen if the block_size changed with respect + * to earlier firmware). Otherwise, it returns the offset of the last + * valid delimiter 'LULZ', indicating the most recently written data. + */ + int32_t UIFlashStorage::get_config_read_offset(uint32_t block_size) { + uint16_t stride = 4 + block_size; + int32_t read_offset = -1; + + for (uint32_t offset = 0; offset < (data_storage_area_size - stride); offset += stride) { + uint32_t delim; + spi_read_begin(offset); + spi_read_bulk (&delim, sizeof(delim)); + spi_read_end(); + switch (delim) { + case 0xFFFFFFFFul: return read_offset; + case delimiter: read_offset = offset; break; + default: + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("Invalid delimiter in Flash: ", delim); + return -1; + } + } + SERIAL_ECHO_MSG("No LULZ delimiter found."); + return -1; + } + + /* This function returns the offset at which new data should be + * appended, or -1 if the Flash needs to be erased */ + int32_t UIFlashStorage::get_config_write_offset(uint32_t block_size) { + int32_t read_offset = get_config_read_offset(block_size); + if (read_offset == -1) return -1; // The SPI flash is invalid + + int32_t write_offset = read_offset + 4 + block_size; + if ((write_offset + 4 + block_size) > data_storage_area_size) { + SERIAL_ECHO_MSG("Not enough free space in Flash."); + return -1; // Not enough free space + } + return write_offset; + } + + bool UIFlashStorage::verify_config_data(const void *data, size_t size) { + if (!is_present) return false; + + int32_t read_addr = get_config_read_offset(size); + if (read_addr == -1) return false; + + uint32_t delim; + spi_read_begin(read_addr); + spi_read_bulk (&delim, sizeof(delim)); + bool ok = spi_verify_bulk(data,size); + spi_read_end(); + return ok && delim == delimiter; + } + + bool UIFlashStorage::read_config_data(void *data, size_t size) { + if (!is_present) return false; + + int32_t read_addr = get_config_read_offset(size); + if (read_addr == -1) return false; + + uint32_t delim; + spi_read_begin(read_addr); + spi_read_bulk (&delim, sizeof(delim)); + spi_read_bulk (data, size); + spi_read_end(); + return delim == delimiter; + } + + void UIFlashStorage::write_config_data(const void *data, size_t size) { + if (!is_present) { + SERIAL_ECHO_MSG("SPI Flash chip not present. Not saving UI settings."); + return; + } + + // Since Flash storage has a limited number of write cycles, + // make sure that the data is different before rewriting. + + if (verify_config_data(data, size)) { + SERIAL_ECHO_MSG("UI settings already written, skipping write."); + return; + } + + int16_t write_addr = get_config_write_offset(size); + if (write_addr == -1) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Erasing UI settings from SPI Flash... "); + #ifdef DATA_STORAGE_SIZE_64K + erase_sector_64k(0); + #else + erase_sector_4k(0); + #endif + write_addr = 0; + SERIAL_ECHOLNPGM("DONE"); + } + + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("Writing UI settings to SPI Flash (offset ", write_addr); + SERIAL_ECHOPGM(")..."); + + const uint32_t delim = delimiter; + write_addr = write(write_addr, &delim, sizeof(delim)); + write_addr = write(write_addr, data, size); + + SERIAL_ECHOLNPGM("DONE"); + } + + /************************** VERSIONING INFO AREA ************************/ + + /* The version info area follows the data storage area. If the version + * is incorrect, the data on the chip is invalid and format_flash should + * be called. + */ + + typedef struct { + uint32_t magic; + uint32_t version; + } flash_version_info; + + constexpr uint32_t version_info_addr = data_storage_area_size; + constexpr uint32_t version_info_size = 4 * 1024; // Small erase unit + + bool UIFlashStorage::is_valid() { + flash_version_info info; + + spi_read_begin(version_info_addr); + spi_read_bulk (&info, sizeof(flash_version_info)); + spi_read_end(); + + return info.magic == delimiter && info.version == flash_eeprom_version; + } + + void UIFlashStorage::write_version_info() { + flash_version_info info; + + info.magic = delimiter; + info.version = flash_eeprom_version; + + spi_write_begin(version_info_addr); + spi_write_bulk(&info, sizeof(flash_version_info)); + spi_write_end(); + } + + /**************************** MEDIA STORAGE AREA *****************************/ + + /* The media storage area follows the versioning info area. It consists + * of a file index followed by the data for one or more media files. + * + * The file index consists of an array of 32-bit file sizes. If a file + * is not present, the file's size will be set to 0xFFFFFFFF + */ + + constexpr uint32_t media_storage_addr = version_info_addr + version_info_size; + constexpr uint8_t media_storage_slots = 4; + + void UIFlashStorage::format_flash() { + SERIAL_ECHO_START(); SERIAL_ECHOPGM("Erasing SPI Flash..."); + SPIFlash::erase_chip(); + SERIAL_ECHOLNPGM("DONE"); + + write_version_info(); + } + + uint32_t UIFlashStorage::get_media_file_start(uint8_t slot) { + uint32_t addr = media_storage_addr + sizeof(uint32_t) * media_storage_slots; + spi_read_begin(media_storage_addr); + for (uint8_t i = 0; i < slot; i++) + addr += spi_read_32(); + spi_read_end(); + return addr; + } + + void UIFlashStorage::set_media_file_size(uint8_t slot, uint32_t size) { + spi_write_begin(media_storage_addr + sizeof(uint32_t) * slot); + spi_write_32(size); + spi_write_end(); + } + + uint32_t UIFlashStorage::get_media_file_size(uint8_t slot) { + spi_read_begin(media_storage_addr + sizeof(uint32_t) * slot); + uint32_t size = spi_read_32(); + spi_read_end(); + return size; + } + + /* Writes a media file from the SD card/USB flash drive into a slot on the SPI Flash. Media + * files must be written sequentially following by a chip erase and it is not possible to + * overwrite files. */ + UIFlashStorage::error_t UIFlashStorage::write_media_file(progmem_str filename, uint8_t slot) { + #if ENABLED(SDSUPPORT) + uint32_t addr; + uint8_t buff[write_page_size]; + + strcpy_P( (char*) buff, (const char*) filename); + + MediaFileReader reader; + if (!reader.open((char*) buff)) { + SERIAL_ECHO_MSG("Unable to find media file"); + return FILE_NOT_FOUND; + } + + if (get_media_file_size(slot) != 0xFFFFFFFFUL) { + SERIAL_ECHO_MSG("Media file already exists"); + return WOULD_OVERWRITE; + } + + SERIAL_ECHO_START(); SERIAL_ECHOPGM("Writing SPI Flash..."); + + set_media_file_size(slot, reader.size()); + addr = get_media_file_start(slot); + + // Write out the file itself + for (;;) { + const int16_t nBytes = reader.read(buff, write_page_size); + if (nBytes == -1) { + SERIAL_ECHOLNPGM("Failed to read from file"); + return READ_ERROR; + } + + addr = write(addr, buff, nBytes); + if (nBytes != write_page_size) break; + + TERN_(EXTENSIBLE_UI, ExtUI::yield()); + } + + SERIAL_ECHOLNPGM("DONE"); + + SERIAL_ECHO_START(); SERIAL_ECHOPGM("Verifying SPI Flash..."); + + bool verifyOk = true; + + // Verify the file index + + if (get_media_file_start(slot+1) != (get_media_file_start(slot) + reader.size())) { + SERIAL_ECHOLNPGM("File index verification failed. "); + verifyOk = false; + } + + // Verify the file itself + addr = get_media_file_start(slot); + reader.rewind(); + + while (verifyOk) { + const int16_t nBytes = reader.read(buff, write_page_size); + if (nBytes == -1) { + SERIAL_ECHOPGM("Failed to read from file"); + verifyOk = false; + break; + } + + spi_read_begin(addr); + if (!spi_verify_bulk(buff, nBytes)) { + verifyOk = false; + spi_read_end(); + break; + } + spi_read_end(); + + addr += nBytes; + if (nBytes != write_page_size) break; + TERN_(EXTENSIBLE_UI, ExtUI::yield()); + }; + + if (verifyOk) { + SERIAL_ECHOLNPGM("DONE"); + return SUCCESS; + } + else { + SERIAL_ECHOLNPGM("FAIL"); + return VERIFY_ERROR; + } + #else + return VERIFY_ERROR; + #endif // SDSUPPORT + } + + bool UIFlashStorage::BootMediaReader::isAvailable(uint32_t slot) { + if (!is_present) return false; + + bytes_remaining = get_media_file_size(slot); + if (bytes_remaining != 0xFFFFFFFFUL) { + SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("Boot media file size:", bytes_remaining); + addr = get_media_file_start(slot); + return true; + } + return false; + } + + int16_t UIFlashStorage::BootMediaReader::read(void *data, const size_t size) { + if (bytes_remaining == 0xFFFFFFFFUL) return -1; + + if (size > bytes_remaining) + return read(data, bytes_remaining); + + if (size > 0) { + spi_read_begin(addr); + spi_read_bulk(data, size); + spi_read_end(); + addr += size; + bytes_remaining -= size; + } + + return size; + } + + int16_t UIFlashStorage::BootMediaReader::read(void *obj, void *data, const size_t size) { + return reinterpret_cast(obj)->read(data, size); + } + +#else + void UIFlashStorage::initialize() {} + bool UIFlashStorage::is_valid() {return true;} + void UIFlashStorage::write_config_data(const void *, size_t) {} + bool UIFlashStorage::verify_config_data(const void *, size_t) {return false;} + bool UIFlashStorage::read_config_data(void *, size_t ) {return false;} + UIFlashStorage::error_t UIFlashStorage::write_media_file(progmem_str, uint8_t) {return FILE_NOT_FOUND;} + void UIFlashStorage::format_flash() {} + + bool UIFlashStorage::BootMediaReader::isAvailable(uint32_t) {return false;} + int16_t UIFlashStorage::BootMediaReader::read(void *, const size_t) {return -1;} + int16_t UIFlashStorage::BootMediaReader::read(void *, void *, const size_t) {return -1;} +#endif // SPI_FLASH_SS +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..3edc2a9d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/flash_storage.h @@ -0,0 +1,106 @@ +/******************* + * flash_storage.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +class SPIFlash { + public: + static constexpr uint32_t erase_unit_size = 4 * 1024; // Minimum erase unit + static constexpr uint32_t write_page_size = 256; // Minimum page write unit + + enum { + READ_STATUS_1 = 0x05, + READ_STATUS_2 = 0x35, + READ_STATUS_3 = 0x33, + WRITE_ENABLE = 0x06, + WRITE_DISABLE = 0x04, + READ_ID = 0x90, + READ_JEDEC_ID = 0x9F, + READ_DATA = 0x03, + PAGE_PROGRAM = 0x02, + ERASE_4K = 0x20, + ERASE_64K = 0xD8, + ERASE_CHIP = 0xC7 + }; + + static void wait_while_busy(); + static void erase_sector_4k(uint32_t addr); + static void erase_sector_64k(uint32_t addr); + static void erase_chip (); + + static void read_jedec_id(uint8_t &manufacturer_id, uint8_t &device_type, uint8_t &capacity); + + static void spi_read_begin(uint32_t addr); + static void spi_read_end(); + + static void spi_write_begin(uint32_t addr); + static void spi_write_end(); + + static uint32_t write(uint32_t addr, const void *data, size_t size); + static uint32_t read(uint32_t addr, void *data, size_t size); +}; + +class UIFlashStorage : private SPIFlash { + private: + + static bool is_present; + static int32_t get_config_read_offset(uint32_t block_size); + static int32_t get_config_write_offset(uint32_t block_size); + + static uint32_t get_media_file_start(uint8_t slot); + static void set_media_file_size(uint8_t slot, uint32_t size); + static uint32_t get_media_file_size(uint8_t slot); + + static constexpr uint32_t delimiter = 0x4D524C4E; // 'MRLN' + public: + enum error_t { + SUCCESS, + FILE_NOT_FOUND, + READ_ERROR, + VERIFY_ERROR, + WOULD_OVERWRITE + }; + + static void initialize (); + static void format_flash (); + static bool check_known_device(); + + static bool is_valid (); + static void write_version_info(); + + static void write_config_data (const void *data, size_t size); + static bool verify_config_data (const void *data, size_t size); + static bool read_config_data (void *data, size_t size); + static error_t write_media_file (progmem_str filename, uint8_t slot = 0); + + class BootMediaReader; +}; + +class UIFlashStorage::BootMediaReader { + private: + uint32_t addr; + uint32_t bytes_remaining; + + public: + bool isAvailable(uint32_t slot = 0); + int16_t read(void *buffer, size_t const size); + + static int16_t read(void *obj, void *buffer, const size_t size); +}; 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 new file mode 100644 index 00000000..46683401 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp @@ -0,0 +1,63 @@ +/************************ + * media_filereader.cpp * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../compat.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + #include "media_file_reader.h" + + #if ENABLED(SDSUPPORT) + bool MediaFileReader::open(const char* filename) { + card.init(SPI_SPEED, SDSS); + volume.init(&card); + root.openRoot(&volume); + return file.open(&root, filename, O_READ); + } + + int16_t MediaFileReader::read(void *buff, size_t bytes) { + return file.read(buff, bytes); + } + + void MediaFileReader::close() { + file.close(); + } + + uint32_t MediaFileReader::size() { + return file.fileSize(); + } + + void MediaFileReader::rewind() { + file.rewind(); + } + + int16_t MediaFileReader::read(void *obj, void *buff, size_t bytes) { + return reinterpret_cast(obj)->read(buff, bytes); + } + #else + bool MediaFileReader::open(const char*) {return -1;} + int16_t MediaFileReader::read(void *, size_t) {return 0;} + void MediaFileReader::close() {} + uint32_t MediaFileReader::size() {return 0;} + void MediaFileReader::rewind() {} + int16_t MediaFileReader::read(void *, void *, size_t) {return 0;} + #endif +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..fcaa610e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h @@ -0,0 +1,48 @@ +/********************** + * media_filereader.h * + **********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(SDSUPPORT) + #include "../../../../../sd/SdFile.h" + #include "../../../../../sd/cardreader.h" +#endif + +class MediaFileReader { + private: + #if ENABLED(SDSUPPORT) + Sd2Card card; + SdVolume volume; + SdFile root, file; + #endif + + public: + bool open(const char* filename); + int16_t read(void *buff, size_t bytes); + uint32_t size(); + void rewind(); + void close(); + + static int16_t read(void *obj, void *buff, size_t bytes); +}; 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 new file mode 100644 index 00000000..11ad0798 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/compat.h @@ -0,0 +1,52 @@ +/************ + * compat.h * + ************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/** + * This following provides compatibility whether compiling + * as a part of Marlin or outside it + */ + +#ifdef __has_include + #if __has_include("../../ui_api.h") + #include "../../ui_api.h" + #endif +#else + #include "../../ui_api.h" +#endif + +#ifdef __MARLIN_FIRMWARE__ + // __MARLIN_FIRMWARE__ exists when compiled within Marlin. + #include "pin_mappings.h" + #undef max + #define max(a,b) ((a)>(b)?(a):(b)) + #undef min + #define min(a,b) ((a)<(b)?(a):(b)) +#else + namespace UI { + static inline uint32_t safe_millis() {return millis();}; + static inline void yield() {}; + }; +#endif + +class __FlashStringHelper; +typedef const __FlashStringHelper *progmem_str; 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 new file mode 100644 index 00000000..7476c9e6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/config.h @@ -0,0 +1,26 @@ +/************ + * config.h * + ************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#include "compat.h" + +// Configure this display with options in Configuration_adv.h 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 new file mode 100644 index 00000000..e6000869 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + 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. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +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/README.md b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/README.md new file mode 100644 index 00000000..6ba985d6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/README.md @@ -0,0 +1,28 @@ +FTDI EVE Library +---------------- + +The FTDI EVE Library is a fully open-source library and UI framework for the FTDI +FT800 and FT810 graphics processor. + +Although the library has been developed within Lulzbot for providing a user interface +for Marlin, the library has been written so that it can be used in any Arduino sketch. + +The library is split into two parts. The "basic" API provides a shallow interface to +the underlying FTDI hardware and command FIFO and provides low-level access to the +hardware as closely as possible to the API described in the FTDI Programmer's Guide. + +The "extended" API builds on top of the "basic" API to provide a GUI framework for +handling common challenges in building a usable GUI. The GUI framework provides the +following features: + +- Macros for a resolution-independent placement of widgets based on a grid. +- Class-based UI screens, with press and unpress touch events, as well as touch repeat. +- Event loop with button debouncing and button push visual and auditory feedback. +- Easy screen-to-screen navigation including a navigation stack for going backwards. +- Visual feedback for disabled vs enabled buttons, and custom button styles. +- A sound player class for playing individual notes or complete sound sequences. +- Display list caching, for storing static background elements of a screen in RAM_G. + +See the "examples" folder for Arduino sketches. Modify the "src/config.h" file in +each to suit your particular setup. The "sample_configs" contain sample configuration +files for running the sketches on our 3D printer boards. 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 new file mode 100644 index 00000000..c09d10f1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h @@ -0,0 +1,184 @@ +/************ + * boards.h * + ************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#define HAS_RESOLUTION (defined(TOUCH_UI_320x240) || defined(TOUCH_UI_480x272) || defined(TOUCH_UI_800x480)) + +#define IS_FT800 \ + constexpr uint16_t ftdi_chip = 800; \ + using namespace FTDI_FT800; \ + namespace DL { \ + using namespace FTDI_FT800_DL; \ + } \ + typedef ft800_memory_map ftdi_memory_map; \ + typedef ft800_registers ftdi_registers; + +#define IS_FT810 \ + constexpr uint16_t ftdi_chip = 810; \ + using namespace FTDI_FT810; \ + namespace DL { \ + using namespace FTDI_FT800_DL; \ + using namespace FTDI_FT810_DL; \ + } \ + typedef ft810_memory_map ftdi_memory_map; \ + typedef ft810_registers ftdi_registers; + +#ifdef LCD_FTDI_VM800B35A + #if !HAS_RESOLUTION + #define TOUCH_UI_320x240 + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 800 + #endif + namespace FTDI { + IS_FT800 + constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; /* 1 = does use GPIO00 for amplifier control, 0 = not in use for Audio */ + constexpr bool GPIO_1_Audio_Shutdown = true; /* 1 = does use GPIO01 for amplifier control, 0 = not in use for Audio */ + constexpr uint8_t Swizzle = 2; + constexpr uint8_t CSpread = 1; + + constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ + } + +/** + * Settings for the Haoyu Electronics, 4.3" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY43B) + * and 5" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY50B) + * 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: + * 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 + #define TOUCH_UI_480x272 + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 800 + #endif + namespace FTDI { + IS_FT800 + constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = false; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ + } + +/** + * 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: + * https://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf + */ +#elif defined(LCD_HAOYU_FT810CB) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = false; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ + } + +/** + * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) + * https://4dsystems.com.au/4dlcd-ft843 + * Datasheet: + * https://4dsystems.com.au/mwdownloads/download/link/id/52/ + */ +#elif defined(LCD_4DSYSTEMS_4DLCD_FT843) + #if !HAS_RESOLUTION + #define TOUCH_UI_480x272 + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 800 + #endif + namespace FTDI { + IS_FT800 + constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = true; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ + } + +/** + * Settings for the Aleph Objects Color LCD User Interface + * Datasheet https://www.hantronix.com/files/data/s1501799605s500-gh7.pdf + */ +#elif defined(LCD_ALEPHOBJECTS_CLCD_UI) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = false; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = true; // The AO CLCD uses GPIO0 to enable audio + constexpr bool GPIO_1_Audio_Shutdown = false; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 0; + constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ + } + +/** + * FYSETC Color LCD + * https://www.aliexpress.com/item/4000627651757.html + * Product information: + * https://github.com/FYSETC/TFT81050 + */ +#elif defined(LCD_FYSETC_TFT81050) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = false; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = true; // The AO CLCD uses GPIO0 to enable audio + constexpr bool GPIO_1_Audio_Shutdown = false; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 0; + constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ + } +#else + + #error "Unknown or no TOUCH_UI_FTDI_EVE board specified. To add a new board, modify this file." + +#endif 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 new file mode 100644 index 00000000..bb95411e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -0,0 +1,1186 @@ +/**************** + * commands.cpp * + ****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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_basic.h" + +#ifdef FTDI_BASIC + +#define MULTIPLE_OF_4(val) ((((val)+3)>>2)<<2) + +using namespace FTDI; +using namespace FTDI::SPI; + +void CLCD::enable() { + mem_write_8(REG::PCLK, Pclk); +} + +void CLCD::disable() { + mem_write_8(REG::PCLK, 0x00); +} + +void CLCD::set_brightness(uint8_t brightness) { + mem_write_8(REG::PWM_DUTY, min(128,brightness)); +} + +uint8_t CLCD::get_brightness() { + return mem_read_8(REG::PWM_DUTY); +} + +void CLCD::turn_on_backlight() { + mem_write_8(REG::PWM_DUTY, 128); +} + +void CLCD::FontMetrics::load(const uint8_t font) { + static_assert(sizeof(FontMetrics) == 148, "Sizeof font metrics is incorrect"); + uint32_t rom_fontroot = mem_read_32(MAP::ROM_FONT_ADDR); + mem_read_bulk(rom_fontroot + 148 * (font - 16), (uint8_t*) this, 148); +} + +uint16_t CLCD::FontMetrics::get_text_width(const char *str, size_t n) const { + uint16_t width = 0; + const uint8_t *p = (const uint8_t *) str; + for (;;) { + const uint8_t val = *p++; n--; + if (!val || n == 0) break; + width += val < 128 ? char_widths[val] : 0; + } + return width; +} + +uint16_t CLCD::FontMetrics::get_text_width(progmem_str str, size_t n) const { + uint16_t width = 0; + const uint8_t *p = (const uint8_t *) str; + for (;;) { + const uint8_t val = pgm_read_byte(p++); n--; + if (!val || n == 0) break; + width += val < 128 ? char_widths[val] : 0; + } + return width; +} + +/************************** HOST COMMAND FUNCTION *********************************/ + +void CLCD::host_cmd(unsigned char host_command, unsigned char byte2) { // Sends 24-Bit Host Command to LCD + if (host_command != FTDI::ACTIVE) { + host_command |= 0x40; + } + spi_ftdi_select(); + spi_send(host_command); + spi_send(byte2); + spi_send(0x00); + spi_ftdi_deselect(); +} + +/************************** MEMORY READ FUNCTIONS *********************************/ + +void CLCD::spi_read_addr(uint32_t reg_address) { + spi_send((reg_address >> 16) & 0x3F); // Address [21:16] + spi_send((reg_address >> 8 ) & 0xFF); // Address [15:8] + spi_send((reg_address >> 0) & 0xFF); // Address [7:0] + spi_send(0x00); // Dummy Byte +} + +// Write 4-Byte Address, Read Multiple Bytes +void CLCD::mem_read_bulk(uint32_t reg_address, uint8_t *data, uint16_t len) { + spi_ftdi_select(); + spi_read_addr(reg_address); + spi_read_bulk (data, len); + spi_ftdi_deselect(); +} + +// Write 4-Byte Address, Read 1-Byte Data +uint8_t CLCD::mem_read_8(uint32_t reg_address) { + spi_ftdi_select(); + spi_read_addr(reg_address); + uint8_t r_data = spi_read_8(); + spi_ftdi_deselect(); + return r_data; +} + +// Write 4-Byte Address, Read 2-Bytes Data +uint16_t CLCD::mem_read_16(uint32_t reg_address) { + using namespace SPI::least_significant_byte_first; + spi_ftdi_select(); + spi_read_addr(reg_address); + uint16_t r_data = spi_read_16(); + spi_ftdi_deselect(); + return r_data; +} + +// Write 4-Byte Address, Read 4-Bytes Data +uint32_t CLCD::mem_read_32(uint32_t reg_address) { + using namespace SPI::least_significant_byte_first; + spi_ftdi_select(); + spi_read_addr(reg_address); + uint32_t r_data = spi_read_32(); + spi_ftdi_deselect(); + return r_data; +} + +/************************** MEMORY WRITE FUNCTIONS *********************************/ + +// Generic operations for transforming a byte, for use with _mem_write_bulk: +static inline uint8_t reverse_byte(uint8_t a) { + return ((a & 0x1) << 7) | ((a & 0x2) << 5) | + ((a & 0x4) << 3) | ((a & 0x8) << 1) | + ((a & 0x10) >> 1) | ((a & 0x20) >> 3) | + ((a & 0x40) >> 5) | ((a & 0x80) >> 7); +} +static inline uint8_t xbm_write(const uint8_t *p) {return reverse_byte(pgm_read_byte(p));} + +void CLCD::spi_write_addr(uint32_t reg_address) { + spi_send((reg_address >> 16) | 0x80); // Address [21:16] + spi_send((reg_address >> 8 ) & 0xFF); // Address [15:8] + spi_send((reg_address >> 0) & 0xFF); // Address [7:0] +} + +// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from RAM +void CLCD::mem_write_bulk(uint32_t reg_address, const void *data, uint16_t len, uint8_t padding) { + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_bulk(data, len, padding); + spi_ftdi_deselect(); +} + +// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM +void CLCD::mem_write_bulk(uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding) { + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_bulk(str, len, padding); + spi_ftdi_deselect(); +} + + // Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM +void CLCD::mem_write_pgm(uint32_t reg_address, const void *data, uint16_t len, uint8_t padding) { + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_bulk(data, len, padding); + spi_ftdi_deselect(); +} + +// Write 3-Byte Address, Multiple Bytes, plus padding bytes, from PROGMEM, reversing bytes (suitable for loading XBM images) +void CLCD::mem_write_xbm(uint32_t reg_address, progmem_str data, uint16_t len, uint8_t padding) { + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_bulk(data, len, padding); + spi_ftdi_deselect(); +} + +// Write 3-Byte Address, Write 1-Byte Data +void CLCD::mem_write_8(uint32_t reg_address, uint8_t data) { + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_8(data); + spi_ftdi_deselect(); +} + +// Write 3-Byte Address, Write 2-Bytes Data +void CLCD::mem_write_16(uint32_t reg_address, uint16_t data) { + using namespace SPI::least_significant_byte_first; + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_16(data); + spi_ftdi_deselect(); +} + +// Write 3-Byte Address, Write 4-Bytes Data +void CLCD::mem_write_32(uint32_t reg_address, uint32_t data) { + using namespace SPI::least_significant_byte_first; + spi_ftdi_select(); + spi_write_addr(reg_address); + spi_write_32(data); + spi_ftdi_deselect(); +} + +/******************* FT800/810 Co-processor Commands *********************************/ + +#if FTDI_API_LEVEL == 800 +uint32_t CLCD::CommandFifo::command_write_ptr = 0xFFFFFFFFul; +#endif + +void CLCD::CommandFifo::cmd(uint32_t cmd32) { + write((void*)&cmd32, sizeof(uint32_t)); +} + +void CLCD::CommandFifo::cmd(void* data, uint16_t len) { + write(data, len); +} + +void CLCD::CommandFifo::bgcolor(uint32_t rgb) { + cmd(CMD_BGCOLOR); + cmd(rgb); +} + +void CLCD::CommandFifo::fgcolor(uint32_t rgb) { + cmd(CMD_FGCOLOR); + cmd(rgb); +} + +void CLCD::CommandFifo::gradcolor(uint32_t rgb) { + cmd(CMD_GRADCOLOR); + cmd(rgb); +} + +// This sends the a text command to the command preprocessor, must be followed by str() +void CLCD::CommandFifo::button(int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t option) { + struct { + int32_t type = CMD_BUTTON; + int16_t x; + int16_t y; + int16_t w; + int16_t h; + int16_t font; + uint16_t option; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.font = font; + cmd_data.option = option; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +// This sends the a text command to the command preprocessor, must be followed by str() +void CLCD::CommandFifo::text(int16_t x, int16_t y, int16_t font, uint16_t options) { + struct { + int32_t type = CMD_TEXT; + int16_t x; + int16_t y; + int16_t font; + uint16_t options; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.font = font; + cmd_data.options = options; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +// This sends the a toggle command to the command preprocessor, must be followed by str() +void CLCD::CommandFifo::toggle(int16_t x, int16_t y, int16_t w, int16_t font, uint16_t options, bool state) { + struct { + int32_t type = CMD_TOGGLE; + int16_t x; + int16_t y; + int16_t w; + int16_t font; + uint16_t options; + uint16_t state; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.font = font; + cmd_data.options = options; + cmd_data.state = state ? 65535 : 0; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +// This sends the a keys command to the command preprocessor, must be followed by str() +void CLCD::CommandFifo::keys(int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t options) { + struct { + int32_t type = CMD_KEYS; + int16_t x; + int16_t y; + int16_t w; + int16_t h; + int16_t font; + uint16_t options; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.font = font; + cmd_data.options = options; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::clock(int16_t x, int16_t y, int16_t r, uint16_t options, int16_t h, int16_t m, int16_t s, int16_t ms) +{ + struct { + int32_t type = CMD_CLOCK; + int16_t x; + int16_t y; + int16_t r; + uint16_t options; + int16_t h; + int16_t m; + int16_t s; + int16_t ms; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.r = r; + cmd_data.options = options; + cmd_data.h = h; + cmd_data.m = m; + cmd_data.s = s; + cmd_data.ms = ms; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::gauge(int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range) +{ + struct { + int32_t type = CMD_GAUGE; + int16_t x; + int16_t y; + int16_t r; + uint16_t options; + uint16_t major; + uint16_t minor; + uint16_t val; + uint16_t range; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.r = r; + cmd_data.options = options; + cmd_data.major = major; + cmd_data.minor = minor; + cmd_data.val = val; + cmd_data.range = range; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::dial(int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t val) +{ + struct { + int32_t type = CMD_DIAL; + int16_t x; + int16_t y; + int16_t r; + uint16_t options; + uint16_t val; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.r = r; + cmd_data.options = options; + cmd_data.val = val; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::scrollbar(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t size, uint16_t range) { + struct { + int32_t type = CMD_SCROLLBAR; + int16_t x; + int16_t y; + int16_t w; + uint16_t h; + uint16_t options; + uint16_t val; + uint16_t size; + uint16_t range; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.options = options; + cmd_data.val = val; + cmd_data.size = size; + cmd_data.range = range; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::progress(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range) { + struct { + int32_t type = CMD_PROGRESS; + int16_t x; + int16_t y; + int16_t w; + int16_t h; + uint16_t options; + uint16_t val; + uint16_t range; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.options = options; + cmd_data.val = val; + cmd_data.range = range; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::slider(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range) { + struct { + int32_t type = CMD_SLIDER; + int16_t x; + int16_t y; + int16_t w; + int16_t h; + uint16_t options; + uint16_t val; + uint16_t range; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.options = options; + cmd_data.val = val; + cmd_data.range = range; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1) { + struct { + int32_t type = CMD_GRADIENT; + int16_t x0; + int16_t y0; + uint32_t rgb0; + int16_t x1; + int16_t y1; + uint32_t rgb1; + } cmd_data; + + cmd_data.x0 = x0; + cmd_data.y0 = y0; + cmd_data.rgb0 = rgb0; + cmd_data.x1 = x1; + cmd_data.y1 = y1; + cmd_data.rgb1 = rgb1; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::number(int16_t x, int16_t y, int16_t font, uint16_t options, int32_t n) { + struct { + int32_t type = CMD_NUMBER; + int16_t x; + int16_t y; + int16_t font; + uint16_t options; + int16_t n; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.font = font; + cmd_data.options = options; + cmd_data.n = n; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::memzero(uint32_t ptr, uint32_t size) { + struct { + uint32_t type = CMD_MEMZERO; + uint32_t ptr; + uint32_t size; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.size = size; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::memset(uint32_t ptr, uint32_t val, uint32_t size) { + struct { + uint32_t type = CMD_MEMSET; + uint32_t ptr; + uint32_t val; + uint32_t size; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.val = val; + cmd_data.size = size; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::memcpy(uint32_t dst, uint32_t src, uint32_t size) { + struct { + uint32_t type = CMD_MEMCPY; + uint32_t dst; + uint32_t src; + uint32_t size; + } cmd_data; + + cmd_data.dst = dst; + cmd_data.src = src; + cmd_data.size = size; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::memcrc(uint32_t ptr, uint32_t num, uint32_t result) { + struct { + uint32_t type = CMD_MEMCRC; + uint32_t ptr; + uint32_t num; + uint32_t result; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.num = num; + cmd_data.result = result; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::memwrite(uint32_t ptr, uint32_t value) { + struct { + uint32_t type = CMD_MEMWRITE; + uint32_t ptr; + uint32_t num; + uint32_t value; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.num = 4; + cmd_data.value = value; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::append(uint32_t ptr, uint32_t size) { + struct { + uint32_t type = CMD_APPEND; + uint32_t ptr; + uint32_t size; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.size = size; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::inflate(uint32_t ptr) { + struct { + uint32_t type = CMD_INFLATE; + uint32_t ptr; + } cmd_data; + + cmd_data.ptr = ptr; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::getptr(uint32_t result) { + struct { + uint32_t type = CMD_GETPTR; + uint32_t result; + } cmd_data; + + cmd_data.result = result; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::track(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t tag) { + struct { + uint32_t type = CMD_TRACK; + int16_t x; + int16_t y; + int16_t w; + int16_t h; + int16_t tag; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.tag = tag; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::sketch(int16_t x, int16_t y, uint16_t w, uint16_t h, uint32_t ptr, uint16_t format) { + struct { + uint32_t type = CMD_SKETCH; + int16_t x; + int16_t y; + uint16_t w; + uint16_t h; + uint32_t ptr; + uint16_t format; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.ptr = ptr; + cmd_data.format = format; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::snapshot(uint32_t ptr) { + struct { + uint32_t type = CMD_SNAPSHOT; + uint32_t ptr; + } cmd_data; + + cmd_data.ptr = ptr; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::spinner(int16_t x, int16_t y, uint16_t style, uint16_t scale) { + struct { + uint32_t type = CMD_SPINNER; + uint16_t x; + uint16_t y; + uint16_t style; + uint16_t scale; + } cmd_data; + + cmd_data.x = x; + cmd_data.y = y; + cmd_data.style = style; + cmd_data.scale = scale; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::loadimage(uint32_t ptr, uint32_t options) { + struct { + uint32_t type = CMD_LOADIMAGE; + uint32_t ptr; + uint32_t options; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.options = options; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::getprops(uint32_t ptr, uint32_t width, uint32_t height) { + struct { + uint32_t type = CMD_GETPROPS; + uint32_t ptr; + uint32_t width; + uint32_t height; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.width = width; + cmd_data.height = height; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::scale(int32_t sx, int32_t sy) { + struct { + uint32_t type = CMD_SCALE; + int32_t sx; + int32_t sy; + } cmd_data; + + cmd_data.sx = sx; + cmd_data.sy = sy; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::rotate(int32_t a) { + struct { + uint32_t type = CMD_ROTATE; + int32_t a; + } cmd_data; + + cmd_data.a = a; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +void CLCD::CommandFifo::translate(int32_t tx, int32_t ty) { + struct { + uint32_t type = CMD_TRANSLATE; + int32_t tx; + int32_t ty; + } cmd_data; + + cmd_data.tx = tx; + cmd_data.ty = ty; + + cmd( &cmd_data, sizeof(cmd_data) ); +} + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::setbase(uint8_t base) { + struct { + int32_t type = CMD_SETBASE; + uint32_t base; + } cmd_data; + + cmd_data.base = base; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::setbitmap(uint32_t addr, uint16_t fmt, uint16_t w, uint16_t h) { + struct { + uint32_t type = CMD_SETBITMAP; + uint32_t addr; + uint16_t fmt; + uint16_t w; + uint16_t h; + uint16_t dummy; + } cmd_data; + + cmd_data.addr = addr; + cmd_data.fmt = fmt; + cmd_data.w = w; + cmd_data.h = h; + cmd_data.dummy = 0; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::snapshot2(uint32_t format, uint32_t ptr, int16_t x, int16_t y, uint16_t w, uint16_t h) { + struct { + uint32_t type = CMD_SNAPSHOT2; + uint32_t format; + uint32_t ptr; + int16_t x; + int16_t y; + uint16_t w; + uint16_t h; + } cmd_data; + + cmd_data.format = format; + cmd_data.ptr = ptr; + cmd_data.x = x; + cmd_data.y = y; + cmd_data.w = w; + cmd_data.h = h; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::mediafifo(uint32_t ptr, uint32_t size) { + struct { + uint32_t type = CMD_MEDIAFIFO; + uint32_t ptr; + uint32_t size; + } cmd_data; + + cmd_data.ptr = ptr; + cmd_data.size = size; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::videostart() { + cmd( CMD_VIDEOSTART ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::videoframe(uint32_t dst, uint32_t ptr) { + struct { + uint32_t type = CMD_VIDEOFRAME; + uint32_t dst; + uint32_t ptr; + } cmd_data; + + cmd_data.dst = dst; + cmd_data.ptr = ptr; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::playvideo(uint32_t options) { + struct { + uint32_t type = CMD_PLAYVIDEO; + uint32_t options; + } cmd_data; + + cmd_data.options = options; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::setrotate(uint8_t rotation) { + struct { + uint32_t type = CMD_SETROTATE; + uint32_t rotation; + } cmd_data; + + cmd_data.rotation = rotation; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +#if FTDI_API_LEVEL >= 810 +void CLCD::CommandFifo::romfont(uint8_t font, uint8_t romslot) { + struct { + uint32_t type = CMD_ROMFONT; + uint32_t font; + uint32_t romslot; + } cmd_data; + + cmd_data.font = font; + cmd_data.romslot = romslot; + + cmd( &cmd_data, sizeof(cmd_data) ); +} +#endif + +/**************************** FT800/810 Co-Processor Command FIFO ****************************/ + +bool CLCD::CommandFifo::is_processing() { + return (mem_read_32(REG::CMD_READ) & 0x0FFF) != (mem_read_32(REG::CMD_WRITE) & 0x0FFF); +} + +bool CLCD::CommandFifo::has_fault() { + uint16_t Cmd_Read_Reg = mem_read_32(REG::CMD_READ) & 0x0FFF; + return Cmd_Read_Reg == 0x0FFF; +} + +#if FTDI_API_LEVEL == 800 +void CLCD::CommandFifo::start() { + if (command_write_ptr == 0xFFFFFFFFul) { + command_write_ptr = mem_read_32(REG::CMD_WRITE) & 0x0FFF; + } +} + +void CLCD::CommandFifo::execute() { + if (command_write_ptr != 0xFFFFFFFFul) { + mem_write_32(REG::CMD_WRITE, command_write_ptr); + } +} + +void CLCD::CommandFifo::reset() { + safe_delay(100); + mem_write_32(REG::CPURESET, 0x00000001); + mem_write_32(REG::CMD_WRITE, 0x00000000); + mem_write_32(REG::CMD_READ, 0x00000000); + mem_write_32(REG::CPURESET, 0x00000000); + safe_delay(300); + command_write_ptr = 0xFFFFFFFFul; +}; + +template bool CLCD::CommandFifo::_write_unaligned(T data, uint16_t len) { + const char *ptr = (const char*)data; + uint32_t bytes_tail, bytes_head; + uint32_t command_read_ptr; + + #if ENABLED(TOUCH_UI_DEBUG) + if (command_write_ptr == 0xFFFFFFFFul) + SERIAL_ECHO_MSG("Attempt to write to FIFO before CommandFifo::Cmd_Start()."); + #endif + + /* Wait until there is enough space in the circular buffer for the transfer */ + do { + command_read_ptr = mem_read_32(REG::CMD_READ) & 0x0FFF; + if (command_read_ptr <= command_write_ptr) { + bytes_tail = 4096U - command_write_ptr; + bytes_head = command_read_ptr; + } + else { + bytes_tail = command_read_ptr - command_write_ptr; + bytes_head = 0; + } + // Check for faults which can lock up the command processor + if (has_fault()) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHOLNPGM("Fault waiting for space in the command processor"); + #endif + return false; + } + } while ((bytes_tail + bytes_head) < len); + + /* Write as many bytes as possible following REG::CMD_WRITE */ + uint16_t bytes_to_write = min(len, bytes_tail); + mem_write_bulk (MAP::RAM_CMD + command_write_ptr, T(ptr), bytes_to_write); + command_write_ptr += bytes_to_write; + ptr += bytes_to_write; + len -= bytes_to_write; + + if (len > 0) { + /* Write remaining bytes at start of circular buffer */ + mem_write_bulk (MAP::RAM_CMD, T(ptr), len); + command_write_ptr = len; + } + + if (command_write_ptr == 4096U) { + command_write_ptr = 0; + } + return true; +} + +// Writes len bytes into the FIFO, if len is not +// divisible by four, zero bytes will be written +// to align to the boundary. + +template bool CLCD::CommandFifo::write(T data, uint16_t len) { + const uint8_t padding = MULTIPLE_OF_4(len) - len; + + uint8_t pad_bytes[] = {0, 0, 0, 0}; + return _write_unaligned(data, len) && + _write_unaligned(pad_bytes, padding); +} +#else +void CLCD::CommandFifo::start() { +} + +void CLCD::CommandFifo::execute() { +} + +void CLCD::CommandFifo::reset() { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHOLNPGM("Resetting command processor"); + #endif + safe_delay(100); + mem_write_32(REG::CPURESET, 0x00000001); + mem_write_32(REG::CMD_WRITE, 0x00000000); + mem_write_32(REG::CMD_READ, 0x00000000); + mem_write_32(REG::CPURESET, 0x00000000); + safe_delay(300); +}; + +// Writes len bytes into the FIFO, if len is not +// divisible by four, zero bytes will be written +// to align to the boundary. + +template bool CLCD::CommandFifo::write(T data, uint16_t len) { + const uint8_t padding = MULTIPLE_OF_4(len) - len; + + if (has_fault()) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHOLNPGM("Faulted... ignoring write."); + #endif + return false; + } + // The FT810 provides a special register that can be used + // for writing data without us having to do our own FIFO + // management. + uint16_t Command_Space = mem_read_32(REG::CMDB_SPACE) & 0x0FFF; + if (Command_Space < (len + padding)) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("Waiting for ", len + padding); + SERIAL_ECHOLNPAIR(" bytes in command queue, now free: ", Command_Space); + #endif + do { + Command_Space = mem_read_32(REG::CMDB_SPACE) & 0x0FFF; + if (has_fault()) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHOLNPGM("... fault"); + #endif + return false; + } + } while (Command_Space < len + padding); + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHOLNPGM("... done"); + #endif + } + mem_write_bulk(REG::CMDB_WRITE, data, len, padding); + return true; +} +#endif + +template bool CLCD::CommandFifo::write(const void*, uint16_t); +template bool CLCD::CommandFifo::write(progmem_str, uint16_t); + +// CO_PROCESSOR COMMANDS + +void CLCD::CommandFifo::str(const char * data) { + write(data, strlen(data)+1); +} + +void CLCD::CommandFifo::str(progmem_str data) { + write(data, strlen_P((const char*)data)+1); +} + +/******************* LCD INITIALIZATION ************************/ + +void CLCD::init() { + spi_init(); // Set Up I/O Lines for SPI and FT800/810 Control + ftdi_reset(); // Power down/up the FT8xx with the apropriate delays + + host_cmd(Use_Crystal ? CLKEXT : CLKINT, 0); + host_cmd(FTDI::ACTIVE, 0); // Activate the System Clock + + delay(40); // FTDI/BRT recommendation: no SPI traffic during startup. EVE needs at the very least 45ms to start, so leave her alone for a little while. + + /* read the device-id until it returns 0x7C or times out, should take less than 150ms */ + uint8_t counter; + for (counter = 0; counter < 250; counter++) { + uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C; + if (device_id == 0x7C) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("FTDI chip initialized "); + #endif + break; + } + else + delay(1); + + if (counter == 249) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Timeout waiting for device ID, should be 124, got ", device_id); + #endif + } + } + + /* make sure that all units are in working conditions, usually the touch-controller needs a little more time */ + for (counter = 0; counter < 100; counter++) { + uint8_t reset_status = mem_read_8(REG::CPURESET) & 0x03; + if (reset_status == 0x00) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("FTDI chip all units running "); + #endif + break; + } + else + delay(1); + + if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Timeout waiting for reset status. Should be 0x00, got ", reset_status); + } + } + + mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default + + /* Configure the FT8xx Registers */ + mem_write_16(REG::HCYCLE, FTDI::Hcycle); + mem_write_16(REG::HOFFSET, FTDI::Hoffset); + mem_write_16(REG::HSYNC0, FTDI::Hsync0); + mem_write_16(REG::HSYNC1, FTDI::Hsync1); + mem_write_16(REG::VCYCLE, FTDI::Vcycle); + mem_write_16(REG::VOFFSET, FTDI::Voffset); + mem_write_16(REG::VSYNC0, FTDI::Vsync0); + mem_write_16(REG::VSYNC1, FTDI::Vsync1); + mem_write_16(REG::HSIZE, FTDI::Hsize); + mem_write_16(REG::VSIZE, FTDI::Vsize); + mem_write_8(REG::SWIZZLE, FTDI::Swizzle); + mem_write_8(REG::PCLK_POL, FTDI::Pclkpol); + mem_write_8(REG::CSPREAD, FTDI::CSpread); + + /* write a basic display-list to get things started */ + mem_write_32(MAP::RAM_DL, DL::CLEAR_COLOR_RGB); + mem_write_32(MAP::RAM_DL + 4, (DL::CLEAR | 0x07)); /* clear color, stencil and tag buffer */ + mem_write_32(MAP::RAM_DL + 8, DL::DL_DISPLAY); /* end of display list */ + + mem_write_8(REG::DLSWAP, 0x02); // activate display list, Bad Magic Cookie 2 = switch to new list after current frame is scanned out + + //mem_write_8(REG::TOUCH_MODE, 0x03); // Configure the Touch Screen, Bad Magic Cookie, 3 = CONTINUOUS = Reset Default + //mem_write_8(REG::TOUCH_ADC_MODE, 0x01); // Bad Magic Cookie, 1 = single touch = Reset Default + //mem_write_8(REG::TOUCH_OVERSAMPLE, 0x0F); // Reset Default = 7 - why 15? + mem_write_16(REG::TOUCH_RZTHRESH, touch_threshold); /* setup touch sensitivity */ + mem_write_8(REG::VOL_SOUND, 0x00); // Turn Synthesizer Volume Off + + /* turn on the display by setting DISP high */ + /* turn on the Audio Amplifier by setting GPIO_1 high for the select few modules supporting this */ + /* no need to use GPIOX here since DISP/GPIO_0 and GPIO_1 are on REG::GPIO for FT81x as well */ + if (GPIO_1_Audio_Shutdown) { + mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP1); + mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP1); + } else if (GPIO_0_Audio_Enable) { + mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP0); + mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP0); + } + else { + mem_write_8(REG::GPIO, GPIO_DISP); /* REG::GPIO_DIR is set to output for GPIO_DISP by default */ + } + + mem_write_8(REG::PCLK, Pclk); // Turns on Clock by setting PCLK Register to the value necessary for the module + + mem_write_16(REG::PWM_HZ, 0x00FA); + + // Turning off dithering seems to help prevent horizontal line artifacts on certain colors + mem_write_8(REG::DITHER, 0); + + default_touch_transform(); + default_display_orientation(); +} + +void CLCD::default_touch_transform() { + // Set Initial Values for Touch Transform Registers + mem_write_32(REG::ROTATE, 0); + mem_write_32(REG::TOUCH_TRANSFORM_A, FTDI::default_transform_a); + mem_write_32(REG::TOUCH_TRANSFORM_B, FTDI::default_transform_b); + mem_write_32(REG::TOUCH_TRANSFORM_C, FTDI::default_transform_c); + mem_write_32(REG::TOUCH_TRANSFORM_D, FTDI::default_transform_d); + mem_write_32(REG::TOUCH_TRANSFORM_E, FTDI::default_transform_e); + mem_write_32(REG::TOUCH_TRANSFORM_F, FTDI::default_transform_f); +} + +void CLCD::default_display_orientation() { + #if FTDI_API_LEVEL >= 810 + // Set the initial display orientation. On the FT810, we use the command + // processor to do this since it will also update the transform matrices. + CommandFifo cmd; + cmd.setrotate( + ENABLED(TOUCH_UI_MIRRORED) * 4 + + ENABLED(TOUCH_UI_PORTRAIT) * 2 + + ENABLED(TOUCH_UI_INVERTED) * 1 + ); + cmd.execute(); + #elif ANY(TOUCH_UI_PORTRAIT, TOUCH_UI_MIRRORED) + #error "PORTRAIT or MIRRORED orientation not supported on the FT800." + #elif ENABLED(TOUCH_UI_INVERTED) + mem_write_32(REG::ROTATE, 1); + #endif +} + +#endif // FTDI_BASIC 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 new file mode 100644 index 00000000..a9fdb5c5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.h @@ -0,0 +1,261 @@ +/**************** + * commands.cpp * + ****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + + /**************************************************************************** + * FUNCTION MAP * + * * + * SPI and FT800/810 Commands * + * * + * CLCD::spi_select() Set CS line to 0 * + * CLCD::spi_deselect() Set CS Line to 1 * + * CLCD::reset() Toggle FT800/810 Power Down Line 50 ms * + * CLCD::spi_init() Configure I/O Lines for SPI * + * CLCD::spi_transfer() Send/Receive 1 SPI Byte * + * CLCD::init() Set FT800/810 Registers * + * CLCD::enable() Turn On FT800/810 PCLK * + * CLCD::disable() Turn Off FT8880/810 PCLK * + * CLCD::set_backlight() Set LCD Backlight Level * + * * + * MEMORY READ FUNCTIONS * + * * + * CLCD::mem_read_addr() Send 32-Bit Address * + * CLCD::mem_read_8() Read 1 Byte * + * CLCD::mem_read_16() Read 2 Bytes * + * CLCD::mem_read_32() Read 4 Bytes * + * * + * MEMORY WRITE FUNCTIONS * + * * + * CLCD::mem_write_addr() Send 24-Bit Address * + * CLCD::mem_write_8() Write 1 Byte * + * CLCD::mem_write_16() Write 2 Bytes * + * CLCD::mem_write_32() Write 4 Bytes * + * * + * HOST COMMAND FUNCTION * + * * + * CLCD::host_cmd() Send 24-Bit Host Command * + * * + * COMMAND BUFFER FUNCTIONS * + * * + * CLCD::cmd() Send 32-Bit Value(4 Bytes)CMD Buffer * + * CLCD::cmd() Send Data Structure with 32-Bit Cmd * + * CLCD::str() Send Text String in 32-Bit Multiples * + + * * + * FT800/810 GRAPHIC COMMANDS * + * * + * class CLCD:CommandFifo {} Class to control Cmd FIFO * + + * CommandFifo::start() Wait for CP finish - Set FIFO Ptr * + * CommandFifo::execute() Set REG_CMD_WRITE and start CP * + * CommandFifo::reset() Set Cmd Buffer Pointers to 0 * + * + * CommandFifo::fgcolor Set Graphic Item Foreground Color * + * CommandFifo::bgcolor Set Graphic Item Background Color * + * CommandFifo::begin() Begin Drawing a Primative * + * CommandFifo::mem_copy() Copy a Block of Memory * + * CommandFifo::append() Append Commands to Current DL * + * CommandFifo::gradient_color() Set 3D Button Highlight Color * + * CommandFifo::button() Draw Button with Bulk Write * + * CommandFifo::text() Draw Text with Bulk Write * + *****************************************************************************/ + + /************************************************** + * RAM_G Graphics RAM Allocation * + * * + * Address Use * + * * + * 8000 Extruder Bitmap * + * 8100 Bed Heat Bitmap * + * 8200 Fan Bitmap * + * 8300 Thumb Drive Symbol Bitmap * + * 35000 Static DL Space (FT800) * + * F5000 Static DL Space (FT810) * + **************************************************/ + +#pragma once + +typedef const __FlashStringHelper *progmem_str; + +class UIStorage; + +class CLCD { + friend class UIStorage; + + public: + typedef FTDI::ftdi_registers REG; + typedef FTDI::ftdi_memory_map MAP; + + static void spi_write_addr (uint32_t reg_address); + static void spi_read_addr (uint32_t reg_address); + + static uint8_t mem_read_8 (uint32_t reg_address); + static uint16_t mem_read_16 (uint32_t reg_address); + static uint32_t mem_read_32 (uint32_t reg_address); + static void mem_read_bulk (uint32_t reg_address, uint8_t *data, uint16_t len); + + static void mem_write_8 (uint32_t reg_address, uint8_t w_data); + static void mem_write_16 (uint32_t reg_address, uint16_t w_data); + static void mem_write_32 (uint32_t reg_address, uint32_t w_data); + static void mem_write_bulk (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0); + static void mem_write_pgm (uint32_t reg_address, const void *data, uint16_t len, uint8_t padding = 0); + static void mem_write_bulk (uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding = 0); + static void mem_write_xbm (uint32_t reg_address, progmem_str str, uint16_t len, uint8_t padding = 0); + + public: + class CommandFifo; + class FontMetrics; + + static void init(); + static void default_touch_transform(); + static void default_display_orientation(); + static void turn_on_backlight(); + static void enable(); + static void disable(); + 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); + static uint16_t get_text_width_P(const uint8_t font, const char *str); + + static uint8_t get_tag () {return mem_read_8(REG::TOUCH_TAG);} + static bool is_touching () {return (mem_read_32(REG::TOUCH_DIRECT_XY) & 0x80000000) == 0;} + + static uint8_t get_tracker (uint16_t &value) { + uint32_t tracker = mem_read_32(REG::TRACKER); + value = tracker >> 16; + return tracker & 0xFF; + } +}; + +/*************************** FT800/810 Font Metrics ****************************/ + +class CLCD::FontMetrics { + public: + uint8_t char_widths[128]; + uint32_t format; + uint32_t stride; + uint32_t width; + uint32_t height; + uint32_t ptr; + + FontMetrics() {} + FontMetrics(uint8_t font) {load(font);} + + void load(uint8_t font); + + // Returns width of string, up to a maximum of n characters. + uint16_t get_text_width(const char *str, size_t n = SIZE_MAX) const; + uint16_t get_text_width(progmem_str str, size_t n = SIZE_MAX) const; +}; + +/******************* FT800/810 Graphic Commands *********************************/ + +class CLCD::CommandFifo { + protected: + #if FTDI_API_LEVEL >= 810 + uint32_t getRegCmdBSpace(); + #else + static uint32_t command_write_ptr; + template bool _write_unaligned(T data, uint16_t len); + #endif + void start(); + + public: + template bool write(T data, uint16_t len); + + public: + CommandFifo() {start();} + + static void reset(); + static bool is_processing(); + static bool has_fault(); + + void execute(); + + void cmd(uint32_t cmd32); + void cmd(void* data, uint16_t len); + + void dlstart() {cmd(FTDI::CMD_DLSTART);} + void swap() {cmd(FTDI::CMD_SWAP);} + void coldstart() {cmd(FTDI::CMD_COLDSTART);} + void screensaver() {cmd(FTDI::CMD_SCREENSAVER);} + void stop() {cmd(FTDI::CMD_STOP);} + void loadidentity() {cmd(FTDI::CMD_LOADIDENTITY);} + void setmatrix() {cmd(FTDI::CMD_SETMATRIX);} + + void fgcolor (uint32_t rgb); + void bgcolor (uint32_t rgb); + void gradcolor (uint32_t rgb); + + void track (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t tag); + void clock (int16_t x, int16_t y, int16_t r, uint16_t options, int16_t h, int16_t m, int16_t s, int16_t ms); + void gauge (int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range); + void dial (int16_t x, int16_t y, int16_t r, uint16_t options, uint16_t val); + void slider (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range); + void progress (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range); + void scrollbar (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t size, uint16_t range); + void number (int16_t x, int16_t y, int16_t font, uint16_t options, int32_t n); + void spinner (int16_t x, int16_t y, uint16_t style, uint16_t scale); + void sketch (int16_t x, int16_t y, uint16_t w, uint16_t h, uint32_t ptr, uint16_t format); + void gradient (int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1); + void snapshot (uint32_t ptr); + void loadimage (uint32_t ptr, uint32_t options); + void getprops (uint32_t ptr, uint32_t width, uint32_t height); + + void scale (int32_t sx, int32_t sy); + void rotate (int32_t a); + void translate (int32_t tx, int32_t ty); + + #if FTDI_API_LEVEL >= 810 + void setbase (uint8_t base); + void setrotate (uint8_t rotation); + void setbitmap (uint32_t ptr, uint16_t fmt, uint16_t w, uint16_t h); + void snapshot2 (uint32_t fmt, uint32_t ptr, int16_t x, int16_t y, uint16_t w, uint16_t h); + void mediafifo (uint32_t ptr, uint32_t size); + void playvideo (uint32_t options); + void videostart(); + void videoframe(uint32_t dst, uint32_t ptr); + void romfont (uint8_t font, uint8_t romslot); + #endif + + // All the following must be followed by str() + void text (int16_t x, int16_t y, int16_t font, uint16_t options); + void button (int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t option); + void toggle (int16_t x, int16_t y, int16_t w, int16_t font, uint16_t options, bool state); + void keys (int16_t x, int16_t y, int16_t w, int16_t h, int16_t font, uint16_t options); + + // Sends the string portion of text, button, toggle and keys. + void str (const char * data); + void str (progmem_str data); + + void memzero (uint32_t ptr, uint32_t size); + void memset (uint32_t ptr, uint32_t value, uint32_t size); + void memcpy (uint32_t dst, uint32_t src, uint32_t size); + void memcrc (uint32_t ptr, uint32_t num, uint32_t result); + void memwrite (uint32_t ptr, uint32_t value); + void inflate (uint32_t ptr); + void getptr (uint32_t result); + void append (uint32_t ptr, uint32_t size); +}; 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 new file mode 100644 index 00000000..1e6642fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/constants.h @@ -0,0 +1,414 @@ +/*************** + * constants.h * + ***************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +/**************************************************************************** + * This header defines constants and commands for the FTDI FT810 LCD Driver * + * chip. * + ****************************************************************************/ + +#pragma once + +// OPTIONS + +namespace FTDI { + constexpr uint16_t OPT_3D = 0x0000; + constexpr uint16_t OPT_RGB565 = 0x0000; + constexpr uint16_t OPT_MONO = 0x0001; + constexpr uint16_t OPT_NODL = 0x0002; + constexpr uint16_t OPT_FLAT = 0x0100; + constexpr uint16_t OPT_SIGNED = 0x0100; + constexpr uint16_t OPT_CENTERX = 0x0200; + constexpr uint16_t OPT_CENTERY = 0x0400; + constexpr uint16_t OPT_CENTER = (OPT_CENTERX | OPT_CENTERY); + constexpr uint16_t OPT_RIGHTX = 0x0800; + constexpr uint16_t OPT_NOBACK = 0x1000; + constexpr uint16_t OPT_NOTICKS = 0x2000; + constexpr uint16_t OPT_NOHM = 0x4000; + constexpr uint16_t OPT_NOPOINTER = 0x4000; + constexpr uint16_t OPT_NOSECS = 0x8000; + constexpr uint16_t OPT_NOHANDS = (OPT_NOPOINTER | OPT_NOSECS); +} + +namespace FTDI_FT810 { + constexpr uint16_t OPT_NOTEAR = 0x0004; + constexpr uint16_t OPT_FULLSCREEN = 0x0008; + constexpr uint16_t OPT_MEDIAFIFO = 0x0010; + constexpr uint16_t OPT_SOUND = 0x0020; +} + +// GPIO Bits + +namespace FTDI { + constexpr uint8_t GPIO_GP0 = 1 << 0; + constexpr uint8_t GPIO_GP1 = 1 << 1; + constexpr uint8_t GPIO_DISP = 1 << 7; +} + +namespace FTDI_FT810 { + constexpr uint16_t GPIOX_GP0 = 1 << 0; + constexpr uint16_t GPIOX_GP1 = 1 << 1; + constexpr uint16_t GPIOX_DISP = 1 << 15; +} + +// HOST COMMANDS + +namespace FTDI { + constexpr uint8_t ACTIVE = 0x00; + constexpr uint8_t STANDBY = 0x41; + constexpr uint8_t SLEEP = 0x42; + constexpr uint8_t PWRDOWN = 0x50; + constexpr uint8_t CLKEXT = 0x44; + constexpr uint8_t CLKINT = 0x48; + constexpr uint8_t CORESET = 0x68; +} + +namespace FTDI_FT800 { + constexpr uint8_t CLK48M = 0x62; + constexpr uint8_t CLK36M = 0x61; +} + +namespace FTDI_FT810 { + constexpr uint8_t CLKSEL = 0x61; +} + +// DISPLAY LIST COMMANDS + +namespace FTDI { + constexpr uint8_t ARGB1555 = 0; + constexpr uint8_t L1 = 1; + constexpr uint8_t L4 = 2; + constexpr uint8_t L8 = 3; + constexpr uint8_t RGB332 = 4; + constexpr uint8_t ARGB2 = 5; + constexpr uint8_t ARGB4 = 6; + constexpr uint8_t RGB565 = 7; + constexpr uint8_t PALETTED = 8; + constexpr uint8_t TEXT8X8 = 9; + constexpr uint8_t TEXTVGA = 10; + constexpr uint8_t BARGRAPH = 11; + + constexpr uint8_t ALPHA_FUNC_NEVER = 0; + constexpr uint8_t ALPHA_FUNC_LESS = 1; + constexpr uint8_t ALPHA_FUNC_LEQUAL = 2; + constexpr uint8_t ALPHA_FUNC_GREATER = 3; + constexpr uint8_t ALPHA_FUNC_GEQUAL = 4; + constexpr uint8_t ALPHA_FUNC_EQUAL = 5; + constexpr uint8_t ALPHA_FUNC_NOTEQUAL = 6; + constexpr uint8_t ALPHA_FUNC_ALWAYS = 7; + + constexpr uint8_t NEAREST = 0; + constexpr uint8_t BILINEAR = 1; + constexpr uint8_t BORDER = 0; + constexpr uint8_t REPEAT = 1; + + constexpr uint8_t BLEND_FUNC_ZERO = 0; + constexpr uint8_t BLEND_FUNC_ONE = 1; + constexpr uint8_t BLEND_FUNC_SRC_ALPHA = 2; + constexpr uint8_t BLEND_FUNC_DST_ALPHA = 3; + constexpr uint8_t BLEND_FUNC_ONE_MINUS_SRC_ALPHA = 4; + constexpr uint8_t BLEND_FUNC_ONE_MINUS_DST_ALPHA = 5; + + constexpr uint32_t COLOR_MASK_RED = 8; + constexpr uint32_t COLOR_MASK_GRN = 4; + constexpr uint32_t COLOR_MASK_BLU = 2; + constexpr uint32_t COLOR_MASK_ALPHA = 1; + + constexpr uint8_t STENCIL_FUNC_NEVER = 0; + constexpr uint8_t STENCIL_FUNC_LESS = 1; + constexpr uint8_t STENCIL_FUNC_LEQUAL = 2; + constexpr uint8_t STENCIL_FUNC_GREATER = 3; + constexpr uint8_t STENCIL_FUNC_GEQUAL = 4; + constexpr uint8_t STENCIL_FUNC_EQUAL = 5; + constexpr uint8_t STENCIL_FUNC_NOTEQUAL = 6; + constexpr uint8_t STENCIL_FUNC_ALWAYS = 7; + + constexpr uint8_t STENCIL_OP_ZERO = 0; + constexpr uint8_t STENCIL_OP_KEEP = 1; + constexpr uint8_t STENCIL_OP_REPLACE = 2; + constexpr uint8_t STENCIL_OP_INCR = 3; + constexpr uint8_t STENCIL_OP_DECR = 4; + constexpr uint8_t STENCIL_OP_INVERT = 5; + + typedef enum : uint32_t { + BITMAPS = 1, + POINTS = 2, + LINES = 3, + LINE_STRIP = 4, + EDGE_STRIP_R = 5, + EDGE_STRIP_L = 6, + EDGE_STRIP_A = 7, + EDGE_STRIP_B = 8, + RECTS = 9 + } begin_t; +} + +namespace FTDI_FT800_DL { + constexpr uint32_t ALPHA_FUNC = 0x09000000; + constexpr uint32_t BEGIN = 0x1F000000; + constexpr uint32_t BITMAP_HANDLE = 0x05000000; + constexpr uint32_t BITMAP_LAYOUT = 0x07000000; + constexpr uint32_t BITMAP_SIZE = 0x08000000; + constexpr uint32_t BITMAP_SOURCE = 0x01000000; + constexpr uint32_t BITMAP_TRANSFORM_A = 0x15000000; + constexpr uint32_t BITMAP_TRANSFORM_B = 0x16000000; + constexpr uint32_t BITMAP_TRANSFORM_C = 0x17000000; + constexpr uint32_t BITMAP_TRANSFORM_D = 0x18000000; + constexpr uint32_t BITMAP_TRANSFORM_E = 0x19000000; + constexpr uint32_t BITMAP_TRANSFORM_F = 0x1A000000; + constexpr uint32_t BLEND_FUNC = 0x0B000000; + constexpr uint32_t CALL = 0x1D000000; + constexpr uint32_t CELL = 0x06000000; + constexpr uint32_t CLEAR = 0x26000000; + constexpr uint32_t CLEAR_COLOR_BUFFER = 0x00000004; + constexpr uint32_t CLEAR_STENCIL_BUFFER = 0x00000002; + constexpr uint32_t CLEAR_TAG_BUFFER = 0x00000001; + constexpr uint32_t CLEAR_COLOR_A = 0x0F000000; + constexpr uint32_t CLEAR_COLOR_RGB = 0x02000000; + constexpr uint32_t CLEAR_STENCIL = 0x11000000; + constexpr uint32_t CLEAR_TAG = 0x12000000; + constexpr uint32_t COLOR_A = 0x10000000; + constexpr uint32_t COLOR_MASK = 0x20000000; + constexpr uint32_t COLOR_RGB = 0x04000000; + constexpr uint32_t DL_DISPLAY = 0x00000000; + constexpr uint32_t END = 0x21000000; + constexpr uint32_t JUMP = 0x1E000000; + constexpr uint32_t LINE_WIDTH = 0x0E000000; + constexpr uint32_t MACRO = 0x25000000; + constexpr uint32_t POINT_SIZE = 0x0D000000; + constexpr uint32_t RESTORE_CONTEXT = 0x23000000; + constexpr uint32_t RETURN = 0x24000000; + constexpr uint32_t SAVE_CONTEXT = 0x22000000; + constexpr uint32_t SCISSOR_SIZE = 0x1C000000; + constexpr uint32_t SCISSOR_XY = 0x1B000000; + constexpr uint32_t STENCIL_FUNC = 0x0A000000; + constexpr uint32_t STENCIL_MASK = 0x13000000; + constexpr uint32_t STENCIL_OP = 0x0C000000; + constexpr uint32_t TAG = 0x03000000; + constexpr uint32_t TAG_MASK = 0x14000000; + constexpr uint32_t VERTEX2F = 0x40000000; + constexpr uint32_t VERTEX2II = 0x80000000; +} + +namespace FTDI_FT810_DL { + constexpr uint32_t NOP = 0x25000000; + constexpr uint32_t BITMAP_LAYOUT_H = 0x28000000; + constexpr uint32_t BITMAP_SIZE_H = 0x29000000; + constexpr uint32_t VERTEX_FORMAT = 0x27000000; + constexpr uint32_t VERTEX_TRANSLATE_X = 0x2B000000; + constexpr uint32_t VERTEX_TRANSLATE_Y = 0x2C000000; +} + +// CO-PROCESSOR ENGINE COMMANDS +namespace FTDI { + constexpr uint32_t CMD_DLSTART = 0xFFFFFF00; + constexpr uint32_t CMD_SWAP = 0xFFFFFF01; + constexpr uint32_t CMD_COLDSTART = 0xFFFFFF32; + constexpr uint32_t CMD_INTERRUPT = 0xFFFFFF02; + constexpr uint32_t CMD_APPEND = 0xFFFFFF1E; + constexpr uint32_t CMD_REGREAD = 0xFFFFFF19; + constexpr uint32_t CMD_MEMWRITE = 0xFFFFFF1A; + constexpr uint32_t CMD_INFLATE = 0xFFFFFF22; + constexpr uint32_t CMD_LOADIMAGE = 0xFFFFFF24; + constexpr uint32_t CMD_MEMCRC = 0xFFFFFF18; + constexpr uint32_t CMD_MEMZERO = 0xFFFFFF1C; + constexpr uint32_t CMD_MEMSET = 0xFFFFFF1B; + constexpr uint32_t CMD_MEMCPY = 0xFFFFFF1D; + constexpr uint32_t CMD_BUTTON = 0xFFFFFF0D; + constexpr uint32_t CMD_CLOCK = 0xFFFFFF14; + constexpr uint32_t CMD_FGCOLOR = 0xFFFFFF0A; + constexpr uint32_t CMD_BGCOLOR = 0xFFFFFF09; + constexpr uint32_t CMD_GRADCOLOR = 0xFFFFFF34; + constexpr uint32_t CMD_GAUGE = 0xFFFFFF13; + constexpr uint32_t CMD_GRADIENT = 0xFFFFFF0B; + constexpr uint32_t CMD_KEYS = 0xFFFFFF0E; + constexpr uint32_t CMD_PROGRESS = 0xFFFFFF0F; + constexpr uint32_t CMD_SCROLLBAR = 0xFFFFFF11; + constexpr uint32_t CMD_SLIDER = 0xFFFFFF10; + constexpr uint32_t CMD_DIAL = 0xFFFFFF2D; + constexpr uint32_t CMD_TOGGLE = 0xFFFFFF12; + constexpr uint32_t CMD_TEXT = 0xFFFFFF0C; + constexpr uint32_t CMD_NUMBER = 0xFFFFFF2E; + constexpr uint32_t CMD_LOADIDENTITY = 0xFFFFFF26; + constexpr uint32_t CMD_SETMATRIX = 0xFFFFFF2A; + constexpr uint32_t CMD_GETMATRIX = 0xFFFFFF33; + constexpr uint32_t CMD_GETPTR = 0xFFFFFF23; + constexpr uint32_t CMD_GETPROPS = 0xFFFFFF25; + constexpr uint32_t CMD_SCALE = 0xFFFFFF28; + constexpr uint32_t CMD_ROTATE = 0xFFFFFF29; + constexpr uint32_t CMD_TRANSLATE = 0xFFFFFF27; + constexpr uint32_t CMD_CALIBRATE = 0xFFFFFF15; + constexpr uint32_t CMD_SPINNER = 0xFFFFFF16; + constexpr uint32_t CMD_SCREENSAVER = 0xFFFFFF2F; + constexpr uint32_t CMD_SKETCH = 0xFFFFFF30; + constexpr uint32_t CMD_STOP = 0xFFFFFF17; + constexpr uint32_t CMD_SETFONT = 0xFFFFFF2B; + constexpr uint32_t CMD_TRACK = 0xFFFFFF2C; + constexpr uint32_t CMD_SNAPSHOT = 0xFFFFFF1F; + constexpr uint32_t CMD_LOGO = 0xFFFFFF31; +} + +namespace FTDI_FT810 { + constexpr uint32_t CMD_SETROTATE = 0xFFFFFF36; + constexpr uint32_t CMD_SNAPSHOT2 = 0xFFFFFF37; + constexpr uint32_t CMD_SETBASE = 0xFFFFFF38; + constexpr uint32_t CMD_MEDIAFIFO = 0xFFFFFF39; + constexpr uint32_t CMD_PLAYVIDEO = 0xFFFFFF3A; + constexpr uint32_t CMD_SETFONT2 = 0xFFFFFF3B; + constexpr uint32_t CMD_SETSCRATCH = 0xFFFFFF3C; + constexpr uint32_t CMD_ROMFONT = 0xFFFFFF3F; + constexpr uint32_t CMD_VIDEOSTART = 0xFFFFFF40; + constexpr uint32_t CMD_VIDEOFRAME = 0xFFFFFF41; + constexpr uint32_t CMD_SETBITMAP = 0xFFFFFF43; +} + +namespace FTDI { + enum effect_t : unsigned char { + SILENCE = 0x00, + SQUARE_WAVE = 0x01, + SINE_WAVE = 0x02, + SAWTOOTH_WAVE = 0x03, + TRIANGLE_WAVE = 0x04, + BEEPING = 0x05, + ALARM = 0x06, + WARBLE = 0x07, + CAROUSEL = 0x08, + SHORT_PIPS_1 = 0x10, + SHORT_PIPS_2 = 0x11, + SHORT_PIPS_3 = 0x12, + SHORT_PIPS_4 = 0x13, + SHORT_PIPS_5 = 0x14, + SHORT_PIPS_6 = 0x15, + SHORT_PIPS_7 = 0x16, + SHORT_PIPS_8 = 0x17, + SHORT_PIPS_9 = 0x18, + SHORT_PIPS_10 = 0x19, + SHORT_PIPS_11 = 0x1A, + SHORT_PIPS_12 = 0x1B, + SHORT_PIPS_13 = 0x1C, + SHORT_PIPS_14 = 0x1D, + SHORT_PIPS_15 = 0x1E, + SHORT_PIPS_16 = 0x1F, + DTMF_POUND = 0x23, + DTMF_STAR = 0x2C, + DTMF_0 = 0x30, + DTMF_1 = 0x31, + DTMF_2 = 0x32, + DTMF_3 = 0x33, + DTMF_4 = 0x34, + DTMF_5 = 0x35, + DTMF_6 = 0x36, + DTMF_7 = 0x37, + DTMF_8 = 0x38, + DTMF_9 = 0x39, + HARP = 0x40, + XYLOPHONE = 0x41, + TUBA = 0x42, + GLOCKENSPIEL = 0x43, + ORGAN = 0x44, + TRUMPET = 0x45, + PIANO = 0x46, + CHIMES = 0x47, + MUSIC_BOX = 0x48, + BELL = 0x49, + CLICK = 0x50, + SWITCH = 0x51, + COWBELL = 0x52, + NOTCH = 0x53, + HIHAT = 0x54, + KICKDRUM = 0x55, + POP = 0x56, + CLACK = 0x57, + CHACK = 0x58, + MUTE = 0x60, + UNMUTE = 0x61 + }; + + enum note_t : unsigned char { + END_SONG = 0xFF, + REST = 0x00, + + NOTE_C1 = 0x18, // 24 + NOTE_C1S = 0x19, + NOTE_D1 = 0x1A, + NOTE_D1S = 0x1B, + NOTE_E1 = 0x1C, + NOTE_F1 = 0x1D, + NOTE_F1S = 0x1E, + NOTE_G1 = 0x1F, + NOTE_G1S = 0x20, + NOTE_A1 = 0x21, + NOTE_A1S = 0x22, + NOTE_B1 = 0x23, + + NOTE_C2 = 0x24, //36 + NOTE_C2S = 0x25, + NOTE_D2 = 0x26, + NOTE_D2S = 0x27, + NOTE_E2 = 0x28, + NOTE_F2 = 0x29, + NOTE_F2S = 0x2A, + NOTE_G2 = 0x2B, + NOTE_G2S = 0x2C, + NOTE_A2 = 0x2D, + NOTE_A2S = 0x2E, + NOTE_B2 = 0x2F, + + NOTE_C3 = 0x30, + NOTE_C3S = 0x31, + NOTE_D3 = 0x32, + NOTE_D3S = 0x33, + NOTE_E3 = 0x34, + NOTE_F3 = 0x35, + NOTE_F3S = 0x36, + NOTE_G3 = 0x37, + NOTE_G3S = 0x38, + NOTE_A3 = 0x39, + NOTE_A3S = 0x3A, + NOTE_B3 = 0x3B, + + NOTE_C4 = 0x3C, + NOTE_C4S = 0x3D, + NOTE_D4 = 0x3E, + NOTE_D4S = 0x3F, + NOTE_E4 = 0x40, + NOTE_F4 = 0x41, + NOTE_F4S = 0x42, + NOTE_G4 = 0x43, + NOTE_G4S = 0x44, + NOTE_A4 = 0x45, + NOTE_A4S = 0x46, + NOTE_B4 = 0x47, + + NOTE_C5 = 0x48, + NOTE_C5S = 0x49, + NOTE_D5 = 0x4A, + NOTE_D5S = 0x4B, + NOTE_E5 = 0x4C, + NOTE_F5 = 0x4D, + NOTE_F5S = 0x4E, + NOTE_G5 = 0x4F, + NOTE_G5S = 0x50, + NOTE_A5 = 0x51, + NOTE_A5S = 0x52, + NOTE_B5 = 0x53, + }; +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/display_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/display_list.h new file mode 100644 index 00000000..99a9e0e8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/display_list.h @@ -0,0 +1,118 @@ +/****************** + * display_list.h * + *****************/ + +/********************************************************************************** + * Adapted from: * + * https://github.com/RudolphRiedel/FT800-FT813 * + * By Rudolph Riedel * + * * + * MIT License * + * * + * Copyright (c) 2017 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy * + * of this software and associated documentation files (the "Software"), to deal * + * in the Software without restriction, including without limitation the rights * + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in all * + * copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * + * SOFTWARE. * + * * + **********************************************************************************/ + +#pragma once + +namespace FTDI { + /* FT8xx graphics engine specific macros useful for static display list generation */ + inline uint32_t ALPHA_FUNC(uint8_t func, uint8_t ref) {return DL::ALPHA_FUNC|((func&7UL)<<8)|(ref&255UL);} + inline uint32_t BEGIN(begin_t prim) {return DL::BEGIN|(prim&15UL);} + + inline uint32_t BITMAP_SOURCE(uint32_t ram_g_addr) {return DL::BITMAP_SOURCE|(ram_g_addr);} + inline uint32_t BITMAP_HANDLE(uint8_t handle) {return DL::BITMAP_HANDLE|(handle&31UL);} + inline uint32_t BITMAP_LAYOUT(uint8_t format, uint16_t linestride, uint16_t height) + {return DL::BITMAP_LAYOUT|((format&31UL)<<19)|((linestride&1023UL)<<9)|(height&511UL);} + + inline uint32_t BITMAP_SIZE(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) + {return DL::BITMAP_SIZE|((filter&1UL)<<20)|((wrapx&1UL)<<19)|((wrapy&1UL)<<18)|((width&511UL)<<9)|(height&511UL);} + #if FTDI_API_LEVEL >= 810 + inline uint32_t BITMAP_LAYOUT_H(uint8_t linestride, uint8_t height) + {return DL::BITMAP_LAYOUT_H|((linestride&3UL)<<2)|(height&3UL);} + inline uint32_t BITMAP_SIZE_H(uint8_t width, uint8_t height) + {return DL::BITMAP_SIZE_H|((width&3UL)<<2)|(height&3UL);} + #endif + inline uint32_t BITMAP_TRANSFORM_A(uint16_t a) {return DL::BITMAP_TRANSFORM_A|(a&131071UL);} + inline uint32_t BITMAP_TRANSFORM_B(uint16_t b) {return DL::BITMAP_TRANSFORM_B|(b&131071UL);} + inline uint32_t BITMAP_TRANSFORM_C(uint32_t c) {return DL::BITMAP_TRANSFORM_C|(c&16777215UL);} + inline uint32_t BITMAP_TRANSFORM_D(uint16_t d) {return DL::BITMAP_TRANSFORM_D|(d&131071UL);} + inline uint32_t BITMAP_TRANSFORM_E(uint16_t e) {return DL::BITMAP_TRANSFORM_E|(e&131071UL);} + inline uint32_t BITMAP_TRANSFORM_F(uint32_t f) {return DL::BITMAP_TRANSFORM_F|(f&16777215UL);} + inline uint32_t BLEND_FUNC(uint8_t src,uint8_t dst) {return DL::BLEND_FUNC|((src&7UL)<<3)|(dst&7UL);} + inline uint32_t CALL(uint16_t dest) {return DL::CALL|(dest&65535UL);} + inline uint32_t CELL(uint8_t cell) {return DL::CELL|(cell&127UL);} + inline uint32_t CLEAR(bool c,bool s,bool t) {return DL::CLEAR|((c?1UL:0UL)<<2)|((s?1UL:0UL)<<1)|(t?1UL:0UL);} + inline uint32_t CLEAR_COLOR_A(uint8_t alpha) {return DL::CLEAR_COLOR_A|(alpha&255UL);} + inline uint32_t CLEAR_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) + {return DL::CLEAR_COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} + inline uint32_t CLEAR_COLOR_RGB(uint32_t rgb) {return DL::CLEAR_COLOR_RGB|rgb;} + inline uint32_t CLEAR_STENCIL(uint8_t s) {return DL::CLEAR_STENCIL|(s&255UL);} + inline uint32_t CLEAR_TAG(uint8_t s) {return DL::CLEAR_TAG|(s&255UL);} + inline uint32_t COLOR_A(uint8_t alpha) {return DL::COLOR_A|(alpha&255UL);} + inline uint32_t COLOR_MASK(bool r, bool g, bool b, bool a) {return DL::COLOR_MASK|((r?1UL:0UL)<<3)|((g?1UL:0UL)<<2)|((b?1UL:0UL)<<1)|(a?1UL:0UL);} + inline uint32_t COLOR_RGB(uint8_t red,uint8_t green,uint8_t blue) + {return DL::COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} + inline uint32_t COLOR_RGB(uint32_t rgb) {return DL::COLOR_RGB|rgb;} + /* inline uint32_t DISPLAY() {return (0UL<<24)) */ + inline uint32_t END() {return DL::END;} + inline uint32_t JUMP(uint16_t dest) {return DL::JUMP|(dest&65535UL);} + inline uint32_t LINE_WIDTH(uint16_t width) {return DL::LINE_WIDTH|(width&4095UL);} + inline uint32_t MACRO(uint8_t m) {return DL::MACRO|(m&1UL);} + inline uint32_t POINT_SIZE(uint16_t size) {return DL::POINT_SIZE|(size&8191UL);} + inline uint32_t RESTORE_CONTEXT() {return DL::RESTORE_CONTEXT;} + inline uint32_t RETURN () {return DL::RETURN;} + inline uint32_t SAVE_CONTEXT() {return DL::SAVE_CONTEXT;} + inline uint32_t SCISSOR_XY(uint16_t x,uint16_t y) { + return DL::SCISSOR_XY | + (FTDI::ftdi_chip >= 810 + ? ((x&2047UL)<<11)|(y&2047UL) + : ((x& 511UL)<<10)|(y&511UL)); + } + inline uint32_t SCISSOR_SIZE(uint16_t w,uint16_t h) { + return DL::SCISSOR_SIZE | + (FTDI::ftdi_chip >= 810 + ? ((w&4095UL)<<12)|(h&4095UL) + : ((w&1023UL)<<10)|(h&1023UL)); + } + inline uint32_t SCISSOR_XY() {return DL::SCISSOR_XY;} + inline uint32_t SCISSOR_SIZE() { + return DL::SCISSOR_SIZE | + (FTDI::ftdi_chip >= 810 + ? (2048UL<<12)|(2048UL) + : ( 512UL<<10)|( 512UL)); + } + inline uint32_t STENCIL_FUNC(uint16_t func, uint8_t ref, uint8_t mask) + {return DL::STENCIL_FUNC|((func&7UL)<<16)|((ref&255UL)<<8)|(mask&255UL);} + inline uint32_t STENCIL_MASK(uint8_t mask) {return DL::STENCIL_MASK|(mask&255UL);} + inline uint32_t STENCIL_OP(uint8_t sfail, uint8_t spass) {return DL::STENCIL_OP|(((sfail)&7UL)<<3)|(spass&7UL);} + inline uint32_t TAG(uint8_t s) {return DL::TAG|(s&255UL);} + inline uint32_t TAG_MASK(bool mask) {return DL::TAG_MASK|(mask?1:0);} + inline uint32_t VERTEX2F(uint16_t x, uint16_t y) {return DL::VERTEX2F|((x&32767UL)<<15)|(y&32767UL);} + inline uint32_t VERTEX2II(uint16_t x,uint16_t y, uint8_t handle = 0, uint8_t cell = 0) + {return DL::VERTEX2II|((x&511UL)<<21)|((y&511UL)<<12)|((handle&31UL)<<7)|(cell&127UL);} + + #if FTDI_API_LEVEL >= 810 + inline uint32_t VERTEX_FORMAT(uint8_t frac) {return DL::VERTEX_FORMAT|(frac&7UL);} + inline uint32_t VERTEX_TRANSLATE_X(int32_t x) {return DL::VERTEX_TRANSLATE_X|(x&131071UL);} + inline uint32_t VERTEX_TRANSLATE_Y(int32_t y) {return DL::VERTEX_TRANSLATE_Y|(y&131071UL);} + #endif +} 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 new file mode 100644 index 00000000..75a2d54f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/ftdi_basic.h @@ -0,0 +1,40 @@ +/**************** + * ftdi_basic.h * + ****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * + * 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: . * + ****************************************************************************/ + +#pragma once + +#include "../compat.h" + +#ifndef __MARLIN_FIRMWARE__ + #define FTDI_BASIC +#endif + +#ifdef FTDI_BASIC + #include "registers_ft800.h" + #include "registers_ft810.h" + #include "constants.h" + #include "boards.h" + #include "commands.h" + #include "spi.h" + #include "display_list.h" + #include "resolutions.h" +#endif 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 new file mode 100644 index 00000000..4063bf2d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft800.h @@ -0,0 +1,150 @@ +/********************* + * registers_ft800.h * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +/**************************************************************************** + * This header defines registers for the FTDI FT800 LCD Driver chip. * + ****************************************************************************/ + +/******************************************************************************* + * FT810 * + * * + * START END ADDR SIZE NAME DESCRIPTION * + * * + * 0x000000 0x03FFFF 256 kB RAM_G Main Graphics RAM * + * * + * 0x0C0000 0x0C0003 4 B ROM_CHIPID [0:1] 0x800 Chip Id * + * [1:2] 0x0100 Vers ID * + * * + * 0x0BB23C 0x0FFFFB 275 kB ROM_FONT Font table and bitmap * + * * + * 0x0FFFFC 0x0FFFFF 4 B ROM_FONT_ADDR Font table pointer address * + * * + * 0x100000 0x101FFF 8 kB RAM_DL Display List RAM * + * * + * 0x102000 0x1023FF 1 kB RAM_PAL Palette RAM * + * * + * 0x102400 0x10257F 380 B * Registers * + * * + * 0x108000 0x108FFF 4 kB RAM_CMD Command Buffer * + * * + *******************************************************************************/ + +#pragma once + +namespace FTDI { + struct ft800_memory_map { + + // MEMORY LOCATIONS FT800 + static constexpr uint32_t RAM_G = 0x000000; // Main Graphics RAM + static constexpr uint32_t ROM_CHIPID = 0x0C0000; // Chip ID/Version ID + static constexpr uint32_t ROM_FONT = 0x0BB23C; // Font ROM + static constexpr uint32_t ROM_FONT_ADDR = 0x0FFFFC; // Font Table Pointer + static constexpr uint32_t RAM_DL = 0x100000; // Display List RAM + static constexpr uint32_t RAM_PAL = 0x102000; // Palette RAM + static constexpr uint32_t RAM_REG = 0x102400; // Registers + static constexpr uint32_t RAM_CMD = 0x108000; // Command Buffer + + static constexpr uint32_t RAM_G_SIZE = 256*1024L; // 256k + }; + + struct ft800_registers { + // REGISTERS AND ADDRESSES FT800 + + // REGISTER ADDRESS SIZE RESET VALUE TYPE DESCRIPTION + + static constexpr uint32_t ID = 0x102400; // 8 0x7C r Identification Register, Always 0x7C + static constexpr uint32_t FRAMES = 0x102404; // 32 0x00000000 r Frame Counter, Since Reset + static constexpr uint32_t CLOCK = 0x102408; // 32 0x00000000 r Clock cycles, Since Reset + static constexpr uint32_t FREQUENCY = 0x10240C; // 28 0x03938700 r/w Main Clock Frequency + static constexpr uint32_t RENDERMODE = 0x102410; // 1 0x00 r/w Rendering Mode: 0 = normal, 1 = single-line + static constexpr uint32_t SNAPY = 0x102414; // 11 0x0000 r/w Scan Line Select for RENDERMODE 1 + static constexpr uint32_t SNAPSHOT = 0x102418; // 1 - r Trigger for RENDERMODE 1 + static constexpr uint32_t CPURESET = 0x10241C; // 3 0x02 r/w RESET Bit2 Audio - Bit1 Touch - Bit0 Graphics + static constexpr uint32_t TAP_CRC = 0x102420; // 32 - r Live Video Tap + static constexpr uint32_t TAP_MASK = 0x102424; // 32 0xFFFFFFFF r/w Live Video Tap Mask + static constexpr uint32_t HCYCLE = 0x102428; // 12 0x224 r/w Horizontal Total Cycle Count + static constexpr uint32_t HOFFSET = 0x10242C; // 12 0x02B r/w Horizontal Display Start Offset + static constexpr uint32_t HSIZE = 0x102430; // 12 0x1E0 r/w Horizontal Display Pixel Count + static constexpr uint32_t HSYNC0 = 0x102434; // 12 0x000 r/w Horizontal Sync Fall Offset + static constexpr uint32_t HSYNC1 = 0x102438; // 12 0x029 r/w Horizontal Sync Rise Offset + static constexpr uint32_t VCYCLE = 0x10243C; // 12 0x124 r/w Vertical Total Cycle Count + static constexpr uint32_t VOFFSET = 0x102440; // 12 0x00C r/w Vertical Display Start Offset + static constexpr uint32_t VSIZE = 0x102444; // 12 0x110 r/w Vertical Display Line Count + static constexpr uint32_t VSYNC0 = 0x102448; // 10 0x000 r/w Vertical Sync Fall Offset + static constexpr uint32_t VSYNC1 = 0x10244C; // 10 0x00A r/w Vertical Sync Rise Offset + static constexpr uint32_t DLSWAP = 0x102450; // 2 0x00 r/w Display List Swap Control + static constexpr uint32_t ROTATE = 0x102454; // 3 0x00 r/w Screen 90,180, 270 degree rotate + static constexpr uint32_t OUTBITS = 0x102458; // 9 0x1B6 r/w Output Resolution, 3x3x3 Bits + static constexpr uint32_t DITHER = 0x10245C; // 1 0x01 r/w Output Dither Enable + static constexpr uint32_t SWIZZLE = 0x102460; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing + static constexpr uint32_t CSPREAD = 0x102464; // 1 0x01 r/w Output Clock Spreading Enable + static constexpr uint32_t PCLK_POL = 0x102468; // 1 0x00 r/w PCLK Polarity: 0 = Rising Edge, 1 = Falling Edge + static constexpr uint32_t PCLK = 0x10246C; // 8 0x00 r/w PCLK Frequency Divider, 0 = Disable Clock + static constexpr uint32_t TAG_X = 0x102470; // 11 0x000 r/w Tag Query X Coordinate + static constexpr uint32_t TAG_Y = 0x102474; // 11 0x000 r/w Tag Query Y Coordinate + static constexpr uint32_t TAG = 0x102478; // 8 0x00 r Tag Query Result + static constexpr uint32_t VOL_PB = 0x10247C; // 8 0xFF r/w Audio Playback Volume + static constexpr uint32_t VOL_SOUND = 0x102480; // 8 0xFF r/w Audio Synthesizer Volume + static constexpr uint32_t SOUND = 0x102484; // 16 0x0000 r/w Audio Sound Effect Select + static constexpr uint32_t PLAY = 0x102488; // 1 0x00 r/w Audio Start Effect Playback + static constexpr uint32_t GPIO_DIR = 0x10248C; // 8 0x80 r/w GPIO Pin Direction: 0 = Input , 1 = Output + static constexpr uint32_t GPIO = 0x102490; // 8 0x00 r/w GPIO Pin Values for 0, 1, 7 Drive Strength 2, 3, 4, 5, 6 + static constexpr uint32_t INT_FLAGS = 0x102498; // 8 0x00 r Interrupt Flags, Clear by Reading + static constexpr uint32_t INT_EN = 0x10249C; // 1 0x00 r/w Global Interrupt Enable + static constexpr uint32_t INT_MASK = 0x1024A0; // 8 0xFF r/w Interrupt Enable Mask + static constexpr uint32_t PLAYBACK_START = 0x1024A4; // 20 0x00000 r/w Audio Playback RAM Start Address + static constexpr uint32_t PLAYBACK_LENGTH = 0x1024A8; // 20 0x00000 r/w Audio Playback Sample Length (Bytes) + static constexpr uint32_t PLAYBACK_READPTR = 0x1024AC; // 20 - r Audio Playback Read Pointer + static constexpr uint32_t PLAYBACK_FREQ = 0x1024B0; // 16 0x1F40 r/w Audio Playback Frequency (Hz) + static constexpr uint32_t PLAYBACK_FORMAT = 0x1024B4; // 2 0x00 r/w Audio Playback Format + static constexpr uint32_t PLAYBACK_LOOP = 0x1024B8; // 1 0x00 r/w Audio Playback Loop Enable + static constexpr uint32_t PLAYBACK_PLAY = 0x1024BC; // 1 0x00 r Audio Start Playback + static constexpr uint32_t PWM_HZ = 0x1024C0; // 14 0x00FA r/w Backlight PWM Frequency (Hz) + static constexpr uint32_t PWM_DUTY = 0x1024C4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% + static constexpr uint32_t MACRO_0 = 0x1024C8; // 32 0x00000000 r/w Display List Macro Command 0 + static constexpr uint32_t MACRO_1 = 0x1024CC; // 32 0x00000000 r/w Display List Macro Command 1 + static constexpr uint32_t CMD_READ = 0x1024E4; // 12 0x000 r/w Command Buffer Read Pointer + static constexpr uint32_t CMD_WRITE = 0x1024E8; // 12 0x000 r/w Command Buffer Write Pointer + static constexpr uint32_t CMD_DL = 0x1024EC; // 13 0x0000 r/w Command Display List Offset + static constexpr uint32_t TOUCH_MODE = 0x1024F0; // 2 0x03 r/w Touch-Screen Sampling Mode + static constexpr uint32_t TOUCH_ADC_MODE = 0x1024F4; // 1 0x01 r/w Select Single Ended or Differential Sampling + static constexpr uint32_t TOUCH_CHARGE = 0x1024F8; // 16 0x1770 r/w Touch Screen Charge Time, n x 6 Clocks + static constexpr uint32_t TOUCH_SETTLE = 0x1024FC; // 4 0x03 r/w Touch-Screen Settle Time, n x 6 Clocks + static constexpr uint32_t TOUCH_OVERSAMPLE = 0x102500; // 4 0x07 r/w Touch-Screen Oversample Factor + static constexpr uint32_t TOUCH_RZTHRESH = 0x102504; // 16 0xFFFF r/w Touch-Screen Resistance Threshold + static constexpr uint32_t TOUCH_RAW_XY = 0x102508; // 32 - r Touch-Screen Raw (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_RZ = 0x10250C; // 16 - r Touch-Screen Resistance + static constexpr uint32_t TOUCH_SCREEN_XY = 0x102510; // 32 - r Touch-Screen Screen (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_TAG_XY = 0x102514; // 32 - r Touch-Screen Tag 0 Lookup (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_TAG = 0x102518; // 8 - r Touch-Screen Tag 0 Result + static constexpr uint32_t TOUCH_TRANSFORM_A = 0x10251C; // 32 0x00010000 r/w Touch-Screen Transform Coefficient A (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_B = 0x102520; // 32 0x00000000 r/w Touch-Screen Transform Coefficient B (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_C = 0x102524; // 32 0x00000000 r/w Touch-Screen Transform Coefficient C (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_D = 0x102528; // 32 0x00000000 r/w Touch-Screen Transform Coefficient D (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_E = 0x10252C; // 32 0x00010000 r/w Touch-Screen Transform Coefficient E (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_F = 0x102530; // 32 0x00000000 r/w Touch-Screen Transform Coefficient F (s15.16) + // Reserved Addresses 0x102434 - 0x102470 + static constexpr uint32_t TOUCH_DIRECT_XY = 0x102574; // 32 - r Touch-Screen Direct Conversions XY (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_DIRECT_Z1Z2 = 0x102578; // 32 - r Touch-Screen Direct Conversions Z (z1-MSB16; z2-LSB16) + static constexpr uint32_t TRACKER = 0x109000; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) + }; +} 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 new file mode 100644 index 00000000..448717b4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/registers_ft810.h @@ -0,0 +1,187 @@ +/********************* + * registers_ft810.h * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +/**************************************************************************** + * This header defines registers for the FTDI FT810 LCD Driver chip. * + ****************************************************************************/ + +/******************************************************************************* + * FT810 * + * * + * START END ADDR SIZE NAME DESCRIPTION * + * * + * 0x000000 0x0FFFFF 1024 kB RAM_G Main Graphics RAM (0 to 1048572) * + * * + * 0x0C0000 0x0C0003 4 B ROM_CHIPID [0:1] 0x800 Chip Id * + * [1:2] 0x0100 Vers ID * + * * + * 0x1E0000 0x2FFFFB 1152 kB ROM_FONT Font table and bitmap * + * * + * 0x201EE0 0x2029DC 2812 B ROM_FONT_ROOT ROM font table * + * * + * 0x2FFFFC 0x2FFFFF 4 B ROM_FONT_ADDR Font table pointer address * + * * + * 0x300000 0x301FFF 8 kB RAM_DL Display List RAM * + * * + * 0x302000 0x302FFF 4 kB * Registers * + * * + * 0x308000 0x308FFF 4 kB RAM_CMD Command Buffer * + * * + *******************************************************************************/ + +#pragma once + +namespace FTDI { + struct ft810_memory_map { + // MEMORY LOCATIONS FT810 + static constexpr uint32_t RAM_G = 0x000000; // Main Graphics RAM + static constexpr uint32_t ROM_CHIPID = 0x0C0000; // Chip ID/Version ID + static constexpr uint32_t ROM_FONT = 0x1E0000; // Font ROM + static constexpr uint32_t ROM_FONT_ADDR = 0x2FFFFC; // Font Table Pointer + static constexpr uint32_t RAM_DL = 0x300000; // Display List RAM + static constexpr uint32_t RAM_REG = 0x302000; // Registers + static constexpr uint32_t RAM_CMD = 0x308000; // Command Buffer + + static constexpr uint32_t RAM_G_SIZE = 1024*1024L; // 1024k + }; + + struct ft810_registers { + // REGISTERS AND ADDRESSES FT810 + + // REGISTER ADDRESS SIZE RESET VALUE TYPE DESCRIPTION + + static constexpr uint32_t ID = 0x302000; // 8 0x7C r Identification Register, Always 0x7C + static constexpr uint32_t FRAMES = 0x302004; // 32 0x00000000 r Frame Counter, Since Reset + static constexpr uint32_t CLOCK = 0x302008; // 32 0x00000000 r Clock cycles, Since Reset + static constexpr uint32_t FREQUENCY = 0x30200C; // 28 0x03938700 r/w Main Clock Frequency + static constexpr uint32_t RENDERMODE = 0x302010; // 1 0x00 r/w Rendering Mode: 0 = normal, 1 = single-line + static constexpr uint32_t SNAPY = 0x302014; // 11 0x0000 r/w Scan Line Select for RENDERMODE 1 + static constexpr uint32_t SNAPSHOT = 0x302018; // 1 - r Trigger for RENDERMODE 1 + static constexpr uint32_t SNAPFORMAT = 0x30201C; // 6 0x20 r/w Pixel Format for Scanline Readout + static constexpr uint32_t CPURESET = 0x302020; // 3 0x02 r/w RESET Bit2 Audio - Bit1 Touch - Bit0 Graphics + static constexpr uint32_t TAP_CRC = 0x302024; // 32 - r Live Video Tap + static constexpr uint32_t TAP_MASK = 0x302028; // 32 0xFFFFFFFF r/w Live Video Tap Mask + static constexpr uint32_t HCYCLE = 0x30202C; // 12 0x224 r/w Horizontal Total Cycle Count + static constexpr uint32_t HOFFSET = 0x302030; // 12 0x02B r/w Horizontal Display Start Offset + static constexpr uint32_t HSIZE = 0x302034; // 12 0x1E0 r/w Horizontal Display Pixel Count + static constexpr uint32_t HSYNC0 = 0x302038; // 12 0x000 r/w Horizontal Sync Fall Offset + static constexpr uint32_t HSYNC1 = 0x30203C; // 12 0x029 r/w Horizontal Sync Rise Offset + static constexpr uint32_t VCYCLE = 0x302040; // 12 0x124 r/w Vertical Total Cycle Count + static constexpr uint32_t VOFFSET = 0x302044; // 12 0x00C r/w Vertical Display Start Offset + static constexpr uint32_t VSIZE = 0x302048; // 12 0x110 r/w Vertical Display Line Count + static constexpr uint32_t VSYNC0 = 0x30204C; // 10 0x000 r/w Vertical Sync Fall Offset + static constexpr uint32_t VSYNC1 = 0x302050; // 10 0x00A r/w Vertical Sync Rise Offset + static constexpr uint32_t DLSWAP = 0x302054; // 2 0x00 r/w Display List Swap Control + static constexpr uint32_t ROTATE = 0x302058; // 3 0x00 r/w Screen 90,180, 270 degree rotate + static constexpr uint32_t OUTBITS = 0x30205C; // 9 0x1B6 r/w Output Resolution, 3x3x3 Bits + static constexpr uint32_t DITHER = 0x302060; // 1 0x01 r/w Output Dither Enable + static constexpr uint32_t SWIZZLE = 0x302064; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing + static constexpr uint32_t CSPREAD = 0x302068; // 1 0x01 r/w Output Clock Spreading Enable + static constexpr uint32_t PCLK_POL = 0x30206C; // 1 0x00 r/w PCLK Polarity: 0 = Rising Edge, 1 = Falling Edge + static constexpr uint32_t PCLK = 0x302070; // 8 0x00 r/w PCLK Frequency Divider, 0 = Disable Clock + static constexpr uint32_t TAG_X = 0x302074; // 11 0x000 r/w Tag Query X Coordinate + static constexpr uint32_t TAG_Y = 0x302078; // 11 0x000 r/w Tag Query Y Coordinate + static constexpr uint32_t TAG = 0x30207C; // 8 0x00 r Tag Query Result + static constexpr uint32_t VOL_PB = 0x302080; // 8 0xFF r/w Audio Playback Volume + static constexpr uint32_t VOL_SOUND = 0x302084; // 8 0xFF r/w Audio Synthesizer Volume + static constexpr uint32_t SOUND = 0x302088; // 16 0x0000 r/w Audio Sound Effect Select + static constexpr uint32_t PLAY = 0x30208C; // 1 0x00 r/w Audio Start Effect Playback + static constexpr uint32_t GPIO_DIR = 0x302090; // 8 0x80 r/w GPIO Pin Direction: 0 = Input , 1 = Output + static constexpr uint32_t GPIO = 0x302094; // 8 0x00 r/w GPIO Pin Values for 0, 1, 7 Drive Strength 2, 3, 4, 5, 6 + static constexpr uint32_t GPIOX_DIR = 0x302098; // 16 0x8000 r/w Extended GPIO Pin Direction + static constexpr uint32_t GPIOX = 0x30209C; // 16 0x0080 r/w Extended GPIO Pin Values + // Reserved Addr 0x3020A0 + // Reserved Addr 0x3020A4 + static constexpr uint32_t INT_FLAGS = 0x3020A8; // 8 0x00 r Interrupt Flags, Clear by Reading + static constexpr uint32_t INT_EN = 0x3020AC; // 1 0x00 r/w Global Interrupt Enable + static constexpr uint32_t INT_MASK = 0x3020B0; // 8 0xFF r/w Interrupt Enable Mask + static constexpr uint32_t PLAYBACK_START = 0x3020B4; // 20 0x00000 r/w Audio Playback RAM Start Address + static constexpr uint32_t PLAYBACK_LENGTH = 0x3020B8; // 20 0x00000 r/w Audio Playback Sample Length (Bytes) + static constexpr uint32_t PLAYBACK_READPTR = 0x3020BC; // 20 - r Audio Playback Read Pointer + static constexpr uint32_t PLAYBACK_FREQ = 0x3020C0; // 16 0x1F40 r/w Audio Playback Frequency (Hz) + static constexpr uint32_t PLAYBACK_FORMAT = 0x3020C4; // 2 0x00 r/w Audio Playback Format + static constexpr uint32_t PLAYBACK_LOOP = 0x3020C8; // 1 0x00 r/w Audio Playback Loop Enable + static constexpr uint32_t PLAYBACK_PLAY = 0x3020CC; // 1 0x00 r Audio Start Playback + static constexpr uint32_t PWM_HZ = 0x3020D0; // 14 0x00FA r/w Backlight PWM Frequency (Hz) + static constexpr uint32_t PWM_DUTY = 0x3020D4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% + static constexpr uint32_t MACRO_0 = 0x3020D8; // 32 0x00000000 r/w Display List Macro Command 0 + static constexpr uint32_t MACRO_1 = 0x3020DC; // 32 0x00000000 r/w Display List Macro Command 1 + // Reserved Addr 0x3020E0 + // Reserved Addr 0x3020E4 + // Reserved Addr 0x3020E8 + // Reserved Addr 0x3020EC + // Reserved Addr 0x3020F0 + // Reserved Addr 0x3020F4 + static constexpr uint32_t CMD_READ = 0x3020F8; // 12 0x000 r/w Command Buffer Read Pointer + static constexpr uint32_t CMD_WRITE = 0x3020FC; // 12 0x000 r/w Command Buffer Write Pointer + static constexpr uint32_t CMD_DL = 0x302100; // 13 0x0000 r/w Command Display List Offset + static constexpr uint32_t TOUCH_MODE = 0x302104; // 2 0x03 r/w Touch-Screen Sampling Mode + static constexpr uint32_t TOUCH_ADC_MODE = 0x302108; // 1 0x01 r/w Select Single Ended or Differential Sampling + static constexpr uint32_t TOUCH_CHARGE = 0x30210C; // 16 0x1770 r/w Touch Screen Charge Time, n x 6 Clocks + static constexpr uint32_t TOUCH_SETTLE = 0x302110; // 4 0x03 r/w Touch-Screen Settle Time, n x 6 Clocks + static constexpr uint32_t TOUCH_OVERSAMPLE = 0x302114; // 4 0x07 r/w Touch-Screen Oversample Factor + static constexpr uint32_t TOUCH_RZTHRESH = 0x302118; // 16 0xFFFF r/w Touch-Screen Resistance Threshold + static constexpr uint32_t TOUCH_RAW_XY = 0x30211C; // 32 - r Touch-Screen Raw (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_RZ = 0x302120; // 16 - r Touch-Screen Resistance + static constexpr uint32_t TOUCH_SCREEN_XY = 0x302124; // 32 - r Touch-Screen Screen (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_TAG_XY = 0x302128; // 32 - r Touch-Screen Tag 0 Lookup (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_TAG = 0x30212C; // 8 - r Touch-Screen Tag 0 Result + static constexpr uint32_t TOUCH_TAG1_XY = 0x302130; // 32 - r Touch-Screen Tag 1 Lookup + static constexpr uint32_t TOUCH_TAG1 = 0x302134; // 8 - r Touch-Screen Tag 1 Result + static constexpr uint32_t TOUCH_TAG2_XY = 0x302138; // 32 - r Touch-Screen Tag 2 Lookup + static constexpr uint32_t TOUCH_TAG2 = 0x30213C; // 8 - r Touch-Screen Tag 2 Result + static constexpr uint32_t TOUCH_TAG3_XY = 0x302140; // 32 - r Touch-Screen Tag 3 Lookup + static constexpr uint32_t TOUCH_TAG3 = 0x302144; // 8 - r Touch-Screen Tag 3 Result + static constexpr uint32_t TOUCH_TAG4_XY = 0x302148; // 32 - r Touch-Screen Tag 4 Lookup + static constexpr uint32_t TOUCH_TAG4 = 0x30214C; // 8 - r Touch-Screen Tag 4 Result + static constexpr uint32_t TOUCH_TRANSFORM_A = 0x302150; // 32 0x00010000 r/w Touch-Screen Transform Coefficient A (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_B = 0x302154; // 32 0x00000000 r/w Touch-Screen Transform Coefficient B (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_C = 0x302158; // 32 0x00000000 r/w Touch-Screen Transform Coefficient C (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_D = 0x30215C; // 32 0x00000000 r/w Touch-Screen Transform Coefficient D (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_E = 0x302160; // 32 0x00010000 r/w Touch-Screen Transform Coefficient E (s15.16) + static constexpr uint32_t TOUCH_TRANSFORM_F = 0x302164; // 32 0x00000000 r/w Touch-Screen Transform Coefficient F (s15.16) + static constexpr uint32_t TOUCH_CONFIG = 0x302168; // 16 0x8381 r/w Touch Configuration + static constexpr uint32_t CTOUCH_TOUCH4_X = 0x30216C; // 16 - r Extended Mode Touch Screen + // Reserved Addresses 0x302170 + static constexpr uint32_t BIST_EN = 0x302174; // 1 0 r/w BIST Memory Mapping Enable + // Reserved Addr 0x302178 + // Reserved Addr 0x30217C + static constexpr uint32_t TRIM = 0x302180; // 8 0 r/w Internal Clock Trimming + static constexpr uint32_t ANA_COMP = 0x302184; // 8 0 r/w Analog Control Register + static constexpr uint32_t SPI_WIDTH = 0x302188; // 3 0 r/w QSPI Bus Width Setting + static constexpr uint32_t TOUCH_DIRECT_XY = 0x30218C; // 32 - r Touch-Screen Direct Conversions XY (x-MSB16; y-LSB16) + static constexpr uint32_t TOUCH_DIRECT_Z1Z2 = 0x302190; // 32 - r Touch-Screen Direct Conversions Z (z1-MSB16; z2-LSB16) + // Reserved Addresses 0x302194 - 0x302560 + static constexpr uint32_t DATESTAMP = 0x320564; // 128 - r Stamp Date Code + static constexpr uint32_t CMDB_SPACE = 0x302574; // 12 0xFFC r/w Command DL Space Available + static constexpr uint32_t CMDB_WRITE = 0x302578; // 32 0 w Command DL Write + + static constexpr uint32_t TRACKER = 0x309000; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) + static constexpr uint32_t TRACKER_1 = 0x309004; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) + static constexpr uint32_t TRACKER_2 = 0x309008; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) + static constexpr uint32_t TRACKER_3 = 0x30900C; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) + static constexpr uint32_t TRACKER_4 = 0x309010; // 32 0x00000000 r/w Track Register (Track Value MSB16; Tag Value - LSB8) + + static constexpr uint32_t MEDIAFIFO_READ = 0x309014; // 32 0x00000000 r/w Media FIFO read pointer + static constexpr uint32_t MEDIAFIFO_WRITE = 0x309018; // 32 0x00000000 r/w Media FIFO write pointer + }; +} 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 new file mode 100644 index 00000000..8d455907 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -0,0 +1,127 @@ +/***************** + * resolutions.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * + * 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: . * + ****************************************************************************/ + +#pragma once + +/*** + * The FT8xx has odd registers that don't correspond to timing values in + * display datasheets. This macro computes the register values using the + * formulas given in the document: + * + * Bridgetek Application Note + * AN_336 FT8xx + * Selecting an LCD Display + * Version 2.1 + * Issue Date: 2017-11-14 + */ +#define COMPUTE_REGS_FROM_DATASHEET \ + constexpr uint16_t Hoffset = thfp + thb - 1; \ + constexpr uint16_t Hcycle = th; \ + constexpr uint16_t Hsync0 = thfp - 1 ; \ + constexpr uint16_t Hsync1 = thfp + thpw - 1; \ + constexpr uint16_t Voffset = tvfp + tvb - 1; \ + constexpr uint16_t Vcycle = tv; \ + constexpr uint16_t Vsync0 = tvfp - 1; \ + constexpr uint16_t Vsync1 = tvfp + tvpw - 1; \ + static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \ + static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv"); + +#ifdef TOUCH_UI_320x240 + namespace FTDI { + constexpr uint8_t Pclk = 8; + constexpr uint8_t Pclkpol = 0; + constexpr uint16_t Hsize = 320; + constexpr uint16_t Vsize = 240; + constexpr uint16_t Vsync0 = 0; + constexpr uint16_t Vsync1 = 2; + constexpr uint16_t Voffset = 13; + constexpr uint16_t Vcycle = 263; + constexpr uint16_t Hsync0 = 0; + constexpr uint16_t Hsync1 = 10; + constexpr uint16_t Hoffset = 70; + constexpr uint16_t Hcycle = 408; + + constexpr uint32_t default_transform_a = 0x000054AD; + constexpr uint32_t default_transform_b = 0xFFFFFF52; + constexpr uint32_t default_transform_c = 0xFFF7F6E4; + constexpr uint32_t default_transform_d = 0x00000065; + constexpr uint32_t default_transform_e = 0xFFFFBE3B; + constexpr uint32_t default_transform_f = 0x00F68E75; + } + +#elif defined(TOUCH_UI_480x272) + namespace FTDI { + constexpr uint8_t Pclk = 7; + constexpr uint8_t Pclkpol = 1; + constexpr uint16_t Hsize = 480; + constexpr uint16_t Vsize = 272; + + constexpr uint16_t th = 525; // One horizontal line + constexpr uint16_t thfp = 43; // HS Front porch + constexpr uint16_t thb = 2; // HS Back porch (blanking) + constexpr uint16_t thpw = 41; // HS pulse width + + constexpr uint16_t tv = 286; // Vertical period time + constexpr uint16_t tvfp = 12; // VS Front porch + constexpr uint16_t tvb = 2; // VS Back porch (blanking) + constexpr uint16_t tvpw = 10; // VS pulse width + + COMPUTE_REGS_FROM_DATASHEET + + constexpr uint32_t default_transform_a = 0x00008100; + constexpr uint32_t default_transform_b = 0x00000000; + constexpr uint32_t default_transform_c = 0xFFF18000; + constexpr uint32_t default_transform_d = 0x00000000; + constexpr uint32_t default_transform_e = 0xFFFFB100; + constexpr uint32_t default_transform_f = 0x0120D000; + } + +#elif defined(TOUCH_UI_800x480) + namespace FTDI { + constexpr uint8_t Pclk = 3; + constexpr uint8_t Pclkpol = 1; + constexpr uint16_t Hsize = 800; + constexpr uint16_t Vsize = 480; + + constexpr uint16_t th = 1056; // One horizontal line + constexpr uint16_t thfp = 210; // HS Front porch + constexpr uint16_t thb = 46; // HS Back porch (blanking) + constexpr uint16_t thpw = 23; // HS pulse width + + constexpr uint16_t tv = 525; // Vertical period time + constexpr uint16_t tvfp = 22; // VS Front porch + constexpr uint16_t tvb = 23; // VS Back porch (blanking) + constexpr uint16_t tvpw = 10; // VS pulse width + + COMPUTE_REGS_FROM_DATASHEET + + constexpr uint32_t default_transform_a = 0x0000D8B9; + constexpr uint32_t default_transform_b = 0x00000124; + constexpr uint32_t default_transform_c = 0xFFE23926; + constexpr uint32_t default_transform_d = 0xFFFFFF51; + constexpr uint32_t default_transform_e = 0xFFFF7E4F; + constexpr uint32_t default_transform_f = 0x01F0AF70; + } + +#else + #error "Unknown or no TOUCH_UI_FTDI_EVE display resolution specified. To add a display resolution, modify 'ftdi_eve_resolutions.h'." +#endif 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 new file mode 100644 index 00000000..d91d08fb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp @@ -0,0 +1,175 @@ +/*********** + * spi.cpp * + ***********/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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_basic.h" + +#ifdef FTDI_BASIC + +/********************************* SPI Functions *********************************/ + +namespace FTDI { + + #ifndef CLCD_USE_SOFT_SPI + #ifdef CLCD_SPI_BUS + SPIClass EVE_SPI(CLCD_SPI_BUS); + #endif + #ifndef CLCD_HW_SPI_SPEED + #define CLCD_HW_SPI_SPEED 8000000 >> SPI_SPEED + #endif + SPISettings SPI::spi_settings(CLCD_HW_SPI_SPEED, MSBFIRST, SPI_MODE0); + #endif + + void SPI::spi_init() { + SET_OUTPUT(CLCD_MOD_RESET); // Module Reset (a.k.a. PD, not SPI) + WRITE(CLCD_MOD_RESET, 0); // start with module in power-down + + SET_OUTPUT(CLCD_SPI_CS); + WRITE(CLCD_SPI_CS, 1); + + #ifdef CLCD_SPI_EXTRA_CS + SET_OUTPUT(CLCD_SPI_EXTRA_CS); + WRITE(CLCD_SPI_EXTRA_CS, 1); + #endif + + #ifdef SPI_FLASH_SS + SET_OUTPUT(SPI_FLASH_SS); + WRITE(SPI_FLASH_SS, 1); + #endif + + #ifdef CLCD_USE_SOFT_SPI + SET_OUTPUT(CLCD_SOFT_SPI_MOSI); + WRITE(CLCD_SOFT_SPI_MOSI, 1); + + SET_OUTPUT(CLCD_SOFT_SPI_SCLK); + WRITE(CLCD_SOFT_SPI_SCLK, 0); + + SET_INPUT_PULLUP(CLCD_SOFT_SPI_MISO); + #else + SPI_OBJ.begin(); + #endif + } + + #ifdef CLCD_USE_SOFT_SPI + uint8_t SPI::_soft_spi_xfer(uint8_t spiOutByte) { + uint8_t spiIndex = 0x80; + uint8_t spiInByte = 0; + uint8_t k; + + noInterrupts(); + for (k = 0; k < 8; k++) { // Output and Read each bit of spiOutByte and spiInByte + WRITE(CLCD_SOFT_SPI_MOSI, (spiOutByte & spiIndex) ? 1 : 0); // Output MOSI Bit + WRITE(CLCD_SOFT_SPI_SCLK, 1); // Pulse Clock + if (READ(CLCD_SOFT_SPI_MISO)) spiInByte |= spiIndex; // MISO changes on the falling edge of clock, so sample it before + WRITE(CLCD_SOFT_SPI_SCLK, 0); + spiIndex >>= 1; + } + interrupts(); + return spiInByte; + } + #endif + + #ifdef CLCD_USE_SOFT_SPI + void SPI::_soft_spi_send(uint8_t spiOutByte) { + uint8_t k, spiIndex = 0x80; + + noInterrupts(); + for (k = 0; k < 8; k++) { // Output each bit of spiOutByte + WRITE(CLCD_SOFT_SPI_MOSI, (spiOutByte & spiIndex) ? 1 : 0); // Output MOSI Bit + WRITE(CLCD_SOFT_SPI_SCLK, 1); // Pulse Clock + WRITE(CLCD_SOFT_SPI_SCLK, 0); + spiIndex >>= 1; + } + interrupts(); + } + #endif + + void SPI::spi_read_bulk(void *data, uint16_t len) { + uint8_t* p = (uint8_t *)data; + while (len--) *p++ = spi_recv(); + } + + bool SPI::spi_verify_bulk(const void *data, uint16_t len) { + const uint8_t* p = (const uint8_t *)data; + while (len--) if (*p++ != spi_recv()) return false; + return true; + } + + // CLCD SPI - Chip Select + void SPI::spi_ftdi_select() { + #ifndef CLCD_USE_SOFT_SPI + SPI_OBJ.beginTransaction(spi_settings); + #endif + WRITE(CLCD_SPI_CS, 0); + #ifdef CLCD_SPI_EXTRA_CS + WRITE(CLCD_SPI_EXTRA_CS, 0); + #endif + delayMicroseconds(1); + } + + // CLCD SPI - Chip Deselect + void SPI::spi_ftdi_deselect() { + WRITE(CLCD_SPI_CS, 1); + #ifdef CLCD_SPI_EXTRA_CS + WRITE(CLCD_SPI_EXTRA_CS, 1); + #endif + #ifndef CLCD_USE_SOFT_SPI + SPI_OBJ.endTransaction(); + #endif + } + + #ifdef SPI_FLASH_SS + // Serial SPI Flash SPI - Chip Select + void SPI::spi_flash_select() { + #ifndef CLCD_USE_SOFT_SPI + SPI_OBJ.beginTransaction(spi_settings); + #endif + WRITE(SPI_FLASH_SS, 0); + delayMicroseconds(1); + } + + // Serial SPI Flash SPI - Chip Deselect + void SPI::spi_flash_deselect() { + WRITE(SPI_FLASH_SS, 1); + #ifndef CLCD_USE_SOFT_SPI + SPI_OBJ.endTransaction(); + #endif + } + #endif + + // Not really a SPI signal... + void SPI::ftdi_reset() { + WRITE(CLCD_MOD_RESET, 0); + delay(6); /* minimum time for power-down is 5ms */ + WRITE(CLCD_MOD_RESET, 1); + delay(21); /* minimum time to allow from rising PD_N to first access is 20ms */ + } + + // Not really a SPI signal... + void SPI::test_pulse() { + #ifdef CLCD_AUX_0 + WRITE(CLCD_AUX_0, 1); + delayMicroseconds(10); + WRITE(CLCD_AUX_0, 0); + #endif + } +} +#endif // FTDI_BASIC 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 new file mode 100644 index 00000000..30ec786c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h @@ -0,0 +1,136 @@ +/********* + * spi.h * + *********/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#ifndef CLCD_USE_SOFT_SPI + #include +#endif + +namespace FTDI { + + #if !defined(CLCD_SPI_BUS) || defined(CLCD_USE_SOFT_SPI) + #define SPI_OBJ ::SPI + #else + extern SPIClass EVE_SPI; + #define SPI_OBJ EVE_SPI + #endif + + namespace SPI { + #ifndef CLCD_USE_SOFT_SPI + extern SPISettings spi_settings; + #endif + + uint8_t _soft_spi_xfer (uint8_t val); + void _soft_spi_send (uint8_t val); + + void spi_init (); + + void spi_ftdi_select (); + void spi_ftdi_deselect (); + + void spi_flash_select (); + void spi_flash_deselect (); + + inline uint8_t spi_recv() { + #ifdef CLCD_USE_SOFT_SPI + return _soft_spi_xfer(0x00); + #else + return SPI_OBJ.transfer(0x00); + #endif + }; + + inline void spi_send (uint8_t val) { + #ifdef CLCD_USE_SOFT_SPI + _soft_spi_send(val); + #else + SPI_OBJ.transfer(val); + #endif + }; + + inline void spi_write_8 (uint8_t val) {spi_send(val);}; + inline uint8_t spi_read_8 () {return spi_recv();}; + + namespace least_significant_byte_first { + inline void spi_write_16 (uint16_t val) {spi_send(val >> 0); + spi_send(val >> 8);}; + inline void spi_write_32 (uint32_t val) {spi_send(val >> 0); + spi_send(val >> 8); + spi_send(val >> 16); + spi_send(val >> 24);}; + + inline uint8_t spi_read_8 () {return spi_recv();}; + inline uint16_t spi_read_16 () {return (((uint16_t) spi_recv()) << 0) | + (((uint16_t) spi_recv()) << 8);}; + inline uint32_t spi_read_32 () {return (((uint32_t) spi_recv()) << 0) | + (((uint32_t) spi_recv()) << 8) | + (((uint32_t) spi_recv()) << 16) | + (((uint32_t) spi_recv()) << 24);}; + } + + namespace most_significant_byte_first { + inline void spi_write_16 (uint16_t val) {spi_send(val >> 8); + spi_send(val >> 0);}; + inline void spi_write_24 (uint32_t val) {spi_send(val >> 16); + spi_send(val >> 8); + spi_send(val >> 0);}; + inline void spi_write_32 (uint32_t val) {spi_send(val >> 24); + spi_send(val >> 16); + spi_send(val >> 8); + spi_send(val >> 0);}; + + inline uint16_t spi_read_16 () {return (((uint16_t) spi_recv()) << 8) | + (((uint16_t) spi_recv()) << 0);}; + inline uint32_t spi_read_32 () {return (((uint32_t) spi_recv()) << 24) | + (((uint32_t) spi_recv()) << 16) | + (((uint32_t) spi_recv()) << 8) | + (((uint32_t) spi_recv()) << 0);}; + } + + inline uint8_t ram_write(const uint8_t *p) {return *p;} + inline uint8_t pgm_write(const uint8_t *p) {return pgm_read_byte(p);} + + typedef uint8_t (*bulk_write_op)(const uint8_t*); + + // Generic template for function for writing multiple bytes, plus padding bytes. + // The template parameter op is an inlineable function which is applied to each byte. + + template + void spi_write_bulk(const void *data, uint16_t len, uint8_t padding) { + const uint8_t* p = (const uint8_t *)data; + while (len--) spi_send(byte_op(p++)); + while (padding--) spi_send(0); + } + + template + void spi_write_bulk(const void *data, uint16_t len) { + const uint8_t* p = (const uint8_t *)data; + while (len--) spi_send(byte_op(p++)); + } + + void spi_read_bulk( void *data, uint16_t len); + bool spi_verify_bulk(const void *data, uint16_t len); + + void ftdi_reset(); + void test_pulse(); + } +} 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 new file mode 100644 index 00000000..436c67ed --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h @@ -0,0 +1,271 @@ +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#include "../config.h" + +#ifdef __MARLIN_FIRMWARE__ + + // Marlin will define the I/O functions for us + #if ENABLED(TOUCH_UI_FTDI_EVE) + #define FTDI_BASIC + #define FTDI_EXTENDED + #endif + +#else // !__MARLIN_FIRMWARE__ + + #include + + #ifndef CLCD_USE_SOFT_SPI + #include + #endif + + namespace fast_io { + + template + struct port_pin { + typedef port_t port; + static inline void set_high() {port::port() = (port::port() | bits);} + static inline void set_low() {port::port() = (port::port() & (~bits));} + static inline void set_input() {port::ddr() = (port::ddr() & (~bits));} + static inline void set_input_pullup() {set_input(); set_high();} + static inline void set_output() {port::ddr() = (port::ddr() | bits);} + static inline uint8_t read() {return port::pin() & bits;} + static inline void write(bool v) {if (v) set_high(); else set_low();} + }; + + #define MAKE_AVR_PORT_PINS(ID) \ + struct port_##ID { \ + static volatile uint8_t &pin() {return PIN##ID;}; \ + static volatile uint8_t &port() {return PORT##ID;}; \ + static volatile uint8_t &ddr() {return DDR##ID;}; \ + }; \ + typedef port_pin AVR_##ID##0; \ + typedef port_pin AVR_##ID##1; \ + typedef port_pin AVR_##ID##2; \ + typedef port_pin AVR_##ID##3; \ + typedef port_pin AVR_##ID##4; \ + typedef port_pin AVR_##ID##5; \ + typedef port_pin AVR_##ID##6; \ + typedef port_pin AVR_##ID##7; + + #ifdef PORTA + MAKE_AVR_PORT_PINS(A); + #endif + #ifdef PORTB + MAKE_AVR_PORT_PINS(B); + #endif + #ifdef PORTC + MAKE_AVR_PORT_PINS(C); + #endif + #ifdef PORTD + MAKE_AVR_PORT_PINS(D); + #endif + #ifdef PORTE + MAKE_AVR_PORT_PINS(E); + #endif + #ifdef PORTF + MAKE_AVR_PORT_PINS(F); + #endif + #ifdef PORTG + MAKE_AVR_PORT_PINS(G); + #endif + #ifdef PORTH + MAKE_AVR_PORT_PINS(H); + #endif + #ifdef PORTJ + MAKE_AVR_PORT_PINS(J); + #endif + #ifdef PORTK + MAKE_AVR_PORT_PINS(K); + #endif + #ifdef PORTL + MAKE_AVR_PORT_PINS(L); + #endif + #ifdef PORTQ + MAKE_AVR_PORT_PINS(Q); + #endif + #ifdef PORTR + MAKE_AVR_PORT_PINS(R); + #endif + + #undef MAKE_AVR_PORT_PINS + + template + struct arduino_digital_pin { + static constexpr uint8_t pin = p; + static inline void set_high() {digitalWrite(p, HIGH);} + static inline void set_low() {digitalWrite(p, LOW);} + static inline void set_input() {pinMode(p, INPUT);} + static inline void set_input_pullup() {pinMode(p, INPUT_PULLUP);} + static inline void set_output() {pinMode(p, OUTPUT);} + static inline uint8_t read() {return digitalRead(p);} + static inline void write(bool v) {digitalWrite(p, v ? HIGH : LOW);} + }; + + #define MAKE_ARDUINO_PINS(ID) typedef arduino_digital_pin ARDUINO_DIGITAL_##ID; + MAKE_ARDUINO_PINS( 0); + MAKE_ARDUINO_PINS( 1); + MAKE_ARDUINO_PINS( 2); + MAKE_ARDUINO_PINS( 3); + MAKE_ARDUINO_PINS( 4); + MAKE_ARDUINO_PINS( 5); + MAKE_ARDUINO_PINS( 6); + MAKE_ARDUINO_PINS( 7); + MAKE_ARDUINO_PINS( 8); + MAKE_ARDUINO_PINS( 9); + MAKE_ARDUINO_PINS(10); + MAKE_ARDUINO_PINS(11); + MAKE_ARDUINO_PINS(12); + MAKE_ARDUINO_PINS(13); + MAKE_ARDUINO_PINS(14); + MAKE_ARDUINO_PINS(15); + MAKE_ARDUINO_PINS(16); + MAKE_ARDUINO_PINS(17); + MAKE_ARDUINO_PINS(18); + MAKE_ARDUINO_PINS(19); + MAKE_ARDUINO_PINS(10); + MAKE_ARDUINO_PINS(21); + MAKE_ARDUINO_PINS(22); + MAKE_ARDUINO_PINS(23); + MAKE_ARDUINO_PINS(24); + MAKE_ARDUINO_PINS(25); + MAKE_ARDUINO_PINS(26); + MAKE_ARDUINO_PINS(27); + MAKE_ARDUINO_PINS(28); + MAKE_ARDUINO_PINS(29); + MAKE_ARDUINO_PINS(30); + MAKE_ARDUINO_PINS(31); + MAKE_ARDUINO_PINS(32); + MAKE_ARDUINO_PINS(33); + MAKE_ARDUINO_PINS(34); + MAKE_ARDUINO_PINS(35); + MAKE_ARDUINO_PINS(36); + MAKE_ARDUINO_PINS(37); + MAKE_ARDUINO_PINS(38); + MAKE_ARDUINO_PINS(39); + MAKE_ARDUINO_PINS(40); + MAKE_ARDUINO_PINS(41); + MAKE_ARDUINO_PINS(42); + MAKE_ARDUINO_PINS(43); + MAKE_ARDUINO_PINS(44); + MAKE_ARDUINO_PINS(45); + MAKE_ARDUINO_PINS(46); + MAKE_ARDUINO_PINS(47); + MAKE_ARDUINO_PINS(48); + MAKE_ARDUINO_PINS(49); + MAKE_ARDUINO_PINS(50); + MAKE_ARDUINO_PINS(51); + MAKE_ARDUINO_PINS(52); + MAKE_ARDUINO_PINS(53); + #undef MAKE_ARDUINO_PINS + } // namespace fast_io + + #define SET_INPUT(pin) fast_io::pin::set_input() + #define SET_INPUT_PULLUP(pin) do{ fast_io::pin::set_input(); fast_io::pin::set_high(); }while(0) + #define SET_INPUT_PULLDOWN SET_INPUT + #define SET_OUTPUT(pin) fast_io::pin::set_output() + #define READ(pin) fast_io::pin::read() + #define WRITE(pin, value) fast_io::pin::write(value) + + #ifndef pgm_read_word_far + #define pgm_read_word_far pgm_read_word + #endif + + #ifndef pgm_read_dword_far + #define pgm_read_dword_far pgm_read_dword + #endif + + #ifndef pgm_read_ptr_far + #define pgm_read_ptr_far pgm_read_ptr + #endif + + #define SERIAL_ECHO_START() + #define SERIAL_ECHOLNPGM(str) Serial.println(F(str)) + #define SERIAL_ECHOPGM(str) Serial.print(F(str)) + #define SERIAL_ECHO_MSG(str) Serial.println(str) + #define SERIAL_ECHOLNPAIR(str, val) do{ Serial.print(F(str)); Serial.println(val); }while(0) + #define SERIAL_ECHOPAIR(str, val) do{ Serial.print(F(str)); Serial.print(val); }while(0) + + #define safe_delay delay + + // Define macros for compatibility + + #define _CAT(a,V...) a##V + #define CAT(a,V...) _CAT(a,V) + + #define FIRST(a,...) a + #define SECOND(a,b,...) b + #define THIRD(a,b,c,...) c + + #define IS_PROBE(V...) SECOND(V, 0) // Get the second item passed, or 0 + #define PROBE() ~, 1 // Second item will be 1 if this is passed + #define _NOT_0 PROBE() + #define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'. + #define _BOOL(x) NOT(NOT(x)) // NOT('0') gets '0'. Anything else gets '1'. + + #define _DO_1(W,C,A) (_##W##_1(A)) + #define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) + #define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) + #define _DO_4(W,C,A,V...) (_##W##_1(A) C _DO_3(W,C,V)) + #define _DO_5(W,C,A,V...) (_##W##_1(A) C _DO_4(W,C,V)) + #define _DO_6(W,C,A,V...) (_##W##_1(A) C _DO_5(W,C,V)) + #define _DO_7(W,C,A,V...) (_##W##_1(A) C _DO_6(W,C,V)) + #define _DO_8(W,C,A,V...) (_##W##_1(A) C _DO_7(W,C,V)) + #define _DO_9(W,C,A,V...) (_##W##_1(A) C _DO_8(W,C,V)) + #define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) + #define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) + #define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) + #define __DO_N(W,C,N,V...) _DO_##N(W,C,V) + #define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) + #define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V) + + #define _ISENA_ ~,1 + #define _ISENA_1 ~,1 + #define _ISENA_0x1 ~,1 + #define _ISENA_true ~,1 + #define _ISENA(V...) IS_PROBE(V) + #define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O))) + #define _DIS_1(O) NOT(_ENA_1(O)) + #define ENABLED(V...) DO(ENA,&&,V) + #define DISABLED(V...) DO(DIS,&&,V) + + #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' + #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' + #define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1' + #define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '' + #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' + #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' + #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. + + #define ANY(V...) !DISABLED(V) + #define NONE(V...) DISABLED(V) + #define ALL(V...) ENABLED(V) + #define BOTH(V1,V2) ALL(V1,V2) + #define EITHER(V1,V2) ANY(V1,V2) + + // Remove compiler warning on an unused variable + #ifndef UNUSED + #if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + #define UNUSED(X) (void)X + #else + #define UNUSED(x) ((void)(x)) + #endif + #endif + +#endif // !__MARLIN_FIRMWARE__ 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 new file mode 100644 index 00000000..b763c890 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/bitmap_info.h @@ -0,0 +1,49 @@ +/***************** + * bitmap_info.h * + *****************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +#ifndef FORCEDINLINE + #define FORCEDINLINE __attribute__((always_inline)) inline +#endif + +namespace FTDI { + // The following functions *must* be inlined since we are relying on the compiler to do + // substitution of the constants from the data structure rather than actually storing + // it in PROGMEM (which would fail, since we are not using pgm_read to read them). + // Plus, by inlining, all the equations are evaluated at compile-time as everything + // should be a constant. + + typedef struct { + const uint8_t format; + const uint16_t linestride; + const uint8_t filter; + const uint8_t wrapx; + const uint8_t wrapy; + const uint32_t RAMG_offset; + const uint16_t width; + const uint16_t height; + } bitmap_info_t; + + FORCEDINLINE uint32_t BITMAP_SOURCE (const bitmap_info_t& info) {return BITMAP_SOURCE (ftdi_memory_map::RAM_G + info.RAMG_offset);}; + FORCEDINLINE uint32_t BITMAP_LAYOUT (const bitmap_info_t& info) {return BITMAP_LAYOUT (info.format, info.linestride, info.height);}; + FORCEDINLINE uint32_t BITMAP_SIZE (const bitmap_info_t& info) {return BITMAP_SIZE (info.filter, info.wrapx, info.wrapy, info.width, info.height);} +} 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 new file mode 100644 index 00000000..7224b681 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.cpp @@ -0,0 +1,29 @@ +/************************* + * command_processor.cpp * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 * + * * + * 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 + +CommandProcessor::btn_style_func_t *CommandProcessor::_btn_style_callback = CommandProcessor::default_button_style_func; +bool CommandProcessor::is_tracking = false; + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..94ccbb7a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/command_processor.h @@ -0,0 +1,437 @@ +/*********************** + * command_processor.h * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +typedef struct { + uint32_t bg; + uint32_t grad; + uint32_t fg; + uint32_t rgb; +} btn_colors; + +// Disable TOUCH_UI_FIT_TEXT on a case-by-case basis +namespace FTDI { + constexpr uint16_t OPT_NOFIT = OPT_NOTICKS; +} + +/**************************** Enhanced Command Processor **************************/ + +/* The CommandProcessor class wraps the CommandFifo with several features to make + * defining user interfaces much easier. + * + * - Implements chaining on all methods + * - Automatically adds text to button, toggle, text and keys. + * - Constrains all widgets to fit inside a box for ease of layout. + * - Font size is specified using a chained modifier. + * - Option argument is given the default OPT_3D value. + */ + +class CommandProcessor : public CLCD::CommandFifo { + public: + static constexpr uint8_t STYLE_DISABLED = 0x80; + + private: + static bool default_button_style_func(CommandProcessor &, uint8_t tag, uint8_t & /*style*/, uint16_t &options, bool) { + if (tag != 0 && FTDI::EventLoop::get_pressed_tag() == tag) { + options = FTDI::OPT_FLAT; + } + return false; + } + + typedef bool btn_style_func_t(CommandProcessor &cmd, uint8_t tag, uint8_t &style, uint16_t &options, bool post); + + static btn_style_func_t *_btn_style_callback; + static bool is_tracking; + int8_t _font = 26, _tag = 0; + uint8_t _style = 0; + + protected: + // Returns the cannonical thickness of a widget (i.e. the height of a toggle element) + uint16_t widget_thickness() { + CLCD::FontMetrics fm(_font); + return fm.height * 20.0/16; + } + + FORCEDINLINE void linear_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h, bool tracker = false) { + const uint16_t th = widget_thickness() / 2; + if (w > h) { + x += tracker ? th * 2.5 : th; + y += (h - th) / 2; + w -= tracker ? th * 5.0 : th * 2; + h = th; + } + else { + x += (w - th) / 2; + y += tracker ? th * 2.5 : th; + w = th; + h -= tracker ? th * 5.0 : th * 2; + } + } + + FORCEDINLINE uint16_t circular_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h) { + const uint16_t r = min(w,h) / 2; + x += w / 2; + y += h / 2; + w = 1; + h = 1; + return r; + } + + public: + // Helper method for setting all colors at once + inline CommandProcessor& colors(const btn_colors &colors) { + cmd(FTDI::COLOR_RGB(colors.rgb)) + .gradcolor(colors.grad) + .fgcolor(colors.fg) + .bgcolor(colors.bg); + return *this; + } + + inline CommandProcessor& bitmap_size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) { + cmd(FTDI::BITMAP_SIZE(filter, wrapx, wrapy, width, height)); + #if FTDI_API_LEVEL >= 810 + if (FTDI::ftdi_chip >= 810) + cmd(FTDI::BITMAP_SIZE_H(width >> 9, height >> 9)); + #endif + return *this; + } + + inline CommandProcessor& bitmap_layout(uint8_t format, uint16_t linestride, uint16_t height) { + cmd(FTDI::BITMAP_LAYOUT(format, linestride, height)); + #if FTDI_API_LEVEL >= 810 + if (FTDI::ftdi_chip >= 810) + cmd(FTDI::BITMAP_LAYOUT_H(linestride >> 10, height >> 9)); + #endif + return *this; + } + + inline CommandProcessor& set_button_style_callback(const btn_style_func_t *func) { + _btn_style_callback = func ? func : default_button_style_func; + return *this; + } + + inline CommandProcessor& tag (uint8_t tag) {_tag = tag; cmd(FTDI::TAG(tag)); return *this;} + + inline CommandProcessor& font (int16_t font) {_font = font; return *this;} + + inline CommandProcessor& enabled (bool enabled=false) { + if (enabled) + _style &= ~STYLE_DISABLED; + else + _style |= STYLE_DISABLED; + return *this; + } + + inline CommandProcessor& style (uint8_t style) { + _style = (_style & STYLE_DISABLED) | style; + return *this; + } + + // Wrap all the CommandFifo routines to allow method chaining + + inline CommandProcessor& cmd (uint32_t cmd32) {CLCD::CommandFifo::cmd(cmd32); return *this;} + inline CommandProcessor& cmd (void* data, uint16_t len) {CLCD::CommandFifo::cmd(data, len); return *this;} + inline CommandProcessor& execute() {CLCD::CommandFifo::execute(); return *this;} + + inline CommandProcessor& fgcolor (uint32_t rgb) {CLCD::CommandFifo::fgcolor(rgb); return *this;} + inline CommandProcessor& bgcolor (uint32_t rgb) {CLCD::CommandFifo::bgcolor(rgb); return *this;} + inline CommandProcessor& gradcolor(uint32_t rgb) {CLCD::CommandFifo::gradcolor(rgb); return *this;} + + inline CommandProcessor& snapshot (uint32_t ptr) {CLCD::CommandFifo::snapshot(ptr); return *this;} + + inline CommandProcessor& loadimage(uint32_t ptr, uint32_t options) + {CLCD::CommandFifo::loadimage(ptr, options); return *this;} + inline CommandProcessor& sketch (int16_t x, int16_t y, uint16_t w, uint16_t h, uint32_t ptr, uint16_t format) + {CLCD::CommandFifo::sketch(x, y, w, h, ptr, format); return *this;} + inline CommandProcessor& screensaver () {CLCD::CommandFifo::screensaver(); return *this;} + #if FTDI_API_LEVEL >= 810 + inline CommandProcessor& setbase (uint8_t base) {CLCD::CommandFifo::setbase(base); return *this;} + #endif + inline CommandProcessor& loadidentity () {CLCD::CommandFifo::loadidentity(); return *this;} + inline CommandProcessor& scale (int32_t sx, int32_t sy) {CLCD::CommandFifo::scale(sx,sy); return *this;} + inline CommandProcessor& rotate (int32_t a) {CLCD::CommandFifo::rotate(a); return *this;} + inline CommandProcessor& translate(int32_t tx, int32_t ty) {CLCD::CommandFifo::translate(tx,ty); return *this;} + inline CommandProcessor& setmatrix () {CLCD::CommandFifo::setmatrix(); return *this;} + inline CommandProcessor& stop () {CLCD::CommandFifo::stop(); return *this;} + + inline CommandProcessor& memzero (uint32_t ptr, uint32_t size) + {CLCD::CommandFifo::memzero(ptr, size); return *this;} + inline CommandProcessor& memset (uint32_t ptr, uint32_t val, uint32_t size) + {CLCD::CommandFifo::memset(ptr, val, size); return *this;} + inline CommandProcessor& memcpy (uint32_t src, uint32_t dst, uint32_t size) + {CLCD::CommandFifo::memcpy(src, dst, size); return *this;} + inline CommandProcessor& memcrc (uint32_t ptr, uint32_t num, uint32_t result) + {CLCD::CommandFifo::memcrc(ptr, num, result); return *this;} + inline CommandProcessor& memwrite (uint32_t ptr, uint32_t value) + {CLCD::CommandFifo::memwrite(ptr, value); return *this;} + inline CommandProcessor& inflate (uint32_t ptr) + {CLCD::CommandFifo::inflate(ptr); return *this;} + inline CommandProcessor& getptr (uint32_t result) + {CLCD::CommandFifo::getptr(result); return *this;} + inline CommandProcessor& getprops (uint32_t ptr, uint32_t width, uint32_t height) + {CLCD::CommandFifo::getprops(ptr, width, height); return *this;} + + #if FTDI_API_LEVEL >= 810 + inline CommandProcessor& setbitmap (uint32_t ptr, uint16_t fmt, uint16_t w, uint16_t h) + {CLCD::CommandFifo::setbitmap(ptr,fmt,w,h); return *this;} + inline CommandProcessor& snapshot2 (uint32_t fmt, uint32_t ptr, int16_t x, int16_t y, uint16_t w, uint16_t h) + {CLCD::CommandFifo::snapshot2(fmt,ptr,x,y,w,h); return *this;} + inline CommandProcessor& mediafifo (uint32_t p, uint32_t s) {CLCD::CommandFifo::mediafifo(p, s); return *this;} + inline CommandProcessor& playvideo(uint32_t options) {CLCD::CommandFifo::playvideo(options); return *this;} + inline CommandProcessor& romfont(uint8_t font, uint8_t slot) {CLCD::CommandFifo::romfont(font, slot); return *this;} + #endif + + inline CommandProcessor& gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1) + {CLCD::CommandFifo::gradient(x0,y0,rgb0,x1,y1,rgb1); return *this;} + + inline CommandProcessor& rectangle(int16_t x, int16_t y, int16_t w, int16_t h) { + using namespace FTDI; + CLCD::CommandFifo::cmd(BEGIN(RECTS)); + CLCD::CommandFifo::cmd(VERTEX2F(x * 16, y * 16)); + CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16)); + return *this; + } + + template + FORCEDINLINE CommandProcessor& toggle(int16_t x, int16_t y, int16_t w, int16_t h, T text, bool state, uint16_t options = FTDI::OPT_3D) { + CLCD::FontMetrics fm(_font); + const int16_t widget_h = fm.height * 20.0 / 16; + //const int16_t outer_bar_r = widget_h / 2; + //const int16_t knob_r = outer_bar_r - 1.5; + // The y coordinate of the toggle is the baseline of the text, + // so we must introduce a fudge factor based on the line height to + // actually center the control. + const int16_t fudge_y = fm.height * 5 / 16; + CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state); + CLCD::CommandFifo::str(text); + return *this; + } + + CommandProcessor& toggle2(int16_t x, int16_t y, int16_t w, int16_t h, progmem_str no, progmem_str yes, bool state, uint16_t options = FTDI::OPT_3D) { + char text[strlen_P((const char *)no) + strlen_P((const char *)yes) + 2]; + strcpy_P(text, (const char *)no); + strcat(text, "\xFF"); + strcat_P(text, (const char *)yes); + return toggle(x, y, w, h, text, state, options); + } + + // Contrained drawing routines. These constrain the widget inside a box for easier layout. + // The FORCEDINLINE ensures that the code is inlined so that all the math is done at compile time. + + FORCEDINLINE CommandProcessor& track_linear(int16_t x, int16_t y, int16_t w, int16_t h, int16_t tag) { + linear_widget_box(x, y, w, h, true); + CLCD::CommandFifo::track(x, y, w, h, tag); + is_tracking = true; + return *this; + } + + FORCEDINLINE CommandProcessor& track_circular(int16_t x, int16_t y, int16_t w, int16_t h, int16_t tag) { + circular_widget_box(x,y, w, h); + CLCD::CommandFifo::track(x, y, w, h, tag); + is_tracking = true; + return *this; + } + + uint8_t track_tag (uint16_t &value) { + if (is_tracking) { + if (FTDI::EventLoop::is_touch_held()) { + return CLCD::get_tracker(value); + } + else { + CLCD::CommandFifo::track(0, 0, 0, 0, 0); + CLCD::CommandFifo::execute(); + is_tracking = false; + } + } + return 0; + } + + FORCEDINLINE CommandProcessor& clock(int16_t x, int16_t y, int16_t w, int16_t h, int16_t hr, int16_t m, int16_t s, int16_t ms, uint16_t options = FTDI::OPT_3D) { + const uint16_t r = circular_widget_box(x, y, w, h); + CLCD::CommandFifo::clock(x, y, r, options, hr, m, s, ms); + return *this; + } + + FORCEDINLINE CommandProcessor& gauge(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t major, uint16_t minor, uint16_t val, uint16_t range, uint16_t options = FTDI::OPT_3D) { + const uint16_t r = circular_widget_box(x, y, w, h); + CLCD::CommandFifo::gauge(x, y, r, options, major, minor, val, range); + return *this; + } + + FORCEDINLINE CommandProcessor& dial(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t options = FTDI::OPT_3D) { + const uint16_t r = circular_widget_box(x, y, w, h); + CLCD::CommandFifo::dial(x, y, r, options, val); + return *this; + } + + FORCEDINLINE CommandProcessor& slider(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t range, uint16_t options = FTDI::OPT_3D) { + linear_widget_box(x, y, w, h); + CLCD::CommandFifo::slider(x, y, w, h, options, val, range); + return *this; + } + + FORCEDINLINE CommandProcessor& progress(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t range, uint16_t options = FTDI::OPT_3D) { + linear_widget_box(x, y, w, h); + CLCD::CommandFifo::progress(x, y, w, h, options, val, range); + return *this; + } + + FORCEDINLINE CommandProcessor& scrollbar(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t val, uint16_t size, uint16_t range, uint16_t options = 0) { + linear_widget_box(x, y, w, h); + CLCD::CommandFifo::scrollbar(x, y, w, h, options, val, size, range); + return *this; + } + + void apply_text_alignment(int16_t &x, int16_t &y, int16_t w, int16_t h, uint16_t options) { + using namespace FTDI; + x += ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)); + y += ((options & OPT_CENTERY) ? h/2 : h); + } + + // Reduce font size until text fits the enclosing box. + template + int8_t apply_fit_text(int16_t w, int16_t h, T text) { + using namespace FTDI; + int8_t font = _font; + #ifdef TOUCH_UI_USE_UTF8 + const bool is_utf8 = has_utf8_chars(text); + #endif + for (;font > 26;) { + int16_t width, height; + #ifdef TOUCH_UI_USE_UTF8 + if (is_utf8) { + width = get_utf8_text_width(text, font_size_t::from_romfont(font)); + height = font_size_t::from_romfont(font).get_height(); + } + else + #endif + { + CLCD::FontMetrics fm(font); + width = fm.get_text_width(text); + height = fm.height; + } + if (width < w && height < h) break; + font--; + } + return font; + } + + CommandProcessor& number(int16_t x, int16_t y, int16_t w, int16_t h, int32_t n, uint16_t options = FTDI::OPT_CENTER) { + using namespace FTDI; + apply_text_alignment(x, y, w, h, options); + CLCD::CommandFifo::number(x, y, _font, options, n); + return *this; + } + + template + uint16_t text_width(T text) { + using namespace FTDI; + #ifdef TOUCH_UI_USE_UTF8 + if (has_utf8_chars(text)) + return get_utf8_text_width(text, font_size_t::from_romfont(_font)); + #endif + CLCD::FontMetrics fm(_font); + return fm.get_text_width(text); + } + + template + CommandProcessor& text(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_CENTER) { + using namespace FTDI; + apply_text_alignment(x, y, w, h, options); + #ifdef TOUCH_UI_FIT_TEXT + const int8_t font = (options & OPT_NOFIT) ? _font : apply_fit_text(w, h, text); + #else + const int8_t font = _font; + #endif + #ifdef TOUCH_UI_USE_UTF8 + if (has_utf8_chars(text)) + draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(font), options); + else + #endif + { + CLCD::CommandFifo::text(x, y, font, options); + CLCD::CommandFifo::str(text); + } + return *this; + } + + FORCEDINLINE CommandProcessor& icon(int16_t x, int16_t y, int16_t w, int16_t h, const FTDI::bitmap_info_t& info, const float scale = 1) { + using namespace FTDI; + cmd(BEGIN(BITMAPS)); + if (scale != 1) { + cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale))); + cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale))); + } + cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width*scale, info.height*scale)); + cmd(VERTEX2F((x + w/2 - info.width*scale/2)*16, (y + h/2 - info.height*scale/2)*16)); + if (scale != 1) { + cmd(BITMAP_TRANSFORM_A(256)); + cmd(BITMAP_TRANSFORM_E(256)); + } + return *this; + } + + template + CommandProcessor& button(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_3D) { + using namespace FTDI; + bool styleModified = false; + if (_btn_style_callback) styleModified = _btn_style_callback(*this, _tag, _style, options, false); + #ifdef TOUCH_UI_FIT_TEXT + const int8_t font = (options & OPT_NOFIT) ? _font : apply_fit_text(w, h, text); + #else + const int8_t font = _font; + #endif + CLCD::CommandFifo::button(x, y, w, h, font, options); + #ifdef TOUCH_UI_USE_UTF8 + if (has_utf8_chars(text)) { + CLCD::CommandFifo::str(F("")); + apply_text_alignment(x, y, w, h, OPT_CENTER); + if (!(options & FTDI::OPT_FLAT)) { + // Reproduce the black "shadow" the FTDI adds to the button label + CLCD::CommandFifo::cmd(SAVE_CONTEXT()); + CLCD::CommandFifo::cmd(COLOR_RGB(0x00000)); + draw_utf8_text(*this, x-1, y-1, text, font_size_t::from_romfont(font), OPT_CENTER); + CLCD::CommandFifo::cmd(RESTORE_CONTEXT()); + } + // Draw the button label + draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(font), OPT_CENTER); + } + else + #endif + CLCD::CommandFifo::str(text); + if (_btn_style_callback && styleModified) _btn_style_callback(*this, _tag, _style, options, true); + return *this; + } + + template + CommandProcessor& keys(int16_t x, int16_t y, int16_t w, int16_t h, T keys, uint16_t options = FTDI::OPT_3D) { + CLCD::CommandFifo::keys(x, y, w, h, _font, options); + CLCD::CommandFifo::str(keys); + return *this; + } + + FORCEDINLINE CommandProcessor& spinner(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t style = 0, uint16_t scale = 0) { + circular_widget_box(x, y, w, h); + CLCD::CommandFifo::spinner(x, y, style, scale); + return *this; + } +}; 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 new file mode 100644 index 00000000..baed9f85 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.cpp @@ -0,0 +1,180 @@ +/**************** + * dl_cache.cpp * + ****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 + +/* The Display List Cache mechanism stores the display list corresponding + * to a menu into RAM_G so that on subsequent calls drawing the menu does + * not require as much SPI traffic. + * + * Layout of Cache memory: + * + * The cache memory begins with a table at + * DL_CACHE_START: each table entry contains + * 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 + * space; following this is occupied DL space, + * and after that free space that is yet to + * be used. + * + * location data sizeof + * + * 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 + * ... + * dl_free_ptr empty space + * ... + */ + +#define DL_CACHE_START MAP::RAM_G_SIZE - 0xFFFF +#define DL_FREE_ADDR DL_CACHE_START + DL_CACHE_SLOTS * 12 + +using namespace FTDI; + +// The init function ensures all cache locations are marked as empty + +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, 0); +} + +bool DLCache::has_data() { + return dl_slot_size != 0; +} + +bool DLCache::wait_until_idle() { + const unsigned long startTime = millis(); + do { + if ((millis() - startTime) > 250) { + SERIAL_ECHO_MSG("Timeout on DL_Cache::Wait_Until_Idle()"); + CLCD::CommandFifo::reset(); + return false; + } + #ifdef __MARLIN_FIRMWARE__ + ExtUI::yield(); + #endif + } while (CLCD::CommandFifo::is_processing()); + return true; +} + +/* This caches the current display list in RAMG so + * that it can be appended later. The memory is + * dynamically allocated following DL_FREE_ADDR. + * + * 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 min_bytes /* = 0*/) { + CLCD::CommandFifo cmd; + + // Execute any commands already in the FIFO + cmd.execute(); + if (!wait_until_idle()) + return false; + + // Figure out how long the display list is + const uint32_t dl_size = CLCD::dl_size(); + + if (dl_slot_addr == 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) { + 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 > 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: ", 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_slot_used); + SERIAL_ECHOLNPAIR(" Free space: ", dl_slot_size); + #endif + dl_slot_used = dl_size; + save_slot(); + cmd.memcpy(dl_slot_addr, MAP::RAM_DL, dl_slot_used); + cmd.execute(); + return true; + } +} + +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(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_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_slot_used); + SERIAL_ECHOLNPAIR(" REG_CMD_DL: ", CLCD::mem_read_32(REG::CMD_DL)); + #endif +} + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..da927aea --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/dl_cache.h @@ -0,0 +1,73 @@ +/************** + * dl_cache.h * + **************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/******************* DISPLAY LIST CACHE MANAGEMENT ************************/ +/* The Display List Cache mechanism stores the display list corresponding + * to a menu into RAM_G so that on subsequent calls drawing the menu does + * not require as much SPI traffic. Dynamic content, such as indicators, + * should not be cached. + * + * The DLCache can be used like so: + * + * void some_function() { + * DLCache dlcache(UNIQUE_ID); + * + * if (dlcache.hasData()) { + * dlcache.append(); + * } else { + * // Add stuff to the DL + * dlcache.store(); + * } + */ +class DLCache { + private: + typedef FTDI::ftdi_registers REG; + typedef FTDI::ftdi_memory_map MAP; + + uint8_t dl_slot_indx; + uint32_t dl_slot_addr; + uint16_t dl_slot_size; + uint16_t dl_slot_used; + + 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(); + + public: + static void init(); + + DLCache(uint8_t slot) { + dl_slot_indx = slot; + load_slot(); + } + + bool has_data(); + bool store(uint32_t min_bytes = 0); + void append(); +}; + +#define DL_CACHE_SLOTS 250 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 new file mode 100644 index 00000000..3dd2b88b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.cpp @@ -0,0 +1,228 @@ +/****************** + * event_loop.cpp * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 +using namespace FTDI; + +enum { + UNPRESSED = 0x00 +}; + +tiny_timer_t touch_timer; +UIData::flags_t UIData::flags; +uint8_t pressed_tag = UNPRESSED; + +uint8_t UIData::get_persistent_data_mask() { + // A bit mask for flags that should be stored to the EEPROM. + // Others are considered temporarily values that need not be + // saved. + constexpr flags_t persistent_flags = { + bits: { + touch_start_sound: true, + touch_end_sound: true, + touch_repeat_sound: true, + show_animations: true + } + }; + return persistent_flags.value; +} + +void UIData::reset_persistent_data() { + // Default values for persistent data + constexpr flags_t default_flags = { + bits: { + touch_start_sound: true, + touch_end_sound: true, + touch_repeat_sound: true, + show_animations: true, + touch_debouncing: false, + ignore_unpress: false + } + }; + flags.value = default_flags.value; +} + +uint8_t UIData::get_persistent_data() { + return flags.value & get_persistent_data_mask(); +} + +void UIData::set_persistent_data(uint8_t value) { + flags.value = value & get_persistent_data_mask(); +} + + +void UIData::enable_touch_sounds(bool enabled) { + UIData::flags.bits.touch_start_sound = enabled; + UIData::flags.bits.touch_end_sound = enabled; + UIData::flags.bits.touch_repeat_sound = enabled; +} + +bool UIData::touch_sounds_enabled() { + return UIData::flags.bits.touch_start_sound || UIData::flags.bits.touch_end_sound || UIData::flags.bits.touch_repeat_sound; +} + +void UIData::enable_animations(bool enabled) { + UIData::flags.bits.show_animations = enabled; +} + +bool UIData::animations_enabled() { + return UIData::flags.bits.show_animations; +} + +namespace FTDI { + uint8_t EventLoop::get_pressed_tag() { + return pressed_tag; + } + + bool EventLoop::is_touch_held() { + return pressed_tag != 0; + } + + /** + * process_events(): Process events from the touch panel. + * + * This function consists of a state machine that accomplishes the following: + * + * - Reads the tag register from the touch panel + * - Dispatches onTouchStart and onTouchEnd events to the active screen. + * - Handles auto-repetition by sending onTouchHeld to the active screen periodically. + * - Plays touch feedback "click" sounds when appropriate. + * - Performs debouncing to supress spurious touch events. + */ + void EventLoop::process_events() { + // If the LCD is processing commands, don't check + // for tags since they may be changing and could + // cause spurious events. + if (!touch_timer.elapsed(TOUCH_UPDATE_INTERVAL) || CLCD::CommandFifo::is_processing()) { + return; + } + + const uint8_t tag = CLCD::get_tag(); + + switch (pressed_tag) { + case UNPRESSED: + if (tag != 0) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Touch start: ", tag); + #endif + + pressed_tag = tag; + current_screen.onRefresh(); + + // When the user taps on a button, activate the onTouchStart handler + const uint8_t lastScreen = current_screen.getScreen(); + + if (current_screen.onTouchStart(tag)) { + touch_timer.start(); + if (UIData::flags.bits.touch_start_sound) sound.play(press_sound); + } + + // In the case in which a touch event triggered a new screen to be + // drawn, we don't issue a touchEnd since it would be sent to the + // wrong screen. + UIData::flags.bits.ignore_unpress = (lastScreen != current_screen.getScreen()); + } + else { + touch_timer.start(); + } + break; + default: // PRESSED + if (!UIData::flags.bits.touch_debouncing) { + if (tag == pressed_tag) { + // The user is holding down a button. + if (touch_timer.elapsed(1000 / TOUCH_REPEATS_PER_SECOND)) { + if (current_screen.onTouchHeld(tag)) { + current_screen.onRefresh(); + if (UIData::flags.bits.touch_repeat_sound) sound.play(repeat_sound); + } + touch_timer.start(); + } + } + else if (tag == 0) { + touch_timer.start(); + UIData::flags.bits.touch_debouncing = true; + } + } + + else { + // Debouncing... + + if (tag == pressed_tag) { + // If while debouncing, we detect a press, then cancel debouncing. + UIData::flags.bits.touch_debouncing = false; + } + + else if (touch_timer.elapsed(DEBOUNCE_PERIOD)) { + UIData::flags.bits.touch_debouncing = false; + + if (UIData::flags.bits.ignore_unpress) { + UIData::flags.bits.ignore_unpress = false; + pressed_tag = UNPRESSED; + break; + } + + if (UIData::flags.bits.touch_end_sound) sound.play(unpress_sound); + + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("Touch end: ", pressed_tag); + #endif + + const uint8_t saved_pressed_tag = pressed_tag; + pressed_tag = UNPRESSED; + current_screen.onTouchEnd(saved_pressed_tag); + current_screen.onRefresh(); + } + } + break; + } // switch (pressed_tag) + + } // processEvents() + + void EventLoop::setup() { + CLCD::init(); + DLCache::init(); + UIData::reset_persistent_data(); + current_screen.start(); + } + + void EventLoop::loop() { + sound.onIdle(); + + /** + * Guard against re-entry of UI methods, which can + * crash. Re-entry can happen because some functions + * (e.g. planner.synchronize) call idle(). + */ + if (!UIData::flags.bits.prevent_reentry) { + UIData::flags.bits.prevent_reentry = true; + current_screen.onIdle(); + process_events(); + UIData::flags.bits.prevent_reentry = false; + } + } +} // namespace FTDI + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..d9bede92 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/event_loop.h @@ -0,0 +1,74 @@ +/**************** + * event_loop.h * + ****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#define STATUS_UPDATE_INTERVAL 1000 +#define TOUCH_UPDATE_INTERVAL 50 +#define TOUCH_REPEATS_PER_SECOND 4 +#define DEBOUNCE_PERIOD 150 + +class UIData { + private: + typedef union { + struct { + uint8_t touch_start_sound : 1; + uint8_t touch_end_sound : 1; + uint8_t touch_repeat_sound : 1; + uint8_t show_animations : 1; + uint8_t touch_debouncing : 1; + uint8_t ignore_unpress : 1; + uint8_t prevent_reentry : 1; + } bits; + uint8_t value; + } flags_t; + + public: + static flags_t flags; + + static uint8_t get_persistent_data_mask(); + static uint8_t get_persistent_data(); + static void set_persistent_data(uint8_t value); + static void reset_persistent_data(); + + static void enable_touch_sounds(bool enabled); + static bool touch_sounds_enabled(); + static void enable_animations(bool enabled); + static bool animations_enabled(); +}; + +namespace FTDI { + class EventLoop { + private: + static constexpr FTDI::effect_t press_sound = FTDI::CHACK; + static constexpr FTDI::effect_t repeat_sound = FTDI::CHACK; + static constexpr FTDI::effect_t unpress_sound = FTDI::POP; + static void process_events(); + + public: + static void setup(); + static void loop(); + + static uint8_t get_pressed_tag(); + static bool is_touch_held(); + }; +} 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 new file mode 100644 index 00000000..6e4d0668 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -0,0 +1,51 @@ +/******************* + * ftdi_extended.h * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 201( - 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: . * + ****************************************************************************/ + +#pragma once + +#include "../compat.h" +#include "../basic/ftdi_basic.h" + +#ifndef __MARLIN_FIRMWARE__ + #define FTDI_EXTENDED +#endif + +#ifdef FTDI_EXTENDED + #include "unicode/font_size_t.h" + #include "unicode/unicode.h" + #include "unicode/standard_char_set.h" + #include "unicode/western_char_set.h" + #include "unicode/font_bitmaps.h" + #include "rgb_t.h" + #include "bitmap_info.h" + #include "tiny_timer.h" + #include "grid_layout.h" + #include "dl_cache.h" + #include "event_loop.h" + #include "command_processor.h" + #include "screen_types.h" + #include "sound_player.h" + #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/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h new file mode 100644 index 00000000..e3c3ebb3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -0,0 +1,98 @@ +/***************** + * grid_layout.h * + *****************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/* The grid layout macros allow buttons to be arranged on a grid so + * that their locations become independent of the display size. The + * layout model is similar to that of HTML TABLEs. + * + * These macros are meant to be evaluated into constants at compile + * time, so resolution independence can be as efficient as using + * hard-coded coordinates. + */ + +// Margin defines the margin (in pixels) on each side of a button in +// the layout + +#ifdef TOUCH_UI_800x480 + #define MARGIN_L 5 + #define MARGIN_R 5 + #define MARGIN_T 5 + #define MARGIN_B 5 + #define MARGIN_DEFAULT 5 +#else + #define MARGIN_L 3 + #define MARGIN_R 3 + #define MARGIN_T 3 + #define MARGIN_B 3 + #define MARGIN_DEFAULT 3 +#endif + +// EDGE_R adds some black space on the right edge of the display +// This shifts some of the screens left to visually center them. + +#define EDGE_R 0 + +// GRID_X and GRID_Y computes the positions of the divisions on +// the layout grid. +#define GRID_X(x) ((x)*(FTDI::display_width-EDGE_R)/GRID_COLS) +#define GRID_Y(y) ((y)*FTDI::display_height/GRID_ROWS) + +// BTN_X, BTN_Y, BTN_W and BTN_X returns the top-left and width +// and height of a button, taking into account the button margins. + +#define BTN_X(x) (GRID_X((x)-1) + MARGIN_L) +#define BTN_Y(y) (GRID_Y((y)-1) + MARGIN_T) +#define BTN_W(w) (GRID_X(w) - MARGIN_L - MARGIN_R) +#define BTN_H(h) (GRID_Y(h) - MARGIN_T - MARGIN_B) + +// Abbreviations for common phrases, to allow a button to be +// defined in one line of source. +#define BTN_POS(x,y) BTN_X(x), BTN_Y(y) +#define BTN_SIZE(w,h) BTN_W(w), BTN_H(h) + +// Draw a reference grid for ease of spacing out widgets. +#define DRAW_LAYOUT_GRID \ + { \ + cmd.cmd(LINE_WIDTH(4)); \ + for (int i = 1; i <= GRID_COLS; i++) { \ + cmd.cmd(BEGIN(LINES)); \ + cmd.cmd(VERTEX2F(GRID_X(i) *16, 0 *16)); \ + cmd.cmd(VERTEX2F(GRID_X(i) *16, FTDI::display_height *16)); \ + } \ + for (int i = 1; i < GRID_ROWS; i++) { \ + cmd.cmd(BEGIN(LINES)); \ + cmd.cmd(VERTEX2F(0 *16, GRID_Y(i) *16)); \ + cmd.cmd(VERTEX2F(FTDI::display_width *16, GRID_Y(i) *16)); \ + } \ + cmd.cmd(LINE_WIDTH(16)); \ + } + +namespace FTDI { + #ifdef TOUCH_UI_PORTRAIT + constexpr uint16_t display_width = Vsize; + constexpr uint16_t display_height = Hsize; + #else + constexpr uint16_t display_width = Hsize; + constexpr uint16_t display_height = Vsize; + #endif +} 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 new file mode 100644 index 00000000..7da62132 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/polygon.h @@ -0,0 +1,96 @@ +/************* + * polygon.h * + *************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +/** + * The Polygon class helps drawing filled or stroked polygons on the FTDI EVE: + * + * CommandProcessor cmd; + * cmd.cmd(COLOR_RGB(0x00FF00)); + * + * Polygon p(cmd); + * p.begin_fill(); + * p.begin_loop(); + * p(10,10); + * p(20,10); + * p(20,20); + * p(10,20); + * p.end_loop(); + * p.begin_loop(); + * ... // Additional closed paths + * p.end_loop(); + * ... + * p.end_fill(); + * + * Based on the example from "Applicaton Note AN_334, FT801 Polygon Application": + * + * https://brtchip.com/wp-content/uploads/Support/Documentation/Application_Notes/ICs/EVE/AN_334-FT801_Polygon_Application.pdf + */ + +namespace FTDI { + class Polygon { + private: + FTDI::begin_t path_initiator = FTDI::LINE_STRIP; + + public: + CommandProcessor &cmd; + + Polygon(CommandProcessor &c) : cmd(c) {} + + void begin_fill() { + using namespace FTDI; + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(TAG_MASK(0)); + cmd.cmd(CLEAR(0,1,0)); + cmd.cmd(COLOR_MASK(0,0,0,0)); + cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); + // Drawing the edge strip along scan lines + // seems to yield the best performance + #ifdef TOUCH_UI_PORTRAIT + path_initiator = EDGE_STRIP_B; + #else + path_initiator = EDGE_STRIP_R; + #endif + } + + // Specify a clipping rectangle to paint fewer pixels and reduce rendering time, otherwise all pixels will be painted. + void end_fill(const int16_t x1 = 0, const int16_t y1 = 0, const int16_t x2 = display_width * 16, const int16_t y2 = display_height * 16) { + using namespace FTDI; + cmd.cmd(RESTORE_CONTEXT()); + + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); + cmd.cmd(BEGIN(RECTS)); + cmd.cmd(VERTEX2F(x1, y1)); + cmd.cmd(VERTEX2F(x2, y2)); + cmd.cmd(RESTORE_CONTEXT()); + } + + void begin_stroke() {path_initiator = FTDI::LINE_STRIP;} + void begin_loop() {cmd.cmd(FTDI::BEGIN(path_initiator));} + void end_stroke() {} + void end_loop() {} + + void operator()(const uint16_t x, const uint16_t y) {cmd.cmd(FTDI::VERTEX2F(x, y));} + }; +} 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 new file mode 100644 index 00000000..2b18244e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/rgb_t.h @@ -0,0 +1,84 @@ +/*********** + * rgb_t.h * + ***********/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/** + * Implementation of hsl_to_rgb as constexpr functions based on: + * + * https://www.rapidtables.com/convert/color/hsl-to-rgb.html + */ + +constexpr float _hsl_fmod(float x, float y) { + return x - int(x/y)*y; +} + +constexpr float _hsl_c(float, float S, float L) { + return (1.0f - fabs(2*L-1.0f)) * S; +} + +constexpr float _hsl_x(float H, float S, float L) { + return _hsl_c(H,S,L) * (1.0f - fabs(_hsl_fmod(H/60, 2) - 1)); +} + +constexpr float _hsl_m(float H, float S, float L) { + return L - _hsl_c(H,S,L)/2; +} + +constexpr float _hsl_rgb(float H, float S, float L, float r, float g, float b) { + return ((uint32_t((r + _hsl_m(H,S,L))*255+0.5) << 16) | + (uint32_t((g + _hsl_m(H,S,L))*255+0.5) << 8) | + (uint32_t((b + _hsl_m(H,S,L))*255+0.5) << 0)); +} + +constexpr uint32_t hsl_to_rgb(float H, float S, float L) { + return (H < 60) ? _hsl_rgb(H,S,L,_hsl_c(H,S,L), _hsl_x(H,S,L), 0) : + (H < 120) ? _hsl_rgb(H,S,L,_hsl_x(H,S,L), _hsl_c(H,S,L), 0) : + (H < 180) ? _hsl_rgb(H,S,L, 0, _hsl_c(H,S,L), _hsl_x(H,S,L)) : + (H < 240) ? _hsl_rgb(H,S,L, 0, _hsl_x(H,S,L), _hsl_c(H,S,L)) : + (H < 300) ? _hsl_rgb(H,S,L,_hsl_x(H,S,L), 0, _hsl_c(H,S,L)) : + _hsl_rgb(H,S,L,_hsl_c(H,S,L), 0, _hsl_x(H,S,L)); +} + +/** + * Structure for RGB colors + */ +struct rgb_t { + union { + struct { + uint8_t b,g,r,a; + }; + uint32_t packed; + }; + + rgb_t() : packed(0) {} + rgb_t(uint32_t rgb) : packed(rgb) {} + rgb_t(uint8_t r, uint8_t g, uint8_t b) : b(b), g(g), r(r), a(0) {} + operator uint32_t() const {return packed;}; + + static void lerp(float t, const rgb_t a, const rgb_t b, rgb_t &c) { + c.r = a.r + t * (b.r - a.r); + c.g = a.g + t * (b.g - a.g); + c.b = a.b + t * (b.b - a.b); + } + + uint8_t luminance() const {return 0.299*r + 0.587*g + 0.114*b;} +}; 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 new file mode 100644 index 00000000..57a9e3e8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.cpp @@ -0,0 +1,105 @@ +/****************** + * screen_types.h * + ******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 + +/********************** VIRTUAL DISPATCH DATA TYPE ******************************/ + +uint8_t ScreenRef::lookupScreen(onRedraw_func_t onRedraw_ptr) { + for (uint8_t type = 0; type < functionTableSize; type++) { + if (GET_METHOD(type, onRedraw) == onRedraw_ptr) { + return type; + } + } + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR("Screen not found: ", (uintptr_t) onRedraw_ptr); + #endif + return 0xFF; +} + +void ScreenRef::setScreen(onRedraw_func_t onRedraw_ptr) { + uint8_t type = lookupScreen(onRedraw_ptr); + if (type != 0xFF) { + setType(type); + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("New screen: ", type); + #endif + } +} + +void ScreenRef::initializeAll() { + for (uint8_t type = 0; type < functionTableSize; type++) + GET_METHOD(type, onStartup)(); +} + +/********************** SCREEN STACK ******************************/ + +void ScreenStack::start() { + initializeAll(); + onEntry(); +} + +void ScreenStack::push(onRedraw_func_t onRedraw_ptr) { + stack[3] = stack[2]; + stack[2] = stack[1]; + stack[1] = stack[0]; + stack[0] = lookupScreen(onRedraw_ptr); +} + +void ScreenStack::push() { + stack[3] = stack[2]; + stack[2] = stack[1]; + stack[1] = stack[0]; + stack[0] = getType(); +} + +void ScreenStack::pop() { + setType(stack[0]); + forget(); +} + +void ScreenStack::forget() { + stack[0] = stack[1]; + stack[1] = stack[2]; + stack[2] = stack[3]; + stack[3] = 0; +} + +void ScreenStack::goTo(onRedraw_func_t s) { + push(); + onExit(); + setScreen(s); + onEntry(); +} + +void ScreenStack::goBack() { + onExit(); + pop(); + onEntry(); +} + +ScreenStack current_screen; + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..d1f84c8a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/screen_types.h @@ -0,0 +1,241 @@ +/******************** + * screen_types.cpp * + ********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +typedef enum { + BACKGROUND = 1, + FOREGROUND = 2, + BOTH = 3 +} draw_mode_t; + + /********************** VIRTUAL DISPATCH DATA TYPE ******************************/ + +// True virtual classes are extremely expensive on the Arduino +// as the compiler stores the virtual function tables in RAM. +// We invent a data type called ScreenRef that gives us +// polymorphism by mapping an ID to virtual methods on various +// classes. This works by keeping a table in PROGMEM of pointers +// to static methods. + +#define DECL_SCREEN(className) { \ + className::onStartup, \ + className::onEntry, \ + className::onExit, \ + className::onIdle, \ + className::onRefresh, \ + className::onRedraw, \ + className::onTouchStart, \ + className::onTouchHeld, \ + className::onTouchEnd \ +} + +#define GET_METHOD(type, method) reinterpret_cast(pgm_read_ptr_far(&functionTable[type].method##_ptr)) +#define SCREEN_TABLE PROGMEM const ScreenRef::table_t ScreenRef::functionTable[] = +#define SCREEN_TABLE_POST const uint8_t ScreenRef::functionTableSize = sizeof(ScreenRef::functionTable)/sizeof(ScreenRef::functionTable[0]); + +class ScreenRef { + protected: + typedef void onStartup_func_t(); + typedef void onEntry_func_t(); + typedef void onExit_func_t(); + typedef void onIdle_func_t(); + typedef void onRefresh_func_t(); + typedef void onRedraw_func_t(draw_mode_t); + typedef bool onTouchStart_func_t(uint8_t); + typedef bool onTouchHeld_func_t(uint8_t); + typedef bool onTouchEnd_func_t(uint8_t); + + private: + typedef struct { + onStartup_func_t *onStartup_ptr; + onEntry_func_t *onEntry_ptr; + onExit_func_t *onExit_ptr; + onIdle_func_t *onIdle_ptr; + onRefresh_func_t *onRefresh_ptr; + onRedraw_func_t *onRedraw_ptr; + onTouchStart_func_t *onTouchStart_ptr; + onTouchHeld_func_t *onTouchHeld_ptr; + onTouchEnd_func_t *onTouchEnd_ptr; + } table_t; + + uint8_t type = 0; + static PROGMEM const table_t functionTable[]; + static const uint8_t functionTableSize; + + public: + uint8_t getType() {return type;} + + void setType(uint8_t t) { + type = t; + } + + uint8_t lookupScreen(onRedraw_func_t onRedraw_ptr); + + void setScreen(onRedraw_func_t onRedraw_ptr); + + void onStartup() {GET_METHOD(type, onStartup)();} + void onEntry() {GET_METHOD(type, onEntry)();} + void onExit() {GET_METHOD(type, onExit)();} + void onIdle() {GET_METHOD(type, onIdle)();} + void onRefresh() {GET_METHOD(type, onRefresh)();} + void onRedraw(draw_mode_t dm) {GET_METHOD(type, onRedraw)(dm);} + bool onTouchStart(uint8_t tag) {return GET_METHOD(type, onTouchStart)(tag);} + bool onTouchHeld(uint8_t tag) {return GET_METHOD(type, onTouchHeld)(tag);} + bool onTouchEnd(uint8_t tag) {return GET_METHOD(type, onTouchEnd)(tag);} + + void initializeAll(); +}; + +/********************** SCREEN STACK ******************************/ + +// To conserve dynamic memory, the screen stack is hard-coded to +// have four values, allowing a menu of up to four levels. + +class ScreenStack : public ScreenRef { + private: + uint8_t stack[4]; + + public: + void start(); + void push(onRedraw_func_t); + void push(); + void pop(); + void forget(); + void goTo(onRedraw_func_t); + void goBack(); + + uint8_t peek() {return stack[0];} + uint8_t getScreen() {return getType();} +}; + +extern ScreenStack current_screen; + +/********************** BASE SCREEN CLASS ******************************/ + +/* UIScreen is the base class for all user interface screens. + */ +class UIScreen { + public: + static void onStartup() {} + static void onEntry() {current_screen.onRefresh();} + static void onExit() {} + static void onIdle() {} + static bool onTouchStart(uint8_t) {return true;} + static bool onTouchHeld(uint8_t) {return false;} + 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 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)) + +/************************** CACHED VS UNCHACHED SCREENS ***************************/ + +class UncachedScreen { + public: + static void onRefresh() { + using namespace FTDI; + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART); + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif + + current_screen.onRedraw(BOTH); + + cmd.cmd(DL::DL_DISPLAY); + cmd.cmd(CMD_SWAP); + cmd.execute(); + } +}; + +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; + } + + static void repaintBackground() { + using namespace FTDI; + DLCache dlcache(DL_SLOT); + CommandProcessor cmd; + + cmd.cmd(CMD_DLSTART); + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif + current_screen.onRedraw(BACKGROUND); + + dlcache.store(DL_SIZE); + } + + public: + static void onRefresh() { + #if ENABLED(TOUCH_UI_DEBUG) + const uint32_t start_time = millis(); + #endif + using namespace FTDI; + DLCache dlcache(DL_SLOT); + CommandProcessor cmd; + + cmd.cmd(CMD_DLSTART); + + if (dlcache.has_data()) { + dlcache.append(); + } + else { + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); + #endif + current_screen.onRedraw(BACKGROUND); + dlcache.store(DL_SIZE); + } + + current_screen.onRedraw(FOREGROUND); + + cmd.cmd(DL::DL_DISPLAY); + cmd.cmd(CMD_SWAP); + cmd.execute(); + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHOLNPAIR("Time to draw screen (ms): ", millis() - start_time); + #endif + } +}; 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 new file mode 100644 index 00000000..fbdfe2fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h @@ -0,0 +1,38 @@ +/**************** + * sound_list.h * + ****************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +class SoundList { + private: + static PROGMEM const struct list_t { + const char *const PROGMEM name; + const FTDI::SoundPlayer::sound_t* data; + } list[]; + public: + static const uint8_t n; + static inline const char* name(uint8_t val) { + return (const char* ) pgm_read_ptr_far(&list[val].name); + } + static inline FTDI::SoundPlayer::sound_t* data(uint8_t val) { + return (FTDI::SoundPlayer::sound_t*) pgm_read_ptr_far(&list[val].data); + } +}; 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 new file mode 100644 index 00000000..6a5b6e3c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -0,0 +1,112 @@ +/******************** + * sound_player.cpp * + ********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 { + SoundPlayer sound; // Global sound player object + + void SoundPlayer::set_volume(uint8_t vol) { + CLCD::mem_write_8(REG::VOL_SOUND, vol); + } + + uint8_t SoundPlayer::get_volume() { + return CLCD::mem_read_8(REG::VOL_SOUND); + } + + void SoundPlayer::play(effect_t effect, note_t note) { + + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR ("Playing note ", int(note)); + SERIAL_ECHOLNPAIR(", instrument ", int(effect)); + #endif + + // Play the note + CLCD::mem_write_16(REG::SOUND, (note == REST) ? 0 : (((note ? note : NOTE_C4) << 8) | effect)); + CLCD::mem_write_8(REG::PLAY, 1); + } + + note_t SoundPlayer::frequency_to_midi_note(const uint16_t frequency_hz) { + const float f0 = 440; + return note_t(NOTE_A4 + (log(frequency_hz)-log(f0))*12/log(2) + 0.5); + } + + // Plays a tone of a given frequency and duration. Since the FTDI FT810 only + // supports MIDI notes, we round down to the nearest note. + + void SoundPlayer::play_tone(const uint16_t frequency_hz, const uint16_t duration_ms) { + play(ORGAN, frequency_to_midi_note(frequency_hz)); + + // Schedule silence to squelch the note after the duration expires. + sequence = silence; + wait = duration_ms; + timer.start(); + } + + void SoundPlayer::play(const sound_t* seq, play_mode_t mode) { + sequence = seq; + wait = 250; // Adding this delay causes the note to not be clipped, not sure why. + timer.start(); + + if (mode == PLAY_ASYNCHRONOUS) return; + + // If playing synchronously, then play all the notes here + + while (has_more_notes()) { + onIdle(); + #ifdef EXTENSIBLE_UI + ExtUI::yield(); + #endif + } + } + + bool SoundPlayer::is_sound_playing() { + return CLCD::mem_read_8( REG::PLAY ) & 0x1; + } + + void SoundPlayer::onIdle() { + if (!sequence) return; + + const bool ready_for_next_note = (wait == 0) ? !is_sound_playing() : timer.elapsed(wait); + + if (ready_for_next_note) { + const effect_t fx = effect_t(pgm_read_byte(&sequence->effect)); + const note_t nt = note_t(pgm_read_byte(&sequence->note)); + const uint32_t ms = uint32_t(pgm_read_byte(&sequence->sixteenths)) * 1000 / 16; + + if (ms == 0 && fx == SILENCE && nt == END_SONG) { + sequence = 0; + play(SILENCE, REST); + } + else { + wait = ms; + timer.start(); + play(fx, nt); + sequence++; + } + } + } +} // namespace FTDI + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..e2650b10 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h @@ -0,0 +1,70 @@ +/****************** + * sound_player.h * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +namespace FTDI { + typedef enum { + PLAY_ASYNCHRONOUS, + PLAY_SYNCHRONOUS + } play_mode_t; + + class SoundPlayer { + typedef FTDI::ftdi_registers REG; + typedef FTDI::ftdi_memory_map MAP; + + public: + struct sound_t { + effect_t effect; // The sound effect number + note_t note; // The MIDI note value + uint16_t sixteenths; // Duration of note, in sixteeths of a second, or zero to play to completion + }; + + const uint8_t WAIT = 0; + + private: + const sound_t *sequence; + tiny_timer_t timer; + tiny_time_t wait; + + note_t frequency_to_midi_note(const uint16_t frequency); + + public: + static void set_volume(uint8_t volume); + static uint8_t get_volume(); + + static void play(effect_t effect, note_t note = NOTE_C4); + static bool is_sound_playing(); + + void play(const sound_t* seq, play_mode_t mode = PLAY_SYNCHRONOUS); + void play_tone(const uint16_t frequency_hz, const uint16_t duration_ms); + bool has_more_notes() {return sequence != 0;}; + + void onIdle(); + }; + + extern SoundPlayer sound; + + const PROGMEM SoundPlayer::sound_t silence[] = { + {SILENCE, END_SONG, 0} + }; +} 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 new file mode 100644 index 00000000..3616f15a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.cpp @@ -0,0 +1,129 @@ +/**************** + * text_box.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 { + /** + * Given a str, end will be set to the position at which a line needs to + * be broken so that the display width is less than w. The line will also + * be broken after a '\n'. Returns the display width of the line. + */ + static uint16_t find_line_break(const FontMetrics &fm, uint16_t w, const char *str, const char *&end) { + w -= fm.get_char_width(' '); + const char *p = str; + end = str; + uint16_t lw = 0, result = 0; + for (;;) { + utf8_char_t c = get_utf8_char_and_inc(p); + if (c == ' ' || c == '\n' || c == '\0') { + if (lw < w || end == str) { + end = (c == '\0') ? p-1 : p; + result = lw; + } + if (c == '\0' || c == '\n') break; + } + lw += fm.get_char_width(c); + } + if (end == str) { + end = p-1; + result = lw; + } + return result; + } + + /** + * This function returns a measurements of the word-wrapped text box. + */ + static void measure_text_box(const FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) { + const char *line_start = (const char*)str; + const char *line_end; + const uint16_t wrap_width = width; + width = height = 0; + for (;;) { + uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end); + if (line_end == line_start) break; + width = max(width, line_width); + height += fm.get_height(); + line_start = line_end; + } + } + + /** + * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. + */ + void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) { + uint16_t box_width, box_height; + + FontMetrics fm(font); + + // Shrink the font until we find a font that fits + for (;;) { + box_width = w; + measure_text_box(fm, str, box_width, box_height); + if (box_width <= (uint16_t)w && box_height <= (uint16_t)h) break; + fm.load(--font); + if (font == 26) break; + } + + const uint16_t dx = (options & OPT_RIGHTX) ? w : (options & OPT_CENTERX) ? w/2 : 0; + const uint16_t dy = (options & OPT_CENTERY) ? (h - box_height)/2 : 0; + + const char *line_start = str; + const char *line_end; + for (;;) { + find_line_break(fm, w, line_start, line_end); + if (line_end == line_start) break; + + const size_t line_len = line_end - line_start; + if (line_len) { + char line[line_len + 1]; + strncpy(line, line_start, line_len); + line[line_len] = 0; + if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ') + line[line_len - 1] = 0; + + #ifdef TOUCH_UI_USE_UTF8 + if (has_utf8_chars(line)) { + draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY); + } else + #endif + { + cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY); + cmd.CLCD::CommandFifo::str(line); + } + } + y += fm.get_height(); + + line_start = line_end; + } + } + + void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, progmem_str pstr, uint16_t options, uint8_t font) { + char str[strlen_P((const char*)pstr) + 1]; + strcpy_P(str, (const char*)pstr); + draw_text_box(cmd, x, y, w, h, (const char*) str, options, font); + } +} // namespace FTDI + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..26199514 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_box.h @@ -0,0 +1,30 @@ +/************** + * text_box.h * + **************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +/** + * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. + */ +namespace FTDI { + void draw_text_box(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_box(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/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 00000000..b2f62f06 --- /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 int16_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. + int16_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 00000000..7852b7ec --- /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/ftdi_eve_lib/extended/tiny_timer.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp new file mode 100644 index 00000000..58ec96ac --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.cpp @@ -0,0 +1,51 @@ +/****************** + * tiny_timer.cpp * + ******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 + +bool tiny_timer_t::elapsed(tiny_time_t duration) { + uint8_t now = tiny_time_t::tiny_time( + #ifdef __MARLIN_FIRMWARE__ + ExtUI::safe_millis() + #else + millis() + #endif + ); + uint8_t elapsed = now - _start; + if (elapsed >= duration._duration) { + return true; + } else { + return false; + } +} + +void tiny_timer_t::start() { + _start = tiny_time_t::tiny_time( + #ifdef __MARLIN_FIRMWARE__ + ExtUI::safe_millis() + #else + millis() + #endif + ); +} +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..700da7bc --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/tiny_timer.h @@ -0,0 +1,56 @@ +/**************** + * tiny_timer.h * + ****************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/* Helpful Reference: + * + * https://arduino.stackexchange.com/questions/12587/how-can-i-handle-the-millis-rollover + */ + +/* tiny_interval_t downsamples a 32-bit millis() value + into a 8-bit value which can record periods of + a few seconds with a rougly 1/16th of second + resolution. This allows us to measure small + intervals without needing to use four-byte counters. + */ +class tiny_time_t { + private: + friend class tiny_timer_t; + uint8_t _duration; + + static uint8_t tiny_time(uint32_t ms) {return ceil(float(ms) / 64);}; + + public: + tiny_time_t() : _duration(0) {} + tiny_time_t(uint32_t ms) : _duration(tiny_time(ms)) {} + tiny_time_t & operator= (uint32_t ms) {_duration = tiny_time(ms); return *this;} + bool operator == (uint32_t ms) {return _duration == tiny_time(ms);} +}; + +class tiny_timer_t { + private: + uint8_t _start; + + public: + void start(); + bool elapsed(tiny_time_t interval); +}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/README.txt b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/README.txt new file mode 100644 index 00000000..818bf08c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/README.txt @@ -0,0 +1,40 @@ + +FTDI EVE Unicode Rendering +-------------------------- + +The FTDI EVE chips have several fonts in ROM, but these fonts only contain a +subset of ASCII characters. Notably, this excludes diacritics and accents +used in most Western languages. + +While the FTDI EVE has the capability for user-defined fonts, such fonts only +support 127 character positions, making them as limiting as the built-in fonts. + +As a further complication, high resolution TFT displays require high resolution +fonts. It is not feasible to put a complete international font into the limited +flash memory of most microprocessors. + +To work around these limitations, this library uses a custom font renderer with +the following characteristics: + + 1) Rather than providing bitmaps for different font sizes, it uses a single + bitmap for the largest font size (romfont 31) and emulates other sizes by + scaling the bitmaps using BITMAP_TRANSFORM. + + 2) Rather than loading an entire font, it combines symbols from romfont 31 + with a limited number of symbols from a custom font. For accented letters, + the rendering code combine basic letter shapes from romfont 31 with + bitmaps containing only the accent themselves. + + 3) The custom bitmap is RLE compressed into PROGMEM. For accents, which have + a fairly small number of non-white pixels, the savings are significant. + +These characteristics enable an alphabet for Western languages to be +synthesized from only a few dozen custom symbols and modest PROGMEM use (~10k) + +The text layout is done by the code in "unicode.cpp" with the help of one of +more character renderers (e.g. "western_char_set.cpp"). Each character render +is responsible for loading the necessary bitmap data into RAMG and drawing +characters as requested. + +To add symbols for other languages, it will only be necessary to make a bitmap +and implement a corresponding character renderer. 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 new file mode 100644 index 00000000..c5126721 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.cpp @@ -0,0 +1,56 @@ +/******************* + * font_bitmap.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 { + + void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) { + for (; n >= 2; n -= 2) { + uint8_t count = pgm_read_byte(data++); + uint8_t value = pgm_read_byte(data++); + while (count--) CLCD::mem_write_8(addr++, value); + } + } + + void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) { + cmd.cmd(BITMAP_HANDLE(handle)); + cmd.cmd(BITMAP_SOURCE(fm.ptr)); + cmd.bitmap_layout(fm.format, fm.stride, fm.height); + cmd.bitmap_size(BILINEAR, BORDER, BORDER, fm.width, fm.height); + } + + void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell) { + if (x < 0 || y < 0 || x > 511 || y > 511) { + cmd.cmd(BITMAP_HANDLE(handle)); + cmd.cmd(CELL(cell)); + cmd.cmd(VERTEX2F(x * 16, y * 16)); + } + else { + cmd.cmd(VERTEX2II(x, y, handle, cell)); + } + } + +} // namespace FTDI + +#endif // FTDI_EXTENDED 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 new file mode 100644 index 00000000..f1e22e17 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps.h @@ -0,0 +1,30 @@ +/****************** + * font_bitmaps.h * + ******************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +class CommandProcessor; + +namespace FTDI { + void write_rle_data(uint16_t addr, const uint8_t *data, size_t n); + void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle); + void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm new file mode 100644 index 00000000..39cb6703 Binary files /dev/null and b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/romfont_31.pbm differ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png new file mode 100644 index 00000000..ef681923 Binary files /dev/null and b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.png differ diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg new file mode 100644 index 00000000..f803126c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_bitmaps/western_char_set_bitmap_31.svg @@ -0,0 +1,443 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + ̀ ́ ̂ ̃ ̈ ̊ ̧ıßØøÆæÐðÞþ«»¡¿¢£¤¥¹²³ºª©®±×÷¼½¾µ¦§¬ + + + + + + + + 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 new file mode 100644 index 00000000..733cf8f6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp @@ -0,0 +1,46 @@ +/******************* + * font_size_t.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" + +#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) + +namespace FTDI { + // Returns the height of a standard FTDI romfont + uint8_t font_size_t::get_romfont_height(uint8_t font) { + static const uint8_t tbl[] PROGMEM = { + 8, 8, 16, 16, 13, 17, 20, 22, 29, 38, 16, 20, 25, 28, 36, 49, 63, 83, 108 + }; + return pgm_read_byte(&tbl[font - 16]); + } + + // Sets the scaling coefficient to match a romfont size + font_size_t font_size_t::from_romfont(uint8_t font) { + return font_size_t(uint32_t(std_height) * 256 / get_romfont_height(font)); + } + + // Returns the height of the font + uint8_t font_size_t::get_height() const { + return scale(std_height); + } +} + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 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 new file mode 100644 index 00000000..f5bf644e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.h @@ -0,0 +1,55 @@ +/***************** + * font_size_t.h * + *****************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +class CommandProcessor; + +namespace FTDI { + + /* The unicode rendering of different font sizes happens by scaling a + * large-sized font bitmap using the FTDI bitmap transformation matrix. + * This keeps us from having to have load bitmaps for all font sizes. + * + * The font_size_t class helps manage this scaling factor. + */ + class font_size_t { + private: + // Standard height for font bitmaps + static constexpr uint8_t std_height = 49; + + // 8.8 fixed point scaling coefficient + uint16_t coefficient; + + font_size_t(uint16_t v) : coefficient(v) {} + public: + font_size_t() : coefficient(256) {} + + static uint8_t get_romfont_height(uint8_t font); + + static font_size_t from_romfont(uint8_t size); + + template T scale(T val) const {return (int32_t(val) * 256 / coefficient);} + + uint8_t get_height() const; + uint16_t get_coefficient() const {return coefficient;} + }; +} 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 new file mode 100644 index 00000000..b50c12fc --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp @@ -0,0 +1,106 @@ +/************************* + * standard_char_set.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" + +#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) + + constexpr static uint8_t std_font = 31; + + /* Lookup table of the char widths for standard ROMFONT 31 */ + + uint8_t FTDI::StandardCharSet::std_char_width(char c) { + static const uint8_t tbl[] PROGMEM = { + 10, 11, 15, 26, 25, 31, 26, 10, 15, 14, 18, 24, 9, 18, 11, 17, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 10, 10, 21, 23, 22, 20, 37, 27, 27, 26, + 28, 23, 22, 28, 29, 12, 23, 26, 22, 35, 29, 28, 26, 29, 27, 26, 26, 28, + 27, 36, 27, 26, 25, 12, 18, 12, 18, 21, 13, 23, 24, 22, 24, 22, 15, 24, + 24, 10, 11, 22, 10, 36, 24, 24, 24, 24, 15, 22, 14, 24, 21, 32, 21, 21, + 22, 15, 10, 15, 29, 10 + }; + return pgm_read_byte(&tbl[c - ' ']); + } + + /** + * Load bitmap data into RAMG. This function is called once at the start + * of the program. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + */ + + void FTDI::StandardCharSet::load_data(uint32_t) { + } + + /** + * Populates the bitmap handles for the custom into the display list. + * This function is called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::StandardCharSet::load_bitmaps(CommandProcessor& cmd) { + CLCD::FontMetrics std_fm(std_font); + set_font_bitmap(cmd, std_fm, std_font); + } + + /** + * Renders a character at location x and y. The x position is incremented + * by the width of the character. + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the character. On output, + * incremented to the location of the next character. + * + * fs - A scaling object used to scale the font. The display will + * already be configured to scale bitmaps, but positions + * must be scaled using fs.scale() + * + * c - The unicode code point to draw. If the renderer does not + * support the character, it should draw nothing. + */ + + bool FTDI::StandardCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { + uint8_t which = (c >= ' ' && c < 128) ? c : '?'; + uint8_t width = std_char_width(which); + + if (c == '\t') { + // Special handling for the tab character + which = ' '; + width = std_char_width(' '); + } + + // Draw the character + if (cmd) ext_vertex2ii(*cmd, x, y, std_font, which); + + // Increment X to the next character position + x += fs.scale(width); + return true; + } + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 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 new file mode 100644 index 00000000..7decdfd3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.h @@ -0,0 +1,30 @@ +/*********************** + * standard_char_set.h * + ***********************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +namespace FTDI { + class StandardCharSet { + public: + static uint8_t std_char_width(char); + static void load_data(uint32_t addr); + static void load_bitmaps(CommandProcessor&); + static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); + }; +} 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 new file mode 100644 index 00000000..09473c1c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -0,0 +1,219 @@ +/*************** + * unicode.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" + +#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) + + using namespace FTDI; + + /** + * Return true if a string has UTF8 characters + * + * Parameters: + * + * c - Pointer to a string. + * + * Returns: True if the strings has UTF8 characters + */ + + bool FTDI::has_utf8_chars(const char *str) { + for (;;) { + const char c = *str++; + if (!c) break; + if ((c & 0xC0) == 0x80) return true; + } + return false; + } + + bool FTDI::has_utf8_chars(progmem_str _str) { + const char *str = (const char *) _str; + for (;;) { + const char c = pgm_read_byte(str++); + if (!c) break; + if ((c & 0xC0) == 0x80) return true; + } + return false; + } + + /** + * Return a character in a UTF8 string and increment the + * pointer to the next character + * + * Parameters: + * + * c - Pointer to a UTF8 encoded string. + * + * Returns: The packed bytes of a UTF8 encoding of a single + * character (this is not the unicode codepoint) + */ + + utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) { + utf8_char_t val = *(uint8_t*)c++; + while ((*c & 0xC0) == 0x80) + val = (val << 8) | *(uint8_t*)c++; + return val; + } + + /** + * Helper function to draw and/or measure a UTF8 string + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the string. + * + * str - The UTF8 string to draw or measure. + * + * fs - A scaling object used to specify the font size. + */ + + static uint16_t render_utf8_text(CommandProcessor* cmd, int x, int y, const char *str, font_size_t fs) { + const int start_x = x; + while (*str) { + const utf8_char_t c = get_utf8_char_and_inc(str); + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::render_glyph(cmd, x, y, fs, c) || + #endif + StandardCharSet::render_glyph(cmd, x, y, fs, c); + } + return x - start_x; + } + + /** + * Load the font bitmap data into RAMG. Called once at program start. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + */ + + void FTDI::load_utf8_data(uint16_t addr) { + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::load_data(addr); + #endif + StandardCharSet::load_data(addr); + } + + /** + * Populate the bitmap handles for the custom fonts into the display list. + * Called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) { + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::load_bitmaps(cmd); + #endif + StandardCharSet::load_bitmaps(cmd); + } + + /** + * Measure a UTF8 text character + * + * Parameters: + * + * c - The unicode code point to measure. + * + * fs - A scaling object used to specify the font size. + * + * Returns: A width in pixels + */ + + uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) { + int x = 0, y = 0; + #ifdef TOUCH_UI_UTF8_WESTERN_CHARSET + WesternCharSet::render_glyph(NULL, x, y, fs, c) || + #endif + StandardCharSet::render_glyph(NULL, x, y, fs, c); + return x; + } + + /** + * Measure a UTF8 text string + * + * Parameters: + * + * str - The UTF8 string to measure. + * + * fs - A scaling object used to specify the font size. + * + * Returns: A width in pixels + */ + + uint16_t FTDI::get_utf8_text_width(const char *str, font_size_t fs) { + return render_utf8_text(NULL, 0, 0, str, fs); + } + + uint16_t FTDI::get_utf8_text_width(progmem_str pstr, font_size_t fs) { + char str[strlen_P((const char*)pstr) + 1]; + strcpy_P(str, (const char*)pstr); + return get_utf8_text_width(str, fs); + } + + /** + * Draw a UTF8 text string + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + * + * x, y - The location at which to draw the string. + * + * str - The UTF8 string to draw. + * + * fs - A scaling object used to specify the font size. + * + * options - Text alignment options (i.e. OPT_CENTERX, OPT_CENTERY, OPT_CENTER or OPT_RIGHTX) + * + */ + + void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, const char *str, font_size_t fs, uint16_t options) { + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(BITMAP_TRANSFORM_A(fs.get_coefficient())); + cmd.cmd(BITMAP_TRANSFORM_E(fs.get_coefficient())); + cmd.cmd(BEGIN(BITMAPS)); + + // Apply alignment options + if (options & OPT_CENTERX) + x -= get_utf8_text_width(str, fs) / 2; + else if (options & OPT_RIGHTX) + x -= get_utf8_text_width(str, fs); + if (options & OPT_CENTERY) + y -= fs.get_height()/2; + + // Render the text + render_utf8_text(&cmd, x, y, str, fs); + cmd.cmd(RESTORE_CONTEXT()); + } + + void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, progmem_str pstr, font_size_t fs, uint16_t options) { + char str[strlen_P((const char*)pstr) + 1]; + strcpy_P(str, (const char*)pstr); + draw_utf8_text(cmd, x, y, (const char*) str, fs, options); + } + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 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 new file mode 100644 index 00000000..16f7e197 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h @@ -0,0 +1,111 @@ +/************* + * unicode.h * + *************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +class CommandProcessor; + +namespace FTDI { + #ifdef TOUCH_UI_USE_UTF8 + typedef uint16_t utf8_char_t; + + /** + * Converts a 32-bit codepoint into UTF-8. This compile-time function + * will be useful until the u8'a' character literal becomes more common. + */ + constexpr uint32_t utf8(const uint32_t c) { + return (c < 0x7F ) ? c : + (c < 0x7FF) ? (0x0000C080 | ((c & 0b011111000000) << 2) | (c & 0b111111)) : + (c < 0xFFFF) ? (0x00E08080 | ((c & 0b001111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)) : + (0xF0808080 | ((c & 0b000111000000000000000000) << 6) | ((c & 0b111111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)); + } + + /* Returns true if the string has UTF8 string characters */ + + bool has_utf8_chars(progmem_str str); + bool has_utf8_chars(const char *str); + + /* Returns the next character in a UTF8 string and increments the + * pointer to the next character */ + + utf8_char_t get_utf8_char_and_inc(const char *&c); + + /* Returns the next character in a UTF8 string, without incrementing */ + + inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);} + + void load_utf8_data(uint16_t addr); + #else + typedef char utf8_char_t; + + inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;} + inline utf8_char_t get_utf8_char(const char *c) {return *c;} + + inline void load_utf8_data(uint16_t) {} + #endif + + void load_utf8_bitmaps(CommandProcessor& cmd); + + uint16_t get_utf8_char_width(utf8_char_t, font_size_t); + uint16_t get_utf8_text_width(progmem_str, font_size_t); + uint16_t get_utf8_text_width(const char *, font_size_t); + + void draw_utf8_text(CommandProcessor&, int x, int y, progmem_str, font_size_t, uint16_t options = 0); + void draw_utf8_text(CommandProcessor&, int x, int y, const char *, font_size_t, uint16_t options = 0); + + // Similar to CLCD::FontMetrics, but can be used with UTF8 encoded strings. + + struct FontMetrics { + #ifdef TOUCH_UI_USE_UTF8 + font_size_t fs; + #else + CLCD::FontMetrics fm; + #endif + + inline void load(uint8_t rom_font_size) { + #ifdef TOUCH_UI_USE_UTF8 + fs = font_size_t::from_romfont(rom_font_size); + #else + fm.load(rom_font_size); + #endif + } + + inline uint16_t get_char_width(utf8_char_t c) const { + #ifdef TOUCH_UI_USE_UTF8 + return get_utf8_char_width(c, fs); + #else + return fm.char_widths[(uint8_t)c]; + #endif + } + + inline uint8_t get_height() const { + #ifdef TOUCH_UI_USE_UTF8 + return fs.get_height(); + #else + return fm.height; + #endif + } + + inline FontMetrics(uint8_t rom_font_size) { + load(rom_font_size); + } + }; +} 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 new file mode 100644 index 00000000..4aa2580c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -0,0 +1,450 @@ +/************************ + * western_char_set.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" + +#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8, TOUCH_UI_UTF8_WESTERN_CHARSET) + + #include "western_char_set_bitmap_31.h" + + #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) + + using namespace FTDI; + + constexpr static uint8_t std_font = 31; + constexpr static uint8_t alt_font = 1; + + static uint32_t bitmap_addr; + + /* Glyphs in the WesternCharSet bitmap */ + + enum { + GRAVE, + ACUTE, + CIRCUMFLEX, + TILDE, + DIAERESIS, + DOT_ABOVE, + CEDILLA, + NO_DOT_I, + #if ENABLED(TOUCH_UI_UTF8_GERMANIC) + SHARP_S, + #endif + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + LRG_O_STROKE, + SML_O_STROKE, + LRG_AE, + SML_AE, + LRG_ETH, + SML_ETH, + LRG_THORN, + SML_THORN, + #endif + #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) + LEFT_DBL_QUOTE, + RIGHT_DBL_QUOTE, + INV_EXCLAMATION, + INV_QUESTION, + #endif + #if ENABLED(TOUCH_UI_UTF8_CURRENCY) + CENT_SIGN, + POUND_SIGN, + CURRENCY_SIGN, + YEN_SIGN, + #endif + #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) + SUPERSCRIPT_ONE, + SUPERSCRIPT_TWO, + SUPERSCRIPT_THREE, + #endif + #if ENABLED(TOUCH_UI_UTF8_ORDINALS) + MASCULINE_ORDINAL, + FEMININE_ORDINAL, + #endif + #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) + COPYRIGHT_SIGN, + REGISTERED_SIGN, + #endif + #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) + PLUS_MINUS_SIGN, + MULTIPLICATION_SIGN, + DIVISION_SIGN, + #endif + #if ENABLED(TOUCH_UI_UTF8_FRACTIONS) + FRACTION_QUARTER, + FRACTION_HALF, + FRACTION_THREE_FOURTHS, + #endif + #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) + MICRON_SIGN, + PILCROW_SIGN, + BROKEN_BAR, + SECTION_SIGN, + NOT_SIGN + #endif + }; + + /* Centerline of characters that can take accents */ + + constexpr int8_t mid_a = 12, + mid_e = 12, + mid_i = 5, + mid_o = 12, + mid_u = 12, + mid_y = 11, + mid_n = 12, + mid_c = 12, + mid_A = 13, + mid_E = 13, + mid_I = 6, + mid_O = 14, + mid_U = 14, + mid_Y = 13, + mid_N = 15, + mid_C = 13; + + /* Centerline of accent glyphs */ + + constexpr int8_t mid_accent = 16; + + /* When reusing the DOT_ABOVE accent glyph for the degree sign, we need to trim the leading space */ + constexpr uint8_t deg_sign_leading = 9; + + /* Look-up table for constructing characters (must be ordered by unicode) + * + * Characters are either complete symbols from the Western Char Set bitmap, + * or they are constructed using a standard letter from the romfont and + * drawing an accent from the Western Char Set bitmap over it. + */ + + #define UTF8(A) uint16_t(utf8(U##A)) + + PROGMEM constexpr struct { + uint16_t unicode; + uint8_t std_char; // Glyph from standard ROMFONT (zero if none) + uint8_t alt_char; // Glyph from Western Char Set bitmap + uint8_t alt_data; // For accented characters, the centerline; else char width + } char_recipe[] = { + {0, 0, NO_DOT_I, 10 }, + #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) + {UTF8('¡'), 0 , INV_EXCLAMATION, 13 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_CURRENCY) + {UTF8('¢'), 0 , CENT_SIGN, 23 }, + {UTF8('£'), 0 , POUND_SIGN, 24 }, + {UTF8('¤'), 0 , CURRENCY_SIGN, 26 }, + {UTF8('¥'), 0 , YEN_SIGN, 26 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) + {UTF8('¦'), 0 , BROKEN_BAR, 11 }, + {UTF8('§'), 0 , SECTION_SIGN, 21 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) + {UTF8('©'), 0 , COPYRIGHT_SIGN, 38 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_ORDINALS) + {UTF8('ª'), 0 , FEMININE_ORDINAL, 19 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) + {UTF8('«'), 0 , LEFT_DBL_QUOTE, 23 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) + {UTF8('¬'), 0 , NOT_SIGN, 32 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) + {UTF8('®'), 0 , REGISTERED_SIGN, 38 }, + #endif + {UTF8('°'), 0 , DOT_ABOVE, 24 }, + #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) + {UTF8('±'), 0 , NOT_SIGN, 32 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) + {UTF8('²'), 0 , SUPERSCRIPT_TWO, 16 }, + {UTF8('³'), 0 , SUPERSCRIPT_THREE, 16 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SYMBOLS) + {UTF8('µ'), 0 , MICRON_SIGN, 28 }, + {UTF8('¶'), 0 , PILCROW_SIGN, 24 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) + {UTF8('¹'), 0 , SUPERSCRIPT_ONE, 16 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_ORDINALS) + {UTF8('º'), 0 , MASCULINE_ORDINAL, 19 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) + {UTF8('»'), 0 , RIGHT_DBL_QUOTE, 24 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_FRACTIONS) + {UTF8('¼'), 0 , FRACTION_QUARTER, 40 }, + {UTF8('½'), 0 , FRACTION_HALF, 40 }, + {UTF8('¾'), 0 , FRACTION_THREE_FOURTHS, 40 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) + {UTF8('¿'), 0 , INV_QUESTION, 21 }, + #endif + {UTF8('À'), 'A', GRAVE, mid_A}, + {UTF8('Á'), 'A', ACUTE, mid_A}, + {UTF8('Â'), 'A', CIRCUMFLEX, mid_A}, + {UTF8('Ã'), 'A', TILDE, mid_A}, + {UTF8('Ä'), 'A', DIAERESIS, mid_A}, + {UTF8('Å'), 'A', DOT_ABOVE, mid_A}, + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('Æ'), 0 , LRG_AE, 40}, + #endif + {UTF8('Ç'), 'C', CEDILLA, mid_C}, + {UTF8('È'), 'E', GRAVE, mid_E}, + {UTF8('É'), 'E', ACUTE, mid_E}, + {UTF8('Ê'), 'E', CIRCUMFLEX, mid_E}, + {UTF8('Ë'), 'E', DIAERESIS, mid_E}, + {UTF8('Ì'), 'I', GRAVE, mid_I}, + {UTF8('Í'), 'I', ACUTE, mid_I}, + {UTF8('Î'), 'I', CIRCUMFLEX, mid_I}, + {UTF8('Ï'), 'I', DIAERESIS, mid_I}, + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('Ð'), 0, LRG_ETH, 31 }, + #endif + {UTF8('Ñ'), 'N', TILDE, mid_N}, + {UTF8('Ò'), 'O', GRAVE, mid_O}, + {UTF8('Ó'), 'O', ACUTE, mid_O}, + {UTF8('Ô'), 'O', CIRCUMFLEX, mid_O}, + {UTF8('Õ'), 'O', TILDE, mid_O}, + {UTF8('Ö'), 'O', DIAERESIS, mid_O}, + #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) + {UTF8('×'), 0 , MULTIPLICATION_SIGN, 32 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('Ø'), 0 , LRG_O_STROKE, 32 }, + #endif + {UTF8('Ù'), 'U', GRAVE, mid_U}, + {UTF8('Ú'), 'U', ACUTE, mid_U}, + {UTF8('Û'), 'U', CIRCUMFLEX, mid_U}, + {UTF8('Ü'), 'U', DIAERESIS, mid_U}, + {UTF8('Ý'), 'Y', ACUTE, mid_Y}, + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('Þ'), 0 , LRG_THORN, 25 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_GERMANIC) + {UTF8('ß'), 0 , SHARP_S, 26 }, + #endif + {UTF8('à'), 'a', GRAVE, mid_a}, + {UTF8('á'), 'a', ACUTE, mid_a}, + {UTF8('â'), 'a', CIRCUMFLEX, mid_a}, + {UTF8('ã'), 'a', TILDE, mid_a}, + {UTF8('ä'), 'a', DIAERESIS, mid_a}, + {UTF8('å'), 'a', DOT_ABOVE, mid_a}, + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('æ'), 0 , SML_AE, 40 }, + #endif + {UTF8('ç'), 'c', CEDILLA, mid_c}, + {UTF8('è'), 'e', GRAVE, mid_e}, + {UTF8('é'), 'e', ACUTE, mid_e}, + {UTF8('ê'), 'e', CIRCUMFLEX, mid_e}, + {UTF8('ë'), 'e', DIAERESIS, mid_e}, + {UTF8('ì'), 'i', GRAVE, mid_i}, + {UTF8('í'), 'i', ACUTE, mid_i}, + {UTF8('î'), 'i', CIRCUMFLEX, mid_i}, + {UTF8('ï'), 'i', DIAERESIS, mid_i}, + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('ð'), 0, SML_ETH, 24 }, + #endif + {UTF8('ñ'), 'n', TILDE, mid_n}, + {UTF8('ò'), 'o', GRAVE, mid_o}, + {UTF8('ó'), 'o', ACUTE, mid_o}, + {UTF8('ô'), 'o', CIRCUMFLEX, mid_o}, + {UTF8('õ'), 'o', TILDE, mid_o}, + {UTF8('ö'), 'o', DIAERESIS, mid_o}, + #if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) + {UTF8('÷'), 0 , DIVISION_SIGN, 32 }, + #endif + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('ø'), 0 , SML_O_STROKE, 25 }, + #endif + {UTF8('ù'), 'u', GRAVE, mid_u}, + {UTF8('ú'), 'u', ACUTE, mid_u}, + {UTF8('û'), 'u', CIRCUMFLEX, mid_u}, + {UTF8('ü'), 'u', DIAERESIS, mid_u}, + {UTF8('ý'), 'y', ACUTE, mid_y}, + #if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + {UTF8('þ'), 0 , SML_THORN, 25 }, + #endif + {UTF8('ÿ'), 'y', DIAERESIS, mid_y} + }; + + static_assert(UTF8('¡') == 0xC2A1, "Incorrect encoding for character"); + + /* Compile-time check that the table is in sorted order */ + + constexpr bool is_sorted(size_t n) { + return n < 2 ? true : char_recipe[n-2].unicode < char_recipe[n-1].unicode && is_sorted(n-1); + } + + static_assert(is_sorted(NUM_ELEMENTS(char_recipe)), "The table must be sorted by unicode value"); + + /* Performs a binary search to find a unicode character in the table */ + + static int8_t find_char_data(FTDI::utf8_char_t c) { + int8_t min = 0, max = NUM_ELEMENTS(char_recipe), index; + for (;;) { + index = (min + max)/2; + const uint16_t char_at = pgm_read_word(&char_recipe[index].unicode); + if (char_at == c) break; + if (min == max) return -1; + if (c > char_at) + min = index + 1; + else + max = index; + } + return index; + } + + static void get_char_data(uint8_t index, uint8_t &std_char, uint8_t &alt_char, uint8_t &alt_data) { + std_char = pgm_read_byte(&char_recipe[index].std_char); + alt_char = pgm_read_byte(&char_recipe[index].alt_char); + alt_data = pgm_read_byte(&char_recipe[index].alt_data); + } + + /** + * Load bitmap data into RAMG. This function is called once at the start + * of the program. + * + * Parameters: + * + * addr - Address in RAMG where the font data is written + */ + + void FTDI::WesternCharSet::load_data(uint32_t addr) { + // Load the alternative font metrics + CLCD::FontMetrics alt_fm; + alt_fm.ptr = addr + 148; + alt_fm.format = L4; + alt_fm.stride = 19; + alt_fm.width = 38; + alt_fm.height = 49; + LOOP_L_N(i, 127) + alt_fm.char_widths[i] = 0; + + // For special characters, copy the character widths from the char tables + LOOP_L_N(i, NUM_ELEMENTS(char_recipe)) { + uint8_t std_char, alt_char, alt_data; + get_char_data(i, std_char, alt_char, alt_data); + if (std_char == 0) + alt_fm.char_widths[alt_char] = alt_data; + } + CLCD::mem_write_bulk(addr, &alt_fm, 148); + + // Decode the RLE data and load it into RAMG as a bitmap + write_rle_data(addr + 148, font, sizeof(font)); + + bitmap_addr = addr; + } + + /** + * Populates the bitmap handles for the custom into the display list. + * This function is called once at the start of each display list. + * + * Parameters: + * + * cmd - Object used for writing to the FTDI chip command queue. + */ + + void FTDI::WesternCharSet::load_bitmaps(CommandProcessor& cmd) { + CLCD::FontMetrics alt_fm; + alt_fm.ptr = bitmap_addr + 148; + alt_fm.format = L4; + alt_fm.stride = 19; + alt_fm.width = 38; + alt_fm.height = 49; + set_font_bitmap(cmd, alt_fm, alt_font); + } + + /** + * Renders a character at location x and y. The x position is incremented + * by the width of the character. + * + * Parameters: + * + * cmd - If non-NULL the symbol is drawn to the screen. + * If NULL, only increment position for text measurement. + * + * x, y - The location at which to draw the character. On output, + * incremented to the location of the next character. + * + * fs - A scaling object used to scale the font. The display will + * already be configured to scale bitmaps, but positions + * must be scaled using fs.scale() + * + * c - The unicode code point to draw. If the renderer does not + * support the character, it should return false. + + * Returns: Whether the character was supported. + */ + + bool FTDI::WesternCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) { + + // A supported character? + if (c < UTF8('¡') || c > UTF8('ÿ')) return false; + + int8_t index = find_char_data(c); + if (index == -1) return false; + + // Determine character characteristics + uint8_t std_char, alt_char, alt_data; + get_char_data(index, std_char, alt_char, alt_data); + + bool base_special; + uint8_t base_width; + uint8_t base_char; + uint8_t accent_char; + int8_t accent_dx, accent_dy; + + if (std_char == 0) { + // Special character, non-accented + base_width = alt_data; + base_special = true; + base_char = alt_char; + accent_char = 0; + if (c == UTF8('°')) + x -= fs.scale(deg_sign_leading); + } + else { + // Regular character with accent: + accent_dx = alt_data - mid_accent; + accent_dy = isupper(std_char) ? -7 : 0; + accent_char = alt_char; + base_width = StandardCharSet::std_char_width(std_char); + base_special = std_char == 'i'; + base_char = base_special ? NO_DOT_I : std_char; + } + + // If cmd != NULL, draw the glyph to the screen + if (cmd) { + ext_vertex2ii(*cmd, x, y, base_special ? alt_font : std_font, base_char); + if (accent_char) + ext_vertex2ii(*cmd, x + fs.scale(accent_dx), y + fs.scale(accent_dy), alt_font, accent_char); + } + + // Increment X to the next character position + x += fs.scale(base_width); + return true; + } + +#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET 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 new file mode 100644 index 00000000..2adad232 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.h @@ -0,0 +1,29 @@ +/********************** + * western_char_set.h * + **********************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +namespace FTDI { + class WesternCharSet { + public: + static void load_data(uint32_t addr); + static void load_bitmaps(CommandProcessor&); + static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t); + }; +} 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 new file mode 100644 index 00000000..3426e137 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set_bitmap_31.h @@ -0,0 +1,1315 @@ +/******************************** + * western_european_bitmap_31.h * + ********************************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +/* This is a dump of "font_bitmaps/western_european_bitmap_31.png" + * using the tool "bitmap2cpp.py". The tool converts the image into + * 16-level grayscale and packs two pixels per byte. The resulting + * bytes are then RLE compressed to yield (count, byte) pairs. + */ + +const unsigned char font[] PROGMEM = { + + /* 0 GRAVE */ + 0x76, 0x00, 0x01, 0x08, 0x01, 0xEE, 0x01, 0xE5, 0x11, 0x00, 0x01, 0xAF, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xD0, + 0x10, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF9, 0x11, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF2, + 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFD, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99, + 0x01, 0x40, 0xFF, 0x00, 0xFF, 0x00, 0xA4, 0x00, + + /* 1 ACUTE */ + 0x7B, 0x00, 0x01, 0x9E, 0x01, 0xEE, 0x01, 0x50, 0x0F, 0x00, 0x01, 0x05, + 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x09, 0x01, 0xFF, + 0x01, 0xD1, 0x10, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, + 0x01, 0x01, 0x01, 0xEF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xAA, + 0x01, 0x40, 0xFF, 0x00, 0xFF, 0x00, 0xA5, 0x00, + + /* 2 CIRCUMFLEX */ + 0x79, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x07, 0x02, 0xFF, + 0x01, 0x60, 0x0F, 0x00, 0x01, 0x2F, 0x02, 0xFF, 0x01, 0xF2, 0x0F, 0x00, + 0x01, 0xCF, 0x01, 0xF6, 0x01, 0x6F, 0x01, 0xFB, 0x0E, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x60, 0x0D, 0x00, + 0x01, 0x1F, 0x01, 0xFD, 0x01, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF1, + 0x0D, 0x00, 0x01, 0xBF, 0x01, 0xF3, 0x02, 0x00, 0x01, 0x3F, 0x01, 0xFB, + 0x0C, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50, 0x02, 0x00, 0x01, 0x05, + 0x01, 0x99, 0x01, 0x20, 0xFF, 0x00, 0xFF, 0x00, 0xA2, 0x00, + + /* 3 TILDE */ + 0x7C, 0x00, 0x01, 0x11, 0x0D, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xC3, + 0x02, 0x00, 0x01, 0xFF, 0x01, 0x80, 0x0C, 0x00, 0x01, 0xAF, 0x02, 0xFF, + 0x01, 0x50, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x60, 0x0B, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xD9, 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0x40, 0x0B, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x3E, + 0x02, 0xFF, 0x01, 0xFD, 0x0C, 0x00, 0x01, 0x09, 0x01, 0xFE, 0x01, 0x00, + 0x01, 0x02, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, 0x01, 0x07, + 0x01, 0xA8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20, 0xFF, 0x00, + 0xFF, 0x00, 0xB6, 0x00, + + /* 4 DIAERESIS */ + 0x8A, 0x00, 0x02, 0x44, 0x02, 0x00, 0x02, 0x44, 0x0D, 0x00, 0x02, 0xFF, + 0x01, 0x10, 0x01, 0x01, 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, + 0x01, 0x01, 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, 0x01, 0x01, + 0x02, 0xFF, 0x0D, 0x00, 0x02, 0xCC, 0x01, 0x10, 0x01, 0x01, 0x02, 0xCC, + 0xFF, 0x00, 0xFF, 0x00, 0xC9, 0x00, + + /* 5 DOT_ABOVE / DEGREE_SIGN */ + 0x2D, 0x00, 0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2B, 0x02, 0xFF, + 0x01, 0xA1, 0x0E, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xFD, + 0x01, 0x10, 0x0D, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x94, 0x01, 0x5A, + 0x01, 0xFF, 0x01, 0xB0, 0x0D, 0x00, 0x01, 0x4F, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x9F, 0x01, 0xF2, 0x0D, 0x00, 0x01, 0x8F, 0x01, 0xF0, 0x02, 0x00, + 0x01, 0x2F, 0x01, 0xF6, 0x0D, 0x00, 0x01, 0x8F, 0x01, 0xE0, 0x02, 0x00, + 0x01, 0x0F, 0x01, 0xF7, 0x0D, 0x00, 0x01, 0x7F, 0x01, 0xF2, 0x02, 0x00, + 0x01, 0x4F, 0x01, 0xF5, 0x0D, 0x00, 0x01, 0x2F, 0x01, 0xFC, 0x01, 0x10, + 0x01, 0x02, 0x01, 0xDF, 0x01, 0xF0, 0x0D, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xFB, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x60, 0x0E, 0x00, 0x01, 0x9F, + 0x02, 0xFF, 0x01, 0xF8, 0x0F, 0x00, 0x01, 0x03, 0x01, 0x9C, 0x01, 0xC9, + 0x01, 0x30, 0xFF, 0x00, 0xFF, 0x00, 0xA4, 0x00, + + /* 6 CEDILLA */ + 0xFF, 0x00, 0xFF, 0x00, 0xEE, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0x20, + 0x11, 0x00, 0x01, 0xCF, 0x01, 0xC0, 0x11, 0x00, 0x01, 0x3F, 0x01, 0xF6, + 0x11, 0x00, 0x01, 0x0F, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x3F, 0x01, 0xFD, + 0x0E, 0x00, 0x01, 0x07, 0x01, 0xD9, 0x01, 0x89, 0x01, 0xFF, 0x01, 0xFB, + 0x0E, 0x00, 0x01, 0x07, 0x03, 0xFF, 0x01, 0xF3, 0x0E, 0x00, 0x01, 0x04, + 0x01, 0xBD, 0x01, 0xEE, 0x01, 0xD9, 0x01, 0x20, 0x2F, 0x00, + + /* 7 NO_DOT_I */ + 0xFF, 0x00, 0x32, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xF9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0x10, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF9, 0xCD, 0x00, + +#if ENABLED(TOUCH_UI_UTF8_GERMANIC) + /* 8 SHARP_S */ + 0x8A, 0x00, 0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0E, 0x00, 0x01, 0x03, + 0x01, 0xAF, 0x03, 0xFF, 0x01, 0xE7, 0x0D, 0x00, 0x01, 0x7F, 0x05, 0xFF, + 0x01, 0xC1, 0x0B, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFC, 0x01, 0xAA, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFC, 0x0B, 0x00, 0x01, 0x2F, 0x01, 0xFF, + 0x01, 0xF9, 0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x70, 0x0A, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x03, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xE0, 0x0A, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xFB, 0x04, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF7, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF9, 0x03, 0x00, 0x01, 0x03, + 0x01, 0x9E, 0x01, 0xFF, 0x01, 0xF8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0x01, 0x01, 0xAF, 0x02, 0xFF, 0x01, 0xD7, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x1D, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, + 0x01, 0xFA, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, + 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x01, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF4, 0x0C, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xF9, 0x0C, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x00, + 0x01, 0x02, 0x02, 0xFF, 0x01, 0x50, 0x0B, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xF8, 0x0B, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x1D, 0x02, 0xFF, + 0x01, 0xD3, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, + 0x01, 0x01, 0x01, 0xCF, 0x02, 0xFF, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFB, + 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x2B, + 0x02, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, + 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xF6, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFD, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xFD, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x02, 0x01, 0x84, + 0x03, 0x00, 0x01, 0x2D, 0x01, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xA9, + 0x01, 0xAC, 0x02, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF8, 0x01, 0x02, 0x05, 0xFF, 0x01, 0xFE, 0x01, 0x20, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xEE, 0x01, 0xE7, 0x01, 0x01, 0x01, 0xBF, 0x03, 0xFF, + 0x01, 0xFE, 0x01, 0x80, 0x0E, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, + 0x01, 0x30, 0xB4, 0x00, +#endif + +#if ENABLED(TOUCH_UI_UTF8_SCANDINAVIAN) + /* 9 LRG_O_STROKE */ + 0x93, 0x00, 0x01, 0x40, 0x0A, 0x00, 0x01, 0x47, 0x01, 0x9A, 0x01, 0xBA, + 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xF8, 0x08, 0x00, + 0x01, 0x02, 0x01, 0xAF, 0x04, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x01, 0x00, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8F, 0x06, 0xFF, + 0x01, 0xFC, 0x01, 0x23, 0x01, 0xFF, 0x01, 0xF6, 0x07, 0x00, 0x01, 0x1C, + 0x03, 0xFF, 0x01, 0xCA, 0x01, 0x9B, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xFE, + 0x01, 0xFF, 0x01, 0x80, 0x07, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9F, 0x02, 0xFF, 0x01, 0xFA, + 0x07, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0x90, 0x04, 0x00, 0x01, 0x03, + 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xF3, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, + 0x01, 0xF9, 0x06, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xFC, 0x07, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xC0, 0x05, 0x00, 0x01, 0x06, 0x03, 0xFF, + 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xFF, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xC0, 0x05, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x02, 0x01, 0xEF, + 0x01, 0xF7, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x0F, + 0x01, 0xFF, 0x01, 0xF6, 0x05, 0x00, 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xA0, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF8, 0x05, 0x00, 0x01, 0x3F, 0x01, 0xFF, + 0x01, 0xF2, 0x05, 0x00, 0x01, 0xCF, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xE0, + 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xC0, + 0x04, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x00, 0x01, 0x03, + 0x02, 0xFF, 0x05, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, + 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF4, 0x02, 0x00, 0x01, 0x02, 0x02, 0xFF, + 0x01, 0x10, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x03, 0x00, + 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01, 0x02, 0xFF, + 0x01, 0x30, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x02, 0x00, + 0x01, 0x01, 0x01, 0xEF, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x02, 0x02, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x02, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, 0x01, 0x03, 0x02, 0xFF, + 0x01, 0x10, 0x04, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xC0, 0x02, 0x00, + 0x01, 0xBF, 0x01, 0xFD, 0x04, 0x00, 0x01, 0x04, 0x02, 0xFF, 0x05, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xE1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFE, 0x05, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, + 0x01, 0x30, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, + 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xF5, + 0x05, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF7, 0x05, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, 0x01, 0x03, 0x02, 0xFF, + 0x01, 0xEF, 0x01, 0xFA, 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xB0, + 0x06, 0x00, 0x01, 0xCF, 0x02, 0xFF, 0x01, 0xC0, 0x05, 0x00, 0x01, 0x06, + 0x02, 0xFF, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2F, 0x02, 0xFF, 0x01, 0x20, + 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x0B, + 0x02, 0xFF, 0x01, 0xD2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xFF, 0x01, 0xE1, + 0x07, 0x00, 0x01, 0x5F, 0x03, 0xFF, 0x01, 0x93, 0x02, 0x00, 0x01, 0x05, + 0x01, 0xCF, 0x02, 0xFF, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xFB, 0x03, 0xFF, 0x01, 0xFD, 0x01, 0xDE, 0x03, 0xFF, 0x01, 0xE3, + 0x07, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x4D, 0x06, 0xFF, + 0x01, 0xFA, 0x01, 0x10, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFB, 0x02, 0x00, + 0x01, 0x5C, 0x04, 0xFF, 0x01, 0xE9, 0x01, 0x30, 0x08, 0x00, 0x01, 0x1C, + 0x01, 0xD0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86, 0x01, 0x53, + 0x0B, 0x00, 0x01, 0x10, 0xA8, 0x00, + + /* 10 SML_O_STROKE */ + 0xFF, 0x00, 0x15, 0x00, 0x01, 0x02, 0x01, 0x20, 0x0C, 0x00, 0x01, 0x02, + 0x01, 0x32, 0x01, 0x10, 0x02, 0x00, 0x01, 0x1D, 0x01, 0xE3, 0x0A, 0x00, + 0x01, 0x01, 0x01, 0x7C, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0x82, 0x01, 0x00, + 0x01, 0xCF, 0x01, 0xF7, 0x0A, 0x00, 0x01, 0x6E, 0x05, 0xFF, 0x01, 0x89, + 0x01, 0xFF, 0x01, 0xA0, 0x09, 0x00, 0x01, 0x08, 0x07, 0xFF, 0x01, 0xFC, + 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x50, 0x01, 0x00, + 0x01, 0x3A, 0x02, 0xFF, 0x01, 0xF1, 0x09, 0x00, 0x01, 0x01, 0x02, 0xFF, + 0x01, 0x90, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xF5, 0x09, 0x00, + 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x01, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF3, + 0x03, 0x00, 0x01, 0x0B, 0x03, 0xFF, 0x01, 0x30, 0x08, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xD0, 0x03, 0x00, 0x01, 0x9F, 0x01, 0xFA, 0x01, 0x8F, + 0x01, 0xFF, 0x01, 0x80, 0x08, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x80, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xC0, 0x01, 0x3F, 0x01, 0xFF, + 0x01, 0xB0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x50, 0x02, 0x00, + 0x01, 0x3F, 0x01, 0xFE, 0x01, 0x10, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xE0, + 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x40, 0x01, 0x00, 0x01, 0x02, + 0x01, 0xEF, 0x01, 0xF3, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, + 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0x50, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF0, + 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0xBF, + 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, + 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x40, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, + 0x02, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0x60, 0x01, 0x5F, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xC0, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA3, + 0x01, 0xFF, 0x01, 0xE2, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x90, + 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xFF, 0x01, 0x40, + 0x03, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0A, + 0x02, 0xFF, 0x01, 0xF6, 0x03, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFE, + 0x09, 0x00, 0x01, 0x02, 0x02, 0xFF, 0x01, 0xB0, 0x03, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xF8, 0x0A, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xF7, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xD0, 0x09, 0x00, + 0x01, 0x04, 0x03, 0xFF, 0x01, 0xFC, 0x01, 0xAB, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xFE, 0x01, 0x20, 0x09, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xAF, + 0x05, 0xFF, 0x01, 0xD2, 0x09, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xF5, + 0x01, 0x04, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xD6, 0x0A, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0x70, 0x01, 0x00, 0x01, 0x01, 0x01, 0x46, 0x01, 0x76, + 0x01, 0x52, 0x0C, 0x00, 0x01, 0x28, 0xA9, 0x00, + + /* 11 LRG_AE */ + 0x9E, 0x00, 0x01, 0x14, 0x0B, 0x44, 0x01, 0x41, 0x06, 0x00, 0x01, 0x8F, + 0x0B, 0xFF, 0x01, 0xF3, 0x06, 0x00, 0x01, 0xEF, 0x0B, 0xFF, 0x01, 0xF3, + 0x05, 0x00, 0x01, 0x05, 0x02, 0xFF, 0x01, 0xEE, 0x09, 0xFF, 0x01, 0xF3, + 0x05, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF5, 0x01, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x0C, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x10, + 0x01, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xFA, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x0B, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF3, 0x02, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xD0, + 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, 0x01, 0xBF, + 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x0A, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFE, 0x03, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x0A, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF9, + 0x03, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xED, 0x06, 0xDD, 0x01, 0x80, + 0x03, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x03, 0x00, 0x01, 0xDF, + 0x08, 0xFF, 0x01, 0xA0, 0x03, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xB0, + 0x03, 0x00, 0x01, 0xDF, 0x08, 0xFF, 0x01, 0xA0, 0x03, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x40, 0x03, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA8, + 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFE, + 0x04, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x09, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x09, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF4, 0x04, 0x33, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7F, 0x08, 0xFF, 0x01, 0x40, + 0x09, 0x00, 0x01, 0xEF, 0x08, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x05, + 0x09, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF7, + 0x05, 0x33, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0xE0, 0x05, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, + 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x80, 0x05, 0x00, 0x01, 0xDF, + 0x01, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x05, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xFB, 0x06, 0x00, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA8, 0x06, 0x88, + 0x01, 0x85, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xF4, 0x06, 0x00, 0x01, 0xDF, + 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xE0, 0x06, 0x00, + 0x01, 0xDF, 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x8D, 0x01, 0xDD, 0x01, 0x60, + 0x06, 0x00, 0x01, 0xBD, 0x08, 0xDD, 0x01, 0xD8, 0xBE, 0x00, + + /* 12 SML_AE */ + 0xFF, 0x00, 0x22, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, + 0x01, 0x12, 0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7B, + 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, + 0x01, 0x9E, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0x81, 0x04, 0x00, 0x01, 0xBF, + 0x05, 0xFF, 0x01, 0xFE, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9F, 0x05, 0xFF, + 0x01, 0x60, 0x03, 0x00, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xEE, 0x03, 0xFF, + 0x01, 0xF5, 0x01, 0x1D, 0x03, 0xFF, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xF8, + 0x03, 0x00, 0x01, 0xDF, 0x01, 0xB6, 0x01, 0x30, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x5D, 0x02, 0xFF, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xE7, 0x01, 0x20, + 0x01, 0x00, 0x01, 0x29, 0x02, 0xFF, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, + 0x05, 0x00, 0x01, 0xAF, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x10, 0x03, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x0D, 0x02, 0xFF, + 0x01, 0xD0, 0x04, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, 0x08, 0x00, + 0x01, 0x06, 0x02, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0xEF, 0x01, 0xFD, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x06, 0x00, 0x01, 0x9F, + 0x01, 0xFF, 0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, + 0x01, 0xFF, 0x01, 0xF9, 0x06, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x03, 0x00, + 0x01, 0x4A, 0x06, 0xFF, 0x01, 0xFB, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, + 0x01, 0xAF, 0x01, 0xFF, 0x02, 0x00, 0x01, 0x1B, 0x10, 0xFF, 0x01, 0x00, + 0x01, 0x01, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xCA, 0x01, 0x98, 0x01, 0x88, + 0x01, 0x89, 0x0A, 0xFF, 0x01, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x40, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFA, 0x08, 0x77, + 0x01, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xD0, 0x04, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x70, + 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFA, 0x09, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFE, + 0x09, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0F, + 0x02, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x60, + 0x04, 0x00, 0x01, 0x8F, 0x02, 0xFF, 0x01, 0xE1, 0x08, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0xD0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xA2, 0x02, 0xFF, 0x01, 0xE6, 0x01, 0x10, + 0x02, 0x00, 0x01, 0x02, 0x01, 0x8D, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x05, + 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xAB, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xFC, + 0x01, 0x00, 0x01, 0x3F, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xBA, 0x01, 0xBC, + 0x02, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x7F, 0x05, 0xFF, 0x01, 0xA0, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x06, 0xFF, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x03, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xB4, 0x03, 0x00, 0x01, 0x05, + 0x01, 0xBF, 0x04, 0xFF, 0x01, 0xB7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, + 0x01, 0x46, 0x01, 0x76, 0x01, 0x41, 0x06, 0x00, 0x01, 0x35, 0x01, 0x67, + 0x01, 0x64, 0x01, 0x20, 0xAD, 0x00, + + /* 13 LRG_ETH */ + 0x9A, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43, 0x01, 0x21, 0x0D, 0x00, + 0x01, 0xBF, 0x05, 0xFF, 0x01, 0xFE, 0x01, 0xB8, 0x01, 0x40, 0x0A, 0x00, + 0x01, 0xBF, 0x07, 0xFF, 0x01, 0xFE, 0x01, 0x81, 0x09, 0x00, 0x01, 0xBF, + 0x08, 0xFF, 0x01, 0xFE, 0x01, 0x60, 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58, 0x01, 0xCF, 0x02, 0xFF, + 0x01, 0xF9, 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x04, 0x00, + 0x01, 0x02, 0x01, 0x9F, 0x02, 0xFF, 0x01, 0x80, 0x07, 0x00, 0x01, 0xBF, + 0x01, 0xFF, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xF4, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFD, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xFF, 0x01, 0x50, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xF0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xF3, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0F, 0x01, 0xFF, + 0x01, 0xF5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0xF6, 0x04, 0x00, 0x01, 0xCF, 0x06, 0xFF, 0x01, 0xF2, 0x04, 0x00, + 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xCF, 0x06, 0xFF, + 0x01, 0xF2, 0x04, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF9, 0x04, 0x00, + 0x01, 0x9B, 0x01, 0xBB, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xDB, 0x02, 0xBB, + 0x01, 0xB1, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0xF7, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, + 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF6, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF4, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, + 0x01, 0xF1, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xD0, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x80, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, 0x01, 0x0B, 0x02, 0xFF, + 0x01, 0x20, 0x06, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x06, 0x00, + 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xF9, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, + 0x01, 0x50, 0x05, 0x00, 0x01, 0x0A, 0x02, 0xFF, 0x01, 0xE1, 0x07, 0x00, + 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x50, 0x04, 0x00, 0x01, 0x29, 0x03, 0xFF, + 0x01, 0x30, 0x07, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xA7, 0x01, 0x77, + 0x01, 0x78, 0x01, 0x9A, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xE3, 0x08, 0x00, + 0x01, 0xBF, 0x08, 0xFF, 0x01, 0xF9, 0x01, 0x10, 0x08, 0x00, 0x01, 0xBF, + 0x07, 0xFF, 0x01, 0xD8, 0x01, 0x10, 0x09, 0x00, 0x01, 0xAD, 0x03, 0xDD, + 0x01, 0xDC, 0x01, 0xCB, 0x01, 0xA7, 0x01, 0x41, 0xC7, 0x00, + + /* 14 SML_ETH */ + 0x88, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x5A, 0x01, 0x40, 0x0C, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x04, 0x01, 0xAF, 0x01, 0xFF, + 0x01, 0xA0, 0x0C, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0xFC, 0x02, 0xFF, + 0x01, 0xD8, 0x01, 0x20, 0x0C, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xFD, + 0x01, 0x82, 0x0D, 0x00, 0x01, 0x5A, 0x03, 0xFF, 0x01, 0xF4, 0x0D, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x87, 0x02, 0xFF, 0x01, 0x30, + 0x0C, 0x00, 0x01, 0x6F, 0x01, 0xE9, 0x01, 0x30, 0x01, 0x00, 0x01, 0x8F, + 0x01, 0xFF, 0x01, 0xE2, 0x0C, 0x00, 0x01, 0x03, 0x03, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x23, 0x01, 0x44, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x02, 0x01, 0x9E, + 0x04, 0xFF, 0x01, 0xF7, 0x0C, 0x00, 0x01, 0x7F, 0x06, 0xFF, 0x01, 0x30, + 0x0A, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0xFE, 0x01, 0xCB, 0x01, 0xDF, + 0x02, 0xFF, 0x01, 0xD0, 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFB, + 0x01, 0x30, 0x02, 0x00, 0x01, 0x4E, 0x01, 0xFF, 0x01, 0xF5, 0x09, 0x00, + 0x01, 0x02, 0x02, 0xFF, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xFD, 0x09, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, + 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, + 0x01, 0xF1, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA0, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0xB0, 0x08, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x01, 0xF0, 0x08, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFF, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, + 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2F, 0x01, 0xFF, + 0x01, 0xD0, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA0, 0x05, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0F, 0x01, 0xFF, + 0x01, 0xF1, 0x05, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, + 0x01, 0x09, 0x01, 0xFF, 0x01, 0xF9, 0x04, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xFE, 0x09, 0x00, 0x01, 0x02, 0x02, 0xFF, 0x01, 0x60, 0x03, 0x00, + 0x01, 0x3E, 0x01, 0xFF, 0x01, 0xF6, 0x0A, 0x00, 0x01, 0x7F, 0x01, 0xFF, + 0x01, 0xF9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0xB0, + 0x0A, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0xFD, 0x01, 0xBD, 0x02, 0xFF, + 0x01, 0xFD, 0x01, 0x10, 0x0B, 0x00, 0x01, 0x7F, 0x05, 0xFF, 0x01, 0xB0, + 0x0C, 0x00, 0x01, 0x02, 0x01, 0xAE, 0x03, 0xFF, 0x01, 0xB4, 0x0F, 0x00, + 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xB6, 0x00, + + /* 15 LRG_THORN */ + 0x9A, 0x00, 0x02, 0x55, 0x11, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x05, 0xFF, 0x01, 0xED, 0x01, 0xA7, 0x01, 0x10, 0x0B, 0x00, 0x07, 0xFF, + 0x01, 0xFA, 0x01, 0x10, 0x0A, 0x00, 0x08, 0xFF, 0x01, 0xE2, 0x0A, 0x00, + 0x02, 0xFF, 0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7A, 0x02, 0xFF, + 0x01, 0xFE, 0x01, 0x10, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x1B, 0x02, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, + 0x04, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xF0, 0x09, 0x00, 0x02, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, + 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0xF7, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x04, 0x00, + 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF6, 0x09, 0x00, 0x02, 0xFF, 0x01, 0x20, + 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x09, 0x00, 0x02, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0xF0, 0x09, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1B, 0x02, 0xFF, 0x01, 0x80, + 0x09, 0x00, 0x02, 0xFF, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7A, 0x02, 0xFF, + 0x01, 0xFE, 0x01, 0x10, 0x09, 0x00, 0x08, 0xFF, 0x01, 0xE2, 0x0A, 0x00, + 0x07, 0xFF, 0x01, 0xFA, 0x01, 0x10, 0x0A, 0x00, 0x05, 0xFF, 0x01, 0xED, + 0x01, 0xA7, 0x01, 0x10, 0x0B, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, + 0x02, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x02, 0xCC, 0x01, 0x10, 0xCC, 0x00, + + /* 16 SML_THORN */ + 0x86, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x94, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x02, 0x00, 0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0B, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x00, 0x01, 0x5C, 0x02, 0xFF, 0x01, 0xFD, + 0x01, 0x70, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x0B, + 0x04, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xDF, 0x02, 0xFF, + 0x01, 0xE1, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, + 0x01, 0xC3, 0x02, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xFC, 0x09, 0x00, + 0x01, 0x03, 0x02, 0xFF, 0x01, 0xFA, 0x03, 0x00, 0x01, 0x02, 0x01, 0xEF, + 0x01, 0xFF, 0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0xE0, + 0x04, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x03, + 0x02, 0xFF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF3, + 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xF7, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF9, 0x06, 0x00, 0x01, 0xFF, 0x01, 0xFD, 0x08, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xFE, 0x08, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xEF, + 0x01, 0xFE, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF9, 0x06, 0x00, + 0x01, 0xFF, 0x01, 0xFD, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, + 0x05, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x03, + 0x02, 0xFF, 0x05, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF8, 0x08, 0x00, + 0x01, 0x03, 0x02, 0xFF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0C, 0x01, 0xFF, + 0x01, 0xF3, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0xD0, 0x04, 0x00, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xFF, + 0x01, 0xFA, 0x03, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x60, + 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, 0x01, 0xB3, + 0x02, 0x00, 0x01, 0x6E, 0x01, 0xFF, 0x01, 0xFC, 0x09, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0xEC, 0x01, 0xCF, + 0x02, 0xFF, 0x01, 0xE2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, + 0x01, 0x0B, 0x04, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF7, 0x01, 0x00, 0x01, 0x6C, 0x02, 0xFF, 0x01, 0xFE, + 0x01, 0x70, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x23, 0x01, 0x54, 0x01, 0x20, 0x0B, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xFF, + 0x01, 0xF7, 0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0x22, 0x00, +#endif // TOUCH_UI_UTF8_SCANDINAVIAN + +#if ENABLED(TOUCH_UI_UTF8_PUNCTUATION) + /* 17 LEFT_DBL_QUOTE */ + 0xFF, 0x00, 0x4A, 0x00, 0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0D, 0x00, + 0x01, 0x08, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x01, 0x01, 0xC6, 0x0D, 0x00, + 0x01, 0xAF, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x1D, 0x01, 0xF6, 0x0C, 0x00, + 0x01, 0x1C, 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xEF, + 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x50, + 0x01, 0x00, 0x01, 0x3E, 0x01, 0xFF, 0x01, 0xE2, 0x0B, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xF4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x20, 0x0A, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFE, 0x01, 0x30, + 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xD1, 0x0B, 0x00, 0x01, 0x5F, + 0x01, 0xFF, 0x01, 0xD2, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFB, + 0x0B, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x01, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x0C, 0x01, 0xFF, + 0x01, 0xD0, 0x02, 0x00, 0x01, 0xFF, 0x01, 0xFA, 0x0C, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x50, + 0x0C, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x1C, + 0x01, 0xFF, 0x01, 0xF6, 0x0C, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFB, + 0x02, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x90, 0x0C, 0x00, 0x01, 0x6F, + 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xFA, + 0x0C, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0xA0, 0x01, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF6, 0x0C, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x5F, 0x01, 0xF6, + 0x0D, 0x00, 0x01, 0x1D, 0x01, 0xA0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xE6, + 0x0D, 0x00, 0x01, 0x01, 0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xFF, 0x00, + + /* 18 RIGHT_DBL_QUOTE */ + 0xFF, 0x00, 0x46, 0x00, 0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0D, 0x00, + 0x01, 0x01, 0x01, 0xE3, 0x03, 0x00, 0x01, 0x5D, 0x01, 0x10, 0x0C, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0x50, 0x02, 0x00, 0x01, 0x5F, 0x01, 0xE2, + 0x0C, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF6, 0x02, 0x00, 0x01, 0x5F, + 0x01, 0xFE, 0x01, 0x30, 0x0C, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x80, + 0x01, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xF5, 0x0C, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xFA, 0x01, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x60, 0x0C, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF9, 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xFC, 0x01, 0x10, 0x01, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xA0, + 0x0C, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD1, 0x01, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF5, + 0x02, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x10, 0x0B, 0x00, 0x01, 0x2D, + 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x10, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0x40, + 0x01, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xD2, 0x0B, 0x00, 0x01, 0x4F, + 0x01, 0xFF, 0x01, 0xE3, 0x01, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFC, + 0x01, 0x10, 0x0A, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, + 0x01, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x6F, + 0x01, 0xFF, 0x01, 0xC1, 0x01, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF9, + 0x0B, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x5F, + 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x90, + 0x02, 0x00, 0x01, 0x5F, 0x01, 0xF6, 0x0C, 0x00, 0x01, 0x01, 0x01, 0xF8, + 0x03, 0x00, 0x01, 0x5F, 0x01, 0x40, 0x0C, 0x00, 0x01, 0x01, 0x01, 0x50, + 0x03, 0x00, 0x01, 0x43, 0xFF, 0x00, 0x04, 0x00, + + /* 19 INV_EXCLAMATION */ + 0xFF, 0x00, 0x34, 0x00, 0x01, 0xAD, 0x01, 0xDD, 0x01, 0x40, 0x10, 0x00, + 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, + 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, 0x01, 0x44, + 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00, 0x01, 0x6F, + 0x01, 0xFF, 0x11, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x11, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x30, 0x10, 0x00, 0x01, 0xAF, + 0x01, 0xFF, 0x01, 0x30, 0x10, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x40, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, + 0x10, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34, + 0x01, 0x44, 0x01, 0x10, 0x33, 0x00, + + /* 20 INV_QUESTION */ + 0xFF, 0x00, 0x36, 0x00, 0x02, 0xDD, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, + 0x02, 0xFF, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, 0x02, 0xFF, 0x11, 0x00, + 0x02, 0x44, 0x37, 0x00, 0x01, 0xBC, 0x01, 0xCB, 0x11, 0x00, 0x01, 0xEF, + 0x01, 0xFE, 0x11, 0x00, 0x01, 0xEF, 0x01, 0xFE, 0x11, 0x00, 0x01, 0xEF, + 0x01, 0xFE, 0x11, 0x00, 0x01, 0xFF, 0x01, 0xFD, 0x10, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xFB, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xD0, 0x0F, 0x00, 0x01, 0x0A, + 0x02, 0xFF, 0x01, 0x30, 0x0F, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xF4, + 0x0F, 0x00, 0x01, 0x09, 0x02, 0xFF, 0x01, 0x40, 0x0F, 0x00, 0x01, 0x7F, + 0x01, 0xFF, 0x01, 0xF4, 0x0F, 0x00, 0x01, 0x03, 0x02, 0xFF, 0x01, 0x40, + 0x0F, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x0F, + 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x0F, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x05, 0x01, 0xD0, 0x0A, 0x00, + 0x01, 0x08, 0x02, 0xFF, 0x01, 0x70, 0x02, 0x00, 0x01, 0x05, 0x01, 0xCF, + 0x01, 0xF0, 0x0A, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x98, 0x01, 0x8B, 0x02, 0xFF, 0x01, 0xF0, 0x0B, 0x00, 0x01, 0x3F, + 0x06, 0xFF, 0x01, 0xC0, 0x0B, 0x00, 0x01, 0x02, 0x01, 0xCF, 0x04, 0xFF, + 0x01, 0xC5, 0x0D, 0x00, 0x01, 0x03, 0x01, 0x8B, 0x01, 0xCC, 0x01, 0xB9, + 0x01, 0x62, 0x31, 0x00, +#endif // TOUCH_UI_UTF8_PUNCTUATION + +#if ENABLED(TOUCH_UI_UTF8_CURRENCY) + /* 21 CENT_SIGN */ + 0xB1, 0x00, 0x01, 0x01, 0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x11, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFC, + 0x11, 0x00, 0x01, 0x39, 0x01, 0xFD, 0x01, 0x42, 0x0E, 0x00, 0x01, 0x05, + 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xFB, 0x01, 0x50, 0x0B, 0x00, 0x01, 0x03, + 0x01, 0xCF, 0x05, 0xFF, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x4F, 0x02, 0xFF, + 0x02, 0xFE, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xF6, 0x0A, 0x00, 0x01, 0x02, + 0x02, 0xFF, 0x01, 0xE6, 0x01, 0x05, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x38, + 0x01, 0xE6, 0x0A, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x10, + 0x01, 0x05, 0x01, 0xFC, 0x02, 0x00, 0x01, 0x02, 0x0A, 0x00, 0x01, 0x5F, + 0x01, 0xFF, 0x01, 0xE1, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0D, 0x00, + 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFC, + 0x0D, 0x00, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0C, 0x00, + 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFB, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, + 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x05, + 0x01, 0xFC, 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, 0x02, 0x00, + 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF6, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xFC, 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF9, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x0C, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFC, 0x02, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x0D, 0x00, 0x02, 0xFF, 0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFB, + 0x0D, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x00, + 0x01, 0x05, 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x30, 0x01, 0x05, 0x01, 0xFB, 0x02, 0x00, 0x01, 0x33, 0x0A, 0x00, + 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xF9, 0x01, 0x35, 0x01, 0xFB, + 0x01, 0x02, 0x01, 0x6C, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x2D, 0x06, 0xFF, + 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x01, 0x9F, 0x05, 0xFF, 0x01, 0xF5, + 0x0C, 0x00, 0x01, 0x02, 0x01, 0x8D, 0x03, 0xFF, 0x01, 0xC7, 0x01, 0x20, + 0x0E, 0x00, 0x01, 0x06, 0x01, 0xFC, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, 0x01, 0xFB, 0x11, 0x00, 0x01, 0x05, + 0x01, 0xFB, 0x57, 0x00, + + /* 22 POUND_SIGN */ + 0x9E, 0x00, 0x01, 0x6B, 0x01, 0xDF, 0x01, 0xFD, 0x01, 0xC9, 0x01, 0x40, + 0x0D, 0x00, 0x01, 0x6E, 0x05, 0xFF, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x07, + 0x06, 0xFF, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0xFE, + 0x01, 0x85, 0x01, 0x34, 0x01, 0x7B, 0x01, 0xFF, 0x01, 0x30, 0x0B, 0x00, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xC1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, + 0x0A, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x01, 0x30, 0x0F, 0x00, 0x01, 0x04, + 0x01, 0xFF, 0x01, 0xFD, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xFA, + 0x10, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF8, 0x10, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xF7, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x0E, 0x00, 0x01, 0x0A, + 0x07, 0xFF, 0x01, 0xF4, 0x0A, 0x00, 0x01, 0x0A, 0x07, 0xFF, 0x01, 0xF4, + 0x0A, 0x00, 0x01, 0x08, 0x01, 0xDD, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFE, + 0x03, 0xDD, 0x01, 0xD4, 0x0C, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, + 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF6, 0x0E, 0x00, 0x01, 0x4B, 0x01, 0xBB, 0x01, 0xBE, + 0x01, 0xFF, 0x01, 0xFD, 0x05, 0xBB, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6F, + 0x09, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x6F, 0x09, 0xFF, 0x01, 0xA0, + 0x08, 0x00, 0x01, 0x4A, 0x09, 0xAA, 0x01, 0x60, 0xC5, 0x00, + + /* 23 CURRENCY_SIGN */ + 0xFF, 0x00, 0x0D, 0x00, 0x01, 0x30, 0x07, 0x00, 0x01, 0x01, 0x01, 0x40, + 0x08, 0x00, 0x01, 0x0B, 0x01, 0xF5, 0x07, 0x00, 0x01, 0x1D, 0x01, 0xF4, + 0x08, 0x00, 0x01, 0xBF, 0x01, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x01, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x30, 0x07, 0x00, 0x01, 0x5F, 0x01, 0xFF, + 0x01, 0xF4, 0x01, 0x00, 0x01, 0x6B, 0x01, 0xDD, 0x01, 0xC8, 0x01, 0x20, + 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xFA, 0x08, 0x00, 0x01, 0x05, 0x02, 0xFF, + 0x01, 0x8E, 0x03, 0xFF, 0x01, 0xFA, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xA0, + 0x09, 0x00, 0x01, 0x5F, 0x07, 0xFF, 0x01, 0xFA, 0x0A, 0x00, 0x01, 0x05, + 0x02, 0xFF, 0x01, 0xE9, 0x01, 0x55, 0x01, 0x7C, 0x02, 0xFF, 0x01, 0xA0, + 0x0A, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xA0, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0xC0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF2, 0x0A, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xF7, + 0x0A, 0x00, 0x01, 0x4F, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x8F, 0x01, 0xFA, + 0x0A, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFC, + 0x0A, 0x00, 0x01, 0x5F, 0x01, 0xFC, 0x05, 0x00, 0x01, 0x7F, 0x01, 0xFB, + 0x0A, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0xF8, 0x0A, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0x80, 0x03, 0x00, + 0x01, 0x03, 0x01, 0xFF, 0x01, 0xF3, 0x0A, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF5, 0x03, 0x00, 0x01, 0x1D, 0x01, 0xFF, 0x01, 0xC0, 0x0A, 0x00, + 0x01, 0x01, 0x02, 0xFF, 0x01, 0x92, 0x01, 0x00, 0x01, 0x16, 0x01, 0xEF, + 0x01, 0xFF, 0x01, 0x60, 0x0A, 0x00, 0x01, 0x1D, 0x03, 0xFF, 0x01, 0xFE, + 0x03, 0xFF, 0x01, 0xF4, 0x09, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x05, 0xFF, + 0x01, 0xFE, 0x02, 0xFF, 0x01, 0x40, 0x08, 0x00, 0x01, 0x1D, 0x01, 0xFF, + 0x01, 0xFA, 0x01, 0x06, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x81, + 0x01, 0x5F, 0x01, 0xFF, 0x01, 0xF4, 0x08, 0x00, 0x01, 0xCF, 0x01, 0xFF, + 0x01, 0xA0, 0x01, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x20, 0x01, 0x00, + 0x01, 0x05, 0x02, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFA, + 0x07, 0x00, 0x01, 0x4F, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x05, 0x01, 0xA0, + 0x07, 0x00, 0x01, 0x05, 0x01, 0x80, 0xEB, 0x00, + + /* 24 YEN_SIGN */ + 0x98, 0x00, 0x01, 0x01, 0x01, 0x88, 0x01, 0x85, 0x07, 0x00, 0x01, 0x38, + 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x10, + 0x06, 0x00, 0x01, 0xCF, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, 0x01, 0x3F, + 0x01, 0xFF, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xF8, + 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0xE0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xFA, + 0x05, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x60, 0x09, 0x00, 0x01, 0xAF, + 0x01, 0xFF, 0x01, 0x30, 0x04, 0x00, 0x01, 0xEF, 0x01, 0xFD, 0x0A, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xC0, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF4, 0x03, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xC0, 0x0A, 0x00, 0x01, 0x01, 0x01, 0xEF, + 0x01, 0xFD, 0x03, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xE0, 0x01, 0x00, + 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF3, 0x0C, 0x00, 0x01, 0x06, 0x01, 0xFF, + 0x01, 0xF7, 0x01, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xA0, 0x0A, 0x00, + 0x01, 0x2A, 0x02, 0xAA, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x10, 0x01, 0xBF, + 0x01, 0xFF, 0x01, 0xCA, 0x01, 0xAA, 0x01, 0xA5, 0x08, 0x00, 0x01, 0x4F, + 0x04, 0xFF, 0x01, 0x83, 0x04, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x3C, + 0x02, 0xCC, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0xFF, 0x01, 0xFC, + 0x02, 0xCC, 0x01, 0xC6, 0x0B, 0x00, 0x01, 0x03, 0x03, 0xFF, 0x01, 0x70, + 0x0F, 0x00, 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xFE, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0xF5, 0x0C, 0x00, 0x01, 0x01, 0x03, 0x11, 0x01, 0x1E, + 0x01, 0xFF, 0x01, 0xF3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00, 0x01, 0x4F, + 0x09, 0xFF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x4F, 0x09, 0xFF, 0x01, 0xF8, + 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7E, 0x01, 0xFF, 0x01, 0xF8, + 0x03, 0x77, 0x01, 0x73, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, + 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, + 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, + 0x10, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x08, + 0x01, 0x99, 0x01, 0x91, 0xC9, 0x00, +#endif // TOUCH_UI_UTF8_CURRENCY + +#if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) + /* 25 SUPERSCRIPT_ONE */ + 0x99, 0x00, 0x01, 0x01, 0x01, 0x36, 0x01, 0x9B, 0x01, 0xBB, 0x01, 0x20, + 0x0E, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, 0x0E, 0x00, 0x01, 0x3F, + 0x01, 0xFE, 0x01, 0xBE, 0x01, 0xFF, 0x01, 0x20, 0x0E, 0x00, 0x01, 0x14, + 0x01, 0x10, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x10, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x11, 0x01, 0x1C, 0x01, 0xFF, + 0x01, 0x31, 0x01, 0x11, 0x0D, 0x00, 0x01, 0x0D, 0x05, 0xFF, 0x01, 0x40, + 0x0C, 0x00, 0x01, 0x0D, 0x05, 0xFF, 0x01, 0x40, 0x0C, 0x00, 0x01, 0x01, + 0x05, 0x22, 0xFF, 0x00, 0xC2, 0x00, + + /* 26 SUPERSCRIPT_TWO */ + 0x88, 0x00, 0x01, 0x01, 0x10, 0x00, 0x01, 0x16, 0x01, 0xAE, 0x01, 0xFF, + 0x01, 0xFD, 0x01, 0x92, 0x0E, 0x00, 0x05, 0xFF, 0x01, 0x60, 0x0D, 0x00, + 0x01, 0xFE, 0x01, 0x84, 0x01, 0x22, 0x01, 0x5C, 0x01, 0xFF, 0x01, 0xF3, + 0x0D, 0x00, 0x01, 0x50, 0x03, 0x00, 0x01, 0xCF, 0x01, 0xFA, 0x11, 0x00, + 0x01, 0x5F, 0x01, 0xFC, 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFB, 0x11, 0x00, + 0x01, 0xCF, 0x01, 0xF4, 0x10, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x6F, 0x01, 0xFE, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x05, + 0x01, 0xFF, 0x01, 0xE2, 0x10, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x01, 0x30, + 0x0F, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xE3, 0x10, 0x00, 0x01, 0x6F, + 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xD1, + 0x10, 0x00, 0x01, 0xAF, 0x01, 0xFD, 0x01, 0x43, 0x03, 0x33, 0x0C, 0x00, + 0x01, 0x01, 0x06, 0xFF, 0x0C, 0x00, 0x01, 0x01, 0x06, 0xFF, 0x0D, 0x00, + 0x06, 0x22, 0xFF, 0x00, 0xC2, 0x00, + + /* 27 SUPERSCRIPT_THREE */ + 0x88, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x39, 0x01, 0xCE, + 0x02, 0xFF, 0x01, 0xB5, 0x0E, 0x00, 0x01, 0x7F, 0x04, 0xFF, 0x01, 0xB0, + 0x0D, 0x00, 0x01, 0x6B, 0x01, 0x73, 0x01, 0x22, 0x01, 0x38, 0x01, 0xFF, + 0x01, 0xF9, 0x11, 0x00, 0x01, 0x5F, 0x01, 0xFF, 0x11, 0x00, 0x01, 0x0F, + 0x01, 0xFF, 0x11, 0x00, 0x01, 0x4F, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x27, + 0x01, 0xFF, 0x01, 0xF3, 0x0E, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xFA, + 0x01, 0x20, 0x0E, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xFB, 0x01, 0x40, + 0x0E, 0x00, 0x01, 0x01, 0x01, 0x23, 0x01, 0x49, 0x01, 0xFF, 0x01, 0xF6, + 0x11, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x50, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x60, + 0x10, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x40, 0x0C, 0x00, 0x01, 0xA4, + 0x02, 0x00, 0x01, 0x05, 0x01, 0xDF, 0x01, 0xFD, 0x0D, 0x00, 0x02, 0xFF, + 0x01, 0xDE, 0x02, 0xFF, 0x01, 0xE3, 0x0D, 0x00, 0x01, 0xAE, 0x03, 0xFF, + 0x01, 0xE9, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x24, 0x01, 0x55, 0x01, 0x52, + 0xFF, 0x00, 0xC4, 0x00, +#endif // TOUCH_UI_UTF8_SUPERSCRIPTS + +#if ENABLED(TOUCH_UI_UTF8_ORDINALS) + /* 28 MASCULINE_ORDINAL */ + 0x89, 0x00, 0x01, 0x01, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x01, 0x01, 0x8D, + 0x02, 0xFF, 0x01, 0xB4, 0x0E, 0x00, 0x01, 0x4F, 0x04, 0xFF, 0x01, 0xA0, + 0x0C, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x63, 0x01, 0x48, + 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xA0, + 0x02, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x0B, 0x00, 0x01, 0x6F, + 0x01, 0xFE, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xD0, 0x0B, 0x00, + 0x01, 0xBF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0xFF, 0x01, 0xF2, 0x0B, 0x00, + 0x01, 0xEF, 0x01, 0xF3, 0x04, 0x00, 0x01, 0xCF, 0x01, 0xF6, 0x0B, 0x00, + 0x01, 0xFF, 0x01, 0xF1, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xF7, 0x0B, 0x00, + 0x01, 0xFF, 0x01, 0xF1, 0x04, 0x00, 0x01, 0xAF, 0x01, 0xF7, 0x0B, 0x00, + 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xBF, 0x01, 0xF6, 0x0B, 0x00, + 0x01, 0xCF, 0x01, 0xF6, 0x04, 0x00, 0x01, 0xEF, 0x01, 0xF4, 0x0B, 0x00, + 0x01, 0x8F, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xF0, + 0x0B, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0x1D, + 0x01, 0xFF, 0x01, 0x90, 0x0B, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xF8, + 0x01, 0x10, 0x01, 0x04, 0x01, 0xDF, 0x01, 0xFE, 0x01, 0x10, 0x0C, 0x00, + 0x01, 0xAF, 0x04, 0xFF, 0x01, 0xE3, 0x0D, 0x00, 0x01, 0x05, 0x01, 0xDF, + 0x02, 0xFF, 0x01, 0xFA, 0x01, 0x10, 0x0E, 0x00, 0x01, 0x02, 0x01, 0x56, + 0x01, 0x64, 0x21, 0x00, 0x01, 0x16, 0x06, 0x66, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x3F, 0x06, 0xFF, + 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x01, 0x06, 0x11, 0xFF, 0x00, 0x75, 0x00, + + /* 29 FEMININE_ORDINAL */ + 0x89, 0x00, 0x01, 0x12, 0x01, 0x10, 0x0F, 0x00, 0x01, 0x49, 0x01, 0xDF, + 0x02, 0xFF, 0x01, 0xB4, 0x0D, 0x00, 0x01, 0x07, 0x05, 0xFF, 0x01, 0xA0, + 0x0C, 0x00, 0x01, 0x07, 0x01, 0xFC, 0x01, 0x74, 0x01, 0x33, 0x01, 0x59, + 0x01, 0xFF, 0x01, 0xF8, 0x0C, 0x00, 0x01, 0x03, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x10, 0x10, 0x00, 0x01, 0x09, 0x01, 0xFF, + 0x01, 0x50, 0x0E, 0x00, 0x01, 0x01, 0x01, 0x11, 0x01, 0x16, 0x01, 0xFF, + 0x01, 0x80, 0x0C, 0x00, 0x01, 0x05, 0x01, 0xAE, 0x04, 0xFF, 0x01, 0x90, + 0x0B, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x05, 0xFF, 0x01, 0xA0, 0x0B, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0xE9, 0x01, 0x65, 0x01, 0x44, 0x01, 0x48, + 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x5F, 0x01, 0xFD, 0x01, 0x10, + 0x02, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x9F, + 0x01, 0xF6, 0x03, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xA0, 0x0B, 0x00, + 0x01, 0xAF, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x01, 0xA0, + 0x0B, 0x00, 0x01, 0x9F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xAF, 0x01, 0xFF, + 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0xA2, 0x01, 0x00, + 0x01, 0x3B, 0x02, 0xFF, 0x01, 0xA0, 0x0B, 0x00, 0x01, 0x0A, 0x04, 0xFF, + 0x01, 0xE7, 0x01, 0xFF, 0x01, 0xA0, 0x0C, 0x00, 0x01, 0x8F, 0x02, 0xFF, + 0x01, 0xF9, 0x01, 0x15, 0x01, 0xFF, 0x01, 0xA0, 0x0D, 0x00, 0x01, 0x46, + 0x01, 0x64, 0x02, 0x00, 0x01, 0x11, 0x1F, 0x00, 0x01, 0x16, 0x06, 0x66, + 0x01, 0x40, 0x0B, 0x00, 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, + 0x01, 0x3F, 0x06, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x01, 0x06, 0x11, + 0xFF, 0x00, 0x75, 0x00, +#endif // TOUCH_UI_UTF8_ORDINALS + +#if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) + /* 30 COPYRIGHT_SIGN */ + 0xA0, 0x00, 0x01, 0x01, 0x01, 0x45, 0x01, 0x76, 0x01, 0x43, 0x0E, 0x00, + 0x01, 0x28, 0x01, 0xDF, 0x03, 0xFF, 0x01, 0xE9, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xDB, 0x01, 0xAB, 0x01, 0xCE, 0x01, 0xFF, + 0x01, 0xFB, 0x01, 0x30, 0x09, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFB, + 0x01, 0x50, 0x03, 0x00, 0x01, 0x38, 0x01, 0xFF, 0x01, 0xF7, 0x09, 0x00, + 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x19, 0x01, 0xFF, + 0x01, 0xA0, 0x07, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xA0, 0x07, 0x00, + 0x01, 0x5F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xF8, 0x03, 0x00, + 0x01, 0x46, 0x01, 0x88, 0x01, 0x65, 0x01, 0x10, 0x01, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0x80, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x9F, 0x03, 0xFF, 0x01, 0xFC, 0x01, 0x60, 0x01, 0x00, + 0x01, 0x4F, 0x01, 0xF4, 0x05, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, + 0x01, 0x4E, 0x02, 0xFF, 0x01, 0xED, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, + 0x01, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x1F, 0x01, 0xF4, + 0x01, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x61, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x4A, 0x01, 0xA0, 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, + 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x01, 0xC1, 0x07, 0x00, 0x01, 0x7F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x60, 0x01, 0x00, 0x01, 0x7F, 0x01, 0xFF, 0x01, 0x10, 0x07, 0x00, + 0x01, 0x1F, 0x01, 0xF0, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x00, + 0x01, 0xDF, 0x01, 0xF9, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xF4, 0x03, 0x00, + 0x01, 0x01, 0x01, 0xFE, 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF4, + 0x08, 0x00, 0x01, 0x0A, 0x01, 0xF6, 0x03, 0x00, 0x01, 0x03, 0x01, 0xFD, + 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF1, 0x08, 0x00, 0x01, 0x08, + 0x01, 0xF8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x03, + 0x01, 0xFF, 0x01, 0xF0, 0x08, 0x00, 0x01, 0x07, 0x01, 0xF9, 0x03, 0x00, + 0x01, 0x03, 0x01, 0xFD, 0x01, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF1, + 0x08, 0x00, 0x01, 0x08, 0x01, 0xF8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xFE, + 0x01, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF3, 0x08, 0x00, 0x01, 0x09, + 0x01, 0xF7, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x10, 0x01, 0x00, 0x01, 0xDF, + 0x01, 0xF8, 0x08, 0x00, 0x01, 0x0C, 0x01, 0xF5, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x60, 0x01, 0x00, 0x01, 0x8F, 0x01, 0xFE, 0x01, 0x10, 0x07, 0x00, + 0x01, 0x1F, 0x01, 0xF1, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xB0, 0x01, 0x00, + 0x01, 0x1F, 0x01, 0xFF, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x6F, 0x01, 0xC0, + 0x04, 0x00, 0x01, 0x1F, 0x01, 0xF4, 0x01, 0x00, 0x01, 0x05, 0x01, 0xFF, + 0x01, 0xFD, 0x01, 0x50, 0x02, 0x00, 0x01, 0x29, 0x01, 0xA0, 0x02, 0x00, + 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, + 0x01, 0x6F, 0x02, 0xFF, 0x01, 0xDB, 0x01, 0xCE, 0x01, 0xFF, 0x01, 0xB0, + 0x01, 0x00, 0x01, 0x07, 0x01, 0xFD, 0x05, 0x00, 0x01, 0x01, 0x01, 0xEF, + 0x01, 0x90, 0x01, 0x00, 0x01, 0x02, 0x01, 0xBF, 0x03, 0xFF, 0x01, 0xFE, + 0x01, 0x70, 0x01, 0x00, 0x01, 0x4F, 0x01, 0xF4, 0x06, 0x00, 0x01, 0x4F, + 0x01, 0xF7, 0x02, 0x00, 0x01, 0x01, 0x01, 0x58, 0x01, 0x9A, 0x01, 0x86, + 0x01, 0x30, 0x01, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0x80, 0x06, 0x00, + 0x01, 0x06, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFB, + 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, + 0x01, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFA, + 0x01, 0x40, 0x03, 0x00, 0x01, 0x27, 0x01, 0xEF, 0x01, 0xF8, 0x0A, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCA, 0x01, 0x9A, 0x01, 0xBE, 0x01, 0xFF, + 0x01, 0xFC, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x29, 0x01, 0xDF, 0x03, 0xFF, + 0x01, 0xFA, 0x01, 0x40, 0x0D, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, + 0x01, 0x53, 0xC5, 0x00, + + /* 31 REGISTERED_SIGN */ + 0xA0, 0x00, 0x01, 0x02, 0x01, 0x46, 0x01, 0x76, 0x01, 0x53, 0x0E, 0x00, + 0x01, 0x28, 0x01, 0xDF, 0x03, 0xFF, 0x01, 0xEA, 0x01, 0x40, 0x0B, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCB, 0x01, 0x9A, 0x01, 0xCE, 0x01, 0xFF, + 0x01, 0xFC, 0x01, 0x30, 0x09, 0x00, 0x01, 0x04, 0x01, 0xEF, 0x01, 0xFA, + 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xFF, 0x01, 0xF8, 0x09, 0x00, + 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, 0x01, 0x18, 0x01, 0xFF, + 0x01, 0xA0, 0x07, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, + 0x01, 0x4F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3F, 0x01, 0xF7, 0x01, 0x00, + 0x01, 0x13, 0x02, 0x33, 0x01, 0x32, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0x80, 0x06, 0x00, 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x7F, + 0x03, 0xFF, 0x01, 0xFD, 0x01, 0x81, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xF5, + 0x05, 0x00, 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFF, + 0x01, 0xDD, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x30, 0x01, 0x00, + 0x01, 0x08, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x1F, 0x01, 0xF4, 0x02, 0x00, + 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x3C, 0x01, 0xFF, 0x01, 0xD0, + 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, + 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xF3, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x60, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xFF, + 0x01, 0xF4, 0x02, 0x00, 0x01, 0x1F, 0x01, 0xF0, 0x04, 0x00, 0x01, 0xFF, + 0x01, 0x10, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, 0x01, 0xFF, + 0x01, 0xF2, 0x02, 0x00, 0x01, 0x0C, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x01, + 0x01, 0xFE, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xE0, 0x02, 0x00, 0x01, 0x0A, 0x01, 0xF6, 0x03, 0x00, + 0x01, 0x03, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFD, 0x01, 0x88, + 0x01, 0x9A, 0x01, 0xEF, 0x01, 0xFE, 0x01, 0x30, 0x02, 0x00, 0x01, 0x08, + 0x01, 0xF8, 0x03, 0x00, 0x01, 0x04, 0x01, 0xFC, 0x03, 0x00, 0x01, 0x7F, + 0x03, 0xFF, 0x01, 0xFE, 0x01, 0x91, 0x03, 0x00, 0x01, 0x07, 0x01, 0xF9, + 0x03, 0x00, 0x01, 0x03, 0x01, 0xFD, 0x03, 0x00, 0x01, 0x7F, 0x01, 0xFC, + 0x01, 0x78, 0x01, 0xDF, 0x01, 0xFD, 0x01, 0x20, 0x03, 0x00, 0x01, 0x08, + 0x01, 0xF8, 0x03, 0x00, 0x01, 0x01, 0x01, 0xFE, 0x03, 0x00, 0x01, 0x7F, + 0x01, 0xFA, 0x01, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xC0, 0x03, 0x00, + 0x01, 0x09, 0x01, 0xF6, 0x04, 0x00, 0x01, 0xFF, 0x01, 0x10, 0x02, 0x00, + 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xF8, 0x03, 0x00, + 0x01, 0x0C, 0x01, 0xF5, 0x04, 0x00, 0x01, 0xBF, 0x01, 0x60, 0x02, 0x00, + 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x30, + 0x02, 0x00, 0x01, 0x1F, 0x01, 0xF1, 0x04, 0x00, 0x01, 0x6F, 0x01, 0xC0, + 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x09, 0x01, 0xFF, + 0x01, 0xD0, 0x02, 0x00, 0x01, 0x6F, 0x01, 0xB0, 0x04, 0x00, 0x01, 0x1F, + 0x01, 0xF4, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x02, 0x00, 0x01, 0x01, + 0x01, 0xEF, 0x01, 0xF7, 0x02, 0x00, 0x01, 0xEF, 0x01, 0x60, 0x04, 0x00, + 0x01, 0x08, 0x01, 0xFD, 0x02, 0x00, 0x01, 0x7F, 0x01, 0xFA, 0x03, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x20, 0x01, 0x08, 0x01, 0xFE, 0x06, 0x00, + 0x01, 0xEF, 0x01, 0xA0, 0x01, 0x00, 0x01, 0x5A, 0x01, 0xA6, 0x03, 0x00, + 0x01, 0x09, 0x01, 0xAA, 0x01, 0x60, 0x01, 0x4F, 0x01, 0xF4, 0x06, 0x00, + 0x01, 0x3F, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xFF, 0x01, 0x80, + 0x06, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0x90, 0x07, 0x00, 0x01, 0x4F, + 0x01, 0xFB, 0x08, 0x00, 0x01, 0x6F, 0x01, 0xFC, 0x01, 0x30, 0x05, 0x00, + 0x01, 0x19, 0x01, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x04, 0x01, 0xEF, + 0x01, 0xFA, 0x01, 0x40, 0x03, 0x00, 0x01, 0x38, 0x01, 0xEF, 0x01, 0xF8, + 0x0A, 0x00, 0x01, 0x19, 0x02, 0xFF, 0x01, 0xCB, 0x01, 0x9A, 0x01, 0xCE, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x30, 0x0B, 0x00, 0x01, 0x28, 0x01, 0xDF, + 0x03, 0xFF, 0x01, 0xEA, 0x01, 0x40, 0x0D, 0x00, 0x01, 0x02, 0x01, 0x45, + 0x01, 0x76, 0x01, 0x43, 0xC5, 0x00, +#endif // TOUCH_UI_UTF8_COPYRIGHT + +#if ENABLED(TOUCH_UI_UTF8_MATHEMATICS) + /* 32 PLUS_MINUS_SIGN */ + 0xEB, 0x00, 0x01, 0x02, 0x01, 0x77, 0x01, 0x70, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x0B, 0x00, 0x01, 0x6A, 0x04, 0xAA, 0x01, 0xAC, + 0x01, 0xFF, 0x01, 0xFA, 0x05, 0xAA, 0x01, 0x20, 0x05, 0x00, 0x01, 0x9F, + 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, + 0x05, 0x00, 0x01, 0x7C, 0x04, 0xCC, 0x01, 0xCD, 0x01, 0xFF, 0x01, 0xFC, + 0x05, 0xCC, 0x01, 0x30, 0x0A, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF0, + 0x10, 0x00, 0x01, 0x03, 0x01, 0x99, 0x01, 0x90, 0x44, 0x00, 0x01, 0x9F, + 0x0C, 0xFF, 0x01, 0x30, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, + 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x47, + 0x0C, 0x77, 0x01, 0x10, 0xC1, 0x00, + + /* 33 MULTIPLICATION_SIGN */ + 0xFF, 0x00, 0x0E, 0x00, 0x01, 0x09, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x03, + 0x01, 0xE4, 0x08, 0x00, 0x01, 0x9F, 0x01, 0xFB, 0x07, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0x40, 0x06, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x05, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xA0, + 0x07, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0xFB, 0x08, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x03, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, + 0x09, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x03, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0xFB, 0x0A, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB0, 0x01, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, + 0x0B, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x3E, + 0x01, 0xFF, 0x01, 0xFB, 0x0C, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB3, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0D, 0x00, 0x01, 0x3E, + 0x03, 0xFF, 0x01, 0xFB, 0x0E, 0x00, 0x01, 0x03, 0x01, 0xEF, 0x02, 0xFF, + 0x01, 0xB0, 0x0F, 0x00, 0x01, 0x5F, 0x02, 0xFF, 0x01, 0x10, 0x0E, 0x00, + 0x01, 0x03, 0x01, 0xEF, 0x02, 0xFF, 0x01, 0xB0, 0x0E, 0x00, 0x01, 0x3E, + 0x03, 0xFF, 0x01, 0xFB, 0x0D, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xB3, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, + 0x0B, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x01, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x0A, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xFB, 0x03, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, + 0x09, 0x00, 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x03, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x08, 0x00, 0x01, 0x2E, + 0x01, 0xFF, 0x01, 0xFB, 0x05, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0xFB, + 0x07, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xB0, 0x05, 0x00, + 0x01, 0x02, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xA0, 0x07, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x07, 0x00, 0x01, 0x2E, 0x01, 0xFF, 0x01, 0x40, 0x07, 0x00, + 0x01, 0x09, 0x01, 0xB0, 0x07, 0x00, 0x01, 0x02, 0x01, 0xE4, 0xE9, 0x00, + + /* 34 DIVISION_SIGN */ + 0xFF, 0x00, 0x25, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x76, 0x10, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, + 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, + 0x01, 0x76, 0x31, 0x00, 0x01, 0x24, 0x0C, 0x44, 0x01, 0x10, 0x05, 0x00, + 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, + 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, + 0x01, 0x12, 0x0C, 0x22, 0x31, 0x00, 0x01, 0x18, 0x01, 0x88, 0x01, 0x87, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0xFC, 0x10, 0x00, 0x01, 0x16, + 0x01, 0x66, 0x01, 0x65, 0xFF, 0x00, 0x01, 0x00, +#endif // TOUCH_UI_UTF8_MATHEMATICS + +#if ENABLED(TOUCH_UI_UTF8_FRACTIONS) + /* 35 FRACTION_QUARTER */ + 0x92, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x40, 0x04, 0x00, 0x01, 0x04, + 0x01, 0x79, 0x01, 0xCE, 0x01, 0xEE, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x90, 0x04, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, + 0x07, 0x00, 0x01, 0x3F, 0x01, 0xFE, 0x01, 0x10, 0x04, 0x00, 0x01, 0x3F, + 0x01, 0xDB, 0x01, 0x8D, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0xDF, + 0x01, 0xF5, 0x05, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0x1F, 0x01, 0xFF, + 0x01, 0x20, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, + 0x01, 0xAF, 0x01, 0xF8, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x05, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE1, 0x08, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, + 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x7F, + 0x01, 0xFC, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, + 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFE, + 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0xDF, + 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, 0x04, 0x00, 0x01, 0x37, 0x01, 0x77, + 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5D, 0x01, 0xFF, 0x01, 0x75, + 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x20, + 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0xFF, 0x02, 0x00, 0x01, 0x0D, + 0x05, 0xFF, 0x01, 0x40, 0x01, 0x00, 0x01, 0xAF, 0x01, 0xF8, 0x04, 0x00, + 0x01, 0x0C, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x0C, 0x05, 0xEE, 0x01, 0x40, + 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, 0x04, 0x00, 0x01, 0x8F, 0x01, 0xBE, + 0x01, 0xFF, 0x09, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x03, 0x00, + 0x01, 0x04, 0x01, 0xFE, 0x01, 0x1E, 0x01, 0xFF, 0x09, 0x00, 0x01, 0x7F, + 0x01, 0xFC, 0x04, 0x00, 0x01, 0x1E, 0x01, 0xF4, 0x01, 0x0E, 0x01, 0xFF, + 0x08, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xBF, + 0x01, 0x80, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFC, 0x01, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x08, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x04, 0x00, 0x01, 0x4F, + 0x01, 0xE1, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0xDF, + 0x01, 0xF5, 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x0E, 0x01, 0xFF, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, + 0x03, 0x00, 0x01, 0x0B, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x07, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3F, + 0x01, 0xF8, 0x02, 0x88, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0x88, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x4F, 0x06, 0xFF, 0x05, 0x00, + 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, 0x04, 0x00, 0x01, 0x2A, 0x03, 0xAA, + 0x01, 0xAF, 0x01, 0xFF, 0x01, 0xAA, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0x50, 0x08, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x06, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x01, 0x05, 0x01, 0x66, + 0xBF, 0x00, + + /* 36 FRACTION_HALF */ + 0x92, 0x00, 0x01, 0x01, 0x01, 0x44, 0x01, 0x40, 0x04, 0x00, 0x01, 0x04, + 0x01, 0x7A, 0x01, 0xCE, 0x01, 0xEE, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x80, 0x04, 0x00, 0x01, 0x3F, 0x03, 0xFF, 0x01, 0x20, + 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x3F, 0x01, 0xDA, + 0x01, 0x7D, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0xDF, 0x01, 0xF5, + 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x06, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x01, 0x20, 0x07, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x06, 0x00, 0x01, 0xAF, 0x01, 0xF8, 0x08, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x04, 0x01, 0xFF, + 0x01, 0xE0, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, + 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x05, 0x00, 0x01, 0x7F, 0x01, 0xFC, 0x09, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF2, + 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x80, 0x09, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x20, + 0x04, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x0A, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x20, 0x04, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x0A, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xB0, + 0x01, 0x00, 0x01, 0x04, 0x01, 0x8A, 0x01, 0xCC, 0x01, 0xA7, 0x01, 0x10, + 0x02, 0x00, 0x01, 0x04, 0x01, 0x55, 0x01, 0x5D, 0x01, 0xFF, 0x01, 0x75, + 0x01, 0x55, 0x01, 0x10, 0x01, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, + 0x01, 0x06, 0x04, 0xFF, 0x01, 0xF7, 0x02, 0x00, 0x01, 0x0D, 0x05, 0xFF, + 0x01, 0x40, 0x01, 0x00, 0x01, 0xBF, 0x01, 0xF8, 0x01, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xA7, 0x01, 0x68, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0x70, + 0x01, 0x00, 0x01, 0x0B, 0x05, 0xDD, 0x01, 0x40, 0x01, 0x04, 0x01, 0xFF, + 0x01, 0xE0, 0x01, 0x00, 0x01, 0x05, 0x01, 0x60, 0x02, 0x00, 0x01, 0x08, + 0x01, 0xFF, 0x01, 0xF1, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, + 0x06, 0x00, 0x01, 0xEF, 0x01, 0xF4, 0x08, 0x00, 0x01, 0x7F, 0x01, 0xFB, + 0x07, 0x00, 0x01, 0xCF, 0x01, 0xF3, 0x07, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xF2, 0x06, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xE0, 0x07, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x06, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0x50, 0x07, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x07, 0x00, 0x01, 0xAF, + 0x01, 0xFA, 0x08, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x06, 0x00, 0x01, 0x09, + 0x01, 0xFF, 0x01, 0xC0, 0x07, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, + 0x06, 0x00, 0x01, 0x8F, 0x01, 0xFD, 0x01, 0x10, 0x07, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x20, 0x05, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xC1, + 0x08, 0x00, 0x01, 0xBF, 0x01, 0xF8, 0x06, 0x00, 0x01, 0xAF, 0x01, 0xFB, + 0x08, 0x00, 0x01, 0x05, 0x01, 0xFF, 0x01, 0xE0, 0x05, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0xA0, 0x08, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, + 0x04, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xF9, 0x09, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x05, 0x00, 0x01, 0x09, 0x01, 0xFF, 0x01, 0xFE, 0x03, 0xEE, + 0x01, 0xE6, 0x04, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF2, 0x05, 0x00, + 0x01, 0x0A, 0x05, 0xFF, 0x01, 0xF7, 0x04, 0x00, 0x01, 0x0A, 0x01, 0xEE, + 0x01, 0x70, 0x05, 0x00, 0x01, 0x04, 0x05, 0x66, 0x01, 0x62, 0xBE, 0x00, + + /* 37 FRACTION_THREE_FOURTHS */ + 0x87, 0x00, 0x01, 0x02, 0x01, 0x34, 0x01, 0x42, 0x08, 0x00, 0x01, 0x01, + 0x01, 0x55, 0x01, 0x50, 0x04, 0x00, 0x01, 0x4C, 0x03, 0xFF, 0x01, 0xE9, + 0x01, 0x10, 0x06, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0x80, 0x04, 0x00, + 0x01, 0x7F, 0x01, 0xFF, 0x01, 0xFE, 0x02, 0xFF, 0x01, 0xE2, 0x06, 0x00, + 0x01, 0x4F, 0x01, 0xFE, 0x05, 0x00, 0x01, 0x47, 0x01, 0x30, 0x01, 0x00, + 0x01, 0x05, 0x01, 0xEF, 0x01, 0xFB, 0x06, 0x00, 0x01, 0xDF, 0x01, 0xF5, + 0x09, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xB0, 0x09, 0x00, 0x01, 0x1F, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x20, 0x09, 0x00, 0x01, 0x6F, 0x01, 0xFB, 0x05, 0x00, + 0x01, 0xBF, 0x01, 0xF8, 0x07, 0x00, 0x01, 0x03, 0x01, 0x44, 0x01, 0x5A, + 0x01, 0xFF, 0x01, 0xD1, 0x04, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, + 0x07, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x01, 0xE7, 0x05, 0x00, 0x01, 0x0D, + 0x01, 0xFF, 0x01, 0x50, 0x07, 0x00, 0x01, 0x0B, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0xFE, 0x01, 0x70, 0x04, 0x00, 0x01, 0x7F, 0x01, 0xFB, 0x0A, 0x00, + 0x01, 0x16, 0x01, 0xDF, 0x01, 0xF9, 0x03, 0x00, 0x01, 0x02, 0x01, 0xFF, + 0x01, 0xF2, 0x0B, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0x20, 0x02, 0x00, + 0x01, 0x0B, 0x01, 0xFF, 0x01, 0x80, 0x0B, 0x00, 0x01, 0x0A, 0x01, 0xFF, + 0x01, 0x60, 0x02, 0x00, 0x01, 0x4F, 0x01, 0xFE, 0x0C, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0x60, 0x02, 0x00, 0x01, 0xDF, 0x01, 0xF5, 0x0C, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x30, 0x01, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xB0, 0x04, 0x00, 0x01, 0x47, 0x01, 0x77, 0x02, 0x00, 0x01, 0xD7, + 0x01, 0x42, 0x01, 0x01, 0x01, 0x38, 0x01, 0xEF, 0x01, 0xFC, 0x02, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x02, 0x02, 0xFF, + 0x02, 0x00, 0x05, 0xFF, 0x01, 0xC1, 0x02, 0x00, 0x01, 0xBF, 0x01, 0xF8, + 0x04, 0x00, 0x01, 0x0C, 0x02, 0xFF, 0x02, 0x00, 0x01, 0x7B, 0x01, 0xEF, + 0x02, 0xFF, 0x01, 0xB6, 0x02, 0x00, 0x01, 0x04, 0x01, 0xFF, 0x01, 0xE0, + 0x04, 0x00, 0x01, 0x9F, 0x01, 0xBE, 0x01, 0xFF, 0x04, 0x00, 0x01, 0x22, + 0x01, 0x10, 0x03, 0x00, 0x01, 0x0D, 0x01, 0xFF, 0x01, 0x50, 0x03, 0x00, + 0x01, 0x04, 0x01, 0xFE, 0x01, 0x1E, 0x01, 0xFF, 0x09, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x04, 0x00, 0x01, 0x1E, 0x01, 0xF3, 0x01, 0x0E, 0x01, 0xFF, + 0x08, 0x00, 0x01, 0x02, 0x01, 0xFF, 0x01, 0xF2, 0x04, 0x00, 0x01, 0xCF, + 0x01, 0x70, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0x0B, 0x01, 0xFF, + 0x01, 0x80, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFB, 0x01, 0x00, 0x01, 0x0E, + 0x01, 0xFF, 0x08, 0x00, 0x01, 0x5F, 0x01, 0xFE, 0x04, 0x00, 0x01, 0x4F, + 0x01, 0xE1, 0x01, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x08, 0x00, 0x01, 0xDF, + 0x01, 0xF4, 0x03, 0x00, 0x01, 0x01, 0x01, 0xEF, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x0E, 0x01, 0xFF, 0x07, 0x00, 0x01, 0x08, 0x01, 0xFF, 0x01, 0xB0, + 0x03, 0x00, 0x01, 0x0B, 0x01, 0xF8, 0x02, 0x00, 0x01, 0x0E, 0x01, 0xFF, + 0x07, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x20, 0x03, 0x00, 0x01, 0x3F, + 0x01, 0xF9, 0x02, 0x99, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x99, 0x06, 0x00, + 0x01, 0xBF, 0x01, 0xF8, 0x04, 0x00, 0x01, 0x4F, 0x06, 0xFF, 0x05, 0x00, + 0x01, 0x05, 0x01, 0xFF, 0x01, 0xD0, 0x04, 0x00, 0x01, 0x29, 0x03, 0x99, + 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x99, 0x05, 0x00, 0x01, 0x0D, 0x01, 0xFF, + 0x01, 0x40, 0x08, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x06, 0x00, 0x01, 0x8F, + 0x01, 0xFB, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, 0x01, 0x02, + 0x01, 0xFF, 0x01, 0xF2, 0x09, 0x00, 0x01, 0x0E, 0x01, 0xFF, 0x05, 0x00, + 0x01, 0x0A, 0x01, 0xEE, 0x01, 0x70, 0x09, 0x00, 0x01, 0x04, 0x01, 0x55, + 0xBF, 0x00, +#endif // TOUCH_UI_UTF8_FRACTIONS + +#if ENABLED(TOUCH_UI_UTF8_SYMBOLS) + /* 38 MICRON_SIGN */ + 0xFF, 0x00, 0x1F, 0x00, 0x01, 0x02, 0x01, 0x44, 0x01, 0x40, 0x05, 0x00, + 0x01, 0x14, 0x01, 0x44, 0x01, 0x10, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, + 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x05, 0x00, 0x01, 0x4F, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF4, 0x05, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF6, 0x05, 0x00, 0x01, 0x9F, 0x01, 0xFF, 0x01, 0x70, 0x08, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xFA, 0x05, 0x00, 0x01, 0xEF, 0x01, 0xFF, + 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xFF, 0x01, 0x20, 0x03, 0x00, + 0x01, 0x07, 0x02, 0xFF, 0x01, 0x70, 0x08, 0x00, 0x01, 0x07, 0x02, 0xFF, + 0x01, 0xD2, 0x03, 0x00, 0x01, 0x6F, 0x02, 0xFF, 0x01, 0xA0, 0x08, 0x00, + 0x01, 0x07, 0x03, 0xFF, 0x01, 0xA6, 0x01, 0x55, 0x01, 0x8D, 0x03, 0xFF, + 0x01, 0xF9, 0x01, 0xA4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF7, + 0x05, 0xFF, 0x01, 0x5D, 0x02, 0xFF, 0x01, 0xF4, 0x07, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xF3, 0x01, 0x5F, 0x03, 0xFF, 0x01, 0xF5, 0x01, 0x06, + 0x02, 0xFF, 0x01, 0xF4, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, + 0x01, 0x01, 0x01, 0x7C, 0x01, 0xDD, 0x01, 0xC7, 0x01, 0x10, 0x01, 0x00, + 0x01, 0x6C, 0x01, 0xDB, 0x01, 0x50, 0x07, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, + 0x01, 0x07, 0x01, 0xFF, 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xFF, + 0x01, 0xF3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xEE, 0x01, 0xE3, 0x35, 0x00, + + /* 39 PILCROW_SIGN */ + 0x9C, 0x00, 0x01, 0x16, 0x01, 0x9B, 0x04, 0xCC, 0x01, 0xCA, 0x0B, 0x00, + 0x01, 0x19, 0x06, 0xFF, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x03, 0x01, 0xEF, + 0x03, 0xFF, 0x01, 0xFB, 0x01, 0xAA, 0x01, 0xAF, 0x01, 0xFD, 0x0A, 0x00, + 0x01, 0x2E, 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, + 0x0A, 0x00, 0x01, 0xBF, 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, + 0x01, 0xFD, 0x09, 0x00, 0x01, 0x03, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x08, 0x05, 0xFF, 0x01, 0xF2, + 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0B, 0x05, 0xFF, + 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, 0x01, 0x0C, + 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x09, 0x00, + 0x01, 0x0B, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, + 0x09, 0x00, 0x01, 0x0A, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, + 0x01, 0xFD, 0x09, 0x00, 0x01, 0x06, 0x05, 0xFF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0xEF, 0x04, 0xFF, 0x01, 0xF2, + 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x6F, 0x04, 0xFF, + 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0A, 0x00, 0x01, 0x08, + 0x04, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, 0x0B, 0x00, + 0x01, 0x5E, 0x03, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, 0x01, 0xFD, + 0x0C, 0x00, 0x01, 0x6B, 0x02, 0xFF, 0x01, 0xF2, 0x01, 0x00, 0x01, 0x0F, + 0x01, 0xFD, 0x0D, 0x00, 0x01, 0x01, 0x01, 0xCF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0xBF, 0x01, 0xF2, 0x01, 0x00, + 0x01, 0x0F, 0x01, 0xFD, 0x0E, 0x00, 0x01, 0x34, 0x01, 0x40, 0x01, 0x00, + 0x01, 0x04, 0x01, 0x43, 0x7A, 0x00, + + /* 40 BROKEN_BAR */ + 0xAD, 0x00, 0x01, 0x07, 0x01, 0x99, 0x01, 0x60, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x08, 0x01, 0xBB, 0x01, 0x70, 0x6F, 0x00, 0x01, 0x0B, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, + 0x10, 0x00, 0x01, 0x0C, 0x01, 0xFF, 0x01, 0xA0, 0x10, 0x00, 0x01, 0x04, + 0x01, 0x55, 0x01, 0x30, 0x47, 0x00, + + /* 41 SECTION_SIGN */ + 0x89, 0x00, 0x01, 0x35, 0x01, 0x64, 0x01, 0x31, 0x0E, 0x00, 0x01, 0x01, + 0x01, 0x9E, 0x03, 0xFF, 0x01, 0xD9, 0x01, 0x30, 0x0C, 0x00, 0x01, 0x2E, + 0x05, 0xFF, 0x01, 0xB0, 0x0C, 0x00, 0x01, 0xEF, 0x01, 0xFF, 0x01, 0xFB, + 0x01, 0x98, 0x01, 0xAE, 0x01, 0xFF, 0x01, 0xB0, 0x0B, 0x00, 0x01, 0x07, + 0x01, 0xFF, 0x01, 0xFC, 0x01, 0x10, 0x02, 0x00, 0x01, 0x39, 0x01, 0xA0, + 0x0B, 0x00, 0x01, 0x0B, 0x01, 0xFF, 0x01, 0xF2, 0x10, 0x00, 0x01, 0x0C, + 0x01, 0xFF, 0x01, 0xF0, 0x10, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xF3, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x20, 0x10, 0x00, + 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xE4, 0x10, 0x00, 0x01, 0x1D, 0x02, 0xFF, + 0x01, 0xA1, 0x0F, 0x00, 0x01, 0x4E, 0x03, 0xFF, 0x01, 0x70, 0x0D, 0x00, + 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF9, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFD, + 0x01, 0x30, 0x0C, 0x00, 0x01, 0x3F, 0x01, 0xFF, 0x01, 0x60, 0x01, 0x07, + 0x02, 0xFF, 0x01, 0xF8, 0x0C, 0x00, 0x01, 0xBF, 0x01, 0xF9, 0x02, 0x00, + 0x01, 0x19, 0x02, 0xFF, 0x01, 0xC0, 0x0B, 0x00, 0x01, 0xFF, 0x01, 0xF3, + 0x03, 0x00, 0x01, 0x4E, 0x01, 0xFF, 0x01, 0xFB, 0x0A, 0x00, 0x01, 0x01, + 0x01, 0xFF, 0x01, 0xF2, 0x03, 0x00, 0x01, 0x01, 0x01, 0xDF, 0x01, 0xFF, + 0x01, 0x40, 0x09, 0x00, 0x01, 0x01, 0x01, 0xFF, 0x01, 0xF7, 0x04, 0x00, + 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x90, 0x0A, 0x00, 0x01, 0xDF, 0x01, 0xFF, + 0x01, 0x20, 0x03, 0x00, 0x01, 0x0A, 0x01, 0xFF, 0x01, 0xB0, 0x0A, 0x00, + 0x01, 0x6F, 0x01, 0xFF, 0x01, 0xF5, 0x03, 0x00, 0x01, 0x08, 0x01, 0xFF, + 0x01, 0xA0, 0x0A, 0x00, 0x01, 0x0A, 0x02, 0xFF, 0x01, 0x91, 0x02, 0x00, + 0x01, 0x0C, 0x01, 0xFF, 0x01, 0x70, 0x0B, 0x00, 0x01, 0x8F, 0x01, 0xFF, + 0x01, 0xFE, 0x01, 0x60, 0x01, 0x00, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x10, + 0x0B, 0x00, 0x01, 0x03, 0x01, 0xDF, 0x01, 0xFF, 0x01, 0xFD, 0x01, 0x46, + 0x01, 0xFF, 0x01, 0xF5, 0x0D, 0x00, 0x01, 0x07, 0x04, 0xFF, 0x01, 0x50, + 0x0E, 0x00, 0x01, 0x2A, 0x02, 0xFF, 0x01, 0xF5, 0x10, 0x00, 0x01, 0x4E, + 0x01, 0xFF, 0x01, 0xFE, 0x01, 0x20, 0x0F, 0x00, 0x01, 0x01, 0x01, 0xCF, + 0x01, 0xFF, 0x01, 0xC0, 0x10, 0x00, 0x01, 0x1E, 0x01, 0xFF, 0x01, 0xF3, + 0x10, 0x00, 0x01, 0x06, 0x01, 0xFF, 0x01, 0xF6, 0x10, 0x00, 0x01, 0x05, + 0x01, 0xFF, 0x01, 0xF6, 0x0B, 0x00, 0x01, 0x01, 0x04, 0x00, 0x01, 0x0A, + 0x01, 0xFF, 0x01, 0xF3, 0x0B, 0x00, 0x01, 0x08, 0x01, 0xE8, 0x01, 0x20, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x8F, 0x01, 0xFF, 0x01, 0xE0, 0x0B, 0x00, + 0x01, 0x08, 0x01, 0xFF, 0x01, 0xFE, 0x01, 0xCB, 0x01, 0xDF, 0x02, 0xFF, + 0x01, 0x40, 0x0B, 0x00, 0x01, 0x08, 0x05, 0xFF, 0x01, 0xF5, 0x0D, 0x00, + 0x01, 0x49, 0x01, 0xDF, 0x02, 0xFF, 0x01, 0xE8, 0x01, 0x20, 0x0F, 0x00, + 0x01, 0x12, 0x01, 0x21, 0x7F, 0x00, + + /* 42 NOT_SIGN */ + 0xFF, 0x00, 0x7F, 0x00, 0x01, 0x12, 0x0C, 0x22, 0x06, 0x00, 0x01, 0x9F, + 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, + 0x05, 0x00, 0x01, 0x9F, 0x0C, 0xFF, 0x01, 0x40, 0x05, 0x00, 0x01, 0x24, + 0x0A, 0x44, 0x01, 0x6F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, + 0x10, 0x00, 0x01, 0x2F, 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x2F, + 0x01, 0xFF, 0x01, 0x40, 0x10, 0x00, 0x01, 0x17, 0x01, 0x77, 0x01, 0x10, + 0xFF, 0x00, 0x34, 0x00 +#endif // TOUCH_UI_UTF8_SYMBOLS +}; 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 new file mode 100644 index 00000000..a7de06d6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py @@ -0,0 +1,108 @@ +#!/usr/bin/python + +# 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: . + +from __future__ import print_function +from PIL import Image +import argparse +import textwrap + +def pack_rle(data): + """Use run-length encoding to pack the bytes""" + rle = [] + value = data[0] + count = 0 + for i in data: + if i != value or count == 255: + rle.append(count) + rle.append(value) + value = i + count = 1 + else: + count += 1 + rle.append(count) + rle.append(value) + return rle + +class WriteSource: + def __init__(self, lines_in_blocks): + self.blocks = [] + self.values = [] + self.block_size = lines_in_blocks + self.rows = 0 + + def add_pixel(self, value): + self.values.append(value) + + def convert_to_4bpp(self, data, chunk_size = 0): + # Invert the image + data = map(lambda i: 255 - i, data) + # Quanitize 8-bit values into 4-bits + data = map(lambda i: i >> 4, data) + # Make sure there is an even number of elements + if (len(data) & 1) == 1: + result.append(0) + # Combine each two adjacent values into one + i = iter(data) + data = map(lambda a, b: a << 4 | b, i ,i) + # Pack the data + data = pack_rle(data) + # Convert values into hex strings + return map(lambda a: "0x" + format(a, '02x'), data) + + def end_row(self, y): + # Pad each row into even number of values + if len(self.values) & 1: + self.values.append(0) + + self.rows += 1 + if self.block_size and (self.rows % self.block_size) == 0: + self.blocks.append(self.values) + self.values = [] + + def write(self): + if len(self.values): + self.blocks.append(self.values) + + block_strs = []; + for b in self.blocks: + data = self.convert_to_4bpp(b) + data = ', '.join(data) + data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ') + block_strs.append(data) + + print("const unsigned char font[] PROGMEM = {") + for i, b in enumerate(block_strs): + if i: + print(',') + print('\n /* {} */'.format(i)) + print(b, end='') + print("\n};") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data') + parser.add_argument("input") + parser.add_argument('--char_height', help='Adds a separator every so many lines', type=int) + args = parser.parse_args() + + writer = WriteSource(args.char_height) + + img = Image.open(args.input).convert('L') + for y in range(img.height): + for x in range(img.width): + writer.add_pixel(img.getpixel((x,y))) + writer.end_row(y) + writer.write() 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 new file mode 100644 index 00000000..5357de3e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h @@ -0,0 +1,105 @@ +/*********************** + * circular_progress.h * + ***********************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +/* This function draws a circular progress "ring" */ + +void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) { + using namespace FTDI; + + const float rim = 0.3; + const float a = percent/100.0*2.0*PI; + const float a1 = min(PI/2, a); + const float a2 = min(PI/2, a-a1); + const float a3 = min(PI/2, a-a1-a2); + const float a4 = min(PI/2, a-a1-a2-a3); + + const int ro = min(w,h) * 8; + const int rr = ro * rim; + const int cx = x * 16 + w * 8; + const int cy = y * 16 + h * 8; + + // Load a rim shape into stencil buffer + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(TAG_MASK(0)); + cmd.cmd(CLEAR(0,1,0)); + cmd.cmd(COLOR_MASK(0,0,0,0)); + cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); + cmd.cmd(BEGIN(POINTS)); + cmd.cmd(POINT_SIZE(ro)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(POINT_SIZE(ro - rr)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(RESTORE_CONTEXT()); + + // Mask further drawing by stencil buffer + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); + + // Fill the background + cmd.cmd(COLOR_RGB(bgcolor)); + cmd.cmd(BEGIN(POINTS)); + cmd.cmd(POINT_SIZE(ro)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(COLOR_RGB(fgcolor)); + + // Paint upper-right quadrant + cmd.cmd(BEGIN(EDGE_STRIP_A)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); + + // Paint lower-right quadrant + if (a > PI/2) { + cmd.cmd(BEGIN(EDGE_STRIP_R)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16)); + } + + // Paint lower-left quadrant + if (a > PI) { + cmd.cmd(BEGIN(EDGE_STRIP_B)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3))); + } + + // Paint upper-left quadrant + if (a > 1.5*PI) { + cmd.cmd(BEGIN(EDGE_STRIP_L)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); + } + cmd.cmd(RESTORE_CONTEXT()); + + // Draw the text + + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(COLOR_RGB(fgcolor)); + cmd.text(x,y,w,h,text, OPT_CENTERX | OPT_CENTERY); + cmd.cmd(RESTORE_CONTEXT()); +} + +void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor) { + char str[5]; + sprintf(str,"%d\%%",int(percent)); + draw_circular_progress(cmd, x, y, w, h, percent, str, bgcolor, fgcolor); +} 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 new file mode 100644 index 00000000..a501de20 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h @@ -0,0 +1,408 @@ +/************* + * poly_ui.h * + *************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +/** + * The PolyReader class iterates over an array of (x,y) pairs. + * For supporting polygons with holes an end-of-loop marker may + * be embedded into the data stream: + * + * const PROGMEM uint16_t data[] = { + * x, y, x, y, ..., eol, + * ... + * x, y, x, y, ..., eol + * } + * + * The PolyReader object can be used to iterate over the points. + * + * PolyReader r(data, N_ELEMENTS(data)); + * + * for (r.start();r.has_more(); r.next()) { + * uint16_t x = r.x; + * uint16_t y = r.y; + * + * // Do something with the point + * ... + * + * // Do something else if this point + * // closes a loop. + * if (r.end_of_loop()) { + * ... + * } + * } + */ + +class PolyReader { + public: + typedef uint16_t type_t; + + private: + static constexpr type_t eol = 0xFFFF; + + const type_t *p, *top, *end; + type_t start_x, start_y; + + void close_loop() { + x = start_x; + y = start_y; + start_x = eol; + start_y = eol; + } + + public: + type_t x, y; + + // Begin reading a polygon data structure + PolyReader(const uint16_t data[], const size_t n_elements) : top(data), end(data + n_elements) { + start(); + } + + void start() { + p = top; + start_x = eol; + next(); + } + + // Reads the next point in the polygon data structure + void next() { + if (!p) return; + + if (p == end) { + if (start_x != eol) + close_loop(); + else + p = NULL; + } + else { + x = pgm_read_word_far(p++); + if (x == eol) + close_loop(); + else { + y = pgm_read_word_far(p++); + if (start_x == eol) { + start_x = x; + start_y = y; + } + } + } + } + + bool has_more() { return p != NULL; } + bool end_of_loop() { return start_x == eol; } +}; + +/** + * The TransformedPolyReader class works like the PolyReader, + * but the (x,y) input is assumed to be normalized onto a + * unit square and then mapped to the full 16-bits, i.e. + * (0.0,1.0) => (0x0000,0xFFFE). This class will scale the + * data to fit the entire display, a bounding box, or apply + * some arbitrary affine transform. + * + * This class is suitable for reading data from "svg2cpp.py" + */ +class TransformedPolyReader : public PolyReader { + private: + /** + * Fixed point type for fast transformations, supports + * values from 0 to 1024, with 1/32 precision. + */ + static constexpr uint8_t fract_bits = 5; + typedef int16_t fix_t; + fix_t makefix(float f) { return f * (1 << fract_bits); } + + // First two rows of 3x3 transformation matrix + fix_t a, b, c; + fix_t d, e, f; + + void transform() { + /** + * Values from PolyReader vary from 0 to FFFE. + * As an approximation to dividing by FFFE, + * we perform a bit shift right by 16. + */ + const int32_t px = PolyReader::x; + const int32_t py = PolyReader::y; + const int32_t round = 1 << (fract_bits-1); + x = (((((a * px) + (b * py)) >> 16) + c) + round) >> fract_bits; + y = (((((d * px) + (e * py)) >> 16) + f) + round) >> fract_bits; + } + + void set_transform( + fix_t A, fix_t B, fix_t C, + fix_t D, fix_t E, fix_t F + ) { + a = A; b = B; c = C; + d = D; e = E; f = F; + } + + public: + typedef int16_t type_t; + + type_t x, y; + + TransformedPolyReader(const uint16_t data[], const size_t n) : PolyReader(data, n) { + scale_to_fit(); + transform(); + } + + // Set an arbitrary affine transform + void set_transform( + float A, float B, float C, + float D, float E, float F + ) { + set_transform( + makefix(A), makefix(B), makefix(C), + makefix(D), makefix(E), makefix(F) + ); + } + + // Scale the data to fit a specified bounding box + void scale_to_fit(type_t x_min, type_t y_min, type_t x_max, type_t y_max) { + fix_t sx = makefix(x_max - x_min); + fix_t sy = makefix(y_max - y_min); + fix_t tx = makefix(x_min); + fix_t ty = makefix(y_min); + set_transform( + sx, 0, tx, + 0, sy, ty + ); + } + + // Scale to fit the entire display (default) + void scale_to_fit() { + scale_to_fit(0, 0, FTDI::display_width, FTDI::display_height); + } + + void next() { + PolyReader::next(); + transform(); + } +}; + +/** + * The DeduplicatedPolyReader wraps around another PolyReader + * class to remove repeated points from the data. This could + * happen when scaling down using TransformedPolyReader, for + * example. + */ +template +class DeduplicatedPolyReader : public POLY_READER { + private: + typename POLY_READER::type_t last_x, last_y; + + static constexpr typename POLY_READER::type_t eol = 0xFFFF; + + public: + DeduplicatedPolyReader(const uint16_t data[], const size_t n) : POLY_READER(data, n) { + last_x = POLY_READER::x; + last_y = POLY_READER::y; + } + + void next() { + do { + if (!POLY_READER::has_more()) return; + POLY_READER::next(); + } while (POLY_READER::x == last_x && POLY_READER::y == last_y && !POLY_READER::end_of_loop()); + if (POLY_READER::end_of_loop()) { + last_x = last_y = eol; + } + else { + last_x = POLY_READER::x; + last_y = POLY_READER::y; + } + } +}; + +/** + * The helper class allows you to build an interface based on arbitrary + * shapes. + */ +template> +class GenericPolyUI { + private: + CommandProcessor &cmd; + + // Attributes used to paint buttons + + uint32_t btn_fill_color = 0x000000; + uint32_t btn_shadow_color = 0xF3E0E0; + uint8_t btn_shadow_depth = 5; + uint32_t btn_stroke_color = 0x000000; + uint8_t btn_stroke_width = 28; + + draw_mode_t mode; + + public: + enum ButtonStyle : uint8_t { + FILL = 1, + STROKE = 2, + SHADOW = 4, + REGULAR = 7 + }; + + typedef POLY_READER poly_reader_t; + + GenericPolyUI(CommandProcessor &c, draw_mode_t what = BOTH) : cmd(c), mode(what) {} + + // Fills a polygon with the current COLOR_RGB + void fill(poly_reader_t r, bool clip = true) { + using namespace FTDI; + int16_t x, y, w, h; + + if (clip) { + // Clipping reduces the number of pixels that are + // filled, allowing more complex shapes to be drawn + // in the alloted time. + bounds(r, x, y, w, h); + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(SCISSOR_XY(x, y)); + cmd.cmd(SCISSOR_SIZE(w, h)); + } + + Polygon p(cmd); + p.begin_fill(); + p.begin_loop(); + for (r.start();r.has_more();r.next()) { + p(r.x * 16, r.y * 16); + if (r.end_of_loop()) { + p.end_loop(); + p.begin_loop(); + } + } + p.end_loop(); + p.end_fill(); + if (clip) + cmd.cmd(RESTORE_CONTEXT()); + } + + void shadow(poly_reader_t r, uint8_t offset) { + #if FTDI_API_LEVEL >= 810 + using namespace FTDI; + cmd.cmd(VERTEX_TRANSLATE_X(offset * 16)); + cmd.cmd(VERTEX_TRANSLATE_Y(offset * 16)); + fill(r, false); + cmd.cmd(VERTEX_TRANSLATE_X(0)); + cmd.cmd(VERTEX_TRANSLATE_Y(0)); + #endif + } + + // Strokes a polygon with the current COLOR_RGB + void stroke(poly_reader_t r) { + using namespace FTDI; + Polygon p(cmd); + p.begin_stroke(); + p.begin_loop(); + for (r.start();r.has_more(); r.next()) { + p(r.x * 16, r.y * 16); + if (r.end_of_loop()) { + p.end_loop(); + p.begin_loop(); + } + } + p.end_loop(); + p.end_stroke(); + } + + // Compute the bounds of a polygon + void bounds(poly_reader_t r, int16_t &x, int16_t &y, int16_t &w, int16_t &h) { + int16_t x_min = INT16_MAX; + int16_t y_min = INT16_MAX; + int16_t x_max = INT16_MIN; + int16_t y_max = INT16_MIN; + for (r.start(); r.has_more(); r.next()) { + x_min = min(x_min, int16_t(r.x)); + x_max = max(x_max, int16_t(r.x)); + y_min = min(y_min, int16_t(r.y)); + y_max = max(y_max, int16_t(r.y)); + } + x = x_min; + y = y_min; + w = x_max - x_min; + h = y_max - y_min; + } + + /** + * Draw shaped buttons. Buttons are drawn out of a polygon which is + * filled and stroked on top of a drop shadow. The button will + * become "pushed" when touched. + */ + + void button_fill(const uint32_t color) { + btn_fill_color = color; + } + + void button_stroke(const uint32_t color, const uint8_t width) { + btn_stroke_color = color; + btn_stroke_width = width; + } + + void button_shadow(const uint32_t color, const uint8_t depth) { + btn_shadow_color = color; + btn_shadow_depth = depth; + } + + void button(const uint8_t tag, poly_reader_t r, uint8_t style = REGULAR) { + using namespace FTDI; + // Draw the shadow + #if FTDI_API_LEVEL >= 810 + if (mode & BACKGROUND && style & SHADOW) { + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(TAG(tag)); + cmd.cmd(VERTEX_TRANSLATE_X(btn_shadow_depth * 16)); + cmd.cmd(VERTEX_TRANSLATE_Y(btn_shadow_depth * 16)); + cmd.cmd(COLOR_RGB(btn_shadow_color)); + fill(r, false); + cmd.cmd(RESTORE_CONTEXT()); + } + #endif + + if (mode & FOREGROUND) { + cmd.cmd(SAVE_CONTEXT()); + #if FTDI_API_LEVEL >= 810 + if (EventLoop::get_pressed_tag() == tag) { + // "Push" the button + cmd.cmd(VERTEX_TRANSLATE_X(btn_shadow_depth * 16)); + cmd.cmd(VERTEX_TRANSLATE_Y(btn_shadow_depth * 16)); + } + #endif + // Draw the fill and stroke + cmd.cmd(TAG(tag)); + if (style & FILL) { + cmd.cmd(COLOR_RGB(btn_fill_color)); + fill(r, false); + } + if (style & STROKE) { + cmd.cmd(COLOR_RGB(btn_stroke_color)); + cmd.cmd(LINE_WIDTH(btn_stroke_width)); + stroke(r); + } + cmd.cmd(RESTORE_CONTEXT()); + } + } + + void color(const uint32_t color) { + cmd.cmd(FTDI::COLOR_RGB(color)); + } +}; + +typedef GenericPolyUI<> PolyUI; 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 new file mode 100644 index 00000000..da08014e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py @@ -0,0 +1,280 @@ +#!/usr/bin/python + +# Written By Marcio Teixeira 2018 - 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: . + +from __future__ import print_function +import argparse, re, sys + +usage = ''' +This program extracts line segments from a SVG file and writes +them as coordinates in a C array. The x and y values will be +scaled from 0x0000 to 0xFFFE. 0xFFFF is used as path separator. + +This program can only interpret straight segments, not curves. +It also cannot handle SVG transform attributes. To convert an +SVG file into the proper format, use the following procedure: + + - Load SVG file into Inkscape + - Convert all Objects to Paths (Path -> Object to Path) + - Convert all Strokes to Paths (Path -> Stroke to Path) + - Combine all paths into one (Path -> Combine) [1] + - Convert all curves into short line segments + (Extensions -> Modify Paths -> Flatten Beziers...) + - Save as new SVG + - Convert into a header file using this utility + - To give paths individual names, break apart paths and + use the XML Editor to set the "id" attributes. + +[1] Combining paths is necessary to remove transforms. You +could also use inkscape-applytransforms Inkscape extension. + +''' + +header = ''' +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.py" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once +''' + +class ComputeBoundingBox: + def reset(self): + self.x_min = float(" inf") + self.y_min = float(" inf") + self.x_max = float("-inf") + self.y_max = float("-inf") + self.n_points = 0 + self.n_paths = 0 + + def command(self, type, x, y): + self.x_min = min(self.x_min, x) + self.x_max = max(self.x_max, x) + self.y_min = min(self.y_min, y) + self.y_max = max(self.y_max, y) + + if type == "M": + self.n_paths += 1 + self.n_points += 1 + + def scale(self, x, y): + x -= self.x_min + y -= self.y_min + x /= self.x_max - self.x_min + y /= self.y_max - self.y_min + #y = 1 - y # Flip upside down + return (x, y) + + def path_finished(self, id): + pass + + def write(self): + print("constexpr float x_min = %f;" % self.x_min) + print("constexpr float x_max = %f;" % self.x_max) + print("constexpr float y_min = %f;" % self.y_min) + print("constexpr float y_max = %f;" % self.y_max) + print() + + def from_svg_view_box(self, svg): + s = re.search(']+>', svg); + if s: + m = re.search('viewBox="([0-9-.]+) ([0-9-.]+) ([0-9-.]+) ([0-9-.]+)"', svg) + if m: + self.x_min = float(m.group(1)) + self.y_min = float(m.group(2)) + self.x_max = float(m.group(3)) + self.y_max = float(m.group(4)) + return True + return False + +# op +class WriteDataStructure: + def __init__(self, bounding_box): + self.bounds = bounding_box + + def reset(self, ): + self.hex_words = [] + + def push(self, value): + self.hex_words.append("0x%04X" % (0xFFFF & int(value))) + + def command(self, type, x, y): + if type == "M": + self.push(0xFFFF) + x, y = self.bounds.scale(x,y) + self.push(x * 0xFFFE) + self.push(y * 0xFFFE) + + def path_finished(self, id): + if self.hex_words and self.hex_words[0] == "0xFFFF": + self.hex_words.pop(0) + print("const PROGMEM uint16_t", id + "[] = {" + ", ".join (self.hex_words) + "};") + self.hex_words = [] + +class Parser: + def __init__(self, op): + self.op = op + self.reset() + + def reset(self): + self.last_x = 0 + self.last_y = 0 + self.initial_x = 0 + self.initial_y = 0 + + def process_svg_path_L_or_M(self, cmd, x, y): + self.op.command(cmd, x, y) + self.last_x = x + self.last_y = y + if cmd == "M": + self.initial_x = x + self.initial_y = y + + def process_svg_path_data_cmd(self, id, cmd, a, b): + """Converts the various types of moves into L or M commands + and dispatches to process_svg_path_L_or_M for futher processing.""" + if cmd == "Z" or cmd == "z": + self.process_svg_path_L_or_M("L", self.initial_x, self.initial_y) + elif cmd == "H": + self.process_svg_path_L_or_M("L", a, self.last_y) + elif cmd == "V": + self.process_svg_path_L_or_M("L", self.last_x, a) + elif cmd == "h": + self.process_svg_path_L_or_M("L", self.last_x + a, self.last_y) + elif cmd == "v": + self.process_svg_path_L_or_M("L", self.last_x, self.last_y + a) + elif cmd == "L": + self.process_svg_path_L_or_M("L", a, b) + elif cmd == "l": + self.process_svg_path_L_or_M("L", self.last_x + a, self.last_y + b) + elif cmd == "M": + self.process_svg_path_L_or_M("M", a, b) + elif cmd == "m": + self.process_svg_path_L_or_M("M", self.last_x + a, self.last_y + b) + else: + print("Unsupported path data command:", cmd, "in path", id, "\n", file=sys.stderr) + quit() + + def eat_token(self, regex): + """Looks for a token at the start of self.d. + If found, the token is removed.""" + self.m = re.match(regex,self.d) + if self.m: + self.d = self.d[self.m.end():] + return self.m + + def process_svg_path_data(self, id, d): + """Breaks up the "d" attribute into individual commands + and calls "process_svg_path_data_cmd" for each""" + + self.d = d + while (self.d): + if self.eat_token('\s+'): + pass # Just eat the spaces + + elif self.eat_token('([LMHVZlmhvz])'): + cmd = self.m.group(1) + # The following commands take no arguments + if cmd == "Z" or cmd == "z": + self.process_svg_path_data_cmd(id, cmd, 0, 0) + + elif self.eat_token('([CScsQqTtAa])'): + print("Unsupported path data command:", self.m.group(1), "in path", id, "\n", file=sys.stderr) + quit() + + elif self.eat_token('([ ,]*[-0-9e.]+)+'): + # Process list of coordinates following command + coords = re.split('[ ,]+', self.m.group(0)) + # The following commands take two arguments + if cmd == "L" or cmd == "l": + while coords: + self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), float(coords.pop(0))) + elif cmd == "M": + while coords: + self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), float(coords.pop(0))) + # If a MOVETO has multiple points, the subsequent ones are assumed to be LINETO + cmd = "L" + elif cmd == "m": + while coords: + self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), float(coords.pop(0))) + # If a MOVETO has multiple points, the subsequent ones are assumed to be LINETO + cmd = "l" + # Assume all other commands are single argument + else: + while coords: + self.process_svg_path_data_cmd(id, cmd, float(coords.pop(0)), 0) + else: + print("Syntax error:", d, "in path", id, "\n", file=sys.stderr) + quit() + + def process_svg_paths(self, svg): + self.op.reset() + for path in re.findall(']+>', svg): + id = "" + m = re.search(' id="(.*)"', path) + if m: + id = m.group(1) + + m = re.search(' transform="(.*)"', path) + if m: + print("Found transform in path", id, "! Cannot process file!", file=sys.stderr) + quit() + + m = re.search(' d="(.*)"', path) + if m: + self.process_svg_path_data(id, m.group(1)) + self.op.path_finished(id) + self.reset() + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("filename") + args = parser.parse_args() + + f = open(args.filename, "r") + data = f.read() + + print(header) + + b = ComputeBoundingBox() + if not b.from_svg_view_box(data): + # Can't find the view box, so use the bounding box of the elements themselves. + p = Parser(b) + p.process_svg_paths(data) + b.write() + + w = WriteDataStructure(b) + p = Parser(w) + p.process_svg_paths(data) 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 new file mode 100644 index 00000000..5c1a74f6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/ftdi_eve_lib.h @@ -0,0 +1,27 @@ +/****************** + * ftdi_eve_lib.h * + ******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2019 - Aleph Objects, Inc. * + * 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: . * + ****************************************************************************/ + +#pragma once + +#include "compat.h" +#include "basic/ftdi_basic.h" +#include "extended/ftdi_extended.h" 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 new file mode 100644 index 00000000..912c9573 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.cpp @@ -0,0 +1,27 @@ +/**************** + * language.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 "../../../../../MarlinCore.h" + +#include "language.h" + +uint8_t lang = 0; 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 new file mode 100644 index 00000000..873e8445 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language.h @@ -0,0 +1,23 @@ +/************** + * language.h * + **************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ +#pragma once + +#include "language_en.h" 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 new file mode 100644 index 00000000..cc96c8b9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -0,0 +1,170 @@ +/***************** + * language_en.h * + *****************/ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +#pragma once + +#include "language.h" + +#if ENABLED(TOUCH_UI_UTF8_COPYRIGHT) + #define COPYRIGHT_SIGN u8"©" +#else + #define COPYRIGHT_SIGN u8"(c)" +#endif + +#if ENABLED(TOUCH_UI_UTF8_SUPERSCRIPTS) + #define SUPERSCRIPT_TWO u8"²" +#else + #define SUPERSCRIPT_TWO u8"^2" +#endif + +#if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) + #define DEGREE_SIGN u8"°" +#else + #define DEGREE_SIGN u8" " +#endif + +namespace Language_en { + PROGMEM Language_Str MSG_BUTTON_OKAY = u8"Okay"; + PROGMEM Language_Str MSG_BUTTON_MENU = u8"Menu"; + PROGMEM Language_Str MSG_BUTTON_MEDIA = u8"Media"; + PROGMEM Language_Str MSG_BUTTON_OPEN = u8"Open"; + PROGMEM Language_Str MSG_CLEAN_NOZZLE = u8"Clean Nozzle"; + PROGMEM Language_Str MSG_VMAX_X = u8"Vmax X"; + PROGMEM Language_Str MSG_VMAX_Y = u8"Vmax Y"; + PROGMEM Language_Str MSG_VMAX_Z = u8"Vmax Z"; + PROGMEM Language_Str MSG_ACCEL_PRINTING = u8"Printing"; + PROGMEM Language_Str MSG_ACCEL_TRAVEL = u8"Travel"; + PROGMEM Language_Str MSG_ACCEL_RETRACT = u8"Retraction"; + PROGMEM Language_Str MSG_AMAX_X = u8"Amax X"; + PROGMEM Language_Str MSG_AMAX_Y = u8"Amax Y"; + PROGMEM Language_Str MSG_AMAX_Z = u8"Amax Z"; + PROGMEM Language_Str MSG_AXIS_X = u8"X"; + PROGMEM Language_Str MSG_AXIS_X2 = u8"X2"; + PROGMEM Language_Str MSG_AXIS_Y = u8"Y"; + PROGMEM Language_Str MSG_AXIS_Y2 = u8"Y2"; + PROGMEM Language_Str MSG_AXIS_Z = u8"Z"; + PROGMEM Language_Str MSG_AXIS_Z2 = u8"Z2"; + PROGMEM Language_Str MSG_AXIS_E = u8"E"; + PROGMEM Language_Str MSG_AXIS_E1 = u8"E1"; + PROGMEM Language_Str MSG_AXIS_E2 = u8"E2"; + PROGMEM Language_Str MSG_AXIS_E3 = u8"E3"; + PROGMEM Language_Str MSG_AXIS_E4 = u8"E4"; + PROGMEM Language_Str MSG_AXIS_ALL = u8"All"; + PROGMEM Language_Str MSG_HOME = u8"Home"; + PROGMEM Language_Str MSG_PRINT_STARTING = u8"Print starting"; + PROGMEM Language_Str MSG_PRINT_FINISHED = u8"Print finished"; + PROGMEM Language_Str MSG_PRINT_ERROR = u8"Print error"; + PROGMEM Language_Str MSG_ABOUT_TOUCH_PANEL_1 = u8"Color Touch Panel"; + PROGMEM Language_Str MSG_ABOUT_TOUCH_PANEL_2 = WEBSITE_URL; + 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: 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"; + PROGMEM Language_Str MSG_INTERFACE = u8"Interface"; + PROGMEM Language_Str MSG_MEASURE_AUTOMATICALLY = u8"Measure automatically"; + PROGMEM Language_Str MSG_H_OFFSET = u8"H Offset"; + PROGMEM Language_Str MSG_V_OFFSET = u8"V Offset"; + PROGMEM Language_Str MSG_TOUCH_SCREEN = u8"Touch Screen"; + PROGMEM Language_Str MSG_CALIBRATE = u8"Calibrate"; + PROGMEM Language_Str MSG_UNITS_MILLIAMP = u8"mA"; + PROGMEM Language_Str MSG_UNITS_MM = u8"mm"; + PROGMEM Language_Str MSG_UNITS_MM_S = u8"mm/s"; + PROGMEM Language_Str MSG_UNITS_MM_S2 = u8"mm/s" SUPERSCRIPT_TWO; + 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_IDLE = u8"idle"; + PROGMEM Language_Str MSG_SET_MAXIMUM = u8"Set Maximum"; + PROGMEM Language_Str MSG_PRINT_SPEED = u8"Print Speed"; + PROGMEM Language_Str MSG_LINEAR_ADVANCE = u8"Linear Advance"; + PROGMEM Language_Str MSG_LINEAR_ADVANCE_K = u8"K"; + PROGMEM Language_Str MSG_LINEAR_ADVANCE_K1 = u8"K E1"; + PROGMEM Language_Str MSG_LINEAR_ADVANCE_K2 = u8"K E2"; + PROGMEM Language_Str MSG_LINEAR_ADVANCE_K3 = u8"K E3"; + PROGMEM Language_Str MSG_LINEAR_ADVANCE_K4 = u8"K E4"; + PROGMEM Language_Str MSG_NUDGE_NOZZLE = u8"Nudge Nozzle"; + PROGMEM Language_Str MSG_ADJUST_BOTH_NOZZLES = u8"Adjust Both Nozzles"; + PROGMEM Language_Str MSG_SHOW_OFFSETS = u8"Show Offsets"; + PROGMEM Language_Str MSG_INCREMENT = u8"Increment"; + PROGMEM Language_Str MSG_ERASE_FLASH_WARNING = u8"Are you sure? SPI flash will be erased."; + PROGMEM Language_Str MSG_ERASING = u8"Erasing..."; + PROGMEM Language_Str MSG_ERASED = u8"SPI flash erased"; + PROGMEM Language_Str MSG_CALIBRATION_WARNING = u8"For best results, unload the filament and clean the hotend prior to starting calibration. Continue?"; + PROGMEM Language_Str MSG_START_PRINT_CONFIRMATION = u8"Start printing %s?"; + PROGMEM Language_Str MSG_ABORT_WARNING = u8"Are you sure you want to cancel the print?"; + PROGMEM Language_Str MSG_EXTRUDER_SELECTION = u8"Extruder Selection"; + PROGMEM Language_Str MSG_CURRENT_TEMPERATURE = u8"Current Temp"; + PROGMEM Language_Str MSG_REMOVAL_TEMPERATURE = u8"Removal Temp"; + PROGMEM Language_Str MSG_CAUTION = u8"Caution:"; + PROGMEM Language_Str MSG_HOT = u8"Hot!"; + PROGMEM Language_Str MSG_UNLOAD_FILAMENT = u8"Unload/Retract"; + PROGMEM Language_Str MSG_LOAD_FILAMENT = u8"Load/Extruder"; + PROGMEM Language_Str MSG_MOMENTARY = u8"Momentary"; + PROGMEM Language_Str MSG_CONTINUOUS = u8"Continuous"; + PROGMEM Language_Str MSG_PLEASE_WAIT = u8"Please wait..."; + PROGMEM Language_Str MSG_PRINT_MENU = u8"Print Menu"; + PROGMEM Language_Str MSG_FINE_MOTION = u8"Fine motion"; + PROGMEM Language_Str MSG_ENABLE_MEDIA = u8"Enable Media"; + PROGMEM Language_Str MSG_INSERT_MEDIA = u8"Insert Media..."; + PROGMEM Language_Str MSG_LCD_BRIGHTNESS = u8"LCD brightness"; + PROGMEM Language_Str MSG_SOUND_VOLUME = u8"Sound volume"; + PROGMEM Language_Str MSG_SCREEN_LOCK = u8"Screen lock"; + PROGMEM Language_Str MSG_BOOT_SCREEN = u8"Boot screen"; + PROGMEM Language_Str MSG_SOUNDS = u8"Sounds"; + PROGMEM Language_Str MSG_CLICK_SOUNDS = u8"Click sounds"; + PROGMEM Language_Str MSG_EEPROM_RESTORED = u8"Settings restored from backup"; + PROGMEM Language_Str MSG_EEPROM_RESET = u8"Settings restored to default"; + PROGMEM Language_Str MSG_EEPROM_SAVED = u8"Settings saved!"; + PROGMEM Language_Str MSG_EEPROM_SAVE_PROMPT = u8"Do you wish to save these settings as defaults?"; + PROGMEM Language_Str MSG_EEPROM_RESET_WARNING = u8"Are you sure? Customizations will be lost."; + + PROGMEM Language_Str MSG_PASSCODE_REJECTED = u8"Wrong passcode!"; + PROGMEM Language_Str MSG_PASSCODE_ACCEPTED = u8"Passcode accepted!"; + PROGMEM Language_Str MSG_PASSCODE_SELECT = u8"Select Passcode:"; + PROGMEM Language_Str MSG_PASSCODE_REQUEST = u8"Enter Passcode:"; + + PROGMEM Language_Str MSG_TOUCH_CALIBRATION_START = u8"Release to begin screen calibration"; + PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate"; + PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis"; + PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; + PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; + PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; + PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; + + #ifdef TOUCH_UI_LULZBOT_BIO + PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; + PROGMEM Language_Str MSG_RAISE_PLUNGER = u8"Raise Plunger"; + PROGMEM Language_Str MSG_RELEASE_XY_AXIS = u8"Release X and Y Axis"; + PROGMEM Language_Str MSG_BED_TEMPERATURE = u8"Bed Temperature"; + PROGMEM Language_Str MSG_HOME_XYZ_WARNING = u8"About to move to home position. Ensure the top and the bed of the printer are clear.\n\nContinue?"; + PROGMEM Language_Str MSG_HOME_E_WARNING = u8"About to re-home plunger and auto-level. Remove syringe prior to proceeding.\n\nContinue?"; + #endif + + #ifdef TOUCH_UI_COCOA_PRESS + PROGMEM Language_Str MSG_ZONE_1 = u8"Zone 1:"; + PROGMEM Language_Str MSG_ZONE_2 = u8"Zone 2:"; + PROGMEM Language_Str MSG_ZONE_3 = u8"Zone 3:"; + PROGMEM Language_Str MSG_PREHEAT_FINISHED = u8"Preheat finished"; + #endif +}; // namespace Language_en 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 new file mode 100644 index 00000000..fe68faef --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -0,0 +1,175 @@ +/********************* + * marlin_events.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "compat.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens/screens.h" + +namespace ExtUI { + using namespace Theme; + using namespace FTDI; + + void onStartup() { + EventLoop::setup(); + } + + void onIdle() { + EventLoop::loop(); + } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { + char str[strlen_P(error) + strlen_P(component) + 3]; + sprintf_P(str, PSTR(S_FMT ": " S_FMT), error, component); + KillScreen::show(str); + } + + void onMediaInserted() { + if (AT_SCREEN(StatusScreen)) + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED)); + sound.play(media_inserted, PLAY_ASYNCHRONOUS); + } + + void onMediaRemoved() { + if (isPrintingFromMedia()) { + stopPrint(); + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED); + } + else + sound.play(media_removed, PLAY_ASYNCHRONOUS); + + if (AT_SCREEN(StatusScreen) || isPrintingFromMedia()) + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED)); + + #if ENABLED(SDSUPPORT) + if (AT_SCREEN(FilesScreen)) GOTO_SCREEN(StatusScreen); + #endif + } + + void onMediaError() { + sound.play(sad_trombone, PLAY_ASYNCHRONOUS); + AlertDialogBox::showError(F("Unable to read media.")); + } + + void onStatusChanged(const char* lcd_msg) { + StatusScreen::setStatusMessage(lcd_msg); + } + + void onStatusChanged(progmem_str lcd_msg) { + StatusScreen::setStatusMessage(lcd_msg); + } + + void onPrintTimerStarted() { + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_STARTED); + } + + void onPrintTimerStopped() { + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FINISHED); + } + + void onPrintTimerPaused() { + } + + void onFilamentRunout(const extruder_t extruder) { + char lcd_msg[30]; + sprintf_P(lcd_msg, PSTR("Extruder %d Filament Error"), extruder + 1); + StatusScreen::setStatusMessage(lcd_msg); + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, FTDI::PLAY_SYNCHRONOUS); + } + + void onFactoryReset() { + InterfaceSettingsScreen::defaultSettings(); + } + + void onStoreSettings(char *buff) { + InterfaceSettingsScreen::saveSettings(buff); + } + + void onLoadSettings(const char *buff) { + InterfaceSettingsScreen::loadSettings(buff); + } + + void onConfigurationStoreWritten(bool success) { + #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + if (success && InterfaceSettingsScreen::backupEEPROM()) { + SERIAL_ECHOLNPGM("Made backup of EEPROM to SPI Flash"); + } + #else + UNUSED(success); + #endif + } + + void onConfigurationStoreRead(bool) { + } + + void onPlayTone(const uint16_t frequency, const uint16_t duration) { + sound.play_tone(frequency, duration); + } + + void onUserConfirmRequired(const char * const msg) { + if (msg) + ConfirmUserRequestAlertBox::show(msg); + else + ConfirmUserRequestAlertBox::hide(); + } + + #if HAS_LEVELING && HAS_MESH + void onMeshUpdate(const int8_t x, const int8_t y, const float val) { + BedMeshScreen::onMeshUpdate(x, y, val); + } + + void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { + BedMeshScreen::onMeshUpdate(x, y, state); + } + #endif + + #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 + //SERIAL_ECHOLNPAIR("OnPidTuning:", rst); + switch (rst) { + case PID_BAD_EXTRUDER_NUM: + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_BAD_EXTRUDER_NUM)); + break; + case PID_TEMP_TOO_HIGH: + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH)); + break; + case PID_TUNING_TIMEOUT: + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_TIMEOUT)); + break; + case PID_DONE: + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE)); + break; + } + GOTO_SCREEN(StatusScreen); + } + #endif // HAS_PID_HEATING +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..5ad84c60 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/pin_mappings.h @@ -0,0 +1,144 @@ +/****************** + * pin_mappings.h * + ******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/* This file defines mappings from the ULTRA_LCD pins functions to new + * functions for the FTDI display. These mappings allows any board that + * support ULTRA_LCD via EXP1 and EXP2 connectors to use FTDI modules + * without adding new pin definitions to the board. + */ + +#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 + +#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 + #define CLCD_SOFT_SPI_MOSI LCD_PINS_ENABLE // PORTC1 Pin 8 + #define CLCD_SPI_CS LCD_PINS_RS // PORTA3 Pin 7 + #define CLCD_SOFT_SPI_MISO 16 // PORTC0 BTN_ENC Pin 2 + #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 + +#elif ENABLED(AO_EXP1_DEPRECATED_PINMAP) + + /** + * 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 + + #define CLCD_AUX_0 LCD_PINS_ENABLE + #define CLCD_AUX_1 BTN_ENC + #define CLCD_AUX_2 BEEPER_PIN + + #define CLCD_USE_SOFT_SPI + #define CLCD_SOFT_SPI_SCLK LCD_PINS_D7 + #define CLCD_SOFT_SPI_MOSI LCD_PINS_D6 + #define CLCD_SOFT_SPI_MISO LCD_PINS_RS + +#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 + + #define CLCD_USE_SOFT_SPI + #define CLCD_SOFT_SPI_SCLK BTN_ENC + #define CLCD_SOFT_SPI_MOSI LCD_PINS_D5 + #define CLCD_SOFT_SPI_MISO BEEPER_PIN + +#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 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 new file mode 100644 index 00000000..9cd17637 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/about_screen.cpp @@ -0,0 +1,116 @@ +/******************** + * about_screen.cpp * + ********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +#define GRID_COLS 4 +#define GRID_ROWS 7 + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void AboutScreen::onEntry() { + BaseScreen::onEntry(); + sound.play(chimes, PLAY_ASYNCHRONOUS); +} + +void AboutScreen::onRedraw(draw_mode_t) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + + #define HEADING_POS BTN_POS(1,2), BTN_SIZE(4,1) + #define FW_VERS_POS BTN_POS(1,3), BTN_SIZE(4,1) + #define FW_INFO_POS BTN_POS(1,4), BTN_SIZE(4,1) + #define LICENSE_POS BTN_POS(1,5), BTN_SIZE(4,2) + #define STATS_POS BTN_POS(1,7), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(3,7), BTN_SIZE(2,1) + + #define _INSET_POS(x,y,w,h) x + w/10, y, w - w/5, h + #define INSET_POS(pos) _INSET_POS(pos) + + char about_str[1 + + strlen_P(GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2)) + #ifdef TOOLHEAD_NAME + + strlen_P(TOOLHEAD_NAME) + #endif + ]; + #ifdef TOOLHEAD_NAME + // If MSG_ABOUT_TOUCH_PANEL_2 has %s, substitute in the toolhead name. + // But this is optional, so squelch the compiler warning here. + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wformat-extra-args" + sprintf_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2), TOOLHEAD_NAME); + #pragma GCC diagnostic pop + #else + strcpy_P(about_str, GET_TEXT(MSG_ABOUT_TOUCH_PANEL_2)); + #endif + + draw_text_box(cmd, HEADING_POS, + #ifdef CUSTOM_MACHINE_NAME + F(CUSTOM_MACHINE_NAME) + #else + GET_TEXT_F(MSG_ABOUT_TOUCH_PANEL_1) + #endif + , OPT_CENTER, font_xlarge + ); + cmd.tag(3); + draw_text_box(cmd, FW_VERS_POS, + #ifdef TOUCH_UI_VERSION + F(TOUCH_UI_VERSION) + #else + 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); + + cmd.font(font_medium) + .colors(normal_btn) + .tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU)) + .colors(action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); +} + +bool AboutScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + #if ENABLED(PRINTCOUNTER) + case 2: GOTO_SCREEN(StatisticsScreen); break; + #endif + #if ENABLED(TOUCH_UI_DEVELOPER_MENU) + case 3: GOTO_SCREEN(DeveloperMenu); break; + #endif + default: return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..cfb268f0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/advanced_settings_menu.cpp @@ -0,0 +1,155 @@ +/***************************** + * advance_settings_menu.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)); + } + + #ifdef TOUCH_UI_PORTRAIT + #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) + #define GRID_ROWS 9 + #else + #define GRID_ROWS 8 + #endif + #define GRID_COLS 2 + #define RESTORE_DEFAULTS_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define DISPLAY_POS BTN_POS(1,2), BTN_SIZE(1,1) + #define INTERFACE_POS BTN_POS(2,2), BTN_SIZE(1,1) + #define ZPROBE_ZOFFSET_POS BTN_POS(1,3), BTN_SIZE(1,1) + #define STEPS_PER_MM_POS BTN_POS(2,3), BTN_SIZE(1,1) + #define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1) + #define VELOCITY_POS BTN_POS(2,4), BTN_SIZE(1,1) + #define TMC_CURRENT_POS BTN_POS(1,5), BTN_SIZE(1,1) + #define ACCELERATION_POS BTN_POS(2,5), BTN_SIZE(1,1) + #define ENDSTOPS_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define JERK_POS BTN_POS(2,6), BTN_SIZE(1,1) + #define CASE_LIGHT_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define BACKLASH_POS BTN_POS(2,7), BTN_SIZE(1,1) + #define OFFSETS_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_MULTI_HOTEND, 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) + #endif + #else + #define GRID_ROWS 6 + #define GRID_COLS 3 + #define ZPROBE_ZOFFSET_POS BTN_POS(1,1), BTN_SIZE(1,1) + #define CASE_LIGHT_POS BTN_POS(1,4), BTN_SIZE(1,1) + #define STEPS_PER_MM_POS BTN_POS(2,1), BTN_SIZE(1,1) + #define TMC_CURRENT_POS BTN_POS(3,1), BTN_SIZE(1,1) + #define TMC_HOMING_THRS_POS BTN_POS(3,2), BTN_SIZE(1,1) + #define BACKLASH_POS BTN_POS(3,3), BTN_SIZE(1,1) + #define FILAMENT_POS BTN_POS(1,3), BTN_SIZE(1,1) + #define ENDSTOPS_POS BTN_POS(3,4), BTN_SIZE(1,1) + #define DISPLAY_POS BTN_POS(3,5), BTN_SIZE(1,1) + #define INTERFACE_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define RESTORE_DEFAULTS_POS BTN_POS(1,6), BTN_SIZE(2,1) + #define VELOCITY_POS BTN_POS(2,2), BTN_SIZE(1,1) + #define ACCELERATION_POS BTN_POS(2,3), BTN_SIZE(1,1) + #define JERK_POS BTN_POS(2,4), BTN_SIZE(1,1) + #define OFFSETS_POS BTN_POS(1,2), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(3,6), BTN_SIZE(1,1) + #endif + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + .enabled(ENABLED(HAS_BED_PROBE)) + .tag(2) .button( ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) + .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)) + .tag(13).button( TMC_CURRENT_POS, GET_TEXT_F(MSG_TMC_CURRENT)) + .enabled(ENABLED(SENSORLESS_HOMING)) + .tag(14).button( TMC_HOMING_THRS_POS, GET_TEXT_F(MSG_TMC_HOMING_THRS)) + .enabled(ENABLED(HAS_MULTI_HOTEND)) + .tag(4) .button( OFFSETS_POS, GET_TEXT_F(MSG_OFFSETS_MENU)) + .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) + .tag(11).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) + .tag(12).button( ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .tag(15).button( DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) + .tag(9) .button( INTERFACE_POS, GET_TEXT_F(MSG_INTERFACE)) + .tag(10).button( RESTORE_DEFAULTS_POS, GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .tag(5) .button( VELOCITY_POS, GET_TEXT_F(MSG_VELOCITY)) + .tag(6) .button( ACCELERATION_POS, GET_TEXT_F(MSG_ACCELERATION)) + .tag(7) .button( JERK_POS, GET_TEXT_F(TERN(HAS_JUNCTION_DEVIATION, MSG_JUNCTION_DEVIATION, MSG_JERK))) + .enabled(ENABLED(BACKLASH_GCODE)) + .tag(8).button( BACKLASH_POS, GET_TEXT_F(MSG_BACKLASH)) + .colors(action_btn) + .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + #if HAS_BED_PROBE + case 2: GOTO_SCREEN(ZOffsetScreen); break; + #endif + case 3: GOTO_SCREEN(StepsScreen); break; + #if ENABLED(HAS_MULTI_HOTEND) + case 4: GOTO_SCREEN(NozzleOffsetScreen); break; + #endif + case 5: GOTO_SCREEN(MaxVelocityScreen); break; + case 6: GOTO_SCREEN(DefaultAccelerationScreen); break; + case 7: GOTO_SCREEN(TERN(HAS_JUNCTION_DEVIATION, JunctionDeviationScreen, JerkScreen)); break; + #if ENABLED(BACKLASH_GCODE) + case 8: GOTO_SCREEN(BacklashCompensationScreen); break; + #endif + case 9: GOTO_SCREEN(InterfaceSettingsScreen); LockScreen::check_passcode(); break; + case 10: GOTO_SCREEN(RestoreFailsafeDialogBox); LockScreen::check_passcode(); break; + #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + case 11: GOTO_SCREEN(FilamentMenu); break; + #endif + case 12: GOTO_SCREEN(EndstopStatesScreen); break; + #if HAS_TRINAMIC_CONFIG + case 13: GOTO_SCREEN(StepperCurrentScreen); break; + #endif + #if ENABLED(SENSORLESS_HOMING) + case 14: GOTO_SCREEN(StepperBumpSensitivityScreen); break; + #endif + case 15: GOTO_SCREEN(DisplayTuningScreen); break; + #if ENABLED(CASE_LIGHT_ENABLE) + case 16: GOTO_SCREEN(CaseLightScreen); break; + #endif + default: return false; + } + return true; +} +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..bd09d2a5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/alert_dialog_box.cpp @@ -0,0 +1,70 @@ +/************************ + * alert_dialog_box.cpp * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; + +void AlertDialogBox::onEntry() { + BaseScreen::onEntry(); + sound.play(screen_data.AlertDialogBox.isError ? sad_trombone : twinkle, PLAY_ASYNCHRONOUS); +} + +void AlertDialogBox::onRedraw(draw_mode_t what) { + if (what & FOREGROUND) { + drawOkayButton(); + } +} + +template +void AlertDialogBox::show(const T message) { + drawMessage(message); + storeBackground(); + screen_data.AlertDialogBox.isError = false; + GOTO_SCREEN(AlertDialogBox); +} + +template +void AlertDialogBox::showError(const T message) { + drawMessage(message); + storeBackground(); + screen_data.AlertDialogBox.isError = true; + GOTO_SCREEN(AlertDialogBox); +} + +void AlertDialogBox::hide() { + if (AT_SCREEN(AlertDialogBox)) + GOTO_PREVIOUS(); +} + +template void AlertDialogBox::show(const char *); +template void AlertDialogBox::show(const progmem_str); +template void AlertDialogBox::showError(const char *); +template void AlertDialogBox::showError(const progmem_str); + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..8d655184 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/backlash_compensation_screen.cpp @@ -0,0 +1,76 @@ +/************************************ + * backlash_compensation_screen.cpp * + ************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, BACKLASH_GCODE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void BacklashCompensationScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(2).units( GET_TEXT_F(MSG_UNITS_MM)); + w.heading( GET_TEXT_F(MSG_BACKLASH)); + w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), getAxisBacklash_mm(X)); + w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), getAxisBacklash_mm(Y)); + w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), getAxisBacklash_mm(Z)); + #if ENABLED(CALIBRATION_GCODE) + w.button(12, GET_TEXT_F(MSG_MEASURE_AUTOMATICALLY)); + #endif + #ifdef BACKLASH_SMOOTHING_MM + w.color(other).adjuster(8, GET_TEXT_F(MSG_BACKLASH_SMOOTHING), getBacklashSmoothing_mm()); + #endif + w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)) + .adjuster(10, GET_TEXT_F(MSG_BACKLASH_CORRECTION), getBacklashCorrection_percent()); + w.precision(2).increments(); +} + +bool BacklashCompensationScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(AxisBacklash_mm, X); break; + case 3: UI_INCREMENT(AxisBacklash_mm, X); break; + case 4: UI_DECREMENT(AxisBacklash_mm, Y); break; + case 5: UI_INCREMENT(AxisBacklash_mm, Y); break; + case 6: UI_DECREMENT(AxisBacklash_mm, Z); break; + case 7: UI_INCREMENT(AxisBacklash_mm, Z); break; + #ifdef BACKLASH_SMOOTHING_MM + case 8: UI_DECREMENT(BacklashSmoothing_mm); break; + case 9: UI_INCREMENT(BacklashSmoothing_mm); break; + #endif + case 10: UI_DECREMENT_BY(BacklashCorrection_percent, increment*100); break; + case 11: UI_INCREMENT_BY(BacklashCorrection_percent, increment*100); break; + #if ENABLED(CALIBRATION_GCODE) + case 12: GOTO_SCREEN(ConfirmAutoCalibrationDialogBox); return true; + #endif + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..1c4ef594 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_numeric_adjustment_screen.cpp @@ -0,0 +1,388 @@ +/************************************** + * base_numeric_adjustment_screen.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 13 + #define GRID_ROWS 10 + #define LAYOUT_FONT font_small +#else + #define GRID_COLS 18 + #define GRID_ROWS 7 + #define LAYOUT_FONT font_medium +#endif + +BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .colors(normal_btn) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + } + + cmd.font(font_medium); + _button(cmd, 1, + #ifdef TOUCH_UI_PORTRAIT + BTN_POS(1,10), BTN_SIZE(13,1), + #else + BTN_POS(15,7), BTN_SIZE(4,1), + #endif + GET_TEXT_F(MSG_BACK), true, true + ); + + _line = 1; + _units = F(""); +} + +/** + * Speed optimization for changing button style. + */ +void BaseNumericAdjustmentScreen::widgets_t::_button_style(CommandProcessor &cmd, BaseNumericAdjustmentScreen::widgets_t::style_t style) { + if (_style != style) { + const btn_colors *old_colors = &normal_btn; + const btn_colors *new_colors = &normal_btn; + + switch (_style) { + case BTN_ACTION: old_colors = &action_btn; break; + case BTN_TOGGLE: old_colors = &ui_toggle; break; + case BTN_DISABLED: old_colors = &disabled_btn; break; + default: break; + } + switch (style) { + case BTN_ACTION: new_colors = &action_btn; break; + case BTN_TOGGLE: new_colors = &ui_toggle; break; + case BTN_DISABLED: new_colors = &disabled_btn; break; + default: break; + } + + const bool rgb_changed = (old_colors->rgb != new_colors->rgb) || + (_style == TEXT_LABEL && style != TEXT_LABEL) || + (_style != TEXT_LABEL && style == TEXT_LABEL); + const bool grad_changed = old_colors->grad != new_colors->grad; + const bool fg_changed = (old_colors->fg != new_colors->fg) || (_style == TEXT_AREA); + const bool bg_changed = old_colors->bg != new_colors->bg; + + if (rgb_changed) cmd.cmd(COLOR_RGB(style == TEXT_LABEL ? bg_text_enabled : new_colors->rgb)); + if (grad_changed) cmd.gradcolor(new_colors->grad); + if (fg_changed) cmd.fgcolor(new_colors->fg); + if (bg_changed) cmd.bgcolor(new_colors->bg); + + _style = style; + } +} + +/** + * Speed optimization for drawing buttons. Draw all unpressed buttons in the + * background layer and draw only the pressed button in the foreground layer. + */ +void BaseNumericAdjustmentScreen::widgets_t::_button(CommandProcessor &cmd, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str text, bool enabled, bool highlight) { + if (_what & BACKGROUND) enabled = true; + if ((_what & BACKGROUND) || buttonIsPressed(tag) || highlight || !enabled) { + _button_style(cmd, (!enabled) ? BTN_DISABLED : (highlight ? BTN_ACTION : BTN_NORMAL)); + cmd.tag(enabled ? tag : 0).button(x, y, w, h, text); + } +} + +BaseNumericAdjustmentScreen::widgets_t &BaseNumericAdjustmentScreen::widgets_t::precision(uint8_t decimals, precision_default_t initial) { + _decimals = decimals; + if (screen_data.BaseNumericAdjustmentScreen.increment == 0) { + screen_data.BaseNumericAdjustmentScreen.increment = 243 + (initial - DEFAULT_LOWEST) - _decimals; + } + return *this; +} + +void BaseNumericAdjustmentScreen::widgets_t::heading(progmem_str label) { + if (_what & BACKGROUND) { + CommandProcessor cmd; + _button_style(cmd, TEXT_LABEL); + cmd.font(font_medium) + .tag(0) + .text( + #ifdef TOUCH_UI_PORTRAIT + BTN_POS(1, _line), BTN_SIZE(12,1), + #else + BTN_POS(5, _line), BTN_SIZE(8,1), + #endif + label + ); + } + + _line++; +} + +#ifdef TOUCH_UI_PORTRAIT + #ifdef TOUCH_UI_800x480 + #undef EDGE_R + #define EDGE_R 20 + #else + #undef EDGE_R + #define EDGE_R 10 + #endif +#endif + +void BaseNumericAdjustmentScreen::widgets_t::_draw_increment_btn(CommandProcessor &cmd, uint8_t, const uint8_t tag) { + const char *label = PSTR("?"); + uint8_t pos; + uint8_t & increment = screen_data.BaseNumericAdjustmentScreen.increment; + + if (increment == 0) { + increment = tag; // Set the default value to be the first. + } + + switch (tag) { + case 240: label = PSTR( ".001"); pos = _decimals - 3; break; + case 241: label = PSTR( ".01" ); pos = _decimals - 2; break; + case 242: label = PSTR( "0.1" ); pos = _decimals - 1; break; + case 243: label = PSTR( "1" ); pos = _decimals + 0; break; + case 244: label = PSTR( "10" ); pos = _decimals + 1; break; + default: label = PSTR("100" ); pos = _decimals + 2; break; + } + + const bool highlight = (_what & FOREGROUND) && (increment == tag); + + switch (pos) { + #ifdef TOUCH_UI_PORTRAIT + case 0: _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; + case 1: _button(cmd, tag, BTN_POS(7,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; + case 2: _button(cmd, tag, BTN_POS(9,_line), BTN_SIZE(2,1), progmem_str(label), true, highlight); break; + #else + case 0: _button(cmd, tag, BTN_POS(15,2), BTN_SIZE(4,1), progmem_str(label), true, highlight); break; + case 1: _button(cmd, tag, BTN_POS(15,3), BTN_SIZE(4,1), progmem_str(label), true, highlight); break; + case 2: _button(cmd, tag, BTN_POS(15,4), BTN_SIZE(4,1), progmem_str(label), true, highlight); break; + #endif + } +} + +void BaseNumericAdjustmentScreen::widgets_t::increments() { + CommandProcessor cmd; + + cmd.font(LAYOUT_FONT); + + if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); + cmd.tag(0).text( + #ifdef TOUCH_UI_PORTRAIT + BTN_POS(1, _line), BTN_SIZE(4,1), + #else + BTN_POS(15, 1), BTN_SIZE(4,1), + #endif + GET_TEXT_F(MSG_INCREMENT) + ); + } + + _draw_increment_btn(cmd, _line+1, 245 - _decimals); + _draw_increment_btn(cmd, _line+1, 244 - _decimals); + _draw_increment_btn(cmd, _line+1, 243 - _decimals); + + #ifdef TOUCH_UI_PORTRAIT + _line++; + #endif +} + +void BaseNumericAdjustmentScreen::widgets_t::adjuster_sram_val(uint8_t tag, progmem_str label, const char *value, bool is_enabled) { + CommandProcessor cmd; + + if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); + cmd.tag(0) + .font(font_small) + .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); + _button_style(cmd, TEXT_AREA); + cmd.fgcolor(_color).button( BTN_POS(5,_line), BTN_SIZE(5,1), F(""), OPT_FLAT); + } + + cmd.font(font_medium); + _button(cmd, tag, BTN_POS(10,_line), BTN_SIZE(2,1), F("-"), is_enabled); + _button(cmd, tag + 1, BTN_POS(12,_line), BTN_SIZE(2,1), F("+"), is_enabled); + + if ((_what & FOREGROUND) && is_enabled) { + _button_style(cmd, BTN_NORMAL); + cmd.tag(0) + .font(font_small) + .text(BTN_POS(5,_line), BTN_SIZE(5,1), value); + } + + _line++; +} + +void BaseNumericAdjustmentScreen::widgets_t::adjuster(uint8_t tag, progmem_str label, const char *value, bool is_enabled) { + if (_what & BACKGROUND) { + adjuster_sram_val(tag, label, nullptr); + } + + if (_what & FOREGROUND) { + char b[strlen_P(value)+1]; + strcpy_P(b,value); + adjuster_sram_val(tag, label, b, is_enabled); + } +} + +void BaseNumericAdjustmentScreen::widgets_t::adjuster(uint8_t tag, progmem_str label, float value, bool is_enabled) { + if (_what & BACKGROUND) { + adjuster_sram_val(tag, label, nullptr); + } + + if (_what & FOREGROUND) { + char b[32]; + dtostrf(value, 5, _decimals, b); + strcat_P(b, PSTR(" ")); + strcat_P(b, (const char*) _units); + adjuster_sram_val(tag, label, b, is_enabled); + } +} + +void BaseNumericAdjustmentScreen::widgets_t::button(uint8_t tag, progmem_str label, bool is_enabled) { + CommandProcessor cmd; + cmd.font(LAYOUT_FONT); + _button(cmd, tag, BTN_POS(5,_line), BTN_SIZE(9,1), label, is_enabled); + + _line++; +} + +void BaseNumericAdjustmentScreen::widgets_t::text_field(uint8_t tag, progmem_str label, const char *value, bool is_enabled) { + CommandProcessor cmd; + + if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); + cmd.enabled(1) + .tag(0) + .font(font_small) + .text( BTN_POS(1,_line), BTN_SIZE(4,1), label); + _button_style(cmd, TEXT_AREA); + cmd.fgcolor(_color) + .tag(tag) + .button( BTN_POS(5,_line), BTN_SIZE(9,1), F(""), OPT_FLAT); + } + + if (_what & FOREGROUND) { + cmd.font(font_small).text( BTN_POS(5,_line), BTN_SIZE(9,1), is_enabled ? value : "-"); + } + + _line++; +} + +void BaseNumericAdjustmentScreen::widgets_t::two_buttons(uint8_t tag1, progmem_str label1, uint8_t tag2, progmem_str label2, bool is_enabled) { + CommandProcessor cmd; + cmd.font(LAYOUT_FONT); + _button(cmd, tag1, BTN_POS(5,_line), BTN_SIZE(4.5,1), label1, is_enabled); + _button(cmd, tag2, BTN_POS(9.5,_line), BTN_SIZE(4.5,1), label2, is_enabled); + + _line++; +} + +void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str label, bool value, bool is_enabled) { + CommandProcessor cmd; + + if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); + cmd.font(font_small) + .text( + #ifdef TOUCH_UI_PORTRAIT + BTN_POS(1, _line), BTN_SIZE( 8,1), + #else + BTN_POS(1, _line), BTN_SIZE(10,1), + #endif + label + ); + } + + if (_what & FOREGROUND) { + _button_style(cmd, BTN_TOGGLE); + cmd.tag(is_enabled ? tag : 0) + .enabled(is_enabled) + .font(font_small) + .toggle2( + #ifdef TOUCH_UI_PORTRAIT + BTN_POS( 9,_line), BTN_SIZE(5,1), + #else + BTN_POS(10,_line), BTN_SIZE(4,1), + #endif + GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), value + ); + } + + _line++; +} + +void BaseNumericAdjustmentScreen::widgets_t::home_buttons(uint8_t tag) { + CommandProcessor cmd; + + if (_what & BACKGROUND) { + _button_style(cmd, TEXT_LABEL); + cmd.font(font_small) + .text(BTN_POS(1, _line), BTN_SIZE(4,1), GET_TEXT_F(MSG_HOME)); + } + + cmd.font(LAYOUT_FONT); + _button(cmd, tag+0, BTN_POS(5,_line), BTN_SIZE(2,1), GET_TEXT_F(MSG_AXIS_X)); + _button(cmd, tag+1, BTN_POS(7,_line), BTN_SIZE(2,1), GET_TEXT_F(MSG_AXIS_Y)); + #if DISABLED(Z_SAFE_HOMING) + _button(cmd, tag+2, BTN_POS(9,_line), BTN_SIZE(2,1), GET_TEXT_F(MSG_AXIS_Z)); + _button(cmd, tag+3, BTN_POS(11,_line), BTN_SIZE(3,1), GET_TEXT_F(MSG_AXIS_ALL)); + #else + _button(cmd, tag+3, BTN_POS(9,_line), BTN_SIZE(3,1), GET_TEXT_F(MSG_AXIS_ALL)); + #endif + + _line++; +} + +void BaseNumericAdjustmentScreen::onEntry() { + screen_data.BaseNumericAdjustmentScreen.increment = 0; // This will force the increment to be picked while drawing. + BaseScreen::onEntry(); + CommandProcessor cmd; + cmd.set_button_style_callback(nullptr); +} + +bool BaseNumericAdjustmentScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + case 240 ... 245: screen_data.BaseNumericAdjustmentScreen.increment = tag; break; + default: return current_screen.onTouchHeld(tag); + } + return true; +} + +float BaseNumericAdjustmentScreen::getIncrement() { + switch (screen_data.BaseNumericAdjustmentScreen.increment) { + case 240: return 0.001; + case 241: return 0.01; + case 242: return 0.1; + case 243: return 1.0; + case 244: return 10.0; + case 245: return 100.0; + default: return 0.0; + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..c84dd45f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/base_screen.cpp @@ -0,0 +1,90 @@ +/******************* + * base_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void BaseScreen::onEntry() { + CommandProcessor cmd; + cmd.set_button_style_callback(buttonStyleCallback); + reset_menu_timeout(); + UIScreen::onEntry(); +} + +bool BaseScreen::buttonIsPressed(uint8_t tag) { + return tag != 0 && EventLoop::get_pressed_tag() == tag; +} + +bool BaseScreen::buttonStyleCallback(CommandProcessor &cmd, uint8_t tag, uint8_t &style, uint16_t &options, bool post) { + if (post) { + cmd.colors(normal_btn); + return false; + } + + #if LCD_TIMEOUT_TO_STATUS > 0 + if (EventLoop::get_pressed_tag() != 0) { + reset_menu_timeout(); + } + #endif + + if (buttonIsPressed(tag)) { + options = OPT_FLAT; + } + + if (style & cmd.STYLE_DISABLED) { + cmd.tag(0); + style &= ~cmd.STYLE_DISABLED; + cmd.colors(disabled_btn); + return true; // Call me again to reset the colors + } + return false; +} + +void BaseScreen::onIdle() { + #if LCD_TIMEOUT_TO_STATUS > 0 + if ((millis() - last_interaction) > LCD_TIMEOUT_TO_STATUS) { + reset_menu_timeout(); + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("Returning to status due to menu timeout"); + #endif + GOTO_SCREEN(StatusScreen); + } + #endif +} + +void BaseScreen::reset_menu_timeout() { + #if LCD_TIMEOUT_TO_STATUS > 0 + last_interaction = millis(); + #endif +} + +#if LCD_TIMEOUT_TO_STATUS > 0 + uint32_t BaseScreen::last_interaction; +#endif + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..a11609dd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -0,0 +1,353 @@ +/*********************** + * bed_mesh_screen.cpp * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 * + * * + * 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MESH) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 2 + #define GRID_ROWS 10 + + #define MESH_POS BTN_POS(1, 2), BTN_SIZE(2,5) + #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(2,1) + #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) + #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(1,1) + #define OKAY_POS BTN_POS(1,10), BTN_SIZE(2,1) +#else + #define GRID_COLS 5 + #define GRID_ROWS 5 + + #define MESH_POS BTN_POS(1,1), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(4,1), BTN_SIZE(2,1) + #define Z_LABEL_POS BTN_POS(4,2), BTN_SIZE(2,1) + #define Z_VALUE_POS BTN_POS(4,3), BTN_SIZE(2,1) + #define OKAY_POS BTN_POS(4,5), BTN_SIZE(2,1) +#endif + +void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max) { + constexpr uint8_t rows = GRID_MAX_POINTS_Y; + constexpr uint8_t cols = GRID_MAX_POINTS_X; + + #define VALUE(X,Y) (data ? data[X][Y] : 0) + #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) + #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) + + // Compute the mean, min and max for the points + + float val_mean = 0; + float val_max = -INFINITY; + float val_min = INFINITY; + uint8_t val_cnt = 0; + + if (data && (opts & USE_AUTOSCALE)) { + for (uint8_t y = 0; y < rows; y++) { + for (uint8_t x = 0; x < cols; x++) { + if (ISVAL(x,y)) { + const float val = VALUE(x,y); + val_mean += val; + val_max = max(val_max, val); + val_min = min(val_min, val); + val_cnt++; + } + } + } + } + if (val_cnt) { + val_mean /= val_cnt; + } else { + val_mean = 0; + val_min = 0; + val_max = 0; + } + + const float scale_z = ((val_max == val_min) ? 1 : 1/(val_max - val_min)) * autoscale_max; + + /** + * 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 + #define TRANSFORM_3(X,Y,Z) TRANSFORM_4((X), (Z), (Y)) // Swap Z and Y + #define TRANSFORM_2(X,Y,Z) TRANSFORM_3((X), (Y) + 2.5, (Z) - 1) // Translate + #define TRANSFORM(X,Y,Z) TRANSFORM_2(float(X)/(cols-1) - 0.5, float(Y)/(rows-1) - 0.5, (Z)) // Normalize + + // Compute the bounding box for the grid prior to scaling. Do this at compile-time by + // transforming the four corner points via the transformation equations and finding + // the min and max for each axis. + + constexpr float bounds[][3] = {{TRANSFORM(0 , 0 , 0)}, + {TRANSFORM(cols-1, 0 , 0)}, + {TRANSFORM(0 , rows-1, 0)}, + {TRANSFORM(cols-1, rows-1, 0)}}; + #define APPLY(FUNC, AXIS) FUNC(FUNC(bounds[0][AXIS], bounds[1][AXIS]), FUNC(bounds[2][AXIS], bounds[3][AXIS])) + constexpr float grid_x = APPLY(min,0); + constexpr float grid_y = APPLY(min,1); + constexpr float grid_w = APPLY(max,0) - grid_x; + constexpr float grid_h = APPLY(max,1) - grid_y; + constexpr float grid_cx = grid_x + grid_w/2; + constexpr float grid_cy = grid_y + grid_h/2; + + // Figure out scale and offset such that the grid fits within the rectangle given by (x,y,w,h) + + const float scale_x = float(w)/grid_w; + const float scale_y = float(h)/grid_h; + 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_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 + + const uint16_t basePointSize = min(w,h) / max(cols,rows); + + CommandProcessor cmd; + cmd.cmd(SAVE_CONTEXT()) + .cmd(TAG_MASK(false)) + .cmd(SAVE_CONTEXT()); + + for (uint8_t y = 0; y < rows; y++) { + for (uint8_t x = 0; x < cols; x++) { + if (ISVAL(x,y)) { + const bool hasLeftSegment = x < cols - 1 && ISVAL(x+1,y); + const bool hasRightSegment = y < rows - 1 && ISVAL(x,y+1); + if (hasLeftSegment || hasRightSegment) { + cmd.cmd(BEGIN(LINE_STRIP)); + if (hasLeftSegment) cmd.cmd(VERTEX2F(TRANSFORM(x + 1, y , HEIGHT(x + 1, y )))); + cmd.cmd( VERTEX2F(TRANSFORM(x , y , HEIGHT(x , y )))); + if (hasRightSegment) cmd.cmd(VERTEX2F(TRANSFORM(x , y + 1, HEIGHT(x , y + 1)))); + } + } + } + + if (opts & USE_POINTS) { + const float sq_min = sq(val_min - val_mean); + const float sq_max = sq(val_max - val_mean); + cmd.cmd(POINT_SIZE(basePointSize * 2)); + cmd.cmd(BEGIN(POINTS)); + for (uint8_t x = 0; x < cols; x++) { + if (ISVAL(x,y)) { + if (opts & USE_COLORS) { + const float val_dev = VALUE(x, y) - val_mean; + const uint8_t neg_byte = sq(val_dev) / (val_dev < 0 ? sq_min : sq_max) * 0xFF; + const uint8_t pos_byte = 255 - neg_byte; + cmd.cmd(COLOR_RGB(pos_byte, pos_byte, 0xFF)); + } + cmd.cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); + } + } + if (opts & USE_COLORS) { + cmd.cmd(RESTORE_CONTEXT()) + .cmd(SAVE_CONTEXT()); + } + } + } + cmd.cmd(RESTORE_CONTEXT()) + .cmd(TAG_MASK(true)); + + if (opts & USE_TAGS) { + cmd.cmd(COLOR_MASK(false, false, false, false)) + .cmd(POINT_SIZE(basePointSize * 10)) + .cmd(BEGIN(POINTS)); + for (uint8_t y = 0; y < rows; y++) { + for (uint8_t x = 0; x < cols; x++) { + const uint8_t tag = pointToTag(x, y); + cmd.tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); + } + } + cmd.cmd(COLOR_MASK(true, true, true, true)); + } + + if (opts & USE_HIGHLIGHT) { + const uint8_t tag = screen_data.BedMeshScreen.highlightedTag; + uint8_t x, y; + if (tagToPoint(tag, x, y)) { + cmd.cmd(COLOR_A(128)) + .cmd(POINT_SIZE(basePointSize * 6)) + .cmd(BEGIN(POINTS)) + .tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); + } + } + cmd.cmd(END()); + cmd.cmd(RESTORE_CONTEXT()); +} + +uint8_t BedMeshScreen::pointToTag(uint8_t x, uint8_t y) { + return y * (GRID_MAX_POINTS_X) + x + 10; +} + +bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { + if (tag < 10) return false; + x = (tag - 10) % (GRID_MAX_POINTS_X); + y = (tag - 10) / (GRID_MAX_POINTS_X); + return true; +} + +void BedMeshScreen::onEntry() { + screen_data.BedMeshScreen.highlightedTag = 0; + screen_data.BedMeshScreen.count = GRID_MAX_POINTS; + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; + BaseScreen::onEntry(); +} + +float BedMeshScreen::getHightlightedValue() { + if (screen_data.BedMeshScreen.highlightedTag) { + xy_uint8_t pt; + tagToPoint(screen_data.BedMeshScreen.highlightedTag, pt.x, pt.y); + return ExtUI::getMeshPoint(pt); + } + return NAN; +} + +void BedMeshScreen::drawHighlightedPointValue() { + char str[16]; + const float val = getHightlightedValue(); + const bool isGood = !isnan(val); + if (isGood) + dtostrf(val, 5, 3, str); + else + strcpy_P(str, PSTR("-")); + + CommandProcessor cmd; + cmd.font(Theme::font_medium) + .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) + .text(Z_VALUE_POS, str) + .colors(action_btn) + .tag(1).button( OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) + .tag(0); + + switch (screen_data.BedMeshScreen.message) { + case screen_data.BedMeshScreen.MSG_MESH_COMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_DONE)); break; + case screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE: cmd.text(MESSAGE_POS, GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE)); break; + default: break; + } +} + +void BedMeshScreen::onRedraw(draw_mode_t what) { + #define _INSET_POS(x,y,w,h) x + min(w,h)/10, y + min(w,h)/10, w - min(w,h)/5, h - min(w,h)/5 + #define INSET_POS(pos) _INSET_POS(pos) + + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)); + + // Draw the shadow and tags + cmd.cmd(COLOR_RGB(0x444444)); + BedMeshScreen::drawMesh(INSET_POS(MESH_POS), nullptr, USE_POINTS | USE_TAGS); + cmd.cmd(COLOR_RGB(bg_text_enabled)); + } + + if (what & FOREGROUND) { + constexpr float autoscale_max_amplitude = 0.03; + const bool gotAllPoints = screen_data.BedMeshScreen.count >= GRID_MAX_POINTS; + if (gotAllPoints) { + drawHighlightedPointValue(); + } + const float levelingProgress = sq(float(screen_data.BedMeshScreen.count) / GRID_MAX_POINTS); + BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), + USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), + autoscale_max_amplitude * levelingProgress + ); + } +} + +bool BedMeshScreen::onTouchStart(uint8_t tag) { + screen_data.BedMeshScreen.highlightedTag = tag; + return true; +} + +bool BedMeshScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + GOTO_PREVIOUS(); + return true; + default: + return false; + } +} + +void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { + if (AT_SCREEN(BedMeshScreen)) + onRefresh(); +} + +bool BedMeshScreen::isMeshComplete(ExtUI::bed_mesh_t data) { + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; y++) { + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; x++) { + if (isnan(data[x][y])) { + return false; + } + } + } + return true; +} + +void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { + switch (state) { + case ExtUI::MESH_START: + screen_data.BedMeshScreen.count = 0; + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_NONE; + break; + case ExtUI::MESH_FINISH: + if (screen_data.BedMeshScreen.count == GRID_MAX_POINTS && isMeshComplete(ExtUI::getMeshArray())) { + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_COMPLETE; + } else { + screen_data.BedMeshScreen.message = screen_data.BedMeshScreen.MSG_MESH_INCOMPLETE; + } + screen_data.BedMeshScreen.count = GRID_MAX_POINTS; + break; + case ExtUI::PROBE_START: + screen_data.BedMeshScreen.highlightedTag = pointToTag(x, y); + break; + case ExtUI::PROBE_FINISH: + screen_data.BedMeshScreen.count++; + break; + } + BedMeshScreen::onMeshUpdate(x, y, 0); +} + +void BedMeshScreen::startMeshProbe() { + GOTO_SCREEN(BedMeshScreen); + screen_data.BedMeshScreen.count = 0; + injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); +} + +#endif // TOUCH_UI_FTDI_EVE && HAS_MESH 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 new file mode 100644 index 00000000..76ebdca5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_advanced_settings.cpp @@ -0,0 +1,137 @@ +/***************************** + * bio_advanced_settings.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + #define GRID_ROWS 9 + #define GRID_COLS 2 + + .tag(2) .button( BTN_POS(1,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_DISPLAY_MENU)) + .enabled( + #if HAS_TRINAMIC_CONFIG + 1 + #endif + ) + .tag(3) .button( BTN_POS(1,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_CURRENT)) + .enabled( + #if HAS_TRINAMIC_CONFIG + 1 + #endif + ) + .tag(4) .button( BTN_POS(1,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_TMC_HOMING_THRS)) + .tag(5) .button( BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .enabled( + #if HAS_MULTI_HOTEND + 1 + #endif + ) + .tag(6) .button( BTN_POS(1,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_OFFSETS_MENU)) + + + .tag(7) .button( BTN_POS(2,1), BTN_SIZE(1,1), GET_TEXT_F(MSG_STEPS_PER_MM)) + .tag(8) .button( BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_VELOCITY)) + .tag(9) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_ACCELERATION)) + #if HAS_JUNCTION_DEVIATION + .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JUNCTION_DEVIATION)) + #else + .tag(10) .button( BTN_POS(2,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_JERK)) + #endif + .enabled( + #if ENABLED(BACKLASH_GCODE) + 1 + #endif + ) + .tag(11) .button( BTN_POS(2,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACKLASH)) + .enabled( + #if ENABLED(LIN_ADVANCE) + 1 + #endif + ) + .tag(12) .button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_LINEAR_ADVANCE)) + .tag(13) .button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) + .tag(14) .button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_RESTORE_DEFAULTS)) + .colors(action_btn) + .tag(1). button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + #undef GRID_COLS + #undef GRID_ROWS + } +} + +bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + + switch (tag) { + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: GOTO_SCREEN(DisplayTuningScreen); break; + #if HAS_TRINAMIC_CONFIG + case 3: GOTO_SCREEN(StepperCurrentScreen); break; + case 4: GOTO_SCREEN(StepperBumpSensitivityScreen); break; + #endif + case 5: GOTO_SCREEN(EndstopStatesScreen); break; + #if HAS_MULTI_HOTEND + case 6: GOTO_SCREEN(NozzleOffsetScreen); break; + #endif + + case 7: GOTO_SCREEN(StepsScreen); break; + case 8: GOTO_SCREEN(MaxVelocityScreen); break; + case 9: GOTO_SCREEN(DefaultAccelerationScreen); break; + case 10: + #if HAS_JUNCTION_DEVIATION + GOTO_SCREEN(JunctionDeviationScreen); + #else + GOTO_SCREEN(JerkScreen); + #endif + break; + #if ENABLED(BACKLASH_GCODE) + case 11: GOTO_SCREEN(BacklashCompensationScreen); break; + #endif + #if ENABLED(LIN_ADVANCE) + case 12: GOTO_SCREEN(LinearAdvanceScreen); break; + #endif + case 13: GOTO_SCREEN(InterfaceSettingsScreen); break; + case 14: GOTO_SCREEN(RestoreFailsafeDialogBox); break; + + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..da772971 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_e.cpp @@ -0,0 +1,56 @@ +/**************************** + * bio_confirm_home_xyz.cpp * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; + +void BioConfirmHomeE::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_HOME_E_WARNING)); + drawYesNoButtons(1); +} + +bool BioConfirmHomeE::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + #if defined(AXIS_LEVELING_COMMANDS) && defined(PARK_AND_RELEASE_COMMANDS) + SpinnerDialogBox::enqueueAndWait_P(F( + "G28 E\n" + AXIS_LEVELING_COMMANDS "\n" + PARK_AND_RELEASE_COMMANDS + )); + #endif + current_screen.forget(); + break; + case 2: + GOTO_SCREEN(StatusScreen); + break; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } + return true; +} +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..48ce3204 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_confirm_home_xyz.cpp @@ -0,0 +1,55 @@ +/**************************** + * bio_confirm_home_xyz.cpp * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; + +void BioConfirmHomeXYZ::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_HOME_XYZ_WARNING)); + drawYesNoButtons(1); +} + +bool BioConfirmHomeXYZ::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + #ifdef PARK_AND_RELEASE_COMMANDS + SpinnerDialogBox::enqueueAndWait_P(F( + "G28\n" + PARK_AND_RELEASE_COMMANDS + )); + #endif + current_screen.forget(); + break; + case 2: + GOTO_SCREEN(StatusScreen); + break; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } + return true; +} +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..e2bb8a24 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_main_menu.cpp @@ -0,0 +1,88 @@ +/********************* + * bio_main_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void MainMenu::onRedraw(draw_mode_t what) { + #define GRID_ROWS 10 + #define GRID_COLS 2 + + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .font(font_large).text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_MAIN)) + .colors(normal_btn) + .font(font_medium) + .tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) + .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) + .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) + .tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) + .tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) + .tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_INTERFACE)) + .tag(8).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag(9).button( BTN_POS(1,9), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_MENU)) + .colors(action_btn) + .tag(1).button( BTN_POS(1,10), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + } + + #undef GRID_COLS + #undef GRID_ROWS +} + +bool MainMenu::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + + const bool e_homed = isAxisPositionKnown(E0); + + switch (tag) { + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: GOTO_SCREEN(BioConfirmHomeXYZ); break; + case 3: SpinnerDialogBox::enqueueAndWait_P(e_homed ? F("G0 E0 F120") : F("G112")); break; + case 4: StatusScreen::unlockMotors(); break; + #ifdef AXIS_LEVELING_COMMANDS + case 5: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; + #endif + case 6: GOTO_SCREEN(TemperatureScreen); break; + case 7: GOTO_SCREEN(InterfaceSettingsScreen); break; + case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; + case 9: GOTO_SCREEN(AboutScreen); break; + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..9279fd7d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_landscape.h @@ -0,0 +1,59 @@ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.py" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000; +constexpr float x_max = 480.000000; +constexpr float y_min = 0.000000; +constexpr float y_max = 272.000000; + +const PROGMEM uint16_t z_neg[] = {0x7950, 0x51EA, 0x824E, 0x51EA, 0x824E, 0x71E2, 0x86CD, 0x71E2, 0x7DCF, 0x81DF, 0x74D1, 0x71E2, 0x7950, 0x71E2, 0x7950, 0x51EA}; +const PROGMEM uint16_t z_pos[] = {0x7950, 0x41EE, 0x824E, 0x41EE, 0x824E, 0x21F5, 0x86CD, 0x21F5, 0x7DCF, 0x11F9, 0x74D0, 0x21F5, 0x7950, 0x21F5, 0x7950, 0x41EE}; +const PROGMEM uint16_t y_neg[] = {0x3479, 0x56CF, 0x3EC6, 0x56CF, 0x3747, 0x7281, 0x3C6D, 0x7281, 0x2E61, 0x8059, 0x27D4, 0x7281, 0x2CFA, 0x7281, 0x3479, 0x56CF}; +const PROGMEM uint16_t y_pos[] = {0x3BF9, 0x3B1D, 0x4645, 0x3B1D, 0x4DC4, 0x1F6B, 0x52EB, 0x1F6B, 0x4C5E, 0x1192, 0x3E52, 0x1F6B, 0x4378, 0x1F6B, 0x3BF9, 0x3B1D}; +const PROGMEM uint16_t x_neg[] = {0x350E, 0x4209, 0x314E, 0x4FE2, 0x1CB5, 0x4FE2, 0x1AD6, 0x56CF, 0x1449, 0x48F6, 0x2255, 0x3B1D, 0x2075, 0x4209, 0x350E, 0x4209}; +const PROGMEM uint16_t x_pos[] = {0x498C, 0x4209, 0x45CC, 0x4FE2, 0x5A65, 0x4FE2, 0x5885, 0x56CF, 0x6691, 0x48F6, 0x6004, 0x3B1D, 0x5E25, 0x4209, 0x498C, 0x4209}; +const PROGMEM uint16_t syringe_fluid[] = {0xB4E9, 0x78BE, 0xBB12, 0x7C44, 0xBDE3, 0x7C44, 0xC426, 0x78BE, 0xC426, 0x250D, 0xB4E9, 0x250D, 0xB4E9, 0x78BE}; +const PROGMEM uint16_t syringe[] = {0xB8AD, 0x6BB1, 0xB8AD, 0x6E0C, 0xBE02, 0x6E0C, 0xBE02, 0x6BB1, 0xFFFF, 0xB8AD, 0x6248, 0xB8AD, 0x64A2, 0xBE02, 0x64A2, 0xBE02, 0x6248, 0xFFFF, 0xB8AD, 0x58DF, 0xB8AD, 0x5B39, 0xBE02, 0x5B39, 0xBE02, 0x58DF, 0xFFFF, 0xB8AD, 0x4F75, 0xB8AD, 0x51D0, 0xBE02, 0x51D0, 0xBE02, 0x4F75, 0xFFFF, 0xB8AD, 0x460C, 0xB8AD, 0x4866, 0xBE02, 0x4866, 0xBE02, 0x460C, 0xFFFF, 0xB8AD, 0x3CA3, 0xB8AD, 0x3EFD, 0xBE02, 0x3EFD, 0xBE02, 0x3CA3, 0xFFFF, 0xB8AD, 0x3339, 0xB8AD, 0x3594, 0xBE02, 0x3594, 0xBE02, 0x3339, 0xFFFF, 0xB396, 0x110A, 0xB396, 0x1818, 0xB995, 0x1818, 0xB995, 0x22AD, 0xB396, 0x22AD, 0xB396, 0x7ADA, 0xB995, 0x7E61, 0xB995, 0x88F5, 0xBB95, 0x88F5, 0xBB95, 0xA8B4, 0xBD94, 0xAC3B, 0xBD94, 0x88F5, 0xBF94, 0x88F5, 0xBF94, 0x7E61, 0xC593, 0x7ADA, 0xC593, 0x22AD, 0xBF94, 0x22AD, 0xBF94, 0x1818, 0xC593, 0x1818, 0xC593, 0x110A, 0xFFFF, 0xBB95, 0x1818, 0xBD94, 0x1818, 0xBD94, 0x22AD, 0xBB95, 0x22AD, 0xBB95, 0x1818, 0xFFFF, 0xB596, 0x2634, 0xC393, 0x2634, 0xC393, 0x7753, 0xBD94, 0x7ADA, 0xBB95, 0x7ADA, 0xB596, 0x7753, 0xB596, 0x2634}; +const PROGMEM uint16_t syringe_outline[] = {0xB396, 0x110A, 0xB396, 0x1818, 0xB995, 0x1818, 0xB995, 0x22AD, 0xB396, 0x22AD, 0xB396, 0x7ADA, 0xB995, 0x7E61, 0xB995, 0x88F5, 0xBB95, 0x88F5, 0xBB95, 0xA8B4, 0xBD94, 0xAC3B, 0xBD94, 0x88F5, 0xBF94, 0x88F5, 0xBF94, 0x7E61, 0xC593, 0x7ADA, 0xC593, 0x22AD, 0xBF94, 0x22AD, 0xBF94, 0x1818, 0xC593, 0x1818, 0xC593, 0x110A, 0xB396, 0x110A}; +const PROGMEM uint16_t padlock[] = {0x3FE3, 0x2A04, 0x3D34, 0x2AF9, 0x3AFF, 0x2D93, 0x397D, 0x316D, 0x38E8, 0x3626, 0x38E8, 0x3A14, 0x39B3, 0x3C8F, 0x3B50, 0x3C8F, 0x3C1C, 0x3A14, 0x3C1C, 0x363C, 0x3C6B, 0x33A9, 0x3D3A, 0x3193, 0x3E6C, 0x302D, 0x3FE3, 0x2FAA, 0x415A, 0x302D, 0x428C, 0x3192, 0x435B, 0x33A8, 0x43AB, 0x363C, 0x43AB, 0x4492, 0x38C3, 0x4492, 0x3741, 0x45AC, 0x36A1, 0x4856, 0x36A1, 0x5C41, 0x3741, 0x5EEC, 0x38C3, 0x6005, 0x4703, 0x6005, 0x4886, 0x5EEC, 0x4925, 0x5C41, 0x4925, 0x4856, 0x4886, 0x45AC, 0x4703, 0x4492, 0x46DE, 0x362B, 0x4649, 0x316D, 0x44C7, 0x2D92, 0x4292, 0x2AF9}; +const PROGMEM uint16_t home_z[] = {0x80BB, 0x2B43, 0x712C, 0x46B9, 0x750F, 0x46B9, 0x750F, 0x622F, 0x7CD7, 0x622F, 0x7CD7, 0x5474, 0x849F, 0x5474, 0x849F, 0x622F, 0x8C67, 0x622F, 0x8C67, 0x46B9, 0x904B, 0x46B9, 0x8A48, 0x3C1D, 0x8A48, 0x2ECD, 0x8664, 0x2ECD, 0x8664, 0x3540}; +const PROGMEM uint16_t usb_btn[] = {0x0558, 0xC0D6, 0x3BDB, 0xC0D6, 0x3BDB, 0xF431, 0x0558, 0xF431, 0x0558, 0xC0D6}; +const PROGMEM uint16_t menu_btn[] = {0x416B, 0xC0D6, 0x77EE, 0xC0D6, 0x77EE, 0xF431, 0x416B, 0xF431, 0x416B, 0xC0D6}; +const PROGMEM uint16_t e_pos[] = {0xE04E, 0x5E7B, 0xE94C, 0x5E7B, 0xE94C, 0x7E74, 0xEDCB, 0x7E74, 0xE4CD, 0x8E70, 0xDBCF, 0x7E74, 0xE04E, 0x7E74, 0xE04E, 0x5E7B}; +const PROGMEM uint16_t e_neg[] = {0xE04E, 0x4E7F, 0xE94C, 0x4E7F, 0xE94C, 0x2E87, 0xEDCB, 0x2E87, 0xE4CD, 0x1E8A, 0xDBCF, 0x2E87, 0xE04E, 0x2E87, 0xE04E, 0x4E7F}; +const PROGMEM uint16_t home_e[] = {0xD705, 0x3885, 0xC775, 0x53FB, 0xCB59, 0x53FB, 0xCB59, 0x6F71, 0xD321, 0x6F71, 0xD321, 0x61B6, 0xDAE9, 0x61B6, 0xDAE9, 0x6F71, 0xE2B1, 0x6F71, 0xE2B1, 0x53FB, 0xE695, 0x53FB, 0xE092, 0x495F, 0xE092, 0x3C0E, 0xDCAE, 0x3C0E, 0xDCAE, 0x4281}; +const PROGMEM uint16_t fine_label[] = {0x0D92, 0x9444, 0x5211, 0x9444, 0x5211, 0xA9EA, 0x0D92, 0xA9EA}; +const PROGMEM uint16_t fine_toggle[] = {0x56E7, 0x9444, 0x8007, 0x9444, 0x8007, 0xA9EA, 0x56E7, 0xA9EA}; +const PROGMEM uint16_t h1_temp[] = {0x9C2B, 0xDD3B, 0xBBDE, 0xDD3B, 0xBBDE, 0xFA57, 0x9C2B, 0xFA57}; +const PROGMEM uint16_t h1_label[] = {0x9C2B, 0xBE8F, 0xBBDC, 0xBE8F, 0xBBDC, 0xDBAA, 0x9C2B, 0xDBAA}; +const PROGMEM uint16_t h0_temp[] = {0x7BD0, 0xDD3B, 0x9B83, 0xDD3B, 0x9B83, 0xFA57, 0x7BD0, 0xFA57}; +const PROGMEM uint16_t h0_label[] = {0x7BD0, 0xBE8F, 0x9B83, 0xBE8F, 0x9B83, 0xDBAA, 0x7BD0, 0xDBAA}; +const PROGMEM uint16_t h2_temp[] = {0xBC86, 0xDD3B, 0xDC39, 0xDD3B, 0xDC39, 0xFA57, 0xBC86, 0xFA57}; +const PROGMEM uint16_t h2_label[] = {0xBC86, 0xBE8F, 0xDC37, 0xBE8F, 0xDC37, 0xDBAA, 0xBC86, 0xDBAA}; +const PROGMEM uint16_t h3_temp[] = {0xDCE2, 0xDD0D, 0xFC95, 0xDD0D, 0xFC95, 0xFA28, 0xDCE2, 0xFA28}; +const PROGMEM uint16_t h3_label[] = {0xDCE2, 0xBE60, 0xFC92, 0xBE60, 0xFC92, 0xDB7C, 0xDCE2, 0xDB7C}; +const PROGMEM uint16_t actual_temp[] = {0xCDF6, 0xD037, 0xF7CA, 0xD037, 0xF7CA, 0xF424, 0xCDF6, 0xF424}; +const PROGMEM uint16_t bed_icon[] = {0xCDF6, 0xA5CC, 0xF7CA, 0xA5CC, 0xF7CA, 0xC9B9, 0xCDF6, 0xC9B9}; 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 new file mode 100644 index 00000000..f03e3413 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printer_ui_portrait.h @@ -0,0 +1,52 @@ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.py" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000; +constexpr float x_max = 272.000000; +constexpr float y_min = 0.000000; +constexpr float y_max = 480.000000; + +const PROGMEM uint16_t z_neg[] = {0xC9B1, 0x96B3, 0xD990, 0x96B3, 0xD990, 0xA8D0, 0xE17F, 0xA8D0, 0xD1A0, 0xB1DF, 0xC1C2, 0xA8D0, 0xC9B1, 0xA8D0, 0xC9B1, 0x96B3}; +const PROGMEM uint16_t z_pos[] = {0xC9B1, 0x8DA4, 0xD990, 0x8DA4, 0xD990, 0x7B86, 0xE17F, 0x7B86, 0xD1A0, 0x7277, 0xC1C2, 0x7B86, 0xC9B1, 0x7B86, 0xC9B1, 0x8DA4}; +const PROGMEM uint16_t y_neg[] = {0x5037, 0x9979, 0x6264, 0x9979, 0x5529, 0xA92A, 0x5E3F, 0xA92A, 0x4575, 0xB103, 0x39E6, 0xA92A, 0x42FC, 0xA92A, 0x5037, 0x9979}; +const PROGMEM uint16_t y_pos[] = {0x5D72, 0x89C7, 0x6F9F, 0x89C7, 0x7CDA, 0x7A15, 0x85F0, 0x7A15, 0x7A61, 0x723D, 0x6197, 0x7A15, 0x6AAD, 0x7A15, 0x5D72, 0x89C7}; +const PROGMEM uint16_t x_neg[] = {0x513D, 0x8DB3, 0x4AA0, 0x958C, 0x2647, 0x958C, 0x22F8, 0x9979, 0x1769, 0x91A0, 0x3033, 0x89C7, 0x2CE4, 0x8DB3, 0x513D, 0x8DB3}; +const PROGMEM uint16_t x_pos[] = {0x7566, 0x8DB3, 0x6EC9, 0x958C, 0x9322, 0x958C, 0x8FD4, 0x9979, 0xA89E, 0x91A0, 0x9D0E, 0x89C7, 0x99C0, 0x8DB3, 0x7566, 0x8DB3}; +const PROGMEM uint16_t syringe_fluid[] = {0x7D1D, 0x4A0F, 0x87FC, 0x4C0E, 0x8CF4, 0x4C0E, 0x9801, 0x4A0F, 0x9801, 0x1AA2, 0x7D1D, 0x1AA2, 0x7D1D, 0x4A0F}; +const PROGMEM uint16_t syringe[] = {0x83C2, 0x42AA, 0x83C2, 0x43FF, 0x8D2C, 0x43FF, 0x8D2C, 0x42AA, 0xFFFF, 0x83C2, 0x3D54, 0x83C2, 0x3EAA, 0x8D2C, 0x3EAA, 0x8D2C, 0x3D54, 0xFFFF, 0x83C2, 0x37FF, 0x83C2, 0x3954, 0x8D2C, 0x3954, 0x8D2C, 0x37FF, 0xFFFF, 0x83C2, 0x32AA, 0x83C2, 0x33FF, 0x8D2C, 0x33FF, 0x8D2C, 0x32AA, 0xFFFF, 0x83C2, 0x2D54, 0x83C2, 0x2EAA, 0x8D2C, 0x2EAA, 0x8D2C, 0x2D54, 0xFFFF, 0x83C2, 0x27FF, 0x83C2, 0x2955, 0x8D2C, 0x2955, 0x8D2C, 0x27FF, 0xFFFF, 0x83C2, 0x22AA, 0x83C2, 0x23FF, 0x8D2C, 0x23FF, 0x8D2C, 0x22AA, 0xFFFF, 0x7AC7, 0x0F4B, 0x7AC7, 0x134A, 0x855B, 0x134A, 0x855B, 0x1949, 0x7AC7, 0x1949, 0x7AC7, 0x4B40, 0x855B, 0x4D40, 0x855B, 0x533F, 0x88E2, 0x533F, 0x88E2, 0x653C, 0x8C69, 0x673C, 0x8C69, 0x533F, 0x8FF0, 0x533F, 0x8FF0, 0x4D40, 0x9A85, 0x4B40, 0x9A85, 0x1949, 0x8FF0, 0x1949, 0x8FF0, 0x134A, 0x9A85, 0x134A, 0x9A85, 0x0F4B, 0xFFFF, 0x88E2, 0x134A, 0x8C69, 0x134A, 0x8C69, 0x1949, 0x88E2, 0x1949, 0x88E2, 0x134A, 0xFFFF, 0x7E4D, 0x1B49, 0x96FE, 0x1B49, 0x96FE, 0x4941, 0x8C69, 0x4B40, 0x88E2, 0x4B40, 0x7E4D, 0x4941, 0x7E4D, 0x1B49}; +const PROGMEM uint16_t syringe_outline[] = {0x7AC7, 0x0F4B, 0x7AC7, 0x134A, 0x855B, 0x134A, 0x855B, 0x1949, 0x7AC7, 0x1949, 0x7AC7, 0x4B40, 0x855B, 0x4D40, 0x855B, 0x533F, 0x88E2, 0x533F, 0x88E2, 0x653C, 0x8C69, 0x673C, 0x8C69, 0x533F, 0x8FF0, 0x533F, 0x8FF0, 0x4D40, 0x9A85, 0x4B40, 0x9A85, 0x1949, 0x8FF0, 0x1949, 0x8FF0, 0x134A, 0x9A85, 0x134A, 0x9A85, 0x0F4B, 0x7AC7, 0x0F4B}; +const PROGMEM uint16_t padlock[] = {0x645A, 0x8017, 0x5F9E, 0x80A1, 0x5BBA, 0x821B, 0x5911, 0x844A, 0x580A, 0x86F7, 0x580A, 0x8931, 0x5970, 0x8A98, 0x5C49, 0x8A98, 0x5DB0, 0x8931, 0x5DB0, 0x8703, 0x5E3C, 0x858E, 0x5FAA, 0x845F, 0x61C5, 0x8394, 0x645A, 0x834A, 0x66F0, 0x8394, 0x690C, 0x845F, 0x6A7A, 0x858D, 0x6B07, 0x8703, 0x6B07, 0x8F23, 0x57C8, 0x8F23, 0x551E, 0x8FC3, 0x5404, 0x9145, 0x5404, 0x9C8F, 0x551E, 0x9E11, 0x57C8, 0x9EB1, 0x70EE, 0x9EB1, 0x7398, 0x9E11, 0x74B2, 0x9C8F, 0x74B2, 0x9145, 0x7398, 0x8FC3, 0x70EE, 0x8F23, 0x70AC, 0x86FA, 0x6FA5, 0x844A, 0x6CFD, 0x821B, 0x6917, 0x80A1}; +const PROGMEM uint16_t home_z[] = {0xD6C9, 0x80CC, 0xBB53, 0x905B, 0xC231, 0x905B, 0xC231, 0x9FEB, 0xCFEC, 0x9FEB, 0xCFEC, 0x9823, 0xDDA7, 0x9823, 0xDDA7, 0x9FEB, 0xEB62, 0x9FEB, 0xEB62, 0x905B, 0xF240, 0x905B, 0xE7A3, 0x8A58, 0xE7A3, 0x82CD, 0xE0C6, 0x82CD, 0xE0C6, 0x8674}; +const PROGMEM uint16_t home_e[] = {0xB94F, 0x25AA, 0x9DD8, 0x353A, 0xA4B6, 0x353A, 0xA4B6, 0x44C9, 0xB271, 0x44C9, 0xB271, 0x3D02, 0xC02C, 0x3D02, 0xC02C, 0x44C9, 0xCDE7, 0x44C9, 0xCDE7, 0x353A, 0xD4C5, 0x353A, 0xCA28, 0x2F36, 0xCA28, 0x27AB, 0xC34B, 0x27AB, 0xC34B, 0x2B53}; +const PROGMEM uint16_t bed_icon[] = {0x1764, 0x2C4C, 0x6135, 0x2C4C, 0x6135, 0x40A8, 0x1764, 0x40A8}; +const PROGMEM uint16_t actual_temp[] = {0x1764, 0x466F, 0x6135, 0x466F, 0x6135, 0x5ACB, 0x1764, 0x5ACB}; +const PROGMEM uint16_t target_temp[] = {0x1764, 0x1228, 0x6135, 0x1228, 0x6135, 0x2684, 0x1764, 0x2684}; +const PROGMEM uint16_t fine_label[] = {0x1AA7, 0xC6D2, 0x9387, 0xC6D2, 0x9387, 0xD316, 0x1AA7, 0xD316}; +const PROGMEM uint16_t fine_toggle[] = {0x9C10, 0xC6D2, 0xE4A3, 0xC6D2, 0xE4A3, 0xD316, 0x9C10, 0xD316}; +const PROGMEM uint16_t usb_btn[] = {0x0B68, 0xE880, 0x7B1A, 0xE880, 0x7B1A, 0xF94B, 0x0B68, 0xF94B, 0x0B68, 0xE880}; +const PROGMEM uint16_t menu_btn[] = {0x84E3, 0xE880, 0xF495, 0xE880, 0xF495, 0xF94B, 0x84E3, 0xF94B, 0x84E3, 0xE880}; +const PROGMEM uint16_t e_pos[] = {0xC9B1, 0x3B2D, 0xD990, 0x3B2D, 0xD990, 0x4D4B, 0xE17F, 0x4D4B, 0xD1A0, 0x565A, 0xC1C2, 0x4D4B, 0xC9B1, 0x4D4B, 0xC9B1, 0x3B2D}; +const PROGMEM uint16_t e_neg[] = {0xC9B1, 0x321E, 0xD990, 0x321E, 0xD990, 0x2000, 0xE17F, 0x2000, 0xD1A0, 0x16F1, 0xC1C2, 0x2000, 0xC9B1, 0x2000, 0xC9B1, 0x321E}; 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 new file mode 100644 index 00000000..c5e26da9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -0,0 +1,155 @@ +/******************************* + * bio_printing_dialog_box.cpp * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +#include "../ftdi_eve_lib/extras/circular_progress.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#define GRID_COLS 2 +#define GRID_ROWS 9 + +void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char* message) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + draw_text_box(cmd, BTN_POS(1,2), BTN_SIZE(2,2), message, OPT_CENTER, font_large); + } +} + +void BioPrintingDialogBox::draw_progress(draw_mode_t what) { + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.font(font_large) + .text(BTN_POS(1,1), BTN_SIZE(2,2), isPrinting() ? F("Printing...") : F("Finished.")) + .tag(1) + .font(font_xlarge); + + draw_circular_progress(cmd, BTN_POS(1,4), BTN_SIZE(2,3), getProgress_percent(), theme_dark, theme_darkest); + } +} + +void BioPrintingDialogBox::draw_time_remaining(draw_mode_t what) { + if (what & FOREGROUND) { + const uint32_t elapsed = getProgress_seconds_elapsed(); + const uint8_t hrs = elapsed/3600; + const uint8_t min = (elapsed/60)%60; + + char time_str[10]; + sprintf_P(time_str, PSTR("%02dh %02dm"), hrs, min); + + CommandProcessor cmd; + cmd.font(font_large) + .text(BTN_POS(1,7), BTN_SIZE(2,2), time_str); + } +} + +void BioPrintingDialogBox::draw_interaction_buttons(draw_mode_t what) { + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(font_medium) + .colors(isPrinting() ? action_btn : normal_btn) + .tag(2).button(BTN_POS(1,9), BTN_SIZE(1,1), F("Menu")) + #if ENABLED(SDSUPPORT) + .enabled(isPrinting() ? isPrintingFromMedia() : 1) + #else + .enabled(isPrinting() ? 0 : 1) + #endif + .tag(3) + .colors(isPrinting() ? normal_btn : action_btn) + .button( BTN_POS(2,9), BTN_SIZE(1,1), isPrinting() ? F("Cancel") : F("Back")); + } +} + +void BioPrintingDialogBox::onRedraw(draw_mode_t what) { + if (what & FOREGROUND) { + draw_progress(FOREGROUND); + draw_time_remaining(FOREGROUND); + draw_interaction_buttons(FOREGROUND); + } +} + +bool BioPrintingDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_SCREEN(FeedratePercentScreen); break; + case 2: GOTO_SCREEN(TuneMenu); break; + case 3: + if (isPrinting()) + GOTO_SCREEN(ConfirmAbortPrintDialogBox); + else + GOTO_SCREEN(StatusScreen); + break; + default: return false; + } + return true; +} + +void BioPrintingDialogBox::setStatusMessage(progmem_str message) { + char buff[strlen_P((const char*)message)+1]; + strcpy_P(buff, (const char*) message); + setStatusMessage(buff); +} + +void BioPrintingDialogBox::setStatusMessage(const char* message) { + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)); + + draw_status_message(BACKGROUND, message); + draw_progress(BACKGROUND); + draw_time_remaining(BACKGROUND); + draw_interaction_buttons(BACKGROUND); + storeBackground(); + + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("New status message: ", message); + #endif + + if (AT_SCREEN(BioPrintingDialogBox)) + current_screen.onRefresh(); +} + +void BioPrintingDialogBox::onIdle() { + reset_menu_timeout(); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} + +void BioPrintingDialogBox::show() { + GOTO_SCREEN(BioPrintingDialogBox); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..e881995f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -0,0 +1,462 @@ +/************************* + * bio_status_screen.cpp * + *************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" + +#include "../ftdi_eve_lib/extras/poly_ui.h" + +#if ENABLED(TOUCH_UI_COCOA_PRESS) + #include "cocoa_press_ui.h" +#elif ENABLED(TOUCH_UI_PORTRAIT) + #include "bio_printer_ui_portrait.h" +#else + #include "bio_printer_ui_landscape.h" +#endif + +#define GRID_COLS 2 +#define GRID_ROWS 9 + +#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) + +const uint8_t shadow_depth = 5; +const float max_speed = 1.00; +const float min_speed = 0.02; +const float emax_speed = 2.00; +const float emin_speed = 0.70; + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +float StatusScreen::increment; +bool StatusScreen::jog_xy; +bool StatusScreen::fine_motion; + +void StatusScreen::unlockMotors() { + injectCommands_P(PSTR("M84 XY")); + jog_xy = false; +} + +void StatusScreen::draw_temperature(draw_mode_t what) { + CommandProcessor cmd; + PolyUI ui(cmd, what); + + int16_t x, y, h, v; + + cmd.tag(15); + + if (what & BACKGROUND) { + cmd.cmd(COLOR_RGB(bg_color)); + + #if ENABLED(TOUCH_UI_LULZBOT_BIO) + // The LulzBot Bio shows the temperature for + // the bed. + + #ifdef TOUCH_UI_PORTRAIT + // Draw touch surfaces + ui.bounds(POLY(target_temp), x, y, h, v); + cmd.rectangle(x, y, h, v); + ui.bounds(POLY(actual_temp), x, y, h, v); + cmd.rectangle(x, y, h, v); + #else + ui.bounds(POLY(bed_temp), x, y, h, v); + cmd.rectangle(x, y, h, v); + #endif + ui.bounds(POLY(bed_icon), x, y, h, v); + cmd.rectangle(x, y, h, v); + + // Draw bed icon + cmd.cmd(BITMAP_SOURCE(Bed_Heat_Icon_Info)) + .cmd(BITMAP_LAYOUT(Bed_Heat_Icon_Info)) + .cmd(BITMAP_SIZE (Bed_Heat_Icon_Info)) + .cmd(COLOR_RGB(shadow_rgb)) + .icon (x + 2, y + 2, h, v, Bed_Heat_Icon_Info, icon_scale * 2) + .cmd(COLOR_RGB(bg_text_enabled)) + .icon (x, y, h, v, Bed_Heat_Icon_Info, icon_scale * 2); + #elif ENABLED(TOUCH_UI_COCOA_PRESS) && DISABLED(TOUCH_UI_PORTRAIT) + // The CocoaPress shows the temperature for two + // heating zones, but has no bed temperature + + cmd.cmd(COLOR_RGB(bg_text_enabled)); + cmd.font(font_xsmall); + + ui.bounds(POLY(h0_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_1)); + + ui.bounds(POLY(h1_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_2)); + + ui.bounds(POLY(h2_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_ZONE_3)); + + ui.bounds(POLY(h3_label), x, y, h, v); + cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHAMBER)); + #else + UNUSED(x); + UNUSED(y); + UNUSED(h); + UNUSED(v); + #endif + + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); // Restore font bitmap handles + #endif + } + + if (what & FOREGROUND) { + char str[15]; + cmd.cmd(COLOR_RGB(bg_text_enabled)); + #if ENABLED(TOUCH_UI_LULZBOT_BIO) + cmd.font(font_medium); + + #ifdef TOUCH_UI_PORTRAIT + if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) + format_temp(str, getTargetTemp_celsius(BED)); + else + strcpy_P(str, GET_TEXT(MSG_BED)); + + ui.bounds(POLY(target_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + + format_temp(str, getActualTemp_celsius(BED)); + ui.bounds(POLY(actual_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + #else + if (!isHeaterIdle(BED) && getTargetTemp_celsius(BED) > 0) + format_temp_and_temp(str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED)); + else + format_temp_and_idle(str, getActualTemp_celsius(BED)); + + ui.bounds(POLY(bed_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + #endif + + #elif ENABLED(TOUCH_UI_COCOA_PRESS) && DISABLED(TOUCH_UI_PORTRAIT) + // The CocoaPress shows the temperature for two + // heating zones, but has no bed temperature + + cmd.font(font_large); + + if (!isHeaterIdle(E0) && getTargetTemp_celsius(E0) > 0) + format_temp_and_temp(str, getActualTemp_celsius(E0), getTargetTemp_celsius(E0)); + else + format_temp_and_idle(str, getActualTemp_celsius(E0)); + + ui.bounds(POLY(h0_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + + if (!isHeaterIdle(E1) && getTargetTemp_celsius(E1) > 0) + format_temp_and_temp(str, getActualTemp_celsius(E1), getTargetTemp_celsius(E1)); + else + format_temp_and_idle(str, getActualTemp_celsius(E1)); + + ui.bounds(POLY(h1_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + + if (!isHeaterIdle(E2) && getTargetTemp_celsius(E2) > 0) + format_temp_and_temp(str, getActualTemp_celsius(E2), getTargetTemp_celsius(E2)); + else + format_temp_and_idle(str, getActualTemp_celsius(E2)); + + ui.bounds(POLY(h2_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + + if (!isHeaterIdle(CHAMBER) && getTargetTemp_celsius(CHAMBER) > 0) + format_temp_and_temp(str, getActualTemp_celsius(CHAMBER), getTargetTemp_celsius(CHAMBER)); + else + format_temp_and_idle(str, getActualTemp_celsius(CHAMBER)); + + ui.bounds(POLY(h3_temp), x, y, h, v); + cmd.text(x, y, h, v, str); + #else + UNUSED(str); + #endif + } +} + +void StatusScreen::draw_syringe(draw_mode_t what) { + int16_t x, y, h, v; + const float fill_level = ( + #ifdef E_MAX_POS + 1.0 - min(1.0, max(0.0, getAxisPosition_mm(E0) / E_MAX_POS)) + #else + 0.75 + #endif + ); + const bool e_homed = TERN0(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)); + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + if (what & BACKGROUND) { + // Paint the shadow for the syringe + ui.color(shadow_rgb); + ui.shadow(POLY(syringe_outline), shadow_depth); + } + + if (what & FOREGROUND && e_homed) { + // Paint the syringe icon + ui.color(syringe_rgb); + ui.fill(POLY(syringe_outline)); + + ui.color(fluid_rgb); + ui.bounds(POLY(syringe_fluid), x, y, h, v); + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level))); + cmd.cmd(SCISSOR_SIZE(h, v * fill_level)); + ui.fill(POLY(syringe_fluid), false); + cmd.cmd(RESTORE_CONTEXT()); + + ui.color(stroke_rgb); + ui.fill(POLY(syringe)); + } +} + +void StatusScreen::draw_arrows(draw_mode_t what) { + const bool e_homed = TERN1(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)), + z_homed = isAxisPositionKnown(Z); + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + ui.button_fill (fill_rgb); + ui.button_stroke(stroke_rgb, 28); + ui.button_shadow(shadow_rgb, shadow_depth); + + constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); + + if ((what & BACKGROUND) || jog_xy) { + ui.button(1, POLY(x_neg), style); + ui.button(2, POLY(x_pos), style); + ui.button(3, POLY(y_neg), style); + ui.button(4, POLY(y_pos), style); + } + + if ((what & BACKGROUND) || z_homed) { + ui.button(5, POLY(z_neg), style); + ui.button(6, POLY(z_pos), style); + } + + if ((what & BACKGROUND) || e_homed) { + #if DISABLED(TOUCH_UI_COCOA_PRESS) + ui.button(7, POLY(e_neg), style); + #endif + ui.button(8, POLY(e_pos), style); + } +} + +void StatusScreen::draw_fine_motion(draw_mode_t what) { + int16_t x, y, h, v; + CommandProcessor cmd; + PolyUI ui(cmd, what); + + cmd.font( + #ifdef TOUCH_UI_PORTRAIT + font_medium + #else + font_small + #endif + ) + .tag(16); + + if (what & BACKGROUND) { + ui.bounds(POLY(fine_label), x, y, h, v); + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .text(x, y, h, v, GET_TEXT_F(MSG_FINE_MOTION)); + } + + if (what & FOREGROUND) { + ui.bounds(POLY(fine_toggle), x, y, h, v); + cmd.colors(ui_toggle) + .toggle2(x, y, h, v, GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), fine_motion); + } +} + +void StatusScreen::draw_overlay_icons(draw_mode_t what) { + const bool e_homed = TERN1(TOUCH_UI_LULZBOT_BIO, isAxisPositionKnown(E0)), + z_homed = isAxisPositionKnown(Z); + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + if (what & FOREGROUND) { + ui.button_fill (TERN(TOUCH_UI_COCOA_PRESS, stroke_rgb, fill_rgb)); + ui.button_stroke(stroke_rgb, 28); + ui.button_shadow(shadow_rgb, shadow_depth); + + constexpr uint8_t style = TERN(TOUCH_UI_COCOA_PRESS, PolyUI::FILL | PolyUI::SHADOW, PolyUI::REGULAR); + if (!jog_xy) ui.button(12, POLY(padlock), style); + if (!e_homed) ui.button(13, POLY(home_e), style); + if (!z_homed) ui.button(14, POLY(home_z), style); + } +} + +void StatusScreen::draw_buttons(draw_mode_t what) { + int16_t x, y, h, v; + + const bool has_media = isMediaInserted() && !isPrintingFromMedia(); + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + ui.bounds(POLY(usb_btn), x, y, h, v); + cmd.font(font_medium) + .colors(normal_btn) + .enabled(has_media) + .colors(has_media ? action_btn : normal_btn) + .tag(9).button(x, y, h, v, + isPrintingFromMedia() ? + GET_TEXT_F(MSG_PRINTING) : + GET_TEXT_F(MSG_BUTTON_MEDIA) + ); + + ui.bounds(POLY(menu_btn), x, y, h, v); + cmd.colors(!has_media ? action_btn : normal_btn).tag(10).button(x, y, h, v, GET_TEXT_F(MSG_BUTTON_MENU)); +} + +void StatusScreen::loadBitmaps() { + // Load the bitmaps for the status screen + constexpr uint32_t base = ftdi_memory_map::RAM_G; + CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); + + // Load fonts for internationalization + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_data(base + UTF8_FONT_OFFSET); + #endif +} + +void StatusScreen::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + draw_syringe(what); + draw_temperature(what); + draw_arrows(what); + draw_overlay_icons(what); + draw_buttons(what); + draw_fine_motion(what); +} + +bool StatusScreen::onTouchStart(uint8_t) { + increment = 0; + return true; +} + +bool StatusScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + case 2: + case 3: + case 4: + case 12: + if (!jog_xy) { + jog_xy = true; + injectCommands_P(PSTR("M17")); + } + jog({ 0, 0, 0 }); + break; + case 5: + case 6: + jog({ 0, 0, 0 }); + break; + case 9: GOTO_SCREEN(FilesScreen); break; + case 10: GOTO_SCREEN(MainMenu); break; + #if ENABLED(TOUCH_UI_LULZBOT_BIO) + case 13: GOTO_SCREEN(BioConfirmHomeE); break; + #endif + case 14: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; + case 15: GOTO_SCREEN(TemperatureScreen); break; + case 16: fine_motion = !fine_motion; break; + default: return false; + } + // If a passcode is enabled, the LockScreen will prevent the + // user from proceeding. + LockScreen::check_passcode(); + return true; +} + +bool StatusScreen::onTouchHeld(uint8_t tag) { + if (tag >= 1 && tag <= 4 && !jog_xy) return false; + const float s = min_speed + (fine_motion ? 0 : (max_speed - min_speed) * sq(increment)); + switch (tag) { + case 1: jog({-s, 0, 0}); break; + case 2: jog({ s, 0, 0}); break; + case 4: jog({ 0, -s, 0}); break; // NOTE: Y directions inverted because bed rather than needle moves + case 3: jog({ 0, s, 0}); break; + case 5: jog({ 0, 0, -s}); break; + case 6: jog({ 0, 0, s}); break; + case 7: case 8: + { + if (ExtUI::isMoving()) return false; + const feedRate_t feedrate = emin_speed + (fine_motion ? 0 : (emax_speed - emin_speed) * sq(increment)); + const float increment = 0.25 * feedrate * (tag == 7 ? -1 : 1); + MoveAxisScreen::setManualFeedrate(E0, feedrate); + UI_INCREMENT(AxisPosition_mm, E0); + current_screen.onRefresh(); + break; + } + default: + return false; + } + increment = min(1.0f, increment + 0.1f); + return false; +} + +void StatusScreen::setStatusMessage(progmem_str pstr) { + #ifdef TOUCH_UI_LULZBOT_BIO + BioPrintingDialogBox::setStatusMessage(pstr); + #else + UNUSED(pstr); + #endif +} + +void StatusScreen::setStatusMessage(const char * const str) { + #ifdef TOUCH_UI_LULZBOT_BIO + BioPrintingDialogBox::setStatusMessage(str); + #else + UNUSED(str); + #endif +} + +void StatusScreen::onIdle() { + reset_menu_timeout(); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + if (!EventLoop::is_touch_held()) + onRefresh(); + #ifdef TOUCH_UI_LULZBOT_BIO + if (isPrintingFromMedia()) + BioPrintingDialogBox::show(); + #endif + refresh_timer.start(); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..0d8d71b4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_tune_menu.cpp @@ -0,0 +1,79 @@ +/********************* + * bio_tune_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void TuneMenu::onRedraw(draw_mode_t what) { + #define GRID_ROWS 8 + #define GRID_COLS 2 + + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + .font(font_large) + .text( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_MENU)); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(font_medium) + .enabled( isPrinting()).tag(2).button( BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_SPEED)) + .tag(3).button( BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_BED_TEMPERATURE)) + .enabled(TERN_(BABYSTEPPING, true)) + .tag(4).button( BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_NUDGE_NOZZLE)) + .enabled(!isPrinting()).tag(5).button( BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_MOVE_TO_HOME)) + .enabled(!isPrinting()).tag(6).button( BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_RAISE_PLUNGER)) + .enabled(!isPrinting()).tag(7).button( BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_RELEASE_XY_AXIS)) + .colors(action_btn) .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + } + #undef GRID_COLS + #undef GRID_ROWS +} + +bool TuneMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: GOTO_SCREEN(FeedratePercentScreen); break; + case 3: GOTO_SCREEN(TemperatureScreen); break; + case 4: GOTO_SCREEN(NudgeNozzleScreen); break; + case 5: GOTO_SCREEN(BioConfirmHomeXYZ); break; + case 6: SpinnerDialogBox::enqueueAndWait_P(F("G0 E0 F120")); break; + case 7: StatusScreen::unlockMotors(); break; + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..4ce8f608 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -0,0 +1,129 @@ +/******************* + * boot_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +#include "../ftdi_eve_lib/extras/poly_ui.h" +#include "../archim2-flash/flash_storage.h" + +#ifdef SHOW_CUSTOM_BOOTSCREEN + #ifdef TOUCH_UI_PORTRAIT + #include "../theme/bootscreen_logo_portrait.h" + #else + #include "../theme/_bootscreen_landscape.h" + #endif +#else + #ifdef TOUCH_UI_PORTRAIT + #include "../theme/marlin_bootscreen_portrait.h" + #else + #include "../theme/marlin_bootscreen_landscape.h" + #endif +#endif + +using namespace FTDI; +using namespace Theme; + +void BootScreen::onRedraw(draw_mode_t) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(0x000000)); + cmd.cmd(CLEAR(true,true,true)); + + CLCD::turn_on_backlight(); + SoundPlayer::set_volume(255); +} + +void BootScreen::onIdle() { + if (CLCD::is_touching()) { + // If the user is touching the screen at startup, then + // assume the user wants to re-calibrate the screen. + // This gives the user the ability to recover a + // miscalibration that has been stored to EEPROM. + + // Also reset display parameters to defaults, just + // in case the display is borked. + InterfaceSettingsScreen::failSafeSettings(); + + StatusScreen::loadBitmaps(); + StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); + GOTO_SCREEN(TouchCalibrationScreen); + current_screen.forget(); + PUSH_SCREEN(StatusScreen); + } else { + if (!UIFlashStorage::is_valid()) { + StatusScreen::loadBitmaps(); + SpinnerDialogBox::show(GET_TEXT_F(MSG_PLEASE_WAIT)); + UIFlashStorage::format_flash(); + SpinnerDialogBox::hide(); + } + + #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) + if (UIData::animations_enabled()) { + // If there is a startup video in the flash SPI, play + // that, otherwise show a static splash screen. + if (!MediaPlayerScreen::playBootMedia()) + showSplashScreen(); + } + #endif + + StatusScreen::loadBitmaps(); + + #ifdef TOUCH_UI_LULZBOT_BIO + GOTO_SCREEN(BioConfirmHomeXYZ); + current_screen.forget(); + PUSH_SCREEN(StatusScreen); + PUSH_SCREEN(BioConfirmHomeE); + #elif NUM_LANGUAGES > 1 + StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); + GOTO_SCREEN(LanguageMenu); + #else + StatusScreen::setStatusMessage(GET_TEXT_F(WELCOME_MSG)); + GOTO_SCREEN(StatusScreen); + #endif + } +} + +void BootScreen::showSplashScreen() { + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART); + cmd.cmd(CLEAR_COLOR_RGB(LOGO_BACKGROUND)); + cmd.cmd(CLEAR(true,true,true)); + + #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) + #define LOGO_PAINT_PATH(rgb, path) cmd.cmd(COLOR_RGB(rgb)); ui.fill(POLY(path)); + + PolyUI ui(cmd); + + LOGO_PAINT_PATHS + + cmd.cmd(DL::DL_DISPLAY); + cmd.cmd(CMD_SWAP); + cmd.execute(); + + ExtUI::delay_ms(2500); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..776a9fe5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/case_light_screen.cpp @@ -0,0 +1,62 @@ +/************************* + * case_light_screen.cpp * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, CASE_LIGHT_ENABLE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void CaseLightScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.heading( GET_TEXT_F(MSG_CASE_LIGHT)); + w.toggle( 2, GET_TEXT_F(MSG_LEDS), getCaseLightState()); + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)) + .adjuster(10, GET_TEXT_F(MSG_CASE_LIGHT_BRIGHTNESS), getCaseLightBrightness_percent()); + w.precision(0).increments(); + #endif +} + +bool CaseLightScreen::onTouchHeld(uint8_t tag) { + using namespace ExtUI; + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + const float increment = getIncrement(); + #endif + switch (tag) { + case 2: setCaseLightState(!getCaseLightState()); break; + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + case 10: UI_DECREMENT(CaseLightBrightness_percent); break; + case 11: UI_INCREMENT(CaseLightBrightness_percent); break; + #endif + default: + return false; + } + + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..589da9b2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/change_filament_screen.cpp @@ -0,0 +1,354 @@ +/****************************** + * change_filament_screen.cpp * + ******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace ExtUI; +using namespace FTDI; +using namespace Theme; + +#define COOL_TEMP 40 +#define LOW_TEMP 180 +#define MED_TEMP 200 +#define HIGH_TEMP 220 + +/****************** COLOR SCALE ***********************/ + +uint32_t getWarmColor(uint16_t temp, uint16_t cool, uint16_t low, uint16_t med, uint16_t high) { + rgb_t R0, R1, mix; + + float t; + if (temp < cool) { + R0 = cool_rgb; + R1 = low_rgb; + t = 0; + } + else if (temp < low) { + R0 = cool_rgb; + R1 = low_rgb; + t = (float(temp)-cool)/(low-cool); + } + else if (temp < med) { + R0 = low_rgb; + R1 = med_rgb; + t = (float(temp)-low)/(med-low); + } + else if (temp < high) { + R0 = med_rgb; + R1 = high_rgb; + t = (float(temp)-med)/(high-med); + } + else if (temp >= high) { + R0 = med_rgb; + R1 = high_rgb; + t = 1; + } + rgb_t::lerp(t, R0, R1, mix); + return mix; +} + +void ChangeFilamentScreen::drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { + CommandProcessor cmd; + cmd.cmd(SCISSOR_XY (x, y)) + .cmd(SCISSOR_SIZE (w, h/2)) + .gradient (x, y, high_rgb, x, y+h/2, med_rgb) + .cmd(SCISSOR_XY (x, y+h/2)) + .cmd(SCISSOR_SIZE (w, h/2)) + .gradient (x, y+h/2, med_rgb, x, y+h, low_rgb) + .cmd(SCISSOR_XY ()) + .cmd(SCISSOR_SIZE ()); +} + +void ChangeFilamentScreen::onEntry() { + screen_data.ChangeFilamentScreen.e_tag = ExtUI::getActiveTool() + 10; + screen_data.ChangeFilamentScreen.t_tag = 0; + screen_data.ChangeFilamentScreen.repeat_tag = 0; + screen_data.ChangeFilamentScreen.saved_extruder = getActiveTool(); + #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 + screen_data.ChangeFilamentScreen.need_purge = true; + #endif +} + +void ChangeFilamentScreen::onExit() { + setActiveTool(screen_data.ChangeFilamentScreen.saved_extruder, true); +} + +void ChangeFilamentScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + #ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 2 + #define GRID_ROWS 11 + #else + #define GRID_COLS 4 + #define GRID_ROWS 6 + #endif + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + #ifdef TOUCH_UI_PORTRAIT + .font(font_large) + #else + .font(font_medium) + #endif + .text(BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_EXTRUDER_SELECTION)) + #ifdef TOUCH_UI_PORTRAIT + .text(BTN_POS(1,7), BTN_SIZE(1,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) + #else + .text(BTN_POS(3,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_CURRENT_TEMPERATURE)) + .font(font_small) + #endif + .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_REMOVAL_TEMPERATURE)); + drawTempGradient(BTN_POS(1,4), BTN_SIZE(1,3)); + } + + if (what & FOREGROUND) { + const extruder_t e = getExtruder(); + + char e_str[15]; + if (isHeaterIdle(e)) + format_temp_and_idle(e_str, getActualTemp_celsius(e)); + else + format_temp_and_temp(e_str, getActualTemp_celsius(e), getTargetTemp_celsius(e)); + + const rgb_t tcol = getWarmColor(getActualTemp_celsius(e), COOL_TEMP, LOW_TEMP, MED_TEMP, HIGH_TEMP); + cmd.cmd(COLOR_RGB(tcol)) + .tag(15) + #ifdef TOUCH_UI_PORTRAIT + .rectangle(BTN_POS(2,7), BTN_SIZE(1,1)) + #else + .rectangle(BTN_POS(3,2), BTN_SIZE(2,1)) + #endif + .cmd(COLOR_RGB(tcol.luminance() > 128 ? 0x000000 : 0xFFFFFF)) + .font(font_medium) + #ifdef TOUCH_UI_PORTRAIT + .text(BTN_POS(2,7), BTN_SIZE(1,1), e_str) + #else + .text(BTN_POS(3,2), BTN_SIZE(2,1), e_str) + #endif + .colors(normal_btn); + + const bool t_ok = getActualTemp_celsius(e) > getSoftenTemp() - 10; + + if (screen_data.ChangeFilamentScreen.t_tag && !t_ok) { + cmd.text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_HEATING)); + } else if (getActualTemp_celsius(e) > 100) { + cmd.cmd(COLOR_RGB(0xFF0000)) + .text(BTN_POS(1,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_CAUTION)) + .colors(normal_btn) + .text(BTN_POS(1,6), BTN_SIZE(1,1), GET_TEXT_F(MSG_HOT)); + } + + #define TOG_STYLE(A) colors(A ? action_btn : normal_btn) + + const bool tog2 = screen_data.ChangeFilamentScreen.t_tag == 2; + const bool tog3 = screen_data.ChangeFilamentScreen.t_tag == 3; + const bool tog4 = screen_data.ChangeFilamentScreen.t_tag == 4; + const bool tog10 = screen_data.ChangeFilamentScreen.e_tag == 10; + #if HAS_MULTI_HOTEND + const bool tog11 = screen_data.ChangeFilamentScreen.e_tag == 11; + #endif + + #ifdef TOUCH_UI_PORTRAIT + cmd.font(font_large) + #else + cmd.font(font_medium) + #endif + .TOG_STYLE(tog10) + .tag(10) .button (BTN_POS(1,2), BTN_SIZE(1,1), F("1")) + #if HOTENDS < 2 + .enabled(false) + #else + .TOG_STYLE(tog11) + #endif + .tag(11) .button (BTN_POS(2,2), BTN_SIZE(1,1), F("2")); + + if (!t_ok) reset_menu_timeout(); + + const bool tog7 = screen_data.ChangeFilamentScreen.repeat_tag == 7; + const bool tog8 = screen_data.ChangeFilamentScreen.repeat_tag == 8; + + + cmd.font( + #ifdef TOUCH_UI_PORTRAIT + font_large + #else + font_small + #endif + ); + + { + char str[30]; + + format_temp(str, LOW_TEMP); + cmd.tag(2) .TOG_STYLE(tog2) .button (BTN_POS(2,6), BTN_SIZE(1,1), str); + + format_temp(str, MED_TEMP); + cmd.tag(3) .TOG_STYLE(tog3) .button (BTN_POS(2,5), BTN_SIZE(1,1), str); + + 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) + + // Add tags to color gradient + .cmd(COLOR_MASK(0,0,0,0)) + .tag(2) .rectangle(BTN_POS(1,6), BTN_SIZE(1,1)) + .tag(3) .rectangle(BTN_POS(1,5), BTN_SIZE(1,1)) + .tag(4) .rectangle(BTN_POS(1,4), BTN_SIZE(1,1)) + .cmd(COLOR_MASK(1,1,1,1)) + + .cmd(COLOR_RGB(t_ok ? bg_text_enabled : bg_text_disabled)) + #ifdef TOUCH_UI_PORTRAIT + .font(font_large) + .tag(0) .text (BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) + .text (BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) + .tag(5) .enabled(t_ok).button (BTN_POS(1,9), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) + .tag(6) .enabled(t_ok).button (BTN_POS(2,9), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) + .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(1,10), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) + .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(2,10), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) + .tag(1).colors(action_btn) .button (BTN_POS(1,11), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + #else + .font(font_small) + .tag(0) .text (BTN_POS(3,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_UNLOAD_FILAMENT)) + .text (BTN_POS(4,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_LOAD_FILAMENT)) + .tag(5) .enabled(t_ok).button (BTN_POS(3,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) + .tag(6) .enabled(t_ok).button (BTN_POS(4,4), BTN_SIZE(1,1), GET_TEXT_F(MSG_MOMENTARY)) + .tag(7).TOG_STYLE(tog7).enabled(t_ok).button (BTN_POS(3,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) + .tag(8).TOG_STYLE(tog8).enabled(t_ok).button (BTN_POS(4,5), BTN_SIZE(1,1), GET_TEXT_F(MSG_CONTINUOUS)) + .font(font_medium) + .tag(1).colors(action_btn) .button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + #endif + } + #undef GRID_COLS + #undef GRID_ROWS +} + +uint8_t ChangeFilamentScreen::getSoftenTemp() { + switch (screen_data.ChangeFilamentScreen.t_tag) { + case 2: return LOW_TEMP; + case 3: return MED_TEMP; + case 4: return HIGH_TEMP; + default: return EXTRUDE_MINTEMP; + } +} + +ExtUI::extruder_t ChangeFilamentScreen::getExtruder() { + switch (screen_data.ChangeFilamentScreen.e_tag) { + case 13: return ExtUI::E3; + case 12: return ExtUI::E2; + case 11: return ExtUI::E1; + default: return ExtUI::E0; + } +} + +void ChangeFilamentScreen::doPurge() { + #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 + constexpr float purge_distance_mm = FILAMENT_UNLOAD_PURGE_LENGTH; + if (screen_data.ChangeFilamentScreen.need_purge) { + screen_data.ChangeFilamentScreen.need_purge = false; + MoveAxisScreen::setManualFeedrate(getExtruder(), purge_distance_mm); + ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(getExtruder()) + purge_distance_mm, getExtruder()); + } + #endif +} + +bool ChangeFilamentScreen::onTouchStart(uint8_t tag) { + // Make the Momentary and Continuous buttons slightly more responsive + switch (tag) { + case 5: case 6: case 7: case 8: + #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 + if (tag == 5 || tag == 7) doPurge(); + #endif + return ChangeFilamentScreen::onTouchHeld(tag); + default: + return false; + } +} + +bool ChangeFilamentScreen::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: + case 3: + case 4: + // Change temperature + screen_data.ChangeFilamentScreen.t_tag = tag; + setTargetTemp_celsius(getSoftenTemp(), getExtruder()); + break; + case 7: + screen_data.ChangeFilamentScreen.repeat_tag = (screen_data.ChangeFilamentScreen.repeat_tag == 7) ? 0 : 7; + break; + case 8: + screen_data.ChangeFilamentScreen.repeat_tag = (screen_data.ChangeFilamentScreen.repeat_tag == 8) ? 0 : 8; + break; + case 10: + case 11: + // Change extruder + screen_data.ChangeFilamentScreen.e_tag = tag; + screen_data.ChangeFilamentScreen.t_tag = 0; + screen_data.ChangeFilamentScreen.repeat_tag = 0; + #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 + screen_data.ChangeFilamentScreen.need_purge = true; + #endif + setActiveTool(getExtruder(), true); + break; + case 15: GOTO_SCREEN(TemperatureScreen); break; + } + return true; +} + +bool ChangeFilamentScreen::onTouchHeld(uint8_t tag) { + if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate + constexpr float increment = 1; + #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); + switch (tag) { + case 5: case 7: UI_DECREMENT_AXIS(getExtruder()); break; + case 6: case 8: UI_INCREMENT_AXIS(getExtruder()); break; + default: return false; + } + #undef UI_DECREMENT_AXIS + #undef UI_INCREMENT_AXIS + return false; +} + +void ChangeFilamentScreen::onIdle() { + reset_menu_timeout(); + if (screen_data.ChangeFilamentScreen.repeat_tag) onTouchHeld(screen_data.ChangeFilamentScreen.repeat_tag); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..e23592a4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_abort_print_dialog_box.cpp @@ -0,0 +1,47 @@ +/************************************** + * confirm_abort_print_dialog_box.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace ExtUI; + +void ConfirmAbortPrintDialogBox::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_ABORT_WARNING)); + drawYesNoButtons(); +} + +bool ConfirmAbortPrintDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + GOTO_PREVIOUS(); + stopPrint(); + return true; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..7e1a8202 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_auto_calibration_dialog_box.cpp @@ -0,0 +1,48 @@ +/******************************************* + * confirm_auto_calibration_dialog_box.cpp * + *******************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, CALIBRATION_GCODE) + +#include "screens.h" + +using namespace ExtUI; +using namespace Theme; + +void ConfirmAutoCalibrationDialogBox::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_CALIBRATION_WARNING)); + drawYesNoButtons(); +} + +bool ConfirmAutoCalibrationDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + GOTO_SCREEN(StatusScreen); + injectCommands_P(PSTR("G425")); + return true; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..574de210 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_erase_flash_dialog_box.cpp @@ -0,0 +1,54 @@ +/************************************** + * confirm_erase_flash_dialog_box.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) + +#include "screens.h" + +#include "../archim2-flash/flash_storage.h" + +using namespace FTDI; + +void ConfirmEraseFlashDialogBox::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_ERASE_FLASH_WARNING)); + drawYesNoButtons(); +} + +bool ConfirmEraseFlashDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + SpinnerDialogBox::show(GET_TEXT_F(MSG_ERASING)); + UIFlashStorage::format_flash(); + SpinnerDialogBox::hide(); + AlertDialogBox::show(GET_TEXT_F(MSG_ERASED)); + // Remove ConfirmEraseFlashDialogBox from the stack + // so the alert box doesn't return to me. + current_screen.forget(); + return true; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..4e5b174d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_start_print_dialog_box.cpp @@ -0,0 +1,65 @@ +/************************************** + * confirm_start_print_dialog_box.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) { + const char *filename = getLongFilename(); + char buffer[strlen_P(GET_TEXT(MSG_START_PRINT_CONFIRMATION)) + strlen(filename) + 1]; + sprintf_P(buffer, GET_TEXT(MSG_START_PRINT_CONFIRMATION), filename); + drawMessage((const char *)buffer); + drawYesNoButtons(1); +} + +bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + printFile(getShortFilename()); + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_PRINT_STARTING)); + GOTO_SCREEN(StatusScreen); + return true; + case 2: GOTO_PREVIOUS(); return true; + default: return false; + } +} + +const char *ConfirmStartPrintDialogBox::getFilename(bool longName) { + FileList files; + files.seek(screen_data.ConfirmStartPrintDialogBox.file_index, true); + return longName ? files.longFilename() : files.shortFilename(); +} + +void ConfirmStartPrintDialogBox::show(uint8_t file_index) { + screen_data.ConfirmStartPrintDialogBox.file_index = file_index; + GOTO_SCREEN(ConfirmStartPrintDialogBox); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..6b6affad --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -0,0 +1,58 @@ +/************************************** + * confirm_user_request_alert_box.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; + +void ConfirmUserRequestAlertBox::onRedraw(draw_mode_t mode) { + AlertDialogBox::onRedraw(mode); // Required for the GOTO_SCREEN function to work +} + +bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + ExtUI::setUserConfirmed(); + GOTO_PREVIOUS(); + return true; + case 2: GOTO_PREVIOUS(); return true; + default: return false; + } +} + +void ConfirmUserRequestAlertBox::show(const char* msg) { + drawMessage(msg); + storeBackground(); + screen_data.AlertDialogBox.isError = false; + GOTO_SCREEN(ConfirmUserRequestAlertBox); +} + +void ConfirmUserRequestAlertBox::hide() { + if (AT_SCREEN(ConfirmUserRequestAlertBox)) + GOTO_PREVIOUS(); +} +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..8496955f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/default_acceleration_screen.cpp @@ -0,0 +1,63 @@ +/*********************************** + * default_acceleration_screen.cpp * + ***********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void DefaultAccelerationScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0); + w.units(GET_TEXT_F(MSG_UNITS_MM_S2)); + w.heading( GET_TEXT_F(MSG_ACCELERATION)); + w.color(other); + w.adjuster( 2, GET_TEXT_F(MSG_ACCEL_PRINTING), getPrintingAcceleration_mm_s2() ); + w.adjuster( 4, GET_TEXT_F(MSG_ACCEL_TRAVEL), getTravelAcceleration_mm_s2() ); + w.adjuster( 6, GET_TEXT_F(MSG_ACCEL_RETRACT), getRetractAcceleration_mm_s2() ); + w.increments(); + w.button( 8, GET_TEXT_F(MSG_SET_MAXIMUM)); +} + +bool DefaultAccelerationScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(PrintingAcceleration_mm_s2); break; + case 3: UI_INCREMENT(PrintingAcceleration_mm_s2); break; + case 4: UI_DECREMENT(TravelAcceleration_mm_s2); break; + case 5: UI_INCREMENT(TravelAcceleration_mm_s2); break; + case 6: UI_DECREMENT(RetractAcceleration_mm_s2); break; + case 7: UI_INCREMENT(RetractAcceleration_mm_s2); break; + case 8: GOTO_SCREEN(MaxAccelerationScreen); break; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..8e56c419 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/developer_menu.cpp @@ -0,0 +1,150 @@ +/********************** + * developer_menu.cpp * + **********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) + +#include "screens.h" + +#include "../archim2-flash/flash_storage.h" + +using namespace FTDI; +using namespace Theme; + +void DeveloperMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .font(font_medium) + .tag(0); + + #ifdef SPI_FLASH_SS + constexpr bool has_flash = true; + #else + constexpr bool has_flash = false; + #endif + + #if ENABLED(SDSUPPORT) + constexpr bool has_media = true; + #else + constexpr bool has_media = false; + #endif + + cmd.cmd(COLOR_RGB(bg_text_enabled)); + #ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 10 + #define GRID_COLS 1 + cmd.font(font_large) .text ( BTN_POS(1,1), BTN_SIZE(1,1), F("Developer Menu")) + .colors(normal_btn) + .tag(2).font(font_medium) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) + .tag(3) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("Stress Test")) + .tag(4) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("Show Touch Registers")) + .tag(5) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) + .tag(6).enabled(has_media).button( BTN_POS(1,6), BTN_SIZE(1,1), F("Play Video from Media")) + .tag(7).enabled(has_flash).button( BTN_POS(1,7), BTN_SIZE(1,1), F("Play Video from SPI Flash")) + .tag(8).enabled(has_flash).button( BTN_POS(1,8), BTN_SIZE(1,1), F("Load Video to SPI Flash")) + .tag(9).enabled(has_flash).button( BTN_POS(1,9), BTN_SIZE(1,1), F("Erase SPI Flash")) + + .tag(1).colors(action_btn) + .button( BTN_POS(1,10), BTN_SIZE(1,1), F("Back")); + #else + #define GRID_ROWS 6 + #define GRID_COLS 2 + cmd.font(font_medium) .text ( BTN_POS(1,1), BTN_SIZE(2,1), F("Developer Menu")) + .colors(normal_btn) + .tag(2).font(font_small) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("Show All Widgets")) + .tag(3) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("Show Touch Registers")) + .tag(9) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("Show Pin States")) + .tag(4) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("Play Song")) + .tag(5).enabled(has_media).button( BTN_POS(2,2), BTN_SIZE(1,1), F("Play Video from Media")) + .tag(6).enabled(has_flash).button( BTN_POS(2,3), BTN_SIZE(1,1), F("Play Video from SPI Flash")) + .tag(7).enabled(has_flash).button( BTN_POS(2,4), BTN_SIZE(1,1), F("Load Video to SPI Flash")) + .tag(8).enabled(has_flash).button( BTN_POS(2,5), BTN_SIZE(1,1), F("Erase SPI Flash")) + .tag(1).colors(action_btn) + .button( BTN_POS(1,6), BTN_SIZE(2,1), F("Back")); + #endif + } +} + +bool DeveloperMenu::onTouchEnd(uint8_t tag) { + using namespace Theme; + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: GOTO_SCREEN(WidgetsScreen); break; + case 3: + PUSH_SCREEN(StressTestScreen); + AlertDialogBox::show(F("Please do not run this test unattended as it may cause your printer to malfunction.")); + current_screen.forget(); + break; + case 4: GOTO_SCREEN(TouchRegistersScreen); break; + case 5: sound.play(js_bach_joy, PLAY_ASYNCHRONOUS); break; + #if ENABLED(SDSUPPORT) + case 6: + if (!MediaPlayerScreen::playCardMedia()) + AlertDialogBox::showError(F("Cannot open STARTUP.AVI")); + break; + #endif + #ifdef SPI_FLASH_SS + case 7: + if (!MediaPlayerScreen::playBootMedia()) + AlertDialogBox::showError(F("No boot media available")); + break; + case 8: + { + SpinnerDialogBox::show(F("Saving...")); + UIFlashStorage::error_t res = UIFlashStorage::write_media_file(F("STARTUP.AVI")); + SpinnerDialogBox::hide(); + reset_menu_timeout(); + switch (res) { + case UIFlashStorage::SUCCESS: + AlertDialogBox::show(F("File copied!")); + break; + + case UIFlashStorage::READ_ERROR: + AlertDialogBox::showError(F("Failed to read file")); + break; + + case UIFlashStorage::VERIFY_ERROR: + AlertDialogBox::showError(F("Failed to verify file")); + break; + + case UIFlashStorage::FILE_NOT_FOUND: + AlertDialogBox::showError(F("Cannot open STARTUP.AVI")); + break; + + case UIFlashStorage::WOULD_OVERWRITE: + AlertDialogBox::showError(F("Cannot overwrite existing media.")); + break; + } + break; + } + case 9: GOTO_SCREEN(ConfirmEraseFlashDialogBox); break; + #endif + case 10: GOTO_SCREEN(EndstopStatesScreen); break; + default: return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..782ae7bb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/dialog_box_base_class.cpp @@ -0,0 +1,87 @@ +/***************************** + * dialog_box_base_class.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +#define GRID_COLS 2 +#define GRID_ROWS 8 + +template +void DialogBoxBaseClass::drawMessage(const T message, int16_t font) { + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + draw_text_box(cmd, BTN_POS(1,1), BTN_SIZE(2,3), message, OPT_CENTER, font ? font : font_large); + cmd.colors(normal_btn); +} + +template void DialogBoxBaseClass::drawMessage(const char *, int16_t font); +template void DialogBoxBaseClass::drawMessage(progmem_str, int16_t font); + +void DialogBoxBaseClass::drawYesNoButtons(uint8_t default_btn) { + CommandProcessor cmd; + cmd.font(font_medium) + .colors(default_btn == 1 ? action_btn : normal_btn).tag(1).button( BTN_POS(1,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_YES)) + .colors(default_btn == 2 ? action_btn : normal_btn).tag(2).button( BTN_POS(2,8), BTN_SIZE(1,1), GET_TEXT_F(MSG_NO)); +} + +void DialogBoxBaseClass::drawOkayButton() { + CommandProcessor cmd; + cmd.font(font_medium) + .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), GET_TEXT_F(MSG_BUTTON_OKAY)); +} + +void DialogBoxBaseClass::drawButton(const progmem_str label) { + CommandProcessor cmd; + cmd.font(font_medium) + .tag(1).button( BTN_POS(1,8), BTN_SIZE(2,1), label); +} + +void DialogBoxBaseClass::drawSpinner() { + CommandProcessor cmd; + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .spinner(BTN_POS(1,4), BTN_SIZE(2,3)).execute(); +} + +bool DialogBoxBaseClass::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + case 2: GOTO_PREVIOUS(); return true; + default: return false; + } +} + +void DialogBoxBaseClass::onIdle() { + reset_menu_timeout(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..8845dfb5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/display_tuning_screen.cpp @@ -0,0 +1,61 @@ +/***************************** + * display_tuning_screen.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void DisplayTuningScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0, BaseNumericAdjustmentScreen::DEFAULT_LOWEST); + w.units(F("")); + w.heading(GET_TEXT_F(MSG_DISPLAY_MENU)); + w.color(other); + w.adjuster( 2, GET_TEXT_F(MSG_H_OFFSET), CLCD::mem_read_16(CLCD::REG::HOFFSET) ); + w.adjuster( 4, GET_TEXT_F(MSG_V_OFFSET), CLCD::mem_read_16(CLCD::REG::VOFFSET) ); + w.increments(); + w.heading( GET_TEXT_F(MSG_TOUCH_SCREEN)); + w.button(6, GET_TEXT_F(MSG_CALIBRATE)); +} + +bool DisplayTuningScreen::onTouchHeld(uint8_t tag) { + #define REG_INCREMENT(a,i) CLCD::mem_write_16(CLCD::REG::a, CLCD::mem_read_16(CLCD::REG::a) + i) + const float increment = getIncrement(); + switch (tag) { + case 2: REG_INCREMENT(HOFFSET, -increment); break; + case 3: REG_INCREMENT(HOFFSET, increment); break; + case 4: REG_INCREMENT(VOFFSET, -increment); break; + case 5: REG_INCREMENT(VOFFSET, increment); break; + case 6: GOTO_SCREEN(TouchCalibrationScreen); break; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..7f3f507f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/endstop_state_screen.cpp @@ -0,0 +1,152 @@ +/**************************** + * endstop_state_screen.cpp * + ****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void EndstopStatesScreen::onEntry() { + BaseScreen::onEntry(); +} + +void EndstopStatesScreen::onExit() { + BaseScreen::onExit(); +} + +void EndstopStatesScreen::onRedraw(draw_mode_t) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(COLOR_RGB(bg_text_enabled)) + .cmd(CLEAR(true,true,true)) + .tag(0); + + #define GRID_ROWS 7 + #define GRID_COLS 6 + + #define PIN_BTN(X,Y,PIN,LABEL) button(BTN_POS(X,Y), BTN_SIZE(2,1), LABEL) + #define PIN_ENABLED(X,Y,LABEL,PIN,INV) cmd.enabled(1).colors(READ(PIN##_PIN) != INV ? action_btn : normal_btn).PIN_BTN(X,Y,PIN,LABEL); + #define PIN_DISABLED(X,Y,LABEL,PIN) cmd.enabled(0).PIN_BTN(X,Y,PIN,LABEL); + + cmd.font( + #ifdef TOUCH_UI_PORTRAIT + font_large + #else + font_medium + #endif + ) + .text(BTN_POS(1,1), BTN_SIZE(6,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) + .font(font_tiny); + #if PIN_EXISTS(X_MAX) + PIN_ENABLED (1, 2, PSTR(STR_X_MAX), X_MAX, X_MAX_ENDSTOP_INVERTING) + #else + PIN_DISABLED(1, 2, PSTR(STR_X_MAX), X_MAX) + #endif + #if PIN_EXISTS(Y_MAX) + PIN_ENABLED (3, 2, PSTR(STR_Y_MAX), Y_MAX, Y_MAX_ENDSTOP_INVERTING) + #else + PIN_DISABLED(3, 2, PSTR(STR_Y_MAX), Y_MAX) + #endif + #if PIN_EXISTS(Z_MAX) + PIN_ENABLED (5, 2, PSTR(STR_Z_MAX), Z_MAX, Z_MAX_ENDSTOP_INVERTING) + #else + PIN_DISABLED(5, 2, PSTR(STR_Z_MAX), Z_MAX) + #endif + #if PIN_EXISTS(X_MIN) + PIN_ENABLED (1, 3, PSTR(STR_X_MIN), X_MIN, X_MIN_ENDSTOP_INVERTING) + #else + PIN_DISABLED(1, 3, PSTR(STR_X_MIN), X_MIN) + #endif + #if PIN_EXISTS(Y_MIN) + PIN_ENABLED (3, 3, PSTR(STR_Y_MIN), Y_MIN, Y_MIN_ENDSTOP_INVERTING) + #else + PIN_DISABLED(3, 3, PSTR(STR_Y_MIN), Y_MIN) + #endif + #if PIN_EXISTS(Z_MIN) + PIN_ENABLED (5, 3, PSTR(STR_Z_MIN), Z_MIN, Z_MIN_ENDSTOP_INVERTING) + #else + 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_STATE) + #else + PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT) + #endif + #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) + 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 + #if PIN_EXISTS(Z_MIN_PROBE) + PIN_ENABLED (5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE, Z_MIN_PROBE_ENDSTOP_INVERTING) + #else + PIN_DISABLED(5, 4, PSTR(STR_Z_PROBE), Z_MIN_PROBE) + #endif + + #if HAS_SOFTWARE_ENDSTOPS + #undef EDGE_R + #define EDGE_R 30 + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .font(font_small) + .text (BTN_POS(1,5), BTN_SIZE(3,1), GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS), OPT_RIGHTX | OPT_CENTERY) + .colors(ui_toggle) + .tag(2).toggle2(BTN_POS(4,5), BTN_SIZE(3,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), getSoftEndstopState()); + #undef EDGE_R + #define EDGE_R 0 + #endif + + cmd.font(font_medium) + .colors(action_btn) + .tag(1).button( BTN_POS(1,7), BTN_SIZE(6,1), GET_TEXT_F(MSG_BACK)); + #undef GRID_COLS + #undef GRID_ROWS +} + +bool EndstopStatesScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + #if HAS_SOFTWARE_ENDSTOPS + case 2: setSoftEndstopState(!getSoftEndstopState()); + #endif + default: + return false; + } + return true; +} + +void EndstopStatesScreen::onIdle() { + constexpr uint32_t DIAGNOSTICS_UPDATE_INTERVAL = 100; + + if (refresh_timer.elapsed(DIAGNOSTICS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + reset_menu_timeout(); + } + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..2698708e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/feedrate_percent_screen.cpp @@ -0,0 +1,52 @@ +/******************************* + * feedrate_percent_screen.cpp * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; + +void FeedratePercentScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0).units(GET_TEXT_F(MSG_UNITS_PERCENT)); + + w.heading(GET_TEXT_F(MSG_PRINT_SPEED)); + w.adjuster(4, GET_TEXT_F(MSG_SPEED), getFeedrate_percent()); + w.increments(); +} + +bool FeedratePercentScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 4: UI_DECREMENT(Feedrate_percent); break; + case 5: UI_INCREMENT(Feedrate_percent); break; + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..82ee118e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_menu.cpp @@ -0,0 +1,85 @@ +/********************* + * filament_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 9 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define RUNOUT_SENSOR_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LIN_ADVANCE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) +#else + #define GRID_ROWS 6 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define RUNOUT_SENSOR_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LIN_ADVANCE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,6), BTN_SIZE(2,1) +#endif + +void FilamentMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.font(font_large) + .text(TITLE_POS, GET_TEXT_F(MSG_FILAMENT)) + .font(font_medium).colors(normal_btn) + .enabled(ENABLED(FILAMENT_RUNOUT_SENSOR)) + .tag(2).button(RUNOUT_SENSOR_POS, GET_TEXT_F(MSG_RUNOUT_SENSOR)) + .enabled(ENABLED(LIN_ADVANCE)) + .tag(3).button(LIN_ADVANCE_POS, GET_TEXT_F(MSG_LINEAR_ADVANCE)) + .colors(action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool FilamentMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + case 2: GOTO_SCREEN(FilamentRunoutScreen); break; + #endif + #if ENABLED(LIN_ADVANCE) + case 3: GOTO_SCREEN(LinearAdvanceScreen); break; + #endif + default: return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..f1808bf2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/filament_runout_screen.cpp @@ -0,0 +1,66 @@ +/****************************** + * filament_runout_screen.cpp * + ******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, FILAMENT_RUNOUT_SENSOR) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void FilamentRunoutScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.heading( GET_TEXT_F(MSG_FILAMENT)); + w.toggle( 2, GET_TEXT_F(MSG_RUNOUT_SENSOR), getFilamentRunoutEnabled()); + + #if HAS_FILAMENT_RUNOUT_DISTANCE + extern const char NUL_STR[]; + w.heading(GET_TEXT_F(MSG_RUNOUT_DISTANCE_MM)); + w.units(GET_TEXT_F(MSG_UNITS_MM)); + w.precision(0); + w.color(e_axis); + w.adjuster( 10, progmem_str(NUL_STR), getFilamentRunoutDistance_mm(), getFilamentRunoutEnabled()); + w.increments(); + #endif +} + +bool FilamentRunoutScreen::onTouchHeld(uint8_t tag) { + using namespace ExtUI; + const float increment = getIncrement(); + switch (tag) { + case 2: setFilamentRunoutEnabled(!getFilamentRunoutEnabled()); break; + #if HAS_FILAMENT_RUNOUT_DISTANCE + case 10: UI_DECREMENT(FilamentRunoutDistance_mm); break; + case 11: UI_INCREMENT(FilamentRunoutDistance_mm); break; + #endif + default: + return false; + } + + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..f4c224db --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -0,0 +1,264 @@ +/******************** + * files_screen.cpp * + ********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, SDSUPPORT) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void FilesScreen::onEntry() { + screen_data.FilesScreen.cur_page = 0; + screen_data.FilesScreen.selected_tag = 0xFF; + #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) + CLCD::mem_write_32(CLCD::REG::MACRO_0,DL::NOP); + #endif + gotoPage(0); + BaseScreen::onEntry(); +} + +const char *FilesScreen::getSelectedFilename(bool longName) { + FileList files; + files.seek(getSelectedFileIndex(), true); + return longName ? files.longFilename() : files.shortFilename(); +} + +void FilesScreen::drawSelectedFile() { + FileList files; + files.seek(getSelectedFileIndex(), true); + screen_data.FilesScreen.flags.is_dir = files.isDir(); + drawFileButton( + files.filename(), + screen_data.FilesScreen.selected_tag, + screen_data.FilesScreen.flags.is_dir, + true + ); +} + +uint16_t FilesScreen::getSelectedFileIndex() { + return getFileForTag(screen_data.FilesScreen.selected_tag); +} + +uint16_t FilesScreen::getFileForTag(uint8_t tag) { + return screen_data.FilesScreen.cur_page * files_per_page + tag - 2; +} + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 6 + #define GRID_ROWS (files_per_page + header_h + footer_h) +#else + #define GRID_COLS 6 + #define GRID_ROWS (files_per_page + header_h + footer_h) +#endif + +void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted) { + const uint8_t line = getLineForTag(tag)+1; + CommandProcessor cmd; + cmd.tag(tag); + cmd.cmd(COLOR_RGB(is_highlighted ? fg_action : bg_color)); + 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 + 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) { + cmd.cmd(RESTORE_CONTEXT()); + } + #endif +} + +void FilesScreen::drawFileList() { + FileList files; + 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(); + + #undef MARGIN_T + #undef MARGIN_B + #define MARGIN_T 0 + #define MARGIN_B 0 + uint16_t fileIndex = screen_data.FilesScreen.cur_page * files_per_page; + for (uint8_t i = 0; i < files_per_page; i++, fileIndex++) { + if (files.seek(fileIndex)) { + drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false); + } + else { + break; + } + } +} + +void FilesScreen::drawHeader() { + const bool prev_enabled = screen_data.FilesScreen.cur_page > 0; + const bool next_enabled = screen_data.FilesScreen.cur_page < (screen_data.FilesScreen.num_page - 1); + + #undef MARGIN_T + #undef MARGIN_B + #define MARGIN_T 0 + #define MARGIN_B 2 + + char str[16]; + 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) + .tag(0).button( BTN_POS(2,1), BTN_SIZE(4,header_h), str, OPT_CENTER | OPT_FLAT) + .font(font_medium) + .colors(action_btn) + .tag(241).enabled(prev_enabled).button( BTN_POS(1,1), BTN_SIZE(1,header_h), F("<")) + .tag(242).enabled(next_enabled).button( BTN_POS(6,1), BTN_SIZE(1,header_h), F(">")); +} + +void FilesScreen::drawFooter() { + #undef MARGIN_T + #undef MARGIN_B + #ifdef TOUCH_UI_PORTRAIT + #define MARGIN_T 15 + #define MARGIN_B 5 + #else + #define MARGIN_T 5 + #define MARGIN_B 5 + #endif + const bool has_selection = screen_data.FilesScreen.selected_tag != 0xFF; + const uint8_t back_tag = screen_data.FilesScreen.flags.is_root ? 240 : 245; + const uint8_t y = GRID_ROWS - footer_h + 1; + const uint8_t h = footer_h; + + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(font_medium) + .colors(has_selection ? normal_btn : action_btn) + .tag(back_tag).button( BTN_POS(4,y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BACK)) + .enabled(has_selection) + .colors(has_selection ? action_btn : normal_btn); + if (screen_data.FilesScreen.flags.is_dir) { + cmd.tag(244).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_OPEN)); + } else { + cmd.tag(243).button( BTN_POS(1, y), BTN_SIZE(3,h), GET_TEXT_F(MSG_BUTTON_PRINT)); + } +} + +void FilesScreen::onRedraw(draw_mode_t what) { + if (what & FOREGROUND) { + drawHeader(); + drawSelectedFile(); + drawFooter(); + } +} + +void FilesScreen::gotoPage(uint8_t page) { + screen_data.FilesScreen.selected_tag = 0xFF; + screen_data.FilesScreen.cur_page = page; + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .colors(normal_btn); + drawFileList(); + storeBackground(); +} + +bool FilesScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 240: GOTO_PREVIOUS(); return true; + case 241: + if (screen_data.FilesScreen.cur_page > 0) { + gotoPage(screen_data.FilesScreen.cur_page-1); + } + break; + case 242: + if (screen_data.FilesScreen.cur_page < (screen_data.FilesScreen.num_page-1)) { + gotoPage(screen_data.FilesScreen.cur_page+1); + } + break; + case 243: + ConfirmStartPrintDialogBox::show(getSelectedFileIndex()); + return true; + case 244: + { + FileList files; + files.changeDir(getSelectedShortFilename()); + gotoPage(0); + } + break; + case 245: + { + FileList files; + files.upDir(); + gotoPage(0); + } + break; + default: + if (tag < 240) { + screen_data.FilesScreen.selected_tag = tag; + #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) + if (FTDI::ftdi_chip >= 810) { + const char *longFilename = getSelectedLongFilename(); + if (longFilename[0]) { + CommandProcessor cmd; + uint16_t text_width = cmd.font(font_medium).text_width(longFilename); + screen_data.FilesScreen.scroll_pos = 0; + if (text_width > display_width) + screen_data.FilesScreen.scroll_max = text_width - display_width + MARGIN_L + MARGIN_R; + else + screen_data.FilesScreen.scroll_max = 0; + } + } + #endif + } + break; + } + return true; +} + +void FilesScreen::onIdle() { + #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) + if (FTDI::ftdi_chip >= 810) { + CLCD::mem_write_32(CLCD::REG::MACRO_0, + VERTEX_TRANSLATE_X(-int32_t(screen_data.FilesScreen.scroll_pos))); + if (screen_data.FilesScreen.scroll_pos < screen_data.FilesScreen.scroll_max * 16) + screen_data.FilesScreen.scroll_pos++; + } + #endif +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..c806ef49 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_settings_screen.cpp @@ -0,0 +1,291 @@ +/********************************* + * interface_settings_screen.cpp * + *********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +#include "../archim2-flash/flash_storage.h" + +#include "../../../../../module/settings.h" + +#if ENABLED(LULZBOT_PRINTCOUNTER) + #include "../../../../../module/printcounter.h" +#endif + +bool restoreEEPROM(); + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +constexpr bool PERSISTENT_STORE_SUCCESS = false; // persistentStore uses true for error + +void InterfaceSettingsScreen::onStartup() { +} + +void InterfaceSettingsScreen::onEntry() { + screen_data.InterfaceSettingsScreen.brightness = CLCD::get_brightness(); + screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); + BaseScreen::onEntry(); +} + +void InterfaceSettingsScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + + #define GRID_COLS 4 + #ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 7 + #else + #define GRID_ROWS 6 + #endif + + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + .font(font_medium) + .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_INTERFACE)) + #undef EDGE_R + #define EDGE_R 30 + .font(font_small) + .tag(0) + #if DISABLED(LCD_FYSETC_TFT81050) + .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_LCD_BRIGHTNESS), OPT_RIGHTX | OPT_CENTERY) + #endif + .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_SCREEN_LOCK), OPT_RIGHTX | OPT_CENTERY); + #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) + cmd.text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BOOT_SCREEN), OPT_RIGHTX | OPT_CENTERY); + #endif + #undef EDGE_R + } + + if (what & FOREGROUND) { + #ifdef TOUCH_UI_PORTRAIT + constexpr uint8_t w = 2; + #else + constexpr uint8_t w = 1; + #endif + + cmd.font(font_medium) + #define EDGE_R 30 + .colors(ui_slider) + #if DISABLED(LCD_FYSETC_TFT81050) + .tag(2).slider(BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.brightness, 128) + #endif + .tag(3).slider(BTN_POS(3,3), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) + .colors(ui_toggle) + .tag(4).toggle2(BTN_POS(3,4), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), LockScreen::is_enabled()) + #if DISABLED(TOUCH_UI_NO_BOOTSCREEN) + .tag(5).toggle2(BTN_POS(3,5), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::animations_enabled()) + #endif + #undef EDGE_R + #define EDGE_R 0 + #ifdef TOUCH_UI_PORTRAIT + .colors(normal_btn) + .tag(6).button (BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS)) + .colors(action_btn) + .tag(1).button (BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK)); + #else + .tag(6).button (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUNDS)) + .colors(action_btn) + .tag(1).button (BTN_POS(3,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); + #endif + } +} + +bool InterfaceSettingsScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + case 4: + if (!LockScreen::is_enabled()) + LockScreen::enable(); + else + LockScreen::disable(); + break; + case 5: UIData::enable_animations(!UIData::animations_enabled());; break; + case 6: GOTO_SCREEN(InterfaceSoundsScreen); return true; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +bool InterfaceSettingsScreen::onTouchStart(uint8_t tag) { + #undef EDGE_R + #define EDGE_R 30 + CommandProcessor cmd; + switch (tag) { + case 2: cmd.track_linear(BTN_POS(3,3), BTN_SIZE(2,1), 2).execute(); break; + case 3: cmd.track_linear(BTN_POS(3,4), BTN_SIZE(2,1), 3).execute(); break; + default: break; + } + #undef EDGE_R + #define EDGE_R 0 + #undef GRID_COLS + #undef GRID_ROWS + return true; +} + +void InterfaceSettingsScreen::onIdle() { + if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) { + refresh_timer.start(); + + uint16_t value; + CommandProcessor cmd; + switch (cmd.track_tag(value)) { + case 2: + screen_data.InterfaceSettingsScreen.brightness = max(11, (value * 128UL) / 0xFFFF); + CLCD::set_brightness(screen_data.InterfaceSettingsScreen.brightness); + SaveSettingsDialogBox::settingsChanged(); + break; + case 3: + screen_data.InterfaceSettingsScreen.volume = value >> 8; + SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); + SaveSettingsDialogBox::settingsChanged(); + break; + default: + return; + } + onRefresh(); + } + BaseScreen::onIdle(); +} + +void InterfaceSettingsScreen::failSafeSettings() { + // Reset settings that may make the printer interface + // unusable. + CLCD::mem_write_32(CLCD::REG::ROTATE, 0); + CLCD::default_touch_transform(); + CLCD::default_display_orientation(); + CLCD::set_brightness(255); + UIData::reset_persistent_data(); + CLCD::mem_write_16(CLCD::REG::HOFFSET, FTDI::Hoffset); + CLCD::mem_write_16(CLCD::REG::VOFFSET, FTDI::Voffset); +} + +void InterfaceSettingsScreen::defaultSettings() { + LockScreen::passcode = 0; + SoundPlayer::set_volume(255); + CLCD::set_brightness(255); + UIData::reset_persistent_data(); + InterfaceSoundsScreen::defaultSettings(); + CLCD::mem_write_16(CLCD::REG::HOFFSET, FTDI::Hoffset); + CLCD::mem_write_16(CLCD::REG::VOFFSET, FTDI::Voffset); +} + +void InterfaceSettingsScreen::saveSettings(char *buff) { + static_assert( + ExtUI::eeprom_data_size >= sizeof(persistent_data_t), + "Insufficient space in EEPROM for UI parameters" + ); + + SERIAL_ECHOLNPGM("Writing setting to EEPROM"); + + persistent_data_t eeprom; + + eeprom.passcode = LockScreen::passcode; + eeprom.sound_volume = SoundPlayer::get_volume(); + eeprom.display_brightness = CLCD::get_brightness(); + eeprom.bit_flags = UIData::get_persistent_data(); + eeprom.touch_transform_a = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_A); + eeprom.touch_transform_b = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_B); + eeprom.touch_transform_c = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_C); + eeprom.touch_transform_d = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_D); + eeprom.touch_transform_e = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_E); + eeprom.touch_transform_f = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_F); + eeprom.display_h_offset_adj = CLCD::mem_read_16(CLCD::REG::HOFFSET) - FTDI::Hoffset; + eeprom.display_v_offset_adj = CLCD::mem_read_16(CLCD::REG::VOFFSET) - FTDI::Voffset; + for (uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) + eeprom.event_sounds[i] = InterfaceSoundsScreen::event_sounds[i]; + + memcpy(buff, &eeprom, sizeof(eeprom)); +} + +void InterfaceSettingsScreen::loadSettings(const char *buff) { + static_assert( + ExtUI::eeprom_data_size >= sizeof(persistent_data_t), + "Insufficient space in EEPROM for UI parameters" + ); + + persistent_data_t eeprom; + memcpy(&eeprom, buff, sizeof(eeprom)); + + SERIAL_ECHOLNPGM("Loading setting from EEPROM"); + + LockScreen::passcode = eeprom.passcode; + SoundPlayer::set_volume(eeprom.sound_volume); + UIData::set_persistent_data(eeprom.bit_flags); + CLCD::set_brightness(eeprom.display_brightness); + CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_A, eeprom.touch_transform_a); + CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_B, eeprom.touch_transform_b); + CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_C, eeprom.touch_transform_c); + CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_D, eeprom.touch_transform_d); + CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_E, eeprom.touch_transform_e); + CLCD::mem_write_32(CLCD::REG::TOUCH_TRANSFORM_F, eeprom.touch_transform_f); + CLCD::mem_write_16(CLCD::REG::HOFFSET, eeprom.display_h_offset_adj + FTDI::Hoffset); + CLCD::mem_write_16(CLCD::REG::VOFFSET, eeprom.display_v_offset_adj + FTDI::Voffset); + for (uint8_t i = 0; i < InterfaceSoundsScreen::NUM_EVENTS; i++) + InterfaceSoundsScreen::event_sounds[i] = eeprom.event_sounds[i]; + + TERN_(TOUCH_UI_DEVELOPER_MENU, StressTestScreen::startupCheck()); +} + +#ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + #include "../../../../../HAL/shared/eeprom_api.h" + + bool restoreEEPROM() { + uint8_t data[ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE]; + + bool success = UIFlashStorage::read_config_data(data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE); + + if (success) + success = persistentStore.write_data(0, data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE) == PERSISTENT_STORE_SUCCESS; + + if (success) + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_EEPROM_RESTORED)); + else + StatusScreen::setStatusMessage(GET_TEXT_F(MSG_EEPROM_RESET)); + + return success; + } + + bool InterfaceSettingsScreen::backupEEPROM() { + uint8_t data[ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE]; + + if (persistentStore.read_data(0, data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE) != PERSISTENT_STORE_SUCCESS) + return false; + + UIFlashStorage::write_config_data(data, ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE); + + return true; + } +#endif + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..25a44c1a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/interface_sounds_screen.cpp @@ -0,0 +1,160 @@ +/******************************* + * interface_sounds_screen.cpp * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +uint8_t InterfaceSoundsScreen::event_sounds[]; + +const char* InterfaceSoundsScreen::getSoundSelection(event_t event) { + return SoundList::name(event_sounds[event]); +} + +void InterfaceSoundsScreen::toggleSoundSelection(event_t event) { + event_sounds[event] = (event_sounds[event]+1) % SoundList::n; + playEventSound(event); +} + +void InterfaceSoundsScreen::setSoundSelection(event_t event, const SoundPlayer::sound_t* sound) { + for (uint8_t i = 0; i < SoundList::n; i++) + if (SoundList::data(i) == sound) + event_sounds[event] = i; +} + +void InterfaceSoundsScreen::playEventSound(event_t event, play_mode_t mode) { + sound.play(SoundList::data(event_sounds[event]), mode); +} + +void InterfaceSoundsScreen::defaultSettings() { + setSoundSelection(PRINTING_STARTED, twinkle); + setSoundSelection(PRINTING_FINISHED, fanfare); + setSoundSelection(PRINTING_FAILED, sad_trombone); +} + +void InterfaceSoundsScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + + #define GRID_COLS 4 + #define GRID_ROWS 9 + + .font(font_medium) + .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_SOUNDS)) + #undef EDGE_R + #define EDGE_R 30 + .font(font_small) + .tag(0).text (BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_SOUND_VOLUME), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_CLICK_SOUNDS), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_STARTING), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_FINISHED), OPT_RIGHTX | OPT_CENTERY) + .text (BTN_POS(1,7), BTN_SIZE(2,1), GET_TEXT_F(MSG_PRINT_ERROR), OPT_RIGHTX | OPT_CENTERY); + #undef EDGE_R + } + + if (what & FOREGROUND) { + #ifdef TOUCH_UI_PORTRAIT + constexpr uint8_t w = 2; + #else + constexpr uint8_t w = 1; + #endif + + cmd.font(font_medium) + .colors(ui_slider) + #define EDGE_R 30 + .tag(2).slider (BTN_POS(3,2), BTN_SIZE(2,1), screen_data.InterfaceSettingsScreen.volume, 0xFF) + .colors(ui_toggle) + .tag(3).toggle2 (BTN_POS(3,3), BTN_SIZE(w,1), GET_TEXT_F(MSG_NO), GET_TEXT_F(MSG_YES), UIData::touch_sounds_enabled()) + #undef EDGE_R + .colors(normal_btn) + #define EDGE_R 0 + .tag(4).button (BTN_POS(3,5), BTN_SIZE(2,1), getSoundSelection(PRINTING_STARTED)) + .tag(5).button (BTN_POS(3,6), BTN_SIZE(2,1), getSoundSelection(PRINTING_FINISHED)) + .tag(6).button (BTN_POS(3,7), BTN_SIZE(2,1), getSoundSelection(PRINTING_FAILED)) + .colors(action_btn) + .tag(1).button (BTN_POS(1,9), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK)); + } +} + +void InterfaceSoundsScreen::onEntry() { + screen_data.InterfaceSettingsScreen.volume = SoundPlayer::get_volume(); + BaseScreen::onEntry(); +} + +bool InterfaceSoundsScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + case 3: UIData::enable_touch_sounds(!UIData::touch_sounds_enabled()); break; + case 4: toggleSoundSelection(PRINTING_STARTED); break; + case 5: toggleSoundSelection(PRINTING_FINISHED); break; + case 6: toggleSoundSelection(PRINTING_FAILED); break; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +bool InterfaceSoundsScreen::onTouchStart(uint8_t tag) { + CommandProcessor cmd; + #undef EDGE_R + #define EDGE_R 30 + switch (tag) { + case 2: cmd.track_linear(BTN_POS(3,2), BTN_SIZE(2,1), 2).execute(); break; + default: break; + } + return true; +} + +void InterfaceSoundsScreen::onIdle() { + if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) { + refresh_timer.start(); + + uint16_t value; + CommandProcessor cmd; + switch (cmd.track_tag(value)) { + case 2: + screen_data.InterfaceSettingsScreen.volume = value >> 8; + SoundPlayer::set_volume(screen_data.InterfaceSettingsScreen.volume); + SaveSettingsDialogBox::settingsChanged(); + break; + default: + return; + } + onRefresh(); + } + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..b96c2be7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/jerk_screen.cpp @@ -0,0 +1,65 @@ +/******************* + * jerk_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, CLASSIC_JERK) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void JerkScreen::onRedraw(draw_mode_t what) { + + widgets_t w(what); + w.precision(1); + w.units(GET_TEXT_F(MSG_UNITS_MM_S)); + w.heading(GET_TEXT_F(MSG_JERK)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisMaxJerk_mm_s(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisMaxJerk_mm_s(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisMaxJerk_mm_s(Z) ); + w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisMaxJerk_mm_s(E0) ); + w.increments(); +} + +bool JerkScreen::onTouchHeld(uint8_t tag) { + using namespace ExtUI; + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(AxisMaxJerk_mm_s, X); break; + case 3: UI_INCREMENT(AxisMaxJerk_mm_s, X); break; + case 4: UI_DECREMENT(AxisMaxJerk_mm_s, Y); break; + case 5: UI_INCREMENT(AxisMaxJerk_mm_s, Y); break; + case 6: UI_DECREMENT(AxisMaxJerk_mm_s, Z); break; + case 7: UI_INCREMENT(AxisMaxJerk_mm_s, Z); break; + case 8: UI_DECREMENT(AxisMaxJerk_mm_s, E0); break; + case 9: UI_INCREMENT(AxisMaxJerk_mm_s, E0); break; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE && CLASSIC_JERK 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 new file mode 100644 index 00000000..d365b12e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/junction_deviation_screen.cpp @@ -0,0 +1,54 @@ +/******************* + * boot_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_JUNCTION_DEVIATION) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void JunctionDeviationScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(2); + w.units(GET_TEXT_F(MSG_UNITS_MM)); + w.heading(GET_TEXT_F(MSG_JUNCTION_DEVIATION)); + w.color(other) .adjuster( 2, F(""), getJunctionDeviation_mm() ); + w.increments(); +} + +bool JunctionDeviationScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(JunctionDeviation_mm); break; + case 3: UI_INCREMENT(JunctionDeviation_mm); break; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE && !CLASSIC_JERK 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 new file mode 100644 index 00000000..d9832462 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/kill_screen.cpp @@ -0,0 +1,62 @@ +/******************* + * kill_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; + +// The kill screen is an oddball that happens after Marlin has killed the events +// loop. So we only have a show() method rather than onRedraw(). The KillScreen +// should not be used as a model for other UI screens as it is an exception. + +void KillScreen::show(const char *message) { + CommandProcessor cmd; + + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + + #define GRID_COLS 4 + #define GRID_ROWS 8 + + cmd.font(Theme::font_large) + .cmd(COLOR_RGB(Theme::bg_text_enabled)) + .text(BTN_POS(1,2), BTN_SIZE(4,1), message) + .text(BTN_POS(1,3), BTN_SIZE(4,1), GET_TEXT_F(MSG_HALTED)) + .text(BTN_POS(1,6), BTN_SIZE(4,1), GET_TEXT_F(MSG_PLEASE_RESET)); + + #undef GRID_COLS + #undef GRID_ROWS + + cmd.cmd(DL::DL_DISPLAY) + .cmd(CMD_SWAP) + .execute(); + + InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_FAILED, PLAY_SYNCHRONOUS); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..5b4c1c91 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/language_menu.cpp @@ -0,0 +1,66 @@ +/********************* + * language_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" +#include "../language/language.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && NUM_LANGUAGES > 1 + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void LanguageMenu::onRedraw(draw_mode_t) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .colors(normal_btn) + .font(Theme::font_medium); + + #define GRID_ROWS 8 + #define GRID_COLS 1 + + cmd.tag(1).button(BTN_POS(1,1), BTN_SIZE(1,1), GET_LANGUAGE_NAME(1)); + cmd.tag(2).button(BTN_POS(1,2), BTN_SIZE(1,1), GET_LANGUAGE_NAME(2)); + #if NUM_LANGUAGES > 2 + cmd.tag(3).button(BTN_POS(1,3), BTN_SIZE(1,1), GET_LANGUAGE_NAME(3)); + #if NUM_LANGUAGES > 3 + cmd.tag(4).button(BTN_POS(1,4), BTN_SIZE(1,1), GET_LANGUAGE_NAME(4)); + #if NUM_LANGUAGES > 5 + cmd.tag(5).button(BTN_POS(1,5), BTN_SIZE(1,1), GET_LANGUAGE_NAME(5)); + #endif + #endif + #endif +} + +bool LanguageMenu::onTouchEnd(uint8_t tag) { + + if (tag > 0 && tag <= NUM_LANGUAGES) { + lang = tag - 1; + GOTO_SCREEN(StatusScreen); + return true; + } + return false; +} + +#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp new file mode 100644 index 00000000..763403d2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/leveling_menu.cpp @@ -0,0 +1,125 @@ +/********************* + * leveling_menu.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) + +#include "screens.h" + +#if BOTH(HAS_BED_PROBE,BLTOUCH) + #include "../../../../../feature/bltouch.h" +#endif + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 10 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define BLTOUCH_TITLE_POS BTN_POS(1,7), BTN_SIZE(2,1) + #define BLTOUCH_RESET_POS BTN_POS(1,8), BTN_SIZE(1,1) + #define BLTOUCH_TEST_POS BTN_POS(2,8), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,10), BTN_SIZE(2,1) +#else + #define GRID_ROWS 8 + #define GRID_COLS 2 + #define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define LEVEL_BED_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define LEVEL_AXIS_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define Z_AUTO_ALIGN_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define SHOW_MESH_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define BLTOUCH_TITLE_POS BTN_POS(1,6), BTN_SIZE(2,1) + #define BLTOUCH_RESET_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define BLTOUCH_TEST_POS BTN_POS(2,7), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) +#endif + +void LevelingMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.font(font_large) + .text(TITLE_POS, GET_TEXT_F(MSG_LEVELING)) + .font(font_medium).colors(normal_btn) + .tag(2).button(LEVEL_BED_POS, GET_TEXT_F(MSG_LEVEL_BED)) + .enabled( + #ifdef AXIS_LEVELING_COMMANDS + 1 + #endif + ) + .tag(3).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_AUTOLEVEL_X_AXIS)) + .enabled(ENABLED(Z_STEPPER_AUTO_ALIGN)) + .tag(4).button(Z_AUTO_ALIGN_POS, GET_TEXT_F(MSG_AUTO_Z_ALIGN)) + .enabled(ENABLED(HAS_MESH)) + .tag(5).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)); + #if ENABLED(BLTOUCH) + cmd.text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) + .tag(6).button(BLTOUCH_RESET_POS, GET_TEXT_F(MSG_BLTOUCH_RESET)) + .tag(7).button(BLTOUCH_TEST_POS, GET_TEXT_F(MSG_BLTOUCH_SELFTEST)); + #endif + cmd.colors(action_btn) + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool LevelingMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: + #if HAS_MESH + BedMeshScreen::startMeshProbe(); + #else + SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); + #endif + break; + #ifdef AXIS_LEVELING_COMMANDS + case 3: SpinnerDialogBox::enqueueAndWait_P(F(AXIS_LEVELING_COMMANDS)); break; + #endif + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + case 4: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; + #endif + #if HAS_MESH + case 5: GOTO_SCREEN(BedMeshScreen); break; + #endif + #if ENABLED(BLTOUCH) + case 6: injectCommands_P(PSTR("M280 P0 S60")); break; + case 7: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; + #endif + default: return false; + } + return true; +} + +#endif // BOTH(TOUCH_UI_FTDI_EVE,HAS_LEVELING) 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 new file mode 100644 index 00000000..8a5c675f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/linear_advance_screen.cpp @@ -0,0 +1,77 @@ +/***************************** + * linear_advance_screen.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, LIN_ADVANCE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void LinearAdvanceScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(2, DEFAULT_LOWEST).color(e_axis); + w.heading( GET_TEXT_F(MSG_LINEAR_ADVANCE)); + #if !HAS_MULTI_EXTRUDER + w.adjuster( 2, GET_TEXT_F(MSG_LINEAR_ADVANCE_K), getLinearAdvance_mm_mm_s(E0) ); + #else + w.adjuster( 2, GET_TEXT_F(MSG_LINEAR_ADVANCE_K1), getLinearAdvance_mm_mm_s(E0) ); + w.adjuster( 4, GET_TEXT_F(MSG_LINEAR_ADVANCE_K2), getLinearAdvance_mm_mm_s(E1) ); + #if EXTRUDERS > 2 + w.adjuster( 6, GET_TEXT_F(MSG_LINEAR_ADVANCE_K3), getLinearAdvance_mm_mm_s(E2) ); + #if EXTRUDERS > 3 + w.adjuster( 8, GET_TEXT_F(MSG_LINEAR_ADVANCE_K4), getLinearAdvance_mm_mm_s(E3) ); + #endif + #endif + #endif + w.increments(); +} + +bool LinearAdvanceScreen::onTouchHeld(uint8_t tag) { + using namespace ExtUI; + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(LinearAdvance_mm_mm_s, E0); break; + case 3: UI_INCREMENT(LinearAdvance_mm_mm_s, E0); break; + #if HAS_MULTI_EXTRUDER + case 4: UI_DECREMENT(LinearAdvance_mm_mm_s, E1); break; + case 5: UI_INCREMENT(LinearAdvance_mm_mm_s, E1); break; + #if EXTRUDERS > 2 + case 6: UI_DECREMENT(LinearAdvance_mm_mm_s, E2); break; + case 7: UI_INCREMENT(LinearAdvance_mm_mm_s, E2); break; + #if EXTRUDERS > 3 + case 8: UI_DECREMENT(LinearAdvance_mm_mm_s, E3); break; + case 9: UI_INCREMENT(LinearAdvance_mm_mm_s, E3); break; + #endif + #endif + #endif + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..7854ce5e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/lock_screen.cpp @@ -0,0 +1,208 @@ +/******************* + * lock_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; + +uint16_t LockScreen::passcode = 0; + +void LockScreen::onEntry() { + const uint8_t siz = sizeof(screen_data.LockScreen.passcode); + memset(screen_data.LockScreen.passcode, '_', siz-1); + screen_data.LockScreen.passcode[siz-1] = '\0'; + BaseScreen::onEntry(); +} + +void LockScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + } + + if (what & FOREGROUND) { + #ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 1 + #define GRID_ROWS 10 + #else + #define GRID_COLS 1 + #define GRID_ROWS 7 + #endif + + #undef MARGIN_T + #undef MARGIN_B + #define MARGIN_T 3 + #define MARGIN_B 3 + + progmem_str message; + switch (message_style()) { + case 'w': + message = GET_TEXT_F(MSG_PASSCODE_REJECTED); + break; + case 'g': + message = GET_TEXT_F(MSG_PASSCODE_ACCEPTED); + break; + default: + message = passcode ? GET_TEXT_F(MSG_PASSCODE_REQUEST) : GET_TEXT_F(MSG_PASSCODE_SELECT); + } + message_style() = '\0'; // Terminate the string. + + constexpr uint8_t l = TERN(TOUCH_UI_PORTRAIT, 6, 3); + + const uint8_t pressed = EventLoop::get_pressed_tag(); + + cmd.font(font_large) + #ifdef TOUCH_UI_PORTRAIT + .text(BTN_POS(1,2), BTN_SIZE(1,1), message) + .font(font_xlarge) + .text(BTN_POS(1,4), BTN_SIZE(1,1), screen_data.LockScreen.passcode) + #else + .text(BTN_POS(1,1), BTN_SIZE(1,1), message) + .font(font_xlarge) + .text(BTN_POS(1,2), BTN_SIZE(1,1), screen_data.LockScreen.passcode) + #endif + .font(font_large) + .colors(normal_btn) + #ifdef TOUCH_UI_PASSCODE + .keys(BTN_POS(1,l+1), BTN_SIZE(1,1), F("123"), pressed) + .keys(BTN_POS(1,l+2), BTN_SIZE(1,1), F("456"), pressed) + .keys(BTN_POS(1,l+3), BTN_SIZE(1,1), F("789"), pressed) + .keys(BTN_POS(1,l+4), BTN_SIZE(1,1), F("0.<"), pressed); + #else + .keys(BTN_POS(1,l+1), BTN_SIZE(1,1), F("1234567890"), pressed) + .keys(BTN_POS(1,l+2), BTN_SIZE(1,1), F("qwertyuiop"), pressed) + .keys(BTN_POS(1,l+3), BTN_SIZE(1,1), F("asdfghjkl "), pressed) + .keys(BTN_POS(1,l+4), BTN_SIZE(1,1), F("zxcvbnm!?<"), pressed); + #endif + + #undef MARGIN_T + #undef MARGIN_B + #define MARGIN_T MARGIN_DEFAULT + #define MARGIN_B MARGIN_DEFAULT + + #undef GRID_COLS + #undef GRID_ROWS + } +} + +char &LockScreen::message_style() { + // We use the last byte of the passcode string as a flag to indicate, + // which message to show. + constexpr uint8_t last_char = sizeof(screen_data.LockScreen.passcode)-1; + return screen_data.LockScreen.passcode[last_char]; +} + +void LockScreen::onPasscodeEntered() { + if (passcode == 0) { + // We are defining a passcode + message_style() = 0; + onRefresh(); + sound.play(twinkle, PLAY_SYNCHRONOUS); + passcode = compute_checksum(); + GOTO_PREVIOUS(); + } else { + // We are verifying a passcode + if (passcode == compute_checksum()) { + message_style() = 'g'; + onRefresh(); + sound.play(twinkle, PLAY_SYNCHRONOUS); + GOTO_PREVIOUS(); + } + else { + message_style() = 'w'; + onRefresh(); + sound.play(sad_trombone, PLAY_SYNCHRONOUS); + current_screen.forget(); // Discard the screen the user was trying to go to. + GOTO_PREVIOUS(); + } + } +} + +bool LockScreen::onTouchEnd(uint8_t tag) { + char *c = strchr(screen_data.LockScreen.passcode,'_'); + if (c) { + if (tag == '<') { + if (c != screen_data.LockScreen.passcode) { + // Backspace deletes previous entered characters. + *--c = '_'; + } + } + else { + // Append character to passcode + *c++ = tag; + if (*c == '\0') { + // If at last character, then process the code. + onPasscodeEntered(); + } + } + } + return true; +} + +uint16_t LockScreen::compute_checksum() { + uint16_t checksum = 0; + const char* c = screen_data.LockScreen.passcode; + while (*c) { + checksum = (checksum << 2) ^ *c++; + } + if (checksum == 0) checksum = 0xFFFF; // Prevent a zero checksum + return checksum; +} + +// This function should be called *after* calling GOTO_SCREEN +// to move to new screen. If a passcode is enabled, it will +// immediately jump to the keypad screen, pushing the previous +// screen onto the stack. If the code is entered correctly, +// the stack will be popped, allowing the user to proceed to +// the new screen. Otherwise it will be popped twice, taking +// the user back to where they were before. +void LockScreen::check_passcode() { + if (passcode == 0) return; + message_style() = 0; + GOTO_SCREEN(LockScreen); +} + +bool LockScreen::is_enabled() { + return passcode != 0; +} + +void LockScreen::disable() { + passcode = 0; +} + +void LockScreen::enable() { + message_style() = 0; + passcode = 0; + GOTO_SCREEN(LockScreen); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..53e3ab00 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -0,0 +1,143 @@ +/***************** + * main_menu.cpp * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void MainMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)); + } + + #ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 8 + #define GRID_COLS 2 + #define ABOUT_PRINTER_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define DISABLE_STEPPERS_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define MOVE_AXIS_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define LEVELING_POS BTN_POS(2,6), BTN_SIZE(1,1) + #define AUTO_HOME_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define CLEAN_NOZZLE_POS BTN_POS(2,7), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) + #else + #define GRID_ROWS 5 + #define GRID_COLS 2 + #define ADVANCED_SETTINGS_POS BTN_POS(1,1), BTN_SIZE(1,1) + #define ABOUT_PRINTER_POS BTN_POS(2,1), BTN_SIZE(1,1) + #define AUTO_HOME_POS BTN_POS(1,2), BTN_SIZE(1,1) + #define CLEAN_NOZZLE_POS BTN_POS(2,2), BTN_SIZE(1,1) + #define MOVE_AXIS_POS BTN_POS(1,3), BTN_SIZE(1,1) + #define DISABLE_STEPPERS_POS BTN_POS(2,3), BTN_SIZE(1,1) + #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(1,1) + #define FILAMENTCHANGE_POS BTN_POS(2,4), BTN_SIZE(1,1) + #define LEVELING_POS BTN_POS(1,5), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) + #endif + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + .tag(2).button( AUTO_HOME_POS, GET_TEXT_F(MSG_AUTO_HOME)) + .enabled( + #if ANY(NOZZLE_CLEAN_FEATURE, TOUCH_UI_COCOA_PRESS) + 1 + #endif + ) + .tag(3).button( CLEAN_NOZZLE_POS, GET_TEXT_F( + #if ENABLED(TOUCH_UI_COCOA_PRESS) + MSG_PREHEAT_1 + #else + MSG_CLEAN_NOZZLE + #endif + )) + .tag(4).button( MOVE_AXIS_POS, GET_TEXT_F(MSG_MOVE_AXIS)) + .tag(5).button( DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) + .tag(6).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .enabled( + #if DISABLED(TOUCH_UI_LULZBOT_BIO) + 1 + #endif + ) + .tag(7).button( FILAMENTCHANGE_POS, GET_TEXT_F( + #if ENABLED(TOUCH_UI_COCOA_PRESS) + MSG_CASE_LIGHT + #else + MSG_FILAMENTCHANGE + #endif + )) + .tag(8).button( ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .enabled( + #ifdef HAS_LEVELING + 1 + #endif + ) + .tag(9).button( LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(10).button( ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .colors(action_btn) + .tag(1).button( BACK_POS, GET_TEXT_F(MSG_BACK)); + } +} + +bool MainMenu::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + + switch (tag) { + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; + #if ENABLED(TOUCH_UI_COCOA_PRESS) + case 3: GOTO_SCREEN(PreheatMenu); break; + #elif ENABLED(NOZZLE_CLEAN_FEATURE) + case 3: injectCommands_P(PSTR("G12")); GOTO_SCREEN(StatusScreen); break; + #endif + 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, CASE_LIGHT_ENABLE) + case 7: GOTO_SCREEN(CaseLightScreen); break; + #else + case 7: GOTO_SCREEN(ChangeFilamentScreen); break; + #endif + case 8: GOTO_SCREEN(AdvancedSettingsMenu); break; + #ifdef HAS_LEVELING + case 9: GOTO_SCREEN(LevelingMenu); break; + #endif + case 10: GOTO_SCREEN(AboutScreen); break; + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..29ac2f1b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp @@ -0,0 +1,86 @@ +/******************************* + * max_acceleration_screen.cpp * + *******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void MaxAccelerationScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0); + w.units(GET_TEXT_F(MSG_UNITS_MM_S2)); + w.heading(GET_TEXT_F(MSG_ACCELERATION)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AMAX_X), getAxisMaxAcceleration_mm_s2(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AMAX_Y), getAxisMaxAcceleration_mm_s2(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AMAX_Z), getAxisMaxAcceleration_mm_s2(Z) ); + #if DISTINCT_E == 1 + w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AMAX_E), getAxisMaxAcceleration_mm_s2(E0) ); + #elif DISTINCT_E > 1 + w.heading(GET_TEXT_F(MSG_AMAX_E)); + w.color(e_axis).adjuster( 8, F(LCD_STR_E0), getAxisMaxAcceleration_mm_s2(E0) ); + w.color(e_axis).adjuster(10, F(LCD_STR_E1), getAxisMaxAcceleration_mm_s2(E1) ); + #if DISTINCT_E > 2 + w.color(e_axis).adjuster(12, F(LCD_STR_E2), getAxisMaxAcceleration_mm_s2(E2) ); + #endif + #if DISTINCT_E > 3 + w.color(e_axis).adjuster(14, F(LCD_STR_E3), getAxisMaxAcceleration_mm_s2(E3) ); + #endif + #endif + w.increments(); +} + +bool MaxAccelerationScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(AxisMaxAcceleration_mm_s2, X ); break; + case 3: UI_INCREMENT(AxisMaxAcceleration_mm_s2, X ); break; + case 4: UI_DECREMENT(AxisMaxAcceleration_mm_s2, Y ); break; + case 5: UI_INCREMENT(AxisMaxAcceleration_mm_s2, Y ); break; + case 6: UI_DECREMENT(AxisMaxAcceleration_mm_s2, Z ); break; + case 7: UI_INCREMENT(AxisMaxAcceleration_mm_s2, Z ); break; + case 8: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E0); break; + case 9: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E0); break; + #if DISTINCT_E > 1 + case 10: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E1); break; + case 11: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E1); break; + #endif + #if DISTINCT_E > 2 + case 12: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E2); break; + case 13: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E2); break; + #endif + #if DISTINCT_E > 3 + case 14: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E3); break; + case 15: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E3); break; + #endif + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..2316f93e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp @@ -0,0 +1,90 @@ +/*************************** + * max_velocity_screen.cpp * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void MaxVelocityScreen::onRedraw(draw_mode_t what) { + using namespace ExtUI; + widgets_t w(what); + w.precision(0); + w.units(GET_TEXT_F(MSG_UNITS_MM_S)); + w.heading( GET_TEXT_F(MSG_VELOCITY)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_VMAX_X), getAxisMaxFeedrate_mm_s(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_VMAX_Y), getAxisMaxFeedrate_mm_s(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_VMAX_Z), getAxisMaxFeedrate_mm_s(Z) ); + #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) + w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_VMAX_E), getAxisMaxFeedrate_mm_s(E0) ); + #elif HAS_MULTI_EXTRUDER + w.heading(GET_TEXT_F(MSG_VMAX_E)); + w.color(e_axis) .adjuster( 8, F(LCD_STR_E0), getAxisMaxFeedrate_mm_s(E0) ); + w.color(e_axis) .adjuster( 10, F(LCD_STR_E1), getAxisMaxFeedrate_mm_s(E1) ); + #if EXTRUDERS > 2 + w.color(e_axis).adjuster( 12, F(LCD_STR_E2), getAxisMaxFeedrate_mm_s(E2) ); + #endif + #if EXTRUDERS > 3 + w.color(e_axis).adjuster( 14, F(LCD_STR_E3), getAxisMaxFeedrate_mm_s(E3) ); + #endif + #endif + w.increments(); +} + +bool MaxVelocityScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(AxisMaxFeedrate_mm_s, X); break; + case 3: UI_INCREMENT(AxisMaxFeedrate_mm_s, X); break; + case 4: UI_DECREMENT(AxisMaxFeedrate_mm_s, Y); break; + case 5: UI_INCREMENT(AxisMaxFeedrate_mm_s, Y); break; + case 6: UI_DECREMENT(AxisMaxFeedrate_mm_s, Z); break; + case 7: UI_INCREMENT(AxisMaxFeedrate_mm_s, Z); break; + #if DISTINCT_E > 0 + case 8: UI_DECREMENT(AxisMaxFeedrate_mm_s, E0); break; + case 9: UI_INCREMENT(AxisMaxFeedrate_mm_s, E0); break; + #endif + #if DISTINCT_E > 1 + case 10: UI_DECREMENT(AxisMaxFeedrate_mm_s, E1); break; + case 11: UI_INCREMENT(AxisMaxFeedrate_mm_s, E1); break; + #endif + #if DISTINCT_E > 2 + case 12: UI_DECREMENT(AxisMaxFeedrate_mm_s, E2); break; + case 13: UI_INCREMENT(AxisMaxFeedrate_mm_s, E2); break; + #endif + #if DISTINCT_E > 3 + case 14: UI_DECREMENT(AxisMaxFeedrate_mm_s, E3); break; + case 15: UI_INCREMENT(AxisMaxFeedrate_mm_s, E3); break; + #endif + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..d7e476e0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/media_player_screen.cpp @@ -0,0 +1,168 @@ +/*************************** + * media_player_screen.cpp * + ***************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +/** + * The MediaPlayerScreen allows an AVI to be played. + * + * It requires a special AVI file. The following video + * and audio codecs must be used: + * + * -vcodec mjpeg -pix_fmt yuvj420p + * -acodec adpcm_ima_wav + * + * To generate a 2 second static screen from a png file: + * + * ffmpeg -i startup.png -vcodec mjpeg -pix_fmt yuvj420p -r 1 video.avi + * sox -n -r 44100 -b 8 -c 2 -L silence.wav trim 0.0 2.000 + * ffmpeg -i silence.wav -acodec adpcm_ima_wav silence.avi + * ffmpeg -i video.avi -i silence.wav -c copy -map 0:v:0 -map 1:a:0 startup.avi + */ + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +#include "../archim2-flash/flash_storage.h" +#include "../archim2-flash/media_file_reader.h" + +using namespace FTDI; + +void MediaPlayerScreen::onEntry() { + BaseScreen::onEntry(); + CLCD::turn_on_backlight(); + SoundPlayer::set_volume(255); +} + +void MediaPlayerScreen::onRedraw(draw_mode_t) { +} + +bool MediaPlayerScreen::playCardMedia() { + #if ENABLED(SDSUPPORT) + char fname[15]; + strcpy_P(fname, PSTR("STARTUP.AVI")); + + MediaFileReader reader; + if (!reader.open(fname)) + return false; + + SERIAL_ECHO_MSG("Starting to play STARTUP.AVI"); + playStream(&reader, MediaFileReader::read); + reader.close(); + #endif + return true; +} + +// Attempt to play media from the onboard SPI flash chip +bool MediaPlayerScreen::playBootMedia() { + UIFlashStorage::BootMediaReader reader; + if (!reader.isAvailable()) return false; + + SERIAL_ECHO_MSG("Starting to play boot video"); + playStream(&reader, UIFlashStorage::BootMediaReader::read); + return true; +} + +void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream) { + #if FTDI_API_LEVEL >= 810 + if (FTDI::ftdi_chip >= 810) { + // Set up the media FIFO on the end of RAMG, as the top of RAMG + // will be used as the framebuffer. + + uint8_t buf[512]; + const uint32_t block_size = 512; + const uint32_t fifo_size = block_size * 2; + const uint32_t fifo_start = CLCD::MAP::RAM_G + CLCD::MAP::RAM_G_SIZE - fifo_size; + + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(0x000000)) + .cmd(CLEAR(true,true,true)) + .cmd(DL::DL_DISPLAY) + .cmd(CMD_SWAP) + .execute() + .cmd(CMD_DLSTART) + .mediafifo(fifo_start, fifo_size) + .playvideo(OPT_FULLSCREEN | OPT_MEDIAFIFO | OPT_NOTEAR | OPT_SOUND) + .cmd(DL::DL_DISPLAY) + .cmd(CMD_SWAP) + .execute(); + + uint32_t writePtr = 0; + int16_t nBytes; + + uint32_t t = millis(); + uint8_t timeouts; + + spiInit(SPI_HALF_SPEED); // Boost SPI speed for video playback + + do { + // Write block n + nBytes = (*data_stream)(obj, buf, block_size); + if (nBytes == -1) break; + + if (millis() - t > 10) { + ExtUI::yield(); + t = millis(); + } + + CLCD::mem_write_bulk (fifo_start + writePtr, buf, nBytes); + + // Wait for FTDI810 to finish playing block n-1 + timeouts = 20; + do { + if (millis() - t > 10) { + ExtUI::yield(); + t = millis(); + timeouts--; + if (timeouts == 0) { + SERIAL_ECHO_MSG("Timeout playing video"); + cmd.reset(); + goto exit; + } + } + } while (CLCD::mem_read_32(CLCD::REG::MEDIAFIFO_READ) != writePtr); + + // Start playing block n + writePtr = (writePtr + nBytes) % fifo_size; + CLCD::mem_write_32(CLCD::REG::MEDIAFIFO_WRITE, writePtr); + } while (nBytes == block_size); + + SERIAL_ECHO_MSG("Done playing video"); + + exit: + spiInit(SPI_SPEED); // Restore default speed + + // Since playing media overwrites RAMG, we need to reinitialize + // everything that is stored in RAMG. + cmd.cmd(CMD_DLSTART).execute(); + DLCache::init(); + StatusScreen::loadBitmaps(); + } + #else + UNUSED(obj); + UNUSED(data_stream); + #endif // FTDI_API_LEVEL >= 810 +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..5dd31748 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -0,0 +1,133 @@ +/************************ + * move_axis_screen.cpp * + ************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace ExtUI; + +void MoveAxisScreen::onEntry() { + // Since Marlin keeps only one absolute position for all the extruders, + // we have to keep track of the relative motion of individual extruders + // ourselves. The relative distances are reset to zero whenever this + // screen is entered. + + LOOP_L_N(i, ExtUI::extruderCount) { + screen_data.MoveAxisScreen.e_rel[i] = 0; + } + BaseNumericAdjustmentScreen::onEntry(); +} + +void MoveAxisScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(1); + w.units(GET_TEXT_F(MSG_UNITS_MM)); + w.heading( GET_TEXT_F(MSG_MOVE_AXIS)); + w.home_buttons(20); + w.color(Theme::x_axis).adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisPosition_mm(X), canMove(X)); + w.color(Theme::y_axis).adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisPosition_mm(Y), canMove(Y)); + w.color(Theme::z_axis).adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisPosition_mm(Z), canMove(Z)); + + w.color(Theme::e_axis); + #if EXTRUDERS == 1 + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + #elif HAS_MULTI_EXTRUDER + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxisScreen.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxisScreen.e_rel[1], canMove(E1)); + #if EXTRUDERS > 2 + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxisScreen.e_rel[2], canMove(E2)); + #endif + #if EXTRUDERS > 3 + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxisScreen.e_rel[3], canMove(E3)); + #endif + #endif + w.increments(); +} + +bool MoveAxisScreen::onTouchHeld(uint8_t tag) { + #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT_AXIS(X); break; + case 3: UI_INCREMENT_AXIS(X); break; + case 4: UI_DECREMENT_AXIS(Y); break; + case 5: UI_INCREMENT_AXIS(Y); break; + case 6: UI_DECREMENT_AXIS(Z); break; + case 7: UI_INCREMENT_AXIS(Z); break; + // For extruders, also update relative distances. + case 8: UI_DECREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] -= increment; break; + case 9: UI_INCREMENT_AXIS(E0); screen_data.MoveAxisScreen.e_rel[0] += increment; break; + #if HAS_MULTI_EXTRUDER + case 10: UI_DECREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] -= increment; break; + case 11: UI_INCREMENT_AXIS(E1); screen_data.MoveAxisScreen.e_rel[1] += increment; break; + #endif + #if EXTRUDERS > 2 + case 12: UI_DECREMENT_AXIS(E2); screen_data.MoveAxisScreen.e_rel[2] -= increment; break; + case 13: UI_INCREMENT_AXIS(E2); screen_data.MoveAxisScreen.e_rel[2] += increment; break; + #endif + #if EXTRUDERS > 3 + case 14: UI_DECREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] -= increment; break; + case 15: UI_INCREMENT_AXIS(E3); screen_data.MoveAxisScreen.e_rel[3] += increment; break; + #endif + case 20: SpinnerDialogBox::enqueueAndWait_P(F("G28 X")); break; + case 21: SpinnerDialogBox::enqueueAndWait_P(F("G28 Y")); break; + case 22: SpinnerDialogBox::enqueueAndWait_P(F("G28 Z")); break; + case 23: SpinnerDialogBox::enqueueAndWait_P(F("G28")); break; + default: + return false; + } + #undef UI_DECREMENT_AXIS + #undef UI_INCREMENT_AXIS + return true; +} + +float MoveAxisScreen::getManualFeedrate(uint8_t axis, float increment_mm) { + // Compute feedrate so that the tool lags the adjuster when it is + // being held down, this allows enough margin for the planner to + // connect segments and even out the motion. + constexpr xyze_feedrate_t max_manual_feedrate = MANUAL_FEEDRATE; + return min(max_manual_feedrate[axis] / 60.0f, abs(increment_mm * (TOUCH_REPEATS_PER_SECOND) * 0.80f)); +} + +void MoveAxisScreen::setManualFeedrate(ExtUI::axis_t axis, float increment_mm) { + ExtUI::setFeedrate_mm_s(getManualFeedrate(X_AXIS + (axis - ExtUI::X), increment_mm)); +} + +void MoveAxisScreen::setManualFeedrate(ExtUI::extruder_t, float increment_mm) { + ExtUI::setFeedrate_mm_s(getManualFeedrate(E_AXIS, increment_mm)); +} + +void MoveAxisScreen::onIdle() { + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..07d6900c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nozzle_offsets_screen.cpp @@ -0,0 +1,73 @@ +/***************************** + * nozzle_offsets_screen.cpp * + *****************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_MULTI_HOTEND) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; + +void NozzleOffsetScreen::onEntry() { + // Since we don't allow the user to edit the offsets for E0, + // make sure they are all zero. + normalizeNozzleOffset(X); + normalizeNozzleOffset(Y); + normalizeNozzleOffset(Z); +} + +void NozzleOffsetScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(2).units(GET_TEXT_F(MSG_UNITS_MM)); + + w.heading( GET_TEXT_F(MSG_OFFSETS_MENU)); + w.color(Theme::x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), ExtUI::getNozzleOffset_mm(X, E1)); + w.color(Theme::y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), ExtUI::getNozzleOffset_mm(Y, E1)); + w.color(Theme::z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), ExtUI::getNozzleOffset_mm(Z, E1)); + #if ENABLED(CALIBRATION_GCODE) + w.button(8, GET_TEXT_F(MSG_MEASURE_AUTOMATICALLY), !isPrinting()); + #endif + w.increments(); +} + +bool NozzleOffsetScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(NozzleOffset_mm, X, E1); break; + case 3: UI_INCREMENT(NozzleOffset_mm, X, E1); break; + case 4: UI_DECREMENT(NozzleOffset_mm, Y, E1); break; + case 5: UI_INCREMENT(NozzleOffset_mm, Y, E1); break; + case 6: UI_DECREMENT(NozzleOffset_mm, Z, E1); break; + case 7: UI_INCREMENT(NozzleOffset_mm, Z, E1); break; + #if ENABLED(CALIBRATION_GCODE) + case 8: GOTO_SCREEN(ConfirmAutoCalibrationDialogBox); return true; + #endif + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..ed3c8d99 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/nudge_nozzle_screen.cpp @@ -0,0 +1,123 @@ +/******************** + * nudge_nozzle.cpp * + ********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, BABYSTEPPING) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void NudgeNozzleScreen::onEntry() { + screen_data.NudgeNozzleScreen.show_offsets = false; + #if HAS_MULTI_EXTRUDER + screen_data.NudgeNozzleScreen.link_nozzles = true; + #endif + screen_data.NudgeNozzleScreen.rel.reset(); + + BaseNumericAdjustmentScreen::onEntry(); +} + +void NudgeNozzleScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM)); + + w.heading(GET_TEXT_F(MSG_NUDGE_NOZZLE)); + #if ENABLED(BABYSTEP_XY) + w.color(x_axis).adjuster(2, GET_TEXT_F(MSG_AXIS_X), screen_data.NudgeNozzleScreen.rel.x / getAxisSteps_per_mm(X)); + w.color(y_axis).adjuster(4, GET_TEXT_F(MSG_AXIS_Y), screen_data.NudgeNozzleScreen.rel.y / getAxisSteps_per_mm(Y)); + #endif + w.color(z_axis).adjuster(6, GET_TEXT_F(MSG_AXIS_Z), screen_data.NudgeNozzleScreen.rel.z / getAxisSteps_per_mm(Z)); + w.increments(); + #if HAS_MULTI_EXTRUDER + w.toggle(8, GET_TEXT_F(MSG_ADJUST_BOTH_NOZZLES), screen_data.NudgeNozzleScreen.link_nozzles); + #endif + + #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE + w.toggle(9, GET_TEXT_F(MSG_SHOW_OFFSETS), screen_data.NudgeNozzleScreen.show_offsets); + + if (screen_data.NudgeNozzleScreen.show_offsets) { + char str[19]; + + w.draw_mode(BOTH); + w.color(other); + + #if HAS_BED_PROBE + dtostrf(getZOffset_mm(), 4, 2, str); + strcat(str, " "); + strcat_P(str, GET_TEXT(MSG_UNITS_MM)); + w.text_field(0, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), str); + #endif + + #if HAS_MULTI_HOTEND + format_position(str, getNozzleOffset_mm(X, E1), getNozzleOffset_mm(Y, E1), getNozzleOffset_mm(Z, E1)); + w.text_field(0, GET_TEXT_F(MSG_OFFSETS_MENU), str); + #endif + } + #endif +} + +bool NudgeNozzleScreen::onTouchHeld(uint8_t tag) { + const float inc = getIncrement(); + #if HAS_MULTI_EXTRUDER + const bool link = screen_data.NudgeNozzleScreen.link_nozzles; + #else + constexpr bool link = true; + #endif + int16_t steps; + switch (tag) { + case 2: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps(-steps, X, link); screen_data.NudgeNozzleScreen.rel.x -= steps; break; + case 3: steps = mmToWholeSteps(inc, X); smartAdjustAxis_steps( steps, X, link); screen_data.NudgeNozzleScreen.rel.x += steps; break; + case 4: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps(-steps, Y, link); screen_data.NudgeNozzleScreen.rel.y -= steps; break; + case 5: steps = mmToWholeSteps(inc, Y); smartAdjustAxis_steps( steps, Y, link); screen_data.NudgeNozzleScreen.rel.y += steps; break; + case 6: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps(-steps, Z, link); screen_data.NudgeNozzleScreen.rel.z -= steps; break; + case 7: steps = mmToWholeSteps(inc, Z); smartAdjustAxis_steps( steps, Z, link); screen_data.NudgeNozzleScreen.rel.z += steps; break; + #if HAS_MULTI_EXTRUDER + case 8: screen_data.NudgeNozzleScreen.link_nozzles = !link; break; + #endif + case 9: screen_data.NudgeNozzleScreen.show_offsets = !screen_data.NudgeNozzleScreen.show_offsets; break; + default: return false; + } + #if HAS_MULTI_EXTRUDER || HAS_BED_PROBE + SaveSettingsDialogBox::settingsChanged(); + #endif + return true; +} + +bool NudgeNozzleScreen::onTouchEnd(uint8_t tag) { + if (tag == 1) { + SaveSettingsDialogBox::promptToSaveSettings(); + return true; + } + else + return BaseNumericAdjustmentScreen::onTouchEnd(tag); +} + +void NudgeNozzleScreen::onIdle() { + reset_menu_timeout(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..a8891162 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_menu.cpp @@ -0,0 +1,83 @@ +/******************** + * preheat_menu.cpp * + ********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2020 - Cocoa Press * + * * + * 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_COCOA_PRESS) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void PreheatMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + #define GRID_ROWS 3 + #define GRID_COLS 2 + + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.cmd(COLOR_RGB(bg_text_enabled)) + .font(Theme::font_medium) + .text ( BTN_POS(1,1), BTN_SIZE(2,1), GET_TEXT_F(MSG_PREHEAT_1)) + .colors(normal_btn) + .tag(2).button( BTN_POS(1,2), BTN_SIZE(1,1), F("Dark Chocolate")) + .tag(3).button( BTN_POS(2,2), BTN_SIZE(1,1), F("Milk Chocolate")) + .tag(4).button( BTN_POS(1,3), BTN_SIZE(1,1), F("White Chocolate")) + .colors(action_btn) + .tag(1) .button( BTN_POS(2,3), BTN_SIZE(1,1), GET_TEXT_F(MSG_BACK)); + } +} + +bool PreheatMenu::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: + #ifdef COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_DARK_CHOCOLATE_SCRIPT)); + #endif + GOTO_SCREEN(PreheatTimerScreen); + break; + case 3: + #ifdef COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_MILK_CHOCOLATE_SCRIPT)); + #endif + GOTO_SCREEN(PreheatTimerScreen); + break; + case 4: + #ifdef COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT + injectCommands_P(PSTR(COCOA_PRESS_PREHEAT_WHITE_CHOCOLATE_SCRIPT)); + #endif + GOTO_SCREEN(PreheatTimerScreen); + break; + default: return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..69eecaf5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/preheat_timer_screen.cpp @@ -0,0 +1,112 @@ +/**************************** + * preheat_timer_screen.cpp * + ****************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && defined(TOUCH_UI_COCOA_PRESS) + +#include "screens.h" +#include "screen_data.h" + +#include "../ftdi_eve_lib/extras/circular_progress.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#define GRID_COLS 2 +#define GRID_ROWS 5 + +void PreheatTimerScreen::draw_message(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + draw_text_box(cmd, BTN_POS(2,2), BTN_SIZE(1,1), GET_TEXT_F(MSG_HEATING), OPT_CENTER, font_large); + } +} + +uint16_t PreheatTimerScreen::secondsRemaining() { + const uint32_t elapsed_sec = (millis() - screen_data.PreheatTimerScreen.start_ms) / 1000; + return (COCOA_PRESS_PREHEAT_SECONDS > elapsed_sec) ? COCOA_PRESS_PREHEAT_SECONDS - elapsed_sec : 0; +} + +void PreheatTimerScreen::draw_time_remaining(draw_mode_t what) { + if (what & FOREGROUND) { + const uint16_t elapsed_sec = secondsRemaining(); + const uint8_t min = elapsed_sec / 60, + sec = elapsed_sec % 60; + + char str[10]; + sprintf_P(str, PSTR("%02d:%02d"), min, sec); + + CommandProcessor cmd; + cmd.font(font_xlarge); + draw_circular_progress(cmd, BTN_POS(1,1), BTN_SIZE(1,5), float(secondsRemaining()) * 100 / COCOA_PRESS_PREHEAT_SECONDS, str, theme_dark, theme_darkest); + } +} + +void PreheatTimerScreen::draw_interaction_buttons(draw_mode_t what) { + if (what & FOREGROUND) { + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(font_medium) + .tag(1).button( BTN_POS(2,5), BTN_SIZE(1,1), F("Cancel")); + } +} + +void PreheatTimerScreen::onEntry() { + screen_data.PreheatTimerScreen.start_ms = millis(); +} + +void PreheatTimerScreen::onRedraw(draw_mode_t what) { + draw_message(what); + draw_time_remaining(what); + draw_interaction_buttons(what); +} + +bool PreheatTimerScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + default: break; + } + return false; +} + +void PreheatTimerScreen::onIdle() { + if (secondsRemaining() == 0) { + AlertDialogBox::show(GET_TEXT_F(MSG_PREHEAT_FINISHED)); + // Remove SaveSettingsDialogBox from the stack + // so the alert box doesn't return to me. + current_screen.forget(); + } + + reset_menu_timeout(); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..94b8ac0f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/restore_failsafe_dialog_box.cpp @@ -0,0 +1,51 @@ +/*********************************** + * restore_failsafe_dialog_box.cpp * + ***********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace ExtUI; + +void RestoreFailsafeDialogBox::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_EEPROM_RESET_WARNING)); + drawYesNoButtons(); +} + +bool RestoreFailsafeDialogBox::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: + ExtUI::injectCommands_P(PSTR("M502")); + AlertDialogBox::show(GET_TEXT_F(MSG_EEPROM_RESET)); + // Remove RestoreFailsafeDialogBox from the stack + // so the alert box doesn't return to it. + current_screen.forget(); + SaveSettingsDialogBox::settingsChanged(); + return true; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..f4a99acc --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/save_settings_dialog_box.cpp @@ -0,0 +1,65 @@ +/******************************** + * save_settings_dialog_box.cpp * + ********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace ExtUI; + +bool SaveSettingsDialogBox::needs_save = false; + +void SaveSettingsDialogBox::onRedraw(draw_mode_t) { + drawMessage(GET_TEXT_F(MSG_EEPROM_SAVE_PROMPT)); + drawYesNoButtons(); +} + +bool SaveSettingsDialogBox::onTouchEnd(uint8_t tag) { + needs_save = false; + switch (tag) { + case 1: + injectCommands_P(PSTR("M500")); + AlertDialogBox::show(GET_TEXT_F(MSG_EEPROM_SAVED)); + // Remove SaveSettingsDialogBox from the stack + // so the alert box doesn't return to me. + current_screen.forget(); + return true; + default: + return DialogBoxBaseClass::onTouchEnd(tag); + } +} + +void SaveSettingsDialogBox::promptToSaveSettings() { + if (needs_save) { + // Remove current screen from the stack + // so SaveSettingsDialogBox doesn't return here. + GOTO_SCREEN(SaveSettingsDialogBox); + current_screen.forget(); + } else { + // No save needed. + GOTO_PREVIOUS(); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..dc38890a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -0,0 +1,97 @@ +/***************** + * screen_data.h * + *****************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#include "../ftdi_eve_lib/ftdi_eve_lib.h" + +// To save RAM, store state information related to a particular screen +// in a union. The values should be initialized in the onEntry method. + +struct base_numeric_adjustment_t {uint8_t increment;}; + +union screen_data_t { + struct base_numeric_adjustment_t BaseNumericAdjustmentScreen; + struct {uint8_t volume; uint8_t brightness;} InterfaceSettingsScreen; + struct {char passcode[5];} LockScreen; + struct {bool isError;} AlertDialogBox; + struct {bool auto_hide;} SpinnerDialogBox; + struct {uint8_t file_index;} ConfirmStartPrintDialogBox; + struct { + uint8_t e_tag, t_tag, repeat_tag; + ExtUI::extruder_t saved_extruder; + #if FILAMENT_UNLOAD_PURGE_LENGTH > 0 + bool need_purge; + #endif + } ChangeFilamentScreen; + struct { + struct { + uint8_t is_dir : 1; + uint8_t is_root : 1; + } flags; + uint8_t selected_tag; + uint8_t num_page; + uint8_t cur_page; + #if ENABLED(SCROLL_LONG_FILENAMES) && (FTDI_API_LEVEL >= 810) + uint16_t scroll_pos; + uint16_t scroll_max; + #endif + } FilesScreen; + struct { + struct base_numeric_adjustment_t placeholder; + float e_rel[ExtUI::extruderCount]; + } MoveAxisScreen; + #if HAS_MESH + struct { + enum : uint8_t { + MSG_NONE, + MSG_MESH_COMPLETE, + MSG_MESH_INCOMPLETE + } message; + uint8_t count; + uint8_t highlightedTag; + } BedMeshScreen; + #endif + #if ENABLED(TOUCH_UI_DEVELOPER_MENU) + struct { + uint32_t next_watchdog_trigger; + const char* message; + } StressTestScreen; + #endif + #if ENABLED(TOUCH_UI_COCOA_PRESS) + struct { + uint32_t start_ms; + } PreheatTimerScreen; + #endif + #if ENABLED(BABYSTEPPING) + struct { + struct base_numeric_adjustment_t placeholder; + xyz_int_t rel; + #if HAS_MULTI_EXTRUDER + bool link_nozzles; + #endif + bool show_offsets; + } NudgeNozzleScreen; + #endif +}; + +extern screen_data_t screen_data; 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 new file mode 100644 index 00000000..16aa6821 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -0,0 +1,132 @@ +/*************** + * screens.cpp * + ***************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) +#include "screens.h" +#include "screen_data.h" + +tiny_timer_t refresh_timer; +screen_data_t screen_data; + +SCREEN_TABLE { + DECL_SCREEN(BootScreen), + #if NUM_LANGUAGES > 1 + DECL_SCREEN(LanguageMenu), + #endif + DECL_SCREEN(TouchCalibrationScreen), + DECL_SCREEN(StatusScreen), + DECL_SCREEN(MainMenu), + DECL_SCREEN(TuneMenu), + DECL_SCREEN(AdvancedSettingsMenu), + DECL_SCREEN(AlertDialogBox), + DECL_SCREEN(ConfirmUserRequestAlertBox), + DECL_SCREEN(RestoreFailsafeDialogBox), + DECL_SCREEN(SaveSettingsDialogBox), + DECL_SCREEN(ConfirmStartPrintDialogBox), + DECL_SCREEN(ConfirmAbortPrintDialogBox), +#if ENABLED(CALIBRATION_GCODE) + DECL_SCREEN(ConfirmAutoCalibrationDialogBox), +#endif + DECL_SCREEN(SpinnerDialogBox), + DECL_SCREEN(AboutScreen), +#if ENABLED(PRINTCOUNTER) + DECL_SCREEN(StatisticsScreen), +#endif +#if ENABLED(BABYSTEPPING) + DECL_SCREEN(NudgeNozzleScreen), +#endif + DECL_SCREEN(MoveAxisScreen), + DECL_SCREEN(StepsScreen), +#if HAS_TRINAMIC_CONFIG + DECL_SCREEN(StepperCurrentScreen), + DECL_SCREEN(StepperBumpSensitivityScreen), +#endif +#if HAS_LEVELING + DECL_SCREEN(LevelingMenu), + #if HAS_BED_PROBE + DECL_SCREEN(ZOffsetScreen), + #endif + #if HAS_MESH + DECL_SCREEN(BedMeshScreen), + #endif +#endif +#if HAS_MULTI_HOTEND + DECL_SCREEN(NozzleOffsetScreen), +#endif +#if ENABLED(BACKLASH_GCODE) + DECL_SCREEN(BacklashCompensationScreen), +#endif + DECL_SCREEN(FeedratePercentScreen), + DECL_SCREEN(MaxVelocityScreen), + DECL_SCREEN(MaxAccelerationScreen), + DECL_SCREEN(DefaultAccelerationScreen), +#if HAS_JUNCTION_DEVIATION + DECL_SCREEN(JunctionDeviationScreen), +#else + DECL_SCREEN(JerkScreen), +#endif +#if ENABLED(CASE_LIGHT_ENABLE) + DECL_SCREEN(CaseLightScreen), +#endif +#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + DECL_SCREEN(FilamentMenu), +#endif +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + DECL_SCREEN(FilamentRunoutScreen), +#endif +#if ENABLED(LIN_ADVANCE) + DECL_SCREEN(LinearAdvanceScreen), +#endif + DECL_SCREEN(TemperatureScreen), + DECL_SCREEN(ChangeFilamentScreen), + DECL_SCREEN(InterfaceSettingsScreen), + DECL_SCREEN(InterfaceSoundsScreen), + DECL_SCREEN(LockScreen), +#if ENABLED(SDSUPPORT) + DECL_SCREEN(FilesScreen), +#endif + DECL_SCREEN(EndstopStatesScreen), +#if ENABLED(TOUCH_UI_LULZBOT_BIO) + DECL_SCREEN(BioPrintingDialogBox), + DECL_SCREEN(BioConfirmHomeXYZ), + DECL_SCREEN(BioConfirmHomeE), +#endif +#if ENABLED(TOUCH_UI_COCOA_PRESS) + DECL_SCREEN(PreheatMenu), + DECL_SCREEN(PreheatTimerScreen), +#endif +#if ENABLED(TOUCH_UI_DEVELOPER_MENU) + DECL_SCREEN(DeveloperMenu), + DECL_SCREEN(ConfirmEraseFlashDialogBox), + DECL_SCREEN(WidgetsScreen), + DECL_SCREEN(TouchRegistersScreen), + DECL_SCREEN(StressTestScreen), +#endif + DECL_SCREEN(MediaPlayerScreen), + DECL_SCREEN(DisplayTuningScreen) +}; + +SCREEN_TABLE_POST + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..2108cff8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -0,0 +1,851 @@ +/************* + * screens.h * + *************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#include "../ftdi_eve_lib/ftdi_eve_lib.h" +#include "../language/language.h" +#include "../theme/theme.h" +#include "string_format.h" + +#ifndef BED_LEVELING_COMMANDS + #define BED_LEVELING_COMMANDS "G29" +#endif + +extern tiny_timer_t refresh_timer; + +/********************************* DL CACHE SLOTS ******************************/ + +// In order to reduce SPI traffic, we cache display lists (DL) in RAMG. This +// is done using the CLCD::DLCache class, which takes a unique ID for each +// cache location. These IDs are defined here: + +enum { + STATUS_SCREEN_CACHE, + MENU_SCREEN_CACHE, + TUNE_SCREEN_CACHE, + ALERT_BOX_CACHE, + SPINNER_CACHE, + ADVANCED_SETTINGS_SCREEN_CACHE, + MOVE_AXIS_SCREEN_CACHE, + TEMPERATURE_SCREEN_CACHE, + STEPS_SCREEN_CACHE, + MAX_FEEDRATE_SCREEN_CACHE, + MAX_VELOCITY_SCREEN_CACHE, + MAX_ACCELERATION_SCREEN_CACHE, + DEFAULT_ACCELERATION_SCREEN_CACHE, +#if HAS_LEVELING + LEVELING_SCREEN_CACHE, + #if HAS_BED_PROBE + ZOFFSET_SCREEN_CACHE, + #endif + #if HAS_MESH + BED_MESH_SCREEN_CACHE, + #endif +#endif +#if ENABLED(BABYSTEPPING) + ADJUST_OFFSETS_SCREEN_CACHE, +#endif +#if HAS_TRINAMIC_CONFIG + STEPPER_CURRENT_SCREEN_CACHE, + STEPPER_BUMP_SENSITIVITY_SCREEN_CACHE, +#endif +#if HAS_MULTI_HOTEND + NOZZLE_OFFSET_SCREEN_CACHE, +#endif +#if ENABLED(BACKLASH_GCODE) + BACKLASH_COMPENSATION_SCREEN_CACHE, +#endif +#if HAS_JUNCTION_DEVIATION + JUNC_DEV_SCREEN_CACHE, +#else + JERK_SCREEN_CACHE, +#endif +#if ENABLED(CASE_LIGHT_ENABLE) + CASE_LIGHT_SCREEN_CACHE, +#endif +#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + FILAMENT_MENU_CACHE, +#endif +#if ENABLED(LIN_ADVANCE) + LINEAR_ADVANCE_SCREEN_CACHE, +#endif +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + FILAMENT_RUNOUT_SCREEN_CACHE, +#endif +#if ENABLED(TOUCH_UI_LULZBOT_BIO) + PRINTING_SCREEN_CACHE, +#endif +#if ENABLED(TOUCH_UI_COCOA_PRESS) + PREHEAT_MENU_CACHE, + PREHEAT_TIMER_SCREEN_CACHE, +#endif +#if ENABLED(SDSUPPORT) + FILES_SCREEN_CACHE, +#endif + CHANGE_FILAMENT_SCREEN_CACHE, + INTERFACE_SETTINGS_SCREEN_CACHE, + INTERFACE_SOUNDS_SCREEN_CACHE, + LOCK_SCREEN_CACHE, + DISPLAY_TIMINGS_SCREEN_CACHE +}; + +// To save MCU RAM, the status message is "baked" in to the status screen +// cache, so we reserve a large chunk of memory for the DL cache + +#define STATUS_SCREEN_DL_SIZE 2048 +#define ALERT_BOX_DL_SIZE 3072 +#define SPINNER_DL_SIZE 3072 +#define FILE_SCREEN_DL_SIZE 4160 +#define PRINTING_SCREEN_DL_SIZE 2048 + +/************************* MENU SCREEN DECLARATIONS *************************/ + +class BaseScreen : public UIScreen { + protected: + #if LCD_TIMEOUT_TO_STATUS > 0 + static uint32_t last_interaction; + #endif + + static bool buttonIsPressed(uint8_t tag); + + public: + static bool buttonStyleCallback(CommandProcessor &, uint8_t, uint8_t &, uint16_t &, bool); + + static void reset_menu_timeout(); + + static void onEntry(); + static void onIdle(); +}; + +class BootScreen : public BaseScreen, public UncachedScreen { + private: + static void showSplashScreen(); + public: + static void onRedraw(draw_mode_t); + static void onIdle(); +}; + +class AboutScreen : public BaseScreen, public UncachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +#if ENABLED(PRINTCOUNTER) + class StatisticsScreen : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; +#endif + +class KillScreen { + // The KillScreen is behaves differently than the + // others, so we do not bother extending UIScreen. + public: + static void show(const char*); +}; + +class DialogBoxBaseClass : public BaseScreen { + protected: + template static void drawMessage(const T, int16_t font = 0); + static void drawYesNoButtons(uint8_t default_btn = 0); + static void drawOkayButton(); + static void drawSpinner(); + static void drawButton(const progmem_str); + + static void onRedraw(draw_mode_t) {}; + public: + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; + +class AlertDialogBox : public DialogBoxBaseClass, public CachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + template static void show(T); + template static void showError(T); + static void hide(); +}; + +class RestoreFailsafeDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +class SaveSettingsDialogBox : public DialogBoxBaseClass, public UncachedScreen { + private: + static bool needs_save; + + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + + static void promptToSaveSettings(); + static void settingsChanged() {needs_save = true;} +}; + +class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { + private: + inline static const char *getShortFilename() {return getFilename(false);} + inline static const char *getLongFilename() {return getFilename(true);} + + static const char *getFilename(bool longName); + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t); + + static void show(uint8_t file_index); +}; + +class ConfirmAbortPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +#if ENABLED(CALIBRATION_GCODE) +class ConfirmAutoCalibrationDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; +#endif + +class ConfirmUserRequestAlertBox : public AlertDialogBox { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t); + static void hide(); + static void show(const char*); +}; + +class SpinnerDialogBox : public DialogBoxBaseClass, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static void onIdle(); + + static void show(const progmem_str); + static void hide(); + static void enqueueAndWait_P(const progmem_str commands); + static void enqueueAndWait_P(const progmem_str message, const progmem_str commands); +}; + +#if NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) +class StatusScreen : public BaseScreen, public CachedScreen { + private: + static void draw_axis_position(draw_mode_t); + static void draw_temperature(draw_mode_t); + static void draw_progress(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + static void draw_status_message(draw_mode_t, const char * const); + + public: + static void loadBitmaps(); + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + static void onRedraw(draw_mode_t); + static void onStartup(); + static void onEntry(); + static void onIdle(); + static bool onTouchEnd(uint8_t tag); +}; +#else + class StatusScreen : public BaseScreen, public CachedScreen { + private: + static float increment; + static bool jog_xy; + static bool fine_motion; + + static void draw_temperature(draw_mode_t what); + static void draw_syringe(draw_mode_t what); + static void draw_arrows(draw_mode_t what); + static void draw_overlay_icons(draw_mode_t what); + static void draw_fine_motion(draw_mode_t what); + static void draw_buttons(draw_mode_t what); + public: + static void loadBitmaps(); + static void unlockMotors(); + + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + + static void onRedraw(draw_mode_t); + + static bool onTouchStart(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); + + }; +#endif + +#if ENABLED(TOUCH_UI_LULZBOT_BIO) + class BioPrintingDialogBox : public BaseScreen, public CachedScreen { + private: + static void draw_status_message(draw_mode_t, const char * const); + static void draw_progress(draw_mode_t); + static void draw_time_remaining(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + public: + static void onRedraw(draw_mode_t); + + static void show(); + + static void setStatusMessage(const char *); + static void setStatusMessage(progmem_str); + + static void onIdle(); + static bool onTouchEnd(uint8_t tag); + }; + + class BioConfirmHomeXYZ : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + class BioConfirmHomeE : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; +#endif + +#if ENABLED(TOUCH_UI_COCOA_PRESS) + class PreheatMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + class PreheatTimerScreen : public BaseScreen, public CachedScreen { + private: + static uint16_t secondsRemaining(); + + static void draw_message(draw_mode_t); + static void draw_time_remaining(draw_mode_t); + static void draw_interaction_buttons(draw_mode_t); + public: + static void onRedraw(draw_mode_t); + + static void onEntry(); + static void onIdle(); + static bool onTouchEnd(uint8_t tag); + }; +#endif + +class MainMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +class TuneMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +class TouchCalibrationScreen : public BaseScreen, public UncachedScreen { + public: + static void onRefresh(); + static void onEntry(); + static void onRedraw(draw_mode_t); + static void onIdle(); +}; + +class TouchRegistersScreen : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +class AdvancedSettingsMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +class ChangeFilamentScreen : public BaseScreen, public CachedScreen { + private: + static uint8_t getSoftenTemp(); + static ExtUI::extruder_t getExtruder(); + static void drawTempGradient(uint16_t x, uint16_t y, uint16_t w, uint16_t h); + static uint32_t getTempColor(uint32_t temp); + static void doPurge(); + public: + static void onEntry(); + static void onExit(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static void onIdle(); +}; + +class BaseNumericAdjustmentScreen : public BaseScreen { + public: + enum precision_default_t { + DEFAULT_LOWEST, + DEFAULT_MIDRANGE, + DEFAULT_HIGHEST + }; + + protected: + class widgets_t { + private: + draw_mode_t _what; + uint8_t _line; + uint32_t _color; + uint8_t _decimals; + progmem_str _units; + enum style_t { + BTN_NORMAL, + BTN_ACTION, + BTN_TOGGLE, + BTN_DISABLED, + TEXT_AREA, + TEXT_LABEL + } _style; + + protected: + void _draw_increment_btn(CommandProcessor &, uint8_t line, const uint8_t tag); + void _button(CommandProcessor &, uint8_t tag, int16_t x, int16_t y, int16_t w, int16_t h, progmem_str, bool enabled = true, bool highlight = false); + void _button_style(CommandProcessor &cmd, style_t style); + public: + widgets_t(draw_mode_t); + + widgets_t &color(uint32_t color) {_color = color; return *this;} + widgets_t &units(progmem_str units) {_units = units; return *this;} + widgets_t &draw_mode(draw_mode_t what) {_what = what; return *this;} + widgets_t &precision(uint8_t decimals, precision_default_t = DEFAULT_HIGHEST); + + void heading (progmem_str label); + void adjuster_sram_val (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); + void adjuster (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); + void adjuster (uint8_t tag, progmem_str label, float value=0, bool is_enabled = true); + void button (uint8_t tag, progmem_str label, bool is_enabled = true); + void text_field (uint8_t tag, progmem_str label, const char *value, bool is_enabled = true); + void two_buttons (uint8_t tag1, progmem_str label1, + uint8_t tag2, progmem_str label2, bool is_enabled = true); + void toggle (uint8_t tag, progmem_str label, bool value, bool is_enabled = true); + void home_buttons (uint8_t tag); + void increments (); + }; + + static float getIncrement(); + + public: + static void onEntry(); + static bool onTouchEnd(uint8_t tag); +}; + +class MoveAxisScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + private: + static float getManualFeedrate(uint8_t axis, float increment_mm); + public: + static void setManualFeedrate(ExtUI::axis_t, float increment_mm); + static void setManualFeedrate(ExtUI::extruder_t, float increment_mm); + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + static void onIdle(); +}; + +class StepsScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +#if HAS_TRINAMIC_CONFIG + class StepperCurrentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; + + class StepperBumpSensitivityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +#if HAS_MULTI_HOTEND + class NozzleOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +#if HAS_LEVELING + class LevelingMenu : public BaseScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + #if HAS_BED_PROBE + class ZOffsetScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; + #endif + + #if HAS_MESH + class BedMeshScreen : public BaseScreen, public CachedScreen { + private: + enum MeshOpts { + USE_POINTS = 0x01, + USE_COLORS = 0x02, + USE_TAGS = 0x04, + USE_HIGHLIGHT = 0x08, + USE_AUTOSCALE = 0x10 + }; + + static uint8_t pointToTag(uint8_t x, uint8_t y); + static bool tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y); + static float getHightlightedValue(); + static void drawHighlightedPointValue(); + static void drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max = 0.1); + static bool isMeshComplete(ExtUI::bed_mesh_t data); + + public: + static void onMeshUpdate(const int8_t x, const int8_t y, const float val); + static void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + + static void startMeshProbe(); + }; + #endif +#endif + +#if ENABLED(BABYSTEPPING) + class NudgeNozzleScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static bool onTouchHeld(uint8_t tag); + static void onIdle(); + }; +#endif + +#if ENABLED(BACKLASH_GCODE) + class BacklashCompensationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +class FeedratePercentScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +class MaxVelocityScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +class MaxAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +class DefaultAccelerationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +#if HAS_JUNCTION_DEVIATION + class JunctionDeviationScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#else + class JerkScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) + class CaseLightScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + class FilamentMenu : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + class FilamentRunoutScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +#if ENABLED(LIN_ADVANCE) + class LinearAdvanceScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); + }; +#endif + +class TemperatureScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +class InterfaceSoundsScreen : public BaseScreen, public CachedScreen { + public: + enum event_t { + PRINTING_STARTED = 0, + PRINTING_FINISHED = 1, + PRINTING_FAILED = 2, + + NUM_EVENTS + }; + + private: + friend class InterfaceSettingsScreen; + + static uint8_t event_sounds[NUM_EVENTS]; + + static const char* getSoundSelection(event_t); + static void toggleSoundSelection(event_t); + static void setSoundSelection(event_t, const FTDI::SoundPlayer::sound_t*); + + public: + static void playEventSound(event_t, FTDI::play_mode_t = FTDI::PLAY_ASYNCHRONOUS); + + static void defaultSettings(); + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; + +class InterfaceSettingsScreen : public BaseScreen, public CachedScreen { + private: + struct persistent_data_t { + uint32_t touch_transform_a; + uint32_t touch_transform_b; + uint32_t touch_transform_c; + uint32_t touch_transform_d; + uint32_t touch_transform_e; + uint32_t touch_transform_f; + uint16_t passcode; + uint8_t display_brightness; + int8_t display_h_offset_adj; + int8_t display_v_offset_adj; + uint8_t sound_volume; + uint8_t bit_flags; + uint8_t event_sounds[InterfaceSoundsScreen::NUM_EVENTS]; + }; + + public: + #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + static bool backupEEPROM(); + #endif + + static void saveSettings(char *); + static void loadSettings(const char *); + static void defaultSettings(); + static void failSafeSettings(); + + static void onStartup(); + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; + +class LockScreen : public BaseScreen, public CachedScreen { + private: + friend InterfaceSettingsScreen; + + static uint16_t passcode; + + static char & message_style(); + static uint16_t compute_checksum(); + static void onPasscodeEntered(); + public: + static bool is_enabled(); + static void check_passcode(); + static void enable(); + static void disable(); + + static void set_hash(uint16_t pass) {passcode = pass;}; + static uint16_t get_hash() {return passcode;}; + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); +}; + +#if ENABLED(SDSUPPORT) + class FilesScreen : public BaseScreen, public CachedScreen { + private: + #ifdef TOUCH_UI_PORTRAIT + static constexpr uint8_t header_h = 2; + static constexpr uint8_t footer_h = 2; + static constexpr uint8_t files_per_page = 11; + #else + static constexpr uint8_t header_h = 1; + static constexpr uint8_t footer_h = 1; + static constexpr uint8_t files_per_page = 6; + #endif + + static uint8_t getTagForLine(uint8_t line) {return line + 2;} + static uint8_t getLineForTag(uint8_t tag) {return tag - 2;} + static uint16_t getFileForTag(uint8_t tag); + static uint16_t getSelectedFileIndex(); + + inline static const char *getSelectedShortFilename() {return getSelectedFilename(false);} + inline static const char *getSelectedLongFilename() {return getSelectedFilename(true);} + static const char *getSelectedFilename(bool longName); + + static void drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted); + static void drawFileList(); + static void drawHeader(); + static void drawFooter(); + static void drawSelectedFile(); + + static void gotoPage(uint8_t); + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); + }; +#endif + +class EndstopStatesScreen : public BaseScreen, public UncachedScreen { + public: + static void onEntry(); + static void onExit(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); +}; + +class DisplayTuningScreen : public BaseNumericAdjustmentScreen, public CachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchHeld(uint8_t tag); +}; + +#if ENABLED(TOUCH_UI_DEVELOPER_MENU) + class DeveloperMenu : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + class ConfirmEraseFlashDialogBox : public DialogBoxBaseClass, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; + + class WidgetsScreen : public BaseScreen, public UncachedScreen { + public: + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); + static void onIdle(); + }; + + class StressTestScreen : public BaseScreen, public UncachedScreen { + private: + static void drawDots(uint16_t x, uint16_t y, uint16_t h, uint16_t v); + static bool watchDogTestNow(); + static void recursiveLockup(); + static void iterativeLockup(); + static void runTestOnBootup(bool enable); + + public: + static void startupCheck(); + + static void onEntry(); + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + static void onIdle(); + }; +#endif + +class MediaPlayerScreen : public BaseScreen, public UncachedScreen { + private: + typedef int16_t media_streamer_func_t(void *obj, void *buff, size_t bytes); + + public: + static bool playCardMedia(); + static bool playBootMedia(); + + static void onEntry(); + static void onRedraw(draw_mode_t); + + static void playStream(void *obj, media_streamer_func_t*); +}; + +#if NUM_LANGUAGES > 1 + class LanguageMenu : public BaseScreen, public UncachedScreen { + public: + static void onRedraw(draw_mode_t); + static bool onTouchEnd(uint8_t tag); + }; +#endif 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 new file mode 100644 index 00000000..de7eb92a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/spinner_dialog_box.cpp @@ -0,0 +1,68 @@ +/************************** + * spinner_dialog_box.cpp * + **************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" +#include "screen_data.h" + +using namespace FTDI; +using namespace ExtUI; + +void SpinnerDialogBox::onRedraw(draw_mode_t) { +} + +void SpinnerDialogBox::show(const progmem_str message) { + drawMessage(message); + drawSpinner(); + storeBackground(); + screen_data.SpinnerDialogBox.auto_hide = false; +} + +void SpinnerDialogBox::hide() { + CommandProcessor cmd; + cmd.stop().execute(); +} + +void SpinnerDialogBox::enqueueAndWait_P(const progmem_str commands) { + enqueueAndWait_P(GET_TEXT_F(MSG_PLEASE_WAIT), commands); +} + +void SpinnerDialogBox::enqueueAndWait_P(const progmem_str message, const progmem_str commands) { + show(message); + GOTO_SCREEN(SpinnerDialogBox); + ExtUI::injectCommands_P((const char*)commands); + screen_data.SpinnerDialogBox.auto_hide = true; +} + +void SpinnerDialogBox::onIdle() { + reset_menu_timeout(); + if (screen_data.SpinnerDialogBox.auto_hide && !commandsInQueue()) { + screen_data.SpinnerDialogBox.auto_hide = false; + hide(); + GOTO_PREVIOUS(); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..cb263248 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/statistics_screen.cpp @@ -0,0 +1,78 @@ +/************************* + * statistics_screen.cpp * + *************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, PRINTCOUNTER) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +#define GRID_COLS 4 +#define GRID_ROWS 7 + +void StatisticsScreen::onRedraw(draw_mode_t what) { + CommandProcessor cmd; + + if (what & BACKGROUND) { + char buffer[21]; + + cmd.cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0) + + .font(Theme::font_medium) + .text(BTN_POS(1,1), BTN_SIZE(4,1), GET_TEXT_F(MSG_INFO_STATS_MENU)) + .font(Theme::font_small) + .tag(0) + .text(BTN_POS(1,2), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_COUNT), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,3), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_COMPLETED_PRINTS), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,4), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_TIME), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_LONGEST), OPT_RIGHTX | OPT_CENTERY) + .text(BTN_POS(1,6), BTN_SIZE(2,1), GET_TEXT_F(MSG_INFO_PRINT_FILAMENT), OPT_RIGHTX | OPT_CENTERY); + // Don't chain the following, it causes strange issues with evaluation ordering! + cmd.text(BTN_POS(3,2), BTN_SIZE(2,1), getTotalPrints_str(buffer)); + cmd.text(BTN_POS(3,3), BTN_SIZE(2,1), getFinishedPrints_str(buffer)); + cmd.text(BTN_POS(3,4), BTN_SIZE(2,1), getTotalPrintTime_str(buffer)); + cmd.text(BTN_POS(3,5), BTN_SIZE(2,1), getLongestPrint_str(buffer)); + cmd.text(BTN_POS(3,6), BTN_SIZE(2,1), getFilamentUsed_str(buffer)); + } + + if (what & FOREGROUND) { + cmd.font(Theme::font_medium) + .colors(action_btn) + .tag(1).button(BTN_POS(1,7), BTN_SIZE(4,1), GET_TEXT_F(MSG_BACK)); + } +} + +bool StatisticsScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); return true; + default: return false; + } +} + +#endif // TOUCH_UI_FTDI_EVE && PRINTCOUNTER 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 new file mode 100644 index 00000000..fc7453fc --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/status_screen.cpp @@ -0,0 +1,408 @@ +/********************* + * status_screen.cpp * + *********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && NONE(TOUCH_UI_LULZBOT_BIO, TOUCH_UI_COCOA_PRESS) + +#include "screens.h" +#include "screen_data.h" + +#include "../archim2-flash/flash_storage.h" + +using namespace FTDI; +using namespace Theme; + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 8 +#else + #define GRID_ROWS 8 +#endif + +void StatusScreen::draw_axis_position(draw_mode_t what) { + CommandProcessor cmd; + + #define GRID_COLS 3 + + #ifdef TOUCH_UI_PORTRAIT + #define X_LBL_POS BTN_POS(1,5), BTN_SIZE(1,1) + #define Y_LBL_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define Z_LBL_POS BTN_POS(1,7), BTN_SIZE(1,1) + #define X_VAL_POS BTN_POS(2,5), BTN_SIZE(2,1) + #define Y_VAL_POS BTN_POS(2,6), BTN_SIZE(2,1) + #define Z_VAL_POS BTN_POS(2,7), BTN_SIZE(2,1) + #else + #define X_LBL_POS BTN_POS(1,5), BTN_SIZE(1,1) + #define Y_LBL_POS BTN_POS(2,5), BTN_SIZE(1,1) + #define Z_LBL_POS BTN_POS(3,5), BTN_SIZE(1,1) + #define X_VAL_POS BTN_POS(1,6), BTN_SIZE(1,1) + #define Y_VAL_POS BTN_POS(2,6), BTN_SIZE(1,1) + #define Z_VAL_POS BTN_POS(3,6), BTN_SIZE(1,1) + #endif + + #define _UNION_POS(x1,y1,w1,h1,x2,y2,w2,h2) x1,y1,max(x1+w1,x2+w2)-x1,max(y1+h1,y2+h2)-y1 + #define UNION_POS(p1, p2) _UNION_POS(p1, p2) + + if (what & BACKGROUND) { + cmd.tag(6) + .fgcolor(Theme::axis_label) + .font(Theme::font_large) + .button( UNION_POS(X_LBL_POS, X_VAL_POS), F(""), OPT_FLAT) + .button( UNION_POS(Y_LBL_POS, Y_VAL_POS), F(""), OPT_FLAT) + .button( UNION_POS(Z_LBL_POS, Z_VAL_POS), F(""), OPT_FLAT) + .font(Theme::font_medium) + .fgcolor(Theme::x_axis) .button( X_VAL_POS, F(""), OPT_FLAT) + .fgcolor(Theme::y_axis) .button( Y_VAL_POS, F(""), OPT_FLAT) + .fgcolor(Theme::z_axis) .button( Z_VAL_POS, F(""), OPT_FLAT) + .font(Theme::font_small) + .text ( X_LBL_POS, GET_TEXT_F(MSG_AXIS_X)) + .text ( Y_LBL_POS, GET_TEXT_F(MSG_AXIS_Y)) + .text ( Z_LBL_POS, GET_TEXT_F(MSG_AXIS_Z)) + .colors(normal_btn); + } + + if (what & FOREGROUND) { + using namespace ExtUI; + char x_str[15]; + char y_str[15]; + char z_str[15]; + + if (isAxisPositionKnown(X)) + format_position(x_str, getAxisPosition_mm(X)); + else + strcpy_P(x_str, PSTR("?")); + + if (isAxisPositionKnown(Y)) + format_position(y_str, getAxisPosition_mm(Y)); + else + strcpy_P(y_str, PSTR("?")); + + if (isAxisPositionKnown(Z)) + format_position(z_str, getAxisPosition_mm(Z), 2); + else + strcpy_P(z_str, PSTR("?")); + + cmd.tag(6) + .font(Theme::font_medium) + .text ( X_VAL_POS, x_str) + .text ( Y_VAL_POS, y_str) + .text ( Z_VAL_POS, z_str); + } + + #undef GRID_COLS +} + +#ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 8 +#else + #define GRID_COLS 12 +#endif + +void StatusScreen::draw_temperature(draw_mode_t what) { + using namespace Theme; + + #define TEMP_RECT_1 BTN_POS(1,1), BTN_SIZE(4,2) + #define TEMP_RECT_2 BTN_POS(1,1), BTN_SIZE(8,1) + #define NOZ_1_POS BTN_POS(1,1), BTN_SIZE(4,1) + #define NOZ_2_POS BTN_POS(5,1), BTN_SIZE(4,1) + #define BED_POS BTN_POS(1,2), BTN_SIZE(4,1) + #define FAN_POS BTN_POS(5,2), BTN_SIZE(4,1) + + #define _ICON_POS(x,y,w,h) x, y, w/4, h + #define _TEXT_POS(x,y,w,h) x + w/4, y, w - w/4, h + #define ICON_POS(pos) _ICON_POS(pos) + #define TEXT_POS(pos) _TEXT_POS(pos) + + CommandProcessor cmd; + + if (what & BACKGROUND) { + cmd.font(Theme::font_small) + .tag(5) + .fgcolor(temp) .button( TEMP_RECT_1, F(""), OPT_FLAT) + .button( TEMP_RECT_2, F(""), OPT_FLAT) + .fgcolor(fan_speed).button( FAN_POS, F(""), OPT_FLAT) + .tag(0); + + // Draw Extruder Bitmap on Extruder Temperature Button + + cmd.tag(5) + .cmd (BITMAP_SOURCE(Extruder_Icon_Info)) + .cmd (BITMAP_LAYOUT(Extruder_Icon_Info)) + .cmd (BITMAP_SIZE (Extruder_Icon_Info)) + .icon(ICON_POS(NOZ_1_POS), Extruder_Icon_Info, icon_scale) + .icon(ICON_POS(NOZ_2_POS), Extruder_Icon_Info, icon_scale); + + // Draw Bed Heat Bitmap on Bed Heat Button + cmd.cmd (BITMAP_SOURCE(Bed_Heat_Icon_Info)) + .cmd (BITMAP_LAYOUT(Bed_Heat_Icon_Info)) + .cmd (BITMAP_SIZE (Bed_Heat_Icon_Info)) + .icon(ICON_POS(BED_POS), Bed_Heat_Icon_Info, icon_scale); + + // Draw Fan Percent Bitmap on Bed Heat Button + + cmd.cmd (BITMAP_SOURCE(Fan_Icon_Info)) + .cmd (BITMAP_LAYOUT(Fan_Icon_Info)) + .cmd (BITMAP_SIZE (Fan_Icon_Info)) + .icon(ICON_POS(FAN_POS), Fan_Icon_Info, icon_scale); + + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_bitmaps(cmd); // Restore font bitmap handles + #endif + } + + if (what & FOREGROUND) { + using namespace ExtUI; + char e0_str[20]; + char e1_str[20]; + char bed_str[20]; + char fan_str[20]; + + sprintf_P(fan_str, PSTR("%-3d %%"), int8_t(getActualFan_percent(FAN0))); + + if (isHeaterIdle(BED)) + format_temp_and_idle(bed_str, getActualTemp_celsius(BED)); + else + format_temp_and_temp(bed_str, getActualTemp_celsius(BED), getTargetTemp_celsius(BED)); + + if (isHeaterIdle(H0)) + format_temp_and_idle(e0_str, getActualTemp_celsius(H0)); + else + format_temp_and_temp(e0_str, getActualTemp_celsius(H0), getTargetTemp_celsius(H0)); + + + #if HAS_MULTI_EXTRUDER + if (isHeaterIdle(H1)) + format_temp_and_idle(e1_str, getActualTemp_celsius(H1)); + else + format_temp_and_temp(e1_str, getActualTemp_celsius(H1), getTargetTemp_celsius(H1)); + #else + strcpy_P(e1_str, PSTR("-")); + #endif + + cmd.tag(5) + .font(font_medium) + .text(TEXT_POS(NOZ_1_POS), e0_str) + .text(TEXT_POS(NOZ_2_POS), e1_str) + .text(TEXT_POS(BED_POS), bed_str) + .text(TEXT_POS(FAN_POS), fan_str); + } +} + +void StatusScreen::draw_progress(draw_mode_t what) { + using namespace ExtUI; + using namespace Theme; + + CommandProcessor cmd; + + #if ENABLED(TOUCH_UI_PORTRAIT) + #define TIME_POS BTN_POS(1,3), BTN_SIZE(4,1) + #define PROGRESS_POS BTN_POS(5,3), BTN_SIZE(4,1) + #else + #define TIME_POS BTN_POS(9,1), BTN_SIZE(4,1) + #define PROGRESS_POS BTN_POS(9,2), BTN_SIZE(4,1) + #endif + + if (what & BACKGROUND) { + cmd.tag(0).font(font_medium) + .fgcolor(progress).button(TIME_POS, F(""), OPT_FLAT) + .button(PROGRESS_POS, F(""), OPT_FLAT); + } + + if (what & FOREGROUND) { + const uint32_t elapsed = getProgress_seconds_elapsed(); + const uint8_t hrs = elapsed/3600; + const uint8_t min = (elapsed/60)%60; + + char time_str[10]; + char progress_str[10]; + + sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min); + sprintf_P(progress_str, PSTR("%-3d %%"), getProgress_percent() ); + + cmd.font(font_medium) + .tag(7).text(TIME_POS, time_str) + .text(PROGRESS_POS, progress_str); + } +} + +#undef GRID_COLS + + +void StatusScreen::draw_interaction_buttons(draw_mode_t what) { + #define GRID_COLS 4 + if (what & FOREGROUND) { + using namespace ExtUI; + + #if ENABLED(TOUCH_UI_PORTRAIT) + #define MEDIA_BTN_POS BTN_POS(1,8), BTN_SIZE(2,1) + #define MENU_BTN_POS BTN_POS(3,8), BTN_SIZE(2,1) + #else + #define MEDIA_BTN_POS BTN_POS(1,7), BTN_SIZE(2,2) + #define MENU_BTN_POS BTN_POS(3,7), BTN_SIZE(2,2) + #endif + + const bool has_media = isMediaInserted() && !isPrintingFromMedia(); + + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(Theme::font_medium) + .colors(has_media ? action_btn : normal_btn) + .enabled(has_media) + .tag(3).button(MEDIA_BTN_POS, isPrintingFromMedia() ? GET_TEXT_F(MSG_PRINTING) : GET_TEXT_F(MSG_BUTTON_MEDIA)) + .colors(!has_media ? action_btn : normal_btn) + .tag(4).button( MENU_BTN_POS, GET_TEXT_F(MSG_BUTTON_MENU)); + } + #undef GRID_COLS +} + +void StatusScreen::draw_status_message(draw_mode_t what, const char* message) { + #define GRID_COLS 1 + + #if ENABLED(TOUCH_UI_PORTRAIT) + #define STATUS_POS BTN_POS(1,4), BTN_SIZE(1,1) + #else + #define STATUS_POS BTN_POS(1,3), BTN_SIZE(1,2) + #endif + + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.fgcolor(Theme::status_msg) + .tag(0) + .button( STATUS_POS, F(""), OPT_FLAT); + + draw_text_box(cmd, STATUS_POS, message, OPT_CENTER, font_large); + } + #undef GRID_COLS +} + +void StatusScreen::setStatusMessage(progmem_str message) { + char buff[strlen_P((const char * const)message)+1]; + strcpy_P(buff, (const char * const) message); + setStatusMessage((const char *) buff); +} + +void StatusScreen::setStatusMessage(const char* message) { + CommandProcessor cmd; + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(Theme::bg_color)) + .cmd(CLEAR(true,true,true)); + + draw_temperature(BACKGROUND); + draw_status_message(BACKGROUND, message); + draw_interaction_buttons(BACKGROUND); + draw_progress(BACKGROUND); + draw_axis_position(BACKGROUND); + + storeBackground(); + + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("New status message: ", message); + #endif + + if (AT_SCREEN(StatusScreen)) { + current_screen.onRefresh(); + } +} + +void StatusScreen::loadBitmaps() { + // Load the bitmaps for the status screen + using namespace Theme; + constexpr uint32_t base = ftdi_memory_map::RAM_G; + CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon)); + CLCD::mem_write_pgm(base + Extruder_Icon_Info.RAMG_offset, Extruder_Icon, sizeof(Extruder_Icon)); + CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); + CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon)); + + // Load fonts for internationalization + #ifdef TOUCH_UI_USE_UTF8 + load_utf8_data(base + UTF8_FONT_OFFSET); + #endif +} + +void StatusScreen::onStartup() { + UIFlashStorage::initialize(); +} + +void StatusScreen::onRedraw(draw_mode_t what) { + if (what & FOREGROUND) { + draw_temperature(FOREGROUND); + draw_progress(FOREGROUND); + draw_axis_position(FOREGROUND); + draw_interaction_buttons(FOREGROUND); + } +} + +void StatusScreen::onEntry() { + BaseScreen::onEntry(); + onRefresh(); +} + +void StatusScreen::onIdle() { + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} + +bool StatusScreen::onTouchEnd(uint8_t tag) { + using namespace ExtUI; + + switch (tag) { + #if ENABLED(SDSUPPORT) + case 3: GOTO_SCREEN(FilesScreen); break; + #endif + case 4: + if (isPrinting()) { + GOTO_SCREEN(TuneMenu); + } + else { + GOTO_SCREEN(MainMenu); + } + break; + case 5: GOTO_SCREEN(TemperatureScreen); break; + case 6: + if (isPrinting()) { + #if ENABLED(BABYSTEPPING) + GOTO_SCREEN(NudgeNozzleScreen); + #elif HAS_BED_PROBE + GOTO_SCREEN(ZOffsetScreen); + #else + return false; + #endif + } + else { + GOTO_SCREEN(MoveAxisScreen); + } + break; + case 7: GOTO_SCREEN(FeedratePercentScreen); break; + default: + return true; + } + // If a passcode is enabled, the LockScreen will prevent the + // user from proceeding. + LockScreen::check_passcode(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..693d125f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_bump_sensitivity_screen.cpp @@ -0,0 +1,59 @@ +/************************************** + * stepper_bump_sensiivity_screen.cpp * + **************************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_TRINAMIC_CONFIG) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void StepperBumpSensitivityScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0, BaseNumericAdjustmentScreen::DEFAULT_LOWEST); + w.heading( GET_TEXT_F(MSG_TMC_HOMING_THRS)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getTMCBumpSensitivity(X), ENABLED(X_SENSORLESS)); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getTMCBumpSensitivity(Y), ENABLED(Y_SENSORLESS)); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getTMCBumpSensitivity(Z), ENABLED(Z_SENSORLESS)); + w.increments(); +} + +bool StepperBumpSensitivityScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + 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; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE && HAS_TRINAMIC_CONFIG 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 new file mode 100644 index 00000000..136582f0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stepper_current_screen.cpp @@ -0,0 +1,127 @@ +/****************************** + * stepper_current_screen.cpp * + ******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_TRINAMIC_CONFIG) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void StepperCurrentScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0); + w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP)); + w.heading( GET_TEXT_F(MSG_TMC_CURRENT)); + #if AXIS_IS_TMC(X) + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); + #endif + #if AXIS_IS_TMC(X2) + w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) ); + #endif + #if AXIS_IS_TMC(Y) + w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); + #endif + #if AXIS_IS_TMC(Y2) + w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) ); + #endif + #if AXIS_IS_TMC(Z) + w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); + #endif + #if AXIS_IS_TMC(Z2) + w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) ); + #endif + #if AXIS_IS_TMC(E0) + w.color(e_axis) .adjuster(14, GET_TEXT_F( + #if EXTRUDERS == 1 + MSG_AXIS_E + #else + MSG_AXIS_E1 + #endif + ), getAxisCurrent_mA(E0) ); + #endif + #if AXIS_IS_TMC(E1) + w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); + #endif + #if AXIS_IS_TMC(E2) + w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); + #endif + #if AXIS_IS_TMC(E3) + w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); + #endif + w.increments(); +} + +bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + #if AXIS_IS_TMC(X) + case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; + case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; + #endif + #if AXIS_IS_TMC(X2) + case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break; + case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break; + #endif + #if AXIS_IS_TMC(Y) + case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break; + case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break; + #endif + #if AXIS_IS_TMC(Y2) + case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break; + case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break; + #endif + #if AXIS_IS_TMC(Z) + case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break; + case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break; + #endif + #if AXIS_IS_TMC(Z2) + case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break; + case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break; + #endif + #if AXIS_IS_TMC(E0) + case 14: UI_DECREMENT(AxisCurrent_mA, E0); break; + case 15: UI_INCREMENT(AxisCurrent_mA, E0); break; + #endif + #if AXIS_IS_TMC(E1) + case 16: UI_DECREMENT(AxisCurrent_mA, E1); break; + case 17: UI_INCREMENT(AxisCurrent_mA, E1); break; + #endif + #if AXIS_IS_TMC(E2) + case 18: UI_DECREMENT(AxisCurrent_mA, E2); break; + case 19: UI_INCREMENT(AxisCurrent_mA, E2); break; + #endif + #if AXIS_IS_TMC(E3) + case 20: UI_DECREMENT(AxisCurrent_mA, E3); break; + case 21: UI_INCREMENT(AxisCurrent_mA, E3); break; + #endif + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..92035d1b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/steps_screen.cpp @@ -0,0 +1,86 @@ +/******************** + * steps_screen.cpp * + ********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void StepsScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(0); + w.units(GET_TEXT_F(MSG_UNITS_STEP_MM)); + w.heading( GET_TEXT_F(MSG_STEPS_PER_MM)); + w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisSteps_per_mm(X) ); + w.color(y_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_Y), getAxisSteps_per_mm(Y) ); + w.color(z_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Z), getAxisSteps_per_mm(Z) ); + #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS) + w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E), getAxisSteps_per_mm(E0) ); + #elif HAS_MULTI_EXTRUDER + w.color(e_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), getAxisSteps_per_mm(E0) ); + w.color(e_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_E2), getAxisSteps_per_mm(E1) ); + #if EXTRUDERS > 2 + w.color(e_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_E3), getAxisSteps_per_mm(E2) ); + #endif + #if EXTRUDERS > 3 + w.color(e_axis) .adjuster(14, GET_TEXT_F(MSG_AXIS_E4), getAxisSteps_per_mm(E3) ); + #endif + #endif + w.increments(); +} + +bool StepsScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 2: UI_DECREMENT(AxisSteps_per_mm, X); break; + case 3: UI_INCREMENT(AxisSteps_per_mm, X); break; + case 4: UI_DECREMENT(AxisSteps_per_mm, Y); break; + case 5: UI_INCREMENT(AxisSteps_per_mm, Y); break; + case 6: UI_DECREMENT(AxisSteps_per_mm, Z); break; + case 7: UI_INCREMENT(AxisSteps_per_mm, Z); break; + case 8: UI_DECREMENT(AxisSteps_per_mm, E0); break; + case 9: UI_INCREMENT(AxisSteps_per_mm, E0); break; + #if HAS_MULTI_EXTRUDER + case 10: UI_DECREMENT(AxisSteps_per_mm, E1); break; + case 11: UI_INCREMENT(AxisSteps_per_mm, E1); break; + #endif + #if EXTRUDERS > 2 + case 12: UI_DECREMENT(AxisSteps_per_mm, E2); break; + case 13: UI_INCREMENT(AxisSteps_per_mm, E2); break; + #endif + #if EXTRUDERS > 3 + case 14: UI_DECREMENT(AxisSteps_per_mm, E3); break; + case 15: UI_INCREMENT(AxisSteps_per_mm, E3); break; + #endif + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..44ee453f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/stress_test_screen.cpp @@ -0,0 +1,150 @@ +/************************** + * stress_test_screen.cpp * + **************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) + +#include "screens.h" +#include "screen_data.h" + +#define STRESS_TEST_CHANGE_INTERVAL 6000 + +#define GRID_COLS 4 +#define GRID_ROWS 9 + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void StressTestScreen::drawDots(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { + CommandProcessor cmd; + for (uint8_t i = 0; i < 100; i++) { + cmd.cmd(BEGIN(POINTS)) + .cmd(POINT_SIZE(20*16)) + .cmd(COLOR_RGB(random(0xFFFFFF))) + .cmd(VERTEX2F((x + random(w)) * 16,(y + random(h)) * 16)); + } +} + +bool StressTestScreen::watchDogTestNow() { + return screen_data.StressTestScreen.next_watchdog_trigger && + ELAPSED(millis(), screen_data.StressTestScreen.next_watchdog_trigger); +} + +void StressTestScreen::onRedraw(draw_mode_t) { + using namespace ExtUI; + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .font(font_medium) + .text(BTN_POS(1,1), BTN_SIZE(4,1), progmem_str(screen_data.StressTestScreen.message)); + + drawDots(BTN_POS(1,3), BTN_SIZE(4,4)); + + cmd.font(font_medium).enabled(!watchDogTestNow()).colors(action_btn).tag(1).button(BTN_POS(2,8), BTN_SIZE(2,1), F("Exit")); +} + +bool StressTestScreen::onTouchEnd(uint8_t tag) { + CommandProcessor cmd; + switch (tag) { + case 1: + runTestOnBootup(false); + GOTO_SCREEN(StatusScreen); + break; + default: + return false; + } + return true; +} + +void StressTestScreen::runTestOnBootup(bool enable) { + // Use a magic value in passcode to indicate + // whether or not we need to re-run the test + // at startup. + LockScreen::set_hash(enable ? 0xDEAD : 0); + injectCommands_P(PSTR("M500")); +} + +void StressTestScreen::startupCheck() { + if (LockScreen::get_hash() == 0xDEAD) + GOTO_SCREEN(StressTestScreen); +} + +void StressTestScreen::onEntry() { + screen_data.StressTestScreen.next_watchdog_trigger = millis() + 10000 + random(40000); + screen_data.StressTestScreen.message = PSTR("Test 1: Stress testing..."); + + // Turn off heaters. + setTargetTemp_celsius(0, E0); + setTargetTemp_celsius(0, E1); + setTargetTemp_celsius(0, BED); + + runTestOnBootup(true); +} + +void StressTestScreen::recursiveLockup() { + screen_data.StressTestScreen.message = PSTR("Test 2: Printer will restart."); + current_screen.onRefresh(); + recursiveLockup(); +} + +void StressTestScreen::iterativeLockup() { + screen_data.StressTestScreen.message = PSTR("Test 3: Printer will restart."); + for (;;) current_screen.onRefresh(); +} + +void StressTestScreen::onIdle() { + current_screen.onRefresh(); + 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" + TERN_(HAS_MULTI_EXTRUDER, "\nT1\nG4 S1") + "\nG0 X150 Y150 Z150" + )); + } + } + + if (refresh_timer.elapsed(STRESS_TEST_CHANGE_INTERVAL)) { + setTargetFan_percent(random(100),FAN0); + } + + if (watchDogTestNow()) { + if (random(2) % 2) + iterativeLockup(); + else + recursiveLockup(); + } + + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..b7ce76ec --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.cpp @@ -0,0 +1,83 @@ +/********************* + * string_format.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +#define ROUND(val) uint16_t((val)+0.5) + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wno-format" + +/** + * Formats a temperature string (e.g. "100°C") + */ +void format_temp(char *str, float t1) { + sprintf_P(str, PSTR("%3d" S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C)); +} + +/** + * Formats a temperature string for an idle heater (e.g. "100 °C / idle") + */ +void format_temp_and_idle(char *str, float t1) { + sprintf_P(str, PSTR("%3d" S_FMT " / " S_FMT), ROUND(t1), GET_TEXT(MSG_UNITS_C), GET_TEXT(MSG_IDLE)); +} + +/** + * Formats a temperature string for an active heater (e.g. "100 / 200°C") + */ +void format_temp_and_temp(char *str, float t1, float t2) { + sprintf_P(str, PSTR("%3d / %3d" S_FMT), ROUND(t1), ROUND(t2), GET_TEXT(MSG_UNITS_C)); +} + +/** + * Formats a temperature string for a material (e.g. "100°C (PLA)") + */ +void format_temp_and_material(char *str, float t1, const char *material) { + sprintf_P(str, PSTR("%3d" S_FMT " (" S_FMT ")"), ROUND(t1), GET_TEXT(MSG_UNITS_C), material); +} + +/** + * Formats a position value (e.g. "10 mm") + */ +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)); +} + +/** + * Formats a position vector (e.g. "10; 20; 30 mm") + */ +void format_position(char *str, float x, float y, float z) { + char num1[7], num2[7], num3[7]; + dtostrf(x, 4, 2, num1); + dtostrf(y, 4, 2, num2); + dtostrf(z, 4, 2, num3); + sprintf_P(str, PSTR("%s; %s; %s " S_FMT), num1, num2, num3, GET_TEXT(MSG_UNITS_MM)); +} + +#pragma GCC diagnostic pop + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..e37a82d2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/string_format.h @@ -0,0 +1,29 @@ +/******************* + * string_format.h * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +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, uint8_t decimals = 1); +void format_position(char *str, float x, float y, float z); 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 new file mode 100644 index 00000000..c254d299 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/temperature_screen.cpp @@ -0,0 +1,112 @@ +/******************* + * boot_screen.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; +using namespace ExtUI; + +void TemperatureScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + #if TOUCH_UI_LCD_TEMP_SCALING == 10 + w.precision(1) + #else + w.precision(0, getTargetTemp_celsius(E0) == 0 ? DEFAULT_HIGHEST : DEFAULT_MIDRANGE) + #endif + .color(temp).units(GET_TEXT_F(MSG_UNITS_C)); + w.heading(GET_TEXT_F(MSG_TEMPERATURE)); + w.button(30, GET_TEXT_F(MSG_COOLDOWN)); + #ifndef NO_TOOLHEAD_HEATER_GCODE + #if HOTENDS == 1 + w.adjuster( 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0)); + #else + w.adjuster( 2, F(LCD_STR_E0), getTargetTemp_celsius(E0)); + w.adjuster( 4, F(LCD_STR_E1), getTargetTemp_celsius(E1)); + #if HOTENDS > 2 + w.adjuster( 6, F(LCD_STR_E2), getTargetTemp_celsius(E2)); + #endif + #if HOTENDS > 3 + w.adjuster( 8, F(LCD_STR_E3), getTargetTemp_celsius(E3)); + #endif + #endif + #endif + #if HAS_HEATED_BED + w.adjuster( 20, GET_TEXT_F(MSG_BED), getTargetTemp_celsius(BED)); + #endif + #if HAS_HEATED_CHAMBER + w.adjuster( 22, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER)); + #endif + #if HAS_FAN + w.color(fan_speed).units(GET_TEXT_F(MSG_UNITS_PERCENT)); + w.adjuster( 10, GET_TEXT_F(MSG_FAN_SPEED), getTargetFan_percent(FAN0)); + #endif + w.increments(); +} + +bool TemperatureScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 20: UI_DECREMENT(TargetTemp_celsius, BED); break; + case 21: UI_INCREMENT(TargetTemp_celsius, BED); break; + case 22: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; + case 23: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; + #ifndef NO_TOOLHEAD_HEATER_GCODE + case 2: UI_DECREMENT(TargetTemp_celsius, E0); break; + case 3: UI_INCREMENT(TargetTemp_celsius, E0); break; + #endif + #if HAS_MULTI_HOTEND + case 4: UI_DECREMENT(TargetTemp_celsius, E1); break; + case 5: UI_INCREMENT(TargetTemp_celsius, E1); break; + #endif + #if HOTENDS > 2 + case 6: UI_DECREMENT(TargetTemp_celsius, E2); break; + case 7: UI_INCREMENT(TargetTemp_celsius, E2); break; + #endif + #if HOTENDS > 3 + case 8: UI_DECREMENT(TargetTemp_celsius, E3); break; + case 9: UI_INCREMENT(TargetTemp_celsius, E3); break; + #endif + #if HAS_FAN + case 10: UI_DECREMENT(TargetFan_percent, FAN0); break; + case 11: UI_INCREMENT(TargetFan_percent, FAN0); break; + #endif + case 30: + #define _HOTEND_OFF(N) setTargetTemp_celsius(0,E##N); + REPEAT(HOTENDS, _HOTEND_OFF); + TERN_(HAS_HEATED_BED, setTargetTemp_celsius(0,BED)); + TERN_(HAS_HEATED_CHAMBER, setTargetTemp_celsius(0,CHAMBER)); + #if HAS_FAN + setTargetFan_percent(0,FAN0); + #endif + break; + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..43644502 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_calibration_screen.cpp @@ -0,0 +1,91 @@ +/******************************** + * touch_calibration_screen.cpp * + ********************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +#define GRID_COLS 4 +#define GRID_ROWS 16 + +#define TEXT_POS BTN_POS(1,1), BTN_SIZE(4,12) + +void TouchCalibrationScreen::onEntry() { + CommandProcessor cmd; + + BaseScreen::onEntry(); + + if (CLCD::is_touching()) { + // Ask the user to release the touch before starting, + // as otherwise the first calibration point could + // be misinterpreted. + cmd.cmd(CMD_DLSTART) + .cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)); + draw_text_box(cmd, TEXT_POS, GET_TEXT_F(MSG_TOUCH_CALIBRATION_START), OPT_CENTER, font_large); + cmd.cmd(DL::DL_DISPLAY) + .cmd(CMD_SWAP) + .execute(); + + while (CLCD::is_touching()) { + #if ENABLED(TOUCH_UI_DEBUG) + SERIAL_ECHO_MSG("Waiting for touch release"); + #endif + } + } + + // Force a refresh + cmd.cmd(CMD_DLSTART); + onRedraw(FOREGROUND); + cmd.cmd(DL::DL_DISPLAY); + cmd.execute(); +} + +void TouchCalibrationScreen::onRefresh() { + // Don't do the regular refresh, as this would + // cause the calibration be restarted on every + // touch. +} + +void TouchCalibrationScreen::onRedraw(draw_mode_t) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)); + + draw_text_box(cmd, TEXT_POS, GET_TEXT_F(MSG_TOUCH_CALIBRATION_PROMPT), OPT_CENTER, font_large); + cmd.cmd(CMD_CALIBRATE); +} + +void TouchCalibrationScreen::onIdle() { + if (!CLCD::is_touching() && !CommandProcessor::is_processing()) { + GOTO_PREVIOUS(); + } +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..8c3bc856 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/touch_registers_screen.cpp @@ -0,0 +1,86 @@ +/****************************** + * touch_registers_screen.cpp * + ******************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void TouchRegistersScreen::onRedraw(draw_mode_t) { + const uint32_t T_Transform_A = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_A); + const uint32_t T_Transform_B = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_B); + const uint32_t T_Transform_C = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_C); + const uint32_t T_Transform_D = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_D); + const uint32_t T_Transform_E = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_E); + const uint32_t T_Transform_F = CLCD::mem_read_32(CLCD::REG::TOUCH_TRANSFORM_F); + char b[20]; + + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + + #define GRID_ROWS 7 + #define GRID_COLS 2 + cmd.tag(0) + .font(font_xsmall) + .fgcolor(transformA) .button( BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH_XFORM_A")) + .fgcolor(transformB) .button( BTN_POS(1,2), BTN_SIZE(1,1), F("TOUCH_XFORM_B")) + .fgcolor(transformC) .button( BTN_POS(1,3), BTN_SIZE(1,1), F("TOUCH_XFORM_C")) + .fgcolor(transformD) .button( BTN_POS(1,4), BTN_SIZE(1,1), F("TOUCH_XFORM_D")) + .fgcolor(transformE) .button( BTN_POS(1,5), BTN_SIZE(1,1), F("TOUCH_XFORM_E")) + .fgcolor(transformF) .button( BTN_POS(1,6), BTN_SIZE(1,1), F("TOUCH_XFORM_F")) + + .fgcolor(transformVal).button( BTN_POS(2,1), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button( BTN_POS(2,2), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button( BTN_POS(2,3), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button( BTN_POS(2,4), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button( BTN_POS(2,5), BTN_SIZE(1,1), F(""), OPT_FLAT) + .fgcolor(transformVal).button( BTN_POS(2,6), BTN_SIZE(1,1), F(""), OPT_FLAT); + + sprintf_P(b, PSTR("0x%08lX"), T_Transform_A); cmd.text( BTN_POS(2,1), BTN_SIZE(1,1), b); + sprintf_P(b, PSTR("0x%08lX"), T_Transform_B); cmd.text( BTN_POS(2,2), BTN_SIZE(1,1), b); + sprintf_P(b, PSTR("0x%08lX"), T_Transform_C); cmd.text( BTN_POS(2,3), BTN_SIZE(1,1), b); + sprintf_P(b, PSTR("0x%08lX"), T_Transform_D); cmd.text( BTN_POS(2,4), BTN_SIZE(1,1), b); + sprintf_P(b, PSTR("0x%08lX"), T_Transform_E); cmd.text( BTN_POS(2,5), BTN_SIZE(1,1), b); + sprintf_P(b, PSTR("0x%08lX"), T_Transform_F); cmd.text( BTN_POS(2,6), BTN_SIZE(1,1), b); + + cmd.colors(action_btn).font(font_medium) + .tag(1).button( BTN_POS(2,7), BTN_SIZE(1,1), F("Back")); + #undef GRID_COLS + #undef GRID_ROWS + } + + bool TouchRegistersScreen::onTouchEnd(uint8_t tag) { + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + default: + return false; + } + return true; + } + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..9fe2f1e9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/tune_menu.cpp @@ -0,0 +1,127 @@ +/******************* + * tune_menu.cpp * + *******************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) && !defined(TOUCH_UI_LULZBOT_BIO) + +#include "screens.h" + +using namespace FTDI; +using namespace Theme; + +void TuneMenu::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)); + } + + #ifdef TOUCH_UI_PORTRAIT + #define GRID_ROWS 9 + #define GRID_COLS 2 + #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(2,1) + #define FIL_CHANGE_POS BTN_POS(1,2), BTN_SIZE(2,1) + #define FILAMENT_POS BTN_POS(1,3), BTN_SIZE(2,1) + #define NUDGE_NOZ_POS BTN_POS(1,4), BTN_SIZE(2,1) + #define SPEED_POS BTN_POS(1,5), BTN_SIZE(2,1) + #define PAUSE_POS BTN_POS(1,6), BTN_SIZE(2,1) + #define STOP_POS BTN_POS(1,7), BTN_SIZE(2,1) + #define CASE_LIGHT_POS BTN_POS(1,8), BTN_SIZE(2,1) + #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) + #else + #define GRID_ROWS 5 + #define GRID_COLS 2 + #define TEMPERATURE_POS BTN_POS(1,1), BTN_SIZE(1,1) + #define NUDGE_NOZ_POS BTN_POS(2,1), BTN_SIZE(1,1) + #define FIL_CHANGE_POS BTN_POS(1,2), BTN_SIZE(1,1) + #define SPEED_POS BTN_POS(2,2), BTN_SIZE(1,1) + #define PAUSE_POS BTN_POS(1,3), BTN_SIZE(1,1) + #define STOP_POS BTN_POS(2,3), BTN_SIZE(1,1) + #define FILAMENT_POS BTN_POS(1,4), BTN_SIZE(1,1) + #define CASE_LIGHT_POS BTN_POS(2,4), BTN_SIZE(1,1) + #define BACK_POS BTN_POS(1,5), BTN_SIZE(2,1) + #endif + + if (what & FOREGROUND) { + using namespace ExtUI; + + CommandProcessor cmd; + cmd.colors(normal_btn) + .font(font_medium) + .tag(2).button( TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .enabled(!isPrinting() || isPrintingFromMediaPaused()) + .tag(3).button( FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) + .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) + .tag(9).button( FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) + .enabled(EITHER(HAS_BED_PROBE, BABYSTEPPING)) + .tag(4).button( NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) + .tag(5).button( SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) + .tag(isPrintingFromMediaPaused() ? 7 : 6) + .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) + .button( PAUSE_POS, isPrintingFromMediaPaused() ? GET_TEXT_F(MSG_RESUME_PRINT) : GET_TEXT_F(MSG_PAUSE_PRINT)) + .enabled(TERN0(SDSUPPORT, isPrintingFromMedia())) + .tag(8).button( STOP_POS, GET_TEXT_F(MSG_STOP_PRINT)) + .enabled(ENABLED(CASE_LIGHT_ENABLE)) + .tag(10).button( CASE_LIGHT_POS, GET_TEXT_F(MSG_CASE_LIGHT)) + .tag(1).colors(action_btn) + .button( BACK_POS, GET_TEXT_F(MSG_BACK)); + } + #undef GRID_COLS + #undef GRID_ROWS +} + +bool TuneMenu::onTouchEnd(uint8_t tag) { + using namespace Theme; + using namespace ExtUI; + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + case 2: GOTO_SCREEN(TemperatureScreen); break; + case 3: GOTO_SCREEN(ChangeFilamentScreen); break; + case 4: + #if ENABLED(BABYSTEPPING) + GOTO_SCREEN(NudgeNozzleScreen); + #elif HAS_BED_PROBE + GOTO_SCREEN(ZOffsetScreen); + #endif + break; + case 5: GOTO_SCREEN(FeedratePercentScreen); break; + case 6: sound.play(twinkle, PLAY_ASYNCHRONOUS); ExtUI::pausePrint(); GOTO_SCREEN(StatusScreen); break; + case 7: sound.play(twinkle, PLAY_ASYNCHRONOUS); ExtUI::resumePrint(); GOTO_SCREEN(StatusScreen); break; + case 8: + GOTO_SCREEN(ConfirmAbortPrintDialogBox); + current_screen.forget(); + PUSH_SCREEN(StatusScreen); + break; + #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + case 9: GOTO_SCREEN(FilamentMenu); break; + #endif + #if ENABLED(CASE_LIGHT_ENABLE) + case 10: GOTO_SCREEN(CaseLightScreen); break; + #endif + default: + return false; + } + return true; +} + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..d7c45620 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/widget_demo_screen.cpp @@ -0,0 +1,158 @@ +/************************** + * widget_demo_screen.cpp * + **************************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, TOUCH_UI_DEVELOPER_MENU) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +uint16_t slider_val; +bool show_grid; + +void WidgetsScreen::onEntry() { + BaseScreen::onEntry(); + CLCD::turn_on_backlight(); + SoundPlayer::set_volume(255); +} + +void WidgetsScreen::onRedraw(draw_mode_t) { + using namespace ExtUI; + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .cmd(COLOR_RGB(bg_text_enabled)) + .tag(0); + + const uint16_t hrs = (slider_val*12/0xFFFFU); + const uint16_t m = (slider_val*12*60/0xFFFFU)%60; + const uint16_t s = (slider_val*12*60*60/0xFFFFU)%60; + + #ifdef TOUCH_UI_PORTRAIT + #define GRID_COLS 3 + #define GRID_ROWS 8 + cmd.font(font_large) + .cmd(COLOR_RGB(bg_text_enabled)) + .text (BTN_POS(1,1), BTN_SIZE(3,1), F("Sample Widgets")) + .tag(0).text (BTN_POS(2,6), BTN_SIZE(1,1), F("Show grid:")) + .colors(ui_toggle) + .tag(2).dial (BTN_POS(1,2), BTN_SIZE(1,2), slider_val) + .tag(0).clock (BTN_POS(1,4), BTN_SIZE(1,2), hrs, m, s, 0) + .gauge (BTN_POS(1,6), BTN_SIZE(1,2), 5, 4, slider_val, 0xFFFFU) + .font(font_medium) + .colors(ui_slider) + .tag(4).slider (BTN_POS(2,3), BTN_SIZE(2,1), slider_val, 0xFFFFU) + .tag(5).progress (BTN_POS(2,4), BTN_SIZE(2,1), slider_val, 0xFFFFU) + .tag(6).scrollbar (BTN_POS(2,5), BTN_SIZE(2,1), slider_val, 1000, 0xFFFFU) + .font(font_small) + .colors(ui_toggle) + .tag(7).toggle (BTN_POS(3,6), BTN_SIZE(1,1), F("no\xFFyes"), show_grid) + .colors(normal_btn) + .font(font_medium) + .tag(1) + .button (BTN_POS(2, 8), BTN_SIZE(1,1), F("1")) + .button (BTN_POS(3, 8), BTN_SIZE(1,1), F("2")) + .colors(action_btn) + .button (BTN_POS(1, 8), BTN_SIZE(1,1), F("Back")); + #else + #define GRID_COLS 4 + #define GRID_ROWS 8 + + cmd.font(font_large) + .text (BTN_POS(1,1), BTN_SIZE(4,1), F("Sample Widgets")) + .tag(0).text (BTN_POS(3,6), BTN_SIZE(1,1), F("Show grid:")) + .colors(ui_toggle) + .tag(2).dial (BTN_POS(1,2), BTN_SIZE(1,3), slider_val) + .tag(3).dial (BTN_POS(1,5), BTN_SIZE(1,3), slider_val) + .tag(0).clock (BTN_POS(2,2), BTN_SIZE(1,3), hrs, m, s, 0) + .gauge (BTN_POS(2,5), BTN_SIZE(1,3), 5, 4, slider_val, 0xFFFFU) + .font(font_medium) + .colors(ui_slider) + .tag(4).slider (BTN_POS(3,3), BTN_SIZE(2,1), slider_val, 0xFFFFU) + .tag(5).progress (BTN_POS(3,4), BTN_SIZE(2,1), slider_val, 0xFFFFU) + .tag(6).scrollbar (BTN_POS(3,5), BTN_SIZE(2,1), slider_val, 1000, 0xFFFFU) + .font(font_small) + .colors(ui_toggle) + .tag(7).toggle (BTN_POS(4,6), BTN_SIZE(1,1), F("no\xFFyes"), show_grid) + .colors(normal_btn) + .font(font_medium) + .tag(1).button (BTN_POS(3, 8), BTN_SIZE(1,1), F("1")) + .button (BTN_POS(4, 8), BTN_SIZE(1,1), F("2")) + .colors(action_btn) + .button (BTN_POS(1, 8), BTN_SIZE(2,1), F("Back")); + #endif + + cmd.cmd(COLOR_RGB(bg_text_enabled)); + if (show_grid) DRAW_LAYOUT_GRID +} + +bool WidgetsScreen::onTouchStart(uint8_t tag) { + CommandProcessor cmd; + switch (tag) { + case 1: GOTO_PREVIOUS(); break; + #ifdef TOUCH_UI_PORTRAIT + case 2: cmd.track_circular (BTN_POS(1,2), BTN_SIZE(1,2), 2).execute(); break; + case 4: cmd.track_linear (BTN_POS(2,3), BTN_SIZE(2,1), 4).execute(); break; + case 5: cmd.track_linear (BTN_POS(2,4), BTN_SIZE(2,1), 5).execute(); break; + case 6: cmd.track_linear (BTN_POS(2,5), BTN_SIZE(2,1), 6).execute(); break; + #else + case 2: cmd.track_circular (BTN_POS(1,2), BTN_SIZE(1,3), 2).execute(); break; + case 3: cmd.track_circular (BTN_POS(1,5), BTN_SIZE(1,3), 3).execute(); break; + case 4: cmd.track_linear (BTN_POS(3,3), BTN_SIZE(2,1), 4).execute(); break; + case 5: cmd.track_linear (BTN_POS(3,4), BTN_SIZE(2,1), 5).execute(); break; + case 6: cmd.track_linear (BTN_POS(3,5), BTN_SIZE(2,1), 6).execute(); break; + #endif + case 7: show_grid = !show_grid; break; + default: + return false; + } + + return true; +} + +void WidgetsScreen::onIdle() { + if (refresh_timer.elapsed(TOUCH_UPDATE_INTERVAL)) { + refresh_timer.start(); + + uint16_t value; + CommandProcessor cmd; + switch (cmd.track_tag(value)) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + slider_val = value; break; + default: + return; + } + onRefresh(); + } + BaseScreen::onIdle(); +} + +#endif // TOUCH_UI_FTDI_EVE && TOUCH_UI_DEVELOPER_MENU 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 new file mode 100644 index 00000000..f5cd0369 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/z_offset_screen.cpp @@ -0,0 +1,54 @@ +/*********************** + * z_offset_screen.cpp * + ***********************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../config.h" + +#if BOTH(TOUCH_UI_FTDI_EVE, HAS_BED_PROBE) + +#include "screens.h" + +using namespace FTDI; +using namespace ExtUI; +using namespace Theme; + +void ZOffsetScreen::onRedraw(draw_mode_t what) { + widgets_t w(what); + w.precision(2, BaseNumericAdjustmentScreen::DEFAULT_MIDRANGE).units(GET_TEXT_F(MSG_UNITS_MM)); + + w.heading( GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm()); + w.increments(); +} + +bool ZOffsetScreen::onTouchHeld(uint8_t tag) { + const float increment = getIncrement(); + switch (tag) { + case 4: UI_DECREMENT(ZOffset_mm); break; + case 5: UI_INCREMENT(ZOffset_mm); break; + default: + return false; + } + SaveSettingsDialogBox::settingsChanged(); + return true; +} + +#endif // TOUCH_UI_FTDI_EVE && HAS_BED_PROBE 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 new file mode 100644 index 00000000..2cb039c8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bitmaps.h @@ -0,0 +1,183 @@ +/************* + * bitmaps.h * + *************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +namespace Theme { + using namespace FTDI; + + constexpr PROGMEM bitmap_info_t Extruder_Icon_Info = { + .format = L1, + .linestride = 3, + .filter = BILINEAR, + .wrapx = BORDER, + .wrapy = BORDER, + .RAMG_offset = 8000, + .width = 24, + .height = 23, + }; + + constexpr PROGMEM unsigned char Extruder_Icon[] = { + 0x3F, 0xFF, 0xFC, + 0x7F, 0xFF, 0xFE, + 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, + 0x7F, 0xFF, 0xFE, + 0x3F, 0xFF, 0xFC, + 0x3F, 0xFF, 0xFC, + 0x7F, 0xFF, 0xFE, + 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, + 0xC0, 0x00, 0x03, + 0x7F, 0xFF, 0xFE, + 0x7F, 0xFF, 0xFE, + 0x07, 0xFF, 0xE0, + 0x03, 0xFF, 0xC0, + 0x01, 0x81, 0x80, + 0x00, 0xC3, 0x00, + 0x00, 0x66, 0x00, + 0x00, 0x3C, 0x00, + 0x00, 0x3C, 0x00 + }; + + constexpr PROGMEM bitmap_info_t Bed_Heat_Icon_Info = { + .format = L1, + .linestride = 4, + .filter = BILINEAR, + .wrapx = BORDER, + .wrapy = BORDER, + .RAMG_offset = 8100, + .width = 32, + .height = 23, + }; + + constexpr PROGMEM unsigned char Bed_Heat_Icon[] = { + 0x01, 0x81, 0x81, 0x80, + 0x01, 0x81, 0x81, 0x80, + 0x00, 0xC0, 0xC0, 0xC0, + 0x00, 0xC0, 0xC0, 0xC0, + 0x00, 0x60, 0x60, 0x60, + 0x00, 0x60, 0x60, 0x60, + 0x00, 0xC0, 0xC0, 0xC0, + 0x00, 0xC0, 0xC0, 0xC0, + 0x01, 0x81, 0x81, 0x80, + 0x01, 0x81, 0x81, 0x80, + 0x03, 0x03, 0x03, 0x00, + 0x03, 0x03, 0x03, 0x00, + 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x00, + 0x03, 0x03, 0x03, 0x00, + 0x03, 0x03, 0x03, 0x00, + 0x01, 0x81, 0x81, 0x80, + 0x01, 0x81, 0x81, 0x80, + 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF + }; + + constexpr PROGMEM bitmap_info_t Fan_Icon_Info = { + .format = L1, + .linestride = 4, + .filter = BILINEAR, + .wrapx = BORDER, + .wrapy = BORDER, + .RAMG_offset = 8300, + .width = 32, + .height = 32, + }; + + constexpr PROGMEM unsigned char Fan_Icon[] = { + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x00, 0x1F, + 0xF0, 0x03, 0xF8, 0x0F, + 0xE0, 0x07, 0xF0, 0x07, + 0xC0, 0x0F, 0xE0, 0x03, + 0xC0, 0x1F, 0xE0, 0x03, + 0xC0, 0x1F, 0xE0, 0x03, + 0xC0, 0x0F, 0xE0, 0x03, + 0xC0, 0x07, 0xE0, 0x03, + 0xC0, 0x03, 0xC0, 0x03, + 0xD0, 0x00, 0x00, 0xC3, + 0xD8, 0x03, 0xC1, 0xE3, + 0xDF, 0xC7, 0xE3, 0xF3, + 0xDF, 0xEF, 0xF7, 0xFB, + 0xDF, 0xEF, 0xF7, 0xFB, + 0xDF, 0xEF, 0xF7, 0xFB, + 0xDF, 0xEF, 0xF7, 0xFB, + 0xCF, 0xC7, 0xE3, 0xFB, + 0xC7, 0x83, 0xC0, 0x1B, + 0xC3, 0x00, 0x00, 0x0B, + 0xC0, 0x03, 0xC0, 0x03, + 0xC0, 0x07, 0xE0, 0x03, + 0xC0, 0x07, 0xF0, 0x03, + 0xC0, 0x07, 0xF8, 0x03, + 0xC0, 0x07, 0xF8, 0x03, + 0xC0, 0x07, 0xF0, 0x03, + 0xE0, 0x0F, 0xE0, 0x07, + 0xF0, 0x1F, 0xC0, 0x0F, + 0xF8, 0x00, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF + }; + + constexpr PROGMEM bitmap_info_t TD_Icon_Info = { + .format = L1, + .linestride = 7, + .filter = BILINEAR, + .wrapx = BORDER, + .wrapy = BORDER, + .RAMG_offset = 9000, + .width = 50, + .height = 20, + }; + + constexpr PROGMEM unsigned char TD_Icon[] = { + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, // Thumb Drive Widget + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00 + }; + + constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000; +}; // namespace Theme diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h new file mode 100644 index 00000000..6ea317db --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/bootscreen_logo_portrait.h @@ -0,0 +1,42 @@ +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.pl" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000, x_max = 272.000000, + y_min = 0.000000, y_max = 480.000000; + +const PROGMEM uint16_t logo_green[] = {0x8048, 0x46D9, 0x27BC, 0x9DBA, 0xD8D3, 0x9DBA}; +const PROGMEM uint16_t logo_mark[] = {0xDB9F, 0xAC0C, 0xDA6F, 0xAC2D, 0xD970, 0xAC91, 0xD8C0, 0xAD23, 0xD885, 0xADCF, 0xD8C0, 0xAE7A, 0xD970, 0xAF0C, 0xDA6F, 0xAF6F, 0xDB9F, 0xAF8F, 0xDCCE, 0xAF6F, 0xDDD0, 0xAF0C, 0xDE7D, 0xAE7B, 0xDEB9, 0xADCF, 0xDE7D, 0xAD22, 0xDDD0, 0xAC91, 0xDCCE, 0xAC2D, 0xFFFF, 0xDB9F, 0xABC3, 0xDCFE, 0xABEA, 0xDE28, 0xAC5E, 0xDEF1, 0xAD06, 0xDF36, 0xADCF, 0xDEF1, 0xAE95, 0xDE28, 0xAF3E, 0xDCFE, 0xAFB1, 0xDB9F, 0xAFD8, 0xDA3F, 0xAFB1, 0xD916, 0xAF3E, 0xD849, 0xAE95, 0xD808, 0xADCF, 0xD849, 0xAD06, 0xD916, 0xAC5E, 0xDA3F, 0xABEA, 0xFFFF, 0xDB7D, 0xACE6, 0xDAE4, 0xACE6, 0xDAE4, 0xADA9, 0xDB7D, 0xADA9, 0xDC3B, 0xAD94, 0xDC71, 0xAD48, 0xDC3B, 0xACFD, 0xFFFF, 0xDB85, 0xAC9E, 0xDCCB, 0xACC8, 0xDD37, 0xAD47, 0xDCF6, 0xADAC, 0xDC3E, 0xADDE, 0xDC85, 0xADFF, 0xDCE8, 0xAE4E, 0xDD92, 0xAEEA, 0xDCBD, 0xAEEA, 0xDC1E, 0xAE58, 0xDBA7, 0xAE03, 0xDB36, 0xADEF, 0xDAE4, 0xADEF, 0xDAE4, 0xAEEA, 0xDA26, 0xAEEA, 0xDA26, 0xAC9E}; +const PROGMEM uint16_t logo_type[] = {0xD8D5, 0xA520, 0xD8A5, 0xA563, 0xD82E, 0xA57F, 0xD348, 0xA57F, 0xD2D1, 0xA598, 0xD2A0, 0xA5D9, 0xD2A0, 0xAF7A, 0xD274, 0xAFBE, 0xD202, 0xAFDA, 0xCD37, 0xAFDA, 0xCCBF, 0xAFBE, 0xCC8F, 0xAF7A, 0xCC8F, 0xA5D9, 0xCC63, 0xA598, 0xCBF1, 0xA57F, 0xC70B, 0xA57F, 0xC694, 0xA563, 0xC664, 0xA520, 0xC664, 0xA28C, 0xC70B, 0xA22C, 0xD82E, 0xA22C, 0xD8A5, 0xA248, 0xD8D5, 0xA28C, 0xFFFF, 0xB138, 0xAC8C, 0xB952, 0xAC8C, 0xB952, 0xA57F, 0xB138, 0xA57F, 0xFFFF, 0xBF27, 0xA421, 0xBF57, 0xA476, 0xBF6D, 0xA4D0, 0xBF6D, 0xAD36, 0xBF57, 0xAD90, 0xBF27, 0xADE6, 0xBBFA, 0xAFB2, 0xBB60, 0xAFCF, 0xBABD, 0xAFDA, 0xAFCE, 0xAFDA, 0xAF30, 0xAFCF, 0xAE9A, 0xAFB2, 0xAB6E, 0xADE6, 0xAB39, 0xAD90, 0xAB28, 0xAD36, 0xAB28, 0xA4D0, 0xAB39, 0xA476, 0xAB6E, 0xA421, 0xAE9A, 0xA255, 0xAF30, 0xA239, 0xAFCE, 0xA22C, 0xBABD, 0xA22C, 0xBB60, 0xA239, 0xBBFA, 0xA255, 0xFFFF, 0x93A4, 0xACDC, 0x9CEA, 0xACDC, 0x9CEA, 0xAA34, 0x93A4, 0xAA34, 0x93A4, 0xACDC, 0xFFFF, 0x93A4, 0xA796, 0x9CEA, 0xA796, 0x9CEA, 0xA525, 0x93A4, 0xA525, 0xFFFF, 0xA227, 0xA421, 0xA258, 0xA478, 0xA26E, 0xA4D5, 0xA26E, 0xA700, 0xA24F, 0xA757, 0xA204, 0xA7A5, 0xA089, 0xA8B8, 0xA061, 0xA903, 0xA092, 0xA949, 0xA1FC, 0xAA43, 0xA24B, 0xAA91, 0xA26E, 0xAAE8, 0xA26E, 0xAD36, 0xA258, 0xAD90, 0xA227, 0xADE6, 0x9EFC, 0xAFB2, 0x9E61, 0xAFCF, 0x9DBE, 0xAFDA, 0x8ED0, 0xAFDA, 0x8E28, 0xAF7A, 0x8E28, 0xA28C, 0x8E59, 0xA248, 0x8ED0, 0xA22C, 0x9DBE, 0xA22C, 0x9E61, 0xA239, 0x9EFC, 0xA255, 0xFFFF, 0x853C, 0xA502, 0x8517, 0xA557, 0x84C9, 0xA5A2, 0x7994, 0xACC8, 0x8494, 0xACC8, 0x850A, 0xACE4, 0x853C, 0xAD27, 0x853C, 0xAF7A, 0x850A, 0xAFBE, 0x8494, 0xAFDA, 0x7371, 0xAFDA, 0x72C9, 0xAF7A, 0x72C9, 0xAD09, 0x72E8, 0xACB2, 0x7333, 0xAC64, 0x7EA5, 0xA53E, 0x73A6, 0xA53E, 0x732F, 0xA522, 0x72FE, 0xA4DF, 0x72FE, 0xA28C, 0x732F, 0xA248, 0x73A6, 0xA22C, 0x8494, 0xA22C, 0x850A, 0xA248, 0x853C, 0xA28C, 0xFFFF, 0x6B68, 0xAC87, 0x6BDB, 0xACA3, 0x6C07, 0xACE6, 0x6C07, 0xAF7A, 0x6BDB, 0xAFBE, 0x6B68, 0xAFDA, 0x5C84, 0xAFDA, 0x5BDC, 0xAF7A, 0x5BDC, 0xA28C, 0x5C84, 0xA22C, 0x6146, 0xA22C, 0x61EE, 0xA28C, 0x61EE, 0xAC2D, 0x621E, 0xAC6E, 0x6295, 0xAC87, 0xFFFF, 0x52C6, 0xA248, 0x52F7, 0xA28C, 0x52F7, 0xAD45, 0x52EE, 0xAD45, 0x52DC, 0xAD9B, 0x52B1, 0xADE6, 0x4F85, 0xAFB2, 0x4EEA, 0xAFCF, 0x4E47, 0xAFDA, 0x4359, 0xAFDA, 0x42BA, 0xAFCF, 0x4224, 0xAFB2, 0x3EF8, 0xADE6, 0x3EC3, 0xAD90, 0x3EB2, 0xAD36, 0x3EB2, 0xA28C, 0x3EE2, 0xA248, 0x3F5A, 0xA22C, 0x441B, 0xA22C, 0x4493, 0xA248, 0x44C3, 0xA28C, 0x44C3, 0xAC2D, 0x44F4, 0xAC71, 0x456B, 0xAC8C, 0x4C3E, 0xAC8C, 0x4CB1, 0xAC71, 0x4CDD, 0xAC2D, 0x4CDD, 0xA28C, 0x4D0D, 0xA248, 0x4D85, 0xA22C, 0x524F, 0xA22C, 0xFFFF, 0x3748, 0xAC87, 0x37BB, 0xACA3, 0x37E7, 0xACE6, 0x37E7, 0xAF7A, 0x37BB, 0xAFBE, 0x3748, 0xAFDA, 0x2864, 0xAFDA, 0x27BC, 0xAF7A, 0x27BC, 0xA28C, 0x2864, 0xA22C, 0x2D26, 0xA22C, 0x2DCD, 0xA28C, 0x2DCD, 0xAC2D, 0x2DFE, 0xAC6E, 0x2E75, 0xAC87}; +const PROGMEM uint16_t logo_black[] = {0x8048, 0x527A, 0x8ADE, 0x5CDE, 0x75B2, 0x5CDE, 0xFFFF, 0x8048, 0x4FF6, 0x71D9, 0x5E20, 0x8EB8, 0x5E20, 0x8048, 0x4FF6, 0xFFFF, 0x4436, 0x8D8E, 0x4ECC, 0x97F2, 0x39A0, 0x97F2, 0xFFFF, 0x4436, 0x8B0A, 0x35C8, 0x9934, 0x52A5, 0x9934, 0xFFFF, 0xBC3D, 0x8D8E, 0xC6D4, 0x97F2, 0xB1A7, 0x97F2, 0xFFFF, 0xBC3D, 0x8B0A, 0xADCE, 0x9934, 0xCAAC, 0x9934, 0xFFFF, 0x8045, 0x6778, 0x7F6D, 0x67A7, 0x7E9D, 0x689F, 0x7D49, 0x69EA, 0x7B41, 0x6A81, 0x7908, 0x6A3A, 0x7726, 0x692C, 0x75EA, 0x685A, 0x7505, 0x684C, 0x744A, 0x6899, 0x73F5, 0x69A8, 0x7345, 0x6B1A, 0x7193, 0x6BF8, 0x6F4D, 0x6C08, 0x6CFA, 0x6B45, 0x6B61, 0x6AA3, 0x6A7D, 0x6AB7, 0x69EB, 0x6B1D, 0x6A1D, 0x6C34, 0x6A22, 0x6DB8, 0x68E5, 0x6ECD, 0x66B9, 0x6F33, 0x6417, 0x6EC5, 0x6239, 0x6E5C, 0x6165, 0x6E91, 0x6108, 0x6F09, 0x61C1, 0x7018, 0x6282, 0x7196, 0x61CF, 0x72D1, 0x5FE5, 0x7384, 0x5D38, 0x7380, 0x5B4B, 0x7365, 0x5A97, 0x73B7, 0x5A74, 0x7438, 0x5B90, 0x7520, 0x5CE8, 0x7671, 0x5CCB, 0x77BB, 0x5B43, 0x78B0, 0x58B6, 0x7914, 0x56D7, 0x7944, 0x564F, 0x79AD, 0x5667, 0x7A2F, 0x57DA, 0x7AE3, 0x59B7, 0x7BF3, 0x5A31, 0x7D37, 0x5927, 0x7E5D, 0x56E0, 0x7F1E, 0x5529, 0x7F93, 0x54D7, 0x800D, 0x5529, 0x8087, 0x56E0, 0x80FD, 0x5926, 0x81BE, 0x5A30, 0x82E5, 0x59B5, 0x8428, 0x57D8, 0x8538, 0x5664, 0x85EB, 0x564C, 0x866D, 0x56D4, 0x86D7, 0x58B2, 0x8708, 0x5B3F, 0x876B, 0x5CC6, 0x8860, 0x5CE3, 0x89AA, 0x5B8B, 0x8AFC, 0x5A6D, 0x8BE3, 0x5A91, 0x8C65, 0x5B44, 0x8CB7, 0x5D32, 0x8C9C, 0x5FDE, 0x8C98, 0x61C7, 0x8D4B, 0x627A, 0x8E87, 0x61B9, 0x9005, 0x60FF, 0x9114, 0x615C, 0x918B, 0x622F, 0x91C0, 0x640E, 0x9158, 0x66B0, 0x90EA, 0x68DC, 0x9150, 0x6A18, 0x9266, 0x6A12, 0x93E9, 0x69E0, 0x9501, 0x6A72, 0x9567, 0x6B56, 0x957B, 0x6CEE, 0x94D9, 0x6F43, 0x9417, 0x7188, 0x9428, 0x7339, 0x9506, 0x73E9, 0x9678, 0x743E, 0x9787, 0x74F8, 0x97D4, 0x75DD, 0x97C6, 0x771A, 0x96F4, 0x78FB, 0x95E6, 0x7B35, 0x95A1, 0x7D3D, 0x9637, 0x7E91, 0x9782, 0x7F60, 0x987A, 0x8038, 0x98AA, 0x810F, 0x987B, 0x81DF, 0x9782, 0x8333, 0x9638, 0x853B, 0x95A1, 0x8775, 0x95E7, 0x8956, 0x96F5, 0x8A92, 0x97C8, 0x8B78, 0x97D6, 0x8C32, 0x9789, 0x8C88, 0x967A, 0x8D37, 0x9508, 0x8EE9, 0x942A, 0x912F, 0x941A, 0x9383, 0x94DD, 0x951B, 0x957F, 0x95FF, 0x956B, 0x9690, 0x9505, 0x9660, 0x93ED, 0x9659, 0x926A, 0x9797, 0x9154, 0x99C3, 0x90EF, 0x9C65, 0x915D, 0x9E43, 0x91C6, 0x9F17, 0x9191, 0x9F74, 0x9119, 0x9EBB, 0x900A, 0x9DFA, 0x8E8C, 0x9EAE, 0x8D51, 0xA098, 0x8C9E, 0xA345, 0x8CA2, 0xA531, 0x8CBE, 0xA5E5, 0x8C6B, 0xA609, 0x8BEA, 0xA4EC, 0x8B02, 0xA394, 0x89B1, 0xA3B2, 0x8867, 0xA53A, 0x8772, 0xA7C6, 0x870E, 0xA9A5, 0x86DE, 0xAA2D, 0x8675, 0xAA14, 0x85F2, 0xA8A2, 0x853F, 0xA6C5, 0x842E, 0xA64B, 0x82EB, 0xA755, 0x81C5, 0xA99C, 0x8104, 0xAB52, 0x808F, 0xABA6, 0x8015, 0xAB52, 0x7F9B, 0xA99C, 0x7F25, 0xA755, 0x7E64, 0xA64C, 0x7D3E, 0xA6C7, 0x7BFA, 0xA8A5, 0x7AEA, 0xAA18, 0x7A37, 0xAA31, 0x79B5, 0xA9A9, 0x794B, 0xA7CA, 0x791B, 0xA53C, 0x78B7, 0xA3B6, 0x77C1, 0xA39A, 0x7677, 0xA4F1, 0x7526, 0xA60E, 0x743F, 0xA5EB, 0x73BD, 0xA538, 0x736B, 0xA34B, 0x7387, 0xA09E, 0x738A, 0x9EB4, 0x72D6, 0x9E02, 0x719B, 0x9EC4, 0x701D, 0x9F7E, 0x6F0E, 0x9F20, 0x6E96, 0x9E4E, 0x6E61, 0x9C6E, 0x6ECA, 0x99CB, 0x6F37, 0x97A0, 0x6ED2, 0x9664, 0x6DBC, 0x966B, 0x6C38, 0x969B, 0x6B21, 0x960B, 0x6ABB, 0x9526, 0x6AA6, 0x938E, 0x6B48, 0x913B, 0x6C0B, 0x8EF4, 0x6BFA, 0x8D43, 0x6B1D, 0x8C94, 0x69AA, 0x8C3F, 0x689B, 0x8B85, 0x684D, 0x8A9E, 0x685C, 0x8962, 0x692E, 0x8781, 0x6A3C, 0x8546, 0x6A82, 0x833F, 0x69EA, 0x81EC, 0x68A0, 0x811C, 0x67A8, 0x8045, 0x6778, 0x8045, 0x6778, 0xFFFF, 0x8047, 0x6AA0, 0x81C8, 0x6AFA, 0x8268, 0x6BD5, 0x81C8, 0x6CAF, 0x8047, 0x6D09, 0x7EC6, 0x6CAF, 0x7E27, 0x6BD5, 0x7EC6, 0x6AFA, 0x8047, 0x6AA0, 0x8047, 0x6AA0, 0xFFFF, 0x803E, 0x6E19, 0x867C, 0x6E71, 0x8C65, 0x6F75, 0x91D7, 0x711B, 0x96AD, 0x735B, 0x9ABC, 0x762C, 0x9DA2, 0x794C, 0x9F5F, 0x7CA2, 0x9FF3, 0x8011, 0x9F5E, 0x8380, 0x9DA1, 0x86D5, 0x9ABA, 0x89F6, 0x96AB, 0x8CC7, 0x91D6, 0x8F08, 0x8C65, 0x90AD, 0x867C, 0x91B1, 0x803D, 0x9209, 0x7A00, 0x91B1, 0x7416, 0x90AD, 0x6EA6, 0x8F08, 0x69D0, 0x8CC7, 0x65D6, 0x8A0A, 0x62EE, 0x86F4, 0x6125, 0x839B, 0x6089, 0x8011, 0x6124, 0x7C88, 0x62ED, 0x792E, 0x65D6, 0x7619, 0x69CF, 0x735B, 0x6EA5, 0x711B, 0x7416, 0x6F75, 0x7A00, 0x6E71, 0x803E, 0x6E19, 0x803E, 0x6E19, 0xFFFF, 0x803E, 0x6EB2, 0x7A5A, 0x6F04, 0x74B2, 0x6FF8, 0x6F4B, 0x7194, 0x6A8F, 0x73C7, 0x66A2, 0x7681, 0x63D5, 0x7986, 0x6226, 0x7CBF, 0x6197, 0x8011, 0x6226, 0x8363, 0x63D5, 0x869C, 0x66A2, 0x89A2, 0x6A8F, 0x8C5B, 0x6F4B, 0x8E8E, 0x74B2, 0x902B, 0x7A5A, 0x911E, 0x803D, 0x9170, 0x803E, 0x9170, 0x8621, 0x911E, 0x8BCA, 0x902B, 0x9130, 0x8E8E, 0x95ED, 0x8C5B, 0x99CF, 0x89AB, 0x9CA7, 0x869C, 0x9E55, 0x8367, 0x9EE5, 0x8011, 0x9E55, 0x7CBB, 0x9CA7, 0x7986, 0x99CF, 0x7677, 0x95ED, 0x73C7, 0x9130, 0x7194, 0x8BCA, 0x6FF8, 0x8621, 0x6F04, 0x803E, 0x6EB2, 0x803E, 0x6EB2, 0xFFFF, 0x80BC, 0x6FD7, 0x80AF, 0x71D8, 0x7FC8, 0x71D9, 0x7FB7, 0x6FD8, 0x80BC, 0x6FD7, 0x80BC, 0x6FD7, 0xFFFF, 0x83CB, 0x6FF6, 0x84CD, 0x700B, 0x843E, 0x7206, 0x835B, 0x71F4, 0xFFFF, 0x7CA9, 0x6FF8, 0x7D1A, 0x71F5, 0x7C37, 0x7207, 0x7BA7, 0x700D, 0x7CA9, 0x6FF8, 0x7CA9, 0x6FF8, 0xFFFF, 0x87CD, 0x7068, 0x88C7, 0x7092, 0x87BA, 0x727C, 0x86DF, 0x7258, 0xFFFF, 0x78A8, 0x706B, 0x7997, 0x725A, 0x78BA, 0x727E, 0x77AD, 0x7095, 0x78A8, 0x706B, 0x78A8, 0x706B, 0xFFFF, 0x6700, 0x708A, 0x6880, 0x70E5, 0x6920, 0x71BF, 0x6880, 0x7299, 0x66FF, 0x72F4, 0x657F, 0x7299, 0x64E0, 0x71BF, 0x657F, 0x70E4, 0x6700, 0x708A, 0x6700, 0x708A, 0xFFFF, 0x998D, 0x708C, 0x9B0E, 0x70E6, 0x9BAE, 0x71C0, 0x9B0E, 0x729B, 0x998D, 0x72F6, 0x980D, 0x729B, 0x976E, 0x71C1, 0x980D, 0x70E7, 0x998D, 0x708C, 0x998D, 0x708C, 0xFFFF, 0x8BA7, 0x712C, 0x8C95, 0x716A, 0x8B10, 0x7339, 0x8A3F, 0x7303, 0x8BA7, 0x712C, 0xFFFF, 0x74CE, 0x712F, 0x7635, 0x7307, 0x7564, 0x733C, 0x73DE, 0x716D, 0x74CE, 0x712F, 0x74CE, 0x712F, 0xFFFF, 0x8F47, 0x723F, 0x9023, 0x728E, 0x8E2D, 0x743A, 0x8D6B, 0x73F4, 0x8F47, 0x723F, 0xFFFF, 0x712D, 0x7242, 0x7308, 0x73F7, 0x7248, 0x743D, 0x7050, 0x7292, 0x712D, 0x7242, 0x712D, 0x7242, 0xFFFF, 0x803E, 0x72F6, 0x891B, 0x73F4, 0x909A, 0x76CC, 0x959F, 0x7B0B, 0x975E, 0x8011, 0x959F, 0x8517, 0x909A, 0x8957, 0x891B, 0x8C2E, 0x803E, 0x8D2B, 0x7761, 0x8C2E, 0x6FE2, 0x8957, 0x6ADD, 0x8517, 0x691E, 0x8011, 0x6ADD, 0x7B0B, 0x6FE2, 0x76CC, 0x7761, 0x73F4, 0x803E, 0x72F6, 0x803E, 0x72F6, 0xFFFF, 0x803E, 0x738F, 0x77C8, 0x7481, 0x70A0, 0x7738, 0x6BD7, 0x7B46, 0x6A2C, 0x8011, 0x6BD7, 0x84DC, 0x70A1, 0x88EA, 0x77C9, 0x8BA1, 0x803E, 0x8C93, 0x88B4, 0x8BA1, 0x8FDB, 0x88EA, 0x94A5, 0x84DD, 0x9650, 0x8011, 0x94A5, 0x7B46, 0x8FDB, 0x7738, 0x88B4, 0x7481, 0x803E, 0x738F, 0x803E, 0x738F, 0xFFFF, 0x929B, 0x739A, 0x935C, 0x73FA, 0x9100, 0x7578, 0x905A, 0x7527, 0x9175, 0x745E, 0xFFFF, 0x6DDC, 0x739D, 0x7022, 0x7527, 0x6F74, 0x757C, 0x6D16, 0x73FF, 0x6DDC, 0x739D, 0x6DDC, 0x739D, 0xFFFF, 0x9589, 0x7533, 0x9634, 0x75A4, 0x937E, 0x76ED, 0x92E8, 0x768B, 0xFFFF, 0x6AEB, 0x7539, 0x6D8D, 0x7690, 0x6CFB, 0x76F0, 0x6CEC, 0x76FA, 0x6BED, 0x7674, 0x6A40, 0x75A9, 0x6A45, 0x75A7, 0x6AEB, 0x7539, 0x6AEB, 0x7539, 0xFFFF, 0x980B, 0x7707, 0x989A, 0x7784, 0x9597, 0x7892, 0x951A, 0x7825, 0xFFFF, 0x686A, 0x770C, 0x6B5B, 0x782A, 0x6ADF, 0x7897, 0x67DD, 0x7788, 0x686A, 0x770C, 0x686A, 0x770C, 0xFFFF, 0x9A12, 0x790A, 0x9A7E, 0x7991, 0x9740, 0x7A5E, 0x96E1, 0x79E8, 0x9A12, 0x790A, 0xFFFF, 0x6664, 0x790F, 0x6996, 0x79ED, 0x6937, 0x7A63, 0x65F9, 0x7996, 0x6664, 0x790F, 0x6664, 0x790F, 0xFFFF, 0x9B91, 0x7B32, 0x9BDB, 0x7BC1, 0x9870, 0x7C48, 0x9831, 0x7BCB, 0xFFFF, 0x64E6, 0x7B37, 0x6847, 0x7BD0, 0x6807, 0x7C4C, 0x649D, 0x7BC5, 0x64E6, 0x7B37, 0x64E6, 0x7B37, 0xFFFF, 0x9C82, 0x7D72, 0x9CA7, 0x7E06, 0x9925, 0x7E46, 0x9903, 0x7DC5, 0xFFFF, 0x63F7, 0x7D78, 0x6776, 0x7DC9, 0x6756, 0x7E49, 0x63D3, 0x7E0A, 0x63F7, 0x7D78, 0x63F7, 0x7D78, 0xFFFF, 0x5C87, 0x7EDB, 0x5E08, 0x7F35, 0x5EA8, 0x800F, 0x5E08, 0x80E9, 0x5C87, 0x8144, 0x5C85, 0x8144, 0x5B06, 0x80E9, 0x5A67, 0x800F, 0x5B06, 0x7F35, 0x5C87, 0x7EDB, 0x5C87, 0x7EDB, 0xFFFF, 0xA402, 0x7EDE, 0xA583, 0x7F38, 0xA623, 0x8011, 0xA623, 0x8013, 0xA583, 0x80EC, 0xA402, 0x8147, 0xA281, 0x80ED, 0xA1E2, 0x8013, 0xA281, 0x7F38, 0xA402, 0x7EDE, 0xA402, 0x7EDE, 0xFFFF, 0x9CE0, 0x7FC0, 0x9CE0, 0x8055, 0x9957, 0x804D, 0x9957, 0x7FCB, 0xFFFF, 0x639D, 0x7FC5, 0x6726, 0x7FCE, 0x6726, 0x8051, 0x639D, 0x805A, 0x639D, 0x7FC5, 0x639D, 0x7FC5, 0xFFFF, 0x9927, 0x81D1, 0x9CAA, 0x8210, 0x9C87, 0x82A2, 0x9907, 0x8252, 0x9927, 0x81D1, 0x9927, 0x81D1, 0xFFFF, 0x6757, 0x81D5, 0x6777, 0x8255, 0x63F9, 0x82A7, 0x63D4, 0x8214, 0xFFFF, 0x9877, 0x83CF, 0x9BE2, 0x8455, 0x9B99, 0x84E3, 0x9838, 0x844C, 0x9877, 0x83CF, 0x9877, 0x83CF, 0xFFFF, 0x6808, 0x83D3, 0x6848, 0x8450, 0x64E7, 0x84E8, 0x649E, 0x845A, 0xFFFF, 0x9749, 0x85B9, 0x9A88, 0x8684, 0x9A1D, 0x870C, 0x96EB, 0x862E, 0x9749, 0x85B9, 0x9749, 0x85B9, 0xFFFF, 0x6938, 0x85BD, 0x6997, 0x8634, 0x6665, 0x8710, 0x65F9, 0x8689, 0xFFFF, 0x95A2, 0x8785, 0x98A5, 0x8892, 0x9818, 0x890F, 0x9527, 0x87F2, 0x95A2, 0x8785, 0x95A2, 0x8785, 0xFFFF, 0x6ADF, 0x878A, 0x6B5B, 0x87F8, 0x686A, 0x8914, 0x67DC, 0x8897, 0x6ADF, 0x878A, 0xFFFF, 0x6CF7, 0x892F, 0x6D8D, 0x8991, 0x6AEB, 0x8AE9, 0x6A40, 0x8A79, 0xFFFF, 0x9380, 0x8932, 0x9645, 0x8A72, 0x963E, 0x8A77, 0x9599, 0x8AE3, 0x92F5, 0x898D, 0x9380, 0x8932, 0x9380, 0x8932, 0xFFFF, 0x9110, 0x8AA1, 0x936F, 0x8C1F, 0x92AA, 0x8C80, 0x9064, 0x8AF7, 0x9110, 0x8AA1, 0x9110, 0x8AA1, 0xFFFF, 0x6F73, 0x8AA5, 0x7021, 0x8AFB, 0x7035, 0x8B04, 0x6DED, 0x8C8B, 0x6DE1, 0x8C87, 0x6D17, 0x8C23, 0xFFFF, 0x8E3E, 0x8BE1, 0x9037, 0x8D8B, 0x8F59, 0x8DDC, 0x8D7C, 0x8C27, 0x8E3E, 0x8BE1, 0x8E3E, 0x8BE1, 0xFFFF, 0x7259, 0x8BEB, 0x731B, 0x8C31, 0x7140, 0x8DE7, 0x7064, 0x8D97, 0xFFFF, 0x8B21, 0x8CE3, 0x8CA9, 0x8EB2, 0x8BBA, 0x8EEF, 0x8A51, 0x8D18, 0x8B21, 0x8CE3, 0x8B21, 0x8CE3, 0xFFFF, 0x7576, 0x8CEB, 0x7648, 0x8D20, 0x74E0, 0x8EF8, 0x73F2, 0x8EBB, 0xFFFF, 0x66F3, 0x8D2F, 0x6874, 0x8D8A, 0x687D, 0x8D8F, 0x6886, 0x8D94, 0x6926, 0x8E6E, 0x6887, 0x8F48, 0x6705, 0x8FA2, 0x6584, 0x8F49, 0x657F, 0x8F45, 0x6570, 0x8F3E, 0x6573, 0x8F3E, 0x64D3, 0x8E63, 0x6573, 0x8D89, 0x66F3, 0x8D2F, 0x66F3, 0x8D2F, 0xFFFF, 0x9993, 0x8D31, 0x9B13, 0x8D8C, 0x9BB4, 0x8E66, 0x9B16, 0x8F40, 0x9993, 0x8F9A, 0x9814, 0x8F40, 0x9774, 0x8E66, 0x9812, 0x8D8C, 0x9993, 0x8D31, 0x9993, 0x8D31, 0xFFFF, 0x87CD, 0x8DA1, 0x88DC, 0x8F8B, 0x87E0, 0x8FB5, 0x86F0, 0x8DC6, 0x87CD, 0x8DA1, 0x87CD, 0x8DA1, 0xFFFF, 0x78CD, 0x8DA8, 0x79A8, 0x8DCB, 0x78BC, 0x8FBB, 0x77C1, 0x8F92, 0xFFFF, 0x8450, 0x8E19, 0x84E2, 0x9014, 0x83E0, 0x9029, 0x836C, 0x8E2C, 0x8450, 0x8E19, 0x8450, 0x8E19, 0xFFFF, 0x7C48, 0x8E1C, 0x7D2B, 0x8E2E, 0x7CBD, 0x902C, 0x7BBB, 0x9017, 0x7C48, 0x8E1C, 0xFFFF, 0x80BF, 0x8E49, 0x80D2, 0x904A, 0x7FCC, 0x904A, 0x7FD9, 0x8E49, 0x80BF, 0x8E49, 0x80BF, 0x8E49, 0xFFFF, 0x804F, 0x9321, 0x81D0, 0x937A, 0x8271, 0x9455, 0x81D1, 0x952F, 0x8051, 0x958A, 0x7ECF, 0x9530, 0x7E2F, 0x9456, 0x7ECE, 0x937B, 0x804F, 0x9321, 0x804F, 0x9321, 0xFFFF, 0x8048, 0x46D9, 0x27BC, 0x9DBA, 0xD8D3, 0x9DBA, 0xFFFF, 0x8048, 0x4BC9, 0x952E, 0x604A, 0x6B62, 0x604A, 0xFFFF, 0x68D2, 0x62CE, 0x97BF, 0x62CE, 0xB9BA, 0x8427, 0xA239, 0x9B36, 0x5E16, 0x9B36, 0x46B6, 0x8446, 0x68D2, 0x62CE, 0xFFFF, 0xBC3E, 0x869F, 0xD13B, 0x9B36, 0xA742, 0x9B36, 0xFFFF, 0x4431, 0x86BE, 0x590E, 0x9B36, 0x2F54, 0x9B36, 0x4431, 0x86BE}; +const PROGMEM uint16_t logo_white[] = {0x80BC, 0x6FD7, 0x80AF, 0x71D8, 0x7FC8, 0x71D9, 0x7FB7, 0x6FD8, 0x80BC, 0x6FD7, 0xFFFF, 0x83CB, 0x6FF6, 0x84CD, 0x700B, 0x843E, 0x7206, 0x835B, 0x71F4, 0xFFFF, 0x7CA9, 0x6FF8, 0x7D1A, 0x71F5, 0x7C37, 0x7207, 0x7BA7, 0x700D, 0x7CA9, 0x6FF8, 0x7CA9, 0x6FF8, 0xFFFF, 0x87CD, 0x7068, 0x88C7, 0x7092, 0x87BA, 0x727C, 0x86DF, 0x7258, 0xFFFF, 0x78A8, 0x706B, 0x7997, 0x725A, 0x78BA, 0x727E, 0x77AD, 0x7095, 0x78A8, 0x706B, 0x78A8, 0x706B, 0xFFFF, 0x8BA7, 0x712C, 0x8C95, 0x716A, 0x8B10, 0x7339, 0x8A3F, 0x7303, 0xFFFF, 0x74CE, 0x712F, 0x7635, 0x7307, 0x7564, 0x733C, 0x73DE, 0x716D, 0x74CE, 0x712F, 0x74CE, 0x712F, 0xFFFF, 0x8F47, 0x723F, 0x9023, 0x728E, 0x8E2D, 0x743A, 0x8D6B, 0x73F4, 0xFFFF, 0x712D, 0x7242, 0x7309, 0x73F7, 0x7248, 0x743D, 0x7050, 0x7292, 0x712D, 0x7242, 0x712D, 0x7242, 0xFFFF, 0x929B, 0x739A, 0x935C, 0x73FA, 0x9100, 0x7578, 0x905A, 0x7527, 0xFFFF, 0x6DDC, 0x739D, 0x7022, 0x7527, 0x6F74, 0x757C, 0x6D16, 0x73FF, 0x6DDC, 0x739D, 0x6DDC, 0x739D, 0xFFFF, 0x9589, 0x7533, 0x9634, 0x75A4, 0x937E, 0x76ED, 0x92E8, 0x768B, 0xFFFF, 0x6AEB, 0x7539, 0x6D8D, 0x7690, 0x6CFB, 0x76F0, 0x6A40, 0x75A9, 0x6AEB, 0x7539, 0xFFFF, 0x980B, 0x7707, 0x989A, 0x7784, 0x9597, 0x7892, 0x951A, 0x7825, 0xFFFF, 0x686A, 0x770C, 0x6B5B, 0x782A, 0x6ADF, 0x7897, 0x67DD, 0x7788, 0x686A, 0x770C, 0x686A, 0x770C, 0xFFFF, 0x9A12, 0x790A, 0x9A7E, 0x7991, 0x9740, 0x7A5E, 0x96E1, 0x79E8, 0xFFFF, 0x6664, 0x790F, 0x6996, 0x79ED, 0x6937, 0x7A63, 0x65F9, 0x7996, 0x6664, 0x790F, 0x6664, 0x790F, 0xFFFF, 0x9B91, 0x7B32, 0x9BDB, 0x7BC1, 0x9870, 0x7C48, 0x9831, 0x7BCC, 0xFFFF, 0x64E6, 0x7B37, 0x6847, 0x7BD0, 0x6807, 0x7C4C, 0x649D, 0x7BC5, 0x64E6, 0x7B37, 0x64E6, 0x7B37, 0xFFFF, 0x9C82, 0x7D72, 0x9CA7, 0x7E06, 0x9925, 0x7E46, 0x9903, 0x7DC5, 0xFFFF, 0x63F7, 0x7D78, 0x6776, 0x7DC9, 0x6756, 0x7E49, 0x63D3, 0x7E0A, 0x63F7, 0x7D78, 0x63F7, 0x7D78, 0xFFFF, 0x9CE0, 0x7FC0, 0x9CE0, 0x8055, 0x9957, 0x804D, 0x9957, 0x7FCB, 0xFFFF, 0x639D, 0x7FC5, 0x6726, 0x7FCE, 0x6726, 0x8051, 0x639D, 0x805A, 0x639D, 0x7FC5, 0xFFFF, 0x9927, 0x81D1, 0x9CAA, 0x8210, 0x9C87, 0x82A2, 0x9907, 0x8252, 0x9927, 0x81D1, 0x9927, 0x81D1, 0xFFFF, 0x6757, 0x81D5, 0x6777, 0x8256, 0x63F9, 0x82A7, 0x63D4, 0x8214, 0xFFFF, 0x9877, 0x83CF, 0x9BE2, 0x8455, 0x9B99, 0x84E3, 0x9838, 0x844C, 0x9877, 0x83CF, 0xFFFF, 0x6808, 0x83D3, 0x6848, 0x8450, 0x64E7, 0x84E8, 0x649E, 0x845A, 0xFFFF, 0x9749, 0x85B9, 0x9A88, 0x8684, 0x9A1D, 0x870C, 0x96EB, 0x862E, 0x9749, 0x85B9, 0x9749, 0x85B9, 0xFFFF, 0x6938, 0x85BD, 0x6997, 0x8634, 0x6665, 0x8710, 0x65F9, 0x8689, 0xFFFF, 0x95A2, 0x8785, 0x98A5, 0x8892, 0x9818, 0x890F, 0x9527, 0x87F2, 0x95A2, 0x8785, 0x95A2, 0x8785, 0xFFFF, 0x6ADF, 0x878A, 0x6B5B, 0x87F8, 0x686A, 0x8915, 0x67DC, 0x8897, 0xFFFF, 0x6CF7, 0x8930, 0x6D8D, 0x8991, 0x6AEB, 0x8AE9, 0x6A40, 0x8A79, 0xFFFF, 0x9380, 0x8932, 0x9645, 0x8A72, 0x9599, 0x8AE3, 0x92F5, 0x898D, 0x9380, 0x8932, 0xFFFF, 0x9110, 0x8AA1, 0x936F, 0x8C1F, 0x92AA, 0x8C80, 0x9064, 0x8AF7, 0x9110, 0x8AA1, 0x9110, 0x8AA1, 0xFFFF, 0x6F73, 0x8AA5, 0x7021, 0x8AFB, 0x6DED, 0x8C8C, 0x6D17, 0x8C23, 0xFFFF, 0x8E3E, 0x8BE1, 0x9037, 0x8D8B, 0x8F59, 0x8DDC, 0x8D7C, 0x8C27, 0x8E3E, 0x8BE1, 0x8E3E, 0x8BE1, 0xFFFF, 0x7259, 0x8BEB, 0x731B, 0x8C31, 0x7140, 0x8DE7, 0x7064, 0x8D97, 0xFFFF, 0x8B21, 0x8CE3, 0x8CA9, 0x8EB2, 0x8BBA, 0x8EEF, 0x8A51, 0x8D18, 0x8B21, 0x8CE3, 0x8B21, 0x8CE3, 0xFFFF, 0x7576, 0x8CEB, 0x7648, 0x8D20, 0x74E0, 0x8EF8, 0x73F2, 0x8EBB, 0xFFFF, 0x87CD, 0x8DA1, 0x88DC, 0x8F8B, 0x87E0, 0x8FB5, 0x86F0, 0x8DC6, 0x87CD, 0x8DA1, 0x87CD, 0x8DA1, 0xFFFF, 0x78CC, 0x8DA8, 0x79A8, 0x8DCB, 0x78BC, 0x8FBB, 0x77C0, 0x8F92, 0xFFFF, 0x8450, 0x8E19, 0x84E2, 0x9014, 0x83E0, 0x9029, 0x836C, 0x8E2C, 0x8450, 0x8E19, 0x8450, 0x8E19, 0xFFFF, 0x7C48, 0x8E1C, 0x7D2B, 0x8E2E, 0x7CBD, 0x902C, 0x7BBB, 0x9017, 0xFFFF, 0x80BE, 0x8E49, 0x80D1, 0x904A, 0x7FCC, 0x904A, 0x7FD9, 0x8E49, 0x80BE, 0x8E49, 0xFFFF, 0x8276, 0x75D6, 0x83AF, 0x75FE, 0x8436, 0x7628, 0x84AE, 0x7661, 0x8542, 0x7706, 0x8512, 0x77BA, 0x8457, 0x7845, 0x8335, 0x788B, 0x8318, 0x7882, 0x82D8, 0x7860, 0x831E, 0x7830, 0x8353, 0x7823, 0x83E6, 0x77F9, 0x8464, 0x7790, 0x847A, 0x771A, 0x8415, 0x76B7, 0x83B6, 0x7691, 0x8351, 0x7676, 0x827F, 0x7662, 0x81BB, 0x7687, 0x8161, 0x76AF, 0x8123, 0x76DA, 0x80E5, 0x771A, 0x80C5, 0x774D, 0x80B8, 0x77C1, 0x80D1, 0x77EE, 0x8107, 0x7814, 0x81CC, 0x786B, 0x837F, 0x7918, 0x8464, 0x7983, 0x84C0, 0x79B2, 0x852D, 0x79FD, 0x859D, 0x7ABC, 0x858E, 0x7B79, 0x8545, 0x7C25, 0x84D9, 0x7CC5, 0x8469, 0x7D4D, 0x843B, 0x7DCD, 0x8555, 0x7DA8, 0x85D3, 0x7D67, 0x870D, 0x7CA0, 0x87E0, 0x7BC0, 0x880D, 0x7B5B, 0x886D, 0x7A46, 0x88B3, 0x799B, 0x88CC, 0x7970, 0x893A, 0x78EA, 0x8995, 0x78A8, 0x8A01, 0x786F, 0x8AF8, 0x781F, 0x8BA6, 0x77FD, 0x8C0C, 0x77EF, 0x8C96, 0x77FB, 0x8D1D, 0x7815, 0x8D59, 0x7826, 0x8E40, 0x7889, 0x8EDB, 0x7925, 0x8EFC, 0x797B, 0x8EFF, 0x79D4, 0x8E71, 0x7A7B, 0x8D58, 0x7AD2, 0x8C23, 0x7ADE, 0x8AFF, 0x7A97, 0x8AF5, 0x7A81, 0x8AEF, 0x7A4E, 0x8B68, 0x7A52, 0x8B96, 0x7A5F, 0x8C39, 0x7A87, 0x8D33, 0x7A7F, 0x8E07, 0x7A3F, 0x8E66, 0x79CB, 0x8E63, 0x7985, 0x8E43, 0x793F, 0x8DC6, 0x78C6, 0x8CFA, 0x7876, 0x8C7E, 0x785F, 0x8C18, 0x7857, 0x8B84, 0x7874, 0x8B22, 0x788F, 0x8A7D, 0x78CA, 0x8A2E, 0x78F9, 0x89F0, 0x7930, 0x89A3, 0x79A5, 0x8979, 0x7AC0, 0x897C, 0x7B9C, 0x8972, 0x7BF2, 0x88CC, 0x7D32, 0x87B7, 0x7E4C, 0x8665, 0x7F52, 0x8660, 0x7F5A, 0x878F, 0x7F01, 0x88AE, 0x7EC2, 0x89FD, 0x7E9E, 0x8B8D, 0x7EC6, 0x8C40, 0x7F0E, 0x8CB6, 0x7F68, 0x8D1D, 0x7FD7, 0x8DFA, 0x80BD, 0x8EA8, 0x816E, 0x8F34, 0x81D4, 0x8F8A, 0x81F9, 0x8FDA, 0x820A, 0x90AB, 0x820F, 0x9120, 0x81FF, 0x91A5, 0x81DC, 0x91F4, 0x81B8, 0x922C, 0x8198, 0x9288, 0x812B, 0x927D, 0x80AB, 0x9252, 0x8068, 0x921C, 0x8033, 0x9174, 0x7FEB, 0x9099, 0x7FEB, 0x8FCF, 0x8029, 0x8F5D, 0x808D, 0x8F47, 0x80A4, 0x8ED4, 0x80A4, 0x8EC5, 0x8070, 0x8F65, 0x7FE6, 0x906D, 0x7F92, 0x91A4, 0x7F90, 0x92A8, 0x7FF7, 0x92FC, 0x8043, 0x9331, 0x8090, 0x9349, 0x813D, 0x92D1, 0x81E3, 0x9264, 0x8227, 0x91E5, 0x825B, 0x915D, 0x8280, 0x90D3, 0x8296, 0x8FA0, 0x829A, 0x8F2C, 0x8286, 0x8EE7, 0x8273, 0x8E78, 0x824A, 0x8DA9, 0x81D4, 0x8CB9, 0x8127, 0x8B68, 0x802C, 0x8B22, 0x8001, 0x8AC3, 0x7FE7, 0x8A50, 0x7FF4, 0x88FD, 0x8068, 0x87A4, 0x811D, 0x879E, 0x812D, 0x8904, 0x81F1, 0x89D4, 0x8285, 0x8A7C, 0x8343, 0x8A94, 0x8431, 0x8A4E, 0x84A1, 0x89E8, 0x850E, 0x892F, 0x85E5, 0x88B0, 0x86E5, 0x88C0, 0x8757, 0x88F2, 0x878D, 0x8927, 0x87AD, 0x8ABF, 0x8821, 0x8B0E, 0x881E, 0x8B70, 0x8811, 0x8C1B, 0x87D6, 0x8C9B, 0x8776, 0x8CC4, 0x873D, 0x8CD3, 0x8705, 0x8CA2, 0x86A3, 0x8C06, 0x8662, 0x8B39, 0x864F, 0x8A77, 0x8662, 0x89F9, 0x864D, 0x8A10, 0x8606, 0x8A66, 0x85F7, 0x8B35, 0x85DC, 0x8C50, 0x85FD, 0x8D3C, 0x8663, 0x8D94, 0x870A, 0x8D7D, 0x875F, 0x8D3A, 0x87B8, 0x8CB1, 0x882D, 0x8BC1, 0x888C, 0x8B30, 0x88A7, 0x8A8D, 0x88AE, 0x89EE, 0x8898, 0x896E, 0x887E, 0x8869, 0x882D, 0x87EE, 0x87EA, 0x87A4, 0x87A8, 0x878E, 0x8785, 0x874D, 0x86E3, 0x875D, 0x8637, 0x87FD, 0x8466, 0x8705, 0x835A, 0x86B8, 0x8359, 0x84A4, 0x8358, 0x7F20, 0x851B, 0x7F13, 0x864D, 0x8016, 0x86F9, 0x818E, 0x87D8, 0x823B, 0x8869, 0x8272, 0x88C9, 0x8276, 0x8915, 0x8266, 0x893D, 0x81FB, 0x89D8, 0x8197, 0x8A21, 0x8119, 0x8A62, 0x80A7, 0x8A8A, 0x8016, 0x8AAA, 0x7EDC, 0x8AAE, 0x7DC5, 0x8A63, 0x7D55, 0x8A29, 0x7CFA, 0x89E5, 0x7CAD, 0x8939, 0x7D1B, 0x8895, 0x7E00, 0x8825, 0x7F27, 0x8800, 0x7F66, 0x880F, 0x7F69, 0x8850, 0x7E49, 0x8873, 0x7D9A, 0x88C9, 0x7D4F, 0x893E, 0x7D8B, 0x89B2, 0x7DD8, 0x89E6, 0x7E36, 0x8A10, 0x7F02, 0x8A40, 0x7FDB, 0x8A34, 0x8046, 0x8A16, 0x8091, 0x89F5, 0x80A5, 0x89EB, 0x80FE, 0x89AB, 0x8126, 0x8981, 0x8159, 0x8918, 0x814F, 0x88E6, 0x8128, 0x88B8, 0x8094, 0x8856, 0x7EFC, 0x8796, 0x7D74, 0x86E7, 0x7D3D, 0x86C5, 0x7CD8, 0x8674, 0x7C98, 0x8605, 0x7CA0, 0x8536, 0x7D7C, 0x83E6, 0x7E07, 0x8357, 0x7DED, 0x835B, 0x79CC, 0x843E, 0x7962, 0x8448, 0x77CB, 0x8450, 0x76F3, 0x8438, 0x763E, 0x841E, 0x7502, 0x83FE, 0x746C, 0x83FD, 0x73E4, 0x840A, 0x72CE, 0x8444, 0x729B, 0x8457, 0x71E6, 0x84B7, 0x71B5, 0x84EB, 0x719B, 0x853B, 0x719B, 0x8558, 0x71D4, 0x85E0, 0x72B0, 0x8642, 0x73D4, 0x8661, 0x74B3, 0x8616, 0x74AD, 0x84D7, 0x74B2, 0x84B3, 0x74B5, 0x849B, 0x751E, 0x8496, 0x753B, 0x84B8, 0x75C5, 0x856E, 0x756D, 0x865A, 0x74D0, 0x86B8, 0x73FA, 0x86EA, 0x7250, 0x86CF, 0x70E7, 0x863F, 0x707E, 0x85C8, 0x705F, 0x8549, 0x7075, 0x84CC, 0x70AC, 0x8475, 0x70CD, 0x8452, 0x71FF, 0x839C, 0x7287, 0x8376, 0x736A, 0x833A, 0x7443, 0x8319, 0x751E, 0x8311, 0x76AC, 0x8327, 0x77C4, 0x8341, 0x7810, 0x8340, 0x799F, 0x8313, 0x7A2A, 0x82EA, 0x7B24, 0x8281, 0x7BE4, 0x820C, 0x7BEC, 0x81B1, 0x7A5E, 0x81C8, 0x7809, 0x81ED, 0x7751, 0x81F8, 0x7664, 0x81EF, 0x7571, 0x81B4, 0x74BB, 0x8141, 0x7483, 0x80F9, 0x7408, 0x802F, 0x73D9, 0x7FEB, 0x7359, 0x7F50, 0x72A0, 0x7EC4, 0x719E, 0x7E89, 0x7074, 0x7EA8, 0x7015, 0x7ECC, 0x6FD0, 0x7EF8, 0x6FA3, 0x7F19, 0x6F6B, 0x7FBB, 0x6F93, 0x8017, 0x6FA7, 0x8032, 0x6FD7, 0x805A, 0x70DF, 0x8092, 0x7205, 0x805A, 0x729E, 0x7FCB, 0x72B3, 0x7FBC, 0x7309, 0x7FA6, 0x733B, 0x7FDE, 0x72F9, 0x804B, 0x726D, 0x80A7, 0x70E6, 0x80FB, 0x700D, 0x80EC, 0x6F48, 0x80A8, 0x6EFC, 0x8073, 0x6EC1, 0x8026, 0x6E93, 0x7FCC, 0x6ED4, 0x7ED8, 0x6F54, 0x7E72, 0x6FCB, 0x7E3A, 0x700B, 0x7E25, 0x71AB, 0x7DED, 0x7356, 0x7E3E, 0x7472, 0x7EF4, 0x7536, 0x7FBD, 0x75DA, 0x8075, 0x7628, 0x80B6, 0x767B, 0x80D8, 0x76D9, 0x80EF, 0x7755, 0x80FC, 0x7881, 0x80D5, 0x7931, 0x8093, 0x7A00, 0x801E, 0x799B, 0x7D9B, 0x789A, 0x7CD8, 0x77C0, 0x7BE5, 0x7783, 0x7B55, 0x7787, 0x7AB9, 0x77AE, 0x7A67, 0x77E6, 0x7A1D, 0x781E, 0x79CD, 0x785E, 0x7909, 0x7853, 0x78C0, 0x7823, 0x788B, 0x7808, 0x7875, 0x7649, 0x77E8, 0x74B6, 0x7869, 0x7488, 0x78B3, 0x7472, 0x7901, 0x74D2, 0x796F, 0x75D8, 0x799A, 0x76EE, 0x7971, 0x774A, 0x797A, 0x7751, 0x79B4, 0x76A0, 0x79F0, 0x75E4, 0x7A0A, 0x7454, 0x79E1, 0x73AF, 0x7986, 0x7369, 0x7909, 0x7374, 0x7891, 0x739D, 0x783C, 0x73B6, 0x781E, 0x74B7, 0x7768, 0x765D, 0x772C, 0x77ED, 0x7769, 0x7932, 0x77FC, 0x7979, 0x7836, 0x79B8, 0x787B, 0x79DF, 0x7912, 0x7998, 0x7A14, 0x7967, 0x7AB4, 0x796A, 0x7AD8, 0x79C5, 0x7B60, 0x7A9D, 0x7BE9, 0x7B72, 0x7C47, 0x7EBA, 0x7BD6, 0x8206, 0x7CA8, 0x82FA, 0x7C2E, 0x8391, 0x7BB4, 0x83F6, 0x7B40, 0x8413, 0x7AD0, 0x83DD, 0x7A71, 0x838A, 0x7A39, 0x8296, 0x79B7, 0x80F3, 0x78FA, 0x8016, 0x788A, 0x7FB4, 0x7833, 0x7F8D, 0x77DF, 0x7F92, 0x77A9, 0x7FB3, 0x7718, 0x7FF6, 0x76C2, 0x8036, 0x768A, 0x8097, 0x764A, 0x80DF, 0x762A, 0x813C, 0x7605, 0x8275, 0x75D5}; + +#define LOGO_BACKGROUND 0xDEEA5C + +#define LOGO_PAINT_PATHS \ + LOGO_PAINT_PATH(0xC1D82F, logo_green) \ + LOGO_PAINT_PATH(0x000000, logo_black) \ + LOGO_PAINT_PATH(0x000000, logo_type) \ + LOGO_PAINT_PATH(0x000000, logo_mark) \ + LOGO_PAINT_PATH(0xFFFFFF, logo_white) 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 new file mode 100644 index 00000000..4e2fde6a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -0,0 +1,183 @@ +/************ + * colors.h * + ************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2019 - Cocoa Press * + * * + * 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 + +namespace Theme { + #if ENABLED(TOUCH_UI_COCOA_THEME) + constexpr int accent_hue = 23; + + // Browns and Oranges + constexpr uint32_t accent_color_1 = hsl_to_rgb(12.8,0.597,0.263); // Darkest + constexpr uint32_t accent_color_2 = hsl_to_rgb(12.8,0.597,0.263); + constexpr uint32_t accent_color_3 = hsl_to_rgb( 9.6,0.664,0.443); + constexpr uint32_t accent_color_4 = hsl_to_rgb(16.3,0.873,0.537); + constexpr uint32_t accent_color_5 = hsl_to_rgb(23.0,0.889,0.539); + constexpr uint32_t accent_color_6 = hsl_to_rgb(23.0,0.889,0.539); // Lightest + #else + // Use linear accent colors + + #if ANY(TOUCH_UI_ROYAL_THEME, TOUCH_UI_FROZEN_THEME) + // Dark blue accent colors + constexpr int accent_hue = 216; + constexpr float accent_sat = 0.7; + #else + // Green accent colors + constexpr int accent_hue = 68; + constexpr float accent_sat = 0.68; + #endif + + // Shades of accent color + constexpr uint32_t accent_color_0 = hsl_to_rgb(accent_hue, accent_sat, 0.15); // Darkest + constexpr uint32_t accent_color_1 = hsl_to_rgb(accent_hue, accent_sat, 0.26); + constexpr uint32_t accent_color_2 = hsl_to_rgb(accent_hue, accent_sat, 0.39); + constexpr uint32_t accent_color_3 = hsl_to_rgb(accent_hue, accent_sat, 0.52); + constexpr uint32_t accent_color_4 = hsl_to_rgb(accent_hue, accent_sat, 0.65); + constexpr uint32_t accent_color_5 = hsl_to_rgb(accent_hue, accent_sat, 0.78); + constexpr uint32_t accent_color_6 = hsl_to_rgb(accent_hue, accent_sat, 0.91); // Lightest + #endif + + // Shades of gray + + constexpr float gray_sat = 0.14; + constexpr uint32_t gray_color_0 = hsl_to_rgb(accent_hue, gray_sat, 0.15); // Darkest + constexpr uint32_t gray_color_1 = hsl_to_rgb(accent_hue, gray_sat, 0.26); + constexpr uint32_t gray_color_2 = hsl_to_rgb(accent_hue, gray_sat, 0.39); + constexpr uint32_t gray_color_3 = hsl_to_rgb(accent_hue, gray_sat, 0.52); + constexpr uint32_t gray_color_4 = hsl_to_rgb(accent_hue, gray_sat, 0.65); + constexpr uint32_t gray_color_5 = hsl_to_rgb(accent_hue, gray_sat, 0.78); + constexpr uint32_t gray_color_6 = hsl_to_rgb(accent_hue, gray_sat, 0.91); // Lightest + + #if ENABLED(TOUCH_UI_ROYAL_THEME) + constexpr uint32_t theme_darkest = accent_color_1; + constexpr uint32_t theme_dark = accent_color_4; + + constexpr uint32_t bg_color = gray_color_0; + constexpr uint32_t axis_label = gray_color_1; + + constexpr uint32_t bg_text_enabled = accent_color_6; + constexpr uint32_t bg_text_disabled = gray_color_0; + constexpr uint32_t bg_normal = accent_color_4; + constexpr uint32_t fg_disabled = gray_color_0; + constexpr uint32_t fg_normal = accent_color_0; + constexpr uint32_t fg_action = accent_color_1; + + constexpr uint32_t logo_bg_rgb = accent_color_1; + constexpr uint32_t logo_fill_rgb = accent_color_0; + constexpr uint32_t logo_stroke_rgb = accent_color_4; + #elif ANY(TOUCH_UI_COCOA_THEME, TOUCH_UI_FROZEN_THEME) + constexpr uint32_t theme_darkest = accent_color_1; + constexpr uint32_t theme_dark = accent_color_4; + + constexpr uint32_t bg_color = 0xFFFFFF; + constexpr uint32_t axis_label = gray_color_5; + + constexpr uint32_t bg_text_enabled = accent_color_1; + constexpr uint32_t bg_text_disabled = gray_color_1; + constexpr uint32_t bg_normal = accent_color_4; + constexpr uint32_t fg_disabled = gray_color_6; + constexpr uint32_t fg_normal = accent_color_1; + constexpr uint32_t fg_action = accent_color_4; + + constexpr uint32_t logo_bg_rgb = accent_color_5; + constexpr uint32_t logo_fill_rgb = accent_color_6; + constexpr uint32_t logo_stroke_rgb = accent_color_2; + #else + constexpr uint32_t theme_darkest = gray_color_1; + constexpr uint32_t theme_dark = gray_color_2; + + constexpr uint32_t bg_color = gray_color_1; + constexpr uint32_t axis_label = gray_color_2; + + constexpr uint32_t bg_text_enabled = 0xFFFFFF; + constexpr uint32_t bg_text_disabled = gray_color_2; + constexpr uint32_t bg_normal = gray_color_1; + constexpr uint32_t fg_disabled = gray_color_1; + constexpr uint32_t fg_normal = gray_color_2; + constexpr uint32_t fg_action = accent_color_2; + + constexpr uint32_t logo_bg_rgb = accent_color_4; + constexpr uint32_t logo_fill_rgb = accent_color_3; + constexpr uint32_t logo_stroke_rgb = 0x000000; + #endif + + constexpr uint32_t shadow_rgb = gray_color_6; + constexpr uint32_t stroke_rgb = accent_color_1; + constexpr uint32_t fill_rgb = accent_color_3; + #if ENABLED(TOUCH_UI_COCOA_PRESS) + constexpr uint32_t syringe_rgb = 0xFFFFFF; + constexpr uint32_t fluid_rgb = accent_color_5; + #else + constexpr uint32_t syringe_rgb = accent_color_5; + constexpr uint32_t fluid_rgb = accent_color_3; + #endif + + #if ENABLED(TOUCH_UI_ROYAL_THEME) + constexpr uint32_t x_axis = hsl_to_rgb(0, 1.00, 0.26); + constexpr uint32_t y_axis = hsl_to_rgb(120, 1.00, 0.13); + constexpr uint32_t z_axis = hsl_to_rgb(240, 1.00, 0.10); + #else + constexpr uint32_t x_axis = hsl_to_rgb(0, 1.00, 0.5); + constexpr uint32_t y_axis = hsl_to_rgb(120, 1.00, 0.37); + constexpr uint32_t z_axis = hsl_to_rgb(240, 1.00, 0.37); + #endif + constexpr uint32_t e_axis = axis_label; + constexpr uint32_t feedrate = axis_label; + constexpr uint32_t other = axis_label; + + // Status screen + constexpr uint32_t progress = axis_label; + constexpr uint32_t status_msg = axis_label; + #if ENABLED(TOUCH_UI_ROYAL_THEME) + constexpr uint32_t fan_speed = hsl_to_rgb(240, 0.5, 0.13); + constexpr uint32_t temp = hsl_to_rgb(343, 1.0, 0.23); + #else + constexpr uint32_t fan_speed = hsl_to_rgb(204, 0.47, 0.41); + constexpr uint32_t temp = hsl_to_rgb(311, 0.51, 0.35); + #endif + + constexpr uint32_t disabled_icon = gray_color_1; + + // Calibration Registers Screen + constexpr uint32_t transformA = 0x3010D0; + constexpr uint32_t transformB = 0x4010D0; + constexpr uint32_t transformC = 0x5010D0; + constexpr uint32_t transformD = 0x6010D0; + constexpr uint32_t transformE = 0x7010D0; + constexpr uint32_t transformF = 0x8010D0; + constexpr uint32_t transformVal = 0x104010; + + constexpr btn_colors disabled_btn = {.bg = bg_color, .grad = fg_disabled, .fg = fg_disabled, .rgb = fg_disabled }; + constexpr btn_colors normal_btn = {.bg = fg_action, .grad = 0xFFFFFF, .fg = fg_normal, .rgb = 0xFFFFFF }; + constexpr btn_colors action_btn = {.bg = bg_color, .grad = 0xFFFFFF, .fg = fg_action, .rgb = 0xFFFFFF }; + constexpr btn_colors red_btn = {.bg = 0xFF5555, .grad = 0xFFFFFF, .fg = 0xFF0000, .rgb = 0xFFFFFF }; + constexpr btn_colors ui_slider = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = accent_color_3 }; + constexpr btn_colors ui_toggle = {.bg = theme_darkest, .grad = 0xFFFFFF, .fg = theme_dark, .rgb = 0xFFFFFF }; + + // Temperature color scale + + const rgb_t cool_rgb ( 0, 0, 0); + const rgb_t low_rgb (128, 0, 0); + const rgb_t med_rgb (255, 128, 0); + const rgb_t high_rgb (255, 255, 128); +}; 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 new file mode 100644 index 00000000..63115b41 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/fonts.h @@ -0,0 +1,80 @@ +/*********** + * fonts.h * + ***********/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +namespace Theme { + #ifdef TOUCH_UI_800x480 + #ifdef TOUCH_UI_PORTRAIT + constexpr int16_t font_tiny = 26; + constexpr int16_t font_xsmall = 28; + constexpr int16_t font_small = 29; + constexpr int16_t font_medium = 30; + constexpr int16_t font_large = 30; + constexpr int16_t font_xlarge = 31; + #else + constexpr int16_t font_tiny = 27; + constexpr int16_t font_xsmall = 29; + constexpr int16_t font_small = 30; + constexpr int16_t font_medium = 30; + constexpr int16_t font_large = 31; + constexpr int16_t font_xlarge = 31; + #endif + constexpr float icon_scale = 1.0; + #elif defined(TOUCH_UI_480x272) + #ifdef TOUCH_UI_PORTRAIT + constexpr int16_t font_tiny = 26; + constexpr int16_t font_xsmall = 26; + constexpr int16_t font_small = 26; + constexpr int16_t font_medium = 27; + constexpr int16_t font_large = 28; + constexpr int16_t font_xlarge = 29; + constexpr float icon_scale = 0.7; + #else + constexpr int16_t font_tiny = 26; + constexpr int16_t font_xsmall = 26; + constexpr int16_t font_small = 27; + constexpr int16_t font_medium = 28; + constexpr int16_t font_large = 30; + constexpr int16_t font_xlarge = 31; + constexpr float icon_scale = 0.6; + #endif + #elif defined(TOUCH_UI_320x240) + #ifdef TOUCH_UI_PORTRAIT + constexpr int16_t font_tiny = 26; + constexpr int16_t font_xsmall = 26; + constexpr int16_t font_small = 26; + constexpr int16_t font_medium = 27; + constexpr int16_t font_large = 27; + constexpr int16_t font_xlarge = 28; + constexpr float icon_scale = 0.6; + #else + constexpr int16_t font_tiny = 26; + constexpr int16_t font_xsmall = 26; + constexpr int16_t font_small = 26; + constexpr int16_t font_medium = 27; + constexpr int16_t font_large = 29; + constexpr int16_t font_xlarge = 30; + constexpr float icon_scale = 0.5; + #endif + #endif +} 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 new file mode 100644 index 00000000..eb9cadeb --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_landscape.h @@ -0,0 +1,39 @@ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.py" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000; +constexpr float x_max = 480.000000; +constexpr float y_min = 0.000000; +constexpr float y_max = 272.000000; + +const PROGMEM uint16_t logo_fill[] = {0x419D, 0x546F, 0x3D05, 0x5615, 0x3942, 0x5A92, 0x36B7, 0x6136, 0x35C8, 0x6950, 0x35C8, 0x96B0, 0x36B7, 0x9ECA, 0x3942, 0xA56E, 0x3D05, 0xA9EB, 0x419D, 0xAB91, 0xBE60, 0xAB91, 0xC2F8, 0xA9EB, 0xC6BB, 0xA56E, 0xC946, 0x9ECA, 0xCA35, 0x96B0, 0xCA32, 0x546C, 0x419D, 0x546F}; + +const PROGMEM uint16_t logo_stroke[] = {0xADF3, 0x546C, 0x419D, 0x546F, 0x3D05, 0x5615, 0x3942, 0x5A92, 0x36B7, 0x6136, 0x35C8, 0x6950, 0x35C8, 0x96B0, 0x36B7, 0x9ECA, 0x3942, 0xA56E, 0x3D05, 0xA9EB, 0x419D, 0xAB91, 0xBE60, 0xAB91, 0xC2F8, 0xA9EB, 0xC6BB, 0xA56E, 0xC946, 0x9ECA, 0xCA35, 0x96B0, 0xCA32, 0x546C, 0xADF3, 0x546C, 0xFFFF, 0x419D, 0x5913, 0xB08C, 0x5913, 0xC794, 0x8250, 0xC794, 0x96B0, 0xC6DA, 0x9CFF, 0xC4E1, 0xA229, 0xC1F4, 0xA5A5, 0xBE60, 0xA6ED, 0x419D, 0xA6ED, 0x3E09, 0xA5A5, 0x3B1C, 0xA229, 0x3923, 0x9CFF, 0x3869, 0x96B0, 0x3869, 0x6950, 0x3923, 0x6301, 0x3B1C, 0x5DD7, 0x3E09, 0x5A5B, 0x419D, 0x5913, 0xFFFF, 0xAC7A, 0x8620, 0xAC7A, 0x9373, 0xA767, 0x9373, 0xA767, 0x75CB, 0xA1C6, 0x75CB, 0xA1C6, 0x9373, 0xA1C6, 0x9C8E, 0xA767, 0x9C8E, 0xAC7A, 0x9C8E, 0xB21C, 0x9C8E, 0xB21C, 0x9373, 0xB21C, 0x85E7, 0xB350, 0x8093, 0xB65F, 0x7E86, 0xB9D5, 0x8165, 0xBA83, 0x85E7, 0xBA83, 0x9C8E, 0xBEFE, 0x9C8E, 0xC024, 0x99E1, 0xC024, 0x8620, 0xBF7B, 0x7F22, 0xBD8F, 0x79A9, 0xBA7E, 0x7617, 0xB65F, 0x74D0, 0xB24F, 0x7622, 0xAF30, 0x79C6, 0xAD2F, 0x7F43, 0xAC7A, 0x8620, 0xAC7A, 0x8620, 0xAC7A, 0x8620, 0xFFFF, 0x8179, 0x9C8E, 0x7CE9, 0x9C8E, 0x7747, 0x9C8E, 0x7747, 0x92EC, 0x7747, 0x8949, 0x75A2, 0x81A3, 0x71A6, 0x7E73, 0x6DAB, 0x818B, 0x6C05, 0x88FC, 0x6DAF, 0x9019, 0x71C7, 0x92EC, 0x7505, 0x92EC, 0x7505, 0x9C8E, 0x7118, 0x9C8E, 0x6CD3, 0x9B06, 0x696B, 0x96D6, 0x6729, 0x909E, 0x6658, 0x88FC, 0x672D, 0x8133, 0x6980, 0x7AC7, 0x6D13, 0x766C, 0x71A6, 0x74D0, 0x7632, 0x766D, 0x79C2, 0x7AD1, 0x7C14, 0x8153, 0x7CE9, 0x8949, 0x7CE9, 0x92EC, 0x8179, 0x92EC, 0x8179, 0x8620, 0x822E, 0x7F43, 0x842E, 0x79C6, 0x874E, 0x7622, 0x8B5E, 0x74D0, 0x8F7C, 0x7617, 0x928E, 0x79A9, 0x9479, 0x7F22, 0x9523, 0x8620, 0x9523, 0x87DB, 0x8F81, 0x87DB, 0x8F81, 0x85E7, 0x8ED4, 0x8165, 0x8B5E, 0x7E86, 0x884F, 0x8093, 0x871A, 0x85E7, 0x871A, 0x92EC, 0x871A, 0x9C8F, 0x8179, 0x9C8F, 0x8179, 0x9C8E, 0x8179, 0x9C8E, 0xFFFF, 0x6515, 0x79DB, 0x644C, 0x7281, 0x6218, 0x6C86, 0x5EB2, 0x6882, 0x5A56, 0x670A, 0x55D9, 0x68E0, 0x5272, 0x6DD0, 0x4F0B, 0x68E0, 0x4A8E, 0x670A, 0x4638, 0x6882, 0x42D5, 0x6C86, 0x40A2, 0x7281, 0x3FD9, 0x79DB, 0x3FD9, 0x9AC9, 0x40E4, 0x9C8E, 0x456F, 0x9C8E, 0x456F, 0x79B5, 0x46D4, 0x735D, 0x4A8E, 0x70C0, 0x4E3E, 0x735D, 0x4FA1, 0x79B5, 0x4FA1, 0x9C8E, 0x554D, 0x9C8E, 0x554D, 0x79B5, 0x56A7, 0x735D, 0x5A56, 0x70C0, 0x5E0C, 0x735D, 0x5F74, 0x79B5, 0x5F74, 0x9C8E, 0x6515, 0x9C8E, 0x6515, 0x79DB, 0x6515, 0x79DB, 0x6515, 0x79DB, 0xFFFF, 0x9672, 0x8C4C, 0x9714, 0x9379, 0x98F5, 0x98D2, 0x9C0B, 0x9BF4, 0xA04C, 0x9C7B, 0xA04C, 0x9373, 0x9D2B, 0x920C, 0x9C1E, 0x8C4C, 0x9C1E, 0x648E, 0x9672, 0x648E, 0x9672, 0x8C4C, 0x9672, 0x8C4C, 0x9672, 0x8C4C, 0xFFFF, 0xA767, 0x7194, 0xA767, 0x6C02, 0xA692, 0x687A, 0xA496, 0x670A, 0xA291, 0x687A, 0xA1BB, 0x6C02, 0xA1BB, 0x7194, 0xA767, 0x7194, 0xA767, 0x7194, 0xA767, 0x7194}; + +#define LOGO_BACKGROUND logo_bg_rgb +#define LOGO_PAINT_PATHS \ + LOGO_PAINT_PATH(logo_fill_rgb, logo_fill) \ + LOGO_PAINT_PATH(logo_stroke_rgb, logo_stroke) 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 new file mode 100644 index 00000000..dd5088e0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/marlin_bootscreen_portrait.h @@ -0,0 +1,39 @@ + +/**************************************************************************** + * 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: . * + ****************************************************************************/ + +/** + * This file was auto-generated using "svg2cpp.py" + * + * The encoding consists of x,y pairs with the min and max scaled to + * 0x0000 and 0xFFFE. A single 0xFFFF in the data stream indicates the + * start of a new closed path. + */ + +#pragma once + +constexpr float x_min = 0.000000; +constexpr float x_max = 272.000000; +constexpr float y_min = 0.000000; +constexpr float y_max = 480.000000; + +const PROGMEM uint16_t logo_fill[] = {0x3C19, 0x70C5, 0x371A, 0x7159, 0x3302, 0x72EA, 0x303D, 0x753C, 0x2F39, 0x7811, 0x2F39, 0x87ED, 0x303D, 0x8AC2, 0x3302, 0x8D14, 0x371A, 0x8EA5, 0x3C19, 0x8F39, 0xC3E4, 0x8F39, 0xC8E3, 0x8EA5, 0xCCFB, 0x8D14, 0xCFC0, 0x8AC2, 0xD0C4, 0x87ED, 0xD0C0, 0x70C4, 0x3C19, 0x70C5}; + +const PROGMEM uint16_t logo_stroke[] = {0x3C19, 0x70C5, 0x371A, 0x7159, 0x3302, 0x72EA, 0x303D, 0x753C, 0x2F39, 0x7811, 0x2F39, 0x87ED, 0x303D, 0x8AC2, 0x3302, 0x8D14, 0x371A, 0x8EA5, 0x3C19, 0x8F39, 0xC3E4, 0x8F39, 0xC8E3, 0x8EA5, 0xCCFB, 0x8D14, 0xCFC0, 0x8AC2, 0xD0C4, 0x87ED, 0xD0C0, 0x70C4, 0x3C19, 0x70C5, 0xFFFF, 0x3C19, 0x7264, 0xB4D6, 0x7264, 0xCDE7, 0x80CE, 0xCDE7, 0x87ED, 0xCD1D, 0x8A21, 0xCAF7, 0x8BEF, 0xC7C8, 0x8D27, 0xC3E4, 0x8D9A, 0x3C19, 0x8D9A, 0x3835, 0x8D27, 0x3506, 0x8BEF, 0x32E0, 0x8A21, 0x3216, 0x87ED, 0x3216, 0x7811, 0x32E0, 0x75DD, 0x3506, 0x740F, 0x3835, 0x72D7, 0x3C19, 0x7264, 0xFFFF, 0xB069, 0x8223, 0xB069, 0x86CB, 0xAAE2, 0x86CB, 0xAAE2, 0x7C6E, 0xA4C2, 0x7C6E, 0xA4C2, 0x86CB, 0xA4C2, 0x89FA, 0xAAE2, 0x89FA, 0xB069, 0x89FA, 0xB689, 0x89FA, 0xB689, 0x86CB, 0xB689, 0x820F, 0xB7D9, 0x8033, 0xBB2E, 0x7F7B, 0xBEF2, 0x807C, 0xBFAE, 0x820F, 0xBFAE, 0x89FA, 0xC48F, 0x89FA, 0xC5CF, 0x890A, 0xC5CF, 0x8223, 0xC517, 0x7FB2, 0xC300, 0x7DC8, 0xBFA9, 0x7C88, 0xBB2E, 0x7C16, 0xB6C1, 0x7C8C, 0xB35B, 0x7DD2, 0xB12D, 0x7FBD, 0xB069, 0x8223, 0xB069, 0x8223, 0xB069, 0x8223, 0xFFFF, 0x819B, 0x89FA, 0x7CA3, 0x89FA, 0x7682, 0x89FA, 0x7682, 0x869C, 0x7682, 0x833E, 0x74B7, 0x8092, 0x7062, 0x7F74, 0x6C0C, 0x8089, 0x6A41, 0x8323, 0x6C10, 0x859F, 0x7085, 0x869C, 0x740C, 0x869C, 0x740C, 0x89FA, 0x6FC7, 0x89FA, 0x6B21, 0x8971, 0x676C, 0x87FA, 0x64F8, 0x85CE, 0x6414, 0x8323, 0x64FC, 0x806A, 0x6784, 0x7E2C, 0x6B67, 0x7CA6, 0x7062, 0x7C16, 0x7555, 0x7CA6, 0x7935, 0x7E2F, 0x7BBC, 0x8076, 0x7CA3, 0x833E, 0x7CA3, 0x869C, 0x819A, 0x869C, 0x819A, 0x8223, 0x825F, 0x7FBD, 0x848D, 0x7DD2, 0x87F3, 0x7C8C, 0x8C60, 0x7C16, 0x90DB, 0x7C88, 0x9432, 0x7DC8, 0x9648, 0x7FB2, 0x9701, 0x8223, 0x9701, 0x82BE, 0x90E0, 0x82BE, 0x90E0, 0x820F, 0x9024, 0x807C, 0x8C60, 0x7F7B, 0x890B, 0x8033, 0x87BB, 0x820F, 0x87BB, 0x869C, 0x87BB, 0x89FA, 0x819B, 0x89FA, 0x819B, 0x89FA, 0x819B, 0x89FA, 0xFFFF, 0x62B5, 0x7DD9, 0x61DA, 0x7B47, 0x5F73, 0x7931, 0x5BC1, 0x77C9, 0x5702, 0x7746, 0x521F, 0x77EA, 0x4E6B, 0x79A4, 0x4AB8, 0x77EA, 0x45D5, 0x7746, 0x411D, 0x77C9, 0x3D6E, 0x7931, 0x3B09, 0x7B47, 0x3A2E, 0x7DD9, 0x3A2E, 0x895C, 0x3B51, 0x89FA, 0x4043, 0x89FA, 0x4043, 0x7DCC, 0x41C6, 0x7B95, 0x45D5, 0x7AAB, 0x49D9, 0x7B95, 0x4B5B, 0x7DCC, 0x4B5B, 0x89FA, 0x5188, 0x89FA, 0x5188, 0x7DCC, 0x52FF, 0x7B95, 0x5702, 0x7AAB, 0x5B0C, 0x7B95, 0x5C94, 0x7DCC, 0x5C94, 0x89FA, 0x62B5, 0x89FA, 0x62B5, 0x7DD9, 0x62B5, 0x7DD9, 0x62B5, 0x7DD9, 0xFFFF, 0x986E, 0x844B, 0x991E, 0x86CD, 0x9B2A, 0x88AC, 0x9E85, 0x89C4, 0xA327, 0x89F3, 0xA327, 0x86CB, 0x9FBF, 0x864E, 0x9E9A, 0x844B, 0x9E9A, 0x7668, 0x986E, 0x7668, 0x986E, 0x844B, 0x986E, 0x844B, 0x986E, 0x844B, 0xFFFF, 0xAAE2, 0x7AF5, 0xAAE2, 0x7902, 0xA9FB, 0x77C7, 0xA7D2, 0x7746, 0xA59F, 0x77C7, 0xA4B6, 0x7902, 0xA4B6, 0x7AF5, 0xAAE2, 0x7AF5, 0xAAE2, 0x7AF5, 0xAAE2, 0x7AF5}; + +#define LOGO_BACKGROUND logo_bg_rgb +#define LOGO_PAINT_PATHS \ + LOGO_PAINT_PATH(logo_fill_rgb, logo_fill) \ + LOGO_PAINT_PATH(logo_stroke_rgb, logo_stroke) 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 new file mode 100644 index 00000000..f4a80bcc --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.cpp @@ -0,0 +1,410 @@ +/************** + * sounds.cpp * + **************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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 "../compat.h" + +#if ENABLED(TOUCH_UI_FTDI_EVE) + +#include "../ftdi_eve_lib/ftdi_eve_lib.h" + +#include "sounds.h" + +namespace Theme { + using namespace FTDI; + + const PROGMEM SoundPlayer::sound_t chimes[] = { + {CHIMES, NOTE_G3, 5}, + {CHIMES, NOTE_E4, 5}, + {CHIMES, NOTE_C4, 5}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t sad_trombone[] = { + {TRUMPET, NOTE_A3S, 10}, + {TRUMPET, NOTE_A3 , 10}, + {TRUMPET, NOTE_G3S, 10}, + {TRUMPET, NOTE_G3, 20}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t twinkle[] = { + {GLOCKENSPIEL, NOTE_C4, 1}, + {GLOCKENSPIEL, NOTE_E4, 1}, + {GLOCKENSPIEL, NOTE_G4, 16}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t fanfare[] = { + {TRUMPET, NOTE_A3, 4}, + {SILENCE, REST, 1}, + {TRUMPET, NOTE_A3, 2}, + {SILENCE, REST, 1}, + {TRUMPET, NOTE_A3, 2}, + {SILENCE, REST, 1}, + {TRUMPET, NOTE_E4, 10}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t media_inserted[] = { + {MUSIC_BOX, NOTE_C4, 2}, + {MUSIC_BOX, NOTE_E4, 2}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t media_removed[] = { + {MUSIC_BOX, NOTE_E4, 2}, + {MUSIC_BOX, NOTE_C4, 2}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t js_bach_toccata[] = { + {ORGAN, NOTE_A4, 2}, + {ORGAN, NOTE_G4, 2}, + {ORGAN, NOTE_A4, 35}, + {SILENCE, REST, 12}, + {ORGAN, NOTE_G4, 4}, + {ORGAN, NOTE_F4, 4}, + {ORGAN, NOTE_E4, 4}, + {ORGAN, NOTE_D4, 4}, + {ORGAN, NOTE_C4S, 16}, + {ORGAN, NOTE_D4, 32}, + {SILENCE, REST, 42}, + + {ORGAN, NOTE_A3, 2}, + {ORGAN, NOTE_G3, 2}, + {ORGAN, NOTE_A3, 35}, + {SILENCE, REST, 9}, + {ORGAN, NOTE_E3, 8}, + {ORGAN, NOTE_F3, 8}, + {ORGAN, NOTE_C3S, 16}, + {ORGAN, NOTE_D3, 27}, + {SILENCE, REST, 42}, + + {ORGAN, NOTE_A2, 2}, + {ORGAN, NOTE_G2, 2}, + {ORGAN, NOTE_A2, 35}, + {SILENCE, REST, 12}, + {ORGAN, NOTE_G2, 4}, + {ORGAN, NOTE_F2, 4}, + {ORGAN, NOTE_E2, 4}, + {ORGAN, NOTE_D2, 4}, + {ORGAN, NOTE_C2S, 16}, + {ORGAN, NOTE_D2, 32}, + {SILENCE, REST, 52}, + + //{ORGAN, NOTE_D1, 28}, + {ORGAN, NOTE_C3S, 9}, + {ORGAN, NOTE_E3, 9}, + {ORGAN, NOTE_G3, 9}, + {ORGAN, NOTE_A3S, 9}, + {ORGAN, NOTE_C4S, 9}, + {ORGAN, NOTE_E4, 9}, + {ORGAN, NOTE_D4, 20}, + {SILENCE, REST, 30}, + + {ORGAN, NOTE_C4S, 4}, + {ORGAN, NOTE_D4, 2}, + {ORGAN, NOTE_E4, 2}, + + {ORGAN, NOTE_C4S, 2}, + {ORGAN, NOTE_D4, 2}, + {ORGAN, NOTE_E4, 2}, + + {ORGAN, NOTE_C4S, 2}, + {ORGAN, NOTE_D4, 2}, + {ORGAN, NOTE_E4, 2}, + + {ORGAN, NOTE_C4S, 2}, + {ORGAN, NOTE_D4, 4}, + {ORGAN, NOTE_E4, 4}, + {ORGAN, NOTE_F4, 2}, + {ORGAN, NOTE_G4, 2}, + + {ORGAN, NOTE_E4, 2}, + {ORGAN, NOTE_F4, 2}, + {ORGAN, NOTE_G4, 2}, + + {ORGAN, NOTE_E4, 2}, + {ORGAN, NOTE_F4, 2}, + {ORGAN, NOTE_G4, 2}, + + {ORGAN, NOTE_E4, 2}, + {ORGAN, NOTE_F4, 4}, + {ORGAN, NOTE_G4, 4}, + {ORGAN, NOTE_A4, 2}, + {ORGAN, NOTE_A4S, 2}, + + {ORGAN, NOTE_G4, 2}, + {ORGAN, NOTE_A4, 2}, + {ORGAN, NOTE_A4S, 2}, + + {ORGAN, NOTE_G4, 2}, + {ORGAN, NOTE_A4, 2}, + {ORGAN, NOTE_A4S, 2}, + + {ORGAN, NOTE_G4, 2}, + {ORGAN, NOTE_A4, 4}, + {SILENCE, REST, 36}, + + + {ORGAN, NOTE_C5S, 4}, + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_E5, 2}, + + {ORGAN, NOTE_C5S, 2}, + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_E5, 2}, + + {ORGAN, NOTE_C5S, 2}, + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_E5, 2}, + + {ORGAN, NOTE_C5S, 2}, + {ORGAN, NOTE_D5, 4}, + {ORGAN, NOTE_E5, 4}, + {ORGAN, NOTE_F5, 2}, + {ORGAN, NOTE_G5, 2}, + + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_F5, 2}, + {ORGAN, NOTE_G5, 2}, + + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_F5, 2}, + {ORGAN, NOTE_G5, 2}, + + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_F5, 4}, + {ORGAN, NOTE_G5, 4}, + {ORGAN, NOTE_A5, 2}, + {ORGAN, NOTE_A5S, 2}, + + {ORGAN, NOTE_G5, 2}, + {ORGAN, NOTE_A5, 2}, + {ORGAN, NOTE_A5S, 2}, + + {ORGAN, NOTE_G5, 2}, + {ORGAN, NOTE_A5, 2}, + {ORGAN, NOTE_A5S, 2}, + + {ORGAN, NOTE_G5, 2}, + {ORGAN, NOTE_A5, 4}, + {SILENCE, REST, 32}, + + {ORGAN, NOTE_A5, 4}, + {ORGAN, NOTE_G5, 2}, + {ORGAN, NOTE_A5S, 2}, + + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_G5, 2}, + {ORGAN, NOTE_A5S, 2}, + + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_F5, 2}, + {ORGAN, NOTE_A5, 2}, + + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_F5, 2}, + {ORGAN, NOTE_G5, 2}, + + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_A5, 2}, + + {ORGAN, NOTE_C5, 2}, + {ORGAN, NOTE_E5, 2}, + {ORGAN, NOTE_A5, 2}, + + {ORGAN, NOTE_C5, 2}, + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_F5, 2}, + + {ORGAN, NOTE_A4S, 2}, + {ORGAN, NOTE_D5, 2}, + {ORGAN, NOTE_E5, 2}, + + {ORGAN, NOTE_A4S, 2}, + {ORGAN, NOTE_C5, 2}, + {ORGAN, NOTE_E5, 2}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t js_bach_joy[] = { + {PIANO, NOTE_G3, 4}, + {PIANO, NOTE_A3, 4}, + {PIANO, NOTE_B3, 4}, + {PIANO, NOTE_D4, 3}, + {SILENCE, REST, 1}, + + {PIANO, NOTE_C4, 3}, + {SILENCE, REST, 1}, + {PIANO, NOTE_C4, 4}, + {PIANO, NOTE_E4, 3}, + {SILENCE, REST, 1}, + {PIANO, NOTE_D4, 2}, + {SILENCE, REST, 2}, + + {PIANO, NOTE_D4, 4}, + {PIANO, NOTE_G4 , 3}, + {SILENCE, REST, 1}, + {PIANO, NOTE_F4S, 4}, + {PIANO, NOTE_G4, 4}, + + {PIANO, NOTE_D4, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_B3, 3}, + {SILENCE, REST, 1}, + {PIANO, NOTE_G3, 4}, + {PIANO, NOTE_A3, 2}, + {SILENCE, REST, 2}, + + {PIANO, NOTE_B3, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_C4, 4}, + {PIANO, NOTE_D4, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_E4, 2}, + {SILENCE, REST, 2}, + + {PIANO, NOTE_D4, 4}, + {PIANO, NOTE_C4, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_B3, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_A3, 4}, + + {PIANO, NOTE_B3, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_G3, 2}, + {SILENCE, REST, 2}, + {PIANO, NOTE_G3, 8}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t big_band[] = { + {XYLOPHONE, NOTE_F4, 3}, + {XYLOPHONE, NOTE_G4, 3}, + {XYLOPHONE, NOTE_F4, 3}, + {XYLOPHONE, NOTE_D4, 3}, + {XYLOPHONE, NOTE_A3S, 3}, + {SILENCE, REST, 3}, + + {TRUMPET, NOTE_F4, 3}, + {TRUMPET, NOTE_G4, 3}, + {TRUMPET, NOTE_F4, 3}, + {TRUMPET, NOTE_D4, 3}, + {TRUMPET, NOTE_A3S, 3}, + {SILENCE, REST, 3}, + + {TUBA, NOTE_A2S, 6}, + {TUBA, NOTE_A2S, 6}, + {TUBA, NOTE_A2S, 4}, + {TUBA, NOTE_A2S, 6}, + {TUBA, NOTE_A2S, 6}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t beats[] = { + {SILENCE, REST, 8}, + {NOTCH, NOTE_C4, 8}, + {KICKDRUM, NOTE_C4, 8}, + {HIHAT, NOTE_C4, 8}, + {COWBELL, NOTE_C4, 8}, + {SILENCE, REST, 8}, + {NOTCH, NOTE_C4, 8}, + {KICKDRUM, NOTE_C4, 8}, + {HIHAT, NOTE_C4, 8}, + {COWBELL, NOTE_C4, 8}, + {SILENCE, REST, 8}, + {NOTCH, NOTE_C4, 8}, + {KICKDRUM, NOTE_C4, 8}, + {HIHAT, NOTE_C4, 8}, + {COWBELL, NOTE_C4, 8}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t beeping[] = { + {BEEPING, NOTE_C4, 64}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t alarm[] = { + {ALARM, NOTE_C4, 64}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t warble[] = { + {WARBLE, NOTE_C4, 64}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t carousel[] = { + {CAROUSEL, NOTE_C4, 64}, + {SILENCE, END_SONG, 0} + }; + + const PROGMEM SoundPlayer::sound_t all_instruments[] = { + {HARP}, + {XYLOPHONE}, + {TUBA}, + {GLOCKENSPIEL}, + {ORGAN}, + {TRUMPET}, + {PIANO}, + {CHIMES}, + {MUSIC_BOX}, + {BELL}, + {CLICK}, + {SWITCH}, + {COWBELL}, + {NOTCH}, + {HIHAT}, + {KICKDRUM}, + {SWITCH}, + {POP}, + {CLACK}, + {CHACK}, + {SILENCE, END_SONG, 0} + }; +}; // namespace Theme + +#define N_ELEMENTS(a) (sizeof(a)/sizeof(a[0])) + +const SoundList::list_t SoundList::list[] = { + {"Silence", FTDI::silence}, + {"Twinkle", Theme::twinkle}, + {"Chimes", Theme::chimes}, + {"Fanfare", Theme::fanfare}, + {"Sad Trombone", Theme::sad_trombone}, + {"Big Band", Theme::big_band}, + {"Beeping", Theme::beeping}, + {"Alarm", Theme::alarm}, + {"Warble", Theme::warble}, + {"Carousel", Theme::carousel}, + {"Beats", Theme::beats}, + {"Bach Joy", Theme::js_bach_joy}, + {"Bach Toccata", Theme::js_bach_toccata} +}; + +const uint8_t SoundList::n = N_ELEMENTS(SoundList::list); + +#endif // TOUCH_UI_FTDI_EVE 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 new file mode 100644 index 00000000..b2b88903 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/sounds.h @@ -0,0 +1,43 @@ +/************ + * sounds.h * + ************/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +namespace Theme { + using namespace FTDI; + + extern const PROGMEM SoundPlayer::sound_t chimes[]; + extern const PROGMEM SoundPlayer::sound_t sad_trombone[]; + extern const PROGMEM SoundPlayer::sound_t twinkle[]; + extern const PROGMEM SoundPlayer::sound_t fanfare[]; + extern const PROGMEM SoundPlayer::sound_t media_inserted[]; + extern const PROGMEM SoundPlayer::sound_t media_removed[]; + extern const PROGMEM SoundPlayer::sound_t js_bach_toccata[]; + extern const PROGMEM SoundPlayer::sound_t js_bach_joy[]; + extern const PROGMEM SoundPlayer::sound_t big_band[]; + extern const PROGMEM SoundPlayer::sound_t beats[]; + extern const PROGMEM SoundPlayer::sound_t beeping[]; + extern const PROGMEM SoundPlayer::sound_t alarm[]; + extern const PROGMEM SoundPlayer::sound_t warble[]; + extern const PROGMEM SoundPlayer::sound_t carousel[]; + extern const PROGMEM SoundPlayer::sound_t all_instruments[]; +}; // namespace Theme 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 new file mode 100644 index 00000000..df7782ce --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/theme.h @@ -0,0 +1,28 @@ +/*********** + * theme.h * + ***********/ + +/**************************************************************************** + * Written By Mark Pelletier 2017 - Aleph Objects, Inc. * + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +#include "bitmaps.h" +#include "colors.h" +#include "fonts.h" +#include "sounds.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 00000000..3f571244 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPIFlashStorage.cpp @@ -0,0 +1,320 @@ +/** + * 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 "../../../../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; +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; + #else + 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 00000000..98c8067b --- /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 "../../../../libs/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); + + // 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/SPI_TFT.cpp b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp new file mode 100644 index 00000000..394ce480 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.cpp @@ -0,0 +1,88 @@ +/** + * 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 "SPI_TFT.h" +#include "pic_manager.h" +#include "tft_lvgl_configuration.h" + +#include "../../../../inc/MarlinConfig.h" + +#include + +#include "draw_ui.h" + +TFT SPI_TFT; + +// use SPI1 for the spi tft. +void TFT::spi_init(uint8_t spiRate) { + tftio.Init(); +} + +void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { + if ((x > 480) || (y > 320)) return; + + setWindow(x, y, 1, 1); + tftio.WriteMultiple(point, (uint16_t)1); +} + +void TFT::setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { + tftio.set_window(x, y, (x + with - 1), (y + height - 1)); +} + +void TFT::LCD_init() { + tftio.InitTFT(); + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); + #endif + delay(100); + LCD_clear(0x0000); + LCD_Draw_Logo(); + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif + #if HAS_LOGO_IN_FLASH + delay(2000); + #endif +} + +void TFT::LCD_clear(uint16_t color) { + setWindow(0, 0, (TFT_WIDTH), (TFT_HEIGHT)); + tftio.WriteMultiple(color, (uint32_t)(TFT_WIDTH) * (TFT_HEIGHT)); +} + +extern unsigned char bmp_public_buf[17 * 1024]; + +void TFT::LCD_Draw_Logo() { + #if HAS_LOGO_IN_FLASH + setWindow(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); + } + #endif +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h new file mode 100644 index 00000000..696bc169 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/SPI_TFT.h @@ -0,0 +1,43 @@ +/** + * 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" + +#if HAS_TFT_LVGL_UI + +#include "../../../tft_io/tft_io.h" + +class TFT { +public: + TFT_IO tftio; + void spi_init(uint8_t spiRate); + void SetPoint(uint16_t x, uint16_t y, uint16_t point); + void setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height); + void LCD_init(); + void LCD_clear(uint16_t color); + void LCD_Draw_Logo(); +}; + +extern TFT SPI_TFT; + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp new file mode 100644 index 00000000..34b74278 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.cpp @@ -0,0 +1,125 @@ +/** + * 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 "../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 "../../../../module/temperature.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t * fw_type, *board; //*fw_version; + +#define ID_A_RETURN 1 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_A_RETURN: + if (event == LV_EVENT_CLICKED) { + // do nothing + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_about(void) { + lv_obj_t *buttonBack, *label_Back; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ABOUT_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ABOUT_UI; + } + disp_state = ABOUT_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()); + + // Create an Image button + buttonBack = lv_imgbtn_create(scr, NULL); + + #if 1 + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_A_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + #endif + + 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 + 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_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + + //fw_version = lv_label_create(scr, NULL); + //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_label_rel); + lv_label_set_text(fw_type, "Firmware: Marlin " SHORT_BUILD_VERSION); + lv_obj_align(fw_type, NULL, LV_ALIGN_CENTER, 0, -20); + + board = lv_label_create(scr, NULL); + 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, -60); +} + +void lv_clear_about() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h new file mode 100644 index 00000000..2ee7ec04 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.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_about(void); +extern void lv_clear_about(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..a30c99db --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.cpp @@ -0,0 +1,449 @@ +/** + * 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" + +extern lv_group_t * g; +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 *labelPrintText = NULL, *buttonPrintValue = NULL, *labelPrintValue = NULL; + lv_obj_t *labelRetraText = NULL, *buttonRetraValue = NULL, *labelRetraValue = NULL; + lv_obj_t *labelTravelText = NULL, *buttonTravelValue = NULL, *labelTravelValue = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *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()); + + if (uiCfg.para_ui_page != 1) { + + labelPrintText = lv_label_create(scr, NULL); + lv_obj_set_style(labelPrintText, &tft_style_label_rel); + lv_obj_set_pos(labelPrintText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelPrintText, machine_menu.PrintAcceleration); + + buttonPrintValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonPrintValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonPrintValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonPrintValue, event_handler, ID_ACCE_PRINT, NULL, 0); + lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonPrintValue, LV_BTN_STYLE_PR, &style_para_value); + labelPrintValue = lv_label_create(buttonPrintValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelRetraText = lv_label_create(scr, NULL); + lv_obj_set_style(labelRetraText, &tft_style_label_rel); + lv_obj_set_pos(labelRetraText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelRetraText, machine_menu.RetractAcceleration); + + buttonRetraValue = lv_btn_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_size(buttonRetraValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonRetraValue, event_handler, ID_ACCE_RETRA, NULL, 0); + lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonRetraValue, LV_BTN_STYLE_PR, &style_para_value); + labelRetraValue = lv_label_create(buttonRetraValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelTravelText = lv_label_create(scr, NULL); + lv_obj_set_style(labelTravelText, &tft_style_label_rel); + lv_obj_set_pos(labelTravelText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelTravelText, machine_menu.TravelAcceleration); + + buttonTravelValue = lv_btn_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_size(buttonTravelValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonTravelValue, event_handler, ID_ACCE_TRAVEL, NULL, 0); + lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonTravelValue, LV_BTN_STYLE_PR, &style_para_value); + labelTravelValue = lv_label_create(buttonTravelValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelXText, machine_menu.X_Acceleration); + + buttonXValue = lv_btn_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_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_ACCE_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPrintValue); + lv_group_add_obj(g, buttonRetraValue); + lv_group_add_obj(g, buttonTravelValue); + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelYText, machine_menu.Y_Acceleration); + + buttonYValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Acceleration); + + buttonZValue = lv_btn_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_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_ACCE_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0_Acceleration); + + buttonE0Value = lv_btn_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_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_ACCE_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE1Text, machine_menu.E1_Acceleration); + + buttonE1Value = lv_btn_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_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_ACCE_Y, NULL, 0); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_ACCE_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_ACCE_UP, NULL, 0); + //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + //lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + //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_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + //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); + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_ACCE_RETURN, NULL, 0); + //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + //lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + //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_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + //lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + //lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + + 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(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() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..6ab49713 --- /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 00000000..5b1b2417 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.cpp @@ -0,0 +1,334 @@ +/** + * 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" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_ADVANCE_RETURN 1 +#define ID_PAUSE_POS 2 +#define ID_PAUSE_POS_ARROW 3 +#define ID_WIFI_PARA 4 +#define ID_WIFI_PARA_ARROW 5 +#define ID_FILAMENT_SETTINGS 6 +#define ID_FILAMENT_SETTINGS_ARROW 7 +#define ID_ENCODER_SETTINGS 8 +#define ID_ENCODER_SETTINGS_ARROW 9 + +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; + case ID_FILAMENT_SETTINGS: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_filament_settings(); + } + break; + case ID_FILAMENT_SETTINGS_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_filament_settings(); + } + break; + #if ENABLED(USE_WIFI_FUNCTION) + case ID_WIFI_PARA: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_wifi_settings(); + } + break; + case ID_WIFI_PARA_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_wifi_settings(); + } + break; + #endif + #if HAS_ROTARY_ENCODER + case ID_ENCODER_SETTINGS: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_encoder_settings(); + } + break; + case ID_ENCODER_SETTINGS_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_advance_settings(); + lv_draw_encoder_settings(); + } + break; + #endif + } +} + +void lv_draw_advance_settings(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonPausePos, *labelPausePos, *buttonPausePosNarrow; + lv_obj_t *buttonFilamentSettings, *labelFilamentSettings, *buttonFilamentSettingsNarrow; + lv_obj_t * line1,* line2; + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_t *buttonWifiSet,*labelWifiSet,*buttonWifiSetNarrow; + #endif + #if HAS_ROTARY_ENCODER + lv_obj_t *buttonEcoder,*labelEcoder,*buttonEcoderNarrow; + #endif + + 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()); + + buttonPausePos = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonPausePos, PARA_UI_POS_X, PARA_UI_POS_Y); + lv_obj_set_size(buttonPausePos, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); + //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); + lv_btn_set_style(buttonPausePos, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonPausePos, LV_LAYOUT_OFF); + labelPausePos = lv_label_create(buttonPausePos, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPausePos); + #endif + + 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, NULL, 0); + lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonPausePosNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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]); + + buttonFilamentSettings = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonFilamentSettings, PARA_UI_POS_X, PARA_UI_POS_Y*2); + lv_obj_set_size(buttonFilamentSettings, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonFilamentSettings, event_handler, ID_FILAMENT_SETTINGS, NULL, 0); + lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonFilamentSettings, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonFilamentSettings, LV_LAYOUT_OFF); + labelFilamentSettings = lv_label_create(buttonFilamentSettings, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonFilamentSettings); + #endif + + buttonFilamentSettingsNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonFilamentSettingsNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y*2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonFilamentSettingsNarrow, event_handler, ID_FILAMENT_SETTINGS_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonFilamentSettingsNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonFilamentSettingsNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(lv_scr_act(), NULL); + lv_ex_line(line2, line_points[1]); + + #if ENABLED(USE_WIFI_FUNCTION) + + buttonWifiSet = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonWifiSet, PARA_UI_POS_X,PARA_UI_POS_Y*3); + lv_obj_set_size(buttonWifiSet, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonWifiSet, event_handler,ID_WIFI_PARA,NULL,0); + lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonWifiSet, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonWifiSet, LV_LAYOUT_OFF); + labelWifiSet = lv_label_create(buttonWifiSet, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonWifiSet); + #endif + + buttonWifiSetNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonWifiSetNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonWifiSetNarrow, event_handler,ID_WIFI_PARA_ARROW, NULL,0); + lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonWifiSetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonWifiSetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonWifiSetNarrow, LV_LAYOUT_OFF); + + lv_obj_t * line3 = lv_line_create(scr, NULL); + lv_ex_line(line3,line_points[2]); + + #if HAS_ROTARY_ENCODER + buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*4); + lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); + labelEcoder = lv_label_create(buttonEcoder, NULL); + + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); + + buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*4+PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); + + lv_obj_t * line4 = lv_line_create(scr, NULL); + lv_ex_line(line4,line_points[3]); + #endif + + #elif HAS_ROTARY_ENCODER + buttonEcoder = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonEcoder, PARA_UI_POS_X,PARA_UI_POS_Y*3); + lv_obj_set_size(buttonEcoder, PARA_UI_SIZE_X,PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonEcoder, event_handler,ID_ENCODER_SETTINGS,NULL,0); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonEcoder, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonEcoder, LV_LAYOUT_OFF); + labelEcoder = lv_label_create(buttonEcoder, NULL); + + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonEcoder); + + buttonEcoderNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEcoderNarrow,PARA_UI_POS_X+PARA_UI_SIZE_X,PARA_UI_POS_Y*3+PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonEcoderNarrow, event_handler,ID_ENCODER_SETTINGS_ARROW, NULL,0); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonEcoderNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEcoderNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonEcoderNarrow, LV_LAYOUT_OFF); + + lv_obj_t * line3 = lv_line_create(scr, 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_ADVANCE_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + 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); + + lv_label_set_text(labelFilamentSettings, machine_menu.FilamentConf); + lv_obj_align(labelFilamentSettings, buttonFilamentSettings, LV_ALIGN_IN_LEFT_MID, 0, 0); + + #if ENABLED(USE_WIFI_FUNCTION) + lv_label_set_text(labelWifiSet, machine_menu.WifiSettings); + lv_obj_align(labelWifiSet, buttonWifiSet, LV_ALIGN_IN_LEFT_MID,0, 0); + #endif + #if HAS_ROTARY_ENCODER + lv_label_set_text(labelEcoder, machine_menu.EncoderSettings); + lv_obj_align(labelEcoder, buttonEcoder, LV_ALIGN_IN_LEFT_MID,0, 0); + #endif + } + +} + +void lv_clear_advance_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..84e4a4d4 --- /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_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp new file mode 100644 index 00000000..bb6b45ae --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.cpp @@ -0,0 +1,203 @@ +/** + * 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_BED_PROBE) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" +#include "../../../../module/probe.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_OFFSET_RETURN 1 +#define ID_OFFSET_X 2 +#define ID_OFFSET_Y 3 +#define ID_OFFSET_Z 4 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_OFFSET_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_auto_level_offset_settings(); + draw_return_ui(); + } + break; + case ID_OFFSET_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = x_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); + } + break; + case ID_OFFSET_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = y_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); + } + break; + case ID_OFFSET_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = z_offset; + lv_clear_auto_level_offset_settings(); + lv_draw_number_key(); + } + break; + } +} + +void lv_draw_auto_level_offset_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *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] != NOZZLE_PROBE_OFFSET_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = NOZZLE_PROBE_OFFSET_UI; + } + disp_state = NOZZLE_PROBE_OFFSET_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.OffsetConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.Xoffset); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_OFFSET_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Yoffset); + + buttonYValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_OFFSET_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Zoffset); + + buttonZValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_OFFSET_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_OFFSET_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonBack); + } + #endif + + if (gCfgItems.multiple_language != 0) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%.1f"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.x, 0)); + 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"), TERN(HAS_PROBE_XY_OFFSET, probe.offset.y, 0)); + 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"), probe.offset.z); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, 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_auto_level_offset_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI && HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h new file mode 100644 index 00000000..688cd205 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_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_auto_level_offset_settings(void); +extern void lv_clear_auto_level_offset_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp new file mode 100644 index 00000000..70564c03 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.cpp @@ -0,0 +1,352 @@ +/** + * 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 "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" + +#if HAS_BED_PROBE + #include "../../../../module/probe.h" +#endif + +extern lv_group_t * g; +static lv_obj_t * scr; + +static lv_obj_t *labelV, *buttonV, * zOffsetText; + +#define ID_BABY_STEP_X_P 1 +#define ID_BABY_STEP_X_N 2 +#define ID_BABY_STEP_Y_P 3 +#define ID_BABY_STEP_Y_N 4 +#define ID_BABY_STEP_Z_P 5 +#define ID_BABY_STEP_Z_N 6 +#define ID_BABY_STEP_DIST 7 +#define ID_BABY_STEP_RETURN 8 + +static float babystep_dist=0.01; +static uint8_t has_adjust_z = 0; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + char baby_buf[30]={0}; + switch (obj->mks_obj_id) { + case ID_BABY_STEP_X_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 X%.3f"),babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_X_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 X%.3f"),((float)0 - babystep_dist)); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Y_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Y%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Y_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Y%.3f"),((float)0 - babystep_dist)); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Z_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Z%.3f"), babystep_dist); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_Z_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + ZERO(baby_buf); + sprintf_P(baby_buf, PSTR("M290 Z%.3f"),((float)0 - babystep_dist)); + gcode.process_subcommands_now_P(PSTR(baby_buf)); + has_adjust_z = 1; + } + break; + case ID_BABY_STEP_DIST: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (abs((int)(100 * babystep_dist)) == 1) + babystep_dist = 0.05; + else if (abs((int)(100 * babystep_dist)) == 5) + babystep_dist = 0.1; + else + babystep_dist = 0.01; + disp_baby_step_dist(); + } + + break; + case ID_BABY_STEP_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (has_adjust_z == 1) { + gcode.process_subcommands_now_P(PSTR("M500")); + has_adjust_z = 0; + } + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_baby_stepping(void) { + lv_obj_t *buttonXI, *buttonXD, *buttonYI, *buttonYD, *buttonZI, *buttonZD, *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != BABY_STEP_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = BABY_STEP_UI; + } + disp_state = BABY_STEP_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()); + + // 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); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_BABY_STEP_X_P, NULL, 0); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); + 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); + + #if 1 + lv_obj_set_event_cb_mks(buttonXD, event_handler, ID_BABY_STEP_X_N, NULL, 0); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); + 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_BABY_STEP_Y_P, NULL, 0); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); + 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_BABY_STEP_Y_N, NULL, 0); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); + 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_BABY_STEP_Z_P, NULL, 0); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); + 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_BABY_STEP_Z_N, NULL, 0); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); + 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_BABY_STEP_DIST, NULL, 0); + 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_BABY_STEP_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); + lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); + lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); + lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); + lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); + lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); + 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); + + lv_label_set_text(labelXD, move_menu.x_dec); + lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelYI, move_menu.y_add); + lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelYD, move_menu.y_dec); + lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelZI, move_menu.z_add); + lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelZD, move_menu.z_dec); + lv_obj_align(labelZD, buttonZD, 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); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXI); + lv_group_add_obj(g, buttonXD); + lv_group_add_obj(g, buttonYI); + lv_group_add_obj(g, buttonYD); + lv_group_add_obj(g, buttonZI); + lv_group_add_obj(g, buttonZD); + lv_group_add_obj(g, buttonV); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_baby_step_dist(); + + zOffsetText = lv_label_create(scr, NULL); + lv_obj_set_style(zOffsetText, &tft_style_label_rel); + lv_obj_set_pos(zOffsetText, 290, TITLE_YPOS); + disp_z_offset_value(); +} + +void disp_baby_step_dist() { + // char buf[30] = {0}; + + if ((int)(100 * babystep_dist) == 1) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_01.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_01.bin"); + } + else if ((int)(100 * babystep_dist) == 5) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_05.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_05.bin"); + } + else if ((int)(100 * babystep_dist) == 10) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_baby_move0_1.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_baby_move0_1.bin"); + } + if (gCfgItems.multiple_language != 0) { + if ((int)(100 * babystep_dist) == 1) { + lv_label_set_text(labelV, move_menu.step_001mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if ((int)(100 * babystep_dist) == 5) { + lv_label_set_text(labelV, move_menu.step_005mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if ((int)(100 * babystep_dist) == 10) { + lv_label_set_text(labelV, move_menu.step_01mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void disp_z_offset_value() { + char buf[20]; + + ZERO(buf); + sprintf_P(buf, PSTR("offset Z: %.3f"), (double)TERN(HAS_BED_PROBE, probe.offset.z, 0)); + lv_label_set_text(zOffsetText, buf); +} + +void lv_clear_baby_stepping() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h new file mode 100644 index 00000000..333ba2d5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h @@ -0,0 +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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_baby_stepping(void); +extern void lv_clear_baby_stepping(); +extern void disp_baby_step_dist(); +extern void disp_z_offset_value(); + +//extern void disp_temp_ready_print(); +#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 new file mode 100644 index 00000000..c60000af --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.cpp @@ -0,0 +1,356 @@ +/** + * 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 "../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 "../../../../module/temperature.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *labelStep, *buttonStep, *buttonMov, *buttonExt; +static lv_obj_t *labelMov, *labelExt; +static lv_obj_t * printSpeedText; + +#define ID_C_ADD 1 +#define ID_C_DEC 2 +#define ID_C_MOVE 3 +#define ID_C_EXT 4 +#define ID_C_STEP 5 +#define ID_C_RETURN 6 + +static uint8_t speedType; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_C_ADD: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (speedType == 0) { + if (feedrate_percentage < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) + feedrate_percentage += uiCfg.stepPrintSpeed; + else + feedrate_percentage = MAX_EXT_SPEED_PERCENT; + } + else if (speedType == 1) { + if (planner.flow_percentage[0] < MAX_EXT_SPEED_PERCENT - uiCfg.stepPrintSpeed) + planner.flow_percentage[0] += uiCfg.stepPrintSpeed; + else + planner.flow_percentage[0] = MAX_EXT_SPEED_PERCENT; + //planner.e_factor[0]= planner.flow_percentage[0]*0.01; + //planner.flow_percentage[1] = planner.flow_percentage[0]; + //planner.e_factor[1]= planner.flow_percentage[1]*0.01; + planner.refresh_e_factor(0); + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = planner.flow_percentage[0]; + planner.refresh_e_factor(1); + #endif + } + disp_print_speed(); + } + break; + case ID_C_DEC: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (speedType == 0) { + if (feedrate_percentage > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) + feedrate_percentage -= uiCfg.stepPrintSpeed; + else + feedrate_percentage = MIN_EXT_SPEED_PERCENT; + } + else if (speedType == 1) { + if (planner.flow_percentage[0] > MIN_EXT_SPEED_PERCENT + uiCfg.stepPrintSpeed) + planner.flow_percentage[0] -= uiCfg.stepPrintSpeed; + else + planner.flow_percentage[0] = MIN_EXT_SPEED_PERCENT; + //planner.e_factor[0]= planner.flow_percentage[0] * 0.01; + //planner.flow_percentage[1] = planner.flow_percentage[0]; + //planner.e_factor[1]= planner.flow_percentage[1] * 0.01; + planner.refresh_e_factor(0); + #if HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = planner.flow_percentage[0]; + planner.refresh_e_factor(1); + #endif + } + disp_print_speed(); + } + break; + case ID_C_MOVE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + speedType = 0; + disp_speed_type(); + disp_print_speed(); + } + break; + case ID_C_EXT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + speedType = 1; + disp_speed_type(); + disp_print_speed(); + } + break; + case ID_C_STEP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.stepPrintSpeed == 1) + uiCfg.stepPrintSpeed = 5; + else if (uiCfg.stepPrintSpeed == 5) + uiCfg.stepPrintSpeed = 10; + else + uiCfg.stepPrintSpeed = 1; + disp_speed_step(); + } + break; + case ID_C_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_change_speed(void) { + lv_obj_t *buttonAdd, *buttonDec; + lv_obj_t *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != CHANGE_SPEED_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = CHANGE_SPEED_UI; + } + disp_state = CHANGE_SPEED_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()); + + + // 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); + buttonStep = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_C_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); + 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); + + #if 1 + lv_obj_set_event_cb_mks(buttonDec, event_handler, ID_C_DEC, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); + 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(buttonMov, event_handler, ID_C_MOVE, NULL, 0); + 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_obj_set_event_cb_mks(buttonExt, event_handler, ID_C_EXT, NULL, 0); + 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_obj_set_event_cb_mks(buttonStep, event_handler, ID_C_STEP, NULL, 0); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonMov, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonExt, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + 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); + labelStep = lv_label_create(buttonStep, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelAdd, speed_menu.add); + lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelDec, speed_menu.dec); + lv_obj_align(labelDec, buttonDec, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttonMov); + lv_group_add_obj(g, buttonExt); + lv_group_add_obj(g, buttonStep); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_speed_type(); + disp_speed_step(); + + printSpeedText = lv_label_create(scr, NULL); + lv_obj_set_style(printSpeedText, &tft_style_label_rel); + disp_print_speed(); +} + +void disp_speed_step() { + if (uiCfg.stepPrintSpeed == 1) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_percent.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_percent.bin"); + } + else if (uiCfg.stepPrintSpeed == 5) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_percent.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_percent.bin"); + } + else if (uiCfg.stepPrintSpeed == 10) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_percent.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_percent.bin"); + } + if (gCfgItems.multiple_language != 0) { + if (uiCfg.stepPrintSpeed == 1) { + lv_label_set_text(labelStep, speed_menu.step_1percent); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.stepPrintSpeed == 5) { + lv_label_set_text(labelStep, speed_menu.step_5percent); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.stepPrintSpeed == 10) { + lv_label_set_text(labelStep, speed_menu.step_10percent); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void disp_print_speed() { + char buf[30] = { 0 }; + + public_buf_l[0] = '\0'; + + if (speedType == 0) { // move + strcat(public_buf_l, speed_menu.move_speed); + 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_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); + lv_obj_align(printSpeedText, NULL, LV_ALIGN_CENTER, 0, -65); +} + +void disp_speed_type() { + switch (speedType) { + case 1: + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_changeSpeed.bin"); + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_changeSpeed.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_extruct_sel.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_extruct_sel.bin"); + break; + + default: + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_REL, "F:/bmp_mov_sel.bin"); + lv_imgbtn_set_src(buttonMov, LV_BTN_STATE_PR, "F:/bmp_mov_sel.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_REL, "F:/bmp_speed_extruct.bin"); + lv_imgbtn_set_src(buttonExt, LV_BTN_STATE_PR, "F:/bmp_speed_extruct.bin"); + break; + } + lv_obj_refresh_ext_draw_pad(buttonExt); + lv_obj_refresh_ext_draw_pad(buttonMov); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelMov, speed_menu.move); + lv_obj_align(labelMov, buttonMov, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelExt, speed_menu.extrude); + lv_obj_align(labelExt, buttonExt, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } +} + +void lv_clear_change_speed() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI 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 new file mode 100644 index 00000000..c4996a3e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -0,0 +1,40 @@ +/** + * 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 + +#define MIN_EXT_SPEED_PERCENT 10 +#define MAX_EXT_SPEED_PERCENT 999 + +extern void lv_draw_change_speed(void); +extern void lv_clear_change_speed(); +extern void disp_speed_step(); +extern void disp_print_speed(); +extern void disp_speed_type(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp new file mode 100644 index 00000000..c8483230 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -0,0 +1,703 @@ +/** + * 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 . + * + */ + +/** + * draw_dialog.cpp + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#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" +//#include "../lvgl/src/lv_core/lv_refr.h" + +#include "../../../../MarlinCore.h" +#include "../../../../sd/cardreader.h" +#include "../../../../gcode/queue.h" +#include "../../../../module/temperature.h" +#include "../../../../module/planner.h" +#include "../../../../gcode/gcode.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../../../feature/pause.h" +#endif +#include "../../../../gcode/gcode.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t * tempText1; +static lv_obj_t * filament_bar; + +extern uint8_t sel_id; +extern uint8_t once_flag; +extern uint8_t gcode_preview_over; +extern int upload_result ; +extern uint32_t upload_time; +extern uint32_t upload_size; +extern uint8_t temperature_change_frequency; + +static void btn_ok_event_cb(lv_obj_t * btn, lv_event_t event) { + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { + #if HAS_GCODE_PREVIEW + preview_gcode_prehandle(list_file.file_name[sel_id]); + #endif + reset_print_time(); + start_print_time(); + + uiCfg.print_state = WORKING; + lv_clear_dialog(); + 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 HAS_MULTI_EXTRUDER + 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 (uiCfg.dialogType == DIALOG_TYPE_STOP) { + wait_for_heatup = false; + stop_print_time(); + lv_clear_dialog(); + lv_draw_ready_print(); + + #if ENABLED(SDSUPPORT) + //card.endFilePrint(); + //wait_for_heatup = false; + uiCfg.print_state = IDLE; + card.flag.abort_sd_printing = true; + //queue.clear(); + //quickstop_stepper(); + //print_job_timer.stop(); + //thermalManager.disable_all_heaters(); + + //#if ENABLED(POWER_LOSS_RECOVERY) + // recovery.purge(); + //#endif + //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 + } + else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { + clear_cur_ui(); + lv_draw_ready_print(); + } + #if ENABLED(ADVANCED_PAUSE_FEATURE) + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT + ) { + wait_for_user = false; + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + clear_cur_ui(); + draw_return_ui(); + } + #endif + else if (uiCfg.dialogType == DIALOG_STORE_EEPROM_TIPS) { + gcode.process_subcommands_now_P(PSTR("M500")); + clear_cur_ui(); + draw_return_ui(); + } + else if (uiCfg.dialogType == DIALOG_READ_EEPROM_TIPS) { + gcode.process_subcommands_now_P(PSTR("M501")); + clear_cur_ui(); + draw_return_ui(); + } + else if (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { + gcode.process_subcommands_now_P(PSTR("M502")); + clear_cur_ui(); + draw_return_ui(); + } + else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { + uiCfg.configWifi = 1; + clear_cur_ui(); + draw_return_ui(); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { + uiCfg.filament_heat_completed_load = 1; + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { + uiCfg.filament_heat_completed_unload = 1; + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED + ) { + clear_cur_ui(); + draw_return_ui(); + } + } +} + +static void btn_cancel_event_cb(lv_obj_t * btn, lv_event_t event) { + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + #if ENABLED(ADVANCED_PAUSE_FEATURE) + pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; + #endif + } + else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) + ) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; + clear_cur_ui(); + draw_return_ui(); + } + else if ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) + ) { + queue.enqueue_one_P(PSTR("M410")); + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + uiCfg.filament_unloading_completed = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_cnt = 0; + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + clear_cur_ui(); + draw_return_ui(); + } + else { + clear_cur_ui(); + draw_return_ui(); + } + } +} + +void lv_draw_dialog(uint8_t type) { + + lv_obj_t * btnOk = NULL; + lv_obj_t * btnCancel = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != DIALOG_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = DIALOG_UI; + } + disp_state = DIALOG_UI; + + uiCfg.dialogType = type; + + 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()); + + + 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.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 = &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 + 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.shadow.width = 2; + 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_label_rel); + + if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + 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 + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT + ) { + 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 + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME + || uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING + ) { + // nothing to do + } + else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + } + else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + } + #if ENABLED(USE_WIFI_FUNCTION) + else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { + if (upload_result == 2) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + } + else if (upload_result == 3) { + btnOk = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnOk, 100, 50); + lv_obj_set_event_cb(btnOk, btn_ok_event_cb); + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); + } + } + #endif //USE_WIFI_FUNCTION + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT + ) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + + tempText1 = lv_label_create(scr, NULL); + lv_obj_set_style(tempText1, &tft_style_label_rel); + filament_sprayer_temp(); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED + ) { + btnOk = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnOk, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnOk, 100, 50); + lv_obj_set_event_cb(btnOk, btn_ok_event_cb); + lv_btn_set_style(btnOk, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnOk, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelOk = lv_label_create(btnOk, NULL); + lv_label_set_text(labelOk, print_file_dialog_menu.confirm); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING + ) { + btnCancel = lv_btn_create(scr, NULL); + lv_obj_set_pos(btnCancel, BTN_OK_X+90, BTN_OK_Y); + lv_obj_set_size(btnCancel, 100, 50); + lv_obj_set_event_cb(btnCancel, btn_cancel_event_cb); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_REL, &style_btn_rel); + lv_btn_set_style(btnCancel, LV_BTN_STYLE_PR, &style_btn_pr); + lv_obj_t *labelCancel = lv_label_create(btnCancel, NULL); + lv_label_set_text(labelCancel, print_file_dialog_menu.cancle); + + filament_bar = lv_bar_create(scr, NULL); + lv_obj_set_pos(filament_bar, (TFT_WIDTH-400)/2, ((TFT_HEIGHT - titleHeight)-40)/2); + lv_obj_set_size(filament_bar, 400, 25); + lv_bar_set_style(filament_bar, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); + lv_bar_set_anim_time(filament_bar, 1000); + lv_bar_set_value(filament_bar, 0, LV_ANIM_ON); + } + else { + 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 + + 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 + + if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + 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(labelCancel, print_file_dialog_menu.cancle); + } + } + if (uiCfg.dialogType == DIALOG_TYPE_PRINT_FILE) { + lv_label_set_text(labelDialog, print_file_dialog_menu.print_file); + 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_label_rel); + + lv_label_set_text(labelFile, list_file.long_name[sel_id]); + lv_obj_align(labelFile, NULL, LV_ALIGN_CENTER, 0, -60); + } + else if (uiCfg.dialogType == DIALOG_TYPE_STOP) { + lv_label_set_text(labelDialog, print_file_dialog_menu.cancle_print); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FINISH_PRINT) { + lv_label_set_text(labelDialog, print_file_dialog_menu.print_finish); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PAUSING) { + lv_label_set_text(labelDialog, pause_msg_menu.pausing); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_CHANGING) { + lv_label_set_text(labelDialog, pause_msg_menu.changing); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_UNLOAD) { + lv_label_set_text(labelDialog, pause_msg_menu.unload); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_WAITING) { + lv_label_set_text(labelDialog, pause_msg_menu.waiting); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_INSERT) { + lv_label_set_text(labelDialog, pause_msg_menu.insert); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_LOAD) { + lv_label_set_text(labelDialog, pause_msg_menu.load); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_PURGE) { + lv_label_set_text(labelDialog, pause_msg_menu.purge); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_RESUME) { + lv_label_set_text(labelDialog, pause_msg_menu.resume); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEAT) { + lv_label_set_text(labelDialog, pause_msg_menu.heat); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_HEATING) { + lv_label_set_text(labelDialog, pause_msg_menu.heating); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_PAUSE_MESSAGE_OPTION) { + lv_label_set_text(labelDialog, pause_msg_menu.option); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.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 (uiCfg.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 (uiCfg.dialogType == DIALOG_REVERT_EEPROM_TIPS) { + lv_label_set_text(labelDialog, eeprom_menu.revertTips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_WIFI_CONFIG_TIPS) { + lv_label_set_text(labelDialog, machine_menu.wifiConfigTips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == WIFI_ENABLE_TIPS) { + lv_label_set_text(labelDialog, print_file_dialog_menu.wifi_enable_tips); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TRANSFER_NO_DEVICE) { + lv_label_set_text(labelDialog, DIALOG_UPDATE_NO_DEVICE_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + #if ENABLED(USE_WIFI_FUNCTION) + else if (uiCfg.dialogType == DIALOG_TYPE_UPLOAD_FILE) { + if (upload_result == 1) { + lv_label_set_text(labelDialog, DIALOG_UPLOAD_ING_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (upload_result == 2) { + lv_label_set_text(labelDialog, DIALOG_UPLOAD_ERROR_EN); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (upload_result == 3) { + char buf[200]; + int _index = 0; + + ZERO(buf); + + strcpy(buf, DIALOG_UPLOAD_FINISH_EN); + _index = strlen(buf); + buf[_index] = '\n'; + _index++; + strcat(buf, DIALOG_UPLOAD_SIZE_EN); + + _index = strlen(buf); + buf[_index] = ':'; + _index++; + sprintf(&buf[_index], " %d KBytes\n", (int)(upload_size / 1024)); + + strcat(buf, DIALOG_UPLOAD_TIME_EN); + _index = strlen(buf); + buf[_index] = ':'; + _index++; + sprintf(&buf[_index], " %d s\n", (int)upload_time); + + strcat(buf, DIALOG_UPLOAD_SPEED_EN); + _index = strlen(buf); + buf[_index] = ':'; + _index++; + sprintf(&buf[_index], " %d KBytes/s\n", (int)(upload_size / upload_time / 1024)); + + lv_label_set_text(labelDialog, buf); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + + } + } + #endif //USE_WIFI_FUNCTION + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_heat_confirm); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_heat_confirm); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_load_completed); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unload_completed); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -20); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_loading); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + } + else if (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING) { + lv_label_set_text(labelDialog, filament_menu.filament_dialog_unloading); + lv_obj_align(labelDialog, NULL, LV_ALIGN_CENTER, 0, -70); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + if (btnOk) lv_group_add_obj(g, btnOk); + if (btnCancel) lv_group_add_obj(g, btnCancel); + } + #endif +} + +void filament_sprayer_temp() { + char buf[20] = {0}; + + public_buf_l[0] = '\0'; + + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, preheat_menu.ext1); + else + strcat(public_buf_l, preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + + 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); +} + +void filament_dialog_handle() { + if ((temperature_change_frequency == 1) + && ((uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOAD_HEAT) + || (uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOAD_HEAT)) + ) { + filament_sprayer_temp(); + temperature_change_frequency = 0; + } + if (uiCfg.filament_heat_completed_load == 1) { + uiCfg.filament_heat_completed_load = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOADING); + planner.synchronize(); + uiCfg.filament_loading_time_flg = 1; + uiCfg.filament_loading_time_cnt = 0; + ZERO(public_buf_m); + sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_load_length,gCfgItems.filamentchange_load_speed); + queue.inject_P(PSTR(public_buf_m)); + //gcode.process_subcommands_now_P(PSTR(public_buf_m)); + } + if (uiCfg.filament_heat_completed_unload == 1) { + uiCfg.filament_heat_completed_unload = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOADING); + planner.synchronize(); + uiCfg.filament_unloading_time_flg = 1; + uiCfg.filament_unloading_time_cnt = 0; + ZERO(public_buf_m); + sprintf_P(public_buf_m,PSTR("T%d\nG91\nG1 E-%d F%d\nG90"),uiCfg.curSprayerChoose,gCfgItems.filamentchange_unload_length,gCfgItems.filamentchange_unload_speed); + queue.inject_P(PSTR(public_buf_m)); + } + + if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) + && (uiCfg.filament_load_heat_flg == 1) + ) { + uiCfg.filament_load_heat_flg = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + } + + if (uiCfg.filament_loading_completed == 1) { + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); + } + if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) + && (uiCfg.filament_unload_heat_flg == 1) + ) { + uiCfg.filament_unload_heat_flg = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + } + + if (uiCfg.filament_unloading_completed == 1) { + uiCfg.filament_rate = 0; + uiCfg.filament_unloading_completed = 0; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED); + } + + if ( uiCfg.dialogType == DIALOG_TYPE_FILAMENT_LOADING + || uiCfg.dialogType == DIALOG_TYPE_FILAMENT_UNLOADING + ) lv_filament_setbar(); +} + +void lv_filament_setbar() { + lv_bar_set_value(filament_bar, uiCfg.filament_rate, LV_ANIM_ON); +} + +void lv_clear_dialog() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#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 new file mode 100644 index 00000000..dc5adc5a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -0,0 +1,88 @@ +/** + * 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 + +#define DIALOG_TYPE_STOP 0 +#define DIALOG_TYPE_PRINT_FILE 1 +#define DIALOG_TYPE_REPRINT_NO_FILE 2 + +#define DIALOG_TYPE_M80_FAIL 3 //** +#define DIALOG_TYPE_MESSAGE_ERR1 4 //** + +#define DIALOG_TYPE_UPDATE_ESP_FIRMARE 5 +#define DIALOG_TYPE_UPDATE_ESP_DATA 6 +#define DIALOG_TYPE_UPLOAD_FILE 7 +#define DIALOG_TYPE_UNBIND 8 + +#define DIALOG_TYPE_FILAMENT_LOAD_HEAT 9 +#define DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED 10 +#define DIALOG_TYPE_FILAMENT_LOADING 11 +#define DIALOG_TYPE_FILAMENT_LOAD_COMPLETED 12 +#define DIALOG_TYPE_FILAMENT_UNLOAD_HEAT 13 +#define DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED 14 +#define DIALOG_TYPE_FILAMENT_UNLOADING 15 +#define DIALOG_TYPE_FILAMENT_UNLOAD_COMPLETED 16 + +#define DIALOG_TYPE_FILE_LOADING 17 //** + +#define DIALOG_TYPE_FILAMENT_NO_PRESS 18 +#define DIALOG_TYPE_FINISH_PRINT 19 + +#define WIFI_ENABLE_TIPS 20 + +#define DIALOG_PAUSE_MESSAGE_PAUSING 21 +#define DIALOG_PAUSE_MESSAGE_CHANGING 22 +#define DIALOG_PAUSE_MESSAGE_UNLOAD 23 +#define DIALOG_PAUSE_MESSAGE_WAITING 24 +#define DIALOG_PAUSE_MESSAGE_INSERT 25 +#define DIALOG_PAUSE_MESSAGE_LOAD 26 +#define DIALOG_PAUSE_MESSAGE_PURGE 27 +#define DIALOG_PAUSE_MESSAGE_RESUME 28 +#define DIALOG_PAUSE_MESSAGE_HEAT 29 +#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 DIALOG_WIFI_CONFIG_TIPS 35 +#define DIALOG_TRANSFER_NO_DEVICE 36 +#define BTN_OK_X 100 +#define BTN_OK_Y 180 +#define BTN_CANCEL_X 280 +#define BTN_CANCEL_Y 180 + +extern void lv_draw_dialog(uint8_t type); +extern void lv_clear_dialog(); +extern void filament_sprayer_temp(); +extern void filament_dialog_handle(); +extern void lv_filament_setbar(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..ca7d2d1e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.cpp @@ -0,0 +1,224 @@ +/** + * 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" + +extern lv_group_t * g; +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; + 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; + #if 0 + 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()); + + 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, NULL, 0); + lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonRevertNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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]); + + 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 * 2); /*Set its position*/ + lv_obj_set_size(buttonStore, 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(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 * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStoreNarrow, event_handler, ID_EEPROM_STORE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonStoreNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_EEPROM_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonRevert); + lv_group_add_obj(g, buttonStore); + lv_group_add_obj(g, buttonBack); + } + #endif + +} + +void lv_clear_eeprom_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..6d5ecf08 --- /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_encoder_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp new file mode 100644 index 00000000..0ad2bb5f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.cpp @@ -0,0 +1,172 @@ +/** + * 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" +#include "../../../../module/stepper/indirection.h" +#include "../../../../feature/tmc_util.h" +#include "../../../../gcode/gcode.h" +#include "../../../../module/planner.h" + +#if BUTTONS_EXIST(EN1, EN2) + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t * buttonEncoderState = NULL; +static lv_obj_t *labelEncoderState = NULL; + +#define ID_ENCODER_RETURN 1 +#define ID_ENCODER_STATE 2 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_ENCODER_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_encoder_settings(); + draw_return_ui(); + } + break; + case ID_ENCODER_STATE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.encoder_enable) { + gCfgItems.encoder_enable = false; + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + lv_label_set_text(labelEncoderState, machine_menu.disable); + update_spi_flash(); + } + else { + gCfgItems.encoder_enable = true; + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelEncoderState, machine_menu.enable); + update_spi_flash(); + } + } + break; + } +} + +void lv_draw_encoder_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelEncoderTips = NULL; + + lv_obj_t * line1 = NULL; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ENCODER_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ENCODER_SETTINGS_UI; + } + disp_state = ENCODER_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.EncoderConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelEncoderTips = lv_label_create(scr, NULL); + lv_obj_set_style(labelEncoderTips, &tft_style_label_rel); + lv_obj_set_pos(labelEncoderTips, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelEncoderTips, machine_menu.EncoderConfText); + + buttonEncoderState = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonEncoderState, PARA_UI_STATE_POS_X, PARA_UI_POS_Y + PARA_UI_STATE_V); + if (gCfgItems.encoder_enable) { + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonEncoderState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + + lv_obj_set_event_cb_mks(buttonEncoderState, event_handler, ID_ENCODER_STATE, NULL, 0); + + lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonEncoderState, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonEncoderState, LV_LAYOUT_OFF); + labelEncoderState = lv_label_create(buttonEncoderState, NULL); + + 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_ENCODER_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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.encoder_enable) { + lv_label_set_text(labelEncoderState, machine_menu.enable); + lv_obj_align(labelEncoderState, buttonEncoderState, LV_ALIGN_CENTER, 0, 0); + } + else { + lv_label_set_text(labelEncoderState, machine_menu.disable); + lv_obj_align(labelEncoderState, buttonEncoderState, 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); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonEncoderState); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_encoder_settings() { + #if HAS_ROTARY_ENCODER + lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // BUTTONS_EXIST(EN1, EN2) + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h new file mode 100644 index 00000000..62892a6e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_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_encoder_settings(void); +extern void lv_clear_encoder_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 new file mode 100644 index 00000000..c21ee361 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.cpp @@ -0,0 +1,86 @@ +/** + * 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 "SPI_TFT.h" + +#include "lv_conf.h" +#include "draw_ui.h" +#include "tft_lvgl_configuration.h" +#include "mks_hardware_test.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" + +static lv_obj_t * scr; + +void lv_draw_error_message(PGM_P const msg) { + #if 0 + static lv_obj_t * message = NULL, *kill_message = NULL, *reset_tips = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ERROR_MESSAGE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ERROR_MESSAGE_UI; + } + disp_state = ERROR_MESSAGE_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + if (msg) { + message = lv_label_create(scr, NULL); + 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_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_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 + + SPI_TFT.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 // HAS_TFT_LVGL_UI 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 new file mode 100644 index 00000000..8f64d67f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -0,0 +1,38 @@ +/** + * 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 + +#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(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp new file mode 100644 index 00000000..54320206 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -0,0 +1,403 @@ +/** + * 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 "../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 "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" + +static lv_obj_t * scr; +extern lv_group_t* g; +static lv_obj_t * buttoType, *buttonStep, *buttonSpeed; +static lv_obj_t *labelType; +static lv_obj_t *labelStep; +static lv_obj_t *labelSpeed; +static lv_obj_t * tempText; +static lv_obj_t * ExtruText; + +#define ID_E_ADD 1 +#define ID_E_DEC 2 +#define ID_E_TYPE 3 +#define ID_E_STEP 4 +#define ID_E_SPEED 5 +#define ID_E_RETURN 6 + +static int32_t extructAmount; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_E_ADD: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + 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(); + } + } + break; + case ID_E_DEC: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + 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(); + } + } + break; + case ID_E_TYPE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (ENABLED(HAS_MULTI_EXTRUDER)) { + if (uiCfg.curSprayerChoose == 0) { + uiCfg.curSprayerChoose = 1; + queue.inject_P(PSTR("T1")); + } + else { + uiCfg.curSprayerChoose = 0; + queue.inject_P(PSTR("T0")); + } + } + else + uiCfg.curSprayerChoose = 0; + + extructAmount = 0; + disp_hotend_temp(); + disp_ext_type(); + disp_extru_amount(); + } + break; + case ID_E_STEP: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + switch (abs(uiCfg.extruStep)) { + case 1: uiCfg.extruStep = 5; break; + case 5: uiCfg.extruStep = 10; break; + case 10: uiCfg.extruStep = 1; break; + default: break; + } + disp_ext_step(); + } + break; + case ID_E_SPEED: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + switch (uiCfg.extruSpeed) { + case 1: uiCfg.extruSpeed = 10; break; + case 10: uiCfg.extruSpeed = 20; break; + case 20: uiCfg.extruSpeed = 1; break; + default: break; + } + disp_ext_speed(); + } + break; + case ID_E_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_extrusion(void) { + lv_obj_t *buttonAdd, *buttonDec, *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != EXTRUSION_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = EXTRUSION_UI; + } + disp_state = EXTRUSION_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()); + + // Create image buttons + 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); + + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_E_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_in.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_in.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_out.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_out.bin"); + 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(buttoType, event_handler, ID_E_TYPE, NULL, 0); + 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_obj_set_event_cb_mks(buttonStep, event_handler, ID_E_STEP, NULL, 0); + 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(buttonSpeed, event_handler, ID_E_SPEED, NULL, 0); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); + lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + 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); + labelSpeed = lv_label_create(buttonSpeed, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelAdd, extrude_menu.in); + lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelDec, extrude_menu.out); + lv_obj_align(labelDec, buttonDec, 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); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonStep); + lv_group_add_obj(g, buttonSpeed); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_ext_type(); + disp_ext_step(); + disp_ext_speed(); + + tempText = lv_label_create(scr, NULL); + 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_label_rel); + disp_extru_amount(); +} + +void disp_ext_type() { + if (uiCfg.curSprayerChoose == 1) { + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + 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_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + 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); + } + } +} + +void disp_ext_speed() { + if (uiCfg.extruSpeed == 20) { + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_high.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_high.bin"); + } + else if (uiCfg.extruSpeed == 1) { + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_slow.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_slow.bin"); + } + else { + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed_normal.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed_normal.bin"); + } + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.extruSpeed == 20) { + lv_label_set_text(labelSpeed, extrude_menu.high); + lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.extruSpeed == 1) { + lv_label_set_text(labelSpeed, extrude_menu.low); + lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else { + lv_label_set_text(labelSpeed, extrude_menu.normal); + lv_obj_align(labelSpeed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void disp_hotend_temp() { + char buf[20] = {0}; + public_buf_l[0] = '\0'; + strcat(public_buf_l, extrude_menu.temper_text); + sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + strcat(public_buf_l, buf); + lv_label_set_text(tempText, public_buf_l); + lv_obj_align(tempText, NULL, LV_ALIGN_CENTER, 0, -50); +} + +void disp_extru_amount() { + char buf1[10] = {0}; + + public_buf_l[0] = '\0'; + + if (extructAmount < 999 && extructAmount > -99) { + sprintf(buf1, extrude_menu.count_value_mm, extructAmount); + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, extrude_menu.ext1); + else + strcat(public_buf_l, extrude_menu.ext2); + strcat(public_buf_l, buf1); + } + else if (extructAmount < 9999 && extructAmount > -999) { + sprintf(buf1, extrude_menu.count_value_cm, extructAmount / 10); + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, extrude_menu.ext1); + else + strcat(public_buf_l, extrude_menu.ext2); + strcat(public_buf_l, buf1); + } + else { + sprintf(buf1, extrude_menu.count_value_m, extructAmount / 1000); + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, extrude_menu.ext1); + else + strcat(public_buf_l, extrude_menu.ext2); + strcat(public_buf_l, buf1); + } + + lv_label_set_text(ExtruText, public_buf_l); + lv_obj_align(ExtruText, NULL, LV_ALIGN_CENTER, 0, -75); +} + +void disp_ext_step() { + if (uiCfg.extruStep == 1) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_mm.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_mm.bin"); + } + else if (uiCfg.extruStep == 5) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_mm.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_mm.bin"); + } + else if (uiCfg.extruStep == 10) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_mm.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_mm.bin"); + } + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.extruStep == 1) { + lv_label_set_text(labelStep, extrude_menu.step_1mm); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.extruStep == 5) { + lv_label_set_text(labelStep, extrude_menu.step_5mm); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.extruStep == 10) { + lv_label_set_text(labelStep, extrude_menu.step_10mm); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void lv_clear_extrusion() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h new file mode 100644 index 00000000..576cc6c6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_extrusion(void); +extern void lv_clear_extrusion(); +extern void disp_ext_type(); +extern void disp_ext_step(); +extern void disp_ext_speed(); +extern void disp_hotend_temp(); +extern void disp_extru_amount(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp new file mode 100644 index 00000000..8cdc1496 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.cpp @@ -0,0 +1,265 @@ +/** + * 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 "../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 "../../../../../Configuration.h" +#include "draw_ui.h" +#include "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t * fanText; + +#define ID_F_ADD 1 +#define ID_F_DEC 2 +#define ID_F_HIGH 3 +#define ID_F_MID 4 +#define ID_F_OFF 5 +#define ID_F_RETURN 6 + +static uint8_t fanSpeed; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_F_ADD: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (fanSpeed + 1 <= 255) { + fanSpeed++; + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); + } + } + break; + case ID_F_DEC: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (fanSpeed > 0) { + fanSpeed--; + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("M106 S%d"), fanSpeed); + gcode.process_subcommands_now(public_buf_l); + } + } + + break; + case ID_F_HIGH: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + gcode.process_subcommands_now_P(PSTR("M106 S255")); + } + break; + case ID_F_MID: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + gcode.process_subcommands_now_P(PSTR("M106 S127")); + } + break; + case ID_F_OFF: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + gcode.process_subcommands_now_P(PSTR("M107")); + } + break; + case ID_F_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +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; + } + disp_state = FAN_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()); + + // Create an Image button + buttonAdd = lv_imgbtn_create(scr, NULL); + buttonDec = lv_imgbtn_create(scr, NULL); + buttonHigh = lv_imgbtn_create(scr, NULL); + buttonMid = 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_F_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_REL, "F:/bmp_speed255.bin"); + lv_imgbtn_set_src(buttonHigh, LV_BTN_STATE_PR, "F:/bmp_speed255.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_REL, "F:/bmp_speed127.bin"); + lv_imgbtn_set_src(buttonMid, LV_BTN_STATE_PR, "F:/bmp_speed127.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(buttonHigh, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonMid, 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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonHigh, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonMid, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelAdd = lv_label_create(buttonAdd, NULL); + lv_obj_t *labelDec = lv_label_create(buttonDec, NULL); + lv_obj_t *labelHigh = lv_label_create(buttonHigh, NULL); + lv_obj_t *labelMid = lv_label_create(buttonMid, NULL); + lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelAdd, fan_menu.add); + lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelDec, fan_menu.dec); + lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelHigh, fan_menu.full); + lv_obj_align(labelHigh, buttonHigh, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelMid, fan_menu.half); + lv_obj_align(labelMid, buttonMid, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelOff, fan_menu.off); + lv_obj_align(labelOff, buttonOff, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttonHigh); + lv_group_add_obj(g, buttonMid); + lv_group_add_obj(g, buttonOff); + lv_group_add_obj(g, buttonBack); + } + #endif + + fanText = lv_label_create(scr, NULL); + lv_obj_set_style(fanText, &tft_style_label_rel); + disp_fan_value(); +} + +void disp_fan_value() { + char buf1[10] = {0}; + public_buf_l[0] = '\0'; + strcat(public_buf_l, fan_menu.state); + 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); +} + +void lv_clear_fan() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h new file mode 100644 index 00000000..602d02c6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -0,0 +1,35 @@ +/** + * 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_fan(void); +extern void lv_clear_fan(); +extern void disp_fan_value(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp new file mode 100644 index 00000000..83f9e536 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.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_TFT_LVGL_UI + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" +#include "../../../../module/motion.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *buttoType; +static lv_obj_t *labelType; +static lv_obj_t * tempText1; + +#define ID_FILAMNT_IN 1 +#define ID_FILAMNT_OUT 2 +#define ID_FILAMNT_TYPE 3 +#define ID_FILAMNT_RETURN 4 + +extern feedRate_t feedrate_mm_s; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_FILAMNT_IN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.filament_load_heat_flg = 1; + if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) + || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + } + else { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + } + } + break; + case ID_FILAMNT_OUT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.filament_unload_heat_flg=1; + if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) + && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) + || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) + ) { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + } + else { + lv_clear_filament_change(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); + if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + filament_sprayer_temp(); + } + } + break; + case ID_FILAMNT_TYPE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if HAS_MULTI_EXTRUDER + if (uiCfg.curSprayerChoose == 0) + uiCfg.curSprayerChoose = 1; + else if (uiCfg.curSprayerChoose == 1) + uiCfg.curSprayerChoose = 0; + #endif + disp_filament_type(); + } + break; + case ID_FILAMNT_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if HAS_MULTI_EXTRUDER + if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) + gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); + #endif + feedrate_mm_s = (float)uiCfg.moveSpeed_bak; + if (uiCfg.print_state == PAUSED) + planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); + //current_position.e = destination.e = uiCfg.current_e_position_bak; + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_filament_change(void) { + lv_obj_t *buttonIn, *buttonOut; + lv_obj_t *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENTCHANGE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENTCHANGE_UI; + } + disp_state = FILAMENTCHANGE_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()); + + // Create an Image button + buttonIn = lv_imgbtn_create(scr, NULL); + buttonOut = lv_imgbtn_create(scr, NULL); + buttoType = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonIn, event_handler, ID_FILAMNT_IN, NULL, 0); + lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_REL, "F:/bmp_in.bin"); + lv_imgbtn_set_src(buttonIn, LV_BTN_STATE_PR, "F:/bmp_in.bin"); + lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonIn, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW); + + lv_obj_set_event_cb_mks(buttonOut, event_handler, ID_FILAMNT_OUT, NULL, 0); + lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_REL, "F:/bmp_out.bin"); + lv_imgbtn_set_src(buttonOut, LV_BTN_STATE_PR, "F:/bmp_out.bin"); + lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonOut, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttoType, event_handler, ID_FILAMNT_TYPE, NULL, 0); + 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_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMNT_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(buttonIn, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonOut, 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(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + + // Create labels on the image buttons + lv_btn_set_layout(buttonIn, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOut, LV_LAYOUT_OFF); + lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelIn = lv_label_create(buttonIn, NULL); + lv_obj_t *labelOut = lv_label_create(buttonOut, NULL); + labelType = lv_label_create(buttoType, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelIn, filament_menu.in); + lv_obj_align(labelIn, buttonIn, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelOut, filament_menu.out); + lv_obj_align(labelOut, buttonOut, 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); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonIn); + lv_group_add_obj(g, buttonOut); + lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_filament_type(); + + tempText1 = lv_label_create(scr, NULL); + lv_obj_set_style(tempText1, &tft_style_label_rel); + disp_filament_temp(); +} + +void disp_filament_type() { + if (uiCfg.curSprayerChoose == 1) { + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + 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_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + 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); + } + } +} + +void disp_filament_temp() { + char buf[20] = {0}; + + public_buf_l[0] = '\0'; + + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, preheat_menu.ext1); + else + strcat(public_buf_l, preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + + 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); +} + +void lv_clear_filament_change() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h new file mode 100644 index 00000000..b0068f7f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h @@ -0,0 +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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_filament_change(void); +extern void lv_clear_filament_change(); +extern void disp_filament_type(); +extern void disp_filament_temp(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp new file mode 100644 index 00000000..06ab35f3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -0,0 +1,329 @@ +/** + * 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" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_FILAMENT_SET_RETURN 1 +#define ID_FILAMENT_SET_IN_LENGTH 2 +#define ID_FILAMENT_SET_IN_SPEED 3 +#define ID_FILAMENT_SET_OUT_LENGTH 4 +#define ID_FILAMENT_SET_OUT_SPEED 5 +#define ID_FILAMENT_SET_TEMP 6 +#define ID_FILAMENT_SET_DOWN 12 +#define ID_FILAMENT_SET_UP 13 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_FILAMENT_SET_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_filament_settings(); + draw_return_ui(); + } + break; + case ID_FILAMENT_SET_IN_LENGTH: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = load_length; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_IN_SPEED: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = load_speed; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_OUT_LENGTH: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = unload_length; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_OUT_SPEED: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = unload_speed; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_TEMP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = filament_temp; + lv_clear_filament_settings(); + lv_draw_number_key(); + } + break; + case ID_FILAMENT_SET_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_filament_settings(); + lv_draw_filament_settings(); + } + break; + case ID_FILAMENT_SET_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_filament_settings(); + lv_draw_filament_settings(); + } + break; + } +} + +void lv_draw_filament_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *labelInLengthText = NULL, *buttonInLengthValue = NULL, *labelInLengthValue = NULL; + lv_obj_t *labelInSpeedText = NULL, *buttonInSpeedValue = NULL, *labelInSpeedValue = NULL; + lv_obj_t *labelOutLengthText = NULL, *buttonOutLengthValue = NULL, *labelOutLengthValue = NULL; + lv_obj_t *labelOutSpeedText = NULL, *buttonOutSpeedValue = NULL, *labelOutSpeedValue = NULL; + lv_obj_t *labelTemperText = NULL, *buttonTemperValue = NULL, *labelTemperValue = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != FILAMENT_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = FILAMENT_SETTINGS_UI; + } + disp_state = FILAMENT_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.FilamentConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + if (uiCfg.para_ui_page != 1) { + labelInLengthText = lv_label_create(scr, NULL); + lv_obj_set_style(labelInLengthText, &tft_style_label_rel); + lv_obj_set_pos(labelInLengthText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelInLengthText, machine_menu.InLength); + + buttonInLengthValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonInLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonInLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonInLengthValue, event_handler, ID_FILAMENT_SET_IN_LENGTH, NULL, 0); + lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonInLengthValue, LV_BTN_STYLE_PR, &style_para_value); + labelInLengthValue = lv_label_create(buttonInLengthValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelInSpeedText = lv_label_create(scr, NULL); + lv_obj_set_style(labelInSpeedText, &tft_style_label_rel); + lv_obj_set_pos(labelInSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelInSpeedText, machine_menu.InSpeed); + + buttonInSpeedValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonInSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonInSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonInSpeedValue, event_handler, ID_FILAMENT_SET_IN_SPEED, NULL, 0); + lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonInSpeedValue, LV_BTN_STYLE_PR, &style_para_value); + labelInSpeedValue = lv_label_create(buttonInSpeedValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelOutLengthText = lv_label_create(scr, NULL); + lv_obj_set_style(labelOutLengthText, &tft_style_label_rel); + lv_obj_set_pos(labelOutLengthText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 6); + lv_label_set_text(labelOutLengthText, machine_menu.OutLength); + + buttonOutLengthValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonOutLengthValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonOutLengthValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonOutLengthValue, event_handler, ID_FILAMENT_SET_OUT_LENGTH, NULL, 0); + lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonOutLengthValue, LV_BTN_STYLE_PR, &style_para_value); + labelOutLengthValue = lv_label_create(buttonOutLengthValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelOutSpeedText = lv_label_create(scr, NULL); + lv_obj_set_style(labelOutSpeedText, &tft_style_label_rel); + lv_obj_set_pos(labelOutSpeedText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelOutSpeedText, machine_menu.OutSpeed); + + buttonOutSpeedValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonOutSpeedValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonOutSpeedValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonOutSpeedValue, event_handler, ID_FILAMENT_SET_OUT_SPEED, NULL, 0); + lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonOutSpeedValue, LV_BTN_STYLE_PR, &style_para_value); + labelOutSpeedValue = lv_label_create(buttonOutSpeedValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonInLengthValue); + lv_group_add_obj(g, buttonInSpeedValue); + lv_group_add_obj(g, buttonOutLengthValue); + lv_group_add_obj(g, buttonOutSpeedValue); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelTemperText = lv_label_create(scr, NULL); + lv_obj_set_style(labelTemperText, &tft_style_label_rel); + lv_obj_set_pos(labelTemperText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelTemperText, machine_menu.FilamentTemperature); + + buttonTemperValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonTemperValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonTemperValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonTemperValue, event_handler, ID_FILAMENT_SET_TEMP, NULL, 0); + lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonTemperValue, LV_BTN_STYLE_PR, &style_para_value); + labelTemperValue = lv_label_create(buttonTemperValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FILAMENT_SET_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonTemperValue); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FILAMENT_SET_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_length); + lv_label_set_text(labelInLengthValue, public_buf_l); + lv_obj_align(labelInLengthValue, buttonInLengthValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_load_speed); + lv_label_set_text(labelInSpeedValue, public_buf_l); + lv_obj_align(labelInSpeedValue, buttonInSpeedValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_length); + lv_label_set_text(labelOutLengthValue, public_buf_l); + lv_obj_align(labelOutLengthValue, buttonOutLengthValue, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + lv_label_set_text(labelOutSpeedValue, public_buf_l); + lv_obj_align(labelOutSpeedValue, buttonOutSpeedValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + } + else { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); + lv_label_set_text(labelTemperValue, public_buf_l); + lv_obj_align(labelTemperValue, buttonTemperValue, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, 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_filament_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h new file mode 100644 index 00000000..a5ae5428 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_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_filament_settings(void); +extern void lv_clear_filament_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp new file mode 100644 index 00000000..22e05f0e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.cpp @@ -0,0 +1,252 @@ +/** + * 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 "draw_ready_print.h" +#include "draw_set.h" +#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 "draw_ui.h" +#include "../../../../gcode/queue.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_H_ALL 1 +#define ID_H_X 2 +#define ID_H_Y 3 +#define ID_H_Z 4 +#define ID_H_RETURN 5 +#define ID_H_OFF_ALL 6 +#define ID_H_OFF_XY 7 + +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")); + } + break; + case ID_H_X: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + queue.inject_P(PSTR("G28 X0")); + } + break; + case ID_H_Y: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + queue.inject_P(PSTR("G28 Y0")); + } + break; + case ID_H_Z: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + queue.inject_P(PSTR("G28 Z0")); + } + break; + case ID_H_OFF_ALL: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + queue.inject_P(PSTR("M84")); + } + break; + case ID_H_OFF_XY: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + queue.inject_P(PSTR("M84 X Y")); + } + break; + case ID_H_RETURN: + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_home(); + lv_draw_tool(); + } + break; + } +} + +void lv_draw_home(void) { + lv_obj_t *buttonHomeAll, *buttonHomeX, *buttonHomeY, *buttonHomeZ; + lv_obj_t *buttonBack; + lv_obj_t *buttonOffAll, *buttonOffXY; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != ZERO_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = ZERO_UI; + } + disp_state = ZERO_UI; + + scr = lv_obj_create(NULL, NULL); + + //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_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()); + + // Create image buttons + //buttonWifi = lv_imgbtn_create(scr, NULL); + buttonHomeAll = lv_imgbtn_create(scr, NULL); + buttonHomeX = lv_imgbtn_create(scr, NULL); + //buttonContinue = lv_imgbtn_create(scr, NULL); + buttonHomeY = lv_imgbtn_create(scr, NULL); + buttonHomeZ = lv_imgbtn_create(scr, NULL); + buttonOffAll = lv_imgbtn_create(scr, NULL); + buttonOffXY = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + #if 1 + lv_obj_set_event_cb_mks(buttonHomeAll, event_handler,ID_H_ALL, NULL,0); + lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_REL, "F:/bmp_zeroAll.bin"); + lv_imgbtn_set_src(buttonHomeAll, LV_BTN_STATE_PR, "F:/bmp_zeroAll.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_REL, "F:/bmp_zeroX.bin"); + lv_imgbtn_set_src(buttonHomeX, LV_BTN_STATE_PR, "F:/bmp_zeroX.bin"); + 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(buttonHomeY, event_handler, ID_H_Y, NULL, 0); + lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_REL, "F:/bmp_zeroY.bin"); + lv_imgbtn_set_src(buttonHomeY, LV_BTN_STATE_PR, "F:/bmp_zeroY.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_REL, "F:/bmp_zeroZ.bin"); + lv_imgbtn_set_src(buttonHomeZ, LV_BTN_STATE_PR, "F:/bmp_zeroZ.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); + lv_imgbtn_set_src(buttonOffAll, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); + lv_imgbtn_set_src(buttonOffXY, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); + 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, NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(buttonHomeAll, 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(buttonHomeZ, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); + lv_obj_set_pos(buttonOffAll, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonOffXY, 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 labels on the image buttons + lv_btn_set_layout(buttonHomeAll, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonHomeX, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonHomeY, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonHomeZ, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOffAll, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOffXY, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelHomeAll = lv_label_create(buttonHomeAll, NULL); + lv_obj_t *labelHomeX = lv_label_create(buttonHomeX, NULL); + lv_obj_t *labelHomeY = lv_label_create(buttonHomeY, NULL); + lv_obj_t *labelHomeZ = lv_label_create(buttonHomeZ, NULL); + lv_obj_t *labelOffAll = lv_label_create(buttonOffAll, NULL); + lv_obj_t *labelOffXY = lv_label_create(buttonOffXY, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelHomeAll, home_menu.home_all); + lv_obj_align(labelHomeAll, buttonHomeAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelHomeX, home_menu.home_x); + lv_obj_align(labelHomeX, buttonHomeX, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelHomeY, home_menu.home_y); + lv_obj_align(labelHomeY, buttonHomeY, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelHomeZ, home_menu.home_z); + lv_obj_align(labelHomeZ, buttonHomeZ, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelOffAll, set_menu.motoroff); + lv_obj_align(labelOffAll, buttonOffAll, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelOffXY, set_menu.motoroffXY); + lv_obj_align(labelOffXY, buttonOffXY, 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); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonHomeAll); + lv_group_add_obj(g, buttonHomeX); + lv_group_add_obj(g, buttonHomeY); + lv_group_add_obj(g, buttonHomeZ); + lv_group_add_obj(g, buttonOffAll); + lv_group_add_obj(g, buttonOffXY); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_home() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h new file mode 100644 index 00000000..c5060127 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.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_home(void); +extern void lv_clear_home(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp new file mode 100644 index 00000000..d22eeb15 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.cpp @@ -0,0 +1,262 @@ +/** + * 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" +#include "../../../../module/probe.h" + +#if USE_SENSORLESS +#include "../../../../module/stepper/indirection.h" +#include "../../../../feature/tmc_util.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_SENSITIVITY_RETURN 1 +#define ID_SENSITIVITY_X 2 +#define ID_SENSITIVITY_Y 3 +#define ID_SENSITIVITY_Z 4 +#define ID_SENSITIVITY_Z2 5 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_SENSITIVITY_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_homing_sensitivity_settings(); + draw_return_ui(); + } + break; + case ID_SENSITIVITY_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = x_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + case ID_SENSITIVITY_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = y_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + case ID_SENSITIVITY_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = z_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + #if Z2_SENSORLESS + case ID_SENSITIVITY_Z2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = z2_sensitivity; + lv_clear_homing_sensitivity_settings(); + lv_draw_number_key(); + } + break; + #endif + } +} + +void lv_draw_homing_sensitivity_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL; + #if Z2_SENSORLESS + lv_obj_t *labelZ2Text = NULL, *buttonZ2Value = NULL, *labelZ2Value = NULL; + lv_obj_t * line4 = NULL; + #endif + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != HOMING_SENSITIVITY_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = HOMING_SENSITIVITY_UI; + } + disp_state = HOMING_SENSITIVITY_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.HomingSensitivityConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Sensitivity); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_SENSITIVITY_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXValue); + #endif + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Sensitivity); + + buttonYValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonYValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_SENSITIVITY_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYValue); + #endif + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Sensitivity); + + buttonZValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonZValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_SENSITIVITY_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) lv_group_add_obj(g, buttonZValue); + #endif + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + #if Z2_SENSORLESS + labelZ2Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelZ2Text, &tft_style_label_rel); + lv_obj_set_pos(labelZ2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelZ2Text, machine_menu.Z2_Sensitivity); + + buttonZ2Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonZ2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonZ2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZ2Value, event_handler, ID_SENSITIVITY_Z2, NULL, 0); + lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZ2Value, LV_BTN_STYLE_PR, &style_para_value); + labelZ2Value = lv_label_create(buttonZ2Value, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZ2Value); + #endif + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + #endif + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_SENSITIVITY_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + 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("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + 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"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + lv_label_set_text(labelZValue, public_buf_l); + lv_obj_align(labelZValue, buttonZValue, LV_ALIGN_CENTER, 0, 0); + + #if Z2_SENSORLESS + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + lv_label_set_text(labelZ2Value, public_buf_l); + lv_obj_align(labelZ2Value, buttonZ2Value, 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_homing_sensitivity_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_SENSORLESS + +#endif // HAS_TFT_LVGL_UI && USE_SENSORLESS diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h new file mode 100644 index 00000000..0c554702 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_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_homing_sensitivity_settings(void); +extern void lv_clear_homing_sensitivity_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..8c359233 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_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 BOTH(HAS_TFT_LVGL_UI, HAS_CLASSIC_JERK) + +#include "lv_conf.h" +#include "draw_ui.h" + +#include "../../../../MarlinCore.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +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 *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *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()); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Jerk); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_JERK_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Jerk); + + buttonYValue = lv_btn_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_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_JERK_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Jerk); + + buttonZValue = lv_btn_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_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_JERK_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelEText = lv_label_create(scr, NULL); + lv_obj_set_style(labelEText, &tft_style_label_rel); + lv_obj_set_pos(labelEText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelEText, machine_menu.E_Jerk); + + buttonEValue = lv_btn_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_size(buttonEValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonEValue, event_handler, ID_JERK_E, NULL, 0); + lv_btn_set_style(buttonEValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonEValue, LV_BTN_STYLE_PR, &style_para_value); + labelEValue = lv_label_create(buttonEValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_JERK_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonEValue); + lv_group_add_obj(g, buttonBack); + } + #endif + + 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(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } +} + +void lv_clear_jerk_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..0531dae9 --- /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_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp new file mode 100644 index 00000000..902472b8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -0,0 +1,286 @@ +/** + * 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 "../../../../../Configuration.h" +#include "../../../../MarlinCore.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define LV_KB_CTRL_BTN_FLAGS (LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CLICK_TRIG) + +static const char * kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", + "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", + LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; + +static const lv_btnm_ctrl_t kb_ctrl_lc_map[] = { + LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; + +static const char * kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", + "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", + LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; + +static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { + LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; + +static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", + "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", + LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; + +static const lv_btnm_ctrl_t kb_ctrl_spec_map[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + LV_KB_CTRL_BTN_FLAGS | 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; + +static const lv_btnm_ctrl_t kb_ctrl_num_map[] = { + 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, + 1, 1, 1, 2, + 1, 1, 1, 1, 1}; + +static void lv_kb_event_cb(lv_obj_t * kb, lv_event_t event) { + //LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + + if (event != LV_EVENT_VALUE_CHANGED) return; + + lv_kb_ext_t * ext = (lv_kb_ext_t * )lv_obj_get_ext_attr(kb); + const uint16_t btn_id = lv_btnm_get_active_btn(kb); + if (btn_id == LV_BTNM_BTN_NONE) return; + if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_HIDDEN | LV_BTNM_CTRL_INACTIVE)) return; + if (lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_NO_REPEAT) && event == LV_EVENT_LONG_PRESSED_REPEAT) return; + + const char * txt = lv_btnm_get_active_btn_text(kb); + if (txt == NULL) return; + + // Do the corresponding action according to the text of the button + if (strcmp(txt, "abc") == 0) { + lv_btnm_set_map(kb, kb_map_lc); + lv_btnm_set_ctrl_map(kb, kb_ctrl_lc_map); + return; + } + else if (strcmp(txt, "ABC") == 0) { + lv_btnm_set_map(kb, kb_map_uc); + lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map); + return; + } + else if (strcmp(txt, "1#") == 0) { + lv_btnm_set_map(kb, kb_map_spec); + lv_btnm_set_ctrl_map(kb, kb_ctrl_spec_map); + return; + } + else if (strcmp(txt, LV_SYMBOL_CLOSE) == 0) { + if (kb->event_cb != lv_kb_def_event_cb) { + //lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, NULL); + //if (res != LV_RES_OK) return; + lv_clear_keyboard(); + draw_return_ui(); + } + else { + lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + lv_obj_del(kb); + return; + } + return; + } + else if (strcmp(txt, LV_SYMBOL_OK) == 0) { + if (kb->event_cb != lv_kb_def_event_cb) { + //lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, NULL); + //if (res != LV_RES_OK) return; + const char * ret_ta_txt = lv_ta_get_text(ext->ta); + switch (keyboard_value) { + #if ENABLED(USE_WIFI_FUNCTION) + case wifiName: + memcpy(uiCfg.wifi_name,ret_ta_txt,sizeof(uiCfg.wifi_name)); + lv_clear_keyboard(); + draw_return_ui(); + break; + case wifiPassWord: + memcpy(uiCfg.wifi_key,ret_ta_txt,sizeof(uiCfg.wifi_name)); + lv_clear_keyboard(); + draw_return_ui(); + break; + case wifiConfig: + memset((void *)uiCfg.wifi_name, 0, sizeof(uiCfg.wifi_name)); + memcpy((void *)uiCfg.wifi_name, wifi_list.wifiName[wifi_list.nameIndex], 32); + + memset((void *)uiCfg.wifi_key, 0, sizeof(uiCfg.wifi_key)); + memcpy((void *)uiCfg.wifi_key, ret_ta_txt, sizeof(uiCfg.wifi_key)); + + gCfgItems.wifi_mode_sel = STA_MODEL; + + package_to_wifi(WIFI_PARA_SET, (char *)0, 0); + + memset(public_buf_l,0,sizeof(public_buf_l)); + + public_buf_l[0] = 0xA5; + public_buf_l[1] = 0x09; + public_buf_l[2] = 0x01; + public_buf_l[3] = 0x00; + public_buf_l[4] = 0x01; + public_buf_l[5] = 0xFC; + public_buf_l[6] = 0x00; + raw_send_to_wifi(public_buf_l, 6); + + last_disp_state = KEY_BOARD_UI; + lv_clear_keyboard(); + wifi_tips_type = TIPS_TYPE_JOINING; + lv_draw_wifi_tips(); + break; + #endif // USE_WIFI_FUNCTION + case gcodeCommand: + uint8_t buf[100]; + strncpy((char *)buf,ret_ta_txt,sizeof(buf)); + update_gcode_command(AUTO_LEVELING_COMMAND_ADDR,buf); + lv_clear_keyboard(); + draw_return_ui(); + break; + default: break; + } + } + else { + lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ + } + return; + } + + /*Add the characters to the text area if set*/ + if (ext->ta == NULL) return; + + if (strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) + lv_ta_add_char(ext->ta, '\n'); + else if (strcmp(txt, LV_SYMBOL_LEFT) == 0) + lv_ta_cursor_left(ext->ta); + else if (strcmp(txt, LV_SYMBOL_RIGHT) == 0) + lv_ta_cursor_right(ext->ta); + else if (strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) + lv_ta_del_char(ext->ta); + else if (strcmp(txt, "+/-") == 0) { + uint16_t cur = lv_ta_get_cursor_pos(ext->ta); + const char * ta_txt = lv_ta_get_text(ext->ta); + if (ta_txt[0] == '-') { + lv_ta_set_cursor_pos(ext->ta, 1); + lv_ta_del_char(ext->ta); + lv_ta_add_char(ext->ta, '+'); + lv_ta_set_cursor_pos(ext->ta, cur); + } + else if (ta_txt[0] == '+') { + lv_ta_set_cursor_pos(ext->ta, 1); + lv_ta_del_char(ext->ta); + lv_ta_add_char(ext->ta, '-'); + lv_ta_set_cursor_pos(ext->ta, cur); + } + else { + lv_ta_set_cursor_pos(ext->ta, 0); + lv_ta_add_char(ext->ta, '-'); + lv_ta_set_cursor_pos(ext->ta, cur + 1); + } + } + else { + lv_ta_add_text(ext->ta, txt); + } +} + +void lv_draw_keyboard() { + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != KEY_BOARD_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = KEY_BOARD_UI; + } + disp_state = KEY_BOARD_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + /*Create styles for the keyboard*/ + static lv_style_t rel_style, pr_style; + + lv_style_copy(&rel_style, &lv_style_btn_rel); + rel_style.body.radius = 0; + rel_style.body.border.width = 1; + rel_style.body.main_color = lv_color_make(0xA9, 0x62, 0x1D); + rel_style.body.grad_color = lv_color_make(0xA7, 0x59, 0x0E); + + lv_style_copy(&pr_style, &lv_style_btn_pr); + pr_style.body.radius = 0; + pr_style.body.border.width = 1; + pr_style.body.main_color = lv_color_make(0x72, 0x42, 0x15); + pr_style.body.grad_color = lv_color_make(0x6A, 0x3A, 0x0C); + + /*Create a keyboard and apply the styles*/ + lv_obj_t *kb = lv_kb_create(scr, NULL); + lv_obj_set_event_cb(kb, lv_kb_event_cb); + lv_kb_set_cursor_manage(kb, true); + lv_kb_set_style(kb, LV_KB_STYLE_BG, &lv_style_transp_tight); + lv_kb_set_style(kb, LV_KB_STYLE_BTN_REL, &rel_style); + lv_kb_set_style(kb, LV_KB_STYLE_BTN_PR, &pr_style); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + //lv_group_add_obj(g, kb); + //lv_group_set_editing(g, true); + } + #endif + + /*Create a text area. The keyboard will write here*/ + lv_obj_t *ta = lv_ta_create(scr, NULL); + lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_MID, 0, 10); + if (keyboard_value == gcodeCommand) { + get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); + public_buf_m[sizeof(public_buf_m)-1] = 0; + lv_ta_set_text(ta, public_buf_m); + } + else { + lv_ta_set_text(ta, ""); + } + + /*Assign the text area to the keyboard*/ + lv_kb_set_ta(kb, ta); +} + +void lv_clear_keyboard() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { /* lv_group_remove_all_objs(g); */ } + #endif + lv_obj_del(scr); +} + + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h new file mode 100644 index 00000000..0013dc40 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.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_keyboard(); +extern void lv_clear_keyboard(); + +#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 new file mode 100644 index 00000000..3e4ad064 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.cpp @@ -0,0 +1,401 @@ +/** + * 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 "../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 + +//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 SELECTED 1 +#define UNSELECTED 0 + +static void disp_language(uint8_t language, uint8_t state); + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *buttonCN, *buttonT_CN, *buttonEN, *buttonRU; +static lv_obj_t *buttonES, *buttonFR, *buttonIT, *buttonBack; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_CN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn_sel.bin"); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonCN); + gCfgItems.language = LANG_SIMPLE_CHINESE; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_T_CN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn_sel.bin"); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonT_CN); + gCfgItems.language = LANG_COMPLEX_CHINESE; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_EN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english_sel.bin"); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonEN); + gCfgItems.language = LANG_ENGLISH; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_RU: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian_sel.bin"); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonRU); + gCfgItems.language = LANG_RUSSIAN; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_ES: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish_sel.bin"); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonES); + gCfgItems.language = LANG_SPANISH; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_FR: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french_sel.bin"); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonFR); + gCfgItems.language = LANG_FRENCH; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_IT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + disp_language(gCfgItems.language, UNSELECTED); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy_sel.bin"); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy_sel.bin"); + lv_obj_refresh_ext_draw_pad(buttonIT); + gCfgItems.language = LANG_ITALY; + update_spi_flash(); + disp_language_init(); + } + break; + case ID_L_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + + buttonCN = NULL; + buttonT_CN = NULL; + buttonEN = NULL; + buttonRU = NULL; + buttonES = NULL; + buttonFR = NULL; + buttonFR = NULL; + buttonIT = NULL; + buttonBack = NULL; + lv_clear_language(); + lv_draw_set(); + } + break; + + } +} + +static void disp_language(uint8_t language, uint8_t state) { + uint16_t id; + lv_obj_t *obj; + + public_buf_l[0] = '\0'; + + switch (language) { + case LANG_SIMPLE_CHINESE: + id = ID_CN; + strcpy_P(public_buf_l, PSTR("F:/bmp_simplified_cn")); + obj = buttonCN; + break; + case LANG_COMPLEX_CHINESE: + id = ID_T_CN; + strcpy_P(public_buf_l, PSTR("F:/bmp_traditional_cn")); + obj = buttonT_CN; + break; + case LANG_ENGLISH: + id = ID_EN; + strcpy_P(public_buf_l, PSTR("F:/bmp_english")); + obj = buttonEN; + break; + case LANG_RUSSIAN: + id = ID_RU; + strcpy_P(public_buf_l, PSTR("F:/bmp_russian")); + obj = buttonRU; + break; + case LANG_SPANISH: + id = ID_ES; + strcpy_P(public_buf_l, PSTR("F:/bmp_spanish")); + obj = buttonES; + break; + case LANG_FRENCH: + id = ID_FR; + strcpy_P(public_buf_l, PSTR("F:/bmp_french")); + obj = buttonFR; + break; + case LANG_ITALY: + id = ID_IT; + strcpy_P(public_buf_l, PSTR("F:/bmp_italy")); + obj = buttonIT; + break; + default: + id = ID_CN; + strcpy_P(public_buf_l, PSTR("F:/bmp_simplified_cn")); + obj = buttonCN; + break; + } + + 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, NULL, 0); + lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, public_buf_l); + lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, public_buf_l); + + if (state == UNSELECTED) lv_obj_refresh_ext_draw_pad(obj); +} + +void lv_draw_language(void) { + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LANGUAGE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = LANGUAGE_UI; + } + disp_state = LANGUAGE_UI; + + scr = lv_obj_create(NULL, NULL); + + // 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_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()); + + // Create image buttons + 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); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonCN, event_handler, ID_CN, NULL, 0); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_REL, "F:/bmp_simplified_cn.bin"); + lv_imgbtn_set_src(buttonCN, LV_BTN_STATE_PR, "F:/bmp_simplified_cn.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_REL, "F:/bmp_traditional_cn.bin"); + lv_imgbtn_set_src(buttonT_CN, LV_BTN_STATE_PR, "F:/bmp_traditional_cn.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_REL, "F:/bmp_english.bin"); + lv_imgbtn_set_src(buttonEN, LV_BTN_STATE_PR, "F:/bmp_english.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_REL, "F:/bmp_russian.bin"); + lv_imgbtn_set_src(buttonRU, LV_BTN_STATE_PR, "F:/bmp_russian.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_REL, "F:/bmp_spanish.bin"); + lv_imgbtn_set_src(buttonES, LV_BTN_STATE_PR, "F:/bmp_spanish.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_REL, "F:/bmp_french.bin"); + lv_imgbtn_set_src(buttonFR, LV_BTN_STATE_PR, "F:/bmp_french.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_REL, "F:/bmp_italy.bin"); + lv_imgbtn_set_src(buttonIT, LV_BTN_STATE_PR, "F:/bmp_italy.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonCN, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonT_CN, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonEN, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonRU, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonES, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonFR, LV_LAYOUT_OFF); + 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_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_Back = lv_label_create(buttonBack, NULL); + + disp_language(gCfgItems.language, SELECTED); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_CN, language_menu.chinese_s); + lv_obj_align(label_CN, buttonCN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_T_CN, language_menu.chinese_t); + lv_obj_align(label_T_CN, buttonT_CN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_EN, language_menu.english); + lv_obj_align(label_EN, buttonEN, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_RU, language_menu.russian); + lv_obj_align(label_RU, buttonRU, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_ES, language_menu.spanish); + lv_obj_align(label_ES, buttonES, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_FR, language_menu.french); + lv_obj_align(label_FR, buttonFR, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_IT, language_menu.italy); + lv_obj_align(label_IT, buttonIT, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonCN); + lv_group_add_obj(g, buttonT_CN); + lv_group_add_obj(g, buttonEN); + lv_group_add_obj(g, buttonRU); + lv_group_add_obj(g, buttonES); + lv_group_add_obj(g, buttonFR); + lv_group_add_obj(g, buttonIT); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_language() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h new file mode 100644 index 00000000..ca6d40bf --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.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_language(void); +extern void lv_clear_language(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp new file mode 100644 index 00000000..0e0283d3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -0,0 +1,261 @@ +/** + * 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" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_LEVEL_RETURN 1 +#define ID_LEVEL_POSITION 2 +#define ID_LEVEL_POSITION_ARROW 3 +#define ID_LEVEL_COMMAND 4 +#define ID_LEVEL_COMMAND_ARROW 5 +#define ID_LEVEL_ZOFFSET 6 +#define ID_LEVEL_ZOFFSET_ARROW 7 + + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_LEVEL_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + draw_return_ui(); + } + break; + case ID_LEVEL_POSITION: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + case ID_LEVEL_POSITION_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + case ID_LEVEL_COMMAND: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value = gcodeCommand; + lv_clear_level_settings(); + lv_draw_keyboard(); + } + break; + case ID_LEVEL_COMMAND_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value = gcodeCommand; + lv_clear_level_settings(); + lv_draw_keyboard(); + } + break; + #if HAS_BED_PROBE + case ID_LEVEL_ZOFFSET: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_auto_level_offset_settings(); + } + break; + case ID_LEVEL_ZOFFSET_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_level_settings(); + lv_draw_auto_level_offset_settings(); + } + break; + #endif + } +} + +void lv_draw_level_settings(void) { + lv_obj_t *buttonBack, *label_Back; + lv_obj_t *buttonPosition, *labelPosition, *buttonPositionNarrow; + lv_obj_t *buttonCommand, *labelCommand, *buttonCommandNarrow; + #if HAS_BED_PROBE + lv_obj_t *buttonZoffset, *labelZoffset, *buttonZoffsetNarrow; + lv_obj_t * line3; + #endif + lv_obj_t * line1, * line2; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_PARA_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_PARA_UI; + } + disp_state = LEVELING_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, machine_menu.LevelingParaConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + + buttonPosition = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonPosition, PARA_UI_POS_X, PARA_UI_POS_Y); /*Set its position*/ + lv_obj_set_size(buttonPosition, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonPosition, event_handler, ID_LEVEL_POSITION, NULL, 0); + lv_btn_set_style(buttonPosition, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonPosition, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonPosition, LV_LAYOUT_OFF); + labelPosition = lv_label_create(buttonPosition, NULL); /*Add a label to the button*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonPosition); + #endif + + buttonPositionNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonPositionNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonPositionNarrow, event_handler, ID_LEVEL_POSITION_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonPositionNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonPositionNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonPositionNarrow, LV_LAYOUT_OFF); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonCommand = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonCommand, PARA_UI_POS_X, PARA_UI_POS_Y * 2); + lv_obj_set_size(buttonCommand, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); + lv_obj_set_event_cb_mks(buttonCommand, event_handler, ID_LEVEL_COMMAND, NULL, 0); + lv_btn_set_style(buttonCommand, LV_BTN_STYLE_REL, &tft_style_label_rel); + lv_btn_set_style(buttonCommand, LV_BTN_STYLE_PR, &tft_style_label_pre); + lv_btn_set_layout(buttonCommand, LV_LAYOUT_OFF); + labelCommand = lv_label_create(buttonCommand, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonCommand); + #endif + + buttonCommandNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonCommandNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonCommandNarrow, event_handler, ID_LEVEL_COMMAND_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonCommandNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonCommandNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonCommandNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + #if HAS_BED_PROBE + + buttonZoffset = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonZoffset, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonZoffset, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonZoffset, event_handler, ID_LEVEL_ZOFFSET, NULL, 0); + lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonZoffset, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonZoffset, LV_LAYOUT_OFF); + labelZoffset = lv_label_create(buttonZoffset, NULL); /*Add a label to the button*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZoffset); + #endif + + buttonZoffsetNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonZoffsetNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonZoffsetNarrow, event_handler, ID_LEVEL_ZOFFSET_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonZoffsetNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonZoffsetNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonZoffsetNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + #endif // HAS_BED_PROBE + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_LEVEL_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + 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(labelPosition, machine_menu.LevelingManuPosConf); + lv_obj_align(labelPosition, buttonPosition, LV_ALIGN_IN_LEFT_MID, 0, 0); + + lv_label_set_text(labelCommand, machine_menu.LevelingAutoCommandConf); + lv_obj_align(labelCommand, buttonCommand, LV_ALIGN_IN_LEFT_MID, 0, 0); + #if HAS_BED_PROBE + lv_label_set_text(labelZoffset, machine_menu.LevelingAutoZoffsetConf); + lv_obj_align(labelZoffset, buttonZoffset, LV_ALIGN_IN_LEFT_MID, 0, 0); + #endif + } + +} + +void lv_clear_level_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h new file mode 100644 index 00000000..ce290172 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_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_level_settings(void); +extern void lv_clear_level_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..9f03793c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.cpp @@ -0,0 +1,290 @@ +/** + * 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" + +extern lv_group_t * g; +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_LEVEL 6 +#define ID_PARA_LEVEL_ARROW 7 +#define ID_PARA_ADVANCE 8 +#define ID_PARA_ADVANCE_ARROW 9 + +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_LEVEL: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_level_settings(); + } + break; + case ID_PARA_LEVEL_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_machine_para(); + lv_draw_level_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 *buttonLevel, *labelLevel, *buttonLevelNarrow; + lv_obj_t *buttonAdvance, *labelAdvance, *buttonAdvanceNarrow; + lv_obj_t * line1, * line2, * line3, * line4; + 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()); + + 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, NULL, 0); + lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonMachineNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonMotorNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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]); + + buttonLevel = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonLevel, PARA_UI_POS_X, PARA_UI_POS_Y * 3); /*Set its position*/ + lv_obj_set_size(buttonLevel, 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(buttonLevel, event_handler, ID_PARA_LEVEL, NULL, 0); + lv_btn_set_style(buttonLevel, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonLevel, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonLevel, LV_LAYOUT_OFF); + labelLevel = lv_label_create(buttonLevel, NULL); /*Add a label to the button*/ + + buttonLevelNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonLevelNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 3 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonLevelNarrow, event_handler, ID_PARA_LEVEL_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonLevelNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonLevelNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonLevelNarrow, LV_LAYOUT_OFF); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + 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 * 4); /*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 * 4 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonAdvanceNarrow, event_handler, ID_PARA_ADVANCE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonAdvanceNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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); + + 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_PARA_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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 + 10, 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, -2); + + lv_label_set_text(labelMachine, MachinePara_menu.MachineSetting); + lv_obj_align(labelMachine, buttonMachine, LV_ALIGN_IN_LEFT_MID, 0, -3); + + lv_label_set_text(labelMotor, MachinePara_menu.MotorSetting); + lv_obj_align(labelMotor, buttonMotor, LV_ALIGN_IN_LEFT_MID, 0, -3); + + lv_label_set_text(labelLevel, MachinePara_menu.leveling); + lv_obj_align(labelLevel, buttonLevel, LV_ALIGN_IN_LEFT_MID, 0, -3); + + lv_label_set_text(labelAdvance, MachinePara_menu.AdvanceSetting); + lv_obj_align(labelAdvance, buttonAdvance, LV_ALIGN_IN_LEFT_MID, 0, -3); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonMachine); + lv_group_add_obj(g, buttonMotor); + lv_group_add_obj(g, buttonLevel); + lv_group_add_obj(g, buttonAdvance); + lv_group_add_obj(g, buttonBack); + } + #endif + +} + +void lv_clear_machine_para() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..e830f75d --- /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 00000000..0cf5bbaf --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.cpp @@ -0,0 +1,254 @@ +/** + * 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" + +extern lv_group_t * g; +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()); + + 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, NULL, 0); + lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonAccelerationNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonMaxFeedrateNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonJerkNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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 + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAcceleration); + lv_group_add_obj(g, buttonMaxFeedrate); + #if HAS_CLASSIC_JERK + lv_group_add_obj(g, buttonJerk); + #endif + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_machine_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..38d02e71 --- /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 new file mode 100644 index 00000000..3d68019b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -0,0 +1,294 @@ +/** + * 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 "../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 "draw_ui.h" +#include "../../../../gcode/queue.h" + +extern lv_group_t * g; +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 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_M_POINT1: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; + } + + queue.enqueue_now_P(PSTR("G1 Z10")); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[0][0], (int)gCfgItems.levelingPos[0][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); + } + } + break; + case ID_M_POINT2: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; + } + + queue.enqueue_now_P(PSTR("G1 Z10")); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[1][0], (int)gCfgItems.levelingPos[1][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); + } + } + break; + case ID_M_POINT3: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; + } + + queue.enqueue_now_P(PSTR("G1 Z10")); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[2][0], (int)gCfgItems.levelingPos[2][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); + } + } + + break; + case ID_M_POINT4: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; + } + + queue.enqueue_now_P(PSTR("G1 Z10")); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[3][0], (int)gCfgItems.levelingPos[3][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); + } + } + break; + case ID_M_POINT5: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length == 0) { + if (uiCfg.leveling_first_time) { + queue.enqueue_now_P(PSTR("G28")); + uiCfg.leveling_first_time = 0; + } + + queue.enqueue_now_P(PSTR("G1 Z10")); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("G1 X%d Y%d"), (int)gCfgItems.levelingPos[4][0], (int)gCfgItems.levelingPos[4][1]); + queue.enqueue_one_now(public_buf_l); + queue.enqueue_now_P(PSTR("G1 Z0")); + } + } + + break; + case ID_MANUAL_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_manualLevel(); + lv_draw_tool(); + } + break; + } +} + +void lv_draw_manualLevel(void) { + lv_obj_t *buttonPoint1, *buttonPoint2, *buttonPoint3, *buttonPoint4, *buttonPoint5; + lv_obj_t *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != LEVELING_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = LEVELING_UI; + } + disp_state = LEVELING_UI; + + scr = lv_obj_create(NULL, NULL); + + // 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_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()); + + // Create an Image button + buttonPoint1 = lv_imgbtn_create(scr, NULL); + buttonPoint2 = lv_imgbtn_create(scr, NULL); + buttonPoint3 = lv_imgbtn_create(scr, NULL); + buttonPoint4 = lv_imgbtn_create(scr, NULL); + buttonPoint5 = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonPoint1, event_handler, ID_M_POINT1, NULL, 0); + lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_REL, "F:/bmp_leveling1.bin"); + lv_imgbtn_set_src(buttonPoint1, LV_BTN_STATE_PR, "F:/bmp_leveling1.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_REL, "F:/bmp_leveling2.bin"); + lv_imgbtn_set_src(buttonPoint2, LV_BTN_STATE_PR, "F:/bmp_leveling2.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_REL, "F:/bmp_leveling3.bin"); + lv_imgbtn_set_src(buttonPoint3, LV_BTN_STATE_PR, "F:/bmp_leveling3.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_REL, "F:/bmp_leveling4.bin"); + lv_imgbtn_set_src(buttonPoint4, LV_BTN_STATE_PR, "F:/bmp_leveling4.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_REL, "F:/bmp_leveling5.bin"); + lv_imgbtn_set_src(buttonPoint5, LV_BTN_STATE_PR, "F:/bmp_leveling5.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonPoint1, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPoint2, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPoint3, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPoint4, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPoint5, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *label_Point1 = lv_label_create(buttonPoint1, NULL); + lv_obj_t *label_Point2 = lv_label_create(buttonPoint2, NULL); + 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); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(label_Point1, leveling_menu.position1); + lv_obj_align(label_Point1, buttonPoint1, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Point2, leveling_menu.position2); + lv_obj_align(label_Point2, buttonPoint2, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Point3, leveling_menu.position3); + lv_obj_align(label_Point3, buttonPoint3, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Point4, leveling_menu.position4); + lv_obj_align(label_Point4, buttonPoint4, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Point5, leveling_menu.position5); + lv_obj_align(label_Point5, buttonPoint5, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPoint1); + lv_group_add_obj(g, buttonPoint2); + lv_group_add_obj(g, buttonPoint3); + lv_group_add_obj(g, buttonPoint4); + lv_group_add_obj(g, buttonPoint5); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_manualLevel() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h new file mode 100644 index 00000000..cfa10370 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.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_manualLevel(void); +extern void lv_clear_manualLevel(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp new file mode 100644 index 00000000..9b7200b5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp @@ -0,0 +1,459 @@ +/** + * 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" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_MANUAL_POS_RETURN 1 +#define ID_MANUAL_POS_X1 2 +#define ID_MANUAL_POS_Y1 3 +#define ID_MANUAL_POS_X2 4 +#define ID_MANUAL_POS_Y2 5 +#define ID_MANUAL_POS_X3 6 +#define ID_MANUAL_POS_Y3 7 +#define ID_MANUAL_POS_X4 8 +#define ID_MANUAL_POS_Y4 9 +#define ID_MANUAL_POS_X5 10 +#define ID_MANUAL_POS_Y5 11 +#define ID_MANUAL_POS_DOWN 12 +#define ID_MANUAL_POS_UP 13 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_MANUAL_POS_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_manual_level_pos_settings(); + draw_return_ui(); + } + break; + case ID_MANUAL_POS_X1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x1; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y1: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y1; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x2; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y2: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y2; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X3: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x3; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y3: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y3; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X4: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_x4; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y4: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y4; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_X5: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y5; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_Y5: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + value = level_pos_y5; + lv_clear_manual_level_pos_settings(); + lv_draw_number_key(); + } + break; + case ID_MANUAL_POS_UP: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 0; + lv_clear_manual_level_pos_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + case ID_MANUAL_POS_DOWN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.para_ui_page = 1; + lv_clear_manual_level_pos_settings(); + lv_draw_manual_level_pos_settings(); + } + break; + } +} + +void lv_draw_manual_level_pos_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonTurnPage = NULL, *labelTurnPage = NULL; + lv_obj_t *labelPoint1Text = NULL, *buttonX1Value = NULL, *labelX1Value = NULL; + lv_obj_t *buttonY1Value = NULL, *labelY1Value = NULL; + lv_obj_t *labelPoint2Text = NULL, *buttonX2Value = NULL, *labelX2Value = NULL; + lv_obj_t *buttonY2Value = NULL, *labelY2Value = NULL; + lv_obj_t *labelPoint3Text = NULL, *buttonX3Value = NULL, *labelX3Value = NULL; + lv_obj_t *buttonY3Value = NULL, *labelY3Value = NULL; + lv_obj_t *labelPoint4Text = NULL, *buttonX4Value = NULL, *labelX4Value = NULL; + lv_obj_t *buttonY4Value = NULL, *labelY4Value = NULL; + lv_obj_t *labelPoint5Text = NULL, *buttonX5Value = NULL, *labelX5Value = NULL; + lv_obj_t *buttonY5Value = NULL, *labelY5Value = NULL; + lv_obj_t * line1 = NULL, * line2 = NULL, * line3 = NULL, * line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != MANUAL_LEVELING_POSIGION_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MANUAL_LEVELING_POSIGION_UI; + } + disp_state = MANUAL_LEVELING_POSIGION_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.LevelingParaConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + if (uiCfg.para_ui_page != 1) { + labelPoint1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint1Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelPoint1Text, leveling_menu.position1); + + buttonX1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX1Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX1Value, event_handler, ID_MANUAL_POS_X1, NULL, 0); + lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX1Value, LV_BTN_STYLE_PR, &style_para_value); + labelX1Value = lv_label_create(buttonX1Value, NULL); + + buttonY1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY1Value, event_handler, ID_MANUAL_POS_Y1, NULL, 0); + lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY1Value, LV_BTN_STYLE_PR, &style_para_value); + labelY1Value = lv_label_create(buttonY1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelPoint2Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint2Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint2Text, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelPoint2Text, leveling_menu.position2); + + buttonX2Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX2Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX2Value, event_handler, ID_MANUAL_POS_X2, NULL, 0); + lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX2Value, LV_BTN_STYLE_PR, &style_para_value); + labelX2Value = lv_label_create(buttonX2Value, NULL); + + buttonY2Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY2Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 2 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY2Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY2Value, event_handler, ID_MANUAL_POS_Y2, NULL, 0); + lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY2Value, LV_BTN_STYLE_PR, &style_para_value); + labelY2Value = lv_label_create(buttonY2Value, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelPoint3Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint3Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint3Text, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelPoint3Text, leveling_menu.position3); + + buttonX3Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX3Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX3Value, event_handler, ID_MANUAL_POS_X3, NULL, 0); + lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX3Value, LV_BTN_STYLE_PR, &style_para_value); + labelX3Value = lv_label_create(buttonX3Value, NULL); + + buttonY3Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY3Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 3 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY3Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY3Value, event_handler, ID_MANUAL_POS_Y3, NULL, 0); + lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY3Value, LV_BTN_STYLE_PR, &style_para_value); + labelY3Value = lv_label_create(buttonY3Value, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelPoint4Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint4Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint4Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelPoint4Text, leveling_menu.position4); + + buttonX4Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX4Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX4Value, event_handler, ID_MANUAL_POS_X4, NULL, 0); + lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX4Value, LV_BTN_STYLE_PR, &style_para_value); + labelX4Value = lv_label_create(buttonX4Value, NULL); + + buttonY4Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY4Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y * 4 + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY4Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY4Value, event_handler, ID_MANUAL_POS_Y4, NULL, 0); + lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY4Value, LV_BTN_STYLE_PR, &style_para_value); + labelY4Value = lv_label_create(buttonY4Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonX1Value); + lv_group_add_obj(g, buttonY1Value); + lv_group_add_obj(g, buttonX2Value); + lv_group_add_obj(g, buttonY2Value); + lv_group_add_obj(g, buttonX3Value); + lv_group_add_obj(g, buttonY3Value); + lv_group_add_obj(g, buttonX4Value); + lv_group_add_obj(g, buttonY4Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelPoint5Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelPoint5Text, &tft_style_label_rel); + lv_obj_set_pos(labelPoint5Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelPoint5Text, leveling_menu.position5); + + buttonX5Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonX5Value, PARA_UI_VALUE_POS_X_2, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonX5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonX5Value, event_handler, ID_MANUAL_POS_X5, NULL, 0); + lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonX5Value, LV_BTN_STYLE_PR, &style_para_value); + labelX5Value = lv_label_create(buttonX5Value, NULL); + + buttonY5Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonY5Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V_2); + lv_obj_set_size(buttonY5Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonY5Value, event_handler, ID_MANUAL_POS_Y5, NULL, 0); + lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonY5Value, LV_BTN_STYLE_PR, &style_para_value); + labelY5Value = lv_label_create(buttonY5Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_MANUAL_POS_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonX5Value); + lv_group_add_obj(g, buttonY5Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MANUAL_POS_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); + lv_label_set_text(labelX1Value, public_buf_l); + lv_obj_align(labelX1Value, buttonX1Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][1]); + lv_label_set_text(labelY1Value, public_buf_l); + lv_obj_align(labelY1Value, buttonY1Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); + lv_label_set_text(labelX2Value, public_buf_l); + lv_obj_align(labelX2Value, buttonX2Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][1]); + lv_label_set_text(labelY2Value, public_buf_l); + lv_obj_align(labelY2Value, buttonY2Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); + lv_label_set_text(labelX3Value, public_buf_l); + lv_obj_align(labelX3Value, buttonX3Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][1]); + lv_label_set_text(labelY3Value, public_buf_l); + lv_obj_align(labelY3Value, buttonY3Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); + lv_label_set_text(labelX4Value, public_buf_l); + lv_obj_align(labelX4Value, buttonX4Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][1]); + lv_label_set_text(labelY4Value, public_buf_l); + lv_obj_align(labelY4Value, buttonY4Value, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.next); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + } + else { + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); + lv_label_set_text(labelX5Value, public_buf_l); + lv_obj_align(labelX5Value, buttonX5Value, LV_ALIGN_CENTER, 0, 0); + + ZERO(public_buf_l); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][1]); + lv_label_set_text(labelY5Value, public_buf_l); + lv_obj_align(labelY5Value, buttonY5Value, LV_ALIGN_CENTER, 0, 0); + + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, 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_manual_level_pos_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h new file mode 100644 index 00000000..8e89ecf5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_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_manual_level_pos_settings(void); +extern void lv_clear_manual_level_pos_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..e82124f7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.cpp @@ -0,0 +1,335 @@ +/** + * 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" + +extern lv_group_t * g; +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 *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *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()); + + if (uiCfg.para_ui_page != 1) { + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.XMaxFeedRate); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_FEED_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + 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]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.YMaxFeedRate); + + buttonYValue = lv_btn_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_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_FEED_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + 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]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.ZMaxFeedRate); + + buttonZValue = lv_btn_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_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_FEED_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + 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]); + + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0MaxFeedRate); + + buttonE0Value = lv_btn_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_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_FEED_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); + 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_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelE1Text, machine_menu.E1MaxFeedRate); + + buttonE1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_FEED_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); + 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_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_FEED_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_FEED_RETURN, NULL, 0); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + + 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(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() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..78caca5a --- /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 00000000..f6568df1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.cpp @@ -0,0 +1,343 @@ +/** + * 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" + +extern lv_group_t * g; +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 +#define ID_HOME_SENSE 8 +#define ID_HOME_SENSE_ARROW 9 + +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 USE_SENSORLESS + case ID_HOME_SENSE: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_homing_sensitivity_settings(); + } + break; + case ID_HOME_SENSE_ARROW: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_motor_settings(); + lv_draw_homing_sensitivity_settings(); + } + break; + #endif + #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; + lv_obj_t * line1; + #if USE_SENSORLESS + lv_obj_t *buttonSensitivity, *labelSensitivity, *buttonSensitivityNarrow; + lv_obj_t * line2; + #endif + #if HAS_TRINAMIC_CONFIG + #if USE_SENSORLESS + lv_obj_t * line3; + #else + lv_obj_t * line2; + #endif + lv_obj_t *buttonTMCcurrent, *labelTMCcurrent, *buttonTMCcurrentNarrow; + #if HAS_STEALTHCHOP + #if USE_SENSORLESS + lv_obj_t * line4; + #else + lv_obj_t * line3; + #endif + lv_obj_t *buttonStepMode, *labelStepMode, *buttonStepModeNarrow; + #endif + #endif + 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()); + + 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*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSteps); + #endif + + 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, NULL, 0); + lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonStepsNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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(scr, NULL); + lv_ex_line(line1, line_points[0]); + + #if USE_SENSORLESS + buttonSensitivity = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonSensitivity, PARA_UI_POS_X, PARA_UI_POS_Y * 2); /*Set its position*/ + lv_obj_set_size(buttonSensitivity, 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(buttonSensitivity, event_handler, ID_HOME_SENSE, NULL, 0); + lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonSensitivity, LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonSensitivity, LV_LAYOUT_OFF); + labelSensitivity = lv_label_create(buttonSensitivity, NULL); /*Add a label to the button*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonSensitivity); + #endif + + buttonSensitivityNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonSensitivityNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, PARA_UI_POS_Y * 2 + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonSensitivityNarrow, event_handler, ID_HOME_SENSE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonSensitivityNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonSensitivityNarrow, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonSensitivityNarrow, LV_LAYOUT_OFF); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + #endif + + + #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, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2)); + 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*/ + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTMCcurrent); + #endif + + buttonTMCcurrentNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonTMCcurrentNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 3, PARA_UI_POS_Y * 2) + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonTMCcurrentNarrow, event_handler, ID_MOTOR_TMC_CURRENT_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonTMCcurrentNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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); + #if USE_SENSORLESS + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + #else + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + #endif + + #if HAS_STEALTHCHOP + buttonStepMode = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonStepMode, PARA_UI_POS_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3)); + lv_obj_set_size(buttonStepMode, PARA_UI_SIZE_X, PARA_UI_SIZE_Y); /*Set its size*/ + 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*/ + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonStepMode); + #endif + + buttonStepModeNarrow = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonStepModeNarrow, PARA_UI_POS_X + PARA_UI_SIZE_X, TERN(USE_SENSORLESS, PARA_UI_POS_Y * 4, PARA_UI_POS_Y * 3) + PARA_UI_ARROW_V); + lv_obj_set_event_cb_mks(buttonStepModeNarrow, event_handler, ID_MOTOR_STEP_MODE_ARROW, NULL, 0); + lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_REL, "F:/bmp_arrow.bin"); + lv_imgbtn_set_src(buttonStepModeNarrow, LV_BTN_STATE_PR, "F:/bmp_arrow.bin"); + 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); + + #if USE_SENSORLESS + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + #else + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + #endif + + #endif // HAS_STEALTHCHOP + + #endif // HAS_TRINAMIC_CONFIG + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_MOTOR_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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 HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + 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 USE_SENSORLESS + lv_label_set_text(labelSensitivity, machine_menu.HomingSensitivityConf); + lv_obj_align(labelSensitivity, buttonSensitivity, LV_ALIGN_IN_LEFT_MID, 0, 0); + #endif + #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() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..9a1c7a4d --- /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 new file mode 100644 index 00000000..a6c0c055 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -0,0 +1,347 @@ +/** + * 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 "../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 "draw_ui.h" +#include "../../../../gcode/queue.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +static lv_obj_t *labelV, *buttonV; + +#define ID_M_X_P 1 +#define ID_M_X_N 2 +#define ID_M_Y_P 3 +#define ID_M_Y_N 4 +#define ID_M_Z_P 5 +#define ID_M_Z_N 6 +#define ID_M_STEP 7 +#define ID_M_RETURN 8 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_M_X_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length <= (BUFSIZE - 3)) { + ZERO(public_buf_l); + queue.enqueue_one_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_one_P(PSTR("G90")); + } + } + break; + case ID_M_X_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length <= (BUFSIZE - 3)) { + 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; + case ID_M_Y_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length <= (BUFSIZE - 3)) { + 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; + case ID_M_Y_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length <= (BUFSIZE - 3)) { + 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; + case ID_M_Z_P: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length <= (BUFSIZE - 3)) { + 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; + case ID_M_Z_N: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (queue.length <= (BUFSIZE - 3)) { + 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; + case ID_M_STEP: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (abs(10 * (int)uiCfg.move_dist) == 100) + uiCfg.move_dist = 0.1; + else + uiCfg.move_dist *= (float)10; + + disp_move_dist(); + } + + break; + case ID_M_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_move_motor(void) { + 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++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = MOVE_MOTOR_UI; + } + disp_state = MOVE_MOTOR_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()); + + // 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); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonXI, event_handler, ID_M_X_P, NULL, 0); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_REL, "F:/bmp_xAdd.bin"); + lv_imgbtn_set_src(buttonXI, LV_BTN_STATE_PR, "F:/bmp_xAdd.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_REL, "F:/bmp_xDec.bin"); + lv_imgbtn_set_src(buttonXD, LV_BTN_STATE_PR, "F:/bmp_xDec.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_REL, "F:/bmp_yAdd.bin"); + lv_imgbtn_set_src(buttonYI, LV_BTN_STATE_PR, "F:/bmp_yAdd.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_REL, "F:/bmp_yDec.bin"); + lv_imgbtn_set_src(buttonYD, LV_BTN_STATE_PR, "F:/bmp_yDec.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_REL, "F:/bmp_zAdd.bin"); + lv_imgbtn_set_src(buttonZI, LV_BTN_STATE_PR, "F:/bmp_zAdd.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_REL, "F:/bmp_zDec.bin"); + lv_imgbtn_set_src(buttonZD, LV_BTN_STATE_PR, "F:/bmp_zDec.bin"); + 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_M_STEP, NULL, 0); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonXI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonXD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonYI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonYD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonZI, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonZD, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonV, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + lv_obj_t *labelXI = lv_label_create(buttonXI, NULL); + lv_obj_t *labelXD = lv_label_create(buttonXD, NULL); + lv_obj_t *labelYI = lv_label_create(buttonYI, NULL); + lv_obj_t *labelYD = lv_label_create(buttonYD, NULL); + lv_obj_t *labelZI = lv_label_create(buttonZI, NULL); + lv_obj_t *labelZD = lv_label_create(buttonZD, NULL); + 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); + + lv_label_set_text(labelXD, move_menu.x_dec); + lv_obj_align(labelXD, buttonXD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelYI, move_menu.y_add); + lv_obj_align(labelYI, buttonYI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelYD, move_menu.y_dec); + lv_obj_align(labelYD, buttonYD, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelZI, move_menu.z_add); + lv_obj_align(labelZI, buttonZI, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelZD, move_menu.z_dec); + lv_obj_align(labelZD, buttonZD, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXI); + lv_group_add_obj(g, buttonXD); + lv_group_add_obj(g, buttonYI); + lv_group_add_obj(g, buttonYD); + lv_group_add_obj(g, buttonZI); + lv_group_add_obj(g, buttonZD); + lv_group_add_obj(g, buttonV); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_move_dist(); +} + +void disp_move_dist() { + // char buf[30] = {0}; + + if ((int)(10 * uiCfg.move_dist) == 1) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move0_1.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move0_1.bin"); + } + else if ((int)(10 * uiCfg.move_dist) == 10) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move1.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move1.bin"); + } + else if ((int)(10 * uiCfg.move_dist) == 100) { + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_REL, "F:/bmp_step_move10.bin"); + lv_imgbtn_set_src(buttonV, LV_BTN_STATE_PR, "F:/bmp_step_move10.bin"); + } + if (gCfgItems.multiple_language != 0) { + if ((int)(10 * uiCfg.move_dist) == 1) { + lv_label_set_text(labelV, move_menu.step_01mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if ((int)(10 * uiCfg.move_dist) == 10) { + lv_label_set_text(labelV, move_menu.step_1mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if ((int)(10 * uiCfg.move_dist) == 100) { + lv_label_set_text(labelV, move_menu.step_10mm); + lv_obj_align(labelV, buttonV, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void lv_clear_move_motor() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI 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 new file mode 100644 index 00000000..fdbb61f6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -0,0 +1,35 @@ +/** + * 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_move_motor(void); +extern void lv_clear_move_motor(); +extern void disp_move_dist(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..48427763 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -0,0 +1,981 @@ +/** + * 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 + +#if HAS_BED_PROBE + #include "../../../../module/probe.h" +#endif + +extern lv_group_t * g; +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 + + ZERO(public_buf_m); + + switch (value) { + case PrintAcceleration: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.acceleration); + break; + case RetractAcceleration: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.retract_acceleration); + break; + case TravelAcceleration: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.travel_acceleration); + break; + case XAcceleration: + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + break; + case YAcceleration: + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + break; + case ZAcceleration: + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + break; + case E0Acceleration: + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + break; + case E1Acceleration: + sprintf_P(public_buf_m, PSTR("%d"), (int)planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)]); + break; + case XMaxFeedRate: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[X_AXIS]); + break; + case YMaxFeedRate: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Y_AXIS]); + break; + case ZMaxFeedRate: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[Z_AXIS]); + break; + case E0MaxFeedRate: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS]); + break; + case E1MaxFeedRate: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.max_feedrate_mm_s[E_AXIS_N(1)]); + break; + + case XJerk: + #if HAS_CLASSIC_JERK + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[X_AXIS]); + #endif + break; + case YJerk: + #if HAS_CLASSIC_JERK + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Y_AXIS]); + #endif + break; + case ZJerk: + #if HAS_CLASSIC_JERK + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[Z_AXIS]); + #endif + break; + case EJerk: + #if HAS_CLASSIC_JERK + sprintf_P(public_buf_m, PSTR("%.1f"), planner.max_jerk[E_AXIS]); + #endif + break; + + case Xstep: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[X_AXIS]); + + break; + case Ystep: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Y_AXIS]); + + break; + case Zstep: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[Z_AXIS]); + + break; + case E0step: + sprintf_P(public_buf_m, PSTR("%.1f"), planner.settings.axis_steps_per_mm[E_AXIS]); + + break; + case E1step: + 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) + milliamps = stepperX.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case Ycurrent: + #if AXIS_IS_TMC(Y) + milliamps = stepperY.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case Zcurrent: + #if AXIS_IS_TMC(Z) + milliamps = stepperZ.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case E0current: + #if AXIS_IS_TMC(E0) + milliamps = stepperE0.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case E1current: + #if AXIS_IS_TMC(E1) + milliamps = stepperE1.getMilliamps(); + sprintf_P(public_buf_m, PSTR("%.1f"), milliamps); + #endif + break; + + case pause_pos_x: + sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosX); + break; + case pause_pos_y: + sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosY); + break; + case pause_pos_z: + sprintf_P(public_buf_m, PSTR("%.1f"), gCfgItems.pausePosZ); + break; + case level_pos_x1: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]); + break; + case level_pos_y1: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][1]); + break; + case level_pos_x2: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][0]); + break; + case level_pos_y2: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][1]); + break; + case level_pos_x3: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][0]); + break; + case level_pos_y3: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][1]); + break; + case level_pos_x4: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][0]); + break; + case level_pos_y4: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][1]); + break; + case level_pos_x5: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][0]); + break; + case level_pos_y5: + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][1]); + break; + #if HAS_BED_PROBE + case x_offset: + #if HAS_PROBE_XY_OFFSET + sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.x); + #endif + break; + case y_offset: + #if HAS_PROBE_XY_OFFSET + sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.y); + #endif + break; + case z_offset: + sprintf_P(public_buf_m, PSTR("%.1f"), probe.offset.z); + break; + #endif + case load_length: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_length); + break; + case load_speed: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_load_speed); + break; + case unload_length: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_length); + break; + case unload_speed: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed); + break; + case filament_temp: + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temper); + break; + case x_sensitivity: + #if X_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(X_SENSORLESS, stepperX.homing_threshold(), 0)); + #endif + break; + case y_sensitivity: + #if Y_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(Y_SENSORLESS, stepperY.homing_threshold(), 0)); + #endif + break; + case z_sensitivity: + #if Z_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(Z_SENSORLESS, stepperZ.homing_threshold(), 0)); + #endif + break; + case z2_sensitivity: + #if Z2_SENSORLESS + sprintf_P(public_buf_m, PSTR("%d"), TERN(Z2_SENSORLESS, stepperZ2.homing_threshold(), 0)); + #endif + 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); + planner.refresh_positioning(); + break; + case Ystep: + planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); + planner.refresh_positioning(); + break; + case Zstep: + planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); + planner.refresh_positioning(); + break; + case E0step: + planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); + planner.refresh_positioning(); + break; + case E1step: + planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); + planner.refresh_positioning(); + 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; + 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; + case level_pos_x1: + gCfgItems.levelingPos[0][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y1: + gCfgItems.levelingPos[0][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x2: + gCfgItems.levelingPos[1][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y2: + gCfgItems.levelingPos[1][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x3: + gCfgItems.levelingPos[2][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y3: + gCfgItems.levelingPos[2][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x4: + gCfgItems.levelingPos[3][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y4: + gCfgItems.levelingPos[3][1] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_x5: + gCfgItems.levelingPos[4][0] = atoi(key_value); + update_spi_flash(); + break; + case level_pos_y5: + gCfgItems.levelingPos[4][1] = atoi(key_value); + update_spi_flash(); + break; + #if HAS_BED_PROBE + case x_offset: + #if HAS_PROBE_XY_OFFSET + float x; + x = atof(key_value); + if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) + probe.offset.x = x; + #endif + break; + case y_offset: + #if HAS_PROBE_XY_OFFSET + float y; + y = atof(key_value); + if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) + probe.offset.y = y; + #endif + break; + case z_offset: + float z; + z = atof(key_value); + if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + probe.offset.z = z; + break; + #endif + case load_length: + gCfgItems.filamentchange_load_length = atoi(key_value); + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5); + update_spi_flash(); + break; + case load_speed: + gCfgItems.filamentchange_load_speed = atoi(key_value); + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length*60.0/gCfgItems.filamentchange_load_speed)+0.5); + update_spi_flash(); + break; + case unload_length: + gCfgItems.filamentchange_unload_length = atoi(key_value); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5); + update_spi_flash(); + break; + case unload_speed: + gCfgItems.filamentchange_unload_speed = atoi(key_value); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length*60.0/gCfgItems.filamentchange_unload_speed)+0.5); + update_spi_flash(); + break; + case filament_temp: + gCfgItems.filament_limit_temper = atoi(key_value); + update_spi_flash(); + break; + case x_sensitivity: + #if X_SENSORLESS + stepperX.homing_threshold(atoi(key_value)); + #endif + break; + case y_sensitivity: + #if Y_SENSORLESS + stepperY.homing_threshold(atoi(key_value)); + #endif + break; + case z_sensitivity: + #if Z_SENSORLESS + stepperZ.homing_threshold(atoi(key_value)); + #endif + break; + case z2_sensitivity: + #if Z2_SENSORLESS + stepperZ2.homing_threshold(atoi(key_value)); + #endif + 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()); + + 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); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, NumberKey_1); + lv_group_add_obj(g, NumberKey_2); + lv_group_add_obj(g, NumberKey_3); + lv_group_add_obj(g, KeyBack); + lv_group_add_obj(g, NumberKey_4); + lv_group_add_obj(g, NumberKey_5); + lv_group_add_obj(g, NumberKey_6); + lv_group_add_obj(g, KeyReset); + lv_group_add_obj(g, NumberKey_7); + lv_group_add_obj(g, NumberKey_8); + lv_group_add_obj(g, NumberKey_9); + lv_group_add_obj(g, NumberKey_0); + lv_group_add_obj(g, Minus); + lv_group_add_obj(g, KeyPoint); + lv_group_add_obj(g, KeyConfirm); + } + #endif + + disp_key_value(); +} + +void lv_clear_number_key() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..7902da36 --- /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_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp new file mode 100644 index 00000000..4a4a0ee1 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -0,0 +1,413 @@ +/** + * 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 "../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 "../../../../module/temperature.h" +#include "../../../../module/motion.h" +#include "../../../../sd/cardreader.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_O_PRE_HEAT 1 +#define ID_O_EXTRUCT 2 +#define ID_O_MOV 3 +#define ID_O_FILAMENT 4 +#define ID_O_SPEED 5 +#define ID_O_RETURN 6 +#define ID_O_FAN 7 +#define ID_O_POWER_OFF 8 +#define ID_O_BABY_STEP 9 + +static lv_obj_t *label_PowerOff; +static lv_obj_t *buttonPowerOff; + +extern feedRate_t feedrate_mm_s; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_O_PRE_HEAT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_preHeat(); + } + break; + case ID_O_EXTRUCT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_extrusion(); + } + break; + case ID_O_MOV: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_move_motor(); + } + break; + case ID_O_FILAMENT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if HAS_MULTI_EXTRUDER + uiCfg.curSprayerChoose_bak = active_extruder; + #endif + if (uiCfg.print_state == WORKING) { + #if ENABLED(SDSUPPORT) + card.pauseSDPrint(); + stop_print_time(); + uiCfg.print_state = PAUSING; + #endif + } + uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; + uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; + lv_clear_operation(); + lv_draw_filament_change(); + } + break; + case ID_O_FAN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_fan(); + } + break; + case ID_O_SPEED: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_change_speed(); + } + break; + case ID_O_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + case ID_O_POWER_OFF: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.finish_power_off == 1) { + gCfgItems.finish_power_off = 0; + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); + 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); + update_spi_flash(); + } + else { + gCfgItems.finish_power_off = 1; + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); + 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); + update_spi_flash(); + } + } + break; + case ID_O_BABY_STEP: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_operation(); + lv_draw_baby_stepping(); + } + break; + } +} + +void lv_draw_operation(void) { + lv_obj_t *buttonPreHeat = NULL, *buttonExtrusion = NULL, *buttonSpeed = NULL; + lv_obj_t *buttonBack = NULL, *buttonFan = NULL; + lv_obj_t *labelPreHeat = NULL, *labelExtrusion = NULL; + lv_obj_t *label_Back = NULL, *label_Speed = NULL, *label_Fan = NULL; + lv_obj_t *buttonMove = NULL, *label_Move = NULL; + lv_obj_t *buttonBabyStep = NULL, *label_BabyStep = NULL; + lv_obj_t *buttonFilament = NULL, *label_Filament = NULL; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != OPERATE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = OPERATE_UI; + } + disp_state = OPERATE_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()); + + // Create image buttons + buttonPreHeat = lv_imgbtn_create(scr, NULL); + buttonFilament = lv_imgbtn_create(scr, NULL); + buttonFan = lv_imgbtn_create(scr, NULL); + buttonPowerOff = lv_imgbtn_create(scr, NULL); + if (uiCfg.print_state != WORKING) { + buttonExtrusion = lv_imgbtn_create(scr, NULL); + buttonMove = lv_imgbtn_create(scr, NULL); + } + else { + buttonSpeed = lv_imgbtn_create(scr, NULL); + buttonBabyStep = lv_imgbtn_create(scr, NULL); + } + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_O_PRE_HEAT, NULL, 0); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_temp.bin"); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_temp.bin"); + 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_set_event_cb_mks(buttonFilament, event_handler, ID_O_FILAMENT, NULL, 0); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); + 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); + + #if 1 + lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_O_FAN, NULL, 0); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); + 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); + + if (gCfgItems.finish_power_off == 1) { + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_auto_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_auto_off.bin"); + } + else { + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src(buttonPowerOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); + } + lv_obj_set_event_cb_mks(buttonPowerOff, event_handler, ID_O_POWER_OFF, NULL, 0); + 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); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPreHeat); + lv_group_add_obj(g, buttonFilament); + lv_group_add_obj(g, buttonFan); + lv_group_add_obj(g, buttonPowerOff); + } + #endif + + if (uiCfg.print_state != WORKING) { + lv_obj_set_event_cb_mks(buttonExtrusion, event_handler, ID_O_EXTRUCT, NULL, 0); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extrude_opr.bin"); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extrude_opr.bin"); + 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_O_MOV, NULL, 0); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_move_opr.bin"); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_move_opr.bin"); + 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 HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonExtrusion); + lv_group_add_obj(g, buttonMove); + } + #endif + } + else { + lv_obj_set_event_cb_mks(buttonSpeed, event_handler, ID_O_SPEED, NULL, 0); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_REL, "F:/bmp_speed.bin"); + lv_imgbtn_set_src(buttonSpeed, LV_BTN_STATE_PR, "F:/bmp_speed.bin"); + 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(buttonBabyStep, event_handler, ID_O_BABY_STEP, NULL, 0); + lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); + lv_imgbtn_set_src(buttonBabyStep, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); + lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonBabyStep, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonSpeed); + lv_group_add_obj(g, buttonBabyStep); + } + #endif + } + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_O_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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 + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + lv_obj_set_pos(buttonPreHeat, INTERVAL_V, titleHeight); + lv_obj_set_pos(buttonFilament, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight); + lv_obj_set_pos(buttonFan, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight); + lv_obj_set_pos(buttonPowerOff, 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(buttonExtrusion, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonMove, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + } + else { + lv_obj_set_pos(buttonSpeed, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + lv_obj_set_pos(buttonBabyStep, 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 labels on the image buttons + lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPowerOff, LV_LAYOUT_OFF); + + if (uiCfg.print_state != WORKING) { + /* + lv_btn_set_layout(buttonFilament, LV_LAYOUT_OFF); + } else { + */ + lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonMove, LV_LAYOUT_OFF); + } + else { + lv_btn_set_layout(buttonSpeed, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBabyStep, LV_LAYOUT_OFF); + } + + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + labelPreHeat = lv_label_create(buttonPreHeat, NULL); + label_Filament = lv_label_create(buttonFilament, NULL); + label_Fan = lv_label_create(buttonFan, NULL); + label_PowerOff = lv_label_create(buttonPowerOff, NULL); + + if (uiCfg.print_state != WORKING) { + /* + label_Filament = lv_label_create(buttonFilament, NULL); + } else { + */ + labelExtrusion = lv_label_create(buttonExtrusion, NULL); + label_Move = lv_label_create(buttonMove, NULL); + } + else { + label_Speed = lv_label_create(buttonSpeed, NULL); + label_BabyStep = lv_label_create(buttonBabyStep, NULL); + } + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelPreHeat, operation_menu.temp); + lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + 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); + + lv_label_set_text(label_Fan, operation_menu.fan); + lv_obj_align(label_Fan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + if (gCfgItems.finish_power_off == 1) + lv_label_set_text(label_PowerOff, printing_more_menu.auto_close); + else + 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); + + 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(labelExtrusion, operation_menu.extr); + lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + 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); + } + else { + lv_label_set_text(label_Speed, operation_menu.speed); + lv_obj_align(label_Speed, buttonSpeed, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_BabyStep, operation_menu.babystep); + lv_obj_align(label_BabyStep, buttonBabyStep, 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); + } +} + +void lv_clear_operation() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h new file mode 100644 index 00000000..cca1f6a2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.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_operation(void); +extern void lv_clear_operation(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 new file mode 100644 index 00000000..f7dd2060 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.cpp @@ -0,0 +1,55 @@ +/** + * 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, ADVANCED_PAUSE_FEATURE) + +#include "draw_ui.h" +#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 "../../../../feature/pause.h" + +void lv_draw_pause_message(const PauseMessage msg) { + switch (msg) { + case PAUSE_MESSAGE_PAUSING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_PAUSING); break; + case PAUSE_MESSAGE_CHANGING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_CHANGING); break; + case PAUSE_MESSAGE_UNLOAD: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_UNLOAD); break; + case PAUSE_MESSAGE_WAITING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_WAITING); break; + case PAUSE_MESSAGE_INSERT: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_INSERT); break; + case PAUSE_MESSAGE_LOAD: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_LOAD); break; + case PAUSE_MESSAGE_PURGE: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_PURGE); break; + case PAUSE_MESSAGE_RESUME: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_RESUME); break; + case PAUSE_MESSAGE_HEAT: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_HEAT); break; + case PAUSE_MESSAGE_HEATING: clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_HEATING); break; + case PAUSE_MESSAGE_OPTION: pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; + clear_cur_ui(); lv_draw_dialog(DIALOG_PAUSE_MESSAGE_OPTION); break; + case PAUSE_MESSAGE_STATUS: + default: break; + } +} + +#endif // HAS_TFT_LVGL_UI && ADVANCED_PAUSE_FEATURE 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 new file mode 100644 index 00000000..7d55d837 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.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_message(const PauseMessage msg); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..9b99971f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.cpp @@ -0,0 +1,202 @@ +/** + * 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" + +extern lv_group_t * g; +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 *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *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()); + + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.xPos); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_PAUSE_X, NULL, 0); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.yPos); + + buttonYValue = lv_btn_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_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_PAUSE_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.zPos); + + buttonZValue = lv_btn_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_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_PAUSE_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_PAUSE_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + 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(label_Back, common_menu.text_back); + lv_obj_align(label_Back, buttonBack, LV_ALIGN_CENTER, 0, 0); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_pause_position() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..3e9e0798 --- /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 new file mode 100644 index 00000000..f58a47b3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -0,0 +1,401 @@ +/** + * 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 "../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 "../../../../module/temperature.h" + +static lv_obj_t * scr; +extern lv_group_t* g; +static lv_obj_t *buttoType, *buttonStep; +static lv_obj_t *labelType; +static lv_obj_t *labelStep; +static lv_obj_t * tempText1; + +#define ID_P_ADD 1 +#define ID_P_DEC 2 +#define ID_P_TYPE 3 +#define ID_P_STEP 4 +#define ID_P_OFF 5 +#define ID_P_RETURN 6 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_P_ADD: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.curTempType == 0) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat; + 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); + } + } + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + 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); + } + #endif + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + #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(); + } + #endif + disp_desire_temp(); + } + break; + case ID_P_DEC: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.curTempType == 0) { + if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; + } + else { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; + } + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + #if HAS_HEATED_BED + else { + if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) { + thermalManager.temp_bed.target -= uiCfg.stepHeat; + } + else { + thermalManager.temp_bed.target = (float)0; + } + thermalManager.start_watching_bed(); + } + #endif + disp_desire_temp(); + } + + break; + case ID_P_TYPE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.curTempType == 0) { + if (ENABLED(HAS_MULTI_EXTRUDER)) { + if (uiCfg.curSprayerChoose == 0) { + uiCfg.curSprayerChoose = 1; + } + else if (uiCfg.curSprayerChoose == 1) { + if (TEMP_SENSOR_BED != 0) { + uiCfg.curTempType = 1; + } + else { + uiCfg.curTempType = 0; + uiCfg.curSprayerChoose = 0; + } + } + } + else if (uiCfg.curSprayerChoose == 0) { + if (TEMP_SENSOR_BED != 0) + uiCfg.curTempType = 1; + else + uiCfg.curTempType = 0; + } + } + else if (uiCfg.curTempType == 1) { + uiCfg.curSprayerChoose = 0; + uiCfg.curTempType = 0; + } + disp_temp_type(); + } + break; + case ID_P_STEP: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + switch (uiCfg.stepHeat) { + case 1: uiCfg.stepHeat = 5; break; + case 5: uiCfg.stepHeat = 10; break; + case 10: uiCfg.stepHeat = 1; break; + default: break; + } + disp_step_heat(); + } + break; + case ID_P_OFF: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (uiCfg.curTempType == 0) { + thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)0; + thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + } + #if HAS_HEATED_BED + else { + thermalManager.temp_bed.target = (float)0; + thermalManager.start_watching_bed(); + } + #endif + disp_desire_temp(); + } + break; + case ID_P_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + draw_return_ui(); + } + break; + } +} + +void lv_draw_preHeat(void) { + lv_obj_t *buttonAdd, *buttonDec; + lv_obj_t *buttonOff, *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRE_HEAT_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = PRE_HEAT_UI; + } + disp_state = PRE_HEAT_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()); + + // Create image buttons + 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); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonAdd, event_handler, ID_P_ADD, NULL, 0); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_REL, "F:/bmp_Add.bin"); + lv_imgbtn_set_src(buttonAdd, LV_BTN_STATE_PR, "F:/bmp_Add.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_REL, "F:/bmp_Dec.bin"); + lv_imgbtn_set_src(buttonDec, LV_BTN_STATE_PR, "F:/bmp_Dec.bin"); + 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(buttoType, event_handler, ID_P_TYPE, NULL, 0); + 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_obj_set_event_cb_mks(buttonStep, event_handler, ID_P_STEP, NULL, 0); + 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, NULL, 0); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_REL, "F:/bmp_speed0.bin"); + lv_imgbtn_set_src(buttonOff, LV_BTN_STATE_PR, "F:/bmp_speed0.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonAdd, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonDec, LV_LAYOUT_OFF); + lv_btn_set_layout(buttoType, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonStep, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOff, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + 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); + lv_obj_t *labelOff = lv_label_create(buttonOff, NULL); + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelAdd, preheat_menu.add); + lv_obj_align(labelAdd, buttonAdd, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelDec, preheat_menu.dec); + lv_obj_align(labelDec, buttonDec, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelOff, preheat_menu.off); + lv_obj_align(labelOff, buttonOff, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonAdd); + lv_group_add_obj(g, buttonDec); + lv_group_add_obj(g, buttoType); + lv_group_add_obj(g, buttonStep); + lv_group_add_obj(g, buttonOff); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_temp_type(); + disp_step_heat(); + + tempText1 = lv_label_create(scr, NULL); + lv_obj_set_style(tempText1, &tft_style_label_rel); + disp_desire_temp(); +} + +void disp_temp_type() { + if (uiCfg.curTempType == 0) { + if (uiCfg.curSprayerChoose == 1) { + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru2.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru2.bin"); + 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_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_extru1.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_extru1.bin"); + 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); + } + } + + } + else { + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_REL, "F:/bmp_bed.bin"); + lv_imgbtn_set_src(buttoType, LV_BTN_STATE_PR, "F:/bmp_bed.bin"); + 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); + } + } +} + +void disp_desire_temp() { + char buf[20] = {0}; + + public_buf_l[0] = '\0'; + + if (uiCfg.curTempType == 0) { + if (uiCfg.curSprayerChoose < 1) + strcat(public_buf_l, preheat_menu.ext1); + else + strcat(public_buf_l, preheat_menu.ext2); + 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); + } + #endif + 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); +} + +void disp_step_heat() { + if (uiCfg.stepHeat == 1) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step1_degree.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step1_degree.bin"); + } + else if (uiCfg.stepHeat == 5) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step5_degree.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step5_degree.bin"); + } + else if (uiCfg.stepHeat == 10) { + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_REL, "F:/bmp_step10_degree.bin"); + lv_imgbtn_set_src(buttonStep, LV_BTN_STATE_PR, "F:/bmp_step10_degree.bin"); + } + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.stepHeat == 1) { + lv_label_set_text(labelStep, preheat_menu.step_1c); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.stepHeat == 5) { + lv_label_set_text(labelStep, preheat_menu.step_5c); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + else if (uiCfg.stepHeat == 10) { + lv_label_set_text(labelStep, preheat_menu.step_10c); + lv_obj_align(labelStep, buttonStep, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + } +} + +void lv_clear_preHeat() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h new file mode 100644 index 00000000..c8de942f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -0,0 +1,37 @@ +/** + * 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_preHeat(void); +extern void lv_clear_preHeat(); +extern void disp_temp_type(); +extern void disp_step_heat(); +extern void disp_desire_temp(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 new file mode 100644 index 00000000..6d7b68af --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -0,0 +1,640 @@ +/** + * 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 "../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 "draw_ui.h" +#include "../../../../sd/cardreader.h" + +static lv_obj_t * scr; +extern lv_group_t* g; + +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 +#define ID_P_RETURN 9 + +int8_t curDirLever = 0; +LIST_FILE list_file; +DIR_OFFSET dir_offset[10]; + +extern uint8_t public_buf[512]; +extern char public_buf_m[100]; + +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]; + + 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); + + if (curDirLever != 0) card.cd(list_file.curDirPath); + else card.cdroot(); // while(card.cdup()); + + 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); + + 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_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++; + #endif + } + list_file.Sd_file_cnt++; + } + //card.closefile(false); + return valid_name_cnt; + } + +#endif // SDSUPPORT + +uint8_t have_pre_pic(char *path) { + #if ENABLED(SDSUPPORT) + char *ps1, *ps2, *cur_name = strrchr(path, '/'); + + card.openFileRead(cur_name); + card.read(public_buf, 512); + ps1 = strstr((char *)public_buf, ";simage:"); + card.read(public_buf, 512); + ps2 = strstr((char *)public_buf, ";simage:"); + if (ps1 || ps2) { + card.closefile(); + return 1; + } + card.closefile(); + #endif + + return 0; +} + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + uint8_t i, file_count = 0; + //switch (obj->mks_obj_id) + //{ + if (obj->mks_obj_id == ID_P_UP) { + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + if (dir_offset[curDirLever].curPage > 0) { + // 2015.05.19 + list_file.Sd_file_cnt = 0; + + if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM) + list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset - FILE_NUM; + + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif + if (file_count != 0) { + dir_offset[curDirLever].curPage--; + lv_clear_print_file(); + disp_gcode_icon(file_count); + } + } + } + } + else if (obj->mks_obj_id == ID_P_DOWN) { + if (event == LV_EVENT_CLICKED) { + } + 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_offset = dir_offset[curDirLever].cur_page_last_offset + 1; + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif + if (file_count != 0) { + dir_offset[curDirLever].curPage++; + lv_clear_print_file(); + disp_gcode_icon(file_count); + } + if (file_count < FILE_NUM) + dir_offset[curDirLever].cur_page_last_offset = 0; + } + } + } + else if (obj->mks_obj_id == ID_P_RETURN) { + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + if (curDirLever > 0) { + int8_t *ch = (int8_t *)strrchr(list_file.curDirPath, '/'); + if (ch) { + *ch = 0; + #if ENABLED(SDSUPPORT) + card.cdup(); + #endif + dir_offset[curDirLever].curPage = 0; + dir_offset[curDirLever].cur_page_first_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) + file_count = search_file(); + #endif + lv_clear_print_file(); + disp_gcode_icon(file_count); + } + } + else { + lv_clear_print_file(); + lv_draw_ready_print(); + } + } + } + else { + for (i = 0; i < FILE_BTN_CNT; i++) { + if (obj->mks_obj_id == (i + 1)) { + if (event == LV_EVENT_CLICKED) { + } + else if (event == LV_EVENT_RELEASED) { + if (list_file.file_name[i][0] != 0) { + if (list_file.IsFolder[i] == 1) { + 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; + #if ENABLED(SDSUPPORT) + file_count = search_file(); + #endif + lv_clear_print_file(); + disp_gcode_icon(file_count); + } + else { + sel_id = i; + lv_clear_print_file(); + lv_draw_dialog(DIALOG_TYPE_PRINT_FILE); + } + break; + } + } + } + } + } +} + +void lv_draw_print_file(void) { + //uint8_t i; + uint8_t file_count; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != PRINT_FILE_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINT_FILE_UI; + } + disp_state = PRINT_FILE_UI; + + curDirLever = 0; + dir_offset[curDirLever].curPage = 0; + + list_file.Sd_file_offset = 0; + list_file.Sd_file_cnt = 0; + + ZERO(dir_offset); + ZERO(list_file.IsFolder); + ZERO(list_file.curDirPath); + + list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; + #if ENABLED(SDSUPPORT) + card.mount(); + file_count = search_file(); + #endif + disp_gcode_icon(file_count); + + //lv_obj_t *labelPageUp = lv_label_create(buttonPageUp, NULL); + //lv_obj_t *labelPageDown = lv_label_create(buttonPageDown, NULL); + //lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + /* + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelPageUp, tool_menu.preheat); + lv_obj_align(labelPageUp, buttonPageUp, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelPageDown, tool_menu.extrude); + lv_obj_align(labelPageDown, buttonPageDown, 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); + } + */ +} +static char test_public_buf_l[40]; +void disp_gcode_icon(uint8_t file_num) { + uint8_t i; + + scr = lv_obj_create(NULL, NULL); + + //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_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()); + + // Create image buttons + buttonPageUp = lv_imgbtn_create(scr, NULL); + buttonPageDown = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonPageUp, event_handler, ID_P_UP, NULL, 0); + lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_REL, "F:/bmp_pageUp.bin"); + lv_imgbtn_set_src(buttonPageUp, LV_BTN_STATE_PR, "F:/bmp_pageUp.bin"); + 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); + + #if 1 + lv_obj_set_event_cb_mks(buttonPageDown, event_handler, ID_P_DOWN, NULL, 0); + lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); + lv_imgbtn_set_src(buttonPageDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); + 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); + lv_obj_set_pos(buttonPageDown, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H); + lv_obj_set_pos(buttonBack, OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2); + + // Create labels on the image buttons + lv_btn_set_layout(buttonPageUp, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPageDown, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + for (i = 0; i < FILE_BTN_CNT; i++) { + /* + if (seq) { + j = (FILE_BTN_CNT-1) - i; + back_flg = 1; + } + else { + j = i; + back_flg = 0; + } + */ + if (i >= file_num) break; + + #ifdef TFT35 + buttonGcode[i] = lv_imgbtn_create(scr, NULL); + + 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); + + ZERO(public_buf_m); + 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), NULL, 0); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_dir.bin"); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_dir.bin"); + if (i < 3) + lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); + else + 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_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 { + if (have_pre_pic((char *)list_file.file_name[i])) { + + //lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), list_file.file_name[i], 1); + + ZERO(test_public_buf_l); + strcat(test_public_buf_l,"S:"); + strcat(test_public_buf_l,list_file.file_name[i]); + char *temp = strstr(test_public_buf_l,".GCO"); + if (temp) { strcpy(temp,".bin"); } + lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), NULL, 0); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, test_public_buf_l); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, test_public_buf_l); + if (i < 3) { + lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET); + 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_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); + lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); + lv_obj_set_size(buttonText[i], 100, 40); + } + else { + lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET); + 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_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_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); + lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100); + lv_obj_set_size(buttonText[i], 100, 40); + } + labelPageUp[i] = lv_label_create(buttonText[i], NULL); + 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), NULL, 0); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_REL, "F:/bmp_file.bin"); + lv_imgbtn_set_src(buttonGcode[i], LV_BTN_STATE_PR, "F:/bmp_file.bin"); + if (i < 3) + lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight); + else + 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_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); + } + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonGcode[i]); + #endif + + #else // !TFT35 + #endif // !TFT35 + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPageUp); + lv_group_add_obj(g, buttonPageDown); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +uint32_t lv_open_gcode_file(char *path) { + #if ENABLED(SDSUPPORT) + uint32_t *ps4; + uint32_t pre_sread_cnt = 0; + char *cur_name; + + cur_name = strrchr(path, '/'); + + card.openFileRead(cur_name); + 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); + } + return pre_sread_cnt; + #endif // SDSUPPORT +} + +int ascii2dec_test(char *ascii) { + int result = 0; + if (ascii == 0) return 0; + + if (*(ascii) >= '0' && *(ascii) <= '9') + result = *(ascii) - '0'; + else if (*(ascii) >= 'a' && *(ascii) <= 'f') + result = *(ascii) - 'a' + 0x0A; + else if (*(ascii) >= 'A' && *(ascii) <= 'F') + result = *(ascii) - 'A' + 0x0A; + else + return 0; + + 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; + 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 + 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; + } + + 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; + } + #if ENABLED(TFT_LVGL_UI_SPI) + 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 // TFT_LVGL_UI_SPI + memcpy(data_buf, public_buf, 200); + #endif // SDSUPPORT +} + +void lv_close_gcode_file() {TERN_(SDSUPPORT, card.closefile());} + +void lv_gcode_file_seek(uint32_t pos) { + card.setIndex(pos); +} + +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 gFileTail[4] = {'~', '.', 'g', '\0'}; + #else + char *tmpFile; + char *strIndex1 = 0, *strIndex2 = 0, *beginIndex; + char secSeg[10] = {0}; + #endif + + if (path == 0 || len <= 3 || outStr == 0) return; + + tmpFile = path; + #if _LFN_UNICODE + strIndex1 = (WCHAR *)wcsstr((const WCHAR *)tmpFile, (const WCHAR *)'/'); + strIndex2 = (WCHAR *)wcsstr((const WCHAR *)tmpFile, (const WCHAR *)'.'); + #else + strIndex1 = (char *)strrchr(tmpFile, '/'); + strIndex2 = (char *)strrchr(tmpFile, '.'); + #endif + + beginIndex = (strIndex1 != 0 + //&& (strIndex2 != 0) && (strIndex1 < strIndex2) + ) ? strIndex1 + 1 : tmpFile; + + if (strIndex2 == 0 || (strIndex1 > strIndex2)) { // not gcode file + #if _LFN_UNICODE + if (wcslen(beginIndex) > len) + wcsncpy(outStr, beginIndex, len); + else + wcscpy(outStr, beginIndex); + #else + if ((int)strlen(beginIndex) > len) + strncpy(outStr, beginIndex, len); + else + strcpy(outStr, beginIndex); + #endif + } + else { // gcode file + if (strIndex2 - beginIndex > (len - 2)) { + #if _LFN_UNICODE + wcsncpy(outStr, (const WCHAR *)beginIndex, len - 3); + wcscat(outStr, (const WCHAR *)gFileTail); + #else + //strncpy(outStr, beginIndex, len - 3); + strncpy(outStr, beginIndex, len - 4); + strcat_P(outStr, PSTR("~.g")); + #endif + } + else { + #if _LFN_UNICODE + wcsncpy(outStr, (const WCHAR *)beginIndex, strIndex2 - beginIndex + 1); + wcscat(outStr, (const WCHAR *)&gFileTail[3]); + #else + strncpy(outStr, beginIndex, strIndex2 - beginIndex + 1); + strcat_P(outStr, PSTR("g")); + #endif + } + } + + #if _LFN_UNICODE + if (wcslen(outStr) > bytePerLine) { + wcscpy(secSeg, (const WCHAR *)&outStr[bytePerLine]); + 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 + 1] = '\0'; + strcat(outStr, secSeg); + } + else { + strcat_P(outStr, PSTR("\n")); + } + #endif +} + +void lv_clear_print_file() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI 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 new file mode 100644 index 00000000..083b3d9a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -0,0 +1,66 @@ +/** + * 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 + +typedef struct { + int cur_page_first_offset; + int cur_page_last_offset; + int curPage; +} DIR_OFFSET; +extern DIR_OFFSET dir_offset[10]; + +#define FILE_NUM 6 +#define SHORT_NEME_LEN 13 +#define NAME_CUT_LEN 23 + +#define MAX_DIR_LEVEL 10 + +typedef struct { + //char longName[FILE_NUM][LONG_FILENAME_LENGTH]; + char file_name[FILE_NUM][SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; + char curDirPath[SHORT_NEME_LEN * MAX_DIR_LEVEL + 1]; + char long_name[FILE_NUM][SHORT_NEME_LEN * 2 + 1]; + char IsFolder[FILE_NUM]; + char Sd_file_cnt; + char sd_file_index; + char Sd_file_offset; +} LIST_FILE; +extern LIST_FILE list_file; + +extern void disp_gcode_icon(uint8_t file_num); +extern void lv_draw_print_file(void); +extern uint32_t lv_open_gcode_file(char *path); +extern void lv_gcode_file_read(uint8_t *data_buf); +extern void lv_close_gcode_file(); +extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); +extern int ascii2dec_test(char *ascii); +extern void lv_clear_print_file(); +extern void lv_gcode_file_seek(uint32_t pos); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp new file mode 100644 index 00000000..c6369db4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -0,0 +1,434 @@ +/** + * 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 "../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 "../../../../module/temperature.h" +#include "../../../../module/motion.h" +#include "../../../../sd/cardreader.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif +#if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + #include "../../../ultralcd.h" +#endif + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *labelExt1, * labelFan, * labelZpos, * labelTime; +TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2;) +static lv_obj_t *labelPause, * labelStop, * labelOperat; +static lv_obj_t * bar1, *bar1ValueText; +static lv_obj_t * buttonPause, *buttonOperat, *buttonStop; + +#if HAS_HEATED_BED + static lv_obj_t* labelBed; +#endif + +#define ID_PAUSE 1 +#define ID_STOP 2 +#define ID_OPTION 3 + +uint8_t once_flag = 0; +extern uint32_t To_pre_view; +extern uint8_t flash_preview_begin; +extern uint8_t default_preview_flg; +extern uint8_t gcode_preview_over; + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_PAUSE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + 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(SDSUPPORT) + // queue.inject_P(PSTR("M25\nG91\nG1 Z10\nG90")); + card.pauseSDPrint(); + stop_print_time(); + uiCfg.print_state = PAUSING; + #endif + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); + 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; + lv_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); + lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); + 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_imgbtn_set_src(obj, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); + lv_imgbtn_set_src(obj, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); + 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 + } + } + break; + + case ID_STOP: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (gcode_preview_over != 1) { + lv_clear_printing(); + lv_draw_dialog(DIALOG_TYPE_STOP); + } + } + break; + case ID_OPTION: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + if (gcode_preview_over != 1) { + lv_clear_printing(); + lv_draw_operation(); + } + } + break; + } +} + +void lv_draw_printing(void) { + disp_state_stack._disp_index = 0; + ZERO(disp_state_stack._disp_state); + disp_state_stack._disp_state[disp_state_stack._disp_index] = PRINTING_UI; + + disp_state = PRINTING_UI; + + scr = lv_obj_create(NULL, NULL); + + // 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_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()); + + // Create image buttons + lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + #if HAS_MULTI_EXTRUDER + lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + #endif + #if HAS_HEATED_BED + lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + #endif + lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); + lv_obj_t *buttonTime = lv_img_create(scr, NULL); + lv_obj_t *buttonZpos = lv_img_create(scr, NULL); + buttonPause = lv_imgbtn_create(scr, NULL); + buttonStop = lv_imgbtn_create(scr, NULL); + buttonOperat = lv_imgbtn_create(scr, NULL); + + lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); + #if 1 + #if HAS_MULTI_EXTRUDER + lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); + #endif + #if HAS_HEATED_BED + lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); + #endif + + lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); + + lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); + + lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); + + if (uiCfg.print_state == WORKING) { + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_pause.bin"); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_pause.bin"); + } + else { + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_REL, "F:/bmp_resume.bin"); + lv_imgbtn_set_src(buttonPause, LV_BTN_STATE_PR, "F:/bmp_resume.bin"); + } + + lv_obj_set_event_cb_mks(buttonPause, event_handler, ID_PAUSE, NULL, 0); + 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, NULL, 0); + lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_REL, "F:/bmp_stop.bin"); + lv_imgbtn_set_src(buttonStop, LV_BTN_STATE_PR, "F:/bmp_stop.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_REL, "F:/bmp_operate.bin"); + lv_imgbtn_set_src(buttonOperat, LV_BTN_STATE_PR, "F:/bmp_operate.bin"); + 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 + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPause); + lv_group_add_obj(g, buttonStop); + lv_group_add_obj(g, buttonOperat); + } + #endif + + lv_obj_set_pos(buttonExt1, 205, 136); + + #if HAS_MULTI_EXTRUDER + lv_obj_set_pos(buttonExt2, 350, 136); + #endif + + #if HAS_HEATED_BED + lv_obj_set_pos(buttonBedstate, 205, 186); + #endif + + lv_obj_set_pos(buttonFanstate, 350, 186); + lv_obj_set_pos(buttonTime, 205, 86); + lv_obj_set_pos(buttonZpos, 350, 86); + lv_obj_set_pos(buttonPause, 5, 240); + lv_obj_set_pos(buttonStop, 165, 240); + lv_obj_set_pos(buttonOperat, 325, 240); + + // Create labels on the image buttons + //lv_btn_set_layout(buttonExt1, LV_LAYOUT_OFF); + //#if HAS_MULTI_EXTRUDER + //lv_btn_set_layout(buttonExt2, LV_LAYOUT_OFF); + //#endif + + //#if HAS_HEATED_BED + //lv_btn_set_layout(buttonBedstate, LV_LAYOUT_OFF); + //#endif + + //lv_btn_set_layout(buttonFanstate, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonTime, LV_LAYOUT_OFF); + //lv_btn_set_layout(buttonZpos, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonPause, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonStop, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonOperat, LV_LAYOUT_OFF); + + labelExt1 = lv_label_create(scr, NULL); + lv_obj_set_style(labelExt1, &tft_style_label_rel); + lv_obj_set_pos(labelExt1, 250, 146); + + #if HAS_MULTI_EXTRUDER + labelExt2 = lv_label_create(scr, NULL); + lv_obj_set_style(labelExt2, &tft_style_label_rel); + lv_obj_set_pos(labelExt2, 395, 146); + #endif + + #if HAS_HEATED_BED + labelBed = lv_label_create(scr, NULL); + 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_label_rel); + lv_obj_set_pos(labelFan, 395, 196); + + labelTime = lv_label_create(scr, NULL); + lv_obj_set_style(labelTime, &tft_style_label_rel); + lv_obj_set_pos(labelTime, 250, 96); + + labelZpos = lv_label_create(scr, NULL); + lv_obj_set_style(labelZpos, &tft_style_label_rel); + lv_obj_set_pos(labelZpos, 395, 96); + + labelPause = lv_label_create(buttonPause, NULL); + labelStop = lv_label_create(buttonStop, NULL); + labelOperat = lv_label_create(buttonOperat, NULL); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelPause, uiCfg.print_state == WORKING ? printing_menu.pause : printing_menu.resume); + 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, 20, 0); + + lv_label_set_text(labelOperat, printing_menu.option); + lv_obj_align(labelOperat, buttonOperat, LV_ALIGN_CENTER, 20, 0); + } + + bar1 = lv_bar_create(scr, NULL); + lv_obj_set_pos(bar1, 205, 36); + lv_obj_set_size(bar1, 270, 40); + lv_bar_set_style(bar1, LV_BAR_STYLE_INDIC, &lv_bar_style_indic); + lv_bar_set_anim_time(bar1, 1000); + lv_bar_set_value(bar1, 0, LV_ANIM_ON); + bar1ValueText = lv_label_create(bar1, NULL); + lv_label_set_text(bar1ValueText,"0%"); + lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); + + disp_ext_temp(); + disp_bed_temp(); + disp_fan_speed(); + disp_print_time(); + disp_fan_Zpos(); +} + +void disp_ext_temp() { + 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 HAS_MULTI_EXTRUDER + 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); + #endif +} + +void disp_bed_temp() { + #if HAS_HEATED_BED + 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() { + 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() { + ZERO(public_buf_l); + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + const uint32_t r = ui.get_remaining_time(); + sprintf_P(public_buf_l, PSTR("%02d:%02d R"), r / 3600, (r % 3600) / 60); + #else + 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() { + 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.minutes = 0; + print_time.seconds = 0; + print_time.ms_10 = 0; + // print_time.start = 1; +} + +void start_print_time() { print_time.start = 1; } + +void stop_print_time() { print_time.start = 0; } + +void setProBarRate() { + int rate; + volatile long long rate_tmp_r; + + if (gCfgItems.from_flash_pic != 1) { + #if ENABLED(SDSUPPORT) + rate_tmp_r = (long long)card.getIndex() * 100; + #endif + rate = rate_tmp_r / gCfgItems.curFilesize; + } + else { + #if ENABLED(SDSUPPORT) + rate_tmp_r = (long long)card.getIndex(); + #endif + rate = (rate_tmp_r - (PREVIEW_SIZE + To_pre_view)) * 100 / (gCfgItems.curFilesize - (PREVIEW_SIZE + To_pre_view)); + } + // gCurFileState.totalSend = rate; + + if (rate <= 0) return; + + if (disp_state == PRINTING_UI) { + lv_bar_set_value(bar1, rate, LV_ANIM_ON); + ZERO(public_buf_l); + sprintf_P(public_buf_l, "%d%%", rate); + lv_label_set_text(bar1ValueText,public_buf_l); + lv_obj_align(bar1ValueText, bar1, LV_ALIGN_CENTER, 0, 0); + + if (marlin_state == MF_SD_COMPLETE) { + if (once_flag == 0) { + stop_print_time(); + + flash_preview_begin = 0; + default_preview_flg = 0; + lv_clear_printing(); + lv_draw_dialog(DIALOG_TYPE_FINISH_PRINT); + + once_flag = 1; + + #if HAS_SUICIDE + if (gCfgItems.finish_power_off == 1) { + gcode.process_subcommands_now_P(PSTR("M1001")); + queue.inject_P(PSTR("M81")); + marlin_state = MF_RUNNING; + } + #endif + } + } + } +} + +void lv_clear_printing() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h new file mode 100644 index 00000000..b7d464e4 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -0,0 +1,52 @@ +/** + * 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 + +#define IDLE 0 +#define WORKING 1 +#define PAUSING 2 +#define PAUSED 3 +#define REPRINTING 4 +#define REPRINTED 5 +#define RESUMING 6 +#define STOP 7 + +extern void lv_draw_printing(void); +extern void lv_clear_printing(); +extern void disp_ext_temp(); +extern void disp_bed_temp(); +extern void disp_fan_speed(); +extern void disp_print_time(); +extern void disp_fan_Zpos(); +extern void reset_print_time(); +extern void start_print_time(); +extern void stop_print_time(); +extern void setProBarRate(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 new file mode 100644 index 00000000..54ffdca6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -0,0 +1,310 @@ +/** + * 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 "draw_ready_print.h" +#include "draw_tool.h" +#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 "tft_lvgl_configuration.h" +#include "mks_hardware_test.h" +#include "draw_ui.h" + +#include + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" + +#include + +//static lv_obj_t *buttonPrint,*buttonTool,*buttonSet; +extern lv_group_t* g; +static lv_obj_t * scr; +#if ENABLED(MKS_TEST) + uint8_t curent_disp_ui = 0; +#endif + +#define ID_TOOL 1 +#define ID_SET 2 +#define ID_PRINT 3 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_TOOL: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + + lv_clear_ready_print(); + lv_draw_tool(); + } + break; + case ID_SET: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_ready_print(); + lv_draw_set(); + } + break; + case ID_PRINT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_ready_print(); + lv_draw_print_file(); + } + break; + } +} + +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"); +} + +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); + #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 +} + +void lv_draw_ready_print(void) { + char buf[30] = {0}; + lv_obj_t *buttonPrint, *buttonTool, *buttonSet; + + 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; + + disp_state = PRINT_READY_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_set_hidden(scr,true); + lv_refr_now(lv_refr_get_disp_refreshing()); + + 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 image buttons + //buttonPrint = lv_imgbtn_create(scr, NULL); + buttonTool = lv_imgbtn_create(scr, NULL); + //buttonSet = lv_imgbtn_create(scr, NULL); + + #if 1 + lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); + 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 labels on the image buttons + //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_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_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); + } + + #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 { + // Create an Image button + buttonTool = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonTool, 20, 90); + lv_obj_set_event_cb_mks(buttonTool, event_handler, ID_TOOL, NULL, 0); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_REL, "F:/bmp_tool.bin"); + lv_imgbtn_set_src(buttonTool, LV_BTN_STATE_PR, "F:/bmp_tool.bin"); + 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); + lv_obj_t *label_tool = lv_label_create(buttonTool, NULL); + lv_btn_set_layout(buttonTool, LV_LAYOUT_OFF); + + buttonSet = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonSet, 180, 90); + lv_obj_set_event_cb_mks(buttonSet, event_handler, ID_SET, NULL, 0); + lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_REL, "F:/bmp_set.bin"); + lv_imgbtn_set_src(buttonSet, LV_BTN_STATE_PR, "F:/bmp_set.bin"); + 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_t *label_set = lv_label_create(buttonSet, NULL); + lv_btn_set_layout(buttonSet, LV_LAYOUT_OFF); + + buttonPrint = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonPrint, 340, 90); + lv_obj_set_event_cb_mks(buttonPrint, event_handler, ID_PRINT, NULL, 0); + lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_REL, "F:/bmp_printing.bin"); + lv_imgbtn_set_src(buttonPrint, LV_BTN_STATE_PR, "F:/bmp_printing.bin"); + 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_t *label_print = lv_label_create(buttonPrint, NULL); + lv_btn_set_layout(buttonPrint, LV_LAYOUT_OFF); + + 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_text(label_tool, main_menu.tool); + lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) { + lv_group_add_obj(g, buttonTool); + lv_group_add_obj(g, buttonSet); + lv_group_add_obj(g, buttonPrint); + } + #endif + } +} + +void lv_clear_ready_print() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable == true) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#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 new file mode 100644 index 00000000..5cefe8b5 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern void lv_draw_ready_print(void); +extern void mks_disp_test(); +extern void disp_Limit_ok(); +extern void disp_Limit_error(); +extern void disp_det_error(); +extern void disp_det_ok(); +extern void lv_clear_ready_print(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp new file mode 100644 index 00000000..6c10713d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.cpp @@ -0,0 +1,389 @@ +/** + * 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 "draw_ready_print.h" +#include "draw_set.h" +#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 "draw_ui.h" +#include "../../../../gcode/queue.h" +#include "pic_manager.h" + +static lv_obj_t * scr; +extern lv_group_t* g; + +#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) { + #if ENABLED(USE_WIFI_FUNCTION) + char buf[6] = { 0 }; + #endif + switch (obj->mks_obj_id) { + + case ID_S_FAN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_set(); + lv_draw_fan(); + } + break; + case ID_S_ABOUT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_set(); + lv_draw_about(); + } + break; + case ID_S_CONTINUE: + + break; + case ID_S_MOTOR_OFF: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if HAS_SUICIDE + suicide(); + #else + queue.enqueue_now_P(PSTR("M84")); + #endif + } + break; + case ID_S_LANGUAGE: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_set(); + lv_draw_language(); + } + break; + case ID_S_MACHINE_PARA: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_set(); + lv_draw_machine_para(); + } + break; + case ID_S_EEPROM_SET: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_set(); + lv_draw_eeprom_settings(); + } + break; + case ID_S_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_set(); + lv_draw_ready_print(); + } + break; + #if ENABLED(USE_WIFI_FUNCTION) + case ID_S_WIFI: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + if (wifi_link_state == WIFI_CONNECTED) { + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_wifi(); + } + else { + if (uiCfg.command_send == 1) { + buf[0] = 0xA5; + buf[1] = 0x07; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0xFC; + raw_send_to_wifi(buf, 5); + + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_wifi_list(); + } + else { + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_dialog(WIFI_ENABLE_TIPS); + } + } + } + else { + last_disp_state = SET_UI; + lv_clear_set(); + lv_draw_wifi(); + } + } + break; + #endif + } +} + +void lv_draw_set(void) { + lv_obj_t *buttonFan, *buttonAbout; + lv_obj_t *buMotorOff, *buttonBack; + #if HAS_LANG_SELECT_SCREEN + lv_obj_t *buttonLanguage; + #endif + lv_obj_t *buttonMachinePara; + lv_obj_t *buttonEepromSet; + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_t *buttonWifi; + #endif + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != SET_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = SET_UI; + } + disp_state = SET_UI; + + scr = lv_obj_create(NULL, NULL); + + //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_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()); + + // Create image buttons + buttonEepromSet = lv_imgbtn_create(scr, NULL); + //buttonWifi = 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); + buttonMachinePara = lv_imgbtn_create(scr, NULL); + #if HAS_LANG_SELECT_SCREEN + buttonLanguage = lv_imgbtn_create(scr, NULL); + #endif + #if ENABLED(USE_WIFI_FUNCTION) + buttonWifi = lv_imgbtn_create(scr, NULL); + #endif + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonEepromSet, event_handler, ID_S_EEPROM_SET, NULL, 0); + lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_REL, "F:/bmp_eeprom_settings.bin"); + lv_imgbtn_set_src(buttonEepromSet, LV_BTN_STATE_PR, "F:/bmp_eeprom_settings.bin"); + 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); + + #if 1 + lv_obj_set_event_cb_mks(buttonFan, event_handler, ID_S_FAN, NULL, 0); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_REL, "F:/bmp_fan.bin"); + lv_imgbtn_set_src(buttonFan, LV_BTN_STATE_PR, "F:/bmp_fan.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_REL, "F:/bmp_about.bin"); + lv_imgbtn_set_src(buttonAbout, LV_BTN_STATE_PR, "F:/bmp_about.bin"); + 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(buMotorOff, event_handler, ID_S_MOTOR_OFF, NULL, 0); + + #if HAS_SUICIDE + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_manual_off.bin"); + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_manual_off.bin"); + #else + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_REL, "F:/bmp_function1.bin"); + lv_imgbtn_set_src(buMotorOff, LV_BTN_STATE_PR, "F:/bmp_function1.bin"); + #endif + 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); + + lv_obj_set_event_cb_mks(buttonMachinePara, event_handler, ID_S_MACHINE_PARA, NULL, 0); + lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_REL, "F:/bmp_machine_para.bin"); + lv_imgbtn_set_src(buttonMachinePara, LV_BTN_STATE_PR, "F:/bmp_machine_para.bin"); + 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); + + #if HAS_LANG_SELECT_SCREEN + lv_obj_set_event_cb_mks(buttonLanguage, event_handler, ID_S_LANGUAGE, NULL, 0); + lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_REL, "F:/bmp_language.bin"); + lv_imgbtn_set_src(buttonLanguage, LV_BTN_STATE_PR, "F:/bmp_language.bin"); + 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 + + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_set_event_cb_mks(buttonWifi, event_handler,ID_S_WIFI,NULL,0); + lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); + lv_imgbtn_set_src(buttonWifi, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); + 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); + #endif + + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_S_RETURN,NULL , 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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(buttonEepromSet, 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, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight); + + lv_obj_set_pos(buttonMachinePara, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + #if HAS_LANG_SELECT_SCREEN + lv_obj_set_pos(buttonLanguage, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + #endif + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_set_pos(buttonWifi,BTN_X_PIXEL*2+INTERVAL_V*3,BTN_Y_PIXEL+INTERVAL_H+titleHeight); + #endif + lv_obj_set_pos(buttonBack, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight); + + /// Create labels on the buttons + //lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonEepromSet, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonFan, LV_LAYOUT_OFF); + 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(buttonMachinePara, LV_LAYOUT_OFF); + #if HAS_LANG_SELECT_SCREEN + lv_btn_set_layout(buttonLanguage, LV_LAYOUT_OFF); + #endif + #if ENABLED(USE_WIFI_FUNCTION) + lv_btn_set_layout(buttonWifi, LV_LAYOUT_OFF); + #endif + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + //lv_obj_t *labelWifi= lv_label_create(buttonWifi, NULL); + lv_obj_t *label_EepromSet = lv_label_create(buttonEepromSet, 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); + lv_obj_t *label_MachinePara = lv_label_create(buttonMachinePara, NULL); + #if HAS_LANG_SELECT_SCREEN + lv_obj_t *label_Language = lv_label_create(buttonLanguage, NULL); + #endif + #if ENABLED(USE_WIFI_FUNCTION) + lv_obj_t *label_Wifi = lv_label_create(buttonWifi, NULL); + #endif + lv_obj_t *label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + + 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(labelFan, set_menu.fan); + lv_obj_align(labelFan, buttonFan, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_About, set_menu.about); + lv_obj_align(label_About, buttonAbout, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + //lv_label_set_text(label_Continue, set_menu.breakpoint); + //lv_obj_align(label_Continue, buttonContinue, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + lv_label_set_text(label_MotorOff, set_menu.TERN(HAS_SUICIDE, shutdown, motoroff)); + lv_obj_align(label_MotorOff, buMotorOff, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + 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); + + #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 + + #if ENABLED(USE_WIFI_FUNCTION) + lv_label_set_text(label_Wifi, set_menu.wifi); + lv_obj_align(label_Wifi, buttonWifi, 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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonEepromSet); + lv_group_add_obj(g, buttonFan); + lv_group_add_obj(g, buttonAbout); + lv_group_add_obj(g, buMotorOff); + lv_group_add_obj(g, buttonMachinePara); + lv_group_add_obj(g, buttonLanguage); + #if ENABLED(USE_WIFI_FUNCTION) + lv_group_add_obj(g, buttonWifi); + #endif + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_set() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h new file mode 100644 index 00000000..b243bca2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.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_set(void); +extern void lv_clear_set(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..baad23f9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.cpp @@ -0,0 +1,328 @@ +/** + * 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" + +extern lv_group_t * g; +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 *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *labelE0Text = NULL, *buttonE0Value = NULL, *labelE0Value = NULL; + lv_obj_t *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()); + + if (uiCfg.para_ui_page != 1) { + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Steps); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_STEP_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Steps); + + buttonYValue = lv_btn_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_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_STEP_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Steps); + + buttonZValue = lv_btn_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_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_STEP_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0_Steps); + + buttonE0Value = lv_btn_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_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_STEP_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + else { + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelE1Text, machine_menu.E1_Steps); + + buttonE1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_STEP_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_STEP_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + } + + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + + buttonBack = lv_btn_create(scr, NULL); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_STEP_RETURN, NULL, 0); + label_Back = lv_label_create(buttonBack, NULL); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + 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(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() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..b7eaeb4c --- /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 00000000..10aa7bad --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.cpp @@ -0,0 +1,387 @@ +/** + * 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" + +extern lv_group_t * g; +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; + #if AXIS_IS_TMC(X) + 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; + #endif + + #if AXIS_IS_TMC(Y) + 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; + #endif + + #if AXIS_IS_TMC(Z) + 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; + #endif + + #if AXIS_IS_TMC(E0) + 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; + #endif + + #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; + #endif + 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; + } +} + +void lv_draw_tmc_current_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL; + lv_obj_t *labelXText = NULL, *buttonXValue = NULL, *labelXValue = NULL; + lv_obj_t *labelYText = NULL, *buttonYValue = NULL, *labelYValue = NULL; + lv_obj_t *labelZText = NULL, *buttonZValue = NULL, *labelZValue = NULL; + lv_obj_t *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 *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()); + + if (uiCfg.para_ui_page != 1) { + labelXText = lv_label_create(scr, NULL); + lv_obj_set_style(labelXText, &tft_style_label_rel); + lv_obj_set_pos(labelXText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelXText, machine_menu.X_Current); + + buttonXValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonXValue, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonXValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonXValue, event_handler, ID_TMC_CURRENT_X, NULL, 0); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonXValue, LV_BTN_STYLE_PR, &style_para_value); + labelXValue = lv_label_create(buttonXValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + labelYText = lv_label_create(scr, NULL); + lv_obj_set_style(labelYText, &tft_style_label_rel); + lv_obj_set_pos(labelYText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + lv_label_set_text(labelYText, machine_menu.Y_Current); + + buttonYValue = lv_btn_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_size(buttonYValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonYValue, event_handler, ID_TMC_CURRENT_Y, NULL, 0); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonYValue, LV_BTN_STYLE_PR, &style_para_value); + labelYValue = lv_label_create(buttonYValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2, line_points[1]); + + labelZText = lv_label_create(scr, NULL); + lv_obj_set_style(labelZText, &tft_style_label_rel); + lv_obj_set_pos(labelZText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + lv_label_set_text(labelZText, machine_menu.Z_Current); + + buttonZValue = lv_btn_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_size(buttonZValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonZValue, event_handler, ID_TMC_CURRENT_Z, NULL, 0); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonZValue, LV_BTN_STYLE_PR, &style_para_value); + labelZValue = lv_label_create(buttonZValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3, line_points[2]); + + labelE0Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE0Text, &tft_style_label_rel); + lv_obj_set_pos(labelE0Text, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelE0Text, machine_menu.E0_Current); + + buttonE0Value = lv_btn_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_size(buttonE0Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE0Value, event_handler, ID_TMC_CURRENT_E0, NULL, 0); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE0Value, LV_BTN_STYLE_PR, &style_para_value); + labelE0Value = lv_label_create(buttonE0Value, NULL); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonXValue); + lv_group_add_obj(g, buttonYValue); + lv_group_add_obj(g, buttonZValue); + lv_group_add_obj(g, buttonE0Value); + } + #endif + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4, line_points[3]); + + //#if AXIS_IS_TMC(E1) + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_DOWN, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); + #endif + //#endif + } + else { + //#if AXIS_IS_TMC(E1) + labelE1Text = lv_label_create(scr, NULL); + lv_obj_set_style(labelE1Text, &tft_style_label_rel); + lv_obj_set_pos(labelE1Text, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelE1Text, machine_menu.E1_Current); + + buttonE1Value = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonE1Value, PARA_UI_VALUE_POS_X, PARA_UI_POS_Y + PARA_UI_VALUE_V); + lv_obj_set_size(buttonE1Value, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonE1Value, event_handler, ID_TMC_CURRENT_E1, NULL, 0); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonE1Value, LV_BTN_STYLE_PR, &style_para_value); + labelE1Value = lv_label_create(buttonE1Value, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1, line_points[0]); + + buttonTurnPage = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonTurnPage, event_handler, ID_TMC_CURRENT_UP, NULL, 0); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonTurnPage, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonE1Value); + lv_group_add_obj(g, buttonTurnPage); + } + #endif + //#endif + } + //#if AXIS_IS_TMC(E1) + lv_obj_set_pos(buttonTurnPage, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_obj_set_size(buttonTurnPage, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + labelTurnPage = lv_label_create(buttonTurnPage, NULL); + //#endif + + buttonBack = lv_btn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_TMC_CURRENT_RETURN, NULL, 0); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_REL, &style_para_back); + lv_btn_set_style(buttonBack, LV_BTN_STYLE_PR, &style_para_back); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + lv_obj_set_pos(buttonBack, PARA_UI_BACL_POS_X, PARA_UI_BACL_POS_Y); + lv_obj_set_size(buttonBack, PARA_UI_BACK_BTN_X_SIZE, PARA_UI_BACK_BTN_Y_SIZE); + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.multiple_language != 0) { + if (uiCfg.para_ui_page != 1) { + //#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(); + #else + milliamps = -1; + #endif + 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); + + #if AXIS_IS_TMC(Y) + milliamps = stepperY.getMilliamps(); + #else + milliamps = -1; + #endif + 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); + + #if AXIS_IS_TMC(Z) + milliamps = stepperZ.getMilliamps(); + #else + milliamps = -1; + #endif + 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); + + #if AXIS_IS_TMC(E0) + milliamps = stepperE0.getMilliamps(); + #else + milliamps = -1; + #endif + 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); + } + else { + //#if AXIS_IS_TMC(E1) + lv_label_set_text(labelTurnPage, machine_menu.previous); + lv_obj_align(labelTurnPage, buttonTurnPage, LV_ALIGN_CENTER, 0, 0); + #if AXIS_IS_TMC(E1) + milliamps = stepperE1.getMilliamps(); + #else + milliamps = -1; + #endif + 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() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..927db371 --- /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 00000000..3e014a78 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.cpp @@ -0,0 +1,586 @@ +/** + * 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" + +extern lv_group_t * g; +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; + + #if AXIS_HAS_STEALTHCHOP(X) + case ID_TMC_MODE_X: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperX.stored.stealthChop_enabled) { + stepperX.stored.stealthChop_enabled = false; + stepperX.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + 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_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelXState, machine_menu.enable); + // gcode.process_subcommands_now_P(PSTR("M500")); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(X) + + #if AXIS_HAS_STEALTHCHOP(Y) + case ID_TMC_MODE_Y: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperY.stored.stealthChop_enabled) { + stepperY.stored.stealthChop_enabled = false; + stepperY.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + 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_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelYState, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(Y) + + #if AXIS_HAS_STEALTHCHOP(Z) + case ID_TMC_MODE_Z: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperZ.stored.stealthChop_enabled) { + stepperZ.stored.stealthChop_enabled = false; + stepperZ.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + 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_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelZState, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(Z) + + #if AXIS_HAS_STEALTHCHOP(E0) + case ID_TMC_MODE_E0: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (stepperE0.stored.stealthChop_enabled) { + stepperE0.stored.stealthChop_enabled = false; + stepperE0.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + 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_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelE0State, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(E0) + + #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) { + stepperE1.stored.stealthChop_enabled = false; + stepperE1.refresh_stepping_mode(); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + 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_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + lv_label_set_text(labelE1State, machine_menu.enable); + } + gcode.process_subcommands_now_P(PSTR("M500")); + } + break; + #endif // if AXIS_HAS_STEALTHCHOP(E1) + 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; + } +} + +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()); + + 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 AXIS_HAS_STEALTHCHOP(X) + if (stepperX.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonXState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonXState, event_handler, ID_TMC_MODE_X, NULL, 0); + + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonXState); + #endif + + 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 AXIS_HAS_STEALTHCHOP(Y) + if (stepperY.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonYState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonYState, event_handler, ID_TMC_MODE_Y, NULL, 0); + + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonYState); + #endif + + 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 AXIS_HAS_STEALTHCHOP(Z) + if (stepperZ.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonZState, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonZState, event_handler, ID_TMC_MODE_Z, NULL, 0); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonZState); + #endif + + 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 AXIS_HAS_STEALTHCHOP(E0) + if (stepperE0.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE0State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + + lv_obj_set_event_cb_mks(buttonE0State, event_handler, ID_TMC_MODE_E0, NULL, 0); + + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE0State); + #endif + + + 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, NULL, 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonTurnPage); + #endif + //#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 AXIS_HAS_STEALTHCHOP(E1) + if (stepperE1.get_stealthChop_status()) { + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + #else + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonE1State, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + #endif + lv_obj_set_event_cb_mks(buttonE1State, event_handler, ID_TMC_MODE_E1, NULL, 0); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonE1State); + #endif + + 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, NULL, 0); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonTurnPage, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + 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 AXIS_HAS_STEALTHCHOP(X) + if (stepperX.get_stealthChop_status()) + lv_label_set_text(labelXState, machine_menu.enable); + else + lv_label_set_text(labelXState, machine_menu.disable); + #else + lv_label_set_text(labelXState, machine_menu.disable); + #endif + lv_obj_align(labelXState, buttonXState, LV_ALIGN_CENTER, 0, 0); + + #if AXIS_HAS_STEALTHCHOP(Y) + if (stepperY.get_stealthChop_status()) + lv_label_set_text(labelYState, machine_menu.enable); + else + lv_label_set_text(labelYState, machine_menu.disable); + #else + lv_label_set_text(labelYState, machine_menu.disable); + #endif + lv_obj_align(labelYState, buttonYState, LV_ALIGN_CENTER, 0, 0); + + #if AXIS_HAS_STEALTHCHOP(Z) + if (stepperZ.get_stealthChop_status()) + lv_label_set_text(labelZState, machine_menu.enable); + else + lv_label_set_text(labelZState, machine_menu.disable); + #else + lv_label_set_text(labelZState, machine_menu.disable); + #endif + lv_obj_align(labelZState, buttonZState, LV_ALIGN_CENTER, 0, 0); + + #if AXIS_HAS_STEALTHCHOP(E0) + if (stepperE0.get_stealthChop_status()) + lv_label_set_text(labelE0State, machine_menu.enable); + else + lv_label_set_text(labelE0State, machine_menu.disable); + #else + lv_label_set_text(labelE0State, machine_menu.disable); + #endif + 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 AXIS_HAS_STEALTHCHOP(E1) + if (stepperE1.get_stealthChop_status()) + lv_label_set_text(labelE1State, machine_menu.enable); + else + lv_label_set_text(labelE1State, machine_menu.disable); + #else + lv_label_set_text(labelE1State, machine_menu.disable); + #endif + 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() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + 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 00000000..35c57ab0 --- /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 new file mode 100644 index 00000000..3681b1b2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -0,0 +1,284 @@ +/** + * 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 "../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 "../../../../gcode/queue.h" +#include "../../../../module/temperature.h" + +extern lv_group_t * g; +static lv_obj_t * scr; + +#define ID_T_PRE_HEAT 1 +#define ID_T_EXTRUCT 2 +#define ID_T_MOV 3 +#define ID_T_HOME 4 +#define ID_T_LEVELING 5 +#define ID_T_FILAMENT 6 +#define ID_T_MORE 7 +#define ID_T_RETURN 8 + +#if ENABLED(MKS_TEST) + extern uint8_t curent_disp_ui; +#endif + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_T_PRE_HEAT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_tool(); + lv_draw_preHeat(); + } + break; + case ID_T_EXTRUCT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_tool(); + lv_draw_extrusion(); + } + break; + case ID_T_MOV: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_tool(); + lv_draw_move_motor(); + } + break; + case ID_T_HOME: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_tool(); + lv_draw_home(); + } + break; + case ID_T_LEVELING: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + //queue.enqueue_one_P(PSTR("G28")); + //queue.enqueue_one_P(PSTR("G29")); + get_gcode_command(AUTO_LEVELING_COMMAND_ADDR,(uint8_t *)public_buf_m); + public_buf_m[sizeof(public_buf_m)-1] = 0; + queue.inject_P(PSTR(public_buf_m)); + #else + uiCfg.leveling_first_time = 1; + lv_clear_tool(); + lv_draw_manualLevel(); + #endif + } + break; + case ID_T_FILAMENT: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; + lv_clear_tool(); + lv_draw_filament_change(); + } + break; + case ID_T_MORE: break; + case ID_T_RETURN: + if (event == LV_EVENT_CLICKED) { + // nothing to do + } + else if (event == LV_EVENT_RELEASED) { + TERN_(MKS_TEST, curent_disp_ui = 1); + lv_clear_tool(); + lv_draw_ready_print(); + } + break; + } +} + +void lv_draw_tool(void) { + lv_obj_t *buttonPreHeat, *buttonExtrusion, *buttonMove, *buttonHome, *buttonLevel; + lv_obj_t *buttonFilament; + lv_obj_t *buttonBack; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != TOOL_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = TOOL_UI; + } + disp_state = TOOL_UI; + + scr = lv_obj_create(NULL, NULL); + + //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_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()); + + // Create image buttons + 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); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonPreHeat, event_handler, ID_T_PRE_HEAT, NULL, 0); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_REL, "F:/bmp_preHeat.bin"); + lv_imgbtn_set_src(buttonPreHeat, LV_BTN_STATE_PR, "F:/bmp_preHeat.bin"); + 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_set_event_cb_mks(buttonExtrusion, event_handler, ID_T_EXTRUCT, NULL, 0); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_REL, "F:/bmp_extruct.bin"); + lv_imgbtn_set_src(buttonExtrusion, LV_BTN_STATE_PR, "F:/bmp_extruct.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_REL, "F:/bmp_mov.bin"); + lv_imgbtn_set_src(buttonMove, LV_BTN_STATE_PR, "F:/bmp_mov.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_REL, "F:/bmp_zero.bin"); + lv_imgbtn_set_src(buttonHome, LV_BTN_STATE_PR, "F:/bmp_zero.bin"); + 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, NULL, 0); + lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_REL, "F:/bmp_leveling.bin"); + lv_imgbtn_set_src(buttonLevel, LV_BTN_STATE_PR, "F:/bmp_leveling.bin"); + 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,NULL,0); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_REL, "F:/bmp_filamentchange.bin"); + lv_imgbtn_set_src(buttonFilament, LV_BTN_STATE_PR, "F:/bmp_filamentchange.bin"); + 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(buttonBack, event_handler, ID_T_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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(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); + + // Create labels on the image buttons + lv_btn_set_layout(buttonPreHeat, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonExtrusion, LV_LAYOUT_OFF); + 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(buttonBack, LV_LAYOUT_OFF); + + 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_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); + + if (gCfgItems.multiple_language != 0) { + lv_label_set_text(labelPreHeat, tool_menu.preheat); + lv_obj_align(labelPreHeat, buttonPreHeat, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(labelExtrusion, tool_menu.extrude); + lv_obj_align(labelExtrusion, buttonExtrusion, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Move, tool_menu.move); + lv_obj_align(label_Move, buttonMove, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Home, tool_menu.home); + lv_obj_align(label_Home, buttonHome, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); + + 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_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); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonPreHeat); + lv_group_add_obj(g, buttonExtrusion); + lv_group_add_obj(g, buttonMove); + lv_group_add_obj(g, buttonHome); + lv_group_add_obj(g, buttonLevel); + lv_group_add_obj(g, buttonFilament); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_tool() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h new file mode 100644 index 00000000..8a033e2c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.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_tool(void); +extern void lv_clear_tool(); + +//extern void disp_temp_ready_print(); +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp new file mode 100644 index 00000000..d600b09a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -0,0 +1,1631 @@ +/** + * 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 "SPI_TFT.h" + +#include "tft_lvgl_configuration.h" + +#include "pic_manager.h" + +#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" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../../../feature/pause.h" +#endif + +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; +num_key_value_state value; +keyboard_value_state keyboard_value; + +uint32_t To_pre_view; +uint8_t gcode_preview_over; +uint8_t flash_preview_begin; +uint8_t default_preview_flg; +uint32_t size = 809; +uint16_t row; +uint8_t temperature_change_frequency; +uint8_t printing_rate_update_flag; + +extern uint8_t once_flag; +extern uint8_t sel_id; +extern uint8_t public_buf[512]; +extern uint8_t bmp_public_buf[17 * 1024]; + +extern void LCD_IO_WriteData(uint16_t RegValue); + +static const char custom_gcode_command[][100] = { + "G28\nG29\nM500", + "G28", + "G28", + "G28", + "G28" +}; + +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 + 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; + gCfgItems.finish_power_off = 0; + gCfgItems.pause_reprint = 0; + gCfgItems.pausePosX = -1; + gCfgItems.pausePosY = -1; + gCfgItems.pausePosZ = 5; + gCfgItems.levelingPos[0][0] = X_MIN_POS + 30; + gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30; + gCfgItems.levelingPos[1][0] = X_MAX_POS - 30; + gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30; + gCfgItems.levelingPos[2][0] = X_MAX_POS - 30; + gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30; + gCfgItems.levelingPos[3][0] = X_MIN_POS + 30; + gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; + gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; + gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; + gCfgItems.cloud_enable = true; + #if ENABLED(USE_WIFI_FUNCTION) + gCfgItems.wifi_mode_sel = STA_MODEL; + gCfgItems.fileSysType = FILE_SYS_SD; + gCfgItems.wifi_type = ESP_WIFI; + #endif + gCfgItems.filamentchange_load_length = 200; + gCfgItems.filamentchange_load_speed = 1000; + gCfgItems.filamentchange_unload_length = 200; + gCfgItems.filamentchange_unload_speed = 1000; + gCfgItems.filament_limit_temper = 200; + + gCfgItems.encoder_enable = true; + + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems.spi_flash_flag, VAR_INF_ADDR, sizeof(gCfgItems.spi_flash_flag)); + if (gCfgItems.spi_flash_flag == FLASH_INF_VALID_FLAG) { + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + } + else { + gCfgItems.spi_flash_flag = FLASH_INF_VALID_FLAG; + W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + //init gcode command + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[0], AUTO_LEVELING_COMMAND_ADDR, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[1], OTHERS_COMMAND_ADDR_1, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[2], OTHERS_COMMAND_ADDR_2, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[3], OTHERS_COMMAND_ADDR_3, 100); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&custom_gcode_command[4], OTHERS_COMMAND_ADDR_4, 100); + } + + const byte rot = (TFT_ROTATION & TFT_ROTATE_180) ? 0xEE : 0x00; + if (gCfgItems.disp_rotation_180 != rot) { + gCfgItems.disp_rotation_180 = rot; + update_spi_flash(); + } + + 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 ui_cfg_init() { + uiCfg.curTempType = 0; + uiCfg.curSprayerChoose = 0; + uiCfg.stepHeat = 10; + uiCfg.leveling_first_time = 0; + uiCfg.para_ui_page = 0; + uiCfg.extruStep = 5; + uiCfg.extruSpeed = 10; + uiCfg.move_dist = 1; + uiCfg.moveSpeed = 3000; + uiCfg.stepPrintSpeed = 10; + uiCfg.command_send = 0; + uiCfg.dialogType = 0; + uiCfg.filament_heat_completed_load = 0; + uiCfg.filament_rate = 0; + uiCfg.filament_loading_completed = 0; + uiCfg.filament_unloading_completed = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_time_cnt = 0; + + #if ENABLED(USE_WIFI_FUNCTION) + memset(&wifiPara, 0, sizeof(wifiPara)); + memset(&ipPara, 0, sizeof(ipPara)); + strcpy(wifiPara.ap_name, WIFI_AP_NAME); + strcpy(wifiPara.keyCode, WIFI_KEY_CODE); + //client + strcpy(ipPara.ip_addr, IP_ADDR); + strcpy(ipPara.mask, IP_MASK); + strcpy(ipPara.gate, IP_GATE); + strcpy(ipPara.dns, IP_DNS); + + ipPara.dhcp_flag = IP_DHCP_FLAG; + + //AP + strcpy(ipPara.dhcpd_ip, AP_IP_ADDR); + strcpy(ipPara.dhcpd_mask, AP_IP_MASK); + strcpy(ipPara.dhcpd_gate, AP_IP_GATE); + strcpy(ipPara.dhcpd_dns, AP_IP_DNS); + strcpy(ipPara.start_ip_addr, IP_START_IP); + strcpy(ipPara.end_ip_addr, IP_END_IP); + + ipPara.dhcpd_flag = AP_IP_DHCP_FLAG; + + strcpy((char*)uiCfg.cloud_hostUrl, "baizhongyun.cn"); + uiCfg.cloud_port = 10086; + #endif + + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0 / gCfgItems.filamentchange_load_speed) + 0.5); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0 / gCfgItems.filamentchange_unload_speed) + 0.5); +} + +void update_spi_flash() { + uint8_t command_buf[512]; + + W25QXX.init(SPI_QUARTER_SPEED); + //read back the gcode command befor erase spi flash + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); + W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); +} + +void update_gcode_command(int addr,uint8_t *s) { + uint8_t command_buf[512]; + + W25QXX.init(SPI_QUARTER_SPEED); + //read back the gcode command befor erase spi flash + W25QXX.SPI_FLASH_BufferRead((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); + W25QXX.SPI_FLASH_SectorErase(VAR_INF_ADDR); + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&gCfgItems, VAR_INF_ADDR, sizeof(gCfgItems)); + switch (addr) { + case AUTO_LEVELING_COMMAND_ADDR: memcpy(&command_buf[0*100], s, 100); break; + case OTHERS_COMMAND_ADDR_1: memcpy(&command_buf[1*100], s, 100); break; + case OTHERS_COMMAND_ADDR_2: memcpy(&command_buf[2*100], s, 100); break; + case OTHERS_COMMAND_ADDR_3: memcpy(&command_buf[3*100], s, 100); break; + case OTHERS_COMMAND_ADDR_4: memcpy(&command_buf[4*100], s, 100); break; + default: break; + } + W25QXX.SPI_FLASH_BufferWrite((uint8_t *)&command_buf, GCODE_COMMAND_ADDR, sizeof(command_buf)); +} + +void get_gcode_command(int addr,uint8_t *d) { + W25QXX.init(SPI_QUARTER_SPEED); + W25QXX.SPI_FLASH_BufferRead((uint8_t *)d, addr, 100); +} + +lv_style_t tft_style_scr; +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; +lv_style_t style_sel_text; + +lv_style_t style_para_value; +lv_style_t style_para_back; + +lv_style_t lv_bar_style_indic; + +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.text.letter_space = 0; + 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_TEXT; + style_para_value_pre.text.sel_color = LV_COLOR_TEXT; + 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 + style_num_key_pre.text.font = &gb2312_puhui32; + style_num_key_rel.text.font = &gb2312_puhui32; + #else + style_num_key_pre.text.font = LV_FONT_DEFAULT; + style_num_key_rel.text.font = LV_FONT_DEFAULT; + #endif + + 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_sel_text, &lv_style_scr); + style_sel_text.body.main_color = LV_COLOR_BACKGROUND; + style_sel_text.body.grad_color = LV_COLOR_BACKGROUND; + style_sel_text.text.color = LV_COLOR_YELLOW; + style_sel_text.text.sel_color = LV_COLOR_YELLOW; + style_sel_text.text.font = &gb2312_puhui32; + style_sel_text.line.width = 0; + style_sel_text.text.letter_space = 0; + style_sel_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; + + lv_style_copy(&style_para_value, &lv_style_plain); + style_para_value.body.border.color = LV_COLOR_BACKGROUND; + style_para_value.body.border.width = 1; + style_para_value.body.main_color = LV_COLOR_WHITE; + style_para_value.body.grad_color = LV_COLOR_WHITE; + style_para_value.body.shadow.width = 0; + style_para_value.body.radius = 3; + style_para_value.text.color = LV_COLOR_BLACK; + style_para_value.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + + lv_style_copy(&style_para_back, &lv_style_plain); + style_para_back.body.border.color = LV_COLOR_BACKGROUND; + style_para_back.body.border.width = 1; + style_para_back.body.main_color = TFT_LV_PARA_BACK_BODY_COLOR; + style_para_back.body.grad_color = TFT_LV_PARA_BACK_BODY_COLOR; + style_para_back.body.shadow.width = 0; + style_para_back.body.radius = 3; + style_para_back.text.color = LV_COLOR_WHITE; + style_para_back.text.font = &TERN(HAS_SPI_FLASH_FONT, gb2312_puhui32, lv_font_roboto_22); + + 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.body.border.color = lv_color_hex3(0xADF); + +} + +#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) { + if (str == 0 || addPart == 0) return; + if ((int)(strlen(str) + strlen(addPart)) >= strSize) return; + strcat(str, addPart); +} + +char *getDispText(int index) { + + ZERO(public_buf_l); + + switch (disp_state_stack._disp_state[index]) { + case PRINT_READY_UI: + strcpy(public_buf_l, main_menu.title); + break; + case PRINT_FILE_UI: + strcpy(public_buf_l, file_menu.title); + 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); + else strcpy(public_buf_l, printing_menu.title); + break; + case MOVE_MOTOR_UI: + strcpy(public_buf_l, move_menu.title); + 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); + 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); + else strcpy(public_buf_l, pause_menu.title); + break; + + case EXTRUSION_UI: + strcpy(public_buf_l, extrude_menu.title); + break; + case CHANGE_SPEED_UI: + strcpy(public_buf_l, speed_menu.title); + break; + case FAN_UI: + 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); + else strcpy(public_buf_l, preheat_menu.title); + break; + case SET_UI: + strcpy(public_buf_l, set_menu.title); + break; + case ZERO_UI: + strcpy(public_buf_l, home_menu.title); + break; + case SPRAYER_UI: break; + case MACHINE_UI: break; + case LANGUAGE_UI: + strcpy(public_buf_l, language_menu.title); + break; + case ABOUT_UI: + strcpy(public_buf_l, about_menu.title); + break; + case LOG_UI: break; + case DISK_UI: + strcpy(public_buf_l, filesys_menu.title); + break; + case DIALOG_UI: + strcpy(public_buf_l, common_menu.dialog_confirm_title); + break; + case WIFI_UI: + strcpy(public_buf_l, wifi_menu.title); + break; + case MORE_UI: + case PRINT_MORE_UI: + strcpy(public_buf_l, more_menu.title); + break; + case FILAMENTCHANGE_UI: + strcpy(public_buf_l, filament_menu.title); + break; + case LEVELING_UI: + case MESHLEVELING_UI: + strcpy(public_buf_l, leveling_menu.title); + break; + case BIND_UI: + strcpy(public_buf_l, cloud_menu.title); + break; + case TOOL_UI: + strcpy(public_buf_l, tool_menu.title); + break; + case WIFI_LIST_UI: + #if ENABLED(USE_WIFI_FUNCTION) + strcpy(public_buf_l, list_menu.title); + break; + #endif + case MACHINE_PARA_UI: + strcpy(public_buf_l, MachinePara_menu.title); + break; + 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; + } + + return public_buf_l; +} + +char *creat_title_text() { + int index = 0; + char *tmpText = 0; + char tmpCurFileStr[20]; + + ZERO(tmpCurFileStr); + + #if _LFN_UNICODE + //cutFileName((TCHAR *)curFileName, 16, 16, (TCHAR *)tmpCurFileStr); + #else + cutFileName(list_file.long_name[sel_id], 16, 16, tmpCurFileStr); + #endif + + ZERO(public_buf_m); + + while (index <= disp_state_stack._disp_index) { + tmpText = getDispText(index); + if ((*tmpText == 0) || (tmpText == 0)) { + index++; + continue; + } + + titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); + if (index < disp_state_stack._disp_index) titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">"); + + index++; + } + + 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*/ + ) { + 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) { + ZERO(public_buf_m); + tmpText = getDispText(0); + if (*tmpText != 0) { + titleText_cat(public_buf_m, sizeof(public_buf_m), tmpText); + titleText_cat(public_buf_m, sizeof(public_buf_m), (char *)">...>"); + 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 + } + + #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; + } + } + + card.setIndex((gPicturePreviewStart + To_pre_view) + size * row + 8); + SPI_TFT.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); + + j = i = 0; + + 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; + } + for (i = 0; i < 400; i += 2) { + p_index = (uint16_t *)(&bmp_public_buf[i]); + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; + } + SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); + #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 HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + #endif + card.startFileprint(); + TERN_(POWER_LOSS_RECOVERY, recovery.prepare()); + once_flag = 0; + } + return; + } + card.closefile(); + #endif // SDSUPPORT + } + + #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.setWindow(xpos_pixel, ypos_pixel + row, 200, 1); + #else + LCD_setWindowArea(xpos_pixel, ypos_pixel + row, 200, 1); + LCD_WriteRAM_Prepare(); + #endif + + j = 0; + i = 0; + + 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 + + } + #if ENABLED(TFT_LVGL_UI_SPI) + 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 = 0xC318; + } + TFT_CS_L; + TFT_DC_H; + SPI.dmaSend(bmp_public_buf, 400, true); + 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; + } + #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 HAS_MULTI_EXTRUDER + planner.flow_percentage[1] = 100; + planner.e_factor[1] = planner.flow_percentage[1] * 0.01; + #endif + 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; + W25QXX.init(SPI_QUARTER_SPEED); + 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); // 8k + } + #else + default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k + #endif + + SPI_TFT.setWindow(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); + + 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 // HAS_GCODE_PREVIEW + +void print_time_run() { + static uint8_t lastSec = 0; + + if (print_time.seconds >= 60) { + print_time.seconds = 0; + print_time.minutes++; + if (print_time.minutes >= 60) { + print_time.minutes = 0; + print_time.hours++; + } + } + if (disp_state == PRINTING_UI) { + if (lastSec != print_time.seconds) disp_print_time(); + lastSec = print_time.seconds; + } +} + +void GUI_RefreshPage() { + if ((systick_uptime_millis % 1000) == 0) temperature_change_frequency = 1; + if ((systick_uptime_millis % 3000) == 0) printing_rate_update_flag = 1; + + switch (disp_state) { + case MAIN_UI: + //lv_draw_ready_print(); + break; + case EXTRUSION_UI: + if (temperature_change_frequency == 1) { + temperature_change_frequency = 0; + disp_hotend_temp(); + } + break; + case PRE_HEAT_UI: + if (temperature_change_frequency == 1) { + temperature_change_frequency = 0; + disp_desire_temp(); + } + break; + case PRINT_READY_UI: + /* + if (gCfgItems.display_style == 2) { + if (temperature_change_frequency) { + temperature_change_frequency = 0; + disp_restro_state(); + } + } + */ + break; + + case PRINT_FILE_UI: break; + + case PRINTING_UI: + if (temperature_change_frequency) { + temperature_change_frequency = 0; + disp_ext_temp(); + disp_bed_temp(); + disp_fan_speed(); + disp_print_time(); + disp_fan_Zpos(); + } + if (printing_rate_update_flag || marlin_state == MF_SD_COMPLETE) { + printing_rate_update_flag = 0; + if (gcode_preview_over == 0) setProBarRate(); + } + break; + + case OPERATE_UI: + /* + if (temperature_change_frequency == 1) { + temperature_change_frequency = 0; + disp_temp_operate(); + } + + setProBarRateOpera(); + */ + break; + + case PAUSE_UI: + /* + if (temperature_change_frequency == 1) { + temperature_change_frequency = 0; + disp_temp_pause(); + } + */ + break; + + case FAN_UI: + if (temperature_change_frequency == 1) { + temperature_change_frequency = 0; + disp_fan_value(); + } + break; + + case MOVE_MOTOR_UI: + /* + if (mksReprint.mks_printer_state == MKS_IDLE) { + if ((z_high_count==1)&&(temper_error_flg != 1)) { + z_high_count = 0; + { + memset((char *)gCfgItems.move_z_coordinate, ' ', sizeof(gCfgItems.move_z_coordinate)); + GUI_DispStringAt((const char *)gCfgItems.move_z_coordinate, 380, TITLE_YPOS); + 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); + } + } + } + */ + break; + + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_UI: + if (temperature_change_frequency == 1) { + disp_wifi_state(); + temperature_change_frequency = 0; + } + break; + #endif + + case BIND_UI: + /*refresh_bind_ui();*/ + break; + + case FILAMENTCHANGE_UI: + if (temperature_change_frequency) { + temperature_change_frequency = 0; + disp_filament_temp(); + } + break; + case DIALOG_UI: + filament_dialog_handle(); + TERN_(USE_WIFI_FUNCTION, wifi_scan_handle()); + break; + case MESHLEVELING_UI: + /*disp_zpos();*/ + break; + case HARDWARE_TEST_UI: + break; + case WIFI_LIST_UI: + #if ENABLED(USE_WIFI_FUNCTION) + if (printing_rate_update_flag == 1) { + disp_wifi_list(); + printing_rate_update_flag = 0; + } + #endif + break; + case KEY_BOARD_UI: + /*update_password_disp(); + update_join_state_disp();*/ + break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_TIPS_UI: + switch (wifi_tips_type) { + case TIPS_TYPE_JOINING: + if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName,(const char *)wifi_list.wifiName[wifi_list.nameIndex]) == 0) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + + lv_clear_wifi_tips(); + wifi_tips_type = TIPS_TYPE_WIFI_CONECTED; + lv_draw_wifi_tips(); + + } + if (tips_disp.timer_count >= 30 * 1000) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + lv_clear_wifi_tips(); + wifi_tips_type = TIPS_TYPE_TAILED_JOIN; + lv_draw_wifi_tips(); + } + break; + case TIPS_TYPE_TAILED_JOIN: + if (tips_disp.timer_count >= 3 * 1000) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + + last_disp_state = WIFI_TIPS_UI; + lv_clear_wifi_tips(); + lv_draw_wifi_list(); + } + break; + case TIPS_TYPE_WIFI_CONECTED: + if (tips_disp.timer_count >= 3 * 1000) { + tips_disp.timer = TIPS_TIMER_STOP; + tips_disp.timer_count = 0; + + last_disp_state = WIFI_TIPS_UI; + lv_clear_wifi_tips(); + lv_draw_wifi(); + } + break; + default: break; + } + break; + #endif + + case BABY_STEP_UI: + if (temperature_change_frequency == 1) { + temperature_change_frequency = 0; + disp_z_offset_value(); + } + break; + default: break; + } + + print_time_run(); +} + +void clear_cur_ui() { + last_disp_state = disp_state_stack._disp_state[disp_state_stack._disp_index]; + + switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { + case PRINT_READY_UI: + //Get_Temperature_Flg = 0; + lv_clear_ready_print(); + break; + case PRINT_FILE_UI: + lv_clear_print_file(); + break; + case PRINTING_UI: + lv_clear_printing(); + break; + case MOVE_MOTOR_UI: + lv_clear_move_motor(); + break; + case OPERATE_UI: + lv_clear_operation(); + break; + case PAUSE_UI: + //Clear_pause(); + break; + case EXTRUSION_UI: + lv_clear_extrusion(); + break; + case PRE_HEAT_UI: + lv_clear_preHeat(); + break; + case CHANGE_SPEED_UI: + lv_clear_change_speed(); + break; + case FAN_UI: + lv_clear_fan(); + break; + case SET_UI: + lv_clear_set(); + break; + case ZERO_UI: + lv_clear_home(); + break; + case SPRAYER_UI: + //Clear_Sprayer(); + break; + case MACHINE_UI: + //Clear_Machine(); + break; + case LANGUAGE_UI: + lv_clear_language(); + break; + case ABOUT_UI: + lv_clear_about(); + break; + case LOG_UI: + //Clear_Connect(); + break; + case DISK_UI: + //Clear_Disk(); + break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_UI: + lv_clear_wifi(); + break; + #endif + case MORE_UI: + //Clear_more(); + break; + case FILETRANSFER_UI: + //Clear_fileTransfer(); + break; + case DIALOG_UI: + lv_clear_dialog(); + break; + case FILETRANSFERSTATE_UI: + //Clear_WifiFileTransferdialog(); + break; + case PRINT_MORE_UI: + //Clear_Printmore(); + break; + case FILAMENTCHANGE_UI: + lv_clear_filament_change(); + break; + case LEVELING_UI: + lv_clear_manualLevel(); + break; + case BIND_UI: + //Clear_Bind(); + break; + #if HAS_BED_PROBE + case NOZZLE_PROBE_OFFSET_UI: + lv_clear_auto_level_offset_settings(); + break; + #endif + case TOOL_UI: + lv_clear_tool(); + break; + case MESHLEVELING_UI: + //Clear_MeshLeveling(); + break; + case HARDWARE_TEST_UI: + //Clear_Hardwaretest(); + break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_LIST_UI: + lv_clear_wifi_list(); + break; + #endif + case KEY_BOARD_UI: + lv_clear_keyboard(); + break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_TIPS_UI: + lv_clear_wifi_tips(); + break; + #endif + case MACHINE_PARA_UI: + lv_clear_machine_para(); + break; + case MACHINE_SETTINGS_UI: + lv_clear_machine_settings(); + break; + case TEMPERATURE_SETTINGS_UI: + //Clear_TemperatureSettings(); + break; + case MOTOR_SETTINGS_UI: + lv_clear_motor_settings(); + break; + case MACHINETYPE_UI: + //Clear_MachineType(); + break; + case STROKE_UI: + //Clear_Stroke(); + break; + case HOME_DIR_UI: + //Clear_HomeDir(); + break; + case ENDSTOP_TYPE_UI: + //Clear_EndstopType(); + break; + case FILAMENT_SETTINGS_UI: + lv_clear_filament_settings(); + break; + case LEVELING_SETTIGNS_UI: + //Clear_LevelingSettings(); + break; + case LEVELING_PARA_UI: + lv_clear_level_settings(); + break; + case DELTA_LEVELING_PARA_UI: + //Clear_DeltaLevelPara(); + break; + case MANUAL_LEVELING_POSIGION_UI: + lv_clear_manual_level_pos_settings(); + break; + case MAXFEEDRATE_UI: + lv_clear_max_feedrate_settings(); + break; + case STEPS_UI: + lv_clear_step_settings(); + break; + case ACCELERATION_UI: + lv_clear_acceleration_settings(); + break; + case JERK_UI: + #if HAS_CLASSIC_JERK + lv_clear_jerk_settings(); + #endif + break; + case MOTORDIR_UI: + //Clear_MotorDir(); + break; + case HOMESPEED_UI: + //Clear_HomeSpeed(); + break; + case NOZZLE_CONFIG_UI: + //Clear_NozzleConfig(); + break; + case HOTBED_CONFIG_UI: + //Clear_HotbedConfig(); + break; + case ADVANCED_UI: + lv_clear_advance_settings(); + break; + case DOUBLE_Z_UI: + //Clear_DoubleZ(); + break; + case ENABLE_INVERT_UI: + //Clear_EnableInvert(); + break; + case NUMBER_KEY_UI: + lv_clear_number_key(); + break; + case BABY_STEP_UI: + lv_clear_baby_stepping(); + 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 + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_SETTINGS_UI: + lv_clear_wifi_settings(); + break; + #endif + #if USE_SENSORLESS + case HOMING_SENSITIVITY_UI: + lv_clear_homing_sensitivity_settings(); + break; + #endif + #if HAS_ROTARY_ENCODER + case ENCODER_SETTINGS_UI: + lv_clear_encoder_settings(); + break; + #endif + default: break; + } + //GUI_Clear(); +} + +void draw_return_ui() { + if (disp_state_stack._disp_index > 0) { + disp_state_stack._disp_index--; + + switch (disp_state_stack._disp_state[disp_state_stack._disp_index]) { + case PRINT_READY_UI: + lv_draw_ready_print(); + break; + case PRINT_FILE_UI: + lv_draw_print_file(); + break; + case PRINTING_UI: + if (gCfgItems.from_flash_pic == 1) flash_preview_begin = 1; + else default_preview_flg = 1; + lv_draw_printing(); + break; + case MOVE_MOTOR_UI: + lv_draw_move_motor(); + break; + case OPERATE_UI: + lv_draw_operation(); + break; + + #if 1 + case PAUSE_UI: + //draw_pause(); + break; + #endif + + case EXTRUSION_UI: + lv_draw_extrusion(); + break; + case PRE_HEAT_UI: + lv_draw_preHeat(); + break; + case CHANGE_SPEED_UI: + lv_draw_change_speed(); + break; + case FAN_UI: + lv_draw_fan(); + break; + case SET_UI: + lv_draw_set(); + break; + case ZERO_UI: + lv_draw_home(); + break; + case SPRAYER_UI: + //draw_Sprayer(); + break; + case MACHINE_UI: + //draw_Machine(); + break; + case LANGUAGE_UI: + lv_draw_language(); + break; + case ABOUT_UI: + lv_draw_about(); + break; + + case CALIBRATE_UI: + //draw_calibrate(); + break; + case DISK_UI: + //draw_Disk(); + break; + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_UI: + lv_draw_wifi(); + break; + #endif + case MORE_UI: + //draw_More(); + break; + case PRINT_MORE_UI: + //draw_printmore(); + break; + case FILAMENTCHANGE_UI: + lv_draw_filament_change(); + break; + case LEVELING_UI: + lv_draw_manualLevel(); + break; + case BIND_UI: + //draw_bind(); + break; + #if HAS_BED_PROBE + case NOZZLE_PROBE_OFFSET_UI: + lv_draw_auto_level_offset_settings(); + break; + #endif + case TOOL_UI: + lv_draw_tool(); + break; + case MESHLEVELING_UI: + //draw_meshleveling(); + break; + case HARDWARE_TEST_UI: + //draw_Hardwaretest(); + break; + case WIFI_LIST_UI: + #if ENABLED(USE_WIFI_FUNCTION) + lv_draw_wifi_list(); + #endif + break; + case KEY_BOARD_UI: + lv_draw_keyboard(); + break; + case WIFI_TIPS_UI: + #if ENABLED(USE_WIFI_FUNCTION) + lv_draw_wifi_tips(); + #endif + break; + case MACHINE_PARA_UI: + lv_draw_machine_para(); + break; + case MACHINE_SETTINGS_UI: + lv_draw_machine_settings(); + break; + case TEMPERATURE_SETTINGS_UI: + //draw_TemperatureSettings(); + break; + case MOTOR_SETTINGS_UI: + lv_draw_motor_settings(); + break; + case MACHINETYPE_UI: + //draw_MachineType(); + break; + case STROKE_UI: + //draw_Stroke(); + break; + case HOME_DIR_UI: + //draw_HomeDir(); + break; + case ENDSTOP_TYPE_UI: + //draw_EndstopType(); + break; + case FILAMENT_SETTINGS_UI: + lv_draw_filament_settings(); + break; + case LEVELING_SETTIGNS_UI: + //draw_LevelingSettings(); + break; + case LEVELING_PARA_UI: + lv_draw_level_settings(); + break; + case DELTA_LEVELING_PARA_UI: + //draw_DeltaLevelPara(); + break; + case MANUAL_LEVELING_POSIGION_UI: + lv_draw_manual_level_pos_settings(); + break; + case MAXFEEDRATE_UI: + lv_draw_max_feedrate_settings(); + break; + case STEPS_UI: + lv_draw_step_settings(); + break; + case ACCELERATION_UI: + lv_draw_acceleration_settings(); + break; + case JERK_UI: + #if HAS_CLASSIC_JERK + lv_draw_jerk_settings(); + #endif + break; + case MOTORDIR_UI: + //draw_MotorDir(); + break; + case HOMESPEED_UI: + //draw_HomeSpeed(); + break; + case NOZZLE_CONFIG_UI: + //draw_NozzleConfig(); + break; + case HOTBED_CONFIG_UI: + //draw_HotbedConfig(); + break; + case ADVANCED_UI: + lv_draw_advance_settings(); + break; + case DOUBLE_Z_UI: + //draw_DoubleZ(); + break; + case ENABLE_INVERT_UI: + //draw_EnableInvert(); + break; + case NUMBER_KEY_UI: + lv_draw_number_key(); + break; + case DIALOG_UI: + //draw_dialog(uiCfg.dialogType); + break; + case BABY_STEP_UI: + lv_draw_baby_stepping(); + 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 + #if ENABLED(USE_WIFI_FUNCTION) + case WIFI_SETTINGS_UI: + lv_draw_wifi_settings(); + break; + #endif + #if USE_SENSORLESS + case HOMING_SENSITIVITY_UI: + lv_draw_homing_sensitivity_settings(); + break; + #endif + #if HAS_ROTARY_ENCODER + case ENCODER_SETTINGS_UI: + lv_draw_encoder_settings(); + break; + #endif + default: break; + } + } +} + +#if ENABLED(SDSUPPORT) + + void sd_detection() { + static bool last_sd_status; + const bool sd_status = IS_SD_INSERTED(); + if (sd_status != last_sd_status) { + last_sd_status = sd_status; + if (sd_status) card.mount(); else card.release(); + } + } + +#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() { + if ((systick_uptime_millis % 1000) == 0) + if (print_time.start == 1) print_time.seconds++; +} + +void LV_TASK_HANDLER() { + //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(); + + #if ENABLED(USE_WIFI_FUNCTION) + get_wifi_commands(); + #endif + + //sd_detection(); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_update_encoder(); + #endif +} + +#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 new file mode 100644 index 00000000..51782688 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -0,0 +1,454 @@ +/** + * 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 + +// 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 TFT_LV_PARA_BACK_BODY_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF) + +#include "tft_lvgl_configuration.h" +#include "tft_multi_language.h" +#include "pic_manager.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_operation.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_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 "draw_level_settings.h" +#include "draw_manual_level_pos_settings.h" +#include "draw_auto_level_offset_settings.h" +#include "draw_filament_change.h" +#include "draw_filament_settings.h" +#include "draw_homing_sensitivity_settings.h" +#include "draw_baby_stepping.h" +#include "draw_keyboard.h" +#include "draw_encoder_settings.h" + +#if ENABLED(USE_WIFI_FUNCTION) + #include "wifiSerial.h" + #include "wifi_module.h" + #include "wifi_upload.h" + #include "draw_wifi_settings.h" + #include "draw_wifi.h" + #include "draw_wifi_list.h" + #include "draw_wifi_tips.h" +#endif + +#include "../../inc/MarlinConfigPre.h" +#define FILE_SYS_USB 0 +#define FILE_SYS_SD 1 + +#define TICK_CYCLE 1 + +#define PARA_SEL_ICON_TEXT_COLOR LV_COLOR_MAKE(0x4A, 0x52, 0xFF); + +#define TFT35 + +#ifdef TFT35 + + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + + #define titleHeight 36 // TFT_screen.title_high + #define INTERVAL_H 2 // TFT_screen.gap_h // 2 + #define INTERVAL_V 2 // TFT_screen.gap_v // 2 + #define BTN_X_PIXEL 117 // TFT_screen.btn_x_pixel + #define BTN_Y_PIXEL 140 // TFT_screen.btn_y_pixel + + #define SIMPLE_FIRST_PAGE_GRAP 30 + + #define BUTTON_TEXT_Y_OFFSET -20 + + #define TITLE_XPOS 3 // TFT_screen.title_xpos + #define TITLE_YPOS 5 // TFT_screen.title_ypos + + #define FILE_BTN_CNT 6 + + #define OTHER_BTN_XPIEL 117 + #define OTHER_BTN_YPIEL 92 + + #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) + + // 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 + + #define PARA_UI_VALUE_SIZE_X_2 200 + #define PARA_UI_VALUE_POS_X_2 320 + #define PARA_UI_VALUE_V_2 5 + + #define PARA_UI_VALUE_BTN_X_SIZE 70 + #define PARA_UI_VALUE_BTN_Y_SIZE 28 + + #define PARA_UI_BACK_BTN_X_SIZE 70 + #define PARA_UI_BACK_BTN_Y_SIZE 40 + +#else // ifdef TFT35 + + #define TFT_WIDTH 320 + #define TFT_HEIGHT 240 + +#endif // ifdef TFT35 + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +extern char public_buf_m[100]; +extern char public_buf_l[30]; + +typedef struct { + uint32_t spi_flash_flag; + uint8_t disp_rotation_180; + uint8_t multiple_language; + uint8_t language; + uint8_t leveling_mode; + uint8_t from_flash_pic; + uint8_t finish_power_off; + uint8_t pause_reprint; + uint8_t wifi_mode_sel; + uint8_t fileSysType; + uint8_t wifi_type; + bool cloud_enable; + bool encoder_enable; + int levelingPos[5][2]; + int filamentchange_load_length; + int filamentchange_load_speed; + int filamentchange_unload_length; + int filamentchange_unload_speed; + int filament_limit_temper; + float pausePosX; + float pausePosY; + float pausePosZ; + uint32_t curFilesize; +} CFG_ITMES; + +typedef struct { + uint8_t curTempType : 1, + curSprayerChoose : 3, + stepHeat : 4; + uint8_t leveling_first_time : 1, + para_ui_page:1, + configWifi:1, + command_send:1, + filament_load_heat_flg:1, + filament_heat_completed_load:1, + filament_unload_heat_flg:1, + filament_heat_completed_unload:1; + uint8_t filament_loading_completed:1, + filament_unloading_completed:1, + filament_loading_time_flg:1, + filament_unloading_time_flg:1, + curSprayerChoose_bak:4; + uint8_t wifi_name[32]; + uint8_t wifi_key[64]; + uint8_t cloud_hostUrl[96]; + uint8_t extruStep; + uint8_t extruSpeed; + uint8_t print_state; + uint8_t stepPrintSpeed; + uint8_t waitEndMoves; + uint8_t dialogType; + uint8_t F[4]; + uint8_t filament_rate; + uint16_t moveSpeed; + uint16_t cloud_port; + uint16_t moveSpeed_bak; + uint32_t totalSend; + uint32_t filament_loading_time; + uint32_t filament_unloading_time; + uint32_t filament_loading_time_cnt; + uint32_t filament_unloading_time_cnt; + float move_dist; + float desireSprayerTempBak; + float current_x_position_bak; + float current_y_position_bak; + float current_e_position_bak; +} UI_CFG; + +typedef enum { + MAIN_UI, + PRINT_READY_UI, + PRINT_FILE_UI, + PRINTING_UI, + MOVE_MOTOR_UI, + OPERATE_UI, + PAUSE_UI, + EXTRUSION_UI, + FAN_UI, + PRE_HEAT_UI, + CHANGE_SPEED_UI, + TEMP_UI, + SET_UI, + ZERO_UI, + SPRAYER_UI, + MACHINE_UI, + LANGUAGE_UI, + ABOUT_UI, + LOG_UI, + DISK_UI, + CALIBRATE_UI, + DIALOG_UI, + WIFI_UI, + MORE_UI, + FILETRANSFER_UI, + FILETRANSFERSTATE_UI, + PRINT_MORE_UI, + FILAMENTCHANGE_UI, + LEVELING_UI, + MESHLEVELING_UI, + BIND_UI, + #if HAS_BED_PROBE + NOZZLE_PROBE_OFFSET_UI, + #endif + TOOL_UI, + HARDWARE_TEST_UI, + WIFI_LIST_UI, + KEY_BOARD_UI, + WIFI_TIPS_UI, + MACHINE_PARA_UI, + MACHINE_SETTINGS_UI, + TEMPERATURE_SETTINGS_UI, + MOTOR_SETTINGS_UI, + MACHINETYPE_UI, + STROKE_UI, + HOME_DIR_UI, + ENDSTOP_TYPE_UI, + FILAMENT_SETTINGS_UI, + LEVELING_SETTIGNS_UI, + LEVELING_PARA_UI, + DELTA_LEVELING_PARA_UI, + MANUAL_LEVELING_POSIGION_UI, + MAXFEEDRATE_UI, + STEPS_UI, + ACCELERATION_UI, + JERK_UI, + MOTORDIR_UI, + HOMESPEED_UI, + NOZZLE_CONFIG_UI, + HOTBED_CONFIG_UI, + ADVANCED_UI, + DOUBLE_Z_UI, + ENABLE_INVERT_UI, + NUMBER_KEY_UI, + BABY_STEP_UI, + ERROR_MESSAGE_UI, + PAUSE_POS_UI, + TMC_CURRENT_UI, + TMC_MODE_UI, + EEPROM_SETTINGS_UI, + WIFI_SETTINGS_UI, + HOMING_SENSITIVITY_UI, + ENCODER_SETTINGS_UI +} DISP_STATE; + +typedef struct { + DISP_STATE _disp_state[100]; + int _disp_index; +} DISP_STATE_STACK; + +typedef struct { + int16_t days; + uint16_t hours; + uint8_t minutes; + volatile int8_t seconds; + int8_t ms_10; + int8_t start; +} 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, + + level_pos_x1, + level_pos_y1, + level_pos_x2, + level_pos_y2, + level_pos_x3, + level_pos_y3, + level_pos_x4, + level_pos_y4, + level_pos_x5, + level_pos_y5 + #if HAS_BED_PROBE + , + x_offset, + y_offset, + z_offset + #endif + , + load_length, + load_speed, + unload_length, + unload_speed, + filament_temp, + + x_sensitivity, + y_sensitivity, + z_sensitivity, + z2_sensitivity +} num_key_value_state; +extern num_key_value_state value; + +typedef enum { + wifiName, + wifiPassWord, + wifiConfig, + gcodeCommand +} keyboard_value_state; +extern keyboard_value_state keyboard_value; + +extern CFG_ITMES gCfgItems; +extern UI_CFG uiCfg; +extern DISP_STATE disp_state; +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_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_style_t style_sel_text; +extern lv_style_t style_para_value; +extern lv_style_t style_para_back; +extern lv_style_t lv_bar_style_indic; + +extern lv_point_t line_points[4][2]; + +extern void gCfgItems_init(); +extern void ui_cfg_init(); +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 update_gcode_command(int addr,uint8_t *s); +extern void get_gcode_command(int addr,uint8_t *d); +#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(); +extern void sd_detection(); +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++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.cpp new file mode 100644 index 00000000..9cf4555b --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.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" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/temperature.h" + +extern lv_group_t * g; +static lv_obj_t *scr, *wifi_name_text, *wifi_key_text, *wifi_state_text, *wifi_ip_text; + +#define ID_W_RETURN 1 +#define ID_W_CLOUD 2 +#define ID_W_RECONNECT 3 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_W_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + lv_draw_set(); + } + break; + case ID_W_CLOUD: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + //clear_cur_ui(); + //draw_return_ui(); + } + break; + case ID_W_RECONNECT: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + lv_draw_wifi_list(); + } + break; + } +} + +void lv_draw_wifi(void) { + lv_obj_t *buttonBack=NULL,*label_Back=NULL; + lv_obj_t *buttonCloud=NULL,*label_Cloud=NULL; + lv_obj_t *buttonReconnect=NULL,*label_Reconnect=NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_UI; + } + disp_state = WIFI_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()); + + // Create an Image button + buttonBack = lv_imgbtn_create(scr, NULL); + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + //buttonCloud = lv_imgbtn_create(scr, NULL); + buttonReconnect = lv_imgbtn_create(scr, NULL); + } + + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_W_RETURN, NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_return.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_return.bin"); + 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); + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack); + #endif + + 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); + + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + + lv_obj_set_event_cb_mks(buttonReconnect, event_handler,ID_W_RECONNECT, NULL,0); + lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_REL, "F:/bmp_wifi.bin"); + lv_imgbtn_set_src(buttonReconnect, LV_BTN_STATE_PR, "F:/bmp_wifi.bin"); + lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonReconnect, LV_BTN_STATE_REL, &tft_style_label_rel); + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonReconnect); + #endif + + lv_obj_set_pos(buttonReconnect,BTN_X_PIXEL*2+INTERVAL_V*3, BTN_Y_PIXEL+INTERVAL_H+titleHeight); + lv_btn_set_layout(buttonReconnect, LV_LAYOUT_OFF); + } + + label_Back = lv_label_create(buttonBack, NULL); + + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + //label_Cloud = lv_label_create(buttonCloud, NULL); + label_Reconnect = lv_label_create(buttonReconnect, NULL); + } + + if (gCfgItems.multiple_language !=0) { + 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); + + if (gCfgItems.wifi_mode_sel == STA_MODEL) { + //lv_label_set_text(label_Cloud, common_menu.text_back); + //lv_obj_align(label_Cloud, buttonCloud, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + + lv_label_set_text(label_Reconnect, wifi_menu.reconnect); + lv_obj_align(label_Reconnect, buttonReconnect, LV_ALIGN_IN_BOTTOM_MID,0, BUTTON_TEXT_Y_OFFSET); + } + } + + wifi_ip_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_ip_text, &tft_style_label_rel); + + wifi_name_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_name_text, &tft_style_label_rel); + + wifi_key_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_key_text, &tft_style_label_rel); + + wifi_state_text = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_state_text, &tft_style_label_rel); + + disp_wifi_state(); +} + +void disp_wifi_state() { + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.ip); + strcat(public_buf_m,ipPara.ip_addr); + lv_label_set_text(wifi_ip_text, public_buf_m); + lv_obj_align(wifi_ip_text, NULL, LV_ALIGN_CENTER,0, -100); + + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.wifi); + strcat(public_buf_m,wifiPara.ap_name); + lv_label_set_text(wifi_name_text, public_buf_m); + lv_obj_align(wifi_name_text, NULL, LV_ALIGN_CENTER,0, -70); + + if (wifiPara.mode == AP_MODEL) { + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.key); + strcat(public_buf_m,wifiPara.keyCode); + lv_label_set_text(wifi_key_text, public_buf_m); + lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -40); + + memset(public_buf_m, 0, sizeof(public_buf_m)); + strcpy(public_buf_m,wifi_menu.state_ap); + if (wifi_link_state == WIFI_CONNECTED) + strcat(public_buf_m,wifi_menu.connected); + else if (wifi_link_state == WIFI_NOT_CONFIG) + strcat(public_buf_m,wifi_menu.disconnected); + else + strcat(public_buf_m,wifi_menu.exception); + lv_label_set_text(wifi_state_text, public_buf_m); + lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -10); + } + else { + ZERO(public_buf_m); + strcpy(public_buf_m, wifi_menu.state_sta); + if (wifi_link_state == WIFI_CONNECTED) + strcat(public_buf_m, wifi_menu.connected); + else if (wifi_link_state == WIFI_NOT_CONFIG) + strcat(public_buf_m, wifi_menu.disconnected); + else + strcat(public_buf_m, wifi_menu.exception); + lv_label_set_text(wifi_state_text, public_buf_m); + lv_obj_align(wifi_state_text, NULL, LV_ALIGN_CENTER,0, -40); + + lv_label_set_text(wifi_key_text, ""); + lv_obj_align(wifi_key_text, NULL, LV_ALIGN_CENTER,0, -10); + } +} + +void lv_clear_wifi() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h new file mode 100644 index 00000000..966a84d3 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h @@ -0,0 +1,38 @@ +/** + * 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_wifi(void); +extern void lv_clear_wifi(); +extern void disp_wifi_state(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif + + + diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp new file mode 100644 index 00000000..14fd63f8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.cpp @@ -0,0 +1,235 @@ +/** + * 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" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/temperature.h" + +#define NAME_BTN_X 330 +#define NAME_BTN_Y 48 + +#define MARK_BTN_X 0 +#define MARK_BTN_Y 68 + +WIFI_LIST wifi_list; +list_menu_def list_menu; + +extern lv_group_t * g; +static lv_obj_t * scr; +static lv_obj_t *buttonWifiN[NUMBER_OF_PAGE]; +static lv_obj_t *lableWifiText[NUMBER_OF_PAGE]; +static lv_obj_t *lablePageText; + +#define ID_WL_RETURN 11 +#define ID_WL_DOWN 12 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + if (obj->mks_obj_id == ID_WL_RETURN) { + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + clear_cur_ui(); + lv_draw_set(); + } + } + else if (obj->mks_obj_id == ID_WL_DOWN) { + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (wifi_list.getNameNum > 0) { + if ((wifi_list.nameIndex + NUMBER_OF_PAGE) >= wifi_list.getNameNum) { + wifi_list.nameIndex = 0; + wifi_list.currentWifipage = 1; + } + else { + wifi_list.nameIndex += NUMBER_OF_PAGE; + wifi_list.currentWifipage++; + } + disp_wifi_list(); + } + } + } + else { + for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { + if (obj->mks_obj_id == i + 1) { + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (wifi_list.getNameNum != 0) { + const bool do_wifi = wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[wifi_list.nameIndex + i]) == 0; + wifi_list.nameIndex += i; + last_disp_state = WIFI_LIST_UI; + lv_clear_wifi_list(); + if (do_wifi) + lv_draw_wifi(); + else { + keyboard_value = wifiConfig; + lv_draw_keyboard(); + } + } + } + } + } + } +} + +void lv_draw_wifi_list(void) { + lv_obj_t *buttonBack = NULL, *buttonDown = NULL; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_LIST_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_LIST_UI; + } + disp_state = WIFI_LIST_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()); + + buttonDown = lv_imgbtn_create(scr, NULL); + buttonBack = lv_imgbtn_create(scr, NULL); + + lv_obj_set_event_cb_mks(buttonDown, event_handler,ID_WL_DOWN,NULL,0); + lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_REL, "F:/bmp_pageDown.bin"); + lv_imgbtn_set_src(buttonDown, LV_BTN_STATE_PR, "F:/bmp_pageDown.bin"); + lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonDown, LV_BTN_STATE_REL, &tft_style_label_rel); + + lv_obj_set_event_cb_mks(buttonBack, event_handler,ID_WL_RETURN,NULL,0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back.bin"); + 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(buttonDown,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL+INTERVAL_H); + lv_obj_set_pos(buttonBack,OTHER_BTN_XPIEL*3+INTERVAL_V*4,titleHeight+OTHER_BTN_YPIEL*2+INTERVAL_H*2); + + lv_btn_set_layout(buttonDown, LV_LAYOUT_OFF); + lv_btn_set_layout(buttonBack, LV_LAYOUT_OFF); + + for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) { + buttonWifiN[i] = lv_btn_create(scr, NULL); /*Add a button the current screen*/ + lv_obj_set_pos(buttonWifiN[i], 0,NAME_BTN_Y*i+10+titleHeight); /*Set its position*/ + lv_obj_set_size(buttonWifiN[i], NAME_BTN_X,NAME_BTN_Y); /*Set its size*/ + lv_obj_set_event_cb_mks(buttonWifiN[i], event_handler,(i+1),NULL,0); + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); /*Set the button's released style*/ + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_PR, &tft_style_label_pre); /*Set the button's pressed style*/ + lv_btn_set_layout(buttonWifiN[i], LV_LAYOUT_OFF); + lableWifiText[i] = lv_label_create(buttonWifiN[i], NULL); + #if HAS_ROTARY_ENCODER + uint8_t j = 0; + if (gCfgItems.encoder_enable) { + j = wifi_list.nameIndex + i; + if (j < wifi_list.getNameNum) lv_group_add_obj(g, buttonWifiN[i]); + } + #endif + } + + lablePageText = lv_label_create(scr, NULL); + lv_obj_set_style(lablePageText, &tft_style_label_rel); + + wifi_list.nameIndex = 0; + wifi_list.currentWifipage = 1; + + if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode == STA_MODEL) { + memset(wifi_list.wifiConnectedName, 0, sizeof(&wifi_list.wifiConnectedName)); + memcpy(wifi_list.wifiConnectedName, wifiPara.ap_name, sizeof(wifi_list.wifiConnectedName)); + } + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonDown); + lv_group_add_obj(g, buttonBack); + } + #endif + + disp_wifi_list(); +} + +void disp_wifi_list(void) { + int8_t tmpStr[WIFI_NAME_BUFFER_SIZE] = { 0 }; + uint8_t i, j; + + sprintf((char *)tmpStr, list_menu.file_pages, wifi_list.currentWifipage, wifi_list.getPage); + lv_label_set_text(lablePageText, (const char *)tmpStr); + lv_obj_align(lablePageText, NULL, LV_ALIGN_CENTER, 50, -100); + + for (i = 0; i < NUMBER_OF_PAGE; i++) { + memset(tmpStr, 0, sizeof(tmpStr)); + + j = wifi_list.nameIndex + i; + if (j >= wifi_list.getNameNum) { + lv_label_set_text(lableWifiText[i], (const char *)tmpStr); + lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); + } + else { + lv_label_set_text(lableWifiText[i], (char const *)wifi_list.wifiName[j]); + lv_obj_align(lableWifiText[i], buttonWifiN[i], LV_ALIGN_IN_LEFT_MID, 20, 0); + + if (wifi_link_state == WIFI_CONNECTED && strcmp((const char *)wifi_list.wifiConnectedName, (const char *)wifi_list.wifiName[j]) == 0) { + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &style_sel_text); + } + else { + lv_btn_set_style(buttonWifiN[i], LV_BTN_STYLE_REL, &tft_style_label_rel); + } + } + } +} + +void wifi_scan_handle() { + if (uiCfg.dialogType != WIFI_ENABLE_TIPS || uiCfg.command_send != 1) return; + last_disp_state = DIALOG_UI; + lv_clear_dialog(); + if (wifi_link_state == WIFI_CONNECTED && wifiPara.mode != AP_MODEL) + lv_draw_wifi(); + else + lv_draw_wifi_list(); +} + +void lv_clear_wifi_list() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_WIFI_FUNCTION + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h new file mode 100644 index 00000000..e2d9275e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h @@ -0,0 +1,76 @@ +/** + * 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_wifi_list(); +extern void lv_clear_wifi_list(); +extern void disp_wifi_list(void); +extern void cutWifiName(char *name, int len,char *outStr); +extern void wifi_scan_handle(); + +#define NUMBER_OF_PAGE 5 + +#define WIFI_TOTAL_NUMBER 20 +#define WIFI_NAME_BUFFER_SIZE 33 + +typedef struct { + int8_t getNameNum; + int8_t nameIndex; + int8_t currentWifipage; + int8_t getPage; + int8_t RSSI[WIFI_TOTAL_NUMBER]; + uint8_t wifiName[WIFI_TOTAL_NUMBER][WIFI_NAME_BUFFER_SIZE]; + uint8_t wifiConnectedName[WIFI_NAME_BUFFER_SIZE]; +} WIFI_LIST; +extern WIFI_LIST wifi_list; + +typedef struct list_menu_disp { + const char *title; + const char *file_pages; +} list_menu_def; +extern list_menu_def list_menu; + +typedef struct keyboard_menu_disp { + const char *title; + const char *apply; + const char *password; + const char *letter; + const char *digital; + const char *symbol; + const char *space; +} keyboard_menu_def; +extern keyboard_menu_def keyboard_menu; + +typedef struct tips_menu_disp { + const char *joining; + const char *failedJoin; + const char *wifiConected; +} tips_menu_def; +extern tips_menu_def tips_menu; + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp new file mode 100644 index 00000000..86733470 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.cpp @@ -0,0 +1,299 @@ +/** + * 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" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/planner.h" + +extern lv_group_t * g; +static lv_obj_t *scr, *labelModelValue = NULL, *buttonModelValue = NULL, *labelCloudValue = NULL; + +#define ID_WIFI_RETURN 1 +#define ID_WIFI_MODEL 2 +#define ID_WIFI_NAME 3 +#define ID_WIFI_PASSWORD 4 +#define ID_WIFI_CLOUD 5 +#define ID_WIFI_CONFIG 6 + +static void event_handler(lv_obj_t * obj, lv_event_t event) { + switch (obj->mks_obj_id) { + case ID_WIFI_RETURN: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_wifi_settings(); + draw_return_ui(); + } + break; + case ID_WIFI_MODEL: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.wifi_mode_sel == AP_MODEL) { + gCfgItems.wifi_mode_sel = STA_MODEL; + lv_label_set_text(labelModelValue, WIFI_STA_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + update_spi_flash(); + } + else{ + gCfgItems.wifi_mode_sel = AP_MODEL; + lv_label_set_text(labelModelValue, WIFI_AP_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + update_spi_flash(); + } + } + break; + case ID_WIFI_NAME: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value=wifiName; + lv_clear_wifi_settings(); + lv_draw_keyboard(); + } + break; + case ID_WIFI_PASSWORD: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + keyboard_value=wifiPassWord; + lv_clear_wifi_settings(); + lv_draw_keyboard(); + } + break; + case ID_WIFI_CLOUD: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + if (gCfgItems.cloud_enable) { + gCfgItems.cloud_enable = false; + lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_disable.bin",0); + lv_label_set_text(labelCloudValue, machine_menu.disable); + update_spi_flash(); + } + else { + gCfgItems.cloud_enable = true; + lv_obj_set_event_cb_mks(obj, event_handler,ID_WIFI_CLOUD,"bmp_enable.bin",0); + lv_label_set_text(labelCloudValue, machine_menu.enable); + update_spi_flash(); + } + } + break; + case ID_WIFI_CONFIG: + if (event == LV_EVENT_CLICKED) { + + } + else if (event == LV_EVENT_RELEASED) { + lv_clear_wifi_settings(); + lv_draw_dialog(DIALOG_WIFI_CONFIG_TIPS); + } + break; + } +} + +void lv_draw_wifi_settings(void) { + lv_obj_t *buttonBack = NULL, *label_Back = NULL, *buttonConfig = NULL, *labelConfig = NULL; + lv_obj_t *labelModelText = NULL; + lv_obj_t *labelNameText = NULL, *buttonNameValue = NULL, *labelNameValue = NULL; + lv_obj_t *labelPassWordText = NULL, *buttonPassWordValue = NULL, *labelPassWordValue = NULL; + lv_obj_t *labelCloudText = NULL, *buttonCloudValue = NULL; + lv_obj_t * line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_SETTINGS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_SETTINGS_UI; + } + disp_state = WIFI_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.WifiConfTitle); + + lv_refr_now(lv_refr_get_disp_refreshing()); + + labelModelText = lv_label_create(scr, NULL); + lv_obj_set_style(labelModelText, &tft_style_label_rel); + lv_obj_set_pos(labelModelText, PARA_UI_POS_X, PARA_UI_POS_Y + 10); + lv_label_set_text(labelModelText, machine_menu.wifiMode); + + buttonModelValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonModelValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y+PARA_UI_VALUE_V); + lv_obj_set_event_cb_mks(buttonModelValue, event_handler,ID_WIFI_MODEL, NULL,0); + lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_REL, "F:/bmp_blank_sel.bin"); + lv_imgbtn_set_src(buttonModelValue, LV_BTN_STATE_PR, "F:/bmp_blank_sel.bin"); + lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_PR, &style_para_value_pre); + lv_imgbtn_set_style(buttonModelValue, LV_BTN_STATE_REL, &style_para_value_pre); + lv_btn_set_layout(buttonModelValue, LV_LAYOUT_OFF); + labelModelValue = lv_label_create(buttonModelValue, NULL); + + line1 = lv_line_create(scr, NULL); + lv_ex_line(line1,line_points[0]); + + labelNameText = lv_label_create(scr, NULL); + lv_obj_set_style(labelNameText, &tft_style_label_rel); + lv_obj_set_pos(labelNameText, PARA_UI_POS_X, PARA_UI_POS_Y * 2 + 10); + + buttonNameValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonNameValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*2+PARA_UI_VALUE_V); + lv_obj_set_size(buttonNameValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonNameValue, event_handler,ID_WIFI_NAME, NULL,0); + lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonNameValue, LV_BTN_STYLE_PR, &style_para_value); + labelNameValue = lv_label_create(buttonNameValue, NULL); + + line2 = lv_line_create(scr, NULL); + lv_ex_line(line2,line_points[1]); + + labelPassWordText = lv_label_create(scr, NULL); + lv_obj_set_style(labelPassWordText, &tft_style_label_rel); + lv_obj_set_pos(labelPassWordText, PARA_UI_POS_X, PARA_UI_POS_Y * 3 + 10); + + buttonPassWordValue = lv_btn_create(scr, NULL); + lv_obj_set_pos(buttonPassWordValue,PARA_UI_VALUE_POS_X,PARA_UI_POS_Y*3+PARA_UI_VALUE_V); + lv_obj_set_size(buttonPassWordValue, PARA_UI_VALUE_BTN_X_SIZE, PARA_UI_VALUE_BTN_Y_SIZE); + lv_obj_set_event_cb_mks(buttonPassWordValue, event_handler,ID_WIFI_PASSWORD, NULL,0); + lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_REL, &style_para_value); + lv_btn_set_style(buttonPassWordValue, LV_BTN_STYLE_PR, &style_para_value); + labelPassWordValue = lv_label_create(buttonPassWordValue, NULL); + + line3 = lv_line_create(scr, NULL); + lv_ex_line(line3,line_points[2]); + + labelCloudText = lv_label_create(scr, NULL); + lv_obj_set_style(labelCloudText, &tft_style_label_rel); + lv_obj_set_pos(labelCloudText, PARA_UI_POS_X, PARA_UI_POS_Y * 4 + 10); + lv_label_set_text(labelCloudText, machine_menu.wifiCloud); + + buttonCloudValue = lv_imgbtn_create(scr, NULL); + lv_obj_set_pos(buttonCloudValue,PARA_UI_STATE_POS_X,PARA_UI_POS_Y*4+PARA_UI_STATE_V); + if (gCfgItems.cloud_enable) { + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_enable.bin"); + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_enable.bin"); + } + else { + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_REL, "F:/bmp_disable.bin"); + lv_imgbtn_set_src(buttonCloudValue, LV_BTN_STATE_PR, "F:/bmp_disable.bin"); + } + lv_obj_set_event_cb_mks(buttonCloudValue, event_handler,ID_WIFI_CLOUD, NULL,0); + lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonCloudValue, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_btn_set_layout(buttonCloudValue, LV_LAYOUT_OFF); + labelCloudValue = lv_label_create(buttonCloudValue, NULL); + + line4 = lv_line_create(scr, NULL); + lv_ex_line(line4,line_points[3]); + + buttonConfig = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonConfig, event_handler,ID_WIFI_CONFIG, NULL,0); + lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonConfig, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_PR, &tft_style_label_pre); + lv_imgbtn_set_style(buttonConfig, LV_BTN_STATE_REL, &tft_style_label_rel); + lv_obj_set_pos(buttonConfig, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y); + lv_btn_set_layout(buttonConfig, LV_LAYOUT_OFF); + labelConfig = lv_label_create(buttonConfig, NULL); + + buttonBack = lv_imgbtn_create(scr, NULL); + lv_obj_set_event_cb_mks(buttonBack, event_handler, ID_WIFI_RETURN, NULL, 0); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_REL, "F:/bmp_back70x40.bin"); + lv_imgbtn_set_src(buttonBack, LV_BTN_STATE_PR, "F:/bmp_back70x40.bin"); + 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 (gCfgItems.wifi_mode_sel == AP_MODEL) { + lv_label_set_text(labelModelValue, WIFI_AP_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + } + else { + lv_label_set_text(labelModelValue, WIFI_STA_TEXT); + lv_obj_align(labelModelValue, buttonModelValue, LV_ALIGN_CENTER,0, 0); + } + memset(public_buf_m,0,sizeof(public_buf_m)); + strcat(public_buf_m,machine_menu.wifiName); + strcat(public_buf_m,(const char *)uiCfg.wifi_name); + lv_label_set_text(labelNameText,public_buf_m); + + lv_label_set_text(labelNameValue,machine_menu.wifiEdit); + lv_obj_align(labelNameValue, buttonNameValue, LV_ALIGN_CENTER,0, 0); + + memset(public_buf_m,0,sizeof(public_buf_m)); + strcat(public_buf_m,machine_menu.wifiPassWord); + strcat(public_buf_m,(const char *)uiCfg.wifi_key); + lv_label_set_text(labelPassWordText,public_buf_m); + + lv_label_set_text(labelPassWordValue,machine_menu.wifiEdit); + lv_obj_align(labelPassWordValue, buttonPassWordValue, LV_ALIGN_CENTER,0, 0); + + lv_label_set_text(labelCloudValue, gCfgItems.cloud_enable ? machine_menu.enable : machine_menu.disable); + lv_obj_align(labelCloudValue, buttonCloudValue, LV_ALIGN_CENTER,0, 0); + + lv_label_set_text(labelConfig,machine_menu.wifiConfig); + lv_obj_align(labelConfig, buttonConfig, 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); + } + + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) { + lv_group_add_obj(g, buttonModelValue); + lv_group_add_obj(g, buttonNameValue); + lv_group_add_obj(g, buttonPassWordValue); + lv_group_add_obj(g, buttonCloudValue); + lv_group_add_obj(g, buttonConfig); + lv_group_add_obj(g, buttonBack); + } + #endif +} + +void lv_clear_wifi_settings() { + #if HAS_ROTARY_ENCODER + if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); + #endif + lv_obj_del(scr); +} + +#endif // USE_WIFI_FUNCTION + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h new file mode 100644 index 00000000..c0d6e0cc --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h @@ -0,0 +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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#define WIFI_AP_TEXT "AP" +#define WIFI_STA_TEXT "STA" + +extern void lv_draw_wifi_settings(void); +extern void lv_clear_wifi_settings(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp new file mode 100644 index 00000000..50fa0aaf --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.cpp @@ -0,0 +1,85 @@ +/** + * 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" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../../Configuration.h" +#include "../../../../module/temperature.h" + +static lv_obj_t * scr; + +TIPS_TYPE wifi_tips_type; +TIPS_DISP tips_disp; +tips_menu_def tips_menu; + +void lv_draw_wifi_tips(void) { + static lv_obj_t * text_tips,*wifi_name; + + if (disp_state_stack._disp_state[disp_state_stack._disp_index] != WIFI_TIPS_UI) { + disp_state_stack._disp_index++; + disp_state_stack._disp_state[disp_state_stack._disp_index] = WIFI_TIPS_UI; + } + disp_state = WIFI_TIPS_UI; + + scr = lv_obj_create(NULL, NULL); + + lv_obj_set_style(scr, &tft_style_scr); + lv_scr_load(scr); + lv_obj_clean(scr); + lv_refr_now(lv_refr_get_disp_refreshing()); + + text_tips = lv_label_create(scr, NULL); + lv_obj_set_style(text_tips, &tft_style_label_rel); + + wifi_name = lv_label_create(scr, NULL); + lv_obj_set_style(wifi_name, &tft_style_label_rel); + + if (wifi_tips_type == TIPS_TYPE_JOINING) { + lv_label_set_text(text_tips, tips_menu.joining); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + } + else if (wifi_tips_type == TIPS_TYPE_TAILED_JOIN) { + lv_label_set_text(text_tips, tips_menu.failedJoin); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + } + else if (wifi_tips_type == TIPS_TYPE_WIFI_CONECTED) { + lv_label_set_text(text_tips, tips_menu.wifiConected); + lv_obj_align(text_tips, NULL, LV_ALIGN_CENTER,0, -60); + } + + lv_label_set_text(wifi_name, (const char *)wifi_list.wifiName[wifi_list.nameIndex]); + lv_obj_align(wifi_name, NULL, LV_ALIGN_CENTER,0, -20); + + tips_disp.timer = TIPS_TIMER_START; + tips_disp.timer_count = 0; +} + +void lv_clear_wifi_tips() { lv_obj_del(scr); } + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h new file mode 100644 index 00000000..4f81f00a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h @@ -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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + + +extern void lv_draw_wifi_tips(void); +extern void lv_clear_wifi_tips(); + +typedef enum { + TIPS_TYPE_JOINING, + TIPS_TYPE_TAILED_JOIN, + TIPS_TYPE_WIFI_CONECTED +} TIPS_TYPE; +extern TIPS_TYPE wifi_tips_type; + +typedef struct { + unsigned char timer; + unsigned int timer_count; +} TIPS_DISP; +extern TIPS_DISP tips_disp; + +#define TIPS_TIMER_START 1 +#define TIPS_TIMER_STOP 0 + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif + diff --git a/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp new file mode 100644 index 00000000..856d645e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/gb2312_puhui16.cpp @@ -0,0 +1,115 @@ +/** + * 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 "pic_manager.h" +#include + +#include "../../../../inc/MarlinConfig.h" + +#if HAS_SPI_FLASH_FONT + +typedef struct { + uint16_t min; + uint16_t max; + uint8_t bpp; + uint8_t reserved[3]; +} x_header_t; + +typedef struct { + uint32_t pos; +} x_table_t; + +typedef struct { + uint8_t adv_w; + uint8_t box_w; +} glyph_dsc_t; + +static x_header_t __g_xbf_hd = { .min = 0, .max = 0, .bpp = 0 }; +static uint8_t __g_font_buf[63]; + +static uint8_t *__user_font_getdata(int offset, int size) { + //ZERO(__g_font_buf); + get_spi_flash_data((char *)__g_font_buf, offset, size); + return __g_font_buf; + //return &buf_test[offset]; +} + +static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) { + if (__g_xbf_hd.max == 0) { + uint8_t *p = __user_font_getdata(0, sizeof(x_header_t)); + memcpy(&__g_xbf_hd, p, sizeof(x_header_t)); + } + if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min) + return NULL; + uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4; + uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); + if (p_pos[0] != 0) { + uint32_t pos = p_pos[0]; + //glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, 2); + __user_font_getdata(pos, 2); + //return __user_font_getdata(pos+2, gdsc->box_w*__g_xbf_hd.bpp/8); + return __user_font_getdata(pos + 2, sizeof(__g_font_buf)); + } + return NULL; +} + +static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { + if (__g_xbf_hd.max == 0) { + uint8_t *p = __user_font_getdata(0, sizeof(x_header_t)); + memcpy(&__g_xbf_hd, p, sizeof(x_header_t)); + } + if (unicode_letter > __g_xbf_hd.max || unicode_letter < __g_xbf_hd.min) + return NULL; + uint32_t unicode_offset = sizeof(x_header_t) + (unicode_letter - __g_xbf_hd.min) * 4; + uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4); + if (p_pos[0] != 0) { + glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], 2); + dsc_out->adv_w = gdsc->adv_w; + dsc_out->box_h = font->line_height; + dsc_out->box_w = gdsc->box_w; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + dsc_out->bpp = __g_xbf_hd.bpp; + return true; + } + return false; +} + +/*lv_font_t gb2312_puhui32 = { +.get_glyph_bitmap = __user_font_get_bitmap, +.get_glyph_dsc = __user_font_get_glyph_dsc, +.line_height = 25, +.base_line = 0, +};*/ +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 = 21; + gb2312_puhui32.base_line = 0; +} + +#endif // HAS_SPI_FLASH_FONT +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.cpp new file mode 100644 index 00000000..cf645712 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/irq_overrid.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 "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "draw_ui.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "wifiSerial.h" + +#include +#include +#include +#include +#include + +#include "../../../../inc/MarlinConfig.h" + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); +#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); + +void __irq_usart1(void) { + WIFISERIAL.wifi_usart_irq(USART1_BASE); + if (wifi_link_state == WIFI_TRANS_FILE) { + if (WIFISERIAL.available() == (400)) WIFI_IO1_SET(); + if (WIFISERIAL.wifi_rb_is_full()) { + if (esp_state == TRANSFER_IDLE) esp_state = TRANSFERING; + if (storeRcvData(UART_RX_BUFFER_SIZE)) { + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); + } + else { + WIFI_IO1_SET(); + esp_state = TRANSFER_STORE; + } + } + } +} + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif + +#endif // USE_WIFI_FUNCTION +#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 new file mode 100644 index 00000000..bc329aa8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.cpp @@ -0,0 +1,665 @@ +/** + * 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 "SPI_TFT.h" + +#include "tft_lvgl_configuration.h" +#include "draw_ready_print.h" +#include "mks_hardware_test.h" +#include "draw_ui.h" +#include "pic_manager.h" +#include + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../sd/cardreader.h" + +uint8_t pw_det_sta, pw_off_sta, mt_det_sta, mt_det3_sta; +#if PIN_EXISTS(MT_DET_2) + uint8_t mt_det2_sta; +#endif +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_IO0_PIN, HIGH); + itest = 10000; + while (itest--); + pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == 0); + pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == 0); + mt_det_sta = (READ(MT_DET_1_PIN) == 0); + #if PIN_EXISTS(MT_DET_2) + mt_det2_sta = (READ(MT_DET_2_PIN) == 0); + #endif + //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() { + #if ENABLED(MKS_TEST) + volatile uint32_t itest; + WRITE(WIFI_IO0_PIN, LOW); + itest = 10000; + while (itest--); + pw_det_sta = (READ(MKS_TEST_POWER_LOSS_PIN) == 1); + pw_off_sta = (READ(MKS_TEST_PS_ON_PIN) == 1); + mt_det_sta = (READ(MT_DET_1_PIN) == 1); + #if PIN_EXISTS(MT_DET_2) + mt_det2_sta = (READ(MT_DET_2_PIN) == 1); + #endif + //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_test_gpio() { + #ifdef MKS_TEST + SET_INPUT_PULLUP(X_MIN_PIN); + //SET_INPUT_PULLUP(X_MAX_PIN); + SET_INPUT_PULLUP(Y_MIN_PIN); + //SET_INPUT_PULLUP(Y_MAX_PIN); + SET_INPUT_PULLUP(Z_MIN_PIN); + SET_INPUT_PULLUP(Z_MAX_PIN); + + SET_OUTPUT(WIFI_IO0_PIN); + + SET_INPUT_PULLUP(MT_DET_1_PIN); + #if PIN_EXISTS(MT_DET_2) + SET_INPUT_PULLUP(MT_DET_2_PIN); + #endif + //SET_INPUT_PULLUP(MT_DET_3_PIN); + + SET_INPUT_PULLUP(MKS_TEST_POWER_LOSS_PIN); + SET_INPUT_PULLUP(MKS_TEST_PS_ON_PIN); + + SET_INPUT_PULLUP(SERVO0_PIN); + + SET_OUTPUT(X_ENABLE_PIN); + SET_OUTPUT(Y_ENABLE_PIN); + SET_OUTPUT(Z_ENABLE_PIN); + SET_OUTPUT(E0_ENABLE_PIN); + #if !MB(MKS_ROBIN_E3P) + SET_OUTPUT(E1_ENABLE_PIN); + #endif + + WRITE(X_ENABLE_PIN, LOW); + WRITE(Y_ENABLE_PIN, LOW); + WRITE(Z_ENABLE_PIN, LOW); + WRITE(E0_ENABLE_PIN, LOW); + #if !MB(MKS_ROBIN_E3P) + WRITE(E1_ENABLE_PIN, LOW); + #endif + //WRITE(E2_ENABLE_PIN, LOW); + + #if MB(MKS_ROBIN_E3P) + SET_INPUT_PULLUP(PA1); + SET_INPUT_PULLUP(PA3); + SET_INPUT_PULLUP(PC2); + SET_INPUT_PULLUP(PD8); + SET_INPUT_PULLUP(PE5); + SET_INPUT_PULLUP(PE6); + SET_INPUT_PULLUP(PE7); + #endif + #endif +} + +void mks_test_beeper() { + #ifdef MKS_TEST + WRITE(BEEPER_PIN, HIGH); + delay(100); + WRITE(BEEPER_PIN, LOW); + delay(100); + #endif +} + +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) + && (pw_off_sta == 1) + && (mt_det_sta == 1) + #if PIN_EXISTS(MT_DET_2) + && (mt_det2_sta == 1) + #endif + #if MB(MKS_ROBIN_E3P) + && (READ(PA1) == 0) + && (READ(PA3) == 0) + && (READ(PC2) == 0) + && (READ(PD8) == 0) + && (READ(PE5) == 0) + && (READ(PE6) == 0) + && (READ(PE7) == 0) + #endif + ) // &&(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_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); + #if !MB(MKS_ROBIN_E3P) + WRITE(E1_DIR_PIN, LOW); + #endif + //WRITE(E2_DIR_PIN, LOW); + thermalManager.fan_speed[0] = 255; + //WRITE(HEATER_2_PIN, HIGH); // HE2 + #if !MB(MKS_ROBIN_E3P) + WRITE(HEATER_1_PIN, HIGH); // HE1 + #endif + WRITE(HEATER_0_PIN, HIGH); // HE0 + WRITE(HEATER_BED_PIN, HIGH); // HOT-BED + } + else { + WRITE(X_DIR_PIN, HIGH); + WRITE(Y_DIR_PIN, HIGH); + WRITE(Z_DIR_PIN, HIGH); + WRITE(E0_DIR_PIN, HIGH); + #if !MB(MKS_ROBIN_E3P) + WRITE(E1_DIR_PIN, HIGH); + #endif + //WRITE(E2_DIR_PIN, HIGH); + thermalManager.fan_speed[0] = 0; + //WRITE(HEATER_2_PIN, LOW); // HE2 + #if !MB(MKS_ROBIN_E3P) + WRITE(HEATER_1_PIN, LOW); // HE1 + #endif + 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) + ) { + // nothing here + } + else { + //mks_test_beeper(); + } + + if (disp_state == PRINT_READY_UI) + mks_disp_test(); + + #endif +} + +static const uint16_t ASCII_Table_16x24[] PROGMEM = { + // Space ' ' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '!' + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '"' + 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '#' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, + 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, + 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, + // '$' + 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, + 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, + 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, + // '%' + 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, + 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, + 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, + // '&' + 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, + 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, + 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // "'" + 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '(' + 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, + // ')' + 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, + // '*' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '+' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // ',' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, + // '-' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '.' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '/' + 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, + 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, + 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '0' + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, + 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '1' + 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '2' + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '3' + 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, + 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '4' + 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, + 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, + 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '5' + 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, + 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '6' + 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, + 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '7' + 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, + 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '8' + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, + 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, + 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '9' + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, + 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, + 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // ':' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // ';' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, + // '<' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, + 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '=' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '>' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, + 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '?' + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, + 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '@' + 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, + 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, + 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'A' + 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, + 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, + 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'B' + 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, + 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, + 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'C' + 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, + 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'D' + 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, + 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, + 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'E' + 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'F' + 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'G' + 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, + 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, + 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'H' + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'I' + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'J' + 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, + 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'K' + 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, + 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'L' + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'M' + 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, + 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, + 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'N' + 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, + 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, + 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'O' + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'P' + 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'Q' + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, + 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'R' + 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, + 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'S' + 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, + 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, + 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'T' + 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'U' + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'V' + 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, + 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'W' + 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, + 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, + 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'X' + 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, + 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, + 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'Y' + 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, + 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'Z' + 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, + 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, + 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '[' + 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, + // '\' + 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, + 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // ']' + 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, + // '^' + 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, + 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '_' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // ''' + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'a' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, + 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, + 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'b' + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'c' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, + 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, + 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'd' + 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'e' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, + 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'f' + 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'g' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, + 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, + 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, + // 'h' + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'i' + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'j' + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, + // 'k' + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, + 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, + 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'l' + 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'm' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, + 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, + 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'n' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'o' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, + 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'p' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, + // 'q' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, + // 'r' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, + 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 's' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, + 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 't' + 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'u' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, + 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, + 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'v' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, + 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'w' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, + 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, + 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'x' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, + 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, + 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // 'y' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, + 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, + 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, + // 'z' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // '{' + 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, + // '|' + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, + // '}' + 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, + // '~' + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +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++) + SPI_TFT.SetPoint(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); + } +} + +void disp_string(uint16_t x, uint16_t y, const char * string, uint16_t charColor, uint16_t bkColor) { + while (*string != '\0') { + disp_char_1624(x, y, *string, charColor, bkColor); + string++; + x += 16; + } +} + +//static lv_obj_t * scr_test; +void disp_assets_update() { + SPI_TFT.LCD_clear(0x0000); + disp_string(100, 140, "Assets 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, 165, buf, 0xFFFF, 0x0000); +} + +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 new file mode 100644 index 00000000..0e2d8096 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/mks_hardware_test.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 + +#include + +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_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 new file mode 100644 index 00000000..07ac5638 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.cpp @@ -0,0 +1,626 @@ +/** + * 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 "string.h" +#include "draw_ui.h" +#include "pic_manager.h" +#include "draw_ready_print.h" +#include "mks_hardware_test.h" + +#include "SPIFlashStorage.h" +#include "../../../../libs/W25Qxx.h" + +#include "../../../../sd/cardreader.h" +#include "../../../../MarlinCore.h" + +extern uint16_t DeviceCode; +extern unsigned char bmp_public_buf[17 * 1024]; + +#if ENABLED(SDSUPPORT) + extern char *createFilename(char * const buffer, const dir_t &p); +#endif + +static const char assets[][LONG_FILENAME_LENGTH] = { + //homing screen + "bmp_zeroAll.bin", + "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", + "bmp_filamentchange.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 HAS_MULTI_EXTRUDER + "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_temp.bin", + "bmp_extrude_opr.bin", + "bmp_move_opr.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", + "bmp_speed_extruct.bin", + + //printing screen + "bmp_pause.bin", + "bmp_resume.bin", + "bmp_stop.bin", + "bmp_ext1_state.bin", + #if HAS_MULTI_EXTRUDER + "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 + + #if HAS_LOGO_IN_FLASH + "bmp_logo.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", + + // 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_blank_sel.bin", + "bmp_disable.bin", + "bmp_enable.bin", + "bmp_return.bin", + + #if ENABLED(USE_WIFI_FUNCTION) + //wifi screen + "bmp_wifi.bin", + #endif + + //babystep screen + "bmp_baby_move0_01.bin", + "bmp_baby_move0_05.bin", + "bmp_baby_move0_1.bin" +}; + +#if HAS_SPI_FLASH_FONT + static char fonts[][LONG_FILENAME_LENGTH] = { "FontUNIGBK.bin" }; +#endif + +uint8_t currentFlashPage = 0; + +uint32_t lv_get_pic_addr(uint8_t *Pname) { + uint8_t Pic_cnt; + uint8_t i, j; + PIC_MSG PIC; + 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 + + W25QXX.init(SPI_QUARTER_SPEED); + + W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); + if (Pic_cnt == 0xFF) Pic_cnt = 0; + for (i = 0; i < Pic_cnt; i++) { + j = 0; + do { + W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1); + tmp_cnt++; + } 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 + addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32; + return addr; + } + } + + return addr; +} + +const char *assetsPath = "assets"; +const char *bakPath = "_assets"; + +void spiFlashErase_PIC() { + volatile uint32_t pic_sectorcnt = 0; + W25QXX.init(SPI_QUARTER_SPEED); + //erase 0x001000 -64K + for (pic_sectorcnt = 0; pic_sectorcnt < (64 - 4) / 4; pic_sectorcnt++) { + watchdog_refresh(); + W25QXX.SPI_FLASH_SectorErase(PICINFOADDR + pic_sectorcnt * 4 * 1024); + } + //erase 64K -- 6M + for (pic_sectorcnt = 0; pic_sectorcnt < (PIC_SIZE_xM * 1024 / 64 - 1); pic_sectorcnt++) { + watchdog_refresh(); + W25QXX.SPI_FLASH_BlockErase((pic_sectorcnt + 1) * 64 * 1024); + } +} + +#if HAS_SPI_FLASH_FONT + void spiFlashErase_FONT() { + volatile uint32_t Font_sectorcnt = 0; + W25QXX.init(SPI_QUARTER_SPEED); + for (Font_sectorcnt = 0; Font_sectorcnt < 32-1; Font_sectorcnt++) { + watchdog_refresh(); + W25QXX.SPI_FLASH_BlockErase(FONTINFOADDR + Font_sectorcnt * 64 * 1024); + } + } +#endif + +uint32_t LogoWrite_Addroffset = 0; + +uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) { + if (LogoWriteSize <= 0) return 0; + + W25QXX.SPI_FLASH_BufferWrite(Logo_Wbuff, PIC_LOGO_ADDR + LogoWrite_Addroffset, LogoWriteSize); + + 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; + 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) { + if (TitleLogoWriteSize <= 0) + return 0; + if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) + W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT35 + TitleLogoWrite_Addroffset, TitleLogoWriteSize); + else + W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT32 + TitleLogoWrite_Addroffset, TitleLogoWriteSize); + TitleLogoWrite_Addroffset += TitleLogoWriteSize; + if (TitleLogoWrite_Addroffset >= TITLELOGO_MAX_SIZE) + TitleLogoWrite_Addroffset = 0; + return 1; +} + +uint32_t default_view_addroffset_r = 0; +void default_view_Write(uint8_t *default_view__Rbuff, uint32_t default_view_Writesize) { + W25QXX.SPI_FLASH_BufferWrite(default_view__Rbuff, DEFAULT_VIEW_ADDR_TFT35 + default_view_addroffset_r, default_view_Writesize); + default_view_addroffset_r += default_view_Writesize; + if (default_view_addroffset_r >= DEFAULT_VIEW_MAX_SIZE) + default_view_addroffset_r = 0; +} + +uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { + uint8_t pic_counter = 0; + uint32_t Pic_SaveAddr; + uint32_t Pic_SizeSaveAddr; + uint32_t Pic_NameSaveAddr; + uint8_t Pname_temp; + uint32_t i, j; + uint32_t name_len = 0; + uint32_t SaveName_len = 0; + union union32 size_tmp; + + W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); + + if (pic_counter == 0xFF) + pic_counter = 0; + + if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) + Pic_SaveAddr = PIC_DATA_ADDR_TFT35 + pic_counter * PER_PIC_MAX_SPACE_TFT35; + else + Pic_SaveAddr = PIC_DATA_ADDR_TFT32 + pic_counter * PER_PIC_MAX_SPACE_TFT32; + + for (j = 0; j < pic_counter; j++) { + do { + W25QXX.SPI_FLASH_BufferRead(&Pname_temp, PIC_NAME_ADDR + SaveName_len, 1); + SaveName_len++; + } while (Pname_temp != '\0'); + } + i = 0; + while ((*(P_name + i) != '\0')) { + i++; + name_len++; + } + + Pic_NameSaveAddr = PIC_NAME_ADDR + SaveName_len; + W25QXX.SPI_FLASH_BufferWrite(P_name, Pic_NameSaveAddr, name_len + 1); + Pic_SizeSaveAddr = PIC_SIZE_ADDR + 4 * pic_counter; + size_tmp.dwords = P_size; + W25QXX.SPI_FLASH_BufferWrite(size_tmp.bytes, Pic_SizeSaveAddr, 4); + + pic_counter++; + W25QXX.SPI_FLASH_SectorErase(PIC_COUNTER_ADDR); + W25QXX.SPI_FLASH_BufferWrite(&pic_counter, PIC_COUNTER_ADDR, 1); + + return Pic_SaveAddr; +} + +uint8_t public_buf[512]; + +#if ENABLED(SDSUPPORT) + + 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'; + } + + 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; + } + + #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 + #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; + } + + watchdog_refresh(); + disp_assets_update_progress(fn); + + W25QXX.init(SPI_QUARTER_SPEED); + + 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) { + do { + watchdog_refresh(); + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + Pic_Logo_Write((uint8_t *)fn, public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); + } + else if (assetType == ASSET_TYPE_TITLE_LOGO) { + do { + watchdog_refresh(); + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + Pic_TitleLogo_Write((uint8_t *)fn, public_buf, pbr); + } while (pbr >= BMP_WRITE_BUF_LEN); + } + else if (assetType == ASSET_TYPE_G_PREVIEW) { + do { + watchdog_refresh(); + pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); + 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); + SPIFlash.beginWrite(Pic_Write_Addr); + #if HAS_SPI_FLASH_COMPRESSION + do { + watchdog_refresh(); + 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; + do { + watchdog_refresh(); + 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); + } + + file.close(); + + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOLNPAIR("Asset added: ", fn); + #endif + } + + void UpdateAssets() { + SdFile dir, root = card.getroot(); + if (dir.open(&root, assetsPath, O_RDONLY)) { + + disp_assets_update(); + disp_assets_update_progress("Erasing pics..."); + watchdog_refresh(); + spiFlashErase_PIC(); + #if HAS_SPI_FLASH_FONT + disp_assets_update_progress("Erasing fonts..."); + watchdog_refresh(); + 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 + 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; + + int8_t a = arrayFindStr(assets, COUNT(assets), card.longFilename); + if (a >= 0 && a < (int8_t)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; + + loadAsset(dir, d, assets[a], assetType); + + continue; + } + + #if HAS_SPI_FLASH_FONT + a = arrayFindStr(fonts, COUNT(fonts), card.longFilename); + if (a >= 0 && a < (int8_t)COUNT(fonts)) + loadAsset(dir, d, fonts[a], ASSET_TYPE_FONT); + #endif + } + 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); + SERIAL_ECHOLNPAIR("Total Uncompressed: ", totalSizes, ", Compressed: ", totalCompressed); + #endif + } + + #if HAS_SPI_FLASH_FONT + void spi_flash_read_test() { W25QXX.SPI_FLASH_BufferRead(public_buf, UNIGBK_FLASH_ADDR, BMP_WRITE_BUF_LEN); } + #endif + +#endif // SDSUPPORT + +void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { + uint8_t i, j; + uint8_t Pic_cnt; + uint32_t tmp_cnt = 0; + PIC_MSG PIC; + + W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1); + if (Pic_cnt == 0xFF) + Pic_cnt = 0; + + for (i = 0; i < Pic_cnt; i++) { + j = 0; + do { + W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1); + tmp_cnt++; + } 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); + break; + } + } +} + +void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t 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 + 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 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) + logo_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); + 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) + flash_view_addroffset = 0; + } +#endif + +#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 new file mode 100644 index 00000000..ea75915d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -0,0 +1,170 @@ +/** + * 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 "../../../../libs/W25Qxx.h" + +#include + +#include +#include + +#ifndef HAS_SPI_FLASH_FONT + #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 1 +#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 HAS_LOGO_IN_FLASH + #define HAS_LOGO_IN_FLASH 1 +#endif +#ifndef SPI_FLASH_SIZE + #define SPI_FLASH_SIZE 0x1000000 // 16MB +#endif + +#define PIC_MAX_CN 100 // Maximum number of pictures +#define PIC_NAME_MAX_LEN 50 // Picture name maximum length + +#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 (9*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 + + // font + #define FONTINFOADDR 0x150000 // 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 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 + + // TFT32 + #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 + +#endif + +// Flash flag +#define REFLSHE_FLGA_ADD (0X800000-32) + +// SD card information first addr +#define VAR_INF_ADDR 0x000000 +#define FLASH_INF_VALID_FLAG 0x20200831 + +//Store some gcode commands, such as auto leveling commands +#define GCODE_COMMAND_ADDR VAR_INF_ADDR + 3*1024 +#define AUTO_LEVELING_COMMAND_ADDR GCODE_COMMAND_ADDR +#define OTHERS_COMMAND_ADDR_1 AUTO_LEVELING_COMMAND_ADDR + 100 +#define OTHERS_COMMAND_ADDR_2 OTHERS_COMMAND_ADDR_1 + 100 +#define OTHERS_COMMAND_ADDR_3 OTHERS_COMMAND_ADDR_2 + 100 +#define OTHERS_COMMAND_ADDR_4 OTHERS_COMMAND_ADDR_3 + 100 + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +union union32 { + uint8_t bytes[4]; + uint32_t dwords; +}; + +// pic information +struct pic_msg { + uint8_t name[PIC_NAME_MAX_LEN]; + union union32 size; +}; + +typedef struct pic_msg PIC_MSG; + +#define BMP_WRITE_BUF_LEN 512 + +#define PICINFOADDR 0x1000 + +#define PIC_SIZE_xM 6 +#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); +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); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 00000000..2b6f5f89 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.cpp @@ -0,0 +1,252 @@ +/** + * 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")); + + //save the positon + uiCfg.current_x_position_bak = current_position.x; + uiCfg.current_y_position_bak = current_position.y; + + 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; + uiCfg.current_e_position_bak = current_position.e; + + // #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()) { + if (gCfgItems.pausePosX != (float)-1 && gCfgItems.pausePosY != (float)-1) { + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("G1 X%.1f Y%.1f"), uiCfg.current_x_position_bak, uiCfg.current_y_position_bak); + gcode.process_subcommands_now(public_buf_m); + } + 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")); + } + gcode.process_subcommands_now_P(PSTR("M24")); + 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 + + recovery.resume(); + #if 0 + // Move back to the saved XY + char str_1[16], str_2[16]; + ZERO(public_buf_m); + sprintf_P(public_buf_m, PSTR("G1 X%s Y%s F2000"), + dtostrf(recovery.info.current_position.x, 1, 3, str_1), + dtostrf(recovery.info.current_position.y, 1, 3, str_2) + ); + gcode.process_subcommands_now(public_buf_m); + + if ((gCfgItems.pause_reprint) == 1 && (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")); + } + #endif + uiCfg.print_state = WORKING; + start_print_time(); + + gCfgItems.pause_reprint = 0; + update_spi_flash(); + } + #endif + + if (uiCfg.print_state == WORKING) + filament_check(); + + TERN_(USE_WIFI_FUNCTION, wifi_looping()); +} + +void filament_pin_setup() { + #if PIN_EXISTS(MT_DET_1) + SET_INPUT_PULLUP(MT_DET_1_PIN); + #endif + #if PIN_EXISTS(MT_DET_2) + SET_INPUT_PULLUP(MT_DET_2_PIN); + #endif + #if PIN_EXISTS(MT_DET_3) + SET_INPUT_PULLUP(MT_DET_3_PIN); + #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_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h new file mode 100644 index 00000000..f3041588 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h @@ -0,0 +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 . + * + */ +#pragma once + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#define MIN_FILE_PRINTED 100 //5000 + +extern void printer_state_polling(); +extern void filament_pin_setup(); +extern void filament_check(); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 new file mode 100644 index 00000000..fa8d5a52 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -0,0 +1,766 @@ +/** + * 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 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 "Reset" +#define KEY_CONFIRM_EN "Confirm" + +#define KEYBOARD_KEY0_EN "0" +#define KEYBOARD_KEY1_EN "1" +#define KEYBOARD_KEY2_EN "2" +#define KEYBOARD_KEY3_EN "3" +#define KEYBOARD_KEY4_EN "4" +#define KEYBOARD_KEY5_EN "5" +#define KEYBOARD_KEY6_EN "6" +#define KEYBOARD_KEY7_EN "7" +#define KEYBOARD_KEY8_EN "8" +#define KEYBOARD_KEY9_EN "9" +#define KEYBOARD_KEY_POINT_EN "." +#define KEYBOARD_KEY_NEGATIVE_EN "-" + +#define MACHINE_PARA_TITLE_EN "Config" +#define MACHINE_TYPE_CNOFIG_EN "Machine settings" +#define MOTOR_CONFIG_EN "Motor settings" +#define MACHINE_LEVELING_CONFIG_EN "Leveling settings" +#define ADVANCE_CONFIG_EN "Adavance settings" + +#define MACHINE_CONFIG_TITLE_EN "Machine Settings" +#define MACHINE_TYPE_EN "Machine type" +#define MACHINE_STROKE_EN "Machine Size" +#define MACHINE_HOMEDIR_EN "Home direction" +#define MACHINE_ENDSTOP_TYPE_EN "Endstop type" +#define MACHINE_FILAMENT_CONFIG_EN "Filament settings" + +#define MACHINE_TYPE_CONFIG_TITLE_EN "Machine Settings>Machine type" +#define MACHINE_TYPE_XYZ_EN "XYZ Machine" +#define MACHINE_TYPE_DELTA_EN "Delta Machine" +#define MACHINE_TYPE_COREXY_EN "Corexy Machine" + +#define MACHINE_STROKE_CONF_TITLE_EN "Machine Settings>Machine Size" +#define X_MAX_LENGTH_EN "X-axis maximum stroke" +#define Y_MAX_LENGTH_EN "Y-axis maximum stroke" +#define Z_MAX_LENGTH_EN "Z-axis maximum stroke" + +#define X_MIN_LENGTH_EN "X-axis minimum stroke" +#define Y_MIN_LENGTH_EN "Y-axis minimum stroke" +#define Z_MIN_LENGTH_EN "Z-axis minimum stroke" + +#define HOME_DIR_CONF_TITLE_EN "Machine Settings>Home direction" +#define HOME_DIR_X_EN "X-axis home direction" +#define HOME_DIR_Y_EN "Y-axis home direction" +#define HOME_DIR_Z_EN "Z-axis home direction" +#define HOME_MIN_EN "MIN" +#define HOME_MAX_EN "MAX" + +#define ENDSTOP_CONF_TITLE_EN "Machine Settings>Endstop type" +#define MIN_ENDSTOP_X_EN "X-axis minimum Endstop" +#define MIN_ENDSTOP_Y_EN "Y-axis minimum Endstop" +#define MIN_ENDSTOP_Z_EN "Z-axis minimum Endstop" +#define MAX_ENDSTOP_X_EN "X axis maximum Endstop" +#define MAX_ENDSTOP_Y_EN "Y axis maximum Endstop" +#define MAX_ENDSTOP_Z_EN "Z axis maximum Endstop" +#define ENDSTOP_FIL_EN "Filament sensor" +#define ENDSTOP_LEVEL_EN "Leveling sensor" +#define ENDSTOP_OPENED_EN "Open" +#define ENDSTOP_CLOSED_EN "Close" + +#define FILAMENT_CONF_TITLE_EN "Machine Settings>Filament settings" +#define FILAMENT_IN_LENGTH_EN "Load length" +#define FILAMENT_IN_SPEED_EN "Load speed" +#define FILAMENT_TEMPERATURE_EN "Filament temperature" +#define FILAMENT_OUT_LENGTH_EN "Unload length" +#define FILAMENT_OUT_SPEED_EN "Unload speed" + +#define LEVELING_CONF_TITLE_EN "Machine Settings>Leveling settings" +#define LEVELING_PARA_CONF_EN "Leveling settings" +#define LEVELING_MANUAL_POS_EN "Manual leveling coordinate settings" +#define LEVELING_AUTO_COMMAND_EN "AutoLeveling command settings" +#define LEVELING_AUTO_ZOFFSET_EN "Nozzle-to-probe offsets settings" + +#define LEVELING_PARA_CONF_TITLE_EN "leveling setting" +#define AUTO_LEVELING_ENABLE_EN "Enable auto leveling" +#define BLTOUCH_LEVELING_ENABLE_EN "Enable BLtouch" +#define PROBE_PORT_EN "Probe connector" +#define PROBE_X_OFFSET_EN "Probe x axis offset" +#define PROBE_Y_OFFSET_EN "Probe y axis offset" +#define PROBE_Z_OFFSET_EN "Probe z axis offset" +#define PROBE_XY_SPEED_EN "Probe xy axis speed" +#define PROBE_Z_SPEED_EN "Probe z axis speed" +#define ENABLE_EN "YES" +#define DISABLE_EN "NO" +#define Z_MIN_EN "ZMin" +#define Z_MAX_EN "ZMax" + +#define DELTA_LEVEL_CONF_TITLE_EN "Delta Machine settings" +#define DELTA_LEVEL_CONF_EN "Delta Machine Leveling" +#define DELTA_MACHINE_RADIUS_EN "Machine Radius" +#define DELTA_DIAGONAL_ROD_EN "Machine rod length" +#define DELTA_PRINT_RADIUS_EN "Print radius" +#define DELTA_HEIGHT_EN "Print height" +#define SMOOTH_ROD_OFFSET_EN "Slider offset" +#define EFFECTOR_OFFSET_EN "Effector offset" +#define CALIBRATION_RADIUS_EN "Leveling radius" + +#define XYZ_LEVEL_CONF_TITLE_EN "Cartesian Machine Settings" +#define PROBE_REACH_MAX_LEFT_EN "Probe reaches leftmost position" +#define PROBE_REACH_MAX_RIGHT_EN "Probe reaches rightmost position" +#define PROBE_REACH_MAX_FRONT_EN "Probe reaches front position" +#define PROBE_REACH_MAX_BACK_EN "Probe reaches final position" + +#define TEMPERATURE_CONF_TITLE_EN "Machine Settings>Temperature settings" +#define NOZZLE_CONF_EN "Nozzle settings" +#define HOTBED_CONF_EN "Hotbed settings" +#define PREHEAT_TEMPER_EN "Preset temperature" + +#define NOZZLE_CONF_TITLE_EN "Machine Settings>Nozzle settings" +#define NOZZLECNT_EN "Number of nozzles" +#define NOZZLE_TYPE_EN "E0 Temperature type" +#define NOZZLE_ADJUST_TYPE_EN "PID thermostat" +#define NOZZLE_MIN_TEMPERATURE_EN "lowest temperature" +#define NOZZLE_MAX_TEMPERATURE_EN "Maximum temperature" +#define EXTRUD_MIN_TEMPER_EN "Minimum extrusion temperature" + +#define HOTBED_CONF_TITLE_EN "Machine Settings>Hotbed settings" +#define HOTBED_ADJUST_EN "PID thermostat" +#define HOTBED_MIN_TEMPERATURE_EN "lowest temperature" +#define HOTBED_MAX_TEMPERATURE_EN "Maximum temperature" + +#define MOTOR_CONF_TITLE_EN "Machine Settings>Motor settings" +#define MAXFEEDRATE_CONF_EN "Maximum speed settings" +#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" + +#define MAXFEEDRATE_CONF_TITLE_EN "Machine Settings>Maximum speed" +#define X_MAXFEEDRATE_EN "X axis maximum speed" +#define Y_MAXFEEDRATE_EN "Y axis maximum speed" +#define Z_MAXFEEDRATE_EN "Z axis maximum speed" +#define E0_MAXFEEDRATE_EN "E0 axis maximum speed" +#define E1_MAXFEEDRATE_EN "E1 axis maximum speed" + +#define ACCELERATION_CONF_TITLE_EN "Machine Settings>Acceleration" +#define PRINT_ACCELERATION_EN "Print acceleration" +#define RETRACT_ACCELERATION_EN "Retraction acceleration" +#define TRAVEL_ACCELERATION_EN "Travel acceleration" +#define X_ACCELERATION_EN "X-axis acceleration" +#define Y_ACCELERATION_EN "Y-axis acceleration" +#define Z_ACCELERATION_EN "Z-axis acceleration" +#define E0_ACCELERATION_EN "E0-axis acceleration" +#define E1_ACCELERATION_EN "E1-axis acceleration" + +#define JERK_CONF_TITLE_EN "Machine Settings>Jerk speed" +#define X_JERK_EN "X-axis jerk speed" +#define Y_JERK_EN "Y-axis jerk speed" +#define Z_JERK_EN "J-axis jerk speed" +#define E_JERK_EN "E-axis jerk speed" + +#define STEPS_CONF_TITLE_EN "Machine Settings>Steps settings" +#define X_STEPS_EN "X-axis steps" +#define Y_STEPS_EN "Y-axis stepS" +#define Z_STEPS_EN "Z-axis stepS" +#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" +#define Z_MOTORDIR_EN "Z-axis motor direction invert" +#define E0_MOTORDIR_EN "E0-axis motor direction invert" +#define E1_MOTORDIR_EN "E1-axis motor direction invert" +#define INVERT_P_EN "YES" +#define INVERT_N_EN "NO" + +#define HOMEFEEDRATE_CONF_TITLE_EN "Machine Settings>Home speed" +#define X_HOMESPEED_EN "XY-axis Home speed" +#define Y_HOMESPEED_EN "Y-axis Home speed" +#define Z_HOMESPEED_EN "Z-axis Home speed" + +#define ADVANCED_CONF_TITLE_EN "Machine Settings>Advance" +#define PWROFF_DECTION_EN "power off dection module" +#define PWROFF_AFTER_PRINT_EN "Auto Shutdown after print" +#define HAVE_UPS_EN "Has UPS power supply" +#define Z2_AND_Z2ENDSTOP_CONF_EN "Z2 Settings" +#define ENABLE_PINS_CONF_EN "Enable pins level settings" +#define WIFI_SETTINGS_EN "Wi-Fi parameter settings" +#define HOMING_SENSITIVITY_CONF_EN "Homing sensitivity settings" +#define ENCODER_SETTINGS_EN "Rotary encoder settings" + +#define Z2_AND_Z2ENDSTOP_CONF_TITLE_EN "Z2 Settings" +#define Z2_ENABLE_EN "Z2 Enable" +#define Z2_ENDSTOP_EN "Z2_EndStop Enable" +#define Z2_PORT_EN "Z2 Connector" + +#define ENABLE_PINS_CONF_TITLE_EN "ENABLE_PINS_LEVEL" +#define X_ENABLE_PINS_INVERT_EN "X_ENABLE_PIN_INVERT" +#define Y_ENABLE_PINS_INVERT_EN "Y_ENABLE_PIN_INVERT" +#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 WIFI_SETTINGS_TITLE_EN "Machine Settings>Wi-Fi Parameter" +#define WIFI_SETTINGS_MODE_EN "Wi-Fi Mode" +#define WIFI_SETTINGS_NAME_EN "Wi-Fi Name: " +#define WIFI_SETTINGS_PASSWORD_EN "Wi-Fi Password: " +#define WIFI_SETTINGS_CLOUD_EN "Do you use cloud services?" +#define WIFI_SETTINGS_CONFIG_EN "Config" +#define WIFI_SETTINGS_EDIT_EN "Edit" +#define WIFI_CONFIG_TIPS_EN "Wi-Fi configuration?" + +#define OFFSET_TITLE_EN "Machine Settings>Offset" +#define OFFSET_X_EN "X offset" +#define OFFSET_Y_EN "Y offset" +#define OFFSET_Z_EN "Z offset" + +#define HOMING_SENSITIVITY_CONF_TITLE_EN "Machine Settings>Sensitivity" +#define X_SENSITIVITY_EN "X Axis Sensitivity" +#define Y_SENSITIVITY_EN "Y Axis Sensitivity" +#define Z_SENSITIVITY_EN "Z Axis Sensitivity" +#define Z2_SENSITIVITY_EN "Z2 Axis Sensitivity" + +#define ENCODER_CONF_TITLE_EN "Machine Settings>Rotary encoder settings" +#define ENCODER_CONF_TEXT_EN "Is the encoder function used?" + +#define TOOL_TEXT_EN "Tool" +#define PREHEAT_TEXT_EN "Preheat" +#define MOVE_TEXT_EN "Move" +#define HOME_TEXT_EN "Home" +#define PRINT_TEXT_EN "Printing" +#define EXTRUDE_TEXT_EN "Extrusion" +#define LEVELING_TEXT_EN "Leveling" +#define AUTO_LEVELING_TEXT_EN "AutoLevel" +#define SET_TEXT_EN "Settings" +#define MORE_TEXT_EN "More" + +#define ADD_TEXT_EN "Add" +#define DEC_TEXT_EN "Dec" +#define EXTRUDER_1_TEXT_EN "Extrusion1" +#define EXTRUDER_2_TEXT_EN "Extrusion2" +#define HEATBED_TEXT_EN "HeatBed" +#define TEXT_1C_EN "1℃" +#define TEXT_5C_EN "5℃" +#define TEXT_10C_EN "10℃" +#define CLOSE_TEXT_EN "Close" + +#define BACK_TEXT_EN "Back" + +#define TOOL_PREHEAT_EN "Preheat" +#define TOOL_EXTRUDE_EN "Extrusion" +#define TOOL_MOVE_EN "Move" +#define TOOL_HOME_EN "Home" +#define TOOL_LEVELING_EN "Leveling" +#define TOOL_AUTO_LEVELING_EN "AutoLevel" +#define TOOL_FILAMENT_EN "Filament" +#define TOOL_MORE_EN "More" + +#define AXIS_X_ADD_TEXT_EN "X+" +#define AXIS_X_DEC_TEXT_EN "X-" +#define AXIS_Y_ADD_TEXT_EN "Y+" +#define AXIS_Y_DEC_TEXT_EN "Y-" +#define AXIS_Z_ADD_TEXT_EN "Z+" +#define AXIS_Z_DEC_TEXT_EN "Z-" +#define TEXT_01MM_EN "0.1mm" +#define TEXT_1MM_EN "1mm" +#define TEXT_10MM_EN "10mm" + +#define HOME_X_TEXT_EN "X" +#define HOME_Y_TEXT_EN "Y" +#define HOME_Z_TEXT_EN "Z" +#define HOME_ALL_TEXT_EN "Home" +#define HOME_STOPMOVE_EN "Quickstop" + +#define PAGE_UP_TEXT_EN "Page up" +#define PAGE_DOWN_TEXT_EN "Page down" + +#define EXTRUDER_IN_TEXT_EN "In" +#define EXTRUDER_OUT_TEXT_EN "Out" +#define EXTRUDE_1MM_TEXT_EN "1mm" +#define EXTRUDE_5MM_TEXT_EN "5mm" +#define EXTRUDE_10MM_TEXT_EN "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_EN "Low" +#define EXTRUDE_MEDIUM_SPEED_TEXT_EN "Normal" +#define EXTRUDE_HIGH_SPEED_TEXT_EN "High" + +#define LEVELING_POINT1_TEXT_EN "Point1" +#define LEVELING_POINT2_TEXT_EN "Point2" +#define LEVELING_POINT3_TEXT_EN "Point3" +#define LEVELING_POINT4_TEXT_EN "Point4" +#define LEVELING_POINT5_TEXT_EN "Point5" + +#define FILESYS_TEXT_EN "FileSys" +#define WIFI_TEXT_EN "WiFi" +#define FAN_TEXT_EN "Fan" +#define ABOUT_TEXT_EN "About" +#define BREAK_POINT_TEXT_EN "Continue" +#define FILAMENT_TEXT_EN "Filament" +#define LANGUAGE_TEXT_EN "Language" +#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" +#define WIFI_NAME_TEXT_EN "WiFi: " +#define WIFI_KEY_TEXT_EN "Key: " +#define WIFI_IP_TEXT_EN "IP: " +#define WIFI_AP_TEXT_EN "State: AP" +#define WIFI_STA_TEXT_EN "State: STA" +#define WIFI_CONNECTED_TEXT_EN "Connected" +#define WIFI_DISCONNECTED_TEXT_EN "Disconnected" +#define WIFI_EXCEPTION_TEXT_EN "Exception" +#define WIFI_RECONNECT_TEXT_EN "Reconnect" +#define CLOUD_TEXT_EN "Cloud" +#define CLOUD_BIND_EN "Bind" +#define CLOUD_UNBIND_EN "Unbind" +#define CLOUD_UNBINDING_EN "Unbinding" +#define CLOUD_DISCONNECTED_EN "Disconnected" +#define CLOUD_UNBINDED_EN "Unbinded" +#define CLOUD_BINDED_EN "Binded" +#define CLOUD_DISABLE_EN "Disable" + +#define FAN_ADD_TEXT_EN "Add" +#define FAN_DEC_TEXT_EN "Dec" +#define FAN_OPEN_TEXT_EN "100%" +#define FAN_HALF_TEXT_EN "50%" +#define FAN_CLOSE_TEXT_EN "Close" +#define FAN_TIPS1_TEXT_EN "FAN" +#define FAN_TIPS2_TEXT_EN "FAN\nClose" + +#define FILAMENT_IN_TEXT_EN "Load" +#define FILAMENT_OUT_TEXT_EN "Unload" +#define FILAMENT_EXT0_TEXT_EN "Extrusion1" +#define FILAMENT_EXT1_TEXT_EN "Extrusion2" +#define FILAMENT_HEAT_TEXT_EN "Preheat" +#define FILAMENT_STOP_TEXT_EN "Stop" +//#define FILAMENT_CHANGE_TEXT_EN "Filament replace" +#define FILAMENT_TIPS2_TEXT_EN "T:" +#define FILAMENT_TIPS3_TEXT_EN "Loading..." +#define FILAMENT_TIPS4_TEXT_EN "Unloading..." +#define FILAMENT_TIPS5_TEXT_EN "Temp is too low to go,please heat" +#define FILAMENT_TIPS6_TEXT_EN "Completed" + +#if 0 + #define FILAMENT_REPLAYS_IDLE_TEXT_EN "Please click or \nto replace filament!" + #define FILAMENT_CHANGE_TEXT_EN "Please click or ,\nAfter pinter pause." + #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament to extruder,and click for start loading." + #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,and click for start loading." + #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please click for start unloading.!" + #define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" + #define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" + #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,click for return!" + #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_EN "Unload filament completed,click for return!" +#endif + + +#define FILAMENT_CHANGE_TEXT_EN "Please click \nor ,After \npinter pause." +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..." +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_EN "Heating up the nozzle,\nplease wait..." +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_EN "Heat completed,please load filament \nto extruder,and click \nfor start loading." +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_EN "Please load filament to extruder,\nand click for start loading." +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_EN "Heat completed,please \nclick for start unloading.!" +#define FILAMENT_DIALOG_LOADING_TIPS_EN "Is loading ,please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_EN "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_EN "Load filament completed,\nclick for return!" +#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 FILE_LOADING_EN "Loading......" +#if 0 + #define NO_FILE_AND_CHECK_EN "No files found!Please insert SD card or U disk!" +#else + #define NO_FILE_AND_CHECK_EN " No files found!\n Check the file system configuration!" +#endif + +#define NO_FILE_EN "No files found!" + +#define EXTRUDER_TEMP_TEXT_EN "Temper" +#define EXTRUDER_E_LENGTH1_TEXT_EN "Extrusion1" +#define EXTRUDER_E_LENGTH2_TEXT_EN "Extrusion2" +#define EXTRUDER_E_LENGTH3_TEXT_EN "Extrusion3" + +#define ABOUT_TYPE_TEXT_EN "Type: " +#define ABOUT_VERSION_TEXT_EN "Firmware: " +#define ABOUT_WIFI_TEXT_EN "WiFi: " + +#define PRINTING_OPERATION_EN "Option" +#define PRINTING_PAUSE_EN "Pause" +#define PRINTING_TEMP_EN "Temp." +#define PRINTING_CHANGESPEED_EN "Speed" +#define PRINTING_RESUME_EN "Resume" +#define PRINTING_STOP_EN "Stop" +#define PRINTING_MORE_EN "More" +#define PRINTING_EXTRUDER_EN "Extrusion" +#define PRINTING_MOVE_EN "Move" + +#define EXTRUDER_SPEED_EN "Extrusion" +#define MOVE_SPEED_EN "Move" +#define EXTRUDER_SPEED_STATE_EN "Extrude Speed" +#define MOVE_SPEED_STATE_EN "Move Speed" +#define STEP_1PERCENT_EN "1%" +#define STEP_5PERCENT_EN "5%" +#define STEP_10PERCENT_EN "10%" + +#define TITLE_READYPRINT_EN "ReadyPrint" +#define TITLE_PREHEAT_EN "Preheat" +#define TITLE_MOVE_EN "Move" +#define TITLE_HOME_EN "Home" +#define TITLE_EXTRUDE_EN "Extrusion" +#define TITLE_LEVELING_EN "Leveling" +#define TITLE_SET_EN "Settings" +#define TITLE_MORE_EN "More" +#define TITLE_CHOOSEFILE_EN "ChooseFile" +#define TITLE_PRINTING_EN "Printing" +#define TITLE_OPERATION_EN "Operation" +#define TITLE_ADJUST_EN "Adjust" +#define TITLE_WIRELESS_EN "Wireless" +#define TITLE_FILAMENT_EN "Filament" +#define TITLE_ABOUT_EN "About" +#define TITLE_FAN_EN "Fan" +#define TITLE_LANGUAGE_EN "Language" +#define TITLE_PAUSE_EN "Pause" +#define TITLE_CHANGESPEED_EN "Speed" +#define TITLE_CLOUD_TEXT_EN "Cloud" +#define TITLE_DIALOG_CONFIRM_EN "Confirm" +#define TITLE_FILESYS_EN "FileSys" + +#define AUTO_SHUTDOWN_EN "Auto" +#define MANUAL_SHUTDOWN_EN "Manual" + +#define DIALOG_CONFIRM_EN "Confirm" +#define DIALOG_CANCLE_EN "Cancel" +#define DIALOG_OK_EN "OK" +#define DIALOG_RESET_EN "Reset" +#define DIALOG_RETRY_EN "Retry" +#define DIALOG_DISABLE_EN "Disable" +#define DIALOG_PRINT_MODEL_EN "Print this model?" +#define DIALOG_CANCEL_PRINT_EN "Stop print?" +#define DIALOG_RETRY_EN "Retry" +#define DIALOG_STOP_EN "Stop" +#define DIALOG_REPRINT_FROM_BREAKPOINT_EN "Reprint from breakpoint?" +//#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?" +#define DIALOG_ERROR_TIPS1_EN "Error:no file,please check it again." +#define DIALOG_ERROR_TIPS2_EN "Error:transaction failed.please check display baudrate \nwhether as the same as mainboard!" +#define DIALOG_ERROR_TIPS3_EN "Error:file name or path is too long!" +#define DIALOG_CLOSE_MACHINE_EN "Closing machine......" +#define DIALOG_UNBIND_PRINTER_EN "Unbind the printer?" +#define DIALOG_FILAMENT_NO_PRESS_EN "Filament detection switch is not pressed" +#define DIALOG_PRINT_FINISH_EN "Done print!" +#define DIALOG_PRINT_TIME_EN "Print time: " +#define DIALOG_REPRINT_EN "Print again" +#define DIALOG_WIFI_ENABLE_TIPS_EN "The wifi module is being configured\nplease wait a moment....." + +#define HOTBED_ENABLE_EN "Enable heatbed" +#define MOTOR_EN_HIGH_LEVEL_EN "High" +#define MOTOR_EN_LOW_LEVEL_EN "Low" + +#define TEXT_WIFI_MENU_TITLE_EN "WI-FI" +#define TEXT_WIFI_SAPCE_EN "space" +#define TEXT_WIFI_LETTER_EN "abc" +#define TEXT_WIFI_DIGITAL_EN "123" +#define TEXT_WIFI_SYMBOL_EN "#+=" +#define TEXT_WIFI_PASSWORD_EN "Password" + +#define TEXT_WIFI_JOINING_EN "Joining Network..." +#define TEXT_WIFI_FAILED_JOIN_EN "Failed to Join Wi-Fi" +#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi Connected" + +#define TEXT_BUTTON_DISCONECTED_EN "Disconnect" +#define TEXT_WIFI_FORGET_EN "Forget Network" +#define TEXT_DISCONECTED_EN "Wi-Fi Connected" + +//wifi-list +#define MAIN_BUILT_EN "Build" +#define MAIN_FILAMENT_EN "Filament" +#define MAIN_SETUP_EN "Setup" +#define MAIN_ABOUT_EN "About" +#define MAIN_MENU_EN "Menu" +#define FILE_MENU_BUILD_EN "Build" +#define FILE_MENU_MENU_EN " < Menu" + +//about +#define ABOUT_TITLE_EN "About" +#define ABOUT_BUILT_MACHINES_EN "Built Machines" +#define ABOUT_SPARK_EN "Spark" +#define ABOUT_VERSION_EN "Version 1.1.0" +#define ABOUT_SERIAL_NUMBER_EN "Serial Number:" +#define ABOUT_S_NUMBER_EN "DCPLX02KFC6P" + +//set +#define SETUP_TITLE_EN "Setup" +#define SETUP_WIFI_EN "Wi-Fi" +#define SETUP_MANUAL_IP_EN "Manual IP" +#define SETUP_WIFI_NOT_CONNECTED_EN "Not Connected" +#define SETUP_WIFI_NETWORK_EN "WiFi_Network" + +//build +#define BUILD_TITLE_EN "Build" +#define BUILD_SD_CARD_EN "SD Card" +#define BUILD_USB_DRIVE_EN "USB Drive" + +//SD card +#define SD_CARD_TITLE_EN "SD Card" +#define SD_CARD_BACK_EN "< Back" +//USB Drive +#define USB_DRIVE_TITLE_EN "USB Drive" +#define USB_DRIVE_BACK_EN "< Back" +#define FILE_PAGES_EN "%d/%d" +#define FILE_NEXT_PAGE_EN "Next Page" + +//BUILD PLATE +#define PLATE_TITLE_EN "Build Plate" +#define PLATE_BACK_EN "< Back" +#define PLATE_CONFIRM_EN "Confirm >" +#define PLATE_TIPS_EN "Confirm that there is a Clear\nBuild Plate installed in the\nmachine." + +//build model +#define MODEL_TITLE_EN "Build Model" +#define MODEL_START_BUILD_EN "Start Build" +#define MODEL_BACK_EN "< Back" + +//building +#define BUILDING_TITLE_EN "Building" +#define BUILDING_MENU_EN "Build Menu" +#define BUILDING_COMPLETED "Build\nComplete" + +//building menu +#define BUILDING_MENU_TITLE_EN "Build Menu" +#define BUILDING_MENU_SETTINGS_EN "Build Settings" +#define BUILDING_MENU_PAUSE_EN "Pause Build" +#define BUILDING_MENU_CANCEL_EN "Cancel Build" +#define BUILDING_MENU_BACK_EN "< Back" + +//build settings +#define SETTINGS_TITLE_EN "Build Settings" +#define SETTINGS_NOZZLE_TEMPER_EN "Nozzle Temp:" +#define SETTINGS_NOZZLE_VALUE_EN "%d" +#define SETTINGS_BED_TEMPER_EN "Bed Temp:" +#define SETTINGS_BED_VALUE_EN "%d" +#define SETTINGS_BUILD_SPEED_EN "Build Speed:" +#define SETTINGS_SPEED_VALUE_EN "Standard" +#define SETTINGS_BACK_EN "< Back" + +//build paused +#define PAUSED_TITLE_EN "Build Paused" +#define PAUSED_RESUME_EN "Resume Build" +#define PAUSED_CANCEL_EN "Cancel Build" +#define PAUSED_BACK_EN "< Back" + +//build cancel +#define CANCEL_TITLE_EN "Cancel Build" +#define CANCEL_BUILD_EN "Cancel Build" +#define CANCEL_TIPS_EN "Are you sure you want to\ncancel this build? The model\nwill be deleted from this\nmachine. It will need to be\nresent from your computer\nbefore it can be built in the\nfuture." +#define CANCEL_BACK_EN "< Back" +#define CANCEL_BUILD_DISPLAY_EN "Build\nCanceled" +#define CANCEL_OVER_PLATE_TIPS_EN "Confirm that the Build Plate\nhas been removed from the\nmachine." + +//filament model enter +#define FILAMENT_MODEL_ENTER_TITLE_EN "Model-PLA" +#define FILAMENT_MODEL_ENTER_BACK_EN "< Back" +#define FILAMENT_MODEL_ENTER_BEGIN_EN "Begin >" +#define FILAMENT_MODEL_ENTER_TIPS_EN "The Model Filament spool\ncompartment is located on\nthe right side of the machine." + +//filament model PLA +#define FILAMENT_MODEL_PLA_TITLE_EN "Model-PLA" +#define FILAMENT_PLA_LOAD_TITLE_EN "Load Filament" +#define FILAMENT_PLA_UNLOAD_TITLE_EN "Unload Filament" +#define FILAMENT_MODEL_PLA_LOAD_EN "Load Filament" +#define FILAMENT_MODEL_PLA_UNLOAD_EN "Unload Filament" +//filament support enter +#define FILAMENT_SUPPORT_ENTER_TITLE_EN "Support-PVA" +#define FILAMENT_SUPPORT_ENTER_BACK_EN "< Back" +#define FILAMENT_SUPPORT_ENTER_BEGIN_EN "Begin >" +#define FILAMENT_SUPPORT_ENTER_TIPS_EN "The Support Filament spool\ncompartment is located on\nthe left side of the machine." +//filament heating +#define FILAMENT_HEATING_LOAD_TITLE_EN "Load Filament" +#define FILAMENT_HEATING_UNLOAD_TITLE_EN "Unload Filament" +#define FILAMENT_HEATING_CANCEL_EN "< Cancel" +#define FILAMENT_HEATING_MATERIAL_EN "Material:" +#define FILAMENT_HEATING_PLA_EN "Model-PLA" +#define FILAMENT_HEATING_TIPS_EN "Print head is heating..." +//rotate left +#define ROTATE_LEFT_LOAD_TITLE_EN "Load Filament" +#define ROTATE_LEFT_UNLOAD_TITLE_EN "Unload Filament" +#define ROTATE_LEFT_CANCEL_EN "< Cancel" +#define ROTATE_LEFT_MATERIAL_EN "Material:" +#define ROTATE_LEFT_PLA_EN "Model-PLA" +#define ROTATE_LEFT_NEXT_EN "Next >" +#define ROTATE_LEFT_TIPS_EN "Rotate extruder selection\ndial to the left." + +//hang spool +#define HANG_SPOOL_TITLE_EN "Load Filament" +#define HANG_SPOOL_PREVIOUS_EN "< Previous" +#define HANG_SPOOL_MATERIAL_EN "Material:" +#define HANG_SPOOL_PLA_EN "Model-PLA" +#define HANG_SPOOL_NEXT_EN "Next >" +#define HANG_SPOOL_TIPS_EN "Hang the spool in the spool\ncompartment as shown." + +//feed filament +#define FEED_FILAMENT_TITLE_EN "Load Filament" +#define FEED_FILAMENT_PREVIOUS_EN "< Previous" +#define FEED_FILAMENT_MATERIAL_EN "Material:" +#define FEED_FILAMENT_PLA_EN "Model-PLA" +#define FEED_FILAMENT_NEXT_EN "Next >" +#define FEED_FILAMENT_TIPS_EN "Feed filament into extruder\nup beyond the gears." + +//feed filament +#define ROTATE_UP_TITLE_EN "Load Filament" +#define ROTATE_UP_PREVIOUS_EN "< Previous" +#define ROTATE_UP_MATERIAL_EN "Material:" +#define ROTATE_UP_PLA_EN "Model-PLA" +#define ROTATE_UP_NEXT_EN "Next >" +#define ROTATE_UP_TIPS_EN "Rotate extruder selection\ndial up." + +//filament begin +#define FEED_BEGIN_TITLE_EN "Load Filament" +#define FEED_BEGIN_MATERIAL_EN "Material:" +#define FEED_BEGIN_PLA_EN "Model-PLA" +#define FEED_BEGIN_NEXT_EN "Next >" +#define FEED_BEGIN_TIPS_EN "Press Next when filament\nbegins to extrude." + +//filament finish +#define FEED_FINISH_TITLE_EN "Load Filament" +#define FEED_FINISH_MATERIAL_EN "Material:" +#define FEED_FINISH_PLA_EN "Model-PLA" +#define FEED_FINISH_NEXT_EN "Finish >" +#define FEED_FINISH_TIPS_EN "Remove filament from the\nnozzle and discard." +//fiament remove +#define REMOVE_SPOOL_TITLE_EN "Unload Filament" +#define REMOVE_SPOOL_PREVIOUS_EN "< Previous" +#define REMOVE_SPOOL_FINISH_EN "Finish >" +#define REMOVE_SPOOL_MATERIAL_EN "Material:" +#define REMOVE_SPOOL_PLA_EN "Model-PLA" +#define REMOVE_SPOOL_TIPS_EN "Remove the spool and pull\nfilament out of the machine." + +#define FILAMENT_SUPPORT_PVA_EN "Support-PVA" +#define LOAD_FINISH_EN "Load\nFilament\nComplete" +#define UNLOAD_FINISH_EN "Unload\nFilament\nComplete" + +//manual ip +#define MANUAL_IP_TITLE_EN "Manual IP" +#define MANUAL_IP_CANCEL_EN "< Cancel" +#define MANUAL_IP_APPLY_EN "Join >" +#define MANUAL_IP_ADDRESS_EN "IP Address" +#define MANUAL_IP_MASK_EN "Subnet Mask" +#define MANUAL_IP_GATEWAY_EN "Default Gateway" +#define MANUAL_IP_SERVER_EN "Name Server" +#define MANUAL_IP_INIT_DATA_EN "0.0.0.0" +#define MANUAL_TEXT_POINT_EN "." +#define MANUAL_TEXT_ENTER_EN "enter" + +//Wifi name +//#define TEXT_WIFI_MENU_TITLE_EN "WI-FI" +//#define TEXT_WIFI_SAPCE_EN "space" +//#define TEXT_WIFI_LETTER_EN "abc" +//#define TEXT_WIFI_DIGITAL_EN "123" +//#define TEXT_WIFI_SYMBOL_EN "#+=" +//#define TEXT_WIFI_PASSWORD_EN "Password" + +//#define TEXT_WIFI_POINT_BOLD_EN "`" + +//#define TEXT_WIFI_JOINING_EN "Joining\nNetwork..." +//#define TEXT_WIFI_FAILED_JOIN_EN "Failed to\nJoin Wi-Fi" +//#define TEXT_WIFI_WIFI_CONECTED_EN "Wi-Fi\nConnected" + +//#define TEXT_BUTTON_DISCONECTED_EN "Disconnect" +//#define TEXT_WIFI_FORGET_EN "Forget Network" +//#define TEXT_DISCONECTED_EN "Wi-Fi Connected" + +#define TEXT_FORGET_TIPS_TITLE_EN "Forget Network" +#define TEXT_FORGET_NETWORK_TIPS1_EN "Are you sure you want to\nforget this network?" +#define TEXT_FORGET_NETWORK_TIPS2_EN "This machine will no longer\njoin this Wi-Fi Network." + +#define TEXT_IPADDRESS_EN "IP Address: " + +#define TEXT_BUILD_FROM_CURA_CANCEL_TIPS1_EN "Are you sure you want to\ncancel this build?" +#define TEXT_BUILD_FROM_CURA_CANCEL_TIPS2_EN "The model will be deleted\nfrom this machine.It will\nneed to be resent from your\ncomputer before it can be\nbuilt in the future." + +#define DIALOG_CONFIRM_EN2 "Confirm" + +#define HEATING_TITLE_EN "Heating" +#define LEVELING_TITLE_EN "Leveling" + +#define ABOUT_SPARK_ADD_EN "Spark+" + +#define TEXT_RECEIVING_DATA_EN "Receiving Data" + +#define TEXT_BABY_STEP_EN "Babystep" + +#define PRINTING_OTHER_LANGUGE "Printing" +#define PRINTING_OPERATION_OTHER_LANGUGE "Operation" +#define PRINTING_PAUSE_OTHER_LANGUGE "Pause" + +#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 new file mode 100644 index 00000000..6944d6b2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -0,0 +1,281 @@ +/** + * 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 TOOL_TEXT_FR "prêt" +#define PREHEAT_TEXT_FR "Préchauffe" +#define MOVE_TEXT_FR "Déplace" +#define HOME_TEXT_FR "Acceuil" +#define PRINT_TEXT_FR "Impression" +#define EXTRUDE_TEXT_FR "Extruder" +#define LEVELING_TEXT_FR "Leveling" +#define AUTO_LEVELING_TEXT_FR "AutoLevel" +#define SET_TEXT_FR "Config" +#define MORE_TEXT_FR "Plus" + +#define ADD_TEXT_FR "Ajouter" +#define DEC_TEXT_FR "Réduire" +#define EXTRUDER_1_TEXT_FR "Extr1" +#define EXTRUDER_2_TEXT_FR "Extr2" +#define HEATBED_TEXT_FR "Hotlit" +#define TEXT_1C_FR "1℃" +#define TEXT_5C_FR "5℃" +#define TEXT_10C_FR "10℃" +#define CLOSE_TEXT_FR "Off" + +#define BACK_TEXT_FR "Arrière" + +#define TOOL_PREHEAT_FR "Préchauffe" +#define TOOL_EXTRUDE_FR "Extruder" +#define TOOL_MOVE_FR "Déplace" +#define TOOL_HOME_FR "Acceuil" +#define TOOL_LEVELING_FR "Leveling" +#define TOOL_AUTO_LEVELING_FR "AutoLevel" +#define TOOL_FILAMENT_FR "Filament" +#define TOOL_MORE_FR "Plus" + +#define AXIS_X_ADD_TEXT_FR "X+" +#define AXIS_X_DEC_TEXT_FR "X-" +#define AXIS_Y_ADD_TEXT_FR "Y+" +#define AXIS_Y_DEC_TEXT_FR "Y-" +#define AXIS_Z_ADD_TEXT_FR "Z+" +#define AXIS_Z_DEC_TEXT_FR "Z-" +#define TEXT_01MM_FR "0.1mm" +#define TEXT_1MM_FR "1mm" +#define TEXT_10MM_FR "10mm" + +#define HOME_X_TEXT_FR "X" +#define HOME_Y_TEXT_FR "Y" +#define HOME_Z_TEXT_FR "Z" +#define HOME_ALL_TEXT_FR "ALL" +#define HOME_STOPMOVE_FR "Quickstop" + +#define PAGE_UP_TEXT_FR "En haut" +#define PAGE_DOWN_TEXT_FR "En bas" + +#define EXTRUDER_IN_TEXT_FR "Insérer" +#define EXTRUDER_OUT_TEXT_FR "éjecter" +#define EXTRUDE_1MM_TEXT_FR "1mm" +#define EXTRUDE_5MM_TEXT_FR "5mm" +#define EXTRUDE_10MM_TEXT_FR "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_FR "Lente" +#define EXTRUDE_MEDIUM_SPEED_TEXT_FR "Moyen" +#define EXTRUDE_HIGH_SPEED_TEXT_FR "Rapide" + +#define LEVELING_POINT1_TEXT_FR "Premier" +#define LEVELING_POINT2_TEXT_FR "Seconde" +#define LEVELING_POINT3_TEXT_FR "Troisième" +#define LEVELING_POINT4_TEXT_FR "Quatrième" +#define LEVELING_POINT5_TEXT_FR "Cinquième" + +#define FILESYS_TEXT_FR "Fichier" +#define WIFI_TEXT_FR "WiFi" +#define FAN_TEXT_FR "Fan" +#define ABOUT_TEXT_FR "A propos" +#define BREAK_POINT_TEXT_FR "Continuer" +#define FILAMENT_TEXT_FR "Remplacer" +#define LANGUAGE_TEXT_FR "Langue" +#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" +#define WIFI_NAME_TEXT_FR "WiFi: " +#define WIFI_KEY_TEXT_FR "Key: " +#define WIFI_IP_TEXT_FR "IP: " +#define WIFI_AP_TEXT_FR "Etat: AP" +#define WIFI_STA_TEXT_FR "Etat: STA" +#define WIFI_CONNECTED_TEXT_FR "Connecté" +#define WIFI_DISCONNECTED_TEXT_FR "Déconnecté" +#define WIFI_EXCEPTION_TEXT_FR "Exception" +#define WIFI_RECONNECT_TEXT_FR "Reconnect" +#define CLOUD_TEXT_FR "Cloud" +#define CLOUD_BIND_FR "Lié" +#define CLOUD_UNBIND_FR "Délier" +#define CLOUD_UNBINDING_FR "Délier" +#define CLOUD_DISCONNECTED_FR "Déconnecté" +#define CLOUD_UNBINDED_FR "Délier" +#define CLOUD_BINDED_FR "Lié" +#define CLOUD_DISABLE_FR "Désactiver" + +#define FAN_ADD_TEXT_FR "Ajouter" +#define FAN_DEC_TEXT_FR "Réduire" +#define FAN_OPEN_TEXT_FR "100%" +#define FAN_HALF_TEXT_FR "50%" +#define FAN_CLOSE_TEXT_FR "0%" +#define FAN_TIPS1_TEXT_FR "ventilateur" +#define FAN_TIPS2_TEXT_FR "ventilateur\n0" + +#define FILAMENT_IN_TEXT_FR "Insérer" +#define FILAMENT_OUT_TEXT_FR "éjecter" +#define FILAMENT_EXT0_TEXT_FR "Extr1" +#define FILAMENT_EXT1_TEXT_FR "Extr2" +#define FILAMENT_HEAT_TEXT_FR "Preheat" +#define FILAMENT_STOP_TEXT_FR "Arrêter" +//#define FILAMENT_CHANGE_TEXT_FR "Filament remplacer" +#define FILAMENT_TIPS2_TEXT_FR "T:" +#define FILAMENT_TIPS3_TEXT_FR "Insérer le filament..." +#define FILAMENT_TIPS4_TEXT_FR "éjecter le filament..." +#define FILAMENT_TIPS5_TEXT_FR "Température trop basse pour démarrer, chauffez svp" +#define FILAMENT_TIPS6_TEXT_FR "Terminé" + +#if 0 + #define FILAMENT_REPLAYS_IDLE_TEXT_FR "Please click or <éjecter> \nto replace filament!" + #define FILAMENT_CHANGE_TEXT_FR "Please click or <éjecter>,\nAfter pinter pause." + #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament to extruder,and click for start loading." + #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,and click for start loading." + #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please click for start unloading.!" + #define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!" + #define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!" + #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,click for return!" + #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,click for return!" +#endif +#define FILAMENT_CHANGE_TEXT_FR "Please click \nor ,After \npinter pause." +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_FR "Heating up the nozzle,\nplease wait..." +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_FR "Heat completed,please load filament \nto extruder,and click \nfor start loading." +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_FR "Please load filament to extruder,\nand click for start loading." +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_FR "Heat completed,please \nclick for start unloading.!" +#define FILAMENT_DIALOG_LOADING_TIPS_FR "Is loading ,please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_FR "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_FR "Load filament completed,\nclick for return!" +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_FR "Unload filament completed,\nclick for return!" + + +#define PRE_HEAT_EXT_TEXT_FR "E" +#define PRE_HEAT_BED_TEXT_FR "Bed" + +#define FILE_LOADING_FR "Chargement......" +#if 0 + #define NO_FILE_AND_CHECK_FR "Aucun fichier trouvé! Insérez une carte SD ou un disque U!" +#else + #define NO_FILE_AND_CHECK_FR "Aucun fichier,vérifiez à nouveau!" +#endif + +#define NO_FILE_FR "Pas de fichier!" + + + +#define EXTRUDER_TEMP_TEXT_FR "Temper" +#define EXTRUDER_E_LENGTH1_TEXT_FR "Extruder1" +#define EXTRUDER_E_LENGTH2_TEXT_FR "Extruder2" +#define EXTRUDER_E_LENGTH3_TEXT_FR "Extruder3" + +#define ABOUT_TYPE_TEXT_FR "Type: " +#define ABOUT_VERSION_TEXT_FR "Firmware: " +#define ABOUT_WIFI_TEXT_FR "Wifi: " + +#define PRINTING_OPERATION_FR "Option" +#define PRINTING_PAUSE_FR "Pause" +#define PRINTING_TEMP_FR "Temp." +#define PRINTING_CHANGESPEED_FR "Speed" +#define PRINTING_RESUME_FR "Reprendre" +#define PRINTING_STOP_FR "Stop" +#define PRINTING_MORE_FR "Plus" +#define PRINTING_EXTRUDER_FR "Extruder" +#define PRINTING_MOVE_FR "Déplace" + +#define EXTRUDER_SPEED_FR "Extruder" +#define MOVE_SPEED_FR "Déplace" +#define EXTRUDER_SPEED_STATE_FR "Vitesse d'extrusion" +#define MOVE_SPEED_STATE_FR "vitesse de déplacement" +#define STEP_1PERCENT_FR "1%" +#define STEP_5PERCENT_FR "5%" +#define STEP_10PERCENT_FR "10%" + +#define TITLE_READYPRINT_FR "Prête" +#define TITLE_PREHEAT_FR "Préchauffe" +#define TITLE_MOVE_FR "Déplace" +#define TITLE_HOME_FR "Acceuil" +#define TITLE_EXTRUDE_FR "Extruder" +#define TITLE_LEVELING_FR "Leveling" +#define TITLE_SET_FR "Paramètres" +#define TITLE_MORE_FR "Plus" +#define TITLE_CHOOSEFILE_FR "Fichier" +#define TITLE_PRINTING_FR "Pimpression" +#define TITLE_OPERATION_FR "Option" +#define TITLE_ADJUST_FR "Réglage" +#define TITLE_WIRELESS_FR "Sans fil" +#define TITLE_FILAMENT_FR "Remplacer" +#define TITLE_ABOUT_FR "A propos" +#define TITLE_FAN_FR "Ventilateur" +#define TITLE_LANGUAGE_FR "Langue" +#define TITLE_PAUSE_FR "Pause" +#define TITLE_CHANGESPEED_FR "Speed" +#define TITLE_CLOUD_TEXT_FR "Cloud" +#define TITLE_DIALOG_CONFIRM_FR "Confirm" +#define TITLE_FILESYS_FR "FileSys" + +#define DIALOG_CLOSE_MACHINE_FR "Closing machine......" + +#define AUTO_SHUTDOWN_FR "Auto" +#define MANUAL_SHUTDOWN_FR "Manuel" + +#define DIALOG_CONFIRM_FR "Confirmer" +#define DIALOG_CANCLE_FR "Annuler" +#define DIALOG_OK_FR "OK" +#define DIALOG_RESET_FR "Réinitialiser" +#define DIALOG_RETRY_FR "Recommencez" +#define DIALOG_DISABLE_FR "Disable" +#define DIALOG_PRINT_MODEL_FR "Imprimer le fichier?" +#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 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 new file mode 100644 index 00000000..f64ca4df --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -0,0 +1,276 @@ +/** + * 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 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 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_AUTO_LEVELING_IT "Autolevel" +#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 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 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 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 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" + +#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!" +#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 PRE_HEAT_EXT_TEXT_IT "E" +#define PRE_HEAT_BED_TEXT_IT "Piano" + +#define FILE_LOADING_IT "Caricamento......" +#if 0 + #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_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 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 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 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 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_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 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 new file mode 100644 index 00000000..9f695b37 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -0,0 +1,277 @@ +/** + * 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 TOOL_TEXT_RU "инструмент" +#define PREHEAT_TEXT_RU " нагрев" +#define MOVE_TEXT_RU "движение" +#define HOME_TEXT_RU "домой" +#define PRINT_TEXT_RU " печать" +#define EXTRUDE_TEXT_RU "экструзия" +#define LEVELING_TEXT_RU "уровень" +#define AUTO_LEVELING_TEXT_RU "aвто" +#define SET_TEXT_RU "настройки" +#define MORE_TEXT_RU "больше" + +#define ADD_TEXT_RU "добавить" +#define DEC_TEXT_RU "уменьшить" +#define EXTRUDER_1_TEXT_RU "экструдер1" +#define EXTRUDER_2_TEXT_RU "экструдер2" +#define HEATBED_TEXT_RU "стол" +#define TEXT_1C_RU "1℃" +#define TEXT_5C_RU "5℃" +#define TEXT_10C_RU "10℃" +#define CLOSE_TEXT_RU "выкл" + +#define BACK_TEXT_RU "назад" + +#define TOOL_PREHEAT_RU "нагрев" +#define TOOL_EXTRUDE_RU "экструзия" +#define TOOL_MOVE_RU "движение" +#define TOOL_HOME_RU "домой" +#define TOOL_LEVELING_RU "уровень" +#define TOOL_AUTO_LEVELING_RU "aвто" +#define TOOL_FILAMENT_RU "замена" +#define TOOL_MORE_RU "больше" + +#define AXIS_X_ADD_TEXT_RU "X+" +#define AXIS_X_DEC_TEXT_RU "X-" +#define AXIS_Y_ADD_TEXT_RU "Y+" +#define AXIS_Y_DEC_TEXT_RU "Y-" +#define AXIS_Z_ADD_TEXT_RU "Z+" +#define AXIS_Z_DEC_TEXT_RU "Z-" +#define TEXT_01MM_RU "0.1mm" +#define TEXT_1MM_RU "1mm" +#define TEXT_10MM_RU "10mm" + +#define HOME_X_TEXT_RU "X" +#define HOME_Y_TEXT_RU "Y" +#define HOME_Z_TEXT_RU "Z" +#define HOME_ALL_TEXT_RU "Home" +#define HOME_STOPMOVE_RU "Quickstop" + +#define PAGE_UP_TEXT_RU "вверх" +#define PAGE_DOWN_TEXT_RU "вниз" + +#define EXTRUDER_IN_TEXT_RU "втянуть" +#define EXTRUDER_OUT_TEXT_RU "выдавить" +#define EXTRUDE_1MM_TEXT_RU "1mm" +#define EXTRUDE_5MM_TEXT_RU "5mm" +#define EXTRUDE_10MM_TEXT_RU "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_RU "мин" +#define EXTRUDE_MEDIUM_SPEED_TEXT_RU "сред" +#define EXTRUDE_HIGH_SPEED_TEXT_RU "выс" + +#define LEVELING_POINT1_TEXT_RU "1точка" +#define LEVELING_POINT2_TEXT_RU "2точка" +#define LEVELING_POINT3_TEXT_RU "3точка" +#define LEVELING_POINT4_TEXT_RU "4точка" +#define LEVELING_POINT5_TEXT_RU "5точка" + +#define FILESYS_TEXT_RU "система" +#define WIFI_TEXT_RU "WiFi" +#define FAN_TEXT_RU "вентилятор" +#define ABOUT_TEXT_RU "инфо" +#define BREAK_POINT_TEXT_RU "продолжить" +#define FILAMENT_TEXT_RU "замена" +#define LANGUAGE_TEXT_RU "язык" +#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 диск" +#define WIFI_NAME_TEXT_RU "WiFi: " +#define WIFI_KEY_TEXT_RU "пароль: " +#define WIFI_IP_TEXT_RU "IP: " +#define WIFI_AP_TEXT_RU "режим: AP" +#define WIFI_STA_TEXT_RU "режим: STA" +#define WIFI_CONNECTED_TEXT_RU "подключен" +#define WIFI_DISCONNECTED_TEXT_RU "не подключен" +#define WIFI_EXCEPTION_TEXT_RU "исключение" +#define WIFI_RECONNECT_TEXT_RU "Reconnect" +#define CLOUD_TEXT_RU "облако" +#define CLOUD_BIND_RU "соединён" +#define CLOUD_UNBIND_RU "не соединён" +#define CLOUD_UNBINDING_RU "Unbinding" +#define CLOUD_DISCONNECTED_RU "Disconnected" +#define CLOUD_UNBINDED_RU "Unbinded" +#define CLOUD_BINDED_RU "Binded" +#define CLOUD_DISABLE_RU "Disable" + +#define FAN_ADD_TEXT_RU "добавить" +#define FAN_DEC_TEXT_RU "уменьшить" +#define FAN_OPEN_TEXT_RU "100%" +#define FAN_HALF_TEXT_RU "50%" +#define FAN_CLOSE_TEXT_RU "откл" +#define FAN_TIPS1_TEXT_RU "вентилятор" +#define FAN_TIPS2_TEXT_RU "вентилятор\nоткл" + +#define FILAMENT_IN_TEXT_RU "втянуть" +#define FILAMENT_OUT_TEXT_RU "выдавить" +#define FILAMENT_EXT0_TEXT_RU "экструдер1" +#define FILAMENT_EXT1_TEXT_RU "экструдер2" +#define FILAMENT_HEAT_TEXT_RU "нагрев" +#define FILAMENT_STOP_TEXT_RU "стоп" +//#define FILAMENT_CHANGE_TEXT_RU "замена" +#define FILAMENT_TIPS2_TEXT_RU "T:" +#define FILAMENT_TIPS3_TEXT_RU "втянуть..." +#define FILAMENT_TIPS4_TEXT_RU "вядавить..." +#define FILAMENT_TIPS5_TEXT_RU "Низкая температура, \nнеобходим нагрев" +#define FILAMENT_TIPS6_TEXT_RU "завершено" + +#if 0 + #define FILAMENT_REPLAYS_IDLE_TEXT_RU "Please click <втянуть> or <выдавить> \nto replace filament!" + #define FILAMENT_CHANGE_TEXT_RU "Please click <втянуть> or <выдавить>,\nAfter pinter pause." + #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,please wait..." + #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament to extruder,and click <да> for start loading." + #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,and click <да> for start loading." + #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please click <да> for start unloading.!" + #define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" + #define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" + #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,click <да> for return!" + #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,click <да> for return!" +#endif +#define FILAMENT_CHANGE_TEXT_RU "Please click \nor ,After \npinter pause." +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..." +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_RU "Heating up the nozzle,\nplease wait..." +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_RU "Heat completed,please load filament \nto extruder,and click \nfor start loading." +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_RU "Please load filament to extruder,\nand click for start loading." +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_RU "Heat completed,please \nclick for start unloading.!" +#define FILAMENT_DIALOG_LOADING_TIPS_RU "Is loading ,please wait!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_RU "Is unloading,please wait!" +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_RU "Load filament completed,\nclick for return!" +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_RU "Unload filament completed,\nclick for return!" + + +#define PRE_HEAT_EXT_TEXT_RU "E" +#define PRE_HEAT_BED_TEXT_RU "стол" + +#define FILE_LOADING_RU "загрузка......" +#if 0 + #define NO_FILE_AND_CHECK_RU "Файлы не найдены! Вставьте SD-карту или диск U!" +#endif +#define NO_FILE_AND_CHECK_RU "нет файла,попробуйте ещё раз!" + +#define NO_FILE_RU "нет файла!" + +#define EXTRUDER_TEMP_TEXT_RU "температура" +#define EXTRUDER_E_LENGTH1_TEXT_RU "экструзия1" +#define EXTRUDER_E_LENGTH2_TEXT_RU "экструзия2" +#define EXTRUDER_E_LENGTH3_TEXT_RU "экструзия3" + +#define ABOUT_TYPE_TEXT_RU "Type: " +#define ABOUT_VERSION_TEXT_RU "Firmware: " +#define ABOUT_WIFI_TEXT_RU "WiFi: " + +#define PRINTING_OPERATION_RU "управление" +#define PRINTING_PAUSE_RU "пауза" +#define PRINTING_TEMP_RU "темп" +#define PRINTING_CHANGESPEED_RU "скорости" +#define PRINTING_RESUME_RU "возобновить" +#define PRINTING_STOP_RU "стоп" +#define PRINTING_MORE_RU "больше" +#define PRINTING_EXTRUDER_RU "экстр" +#define PRINTING_MOVE_RU "движение" + +#define EXTRUDER_SPEED_RU "экстр" +#define MOVE_SPEED_RU "движ" +#define EXTRUDER_SPEED_STATE_RU "скорость экстр" +#define MOVE_SPEED_STATE_RU "скорость движ" +#define STEP_1PERCENT_RU "1%" +#define STEP_5PERCENT_RU "5%" +#define STEP_10PERCENT_RU "10%" + +#define TITLE_READYPRINT_RU "готов к" +#define TITLE_PREHEAT_RU "движение" +#define TITLE_MOVE_RU "движение" +#define TITLE_HOME_RU "Home" +#define TITLE_EXTRUDE_RU "экструзия" +#define TITLE_LEVELING_RU "уровень" +#define TITLE_SET_RU "настройки" +#define TITLE_MORE_RU "больше" +#define TITLE_CHOOSEFILE_RU "файла" +#define TITLE_PRINTING_RU "печать" +#define TITLE_OPERATION_RU "управление" +#define TITLE_ADJUST_RU "регулировать" +#define TITLE_WIRELESS_RU "Wireless" +#define TITLE_FILAMENT_RU "замена" +#define TITLE_ABOUT_RU "инфо" +#define TITLE_FAN_RU "вентилятор" +#define TITLE_LANGUAGE_RU "язык" +#define TITLE_PAUSE_RU "пауза" +#define TITLE_CHANGESPEED_RU "скорости" +#define TILE_TOOL_RU "инструмент" +#define TITLE_CLOUD_TEXT_RU "Cloud" +#define TITLE_DIALOG_CONFIRM_RU "Confirm" +#define TITLE_FILESYS_RU "FileSys" + +#define AUTO_SHUTDOWN_RU "авто-откл" +#define MANUAL_SHUTDOWN_RU "ручн-откл" + +#define DIALOG_CONFIRM_RU "да"//"подтвердить" +#define DIALOG_CANCLE_RU "отмена" +#define DIALOG_OK_RU "да" +#define DIALOG_RESET_RU "сброс" +#define DIALOG_RETRY_RU "повтор" +#define DIALOG_DISABLE_RU "запретить" +#define DIALOG_PRINT_MODEL_RU "печать модели?" +#define DIALOG_CANCEL_PRINT_RU "стоп?" +#define DIALOG_STOP_RU "стоп" +#define DIALOG_REPRINT_FROM_BREAKPOINT_RU "продолжить?" +//#define DIALOG_UNBIND_PRINTER_RU "разрыв?" +#define DIALOG_ERROR_TIPS1_RU "ошибка:нет файла, попробуйте ещё раз." +#define DIALOG_ERROR_TIPS2_RU "ошибка:сбой передачи. установите скорость \nпередачи данных как на плате управления!" +#define DIALOG_ERROR_TIPS3_RU "ошибка: имя файла слишком длинное!" +#define DIALOG_CLOSE_MACHINE_RU "Closing machine......" +#define DIALOG_UNBIND_PRINTER_RU "Unbind the printer?" +#define DIALOG_FILAMENT_NO_PRESS_RU "Filament detection switch is not pressed" +#define DIALOG_PRINT_FINISH_RU "Печать завершена!" +#define DIALOG_PRINT_TIME_RU "Время печати: " +#define DIALOG_REPRINT_RU "Print again" +#define DIALOG_WIFI_ENABLE_TIPS_RU "The wifi module is being configured,\nplease wait a moment....." + +#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 new file mode 100644 index 00000000..11899277 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -0,0 +1,499 @@ +/** + * 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_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 MOTOR_CONFIG_CN "电机设置" +#define MACHINE_LEVELING_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_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_LENGTH_CN "进料长度" +#define FILAMENT_IN_SPEED_CN "进料速度" +#define FILAMENT_TEMPERATURE_CN "换料温度" +#define FILAMENT_OUT_LENGTH_CN "退料长度" +#define FILAMENT_OUT_SPEED_CN "退料速度" + +#define LEVELING_CONF_TITLE_CN "机器参数>调平设置" +#define LEVELING_PARA_CONF_CN "调平设置" +#define LEVELING_MANUAL_POS_CN "手动调平坐标设置" +#define LEVELING_AUTO_COMMAND_CN "自动调平指令设置" +#define LEVELING_AUTO_ZOFFSET_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 HOMING_SENSITIVITY_CONF_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 WIFI_SETTINGS_CN "Wi-Fi参数设置" +#define ENCODER_SETTINGS_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 WIFI_SETTINGS_TITLE_CN "机器参数>Wi-Fi设置" +#define WIFI_SETTINGS_MODE_CN "Wi-Fi 模式" +#define WIFI_SETTINGS_NAME_CN "Wi-Fi 名称: " +#define WIFI_SETTINGS_PASSWORD_CN "Wi-Fi 密码: " +#define WIFI_SETTINGS_CLOUD_CN "是否使用云服务?" +#define WIFI_SETTINGS_CONFIG_CN "配置" +#define WIFI_SETTINGS_EDIT_CN "编辑" +#define WIFI_CONFIG_TIPS_CN "进行Wi-Fi配置?" + +#define OFFSET_TITLE_CN "机器参数>偏移设置" +#define OFFSET_X_CN "X轴与调平开关偏移" +#define OFFSET_Y_CN "Y轴与调平开关偏移" +#define OFFSET_Z_CN "Z轴与调平开关偏移" + +#define HOMING_SENSITIVITY_CONF_TITLE_CN "机器参数>灵敏度调节" +#define X_SENSITIVITY_CN "X轴灵敏度" +#define Y_SENSITIVITY_CN "Y轴灵敏度" +#define Z_SENSITIVITY_CN "Z轴灵敏度" +#define Z2_SENSITIVITY_CN "Z2轴灵敏度" + +#define ENCODER_CONF_TITLE_CN "机器参数>旋钮设置" +#define ENCODER_CONF_TEXT_CN "是否使用旋钮功能?" + +#define TOOL_TEXT_CN "工具" +#define PREHEAT_TEXT_CN "预热" +#define MOVE_TEXT_CN "移动" +#define HOME_TEXT_CN "回零" +#define PRINT_TEXT_CN "打印" +#define EXTRUDE_TEXT_CN "挤出" +#define LEVELING_TEXT_CN "调平" +#define AUTO_LEVELING_TEXT_CN "自动调平" +#define SET_TEXT_CN "设置" +#define MORE_TEXT_CN "更多" + +#define ADD_TEXT_CN "增加" +#define DEC_TEXT_CN "减少" +#define EXTRUDER_1_TEXT_CN "喷头1" +#define EXTRUDER_2_TEXT_CN "喷头2" +#define HEATBED_TEXT_CN "热床" +#define TEXT_1C_CN "1℃" +#define TEXT_5C_CN "5℃" +#define TEXT_10C_CN "10℃" +#define CLOSE_TEXT_CN "关闭" + +#define BACK_TEXT_CN "返回" + +#define TOOL_PREHEAT_CN "预热" +#define TOOL_EXTRUDE_CN "挤出" +#define TOOL_MOVE_CN "移动" +#define TOOL_HOME_CN "回零" +#define TOOL_LEVELING_CN "调平" +#define TOOL_AUTO_LEVELING_CN "自动调平" +#define TOOL_FILAMENT_CN "换料" +#define TOOL_MORE_CN "更多" + +#define AXIS_X_ADD_TEXT_CN "X+" +#define AXIS_X_DEC_TEXT_CN "X-" +#define AXIS_Y_ADD_TEXT_CN "Y+" +#define AXIS_Y_DEC_TEXT_CN "Y-" +#define AXIS_Z_ADD_TEXT_CN "Z+" +#define AXIS_Z_DEC_TEXT_CN "Z-" +#define TEXT_01MM_CN "0.1mm" +#define TEXT_1MM_CN "1mm" +#define TEXT_10MM_CN "10mm" + +#define HOME_X_TEXT_CN "X" +#define HOME_Y_TEXT_CN "Y" +#define HOME_Z_TEXT_CN "Z" +#define HOME_ALL_TEXT_CN "回零" +#define HOME_STOPMOVE_CN "急停" + +#define PAGE_UP_TEXT_CN "上一页" +#define PAGE_DOWN_TEXT_CN "下一页" + +#define EXTRUDER_IN_TEXT_CN "进料" +#define EXTRUDER_OUT_TEXT_CN "退料" +#define EXTRUDE_1MM_TEXT_CN "1mm" +#define EXTRUDE_5MM_TEXT_CN "5mm" +#define EXTRUDE_10MM_TEXT_CN "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_CN "低速" +#define EXTRUDE_MEDIUM_SPEED_TEXT_CN "常速" +#define EXTRUDE_HIGH_SPEED_TEXT_CN "高速" + +#define LEVELING_POINT1_TEXT_CN "第一点" +#define LEVELING_POINT2_TEXT_CN "第二点" +#define LEVELING_POINT3_TEXT_CN "第三点" +#define LEVELING_POINT4_TEXT_CN "第四点" +#define LEVELING_POINT5_TEXT_CN "第五点" + +#define FILESYS_TEXT_CN "文件系统" +#define WIFI_TEXT_CN "WIFI" +#define FAN_TEXT_CN "风扇" +#define ABOUT_TEXT_CN "关于" +#define BREAK_POINT_TEXT_CN "断点续打" +#define FILAMENT_TEXT_CN "换料" +#define LANGUAGE_TEXT_CN "语言" +#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卡" +#define WIFI_NAME_TEXT_CN "无线网络:" +#define WIFI_KEY_TEXT_CN "密码: " +#define WIFI_IP_TEXT_CN "IP: " +#define WIFI_AP_TEXT_CN "状态: AP" +#define WIFI_STA_TEXT_CN "状态: STA" +#define WIFI_CONNECTED_TEXT_CN "已连接" +#define WIFI_DISCONNECTED_TEXT_CN "未连接" +#define WIFI_EXCEPTION_TEXT_CN "模块异常" +#define CLOUD_TEXT_CN "云服务" +#define CLOUD_BIND_CN "已绑定" +#define CLOUD_UNBIND_CN "解绑" +#define CLOUD_UNBINDING_CN "解绑中" +#define CLOUD_DISCONNECTED_CN "未连接" +#define CLOUD_UNBINDED_CN "未绑定" +#define CLOUD_BINDED_CN "已绑定" +#define CLOUD_DISABLE_CN "已禁用" + +#define FAN_ADD_TEXT_CN "增加" +#define FAN_DEC_TEXT_CN "减少" +#define FAN_OPEN_TEXT_CN "100%" +#define FAN_HALF_TEXT_CN "50%" +#define FAN_CLOSE_TEXT_CN "关闭" +#define FAN_TIPS1_TEXT_CN "风扇" +#define FAN_TIPS2_TEXT_CN "FAN\nClose" + +#define FILAMENT_IN_TEXT_CN "进料" +#define FILAMENT_OUT_TEXT_CN "退料" +#define FILAMENT_EXT0_TEXT_CN "喷头1" +#define FILAMENT_EXT1_TEXT_CN "喷头2" +#define FILAMENT_HEAT_TEXT_CN "预热" +#define FILAMENT_STOP_TEXT_CN "停止" +#if 0 + #define FILAMENT_REPLAYS_IDLE_TEXT_CN "请按<进料>或<退料>进行换料!" + #define FILAMENT_CHANGE_TEXT_CN "待打印机暂停后,请按<进料>或<退料>进行换料!" +#else + #define FILAMENT_CHANGE_TEXT_CN "待打印机暂停后,\n请按<进料>或<退料>" +#endif + +#define FILAMENT_DIALOG_LOAD_HEAT_TIPS_CN "准备进料,正在加热,请稍等!" +#define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_CN "准备退料,正在加热,请稍等!" +#define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_CN "加热完成,请装载耗材后,按<确定>开始进料!" +#define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_CN "请装载耗材,按<确定>开始进料!" +#define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_CN "加热完成,请按<确定>开始退料!" +#define FILAMENT_DIALOG_LOADING_TIPS_CN "正在进料,请等待耗材加载完成!" +#define FILAMENT_DIALOG_UNLOADING_TIPS_CN "正在退料,请等待耗材卸载完成!" +#define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_CN "进料完成,请按<确定>返回" +#define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_CN "退料完成,请按<确定>返回" + +#define FILAMENT_TIPS3_TEXT_CN "正在进料" +#define FILAMENT_TIPS4_TEXT_CN "正在退料" +#define FILAMENT_TIPS5_TEXT_CN "温度太低,请先预热" +#define FILAMENT_TIPS6_TEXT_CN "换料完成" + +#define PRE_HEAT_EXT_TEXT_CN "喷头" +#define PRE_HEAT_BED_TEXT_CN "热床" + +#define FILE_LOADING_CN "正在载入......" +#define NO_FILE_AND_CHECK_CN "无文件!请插入sd卡或u盘!" +#define NO_FILE_CN "无文件!" + +#define EXTRUDER_TEMP_TEXT_CN "温度" +#define EXTRUDER_E_LENGTH1_TEXT_CN "喷头" +#define EXTRUDER_E_LENGTH2_TEXT_CN "喷头" +#define EXTRUDER_E_LENGTH3_TEXT_CN "喷头" + +#define ABOUT_TYPE_TEXT_CN "Type: " +#define ABOUT_VERSION_TEXT_CN "Firmware: " +#define ABOUT_WIFI_TEXT_CN "Wifi: " + +#define PRINTING_OPERATION_CN "操作" +#define PRINTING_PAUSE_CN "暂停" +#define PRINTING_TEMP_CN "温度" +#define PRINTING_CHANGESPEED_CN "变速" +#define PRINTING_RESUME_CN "恢复" +#define PRINTING_STOP_CN "停止" +#define PRINTING_MORE_CN "更多" +#define PRINTING_EXTRUDER_CN "挤出" +#define PRINTING_MOVE_CN "移动" + +#define EXTRUDER_SPEED_CN "挤出" +#define MOVE_SPEED_CN "移动" +#define EXTRUDER_SPEED_STATE_CN "挤出速度" +#define MOVE_SPEED_STATE_CN "移动速度" +#define STEP_1PERCENT_CN "1%" +#define STEP_5PERCENT_CN "5%" +#define STEP_10PERCENT_CN "10%" + +#define TITLE_READYPRINT_CN "准备打印" +#define TITLE_PREHEAT_CN "预热" +#define TITLE_MOVE_CN "移动" +#define TITLE_HOME_CN "回零" +#define TITLE_EXTRUDE_CN "挤出" +#define TITLE_LEVELING_CN "调平" +#define TITLE_SET_CN "设置" +#define TITLE_MORE_CN "更多" +#define TITLE_CHOOSEFILE_CN "选择文件" +#define TITLE_PRINTING_CN "正在打印" +#define TITLE_OPERATION_CN "操作" +#define TITLE_ADJUST_CN "调整" +#define TITLE_WIRELESS_CN "无线网络" +#define TITLE_FILAMENT_CN "换料" +#define TITLE_ABOUT_CN "关于" +#define TITLE_FAN_CN "风扇" +#define TITLE_LANGUAGE_CN "语言" +#define TITLE_PAUSE_CN "暂停" +#define TITLE_CHANGESPEED_CN "变速" +#define TITLE_CLOUD_TEXT_CN "云服务" +#define TITLE_DIALOG_CONFIRM_CN "确认" +#define TITLE_FILESYS_CN "文件系统" + +#define AUTO_SHUTDOWN_CN "自动关机" +#define MANUAL_SHUTDOWN_CN "手动关机" + +#define DIALOG_CONFIRM_CN "确定" +#define DIALOG_CANCLE_CN "取消" +#define DIALOG_OK_CN "确认" +#define DIALOG_RESET_CN "重置" +#define DIALOG_DISABLE_CN "禁用" +#define DIALOG_PRINT_MODEL_CN "打印模型?" +#define DIALOG_CANCEL_PRINT_CN "停止打印?" +#define DIALOG_RETRY_CN "重试" +#define DIALOG_STOP_CN "停止" +#define DIALOG_REPRINT_FROM_BREAKPOINT_CN "从断点续打?" +//#define DIALOG_UNBIND_PRINTER_CN "解除绑定 ?" +#define DIALOG_ERROR_TIPS1_CN "错误:找不到文件,请插入sd卡/u盘!" +#define DIALOG_ERROR_TIPS2_CN "错误:通信失败,请检查波特率或主板硬件!" +#define DIALOG_ERROR_TIPS3_CN "错误:文件名或文件路径太长 !" +#define DIALOG_CLOSE_MACHINE_CN "正在关机......" +#define DIALOG_UNBIND_PRINTER_CN "解除绑定?" +#define DIALOG_FILAMENT_NO_PRESS_CN "请先装载耗材!" +#define DIALOG_PRINT_FINISH_CN "打印完成!" +#define DIALOG_PRINT_TIME_CN "打印时间: " +#define DIALOG_REPRINT_CN "再打印一次" +#define DIALOG_WIFI_ENABLE_TIPS_CN "wifi模块正在配置中,请稍等......" + +#define TEXT_VALUE_CN "%d℃/%d℃" +#define EXTRUDE_TEXT_VALUE_T_CN ": %d℃" +#define WIFI_RECONNECT_TEXT_CN "重新连接" + +#define PRINTING_GBK "正在打印" +#define PRINTING_OPERATION_GBK "操作" +#define PRINTING_PAUSE_GBK "暂停" + +#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 new file mode 100644 index 00000000..2babbaba --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -0,0 +1,284 @@ +/** + * 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 TOOL_TEXT_SP "Ajustes" +#define PREHEAT_TEXT_SP "Precalentar"//"precalent\nar" +#define MOVE_TEXT_SP "Mover" +#define HOME_TEXT_SP "Origen" +#define PRINT_TEXT_SP "Imprimir" +#define EXTRUDE_TEXT_SP "Extrusor" +#define LEVELING_TEXT_SP "Leveling"//"nivelac\nión" +#define AUTO_LEVELING_TEXT_SP "Autolevel"//"auto\nnivelación" +#define SET_TEXT_SP "Config" +#define MORE_TEXT_SP "Más" + +#define ADD_TEXT_SP "Más" +#define DEC_TEXT_SP "Menos" +#define EXTRUDER_1_TEXT_SP "Extrusor1: " +#define EXTRUDER_2_TEXT_SP "Extrusor2: " +#define HEATBED_TEXT_SP "Cama: " +#define TEXT_1C_SP "1℃" +#define TEXT_5C_SP "5℃" +#define TEXT_10C_SP "10℃" +#define CLOSE_TEXT_SP "Apagar" + +#define BACK_TEXT_SP "Atrás" + +#define TOOL_PREHEAT_SP "Precalentar" +#define TOOL_EXTRUDE_SP "Extrusor" +#define TOOL_MOVE_SP "Mover" +#define TOOL_HOME_SP "Origen" +#define TOOL_LEVELING_SP "Leveling" +#define TOOL_AUTO_LEVELING_SP "Autolevel" +#define TOOL_FILAMENT_SP "Filamento" +#define TOOL_MORE_SP "Más" + +#define AXIS_X_ADD_TEXT_SP "X+" +#define AXIS_X_DEC_TEXT_SP "X-" +#define AXIS_Y_ADD_TEXT_SP "Y+" +#define AXIS_Y_DEC_TEXT_SP "Y-" +#define AXIS_Z_ADD_TEXT_SP "Z+" +#define AXIS_Z_DEC_TEXT_SP "Z-" +#define TEXT_01MM_SP "0.1mm" +#define TEXT_1MM_SP "1mm" +#define TEXT_10MM_SP "10mm" + +#define HOME_X_TEXT_SP "EJE X" +#define HOME_Y_TEXT_SP "EJE Y" +#define HOME_Z_TEXT_SP "EJE Z" +#define HOME_ALL_TEXT_SP "TODOS" +#define HOME_STOPMOVE_SP "Quickstop" + +#define PAGE_UP_TEXT_SP "Arriba" +#define PAGE_DOWN_TEXT_SP "Abajo" + +#define EXTRUDER_IN_TEXT_SP "Dentro" +#define EXTRUDER_OUT_TEXT_SP "Fuera" +#define EXTRUDE_1MM_TEXT_SP "1mm" +#define EXTRUDE_5MM_TEXT_SP "5mm" +#define EXTRUDE_10MM_TEXT_SP "10mm" +#define EXTRUDE_LOW_SPEED_TEXT_SP "Baja" +#define EXTRUDE_MEDIUM_SPEED_TEXT_SP "Media" +#define EXTRUDE_HIGH_SPEED_TEXT_SP "Alta" + +#define LEVELING_POINT1_TEXT_SP "Primero" +#define LEVELING_POINT2_TEXT_SP "Segundo" +#define LEVELING_POINT3_TEXT_SP "Tercero" +#define LEVELING_POINT4_TEXT_SP "Cuarto" +#define LEVELING_POINT5_TEXT_SP "Quinto" + +#define FILESYS_TEXT_SP "Puerto" +#define WIFI_TEXT_SP "WiFi" +#define FAN_TEXT_SP "Ventilador" +#define ABOUT_TEXT_SP "Acerca" +#define BREAK_POINT_TEXT_SP "Continuar" +#define FILAMENT_TEXT_SP "Filamento" +#define LANGUAGE_TEXT_SP "Language" +#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" +#define WIFI_NAME_TEXT_SP "WIFI: " +#define WIFI_KEY_TEXT_SP "Contraseña: " +#define WIFI_IP_TEXT_SP "IP: " +#define WIFI_AP_TEXT_SP "Estado: AP" +#define WIFI_STA_TEXT_SP "Estado: STA" +#define WIFI_CONNECTED_TEXT_SP "Conectado" +#define WIFI_DISCONNECTED_TEXT_SP "Desconectado" +#define WIFI_EXCEPTION_TEXT_SP "Excepción" +#define WIFI_RECONNECT_TEXT_SP "Reconnect" +#define CLOUD_TEXT_SP "Nube" +#define CLOUD_BIND_SP "Atado" +#define CLOUD_UNBIND_SP "Sin atar" +#define CLOUD_UNBINDING_SP "Unbinding" +#define CLOUD_DISCONNECTED_SP "Disconnected" +#define CLOUD_UNBINDED_SP "Unbinded" +#define CLOUD_BINDED_SP "Binded" +#define CLOUD_DISABLE_SP "Disable" + +#define FAN_ADD_TEXT_SP "Más" +#define FAN_DEC_TEXT_SP "Menos" +#define FAN_OPEN_TEXT_SP "100%" +#define FAN_HALF_TEXT_SP "50%" +#define FAN_CLOSE_TEXT_SP "0%" +#define FAN_TIPS1_TEXT_SP "ventilador" +#define FAN_TIPS2_TEXT_SP "ventilador\n0" + +#define FILAMENT_IN_TEXT_SP "Dentro" +#define FILAMENT_OUT_TEXT_SP "Fuera" +#define FILAMENT_EXT0_TEXT_SP "Extrusor1" +#define FILAMENT_EXT1_TEXT_SP "Extrusor2" +#define FILAMENT_HEAT_TEXT_SP "Precalentar" +#define FILAMENT_STOP_TEXT_SP "Parar" +//#define FILAMENT_CHANGE_TEXT_SP "Filamento" +#define FILAMENT_TIPS2_TEXT_SP "T:" +#define FILAMENT_TIPS3_TEXT_SP "Dentro..." +#define FILAMENT_TIPS4_TEXT_SP "Fuera..." +#define FILAMENT_TIPS5_TEXT_SP "Temperatura demasiado baja, por favor calentar" +#define FILAMENT_TIPS6_TEXT_SP "Completado" +#if 0 + #define FILAMENT_REPLAYS_IDLE_TEXT_SP "Please click or \nto replace filament!" + #define FILAMENT_CHANGE_TEXT_SP "Please click or ,\nAfter pinter pause." + #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..." + #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor, por favor espere..." + #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga." + #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y luego presione\"Confirmar\"para comenzar la carga." + #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.Presione\"Confirmar\"para retirar el filamento." + #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,por favor espere." + #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,por favor espere." + #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,presione\"Confirmar\"." + #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,presione\"Confirmar\"." +#else + #define FILAMENT_CHANGE_TEXT_SP "Please click \nor ,After \npinter pause." + #define FILAMENT_DIALOG_LOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." + #define FILAMENT_DIALOG_UNLOAD_HEAT_TIPS_SP "Calentando el extrusor,\npor favor espere..." + #define FILAMENT_DIALOG_LOAD_CONFIRM1_TIPS_SP "Temperatura alcanzada.Inserte el \nfilamento y luego presione\"Confirmar\"\npara comenzar la carga." + #define FILAMENT_DIALOG_LOAD_CONFIRM2_TIPS_SP "Inserte el filamento y \nluego presione\"Confirmar\"para \ncomenzar la carga." + #define FILAMENT_DIALOG_UNLOAD_CONFIRM_TIPS_SP "Temperatura alcanzada.\nPresione\"Confirmar\"para retirar \nel filamento." + #define FILAMENT_DIALOG_LOADING_TIPS_SP "Cargando filamento,\npor favor espere." + #define FILAMENT_DIALOG_UNLOADING_TIPS_SP "Retirando filamento,\npor favor espere." + #define FILAMENT_DIALOG_LOAD_COMPLETE_TIPS_SP "Filamento cargado,\npresione\"Confirmar\"." + #define FILAMENT_DIALOG_UNLOAD_COMPLETE_TIPS_SP "Filamento retirado,\npresione\"Confirmar\"." +#endif + +#define PRE_HEAT_EXT_TEXT_SP "Extrusor" +#define PRE_HEAT_BED_TEXT_SP "cama" + +#define FILE_LOADING_SP "Cargando......" +#if 0 + #define NO_FILE_AND_CHECK_SP "No se encontraron archivos! Por favor, inserte la tarjeta SD o el disco U!" +#endif +#define NO_FILE_AND_CHECK_SP "Archivo no encontrado,\n por favor insertar SD o disco USB!" + +#define NO_FILE_SP "Sin archivo!" + + + +#define EXTRUDER_TEMP_TEXT_SP "Temper" +#define EXTRUDER_E_LENGTH1_TEXT_SP "Extrusor1" +#define EXTRUDER_E_LENGTH2_TEXT_SP "Extrusor2" +#define EXTRUDER_E_LENGTH3_TEXT_SP "Extrusor3" + +#define ABOUT_TYPE_TEXT_SP "Pantalla: " +#define ABOUT_VERSION_TEXT_SP "Firmware: " +#define ABOUT_WIFI_TEXT_SP "WiFi: " + +#define PRINTING_OPERATION_SP "Ajustes" +#define PRINTING_PAUSE_SP "Pausar" +#define PRINTING_TEMP_SP "Temp." +#define PRINTING_CHANGESPEED_SP "Velocidad" +#define PRINTING_RESUME_SP "Resumir" +#define PRINTING_STOP_SP "Detener" +#define PRINTING_MORE_SP "Más" +#define PRINTING_EXTRUDER_SP "Extrusor" +#define PRINTING_MOVE_SP "Mover" + +#define EXTRUDER_SPEED_SP "Extrusor" +#define MOVE_SPEED_SP "Mover" +#define EXTRUDER_SPEED_STATE_SP "Extrusión" +#define MOVE_SPEED_STATE_SP "Movimiento" +#define STEP_1PERCENT_SP "1%" +#define STEP_5PERCENT_SP "5%" +#define STEP_10PERCENT_SP "10%" + +#define TITLE_READYPRINT_SP "Inicio" +#define TITLE_PREHEAT_SP "Precalentar" +#define TITLE_MOVE_SP "Mover" +#define TITLE_HOME_SP "Origen" +#define TITLE_EXTRUDE_SP "Extrusor" +#define TITLE_LEVELING_SP "Leveling" +#define TITLE_SET_SP "Config" +#define TITLE_MORE_SP "Más" +#define TITLE_CHOOSEFILE_SP "Imprimir" +#define TITLE_PRINTING_SP "Imprimir" +#define TITLE_OPERATION_SP "Ajustes" +#define TITLE_ADJUST_SP "Temp." +#define TITLE_WIRELESS_SP "Wireless" +#define TITLE_FILAMENT_SP "Filamento" +#define TITLE_ABOUT_SP "Acerca" +#define TITLE_FAN_SP "Ventilador" +#define TITLE_LANGUAGE_SP "Language" +#define TITLE_PAUSE_SP "Pausar" +#define TITLE_CHANGESPEED_SP "Velocidad" +#define TILE_TOOL_SP "Ajustes" +#define TITLE_CLOUD_TEXT_SP "Cloud" +#define TITLE_DIALOG_CONFIRM_SP "Confirmar" +#define TITLE_FILESYS_SP "Puerto" + +#define AUTO_SHUTDOWN_SP "Auto" +#define MANUAL_SHUTDOWN_SP "manual" + +#define DIALOG_CONFIRM_SP "Confirmar" +#define DIALOG_CANCLE_SP "Cancelar" +#define DIALOG_OK_SP "OK" +#define DIALOG_RESET_SP "Resetear" +#define DIALOG_RETRY_SP "Reintentar" +#define DIALOG_DISABLE_SP "Desactivar" +#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_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!" +#define DIALOG_ERROR_TIPS3_SP "Error : nombre de archivo o \nruta demasiado largo!" +#define DIALOG_CLOSE_MACHINE_SP "Closing machine......" +#define DIALOG_UNBIND_PRINTER_SP "Unbind the printer?" +#define DIALOG_FILAMENT_NO_PRESS_SP "Filament detection switch is not pressed" +#define DIALOG_PRINT_FINISH_SP "¡La impresión está completa!" +#define DIALOG_PRINT_TIME_SP "Tiempo de impresión: " +#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 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 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 new file mode 100644 index 00000000..d956e14a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -0,0 +1,499 @@ +/** + * 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 MOTOR_CONFIG_T_CN "電機設置" +#define MACHINE_LEVELING_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_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_LENGTH_T_CN "進料長度" +#define FILAMENT_IN_SPEED_T_CN "進料速度" +#define FILAMENT_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_MANUAL_POS_T_CN "手動調平坐標設置" +#define LEVELING_AUTO_COMMAND_T_CN "自動調平指令設置" +#define LEVELING_AUTO_ZOFFSET_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 HOMING_SENSITIVITY_CONF_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 WIFI_SETTINGS_T_CN "Wi-Fi參數設置" +#define ENCODER_SETTINGS_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 WIFI_SETTINGS_TITLE_T_CN "機器參數>Wi-Fi設置" +#define WIFI_SETTINGS_MODE_T_CN "Wi-Fi 模式" +#define WIFI_SETTINGS_NAME_T_CN "Wi-Fi 名稱: " +#define WIFI_SETTINGS_PASSWORD_T_CN "Wi-Fi 密碼: " +#define WIFI_SETTINGS_CLOUD_T_CN "是否使用雲服務?" +#define WIFI_SETTINGS_CONFIG_T_CN "配置" +#define WIFI_SETTINGS_EDIT_T_CN "編輯" +#define WIFI_CONFIG_TIPS_T_CN "進行Wi-Fi配置?" + +#define OFFSET_TITLE_T_CN "機器參數>偏移設置" +#define OFFSET_X_T_CN "X軸與調平開關偏移" +#define OFFSET_Y_T_CN "Y軸與調平開關偏移" +#define OFFSET_Z_T_CN "Z軸與調平開關偏移" + +#define HOMING_SENSITIVITY_CONF_TITLE_T_CN "機器參數>靈敏度調節" +#define X_SENSITIVITY_T_CN "X軸靈敏度" +#define Y_SENSITIVITY_T_CN "Y軸靈敏度" +#define Z_SENSITIVITY_T_CN "Z軸靈敏度" +#define Z2_SENSITIVITY_T_CN "Z2軸靈敏度" + +#define ENCODER_CONF_TITLE_T_CN "機器參數>旋鈕設置" +#define ENCODER_CONF_TEXT_T_CN "是否使用旋鈕功能?" + +#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 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 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_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp new file mode 100644 index 00000000..5a8c4986 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -0,0 +1,525 @@ +/** + * 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 tft_lvgl_configuration.cpp + * @date 2020-02-21 + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if HAS_TFT_LVGL_UI + +#include "SPI_TFT.h" + +#include "tft_lvgl_configuration.h" +#include "draw_ready_print.h" + +#include "pic_manager.h" +#include "mks_hardware_test.h" +#include "draw_ui.h" +#include "SPIFlashStorage.h" +#include + +#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" + +#include HAL_PATH(../../HAL, tft/xpt2046.h) +#include "../../../ultralcd.h" +XPT2046 touch; + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#include + +#ifndef TFT_WIDTH + #define TFT_WIDTH 480 +#endif +#ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 +#endif + +#if HAS_SPI_FLASH_FONT + extern void init_gb2312_font(); +#endif + +static lv_disp_buf_t disp_buf; +lv_group_t* g; +#if ENABLED(SDSUPPORT) + extern void UpdateAssets(); +#endif +uint16_t DeviceCode = 0x9488; +extern uint8_t sel_id; + +extern uint8_t gcode_preview_over, flash_preview_begin, default_preview_flg; + +uint8_t bmp_public_buf[17 * 1024]; + +void SysTick_Callback() { + lv_tick_inc(1); + print_time_count(); + #if ENABLED(USE_WIFI_FUNCTION) + if (tips_disp.timer == TIPS_TIMER_START) { + tips_disp.timer_count++; + } + #endif + if (uiCfg.filament_loading_time_flg == 1) { + uiCfg.filament_loading_time_cnt++; + uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_loading_time_cnt / (uiCfg.filament_loading_time * 1000.0)) * 100.0) + 0.5); + if (uiCfg.filament_loading_time_cnt >= (uiCfg.filament_loading_time * 1000)) { + uiCfg.filament_loading_time_cnt = 0; + uiCfg.filament_loading_time_flg = 0; + uiCfg.filament_loading_completed = 1; + } + } + if (uiCfg.filament_unloading_time_flg == 1) { + uiCfg.filament_unloading_time_cnt++; + uiCfg.filament_rate = (uint32_t)(((uiCfg.filament_unloading_time_cnt / (uiCfg.filament_unloading_time * 1000.0)) * 100.0) + 0.5); + if (uiCfg.filament_unloading_time_cnt >= (uiCfg.filament_unloading_time * 1000)) { + uiCfg.filament_unloading_time_cnt = 0; + uiCfg.filament_unloading_time_flg = 0; + uiCfg.filament_unloading_completed = 1; + uiCfg.filament_rate = 100; + } + } +} + +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! + SPI_TFT.spi_init(SPI_FULL_SPEED); + SPI_TFT.LCD_init(); + + //spi_flash_read_test(); + #if ENABLED(SDSUPPORT) + watchdog_refresh(); + UpdateAssets(); + #endif + + watchdog_refresh(); + mks_test_get(); + + touch.Init(); + + lv_init(); + + 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_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*/ + + #if HAS_ROTARY_ENCODER + g = lv_group_create(); + lv_indev_drv_t enc_drv; + lv_indev_drv_init(&enc_drv); + enc_drv.type = LV_INDEV_TYPE_ENCODER; + enc_drv.read_cb = my_mousewheel_read; + lv_indev_t * enc_indev = lv_indev_drv_register(&enc_drv); + lv_indev_set_group(enc_indev, g); + #endif + + lv_fs_drv_t spi_flash_drv; + lv_fs_drv_init(&spi_flash_drv); + spi_flash_drv.letter = 'F'; + spi_flash_drv.open_cb = spi_flash_open_cb; + spi_flash_drv.close_cb = spi_flash_close_cb; + spi_flash_drv.read_cb = spi_flash_read_cb; + spi_flash_drv.seek_cb = spi_flash_seek_cb; + spi_flash_drv.tell_cb = spi_flash_tell_cb; + lv_fs_drv_register(&spi_flash_drv); + + lv_fs_drv_t sd_drv; + lv_fs_drv_init(&sd_drv); + sd_drv.letter = 'S'; + sd_drv.open_cb = sd_open_cb; + sd_drv.close_cb = sd_close_cb; + sd_drv.read_cb = sd_read_cb; + sd_drv.seek_cb = sd_seek_cb; + sd_drv.tell_cb = sd_tell_cb; + lv_fs_drv_register(&sd_drv); + + systick_attach_callback(SysTick_Callback); + + #if HAS_SPI_FLASH_FONT + init_gb2312_font(); + #endif + + tft_style_init(); + + filament_pin_setup(); + + lv_encoder_pin_init(); + + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.load(); + if (recovery.valid()) { + if (gCfgItems.from_flash_pic == 1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + + uiCfg.print_state = REPRINTING; + + 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])); + + lv_draw_printing(); + } + else + #endif + lv_draw_ready_print(); + + 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) { + uint16_t i, width, height; + + width = area->x2 - area->x1 + 1; + height = area->y2 - area->y1 + 1; + + SPI_TFT.setWindow((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); +} + +#define TICK_CYCLE 1 + +unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick) { + return TICK_CYCLE * (lastTick <= curTick ? (curTick - lastTick) : (0xFFFFFFFF - lastTick + curTick)); +} + +static bool get_point(int16_t *x, int16_t *y) { + bool is_touched = touch.getRawPoint(x, y); + + 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; + } + + #if (TFT_ROTATION & TFT_ROTATE_180) + *x = int16_t((TFT_WIDTH) - (int)(*x)); + *y = int16_t((TFT_HEIGHT) - (int)(*y)); + #endif + + return is_touched; +} + +bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data) { + static int16_t last_x = 0, last_y = 0; + static uint8_t last_touch_state = LV_INDEV_STATE_REL; + static int32_t touch_time1 = 0; + 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 > 20) { + if (get_point(&last_x, &last_y)) { + + if (last_touch_state == LV_INDEV_STATE_PR) return false; + data->state = LV_INDEV_STATE_PR; + + // Set the coordinates (if released use the last-pressed coordinates) + + data->point.x = last_x; + data->point.y = last_y; + + last_x = last_y = 0; + last_touch_state = LV_INDEV_STATE_PR; + } + else { + if (last_touch_state == LV_INDEV_STATE_PR) + data->state = LV_INDEV_STATE_REL; + last_touch_state = LV_INDEV_STATE_REL; + } + + touch_time1 = tmpTime; + } + + return false; // Return `false` since no data is buffering or left to read +} + +int16_t enc_diff = 0; +lv_indev_state_t state = LV_INDEV_STATE_REL; + +bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { + (void) indev_drv; /*Unused*/ + + data->state = state; + data->enc_diff = enc_diff; + enc_diff = 0; + + return false; /*No more data to read so return false*/ +} + +extern uint8_t currentFlashPage; + +//spi_flash +uint32_t pic_read_base_addr = 0, pic_read_addr_offset = 0; +lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { + static char last_path_name[30]; + if (strcasecmp(last_path_name,path) != 0) { + pic_read_base_addr = lv_get_pic_addr((uint8_t *)path); + ZERO(last_path_name); + strcpy(last_path_name,path); + } + else { + W25QXX.init(SPI_QUARTER_SPEED); + currentFlashPage = 0; + } + pic_read_addr_offset = pic_read_base_addr; + return LV_FS_RES_OK; +} + +lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p) { + lv_fs_res_t res = LV_FS_RES_OK; + /* Add your code here*/ + pic_read_addr_offset = pic_read_base_addr; + return res; +} + +lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { + lv_pic_test((uint8_t *)buf, pic_read_addr_offset, btr); + *br = btr; + return LV_FS_RES_OK; +} + +lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { + #if HAS_SPI_FLASH_COMPRESSION + if (pos == 4) { + uint8_t bmp_header[4]; + SPIFlash.beginRead(pic_read_base_addr); + SPIFlash.readData(bmp_header, 4); + currentFlashPage = 1; + } + pic_read_addr_offset = pic_read_base_addr; + #else + pic_read_addr_offset = pic_read_base_addr + pos; + #endif + return LV_FS_RES_OK; +} + +lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { + *pos_p = pic_read_addr_offset - pic_read_base_addr; + return LV_FS_RES_OK; +} + +//sd +char *cur_namefff; +uint32_t sd_read_base_addr = 0,sd_read_addr_offset = 0; +lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) { + //cur_namefff = strrchr(path, '/'); + char name_buf[100]; + ZERO(name_buf); + strcat(name_buf,"/"); + strcat(name_buf,path); + char *temp = strstr(name_buf,".bin"); + if (temp) { strcpy(temp,".GCO"); } + sd_read_base_addr = lv_open_gcode_file((char *)name_buf); + sd_read_addr_offset = sd_read_base_addr; + if (sd_read_addr_offset == 0) return LV_FS_RES_NOT_EX; + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p) { + /* Add your code here*/ + lv_close_gcode_file(); + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { + if (btr == 200) { + lv_gcode_file_read((uint8_t *)buf); + //pic_read_addr_offset += 208; + *br = 200; + } + else if (btr == 4) { + uint8_t header_pic[4] = { 0x04, 0x90, 0x81, 0x0C }; + memcpy(buf, header_pic, 4); + //pic_read_addr_offset += 4; + *br = 4; + } + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { + sd_read_addr_offset = sd_read_base_addr + (pos - 4) / 200 * 409; + lv_gcode_file_seek(sd_read_addr_offset); + return LV_FS_RES_OK; +} + +lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { + if (sd_read_addr_offset) *pos_p = 0; + else *pos_p = (sd_read_addr_offset - sd_read_base_addr) / 409 * 200 + 4; + return LV_FS_RES_OK; +} + +void lv_encoder_pin_init() { + #if 1 // HAS_DIGITAL_BUTTONS + + #if BUTTON_EXISTS(EN1) + SET_INPUT_PULLUP(BTN_EN1); + #endif + #if BUTTON_EXISTS(EN2) + SET_INPUT_PULLUP(BTN_EN2); + #endif + #if BUTTON_EXISTS(ENC) + SET_INPUT_PULLUP(BTN_ENC); + #endif + + #if BUTTON_EXISTS(BACK) + SET_INPUT_PULLUP(BTN_BACK); + #endif + + #if BUTTON_EXISTS(UP) + SET_INPUT(BTN_UP); + #endif + #if BUTTON_EXISTS(DWN) + SET_INPUT(BTN_DWN); + #endif + #if BUTTON_EXISTS(LFT) + SET_INPUT(BTN_LFT); + #endif + #if BUTTON_EXISTS(RT) + SET_INPUT(BTN_RT); + #endif + + #endif // HAS_DIGITAL_BUTTONS +} + +#if 1 // HAS_ENCODER_ACTION + + //static const int8_t encoderDirection = 1; + //static int16_t enc_Direction; + void lv_update_encoder() { + static uint32_t encoder_time1; + uint32_t tmpTime, diffTime = 0; + tmpTime = millis(); + diffTime = getTickDiff(tmpTime, encoder_time1); + if (diffTime > 50) { + + #if HAS_ENCODER_WHEEL + + #if ANY_BUTTON(EN1, EN2, ENC, BACK) + + uint8_t newbutton = 0; + + #if BUTTON_EXISTS(EN1) + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + #endif + #if BUTTON_EXISTS(EN2) + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + #endif + #if BUTTON_EXISTS(ENC) + if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + #endif + #if BUTTON_EXISTS(BACK) + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; + #endif + + #else + + constexpr uint8_t newbutton = 0; + + #endif + + static uint8_t buttons = 0; + buttons = newbutton; + static uint8_t lastEncoderBits; + + #define encrot0 0 + #define encrot1 1 + #define encrot2 2 + + // Manage encoder rotation + //#define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: enc_Direction += encoderDirection; break; case _E2: enc_Direction -= encoderDirection; } + + uint8_t enc = 0; + if (buttons & EN_A) enc |= B01; + if (buttons & EN_B) enc |= B10; + if (enc != lastEncoderBits) { + switch (enc) { + case encrot1: + if (lastEncoderBits == encrot0) { + enc_diff--; + encoder_time1 = tmpTime; + } + break; + case encrot2: + if (lastEncoderBits == encrot0) { + enc_diff++; + encoder_time1 = tmpTime; + } + break; + } + lastEncoderBits = enc; + } + static uint8_t last_button_state = LV_INDEV_STATE_REL; + const uint8_t enc_c = (buttons & EN_C) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + if (enc_c != last_button_state) { + state = enc_c ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL; + + last_button_state = enc_c; + } + + #endif // HAS_ENCODER_WHEEL + + } // next_button_update_ms + } + +#endif // HAS_ENCODER_ACTION + +#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 new file mode 100644 index 00000000..727ab33a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.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 + +/** + * @file lcd/extui/lib/mks_ui/tft_lvgl_configuration.h + * @date 2020-02-21 + */ + +#ifdef __cplusplus + extern "C" { /* C-declarations for C++ */ +#endif + +#include + +//#define TFT_ROTATION TFT_ROTATE_180 +#define USE_WIFI_FUNCTION 0 + +extern void tft_lvgl_init(); +extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); +extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); +extern bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); + +extern void LCD_Clear(uint16_t Color); +extern void tft_set_point(uint16_t x, uint16_t y, uint16_t point); +extern void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); +extern void LCD_WriteRAM_Prepare(void); +extern void lcd_draw_logo(); +extern void lv_encoder_pin_init(); +extern void lv_update_encoder(); + +extern lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +extern lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p); +extern lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +extern lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +extern lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +extern lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +extern lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p); +extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif 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 new file mode 100644 index 00000000..e230195e --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -0,0 +1,2631 @@ +/** + * 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 "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; +tool_menu_def tool_menu; +MachinePara_menu_def MachinePara_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.MotorSetting = MOTOR_CONFIG_CN; + MachinePara_menu.leveling = MACHINE_LEVELING_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.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.InLength = FILAMENT_IN_LENGTH_CN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_CN; + machine_menu.FilamentTemperature = FILAMENT_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.LevelingManuPosConf = LEVELING_MANUAL_POS_CN; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_CN; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_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.WifiSettings = WIFI_SETTINGS_CN; + machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_CN; + machine_menu.EncoderSettings = ENCODER_SETTINGS_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; + machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_CN; + machine_menu.wifiMode = WIFI_SETTINGS_MODE_CN; + machine_menu.wifiName = WIFI_SETTINGS_NAME_CN; + machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_CN; + machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_CN; + machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_CN; + machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_CN; + machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_CN; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_CN; + machine_menu.Xoffset = OFFSET_X_CN; + machine_menu.Yoffset = OFFSET_Y_CN; + machine_menu.Zoffset = OFFSET_Z_CN; + + machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_CN; + machine_menu.X_Sensitivity = X_SENSITIVITY_CN; + machine_menu.Y_Sensitivity = Y_SENSITIVITY_CN; + machine_menu.Z_Sensitivity = Z_SENSITIVITY_CN; + machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_CN; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_CN; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_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.MotorSetting = MOTOR_CONFIG_T_CN; + MachinePara_menu.leveling = MACHINE_LEVELING_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.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.InLength = FILAMENT_IN_LENGTH_T_CN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_T_CN; + machine_menu.FilamentTemperature = FILAMENT_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.LevelingManuPosConf = LEVELING_MANUAL_POS_T_CN; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_T_CN; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_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.WifiSettings = WIFI_SETTINGS_T_CN; + machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_T_CN; + machine_menu.EncoderSettings = ENCODER_SETTINGS_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; + + machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_T_CN; + machine_menu.wifiMode = WIFI_SETTINGS_MODE_T_CN; + machine_menu.wifiName = WIFI_SETTINGS_NAME_T_CN; + machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_T_CN; + machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_T_CN; + machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_T_CN; + machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_T_CN; + machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_T_CN; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_T_CN; + machine_menu.Xoffset = OFFSET_X_T_CN; + machine_menu.Yoffset = OFFSET_Y_T_CN; + machine_menu.Zoffset = OFFSET_Z_T_CN; + + machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_T_CN; + machine_menu.X_Sensitivity = X_SENSITIVITY_T_CN; + machine_menu.Y_Sensitivity = Y_SENSITIVITY_T_CN; + machine_menu.Z_Sensitivity = Z_SENSITIVITY_T_CN; + machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_T_CN; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_T_CN; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_T_CN; + } + else { + MachinePara_menu.title = MACHINE_PARA_TITLE_EN; + MachinePara_menu.MachineSetting = MACHINE_TYPE_CNOFIG_EN; + MachinePara_menu.MotorSetting = MOTOR_CONFIG_EN; + MachinePara_menu.leveling = MACHINE_LEVELING_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.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.InLength = FILAMENT_IN_LENGTH_EN; + machine_menu.InSpeed = FILAMENT_IN_SPEED_EN; + machine_menu.FilamentTemperature = FILAMENT_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.LevelingManuPosConf = LEVELING_MANUAL_POS_EN; + machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_EN; + machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_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.WifiSettings = WIFI_SETTINGS_EN; + machine_menu.HomingSensitivityConf = HOMING_SENSITIVITY_CONF_EN; + machine_menu.EncoderSettings = ENCODER_SETTINGS_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; + machine_menu.WifiConfTitle = WIFI_SETTINGS_TITLE_EN; + machine_menu.wifiMode = WIFI_SETTINGS_MODE_EN; + machine_menu.wifiName = WIFI_SETTINGS_NAME_EN; + machine_menu.wifiPassWord = WIFI_SETTINGS_PASSWORD_EN; + machine_menu.wifiCloud = WIFI_SETTINGS_CLOUD_EN; + machine_menu.wifiConfig = WIFI_SETTINGS_CONFIG_EN; + machine_menu.wifiEdit = WIFI_SETTINGS_EDIT_EN; + machine_menu.wifiConfigTips = WIFI_CONFIG_TIPS_EN; + + machine_menu.OffsetConfTitle = OFFSET_TITLE_EN; + machine_menu.Xoffset = OFFSET_X_EN; + machine_menu.Yoffset = OFFSET_Y_EN; + machine_menu.Zoffset = OFFSET_Z_EN; + + machine_menu.HomingSensitivityConfTitle = HOMING_SENSITIVITY_CONF_TITLE_EN; + machine_menu.X_Sensitivity = X_SENSITIVITY_EN; + machine_menu.Y_Sensitivity = Y_SENSITIVITY_EN; + machine_menu.Z_Sensitivity = Z_SENSITIVITY_EN; + machine_menu.Z2_Sensitivity = Z2_SENSITIVITY_EN; + + machine_menu.EncoderConfTitle = ENCODER_CONF_TITLE_EN; + machine_menu.EncoderConfText = ENCODER_CONF_TEXT_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; + + move_menu.x_add = AXIS_X_ADD_TEXT; + move_menu.x_dec = AXIS_X_DEC_TEXT; + move_menu.y_add = AXIS_Y_ADD_TEXT; + move_menu.y_dec = AXIS_Y_DEC_TEXT; + move_menu.z_add = AXIS_Z_ADD_TEXT; + move_menu.z_dec = AXIS_Z_DEC_TEXT; + + 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; + + 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.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; + + fan_menu.full = FAN_OPEN_TEXT; + fan_menu.half = FAN_HALF_TEXT; + fan_menu.off = FAN_CLOSE_TEXT; + + 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.portuguese = LANGUAGE_PR; + language_menu.italy = LANGUAGE_IT; + language_menu.brazil = LANGUAGE_BR; + language_menu.french = LANGUAGE_FR; + + 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; + wifi_menu.disconnected = WIFI_DISCONNECTED_TEXT; + wifi_menu.exception = WIFI_EXCEPTION_TEXT; + + printing_menu.temp1 = TEXT_VALUE; + printing_menu.temp2 = TEXT_VALUE; + printing_menu.bed_temp = TEXT_VALUE; + + filament_menu.stat_temp = TEXT_VALUE; + + 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 ENABLED(USE_WIFI_FUNCTION) + list_menu.title = TEXT_WIFI_MENU_TITLE_EN; + list_menu.file_pages = FILE_PAGES_EN; + + // tips + tips_menu.joining = TEXT_WIFI_JOINING_EN; + tips_menu.failedJoin = TEXT_WIFI_FAILED_JOIN_EN; + tips_menu.wifiConected = TEXT_WIFI_WIFI_CONECTED_EN; + #endif //USE_WIFI_FUNCTION + 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.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; + // + 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; + // + 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; + set_menu.eepromSet = EEPROM_SETTINGS_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_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.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.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; + + 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_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_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; + // + 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_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; + + 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.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.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; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_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; + // + move_menu.title = TITLE_MOVE_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; + extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_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.eepromSet = EEPROM_SETTINGS_EN; + more_menu.title = TITLE_MORE_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_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.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.disconnected = CLOUD_DISCONNECTED_EN; + cloud_menu.disable = CLOUD_DISABLE_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; + // + fan_menu.title = TITLE_FAN_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.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; + + // + language_menu.title = TITLE_LANGUAGE_EN; + language_menu.next = PAGE_DOWN_TEXT_EN; + language_menu.up = PAGE_UP_TEXT_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.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.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.filament = FILAMENT_TEXT_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.extrude_speed = EXTRUDER_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.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; + 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; + + 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.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.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; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_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; + // + move_menu.title = MOVE_TEXT_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; + extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_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; + set_menu.machine_para = MACHINE_PARA_RU; + set_menu.eepromSet = EEPROM_SETTINGS_RU; + more_menu.title = TITLE_MORE_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_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.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.disconnected = CLOUD_DISCONNECTED_RU; + cloud_menu.disable = CLOUD_DISABLE_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; + // + fan_menu.title = FAN_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.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; + + // + language_menu.title = LANGUAGE_TEXT_RU; + language_menu.next = PAGE_DOWN_TEXT_RU; + language_menu.up = PAGE_UP_TEXT_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.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.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.filament = FILAMENT_TEXT_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.extrude_speed = EXTRUDER_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.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; + 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; + + 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.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.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; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_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; + // + 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.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; + extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_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; + set_menu.machine_para = MACHINE_PARA_SP; + set_menu.eepromSet = EEPROM_SETTINGS_SP; + more_menu.title = TITLE_MORE_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_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.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.disconnected = CLOUD_DISCONNECTED_SP; + cloud_menu.disable = CLOUD_DISABLE_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; + // + fan_menu.title = FAN_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.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; + + // + language_menu.title = LANGUAGE_TEXT_SP; + language_menu.next = PAGE_DOWN_TEXT_SP; + language_menu.up = PAGE_UP_TEXT_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.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.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.filament = FILAMENT_TEXT_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.extrude_speed = EXTRUDER_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.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; + 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; + + 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 // 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.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.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; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_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; + // + move_menu.title = MOVE_TEXT_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.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.temper_text = EXTRUDER_TEMP_TEXT_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.machine_para = MACHINE_PARA_FR; + set_menu.eepromSet = EEPROM_SETTINGS_FR; + more_menu.title = TITLE_MORE_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 + 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.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.disconnected = CLOUD_DISCONNECTED_FR; + cloud_menu.disable = CLOUD_DISABLE_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; + // + fan_menu.title = FAN_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.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; + + // + language_menu.title = LANGUAGE_TEXT_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.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.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.filament = FILAMENT_TEXT_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.extrude_speed = EXTRUDER_SPEED_STATE_FR; + speed_menu.move_speed = MOVE_SPEED_STATE_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; + 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; + + 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.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.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; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_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; + // + move_menu.title = MOVE_TEXT_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; + // + 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.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; + set_menu.machine_para = MACHINE_PARA_IT; + set_menu.eepromSet = EEPROM_SETTINGS_IT; + more_menu.title = TITLE_MORE_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_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.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.disconnected = CLOUD_DISCONNECTED_IT; + cloud_menu.disable = CLOUD_DISABLE_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; + // + fan_menu.title = FAN_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.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; + + // + language_menu.title = LANGUAGE_TEXT_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.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.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.filament = FILAMENT_TEXT_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.extrude_speed = EXTRUDER_SPEED_STATE_IT; + speed_menu.move_speed = MOVE_SPEED_STATE_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; + 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; + + 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 // 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.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.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; + tool_menu.autoleveling = TOOL_AUTO_LEVELING_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; + // + move_menu.title = TITLE_MOVE_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; + extrude_menu.temper_text = EXTRUDER_TEMP_TEXT_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.eepromSet = EEPROM_SETTINGS_EN; + // + more_menu.title = TITLE_MORE_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_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.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.disconnected = CLOUD_DISCONNECTED_EN; + cloud_menu.disable = CLOUD_DISABLE_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; + // + fan_menu.title = TITLE_FAN_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.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; + + // + language_menu.title = TITLE_LANGUAGE_EN; + language_menu.next = PAGE_DOWN_TEXT_EN; + language_menu.up = PAGE_UP_TEXT_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.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.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.filament = FILAMENT_TEXT_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.extrude_speed = EXTRUDER_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.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; + 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; + + 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 // 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 new file mode 100644 index 00000000..675fd41f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -0,0 +1,837 @@ +/** + * 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_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(); + +#define LANG_SIMPLE_CHINESE 1 +#define LANG_COMPLEX_CHINESE 2 +#define LANG_ENGLISH 3 +#define LANG_JAPAN 4 +#define LANG_GERMAN 5 +#define LANG_FRENCH 6 +#define LANG_RUSSIAN 7 +#define LANG_KOREAN 8 +#define LANG_TURKISH 9 +#define LANG_SPANISH 10 +#define LANG_GREEK 11 +#define LANG_ITALY 12 +#define LANG_PORTUGUESE 13 + +#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 *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 *InLength; + const char *InSpeed; + const char *FilamentTemperature; + const char *OutLength; + const char *OutSpeed; + + const char *LevelingParaConfTitle; + const char *LevelingParaConf; + const char *LevelingManuPosConf; + const char *LevelingAutoCommandConf; + const char *LevelingAutoZoffsetConf; + + 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 *HomingSensitivityConf; + + 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 *HomingSensitivityConfTitle; + const char *X_Sensitivity; + const char *Y_Sensitivity; + const char *Z_Sensitivity; + const char *Z2_Sensitivity; + + 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 *WifiSettings; + const char *EncoderSettings; + + 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; + + const char *WifiConfTitle; + const char *wifiMode; + const char *wifiName; + const char *wifiPassWord; + const char *wifiCloud; + const char *wifiConfig; + const char *wifiEdit; + const char *wifiConfigTips; + + const char *OffsetConfTitle; + const char *Xoffset; + const char *Yoffset; + const char *Zoffset; + + const char *EncoderConfTitle; + const char *EncoderConfText; + +} machine_common_def; + +extern machine_common_def machine_menu; + +typedef struct common_menu_disp { + const char *text_back; + const char *dialog_confirm_title; + const char *close_machine_tips; + const char *unbind_printer_tips; + const char *print_special_title; + const char *pause_special_title; + const char *operate_special_title; + const char *next; + const char *previous; +} common_menu_def; + +extern common_menu_def common_menu; + +typedef struct main_menu_disp { + const char *title; + const char *preheat; + const char *move; + const char *home; + const char *print; + const char *extrude; + const char *leveling; + const char *autoleveling; + const char *fan; + const char *set; + const char *tool; + const char *more; + const char *machine_para; +} main_menu_def; + +extern main_menu_def main_menu; + +typedef struct preheat_menu_disp { + const char *adjust_title; + const char *title; + const char *add; + const char *dec; + const char *ext1; + const char *ext2; + const char *hotbed; + const char *off; + const char *step_1c; + const char *step_5c; + const char *step_10c; + const char *back; + + const char *value_state; + + const char *dialog_tips; + +} preheat_menu_def; + +extern preheat_menu_def preheat_menu; + +typedef struct move_menu_disp { + const char *title; + const char *x_add; + const char *x_dec; + const char *y_add; + const char *y_dec; + const char *z_add; + const char *z_dec; + const char *step_001mm; + const char *step_005mm; + const char *step_01mm; + const char *step_1mm; + const char *step_10mm; + const char *back; +} move_menu_def; + +extern move_menu_def move_menu; + +typedef struct home_menu_disp { + const char *title; + const char *home_all; + const char *home_x; + const char *home_y; + const char *home_z; + const char *stopmove; + const char *back; +} home_menu_def; + +extern home_menu_def home_menu; + +typedef struct file_menu_disp { + const char *title; + const char *page_up; + const char *page_down; + const char *back; + + const char *file_loading; + const char *no_file; + const char *no_file_and_check; + +} file_menu_def; + +extern file_menu_def file_menu; + +typedef struct extrude_menu_disp { + const char *title; + const char *in; + const char *out; + const char *ext1; + const char *ext2; + const char *step_1mm; + const char *step_5mm; + const char *step_10mm; + const char *low; + const char *normal; + const char *high; + const char *back; + + const char *count_value_mm; + const char *count_value_cm; + const char *count_value_m; + const char *temp_value; + const char *temper_text; +} extrude_menu_def; + +extern extrude_menu_def extrude_menu; + +typedef struct leveling_menu_disp { + const char *title; + const char *position1; + const char *position2; + const char *position3; + const char *position4; + const char *position5; + + char *back; +} leveling_menu_def; + +extern leveling_menu_def leveling_menu; + +typedef struct set_menu_disp { + const char *title; + const char *filesys; + const char *wifi; + const char *about; + const char *fan; + const char *filament; + const char *breakpoint; + const char *motoroff; + const char *motoroffXY; + 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 { + const char *title; + const char *filesys; + const char *sd_sys; + const char *usb_sys; + const char *back; +} filesys_menu_def; + +extern filesys_menu_def filesys_menu; + +typedef struct more_menu_disp { + const char *title; + const char *back; +} more_menu_def; + +extern more_menu_def more_menu; + +typedef struct wifi_menu_disp { + const char *title; + const char *ip; + const char *wifi; + const char *key; + const char *state_ap; + const char *state_sta; + const char *cloud; + const char *connected; + const char *disconnected; + const char *exception; + const char *back; + const char *reconnect; +} wifi_menu_def; + +extern wifi_menu_def wifi_menu; + +typedef struct cloud_menu_disp { + const char *title; + const char *unbind; + const char *unbinding; + const char *unbinded; + const char *bind; + const char *binding; + const char *binded; + const char *disable; + const char *disconnected; + const char *back; + const char *unbind_printer_tips; +} cloud_menu_def; + +extern cloud_menu_def cloud_menu; + +typedef struct about_menu_disp { + const char *title; + const char *type_name; + const char *firmware_v; + const char *type; + const char *version; + const char *wifi; + const char *type_robin; + const char *type_robin_mini; + const char *back; +} about_menu_def; + +extern about_menu_def about_menu; + +typedef struct fan_menu_disp { + const char *title; + const char *add; + const char *dec; + const char *full; + const char *half; + const char *off; + const char *back; + + const char *state; + const char *state_value; +} fan_menu_def; + +extern fan_menu_def fan_menu; + +typedef struct filament_menu_disp { + const char *title; + const char *in; + const char *out; + const char *ext1; + const char *ext2; + const char *back; + const char *stat_temp; + const char *ready_replace; + const char *replacing; + const char *loading; + const char *unloading; + const char *heating; + const char *complete_and_back; + const char *filament_dialog_load_heat; + const char *filament_dialog_unload_heat; + const char *filament_dialog_load_heat_confirm; + const char *filament_dialog_unload_heat_confirm; + const char *filament_dialog_loading; + const char *filament_dialog_unloading; + const char *filament_dialog_load_completed; + const char *filament_dialog_unload_completed; + const char *filament_dialog_ok; + const char *filament_dialog_back; +} filament_menu_def; + +extern filament_menu_def filament_menu; + +typedef struct language_menu { + const char *title; + const char *chinese_s; + const char *chinese_t; + const char *english; + const char *russian; + const char *japan; + const char *italy; + const char *german; + const char *spanish; + const char *korean; + const char *french; + const char *brazil; + const char *portuguese; + const char *next; + const char *up; + const char *back; +} language_menu_def; + +extern language_menu_def language_menu; + +typedef struct printing_menu_disp { + const char *title; + const char *option; + const char *temp1; + const char *temp2; + const char *bed_temp; + const char *fan_speed; + const char *pause; + const char *resume; + const char *stop; +} printing_menu_def; + +extern printing_menu_def printing_menu; + +typedef struct operation_menu_disp { + const char *title; + const char *pause; + const char *stop; + const char *temp; + const char *fan; + const char *filament; + const char *extr; + const char *speed; + const char *move; + const char *more; + const char *auto_off; + const char *manual_off; + const char *back; + const char *babystep; +} operation_menu_def; + +extern operation_menu_def operation_menu; + +typedef struct pause_menu_disp { + const char *title; + const char *resume; + const char *stop; + const char *extrude; + const char *move; + const char *filament; + const char *more; +} pause_menu_def; + +extern pause_menu_def pause_menu; + +typedef struct speed_menu_disp { + const char *title; + const char *add; + const char *dec; + const char *extrude; + const char *move; + const char *step_1percent; + const char *step_5percent; + const char *step_10percent; + const char *back; + const char *move_speed; + const char *extrude_speed; +} speed_menu_def; + +extern speed_menu_def speed_menu; + +typedef struct printing_more_menu_disp { + const char *title; + const char *fan; + const char *auto_close; + const char *manual; + const char *temp; + const char *speed; + const char *back; +} printing_more_menu_def; + +extern printing_more_menu_def printing_more_menu; + +typedef struct dialog_menu_disp { + const char *confirm_title; + + const char *error1_repint_no_file; + const char *error2_communication_fail; + const char *error3_filename_too_long; + const char *error4_no_file; + const char *error5_check_filesys; + + 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 { + const char *title; + const char *confirm; + const char *cancle; + const char *print_file; + const char *cancle_print; + const char *retry; + const char *stop; + const char *no_file_print_tips; + const char *print_from_breakpoint; + const char *file_name_too_long_error; + const char *close_machine_error; + const char *filament_no_press; + const char *print_finish; + const char *print_time; + 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 tool_menu_disp { + const char *title; + const char *preheat; + const char *extrude; + const char *move; + const char *home; + const char *leveling; + const char *autoleveling; + const char *filament; + const char *more; + const char *back; +} tool_menu_def; + +extern tool_menu_def tool_menu; + +typedef struct MachinePara_menu_disp { + const char *title; + const char *MachineSetting; + const char *MotorSetting; + const char *leveling; + const char *AdvanceSetting; +} MachinePara_menu_def; + +extern MachinePara_menu_def MachinePara_menu; + +typedef struct pause_msg_disp { + const char *pausing; + const char *changing; + const char *unload; + const char *waiting; + const char *insert; + const char *load; + const char *purge; + const char *resume; + const char *heat; + const char *heating; + const char *option; + 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" +//#endif + +#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 TEXT_1C "1℃" +#define TEXT_5C "5℃" +#define TEXT_10C "10℃" + +#define AXIS_X_ADD_TEXT "X+" +#define AXIS_X_DEC_TEXT "X-" +#define AXIS_Y_ADD_TEXT "Y+" +#define AXIS_Y_DEC_TEXT "Y-" +#define AXIS_Z_ADD_TEXT "Z+" +#define AXIS_Z_DEC_TEXT "Z-" +#define TEXT_001MM "0.01mm" +#define TEXT_005MM "0.05mm" +#define TEXT_01MM "0.1mm" +#define TEXT_1MM "1mm" +#define TEXT_10MM "10mm" + +#define EXTRUDE_1MM_TEXT "1mm" +#define EXTRUDE_5MM_TEXT "5mm" +#define EXTRUDE_10MM_TEXT "10mm" + +#define STEP_1PERCENT "1%" +#define STEP_5PERCENT "5%" +#define STEP_10PERCENT "10%" + +#define LANGUAGE_S_CN "简体" +#define LANGUAGE_T_CN "繁体" +#define LANGUAGE_EN "English" +#define LANGUAGE_JP "日本語" +#define LANGUAGE_GE "Deutsch" +#define LANGUAGE_FR "français" +#define LANGUAGE_IT "Italiano" +#define LANGUAGE_PR "português" +#define LANGUAGE_KR "Korean" +#define LANGUAGE_BR "Brazil" +#define LANGUAGE_RU "русский" +#define LANGUAGE_SP "español" + +#define HOME_X_TEXT "X" +#define HOME_Y_TEXT "Y" +#define HOME_Z_TEXT "Z" +#define HOME_ALL_TEXT "All" +//#if defined(MKS_ROBIN_NANO) +#define ABOUT_TYPE_TEXT "MKS Robin Pro" +//#elif defined(MKS_ROBIN_MINI) +//#define ABOUT_TYPE_TEXT "MKS Robin Mini" +//#endif +#define ABOUT_VERSION_TEXT "1.0.0" +//#define ABOUT_WIFI_TEXT "WiFi:" + +#define FAN_OPEN_TEXT "100%" +#define FAN_HALF_TEXT "50%" +#define FAN_CLOSE_TEXT "0%" +//#define FAN_TIPS1_TEXT "FAN" +//#define FAN_TIPS2_TEXT "FAN\nClose" + +#define WIFI_TEXT "WIFI" +#define WIFI_IP_TEXT "IP: " +#define WIFI_NAME_TEXT "WiFi: " +#define WIFI_KEY_TEXT "Key: " +#define WIFI_STATE_AP_TEXT "State: AP" +#define WIFI_STATE_STA_TEXT "State: STA" +#define WIFI_CONNECTED_TEXT "Connected" +#define WIFI_DISCONNECTED_TEXT "Disconnected" +#define WIFI_EXCEPTION_TEXT "Exception" + +#define FILAMENT_TIPS2_TEXT "T:" + +#define DIALOG_UPLOAD_ING_EN "Uploading......" +#define DIALOG_UPLOAD_ERROR_EN "Upload error" +#define DIALOG_UPLOAD_FINISH_EN "Upload finished" +#define DIALOG_UPLOAD_SIZE_EN "Size" +#define DIALOG_UPLOAD_TIME_EN "Time" +#define DIALOG_UPLOAD_SPEED_EN "Speed" +#define DIALOG_UPDATE_WIFI_FIRMWARE_EN "Updating wifi model firmware" +#define DIALOG_UPDATE_WIFI_WEB_EN "Updating wifi model web data" +#define DIALOG_UPDATE_NO_DEVICE_EN "please check \nwether memory device insert!" + +#define ZOFFSET_STEP001 "0.01mm" +#define ZOFFSET_STEP01 "0.1mm" +#define ZOFFSET_STEP1 "1mm" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp new file mode 100644 index 00000000..01c86ad7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.cpp @@ -0,0 +1,120 @@ +/** + * 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 "draw_ui.h" +#include "wifiSerial.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include +#include +#include +#include +#include + +#include "../../../../MarlinCore.h" + +DEFINE_WFSERIAL(WifiSerial1, 1); + +WifiSerial::WifiSerial(usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin) { + this->usart_device = usart_device; + this->tx_pin = tx_pin; + this->rx_pin = rx_pin; +} + +/** + * Set up / tear down + */ +#if STM32_MCU_SERIES == STM32_SERIES_F1 + /* F1 MCUs have no GPIO_AFR[HL], so turn off PWM if there's a conflict + * on this GPIO bit. */ + static void disable_timer_if_necessary(timer_dev *dev, uint8 ch) { + if (dev != nullptr) timer_set_mode(dev, ch, TIMER_DISABLED); + } +#elif STM32_MCU_SERIES == STM32_SERIES_F2 || STM32_MCU_SERIES == STM32_SERIES_F4 + #define disable_timer_if_necessary(dev, ch) ((void)0) +#else + #warning "Unsupported STM32 series; timer conflicts are possible" +#endif + +void WifiSerial::begin(uint32 baud) { begin(baud, SERIAL_8N1); } + +/** + * Roger Clark. + * Note. The config parameter is not currently used. This is a work in progress. + * Code needs to be written to set the config of the hardware serial control register in question. + */ + +void WifiSerial::begin(uint32 baud, uint8_t config) { + //ASSERT(baud <= this->usart_device->max_baud); // Roger Clark. Assert doesn't do anything useful, we may as well save the space in flash and ram etc + + if (baud > this->usart_device->max_baud) return; + + const stm32_pin_info *txi = &PIN_MAP[this->tx_pin], + *rxi = &PIN_MAP[this->rx_pin]; + + disable_timer_if_necessary(txi->timer_device, txi->timer_channel); + + usart_init(this->usart_device); + + // Reinitialize the receive buffer, mks_esp8266 fixed data frame length is 1k bytes + rb_init(this->usart_device->rb, WIFI_RX_BUF_SIZE, wifiRxBuf); + + usart_config_gpios_async(this->usart_device, + rxi->gpio_device, rxi->gpio_bit, + txi->gpio_device, txi->gpio_bit, + config); + usart_set_baud_rate(this->usart_device, USART_USE_PCLK, baud); + usart_enable(this->usart_device); +} + +void WifiSerial::end(void) { + usart_disable(this->usart_device); +} + +int WifiSerial::available(void) { + return usart_data_available(this->usart_device); +} + +// +// I/O +// + +int WifiSerial::read(void) { + if (usart_data_available(usart_device) <= 0) return -1; + return usart_getc(usart_device); +} + +int WifiSerial::write(unsigned char ch) { + usart_putc(this->usart_device, ch); + return 1; +} + +int WifiSerial::wifi_rb_is_full(void) { + return rb_is_full(this->usart_device->rb); +} + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h new file mode 100644 index 00000000..9d3946fe --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifiSerial.h @@ -0,0 +1,102 @@ +/** + * 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_lvgl_configuration.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#if SERIAL_PORT_2 != -1 + #error "SERIAL_PORT_2 must be set to -1 with HAS_TFT_LVGL_UI and USE_WIFI_FUNCTION." +#endif + +#define WIFI_BAUDRATE 115200 +#define WIFI_UPLOAD_BAUDRATE 1958400 +#define USART_SAFE_INSERT + +#define WIFI_RX_BUF_SIZE (1024+1) + +#include +#include +#include +#include +#include +#include + +#define DEFINE_WFSERIAL(name, n)\ + WifiSerial name(USART##n, \ + BOARD_USART##n##_TX_PIN, \ + BOARD_USART##n##_RX_PIN) + +class WifiSerial { + public: + uint8 wifiRxBuf[WIFI_RX_BUF_SIZE]; + + public: + WifiSerial(struct usart_dev *usart_device, uint8 tx_pin, uint8 rx_pin); + + /* Set up/tear down */ + void begin(uint32 baud); + void begin(uint32 baud,uint8_t config); + void end(); + int available(void); + int read(void); + int write(uint8_t); + inline void wifi_usart_irq(usart_reg_map *regs) { + /* Handling 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)) { + #ifdef USART_SAFE_INSERT + /* If the buffer is full and the user defines USART_SAFE_INSERT, + * ignore new bytes. */ + rb_safe_insert(this->usart_device->rb, (uint8)regs->DR); + #else + /* By default, push bytes around in the ring buffer. */ + rb_push_insert(this->usart_device->rb, (uint8)regs->DR); + #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(this->usart_device->wb)) + regs->DR=rb_remove(this->usart_device->wb); + else + regs->CR1 &= ~((uint32)USART_CR1_TXEIE); // disable TXEIE + } + } + + int wifi_rb_is_full(void); + + private: + struct usart_dev *usart_device; + uint8 tx_pin; + uint8 rx_pin; +}; + +extern WifiSerial WifiSerial1; + +#define WIFISERIAL WifiSerial1 + +#endif // USE_WIFI_FUNCTION diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp new file mode 100644 index 00000000..f5d95479 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -0,0 +1,1927 @@ +/** + * 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 "draw_ui.h" +#include "wifi_module.h" +#include "wifi_upload.h" + +#if ENABLED(USE_WIFI_FUNCTION) + +#include "../../../../MarlinCore.h" +#include "../../../../module/temperature.h" +#include "../../../../gcode/queue.h" +#include "../../../../gcode/gcode.h" +#include "../../../../lcd/ultralcd.h" +#include "../../../../sd/cardreader.h" +#include "../../../../module/planner.h" +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif +#if ENABLED(PARK_HEAD_ON_PAUSE) + #include "../../../../feature/pause.h" +#endif + +#define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); +#define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); +#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); +#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); + +extern uint8_t Explore_Disk (char* path , uint8_t recu_level); + +extern uint8_t commands_in_queue; +extern uint8_t sel_id; + +int usartFifoAvailable(SZ_USART_FIFO *fifo); +int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); +int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); +extern unsigned int getTickDiff(unsigned int curTick, unsigned int lastTick); + +volatile SZ_USART_FIFO WifiRxFifo; + +#define WAIT_ESP_TRANS_TIMEOUT_TICK 10500 + +int cfg_cloud_flag = 0; + +extern PRINT_TIME print_time; + +char wifi_firm_ver[20] = {0}; +WIFI_GCODE_BUFFER espGcodeFifo; +extern uint8_t pause_resum; + +uint8_t wifi_connect_flg = 0; +extern volatile uint8_t get_temp_flag; + + +#define WIFI_MODE 2 +#define WIFI_AP_MODE 3 + +int upload_result = 0; + +uint32_t upload_time = 0; +uint32_t upload_size = 0; + +volatile WIFI_STATE wifi_link_state; +WIFI_PARA wifiPara; +IP_PARA ipPara; +CLOUD_PARA cloud_para; + +char wifi_check_time = 0; + +extern uint8_t gCurDir[100]; + +extern uint32_t wifi_loop_cycle; + +volatile TRANSFER_STATE esp_state; + +uint8_t left_to_send = 0; +uint8_t left_to_save[96] = {0}; + +volatile WIFI_DMA_RCV_FIFO wifiDmaRcvFifo; + +volatile WIFI_TRANS_ERROR wifiTransError; + +static bool need_ok_later = false; + +extern volatile WIFI_STATE wifi_link_state; +extern WIFI_PARA wifiPara; +extern IP_PARA ipPara; +extern CLOUD_PARA cloud_para; + +extern uint8_t once_flag; +extern uint8_t flash_preview_begin; +extern uint8_t default_preview_flg; +extern uint8_t gcode_preview_over; + +extern uint8_t bmp_public_buf[17 * 1024]; + +uint32_t getWifiTick() { + return millis(); +} + +uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick) { + if (lastTick <= curTick) { + return (curTick - lastTick) * TICK_CYCLE; + } + else { + return (0xFFFFFFFF - lastTick + curTick) * TICK_CYCLE; + } +} + +void wifi_delay(int n) { + uint32_t begin = getWifiTick(); + uint32_t end = begin; + + while (getWifiTickDiff(begin, end) < (uint32_t)n) { + end = getWifiTick(); + } +} + +void wifi_reset() { + uint32_t start, now; + start = getWifiTick(); + now = start; + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) { + now = getWifiTick(); + } + WIFI_SET(); + +} + +void mount_file_sys(uint8_t disk_type) { + if (disk_type == FILE_SYS_SD) { + card.mount(); + } + else if (disk_type == FILE_SYS_USB) { + + } +} + +static void dma_init() { + #if 0 + __HAL_RCC_DMA1_CLK_ENABLE(); + + //HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); + HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 4, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); + + hdma_usart1_rx.Instance = DMA1_Channel5; + //hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; + hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart1_rx.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_usart1_rx.Init.Mode = DMA_NORMAL; + hdma_usart1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; + if (HAL_DMA_Init((DMA_HandleTypeDef *)&hdma_usart1_rx) != HAL_OK) { + Error_Handler(); + } + + + HAL_DMA_Start_IT((DMA_HandleTypeDef *)&hdma_usart1_rx, + (uint32_t)&huart1.Instance->DR, + (uint32_t)(&WifiRxFifo.uartTxBuffer[0]), + UART_RX_BUFFER_SIZE); + + //HAL_UART_Receive_DMA(&huart1,(uint8_t*)&WifiRxFifo.uartTxBuffer[0], UART_RX_BUFFER_SIZE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); + + #endif + for (uint8_t i = 0; i < TRANS_RCV_FIFO_BLOCK_NUM; i++) { + wifiDmaRcvFifo.bufferAddr[i] = &bmp_public_buf[1024 * i]; + wifiDmaRcvFifo.state[i] = udisk_buf_empty; + } + + memset(wifiDmaRcvFifo.bufferAddr[0], 0, 1024 * TRANS_RCV_FIFO_BLOCK_NUM); + wifiDmaRcvFifo.read_cur = 0; + wifiDmaRcvFifo.write_cur = 0; + +} + +static void wifi_deInit() { + #if 0 + HAL_DMA_Abort((DMA_HandleTypeDef *)&hdma_usart1_rx); + HAL_DMA_DeInit((DMA_HandleTypeDef *)&hdma_usart1_rx); + __HAL_DMA_DISABLE((DMA_HandleTypeDef *)&hdma_usart1_rx); + #endif +} + +extern uint8_t mksUsart1Rx; + +void esp_port_begin(uint8_t interrupt) { + WifiRxFifo.uart_read_point = 0; + WifiRxFifo.uart_write_point = 0; + #if 0 + NVIC_InitTypeDef NVIC_InitStructure; + + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStruct; + + WifiRxFifo.uart_read_point = 0; + WifiRxFifo.uart_write_point = 0; + memset((uint8_t*)WifiRxFifo.uartTxBuffer, 0, sizeof(WifiRxFifo.uartTxBuffer)); + + if (interrupt) { + #if TAN + wifi_deInit (); + + //SZ_STM32_COMInit(COM1, 115200); + __HAL_UART_ENABLE_IT(USART1, USART_IT_RXNE); + + USART_InitStructure.USART_BaudRate = 115200; //���ڵIJ����ʣ�����115200 ��ߴ�4.5Mbits/s + USART_InitStructure.USART_WordLength = USART_WordLength_8b; //�����ֳ���(8λ��9λ) + USART_InitStructure.USART_StopBits = USART_StopBits_1; //�����õ�ֹͣλ-֧��1��2��ֹͣλ + USART_InitStructure.USART_Parity = USART_Parity_No; //����żУ�� + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //��Ӳ�������� + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //˫��ģʽ��ʹ�ܷ��ͺͽ��� + + __HAL_RCC_USART1_CLK_ENABLE(); + + GPIO_InitStruct.Pin = TFT_WIFI_TX_Pin|TFT_WIFI_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pin = TFT_WIFI_RX_Pin; + HAL_GPIO_Init(GPIOA,&GPIO_InitStruct); + + USART_Init(USART1, &USART_InitStructure); + + NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; + // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; + // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + + NVIC_Init(&NVIC_InitStructure); + #else + HAL_UART_DeInit(&huart1); + MX_USART1_UART_Init(3); + //__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); + HAL_UART_Receive_IT(&huart1,&mksUsart1Rx,1); + #endif + } + else{ + #if 0 + NVIC_DisableIRQ(SZ_STM32_COM1_IRQn); + + USART_Cmd(SZ_STM32_COM1, DISABLE); + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); + + SZ_STM32_COMInit(COM1, 1958400); + + USART_Cmd(SZ_STM32_COM1, ENABLE); + + wifi_delay(10); + + dma_init(); + #endif + HAL_UART_DeInit(&huart1); + MX_USART1_UART_Init(5); + //dma1_5_IRQ_sel = 1; + dma_init(); + } + #endif + if (interrupt) { + #if ENABLED(USE_WIFI_FUNCTION) + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++); + WIFISERIAL.begin(WIFI_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + //for(uint8_t i=0;i<100;i++)WIFISERIAL.write(0x33); + #endif + } + else { + #if ENABLED(USE_WIFI_FUNCTION) + WIFISERIAL.end(); + for (uint16_t i = 0; i < 65535; i++); + WIFISERIAL.begin(WIFI_UPLOAD_BAUDRATE); + uint32_t serial_connect_timeout = millis() + 1000UL; + while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + //for(uint16_t i=0;i<65535;i++);//WIFISERIAL.write(0x33); + #endif + dma_init(); + } +} + +#if ENABLED(USE_WIFI_FUNCTION) + +int raw_send_to_wifi(char *buf, int len) { + if (buf == 0 || len <= 0) return 0; + + for (int i = 0; i < len; i++) + WIFISERIAL.write(*(buf + i)); + + return len; +} + +#endif // USE_WIFI_FUNCTION + +void wifi_ret_ack() {} + +char buf_to_wifi[256]; +int index_to_wifi = 0; +int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len) { + char wifi_ret_head = 0xA5; + char wifi_ret_tail = 0xFC; + + if (type == WIFI_PARA_SET) { + int data_offset = 4; + int apLen = strlen((const char *)uiCfg.wifi_name); + int keyLen = strlen((const char *)uiCfg.wifi_key); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + + buf_to_wifi[data_offset] = gCfgItems.wifi_mode_sel; + buf_to_wifi[data_offset + 1] = apLen; + strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.wifi_name, apLen); + buf_to_wifi[data_offset + apLen + 2] = keyLen; + strncpy(&buf_to_wifi[data_offset + apLen + 3], (const char *)uiCfg.wifi_key, keyLen); + buf_to_wifi[data_offset + apLen + keyLen + 3] = wifi_ret_tail; + + index_to_wifi = apLen + keyLen + 3; + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = index_to_wifi & 0xFF; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; + + raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + + } + else if (type == WIFI_TRANS_INF) { + if (len > (int)(sizeof(buf_to_wifi) - index_to_wifi - 5)) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + return 0; + } + + if (len > 0) { + memcpy(&buf_to_wifi[4 + index_to_wifi], buf, len); + index_to_wifi += len; + + if (index_to_wifi < 1) + return 0; + + if (buf_to_wifi[index_to_wifi + 3] == '\n') { + //mask "wait" "busy" "X:" + if (((buf_to_wifi[4] == 'w') && (buf_to_wifi[5] == 'a') && (buf_to_wifi[6] == 'i') && (buf_to_wifi[7] == 't') ) + || ((buf_to_wifi[4] == 'b') && (buf_to_wifi[5] == 'u') && (buf_to_wifi[6] == 's') && (buf_to_wifi[7] == 'y') ) + || ((buf_to_wifi[4] == 'X') && (buf_to_wifi[5] == ':') ) + ) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + return 0; + } + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = index_to_wifi & 0xFF; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; + buf_to_wifi[4 + index_to_wifi] = wifi_ret_tail; + + raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } + } + } + else if (type == WIFI_EXCEP_INF) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = 1; + buf_to_wifi[3] = 0; + buf_to_wifi[4] = *buf; + buf_to_wifi[5] = wifi_ret_tail; + + raw_send_to_wifi(buf_to_wifi, 6); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } + else if (type == WIFI_CLOUD_CFG) { + int data_offset = 4; + int urlLen = strlen((const char *)uiCfg.cloud_hostUrl); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + + if (gCfgItems.cloud_enable == true) + buf_to_wifi[data_offset] = 0x0A; + else + buf_to_wifi[data_offset] = 0x05; + + buf_to_wifi[data_offset + 1] = urlLen; + strncpy(&buf_to_wifi[data_offset + 2], (const char *)uiCfg.cloud_hostUrl, urlLen); + buf_to_wifi[data_offset + urlLen + 2] = uiCfg.cloud_port & 0xFF; + buf_to_wifi[data_offset + urlLen + 3] = (uiCfg.cloud_port >> 8) & 0xFF; + buf_to_wifi[data_offset + urlLen + 4] = wifi_ret_tail; + + index_to_wifi = urlLen + 4; + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = index_to_wifi & 0xFF; + buf_to_wifi[3] = (index_to_wifi >> 8) & 0xFF; + + raw_send_to_wifi(buf_to_wifi, 5 + index_to_wifi); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } + else if (type == WIFI_CLOUD_UNBIND) { + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + + buf_to_wifi[0] = wifi_ret_head; + buf_to_wifi[1] = type; + buf_to_wifi[2] = 0; + buf_to_wifi[3] = 0; + buf_to_wifi[4] = wifi_ret_tail; + + raw_send_to_wifi(buf_to_wifi, 5); + + memset(buf_to_wifi, 0, sizeof(buf_to_wifi)); + index_to_wifi = 0; + } +} + + +int send_to_wifi(char *buf, int len) { return package_to_wifi(WIFI_TRANS_INF, buf, len); } + +void set_cur_file_sys(int fileType) { + gCfgItems.fileSysType = fileType; +} + +void get_file_list(char *path) { + if ( path == 0) { + return; + } + + if (gCfgItems.fileSysType == FILE_SYS_SD) { + #if ENABLED(SDSUPPORT) + card.mount(); + #endif + } + else if (gCfgItems.fileSysType == FILE_SYS_USB) { + //udisk + } + Explore_Disk(path, 0); +} + +char wait_ip_back_flag = 0; + +typedef struct { + char write_buf[513]; + int write_index; + uint8_t saveFileName[30]; + uint32_t fileLen; + uint32_t tick_begin; + uint32_t tick_end; +} FILE_WRITER; + +FILE_WRITER file_writer; + +int32_t lastFragment = 0; + +char lastBinaryCmd[50] = {0}; + +int total_write = 0; +char binary_head[2] = {0, 0}; +unsigned char binary_data_len = 0; + +int write_to_file(char *buf, int len) { + int i; + int res; + + for (i = 0; i < len; i++) { + file_writer.write_buf[file_writer.write_index++] = buf[i]; + if (file_writer.write_index >= 512) { + res = card.write(file_writer.write_buf, file_writer.write_index); + if (res == -1) { + return -1; + } + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + } + } + return 0; +} + +#define ESP_PROTOC_HEAD (uint8_t)0xA5 +#define ESP_PROTOC_TAIL (uint8_t)0xFC + +#define ESP_TYPE_NET (uint8_t)0x0 +#define ESP_TYPE_GCODE (uint8_t)0x1 +#define ESP_TYPE_FILE_FIRST (uint8_t)0x2 +#define ESP_TYPE_FILE_FRAGMENT (uint8_t)0x3 + +#define ESP_TYPE_WIFI_LIST (uint8_t)0x4 + +uint8_t esp_msg_buf[UART_RX_BUFFER_SIZE] = {0}; +uint16_t esp_msg_index = 0; + +typedef struct { + uint8_t head; + uint8_t type; + uint16_t dataLen; + uint8_t *data; + uint8_t tail; +} ESP_PROTOC_FRAME; + + +static int cut_msg_head(uint8_t *msg, uint16_t msgLen, uint16_t cutLen) { + if (msgLen < cutLen) return 0; + + else if (msgLen == cutLen) { + memset(msg, 0, msgLen); + return 0; + } + + for (int i = 0; i < (msgLen - cutLen); i++) + msg[i] = msg[cutLen + i]; + + memset(&msg[msgLen - cutLen], 0, cutLen); + + return msgLen - cutLen; +} + + +uint8_t Explore_Disk (char* path , uint8_t recu_level) { + char tmp[200]; + char Fstream[200]; + + if (path == 0)return 0; + + const uint8_t fileCnt = card.get_num_Files(); + + for (uint8_t i = 0; i < fileCnt; i++) { + const uint16_t nr = + #if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA) + fileCnt - 1 - + #endif + i; + + #if ENABLED(SDCARD_SORT_ALPHA) + card.getfilename_sorted(nr); + #else + card.getfilename_sorted(nr); + #endif + memset(tmp, 0, sizeof(tmp)); + //if (card.longFilename[0] == 0) + strcpy(tmp, card.filename); + //else + //strcpy(tmp, card.longFilename); + + memset(Fstream, 0, sizeof(Fstream)); + strcpy(Fstream, tmp); + + if (card.flag.filenameIsDir && (recu_level <= 10)) { + strcat(Fstream, ".DIR\r\n"); + send_to_wifi(Fstream, strlen(Fstream)); + } + else { + strcat(Fstream, "\r\n"); + send_to_wifi(Fstream, strlen(Fstream)); + } + } + + return fileCnt; +} + +static void wifi_gcode_exec(uint8_t *cmd_line) { + int8_t tempBuf[100] = {0}; + uint8_t *tmpStr = 0; + int cmd_value; + volatile int print_rate; + if ((strstr((char *)&cmd_line[0], "\n") != 0) && ((strstr((char *)&cmd_line[0], "G") != 0) || (strstr((char *)&cmd_line[0], "M") != 0) || (strstr((char *)&cmd_line[0], "T") != 0) )) { + + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\n"); + if (tmpStr) { + *tmpStr = '\0'; + } + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "\r"); + if (tmpStr) { + *tmpStr = '\0'; + } + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "*"); + if (tmpStr) { + *tmpStr = '\0'; + } + tmpStr = (uint8_t *)strstr((char *)&cmd_line[0], "M"); + if ( tmpStr) { + cmd_value = atoi((char *)(tmpStr + 1)); + tmpStr = (uint8_t *)strstr((char *)tmpStr, " "); + + switch (cmd_value) { + + case 20: //print sd / udisk file + if (uiCfg.print_state == IDLE) { + int index = 0; + + if (tmpStr == 0) { + gCfgItems.fileSysType = FILE_SYS_SD; + send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); + + get_file_list((char *)"0:/"); + + send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); + + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + break; + } + + while (tmpStr[index] == ' ') + index++; + + if (gCfgItems.wifi_type == ESP_WIFI) { + char *path = (char *)tempBuf; + + if (strlen((char *)&tmpStr[index]) < 80) { + send_to_wifi((char *)"Begin file list\r\n", strlen("Begin file list\r\n")); + + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_SD; + + } + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_USB; + } + strcpy((char *)path, (char *)&tmpStr[index]); + get_file_list(path); + send_to_wifi((char *)"End file list\r\n", strlen("End file list\r\n")); + } + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + } + break; + + case 21: + /*init sd card*/ + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + break; + + case 23: + /*select the file*/ + if (uiCfg.print_state == IDLE) { + int index = 0; + while (tmpStr[index] == ' ') + index++; + + if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { + if (strlen((char *)&tmpStr[index]) < 80) { + memset(list_file.file_name[sel_id], 0, sizeof(list_file.file_name[sel_id])); + + if (gCfgItems.wifi_type == ESP_WIFI) { + if (strncmp((char *)&tmpStr[index], "1:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_SD; + + } + else if (strncmp((char *)&tmpStr[index], "0:", 2) == 0) { + gCfgItems.fileSysType = FILE_SYS_USB; + } + else { + if (tmpStr[index] != '/') + strcat((char *)list_file.file_name[0], "/"); + } + strcat((char *)list_file.file_name[sel_id], (char *)&tmpStr[index]); + + } + else { + strcpy(list_file.file_name[sel_id], (char *)&tmpStr[index]); + } + + char *cur_name=strrchr(list_file.file_name[sel_id],'/'); + + card.openFileRead(cur_name); + + if (card.isFileOpen()) { + send_to_wifi((char *)"File selected\r\n", strlen("File selected\r\n")); + + } + else { + send_to_wifi((char *)"file.open failed\r\n", strlen("file.open failed\r\n")); + strcpy(list_file.file_name[sel_id], "notValid"); + } + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + + } + + + } + } + break; + + case 24: + if (strcmp(list_file.file_name[sel_id], "notValid") != 0) { + if (uiCfg.print_state == IDLE) { + clear_cur_ui(); + reset_print_time(); + start_print_time(); + preview_gcode_prehandle(list_file.file_name[sel_id]); + uiCfg.print_state = WORKING; + lv_draw_printing(); + + if (gcode_preview_over != 1) { + #if ENABLED(SDSUPPORT) + 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(); + #if ENABLED(POWER_LOSS_RECOVERY) + recovery.prepare(); + #endif + once_flag = 0; + } + #endif + + } + } + else if (uiCfg.print_state == PAUSED) { + uiCfg.print_state = RESUMING; + clear_cur_ui(); + start_print_time(); + + if (gCfgItems.from_flash_pic==1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + lv_draw_printing(); + } + else if (uiCfg.print_state == REPRINTING) { + uiCfg.print_state = REPRINTED; + clear_cur_ui(); + start_print_time(); + if (gCfgItems.from_flash_pic==1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + lv_draw_printing(); + } + } + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + break; + + case 25: + /*pause print file*/ + if (uiCfg.print_state == WORKING) { + stop_print_time(); + + clear_cur_ui(); + + #if ENABLED(SDSUPPORT) + card.pauseSDPrint(); + uiCfg.print_state = PAUSING; + #endif + if (gCfgItems.from_flash_pic==1) + flash_preview_begin = 1; + else + default_preview_flg = 1; + lv_draw_printing(); + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + break; + + case 26: + /*stop print file*/ + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED) || (uiCfg.print_state == REPRINTING)) { + stop_print_time(); + + clear_cur_ui(); + #if ENABLED(SDSUPPORT) + uiCfg.print_state = IDLE; + card.flag.abort_sd_printing = true; + #endif + + lv_draw_ready_print(); + + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + break; + + case 27: + /*report print rate*/ + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)|| (uiCfg.print_state == REPRINTING)) { + print_rate = uiCfg.totalSend; + + memset((char *)tempBuf, 0, sizeof(tempBuf)); + + sprintf((char *)tempBuf, "M27 %d\r\n", print_rate); + + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + + } + + break; + + case 28: + /*begin to transfer file to filesys*/ + if (uiCfg.print_state == IDLE) { + + int index = 0; + while (tmpStr[index] == ' ') + index++; + + if (strstr((char *)&tmpStr[index], ".g") || strstr((char *)&tmpStr[index], ".G")) { + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + + if (gCfgItems.fileSysType == FILE_SYS_SD) { + memset(tempBuf, 0, sizeof(tempBuf)); + sprintf((char *)tempBuf, "%s", file_writer.saveFileName); + } + else if (gCfgItems.fileSysType == FILE_SYS_USB) { + memset(tempBuf, 0, sizeof(tempBuf)); + sprintf((char *)tempBuf, "%s", (char *)file_writer.saveFileName); + } + mount_file_sys(gCfgItems.fileSysType); + + #if ENABLED(SDSUPPORT) + char *cur_name=strrchr(list_file.file_name[sel_id],'/'); + card.openFileWrite(cur_name); + if (card.isFileOpen()) { + memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); + strcpy((char *)file_writer.saveFileName, (char *)&tmpStr[index]); + memset(tempBuf, 0, sizeof(tempBuf)); + sprintf((char *)tempBuf, "Writing to file: %s\r\n", (char *)file_writer.saveFileName); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + + total_write = 0; + wifi_link_state = WIFI_WAIT_TRANS_START; + + } + else{ + wifi_link_state = WIFI_CONNECTED; + clear_cur_ui(); + lv_draw_dialog(DIALOG_TRANSFER_NO_DEVICE); + } + #endif + + } + + } + break; + case 105: + case 991: + memset(tempBuf, 0, sizeof(tempBuf)); + if (cmd_value == 105) { + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + sprintf((char *)tempBuf,"T:%.1f /%.1f B:%.1f /%.1f T0:%.1f /%.1f T1:%.1f /%.1f @:0 B@:0\r\n", + + (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, + #if HAS_HEATED_BED + (float)thermalManager.temp_bed.celsius,(float)thermalManager.temp_bed.target, + #else + (float)0,(float)0, + #endif + (float)thermalManager.temp_hotend[0].celsius,(float)thermalManager.temp_hotend[0].target, + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + (float)thermalManager.temp_hotend[1].celsius,(float)thermalManager.temp_hotend[1].target + #else + (float)0,(float)0 + #endif + ); + } + else { + sprintf((char *)tempBuf,"T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n", + + (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, + #if HAS_HEATED_BED + (int)thermalManager.temp_bed.celsius,(int)thermalManager.temp_bed.target, + #else + 0,0, + #endif + (int)thermalManager.temp_hotend[0].celsius,(int)thermalManager.temp_hotend[0].target, + #if !defined(SINGLENOZZLE) && HAS_MULTI_EXTRUDER + (int)thermalManager.temp_hotend[1].celsius,(int)thermalManager.temp_hotend[1].target + #else + 0,0 + #endif + ); + } + + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + + queue.enqueue_one_P(PSTR("M105")); + + break; + case 992: + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { + memset(tempBuf,0,sizeof(tempBuf)); + sprintf((char *)tempBuf, "M992 %d%d:%d%d:%d%d\r\n", print_time.hours/10, print_time.hours%10, print_time.minutes/10, print_time.minutes%10, print_time.seconds/10, print_time.seconds%10); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + } + + break; + case 994: + if ((uiCfg.print_state == WORKING) || (uiCfg.print_state == PAUSED)) { + memset(tempBuf,0,sizeof(tempBuf)); + if (strlen((char *)list_file.file_name[sel_id]) > (100-1)) { + return; + } + sprintf((char *)tempBuf, "M994 %s;%d\n", list_file.file_name[sel_id],(int)gCfgItems.curFilesize); + wifi_ret_ack(); + send_to_wifi((char *)tempBuf, strlen((char *)tempBuf)); + } + break; + case 997: + if (uiCfg.print_state == IDLE) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 IDLE\r\n", strlen("M997 IDLE\r\n")); + } + else if (uiCfg.print_state == WORKING) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 PRINTING\r\n", strlen("M997 PRINTING\r\n")); + } + else if (uiCfg.print_state == PAUSED) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + } + else if (uiCfg.print_state == REPRINTING) { + wifi_ret_ack(); + send_to_wifi((char *)"M997 PAUSE\r\n", strlen("M997 PAUSE\r\n")); + } + if (uiCfg.command_send == 0) get_wifi_list_command_send(); + break; + + case 998: + if (uiCfg.print_state == IDLE) { + if (atoi((char *)tmpStr) == 0) { + set_cur_file_sys(0); + } + else if (atoi((char *)tmpStr) == 1) { + set_cur_file_sys(1); + } + wifi_ret_ack(); + } + break; + + case 115: + memset(tempBuf,0,sizeof(tempBuf)); + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + send_to_wifi((char *)"FIRMWARE_NAME:Robin_nano\r\n", strlen("FIRMWARE_NAME:Robin_nano\r\n")); + break; + + default: + strcat((char *)cmd_line, "\n"); + + uint32_t left; + + if (espGcodeFifo.wait_tick> 5) { + + if (espGcodeFifo.r > espGcodeFifo.w) + left = espGcodeFifo.r - espGcodeFifo.w - 1; + else + left = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; + if (left >= strlen((const char *)cmd_line)) { + uint32_t index = 0; + while (index < strlen((const char *)cmd_line)) { + espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; + espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; + index++; + } + if (left - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + else + need_ok_later = true; + + } + + } + break; + + } + } + else{ + strcat((char *)cmd_line, "\n"); + uint32_t left_g; + + if (espGcodeFifo.wait_tick > 5) { + + if (espGcodeFifo.r > espGcodeFifo.w) + left_g = espGcodeFifo.r - espGcodeFifo.w - 1; + else + left_g = WIFI_GCODE_BUFFER_SIZE + espGcodeFifo.r - espGcodeFifo.w - 1; + if (left_g >= strlen((const char *)cmd_line)) { + uint32_t index = 0; + while (index < strlen((const char *)cmd_line)) { + espGcodeFifo.Buffer[espGcodeFifo.w] = cmd_line[index] ; + espGcodeFifo.w = (espGcodeFifo.w + 1) % WIFI_GCODE_BUFFER_SIZE; + index++; + } + if (left_g - WIFI_GCODE_BUFFER_LEAST_SIZE >= strlen((const char *)cmd_line)) + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + else + need_ok_later = true; + + } + } + } + } +} + +static int32_t charAtArray(const uint8_t *_array, uint32_t _arrayLen, uint8_t _char) { + for (uint32_t i = 0; i < _arrayLen; i++) + if (*(_array + i) == _char) return i; + return -1; +} + +void get_wifi_list_command_send() { + char buf[6] = {0}; + buf[0] = 0xA5; + buf[1] = 0x07; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0xFC; + raw_send_to_wifi(buf, 5); +} + +static void net_msg_handle(uint8_t * msg, uint16_t msgLen) { + int wifiNameLen, wifiKeyLen, hostLen, id_len, ver_len; + + if (msgLen <= 0) return; + //ip + sprintf(ipPara.ip_addr, "%d.%d.%d.%d", msg[0], msg[1], msg[2], msg[3]); + + //port + //connect state + if (msg[6] == 0x0A) + wifi_link_state = WIFI_CONNECTED; + else if (msg[6] == 0x0E) + wifi_link_state = WIFI_EXCEPTION; + else + wifi_link_state = WIFI_NOT_CONFIG; + + //mode + wifiPara.mode = msg[7]; + + + //wifi name + wifiNameLen = msg[8]; + wifiKeyLen = msg[9 + wifiNameLen]; + if (wifiNameLen < 32) { + memset(wifiPara.ap_name, 0, sizeof(wifiPara.ap_name)); + memcpy(wifiPara.ap_name, &msg[9], wifiNameLen); + + memset(&wifi_list.wifiConnectedName,0,sizeof(wifi_list.wifiConnectedName)); + memcpy(&wifi_list.wifiConnectedName,&msg[9],wifiNameLen); + + //wifi key + if (wifiKeyLen < 64) { + memset(wifiPara.keyCode, 0, sizeof(wifiPara.keyCode)); + memcpy(wifiPara.keyCode, &msg[10 + wifiNameLen], wifiKeyLen); + } + } + + + cloud_para.state =msg[10 + wifiNameLen + wifiKeyLen]; + hostLen = msg[11 + wifiNameLen + wifiKeyLen]; + if (cloud_para.state) { + if (hostLen < 96) { + memset(cloud_para.hostUrl, 0, sizeof(cloud_para.hostUrl)); + memcpy(cloud_para.hostUrl, &msg[12 + wifiNameLen + wifiKeyLen], hostLen); + } + cloud_para.port = msg[12 + wifiNameLen + wifiKeyLen + hostLen] + (msg[13 + wifiNameLen + wifiKeyLen + hostLen] << 8); + + } + + // id + id_len = msg[14 + wifiNameLen + wifiKeyLen + hostLen]; + if (id_len == 20) { + memset(cloud_para.id, 0, sizeof(cloud_para.id)); + memcpy(cloud_para.id, (const char *)&msg[15 + wifiNameLen + wifiKeyLen + hostLen], id_len); + } + ver_len = msg[15 + wifiNameLen + wifiKeyLen + hostLen + id_len]; + if (ver_len < 20) { + memset(wifi_firm_ver, 0, sizeof(wifi_firm_ver)); + memcpy(wifi_firm_ver, (const char *)&msg[16 + wifiNameLen + wifiKeyLen + hostLen + id_len], ver_len); + } + + if (uiCfg.configWifi == 1) { + if ((wifiPara.mode != gCfgItems.wifi_mode_sel) + || (strncmp(wifiPara.ap_name, (const char *)uiCfg.wifi_name, 32) != 0) + || (strncmp(wifiPara.keyCode, (const char *)uiCfg.wifi_key, 64) != 0)) { + package_to_wifi(WIFI_PARA_SET, (char *)0, 0); + } + else uiCfg.configWifi = 0; + } + if (cfg_cloud_flag == 1) { + if (((cloud_para.state >> 4) != (char)gCfgItems.cloud_enable) + || (strncmp(cloud_para.hostUrl, (const char *)uiCfg.cloud_hostUrl, 96) != 0) + || (cloud_para.port != uiCfg.cloud_port)) { + package_to_wifi(WIFI_CLOUD_CFG, (char *)0, 0); + } + else cfg_cloud_flag = 0; + } +} + +static void wifi_list_msg_handle(uint8_t * msg, uint16_t msgLen) { + int wifiNameLen,wifiMsgIdex=1; + int8_t wifi_name_is_same=0; + int8_t i,j; + int8_t wifi_name_num=0; + uint8_t *str=0; + int8_t valid_name_num; + + if (msgLen <= 0) + return; + if (disp_state == KEY_BOARD_UI) + return; + + wifi_list.getNameNum = msg[0]; + + if (wifi_list.getNameNum < 20) { + uiCfg.command_send = 1; + + memset(wifi_list.wifiName,0,sizeof(wifi_list.wifiName)); + + wifi_name_num = wifi_list.getNameNum; + + valid_name_num=0; + str = wifi_list.wifiName[valid_name_num]; + + if (wifi_list.getNameNum > 0) wifi_list.currentWifipage = 1; + + for (i = 0; i 0x80) { + wifi_name_is_same = 1; + //break; + } + //} + } + if (wifi_name_is_same == 1) { + wifi_name_is_same = 0; + wifiMsgIdex += wifiNameLen; + //wifi_list.RSSI[i] = msg[wifiMsgIdex]; + wifiMsgIdex += 1; + wifi_name_num--; + //i--; + continue; + } + if (i < WIFI_TOTAL_NUMBER-1) { + str = wifi_list.wifiName[++valid_name_num]; + } + } + wifiMsgIdex += wifiNameLen; + wifi_list.RSSI[i] = msg[wifiMsgIdex]; + wifiMsgIdex += 1; + } + wifi_list.getNameNum = wifi_name_num; + if (wifi_list.getNameNum % NUMBER_OF_PAGE == 0) { + wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE; + } + else { + wifi_list.getPage = wifi_list.getNameNum/NUMBER_OF_PAGE + 1; + } + wifi_list.nameIndex = 0; + if (disp_state == WIFI_LIST_UI) + disp_wifi_list(); + } +} + +static void gcode_msg_handle(uint8_t * msg, uint16_t msgLen) { + uint8_t gcodeBuf[100] = {0}; + char *index_s; + char *index_e; + + if (msgLen <= 0) + return; + + index_s = (char *)msg; + index_e = (char *)strstr((char *)msg, "\n"); + if (*msg == 'N') { + index_s = (char *)strstr((char *)msg, " "); + while ((*index_s) == ' ') { + index_s++; + } + } + while ((index_e != 0) && ((int)index_s < (int)index_e)) { + if ((int)(index_e - index_s) < (int)sizeof(gcodeBuf)) { + memset(gcodeBuf, 0, sizeof(gcodeBuf)); + + memcpy(gcodeBuf, index_s, index_e - index_s + 1); + + wifi_gcode_exec(gcodeBuf); + } + while ((*index_e == '\r') || (*index_e == '\n')) + index_e++; + + index_s = index_e; + index_e = (char *)strstr(index_s, "\n"); + } +} + +void utf8_2_unicode(uint8_t *source,uint8_t Len) { + uint8_t i=0,char_i=0,char_byte_num=0; + uint16_t u16_h,u16_m,u16_l,u16_value; + uint8_t FileName_unicode[30]; + + memset(FileName_unicode, 0, sizeof(FileName_unicode)); + + while (1) { + char_byte_num = source[i] & 0xF0; + if (source[i] < 0X80) { + //ASCII --1byte + FileName_unicode[char_i] = source[i]; + i += 1; + char_i += 1; + } + else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { + //--2byte + + u16_h = (((uint16_t)source[i] <<8) & 0x1F00) >> 2; + u16_l = ((uint16_t)source[i+1] & 0x003F); + u16_value = (u16_h | u16_l); + FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); + FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); + i += 2; + char_i += 2; + } + else if (char_byte_num == 0XE0) { + //--3byte + u16_h = (((uint16_t)source[i] <<8 ) & 0x0F00) << 4; + u16_m = (((uint16_t)source[i+1] << 8) & 0x3F00) >> 2; + u16_l = ((uint16_t)source[i+2] & 0x003F); + u16_value = (u16_h | u16_m | u16_l); + FileName_unicode[char_i] = (uint8_t)((u16_value & 0xFF00) >> 8); + FileName_unicode[char_i + 1] = (uint8_t)(u16_value & 0x00FF); + i += 3; + char_i += 2; + } + else if (char_byte_num == 0XF0) { + //--4byte + i += 4; + //char_i += 3; + } + else { + break; + } + if (i >= Len || i >= 255)break; + } + memcpy(source, FileName_unicode, sizeof(FileName_unicode)); +} + +char saveFilePath[50]; + +static bool longName2DosName(const char* longName, uint8_t* dosName) { + uint8_t i = 11; + while (i--) dosName[i] = '\0'; + while (*longName) { + uint8_t c = *longName++; + if (c == '.') { // For a dot... + if (i == 0) return false; + else { strcat((char *)dosName,".GCO"); return dosName[0] != '\0'; } + } + else { + // Fail for illegal characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; + if (c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + dosName[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name + } + if (i >= 5) strcat((char *)dosName,"~1.GCO"); + } + return dosName[0] != '\0'; // Return true if any name was set +} + +static void file_first_msg_handle(uint8_t * msg, uint16_t msgLen) { + uint8_t fileNameLen = *msg; + + if (msgLen != fileNameLen + 5) return; + + file_writer.fileLen = *((uint32_t *)(msg + 1)); + memset(file_writer.saveFileName, 0, sizeof(file_writer.saveFileName)); + + memcpy(file_writer.saveFileName, msg + 5, fileNameLen); + + utf8_2_unicode(file_writer.saveFileName,fileNameLen); + + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + + if (strlen((const char *)file_writer.saveFileName) > sizeof(saveFilePath)) + return; + + memset(saveFilePath, 0, sizeof(saveFilePath)); + + if (gCfgItems.fileSysType == FILE_SYS_SD) { + //sprintf((char *)saveFilePath, "/%s", file_writer.saveFileName); + card.mount(); + + //ZERO(list_file.long_name[sel_id]); + //memcpy(list_file.long_name[sel_id],file_writer.saveFileName,sizeof(list_file.long_name[sel_id])); + } + else if (gCfgItems.fileSysType == FILE_SYS_USB) { + + } + file_writer.write_index = 0; + lastFragment = -1; + + wifiTransError.flag = 0; + wifiTransError.start_tick = 0; + wifiTransError.now_tick = 0; + + TERN_(SDSUPPORT, card.closefile()); + + wifi_delay(1000); + + #if ENABLED(SDSUPPORT) + + uint8_t dosName[FILENAME_LENGTH]; + + if (!longName2DosName((const char *)file_writer.saveFileName,dosName)) { + clear_cur_ui(); + upload_result = 2; + wifiTransError.flag = 1; + wifiTransError.start_tick = getWifiTick(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + return; + } + sprintf((char *)saveFilePath, "/%s", dosName); + + ZERO(list_file.long_name[sel_id]); + memcpy(list_file.long_name[sel_id],dosName,sizeof(dosName)); + + char *cur_name=strrchr((const char *)saveFilePath,'/'); + + 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_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { + gCfgItems.curFilesize = file.fileSize(); + } + else { + clear_cur_ui(); + upload_result = 2; + wifiTransError.flag = 1; + wifiTransError.start_tick = getWifiTick(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + return; + } + #endif + + wifi_link_state = WIFI_TRANS_FILE; + + upload_result = 1; + + clear_cur_ui(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + + lv_task_handler(); + + file_writer.tick_begin = getWifiTick(); +} + +#define FRAG_MASK _BV32(31) + +static void file_fragment_msg_handle(uint8_t * msg, uint16_t msgLen) { + uint32_t frag = *((uint32_t *)msg); + + if ((frag & FRAG_MASK) != (uint32_t)(lastFragment + 1)) { + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + } + else { + if (write_to_file((char *)msg + 4, msgLen - 4) < 0) { + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + return; + } + lastFragment = frag; + + if ((frag & (~FRAG_MASK))) { + int res = card.write(file_writer.write_buf, file_writer.write_index); + if (res == -1) { + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + return; + } + memset(file_writer.write_buf, 0, sizeof(file_writer.write_buf)); + file_writer.write_index = 0; + file_writer.tick_end = getWifiTick(); + upload_time = getWifiTickDiff(file_writer.tick_begin, file_writer.tick_end) / 1000; + upload_size = gCfgItems.curFilesize; + wifi_link_state = WIFI_CONNECTED; + upload_result = 3; + } + + } +} + +void esp_data_parser(char *cmdRxBuf, int len) { + int32_t head_pos; + int32_t tail_pos; + uint16_t cpyLen; + int16_t leftLen = len; + bool loop_again = false; + + ESP_PROTOC_FRAME esp_frame; + + while (leftLen > 0 || loop_again) { + loop_again = false; + + if (esp_msg_index != 0) { + head_pos = 0; + cpyLen = (leftLen < (int16_t)((sizeof(esp_msg_buf) - esp_msg_index)) ? leftLen : sizeof(esp_msg_buf) - esp_msg_index); + + memcpy(&esp_msg_buf[esp_msg_index], cmdRxBuf + len - leftLen, cpyLen); + + esp_msg_index += cpyLen; + + leftLen = leftLen - cpyLen; + tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); + + if (tail_pos == -1) { + if (esp_msg_index >= sizeof(esp_msg_buf)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + } + return; + } + } + else { + head_pos = charAtArray((uint8_t const *)&cmdRxBuf[len - leftLen], leftLen, ESP_PROTOC_HEAD); + if (head_pos == -1) return; + + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + memcpy(esp_msg_buf, &cmdRxBuf[len - leftLen + head_pos], leftLen - head_pos); + + esp_msg_index = leftLen - head_pos; + + leftLen = 0; + head_pos = 0; + tail_pos = charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL); + if (tail_pos == -1) { + if (esp_msg_index >= sizeof(esp_msg_buf)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + } + return; + } + } + + esp_frame.type = esp_msg_buf[1]; + if ((esp_frame.type != ESP_TYPE_NET) && (esp_frame.type != ESP_TYPE_GCODE) + && (esp_frame.type != ESP_TYPE_FILE_FIRST) && (esp_frame.type != ESP_TYPE_FILE_FRAGMENT) + &&(esp_frame.type != ESP_TYPE_WIFI_LIST)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + return; + } + + esp_frame.dataLen = esp_msg_buf[2] + (esp_msg_buf[3] << 8); + + if ((int)(4 + esp_frame.dataLen) > (int)(sizeof(esp_msg_buf))) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + return; + } + + if (esp_msg_buf[4 + esp_frame.dataLen] != ESP_PROTOC_TAIL) { + if (esp_msg_index >= sizeof(esp_msg_buf)) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + } + return; + } + + esp_frame.data = &esp_msg_buf[4]; + switch (esp_frame.type) { + case ESP_TYPE_NET: + net_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_GCODE: + gcode_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_FILE_FIRST: + file_first_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_FILE_FRAGMENT: + file_fragment_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + case ESP_TYPE_WIFI_LIST: + wifi_list_msg_handle(esp_frame.data, esp_frame.dataLen); + break; + default: break; + } + + esp_msg_index = cut_msg_head(esp_msg_buf, esp_msg_index, esp_frame.dataLen + 5); + if (esp_msg_index > 0) { + if (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) == -1) { + memset(esp_msg_buf, 0, sizeof(esp_msg_buf)); + esp_msg_index = 0; + return; + } + + if ((charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_HEAD) != -1) && (charAtArray(esp_msg_buf, esp_msg_index, ESP_PROTOC_TAIL) != -1)) + loop_again = true; + } + } +} + +int32_t tick_net_time1, tick_net_time2; + +int storeRcvData(int32_t len) { + unsigned char tmpW = wifiDmaRcvFifo.write_cur; + if (len <= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpW] == udisk_buf_empty) { + for (uint16_t i = 0; i < len; i++) + wifiDmaRcvFifo.bufferAddr[tmpW][i] = WIFISERIAL.read(); + wifiDmaRcvFifo.state[tmpW] = udisk_buf_full; + wifiDmaRcvFifo.write_cur = (tmpW + 1) % TRANS_RCV_FIFO_BLOCK_NUM; + return 1; + } + return 0; +} + +int32_t readWifiFifo(uint8_t *retBuf, uint32_t bufLen) { + unsigned char tmpR = wifiDmaRcvFifo.read_cur; + if (bufLen >= UDISKBUFLEN && wifiDmaRcvFifo.state[tmpR] == udisk_buf_full) { + memcpy(retBuf, (unsigned char *)wifiDmaRcvFifo.bufferAddr[tmpR], UDISKBUFLEN); + wifiDmaRcvFifo.state[tmpR] = udisk_buf_empty; + wifiDmaRcvFifo.read_cur = (tmpR + 1) % TRANS_RCV_FIFO_BLOCK_NUM; + return UDISKBUFLEN; + } + return 0; +} + +void stopEspTransfer() { + if (wifi_link_state == WIFI_TRANS_FILE) + wifi_link_state = WIFI_CONNECTED; + + TERN_(SDSUPPORT, card.closefile()); + + if (upload_result != 3) { + wifiTransError.flag = 1; + wifiTransError.start_tick = getWifiTick(); + card.removeFile((const char *)saveFilePath); + } + else { + } + wifi_delay(200); + WIFI_IO1_SET(); + //exchangeFlashMode(1); //change spi flash to use dma mode + esp_port_begin(1); + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); +} + +void wifi_rcv_handle() { + int32_t len = 0; + uint8_t ucStr[(UART_RX_BUFFER_SIZE) + 1] = {0}; + int8_t getDataF = 0; + + if (wifi_link_state == WIFI_TRANS_FILE) { + #if 0 + if (WIFISERIAL.available() == UART_RX_BUFFER_SIZE) { + for (uint16_t i=0;i 0) { + esp_data_parser((char *)ucStr, len); + if (wifi_link_state == WIFI_CONNECTED) { + clear_cur_ui(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + stopEspTransfer(); + } + getDataF = 1; + } + if (esp_state == TRANSFER_STORE) { + if (storeRcvData(UART_RX_BUFFER_SIZE)) { + esp_state = TRANSFERING; + //esp_dma_pre(); + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); + } + else + WIFI_IO1_SET(); + } + } + else { + //len = readUsartFifo((SZ_USART_FIFO *)&WifiRxFifo, (int8_t *)ucStr, UART_RX_BUFFER_SIZE); + len = readWifiBuf((int8_t *)ucStr, UART_RX_BUFFER_SIZE); + if (len > 0) { + esp_data_parser((char *)ucStr, len); + + if (wifi_link_state == WIFI_TRANS_FILE) { + //exchangeFlashMode(0); //change spi flash not use dma mode + wifi_delay(10); + esp_port_begin(0); + wifi_delay(10); + tick_net_time1 = 0; + } + if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); + getDataF = 1; + } + if (need_ok_later && (queue.length < BUFSIZE)) { + need_ok_later = false; + send_to_wifi((char *)"ok\r\n", strlen("ok\r\n")); + } + } + + if (getDataF == 1) { + tick_net_time1 = getWifiTick(); + } + else { + tick_net_time2 = getWifiTick(); + + if (wifi_link_state == WIFI_TRANS_FILE) { + if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 4500)) { + wifi_link_state = WIFI_CONNECTED; + upload_result = 2; + clear_cur_ui(); + stopEspTransfer(); + lv_draw_dialog(DIALOG_TYPE_UPLOAD_FILE); + } + } + + if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 10000)) + wifi_link_state = WIFI_NOT_CONFIG; + + if ((tick_net_time1 != 0) && (getWifiTickDiff(tick_net_time1, tick_net_time2) > 120000)) { + wifi_link_state = WIFI_NOT_CONFIG; + wifi_reset(); + tick_net_time1 = getWifiTick(); + } + } + + if (wifiTransError.flag == 0x1) { + wifiTransError.now_tick = getWifiTick(); + if (getWifiTickDiff(wifiTransError.start_tick, wifiTransError.now_tick) > WAIT_ESP_TRANS_TIMEOUT_TICK) { + wifiTransError.flag = 0; + WIFI_IO1_RESET(); + } + } +} + +void wifi_looping() { + do { wifi_rcv_handle(); } while (wifi_link_state == WIFI_TRANS_FILE); +} + +void mks_esp_wifi_init() { + wifi_link_state = WIFI_NOT_CONFIG; + + SET_OUTPUT(WIFI_RESET_PIN); + WIFI_SET(); + SET_OUTPUT(WIFI_IO1_PIN); + SET_INPUT_PULLUP(WIFI_IO0_PIN); + WIFI_IO1_SET(); + + esp_state = TRANSFER_IDLE; + esp_port_begin(1); + + wifi_reset(); + + #if 0 + res = f_open(&esp_upload.uploadFile, ESP_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); + + if (res == FR_OK) { + f_close(&esp_upload.uploadFile); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { + return; + } + + clear_cur_ui(); + + draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + + if (wifi_upload(0) >= 0) { + + f_unlink("1:/MKS_WIFI_CUR"); + f_rename(ESP_FIRMWARE_FILE,"/MKS_WIFI_CUR"); + } + draw_return_ui(); + + update_flag = 1; + } + if (update_flag == 0) { + res = f_open(&esp_upload.uploadFile, ESP_WEB_FIRMWARE_FILE, FA_OPEN_EXISTING | FA_READ); + + if (res == FR_OK) { + f_close(&esp_upload.uploadFile); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { + return; + } + + clear_cur_ui(); + + draw_dialog(DIALOG_TYPE_UPDATE_ESP_FIRMARE); + if (wifi_upload(1) >= 0) { + + f_unlink("1:/MKS_WIFI_CUR"); + f_rename(ESP_WEB_FIRMWARE_FILE,"/MKS_WIFI_CUR"); + } + draw_return_ui(); + update_flag = 1; + } + + } + if (update_flag == 0) { + res = f_open(&esp_upload.uploadFile, ESP_WEB_FILE, FA_OPEN_EXISTING | FA_READ); + if (res == FR_OK) { + f_close(&esp_upload.uploadFile); + + wifi_delay(2000); + + if (usartFifoAvailable((SZ_USART_FIFO *)&WifiRxFifo) < 20) { + return; + } + + clear_cur_ui(); + + draw_dialog(DIALOG_TYPE_UPDATE_ESP_DATA); + + if (wifi_upload(2) >= 0) { + + f_unlink("1:/MKS_WEB_CONTROL_CUR"); + f_rename(ESP_WEB_FILE,"/MKS_WEB_CONTROL_CUR"); + } + draw_return_ui(); + } + } + #endif + wifiPara.decodeType = WIFI_DECODE_TYPE; + wifiPara.baud = 115200; + wifi_link_state = WIFI_NOT_CONFIG; +} + +#define BUF_INC_POINTER(p) ((p + 1 == UART_FIFO_BUFFER_SIZE) ? 0 : (p + 1)) + +int usartFifoAvailable(SZ_USART_FIFO *fifo) { + int diff = fifo->uart_write_point - fifo->uart_read_point; + if (diff < 0) diff += UART_FIFO_BUFFER_SIZE; + return diff; +} + +int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { + int i = 0 ; + while (i < len && fifo->uart_read_point != fifo->uart_write_point) { + buf[i++] = fifo->uartTxBuffer[fifo->uart_read_point]; + fifo->uart_read_point = BUF_INC_POINTER(fifo->uart_read_point); + } + return i; +} + +int writeUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len) { + if (buf == 0 || len <= 0) return -1; + + int i = 0 ; + while (i < len && fifo->uart_read_point != BUF_INC_POINTER(fifo->uart_write_point)) { + fifo->uartTxBuffer[fifo->uart_write_point] = buf[i++]; + fifo->uart_write_point = BUF_INC_POINTER(fifo->uart_write_point); + } + return i; +} + +void get_wifi_commands() { + static char wifi_line_buffer[MAX_CMD_SIZE]; + static bool wifi_comment_mode = false; + static int wifi_read_count = 0; + + if (espGcodeFifo.wait_tick > 5) { + while ((queue.length < BUFSIZE) && (espGcodeFifo.r != espGcodeFifo.w)) { + + espGcodeFifo.wait_tick = 0; + + char wifi_char = espGcodeFifo.Buffer[espGcodeFifo.r]; + + espGcodeFifo.r = (espGcodeFifo.r + 1) % WIFI_GCODE_BUFFER_SIZE; + + /** + * If the character ends the line + */ + if (wifi_char == '\n' || wifi_char == '\r') { + + wifi_comment_mode = false; // end of line == end of comment + + if (!wifi_read_count) continue; // skip empty lines + + wifi_line_buffer[wifi_read_count] = 0; // terminate string + wifi_read_count = 0; //reset buffer + + char* command = wifi_line_buffer; + while (*command == ' ') command++; // skip any leading spaces + + // Movement commands alert when stopped + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + switch (strtol(gpos + 1, nullptr, 10)) { + case 0 ... 1: + #if ENABLED(ARC_SUPPORT) + case 2 ... 3: + #endif + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: + #endif + SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } + } + } + + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (strcmp(command, "M108") == 0) { + wait_for_heatup = false; + TERN_(HAS_LCD_MENU, wait_for_user = false); + } + if (strcmp(command, "M112") == 0) kill(M112_KILL_STR, nullptr, true); + if (strcmp(command, "M410") == 0) quickstop_stepper(); + #endif + + // Add the command to the queue + queue.enqueue_one_P(wifi_line_buffer); + } + else if (wifi_read_count >= MAX_CMD_SIZE - 1) { + + } + else { // it's not a newline, carriage return or escape char + if (wifi_char == ';') wifi_comment_mode = true; + if (!wifi_comment_mode) wifi_line_buffer[wifi_read_count++] = wifi_char; + } + } + }// queue has space, serial has data + else { + espGcodeFifo.wait_tick++; + } +} + +int readWifiBuf(int8_t *buf, int32_t len) { + int i = 0; + while (i < len && WIFISERIAL.available()) + buf[i++] = WIFISERIAL.read(); + return i; +} + +#endif // USE_WIFI_FUNCTION +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h new file mode 100644 index 00000000..0b402a3a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -0,0 +1,202 @@ +/** + * 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 + +#include "../../inc/MarlinConfigPre.h" + +#include +#include +#include + +#define UART_RX_BUFFER_SIZE 1024 +#define UART_FIFO_BUFFER_SIZE 1024 + +#define ESP_WIFI 0x02 + +#define AP_MODEL 0x01 +#define STA_MODEL 0x02 + +#define WIFI_DECODE_TYPE 1 + +#define IP_DHCP_FLAG 1 + +#define WIFI_AP_NAME "TP-LINK_MKS" +#define WIFI_KEY_CODE "makerbase" + +#define IP_ADDR "192.168.3.100" +#define IP_MASK "255.255.255.0" +#define IP_GATE "192.168.3.1" +#define IP_DNS "192.168.3.1" + +#define AP_IP_DHCP_FLAG 1 +#define AP_IP_ADDR "192.168.3.100" +#define AP_IP_MASK "255.255.255.0" +#define AP_IP_GATE "192.168.3.1" +#define AP_IP_DNS "192.168.3.1" +#define IP_START_IP "192.168.3.1" +#define IP_END_IP "192.168.3.255" + +#define UDISKBUFLEN 1024 + +typedef enum{ + udisk_buf_empty = 0, + udisk_buf_full, +} UDISK_DATA_BUFFER_STATE; + +#define TRANS_RCV_FIFO_BLOCK_NUM 8 + +typedef struct { + unsigned char *bufferAddr[TRANS_RCV_FIFO_BLOCK_NUM]; + unsigned char *p; + UDISK_DATA_BUFFER_STATE state[TRANS_RCV_FIFO_BLOCK_NUM]; + unsigned char read_cur; + unsigned char write_cur; +} WIFI_DMA_RCV_FIFO; + +typedef struct { + uint8_t flag; // 0x0: no error; 0x01: error + uint32_t start_tick; //error start time + uint32_t now_tick; +} WIFI_TRANS_ERROR; + +extern volatile WIFI_TRANS_ERROR wifiTransError; + +typedef struct { + char ap_name[32]; //wifi-name + char keyCode[64]; //wifi password + int decodeType; + int baud; + int mode; +} WIFI_PARA; + +typedef struct { + char state; + char hostUrl[96]; + int port; + char id[21]; +} CLOUD_PARA; + +typedef struct { + char dhcp_flag; + char ip_addr[16]; + char mask[16]; + char gate[16]; + char dns[16]; + + char dhcpd_flag; + char dhcpd_ip[16]; + char dhcpd_mask[16]; + char dhcpd_gate[16]; + char dhcpd_dns[16]; + char start_ip_addr[16]; + char end_ip_addr[16]; +} IP_PARA; + +typedef enum { + WIFI_NOT_CONFIG, + WIFI_CONFIG_MODE, + WIFI_CONFIG_DHCP, + WIFI_CONFIG_AP, + WIFI_CONFIG_IP_INF, + WIFI_CONFIG_DNS, + WIFI_CONFIG_TCP, + WIFI_CONFIG_SERVER, + WIFI_CONFIG_REMOTE_PORT, + WIFI_CONFIG_BAUD, + WIFI_CONFIG_COMMINT, + WIFI_CONFIG_OK, + WIFI_GET_IP_OK, + WIFI_RECONN, + WIFI_CONNECTED, + WIFI_WAIT_TRANS_START, + WIFI_TRANS_FILE, + WIFI_CONFIG_DHCPD, + WIFI_COFIG_DHCPD_IP, + WIFI_COFIG_DHCPD_DNS, + WIFI_EXCEPTION, +} WIFI_STATE; + +typedef enum { + TRANSFER_IDLE, + TRANSFERING, + TRANSFER_STORE, +} TRANSFER_STATE; +extern volatile TRANSFER_STATE esp_state; + +typedef struct { + char buf[20][80]; + int rd_index; + int wt_index; +} QUEUE; + +typedef enum { + WIFI_PARA_SET, // 0x0:net parameter + WIFI_PRINT_INF, // 0x1:print message + WIFI_TRANS_INF, // 0x2:Pass through information + WIFI_EXCEP_INF, // 0x3:Exception information + WIFI_CLOUD_CFG, // 0x4:cloud config + WIFI_CLOUD_UNBIND, // 0x5:Unbind ID +} WIFI_RET_TYPE; + +typedef struct { + uint32_t uart_read_point; + uint32_t uart_write_point; + uint8_t uartTxBuffer[UART_FIFO_BUFFER_SIZE]; +} SZ_USART_FIFO; + +#define WIFI_GCODE_BUFFER_LEAST_SIZE 96 +#define WIFI_GCODE_BUFFER_SIZE (WIFI_GCODE_BUFFER_LEAST_SIZE * 3) +typedef struct { + uint8_t wait_tick; + uint8_t Buffer[WIFI_GCODE_BUFFER_SIZE]; + uint32_t r; + uint32_t w; +} WIFI_GCODE_BUFFER; + +extern volatile WIFI_STATE wifi_link_state; +extern WIFI_PARA wifiPara; +extern IP_PARA ipPara; +extern CLOUD_PARA cloud_para; + +extern WIFI_GCODE_BUFFER espGcodeFifo; + +extern uint32_t getWifiTick(); +extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); + +extern void mks_esp_wifi_init(); +extern int cfg_cloud_flag; +extern int send_to_wifi(char *buf, int len); +extern void wifi_looping(); +extern int raw_send_to_wifi(char *buf, int len); +extern int package_to_wifi(WIFI_RET_TYPE type,char *buf, int len); +extern void get_wifi_list_command_send(); +extern void get_wifi_commands(); +extern int readWifiBuf(int8_t *buf, int32_t len); +extern int storeRcvData(int32_t len); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp new file mode 100644 index 00000000..087a3b21 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -0,0 +1,829 @@ +/** + * 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 "draw_ui.h" +#include "wifi_module.h" +#include "wifi_upload.h" + +#include "../../../../MarlinCore.h" + +#define WIFI_SET() WRITE(WIFI_RESET_PIN, HIGH); +#define WIFI_RESET() WRITE(WIFI_RESET_PIN, LOW); +#define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); +#define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); + +extern SZ_USART_FIFO WifiRxFifo; + +extern int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); +extern int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); +extern void esp_port_begin(uint8_t interrupt); +extern int usartFifoAvailable(SZ_USART_FIFO *fifo); +extern void wifi_delay(int n); + +#define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) + +//typedef signed char bool; + +// ESP8266 command codes +const uint8_t ESP_FLASH_BEGIN = 0x02; +const uint8_t ESP_FLASH_DATA = 0x03; +const uint8_t ESP_FLASH_END = 0x04; +const uint8_t ESP_MEM_BEGIN = 0x05; +const uint8_t ESP_MEM_END = 0x06; +const uint8_t ESP_MEM_DATA = 0x07; +const uint8_t ESP_SYNC = 0x08; +const uint8_t ESP_WRITE_REG = 0x09; +const uint8_t ESP_READ_REG = 0x0A; + +// MAC address storage locations +const uint32_t ESP_OTP_MAC0 = 0x3FF00050; +const uint32_t ESP_OTP_MAC1 = 0x3FF00054; +const uint32_t ESP_OTP_MAC2 = 0x3FF00058; +const uint32_t ESP_OTP_MAC3 = 0x3FF0005C; + +const size_t EspFlashBlockSize = 0x0400; // 1K byte blocks + +const uint8_t ESP_IMAGE_MAGIC = 0xE9; +const uint8_t ESP_CHECKSUM_MAGIC = 0xEF; + +const uint32_t ESP_ERASE_CHIP_ADDR = 0x40004984; // &SPIEraseChip +const uint32_t ESP_SEND_PACKET_ADDR = 0x40003C80; // &send_packet +const uint32_t ESP_SPI_READ_ADDR = 0x40004B1C; // &SPIRead +const uint32_t ESP_UNKNOWN_ADDR = 0x40001121; // not used +const uint32_t ESP_USER_DATA_RAM_ADDR = 0x3FFE8000; // &user data ram +const uint32_t ESP_IRAM_ADDR = 0x40100000; // instruction RAM +const uint32_t ESP_FLASH_ADDR = 0x40200000; // address of start of Flash +//const uint32_t ESP_FLASH_READ_STUB_BEGIN = IRAM_ADDR + 0x18; + +UPLOAD_STRUCT esp_upload; + +static const unsigned int retriesPerReset = 3; +static const uint32_t connectAttemptInterval = 50; +static const unsigned int percentToReportIncrement = 5; // how often we report % complete +static const uint32_t defaultTimeout = 500; +static const uint32_t eraseTimeout = 15000; +static const uint32_t blockWriteTimeout = 200; +static const uint32_t blockWriteInterval = 15; // 15ms is long enough, 10ms is mostly too short + +// Messages corresponding to result codes, should make sense when followed by " error" +const char *resultMessages[] = { + "no", + "timeout", + "comm write", + "connect", + "bad reply", + "file read", + "empty file", + "response header", + "slip frame", + "slip state", + "slip data" +}; + +// A note on baud rates. +// The ESP8266 supports 921600, 460800, 230400, 115200, 74880 and some lower baud rates. +// 921600b is not reliable because even though it sometimes succeeds in connecting, we get a bad response during uploading after a few blocks. +// Probably our UART ISR cannot receive bytes fast enough, perhaps because of the latency of the system tick ISR. +// 460800b doesn't always manage to connect, but if it does then uploading appears to be reliable. +// 230400b always manages to connect. +static const uint32_t uploadBaudRates[] = { 460800, 230400, 115200, 74880 }; + +signed char IsReady() { + return esp_upload.state == upload_idle; +} + +void uploadPort_write(const uint8_t *buf, size_t len) { + #if 0 + int i; + + for (i = 0; i < len; i++) { + while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { /* nada */ } + USART_SendData(USART1, *(buf + i)); + } + #endif +} + +char uploadPort_read() { + uint8_t retChar; + if (readUsartFifo(&WifiRxFifo, (int8_t *)&retChar, 1) == 1) + return retChar; + else + return 0; +} + +int uploadPort_available() { + return usartFifoAvailable(&WifiRxFifo); +} + +void uploadPort_begin() { + esp_port_begin(1); +} + +void uploadPort_close() { + //WIFI_COM.end(); + //WIFI_COM.begin(115200, true); + esp_port_begin(0); +} + +void flushInput() { + while (uploadPort_available() != 0) { + (void)uploadPort_read(); + //IWDG_ReloadCounter(); + } +} + +// Extract 1-4 bytes of a value in little-endian order from a buffer beginning at a specified offset +uint32_t getData(unsigned byteCnt, const uint8_t *buf, int ofst) { + uint32_t val = 0; + + if (buf && byteCnt) { + unsigned int shiftCnt = 0; + if (byteCnt > 4) + byteCnt = 4; + do{ + val |= (uint32_t)buf[ofst++] << shiftCnt; + shiftCnt += 8; + } while (--byteCnt); + } + return(val); +} + +// Put 1-4 bytes of a value in little-endian order into a buffer beginning at a specified offset. +void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { + if (buf && byteCnt) { + if (byteCnt > 4) { + byteCnt = 4; + } + do { + buf[ofst++] = (uint8_t)(val & 0xFF); + val >>= 8; + } while (--byteCnt); + } +} + +// Read a byte optionally performing SLIP decoding. The return values are: +// +// 2 - an escaped byte was read successfully +// 1 - a non-escaped byte was read successfully +// 0 - no data was available +// -1 - the value 0xC0 was encountered (shouldn't happen) +// -2 - a SLIP escape byte was found but the following byte wasn't available +// -3 - a SLIP escape byte was followed by an invalid byte +int ReadByte(uint8_t *data, signed char slipDecode) { + if (uploadPort_available() == 0) { + return(0); + } + + // at least one byte is available + *data = uploadPort_read(); + if (!slipDecode) { + return(1); + } + + if (*data == 0xC0) { + // this shouldn't happen + return(-1); + } + + // if not the SLIP escape, we're done + if (*data != 0xDB) { + return(1); + } + + // SLIP escape, check availability of subsequent byte + if (uploadPort_available() == 0) { + return(-2); + } + + // process the escaped byte + *data = uploadPort_read(); + if (*data == 0xDC) { + *data = 0xC0; + return(2); + } + + if (*data == 0xDD) { + *data = 0xDB; + return(2); + } + // invalid + return(-3); +} +// When we write a sync packet, there must be no gaps between most of the characters. +// So use this function, which does a block write to the UART buffer in the latest CoreNG. +void _writePacketRaw(const uint8_t *buf, size_t len) { + uploadPort_write(buf, len); +} + +// Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. +void WriteByteRaw(uint8_t b) { + uploadPort_write((const uint8_t *)&b, 1); +} + +// Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. +void WriteByteSlip(uint8_t b) { + if (b == 0xC0) { + WriteByteRaw(0xDB); + WriteByteRaw(0xDC); + } + else if (b == 0xDB) { + WriteByteRaw(0xDB); + WriteByteRaw(0xDD); + } + else { + uploadPort_write((const uint8_t *)&b, 1); + } +} + +// Wait for a data packet to be returned. If the body of the packet is +// non-zero length, return an allocated buffer indirectly containing the +// data and return the data length. Note that if the pointer for returning +// the data buffer is NULL, the response is expected to be two bytes of zero. +// +// If an error occurs, return a negative value. Otherwise, return the number +// of bytes in the response (or zero if the response was not the standard "two bytes of zero"). +EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t msTimeout) { + typedef enum { + begin = 0, + header, + body, + end, + done + } PacketState; + + uint8_t resp, opRet; + + const size_t headerLength = 8; + + uint32_t startTime = getWifiTick(); + uint8_t hdr[headerLength]; + uint16_t hdrIdx = 0; + + uint16_t bodyIdx = 0; + uint8_t respBuf[2]; + + // wait for the response + uint16_t needBytes = 1; + + PacketState state = begin; + + *bodyLen = 0; + + while (state != done) { + uint8_t c; + EspUploadResult stat; + + //IWDG_ReloadCounter(); + + if (getWifiTickDiff(startTime, getWifiTick()) > msTimeout) { + return(timeout); + } + + if (uploadPort_available() < needBytes) { + // insufficient data available + // preferably, return to Spin() here + continue; + } + + // sufficient bytes have been received for the current state, process them + switch (state) { + case begin: // expecting frame start + c = uploadPort_read(); + if (c != (uint8_t)0xC0) { + break; + } + state = header; + needBytes = 2; + + break; + case end: // expecting frame end + c = uploadPort_read(); + if (c != (uint8_t)0xC0) { + return slipFrame; + } + state = done; + + break; + + case header: // reading an 8-byte header + case body: // reading the response body + { + int rslt; + // retrieve a byte with SLIP decoding + rslt = ReadByte(&c, 1); + if (rslt != 1 && rslt != 2) { + // some error occurred + stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; + return stat; + } + else if (state == header) { + //store the header byte + hdr[hdrIdx++] = c; + if (hdrIdx >= headerLength) { + // get the body length, prepare a buffer for it + *bodyLen = (uint16_t)getData(2, hdr, 2); + + // extract the value, if requested + if (valp != 0) { + *valp = getData(4, hdr, 4); + } + + if (*bodyLen != 0) { + state = body; + } + else { + needBytes = 1; + state = end; + } + } + } + else { + // Store the response body byte, check for completion + if (bodyIdx < ARRAY_SIZE(respBuf)) { + respBuf[bodyIdx] = c; + } + ++bodyIdx; + if (bodyIdx >= *bodyLen) { + needBytes = 1; + state = end; + } + } + } + break; + + default: // this shouldn't happen + return slipState; + } + } + + // Extract elements from the header + resp = (uint8_t)getData(1, hdr, 0); + opRet = (uint8_t)getData(1, hdr, 1); + // Sync packets often provoke a response with a zero opcode instead of ESP_SYNC + if (resp != 0x01 || opRet != op) { + //printf("resp %02x %02x\n", resp, opRet); //debug + return respHeader; + } + + return success; +} + +// Send a block of data performing SLIP encoding of the content. +void _writePacket(const uint8_t *data, size_t len) { + unsigned char outBuf[2048] = {0}; + unsigned int outIndex = 0; + while (len != 0) { + if (*data == 0xC0) { + outBuf[outIndex++] = 0xDB; + outBuf[outIndex++] = 0xDC; + } + else if (*data == 0xDB) { + outBuf[outIndex++] = 0xDB; + outBuf[outIndex++] = 0xDD; + } + else { + outBuf[outIndex++] = *data; + + } + data++; + --len; + } + uploadPort_write((const uint8_t *)outBuf, outIndex); +} + +// Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. +// A SLIP packet begins and ends with 0xC0. The data encapsulated has the bytes +// 0xC0 and 0xDB replaced by the two-byte sequences {0xDB, 0xDC} and {0xDB, 0xDD} respectively. + +void writePacket(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { + WriteByteRaw(0xC0); // send the packet start character + _writePacket(hdr, hdrLen); // send the header + _writePacket(data, dataLen); // send the data block + WriteByteRaw(0xC0); // send the packet end character +} + +// Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. +// This is like writePacket except that it does a fast block write for both the header and the main data with no SLIP encoding. Used to send sync commands. +void writePacketRaw(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { + WriteByteRaw(0xC0); // send the packet start character + _writePacketRaw(hdr, hdrLen); // send the header + _writePacketRaw(data, dataLen); // send the data block in raw mode + WriteByteRaw(0xC0); // send the packet end character +} + +// Send a command to the attached device together with the supplied data, if any. +// The data is supplied via a list of one or more segments. +void sendCommand(uint8_t op, uint32_t checkVal, const uint8_t *data, size_t dataLen) { + // populate the header + uint8_t hdr[8]; + putData(0, 1, hdr, 0); + putData(op, 1, hdr, 1); + putData(dataLen, 2, hdr, 2); + putData(checkVal, 4, hdr, 4); + + // send the packet + //flushInput(); + if (op == ESP_SYNC) + writePacketRaw(hdr, sizeof(hdr), data, dataLen); + else + writePacket(hdr, sizeof(hdr), data, dataLen); +} + +// Send a command to the attached device together with the supplied data, if any, and get the response +EspUploadResult doCommand(uint8_t op, const uint8_t *data, size_t dataLen, uint32_t checkVal, uint32_t *valp, uint32_t msTimeout) { + size_t bodyLen; + EspUploadResult stat; + + sendCommand(op, checkVal, data, dataLen); + + stat = readPacket(op, valp, &bodyLen, msTimeout); + if (stat == success && bodyLen != 2) + stat = badReply; + + return stat; +} + +// Send a synchronising packet to the serial port in an attempt to induce +// the ESP8266 to auto-baud lock on the baud rate. +EspUploadResult Sync(uint16_t timeout) { + uint8_t buf[36]; + EspUploadResult stat; + int i ; + + // compose the data for the sync attempt + memset(buf, 0x55, sizeof(buf)); + buf[0] = 0x07; + buf[1] = 0x07; + buf[2] = 0x12; + buf[3] = 0x20; + + stat = doCommand(ESP_SYNC, buf, sizeof(buf), 0, 0, timeout); + + // If we got a response other than sync, discard it and wait for a sync response. This happens at higher baud rates. + for (i = 0; i < 10 && stat == respHeader; ++i) { + size_t bodyLen; + stat = readPacket(ESP_SYNC, 0, &bodyLen, timeout); + } + + if (stat == success) { + // Read and discard additional replies + for (;;) { + size_t bodyLen; + EspUploadResult rc = readPacket(ESP_SYNC, 0, &bodyLen, defaultTimeout); + if (rc != success || bodyLen != 2) { + break; + } + } + } + //DEBUG + //else debug//printf("stat=%d\n", (int)stat); + return stat; +} + +// Send a command to the device to begin the Flash process. +EspUploadResult flashBegin(uint32_t addr, uint32_t size) { + // determine the number of blocks represented by the size + uint32_t blkCnt; + uint8_t buf[16]; + uint32_t timeout; + + blkCnt = (size + EspFlashBlockSize - 1) / EspFlashBlockSize; + + // ensure that the address is on a block boundary + addr &= ~(EspFlashBlockSize - 1); + + // begin the Flash process + putData(size, 4, buf, 0); + putData(blkCnt, 4, buf, 4); + putData(EspFlashBlockSize, 4, buf, 8); + putData(addr, 4, buf, 12); + + timeout = (size != 0) ? eraseTimeout : defaultTimeout; + return doCommand(ESP_FLASH_BEGIN, buf, sizeof(buf), 0, 0, timeout); +} + +// Send a command to the device to terminate the Flash process +EspUploadResult flashFinish(signed char reboot) { + uint8_t buf[4]; + putData(reboot ? 0 : 1, 4, buf, 0); + return doCommand(ESP_FLASH_END, buf, sizeof(buf), 0, 0, defaultTimeout); +} + +// Compute the checksum of a block of data +uint16_t checksum(const uint8_t *data, uint16_t dataLen, uint16_t cksum) { + if (data != NULL) { + while (dataLen--) { + cksum ^= (uint16_t)*data++; + } + } + return(cksum); +} + +EspUploadResult flashWriteBlock(uint16_t flashParmVal, uint16_t flashParmMask) { + #if 0 + const uint32_t blkSize = EspFlashBlockSize; + int i; + + // Allocate a data buffer for the combined header and block data + const uint16_t hdrOfst = 0; + const uint16_t dataOfst = 16; + const uint16_t blkBufSize = dataOfst + blkSize; + uint32_t blkBuf32[blkBufSize/4]; + uint8_t * const blkBuf = (uint8_t*)(blkBuf32); + uint32_t cnt; + uint16_t cksum; + EspUploadResult stat; + + // Prepare the header for the block + putData(blkSize, 4, blkBuf, hdrOfst + 0); + putData(esp_upload.uploadBlockNumber, 4, blkBuf, hdrOfst + 4); + putData(0, 4, blkBuf, hdrOfst + 8); + putData(0, 4, blkBuf, hdrOfst + 12); + + // Get the data for the block + f_read(&esp_upload.uploadFile, blkBuf + dataOfst, blkSize, &cnt );//->Read(reinterpret_cast(blkBuf + dataOfst), blkSize); + if (cnt != blkSize) { + if (f_tell(&esp_upload.uploadFile) == esp_upload.fileSize) { + // partial last block, fill the remainder + memset(blkBuf + dataOfst + cnt, 0xFF, blkSize - cnt); + } + else { + return fileRead; + } + } + + // Patch the flash parameters into the first block if it is loaded at address 0 + if (esp_upload.uploadBlockNumber == 0 && esp_upload.uploadAddress == 0 && blkBuf[dataOfst] == ESP_IMAGE_MAGIC && flashParmMask != 0) { + // update the Flash parameters + uint32_t flashParm = getData(2, blkBuf + dataOfst + 2, 0) & ~(uint32_t)flashParmMask; + putData(flashParm | flashParmVal, 2, blkBuf + dataOfst + 2, 0); + } + + // Calculate the block checksum + cksum = checksum(blkBuf + dataOfst, blkSize, ESP_CHECKSUM_MAGIC); + + for (i = 0; i < 3; i++) { + if ((stat = doCommand(ESP_FLASH_DATA, blkBuf, blkBufSize, cksum, 0, blockWriteTimeout)) == success) { + break; + } + } + + //printf("Upload %d\%\n", ftell(&esp_upload.uploadFile) * 100 / esp_upload.fileSize); + + return stat; + #else + return success; + #endif +} + +void upload_spin() { + #if 0 + switch (esp_upload.state) { + case resetting: + + if (esp_upload.connectAttemptNumber == 9) { + // Time to give up + //Network::ResetWiFi(); + esp_upload.uploadResult = connected; + esp_upload.state = done; + } + else { + + // Reset the serial port at the new baud rate. Also reset the ESP8266. + // const uint32_t baud = uploadBaudRates[esp_upload.connectAttemptNumber/esp_upload.retriesPerBaudRate]; + if (esp_upload.connectAttemptNumber % esp_upload.retriesPerBaudRate == 0) { + } + //uploadPort.begin(baud); + //uploadPort_close(); + + uploadPort_begin(); + + wifi_delay(2000); + + flushInput(); + + esp_upload.lastAttemptTime = esp_upload.lastResetTime = getWifiTick(); + esp_upload.state = connecting; + } + + break; + + case connecting: + if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { + // Attempt to establish a connection to the ESP8266. + EspUploadResult res = Sync(5000); + esp_upload.lastAttemptTime = getWifiTick(); + if (res == success) { + // Successful connection + //MessageF(" success on attempt %d\n", (connectAttemptNumber % retriesPerBaudRate) + 1); + //printf("connect success\n"); + esp_upload.state = erasing; + } + else { + // This attempt failed + esp_upload.connectAttemptNumber++; + if (esp_upload.connectAttemptNumber % retriesPerReset == 0) { + esp_upload.state = resetting; // try a reset and a lower baud rate + } + } + } + break; + + case erasing: + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= blockWriteInterval) { + uint32_t eraseSize; + const uint32_t sectorsPerBlock = 16; + const uint32_t sectorSize = 4096; + const uint32_t numSectors = (esp_upload.fileSize + sectorSize - 1)/sectorSize; + const uint32_t startSector = esp_upload.uploadAddress/sectorSize; + + uint32_t headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); + NOMORE(headSectors, numSectors); + + eraseSize = (numSectors < 2 * headSectors) + ? (numSectors + 1) / 2 * sectorSize + : (numSectors - headSectors) * sectorSize; + + //MessageF("Erasing %u bytes...\n", fileSize); + esp_upload.uploadResult = flashBegin(esp_upload.uploadAddress, eraseSize); + if (esp_upload.uploadResult == success) { + //MessageF("Uploading file...\n"); + esp_upload.uploadBlockNumber = 0; + esp_upload.uploadNextPercentToReport = percentToReportIncrement; + esp_upload.lastAttemptTime = getWifiTick(); + esp_upload.state = uploading; + } + else { + //MessageF("Erase failed\n"); + esp_upload.state = done; + } + } + break; + + case uploading: + // The ESP needs several milliseconds to recover from one packet before it will accept another + if (getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= 15) { + unsigned int percentComplete; + const uint32_t blkCnt = (esp_upload.fileSize + EspFlashBlockSize - 1) / EspFlashBlockSize; + if (esp_upload.uploadBlockNumber < blkCnt) { + esp_upload.uploadResult = flashWriteBlock(0, 0); + esp_upload.lastAttemptTime = getWifiTick(); + if (esp_upload.uploadResult != success) { + //MessageF("Flash block upload failed\n"); + esp_upload.state = done; + } + percentComplete = (100 * esp_upload.uploadBlockNumber)/blkCnt; + ++esp_upload.uploadBlockNumber; + if (percentComplete >= esp_upload.uploadNextPercentToReport) { + //MessageF("%u%% complete\n", percentComplete); + esp_upload.uploadNextPercentToReport += percentToReportIncrement; + } + } + else { + esp_upload.state = done; + } + } + break; + + case done: + f_close(&esp_upload.uploadFile); + //uploadPort.end(); + //uploadPort_close(); + + //WIFI_COM.begin(115200, true); + //wifi_init(); + + if (esp_upload.uploadResult == success) { + //printf("upload successfully\n"); + } + else { + //printf("upload failed\n"); + } + esp_upload.state = upload_idle;//idle; + break; + + default: + break; + } + #endif +} + +// Try to upload the given file at the given address +void SendUpdateFile(const char *file, uint32_t address) { + #if 0 + FRESULT res = f_open(&esp_upload.uploadFile, file, FA_OPEN_EXISTING | FA_READ); + + if (res != FR_OK) return; + + esp_upload.fileSize = f_size(&esp_upload.uploadFile); + if (esp_upload.fileSize == 0) { + f_close(&esp_upload.uploadFile); + return; + } + f_lseek(&esp_upload.uploadFile, 0); + + esp_upload.uploadAddress = address; + esp_upload.connectAttemptNumber = 0; + esp_upload.state = resetting; + #endif +} + +static const uint32_t FirmwareAddress = 0x00000000, WebFilesAddress = 0x00100000; + +void ResetWiFiForUpload(int begin_or_end) { + #if 0 + uint32_t start, now; + + GPIO_InitTypeDef GPIO_InitStructure; + + #if V1_0_V1_1 + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Pin = GPIO_Pin_8; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + #else + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStructure.Pin = GPIO_Pin_13; + GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + #endif + start = getWifiTick(); + now = start; + + if (begin_or_end == 0) { + #if V1_0_V1_1 + HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_RESET); //update mode + #else + HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_RESET); //update mode + #endif + } + else { + #if V1_0_V1_1 + #if V1_0_V1_1 + HAL_GPIO_WritePin(GPIOA,GPIO_Pin_8,GPIO_PIN_SET); //boot mode + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStructure.Pin = GPIO_Pin_8; + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + #endif + #else + HAL_GPIO_WritePin(GPIOC,GPIO_Pin_13,GPIO_PIN_SET); //boot mode + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStructure.Pin = GPIO_Pin_13; + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + #endif + } + WIFI_RESET(); + while (getWifiTickDiff(start, now) < 500) now = getWifiTick(); + WIFI_SET(); + #endif +} + +int32_t wifi_upload(int type) { + esp_upload.retriesPerBaudRate = 9; + + ResetWiFiForUpload(0); + + if (type == 0) + SendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); + else if (type == 1) + SendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); + else if (type == 2) + SendUpdateFile(ESP_WEB_FILE, WebFilesAddress); + else + return -1; + + while (esp_upload.state != upload_idle) { + upload_spin(); + //IWDG_ReloadCounter(); + } + + ResetWiFiForUpload(1); + + return esp_upload.uploadResult == success ? 0 : -1; +} + +#endif // HAS_TFT_LVGL_UI diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h new file mode 100644 index 00000000..d942a2c8 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.h @@ -0,0 +1,74 @@ +/** + * 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 + +#define ESP_FIRMWARE_FILE "1:/MksWifi.bin" +#define ESP_WEB_FIRMWARE_FILE "1:/MksWifi_Web.bin" +#define ESP_WEB_FILE "1:/MksWifi_WebView.bin" + +typedef enum { + upload_idle, + resetting, + connecting, + erasing, + uploading, + done +} UploadState; + +typedef enum { + success = 0, + timeout, + connected, + badReply, + fileRead, + emptyFile, + respHeader, + slipFrame, + slipState, + slipData, +} EspUploadResult; + +typedef struct { + //FIL uploadFile; + uint32_t fileSize; + + uint32_t uploadAddress; + UploadState state; + uint32_t retriesPerBaudRate; + uint32_t connectAttemptNumber; + uint32_t lastAttemptTime; + uint32_t lastResetTime; + uint32_t uploadBlockNumber; + uint32_t uploadNextPercentToReport; + EspUploadResult uploadResult; +} UPLOAD_STRUCT; + +extern UPLOAD_STRUCT esp_upload; +int32_t wifi_upload(int type); + +#ifdef __cplusplus + } /* C-declarations for C++ */ +#endif diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp new file mode 100644 index 00000000..79a5fb96 --- /dev/null +++ b/Marlin/src/lcd/extui/malyan_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 . + * + */ + +/** + * 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 + * wrapped in curly braces which the LCD implementation translates into + * actual G-code commands. + * + * Added to Marlin for Mini/Malyan M200 + * Unknown commands as of Jan 2018: {H:} + * Not currently implemented: + * {E:} when sent by LCD. Meaning unknown. + * + * Notes for connecting to boards that are not Malyan: + * The LCD is 3.3v, so if powering from a RAMPS 1.4 board or + * other 5v/12v board, use a buck converter to power the LCD and + * the 3.3v side of a logic level shifter. Aux1 on the RAMPS board + * has Serial1 and 12v, making it perfect for this. + * Copyright (c) 2017 Jason Nelson (xC0000005) + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(MALYAN_LCD) + +//#define DEBUG_MALYAN_LCD + +#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" + +#define DEBUG_OUT ENABLED(DEBUG_MALYAN_LCD) +#include "../../core/debug_out.h" + +// This is based on longest sys command + a filename, plus some buffer +// in case we encounter some data we don't recognize +// There is no evidence a line will ever be this long, but better safe than sorry +#define MAX_CURLY_COMMAND (32 + LONG_FILENAME_LENGTH) * 2 + +// Track incoming command bytes from the LCD +uint16_t inbound_count; + +// For sending print completion messages +bool last_printing_status = false; + +// Everything written needs the high bit set. +void write_to_lcd_P(PGM_P const message) { + char encoded_message[MAX_CURLY_COMMAND]; + uint8_t message_length = _MIN(strlen_P(message), sizeof(encoded_message)); + + LOOP_L_N(i, message_length) + encoded_message[i] = pgm_read_byte(&message[i]) | 0x80; + + LCD_SERIAL.Print::write(encoded_message, message_length); +} + +void write_to_lcd(const char * const message) { + char encoded_message[MAX_CURLY_COMMAND]; + const uint8_t message_length = _MIN(strlen(message), sizeof(encoded_message)); + + LOOP_L_N(i, message_length) + encoded_message[i] = message[i] | 0x80; + + LCD_SERIAL.Print::write(encoded_message, message_length); +} + +// {E:} is for error states. +void set_lcd_error_P(PGM_P const error, PGM_P const component=nullptr) { + write_to_lcd_P(PSTR("{E:")); + write_to_lcd_P(error); + if (component) { + write_to_lcd_P(PSTR(" ")); + write_to_lcd_P(component); + } + write_to_lcd_P(PSTR("}")); +} + + +/** + * Process an LCD 'C' command. + * These are currently all temperature commands + * {C:T0190} + * Set temp for hotend to 190 + * {C:P050} + * Set temp for bed to 50 + * + * {C:S09} set feedrate to 90 %. + * {C:S12} set feedrate to 120 %. + * + * the command portion begins after the : + */ +void process_lcd_c_command(const char* command) { + const int target_val = command[1] ? atoi(command + 1) : -1; + if (target_val < 0) { + DEBUG_ECHOLNPAIR("UNKNOWN C COMMAND ", command); + return; + } + switch (command[0]) { + case 'C': // Cope with both V1 early rev and later LCDs. + case 'S': + feedrate_percentage = target_val * 10; + LIMIT(feedrate_percentage, 10, 999); + break; + + case 'T': + // Sometimes the LCD will send commands to turn off both extruder and bed, though + // this should not happen since the printing screen is up. Better safe than sorry. + if (!print_job_timer.isRunning() || target_val > 0) + ExtUI::setTargetTemp_celsius(target_val, ExtUI::extruder_t::E0); + break; + + #if HAS_HEATED_BED + case 'P': ExtUI::setTargetTemp_celsius(target_val, ExtUI::heater_t::BED); break; + #endif + + default: DEBUG_ECHOLNPAIR("UNKNOWN C COMMAND ", command); + } +} + +/** + * Process an LCD 'B' command. + * {B:0} results in: {T0:008/195}{T1:000/000}{TP:000/000}{TQ:000C}{TT:000000} + * T0/T1 are hot end temperatures, TP is bed, TQ is percent, and TT is probably + * time remaining (HH:MM:SS). The UI can't handle displaying a second hotend, + * but the stock firmware always sends it, and it's always zero. + */ +void process_lcd_eb_command(const char* command) { + char elapsed_buffer[10]; + static uint8_t iteration = 0; + duration_t elapsed; + switch (command[0]) { + case '0': { + elapsed = print_job_timer.duration(); + sprintf_P(elapsed_buffer, PSTR("%02u%02u%02u"), uint16_t(elapsed.hour()), uint16_t(elapsed.minute()) % 60, uint16_t(elapsed.second()) % 60); + + char message_buffer[MAX_CURLY_COMMAND]; + uint8_t done_pct = print_job_timer.isRunning() ? (iteration * 10) : 100; + iteration = (iteration + 1) % 10; // Provide progress animation + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia() || ExtUI::isPrintingFromMediaPaused()) + done_pct = card.percentDone(); + #endif + + sprintf_P(message_buffer, + PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}{TQ:%03i}{TT:%s}"), + int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), + #if HAS_HEATED_BED + int(thermalManager.degBed()), thermalManager.degTargetBed(), + #else + 0, 0, + #endif + #if ENABLED(SDSUPPORT) + done_pct, + #else + 0, + #endif + elapsed_buffer + ); + write_to_lcd(message_buffer); + } break; + + default: DEBUG_ECHOLNPAIR("UNKNOWN E/B COMMAND ", command); + } +} + +/** + * Process an LCD 'J' command. + * These are currently all movement commands. + * The command portion begins after the : + * Move X Axis + * + * {J:E}{J:X-200}{J:E} + * {J:E}{J:X+200}{J:E} + * X, Y, Z, A (extruder) + */ +template +void j_move_axis(const char* command, const T axis) { + const float dist = atof(command + 1) / 10.0; + ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(axis) + dist, axis); +}; + +void process_lcd_j_command(const char* command) { + switch (command[0]) { + case 'E': break; + case 'A': j_move_axis(command, ExtUI::extruder_t::E0); break; + case 'Y': j_move_axis(command, ExtUI::axis_t::Y); break; + case 'Z': j_move_axis(command, ExtUI::axis_t::Z); break; + case 'X': j_move_axis(command, ExtUI::axis_t::X); break; + default: DEBUG_ECHOLNPAIR("UNKNOWN J COMMAND ", command); + } +} + +/** + * Process an LCD 'P' command, related to homing and printing. + * Cancel: + * {P:X} + * + * Home all axes: + * {P:H} + * + * Print a file: + * {P:000} + * The File number is specified as a three digit value. + * Printer responds with: + * {PRINTFILE:Mini_SNES_Bottom.gcode} + * {SYS:BUILD}echo:Now fresh file: Mini_SNES_Bottom.gcode + * File opened: Mini_SNES_Bottom.gcode Size: 5805813 + * File selected + * {SYS:BUILD} + * T:-2526.8 E:0 + * T:-2533.0 E:0 + * T:-2537.4 E:0 + * Note only the curly brace stuff matters. + */ +void process_lcd_p_command(const char* command) { + + switch (command[0]) { + case 'P': + ExtUI::pausePrint(); + write_to_lcd_P(PSTR("{SYS:PAUSED}")); + break; + case 'R': + ExtUI::resumePrint(); + write_to_lcd_P(PSTR("{SYS:RESUMED}")); + break; + case 'X': + write_to_lcd_P(PSTR("{SYS:CANCELING}")); + ExtUI::stopPrint(); + write_to_lcd_P(PSTR("{SYS:STARTED}")); + break; + case 'H': queue.enqueue_now_P(G28_STR); break; // Home all axes + default: { + #if ENABLED(SDSUPPORT) + // Print file 000 - a three digit number indicating which + // file to print in the SD card. If it's a directory, + // then switch to the directory. + + // Find the name of the file to print. + // It's needed to echo the PRINTFILE option. + // The {S:L} command should've ensured the SD card was mounted. + card.selectFileByIndex(atoi(command)); + + // There may be a difference in how V1 and V2 LCDs handle subdirectory + // prints. Investigate more. This matches the V1 motion controller actions + // but the V2 LCD switches to "print" mode on {SYS:DIR} response. + if (card.flag.filenameIsDir) { + card.cd(card.filename); + write_to_lcd_P(PSTR("{SYS:DIR}")); + } + else { + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, PSTR("{PRINTFILE:%s}"), card.longest_filename()); + write_to_lcd(message_buffer); + write_to_lcd_P(PSTR("{SYS:BUILD}")); + card.openAndPrintFile(card.filename); + } + #endif + } break; // default + } // switch +} + +/** + * Handle an lcd 'S' command + * {S:I} - Temperature request + * {T0:999/000}{T1:000/000}{TP:004/000} + * + * {S:L} - File Listing request + * Printer Response: + * {FILE:buttons.gcode} + * {FILE:update.bin} + * {FILE:nupdate.bin} + * {FILE:fcupdate.flg} + * {SYS:OK} + */ +void process_lcd_s_command(const char* command) { + switch (command[0]) { + case 'I': { + // temperature information + char message_buffer[MAX_CURLY_COMMAND]; + sprintf_P(message_buffer, PSTR("{T0:%03i/%03i}{T1:000/000}{TP:%03i/%03i}"), + int(thermalManager.degHotend(0)), thermalManager.degTargetHotend(0), + #if HAS_HEATED_BED + int(thermalManager.degBed()), thermalManager.degTargetBed() + #else + 0, 0 + #endif + ); + write_to_lcd(message_buffer); + } break; + + case 'L': { + #if ENABLED(SDSUPPORT) + if (!card.isMounted()) card.mount(); + + // A more efficient way to do this would be to + // implement a callback in the ls_SerialPrint code, but + // that requires changes to the core cardreader class that + // would not benefit the majority of users. Since one can't + // select a file for printing during a print, there's + // little reason not to do it this way. + char message_buffer[MAX_CURLY_COMMAND]; + uint16_t file_count = card.get_num_Files(); + for (uint16_t i = 0; i < file_count; i++) { + card.selectFileByIndex(i); + sprintf_P(message_buffer, card.flag.filenameIsDir ? PSTR("{DIR:%s}") : PSTR("{FILE:%s}"), card.longest_filename()); + write_to_lcd(message_buffer); + } + + write_to_lcd_P(PSTR("{SYS:OK}")); + #endif + } break; + + default: DEBUG_ECHOLNPAIR("UNKNOWN S COMMAND ", command); + } +} + +/** + * Receive a curly brace command and translate to G-code. + * Currently {E:0} is not handled. Its function is unknown, + * but it occurs during the temp window after a sys build. + */ +void process_lcd_command(const char* command) { + const char *current = command; + + byte command_code = *current++; + if (*current == ':') { + + current++; // skip the : + + switch (command_code) { + case 'S': process_lcd_s_command(current); break; + case 'J': process_lcd_j_command(current); break; + case 'P': process_lcd_p_command(current); break; + case 'C': process_lcd_c_command(current); break; + case 'B': + case 'E': process_lcd_eb_command(current); break; + default: DEBUG_ECHOLNPAIR("UNKNOWN COMMAND ", command); + } + } + else + DEBUG_ECHOLNPAIR("UNKNOWN COMMAND FORMAT ", command); +} + +// +// Parse LCD commands mixed with G-Code +// +void parse_lcd_byte(const byte b) { + static char inbound_buffer[MAX_CURLY_COMMAND]; + + static uint8_t parsing = 0; // Parsing state + static bool prevcr = false; // Was the last c a CR? + + const char c = b & 0x7F; + + if (parsing) { + const bool is_lcd = parsing == 1; // 1 for LCD + if ( ( is_lcd && c == '}') // Closing brace on LCD command + || (!is_lcd && c == '\n') // LF on a G-code command + ) { + inbound_buffer[inbound_count] = '\0'; // Reset before processing + inbound_count = 0; // Reset buffer index + if (parsing == 1) + process_lcd_command(inbound_buffer); // Handle the LCD command + else + queue.enqueue_one_now(inbound_buffer); // Handle the G-code command + parsing = 0; // Unflag and... + } + else if (inbound_count < MAX_CURLY_COMMAND - 2) + inbound_buffer[inbound_count++] = is_lcd ? c : b; // Buffer while space remains + } + else { + if (c == '{') parsing = 1; // Brace opens an LCD command + else if (prevcr && c == '\n') parsing = 2; // CRLF indicates G-code + prevcr = (c == '\r'); // Remember if it was a CR + } +} + +/** + * UC means connected. + * UD means disconnected + * The stock firmware considers USB initialized as "connected." + */ +void update_usb_status(const bool forceUpdate) { + static bool last_usb_connected_status = false; + // This is mildly different than stock, which + // appears to use the usb discovery status. + // This is more logical. + if (last_usb_connected_status != MYSERIAL0 || forceUpdate) { + last_usb_connected_status = MYSERIAL0; + write_to_lcd_P(last_usb_connected_status ? PSTR("{R:UC}\r\n") : PSTR("{R:UD}\r\n")); + } +} + +namespace ExtUI { + void onStartup() { + /** + * The Malyan LCD actually runs as a separate MCU on Serial 1. + * This code's job is to siphon the weird curly-brace commands from + * it and translate into ExtUI operations where possible. + */ + inbound_count = 0; + + #ifndef LCD_BAUDRATE + #define LCD_BAUDRATE 500000 + #endif + LCD_SERIAL.begin(LCD_BAUDRATE); + + // Signal init + write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); + + // send a version that says "unsupported" + write_to_lcd_P(PSTR("{VER:99}\r\n")); + + // No idea why it does this twice. + write_to_lcd_P(PSTR("{SYS:STARTED}\r\n")); + update_usb_status(true); + } + + void onIdle() { + /** + * - from printer on startup: + * {SYS:STARTED}{VER:29}{SYS:STARTED}{R:UD} + */ + + // First report USB status. + update_usb_status(false); + + // now drain commands... + while (LCD_SERIAL.available()) + parse_lcd_byte((byte)LCD_SERIAL.read()); + + #if ENABLED(SDSUPPORT) + // The way last printing status works is simple: + // The UI needs to see at least one TQ which is not 100% + // and then when the print is complete, one which is. + static uint8_t last_percent_done = 100; + + // If there was a print in progress, we need to emit the final + // print status as {TQ:100}. Reset last percent done so a new print will + // issue a percent of 0. + const uint8_t percent_done = (ExtUI::isPrinting() || ExtUI::isPrintingFromMediaPaused()) ? ExtUI::getProgress_percent() : last_printing_status ? 100 : 0; + if (percent_done != last_percent_done) { + char message_buffer[16]; + sprintf_P(message_buffer, PSTR("{TQ:%03i}"), percent_done); + write_to_lcd(message_buffer); + last_percent_done = percent_done; + last_printing_status = ExtUI::isPrinting(); + } + #endif + } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { + set_lcd_error_P(error, component); + } + + #if HAS_PID_HEATING + + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + //SERIAL_ECHOLNPAIR("OnPidTuning:", rst); + switch (rst) { + case PID_BAD_EXTRUDER_NUM: + set_lcd_error_P(GET_TEXT(MSG_PID_BAD_EXTRUDER_NUM)); + break; + case PID_TEMP_TOO_HIGH: + set_lcd_error_P(GET_TEXT(MSG_PID_TEMP_TOO_HIGH)); + break; + case PID_TUNING_TIMEOUT: + set_lcd_error_P(GET_TEXT(MSG_PID_TIMEOUT)); + break; + case PID_DONE: + set_lcd_error_P(GET_TEXT(MSG_PID_AUTOTUNE_DONE)); + break; + } + } + + #endif + + void onPrintTimerStarted() { write_to_lcd_P(PSTR("{SYS:BUILD}")); } + void onPrintTimerPaused() {} + void onPrintTimerStopped() { write_to_lcd_P(PSTR("{TQ:100}")); } + + // Not needed for Malyan LCD + void onStatusChanged(const char * const) {} + void onMediaInserted() {}; + void onMediaError() {}; + void onMediaRemoved() {}; + void onPlayTone(const uint16_t, const uint16_t) {} + void onFilamentRunout(const extruder_t extruder) {} + void onUserConfirmRequired(const char * const) {} + void onFactoryReset() {} + void onStoreSettings(char*) {} + void onLoadSettings(const char*) {} + void onConfigurationStoreWritten(bool) {} + void onConfigurationStoreRead(bool) {} + + #if HAS_MESH + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {} + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {} + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() {} + #endif +} + +#endif // MALYAN_LCD diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp new file mode 100644 index 00000000..30cf696f --- /dev/null +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -0,0 +1,1072 @@ +/** + * 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 . + * + */ + +/************** + * ui_api.cpp * + **************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 "../../inc/MarlinConfigPre.h" + +#if ENABLED(EXTENSIBLE_UI) + +#include "../ultralcd.h" +#include "../../gcode/queue.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/probe.h" +#include "../../module/temperature.h" +#include "../../module/printcounter.h" +#include "../../libs/duration_t.h" +#include "../../HAL/shared/Delay.h" +#include "../../sd/cardreader.h" + +#if ENABLED(PRINTCOUNTER) + #include "../../core/utility.h" + #include "../../libs/numtostr.h" +#endif + +#if HAS_MULTI_EXTRUDER + #include "../../module/tool_change.h" +#endif + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +#if HAS_TRINAMIC_CONFIG + #include "../../feature/tmc_util.h" + #include "../../module/stepper/indirection.h" +#endif + +#include "ui_api.h" + +#if ENABLED(BACKLASH_GCODE) + #include "../../feature/backlash.h" +#endif + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_FILAMENT_SENSOR + #include "../../feature/runout.h" +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) + #include "../../feature/caselight.h" +#endif + +#if ENABLED(BABYSTEPPING) + #include "../../feature/babystep.h" +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../../feature/host_actions.h" +#endif + +namespace ExtUI { + static struct { + uint8_t printer_killed : 1; + TERN_(JOYSTICK, uint8_t jogging : 1); + TERN_(SDSUPPORT, uint8_t was_sd_printing : 1); + } flags; + + #ifdef __SAM3X8E__ + /** + * Implement a special millis() to allow time measurement + * within an ISR (such as when the printer is killed). + * + * To keep proper time, must be called at least every 1s. + */ + uint32_t safe_millis() { + // Not killed? Just call millis() + if (!flags.printer_killed) return millis(); + + static uint32_t currTimeHI = 0; /* Current time */ + + // Machine was killed, reinit SysTick so we are able to compute time without ISRs + if (currTimeHI == 0) { + // Get the last time the Arduino time computed (from CMSIS) and convert it to SysTick + currTimeHI = (uint32_t)((GetTickCount() * (uint64_t)(F_CPU / 8000)) >> 24); + + // Reinit the SysTick timer to maximize its period + SysTick->LOAD = SysTick_LOAD_RELOAD_Msk; // get the full range for the systick timer + SysTick->VAL = 0; // Load the SysTick Counter Value + SysTick->CTRL = // MCLK/8 as source + // No interrupts + SysTick_CTRL_ENABLE_Msk; // Enable SysTick Timer + } + + // Check if there was a timer overflow from the last read + if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) { + // There was. This means (SysTick_LOAD_RELOAD_Msk * 1000 * 8)/F_CPU ms has elapsed + currTimeHI++; + } + + // Calculate current time in milliseconds + uint32_t currTimeLO = SysTick_LOAD_RELOAD_Msk - SysTick->VAL; // (in MCLK/8) + uint64_t currTime = ((uint64_t)currTimeLO) | (((uint64_t)currTimeHI) << 24); + + // The ms count is + return (uint32_t)(currTime / (F_CPU / 8000)); + } + #endif // __SAM3X8E__ + + void delay_us(unsigned long us) { DELAY_US(us); } + + void delay_ms(unsigned long ms) { + if (flags.printer_killed) + DELAY_US(ms * 1000); + else + safe_delay(ms); + } + + void yield() { + if (!flags.printer_killed) thermalManager.manage_heater(); + } + + void enableHeater(const extruder_t extruder) { + #if HAS_HOTEND && HEATER_IDLE_HANDLER + thermalManager.reset_hotend_idle_timer(extruder - E0); + #else + UNUSED(extruder); + #endif + } + + void enableHeater(const heater_t heater) { + #if HEATER_IDLE_HANDLER + switch (heater) { + #if HAS_HEATED_BED + case BED: thermalManager.reset_bed_idle_timer(); return; + #endif + TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return); // Chamber has no idle timer + default: + TERN_(HAS_HOTEND, thermalManager.reset_hotend_idle_timer(heater - H0)); + break; + } + #else + UNUSED(heater); + #endif + } + + #if ENABLED(JOYSTICK) + /** + * Jogs in the direction given by the vector (dx, dy, dz). + * The values range from -1 to 1 mapping to the maximum + * feedrate for an axis. + * + * The axis will continue to jog until this function is + * called with all zeros. + */ + void jog(const xyz_float_t &dir) { + // The "destination" variable is used as a scratchpad in + // Marlin by GCODE routines, but should remain untouched + // during manual jogging, allowing us to reuse the space + // for our direction vector. + destination = dir; + flags.jogging = !NEAR_ZERO(dir.x) || !NEAR_ZERO(dir.y) || !NEAR_ZERO(dir.z); + } + + // Called by the polling routine in "joystick.cpp" + void _joystick_update(xyz_float_t &norm_jog) { + if (flags.jogging) { + #define OUT_OF_RANGE(VALUE) (VALUE < -1.0f || VALUE > 1.0f) + + if (OUT_OF_RANGE(destination.x) || OUT_OF_RANGE(destination.y) || OUT_OF_RANGE(destination.z)) { + // If destination on any axis is out of range, it + // probably means the UI forgot to stop jogging and + // ran GCODE that wrote a position to destination. + // To prevent a disaster, stop jogging. + flags.jogging = false; + return; + } + norm_jog = destination; + } + } + #endif + + bool isHeaterIdle(const extruder_t extruder) { + #if HAS_HOTEND && HEATER_IDLE_HANDLER + return thermalManager.heater_idle[extruder - E0].timed_out; + #else + UNUSED(extruder); + return false; + #endif + } + + bool isHeaterIdle(const heater_t heater) { + #if HEATER_IDLE_HANDLER + switch (heater) { + TERN_(HAS_HEATED_BED, case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); + TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return false); // Chamber has no idle timer + default: + return TERN0(HAS_HOTEND, thermalManager.heater_idle[heater - H0].timed_out); + } + #else + UNUSED(heater); + return false; + #endif + } + + #ifdef TOUCH_UI_LCD_TEMP_SCALING + #define GET_TEMP_ADJUSTMENT(A) float(A)/TOUCH_UI_LCD_TEMP_SCALING + #else + #define GET_TEMP_ADJUSTMENT(A) A + #endif + + float getActualTemp_celsius(const heater_t heater) { + switch (heater) { + TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed())); + TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degChamber())); + default: return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(heater - H0)); + } + } + + float getActualTemp_celsius(const extruder_t extruder) { + return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(extruder - E0)); + } + + float getTargetTemp_celsius(const heater_t heater) { + switch (heater) { + TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed())); + TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetChamber())); + default: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(heater - H0)); + } + } + + float getTargetTemp_celsius(const extruder_t extruder) { + return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(extruder - E0)); + } + + float getTargetFan_percent(const fan_t fan) { + #if HAS_FAN + return thermalManager.fanPercent(thermalManager.fan_speed[fan - FAN0]); + #else + UNUSED(fan); + return 0; + #endif + } + + float getActualFan_percent(const fan_t fan) { + #if HAS_FAN + return thermalManager.fanPercent(thermalManager.scaledFanSpeed(fan - FAN0)); + #else + UNUSED(fan); + return 0; + #endif + } + + float getAxisPosition_mm(const axis_t axis) { + return TERN_(JOYSTICK, flags.jogging ? destination[axis] :) current_position[axis]; + } + + float getAxisPosition_mm(const extruder_t extruder) { + const extruder_t old_tool = getActiveTool(); + setActiveTool(extruder, true); + const float epos = TERN_(JOYSTICK, flags.jogging ? destination.e :) current_position.e; + setActiveTool(old_tool, true); + return epos; + } + + void setAxisPosition_mm(const float position, const axis_t axis, const feedRate_t feedrate/*=0*/) { + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max); + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z) { + max = SQRT(sq(float(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y - axis])); // (Y - axis) == the other axis + min = -max; + } + #endif + + current_position[axis] = constrain(position, min, max); + line_to_current_position(feedrate ?: manual_feedrate_mm_s[axis]); + } + + 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(feedrate ?: manual_feedrate_mm_s.e); + } + + void setActiveTool(const extruder_t extruder, bool no_move) { + #if HAS_MULTI_EXTRUDER + const uint8_t e = extruder - E0; + if (e != active_extruder) tool_change(e, no_move); + active_extruder = e; + #else + UNUSED(extruder); + UNUSED(no_move); + #endif + } + + extruder_t getActiveTool() { + switch (active_extruder) { + case 5: return E5; + case 4: return E4; + case 3: return E3; + case 2: return E2; + case 1: return E1; + default: return E0; + } + } + + bool isMoving() { return planner.has_blocks_queued(); } + + bool canMove(const axis_t axis) { + switch (axis) { + #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING) + case X: return TEST(axis_homed, X_AXIS); + case Y: return TEST(axis_homed, Y_AXIS); + case Z: return TEST(axis_homed, Z_AXIS); + #else + case X: case Y: case Z: return true; + #endif + default: return false; + } + } + + bool canMove(const extruder_t extruder) { + return !thermalManager.tooColdToExtrude(extruder - E0); + } + + #if HAS_SOFTWARE_ENDSTOPS + bool getSoftEndstopState() { return soft_endstop._enabled; } + void setSoftEndstopState(const bool value) { soft_endstop._enabled = value; } + #endif + + #if HAS_TRINAMIC_CONFIG + float getAxisCurrent_mA(const axis_t axis) { + switch (axis) { + #if AXIS_IS_TMC(X) + case X: return stepperX.getMilliamps(); + #endif + #if AXIS_IS_TMC(X2) + case X2: return stepperX2.getMilliamps(); + #endif + #if AXIS_IS_TMC(Y) + case Y: return stepperY.getMilliamps(); + #endif + #if AXIS_IS_TMC(Y2) + case Y2: return stepperY2.getMilliamps(); + #endif + #if AXIS_IS_TMC(Z) + case Z: return stepperZ.getMilliamps(); + #endif + #if AXIS_IS_TMC(Z2) + case Z2: return stepperZ2.getMilliamps(); + #endif + default: return NAN; + }; + } + + float getAxisCurrent_mA(const extruder_t extruder) { + switch (extruder) { + #if AXIS_IS_TMC(E0) + case E0: return stepperE0.getMilliamps(); + #endif + #if AXIS_IS_TMC(E1) + case E1: return stepperE1.getMilliamps(); + #endif + #if AXIS_IS_TMC(E2) + case E2: return stepperE2.getMilliamps(); + #endif + #if AXIS_IS_TMC(E3) + case E3: return stepperE3.getMilliamps(); + #endif + #if AXIS_IS_TMC(E4) + case E4: return stepperE4.getMilliamps(); + #endif + #if AXIS_IS_TMC(E5) + case E5: return stepperE5.getMilliamps(); + #endif + #if AXIS_IS_TMC(E6) + case E6: return stepperE6.getMilliamps(); + #endif + #if AXIS_IS_TMC(E7) + case E7: return stepperE7.getMilliamps(); + #endif + default: return NAN; + }; + } + + void setAxisCurrent_mA(const float mA, const axis_t axis) { + switch (axis) { + #if AXIS_IS_TMC(X) + case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(X2) + case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(Y) + case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(Y2) + case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(Z) + case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(Z2) + case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break; + #endif + default: break; + }; + } + + void setAxisCurrent_mA(const float mA, const extruder_t extruder) { + switch (extruder) { + #if AXIS_IS_TMC(E0) + case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E1) + case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E2) + case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E3) + case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E4) + case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E5) + case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E6) + case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break; + #endif + #if AXIS_IS_TMC(E7) + case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break; + #endif + default: break; + }; + } + + int getTMCBumpSensitivity(const axis_t axis) { + switch (axis) { + TERN_(X_SENSORLESS, case X: return stepperX.homing_threshold()); + TERN_(X2_SENSORLESS, case X2: return stepperX2.homing_threshold()); + TERN_(Y_SENSORLESS, case Y: return stepperY.homing_threshold()); + TERN_(Y2_SENSORLESS, case Y2: return stepperY2.homing_threshold()); + TERN_(Z_SENSORLESS, case Z: return stepperZ.homing_threshold()); + TERN_(Z2_SENSORLESS, case Z2: return stepperZ2.homing_threshold()); + TERN_(Z3_SENSORLESS, case Z3: return stepperZ3.homing_threshold()); + TERN_(Z4_SENSORLESS, case Z4: return stepperZ4.homing_threshold()); + default: return 0; + } + } + + void setTMCBumpSensitivity(const float value, const axis_t axis) { + switch (axis) { + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + #if X_SENSORLESS + case X: stepperX.homing_threshold(value); break; + #endif + #if X2_SENSORLESS + case X2: stepperX2.homing_threshold(value); break; + #endif + #if Y_SENSORLESS + case Y: stepperY.homing_threshold(value); break; + #endif + #if Y2_SENSORLESS + case Y2: stepperY2.homing_threshold(value); break; + #endif + #if Z_SENSORLESS + case Z: stepperZ.homing_threshold(value); break; + #endif + #if Z2_SENSORLESS + case Z2: stepperZ2.homing_threshold(value); break; + #endif + #if Z3_SENSORLESS + case Z3: stepperZ3.homing_threshold(value); break; + #endif + #if Z4_SENSORLESS + case Z4: stepperZ4.homing_threshold(value); break; + #endif + #else + UNUSED(value); + #endif + default: break; + } + } + #endif + + float getAxisSteps_per_mm(const axis_t axis) { + return planner.settings.axis_steps_per_mm[axis]; + } + + float getAxisSteps_per_mm(const extruder_t extruder) { + UNUSED_E(extruder); + return planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)]; + } + + void setAxisSteps_per_mm(const float value, const axis_t axis) { + planner.settings.axis_steps_per_mm[axis] = value; + planner.refresh_positioning(); + } + + void setAxisSteps_per_mm(const float value, const extruder_t extruder) { + UNUSED_E(extruder); + planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; + planner.refresh_positioning(); + } + + feedRate_t getAxisMaxFeedrate_mm_s(const axis_t axis) { + return planner.settings.max_feedrate_mm_s[axis]; + } + + feedRate_t getAxisMaxFeedrate_mm_s(const extruder_t extruder) { + UNUSED_E(extruder); + return planner.settings.max_feedrate_mm_s[E_AXIS_N(extruder - E0)]; + } + + void setAxisMaxFeedrate_mm_s(const feedRate_t value, const axis_t axis) { + planner.set_max_feedrate(axis, value); + } + + void setAxisMaxFeedrate_mm_s(const feedRate_t value, const extruder_t extruder) { + UNUSED_E(extruder); + planner.set_max_feedrate(E_AXIS_N(extruder - E0), value); + } + + float getAxisMaxAcceleration_mm_s2(const axis_t axis) { + return planner.settings.max_acceleration_mm_per_s2[axis]; + } + + float getAxisMaxAcceleration_mm_s2(const extruder_t extruder) { + UNUSED_E(extruder); + return planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(extruder - E0)]; + } + + void setAxisMaxAcceleration_mm_s2(const float value, const axis_t axis) { + planner.set_max_acceleration(axis, value); + planner.reset_acceleration_rates(); + } + + void setAxisMaxAcceleration_mm_s2(const float value, const extruder_t extruder) { + UNUSED_E(extruder); + planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); + planner.reset_acceleration_rates(); + } + + #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(); } + void setFilamentRunoutDistance_mm(const float value) { runout.set_runout_distance(constrain(value, 0, 999)); } + #endif + #endif + + #if ENABLED(CASE_LIGHT_ENABLE) + bool getCaseLightState() { return caselight.on; } + void setCaseLightState(const bool value) { + caselight.on = value; + caselight.update_enabled(); + } + + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } + void setCaseLightBrightness_percent(const float value) { + caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); + caselight.update_brightness(); + } + #endif + #endif + + #if ENABLED(LIN_ADVANCE) + float getLinearAdvance_mm_mm_s(const extruder_t extruder) { + return (extruder < EXTRUDERS) ? planner.extruder_advance_K[extruder - E0] : 0; + } + + void setLinearAdvance_mm_mm_s(const float value, const extruder_t extruder) { + if (extruder < EXTRUDERS) + planner.extruder_advance_K[extruder - E0] = constrain(value, 0, 999); + } + #endif + + #if HAS_JUNCTION_DEVIATION + + float getJunctionDeviation_mm() { + return planner.junction_deviation_mm; + } + + void setJunctionDeviation_mm(const float value) { + planner.junction_deviation_mm = constrain(value, 0.001, 0.3); + TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); + } + + #else + + float getAxisMaxJerk_mm_s(const axis_t axis) { + return planner.max_jerk[axis]; + } + + float getAxisMaxJerk_mm_s(const extruder_t) { + return planner.max_jerk.e; + } + + void setAxisMaxJerk_mm_s(const float value, const axis_t axis) { + planner.set_max_jerk((AxisEnum)axis, value); + } + + void setAxisMaxJerk_mm_s(const float value, const extruder_t) { + planner.set_max_jerk(E_AXIS, value); + } + #endif + + feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } + int16_t getFlowPercentage(const extruder_t extr) { return planner.flow_percentage[extr]; } + feedRate_t getMinFeedrate_mm_s() { return planner.settings.min_feedrate_mm_s; } + feedRate_t getMinTravelFeedrate_mm_s() { return planner.settings.min_travel_feedrate_mm_s; } + float getPrintingAcceleration_mm_s2() { return planner.settings.acceleration; } + float getRetractAcceleration_mm_s2() { return planner.settings.retract_acceleration; } + float getTravelAcceleration_mm_s2() { return planner.settings.travel_acceleration; } + void setFeedrate_mm_s(const feedRate_t fr) { feedrate_mm_s = fr; } + void setFlow_percent(const int16_t flow, const extruder_t extr) { planner.set_flow(extr, flow); } + void setMinFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_feedrate_mm_s = fr; } + void setMinTravelFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_travel_feedrate_mm_s = fr; } + void setPrintingAcceleration_mm_s2(const float acc) { planner.settings.acceleration = acc; } + void setRetractAcceleration_mm_s2(const float acc) { planner.settings.retract_acceleration = acc; } + void setTravelAcceleration_mm_s2(const float acc) { planner.settings.travel_acceleration = acc; } + + #if ENABLED(BABYSTEPPING) + bool babystepAxis_steps(const int16_t steps, const axis_t axis) { + switch (axis) { + #if ENABLED(BABYSTEP_XY) + case X: babystep.add_steps(X_AXIS, steps); break; + case Y: babystep.add_steps(Y_AXIS, steps); break; + #endif + case Z: babystep.add_steps(Z_AXIS, steps); break; + default: return false; + }; + return true; + } + + /** + * This function adjusts an axis during a print. + * + * When linked_nozzles is false, each nozzle in a multi-nozzle + * printer can be babystepped independently of the others. This + * lets the user to fine tune the Z-offset and Nozzle Offsets + * while observing the first layer of a print, regardless of + * what nozzle is printing. + */ + void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles) { + const float mm = steps * planner.steps_to_mm[axis]; + UNUSED(mm); + + if (!babystepAxis_steps(steps, axis)) return; + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + // Make it so babystepping in Z adjusts the Z probe offset. + if (axis == Z && TERN1(HAS_MULTI_EXTRUDER, (linked_nozzles || active_extruder == 0))) + probe.offset.z += mm; + #endif + + #if HAS_MULTI_EXTRUDER && HAS_HOTEND_OFFSET + /** + * When linked_nozzles is false, as an axis is babystepped + * adjust the hotend offsets so that the other nozzles are + * unaffected by the babystepping of the active nozzle. + */ + if (!linked_nozzles) { + HOTEND_LOOP() + if (e != active_extruder) + hotend_offset[e][axis] += mm; + + normalizeNozzleOffset(X); + normalizeNozzleOffset(Y); + normalizeNozzleOffset(Z); + } + #else + UNUSED(linked_nozzles); + #endif + } + + /** + * Converts a mm displacement to a number of whole number of + * steps that is at least mm long. + */ + int16_t mmToWholeSteps(const float mm, const axis_t axis) { + const float steps = mm / planner.steps_to_mm[axis]; + return steps > 0 ? CEIL(steps) : FLOOR(steps); + } + #endif + + float getZOffset_mm() { + return (0.0f + #if HAS_BED_PROBE + + probe.offset.z + #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) + + planner.steps_to_mm[Z_AXIS] * babystep.axis_total[BS_AXIS_IND(Z_AXIS)] + #endif + ); + } + + void setZOffset_mm(const float value) { + #if HAS_BED_PROBE + if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) + probe.offset.z = value; + #elif ENABLED(BABYSTEP_DISPLAY_TOTAL) + babystep.add_mm(Z_AXIS, value - getZOffset_mm()); + #else + UNUSED(value); + #endif + } + + #if HAS_HOTEND_OFFSET + + float getNozzleOffset_mm(const axis_t axis, const extruder_t extruder) { + if (extruder - E0 >= HOTENDS) return 0; + return hotend_offset[extruder - E0][axis]; + } + + void setNozzleOffset_mm(const float value, const axis_t axis, const extruder_t extruder) { + if (extruder - E0 >= HOTENDS) return; + hotend_offset[extruder - E0][axis] = value; + } + + /** + * The UI should call this if needs to guarantee the first + * nozzle offset is zero (such as when it doesn't allow the + * user to edit the offset the first nozzle). + */ + void normalizeNozzleOffset(const axis_t axis) { + const float offs = hotend_offset[0][axis]; + HOTEND_LOOP() hotend_offset[e][axis] -= offs; + } + + #endif // HAS_HOTEND_OFFSET + + #if HAS_BED_PROBE + float getProbeOffset_mm(const axis_t axis) { + return probe.offset.pos[axis]; + } + void setProbeOffset_mm(const float val, const axis_t axis) { + probe.offset.pos[axis] = val; + } + #endif + + #if ENABLED(BACKLASH_GCODE) + float getAxisBacklash_mm(const axis_t axis) { return backlash.distance_mm[axis]; } + void setAxisBacklash_mm(const float value, const axis_t axis) + { backlash.distance_mm[axis] = constrain(value,0,5); } + + float getBacklashCorrection_percent() { return ui8_to_percent(backlash.correction); } + void setBacklashCorrection_percent(const float value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } + + #ifdef BACKLASH_SMOOTHING_MM + float getBacklashSmoothing_mm() { return backlash.smoothing_mm; } + void setBacklashSmoothing_mm(const float value) { backlash.smoothing_mm = constrain(value, 0, 999); } + #endif + #endif + + uint8_t getProgress_percent() { + return ui.get_progress_percent(); + } + + uint32_t getProgress_seconds_elapsed() { + const duration_t elapsed = print_job_timer.duration(); + return elapsed.value; + } + + #if HAS_LEVELING + bool getLevelingActive() { return planner.leveling_active; } + void setLevelingActive(const bool state) { set_bed_leveling_enabled(state); } + bool getMeshValid() { return leveling_is_valid(); } + #if HAS_MESH + bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } + float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } + void setMeshPoint(const xy_uint8_t &pos, const float zoff) { + if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { + Z_VALUES(pos.x, pos.y) = zoff; + TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); + } + } + #endif + #endif + + #if ENABLED(HOST_PROMPT_SUPPORT) + void setHostResponse(const uint8_t response) { host_response_handler(response); } + #endif + + #if ENABLED(PRINTCOUNTER) + char* getTotalPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().totalPrints)); return buffer; } + char* getFinishedPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().finishedPrints)); return buffer; } + char* getTotalPrintTime_str(char buffer[21]) { return duration_t(print_job_timer.getStats().printTime).toString(buffer); } + char* getLongestPrint_str(char buffer[21]) { return duration_t(print_job_timer.getStats().longestPrint).toString(buffer); } + char* getFilamentUsed_str(char buffer[21]) { + printStatistics stats = print_job_timer.getStats(); + sprintf_P(buffer, PSTR("%ld.%im"), long(stats.filamentUsed / 1000), int16_t(stats.filamentUsed / 100) % 10); + return buffer; + } + #endif + + float getFeedrate_percent() { return feedrate_percentage; } + + #if ENABLED(PIDTEMP) + float getPIDValues_Kp(const extruder_t tool) { return PID_PARAM(Kp, tool); } + float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); } + float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); } + + void setPIDValues(const float p, const float i, const float d, extruder_t tool) { + thermalManager.temp_hotend[tool].pid.Kp = p; + thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i); + thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d); + thermalManager.updatePID(); + } + + void startPIDTune(const float temp, extruder_t tool) { + thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); + } + #endif + + #if ENABLED(PIDTEMPBED) + float getBedPIDValues_Kp() { return thermalManager.temp_bed.pid.Kp; } + float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); } + float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); } + + void setBedPIDValues(const float p, const float i, const float d) { + thermalManager.temp_bed.pid.Kp = p; + thermalManager.temp_bed.pid.Ki = scalePID_i(i); + thermalManager.temp_bed.pid.Kd = scalePID_d(d); + thermalManager.updatePID(); + } + + void startBedPIDTune(const float temp) { + thermalManager.PID_autotune(temp, H_BED, 4, true); + } + #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()); } + + bool isAxisPositionKnown(const axis_t axis) { return TEST(axis_known_position, axis); } + bool isAxisPositionKnown(const extruder_t) { return TEST(axis_known_position, E_AXIS); } + bool isPositionKnown() { return all_axes_known(); } + bool isMachineHomed() { return all_axes_homed(); } + + PGM_P getFirmwareName_str() { + static PGMSTR(firmware_name, "Marlin " SHORT_BUILD_VERSION); + return firmware_name; + } + + void setTargetTemp_celsius(float value, const heater_t heater) { + #ifdef TOUCH_UI_LCD_TEMP_SCALING + value *= TOUCH_UI_LCD_TEMP_SCALING; + #endif + enableHeater(heater); + #if HAS_HEATED_CHAMBER + if (heater == CHAMBER) + thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); + else + #endif + #if HAS_HEATED_BED + if (heater == BED) + thermalManager.setTargetBed(LROUND(constrain(value, 0, BED_MAX_TARGET))); + else + #endif + { + #if HAS_HOTEND + const int16_t e = heater - H0; + thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); + #endif + } + } + + void setTargetTemp_celsius(float value, const extruder_t extruder) { + #ifdef TOUCH_UI_LCD_TEMP_SCALING + value *= TOUCH_UI_LCD_TEMP_SCALING; + #endif + #if HAS_HOTEND + const int16_t e = extruder - E0; + enableHeater(extruder); + thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); + #endif + } + + void setTargetFan_percent(const float value, const fan_t fan) { + #if HAS_FAN + if (fan < FAN_COUNT) + thermalManager.set_fan_speed(fan - FAN0, map(constrain(value, 0, 100), 0, 100, 0, 255)); + #else + UNUSED(value); + UNUSED(fan); + #endif + } + + void setFeedrate_percent(const float value) { + feedrate_percentage = constrain(value, 10, 500); + } + + void setUserConfirmed() { + TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); + } + + void printFile(const char *filename) { + UNUSED(filename); + IFSD(card.openAndPrintFile(filename), NOOP); + } + + bool isPrintingFromMediaPaused() { + return IFSD(isPrintingFromMedia() && !IS_SD_PRINTING(), false); + } + + bool isPrintingFromMedia() { + #if ENABLED(SDSUPPORT) + // Account for when IS_SD_PRINTING() reports the end of the + // print when there is still SD card data in the planner. + flags.was_sd_printing = card.isFileOpen() || (flags.was_sd_printing && commandsInQueue()); + return flags.was_sd_printing; + #else + return false; + #endif + } + + bool isPrinting() { + return (commandsInQueue() || isPrintingFromMedia() || IFSD(IS_SD_PRINTING(), false)); + } + + bool isMediaInserted() { + return IFSD(IS_SD_INSERTED() && card.isMounted(), false); + } + + void pausePrint() { ui.pause_print(); } + void resumePrint() { ui.resume_print(); } + void stopPrint() { ui.abort_print(); } + + void onUserConfirmRequired_P(PGM_P const pstr) { + char msg[strlen_P(pstr) + 1]; + strcpy_P(msg, pstr); + onUserConfirmRequired(msg); + } + + void onStatusChanged_P(PGM_P const pstr) { + char msg[strlen_P(pstr) + 1]; + strcpy_P(msg, pstr); + onStatusChanged(msg); + } + + FileList::FileList() { refresh(); } + + void FileList::refresh() { num_files = 0xFFFF; } + + bool FileList::seek(const uint16_t pos, const bool skip_range_check) { + #if ENABLED(SDSUPPORT) + if (!skip_range_check && (pos + 1) > count()) return false; + card.getfilename_sorted(SD_ORDER(pos, count())); + return card.filename[0] != '\0'; + #else + UNUSED(pos); + UNUSED(skip_range_check); + return false; + #endif + } + + const char* FileList::filename() { + return IFSD(card.longFilename[0] ? card.longFilename : card.filename, ""); + } + + const char* FileList::shortFilename() { + return IFSD(card.filename, ""); + } + + const char* FileList::longFilename() { + return IFSD(card.longFilename, ""); + } + + bool FileList::isDir() { + return IFSD(card.flag.filenameIsDir, false); + } + + uint16_t FileList::count() { + return IFSD((num_files = (num_files == 0xFFFF ? card.get_num_Files() : num_files)), 0); + } + + bool FileList::isAtRootDir() { + return IFSD(card.flag.workDirIsRoot, true); + } + + void FileList::upDir() { + #if ENABLED(SDSUPPORT) + card.cdup(); + num_files = 0xFFFF; + #endif + } + + void FileList::changeDir(const char * const dirname) { + #if ENABLED(SDSUPPORT) + card.cd(dirname); + num_files = 0xFFFF; + #else + UNUSED(dirname); + #endif + } + +} // namespace ExtUI + +// At the moment, we piggy-back off the ultralcd calls, but this could be cleaned up in the future + +void MarlinUI::init() { + ExtUI::onStartup(); +} + +void MarlinUI::update() { ExtUI::onIdle(); } + +void MarlinUI::kill_screen(PGM_P const error, PGM_P const component) { + using namespace ExtUI; + if (!flags.printer_killed) { + flags.printer_killed = true; + onPrinterKilled(error, component); + } +} + +#endif // EXTENSIBLE_UI diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h new file mode 100644 index 00000000..15122ec6 --- /dev/null +++ b/Marlin/src/lcd/extui/ui_api.h @@ -0,0 +1,383 @@ +/** + * 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 + +/************ + * ui_api.h * + ************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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 "../../inc/MarlinConfig.h" + +namespace ExtUI { + + // The ExtUI implementation can store up to this many bytes + // in the EEPROM when the methods onStoreSettings and + // onLoadSettings are called. + + static constexpr size_t eeprom_data_size = 48; + + enum axis_t : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4 }; + enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; + enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER }; + enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; + enum result_t : uint8_t { PID_BAD_EXTRUDER_NUM, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; + + constexpr uint8_t extruderCount = EXTRUDERS; + constexpr uint8_t hotendCount = HOTENDS; + constexpr uint8_t fanCount = FAN_COUNT; + + #if HAS_MESH + typedef float bed_mesh_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + #endif + + bool isMoving(); + bool isAxisPositionKnown(const axis_t); + bool isAxisPositionKnown(const extruder_t); + bool isPositionKnown(); // Axis position guaranteed, steppers active since homing + bool isMachineHomed(); // Axis position most likely correct, steppers may have deactivated + 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); + bool isHeaterIdle(const extruder_t); + void enableHeater(const heater_t); + void enableHeater(const extruder_t); + + #if ENABLED(JOYSTICK) + void jog(const xyz_float_t &dir); + void _joystick_update(xyz_float_t &norm_jog); + #endif + + /** + * Getters and setters + * Should be used by the EXTENSIBLE_UI to query or change Marlin's state. + */ + PGM_P getFirmwareName_str(); + + #if HAS_SOFTWARE_ENDSTOPS + bool getSoftEndstopState(); + void setSoftEndstopState(const bool); + #endif + + #if HAS_TRINAMIC_CONFIG + float getAxisCurrent_mA(const axis_t); + float getAxisCurrent_mA(const extruder_t); + void setAxisCurrent_mA(const float, const axis_t); + void setAxisCurrent_mA(const float, const extruder_t); + + int getTMCBumpSensitivity(const axis_t); + void setTMCBumpSensitivity(const float, const axis_t); + #endif + + float getActualTemp_celsius(const heater_t); + float getActualTemp_celsius(const extruder_t); + float getTargetTemp_celsius(const heater_t); + float getTargetTemp_celsius(const extruder_t); + float getTargetFan_percent(const fan_t); + float getActualFan_percent(const fan_t); + float getAxisPosition_mm(const axis_t); + float getAxisPosition_mm(const extruder_t); + float getAxisSteps_per_mm(const axis_t); + float getAxisSteps_per_mm(const extruder_t); + feedRate_t getAxisMaxFeedrate_mm_s(const axis_t); + feedRate_t getAxisMaxFeedrate_mm_s(const extruder_t); + float getAxisMaxAcceleration_mm_s2(const axis_t); + float getAxisMaxAcceleration_mm_s2(const extruder_t); + feedRate_t getMinFeedrate_mm_s(); + feedRate_t getMinTravelFeedrate_mm_s(); + float getPrintingAcceleration_mm_s2(); + float getRetractAcceleration_mm_s2(); + float getTravelAcceleration_mm_s2(); + float getFeedrate_percent(); + int16_t getFlowPercentage(const extruder_t); + uint8_t getProgress_percent(); + uint32_t getProgress_seconds_elapsed(); + + #if HAS_LEVELING + bool getLevelingActive(); + void setLevelingActive(const bool); + bool getMeshValid(); + #if HAS_MESH + bed_mesh_t& getMeshArray(); + float getMeshPoint(const xy_uint8_t &pos); + void setMeshPoint(const xy_uint8_t &pos, const float zval); + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); + inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } + + typedef enum : unsigned char { + MESH_START, // Prior to start of probe + MESH_FINISH, // Following probe of all points + PROBE_START, // Beginning probe of grid location + PROBE_FINISH // Finished probe of grid location + } probe_state_t; + void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state); + inline void onMeshUpdate(const xy_int8_t &pos, probe_state_t state) { onMeshUpdate(pos.x, pos.y, state); } + #endif + #endif + + #if ENABLED(HOST_PROMPT_SUPPORT) + void setHostResponse(const uint8_t); + #endif + + #if ENABLED(PRINTCOUNTER) + char* getTotalPrints_str(char buffer[21]); + char* getFinishedPrints_str(char buffer[21]); + char* getTotalPrintTime_str(char buffer[21]); + char* getLongestPrint_str(char buffer[21]); + char* getFilamentUsed_str(char buffer[21]); + #endif + + 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, 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); + void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); + void setAxisMaxAcceleration_mm_s2(const float, const axis_t); + void setAxisMaxAcceleration_mm_s2(const float, const extruder_t); + void setFeedrate_mm_s(const feedRate_t); + void setMinFeedrate_mm_s(const feedRate_t); + void setMinTravelFeedrate_mm_s(const feedRate_t); + void setPrintingAcceleration_mm_s2(const float); + void setRetractAcceleration_mm_s2(const float); + void setTravelAcceleration_mm_s2(const float); + void setFeedrate_percent(const float); + void setFlow_percent(const int16_t, const extruder_t); + void setUserConfirmed(); + + #if ENABLED(LIN_ADVANCE) + float getLinearAdvance_mm_mm_s(const extruder_t); + void setLinearAdvance_mm_mm_s(const float, const extruder_t); + #endif + + #if HAS_JUNCTION_DEVIATION + float getJunctionDeviation_mm(); + void setJunctionDeviation_mm(const float); + #else + float getAxisMaxJerk_mm_s(const axis_t); + float getAxisMaxJerk_mm_s(const extruder_t); + void setAxisMaxJerk_mm_s(const float, const axis_t); + void setAxisMaxJerk_mm_s(const float, const extruder_t); + #endif + + extruder_t getActiveTool(); + void setActiveTool(const extruder_t, bool no_move); + + #if ENABLED(BABYSTEPPING) + int16_t mmToWholeSteps(const float mm, const axis_t axis); + + bool babystepAxis_steps(const int16_t steps, const axis_t axis); + void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles); + #endif + + #if HAS_HOTEND_OFFSET + float getNozzleOffset_mm(const axis_t, const extruder_t); + void setNozzleOffset_mm(const float, const axis_t, const extruder_t); + void normalizeNozzleOffset(const axis_t axis); + #endif + + float getZOffset_mm(); + void setZOffset_mm(const float); + + #if HAS_BED_PROBE + float getProbeOffset_mm(const axis_t); + void setProbeOffset_mm(const float, const axis_t); + #endif + + #if ENABLED(BACKLASH_GCODE) + float getAxisBacklash_mm(const axis_t); + void setAxisBacklash_mm(const float, const axis_t); + + float getBacklashCorrection_percent(); + void setBacklashCorrection_percent(const float); + + #ifdef BACKLASH_SMOOTHING_MM + float getBacklashSmoothing_mm(); + void setBacklashSmoothing_mm(const float); + #endif + #endif + + #if HAS_FILAMENT_SENSOR + bool getFilamentRunoutEnabled(); + void setFilamentRunoutEnabled(const bool); + bool getFilamentRunoutState(); + void setFilamentRunoutState(const bool); + + #if HAS_FILAMENT_RUNOUT_DISTANCE + float getFilamentRunoutDistance_mm(); + void setFilamentRunoutDistance_mm(const float); + #endif + #endif + + #if ENABLED(CASE_LIGHT_ENABLE) + bool getCaseLightState(); + void setCaseLightState(const bool); + + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + float getCaseLightBrightness_percent(); + void setCaseLightBrightness_percent(const float); + #endif + #endif + + #if ENABLED(PIDTEMP) + float getPIDValues_Kp(const extruder_t); + float getPIDValues_Ki(const extruder_t); + float getPIDValues_Kd(const extruder_t); + void setPIDValues(const float, const float, const float, extruder_t); + void startPIDTune(const float, extruder_t); + #endif + + #if ENABLED(PIDTEMPBED) + float getBedPIDValues_Kp(); + float getBedPIDValues_Ki(); + float getBedPIDValues_Kd(); + void setBedPIDValues(const float, const float, const float); + void startBedPIDTune(const float); + #endif + + /** + * Delay and timing routines + * Should be used by the EXTENSIBLE_UI to safely pause or measure time + * safe_millis must be called at least every 1 sec to guarantee time + * yield should be called within lengthy loops + */ + #ifdef __SAM3X8E__ + uint32_t safe_millis(); + #else + FORCE_INLINE uint32_t safe_millis() { return millis(); } // TODO: Implement for AVR + #endif + + void delay_us(unsigned long us); + void delay_ms(unsigned long ms); + void yield(); + + /** + * Media access routines + * + * Should be used by the EXTENSIBLE_UI to operate on files + */ + bool isMediaInserted(); + bool isPrintingFromMediaPaused(); + bool isPrintingFromMedia(); + bool isPrinting(); + + void printFile(const char *filename); + void stopPrint(); + void pausePrint(); + void resumePrint(); + + class FileList { + private: + uint16_t num_files; + + public: + FileList(); + void refresh(); + bool seek(const uint16_t, const bool skip_range_check = false); + + const char *longFilename(); + const char *shortFilename(); + const char *filename(); + bool isDir(); + + void changeDir(const char * const dirname); + void upDir(); + bool isAtRootDir(); + uint16_t count(); + }; + + /** + * Event callback routines + * + * Should be declared by EXTENSIBLE_UI and will be called by Marlin + */ + void onStartup(); + void onIdle(); + void onMediaInserted(); + void onMediaError(); + void onMediaRemoved(); + void onPlayTone(const uint16_t frequency, const uint16_t duration); + void onPrinterKilled(PGM_P const error, PGM_P const component); + void onPrintTimerStarted(); + void onPrintTimerPaused(); + void onPrintTimerStopped(); + void onFilamentRunout(const extruder_t extruder); + void onUserConfirmRequired(const char * const msg); + void onUserConfirmRequired_P(PGM_P const pstr); + void onStatusChanged(const char * const msg); + void onStatusChanged_P(PGM_P const pstr); + void onFactoryReset(); + void onStoreSettings(char *); + void onLoadSettings(const char *); + void onConfigurationStoreWritten(bool success); + void onConfigurationStoreRead(bool success); + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume(); + #endif + #if HAS_PID_HEATING + void onPidTuning(const result_t rst); + #endif +}; + +/** + * Helper macros to increment or decrement a value. For example: + * + * UI_INCREMENT_BY(TargetTemp_celsius, 10, E0) + * + * Expands to: + * + * setTargetTemp_celsius(getTargetTemp_celsius(E0) + 10, E0); + * + * Or, in the case where a constant increment is desired: + * + * constexpr float increment = 10; + * + * UI_INCREMENT(TargetTemp_celsius, E0) + */ +#define UI_INCREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) + inc, ##__VA_ARGS__) +#define UI_DECREMENT_BY(method, inc, ...) ExtUI::set ## method(ExtUI::get ## method (__VA_ARGS__) - inc, ##__VA_ARGS__) + +#define UI_INCREMENT(method, ...) UI_INCREMENT_BY(method, increment, ##__VA_ARGS__) +#define UI_DECREMENT(method, ...) UI_DECREMENT_BY(method, increment, ##__VA_ARGS__) diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/fontutils.cpp new file mode 100644 index 00000000..5bf07e1b --- /dev/null +++ b/Marlin/src/lcd/fontutils.cpp @@ -0,0 +1,181 @@ +/** + * @file fontutils.cpp + * @brief help functions for font and char + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_WIRED_LCD + #include "ultralcd.h" + #include "../MarlinCore.h" +#endif + +#include "fontutils.h" + +uint8_t read_byte_ram(uint8_t * str) { + return *str; +} + +uint8_t read_byte_rom(uint8_t * str) { + return pgm_read_byte(str); +} + +/** + * @brief Using binary search to find the position by data_pin + * + * @param userdata : User's data + * @param num_data : the item number of the sorted data + * @param cb_comp : the callback function to compare the user's data and pin + * @param data_pin : The reference data to be found + * @param ret_idx : the position of the required data; If failed, then it is the failed position, which is the insert position if possible. + * + * @return 0 on found, <0 on failed(fail position is saved by ret_idx) + * + * Using binary search to find the position by data_pin. The user's data should be sorted. + */ +int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, void *data_pinpoint, size_t *ret_idx) { + int retcomp; + + if (num_data < 1) { + *ret_idx = 0; + return -1; + } + + size_t i = 0, ileft = 1, iright = num_data; + bool flg_found = false; + for (; ileft <= iright;) { + i = (ileft + iright) / 2 - 1; + /* cb_comp should return the *userdata[i] - *data_pinpoint */ + retcomp = cb_comp (userdata, i, data_pinpoint); + if (retcomp > 0) + iright = i; + else if (retcomp < 0) + ileft = i + 2; + else { + /* found ! */ + flg_found = true; + break; + } + } + + if (flg_found) { + *ret_idx = i; + return 0; + } + if (iright <= i) + *ret_idx = i; + else if (ileft >= i + 2) + *ret_idx = i + 1; + return -1; +} + +/* 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; + uint8_t *p = pstart; + + uint8_t valcur = cb_read_byte(p); + if (0 == (0x80 & valcur)) { + val = valcur; + p++; + } + else if (0xC0 == (0xE0 & valcur)) { + val = valcur & 0x1F; + val <<= 6; + p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xE0 == (0xF0 & valcur)) { + val = valcur & 0x0F; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xF0 == (0xF8 & valcur)) { + val = valcur & 0x07; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xF8 == (0xFC & valcur)) { + val = valcur & 0x03; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0xFC == (0xFE & valcur)) { + val = valcur & 0x01; + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + val <<= 6; p++; + valcur = cb_read_byte(p); + val |= (valcur & 0x3F); + p++; + } + else if (0x80 == (0xC0 & valcur)) + for (; 0x80 == (0xC0 & valcur); ) { p++; valcur = cb_read_byte(p); } + else + for (; ((0xFE & valcur) > 0xFC); ) { p++; valcur = cb_read_byte(p); } + + if (pval) *pval = val; + + return p; +} + +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 (;;) { + wchar_t ch; + pnext = get_utf8_value_cb(pnext, cb_read_byte, &ch); + if (!ch) break; + cnt++; + } + return cnt; +} + +uint8_t utf8_strlen(const char *pstart) { + return utf8_strlen_cb(pstart, read_byte_ram); +} + +uint8_t utf8_strlen_P(PGM_P pstart) { + return utf8_strlen_cb(pstart, read_byte_rom); +} diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/fontutils.h new file mode 100644 index 00000000..74c4a87f --- /dev/null +++ b/Marlin/src/lcd/fontutils.h @@ -0,0 +1,43 @@ +/** + * @file fontutils.h + * @brief help functions for font and char + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ +#pragma once + +#include +#include // wchar_t +#include // uint32_t + +#include "../HAL/shared/Marduino.h" +#include "../core/macros.h" + +// read a byte from ROM or RAM +typedef uint8_t (*read_byte_cb_t)(uint8_t * str); + +uint8_t read_byte_ram(uint8_t * str); +uint8_t read_byte_rom(uint8_t * str); + +// there's overflow of the wchar_t due to the 2-byte size in Arduino +// sizeof(wchar_t)=2; sizeof(size_t)=2; sizeof(uint32_t)=4; +// sizeof(int)=2; sizeof(long)=4; sizeof(unsigned)=2; +//#undef wchar_t +#define wchar_t uint32_t +//typedef uint32_t wchar_t; + +typedef uint16_t pixel_len_t; +#define PIXEL_LEN_NOLIMIT ((pixel_len_t)(-1)) + +/* Perform binary search */ +typedef int (* pf_bsearch_cb_comp_t)(void *userdata, size_t idx, void * data_pin); /*"data_list[idx] - *data_pin"*/ +int pf_bsearch_r(void *userdata, size_t num_data, pf_bsearch_cb_comp_t cb_comp, void *data_pinpoint, size_t *ret_idx); + +/* 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 length of string in CHARACTERS, NOT BYTES */ +uint8_t utf8_strlen(const char *pstart); +uint8_t utf8_strlen_P(PGM_P pstart); diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h new file mode 100644 index 00000000..a5030fcd --- /dev/null +++ b/Marlin/src/lcd/language/language_an.h @@ -0,0 +1,233 @@ +/** + * 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 + +/** + * Aragonese + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 +#define NOT_EXTENDED_ISO10646_1_5X7 + +namespace Language_an { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Aragonese"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" parada."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tarcheta mesa"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarcheta sacada"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu prencipal"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automatico"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Amortar motors"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Levar a l'orichen"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Orichen X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Orichen Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Orichen Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Orichen XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Encetar (pretar)"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Vinient punto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Nivelacion feita!"); + 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"); + #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"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover Eixes"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelar base"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar base"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidat"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Boquilla ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Base"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ixoriador"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Ixoriador ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxo ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Control"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temperatura Auto."); + PROGMEM Language_Str MSG_SELECT = _UxGT("Trigar"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Trigar *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Aceleracion"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vel. viache min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accel"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Acel. max") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Acel. max") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Acel. max") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Acel. max") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Acel. max *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acel. retrac."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acel. Viaje"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Trangos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" trangos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E trangos/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* trangos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Alzar memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar memoria"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restaurar memoria"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Tornar a cargar"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Informacion"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Achustar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresion"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Contin. impresion"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Detener Impresion"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Menu de SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No i hai tarcheta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Reposo..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Aguardand ordines"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impres. cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sin movimiento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("Aturada d'emerch."); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Aturada."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer F"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Devantar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet F"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retraccion auto."); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambear filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambear filamento *"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Encetan. tarcheta"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar tarcheta"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fuera"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancelado - Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Error: en calentar"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Error: temperatura"); + 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_HALTED = _UxGT("IMPRESORA ATURADA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Per favor reinic."); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Calentando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Calentando base..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibracion 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_INFO_MENU = _UxGT("Inf. Impresora"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Inf. Impresora"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadisticas Imp."); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Inf. Controlador"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusors"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Conteo de impresion"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tiempo total d'imp."); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresion mas larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total d'extrusion"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Mas larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrusion"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temperatura menima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temperatura maxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fuente de aliment"); + + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Fuerza d'o driver"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escri. DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Resumir imp."); + + // + // 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 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Aguardand iniciar", "d'o filamento", "cambear")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Meta o filamento", "y prete lo boton", "pa continar...")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Aguardand iniciar", "d'o fil. cambear")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Meta o filamento", "y prete lo boton")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Aguardando a", "expulsar filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Aguardando a", "cargar filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Aguardando impre.", "pa continar")); +} diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h new file mode 100644 index 00000000..dcb06e31 --- /dev/null +++ b/Marlin/src/lcd/language/language_bg.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 + +/** + * Bulgarian + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_5 + +namespace Language_bg { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Bulgarian"); + + 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 MSG_MAIN = _UxGT("Меню"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Автостарт"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Изкл. двигатели"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Паркиране"); + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Задай Начало"); + PROGMEM Language_Str MSG_SET_ORIGIN = _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; + + 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("Изкл. захранване"); + 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_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_SPEED = _UxGT("Скорост"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Дюза"); + PROGMEM Language_Str MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" Дюза ~"); + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Легло"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Вентилатор"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _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_AUTOTEMP = _UxGT("Авто-темп."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Вкл."); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Изкл."); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-откат"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-travel"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Стъпки/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("стъпки/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("стъпки/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("стъпки/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E стъпки/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* стъпки/mm"); + 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 in mm³"); + 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("Запази в EPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Зареди от EPROM"); + 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_PREPARE = _UxGT("Действия"); + PROGMEM Language_Str MSG_TUNE = _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_MEDIA_MENU = _UxGT("Меню карта"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Няма карта"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Почивка..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Изчакване"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _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("Откат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Смяна Откат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Откат V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Скок mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Възврат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Смяна Възврат mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Възврат V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Автоoткат"); + 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-сондата е извадена"); + 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_DELTA_CALIBRATE = _UxGT("Делта Калибровка"); + 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_KILL_EXPECTED_PRINTER = _UxGT("Неправилен принтер"); +} diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h new file mode 100644 index 00000000..0657c4a7 --- /dev/null +++ b/Marlin/src/lcd/language/language_ca.h @@ -0,0 +1,228 @@ +/** + * 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 + +/** + * Catalan + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +namespace Language_ca { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Catalan"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" preparada."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Targeta detectada."); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Targeta extreta."); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inici automatic"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactiva motors"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu de depuracio"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progres"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ves a l'origen"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X a origen"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y a origen"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z a origen"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Premeu per iniciar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Següent punt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Anivellament fet!"); + 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"); + #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"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retreu"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mou eixos"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Anivella llit"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Anivella llit"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Movent.."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY lliures"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mou X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mou Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mou Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mou %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mou 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mou 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mou 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocitat"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Llit Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozzle"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozzle ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Llit"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventilador"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. Ventilador ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flux"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flux ~"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VViatge min"); + + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Accel. retracc"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Accel. Viatge"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassos/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*passos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Moviment"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. Fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. Fil. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrast de LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Desa memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carrega memoria"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restaura valors"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualitza"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Pantalla Info."); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prepara"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ajusta"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa impressio"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Repren impressio"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Atura impressio."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimeix de SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("No hi ha targeta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("En repos..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Esperant usuari.."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Imp. cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sense moviment."); + PROGMEM Language_Str MSG_KILLED = _UxGT("MATAT."); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ATURADA."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retreu mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Retreure mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retreu V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Aixeca mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet +mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap DesRet +mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto retraccio"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Canvia filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Canvia filament *"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inicialitza SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Canvia SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z fora"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reinicia BLTouch"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s primer"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Decalatge Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropas X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropas Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropas Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Cancel. Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Error al escalfar"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP REDUNDANT"); + 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_HALTED = _UxGT("IMPRESSORA PARADA"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Reinicieu"); + 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("Escalfant..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Escalfant llit..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibratge Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra el centre"); + + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Quant a la impr."); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info Impressora"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadistiques"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info placa"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusors"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Llum"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Temps imprimint"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Treball mes llarg"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total extrudit"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Acabades"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Mes llarg"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudit"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp. mínima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp. màxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Font alimentacio"); + + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Força motor"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Repren impressió"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora incorrecta"); + + // + // 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("Esperant per", "iniciar el canvi", "de filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperant per", "treure filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Poseu filament", "i premeu el boto", "per continuar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premeu boto per", "escalfar nozzle.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Escalfant nozzle", "Espereu...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperant carrega", "de filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperant per", "reprendre")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Espereu...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Expulsant...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insereix i prem")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Escalfant...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Carregant...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprenent...")); + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h new file mode 100644 index 00000000..9cbd7042 --- /dev/null +++ b/Marlin/src/lcd/language/language_cz.h @@ -0,0 +1,598 @@ +/** + * 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 + +/** + * Czech + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + * + * Translated by Petr Zahradnik, Computer Laboratory + * Blog and video blog Zahradnik se bavi + * https://www.zahradniksebavi.cz + */ + +#define DISPLAY_CHARSET_ISO10646_CZ + +namespace Language_cz { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Czech"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" připraven."); + PROGMEM Language_Str MSG_YES = _UxGT("ANO"); + PROGMEM Language_Str MSG_NO = _UxGT("NE"); + PROGMEM Language_Str MSG_BACK = _UxGT("Zpět"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Rušení..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Médium vloženo"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Médium vyjmuto"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Čekání na médium"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba čtení média"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB odstraněno"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba USB"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znaku + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstopy"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavní nabídka"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Další nastavení"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurace"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolnit motory"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Nabídka ladění"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test ukaz. průběhu"); + #else + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. průběhu"); + #endif + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozice"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domů osa X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Domů osa Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Domů osa Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto srovnání Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Měření podložky"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknutím spusťte"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Další bod"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Měření hotovo!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Výška srovnávání"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnout laser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnout laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon laseru"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Vřeteno ovládání"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Vřeteno vyp"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Vřeteno zap"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Vřeteno výkon"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Vřeteno opačně"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnout napájení"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnout napájení"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačit (extr.)"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Zatlačit (retr.)"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Posunout osy"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnat podložku"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnat podložku"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnat rohy"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Další roh"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sítě"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upravit síť bodů"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Konec úprav sítě"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Měření bodu"); + 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("Hodnota Z"); + + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastní příkazy"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 test sondy"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 bod"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylka"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Režim IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofsety nástrojů"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikace"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrcadlení"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. tryska X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. tryska Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z"); + + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Provádím G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL nástroje"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Vyrovnání bodu"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuální síť bodů"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Vložte kartu, změřte"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Změřte"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Odstraňte a změřte"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Přesun na další"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovat UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovat UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Úprava sítě bodů"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upravit vlastní síť"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladit síť bodů"); + 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íť"); + #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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ruční zavedení..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Pevné zavední"); + 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("Pokračovat v síťi"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Síťové rovnání"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnání"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mřížkové rovnání"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Srovnat podložku"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Postranní body"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Typ sítě bodu"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exportovat síť"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Exportovat do PC"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Exportovat do CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Záloha do PC"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info o UBL do PC"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mřížky"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ruční hustota"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Chytrá hustota"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Zaplnit mřížku"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušit všechno"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušit poslední"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Upravit všechny"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upravit poslední"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Uložiště sítí"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Paměťový slot"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Načíst síť bodů"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Uložit síť bodů"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Síť %i načtena"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Síť %i uložena"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nedostatek místa"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Ch.: Uložit UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Ch.: Obnovit UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-ofset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Konec Z-ofsetu"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Postupně"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Studená síť bodů"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Chytrá hustota"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Zkontrolovat síť"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Upravit všechny"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Zkontrolovat síť"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Upravit všechny"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Uložit síť bodů"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavení LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Světla"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Světla Předvolby"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žlutá"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zelená"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Modrá"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bílá"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Výchozí"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastní světla"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Červená intenzita"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zelená intezita"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Modrá intenzita"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Bílá intenzita"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jas"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Posouvání..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Uvolnit XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunout X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunout Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunout Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunout o %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunout o 0,1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunout o 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunout o 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Rychlost"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Tryska ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Rychlost vent."); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Rychlost vent. ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ulož. vent. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Rychlost ex. vent."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Rychlost ex. vent. ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Průtok"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Průtok ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Ovládaní"); + 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(" fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autoteplota"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID automatika"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID automatika *"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Vybrat"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Vybrat *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Zrychl"); + 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("Odchylka spoje"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Rychlost"); + 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("Akcelerace"); + 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-retrakt"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-přejezd"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Kroků/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("kroků/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Ekroků/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*kroků/mm"); + 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_FILAMENT_DIAM = _UxGT("Fil. Prum."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Prum. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Vysunout mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Zavést mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K pro posun"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K pro posun *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Uložit nastavení"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Načíst nastavení"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Obnovit výchozí"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inic. EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aktualizace z SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reset tiskárny"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnovit"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info obrazovka"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Připrava tisku"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Doladění tisku"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Spustit tisk"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Další"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inicializace"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Tisk"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Zrušit"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Zpět"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Pokračovat"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastavit tisk"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnovit tisk"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastavit tisk"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Tisk objektu"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Zrušit objekt"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Zrušit objekt ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Obnova výpadku"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tisknout z SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Žádná SD karta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Uspáno..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Čekání na uživ..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Tisk pozastaven"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Tisknu..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Tisk zrušen"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Žádný pohyb."); + PROGMEM Language_Str MSG_KILLED = _UxGT("PŘERUSENO. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ZASTAVENO. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrakt mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výměna Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovat V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zvednuti Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Délka retrakce"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Délka zavedení"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Výměna nástroje"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvih Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Rychlost primár."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Rychlost retrak."); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Tryska standby"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Vyměnit filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Vyměnit filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Zavést filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Zavést filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Vysunout filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Vysunout filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunout vše"); + + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Načíst médium"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Vyměnit médium"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Vysunout médium"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z mimo podl"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Faktor zkosení"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch self-test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch reset"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch zasunout"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch vysunout"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("SW výsun BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch 5V režim"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch OD režim"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Uložit režim"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Nastavit 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Nastacit OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Vypsat nastavení"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VAROVANÍ: Špatné nastavení může způsobit škody! Pokračovat?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inic. TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z Ofsetu"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Uložiy"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("vysunout TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Vysunout Z-sondu"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Zasunout Z-sondu"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Domů %s%s%s první"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset"); + 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("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_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."); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPL. ÚNIK KOMORA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("VYSOKÁ TEPLOTA"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("NÍZKA TEPLOTA"); + 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"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Zahřívání..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Chlazení..."); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Zahřívání podložky"); + #else + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Zahřívání podl."); + #endif + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chlazení podložky"); + #else + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chlazení podl."); + #endif + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Zahřívání komory..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chlazení komory..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrace"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovat X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovat Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovat Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovat Střed"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta nastavení"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autokalibrace"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Nast.výšku delty"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Nast. Z-ofset"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rameno"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Výška"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Poloměr"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O tiskárně"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info o tiskárně"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-bodové rovnání"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineárni rovnání"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineární rovnání"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mřížkové rovnání"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistika"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info o desce"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudéry"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Rychlost"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Sledování úniku: VYP"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Sledování úniku: ZAP"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvětlení"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas světla"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("NESPRÁVNÁ TISKÁRNA"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Počet tisků"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončeno"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Celkový čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší tisk"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Celkem vytlačeno"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Tisky"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Nejdelší"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačeno"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Teplota min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Teplota max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Nap. zdroj"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Buzení motorů"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Motor %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Motor %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Motor %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Motor %"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC uložit EEPROM"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CHYBA SPOJENÍ"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMĚNA FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("TISK POZASTAVEN"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENÍ FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTÍ FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI OBNOVENÍ:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačit víc"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnovit tisk"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Délka mm senz.fil."); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkování selhalo"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrace selhala"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Aktual. MMU firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potř. pozornost."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Obnovit tisk"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Obnovování..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Zavést filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Zavést všechny"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zavést do trysky"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunout filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Vysun. filament ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vytáhnout filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádění fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vytahování fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysouvání fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Všechny"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetovat MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetování MMU..."); + 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_MIXER = _UxGT("Mixér"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Přechod"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Celý přechod"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Přepnout mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Střídat mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Přechod mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Opačný přechod"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástroj"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Spustit V-nástroj"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ukončit V-nástroj"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástroje"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Resetovat V-nástroj"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložit V-nástroj mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-nástroj resetovat"); + #else + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktivní V-nástr."); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Spustit V-nástr."); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Ukončit V-nástr."); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-nástr."); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reset. V-nástr."); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložit V-nás. mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-nástr. reset."); + #endif + PROGMEM Language_Str MSG_START_Z = _UxGT("Počáteční Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Koncové Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Hry"); + 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("Bludiště"); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlačítko", "pro obnovení tisku")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkování...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekejte prosím", "na zahájení", "výměny filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stiskněte", "tlačítko...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí trysky")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Čekejte prosím", "na nahřátí tr.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na vysunuti", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čekejte prosím", "na zavedení", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Vyčkejte na", "vytlačení")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klikněte pro", "ukončení", "vytlačování")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Čekejte prosím", "na pokračování", "tisku")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stikněte tlač.", "pro obnovení")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkování...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čekejte...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte, klikněte")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klikněte pro", "nahřátí")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nahřívání...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysouvání...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádění...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačování...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klikněte pro", "ukončení")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračování...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC budiče"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Proud budičů"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" za:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Vůle"); + 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("Korekce"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Vyhlazení"); +} diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h new file mode 100644 index 00000000..be9ad758 --- /dev/null +++ b/Marlin/src/lcd/language/language_da.h @@ -0,0 +1,202 @@ +/** + * 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 + +/** + * Danish + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_da { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Danish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" er klar"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kort isat"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kort fjernet"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Slå alle steppere fra"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); // G28 + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik når du er klar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Næste punkt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Bed level er færdig!"); + 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"); + #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"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Flyt akser"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Juster bed"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Juster bed"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Flyt X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Flyt Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Flyt Z"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Flyt %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Flyt 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Flyt 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Flyt 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Hastighed"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Plade Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dyse"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Dyse ~"); + + PROGMEM Language_Str MSG_BED = _UxGT("Plade"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Blæser hastighed"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Blæser hastighed ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrol"); + PROGMEM Language_Str MSG_MIN = _UxGT(" \002 Min"); + PROGMEM Language_Str MSG_MAX = _UxGT(" \002 Max"); + PROGMEM Language_Str MSG_FACTOR = _UxGT(" \002 Fact"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Til"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Fra"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Vælg"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Vælg *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retract"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-rejse"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Bevægelse"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E i mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gem i EEPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Hent fra EEPROM"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Gendan Defaults"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Genopfrisk"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info skærm"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Forbered"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause printet"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Forsæt printet"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop printet"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print fra SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Intet SD kort"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Dvale..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Venter på bruger..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print annulleret"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ingen bevægelse."); + PROGMEM Language_Str MSG_KILLED = _UxGT("DRÆBT. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPET. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Tilbagetræk mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Skift Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Tilbagetræk V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Skift Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Skift filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Skift filament *"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Skift SD kort"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Probe udenfor plade"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Selv-Test"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s først"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Opvarmning fejlet"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Fejl: reserve temp"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Temp løber løbsk"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Fejl: Maks temp"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Fejl: Min temp"); + 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 + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // Kun et bogstav + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // Kun et bogstav + PROGMEM Language_Str MSG_HEATING = _UxGT("Opvarmer..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Opvarmer plade..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrering"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrer X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrer Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrer Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrerings Center"); + + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Om Printer"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kort Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Ant. Prints"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total print tid"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Længste print"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruderet"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Prints"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Færdige"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Længste"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruderet"); + #endif + + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Strømfors."); + + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driv Styrke"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Driv %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Driv %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Driv %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Driv %"); + + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Skriv"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Forsæt print"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Forkert printer"); + + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Vent på start", "af filament", "skift")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Vent på", "filament udskyd.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Indsæt filament", "og tryk på knap", "for at fortsætte...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Vent på", "filament indtag")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Vent på at print", "fortsætter")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Vent venligst...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Udskyder...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Indsæt og klik")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Indtager...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsætter...")); + #endif // LCD_HEIGHT < 4 +} diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h new file mode 100644 index 00000000..74e18568 --- /dev/null +++ b/Marlin/src/lcd/language/language_de.h @@ -0,0 +1,646 @@ +/** + * 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 + +/** + * German + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +namespace Language_de { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + 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"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Abbruch..."); + 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ü"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Erw. Einstellungen"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguration"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + 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!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Ausblendhöhe"); + 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 + #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"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser aus"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser an"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laserleistung"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindel-Steuerung"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindel aus"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindel an"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindelleistung"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindelrichtung"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Netzteil ein"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Netzteil aus"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudieren"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Einzug"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Achsen bewegen"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bett-Nivellierung"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Bett nivellieren"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Ecken nivellieren"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nächste Ecke"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Netz Editor"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Netz bearbeiten"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Netzbearb. angeh."); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Messpunkt"); + 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("Z-Wert"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); + 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"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Autom. parken"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplizieren"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Spiegelkopie"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("vollstä. Kontrolle"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. Düse X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. Düse Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. Düse Z"); + 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"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Entfernen & messen"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Nächster Punkt..."); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktivieren"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktivieren"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Betttemperatur"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Betttemperatur"); + 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("Netz bearbeiten"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Eigenes Netz bearb."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Feineinstellung..."); + 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"); + #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_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"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("G26 verlassen"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Netzerst. forts."); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Netz-Nivellierung"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Punkt-Nivell."); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Gitternetz-Nivell."); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Netz nivellieren"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Eckpunkte"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Kartentyp"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Karte ausgeben"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Ausgabe für Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Ausgabe für CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externe Sicherung"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL-Info ausgeben"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Menge an Füllung"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuelles Füllen"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Cleveres Füllen"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Netz Füllen"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Alles annullieren"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Nächstlieg. ann."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Feineinst. Alles"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Feineinst. Nächstl."); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Netz-Speicherplatz"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Speicherort"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Bettnetz laden"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Bettnetz speichern"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Netz %i geladen"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Netz %i gespeichert"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Kein Speicher"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err:UBL speichern"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err:UBL wiederherst."); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Versatz: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Versatz angehalten"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Schrittweises UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Netz erstellen kalt"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Cleveres Füllen"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Netz validieren"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Feineinst. Alles"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Netz validieren"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Feineinst. Alles"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Bettnetz speichern"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Licht-Steuerung"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Licht"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Licht-Einstellung"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rot"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Gelb"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Grün"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blau"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violett"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Weiß"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Standard"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Benutzerdefiniert"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensität Rot"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensität Grün"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensität Blau"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensität Weiß"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Helligkeit"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("In Bewegung..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Abstand XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Bewege X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Bewege Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Bewege Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Bewege Extruder"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Bewege Extruder *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend zu kalt"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT(" %s mm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT(" 0,1 mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1,0 mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("10,0 mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Geschw."); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bett Z"); + 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"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Lüfter ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Gespeich. Lüfter ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Geschw. Extralüfter"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Geschw. Extralüfter ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Lüfter Kontroller"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Lüfter Leerlauf"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Motorlast Modus"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Lüfter Motorlast"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Ausschalt Delay"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flussrate"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flussrate ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Einstellungen"); + 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(" Faktor"); + 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"); + 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("V E Jerk"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Geschwindigkeit"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("V max ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("V max ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("V max ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("V max ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("V max *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("V min "); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("V min Leerfahrt"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Beschleunigung"); + PROGMEM Language_Str MSG_AMAX = _UxGT("A max "); // space intentional + PROGMEM Language_Str MSG_AMAX_A = _UxGT("A max ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("A max ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("A max ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("A max ") LCD_STR_E; + 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"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_E_STEPS = LCD_STR_E _UxGT(" Steps/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* Steps/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatur"); + 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"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Laden mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Vorschubfaktor"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Vorschubfaktor *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD-Kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Konfig. speichern"); + 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"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aktualisieren"); + 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."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Druck vom Medium"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Kein Medium"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Warten..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Klick zum Fortsetzen"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Druck pausiert..."); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Druckt..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Druck abgebrochen"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Druck fertig"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Motoren angeschaltet"); + PROGMEM Language_Str MSG_KILLED = _UxGT("ABGEBROCHEN"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ANGEHALTEN"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Einzug mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Wechs. Einzug mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("V Einzug"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z-Sprung mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Wechs. Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + 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_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"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Filament laden *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Filament entladen"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Filament entladen *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Alles entladen"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Medium initial."); // Manually initialize the SD-card via user interface + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Medium getauscht"); // SD-card changed by user. For machines with no autocarddetect. Both send "M21" + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Medium freigeben"); // if Marlin gets confused - M22 + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z-Sonde außerhalb"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Korrekturfaktor"); + 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"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Modus"); + 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_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"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("TouchMI initial."); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z-Versatz"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Speichern"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI ausfahren"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Sonde ausfahren"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Sonde einfahren"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Vorher %s%s%s homen"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Sondenversatz"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Sondenversatz X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Sondenversatz Y"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Sondenversatz Z"); + 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("Abbr. mit Endstopp"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("HEIZEN ERFOLGLOS"); + 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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("GEH.") " " LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = " " LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN"); + PROGMEM Language_Str MSG_ERR_MINTEMP = " " LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN"); + 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 + 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("heizt..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("kühlt..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bett heizt..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Bett kühlt..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Gehäuse heizt..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Gehäuse kühlt..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrieren"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriere X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriere Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriere Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriere Mitte"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Einst. anzeig."); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Autom. Kalibrierung"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Höhe setzen"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Sondenversatz Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rod"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Höhe"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Über den Drucker"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Drucker-Info"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Punkt-Nivellierung"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineare Nivellierung"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineare Nivell."); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Netz-Nivellierung"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Drucker-Statistik"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board-Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistoren"); + 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"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Falscher Drucker"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Gesamte Drucke"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette Drucke"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Gesamte Druckzeit"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längste Druckzeit"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Gesamt Extrudiert"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Drucke"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Komplette"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Gesamte"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Längste"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud."); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Netzteil"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Motorleistung"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Treiber %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Treiber %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Treiber %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Treiber %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC Verbindungsfehler"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Werte speichern"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMENT WECHSEL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("DRUCK PAUSIERT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMENT LADEN"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMENT ENTLADEN"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FORTS. OPTIONEN:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Mehr entladen"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Druck weiter"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Düse: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout-Sensor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Runout-Weg mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Homing gescheitert"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing gescheitert"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMENT WÄHLEN"); + 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 handeln erfor."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Druck fortsetzen"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Fortfahren..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Filament laden"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Lade alle"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Düse laden"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Filament auswerfen"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Filament ~ auswerfen"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filament entladen "); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Lade Fila. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fila. auswerfen..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fila. entladen..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Alle"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("setze MMU zurück"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU zurücksetzen..."); + 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_MIXER = _UxGT("Mixer"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); // equal Farbverlauf + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Volle Gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mix umschalten"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Zyklus Mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradient Mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Umgekehrte Gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktives V-Tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("V-Tool Start"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("V-Tool Ende"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("V-Tool Alias"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("V-Tools Reseten"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("V-Tool Mix sichern"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-Tools ist resetet"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Z Start:"); + PROGMEM Language_Str MSG_END_Z = _UxGT("Z Ende:"); + PROGMEM Language_Str MSG_GAMES = _UxGT("Spiele"); + 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("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. + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Knopf drücken um", "Druck fortzusetzen")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_2_LINE("Druck ist", "pausiert...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Warte auf den", "Start des", "Filamentwechsels...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filament einlegen", "und Knopf drücken", "um fortzusetzen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Knopf drücken um", "Düse aufzuheizen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Düse heizt auf", "bitte warten...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Warte auf", "Entnahme", "des Filaments...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Warte auf", "Laden des", "Filaments...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Warte auf", "Spülung", "der Düse...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Klicke um", "die Düsenspülung", "zu beenden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Warte auf", "Fortsetzen des", "Drucks...")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Klick zum Fortsetzen")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Pausiert...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Bitte warten...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Laden und Klick")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Klick zum Heizen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heizen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Entnehmen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Laden...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spülen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Klick zum beenden", "der Düsenspülung")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Fortsetzen...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Treiber"); // Max length 18 characters + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Treiber Strom"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch."); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" im:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Spiel"); + 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("Korrektur"); + 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"); + #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_el.h b/Marlin/src/lcd/language/language_el.h new file mode 100644 index 00000000..125119d5 --- /dev/null +++ b/Marlin/src/lcd/language/language_el.h @@ -0,0 +1,192 @@ +/** + * 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 + +/** + * Greek + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_GREEK + +namespace Language_el { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Greek"); + + 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 MSG_MAIN = _UxGT("Βασική Οθόνη"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση Μοτέρ"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο"); //SHORTEN + 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_LEVEL_BED_HOMING = _UxGT("Επαναφορά Επ. Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Επιπεδοποίηση επ. Εκτύπωσης περιμενει"); //SHORTEN + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Επόμενο σημείο"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Ολοκλήρωση επιπεδοποίησης!"); //SHORTEN + 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("Ορισμός προέλευσης"); + #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("Απενεργοποίηση"); + 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("Επιπεδοποίηση Επ. Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Επιπεδοποίηση Επ. Εκτύπωσης"); //SHORTEN + 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("Μετακίνηση %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_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_FLOW = _UxGT("Ροή"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Ροή ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Έλεγχος"); + 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("Αυτομ ρύθμιση θερ/σίας"); //SHORTEN + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ενεργοποιημένο"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Απενεργοποιημένο"); + PROGMEM Language_Str MSG_ACC = _UxGT("Επιτάχυνση"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Vαντίδραση ") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Vαντίδραση ") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Vαντίδραση ") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Vαντίδραση E"); + 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("Accel"); + 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("Α-ανάσυρση"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Α-μετατόπιση"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bήματα ") LCD_STR_A _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bήματα ") LCD_STR_B _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bήματα ") LCD_STR_C _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("Bήματα * ανά μμ"); + 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("Ε σε μμ³"); + 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("Επαναφορά ασφαλούς αντιγράφου"); //SHORTEN + 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_PAUSE_PRINT = _UxGT("Παύση εκτύπωσης"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Συνέχιση εκτύπωσης"); + PROGMEM Language_Str MSG_STOP_PRINT = _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_ABORTED = _UxGT("Διακόπτεται η εκτύπωση"); //SHORTEN + 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("Εναλλαγή ανάσυρσης μμ"); //SHORTEN + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Αυτόματη ανάσυρση"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Αλλαγή νήματος"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Προετοιμασία κάρτας SD"); //SHORTEN + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης"); //SHORTEN + PROGMEM Language_Str MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ"); //SHORTEN + PROGMEM Language_Str MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Ακύρωση endstop "); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΚΡΑΣΙΑΣ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("ΠΕΡΙΤΗ ΘΕΡΜΟΚΡΑΣΙΑ"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("ΜΗ ΕΠΑΡΚΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ"); //SHORTEN + PROGMEM Language_Str MSG_HALTED = _UxGT("H εκτύπωση διακόπηκε"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Θερμαίνεται…"); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Θέρμανση ΕΠ. Εκτύπωσης"); //SHORTEN + 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_KILL_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής"); +} diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h new file mode 100644 index 00000000..3db6fccd --- /dev/null +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -0,0 +1,193 @@ +/** + * 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 + +/** + * Greek (Greece) + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_GREEK + +namespace Language_el_gr { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Greek (Greece)"); + + 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 MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Βασική Οθόνη"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Αυτόματη εκκίνηση"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση βηματιστή"); + 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_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_SET_HOME_OFFSETS = _UxGT("Ορισμός βασικών μετατοπίσεων"); + PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Εφαρμόστηκαν οι μετατοπίσεις"); + PROGMEM Language_Str MSG_SET_ORIGIN = _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("Απενεργοποίηση"); + 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_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("Μετακίνηση %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_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_FLOW = _UxGT("Ροή"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Ροή ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Έλεγχος"); + 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("Αυτομ. ρύθμιση θερμοκρασίας"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ενεργοποιημένο"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Απενεργοποιημένο"); + PROGMEM Language_Str MSG_ACC = _UxGT("Επιτάχυνση"); + PROGMEM Language_Str MSG_JERK = _UxGT("Vαντίδραση"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Vαντίδραση ") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Vαντίδραση ") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Vαντίδραση ") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Vαντίδραση E"); + 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("Accel"); + 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("Α-ανάσυρση"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Α-μετατόπιση"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bήματα ανά μμ"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bήματα ") LCD_STR_A _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bήματα ") LCD_STR_B _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bήματα ") LCD_STR_C _UxGT(" ανά μμ"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Bήματα Ε ανά μμ"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("Bήματα * ανά μμ"); + 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("Ε σε μμ³"); + 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_PREPARE = _UxGT("Προετοιμασία"); + PROGMEM Language_Str MSG_TUNE = _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_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_ABORTED = _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("Εναλλαγή ανάσυρσης μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση μμ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_AUTORETRACT = _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 εκτός κλίνης"); + PROGMEM Language_Str MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πριν από Ζ"); + PROGMEM Language_Str MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Μικρό βήμα Χ"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Μικρό βήμα Υ"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Μικρό βήμα Ζ"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Ματαίωση endstop "); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Ανεπιτυχής θέρμανση"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ"); + 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_KILL_EXPECTED_PRINTER = _UxGT("Εσφαλμένος εκτυπωτής"); +} diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h new file mode 100644 index 00000000..e8b4769c --- /dev/null +++ b/Marlin/src/lcd/language/language_en.h @@ -0,0 +1,670 @@ +/** + * 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 + +/** + * English + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define en 1234 +#if LCD_LANGUAGE == en + #define NOT_EXTENDED_ISO10646_1_5X7 +#endif +#undef en + +namespace Language_en { + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("English"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Ready."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("YES"); + PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_BACK = _UxGT("Back"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Aborting..."); + 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"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("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("Main"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Advanced Settings"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disable Steppers"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Progress Bar 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("Auto Z-Align"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Assisted Tramming"); + PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Iteration: %i"); + PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Accuracy Decreasing!"); + PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Accuracy Achieved"); + 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"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Leveling Done!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Laser Control"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Laser Power"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Control"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Off"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle On"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Power"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retract"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Move Axis"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level Bed"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Level Corners"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Next Corner"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editor"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edit Mesh"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Probing Point"); + 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("Z Value"); + 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"); + 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_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_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"); + 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 Printer 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_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"); + 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("Hotend too cold"); + 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("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"); + 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 Printer"); + 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("Current"); + PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Voltage"); + PROGMEM Language_Str MSG_POWER = _UxGT("Power"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start Print"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Next"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Init"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Print"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignore"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancel"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Done"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Back"); + 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_HOST_START_PRINT = _UxGT("Host Start"); + 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("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..."); + 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("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); + 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 Change"); + 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 ON"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); + 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_FILAMENTCHANGE = _UxGT("Change Filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Change Filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Load Filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Load Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Unload Filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Unload Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Unload All"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Attach Media"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Change Media"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Release 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("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"); + 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_MOVE_NOZZLE_TO_BED = _UxGT("Move Nozzle to Bed"); + 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_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_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_PROBE_HEATING = _UxGT("Probe Heating..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Probe 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("Height"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radius"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("About Printer"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Printer Info"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Point Leveling"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Linear Leveling"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilinear Leveling"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Leveling"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Printer Stats"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board Info"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruders"); + 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("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_LONGEST = _UxGT("Longest Job Time"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruded Total"); + #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("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + 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_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("Games"); + 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"); + + 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 + // + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Press Button", "to resume print")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wait for", "filament change", "to start")); + 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("Parking...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Please wait...")); + 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 to heat")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Heating...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Ejecting...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Loading...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming...")); + #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("Correction"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Level X Axis"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrate"); + #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..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Probe Wizard"); +} + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h new file mode 100644 index 00000000..c77b12ee --- /dev/null +++ b/Marlin/src/lcd/language/language_es.h @@ -0,0 +1,594 @@ +/** + * 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 + +/** + * Spanish + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +namespace Language_es { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Spanish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Lista"); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("SI"); + PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_BACK = _UxGT("Atrás"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Cancelando..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD/USB insertado"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD/USB retirado"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Esperando al SD/USB"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Error lectura SD/USB"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido"); + 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("Menú principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ajustes avanzados"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Inicio automático"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prob. barra progreso"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Llevar al origen"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Origen X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origen Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origen Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alineado Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origen XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Pulsar para comenzar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Siguiente punto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("¡Nivelación lista!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Compen. Altura"); + 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"); + #if PREHEAT_COUNT + 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. $"); + 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"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frecuencia"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Apagar Láser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Encender Láser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Mandrino"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Apagar Mandrino"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Encender Mandrino"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Mandrino"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Invertir giro"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Encender Fuente"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Apagar Fuente"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover ejes"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelando Cama"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Cama"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Esquinas"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Siguente Esquina"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mallado"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Mallado"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Ed. Mallado parada"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Sondear Punto"); + 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("Com. Personalizados"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Desfase Herramienta"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Aparcado"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicar"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Reflejada"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2ª Fusor X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2ª Fusor Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2ª Fusor Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Hacer G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Herramientas UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Nivelado UBL"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Crear Mallado man."); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Colocar cuña y Medir"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Retirar y Medir Cama"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover al Siguente"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Cama"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Cama perso."); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Fusor"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Fusor perso."); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Mallado"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Mallado perso."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ajuste fino Mallado"); + 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"); + #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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Imprimado manual..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Impri. longit. fija"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Imprimación Lista"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Dejando G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Contin. Mallado cama"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelando Mallado"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelando 3Puntos"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niv. Mall. cuadri"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivel de Mallado"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterales"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de mapa "); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Salida Mapa mallado"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Salida para el host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salida para CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Cópia de seg. ext"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Salida Info. UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidad de relleno"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Relleno manual"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Relleno inteligente"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Mallado de relleno"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar proximos"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Fino proxi."); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacen de Mallado"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Huecos memoria"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Cargar Mall. cama"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Guardar Mall. cama"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Malla %i Cargada"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Malla %i Guardada"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sin guardar"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Error: Guardar UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Error: Restaurar UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Parado"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crear Mall. Frío"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Relleno intelig."); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valid. Mallado"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valid. Mallado"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Guardar Mall. cama"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Control LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("LEDS"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Color predefinido"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rojo"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Naranja"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Amarillo"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Azul"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Índigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violeta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Blanco"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Color personalizado"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidad Rojo"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidad Verde"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensidad Azul"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensidad Blanco"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Brillo"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Moviendo..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Libre XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend muy frio"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidad"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Boquilla"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Boquilla ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Boquilla Aparcada"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Boquilla en Espera"); + PROGMEM Language_Str MSG_BED = _UxGT("Cama"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Recinto"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Ventilador"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Ventilador ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Vent. almacenado ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Ext. ventil."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Vel. Ext. ventil. ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controlador Vent."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Velocidad en reposo"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo Auto"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Velocidad Activa"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Periodo de reposo"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flujo"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flujo ~"); + 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(" Factor"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Autom."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Enc"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Apg"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Auto-ajuste"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Auto-ajuste *"); + 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("Seleccionar"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seleccionar *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Aceleración"); + 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("Desvi. Unión"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidad"); + 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("Vel. viaje min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Acceleración"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Acel. max") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Acel. max") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Acel. max") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Acel. max") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Acel. max *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acel. retrac."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acel. Viaje"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pasos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pasos/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pasos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimiento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diámetro Fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diámetro Fil. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carga mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avance K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Guardar EEPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar EEPROM"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Rest. fábrica"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Err: EEPROM CRC"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Err: Índice EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versión EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/USB"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetear Impresora"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Pantalla de Inf."); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ajustar"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Iniciar impresión"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Siguinte"); + 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("Reiniciar"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Listo"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Retroceder"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceder"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresión"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reanudar impresión"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Detener impresión"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Imprimiendo 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("Rec. Fallo electrico"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprim. desde SD/USB"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD/USB no presente"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Reposo..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Pulsar para Reanudar"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impresión Pausada"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimiendo..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impresión cancelada"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Impresión Completada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sin movimiento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("MUERTA"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("DETENIDA"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Interc. Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Levantar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Interc. DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("DesRet V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Retracción Auto."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Inter. longitud"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Purgar longitud"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambiar Herramienta"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Aumentar Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Vel. de Cebado"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vel. de retracción"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambiar filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambiar filamento *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Cargar filamento"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Cargar filamento *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Descargar filamento"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Descargar fil. *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar todo"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Iniciar SD/USB"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/USB"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/USB"); + 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("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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PELIGRO: ¡Una mala configuración puede producir daños! ¿Proceder igualmente?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test de desfase Z"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Guardar"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Subir TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Subir Sonda Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Bajar Sonda Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Origen %s%s%s Prim."); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Desf. Sonda"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Desf. Sonda X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Desf. Sonda Y"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desf. Sonda Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); + 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_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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CAMARA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err:TEMP. MÁX"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err:TEMP. MIN"); + 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 + 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("Calentando..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Enfriando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Calentando Cama..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Enfriando Cama..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Calentando Cámara..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Enfriando Cámara..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibración 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("Configuración Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Est. Altura Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ajustar Sonda Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Info. Impresora"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. Impresora"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelando 3puntos"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelando Lineal"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelando Bilineal"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelando UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelando en Mallado"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estadísticas Imp."); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. Controlador"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusores"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Vig. Fuga Térm.: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Vig. Fuga Térm.: ON"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz cabina"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo cabina"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impresora incorrecta"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Cont. de impresión"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tiempo total de imp."); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresión más larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruido"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresiones"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Más larga"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp. Mínima"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp. Máxima"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("F. Aliment."); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Fuerza de empuje"); + 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("ERROR CONEX. TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPC. REINICIO:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar más"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar imp."); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Boquilla: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sens. filamento"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist. filamento mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Ir a origen Fallado"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondeo Fallado"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ELIJE FILAMENTO"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("¡Actu. MMU Firmware!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Necesita Cuidado"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuar imp."); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Resumiendo..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar hasta boqui."); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Expulsar Filamento ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todo"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reiniciar MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Retirar, y pulsar"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Mezcla"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Componente ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Miezclador"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Degradado"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Degradado Total"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mezcla Conmutada"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Mezcla Cíclica"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mezcla de Degradado"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Degradado inverso"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Activar Herr.V"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Inicio Herr.V"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin Herr.V"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias Herr.V"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reiniciar Herr.V"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Cometer mezc. Herr.V"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Herr.V reiniciados"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Inicio Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Juegos"); + 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"); + + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Pulsar el botón para", "reanudar impresión")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Aparcando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Esperando para", "iniciar el cambio", "de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserte el filamento", "y pulse el botón", "para continuar...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Pulse el botón para", "calentar la boquilla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Calentando boquilla", "Espere por favor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Espere para", "liberar el filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Espere para", "cargar el filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere para", "purgar el filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Pulse para finalizar", "la purga de filamen.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Esperando impresora", "para reanudar...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Pulse para continuar")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Aparcando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Por Favor espere...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserte y Pulse")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Pulse para Calentar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Calentando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Liberando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Pulse para finalizar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reanudando...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Controladores TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Amperaje Controlador"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dentro:"); + 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("Corrección"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Nivel Eje X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrar"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("T. de esp. Calent."); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Recalentar"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Recalentando..."); +} diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h new file mode 100644 index 00000000..7e35c6ee --- /dev/null +++ b/Marlin/src/lcd/language/language_eu.h @@ -0,0 +1,321 @@ +/** + * 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 + +/** + * Basque-Euskera + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 +#define NOT_EXTENDED_ISO10646_1_5X7 + +namespace Language_eu { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Basque-Euskera"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" prest."); + PROGMEM Language_Str MSG_BACK = _UxGT("Atzera"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Txartela sartuta"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Txartela kenduta"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu nagusia"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto hasiera"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Itzali motoreak"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Arazketa Menua"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Prog. Barra Proba"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Hasierara joan"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X jatorrira"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y jatorrira"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z jatorrira"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ hasieraratzen"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik egin hasteko"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Hurrengo Puntua"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Berdintzea eginda"); + 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"); + #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"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estruitu"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Atzera eragin"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Ardatzak mugitu"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ohe berdinketa"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ohea berdindu"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Ertzak berdindu"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Hurrengo ertza"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Sarea editatu"); + + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 exekutatzen"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Tresnak"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Sarea eskuz sortu"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Neurtu"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktibatu"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL desaktibatu"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ohearen tenperatura"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Mutur beroaren tenp."); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + 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"); + #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_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"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Lauki-sare berdinketa"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Sarea berdindu"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Mapa mota"); + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED ezarpenak"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Argiak"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Argi aurrehautaketak"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Gorria"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Laranja"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Horia"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Berdea"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Urdina"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Bioleta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Zuria"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Lehenetsia"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Argi pertsonalizatuak"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intentsitate gorria"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intentsitate berdea"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intentsitate urdina"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intentsitate zuria"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Distira"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Mugitzen..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Askatu XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mugitu X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mugitu Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mugitu Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusorea"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusorea *"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mugitu %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mugitu 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mugitu 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mugitu 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Abiadura"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Ohea"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Pita"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Pita ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Ohea"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Haizagailu abiadura"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Haizagailu abiadura ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Haiz.gehig. abiadura"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Haiz.gehig. abiadura ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxua"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxua ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrola"); + 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(" Fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto tenperatura"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Aukeratu"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Aukeratu *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Azelerazioa"); + PROGMEM Language_Str MSG_JERK = _UxGT("Astindua"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-astindua"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-astindua"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-astindua"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-astindua"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VBidaia min"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-retrakt"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-bidaia"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pausoak/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pausoak/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pausoak/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pausoak/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Tenperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Mugimendua"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Harizpia"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm3-tan"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Hariz. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Hariz. Dia. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Deskargatu mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Kargatu mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Aurrerapena"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Aurrerapena *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrastea"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gorde memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Kargatu memoria"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Larri. berriz."); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM-a hasieratu"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Berriz kargatu"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Pantaila info"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Prestatu"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Doitu"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausatu inprimak."); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Jarraitu inprima."); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Gelditu inprima."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD-tik inprimatu"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ez dago SD-rik"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Lo egin..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Aginduak zain..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Inprim. geldi."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Inprim. deusezta."); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Mugimendu gabe."); + PROGMEM Language_Str MSG_KILLED = _UxGT("AKABATUTA. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("GELDITUTA. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Atzera egin mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Atzera mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Atzera egin V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Igo mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Atzera egin mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Swap Atzera mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Atzera egin V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Atzera egin"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Aldatu harizpia"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Aldatu harizpia *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Harizpia kargatu"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Harizpia kargatu *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Harizpia deskargatu"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Harizpia deskargatu *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Erabat deskargatu"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Hasieratu SD-a"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Aldatu txartela"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z zunda kanpora"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Okertze faktorea"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch AutoProba"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch berrabia."); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("BLTouch jaitsi/luzatu"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("BLTouch igo/jaso"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Etxera %s%s%s lehenengo"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Konpentsatu"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikro-urratsa X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikro-urratsa Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikro-urratsa Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop deusezta."); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Err: Beroketa"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: Tenperatura"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("TENP. KONTROL EZA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Tenp Maximoa"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Tenp Minimoa"); + 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 + 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("Berotzen..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohea Berotzen..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibraketa"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibratu X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibratu Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibratu Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibratu Zentrua"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta ezarpenak"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibraketa"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Alt. Ezar."); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra diagonala"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altuera"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Erradioa"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Inprimagailu Inf."); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Inprimagailu Inf."); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3 puntuko berdinketa"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Berdinketa lineala"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Berdinketa bilinearra"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Sare berdinketa"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Inprima. estatis."); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Txartelaren Info."); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistoreak"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Estrusoreak"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudioak"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoloa"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Kabina Argia"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Argiaren Distira"); + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprim. Zenbaketa"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Inprim. denbora"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Imprimatze luzeena"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estruituta guztira"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Inprimatze"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Burututa"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Guztira"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Luzeena"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estrusio"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Tenp. Minimoa"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Tenp. Maximoa"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Elikadura-iturria"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Driver-aren potentzia"); + 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_DAC_EEPROM_WRITE = _UxGT("Idatzi DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("HARIZPIA ALDATU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("HARIZPIA KARGATU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("HARIZPIA DESKARGATU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("ALDAKETA AUKERAK:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Inprima. jarraitu"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Pita: "); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Hasi. huts egin du"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Neurketak huts egin du"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Inprimagailu okerra"); + + // + // Filament Change screens show up to 3 lines on a 4-line display + // ...or up to 2 lines on a 3-line display + // + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Mesedez, itxaron...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Deskargatzen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Sartu eta click egin")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Berotzen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Kargatzen...")); +} diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h new file mode 100644 index 00000000..e8621377 --- /dev/null +++ b/Marlin/src/lcd/language/language_fi.h @@ -0,0 +1,130 @@ +/** + * 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 + +/** + * Finnish + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_fi { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Finnish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" valmis."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kortti asetettu"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kortti poistettu"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Palaa"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Automaatti"); + 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"); + #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"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Pursota"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Vedä takaisin"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Liikuta akseleita"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Liikuta X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Liikuta Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Liikuta Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Liikuta %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Liikuta 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Liikuta 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Liikuta 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Nopeus"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Suutin"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Suutin ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Alusta"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Tuul. nopeus"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Tuul. nopeus ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Virtaus"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Virtaus ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrolli"); + 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(" Kerr"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Autotemp"); + PROGMEM Language_Str MSG_ACC = _UxGT("Kiihtyv"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VLiike min"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("A-peruuta"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Lämpötila"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Liike"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontrasti"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Tallenna muistiin"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Lataa muistista"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Palauta oletus"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Päivitä"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Seuraa"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Valmistele"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Säädä"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Keskeytä tulostus"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Jatka tulostusta"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Pysäytä tulostus"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Korttivalikko"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Ei korttia"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Nukkumassa..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Odotet. valintaa"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Ei liiketta."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Vedä mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Va. Vedä mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Vedä V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Va. Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVeto."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrointi"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibroi X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibroi Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibroi Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibroi Center"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Väärä tulostin"); +} diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h new file mode 100644 index 00000000..714feeee --- /dev/null +++ b/Marlin/src/lcd/language/language_fr.h @@ -0,0 +1,573 @@ +/** + * 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 + +/** + * French + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_fr { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Français"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" prête."); + PROGMEM Language_Str MSG_YES = _UxGT("Oui"); + PROGMEM Language_Str MSG_NO = _UxGT("Non"); + PROGMEM Language_Str MSG_BACK = _UxGT("Retour"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annulation..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Média inséré"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Média retiré"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Attente média"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err lecture média"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB débranché"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Erreur média USB"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Butées"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butées SW"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. avancée"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuration"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Exéc. auto.gcode"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Arrêter moteurs"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barre progress."); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Origine auto"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Origine X auto"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Origine Y auto"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Origine Z auto"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Align. Z auto"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Origine XYZ..."); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Clic pour commencer"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Point suivant"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Mise à niveau OK!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Hauteur lissée"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Puissance"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverser broches"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Allumer alim."); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Eteindre alim."); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrusion"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Rétractation"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Déplacer un axe"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Régler Niv. lit"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveau du lit"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Niveau des coins"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Coin suivant"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Modif. maille"); // 13 car. max + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifier grille"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Modification arrêtée"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Mesure point"); + 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("Valeur Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Commandes perso"); + + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Mesure point"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("Ecart sonde Z M48"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Ecart"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("Point M48"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Mode IDEX"); + 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("Copie miroir"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Contrôle complet"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Offsets Outil"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("Buse 2 X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("Buse 2 Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("Buse 2 Z"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26: Chauffage du lit"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("Buse en chauffe..."); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Amorce manuelle..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Amorce longueur fixe"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Amorce terminée"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 annulé"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Sortie G26"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 en cours"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Outils UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Niveau lit unifié"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Maillage manuel"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Poser câle & mesurer"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mesure"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("ôter et mesurer lit"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Aller au suivant"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activer l'UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Désactiver l'UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Température lit"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Température lit"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Température buse"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Température buse"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Modifier grille"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif. grille perso"); + 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"); + #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_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"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Niveau à 3 points"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Niveau par grille"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Effectuer mesures"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Points latéraux"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Type de carte"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exporter grille"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Export pour hôte"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Export en CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Export sauvegarde"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Infos debug UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Nombre de points"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Remplissage manuel"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Remplissage auto"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Remplissage grille"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Tout effacer"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Effacer le + près"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Réglage fin (tous)"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Réglage fin + près"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Stockage grille"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot mémoire"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Charger la grille"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Stocker la grille"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Grille %i chargée"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Grille %i enreg."); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Pas de mémoire"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: Enreg. UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ouvrir UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Décal. Z arrêté"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Assistant UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Mesure à froid"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Compléter auto."); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Vérifier grille"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Réglage fin"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Vérifier grille"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Réglage fin"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Stocker grille"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Contrôle LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Lumière"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Préregl. LED"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rouge"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Orange"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Jaune"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Vert"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Bleu"); + 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("Blanc"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Defaut"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("LEDs perso."); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensité rouge"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensité vert"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensité bleu"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensité blanc"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Luminosité"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Déplacement..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Débloquer XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Déplacer X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Déplacer Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Déplacer Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudeur"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudeur *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Buse trop froide"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Déplacer %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Déplacer 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Déplacer 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Déplacer 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Vitesse"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Lit Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Buse"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Buse ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Lit"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Caisson"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vit. ventil. "); // 15 car. max + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vit. ventil. ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Vit. enreg. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra ventil. "); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra ventil. ~"); + + PROGMEM Language_Str MSG_FLOW = _UxGT("Flux"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flux ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Contrôler"); + 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(" Facteur"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Auto."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Marche"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Arrêt"); + 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("Tuning PID terminé"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Echec Autotune! E incorrect"); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Echec Autotune! Temp. trop haute"); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Echec Autotune! Opér. expirée"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Sélectionner"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Sélectionner *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Accélération"); + 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_VELOCITY = _UxGT("Vélocité"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Déviat. jonct."); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vmin course"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Accélération"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Acc.rétraction"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Acc.course"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Fréquence max"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Vitesse min"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pas/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pas/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pas/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pas/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Température"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Mouvement"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("Limite en mm³"); + PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite *"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diamètre fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diamètre fil. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Retrait mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Charger mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avance K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Enregistrer config."); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Charger config."); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restaurer défauts"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initialiser EEPROM"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Config. enregistrée"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("MaJ Firmware SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("RaZ imprimante"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Surveiller"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Préparer"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Régler"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Démarrer impression"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Suivant"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Init."); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimer"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reset"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorer"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Annuler"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Terminé"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Retour"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Procéder"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Mise en pause..."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pause impression"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Reprendre impr."); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arrêter impr."); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Impression objet"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Annuler objet"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Annuler objet ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Récup. coup."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Impression SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Pas de média"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Repos..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Attente utilis."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impr. en pause"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Impression"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impr. annulée"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Moteurs bloqués"); + PROGMEM Language_Str MSG_KILLED = _UxGT("KILLED"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("STOPPÉ"); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Rétractation mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ech. rétr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Vit. rétract°"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saut Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Rét.reprise mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ech.reprise mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("V.rét. reprise"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("V.éch. reprise"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Rétraction auto"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Changement outil"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Augmenter Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Vitesse primaire"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vitesse rétract°"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Garer Extrudeur"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Vitesse reprise"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Vit. ventil."); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Temps ventil."); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Migration d'outil"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Migration auto"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Extrudeur Final"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migrer vers *"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Attente buse"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Longueur retrait"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Longueur Extra"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Longueur de purge"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Changer filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Changer filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Charger filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Charger filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Retrait filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Retrait filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Retirer tout"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Charger le média"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Actualiser média"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Retirer le média"); + 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("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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Afficher Mode"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Init. TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test décalage Z"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Sauvegarde"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Déployer TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Déployer Sonde Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Ranger Sonde Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Origine %s%s%s Premier"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Position sonde Z"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Décalage X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Décalage Y"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Décalage Z"); + PROGMEM Language_Str MSG_BABYSTEP_TOTAL = _UxGT("Total"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Butée abandon"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Err de chauffe"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Err TEMP. REDONDANTE"); + 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_HALTED = _UxGT("IMPR. STOPPÉE"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Redémarrer SVP"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("j"); // 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("en chauffe..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Refroidissement"); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Lit en chauffe..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Refroid. du lit..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Probe en chauffe..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Refroid. Probe..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chauffe caisson..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Refroid. caisson..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibration Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrer X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrer Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibrer Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibrer centre"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Réglages Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Calibration Auto"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Hauteur Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Delta Z sonde"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diagonale"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Hauteur"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Rayon"); + + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Infos imprimante"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Infos imprimante"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Niveau à 3 points"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Niveau linéaire"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Niveau bilinéaire"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Niveau lit unifié"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Niveau par grille"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Stats. imprimante"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Infos carte"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistances"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudeurs"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Bauds"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocole"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Protection inactive"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Protection active"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend Idle Timeout"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Lumière caisson"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosité"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Imprimante incorrecte"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nbre impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tps impr. total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impr. la + longue"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total filament"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impressions"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Terminées"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("+ long"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Filament"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alim."); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Puiss. moteur "); + 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_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM sauv."); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("ERREUR CONNEXION TMC"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CHANGER FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPR. PAUSE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CHARGER FIL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DECHARGER FIL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPTIONS REPRISE:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purger encore"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Reprendre impr."); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Buse: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Capteur fil."); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Echec origine"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Echec sonde"); + + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MAJ firmware MMU!!"); + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("CHOISIR FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU ne répond plus"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Continuer Imp. MMU"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Reprise MMU..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Charge dans MMU"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Charger tous dans MMU"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Charger dans buse"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Ejecter fil. du MMU"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Ejecter fil. ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Retrait filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Chargem. fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejection fil..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Retrait fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tous"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Réinit. MMU"); + 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_MIXER = _UxGT("Mixeur"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Dégradé"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Dégradé complet"); + 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("Mix dégradé"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Inverser dégradé"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Active V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Début V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Réinit. V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Valider Mix V-tool"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools réinit. ok"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Début Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); + PROGMEM Language_Str MSG_GAMES = _UxGT("Jeux"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Casse-briques"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Invaders"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Sn4k3"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Labyrinthe"); + + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Erreur index page"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Erreur vitesse page"); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Presser bouton", "pour reprendre")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parking...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Attente filament", "pour démarrer")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Insérer filament", "et app. bouton", "pour continuer...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Presser le bouton", "pour chauffer...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Buse en chauffe", "Patienter SVP...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Attente", "retrait du filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Attente", "chargement filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Attente", "Purge filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Presser pour finir", "la purge du filament")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Attente reprise", "impression")); + #else // LCD_HEIGHT < 4 + // Up to 2 lines allowed + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Clic pour continuer")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Patience...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Insérer fil.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Chauffer ?")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Chauffage...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Retrait fil...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Chargement...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purge...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Terminer ?")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Reprise...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Courant driver"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Réinit."); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dans:"); + PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Correction"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Lissage"); +} diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h new file mode 100644 index 00000000..2fd4bf69 --- /dev/null +++ b/Marlin/src/lcd/language/language_gl.h @@ -0,0 +1,617 @@ +/** + * 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 + +/** + * Galician language (ISO "gl") + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_gl { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Galician"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" lista."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("SI"); + PROGMEM Language_Str MSG_NO = _UxGT("NON"); + PROGMEM Language_Str MSG_BACK = _UxGT("Atrás"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Cancelando..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tarxeta inserida"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tarxeta retirada"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Agardando ao SD/USB"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Erro lectura SD/USB"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbord. Subch."); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("FinCarro"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("FinCarro SW"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menú principal"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Axustes avanzados"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuración"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoarranque"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Apagar motores"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menú depuración"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra progreso"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir a orixe"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir orixe X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir orixe Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir orixe Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Autoaliñar Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Ir orixes XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Prema pulsador"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Seguinte punto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Fin Nivelación!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Compensación Altura"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Control Láser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Láser Apagado"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Láser Aceso"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potencia Láser"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Control Fuso"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Fuso Apagado"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Fuso Aceso"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potencia Fuso"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverter xiro"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Acender"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Apagar"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extruír"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retraer"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixe"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelando Cama"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Nivelar Cama"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Nivelar Cantos"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Seguinte Canto"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mallado"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Editar Mallado"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Ed. Mallado Detida"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punto de Proba"); + 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("Comandos Personaliz."); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ferramentas Compens"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Estacionar"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicación"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia Espello"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Control Total"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2º Bico X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2º Bico Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2º 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("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punto de inclinación"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Facer Malla Manual"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Colocar Calzo e Medir"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Quitar e Medir Cama"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Mover ao Seguinte"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Activar UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Desactivar UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp Cama"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp Cama"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp Bico"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp Bico"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Editar Malla"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edit. Malla Person."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Axuste Fino da Malla"); + 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"); + #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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Traballo manual..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Traballo Lonxit Fixa"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Fin Traballo"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Cancelado"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Saíndo de G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continuar Malla"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Nivelación Malla"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Nivelación 3Puntos"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelación Grid"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malla"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Puntos Laterais"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa "); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Gardar Mapa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar ao Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Gardar en CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup Externo"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info do UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Cantidade de Recheo"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Recheo Manual"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Recheo Intelixente"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Recheo da Malla"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar todo"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar cercanos"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Axustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Axustar Fino Cerc"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Almacenamento Malla"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Rañura Memoria"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Cargar Malla Cama"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Gardar Malla Cama"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Malla %i Cargada"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Malla %i Gardada"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Sen Gardar"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Erro: Gardadado UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Erro: Recuperación UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Desfase de Z: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Desfase de Z Detido"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Paso a Paso"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Crear Malla Fría"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Recheo Intelixente"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Validar Malla"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Axustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Validar Malla"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Axustar Fino Todo"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Gardar Malla Cama"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Control LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Luces"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Axustes Luz"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Vermello"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Laranxa"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Amarelo"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Azul"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Índigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Violeta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Branco"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Por defecto"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luces personalizadas"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidade Vermello"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidade Verde"); + 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("Brillo"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Movendo..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Libre XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrusor"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrusor *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Bico moi frío"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Cama Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bico"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Bico ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Bico Estacionado"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Bico Standby"); + PROGMEM Language_Str MSG_BED = _UxGT("Cama"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Cámara"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventilador"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. Ventilador ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ventilador Mem. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Vel. Vent. Extra"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Vel. Vent. Extra ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controlador Vent."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Velocidade Repouso"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo Auto"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Velocidade Activa"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Tempo Repouso"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxo ~"); + 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("Temperatura Auto."); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Acender"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Apagar"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("Auto-Sint. PID"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Auto-Sint. PID *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Fin Auto-Sint PID"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-Sint. fallida. Extrusor danado."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-Sint. fallida. Temperatura moi alta."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Auto-Sint. fallida. Tempo excedido."); + 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("Escolla"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Escolla *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Acel"); + 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("Desvío Unión"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidade"); + 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("V-viaxe min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Aceleración"); + 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-retrac."); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-viaxe"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frecuencia max"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Avance min"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Pasos/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" pasos/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E pasos/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* pasos/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movemento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E en mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diam. fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diam. fil. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarga mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carga mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avance K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avance K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Constraste LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Gardar Configuración"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Cargar Configuración"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Rest. Defecto"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Erro: CRC EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Erro: Índice EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Erro: Versión EEPROM"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Config Gardada"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/USB"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reiniciar Impresora"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Información"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Axustar"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Comezar impresión"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Seguinte"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Comezar"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Deter"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Imprimir"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Cancelar"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Listo"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Atrás"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Proceder"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Pausando..."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impresión"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Retomar impresión"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Deter impresión"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Imprimindo Obxecto"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancelar Obxecto"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Cancelar Obxecto ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Recuperar Impresión"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tarxeta SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sen tarxeta SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("En repouso..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Prema para Retomar.."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impresión Pausada"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimindo..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impresión Cancelada"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Fin Impresión"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sen movemento."); + PROGMEM Language_Str MSG_KILLED = _UxGT("MORTO."); + PROGMEM Language_Str MSG_STOPPED = _UxGT("DETIDO."); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retraer mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Cambio retra. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraer V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Alzar Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Recup. retra. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Cambio recup. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Recuperacion V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retracción"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lonxitude Retracción"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Cambio Extra"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lonxitude de Purga"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambiar Ferramenta"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Levantar Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocidade prim."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Vel. de Retracción"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Extrusor Est."); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Vel. Recuperación"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Vel. Ventilador"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Tempo Ventilador"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Cambio Ferramenta"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Cambio Automático"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Último Extrusor"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Cambio a *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambiar Filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambiar Filamento *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Cargar Filamento"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Cargar Filamento *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Descargar Filamento"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Descargar Filamento *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Descargar Todo"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Iniciar SD/USB"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambiar SD/USB"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Lanzar SD/USB"); + 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("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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERIGO: Unha mala configuración pode producir daños! Proceder igualmente?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Iniciar TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test de Desfase Z"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Gardar"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estender TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estender Sonda Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Recoller Sonda Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Orixe %s%s%s Primeiro"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Desfases Sonda"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Desfase Sonda X"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Desfase Sonda Y"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desfase Z"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Micropaso X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Micropaso Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Micropaso Z"); + 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_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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("FUGA TÉRMICA CÁMARA"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Erro:TEMP MÁX"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Erro:TEMP MÍN"); + 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 + 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("Quentando..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Arrefriando..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Quentando cama..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Enfriando Cama..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Quentando Cámara..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Arrefriando Cámara..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibracion 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("Configuración Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibración"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ax. Altura Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Axustar Sonda Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonal"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Radio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Acerca de..."); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Información"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelación 3puntos"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelación Lineal"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelación Bilineal"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelación UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelación en Malla"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estatísticas"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Placa nai"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrusores"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baudios"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocolo"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Reloxo Traballo: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Reloxo Traballo: ON"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luz da Caixa"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Brillo Luces"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("IMPRESORA INCORRECTA"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total Impresións"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo Total Imp."); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Impresión máis longa"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total Extruído"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Impresións"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Total"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Máis Longa"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extruido"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Mín"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Máx"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Fonte Alimentación"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Forza do Motor"); + 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("ERRO CONEX. TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Escribe DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("IMPRESIÓN PAUSADA"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("DESCARGAR FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCIÓN DE RETOMAR:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar máis"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Retomar traballo"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bico: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor Filamento"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm Sensor Fil"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Fallo ao ir á Orixe"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Fallo ao Sondar"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("ESCOLLE FILAMENTO"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Actualizar FW MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Precisa Atención."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Retomar impr."); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Retomando..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Cargar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Cargar Todo"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Cargar até bico"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Expulsar Filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Expulsar Filamento ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Descargar Filamento"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Cargando Fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Expulsando Fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Descargando Fil..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Todo"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reiniciar MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reiniciando MMU..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Expulsar, premer"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Mestura"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Compoñente ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Mesturadora"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Degradado"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Degradado Total"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Mestura Conmutada"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Mestura Cíclica"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Mestura de Degradado"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Degradado Inverso"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Activar Ferr-V"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Inicio Ferr-V"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Fin Ferr-V"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias Ferr-V"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Reiniciar Ferr-V"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit mest. Ferr-V"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("Ferr-V reiniciadas"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Inicio Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Fin Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Xogos"); + 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("Preme o botón para", "continuar impresión")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Estacionando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Agarde para", "comezar cambio", "de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Introduza o", "filamento e", "faga click")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Prema o botón para", "quentar o bico")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Quentando bico", "Agarde, por favor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Agarde pola", "descarga do", "filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Agarde pola", "carga do", "filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Agarde para", "purgar o filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Prema para finalizar", "a purga do filamen.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Agarde a que", "se retome", "a impresión")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premer para continuar")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Estacionando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Agarde...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Introduza e click")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Prema para quentar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Quentando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Descargando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Cargando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Prema para finalizar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Retomando...")); + #endif + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Controladores TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Controlador Actual"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Limiar Hibrido"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Orixe sen Sensores"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Reiniciar"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" dentro:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Reacción"); + 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("Corrección"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Suavizado"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Nivel Eixe X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrar"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tempo exc. Quent."); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Requentar"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Requentando..."); +} diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h new file mode 100644 index 00000000..1b2ae41f --- /dev/null +++ b/Marlin/src/lcd/language/language_hr.h @@ -0,0 +1,170 @@ +/** + * 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 + +/** + * Croatian (Hrvatski) + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. + +namespace Language_hr { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Croatian"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" spreman."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD kartica umetnuta"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD kartica uklonjena"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Main"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto pokretanje"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Ugasi steppere"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Automatski homing"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home-aj X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Home-aj Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Home-aj Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Home-aj XYZ"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klikni za početak"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sljedeća točka"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Niveliranje gotovo!"); + 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"); + #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"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Miči os"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Niveliraj bed"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Niveliraj bed"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Miči X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Miči Y"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Miči %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Miči 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Miči 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Miči 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Brzina"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Bed Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dizna"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Dizna ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Bed"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Brzina ventilatora"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Brzina ventilatora ~"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Odaberi"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Odaberi *"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperature"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Gibanje"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD-a"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Pohrani u memoriju"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Učitaj memoriju"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Učitaj Defaults"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Osvježi"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info screen"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Pripremi"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pauziraj print"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nastavi print"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zaustavi print"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Printaj s SD kartice"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nema SD kartice"); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Čekaj korisnika..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print otkazan"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ZAUSTAVLJEN. "); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Promijeni filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Promijeni filament *"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Init. SD karticu"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Promijeni SD karticu"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Grijanje neuspješno"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Grijanje..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Grijanje Bed-a..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibracija"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibriraj X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibriraj Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibriraj Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibriraj Središte"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O printeru"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Podaci o printeru"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistika printera"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Podaci o elektronici"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extruderi"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvjetljenje"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Neispravan pisač"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Broj printova"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ukupno printanja"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najduži print"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano ukupno"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Printovi"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Završeni"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Ukupno"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najduži"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrudirano"); + #endif + + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Napajanje"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Nastavi print"); + + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Čekaj", "filament unload")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Pričekaj", "filament load")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Nastavljam...")); + + #if LCD_HEIGHT >= 4 + // Up to 3 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čekaj početak", "filamenta", "promijeni")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Umetni filament", "i pritisni tipku", "za nastavak...")); + #else + // Up to 2 lines allowed + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT("Pričekaj..."); + //PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("?", "?")); + #endif +} diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h new file mode 100644 index 00000000..6e1b30c1 --- /dev/null +++ b/Marlin/src/lcd/language/language_hu.h @@ -0,0 +1,630 @@ +/** + * 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 + +/** + * Magyar + * + * LCD Menü Üzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html + * Marlin 2.0.x bugfix Magyar fordítása. A fordítást folyamatosan javítom és frissítem. + * A Magyar fordítást készítette: AntoszHUN + * + * + */ + +namespace Language_hu { + using namespace Language_en; // A fordítás az örökölt Amerikai Angol (English) karakterláncokat használja. + + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Magyar"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Kész."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("IGEN"); + PROGMEM Language_Str MSG_NO = _UxGT("NEM"); + PROGMEM Language_Str MSG_BACK = _UxGT("Vissza"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Megszakítás..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló Behelyezve"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló Eltávolítva"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. Végállás"); + PROGMEM Language_Str MSG_MAIN = _UxGT(""); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("XYZ Auto kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Kezdöpont"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö Pont"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés Kész!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Szint Csökkentés"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Kikapcsolás"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudál"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Visszahúz"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Tengelyek Mozgatása"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ágy Szintezés"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ágy szintezése"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Sarok szint"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Következö sarok"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Háló Szerkesztö"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Háló Szerkesztése"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Háló Szerk. Állj"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Próbapont"); + 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("Z Érték"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni Parancs"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Teszt"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mód"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz Eltolás"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkolás"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fúvóka X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fúvóka Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Eszköz"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes Ágy Szint"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési Pont"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi Háló Építés"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Tégy alátétet és mérj"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Üres ágyat mérj"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktivál"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktivál"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ágy Höfok"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ágy Höfok"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka Höfok"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka Höfok"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló Szerkesztés"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni Háló Szerkesztés"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított Háló"); + 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"); + #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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás Kész"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Törölve"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Kilépö G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ágy Háló Folyt."); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Háló Szintezés"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos Szintezés"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács Szintezés"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Háló Szint"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Oldal pontok"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Térkép Típus"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Háló Térkép Kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host Kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV Kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató Backup Ki"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó Kimenet"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési Költség"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi Kitöltés"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos Kitöltés"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Háló Kitöltés"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Minden Érvénytelen"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi Érvénytelen"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet Finomhangolja"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi Finomhangolása"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló Tárolás"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memória Foglalat"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ágy háló Betöltés"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Ágy háló Mentés"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i Betöltve"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i Mentve"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL Mentés"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL Visszaáll"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Eltolás: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás Leállítva"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl Lépésre UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg Háló Készítés"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens Kitöltés"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló Érvényesítés"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden Finomítása"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló Érvényesítés"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden Finomítása"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ágy Háló Mentése"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Vezérlés"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Világítás"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított Színek"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Piros"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Narancs"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sárga"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zöld"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Kék"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigó"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Fehér"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni Szín"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros Intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld Intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Kék Intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Fehér Intenzitás"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Fényerö"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Mozgás..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY Szabad"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Mozgás"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Mozgás"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Mozgás"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Sebesség"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z ágy"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fúvóka"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fúvóka ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej Parkolva"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej Készenlétbe"); + PROGMEM Language_Str MSG_BED = _UxGT("Ágy"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Burkolat"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Hütés sebesség"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Hütés sebesség ="); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt Hütés ="); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség ="); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hűtésvezérlés"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus Mód"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív Sebesség"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Készenlét"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Folyás"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Folyás ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Konfiguráció"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Minimum"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Maximum"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Tényezö"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata Höfok"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Be"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Ki"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Hangolás"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Hangolás *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz Adagoló."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); + 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("Kiválaszt"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Kiválaszt *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Gyorsítás"); + PROGMEM Language_Str MSG_JERK = _UxGT("Rántás"); + PROGMEM Language_Str MSG_VA_JERK = LCD_STR_A _UxGT(" Ránt. Seb."); + PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. Seb."); + PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. Seb."); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("E Ránt. Seb."); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont Eltérés"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Sebesség"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max Sebesség ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Max Sebesség ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Max Sebesség ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Max Sebesség ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Max Sebesség *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Min Sebesség"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Min Utazó.seb."); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Gyorsulás"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max Gyors. ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max Gyors. ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max Gyors. ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max Gyors. ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max Gyorsulás *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Visszahúzás"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Utazás"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max Frekvencia"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min Elötolás"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Lépés/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" lépés/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" lépés/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" lépés/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E lépés/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*lépés/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Höfok"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Mozgatások"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Nyomtatószál"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Átm."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Átm. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Betöltés mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Haladó K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Haladó K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontraszt"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Mentés EEPROM"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM Inicializálás"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM Index"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM Verzió"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások Mentve"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló Frissítés"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató Újraindítása"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Hangolás"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás Indítása"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Tovább"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Kezdet"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Állj"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Nyomtatás"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Újraindítás"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Mégse"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Kész"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Vissza"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Folytatás"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Szüneteltetve..."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás Szünetelés"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum Nyomtatása"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum Törlése"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objektum Törlése ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kiesés Helyreáll."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Nyomtatás Tárolóról"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nincs Tároló"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Alvás..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Katt a folytatáshoz..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Nyomtatás szünetelve"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Nyomtatás..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Nyomtatás leállítva"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Nyomtatás Kész"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nincs mozgás."); + PROGMEM Language_Str MSG_KILLED = _UxGT("HALOTT! "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("MEGÁLLT! "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Visszahúzás mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás Cs. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Viszahúzás"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási Távolság"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Szerszámcsere"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Emelés"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. Sebesség"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej Parkolás"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszahúzás Sebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN Sebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Szerszámcsere"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata Csere"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó Adagoló"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szál csere"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szál csere *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Szál betöltés"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Szál eltávolítás *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet Eltávolít"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Tároló"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Tároló csere"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Tároló Kiadása"); + 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("Ö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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Szonda Y Eltolás"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Szonda Z Eltolás"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z"); + 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_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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÜTÉS KIMARADÁS"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); + 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 + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("ó"); // Csak egy karakter + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("p"); // Csak egy karakter + PROGMEM Language_Str MSG_HEATING = _UxGT("Fütés..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Hütés..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ágy fütés..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ágy hütés..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibráció"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X Kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y Kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z Kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ Kalibrálás"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Beállítások"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibráció"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Magasság Kalib."); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Szonda Eltolás"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rúd"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Magasság"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Sugár"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("A Nyomtatóról"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató Infó"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Pontos Szintezés"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineáris Szintezés"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineáris Szintezés"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Egységes Ágy Szintezés"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Háló Szintezés"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statisztikák"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Alaplap Infó"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termisztorok"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Adagolók"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Átviteli sebesség"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Munkalámpa"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("HELYTELEN NYOMTATÓ"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás Számláló"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Összes nyomtatási idö"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb munkaidö"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Összes anyag"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatások"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Összes"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Kiadott"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Höfok"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Höfok"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási Erö"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Meghajtó %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÁSI HIBA"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Írása"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÁL CSERE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("NYOMTATÁS SZÜNETEL"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("SZÁL BETÖLTÉS"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("SZÁL ELTÁVOLÍTÁS"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FOLYTATÁSI OPCIÓ:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fúvóka: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás Szenzor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás Táv. mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Szondázás hiba"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÁLVÁLASZTÁS"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver Feltöltése!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Figyelmeztetés."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás Folytatása"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Folytatás..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál Betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes Betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka Betöltése"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál Kiadása"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál Kiadása ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Szál betölt. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Szál kiadás...."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Szál kiadása...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Mind"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Nyomtatószál ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Újraindítás"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Újraindul..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Eltávolít, kattint"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Kever"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Összetevö ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Keverö"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Színátm."); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Teljes Színátm."); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Váltás Keverésre"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciklikus Keverés"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Színátm. Keverés"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Fordított Színátm."); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktív V-szerszám"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Kezdés V-szerszám"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Vége V-szerszám"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Ál V-szerszám"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Újra V-szerszám"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Gyors V-szerszám Kev."); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-szersz. visszaáll."); + PROGMEM Language_Str MSG_START_Z = _UxGT("Kezdés Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Vége Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Játékok"); + 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"); + + // + // 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_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nyomj gombot", "nyomtatás folytatáshoz")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szál csere", "indítás")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Szál behelyezés", "majd nyomj gombot", "a folytatáshoz")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fúvóka fűtéséhez")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fúvóka fűtése", "Kérlek várj...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Várj a", "szál kiadására")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kattints a készre", "szál tiszta")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Várj a nyomtatóra", "majd foltyat...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek Várj...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fűtéshez")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fűtés...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Kiadás...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Betöltés...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Tisztítás...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Katt ha kész")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Folytatás...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Meghajtók"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Meghajtó áram"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid Küszöbérték"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros Kezdöpont"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Léptetö Mód"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Mód"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Újraindítás"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" be:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Holtjáték"); + 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("Korrekció"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Simítás"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely Szint"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtéskimaradás"); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafűt"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); +} + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h new file mode 100644 index 00000000..38fffcb7 --- /dev/null +++ b/Marlin/src/lcd/language/language_it.h @@ -0,0 +1,655 @@ +/** + * 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 + +/** + * Italian + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_it { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Italian"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("SI"); + PROGMEM Language_Str MSG_NO = _UxGT("NO"); + PROGMEM Language_Str MSG_BACK = _UxGT("Indietro"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Annullando..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Media inserito"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Media rimosso"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Aspettando media"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inizial.SD fallita"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo media"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Overflow subchiamate"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa Soft"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principale"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configurazione"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu di debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam."); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Auto Home"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Home asse X"); + 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"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Livel. terminato!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Fade Height"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Controllo laser"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Laser Off"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Laser On"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Potenza laser"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Controllo mandrino"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Mandrino Off"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Mandrino On"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Potenza mandrino"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Accendi aliment."); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment."); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Estrudi"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Ritrai"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Muovi Asse"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Livella piano"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Livella piano"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Livella spigoli"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Prossimo spigolo"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor Mesh"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Modifica Mesh"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Modif. Mesh Fermata"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punto sondato"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Indice X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indice Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valore di Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandi personaliz."); + 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"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplicazione"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Copia speculare"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pieno controllo"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2° ugello X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2° ugello Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2° ugello Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 in corso"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Strumenti UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Mesh Manuale"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Metti spes. e misura"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Misura"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Rimuovi e mis.piatto"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Spostamento succes."); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Attiva UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Disattiva UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temp. Piatto"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temp. Piatto"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Ugello"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temp. Ugello"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Modifica Mesh"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Modif.Mesh personal."); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Ritocca Mesh"); + 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"); + #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_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..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Prime a lung.fissa"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Priming terminato"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Annullato"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Uscita da G26"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valida Mesh pers."); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Continua Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Livell. Mesh"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Livell. 3 Punti"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Livell. Griglia Mesh"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Livella Mesh"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Punti laterali"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo di Mappa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Esporta Mappa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Esporta per Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Esporta in CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Backup esterno"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Esporta Info UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Riempimento"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Riempimento Manuale"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Riempimento Smart"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Riempimento Mesh"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalida Tutto"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalid.Punto Vicino"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ritocca All"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ritocca Punto Vicino"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Salvate"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot di memoria"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Carica Mesh Piatto"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Salva Mesh Piatto"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i caricata"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i salvata"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nessuna memoria"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Err: Salvataggio UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Err: Ripristino UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Offset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Offset Fermato"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL passo passo"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Crea Mesh a freddo"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Riempimento Smart"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Valida Mesh"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ritocca All"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Valida Mesh"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ritocca All"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Salva Mesh Piatto"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Controllo LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Luci"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Preset luce"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Rosso"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Arancione"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Giallo"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Blu"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indaco"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Viola"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Bianco"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Predefinito"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Canale ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Luci #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Luce #2 Presets"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Luminosità"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luci personalizzate"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensità rosso"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensità verde"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Intensità blu"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Intensità bianco"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Luminosità"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("In movimento..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY liberi"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Muovi X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Muovi Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Muovi Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Estrusore"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Estrusore *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Ugello freddo"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Muovi di %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Muovi di 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Muovi di 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Muovi di 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocità"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Piatto Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Ugello"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Ugello ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Ugello parcheggiato"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Ugello in pausa"); + PROGMEM Language_Str MSG_BED = _UxGT("Piatto"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Camera"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. ventola ~"); // Max 15 characters + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ventola mem. ~"); // Max 15 characters + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra vel.vent."); // Max 15 characters + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra v.vent. ~"); // Max 15 characters + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Controller vent."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Vel. inattivo"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo autom."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Vel. attivo"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Tempo inattivo"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Flusso"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Flusso ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Controllo"); + 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("Calibrazione PID"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("Calibraz. PID *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("Calibr.PID eseguita"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Calibrazione fallita. Estrusore errato."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Calibrazione fallita. Temperatura troppo alta."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Calibrazione fallita! Tempo scaduto."); + 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("Seleziona"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seleziona *"); + 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("Deviaz. giunzioni"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocità"); + 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("Accelerazione"); + 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-Ritrazione"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-Spostamento"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Frequenza max"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Feed min"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passi/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("passi/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("passi/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("passi/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Epassi/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*passi/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + 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"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carica mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Avanzamento"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Avanzamento *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contrasto LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Salva impostazioni"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carica impostazioni"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ripristina imp."); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inizializza EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Err: CRC EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Err: Indice EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versione EEPROM"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Impostazioni mem."); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aggiorna media"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetta stampante"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Aggiorna"); + 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"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Stampa"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetta"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignora"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Annulla"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Fatto"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Indietro"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Procedi"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Messa in pausa..."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausa stampa"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Host Avvio"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Arresta stampa"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Stampa Oggetto"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Cancella Oggetto"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Canc. Oggetto ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Ripresa da PowerLoss"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Stampa da media"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Media non presente"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Sospensione..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Premi tasto.."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Stampa sospesa"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Stampa..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Stampa Annullata"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Stampa Eseguita"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nessun Movimento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("UCCISO. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ARRESTATO. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Ritrai mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Scamb. Ritrai mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Ritrai V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Salta mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Avanza mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Scamb. Avanza mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Avanza V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("Scamb. Avanza V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoRitrai"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Lunghezza scambio"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra scambio"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Lunghezza spurgo"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Cambio utensile"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Risalita Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Velocità innesco"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Velocità ritrazione"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Parcheggia testa"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Recover Speed"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Velocità ventola"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Tempo ventola"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto ON"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto OFF"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Migrazione utensile"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-migrazione"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Ultimo estrusore"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Migra a *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Cambia filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Cambia filam. *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Carica filamento"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Carica filamento *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Rimuovi filamento"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Rimuovi filam. *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Rimuovi tutto"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Collega media"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Cambia media"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Rilascia media"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z probe fuori piatto"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Fattore distorsione"); + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Autotest BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Resetta BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Estendi BLTouch"); + PROGMEM Language_Str MSG_BLTOUCH_SW_MODE = _UxGT("BLTouch modo SW"); + PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("BLTouch modo 5V"); + PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("BLTouch modo OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("BLTouch modo mem."); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("Metti BLTouch a 5V"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("Metti BLTouch a OD"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Segnala modo"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("PERICOLO: Impostazioni errate possono cause danni! Procedo comunque?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inizializ.TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z offset"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Memorizzare"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Estendi TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Estendi Sonda-Z"); + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Ritrai BLTouch"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Ritrai Sonda-Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s prima"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Offsets sonda"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Offset X sonda"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Offset Y sonda"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z sonda"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Muovi ugel.su letto"); + 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("Totali"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Finecorsa annullati"); + 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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("T.CAMERA FUORI CTRL"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: TEMP MASSIMA"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: TEMP MINIMA"); + 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 + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); // Un solo carattere + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // Un solo carattere + PROGMEM Language_Str MSG_HEATING = _UxGT("Riscaldamento..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Raffreddamento.."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Risc. piatto..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Raffr. piatto..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Risc. sonda..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Raffr. sonda..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Risc. camera..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Calibra centro"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Impostaz. Delta"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto calibrazione"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Imp. altezza Delta"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Offset sonda-Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Barra Diagonale"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altezza"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Raggio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Riguardo stampante"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. stampante"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Livel. a 3 punti"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Livel. Lineare"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Livel. Bilineare"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Livel.piatto unific."); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Livel. Mesh"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statistiche"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. scheda"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistori"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Estrusori"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protocollo"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Controllo fuga: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Controllo fuga: ON"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Timeout inatt.ugello"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Luci Case"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Luminosità Luci"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("STAMPANTE ERRATA"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Contat. stampa"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completati"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo totale"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Stampe"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Completati"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Durata"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Più lungo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Estruso"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Alimentatore"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Potenza Drive"); + 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("ERR.CONNESSIONE TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Scrivi DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("CAMBIO FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("STAMPA IN PAUSA"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("CARICA FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("RIMUOVI FILAMENTO"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPZIONI RIPRESA:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Spurga di più"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Ugello: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sens.filo termin."); // Max 17 characters + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm filo term."); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Home fallito"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondaggio fallito"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SCELTA FILAMENTO"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Agg.firmware MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU chiede attenz."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Riprendi stampa"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Ripresa..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Carica filamento"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Carica tutto"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Carica fino ugello"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Espelli filamento"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Espelli filam.~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Scarica filamento"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Caric.fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Esplus.filam. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Scaric.filam. ..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tutto"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Azzera MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Azzeramento MMU..."); + 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_MIXER = _UxGT("Miscelatore"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradiente"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Gradiente pieno"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Alterna miscela"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciclo miscela"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Miscela gradiente"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Inverti gradiente"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("V-tool attivo"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("V-tool iniziale"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("V-tool finale"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("V-tool alias"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Ripristina V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Commit mix V-tool"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools ripristin."); + PROGMEM Language_Str MSG_START_Z = _UxGT("Z inizio:"); + PROGMEM Language_Str MSG_END_Z = _UxGT("Z fine:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Giochi"); + 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("Indice pag. errato"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Vel. pag. errata"); + + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Modif.password"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Login richiesto"); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Impostaz.password"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Inserisci cifra"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Imp./Modif.password"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Elimina password"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("La password è "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Ricominciare"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Ricordati di mem.!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Password eliminata"); + + // + // Le schermate di Cambio Filamento possono visualizzare fino a 3 linee su un display a 4 righe + // ...o fino a 2 linee su un display a 3 righe. + #if LCD_HEIGHT >= 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Premi per", "riprendere", "la stampa")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcheggiando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Attendere avvio", "del cambio", "di filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserisci il", "filamento e premi", "per continuare")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premi per", "riscaldare ugello")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Riscaldam. ugello", "Attendere prego...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Attendere", "l'espulsione", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Attendere", "il caricamento", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Attendere", "lo spurgo", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Premi x terminare", "lo spurgo", "del filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Attendere", "la ripresa", "della stampa...")); + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Premi x continuare")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Attendere...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Inserisci e premi")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Riscalda ugello")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Riscaldamento...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Espulsione...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Caricamento...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spurgo filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Premi x terminare")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa...")); + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Drivers TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Driver in uso"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Azzer. senza sens."); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Modo stepping"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); + + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Resetta"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" tra:"); + + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Gioco"); + 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("Correzione"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Livello asse X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto Calibra"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Timeout riscaldatore"); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Riscalda"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Riscaldando..."); + + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Proc.guid.sonda Z"); +} diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h new file mode 100644 index 00000000..32b12f50 --- /dev/null +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -0,0 +1,252 @@ +/** + * 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 + +/** + * Japanese (Kana) + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +//#define DISPLAY_CHARSET_ISO10646_KANA + +namespace Language_jp_kana { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 3; + PROGMEM Language_Str LANGUAGE = _UxGT("Japanese"); + + // This is just to show the potential benefit of Unicode. + // This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF. + + // 片仮名表示定義 + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" ジュンビカンリョウ"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted" + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed" + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("メイン"); // "Main" + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("ジドウカイシ"); // "Autostart" + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers" + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("デバッグメニュー"); // "Debug Menu" + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("プログレスバー テスト"); // "Progress Bar Test" + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("ゲンテンフッキ"); // "Auto home" + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Xジク ゲンテンフッキ"); // "Home X" + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Yジク ゲンテンフッキ"); // "Home Y" + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Zジク ゲンテンフッキ"); // "Home Z" + 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" + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("レベリングカンリョウ"); // "Leveling Done!" + 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" + #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" + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("オシダシ"); // "Extrude" + PROGMEM Language_Str MSG_RETRACT = _UxGT("ヒキコミセッテイ"); // "Retract" + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("ジクイドウ"); // "Move axis" + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("ベッドレベリング"); // "Bed leveling" + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("ベッドレベリング"); // "Level bed" + + 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" + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z" + PROGMEM Language_Str MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder" + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("%smm イドウ"); // "Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm" + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm" + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm" + PROGMEM Language_Str MSG_SPEED = _UxGT("ソクド"); // "Speed" + PROGMEM Language_Str MSG_BED_Z = _UxGT("Zオフセット"); // "Bed Z" + PROGMEM Language_Str MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle" + PROGMEM Language_Str MSG_BED = _UxGT("ベッド"); // "Bed" + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("ファンソクド"); // "Fan speed" + PROGMEM Language_Str MSG_FLOW = _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_SELECT = _UxGT("センタク"); // "Select" + PROGMEM Language_Str MSG_SELECT_E = _UxGT("センタク *"); + PROGMEM Language_Str MSG_ACC = _UxGT("カソクド mm/s²"); // "Accel" + PROGMEM Language_Str MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk" + PROGMEM Language_Str MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_A; // "Va-jerk" + PROGMEM Language_Str MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_B; // "Vb-jerk" + PROGMEM Language_Str MSG_VC_JERK = _UxGT("ジク ヤクドウ mm/s") LCD_STR_C; // "Vc-jerk" + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("エクストルーダー ヤクド"); // "Ve-jerk" + PROGMEM Language_Str MSG_VMAX_A = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax A" + PROGMEM Language_Str MSG_VMAX_B = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax B" + PROGMEM Language_Str MSG_VMAX_C = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax C" + PROGMEM Language_Str MSG_VMAX_E = _UxGT("サイダイオクリソクド ") LCD_STR_A; // "Vmax E" + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("サイダイオクリソクド *"); // "Vmax E1" + PROGMEM Language_Str MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin" + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min" + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("カソクド mm/s²"); // "Accel" + PROGMEM Language_Str MSG_AMAX = _UxGT("サイダイカソクド "); // "Amax " + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract" + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel" + 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_FILAMENT_DIAM = _UxGT("フィラメントチョッケイ"); // "Fil. Dia." + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("フィラメントチョッケイ *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast" + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("EEPROMヘホゾン"); // "Store memory" + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("EEPROMカラヨミコミ"); // "Load memory" + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("セッテイリセット"); // "Restore Defaults" + 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_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_MEDIA_MENU = _UxGT("メディアカラプリント"); // "Print from SD" + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("メディアガアリマセン"); // "Card removed" + PROGMEM Language_Str MSG_DWELL = _UxGT("キュウシ"); // "Sleep..." + PROGMEM Language_Str MSG_USERWAIT = _UxGT("ツヅケルニハクリックシテクダサイ"); // "Wait for user..." + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("プリントガチュウシサレマシタ"); // "Print aborted" + 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("ヒキコミリョウ mm"); // "Retract mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm" + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "Unretr. mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S Unretr. mm" + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "Unretract V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "Auto-Retract" + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament" + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card" + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card" + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Zプローブ ベッドガイ"); // "Z probe out. bed" + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch ジコシンダン"); // "BLTouch Self-Test" + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("BLTouch リセット"); // "Reset BLTouch" + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("サキニ %s%s%s ヲフッキサセテクダサイ"); // "Home ... first" + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Zオフセット"); // "Z Offset" + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Xジク ビドウ"); // "Babystep X" + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Yジク ビドウ"); // "Babystep Y" + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Zジク ビドウ"); // "Babystep Z" + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("イドウゲンカイケンチキノウ"); // "Endstop abort" + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("カネツシッパイ"); // "Heating failed" + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("エラー:ジョウチョウサーミスターキノウ"); // "Err: REDUNDANT TEMP" + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("ネツボウソウ"); // "THERMAL RUNAWAY" + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンチョウカ"); // "Err: MAXTEMP" + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" + 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_BED_HEATING = _UxGT("ベッド カネツチュウ"); // "Bed Heating..." + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("デルタ コウセイ"); // "Delta Calibration" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Xジク コウセイ"); // "Calibrate X" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Yジク コウセイ"); // "Calibrate Y" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Zジク コウセイ"); // "Calibrate Z" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("チュウシン コウセイ"); // "Calibrate Center" + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("コノプリンターニツイテ"); // "About Printer" + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("プリンタージョウホウ"); // "Printer Info" + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("プリントジョウキョウ"); // "Printer Stats" + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("セイギョケイジョウホウ"); // "Board Info" + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("サーミスター"); // "Thermistors" + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("エクストルーダースウ"); // "Extruders" + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("ボーレート"); // "Baud" + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("プロトコル"); // "Protocol" + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("キョウタイナイショウメイ"); // "Case light" + 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_LONGEST = _UxGT("サイチョウプリントジカン"); // "Longest job time" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("フィラメントシヨウリョウルイケイ"); // "Extruded total" + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("セッテイサイテイオン"); // "Min Temp" + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("セッテイサイコウオン"); // "Max Temp" + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("デンゲンシュベツ"); // "Power Supply" + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("モータークドウリョク"); // "Drive Strength" + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X DACシュツリョク %"); // "X Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y DACシュツリョク %"); // "Y Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z DACシュツリョク %"); // "Z Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E DACシュツリョク %"); // "E Driver %" + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("EEPROMヘホゾン"); // "Store memory" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("イチジテイシ"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("プリントサイカイ"); // "Resume print" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("コウカンヲカイシシマス", "シバラクオマチクダサイ")); // "Wait for start of the filament" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("フィラメントヌキダシチュウ", "シバラクオマチクダサイ")); // "Wait for filament unload" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("フィラメントヲソウニュウシ,", "クリックスルトゾッコウシマス")); // "Insert filament and press button" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("フィラメントソウテンチュウ", "シバラクオマチクダサイ")); // "Wait for filament load" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("プリントヲサイカイシマス", "シバラクオマチクダサイ")); // "Wait for print to resume" + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("マチガッタプリンター"); // "Wrong printer" + + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("セッテイカンリ"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("ショウサイセッテイ"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("コショカイフク"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROMショキカ"); + + 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_PRINT = _UxGT("プリント"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("リセット"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("キャンセル"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("カンリョウ"); + + PROGMEM Language_Str MSG_YES = _UxGT("ハイ"); + PROGMEM Language_Str MSG_NO = _UxGT("イイエ"); + PROGMEM Language_Str MSG_BACK = _UxGT("モドリ"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("ソクド"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("ステップ/mm"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("ユーザーコマンド"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("プリントガイチジテイシサレマシタ"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("プリントチュウ..."); +} diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h new file mode 100644 index 00000000..1ab03dcf --- /dev/null +++ b/Marlin/src/lcd/language/language_ko_KR.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 + +/** + * Korean + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +namespace Language_ko_KR { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Korean"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _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("엔드스탑"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _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_DEBUG_MENU = _UxGT("디버깅 메뉴"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("프로그레스바 테스트"); + 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_LEVEL_BED_HOMING = _UxGT("XYZ 홈으로"); + 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("레벨링 완료!"); + #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("스위치 전원 켜기"); + 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_IDEX_MODE_MIRRORED_COPY = _UxGT("미러 사본"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("오토레벨링 하기"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("노즐"); + 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_EXTRA_FAN_SPEED = _UxGT("엑스트라 펜 속도"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("엑스트라 펜 속도 ~"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("온도"); + PROGMEM Language_Str MSG_MOTION = _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_REFRESH = LCD_STR_REFRESH _UxGT("새로고침"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("처음으로"); + PROGMEM Language_Str MSG_PREPARE = _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_MEDIA_MENU = _UxGT("SD 카드출력"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD 카드없음"); + PROGMEM Language_Str MSG_DWELL = _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_KILLED = _UxGT("죽음. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("멈춤. "); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("잘못된 프린터"); +} diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h new file mode 100644 index 00000000..c142c5c9 --- /dev/null +++ b/Marlin/src/lcd/language/language_nl.h @@ -0,0 +1,231 @@ +/** + * 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 + +/** + * Dutch + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_1 +#define NOT_EXTENDED_ISO10646_1_5X7 + +namespace Language_nl { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + PROGMEM Language_Str LANGUAGE = _UxGT("Dutch"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" gereed."); + PROGMEM Language_Str MSG_BACK = _UxGT("Terug"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Kaart ingestoken"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Kaart verwijderd"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters + PROGMEM Language_Str MSG_MAIN = _UxGT("Hoofdmenu"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motoren uit"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Debug Menu"); // accepted English terms + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Vooruitgang Test"); + + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Klik voor begin"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Volgende Plaats"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Bed level kompl."); + 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"); + #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"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retract"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("As verplaatsen"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Bed Leveling"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Level bed"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Verplaatsen..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Vrij XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Verplaats X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Verplaats Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Verplaats Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extruder"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extruder *"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Verplaats %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Verplaats 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Verplaats 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Verplaats 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Snelheid"); + 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_BED = _UxGT("Bed"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan snelheid"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan snelheid ~"); + 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("Aan"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Uit"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Selecteer"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Selecteer *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Versn"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatuur"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Beweging"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Advance K"); // accepted english dutch + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Advance K *"); // accepted english dutch + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Dia. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD contrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Geheugen opslaan"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Geheugen laden"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Noodstop reset"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ververs"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Info scherm"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Voorbereiden"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Afstellen"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Print pauzeren"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Print hervatten"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Print stoppen"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Print van SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Geen SD kaart"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Slapen..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Wachten..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Print afgebroken"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Geen beweging."); + PROGMEM Language_Str MSG_KILLED = _UxGT("Afgebroken. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Gestopt. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retract mm"); // accepted English term in Dutch + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Ruil Retract mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retract F"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Ruil Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretr. FR"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Verv. Filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Verv. Filament *"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Init. SD kaart"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Verv. SD Kaart"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z probe uit. bed"); + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Zelf-Test"); + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Home %s%s%s Eerst"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Offset"); // accepted English term in Dutch + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Babystap X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Babystap Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Babystap Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Endstop afbr."); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Voorverw. fout"); + PROGMEM Language_Str MSG_ERR_REDUNDANT_TEMP = _UxGT("Redun. temp fout"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("Therm. wegloop"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: Max. temp"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: Min. temp"); + 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 + 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("Voorwarmen..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Bed voorverw..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibratie"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibreer X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibreer Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibreer Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibreer Midden"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Calibratie"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Zet Delta Hoogte"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Case licht"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Onjuiste printer"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Printed Aantal"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Totaal Voltooid"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Totale Printtijd"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Langste Printtijd"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Totaal Extrudeert"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Aantal"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Voltooid"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Printtijd "); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Langste"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Extrud."); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); // accepted English term in Dutch + + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Motorstroom"); + + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC Opslaan"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Hervat print"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozzle: "); // accepted English term + // + // 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 + // Up to 3 lines + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Wacht voor start", "filament te", "verwisselen")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament uit", "te laden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozzle verw.", "Wacht a.u.b.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Laad filament", "en druk knop", "om verder...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Wacht voor", "filament te", "laden")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Wacht voor print", "om verder", "te gaan")); + #else + // Up to 2 lines + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Wacht voor", "start...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Wacht voor", "uitladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Klik knop om...", "verw. nozzle.")); //nozzle accepted English term + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Verwarmen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("Laad filament", "en druk knop")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Wacht voor", "inladen...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Wacht voor", "printing...")); + #endif +} diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h new file mode 100644 index 00000000..770c872a --- /dev/null +++ b/Marlin/src/lcd/language/language_pl.h @@ -0,0 +1,533 @@ +/** + * 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 + +/** + * Polish - includes accented characters + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_PL + +namespace Language_pl { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Polish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" gotowy."); + PROGMEM Language_Str MSG_YES = _UxGT("TAK"); + PROGMEM Language_Str MSG_NO = _UxGT("NIE"); + PROGMEM Language_Str MSG_BACK = _UxGT("Wstecz"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Przerywanie..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta włożona"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta usunięta"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Oczekiwanie na kartę"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Bład odczytu karty"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("Urządzenie USB usunięte"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Błąd uruchomienia USB"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Krańców."); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Progr. Krańcówki"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu główne"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Ustawienie zaawansowane"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguracja"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autostart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Wyłącz silniki"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debugowania"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testowy pasek postępu"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Pozycja zerowa"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Zeruj X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Zeruj Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Zeruj Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Autowyrównanie Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Pozycja zerowa"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kliknij by rozp."); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Następny punkt"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Wypoziomowano!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Wys. zanikania"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Wyłącz Laser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Włącz Laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Zasilanie Lasera"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Sterowanie wrzeciona"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Wyłącz wrzeciono"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Włącz wrzeciono"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Zasilanie wrzeciona"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Rewers wrzeciona"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Włącz zasilacz"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Wyłącz zasilacz"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ekstruzja"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Wycofanie"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Ruch osi"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Poziomowanie stołu"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Wypoziomuj stół"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Narożniki poziomowania"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Nastepny narożnik"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Edytor siatki"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Edycja siatki"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Edycja siatki zatrzymana"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Punkt pomiarowy"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("Indeks X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indeks Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Wartość Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Własne Polecenia"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punky"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylenie"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Tryb IDEX"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Przesunięcie narzędzia"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkowanie"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikowanie"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Kopia lustrzana"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Pełne sterowanie"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2ga dysza X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2ga dysza Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2ga dysza Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Wykonywanie G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Narzędzia UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Punkt pochylenia"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Ręczne Budowanie Siatki"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Umieść podkładkę i zmierz"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Zmierz"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Usuń & Zmierz Stół"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Przesuwanie do następnego"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktywacja UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Dezaktywacja UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Temperatura stołu"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Temperatura stołu"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temperatura dyszy"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Temperatura dyszy"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Edycja siatki"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Edycja własnej siatki"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Dostrajanie siatki"); + 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ę"); + #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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Napełnianie ręczne..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Napełnij kreśloną długością"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Napełnianie zakończone"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Przewane"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Opuszczanie G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Kontynuuj tworzenie siatki"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Poziomowanie siatką"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Poziomowaie 3-punktowe"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Poziomowaie według siatki"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Poziomuj siatkę"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Punkty boczne"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Rodzaj mapy"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Wyslij mapę siatki"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Wyslij do Hosta"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Wyslij do CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Kopia poza drukarką"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Wyslij info UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Stopień wypełnienia"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ręczne wypełnienie"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Inteligentne wypełnienie"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Wypełnienie siatki"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Unieważnij wszystko"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Unieważnij najbliższy"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Dostrajaj wszystko"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Dostrajaj najbliższy"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Przechowywanie siatki"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot Pamięci"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Załaduj siatkę stołu"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Zapisz siatkę stołu"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Siatka %i załadowana"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Siatka %i zapisana"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Brak magazynu"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Błąd: Zapis UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Bład: Odczyt UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Przesunięcie Z: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Przesunięcie Z zatrzymane"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("UBL Krok po kroku"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Tworzenie zimnej siatki"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligentne wypełnienie"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Sprawdzenie siatki"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Dostrojenie wszystkiego"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Sprawdzenie siatki"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Dostrojenie wszystkiego"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Zapis siatki stołu"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Sterowanie LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Światła"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Ustawienia świateł"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Czerwony"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Pomarańczowy"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Zółty"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zielony"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Niebieski"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indygo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fioletowy"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biały"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Domyślny"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Własne światła"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Czerwony"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zielony"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Niebieski"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Biały"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jasność"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Ruch..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Swobodne XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Przesuń w X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Przesuń w Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Przesuń w Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruzja (os E)"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Ekstruzja (os E) *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Dysza za zimna"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Przesuń co %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Przesuń co .1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Przesuń co 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Przesuń co 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Predkość"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Stół Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Dysza"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Dysza ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Stół"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Obudowa"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Obroty wiatraka"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Obroty wiatraka ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Obroty dodatkowego wiatraka"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Obroty dodatkowego wiatraka ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Przepływ"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Przepływ ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Ustawienia"); + 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(" Mnożnik"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto. temperatura"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Wł."); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Wył."); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Autostrojenie"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Autostrojenie *"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Wybierz"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Wybierz *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Przyspieszenie"); + PROGMEM Language_Str MSG_JERK = _UxGT("Zryw"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Zryw V") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Zryw V") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Zryw V") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Zryw Ve"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Prędkość (V)"); + 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("Vskok min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Przyspieszenie (A)"); + 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-wycofanie"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-przesuń."); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("kroki/mm"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("kroki") LCD_STR_A _UxGT("/mm"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("kroki") LCD_STR_B _UxGT("/mm"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("kroki") LCD_STR_C _UxGT("/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("krokiE/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("kroki */mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Ruch"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filament"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E w mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Śr. fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Śr. fil. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Wysuń mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Wsuń 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("Kontrast LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Zapisz w pamięci"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Wczytaj z pamięci"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Ustaw. fabryczne"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Initializuj EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Uaktualnij kartę"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetuj drukarkę"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Odswież"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Ekran główny"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Przygotuj"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Strojenie"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Start wydruku"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Następny"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Inic."); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Stop"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Drukuj"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetuj"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Przerwij"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Gotowe"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Wstrzymaj druk"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Wznowienie"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Stop"); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Odzyskiwanie po awarii"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Karta SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Brak karty"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Uśpij..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Oczekiwanie..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Druk wstrzymany"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Drukowanie..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Druk przerwany"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Brak ruchu"); + PROGMEM Language_Str MSG_KILLED = _UxGT("Ubity. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Zatrzymany. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Wycofaj mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Z Wycof. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Wycofaj V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Skok Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Cof. wycof. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Z Cof. wyc. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Cof. wycof. V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto. wycofanie"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Długość zmiany"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Długość oczyszczania"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Zmiana narzędzia"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Podniesienie Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Prędkość napełniania"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Prędkość wycofania"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Dysza w oczekiwaniu"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Zmień filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Zmień filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Wsuń Filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Wsuń Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Wysuń Filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Wysuń Filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Wysuń wszystkie"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inicjal. karty SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Zmiana karty SD"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Zwolnienie karty"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sonda Z za stołem"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Współczynik skrzywienia"); + 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("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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("UWAGA: Złe ustawienia mogą uszkodzić drukarkę. Kontynuować?"); + 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("Najpierw Home %s%s%s"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Offset Z"); + 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("Łą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_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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ZANIK TEMP.KOMORY"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Błąd: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Błąd: MINTEMP"); + 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 + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("g"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Rozgrzewanie..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Chłodzenie..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Rozgrzewanie stołu..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Chłodzenie stołu..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Rozgrzewanie komory..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chłodzenie komory..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Kalibrowanie Delty"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibruj X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibruj Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibruj Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibruj środek"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Ustawienia delty"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibrowanie"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Ustaw wysokość delty"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Przesun. Z sondy"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Ukośne ramię"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Wysokość"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Promień"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O drukarce"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info drukarki"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Poziomowanie 3-punktowe"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Poziomowanie liniowe"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Poziomowanie biliniowe"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Poziomowanie siatką"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statystyki"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info płyty"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Ekstrudery"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Predkość USB"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokół"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Zegar pracy: OFF"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Zegar pracy: ON"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Oświetlenie obudowy"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jasność oświetlenia"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Niepoprawna drukarka"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Czas druku"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil."); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Wydrukowano"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Ukończono"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Razem"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdł. druk"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Użyty fil."); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Zasilacz"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Siła silnika"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Siła %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Siła %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Siła %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Siła %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC BŁĄD POŁĄCZENIA"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Zapisz DAC EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("ZMIEŃ FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("WYDRUK WSTRZYMANY"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("WSUŃ FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("WYSUŃ FILAMENT"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("OPCJE WZNOWIENIA:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Oczyść więcej"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Kontynuuj"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Dysza: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Czujnik filamentu"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Dystans do czujnika mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Zerowanie nieudane"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Sondowanie nieudane"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("WYBIERZ FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Uaktualnij firmware MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU wymaga uwagi."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Wznów wydruk"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Wznawianie..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Wsuń filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Wsuń wszystko"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Wsuń do dyszy"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Wysuń filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Wysuń filament ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Wysuń filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Wsuwanie fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Wysuwanie fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Wysuwanie fil...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Wszystko"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Resetuj MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Resetowanie MMU..."); + 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_MIXER = _UxGT("Mikser"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Pełny gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Przełacz miks"); + 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("Odwrotny gradient"); + + // + // 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_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nacisnik przycisk", "by wznowić drukowanie")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkowanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Czekam na", "zmianę filamentu", "by wystartować")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Włóż filament", "i naciśnij przycisk", "by kontynuować")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Naciśnij przycisk", "by nagrzać dyszę")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nagrzewanie dyszy", "Proszę czekać...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Czekam na", "wyjęcie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Czekam na", "włożenie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Czekam na", "oczyszczenie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Kliknij by zakończyć", "oczyszczanie filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Czekam na", "wznowienie wydruku...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknij by kontynuować")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkowanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Proszę czekać...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Włóż i kliknij")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknij by nagrzać")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Nagrzewanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Wysuwanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Wsuwanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Oczyszczanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Kliknij by zakończyć")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Wznawianie...")); + #endif +} diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h new file mode 100644 index 00000000..37da6216 --- /dev/null +++ b/Marlin/src/lcd/language/language_pt.h @@ -0,0 +1,163 @@ +/** + * 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 + +/** + * Portuguese + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + + #define DISPLAY_CHARSET_ISO10646_1 + +namespace Language_pt { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Portuguese"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pronta."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Menu principal"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desactivar motores"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir para origem"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir para origem X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir para origem Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir para origem Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Click para iniciar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo ponto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Pronto !"); + 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"); + #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"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudir"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrair"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixo"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Mover X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Mover Extrusor *"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); + PROGMEM Language_Str MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" Bico"); + PROGMEM Language_Str MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" Bico ~"); + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" Base"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. ventoinha"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. ventoinha ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Fluxo"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Fluxo ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Controlo"); + 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_A_RETRACT = _UxGT("A-retracção"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-movimento"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passo/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" passo/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E passo/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* passo/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E em mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Fil. Diam."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Fil. Diam. *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Guardar na memoria"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Carregar da memoria"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Rest. de emergen."); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Recarregar"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Monitorizar"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Preparar"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Afinar"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pausar impressão"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Retomar impressão"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Parar impressão"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Imprimir do SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Sem cartão SD"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Em espera..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Á espera de ordem"); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impressão cancelada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sem movimento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("EMERGÊNCIA. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("PARADO. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT(" Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Troca Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT(" Retrair V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT(" Levantar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT(" DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Troca DesRet mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT(" DesRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT(" Auto-Retract"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Trocar filamento"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Trocar filamento *"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Inici. cartão SD"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Trocar cartão SD"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Sensor fora/base"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Desvio Z"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Fim de curso"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Aquecimento falhou"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: T Máxima"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: T Mínima"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Aquecendo base..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Calibração 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_LCD_ENDSTOPS = _UxGT("Fim de curso"); + + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Impressora Incorreta"); +} diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h new file mode 100644 index 00000000..cf2f7a0c --- /dev/null +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -0,0 +1,481 @@ +/** + * 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 + +/** + * Portuguese (Brazil) + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +namespace Language_pt_br { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + 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"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Config. Avançada"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Configuração"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Início automático"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Desabilit. motores"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu Debug"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Testar Barra Progres"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Ir a origem XYZ"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Ir na origem X"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Ir na origem Y"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Ir na origem Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto alinhar Z"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Indo para origem"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Clique para Iniciar"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Próximo Ponto"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Fim nivelação!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Suavizar altura"); + 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"); + #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"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Desligar"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrusar"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Retrair"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Mover eixo"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Nivelação Mesa"); + 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"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Cópia espelhada"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Controle Total"); + 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."); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Fazer malha manual"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Calçar e calibrar"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Medir"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Remover e calibrar"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Movendo para Próximo"); + 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("Temp. Mesa"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Temp. Extrusora"); + 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"); + 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 "); + #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_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"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Nivelação Grid"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Nivelar Malha"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Cantos"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Tipo de Mapa"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Salvar Mapa da Malha"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Enviar Para Host"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Salvar Malha CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Salvar Backup"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Informação do UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Qtd de Enchimento"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Enchimento Manual"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Enchimento Smart"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Preencher malha"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Invalidar tudo"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Invalidar próximo"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Ajuste Fino de Todos"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Ajustar Mais Próximo"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Armazenamento Malha"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Slot de Memória"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ler Malha"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Salvar Malha"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Malha %i carregada"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Malha %i salva"); + 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"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Enchimento Smart"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Validar Malha"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Ajuste Fino de Todos"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Validar Malha"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Ajuste Fino de Todos"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Salvar Malha"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Controle do LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Luz"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Configuração da Luz"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Luz Vermelha"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Luz Laranja"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Luz Amarela"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Luz Verde"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Luz Azul"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Luz Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Luz Violeta"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Luz Branca"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Luz Padrão"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Luz Customizada"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Intensidade Vermelho"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Intensidade Verde"); + 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"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Mover Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Mover Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Mover Extrusor"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Mover Extrusor *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Extrus. mto fria"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mover %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mover 0.1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mover 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mover 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Base Z"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Bocal"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Bocal ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Mesa"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Vel. Ventoinha"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Vel. Ventoinha ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("+Vel. Ventoinha"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("+Vel. Ventoinha ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Vazão"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Vazão ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Controle"); + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Máx"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fator"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Temp. Automática"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Ligado"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Desligado"); + PROGMEM Language_Str MSG_SELECT = _UxGT("Selecionar"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Selecionar *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Acel."); + PROGMEM Language_Str MSG_JERK = _UxGT("Arrancada"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("arrancada V") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("arrancada V") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("arrancada V") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("arrancada VE"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Desv. Junção"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Velocidade"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("VDeslocamento min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Aceleração"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Retrair A"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Movimento A"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Passo/mm"); + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Passo ") LCD_STR_A _UxGT("/mm"); + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Passo ") LCD_STR_B _UxGT("/mm"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Passo ") LCD_STR_C _UxGT("/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Temperatura"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Movimento"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filamento"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Extrusão em mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Diâmetro Fil."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Diâmetro Fil. *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Descarr. mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Carregar mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Avanço K"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Avanço K *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Contraste"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Salvar Configuração"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Ler Configuração"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Restauro seguro"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Iniciar EEPROM"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Atualiz. SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Resetar Impressora"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Atualização"); + 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("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"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Dormindo..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Clique para retomar"); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Impressão Pausada"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Imprimindo..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Impressão Abortada"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Sem movimento"); + PROGMEM Language_Str MSG_KILLED = _UxGT("PARADA DE EMERGÊNCIA"); + PROGMEM Language_Str MSG_STOPPED = _UxGT("PAROU. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Retrair Troca mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retrair V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Saltar mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Des-Retrair mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Des-RetTroca mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Des-Retrair V"); + 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_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_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_HALTED = _UxGT("IMPRESSORA PAROU"); + PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Favor resetar"); + PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("d"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Aquecendo..."); + 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"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Desloc. Sonda Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Haste Diagonal"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Altura"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Raio"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Sobre"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Impressora"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("Nivelamento 3 pontos"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Nivelamento Linear"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Nivelamento Bilinear"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Nivelamento UBL"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Nivelamento da Malha"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Estatísticas"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. da Placa"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistores"); + 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 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Total de Impressões"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Trabalho Mais longo"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Total de Extrusão"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Qtd de Impressões"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Realizadas"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tempo de Impressão"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Maior trabalho"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("T. Extrusão"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Temp Mín"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Temp Máx"); + 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"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Config. de Retomada"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Purgar mais"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Continuar Impressão"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Bocal: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Sensor filamento"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Falha ao ir à origem"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Falha ao sondar"); + + 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")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Aquecendo o bocal", "Aguarde...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Esperando", "remoção de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Esperando", "filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Espere pela", "purga de filamento")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Clique para finaliz.", "purga de filamento")); + 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...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purgando...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Clique p. finalizar")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Continuando...")); + #endif +} diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h new file mode 100644 index 00000000..7b54f24a --- /dev/null +++ b/Marlin/src/lcd/language/language_ro.h @@ -0,0 +1,638 @@ +/** + * 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"); + #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"); + 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"); + #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_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("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); + 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("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"); + 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_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_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_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_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h new file mode 100644 index 00000000..2a2f5685 --- /dev/null +++ b/Marlin/src/lcd/language/language_ru.h @@ -0,0 +1,774 @@ +/** + * 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 + +/** + * Russian + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +#define DISPLAY_CHARSET_ISO10646_5 + +namespace Language_ru { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Russian"); + + 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("Переполнение вызова"); + #else + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполн. вызова"); + #endif + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _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_AUTOSTART = _UxGT("Автостарт"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Выключить двигатели"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Меню отладки"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Тест индикатора"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Парковка XYZ"); + 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("Высота спада"); + #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("Установить ноль"); + #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("Частота"); + 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_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_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_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 тест Z-зонда"); + PROGMEM Language_Str MSG_M48_DEVIATION = _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("Полный контроль"); + + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Размещение сопел"); + + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2-е сопло X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2-е сопло Y"); + 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_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_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_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_BUILD_MESH_MENU = _UxGT("Построить сетку"); + #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 + 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("Проверить сетку"); + #if LCD_WIDTH > 21 + #if PREHEAT_COUNT + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Проверить сетку $"); + #endif + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Проверить свою сетку"); + #else + #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 нагрев стола"); + 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("Выравнивание сетки"); + #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_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"); + #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_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_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("Подсветка"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Предустановки света"); + 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_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("Сопло, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_NOZZLE_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("Кулер ~"); + 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_FLOW = _UxGT("Поток"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Поток ~"); + PROGMEM Language_Str MSG_CONTROL = _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_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_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-рывок"); + #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_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("На базовые параметры"); + #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_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_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("ОСТАНОВЛЕНО. "); + #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_RECOVER = _UxGT("Возврат, мм"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Возврат V"); + + 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"); + #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("Загрузить филамент"); + #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_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_STOW = _UxGT("Поднять BLTouch"); + 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_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_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_COOLING = _UxGT("Охлаждение..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Нагрев стола..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Нагрев камеры..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Охлаждение стола..."); + 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"); + 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("Данные принтера"); + #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_PROTOCOL = _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_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_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_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_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_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("Датчик оконч. филамента"); + #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_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("Кирпичи"); + 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("Парковка...")); + // + // 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_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_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_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("Авто калибровка"); + #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_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h new file mode 100644 index 00000000..d0fdf574 --- /dev/null +++ b/Marlin/src/lcd/language/language_sk.h @@ -0,0 +1,646 @@ +/** + * 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 + +/** + * Slovak + * UTF-8 for Graphical Display + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + * + * Translated by Michal Holeš, Farma MaM + * https://www.facebook.com/farmamam + */ +#define DISPLAY_CHARSET_ISO10646_SK + +namespace Language_sk { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Slovak"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená."); + PROGMEM Language_Str MSG_YES = _UxGT("ÁNO"); + PROGMEM Language_Str MSG_NO = _UxGT("NIE"); + PROGMEM Language_Str MSG_BACK = _UxGT("Naspäť"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Ruším..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Karta vložená"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Karta vybraná"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Čakám na kartu"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("Inicial. SD zlyhala"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán."); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Preteč. podprogramu"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znakov + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Hlavná ponuka"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Pokročilé nastav."); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfigurácia"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Auto-štart"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Uvolniť motory"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Ponuka ladenia"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Test uk. priebehu"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Domovská pozícia"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Domov os X"); + 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"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Vyrovnanie hotové!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Výška rovnania"); + 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"); + #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"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Nastavenie lasera"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Vypnúť laser"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Zapnúť laser"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Vypnúť vreteno"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Zapnúť vreteno"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Výkon vretena"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spätný chod"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnúť napájanie"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačiť (extr.)"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Vytiahnuť (retr.)"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Posunúť osy"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnanie podložky"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnať podložku"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnať rohy"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Ďalší roh"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sieťe bodov"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upraviť sieť bodov"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Koniec úprav siete"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Skúšam bod"); + 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("Hodnota Z"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod"); + PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchýlka"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX režim"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Ofset nástrojov"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-parkovanie"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikácia"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Zrkadlená kópia"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Plná kontrola"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. tryska X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. tryska Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. tryska Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Vykonávam G29"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Nástroje UBL"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("UBL rovnanie"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Vyrovnávam bod"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Manuálna sieť bodov"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Položte a zmerajte"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Zmerajte"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Odstráňte a zmerajte"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Presun na ďalší"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Aktivovať UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Deaktivovať UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Teplota podložky"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Teplota hotendu"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Úprava siete bodov"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Upraviť vlastnú sieť"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Doladiť sieť bodov"); + 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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Ručné čistenie..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Čistenie pevn. dĺž."); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Čistenie dokončené"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 zrušený"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Opúšťam G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Pokračovať v sieti"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Sieťové rovnanie"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-bodové rovnanie"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Mriežkové rovnanie"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Vyrovnať podložku"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Postranné body"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Typ siete bodov"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Exportovať sieť"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Export do hosta"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Export do CSV"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Externá záloha"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Info. o výst. UBL"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Hustota mriežky"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Ručné vyplnenie"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Chytré vyplnenie"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Vyplniť mriežku"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Zrušiť všetko"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Zrušiť najbližší"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Upraviť všetky"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Upraviť najbližší"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Úložisko sietí"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Pamäťový slot"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Načítať sieť bodov"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Uložiť sieť bodov"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Sieť %i načítaná"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Sieť %i uložená"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nedostatok miesta"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Chyba: Ukladanie UBL"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Chyba: Obnovenie UBL"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Koniec kompenz. Z"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Postupné UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Studená sieť bodov"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Chytré vyplnenie"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Skontrolovať sieť"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Upraviť všetky"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Skontrolovať sieť"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Upraviť všetky"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Uložiť sieť bodov"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Nastavenie LED"); + PROGMEM Language_Str MSG_LEDS = _UxGT("Svetlo"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Predvolby svetla"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Červená"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Oranžová"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Žltá"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Zelená"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Modrá"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Indigo"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Fialová"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Biela"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Obnoviť nastavenie"); + PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Kanál ="); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("Svetlo #2"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Predvolby svetla #2"); + PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Jas"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Vlastná farba"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Inten. červenej"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Inten. zelenej"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Inten. modrej"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Inten. bielej"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Jas"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Posúvam..."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Uvolniť XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Posunúť X"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Posunúť Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Posunúť Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Extrudér"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Extrudér *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Hotend je studený"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Posunúť o %smm"); + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm"); + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm"); + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm"); + PROGMEM Language_Str MSG_SPEED = _UxGT("Rýchlosť"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Tryska ~"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Tryska zaparkovná"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Záložná tryska"); + PROGMEM Language_Str MSG_BED = _UxGT("Podložka"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Komora"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Rýchlosť vent."); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Rýchlosť vent. ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Ulož. vent. ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Rýchlosť ex. vent."); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Rýchlosť ex. vent. ~"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Vent. riad. jedn."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Voľno. rýchl."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Auto-režím"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív. rýchl."); + PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Doba nečinnosti"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Prietok"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Prietok ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Ovládanie"); + 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(" Fakt"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Auto-teplota"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Zap"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Vyp"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID kalibrácia"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID kalibrácia *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID kal. dokončená"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Auto-kal. zlyhala. Zlý extrúder."); + PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Auto-kal. zlyhala. Príliš vysoká tepl."); + PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Auto-kal. zlyhala! Čas vypršal."); + PROGMEM Language_Str MSG_SELECT = _UxGT("Vybrať"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Vybrať *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Zrýchlenie"); + PROGMEM Language_Str MSG_JERK = _UxGT("Skok"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-skok"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-skok"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-skok"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-skok"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Rýchlosť"); + 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("VPrej Min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Akcelerácia"); + 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-retrakt"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("A-prejazd"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max. frekvencia"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min. posun"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Kroky/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("krokov/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("Ekrokov/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("*krokov/mm"); + 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 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"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Zaviesť mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K pre posun"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K pre posun *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Kontrast LCD"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Uložiť nastavenie"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Načítať nastavenie"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Obnoviť nastavenie"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Inicializ. EEPROM"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Chyba: EEPROM CRC"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Chyba: EEPROM Index"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Chyba: Verzia EEPROM"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Nastavenie uložené"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Aktualizovať z SD"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Reštart. tlačiar."); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnoviť"); + 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."); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Zastaviť"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Tlačiť"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Vynulovať"); + PROGMEM Language_Str MSG_BUTTON_IGNORE = _UxGT("Ignorovať"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("Zrušiť"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Naspäť"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Pokračovať"); + PROGMEM Language_Str MSG_PAUSING = _UxGT("Pozastavujem..."); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastaviť tlač"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnoviť tlač"); + PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Spustiť z hosta"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastaviť tlač"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Tlačím objekt"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Zrušiť objekt"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Zrušiť objekt ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Obnova po výp. nap."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Tlačiť z SD"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Žiadna SD karta"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Spím..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Pokrač. kliknutím..."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Tlač pozastavená"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Tlačím..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Tlač zrušená"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Tlač dokončená"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Žiadny pohyb."); + PROGMEM Language_Str MSG_KILLED = _UxGT("PRERUŠENÉ. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("ZASTAVENÉ. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Retrakt mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Výmena Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Retraktovať V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Zdvih Z mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto-Retract"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Dĺžka výmeny"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Vymeniť naviac"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Dĺžka vytlačenia"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Výmena nástroja"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Zdvihnúť Z"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Primárna rýchl."); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Rýchl. retrakcie"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Parkovať hlavu"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Rýchl. obnovenia"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("Rýchlosť vent."); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("Doba fúkania"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto-Zap"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto-Vyp"); + PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Výmena nástroja"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Auto-výmena"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Posl. extruder"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Vymeniť za *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Vymeniť filament"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Vymeniť filament *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Zaviesť filament"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Zaviesť filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Vysunúť filament"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Vysunúť filament *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Vysunúť všetko"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Načítať SD kartu"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Vymeniť SD kartu"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Odpojiť SD kartu"); + 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("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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("POZOR: Zlé nastav. môže spôsobiť poškoden. Pokračovať?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Inicializ. TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Test Z ofsetu"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Uložiť"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("Zasunúť TouchMI"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Zasunúť sondu Z"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Vysunúť sondu Z"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Najskôr os %s%s%s domov"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Ofsety sondy Z"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X ofset"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y ofset"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z ofset"); + 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("Celkom"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Zastavenie Endstop"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _UxGT("Chyba ohrevu"); + 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."); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("TEPLOTNÝ SKOK KOMO."); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Chyba: MAXTEMP"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Chyba: MINTEMP"); + 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"); + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("h"); + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("m"); + PROGMEM Language_Str MSG_HEATING = _UxGT("Ohrev..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Ochladzovanie..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Ohrev podložky..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Ochladz. podložky..."); + PROGMEM Language_Str MSG_PROBE_HEATING = _UxGT("Ohrev sondy..."); + PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Ochladz. sondy..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Ohrev komory..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Ochladz. komory..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibrácia"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Kalibrovať X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Kalibrovať Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Kalibrovať Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Kalibrovať stred"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta nastavenia"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto-kalibrácia"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Nast. výšku delty"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Ofset sondy Z"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag. rameno"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Výška"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Polomer"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("O tlačiarni"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Info. o tlačiarni"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-bodové rovnanie"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineárne rovnanie"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineárne rovnanie"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("UBL rovnanie"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mriežkové rovnanie"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Štatistika"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Info. o doske"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistory"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Extrudéry"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Rýchlosť"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Tepl. ochrana: VYP"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Tepl. ochrana: ZAP"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Vypr.čas nečinnosti"); + + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Osvetlenie"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Jas svetla"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Nesprávna tlačiareň"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Počet tlačí"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Dokončené"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Celkový čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia tlač"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Celkom vytlačené"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Tlače"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Hotovo"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Čas"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Najdlhšia"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Vytlačené"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Teplota min"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Teplota max"); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Nap. zdroj"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Budenie motorov"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Motor %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Motor %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Motor %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Motor %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("CHYBA KOMUNIKÁ. TMC"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Uložiť do EEPROM"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("VÝMENA FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("PAUZA TLAČE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("ZAVEDENIE FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("VYSUNUTIE FILAMENTU"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("MOŽNOSTI POKRAČ.:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Vytlačiť viacej"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Obnoviť tlač"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Tryska: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Senzor filamentu"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Vzd. mm fil. senz."); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Parkovanie zlyhalo"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Kalibrácia zlyhala"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("VYBERTE FILAMENT"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU2"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("Aktualizujte FW MMU!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU potrebuje zásah."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Obnoviť tlač"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Obnovovanie..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Zaviesť filament"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Zaviesť všetky"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Zaviesť po trysku"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Vysunúť filament"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Vysunúť filament ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Vyňať filament"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Zavádzanie fil. %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Vysúvanie fil. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Vysúvanie fil. ..."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Všetky"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("Reštartovať MMU"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("Reštart MMU..."); + 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_MIXER = _UxGT("Mixér"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradient"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Plný gradient"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Prepnúť mix"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Cyklický mix"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradientný mix"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Otočiť gradient"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktívny V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Počiat. V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT("Konečn. V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("Alias V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("Vynulovať V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("Uložiť V-tool Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools vynulované"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Počiat.Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT("Konečn.Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Hry"); + PROGMEM Language_Str MSG_BRICKOUT = _UxGT("Brickout"); + PROGMEM Language_Str MSG_INVADERS = _UxGT("Nájazdníci"); + PROGMEM Language_Str MSG_SNAKE = _UxGT("Had"); + PROGMEM Language_Str MSG_MAZE = _UxGT("Bludisko"); + + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("Chyb. index stránky"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("Chyb. rých. stránky"); + + PROGMEM Language_Str MSG_EDIT_PASSWORD = _UxGT("Zmeniť heslo"); + PROGMEM Language_Str MSG_LOGIN_REQUIRED = _UxGT("Vyžad. sa prihl."); + PROGMEM Language_Str MSG_PASSWORD_SETTINGS = _UxGT("Nastavenie hesla"); + PROGMEM Language_Str MSG_ENTER_DIGIT = _UxGT("Zvoľte číslo"); + PROGMEM Language_Str MSG_CHANGE_PASSWORD = _UxGT("Zmeniť heslo"); + PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Odstrániť heslo"); + PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("Heslo je "); + PROGMEM Language_Str MSG_START_OVER = _UxGT("Začať odznova"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Nezabudnite uložiť!"); + PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Heslo odstránene"); + + // + // 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_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre obnovu tlače")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkovanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Čakajte prosím", "na spustenie", "výmeny filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Vložte filament", "a stlačte tlačidlo", "pre pokračovanie")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Stlačte tlačidlo", "pre ohrev trysky")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Ohrev trysky", "Čakajte prosím...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na vysunutie", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Čakajte prosím", "na zavedenie", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Čakajte prosím", "na vytlačenie", "filamentu")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Stlačte tlačidlo", "pre dokončenie", "vytláčania filam.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Čakajte prosím na", "obnovenie tlače...")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Kliknite pre pokr.")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkovanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Čakajte prosím...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Vložte a kliknite")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Kliknite pre ohrev")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Ohrev...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Vysúvanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Zavádzanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Vytlačovanie...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Klik. pre dokonč.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Pokračovanie...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Ovládače TMC"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Prúd ovládača"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Vynulovať"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT("za:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Kompenz. vôle"); + 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("Korekcia"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Vyhladzovanie"); + + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("Vyrovnať os X"); + PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Auto-kalibrovať"); + #if ENABLED(TOUCH_UI_FTDI_EVE) + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu, znížená teplota. Stlačte OK pre ohrev a ešte raz pre obnovu."); + #else + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Vypršal čas ohrevu"); + #endif + PROGMEM Language_Str MSG_REHEAT = _UxGT("Zohriať"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie..."); +} diff --git a/Marlin/src/lcd/language/language_test.h b/Marlin/src/lcd/language/language_test.h new file mode 100644 index 00000000..16cafbeb --- /dev/null +++ b/Marlin/src/lcd/language/language_test.h @@ -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 . + * + */ +#pragma once + +/** + * TEST + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +// Select ONE of the following Mappers. +// They decide what to do with a symbol in the area of [0x80:0xFF]. They take a symbol of this language file and make them point +// into an array with 128 cells, where they'll find the place of the symbol of the font in use. +// +// a.)For ASCII coded Language_xx.h files like (en) there are no occurrences of symbols above 0x7F so no mapper is needed. +// If such a symbol appears it is mapped directly into the font. This is the case for the language files we used until now, with all the STR_XX or +// "\xxx" symbols. All Symbols are only one byte long. +// b.) For Unicoded Language_xx.h files (currently ru, de and kana_utf8 ) the non ASCII [0x00-0x7F] symbols are represented by more than one byte. +// In the case of two bytes the first is pointing to a 'codepage' and the second to a place in the codepage. These codepages contain 64 symbols. +// So two of them can be mapped. For most of the European languages the necessary symbols are contained in the pages C2 and C3. Cyrillic uses D0 +// and D1. +// c.) For katakana (one of the Japanese symbol sets) Unicode uses 3 bytes. Here the second byte also points to a codepage and byte 3 to the symbol. +// I hope the pages E282 and E283 are sufficient to write katakana. +// Kanji (an other Japanese symbol set) uses far more than two codepages. So currently I don't see a chance to map the Unicodes. Its not +// impossible to have a close to direct mapping but will need giant conversion tables and fonts (we don't want to have in a embedded system). + + +// Select the better font for full graphic displays. +//#define DISPLAY_CHARSET_ISO10646_1 +//#define DISPLAY_CHARSET_ISO10646_5 +//#define DISPLAY_CHARSET_ISO10646_GREEK +//#define DISPLAY_CHARSET_ISO10646_KANA + + + +// next 5 lines select variants in this file only +#define DISPLAYTEST +//#define WEST +//#define CYRIL +//#define KANA + + +// TESTSTRINGS + +#define STRG_ASCII_2 _UxGT(" !\"#$%&'()*+,-./") +#define STRG_ASCII_3 _UxGT("0123456789:;<=>?") +#define STRG_ASCII_4 _UxGT("@ABCDEFGHIJKLMNO") +#define STRG_ASCII_5 _UxGT("PQRSTUVWXYZ[\\]^_") +#define STRG_ASCII_6 _UxGT("`abcdefghijklmno") +#define STRG_ASCII_7 _UxGT("pqrstuvwxyz{|}~") + +#define STRG_C2_8 _UxGT("") +#define STRG_C2_9 _UxGT("") +#define STRG_C2_a _UxGT(" ¡¢£¤¥¦§¨©ª«¬­®¯") +#define STRG_C2_b _UxGT("°±²³´µ¶·¸¹º»¼½¾¿") +#define STRG_C3_8 _UxGT("ÈÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ") +#define STRG_C3_9 _UxGT("ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß") +#define STRG_C3_a _UxGT("àáâãäåæçèéêëìíîï") +#define STRG_C3_b _UxGT("ðñòóôõö÷øùúûüýþÿ") + +#define STRG_D0_8 _UxGT("ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ") +#define STRG_D0_9 _UxGT("АБВГДЕЖЗИЙКЛМНОП") +#define STRG_D0_a _UxGT("РСТУФХЦЧШЩЪЫЬЭЮЯ") +#define STRG_D0_b _UxGT("абвгдежзийклмноп") +#define STRG_D1_8 _UxGT("рстуфхцчшщъыьэюя") +#define STRG_D1_9 _UxGT("ѐёђѓєѕіїјљњћќѝўџ") +#define STRG_D1_a _UxGT("ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯ") +#define STRG_D1_b _UxGT("ѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ") + +#define STRG_E382_8 _UxGT("よめもゃやゅゆょよらりるれろゎわ") +#define STRG_E382_9 _UxGT("ゐゑをんゔゕゖ゗゘゙゚゛ ゜ゝゞゟ") +#define STRG_E382_a _UxGT("゠ァアィイゥウェエォオカガキギク") +#define STRG_E382_b _UxGT("グケゲコゴサザシジスズセゼソゾタ") +#define STRG_E383_8 _UxGT("トチヂッツヅテデトドナニヌネノハ") +#define STRG_E383_9 _UxGT("バパヒビピフブプヘベペホボポマミ") +#define STRG_E383_a _UxGT("ムメモャヤュユョヨラリルレロヮワ") +#define STRG_E383_b _UxGT("ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ") + +#define STRG_OKTAL_0 "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" +#define STRG_OKTAL_1 "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define STRG_OKTAL_2 "\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057" +#define STRG_OKTAL_3 "\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077" +#define STRG_OKTAL_4 "\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117" +#define STRG_OKTAL_5 "\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137" +#define STRG_OKTAL_6 "\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157" +#define STRG_OKTAL_7 "\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177" +#define STRG_OKTAL_8 "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217" +#define STRG_OKTAL_9 "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237" +#define STRG_OKTAL_a "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" +#define STRG_OKTAL_b "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" +#define STRG_OKTAL_c "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" +#define STRG_OKTAL_d "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" +#define STRG_OKTAL_e "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" +#define STRG_OKTAL_f "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" + +namespace Language_test { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 1; + + #if ENABLED(DISPLAYTEST) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Display test"); + PROGMEM Language_Str MSG_PREPARE = STRG_OKTAL_b; + PROGMEM Language_Str MSG_CONTROL = STRG_OKTAL_c; + #endif + + #if ENABLED(WEST) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); + + PROGMEM Language_Str MSG_MAIN = _UxGT(".."); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_C2_8; + PROGMEM Language_Str MSG_AUTO_HOME = STRG_C2_9; + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_C2_a; + PROGMEM Language_Str MSG_PREHEAT_1 = STRG_C2_b; + PROGMEM Language_Str MSG_PREHEAT_2 = STRG_C3_8; + PROGMEM Language_Str MSG_COOLDOWN = STRG_C3_9; + PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_C3_a; + PROGMEM Language_Str MSG_MOVE_AXIS = STRG_C3_b; + + PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; + PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; + PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; + PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; + PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = STRG_OKTAL_7; + + PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; + PROGMEM Language_Str MSG_NOZZLE_N = STRG_OKTAL_8 " ~"; + PROGMEM Language_Str MSG_FAN_SPEED = STRG_OKTAL_9; + PROGMEM Language_Str MSG_FAN_SPEED_N = STRG_OKTAL_9; + PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; + PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; + PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; + PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; + PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; + PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; + + #endif + + #if ENABLED(CYRIL) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); + + PROGMEM Language_Str MSG_MAIN = _UxGT(".."); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_D0_8; + PROGMEM Language_Str MSG_AUTO_HOME = STRG_D0_9; + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_D0_a; + PROGMEM Language_Str MSG_PREHEAT_1 = STRG_D0_b; + PROGMEM Language_Str MSG_PREHEAT_2 = STRG_D1_8; + PROGMEM Language_Str MSG_COOLDOWN = STRG_D1_9; + PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_D1_a; + PROGMEM Language_Str MSG_MOVE_AXIS = STRG_D1_b; + + PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; + PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; + PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; + PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; + PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = STRG_OKTAL_7; + + PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; + PROGMEM Language_Str MSG_NOZZLE_N = STRG_OKTAL_8 " ~"; + PROGMEM Language_Str MSG_FAN_SPEED_N = STRG_OKTAL_9; + PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; + PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; + PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; + PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; + PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; + PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; + + #endif + + #if ENABLED(KANA) + PROGMEM Language_Str WELCOME_MSG = _UxGT("Language TEST"); + + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("\001\002\003\004\005\006\007\010\011"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("UTF8"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("ASCII"); + + PROGMEM Language_Str MSG_MAIN = _UxGT(".."); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = STRG_E382_8; + PROGMEM Language_Str MSG_AUTO_HOME = STRG_E382_9; + PROGMEM Language_Str MSG_SET_HOME_OFFSETS = STRG_E382_a; + PROGMEM Language_Str MSG_PREHEAT_1 = STRG_E382_b; + PROGMEM Language_Str MSG_PREHEAT_2 = STRG_E383_8; + PROGMEM Language_Str MSG_COOLDOWN = STRG_E383_9; + PROGMEM Language_Str MSG_SWITCH_PS_OFF = STRG_E383_a; + PROGMEM Language_Str MSG_MOVE_AXIS = STRG_E383_b; + + PROGMEM Language_Str MSG_MAIN = STRG_OKTAL_2; + PROGMEM Language_Str MSG_TEMPERATURE = STRG_OKTAL_3; + PROGMEM Language_Str MSG_MOTION = STRG_OKTAL_4; + PROGMEM Language_Str MSG_FILAMENT = STRG_OKTAL_5; + PROGMEM Language_Str MSG_CONTRAST = STRG_OKTAL_6; + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = STRG_OKTAL_7; + + PROGMEM Language_Str MSG_NOZZLE = STRG_OKTAL_8; + PROGMEM Language_Str MSG_NOZZLE_N = STRG_OKTAL_8 " ~"; + PROGMEM Language_Str MSG_FAN_SPEED_N = STRG_OKTAL_9; + PROGMEM Language_Str MSG_AUTOTEMP = STRG_OKTAL_a; + PROGMEM Language_Str MSG_MIN = STRG_OKTAL_b; + PROGMEM Language_Str MSG_MAX = STRG_OKTAL_c; + PROGMEM Language_Str MSG_FACTOR = STRG_OKTAL_d; + PROGMEM Language_Str MSG_PID_P = STRG_OKTAL_e; + PROGMEM Language_Str MSG_PID_I = STRG_OKTAL_f; + #endif +} diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h new file mode 100644 index 00000000..f81f1537 --- /dev/null +++ b/Marlin/src/lcd/language/language_tr.h @@ -0,0 +1,597 @@ +/** + * 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 + +/** + * Turkish + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + * + * Bu çeviri dosyasındaki sorunlar ve düzeltmeler için iletişim; + * Contact for issues and corrections in this translation file; + * Yücel Temel - (info@elektromanyetix.com) - https://elektromanyetix.com/ + */ + +#define DISPLAY_CHARSET_ISO10646_TR + +namespace Language_tr { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Turkish"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" hazır."); + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("EVET"); + PROGMEM Language_Str MSG_NO = _UxGT("HAYIR"); + PROGMEM Language_Str MSG_BACK = _UxGT("Geri"); + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Durduruluyor..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("SD K. Yerleştirildi."); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("SD Kart Çıkarıldı."); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("SD Kart Bekleniyor"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Kart Okuma Hatası"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB Çıkarıldı"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB Başlat. Hatası"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Enstops"); // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Yazılımsal Endstops"); + PROGMEM Language_Str MSG_MAIN = _UxGT("Ana"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Gelişmiş Ayarlar"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Yapılandırma"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Oto. Başlat"); + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorları Durdur"); + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hata Ayıklama"); + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Durum Çubuğu Testi"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Eksenleri Sıfırla"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Sıfırla"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Sıfırla"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Sıfırla"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Oto. Z-Hizalama"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Sıfırlanıyor"); + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Başlatmak için tıkla"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Sonraki Nokta"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Hizalama Tamam!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Kaçınma Yüksekliği"); + 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"); + #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ü"); + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lazeri Kapat"); + PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lazeri Aç"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lazer Gücü"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Spindle Kontrolü"); + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Spindle Kapat"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Spindle Aç"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Spindle Gücü"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Ters Yön"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Gücü Aç"); + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Gücü Kapat"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ekstrüzyon"); + PROGMEM Language_Str MSG_RETRACT = _UxGT("Geri Çek"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Eksen Hareketleri"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Tabla Hizalama"); + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Tabla Hizası"); + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Hizalama Köşeleri"); + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Sonraki Köşe"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Mesh Editörü"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Mesh Düzenle"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Mesh Düzenleme Durdu"); + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Prop Noktası"); + PROGMEM Language_Str MSG_MESH_X = _UxGT("İndeks X"); + PROGMEM Language_Str MSG_MESH_Y = _UxGT("İndeks Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Değeri"); + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Özel Komutlar"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Prob Testi"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Nokta"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Sapma"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Modu"); + PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Takım Ofsetleri"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Oto-Park"); + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Kopyala"); + PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Yansıtılmış kopya"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Tam Kontrol"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. nozul X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. nozul Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. nozul Z"); + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("G29 Çalışıyor"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Araçları"); + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("UBL Yatak Hizalama"); + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Eğim Noktası"); + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Elle Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Altlık & Ölçü Ver"); + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Ölçü"); + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Yataktan Ölçü Kaldır"); + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Sonrakine Git"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL'yi Etkinleştir"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL'yi Etkisizleştir"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Yatak Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Yatak Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nozul Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Nozul Sıcaklığı"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Mesh Düzenleme"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Özel Mesh Düzenleme"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("İnce Ayar Mesh"); + 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"); + #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_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"); + PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Manuel çalışma..."); + PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Birincil Sabit Uzunluk"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Çalışma Tamamlandı"); + PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 İptal edildi"); + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Çıkış G26"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Tabla Mesh Devam et"); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Mesh Hizalama"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Nokta Hizalama"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Kafes Mesh Hizalama"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Mesh Seviyesi"); + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Yan Noktalar"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Haritalama Türü"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Mesh Çıkış Haritası"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host için Çıktı"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV için Çıktı"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Yazıcıda Yedek Kpalı"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Çıkış Bilgisi"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Dolgu Miktarı"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Manuel Dolgu"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Akıllı Dogu"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Mesh Dolgu"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Tümünü Geçersiz Kıl"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Yakını Geçersiz Kıl"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Tümünü İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Yakını İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Mesh Depolama"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Bellek Yuvası"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Yatak Mesh Yükle"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Yatak Mesh Kayıt Et"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("Mesh %i yüklendi"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("Mesh %i kayıtlandı"); + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Depolama Yok"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hata: UBL Kayıt"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hata: UBL Yenileme"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Ofset: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Ofset Durduruldu"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Adım Adım UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Soğuk Mesh Oluştur"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Akıllı Dogu"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Doğrulama Mesh"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Tümünü İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Doğrulama Mesh"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Tümünü İnce Ayarla"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Yatak Mesh Kayıt Et"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Kontrolü"); + PROGMEM Language_Str MSG_LEDS = _UxGT("LEDler"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("LED Hazır Ayarları"); + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Kırmızı"); + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Turuncu"); + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sarı"); + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Yeşil"); + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Mavi"); + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Lacivert"); + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Menekşe"); + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Beyaz"); + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Varsayılan"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Özel Işıklar"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Kırmızı Şiddeti"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Yeşil Şiddeti"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Mavi Şiddeti"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Beyaz Şiddeti"); + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Parlaklık"); + + PROGMEM Language_Str MSG_MOVING = _UxGT("Hareket Ediyor.."); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Durdur XY"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Hareketi"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Hareketi"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Hareketi"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Ekstruder"); + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Ekstruder *"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Nozul Çok Soğuk"); + 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_SPEED = _UxGT("Hız"); + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Mesafesi"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Nozul"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Nozul ~"); + PROGMEM Language_Str MSG_BED = _UxGT("Tabla"); + PROGMEM Language_Str MSG_CHAMBER = _UxGT("Çevirme"); + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Hızı"); + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Hızı ~"); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Depolanan Fan ~"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Ekstra Fan Hızı"); + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Ekstra Fan Hızı ~"); + PROGMEM Language_Str MSG_FLOW = _UxGT("Akış"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Akış ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Kontrol"); + 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(" Çarpan"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Oto. Sıcaklık"); + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Açık"); + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Kapalı"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Kalibrasyon"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Kalibrasyon *"); + 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("Seç"); + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Seç *"); + PROGMEM Language_Str MSG_ACC = _UxGT("İvme"); + + PROGMEM Language_Str MSG_JERK = _UxGT("Sarsım"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("V") LCD_STR_A _UxGT("-Sarsım"); + PROGMEM Language_Str MSG_VB_JERK = _UxGT("V") LCD_STR_B _UxGT("-Sarsım"); + PROGMEM Language_Str MSG_VC_JERK = _UxGT("V") LCD_STR_C _UxGT("-Sarsım"); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Ve-Sarsım"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Jonksiyon Sapması"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Hız Vektörü"); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("HızVektör.max ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("HızVektör.max ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("HızVektör.max ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("HızVektör.max ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("HızVektör.max *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("HızVektör.min"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("HV.gezinme min"); + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Ivme"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max. ivme ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max. ivme ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max. ivme ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max. ivme ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max. ivme *"); + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Ivme-geri çekme"); + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Ivme-gezinme"); + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Adım/mm"); + PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT(" adım/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("E adım/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("* adım/mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Sıcaklık"); + PROGMEM Language_Str MSG_MOTION = _UxGT("Hareket"); + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Filaman"); + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("Ekstrüzyon/mm³"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Filaman Çapı"); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Filaman Çapı *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Çıkart mm"); + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Yükle mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K İlerlet"); + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K İlerlet *"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontrast"); + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Hafızaya Al"); + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Hafızadan Yükle"); + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Fabrika Ayarları"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM'u başlat"); + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hata: EEPROM CRC"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hata: EEPROM Indeks"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hata: EEPROM Versiyonu"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("SD Güncellemesi"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Yazıcıyı Resetle"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Yenile"); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Bilgi Ekranı"); + PROGMEM Language_Str MSG_PREPARE = _UxGT("Hazırlık"); + PROGMEM Language_Str MSG_TUNE = _UxGT("Ayar"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Yaz. Başlat"); + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("İleri"); + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("İçinde"); + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Durdur"); + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("Yazdır"); + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("Resetle"); + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("İptal"); + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Tamamlandı"); + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Geri"); + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Devam ediyor"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Duraklat"); + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Sürdür"); + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Durdur"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Yazdırma Nesnesi"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Nesneyi İptal Et"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Nesneyi İptal Et ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kesinti Kurtarma"); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("SD Karttan Yazdır"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("SD Kart Yok!"); + PROGMEM Language_Str MSG_DWELL = _UxGT("Uyku..."); + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Operatör bekleniyor."); + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Baskı Duraklatıldı"); + PROGMEM Language_Str MSG_PRINTING = _UxGT("Baskı Yapılıyor..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Baskı Durduruldu!"); + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("İşlem yok."); + PROGMEM Language_Str MSG_KILLED = _UxGT("Kilitlendi. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Durdu. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Geri Çek mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Swap Re.mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Geri Çekme V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Atlama mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("S Unretr. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Oto. Geri Çekme"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("G.Çekme Boyu"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tasfiye uzunluğu"); + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Takım Değişimi"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Yükselt"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Birincil Hız"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Geri Çekme Hızı"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozul Beklemede"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Filaman Değiştir"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Filaman Değiştir *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Filaman Yükle"); + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Filaman Yükle *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Filaman Çıkart"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Filaman Çıkart *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Tümünü Çıkart"); + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("SD Kart Başlatılıyor"); + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("SD Kart Değiştir"); + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("SD Kart Çıkart"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z Prob Açık. Tabla"); + 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("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"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("TEHLIKE: Kötü ayarlar hasara neden olabilir! Yine de devam edilsin mi?"); + 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 Ofset Testi"); + PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Kaydet"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Aç"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Aç"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Kapat"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Önce %s%s%s Sıfırla"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Prob Ofsetleri"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X Prob Ofset"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y Prob Ofset"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Prob Ofset"); + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Miniadım X"); + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Miniadım Y"); + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Miniadım Z"); + 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_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"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("ODA TERMAL PROBLEM"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hata: MAX.SICAKLIK"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hata: MIN.SICAKLIK"); + 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 + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("S"); // One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("D"); // One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Isınıyor..."); + PROGMEM Language_Str MSG_COOLING = _UxGT("Soğuyor..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Tabla Isınıyor..."); + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Tabla Soğuyor..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Oda Isınıyor..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Oda Soğuyor..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibrasyonu"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Ayarla X"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Ayarla Y"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Ayarla Z"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Ayarla Merkez"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Ayarları"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Oto Kalibrasyon"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Yük. Ayarla"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Prob Ofseti"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Çapral Mil"); + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Yükseklik"); + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Yarıçap"); + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Yazıcı Hakkında"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Yazıcı Bilgisi"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Nokta Hizalama"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Doğrusal Hizalama"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("İki Yönlü Doğ. Hiza."); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Birleşik Tabla Hiza."); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Hizalama"); + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("İstatistikler"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Kontrolcü Bilgisi"); + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termistörler"); + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Ekstruderler"); + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("İletişim Hızı"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Aydınlatmayı Aç"); + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Aydınlatma Parlaklğı"); + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("Yanlış Yazıcı"); + + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Baskı Sayısı"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Toplam Baskı Süresi"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun Baskı Süresi"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Toplam Filaman"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Baskı"); + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Tamamlanan"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Süre"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("En Uzun"); + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Filaman"); + #endif + + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Sıc."); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Sıc."); + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Güç Kaynağı"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Sürücü Gücü"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Sürücü %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Sürücü %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Sürücü %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Sürücü %"); + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC BAĞLANTI HATASI"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Yaz"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("FILAMAN DEGISTIR"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("BASKI DURAKLATILDI"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("FILAMAN YüKLE"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("FILAMAN ÇIKART"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Seçenekler:"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Daha Fazla Tasviye"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Baskıyı sürdür"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Nozul: "); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Runout Sensörü"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Aşınma Farkı mm"); + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Sıfırlama Başarısız"); + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Probing Başarısız"); + + PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("FILAMAN SEÇ"); + PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Yaz. Güncelle!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Dikkat Gerektirir."); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Yaz. Devam Et"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Sürdürülüyor..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Filaman Yükle"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Tümünü Yükle"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Nozula Yükle"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Filaman Çıkart"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Filaman Çıkart ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Filamenti Boşalt"); + PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Fil. Yükleniyor %i..."); + PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Fil Çıkartılıyor. ..."); + PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Fil. Boşaltılıyor...."); + PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Tümü"); + PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Filaman ~"); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Resetle"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Resetleniyot..."); + PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Kaldır, tıkla"); + + PROGMEM Language_Str MSG_MIX = _UxGT("Karışım"); + PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Bileşen ="); + PROGMEM Language_Str MSG_MIXER = _UxGT("Karıştırıcı"); + PROGMEM Language_Str MSG_GRADIENT = _UxGT("Gradyan"); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Tam Gradyan"); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Karışım Geçişi"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Döngü Karışımı"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Gradyan Karışımı"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Ters Gradyan"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktif V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Başlat V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Bitir 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("V-tool Karışıö Yap"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools Resetlendi"); + PROGMEM Language_Str MSG_START_Z = _UxGT("Başlat Z:"); + PROGMEM Language_Str MSG_END_Z = _UxGT(" Bitir Z:"); + + PROGMEM Language_Str MSG_GAMES = _UxGT("Oyunlar"); + 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"); + + // + // Filament Değişim ekranları 4 satırlı ekranda 3 satıra kadar gösterilir + // ...veya 3 satırlı ekranda 2 satıra kadar + // + #if LCD_HEIGHT >= 4 + + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Baskıya devam etmek", "için Butona bas")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Park Ediliyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Filaman değişimi", "için başlama", "bekleniyor")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Filamanı yükle", "ve devam için", "tuşa bas...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nozulü Isıtmak için", "Butona Bas.")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Nozul Isınıyor", "Lütfen Bekleyin...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Filamanın çıkması", "bekleniyor")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Filamanın yüklenmesi", "bekleniyor..")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "için bekle")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Filaman Temizlemesi", "bitirmek için tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Baskının devam ", "etmesi için bekle")); + #else + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Sürdürmek İçin Tıkla")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Park Ediliyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Lütfen bekleyiniz...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Yükle ve bas")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Isıtmak için Tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Isınıyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Çıkartılıyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Yüklüyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Temizleniyor...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Bitirmek için Tıkla")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Sürdürülüyor...")); + #endif + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Sürücüleri"); + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Sürücü Akımı"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrit Eşiği"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Sensörsüz Sıfırlama"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Adım Modu"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Aktif"); + PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Resetle"); + PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" içinde:"); + PROGMEM Language_Str MSG_BACKLASH = _UxGT("Ters Tepki"); + 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("Düzeltme"); + PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Yumuşatma"); +} + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_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 new file mode 100644 index 00000000..9cc10029 --- /dev/null +++ b/Marlin/src/lcd/language/language_uk.h @@ -0,0 +1,769 @@ +/** + * 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 + +/** + * Ukrainian + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ + +#define DISPLAY_CHARSET_ISO10646_5 + +namespace Language_uk { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Ukranian"); + + 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_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_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_DONE = _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("Встановити ноль"); + #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("Частота"); + 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_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("Будувати сітку"); + #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_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_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("Сопло, ") LCD_STR_DEGREE "C"; + PROGMEM Language_Str MSG_NOZZLE_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 ", " 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_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_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-ривок"); + #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_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_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("ЗУПИНЕНО. "); + #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_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_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_BABYSTEP_TOTAL = _UxGT("Сумарно"); + PROGMEM Language_Str MSG_ENDSTOP_ABORT = _UxGT("Кінцевик спрацював"); + PROGMEM Language_Str MSG_HEATING_FAILED_LCD = _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_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_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("Данні принтера"); + + #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_PROTOCOL = _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_PRINT_TIME = _UxGT("Весь час друку"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Найдовший час"); + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Друків"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Загалом"); + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Найдовше"); + #endif + + 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_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_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_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_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_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h new file mode 100644 index 00000000..f7cf6065 --- /dev/null +++ b/Marlin/src/lcd/language/language_vi.h @@ -0,0 +1,440 @@ +/** + * 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 + +/** + * Vietnamese + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +namespace Language_vi { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 2; + PROGMEM Language_Str LANGUAGE = _UxGT("Vietnamese"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" Sẵn sàng."); // Ready + PROGMEM Language_Str MSG_BACK = _UxGT("Trở lại"); // Back + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Đang hủy bỏ..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Phương tiện được cắm vào"); // Media inserted + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Phương tiện được rút ra"); + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Chờ đợi phương tiện"); + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Lỗi đọc phương tiện"); + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB được rút ra"); + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB khởi thất bại"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // soft Endstops + PROGMEM Language_Str MSG_MAIN = _UxGT("Chính"); // Main + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("Thiết lập cấp cao"); // Advanced Settings + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Cấu hình"); // Configuration + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Khởi chạy tự động"); // Autostart + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Tắt động cơ bước"); // Disable steppers + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Menu gỡ lỗi"); // Debug Menu + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Kiểm tra tiến độ"); // Progress bar test + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("Về nhà tự động"); // Auto home + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("Về nhà X"); // home x + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Về nhà Y"); // home y + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Về nhà Z"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Chỉnh canh Z tự động"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("Đang về nhà XYZ"); // Homing XYZ + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Nhấn để bắt đầu"); // Click to Begin + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Điểm tiếp theo"); // Next Point + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("San lấp được hoàn thành"); // Leveling Done! + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Chiều cao mờ dần"); // Fade Height + 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 + #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 + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Tắt nguồn"); // Switch power off + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Ép đùn"); // Extrude + PROGMEM Language_Str MSG_RETRACT = _UxGT("Rút lại"); // Retract + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Di chuyển trục"); // Move axis + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("San Lấp Bàn"); // Bed Leveling + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Làm bằng mặt bàn"); // Level bed + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Làm bằng góc bàn"); // Level corners + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Góc tiếp theo"); // Next corner + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Chỉnh lưới đã dừng"); // Mesh Editing Stopped + PROGMEM Language_Str MSG_MESH_X = _UxGT("Mục lục X"); // Index X + PROGMEM Language_Str MSG_MESH_Y = _UxGT("Mục lục Y"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Giá trị Z"); // Z Value + PROGMEM Language_Str MSG_USER_MENU = _UxGT("Các lệnh tự chọn"); // Custom Commands + PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Đang chạy G29"); // Doing G29 + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Công cụ UBL"); // UBL tools + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("San Lấp Bàn Thống Nhất (UBL)"); // Unified Bed Leveling + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("chế độ IDEX"); // IDEX Mode + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Đậu tự động"); // Auto-Park + PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Sự gấp đôi"); // Duplication + PROGMEM Language_Str MSG_IDEX_MODE_SCALED_COPY = _UxGT("Bản sao thu nhỏ"); + PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Toàn quyền điều khiển"); // Full control + PROGMEM Language_Str MSG_IDEX_X_OFFSET = _UxGT("Đầu phun X nhì"); // 2nd nozzle X + PROGMEM Language_Str MSG_IDEX_Y_OFFSET = _UxGT("Đầu phun Y nhì"); + PROGMEM Language_Str MSG_IDEX_Z_OFFSET = _UxGT("Đầu phun Z nhì"); + PROGMEM Language_Str MSG_IDEX_SAVE_OFFSETS = _UxGT("Lưu bù đắp"); // Save offsets + PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Tự xây dựng lưới"); // Manually Build Mesh + PROGMEM Language_Str MSG_UBL_BC_INSERT = _UxGT("Đặt chêm và đo"); // Place shim & measure + PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Đo"); // Measure + PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Tháo và đo bàn"); // Remove & measure bed + PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Chuyển sang tiếp theo"); // moving to next + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("Bật UBL"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("Tắt UBL"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Nhiệt độ bàn"); // Bed Temp + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Bed Temp"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Nhiệt độ đầu phun"); // Hotend Temp + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Hotend Temp"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Chỉnh sửa lưới"); // Mesh Edit + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Chỉnh sửa lưới tự chọn"); // Edit Custom Mesh + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Chỉnh lưới chính xác"); // Fine tuning mesh + 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 + #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_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 + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Đang san lấp 3-điểm"); // 3-Point Leveling + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Đang san lấp lưới phẳng"); // Grid (planar) Mesh Leveling + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Làm bằng lưới"); // Level Mesh + PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Điểm bên cạnh"); // Side Points + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Loại bản đồ"); // Map Type + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Đầu ra bản đồ lưới"); // Output Mesh Map + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Đầu ra cho máy chủ"); // Output for Host + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("Đầu ra cho CSV"); // Output for CSV + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Hỗ trợ lưới"); // Off Printer Backup | backup mesh + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("Đầu ra thông tin UBL"); // Output UBL Info + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Chỉnh sửa lưới"); // Edit mesh + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Số lượng lấp đầy"); // Fill-in Amount + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Tự lấp đầy"); // Manual Fill-in + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Lấp đầy thông minh"); // Smart Fill-in + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Lưới lấp đầy"); // Fill-in Mesh + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Bác bỏ tất cả"); // Invalidate All + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Bác bỏ gần nhất"); // Invalidate Closest + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Chỉnh chính xác tất cả"); // Fine Tune ALl + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Chỉnh chính xác gần nhất"); // Fine Tune Closest + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Lưu trữ lưới"); // Mesh Storage + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Khe nhớ"); // Memory Slot + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Tải lưới bàn"); // Load Bed Mesh + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Lưu lưới bàn"); // Save Bed Mesh + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("%i lưới được nạp"); // Mesh %i loaded + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("%i lưới đã lưu"); + PROGMEM Language_Str MSG_NO_STORAGE = _UxGT("Không lưu trữ"); // No Storage + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Điều sai: Lưu UBL"); // Err: UBL Save + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Điều Sai: Khôi Phục UBL"); // Err: UBL Restore + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Đầu Dò-Z Đã Ngừng"); // Z-Offset Stopped + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Bước-Từng-Bước UBL"); // Step-By-Step UBL + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1.Xây dựng lưới lạnh"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2.Lấp đầy thông minh"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3.Thẩm tra lưới"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4.Chỉnh chính xác tất cả"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5.Thẩm tra lưới"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6.Chỉnh chính xác tất cả"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7.Lưu lưới bàn"); + + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("Điều khiển LED"); // LED Control + PROGMEM Language_Str MSG_LEDS = _UxGT("Đèn"); // Lights + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Đèn định sẵn"); // Light Presets + PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Đỏ"); // Red + PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Cam"); // Orange + PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Vàng"); // Yellow + PROGMEM Language_Str MSG_SET_LEDS_GREEN = _UxGT("Xanh Lá"); // Green + PROGMEM Language_Str MSG_SET_LEDS_BLUE = _UxGT("Xanh"); // Blue + PROGMEM Language_Str MSG_SET_LEDS_INDIGO = _UxGT("Xanh Đậm"); // Indigo + PROGMEM Language_Str MSG_SET_LEDS_VIOLET = _UxGT("Tím"); // Violet + PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Trắng"); // White + PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Mặc định"); // Default + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Đèn Tự Chọn"); // Custom Lights + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Cường Độ Đỏ"); // Red Intensity + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Cường Độ Xanh Lá"); // Green Intensity + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Cường Độ Xanh"); // Blue Intensity + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Cường Độ Trắng"); // White Intensity + PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("độ sáng"); // Brightness + + PROGMEM Language_Str MSG_MOVING = _UxGT("Di chuyển..."); // Moving + PROGMEM Language_Str MSG_FREE_XY = _UxGT("Giải phóng XY"); // Free XY + PROGMEM Language_Str MSG_MOVE_X = _UxGT("Di chuyển X"); // Move X + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Di chuyển Y"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Di chuyển Z"); + PROGMEM Language_Str MSG_MOVE_E = _UxGT("Máy đùn"); // Extruder + PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Máy đùn *"); // Extruder + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("Đầu nóng quá lạnh"); // Hotend too cold + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Di chuyển 0.1mm"); // Move 0.1mm + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Di chuyển 1mm"); // Move 1mm + PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Di chuyển 10mm"); // Move 10mm + PROGMEM Language_Str MSG_SPEED = _UxGT("Tốc độ"); // Speed + PROGMEM Language_Str MSG_BED_Z = _UxGT("Z Bàn"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Đầu phun"); // Nozzle + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Đầu phun ~"); // Nozzle + PROGMEM Language_Str MSG_BED = _UxGT("Bàn"); // bed + PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Tốc độ quạt"); // fan speed + PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Tốc độ quạt ~"); // fan speed + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Tốc độ quạt phụ"); // Extra fan speed + PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Tốc độ quạt phụ ~"); // Extra fan speed + PROGMEM Language_Str MSG_FLOW = _UxGT("Lưu Lượng"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("Lưu Lượng ~"); + PROGMEM Language_Str MSG_CONTROL = _UxGT("Điều khiển"); // Control + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Đa"); // min + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Thiểu"); + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Hệ Số"); // factor + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Nhiệt độ tự động"); // Autotemp + PROGMEM Language_Str MSG_LCD_ON = _UxGT("Bật"); // on + PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Tắt"); // off + PROGMEM Language_Str MSG_SELECT = _UxGT("Lựa"); // Select + PROGMEM Language_Str MSG_SELECT_E = _UxGT("Lựa *"); + PROGMEM Language_Str MSG_ACC = _UxGT("Tăng Tốc"); + PROGMEM Language_Str MSG_JERK = _UxGT("Giật"); + PROGMEM Language_Str MSG_VA_JERK = _UxGT("Giật-V") LCD_STR_A; + PROGMEM Language_Str MSG_VB_JERK = _UxGT("Giật-V") LCD_STR_B; + PROGMEM Language_Str MSG_VC_JERK = _UxGT("Giật-V") LCD_STR_C; + PROGMEM Language_Str MSG_VE_JERK = _UxGT("Giật-Ve"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Độ Lệch Chỗ Giao"); // Junction Dev + PROGMEM Language_Str MSG_VELOCITY = _UxGT("Vận tốc"); // velocity + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Vđa") LCD_STR_A; // Vmax + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Vđa") LCD_STR_B; // Vmax + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Vđa") LCD_STR_C; // Vmax + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Vđa") LCD_STR_E; // Vmax + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Vđa *"); // Vmax + PROGMEM Language_Str MSG_VMIN = _UxGT("Vthiểu"); // Vmin + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Vchuyển thiểu"); // VTrav min + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Sự tăng tốc"); // Acceleration + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Tăng tốc ca") LCD_STR_A; // Amax + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Tăng tốc ca") LCD_STR_B; // Amax + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Tăng tốc ca") LCD_STR_C; // Amax + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Tăng tốc ca") LCD_STR_E; // Amax + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Tăng tốc ca *"); // Amax + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("TT-Rút"); // A-retract + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("TT-Chuyển"); // A-travel + PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Bước/mm"); // Steps + PROGMEM Language_Str MSG_A_STEPS = _UxGT("Bước") LCD_STR_A _UxGT("/mm"); // Asteps/mm + PROGMEM Language_Str MSG_B_STEPS = _UxGT("Bước") LCD_STR_B _UxGT("/mm"); + PROGMEM Language_Str MSG_C_STEPS = _UxGT("Bước") LCD_STR_C _UxGT("/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("BướcE/mm"); + PROGMEM Language_Str MSG_EN_STEPS = _UxGT("Bước */mm"); + PROGMEM Language_Str MSG_TEMPERATURE = _UxGT("Nhiệt độ"); // Temperature + PROGMEM Language_Str MSG_MOTION = _UxGT("Chuyển động"); // Motion + PROGMEM Language_Str MSG_FILAMENT = _UxGT("Vật liệu in"); // dây nhựa + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm³"); // E in mm + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Đường kính nhựa"); // Fil. Dai. + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Đường kính nhựa *"); + PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // unload mm + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Nạp mm"); + PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("K Cấp Cao"); // Advance K + PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("K Cấp Cao *"); // Advance K + PROGMEM Language_Str MSG_CONTRAST = _UxGT("Độ tương phản LCD"); // LCD contrast + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Lưu các thiết lập"); // Store settings + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Tải các cài đặt"); // Load settings + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Khôi phục phòng hư"); // Restore Defaults + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("Khởi Tạo EEPROM"); // Initialize EEPROM + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Cập Nhật phương tiện"); // Update media + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Bặt Lại Máy In"); + PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Cập Nhật"); // Refresh + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT("Màn Hình Thông Tin"); // Info screen + PROGMEM Language_Str MSG_PREPARE = _UxGT("Chuẩn bị"); // Prepare + PROGMEM Language_Str MSG_TUNE = _UxGT("Điều Chỉnh"); // Tune + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Tạm dừng in"); // Pause print + PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Tiếp tục in"); // Resume print + PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Ngừng in"); // Stop print + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Phục Hồi Mất Điện"); // Outage Recovery + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("In từ phương tiện"); // Print from media + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Không có phương tiện"); // No media + PROGMEM Language_Str MSG_DWELL = _UxGT("Ngủ..."); // Sleep + PROGMEM Language_Str MSG_USERWAIT = _UxGT("Nhấn để tiếp tục..."); // Click to resume (same as 'continue') + PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("In tạm dừng"); // print paused + PROGMEM Language_Str MSG_PRINTING = _UxGT("Đang in..."); // printing + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("In đã hủy bỏ"); // Print aborted + PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Không di chuyển."); // No move. + PROGMEM Language_Str MSG_KILLED = _UxGT("Đà CHẾT. "); + PROGMEM Language_Str MSG_STOPPED = _UxGT("Đà NGỪNG. "); + PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Rút mm"); // Retract mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Rút V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // hop + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("BỏRút mm"); // Unretr. mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("BỏRút T mm"); // S Unretr. mm + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("BỏRút V"); // UnRet V + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("BỏRút T V"); // S UnRet V + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("RútTựĐộng"); // Auto-Retract + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Thay Đổi Công Cụ"); // Tool Change + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Đưa Lên Z"); // Z Raise + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Tốc Độ Tuôn Ra"); // Prime Speed + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Tốc Độ Rút Lại"); // Retract Speed + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Thay dây nhựa"); // change filament + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Thay dây nhựa *"); // change filament + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Nạp dây nhựa"); // load filament + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Nạp dây nhựa *"); // load filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Dỡ dây nhựa *"); // unload filament + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Dỡ tất cả"); // Unload All + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Khởi tạo phương tiện"); // Attach media + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Thay phương tiện"); // Change midea + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Phát hành phương tiện"); + PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Đầu Dò Z qua bàn"); // Z Probe past bed + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Hệ số nghiêng"); // Skew Factor + PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTOUCH"); // BLTouch + PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Tự kiểm tra BLTOUCH "); // BLTouch Self-Test + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Bặt lại BLTouch"); // Reset BLTouch + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("Đem BLTouch"); // Deploy BLTouch + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("Cất BLTouch"); // Stow BLTouch + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Đem Đầu Dò-Z"); // Deploy Z-Probe + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Cất Đầu Dò-Z"); // Stow Z-Probe + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Về nhà %s%s%s Trước"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Đầu Dò Bù Đắp Z"); // Probe Z Offset + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Nhít X"); // Babystep X + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Nhít Y"); + 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_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 + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Điều sai: nhiệt độ tối đa"); // Err: MAXTEMP + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Điều sai: nhiệt độ tối thiểu"); // Err: MINTEMP + PROGMEM Language_Str MSG_HALTED = _UxGT("MÁY IN Đà DỪNG LẠ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 + PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only + PROGMEM Language_Str MSG_SHORT_MINUTE = _UxGT("p"); // m - phút - One character only + PROGMEM Language_Str MSG_HEATING = _UxGT("Đang sưởi nóng..."); // heating + PROGMEM Language_Str MSG_COOLING = _UxGT("Đang làm nguội..."); // cooling + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("Đang sưởi nong bàn..."); // bed heating + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("Đang làm nguội bàn..."); // bed cooling + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Cân Chỉnh Delta"); // Delta calibration + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Chỉnh X lại"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Chỉnh Y lại"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Chỉnh Z lại"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Chỉnh Z Center"); // Calibrate Center + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Cài Đặt Delta"); // Delta Settings + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Cân Chỉnh Tự Động"); // Auto Calibration + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Đặt Chiều Cao Delta"); // Set Delta Height + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Đầu Dò Z-Bù Đắp"); // Probe Z-offset + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Gậy Chéo"); // Diag Rod + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Chiều Cao"); // Height + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Bán Kính"); // Radius + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("Về Máy In"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Thông Tin Máy In"); // Printer Info + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("San lấp 3-Điểm"); // 3-Point Leveling + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("San Lấp Tuyến Tính"); // Linear Leveling + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("San Lấp Song Tuyến"); // Bilinear Leveling + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("San Lấp Bàn Thống Nhất"); // Unified Bed Leveling + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Lưới San Lấp"); // Mesh Leveling + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Thống Kê Máy In"); // Printer Stats + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Thông Tin Bo Mạch"); // Board Info + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Điện Trở Nhiệt"); // Thermistors + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Máy đùn"); // Extruders + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Baud"); // Baud + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Giao Thức"); // Protocol + PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Đèn Khuông"); // Case light + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Độ Sáng"); // Light Brightness + #if LCD_WIDTH >= 20 + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Số In"); // Print Count + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tổng số thời gian in"); // Total print time + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Thời gian việc lâu nhất"); // Longest job time + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Tổng số đùn"); // Extruded total + #else + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("In"); // prints + PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); // Completed + PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Tổng số"); // total + PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Dài nhất"); // Longest + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Đã ép đùn"); + #endif + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Nhiệt độ tối thiểu"); // Min Temp + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Nhiệt độ tối đa"); // Max temp + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("Bộ nguồn"); // PSU + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Sức mạnh ổ đĩa"); // Drive Strength + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X % trình điều khiển"); // X Driver % + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y % trình điều khiển"); // Y Driver % + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z % trình điều khiển"); // Z Driver % + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E % trình điều khiển"); // E Driver % + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("Ghi DAC EEPROM"); // DAC EEPROM Write + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("In tạm dừng"); // PRINT PAUSED + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("Nạp dây nhựa"); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Tùy chọn hồi phục:"); // RESUME OPTIONS + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Xả thêm"); // Purge more + PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Tiếp tục"); // continue + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Đầu Phun: "); // Nozzle + PROGMEM Language_Str MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Sự nhà không thành công"); // Homing failed + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed + + // + // 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_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nhấn nút", "để tiếp tục in")); // Press button to resume print + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Chờ cho sự", "thay đổi dây nhựa", "bắt đầu")); // wait for filament change to start + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Đút dây nhựa vào", "và nhấn nút", "để tiếp tục")); // insert filament and press button to continue // + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nhấn nút", "để làm nóng đầu phun")); // Press button to heat nozzle + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Đầu phun đang nóng lên", "Xin chờ...")); // Nozzle heating Please wait + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa ra")); // Wait for filament unload + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa vào")); // Wait for filament load + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Chờ tro", "xả dây nhựa")); // wait for filament purge + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Nhấn nút để kết thúc", "xả dây nhựa")); // Click to finish dây nhựa purge + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Chờ tro in", "tiếp tục...")); // Wait for print to resume + #else // LCD_HEIGHT < 4 + PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Nhấn nút để tiếp tục")); // Click to continue + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Xin chờ...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Chèn và nhấn")); // Insert and Click + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Nhấn để sưởi")); // Click to heat + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Đang sưởi nóng")); // Heating + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Đang dỡ ra...")); // Ejecting + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Đang nạp...")); // Loading + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Đang xả...")); // Purging + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Nhấn nút để kết thúc")); // Click to finish + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Đang tiếp tục...")); // Resuming + #endif // LCD_HEIGHT < 4 + + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("Trình điều khiển TMC"); // TMC drivers + PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Dòng điện trình điều khiển"); // Driver current + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled +} diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h new file mode 100644 index 00000000..3bebe12f --- /dev/null +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -0,0 +1,637 @@ +/** + * 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 + +/** + * Simplified Chinese + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +namespace Language_zh_CN { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 3; + PROGMEM Language_Str LANGUAGE = _UxGT("简体中文"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); //" ready." + 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“ + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("放弃中..."); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); //"Card inserted" + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); //"Card removed" + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("等待存储器"); + 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启动错误"); + PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("子响应溢出"); + PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("挡块"); //"Endstops" // Max length 8 characters + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("软挡块"); + PROGMEM Language_Str MSG_MAIN = _UxGT("主菜单"); //"Main" + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("高级设置"); + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("配置"); + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自动开始"); //"Autostart" + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); //"Disable steppers" + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("调试菜单"); // "Debug Menu" + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("进度条测试"); // "Progress Bar Test" + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("自动回原点"); //"Auto home" + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("回X原位"); //"Home X" + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("回Y原位"); //"Home Y" + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("回Z原位"); //"Home Z" + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("自动Z对齐"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("平台调平XYZ归原位"); //"Homing XYZ" + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("单击开始热床调平"); //"Click to Begin" + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("下个热床调平点"); //"Next Point" + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("完成热床调平"); //"Leveling Done!" + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" + 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" + #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("切割频率"); + 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_OFF = _UxGT("主轴关"); + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("主轴开"); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("主轴电源"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("主轴反转"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("电源打开"); //"Switch power on" + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("电源关闭"); //"Switch power off" + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("挤出"); //"Extrude" + PROGMEM Language_Str MSG_RETRACT = _UxGT("回抽"); //"Retract" + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("移动轴"); //"Move axis" + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("调平热床"); //"Bed leveling" + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("调平热床"); //"Level bed" + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("调平边角"); // "Level corners" + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("下个边角"); // "Next corner" + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("网格编辑器"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("编辑网格"); // "Edit Mesh" + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("网格编辑已停止"); // "Mesh Editing Stopped" + 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("定制命令"); // "Custom Commands" + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48探测"); + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48点"); + PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("M48偏差"); + 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_FULL_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"); // "Doing G29" + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("倾斜點"); + 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("激活UBL"); // "Activate UBL" + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("关闭UBL"); // "Deactivate UBL" + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("热床温度"); // "Bed Temp" + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("热床温度"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("热端温度"); // "Hotend Temp" + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("热端温度"); + 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" + #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_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh" + 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("继续热床网格"); // "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("输出到CSV"); // "Output for CSV" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("输出到备份"); // "Off Printer Backup" + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("输出UBL信息"); // "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("网格 %i 已装载"); // "Mesh %i loaded" + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("网格 %i 已保存"); // "Mesh %i saved" + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("没有存储"); // "No storage" + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("错误: UBL保存"); // "Err: UBL Save" + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("错误: UBL还原"); // "Err: UBL Restore" + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z偏移量: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step 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("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") + 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("释放 XY"); // "Free XY") + PROGMEM Language_Str MSG_MOVE_X = _UxGT("移动X"); //"Move X" + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移动Y"); //"Move Y" + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("移动Z"); //"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("热端太冷"); + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移动 %s mm"); //"Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); //"Move 0.1mm" + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移动 1 mm"); //"Move 1mm" + 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 = _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 = _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" + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("存储的风扇 ~"); + 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("控制器风扇"); + 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_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(" 最小"); //" " LCD_STR_THERMOMETER " Min" + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); //" " LCD_STR_THERMOMETER " Max" + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 因数"); //" " LCD_STR_THERMOMETER " 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"); + 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_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("选择 *"); + PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration + PROGMEM Language_Str MSG_JERK = _UxGT("抖动速率"); // "Jerk" + PROGMEM Language_Str MSG_VA_JERK = _UxGT("轴抖动速率") LCD_STR_A; //"Va-jerk" + PROGMEM Language_Str MSG_VB_JERK = _UxGT("轴抖动速率") LCD_STR_B; //"Vb-jerk" + PROGMEM Language_Str MSG_VC_JERK = _UxGT("轴抖动速率") LCD_STR_C; //"Vc-jerk" + PROGMEM Language_Str MSG_VE_JERK = _UxGT("挤出机抖动速率"); //"Ve-jerk" + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("接点差"); + PROGMEM Language_Str MSG_VELOCITY = _UxGT("速度"); // "Velocity" + PROGMEM Language_Str MSG_VMAX_A = _UxGT("最大进料速率") LCD_STR_A; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_B = _UxGT("最大进料速率") LCD_STR_B; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_C = _UxGT("最大进料速率") LCD_STR_C; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_E = _UxGT("最大进料速率") LCD_STR_E; //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("最大进料速率 *"); //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMIN = _UxGT("最小进料速率"); //"Vmin" min_feedrate_mm_s + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("最小移动速率"); //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" + PROGMEM Language_Str MSG_AMAX_A = _UxGT("最大打印加速度") LCD_STR_A; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_B = _UxGT("最大打印加速度") LCD_STR_B; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_C = _UxGT("最大打印加速度") LCD_STR_C; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_E = _UxGT("最大打印加速度") LCD_STR_E; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("最大打印加速度 *"); //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("收进加速度"); //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("非打印移动加速度"); //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + 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("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 在 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" + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("装载 mm"); // "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对比度"); //"LCD contrast" + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("保存设置"); //"Store memory" + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("装载设置"); //"Load memory" + 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 错误"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index 错误"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version 错误"); + 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_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("初始"); + 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("暂停打印"); //"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("打印物体"); + 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("从存储卡上打印"); //"Print from SD" + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("无存储卡"); //"No SD card" + 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("打印中..."); + PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("已取消打印"); //"Print aborted" + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("打印已完成"); + 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("回抽长度mm"); //"Retract mm" retract_length, retract length (positive mm) + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("换手回抽长度mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽恢复长度mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("换手回抽恢复长度mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽恢复后进料速率mm/s"); //"Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自动抽回"); //"Auto-Retract" autoretract_enabled, + 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抬起"); + PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("进给速度"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("回抽速度"); + 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("更换丝料"); //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("更换丝料 *"); //"Change filament" + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("装载丝料"); // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("装载丝料 *"); // "Load filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("卸载丝料"); // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("卸载丝料 *"); // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("卸载全部"); // "Unload All" + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("初始化存储卡"); //"Init. SD card" + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("更换存储卡"); //"Change SD card" + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("释放存储卡"); + 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("自检"); + 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("报告开漏"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("危险: 错误的设置将引起损坏! 是否继续?"); + PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); + PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("初始化TouchMI"); + 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("部署Z探针"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("收好Z探针"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("归位 %s%s%s 先"); //"Home ... first" + 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偏移"); //"Z Offset" + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("微量调整X轴"); //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("微量调整Y轴"); //"Babystep Y" + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("微量调整Z轴"); //"Babystep Z" + 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_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); //"Err: REDUNDANT TEMP" + PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); //"THERMAL RUNAWAY" + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("热床热量失控"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("机箱热量失控"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); //"Err: MAXTEMP" + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); //"Err: MINTEMP" + 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("冷却中 ..."); + PROGMEM Language_Str MSG_BED_HEATING = _UxGT("加热热床中 ..."); //"Bed Heating..." + PROGMEM Language_Str MSG_BED_COOLING = _UxGT("热床冷却中 ..."); + PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("机箱加热中 ..."); + PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("机箱冷却中 ..."); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("⊿校准"); //"Delta Calibration" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("⊿校准X"); //"Calibrate X" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校准Y"); //"Calibrate Y" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校准Z"); //"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("探针Z偏移量"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("⊿半径"); // "Radius" + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("关于打印机"); //"About Printer" + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("打印机信息"); //"Printer Info" + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("线性调平"); // "Linear Leveling" + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("双线性调平"); // "Bilinear Leveling" + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("打印机统计"); //"Printer Stats" + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("主板信息"); //"Board Info" + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("温度计"); //"Thermistors" + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("挤出机"); //"Extruders" + PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("波特率"); //"Baud" + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("协议"); //"Protocol" + PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("监控温度失控:关"); + PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("监控温度失控:开"); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("热端空闲超时"); + + 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("打印机不正确"); // "The printer is incorrect" + + #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_LONGEST = _UxGT("最长工作时间"); //"Longest job time" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("总计挤出"); //"Extruded total" + #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("最低温度"); //"Min Temp" + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("最高温度"); //"Max Temp" + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("电源供应"); //"Power Supply" + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("驱动力度"); // "Drive Strength" + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X 驱动 %"); // "X Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y 驱动 %"); // "Y Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z 驱动 %"); // "Z Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E 驱动 %"); // "E Driver %" + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC 连接错误"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("保存驱动设置"); // "DAC EEPROM Write" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("更换料"); + 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("恢复打印"); //"Resume print" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 喷嘴: "); // " Nozzle: " + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("断料传感器"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("断料距离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_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("MMU恢复"); + PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("MMU恢复中..."); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("MMU加载"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("MMU加载全部"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("MMU加载到喷嘴"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU弹出"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU弹出 ~"); + PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU卸载"); + 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("移出, 按下"); + + PROGMEM Language_Str MSG_MIX = _UxGT("混合"); + 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_TOGGLE_MIX = _UxGT("开关混合"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("循环混合"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("梯度混合"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("反向梯度"); + PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("激活 V-tool"); + PROGMEM Language_Str MSG_START_VTOOL = _UxGT("开始 V-tool"); + PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" 结束 V-tool"); + PROGMEM Language_Str MSG_GRADIENT_ALIAS = _UxGT("别名 V-tool"); + PROGMEM Language_Str MSG_RESET_VTOOLS = _UxGT("复位 V-tools"); + PROGMEM Language_Str MSG_COMMIT_VTOOL = _UxGT("提交 V-tool Mix"); + PROGMEM Language_Str MSG_VTOOLS_RESET = _UxGT("V-tools 已复位"); + 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("迷宫"); + + PROGMEM Language_Str MSG_BAD_PAGE = _UxGT("错误页面索引"); + PROGMEM Language_Str MSG_BAD_PAGE_SPEED = _UxGT("错误页面速度"); + + // + // 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_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按钮", "恢复打印")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待开始", "丝料", "变更")); // "Wait for start of the filament change" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入料", "并按下", "以继续")); + 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("加热喷嘴", "请等待 ...")); // "Heating nozzle 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("按下已完成", "料的清洗")); + 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("按下继续")); + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("请等待 ...")); //"Please wait..." + 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("按下加热")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加热中 ...")); // "Heating..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); //"Ejecting..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("装载中 ...")); //"Loading..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢复中 ...")); //"Resuming..." + #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("StealthChop已使能"); + 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_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("校正"); + 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_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h new file mode 100644 index 00000000..7abf895d --- /dev/null +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -0,0 +1,508 @@ +/** + * 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 + +/** + * Traditional Chinese + * + * LCD Menu Messages + * See also https://marlinfw.org/docs/development/lcd_language.html + */ +namespace Language_zh_TW { + using namespace Language_en; // Inherit undefined strings from English + + constexpr uint8_t CHARSIZE = 3; + PROGMEM Language_Str LANGUAGE = _UxGT("Traditional Chinese"); + + PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); //" ready." + PROGMEM Language_Str MSG_MARLIN = _UxGT("Marlin"); + PROGMEM Language_Str MSG_YES = _UxGT("是"); //"YES" + PROGMEM Language_Str MSG_NO = _UxGT("否"); //"NO" + PROGMEM Language_Str MSG_BACK = _UxGT("返回"); // "Back" + PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("正在中止..."); //"Aborting..." + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); //"Card inserted" + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); //"Card removed" + PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); //"Waiting for media" + PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("記憶卡讀取錯誤"); //"Media read error" + PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); //"USB device removed" + PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); //"USB start failed" + 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("主選單"); //"Main" + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("進階設置"); //"Advanced Settings" + PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("設置"); //Configuration + PROGMEM Language_Str MSG_AUTOSTART = _UxGT("自動開始"); //"Autostart" + PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬達"); //"Disable steppers" + PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("除錯選單"); // "Debug Menu" + PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("進度條測試"); // "Progress Bar Test" + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("自動回原點"); //"Auto home" + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("回X原點"); //"Home X" + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("回Y原點"); //"Home Y" + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("回Z原點"); //"Home Z" + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("自動Z對齊"); //"Auto Z-Align" + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("平台調平XYZ歸原點"); //"Homing XYZ" + PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("單擊開始熱床調平"); //"Click to Begin" + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("下個熱床調平點"); //"Next Point" + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("完成熱床調平"); //"Leveling Done!" + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" + 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" + #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" + PROGMEM Language_Str MSG_LASER_OFF = _UxGT("激光 關"); //"Laser Off" + PROGMEM Language_Str MSG_LASER_ON = _UxGT("激光 開"); //"Laser On" + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("激光電源"); //"Laser Power" + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("主軸控告制"); //"Spindle Control" + PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("主軸 關"); //"Spindle Off" + PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("主軸 開"); //"Spindle On" + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("主軸電源"); //"Spindle Power" + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("主軸反轉"); //"Spindle Reverse" + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("電源打開"); //"Switch power on" + PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("電源關閉"); //"Switch power off" + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("擠出"); //"Extrude" + PROGMEM Language_Str MSG_RETRACT = _UxGT("回縮"); //"Retract" + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("移動軸"); //"Move axis" + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("調平熱床"); //"Bed leveling" + PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("調平熱床"); //"Level bed" + PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("調平邊角"); // "Level corners" + PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("下個邊角"); // "Next corner" + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("網格編輯器"); //"Mesh Editor" + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("編輯網格"); // "Edit Mesh" + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("網格編輯已停止"); // "Mesh Editing Stopped" + PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("探測點"); //"Probing Point" + PROGMEM Language_Str MSG_MESH_X = _UxGT("索引 X"); //"Index X" + PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引 Y"); //"Index Y" + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); //"Z Value" + PROGMEM Language_Str MSG_USER_MENU = _UxGT("自定命令"); // "Custom Commands" + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 探測測試"); //"M48 Probe Test" + PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 探測點"); //"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("執行G29"); // "Doing G29" + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" + PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("統一熱床調平(UBL)"); // "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("啟動UBL"); // "Activate UBL" + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("關閉UBL"); // "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" + #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_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" + 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已取消"); //"G26 Canceled" + PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("離開 G26"); //"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("輸出到CSV"); // "Output for CSV" + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("輸出到備份"); // "Off Printer Backup" + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("輸出UBL信息"); // "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("網格 %i 已裝載"); // "Mesh %i loaded" + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("網格 %i 已保存"); // "Mesh %i saved" + PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("沒有存儲"); // "No storage" + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("錯誤: UBL保存"); // "Err: UBL Save" + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("錯誤: UBL還原"); // "Err: UBL Restore" + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-偏移:"); //"Z-Offset: " + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step 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("燈管控制"); // "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("釋放 XY"); // "Free XY") + PROGMEM Language_Str MSG_MOVE_X = _UxGT("移動X"); //"Move X" + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("移動Y"); //"Move Y" + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("移動Z"); //"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("噴嘴溫度不夠"); //"Hotend too cold" + PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("移動 %s mm"); //"Move 0.025mm" + PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); //"Move 0.1mm" + PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("移動 1 mm"); //"Move 1mm" + 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(" 噴嘴 ~"); + PROGMEM Language_Str MSG_BED = " " LCD_STR_THERMOMETER _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("風扇速率 ="); + 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("額外風扇速率 ="); + PROGMEM Language_Str MSG_FLOW = _UxGT("擠出速率"); + PROGMEM Language_Str MSG_FLOW_N = _UxGT("擠出速率 ~"); //"Flow" + PROGMEM Language_Str MSG_CONTROL = _UxGT("控制"); //"Control" + PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); //" " LCD_STR_THERMOMETER " Min" + PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); //" " LCD_STR_THERMOMETER " Max" + PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 系數"); //" " LCD_STR_THERMOMETER " 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_SELECT = _UxGT("選擇"); //"Select" + PROGMEM Language_Str MSG_SELECT_E = _UxGT("選擇 *"); + PROGMEM Language_Str MSG_ACC = _UxGT("加速度"); //"Accel" acceleration + PROGMEM Language_Str MSG_JERK = _UxGT("抖動速率"); //"Jerk" + PROGMEM Language_Str MSG_VA_JERK = _UxGT("軸抖動速率") LCD_STR_A; //"Va-jerk" + PROGMEM Language_Str MSG_VB_JERK = _UxGT("軸抖動速率") LCD_STR_B; //"Vb-jerk" + PROGMEM Language_Str MSG_VC_JERK = _UxGT("軸抖動速率") LCD_STR_C; //"Vc-jerk" + PROGMEM Language_Str MSG_VE_JERK = _UxGT("擠出機抖動速率"); //"Ve-jerk" + + PROGMEM Language_Str MSG_VELOCITY = _UxGT("速度"); // "Velocity" + PROGMEM Language_Str MSG_VMAX_A = _UxGT("最大進料速率") LCD_STR_A; //"Vmax " max_feedrate_mm_s + 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("最大進料速率 *"); //"Vmax " max_feedrate_mm_s + PROGMEM Language_Str MSG_VMIN = _UxGT("最小進料速率"); //"Vmin" min_feedrate_mm_s + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("最小移動速率"); //"VTrav min" min_travel_feedrate_mm_s, (target) speed of the move + PROGMEM Language_Str MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" + PROGMEM Language_Str MSG_AMAX_A = _UxGT("最大列印加速度") LCD_STR_A; //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + 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("最大列印加速度 *"); //"Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + PROGMEM Language_Str MSG_A_RETRACT = _UxGT("回縮加速度"); //"A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts + PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("非列印移動加速度"); //"A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + 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" axis_steps_per_mm, axis steps-per-unit G92 + PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT("軸步數/mm"); + PROGMEM Language_Str MSG_C_STEPS = LCD_STR_C _UxGT("軸步數/mm"); + PROGMEM Language_Str MSG_E_STEPS = _UxGT("擠出機步數/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_control_volumetric + PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("測容積mm³"); //"E in mm3" volumetric_enabled + 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" + PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("装載 mm"); // "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對比度"); //"LCD contrast" + PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("保存設置"); //"Store memory" + PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("載入設置"); //"Load memory" + PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("恢復安全值"); //"Restore failsafe" + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("初始化設置"); // "Initialize EEPROM" + PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("錯誤: EEPROM CRC"); //"Err: EEPROM CRC" + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("錯誤: EEPROM Index"); //"Err: EEPROM Index" + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("錯誤: EEPROM Version"); //"EEPROM Version" + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("媒體更新"); //"Media Update" + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("重置打印機"); //"Reset Printer + PROGMEM Language_Str MSG_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_START_PRINT = _UxGT("開始列印"); //"Start Print" + PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("下一個"); //"Next" + PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("初始 "); //"Init" + PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("停止 "); //"Stop" + PROGMEM Language_Str MSG_BUTTON_PRINT = _UxGT("列印 "); //"Print" + PROGMEM Language_Str MSG_BUTTON_RESET = _UxGT("復歸 "); //"Reset" + PROGMEM Language_Str MSG_BUTTON_CANCEL = _UxGT("放棄 "); //"Cancel" + PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("確認 "); //"Done" + PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("返回 "); //"Back" + PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("繼續 "); //"Proceed" + 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 SD" + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("無記憶卡"); //"No SD card" + 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_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("回縮長度mm"); //"Retract mm" retract_length, retract length (positive mm) + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("換手回抽長度mm"); //"Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change + PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); //"Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); //"Hop mm" retract_zraise, retract Z-lift + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮恢復長度mm"); //"UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("換手回縮恢復長度mm"); //"S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮恢復後進料速率mm/s"); //"Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("自動回縮"); //"Auto-Retract" autoretract_enabled, + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("交換長度"); //"Swap Length" + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("清除長度"); //"Purge Length" + PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("交換工具"); //"Tool Change" + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z軸提昇"); //"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_NOZZLE_STANDBY = _UxGT("噴嘴待機"); //"Nozzle Standby" + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("更換絲料"); //"Change filament" + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("更換絲料 *"); + PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("裝載絲料"); // "Load filament" + PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("裝載絲料 *"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("卸載絲料"); // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("卸載絲料 *"); // "Unload filament" + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("卸載全部"); // "Unload All" + PROGMEM Language_Str MSG_INIT_MEDIA = _UxGT("初始化記憶卡"); //"Init. SD card" + PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("連接記憶卡"); //"Attach Media + PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("更換記憶卡"); //"Change SD card" + PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("釋放媒體"); //"Release Media" + 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_SELFTEST = _UxGT("BLTouch 自檢"); // "BLTouch Self-Test" + PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_STOW = _UxGT("裝載BLTouch"); // "Stow BLTouch" + PROGMEM Language_Str MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch" + + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("歸位 %s%s%s 先"); //"Home ... first" + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("探針偏移"); //Probe Offsets + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("探針X偏移量"); //Probe X Offset + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("探針Y偏移量"); //Probe Y Offset + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("探針Z偏移量"); //Probe Z Offset + PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("微量調整X軸"); //"Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts + PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("微量調整Y軸"); //"Babystep Y" + PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("微量調整Z軸"); //"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_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_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("⊿校準X"); //"Calibrate X" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校準Y"); //"Calibrate Y" + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校準Z"); //"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("Z偏移"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" + PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" + PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("⊿半徑"); // "Radius" + PROGMEM Language_Str MSG_INFO_MENU = _UxGT("關於印表機"); //"About Printer" + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("印表機訊息"); //"Printer Info" + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("線性調平"); // "Linear Leveling" + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT(" 雙線性調平"); // "Bilinear Leveling" + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" + PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("印表機統計"); //"Printer Stats" + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("主板訊息"); //"Board Info" + PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("溫度計"); //"Thermistors" + PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT(" 擠出機"); //"Extruders" + 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_CASE_LIGHT = _UxGT("外殼燈"); // "Case light" + PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("燈亮度"); // "Light BRIGHTNESS" + PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("打印機不正確"); // "The printer is incorrect" + + #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_LONGEST = _UxGT("最長工作時間"); //"Longest job time" + PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("總計擠出"); //"Extruded total" + #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("最低溫度"); //"Min Temp" + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("最高溫度"); //"Max Temp" + PROGMEM Language_Str MSG_INFO_PSU = _UxGT("電源供應"); //"Power Supply" + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("驅動力度"); // "Drive Strength" + PROGMEM Language_Str MSG_DAC_PERCENT = _UxGT("驅動 %"); // "Driver %" + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X 驅動 %"); //X Driver % + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y 驅動 %"); //Y Driver % + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z 驅動 %"); //Z Driver % + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E 驅動 %"); //E Driver % + PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC連接錯誤"); //"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("恢復列印"); //"Resume print" + 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("絲距離mm"); //"Runout Dist mm" + PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("歸原位失敗"); // "Homing failed" + PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("探針探測失敗"); // "Probing failed" + + // + // 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_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按鈕", "恢復列印")); //"Press Button to resume print" + PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); //"Parking..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待開始", "絲料", "變更")); //"Wait for start of the filament change" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下絲料")); //"Wait for filament unload" + 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("加熱噴嘴", "請等待 ...")); // "Heating nozzle Please wait..." + 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("按下完成","絲料清除")); //"Press button to filament purge" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待列印", "恢復")); //"Wait for print to resume" + #else // LCD_HEIGHT < 4 + 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("停車中 ...")); //"Parking..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("請等待 ...")); //"Please wait..." + 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 to heat" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加熱中 ...")); //"Heating..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); //"Ejecting..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("載入中 ...")); //"Loading..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); //"Purging..." + PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成..")); //"Click to finish" + PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢復中 ...")); //"Resuming..." + #endif // LCD_HEIGHT < 4 +} + +#if FAN_COUNT == 1 + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED +#else + #define MSG_FIRST_FAN_SPEED MSG_FAN_SPEED_N + #define MSG_EXTRA_FIRST_FAN_SPEED MSG_EXTRA_FAN_SPEED_N +#endif diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp new file mode 100644 index 00000000..e381c590 --- /dev/null +++ b/Marlin/src/lcd/lcdprint.cpp @@ -0,0 +1,76 @@ +/** + * 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 . + * + */ + +/** + * lcdprint.cpp + */ + +#include "../inc/MarlinConfigPre.h" + +#if HAS_WIRED_LCD + +#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, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { + uint8_t *p = (uint8_t*)pstr; + int8_t n = maxlen; + while (n > 0) { + wchar_t ch; + p = get_utf8_value_cb(p, read_byte_rom, &ch); + if (!ch) break; + if (ch == '=' || ch == '~' || ch == '*') { + if (ind >= 0) { + if (ch == '*') { lcd_put_wchar('E'); 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); + break; + } + } + else if (ch == '$' && inStr) { + n -= lcd_put_u8str_max_P(inStr, n * (MENU_FONT_WIDTH)) / (MENU_FONT_WIDTH); + } + else { + lcd_put_wchar(ch); + n--; + } + } + return n; +} + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h new file mode 100644 index 00000000..cf34a7ad --- /dev/null +++ b/Marlin/src/lcd/lcdprint.h @@ -0,0 +1,171 @@ +/** + * 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 + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2016-08-19 + * @copyright GPL/BSD + */ +#pragma once + +#include "fontutils.h" + +#include "../inc/MarlinConfig.h" + +#if HAS_MARLINUI_U8GLIB + + #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) SETCURSOR(LCD_WIDTH - (len), row) + +#endif + +#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(); + +int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length); + +/** + * @brief Draw a UTF-8 string + * + * @param utf8_str : the UTF-8 string + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the pixel width + * + * Draw a UTF-8 string + */ +int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length); + +/** + * Set the print baseline position + */ +void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row); + +/** + * @brief Draw a ROM UTF-8 string + * + * @param utf8_str_P : the ROM UTF-8 string + * @param max_length : the pixel length of the string allowed (or number of slots in HD44780) + * + * @return the pixel width + * + * Draw a ROM UTF-8 string + */ +int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length); +inline int lcd_put_u8str_max_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P utf8_str_P, pixel_len_t max_length) { + lcd_moveto(col, row); + return lcd_put_u8str_max_P(utf8_str_P, max_length); +} + +void lcd_put_int(const int i); +inline void lcd_put_int(const lcd_uint_t col, const lcd_uint_t row, const int i) { + lcd_moveto(col, row); + lcd_put_int(i); +} + +inline int lcd_put_u8str_P(PGM_P const pstr) { return lcd_put_u8str_max_P(pstr, PIXEL_LEN_NOLIMIT); } +inline int lcd_put_u8str_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const pstr) { + lcd_moveto(col, row); + return lcd_put_u8str_P(pstr); +} + +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, inStr, maxlen); +} + +inline int lcd_put_u8str(const char* str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } +inline int lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, PGM_P const str) { + lcd_moveto(col, row); + return lcd_put_u8str(str); +} + +inline int lcd_put_wchar(const wchar_t c) { return lcd_put_wchar_max(c, PIXEL_LEN_NOLIMIT); } +inline int lcd_put_wchar(const lcd_uint_t col, const lcd_uint_t row, const wchar_t c) { + lcd_moveto(col, row); + return lcd_put_wchar(c); +} diff --git a/Marlin/src/lcd/menu/game/brickout.cpp b/Marlin/src/lcd/menu/game/brickout.cpp new file mode 100644 index 00000000..4bdc9243 --- /dev/null +++ b/Marlin/src/lcd/menu/game/brickout.cpp @@ -0,0 +1,207 @@ +/** + * 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(MARLIN_BRICKOUT) + +#include "game.h" + +#define BRICK_H 5 +#define BRICK_TOP MENU_FONT_ASCENT + +#define PADDLE_H 2 +#define PADDLE_VEL 3 +#define PADDLE_W ((LCD_PIXEL_WIDTH) / 8) +#define PADDLE_Y (LCD_PIXEL_HEIGHT - 1 - PADDLE_H) + +#define BRICK_W ((LCD_PIXEL_WIDTH) / (BRICK_COLS)) +#define BRICK_BOT (BRICK_TOP + BRICK_H * BRICK_ROWS - 1) + +#define BRICK_COL(X) ((X) / (BRICK_W)) +#define BRICK_ROW(Y) ((Y - (BRICK_TOP)) / (BRICK_H)) + +brickout_data_t &bdat = marlin_game_data.brickout; + +inline void reset_bricks(const uint16_t v) { + bdat.brick_count = (BRICK_COLS) * (BRICK_ROWS); + LOOP_L_N(i, BRICK_ROWS) bdat.bricks[i] = v; +} + +void reset_ball() { + constexpr uint8_t ball_dist = 24; + bdat.bally = BTOF(PADDLE_Y - ball_dist); + bdat.ballv = FTOP(1.3f); + bdat.ballh = -FTOP(1.25f); + uint8_t bx = bdat.paddle_x + (PADDLE_W) / 2 + ball_dist; + if (bx >= LCD_PIXEL_WIDTH - 10) { bx -= ball_dist * 2; bdat.ballh = -bdat.ballh; } + bdat.ballx = BTOF(bx); + bdat.hit_dir = -1; +} + +void BrickoutGame::game_screen() { + if (game_frame()) { // Run logic twice for finer resolution + // Update Paddle Position + bdat.paddle_x = constrain(int8_t(ui.encoderPosition), 0, (LCD_PIXEL_WIDTH - (PADDLE_W)) / (PADDLE_VEL)); + ui.encoderPosition = bdat.paddle_x; + bdat.paddle_x *= (PADDLE_VEL); + + // Run the ball logic + if (game_state) do { + + // Provisionally update the ball position + const fixed_t newx = bdat.ballx + bdat.ballh, newy = bdat.bally + bdat.ballv; // current next position + if (!WITHIN(newx, 0, BTOF(LCD_PIXEL_WIDTH - 1))) { // out in x? + bdat.ballh = -bdat.ballh; _BUZZ(5, 220); // bounce x + } + if (newy < 0) { // out in y? + bdat.ballv = -bdat.ballv; _BUZZ(5, 280); // bounce v + bdat.hit_dir = 1; + } + // Did the ball go below the bottom? + else if (newy > BTOF(LCD_PIXEL_HEIGHT)) { + _BUZZ(500, 75); + if (--bdat.balls_left) reset_ball(); else game_state = 0; + break; // done + } + + // Is the ball colliding with a brick? + if (WITHIN(newy, BTOF(BRICK_TOP), BTOF(BRICK_BOT))) { + const int8_t bit = BRICK_COL(FTOB(newx)), row = BRICK_ROW(FTOB(newy)); + const uint16_t mask = _BV(bit); + if (bdat.bricks[row] & mask) { + // Yes. Remove it! + bdat.bricks[row] &= ~mask; + // Score! + score += BRICK_ROWS - row; + // If bricks are gone, go to reset state + if (!--bdat.brick_count) game_state = 2; + // Bounce the ball cleverly + if ((bdat.ballv < 0) == (bdat.hit_dir < 0)) { bdat.ballv = -bdat.ballv; bdat.ballh += fixed_t(random(-16, 16)); _BUZZ(5, 880); } + else { bdat.ballh = -bdat.ballh; bdat.ballv += fixed_t(random(-16, 16)); _BUZZ(5, 640); } + } + } + // Is the ball moving down and in paddle range? + else if (bdat.ballv > 0 && WITHIN(newy, BTOF(PADDLE_Y), BTOF(PADDLE_Y + PADDLE_H))) { + // Ball actually hitting paddle + const int8_t diff = FTOB(newx) - bdat.paddle_x; + if (WITHIN(diff, 0, PADDLE_W - 1)) { + + // Reverse Y direction + bdat.ballv = -bdat.ballv; _BUZZ(3, 880); + bdat.hit_dir = -1; + + // Near edges affects X velocity + const bool is_left_edge = (diff <= 1); + if (is_left_edge || diff >= PADDLE_W-1 - 1) { + if ((bdat.ballh > 0) == is_left_edge) bdat.ballh = -bdat.ballh; + } + else if (diff <= 3) { + bdat.ballh += fixed_t(random(-64, 0)); + NOLESS(bdat.ballh, BTOF(-2)); + NOMORE(bdat.ballh, BTOF(2)); + } + else if (diff >= PADDLE_W-1 - 3) { + bdat.ballh += fixed_t(random( 0, 64)); + NOLESS(bdat.ballh, BTOF(-2)); + NOMORE(bdat.ballh, BTOF(2)); + } + + // Paddle hit after clearing the board? Reset the board. + if (game_state == 2) { reset_bricks(0xFFFF); game_state = 1; } + } + } + + bdat.ballx += bdat.ballh; bdat.bally += bdat.ballv; // update with new velocity + + } while (false); + } + + u8g.setColorIndex(1); + + // Draw bricks + if (PAGE_CONTAINS(BRICK_TOP, BRICK_BOT)) { + LOOP_L_N(y, BRICK_ROWS) { + const uint8_t yy = y * BRICK_H + BRICK_TOP; + if (PAGE_CONTAINS(yy, yy + BRICK_H - 1)) { + LOOP_L_N(x, BRICK_COLS) { + if (TEST(bdat.bricks[y], x)) { + const uint8_t xx = x * BRICK_W; + LOOP_L_N(v, BRICK_H - 1) + if (PAGE_CONTAINS(yy + v, yy + v)) + u8g.drawHLine(xx, yy + v, BRICK_W - 1); + } + } + } + } + } + + // Draw paddle + if (PAGE_CONTAINS(PADDLE_Y-1, PADDLE_Y)) { + u8g.drawHLine(bdat.paddle_x, PADDLE_Y, PADDLE_W); + #if PADDLE_H > 1 + u8g.drawHLine(bdat.paddle_x, PADDLE_Y-1, PADDLE_W); + #if PADDLE_H > 2 + u8g.drawHLine(bdat.paddle_x, PADDLE_Y-2, PADDLE_W); + #endif + #endif + } + + // Draw ball while game is running + if (game_state) { + const uint8_t by = FTOB(bdat.bally); + if (PAGE_CONTAINS(by, by+1)) + u8g.drawFrame(FTOB(bdat.ballx), by, 2, 2); + } + // Or draw GAME OVER + else + draw_game_over(); + + if (PAGE_UNDER(MENU_FONT_ASCENT)) { + // Score Digits + //const uint8_t sx = (LCD_PIXEL_WIDTH - (score >= 10 ? score >= 100 ? score >= 1000 ? 4 : 3 : 2 : 1) * MENU_FONT_WIDTH) / 2; + constexpr uint8_t sx = 0; + lcd_put_int(sx, MENU_FONT_ASCENT - 1, score); + + // Balls Left + lcd_moveto(LCD_PIXEL_WIDTH - MENU_FONT_WIDTH * 3, MENU_FONT_ASCENT - 1); + PGM_P const ohs = PSTR("ooo\0\0"); + lcd_put_u8str_P(ohs + 3 - bdat.balls_left); + } + + // A click always exits this game + if (ui.use_click()) exit_game(); +} + +#define SCREEN_M ((LCD_PIXEL_WIDTH) / 2) + +void BrickoutGame::enter_game() { + init_game(2, game_screen); // 2 = reset bricks on paddle hit + constexpr uint8_t paddle_start = SCREEN_M - (PADDLE_W) / 2; + bdat.paddle_x = paddle_start; + bdat.balls_left = 3; + reset_bricks(0x0000); + reset_ball(); + ui.encoderPosition = paddle_start / (PADDLE_VEL); +} + +#endif // MARLIN_BRICKOUT diff --git a/Marlin/src/lcd/menu/game/brickout.h b/Marlin/src/lcd/menu/game/brickout.h new file mode 100644 index 00000000..cf1fbc6d --- /dev/null +++ b/Marlin/src/lcd/menu/game/brickout.h @@ -0,0 +1,38 @@ +/** + * 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 "types.h" + +#define BRICK_ROWS 4 +#define BRICK_COLS 16 + +typedef struct { + uint8_t balls_left, brick_count; + uint16_t bricks[BRICK_ROWS]; + int8_t paddle_x, hit_dir; + fixed_t ballx, bally, ballh, ballv; +} brickout_data_t; + +class BrickoutGame : MarlinGame { public: static void enter_game(), game_screen(); }; + +extern BrickoutGame brickout; diff --git a/Marlin/src/lcd/menu/game/game.cpp b/Marlin/src/lcd/menu/game/game.cpp new file mode 100644 index 00000000..c14bd2a6 --- /dev/null +++ b/Marlin/src/lcd/menu/game/game.cpp @@ -0,0 +1,66 @@ +/** + * 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_GAMES + +#include "game.h" + +int MarlinGame::score; +uint8_t MarlinGame::game_state; +millis_t MarlinGame::next_frame; + +MarlinGameData marlin_game_data; + +bool MarlinGame::game_frame() { + static int8_t slew; + if (ui.first_page) slew = 2; + ui.refresh(LCDVIEW_CALL_NO_REDRAW); // Refresh as often as possible + return (game_state && slew-- > 0); +} + +void MarlinGame::draw_game_over() { + constexpr int8_t gowide = (MENU_FONT_WIDTH) * 9, + gohigh = MENU_FONT_ASCENT - 3, + lx = (LCD_PIXEL_WIDTH - gowide) / 2, + ly = (LCD_PIXEL_HEIGHT + gohigh) / 2; + if (PAGE_CONTAINS(ly - gohigh - 1, ly + 1)) { + u8g.setColorIndex(0); + u8g.drawBox(lx - 1, ly - gohigh - 1, gowide + 2, gohigh + 2); + u8g.setColorIndex(1); + if (ui.get_blink()) lcd_put_u8str_P(lx, ly, PSTR("GAME OVER")); + } +} + +void MarlinGame::init_game(const uint8_t init_state, const screenFunc_t screen) { + score = 0; + game_state = init_state; + ui.goto_screen(screen); + ui.defer_status_screen(); +} + +void MarlinGame::exit_game() { + ui.goto_previous_screen_no_defer(); +} + +#endif // HAS_GAMES diff --git a/Marlin/src/lcd/menu/game/game.h b/Marlin/src/lcd/menu/game/game.h new file mode 100644 index 00000000..e788f298 --- /dev/null +++ b/Marlin/src/lcd/menu/game/game.h @@ -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 . + * + */ +#pragma once + +#include "../../../inc/MarlinConfigPre.h" +#include "../../dogm/ultralcd_DOGM.h" +#include "../../lcdprint.h" +#include "../../ultralcd.h" + +//#define MUTE_GAMES + +#if ENABLED(MUTE_GAMES) || !HAS_BUZZER + #define _BUZZ(D,F) NOOP +#else + #define _BUZZ(D,F) BUZZ(D,F) +#endif + +#if HAS_GAME_MENU + void menu_game(); +#endif + +#if ENABLED(MARLIN_BRICKOUT) + #include "brickout.h" +#endif +#if ENABLED(MARLIN_INVADERS) + #include "invaders.h" +#endif +#if ENABLED(MARLIN_MAZE) + #include "maze.h" +#endif +#if ENABLED(MARLIN_SNAKE) + #include "snake.h" +#endif + +// Pool game data to save SRAM +union MarlinGameData { + TERN_(MARLIN_BRICKOUT, brickout_data_t brickout); + TERN_(MARLIN_INVADERS, invaders_data_t invaders); + TERN_(MARLIN_SNAKE, snake_data_t snake); + TERN_(MARLIN_MAZE, maze_data_t maze); +}; + +extern MarlinGameData marlin_game_data; diff --git a/Marlin/src/lcd/menu/game/invaders.cpp b/Marlin/src/lcd/menu/game/invaders.cpp new file mode 100644 index 00000000..56e4c224 --- /dev/null +++ b/Marlin/src/lcd/menu/game/invaders.cpp @@ -0,0 +1,438 @@ +/** + * 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(MARLIN_INVADERS) + +#include "game.h" + +#define CANNON_W 11 +#define CANNON_H 8 +#define CANNON_VEL 4 +#define CANNON_Y (LCD_PIXEL_HEIGHT - 1 - CANNON_H) + +#define INVADER_VEL 3 + +#define INVADER_TOP MENU_FONT_ASCENT +#define INVADERS_WIDE ((INVADER_COL_W) * (INVADER_COLS)) +#define INVADERS_HIGH ((INVADER_ROW_H) * (INVADER_ROWS)) + +#define UFO_H 5 +#define UFO_W 13 + +#define LASER_H 4 +#define SHOT_H 3 +#define EXPL_W 11 +#define LIFE_W 8 +#define LIFE_H 5 + +#define INVADER_RIGHT ((INVADER_COLS) * (INVADER_COL_W)) + +// 11x8 +const unsigned char invader[3][2][16] PROGMEM = { + { { B00000110,B00000000, + B00001111,B00000000, + B00011111,B10000000, + B00110110,B11000000, + B00111111,B11000000, + B00001001,B00000000, + B00010110,B10000000, + B00101001,B01000000 + }, { + B00000110,B00000000, + B00001111,B00000000, + B00011111,B10000000, + B00110110,B11000000, + B00111111,B11000000, + B00010110,B10000000, + B00100000,B01000000, + B00010000,B10000000 + } + }, { + { B00010000,B01000000, + B00001000,B10000000, + B00011111,B11000000, + B00110111,B01100000, + B01111111,B11110000, + B01011111,B11010000, + B01010000,B01010000, + B00001101,B10000000 + }, { + B00010000,B01000000, + B01001000,B10010000, + B01011111,B11010000, + B01110111,B01110000, + B01111111,B11110000, + B00011111,B11000000, + B00010000,B01000000, + B00100000,B00100000 + } + }, { + { B00001111,B00000000, + B01111111,B11100000, + B11111111,B11110000, + B11100110,B01110000, + B11111111,B11110000, + B00011001,B10000000, + B00110110,B11000000, + B11000000,B00110000 + }, { + B00001111,B00000000, + B01111111,B11100000, + B11111111,B11110000, + B11100110,B01110000, + B11111111,B11110000, + B00011001,B10000000, + B00110110,B11000000, + B00011001,B10000000 + } + } +}; +const unsigned char cannon[] PROGMEM = { + B00000100,B00000000, + B00001110,B00000000, + B00001110,B00000000, + B01111111,B11000000, + B11111111,B11100000, + B11111111,B11100000, + B11111111,B11100000, + B11111111,B11100000 +}; +const unsigned char life[] PROGMEM = { + B00010000, + B01111100, + B11111110, + B11111110, + B11111110 +}; +const unsigned char explosion[] PROGMEM = { + B01000100,B01000000, + B00100100,B10000000, + B00000000,B00000000, + B00110001,B10000000, + B00000000,B00000000, + B00100100,B10000000, + B01000100,B01000000 +}; +const unsigned char ufo[] PROGMEM = { + B00011111,B11000000, + B01111111,B11110000, + B11011101,B11011000, + B11111111,B11111000, + B01111111,B11110000 +}; + +constexpr uint8_t inv_type[] = { + #if INVADER_ROWS == 5 + 0, 1, 1, 2, 2 + #elif INVADER_ROWS == 4 + 0, 1, 1, 2 + #elif INVADER_ROWS == 3 + 0, 1, 2 + #else + #error "INVASION_SIZE must be 3, 4, or 5." + #endif +}; + +invaders_data_t &idat = marlin_game_data.invaders; + +#define INV_X_LEFT(C,T) (idat.pos.x + (C) * (INVADER_COL_W) + inv_off[T]) +#define INV_X_CTR(C,T) (INV_X_LEFT(C,T) + inv_wide[T] / 2) +#define INV_Y_BOT(R) (idat.pos.y + (R + 1) * (INVADER_ROW_H) - 2) + +constexpr uint8_t inv_off[] = { 2, 1, 0 }, inv_wide[] = { 8, 11, 12 }; + +inline void update_invader_data() { + uint8_t inv_mask = 0; + // Get a list of all active invaders + uint8_t sc = 0; + LOOP_L_N(y, INVADER_ROWS) { + uint8_t m = idat.bugs[y]; + if (m) idat.botmost = y + 1; + inv_mask |= m; + LOOP_L_N(x, INVADER_COLS) + if (TEST(m, x)) idat.shooters[sc++] = (y << 4) | x; + } + idat.leftmost = 0; + LOOP_L_N(i, INVADER_COLS) { if (TEST(inv_mask, i)) break; idat.leftmost -= INVADER_COL_W; } + idat.rightmost = LCD_PIXEL_WIDTH - (INVADERS_WIDE); + for (uint8_t i = INVADER_COLS; i--;) { if (TEST(inv_mask, i)) break; idat.rightmost += INVADER_COL_W; } + if (idat.count == 2) idat.dir = idat.dir > 0 ? INVADER_VEL + 1 : -(INVADER_VEL + 1); +} + +inline void reset_bullets() { + LOOP_L_N(i, COUNT(idat.bullet)) idat.bullet[i].v = 0; +} + +inline void reset_invaders() { + idat.pos.x = 0; idat.pos.y = INVADER_TOP; + idat.dir = INVADER_VEL; + idat.count = (INVADER_COLS) * (INVADER_ROWS); + LOOP_L_N(i, INVADER_ROWS) idat.bugs[i] = _BV(INVADER_COLS) - 1; + update_invader_data(); + reset_bullets(); +} + + +inline void spawn_ufo() { + idat.ufov = random(0, 2) ? 1 : -1; + idat.ufox = idat.ufov > 0 ? -(UFO_W) : LCD_PIXEL_WIDTH - 1; +} + +inline void reset_player() { + idat.cannon_x = 0; + ui.encoderPosition = 0; +} + +inline void fire_cannon() { + idat.laser.x = idat.cannon_x + CANNON_W / 2; + idat.laser.y = LCD_PIXEL_HEIGHT - CANNON_H - (LASER_H); + idat.laser.v = -(LASER_H); +} + +inline void explode(const int8_t x, const int8_t y, const int8_t v=4) { + idat.explod.x = x - (EXPL_W) / 2; + idat.explod.y = y; + idat.explod.v = v; +} + +inline void kill_cannon(uint8_t &game_state, const uint8_t st) { + reset_bullets(); + explode(idat.cannon_x + (CANNON_W) / 2, CANNON_Y, 6); + _BUZZ(1000, 10); + if (--idat.cannons_left) { + idat.laser.v = 0; + game_state = st; + reset_player(); + } + else + game_state = 0; +} + +void InvadersGame::game_screen() { + ui.refresh(LCDVIEW_CALL_NO_REDRAW); // Call as often as possible + + // Run game logic once per full screen + if (ui.first_page) { + + // Update Cannon Position + int16_t ep = constrain(int16_t(ui.encoderPosition), 0, (LCD_PIXEL_WIDTH - (CANNON_W)) / (CANNON_VEL)); + ui.encoderPosition = ep; + + ep *= (CANNON_VEL); + if (ep > idat.cannon_x) { idat.cannon_x += CANNON_VEL - 1; if (ep - idat.cannon_x < 2) idat.cannon_x = ep; } + if (ep < idat.cannon_x) { idat.cannon_x -= CANNON_VEL - 1; if (idat.cannon_x - ep < 2) idat.cannon_x = ep; } + + // Run the game logic + if (game_state) do { + + // Move the UFO, if any + if (idat.ufov) { idat.ufox += idat.ufov; if (!WITHIN(idat.ufox, -(UFO_W), LCD_PIXEL_WIDTH - 1)) idat.ufov = 0; } + + if (game_state > 1) { if (--game_state == 2) { reset_invaders(); } else if (game_state == 100) { game_state = 1; } break; } + + const bool did_blink = (++idat.blink_count > idat.count >> 1); + if (did_blink) { + idat.game_blink = !idat.game_blink; + idat.blink_count = 0; + } + + if (idat.count && did_blink) { + const int8_t newx = idat.pos.x + idat.dir; + if (!WITHIN(newx, idat.leftmost, idat.rightmost)) { // Invaders reached the edge? + idat.dir *= -1; // Invaders change direction + idat.pos.y += (INVADER_ROW_H) / 2; // Invaders move down + idat.pos.x -= idat.dir; // ...and only move down this time. + if (idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 >= CANNON_Y) // Invaders reached the bottom? + kill_cannon(game_state, 20); // Kill the cannon. Reset invaders. + } + + idat.pos.x += idat.dir; // Invaders take one step left/right + + // Randomly shoot if invaders are listed + if (idat.count && !random(0, 20)) { + + // Find a free bullet + laser_t *b = nullptr; + LOOP_L_N(i, COUNT(idat.bullet)) if (!idat.bullet[i].v) { b = &idat.bullet[i]; break; } + if (b) { + // Pick a random shooter and update the bullet + //SERIAL_ECHOLNPGM("free bullet found"); + const uint8_t inv = idat.shooters[random(0, idat.count + 1)], col = inv & 0x0F, row = inv >> 4, type = inv_type[row]; + b->x = INV_X_CTR(col, type); + b->y = INV_Y_BOT(row); + b->v = 2 + random(0, 2); + } + } + } + + // Update the laser position + if (idat.laser.v) { + idat.laser.y += idat.laser.v; + if (idat.laser.y < 0) idat.laser.v = 0; + } + + // Did the laser collide with an invader? + if (idat.laser.v && WITHIN(idat.laser.y, idat.pos.y, idat.pos.y + INVADERS_HIGH - 1)) { + const int8_t col = idat.laser_col(); + if (WITHIN(col, 0, INVADER_COLS - 1)) { + const int8_t row = idat.laser_row(); + if (WITHIN(row, 0, INVADER_ROWS - 1)) { + const uint8_t mask = _BV(col); + if (idat.bugs[row] & mask) { + const uint8_t type = inv_type[row]; + const int8_t invx = INV_X_LEFT(col, type); + if (WITHIN(idat.laser.x, invx, invx + inv_wide[type] - 1)) { + // Turn off laser + idat.laser.v = 0; + // Remove the invader! + idat.bugs[row] &= ~mask; + // Score! + score += INVADER_ROWS - row; + // Explode sound! + _BUZZ(40, 10); + // Explosion bitmap! + explode(invx + inv_wide[type] / 2, idat.pos.y + row * (INVADER_ROW_H)); + // If invaders are gone, go to reset invaders state + if (--idat.count) update_invader_data(); else { game_state = 20; reset_bullets(); } + } // laser x hit + } // invader exists + } // good row + } // good col + } // laser in invader zone + + // Handle alien bullets + LOOP_L_N(s, COUNT(idat.bullet)) { + laser_t *b = &idat.bullet[s]; + if (b->v) { + // Update alien bullet position + b->y += b->v; + if (b->y >= LCD_PIXEL_HEIGHT) + b->v = 0; // Offscreen + else if (b->y >= CANNON_Y && WITHIN(b->x, idat.cannon_x, idat.cannon_x + CANNON_W - 1)) + kill_cannon(game_state, 120); // Hit the cannon + } + } + + // Randomly spawn a UFO + if (!idat.ufov && !random(0,500)) spawn_ufo(); + + // Did the laser hit a ufo? + if (idat.laser.v && idat.ufov && idat.laser.y < UFO_H + 2 && WITHIN(idat.laser.x, idat.ufox, idat.ufox + UFO_W - 1)) { + // Turn off laser and UFO + idat.laser.v = idat.ufov = 0; + // Score! + score += 10; + // Explode! + _BUZZ(40, 10); + // Explosion bitmap + explode(idat.ufox + (UFO_W) / 2, 1); + } + + } while (false); + + } + + // Click-and-hold to abort + if (ui.button_pressed()) --idat.quit_count; else idat.quit_count = 10; + + // Click to fire or exit + if (ui.use_click()) { + if (!game_state) + idat.quit_count = 0; + else if (game_state == 1 && !idat.laser.v) + fire_cannon(); + } + + if (!idat.quit_count) exit_game(); + + u8g.setColorIndex(1); + + // Draw invaders + if (PAGE_CONTAINS(idat.pos.y, idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 - 1)) { + int8_t yy = idat.pos.y; + LOOP_L_N(y, INVADER_ROWS) { + const uint8_t type = inv_type[y]; + if (PAGE_CONTAINS(yy, yy + INVADER_H - 1)) { + int8_t xx = idat.pos.x; + LOOP_L_N(x, INVADER_COLS) { + if (TEST(idat.bugs[y], x)) + u8g.drawBitmapP(xx, yy, 2, INVADER_H, invader[type][idat.game_blink]); + xx += INVADER_COL_W; + } + } + yy += INVADER_ROW_H; + } + } + + // Draw UFO + if (idat.ufov && PAGE_UNDER(UFO_H + 2)) + u8g.drawBitmapP(idat.ufox, 2, 2, UFO_H, ufo); + + // Draw cannon + if (game_state && PAGE_CONTAINS(CANNON_Y, CANNON_Y + CANNON_H - 1) && (game_state < 2 || (game_state & 0x02))) + u8g.drawBitmapP(idat.cannon_x, CANNON_Y, 2, CANNON_H, cannon); + + // Draw laser + if (idat.laser.v && PAGE_CONTAINS(idat.laser.y, idat.laser.y + LASER_H - 1)) + u8g.drawVLine(idat.laser.x, idat.laser.y, LASER_H); + + // Draw invader bullets + LOOP_L_N (i, COUNT(idat.bullet)) { + if (idat.bullet[i].v && PAGE_CONTAINS(idat.bullet[i].y - (SHOT_H - 1), idat.bullet[i].y)) + u8g.drawVLine(idat.bullet[i].x, idat.bullet[i].y - (SHOT_H - 1), SHOT_H); + } + + // Draw explosion + if (idat.explod.v && PAGE_CONTAINS(idat.explod.y, idat.explod.y + 7 - 1)) { + u8g.drawBitmapP(idat.explod.x, idat.explod.y, 2, 7, explosion); + --idat.explod.v; + } + + // Blink GAME OVER when game is over + if (!game_state) draw_game_over(); + + if (PAGE_UNDER(MENU_FONT_ASCENT - 1)) { + // Draw Score + //const uint8_t sx = (LCD_PIXEL_WIDTH - (score >= 10 ? score >= 100 ? score >= 1000 ? 4 : 3 : 2 : 1) * MENU_FONT_WIDTH) / 2; + constexpr uint8_t sx = 0; + lcd_put_int(sx, MENU_FONT_ASCENT - 1, score); + + // Draw lives + if (idat.cannons_left) + for (uint8_t i = 1; i <= idat.cannons_left; ++i) + u8g.drawBitmapP(LCD_PIXEL_WIDTH - i * (LIFE_W), 6 - (LIFE_H), 1, LIFE_H, life); + } + +} + +void InvadersGame::enter_game() { + init_game(20, game_screen); // countdown to reset invaders + idat.cannons_left = 3; + idat.quit_count = 10; + idat.laser.v = 0; + reset_invaders(); + reset_player(); +} + +#endif // MARLIN_INVADERS diff --git a/Marlin/src/lcd/menu/game/invaders.h b/Marlin/src/lcd/menu/game/invaders.h new file mode 100644 index 00000000..c99e6c16 --- /dev/null +++ b/Marlin/src/lcd/menu/game/invaders.h @@ -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 . + * + */ +#pragma once + +#include "types.h" + +#define INVASION_SIZE 3 + +#if INVASION_SIZE == 3 + #define INVADER_COLS 5 +#elif INVASION_SIZE == 4 + #define INVADER_COLS 6 +#else + #define INVADER_COLS 8 + #undef INVASION_SIZE + #define INVASION_SIZE 5 +#endif + +#define INVADER_ROWS INVASION_SIZE + +#define INVADER_COL_W 14 +#define INVADER_H 8 +#define INVADER_ROW_H (INVADER_H + 2) + +typedef struct { int8_t x, y, v; } laser_t; + +typedef struct { + pos_t pos; + uint8_t cannons_left; + int8_t cannon_x; + laser_t bullet[10], laser, explod; + int8_t dir, leftmost, rightmost, botmost; + uint8_t count, quit_count, blink_count; + uint8_t bugs[INVADER_ROWS], shooters[(INVADER_ROWS) * (INVADER_COLS)]; + int8_t ufox, ufov; + bool game_blink; + int8_t laser_col() { return ((laser.x - pos.x) / (INVADER_COL_W)); }; + int8_t laser_row() { return ((laser.y - pos.y + 2) / (INVADER_ROW_H)); }; +} invaders_data_t; + +class InvadersGame : MarlinGame { public: static void enter_game(), game_screen(); }; + +extern InvadersGame invaders; diff --git a/Marlin/src/lcd/menu/game/maze.cpp b/Marlin/src/lcd/menu/game/maze.cpp new file mode 100644 index 00000000..85f752ee --- /dev/null +++ b/Marlin/src/lcd/menu/game/maze.cpp @@ -0,0 +1,134 @@ +/** + * 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(MARLIN_MAZE) + +#include "game.h" + +int8_t move_dir, last_move_dir, // NESW0 + prizex, prizey, prize_cnt, old_encoder; +fixed_t playerx, playery; + +// Up to 50 lines, then you win! +typedef struct { int8_t x, y; } pos_t; +uint8_t head_ind; +pos_t maze_walls[50] = { + { 0, 0 } +}; + +// Turn the player cw or ccw +inline void turn_player(const bool cw) { + if (move_dir == 4) move_dir = last_move_dir; + move_dir += cw ? 1 : -1; + move_dir &= 0x03; + last_move_dir = move_dir; +} + +// Reset the player for a new game +void player_reset() { + // Init position + playerx = BTOF(1); + playery = BTOF(GAME_H / 2); + + // Init motion with a ccw turn + move_dir = 0; + turn_player(false); + + // Clear prize flag + prize_cnt = 255; + + // Clear the controls + ui.encoderPosition = 0; + old_encoder = 0; +} + +void MazeGame::game_screen() { + // Run the sprite logic + if (game_frame()) do { // Run logic twice for finer resolution + + // Move the man one unit in the current direction + // Direction index 4 is for the stopped man + const int8_t oldx = FTOB(playerx), oldy = FTOB(playery); + pos_t dir_add[] = { { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, 0 } }; + playerx += dir_add[move_dir].x; + playery += dir_add[move_dir].y; + const int8_t x = FTOB(playerx), y = FTOB(playery); + + } while(0); + + u8g.setColorIndex(1); + + // Draw Score + if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score); + + // Draw the maze + // LOOP_L_N(n, head_ind) { + // const pos_t &p = maze_walls[n], &q = maze_walls[n + 1]; + // if (p.x == q.x) { + // const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); + // if (PAGE_CONTAINS(y1, y2)) + // u8g.drawVLine(GAMEX(p.x), y1, y2 - y1 + 1); + // } + // else if (PAGE_CONTAINS(GAMEY(p.y), GAMEY(p.y))) { + // const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x)); + // u8g.drawHLine(x1, GAMEY(p.y), x2 - x1 + 1); + // } + // } + + // Draw Man + // const int8_t fy = GAMEY(foody); + // if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) { + // const int8_t fx = GAMEX(foodx); + // u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH); + // if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2); + // } + + // Draw Ghosts + // const int8_t fy = GAMEY(foody); + // if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) { + // const int8_t fx = GAMEX(foodx); + // u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH); + // if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2); + // } + + // Draw Prize + // if (PAGE_CONTAINS(prizey, prizey + PRIZE_WH - 1)) { + // u8g.drawFrame(prizex, prizey, PRIZE_WH, PRIZE_WH); + // if (PRIZE_WH == 5) u8g.drawPixel(prizex + 2, prizey + 2); + // } + + // Draw GAME OVER + if (!game_state) draw_game_over(); + + // A click always exits this game + if (ui.use_click()) exit_game(); +} + +void MazeGame::enter_game() { + init_game(1, game_screen); // Game running + reset_player(); + reset_enemies(); +} + +#endif // MARLIN_MAZE diff --git a/Marlin/src/lcd/menu/game/maze.h b/Marlin/src/lcd/menu/game/maze.h new file mode 100644 index 00000000..ff5dde09 --- /dev/null +++ b/Marlin/src/lcd/menu/game/maze.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 "types.h" + +typedef struct { pos_t pos; } maze_data_t; + +class MazeGame : MarlinGame { public: static void enter_game(), game_screen(); }; + +extern MazeGame maze; diff --git a/Marlin/src/lcd/menu/game/snake.cpp b/Marlin/src/lcd/menu/game/snake.cpp new file mode 100644 index 00000000..f8892a4e --- /dev/null +++ b/Marlin/src/lcd/menu/game/snake.cpp @@ -0,0 +1,323 @@ +/** + * 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(MARLIN_SNAKE) + +#include "game.h" + +#define SNAKE_BOX 4 + +#define HEADER_H (MENU_FONT_ASCENT - 2) +#define SNAKE_WH (SNAKE_BOX + 1) + +#define IDEAL_L 2 +#define IDEAL_R (LCD_PIXEL_WIDTH - 1 - 2) +#define IDEAL_T (HEADER_H + 2) +#define IDEAL_B (LCD_PIXEL_HEIGHT - 1 - 2) +#define IDEAL_W (IDEAL_R - (IDEAL_L) + 1) +#define IDEAL_H (IDEAL_B - (IDEAL_T) + 1) + +#define GAME_W int((IDEAL_W) / (SNAKE_WH)) +#define GAME_H int((IDEAL_H) / (SNAKE_WH)) + +#define BOARD_W ((SNAKE_WH) * (GAME_W) + 1) +#define BOARD_H ((SNAKE_WH) * (GAME_H) + 1) +#define BOARD_L ((LCD_PIXEL_WIDTH - (BOARD_W) + 1) / 2) +#define BOARD_R (BOARD_L + BOARD_W - 1) +#define BOARD_T (((LCD_PIXEL_HEIGHT + IDEAL_T) - (BOARD_H)) / 2) +#define BOARD_B (BOARD_T + BOARD_H - 1) + +#define GAMEX(X) (BOARD_L + ((X) * (SNAKE_WH))) +#define GAMEY(Y) (BOARD_T + ((Y) * (SNAKE_WH))) + +#if SNAKE_BOX > 2 + #define FOOD_WH SNAKE_BOX +#else + #define FOOD_WH 2 +#endif + +#if SNAKE_BOX < 1 + #define SNAKE_SIZ 1 +#else + #define SNAKE_SIZ SNAKE_BOX +#endif + +constexpr fixed_t snakev = FTOP(0.20); + +snake_data_t &sdat = marlin_game_data.snake; + +// Remove the first pixel from the tail. +// If needed, shift out the first segment. +void shorten_tail() { + pos_t &p = sdat.snake_tail[0], &q = sdat.snake_tail[1]; + bool shift = false; + if (p.x == q.x) { + // Vertical line + p.y += (q.y > p.y) ? 1 : -1; + shift = p.y == q.y; + } + else { + // Horizontal line + p.x += (q.x > p.x) ? 1 : -1; + shift = p.x == q.x; + } + if (shift) { + sdat.head_ind--; + LOOP_LE_N(i, sdat.head_ind) + sdat.snake_tail[i] = sdat.snake_tail[i + 1]; + } +} + +// The food is on a line +inline bool food_on_line() { + LOOP_L_N(n, sdat.head_ind) { + pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; + if (p.x == q.x) { + if ((sdat.foodx == p.x - 1 || sdat.foodx == p.x) && WITHIN(sdat.foody, _MIN(p.y, q.y), _MAX(p.y, q.y))) + return true; + } + else if ((sdat.foody == p.y - 1 || sdat.foody == p.y) && WITHIN(sdat.foodx, _MIN(p.x, q.x), _MAX(p.x, q.x))) + return true; + } + return false; +} + +// Add a new food blob +void food_reset() { + do { + sdat.foodx = random(0, GAME_W); + sdat.foody = random(0, GAME_H); + } while (food_on_line()); +} + +// Turn the snake cw or ccw +inline void turn_snake(const bool cw) { + sdat.snake_dir += cw ? 1 : -1; + sdat.snake_dir &= 0x03; + sdat.head_ind++; + sdat.snake_tail[sdat.head_ind].x = FTOB(sdat.snakex); + sdat.snake_tail[sdat.head_ind].y = FTOB(sdat.snakey); +} + +// Reset the snake for a new game +void snake_reset() { + // Init the head and velocity + sdat.snakex = BTOF(1); + sdat.snakey = BTOF(GAME_H / 2); + //snakev = FTOP(0.25); + + // Init the tail with a cw turn + sdat.snake_dir = 0; + sdat.head_ind = 0; + sdat.snake_tail[0].x = 0; + sdat.snake_tail[0].y = GAME_H / 2; + turn_snake(true); + + // Clear food flag + sdat.food_cnt = 5; + + // Clear the controls + ui.encoderPosition = 0; + sdat.old_encoder = 0; +} + +// Check if head segment overlaps another +bool snake_overlap() { + // 4 lines must exist before a collision is possible + if (sdat.head_ind < 4) return false; + // Is the last segment crossing any others? + const pos_t &h1 = sdat.snake_tail[sdat.head_ind - 1], &h2 = sdat.snake_tail[sdat.head_ind]; + // VERTICAL head segment? + if (h1.x == h2.x) { + // Loop from oldest to segment two away from head + LOOP_L_N(n, sdat.head_ind - 2) { + // Segment p to q + const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; + if (p.x != q.x) { + // Crossing horizontal segment + if (WITHIN(h1.x, _MIN(p.x, q.x), _MAX(p.x, q.x)) && (h1.y <= p.y) == (h2.y >= p.y)) return true; + } // Overlapping vertical segment + else if (h1.x == p.x && _MIN(h1.y, h2.y) <= _MAX(p.y, q.y) && _MAX(h1.y, h2.y) >= _MIN(p.y, q.y)) return true; + } + } + else { + // Loop from oldest to segment two away from head + LOOP_L_N(n, sdat.head_ind - 2) { + // Segment p to q + const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; + if (p.y != q.y) { + // Crossing vertical segment + if (WITHIN(h1.y, _MIN(p.y, q.y), _MAX(p.y, q.y)) && (h1.x <= p.x) == (h2.x >= p.x)) return true; + } // Overlapping horizontal segment + else if (h1.y == p.y && _MIN(h1.x, h2.x) <= _MAX(p.x, q.x) && _MAX(h1.x, h2.x) >= _MIN(p.x, q.x)) return true; + } + } + return false; +} + +void SnakeGame::game_screen() { + // Run the snake logic + if (game_frame()) do { // Run logic twice for finer resolution + + // Move the snake's head one unit in the current direction + const int8_t oldx = FTOB(sdat.snakex), oldy = FTOB(sdat.snakey); + switch (sdat.snake_dir) { + case 0: sdat.snakey -= snakev; break; + case 1: sdat.snakex += snakev; break; + case 2: sdat.snakey += snakev; break; + case 3: sdat.snakex -= snakev; break; + } + const int8_t x = FTOB(sdat.snakex), y = FTOB(sdat.snakey); + + // If movement took place... + if (oldx != x || oldy != y) { + + if (!WITHIN(x, 0, GAME_W - 1) || !WITHIN(y, 0, GAME_H - 1)) { + game_state = 0; // Game Over + _BUZZ(400, 40); // Bzzzt! + break; // ...out of do-while + } + + sdat.snake_tail[sdat.head_ind].x = x; + sdat.snake_tail[sdat.head_ind].y = y; + + // Change snake direction if set + const int8_t enc = int8_t(ui.encoderPosition), diff = enc - sdat.old_encoder; + if (diff) { + sdat.old_encoder = enc; + turn_snake(diff > 0); + } + + if (sdat.food_cnt) --sdat.food_cnt; else shorten_tail(); + + // Did the snake collide with itself or go out of bounds? + if (snake_overlap()) { + game_state = 0; // Game Over + _BUZZ(400, 40); // Bzzzt! + } + // Is the snake at the food? + else if (x == sdat.foodx && y == sdat.foody) { + _BUZZ(5, 220); + _BUZZ(5, 280); + score++; + sdat.food_cnt = 2; + food_reset(); + } + } + + } while(0); + + u8g.setColorIndex(1); + + // Draw Score + if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score); + + // DRAW THE PLAYFIELD BORDER + u8g.drawFrame(BOARD_L - 2, BOARD_T - 2, BOARD_R - BOARD_L + 4, BOARD_B - BOARD_T + 4); + + // Draw the snake (tail) + #if SNAKE_WH < 2 + + // At this scale just draw a line + LOOP_L_N(n, sdat.head_ind) { + const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; + if (p.x == q.x) { + const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); + if (PAGE_CONTAINS(y1, y2)) + u8g.drawVLine(GAMEX(p.x), y1, y2 - y1 + 1); + } + else if (PAGE_CONTAINS(GAMEY(p.y), GAMEY(p.y))) { + const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x)); + u8g.drawHLine(x1, GAMEY(p.y), x2 - x1 + 1); + } + } + + #elif SNAKE_WH == 2 + + // At this scale draw two lines + LOOP_L_N(n, sdat.head_ind) { + const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; + if (p.x == q.x) { + const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); + if (PAGE_CONTAINS(y1, y2 + 1)) + u8g.drawFrame(GAMEX(p.x), y1, 2, y2 - y1 + 1 + 1); + } + else { + const int8_t py = GAMEY(p.y); + if (PAGE_CONTAINS(py, py + 1)) { + const int8_t x1 = GAMEX(_MIN(p.x, q.x)), x2 = GAMEX(_MAX(p.x, q.x)); + u8g.drawFrame(x1, py, x2 - x1 + 1 + 1, 2); + } + } + } + + #else + + // Draw a series of boxes + LOOP_L_N(n, sdat.head_ind) { + const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; + if (p.x == q.x) { + const int8_t y1 = _MIN(p.y, q.y), y2 = _MAX(p.y, q.y); + if (PAGE_CONTAINS(GAMEY(y1), GAMEY(y2) + SNAKE_SIZ - 1)) { + for (int8_t i = y1; i <= y2; ++i) { + const int8_t y = GAMEY(i); + if (PAGE_CONTAINS(y, y + SNAKE_SIZ - 1)) + u8g.drawBox(GAMEX(p.x), y, SNAKE_SIZ, SNAKE_SIZ); + } + } + } + else { + const int8_t py = GAMEY(p.y); + if (PAGE_CONTAINS(py, py + SNAKE_SIZ - 1)) { + const int8_t x1 = _MIN(p.x, q.x), x2 = _MAX(p.x, q.x); + for (int8_t i = x1; i <= x2; ++i) + u8g.drawBox(GAMEX(i), py, SNAKE_SIZ, SNAKE_SIZ); + } + } + } + + #endif + + // Draw food + const int8_t fy = GAMEY(sdat.foody); + if (PAGE_CONTAINS(fy, fy + FOOD_WH - 1)) { + const int8_t fx = GAMEX(sdat.foodx); + u8g.drawFrame(fx, fy, FOOD_WH, FOOD_WH); + if (FOOD_WH == 5) u8g.drawPixel(fx + 2, fy + 2); + } + + // Draw GAME OVER + if (!game_state) draw_game_over(); + + // A click always exits this game + if (ui.use_click()) exit_game(); +} + +void SnakeGame::enter_game() { + init_game(1, game_screen); // 1 = Game running + snake_reset(); + food_reset(); +} + +#endif // MARLIN_SNAKE diff --git a/Marlin/src/lcd/menu/game/snake.h b/Marlin/src/lcd/menu/game/snake.h new file mode 100644 index 00000000..09a3a722 --- /dev/null +++ b/Marlin/src/lcd/menu/game/snake.h @@ -0,0 +1,38 @@ +/** + * 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 "types.h" + +typedef struct { + int8_t snake_dir, // NESW + foodx, foody, + food_cnt, + old_encoder; + pos_t snake_tail[50]; + fixed_t snakex, snakey; + uint8_t head_ind; +} snake_data_t; + +class SnakeGame : MarlinGame { public: static void enter_game(), game_screen(); }; + +extern SnakeGame snake; diff --git a/Marlin/src/lcd/menu/game/types.h b/Marlin/src/lcd/menu/game/types.h new file mode 100644 index 00000000..f6e6c78a --- /dev/null +++ b/Marlin/src/lcd/menu/game/types.h @@ -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 . + * + */ +#pragma once + +#include + +typedef struct { int8_t x, y; } pos_t; + +// Simple 8:8 fixed-point +typedef int16_t fixed_t; +#define FTOP(F) fixed_t((F)*256.0f) +#define PTOF(P) (float(P)*(1.0f/256.0f)) +#define BTOF(X) (fixed_t(X)<<8) +#define FTOB(X) int8_t(fixed_t(X)>>8) + +class MarlinGame { +protected: + static int score; + static uint8_t game_state; + static millis_t next_frame; + + static bool game_frame(); + static void draw_game_over(); + static void exit_game(); +public: + static void init_game(const uint8_t init_state, const screenFunc_t screen); +}; diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp new file mode 100644 index 00000000..5d674103 --- /dev/null +++ b/Marlin/src/lcd/menu/menu.cpp @@ -0,0 +1,386 @@ +/** + * 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_LCD_MENU + +#include "menu.h" +#include "../../module/planner.h" +#include "../../module/motion.h" +#include "../../module/printcounter.h" +#include "../../gcode/queue.h" + +#if HAS_BUZZER + #include "../../libs/buzzer.h" +#endif + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../module/probe.h" +#endif + +#if EITHER(ENABLE_LEVELING_FADE_HEIGHT, AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +//////////////////////////////////////////// +///////////// Global Variables ///////////// +//////////////////////////////////////////// + +// Menu Navigation +int8_t encoderTopLine, encoderLine, screen_items; + +typedef struct { + screenFunc_t menu_function; + uint32_t encoder_position; + int8_t top_line, items; +} menuPosition; +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 +PGM_P MenuEditItemBase::editLabel; +void* MenuEditItemBase::editValue; +int32_t MenuEditItemBase::minEditValue, + MenuEditItemBase::maxEditValue; +screenFunc_t MenuEditItemBase::callbackFunc; +bool MenuEditItemBase::liveEdit; + +//////////////////////////////////////////// +//////// Menu Navigation & History ///////// +//////////////////////////////////////////// + +void MarlinUI::return_to_status() { goto_screen(status_screen); } + +void MarlinUI::save_previous_screen() { + if (screen_history_depth < COUNT(screen_history)) + screen_history[screen_history_depth++] = { currentScreen, encoderPosition, encoderTopLine, screen_items }; +} + +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_(HAS_TOUCH_XPT2046, on_edit_screen = false); + if (screen_history_depth > 0) { + menuPosition &sh = screen_history[--screen_history_depth]; + goto_screen(sh.menu_function, + is_back ? 0 : sh.encoder_position, + is_back ? 0 : sh.top_line, + sh.items + ); + } + else + return_to_status(); +} + +//////////////////////////////////////////// +/////////// Menu Editing Actions /////////// +//////////////////////////////////////////// + +/** + * Functions for editing single values + * + * The "DEFINE_MENU_EDIT_ITEM" macro generates the classes needed to edit a numerical value. + * + * The prerequisite is that in the header the type was already declared: + * + * DEFINE_MENU_EDIT_ITEM_TYPE(int3, int16_t, i16tostr3rj, 1) + * + * For example, DEFINE_MENU_EDIT_ITEM(int3) expands into: + * + * template class TMenuEditItem + * + * You can then use one of the menu macros to present the edit interface: + * EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999) + * + * This expands into a more primitive menu item: + * _MENU_ITEM_P(int3, false, GET_TEXT(MSG_SPEED), &feedrate_percentage, 10, 999) + * + * ...which calls: + * MenuItem_int3::action(plabel, &feedrate_percentage, 10, 999) + * MenuItem_int3::draw(encoderLine == _thisItemNr, _lcdLineNr, plabel, &feedrate_percentage, 10, 999) + */ +void MenuEditItemBase::edit_screen(strfunc_t strfunc, loadfunc_t loadfunc) { + 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()) + draw_edit_screen(strfunc(ui.encoderPosition + minEditValue)); + if (ui.lcd_clicked || (liveEdit && ui.should_draw())) { + if (editValue != nullptr) loadfunc(editValue, ui.encoderPosition + minEditValue); + if (callbackFunc && (liveEdit || ui.lcd_clicked)) (*callbackFunc)(); + if (ui.use_click()) ui.goto_previous_screen(); + } +} + +void MenuEditItemBase::goto_edit_screen( + PGM_P const el, // Edit label + void * const ev, // Edit value pointer + const int32_t minv, // Encoder minimum + const int32_t maxv, // Encoder maximum + const uint16_t ep, // Initial encoder value + const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit() + const screenFunc_t cb, // Callback after edit + const bool le // Flag to call cb() during editing +) { + TERN_(HAS_TOUCH_XPT2046, ui.on_edit_screen = true); + ui.screen_changed = true; + ui.save_previous_screen(); + ui.refresh(); + editLabel = el; + editValue = ev; + minEditValue = minv; + maxEditValue = maxv; + ui.encoderPosition = ep; + ui.currentScreen = cs; + callbackFunc = cb; + liveEdit = le; +} + +//////////////////////////////////////////// +///////////////// Menu Tree //////////////// +//////////////////////////////////////////// + +#include "../../MarlinCore.h" + +bool printer_busy() { + return planner.movesplanned() || printingIsActive(); +} + +/** + * General function to go directly to a screen + */ +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_(HAS_TOUCH_XPT2046, repeat_delay = BUTTON_DELAY_MENU); + + TERN_(LCD_SET_PROGRESS_MANUALLY, progress_reset()); + + #if BOTH(DOUBLECLICK_FOR_Z_BABYSTEPPING, BABYSTEPPING) + static millis_t doubleclick_expire_ms = 0; + // Going to menu_main from status screen? Remember first click time. + // Going back to status screen within a very short time? Go to Z babystepping. + if (screen == menu_main) { + if (on_status_screen()) + doubleclick_expire_ms = millis() + DOUBLECLICK_MAX_INTERVAL; + } + else if (screen == status_screen && currentScreen == menu_main && PENDING(millis(), doubleclick_expire_ms)) { + if ( (ENABLED(BABYSTEP_WITHOUT_HOMING) || all_axes_known()) + && (ENABLED(BABYSTEP_ALWAYS_AVAILABLE) || printer_busy()) ) + screen = TERN(BABYSTEP_ZPROBE_OFFSET, lcd_babystep_zoffset, lcd_babystep_z); + else { + #if ENABLED(MOVE_Z_WHEN_IDLE) + ui.manual_move.menu_scale = MOVE_Z_IDLE_MULTIPLICATOR; + screen = lcd_move_z; + #endif + } + } + #endif + + currentScreen = screen; + encoderPosition = encoder; + encoderTopLine = top; + screen_items = items; + if (on_status_screen()) { + defer_status_screen(false); + TERN_(AUTO_BED_LEVELING_UBL, ubl.lcd_map_control = false); + screen_history_depth = 0; + } + + clear_lcd(); + + // Re-initialize custom characters that may be re-used + #if HAS_MARLINUI_HD44780 + if (TERN1(AUTO_BED_LEVELING_UBL, !ubl.lcd_map_control)) + set_custom_characters(on_status_screen() ? CHARSET_INFO : CHARSET_MENU); + #endif + + refresh(LCDVIEW_CALL_REDRAW_NEXT); + screen_changed = true; + TERN_(HAS_MARLINUI_U8GLIB, drawing_screen = false); + + TERN_(HAS_LCD_MENU, encoder_direction_normal()); + + set_selection(false); + } +} + +//////////////////////////////////////////// +///////////// Manual Movement ////////////// +//////////////////////////////////////////// + +// +// Display a "synchronize" screen with a custom message until +// all moves are finished. Go back to calling screen when done. +// +void MarlinUI::synchronize(PGM_P const msg/*=nullptr*/) { + static PGM_P sync_message = msg ?: GET_TEXT(MSG_MOVING); + save_previous_screen(); + goto_screen([]{ + if (should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, sync_message); + }); + defer_status_screen(); + planner.synchronize(); // idle() is called until moves complete + goto_previous_screen_no_defer(); +} + +/** + * Scrolling for menus and other line-based screens + * + * encoderLine is the position based on the encoder + * 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 + * screen_items is the total number of items in the menu (after one call) + */ +void scroll_screen(const uint8_t limit, const bool is_menu) { + ui.encoder_direction_menus(); + ENCODER_RATE_MULTIPLY(false); + if (int32_t(ui.encoderPosition) < 0) ui.encoderPosition = 0; + if (ui.first_page) { + encoderLine = ui.encoderPosition / (ENCODER_STEPS_PER_MENU_ITEM); + ui.screen_changed = false; + } + if (screen_items > 0 && encoderLine >= screen_items - limit) { + encoderLine = _MAX(0, screen_items - limit); + ui.encoderPosition = encoderLine * (ENCODER_STEPS_PER_MENU_ITEM); + } + if (is_menu) { + NOMORE(encoderTopLine, encoderLine); + if (encoderLine >= encoderTopLine + LCD_HEIGHT) + encoderTopLine = encoderLine - LCD_HEIGHT + 1; + } + else + encoderTopLine = encoderLine; +} + +#if HAS_BUZZER + void MarlinUI::completion_feedback(const bool good/*=true*/) { + if (good) { + BUZZ(100, 659); + BUZZ(100, 698); + } + else BUZZ(20, 440); + } +#endif + +#if HAS_LINE_TO_Z + + void line_to_z(const float &z) { + current_position.z = z; + line_to_current_position(manual_feedrate_mm_s.z); + } + +#endif + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + + #include "../../feature/babystep.h" + + void lcd_babystep_zoffset() { + if (ui.use_click()) return ui.goto_previous_screen_no_defer(); + 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_SIZE_Z); + ui.encoderPosition = 0; + + const float diff = planner.steps_to_mm[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + diff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - diff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + + babystep.add_steps(Z_AXIS, babystep_increment); + + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + } + } + if (ui.should_draw()) { + if (do_probe) { + MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_ZPROBE_ZOFFSET), BABYSTEP_TO_STR(probe.offset.z)); + TERN_(BABYSTEP_ZPROBE_GFX_OVERLAY, _lcd_zoffset_overlay_gfx(probe.offset.z)); + } + else { + #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET) + MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_HOTEND_OFFSET_Z), ftostr54sign(hotend_offset[active_extruder].z)); + #endif + } + } + } + +#endif // BABYSTEP_ZPROBE_OFFSET + +void _lcd_draw_homing() { + if (ui.should_draw()) { + constexpr uint8_t line = (LCD_HEIGHT - 1) / 2; + MenuItem_static::draw(line, GET_TEXT(MSG_LEVEL_BED_HOMING)); + } +} + +#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) + #include "../../feature/bedlevel/bedlevel.h" + void _lcd_toggle_bed_leveling() { set_bed_leveling_enabled(!planner.leveling_active); } +#endif + +// +// Selection screen presents a prompt and two options +// +bool MarlinUI::selection; // = false +bool MarlinUI::update_selection() { + encoder_direction_select(); + if (encoderPosition) { + selection = int16_t(encoderPosition) > 0; + encoderPosition = 0; + } + return selection; +} + +void MenuItem_confirm::select_screen( + PGM_P const yes, PGM_P const no, + selectFunc_t yesFunc, selectFunc_t noFunc, + PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/ +) { + 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) { + selectFunc_t callFunc = ui_selection ? yesFunc : noFunc; + if (callFunc) callFunc(); else ui.goto_previous_screen(); + } + ui.defer_status_screen(); + } +} + +#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h new file mode 100644 index 00000000..89970225 --- /dev/null +++ b/Marlin/src/lcd/menu/menu.h @@ -0,0 +1,251 @@ +/** + * 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 "../ultralcd.h" +#include "../../libs/numtostr.h" +#include "../../inc/MarlinConfig.h" + +#include "limits.h" + +extern int8_t encoderLine, encoderTopLine, screen_items; + +void scroll_screen(const uint8_t limit, const bool is_menu); +bool printer_busy(); + +typedef void (*selectFunc_t)(); + +#define SS_LEFT 0x00 +#define SS_CENTER 0x01 +#define SS_INVERT 0x02 +#define SS_DEFAULT SS_CENTER + +#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + void _lcd_zoffset_overlay_gfx(const float zvalue); +#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) + #define BABYSTEP_TO_STR(N) ftostr53sign(N) +#endif + +//////////////////////////////////////////// +///////////// Base Menu Items ////////////// +//////////////////////////////////////////// + +class MenuItemBase { + public: + // 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=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); + + // Draw an item either selected ('>') or not (space) with post_char + FORCE_INLINE static void _draw(const bool sel, const uint8_t row, PGM_P const pstr, const char post_char) { + _draw(sel, row, pstr, '>', post_char); + } +}; + +// 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); +}; + +// 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 { + 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]); + } + // Implemented for HD44780 and DOGM + // Draw the prompt, buttons, and state + static void draw_select_screen( + PGM_P const yes, // Right option label + PGM_P const no, // Left option label + const bool yesno, // Is "yes" selected? + PGM_P const pref, // Prompt prefix + const char * const string, // Prompt runtime string + PGM_P const suff // Prompt suffix + ); + static void select_screen( + PGM_P const yes, PGM_P const no, + selectFunc_t yesFunc, selectFunc_t noFunc, + PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr + ); + static inline void select_screen( + PGM_P const yes, PGM_P const no, + selectFunc_t yesFunc, selectFunc_t noFunc, + PGM_P const pref, const progmem_str string, PGM_P const suff=nullptr + ) { + char str[strlen_P((PGM_P)string) + 1]; + strcpy_P(str, (PGM_P)string); + select_screen(yes, no, yesFunc, noFunc, pref, str, suff); + } + // Shortcut for prompt with "NO"/ "YES" labels + FORCE_INLINE static void confirm_screen(selectFunc_t yesFunc, selectFunc_t noFunc, PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr) { + select_screen(GET_TEXT(MSG_YES), GET_TEXT(MSG_NO), yesFunc, noFunc, pref, string, suff); + } +}; + +//////////////////////////////////////////// +///////////// Edit Menu Items ////////////// +//////////////////////////////////////////// + +// The Menu Edit shadow value +typedef union { + bool state; + float decimal; + int8_t int8; + int16_t int16; + int32_t int32; + uint8_t uint8; + uint16_t uint16; + uint32_t uint32; +} chimera_t; +extern chimera_t editable; + +// Base class for Menu Edit Items +class MenuEditItemBase : public MenuItemBase { + private: + // These values are statically constructed by init() via action() + // The action() method acts like the instantiator. The entire lifespan + // of a menu item is within its declaration, so all these values decompose + // into behavior and unused items get optimized out. + static PGM_P editLabel; + static void *editValue; + static int32_t minEditValue, maxEditValue; // Encoder value range + static screenFunc_t callbackFunc; + static bool liveEdit; + protected: + typedef const char* (*strfunc_t)(const int32_t); + typedef void (*loadfunc_t)(void *, const int32_t); + static void goto_edit_screen( + PGM_P const el, // Edit label + void * const ev, // Edit value pointer + const int32_t minv, // Encoder minimum + const int32_t maxv, // Encoder maximum + const uint16_t ep, // Initial encoder value + const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit() + const screenFunc_t cb, // Callback after edit + const bool le // Flag to call cb() during editing + ); + static void edit_screen(strfunc_t, loadfunc_t); // Edit value handler + 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 inStr, const bool pgm=false); + + // Implemented for HD44780 and DOGM + // This low-level method is good to draw from anywhere + static void draw_edit_screen(PGM_P const pstr, const char* const value); + + // This method is for the current menu item + static inline void draw_edit_screen(const char* const value) { draw_edit_screen(editLabel, value); } +}; + +#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 Screens /////////////// +//////////////////////////////////////////// + +void menu_main(); +void menu_move(); + +#if ENABLED(SDSUPPORT) + void menu_media(); +#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) + +#if HAS_LINE_TO_Z + void line_to_z(const float &z); +#endif + +#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + void _lcd_zoffset_overlay_gfx(const float zvalue); +#endif + +#if ENABLED(PROBE_OFFSET_WIZARD) + void goto_probe_offset_wizard(); +#endif + +#if ENABLED(LCD_BED_LEVELING) || (HAS_LEVELING && DISABLED(SLIM_LCD_MENUS)) + void _lcd_toggle_bed_leveling(); +#endif + +#if ENABLED(BABYSTEPPING) + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + void lcd_babystep_zoffset(); + #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(TOUCH_SCREEN_CALIBRATION) + void touch_screen_calibration(); +#endif diff --git a/Marlin/src/lcd/menu/menu_addon.h b/Marlin/src/lcd/menu/menu_addon.h new file mode 100644 index 00000000..73e7061b --- /dev/null +++ b/Marlin/src/lcd/menu/menu_addon.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 + +#include "../lcdprint.h" + +#define _MENU_ITEM_ADDON_START(N,X) do{ \ + if (ui.should_draw() && _menuLineNr == _thisItemNr - 1) { \ + 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_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp new file mode 100644 index 00000000..642d9d84 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -0,0 +1,630 @@ +/** + * 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 HAS_LCD_MENU + +#include "menu_item.h" +#include "../../module/planner.h" + +#if DISABLED(NO_VOLUMETRICS) + #include "../../gcode/parser.h" +#endif + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#if ENABLED(PIDTEMP) + #include "../../module/temperature.h" +#endif + +#if HAS_FILAMENT_RUNOUT_DISTANCE + #include "../../feature/runout.h" +#endif + +#if ENABLED(SD_FIRMWARE_UPDATE) + #include "../../module/settings.h" +#endif + +#if ENABLED(PASSWORD_FEATURE) + #include "../../feature/password/password.h" +#endif + +void menu_tmc(); +void menu_backlash(); + +#if ENABLED(HAS_MOTOR_CURRENT_DAC) + + #include "../../feature/dac/stepper_dac.h" + + void menu_dac() { + static xyze_uint8_t driverPercent; + LOOP_XYZE(i) driverPercent[i] = stepper_dac.get_current_percent((AxisEnum)i); + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ stepper_dac.set_current_percents(driverPercent); }) + EDIT_DAC_PERCENT(X); + EDIT_DAC_PERCENT(Y); + EDIT_DAC_PERCENT(Z); + EDIT_DAC_PERCENT(E); + ACTION_ITEM(MSG_DAC_EEPROM_WRITE, dac_commit_eeprom); + END_MENU(); + } + +#endif + +#if HAS_MOTOR_CURRENT_PWM + + #include "../../module/stepper.h" + + void menu_pwm() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + #define EDIT_CURRENT_PWM(LABEL,I) EDIT_ITEM_P(long5, PSTR(LABEL), &stepper.motor_current_setting[I], 100, 2000, stepper.refresh_motor_power) + #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) + EDIT_CURRENT_PWM(STR_X STR_Y, 0); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + EDIT_CURRENT_PWM(STR_Z, 1); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + EDIT_CURRENT_PWM(STR_E, 2); + #endif + END_MENU(); + } + +#endif + +#if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + // + // Advanced Settings > Filament + // + void menu_advanced_filament() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + + #if ENABLED(LIN_ADVANCE) + #if EXTRUDERS == 1 + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + #elif HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); + #endif + #endif + + #if DISABLED(NO_VOLUMETRICS) + EDIT_ITEM(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers); + + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + EDIT_ITEM_FAST(float42_52, MSG_VOLUMETRIC_LIMIT, &planner.volumetric_extruder_limit[active_extruder], 0.0f, 20.0f, planner.calculate_volumetric_extruder_limits); + #if HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_FAST_N(float42_52, n, MSG_VOLUMETRIC_LIMIT_E, &planner.volumetric_extruder_limit[n], 0.0f, 20.00f, planner.calculate_volumetric_extruder_limits); + #endif + #endif + + if (parser.volumetric_enabled) { + EDIT_ITEM_FAST(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #if HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_FAST_N(float43, n, MSG_FILAMENT_DIAM_E, &planner.filament_size[n], 1.5f, 3.25f, planner.calculate_volumetric_multipliers); + #endif + } + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + constexpr float extrude_maxlength = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 999); + + EDIT_ITEM_FAST(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength); + #if HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTUNLOAD_E, &fc_settings[n].unload_length, 0, extrude_maxlength); + #endif + + EDIT_ITEM_FAST(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength); + #if HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_FAST_N(float3, n, MSG_FILAMENTLOAD_E, &fc_settings[n].load_length, 0, extrude_maxlength); + #endif + #endif + + #if HAS_FILAMENT_RUNOUT_DISTANCE + editable.decimal = runout.runout_distance(); + 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 + + END_MENU(); + } + +#endif // !NO_VOLUMETRICS || ADVANCED_PAUSE_FEATURE + +// +// Advanced Settings > Temperature helpers +// + +#if ENABLED(PID_AUTOTUNE_MENU) + + #if ENABLED(PIDTEMP) + int16_t autotune_temp[HOTENDS] = ARRAY_BY_HOTENDS1(PREHEAT_1_TEMP_HOTEND); + #endif + #if ENABLED(PIDTEMPBED) + int16_t autotune_temp_bed = PREHEAT_1_TEMP_BED; + #endif + + #include "../../gcode/queue.h" + + void _lcd_autotune(const int16_t e) { + char cmd[30]; + sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), e, + #if HAS_PID_FOR_BOTH + e < 0 ? autotune_temp_bed : autotune_temp[e] + #else + TERN(PIDTEMPBED, autotune_temp_bed, autotune_temp[e]) + #endif + ); + queue.inject(cmd); + ui.return_to_status(); + } + +#endif // PID_AUTOTUNE_MENU + +#if ENABLED(PID_EDIT_MENU) + + float raw_Ki, raw_Kd; // place-holders for Ki and Kd edits + + // 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) { + 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) { + TERN(PID_PARAMS_PER_HOTEND,,UNUSED(e)); + PID_PARAM(Kd, e) = scalePID_d(raw_Kd); + thermalManager.updatePID(); + } + + #define _DEFINE_PIDTEMP_BASE_FUNCS(N) \ + void copy_and_scalePID_i_E##N() { copy_and_scalePID_i(N); } \ + void copy_and_scalePID_d_E##N() { copy_and_scalePID_d(N); } + +#else + + #define _DEFINE_PIDTEMP_BASE_FUNCS(N) // + +#endif + +#if ENABLED(PID_AUTOTUNE_MENU) + #define DEFINE_PIDTEMP_FUNCS(N) \ + _DEFINE_PIDTEMP_BASE_FUNCS(N); \ + void lcd_autotune_callback_E##N() { _lcd_autotune(N); } +#else + #define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N); +#endif + +#if HAS_HOTEND + DEFINE_PIDTEMP_FUNCS(0); + #if ENABLED(PID_PARAMS_PER_HOTEND) + REPEAT_S(1, HOTENDS, DEFINE_PIDTEMP_FUNCS) + #endif +#endif + +#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || EITHER(PID_AUTOTUNE_MENU, PID_EDIT_MENU) + #define SHOW_MENU_ADVANCED_TEMPERATURE 1 +#endif + +// +// Advanced Settings > Temperature +// +#if SHOW_MENU_ADVANCED_TEMPERATURE + + void menu_advanced_temperature() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + // + // Autotemp, Min, Max, Fact + // + #if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) + EDIT_ITEM(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); + EDIT_ITEM(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); + EDIT_ITEM(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); + EDIT_ITEM(float42_52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); + #endif + + // + // PID-P, PID-I, PID-D, PID-C, PID Autotune + // PID-P E1, PID-I E1, PID-D E1, PID-C E1, PID Autotune E1 + // PID-P E2, PID-I E2, PID-D E2, PID-C E2, PID Autotune E2 + // PID-P E3, PID-I E3, PID-D E3, PID-C E3, PID Autotune E3 + // PID-P E4, PID-I E4, PID-D E4, PID-C E4, PID Autotune E4 + // PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5 + // + + #if ENABLED(PID_EDIT_MENU) + #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_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) \ + __PID_BASE_MENU_ITEMS(N); \ + EDIT_ITEM_N(float3, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990) + #else + #define _PID_BASE_MENU_ITEMS(N) __PID_BASE_MENU_ITEMS(N) + #endif + + #if ENABLED(PID_FAN_SCALING) + #define _PID_EDIT_MENU_ITEMS(N) \ + _PID_BASE_MENU_ITEMS(N); \ + EDIT_ITEM_N(float3, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990) + #else + #define _PID_EDIT_MENU_ITEMS(N) _PID_BASE_MENU_ITEMS(N) + #endif + + #else + + #define _PID_EDIT_MENU_ITEMS(N) NOOP + + #endif + + #if ENABLED(PID_AUTOTUNE_MENU) + #define PID_EDIT_MENU_ITEMS(N) \ + _PID_EDIT_MENU_ITEMS(N); \ + EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(MenuItemBase::itemIndex); }); + #else + #define PID_EDIT_MENU_ITEMS(N) _PID_EDIT_MENU_ITEMS(N); + #endif + + PID_EDIT_MENU_ITEMS(0); + #if ENABLED(PID_PARAMS_PER_HOTEND) + REPEAT_S(1, HOTENDS, PID_EDIT_MENU_ITEMS) + #endif + + #if ENABLED(PIDTEMPBED) + #if ENABLED(PID_EDIT_MENU) + #define PID_BED_MENU_SECTION + __PID_BASE_MENU_ITEMS(-1); + #undef PID_BED_MENU_SECTION + #endif + #if ENABLED(PID_AUTOTUNE_MENU) + 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 + + END_MENU(); + } + +#endif // SHOW_MENU_ADVANCED_TEMPERATURE + +#if DISABLED(SLIM_LCD_MENUS) + + #if ENABLED(DISTINCT_E_FACTORS) + inline void _reset_e_acceleration_rate(const uint8_t e) { if (e == active_extruder) planner.reset_acceleration_rates(); } + inline void _planner_refresh_e_positioning(const uint8_t e) { + if (e == active_extruder) + planner.refresh_positioning(); + else + planner.steps_to_mm[E_AXIS_N(e)] = 1.0f / planner.settings.axis_steps_per_mm[E_AXIS_N(e)]; + } + #endif + + // M203 / M205 Velocity options + void menu_advanced_velocity() { + // M203 Max Feedrate + constexpr xyze_feedrate_t max_fr_edit = + #ifdef MAX_FEEDRATE_EDIT_VALUES + MAX_FEEDRATE_EDIT_VALUES + #elif ENABLED(LIMITED_MAX_FR_EDITING) + DEFAULT_MAX_FEEDRATE + #else + { 999, 999, 999, 999 } + #endif + ; + #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES) + const xyze_feedrate_t max_fr_edit_scaled = max_fr_edit * 2; + #else + const xyze_feedrate_t &max_fr_edit_scaled = max_fr_edit; + #endif + + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + + #define EDIT_VMAX(N) EDIT_ITEM_FAST(float3, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)]) + EDIT_VMAX(A); + EDIT_VMAX(B); + EDIT_VMAX(C); + + #if E_STEPPERS + EDIT_ITEM_FAST(float3, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); + #endif + #if ENABLED(DISTINCT_E_FACTORS) + LOOP_L_N(n, E_STEPPERS) + EDIT_ITEM_FAST_N(float3, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e); + #endif + + // M205 S Min Feedrate + EDIT_ITEM_FAST(float3, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 999); + + // M205 T Min Travel Feedrate + EDIT_ITEM_FAST(float3, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 999); + + END_MENU(); + } + + // M201 / M204 Accelerations + void menu_advanced_acceleration() { + const float max_accel = _MAX(planner.settings.max_acceleration_mm_per_s2[A_AXIS], planner.settings.max_acceleration_mm_per_s2[B_AXIS], planner.settings.max_acceleration_mm_per_s2[C_AXIS]); + + // M201 settings + constexpr xyze_ulong_t max_accel_edit = + #ifdef MAX_ACCEL_EDIT_VALUES + MAX_ACCEL_EDIT_VALUES + #elif ENABLED(LIMITED_MAX_ACCEL_EDITING) + DEFAULT_MAX_ACCELERATION + #else + { 99000, 99000, 99000, 99000 } + #endif + ; + #if ENABLED(LIMITED_MAX_ACCEL_EDITING) && !defined(MAX_ACCEL_EDIT_VALUES) + const xyze_ulong_t max_accel_edit_scaled = max_accel_edit * 2; + #else + const xyze_ulong_t &max_accel_edit_scaled = max_accel_edit; + #endif + + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + + // M204 P Acceleration + EDIT_ITEM_FAST(float5_25, MSG_ACC, &planner.settings.acceleration, 25, max_accel); + + // M204 R Retract Acceleration + EDIT_ITEM_FAST(float5, MSG_A_RETRACT, &planner.settings.retract_acceleration, 100, planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)]); + + // M204 T Travel Acceleration + EDIT_ITEM_FAST(float5_25, MSG_A_TRAVEL, &planner.settings.travel_acceleration, 25, max_accel); + + #define EDIT_AMAX(Q,L) EDIT_ITEM_FAST(long5_25, MSG_AMAX_##Q, &planner.settings.max_acceleration_mm_per_s2[_AXIS(Q)], L, max_accel_edit_scaled[_AXIS(Q)], []{ planner.reset_acceleration_rates(); }) + EDIT_AMAX(A, 100); + EDIT_AMAX(B, 100); + EDIT_AMAX(C, 10); + + #if ENABLED(DISTINCT_E_FACTORS) + EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); }); + LOOP_L_N(n, E_STEPPERS) + EDIT_ITEM_FAST_N(long5_25, n, MSG_AMAX_EN, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(n)], 100, max_accel_edit_scaled.e, []{ _reset_e_acceleration_rate(MenuItemBase::itemIndex); }); + #elif E_STEPPERS + EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, max_accel_edit_scaled.e, []{ planner.reset_acceleration_rates(); }); + #endif + + #ifdef XY_FREQUENCY_LIMIT + EDIT_ITEM(int8, MSG_XY_FREQUENCY_LIMIT, &planner.xy_freq_limit_hz, 0, 100, planner.refresh_frequency_limit, true); + editable.uint8 = uint8_t(LROUND(planner.xy_freq_min_speed_factor * 255)); // percent to u8 + EDIT_ITEM(percent, MSG_XY_FREQUENCY_FEEDRATE, &editable.uint8, 3, 255, []{ planner.set_min_speed_factor_u8(editable.uint8); }, true); + #endif + + END_MENU(); + } + + #if HAS_CLASSIC_JERK + + 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 + + constexpr xyze_float_t max_jerk_edit = + #ifdef MAX_JERK_EDIT_VALUES + MAX_JERK_EDIT_VALUES + #elif ENABLED(LIMITED_JERK_EDITING) + { (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } + #else + { 990, 990, 990, 990 } + #endif + ; + #define EDIT_JERK(N) EDIT_ITEM_FAST(float3, MSG_V##N##_JERK, &planner.max_jerk[_AXIS(N)], 1, max_jerk_edit[_AXIS(N)]) + EDIT_JERK(A); + EDIT_JERK(B); + #if ENABLED(DELTA) + EDIT_JERK(C); + #else + EDIT_ITEM_FAST(float52sign, MSG_VC_JERK, &planner.max_jerk.c, 0.1f, max_jerk_edit.c); + #endif + #if HAS_CLASSIC_E_JERK + EDIT_ITEM_FAST(float52sign, MSG_VE_JERK, &planner.max_jerk.e, 0.1f, max_jerk_edit.e); + #endif + + END_MENU(); + } + + #endif + + // M851 - Z Probe Offsets + #if HAS_BED_PROBE + void menu_probe_offsets() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + #if HAS_PROBE_XY_OFFSET + 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); + + #if ENABLED(PROBE_OFFSET_WIZARD) + SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); + #endif + + END_MENU(); + } + #endif + +#endif // !SLIM_LCD_MENUS + +// M92 Steps-per-mm +void menu_advanced_steps_per_mm() { + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + + #define EDIT_QSTEPS(Q) EDIT_ITEM_FAST(float51, MSG_##Q##_STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, []{ planner.refresh_positioning(); }) + EDIT_QSTEPS(A); + EDIT_QSTEPS(B); + EDIT_QSTEPS(C); + + #if ENABLED(DISTINCT_E_FACTORS) + 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 + EDIT_ITEM_FAST(float51, MSG_E_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, []{ planner.refresh_positioning(); }); + #endif + + END_MENU(); +} + +void menu_advanced_settings() { + const bool is_busy = printer_busy(); + + #if ENABLED(SD_FIRMWARE_UPDATE) + bool sd_update_state = settings.sd_update_status(); + #endif + + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + + #if DISABLED(SLIM_LCD_MENUS) + + #if HAS_M206_COMMAND + // + // Set Home Offsets + // + ACTION_ITEM(MSG_SET_HOME_OFFSETS, []{ queue.inject_P(PSTR("M428")); ui.return_to_status(); }); + #endif + + // M203 / M205 - Feedrate items + SUBMENU(MSG_VELOCITY, menu_advanced_velocity); + + // M201 - Acceleration items + SUBMENU(MSG_ACCELERATION, menu_advanced_acceleration); + + #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 + if (!is_busy) SUBMENU(MSG_ZPROBE_OFFSETS, menu_probe_offsets); + #endif + + #endif // !SLIM_LCD_MENUS + + // M92 - Steps Per mm + if (!is_busy) + SUBMENU(MSG_STEPS_PER_MM, menu_advanced_steps_per_mm); + + #if ENABLED(BACKLASH_GCODE) + SUBMENU(MSG_BACKLASH, menu_backlash); + #endif + + #if ENABLED(HAS_MOTOR_CURRENT_DAC) + SUBMENU(MSG_DRIVE_STRENGTH, menu_dac); + #endif + #if HAS_MOTOR_CURRENT_PWM + SUBMENU(MSG_DRIVE_STRENGTH, menu_pwm); + #endif + + #if HAS_TRINAMIC_CONFIG + SUBMENU(MSG_TMC_DRIVERS, menu_tmc); + #endif + + #if SHOW_MENU_ADVANCED_TEMPERATURE + SUBMENU(MSG_TEMPERATURE, menu_advanced_temperature); + #endif + + #if DISABLED(NO_VOLUMETRICS) || ENABLED(ADVANCED_PAUSE_FEATURE) + SUBMENU(MSG_FILAMENT, menu_advanced_filament); + #elif ENABLED(LIN_ADVANCE) + #if EXTRUDERS == 1 + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + #elif HAS_MULTI_EXTRUDER + LOOP_L_N(n, E_STEPPERS) + EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); + #endif + #endif + + // M540 S - Abort on endstop hit when SD printing + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + EDIT_ITEM(bool, MSG_ENDSTOP_ABORT, &planner.abort_on_endstop_hit); + #endif + + #if ENABLED(SD_FIRMWARE_UPDATE) + EDIT_ITEM(bool, MSG_MEDIA_UPDATE, &sd_update_state, []{ + // + // Toggle the SD Firmware Update state in EEPROM + // + const bool new_state = !settings.sd_update_status(), + didset = settings.set_sd_update_status(new_state); + ui.completion_feedback(didset); + ui.return_to_status(); + if (new_state) LCD_MESSAGEPGM(MSG_RESET_PRINTER); else ui.reset_status(); + }); + #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, + ui.init_eeprom, nullptr, + GET_TEXT(MSG_INIT_EEPROM), (const char *)nullptr, PSTR("?") + ); + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp new file mode 100644 index 00000000..9d0b970a --- /dev/null +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -0,0 +1,53 @@ +/** + * 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 . + * + */ + +// +// Backlash Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, BACKLASH_GCODE) + +#include "menu_item.h" + +#include "../../feature/backlash.h" + +void menu_backlash() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &backlash.correction, all_off, all_on); + + #define EDIT_BACKLASH_DISTANCE(N) EDIT_ITEM_FAST(float43, MSG_BACKLASH_##N, &backlash.distance_mm[_AXIS(N)], 0.0f, 9.9f); + if (AXIS_CAN_CALIBRATE(A)) EDIT_BACKLASH_DISTANCE(A); + if (AXIS_CAN_CALIBRATE(B)) EDIT_BACKLASH_DISTANCE(B); + if (AXIS_CAN_CALIBRATE(C)) EDIT_BACKLASH_DISTANCE(C); + + #ifdef BACKLASH_SMOOTHING_MM + EDIT_ITEM_FAST(float43, MSG_BACKLASH_SMOOTHING, &backlash.smoothing_mm, 0.0f, 9.9f); + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU && BACKLASH_GCODE diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp new file mode 100644 index 00000000..16f9992c --- /dev/null +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -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 . + * + */ + +// +// Level Bed Corners menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, LEVEL_BED_CORNERS) + +#include "menu_item.h" +#include "../../module/motion.h" +#include "../../module/planner.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#ifndef LEVEL_CORNERS_Z_HOP + #define LEVEL_CORNERS_Z_HOP 4.0 +#endif + +#ifndef LEVEL_CORNERS_HEIGHT + #define LEVEL_CORNERS_HEIGHT 0.0 +#endif + +static_assert(LEVEL_CORNERS_Z_HOP >= 0, "LEVEL_CORNERS_Z_HOP must be >= 0. Please update your configuration."); + +#if HAS_LEVELING + static bool leveling_was_active = false; +#endif + +/** + * Level corners, starting in the front-left corner. + */ +static int8_t bed_corner; +static inline void _lcd_goto_next_corner() { + constexpr float lfrb[4] = LEVEL_CORNERS_INSET_LFRB; + constexpr xy_pos_t lf { (X_MIN_BED) + lfrb[0], (Y_MIN_BED) + lfrb[1] }, + rb { (X_MAX_BED) - lfrb[2], (Y_MAX_BED) - lfrb[3] }; + line_to_z(LEVEL_CORNERS_Z_HOP); + switch (bed_corner) { + case 0: current_position = lf; break; // copy xy + case 1: current_position.x = rb.x; break; + case 2: current_position.y = rb.y; break; + case 3: current_position.x = lf.x; break; + #if ENABLED(LEVEL_CENTER_TOO) + case 4: current_position.set(X_CENTER, Y_CENTER); break; + #endif + } + line_to_current_position(manual_feedrate_mm_s.x); + line_to_z(LEVEL_CORNERS_HEIGHT); + if (++bed_corner > 3 + ENABLED(LEVEL_CENTER_TOO)) bed_corner = 0; +} + +static inline void _lcd_level_bed_corners_homing() { + _lcd_draw_homing(); + if (all_axes_homed()) { + bed_corner = 0; + ui.goto_screen([]{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_NEXT), GET_TEXT(MSG_BUTTON_DONE) + , _lcd_goto_next_corner + , []{ + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + ui.goto_previous_screen_no_defer(); + } + , GET_TEXT(TERN(LEVEL_CENTER_TOO, MSG_LEVEL_BED_NEXT_POINT, MSG_NEXT_CORNER)) + , (const char*)nullptr, PSTR("?") + ); + }); + ui.set_selection(true); + _lcd_goto_next_corner(); + } +} + +void _lcd_level_bed_corners() { + ui.defer_status_screen(); + if (!all_axes_known()) { + set_all_unhomed(); + queue.inject_P(G28_STR); + } + + // Disable leveling so the planner won't mess with us + #if HAS_LEVELING + leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif + + ui.goto_screen(_lcd_level_bed_corners_homing); +} + +#endif // HAS_LCD_MENU && LEVEL_BED_CORNERS diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp new file mode 100644 index 00000000..e19b04cc --- /dev/null +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -0,0 +1,297 @@ +/** + * 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 . + * + */ + +// +// Bed Leveling Menus +// + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(LCD_BED_LEVELING) + +#include "menu_item.h" +#include "../../module/planner.h" +#include "../../feature/bedlevel/bedlevel.h" + +#if HAS_BED_PROBE && DISABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../module/probe.h" +#endif + +#if HAS_GRAPHICAL_TFT + #include "../tft/touch.h" + #include "../tft/tft.h" +#endif + +#if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) + + #include "../../module/motion.h" + #include "../../gcode/queue.h" + + // + // Motion > Level Bed handlers + // + + static uint8_t manual_probe_index; + + // LCD probed points are from defaults + constexpr uint8_t total_probe_points = TERN(AUTO_BED_LEVELING_3POINT, 3, GRID_MAX_POINTS); + + // + // Bed leveling is done. Wait for G29 to complete. + // A flag is used so that this can release control + // and allow the command queue to be processed. + // + // When G29 finishes the last move: + // - Raise Z to the "manual probe height" + // - Don't return until done. + // + // ** This blocks the command queue! ** + // + void _lcd_level_bed_done() { + if (!ui.wait_for_move) { + #if MANUAL_PROBE_HEIGHT > 0 && DISABLED(MESH_BED_LEVELING) + // Display "Done" screen and wait for moves to complete + line_to_z(MANUAL_PROBE_HEIGHT); + ui.synchronize(GET_TEXT(MSG_LEVEL_BED_DONE)); + #endif + ui.goto_previous_screen_no_defer(); + ui.completion_feedback(); + } + if (ui.should_draw()) MenuItem_static::draw(LCD_HEIGHT >= 4, GET_TEXT(MSG_LEVEL_BED_DONE)); + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + } + + void _lcd_level_goto_next_point(); + + // + // Step 7: Get the Z coordinate, click goes to the next point or exits + // + void _lcd_level_bed_get_z() { + + if (ui.use_click()) { + + // + // Save the current Z position and move + // + + // If done... + if (++manual_probe_index >= total_probe_points) { + // + // The last G29 records the point and enables bed leveling + // + ui.wait_for_move = true; + ui.goto_screen(_lcd_level_bed_done); + #if ENABLED(MESH_BED_LEVELING) + queue.inject_P(PSTR("G29 S2")); + #elif ENABLED(PROBE_MANUALLY) + queue.inject_P(PSTR("G29 V1")); + #endif + } + else + _lcd_level_goto_next_point(); + + return; + } + + // + // Encoder knob or keypad buttons adjust the Z position + // + if (ui.encoderPosition) { + const float z = current_position.z + float(int32_t(ui.encoderPosition)) * (MESH_EDIT_Z_STEP); + line_to_z(constrain(z, -(LCD_PROBE_Z_RANGE) * 0.5f, (LCD_PROBE_Z_RANGE) * 0.5f)); + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + ui.encoderPosition = 0; + } + + // + // Draw on first display, then only on Z change + // + if (ui.should_draw()) { + const float v = current_position.z; + MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001f : 0.0001f), '+')); + } + } + + // + // Step 6: Display "Next point: 1 / 9" while waiting for move to finish + // + void _lcd_level_bed_moving() { + if (ui.should_draw()) { + char msg[10]; + sprintf_P(msg, PSTR("%i / %u"), int(manual_probe_index + 1), total_probe_points); + MenuEditItemBase::draw_edit_screen(GET_TEXT(MSG_LEVEL_BED_NEXT_POINT), msg); + } + ui.refresh(LCDVIEW_CALL_NO_REDRAW); + if (!ui.wait_for_move) ui.goto_screen(_lcd_level_bed_get_z); + } + + // + // Step 5: Initiate a move to the next point + // + void _lcd_level_goto_next_point() { + ui.goto_screen(_lcd_level_bed_moving); + + // G29 Records Z, moves, and signals when it pauses + ui.wait_for_move = true; + #if ENABLED(MESH_BED_LEVELING) + queue.inject_P(manual_probe_index ? PSTR("G29 S2") : PSTR("G29 S1")); + #elif ENABLED(PROBE_MANUALLY) + queue.inject_P(PSTR("G29 V1")); + #endif + } + + // + // Step 4: Display "Click to Begin", wait for click + // Move to the first probe position + // + void _lcd_level_bed_homing_done() { + if (ui.should_draw()) { + MenuItem_static::draw(1, GET_TEXT(MSG_LEVEL_BED_WAITING)); + // Color UI needs a control to detect a touch + TERN_(HAS_GRAPHICAL_TFT, touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT)); + } + if (ui.use_click()) { + manual_probe_index = 0; + _lcd_level_goto_next_point(); + } + } + + // + // Step 3: Display "Homing XYZ" - Wait for homing to finish + // + void _lcd_level_bed_homing() { + _lcd_draw_homing(); + if (all_axes_homed()) ui.goto_screen(_lcd_level_bed_homing_done); + } + + #if ENABLED(PROBE_MANUALLY) + extern bool g29_in_progress; + #endif + + // + // Step 2: Continue Bed Leveling... + // + void _lcd_level_bed_continue() { + ui.defer_status_screen(); + set_all_unhomed(); + ui.goto_screen(_lcd_level_bed_homing); + queue.inject_P(G28_STR); + } + +#endif // PROBE_MANUALLY || MESH_BED_LEVELING + +#if ENABLED(MESH_EDIT_MENU) + + inline void refresh_planner() { + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); + } + + void menu_edit_mesh() { + static uint8_t xind, yind; // =0 + START_MENU(); + BACK_ITEM(MSG_BED_LEVELING); + EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, GRID_MAX_POINTS_X - 1); + EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, GRID_MAX_POINTS_Y - 1); + EDIT_ITEM_FAST(float43, MSG_MESH_EDIT_Z, &Z_VALUES(xind, yind), -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner); + END_MENU(); + } + +#endif // MESH_EDIT_MENU + +/** + * Step 1: Bed Level entry-point + * + * << Motion + * Auto Home (if homing needed) + * Leveling On/Off (if data exists, and homed) + * Fade Height: --- (Req: ENABLE_LEVELING_FADE_HEIGHT) + * Mesh Z Offset: --- (Req: MESH_BED_LEVELING) + * Z Probe Offset: --- (Req: HAS_BED_PROBE, Opt: BABYSTEP_ZPROBE_OFFSET) + * Level Bed > + * Level Corners > (if homed) + * Load Settings (Req: EEPROM_SETTINGS) + * Save Settings (Req: EEPROM_SETTINGS) + */ +void menu_bed_leveling() { + const bool is_homed = all_axes_known(), + is_valid = leveling_is_valid(); + + START_MENU(); + BACK_ITEM(MSG_MOTION); + + // Auto Home if not using manual probing + #if NONE(PROBE_MANUALLY, MESH_BED_LEVELING) + if (!is_homed) GCODES_ITEM(MSG_AUTO_HOME, G28_STR); + #endif + + // Level Bed + #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) + // Manual leveling uses a guided procedure + SUBMENU(MSG_LEVEL_BED, _lcd_level_bed_continue); + #else + // Automatic leveling can just run the G-code + GCODES_ITEM(MSG_LEVEL_BED, is_homed ? PSTR("G29") : PSTR("G28\nG29")); + #endif + + #if ENABLED(MESH_EDIT_MENU) + if (is_valid) SUBMENU(MSG_EDIT_MESH, menu_edit_mesh); + #endif + + // Homed and leveling is valid? Then leveling can be toggled. + if (is_homed && is_valid) { + bool show_state = planner.leveling_active; + EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling); + } + + // Z Fade Height + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + // Shadow for editing the fade height + editable.decimal = planner.z_fade_height; + EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); + #endif + + // + // Mesh Bed Leveling Z-Offset + // + #if ENABLED(MESH_BED_LEVELING) + EDIT_ITEM(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); + #endif + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + #elif HAS_BED_PROBE + EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + #endif + + #if ENABLED(LEVEL_BED_CORNERS) + SUBMENU(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + #endif + + #if ENABLED(EEPROM_SETTINGS) + ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); + ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); + #endif + END_MENU(); +} + +#endif // LCD_BED_LEVELING diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp new file mode 100644 index 00000000..a8ced057 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -0,0 +1,74 @@ +/** + * 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 . + * + */ + +// +// Cancel Object Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, CANCEL_OBJECTS) + +#include "menu_item.h" +#include "menu_addon.h" + +#include "../../feature/cancel_object.h" + +static void lcd_cancel_object_confirm() { + const int8_t v = MenuItemBase::itemIndex; + const char item_num[] = { + ' ', + char((v > 9) ? '0' + (v / 10) : ' '), + char('0' + (v % 10)), + '\0' + }; + MenuItem_confirm::confirm_screen( + []{ + cancelable.cancel_object(MenuItemBase::itemIndex); + ui.completion_feedback(); + ui.goto_previous_screen(); + }, + ui.goto_previous_screen, + GET_TEXT(MSG_CANCEL_OBJECT), item_num, PSTR("?") + ); +} + +void menu_cancelobject() { + const int8_t ao = cancelable.active_object; + + START_MENU(); + BACK_ITEM(MSG_MAIN); + + // Draw cancelable items in a loop + for (int8_t i = -1; i < cancelable.object_count; i++) { + if (i == ao) continue; // Active is drawn on -1 index + const int8_t j = i < 0 ? ao : i; // Active or index item + if (!cancelable.is_canceled(j)) { // Not canceled already? + SUBMENU_N(j, MSG_CANCEL_OBJECT_N, lcd_cancel_object_confirm); // Offer the option. + if (i < 0) SKIP_ITEM(); // Extra line after active + } + } + + END_MENU(); +} + +#endif // HAS_LCD_MENU && CANCEL_OBJECTS diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp new file mode 100644 index 00000000..22947ee5 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -0,0 +1,425 @@ +/** + * 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 . + * + */ + +// +// Configuration Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU + +#include "menu_item.h" + +#if HAS_FILAMENT_SENSOR + #include "../../feature/runout.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../feature/powerloss.h" +#endif + +#if HAS_BED_PROBE + #include "../../module/probe.h" + #if ENABLED(BLTOUCH) + #include "../../feature/bltouch.h" + #endif +#endif + +#define HAS_DEBUG_MENU ENABLED(LCD_PROGRESS_BAR_TEST) + +void menu_advanced_settings(); +#if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + void menu_delta_calibrate(); +#endif + +#if ENABLED(LCD_PROGRESS_BAR_TEST) + + #include "../lcdprint.h" + + static void progress_bar_test() { + static int8_t bar_percent = 0; + if (ui.use_click()) { + ui.goto_previous_screen(); + #if HAS_MARLINUI_HD44780 + ui.set_custom_characters(CHARSET_MENU); + #endif + return; + } + 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_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); + } + + void _progress_bar_test() { + ui.goto_screen(progress_bar_test); + #if HAS_MARLINUI_HD44780 + ui.set_custom_characters(CHARSET_INFO); + #endif + } + +#endif // LCD_PROGRESS_BAR_TEST + +#if HAS_DEBUG_MENU + + void menu_debug() { + START_MENU(); + + BACK_ITEM(MSG_CONFIGURATION); + + #if ENABLED(LCD_PROGRESS_BAR_TEST) + SUBMENU(MSG_PROGRESS_BAR_TEST, _progress_bar_test); + #endif + + END_MENU(); + } + +#endif + +#if HAS_MULTI_EXTRUDER + + #include "../../module/tool_change.h" + + void menu_tool_change() { + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500); + #if ENABLED(TOOLCHANGE_PARK) + EDIT_ITEM(bool, MSG_FILAMENT_PARK_ENABLED, &toolchange_settings.enable_park); + #endif + EDIT_ITEM(float3, MSG_FILAMENT_SWAP_LENGTH, &toolchange_settings.swap_length, 0, max_extrude); + EDIT_ITEM(float41sign, MSG_FILAMENT_SWAP_EXTRA, &toolchange_settings.extra_resume, -10, 10); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_RETRACT_SPEED, &toolchange_settings.retract_speed, 10, 5400); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_UNRETRACT_SPEED, &toolchange_settings.unretract_speed, 10, 5400); + EDIT_ITEM(float3, MSG_FILAMENT_PURGE_LENGTH, &toolchange_settings.extra_prime, 0, max_extrude); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_PRIME_SPEED, &toolchange_settings.prime_speed, 10, 5400); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_FAN_SPEED, &toolchange_settings.fan_speed, 0, 255); + EDIT_ITEM_FAST(int4, MSG_SINGLENOZZLE_FAN_TIME, &toolchange_settings.fan_time, 1, 30); + #endif + EDIT_ITEM(float3, MSG_TOOL_CHANGE_ZLIFT, &toolchange_settings.z_raise, 0, 10); + END_MENU(); + } + + #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + + #include "../../module/motion.h" // for active_extruder + + void menu_toolchange_migration() { + PGM_P const msg_migrate = GET_TEXT(MSG_TOOL_MIGRATION_SWAP); + + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + + // Auto mode ON/OFF + EDIT_ITEM(bool, MSG_TOOL_MIGRATION_AUTO, &migration.automode); + EDIT_ITEM(uint8, MSG_TOOL_MIGRATION_END, &migration.last, 0, EXTRUDERS - 1); + + // Migrate to a chosen extruder + LOOP_L_N(s, EXTRUDERS) { + if (s != active_extruder) { + ACTION_ITEM_N_P(s, msg_migrate, []{ + char cmd[12]; + sprintf_P(cmd, PSTR("M217 T%i"), int(MenuItemBase::itemIndex)); + queue.inject(cmd); + }); + } + } + END_MENU(); + } + #endif + +#endif + +#if HAS_HOTEND_OFFSET + #include "../../module/motion.h" + #include "../../gcode/queue.h" + + void menu_tool_offsets() { + + auto _recalc_offsets = []{ + if (active_extruder && all_axes_known()) { // For the 2nd extruder re-home so the next tool-change gets the new offsets. + queue.inject_P(G28_STR); // In future, we can babystep the 2nd extruder (if active), making homing unnecessary. + active_extruder = 0; + } + }; + + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + #if ENABLED(DUAL_X_CARRIAGE) + EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_X, &hotend_offset[1].x, float(X2_HOME_POS - 25), float(X2_HOME_POS + 25), _recalc_offsets); + #else + EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_X, &hotend_offset[1].x, -99.0, 99.0, _recalc_offsets); + #endif + EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_Y, &hotend_offset[1].y, -99.0, 99.0, _recalc_offsets); + EDIT_ITEM_FAST(float42_52, MSG_HOTEND_OFFSET_Z, &hotend_offset[1].z, Z_PROBE_LOW_POINT, 10.0, _recalc_offsets); + #if ENABLED(EEPROM_SETTINGS) + ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); + #endif + END_MENU(); + } +#endif + +#if ENABLED(DUAL_X_CARRIAGE) + + void menu_idex() { + const bool need_g28 = axes_should_home(_BV(Y_AXIS)|_BV(Z_AXIS)); + + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + + GCODES_ITEM(MSG_IDEX_MODE_AUTOPARK, PSTR("M605 S1\nG28 X\nG1 X100")); + GCODES_ITEM(MSG_IDEX_MODE_DUPLICATE, need_g28 + ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100") // If Y or Z is not homed, do a full G28 first + : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100") + ); + GCODES_ITEM(MSG_IDEX_MODE_MIRRORED_COPY, need_g28 + ? PSTR("M605 S1\nT0\nG28\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") // If Y or Z is not homed, do a full G28 first + : PSTR("M605 S1\nT0\nM605 S2 X200\nG28 X\nG1 X100\nM605 S3 X200") + ); + GCODES_ITEM(MSG_IDEX_MODE_FULL_CTRL, PSTR("M605 S0\nG28 X")); + END_MENU(); + } + +#endif + +#if ENABLED(BLTOUCH) + + #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) + void bltouch_report() { + SERIAL_ECHOLNPAIR("EEPROM Last BLTouch Mode - ", (int)bltouch.last_written_mode); + SERIAL_ECHOLNPGM("Configuration BLTouch Mode - " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD")); + char mess[21]; + strcpy_P(mess, PSTR("BLTouch Mode - ")); + strcpy_P(&mess[15], bltouch.last_written_mode ? PSTR("5V") : PSTR("OD")); + ui.set_status(mess); + ui.return_to_status(); + } + #endif + + void menu_bltouch() { + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + ACTION_ITEM(MSG_BLTOUCH_RESET, bltouch._reset); + ACTION_ITEM(MSG_BLTOUCH_SELFTEST, bltouch._selftest); + ACTION_ITEM(MSG_BLTOUCH_DEPLOY, bltouch._deploy); + 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, 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, 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(); + } + +#endif + +#if ENABLED(TOUCH_MI_PROBE) + + void menu_touchmi() { + ui.defer_status_screen(); + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + GCODES_ITEM(MSG_TOUCHMI_INIT, PSTR("M851 Z0\nG28\nG1 F200 Z0")); + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + GCODES_ITEM(MSG_TOUCHMI_SAVE, PSTR("M500\nG1 F200 Z10")); + GCODES_ITEM(MSG_TOUCHMI_ZTEST, PSTR("G28\nG1 F200 Z0")); + END_MENU(); + } + +#endif + +#if ENABLED(CONTROLLER_FAN_MENU) + + #include "../../feature/controllerfan.h" + + void menu_controller_fan() { + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_IDLE_SPEED, &controllerFan.settings.idle_speed, _MAX(1, CONTROLLERFAN_SPEED_MIN) - 1, 255); + EDIT_ITEM(bool, MSG_CONTROLLER_FAN_AUTO_ON, &controllerFan.settings.auto_mode); + if (controllerFan.settings.auto_mode) { + EDIT_ITEM_FAST(percent, MSG_CONTROLLER_FAN_SPEED, &controllerFan.settings.active_speed, _MAX(1, CONTROLLERFAN_SPEED_MIN) - 1, 255); + EDIT_ITEM(uint16_4, MSG_CONTROLLER_FAN_DURATION, &controllerFan.settings.duration, 0, 4800); + } + END_MENU(); + } + +#endif + +#if ENABLED(FWRETRACT) + + #include "../../feature/fwretract.h" + + void menu_config_retract() { + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + #if ENABLED(FWRETRACT_AUTORETRACT) + EDIT_ITEM(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract); + #endif + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100); + #if HAS_MULTI_EXTRUDER + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100); + #endif + EDIT_ITEM(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_ZHOP, &fwretract.settings.retract_zraise, 0, 999); + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_extra, -100, 100); + #if HAS_MULTI_EXTRUDER + EDIT_ITEM(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_extra, -100, 100); + #endif + EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999); + #if HAS_MULTI_EXTRUDER + EDIT_ITEM(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999); + #endif + END_MENU(); + } + +#endif + +#if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) + + 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(); + 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); + 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 + #if HAS_HEATED_BED + 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); + #endif + END_MENU(); + } + +#endif + +void menu_configuration() { + const bool busy = printer_busy(); + + START_MENU(); + BACK_ITEM(MSG_MAIN); + + // + // Debug Menu when certain options are enabled + // + #if HAS_DEBUG_MENU + SUBMENU(MSG_DEBUG_MENU, menu_debug); + #endif + + SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings); + + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + #elif HAS_BED_PROBE + EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); + #endif + + // + // Set Fan Controller speed + // + #if ENABLED(CONTROLLER_FAN_MENU) + SUBMENU(MSG_CONTROLLER_FAN, menu_controller_fan); + #endif + + if (!busy) { + #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + SUBMENU(MSG_DELTA_CALIBRATE, menu_delta_calibrate); + #endif + + #if HAS_HOTEND_OFFSET + SUBMENU(MSG_OFFSETS_MENU, menu_tool_offsets); + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + SUBMENU(MSG_IDEX_MENU, menu_idex); + #endif + + #if ENABLED(BLTOUCH) + SUBMENU(MSG_BLTOUCH, menu_bltouch); + #endif + + #if ENABLED(TOUCH_MI_PROBE) + SUBMENU(MSG_TOUCHMI_PROBE, menu_touchmi); + #endif + } + + // + // Set single nozzle filament retract and prime length + // + #if HAS_MULTI_EXTRUDER + SUBMENU(MSG_TOOL_CHANGE, menu_tool_change); + #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + SUBMENU(MSG_TOOL_MIGRATION, menu_toolchange_migration); + #endif + #endif + + #if HAS_LCD_CONTRAST + EDIT_ITEM(int3, MSG_CONTRAST, &ui.contrast, LCD_CONTRAST_MIN, LCD_CONTRAST_MAX, ui.refresh_contrast, true); + #endif + #if ENABLED(FWRETRACT) + SUBMENU(MSG_RETRACT, menu_config_retract); + #endif + + #if HAS_FILAMENT_SENSOR + EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + EDIT_ITEM(bool, MSG_OUTAGE_RECOVERY, &recovery.enabled, recovery.changed); + #endif + + // Preheat configurations + #if PREHEAT_COUNT && DISABLED(SLIM_LCD_MENUS) + 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) + ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); + if (!busy) ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); + #endif + + if (!busy) ACTION_ITEM(MSG_RESTORE_DEFAULTS, ui.reset_settings); + + END_MENU(); +} + +#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp new file mode 100644 index 00000000..7c54ec6e --- /dev/null +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -0,0 +1,129 @@ +/** + * 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 . + * + */ + +// +// Custom User Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, CUSTOM_USER_MENUS) + +#include "menu_item.h" +#include "../../gcode/queue.h" + +#ifdef USER_SCRIPT_DONE + #define _DONE_SCRIPT "\n" USER_SCRIPT_DONE +#else + #define _DONE_SCRIPT "" +#endif + +void _lcd_user_gcode(PGM_P const cmd) { + queue.inject_P(cmd); + TERN_(USER_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(USER_SCRIPT_RETURN, ui.return_to_status()); +} + +void menu_user() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + #define HAS_USER_ITEM(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) + #define USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); }); + #if HAS_USER_ITEM(1) + USER_ITEM(1); + #endif + #if HAS_USER_ITEM(2) + USER_ITEM(2); + #endif + #if HAS_USER_ITEM(3) + USER_ITEM(3); + #endif + #if HAS_USER_ITEM(4) + USER_ITEM(4); + #endif + #if HAS_USER_ITEM(5) + USER_ITEM(5); + #endif + #if HAS_USER_ITEM(6) + USER_ITEM(6); + #endif + #if HAS_USER_ITEM(7) + USER_ITEM(7); + #endif + #if HAS_USER_ITEM(8) + USER_ITEM(8); + #endif + #if HAS_USER_ITEM(9) + USER_ITEM(9); + #endif + #if HAS_USER_ITEM(10) + USER_ITEM(10); + #endif + #if HAS_USER_ITEM(11) + USER_ITEM(11); + #endif + #if HAS_USER_ITEM(12) + USER_ITEM(12); + #endif + #if HAS_USER_ITEM(13) + USER_ITEM(13); + #endif + #if HAS_USER_ITEM(14) + USER_ITEM(14); + #endif + #if HAS_USER_ITEM(15) + USER_ITEM(15); + #endif + #if HAS_USER_ITEM(16) + USER_ITEM(16); + #endif + #if HAS_USER_ITEM(17) + USER_ITEM(17); + #endif + #if HAS_USER_ITEM(18) + USER_ITEM(18); + #endif + #if HAS_USER_ITEM(19) + USER_ITEM(19); + #endif + #if HAS_USER_ITEM(20) + USER_ITEM(20); + #endif + #if HAS_USER_ITEM(21) + USER_ITEM(21); + #endif + #if HAS_USER_ITEM(22) + USER_ITEM(22); + #endif + #if HAS_USER_ITEM(23) + USER_ITEM(23); + #endif + #if HAS_USER_ITEM(24) + USER_ITEM(24); + #endif + #if HAS_USER_ITEM(25) + USER_ITEM(25); + #endif + END_MENU(); +} + +#endif // HAS_LCD_MENU && CUSTOM_USER_MENUS diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp new file mode 100644 index 00000000..4efcb7c8 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -0,0 +1,149 @@ +/** + * 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 . + * + */ + +// +// Delta Calibrate Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU && EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + +#include "menu_item.h" +#include "../../module/delta.h" +#include "../../module/motion.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../../lcd/extui/ui_api.h" +#endif + +void _man_probe_pt(const xy_pos_t &xy) { + if (!ui.wait_for_move) { + ui.wait_for_move = true; + do_blocking_move_to_xy_z(xy, Z_CLEARANCE_BETWEEN_PROBES); + ui.wait_for_move = false; + ui.synchronize(); + 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); + } +} + +#if ENABLED(DELTA_AUTO_CALIBRATION) + + #include "../../gcode/gcode.h" + + #if ENABLED(HOST_PROMPT_SUPPORT) + #include "../../feature/host_actions.h" // for host_prompt_do + #endif + + float lcd_probe_pt(const xy_pos_t &xy) { + _man_probe_pt(xy); + ui.defer_status_screen(); + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Delta Calibration in progress"), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Delta Calibration in progress"))); + wait_for_user_response(); + ui.goto_previous_screen_no_defer(); + return current_position.z; + } + +#endif + +#if ENABLED(DELTA_CALIBRATION_MENU) + + #include "../../gcode/queue.h" + + void _lcd_calibrate_homing() { + _lcd_draw_homing(); + if (all_axes_homed()) ui.goto_previous_screen(); + } + + void _lcd_delta_calibrate_home() { + queue.inject_P(G28_STR); + ui.goto_screen(_lcd_calibrate_homing); + } + + void _goto_tower_a(const float &a) { + xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) }; + _man_probe_pt(tower_vec * delta_calibration_radius()); + } + void _goto_tower_x() { _goto_tower_a(210); } + void _goto_tower_y() { _goto_tower_a(330); } + void _goto_tower_z() { _goto_tower_a( 90); } + void _goto_center() { xy_pos_t ctr{0}; _man_probe_pt(ctr); } + +#endif + +void lcd_delta_settings() { + auto _recalc_delta_settings = []{ + TERN_(HAS_LEVELING, reset_bed_level()); // After changing kinematics bed-level data is no longer valid + recalc_delta_settings(); + }; + START_MENU(); + BACK_ITEM(MSG_DELTA_CALIBRATE); + EDIT_ITEM(float52sign, MSG_DELTA_HEIGHT, &delta_height, delta_height - 10, delta_height + 10, _recalc_delta_settings); + #define EDIT_ENDSTOP_ADJ(LABEL,N) EDIT_ITEM_P(float43, PSTR(LABEL), &delta_endstop_adj.N, -5, 5, _recalc_delta_settings) + EDIT_ENDSTOP_ADJ("Ex", a); + EDIT_ENDSTOP_ADJ("Ey", b); + EDIT_ENDSTOP_ADJ("Ez", c); + EDIT_ITEM(float52sign, MSG_DELTA_RADIUS, &delta_radius, delta_radius - 5, delta_radius + 5, _recalc_delta_settings); + #define EDIT_ANGLE_TRIM(LABEL,N) EDIT_ITEM_P(float43, PSTR(LABEL), &delta_tower_angle_trim.N, -5, 5, _recalc_delta_settings) + EDIT_ANGLE_TRIM("Tx", a); + EDIT_ANGLE_TRIM("Ty", b); + EDIT_ANGLE_TRIM("Tz", c); + EDIT_ITEM(float52sign, MSG_DELTA_DIAG_ROD, &delta_diagonal_rod, delta_diagonal_rod - 5, delta_diagonal_rod + 5, _recalc_delta_settings); + END_MENU(); +} + +void menu_delta_calibrate() { + TERN_(DELTA_CALIBRATION_MENU, const bool all_homed = all_axes_homed()); // Acquire ahead of loop + + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #if ENABLED(DELTA_AUTO_CALIBRATION) + GCODES_ITEM(MSG_DELTA_AUTO_CALIBRATE, PSTR("G33")); + #if ENABLED(EEPROM_SETTINGS) + ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); + ACTION_ITEM(MSG_LOAD_EEPROM, ui.load_settings); + #endif + #endif + + SUBMENU(MSG_DELTA_SETTINGS, lcd_delta_settings); + + #if ENABLED(DELTA_CALIBRATION_MENU) + SUBMENU(MSG_AUTO_HOME, _lcd_delta_calibrate_home); + if (all_homed) { + SUBMENU(MSG_DELTA_CALIBRATE_X, _goto_tower_x); + SUBMENU(MSG_DELTA_CALIBRATE_Y, _goto_tower_y); + SUBMENU(MSG_DELTA_CALIBRATE_Z, _goto_tower_z); + SUBMENU(MSG_DELTA_CALIBRATE_CENTER, _goto_center); + } + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU && (DELTA_CALIBRATION_MENU || DELTA_AUTO_CALIBRATION) diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp new file mode 100644 index 00000000..d116a6a3 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -0,0 +1,332 @@ +/** + * 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 . + * + */ + +// +// Filament Change Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) + +#include "menu_item.h" +#include "../../module/temperature.h" +#include "../../feature/pause.h" +#include "../../gcode/queue.h" +#if HAS_FILAMENT_SENSOR + #include "../../feature/runout.h" +#endif + +// +// Change Filament > Change/Unload/Load Filament +// +static PauseMode _change_filament_mode; // = PAUSE_MODE_PAUSE_PRINT +static int8_t _change_filament_extruder; // = 0 + +inline PGM_P _change_filament_command() { + switch (_change_filament_mode) { + case PAUSE_MODE_LOAD_FILAMENT: return PSTR("M701 T%d"); + case PAUSE_MODE_UNLOAD_FILAMENT: return _change_filament_extruder >= 0 + ? PSTR("M702 T%d") : PSTR("M702 ;%d"); + case PAUSE_MODE_CHANGE_FILAMENT: + case PAUSE_MODE_PAUSE_PRINT: + default: break; + } + return PSTR("M600 B0 T%d"); +} + +// Initiate Filament Load/Unload/Change at the specified temperature +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 +// + +inline PGM_P change_filament_header(const PauseMode mode) { + switch (mode) { + case PAUSE_MODE_LOAD_FILAMENT: return GET_TEXT(MSG_FILAMENTLOAD); + case PAUSE_MODE_UNLOAD_FILAMENT: return GET_TEXT(MSG_FILAMENTUNLOAD); + default: break; + } + return GET_TEXT(MSG_FILAMENTCHANGE); +} + +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_DEFAULT|SS_INVERT); + BACK_ITEM(MSG_BACK); + #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(); +} + +/** + * "Change Filament" submenu + */ +#if E_STEPPERS > 1 || ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + + void menu_change_filament() { + // Say "filament change" when no print is active + editable.int8 = printingIsPaused() ? PAUSE_MODE_PAUSE_PRINT : PAUSE_MODE_CHANGE_FILAMENT; + + #if E_STEPPERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + bool too_cold = false; + for (uint8_t s = 0; !too_cold && s < E_STEPPERS; s++) + too_cold = thermalManager.targetTooColdToExtrude(s); + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + const bool is_busy = printer_busy(); + #endif + + START_MENU(); + BACK_ITEM(MSG_MAIN); + + // Change filament + #if E_STEPPERS == 1 + PGM_P const msg = GET_TEXT(MSG_FILAMENTCHANGE); + if (thermalManager.targetTooColdToExtrude(active_extruder)) + SUBMENU_P(msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); }); + else + GCODES_ITEM_P(msg, PSTR("M600 B0")); + #else + PGM_P const msg = GET_TEXT(MSG_FILAMENTCHANGE_E); + LOOP_L_N(s, E_STEPPERS) { + if (thermalManager.targetTooColdToExtrude(s)) + SUBMENU_N_P(s, msg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); }); + else { + ACTION_ITEM_N_P(s, msg, []{ + 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); + }); + } + } + #endif + + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + if (!is_busy) { + // Load filament + #if E_STEPPERS == 1 + PGM_P const msg_load = GET_TEXT(MSG_FILAMENTLOAD); + if (thermalManager.targetTooColdToExtrude(active_extruder)) + SUBMENU_P(msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, 0); }); + else + GCODES_ITEM_P(msg_load, PSTR("M701")); + #else + PGM_P const msg_load = GET_TEXT(MSG_FILAMENTLOAD_E); + LOOP_L_N(s, E_STEPPERS) { + if (thermalManager.targetTooColdToExtrude(s)) + SUBMENU_N_P(s, msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, MenuItemBase::itemIndex); }); + else { + ACTION_ITEM_N_P(s, msg_load, []{ + char cmd[12]; + sprintf_P(cmd, PSTR("M701 T%i"), int(MenuItemBase::itemIndex)); + queue.inject(cmd); + }); + } + } + #endif + + // Unload filament + #if E_STEPPERS == 1 + PGM_P const msg_unload = GET_TEXT(MSG_FILAMENTUNLOAD); + if (thermalManager.targetTooColdToExtrude(active_extruder)) + SUBMENU_P(msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, 0); }); + else + GCODES_ITEM_P(msg_unload, PSTR("M702")); + #else + #if ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) + if (too_cold) + SUBMENU(MSG_FILAMENTUNLOAD_ALL, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, -1); }); + else + GCODES_ITEM(MSG_FILAMENTUNLOAD_ALL, PSTR("M702")); + #endif + PGM_P const msg_unload = GET_TEXT(MSG_FILAMENTUNLOAD_E); + LOOP_L_N(s, E_STEPPERS) { + if (thermalManager.targetTooColdToExtrude(s)) + SUBMENU_N_P(s, msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, MenuItemBase::itemIndex); }); + else { + ACTION_ITEM_N_P(s, msg_unload, []{ + char cmd[12]; + sprintf_P(cmd, PSTR("M702 T%i"), int(MenuItemBase::itemIndex)); + queue.inject(cmd); + }); + } + } + #endif + } // !printer_busy + #endif + + END_MENU(); + } +#endif + +static uint8_t hotend_status_extruder = 0; + +static PGM_P pause_header() { + switch (pause_mode) { + case PAUSE_MODE_CHANGE_FILAMENT: return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER); + case PAUSE_MODE_LOAD_FILAMENT: return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_LOAD); + case PAUSE_MODE_UNLOAD_FILAMENT: return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_UNLOAD); + default: break; + } + return GET_TEXT(MSG_FILAMENT_CHANGE_HEADER_PAUSE); +} + +// Portions from STATIC_ITEM... +#define HOTEND_STATUS_ITEM() do { \ + if (_menuLineNr == _thisItemNr) { \ + if (ui.should_draw()) { \ + 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) { \ + ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ + ++encoderLine; \ + } \ + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); \ + } \ + ++_thisItemNr; \ +}while(0) + +void menu_pause_option() { + START_MENU(); + #if LCD_HEIGHT > 2 + STATIC_ITEM(MSG_FILAMENT_CHANGE_OPTION_HEADER); + #endif + ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_PURGE, []{ pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; }); + + #if HAS_FILAMENT_SENSOR + const bool still_out = runout.filament_ran_out; + if (still_out) + EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled, runout.reset); + #else + constexpr bool still_out = false; + #endif + + if (!still_out) + ACTION_ITEM(MSG_FILAMENT_CHANGE_OPTION_RESUME, []{ pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; }); + + END_MENU(); +} + +// +// ADVANCED_PAUSE_FEATURE message screens +// +// Warning: msg must have three null bytes to delimit lines! +// +void _lcd_pause_message(PGM_P const msg) { + PGM_P const msg1 = msg; + PGM_P const msg2 = msg1 + strlen_P(msg1) + 1; + PGM_P const msg3 = msg2 + strlen_P(msg2) + 1; + const bool has2 = msg2[0], has3 = msg3[0], + skip1 = !has2 && (LCD_HEIGHT) >= 5; + + START_SCREEN(); + 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 + if (has3 && (LCD_HEIGHT) >= 5) STATIC_ITEM_P(msg3); // 4: Message Line 3 (if LCD has 5 lines) + if (skip1 + 1 + has2 + has3 < (LCD_HEIGHT) - 2) SKIP_ITEM(); // Push Hotend Status down, if needed + HOTEND_STATUS_ITEM(); // 5: Hotend Status + END_SCREEN(); +} + +void lcd_pause_parking_message() { _lcd_pause_message(GET_TEXT(MSG_PAUSE_PRINT_PARKING)); } +void lcd_pause_changing_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_INIT)); } +void lcd_pause_unload_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_UNLOAD)); } +void lcd_pause_heating_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_HEATING)); } +void lcd_pause_heat_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_HEAT)); } +void lcd_pause_insert_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_INSERT)); } +void lcd_pause_load_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_LOAD)); } +void lcd_pause_waiting_message() { _lcd_pause_message(GET_TEXT(MSG_ADVANCED_PAUSE_WAITING)); } +void lcd_pause_resume_message() { _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_RESUME)); } + +void lcd_pause_purge_message() { + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_CONT_PURGE)); + #else + _lcd_pause_message(GET_TEXT(MSG_FILAMENT_CHANGE_PURGE)); + #endif +} + +FORCE_INLINE screenFunc_t ap_message_screen(const PauseMessage message) { + switch (message) { + case PAUSE_MESSAGE_PARKING: return lcd_pause_parking_message; + case PAUSE_MESSAGE_CHANGING: return lcd_pause_changing_message; + case PAUSE_MESSAGE_UNLOAD: return lcd_pause_unload_message; + case PAUSE_MESSAGE_WAITING: return lcd_pause_waiting_message; + case PAUSE_MESSAGE_INSERT: return lcd_pause_insert_message; + case PAUSE_MESSAGE_LOAD: return lcd_pause_load_message; + case PAUSE_MESSAGE_PURGE: return lcd_pause_purge_message; + case PAUSE_MESSAGE_RESUME: return lcd_pause_resume_message; + case PAUSE_MESSAGE_HEAT: return lcd_pause_heat_message; + case PAUSE_MESSAGE_HEATING: return lcd_pause_heating_message; + case PAUSE_MESSAGE_OPTION: pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; + return menu_pause_option; + case PAUSE_MESSAGE_STATUS: + default: break; + } + return nullptr; +} + +void lcd_pause_show_message( + const PauseMessage message, + const PauseMode mode/*=PAUSE_MODE_SAME*/, + const uint8_t extruder/*=active_extruder*/ +) { + if (mode != PAUSE_MODE_SAME) pause_mode = mode; + hotend_status_extruder = extruder; + const screenFunc_t next_screen = ap_message_screen(message); + if (next_screen) { + ui.defer_status_screen(); + ui.goto_screen(next_screen); + } + else + ui.return_to_status(); +} + +#endif // HAS_LCD_MENU && ADVANCED_PAUSE_FEATURE diff --git a/Marlin/src/lcd/menu/menu_game.cpp b/Marlin/src/lcd/menu/menu_game.cpp new file mode 100644 index 00000000..fa56d7ee --- /dev/null +++ b/Marlin/src/lcd/menu/menu_game.cpp @@ -0,0 +1,48 @@ +/** + * 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_GAME_MENU + +#include "menu_item.h" +#include "game/game.h" + +void menu_game() { + START_MENU(); + BACK_ITEM(TERN(LCD_INFO_MENU, MSG_INFO_MENU, MSG_MAIN)); + #if ENABLED(MARLIN_BRICKOUT) + SUBMENU(MSG_BRICKOUT, brickout.enter_game); + #endif + #if ENABLED(MARLIN_INVADERS) + SUBMENU(MSG_INVADERS, invaders.enter_game); + #endif + #if ENABLED(MARLIN_SNAKE) + SUBMENU(MSG_SNAKE, snake.enter_game); + #endif + #if ENABLED(MARLIN_MAZE) + SUBMENU(MSG_MAZE, maze.enter_game); + #endif + END_MENU(); +} + +#endif // HAS_GAME_MENU diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp new file mode 100644 index 00000000..a4cbc31d --- /dev/null +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -0,0 +1,306 @@ +/** + * 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 . + * + */ + +// +// Info Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, LCD_INFO_MENU) + +#include "menu_item.h" + +#if HAS_GAMES + #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" + + // + // About Printer > Printer Stats + // + void menu_info_stats() { + if (ui.use_click()) return ui.go_back(); + + printStatistics stats = print_job_timer.getStats(); + + 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_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(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(MSG_INFO_PRINT_FILAMENT, SS_LEFT); // Extruded total: + sprintf_P(buffer, PSTR("%ld.%im") + , long(stats.filamentUsed / 1000) + , int16_t(stats.filamentUsed / 100) % 10 + ); + STATIC_ITEM_P(PSTR("> "), SS_LEFT, buffer); // > 125m + + #if SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0 + strcpy_P(buffer, GET_TEXT(MSG_SERVICE_IN)); + #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 + #endif + + #if SERVICE_INTERVAL_2 > 0 + STATIC_ITEM_P(PSTR(SERVICE_NAME_2 " "), SS_LEFT, buffer); + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService2).toString(buffer)); + #endif + + #if SERVICE_INTERVAL_3 > 0 + STATIC_ITEM_P(PSTR(SERVICE_NAME_3 " "), SS_LEFT, buffer); + STATIC_ITEM_P(PSTR("> "), SS_LEFT, duration_t(stats.nextService3).toString(buffer)); + #endif + + END_SCREEN(); + } + +#endif + +// +// About Printer > Thermistors +// +void menu_info_thermistors() { + if (ui.use_click()) return ui.go_back(); + + START_SCREEN(); + + #if EXTRUDERS + #define THERMISTOR_ID TEMP_SENSOR_0 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E0 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_1 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E1 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_2 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E2 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_3 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E3 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_4 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E4 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_5 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E5 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_6 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E6 ": " THERMISTOR_NAME), SS_INVERT); + 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 + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_7 + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR(LCD_STR_E7 ": " THERMISTOR_NAME), SS_INVERT); + 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 + STATIC_ITEM(TERN(WATCH_HOTENDS, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); + #endif + + #if HAS_HEATED_BED + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_BED + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR("BED: " THERMISTOR_NAME), SS_INVERT); + 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 + + #if HAS_HEATED_CHAMBER + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_CHAMBER + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR("CHAM: " THERMISTOR_NAME), SS_INVERT); + 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 + + END_SCREEN(); +} + +// +// About Printer > Board Info +// +void menu_info_board() { + if (ui.use_click()) return ui.go_back(); + + START_SCREEN(); + 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 + 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(); +} + +// +// About Printer > Printer Info +// +#if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN) + + void menu_show_marlin_bootscreen() { + if (ui.use_click()) { ui.goto_previous_screen_no_defer(); } + ui.draw_marlin_bootscreen(); + } + + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + void menu_show_custom_bootscreen() { + if (ui.use_click()) { ui.goto_screen(menu_show_marlin_bootscreen); } + ui.draw_custom_bootscreen(); + } + #endif + +#else + + void menu_info_printer() { + if (ui.use_click()) return ui.go_back(); + START_SCREEN(); + 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 + STATIC_ITEM_P(PSTR(WEBSITE_URL)); // www.my3dprinter.com + 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 + TERN_(AUTO_BED_LEVELING_LINEAR, MSG_LINEAR_LEVELING) // Linear Leveling + TERN_(AUTO_BED_LEVELING_BILINEAR, MSG_BILINEAR_LEVELING) // Bi-linear Leveling + TERN_(AUTO_BED_LEVELING_UBL, MSG_UBL_LEVELING) // Unified Bed Leveling + TERN_(MESH_BED_LEVELING, MSG_MESH_LEVELING) // Mesh Leveling + ); + #endif + END_SCREEN(); + } + +#endif + +// +// "About Printer" submenu +// +void menu_info() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + #if ENABLED(LCD_PRINTER_INFO_IS_BOOTSCREEN) + SUBMENU(MSG_INFO_PRINTER_MENU, TERN(SHOW_CUSTOM_BOOTSCREEN, menu_show_custom_bootscreen, menu_show_marlin_bootscreen)); + #else + SUBMENU(MSG_INFO_PRINTER_MENU, menu_info_printer); // Printer Info > + SUBMENU(MSG_INFO_BOARD_MENU, menu_info_board); // Board Info > + #if EXTRUDERS + SUBMENU(MSG_INFO_THERMISTOR_MENU, menu_info_thermistors); // Thermistors > + #endif + #endif + + #if ENABLED(PRINTCOUNTER) + SUBMENU(MSG_INFO_STATS_MENU, menu_info_stats); // Printer Stats > + #endif + + #if HAS_GAMES + { + #if ENABLED(GAMES_EASTER_EGG) + SKIP_ITEM(); SKIP_ITEM(); SKIP_ITEM(); + #endif + + // Game sub-menu or the individual game + SUBMENU( + #if HAS_GAME_MENU + MSG_GAMES, menu_game + #elif ENABLED(MARLIN_BRICKOUT) + MSG_BRICKOUT, brickout.enter_game + #elif ENABLED(MARLIN_INVADERS) + MSG_INVADERS, invaders.enter_game + #elif ENABLED(MARLIN_SNAKE) + MSG_SNAKE, snake.enter_game + #elif ENABLED(MARLIN_MAZE) + MSG_MAZE, maze.enter_game + #endif + ); + } + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU && LCD_INFO_MENU diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h new file mode 100644 index 00000000..bd3af0ce --- /dev/null +++ b/Marlin/src/lcd/menu/menu_item.h @@ -0,0 +1,492 @@ +/** + * 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 ////////////// +//////////////////////////////////////////// + +// 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) + +// 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), N, ##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 + +#if HAS_FAN + + #include "../../module/temperature.h" + + inline void on_fan_update() { + thermalManager.set_fan_speed(MenuItemBase::itemIndex, editable.uint8); + } + + #if ENABLED(EXTRA_FAN_SPEED) + #define EDIT_EXTRA_FAN_SPEED(V...) EDIT_ITEM_FAST_N(V) + #else + #define EDIT_EXTRA_FAN_SPEED(...) + #endif + + #define _FAN_EDIT_ITEMS(F,L) do{ \ + editable.uint8 = thermalManager.fan_speed[F]; \ + EDIT_ITEM_FAST_N(percent, F, MSG_##L, &editable.uint8, 0, 255, on_fan_update); \ + EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.new_fan_speed[F], 3, 255); \ + }while(0) + + #if FAN_COUNT > 1 + #define FAN_EDIT_ITEMS(F) _FAN_EDIT_ITEMS(F,FAN_SPEED_N) + #endif + + #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) + + #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) + #define DEFINE_SINGLENOZZLE_ITEM() \ + auto singlenozzle_item = [&](const uint8_t f) { \ + editable.uint8 = singlenozzle_fan_speed[f]; \ + EDIT_ITEM_FAST_N(percent, f, MSG_STORED_FAN_N, &editable.uint8, 0, 255, on_fan_update); \ + } + #else + #define DEFINE_SINGLENOZZLE_ITEM() NOOP + #endif + +#endif // HAS_FAN diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp new file mode 100644 index 00000000..7cd2949d --- /dev/null +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -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 . + * + */ + +// +// Job Recovery Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, POWER_LOSS_RECOVERY) + +#include "menu_item.h" +#include "../../gcode/queue.h" +#include "../../sd/cardreader.h" +#include "../../feature/powerloss.h" + +static void lcd_power_loss_recovery_resume() { + ui.return_to_status(); + queue.inject_P(PSTR("M1000")); +} + +void lcd_power_loss_recovery_cancel() { + recovery.cancel(); + ui.return_to_status(); +} + +// TODO: Display long filename with Cancel/Resume buttons +// Requires supporting methods in PLR class. +void menu_job_recovery() { + ui.defer_status_screen(); + START_MENU(); + STATIC_ITEM(MSG_OUTAGE_RECOVERY); + ACTION_ITEM(MSG_RESUME_PRINT, lcd_power_loss_recovery_resume); + ACTION_ITEM(MSG_STOP_PRINT, lcd_power_loss_recovery_cancel); + END_MENU(); +} + +#endif // HAS_LCD_MENU && POWER_LOSS_RECOVERY diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp new file mode 100644 index 00000000..386a4d79 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -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 . + * + */ + +// +// LED Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU && EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + +#include "menu_item.h" + +#if ENABLED(LED_CONTROL_MENU) + #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_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_INDIGO, leds.set_indigo); + ACTION_ITEM(MSG_SET_LEDS_VIOLET, leds.set_violet); + END_MENU(); + } + + #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); + #if EITHER(RGBW_LED, NEOPIXEL_LED) + EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true); + #if ENABLED(NEOPIXEL_LED) + 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 + +#if ENABLED(CASE_LIGHT_MENU) + #include "../../feature/caselight.h" + + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + void menu_case_light() { + START_MENU(); + BACK_ITEM(MSG_CONFIGURATION); + 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 +#endif + +void menu_led() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #if ENABLED(LED_CONTROL_MENU) + 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 + + // + // Set Case light on/off/brightness + // + #if ENABLED(CASE_LIGHT_MENU) + #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + if (TERN1(CASE_LIGHT_USE_NEOPIXEL, PWM_PIN(CASE_LIGHT_PIN))) + SUBMENU(MSG_CASE_LIGHT, menu_case_light); + else + #endif + EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); + #endif + END_MENU(); +} + +#endif // HAS_LCD_MENU && LED_CONTROL_MENU diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp new file mode 100644 index 00000000..5b983825 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -0,0 +1,322 @@ +/** + * 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 . + * + */ + +// +// Main Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU + +#include "menu_item.h" +#include "../../module/temperature.h" +#include "../../gcode/queue.h" +#include "../../module/printcounter.h" +#include "../../module/stepper.h" +#include "../../sd/cardreader.h" + +#if HAS_GAMES && DISABLED(LCD_INFO_MENU) + #include "game/game.h" +#endif + +#if EITHER(SDSUPPORT, HOST_PROMPT_SUPPORT) || defined(ACTION_ON_CANCEL) + #define MACHINE_CAN_STOP 1 +#endif +#if ANY(SDSUPPORT, HOST_PROMPT_SUPPORT, PARK_HEAD_ON_PAUSE) || defined(ACTION_ON_PAUSE) + #define MACHINE_CAN_PAUSE 1 +#endif + +#if ENABLED(PRUSA_MMU2) + #include "../../lcd/menu/menu_mmu2.h" +#endif + +#if ENABLED(PASSWORD_FEATURE) + #include "../../feature/password/password.h" +#endif + +#if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) + #include "../../feature/host_actions.h" +#endif + +void menu_tune(); +void menu_cancelobject(); +void menu_motion(); +void menu_temperature(); +void menu_configuration(); + +#if ENABLED(CUSTOM_USER_MENUS) + void menu_user(); +#endif + +#if HAS_POWER_MONITOR + void menu_power_monitor(); +#endif + +#if ENABLED(MIXING_EXTRUDER) + void menu_mixer(); +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + void _menu_temp_filament_op(const PauseMode, const int8_t); + void menu_change_filament(); +#endif + +#if ENABLED(LCD_INFO_MENU) + void menu_info(); +#endif + +#if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + void menu_led(); +#endif + +#if HAS_CUTTER + void menu_spindle_laser(); +#endif + +extern const char M21_STR[]; + +void menu_main() { + const bool busy = printingIsActive() + #if ENABLED(SDSUPPORT) + , card_detected = card.isMounted() + , card_open = card_detected && card.isFileOpen() + #endif + ; + + START_MENU(); + BACK_ITEM(MSG_INFO_SCREEN); + + if (busy) { + #if MACHINE_CAN_PAUSE + ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); + #endif + #if MACHINE_CAN_STOP + SUBMENU(MSG_STOP_PRINT, []{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_STOP), GET_TEXT(MSG_BACK), + ui.abort_print, ui.goto_previous_screen, + GET_TEXT(MSG_STOP_PRINT), (const char *)nullptr, PSTR("?") + ); + }); + #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 { + + #if !HAS_ENCODER_WHEEL && ENABLED(SDSUPPORT) + + // *** IF THIS SECTION IS CHANGED, REPRODUCE BELOW *** + + // + // Autostart + // + #if ENABLED(MENU_ADDAUTOSTART) + ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); + #endif + + if (card_detected) { + if (!card_open) { + SUBMENU(MSG_MEDIA_MENU, TERN(PASSWORD_ON_SD_PRINT_MENU, password.media_gatekeeper, menu_media)); + #if PIN_EXISTS(SD_DETECT) + GCODES_ITEM(MSG_CHANGE_MEDIA, M21_STR); + #else + GCODES_ITEM(MSG_RELEASE_MEDIA, PSTR("M22")); + #endif + } + } + else { + #if PIN_EXISTS(SD_DETECT) + ACTION_ITEM(MSG_NO_MEDIA, nullptr); + #else + GCODES_ITEM(MSG_ATTACH_MEDIA, M21_STR); + #endif + } + + #endif // !HAS_ENCODER_WHEEL && SDSUPPORT + + if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) + ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); + + #if ENABLED(HOST_START_MENU_ITEM) && defined(ACTION_ON_START) + ACTION_ITEM(MSG_HOST_START_PRINT, host_action_start); + #endif + + SUBMENU(MSG_MOTION, menu_motion); + } + + #if HAS_CUTTER + SUBMENU(MSG_CUTTER(MENU), menu_spindle_laser); + #endif + + #if HAS_TEMPERATURE + SUBMENU(MSG_TEMPERATURE, menu_temperature); + #endif + + #if HAS_POWER_MONITOR + SUBMENU(MSG_POWER_MONITOR, menu_power_monitor); + #endif + + #if ENABLED(MIXING_EXTRUDER) + SUBMENU(MSG_MIXER, menu_mixer); + #endif + + #if ENABLED(MMU2_MENUS) + if (!busy) SUBMENU(MSG_MMU2_MENU, menu_mmu2); + #endif + + SUBMENU(MSG_CONFIGURATION, menu_configuration); + + #if ENABLED(CUSTOM_USER_MENUS) + #ifdef CUSTOM_USER_MENU_TITLE + SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); + #else + SUBMENU(MSG_USER_MENU, menu_user); + #endif + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) + if (thermalManager.targetHotEnoughToExtrude(active_extruder)) + GCODES_ITEM(MSG_FILAMENTCHANGE, PSTR("M600 B0")); + else + SUBMENU(MSG_FILAMENTCHANGE, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, 0); }); + #else + SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament); + #endif + #endif + + #if ENABLED(LCD_INFO_MENU) + SUBMENU(MSG_INFO_MENU, menu_info); + #endif + + #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + SUBMENU(MSG_LEDS, menu_led); + #endif + + // + // Switch power on/off + // + #if ENABLED(PSU_CONTROL) + if (powersupply_on) + GCODES_ITEM(MSG_SWITCH_PS_OFF, PSTR("M81")); + else + GCODES_ITEM(MSG_SWITCH_PS_ON, PSTR("M80")); + #endif + + #if BOTH(HAS_ENCODER_WHEEL, SDSUPPORT) + + if (!busy) { + + // *** IF THIS SECTION IS CHANGED, REPRODUCE ABOVE *** + + // + // Autostart + // + #if ENABLED(MENU_ADDAUTOSTART) + ACTION_ITEM(MSG_AUTOSTART, card.beginautostart); + #endif + + if (card_detected) { + if (!card_open) { + #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)); + } + } + else { + #if PIN_EXISTS(SD_DETECT) + ACTION_ITEM(MSG_NO_MEDIA, nullptr); + #else + GCODES_ITEM(MSG_ATTACH_MEDIA, M21_STR); + #endif + } + } + + #endif // HAS_ENCODER_WHEEL && SDSUPPORT + + #if HAS_SERVICE_INTERVALS + static auto _service_reset = [](const int index) { + print_job_timer.resetServiceInterval(index); + ui.completion_feedback(); + ui.reset_status(); + ui.return_to_status(); + }; + #if SERVICE_INTERVAL_1 > 0 + CONFIRM_ITEM_P(PSTR(SERVICE_NAME_1), + MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, + []{ _service_reset(1); }, ui.goto_previous_screen, + GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_1), PSTR("?") + ); + #endif + #if SERVICE_INTERVAL_2 > 0 + CONFIRM_ITEM_P(PSTR(SERVICE_NAME_2), + MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, + []{ _service_reset(2); }, ui.goto_previous_screen, + GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_2), PSTR("?") + ); + #endif + #if SERVICE_INTERVAL_3 > 0 + CONFIRM_ITEM_P(PSTR(SERVICE_NAME_3), + MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, + []{ _service_reset(3); }, ui.goto_previous_screen, + GET_TEXT(MSG_SERVICE_RESET), F(SERVICE_NAME_3), PSTR("?") + ); + #endif + #endif + + #if HAS_GAMES && DISABLED(LCD_INFO_MENU) + #if ENABLED(GAMES_EASTER_EGG) + SKIP_ITEM(); + SKIP_ITEM(); + SKIP_ITEM(); + #endif + // Game sub-menu or the individual game + { + SUBMENU( + #if HAS_GAME_MENU + MSG_GAMES, menu_game + #elif ENABLED(MARLIN_BRICKOUT) + MSG_BRICKOUT, brickout.enter_game + #elif ENABLED(MARLIN_INVADERS) + MSG_INVADERS, invaders.enter_game + #elif ENABLED(MARLIN_SNAKE) + MSG_SNAKE, snake.enter_game + #elif ENABLED(MARLIN_MAZE) + MSG_MAZE, maze.enter_game + #endif + ); + } + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp new file mode 100644 index 00000000..93ecc49d --- /dev/null +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -0,0 +1,141 @@ +/** + * 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 . + * + */ + +// +// SD Card Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, SDSUPPORT) + +#include "menu_item.h" +#include "../../sd/cardreader.h" + +void lcd_sd_updir() { + ui.encoderPosition = card.cdup() ? ENCODER_STEPS_PER_MENU_ITEM : 0; + encoderTopLine = 0; + ui.screen_changed = true; + ui.refresh(); +} + +#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + + uint16_t sd_encoder_position = 0xFFFF; + int8_t sd_top_line, sd_items; + + void MarlinUI::reselect_last_file() { + if (sd_encoder_position == 0xFFFF) return; + goto_screen(menu_media, sd_encoder_position, sd_top_line, sd_items); + sd_encoder_position = 0xFFFF; + defer_status_screen(); + } + +#endif + +inline void sdcard_start_selected_file() { + card.openAndPrintFile(card.filename); + ui.return_to_status(); + ui.reset_status(); +} + +class MenuItem_sdfile : public MenuItem_sdbase { + public: + static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard) { + MenuItem_sdbase::draw(sel, row, pstr, theCard, false); + } + static void action(PGM_P const pstr, CardReader &) { + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + // Save menu state for the selected file + sd_encoder_position = ui.encoderPosition; + sd_top_line = encoderTopLine; + sd_items = screen_items; + #endif + #if ENABLED(SD_MENU_CONFIRM_START) + MenuItem_submenu::action(pstr, []{ + char * const longest = card.longest_filename(); + char buffer[strlen(longest) + 2]; + buffer[0] = ' '; + strcpy(buffer + 1, longest); + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_PRINT), GET_TEXT(MSG_BUTTON_CANCEL), + sdcard_start_selected_file, ui.goto_previous_screen, + GET_TEXT(MSG_START_PRINT), buffer, PSTR("?") + ); + }); + #else + sdcard_start_selected_file(); + UNUSED(pstr); + #endif + } +}; + +class MenuItem_sdfolder : public MenuItem_sdbase { + public: + static inline void draw(const bool sel, const uint8_t row, PGM_P const pstr, CardReader &theCard) { + MenuItem_sdbase::draw(sel, row, pstr, theCard, true); + } + static void action(PGM_P const, CardReader &theCard) { + card.cd(theCard.filename); + encoderTopLine = 0; + ui.encoderPosition = 2 * (ENCODER_STEPS_PER_MENU_ITEM); + ui.screen_changed = true; + TERN_(HAS_MARLINUI_U8GLIB, ui.drawing_screen = false); + ui.refresh(); + } +}; + +void menu_media() { + ui.encoder_direction_menus(); + + #if HAS_MARLINUI_U8GLIB + static uint16_t fileCnt; + if (ui.first_page) fileCnt = card.get_num_Files(); + #else + const uint16_t fileCnt = card.get_num_Files(); + #endif + + START_MENU(); + BACK_ITEM(MSG_MAIN); + if (card.flag.workDirIsRoot) { + #if !PIN_EXISTS(SD_DETECT) + ACTION_ITEM(MSG_REFRESH, []{ encoderTopLine = 0; card.mount(); }); + #endif + } + else if (card.isMounted()) + ACTION_ITEM_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); + + if (ui.should_draw()) for (uint16_t i = 0; i < fileCnt; i++) { + if (_menuLineNr == _thisItemNr) { + card.getfilename_sorted(SD_ORDER(i, fileCnt)); + if (card.flag.filenameIsDir) + MENU_ITEM(sdfolder, MSG_MEDIA_MENU, card); + else + MENU_ITEM(sdfile, MSG_MEDIA_MENU, card); + } + else + SKIP_ITEM(); + } + END_MENU(); +} + +#endif // HAS_LCD_MENU && SDSUPPORT diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp new file mode 100644 index 00000000..80102393 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -0,0 +1,269 @@ +/** + * 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 . + * + */ + +// +// Mixer Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, MIXING_EXTRUDER) + +#include "menu_item.h" +#include "menu_addon.h" + +#include "../../feature/mixing.h" + +#define CHANNEL_MIX_EDITING !HAS_DUAL_MIXING + +#if ENABLED(GRADIENT_MIX) + + void _lcd_mixer_gradient_z_edit(const bool isend) { + ui.defer_status_screen(); + ENCODER_RATE_MULTIPLY(true); + + float &zvar = isend ? mixer.gradient.end_z : mixer.gradient.start_z; + + if (ui.encoderPosition) { + zvar += float(int32_t(ui.encoderPosition)) * 0.1; + ui.encoderPosition = 0; + NOLESS(zvar, 0); + NOMORE(zvar, Z_MAX_POS); + } + + if (ui.should_draw()) { + 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 (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(); + } + } + + void lcd_mixer_edit_gradient_menu() { + START_MENU(); + BACK_ITEM(MSG_MIXER); + + EDIT_ITEM(int8, MSG_START_VTOOL, &mixer.gradient.start_vtool, 0, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + 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, -1, MIXING_VIRTUAL_TOOLS - 1, mixer.refresh_gradient); + #endif + + char tmp[18]; + + 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(); + + 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(); + + END_MENU(); + } + +#endif // GRADIENT_MIX + +static uint8_t v_index; + +#if HAS_DUAL_MIXING + void _lcd_draw_mix(const uint8_t y) { + 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(10, y); lcd_put_u8str(tmp); + } +#endif + +void _lcd_mixer_select_vtool() { + mixer.T(v_index); + TERN_(HAS_DUAL_MIXING, _lcd_draw_mix(LCD_HEIGHT - 1)); +} + +#if CHANNEL_MIX_EDITING + + void _lcd_mixer_cycle_mix() { + uint16_t bits = 0; + MIXER_STEPPER_LOOP(i) if (mixer.collector[i]) SBI(bits, i); + bits = (bits + 1) & (_BV(MIXING_STEPPERS) - 1); + if (!bits) ++bits; + MIXER_STEPPER_LOOP(i) mixer.collector[i] = TEST(bits, i) ? 10.0f : 0.0f; + ui.refresh(); + } + + void _lcd_mixer_commit_vtool() { + mixer.normalize(); + ui.goto_previous_screen(); + } + +#endif + +void lcd_mixer_mix_edit() { + + #if HAS_DUAL_MIXING && !CHANNEL_MIX_EDITING + + // Adjust 2-channel mix from the encoder + if (ui.encoderPosition) { + mixer.mix[0] += int32_t(ui.encoderPosition); + ui.encoderPosition = 0; + if (mixer.mix[0] < 0) mixer.mix[0] += 101; + if (mixer.mix[0] > 100) mixer.mix[0] -= 101; + mixer.mix[1] = 100 - mixer.mix[0]; + } + _lcd_draw_mix((LCD_HEIGHT - 1) / 2); + + // Click to commit the change + if (ui.lcd_clicked) { + mixer.update_vtool_from_mix(); + ui.goto_previous_screen(); + } + + #else + + START_MENU(); + BACK_ITEM(MSG_MIXER); + + #if CHANNEL_MIX_EDITING + + LOOP_S_LE_N(n, 1, MIXING_STEPPERS) + EDIT_ITEM_FAST_N(float42_52, n, MSG_MIX_COMPONENT_N, &mixer.collector[n-1], 0, 10); + + ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix); + ACTION_ITEM(MSG_COMMIT_VTOOL, _lcd_mixer_commit_vtool); + + #endif + + END_MENU(); + + #endif +} + +#if HAS_DUAL_MIXING + + // + // Toggle Dual-Mix + // + inline void _lcd_mixer_toggle_mix() { + mixer.mix[0] = mixer.mix[0] == 100 ? 0 : 100; + mixer.mix[1] = 100 - mixer.mix[0]; + mixer.update_vtool_from_mix(); + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + } + +#endif + +#if CHANNEL_MIX_EDITING + + // + // Prepare and Edit Mix + // + inline void _lcd_goto_mix_edit() { + mixer.refresh_collector(10, v_index); + ui.goto_screen(lcd_mixer_mix_edit); + lcd_mixer_mix_edit(); + } + +#endif + +#if ENABLED(GRADIENT_MIX) + // + // Reverse Gradient + // + inline void _lcd_mixer_reverse_gradient() { + const uint8_t sv = mixer.gradient.start_vtool; + mixer.gradient.start_vtool = mixer.gradient.end_vtool; + mixer.gradient.end_vtool = sv; + mixer.refresh_gradient(); + ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + } +#endif + +void menu_mixer() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + v_index = mixer.get_current_vtool(); + EDIT_ITEM(uint8, MSG_ACTIVE_VTOOL, &v_index, 0, MIXING_VIRTUAL_TOOLS - 1, _lcd_mixer_select_vtool, ENABLED(HAS_DUAL_MIXING)); + + #if HAS_DUAL_MIXING + { + char tmp[11]; + SUBMENU(MSG_MIX, lcd_mixer_mix_edit); + 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); + MENU_ITEM_ADDON_END(); + ACTION_ITEM(MSG_TOGGLE_MIX, _lcd_mixer_toggle_mix); + } + #else + SUBMENU(MSG_MIX, _lcd_goto_mix_edit); + #endif + + // + // Reset All V-Tools + // + CONFIRM_ITEM(MSG_RESET_VTOOLS, + MSG_BUTTON_RESET, MSG_BUTTON_CANCEL, + []{ + mixer.reset_vtools(); + LCD_MESSAGEPGM(MSG_VTOOLS_RESET); + ui.return_to_status(); + }, + nullptr, + GET_TEXT(MSG_RESET_VTOOLS), (const char *)nullptr, PSTR("?") + ); + + #if ENABLED(GRADIENT_MIX) + { + char tmp[13]; + SUBMENU(MSG_GRADIENT, lcd_mixer_edit_gradient_menu); + 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(); + ACTION_ITEM(MSG_REVERSE_GRADIENT, _lcd_mixer_reverse_gradient); + } + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU && MIXING_EXTRUDER diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp new file mode 100644 index 00000000..0a63d90c --- /dev/null +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -0,0 +1,173 @@ +/** + * 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 BOTH(HAS_LCD_MENU, MMU2_MENUS) + +#include "../../feature/mmu2/mmu2.h" +#include "menu_mmu2.h" +#include "menu_item.h" + +uint8_t currentTool; +bool mmuMenuWait; + +// +// Load Filament +// + +void _mmu2_load_filamentToNozzle(uint8_t index) { + ui.reset_status(); + ui.return_to_status(); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + if (mmu2.load_filament_to_nozzle(index)) ui.reset_status(); +} + +inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) { + _mmu2_load_filamentToNozzle(tool); + ui.return_to_status(); +} + +void _mmu2_load_filament(uint8_t index) { + ui.return_to_status(); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + mmu2.load_filament(index); + ui.reset_status(); +} +void action_mmu2_load_all() { + LOOP_L_N(i, EXTRUDERS) _mmu2_load_filament(i); + ui.return_to_status(); +} + +void menu_mmu2_load_filament() { + START_MENU(); + BACK_ITEM(MSG_MMU2_MENU); + ACTION_ITEM(MSG_MMU2_ALL, action_mmu2_load_all); + LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_filament(MenuItemBase::itemIndex); }); + END_MENU(); +} + +void menu_mmu2_load_to_nozzle() { + START_MENU(); + BACK_ITEM(MSG_MMU2_MENU); + LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_filament_to_nozzle(MenuItemBase::itemIndex); }); + END_MENU(); +} + +// +// Eject Filament +// + +void _mmu2_eject_filament(uint8_t index) { + ui.reset_status(); + ui.return_to_status(); + ui.status_printf_P(0, GET_TEXT(MSG_MMU2_EJECTING_FILAMENT), int(index + 1)); + if (mmu2.eject_filament(index, true)) ui.reset_status(); +} + +void action_mmu2_unload_filament() { + ui.reset_status(); + ui.return_to_status(); + LCD_MESSAGEPGM(MSG_MMU2_UNLOADING_FILAMENT); + idle(); + if (mmu2.unload()) ui.reset_status(); +} + +void menu_mmu2_eject_filament() { + START_MENU(); + BACK_ITEM(MSG_MMU2_MENU); + LOOP_L_N(i, 5) ACTION_ITEM_N(i, MSG_MMU2_FILAMENT_N, []{ _mmu2_eject_filament(MenuItemBase::itemIndex); }); + END_MENU(); +} + +// +// MMU2 Menu +// + +void action_mmu2_reset() { + mmu2.init(); + ui.reset_status(); +} + +void menu_mmu2() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + SUBMENU(MSG_MMU2_LOAD_FILAMENT, menu_mmu2_load_filament); + SUBMENU(MSG_MMU2_LOAD_TO_NOZZLE, menu_mmu2_load_to_nozzle); + SUBMENU(MSG_MMU2_EJECT_FILAMENT, menu_mmu2_eject_filament); + ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, action_mmu2_unload_filament); + ACTION_ITEM(MSG_MMU2_RESET, action_mmu2_reset); + END_MENU(); +} + +// +// T* Choose Filament +// + +inline void action_mmu2_choose(const uint8_t tool) { + currentTool = tool; + mmuMenuWait = false; +} + +void menu_mmu2_choose_filament() { + START_MENU(); + #if LCD_HEIGHT > 2 + 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(); +} + +// +// MMU2 Filament Runout +// + +void menu_mmu2_pause() { + currentTool = mmu2.get_current_tool(); + START_MENU(); + #if LCD_HEIGHT > 2 + 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(); }); + ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_filament(currentTool); }); + ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_filament_to_nozzle(currentTool); }); + END_MENU(); +} + +void mmu2_M600() { + ui.defer_status_screen(); + ui.goto_screen(menu_mmu2_pause); + mmuMenuWait = true; + while (mmuMenuWait) idle(); +} + +uint8_t mmu2_choose_filament() { + ui.defer_status_screen(); + ui.goto_screen(menu_mmu2_choose_filament); + mmuMenuWait = true; + while (mmuMenuWait) idle(); + ui.return_to_status(); + return currentTool; +} + +#endif // HAS_LCD_MENU && MMU2_MENUS diff --git a/Marlin/src/lcd/menu/menu_mmu2.h b/Marlin/src/lcd/menu/menu_mmu2.h new file mode 100644 index 00000000..4230c014 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_mmu2.h @@ -0,0 +1,28 @@ +/** + * 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 + +void menu_mmu2(); +void mmu2_M600(); +uint8_t mmu2_choose_filament(); diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp new file mode 100644 index 00000000..939a0480 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -0,0 +1,399 @@ +/** + * 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 . + * + */ + +// +// Motion Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU + +#include "menu_item.h" +#include "menu_addon.h" + +#include "../../module/motion.h" + +#if ENABLED(DELTA) + #include "../../module/delta.h" +#endif + +#if ENABLED(PREVENT_COLD_EXTRUSION) + #include "../../module/temperature.h" +#endif + +#if HAS_LEVELING + #include "../../module/planner.h" + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(MANUAL_E_MOVES_RELATIVE) + float manual_move_e_origin = 0; +#endif + +// +// "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.manual_move.processing) { + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits(axis, min, max); + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z_AXIS) { + max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis + min = -max; + } + #endif + + // Get the new position + const float diff = float(int32_t(ui.encoderPosition)) * ui.manual_move.menu_scale; + #if IS_KINEMATIC + ui.manual_move.offset += diff; + if (int32_t(ui.encoderPosition) < 0) + NOLESS(ui.manual_move.offset, min - current_position[axis]); + else + NOMORE(ui.manual_move.offset, max - current_position[axis]); + #else + current_position[axis] += diff; + if (int32_t(ui.encoderPosition) < 0) + NOLESS(current_position[axis], min); + else + NOMORE(current_position[axis], max); + #endif + + ui.manual_move.soon(axis); + ui.refresh(LCDVIEW_REDRAW_NOW); + } + ui.encoderPosition = 0; + if (ui.should_draw()) { + const float pos = NATIVE_TO_LOGICAL( + 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) : ftostr63(pos)); + } +} +void lcd_move_x() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_X), X_AXIS); } +void lcd_move_y() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Y), Y_AXIS); } +void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } + +#if E_MANUAL + + 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.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 + ); + ui.refresh(LCDVIEW_REDRAW_NOW); + } + ui.encoderPosition = 0; + } + if (ui.should_draw()) { + 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 + + TERN0(IS_KINEMATIC, ui.manual_move.offset) + - TERN0(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin) + ) + ); + } // should_draw + } + +#endif // E_MANUAL + +// +// "Motion" > "Move Xmm" > "Move XYZ" submenu +// + +#ifndef SHORT_MANUAL_Z_MOVE + #define SHORT_MANUAL_Z_MOVE 0.025 +#endif + +screenFunc_t _manual_move_func_ptr; + +void _goto_manual_move(const float scale) { + ui.defer_status_screen(); + ui.manual_move.menu_scale = scale; + ui.goto_screen(_manual_move_func_ptr); +} + +void _menu_move_distance(const AxisEnum axis, const screenFunc_t func, const int8_t eindex=-1) { + _manual_move_func_ptr = func; + START_MENU(); + if (LCD_HEIGHT >= 4) { + switch (axis) { + 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_DEFAULT|SS_INVERT); + break; + } + } + + BACK_ITEM(MSG_MOVE_AXIS); + SUBMENU(MSG_MOVE_10MM, []{ _goto_manual_move(10); }); + 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) { + // Determine digits needed right of decimal + 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[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); + lcd_put_u8str(tmp); + MENU_ITEM_ADDON_END(); + #else + SUBMENU_P(tmp, []{ _goto_manual_move(float(SHORT_MANUAL_Z_MOVE)); }); + #endif + } + END_MENU(); +} + +#if E_MANUAL + + inline void _goto_menu_move_distance_e() { + ui.goto_screen([]{ _menu_move_distance(E_AXIS, []{ lcd_move_e(TERN_(MULTI_MANUAL, active_extruder)); }, -1); }); + } + + inline void _menu_move_distance_e_maybe() { + #if ENABLED(PREVENT_COLD_EXTRUSION) + const bool too_cold = thermalManager.tooColdToExtrude(active_extruder); + if (too_cold) { + ui.goto_screen([]{ + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_PROCEED), GET_TEXT(MSG_BACK), + _goto_menu_move_distance_e, ui.goto_previous_screen, + GET_TEXT(MSG_HOTEND_TOO_COLD), (const char *)nullptr, PSTR("!") + ); + }); + return; + } + #endif + _goto_menu_move_distance_e(); + } + +#endif // E_MANUAL + +void menu_move() { + START_MENU(); + BACK_ITEM(MSG_MOTION); + + #if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM) + EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstop._enabled); + #endif + + if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) { + if (TERN1(DELTA, current_position.z <= delta_clip_start_height)) { + SUBMENU(MSG_MOVE_X, []{ _menu_move_distance(X_AXIS, lcd_move_x); }); + SUBMENU(MSG_MOVE_Y, []{ _menu_move_distance(Y_AXIS, lcd_move_y); }); + } + #if ENABLED(DELTA) + else + ACTION_ITEM(MSG_FREE_XY, []{ line_to_z(delta_clip_start_height); ui.synchronize(); }); + #endif + + SUBMENU(MSG_MOVE_Z, []{ _menu_move_distance(Z_AXIS, lcd_move_z); }); + } + else + GCODES_ITEM(MSG_AUTO_HOME, G28_STR); + + #if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, MAGNETIC_SWITCHING_TOOLHEAD) + + #if EXTRUDERS >= 4 + switch (active_extruder) { + case 0: GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); break; + case 1: GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); break; + case 2: GCODES_ITEM_N(3, MSG_SELECT_E, PSTR("T3")); break; + case 3: GCODES_ITEM_N(2, MSG_SELECT_E, PSTR("T2")); break; + #if EXTRUDERS == 6 + case 4: GCODES_ITEM_N(5, MSG_SELECT_E, PSTR("T5")); break; + case 5: GCODES_ITEM_N(4, MSG_SELECT_E, PSTR("T4")); break; + #endif + } + #elif EXTRUDERS == 3 + if (active_extruder < 2) { + if (active_extruder) + GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); + else + GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); + } + #else + if (active_extruder) + GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); + else + GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); + #endif + + #elif ENABLED(DUAL_X_CARRIAGE) + + if (active_extruder) + GCODES_ITEM_N(0, MSG_SELECT_E, PSTR("T0")); + else + GCODES_ITEM_N(1, MSG_SELECT_E, PSTR("T1")); + + #endif + + #if E_MANUAL + + // The current extruder + SUBMENU(MSG_MOVE_E, []{ _menu_move_distance_e_maybe(); }); + + #define SUBMENU_MOVE_E(N) SUBMENU_N(N, MSG_MOVE_EN, []{ _menu_move_distance(E_AXIS, []{ lcd_move_e(MenuItemBase::itemIndex); }, MenuItemBase::itemIndex); }); + + #if EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE) + + // ...and the non-switching + #if E_MANUAL == 7 || E_MANUAL == 5 || E_MANUAL == 3 + SUBMENU_MOVE_E(E_MANUAL - 1); + #endif + + #elif MULTI_MANUAL + + // Independent extruders with one E-stepper per hotend + LOOP_L_N(n, E_MANUAL) SUBMENU_MOVE_E(n); + + #endif + + #endif // E_MANUAL + + END_MENU(); +} + +#if ENABLED(AUTO_BED_LEVELING_UBL) + void _lcd_ubl_level_bed(); +#elif ENABLED(LCD_BED_LEVELING) + void menu_bed_leveling(); +#endif + +void menu_motion() { + START_MENU(); + + // + // ^ Main + // + BACK_ITEM(MSG_MAIN); + + // + // Move Axis + // + if (TERN1(DELTA, all_axes_homed())) + SUBMENU(MSG_MOVE_AXIS, menu_move); + + // + // Auto Home + // + GCODES_ITEM(MSG_AUTO_HOME, G28_STR); + #if ENABLED(INDIVIDUAL_AXIS_HOMING_MENU) + GCODES_ITEM(MSG_AUTO_HOME_X, PSTR("G28X")); + GCODES_ITEM(MSG_AUTO_HOME_Y, PSTR("G28Y")); + 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 + // + #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + GCODES_ITEM(MSG_AUTO_Z_ALIGN, PSTR("G34")); + #endif + + // + // Assisted Bed Tramming + // + #if ENABLED(ASSISTED_TRAMMING_MENU_ITEM) + GCODES_ITEM(MSG_ASSISTED_TRAMMING, PSTR("G35")); + #endif + + // + // Level Bed + // + #if ENABLED(AUTO_BED_LEVELING_UBL) + + SUBMENU(MSG_UBL_LEVEL_BED, _lcd_ubl_level_bed); + + #elif ENABLED(LCD_BED_LEVELING) + + if (!g29_in_progress) + SUBMENU(MSG_BED_LEVELING, menu_bed_leveling); + + #elif HAS_LEVELING && DISABLED(SLIM_LCD_MENUS) + + #if DISABLED(PROBE_MANUALLY) + GCODES_ITEM(MSG_LEVEL_BED, PSTR("G28\nG29")); + #endif + + if (all_axes_homed() && leveling_is_valid()) { + bool show_state = planner.leveling_active; + EDIT_ITEM(bool, MSG_BED_LEVELING, &show_state, _lcd_toggle_bed_leveling); + } + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + editable.decimal = planner.z_fade_height; + EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); + #endif + + #endif + + #if ENABLED(LEVEL_BED_CORNERS) && DISABLED(LCD_BED_LEVELING) + ACTION_ITEM(MSG_LEVEL_CORNERS, _lcd_level_bed_corners); + #endif + + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + GCODES_ITEM(MSG_M48_TEST, PSTR("G28 O\nM48 P10")); + #endif + + // + // Disable Steppers + // + GCODES_ITEM(MSG_DISABLE_STEPPERS, PSTR("M84")); + + END_MENU(); +} + +#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp new file mode 100644 index 00000000..c3924b56 --- /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_item.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/lcd/menu/menu_power_monitor.cpp b/Marlin/src/lcd/menu/menu_power_monitor.cpp new file mode 100644 index 00000000..e88bdb28 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_power_monitor.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 . + * + */ + +// +// Power Monitor Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU && HAS_POWER_MONITOR + +#include "menu_item.h" +#include "../../feature/power_monitor.h" + +void menu_power_monitor() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #if ENABLED(POWER_MONITOR_CURRENT) + { + bool ena = power_monitor.current_display_enabled(); + EDIT_ITEM(bool, MSG_CURRENT, &ena, power_monitor.toggle_current_display); + } + #endif + + #if HAS_POWER_MONITOR_VREF + { + bool ena = power_monitor.voltage_display_enabled(); + EDIT_ITEM(bool, MSG_VOLTAGE, &ena, power_monitor.toggle_voltage_display); + } + #endif + + #if HAS_POWER_MONITOR_WATTS + { + bool ena = power_monitor.power_display_enabled(); + EDIT_ITEM(bool, MSG_POWER, &ena, power_monitor.toggle_power_display); + } + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU && HAS_POWER_MONITOR diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp new file mode 100644 index 00000000..6b7830b8 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -0,0 +1,138 @@ +/** + * 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 . + * + */ + +// +// Calibrate Probe offset menu. +// + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(PROBE_OFFSET_WIZARD) + +#ifndef PROBE_OFFSET_START + #error "PROBE_OFFSET_WIZARD requires a PROBE_OFFSET_START with a negative value." +#else + static_assert(PROBE_OFFSET_START < 0, "PROBE_OFFSET_START must be < 0. Please update your configuration."); +#endif + +#include "menu_item.h" +#include "menu_addon.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/probe.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +// Global storage +float z_offset_backup, calculated_z_offset; + +TERN_(HAS_LEVELING, bool leveling_was_active); + +void prepare_for_calibration() { + z_offset_backup = probe.offset.z; + + // Disable soft endstops for free Z movement + SET_SOFT_ENDSTOP_LOOSE(true); + + // Disable leveling for raw planner motion + #if HAS_LEVELING + leveling_was_active = planner.leveling_active; + set_bed_leveling_enabled(false); + #endif +} + +void set_offset_and_go_back(const float &z) { + probe.offset.z = z; + SET_SOFT_ENDSTOP_LOOSE(false); + TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); + ui.goto_previous_screen_no_defer(); +} + +void _goto_manual_move_z(const float scale) { + ui.manual_move.menu_scale = scale; + ui.goto_screen(lcd_move_z); +} + +void probe_offset_wizard_menu() { + START_MENU(); + calculated_z_offset = probe.offset.z + current_position.z; + + if (LCD_HEIGHT >= 4) + STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT); + + STATIC_ITEM_P(PSTR("Z="), SS_CENTER, ftostr42_52(current_position.z)); + STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset)); + + SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); }); + SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); }); + + if ((SHORT_MANUAL_Z_MOVE) > 0.0f && (SHORT_MANUAL_Z_MOVE) < 0.1f) { + extern const char NUL_STR[]; + SUBMENU_P(NUL_STR, []{ _goto_manual_move_z(float(SHORT_MANUAL_Z_MOVE)); }); + MENU_ITEM_ADDON_START(0 + ENABLED(HAS_MARLINUI_HD44780)); + 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)); + lcd_put_u8str(tmp); + MENU_ITEM_ADDON_END(); + } + + ACTION_ITEM(MSG_BUTTON_DONE, []{ + set_offset_and_go_back(calculated_z_offset); + do_z_clearance(20.0 + #ifdef Z_AFTER_HOMING + - 20.0 + Z_AFTER_HOMING + #endif + ); + }); + + ACTION_ITEM(MSG_BUTTON_CANCEL, []{ + set_offset_and_go_back(z_offset_backup); + }); + + END_MENU(); +} + +void goto_probe_offset_wizard() { + ui.defer_status_screen(); + + prepare_for_calibration(); + + probe.offset.z = PROBE_OFFSET_START; + + set_all_unhomed(); + queue.inject_P(G28_STR); + + ui.goto_screen([]{ + _lcd_draw_homing(); + if (all_axes_homed()) { + ui.goto_screen(probe_offset_wizard_menu); + ui.defer_status_screen(); + } + }); +} + +#endif // PROBE_OFFSET_WIZARD diff --git a/Marlin/src/lcd/menu/menu_spindle_laser.cpp b/Marlin/src/lcd/menu/menu_spindle_laser.cpp new file mode 100644 index 00000000..04b999ea --- /dev/null +++ b/Marlin/src/lcd/menu/menu_spindle_laser.cpp @@ -0,0 +1,66 @@ +/** + * 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 . + * + */ + +// +// Spindle / Laser Menu +// + +#include "../../inc/MarlinConfig.h" + +#if HAS_LCD_MENU && HAS_CUTTER + + #include "menu_item.h" + + #include "../../feature/spindle_laser.h" + + void menu_spindle_laser() { + + const bool is_enabled = cutter.enabled() && cutter.isReady; + + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #if ENABLED(SPINDLE_LASER_PWM) + // Change the cutter's "current power" value without turning the cutter on or off + // Power is displayed and set in units and range according to CUTTER_POWER_UNIT + EDIT_ITEM_FAST(CUTTER_MENU_POWER_TYPE, MSG_CUTTER(POWER), &cutter.menuPower, + cutter.mpower_min(), cutter.mpower_max(), cutter.update_from_mpower); + #endif + + if (is_enabled) + ACTION_ITEM(MSG_CUTTER(OFF), cutter.disable); + else { + ACTION_ITEM(MSG_CUTTER(ON), cutter.enable_forward); + #if ENABLED(SPINDLE_CHANGE_DIR) + ACTION_ITEM(MSG_SPINDLE_REVERSE, cutter.enable_reverse); + #endif + } + + #if ENABLED(MARLIN_DEV_MODE) + #if ENABLED(HAL_CAN_SET_PWM_FREQ) && defined(SPINDLE_LASER_FREQUENCY) + EDIT_ITEM_FAST(CUTTER_MENU_FREQUENCY_TYPE, MSG_CUTTER_FREQUENCY, &cutter.frequency, 2000, 50000, cutter.refresh_frequency); + #endif + #endif + END_MENU(); + } + +#endif // HAS_LCD_MENU && HAS_CUTTER diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp new file mode 100644 index 00000000..0c70cd7e --- /dev/null +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -0,0 +1,262 @@ +/** + * 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 . + * + */ + +// +// Temperature Menu +// + +#include "../../inc/MarlinConfig.h" + +#if HAS_LCD_MENU && HAS_TEMPERATURE + +#include "menu_item.h" +#include "../../module/temperature.h" + +#if FAN_COUNT > 1 || ENABLED(SINGLENOZZLE) + #include "../../module/motion.h" +#endif + +#if ENABLED(SINGLENOZZLE) + #include "../../module/tool_change.h" +#endif + +// +// "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.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.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); + #else + UNUSED(indb); + #endif + #if HAS_FAN + set_fan_speed(( + #if FAN_COUNT > 1 + active_extruder < FAN_COUNT ? active_extruder : + #endif + 0), ui.material_preset[indh].fan_speed + ); + #endif + ui.return_to_status(); +} + +#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_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } + #endif + + #if HAS_TEMP_HOTEND && HAS_HEATED_BED + + // Indexed "Preheat ABC" and "Heat Bed" items + #define PREHEAT_ITEMS(M,E) do{ \ + 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_S(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) + + #endif + + void do_preheat_end_m() { _preheat_end(editable.int8, 0); } + + #if HAS_MULTI_HOTEND || HAS_HEATED_BED + + // 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 + + START_MENU(); + BACK_ITEM(MSG_TEMPERATURE); + + #if HOTENDS == 1 + + #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 + + #elif HAS_MULTI_HOTEND + + 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); + }); + + #endif + + #if HAS_HEATED_BED + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); }); + #endif + + END_MENU(); + } + + #endif // HAS_MULTI_HOTEND || HAS_HEATED_BED + +#endif // PREHEAT_COUNT + +#if HAS_TEMP_HOTEND || HAS_HEATED_BED + + void lcd_cooldown() { + thermalManager.zero_fan_speeds(); + thermalManager.disable_all_heaters(); + ui.return_to_status(); + } + +#endif // HAS_TEMP_HOTEND || HAS_HEATED_BED + +void menu_temperature() { + #if HAS_TEMP_HOTEND || HAS_HEATED_BED + bool has_heat = false; + #if HAS_TEMP_HOTEND + HOTEND_LOOP() if (thermalManager.temp_hotend[HOTEND_INDEX].target) { has_heat = true; break; } + #endif + #endif + + START_MENU(); + BACK_ITEM(MSG_MAIN); + + // + // Nozzle: + // 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); }); + #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); }); + #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)); + #endif + + // + // Bed: + // + #if HAS_HEATED_BED + EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); + #endif + + // + // Chamber: + // + #if HAS_HEATED_CHAMBER + EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + #endif + + // + // Fan Speed: + // + #if HAS_FAN + + DEFINE_SINGLENOZZLE_ITEM(); + + #if HAS_FAN0 + _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); + #endif + #if HAS_FAN1 + FAN_EDIT_ITEMS(1); + #elif SNFAN(1) + singlenozzle_item(1); + #endif + #if HAS_FAN2 + FAN_EDIT_ITEMS(2); + #elif SNFAN(2) + singlenozzle_item(2); + #endif + #if HAS_FAN3 + FAN_EDIT_ITEMS(3); + #elif SNFAN(3) + singlenozzle_item(3); + #endif + #if HAS_FAN4 + FAN_EDIT_ITEMS(4); + #elif SNFAN(4) + singlenozzle_item(4); + #endif + #if HAS_FAN5 + FAN_EDIT_ITEMS(5); + #elif SNFAN(5) + singlenozzle_item(5); + #endif + #if HAS_FAN6 + FAN_EDIT_ITEMS(6); + #elif SNFAN(6) + singlenozzle_item(6); + #endif + #if HAS_FAN7 + FAN_EDIT_ITEMS(7); + #elif SNFAN(7) + singlenozzle_item(7); + #endif + + #endif // HAS_FAN + + #if PREHEAT_COUNT + // + // Preheat for Materials 1 to 5 + // + 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 + + #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 + + END_MENU(); +} + +#endif // HAS_LCD_MENU && HAS_TEMPERATURE diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp new file mode 100644 index 00000000..402ee41a --- /dev/null +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -0,0 +1,264 @@ +/** + * 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 . + * + */ + +// +// TMC Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU && HAS_TRINAMIC_CONFIG + +#include "menu_item.h" +#include "../../module/stepper/indirection.h" +#include "../../feature/tmc_util.h" + +#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_P(uint16_4, PSTR(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) + +void menu_tmc_current() { + START_MENU(); + BACK_ITEM(MSG_TMC_DRIVERS); + #if AXIS_IS_TMC(X) + TMC_EDIT_STORED_I_RMS(X, STR_X); + #endif + #if AXIS_IS_TMC(Y) + TMC_EDIT_STORED_I_RMS(Y, STR_Y); + #endif + #if AXIS_IS_TMC(Z) + TMC_EDIT_STORED_I_RMS(Z, STR_Z); + #endif + #if AXIS_IS_TMC(X2) + TMC_EDIT_STORED_I_RMS(X2, STR_X2); + #endif + #if AXIS_IS_TMC(Y2) + TMC_EDIT_STORED_I_RMS(Y2, STR_Y2); + #endif + #if AXIS_IS_TMC(Z2) + TMC_EDIT_STORED_I_RMS(Z2, STR_Z2); + #endif + #if AXIS_IS_TMC(Z3) + TMC_EDIT_STORED_I_RMS(Z3, STR_Z3); + #endif + #if AXIS_IS_TMC(Z4) + TMC_EDIT_STORED_I_RMS(Z4, STR_Z4); + #endif + #if AXIS_IS_TMC(E0) + TMC_EDIT_STORED_I_RMS(E0, LCD_STR_E0); + #endif + #if AXIS_IS_TMC(E1) + TMC_EDIT_STORED_I_RMS(E1, LCD_STR_E1); + #endif + #if AXIS_IS_TMC(E2) + TMC_EDIT_STORED_I_RMS(E2, LCD_STR_E2); + #endif + #if AXIS_IS_TMC(E3) + TMC_EDIT_STORED_I_RMS(E3, LCD_STR_E3); + #endif + #if AXIS_IS_TMC(E4) + TMC_EDIT_STORED_I_RMS(E4, LCD_STR_E4); + #endif + #if AXIS_IS_TMC(E5) + TMC_EDIT_STORED_I_RMS(E5, LCD_STR_E5); + #endif + #if AXIS_IS_TMC(E6) + TMC_EDIT_STORED_I_RMS(E6, LCD_STR_E6); + #endif + #if AXIS_IS_TMC(E7) + TMC_EDIT_STORED_I_RMS(E7, LCD_STR_E7); + #endif + END_MENU(); +} + +#if ENABLED(HYBRID_THRESHOLD) + + #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_P(uint8, PSTR(STR), &stepper##ST.stored.hybrid_thrs, 0, 255, []{ stepper##ST.refresh_hybrid_thrs(); }); + + void menu_tmc_hybrid_thrs() { + START_MENU(); + BACK_ITEM(MSG_TMC_DRIVERS); + #if AXIS_HAS_STEALTHCHOP(X) + TMC_EDIT_STORED_HYBRID_THRS(X, STR_X); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_EDIT_STORED_HYBRID_THRS(X2, STR_X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_EDIT_STORED_HYBRID_THRS(Y2, STR_Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_EDIT_STORED_HYBRID_THRS(Z2, STR_Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_EDIT_STORED_HYBRID_THRS(Z3, STR_Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + TMC_EDIT_STORED_HYBRID_THRS(Z4, STR_Z4); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_EDIT_STORED_HYBRID_THRS(E0, LCD_STR_E0); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + TMC_EDIT_STORED_HYBRID_THRS(E1, LCD_STR_E1); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + TMC_EDIT_STORED_HYBRID_THRS(E2, LCD_STR_E2); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + TMC_EDIT_STORED_HYBRID_THRS(E3, LCD_STR_E3); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + TMC_EDIT_STORED_HYBRID_THRS(E4, LCD_STR_E4); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + TMC_EDIT_STORED_HYBRID_THRS(E5, LCD_STR_E5); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + TMC_EDIT_STORED_HYBRID_THRS(E6, LCD_STR_E6); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + TMC_EDIT_STORED_HYBRID_THRS(E7, LCD_STR_E7); + #endif + END_MENU(); + } + +#endif + +#if ENABLED(SENSORLESS_HOMING) + + #define TMC_EDIT_STORED_SGT(ST) EDIT_ITEM_P(int4, PSTR(STR_##ST), &stepper##ST.stored.homing_thrs, stepper##ST.sgt_min, stepper##ST.sgt_max, []{ stepper##ST.refresh_homing_thrs(); }); + + void menu_tmc_homing_thrs() { + START_MENU(); + BACK_ITEM(MSG_TMC_DRIVERS); + #if X_SENSORLESS + TMC_EDIT_STORED_SGT(X); + #if X2_SENSORLESS + TMC_EDIT_STORED_SGT(X2); + #endif + #endif + #if Y_SENSORLESS + TMC_EDIT_STORED_SGT(Y); + #if Y2_SENSORLESS + TMC_EDIT_STORED_SGT(Y2); + #endif + #endif + #if Z_SENSORLESS + TMC_EDIT_STORED_SGT(Z); + #if Z2_SENSORLESS + TMC_EDIT_STORED_SGT(Z2); + #endif + #if Z3_SENSORLESS + TMC_EDIT_STORED_SGT(Z3); + #endif + #if Z4_SENSORLESS + TMC_EDIT_STORED_SGT(Z4); + #endif + #endif + END_MENU(); + } + +#endif + +#if HAS_STEALTHCHOP + + #define TMC_EDIT_STEP_MODE(ST, STR) EDIT_ITEM_P(bool, PSTR(STR), &stepper##ST.stored.stealthChop_enabled, []{ stepper##ST.refresh_stepping_mode(); }) + + void menu_tmc_step_mode() { + START_MENU(); + STATIC_ITEM(MSG_TMC_STEALTH_ENABLED); + BACK_ITEM(MSG_TMC_DRIVERS); + #if AXIS_HAS_STEALTHCHOP(X) + TMC_EDIT_STEP_MODE(X, STR_X); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + TMC_EDIT_STEP_MODE(Y, STR_Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + TMC_EDIT_STEP_MODE(Z, STR_Z); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + TMC_EDIT_STEP_MODE(X2, STR_X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + TMC_EDIT_STEP_MODE(Y2, STR_Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + TMC_EDIT_STEP_MODE(Z2, STR_Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + TMC_EDIT_STEP_MODE(Z3, STR_Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + TMC_EDIT_STEP_MODE(Z4, STR_Z4); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + TMC_EDIT_STEP_MODE(E0, LCD_STR_E0); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + TMC_EDIT_STEP_MODE(E1, LCD_STR_E1); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + TMC_EDIT_STEP_MODE(E2, LCD_STR_E2); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + TMC_EDIT_STEP_MODE(E3, LCD_STR_E3); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + TMC_EDIT_STEP_MODE(E4, LCD_STR_E4); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + TMC_EDIT_STEP_MODE(E5, LCD_STR_E5); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + TMC_EDIT_STEP_MODE(E6, LCD_STR_E6); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + TMC_EDIT_STEP_MODE(E7, LCD_STR_E7); + #endif + END_MENU(); + } + +#endif + +void menu_tmc() { + START_MENU(); + BACK_ITEM(MSG_CONTROL); + SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); + #if ENABLED(HYBRID_THRESHOLD) + SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs); + #endif + #if ENABLED(SENSORLESS_HOMING) + SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs); + #endif + #if HAS_STEALTHCHOP + SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode); + #endif + END_MENU(); +} + +#endif // HAS_TRINAMIC_CONFIG 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 00000000..96eae229 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -0,0 +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 BOTH(HAS_LCD_MENU, TOUCH_SCREEN_CALIBRATION) + +#include "menu_item.h" +#include "../ultralcd.h" + +void touch_screen_calibration() { + + ui.touch_calibration(); + +} + +#endif // TOUCH_SCREEN_CALIBRATION diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp new file mode 100644 index 00000000..6bf5c3a1 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_tune.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 . + * + */ + +// +// Tune Menu +// + +#include "../../inc/MarlinConfigPre.h" + +#if HAS_LCD_MENU + +#include "menu_item.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/temperature.h" +#include "../../MarlinCore.h" + +#if HAS_LEVELING + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(SINGLENOZZLE) + #include "../../module/tool_change.h" +#endif + +#if ENABLED(BABYSTEPPING) + + #include "../../feature/babystep.h" + #include "../lcdprint.h" + #if HAS_MARLINUI_U8GLIB + #include "../dogm/ultralcd_DOGM.h" + #endif + + void _lcd_babystep(const AxisEnum axis, PGM_P const msg) { + if (ui.use_click()) return ui.goto_previous_screen_no_defer(); + if (ui.encoderPosition) { + const int16_t steps = int16_t(ui.encoderPosition) * ( + #if ENABLED(BABYSTEP_XY) + axis == X_AXIS ? BABYSTEP_SIZE_X : + axis == Y_AXIS ? BABYSTEP_SIZE_Y : + #endif + BABYSTEP_SIZE_Z + ); + ui.encoderPosition = 0; + ui.refresh(LCDVIEW_REDRAW_NOW); + babystep.add_steps(axis, steps); + } + if (ui.should_draw()) { + const float spm = planner.steps_to_mm[axis]; + MenuEditItemBase::draw_edit_screen(msg, BABYSTEP_TO_STR(spm * babystep.accum)); + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) + const bool in_view = TERN1(HAS_MARLINUI_U8GLIB, PAGE_CONTAINS(LCD_PIXEL_HEIGHT - MENU_FONT_HEIGHT, LCD_PIXEL_HEIGHT - 1)); + if (in_view) { + TERN_(HAS_MARLINUI_U8GLIB, ui.set_font(FONT_MENU)); + lcd_moveto(0, TERN(HAS_MARLINUI_U8GLIB, LCD_PIXEL_HEIGHT - MENU_FONT_DESCENT, LCD_HEIGHT - 1)); + lcd_put_u8str_P(GET_TEXT(MSG_BABYSTEP_TOTAL)); + lcd_put_wchar(':'); + lcd_put_u8str(BABYSTEP_TO_STR(spm * babystep.axis_total[BS_TOTAL_IND(axis)])); + } + #endif + } + } + + inline void _lcd_babystep_go(const screenFunc_t screen) { + ui.goto_screen(screen); + ui.defer_status_screen(); + babystep.accum = 0; + } + + #if ENABLED(BABYSTEP_XY) + void _lcd_babystep_x() { _lcd_babystep(X_AXIS, GET_TEXT(MSG_BABYSTEP_X)); } + void _lcd_babystep_y() { _lcd_babystep(Y_AXIS, GET_TEXT(MSG_BABYSTEP_Y)); } + #endif + + #if DISABLED(BABYSTEP_ZPROBE_OFFSET) + void _lcd_babystep_z() { _lcd_babystep(Z_AXIS, GET_TEXT(MSG_BABYSTEP_Z)); } + void lcd_babystep_z() { _lcd_babystep_go(_lcd_babystep_z); } + #endif + +#endif // BABYSTEPPING + +void menu_tune() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + // + // Speed: + // + EDIT_ITEM(int3, MSG_SPEED, &feedrate_percentage, 10, 999); + + // + // Manual bed leveling, Bed Z: + // + #if BOTH(MESH_BED_LEVELING, LCD_BED_LEVELING) + EDIT_ITEM(float43, MSG_BED_Z, &mbl.z_offset, -1, 1); + #endif + + // + // Nozzle: + // Nozzle [1-4]: + // + #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); }); + #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); }); + #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); + #endif + + // + // Bed: + // + #if HAS_HEATED_BED + EDIT_ITEM_FAST(int3, MSG_BED, &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); + #endif + + // + // Fan Speed: + // + #if HAS_FAN + + DEFINE_SINGLENOZZLE_ITEM(); + + #if HAS_FAN0 + _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); + #endif + #if HAS_FAN1 + FAN_EDIT_ITEMS(1); + #elif SNFAN(1) + singlenozzle_item(1); + #endif + #if HAS_FAN2 + FAN_EDIT_ITEMS(2); + #elif SNFAN(2) + singlenozzle_item(2); + #endif + #if HAS_FAN3 + FAN_EDIT_ITEMS(3); + #elif SNFAN(3) + singlenozzle_item(3); + #endif + #if HAS_FAN4 + FAN_EDIT_ITEMS(4); + #elif SNFAN(4) + singlenozzle_item(4); + #endif + #if HAS_FAN5 + FAN_EDIT_ITEMS(5); + #elif SNFAN(5) + singlenozzle_item(5); + #endif + #if HAS_FAN6 + FAN_EDIT_ITEMS(6); + #elif SNFAN(6) + singlenozzle_item(6); + #endif + #if HAS_FAN7 + FAN_EDIT_ITEMS(7); + #elif SNFAN(7) + singlenozzle_item(7); + #endif + + #endif // HAS_FAN + + // + // Flow: + // + #if EXTRUDERS + EDIT_ITEM(int3, MSG_FLOW, &planner.flow_percentage[active_extruder], 10, 999, []{ planner.refresh_e_factor(active_extruder); }); + // Flow En: + #if HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_N(int3, n, MSG_FLOW_N, &planner.flow_percentage[n], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #endif + #endif + + // + // Advance K: + // + #if ENABLED(LIN_ADVANCE) && DISABLED(SLIM_LCD_MENUS) + #if EXTRUDERS == 1 + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 999); + #elif HAS_MULTI_EXTRUDER + LOOP_L_N(n, EXTRUDERS) + EDIT_ITEM_N(float42_52, n, MSG_ADVANCE_K_E, &planner.extruder_advance_K[n], 0, 999); + #endif + #endif + + // + // Babystep X: + // Babystep Y: + // Babystep Z: + // + #if ENABLED(BABYSTEPPING) + #if ENABLED(BABYSTEP_XY) + SUBMENU(MSG_BABYSTEP_X, []{ _lcd_babystep_go(_lcd_babystep_x); }); + SUBMENU(MSG_BABYSTEP_Y, []{ _lcd_babystep_go(_lcd_babystep_y); }); + #endif + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + SUBMENU(MSG_ZPROBE_ZOFFSET, lcd_babystep_zoffset); + #else + SUBMENU(MSG_BABYSTEP_Z, lcd_babystep_z); + #endif + #endif + + END_MENU(); +} + +#endif // HAS_LCD_MENU diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp new file mode 100644 index 00000000..f0f5c21b --- /dev/null +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -0,0 +1,637 @@ +/** + * 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 . + * + */ + +// +// Unified Bed Leveling Menus +// + +#include "../../inc/MarlinConfigPre.h" + +#if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) + +#include "menu_item.h" +#include "../../gcode/gcode.h" +#include "../../gcode/queue.h" +#include "../../module/motion.h" +#include "../../module/planner.h" +#include "../../module/settings.h" +#include "../../feature/bedlevel/bedlevel.h" + +static int16_t ubl_storage_slot = 0, + custom_hotend_temp = 190, + side_points = 3, + ubl_fillin_amount = 5, + ubl_height_amount = 1; + +static uint8_t n_edit_pts = 1; +static int8_t x_plot = 0, y_plot = 0; // May be negative during move + +#if HAS_HEATED_BED + static int16_t custom_bed_temp = 50; +#endif + +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) { + mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL, + ubl.encoder_diff * 0.005f / ENCODER_PULSES_PER_STEP, + ubl.encoder_diff > 0 ? 0.005f : -0.005f + ); + ubl.encoder_diff = 0; + TERN(IS_TFTGLCD_PANEL,,ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); + } + TERN_(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); + + if (ui.should_draw()) { + 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)); + } +} + +// +// 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) { + TERN_(HAS_GRAPHICAL_TFT, ui.clear_lcd()); + mesh_edit_accumulator = initial; + ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); +} + +void _lcd_z_offset_edit() { + _lcd_mesh_fine_tune(GET_TEXT(MSG_UBL_Z_OFFSET)); +} + +float lcd_z_offset_edit() { + ui.goto_screen(_lcd_z_offset_edit); + return rounded_mesh_value(); +} + +void lcd_z_offset_edit_setup(const float &initial) { + mesh_edit_accumulator = initial; + ui.goto_screen(_lcd_z_offset_edit); +} + +/** + * UBL Build Custom Mesh Command + */ +void _lcd_ubl_build_custom_mesh() { + char ubl_lcd_gcode[64]; + #if HAS_HEATED_BED + sprintf_P(ubl_lcd_gcode, PSTR("G28\nM190 S%i\nM109 S%i\nG29 P1"), custom_bed_temp, custom_hotend_temp); + #else + sprintf_P(ubl_lcd_gcode, PSTR("G28\nM109 S%i\nG29 P1"), custom_hotend_temp); + #endif + queue.inject(ubl_lcd_gcode); +} + +/** + * UBL Custom Mesh submenu + * + * << Build Mesh + * Hotend Temp: --- + * Bed Temp: --- + * Build Custom Mesh + */ +void _lcd_ubl_custom_mesh() { + START_MENU(); + BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); + #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 + ACTION_ITEM(MSG_UBL_BUILD_CUSTOM_MESH, _lcd_ubl_build_custom_mesh); + END_MENU(); +} + +/** + * UBL Adjust Mesh Height Command + */ +void _lcd_ubl_adjust_height_cmd() { + char ubl_lcd_gcode[16]; + const int ind = ubl_height_amount > 0 ? 9 : 10; + strcpy_P(ubl_lcd_gcode, PSTR("G29 P6 C -")); + sprintf_P(&ubl_lcd_gcode[ind], PSTR(".%i"), ABS(ubl_height_amount)); + queue.inject(ubl_lcd_gcode); +} + +/** + * UBL Adjust Mesh Height submenu + * + * << Edit Mesh + * Height Amount: --- + * Adjust Mesh Height + * << Info Screen + */ +void _menu_ubl_height_adjust() { + START_MENU(); + BACK_ITEM(MSG_EDIT_MESH); + EDIT_ITEM(int3, MSG_UBL_MESH_HEIGHT_AMOUNT, &ubl_height_amount, -9, 9, _lcd_ubl_adjust_height_cmd); + ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); + END_MENU(); +} + +/** + * UBL Edit Mesh submenu + * + * << UBL Tools + * Fine Tune All + * Fine Tune Closest + * - Adjust Mesh Height >> + * << Info Screen + */ +void _lcd_ubl_edit_mesh() { + START_MENU(); + BACK_ITEM(MSG_UBL_TOOLS); + GCODES_ITEM(MSG_UBL_FINE_TUNE_ALL, PSTR("G29 P4 R999 T")); + GCODES_ITEM(MSG_UBL_FINE_TUNE_CLOSEST, PSTR("G29 P4 T")); + SUBMENU(MSG_UBL_MESH_HEIGHT_ADJUST, _menu_ubl_height_adjust); + ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); + END_MENU(); +} + +#if ENABLED(G26_MESH_VALIDATION) + + /** + * UBL Validate Custom Mesh Command + */ + void _lcd_ubl_validate_custom_mesh() { + char ubl_lcd_gcode[24]; + 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 + , custom_bed_temp + #endif + ); + queue.inject(ubl_lcd_gcode); + } + + /** + * UBL Validate Mesh submenu + * + * << UBL Tools + * 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 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(); + } + +#endif + +/** + * UBL Grid Leveling submenu + * + * << UBL Tools + * Side points: --- + * Level Mesh + */ +void _lcd_ubl_grid_level() { + START_MENU(); + BACK_ITEM(MSG_UBL_TOOLS); + EDIT_ITEM(int3, MSG_UBL_SIDE_POINTS, &side_points, 2, 6); + ACTION_ITEM(MSG_UBL_MESH_LEVEL, []{ + char ubl_lcd_gcode[12]; + sprintf_P(ubl_lcd_gcode, PSTR("G29 J%i"), side_points); + queue.inject(ubl_lcd_gcode); + }); + END_MENU(); +} + +/** + * UBL Mesh Leveling submenu + * + * << UBL Tools + * 3-Point Mesh Leveling + * - Grid Mesh Leveling >> + * << Info Screen + */ +void _lcd_ubl_mesh_leveling() { + START_MENU(); + BACK_ITEM(MSG_UBL_TOOLS); + GCODES_ITEM(MSG_UBL_3POINT_MESH_LEVELING, PSTR("G29 J0")); + SUBMENU(MSG_UBL_GRID_MESH_LEVELING, _lcd_ubl_grid_level); + ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); + END_MENU(); +} + +/** + * UBL Fill-in Amount Mesh Command + */ +void _lcd_ubl_fillin_amount_cmd() { + char ubl_lcd_gcode[18]; + sprintf_P(ubl_lcd_gcode, PSTR("G29 P3 R C.%i"), ubl_fillin_amount); + gcode.process_subcommands_now(ubl_lcd_gcode); +} + +/** + * UBL Fill-in Mesh submenu + * + * << Build Mesh + * Fill-in Amount: --- + * Fill-in Mesh + * Smart Fill-in + * Manual Fill-in + * << Info Screen + */ +void _menu_ubl_fillin() { + START_MENU(); + BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); + EDIT_ITEM(int3, MSG_UBL_FILLIN_AMOUNT, &ubl_fillin_amount, 0, 9, _lcd_ubl_fillin_amount_cmd); + GCODES_ITEM(MSG_UBL_SMART_FILLIN, PSTR("G29 P3 T0")); + GCODES_ITEM(MSG_UBL_MANUAL_FILLIN, PSTR("G29 P2 B T0")); + ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); + END_MENU(); +} + +void _lcd_ubl_invalidate() { + ubl.invalidate(); + SERIAL_ECHOLNPGM("Mesh invalidated."); +} + +/** + * UBL Build Mesh submenu + * + * << UBL Tools + * Build Mesh with Material 1 up to 5 + * - Build Custom Mesh >> + * Build Cold Mesh + * - Fill-in Mesh >> + * Continue Bed Mesh + * Invalidate All + * Invalidate Closest + * << Info Screen + */ +void _lcd_ubl_build_mesh() { + START_MENU(); + BACK_ITEM(MSG_UBL_TOOLS); + #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); + GCODES_ITEM(MSG_UBL_CONTINUE_MESH, PSTR("G29 P1 C")); + ACTION_ITEM(MSG_UBL_INVALIDATE_ALL, _lcd_ubl_invalidate); + GCODES_ITEM(MSG_UBL_INVALIDATE_CLOSEST, PSTR("G29 I")); + ACTION_ITEM(MSG_INFO_SCREEN, ui.return_to_status); + END_MENU(); +} + +/** + * UBL Load / Save Mesh Commands + */ +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 %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 + * + * << Unified Bed Leveling + * Memory Slot: --- + * Load Bed Mesh + * Save Bed Mesh + */ +void _lcd_ubl_storage_mesh() { + int16_t a = settings.calc_num_meshes(); + START_MENU(); + BACK_ITEM(MSG_UBL_LEVEL_BED); + if (!WITHIN(ubl_storage_slot, 0, a - 1)) + STATIC_ITEM(MSG_UBL_NO_STORAGE); + else { + EDIT_ITEM(int3, MSG_UBL_STORAGE_SLOT, &ubl_storage_slot, 0, a - 1); + ACTION_ITEM(MSG_UBL_LOAD_MESH, _lcd_ubl_load_mesh_cmd); + ACTION_ITEM(MSG_UBL_SAVE_MESH, _lcd_ubl_save_mesh_cmd); + } + END_MENU(); +} + +/** + * UBL LCD "radar" map point editing + */ +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); + snprintf_P(ubl_lcd_gcode, sizeof(ubl_lcd_gcode), PSTR("G29 P4 X%s Y%s R%i"), str, str2, int(n_edit_pts)); + queue.inject(ubl_lcd_gcode); +} + +/** + * UBL LCD Map Movement + */ +void ubl_map_move_to_xy() { + + #if ENABLED(DELTA) + 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_fast_move_to_destination(homing_feedrate(Z_AXIS)); // Set current_position from destination + } + #endif + + // 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 ubl_map_screen() { + // static millis_t next_move = 0; + // const millis_t ms = millis(); + + uint8_t x, y; + + if (ui.first_page) { + + // On click send "G29 P4 ..." to edit the Z value + if (ui.use_click()) { + _lcd_ubl_map_edit_cmd(); + return; + } + + ui.defer_status_screen(); + + #if IS_KINEMATIC + // Index of the mesh point upon entry + 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 + + do { + // Now, keep the encoder position within range + 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); + 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 + 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 + + // Refresh is also set by encoder movement + //if (int32_t(ui.encoderPosition) != grid_index(x, y)) + // ui.refresh(LCDVIEW_CALL_REDRAW_NEXT); + } + + // Draw the grid point based on the encoder + x = ui.encoderPosition % (GRID_MAX_POINTS_X); + y = ui.encoderPosition / (GRID_MAX_POINTS_X); + + if (ui.should_draw()) ui.ubl_plot(x, y); + + // 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 _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); + } + ui.goto_screen(_ubl_map_screen_homing); // Go to the "Homing" screen +} + +/** + * UBL Output map submenu + * + * << Unified Bed Leveling + * Output for Host + * Output for CSV + * Off Printer Backup + */ +void _lcd_ubl_output_map() { + START_MENU(); + BACK_ITEM(MSG_UBL_LEVEL_BED); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_HOST, PSTR("G29 T0")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_CSV, PSTR("G29 T1")); + GCODES_ITEM(MSG_UBL_OUTPUT_MAP_BACKUP, PSTR("G29 S-1")); + END_MENU(); +} + +/** + * UBL Tools submenu + * + * << Unified Bed Leveling + * - Build Mesh >> + * - Validate Mesh >> + * - Edit Mesh >> + * - Mesh Leveling >> + */ +void _menu_ubl_tools() { + START_MENU(); + 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")); + #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(); +} + +#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 + * + * << Motion + * - Manually Build Mesh >> + * - Activate UBL >> + * - Deactivate UBL >> + * - Step-By-Step UBL >> + * - Mesh Storage >> + * - Output Map >> + * - UBL Tools >> + * - Output UBL Info >> + */ +void _lcd_ubl_level_bed() { + START_MENU(); + BACK_ITEM(MSG_MOTION); + if (planner.leveling_active) + GCODES_ITEM(MSG_UBL_DEACTIVATE_MESH, PSTR("G29 D")); + else + GCODES_ITEM(MSG_UBL_ACTIVATE_MESH, PSTR("G29 A")); + #if ENABLED(G26_MESH_VALIDATION) + SUBMENU(MSG_UBL_STEP_BY_STEP_MENU, _lcd_ubl_step_by_step); + #endif + 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); + GCODES_ITEM(MSG_UBL_INFO_UBL, PSTR("G29 W")); + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + editable.decimal = planner.z_fade_height; + EDIT_ITEM_FAST(float3, MSG_Z_FADE_HEIGHT, &editable.decimal, 0, 100, []{ set_z_fade_height(editable.decimal); }); + #endif + END_MENU(); +} + +#endif // HAS_LCD_MENU && AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/lcd/scaled_tft.h b/Marlin/src/lcd/scaled_tft.h new file mode 100644 index 00000000..2c05e5f2 --- /dev/null +++ b/Marlin/src/lcd/scaled_tft.h @@ -0,0 +1,55 @@ +/** + * 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 GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 2 +#endif + +#ifndef TFT_WIDTH + #if GRAPHICAL_TFT_UPSCALE == 3 + #define TFT_WIDTH 480 + #else + #define TFT_WIDTH 320 + #endif +#endif +#ifndef TFT_HEIGHT + #if GRAPHICAL_TFT_UPSCALE == 3 + #define TFT_HEIGHT 320 + #else + #define TFT_HEIGHT 240 + #endif +#endif + +#ifndef TFT_PIXEL_OFFSET_X + #if GRAPHICAL_TFT_UPSCALE == 2 + #define TFT_PIXEL_OFFSET_X 32 + #else + #define TFT_PIXEL_OFFSET_X 48 + #endif +#endif +#ifndef TFT_PIXEL_OFFSET_Y + // 32 is better for both 320x240 and 480x320 + #define TFT_PIXEL_OFFSET_Y 32 +#endif diff --git a/Marlin/src/lcd/tft/bitmaps/back.bmp b/Marlin/src/lcd/tft/bitmaps/back.bmp new file mode 100644 index 00000000..5ad1f825 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/back.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/bed.bmp b/Marlin/src/lcd/tft/bitmaps/bed.bmp new file mode 100644 index 00000000..842174f8 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/bed.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/bed_heated.bmp b/Marlin/src/lcd/tft/bitmaps/bed_heated.bmp new file mode 100644 index 00000000..f029ec53 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/bed_heated.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp b/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp new file mode 100644 index 00000000..04e879db Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/btn_64x52_rounded.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/cancel.bmp b/Marlin/src/lcd/tft/bitmaps/cancel.bmp new file mode 100644 index 00000000..4a2b1e48 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/cancel.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/chamber.bmp b/Marlin/src/lcd/tft/bitmaps/chamber.bmp new file mode 100644 index 00000000..d840b5f1 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/chamber.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp b/Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp new file mode 100644 index 00000000..3d23370a Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/chamber_heated.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/confirm.bmp b/Marlin/src/lcd/tft/bitmaps/confirm.bmp new file mode 100644 index 00000000..076fa578 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/confirm.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/decrease.bmp b/Marlin/src/lcd/tft/bitmaps/decrease.bmp new file mode 100644 index 00000000..ec371537 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/decrease.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/directory.bmp b/Marlin/src/lcd/tft/bitmaps/directory.bmp new file mode 100644 index 00000000..994abc70 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/directory.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/down.bmp b/Marlin/src/lcd/tft/bitmaps/down.bmp new file mode 100644 index 00000000..42ff4e5c Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/down.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan0.bmp b/Marlin/src/lcd/tft/bitmaps/fan0.bmp new file mode 100644 index 00000000..558dbe4f Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/fan0.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan1.bmp b/Marlin/src/lcd/tft/bitmaps/fan1.bmp new file mode 100644 index 00000000..6da6f329 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/fan1.bmp differ 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 00000000..bd0de9a1 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/fan_fast0.bmp differ 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 00000000..6da67fa4 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/fan_fast1.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp b/Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp new file mode 100644 index 00000000..45bc8e33 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/fan_slow0.bmp differ 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 00000000..79d284b7 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/fan_slow1.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/feedrate.bmp b/Marlin/src/lcd/tft/bitmaps/feedrate.bmp new file mode 100644 index 00000000..dcc50bcb Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/feedrate.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/flowrate.bmp b/Marlin/src/lcd/tft/bitmaps/flowrate.bmp new file mode 100644 index 00000000..739375bd Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/flowrate.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/home.bmp b/Marlin/src/lcd/tft/bitmaps/home.bmp new file mode 100644 index 00000000..03d3d82a Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/home.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/hotend.bmp b/Marlin/src/lcd/tft/bitmaps/hotend.bmp new file mode 100644 index 00000000..ed24b601 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/hotend.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/increase.bmp b/Marlin/src/lcd/tft/bitmaps/increase.bmp new file mode 100644 index 00000000..53d71d0c Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/increase.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/left.bmp b/Marlin/src/lcd/tft/bitmaps/left.bmp new file mode 100644 index 00000000..3a2b8c33 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/left.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/leveling.bmp b/Marlin/src/lcd/tft/bitmaps/leveling.bmp new file mode 100644 index 00000000..34866402 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/leveling.bmp differ 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 00000000..d94d3efd Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-1500x319.png differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png new file mode 100644 index 00000000..d3cd15ff Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-195x59.png differ 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 00000000..f68708a8 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255-greyscale.png differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png new file mode 100644 index 00000000..e6231758 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-228x255.png differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png new file mode 100644 index 00000000..da61c1af Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-280x200.png differ 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 00000000..744ba0e8 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-320x240.png differ 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 00000000..4959ca67 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x319.png differ diff --git a/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png new file mode 100644 index 00000000..ed30e04b Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/marlin-logo/Marlin-480x320.png differ diff --git a/Marlin/src/lcd/tft/bitmaps/menu.bmp b/Marlin/src/lcd/tft/bitmaps/menu.bmp new file mode 100644 index 00000000..b4ecc485 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/menu.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/pause.bmp b/Marlin/src/lcd/tft/bitmaps/pause.bmp new file mode 100644 index 00000000..9c42f006 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/pause.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/refresh.bmp b/Marlin/src/lcd/tft/bitmaps/refresh.bmp new file mode 100644 index 00000000..421b765c Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/refresh.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/right.bmp b/Marlin/src/lcd/tft/bitmaps/right.bmp new file mode 100644 index 00000000..0e2cd829 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/right.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/sd.bmp b/Marlin/src/lcd/tft/bitmaps/sd.bmp new file mode 100644 index 00000000..dff13a29 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/sd.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/settings.bmp b/Marlin/src/lcd/tft/bitmaps/settings.bmp new file mode 100644 index 00000000..c6c5bc42 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/settings.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/up.bmp b/Marlin/src/lcd/tft/bitmaps/up.bmp new file mode 100644 index 00000000..94afd125 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/up.bmp differ diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp new file mode 100644 index 00000000..f6a5046b --- /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 00000000..295ea038 --- /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 00000000..cc328e88 --- /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 00000000..ade8bf23 --- /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 00000000..12efb3ba --- /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 00000000..a27ea436 --- /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 00000000..bb5f6ccf --- /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 00000000..1d02ebb0 --- /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/images/back_32x32x4.cpp b/Marlin/src/lcd/tft/images/back_32x32x4.cpp new file mode 100644 index 00000000..84a6e3ab --- /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 00000000..49c4a84a --- /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 00000000..2308917b --- /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 00000000..2545f845 --- /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 00000000..08994071 --- /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 00000000..3ed61a1b --- /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 00000000..cad6f1fe --- /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 00000000..b90228af --- /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/btn_rounded_64x52x4.cpp b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp new file mode 100644 index 00000000..4768f7e5 --- /dev/null +++ b/Marlin/src/lcd/tft/images/btn_rounded_64x52x4.cpp @@ -0,0 +1,82 @@ +/** + * 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 btn_rounded_64x52x4[1664] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 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, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, + 0x88, 0x88, 0x79, 0xCE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x87, 0x77, 0x78, + 0x88, 0x78, 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, 0xFF, 0xFB, 0x66, 0x78, + 0x88, 0x8D, 0xFF, 0xB8, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x7B, 0xFF, 0xC6, 0x67, + 0x87, 0xBF, 0xF7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6F, 0xF9, 0x56, + 0x87, 0xEF, 0x84, 0x44, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x58, 0xFD, 0x46, + 0x87, 0xFF, 0x54, 0x44, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xFF, 0x45, + 0x87, 0xFF, 0x44, 0x45, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, 0xFF, 0x45, + 0x87, 0xFF, 0x44, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x77, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 0x56, 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, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xFF, 0x44, 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, 0x87, 0xFF, 0x44, + 0x87, 0xEF, 0x84, 0x56, 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, 0x7A, 0xFE, 0x44, + 0x87, 0xAF, 0xF6, 0x56, 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x9F, 0xF9, 0x44, + 0x87, 0x7D, 0xFF, 0xB8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x9C, 0xFF, 0xD4, 0x45, + 0x87, 0x76, 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, 0xFB, 0x54, 0x45, + 0x87, 0x76, 0x56, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x64, 0x44, 0x46, + 0x87, 0x77, 0x65, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x56, + 0x88, 0x77, 0x76, 0x55, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x55, 0x67, + 0x88, 0x77, 0x77, 0x66, 0x65, 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, 0x66, 0x78, + 0x88, 0x88, 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, 0x66, 0x67, 0x77, 0x78, +}; + +#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 00000000..a315e2df --- /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 00000000..23722f61 --- /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 00000000..ff623ed3 --- /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 00000000..b5867009 --- /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 00000000..5fa55c84 --- /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 00000000..eabf6f97 --- /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 00000000..1a154a6e --- /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 00000000..4586954c --- /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 00000000..7bbd149a --- /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 00000000..52f9124f --- /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 00000000..2259472f --- /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 00000000..5382ff75 --- /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/home_64x64x4.cpp b/Marlin/src/lcd/tft/images/home_64x64x4.cpp new file mode 100644 index 00000000..27384c99 --- /dev/null +++ b/Marlin/src/lcd/tft/images/home_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 home_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, 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, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x67, 0x88, 0x76, 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, 0x86, 0x9D, 0xFF, 0xEA, 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, 0x69, 0xFF, 0xFF, 0xFF, 0xC6, 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, 0x9F, 0xFF, 0xFF, 0xFF, 0xFC, 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, 0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 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, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xEB, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x40, 0xBF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF6, 0x54, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x57, 0xFF, 0x80, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xBF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, 0x88, + 0x88, 0x86, 0x9F, 0xFF, 0xFF, 0xFF, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xAF, 0xFF, 0xFF, 0xFC, 0x67, 0x88, 0x88, + 0x88, 0x69, 0xFF, 0xFF, 0xFF, 0xF5, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB, 0xFF, 0xFF, 0xFF, 0xC6, 0x78, 0x88, + 0x87, 0x7F, 0xFF, 0xFF, 0xFF, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0xBF, 0xFF, 0xFF, 0xFB, 0x68, 0x88, + 0x87, 0x7F, 0xFF, 0xFF, 0xF7, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xB, 0xFF, 0xFF, 0xFD, 0x67, 0x88, + 0x87, 0x3D, 0xFF, 0xFF, 0x75, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x30, 0xBF, 0xFF, 0xFA, 0x68, 0x88, + 0x88, 0x44, 0xCE, 0xD7, 0x58, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x74, 0x19, 0xEE, 0xA6, 0x88, 0x88, + 0x88, 0x73, 0x24, 0x56, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x52, 0x35, 0x68, 0x88, 0x88, + 0x88, 0x87, 0x66, 0x78, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x87, 0x67, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 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, 0x49, 0xFF, 0xFF, 0xFF, 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, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x55, 0x55, 0x55, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x44, 0x44, 0x44, 0x12, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0x88, 0x88, 0x88, 0x72, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x49, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x88, 0x88, 0x88, 0x84, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x4C, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0x97, 0x88, 0x88, 0x88, 0x84, 0xAE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEA, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x32, 0x44, 0x44, 0x44, 0x44, 0x33, 0x57, 0x88, 0x88, 0x88, 0x88, 0x86, 0x43, 0x34, 0x44, 0x44, 0x44, 0x34, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x55, 0x55, 0x55, 0x55, 0x55, 0x67, 0x88, 0x88, 0x88, 0x88, 0x87, 0x65, 0x55, 0x55, 0x55, 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, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 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 00000000..7b068aa7 --- /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 00000000..710fe8e7 --- /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 00000000..486518d5 --- /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 00000000..3243d7f2 --- /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 00000000..bbbe66ab --- /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 00000000..3079b22a --- /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 00000000..f8548d28 --- /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 00000000..ab9c36ea --- /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 00000000..3f786f46 --- /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 00000000..093e7ff6 --- /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 00000000..2839cd98 --- /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 00000000..b36a028c --- /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/tft.cpp b/Marlin/src/lcd/tft/tft.cpp new file mode 100644 index 00000000..fa3c2c24 --- /dev/null +++ b/Marlin/src/lcd/tft/tft.cpp @@ -0,0 +1,42 @@ +/** + * 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" + +//#define DEBUG_GRAPHICAL_TFT +#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) +#include "../../core/debug_out.h" + +uint16_t TFT::buffer[]; + +void TFT::init() { + io.Init(); + io.InitTFT(); +} + +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 00000000..ed3d5e35 --- /dev/null +++ b/Marlin/src/lcd/tft/tft.h @@ -0,0 +1,91 @@ +/** + * 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/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 + +#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 + +class TFT { + private: + 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 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 set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { io.set_window(Xmin, Ymin, Xmax, Ymax); } + + 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 00000000..a72a079f --- /dev/null +++ b/Marlin/src/lcd/tft/tft_color.h @@ -0,0 +1,176 @@ +/** + * 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" + +#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_LIGHT_BLUE 0x061F // #00C3FF +#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 + +#ifndef COLOR_BACKGROUND + #define COLOR_BACKGROUND 0x20AC // #1E156E +#endif +#ifndef COLOR_SELECTION_BG + #define COLOR_SELECTION_BG 0x9930 // #992380 +#endif +#ifndef COLOR_WEBSITE_URL + #define COLOR_WEBSITE_URL 0x03B7 +#endif + +#ifndef COLOR_INACTIVE + #define COLOR_INACTIVE COLOR_GREY +#endif +#ifndef COLOR_COLD + #define COLOR_COLD COLOR_AQUA +#endif +#ifndef COLOR_HOTEND + #define COLOR_HOTEND COLOR_SCARLET +#endif +#ifndef COLOR_HEATED_BED + #define COLOR_HEATED_BED COLOR_DARK_ORANGE +#endif +#ifndef COLOR_CHAMBER + #define COLOR_CHAMBER COLOR_DARK_ORANGE +#endif +#ifndef COLOR_FAN + #define COLOR_FAN COLOR_AQUA +#endif + +#ifndef COLOR_AXIS_HOMED + #define COLOR_AXIS_HOMED COLOR_WHITE +#endif +#ifndef COLOR_AXIS_NOT_HOMED + #define COLOR_AXIS_NOT_HOMED COLOR_YELLOW +#endif + +#ifndef COLOR_RATE_100 + #define COLOR_RATE_100 COLOR_VIVID_GREEN +#endif +#ifndef COLOR_RATE_ALTERED + #define COLOR_RATE_ALTERED COLOR_YELLOW +#endif + +#ifndef COLOR_PRINT_TIME + #define COLOR_PRINT_TIME COLOR_AQUA +#endif + +#ifndef COLOR_PROGRESS_FRAME + #define COLOR_PROGRESS_FRAME COLOR_WHITE +#endif +#ifndef COLOR_PROGRESS_BAR + #define COLOR_PROGRESS_BAR COLOR_BLUE +#endif +#ifndef COLOR_PROGRESS_BG + #define COLOR_PROGRESS_BG COLOR_BLACK +#endif + +#ifndef COLOR_STATUS_MESSAGE + #define COLOR_STATUS_MESSAGE COLOR_YELLOW +#endif + +#ifndef COLOR_CONTROL_ENABLED + #define COLOR_CONTROL_ENABLED COLOR_WHITE +#endif +#ifndef COLOR_CONTROL_DISABLED + #define COLOR_CONTROL_DISABLED COLOR_GREY +#endif +#ifndef COLOR_CONTROL_CANCEL + #define COLOR_CONTROL_CANCEL COLOR_SCARLET +#endif +#ifndef COLOR_CONTROL_CONFIRM + #define COLOR_CONTROL_CONFIRM COLOR_VIVID_GREEN +#endif +#ifndef COLOR_BUSY + #define COLOR_BUSY COLOR_SILVER +#endif + +#ifndef COLOR_MENU_TEXT + #define COLOR_MENU_TEXT COLOR_YELLOW +#endif +#ifndef COLOR_MENU_VALUE + #define COLOR_MENU_VALUE COLOR_WHITE +#endif + +#ifndef COLOR_SLIDER + #define COLOR_SLIDER COLOR_WHITE +#endif +#ifndef COLOR_SLIDER_INACTIVE + #define COLOR_SLIDER_INACTIVE COLOR_GREY +#endif + +#ifndef COLOR_UBL + #define COLOR_UBL COLOR_WHITE +#endif + +#ifndef COLOR_TOUCH_CALIBRATION + #define COLOR_TOUCH_CALIBRATION COLOR_WHITE +#endif + +#ifndef COLOR_KILL_SCREEN_BG + #define COLOR_KILL_SCREEN_BG COLOR_MAROON +#endif +#ifndef COLOR_KILL_SCREEN_TEXT + #define COLOR_KILL_SCREEN_TEXT COLOR_WHITE +#endif diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp new file mode 100644 index 00000000..27749cb7 --- /dev/null +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -0,0 +1,71 @@ +/** + * 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 + +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 Home_64x64x4 = { (void *)home_64x64x4, 64, 64, GREYSCALE4 }; +const tImage BtnRounded_64x52x4 = { (void *)btn_rounded_64x52x4, 64, 52, 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 00000000..1f13967b --- /dev/null +++ b/Marlin/src/lcd/tft/tft_image.h @@ -0,0 +1,166 @@ +/** + * 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 home_64x64x4[]; +extern const uint8_t btn_rounded_64x52x4[]; +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, + imgHome, + imgBtn52Rounded, + 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 Home_64x64x4; +extern const tImage BtnRounded_64x52x4; +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_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp new file mode 100644 index 00000000..e77afaf7 --- /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 00000000..9aa0d5b6 --- /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 00000000..663ed97c --- /dev/null +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -0,0 +1,169 @@ +/** + * 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, 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; + uint8_t ch = uint8_t(wchar & 0x00FF); + + if (ch == '=' || ch == '~' || ch == '*') { + if (index >= 0) { + 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 (ch == '$' && itemString) { + add(itemString); + continue; + } + + add_character(ch); + } + eol(); +} + +void TFT_String::add(uint8_t *string) { + wchar_t wchar; + while (*string) { + string = get_utf8_value_cb(string, read_byte, &wchar); + if (wchar > 255) wchar |= 0x0080; + uint8_t ch = uint8_t(wchar & 0x00FF); + add_character(ch); + } + 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 00000000..924d6de4 --- /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); + 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, 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, 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); + 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 00000000..2124a42e --- /dev/null +++ b/Marlin/src/lcd/tft/touch.cpp @@ -0,0 +1,320 @@ +/** + * 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 "../ultralcd.h" // for ui methods +#include "../menu/menu_item.h" // for touch_screen_calibration + +#include "../../module/temperature.h" +#include "../../module/planner.h" + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../../feature/bedlevel/bedlevel.h" +#endif + +#include "tft.h" + +bool Touch::enabled = true; +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 +#if HAS_RESUME_CONTINUE + extern bool wait_for_user; +#endif + +void Touch::init() { + calibration_reset(); + reset(); + io.Init(); + enable(); +} + +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 (!enabled) return; + + if (now == millis()) return; + now = millis(); + + if (get_point(&_x, &_y)) { + #if HAS_RESUME_CONTINUE + // UI is waiting for a click anywhere? + if (wait_for_user) { + touch_control_type = CLICK; + ui.lcd_clicked = true; + return; + } + #endif + + #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 + + case MOVE_AXIS: + ui.goto_screen((screenFunc_t)ui.move_axis_screen); + break; + + // TODO: TOUCH could receive data to pass to the callback + case BUTTON: ((screenFunc_t)control->data)(); break; + + 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; + #if (TFT_ROTATION & TFT_ROTATE_180) + *x = TFT_WIDTH - *x; + *y = TFT_HEIGHT - *y; + #endif + } + 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 00000000..7d8f2229 --- /dev/null +++ b/Marlin/src/lcd/tft/touch.h @@ -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 . + * + */ +#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, + MOVE_AXIS, + BUTTON, +}; + +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 bool enabled; + + 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 disable() { enabled = false; } + static void enable() { enabled = true; } + + 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 00000000..de8498c5 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -0,0 +1,656 @@ +/** + * 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 vstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (vstr) + tft_string.add(vstr); + 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)); +} + +void MarlinUI::move_axis_screen() { +} + +#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 00000000..c9822f11 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_320x240.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 "../../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, + Home_64x64x4, + BtnRounded_64x52x4, +}; + +#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 00000000..3dab9418 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -0,0 +1,1068 @@ +/** + * 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); + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, 132, TFT_WIDTH - 8, 34)); + + // 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 vstr/*=nullptr*/) { + menu_item(row); + tft_string.set(pstr, itemIndex, itemString); + if (vstr) + tft_string.add(vstr); + 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)); +} + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "../../feature/babystep.h" +#endif + +#if HAS_BED_PROBE + #include "../../module/probe.h" +#endif + +#define Z_SELECTION_Z 1 +#define Z_SELECTION_Z_PROBE -1 + +struct MotionAxisState { + xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; + float currentStepSize = 10.0; + int z_selection = Z_SELECTION_Z; + uint8_t e_selection = 0; + bool homming = false; + bool blocked = false; + char message[32]; +}; + +MotionAxisState motionAxisState; + +#define E_BTN_COLOR COLOR_YELLOW +#define X_BTN_COLOR COLOR_CORAL_RED +#define Y_BTN_COLOR COLOR_VIVID_GREEN +#define Z_BTN_COLOR COLOR_LIGHT_BLUE + +#define BTN_WIDTH 64 +#define BTN_HEIGHT 52 +#define X_MARGIN 20 +#define Y_MARGIN 15 + +static void quick_feedback() { + #if HAS_CHIRP + ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? + #if BOTH(HAS_LCD_MENU, USE_BEEPER) + for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } + #elif HAS_LCD_MENU + delay(10); + #endif + #endif +} + +#define CUR_STEP_VALUE_WIDTH 104 +static void drawCurStepValue() { + tft_string.set((uint8_t *)ftostr52sp(motionAxisState.currentStepSize)); + tft_string.add("mm"); + tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string); +} + +static void drawCurZSelection() { + tft_string.set("Z"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + tft.queue.sync(); + tft_string.set("Offset"); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + } +} + +static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set("E"); + tft.add_text(0, 0, E_BTN_COLOR , tft_string); + tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); +} + +static void drawMessage(const char *msg) { + tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(0, 0, COLOR_YELLOW, msg); +} + +static void drawAxisValue(AxisEnum axis) { + const float value = + #if HAS_BED_PROBE + axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE ? + probe.offset.z : + #endif + NATIVE_TO_LOGICAL( + ui.manual_move.processing ? destination[axis] : current_position[axis] + TERN0(IS_KINEMATIC, ui.manual_move.offset), + axis + ); + xy_int_t pos; + uint16_t color; + switch (axis) { + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + default: return; + } + tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(ftostr52sp(value)); + tft.add_text(0, 0, color, tft_string); +} + +static void moveAxis(AxisEnum axis, const int8_t direction) { + quick_feedback(); + + if (axis == E_AXIS && thermalManager.temp_hotend[motionAxisState.e_selection].celsius < EXTRUDE_MINTEMP) { + drawMessage("Too cold"); + return; + } + + const float diff = motionAxisState.currentStepSize * direction; + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.steps_to_mm[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(""); // clear the error + drawAxisValue(axis); + } + else { + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + #elif HAS_BED_PROBE + // only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { + current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else { + drawMessage(""); // clear the error + } + drawAxisValue(axis); + #endif + return; + } + + if (!ui.manual_move.processing) { + // Get motion limit from software endstops, if any + float min, max; + soft_endstop.get_manual_axis_limits(axis, min, max); + + // Delta limits XY based on the current offset from center + // This assumes the center is 0,0 + #if ENABLED(DELTA) + if (axis != Z_AXIS && axis != E_AXIS) { + max = SQRT(sq((float)(DELTA_PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis + min = -max; + } + #endif + + // Get the new position + #if IS_KINEMATIC + ui.manual_move.offset += diff; + if (direction < 0) + NOLESS(ui.manual_move.offset, min - current_position[axis]); + else + NOMORE(ui.manual_move.offset, max - current_position[axis]); + #else + current_position[axis] += diff; + if (direction < 0 && current_position[axis] < min) { + current_position[axis] = min; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position[axis] > max) { + current_position[axis] = max; + drawMessage(GET_TEXT(MSG_LCD_SOFT_ENDSTOPS)); + } + else { + drawMessage(""); // clear the error + } + #endif + + ui.manual_move.soon(axis + #if MULTI_MANUAL + , motionAxisState.e_selection + #endif + ); + } + + drawAxisValue(axis); +} + +static void e_plus() { + moveAxis(E_AXIS, 1); +} + +static void e_minus() { + moveAxis(E_AXIS, -1); +} + +static void x_minus() { + moveAxis(X_AXIS, -1); +} + +static void x_plus() { + moveAxis(X_AXIS, 1); +} + +static void y_plus() { + moveAxis(Y_AXIS, 1); +} + +static void y_minus() { + moveAxis(Y_AXIS, -1); +} + +static void z_plus() { + moveAxis(Z_AXIS, 1); +} + +static void z_minus() { + moveAxis(Z_AXIS, -1); +} + +static void e_select() { + motionAxisState.e_selection++; + if (motionAxisState.e_selection >= EXTRUDERS) { + motionAxisState.e_selection = 0; + } + + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); +} + +static void do_home() { + quick_feedback(); + drawMessage(GET_TEXT(MSG_LEVEL_BED_HOMING)); + queue.inject_P(G28_STR); + // Disable touch until home is done + TERN_(HAS_TFT_XPT2046, touch.disable()); + drawAxisValue(E_AXIS); + drawAxisValue(X_AXIS); + drawAxisValue(Y_AXIS); + drawAxisValue(Z_AXIS); +} + +static void step_size() { + motionAxisState.currentStepSize = motionAxisState.currentStepSize / 10.0; + if (motionAxisState.currentStepSize < 0.0015) motionAxisState.currentStepSize = 10.0; + quick_feedback(); + drawCurStepValue(); +} + +#if HAS_BED_PROBE + static void z_select() { + motionAxisState.z_selection *= -1; + quick_feedback(); + drawCurZSelection(); + drawAxisValue(Z_AXIS); + } +#endif + +static void disable_steppers() { + quick_feedback(); + queue.inject_P(PSTR("M84")); +} + +static void drawBtn(int x, int y, const char* label, int32_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { + uint16_t width = Images[imgBtn52Rounded].width; + uint16_t height = Images[imgBtn52Rounded].height; + + if (!enabled) bgColor = COLOR_CONTROL_DISABLED; + + tft.canvas(x, y, width, height); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgBtn52Rounded, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + + // TODO: Make an add_text() taking a font arg + if (label != NULL) { + tft_string.set(label); + tft_string.trim(); + tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); + } + else { + tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); + } + + TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); +} + +void MarlinUI::move_axis_screen() { + // Reset + defer_status_screen(true); + motionAxisState.blocked = false; + TERN_(HAS_TFT_XPT2046, touch.enable()); + + ui.clear_lcd(); + + TERN_(TOUCH_SCREEN, touch.clear()); + + const bool busy = printingIsActive(); + + // if we have baby step and we are printing, select baby step + if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + + // ROW 1 -> E- Y- CurY Z+ + int x = X_MARGIN, y = Y_MARGIN, spacing = 0; + + drawBtn(x, y, "E+", (int32_t)e_plus, imgUp, E_BTN_COLOR, !busy); + + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y+", (int32_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + + // Cur Y + x += BTN_WIDTH; + motionAxisState.yValuePos.x = x + 2; + motionAxisState.yValuePos.y = y; + drawAxisValue(Y_AXIS); + + x += spacing; + drawBtn(x, y, "Z+", (int32_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // ROW 2 -> "Ex" X- HOME X+ "Z" + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; + + motionAxisState.eNamePos.x = x; + motionAxisState.eNamePos.y = y; + drawCurESelection(); + TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (int32_t)e_select)); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "X-", (int32_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; //imgHome is 64x64 + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (int32_t)do_home, imgHome, !busy)); + + x += BTN_WIDTH + spacing; + uint16_t xplus_x = x; + drawBtn(x, y, "X+", (int32_t)x_plus, imgRight, X_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + motionAxisState.zTypePos.x = x; + motionAxisState.zTypePos.y = y; + drawCurZSelection(); + #if HAS_BED_PROBE + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (int32_t)z_select); + #endif + + // ROW 3 -> E- CurX Y- Z- + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + + drawBtn(x, y, "E-", (int32_t)e_minus, imgDown, E_BTN_COLOR, !busy); + + // Cur E + motionAxisState.eValuePos.x = x; + motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(E_AXIS); + + // Cur X + motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos + motionAxisState.xValuePos.y = y - 10; + drawAxisValue(X_AXIS); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Y-", (int32_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + x += BTN_WIDTH + spacing; + drawBtn(x, y, "Z-", (int32_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + // Cur Z + motionAxisState.zValuePos.x = x; + motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; + drawAxisValue(Z_AXIS); + + // ROW 4 -> step_size disable steppers back + y = TFT_HEIGHT - Y_MARGIN - 32; // + x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; + motionAxisState.stepValuePos.x = x; + motionAxisState.stepValuePos.y = y; + if (!busy) { + drawCurStepValue(); + TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (int32_t)step_size)); + } + + // alinged with x+ + drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (int32_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + + TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); +} + +#undef BTN_WIDTH +#undef BTN_HEIGHT + +#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 00000000..053ee781 --- /dev/null +++ b/Marlin/src/lcd/tft/ui_480x320.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 "../../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, + Home_64x64x4, + BtnRounded_64x52x4, +}; + +#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/tft_io/ili9328.h b/Marlin/src/lcd/tft_io/ili9328.h new file mode 100644 index 00000000..b50517ad --- /dev/null +++ b/Marlin/src/lcd/tft_io/ili9328.h @@ -0,0 +1,173 @@ +/** + * 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_io.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 + +#if TFT_ROTATION == TFT_ROTATE_180 + #define ILI9328_DRVCTL_DATA 0x0000 + #define ILI9328_GATE_SCANCTL1_DATA 0xA700 +#else + #define ILI9328_DRVCTL_DATA ILI9328_DRVCTL_SS + #define ILI9328_GATE_SCANCTL1_DATA 0x2700 +#endif + +/* +#define ILI9328_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9328_ETMOD_AM) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9328_ETMOD_ID1) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9328_ETMOD_ID0) +*/ + +#define ILI9328_ETMOD_ORIENTATION (ILI9328_ETMOD_AM | ILI9328_ETMOD_ID1 | ILI9328_ETMOD_ID0) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ILI9328_ETMOD_COLOR ILI9328_ETMOD_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ILI9328_ETMOD_COLOR ILI9328_ETMOD_RGB +#endif + +#define ILI9328_ETMOD_DATA (ILI9328_ETMOD_ORIENTATION) | (ILI9328_ETMOD_COLOR) + + +#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), ILI9328_GATE_SCANCTL1_DATA, + 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_io/ili9341.h b/Marlin/src/lcd/tft_io/ili9341.h new file mode 100644 index 00000000..dda326df --- /dev/null +++ b/Marlin/src/lcd/tft_io/ili9341.h @@ -0,0 +1,170 @@ +/** + * 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_io.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_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9341_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9341_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9341_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ILI9341_COLOR ILI9341_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ILI9341_COLOR ILI9341_MADCTL_RGB +#endif + +#define ILI9341_MADCTL_DATA (ILI9341_ORIENTATION) | (ILI9341_COLOR) + +#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_io/ili9488.h b/Marlin/src/lcd/tft_io/ili9488.h new file mode 100644 index 00000000..e71c0d16 --- /dev/null +++ b/Marlin/src/lcd/tft_io/ili9488.h @@ -0,0 +1,164 @@ +/** + * 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_io.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_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ILI9488_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ILI9488_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ILI9488_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ILI9488_COLOR ILI9488_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ILI9488_COLOR ILI9488_MADCTL_RGB +#endif + +#define ILI9488_MADCTL_DATA (ILI9488_ORIENTATION) | (ILI9488_COLOR) + +#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_io/r65105.h b/Marlin/src/lcd/tft_io/r65105.h new file mode 100644 index 00000000..8be2afe4 --- /dev/null +++ b/Marlin/src/lcd/tft_io/r65105.h @@ -0,0 +1,176 @@ +/** + * 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_io.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 + +#if TFT_ROTATION == TFT_ROTATE_180 + #define R61505_DRVCTL_DATA 0x0000 + #define R61505_DRVCTRL_DATA (0x2700 | R61505_DRVCTRL_GS) +#else + #define R61505_DRVCTL_DATA R61505_DRVCTL_SS + #define R61505_DRVCTRL_DATA 0x2700 +#endif + +/* +#define R61505_ETMOD_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, R61505_ETMOD_AM) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, R61505_ETMOD_ID0) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, R61505_ETMOD_ID1) +*/ + +#define R61505_ETMOD_ORIENTATION (R61505_ETMOD_AM | R61505_ETMOD_ID0 | R61505_ETMOD_ID1) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define R61505_ETMOD_COLOR R61505_ETMOD_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define R61505_ETMOD_COLOR R61505_ETMOD_RGB +#endif + +#define R61505_ETMOD_DATA (R61505_ETMOD_ORIENTATION) | (R61505_ETMOD_COLOR) + + +#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_DATA, + 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_io/ssd1963.h b/Marlin/src/lcd/tft_io/ssd1963.h new file mode 100644 index 00000000..4953a962 --- /dev/null +++ b/Marlin/src/lcd/tft_io/ssd1963.h @@ -0,0 +1,131 @@ +/** + * 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_io.h" + +#include "../../inc/MarlinConfig.h" + +#define SSD1963_MADCTL_MY 0x80 // Row Address Order +#define SSD1963_MADCTL_MX 0x40 // Column Address Order +#define SSD1963_MADCTL_MV 0x20 // Row/Column Exchange +#define SSD1963_MADCTL_MH 0x10 // Horizontal Refresh Order +#define SSD1963_MADCTL_BGR 0x08 // RGB-BGR ORDER +#define SSD1963_MADCTL_RGB 0x00 +#define SSD1963_MADCTL_ML 0x04 // Vertical Refresh Order +#define SSD1963_MADCTL_FH 0x02 // Flip Horizontal +#define SSD1963_MADCTL_FV 0x01 // Flip Vertical + +#define SSD1963_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, SSD1963_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, SSD1963_MADCTL_FH) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, SSD1963_MADCTL_FV) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define SSD1963_COLOR SSD1963_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define SSD1963_COLOR SSD1963_MADCTL_RGB +#endif + +#define SSD1963_MADCTL_DATA (SSD1963_ORIENTATION) | (SSD1963_COLOR) + +#define SSD1963_NOP 0x00 // No Operation +#define SSD1963_SWRESET 0x01 // Software reset +#define SSD1963_RDDPM 0x0A // Read Display Power Mode +#define SSD1963_RDDMADCTL 0x0B // Read Display MADCTL +#define SSD1963_RDDCOLMOD 0x0C // Read Display Pixel Format +#define SSD1963_RDDIM 0x0D // Read Display Image Mode +#define SSD1963_RDDSM 0x0E // Read Display Signal Mode +#define SSD1963_SLPIN 0x10 // Sleep In +#define SSD1963_SLPOUT 0x11 // Sleep Out +#define SSD1963_PTLON 0x12 // Partial Display Mode On +#define SSD1963_NORON 0x13 // Normal Display Mode On +#define SSD1963_INVOFF 0x20 // Display Inversion Off +#define SSD1963_INVON 0x21 // Display Inversion On +#define SSD1963_GAMSET 0x26 // Gamma Set +#define SSD1963_DISPOFF 0x28 // Display Off +#define SSD1963_DISPON 0x29 // Display On +#define SSD1963_CASET 0x2A // Column Address Set +#define SSD1963_RASET 0x2B // Row Address Set +#define SSD1963_RAMWR 0x2C // Memory Write +#define SSD1963_RAMRD 0x2E // Memory Read +#define SSD1963_PTLAR 0x30 // Partial Area +#define SSD1963_VSCRDEF 0x33 // Vertical Scrolling Definition +#define SSD1963_TEOFF 0x34 // Tearing Effect Line OFF +#define SSD1963_TEON 0x35 // Tearing Effect Line ON +#define SSD1963_MADCTL 0x36 // Memory Data Access Control +#define SSD1963_VSCSAD 0x37 // Vertical Scroll Start Address of RAM +#define SSD1963_IDMOFF 0x38 // Idle Mode Off +#define SSD1963_IDMON 0x39 // Idle Mode On +#define SSD1963_WRMEMC 0x3C // Write Memory Continue +#define SSD1963_RDMEMC 0x3E // Read Memory Continue +#define SSD1963_STE 0x44 // Set Tear Scanline +#define SSD1963_GSCAN 0x45 // Get Scanline +#define SSD1963_WRDISBV 0x51 // Write Display Brightness +#define SSD1963_RDDISBV 0x52 // Read Display Brightness +#define SSD1963_WRCTRLD 0x53 // Write CTRL Display +#define SSD1963_RDCTRLD 0x54 // Read CTRL Value Display +#define SSD1963_WRCACE 0x55 // Write Content Adaptive Brightness Control and Color Enhancement +#define SSD1963_RDCABC 0x56 // Read Content Adaptive Brightness Control +#define SSD1963_WRCABCMB 0x5E // Write CABC Minimum Brightness +#define SSD1963_RDCABCMB 0x5F // Read CABC Minimum Brightness +#define SSD1963_RDABCSDR 0x68 // Read Automatic Brightness Control Self-Diagnostic Result +#define SSD1963_RDDDB 0xA1 // Read Device Descriptor Block +#define SSD1963_SLCDMODE 0xB0 // Set the LCD panel mode and resolution +#define SSD1963_SHSYNC 0xB4 // Set HSYNC +#define SSD1963_GHSYNC 0xB5 // Get HSYNC +#define SSD1963_SVSYNC 0xB6 // Set VSYNC +#define SSD1963_GVSYNC 0xB7 // Get VSYNC +#define SSD1963_SGPIOCFG 0xB8 // Set GPIO Conf +#define SSD1963_SGPIOV 0xBA // Set GPIO Value +#define SSD1963_SPWMCFG 0xBE // Set PWM Conf +#define SSD1963_GPWMCFG 0xBF // Get PWM Conf +#define SSD1963_SDBCCFG 0xD0 // Set Dynamic Back Light Config +#define SSD1963_GDBCCFG 0xD1 // Get Dynamic Back Light Config +#define SSD1963_PLLON 0xE0 // PLL Enable +#define SSD1963_PLLMN 0xE2 // Set PLL Multiplier +#define SSD1963_SLSHIFT 0xE6 // Set the LSHIFT (pixel clock) frequency +#define SSD1963_COLMOD 0xF0 // Interface Pixel Format + +static const uint16_t ssd1963_init[] = { + DATASIZE_8BIT, + ESC_REG(SSD1963_PLLMN), 0x0023, 0x0002, 0x0054, + ESC_REG(SSD1963_PLLON), 0x0001, ESC_DELAY(10), + ESC_REG(SSD1963_PLLON), 0x0003, ESC_DELAY(10), + ESC_REG(SSD1963_SWRESET), ESC_DELAY(100), + + ESC_REG(SSD1963_SLSHIFT), 0x0001, 0x001F, 0x00FF, + ESC_REG(SSD1963_SLCDMODE), 0x0020, 0x0000, 0x0001, 0x00DF, 0x0001, 0x000F, 0x0000, + ESC_REG(SSD1963_SHSYNC), 0x0002, 0x0013, 0x0000, 0x0008, 0x002B, 0x0000, 0x0002, 0x0000, + ESC_REG(SSD1963_SVSYNC), 0x0001, 0x0020, 0x0000, 0x0004, 0x000C, 0x0000, 0x0002, + ESC_REG(SSD1963_SGPIOV), 0x000F, + ESC_REG(SSD1963_SGPIOCFG), 0x0007, 0x0001, + + ESC_REG(SSD1963_MADCTL), SSD1963_MADCTL_DATA, + ESC_REG(SSD1963_COLMOD), 0x0003, ESC_DELAY(1),//RBG 565 + + ESC_REG(SSD1963_NORON), + ESC_REG(SSD1963_DISPON), + + ESC_REG(SSD1963_SPWMCFG), 0x0006, 0x00f0, 0x0001, 0x00f0, 0x0000, 0x0000, + ESC_REG(SSD1963_SDBCCFG), 0x000D, + ESC_END +}; diff --git a/Marlin/src/lcd/tft_io/st7735.h b/Marlin/src/lcd/tft_io/st7735.h new file mode 100644 index 00000000..1b0d23b6 --- /dev/null +++ b/Marlin/src/lcd/tft_io/st7735.h @@ -0,0 +1,136 @@ +/** + * 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_io.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_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7735_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7735_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7735_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB + #define ST7735_COLOR ST7735_MADCTL_RGB +#elif TFT_COLOR == TFT_COLOR_BGR + #define ST7735_COLOR ST7735_MADCTL_BGR +#endif + +#define ST7735_MADCTL_DATA (ST7735_ORIENTATION) | (ST7735_COLOR) + +#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_io/st7789v.h b/Marlin/src/lcd/tft_io/st7789v.h new file mode 100644 index 00000000..d0cf969c --- /dev/null +++ b/Marlin/src/lcd/tft_io/st7789v.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_io.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_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7789V_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7789V_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7789V_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_RGB + #define ST7789V_COLOR ST7789V_MADCTL_RGB +#elif TFT_COLOR == TFT_COLOR_BGR + #define ST7789V_COLOR ST7789V_MADCTL_BGR +#endif + +#define ST7789V_MADCTL_DATA (ST7789V_ORIENTATION) | (ST7789V_COLOR) + +#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_io/st7796s.h b/Marlin/src/lcd/tft_io/st7796s.h new file mode 100644 index 00000000..8653a49c --- /dev/null +++ b/Marlin/src/lcd/tft_io/st7796s.h @@ -0,0 +1,183 @@ +/** + * 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_io.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_ORIENTATION IF_0((TFT_ORIENTATION) & TFT_EXCHANGE_XY, ST7796S_MADCTL_MV) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_X, ST7796S_MADCTL_MX) | \ + IF_0((TFT_ORIENTATION) & TFT_INVERT_Y, ST7796S_MADCTL_MY) + +#if !defined(TFT_COLOR) || TFT_COLOR == TFT_COLOR_BGR + #define ST7796S_COLOR ST7796S_MADCTL_BGR +#elif TFT_COLOR == TFT_COLOR_RGB + #define ST7796S_COLOR ST7796S_MADCTL_RGB +#endif + +#define ST7796S_MADCTL_DATA (ST7796S_ORIENTATION) | (ST7796S_COLOR) + +#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_io/tft_io.cpp b/Marlin/src/lcd/tft_io/tft_io.cpp new file mode 100644 index 00000000..cd535458 --- /dev/null +++ b/Marlin/src/lcd/tft_io/tft_io.cpp @@ -0,0 +1,226 @@ +/** + * 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_io.h" + +#if HAS_SPI_TFT || HAS_FSMC_TFT + +#include "st7735.h" +#include "st7789v.h" +#include "st7796s.h" +#include "r65105.h" +#include "ili9328.h" +#include "ili9341.h" +#include "ili9488.h" +#include "ssd1963.h" + +#define DEBUG_OUT ENABLED(DEBUG_GRAPHICAL_TFT) +#include "../../core/debug_out.h" + +TFT_IO_DRIVER TFT_IO::io; +uint32_t TFT_IO::lcd_id = 0xFFFFFFFF; + +void TFT_IO::InitTFT() { +if (lcd_id != 0xFFFFFFFF) return; + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); + #endif + + #if PIN_EXISTS(TFT_RESET) + OUT_WRITE(TFT_RESET_PIN, HIGH); + delay(10); + OUT_WRITE(TFT_RESET_PIN, LOW); + delay(10); + OUT_WRITE(TFT_RESET_PIN, HIGH); + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) + OUT_WRITE(TFT_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); + #endif + + // io.Init(); + delay(100); + + #if TFT_DRIVER != AUTO + lcd_id = TFT_DRIVER; + #endif + + #if TFT_DRIVER == ST7735 + write_esc_sequence(st7735_init); + #elif TFT_DRIVER == SSD1963 + write_esc_sequence(ssd1963_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 SSD1963: // SSD1963 + DEBUG_ECHO_MSG(" SSD1963"); + write_esc_sequence(ssd1963_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 + case ILI9488_ID1: // 0x8066 ILI9488 480x320 + DEBUG_ECHO_MSG(" ILI9488"); + write_esc_sequence(ili9488_init); + break; + default: + lcd_id = 0; + } + #else + #error Unsupported TFT driver + #endif + + #if PIN_EXISTS(TFT_BACKLIGHT) && ENABLED(DELAYED_BACKLIGHT_INIT) + OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); + #endif +} + +void TFT_IO::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 + case SSD1963: // SSD1963 + case ILI9488_ID1: // 0x8066 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_IO::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(); +} + +#endif // HAS_SPI_TFT || HAS_FSMC_TFT diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h new file mode 100644 index 00000000..63d6936a --- /dev/null +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -0,0 +1,124 @@ +/** + * 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 || HAS_FSMC_TFT + +#if HAS_SPI_TFT + #include HAL_PATH(../../HAL, tft/tft_spi.h) +#elif HAS_FSMC_TFT + #include HAL_PATH(../../HAL, tft/tft_fsmc.h) +#else + #error "TFT IO only supports SPI or FSMC interface" +#endif + +#define TFT_EXCHANGE_XY (1UL << 1) +#define TFT_INVERT_X (1UL << 2) +#define TFT_INVERT_Y (1UL << 3) + +#define TFT_NO_ROTATION (0x00) +#define TFT_ROTATE_90 (TFT_EXCHANGE_XY | TFT_INVERT_X) +#define TFT_ROTATE_180 (TFT_INVERT_X | TFT_INVERT_Y) +#define TFT_ROTATE_270 (TFT_EXCHANGE_XY | TFT_INVERT_Y) + +#define TFT_MIRROR_X (TFT_INVERT_Y) +#define TFT_MIRROR_Y (TFT_INVERT_X) + +#define TFT_ROTATE_90_MIRROR_X (TFT_ROTATE_90 ^ TFT_INVERT_Y) +#define TFT_ROTATE_90_MIRROR_Y (TFT_ROTATE_90 ^ TFT_INVERT_X) + +#define TFT_ROTATE_180_MIRROR_X (TFT_ROTATE_180 ^ TFT_INVERT_Y) +#define TFT_ROTATE_180_MIRROR_Y (TFT_ROTATE_180 ^ TFT_INVERT_X) + +#define TFT_ROTATE_270_MIRROR_X (TFT_ROTATE_270 ^ TFT_INVERT_Y) +#define TFT_ROTATE_270_MIRROR_Y (TFT_ROTATE_270 ^ TFT_INVERT_X) + +// TFT_ROTATION is user configurable +#ifndef TFT_ROTATION + #define TFT_ROTATION TFT_NO_ROTATION +#endif + + +// TFT_ORIENTATION is the "sum" of TFT_DEFAULT_ORIENTATION plus user TFT_ROTATION +#define TFT_ORIENTATION ((TFT_DEFAULT_ORIENTATION) ^ (TFT_ROTATION)) + +#define TFT_COLOR_RGB (1UL << 3) +#define TFT_COLOR_BGR (1UL << 4) + +// Each TFT Driver is responsible for its default color mode. +// #ifndef TFT_COLOR +// #define TFT_COLOR TFT_COLOR_RGB +// #endif + +#define SSD1963 0x5761 +#define ST7735 0x89F0 +#define ST7789 0x8552 +#define ST7796 0x7796 +#define R61505 0x1505 +#define ILI9328 0x9328 +#define ILI9341 0x9341 +#define ILI9488 0x9488 +#define ILI9488_ID1 0x8066 //Some ILI9488 have 0x8066 in the 0x04 +#define LERDGE_ST7796 0xFFFE +#define AUTO 0xFFFF + +#ifndef TFT_DRIVER + #define TFT_DRIVER AUTO +#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_IO { +public: + static TFT_IO_DRIVER io; + + static void InitTFT(); + 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); + + // Deletaged methods + inline static void Init() { io.Init(); }; + inline static bool isBusy() { return io.isBusy(); }; + inline static void Abort() { io.Abort(); }; + inline static uint32_t GetID() { return io.GetID(); }; + + inline static void DataTransferBegin(uint16_t DataWidth = DATASIZE_16BIT) { io.DataTransferBegin(DataWidth); } + inline static void DataTransferEnd() { io.DataTransferEnd(); }; + // inline static void DataTransferAbort() { io.DataTransferAbort(); }; + + inline static void WriteData(uint16_t Data) { io.WriteData(Data); }; + inline static void WriteReg(uint16_t Reg) { io.WriteReg(Reg); }; + + inline static void WriteSequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); }; + // static void WriteMultiple(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + inline static void WriteMultiple(uint16_t Color, uint32_t Count) { io.WriteMultiple(Color, Count); }; + +protected: + static uint32_t lcd_id; +}; + +#endif // HAS_SPI_TFT || HAS_FSMC_TFT diff --git a/Marlin/src/lcd/thermistornames.h b/Marlin/src/lcd/thermistornames.h new file mode 100644 index 00000000..37f285d4 --- /dev/null +++ b/Marlin/src/lcd/thermistornames.h @@ -0,0 +1,146 @@ +/** + * 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 . + * + */ + +/** + * thermistornames.h + * + * Used by LCD code to obtain a thermistor name + * + * Usage: Set THERMISTOR_ID then #include this file + * to set a new value for THERMISTOR_NAME. + */ + +#undef THERMISTOR_NAME + +// User-specified thermistor parameters +#if THERMISTOR_ID == 1000 + #define THERMISTOR_NAME "User Parameters" + +// Thermcouples +#elif THERMISTOR_ID == -5 + #define THERMISTOR_NAME "MAX31865" +#elif THERMISTOR_ID == -4 + #define THERMISTOR_NAME "AD8495" +#elif THERMISTOR_ID == -3 + #define THERMISTOR_NAME "MAX31855" +#elif THERMISTOR_ID == -2 + #define THERMISTOR_NAME "MAX6675" +#elif THERMISTOR_ID == -1 + #define THERMISTOR_NAME "AD595" + +// Standard thermistors +#elif THERMISTOR_ID == 1 + #define THERMISTOR_NAME "EPCOS 100K" +#elif THERMISTOR_ID == 331 + #define THERMISTOR_NAME "3.3V EPCOS 100K (MEGA)" +#elif THERMISTOR_ID == 332 + #define THERMISTOR_NAME "3.3V EPCOS 100K (DUE)" +#elif THERMISTOR_ID == 2 + #define THERMISTOR_NAME "ATC 204GT-2" +#elif THERMISTOR_ID == 202 + #define THERMISTOR_NAME "200k Copymaster 3D" +#elif THERMISTOR_ID == 3 + #define THERMISTOR_NAME "Mendel-parts" +#elif THERMISTOR_ID == 4 + #define THERMISTOR_NAME "Generic 10K" +#elif THERMISTOR_ID == 5 + #define THERMISTOR_NAME "ATC 104GT-2" +#elif THERMISTOR_ID == 501 + #define THERMISTOR_NAME "Zonestar (Tronxy X3A)" +#elif THERMISTOR_ID == 502 + #define THERMISTOR_NAME "Zonestar (P802M Hot Bed)" +#elif THERMISTOR_ID == 512 + #define THERMISTOR_NAME "RPW-Ultra" +#elif THERMISTOR_ID == 6 + #define THERMISTOR_NAME "EPCOS (alt)" +#elif THERMISTOR_ID == 7 + #define THERMISTOR_NAME "HW 104LAG" +#elif THERMISTOR_ID == 71 + #define THERMISTOR_NAME "HW 104LAF" +#elif THERMISTOR_ID == 8 + #define THERMISTOR_NAME "E3104FXT" +#elif THERMISTOR_ID == 9 + #define THERMISTOR_NAME "GE AL03006" +#elif THERMISTOR_ID == 10 + #define THERMISTOR_NAME "RS 198-961" +#elif THERMISTOR_ID == 11 + #define THERMISTOR_NAME "1% beta 3950" +#elif THERMISTOR_ID == 12 + #define THERMISTOR_NAME "E3104FXT (alt)" +#elif THERMISTOR_ID == 13 + #define THERMISTOR_NAME "Hisens 3950" +#elif THERMISTOR_ID == 15 + #define THERMISTOR_NAME "100k JGAurora A5" +#elif THERMISTOR_ID == 18 + #define THERMISTOR_NAME "ATC Semitec 204GT-2" +#elif THERMISTOR_ID == 20 + #define THERMISTOR_NAME "Pt100 UltiMB 5v" +#elif THERMISTOR_ID == 21 + #define THERMISTOR_NAME "Pt100 UltiMB 3.3v" +#elif THERMISTOR_ID == 201 + #define THERMISTOR_NAME "Pt100 OverLord" +#elif THERMISTOR_ID == 60 + #define THERMISTOR_NAME "Makers Tool" +#elif THERMISTOR_ID == 70 + #define THERMISTOR_NAME "Hephestos 2" +#elif THERMISTOR_ID == 75 + #define THERMISTOR_NAME "MGB18" +#elif THERMISTOR_ID == 99 + #define THERMISTOR_NAME "100k with 10k pull-up" + +// Modified thermistors +#elif THERMISTOR_ID == 30 + #define THERMISTOR_NAME "Kis3d EN AW NTC100K/3950" +#elif THERMISTOR_ID == 51 + #define THERMISTOR_NAME "EPCOS 1K" +#elif THERMISTOR_ID == 52 + #define THERMISTOR_NAME "ATC204GT-2 1K" +#elif THERMISTOR_ID == 55 + #define THERMISTOR_NAME "ATC104GT-2 1K" +#elif THERMISTOR_ID == 1047 + #define THERMISTOR_NAME "PT1000 4K7" +#elif THERMISTOR_ID == 1010 + #define THERMISTOR_NAME "PT1000 1K" +#elif THERMISTOR_ID == 147 + #define THERMISTOR_NAME "Pt100 4K7" +#elif THERMISTOR_ID == 110 + #define THERMISTOR_NAME "Pt100 1K" +#elif THERMISTOR_ID == 666 + #define THERMISTOR_NAME "Einstart S" + +// High Temperature thermistors +#elif THERMISTOR_ID == 61 + #define THERMISTOR_NAME "Formbot 350°C" +#elif THERMISTOR_ID == 66 + #define THERMISTOR_NAME "Dyze 4.7M" +#elif THERMISTOR_ID == 67 + #define THERMISTOR_NAME "SliceEng 450°C" + +// Dummies for dev testing +#elif THERMISTOR_ID == 998 + #define THERMISTOR_NAME "Dummy 1" +#elif THERMISTOR_ID == 999 + #define THERMISTOR_NAME "Dummy 2" +#elif THERMISTOR_ID == 1000 + #define THERMISTOR_NAME "Custom" + +#endif // THERMISTOR_ID diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp new file mode 100644 index 00000000..7d25c0df --- /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_WIRED_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 (TFT_ROTATION & 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/touch_buttons.h b/Marlin/src/lcd/touch/touch_buttons.h new file mode 100644 index 00000000..451e5a5a --- /dev/null +++ b/Marlin/src/lcd/touch/touch_buttons.h @@ -0,0 +1,29 @@ +/** + * 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 + +#include + +class TouchButtons { +public: + static void init(); + static uint8_t read_buttons(); +}; + +extern TouchButtons touch; diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp new file mode 100644 index 00000000..7003d13f --- /dev/null +++ b/Marlin/src/lcd/ultralcd.cpp @@ -0,0 +1,1692 @@ +/** + * 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" + +#ifdef LED_BACKLIGHT_TIMEOUT + #include "../feature/leds/leds.h" +#endif + +#if ENABLED(HOST_ACTION_COMMANDS) + #include "../feature/host_actions.h" +#endif + +// All displays share the MarlinUI class +#include "ultralcd.h" +MarlinUI ui; + +#if HAS_DISPLAY + #include "../module/printcounter.h" + #include "../MarlinCore.h" + #include "../gcode/queue.h" + #include "fontutils.h" + #include "../sd/cardreader.h" + #if EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) + #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) + #endif +#endif + +#if LCD_HAS_WAIT_FOR_MOVE + bool MarlinUI::wait_for_move; // = false +#endif + +constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; + +#if HAS_WIRED_LCD + #if ENABLED(STATUS_MESSAGE_SCROLLING) + uint8_t MarlinUI::status_scroll_offset; // = 0 + constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); + #else + constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); + #endif +#elif EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) + constexpr uint8_t MAX_MESSAGE_LENGTH = 63; +#endif + +#if EITHER(HAS_WIRED_LCD, EXTENSIBLE_UI) + uint8_t MarlinUI::alert_level; // = 0 + char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; +#endif + +#if ENABLED(LCD_SET_PROGRESS_MANUALLY) + MarlinUI::progress_t MarlinUI::progress_override; // = 0 + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + uint32_t MarlinUI::remaining_time; + #endif +#endif + +#if EITHER(PCA9632_BUZZER, USE_BEEPER) + #include "../libs/buzzer.h" // for BUZZ() macro + #if ENABLED(PCA9632_BUZZER) + #include "../feature/leds/pca9632.h" + #endif + void MarlinUI::buzz(const long duration, const uint16_t freq) { + #if ENABLED(PCA9632_BUZZER) + PCA9632_buzz(duration, freq); + #elif USE_BEEPER + buzzer.tone(duration, freq); + #endif + } +#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_WIRED_LCD + +#if HAS_MARLINUI_U8GLIB + #include "dogm/ultralcd_DOGM.h" +#endif + +#include "lcdprint.h" + +#include "../sd/cardreader.h" + +#include "../module/temperature.h" +#include "../module/planner.h" +#include "../module/motion.h" + +#if HAS_LCD_MENU + #include "../module/settings.h" +#endif + +#if ENABLED(AUTO_BED_LEVELING_UBL) + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_TRINAMIC_CONFIG + #include "../feature/tmc_util.h" +#endif + +#if HAS_ADC_BUTTONS + #include "../module/thermistor/thermistors.h" +#endif + +#if HAS_POWER_MONITOR + #include "../feature/power_monitor.h" +#endif + +#if HAS_ENCODER_ACTION + volatile uint8_t MarlinUI::buttons; + #if HAS_SLOW_BUTTONS + volatile uint8_t MarlinUI::slow_buttons; + #endif + #if HAS_TOUCH_XPT2046 + #include "touch/touch_buttons.h" + bool MarlinUI::on_edit_screen = false; + #endif +#endif + +#if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 + bool MarlinUI::defer_return_to_status; +#endif + +uint8_t MarlinUI::lcd_status_update_delay = 1; // First update one loop delayed + +#if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + millis_t MarlinUI::next_filament_display; // = 0 +#endif + +millis_t MarlinUI::next_button_update_ms; // = 0 + +#if HAS_MARLINUI_U8GLIB + bool MarlinUI::drawing_screen, MarlinUI::first_page; // = false +#endif + +// Encoder Handling +#if HAS_ENCODER_ACTION + uint32_t MarlinUI::encoderPosition; + volatile int8_t encoderDiff; // Updated in update_buttons, added to encoderPosition every LCD update +#endif + +#if ENABLED(SDSUPPORT) + + #include "../sd/cardreader.h" + + #if MARLINUI_SCROLL_NAME + uint8_t MarlinUI::filename_scroll_pos, MarlinUI::filename_scroll_max; + #endif + + const char * MarlinUI::scrolled_filename(CardReader &theCard, const uint8_t maxlen, uint8_t hash, const bool doScroll) { + const char *outstr = theCard.longest_filename(); + if (theCard.longFilename[0]) { + #if MARLINUI_SCROLL_NAME + if (doScroll) { + for (uint8_t l = FILENAME_LENGTH; l--;) + hash = ((hash << 1) | (hash >> 7)) ^ theCard.filename[l]; // rotate, xor + static uint8_t filename_scroll_hash; + if (filename_scroll_hash != hash) { // If the hash changed... + filename_scroll_hash = hash; // Save the new hash + filename_scroll_max = _MAX(0, utf8_strlen(theCard.longFilename) - maxlen); // Update the scroll limit + filename_scroll_pos = 0; // Reset scroll to the start + lcd_status_update_delay = 8; // Don't scroll right away + } + outstr += filename_scroll_pos; + } + #else + theCard.longFilename[maxlen] = '\0'; // cutoff at screen edge + #endif + } + return outstr; + } + +#endif + +#if HAS_LCD_MENU + #include "menu/menu.h" + + screenFunc_t MarlinUI::currentScreen; // Initialized in CTOR + bool MarlinUI::screen_changed; + + #if ENABLED(ENCODER_RATE_MULTIPLIER) + bool MarlinUI::encoderRateMultiplierEnabled; + millis_t MarlinUI::lastEncoderMovementMillis = 0; + void MarlinUI::enable_encoder_multiplier(const bool onoff) { + encoderRateMultiplierEnabled = onoff; + lastEncoderMovementMillis = 0; + } + #endif + + #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) + int8_t MarlinUI::encoderDirection = ENCODERBASE; + #endif + + #if HAS_TOUCH_XPT2046 + uint8_t MarlinUI::touch_buttons; + uint8_t MarlinUI::repeat_delay; + #endif + + bool MarlinUI::lcd_clicked; + + bool MarlinUI::use_click() { + const bool click = lcd_clicked; + lcd_clicked = false; + return click; + } + + #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) + + bool MarlinUI::external_control; // = false + + void MarlinUI::wait_for_release() { + while (button_pressed()) safe_delay(50); + safe_delay(50); + } + + #endif + + void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, bool wordwrap/*=false*/) { + SETCURSOR(col, row); + if (!string) return; + + auto _newline = [&col, &row]{ + col = 0; row++; // Move col to string len (plus space) + SETCURSOR(0, row); // Simulate carriage return + }; + + uint8_t *p = (uint8_t*)string; + wchar_t ch; + if (wordwrap) { + uint8_t *wrd = nullptr, c = 0; + // find the end of the part + for (;;) { + if (!wrd) wrd = p; // Get word start /before/ advancing + p = get_utf8_value_cb(p, cb_read_byte, &ch); + const bool eol = !ch; // zero ends the string + // End or a break between phrases? + if (eol || ch == ' ' || ch == '-' || ch == '+' || ch == '.') { + if (!c && ch == ' ') { if (wrd) wrd++; continue; } // collapse extra spaces + // Past the right and the word is not too long? + if (col + c > LCD_WIDTH && col >= (LCD_WIDTH) / 4) _newline(); // should it wrap? + c += !eol; // +1 so the space will be printed + col += c; // advance col to new position + while (c) { // character countdown + --c; // count down to zero + wrd = get_utf8_value_cb(wrd, cb_read_byte, &ch); // get characters again + lcd_put_wchar(ch); // character to the LCD + } + if (eol) break; // all done! + wrd = nullptr; // set up for next word + } + else c++; // count word characters + } + } + else { + for (;;) { + p = get_utf8_value_cb(p, cb_read_byte, &ch); + if (!ch) break; + lcd_put_wchar(ch); + col++; + if (col >= LCD_WIDTH) _newline(); + } + } + } + + void MarlinUI::draw_select_screen_prompt(PGM_P const pref, const char * const string/*=nullptr*/, PGM_P const suff/*=nullptr*/) { + const uint8_t plen = utf8_strlen_P(pref), slen = suff ? utf8_strlen_P(suff) : 0; + uint8_t col = 0, row = 0; + if (!string && plen + slen <= LCD_WIDTH) { + col = (LCD_WIDTH - plen - slen) / 2; + row = LCD_HEIGHT > 3 ? 1 : 0; + } + wrap_string_P(col, row, pref, true); + if (string) { + if (col) { col = 0; row++; } // Move to the start of the next line + wrap_string(col, row, string); + } + if (suff) wrap_string_P(col, row, suff); + } + +#endif // HAS_LCD_MENU + +void MarlinUI::init() { + + init_lcd(); + + #if HAS_DIGITAL_BUTTONS + + #if BUTTON_EXISTS(EN1) + SET_INPUT_PULLUP(BTN_EN1); + #endif + #if BUTTON_EXISTS(EN2) + SET_INPUT_PULLUP(BTN_EN2); + #endif + #if BUTTON_EXISTS(ENC) + SET_INPUT_PULLUP(BTN_ENC); + #endif + + #if BUTTON_EXISTS(BACK) + SET_INPUT_PULLUP(BTN_BACK); + #endif + + #if BUTTON_EXISTS(UP) + SET_INPUT(BTN_UP); + #endif + #if BUTTON_EXISTS(DWN) + SET_INPUT(BTN_DWN); + #endif + #if BUTTON_EXISTS(LFT) + SET_INPUT(BTN_LFT); + #endif + #if BUTTON_EXISTS(RT) + SET_INPUT(BTN_RT); + #endif + + #endif // !HAS_DIGITAL_BUTTONS + + #if HAS_SHIFT_ENCODER + + #if ENABLED(SR_LCD_2W_NL) // Non latching 2 wire shift register + + SET_OUTPUT(SR_DATA_PIN); + SET_OUTPUT(SR_CLK_PIN); + + #elif defined(SHIFT_CLK) + + SET_OUTPUT(SHIFT_CLK); + OUT_WRITE(SHIFT_LD, HIGH); + #if defined(SHIFT_EN) && SHIFT_EN >= 0 + OUT_WRITE(SHIFT_EN, LOW); + #endif + SET_INPUT_PULLUP(SHIFT_OUT); + + #endif + + #endif // HAS_SHIFT_ENCODER + + #if BOTH(HAS_ENCODER_ACTION, HAS_SLOW_BUTTONS) + slow_buttons = 0; + #endif + + update_buttons(); + + TERN_(HAS_ENCODER_ACTION, encoderDiff = 0); +} + +bool MarlinUI::get_blink() { + static uint8_t blink = 0; + static millis_t next_blink_ms = 0; + millis_t ms = millis(); + if (ELAPSED(ms, next_blink_ms)) { + blink ^= 0xFF; + next_blink_ms = ms + 1000 - (LCD_UPDATE_INTERVAL) / 2; + } + return blink != 0; +} + +//////////////////////////////////////////// +///////////// Keypad Handling ////////////// +//////////////////////////////////////////// + +#if BOTH(REPRAPWORLD_KEYPAD, HAS_ENCODER_ACTION) + + volatile uint8_t MarlinUI::keypad_buttons; + + #if HAS_LCD_MENU && !HAS_ADC_BUTTONS + + void lcd_move_x(); + void lcd_move_y(); + void lcd_move_z(); + + void _reprapworld_keypad_move(const AxisEnum axis, const int16_t dir) { + ui.manual_move.menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; + ui.encoderPosition = dir; + switch (axis) { + case X_AXIS: lcd_move_x(); break; + case Y_AXIS: lcd_move_y(); break; + case Z_AXIS: lcd_move_z(); + default: break; + } + } + + #endif + + bool MarlinUI::handle_keypad() { + + #if HAS_ADC_BUTTONS + + #define ADC_MIN_KEY_DELAY 100 + if (keypad_buttons) { + #if HAS_ENCODER_ACTION + refresh(LCDVIEW_REDRAW_NOW); + #if HAS_LCD_MENU + if (encoderDirection == -(ENCODERBASE)) { // ADC_KEYPAD forces REVERSE_MENU_DIRECTION, so this indicates menu navigation + if (RRK(EN_KEYPAD_UP)) encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; + else if (RRK(EN_KEYPAD_DOWN)) encoderPosition -= ENCODER_STEPS_PER_MENU_ITEM; + else if (RRK(EN_KEYPAD_LEFT)) { MenuItem_back::action(); quick_feedback(); } + else if (RRK(EN_KEYPAD_RIGHT)) { return_to_status(); quick_feedback(); } + } + else + #endif + { + #if HAS_LCD_MENU + 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 -= epps; + else if (RRK(EN_KEYPAD_DOWN) || RRK(EN_KEYPAD_RIGHT)) encoderPosition += epps; + #endif + } + #endif + next_button_update_ms = millis() + ADC_MIN_KEY_DELAY; + return true; + } + + #else // !HAS_ADC_BUTTONS + + static uint8_t keypad_debounce = 0; + + if (!RRK( EN_KEYPAD_F1 | EN_KEYPAD_F2 + | EN_KEYPAD_F3 | EN_KEYPAD_DOWN + | EN_KEYPAD_RIGHT | EN_KEYPAD_MIDDLE + | EN_KEYPAD_UP | EN_KEYPAD_LEFT ) + ) { + if (keypad_debounce > 0) keypad_debounce--; + } + else if (!keypad_debounce) { + keypad_debounce = 2; + + const bool homed = all_axes_homed(); + + #if HAS_LCD_MENU + + if (RRK(EN_KEYPAD_MIDDLE)) goto_screen(menu_move); + + #if DISABLED(DELTA) && Z_HOME_DIR < 0 + if (RRK(EN_KEYPAD_F2)) _reprapworld_keypad_move(Z_AXIS, 1); + #endif + + if (homed) { + #if ENABLED(DELTA) || Z_HOME_DIR != -1 + if (RRK(EN_KEYPAD_F2)) _reprapworld_keypad_move(Z_AXIS, 1); + #endif + if (RRK(EN_KEYPAD_F3)) _reprapworld_keypad_move(Z_AXIS, -1); + if (RRK(EN_KEYPAD_LEFT)) _reprapworld_keypad_move(X_AXIS, -1); + if (RRK(EN_KEYPAD_RIGHT)) _reprapworld_keypad_move(X_AXIS, 1); + if (RRK(EN_KEYPAD_DOWN)) _reprapworld_keypad_move(Y_AXIS, 1); + if (RRK(EN_KEYPAD_UP)) _reprapworld_keypad_move(Y_AXIS, -1); + } + + #endif // HAS_LCD_MENU + + if (!homed && RRK(EN_KEYPAD_F1)) queue.inject_P(G28_STR); + return true; + } + + #endif // !ADC_KEYPAD + + return false; + } + +#endif // REPRAPWORLD_KEYPAD + +/** + * Status Screen + * + * This is very display-dependent, so the lcd implementation draws this. + */ + +#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + millis_t MarlinUI::progress_bar_ms; // = 0 + #if PROGRESS_MSG_EXPIRE > 0 + millis_t MarlinUI::expire_status_ms; // = 0 + #endif +#endif + +void MarlinUI::status_screen() { + + TERN_(HAS_LCD_MENU, ENCODER_RATE_MULTIPLY(false)); + + #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + + // + // HD44780 implements the following message blinking and + // message expiration because Status Line and Progress Bar + // share the same line on the display. + // + + #if DISABLED(PROGRESS_MSG_ONCE) || (PROGRESS_MSG_EXPIRE > 0) + #define GOT_MS + const millis_t ms = millis(); + #endif + + // If the message will blink rather than expire... + #if DISABLED(PROGRESS_MSG_ONCE) + if (ELAPSED(ms, progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) + progress_bar_ms = ms; + #endif + + #if PROGRESS_MSG_EXPIRE > 0 + + // Handle message expire + if (expire_status_ms) { + + // Expire the message if a job is active and the bar has ticks + if (get_progress_percent() > 2 && !print_job_timer.isPaused()) { + if (ELAPSED(ms, expire_status_ms)) { + status_message[0] = '\0'; + expire_status_ms = 0; + } + } + else { + // Defer message expiration before bar appears + // and during any pause (not just SD) + expire_status_ms += LCD_UPDATE_INTERVAL; + } + } + + #endif // PROGRESS_MSG_EXPIRE + + #endif // LCD_PROGRESS_BAR + + #if HAS_LCD_MENU + if (use_click()) { + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + next_filament_display = millis() + 5000UL; // Show status message for 5s + #endif + goto_screen(menu_main); + #if DISABLED(NO_LCD_REINIT) + init_lcd(); // May revive the LCD if static electricity killed it + #endif + return; + } + + #endif + + #if ENABLED(ULTIPANEL_FEEDMULTIPLY) + + const int16_t old_frm = feedrate_percentage; + int16_t new_frm = old_frm + int16_t(encoderPosition); + + // Dead zone at 100% feedrate + if (old_frm == 100) { + if (int16_t(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) + new_frm -= ENCODER_FEEDRATE_DEADZONE; + else if (int16_t(encoderPosition) < -(ENCODER_FEEDRATE_DEADZONE)) + new_frm += ENCODER_FEEDRATE_DEADZONE; + else + new_frm = old_frm; + } + else if ((old_frm < 100 && new_frm > 100) || (old_frm > 100 && new_frm < 100)) + new_frm = 100; + + LIMIT(new_frm, 10, 999); + + if (old_frm != new_frm) { + feedrate_percentage = new_frm; + encoderPosition = 0; + #if BOTH(HAS_BUZZER, BEEP_ON_FEEDRATE_CHANGE) + static millis_t next_beep; + #ifndef GOT_MS + const millis_t ms = millis(); + #endif + if (ELAPSED(ms, next_beep)) { + buzz(FEEDRATE_CHANGE_BEEP_DURATION, FEEDRATE_CHANGE_BEEP_FREQUENCY); + next_beep = ms + 500UL; + } + #endif + } + + #endif // ULTIPANEL_FEEDMULTIPLY + + draw_status_screen(); +} + +void MarlinUI::kill_screen(PGM_P lcd_error, PGM_P lcd_component) { + init(); + status_printf_P(1, PSTR(S_FMT ": " S_FMT), lcd_error, lcd_component); + TERN_(HAS_LCD_MENU, return_to_status()); + + // RED ALERT. RED ALERT. + #ifdef LED_BACKLIGHT_TIMEOUT + leds.set_color(LEDColorRed()); + #ifdef NEOPIXEL_BKGD_LED_INDEX + neo.set_pixel_color(NEOPIXEL_BKGD_LED_INDEX, 255, 0, 0, 0); + neo.show(); + #endif + #endif + + draw_kill_screen(); +} + +void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { + + TERN_(HAS_LCD_MENU, refresh()); + + #if HAS_ENCODER_ACTION + if (clear_buttons) buttons = 0; + next_button_update_ms = millis() + 500; + #else + UNUSED(clear_buttons); + #endif + + #if HAS_CHIRP + chirp(); // Buzz and wait. Is the delay needed for buttons to settle? + #if BOTH(HAS_LCD_MENU, USE_BEEPER) + for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } + #elif HAS_LCD_MENU + delay(10); + #endif + #endif +} + +//////////////////////////////////////////// +/////////////// Manual Move //////////////// +//////////////////////////////////////////// + +#if HAS_LCD_MENU + + ManualMove MarlinUI::manual_move{}; + + 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 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 ManualMove::task() { + + if (processing) return; // Prevent re-entry from idle() calls + + // 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; + + #if IS_KINEMATIC + + #if HAS_MULTI_EXTRUDER + const int8_t old_extruder = active_extruder; + if (axis == E_AXIS) active_extruder = e_index; + #endif + + // Apply a linear offset to a single axis + destination = current_position; + if (axis <= XYZE) destination[axis] += offset; + + // Reset for the next move + 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 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 = false; + + TERN_(HAS_MULTI_EXTRUDER, active_extruder = old_extruder); + + #else + + // 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."); + } + + #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 + +#endif // HAS_LCD_MENU + +/** + * Update the LCD, read encoder buttons, etc. + * - Read button states + * - Check the SD Card slot state + * - Act on RepRap World keypad input + * - Update the encoder position + * - Apply acceleration to the encoder position + * - Do refresh(LCDVIEW_CALL_REDRAW_NOW) on controller events + * - Reset the Info Screen timeout if there's any input + * - Update status indicators, if any + * + * Run the current LCD menu handler callback function: + * - Call the handler only if lcdDrawUpdate != LCDVIEW_NONE + * - Before calling the handler, LCDVIEW_CALL_NO_REDRAW => LCDVIEW_NONE + * - Call the menu handler. Menu handlers should do the following: + * - If a value changes, set lcdDrawUpdate to LCDVIEW_REDRAW_NOW and draw the value + * (Encoder events automatically set lcdDrawUpdate for you.) + * - if (should_draw()) { redraw } + * - Before exiting the handler set lcdDrawUpdate to: + * - LCDVIEW_CLEAR_CALL_REDRAW to clear screen and set LCDVIEW_CALL_REDRAW_NEXT. + * - LCDVIEW_REDRAW_NOW to draw now (including remaining stripes). + * - LCDVIEW_CALL_REDRAW_NEXT to draw now and get LCDVIEW_REDRAW_NOW on the next loop. + * - LCDVIEW_CALL_NO_REDRAW to draw now and get LCDVIEW_NONE on the next loop. + * - NOTE: For graphical displays menu handlers may be called 2 or more times per loop, + * so don't change lcdDrawUpdate without considering this. + * + * After the menu handler callback runs (or not): + * - Clear the LCD if lcdDrawUpdate == LCDVIEW_CLEAR_CALL_REDRAW + * - Update lcdDrawUpdate for the next loop (i.e., move one state down, usually) + * + * This function is only called from the main thread. + */ + +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() { + + static uint16_t max_display_update_time = 0; + millis_t ms = millis(); + + #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 + #define RESET_STATUS_TIMEOUT() (return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS) + #else + #define RESET_STATUS_TIMEOUT() NOOP + #endif + + #ifdef LED_BACKLIGHT_TIMEOUT + leds.update_timeout(powersupply_on); + #endif + + #if HAS_LCD_MENU + + // Handle any queued Move Axis motion + manual_move.task(); + + // Update button states for button_pressed(), etc. + // If the state changes the next update may be delayed 300-500ms. + update_buttons(); + + // If the action button is pressed... + static bool wait_for_unclick; // = false + + auto do_click = [&]{ + wait_for_unclick = true; // - Set debounce flag to ignore continous clicks + lcd_clicked = !wait_for_user; // - Keep the click if not waiting for a user-click + wait_for_user = false; // - Any click clears wait for user + quick_feedback(); // - Always make a click sound + }; + + #if HAS_TOUCH_XPT2046 + if (touch_buttons) { + 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) * 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 + if (!wait_for_unclick) { + next_button_update_ms += 250; // Longer delay on first press + wait_for_unclick = true; // Avoid Back/Select click while repeating + chirp(); + } + } + } + else if (!wait_for_unclick && (buttons & EN_C)) // OK button, if not waiting for a debounce release: + do_click(); + } + else // keep wait_for_unclick value + + #endif // HAS_TOUCH_XPT2046 + + { + // Integrated LCD click handling via button_pressed + if (!external_control && button_pressed()) { + if (!wait_for_unclick) do_click(); // Handle the click + } + else + wait_for_unclick = false; + } + + if (LCD_BACK_CLICKED()) { + quick_feedback(); + goto_previous_screen(); + } + + #endif // HAS_LCD_MENU + + if (ELAPSED(ms, next_lcd_update_ms) || TERN0(HAS_MARLINUI_U8GLIB, drawing_screen)) { + + next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; + + #if HAS_TOUCH_XPT2046 + + if (on_status_screen()) next_lcd_update_ms += (LCD_UPDATE_INTERVAL) * 2; + + TERN_(HAS_ENCODER_ACTION, touch_buttons = touch.read_buttons()); + + #endif + + TERN_(LCD_HAS_STATUS_INDICATORS, update_indicators()); + + #if HAS_ENCODER_ACTION + + TERN_(HAS_SLOW_BUTTONS, slow_buttons = read_slow_buttons()); // Buttons that take too long to read in interrupt context + + if (TERN0(REPRAPWORLD_KEYPAD, handle_keypad())) + RESET_STATUS_TIMEOUT(); + + 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 idle. + // Also check if past half the threshold to compensate for missed single steps. + static int8_t lastEncoderDiff; + + // 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 >= epps); + if (encoderPastThreshold || lcd_clicked) { + if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) { + + #if BOTH(HAS_LCD_MENU, ENCODER_RATE_MULTIPLIER) + + int32_t encoderMultiplier = 1; + + if (encoderRateMultiplierEnabled) { + const float encoderMovementSteps = float(abs_diff) / epps; + + if (lastEncoderMovementMillis) { + // Note that the rate is always calculated between two passes through the + // loop and that the abs of the encoderDiff value is tracked. + const float encoderStepRate = encoderMovementSteps / float(ms - lastEncoderMovementMillis) * 1000; + + 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); + SERIAL_ECHOPAIR(" Multiplier: ", encoderMultiplier); + SERIAL_ECHOPAIR(" ENCODER_10X_STEPS_PER_SEC: ", ENCODER_10X_STEPS_PER_SEC); + SERIAL_ECHOPAIR(" ENCODER_100X_STEPS_PER_SEC: ", ENCODER_100X_STEPS_PER_SEC); + SERIAL_EOL(); + #endif + } + + lastEncoderMovementMillis = ms; + } // encoderRateMultiplierEnabled + + #else + + constexpr int32_t encoderMultiplier = 1; + + #endif // ENCODER_RATE_MULTIPLIER + + encoderPosition += (encoderDiff * encoderMultiplier) / epps; + encoderDiff = 0; + } + + RESET_STATUS_TIMEOUT(); + + refresh(LCDVIEW_REDRAW_NOW); + + #ifdef LED_BACKLIGHT_TIMEOUT + leds.reset_timeout(ms); + #endif + } + + #endif + + // This runs every ~100ms when idling often enough. + // Instead of tracking changes just redraw the Status Screen once per second. + if (on_status_screen() && !lcd_status_update_delay--) { + lcd_status_update_delay = TERN(HAS_MARLINUI_U8GLIB, 12, 9); + if (max_display_update_time) max_display_update_time--; // Be sure never go to a very big number + refresh(LCDVIEW_REDRAW_NOW); + } + + #if BOTH(HAS_LCD_MENU, SCROLL_LONG_FILENAMES) + // If scrolling of long file names is enabled and we are in the sd card menu, + // cause a refresh to occur until all the text has scrolled into view. + if (currentScreen == menu_media && !lcd_status_update_delay--) { + lcd_status_update_delay = 4; + if (++filename_scroll_pos > filename_scroll_max) { + filename_scroll_pos = 0; + lcd_status_update_delay = 12; + } + refresh(LCDVIEW_REDRAW_NOW); + RESET_STATUS_TIMEOUT(); + } + #endif + + // 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)) { + + // Change state of drawing flag between screen updates + if (!drawing_screen) switch (lcdDrawUpdate) { + case LCDVIEW_CALL_NO_REDRAW: + refresh(LCDVIEW_NONE); + break; + case LCDVIEW_CLEAR_CALL_REDRAW: + case LCDVIEW_CALL_REDRAW_NEXT: + refresh(LCDVIEW_REDRAW_NOW); + case LCDVIEW_REDRAW_NOW: // set above, or by a handler through LCDVIEW_CALL_REDRAW_NEXT + case LCDVIEW_NONE: + break; + } // switch + + TERN_(HAS_ADC_BUTTONS, keypad_buttons = 0); + + #if HAS_MARLINUI_U8GLIB + + #if ENABLED(LIGHTWEIGHT_UI) + const bool in_status = on_status_screen(), + do_u8g_loop = !in_status; + lcd_in_status(in_status); + if (in_status) status_screen(); + #else + constexpr bool do_u8g_loop = true; + #endif + + if (do_u8g_loop) { + if (!drawing_screen) { // If not already drawing pages + u8g.firstPage(); // Start the first page + drawing_screen = first_page = true; // Flag as drawing pages + } + set_font(FONT_MENU); // Setup font for every page draw + u8g.setColorIndex(1); // And reset the color + run_current_screen(); // Draw and process the current screen + first_page = false; + + // The screen handler can clear drawing_screen for an action that changes the screen. + // If still drawing and there's another page, update max-time and return now. + // The nextPage will already be set up on the next call. + if (drawing_screen && (drawing_screen = u8g.nextPage())) { + if (on_status_screen()) + NOLESS(max_display_update_time, millis() - ms); + return; + } + } + + #else + + run_current_screen(); + + #endif + + TERN_(HAS_LCD_MENU, lcd_clicked = false); + + // Keeping track of the longest time for an individual LCD update. + // Used to do screen throttling when the planner starts to fill up. + if (on_status_screen()) + NOLESS(max_display_update_time, millis() - ms); + } + + #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 + // Return to Status Screen after a timeout + if (on_status_screen() || defer_return_to_status) + RESET_STATUS_TIMEOUT(); + else if (ELAPSED(ms, return_to_status_ms)) + return_to_status(); + #endif + + // Change state of drawing flag between screen updates + if (!drawing_screen) switch (lcdDrawUpdate) { + case LCDVIEW_CLEAR_CALL_REDRAW: + clear_lcd(); break; + case LCDVIEW_REDRAW_NOW: + refresh(LCDVIEW_NONE); + case LCDVIEW_NONE: + case LCDVIEW_CALL_REDRAW_NEXT: + case LCDVIEW_CALL_NO_REDRAW: + default: break; + } // switch + + } // ELAPSED(ms, next_lcd_update_ms) + + TERN_(HAS_GRAPHICAL_TFT, tft_idle()); +} + +#if HAS_ADC_BUTTONS + + typedef struct { + uint16_t ADCKeyValueMin, ADCKeyValueMax; + uint8_t ADCKeyNo; + } _stADCKeypadTable_; + + #ifndef ADC_BUTTONS_VALUE_SCALE + #define ADC_BUTTONS_VALUE_SCALE 1.0 // for the power voltage equal to the reference voltage + #endif + #ifndef ADC_BUTTONS_R_PULLUP + #define ADC_BUTTONS_R_PULLUP 4.7 // common pull-up resistor in the voltage divider + #endif + #ifndef ADC_BUTTONS_LEFT_R_PULLDOWN + #define ADC_BUTTONS_LEFT_R_PULLDOWN 0.47 // pull-down resistor for LEFT button voltage divider + #endif + #ifndef ADC_BUTTONS_RIGHT_R_PULLDOWN + #define ADC_BUTTONS_RIGHT_R_PULLDOWN 4.7 // pull-down resistor for RIGHT button voltage divider + #endif + #ifndef ADC_BUTTONS_UP_R_PULLDOWN + #define ADC_BUTTONS_UP_R_PULLDOWN 1.0 // pull-down resistor for UP button voltage divider + #endif + #ifndef ADC_BUTTONS_DOWN_R_PULLDOWN + #define ADC_BUTTONS_DOWN_R_PULLDOWN 10.0 // pull-down resistor for DOWN button voltage divider + #endif + #ifndef ADC_BUTTONS_MIDDLE_R_PULLDOWN + #define ADC_BUTTONS_MIDDLE_R_PULLDOWN 2.2 // pull-down resistor for MIDDLE button voltage divider + #endif + + // Calculate the ADC value for the voltage divider with specified pull-down resistor value + #define ADC_BUTTON_VALUE(r) int(HAL_ADC_RANGE * (ADC_BUTTONS_VALUE_SCALE) * r / (r + ADC_BUTTONS_R_PULLUP)) + + static constexpr uint16_t adc_button_tolerance = HAL_ADC_RANGE * 25 / 1024, + adc_other_button = HAL_ADC_RANGE * 1000 / 1024; + static const _stADCKeypadTable_ stADCKeyTable[] PROGMEM = { + // VALUE_MIN, VALUE_MAX, KEY + { adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F1 }, // F1 + { adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F2 }, // F2 + { adc_other_button, HAL_ADC_RANGE, 1 + BLEN_KEYPAD_F3 }, // F3 + { ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) - adc_button_tolerance, + ADC_BUTTON_VALUE(ADC_BUTTONS_LEFT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_LEFT }, // LEFT ( 272 ... 472) + { ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) - adc_button_tolerance, + ADC_BUTTON_VALUE(ADC_BUTTONS_RIGHT_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_RIGHT }, // RIGHT (1948 ... 2148) + { ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) - adc_button_tolerance, + ADC_BUTTON_VALUE(ADC_BUTTONS_UP_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_UP }, // UP ( 618 ... 818) + { ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) - adc_button_tolerance, + ADC_BUTTON_VALUE(ADC_BUTTONS_DOWN_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_DOWN }, // DOWN (2686 ... 2886) + { ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) - adc_button_tolerance, + ADC_BUTTON_VALUE(ADC_BUTTONS_MIDDLE_R_PULLDOWN) + adc_button_tolerance, 1 + BLEN_KEYPAD_MIDDLE }, // ENTER (1205 ... 1405) + }; + + uint8_t get_ADC_keyValue() { + if (thermalManager.ADCKey_count >= 16) { + const uint16_t currentkpADCValue = thermalManager.current_ADCKey_raw; + thermalManager.current_ADCKey_raw = HAL_ADC_RANGE; + thermalManager.ADCKey_count = 0; + if (currentkpADCValue < adc_other_button) + LOOP_L_N(i, ADC_KEY_NUM) { + const uint16_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin), + hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax); + if (WITHIN(currentkpADCValue, lo, hi)) return pgm_read_byte(&stADCKeyTable[i].ADCKeyNo); + } + } + return 0; + } + +#endif // HAS_ADC_BUTTONS + +#if HAS_ENCODER_ACTION + + /** + * Read encoder buttons from the hardware registers + * Warning: This function is called from interrupt context! + */ + void MarlinUI::update_buttons() { + const millis_t now = millis(); + if (ELAPSED(now, next_button_update_ms)) { + + #if HAS_DIGITAL_BUTTONS + + #if ANY_BUTTON(EN1, EN2, ENC, BACK) + + uint8_t newbutton = 0; + + #if BUTTON_EXISTS(EN1) + if (BUTTON_PRESSED(EN1)) newbutton |= EN_A; + #endif + #if BUTTON_EXISTS(EN2) + if (BUTTON_PRESSED(EN2)) newbutton |= EN_B; + #endif + #if BUTTON_EXISTS(ENC) + if (BUTTON_PRESSED(ENC)) newbutton |= EN_C; + #endif + #if BUTTON_EXISTS(BACK) + if (BUTTON_PRESSED(BACK)) newbutton |= EN_D; + #endif + + #else + + constexpr uint8_t newbutton = 0; + + #endif + + // + // Directional buttons + // + #if ANY_BUTTON(UP, DWN, LFT, RT) + + const int8_t pulses = epps * encoderDirection; + + if (false) { + // for the else-ifs below + } + #if BUTTON_EXISTS(UP) + else if (BUTTON_PRESSED(UP)) { + encoderDiff = (ENCODER_STEPS_PER_MENU_ITEM) * pulses; + next_button_update_ms = now + 300; + } + #endif + #if BUTTON_EXISTS(DWN) + else if (BUTTON_PRESSED(DWN)) { + encoderDiff = -(ENCODER_STEPS_PER_MENU_ITEM) * pulses; + next_button_update_ms = now + 300; + } + #endif + #if BUTTON_EXISTS(LFT) + else if (BUTTON_PRESSED(LFT)) { + encoderDiff = -pulses; + next_button_update_ms = now + 300; + } + #endif + #if BUTTON_EXISTS(RT) + else if (BUTTON_PRESSED(RT)) { + encoderDiff = pulses; + next_button_update_ms = now + 300; + } + #endif + + #endif // UP || DWN || LFT || RT + + buttons = (newbutton + #if HAS_SLOW_BUTTONS + | slow_buttons + #endif + #if BOTH(HAS_TOUCH_XPT2046, HAS_ENCODER_ACTION) + | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) + #endif + ); + + #elif HAS_ADC_BUTTONS + + buttons = 0; + + #endif + + #if HAS_ADC_BUTTONS + if (keypad_buttons == 0) { + const uint8_t b = get_ADC_keyValue(); + if (WITHIN(b, 1, 8)) keypad_buttons = _BV(b - 1); + } + #endif + + #if HAS_SHIFT_ENCODER + /** + * Set up Rotary Encoder bit values (for two pin encoders to indicate movement). + * These values are independent of which pins are used for EN_A / EN_B indications. + * The rotary encoder part is also independent of the LCD chipset. + */ + uint8_t val = 0; + WRITE(SHIFT_LD, LOW); + WRITE(SHIFT_LD, HIGH); + LOOP_L_N(i, 8) { + val >>= 1; + if (READ(SHIFT_OUT)) SBI(val, 7); + WRITE(SHIFT_CLK, HIGH); + WRITE(SHIFT_CLK, LOW); + } + TERN(REPRAPWORLD_KEYPAD, keypad_buttons, buttons) = ~val; + #endif + + #if IS_TFTGLCD_PANEL + next_button_update_ms = now + (LCD_UPDATE_INTERVAL / 2); + buttons = slow_buttons; + TERN_(AUTO_BED_LEVELING_UBL, external_encoder()); + #endif + + } // next_button_update_ms + + #if HAS_ENCODER_WHEEL + static uint8_t lastEncoderBits; + + #define encrot0 0 + #define encrot1 2 + #define encrot2 3 + #define encrot3 1 + + // Manage encoder rotation + #define ENCODER_SPIN(_E1, _E2) switch (lastEncoderBits) { case _E1: encoderDiff += encoderDirection; break; case _E2: encoderDiff -= encoderDirection; } + + uint8_t enc = 0; + if (buttons & EN_A) enc |= B01; + if (buttons & EN_B) enc |= B10; + if (enc != lastEncoderBits) { + switch (enc) { + case encrot0: ENCODER_SPIN(encrot3, encrot1); break; + case encrot1: ENCODER_SPIN(encrot0, encrot2); break; + case encrot2: ENCODER_SPIN(encrot1, encrot3); break; + case encrot3: ENCODER_SPIN(encrot2, encrot0); break; + } + #if BOTH(HAS_LCD_MENU, AUTO_BED_LEVELING_UBL) + external_encoder(); + #endif + lastEncoderBits = enc; + } + + #endif // HAS_ENCODER_WHEEL + } + +#endif // HAS_ENCODER_ACTION + +#endif // HAS_WIRED_LCD + +#if HAS_DISPLAY + + #if ENABLED(EXTENSIBLE_UI) + #include "extui/ui_api.h" + #endif + + //////////////////////////////////////////// + /////////////// Status Line //////////////// + //////////////////////////////////////////// + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + void MarlinUI::advance_status_scroll() { + // Advance by one UTF8 code-word + if (status_scroll_offset < utf8_strlen(status_message)) + while (!START_OF_UTF8_CHAR(status_message[++status_scroll_offset])); + else + status_scroll_offset = 0; + } + char* MarlinUI::status_and_len(uint8_t &len) { + char *out = status_message + status_scroll_offset; + len = utf8_strlen(out); + return out; + } + #endif + + void MarlinUI::finish_status(const bool persist) { + + #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) + UNUSED(persist); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + const millis_t ms = millis(); + #endif + + #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + progress_bar_ms = ms; + #if PROGRESS_MSG_EXPIRE > 0 + expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; + #endif + #endif + + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + next_filament_display = ms + 5000UL; // Show status message for 5s + #endif + + #if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING) + status_scroll_offset = 0; + #endif + + TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); + } + + bool MarlinUI::has_status() { return (status_message[0] != '\0'); } + + void MarlinUI::set_status(const char * const message, const bool persist) { + if (alert_level) return; + + TERN_(HOST_PROMPT_SUPPORT, host_action_notify(message)); + + // Here we have a problem. The message is encoded in UTF8, so + // arbitrarily cutting it will be a problem. We MUST be sure + // that there is no cutting in the middle of a multibyte character! + + // Get a pointer to the null terminator + const char* pend = message + strlen(message); + + // If length of supplied UTF8 string is greater than + // our buffer size, start cutting whole UTF8 chars + while ((pend - message) > MAX_MESSAGE_LENGTH) { + --pend; + while (!START_OF_UTF8_CHAR(*pend)) --pend; + }; + + // At this point, we have the proper cut point. Use it + uint8_t maxLen = pend - message; + strncpy(status_message, message, maxLen); + status_message[maxLen] = '\0'; + + finish_status(persist); + } + + #include + + void MarlinUI::status_printf_P(const uint8_t level, PGM_P const fmt, ...) { + if (level < alert_level) return; + alert_level = level; + va_list args; + va_start(args, fmt); + vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, fmt, args); + va_end(args); + finish_status(level > 0); + } + + void MarlinUI::set_status_P(PGM_P const message, int8_t level) { + if (level < 0) level = alert_level = 0; + if (level < alert_level) return; + alert_level = level; + + TERN_(HOST_PROMPT_SUPPORT, host_action_notify_P(message)); + + // Since the message is encoded in UTF8 it must + // only be cut on a character boundary. + + // Get a pointer to the null terminator + PGM_P pend = message + strlen_P(message); + + // If length of supplied UTF8 string is greater than + // the buffer size, start cutting whole UTF8 chars + while ((pend - message) > MAX_MESSAGE_LENGTH) { + --pend; + while (!START_OF_UTF8_CHAR(pgm_read_byte(pend))) --pend; + }; + + // At this point, we have the proper cut point. Use it + uint8_t maxLen = pend - message; + strncpy_P(status_message, message, maxLen); + status_message[maxLen] = '\0'; + + finish_status(level > 0); + } + + void MarlinUI::set_alert_status_P(PGM_P const message) { + set_status_P(message, 1); + TERN_(HAS_LCD_MENU, return_to_status()); + } + + PGM_P print_paused = GET_TEXT(MSG_PRINT_PAUSED); + + /** + * Reset the status message + */ + void MarlinUI::reset_status(const bool no_welcome) { + PGM_P printing = GET_TEXT(MSG_PRINTING); + PGM_P welcome = GET_TEXT(WELCOME_MSG); + #if SERVICE_INTERVAL_1 > 0 + static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); + #endif + #if SERVICE_INTERVAL_2 > 0 + static PGMSTR(service2, "> " SERVICE_NAME_2 "!"); + #endif + #if SERVICE_INTERVAL_3 > 0 + static PGMSTR(service3, "> " SERVICE_NAME_3 "!"); + #endif + PGM_P msg; + if (printingIsPaused()) + msg = print_paused; + #if ENABLED(SDSUPPORT) + else if (IS_SD_PRINTING()) + return set_status(card.longest_filename(), true); + #endif + else if (print_job_timer.isRunning()) + msg = printing; + + #if SERVICE_INTERVAL_1 > 0 + else if (print_job_timer.needsService(1)) msg = service1; + #endif + #if SERVICE_INTERVAL_2 > 0 + else if (print_job_timer.needsService(2)) msg = service2; + #endif + #if SERVICE_INTERVAL_3 > 0 + else if (print_job_timer.needsService(3)) msg = service3; + #endif + + else if (!no_welcome) + msg = welcome; + else + return; + + set_status_P(msg, -1); + } + + #if ENABLED(SDSUPPORT) + extern bool wait_for_user, wait_for_heatup; + #endif + + void MarlinUI::abort_print() { + #if ENABLED(SDSUPPORT) + wait_for_heatup = wait_for_user = false; + card.flag.abort_sd_printing = true; + #endif + #ifdef ACTION_ON_CANCEL + host_action_cancel(); + #endif + TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR)); + print_job_timer.stop(); + set_status_P(GET_TEXT(MSG_PRINT_ABORTED)); + TERN_(HAS_LCD_MENU, return_to_status()); + } + + #if ANY(PARK_HEAD_ON_PAUSE, SDSUPPORT) + #include "../gcode/queue.h" + #endif + + void MarlinUI::pause_print() { + #if HAS_LCD_MENU + synchronize(GET_TEXT(MSG_PAUSING)); + defer_status_screen(); + #endif + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("UI Pause"), PSTR("Resume"))); + + set_status_P(print_paused); + + #if ENABLED(PARK_HEAD_ON_PAUSE) + TERN_(HAS_WIRED_LCD, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); // Show message immediately to let user know about pause in progress + queue.inject_P(PSTR("M25 P\nM24")); + #elif ENABLED(SDSUPPORT) + queue.inject_P(PSTR("M25")); + #elif defined(ACTION_ON_PAUSE) + host_action_pause(); + #endif + } + + void MarlinUI::resume_print() { + reset_status(); + TERN_(PARK_HEAD_ON_PAUSE, wait_for_heatup = wait_for_user = false); + if (IS_SD_PAUSED()) queue.inject_P(M24_STR); + #ifdef ACTION_ON_RESUME + host_action_resume(); + #endif + print_job_timer.start(); // Also called by M24 + } + + #if HAS_PRINT_PROGRESS + + MarlinUI::progress_t MarlinUI::_get_progress() { + return ( + TERN0(LCD_SET_PROGRESS_MANUALLY, (progress_override & PROGRESS_MASK)) + #if ENABLED(SDSUPPORT) + ?: TERN(HAS_PRINT_PROGRESS_PERMYRIAD, card.permyriadDone(), card.percentDone()) + #endif + ); + } + + #endif + + #if HAS_TOUCH_XPT2046 + + // + // Screen Click + // - On menu screens move directly to the touched item + // - On menu screens, right side (last 3 cols) acts like a scroll - half up => prev page, half down = next page + // - On select screens (and others) touch the Right Half for +, Left Half for - + // - On edit screens, touch Up Half for -, Bottom Half to + + // + void MarlinUI::screen_click(const uint8_t row, const uint8_t col, const uint8_t, const uint8_t) { + const millis_t now = millis(); + if (PENDING(now, next_button_update_ms)) return; + next_button_update_ms = now + repeat_delay; // Assume the repeat delay + const int8_t xdir = col < (LCD_WIDTH ) / 2 ? -1 : 1, + ydir = row < (LCD_HEIGHT) / 2 ? -1 : 1; + if (on_edit_screen) + encoderDiff = epps * ydir; + else if (screen_items > 0) { + // Last 5 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 = epps * (encoderLine - encoderTopLine + 2 * (LCD_HEIGHT)) * ydir; + else + encoderDiff = epps * (row - encoderPosition + encoderTopLine); + } + else if (!on_status_screen()) + encoderDiff = epps * xdir; + } + + #endif + +#else // !HAS_DISPLAY + + // + // Send the status line as a host notification + // + void MarlinUI::set_status(const char * const message, const bool) { + TERN(HOST_PROMPT_SUPPORT, host_action_notify(message), UNUSED(message)); + } + void MarlinUI::set_status_P(PGM_P message, const int8_t) { + TERN(HOST_PROMPT_SUPPORT, host_action_notify_P(message), UNUSED(message)); + } + void MarlinUI::status_printf_P(const uint8_t, PGM_P const message, ...) { + TERN(HOST_PROMPT_SUPPORT, host_action_notify_P(message), UNUSED(message)); + } + +#endif // !HAS_DISPLAY + +#if ENABLED(SDSUPPORT) + + void MarlinUI::media_changed(const uint8_t old_status, const uint8_t status) { + if (old_status == status) { + TERN_(EXTENSIBLE_UI, ExtUI::onMediaError()); // Failed to mount/unmount + return; + } + + if (status) { + if (old_status < 2) { + TERN_(EXTENSIBLE_UI, ExtUI::onMediaInserted()); // ExtUI response + set_status_P(GET_TEXT(MSG_MEDIA_INSERTED)); + } + } + else { + if (old_status < 2) { + TERN_(EXTENSIBLE_UI, ExtUI::onMediaRemoved()); // ExtUI response + #if PIN_EXISTS(SD_DETECT) + set_status_P(GET_TEXT(MSG_MEDIA_REMOVED)); + #if HAS_LCD_MENU + if (!defer_return_to_status) return_to_status(); + #endif + #endif + } + } + + #if PIN_EXISTS(SD_DETECT) && DISABLED(NO_LCD_REINIT) + init_lcd(); // Revive a noisy shared SPI LCD + #endif + + refresh(); + + #if HAS_WIRED_LCD || defined(LED_BACKLIGHT_TIMEOUT) + const millis_t ms = millis(); + #endif + + TERN_(HAS_WIRED_LCD, next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL); // Delay LCD update for SD activity + + #ifdef LED_BACKLIGHT_TIMEOUT + leds.reset_timeout(ms); + #endif + } + +#endif // SDSUPPORT + +#if HAS_LCD_MENU + void MarlinUI::reset_settings() { settings.reset(); completion_feedback(); } +#endif + +#if ENABLED(EEPROM_SETTINGS) + + #if HAS_LCD_MENU + void MarlinUI::init_eeprom() { + const bool good = settings.init_eeprom(); + completion_feedback(good); + return_to_status(); + } + void MarlinUI::load_settings() { + const bool good = settings.load(); + completion_feedback(good); + } + void MarlinUI::store_settings() { + const bool good = settings.save(); + completion_feedback(good); + } + #endif + + #if DISABLED(EEPROM_AUTO_INIT) + + static inline PGM_P eeprom_err(const uint8_t msgid) { + switch (msgid) { + default: + case 0: return GET_TEXT(MSG_ERR_EEPROM_CRC); + case 1: return GET_TEXT(MSG_ERR_EEPROM_INDEX); + case 2: return GET_TEXT(MSG_ERR_EEPROM_VERSION); + } + } + + void MarlinUI::eeprom_alert(const uint8_t msgid) { + #if HAS_LCD_MENU + editable.uint8 = msgid; + goto_screen([]{ + PGM_P const restore_msg = GET_TEXT(MSG_INIT_EEPROM); + char msg[utf8_strlen_P(restore_msg) + 1]; + strcpy_P(msg, restore_msg); + MenuItem_confirm::select_screen( + GET_TEXT(MSG_BUTTON_RESET), GET_TEXT(MSG_BUTTON_IGNORE), + init_eeprom, return_to_status, + eeprom_err(editable.uint8), msg, PSTR("?") + ); + }); + #else + set_status_P(eeprom_err(msgid)); + #endif + } + + #endif // EEPROM_AUTO_INIT + +#endif // EEPROM_SETTINGS diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h new file mode 100644 index 00000000..c7ef4159 --- /dev/null +++ b/Marlin/src/lcd/ultralcd.h @@ -0,0 +1,717 @@ +/** + * 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_BUZZER + #include "../libs/buzzer.h" +#endif + +#if ENABLED(SDSUPPORT) + #include "../sd/cardreader.h" +#endif + +#if EITHER(HAS_LCD_MENU, ULTIPANEL_FEEDMULTIPLY) + #define HAS_ENCODER_ACTION 1 +#endif +#if ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2)) && !IS_TFTGLCD_PANEL + #define HAS_ENCODER_WHEEL 1 +#endif +#if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) + #define HAS_DIGITAL_BUTTONS 1 +#endif +#if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_WIRED_LCD && DISABLED(NEWPANEL))) + #define HAS_SHIFT_ENCODER 1 +#endif + +// I2C buttons must be read in the main thread +#if ANY(LCD_I2C_VIKI, LCD_I2C_PANELOLU2, IS_TFTGLCD_PANEL) + #define HAS_SLOW_BUTTONS 1 +#endif + +#if E_MANUAL > 1 + #define MULTI_MANUAL 1 +#endif + +#if HAS_WIRED_LCD + + #include "../MarlinCore.h" + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" + #include "../module/motion.h" // for active_extruder + #endif + + enum LCDViewAction : uint8_t { + LCDVIEW_NONE, + LCDVIEW_REDRAW_NOW, + LCDVIEW_CALL_REDRAW_NEXT, + LCDVIEW_CLEAR_CALL_REDRAW, + LCDVIEW_CALL_NO_REDRAW + }; + + #if HAS_ADC_BUTTONS + uint8_t get_ADC_keyValue(); + #endif + + #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_XPT2046, 50, 100) + + #if HAS_LCD_MENU + + #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); + inline void wrap_string_P(uint8_t &col, uint8_t &row, PGM_P const pstr, const bool wordwrap=false) { _wrap_string(col, row, pstr, read_byte_rom, wordwrap); } + inline void wrap_string(uint8_t &col, uint8_t &row, const char * const string, const bool wordwrap=false) { _wrap_string(col, row, string, read_byte_ram, wordwrap); } + + #if ENABLED(SDSUPPORT) + #include "../sd/cardreader.h" + #endif + + typedef void (*screenFunc_t)(); + typedef void (*menuAction_t)(); + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + void lcd_pause_show_message(const PauseMessage message, + const PauseMode mode=PAUSE_MODE_SAME, + const uint8_t extruder=active_extruder); + #endif + + #if ENABLED(AUTO_BED_LEVELING_UBL) + void lcd_mesh_edit_setup(const float &initial); + float lcd_mesh_edit(); + #endif + + #endif // HAS_LCD_MENU + +#endif // HAS_WIRED_LCD + +// REPRAPWORLD_KEYPAD (and ADC_KEYPAD) +#if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_OFFSET 0 // Bit offset into buttons for shift register values + + #define BLEN_KEYPAD_F3 0 + #define BLEN_KEYPAD_F2 1 + #define BLEN_KEYPAD_F1 2 + #define BLEN_KEYPAD_DOWN 3 + #define BLEN_KEYPAD_RIGHT 4 + #define BLEN_KEYPAD_MIDDLE 5 + #define BLEN_KEYPAD_UP 6 + #define BLEN_KEYPAD_LEFT 7 + + #define EN_KEYPAD_F1 _BV(BTN_OFFSET + BLEN_KEYPAD_F1) + #define EN_KEYPAD_F2 _BV(BTN_OFFSET + BLEN_KEYPAD_F2) + #define EN_KEYPAD_F3 _BV(BTN_OFFSET + BLEN_KEYPAD_F3) + #define EN_KEYPAD_DOWN _BV(BTN_OFFSET + BLEN_KEYPAD_DOWN) + #define EN_KEYPAD_RIGHT _BV(BTN_OFFSET + BLEN_KEYPAD_RIGHT) + #define EN_KEYPAD_MIDDLE _BV(BTN_OFFSET + BLEN_KEYPAD_MIDDLE) + #define EN_KEYPAD_UP _BV(BTN_OFFSET + BLEN_KEYPAD_UP) + #define EN_KEYPAD_LEFT _BV(BTN_OFFSET + BLEN_KEYPAD_LEFT) + + #define RRK(B) (keypad_buttons & (B)) + + #ifdef EN_C + #define BUTTON_CLICK() ((buttons & EN_C) || RRK(EN_KEYPAD_MIDDLE)) + #else + #define BUTTON_CLICK() RRK(EN_KEYPAD_MIDDLE) + #endif + +#endif + +#if HAS_DIGITAL_BUTTONS + + // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) + #define BLEN_A 0 + #define BLEN_B 1 + + #define EN_A _BV(BLEN_A) + #define EN_B _BV(BLEN_B) + + #define BUTTON_PRESSED(BN) !READ(BTN_## BN) + + #if BUTTON_EXISTS(ENC) || HAS_TOUCH_XPT2046 + #define BLEN_C 2 + #define EN_C _BV(BLEN_C) + #endif + + #if ENABLED(LCD_I2C_VIKI) + + #include + + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + // button and encoder bit positions within 'buttons' + #define B_LE (BUTTON_LEFT << B_I2C_BTN_OFFSET) // The remaining normalized buttons are all read via I2C + #define B_UP (BUTTON_UP << B_I2C_BTN_OFFSET) + #define B_MI (BUTTON_SELECT << B_I2C_BTN_OFFSET) + #define B_DW (BUTTON_DOWN << B_I2C_BTN_OFFSET) + #define B_RI (BUTTON_RIGHT << B_I2C_BTN_OFFSET) + + #if BUTTON_EXISTS(ENC) // The pause/stop/restart button is connected to BTN_ENC when used + #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #define BUTTON_CLICK() (buttons & (B_MI|B_RI|B_ST)) // Pause/stop also acts as click until a proper pause/stop is implemented. + #else + #define BUTTON_CLICK() (buttons & (B_MI|B_RI)) + #endif + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #if !BUTTON_EXISTS(ENC) // Use I2C if not directly connected to a pin + + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + #define B_MI (PANELOLU2_ENCODER_C << B_I2C_BTN_OFFSET) // requires LiquidTWI2 library v1.2.3 or later + + #define BUTTON_CLICK() (buttons & B_MI) + + #endif + + #endif + +#else + + #undef BUTTON_EXISTS + #define BUTTON_EXISTS(...) false + + // Shift register bits correspond to buttons: + #define BL_LE 7 // Left + #define BL_UP 6 // Up + #define BL_MI 5 // Middle + #define BL_DW 4 // Down + #define BL_RI 3 // Right + #define BL_ST 2 // Red Button + #define B_LE _BV(BL_LE) + #define B_UP _BV(BL_UP) + #define B_MI _BV(BL_MI) + #define B_DW _BV(BL_DW) + #define B_RI _BV(BL_RI) + #define B_ST _BV(BL_ST) + + #ifndef BUTTON_CLICK + #define BUTTON_CLICK() (buttons & (B_MI|B_ST)) + #endif + +#endif + +#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_XPT2046, IS_TFTGLCD_PANEL) + #define BLEN_D 3 + #define EN_D _BV(BLEN_D) + #define LCD_BACK_CLICKED() (buttons & EN_D) +#else + #define LCD_BACK_CLICKED() false +#endif + +#ifndef BUTTON_CLICK + #ifdef EN_C + #define BUTTON_CLICK() (buttons & EN_C) + #else + #define BUTTON_CLICK() false + #endif +#endif + +#if HAS_MARLINUI_U8GLIB + enum MarlinFont : uint8_t { + FONT_STATUSMENU = 1, + FONT_EDIT, + FONT_MENU + }; +#else + enum HD44780CharSet : uint8_t { + CHARSET_MENU, + CHARSET_INFO, + CHARSET_BOOT + }; +#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 + +#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 //////////// +//////////////////////////////////////////// + +class MarlinUI { +public: + + MarlinUI() { + TERN_(HAS_LCD_MENU, currentScreen = status_screen); + } + + #if HAS_BUZZER + static void buzz(const long duration, const uint16_t freq); + #endif + + FORCE_INLINE static void chirp() { + TERN_(HAS_CHIRP, buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ)); + } + + #if ENABLED(LCD_HAS_STATUS_INDICATORS) + static void update_indicators(); + #endif + + // LCD implementations + static void clear_lcd(); + + #if ENABLED(SDSUPPORT) + 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_WIRED_LCD, refresh(LCDVIEW_CLEAR_CALL_REDRAW)); + } + #endif + + #if HAS_WIRED_LCD + static bool detected(); + static void init_lcd(); + #else + static inline bool detected() { return true; } + static inline void init_lcd() {} + #endif + + #if HAS_PRINT_PROGRESS + #if HAS_PRINT_PROGRESS_PERMYRIAD + typedef uint16_t progress_t; + #define PROGRESS_SCALE 100U + #define PROGRESS_MASK 0x7FFF + #else + typedef uint8_t progress_t; + #define PROGRESS_SCALE 1U + #define PROGRESS_MASK 0x7F + #endif + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + static progress_t progress_override; + static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } + static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } + static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } + #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + static uint32_t remaining_time; + FORCE_INLINE static void set_remaining_time(const uint32_t r) { remaining_time = r; } + FORCE_INLINE static uint32_t get_remaining_time() { return remaining_time; } + FORCE_INLINE static void reset_remaining_time() { set_remaining_time(0); } + #endif + #endif + static progress_t _get_progress(); + #if HAS_PRINT_PROGRESS_PERMYRIAD + FORCE_INLINE static uint16_t get_progress_permyriad() { return _get_progress(); } + #endif + static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); } + #else + static constexpr uint8_t get_progress_percent() { return 0; } + #endif + + #if HAS_DISPLAY + + static void init(); + static void update(); + static void set_alert_status_P(PGM_P const message); + + static char status_message[]; + static bool has_status(); + + static uint8_t alert_level; // Higher levels block lower levels + static inline void reset_alert_level() { alert_level = 0; } + + #if ENABLED(STATUS_MESSAGE_SCROLLING) + static uint8_t status_scroll_offset; + static void advance_status_scroll(); + static char* status_and_len(uint8_t &len); + #endif + + static void abort_print(); + static void pause_print(); + static void resume_print(); + + #if HAS_WIRED_LCD + + static millis_t next_button_update_ms; + + static LCDViewAction lcdDrawUpdate; + FORCE_INLINE static bool should_draw() { return bool(lcdDrawUpdate); } + FORCE_INLINE static void refresh(const LCDViewAction type) { lcdDrawUpdate = type; } + + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + static void draw_custom_bootscreen(const uint8_t frame=0); + static void show_custom_bootscreen(); + #endif + + #if ENABLED(SHOW_BOOTSCREEN) + #ifndef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 2500 + #endif + static void draw_marlin_bootscreen(const bool line2=false); + static void show_marlin_bootscreen(); + static void show_bootscreen(); + #endif + + #if HAS_MARLINUI_U8GLIB + + static void set_font(const MarlinFont font_nr); + + #else + + static void set_custom_characters(const HD44780CharSet screen_charset=CHARSET_INFO); + + #if ENABLED(LCD_PROGRESS_BAR) + static millis_t progress_bar_ms; // Start time for the current progress bar cycle + static void draw_progress_bar(const uint8_t percent); + #if PROGRESS_MSG_EXPIRE > 0 + static millis_t expire_status_ms; // = 0 + FORCE_INLINE static void reset_progress_bar_timeout() { expire_status_ms = 0; } + #endif + #endif + + #endif + + static uint8_t lcd_status_update_delay; + + #if HAS_LCD_CONTRAST + static int16_t contrast; + static void set_contrast(const int16_t value); + FORCE_INLINE static void refresh_contrast() { set_contrast(contrast); } + #endif + + #if BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) + static millis_t next_filament_display; + #endif + + static void quick_feedback(const bool clear_buttons=true); + #if HAS_BUZZER + static void completion_feedback(const bool good=true); + #else + static inline void completion_feedback(const bool=true) {} + #endif + + #if DISABLED(LIGHTWEIGHT_UI) + static void draw_status_message(const bool blink); + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + static void draw_hotend_status(const uint8_t row, const uint8_t extruder); + #endif + + #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 + + static void status_screen(); + + #endif + + #if HAS_MARLINUI_U8GLIB + 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(); + static void set_status(const char* const message, const bool persist=false); + static void set_status_P(PGM_P const message, const int8_t level=0); + static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); + static void reset_status(const bool no_welcome=false); + + #else // No LCD + + // Send status to host as a notification + static void set_status(const char* message, const bool=false); + static void set_status_P(PGM_P message, const int8_t=0); + static void status_printf_P(const uint8_t, PGM_P message, ...); + + static inline void init() {} + static inline void update() {} + static inline void return_to_status() {} + static inline void set_alert_status_P(PGM_P const) {} + static inline void reset_status(const bool=false) {} + static inline void reset_alert_level() {} + static constexpr bool has_status() { return false; } + + #endif + + #if ENABLED(SDSUPPORT) + #if BOTH(SCROLL_LONG_FILENAMES, HAS_LCD_MENU) + #define MARLINUI_SCROLL_NAME 1 + #endif + #if MARLINUI_SCROLL_NAME + static uint8_t filename_scroll_pos, filename_scroll_max; + #endif + 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]; + static PGM_P get_preheat_label(const uint8_t m); + #endif + + #if HAS_LCD_MENU + #if LCD_TIMEOUT_TO_STATUS + static millis_t return_to_status_ms; + #endif + + #if HAS_TOUCH_XPT2046 + static uint8_t touch_buttons; + static uint8_t repeat_delay; + #endif + + #if ENABLED(ENCODER_RATE_MULTIPLIER) + 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 + 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 bool lcd_clicked; + static bool use_click(); + + static void synchronize(PGM_P const msg=nullptr); + + static screenFunc_t currentScreen; + static bool screen_changed; + static void goto_screen(const screenFunc_t screen, const uint16_t encoder=0, const uint8_t top=0, const uint8_t items=0); + static void save_previous_screen(); + + // goto_previous_screen and go_back may also be used as menu item callbacks + static void _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, const bool is_back)); + static inline void goto_previous_screen() { _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, false)); } + static inline void go_back() { _goto_previous_screen(TERN_(TURBO_BACK_MENU_ITEM, true)); } + + static void return_to_status(); + static inline bool on_status_screen() { return currentScreen == status_screen; } + FORCE_INLINE static void run_current_screen() { (*currentScreen)(); } + + #if ENABLED(LIGHTWEIGHT_UI) + static void lcd_in_status(const bool inStatus); + #endif + + FORCE_INLINE static void defer_status_screen(const bool defer=true) { + #if LCD_TIMEOUT_TO_STATUS > 0 + defer_return_to_status = defer; + #else + UNUSED(defer); + #endif + } + + static inline void goto_previous_screen_no_defer() { + defer_status_screen(false); + goto_previous_screen(); + } + + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + static void reselect_last_file(); + #endif + + #if ENABLED(AUTO_BED_LEVELING_UBL) + static void ubl_plot(const uint8_t x_plot, const uint8_t y_plot); + #endif + + static void draw_select_screen_prompt(PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr); + + #elif HAS_WIRED_LCD + + static constexpr bool lcd_clicked = false; + static constexpr bool on_status_screen() { return true; } + FORCE_INLINE static void run_current_screen() { status_screen(); } + + #endif + + // + // EEPROM: Reset / Init / Load / Store + // + #if HAS_LCD_MENU + static void reset_settings(); + #endif + + #if ENABLED(EEPROM_SETTINGS) + #if HAS_LCD_MENU + static void init_eeprom(); + static void load_settings(); + static void store_settings(); + #endif + #if DISABLED(EEPROM_AUTO_INIT) + static void eeprom_alert(const uint8_t msgid); + static inline void eeprom_alert_crc() { eeprom_alert(0); } + static inline void eeprom_alert_index() { eeprom_alert(1); } + static inline void eeprom_alert_version() { eeprom_alert(2); } + #endif + #endif + + // + // Special handling if a move is underway + // + #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) + #define LCD_HAS_WAIT_FOR_MOVE 1 + static bool wait_for_move; + #else + static constexpr bool wait_for_move = false; + #endif + + // + // Block interaction while under external control + // + #if HAS_LCD_MENU && EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) + 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 + + #if HAS_ENCODER_ACTION + + static volatile uint8_t buttons; + #if ENABLED(REPRAPWORLD_KEYPAD) + static volatile uint8_t keypad_buttons; + static bool handle_keypad(); + #endif + #if HAS_SLOW_BUTTONS + static volatile uint8_t slow_buttons; + static uint8_t read_slow_buttons(); + #endif + + static void update_buttons(); + 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 + + static uint32_t encoderPosition; + + #define ENCODERBASE (TERN(REVERSE_ENCODER_DIRECTION, -1, +1)) + + #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) + static int8_t encoderDirection; + #else + static constexpr int8_t encoderDirection = ENCODERBASE; + #endif + + FORCE_INLINE static void encoder_direction_normal() { + #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) + encoderDirection = ENCODERBASE; + #endif + } + + FORCE_INLINE static void encoder_direction_menus() { + TERN_(REVERSE_MENU_DIRECTION, encoderDirection = -(ENCODERBASE)); + } + + FORCE_INLINE static void encoder_direction_select() { + TERN_(REVERSE_SELECT_DIRECTION, encoderDirection = -(ENCODERBASE)); + } + + #else + + static inline void update_buttons() {} + + #endif + + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static void touch_calibration(); + #endif + + #if HAS_GRAPHICAL_TFT + static void move_axis_screen(); + #endif + +private: + + #if HAS_DISPLAY + static void finish_status(const bool persist); + #endif + + #if HAS_WIRED_LCD + #if HAS_LCD_MENU && LCD_TIMEOUT_TO_STATUS > 0 + static bool defer_return_to_status; + #else + 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 +}; + +extern MarlinUI ui; + +#define LCD_MESSAGEPGM_P(x) ui.set_status_P(x) +#define LCD_ALERTMESSAGEPGM_P(x) ui.set_alert_status_P(x) + +#define LCD_MESSAGEPGM(x) LCD_MESSAGEPGM_P(GET_TEXT(x)) +#define LCD_ALERTMESSAGEPGM(x) LCD_ALERTMESSAGEPGM_P(GET_TEXT(x)) diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp new file mode 100644 index 00000000..d34ed834 --- /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/libs/BL24CXX.h b/Marlin/src/libs/BL24CXX.h new file mode 100644 index 00000000..b069c196 --- /dev/null +++ b/Marlin/src/libs/BL24CXX.h @@ -0,0 +1,72 @@ +/** + * 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 + +/******************************************************************************** + * @file BL24CXX.h + * @brief i2c EEPROM for Ender 3 v2 board (4.2.2) + ********************************************************************************/ + +/******************** IIC ********************/ + +class BL24CXX; + +// All operation functions of IIC +class IIC { +friend class BL24CXX; +protected: + 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 +}; + +/******************** EEPROM ********************/ + +#define BL24C01 127 +#define BL24C02 255 +#define BL24C04 511 +#define BL24C08 1023 +#define BL24C16 2047 +#define BL24C32 4095 +#define BL24C64 8191 +#define BL24C128 16383 +#define BL24C256 32767 +#define EE_TYPE BL24C16 + +class BL24CXX { +private: + static bool _check(); // Check the device +public: + 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/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp new file mode 100644 index 00000000..dd85473e --- /dev/null +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -0,0 +1,936 @@ +/** + * 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 . + * + */ + +/** + * The monitor_driver routines are a close copy of the TMC code + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_L64XX + +#include "L64XX_Marlin.h" + +L64XX_Marlin L64xxManager; + +#include "../../module/stepper/indirection.h" +#include "../../gcode/gcode.h" +#include "../../module/planner.h" +#include "../../HAL/shared/Delay.h" + +void echo_yes_no(const bool yes) { serialprintPGM(yes ? PSTR(" YES") : PSTR(" NO ")); } + +static const char str_X[] PROGMEM = "X ", str_Y[] PROGMEM = "Y ", str_Z[] PROGMEM = "Z ", + str_X2[] PROGMEM = "X2", str_Y2[] PROGMEM = "Y2", + str_Z2[] PROGMEM = "Z2", str_Z3[] PROGMEM = "Z3", str_Z4[] PROGMEM = "Z4", + str_E0[] PROGMEM = "E0", str_E1[] PROGMEM = "E1", + str_E2[] PROGMEM = "E2", str_E3[] PROGMEM = "E3", + str_E4[] PROGMEM = "E4", str_E5[] PROGMEM = "E5", + str_E6[] PROGMEM = "E6", str_E7[] PROGMEM = "E7" + ; + +PGM_P const L64XX_Marlin::index_to_axis[] PROGMEM = { + str_X, str_Y, str_Z, str_X2, str_Y2, str_Z2, str_Z3, str_Z4, + str_E0, str_E1, str_E2, str_E3, str_E4, str_E5, str_E6, str_E7 +}; + +#define DEBUG_OUT ENABLED(L6470_CHITCHAT) +#include "../../core/debug_out.h" + +uint8_t L64XX_Marlin::dir_commands[MAX_L64XX]; // array to hold direction command for each driver + +const uint8_t L64XX_Marlin::index_to_dir[MAX_L64XX] = { + INVERT_X_DIR, INVERT_Y_DIR, INVERT_Z_DIR + , (INVERT_X_DIR) // X2 + #if ENABLED(X_DUAL_STEPPER_DRIVERS) + ^ (INVERT_X2_VS_X_DIR) + #endif + , (INVERT_Y_DIR) // Y2 + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) + ^ (INVERT_Y2_VS_Y_DIR) + #endif + , INVERT_Z_DIR, INVERT_Z_DIR, INVERT_Z_DIR // Z2,Z3,Z4 + + , INVERT_E0_DIR, INVERT_E1_DIR, INVERT_E2_DIR, INVERT_E3_DIR + , INVERT_E4_DIR, INVERT_E5_DIR, INVERT_E6_DIR, INVERT_E7_DIR +}; + +volatile uint8_t L64XX_Marlin::spi_abort = false; +uint8_t L64XX_Marlin::spi_active = false; + +L64XX_Marlin::L64XX_shadow_t L64XX_Marlin::shadow; + +//uint32_t UVLO_ADC = 0x0400; // ADC undervoltage event + +void L6470_populate_chain_array() { + + #define _L6470_INIT_SPI(Q) do{ stepper##Q.set_chain_info(Q, Q##_CHAIN_POS); }while(0) + + #if AXIS_IS_L64XX(X) + _L6470_INIT_SPI(X); + #endif + #if AXIS_IS_L64XX(X2) + _L6470_INIT_SPI(X2); + #endif + #if AXIS_IS_L64XX(Y) + _L6470_INIT_SPI(Y); + #endif + #if AXIS_IS_L64XX(Y2) + _L6470_INIT_SPI(Y2); + #endif + #if AXIS_IS_L64XX(Z) + _L6470_INIT_SPI(Z); + #endif + #if AXIS_IS_L64XX(Z2) + _L6470_INIT_SPI(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + _L6470_INIT_SPI(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + _L6470_INIT_SPI(Z4); + #endif + #if AXIS_IS_L64XX(E0) + _L6470_INIT_SPI(E0); + #endif + #if AXIS_IS_L64XX(E1) + _L6470_INIT_SPI(E1); + #endif + #if AXIS_IS_L64XX(E2) + _L6470_INIT_SPI(E2); + #endif + #if AXIS_IS_L64XX(E3) + _L6470_INIT_SPI(E3); + #endif + #if AXIS_IS_L64XX(E4) + _L6470_INIT_SPI(E4); + #endif + #if AXIS_IS_L64XX(E5) + _L6470_INIT_SPI(E5); + #endif + #if AXIS_IS_L64XX(E6) + _L6470_INIT_SPI(E6); + #endif + #if AXIS_IS_L64XX(E7) + _L6470_INIT_SPI(E7); + #endif +} + + +/** + * Some status bit positions & definitions differ per driver. + * Copy info to known locations to simplfy check/display logic. + * 1. Copy stepper status + * 2. Copy status bit definitions + * 3. Copy status layout + * 4. Make all error bits active low (as needed) + */ +uint16_t L64XX_Marlin::get_stepper_status(L64XX &st) { + shadow.STATUS_AXIS_RAW = st.getStatus(); + shadow.STATUS_AXIS = shadow.STATUS_AXIS_RAW; + shadow.STATUS_AXIS_LAYOUT = st.L6470_status_layout; + shadow.AXIS_OCD_TH_MAX = st.OCD_TH_MAX; + shadow.AXIS_STALL_TH_MAX = st.STALL_TH_MAX; + shadow.AXIS_OCD_CURRENT_CONSTANT_INV = st.OCD_CURRENT_CONSTANT_INV; + shadow.AXIS_STALL_CURRENT_CONSTANT_INV = st.STALL_CURRENT_CONSTANT_INV; + shadow.L6470_AXIS_CONFIG = st.L64XX_CONFIG; + shadow.L6470_AXIS_STATUS = st.L64XX_STATUS; + shadow.STATUS_AXIS_OCD = st.STATUS_OCD; + shadow.STATUS_AXIS_SCK_MOD = st.STATUS_SCK_MOD; + shadow.STATUS_AXIS_STEP_LOSS_A = st.STATUS_STEP_LOSS_A; + shadow.STATUS_AXIS_STEP_LOSS_B = st.STATUS_STEP_LOSS_B; + shadow.STATUS_AXIS_TH_SD = st.STATUS_TH_SD; + shadow.STATUS_AXIS_TH_WRN = st.STATUS_TH_WRN; + shadow.STATUS_AXIS_UVLO = st.STATUS_UVLO; + shadow.STATUS_AXIS_WRONG_CMD = st.STATUS_WRONG_CMD; + shadow.STATUS_AXIS_CMD_ERR = st.STATUS_CMD_ERR; + shadow.STATUS_AXIS_NOTPERF_CMD = st.STATUS_NOTPERF_CMD; + + switch (shadow.STATUS_AXIS_LAYOUT) { + case L6470_STATUS_LAYOUT: { // L6470 + shadow.L6470_ERROR_MASK = shadow.STATUS_AXIS_UVLO | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD | shadow.STATUS_AXIS_OCD | shadow.STATUS_AXIS_STEP_LOSS_A | shadow.STATUS_AXIS_STEP_LOSS_B; + shadow.STATUS_AXIS ^= (shadow.STATUS_AXIS_WRONG_CMD | shadow.STATUS_AXIS_NOTPERF_CMD); // invert just error bits that are active high + break; + } + case L6474_STATUS_LAYOUT: { // L6474 + shadow.L6470_ERROR_MASK = shadow.STATUS_AXIS_UVLO | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD | shadow.STATUS_AXIS_OCD ; + shadow.STATUS_AXIS ^= (shadow.STATUS_AXIS_WRONG_CMD | shadow.STATUS_AXIS_NOTPERF_CMD); // invert just error bits that are active high + break; + } + case L6480_STATUS_LAYOUT: { // L6480 & powerSTEP01 + shadow.L6470_ERROR_MASK = shadow.STATUS_AXIS_UVLO | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD | shadow.STATUS_AXIS_OCD | shadow.STATUS_AXIS_STEP_LOSS_A | shadow.STATUS_AXIS_STEP_LOSS_B; + shadow.STATUS_AXIS ^= (shadow.STATUS_AXIS_CMD_ERR | shadow.STATUS_AXIS_TH_WRN | shadow.STATUS_AXIS_TH_SD); // invert just error bits that are active high + break; + } + } + return shadow.STATUS_AXIS; +} + + +void L64XX_Marlin::init() { // Set up SPI and then init chips + ENABLE_RESET_L64XX_CHIPS(LOW); // hardware reset of drivers + DELAY_US(100); + ENABLE_RESET_L64XX_CHIPS(HIGH); + DELAY_US(1000); // need about 650µs for the chip(s) to fully start up + L6470_populate_chain_array(); // Set up array to control where in the SPI transfer sequence a particular stepper's data goes + + spi_init(); // Since L64XX SPI pins are unset we must init SPI here + + init_to_defaults(); // init the chips +} + +uint16_t L64XX_Marlin::get_status(const L64XX_axis_t axis) { + + #define STATUS_L6470(Q) get_stepper_status(stepper##Q) + + switch (axis) { + default: break; + #if AXIS_IS_L64XX(X) + case X : return STATUS_L6470(X); + #endif + #if AXIS_IS_L64XX(Y) + case Y : return STATUS_L6470(Y); + #endif + #if AXIS_IS_L64XX(Z) + case Z : return STATUS_L6470(Z); + #endif + #if AXIS_IS_L64XX(X2) + case X2: return STATUS_L6470(X2); + #endif + #if AXIS_IS_L64XX(Y2) + case Y2: return STATUS_L6470(Y2); + #endif + #if AXIS_IS_L64XX(Z2) + case Z2: return STATUS_L6470(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + case Z3: return STATUS_L6470(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + case Z4: return STATUS_L6470(Z4); + #endif + #if AXIS_IS_L64XX(E0) + case E0: return STATUS_L6470(E0); + #endif + #if AXIS_IS_L64XX(E1) + case E1: return STATUS_L6470(E1); + #endif + #if AXIS_IS_L64XX(E2) + case E2: return STATUS_L6470(E2); + #endif + #if AXIS_IS_L64XX(E3) + case E3: return STATUS_L6470(E3); + #endif + #if AXIS_IS_L64XX(E4) + case E4: return STATUS_L6470(E4); + #endif + #if AXIS_IS_L64XX(E5) + case E5: return STATUS_L6470(E5); + #endif + #if AXIS_IS_L64XX(E6) + case E6: return STATUS_L6470(E6); + #endif + #if AXIS_IS_L64XX(E7) + case E7: return STATUS_L6470(E7); + #endif + } + + return 0; // Not needed but kills a compiler warning +} + +uint32_t L64XX_Marlin::get_param(const L64XX_axis_t axis, const uint8_t param) { + + #define GET_L6470_PARAM(Q) L6470_GETPARAM(param, Q) + + switch (axis) { + default: break; + #if AXIS_IS_L64XX(X) + case X : return GET_L6470_PARAM(X); + #endif + #if AXIS_IS_L64XX(Y) + case Y : return GET_L6470_PARAM(Y); + #endif + #if AXIS_IS_L64XX(Z) + case Z : return GET_L6470_PARAM(Z); + #endif + #if AXIS_IS_L64XX(X2) + case X2: return GET_L6470_PARAM(X2); + #endif + #if AXIS_IS_L64XX(Y2) + case Y2: return GET_L6470_PARAM(Y2); + #endif + #if AXIS_IS_L64XX(Z2) + case Z2: return GET_L6470_PARAM(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + case Z3: return GET_L6470_PARAM(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + case Z4: return GET_L6470_PARAM(Z4); + #endif + #if AXIS_IS_L64XX(E0) + case E0: return GET_L6470_PARAM(E0); + #endif + #if AXIS_IS_L64XX(E1) + case E1: return GET_L6470_PARAM(E1); + #endif + #if AXIS_IS_L64XX(E2) + case E2: return GET_L6470_PARAM(E2); + #endif + #if AXIS_IS_L64XX(E3) + case E3: return GET_L6470_PARAM(E3); + #endif + #if AXIS_IS_L64XX(E4) + case E4: return GET_L6470_PARAM(E4); + #endif + #if AXIS_IS_L64XX(E5) + case E5: return GET_L6470_PARAM(E5); + #endif + #if AXIS_IS_L64XX(E6) + case E6: return GET_L6470_PARAM(E6); + #endif + #if AXIS_IS_L64XX(E7) + case E7: return GET_L6470_PARAM(E7); + #endif + } + + return 0; // not needed but kills a compiler warning +} + +void L64XX_Marlin::set_param(const L64XX_axis_t axis, const uint8_t param, const uint32_t value) { + + #define SET_L6470_PARAM(Q) stepper##Q.SetParam(param, value) + + switch (axis) { + default: break; + #if AXIS_IS_L64XX(X) + case X : SET_L6470_PARAM(X); break; + #endif + #if AXIS_IS_L64XX(Y) + case Y : SET_L6470_PARAM(Y); break; + #endif + #if AXIS_IS_L64XX(Z) + case Z : SET_L6470_PARAM(Z); break; + #endif + #if AXIS_IS_L64XX(X2) + case X2: SET_L6470_PARAM(X2); break; + #endif + #if AXIS_IS_L64XX(Y2) + case Y2: SET_L6470_PARAM(Y2); break; + #endif + #if AXIS_IS_L64XX(Z2) + case Z2: SET_L6470_PARAM(Z2); break; + #endif + #if AXIS_IS_L64XX(Z3) + case Z3: SET_L6470_PARAM(Z3); break; + #endif + #if AXIS_IS_L64XX(Z4) + case Z4: SET_L6470_PARAM(Z4); break; + #endif + #if AXIS_IS_L64XX(E0) + case E0: SET_L6470_PARAM(E0); break; + #endif + #if AXIS_IS_L64XX(E1) + case E1: SET_L6470_PARAM(E1); break; + #endif + #if AXIS_IS_L64XX(E2) + case E2: SET_L6470_PARAM(E2); break; + #endif + #if AXIS_IS_L64XX(E3) + case E3: SET_L6470_PARAM(E3); break; + #endif + #if AXIS_IS_L64XX(E4) + case E4: SET_L6470_PARAM(E4); break; + #endif + #if AXIS_IS_L64XX(E5) + case E5: SET_L6470_PARAM(E5); break; + #endif + #if AXIS_IS_L64XX(E6) + case E6: SET_L6470_PARAM(E6); break; + #endif + #if AXIS_IS_L64XX(E7) + case E7: SET_L6470_PARAM(E7); break; + #endif + } +} + +inline void echo_min_max(const char a, const float &min, const float &max) { + DEBUG_CHAR(' '); DEBUG_CHAR(a); + DEBUG_ECHOPAIR(" min = ", min); + DEBUG_ECHOLNPAIR(" max = ", max); +} +inline void echo_oct_used(const float &oct, const uint8_t stall) { + DEBUG_ECHOPAIR("over_current_threshold used : ", oct); + serialprintPGM(stall ? PSTR(" (Stall") : PSTR(" (OCD")); + DEBUG_ECHOLNPGM(" threshold)"); +} +inline void err_out_of_bounds() { DEBUG_ECHOLNPGM("Test aborted - motion out of bounds"); } + +uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_index[3], char axis_mon[3][3], + float &position_max, float &position_min, float &final_feedrate, uint8_t &kval_hold, + uint8_t over_current_flag, uint8_t &OCD_TH_val, uint8_t &STALL_TH_val, uint16_t &over_current_threshold +) { + // Return TRUE if the calling routine needs to abort/kill + + uint16_t displacement = 0; // " = 0" to eliminate compiler warning + uint8_t j; // general purpose counter + + if (!all_axes_homed()) { + DEBUG_ECHOLNPGM("Test aborted - home all before running this command"); + return true; + } + + uint8_t found_displacement = false; + LOOP_XYZE(i) if (uint16_t _displacement = parser.intval(axis_codes[i])) { + found_displacement = true; + displacement = _displacement; + uint8_t axis_offset = parser.byteval('J'); + axis_mon[0][0] = axis_codes[i]; // Axis first character, one of XYZE + const bool single_or_e = axis_offset >= 2 || axis_mon[0][0] == 'E', + one_or_more = !single_or_e && axis_offset == 0; + uint8_t driver_count_local = 0; // Can't use "driver_count" directly as a subscript because it's passed by reference + if (single_or_e) // Single axis, E0, or E1 + axis_mon[0][1] = axis_offset + '0'; // Index given by 'J' parameter + + if (single_or_e || one_or_more) { + for (j = 0; j < MAX_L64XX; j++) { // Count up the drivers on this axis + PGM_P str = (PGM_P)pgm_read_ptr(&index_to_axis[j]); // Get a PGM_P from progmem + const char c = pgm_read_byte(str); // Get a char from progmem + if (axis_mon[0][0] == c) { // For each stepper on this axis... + char *mon = axis_mon[driver_count_local]; + *mon++ = c; // Copy the 3 letter axis name + *mon++ = pgm_read_byte(&str[1]); // to the axis_mon array + *mon = pgm_read_byte(&str[2]); + axis_index[driver_count_local] = (L64XX_axis_t)j; // And store the L64XX axis index + driver_count_local++; + } + } + if (one_or_more) driver_count = driver_count_local; + } + break; // only take first axis found + } + + if (!found_displacement) { + DEBUG_ECHOLNPGM("Test aborted - AXIS with displacement is required"); + return true; + } + + // + // Position calcs & checks + // + + const float X_center = LOGICAL_X_POSITION(current_position.x), + Y_center = LOGICAL_Y_POSITION(current_position.y), + Z_center = LOGICAL_Z_POSITION(current_position.z), + E_center = current_position.e; + + switch (axis_mon[0][0]) { + default: position_max = position_min = 0; break; + + case 'X': { + position_min = X_center - displacement; + position_max = X_center + displacement; + echo_min_max('X', position_min, position_max); + if (false + #ifdef X_MIN_POS + || position_min < (X_MIN_POS) + #endif + #ifdef X_MAX_POS + || position_max > (X_MAX_POS) + #endif + ) { + err_out_of_bounds(); + return true; + } + } break; + + case 'Y': { + position_min = Y_center - displacement; + position_max = Y_center + displacement; + echo_min_max('Y', position_min, position_max); + if (false + #ifdef Y_MIN_POS + || position_min < (Y_MIN_POS) + #endif + #ifdef Y_MAX_POS + || position_max > (Y_MAX_POS) + #endif + ) { + err_out_of_bounds(); + return true; + } + } break; + + case 'Z': { + position_min = Z_center - displacement; + position_max = Z_center + displacement; + echo_min_max('Z', position_min, position_max); + if (false + #ifdef Z_MIN_POS + || position_min < (Z_MIN_POS) + #endif + #ifdef Z_MAX_POS + || position_max > (Z_MAX_POS) + #endif + ) { + err_out_of_bounds(); + return true; + } + } break; + + case 'E': { + position_min = E_center - displacement; + position_max = E_center + displacement; + echo_min_max('E', position_min, position_max); + } break; + } + + // + // Work on the drivers + // + + LOOP_L_N(k, driver_count) { + uint8_t not_found = true; + for (j = 1; j <= L64XX::chain[0]; j++) { + PGM_P const str = (PGM_P)pgm_read_ptr(&index_to_axis[L64XX::chain[j]]); + if (pgm_read_byte(&str[0]) == axis_mon[k][0] && pgm_read_byte(&str[1]) == axis_mon[k][1]) { // See if a L6470 driver + not_found = false; + break; + } + } + if (not_found) { + driver_count = k; + axis_mon[k][0] = ' '; // mark this entry invalid + break; + } + } + + if (driver_count == 0) { + DEBUG_ECHOLNPGM("Test aborted - not a L6470 axis"); + return true; + } + + DEBUG_ECHOPGM("Monitoring:"); + for (j = 0; j < driver_count; j++) DEBUG_ECHOPAIR(" ", axis_mon[j]); + DEBUG_EOL(); + + // now have a list of driver(s) to monitor + + // + // TVAL & kVAL_HOLD checks & settings + // + const L64XX_shadow_t &sh = shadow; + get_status(axis_index[0]); // populate shadow array + + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // L6474 - use TVAL + uint16_t TVAL_current = parser.ushortval('T'); + if (TVAL_current) { + uint8_t TVAL_count = (TVAL_current / sh.AXIS_STALL_CURRENT_CONSTANT_INV) - 1; + LIMIT(TVAL_count, 0, sh.AXIS_STALL_TH_MAX); + for (j = 0; j < driver_count; j++) + set_param(axis_index[j], L6474_TVAL, TVAL_count); + } + // only print the tval from one of the drivers + kval_hold = get_param(axis_index[0], L6474_TVAL); + DEBUG_ECHOLNPAIR("TVAL current (mA) = ", (kval_hold + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV); + } + else { + kval_hold = parser.byteval('K'); + if (kval_hold) { + DEBUG_ECHOLNPAIR("kval_hold = ", kval_hold); + for (j = 0; j < driver_count; j++) + set_param(axis_index[j], L6470_KVAL_HOLD, kval_hold); + } + else { + // only print the KVAL_HOLD from one of the drivers + kval_hold = get_param(axis_index[0], L6470_KVAL_HOLD); + DEBUG_ECHOLNPAIR("KVAL_HOLD = ", kval_hold); + } + } + + // + // Overcurrent checks & settings + // + + if (over_current_flag) { + + uint8_t OCD_TH_val_local = 0, // compiler thinks OCD_TH_val is unused if use it directly + STALL_TH_val_local = 0; // just in case ... + + over_current_threshold = parser.intval('I'); + + if (over_current_threshold) { + + OCD_TH_val_local = over_current_threshold/375; + LIMIT(OCD_TH_val_local, 0, 15); + STALL_TH_val_local = over_current_threshold/31.25; + LIMIT(STALL_TH_val_local, 0, 127); + uint16_t OCD_TH_actual = (OCD_TH_val_local + 1) * 375, + STALL_TH_actual = (STALL_TH_val_local + 1) * 31.25; + if (OCD_TH_actual < STALL_TH_actual) { + OCD_TH_val_local++; + OCD_TH_actual = (OCD_TH_val_local + 1) * 375; + } + + DEBUG_ECHOLNPAIR("over_current_threshold specified: ", over_current_threshold); + if (!(sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT)) echo_oct_used((STALL_TH_val_local + 1) * 31.25, true); + echo_oct_used((OCD_TH_val_local + 1) * 375, false); + + #define SET_OVER_CURRENT(Q) do { stepper##Q.SetParam(L6470_STALL_TH, STALL_TH_val_local); stepper##Q.SetParam(L6470_OCD_TH, OCD_TH_val_local);} while (0) + + for (j = 0; j < driver_count; j++) { + set_param(axis_index[j], L6470_STALL_TH, STALL_TH_val_local); + set_param(axis_index[j], L6470_OCD_TH, OCD_TH_val_local); + } + } + else { + // only get & print the OVER_CURRENT values from one of the drivers + STALL_TH_val_local = get_param(axis_index[0], L6470_STALL_TH); + OCD_TH_val_local = get_param(axis_index[0], L6470_OCD_TH); + + if (!(sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT)) echo_oct_used((STALL_TH_val_local + 1) * 31.25, true); + echo_oct_used((OCD_TH_val_local + 1) * 375, false); + } // over_current_threshold + + for (j = 0; j < driver_count; j++) { // set all drivers on axis the same + set_param(axis_index[j], L6470_STALL_TH, STALL_TH_val_local); + set_param(axis_index[j], L6470_OCD_TH, OCD_TH_val_local); + } + + OCD_TH_val = OCD_TH_val_local; // force compiler to update the main routine's copy + STALL_TH_val = STALL_TH_val_local; // force compiler to update the main routine's copy + } // end of overcurrent + + // + // Feedrate + // + + final_feedrate = parser.floatval('F'); + if (final_feedrate == 0) { + static constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; + const uint8_t num_feedrates = COUNT(default_max_feedrate); + for (j = 0; j < num_feedrates; j++) { + if (axis_codes[j] == axis_mon[0][0]) { + final_feedrate = default_max_feedrate[j]; + break; + } + } + if (j == 3 && num_feedrates > 4) { // have more than one extruder feedrate + uint8_t extruder_num = axis_mon[0][1] - '0'; + if (j <= num_feedrates - extruder_num) // have a feedrate specifically for this extruder + final_feedrate = default_max_feedrate[j + extruder_num]; + else + final_feedrate = default_max_feedrate[3]; // use E0 feedrate for this extruder + } + final_feedrate *= 60; // convert to mm/minute + } // end of feedrate + + return false; // FALSE indicates no user input problems +} + +void L64XX_Marlin::say_axis(const L64XX_axis_t axis, const uint8_t label/*=true*/) { + if (label) SERIAL_ECHOPGM("AXIS:"); + const char * const str = L64xxManager.index_to_axis[axis]; + SERIAL_CHAR(' ', str[0], str[1], ' '); +} + +#if ENABLED(L6470_CHITCHAT) + + // Assumes status bits have been inverted + void L64XX_Marlin::error_status_decode(const uint16_t status, const L64XX_axis_t axis, + const uint16_t _status_axis_th_sd, const uint16_t _status_axis_th_wrn, + const uint16_t _status_axis_step_loss_a, const uint16_t _status_axis_step_loss_b, + const uint16_t _status_axis_ocd, const uint8_t _status_axis_layout + ) { + say_axis(axis); + DEBUG_ECHOPGM(" THERMAL: "); + serialprintPGM((status & _status_axis_th_sd) ? PSTR("SHUTDOWN") : (status & _status_axis_th_wrn) ? PSTR("WARNING ") : PSTR("OK ")); + DEBUG_ECHOPGM(" OVERCURRENT: "); + echo_yes_no((status & _status_axis_ocd) != 0); + if (!(_status_axis_layout == L6474_STATUS_LAYOUT)) { // L6474 doesn't have these bits + DEBUG_ECHOPGM(" STALL: "); + echo_yes_no((status & (_status_axis_step_loss_a | _status_axis_step_loss_b)) != 0); + } + DEBUG_EOL(); + } + +#endif + +////////////////////////////////////////////////////////////////////////////////////////////////// +//// +//// MONITOR_L6470_DRIVER_STATUS routines +//// +////////////////////////////////////////////////////////////////////////////////////////////////// + +#if ENABLED(MONITOR_L6470_DRIVER_STATUS) + + bool L64XX_Marlin::monitor_paused = false; // Flag to skip monitor during M122, M906, M916, M917, M918, etc. + + struct L6470_driver_data { + uint8_t driver_index; + uint32_t driver_status; + uint8_t is_otw; + uint8_t otw_counter; + uint8_t is_ot; + uint8_t is_hi_Z; + uint8_t com_counter; + }; + + L6470_driver_data driver_L6470_data[] = { + #if AXIS_IS_L64XX(X) + { 0, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(Y) + { 1, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(Z) + { 2, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(X2) + { 3, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(Y2) + { 4, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(Z2) + { 5, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(Z3) + { 6, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(Z4) + { 7, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(E0) + { 8, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(E1) + { 9, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(E2) + { 10, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(E3) + { 11, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(E4) + { 12, 0, 0, 0, 0, 0, 0 }, + #endif + #if AXIS_IS_L64XX(E5) + { 13, 0, 0, 0, 0, 0, 0 } + #endif + #if AXIS_IS_L64XX(E6) + { 14, 0, 0, 0, 0, 0, 0 } + #endif + #if AXIS_IS_L64XX(E7) + { 16, 0, 0, 0, 0, 0, 0 } + #endif + }; + + void L64XX_Marlin::append_stepper_err(char* &p, const uint8_t stepper_index, const char * const err/*=nullptr*/) { + PGM_P const str = (PGM_P)pgm_read_ptr(&index_to_axis[stepper_index]); + p += sprintf_P(p, PSTR("Stepper %c%c "), pgm_read_byte(&str[0]), pgm_read_byte(&str[1])); + if (err) p += sprintf_P(p, err); + } + + void L64XX_Marlin::monitor_update(L64XX_axis_t stepper_index) { + if (spi_abort) return; // don't do anything if set_directions() has occurred + const L64XX_shadow_t &sh = shadow; + get_status(stepper_index); // get stepper status and details + uint16_t status = sh.STATUS_AXIS; + uint8_t kval_hold, tval; + char temp_buf[120], *p = temp_buf; + uint8_t j; + for (j = 0; j < L64XX::chain[0]; j++) // find the table for this stepper + if (driver_L6470_data[j].driver_index == stepper_index) break; + + driver_L6470_data[j].driver_status = status; + uint16_t _status = ~status; // all error bits are active low + + if (status == 0 || status == 0xFFFF) { // com problem + if (driver_L6470_data[j].com_counter == 0) { // warn user when it first happens + driver_L6470_data[j].com_counter++; + append_stepper_err(p, stepper_index, PSTR(" - communications lost\n")); + DEBUG_ECHO(temp_buf); + } + else { + driver_L6470_data[j].com_counter++; + if (driver_L6470_data[j].com_counter > 240) { // remind of com problem about every 2 minutes + driver_L6470_data[j].com_counter = 1; + append_stepper_err(p, stepper_index, PSTR(" - still no communications\n")); + DEBUG_ECHO(temp_buf); + } + } + } + else { + if (driver_L6470_data[j].com_counter) { // comms re-established + driver_L6470_data[j].com_counter = 0; + append_stepper_err(p, stepper_index, PSTR(" - communications re-established\n.. setting all drivers to default values\n")); + DEBUG_ECHO(temp_buf); + init_to_defaults(); + } + else { + // no com problems - do the usual checks + if (_status & sh.L6470_ERROR_MASK) { + append_stepper_err(p, stepper_index); + + if (status & STATUS_HIZ) { // The driver has shut down. HiZ is active high + driver_L6470_data[j].is_hi_Z = true; + p += sprintf_P(p, PSTR("%cIS SHUT DOWN"), ' '); + //if (_status & sh.STATUS_AXIS_TH_SD) { // strange - TH_SD never seems to go active, must be implied by the HiZ and TH_WRN + if (_status & sh.STATUS_AXIS_TH_WRN) { // over current shutdown + p += sprintf_P(p, PSTR("%cdue to over temperature"), ' '); + driver_L6470_data[j].is_ot = true; + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // L6474 + tval = get_param(stepper_index, L6474_TVAL) - 2 * KVAL_HOLD_STEP_DOWN; + set_param(stepper_index, L6474_TVAL, tval); // reduce TVAL + p += sprintf_P(p, PSTR(" - TVAL reduced by %d to %d mA"), uint16_t (2 * KVAL_HOLD_STEP_DOWN * sh.AXIS_STALL_CURRENT_CONSTANT_INV), uint16_t ((tval + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV)); // let user know + } + else { + kval_hold = get_param(stepper_index, L6470_KVAL_HOLD) - 2 * KVAL_HOLD_STEP_DOWN; + set_param(stepper_index, L6470_KVAL_HOLD, kval_hold); // reduce KVAL_HOLD + p += sprintf_P(p, PSTR(" - KVAL_HOLD reduced by %d to %d"), 2 * KVAL_HOLD_STEP_DOWN, kval_hold); // let user know + } + } + else + driver_L6470_data[j].is_ot = false; + } + else { + driver_L6470_data[j].is_hi_Z = false; + + if (_status & sh.STATUS_AXIS_TH_WRN) { // have an over temperature warning + driver_L6470_data[j].is_otw = true; + driver_L6470_data[j].otw_counter++; + kval_hold = get_param(stepper_index, L6470_KVAL_HOLD); + if (driver_L6470_data[j].otw_counter > 4) { // otw present for 2 - 2.5 seconds, reduce KVAL_HOLD + driver_L6470_data[j].otw_counter = 0; + driver_L6470_data[j].is_otw = true; + if (sh.STATUS_AXIS_LAYOUT == L6474_STATUS_LAYOUT) { // L6474 + tval = get_param(stepper_index, L6474_TVAL) - KVAL_HOLD_STEP_DOWN; + set_param(stepper_index, L6474_TVAL, tval); // reduce TVAL + p += sprintf_P(p, PSTR(" - TVAL reduced by %d to %d mA"), uint16_t (KVAL_HOLD_STEP_DOWN * sh.AXIS_STALL_CURRENT_CONSTANT_INV), uint16_t ((tval + 1) * sh.AXIS_STALL_CURRENT_CONSTANT_INV)); // let user know + } + else { + kval_hold = get_param(stepper_index, L6470_KVAL_HOLD) - KVAL_HOLD_STEP_DOWN; + set_param(stepper_index, L6470_KVAL_HOLD, kval_hold); // reduce KVAL_HOLD + p += sprintf_P(p, PSTR(" - KVAL_HOLD reduced by %d to %d"), KVAL_HOLD_STEP_DOWN, kval_hold); // let user know + } + } + else if (driver_L6470_data[j].otw_counter) + p += sprintf_P(p, PSTR("%c- thermal warning"), ' '); // warn user + } + } + + #if ENABLED(L6470_STOP_ON_ERROR) + if (_status & (sh.STATUS_AXIS_UVLO | sh.STATUS_AXIS_TH_WRN | sh.STATUS_AXIS_TH_SD)) + kill(temp_buf); + #endif + + #if ENABLED(L6470_CHITCHAT) + if (_status & sh.STATUS_AXIS_OCD) + p += sprintf_P(p, PSTR("%c over current"), ' '); + + if (_status & (sh.STATUS_AXIS_STEP_LOSS_A | sh.STATUS_AXIS_STEP_LOSS_B)) + p += sprintf_P(p, PSTR("%c stall"), ' '); + + if (_status & sh.STATUS_AXIS_UVLO) + p += sprintf_P(p, PSTR("%c under voltage lock out"), ' '); + + p += sprintf_P(p, PSTR("%c\n"), ' '); + #endif + + DEBUG_ECHOLN(temp_buf); // print the error message + } + else { + driver_L6470_data[j].is_ot = false; + driver_L6470_data[j].otw_counter = 0; //clear out warning indicators + driver_L6470_data[j].is_otw = false; + } // end usual checks + + } // comms established but have errors + } // comms re-established + } // end monitor_update() + + + void L64XX_Marlin::monitor_driver() { + static millis_t next_cOT = 0; + if (ELAPSED(millis(), next_cOT)) { + next_cOT = millis() + 500; + + if (!monitor_paused) { // Skip during M122, M906, M916, M917 or M918 (could steal status result from test) + + spi_active = true; // Tell set_directions() a series of SPI transfers is underway + + #if AXIS_IS_L64XX(X) + monitor_update(X); + #endif + #if AXIS_IS_L64XX(Y) + monitor_update(Y); + #endif + #if AXIS_IS_L64XX(Z) + monitor_update(Z); + #endif + #if AXIS_IS_L64XX(X2) + monitor_update(X2); + #endif + #if AXIS_IS_L64XX(Y2) + monitor_update(Y2); + #endif + #if AXIS_IS_L64XX(Z2) + monitor_update(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + monitor_update(Z3); + #endif + #if AXIS_IS_L64XX(Z4) + monitor_update(Z4); + #endif + #if AXIS_IS_L64XX(E0) + monitor_update(E0); + #endif + #if AXIS_IS_L64XX(E1) + monitor_update(E1); + #endif + #if AXIS_IS_L64XX(E2) + monitor_update(E2); + #endif + #if AXIS_IS_L64XX(E3) + monitor_update(E3); + #endif + #if AXIS_IS_L64XX(E4) + monitor_update(E4); + #endif + #if AXIS_IS_L64XX(E5) + monitor_update(E5); + #endif + + if (TERN0(L6470_DEBUG, report_L6470_status)) DEBUG_EOL(); + + spi_active = false; // done with all SPI transfers - clear handshake flags + spi_abort = false; + } + } + } + +#endif // MONITOR_L6470_DRIVER_STATUS + +#endif // HAS_L64XX diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.h b/Marlin/src/libs/L64XX/L64XX_Marlin.h new file mode 100644 index 00000000..c8d27399 --- /dev/null +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.h @@ -0,0 +1,139 @@ +/** + * 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 +#if !(L6470_LIBRARY_VERSION >= 0x000800) + #error 'L6470_LIBRARY_VERSION 0x000800 or later required' +#endif + +#define L6470_GETPARAM(P,Q) stepper##Q.GetParam(P) + +#define dSPIN_STEP_CLOCK 0x58 +#define dSPIN_STEP_CLOCK_FWD dSPIN_STEP_CLOCK +#define dSPIN_STEP_CLOCK_REV dSPIN_STEP_CLOCK+1 +#define HAS_L64XX_EXTRUDER (AXIS_IS_L64XX(E0) || AXIS_IS_L64XX(E1) || AXIS_IS_L64XX(E2) || AXIS_IS_L64XX(E3) || AXIS_IS_L64XX(E4) || AXIS_IS_L64XX(E5) || AXIS_IS_L64XX(E6) || AXIS_IS_L64XX(E7)) + +enum L64XX_axis_t : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7, MAX_L64XX }; + +class L64XX_Marlin : public L64XXHelper { +public: + static PGM_P const index_to_axis[MAX_L64XX]; + + static const uint8_t index_to_dir[MAX_L64XX]; + + static uint8_t dir_commands[MAX_L64XX]; + + // Flags to guarantee graceful switch if stepper interrupts L6470 SPI transfer + static volatile uint8_t spi_abort; + static uint8_t spi_active; + + L64XX_Marlin() {} + + static void init(); + static void init_to_defaults(); + + static uint16_t get_stepper_status(L64XX &st); + + static uint16_t get_status(const L64XX_axis_t axis); + + static uint32_t get_param(const L64XX_axis_t axis, const uint8_t param); + + static void set_param(const L64XX_axis_t axis, const uint8_t param, const uint32_t value); + + //static void send_command(const L64XX_axis_t axis, uint8_t command); + + static uint8_t get_user_input(uint8_t &driver_count, L64XX_axis_t axis_index[3], char axis_mon[3][3], + float &position_max, float &position_min, float &final_feedrate, uint8_t &kval_hold, + uint8_t over_current_flag, uint8_t &OCD_TH_val, uint8_t &STALL_TH_val, uint16_t &over_current_threshold); + + static void transfer(uint8_t L6470_buf[], const uint8_t length); + + static void say_axis(const L64XX_axis_t axis, const uint8_t label=true); + #if ENABLED(L6470_CHITCHAT) + static void error_status_decode( + const uint16_t status, const L64XX_axis_t axis, + const uint16_t _status_axis_th_sd, const uint16_t _status_axis_th_wrn, + const uint16_t _status_axis_step_loss_a, const uint16_t _status_axis_step_loss_b, + const uint16_t _status_axis_ocd, const uint8_t _status_axis_layout + ); + #else + FORCE_INLINE static void error_status_decode( + const uint16_t, const L64XX_axis_t, + const uint16_t, const uint16_t, + const uint16_t, const uint16_t, + const uint16_t, const uint8_t + ){} + #endif + + // ~40 bytes SRAM to simplify status decode routines + typedef struct { + uint8_t STATUS_AXIS_LAYOUT; // Copy of L6470_status_layout + uint8_t AXIS_OCD_TH_MAX; // Size of OCD_TH field + uint8_t AXIS_STALL_TH_MAX; // Size of STALL_TH field + float AXIS_OCD_CURRENT_CONSTANT_INV; // mA per count + float AXIS_STALL_CURRENT_CONSTANT_INV; // mA per count + uint8_t L6470_AXIS_CONFIG, // Address of the CONFIG register + L6470_AXIS_STATUS; // Address of the STATUS register + uint16_t L6470_ERROR_MASK, // STATUS_UVLO | STATUS_TH_WRN | STATUS_TH_SD | STATUS_OCD | STATUS_STEP_LOSS_A | STATUS_STEP_LOSS_B + L6474_ERROR_MASK, // STATUS_UVLO | STATUS_TH_WRN | STATUS_TH_SD | STATUS_OCD + STATUS_AXIS_RAW, // Copy of status register contents + STATUS_AXIS, // Copy of status register contents but with all error bits active low + STATUS_AXIS_OCD, // Overcurrent detected bit position + STATUS_AXIS_SCK_MOD, // Step clock mode is active bit position + STATUS_AXIS_STEP_LOSS_A, // Stall detected on A bridge bit position + STATUS_AXIS_STEP_LOSS_B, // Stall detected on B bridge bit position + STATUS_AXIS_TH_SD, // Thermal shutdown bit position + STATUS_AXIS_TH_WRN, // Thermal warning bit position + STATUS_AXIS_UVLO, // Undervoltage lockout is active bit position + STATUS_AXIS_WRONG_CMD, // Last command not valid bit position + STATUS_AXIS_CMD_ERR, // Command error bit position + STATUS_AXIS_NOTPERF_CMD; // Last command not performed bit position + } L64XX_shadow_t; + + static L64XX_shadow_t shadow; + + #if ENABLED(MONITOR_L6470_DRIVER_STATUS) + static bool monitor_paused; + static inline void pause_monitor(const bool p) { monitor_paused = p; } + static void monitor_update(L64XX_axis_t stepper_index); + static void monitor_driver(); + #else + static inline void pause_monitor(const bool) {} + #endif + +//protected: + // L64XXHelper methods + static void spi_init(); + static uint8_t transfer_single(uint8_t data, int16_t ss_pin); + static uint8_t transfer_chain(uint8_t data, int16_t ss_pin, uint8_t chain_position); + +private: + static void append_stepper_err(char* &p, const uint8_t stepper_index, const char * const err=nullptr); + +}; + +void echo_yes_no(const bool yes); + +extern L64XX_Marlin L64xxManager; diff --git a/Marlin/src/libs/L64XX/README.md b/Marlin/src/libs/L64XX/README.md new file mode 100644 index 00000000..c68d8ca0 --- /dev/null +++ b/Marlin/src/libs/L64XX/README.md @@ -0,0 +1,98 @@ +### L64XX Stepper Driver + +*Arduino-L6470* library revision 0.8.0 or above is required. + +This software can be used with the L6470, L6474, L6480 and the powerSTEP01 (collectively referred to as "L64xx" from now on). Different drivers can be mixed within a system. + +These devices use voltage PWMs to drive the stepper phases. On the L6474 the phase current is controlled by the `TVAL` register. On all the other drivers the phase current is indirectly controlled via the `KVAL_HOLD` register which scales the PWM duty cycle. + +This software assumes that all drivers are in one SPI daisy chain. + +### Hardware Setup + +- MOSI from controller tied to SDI on the first device + +- SDO of the first device is tied to SDI of the next device + +- SDO of the last device is tied to MISO of the controller + +- All devices share the same `SCK` and `SS_PIN` pins. The user must supply a macro to control the `RESET_PIN`(s). + +- Each L6470 passes the data it saw on its SDI to its neighbor on the **NEXT** SPI cycle (8 bit delay). + +- Each L6470 acts on the **last** SPI data it saw when the `SS_PIN` **goes high**. + +The L6474 uses the standard STEP DIR interface. Phase currents are changed in response to step pulses. The direction is set by the DIR pin. Instead of an ENA pin, stepper power is controlled with SPI commands. + +The other drivers operate in `STEP_CLOCK` mode. In this mode the Direction / Enable functions are done with SPI commands and the phase currents are changed in response to STEP pulses. + +### Hardware / Software Interaction + +Except for the L6474, powering up a stepper and setting the direction are done by the same command. You can't do one without the other. + +**All** directions are set **every time** a new block is popped off the queue by the stepper ISR. + +When setting direction, SPI transfers are minimized by using arrays and a specialized SPI method. *Arduino-L6470* library calls are not used. For N L64xx drivers, this results in N bytes transferred. If library calls were used then N2 bytes would be sent. + +### Power-up (Reset) Sequence + +- Stepper objects are instantiated before the `setup()` entry point is reached. + +- In `setup()` (before stepper drivers are initialized) the `L6470_init()` method is called to do the following: + + - If present, pulse the hardware reset pin. + + - Populate the `L6470_chain` array, which maps positions in the SPI stream to commands/data for L64XX stepper drivers. + + - Initialize the L64XX Software SPI pin states. + + - Initialize L64XX drivers. They may be reset later by a call to `L6470_init_to_defaults()`. + +The steppers are **NOT** powered up (enabled) during this sequence. + +### `L6470_chain` array + +This array is used by all routines that transmit SPI data. For a chain with N devices, the array contains: + +Index|Value +-----|----- +0|Number of drivers in chain +1|Axis index of the first device in the chain (closest to MOSI) +...| +N|Axis index of the last device chain (closest to MISO) + +### Set Direction and Enable + +The `DIR_WRITE` macros for the L64xx drivers are written so that the standard X, Y, Z and extruder logic used by the `set_directions()` routine is not altered. These macros write the correct forward/reverse command to the corresponding location in the array `L6470_dir_commands`. On the L6474 the array the command used just enables the stepper because direction is set by the DIR pin. + +At the end of the `set_directions()` routine, the array `L6470_chain` is used to grab the corresponding direction/enable commands out of the array `L6470_dir_commands` and put them in the correct sequence in the array `L6470_buf`. Array `L6470_buf` is then passed to the **`void`** `L6470_Transfer` function which actually sends the data to the devices. + +### Utilities, etc. + +The **absolute position** registers should accurately reflect Marlin’s stepper position counts. They are set to zero during initialization. `G28` sets them to the Marlin counts for the corresponding axis after homing. NOTE: These registers are often the negative of the Marlin counts. This is because the Marlin counts reflect the logical direction while the registers reflect the stepper direction. The register contents are displayed via the `M114 D` command. + +The `L6470_monitor` feature reads the status of each device every half second. It will report if there are any error conditions present or if communications has been lost/restored. The `KVAL_HOLD` value is reduced every 2 – 2.5 seconds if the thermal warning or thermal shutdown conditions are present. + +**M122** displays the settings of most of the bits in the status register plus a couple of other items. + +**M906** can be used to set the `KVAL_HOLD` register (`TVAL` on L6474) one driver at a time. If a setting is not included with the command then the contents of the registers that affect the phase current/voltage are displayed. + +**M916, M917 & M918** + +These utilities are used to tune the system. They can get you in the ballpark for acceptable jerk, acceleration, top speed and `KVAL_HOLD` settings (`TVAL` on L6474). In general they seem to provide an overly optimistic `KVAL_HOLD` (`TVAL`) setting because of the lag between setting `KVAL_HOLD` (`TVAL`) and the driver reaching final temperature. Enabling the `L6470_monitor` feature during prints will provide the **final useful setting**. + +The amount of power needed to move the stepper without skipping steps increases as jerk, acceleration, top speed, and micro-steps increase. The power dissipated by the driver increases as the power to the stepper increases. The net result is a balancing act between jerk, acceleration, top speed, micro-steps, and power dissipated by the driver. + +**M916** - Increases `KVAL_HOLD` (`TVAL`) while moving one axis until a thermal warning is generated. This routine is also useful for determining the approximate `KVAL_HOLD` (`TVAL`) where the stepper stops losing steps. The sound will get noticeably quieter as it stops losing steps. + +**M917** - Find minimum current thresholds. This is accomplished by doing the following steps while moving an axis: + +1. Decrease OCD current until overcurrent error. + +2. Increase OCD until overcurrent error goes away. + +3. Decrease stall threshold until stall error (not available on the L6474). + +4. Increase stall until stall error goes away (not available on the L6474). + +**M918** - Increase speed until error or max feedrate achieved. diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp new file mode 100644 index 00000000..03e002f6 --- /dev/null +++ b/Marlin/src/libs/W25Qxx.cpp @@ -0,0 +1,388 @@ +/** + * 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_FLASH + +#include "W25Qxx.h" +#include + +W25QXXFlash W25QXX; + +#ifndef SPI_FLASH_MISO_PIN + #define SPI_FLASH_MISO_PIN W25QXX_MISO_PIN +#endif +#ifndef SPI_FLASH_MOSI_PIN + #define SPI_FLASH_MOSI_PIN W25QXX_MOSI_PIN +#endif +#ifndef SPI_FLASH_SCK_PIN + #define SPI_FLASH_SCK_PIN W25QXX_SCK_PIN +#endif +#ifndef SPI_FLASH_CS_PIN + #define SPI_FLASH_CS_PIN W25QXX_CS_PIN +#endif + +#define W25QXX_CS_H OUT_WRITE(SPI_FLASH_CS_PIN, HIGH) +#define W25QXX_CS_L OUT_WRITE(SPI_FLASH_CS_PIN, LOW) + +void W25QXXFlash::init(uint8_t spiRate) { + + OUT_WRITE(SPI_FLASH_CS_PIN, HIGH); + + /** + * 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; + 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 + } + SPI.setModule(SPI_DEVICE); + SPI.begin(); + SPI.setClockDivider(clock); + SPI.setBitOrder(MSBFIRST); + SPI.setDataMode(SPI_MODE0); +} + +/** + * @brief Receive a single byte from the SPI port. + * + * @return Byte received + */ +uint8_t W25QXXFlash::spi_flash_Rec() { + const uint8_t returnByte = SPI.transfer(0xFF); + return returnByte; +} + +uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { + const 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 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 + * + * @param b Byte to send + * + * @details + */ +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) + * + * @param buf Pointer with buffer start address + * @return Nothing + * + * @details Use DMA + */ +void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { + SPI.send(token); + SPI.dmaSend(const_cast(buf), 512); +} + +uint16_t W25QXXFlash::W25QXX_ReadID(void) { + uint16_t Temp = 0; + W25QXX_CS_L; + spi_flash_Send(0x90); + spi_flash_Send(0x00); + spi_flash_Send(0x00); + spi_flash_Send(0x00); + Temp |= spi_flash_Rec() << 8; + Temp |= spi_flash_Rec(); + W25QXX_CS_H; + return Temp; +} + +void W25QXXFlash::SPI_FLASH_WriteEnable(void) { + /* Select the FLASH: Chip Select low */ + W25QXX_CS_L; + /* Send "Write Enable" instruction */ + spi_flash_Send(W25X_WriteEnable); + /* Deselect the FLASH: Chip Select high */ + W25QXX_CS_H; +} + +/******************************************************************************* +* Function Name : SPI_FLASH_WaitForWriteEnd +* Description : Polls the status of the Write In Progress (WIP) flag in the +* FLASH's status register and loop until write opertaion +* has completed. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void W25QXXFlash::SPI_FLASH_WaitForWriteEnd(void) { + uint8_t FLASH_Status = 0; + + /* Select the FLASH: Chip Select low */ + W25QXX_CS_L; + /* Send "Read Status Register" instruction */ + spi_flash_Send(W25X_ReadStatusReg); + + /* Loop as long as the memory is busy with a write cycle */ + do + /* Send a dummy byte to generate the clock needed by the FLASH + and put the value of the status register in FLASH_Status variable */ + FLASH_Status = spi_flash_Rec(); + while ((FLASH_Status & WIP_Flag) == 0x01); /* Write in progress */ + + /* Deselect the FLASH: Chip Select high */ + W25QXX_CS_H; +} + +void W25QXXFlash::SPI_FLASH_SectorErase(uint32_t SectorAddr) { + /* Send write enable instruction */ + SPI_FLASH_WriteEnable(); + + /* Sector Erase */ + /* Select the FLASH: Chip Select low */ + W25QXX_CS_L; + /* Send Sector Erase instruction */ + spi_flash_Send(W25X_SectorErase); + /* Send SectorAddr high nibble address byte */ + spi_flash_Send((SectorAddr & 0xFF0000) >> 16); + /* Send SectorAddr medium nibble address byte */ + spi_flash_Send((SectorAddr & 0xFF00) >> 8); + /* Send SectorAddr low nibble address byte */ + spi_flash_Send(SectorAddr & 0xFF); + /* Deselect the FLASH: Chip Select high */ + + W25QXX_CS_H; + /* Wait the end of Flash writing */ + SPI_FLASH_WaitForWriteEnd(); +} + +void W25QXXFlash::SPI_FLASH_BlockErase(uint32_t BlockAddr) { + SPI_FLASH_WriteEnable(); + W25QXX_CS_L; + /* Send Sector Erase instruction */ + spi_flash_Send(W25X_BlockErase); + /* Send SectorAddr high nibble address byte */ + spi_flash_Send((BlockAddr & 0xFF0000) >> 16); + /* Send SectorAddr medium nibble address byte */ + spi_flash_Send((BlockAddr & 0xFF00) >> 8); + /* Send SectorAddr low nibble address byte */ + spi_flash_Send(BlockAddr & 0xFF); + + W25QXX_CS_H; + + SPI_FLASH_WaitForWriteEnd(); +} + +/******************************************************************************* +* Function Name : SPI_FLASH_BulkErase +* Description : Erases the entire FLASH. +* Input : None +* Output : None +* Return : None +*******************************************************************************/ +void W25QXXFlash::SPI_FLASH_BulkErase(void) { + /* Send write enable instruction */ + SPI_FLASH_WriteEnable(); + + /* Bulk Erase */ + /* Select the FLASH: Chip Select low */ + W25QXX_CS_L; + + /* Send Bulk Erase instruction */ + spi_flash_Send(W25X_ChipErase); + /* Deselect the FLASH: Chip Select high */ + W25QXX_CS_H; + /* Wait the end of Flash writing */ + SPI_FLASH_WaitForWriteEnd(); +} + +/******************************************************************************* +* Function Name : SPI_FLASH_PageWrite +* Description : Writes more than one byte to the FLASH with a single WRITE +* cycle(Page WRITE sequence). The number of byte can't exceed +* the FLASH page size. +* Input : - pBuffer : pointer to the buffer containing the data to be +* written to the FLASH. +* - WriteAddr : FLASH's internal address to write to. +* - NumByteToWrite : number of bytes to write to the FLASH, +* must be equal or less than "SPI_FLASH_PageSize" value. +* Output : None +* Return : None +*******************************************************************************/ +void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { + /* Enable the write access to the FLASH */ + SPI_FLASH_WriteEnable(); + + /* Select the FLASH: Chip Select low */ + W25QXX_CS_L; + /* Send "Write to Memory " instruction */ + spi_flash_Send(W25X_PageProgram); + /* Send WriteAddr high nibble address byte to write to */ + spi_flash_Send((WriteAddr & 0xFF0000) >> 16); + /* Send WriteAddr medium nibble address byte to write to */ + spi_flash_Send((WriteAddr & 0xFF00) >> 8); + /* Send WriteAddr low nibble address byte to write to */ + spi_flash_Send(WriteAddr & 0xFF); + + NOMORE(NumByteToWrite, SPI_FLASH_PerWritePageSize); + + /* while there is data to be written on the FLASH */ + while (NumByteToWrite--) { + /* Send the current byte */ + spi_flash_Send(*pBuffer); + /* Point on the next byte to be written */ + pBuffer++; + } + + /* Deselect the FLASH: Chip Select high */ + W25QXX_CS_H; + + /* Wait the end of Flash writing */ + SPI_FLASH_WaitForWriteEnd(); +} + +/******************************************************************************* +* Function Name : SPI_FLASH_BufferWrite +* Description : Writes block of data to the FLASH. In this function, the +* number of WRITE cycles are reduced, using Page WRITE sequence. +* Input : - pBuffer : pointer to the buffer containing the data to be +* written to the FLASH. +* - WriteAddr : FLASH's internal address to write to. +* - NumByteToWrite : number of bytes to write to the FLASH. +* Output : None +* Return : None +*******************************************************************************/ +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; + count = SPI_FLASH_PageSize - Addr; + NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; + NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; + + if (Addr == 0) { /* WriteAddr is SPI_FLASH_PageSize aligned */ + if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ + SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); + } + else { /* NumByteToWrite > SPI_FLASH_PageSize */ + while (NumOfPage--) { + SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); + WriteAddr += SPI_FLASH_PageSize; + pBuffer += SPI_FLASH_PageSize; + } + SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); + } + } + else { /* WriteAddr is not SPI_FLASH_PageSize aligned */ + if (NumOfPage == 0) { /* NumByteToWrite < SPI_FLASH_PageSize */ + if (NumOfSingle > count) { /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */ + temp = NumOfSingle - count; + SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); + WriteAddr += count; + pBuffer += count; + SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); + } + else { + SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); + } + } + else { /* NumByteToWrite > SPI_FLASH_PageSize */ + NumByteToWrite -= count; + NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; + NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; + + SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); + WriteAddr += count; + pBuffer += count; + + while (NumOfPage--) { + SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); + WriteAddr += SPI_FLASH_PageSize; + pBuffer += SPI_FLASH_PageSize; + } + + if (NumOfSingle != 0) + SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); + } + } +} + +/******************************************************************************* +* Function Name : SPI_FLASH_BufferRead +* Description : Reads a block of data from the FLASH. +* Input : - pBuffer : pointer to the buffer that receives the data read +* from the FLASH. +* - ReadAddr : FLASH's internal address to read from. +* - NumByteToRead : number of bytes to read from the FLASH. +* Output : None +* Return : None +*******************************************************************************/ +void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { + /* Select the FLASH: Chip Select low */ + W25QXX_CS_L; + + /* Send "Read from Memory " instruction */ + spi_flash_Send(W25X_ReadData); + + /* Send ReadAddr high nibble address byte to read from */ + spi_flash_Send((ReadAddr & 0xFF0000) >> 16); + /* Send ReadAddr medium nibble address byte to read from */ + spi_flash_Send((ReadAddr & 0xFF00) >> 8); + /* Send ReadAddr low nibble address byte to read from */ + spi_flash_Send(ReadAddr & 0xFF); + + if (NumByteToRead < 33) { + while (NumByteToRead--) { /* while there is data to be read */ + /* Read a byte from the FLASH */ + *pBuffer = spi_flash_Rec(); + /* Point to the next location where the byte read will be saved */ + pBuffer++; + } + } + else { + spi_flash_Read(pBuffer, NumByteToRead); + } + W25QXX_CS_H; +} + +#endif // HAS_SPI_FLASH diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h new file mode 100644 index 00000000..ac3e8a16 --- /dev/null +++ b/Marlin/src/libs/W25Qxx.h @@ -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 . + * + */ +#pragma once + +#include + +#define W25X_WriteEnable 0x06 +#define W25X_WriteDisable 0x04 +#define W25X_ReadStatusReg 0x05 +#define W25X_WriteStatusReg 0x01 +#define W25X_ReadData 0x03 +#define W25X_FastReadData 0x0B +#define W25X_FastReadDual 0x3B +#define W25X_PageProgram 0x02 +#define W25X_BlockErase 0xD8 +#define W25X_SectorErase 0x20 +#define W25X_ChipErase 0xC7 +#define W25X_PowerDown 0xB9 +#define W25X_ReleasePowerDown 0xAB +#define W25X_DeviceID 0xAB +#define W25X_ManufactDeviceID 0x90 +#define W25X_JedecDeviceID 0x9F + +#define WIP_Flag 0x01 /* Write In Progress (WIP) flag */ + +#define Dummy_Byte 0xA5 + +#define SPI_FLASH_SectorSize 4096 +#define SPI_FLASH_PageSize 256 +#define SPI_FLASH_PerWritePageSize 256 + +class W25QXXFlash { +public: + void init(uint8_t spiRate); + static uint8_t spi_flash_Rec(); + static uint8_t spi_flash_read_write_byte(uint8_t data); + static void spi_flash_Read(uint8_t* buf, uint16_t nbyte); + static void spi_flash_Send(uint8_t b); + static void spi_flash_SendBlock(uint8_t token, const uint8_t* buf); + static uint16_t W25QXX_ReadID(void); + static void SPI_FLASH_WriteEnable(void); + static void SPI_FLASH_WaitForWriteEnd(void); + static void SPI_FLASH_SectorErase(uint32_t SectorAddr); + static void SPI_FLASH_BlockErase(uint32_t BlockAddr); + static void SPI_FLASH_BulkErase(void); + 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); +}; + +extern W25QXXFlash W25QXX; diff --git a/Marlin/src/libs/bresenham.h b/Marlin/src/libs/bresenham.h new file mode 100644 index 00000000..ade231e2 --- /dev/null +++ b/Marlin/src/libs/bresenham.h @@ -0,0 +1,132 @@ +/** + * 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 "../core/serial.h" + +/** + * bresenham_t.h - Bresenham algorithm template + * + * An array of values / counters that tick together + */ + +#define FORCE_INLINE __attribute__((always_inline)) inline +#define _O3 __attribute__((optimize("O3"))) + +template +struct BresenhamCfg { static constexpr uint8_t UID = uid, SIZE = size; }; + +template +class Bresenham { +private: + + static constexpr T signtest = -1; + static_assert(signtest < 0, "Bresenham type must be signed!"); + +public: + + static T divisor, value[Cfg::SIZE], dir[Cfg::SIZE], dividend[Cfg::SIZE], counter[Cfg::SIZE]; + + // Default: Instantiate all items with the identical parameters + Bresenham(const T &inDivisor=1, const int8_t &inDir=1, const T &inDividend=1, const T &inValue=0) { + for (uint8_t i = 0; i < Cfg::SIZE; i++) init(i, inDivisor, inDir, inDividend, inValue); + } + + // Instantiate all items with the same divisor + Bresenham(const T &inDivisor, const int8_t (&inDir)[Cfg::SIZE], const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { + init(inDivisor, inDir, inDividend, inValue); + } + + // Instantiate all items with the same divisor and direction + Bresenham(const T &inDivisor, const int8_t &inDir, const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { + init(inDivisor, inDir, inDividend, inValue); + } + + // Init all items with the same parameters + FORCE_INLINE static void init(const uint8_t index, const T &inDivisor=1, const int8_t &inDir=1, const T &inDividend=1, const T &inValue=0) { + divisor = inDivisor; + dir[index] = inDir; + dividend[index] = inDividend; + value[index] = inValue; + prime(index); + } + + // Init all items with the same divisor + FORCE_INLINE static void init(const T &inDivisor, const int8_t (&inDir)[Cfg::SIZE], const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { + divisor = inDivisor; + for (uint8_t i = 0; i < Cfg::SIZE; i++) { + dir[i] = inDir[i]; + dividend[i] = inDividend[i]; + value[i] = inValue[i]; + } + prime(); + } + + // Init all items with the same divisor and direction + FORCE_INLINE static void init(const T &inDivisor, const int8_t &inDir, const T (&inDividend)[Cfg::SIZE], const T (&inValue)[Cfg::SIZE]={0}) { + divisor = inDivisor; + for (uint8_t i = 0; i < Cfg::SIZE; i++) { + dir[i] = inDir; + dividend[i] = inDividend[i]; + value[i] = inValue[i]; + } + prime(); + } + + // Reinit item with new dir, dividend, value keeping the same divisor + FORCE_INLINE static void reinit(const uint8_t index, const int8_t &inDir=1, const T &inDividend=1, const T &inValue=0) { + dir[index] = inDir; + dividend[index] = inDividend; + value[index] = inValue; + prime(); + } + + FORCE_INLINE static void prime(const uint8_t index) { counter[index] = -(divisor / 2); } + FORCE_INLINE static void prime() { for (uint8_t i = 0; i < Cfg::SIZE; i++) prime(i); } + + FORCE_INLINE static void back(const uint8_t index) { counter[index] -= divisor; } + + FORCE_INLINE static bool tick1(const uint8_t index) { + counter[index] += dividend[index]; + return counter[index] > 0; + } + + FORCE_INLINE static void tick(const uint8_t index) { + if (tick1(index)) { value[index] += dir[index]; back(index); } + } + + FORCE_INLINE static void tick1() _O3 { for (uint8_t i = 0; i < Cfg::SIZE; i++) (void)tick1(i); } + + FORCE_INLINE static void tick() _O3 { for (uint8_t i = 0; i < Cfg::SIZE; i++) (void)tick(i); } + + static void report(const uint8_t index) { + if (index < Cfg::SIZE) { + SERIAL_ECHOPAIR("bresenham ", int(index), " : (", dividend[index], "/", divisor, ") "); + if (counter[index] >= 0) SERIAL_CHAR(' '); + if (labs(counter[index]) < 100) { SERIAL_CHAR(' '); if (labs(counter[index]) < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(counter[index]); + SERIAL_ECHOLNPAIR(" ... ", value[index]); + } + } + + static void report() { for (uint8_t i = 0; i < Cfg::SIZE; i++) report(i); } +}; diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp new file mode 100644 index 00000000..84596953 --- /dev/null +++ b/Marlin/src/libs/buzzer.cpp @@ -0,0 +1,82 @@ +/** + * 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 USE_BEEPER + +#include "buzzer.h" +#include "../module/temperature.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +Buzzer::state_t Buzzer::state; +CircularQueue Buzzer::buffer; +Buzzer buzzer; + +/** + * @brief Add a tone to the queue + * @details Adds a tone_t structure to the ring buffer, will block IO if the + * queue is full waiting for one slot to get available. + * + * @param duration Duration of the tone in milliseconds + * @param frequency Frequency of the tone in hertz + */ +void Buzzer::tone(const uint16_t duration, const uint16_t frequency/*=0*/) { + while (buffer.isFull()) { + tick(); + thermalManager.manage_heater(); + } + tone_t tone = { duration, frequency }; + buffer.enqueue(tone); +} + +void Buzzer::tick() { + const millis_t now = millis(); + + if (!state.endtime) { + if (buffer.isEmpty()) return; + + state.tone = buffer.dequeue(); + state.endtime = now + state.tone.duration; + + if (state.tone.frequency > 0) { + #if ENABLED(EXTENSIBLE_UI) + CRITICAL_SECTION_START(); + ExtUI::onPlayTone(state.tone.frequency, state.tone.duration); + CRITICAL_SECTION_END(); + #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(); + #else + on(); + #endif + } + } + else if (ELAPSED(now, state.endtime)) reset(); +} + +#endif // USE_BEEPER diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h new file mode 100644 index 00000000..e901660c --- /dev/null +++ b/Marlin/src/libs/buzzer.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 "../inc/MarlinConfig.h" + +#if USE_BEEPER + + #include "circularqueue.h" + + #define TONE_QUEUE_LENGTH 4 + + /** + * @brief Tone structure + * @details Simple abstraction of a tone based on a duration and a frequency. + */ + struct tone_t { + uint16_t duration; + uint16_t frequency; + }; + + /** + * @brief Buzzer class + */ + class Buzzer { + public: + + typedef struct { + tone_t tone; + uint32_t endtime; + } state_t; + + private: + static state_t state; + + protected: + static CircularQueue buffer; + + /** + * @brief Inverts the sate of a digital PIN + * @details This will invert the current state of an digital IO pin. + */ + FORCE_INLINE static void invert() { TOGGLE(BEEPER_PIN); } + + /** + * @brief Turn off a digital PIN + * @details Alias of digitalWrite(PIN, LOW) using FastIO + */ + FORCE_INLINE static void off() { WRITE(BEEPER_PIN, LOW); } + + /** + * @brief Turn on a digital PIN + * @details Alias of digitalWrite(PIN, HIGH) using FastIO + */ + FORCE_INLINE static void on() { WRITE(BEEPER_PIN, HIGH); } + + /** + * @brief Resets the state of the class + * @details Brings the class state to a known one. + */ + static inline void reset() { + off(); + state.endtime = 0; + } + + public: + /** + * @brief Init Buzzer + */ + static inline void init() { + SET_OUTPUT(BEEPER_PIN); + reset(); + } + + /** + * @brief Add a tone to the queue + * @details Adds a tone_t structure to the ring buffer, will block IO if the + * queue is full waiting for one slot to get available. + * + * @param duration Duration of the tone in milliseconds + * @param frequency Frequency of the tone in hertz + */ + static void tone(const uint16_t duration, const uint16_t frequency=0); + + /** + * @brief Tick function + * @details This function should be called at loop, it will take care of + * playing the tones in the queue. + */ + static void tick(); + }; + + // Provide a buzzer instance + extern Buzzer buzzer; + + // Buzz directly via the BEEPER pin tone queue + #define BUZZ(d,f) buzzer.tone(d, f) + +#elif HAS_BUZZER + + // Buzz indirectly via the MarlinUI instance + #define BUZZ(d,f) ui.buzz(d,f) + +#else + + // No buzz capability + #define BUZZ(d,f) NOOP + +#endif diff --git a/Marlin/src/libs/circularqueue.h b/Marlin/src/libs/circularqueue.h new file mode 100644 index 00000000..4d4a464b --- /dev/null +++ b/Marlin/src/libs/circularqueue.h @@ -0,0 +1,131 @@ +/** + * 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 + +/** + * @brief Circular Queue class + * @details Implementation of the classic ring buffer data structure + */ +template +class CircularQueue { + private: + + /** + * @brief Buffer structure + * @details This structure consolidates all the overhead required to handle + * a circular queue such as the pointers and the buffer vector. + */ + struct buffer_t { + uint8_t head; + uint8_t tail; + uint8_t count; + uint8_t size; + T queue[N]; + } buffer; + + public: + /** + * @brief Class constructor + * @details This class requires two template parameters, T defines the type + * of item this queue will handle and N defines the maximum number of + * items that can be stored on the queue. + */ + CircularQueue() { + buffer.size = N; + buffer.count = buffer.head = buffer.tail = 0; + } + + /** + * @brief Removes and returns a item from the queue + * @details Removes the oldest item on the queue, pointed to by the + * buffer_t head field. The item is returned to the caller. + * @return type T item + */ + T dequeue() { + if (isEmpty()) return T(); + + uint8_t index = buffer.head; + + --buffer.count; + if (++buffer.head == buffer.size) + buffer.head = 0; + + return buffer.queue[index]; + } + + /** + * @brief Adds an item to the queue + * @details Adds an item to the queue on the location pointed by the buffer_t + * tail variable. Returns false if no queue space is available. + * @param item Item to be added to the queue + * @return true if the operation was successful + */ + bool enqueue(T const &item) { + if (isFull()) return false; + + buffer.queue[buffer.tail] = item; + + ++buffer.count; + if (++buffer.tail == buffer.size) + buffer.tail = 0; + + return true; + } + + /** + * @brief Checks if the queue has no items + * @details Returns true if there are no items on the queue, false otherwise. + * @return true if queue is empty + */ + bool isEmpty() { return buffer.count == 0; } + + /** + * @brief Checks if the queue is full + * @details Returns true if the queue is full, false otherwise. + * @return true if queue is full + */ + bool isFull() { return buffer.count == buffer.size; } + + /** + * @brief Gets the queue size + * @details Returns the maximum number of items a queue can have. + * @return the queue size + */ + uint8_t size() { return buffer.size; } + + /** + * @brief Gets the next item from the queue without removing it + * @details Returns the next item in the queue without removing it + * or updating the pointers. + * @return first item in the queue + */ + T peek() { return buffer.queue[buffer.head]; } + + /** + * @brief Gets the number of items on the queue + * @details Returns the current number of items stored on the queue. + * @return number of items in the queue + */ + uint8_t count() { return buffer.count; } +}; diff --git a/Marlin/src/libs/crc16.cpp b/Marlin/src/libs/crc16.cpp new file mode 100644 index 00000000..c2195619 --- /dev/null +++ b/Marlin/src/libs/crc16.cpp @@ -0,0 +1,32 @@ +/** + * 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 "crc16.h" + +void crc16(uint16_t *crc, const void * const data, uint16_t cnt) { + uint8_t *ptr = (uint8_t *)data; + while (cnt--) { + *crc = (uint16_t)(*crc ^ (uint16_t)(((uint16_t)*ptr++) << 8)); + for (uint8_t i = 0; i < 8; i++) + *crc = (uint16_t)((*crc & 0x8000) ? ((uint16_t)(*crc << 1) ^ 0x1021) : (*crc << 1)); + } +} diff --git a/Marlin/src/libs/crc16.h b/Marlin/src/libs/crc16.h new file mode 100644 index 00000000..1760ecd6 --- /dev/null +++ b/Marlin/src/libs/crc16.h @@ -0,0 +1,26 @@ +/** + * 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 + +void crc16(uint16_t *crc, const void * const data, uint16_t cnt); diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h new file mode 100644 index 00000000..31d8bab3 --- /dev/null +++ b/Marlin/src/libs/duration_t.h @@ -0,0 +1,166 @@ +/** + * 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 "../HAL/shared/Marduino.h" + +struct duration_t { + /** + * @brief Duration is stored in seconds + */ + uint32_t value; + + /** + * @brief Constructor + */ + duration_t() + : duration_t(0) {}; + + /** + * @brief Constructor + * + * @param seconds The number of seconds + */ + duration_t(uint32_t const &seconds) { + this->value = seconds; + } + + /** + * @brief Equality comparison + * @details Overloads the equality comparison operator + * + * @param value The number of seconds to compare to + * @return True if both durations are equal + */ + bool operator==(const uint32_t &value) const { + return (this->value == value); + } + + /** + * @brief Inequality comparison + * @details Overloads the inequality comparison operator + * + * @param value The number of seconds to compare to + * @return False if both durations are equal + */ + bool operator!=(const uint32_t &value) const { + return ! this->operator==(value); + } + + /** + * @brief Formats the duration as years + * @return The number of years + */ + inline uint8_t year() const { + return this->day() / 365; + } + + /** + * @brief Formats the duration as days + * @return The number of days + */ + inline uint16_t day() const { + return this->hour() / 24; + } + + /** + * @brief Formats the duration as hours + * @return The number of hours + */ + inline uint32_t hour() const { + return this->minute() / 60; + } + + /** + * @brief Formats the duration as minutes + * @return The number of minutes + */ + inline uint32_t minute() const { + return this->second() / 60; + } + + /** + * @brief Formats the duration as seconds + * @return The number of seconds + */ + inline uint32_t second() const { + return this->value; + } + + /** + * @brief Formats the duration as a string + * @details String will be formated using a "full" representation of duration + * + * @param buffer The array pointed to must be able to accommodate 21 bytes + * + * Output examples: + * 123456789012345678901 (strlen) + * 135y 364d 23h 59m 59s + * 364d 23h 59m 59s + * 23h 59m 59s + * 59m 59s + * 59s + */ + char* toString(char * const buffer) const { + int y = this->year(), + d = this->day() % 365, + h = this->hour() % 24, + m = this->minute() % 60, + s = this->second() % 60; + + if (y) sprintf_P(buffer, PSTR("%iy %id %ih %im %is"), y, d, h, m, s); + else if (d) sprintf_P(buffer, PSTR("%id %ih %im %is"), d, h, m, s); + else if (h) sprintf_P(buffer, PSTR("%ih %im %is"), h, m, s); + else if (m) sprintf_P(buffer, PSTR("%im %is"), m, s); + else sprintf_P(buffer, PSTR("%is"), s); + return buffer; + } + + /** + * @brief Formats the duration as a string + * @details String will be formated using a "digital" representation of duration + * + * @param buffer The array pointed to must be able to accommodate 10 bytes + * + * Output examples: + * 123456789 (strlen) + * 99:59 + * 11d 12:33 + */ + uint8_t toDigital(char *buffer, bool with_days=false) const { + uint16_t h = uint16_t(this->hour()), + m = uint16_t(this->minute() % 60UL); + if (with_days) { + uint16_t d = this->day(); + sprintf_P(buffer, PSTR("%hud %02hu:%02hu"), d, h % 24, m); + return d >= 10 ? 9 : 8; + } + else if (h < 100) { + sprintf_P(buffer, PSTR("%02hu:%02hu"), h, m); + return 5; + } + else { + sprintf_P(buffer, PSTR("%hu:%02hu"), h, m); + return 6; + } + } +}; diff --git a/Marlin/src/libs/heatshrink/LICENSE b/Marlin/src/libs/heatshrink/LICENSE new file mode 100644 index 00000000..a40fc72b --- /dev/null +++ b/Marlin/src/libs/heatshrink/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2013-2015, Scott Vokes +All rights reserved. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Marlin/src/libs/heatshrink/heatshrink_common.h b/Marlin/src/libs/heatshrink/heatshrink_common.h new file mode 100644 index 00000000..c8dc9540 --- /dev/null +++ b/Marlin/src/libs/heatshrink/heatshrink_common.h @@ -0,0 +1,20 @@ +/** + * libs/heatshrink/heatshrink_common.h + */ +#pragma once + +#define HEATSHRINK_AUTHOR "Scott Vokes " +#define HEATSHRINK_URL "https://github.com/atomicobject/heatshrink" + +/* Version 0.4.1 */ +#define HEATSHRINK_VERSION_MAJOR 0 +#define HEATSHRINK_VERSION_MINOR 4 +#define HEATSHRINK_VERSION_PATCH 1 + +#define HEATSHRINK_MIN_WINDOW_BITS 4 +#define HEATSHRINK_MAX_WINDOW_BITS 15 + +#define HEATSHRINK_MIN_LOOKAHEAD_BITS 3 + +#define HEATSHRINK_LITERAL_MARKER 0x01 +#define HEATSHRINK_BACKREF_MARKER 0x00 diff --git a/Marlin/src/libs/heatshrink/heatshrink_config.h b/Marlin/src/libs/heatshrink/heatshrink_config.h new file mode 100644 index 00000000..90520f12 --- /dev/null +++ b/Marlin/src/libs/heatshrink/heatshrink_config.h @@ -0,0 +1,26 @@ +/** + * libs/heatshrink/heatshrink_config.h + */ +#pragma once + +// Should functionality assuming dynamic allocation be used? +#ifndef HEATSHRINK_DYNAMIC_ALLOC + //#define HEATSHRINK_DYNAMIC_ALLOC 1 +#endif + +#if HEATSHRINK_DYNAMIC_ALLOC + // Optional replacement of malloc/free + #define HEATSHRINK_MALLOC(SZ) malloc(SZ) + #define HEATSHRINK_FREE(P, SZ) free(P) +#else + // Required parameters for static configuration + #define HEATSHRINK_STATIC_INPUT_BUFFER_SIZE 32 + #define HEATSHRINK_STATIC_WINDOW_BITS 8 + #define HEATSHRINK_STATIC_LOOKAHEAD_BITS 4 +#endif + +// Turn on logging for debugging +#define HEATSHRINK_DEBUGGING_LOGS 0 + +// Use indexing for faster compression. (This requires additional space.) +#define HEATSHRINK_USE_INDEX 1 diff --git a/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp new file mode 100644 index 00000000..3f0f828c --- /dev/null +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.cpp @@ -0,0 +1,384 @@ +/** + * 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 + +#pragma GCC optimize ("O3") + +/* States for the polling state machine. */ +typedef enum { + HSDS_TAG_BIT, /* tag bit */ + HSDS_YIELD_LITERAL, /* ready to yield literal byte */ + HSDS_BACKREF_INDEX_MSB, /* most significant byte of index */ + HSDS_BACKREF_INDEX_LSB, /* least significant byte of index */ + HSDS_BACKREF_COUNT_MSB, /* most significant byte of count */ + HSDS_BACKREF_COUNT_LSB, /* least significant byte of count */ + HSDS_YIELD_BACKREF /* ready to yield back-reference */ +} HSD_state; + +#if HEATSHRINK_DEBUGGING_LOGS + #include + #include + #include + #define LOG(...) fprintf(stderr, __VA_ARGS__) + #define ASSERT(X) assert(X) + static const char *state_names[] = { + "tag_bit", + "yield_literal", + "backref_index_msb", + "backref_index_lsb", + "backref_count_msb", + "backref_count_lsb", + "yield_backref" + }; +#else + #define LOG(...) /* no-op */ + #define ASSERT(X) /* no-op */ +#endif + +typedef struct { + uint8_t *buf; /* output buffer */ + size_t buf_size; /* buffer size */ + size_t *output_size; /* bytes pushed to buffer, so far */ +} output_info; + +#define NO_BITS ((uint16_t)-1) + +/* Forward references. */ +static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count); +static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte); + +#if HEATSHRINK_DYNAMIC_ALLOC +heatshrink_decoder *heatshrink_decoder_alloc(uint16_t input_buffer_size, uint8_t window_sz2, uint8_t lookahead_sz2) { + if ((window_sz2 < HEATSHRINK_MIN_WINDOW_BITS) || + (window_sz2 > HEATSHRINK_MAX_WINDOW_BITS) || + (input_buffer_size == 0) || + (lookahead_sz2 < HEATSHRINK_MIN_LOOKAHEAD_BITS) || + (lookahead_sz2 >= window_sz2)) { + return nullptr; + } + size_t buffers_sz = (1 << window_sz2) + input_buffer_size; + size_t sz = sizeof(heatshrink_decoder) + buffers_sz; + heatshrink_decoder *hsd = HEATSHRINK_MALLOC(sz); + if (hsd == nullptr) return nullptr; + hsd->input_buffer_size = input_buffer_size; + hsd->window_sz2 = window_sz2; + hsd->lookahead_sz2 = lookahead_sz2; + heatshrink_decoder_reset(hsd); + LOG("-- allocated decoder with buffer size of %zu (%zu + %u + %u)\n", + sz, sizeof(heatshrink_decoder), (1 << window_sz2), input_buffer_size); + return hsd; +} + +void heatshrink_decoder_free(heatshrink_decoder *hsd) { + size_t buffers_sz = (1 << hsd->window_sz2) + hsd->input_buffer_size; + size_t sz = sizeof(heatshrink_decoder) + buffers_sz; + HEATSHRINK_FREE(hsd, sz); + (void)sz; /* may not be used by free */ +} +#endif + +void heatshrink_decoder_reset(heatshrink_decoder *hsd) { + size_t buf_sz = 1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd); + size_t input_sz = HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd); + memset(hsd->buffers, 0, buf_sz + input_sz); + hsd->state = HSDS_TAG_BIT; + hsd->input_size = 0; + hsd->input_index = 0; + hsd->bit_index = 0x00; + hsd->current_byte = 0x00; + hsd->output_count = 0; + hsd->output_index = 0; + hsd->head_index = 0; +} + +/* Copy SIZE bytes into the decoder's input buffer, if it will fit. */ +HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, + uint8_t *in_buf, size_t size, size_t *input_size) { + if (hsd == nullptr || in_buf == nullptr || input_size == nullptr) + return HSDR_SINK_ERROR_NULL; + + size_t rem = HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd) - hsd->input_size; + if (rem == 0) { + *input_size = 0; + return HSDR_SINK_FULL; + } + + size = rem < size ? rem : size; + LOG("-- sinking %zd bytes\n", size); + /* copy into input buffer (at head of buffers) */ + memcpy(&hsd->buffers[hsd->input_size], in_buf, size); + hsd->input_size += size; + *input_size = size; + return HSDR_SINK_OK; +} + + +/***************** + * Decompression * + *****************/ + +#define BACKREF_COUNT_BITS(HSD) (HEATSHRINK_DECODER_LOOKAHEAD_BITS(HSD)) +#define BACKREF_INDEX_BITS(HSD) (HEATSHRINK_DECODER_WINDOW_BITS(HSD)) + +// States +static HSD_state st_tag_bit(heatshrink_decoder *hsd); +static HSD_state st_yield_literal(heatshrink_decoder *hsd, output_info *oi); +static HSD_state st_backref_index_msb(heatshrink_decoder *hsd); +static HSD_state st_backref_index_lsb(heatshrink_decoder *hsd); +static HSD_state st_backref_count_msb(heatshrink_decoder *hsd); +static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd); +static HSD_state st_yield_backref(heatshrink_decoder *hsd, output_info *oi); + +HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, uint8_t *out_buf, size_t out_buf_size, size_t *output_size) { + if (hsd == nullptr || out_buf == nullptr || output_size == nullptr) + return HSDR_POLL_ERROR_NULL; + + *output_size = 0; + + output_info oi; + oi.buf = out_buf; + oi.buf_size = out_buf_size; + oi.output_size = output_size; + + while (1) { + LOG("-- poll, state is %d (%s), input_size %d\n", hsd->state, state_names[hsd->state], hsd->input_size); + uint8_t in_state = hsd->state; + switch (in_state) { + case HSDS_TAG_BIT: + hsd->state = st_tag_bit(hsd); + break; + case HSDS_YIELD_LITERAL: + hsd->state = st_yield_literal(hsd, &oi); + break; + case HSDS_BACKREF_INDEX_MSB: + hsd->state = st_backref_index_msb(hsd); + break; + case HSDS_BACKREF_INDEX_LSB: + hsd->state = st_backref_index_lsb(hsd); + break; + case HSDS_BACKREF_COUNT_MSB: + hsd->state = st_backref_count_msb(hsd); + break; + case HSDS_BACKREF_COUNT_LSB: + hsd->state = st_backref_count_lsb(hsd); + break; + case HSDS_YIELD_BACKREF: + hsd->state = st_yield_backref(hsd, &oi); + break; + default: + return HSDR_POLL_ERROR_UNKNOWN; + } + + // If the current state cannot advance, check if input or output + // buffer are exhausted. + if (hsd->state == in_state) + return (*output_size == out_buf_size) ? HSDR_POLL_MORE : HSDR_POLL_EMPTY; + } +} + +static HSD_state st_tag_bit(heatshrink_decoder *hsd) { + uint32_t bits = get_bits(hsd, 1); // get tag bit + if (bits == NO_BITS) + return HSDS_TAG_BIT; + else if (bits) + return HSDS_YIELD_LITERAL; + else if (HEATSHRINK_DECODER_WINDOW_BITS(hsd) > 8) + return HSDS_BACKREF_INDEX_MSB; + else { + hsd->output_index = 0; + return HSDS_BACKREF_INDEX_LSB; + } +} + +static HSD_state st_yield_literal(heatshrink_decoder *hsd, output_info *oi) { + /* Emit a repeated section from the window buffer, and add it (again) + * to the window buffer. (Note that the repetition can include + * itself.)*/ + if (*oi->output_size < oi->buf_size) { + uint16_t byte = get_bits(hsd, 8); + if (byte == NO_BITS) { return HSDS_YIELD_LITERAL; } /* out of input */ + uint8_t *buf = &hsd->buffers[HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd)]; + uint16_t mask = (1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd)) - 1; + uint8_t c = byte & 0xFF; + LOG("-- emitting literal byte 0x%02x ('%c')\n", c, isprint(c) ? c : '.'); + buf[hsd->head_index++ & mask] = c; + push_byte(hsd, oi, c); + return HSDS_TAG_BIT; + } + return HSDS_YIELD_LITERAL; +} + +static HSD_state st_backref_index_msb(heatshrink_decoder *hsd) { + uint8_t bit_ct = BACKREF_INDEX_BITS(hsd); + ASSERT(bit_ct > 8); + uint16_t bits = get_bits(hsd, bit_ct - 8); + LOG("-- backref index (msb), got 0x%04x (+1)\n", bits); + if (bits == NO_BITS) { return HSDS_BACKREF_INDEX_MSB; } + hsd->output_index = bits << 8; + return HSDS_BACKREF_INDEX_LSB; +} + +static HSD_state st_backref_index_lsb(heatshrink_decoder *hsd) { + uint8_t bit_ct = BACKREF_INDEX_BITS(hsd); + uint16_t bits = get_bits(hsd, bit_ct < 8 ? bit_ct : 8); + LOG("-- backref index (lsb), got 0x%04x (+1)\n", bits); + if (bits == NO_BITS) { return HSDS_BACKREF_INDEX_LSB; } + hsd->output_index |= bits; + hsd->output_index++; + uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); + hsd->output_count = 0; + return (br_bit_ct > 8) ? HSDS_BACKREF_COUNT_MSB : HSDS_BACKREF_COUNT_LSB; +} + +static HSD_state st_backref_count_msb(heatshrink_decoder *hsd) { + uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); + ASSERT(br_bit_ct > 8); + uint16_t bits = get_bits(hsd, br_bit_ct - 8); + LOG("-- backref count (msb), got 0x%04x (+1)\n", bits); + if (bits == NO_BITS) { return HSDS_BACKREF_COUNT_MSB; } + hsd->output_count = bits << 8; + return HSDS_BACKREF_COUNT_LSB; +} + +static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd) { + uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); + uint16_t bits = get_bits(hsd, br_bit_ct < 8 ? br_bit_ct : 8); + LOG("-- backref count (lsb), got 0x%04x (+1)\n", bits); + if (bits == NO_BITS) { return HSDS_BACKREF_COUNT_LSB; } + hsd->output_count |= bits; + hsd->output_count++; + return HSDS_YIELD_BACKREF; +} + +static HSD_state st_yield_backref(heatshrink_decoder *hsd, output_info *oi) { + size_t count = oi->buf_size - *oi->output_size; + if (count > 0) { + size_t i = 0; + if (hsd->output_count < count) count = hsd->output_count; + uint8_t *buf = &hsd->buffers[HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd)]; + uint16_t mask = (1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd)) - 1; + uint16_t neg_offset = hsd->output_index; + LOG("-- emitting %zu bytes from -%u bytes back\n", count, neg_offset); + ASSERT(neg_offset <= mask + 1); + ASSERT(count <= (size_t)(1 << BACKREF_COUNT_BITS(hsd))); + + for (i = 0; i < count; i++) { + uint8_t c = buf[(hsd->head_index - neg_offset) & mask]; + push_byte(hsd, oi, c); + buf[hsd->head_index & mask] = c; + hsd->head_index++; + LOG(" -- ++ 0x%02x\n", c); + } + hsd->output_count -= count; + if (hsd->output_count == 0) { return HSDS_TAG_BIT; } + } + return HSDS_YIELD_BACKREF; +} + +/* Get the next COUNT bits from the input buffer, saving incremental progress. + * Returns NO_BITS on end of input, or if more than 15 bits are requested. */ +static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count) { + uint16_t accumulator = 0; + int i = 0; + if (count > 15) return NO_BITS; + LOG("-- popping %u bit(s)\n", count); + + /* If we aren't able to get COUNT bits, suspend immediately, because we + * don't track how many bits of COUNT we've accumulated before suspend. */ + if (hsd->input_size == 0 && hsd->bit_index < (1 << (count - 1))) return NO_BITS; + + for (i = 0; i < count; i++) { + if (hsd->bit_index == 0x00) { + if (hsd->input_size == 0) { + LOG(" -- out of bits, suspending w/ accumulator of %u (0x%02x)\n", accumulator, accumulator); + return NO_BITS; + } + hsd->current_byte = hsd->buffers[hsd->input_index++]; + LOG(" -- pulled byte 0x%02x\n", hsd->current_byte); + if (hsd->input_index == hsd->input_size) { + hsd->input_index = 0; /* input is exhausted */ + hsd->input_size = 0; + } + hsd->bit_index = 0x80; + } + accumulator <<= 1; + if (hsd->current_byte & hsd->bit_index) { + accumulator |= 0x01; + if (0) { + LOG(" -- got 1, accumulator 0x%04x, bit_index 0x%02x\n", + accumulator, hsd->bit_index); + } + } + else if (0) { + LOG(" -- got 0, accumulator 0x%04x, bit_index 0x%02x\n", + accumulator, hsd->bit_index); + } + hsd->bit_index >>= 1; + } + + if (count > 1) LOG(" -- accumulated %08x\n", accumulator); + return accumulator; +} + +HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd) { + if (hsd == nullptr) { return HSDR_FINISH_ERROR_NULL; } + switch (hsd->state) { + case HSDS_TAG_BIT: + return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; + + /* If we want to finish with no input, but are in these states, it's + * because the 0-bit padding to the last byte looks like a backref + * marker bit followed by all 0s for index and count bits. */ + case HSDS_BACKREF_INDEX_LSB: + case HSDS_BACKREF_INDEX_MSB: + case HSDS_BACKREF_COUNT_LSB: + case HSDS_BACKREF_COUNT_MSB: + return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; + + /* If the output stream is padded with 0xFFs (possibly due to being in + * flash memory), also explicitly check the input size rather than + * uselessly returning MORE but yielding 0 bytes when polling. */ + case HSDS_YIELD_LITERAL: + return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; + + default: return HSDR_FINISH_MORE; + } +} + +static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte) { + LOG(" -- pushing byte: 0x%02x ('%c')\n", byte, isprint(byte) ? 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 new file mode 100644 index 00000000..eb113aa5 --- /dev/null +++ b/Marlin/src/libs/heatshrink/heatshrink_decoder.h @@ -0,0 +1,119 @@ +/** + * 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 "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 */ + HSDR_SINK_ERROR_NULL=-1, /* NULL argument */ +} HSD_sink_res; + +typedef enum { + HSDR_POLL_EMPTY, /* input exhausted */ + HSDR_POLL_MORE, /* more data remaining, call again w/ fresh output buffer */ + HSDR_POLL_ERROR_NULL=-1, /* NULL arguments */ + HSDR_POLL_ERROR_UNKNOWN=-2, +} HSD_poll_res; + +typedef enum { + HSDR_FINISH_DONE, /* output is done */ + HSDR_FINISH_MORE, /* more output remains */ + HSDR_FINISH_ERROR_NULL=-1, /* NULL arguments */ +} HSD_finish_res; + +#if HEATSHRINK_DYNAMIC_ALLOC +#define HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(BUF) \ + ((BUF)->input_buffer_size) +#define HEATSHRINK_DECODER_WINDOW_BITS(BUF) \ + ((BUF)->window_sz2) +#define HEATSHRINK_DECODER_LOOKAHEAD_BITS(BUF) \ + ((BUF)->lookahead_sz2) +#else +#define HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_) \ + HEATSHRINK_STATIC_INPUT_BUFFER_SIZE +#define HEATSHRINK_DECODER_WINDOW_BITS(_) \ + (HEATSHRINK_STATIC_WINDOW_BITS) +#define HEATSHRINK_DECODER_LOOKAHEAD_BITS(BUF) \ + (HEATSHRINK_STATIC_LOOKAHEAD_BITS) +#endif + +typedef struct { + uint16_t input_size; /* bytes in input buffer */ + uint16_t input_index; /* offset to next unprocessed input byte */ + uint16_t output_count; /* how many bytes to output */ + uint16_t output_index; /* index for bytes to output */ + uint16_t head_index; /* head of window buffer */ + uint8_t state; /* current state machine node */ + uint8_t current_byte; /* current byte of input */ + uint8_t bit_index; /* current bit index */ + +#if HEATSHRINK_DYNAMIC_ALLOC + /* Fields that are only used if dynamically allocated. */ + uint8_t window_sz2; /* window buffer bits */ + uint8_t lookahead_sz2; /* lookahead bits */ + uint16_t input_buffer_size; /* input buffer size */ + + /* Input buffer, then expansion window buffer */ + uint8_t buffers[]; +#else + /* Input buffer, then expansion window buffer */ + uint8_t buffers[(1 << HEATSHRINK_DECODER_WINDOW_BITS(_)) + HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_)]; +#endif +} heatshrink_decoder; + +#if HEATSHRINK_DYNAMIC_ALLOC +/* Allocate a decoder with an input buffer of INPUT_BUFFER_SIZE bytes, + * an expansion buffer size of 2^WINDOW_SZ2, and a lookahead + * size of 2^lookahead_sz2. (The window buffer and lookahead sizes + * must match the settings used when the data was compressed.) + * Returns NULL on error. */ +heatshrink_decoder *heatshrink_decoder_alloc(uint16_t input_buffer_size, uint8_t expansion_buffer_sz2, uint8_t lookahead_sz2); + +/* Free a decoder. */ +void heatshrink_decoder_free(heatshrink_decoder *hsd); +#endif + +/* Reset a decoder. */ +void heatshrink_decoder_reset(heatshrink_decoder *hsd); + +/* Sink at most SIZE bytes from IN_BUF into the decoder. *INPUT_SIZE is set to + * indicate how many bytes were actually sunk (in case a buffer was filled). */ +HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, uint8_t *in_buf, size_t size, size_t *input_size); + +/* Poll for output from the decoder, copying at most OUT_BUF_SIZE bytes into + * OUT_BUF (setting *OUTPUT_SIZE to the actual amount copied). */ +HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, uint8_t *out_buf, size_t out_buf_size, size_t *output_size); + +/* Notify the dencoder that the input stream is finished. + * If the return value is HSDR_FINISH_MORE, there is still more output, so + * call heatshrink_decoder_poll and repeat. */ +HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd); diff --git a/Marlin/src/libs/hex_print.cpp b/Marlin/src/libs/hex_print.cpp new file mode 100644 index 00000000..0f746d62 --- /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/MarlinConfigPre.h" + +#if NEED_HEX_PRINT + +#include "hex_print.h" +#include "../core/serial.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 uintptr_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((uintptr_t)w); + #else + (void)hex_word((uintptr_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.h b/Marlin/src/libs/hex_print.h new file mode 100644 index 00000000..40baa15b --- /dev/null +++ b/Marlin/src/libs/hex_print.h @@ -0,0 +1,41 @@ +/** + * 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 + +// +// Utility functions to create and print hex strings as nybble, byte, and word. +// + +FORCE_INLINE char hex_nybble(const uint8_t n) { + return (n & 0xF) + ((n & 0xF) < 10 ? '0' : 'A' - 10); +} +char* hex_byte(const uint8_t b); +char* hex_word(const uint16_t w); +char* hex_address(const void * const w); + +void print_hex_nybble(const uint8_t n); +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); diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp new file mode 100644 index 00000000..c7593c04 --- /dev/null +++ b/Marlin/src/libs/least_squares_fit.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 . + * + */ + +/** + * Least Squares Best Fit by Roxy and Ed Williams + * + * This algorithm is high speed and has a very small code footprint. + * Its results are identical to both the Iterative Least-Squares published + * earlier by Roxy and the QR_SOLVE solution. If used in place of QR_SOLVE + * it saves roughly 10K of program memory. It also does not require all of + * coordinates to be present during the calculations. Each point can be + * probed and then discarded. + */ + +#include "../inc/MarlinConfig.h" + +#if NEED_LSF + +#include "least_squares_fit.h" + +#include + +int finish_incremental_LSF(struct linear_fit_data *lsf) { + + const float N = lsf->N; + + if (N == 0.0) + return 1; + + lsf->xbar /= N; + lsf->ybar /= N; + lsf->zbar /= N; + lsf->x2bar = lsf->x2bar / N - sq(lsf->xbar); + lsf->y2bar = lsf->y2bar / N - sq(lsf->ybar); + lsf->z2bar = lsf->z2bar / N - sq(lsf->zbar); + lsf->xybar = lsf->xybar / N - lsf->xbar * lsf->ybar; + lsf->yzbar = lsf->yzbar / N - lsf->ybar * lsf->zbar; + lsf->xzbar = lsf->xzbar / N - lsf->xbar * lsf->zbar; + const float DD = lsf->x2bar * lsf->y2bar - sq(lsf->xybar); + + if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy)) + return 1; + + lsf->A = (lsf->yzbar * lsf->xybar - lsf->xzbar * lsf->y2bar) / DD; + lsf->B = (lsf->xzbar * lsf->xybar - lsf->yzbar * lsf->x2bar) / DD; + lsf->D = -(lsf->zbar + lsf->A * lsf->xbar + lsf->B * lsf->ybar); + return 0; +} + +#endif // NEED_LSF diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h new file mode 100644 index 00000000..44ca8afc --- /dev/null +++ b/Marlin/src/libs/least_squares_fit.h @@ -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 . + * + */ +#pragma once + +/** + * Incremental Least Squares Best Fit By Roxy and Ed Williams + * + * This algorithm is high speed and has a very small code footprint. + * Its results are identical to both the Iterative Least-Squares published + * earlier by Roxy and the QR_SOLVE solution. If used in place of QR_SOLVE + * it saves roughly 10K of program memory. And even better... the data + * fed into the algorithm does not need to all be present at the same time. + * A point can be probed and its values fed into the algorithm and then discarded. + */ + +#include "../inc/MarlinConfig.h" +#include + +struct linear_fit_data { + float xbar, ybar, zbar, + x2bar, y2bar, z2bar, + xybar, xzbar, yzbar, + max_absx, max_absy, + A, B, D, N; +}; + +inline void incremental_LSF_reset(struct linear_fit_data *lsf) { + memset(lsf, 0, sizeof(linear_fit_data)); +} + +inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z, const float &w) { + // weight each accumulator by factor w, including the "number" of samples + // (analogous to calling inc_LSF twice with same values to weight it by 2X) + const float wx = w * x, wy = w * y, wz = w * z; + lsf->xbar += wx; + lsf->ybar += wy; + lsf->zbar += wz; + lsf->x2bar += wx * x; + lsf->y2bar += wy * y; + lsf->z2bar += wz * z; + lsf->xybar += wx * y; + lsf->xzbar += wx * z; + lsf->yzbar += wy * z; + lsf->N += w; + lsf->max_absx = _MAX(ABS(wx), lsf->max_absx); + lsf->max_absy = _MAX(ABS(wy), lsf->max_absy); +} +inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z, const float &w) { + incremental_WLSF(lsf, pos.x, pos.y, z, w); +} + +inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { + lsf->xbar += x; + lsf->ybar += y; + lsf->zbar += z; + lsf->x2bar += sq(x); + lsf->y2bar += sq(y); + lsf->z2bar += sq(z); + lsf->xybar += x * y; + lsf->xzbar += x * z; + lsf->yzbar += y * z; + lsf->max_absx = _MAX(ABS(x), lsf->max_absx); + lsf->max_absy = _MAX(ABS(y), lsf->max_absy); + lsf->N += 1.0; +} +inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z) { + incremental_LSF(lsf, pos.x, pos.y, z); +} + +int finish_incremental_LSF(struct linear_fit_data *); diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp new file mode 100644 index 00000000..10021005 --- /dev/null +++ b/Marlin/src/libs/nozzle.cpp @@ -0,0 +1,239 @@ +/** + * 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 EITHER(NOZZLE_CLEAN_FEATURE, NOZZLE_PARK_FEATURE) + +#include "nozzle.h" + +Nozzle nozzle; + +#include "../MarlinCore.h" +#include "../module/motion.h" + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + + /** + * @brief Stroke clean pattern + * @details Wipes the nozzle back and forth in a linear movement + * + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point + * @param strokes number of strokes to execute + */ + void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) { + TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t oldpos = current_position); + + // Move to the starting point + #if ENABLED(NOZZLE_CLEAN_NO_Z) + #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) { + #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)); + } + + /** + * @brief Zig-zag clean pattern + * @details Apply a zig-zag cleaning pattern + * + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point + * @param strokes number of strokes to execute + * @param objects number of triangles to do + */ + void Nozzle::zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) { + const xy_pos_t diff = end - start; + if (!diff.x || !diff.y) return; + + TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); + + #if ENABLED(NOZZLE_CLEAN_NO_Z) + do_blocking_move_to_xy(start); + #else + do_blocking_move_to(start); + #endif + + const uint8_t zigs = objects << 1; + const bool horiz = ABS(diff.x) >= ABS(diff.y); // Do a horizontal wipe? + const float P = (horiz ? diff.x : diff.y) / zigs; // Period of each zig / zag + const xyz_pos_t *side; + LOOP_L_N(j, strokes) { + for (int8_t i = 0; i < zigs; i++) { + side = (i & 1) ? &end : &start; + if (horiz) + do_blocking_move_to_xy(start.x + i * P, side->y); + else + do_blocking_move_to_xy(side->x, start.y + i * P); + } + for (int8_t i = zigs; i >= 0; i--) { + side = (i & 1) ? &end : &start; + if (horiz) + do_blocking_move_to_xy(start.x + i * P, side->y); + else + do_blocking_move_to_xy(side->x, start.y + i * P); + } + } + + TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(back)); + } + + /** + * @brief Circular clean pattern + * @details Apply a circular cleaning pattern + * + * @param start xyz_pos_t defining the middle of circle + * @param strokes number of strokes to execute + * @param radius radius of circle + */ + void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { + if (strokes == 0) return; + + TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); + TERN(NOZZLE_CLEAN_NO_Z, do_blocking_move_to_xy, do_blocking_move_to)(start); + + LOOP_L_N(s, strokes) + LOOP_L_N(i, NOZZLE_CLEAN_CIRCLE_FN) + do_blocking_move_to_xy( + middle.x + sin((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius, + middle.y + cos((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius + ); + + // Let's be safe + do_blocking_move_to_xy(start); + + TERN_(NOZZLE_CLEAN_GOBACK, do_blocking_move_to(back)); + } + + /** + * @brief Clean the nozzle + * @details Starts the selected clean procedure pattern + * + * @param pattern one of the available patterns + * @param argument depends on the cleaning pattern + */ + void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) { + xyz_pos_t start[HOTENDS] = NOZZLE_CLEAN_START_POINT, end[HOTENDS] = NOZZLE_CLEAN_END_POINT, middle[HOTENDS] = NOZZLE_CLEAN_CIRCLE_MIDDLE; + + const uint8_t arrPos = ANY(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; + + #if HAS_SOFTWARE_ENDSTOPS + + #define LIMIT_AXIS(A) do{ \ + LIMIT( start[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ + LIMIT(middle[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ + LIMIT( end[arrPos].A, soft_endstop.min.A, soft_endstop.max.A); \ + }while(0) + + if (soft_endstop.enabled()) { + + LIMIT_AXIS(x); + LIMIT_AXIS(y); + LIMIT_AXIS(z); + const bool radiusOutOfRange = (middle[arrPos].x + radius > soft_endstop.max.x) + || (middle[arrPos].x - radius < soft_endstop.min.x) + || (middle[arrPos].y + radius > soft_endstop.max.y) + || (middle[arrPos].y - radius < soft_endstop.min.y); + if (radiusOutOfRange && pattern == 2) { + SERIAL_ECHOLNPGM("Warning: Radius Out of Range"); + return; + } + + } + + #endif + + if (pattern == 2) { + if (!(cleans & (_BV(X_AXIS) | _BV(Y_AXIS)))) { + SERIAL_ECHOLNPGM("Warning: Clean Circle requires XY"); + return; + } + } + else { + if (!TEST(cleans, X_AXIS)) start[arrPos].x = end[arrPos].x = current_position.x; + if (!TEST(cleans, Y_AXIS)) start[arrPos].y = end[arrPos].y = current_position.y; + } + if (!TEST(cleans, Z_AXIS)) start[arrPos].z = end[arrPos].z = current_position.z; + + switch (pattern) { + case 1: zigzag(start[arrPos], end[arrPos], strokes, objects); break; + case 2: circle(start[arrPos], middle[arrPos], strokes, radius); break; + default: stroke(start[arrPos], end[arrPos], strokes); + } + } + +#endif // NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + + void Nozzle::park(const uint8_t z_action, const xyz_pos_t &park/*=NOZZLE_PARK_POINT*/) { + constexpr feedRate_t fr_xy = NOZZLE_PARK_XY_FEEDRATE, fr_z = NOZZLE_PARK_Z_FEEDRATE; + + switch (z_action) { + case 1: // Go to Z-park height + do_blocking_move_to_z(park.z, fr_z); + break; + + case 2: // Raise by Z-park height + do_blocking_move_to_z(_MIN(current_position.z + park.z, Z_MAX_POS), fr_z); + break; + + default: { + // Apply a minimum raise, overriding G27 Z + const float min_raised_z =_MIN(Z_MAX_POS, current_position.z + #ifdef NOZZLE_PARK_Z_RAISE_MIN + + NOZZLE_PARK_Z_RAISE_MIN + #endif + ); + do_blocking_move_to_z(_MAX(park.z, min_raised_z), fr_z); + } break; + } + + do_blocking_move_to_xy( + TERN(NOZZLE_PARK_Y_ONLY, current_position, park).x, + TERN(NOZZLE_PARK_X_ONLY, current_position, park).y, + fr_xy + ); + + report_current_position(); + } + +#endif // NOZZLE_PARK_FEATURE + +#endif // NOZZLE_CLEAN_FEATURE || NOZZLE_PARK_FEATURE diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h new file mode 100644 index 00000000..81594b13 --- /dev/null +++ b/Marlin/src/libs/nozzle.h @@ -0,0 +1,91 @@ +/** + * 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" + +/** + * @brief Nozzle class + * + * @todo: Do not ignore the end.z value and allow XYZ movements + */ +class Nozzle { + private: + + #if ENABLED(NOZZLE_CLEAN_FEATURE) + + /** + * @brief Stroke clean pattern + * @details Wipes the nozzle back and forth in a linear movement + * + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point + * @param strokes number of strokes to execute + */ + static void stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) _Os; + + /** + * @brief Zig-zag clean pattern + * @details Apply a zig-zag cleaning pattern + * + * @param start xyz_pos_t defining the starting point + * @param end xyz_pos_t defining the ending point + * @param strokes number of strokes to execute + * @param objects number of objects to create + */ + static void zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) _Os; + + /** + * @brief Circular clean pattern + * @details Apply a circular cleaning pattern + * + * @param start xyz_pos_t defining the middle of circle + * @param strokes number of strokes to execute + * @param radius radius of circle + */ + static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) _Os; + + #endif // NOZZLE_CLEAN_FEATURE + + public: + + #if ENABLED(NOZZLE_CLEAN_FEATURE) + + /** + * @brief Clean the nozzle + * @details Starts the selected clean procedure pattern + * + * @param pattern one of the available patterns + * @param argument depends on the cleaning pattern + */ + static void clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) _Os; + + #endif // NOZZLE_CLEAN_FEATURE + + #if ENABLED(NOZZLE_PARK_FEATURE) + + static void park(const uint8_t z_action, const xyz_pos_t &park=NOZZLE_PARK_POINT) _Os; + + #endif +}; + +extern Nozzle nozzle; diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp new file mode 100644 index 00000000..c3efb2b2 --- /dev/null +++ b/Marlin/src/libs/numtostr.cpp @@ -0,0 +1,404 @@ +/** + * 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 "numtostr.h" + +#include "../inc/MarlinConfigPre.h" +#include "../core/utility.h" + +char conv[8] = { 0 }; + +#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, '-')) +#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) { + const uint8_t n = ui8_to_percent(i); + conv[3] = RJDIGIT(n, 100); + conv[4] = RJDIGIT(n, 10); + conv[5] = DIGIMOD(n, 1); + conv[6] = '%'; + return &conv[3]; +} + +// Convert unsigned 8bit int to string 123 format +const char* ui8tostr3rj(const uint8_t i) { + conv[4] = RJDIGIT(i, 100); + conv[5] = RJDIGIT(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[4]; +} + +// Convert uint8_t to string with 12 format +const char* ui8tostr2(const uint8_t i) { + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[5]; +} + +// Convert signed 8bit int to rj string with 123 or -12 format +const char* i8tostr3rj(const int8_t x) { + int xx = x; + conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); + conv[5] = RJDIGIT(xx, 10); + conv[6] = DIGIMOD(xx, 1); + return &conv[4]; +} + +#if HAS_PRINT_PROGRESS_PERMYRIAD + // Convert unsigned 16-bit permyriad to percent with 100 / 23 / 23.4 / 3.45 format + const char* permyriadtostr4(const uint16_t xx) { + if (xx >= 10000) + return "100"; + else if (xx >= 1000) { + conv[3] = DIGIMOD(xx, 1000); + conv[4] = DIGIMOD(xx, 100); + conv[5] = '.'; + conv[6] = DIGIMOD(xx, 10); + return &conv[3]; + } + else if (xx % 100 == 0) { + conv[4] = ' '; + conv[5] = RJDIGIT(xx, 1000); + conv[6] = DIGIMOD(xx, 100); + return &conv[4]; + } + else { + conv[3] = DIGIMOD(xx, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(xx, 10); + conv[6] = RJDIGIT(xx, 1); + return &conv[3]; + } + } +#endif + +// Convert unsigned 16bit int to string 12345 format +const char* ui16tostr5rj(const uint16_t xx) { + conv[2] = RJDIGIT(xx, 10000); + conv[3] = RJDIGIT(xx, 1000); + conv[4] = RJDIGIT(xx, 100); + conv[5] = RJDIGIT(xx, 10); + conv[6] = DIGIMOD(xx, 1); + return &conv[2]; +} + +// Convert unsigned 16bit int to string 1234 format +const char* ui16tostr4rj(const uint16_t xx) { + conv[3] = RJDIGIT(xx, 1000); + conv[4] = RJDIGIT(xx, 100); + conv[5] = RJDIGIT(xx, 10); + conv[6] = DIGIMOD(xx, 1); + return &conv[3]; +} + +// Convert unsigned 16bit int to string 123 format +const char* ui16tostr3rj(const uint16_t xx) { + conv[4] = RJDIGIT(xx, 100); + conv[5] = RJDIGIT(xx, 10); + conv[6] = DIGIMOD(xx, 1); + return &conv[4]; +} + +// Convert signed 16bit int to rj string with 123 or -12 format +const char* i16tostr3rj(const int16_t 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 unsigned 16bit int to lj string with 123 format +const char* i16tostr3left(const int16_t i) { + char *str = &conv[6]; + *str = DIGIMOD(i, 1); + if (i >= 10) { + *(--str) = DIGIMOD(i, 10); + if (i >= 100) + *(--str) = DIGIMOD(i, 100); + } + return str; +} + +// Convert signed 16bit int to rj string with 1234, _123, -123, _-12, or __-1 format +const char* i16tostr4signrj(const int16_t i) { + const bool neg = i < 0; + const int ii = neg ? -i : i; + if (i >= 1000) { + conv[3] = DIGIMOD(ii, 1000); + conv[4] = DIGIMOD(ii, 100); + conv[5] = DIGIMOD(ii, 10); + } + else if (ii >= 100) { + conv[3] = neg ? '-' : ' '; + conv[4] = DIGIMOD(ii, 100); + conv[5] = DIGIMOD(ii, 10); + } + else { + conv[3] = ' '; + conv[4] = ' '; + if (ii >= 10) { + conv[4] = neg ? '-' : ' '; + conv[5] = DIGIMOD(ii, 10); + } + else { + conv[5] = neg ? '-' : ' '; + } + } + conv[6] = DIGIMOD(ii, 1); + return &conv[3]; +} + +// Convert unsigned float to string with 1.23 format +const char* ftostr12ns(const float &f) { + const long i = UINTFLOAT(f, 2); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[3]; +} + +// Convert unsigned float to string with 12.3 format +const char* ftostr31ns(const float &f) { + const long i = UINTFLOAT(f, 1); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[3]; +} + +// Convert unsigned float to string with 123.4 format +const char* ftostr41ns(const float &f) { + const long i = UINTFLOAT(f, 1); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[2]; +} + +// 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 = INTFLOAT(f, 2); + conv[2] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 1000)); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[2]; +} + +// Convert signed float to fixed-length string with 023.45 / -23.45 format +const char* ftostr52(const float &f) { + long i = INTFLOAT(f, 2); + conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[1]; +} + +// 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 = INTFLOAT(f, 3); + conv[1] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 10000)); + conv[2] = DIGIMOD(i, 1000); + conv[3] = '.'; + conv[4] = DIGIMOD(i, 100); + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[1]; +} + +// Convert signed float to fixed-length string with 023.456 / -23.456 format +const char* ftostr63(const float &f) { + long i = INTFLOAT(f, 3); + conv[0] = MINUSOR(i, DIGIMOD(i, 100000)); + conv[1] = DIGIMOD(i, 10000); + conv[2] = DIGIMOD(i, 1000); + conv[3] = '.'; + conv[4] = DIGIMOD(i, 100); + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[0]; +} + +#if ENABLED(LCD_DECIMAL_SMALL_XY) + + // 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 = INTFLOAT(f, 1); + if (!WITHIN(i, -99, 999)) return i16tostr4signrj((int)f); + const bool neg = i < 0; + const int ii = neg ? -i : i; + conv[3] = neg ? '-' : (ii >= 100 ? DIGIMOD(ii, 100) : ' '); + conv[4] = DIGIMOD(ii, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(ii, 1); + return &conv[3]; + } + +#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 = INTFLOAT(f, 1); + conv[1] = MINUSOR(i, '+'); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[1]; +} + +// 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 = INTFLOAT(f, 3); + conv[1] = i ? MINUSOR(i, plus) : ' '; + conv[2] = DIGIMOD(i, 1000); + conv[3] = '.'; + conv[4] = DIGIMOD(i, 100); + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[1]; +} + +// 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 = INTFLOAT(f, 4); + conv[0] = i ? MINUSOR(i, plus) : ' '; + conv[1] = DIGIMOD(i, 10000); + conv[2] = '.'; + conv[3] = DIGIMOD(i, 1000); + conv[4] = DIGIMOD(i, 100); + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return &conv[0]; +} + +// Convert unsigned float to rj string with 12345 format +const char* ftostr5rj(const float &f) { + 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 = INTFLOAT(f, 1); + conv[0] = MINUSOR(i, '+'); + conv[1] = DIGIMOD(i, 10000); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return conv; +} + +// Convert signed float to string with +123.45 format +const char* ftostr52sign(const float &f) { + long i = INTFLOAT(f, 2); + conv[0] = MINUSOR(i, '+'); + conv[1] = DIGIMOD(i, 10000); + conv[2] = DIGIMOD(i, 1000); + conv[3] = DIGIMOD(i, 100); + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return conv; +} + +// Convert signed float to string with +12.345 format +const char* ftostr53sign(const float &f) { + long i = INTFLOAT(f, 3); + conv[0] = MINUSOR(i, '+'); + conv[1] = DIGIMOD(i, 10000); + conv[2] = DIGIMOD(i, 1000); + conv[3] = '.'; + conv[4] = DIGIMOD(i, 100); + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIMOD(i, 1); + return conv; +} + +// Convert unsigned float to string with ____4.5, __34.5, _234.5, 1234.5 format +const char* ftostr51rj(const float &f) { + const long i = UINTFLOAT(f, 1); + conv[0] = ' '; + conv[1] = RJDIGIT(i, 10000); + conv[2] = RJDIGIT(i, 1000); + conv[3] = RJDIGIT(i, 100); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return conv; +} + +// Convert signed float to space-padded string with -_23.4_ format +const char* ftostr52sp(const float &f) { + long i = INTFLOAT(f, 2); + uint8_t dig; + conv[0] = MINUSOR(i, ' '); + conv[1] = RJDIGIT(i, 10000); + conv[2] = RJDIGIT(i, 1000); + conv[3] = DIGIMOD(i, 100); + + if ((dig = i % 10)) { // second digit after decimal point? + conv[4] = '.'; + conv[5] = DIGIMOD(i, 10); + conv[6] = DIGIT(dig); + } + else { + if ((dig = (i / 10) % 10)) { // first digit after decimal point? + conv[4] = '.'; + conv[5] = DIGIT(dig); + } + else // nothing after decimal point + conv[4] = conv[5] = ' '; + conv[6] = ' '; + } + return conv; +} diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h new file mode 100644 index 00000000..e7c1e67e --- /dev/null +++ b/Marlin/src/libs/numtostr.h @@ -0,0 +1,125 @@ +/** + * 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 + +// Convert a full-range unsigned 8bit int to a percentage +const char* ui8tostr4pctrj(const uint8_t i); + +// Convert uint8_t to string with 12 format +const char* ui8tostr2(const uint8_t x); + +// Convert uint8_t to string with 123 format +const char* ui8tostr3rj(const uint8_t i); + +// Convert int8_t to string with 123 format +const char* i8tostr3rj(const int8_t x); + +#if HAS_PRINT_PROGRESS_PERMYRIAD + // Convert 16-bit unsigned permyriad value to percent: 100 / 23 / 23.4 / 3.45 + const char* permyriadtostr4(const uint16_t xx); +#endif + +// Convert uint16_t to string with 12345 format +const char* ui16tostr5rj(const uint16_t x); + +// Convert uint16_t to string with 1234 format +const char* ui16tostr4rj(const uint16_t x); + +// Convert uint16_t to string with 123 format +const char* ui16tostr3rj(const uint16_t x); + +// Convert int16_t to string with 123 format +const char* i16tostr3rj(const int16_t x); + +// Convert unsigned int to lj string with 123 format +const char* i16tostr3left(const int16_t xx); + +// Convert signed int to rj string with _123, -123, _-12, or __-1 format +const char* i16tostr4signrj(const int16_t x); + +// Convert unsigned float to string with 1.23 format +const char* ftostr12ns(const float &x); + +// Convert unsigned float to string with 12.3 format +const char* ftostr31ns(const float &x); + +// Convert unsigned float to string with 123.4 format +const char* ftostr41ns(const float &x); + +// 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 &x); + +// Convert signed float to fixed-length string with 023.45 / -23.45 format +const char* ftostr52(const float &x); + +// Convert signed float to fixed-length string with 12.345 / -2.345 or 023.456 / -23.456 format +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); + +// Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format +const char* ftostr43sign(const float &x, char plus=' '); + +// Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format +const char* ftostr54sign(const float &x, char plus=' '); + +// Convert unsigned float to rj string with 12345 format +const char* ftostr5rj(const float &x); + +// Convert signed float to string with +1234.5 format +const char* ftostr51sign(const float &x); + +// Convert signed float to space-padded string with -_23.4_ format +const char* ftostr52sp(const float &x); + +// Convert signed float to string with +123.45 format +const char* ftostr52sign(const float &x); + +// Convert signed float to string with +12.345 format +const char* ftostr53sign(const float &f); + +// Convert unsigned float to string with 1234.5 format omitting trailing zeros +const char* ftostr51rj(const float &x); + +#include "../core/macros.h" + +// Convert float to rj string with 123 or -12 format +FORCE_INLINE const char* ftostr3(const float &x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(LCD_DECIMAL_SMALL_XY) + // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format + const char* ftostr4sign(const float &fx); +#else + // Convert float to rj string with 1234, _123, -123, __12, _-12, ___1, or __-1 format + FORCE_INLINE const char* ftostr4sign(const float &x) { return i16tostr4signrj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } +#endif diff --git a/Marlin/src/libs/private_spi.h b/Marlin/src/libs/private_spi.h new file mode 100644 index 00000000..9c0ffe74 --- /dev/null +++ b/Marlin/src/libs/private_spi.h @@ -0,0 +1,54 @@ +/** + * 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 "softspi.h" +#include + +template +class SPIclass { + static SoftSPI softSPI; + public: + FORCE_INLINE static void init() { softSPI.begin(); } + FORCE_INLINE static void send(uint8_t data) { softSPI.send(data); } + FORCE_INLINE static uint8_t receive() { return softSPI.receive(); } +}; + +// Hardware SPI +template<> +class SPIclass { + public: + FORCE_INLINE static void init() { + OUT_WRITE(SCK_PIN, LOW); + OUT_WRITE(MOSI_PIN, HIGH); + SET_INPUT_PULLUP(MISO_PIN); + } + FORCE_INLINE static uint8_t receive() { + #if defined(__AVR__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__) + SPDR = 0; + for (;!TEST(SPSR, SPIF);); + return SPDR; + #else + return spiRec(); + #endif + } +}; diff --git a/Marlin/src/libs/softspi.h b/Marlin/src/libs/softspi.h new file mode 100644 index 00000000..5d48f9fd --- /dev/null +++ b/Marlin/src/libs/softspi.h @@ -0,0 +1,746 @@ +/** + * 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 + +// +// Based on https://github.com/niteris/ArduinoSoftSpi +// + +#include "../HAL/shared/Marduino.h" + +#ifndef FORCE_INLINE + #define FORCE_INLINE inline __attribute__((always_inline)) +#endif + +#define nop __asm__ volatile ("nop") // NOP for timing + +#ifdef __arm__ + + #ifdef CORE_TEENSY + + /** + * Read pin value + * @param[in] pin Arduino pin number + * @return value read + */ + FORCE_INLINE static bool fastDigitalRead(uint8_t pin) { + return *portInputRegister(pin); + } + + /** + * Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ + FORCE_INLINE static void fastDigitalWrite(uint8_t pin, bool value) { + if (value) + *portSetRegister(pin) = 1; + else + *portClearRegister(pin) = 1; + } + + #else // !CORE_TEENSY + + /** + * Read pin value + * @param[in] pin Arduino pin number + * @return value read + */ + FORCE_INLINE static bool fastDigitalRead(uint8_t pin) { + return digitalRead(pin); + } + + /** + * Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ + FORCE_INLINE static void fastDigitalWrite(uint8_t pin, bool value) { + digitalWrite(pin, value); + } + + #endif // !CORE_TEENSY + + inline void fastDigitalToggle(uint8_t pin) { fastDigitalWrite(pin, !fastDigitalRead(pin)); } + + inline void fastPinMode(uint8_t pin, bool mode) { pinMode(pin, mode); } + +#else // !__arm__ + + #include + #include + + /** + * @class pin_map_t + * @brief struct for mapping digital pins + */ + struct pin_map_t { + volatile uint8_t* ddr; /**< address of DDR for this pin */ + volatile uint8_t* pin; /**< address of PIN for this pin */ + volatile uint8_t* port; /**< address of PORT for this pin */ + uint8_t bit; /**< bit number for this pin */ + }; + + #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) + + // 168 and 328 Arduinos + const static pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRB, &PINB, &PORTB, 0}, // B0 8 + {&DDRB, &PINB, &PORTB, 1}, // B1 9 + {&DDRB, &PINB, &PORTB, 2}, // B2 10 + {&DDRB, &PINB, &PORTB, 3}, // B3 11 + {&DDRB, &PINB, &PORTB, 4}, // B4 12 + {&DDRB, &PINB, &PORTB, 5}, // B5 13 + {&DDRC, &PINC, &PORTC, 0}, // C0 14 + {&DDRC, &PINC, &PORTC, 1}, // C1 15 + {&DDRC, &PINC, &PORTC, 2}, // C2 16 + {&DDRC, &PINC, &PORTC, 3}, // C3 17 + {&DDRC, &PINC, &PORTC, 4}, // C4 18 + {&DDRC, &PINC, &PORTC, 5} // C5 19 + }; + + #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + + // Mega + static const pin_map_t pinMap[] = { + {&DDRE, &PINE, &PORTE, 0}, // E0 0 + {&DDRE, &PINE, &PORTE, 1}, // E1 1 + {&DDRE, &PINE, &PORTE, 4}, // E4 2 + {&DDRE, &PINE, &PORTE, 5}, // E5 3 + {&DDRG, &PING, &PORTG, 5}, // G5 4 + {&DDRE, &PINE, &PORTE, 3}, // E3 5 + {&DDRH, &PINH, &PORTH, 3}, // H3 6 + {&DDRH, &PINH, &PORTH, 4}, // H4 7 + {&DDRH, &PINH, &PORTH, 5}, // H5 8 + {&DDRH, &PINH, &PORTH, 6}, // H6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRJ, &PINJ, &PORTJ, 1}, // J1 14 + {&DDRJ, &PINJ, &PORTJ, 0}, // J0 15 + {&DDRH, &PINH, &PORTH, 1}, // H1 16 + {&DDRH, &PINH, &PORTH, 0}, // H0 17 + {&DDRD, &PIND, &PORTD, 3}, // D3 18 + {&DDRD, &PIND, &PORTD, 2}, // D2 19 + {&DDRD, &PIND, &PORTD, 1}, // D1 20 + {&DDRD, &PIND, &PORTD, 0}, // D0 21 + {&DDRA, &PINA, &PORTA, 0}, // A0 22 + {&DDRA, &PINA, &PORTA, 1}, // A1 23 + {&DDRA, &PINA, &PORTA, 2}, // A2 24 + {&DDRA, &PINA, &PORTA, 3}, // A3 25 + {&DDRA, &PINA, &PORTA, 4}, // A4 26 + {&DDRA, &PINA, &PORTA, 5}, // A5 27 + {&DDRA, &PINA, &PORTA, 6}, // A6 28 + {&DDRA, &PINA, &PORTA, 7}, // A7 29 + {&DDRC, &PINC, &PORTC, 7}, // C7 30 + {&DDRC, &PINC, &PORTC, 6}, // C6 31 + {&DDRC, &PINC, &PORTC, 5}, // C5 32 + {&DDRC, &PINC, &PORTC, 4}, // C4 33 + {&DDRC, &PINC, &PORTC, 3}, // C3 34 + {&DDRC, &PINC, &PORTC, 2}, // C2 35 + {&DDRC, &PINC, &PORTC, 1}, // C1 36 + {&DDRC, &PINC, &PORTC, 0}, // C0 37 + {&DDRD, &PIND, &PORTD, 7}, // D7 38 + {&DDRG, &PING, &PORTG, 2}, // G2 39 + {&DDRG, &PING, &PORTG, 1}, // G1 40 + {&DDRG, &PING, &PORTG, 0}, // G0 41 + {&DDRL, &PINL, &PORTL, 7}, // L7 42 + {&DDRL, &PINL, &PORTL, 6}, // L6 43 + {&DDRL, &PINL, &PORTL, 5}, // L5 44 + {&DDRL, &PINL, &PORTL, 4}, // L4 45 + {&DDRL, &PINL, &PORTL, 3}, // L3 46 + {&DDRL, &PINL, &PORTL, 2}, // L2 47 + {&DDRL, &PINL, &PORTL, 1}, // L1 48 + {&DDRL, &PINL, &PORTL, 0}, // L0 49 + {&DDRB, &PINB, &PORTB, 3}, // B3 50 + {&DDRB, &PINB, &PORTB, 2}, // B2 51 + {&DDRB, &PINB, &PORTB, 1}, // B1 52 + {&DDRB, &PINB, &PORTB, 0}, // B0 53 + {&DDRF, &PINF, &PORTF, 0}, // F0 54 + {&DDRF, &PINF, &PORTF, 1}, // F1 55 + {&DDRF, &PINF, &PORTF, 2}, // F2 56 + {&DDRF, &PINF, &PORTF, 3}, // F3 57 + {&DDRF, &PINF, &PORTF, 4}, // F4 58 + {&DDRF, &PINF, &PORTF, 5}, // F5 59 + {&DDRF, &PINF, &PORTF, 6}, // F6 60 + {&DDRF, &PINF, &PORTF, 7}, // F7 61 + {&DDRK, &PINK, &PORTK, 0}, // K0 62 + {&DDRK, &PINK, &PORTK, 1}, // K1 63 + {&DDRK, &PINK, &PORTK, 2}, // K2 64 + {&DDRK, &PINK, &PORTK, 3}, // K3 65 + {&DDRK, &PINK, &PORTK, 4}, // K4 66 + {&DDRK, &PINK, &PORTK, 5}, // K5 67 + {&DDRK, &PINK, &PORTK, 6}, // K6 68 + {&DDRK, &PINK, &PORTK, 7}, // K7 69 + + // pins_MIGHTYBOARD_REVE.h + {&DDRG, &PING, &PORTG, 4}, // G4 70 + {&DDRG, &PING, &PORTG, 3}, // G3 71 + {&DDRJ, &PINJ, &PORTJ, 2}, // J2 72 + {&DDRJ, &PINJ, &PORTJ, 3}, // J3 73 + {&DDRJ, &PINJ, &PORTJ, 7}, // J7 74 + {&DDRJ, &PINJ, &PORTJ, 4}, // J4 75 + {&DDRJ, &PINJ, &PORTJ, 5}, // J5 76 + {&DDRJ, &PINJ, &PORTJ, 6}, // J6 77 + {&DDRE, &PINE, &PORTE, 2}, // E2 78 + {&DDRE, &PINE, &PORTE, 6} // E6 79 + }; + + #elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega1284__) \ + || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) \ + || defined(__AVR_ATmega64__) || defined(__AVR_ATmega32__) \ + || defined(__AVR_ATmega324__) || defined(__AVR_ATmega16__) + + #ifdef VARIANT_MIGHTY + + // Mighty Layout + static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 0}, // A0 24 + {&DDRA, &PINA, &PORTA, 1}, // A1 25 + {&DDRA, &PINA, &PORTA, 2}, // A2 26 + {&DDRA, &PINA, &PORTA, 3}, // A3 27 + {&DDRA, &PINA, &PORTA, 4}, // A4 28 + {&DDRA, &PINA, &PORTA, 5}, // A5 29 + {&DDRA, &PINA, &PORTA, 6}, // A6 30 + {&DDRA, &PINA, &PORTA, 7} // A7 31 + }; + + #elif defined(VARIANT_BOBUINO) + + // Bobuino Layout + static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRB, &PINB, &PORTB, 0}, // B0 4 + {&DDRB, &PINB, &PORTB, 1}, // B1 5 + {&DDRB, &PINB, &PORTB, 2}, // B2 6 + {&DDRB, &PINB, &PORTB, 3}, // B3 7 + {&DDRD, &PIND, &PORTD, 5}, // D5 8 + {&DDRD, &PIND, &PORTD, 6}, // D6 9 + {&DDRB, &PINB, &PORTB, 4}, // B4 10 + {&DDRB, &PINB, &PORTB, 5}, // B5 11 + {&DDRB, &PINB, &PORTB, 6}, // B6 12 + {&DDRB, &PINB, &PORTB, 7}, // B7 13 + {&DDRA, &PINA, &PORTA, 7}, // A7 14 + {&DDRA, &PINA, &PORTA, 6}, // A6 15 + {&DDRA, &PINA, &PORTA, 5}, // A5 16 + {&DDRA, &PINA, &PORTA, 4}, // A4 17 + {&DDRA, &PINA, &PORTA, 3}, // A3 18 + {&DDRA, &PINA, &PORTA, 2}, // A2 19 + {&DDRA, &PINA, &PORTA, 1}, // A1 20 + {&DDRA, &PINA, &PORTA, 0}, // A0 21 + {&DDRC, &PINC, &PORTC, 0}, // C0 22 + {&DDRC, &PINC, &PORTC, 1}, // C1 23 + {&DDRC, &PINC, &PORTC, 2}, // C2 24 + {&DDRC, &PINC, &PORTC, 3}, // C3 25 + {&DDRC, &PINC, &PORTC, 4}, // C4 26 + {&DDRC, &PINC, &PORTC, 5}, // C5 27 + {&DDRC, &PINC, &PORTC, 6}, // C6 28 + {&DDRC, &PINC, &PORTC, 7}, // C7 29 + {&DDRD, &PIND, &PORTD, 4}, // D4 30 + {&DDRD, &PIND, &PORTD, 7} // D7 31 + }; + + #elif defined(VARIANT_STANDARD) + + // Standard Layout + static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 4}, // B4 4 + {&DDRB, &PINB, &PORTB, 5}, // B5 5 + {&DDRB, &PINB, &PORTB, 6}, // B6 6 + {&DDRB, &PINB, &PORTB, 7}, // B7 7 + {&DDRD, &PIND, &PORTD, 0}, // D0 8 + {&DDRD, &PIND, &PORTD, 1}, // D1 9 + {&DDRD, &PIND, &PORTD, 2}, // D2 10 + {&DDRD, &PIND, &PORTD, 3}, // D3 11 + {&DDRD, &PIND, &PORTD, 4}, // D4 12 + {&DDRD, &PIND, &PORTD, 5}, // D5 13 + {&DDRD, &PIND, &PORTD, 6}, // D6 14 + {&DDRD, &PIND, &PORTD, 7}, // D7 15 + {&DDRC, &PINC, &PORTC, 0}, // C0 16 + {&DDRC, &PINC, &PORTC, 1}, // C1 17 + {&DDRC, &PINC, &PORTC, 2}, // C2 18 + {&DDRC, &PINC, &PORTC, 3}, // C3 19 + {&DDRC, &PINC, &PORTC, 4}, // C4 20 + {&DDRC, &PINC, &PORTC, 5}, // C5 21 + {&DDRC, &PINC, &PORTC, 6}, // C6 22 + {&DDRC, &PINC, &PORTC, 7}, // C7 23 + {&DDRA, &PINA, &PORTA, 7}, // A7 24 + {&DDRA, &PINA, &PORTA, 6}, // A6 25 + {&DDRA, &PINA, &PORTA, 5}, // A5 26 + {&DDRA, &PINA, &PORTA, 4}, // A4 27 + {&DDRA, &PINA, &PORTA, 3}, // A3 28 + {&DDRA, &PINA, &PORTA, 2}, // A2 29 + {&DDRA, &PINA, &PORTA, 1}, // A1 30 + {&DDRA, &PINA, &PORTA, 0} // A0 31 + }; + + #else // !(VARIANT_MIGHTY || VARIANT_BOBUINO || VARIANT_STANDARD) + + #error Undefined variant 1284, 644, 324, 64, 32 + + #endif + + #elif defined(__AVR_ATmega32U4__) + + #ifdef CORE_TEENSY + + // Teensy 2.0 + static const pin_map_t pinMap[] = { + {&DDRB, &PINB, &PORTB, 0}, // B0 0 + {&DDRB, &PINB, &PORTB, 1}, // B1 1 + {&DDRB, &PINB, &PORTB, 2}, // B2 2 + {&DDRB, &PINB, &PORTB, 3}, // B3 3 + {&DDRB, &PINB, &PORTB, 7}, // B7 4 + {&DDRD, &PIND, &PORTD, 0}, // D0 5 + {&DDRD, &PIND, &PORTD, 1}, // D1 6 + {&DDRD, &PIND, &PORTD, 2}, // D2 7 + {&DDRD, &PIND, &PORTD, 3}, // D3 8 + {&DDRC, &PINC, &PORTC, 6}, // C6 9 + {&DDRC, &PINC, &PORTC, 7}, // C7 10 + {&DDRD, &PIND, &PORTD, 6}, // D6 11 + {&DDRD, &PIND, &PORTD, 7}, // D7 12 + {&DDRB, &PINB, &PORTB, 4}, // B4 13 + {&DDRB, &PINB, &PORTB, 5}, // B5 14 + {&DDRB, &PINB, &PORTB, 6}, // B6 15 + {&DDRF, &PINF, &PORTF, 7}, // F7 16 + {&DDRF, &PINF, &PORTF, 6}, // F6 17 + {&DDRF, &PINF, &PORTF, 5}, // F5 18 + {&DDRF, &PINF, &PORTF, 4}, // F4 19 + {&DDRF, &PINF, &PORTF, 1}, // F1 20 + {&DDRF, &PINF, &PORTF, 0}, // F0 21 + {&DDRD, &PIND, &PORTD, 4}, // D4 22 + {&DDRD, &PIND, &PORTD, 5}, // D5 23 + {&DDRE, &PINE, &PORTE, 6} // E6 24 + }; + + #else // !CORE_TEENSY + + // Leonardo + static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 2}, // D2 0 + {&DDRD, &PIND, &PORTD, 3}, // D3 1 + {&DDRD, &PIND, &PORTD, 1}, // D1 2 + {&DDRD, &PIND, &PORTD, 0}, // D0 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRC, &PINC, &PORTC, 6}, // C6 5 + {&DDRD, &PIND, &PORTD, 7}, // D7 6 + {&DDRE, &PINE, &PORTE, 6}, // E6 7 + {&DDRB, &PINB, &PORTB, 4}, // B4 8 + {&DDRB, &PINB, &PORTB, 5}, // B5 9 + {&DDRB, &PINB, &PORTB, 6}, // B6 10 + {&DDRB, &PINB, &PORTB, 7}, // B7 11 + {&DDRD, &PIND, &PORTD, 6}, // D6 12 + {&DDRC, &PINC, &PORTC, 7}, // C7 13 + {&DDRB, &PINB, &PORTB, 3}, // B3 14 + {&DDRB, &PINB, &PORTB, 1}, // B1 15 + {&DDRB, &PINB, &PORTB, 2}, // B2 16 + {&DDRB, &PINB, &PORTB, 0}, // B0 17 + {&DDRF, &PINF, &PORTF, 7}, // F7 18 + {&DDRF, &PINF, &PORTF, 6}, // F6 19 + {&DDRF, &PINF, &PORTF, 5}, // F5 20 + {&DDRF, &PINF, &PORTF, 4}, // F4 21 + {&DDRF, &PINF, &PORTF, 1}, // F1 22 + {&DDRF, &PINF, &PORTF, 0}, // F0 23 + {&DDRD, &PIND, &PORTD, 4}, // D4 24 + {&DDRD, &PIND, &PORTD, 7}, // D7 25 + {&DDRB, &PINB, &PORTB, 4}, // B4 26 + {&DDRB, &PINB, &PORTB, 5}, // B5 27 + {&DDRB, &PINB, &PORTB, 6}, // B6 28 + {&DDRD, &PIND, &PORTD, 6} // D6 29 + }; + + #endif // !CORE_TEENSY + + #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) + + // Teensy++ 1.0 & 2.0 + static const pin_map_t pinMap[] = { + {&DDRD, &PIND, &PORTD, 0}, // D0 0 + {&DDRD, &PIND, &PORTD, 1}, // D1 1 + {&DDRD, &PIND, &PORTD, 2}, // D2 2 + {&DDRD, &PIND, &PORTD, 3}, // D3 3 + {&DDRD, &PIND, &PORTD, 4}, // D4 4 + {&DDRD, &PIND, &PORTD, 5}, // D5 5 + {&DDRD, &PIND, &PORTD, 6}, // D6 6 + {&DDRD, &PIND, &PORTD, 7}, // D7 7 + {&DDRE, &PINE, &PORTE, 0}, // E0 8 + {&DDRE, &PINE, &PORTE, 1}, // E1 9 + {&DDRC, &PINC, &PORTC, 0}, // C0 10 + {&DDRC, &PINC, &PORTC, 1}, // C1 11 + {&DDRC, &PINC, &PORTC, 2}, // C2 12 + {&DDRC, &PINC, &PORTC, 3}, // C3 13 + {&DDRC, &PINC, &PORTC, 4}, // C4 14 + {&DDRC, &PINC, &PORTC, 5}, // C5 15 + {&DDRC, &PINC, &PORTC, 6}, // C6 16 + {&DDRC, &PINC, &PORTC, 7}, // C7 17 + {&DDRE, &PINE, &PORTE, 6}, // E6 18 + {&DDRE, &PINE, &PORTE, 7}, // E7 19 + {&DDRB, &PINB, &PORTB, 0}, // B0 20 + {&DDRB, &PINB, &PORTB, 1}, // B1 21 + {&DDRB, &PINB, &PORTB, 2}, // B2 22 + {&DDRB, &PINB, &PORTB, 3}, // B3 23 + {&DDRB, &PINB, &PORTB, 4}, // B4 24 + {&DDRB, &PINB, &PORTB, 5}, // B5 25 + {&DDRB, &PINB, &PORTB, 6}, // B6 26 + {&DDRB, &PINB, &PORTB, 7}, // B7 27 + {&DDRA, &PINA, &PORTA, 0}, // A0 28 + {&DDRA, &PINA, &PORTA, 1}, // A1 29 + {&DDRA, &PINA, &PORTA, 2}, // A2 30 + {&DDRA, &PINA, &PORTA, 3}, // A3 31 + {&DDRA, &PINA, &PORTA, 4}, // A4 32 + {&DDRA, &PINA, &PORTA, 5}, // A5 33 + {&DDRA, &PINA, &PORTA, 6}, // A6 34 + {&DDRA, &PINA, &PORTA, 7}, // A7 35 + {&DDRE, &PINE, &PORTE, 4}, // E4 36 + {&DDRE, &PINE, &PORTE, 5}, // E5 37 + {&DDRF, &PINF, &PORTF, 0}, // F0 38 + {&DDRF, &PINF, &PORTF, 1}, // F1 39 + {&DDRF, &PINF, &PORTF, 2}, // F2 40 + {&DDRF, &PINF, &PORTF, 3}, // F3 41 + {&DDRF, &PINF, &PORTF, 4}, // F4 42 + {&DDRF, &PINF, &PORTF, 5}, // F5 43 + {&DDRF, &PINF, &PORTF, 6}, // F6 44 + {&DDRF, &PINF, &PORTF, 7} // F7 45 + }; + + #else // CPU type + + #error "Unknown CPU type for Software SPI" + + #endif // CPU type + + /** count of pins */ + static constexpr uint8_t digitalPinCount = sizeof(pinMap) / sizeof(pin_map_t); + + /** generate bad pin number error */ + void badPinNumber() + __attribute__((error("Pin number is too large or not a constant"))); + + /** + * Check for valid pin number + * @param[in] pin Number of pin to be checked. + */ + FORCE_INLINE static void badPinCheck(const uint8_t pin) { + if (!__builtin_constant_p(pin) || pin >= digitalPinCount) badPinNumber(); + } + + /** + * Fast write helper + * @param[in] address I/O register address + * @param[in] bit bit number to write + * @param[in] level value for bit + */ + FORCE_INLINE static void fastBitWriteSafe(volatile uint8_t* address, uint8_t bit, bool level) { + uint8_t oldSREG; + if (address > (uint8_t*)0x5F) { oldSREG = SREG; cli(); } + if (level) SBI(*address, bit); else CBI(*address, bit); + if (address > (uint8_t*)0x5F) SREG = oldSREG; + } + + /** + * Read pin value + * @param[in] pin Arduino pin number + * @return value read + */ + FORCE_INLINE static bool fastDigitalRead(uint8_t pin) { + badPinCheck(pin); + return (*pinMap[pin].pin >> pinMap[pin].bit) & 1; + } + + /** + * Toggle a pin + * @param[in] pin Arduino pin number + * + * If the pin is in output mode toggle the pin level. + * If the pin is in input mode toggle the state of the 20K pullup. + */ + FORCE_INLINE static void fastDigitalToggle(uint8_t pin) { + badPinCheck(pin); + if (pinMap[pin].pin > (uint8_t*)0x5F) + *pinMap[pin].pin = _BV(pinMap[pin].bit); // Must write bit to high address port + else + SBI(*pinMap[pin].pin, pinMap[pin].bit); // Compiles to sbi and PIN register will not be read + } + + /** + * Set pin value + * @param[in] pin Arduino pin number + * @param[in] level value to write + */ + FORCE_INLINE static void fastDigitalWrite(uint8_t pin, bool level) { + badPinCheck(pin); + fastBitWriteSafe(pinMap[pin].port, pinMap[pin].bit, level); + } + + /** + * Set pin mode + * @param[in] pin Arduino pin number + * @param[in] mode if true set output mode else input mode + * + * fastPinMode does not enable or disable the 20K pullup for input mode. + */ + FORCE_INLINE static void fastPinMode(uint8_t pin, bool mode) { + badPinCheck(pin); + fastBitWriteSafe(pinMap[pin].ddr, pinMap[pin].bit, mode); + } + +#endif // !__arm__ + +/** + * Set pin configuration + * @param[in] pin Arduino pin number + * @param[in] mode If true set output mode else input mode + * @param[in] level If mode is output, set level high/low. + * If mode is input, enable or disable the pin's 20K pullup. + */ +FORCE_INLINE static void fastPinConfig(uint8_t pin, bool mode, bool level) { + fastPinMode(pin, mode); + fastDigitalWrite(pin, level); +} + +/** + * @class DigitalPin + * @brief Fast digital port I/O + */ +template +class DigitalPin { +public: + + /** Constructor */ + DigitalPin() {} + + /** + * Constructor + * @param[in] pinMode if true set output mode else input mode. + */ + explicit DigitalPin(bool pinMode) { mode(pinMode); } + + /** + * Constructor + * @param[in] mode If true set output mode else input mode + * @param[in] level If mode is output, set level high/low. + * If mode is input, enable or disable the pin's 20K pullup. + */ + DigitalPin(bool mode, bool level) { config(mode, level); } + + /** + * Assignment operator + * @param[in] value If true set the pin's level high else set the + * pin's level low. + * + * @return This DigitalPin instance. + */ + FORCE_INLINE DigitalPin & operator = (bool value) { write(value); return *this; } + + /** + * Parentheses operator + * @return Pin's level + */ + FORCE_INLINE operator bool () const { return read(); } + + /** + * Set pin configuration + * @param[in] mode If true set output mode else input mode + * @param[in] level If mode is output, set level high/low. + * If mode is input, enable or disable the pin's 20K pullup. + */ + FORCE_INLINE void config(bool mode, bool level) { fastPinConfig(PinNumber, mode, level); } + + /** + * Set pin level high if output mode or enable 20K pullup if input mode. + */ + FORCE_INLINE void high() { write(true); } + + /** + * Set pin level low if output mode or disable 20K pullup if input mode. + */ + FORCE_INLINE void low() { write(false); } + + /** + * Set pin mode + * @param[in] pinMode if true set output mode else input mode. + * + * mode() does not enable or disable the 20K pullup for input mode. + */ + FORCE_INLINE void mode(bool pinMode) { fastPinMode(PinNumber, pinMode); } + + /** @return Pin's level */ + FORCE_INLINE bool read() const { return fastDigitalRead(PinNumber); } + + /** + * Toggle a pin + * If the pin is in output mode toggle the pin's level. + * If the pin is in input mode toggle the state of the 20K pullup. + */ + FORCE_INLINE void toggle() { fastDigitalToggle(PinNumber); } + + /** + * Write the pin's level. + * @param[in] value If true set the pin's level high else set the + * pin's level low. + */ + FORCE_INLINE void write(bool value) { fastDigitalWrite(PinNumber, value); } +}; + +const bool MISO_MODE = false, // Pin Mode for MISO is input. + MISO_LEVEL = false, // Pullups disabled for MISO are disabled. + MOSI_MODE = true, // Pin Mode for MOSI is output. + SCK_MODE = true; // Pin Mode for SCK is output. + +/** + * @class SoftSPI + * @brief Fast software SPI. + */ +template +class SoftSPI { + public: + + /** Initialize SoftSPI pins. */ + void begin() { + fastPinConfig(MisoPin, MISO_MODE, MISO_LEVEL); + fastPinConfig(MosiPin, MOSI_MODE, !MODE_CPHA(Mode)); + fastPinConfig(SckPin, SCK_MODE, MODE_CPOL(Mode)); + } + + /** + * Soft SPI receive byte. + * @return Data byte received. + */ + FORCE_INLINE uint8_t receive() { + uint8_t data = 0; + receiveBit(7, &data); + receiveBit(6, &data); + receiveBit(5, &data); + receiveBit(4, &data); + receiveBit(3, &data); + receiveBit(2, &data); + receiveBit(1, &data); + receiveBit(0, &data); + return data; + } + + /** + * Soft SPI send byte. + * @param[in] data Data byte to send. + */ + FORCE_INLINE void send(uint8_t data) { + sendBit(7, data); + sendBit(6, data); + sendBit(5, data); + sendBit(4, data); + sendBit(3, data); + sendBit(2, data); + sendBit(1, data); + sendBit(0, data); + } + + /** + * Soft SPI transfer byte. + * @param[in] txData Data byte to send. + * @return Data byte received. + */ + FORCE_INLINE uint8_t transfer(uint8_t txData) { + uint8_t rxData = 0; + transferBit(7, &rxData, txData); + transferBit(6, &rxData, txData); + transferBit(5, &rxData, txData); + transferBit(4, &rxData, txData); + transferBit(3, &rxData, txData); + transferBit(2, &rxData, txData); + transferBit(1, &rxData, txData); + transferBit(0, &rxData, txData); + return rxData; + } + + private: + + FORCE_INLINE bool MODE_CPHA(uint8_t mode) { return bool(mode & 1); } + FORCE_INLINE bool MODE_CPOL(uint8_t mode) { return bool(mode & 2); } + FORCE_INLINE void receiveBit(uint8_t bit, uint8_t* data) { + if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + nop; + nop; + fastDigitalWrite(SckPin, + MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + if (fastDigitalRead(MisoPin)) SBI(*data, bit); + if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + + FORCE_INLINE void sendBit(uint8_t bit, uint8_t data) { + if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + fastDigitalWrite(MosiPin, data & _BV(bit)); + fastDigitalWrite(SckPin, MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + nop; + nop; + if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + + FORCE_INLINE void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) { + if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); + fastDigitalWrite(MosiPin, txData & _BV(bit)); + fastDigitalWrite(SckPin, + MODE_CPHA(Mode) ? MODE_CPOL(Mode) : !MODE_CPOL(Mode)); + if (fastDigitalRead(MisoPin)) SBI(*rxData, bit); + if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); + } + +}; diff --git a/Marlin/src/libs/stopwatch.cpp b/Marlin/src/libs/stopwatch.cpp new file mode 100644 index 00000000..601efe55 --- /dev/null +++ b/Marlin/src/libs/stopwatch.cpp @@ -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 . + * + */ + +#include "stopwatch.h" + +#include "../inc/MarlinConfig.h" + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +Stopwatch::State Stopwatch::state; +millis_t Stopwatch::accumulator; +millis_t Stopwatch::startTimestamp; +millis_t Stopwatch::stopTimestamp; + +bool Stopwatch::stop() { + Stopwatch::debug(PSTR("stop")); + + if (isRunning() || isPaused()) { + TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerStopped()); + state = STOPPED; + stopTimestamp = millis(); + return true; + } + else return false; +} + +bool Stopwatch::pause() { + Stopwatch::debug(PSTR("pause")); + + if (isRunning()) { + TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerPaused()); + state = PAUSED; + stopTimestamp = millis(); + return true; + } + else return false; +} + +bool Stopwatch::start() { + Stopwatch::debug(PSTR("start")); + + TERN_(EXTENSIBLE_UI, ExtUI::onPrintTimerStarted()); + + if (!isRunning()) { + if (isPaused()) accumulator = duration(); + else reset(); + + state = RUNNING; + startTimestamp = millis(); + return true; + } + else return false; +} + +void Stopwatch::resume(const millis_t with_time) { + Stopwatch::debug(PSTR("resume")); + + reset(); + if ((accumulator = with_time)) state = RUNNING; +} + +void Stopwatch::reset() { + Stopwatch::debug(PSTR("reset")); + + state = STOPPED; + startTimestamp = 0; + stopTimestamp = 0; + accumulator = 0; +} + +millis_t Stopwatch::duration() { + return accumulator + MS_TO_SEC((isRunning() ? millis() : stopTimestamp) - startTimestamp); +} + +#if ENABLED(DEBUG_STOPWATCH) + + void Stopwatch::debug(const char func[]) { + if (DEBUGGING(INFO)) { + SERIAL_ECHOPGM("Stopwatch::"); + serialprintPGM(func); + SERIAL_ECHOLNPGM("()"); + } + } + +#endif diff --git a/Marlin/src/libs/stopwatch.h b/Marlin/src/libs/stopwatch.h new file mode 100644 index 00000000..6e8e95a9 --- /dev/null +++ b/Marlin/src/libs/stopwatch.h @@ -0,0 +1,122 @@ +/** + * 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 + +// Print debug messages with M111 S2 (Uses 156 bytes of PROGMEM) +//#define DEBUG_STOPWATCH + +#include "../core/macros.h" // for FORCE_INLINE + +#include +typedef uint32_t millis_t; + +/** + * @brief Stopwatch class + * @details This class acts as a timer proving stopwatch functionality including + * the ability to pause the running time counter. + */ +class Stopwatch { + private: + enum State : char { STOPPED, RUNNING, PAUSED }; + + static Stopwatch::State state; + static millis_t accumulator; + static millis_t startTimestamp; + static millis_t stopTimestamp; + + public: + /** + * @brief Initialize the stopwatch + */ + FORCE_INLINE static void init() { reset(); } + + /** + * @brief Stop the stopwatch + * @details Stop the running timer, it will silently ignore the request if + * no timer is currently running. + * @return true on success + */ + static bool stop(); + + /** + * @brief Pause the stopwatch + * @details Pause the running timer, it will silently ignore the request if + * no timer is currently running. + * @return true on success + */ + static bool pause(); + + /** + * @brief Start the stopwatch + * @details Start the timer, it will silently ignore the request if the + * timer is already running. + * @return true on success + */ + static bool start(); + + /** + * @brief Resume the stopwatch + * @details Resume a timer from a given duration + */ + static void resume(const millis_t with_time); + + /** + * @brief Reset the stopwatch + * @details Reset all settings to their default values. + */ + static void reset(); + + /** + * @brief Check if the timer is running + * @details Return true if the timer is currently running, false otherwise. + * @return true if stopwatch is running + */ + FORCE_INLINE static bool isRunning() { return state == RUNNING; } + + /** + * @brief Check if the timer is paused + * @details Return true if the timer is currently paused, false otherwise. + * @return true if stopwatch is paused + */ + FORCE_INLINE static bool isPaused() { return state == PAUSED; } + + /** + * @brief Get the running time + * @details Return the total number of seconds the timer has been running. + * @return the delta since starting the stopwatch + */ + static millis_t duration(); + + #ifdef DEBUG_STOPWATCH + + /** + * @brief Print a debug message + * @details Print a simple debug message "Stopwatch::function" + */ + static void debug(const char func[]); + + #else + + static inline void debug(const char[]) {} + + #endif +}; diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp new file mode 100644 index 00000000..75a30aef --- /dev/null +++ b/Marlin/src/libs/vector_3.cpp @@ -0,0 +1,158 @@ +/** + * 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 . + * + */ + +/** + * vector_3.cpp - Vector library for bed leveling + * Copyright (c) 2012 Lars Brubaker. 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 + */ + +#include "../inc/MarlinConfig.h" + +#if ABL_PLANAR || ENABLED(AUTO_BED_LEVELING_UBL) + +#include "vector_3.h" + +#include + +/** + * vector_3 + */ + +vector_3 vector_3::cross(const vector_3 &left, const vector_3 &right) { + const xyz_float_t &lv = left, &rv = right; + return vector_3(lv.y * rv.z - lv.z * rv.y, // YZ cross + lv.z * rv.x - lv.x * rv.z, // ZX cross + lv.x * rv.y - lv.y * rv.x); // XY cross +} + +vector_3 vector_3::get_normal() const { + vector_3 normalized = *this; + normalized.normalize(); + return normalized; +} + +void vector_3::normalize() { + *this *= RSQRT(sq(x) + sq(y) + sq(z)); +} + +// Apply a rotation to the matrix +void vector_3::apply_rotation(const matrix_3x3 &matrix) { + const float _x = x, _y = y, _z = z; + *this = { matrix.vectors[0][0] * _x + matrix.vectors[1][0] * _y + matrix.vectors[2][0] * _z, + matrix.vectors[0][1] * _x + matrix.vectors[1][1] * _y + matrix.vectors[2][1] * _z, + matrix.vectors[0][2] * _x + matrix.vectors[1][2] * _y + matrix.vectors[2][2] * _z }; +} + +extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[]; + +void vector_3::debug(PGM_P const title) { + serialprintPGM(title); + SERIAL_ECHOPAIR_F_P(SP_X_STR, x, 6); + SERIAL_ECHOPAIR_F_P(SP_Y_STR, y, 6); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z, 6); +} + +/** + * matrix_3x3 + */ + +void apply_rotation_xyz(const matrix_3x3 &matrix, float &_x, float &_y, float &_z) { + vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(matrix); + _x = vec.x; _y = vec.y; _z = vec.z; +} + +// Reset to identity. No rotate or translate. +void matrix_3x3::set_to_identity() { + LOOP_L_N(i, 3) + LOOP_L_N(j, 3) + vectors[i][j] = float(i == j); +} + +// Create a matrix from 3 vector_3 inputs +matrix_3x3 matrix_3x3::create_from_rows(const vector_3 &row_0, const vector_3 &row_1, const vector_3 &row_2) { + //row_0.debug(PSTR("row_0")); + //row_1.debug(PSTR("row_1")); + //row_2.debug(PSTR("row_2")); + matrix_3x3 new_matrix; + new_matrix.vectors[0] = row_0; + new_matrix.vectors[1] = row_1; + new_matrix.vectors[2] = row_2; + //new_matrix.debug(PSTR("new_matrix")); + return new_matrix; +} + +// Create a matrix rotated to point towards a target +matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) { + const vector_3 z_row = target.get_normal(), + x_row = vector_3(1, 0, -target.x / target.z).get_normal(), + y_row = vector_3::cross(z_row, x_row).get_normal(); + + // x_row.debug(PSTR("x_row")); + // y_row.debug(PSTR("y_row")); + // z_row.debug(PSTR("z_row")); + + // create the matrix already correctly transposed + matrix_3x3 rot = matrix_3x3::create_from_rows(x_row, y_row, z_row); + + // rot.debug(PSTR("rot")); + return rot; +} + +// Get a transposed copy of the matrix +matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { + matrix_3x3 new_matrix; + LOOP_L_N(i, 3) + LOOP_L_N(j, 3) + new_matrix.vectors[i][j] = original.vectors[j][i]; + return new_matrix; +} + +void matrix_3x3::debug(PGM_P const title) { + if (title != nullptr) { + serialprintPGM(title); + SERIAL_EOL(); + } + LOOP_L_N(i, 3) { + LOOP_L_N(j, 3) { + if (vectors[i][j] >= 0.0) SERIAL_CHAR('+'); + SERIAL_ECHO_F(vectors[i][j], 6); + SERIAL_CHAR(' '); + } + SERIAL_EOL(); + } +} + +#endif // HAS_ABL_OR_UBL diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h new file mode 100644 index 00000000..58428314 --- /dev/null +++ b/Marlin/src/libs/vector_3.h @@ -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 . + * + */ +#pragma once + +/** + * vector_3.cpp - Vector library for bed leveling + * Copyright (c) 2012 Lars Brubaker. 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 + */ + +#include "../core/types.h" + +class matrix_3x3; + +struct vector_3 : xyz_float_t { + + vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } + vector_3(const xy_float_t &in) { set(in.x, in.y); } + vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } + vector_3(const xyze_float_t &in) { set(in.x, in.y, in.z); } + vector_3() { reset(); } + + // Factory method + static vector_3 cross(const vector_3 &a, const vector_3 &b); + + // Modifiers + void normalize(); + void apply_rotation(const matrix_3x3 &matrix); + + // Accessors + float get_length() const; + vector_3 get_normal() const; + + // Operators + FORCE_INLINE vector_3 operator+(const vector_3 &v) const { vector_3 o = *this; o += v; return o; } + FORCE_INLINE vector_3 operator-(const vector_3 &v) const { vector_3 o = *this; o -= v; return o; } + FORCE_INLINE vector_3 operator*(const float &v) const { vector_3 o = *this; o *= v; return o; } + + void debug(PGM_P const title); +}; + +struct matrix_3x3 { + abc_float_t vectors[3]; + + // Factory methods + static matrix_3x3 create_from_rows(const vector_3 &row_0, const vector_3 &row_1, const vector_3 &row_2); + static matrix_3x3 create_look_at(const vector_3 &target); + static matrix_3x3 transpose(const matrix_3x3 &original); + + void set_to_identity(); + + void debug(PGM_P const title); +}; + +void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, float &x, float &y, float &z); +FORCE_INLINE void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, xyz_pos_t &pos) { + apply_rotation_xyz(rotationMatrix, pos.x, pos.y, pos.z); +} diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp new file mode 100644 index 00000000..df6cae6e --- /dev/null +++ b/Marlin/src/module/delta.cpp @@ -0,0 +1,287 @@ +/** + * 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 . + * + */ + +/** + * delta.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(DELTA) + +#include "delta.h" +#include "motion.h" + +// For homing: +#include "planner.h" +#include "endstops.h" +#include "../lcd/ultralcd.h" +#include "../MarlinCore.h" + +#if HAS_BED_PROBE + #include "probe.h" +#endif + +#if ENABLED(SENSORLESS_HOMING) + #include "../feature/tmc_util.h" + #include "stepper/indirection.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../core/debug_out.h" + +// Initialized by settings.load() +float delta_height; +abc_float_t delta_endstop_adj{0}; +float delta_radius, + delta_diagonal_rod, + delta_segments_per_second; +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(); + +/** + * Recalculate factors used for delta kinematics whenever + * settings have been changed (e.g., by M665). + */ +void recalc_delta_settings() { + 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 + 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(); +} + +/** + * Get a safe radius for calibration + */ + +#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) + + #if ENABLED(DELTA_AUTO_CALIBRATION) + float calibration_radius_factor = 1; + #endif + + float delta_calibration_radius() { + return calibration_radius_factor * ( + #if HAS_BED_PROBE + FLOOR((DELTA_PRINTABLE_RADIUS) - _MAX(HYPOT(probe.offset_xy.x, probe.offset_xy.y), PROBING_MARGIN)) + #else + DELTA_PRINTABLE_RADIUS + #endif + ); + } + +#endif + +/** + * Delta Inverse Kinematics + * + * Calculate the tower positions for a given machine + * position, storing the result in the delta[] array. + * + * This is an expensive calculation, requiring 3 square + * roots per segmented linear move, and strains the limits + * of a Mega2560 with a Graphical Display. + * + * Suggested optimizations include: + * + * - Disable the home_offset (M206) and/or position_shift (G92) + * features to remove up to 12 float additions. + */ + +#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_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) { + #if HAS_HOTEND_OFFSET + // Delta hotend offsets must be applied in Cartesian space with no "spoofing" + xyz_pos_t pos = { raw.x - hotend_offset[active_extruder].x, + raw.y - hotend_offset[active_extruder].y, + raw.z }; + DELTA_IK(pos); + //DELTA_DEBUG(pos); + #else + DELTA_IK(raw); + //DELTA_DEBUG(raw); + #endif +} + +/** + * Calculate the highest Z position where the + * effector has the full range of XY motion. + */ +float delta_safe_distance_from_top() { + xyz_pos_t cartesian{0}; + inverse_kinematics(cartesian); + const float centered_extent = delta.a; + cartesian.y = DELTA_PRINTABLE_RADIUS; + inverse_kinematics(cartesian); + return ABS(centered_extent - delta.a); +} + +/** + * Delta Forward Kinematics + * + * See the Wikipedia article "Trilateration" + * https://en.wikipedia.org/wiki/Trilateration + * + * Establish a new coordinate system in the plane of the + * three carriage points. This system has its origin at + * tower1, with tower2 on the X axis. Tower3 is in the X-Y + * plane with a Z component of zero. + * We will define unit vectors in this coordinate system + * in our original coordinate system. Then when we calculate + * the Xnew, Ynew and Znew values, we can translate back into + * the original system by moving along those unit vectors + * by the corresponding values. + * + * Variable names matched to Marlin, c-version, and avoid the + * use of any vector library. + * + * by Andreas Hardtung 2016-06-07 + * based on a Java function from "Delta Robot Kinematics V3" + * by Steve Graves + * + * The result is stored in the cartes[] array. + */ +void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) { + // Create a vector in old coordinates along x axis of new coordinate + const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, + + // Get the reciprocal of Magnitude of vector. + d2 = sq(p12[0]) + sq(p12[1]) + sq(p12[2]), inv_d = RSQRT(d2), + + // Create unit vector by multiplying by the inverse of the magnitude. + ex[3] = { p12[0] * inv_d, p12[1] * inv_d, p12[2] * inv_d }, + + // Get the vector from the origin of the new system to the third point. + p13[3] = { delta_tower[C_AXIS].x - delta_tower[A_AXIS].x, delta_tower[C_AXIS].y - delta_tower[A_AXIS].y, z3 - z1 }, + + // Use the dot product to find the component of this vector on the X axis. + i = ex[0] * p13[0] + ex[1] * p13[1] + ex[2] * p13[2], + + // Create a vector along the x axis that represents the x component of p13. + iex[3] = { ex[0] * i, ex[1] * i, ex[2] * i }; + + // Subtract the X component from the original vector leaving only Y. We use the + // variable that will be the unit vector after we scale it. + float ey[3] = { p13[0] - iex[0], p13[1] - iex[1], p13[2] - iex[2] }; + + // The magnitude and the inverse of the magnitude of Y component + const float j2 = sq(ey[0]) + sq(ey[1]) + sq(ey[2]), inv_j = RSQRT(j2); + + // Convert to a unit vector + ey[0] *= inv_j; ey[1] *= inv_j; ey[2] *= inv_j; + + // The cross product of the unit x and y is the unit z + // float[] ez = vectorCrossProd(ex, ey); + const float ez[3] = { + ex[1] * ey[2] - ex[2] * ey[1], + ex[2] * ey[0] - ex[0] * ey[2], + ex[0] * ey[1] - ex[1] * ey[0] + }, + + // We now have the d, i and j values defined in Wikipedia. + // Plug them into the equations defined in Wikipedia for Xnew, Ynew and Znew + Xnew = (delta_diagonal_rod_2_tower.a - delta_diagonal_rod_2_tower.b + d2) * inv_d * 0.5, + Ynew = ((delta_diagonal_rod_2_tower.a - delta_diagonal_rod_2_tower.c + sq(i) + j2) * 0.5 - i * Xnew) * inv_j, + Znew = SQRT(delta_diagonal_rod_2_tower.a - HYPOT2(Xnew, Ynew)); + + // Start from the origin of the old coordinates and add vectors in the + // old coords that represent the Xnew, Ynew and Znew to find the point + // in the old system. + cartes.set(delta_tower[A_AXIS].x + ex[0] * Xnew + ey[0] * Ynew - ez[0] * Znew, + delta_tower[A_AXIS].y + ex[1] * Xnew + ey[1] * Ynew - ez[1] * Znew, + z1 + ex[2] * Xnew + ey[2] * Ynew - ez[2] * Znew); +} + +/** + * A delta can only safely home all axes at the same time + * This is like quick_home_xy() but for 3 towers. + */ +void home_delta() { + 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(); + sync_plan_position(); + + // Disable stealthChop if used. Enable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + 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. + current_position.z = (delta_height + 10 - TERN0(HAS_BED_PROBE, probe.offset.z)); + line_to_current_position(homing_feedrate(Z_AXIS)); + planner.synchronize(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + 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(); + + // At least one carriage has reached the top. + // Now re-home each carriage separately. + homeaxis(A_AXIS); + homeaxis(B_AXIS); + homeaxis(C_AXIS); + + // Set all carriages to their home positions + // Do this here all at once for Delta, because + // XYZ isn't ABC. Applying this per-tower would + // give the impression that they are the same. + LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); + + sync_plan_position(); + + #if DISABLED(DELTA_HOME_TO_SAFE_ZONE) && defined(HOMING_BACKOFF_POST_MM) + constexpr xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; + if (endstop_backoff.z) { + current_position.z -= ABS(endstop_backoff.z) * Z_HOME_DIR; + line_to_current_position(homing_feedrate(Z_AXIS)); + } + #endif +} + +#endif // DELTA diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h new file mode 100644 index 00000000..5e9a78bd --- /dev/null +++ b/Marlin/src/module/delta.h @@ -0,0 +1,129 @@ +/** + * 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 + +/** + * delta.h - Delta-specific functions + */ + +#include "../core/types.h" +#include "../core/macros.h" + +extern float delta_height; +extern abc_float_t delta_endstop_adj; +extern float delta_radius, + delta_diagonal_rod, + delta_segments_per_second; +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 + * settings have been changed (e.g., by M665). + */ +void recalc_delta_settings(); + +/** + * Get a safe radius for calibration + */ +#if ENABLED(DELTA_AUTO_CALIBRATION) + extern float calibration_radius_factor; +#else + constexpr float calibration_radius_factor = 1; +#endif + +#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) + float delta_calibration_radius(); +#endif + +/** + * Delta Inverse Kinematics + * + * Calculate the tower positions for a given machine + * position, storing the result in the delta[] array. + * + * This is an expensive calculation, requiring 3 square + * roots per segmented linear move, and strains the limits + * of a Mega2560 with a Graphical Display. + * + * Suggested optimizations include: + * + * - Disable the home_offset (M206) and/or position_shift (G92) + * features to remove up to 12 float additions. + * + * - Use a fast-inverse-sqrt function and add the reciprocal. + * (see above) + */ + +// Macro to obtain the Z position of an individual tower +#define DELTA_Z(V,T) V.z + SQRT( \ + delta_diagonal_rod_2_tower[T] - HYPOT2( \ + delta_tower[T].x - V.x, \ + delta_tower[T].y - V.y \ + ) \ + ) + +#define DELTA_IK(V) delta.set(DELTA_Z(V, A_AXIS), DELTA_Z(V, B_AXIS), DELTA_Z(V, C_AXIS)) + +void inverse_kinematics(const xyz_pos_t &raw); + +/** + * Calculate the highest Z position where the + * effector has the full range of XY motion. + */ +float delta_safe_distance_from_top(); + +/** + * Delta Forward Kinematics + * + * See the Wikipedia article "Trilateration" + * https://en.wikipedia.org/wiki/Trilateration + * + * Establish a new coordinate system in the plane of the + * three carriage points. This system has its origin at + * tower1, with tower2 on the X axis. Tower3 is in the X-Y + * plane with a Z component of zero. + * We will define unit vectors in this coordinate system + * in our original coordinate system. Then when we calculate + * the Xnew, Ynew and Znew values, we can translate back into + * the original system by moving along those unit vectors + * by the corresponding values. + * + * Variable names matched to Marlin, c-version, and avoid the + * use of any vector library. + * + * by Andreas Hardtung 2016-06-07 + * based on a Java function from "Delta Robot Kinematics V3" + * by Steve Graves + * + * The result is stored in the cartes[] array. + */ +void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3); + +FORCE_INLINE void forward_kinematics_DELTA(const abc_float_t &point) { + forward_kinematics_DELTA(point.a, point.b, point.c); +} + +void home_delta(); diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp new file mode 100644 index 00000000..712182a0 --- /dev/null +++ b/Marlin/src/module/endstops.cpp @@ -0,0 +1,1048 @@ +/** + * 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 . + * + */ + +/** + * endstops.cpp - A singleton object to manage endstops + */ + +#include "endstops.h" +#include "stepper.h" + +#include "../MarlinCore.h" +#include "../sd/cardreader.h" +#include "temperature.h" +#include "../lcd/ultralcd.h" + +#if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) + #include HAL_PATH(../HAL, endstop_interrupts.h) +#endif + +#if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) + #include "printcounter.h" // for print_job_timer +#endif + +#if ENABLED(BLTOUCH) + #include "../feature/bltouch.h" +#endif + +#if ENABLED(JOYSTICK) + #include "../feature/joystick.h" +#endif + +Endstops endstops; + +// private: + +bool Endstops::enabled, Endstops::enabled_globally; // Initialized by settings.load() +volatile uint8_t Endstops::hit_state; + +Endstops::esbits_t Endstops::live_state = 0; + +#if ENDSTOP_NOISE_THRESHOLD + Endstops::esbits_t Endstops::validated_live_state; + uint8_t Endstops::endstop_poll_count; +#endif + +#if HAS_BED_PROBE + volatile bool Endstops::z_probe_enabled = false; +#endif + +// Initialized by settings.load() +#if ENABLED(X_DUAL_ENDSTOPS) + float Endstops::x2_endstop_adj; +#endif +#if ENABLED(Y_DUAL_ENDSTOPS) + float Endstops::y2_endstop_adj; +#endif +#if ENABLED(Z_MULTI_ENDSTOPS) + float Endstops::z2_endstop_adj; + #if NUM_Z_STEPPER_DRIVERS >= 3 + float Endstops::z3_endstop_adj; + #if NUM_Z_STEPPER_DRIVERS >= 4 + float Endstops::z4_endstop_adj; + #endif + #endif +#endif + +#if ENABLED(SPI_ENDSTOPS) + Endstops::tmc_spi_homing_t Endstops::tmc_spi_homing; // = 0 +#endif +#if ENABLED(IMPROVE_HOMING_RELIABILITY) + millis_t sg_guard_period; // = 0 +#endif + +/** + * Class and Instance Methods + */ + +void Endstops::init() { + + #if HAS_X_MIN + #if ENABLED(ENDSTOPPULLUP_XMIN) + SET_INPUT_PULLUP(X_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMIN) + SET_INPUT_PULLDOWN(X_MIN_PIN); + #else + SET_INPUT(X_MIN_PIN); + #endif + #endif + + #if HAS_X2_MIN + #if ENABLED(ENDSTOPPULLUP_XMIN) + SET_INPUT_PULLUP(X2_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMIN) + SET_INPUT_PULLDOWN(X2_MIN_PIN); + #else + SET_INPUT(X2_MIN_PIN); + #endif + #endif + + #if HAS_Y_MIN + #if ENABLED(ENDSTOPPULLUP_YMIN) + SET_INPUT_PULLUP(Y_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMIN) + SET_INPUT_PULLDOWN(Y_MIN_PIN); + #else + SET_INPUT(Y_MIN_PIN); + #endif + #endif + + #if HAS_Y2_MIN + #if ENABLED(ENDSTOPPULLUP_YMIN) + SET_INPUT_PULLUP(Y2_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMIN) + SET_INPUT_PULLDOWN(Y2_MIN_PIN); + #else + SET_INPUT(Y2_MIN_PIN); + #endif + #endif + + #if HAS_Z_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z_MIN_PIN); + #else + SET_INPUT(Z_MIN_PIN); + #endif + #endif + + #if HAS_Z2_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z2_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z2_MIN_PIN); + #else + SET_INPUT(Z2_MIN_PIN); + #endif + #endif + + #if HAS_Z3_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z3_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z3_MIN_PIN); + #else + SET_INPUT(Z3_MIN_PIN); + #endif + #endif + + #if HAS_Z4_MIN + #if ENABLED(ENDSTOPPULLUP_ZMIN) + SET_INPUT_PULLUP(Z4_MIN_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN) + SET_INPUT_PULLDOWN(Z4_MIN_PIN); + #else + SET_INPUT(Z4_MIN_PIN); + #endif + #endif + + #if HAS_X_MAX + #if ENABLED(ENDSTOPPULLUP_XMAX) + SET_INPUT_PULLUP(X_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMAX) + SET_INPUT_PULLDOWN(X_MAX_PIN); + #else + SET_INPUT(X_MAX_PIN); + #endif + #endif + + #if HAS_X2_MAX + #if ENABLED(ENDSTOPPULLUP_XMAX) + SET_INPUT_PULLUP(X2_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_XMAX) + SET_INPUT_PULLDOWN(X2_MAX_PIN); + #else + SET_INPUT(X2_MAX_PIN); + #endif + #endif + + #if HAS_Y_MAX + #if ENABLED(ENDSTOPPULLUP_YMAX) + SET_INPUT_PULLUP(Y_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMAX) + SET_INPUT_PULLDOWN(Y_MAX_PIN); + #else + SET_INPUT(Y_MAX_PIN); + #endif + #endif + + #if HAS_Y2_MAX + #if ENABLED(ENDSTOPPULLUP_YMAX) + SET_INPUT_PULLUP(Y2_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_YMAX) + SET_INPUT_PULLDOWN(Y2_MAX_PIN); + #else + SET_INPUT(Y2_MAX_PIN); + #endif + #endif + + #if HAS_Z_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z_MAX_PIN); + #else + SET_INPUT(Z_MAX_PIN); + #endif + #endif + + #if HAS_Z2_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z2_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z2_MAX_PIN); + #else + SET_INPUT(Z2_MAX_PIN); + #endif + #endif + + #if HAS_Z3_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z3_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z3_MAX_PIN); + #else + SET_INPUT(Z3_MAX_PIN); + #endif + #endif + + #if HAS_Z4_MAX + #if ENABLED(ENDSTOPPULLUP_ZMAX) + SET_INPUT_PULLUP(Z4_MAX_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMAX) + SET_INPUT_PULLDOWN(Z4_MAX_PIN); + #else + SET_INPUT(Z4_MAX_PIN); + #endif + #endif + + #if PIN_EXISTS(CALIBRATION) + #if ENABLED(CALIBRATION_PIN_PULLUP) + SET_INPUT_PULLUP(CALIBRATION_PIN); + #elif ENABLED(CALIBRATION_PIN_PULLDOWN) + SET_INPUT_PULLDOWN(CALIBRATION_PIN); + #else + SET_INPUT(CALIBRATION_PIN); + #endif + #endif + + #if HAS_CUSTOM_PROBE_PIN + #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) + SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); + #elif ENABLED(ENDSTOPPULLDOWN_ZMIN_PROBE) + SET_INPUT_PULLDOWN(Z_MIN_PROBE_PIN); + #else + SET_INPUT(Z_MIN_PROBE_PIN); + #endif + #endif + + TERN_(ENDSTOP_INTERRUPTS_FEATURE, setup_endstop_interrupts()); + + // Enable endstops + enable_globally(ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)); + +} // Endstops::init + +// Called at ~1KHz from Temperature ISR: Poll endstop state if required +void Endstops::poll() { + + TERN_(PINS_DEBUGGING, run_monitor()); // Report changes in endstop status + + #if DISABLED(ENDSTOP_INTERRUPTS_FEATURE) + update(); + #elif ENDSTOP_NOISE_THRESHOLD + if (endstop_poll_count) update(); + #endif +} + +void Endstops::enable_globally(const bool onoff) { + enabled_globally = enabled = onoff; + resync(); +} + +// Enable / disable endstop checking +void Endstops::enable(const bool onoff) { + enabled = onoff; + resync(); +} + +// Disable / Enable endstops based on ENSTOPS_ONLY_FOR_HOMING and global enable +void Endstops::not_homing() { + enabled = enabled_globally; +} + +#if ENABLED(VALIDATE_HOMING_ENDSTOPS) + // If the last move failed to trigger an endstop, call kill + void Endstops::validate_homing_move() { + if (trigger_state()) hit_on_purpose(); + else kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); + } +#endif + +// Enable / disable endstop z-probe checking +#if HAS_BED_PROBE + void Endstops::enable_z_probe(const bool onoff) { + z_probe_enabled = onoff; + resync(); + } +#endif + +// Get the stable endstop states when enabled +void Endstops::resync() { + if (!abort_enabled()) return; // If endstops/probes are disabled the loop below can hang + + // Wait for Temperature ISR to run at least once (runs at 1KHz) + TERN(ENDSTOP_INTERRUPTS_FEATURE, update(), safe_delay(2)); + while (TERN0(ENDSTOP_NOISE_THRESHOLD, endstop_poll_count)) safe_delay(1); +} + +#if ENABLED(PINS_DEBUGGING) + void Endstops::run_monitor() { + if (!monitor_flag) return; + static uint8_t monitor_count = 16; // offset this check from the others + monitor_count += _BV(1); // 15 Hz + monitor_count &= 0x7F; + if (!monitor_count) monitor(); // report changes in endstop status + } +#endif + +void Endstops::event_handler() { + static uint8_t prev_hit_state; // = 0 + if (hit_state == prev_hit_state) return; + prev_hit_state = hit_state; + if (hit_state) { + #if HAS_WIRED_LCD + char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; + #define _SET_STOP_CHAR(A,C) (chr## A = C) + #else + #define _SET_STOP_CHAR(A,C) ; + #endif + + #define _ENDSTOP_HIT_ECHO(A,C) do{ \ + SERIAL_ECHOPAIR(" " STRINGIFY(A) ":", planner.triggered_position_mm(_AXIS(A))); \ + _SET_STOP_CHAR(A,C); }while(0) + + #define _ENDSTOP_HIT_TEST(A,C) \ + if (TEST(hit_state, A ##_MIN) || TEST(hit_state, A ##_MAX)) \ + _ENDSTOP_HIT_ECHO(A,C) + + #define ENDSTOP_HIT_TEST_X() _ENDSTOP_HIT_TEST(X,'X') + #define ENDSTOP_HIT_TEST_Y() _ENDSTOP_HIT_TEST(Y,'Y') + #define ENDSTOP_HIT_TEST_Z() _ENDSTOP_HIT_TEST(Z,'Z') + + SERIAL_ECHO_START(); + SERIAL_ECHOPGM(STR_ENDSTOPS_HIT); + ENDSTOP_HIT_TEST_X(); + ENDSTOP_HIT_TEST_Y(); + ENDSTOP_HIT_TEST_Z(); + + #if HAS_CUSTOM_PROBE_PIN + #define P_AXIS Z_AXIS + if (TEST(hit_state, Z_MIN_PROBE)) _ENDSTOP_HIT_ECHO(P, 'P'); + #endif + SERIAL_EOL(); + + TERN_(HAS_WIRED_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); + + #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) + if (planner.abort_on_endstop_hit) { + card.endFilePrint(); + quickstop_stepper(); + thermalManager.disable_all_heaters(); + print_job_timer.stop(); + } + #endif + } +} + +static void print_es_state(const bool is_hit, PGM_P const label=nullptr) { + if (label) serialprintPGM(label); + SERIAL_ECHOPGM(": "); + serialprintPGM(is_hit ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN)); + SERIAL_EOL(); +} + +void _O2 Endstops::report_states() { + TERN_(BLTOUCH, bltouch._set_SW_mode()); + SERIAL_ECHOLNPGM(STR_M119_REPORT); + #define ES_REPORT(S) print_es_state(READ(S##_PIN) != S##_ENDSTOP_INVERTING, PSTR(STR_##S)) + #if HAS_X_MIN + ES_REPORT(X_MIN); + #endif + #if HAS_X2_MIN + ES_REPORT(X2_MIN); + #endif + #if HAS_X_MAX + ES_REPORT(X_MAX); + #endif + #if HAS_X2_MAX + ES_REPORT(X2_MAX); + #endif + #if HAS_Y_MIN + ES_REPORT(Y_MIN); + #endif + #if HAS_Y2_MIN + ES_REPORT(Y2_MIN); + #endif + #if HAS_Y_MAX + ES_REPORT(Y_MAX); + #endif + #if HAS_Y2_MAX + ES_REPORT(Y2_MAX); + #endif + #if HAS_Z_MIN + ES_REPORT(Z_MIN); + #endif + #if HAS_Z2_MIN + ES_REPORT(Z2_MIN); + #endif + #if HAS_Z3_MIN + ES_REPORT(Z3_MIN); + #endif + #if HAS_Z4_MIN + ES_REPORT(Z4_MIN); + #endif + #if HAS_Z_MAX + ES_REPORT(Z_MAX); + #endif + #if HAS_Z2_MAX + ES_REPORT(Z2_MAX); + #endif + #if HAS_Z3_MAX + ES_REPORT(Z3_MAX); + #endif + #if HAS_Z4_MAX + ES_REPORT(Z4_MAX); + #endif + #if HAS_CUSTOM_PROBE_PIN + print_es_state(READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING, PSTR(STR_Z_PROBE)); + #endif + #if HAS_FILAMENT_SENSOR + #if NUM_RUNOUT_SENSORS == 1 + 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) { + pin_t pin; + switch (i) { + default: continue; + REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) + } + SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); + if (i > 1) SERIAL_CHAR(' ', '0' + i); + print_es_state(extDigitalRead(pin) != FIL_RUNOUT_STATE); + } + #undef _CASE_RUNOUT + #endif + #endif + + TERN_(BLTOUCH, bltouch._reset_SW_mode()); + TERN_(JOYSTICK_DEBUG, joystick.report()); + +} // Endstops::report_states + +// The following routines are called from an ISR context. It could be the temperature ISR, the +// endstop ISR or the Stepper ISR. + +#define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX +#define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN +#define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING + +// Check endstops - Could be called from Temperature ISR! +void Endstops::update() { + + #if !ENDSTOP_NOISE_THRESHOLD + if (!abort_enabled()) return; + #endif + + #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) && 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 + + // With Dual X, endstops are only checked in the homing direction for the active extruder + #if ENABLED(DUAL_X_CARRIAGE) + #define E0_ACTIVE stepper.last_moved_extruder == 0 + #define X_MIN_TEST() ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) + #define X_MAX_TEST() ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) + #else + #define X_MIN_TEST() true + #define X_MAX_TEST() true + #endif + + // Use HEAD for core axes, AXIS for others + #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 ANY(CORE_IS_XY, CORE_IS_YZ, MARKFORGED_XY) + #define Y_AXIS_HEAD Y_HEAD + #else + #define Y_AXIS_HEAD Y_AXIS + #endif + #if CORE_IS_XZ || CORE_IS_YZ + #define Z_AXIS_HEAD Z_HEAD + #else + #define Z_AXIS_HEAD Z_AXIS + #endif + + /** + * Check and update endstops + */ + #if HAS_X_MIN && !X_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(X, MIN); + #if ENABLED(X_DUAL_ENDSTOPS) + #if HAS_X2_MIN + UPDATE_ENDSTOP_BIT(X2, MIN); + #else + COPY_LIVE_STATE(X_MIN, X2_MIN); + #endif + #endif + #endif + + #if HAS_X_MAX && !X_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(X, MAX); + #if ENABLED(X_DUAL_ENDSTOPS) + #if HAS_X2_MAX + UPDATE_ENDSTOP_BIT(X2, MAX); + #else + COPY_LIVE_STATE(X_MAX, X2_MAX); + #endif + #endif + #endif + + #if HAS_Y_MIN && !Y_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(Y, MIN); + #if ENABLED(Y_DUAL_ENDSTOPS) + #if HAS_Y2_MIN + UPDATE_ENDSTOP_BIT(Y2, MIN); + #else + COPY_LIVE_STATE(Y_MIN, Y2_MIN); + #endif + #endif + #endif + + #if HAS_Y_MAX && !Y_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(Y, MAX); + #if ENABLED(Y_DUAL_ENDSTOPS) + #if HAS_Y2_MAX + UPDATE_ENDSTOP_BIT(Y2, MAX); + #else + COPY_LIVE_STATE(Y_MAX, Y2_MAX); + #endif + #endif + #endif + + #if HAS_Z_MIN && !Z_SPI_SENSORLESS + UPDATE_ENDSTOP_BIT(Z, MIN); + #if ENABLED(Z_MULTI_ENDSTOPS) + #if HAS_Z2_MIN + UPDATE_ENDSTOP_BIT(Z2, MIN); + #else + COPY_LIVE_STATE(Z_MIN, Z2_MIN); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 + #if HAS_Z3_MIN + UPDATE_ENDSTOP_BIT(Z3, MIN); + #else + COPY_LIVE_STATE(Z_MIN, Z3_MIN); + #endif + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + #if HAS_Z4_MIN + UPDATE_ENDSTOP_BIT(Z4, MIN); + #else + COPY_LIVE_STATE(Z_MIN, Z4_MIN); + #endif + #endif + #endif + #endif + + // When closing the gap check the enabled probe + #if HAS_CUSTOM_PROBE_PIN + UPDATE_ENDSTOP_BIT(Z, MIN_PROBE); + #endif + + #if HAS_Z_MAX && !Z_SPI_SENSORLESS + // Check both Z dual endstops + #if ENABLED(Z_MULTI_ENDSTOPS) + UPDATE_ENDSTOP_BIT(Z, MAX); + #if HAS_Z2_MAX + UPDATE_ENDSTOP_BIT(Z2, MAX); + #else + COPY_LIVE_STATE(Z_MAX, Z2_MAX); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 + #if HAS_Z3_MAX + UPDATE_ENDSTOP_BIT(Z3, MAX); + #else + COPY_LIVE_STATE(Z_MAX, Z3_MAX); + #endif + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + #if HAS_Z4_MAX + UPDATE_ENDSTOP_BIT(Z4, MAX); + #else + COPY_LIVE_STATE(Z_MAX, Z4_MAX); + #endif + #endif + #elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN + // If this pin isn't the bed probe it's the Z endstop + UPDATE_ENDSTOP_BIT(Z, MAX); + #endif + #endif + + #if ENDSTOP_NOISE_THRESHOLD + + /** + * Filtering out noise on endstops requires a delayed decision. Let's assume, due to noise, + * that 50% of endstop signal samples are good and 50% are bad (assuming normal distribution + * of random noise). Then the first sample has a 50% chance to be good or bad. The 2nd sample + * also has a 50% chance to be good or bad. The chances of 2 samples both being bad becomes + * 50% of 50%, or 25%. That was the previous implementation of Marlin endstop handling. It + * reduces chances of bad readings in half, at the cost of 1 extra sample period, but chances + * still exist. The only way to reduce them further is to increase the number of samples. + * To reduce the chance to 1% (1/128th) requires 7 samples (adding 7ms of delay). + */ + static esbits_t old_live_state; + if (old_live_state != live_state) { + endstop_poll_count = ENDSTOP_NOISE_THRESHOLD; + old_live_state = live_state; + } + else if (endstop_poll_count && !--endstop_poll_count) + validated_live_state = live_state; + + if (!abort_enabled()) return; + + #endif + + // Test the current status of an endstop + #define TEST_ENDSTOP(ENDSTOP) (TEST(state(), ENDSTOP)) + + // Record endstop was hit + #define _ENDSTOP_HIT(AXIS, MINMAX) SBI(hit_state, _ENDSTOP(AXIS, MINMAX)) + + // Call the endstop triggered routine for single endstops + #define PROCESS_ENDSTOP(AXIS, MINMAX) do { \ + if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX))) { \ + _ENDSTOP_HIT(AXIS, MINMAX); \ + planner.endstop_triggered(_AXIS(AXIS)); \ + } \ + }while(0) + + // Core Sensorless Homing needs to test an Extra Pin + #define CORE_DIAG(QQ,A,MM) (CORE_IS_##QQ && A##_SENSORLESS && !A##_SPI_SENSORLESS && HAS_##A##_##MM) + #define PROCESS_CORE_ENDSTOP(A1,M1,A2,M2) do { \ + if (TEST_ENDSTOP(_ENDSTOP(A1,M1))) { \ + _ENDSTOP_HIT(A2,M2); \ + planner.endstop_triggered(_AXIS(A2)); \ + } \ + }while(0) + + // Call the endstop triggered routine for dual endstops + #define PROCESS_DUAL_ENDSTOP(A, MINMAX) do { \ + const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1); \ + if (dual_hit) { \ + _ENDSTOP_HIT(A, MINMAX); \ + /* if not performing home or if both endstops were trigged during homing... */ \ + if (!stepper.separate_multi_axis || dual_hit == 0b11) \ + planner.endstop_triggered(_AXIS(A)); \ + } \ + }while(0) + + #define PROCESS_TRIPLE_ENDSTOP(A, MINMAX) do { \ + const byte triple_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(A##3, MINMAX)) << 2); \ + if (triple_hit) { \ + _ENDSTOP_HIT(A, MINMAX); \ + /* if not performing home or if both endstops were trigged during homing... */ \ + if (!stepper.separate_multi_axis || triple_hit == 0b111) \ + planner.endstop_triggered(_AXIS(A)); \ + } \ + }while(0) + + #define PROCESS_QUAD_ENDSTOP(A, MINMAX) do { \ + const byte quad_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(A##3, MINMAX)) << 2) | (TEST_ENDSTOP(_ENDSTOP(A##4, MINMAX)) << 3); \ + if (quad_hit) { \ + _ENDSTOP_HIT(A, MINMAX); \ + /* if not performing home or if both endstops were trigged during homing... */ \ + if (!stepper.separate_multi_axis || quad_hit == 0b1111) \ + planner.endstop_triggered(_AXIS(A)); \ + } \ + }while(0) + + #if ENABLED(X_DUAL_ENDSTOPS) + #define PROCESS_ENDSTOP_X(MINMAX) PROCESS_DUAL_ENDSTOP(X, MINMAX) + #else + #define PROCESS_ENDSTOP_X(MINMAX) if (X_##MINMAX##_TEST()) PROCESS_ENDSTOP(X, MINMAX) + #endif + + #if ENABLED(Y_DUAL_ENDSTOPS) + #define PROCESS_ENDSTOP_Y(MINMAX) PROCESS_DUAL_ENDSTOP(Y, MINMAX) + #else + #define PROCESS_ENDSTOP_Y(MINMAX) PROCESS_ENDSTOP(Y, MINMAX) + #endif + + #if DISABLED(Z_MULTI_ENDSTOPS) + #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_ENDSTOP(Z, MINMAX) + #elif NUM_Z_STEPPER_DRIVERS == 4 + #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_QUAD_ENDSTOP(Z, MINMAX) + #elif NUM_Z_STEPPER_DRIVERS == 3 + #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_TRIPLE_ENDSTOP(Z, MINMAX) + #else + #define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_DUAL_ENDSTOP(Z, MINMAX) + #endif + + #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 + #define _G38_OPEN_STATE LOW + #endif + // If G38 command is active check Z_MIN_PROBE for ALL movement + if (G38_move && TEST_ENDSTOP(_ENDSTOP(Z, MIN_PROBE)) != _G38_OPEN_STATE) { + if (stepper.axis_is_moving(X_AXIS)) { _ENDSTOP_HIT(X, MIN); planner.endstop_triggered(X_AXIS); } + else if (stepper.axis_is_moving(Y_AXIS)) { _ENDSTOP_HIT(Y, MIN); planner.endstop_triggered(Y_AXIS); } + else if (stepper.axis_is_moving(Z_AXIS)) { _ENDSTOP_HIT(Z, MIN); planner.endstop_triggered(Z_AXIS); } + G38_did_trigger = true; + } + #endif + + // Signal, after validation, if an endstop limit is pressed or not + + if (stepper.axis_is_moving(X_AXIS)) { + if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction + #if HAS_X_MIN || (X_SPI_SENSORLESS && X_HOME_DIR < 0) + PROCESS_ENDSTOP_X(MIN); + #if CORE_DIAG(XY, Y, MIN) + PROCESS_CORE_ENDSTOP(Y,MIN,X,MIN); + #elif CORE_DIAG(XY, Y, MAX) + PROCESS_CORE_ENDSTOP(Y,MAX,X,MIN); + #elif CORE_DIAG(XZ, Z, MIN) + PROCESS_CORE_ENDSTOP(Z,MIN,X,MIN); + #elif CORE_DIAG(XZ, Z, MAX) + PROCESS_CORE_ENDSTOP(Z,MAX,X,MIN); + #endif + #endif + } + else { // +direction + #if HAS_X_MAX || (X_SPI_SENSORLESS && X_HOME_DIR > 0) + PROCESS_ENDSTOP_X(MAX); + #if CORE_DIAG(XY, Y, MIN) + PROCESS_CORE_ENDSTOP(Y,MIN,X,MAX); + #elif CORE_DIAG(XY, Y, MAX) + PROCESS_CORE_ENDSTOP(Y,MAX,X,MAX); + #elif CORE_DIAG(XZ, Z, MIN) + PROCESS_CORE_ENDSTOP(Z,MIN,X,MAX); + #elif CORE_DIAG(XZ, Z, MAX) + PROCESS_CORE_ENDSTOP(Z,MAX,X,MAX); + #endif + #endif + } + } + + if (stepper.axis_is_moving(Y_AXIS)) { + if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction + #if HAS_Y_MIN || (Y_SPI_SENSORLESS && Y_HOME_DIR < 0) + PROCESS_ENDSTOP_Y(MIN); + #if CORE_DIAG(XY, X, MIN) + PROCESS_CORE_ENDSTOP(X,MIN,Y,MIN); + #elif CORE_DIAG(XY, X, MAX) + PROCESS_CORE_ENDSTOP(X,MAX,Y,MIN); + #elif CORE_DIAG(YZ, Z, MIN) + PROCESS_CORE_ENDSTOP(Z,MIN,Y,MIN); + #elif CORE_DIAG(YZ, Z, MAX) + PROCESS_CORE_ENDSTOP(Z,MAX,Y,MIN); + #endif + #endif + } + else { // +direction + #if HAS_Y_MAX || (Y_SPI_SENSORLESS && Y_HOME_DIR > 0) + PROCESS_ENDSTOP_Y(MAX); + #if CORE_DIAG(XY, X, MIN) + PROCESS_CORE_ENDSTOP(X,MIN,Y,MAX); + #elif CORE_DIAG(XY, X, MAX) + PROCESS_CORE_ENDSTOP(X,MAX,Y,MAX); + #elif CORE_DIAG(YZ, Z, MIN) + PROCESS_CORE_ENDSTOP(Z,MIN,Y,MAX); + #elif CORE_DIAG(YZ, Z, MAX) + PROCESS_CORE_ENDSTOP(Z,MAX,Y,MAX); + #endif + #endif + } + } + + if (stepper.axis_is_moving(Z_AXIS)) { + if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. + + #if HAS_Z_MIN || (Z_SPI_SENSORLESS && Z_HOME_DIR < 0) + if ( TERN1(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, z_probe_enabled) + && TERN1(HAS_CUSTOM_PROBE_PIN, !z_probe_enabled) + ) PROCESS_ENDSTOP_Z(MIN); + #if CORE_DIAG(XZ, X, MIN) + PROCESS_CORE_ENDSTOP(X,MIN,Z,MIN); + #elif CORE_DIAG(XZ, X, MAX) + PROCESS_CORE_ENDSTOP(X,MAX,Z,MIN); + #elif CORE_DIAG(YZ, Y, MIN) + PROCESS_CORE_ENDSTOP(Y,MIN,Z,MIN); + #elif CORE_DIAG(YZ, Y, MAX) + PROCESS_CORE_ENDSTOP(Y,MAX,Z,MIN); + #endif + #endif + + // When closing the gap check the enabled probe + #if HAS_CUSTOM_PROBE_PIN + if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN_PROBE); + #endif + } + else { // Z +direction. Gantry up, bed down. + #if HAS_Z_MAX || (Z_SPI_SENSORLESS && Z_HOME_DIR > 0) + #if ENABLED(Z_MULTI_ENDSTOPS) + PROCESS_ENDSTOP_Z(MAX); + #elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN // No probe or probe is Z_MIN || Probe is not Z_MAX + PROCESS_ENDSTOP(Z, MAX); + #endif + #if CORE_DIAG(XZ, X, MIN) + PROCESS_CORE_ENDSTOP(X,MIN,Z,MAX); + #elif CORE_DIAG(XZ, X, MAX) + PROCESS_CORE_ENDSTOP(X,MAX,Z,MAX); + #elif CORE_DIAG(YZ, Y, MIN) + PROCESS_CORE_ENDSTOP(Y,MIN,Z,MAX); + #elif CORE_DIAG(YZ, Y, MAX) + PROCESS_CORE_ENDSTOP(Y,MAX,Z,MAX); + #endif + #endif + } + } +} // Endstops::update() + +#if ENABLED(SPI_ENDSTOPS) + + bool Endstops::tmc_spi_homing_check() { + bool hit = false; + #if X_SPI_SENSORLESS + if (tmc_spi_homing.x && (stepperX.test_stall_status() + #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() + #endif + )) { + SBI(live_state, X_ENDSTOP); + hit = true; + } + #endif + #if Y_SPI_SENSORLESS + if (tmc_spi_homing.y && (stepperY.test_stall_status() + #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() + #endif + )) { + SBI(live_state, Y_ENDSTOP); + hit = true; + } + #endif + #if Z_SPI_SENSORLESS + if (tmc_spi_homing.z && (stepperZ.test_stall_status() + #if CORE_IS_XZ && X_SPI_SENSORLESS + || stepperX.test_stall_status() + #elif CORE_IS_YZ && Y_SPI_SENSORLESS + || stepperY.test_stall_status() + #endif + )) { + SBI(live_state, Z_ENDSTOP); + hit = true; + } + #endif + return hit; + } + + void Endstops::clear_endstop_state() { + 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 + +#if ENABLED(PINS_DEBUGGING) + + bool Endstops::monitor_flag = false; + + /** + * Monitor Endstops and Z Probe for changes + * + * If a change is detected then the LED is toggled and + * a message is sent out the serial port. + * + * Yes, we could miss a rapid back & forth change but + * that won't matter because this is all manual. + */ + void Endstops::monitor() { + + static uint16_t old_live_state_local = 0; + static uint8_t local_LED_status = 0; + uint16_t live_state_local = 0; + + #define ES_GET_STATE(S) if (READ(S##_PIN)) SBI(live_state_local, S) + + #if HAS_X_MIN + ES_GET_STATE(X_MIN); + #endif + #if HAS_X_MAX + ES_GET_STATE(X_MAX); + #endif + #if HAS_Y_MIN + ES_GET_STATE(Y_MIN); + #endif + #if HAS_Y_MAX + ES_GET_STATE(Y_MAX); + #endif + #if HAS_Z_MIN + ES_GET_STATE(Z_MIN); + #endif + #if HAS_Z_MAX + ES_GET_STATE(Z_MAX); + #endif + #if HAS_Z_MIN_PROBE_PIN + ES_GET_STATE(Z_MIN_PROBE); + #endif + #if HAS_X2_MIN + ES_GET_STATE(X2_MIN); + #endif + #if HAS_X2_MAX + ES_GET_STATE(X2_MAX); + #endif + #if HAS_Y2_MIN + ES_GET_STATE(Y2_MIN); + #endif + #if HAS_Y2_MAX + ES_GET_STATE(Y2_MAX); + #endif + #if HAS_Z2_MIN + ES_GET_STATE(Z2_MIN); + #endif + #if HAS_Z2_MAX + ES_GET_STATE(Z2_MAX); + #endif + #if HAS_Z3_MIN + ES_GET_STATE(Z3_MIN); + #endif + #if HAS_Z3_MAX + ES_GET_STATE(Z3_MAX); + #endif + #if HAS_Z4_MIN + ES_GET_STATE(Z4_MIN); + #endif + #if HAS_Z4_MAX + ES_GET_STATE(Z4_MAX); + #endif + + uint16_t endstop_change = live_state_local ^ old_live_state_local; + #define ES_REPORT_CHANGE(S) if (TEST(endstop_change, S)) SERIAL_ECHOPAIR(" " STRINGIFY(S) ":", TEST(live_state_local, S)) + + if (endstop_change) { + #if HAS_X_MIN + ES_REPORT_CHANGE(X_MIN); + #endif + #if HAS_X_MAX + ES_REPORT_CHANGE(X_MAX); + #endif + #if HAS_Y_MIN + ES_REPORT_CHANGE(Y_MIN); + #endif + #if HAS_Y_MAX + ES_REPORT_CHANGE(Y_MAX); + #endif + #if HAS_Z_MIN + ES_REPORT_CHANGE(Z_MIN); + #endif + #if HAS_Z_MAX + ES_REPORT_CHANGE(Z_MAX); + #endif + #if HAS_Z_MIN_PROBE_PIN + ES_REPORT_CHANGE(Z_MIN_PROBE); + #endif + #if HAS_X2_MIN + ES_REPORT_CHANGE(X2_MIN); + #endif + #if HAS_X2_MAX + ES_REPORT_CHANGE(X2_MAX); + #endif + #if HAS_Y2_MIN + ES_REPORT_CHANGE(Y2_MIN); + #endif + #if HAS_Y2_MAX + ES_REPORT_CHANGE(Y2_MAX); + #endif + #if HAS_Z2_MIN + ES_REPORT_CHANGE(Z2_MIN); + #endif + #if HAS_Z2_MAX + ES_REPORT_CHANGE(Z2_MAX); + #endif + #if HAS_Z3_MIN + ES_REPORT_CHANGE(Z3_MIN); + #endif + #if HAS_Z3_MAX + ES_REPORT_CHANGE(Z3_MAX); + #endif + #if HAS_Z4_MIN + ES_REPORT_CHANGE(Z4_MIN); + #endif + #if HAS_Z4_MAX + ES_REPORT_CHANGE(Z4_MAX); + #endif + SERIAL_ECHOLNPGM("\n"); + analogWrite(pin_t(LED_PIN), local_LED_status); + local_LED_status ^= 255; + old_live_state_local = live_state_local; + } + } + +#endif // PINS_DEBUGGING diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h new file mode 100644 index 00000000..888d25a8 --- /dev/null +++ b/Marlin/src/module/endstops.h @@ -0,0 +1,190 @@ +/** + * 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 + +/** + * endstops.h - manages endstops + */ + +#include "../inc/MarlinConfig.h" +#include + +enum EndstopEnum : char { + X_MIN, Y_MIN, Z_MIN, Z_MIN_PROBE, + X_MAX, Y_MAX, Z_MAX, + X2_MIN, X2_MAX, + Y2_MIN, Y2_MAX, + Z2_MIN, Z2_MAX, + Z3_MIN, Z3_MAX, + 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 + typedef uint16_t esbits_t; + TERN_(X_DUAL_ENDSTOPS, static float x2_endstop_adj); + TERN_(Y_DUAL_ENDSTOPS, static float y2_endstop_adj); + TERN_(Z_MULTI_ENDSTOPS, static float z2_endstop_adj); + #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 + static float z3_endstop_adj; + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 + static float z4_endstop_adj; + #endif + #else + typedef uint8_t esbits_t; + #endif + + private: + static bool enabled, enabled_globally; + static esbits_t live_state; + static volatile uint8_t hit_state; // Use X_MIN, Y_MIN, Z_MIN and Z_MIN_PROBE as BIT index + + #if ENDSTOP_NOISE_THRESHOLD + static esbits_t validated_live_state; + static uint8_t endstop_poll_count; // Countdown from threshold for polling + #endif + + public: + Endstops() {}; + + /** + * Initialize the endstop pins + */ + static void init(); + + /** + * Are endstops or the probe set to abort the move? + */ + FORCE_INLINE static bool abort_enabled() { + return enabled || TERN0(HAS_BED_PROBE, z_probe_enabled); + } + + static inline bool global_enabled() { return enabled_globally; } + + /** + * Periodic call to poll endstops if required. Called from temperature ISR + */ + static void poll(); + + /** + * Update endstops bits from the pins. Apply filtering to get a verified state. + * If abort_enabled() and moving towards a triggered switch, abort the current move. + * Called from ISR contexts. + */ + static void update(); + + /** + * Get Endstop hit state. + */ + FORCE_INLINE static uint8_t trigger_state() { return hit_state; } + + /** + * Get current endstops state + */ + FORCE_INLINE static esbits_t state() { + return + #if ENDSTOP_NOISE_THRESHOLD + validated_live_state + #else + live_state + #endif + ; + } + + /** + * Report endstop hits to serial. Called from loop(). + */ + static void event_handler(); + + /** + * Report endstop states in response to M119 + */ + static void report_states(); + + // Enable / disable endstop checking globally + static void enable_globally(const bool onoff=true); + + // Enable / disable endstop checking + static void enable(const bool onoff=true); + + // Disable / Enable endstops based on ENSTOPS_ONLY_FOR_HOMING and global enable + static void not_homing(); + + #if ENABLED(VALIDATE_HOMING_ENDSTOPS) + // If the last move failed to trigger an endstop, call kill + static void validate_homing_move(); + #else + FORCE_INLINE static void validate_homing_move() { hit_on_purpose(); } + #endif + + // Clear endstops (i.e., they were hit intentionally) to suppress the report + FORCE_INLINE static void hit_on_purpose() { hit_state = 0; } + + // Enable / disable endstop z-probe checking + #if HAS_BED_PROBE + static volatile bool z_probe_enabled; + static void enable_z_probe(const bool onoff=true); + #endif + + static void resync(); + + // Debugging of endstops + #if ENABLED(PINS_DEBUGGING) + static bool monitor_flag; + static void monitor(); + static void run_monitor(); + #endif + + #if ENABLED(SPI_ENDSTOPS) + typedef struct { + union { + bool any; + struct { bool x:1, y:1, z:1; }; + }; + } tmc_spi_homing_t; + static tmc_spi_homing_t tmc_spi_homing; + static void clear_endstop_state(); + static bool tmc_spi_homing_check(); + #endif +}; + +extern Endstops endstops; + +/** + * A class to save and change the endstop state, + * then restore it when it goes out of scope. + */ +class TemporaryGlobalEndstopsState { + bool saved; + + public: + TemporaryGlobalEndstopsState(const bool enable) : saved(endstops.global_enabled()) { + endstops.enable_globally(enable); + } + ~TemporaryGlobalEndstopsState() { endstops.enable_globally(saved); } +}; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp new file mode 100644 index 00000000..a39ce526 --- /dev/null +++ b/Marlin/src/module/motion.cpp @@ -0,0 +1,1861 @@ +/** + * 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 . + * + */ + +/** + * motion.cpp + */ + +#include "motion.h" +#include "endstops.h" +#include "stepper.h" +#include "planner.h" +#include "temperature.h" + +#include "../gcode/gcode.h" + +#include "../inc/MarlinConfig.h" + +#if IS_SCARA + #include "../libs/buzzer.h" + #include "../lcd/ultralcd.h" +#endif + +#if HAS_BED_PROBE + #include "probe.h" +#endif + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(BLTOUCH) + #include "../feature/bltouch.h" +#endif + +#if HAS_DISPLAY + #include "../lcd/ultralcd.h" +#endif + +#if HAS_FILAMENT_SENSOR + #include "../feature/runout.h" +#endif + +#if ENABLED(SENSORLESS_HOMING) + #include "../feature/tmc_util.h" +#endif + +#if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" +#endif + +#if ENABLED(BABYSTEP_DISPLAY_TOTAL) + #include "../feature/babystep.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../core/debug_out.h" + +/** + * axis_homed + * Flags that each linear axis was homed. + * XYZ on cartesian, ABC on delta, ABZ on SCARA. + * + * axis_known_position + * Flags that the position is known in each linear axis. Set when homed. + * Cleared whenever a stepper powers off, potentially losing its position. + */ +uint8_t axis_homed, axis_known_position; // = 0 + +// Relative Mode. Enable with G91, disable with G90. +bool relative_mode; // = false; + +/** + * Cartesian Current Position + * Used to track the native machine position as moves are queued. + * Used by 'line_to_current_position' to do a move after changing it. + * Used by 'sync_plan_position' to update 'planner.position'. + */ +xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; + +/** + * Cartesian Destination + * The destination for a move, filled in by G-code movement commands, + * and expected by functions like 'prepare_line_to_destination'. + * G-codes can set destination using 'get_destination_from_command' + */ +xyze_pos_t destination; // {0} + +// G60/G61 Position Save and Return +#if SAVED_POSITIONS + uint8_t saved_slots[(SAVED_POSITIONS + 7) >> 3]; + xyz_pos_t stored_position[SAVED_POSITIONS]; +#endif + +// The active extruder (tool). Set with T command. +#if HAS_MULTI_EXTRUDER + uint8_t active_extruder = 0; // = 0 +#endif + +#if ENABLED(LCD_SHOW_E_TOTAL) + float e_move_accumulator; // = 0 +#endif + +// Extruder offsets +#if HAS_HOTEND_OFFSET + xyz_pos_t hotend_offset[HOTENDS]; // Initialized by settings.load() + void reset_hotend_offsets() { + constexpr float tmp[XYZ][HOTENDS] = { HOTEND_OFFSET_X, HOTEND_OFFSET_Y, HOTEND_OFFSET_Z }; + static_assert( + !tmp[X_AXIS][0] && !tmp[Y_AXIS][0] && !tmp[Z_AXIS][0], + "Offsets for the first hotend must be 0.0." + ); + // Transpose from [XYZ][HOTENDS] to [HOTENDS][XYZ] + HOTEND_LOOP() LOOP_XYZ(a) hotend_offset[e][a] = tmp[a][e]; + #if ENABLED(DUAL_X_CARRIAGE) + hotend_offset[1].x = _MAX(X2_HOME_POS, X2_MAX_POS); + #endif + } +#endif + +// The feedrate for the current move, often used as the default if +// no other feedrate is specified. Overridden for special moves. +// Set by the last G0 through G5 command's "F" parameter. +// Functions that override this for custom moves *must always* restore it! +feedRate_t feedrate_mm_s = MMM_TO_MMS(1500); +int16_t feedrate_percentage = 100; + +// Homing feedrate is const progmem - compare to constexpr in the header +const feedRate_t homing_feedrate_mm_s[XYZ] PROGMEM = { + #if ENABLED(DELTA) + MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z), + #else + MMM_TO_MMS(HOMING_FEEDRATE_XY), MMM_TO_MMS(HOMING_FEEDRATE_XY), + #endif + MMM_TO_MMS(HOMING_FEEDRATE_Z) +}; + +// Cartesian conversion result goes here: +xyz_pos_t cartes; + +#if IS_KINEMATIC + + abc_pos_t delta; + + #if HAS_SCARA_OFFSET + abc_pos_t scara_home_offset; + #endif + + #if HAS_SOFTWARE_ENDSTOPS + float delta_max_radius, delta_max_radius_2; + #elif IS_SCARA + constexpr float delta_max_radius = SCARA_PRINTABLE_RADIUS, + delta_max_radius_2 = sq(SCARA_PRINTABLE_RADIUS); + #else // DELTA + constexpr float delta_max_radius = DELTA_PRINTABLE_RADIUS, + delta_max_radius_2 = sq(DELTA_PRINTABLE_RADIUS); + #endif + +#endif + +/** + * The workspace can be offset by some commands, or + * these offsets may be omitted to save on computation. + */ +#if HAS_POSITION_SHIFT + // The distance that XYZ has been offset by G92. Reset by G28. + xyz_pos_t position_shift{0}; +#endif +#if HAS_HOME_OFFSET + // This offset is added to the configured home position. + // Set by M206, M428, or menu item. Saved to EEPROM. + xyz_pos_t home_offset{0}; +#endif +#if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + // The above two are combined to save on computes + xyz_pos_t workspace_offset{0}; +#endif + +#if HAS_ABL_NOT_UBL + float xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); +#endif + +/** + * Output the current position to serial + */ + +inline void report_more_positions() { + stepper.report_positions(); + TERN_(IS_SCARA, scara_report_positions()); +} + +// Report the logical position for a given machine position +inline void report_logical_position(const xyze_pos_t &rpos) { + const xyze_pos_t lpos = rpos.asLogical(); + SERIAL_ECHOPAIR_P(X_LBL, lpos.x, SP_Y_LBL, lpos.y, SP_Z_LBL, lpos.z, SP_E_LBL, lpos.e); +} + +// Report the real current position according to the steppers. +// Forward kinematics and un-leveling are applied. +void report_real_position() { + get_cartesian_from_steppers(); + xyze_pos_t npos = cartes; + npos.e = planner.get_axis_position_mm(E_AXIS); + + #if HAS_POSITION_MODIFIERS + planner.unapply_modifiers(npos, true); + #endif + + report_logical_position(npos); + report_more_positions(); +} + +// Report the logical current position according to the most recent G-code command +void report_current_position() { + report_logical_position(current_position); + report_more_positions(); +} + +/** + * Report the logical current position according to the most recent G-code command. + * The planner.position always corresponds to the last G-code too. This makes M114 + * suitable for debugging kinematics and leveling while avoiding planner sync that + * definitively interrupts the printing flow. + */ +void report_current_position_projected() { + report_logical_position(current_position); + stepper.report_a_position(planner.position); +} + +/** + * sync_plan_position + * + * Set the planner/stepper positions directly from current_position with + * no kinematic translation. Used for homing axes and cartesian/core syncing. + */ +void sync_plan_position() { + if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position); + planner.set_position_mm(current_position); +} + +void sync_plan_position_e() { planner.set_e_position_mm(current_position.e); } + +/** + * Get the stepper positions in the cartes[] array. + * Forward kinematics are applied for DELTA and SCARA. + * + * The result is in the current coordinate space with + * leveling applied. The coordinates need to be run through + * unapply_leveling to obtain the "ideal" coordinates + * suitable for current_position, etc. + */ +void get_cartesian_from_steppers() { + #if ENABLED(DELTA) + forward_kinematics_DELTA(planner.get_axis_positions_mm()); + #else + #if IS_SCARA + forward_kinematics_SCARA( + planner.get_axis_position_degrees(A_AXIS), + planner.get_axis_position_degrees(B_AXIS) + ); + #else + cartes.set(planner.get_axis_position_mm(X_AXIS), planner.get_axis_position_mm(Y_AXIS)); + #endif + cartes.z = planner.get_axis_position_mm(Z_AXIS); + #endif +} + +/** + * Set the current_position for an axis based on + * the stepper positions, removing any leveling that + * may have been applied. + * + * To prevent small shifts in axis position always call + * sync_plan_position after updating axes with this. + * + * To keep hosts in sync, always call report_current_position + * after updating the current_position. + */ +void set_current_from_steppers_for_axis(const AxisEnum axis) { + get_cartesian_from_steppers(); + xyze_pos_t pos = cartes; + pos.e = planner.get_axis_position_mm(E_AXIS); + + #if HAS_POSITION_MODIFIERS + planner.unapply_modifiers(pos, true); + #endif + + if (axis == ALL_AXES) + current_position = pos; + else + current_position[axis] = pos[axis]; +} + +/** + * Move the planner to the current position from wherever it last moved + * (or from wherever it has been told it is located). + */ +void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { + planner.buffer_line(current_position, fr_mm_s, active_extruder); +} + +#if EXTRUDERS + void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s) { + TERN_(HAS_FILAMENT_SENSOR, runout.reset()); + current_position.e += length / planner.e_factor[active_extruder]; + line_to_current_position(fr_mm_s); + planner.synchronize(); + } +#endif + +#if IS_KINEMATIC + + /** + * Buffer a fast move without interpolation. Set current_position to destination + */ + void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s/*=MMS_SCALED(feedrate_mm_s)*/) { + if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_fast_move_to_destination", destination); + + #if UBL_SEGMENTED + // UBL segmented line will do Z-only moves in single segment + ubl.line_to_destination_segmented(scaled_fr_mm_s); + #else + if (current_position == destination) return; + + planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); + #endif + + current_position = destination; + } + +#endif // IS_KINEMATIC + +/** + * Do a fast or normal move to 'destination' with an optional FR. + * - Move at normal speed regardless of feedrate percentage. + * - Extrude the specified length regardless of flow percentage. + */ +void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ + #if IS_KINEMATIC + , const bool is_fast/*=false*/ + #endif +) { + const feedRate_t old_feedrate = feedrate_mm_s; + if (fr_mm_s) feedrate_mm_s = fr_mm_s; + + const uint16_t old_pct = feedrate_percentage; + feedrate_percentage = 100; + + #if EXTRUDERS + const float old_fac = planner.e_factor[active_extruder]; + planner.e_factor[active_extruder] = 1.0f; + #endif + + #if IS_KINEMATIC + if (is_fast) + prepare_fast_move_to_destination(); + else + #endif + prepare_line_to_destination(); + + feedrate_mm_s = old_feedrate; + feedrate_percentage = old_pct; + #if EXTRUDERS + planner.e_factor[active_extruder] = old_fac; + #endif +} + +/** + * 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*/) { + 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); + + #if ENABLED(DELTA) + + if (!position_is_reachable(rx, ry)) return; + + REMEMBER(fr, feedrate_mm_s, xy_feedrate); + + destination = current_position; // sync destination at the start + + if (DEBUGGING(LEVELING)) DEBUG_POS("destination = current_position", destination); + + // when in the danger zone + if (current_position.z > delta_clip_start_height) { + if (rz > delta_clip_start_height) { // staying in the danger zone + destination.set(rx, ry, rz); // move directly (uninterpolated) + prepare_internal_fast_move_to_destination(); // set current_position from destination + if (DEBUGGING(LEVELING)) DEBUG_POS("danger zone move", current_position); + return; + } + destination.z = delta_clip_start_height; + prepare_internal_fast_move_to_destination(); // set current_position from destination + if (DEBUGGING(LEVELING)) DEBUG_POS("zone border move", current_position); + } + + if (rz > current_position.z) { // raising? + destination.z = rz; + prepare_internal_fast_move_to_destination(z_feedrate); // set current_position from destination + if (DEBUGGING(LEVELING)) DEBUG_POS("z raise move", current_position); + } + + destination.set(rx, ry); + prepare_internal_move_to_destination(); // set current_position from destination + if (DEBUGGING(LEVELING)) DEBUG_POS("xy move", current_position); + + if (rz < current_position.z) { // lowering? + destination.z = rz; + prepare_internal_fast_move_to_destination(z_feedrate); // set current_position from destination + if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); + } + + #elif IS_SCARA + + if (!position_is_reachable(rx, ry)) return; + + destination = current_position; + + // If Z needs to raise, do it before moving XY + if (destination.z < rz) { + destination.z = rz; + prepare_internal_fast_move_to_destination(z_feedrate); + } + + destination.set(rx, ry); + prepare_internal_fast_move_to_destination(xy_feedrate); + + // If Z needs to lower, do it after moving XY + if (destination.z > rz) { + destination.z = rz; + prepare_internal_fast_move_to_destination(z_feedrate); + } + + #else + + // If Z needs to raise, do it before moving XY + if (current_position.z < rz) { + current_position.z = rz; + line_to_current_position(z_feedrate); + } + + current_position.set(rx, ry); + line_to_current_position(xy_feedrate); + + // If Z needs to lower, do it after moving XY + if (current_position.z > rz) { + current_position.z = rz; + line_to_current_position(z_feedrate); + } + + #endif + + planner.synchronize(); +} + +void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, current_position.z, fr_mm_s); +} +void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); +} +void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); +} + +void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s/*=0.0*/) { + do_blocking_move_to(rx, current_position.y, current_position.z, fr_mm_s); +} +void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { + do_blocking_move_to(current_position.x, ry, current_position.z, fr_mm_s); +} +void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s/*=0.0*/) { + do_blocking_move_to_xy_z(current_position, rz, fr_mm_s); +} + +void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { + do_blocking_move_to(rx, ry, current_position.z, fr_mm_s); +} +void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { + do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); +} + +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s/*=0.0f*/) { + 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(TERN(HAS_BED_PROBE, Z_PROBE_SPEED_FAST, HOMING_FEEDRATE_Z))); +} + +// +// Prepare to do endstop or probe moves with custom feedrates. +// - Save / restore current feedrate and multiplier +// +static float saved_feedrate_mm_s; +static int16_t saved_feedrate_percentage; +void remember_feedrate_and_scaling() { + saved_feedrate_mm_s = feedrate_mm_s; + saved_feedrate_percentage = feedrate_percentage; +} +void remember_feedrate_scaling_off() { + remember_feedrate_and_scaling(); + feedrate_percentage = 100; +} +void restore_feedrate_and_scaling() { + feedrate_mm_s = saved_feedrate_mm_s; + feedrate_percentage = saved_feedrate_percentage; +} + +#if HAS_SOFTWARE_ENDSTOPS + + // Software Endstops are based on the configured limits. + soft_endstops_t soft_endstop = { + true, false, + { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }, + { X_MAX_POS, Y_MAX_POS, Z_MAX_POS } + }; + + /** + * Software endstops can be used to monitor the open end of + * an axis that has a hardware endstop on the other end. Or + * they can prevent axes from moving past endstops and grinding. + * + * To keep doing their job as the coordinate system changes, + * the software endstop positions must be refreshed to remain + * at the same positions relative to the machine. + */ + void update_software_endstops(const AxisEnum axis + #if HAS_HOTEND_OFFSET + , const uint8_t old_tool_index/*=0*/ + , const uint8_t new_tool_index/*=0*/ + #endif + ) { + + #if ENABLED(DUAL_X_CARRIAGE) + + if (axis == X_AXIS) { + + // In Dual X mode hotend_offset[X] is T1's home position + const float dual_max_x = _MAX(hotend_offset[1].x, X2_MAX_POS); + + if (new_tool_index != 0) { + // T1 can move from X2_MIN_POS to X2_MAX_POS or X2 home position (whichever is larger) + soft_endstop.min.x = X2_MIN_POS; + soft_endstop.max.x = dual_max_x; + } + else if (dxc_is_duplicating()) { + // In Duplication Mode, T0 can move as far left as X1_MIN_POS + // but not so far to the right that T1 would move past the end + soft_endstop.min.x = X1_MIN_POS; + soft_endstop.max.x = _MIN(X1_MAX_POS, dual_max_x - duplicate_extruder_x_offset); + } + else { + // In other modes, T0 can move from X1_MIN_POS to X1_MAX_POS + soft_endstop.min.x = X1_MIN_POS; + soft_endstop.max.x = X1_MAX_POS; + } + + } + + #elif ENABLED(DELTA) + + soft_endstop.min[axis] = base_min_pos(axis); + soft_endstop.max[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_max_pos(axis); + + switch (axis) { + case X_AXIS: + case Y_AXIS: + // Get a minimum radius for clamping + delta_max_radius = _MIN(ABS(_MAX(soft_endstop.min.x, soft_endstop.min.y)), soft_endstop.max.x, soft_endstop.max.y); + delta_max_radius_2 = sq(delta_max_radius); + break; + case Z_AXIS: + delta_clip_start_height = soft_endstop.max[axis] - delta_safe_distance_from_top(); + default: break; + } + + #elif HAS_HOTEND_OFFSET + + // Software endstops are relative to the tool 0 workspace, so + // the movement limits must be shifted by the tool offset to + // retain the same physical limit when other tools are selected. + if (old_tool_index != new_tool_index) { + const float offs = hotend_offset[new_tool_index][axis] - hotend_offset[old_tool_index][axis]; + soft_endstop.min[axis] += offs; + soft_endstop.max[axis] += offs; + } + else { + const float offs = hotend_offset[active_extruder][axis]; + soft_endstop.min[axis] = base_min_pos(axis) + offs; + soft_endstop.max[axis] = base_max_pos(axis) + offs; + } + + #else + + soft_endstop.min[axis] = base_min_pos(axis); + soft_endstop.max[axis] = base_max_pos(axis); + + #endif + + if (DEBUGGING(LEVELING)) + SERIAL_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " min:", soft_endstop.min[axis], " max:", soft_endstop.max[axis]); + } + + /** + * Constrain the given coordinates to the software endstops. + * + * For DELTA/SCARA the XY constraint is based on the smallest + * radius within the set software endstops. + */ + void apply_motion_limits(xyz_pos_t &target) { + + if (!soft_endstop._enabled) return; + + #if IS_KINEMATIC + + if (TERN0(DELTA, !all_axes_homed())) return; + + #if BOTH(HAS_HOTEND_OFFSET, DELTA) + // The effector center position will be the target minus the hotend offset. + const xy_pos_t offs = hotend_offset[active_extruder]; + #else + // SCARA needs to consider the angle of the arm through the entire move, so for now use no tool offset. + constexpr xy_pos_t offs{0}; + #endif + + if (TERN1(IS_SCARA, TEST(axis_homed, X_AXIS) && TEST(axis_homed, Y_AXIS))) { + const float dist_2 = HYPOT2(target.x - offs.x, target.y - offs.y); + if (dist_2 > delta_max_radius_2) + target *= float(delta_max_radius / SQRT(dist_2)); // 200 / 300 = 0.66 + } + + #else + + if (TEST(axis_homed, X_AXIS)) { + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) + NOLESS(target.x, soft_endstop.min.x); + #endif + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) + NOMORE(target.x, soft_endstop.max.x); + #endif + } + + if (TEST(axis_homed, Y_AXIS)) { + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Y) + NOLESS(target.y, soft_endstop.min.y); + #endif + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Y) + NOMORE(target.y, soft_endstop.max.y); + #endif + } + + #endif + + if (TEST(axis_homed, Z_AXIS)) { + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_Z) + NOLESS(target.z, soft_endstop.min.z); + #endif + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_Z) + NOMORE(target.z, soft_endstop.max.z); + #endif + } + } + +#else // !HAS_SOFTWARE_ENDSTOPS + + soft_endstops_t soft_endstop; + +#endif // !HAS_SOFTWARE_ENDSTOPS + +#if !UBL_SEGMENTED + +FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { + const millis_t ms = millis(); + if (ELAPSED(ms, next_idle_ms)) { + next_idle_ms = ms + 200UL; + return idle(); + } + thermalManager.manage_heater(); // Returns immediately on most calls +} + +#if IS_KINEMATIC + + #if IS_SCARA + /** + * Before raising this value, use M665 S[seg_per_sec] to decrease + * the number of segments-per-second. Default is 200. Some deltas + * do better with 160 or lower. It would be good to know how many + * segments-per-second are actually possible for SCARA on AVR. + * + * Longer segments result in less kinematic overhead + * but may produce jagged lines. Try 0.5mm, 1.0mm, and 2.0mm + * and compare the difference. + */ + #define SCARA_MIN_SEGMENT_LENGTH 0.5f + #endif + + /** + * Prepare a linear move in a DELTA or SCARA setup. + * + * Called from prepare_line_to_destination as the + * default Delta/SCARA segmenter. + * + * This calls planner.buffer_line several times, adding + * small incremental moves for DELTA or SCARA. + * + * For Unified Bed Leveling (Delta or Segmented Cartesian) + * the ubl.line_to_destination_segmented method replaces this. + * + * For Auto Bed Leveling (Bilinear) with SEGMENT_LEVELED_MOVES + * this is replaced by segmented_line_to_destination below. + */ + inline bool line_to_destination_kinematic() { + + // Get the top feedrate of the move in the XY plane + const float scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); + + const xyze_float_t diff = destination - current_position; + + // If the move is only in Z/E don't split up the move + if (!diff.x && !diff.y) { + planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); + return false; // caller will update current_position + } + + // Fail if attempting move outside printable radius + if (!position_is_reachable(destination)) return true; + + // Get the linear distance in XYZ + float cartesian_mm = diff.magnitude(); + + // If the move is very short, check the E move distance + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(diff.e); + + // No E move either? Game over. + if (UNEAR_ZERO(cartesian_mm)) return true; + + // Minimum number of seconds to move the given distance + const float seconds = cartesian_mm / scaled_fr_mm_s; + + // The number of segments-per-second times the duration + // gives the number of segments + uint16_t segments = delta_segments_per_second * seconds; + + // For SCARA enforce a minimum segment size + #if IS_SCARA + NOMORE(segments, cartesian_mm * RECIPROCAL(SCARA_MIN_SEGMENT_LENGTH)); + #endif + + // At least one segment is required + NOLESS(segments, 1U); + + // The approximate length of each segment + const float inv_segments = 1.0f / float(segments), + cartesian_segment_mm = cartesian_mm * inv_segments; + const xyze_float_t segment_distance = diff * inv_segments; + + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = scaled_fr_mm_s / cartesian_segment_mm; + #endif + + /* + SERIAL_ECHOPAIR("mm=", cartesian_mm); + SERIAL_ECHOPAIR(" seconds=", seconds); + SERIAL_ECHOPAIR(" segments=", segments); + SERIAL_ECHOPAIR(" segment_mm=", cartesian_segment_mm); + SERIAL_EOL(); + //*/ + + // Get the current position as starting point + xyze_pos_t raw = current_position; + + // Calculate and execute the segments + millis_t next_idle_ms = millis() + 200UL; + while (--segments) { + segment_idle(next_idle_ms); + raw += segment_distance; + if (!planner.buffer_line(raw, scaled_fr_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + )) break; + } + + // Ensure last segment arrives at target location. + planner.buffer_line(destination, scaled_fr_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + + return false; // caller will update current_position + } + +#else // !IS_KINEMATIC + + #if ENABLED(SEGMENT_LEVELED_MOVES) + + /** + * Prepare a segmented move on a CARTESIAN setup. + * + * This calls planner.buffer_line several times, adding + * small incremental moves. This allows the planner to + * apply more detailed bed leveling to the full move. + */ + inline void segmented_line_to_destination(const feedRate_t &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { + + const xyze_float_t diff = destination - current_position; + + // If the move is only in Z/E don't split up the move + if (!diff.x && !diff.y) { + planner.buffer_line(destination, fr_mm_s, active_extruder); + return; + } + + // Get the linear distance in XYZ + // If the move is very short, check the E move distance + // No E move either? Game over. + float cartesian_mm = diff.magnitude(); + if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = ABS(diff.e); + if (UNEAR_ZERO(cartesian_mm)) return; + + // The length divided by the segment size + // At least one segment is required + uint16_t segments = cartesian_mm / segment_size; + NOLESS(segments, 1U); + + // The approximate length of each segment + const float inv_segments = 1.0f / float(segments), + cartesian_segment_mm = cartesian_mm * inv_segments; + const xyze_float_t segment_distance = diff * inv_segments; + + #if ENABLED(SCARA_FEEDRATE_SCALING) + const float inv_duration = scaled_fr_mm_s / cartesian_segment_mm; + #endif + + // SERIAL_ECHOPAIR("mm=", cartesian_mm); + // SERIAL_ECHOLNPAIR(" segments=", segments); + // SERIAL_ECHOLNPAIR(" segment_mm=", cartesian_segment_mm); + + // Get the raw current position as starting point + xyze_pos_t raw = current_position; + + // Calculate and execute the segments + millis_t next_idle_ms = millis() + 200UL; + while (--segments) { + segment_idle(next_idle_ms); + raw += segment_distance; + if (!planner.buffer_line(raw, fr_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + )) break; + } + + // Since segment_distance is only approximate, + // the final move must be to the exact destination. + planner.buffer_line(destination, fr_mm_s, active_extruder, cartesian_segment_mm + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + } + + #endif // SEGMENT_LEVELED_MOVES + + /** + * Prepare a linear move in a Cartesian setup. + * + * When a mesh-based leveling system is active, moves are segmented + * according to the configuration of the leveling system. + * + * Return true if 'current_position' was set to 'destination' + */ + inline bool line_to_destination_cartesian() { + const float scaled_fr_mm_s = MMS_SCALED(feedrate_mm_s); + #if HAS_MESH + if (planner.leveling_active && planner.leveling_active_at_z(destination.z)) { + #if ENABLED(AUTO_BED_LEVELING_UBL) + ubl.line_to_destination_cartesian(scaled_fr_mm_s, active_extruder); // UBL's motion routine needs to know about + return true; // all moves, including Z-only moves. + #elif ENABLED(SEGMENT_LEVELED_MOVES) + segmented_line_to_destination(scaled_fr_mm_s); + return false; // caller will update current_position + #else + /** + * For MBL and ABL-BILINEAR only segment moves when X or Y are involved. + * Otherwise fall through to do a direct single move. + */ + if (xy_pos_t(current_position) != xy_pos_t(destination)) { + #if ENABLED(MESH_BED_LEVELING) + mbl.line_to_destination(scaled_fr_mm_s); + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + bilinear_line_to_destination(scaled_fr_mm_s); + #endif + return true; + } + #endif + } + #endif // HAS_MESH + + planner.buffer_line(destination, scaled_fr_mm_s, active_extruder); + return false; // caller will update current_position + } + +#endif // !IS_KINEMATIC +#endif // !UBL_SEGMENTED + +#if HAS_DUPLICATION_MODE + bool extruder_duplication_enabled, + mirrored_duplication_mode; + #if ENABLED(MULTI_NOZZLE_DUPLICATION) + uint8_t duplication_e_mask; // = 0 + #endif +#endif + +#if ENABLED(DUAL_X_CARRIAGE) + + DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; + float inactive_extruder_x_pos = X2_MAX_POS, // used in mode 0 & 1 + duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 + xyz_pos_t raised_parked_position; // used in mode 1 + bool active_extruder_parked = false; // used in mode 1 & 2 + 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 uint8_t extruder) { + if (extruder == 0) + return base_home_pos(X_AXIS); + else + /** + * In dual carriage mode the extruder offset provides an override of the + * second X-carriage position when homed - otherwise X2_HOME_POS is used. + * This allows soft recalibration of the second extruder home position + * without firmware reflash (through the M218 command). + */ + return hotend_offset[1].x > 0 ? hotend_offset[1].x : X2_HOME_POS; + } + + /** + * Prepare a linear move in a dual X axis setup + * + * Return true if current_position[] was set to destination[] + */ + inline bool dual_x_carriage_unpark() { + if (active_extruder_parked) { + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: + break; + case DXC_AUTO_PARK_MODE: + if (current_position.e == destination.e) { + // This is a travel move (with no extrusion) + // Skip it, but keep track of the current position + // (so it can be used as the start of the next non-travel move) + if (delayed_move_time != 0xFFFFFFFFUL) { + current_position = destination; + NOLESS(raised_parked_position.z, destination.z); + delayed_move_time = millis(); + return true; + } + } + // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower + + #define CUR_X current_position.x + #define CUR_Y current_position.y + #define CUR_Z current_position.z + #define CUR_E current_position.e + #define RAISED_X raised_parked_position.x + #define RAISED_Y raised_parked_position.y + #define RAISED_Z raised_parked_position.z + + if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder)) + if (planner.buffer_line( CUR_X, CUR_Y, RAISED_Z, CUR_E, PLANNER_XY_FEEDRATE(), active_extruder)) + line_to_current_position(planner.settings.max_feedrate_mm_s[Z_AXIS]); + delayed_move_time = 0; + active_extruder_parked = false; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Clear active_extruder_parked"); + break; + case DXC_MIRRORED_MODE: + case DXC_DUPLICATION_MODE: + if (active_extruder == 0) { + xyze_pos_t new_pos = current_position; + if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) + new_pos.x += duplicate_extruder_x_offset; + else + new_pos.x = inactive_extruder_x_pos; + // move duplicate extruder into correct duplication position. + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Set planner X", inactive_extruder_x_pos, " ... Line to X", new_pos.x); + planner.set_position_mm(inactive_extruder_x_pos, current_position.y, current_position.z, current_position.e); + if (!planner.buffer_line(new_pos, planner.settings.max_feedrate_mm_s[X_AXIS], 1)) break; + planner.synchronize(); + sync_plan_position(); + extruder_duplication_enabled = true; + active_extruder_parked = false; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Set extruder_duplication_enabled\nClear active_extruder_parked"); + } + else if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Active extruder not 0"); + break; + } + } + stepper.set_directions(); + return false; + } + +#endif // DUAL_X_CARRIAGE + +/** + * Prepare a single move and get ready for the next one + * + * This may result in several calls to planner.buffer_line to + * do smaller moves for DELTA, SCARA, mesh moves, etc. + * + * Make sure current_position.e and destination.e are good + * before calling or cold/lengthy extrusion may get missed. + * + * Before exit, current_position is set to destination. + */ +void prepare_line_to_destination() { + apply_motion_limits(destination); + + #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) + + if (!DEBUGGING(DRYRUN) && destination.e != current_position.e) { + bool ignore_e = false; + + #if ENABLED(PREVENT_COLD_EXTRUSION) + ignore_e = thermalManager.tooColdToExtrude(active_extruder); + if (ignore_e) SERIAL_ECHO_MSG(STR_ERR_COLD_EXTRUDE_STOP); + #endif + + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + const float e_delta = ABS(destination.e - current_position.e) * planner.e_factor[active_extruder]; + if (e_delta > (EXTRUDE_MAXLENGTH)) { + #if ENABLED(MIXING_EXTRUDER) + float collector[MIXING_STEPPERS]; + mixer.refresh_collector(1.0, mixer.get_current_vtool(), collector); + MIXER_STEPPER_LOOP(e) { + if (e_delta * collector[e] > (EXTRUDE_MAXLENGTH)) { + ignore_e = true; + SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); + break; + } + } + #else + ignore_e = true; + SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); + #endif + } + #endif + + if (ignore_e) { + current_position.e = destination.e; // Behave as if the E move really took place + planner.set_e_position_mm(destination.e); // Prevent the planner from complaining too + } + } + + #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE + + if (TERN0(DUAL_X_CARRIAGE, dual_x_carriage_unpark())) return; + + if ( + #if UBL_SEGMENTED + #if IS_KINEMATIC // UBL using Kinematic / Cartesian cases as a workaround for now. + ubl.line_to_destination_segmented(MMS_SCALED(feedrate_mm_s)) + #else + line_to_destination_cartesian() + #endif + #elif IS_KINEMATIC + line_to_destination_kinematic() + #else + line_to_destination_cartesian() + #endif + ) return; + + current_position = destination; +} + +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 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, + TEST(axis_bits, X_AXIS) ? "X" : "", + TEST(axis_bits, Y_AXIS) ? "Y" : "", + TEST(axis_bits, Z_AXIS) ? "Z" : "" + ); + SERIAL_ECHO_START(); + SERIAL_ECHOLN(msg); + TERN_(HAS_DISPLAY, ui.set_status(msg)); + return true; + } + return false; +} + +/** + * Homing bump feedrate (mm/s) + */ +feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); + #endif + static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; + uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); + if (hbd < 1) { + hbd = 10; + SERIAL_ECHO_MSG("Warning: Homing Bump Divisor < 1"); + } + return homing_feedrate(axis) / float(hbd); +} + +#if ENABLED(SENSORLESS_HOMING) + /** + * Set sensorless homing if the axis has it, accounting for Core Kinematics. + */ + sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis) { + sensorless_t stealth_states { false }; + + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + stealth_states.x = tmc_enable_stallguard(stepperX); + #if AXIS_HAS_STALLGUARD(X2) + stealth_states.x2 = tmc_enable_stallguard(stepperX2); + #endif + #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); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + stealth_states.y = tmc_enable_stallguard(stepperY); + #if AXIS_HAS_STALLGUARD(Y2) + stealth_states.y2 = tmc_enable_stallguard(stepperY2); + #endif + #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); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + stealth_states.z = tmc_enable_stallguard(stepperZ); + #if AXIS_HAS_STALLGUARD(Z2) + stealth_states.z2 = tmc_enable_stallguard(stepperZ2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + stealth_states.z3 = tmc_enable_stallguard(stepperZ3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + stealth_states.z4 = tmc_enable_stallguard(stepperZ4); + #endif + #if CORE_IS_XZ && X_SENSORLESS + stealth_states.x = tmc_enable_stallguard(stepperX); + #elif CORE_IS_YZ && Y_SENSORLESS + stealth_states.y = tmc_enable_stallguard(stepperY); + #endif + break; + #endif + } + + #if ENABLED(SPI_ENDSTOPS) + switch (axis) { + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; + case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; + case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; + default: break; + } + #endif + + TERN_(IMPROVE_HOMING_RELIABILITY, sg_guard_period = millis() + default_sg_guard_duration); + + return stealth_states; + } + + void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth) { + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + tmc_disable_stallguard(stepperX, enable_stealth.x); + #if AXIS_HAS_STALLGUARD(X2) + tmc_disable_stallguard(stepperX2, enable_stealth.x2); + #endif + #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); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + tmc_disable_stallguard(stepperY, enable_stealth.y); + #if AXIS_HAS_STALLGUARD(Y2) + tmc_disable_stallguard(stepperY2, enable_stealth.y2); + #endif + #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); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #if AXIS_HAS_STALLGUARD(Z2) + tmc_disable_stallguard(stepperZ2, enable_stealth.z2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + tmc_disable_stallguard(stepperZ3, enable_stealth.z3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + tmc_disable_stallguard(stepperZ4, enable_stealth.z4); + #endif + #if CORE_IS_XZ && X_SENSORLESS + tmc_disable_stallguard(stepperX, enable_stealth.x); + #elif CORE_IS_YZ && Y_SENSORLESS + tmc_disable_stallguard(stepperY, enable_stealth.y); + #endif + break; + #endif + } + + #if ENABLED(SPI_ENDSTOPS) + switch (axis) { + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; + case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; + case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; + default: break; + } + #endif + } + +#endif // SENSORLESS_HOMING + +/** + * 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("...(", axis_codes[axis], ", ", distance, ", "); + if (fr_mm_s) + DEBUG_ECHO(fr_mm_s); + else + DEBUG_ECHOPAIR("[", real_fr_mm_s, "]"); + DEBUG_ECHOLNPGM(")"); + } + + #if ALL(HOMING_Z_WITH_PROBE, HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + if (axis == Z_AXIS && distance < 0) + thermalManager.wait_for_bed_heating(); + #endif + + // Only do some things when moving towards an endstop + const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) + ? x_home_dir(active_extruder) : home_dir(axis); + const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); + + #if ENABLED(SENSORLESS_HOMING) + sensorless_t stealth_states; + #endif + + if (is_home_dir) { + + #if HOMING_Z_WITH_PROBE && QUIET_PROBING + if (axis == Z_AXIS) probe.set_probing_paused(true); + #endif + + // Disable stealthChop if used. Enable diag1 pin on driver. + TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); + } + + #if IS_SCARA + // Tell the planner the axis is at 0 + current_position[axis] = 0; + sync_plan_position(); + 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; // 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 + #endif + , real_fr_mm_s, active_extruder + ); + #endif + + planner.synchronize(); + + if (is_home_dir) { + + #if HOMING_Z_WITH_PROBE && QUIET_PROBING + if (axis == Z_AXIS) probe.set_probing_paused(false); + #endif + + endstops.validate_homing_move(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); + } +} + +/** + * Set an axis' current position to its home position (after homing). + * + * For Core and Cartesian robots this applies one-to-one when an + * individual axis has been homed. + * + * DELTA should wait until all homing is done before setting the XYZ + * current_position to home, because homing is a single operation. + * In the case where the axis positions are already known and previously + * homed, DELTA could home to X or Y individually by moving either one + * to the center. However, homing Z always homes XY and Z. + * + * SCARA should wait until all XY homing is done before setting the XY + * current_position to home, because neither X nor Y is at home until + * both are at home. Z can however be homed individually. + * + * Callers must sync the planner position after calling this! + */ +void set_axis_is_at_home(const AxisEnum axis) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_is_at_home(", axis_codes[axis], ")"); + + SBI(axis_known_position, axis); + SBI(axis_homed, axis); + + #if ENABLED(DUAL_X_CARRIAGE) + if (axis == X_AXIS && (active_extruder == 1 || dual_x_carriage_mode == DXC_DUPLICATION_MODE)) { + current_position.x = x_home_pos(active_extruder); + return; + } + #endif + + #if ENABLED(MORGAN_SCARA) + scara_set_axis_is_at_home(axis); + #elif ENABLED(DELTA) + current_position[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_home_pos(axis); + #else + current_position[axis] = base_home_pos(axis); + #endif + + /** + * Z Probe Z Homing? Account for the probe's Z offset. + */ + #if HAS_BED_PROBE && Z_HOME_DIR < 0 + if (axis == Z_AXIS) { + #if HOMING_Z_WITH_PROBE + + current_position.z -= probe.offset.z; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***\n> probe.offset.z = ", probe.offset.z); + + #else + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("*** Z HOMED TO ENDSTOP ***"); + + #endif + } + #endif + + TERN_(I2C_POSITION_ENCODERS, I2CPEM.homed(axis)); + + TERN_(BABYSTEP_DISPLAY_TOTAL, babystep.reset_total(axis)); + + #if HAS_POSITION_SHIFT + position_shift[axis] = 0; + update_workspace_offset(axis); + #endif + + if (DEBUGGING(LEVELING)) { + #if HAS_HOME_OFFSET + DEBUG_ECHOLNPAIR("> home_offset[", axis_codes[axis], "] = ", home_offset[axis]); + #endif + DEBUG_POS("", current_position); + DEBUG_ECHOLNPAIR("<<< set_axis_is_at_home(", axis_codes[axis], ")"); + } +} + +/** + * Set an axis to be unhomed. + */ +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_never_homed(", axis_codes[axis], ")"); + + TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); +} + +#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 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. + + #define PHASE_PER_MICROSTEP(N) (256 / _MAX(1, N##_MICROSTEPS)) + + switch (axis) { + #ifdef X_MICROSTEPS + case X_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(X); + phaseCurrent = stepperX.get_microstep_counter(); + effectorBackoutDir = -X_HOME_DIR; + stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + #ifdef Y_MICROSTEPS + case Y_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(Y); + phaseCurrent = stepperY.get_microstep_counter(); + effectorBackoutDir = -Y_HOME_DIR; + stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + #ifdef Z_MICROSTEPS + case Z_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(Z); + phaseCurrent = stepperZ.get_microstep_counter(); + effectorBackoutDir = -Z_HOME_DIR; + stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + default: return; + } + + // 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] / 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; + + // 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 + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOLNPAIR( + "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, + " Delta:", phaseDelta, " Distance:", mmDelta + ); + } + + if (mmDelta != 0) { + // Retrace by the amount computed in mmDelta. + do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); + } + } +#endif + +/** + * Home an individual "raw axis" to its endstop. + * This applies to XYZ on Cartesian and Core robots, and + * to the individual ABC steppers on DELTA and SCARA. + * + * At the end of the procedure the axis is marked as + * homed and the current position of that axis is updated. + * Kinematic robots should wait till all axes are homed + * before updating the current position. + */ + +void homeaxis(const AxisEnum axis) { + + #if IS_SCARA + // Only Z homing (with probe) is permitted + if (axis != Z_AXIS) { BUZZ(100, 880); return; } + #else + #define _CAN_HOME(A) (axis == _AXIS(A) && ( \ + ENABLED(A##_SPI_SENSORLESS) \ + || (_AXIS(A) == Z_AXIS && ENABLED(HOMING_Z_WITH_PROBE)) \ + || (A##_MIN_PIN > -1 && A##_HOME_DIR < 0) \ + || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0) \ + )) + if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; + #endif + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); + + const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) + ? x_home_dir(active_extruder) : home_dir(axis); + + // Homing Z towards the bed? Deploy the Z probe or endstop. + if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) + return; + + // Set flags for X, Y, Z motor locking + #if HAS_EXTRA_ENDSTOPS + switch (axis) { + TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) + TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) + TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) + stepper.set_separate_multi_axis(true); + default: break; + } + #endif + + // Fast move towards endstop until triggered + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Home 1 Fast:"); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + if (axis == Z_AXIS && bltouch.deploy()) return; // The initial DEPLOY + #endif + + #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) + const xy_float_t backoff = SENSORLESS_BACKOFF_MM; + if (((ENABLED(X_SENSORLESS) && axis == X_AXIS) || (ENABLED(Y_SENSORLESS) && axis == Y_AXIS)) && backoff[axis]) + do_homing_move(axis, -ABS(backoff[axis]) * axis_home_dir, homing_feedrate(axis)); + #endif + + do_homing_move(axis, 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) + #endif + + // When homing Z with probe respect probe clearance + const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); + const float bump = axis_home_dir * ( + use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) + ); + + // If a second homing move is configured... + if (bump) { + // Move away from the endstop by the axis HOMING_BUMP_MM + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move Away:"); + do_homing_move(axis, -bump + #if HOMING_Z_WITH_PROBE + , MMM_TO_MMS(axis == Z_AXIS ? Z_PROBE_SPEED_FAST : 0) + #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:"); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) + #endif + + do_homing_move(axis, 2 * bump, get_homing_bump_feedrate(axis)); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + if (axis == Z_AXIS) bltouch.stow(); // The final STOW + #endif + } + + #if HAS_EXTRA_ENDSTOPS + const bool pos_dir = axis_home_dir > 0; + #if ENABLED(X_DUAL_ENDSTOPS) + if (axis == X_AXIS) { + const float adj = ABS(endstops.x2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_x_lock(false); + stepper.set_x2_lock(false); + } + } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + if (axis == Y_AXIS) { + const float adj = ABS(endstops.y2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_y_lock(false); + stepper.set_y2_lock(false); + } + } + #endif + + #if ENABLED(Z_MULTI_ENDSTOPS) + if (axis == Z_AXIS) { + + #if NUM_Z_STEPPER_DRIVERS == 2 + + const float adj = ABS(endstops.z2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z1_lock(true); else stepper.set_z2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_z1_lock(false); + stepper.set_z2_lock(false); + } + + #else + + // Handy arrays of stepper lock function pointers + + typedef void (*adjustFunc_t)(const bool); + + adjustFunc_t lock[] = { + stepper.set_z1_lock, stepper.set_z2_lock, stepper.set_z3_lock + #if NUM_Z_STEPPER_DRIVERS >= 4 + , stepper.set_z4_lock + #endif + }; + float adj[] = { + 0, endstops.z2_endstop_adj, endstops.z3_endstop_adj + #if NUM_Z_STEPPER_DRIVERS >= 4 + , endstops.z4_endstop_adj + #endif + }; + + adjustFunc_t tempLock; + float tempAdj; + + // Manual bubble sort by adjust value + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + #if NUM_Z_STEPPER_DRIVERS >= 4 + if (adj[3] < adj[2]) { + tempLock = lock[2], tempAdj = adj[2]; + lock[2] = lock[3], adj[2] = adj[3]; + lock[3] = tempLock, adj[3] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + #endif + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + + if (pos_dir) { + // normalize adj to smallest value and do the first move + (*lock[0])(true); + do_homing_move(axis, adj[1] - adj[0]); + // lock the second stepper for the final correction + (*lock[1])(true); + do_homing_move(axis, adj[2] - adj[1]); + #if NUM_Z_STEPPER_DRIVERS >= 4 + // lock the third stepper for the final correction + (*lock[2])(true); + do_homing_move(axis, adj[3] - adj[2]); + #endif + } + else { + #if NUM_Z_STEPPER_DRIVERS >= 4 + (*lock[3])(true); + do_homing_move(axis, adj[2] - adj[3]); + #endif + (*lock[2])(true); + do_homing_move(axis, adj[1] - adj[2]); + (*lock[1])(true); + do_homing_move(axis, adj[0] - adj[1]); + } + + stepper.set_z1_lock(false); + stepper.set_z2_lock(false); + stepper.set_z3_lock(false); + #if NUM_Z_STEPPER_DRIVERS >= 4 + stepper.set_z4_lock(false); + #endif + + #endif + } + #endif + + // Reset flags for X, Y, Z motor locking + switch (axis) { + default: break; + TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) + TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) + TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) + stepper.set_separate_multi_axis(false); + } + #endif + + #ifdef TMC_HOME_PHASE + // move back to homing phase if configured and capable + backout_to_tmc_homing_phase(axis); + #endif + + #if IS_SCARA + + set_axis_is_at_home(axis); + sync_plan_position(); + + #elif ENABLED(DELTA) + + // Delta has already moved all three towers up in G28 + // so here it re-homes each tower in turn. + // Delta homing treats the axes as normal linear axes. + + const float adjDistance = delta_endstop_adj[axis], + minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis]; + + // Retrace by the amount specified in delta_endstop_adj if more than min steps. + if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance); + do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); + } + + #else // CARTESIAN / CORE / MARKFORGED_XY + + set_axis_is_at_home(axis); + sync_plan_position(); + + destination[axis] = current_position[axis]; + + if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); + + #endif + + // Put away the Z probe + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS && probe.stow()) return; + #endif + + #if DISABLED(DELTA) && defined(HOMING_BACKOFF_POST_MM) + const xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; + if (endstop_backoff[axis]) { + current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; + line_to_current_position( + #if HOMING_Z_WITH_PROBE + (axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : + #endif + homing_feedrate(axis) + ); + + #if ENABLED(SENSORLESS_HOMING) + planner.synchronize(); + 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 + + // Clear retracted status if homing the Z axis + #if ENABLED(FWRETRACT) + if (axis == Z_AXIS) fwretract.current_hop = 0.0; + #endif + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); + +} // homeaxis() + +#if HAS_WORKSPACE_OFFSET + void update_workspace_offset(const AxisEnum axis) { + workspace_offset[axis] = home_offset[axis] + position_shift[axis]; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Axis ", XYZ_CHAR(axis), " home_offset = ", home_offset[axis], " position_shift = ", position_shift[axis]); + } +#endif + +#if HAS_M206_COMMAND + /** + * Change the home offset for an axis. + * Also refreshes the workspace offset. + */ + void set_home_offset(const AxisEnum axis, const float v) { + home_offset[axis] = v; + update_workspace_offset(axis); + } +#endif // HAS_M206_COMMAND diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h new file mode 100644 index 00000000..85b70c05 --- /dev/null +++ b/Marlin/src/module/motion.h @@ -0,0 +1,438 @@ +/** + * 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 + +/** + * motion.h + * + * High-level motion commands to feed the planner + * Some of these methods may migrate to the planner class. + */ + +#include "../inc/MarlinConfig.h" + +#if IS_SCARA + #include "scara.h" +#endif + +// Axis homed and known-position states +extern uint8_t axis_homed, axis_known_position; +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() { + return !TERN(HOME_AFTER_DEACTIVATE, all_axes_known, all_axes_homed)(); +} + +// Error margin to work around float imprecision +constexpr float fslop = 0.0001; + +extern bool relative_mode; + +extern xyze_pos_t current_position, // High-level current tool position + destination; // Destination for a move + +// G60/G61 Position Save and Return +#if SAVED_POSITIONS + extern uint8_t saved_slots[(SAVED_POSITIONS + 7) >> 3]; + extern xyz_pos_t stored_position[SAVED_POSITIONS]; +#endif + +// Scratch space for a cartesian result +extern xyz_pos_t cartes; + +// Until kinematics.cpp is created, declare this here +#if IS_KINEMATIC + extern abc_pos_t delta; +#endif + +#if HAS_ABL_NOT_UBL + extern float xy_probe_feedrate_mm_s; + #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s +#elif defined(XY_PROBE_SPEED) + #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED) +#else + #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() +#endif + +#if ENABLED(Z_SAFE_HOMING) + constexpr xy_float_t safe_homing_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT }; +#endif + +/** + * Feed rates are often configured with mm/m + * but the planner and stepper like mm/s units. + */ +extern const feedRate_t homing_feedrate_mm_s[XYZ]; +FORCE_INLINE feedRate_t homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); } +feedRate_t get_homing_bump_feedrate(const AxisEnum axis); + +extern feedRate_t feedrate_mm_s; + +/** + * Feedrate scaling + */ +extern int16_t feedrate_percentage; + +// The active extruder (tool). Set with T command. +#if HAS_MULTI_EXTRUDER + extern uint8_t active_extruder; +#else + constexpr uint8_t active_extruder = 0; +#endif + +#if ENABLED(LCD_SHOW_E_TOTAL) + extern float e_move_accumulator; +#endif + +#ifdef __IMXRT1062__ + #define DEFS_PROGMEM +#else + #define DEFS_PROGMEM PROGMEM +#endif + +inline float pgm_read_any(const float *p) { return TERN(__IMXRT1062__, *p, pgm_read_float(p)); } +inline int8_t pgm_read_any(const int8_t *p) { return TERN(__IMXRT1062__, *p, pgm_read_byte(p)); } + +#define XYZ_DEFS(T, NAME, OPT) \ + inline T NAME(const AxisEnum axis) { \ + static const XYZval NAME##_P DEFS_PROGMEM = { X_##OPT, Y_##OPT, Z_##OPT }; \ + return pgm_read_any(&NAME##_P[axis]); \ + } +XYZ_DEFS(float, base_min_pos, MIN_POS); +XYZ_DEFS(float, base_max_pos, MAX_POS); +XYZ_DEFS(float, base_home_pos, HOME_POS); +XYZ_DEFS(float, max_length, MAX_LENGTH); +XYZ_DEFS(int8_t, home_dir, HOME_DIR); + +inline float home_bump_mm(const AxisEnum axis) { + static const xyz_pos_t home_bump_mm_P DEFS_PROGMEM = HOMING_BUMP_MM; + return pgm_read_any(&home_bump_mm_P[axis]); +} + +#if HAS_WORKSPACE_OFFSET + void update_workspace_offset(const AxisEnum axis); +#else + inline void update_workspace_offset(const AxisEnum) {} +#endif + +#if HAS_HOTEND_OFFSET + extern xyz_pos_t hotend_offset[HOTENDS]; + void reset_hotend_offsets(); +#elif HOTENDS + constexpr xyz_pos_t hotend_offset[HOTENDS] = { { 0 } }; +#else + constexpr xyz_pos_t hotend_offset[1] = { { 0 } }; +#endif + +#if HAS_SOFTWARE_ENDSTOPS + + typedef struct { + bool _enabled, _loose; + bool enabled() { return _enabled && !_loose; } + + xyz_pos_t min, max; + void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { + amin = -100000; amax = 100000; // "No limits" + #if HAS_SOFTWARE_ENDSTOPS + if (enabled()) switch (axis) { + case X_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_X, amin = min.x); + TERN_(MAX_SOFTWARE_ENDSTOP_X, amax = max.x); + break; + case Y_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_Y, amin = min.y); + TERN_(MAX_SOFTWARE_ENDSTOP_Y, amax = max.y); + break; + case Z_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_Z, amin = min.z); + TERN_(MAX_SOFTWARE_ENDSTOP_Z, amax = max.z); + default: break; + } + #endif + } + } soft_endstops_t; + + extern soft_endstops_t soft_endstop; + void apply_motion_limits(xyz_pos_t &target); + void update_software_endstops(const AxisEnum axis + #if HAS_HOTEND_OFFSET + , const uint8_t old_tool_index=0, const uint8_t new_tool_index=0 + #endif + ); + #define SET_SOFT_ENDSTOP_LOOSE(loose) (soft_endstop._loose = loose) + +#else // !HAS_SOFTWARE_ENDSTOPS + + typedef struct { + bool enabled() { return false; } + void get_manual_axis_limits(const AxisEnum axis, float &amin, float &amax) { + // No limits + amin = current_position[axis] - 1000; + amax = current_position[axis] + 1000; + } + } soft_endstops_t; + extern soft_endstops_t soft_endstop; + #define apply_motion_limits(V) NOOP + #define update_software_endstops(...) NOOP + #define SET_SOFT_ENDSTOP_LOOSE(V) NOOP + +#endif // !HAS_SOFTWARE_ENDSTOPS + +void report_real_position(); +void report_current_position(); +void report_current_position_projected(); + +void get_cartesian_from_steppers(); +void set_current_from_steppers_for_axis(const AxisEnum axis); + +/** + * sync_plan_position + * + * Set the planner/stepper positions directly from current_position with + * no kinematic translation. Used for homing axes and cartesian/core syncing. + */ +void sync_plan_position(); +void sync_plan_position_e(); + +/** + * Move the planner to the current position from wherever it last moved + * (or from wherever it has been told it is located). + */ +void line_to_current_position(const feedRate_t &fr_mm_s=feedrate_mm_s); + +#if EXTRUDERS + void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s); +#endif + +void prepare_line_to_destination(); + +void _internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f + #if IS_KINEMATIC + , const bool is_fast=false + #endif +); + +inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { + _internal_move_to_destination(fr_mm_s); +} + +#if IS_KINEMATIC + void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s=MMS_SCALED(feedrate_mm_s)); + + inline void prepare_internal_fast_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { + _internal_move_to_destination(fr_mm_s, true); + } +#endif + +/** + * Blocking movement and shorthand functions + */ +void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); + +void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s=0.0f); + +void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } + +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } + +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 +// +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() && !homing_needed_error()) +#else + #define MOTION_CONDITIONS IsRunning() +#endif + +/** + * Workspace offsets + */ +#if HAS_HOME_OFFSET || HAS_POSITION_SHIFT + #if HAS_HOME_OFFSET + extern xyz_pos_t home_offset; + #endif + #if HAS_POSITION_SHIFT + extern xyz_pos_t position_shift; + #endif + #if HAS_HOME_OFFSET && HAS_POSITION_SHIFT + extern xyz_pos_t workspace_offset; + #define _WS workspace_offset + #elif HAS_HOME_OFFSET + #define _WS home_offset + #else + #define _WS position_shift + #endif + #define NATIVE_TO_LOGICAL(POS, AXIS) ((POS) + _WS[AXIS]) + #define LOGICAL_TO_NATIVE(POS, AXIS) ((POS) - _WS[AXIS]) + FORCE_INLINE void toLogical(xy_pos_t &raw) { raw += _WS; } + FORCE_INLINE void toLogical(xyz_pos_t &raw) { raw += _WS; } + FORCE_INLINE void toLogical(xyze_pos_t &raw) { raw += _WS; } + FORCE_INLINE void toNative(xy_pos_t &raw) { raw -= _WS; } + FORCE_INLINE void toNative(xyz_pos_t &raw) { raw -= _WS; } + FORCE_INLINE void toNative(xyze_pos_t &raw) { raw -= _WS; } +#else + #define NATIVE_TO_LOGICAL(POS, AXIS) (POS) + #define LOGICAL_TO_NATIVE(POS, AXIS) (POS) + FORCE_INLINE void toLogical(xy_pos_t&) {} + FORCE_INLINE void toLogical(xyz_pos_t&) {} + FORCE_INLINE void toLogical(xyze_pos_t&) {} + FORCE_INLINE void toNative(xy_pos_t&) {} + FORCE_INLINE void toNative(xyz_pos_t&) {} + FORCE_INLINE void toNative(xyze_pos_t&) {} +#endif +#define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) +#define LOGICAL_Y_POSITION(POS) NATIVE_TO_LOGICAL(POS, Y_AXIS) +#define LOGICAL_Z_POSITION(POS) NATIVE_TO_LOGICAL(POS, Z_AXIS) +#define RAW_X_POSITION(POS) LOGICAL_TO_NATIVE(POS, X_AXIS) +#define RAW_Y_POSITION(POS) LOGICAL_TO_NATIVE(POS, Y_AXIS) +#define RAW_Z_POSITION(POS) LOGICAL_TO_NATIVE(POS, Z_AXIS) + +/** + * position_is_reachable family of functions + */ + +#if IS_KINEMATIC // (DELTA or SCARA) + + #if HAS_SCARA_OFFSET + extern abc_pos_t scara_home_offset; // A and B angular offsets, Z mm offset + #endif + + // Return true if the given point is within the printable area + inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { + #if ENABLED(DELTA) + return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset + fslop); + #elif IS_SCARA + const float R2 = HYPOT2(rx - SCARA_OFFSET_X, ry - SCARA_OFFSET_Y); + return ( + R2 <= sq(L1 + L2) - inset + #if MIDDLE_DEAD_ZONE_R > 0 + && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) + #endif + ); + #endif + } + + inline bool position_is_reachable(const xy_pos_t &pos, const float inset=0) { + return position_is_reachable(pos.x, pos.y, inset); + } + +#else // CARTESIAN + + // Return true if the given position is within the machine bounds. + inline bool position_is_reachable(const float &rx, const float &ry) { + if (!WITHIN(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; + #if ENABLED(DUAL_X_CARRIAGE) + if (active_extruder) + return WITHIN(rx, X2_MIN_POS - fslop, X2_MAX_POS + fslop); + else + return WITHIN(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); + #else + return WITHIN(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); + #endif + } + inline bool position_is_reachable(const xy_pos_t &pos) { return position_is_reachable(pos.x, pos.y); } + +#endif // CARTESIAN + +/** + * Duplication mode + */ +#if HAS_DUPLICATION_MODE + extern bool extruder_duplication_enabled, // Used in Dual X mode 2 + mirrored_duplication_mode; // Used in Dual X mode 3 + #if ENABLED(MULTI_NOZZLE_DUPLICATION) + extern uint8_t duplication_e_mask; + #endif +#endif + +/** + * Dual X Carriage + */ +#if ENABLED(DUAL_X_CARRIAGE) + + enum DualXMode : char { + DXC_FULL_CONTROL_MODE, + DXC_AUTO_PARK_MODE, + DXC_DUPLICATION_MODE, + DXC_MIRRORED_MODE + }; + + extern DualXMode dual_x_carriage_mode; + extern float inactive_extruder_x_pos, // Used in mode 0 & 1 + duplicate_extruder_x_offset; // Used in mode 2 & 3 + extern xyz_pos_t raised_parked_position; // Used in mode 1 + extern bool active_extruder_parked; // Used in mode 1, 2 & 3 + extern millis_t delayed_move_time; // Used in mode 1 + extern int16_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 + + FORCE_INLINE bool dxc_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } + + 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; } + +#else + + #if ENABLED(MULTI_NOZZLE_DUPLICATION) + enum DualXMode : char { DXC_DUPLICATION_MODE = 2 }; + #endif + + FORCE_INLINE int x_home_dir(const uint8_t) { return home_dir(X_AXIS); } + +#endif + +#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 diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp new file mode 100644 index 00000000..4ad7c4cc --- /dev/null +++ b/Marlin/src/module/planner.cpp @@ -0,0 +1,3100 @@ +/** + * 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 . + * + */ + +/** + * planner.cpp + * + * Buffer movement commands and manage the acceleration profile plan + * + * Derived from Grbl + * Copyright (c) 2009-2011 Simen Svale Skogsrud + * + * The ring buffer implementation gleaned from the wiring_serial library by David A. Mellis. + * + * + * Reasoning behind the mathematics in this module (in the key of 'Mathematica'): + * + * s == speed, a == acceleration, t == time, d == distance + * + * Basic definitions: + * Speed[s_, a_, t_] := s + (a*t) + * Travel[s_, a_, t_] := Integrate[Speed[s, a, t], t] + * + * Distance to reach a specific speed with a constant acceleration: + * Solve[{Speed[s, a, t] == m, Travel[s, a, t] == d}, d, t] + * d -> (m^2 - s^2)/(2 a) --> estimate_acceleration_distance() + * + * Speed after a given distance of travel with constant acceleration: + * Solve[{Speed[s, a, t] == m, Travel[s, a, t] == d}, m, t] + * m -> Sqrt[2 a d + s^2] + * + * DestinationSpeed[s_, a_, d_] := Sqrt[2 a d + s^2] + * + * When to start braking (di) to reach a specified destination speed (s2) after accelerating + * from initial speed s1 without ever stopping at a plateau: + * Solve[{DestinationSpeed[s1, a, di] == DestinationSpeed[s2, a, d - di]}, di] + * di -> (2 a d - s1^2 + s2^2)/(4 a) --> intersection_distance() + * + * IntersectionDistance[s1_, s2_, a_, d_] := (2 a d - s1^2 + s2^2)/(4 a) + * + * -- + * + * The fast inverse function needed for Bézier interpolation for AVR + * was designed, written and tested by Eduardo José Tagle on April/2018 + */ + +#include "planner.h" +#include "stepper.h" +#include "motion.h" +#include "temperature.h" +#include "../lcd/ultralcd.h" +#include "../gcode/parser.h" + +#include "../MarlinCore.h" + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #include "../feature/filwidth.h" +#endif + +#if ENABLED(BARICUDA) + #include "../feature/baricuda.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" +#endif + +#if ENABLED(AUTO_POWER_CONTROL) + #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 + +#if ENABLED(CANCEL_OBJECTS) + #include "../feature/cancel_object.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/powerloss.h" +#endif + +#if HAS_CUTTER + #include "../feature/spindle_laser.h" +#endif + +// Delay for delivery of first block to the stepper ISR, if the queue contains 2 or +// fewer movements. The delay is measured in milliseconds, and must be less than 250ms +#define BLOCK_DELAY_FOR_1ST_MOVE 100 + +Planner planner; + +// public: + +/** + * A ring buffer of moves described in steps + */ +block_t Planner::block_buffer[BLOCK_BUFFER_SIZE]; +volatile uint8_t Planner::block_buffer_head, // Index of the next block to be pushed + Planner::block_buffer_nonbusy, // Index of the first non-busy block + Planner::block_buffer_planned, // Index of the optimally planned block + Planner::block_buffer_tail; // Index of the busy block, if any +uint16_t Planner::cleaning_buffer_counter; // A counter to disable queuing of blocks +uint8_t Planner::delay_before_delivering; // This counter delays delivery of blocks when queue becomes empty to allow the opportunity of merging blocks + +planner_settings_t Planner::settings; // Initialized by settings.load() + +#if ENABLED(LASER_POWER_INLINE) + laser_state_t Planner::laser_inline; // Current state for blocks +#endif + +uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2 + +float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step + +#if HAS_JUNCTION_DEVIATION + float Planner::junction_deviation_mm; // (mm) M205 J + #if HAS_LINEAR_E_JERK + float Planner::max_e_jerk[DISTINCT_E]; // Calculated from junction_deviation_mm + #endif +#endif + +#if HAS_CLASSIC_JERK + TERN(HAS_LINEAR_E_JERK, xyz_pos_t, xyze_pos_t) Planner::max_jerk; +#endif + +#if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + bool Planner::abort_on_endstop_hit = false; +#endif + +#if ENABLED(DISTINCT_E_FACTORS) + uint8_t Planner::last_extruder = 0; // Respond to extruder change +#endif + +#if ENABLED(DIRECT_STEPPING) + uint32_t Planner::last_page_step_rate = 0; + xyze_bool_t Planner::last_page_dir{0}; +#endif + +#if EXTRUDERS + int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder + float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0f); // The flow percentage and volumetric multiplier combine to scale E movement +#endif + +#if DISABLED(NO_VOLUMETRICS) + float Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder + Planner::volumetric_area_nominal = CIRCLE_AREA(float(DEFAULT_NOMINAL_FILAMENT_DIA) * 0.5f), // Nominal cross-sectional area + Planner::volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner +#endif + +#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + float Planner::volumetric_extruder_limit[EXTRUDERS], // max mm^3/sec the extruder is able to handle + Planner::volumetric_extruder_feedrate_limit[EXTRUDERS]; // pre calculated extruder feedrate limit based on volumetric_extruder_limit; pre-calculated to reduce computation in the planner +#endif + +#if HAS_LEVELING + bool Planner::leveling_active = false; // Flag that auto bed leveling is enabled + #if ABL_PLANAR + matrix_3x3 Planner::bed_level_matrix; // Transform to compensate for bed level + #endif + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + float Planner::z_fade_height, // Initialized by settings.load() + Planner::inverse_z_fade_height, + Planner::last_fade_z; + #endif +#else + constexpr bool Planner::leveling_active; +#endif + +skew_factor_t Planner::skew_factor; // Initialized by settings.load() + +#if ENABLED(AUTOTEMP) + float Planner::autotemp_max = 250, + Planner::autotemp_min = 210, + Planner::autotemp_factor = 0.1f; + bool Planner::autotemp_enabled = false; +#endif + +// private: + +xyze_long_t Planner::position{0}; + +uint32_t Planner::cutoff_long; + +xyze_float_t Planner::previous_speed; +float Planner::previous_nominal_speed_sqr; + +#if ENABLED(DISABLE_INACTIVE_EXTRUDER) + uint8_t Planner::g_uc_extruder_last_move[EXTRUDERS] = { 0 }; +#endif + +#ifdef XY_FREQUENCY_LIMIT + int8_t Planner::xy_freq_limit_hz = XY_FREQUENCY_LIMIT; + float Planner::xy_freq_min_speed_factor = (XY_FREQUENCY_MIN_PERCENT) * 0.01f; + int32_t Planner::xy_freq_min_interval_us = LROUND(1000000.0 / (XY_FREQUENCY_LIMIT)); +#endif + +#if ENABLED(LIN_ADVANCE) + float Planner::extruder_advance_K[EXTRUDERS]; // Initialized by settings.load() +#endif + +#if HAS_POSITION_FLOAT + xyze_pos_t Planner::position_float; // Needed for accurate maths. Steps cannot be used! +#endif + +#if IS_KINEMATIC + xyze_pos_t Planner::position_cart; +#endif + +#if HAS_WIRED_LCD + volatile uint32_t Planner::block_buffer_runtime_us = 0; +#endif + +/** + * Class and Instance Methods + */ + +Planner::Planner() { init(); } + +void Planner::init() { + position.reset(); + TERN_(HAS_POSITION_FLOAT, position_float.reset()); + TERN_(IS_KINEMATIC, position_cart.reset()); + previous_speed.reset(); + previous_nominal_speed_sqr = 0; + TERN_(ABL_PLANAR, bed_level_matrix.set_to_identity()); + clear_block_buffer(); + delay_before_delivering = 0; + #if ENABLED(DIRECT_STEPPING) + last_page_step_rate = 0; + last_page_dir.reset(); + #endif +} + +#if ENABLED(S_CURVE_ACCELERATION) + #ifdef __AVR__ + /** + * This routine returns 0x1000000 / d, getting the inverse as fast as possible. + * A fast-converging iterative Newton-Raphson method can reach full precision in + * just 1 iteration, and takes 211 cycles (worst case; the mean case is less, up + * to 30 cycles for small divisors), instead of the 500 cycles a normal division + * would take. + * + * Inspired by the following page: + * https://stackoverflow.com/questions/27801397/newton-raphson-division-with-big-integers + * + * Suppose we want to calculate floor(2 ^ k / B) where B is a positive integer + * Then, B must be <= 2^k, otherwise, the quotient is 0. + * + * The Newton - Raphson iteration for x = B / 2 ^ k yields: + * q[n + 1] = q[n] * (2 - q[n] * B / 2 ^ k) + * + * This can be rearranged to: + * q[n + 1] = q[n] * (2 ^ (k + 1) - q[n] * B) >> k + * + * Each iteration requires only integer multiplications and bit shifts. + * It doesn't necessarily converge to floor(2 ^ k / B) but in the worst case + * it eventually alternates between floor(2 ^ k / B) and ceil(2 ^ k / B). + * So it checks for this case and extracts floor(2 ^ k / B). + * + * A simple but important optimization for this approach is to truncate + * multiplications (i.e., calculate only the higher bits of the product) in the + * early iterations of the Newton - Raphson method. This is done so the results + * of the early iterations are far from the quotient. Then it doesn't matter if + * they are done inaccurately. + * It's important to pick a good starting value for x. Knowing how many + * digits the divisor has, it can be estimated: + * + * 2^k / x = 2 ^ log2(2^k / x) + * 2^k / x = 2 ^(log2(2^k)-log2(x)) + * 2^k / x = 2 ^(k*log2(2)-log2(x)) + * 2^k / x = 2 ^ (k-log2(x)) + * 2^k / x >= 2 ^ (k-floor(log2(x))) + * floor(log2(x)) is simply the index of the most significant bit set. + * + * If this estimation can be improved even further the number of iterations can be + * reduced a lot, saving valuable execution time. + * The paper "Software Integer Division" by Thomas L.Rodeheffer, Microsoft + * Research, Silicon Valley,August 26, 2008, available at + * https://www.microsoft.com/en-us/research/wp-content/uploads/2008/08/tr-2008-141.pdf + * suggests, for its integer division algorithm, using a table to supply the first + * 8 bits of precision, then, due to the quadratic convergence nature of the + * Newton-Raphon iteration, just 2 iterations should be enough to get maximum + * precision of the division. + * By precomputing values of inverses for small denominator values, just one + * Newton-Raphson iteration is enough to reach full precision. + * This code uses the top 9 bits of the denominator as index. + * + * The AVR assembly function implements this C code using the data below: + * + * // For small divisors, it is best to directly retrieve the results + * if (d <= 110) return pgm_read_dword(&small_inv_tab[d]); + * + * // Compute initial estimation of 0x1000000/x - + * // Get most significant bit set on divider + * uint8_t idx = 0; + * uint32_t nr = d; + * if (!(nr & 0xFF0000)) { + * nr <<= 8; idx += 8; + * if (!(nr & 0xFF0000)) { nr <<= 8; idx += 8; } + * } + * if (!(nr & 0xF00000)) { nr <<= 4; idx += 4; } + * if (!(nr & 0xC00000)) { nr <<= 2; idx += 2; } + * if (!(nr & 0x800000)) { nr <<= 1; idx += 1; } + * + * // Isolate top 9 bits of the denominator, to be used as index into the initial estimation table + * uint32_t tidx = nr >> 15, // top 9 bits. bit8 is always set + * ie = inv_tab[tidx & 0xFF] + 256, // Get the table value. bit9 is always set + * x = idx <= 8 ? (ie >> (8 - idx)) : (ie << (idx - 8)); // Position the estimation at the proper place + * + * x = uint32_t((x * uint64_t(_BV(25) - x * d)) >> 24); // Refine estimation by newton-raphson. 1 iteration is enough + * const uint32_t r = _BV(24) - x * d; // Estimate remainder + * if (r >= d) x++; // Check whether to adjust result + * return uint32_t(x); // x holds the proper estimation + */ + static uint32_t get_period_inverse(uint32_t d) { + + static const uint8_t inv_tab[256] PROGMEM = { + 255,253,252,250,248,246,244,242,240,238,236,234,233,231,229,227, + 225,224,222,220,218,217,215,213,212,210,208,207,205,203,202,200, + 199,197,195,194,192,191,189,188,186,185,183,182,180,179,178,176, + 175,173,172,170,169,168,166,165,164,162,161,160,158,157,156,154, + 153,152,151,149,148,147,146,144,143,142,141,139,138,137,136,135, + 134,132,131,130,129,128,127,126,125,123,122,121,120,119,118,117, + 116,115,114,113,112,111,110,109,108,107,106,105,104,103,102,101, + 100,99,98,97,96,95,94,93,92,91,90,89,88,88,87,86, + 85,84,83,82,81,80,80,79,78,77,76,75,74,74,73,72, + 71,70,70,69,68,67,66,66,65,64,63,62,62,61,60,59, + 59,58,57,56,56,55,54,53,53,52,51,50,50,49,48,48, + 47,46,46,45,44,43,43,42,41,41,40,39,39,38,37,37, + 36,35,35,34,33,33,32,32,31,30,30,29,28,28,27,27, + 26,25,25,24,24,23,22,22,21,21,20,19,19,18,18,17, + 17,16,15,15,14,14,13,13,12,12,11,10,10,9,9,8, + 8,7,7,6,6,5,5,4,4,3,3,2,2,1,0,0 + }; + + // For small denominators, it is cheaper to directly store the result. + // For bigger ones, just ONE Newton-Raphson iteration is enough to get + // maximum precision we need + static const uint32_t small_inv_tab[111] PROGMEM = { + 16777216,16777216,8388608,5592405,4194304,3355443,2796202,2396745,2097152,1864135,1677721,1525201,1398101,1290555,1198372,1118481, + 1048576,986895,932067,883011,838860,798915,762600,729444,699050,671088,645277,621378,599186,578524,559240,541200, + 524288,508400,493447,479349,466033,453438,441505,430185,419430,409200,399457,390167,381300,372827,364722,356962, + 349525,342392,335544,328965,322638,316551,310689,305040,299593,294337,289262,284359,279620,275036,270600,266305, + 262144,258111,254200,250406,246723,243148,239674,236298,233016,229824,226719,223696,220752,217885,215092,212369, + 209715,207126,204600,202135,199728,197379,195083,192841,190650,188508,186413,184365,182361,180400,178481,176602, + 174762,172960,171196,169466,167772,166111,164482,162885,161319,159783,158275,156796,155344,153919,152520 + }; + + // For small divisors, it is best to directly retrieve the results + if (d <= 110) return pgm_read_dword(&small_inv_tab[d]); + + uint8_t r8 = d & 0xFF, + r9 = (d >> 8) & 0xFF, + r10 = (d >> 16) & 0xFF, + r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; + const uint8_t* ptab = inv_tab; + + __asm__ __volatile__( + // %8:%7:%6 = interval + // r31:r30: MUST be those registers, and they must point to the inv_tab + + A("clr %13") // %13 = 0 + + // Now we must compute + // result = 0xFFFFFF / d + // %8:%7:%6 = interval + // %16:%15:%14 = nr + // %13 = 0 + + // A plain division of 24x24 bits should take 388 cycles to complete. We will + // use Newton-Raphson for the calculation, and will strive to get way less cycles + // for the same result - Using C division, it takes 500cycles to complete . + + A("clr %3") // idx = 0 + A("mov %14,%6") + A("mov %15,%7") + A("mov %16,%8") // nr = interval + A("tst %16") // nr & 0xFF0000 == 0 ? + A("brne 2f") // No, skip this + A("mov %16,%15") + A("mov %15,%14") // nr <<= 8, %14 not needed + A("subi %3,-8") // idx += 8 + A("tst %16") // nr & 0xFF0000 == 0 ? + A("brne 2f") // No, skip this + A("mov %16,%15") // nr <<= 8, %14 not needed + A("clr %15") // We clear %14 + A("subi %3,-8") // idx += 8 + + // here %16 != 0 and %16:%15 contains at least 9 MSBits, or both %16:%15 are 0 + L("2") + A("cpi %16,0x10") // (nr & 0xF00000) == 0 ? + A("brcc 3f") // No, skip this + A("swap %15") // Swap nibbles + A("swap %16") // Swap nibbles. Low nibble is 0 + A("mov %14, %15") + A("andi %14,0x0F") // Isolate low nibble + A("andi %15,0xF0") // Keep proper nibble in %15 + A("or %16, %14") // %16:%15 <<= 4 + A("subi %3,-4") // idx += 4 + + L("3") + A("cpi %16,0x40") // (nr & 0xC00000) == 0 ? + A("brcc 4f") // No, skip this + A("add %15,%15") + A("adc %16,%16") + A("add %15,%15") + A("adc %16,%16") // %16:%15 <<= 2 + A("subi %3,-2") // idx += 2 + + L("4") + A("cpi %16,0x80") // (nr & 0x800000) == 0 ? + A("brcc 5f") // No, skip this + A("add %15,%15") + A("adc %16,%16") // %16:%15 <<= 1 + A("inc %3") // idx += 1 + + // Now %16:%15 contains its MSBit set to 1, or %16:%15 is == 0. We are now absolutely sure + // we have at least 9 MSBits available to enter the initial estimation table + L("5") + A("add %15,%15") + A("adc %16,%16") // %16:%15 = tidx = (nr <<= 1), we lose the top MSBit (always set to 1, %16 is the index into the inverse table) + A("add r30,%16") // Only use top 8 bits + A("adc r31,%13") // r31:r30 = inv_tab + (tidx) + A("lpm %14, Z") // %14 = inv_tab[tidx] + A("ldi %15, 1") // %15 = 1 %15:%14 = inv_tab[tidx] + 256 + + // We must scale the approximation to the proper place + A("clr %16") // %16 will always be 0 here + A("subi %3,8") // idx == 8 ? + A("breq 6f") // yes, no need to scale + A("brcs 7f") // If C=1, means idx < 8, result was negative! + + // idx > 8, now %3 = idx - 8. We must perform a left shift. idx range:[1-8] + A("sbrs %3,0") // shift by 1bit position? + A("rjmp 8f") // No + A("add %14,%14") + A("adc %15,%15") // %15:16 <<= 1 + L("8") + A("sbrs %3,1") // shift by 2bit position? + A("rjmp 9f") // No + A("add %14,%14") + A("adc %15,%15") + A("add %14,%14") + A("adc %15,%15") // %15:16 <<= 1 + L("9") + A("sbrs %3,2") // shift by 4bits position? + A("rjmp 16f") // No + A("swap %15") // Swap nibbles. lo nibble of %15 will always be 0 + A("swap %14") // Swap nibbles + A("mov %12,%14") + A("andi %12,0x0F") // isolate low nibble + A("andi %14,0xF0") // and clear it + A("or %15,%12") // %15:%16 <<= 4 + L("16") + A("sbrs %3,3") // shift by 8bits position? + A("rjmp 6f") // No, we are done + A("mov %16,%15") + A("mov %15,%14") + A("clr %14") + A("jmp 6f") + + // idx < 8, now %3 = idx - 8. Get the count of bits + L("7") + A("neg %3") // %3 = -idx = count of bits to move right. idx range:[1...8] + A("sbrs %3,0") // shift by 1 bit position ? + A("rjmp 10f") // No, skip it + A("asr %15") // (bit7 is always 0 here) + A("ror %14") + L("10") + A("sbrs %3,1") // shift by 2 bit position ? + A("rjmp 11f") // No, skip it + A("asr %15") // (bit7 is always 0 here) + A("ror %14") + A("asr %15") // (bit7 is always 0 here) + A("ror %14") + L("11") + A("sbrs %3,2") // shift by 4 bit position ? + A("rjmp 12f") // No, skip it + A("swap %15") // Swap nibbles + A("andi %14, 0xF0") // Lose the lowest nibble + A("swap %14") // Swap nibbles. Upper nibble is 0 + A("or %14,%15") // Pass nibble from upper byte + A("andi %15, 0x0F") // And get rid of that nibble + L("12") + A("sbrs %3,3") // shift by 8 bit position ? + A("rjmp 6f") // No, skip it + A("mov %14,%15") + A("clr %15") + L("6") // %16:%15:%14 = initial estimation of 0x1000000 / d + + // Now, we must refine the estimation present on %16:%15:%14 using 1 iteration + // of Newton-Raphson. As it has a quadratic convergence, 1 iteration is enough + // to get more than 18bits of precision (the initial table lookup gives 9 bits of + // precision to start from). 18bits of precision is all what is needed here for result + + // %8:%7:%6 = d = interval + // %16:%15:%14 = x = initial estimation of 0x1000000 / d + // %13 = 0 + // %3:%2:%1:%0 = working accumulator + + // Compute 1<<25 - x*d. Result should never exceed 25 bits and should always be positive + A("clr %0") + A("clr %1") + A("clr %2") + A("ldi %3,2") // %3:%2:%1:%0 = 0x2000000 + A("mul %6,%14") // r1:r0 = LO(d) * LO(x) + A("sub %0,r0") + A("sbc %1,r1") + A("sbc %2,%13") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * LO(x) + A("mul %7,%14") // r1:r0 = MI(d) * LO(x) + A("sub %1,r0") + A("sbc %2,r1" ) + A("sbc %3,%13") // %3:%2:%1:%0 -= MI(d) * LO(x) << 8 + A("mul %8,%14") // r1:r0 = HI(d) * LO(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16 + A("mul %6,%15") // r1:r0 = LO(d) * MI(x) + A("sub %1,r0") + A("sbc %2,r1") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * MI(x) << 8 + A("mul %7,%15") // r1:r0 = MI(d) * MI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MI(d) * MI(x) << 16 + A("mul %8,%15") // r1:r0 = HI(d) * MI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24 + A("mul %6,%16") // r1:r0 = LO(d) * HI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= LO(d) * HI(x) << 16 + A("mul %7,%16") // r1:r0 = MI(d) * HI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MI(d) * HI(x) << 24 + // %3:%2:%1:%0 = (1<<25) - x*d [169] + + // We need to multiply that result by x, and we are only interested in the top 24bits of that multiply + + // %16:%15:%14 = x = initial estimation of 0x1000000 / d + // %3:%2:%1:%0 = (1<<25) - x*d = acc + // %13 = 0 + + // result = %11:%10:%9:%5:%4 + A("mul %14,%0") // r1:r0 = LO(x) * LO(acc) + A("mov %4,r1") + A("clr %5") + A("clr %9") + A("clr %10") + A("clr %11") // %11:%10:%9:%5:%4 = LO(x) * LO(acc) >> 8 + A("mul %15,%0") // r1:r0 = MI(x) * LO(acc) + A("add %4,r0") + A("adc %5,r1") + A("adc %9,%13") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * LO(acc) + A("mul %16,%0") // r1:r0 = HI(x) * LO(acc) + A("add %5,r0") + A("adc %9,r1") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * LO(acc) << 8 + + A("mul %14,%1") // r1:r0 = LO(x) * MIL(acc) + A("add %4,r0") + A("adc %5,r1") + A("adc %9,%13") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * MIL(acc) + A("mul %15,%1") // r1:r0 = MI(x) * MIL(acc) + A("add %5,r0") + A("adc %9,r1") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 8 + A("mul %16,%1") // r1:r0 = HI(x) * MIL(acc) + A("add %9,r0") + A("adc %10,r1") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIL(acc) << 16 + + A("mul %14,%2") // r1:r0 = LO(x) * MIH(acc) + A("add %5,r0") + A("adc %9,r1") + A("adc %10,%13") + A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * MIH(acc) << 8 + A("mul %15,%2") // r1:r0 = MI(x) * MIH(acc) + A("add %9,r0") + A("adc %10,r1") + A("adc %11,%13") // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 16 + A("mul %16,%2") // r1:r0 = HI(x) * MIH(acc) + A("add %10,r0") + A("adc %11,r1") // %11:%10:%9:%5:%4 += MI(x) * MIH(acc) << 24 + + A("mul %14,%3") // r1:r0 = LO(x) * HI(acc) + A("add %9,r0") + A("adc %10,r1") + A("adc %11,%13") // %11:%10:%9:%5:%4 = LO(x) * HI(acc) << 16 + A("mul %15,%3") // r1:r0 = MI(x) * HI(acc) + A("add %10,r0") + A("adc %11,r1") // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 24 + A("mul %16,%3") // r1:r0 = HI(x) * HI(acc) + A("add %11,r0") // %11:%10:%9:%5:%4 += MI(x) * HI(acc) << 32 + + // At this point, %11:%10:%9 contains the new estimation of x. + + // Finally, we must correct the result. Estimate remainder as + // (1<<24) - x*d + // %11:%10:%9 = x + // %8:%7:%6 = d = interval" "\n\t" + A("ldi %3,1") + A("clr %2") + A("clr %1") + A("clr %0") // %3:%2:%1:%0 = 0x1000000 + A("mul %6,%9") // r1:r0 = LO(d) * LO(x) + A("sub %0,r0") + A("sbc %1,r1") + A("sbc %2,%13") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * LO(x) + A("mul %7,%9") // r1:r0 = MI(d) * LO(x) + A("sub %1,r0") + A("sbc %2,r1") + A("sbc %3,%13") // %3:%2:%1:%0 -= MI(d) * LO(x) << 8 + A("mul %8,%9") // r1:r0 = HI(d) * LO(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MIL(d) * LO(x) << 16 + A("mul %6,%10") // r1:r0 = LO(d) * MI(x) + A("sub %1,r0") + A("sbc %2,r1") + A("sbc %3,%13") // %3:%2:%1:%0 -= LO(d) * MI(x) << 8 + A("mul %7,%10") // r1:r0 = MI(d) * MI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= MI(d) * MI(x) << 16 + A("mul %8,%10") // r1:r0 = HI(d) * MI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MIL(d) * MI(x) << 24 + A("mul %6,%11") // r1:r0 = LO(d) * HI(x) + A("sub %2,r0") + A("sbc %3,r1") // %3:%2:%1:%0 -= LO(d) * HI(x) << 16 + A("mul %7,%11") // r1:r0 = MI(d) * HI(x) + A("sub %3,r0") // %3:%2:%1:%0 -= MI(d) * HI(x) << 24 + // %3:%2:%1:%0 = r = (1<<24) - x*d + // %8:%7:%6 = d = interval + + // Perform the final correction + A("sub %0,%6") + A("sbc %1,%7") + A("sbc %2,%8") // r -= d + A("brcs 14f") // if ( r >= d) + + // %11:%10:%9 = x + A("ldi %3,1") + A("add %9,%3") + A("adc %10,%13") + A("adc %11,%13") // x++ + L("14") + + // Estimation is done. %11:%10:%9 = x + A("clr __zero_reg__") // Make C runtime happy + // [211 cycles total] + : "=r" (r2), + "=r" (r3), + "=r" (r4), + "=d" (r5), + "=r" (r6), + "=r" (r7), + "+r" (r8), + "+r" (r9), + "+r" (r10), + "=d" (r11), + "=r" (r12), + "=r" (r13), + "=d" (r14), + "=d" (r15), + "=d" (r16), + "=d" (r17), + "=d" (r18), + "+z" (ptab) + : + : "r0", "r1", "cc" + ); + + // Return the result + return r11 | (uint16_t(r12) << 8) | (uint32_t(r13) << 16); + } + #else + // All other 32-bit MPUs can easily do inverse using hardware division, + // so we don't need to reduce precision or to use assembly language at all. + // This routine, for all other archs, returns 0x100000000 / d ~= 0xFFFFFFFF / d + static FORCE_INLINE uint32_t get_period_inverse(const uint32_t d) { + return d ? 0xFFFFFFFF / d : 0xFFFFFFFF; + } + #endif +#endif + +#define MINIMAL_STEP_RATE 120 + +/** + * Get the current block for processing + * and mark the block as busy. + * Return nullptr if the buffer is empty + * or if there is a first-block delay. + * + * WARNING: Called from Stepper ISR context! + */ +block_t* Planner::get_current_block() { + // Get the number of moves in the planner queue so far + const uint8_t nr_moves = movesplanned(); + + // If there are any moves queued ... + if (nr_moves) { + + // If there is still delay of delivery of blocks running, decrement it + if (delay_before_delivering) { + --delay_before_delivering; + // If the number of movements queued is less than 3, and there is still time + // to wait, do not deliver anything + if (nr_moves < 3 && delay_before_delivering) return nullptr; + delay_before_delivering = 0; + } + + // If we are here, there is no excuse to deliver the block + block_t * const block = &block_buffer[block_buffer_tail]; + + // No trapezoid calculated? Don't execute yet. + if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) return nullptr; + + // We can't be sure how long an active block will take, so don't count it. + TERN_(HAS_WIRED_LCD, block_buffer_runtime_us -= block->segment_time_us); + + // As this block is busy, advance the nonbusy block pointer + block_buffer_nonbusy = next_block_index(block_buffer_tail); + + // Push block_buffer_planned pointer, if encountered. + if (block_buffer_tail == block_buffer_planned) + block_buffer_planned = block_buffer_nonbusy; + + // Return the block + return block; + } + + // The queue became empty + TERN_(HAS_WIRED_LCD, clear_block_buffer_runtime()); // paranoia. Buffer is empty now - so reset accumulated time to zero. + + return nullptr; +} + +/** + * Calculate trapezoid parameters, multiplying the entry- and exit-speeds + * by the provided factors. + ** + * ############ VERY IMPORTANT ############ + * NOTE that the PRECONDITION to call this function is that the block is + * NOT BUSY and it is marked as RECALCULATE. That WARRANTIES the Stepper ISR + * is not and will not use the block while we modify it, so it is safe to + * alter its values. + */ +void Planner::calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor) { + + uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), + final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) + + // Limit minimal step rate (Otherwise the timer will overflow.) + NOLESS(initial_rate, uint32_t(MINIMAL_STEP_RATE)); + NOLESS(final_rate, uint32_t(MINIMAL_STEP_RATE)); + + #if ENABLED(S_CURVE_ACCELERATION) + uint32_t cruise_rate = initial_rate; + #endif + + const int32_t accel = block->acceleration_steps_per_s2; + + // Steps required for acceleration, deceleration to/from nominal rate + uint32_t accelerate_steps = CEIL(estimate_acceleration_distance(initial_rate, block->nominal_rate, accel)), + decelerate_steps = FLOOR(estimate_acceleration_distance(block->nominal_rate, final_rate, -accel)); + // Steps between acceleration and deceleration, if any + int32_t plateau_steps = block->step_event_count - accelerate_steps - decelerate_steps; + + // Does accelerate_steps + decelerate_steps exceed step_event_count? + // Then we can't possibly reach the nominal rate, there will be no cruising. + // Use intersection_distance() to calculate accel / braking time in order to + // reach the final_rate exactly at the end of this block. + if (plateau_steps < 0) { + const float accelerate_steps_float = CEIL(intersection_distance(initial_rate, final_rate, accel, block->step_event_count)); + accelerate_steps = _MIN(uint32_t(_MAX(accelerate_steps_float, 0)), block->step_event_count); + plateau_steps = 0; + + #if ENABLED(S_CURVE_ACCELERATION) + // We won't reach the cruising rate. Let's calculate the speed we will reach + cruise_rate = final_speed(initial_rate, accel, accelerate_steps); + #endif + } + #if ENABLED(S_CURVE_ACCELERATION) + else // We have some plateau time, so the cruise rate will be the nominal rate + cruise_rate = block->nominal_rate; + #endif + + #if ENABLED(S_CURVE_ACCELERATION) + // Jerk controlled speed requires to express speed versus time, NOT steps + uint32_t acceleration_time = ((float)(cruise_rate - initial_rate) / accel) * (STEPPER_TIMER_RATE), + deceleration_time = ((float)(cruise_rate - final_rate) / accel) * (STEPPER_TIMER_RATE), + // And to offload calculations from the ISR, we also calculate the inverse of those times here + acceleration_time_inverse = get_period_inverse(acceleration_time), + deceleration_time_inverse = get_period_inverse(deceleration_time); + #endif + + // Store new block parameters + block->accelerate_until = accelerate_steps; + block->decelerate_after = accelerate_steps + plateau_steps; + block->initial_rate = initial_rate; + #if ENABLED(S_CURVE_ACCELERATION) + block->acceleration_time = acceleration_time; + block->deceleration_time = deceleration_time; + block->acceleration_time_inverse = acceleration_time_inverse; + block->deceleration_time_inverse = deceleration_time_inverse; + block->cruise_rate = cruise_rate; + #endif + block->final_rate = final_rate; + + /** + * Laser trapezoid calculations + * + * Approximate the trapezoid with the laser, incrementing the power every `entry_per` while accelerating + * and decrementing it every `exit_power_per` while decelerating, thus ensuring power is related to feedrate. + * + * LASER_POWER_INLINE_TRAPEZOID_CONT doesn't need this as it continuously approximates + * + * Note this may behave unreliably when running with S_CURVE_ACCELERATION + */ + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + if (block->laser.power > 0) { // No need to care if power == 0 + const uint8_t entry_power = block->laser.power * entry_factor; // Power on block entry + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + // Speedup power + const uint8_t entry_power_diff = block->laser.power - entry_power; + if (entry_power_diff) { + block->laser.entry_per = accelerate_steps / entry_power_diff; + block->laser.power_entry = entry_power; + } + else { + block->laser.entry_per = 0; + block->laser.power_entry = block->laser.power; + } + // Slowdown power + const uint8_t exit_power = block->laser.power * exit_factor, // Power on block entry + exit_power_diff = block->laser.power - exit_power; + if (exit_power_diff) { + block->laser.exit_per = (block->step_event_count - block->decelerate_after) / exit_power_diff; + block->laser.power_exit = exit_power; + } + else { + block->laser.exit_per = 0; + block->laser.power_exit = block->laser.power; + } + #else + block->laser.power_entry = entry_power; + #endif + } + #endif +} + +/* PLANNER SPEED DEFINITION + +--------+ <- current->nominal_speed + / \ + current->entry_speed -> + \ + | + <- next->entry_speed (aka exit speed) + +-------------+ + time --> + + Recalculates the motion plan according to the following basic guidelines: + + 1. Go over every feasible block sequentially in reverse order and calculate the junction speeds + (i.e. current->entry_speed) such that: + a. No junction speed exceeds the pre-computed maximum junction speed limit or nominal speeds of + neighboring blocks. + b. A block entry speed cannot exceed one reverse-computed from its exit speed (next->entry_speed) + with a maximum allowable deceleration over the block travel distance. + c. The last (or newest appended) block is planned from a complete stop (an exit speed of zero). + 2. Go over every block in chronological (forward) order and dial down junction speed values if + a. The exit speed exceeds the one forward-computed from its entry speed with the maximum allowable + acceleration over the block travel distance. + + When these stages are complete, the planner will have maximized the velocity profiles throughout the all + of the planner blocks, where every block is operating at its maximum allowable acceleration limits. In + other words, for all of the blocks in the planner, the plan is optimal and no further speed improvements + are possible. If a new block is added to the buffer, the plan is recomputed according to the said + guidelines for a new optimal plan. + + To increase computational efficiency of these guidelines, a set of planner block pointers have been + created to indicate stop-compute points for when the planner guidelines cannot logically make any further + changes or improvements to the plan when in normal operation and new blocks are streamed and added to the + planner buffer. For example, if a subset of sequential blocks in the planner have been planned and are + bracketed by junction velocities at their maximums (or by the first planner block as well), no new block + added to the planner buffer will alter the velocity profiles within them. So we no longer have to compute + them. Or, if a set of sequential blocks from the first block in the planner (or a optimal stop-compute + point) are all accelerating, they are all optimal and can not be altered by a new block added to the + planner buffer, as this will only further increase the plan speed to chronological blocks until a maximum + junction velocity is reached. However, if the operational conditions of the plan changes from infrequently + used feed holds or feedrate overrides, the stop-compute pointers will be reset and the entire plan is + recomputed as stated in the general guidelines. + + Planner buffer index mapping: + - block_buffer_tail: Points to the beginning of the planner buffer. First to be executed or being executed. + - block_buffer_head: Points to the buffer block after the last block in the buffer. Used to indicate whether + the buffer is full or empty. As described for standard ring buffers, this block is always empty. + - block_buffer_planned: Points to the first buffer block after the last optimally planned block for normal + streaming operating conditions. Use for planning optimizations by avoiding recomputing parts of the + planner buffer that don't change with the addition of a new block, as describe above. In addition, + this block can never be less than block_buffer_tail and will always be pushed forward and maintain + this requirement when encountered by the Planner::release_current_block() routine during a cycle. + + NOTE: Since the planner only computes on what's in the planner buffer, some motions with lots of short + line segments, like G2/3 arcs or complex curves, may seem to move slow. This is because there simply isn't + enough combined distance traveled in the entire buffer to accelerate up to the nominal speed and then + decelerate to a complete stop at the end of the buffer, as stated by the guidelines. If this happens and + becomes an annoyance, there are a few simple solutions: (1) Maximize the machine acceleration. The planner + will be able to compute higher velocity profiles within the same combined distance. (2) Maximize line + motion(s) distance per block to a desired tolerance. The more combined distance the planner has to use, + the faster it can go. (3) Maximize the planner buffer size. This also will increase the combined distance + for the planner to compute over. It also increases the number of computations the planner has to perform + to compute an optimal plan, so select carefully. +*/ + +// The kernel called by recalculate() when scanning the plan from last to first entry. +void Planner::reverse_pass_kernel(block_t* const current, const block_t * const next) { + if (current) { + // If entry speed is already at the maximum entry speed, and there was no change of speed + // in the next block, there is no need to recheck. Block is cruising and there is no need to + // compute anything for this block, + // If not, block entry speed needs to be recalculated to ensure maximum possible planned speed. + const float max_entry_speed_sqr = current->max_entry_speed_sqr; + + // Compute maximum entry speed decelerating over the current block from its exit speed. + // If not at the maximum entry speed, or the previous block entry speed changed + if (current->entry_speed_sqr != max_entry_speed_sqr || (next && TEST(next->flag, BLOCK_BIT_RECALCULATE))) { + + // If nominal length true, max junction speed is guaranteed to be reached. + // If a block can de/ac-celerate from nominal speed to zero within the length of the block, then + // the current block and next block junction speeds are guaranteed to always be at their maximum + // junction speeds in deceleration and acceleration, respectively. This is due to how the current + // block nominal speed limits both the current and next maximum junction speeds. Hence, in both + // the reverse and forward planners, the corresponding block junction speed will always be at the + // the maximum junction speed and may always be ignored for any speed reduction checks. + + const float new_entry_speed_sqr = TEST(current->flag, BLOCK_BIT_NOMINAL_LENGTH) + ? max_entry_speed_sqr + : _MIN(max_entry_speed_sqr, max_allowable_speed_sqr(-current->acceleration, next ? next->entry_speed_sqr : sq(float(MINIMUM_PLANNER_SPEED)), current->millimeters)); + if (current->entry_speed_sqr != new_entry_speed_sqr) { + + // Need to recalculate the block speed - Mark it now, so the stepper + // ISR does not consume the block before being recalculated + SBI(current->flag, BLOCK_BIT_RECALCULATE); + + // But there is an inherent race condition here, as the block may have + // become BUSY just before being marked RECALCULATE, so check for that! + if (stepper.is_block_busy(current)) { + // Block became busy. Clear the RECALCULATE flag (no point in + // recalculating BUSY blocks). And don't set its speed, as it can't + // be updated at this time. + CBI(current->flag, BLOCK_BIT_RECALCULATE); + } + else { + // Block is not BUSY so this is ahead of the Stepper ISR: + // Just Set the new entry speed. + current->entry_speed_sqr = new_entry_speed_sqr; + } + } + } + } +} + +/** + * recalculate() needs to go over the current plan twice. + * Once in reverse and once forward. This implements the reverse pass. + */ +void Planner::reverse_pass() { + // Initialize block index to the last block in the planner buffer. + uint8_t block_index = prev_block_index(block_buffer_head); + + // Read the index of the last buffer planned block. + // The ISR may change it so get a stable local copy. + uint8_t planned_block_index = block_buffer_planned; + + // If there was a race condition and block_buffer_planned was incremented + // or was pointing at the head (queue empty) break loop now and avoid + // planning already consumed blocks + if (planned_block_index == block_buffer_head) return; + + // Reverse Pass: Coarsely maximize all possible deceleration curves back-planning from the last + // block in buffer. Cease planning when the last optimal planned or tail pointer is reached. + // NOTE: Forward pass will later refine and correct the reverse pass to create an optimal plan. + const block_t *next = nullptr; + while (block_index != planned_block_index) { + + // Perform the reverse pass + block_t *current = &block_buffer[block_index]; + + // Only consider non sync and page blocks + if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(current)) { + reverse_pass_kernel(current, next); + next = current; + } + + // Advance to the next + block_index = prev_block_index(block_index); + + // The ISR could advance the block_buffer_planned while we were doing the reverse pass. + // We must try to avoid using an already consumed block as the last one - So follow + // changes to the pointer and make sure to limit the loop to the currently busy block + while (planned_block_index != block_buffer_planned) { + + // If we reached the busy block or an already processed block, break the loop now + if (block_index == planned_block_index) return; + + // Advance the pointer, following the busy block + planned_block_index = next_block_index(planned_block_index); + } + } +} + +// The kernel called by recalculate() when scanning the plan from first to last entry. +void Planner::forward_pass_kernel(const block_t* const previous, block_t* const current, const uint8_t block_index) { + if (previous) { + // If the previous block is an acceleration block, too short to complete the full speed + // change, adjust the entry speed accordingly. Entry speeds have already been reset, + // maximized, and reverse-planned. If nominal length is set, max junction speed is + // guaranteed to be reached. No need to recheck. + if (!TEST(previous->flag, BLOCK_BIT_NOMINAL_LENGTH) && + previous->entry_speed_sqr < current->entry_speed_sqr) { + + // Compute the maximum allowable speed + const float new_entry_speed_sqr = max_allowable_speed_sqr(-previous->acceleration, previous->entry_speed_sqr, previous->millimeters); + + // If true, current block is full-acceleration and we can move the planned pointer forward. + if (new_entry_speed_sqr < current->entry_speed_sqr) { + + // Mark we need to recompute the trapezoidal shape, and do it now, + // so the stepper ISR does not consume the block before being recalculated + SBI(current->flag, BLOCK_BIT_RECALCULATE); + + // But there is an inherent race condition here, as the block maybe + // became BUSY, just before it was marked as RECALCULATE, so check + // if that is the case! + if (stepper.is_block_busy(current)) { + // Block became busy. Clear the RECALCULATE flag (no point in + // recalculating BUSY blocks and don't set its speed, as it can't + // be updated at this time. + CBI(current->flag, BLOCK_BIT_RECALCULATE); + } + else { + // Block is not BUSY, we won the race against the Stepper ISR: + + // Always <= max_entry_speed_sqr. Backward pass sets this. + current->entry_speed_sqr = new_entry_speed_sqr; // Always <= max_entry_speed_sqr. Backward pass sets this. + + // Set optimal plan pointer. + block_buffer_planned = block_index; + } + } + } + + // Any block set at its maximum entry speed also creates an optimal plan up to this + // point in the buffer. When the plan is bracketed by either the beginning of the + // buffer and a maximum entry speed or two maximum entry speeds, every block in between + // cannot logically be further improved. Hence, we don't have to recompute them anymore. + if (current->entry_speed_sqr == current->max_entry_speed_sqr) + block_buffer_planned = block_index; + } +} + +/** + * recalculate() needs to go over the current plan twice. + * Once in reverse and once forward. This implements the forward pass. + */ +void Planner::forward_pass() { + + // Forward Pass: Forward plan the acceleration curve from the planned pointer onward. + // Also scans for optimal plan breakpoints and appropriately updates the planned pointer. + + // Begin at buffer planned pointer. Note that block_buffer_planned can be modified + // by the stepper ISR, so read it ONCE. It it guaranteed that block_buffer_planned + // will never lead head, so the loop is safe to execute. Also note that the forward + // pass will never modify the values at the tail. + uint8_t block_index = block_buffer_planned; + + block_t *block; + const block_t * previous = nullptr; + while (block_index != block_buffer_head) { + + // Perform the forward pass + block = &block_buffer[block_index]; + + // Skip SYNC and page blocks + if (!TEST(block->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(block)) { + // If there's no previous block or the previous block is not + // BUSY (thus, modifiable) run the forward_pass_kernel. Otherwise, + // the previous block became BUSY, so assume the current block's + // entry speed can't be altered (since that would also require + // updating the exit speed of the previous block). + if (!previous || !stepper.is_block_busy(previous)) + forward_pass_kernel(previous, block, block_index); + previous = block; + } + // Advance to the previous + block_index = next_block_index(block_index); + } +} + +/** + * Recalculate the trapezoid speed profiles for all blocks in the plan + * according to the entry_factor for each junction. Must be called by + * recalculate() after updating the blocks. + */ +void Planner::recalculate_trapezoids() { + // The tail may be changed by the ISR so get a local copy. + uint8_t block_index = block_buffer_tail, + head_block_index = block_buffer_head; + // Since there could be a sync block in the head of the queue, and the + // next loop must not recalculate the head block (as it needs to be + // specially handled), scan backwards to the first non-SYNC block. + while (head_block_index != block_index) { + + // Go back (head always point to the first free block) + const uint8_t prev_index = prev_block_index(head_block_index); + + // Get the pointer to the block + block_t *prev = &block_buffer[prev_index]; + + // If not dealing with a sync block, we are done. The last block is not a SYNC block + if (!TEST(prev->flag, BLOCK_BIT_SYNC_POSITION)) break; + + // Examine the previous block. This and all following are SYNC blocks + head_block_index = prev_index; + } + + // Go from the tail (currently executed block) to the first block, without including it) + block_t *block = nullptr, *next = nullptr; + float current_entry_speed = 0.0, next_entry_speed = 0.0; + while (block_index != head_block_index) { + + next = &block_buffer[block_index]; + + // Skip sync and page blocks + if (!TEST(next->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(next)) { + next_entry_speed = SQRT(next->entry_speed_sqr); + + if (block) { + // Recalculate if current block entry or exit junction speed has changed. + if (TEST(block->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) { + + // Mark the current block as RECALCULATE, to protect it from the Stepper ISR running it. + // Note that due to the above condition, there's a chance the current block isn't marked as + // RECALCULATE yet, but the next one is. That's the reason for the following line. + SBI(block->flag, BLOCK_BIT_RECALCULATE); + + // But there is an inherent race condition here, as the block maybe + // became BUSY, just before it was marked as RECALCULATE, so check + // if that is the case! + if (!stepper.is_block_busy(block)) { + // Block is not BUSY, we won the race against the Stepper ISR: + + // NOTE: Entry and exit factors always > 0 by all previous logic operations. + const float current_nominal_speed = SQRT(block->nominal_speed_sqr), + nomr = 1.0f / current_nominal_speed; + calculate_trapezoid_for_block(block, current_entry_speed * nomr, next_entry_speed * nomr); + #if ENABLED(LIN_ADVANCE) + if (block->use_advance_lead) { + const float comp = block->e_D_ratio * extruder_advance_K[active_extruder] * settings.axis_steps_per_mm[E_AXIS]; + block->max_adv_steps = current_nominal_speed * comp; + block->final_adv_steps = next_entry_speed * comp; + } + #endif + } + + // Reset current only to ensure next trapezoid is computed - The + // stepper is free to use the block from now on. + CBI(block->flag, BLOCK_BIT_RECALCULATE); + } + } + + block = next; + current_entry_speed = next_entry_speed; + } + + block_index = next_block_index(block_index); + } + + // Last/newest block in buffer. Exit speed is set with MINIMUM_PLANNER_SPEED. Always recalculated. + if (next) { + + // Mark the next(last) block as RECALCULATE, to prevent the Stepper ISR running it. + // As the last block is always recalculated here, there is a chance the block isn't + // marked as RECALCULATE yet. That's the reason for the following line. + SBI(next->flag, BLOCK_BIT_RECALCULATE); + + // But there is an inherent race condition here, as the block maybe + // became BUSY, just before it was marked as RECALCULATE, so check + // if that is the case! + if (!stepper.is_block_busy(block)) { + // Block is not BUSY, we won the race against the Stepper ISR: + + const float next_nominal_speed = SQRT(next->nominal_speed_sqr), + nomr = 1.0f / next_nominal_speed; + calculate_trapezoid_for_block(next, next_entry_speed * nomr, float(MINIMUM_PLANNER_SPEED) * nomr); + #if ENABLED(LIN_ADVANCE) + if (next->use_advance_lead) { + const float comp = next->e_D_ratio * extruder_advance_K[active_extruder] * settings.axis_steps_per_mm[E_AXIS]; + next->max_adv_steps = next_nominal_speed * comp; + next->final_adv_steps = (MINIMUM_PLANNER_SPEED) * comp; + } + #endif + } + + // Reset next only to ensure its trapezoid is computed - The stepper is free to use + // the block from now on. + CBI(next->flag, BLOCK_BIT_RECALCULATE); + } +} + +void Planner::recalculate() { + // Initialize block index to the last block in the planner buffer. + const uint8_t block_index = prev_block_index(block_buffer_head); + // If there is just one block, no planning can be done. Avoid it! + if (block_index != block_buffer_planned) { + reverse_pass(); + forward_pass(); + } + recalculate_trapezoids(); +} + +#if ENABLED(AUTOTEMP) + + void Planner::getHighESpeed() { + static float oldt = 0; + + if (!autotemp_enabled) return; + if (thermalManager.degTargetHotend(0) + 2 < autotemp_min) return; // probably temperature set to zero. + + float high = 0.0; + for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { + block_t* block = &block_buffer[b]; + if (block->steps.x || block->steps.y || block->steps.z) { + const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; + NOLESS(high, se); + } + } + + float t = autotemp_min + high * autotemp_factor; + LIMIT(t, autotemp_min, autotemp_max); + if (t < oldt) t = t * (1 - float(AUTOTEMP_OLDWEIGHT)) + oldt * float(AUTOTEMP_OLDWEIGHT); + oldt = t; + thermalManager.setTargetHotend(t, 0); + } + +#endif // AUTOTEMP + +/** + * Maintain fans, paste extruder pressure, + */ +void Planner::check_axes_activity() { + + #if ANY(DISABLE_X, DISABLE_Y, DISABLE_Z, DISABLE_E) + xyze_bool_t axis_active = { false }; + #endif + + #if HAS_FAN + uint8_t tail_fan_speed[FAN_COUNT]; + #endif + + #if ENABLED(BARICUDA) + #if HAS_HEATER_1 + uint8_t tail_valve_pressure; + #endif + #if HAS_HEATER_2 + uint8_t tail_e_to_p_pressure; + #endif + #endif + + if (has_blocks_queued()) { + + #if HAS_FAN || ENABLED(BARICUDA) + block_t *block = &block_buffer[block_buffer_tail]; + #endif + + #if HAS_FAN + FANS_LOOP(i) + tail_fan_speed[i] = thermalManager.scaledFanSpeed(i, block->fan_speed[i]); + #endif + + #if ENABLED(BARICUDA) + TERN_(HAS_HEATER_1, tail_valve_pressure = block->valve_pressure); + TERN_(HAS_HEATER_2, tail_e_to_p_pressure = block->e_to_p_pressure); + #endif + + #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_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 + } + else { + + TERN_(HAS_CUTTER, cutter.refresh()); + + #if HAS_FAN + FANS_LOOP(i) + tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); + #endif + + #if ENABLED(BARICUDA) + TERN_(HAS_HEATER_1, tail_valve_pressure = baricuda_valve_pressure); + TERN_(HAS_HEATER_2, tail_e_to_p_pressure = baricuda_e_to_p_pressure); + #endif + } + + // + // Disable inactive axes + // + if (TERN0(DISABLE_X, !axis_active.x)) DISABLE_AXIS_X(); + if (TERN0(DISABLE_Y, !axis_active.y)) DISABLE_AXIS_Y(); + if (TERN0(DISABLE_Z, !axis_active.z)) DISABLE_AXIS_Z(); + if (TERN0(DISABLE_E, !axis_active.e)) disable_e_steppers(); + + // + // Update Fan speeds + // + #if HAS_FAN + + #if FAN_KICKSTART_TIME > 0 + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; + #define KICKSTART_FAN(f) \ + if (tail_fan_speed[f]) { \ + millis_t ms = millis(); \ + if (fan_kick_end[f] == 0) { \ + fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \ + tail_fan_speed[f] = 255; \ + } else if (PENDING(ms, fan_kick_end[f])) \ + tail_fan_speed[f] = 255; \ + } else fan_kick_end[f] = 0 + #else + #define KICKSTART_FAN(f) NOOP + #endif + + #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 + #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? map(tail_fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) + #else + #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ?: FAN_OFF_PWM) + #endif + + #if ENABLED(FAN_SOFT_PWM) + #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F); + #elif ENABLED(FAST_PWM_FAN) + #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); + #else + #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); + #endif + #define FAN_SET(F) do{ KICKSTART_FAN(F); _FAN_SET(F); }while(0) + + TERN_(HAS_FAN0, FAN_SET(0)); + TERN_(HAS_FAN1, FAN_SET(1)); + TERN_(HAS_FAN2, FAN_SET(2)); + TERN_(HAS_FAN3, FAN_SET(3)); + TERN_(HAS_FAN4, FAN_SET(4)); + TERN_(HAS_FAN5, FAN_SET(5)); + TERN_(HAS_FAN6, FAN_SET(6)); + TERN_(HAS_FAN7, FAN_SET(7)); + #endif // HAS_FAN + + TERN_(AUTOTEMP, getHighESpeed()); + + #if ENABLED(BARICUDA) + TERN_(HAS_HEATER_1, analogWrite(pin_t(HEATER_1_PIN), tail_valve_pressure)); + TERN_(HAS_HEATER_2, analogWrite(pin_t(HEATER_2_PIN), tail_e_to_p_pressure)); + #endif +} + +#if DISABLED(NO_VOLUMETRICS) + + /** + * Get a volumetric multiplier from a filament diameter. + * This is the reciprocal of the circular cross-section area. + * Return 1.0 with volumetric off or a diameter of 0.0. + */ + inline float calculate_volumetric_multiplier(const float &diameter) { + return (parser.volumetric_enabled && diameter) ? 1.0f / CIRCLE_AREA(diameter * 0.5f) : 1; + } + + /** + * Convert the filament sizes into volumetric multipliers. + * The multiplier converts a given E value into a length. + */ + void Planner::calculate_volumetric_multipliers() { + LOOP_L_N(i, COUNT(filament_size)) { + volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]); + refresh_e_factor(i); + } + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + calculate_volumetric_extruder_limits(); // update volumetric_extruder_limits as well. + #endif + } + +#endif // !NO_VOLUMETRICS + +#if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + + /** + * Convert volumetric based limits into pre calculated extruder feedrate limits. + */ + void Planner::calculate_volumetric_extruder_limit(const uint8_t e) { + const float &lim = volumetric_extruder_limit[e], &siz = filament_size[e]; + volumetric_extruder_feedrate_limit[e] = (lim && siz) ? lim / CIRCLE_AREA(siz * 0.5f) : 0; + } + void Planner::calculate_volumetric_extruder_limits() { + LOOP_L_N(e, EXTRUDERS) calculate_volumetric_extruder_limit(e); + } + +#endif + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + /** + * Convert the ratio value given by the filament width sensor + * into a volumetric multiplier. Conversion differs when using + * linear extrusion vs volumetric extrusion. + */ + void Planner::apply_filament_width_sensor(const int8_t encoded_ratio) { + // Reconstitute the nominal/measured ratio + const float nom_meas_ratio = 1 + 0.01f * encoded_ratio, + ratio_2 = sq(nom_meas_ratio); + + volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = parser.volumetric_enabled + ? ratio_2 / CIRCLE_AREA(filwidth.nominal_mm * 0.5f) // Volumetric uses a true volumetric multiplier + : ratio_2; // Linear squares the ratio, which scales the volume + + refresh_e_factor(FILAMENT_SENSOR_EXTRUDER_NUM); + } +#endif + +#if HAS_LEVELING + + constexpr xy_pos_t level_fulcrum = { + TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_X_POINT, X_HOME_POS), + TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_Y_POINT, Y_HOME_POS) + }; + + /** + * rx, ry, rz - Cartesian positions in mm + * Leveled XYZ on completion + */ + void Planner::apply_leveling(xyz_pos_t &raw) { + if (!leveling_active) return; + + #if ABL_PLANAR + + xy_pos_t d = raw - level_fulcrum; + apply_rotation_xyz(bed_level_matrix, d.x, d.y, raw.z); + raw = d + level_fulcrum; + + #elif HAS_MESH + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + const float fade_scaling_factor = fade_scaling_factor_for_z(raw.z); + #elif DISABLED(MESH_BED_LEVELING) + constexpr float fade_scaling_factor = 1.0; + #endif + + raw.z += ( + #if ENABLED(MESH_BED_LEVELING) + mbl.get_z(raw + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + , fade_scaling_factor + #endif + ) + #elif ENABLED(AUTO_BED_LEVELING_UBL) + fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw) : 0.0 + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + fade_scaling_factor ? fade_scaling_factor * bilinear_z_offset(raw) : 0.0 + #endif + ); + + #endif + } + + void Planner::unapply_leveling(xyz_pos_t &raw) { + + if (leveling_active) { + + #if ABL_PLANAR + + matrix_3x3 inverse = matrix_3x3::transpose(bed_level_matrix); + + xy_pos_t d = raw - level_fulcrum; + apply_rotation_xyz(inverse, d.x, d.y, raw.z); + raw = d + level_fulcrum; + + #elif HAS_MESH + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + const float fade_scaling_factor = fade_scaling_factor_for_z(raw.z); + #elif DISABLED(MESH_BED_LEVELING) + constexpr float fade_scaling_factor = 1.0; + #endif + + raw.z -= ( + #if ENABLED(MESH_BED_LEVELING) + mbl.get_z(raw + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + , fade_scaling_factor + #endif + ) + #elif ENABLED(AUTO_BED_LEVELING_UBL) + fade_scaling_factor ? fade_scaling_factor * ubl.get_z_correction(raw) : 0.0 + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + fade_scaling_factor ? fade_scaling_factor * bilinear_z_offset(raw) : 0.0 + #endif + ); + + #endif + } + } + +#endif // HAS_LEVELING + +#if ENABLED(FWRETRACT) + /** + * rz, e - Cartesian positions in mm + */ + void Planner::apply_retract(float &rz, float &e) { + rz += fwretract.current_hop; + e -= fwretract.current_retract[active_extruder]; + } + + void Planner::unapply_retract(float &rz, float &e) { + rz -= fwretract.current_hop; + e += fwretract.current_retract[active_extruder]; + } + +#endif + +void Planner::quick_stop() { + + // Remove all the queued blocks. Note that this function is NOT + // called from the Stepper ISR, so we must consider tail as readonly! + // that is why we set head to tail - But there is a race condition that + // must be handled: The tail could change between the read and the assignment + // so this must be enclosed in a critical section + + const bool was_enabled = stepper.suspend(); + + // Drop all queue entries + block_buffer_nonbusy = block_buffer_planned = block_buffer_head = block_buffer_tail; + + // Restart the block delay for the first movement - As the queue was + // forced to empty, there's no risk the ISR will touch this. + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + + #if HAS_WIRED_LCD + // Clear the accumulated runtime + clear_block_buffer_runtime(); + #endif + + // Make sure to drop any attempt of queuing moves for 1 second + cleaning_buffer_counter = TEMP_TIMER_FREQUENCY; + + // Reenable Stepper ISR + if (was_enabled) stepper.wake_up(); + + // And stop the stepper ISR + stepper.quick_stop(); +} + +void Planner::endstop_triggered(const AxisEnum axis) { + // Record stepper position and discard the current block + stepper.endstop_triggered(axis); +} + +float Planner::triggered_position_mm(const AxisEnum axis) { + return stepper.triggered_position(axis) * steps_to_mm[axis]; +} + +void Planner::finish_and_disable() { + while (has_blocks_queued() || cleaning_buffer_counter) idle(); + disable_all_steppers(); +} + +/** + * Get an axis position according to stepper position(s) + * For CORE machines apply translation from ABC to XYZ. + */ +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) { + + // 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(); + + // ((a1+a2)+(a1-a2))/2 -> (a1+a2+a1-a2)/2 -> (a1+a1)/2 -> a1 + // ((a1+a2)-(a1-a2))/2 -> (a1+a2-a1+a2)/2 -> (a2+a2)/2 -> a2 + axis_steps = (axis == CORE_AXIS_2 ? CORESIGN(p1 - p2) : p1 + p2) * 0.5f; + } + 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]; +} + +/** + * Block until all buffered steps are executed / cleaned + */ +void Planner::synchronize() { + while (has_blocks_queued() || cleaning_buffer_counter + || TERN0(EXTERNAL_CLOSED_LOOP_CONTROLLER, CLOSED_LOOP_WAITING()) + ) idle(); +} + +/** + * Planner::_buffer_steps + * + * Add a new linear movement to the planner queue (in terms of steps). + * + * target - target position in steps units + * target_float - target position in direct (mm, degrees) units. optional + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * millimeters - the length of the movement, if known + * + * Returns true if movement was properly queued, false otherwise (if cleaning) + */ +bool Planner::_buffer_steps(const xyze_long_t &target + #if HAS_POSITION_FLOAT + , const xyze_pos_t &target_float + #endif + #if HAS_DIST_MM_ARG + , const xyze_float_t &cart_dist_mm + #endif + , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters +) { + + // If we are cleaning, do not accept queuing of movements + if (cleaning_buffer_counter) return false; + + // Wait for the next available block + uint8_t next_buffer_head; + block_t * const block = get_next_free_block(next_buffer_head); + + // Fill the block with the specified movement + if (!_populate_block(block, false, target + #if HAS_POSITION_FLOAT + , target_float + #endif + #if HAS_DIST_MM_ARG + , cart_dist_mm + #endif + , fr_mm_s, extruder, millimeters + )) { + // Movement was not queued, probably because it was too short. + // Simply accept that as movement queued and done + return true; + } + + // If this is the first added movement, reload the delay, otherwise, cancel it. + if (block_buffer_head == block_buffer_tail) { + // If it was the first queued block, restart the 1st block delivery delay, to + // give the planner an opportunity to queue more movements and plan them + // As there are no queued movements, the Stepper ISR will not touch this + // variable, so there is no risk setting this here (but it MUST be done + // before the following line!!) + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + } + + // Move buffer head + block_buffer_head = next_buffer_head; + + // Recalculate and optimize trapezoidal speed profiles + recalculate(); + + // Movement successfully queued! + return true; +} + +/** + * Planner::_populate_block + * + * Fills a new linear movement in the block (in terms of steps). + * + * target - target position in steps units + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * + * Returns true if movement is acceptable, false otherwise + */ +bool Planner::_populate_block(block_t * const block, bool split_move, + const abce_long_t &target + #if HAS_POSITION_FLOAT + , const xyze_pos_t &target_float + #endif + #if HAS_DIST_MM_ARG + , const xyze_float_t &cart_dist_mm + #endif + , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ +) { + + const int32_t da = target.a - position.a, + db = target.b - position.b, + dc = target.c - position.c; + + #if EXTRUDERS + int32_t de = target.e - position.e; + #else + constexpr int32_t de = 0; + #endif + + /* <-- add a slash to enable + SERIAL_ECHOLNPAIR(" _populate_block FR:", fr_mm_s, + " A:", target.a, " (", da, " steps)" + " B:", target.b, " (", db, " steps)" + " C:", target.c, " (", dc, " steps)" + #if EXTRUDERS + " E:", target.e, " (", de, " steps)" + #endif + ); + //*/ + + #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) + if (de) { + #if ENABLED(PREVENT_COLD_EXTRUSION) + if (thermalManager.tooColdToExtrude(extruder)) { + position.e = target.e; // Behave as if the move really took place, but ignore E part + TERN_(HAS_POSITION_FLOAT, position_float.e = target_float.e); + de = 0; // no difference + SERIAL_ECHO_MSG(STR_ERR_COLD_EXTRUDE_STOP); + } + #endif // PREVENT_COLD_EXTRUSION + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + const float e_steps = ABS(de * e_factor[extruder]); + const float max_e_steps = settings.axis_steps_per_mm[E_AXIS_N(extruder)] * (EXTRUDE_MAXLENGTH); + if (e_steps > max_e_steps) { + #if ENABLED(MIXING_EXTRUDER) + bool ignore_e = false; + float collector[MIXING_STEPPERS]; + mixer.refresh_collector(1.0, mixer.get_current_vtool(), collector); + MIXER_STEPPER_LOOP(e) + if (e_steps * collector[e] > max_e_steps) { ignore_e = true; break; } + #else + constexpr bool ignore_e = true; + #endif + if (ignore_e) { + position.e = target.e; // Behave as if the move really took place, but ignore E part + TERN_(HAS_POSITION_FLOAT, position_float.e = target_float.e); + de = 0; // no difference + SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); + } + } + #endif // PREVENT_LENGTHY_EXTRUDE + } + #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE + + // Compute direction bit-mask for this block + uint8_t dm = 0; + #if CORE_IS_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 (CORESIGN(da - db) < 0) SBI(dm, B_AXIS); // Motor B direction + #elif CORE_IS_XZ + if (da < 0) SBI(dm, X_HEAD); // Save the real Extruder (head) direction in X Axis + if (db < 0) SBI(dm, Y_AXIS); + if (dc < 0) SBI(dm, Z_HEAD); // ...and Z + if (da + dc < 0) SBI(dm, A_AXIS); // Motor A direction + if (CORESIGN(da - dc) < 0) SBI(dm, C_AXIS); // Motor C direction + #elif CORE_IS_YZ + if (da < 0) SBI(dm, X_AXIS); + if (db < 0) SBI(dm, Y_HEAD); // Save the real Extruder (head) direction in Y Axis + 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); + if (dc < 0) SBI(dm, Z_AXIS); + #endif + if (de < 0) SBI(dm, E_AXIS); + + #if EXTRUDERS + const float esteps_float = de * e_factor[extruder]; + const uint32_t esteps = ABS(esteps_float) + 0.5f; + #else + constexpr uint32_t esteps = 0; + #endif + + // Clear all flags, including the "busy" bit + block->flag = 0x00; + + // Set direction bits + block->direction_bits = dm; + + // Update block laser power + #if ENABLED(LASER_POWER_INLINE) + laser_inline.status.isPlanned = true; + block->laser.status = laser_inline.status; + block->laser.power = laser_inline.power; + #endif + + // Number of steps for each axis + // 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 + 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 + // default non-h-bot planning + block->steps.set(ABS(da), ABS(db), ABS(dc)); + #endif + + /** + * This part of the code calculates the total length of the movement. + * For cartesian bots, the X_AXIS is the real X movement and same for Y_AXIS. + * But for corexy bots, that is not true. The "X_AXIS" and "Y_AXIS" motors (that should be named to A_AXIS + * and B_AXIS) cannot be used for X and Y length, because A=X+Y and B=X-Y. + * So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head. + * Having the real displacement of the head, we can calculate the total movement length and apply the desired speed. + */ + struct DistanceMM : abce_float_t { + #if EITHER(IS_CORE, MARKFORGED_XY) + xyz_pos_t head; + #endif + } steps_dist_mm; + #if IS_CORE + #if CORE_IS_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 = CORESIGN(da - db) * steps_to_mm[B_AXIS]; + #elif CORE_IS_XZ + steps_dist_mm.head.x = da * steps_to_mm[A_AXIS]; + steps_dist_mm.y = db * steps_to_mm[Y_AXIS]; + steps_dist_mm.head.z = dc * steps_to_mm[C_AXIS]; + steps_dist_mm.a = (da + dc) * steps_to_mm[A_AXIS]; + steps_dist_mm.c = CORESIGN(da - dc) * steps_to_mm[C_AXIS]; + #elif CORE_IS_YZ + steps_dist_mm.x = da * steps_to_mm[X_AXIS]; + steps_dist_mm.head.y = db * steps_to_mm[B_AXIS]; + steps_dist_mm.head.z = dc * steps_to_mm[C_AXIS]; + 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]; + steps_dist_mm.c = dc * steps_to_mm[C_AXIS]; + #endif + + #if EXTRUDERS + steps_dist_mm.e = esteps_float * steps_to_mm[E_AXIS_N(extruder)]; + #else + steps_dist_mm.e = 0.0f; + #endif + + TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator += steps_dist_mm.e); + + if (block->steps.a < MIN_STEPS_PER_SEGMENT && block->steps.b < MIN_STEPS_PER_SEGMENT && block->steps.c < MIN_STEPS_PER_SEGMENT) { + block->millimeters = (0 + #if EXTRUDERS + + ABS(steps_dist_mm.e) + #endif + ); + } + else { + if (millimeters) + block->millimeters = millimeters; + else + block->millimeters = SQRT( + #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) + #elif CORE_IS_YZ + sq(steps_dist_mm.x) + sq(steps_dist_mm.head.y) + sq(steps_dist_mm.head.z) + #else + sq(steps_dist_mm.x) + sq(steps_dist_mm.y) + sq(steps_dist_mm.z) + #endif + ); + + /** + * At this point at least one of the axes has more steps than + * MIN_STEPS_PER_SEGMENT, ensuring the segment won't get dropped as + * zero-length. It's important to not apply corrections + * to blocks that would get dropped! + * + * A correction function is permitted to add steps to an axis, it + * should *never* remove steps! + */ + TERN_(BACKLASH_COMPENSATION, backlash.add_correction_steps(da, db, dc, dm, block)); + } + + #if EXTRUDERS + block->steps.e = esteps; + #endif + + block->step_event_count = _MAX(block->steps.a, block->steps.b, block->steps.c, esteps); + + // Bail if this is a zero-length block + if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; + + #if ENABLED(MIXING_EXTRUDER) + MIXER_POPULATE_BLOCK(); + #endif + + TERN_(HAS_CUTTER, block->cutter_power = cutter.power); + + #if HAS_FAN + FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; + #endif + + #if ENABLED(BARICUDA) + block->valve_pressure = baricuda_valve_pressure; + block->e_to_p_pressure = baricuda_e_to_p_pressure; + #endif + + #if HAS_MULTI_EXTRUDER + block->extruder = extruder; + #endif + + #if ENABLED(AUTO_POWER_CONTROL) + if (block->steps.x || block->steps.y || block->steps.z) + powerManager.power_on(); + #endif + + // Enable active axes + #if EITHER(CORE_IS_XY, MARKFORGED_XY) + if (block->steps.a || block->steps.b) { + ENABLE_AXIS_X(); + ENABLE_AXIS_Y(); + } + #if DISABLED(Z_LATE_ENABLE) + if (block->steps.z) ENABLE_AXIS_Z(); + #endif + #elif CORE_IS_XZ + if (block->steps.a || block->steps.c) { + ENABLE_AXIS_X(); + ENABLE_AXIS_Z(); + } + if (block->steps.y) ENABLE_AXIS_Y(); + #elif CORE_IS_YZ + if (block->steps.b || block->steps.c) { + ENABLE_AXIS_Y(); + ENABLE_AXIS_Z(); + } + if (block->steps.x) ENABLE_AXIS_X(); + #else + if (block->steps.x) ENABLE_AXIS_X(); + if (block->steps.y) ENABLE_AXIS_Y(); + #if DISABLED(Z_LATE_ENABLE) + if (block->steps.z) ENABLE_AXIS_Z(); + #endif + #endif + + // Enable extruder(s) + #if EXTRUDERS + if (esteps) { + TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); + + #if ENABLED(DISABLE_INACTIVE_EXTRUDER) // Enable only the selected extruder + + LOOP_L_N(i, EXTRUDERS) + if (g_uc_extruder_last_move[i] > 0) g_uc_extruder_last_move[i]--; + + #if HAS_DUPLICATION_MODE + if (extruder_duplication_enabled && extruder == 0) { + ENABLE_AXIS_E1(); + g_uc_extruder_last_move[1] = (BLOCK_BUFFER_SIZE) * 2; + } + #endif + + #define ENABLE_ONE_E(N) do{ \ + if (extruder == N) { \ + ENABLE_AXIS_E##N(); \ + g_uc_extruder_last_move[N] = (BLOCK_BUFFER_SIZE) * 2; \ + } \ + else if (!g_uc_extruder_last_move[N]) \ + DISABLE_AXIS_E##N(); \ + }while(0); + + #else + + #define ENABLE_ONE_E(N) ENABLE_AXIS_E##N(); + + #endif + + REPEAT(EXTRUDERS, ENABLE_ONE_E); // (ENABLE_ONE_E must end with semicolon) + } + #endif // EXTRUDERS + + if (esteps) + NOLESS(fr_mm_s, settings.min_feedrate_mm_s); + else + NOLESS(fr_mm_s, settings.min_travel_feedrate_mm_s); + + const float inverse_millimeters = 1.0f / block->millimeters; // Inverse millimeters to remove multiple divides + + // Calculate inverse time for this move. No divide by zero due to previous checks. + // Example: At 120mm/s a 60mm move takes 0.5s. So this will give 2.0. + float inverse_secs = fr_mm_s * inverse_millimeters; + + // Get the number of non busy movements in queue (non busy means that they can be altered) + 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, HAS_WIRED_LCD) || defined(XY_FREQUENCY_LIMIT) + // Segment time im micro seconds + int32_t segment_time_us = LROUND(1000000.0f / inverse_secs); + #endif + + #if ENABLED(SLOWDOWN) + #ifndef SLOWDOWN_DIVISOR + #define SLOWDOWN_DIVISOR 2 + #endif + if (WITHIN(moves_queued, 2, (BLOCK_BUFFER_SIZE) / (SLOWDOWN_DIVISOR) - 1)) { + const int32_t time_diff = settings.min_segment_time_us - segment_time_us; + if (time_diff > 0) { + // Buffer is draining so add extra time. The amount of time added increases if the buffer is still emptied more. + const int32_t nst = segment_time_us + LROUND(2 * time_diff / moves_queued); + inverse_secs = 1000000.0f / nst; + #if defined(XY_FREQUENCY_LIMIT) || HAS_WIRED_LCD + segment_time_us = nst; + #endif + } + } + #endif + + #if HAS_WIRED_LCD + // Protect the access to the position. + const bool was_enabled = stepper.suspend(); + + block_buffer_runtime_us += segment_time_us; + block->segment_time_us = segment_time_us; + + if (was_enabled) stepper.wake_up(); + #endif + + block->nominal_speed_sqr = sq(block->millimeters * inverse_secs); // (mm/sec)^2 Always > 0 + block->nominal_rate = CEIL(block->step_event_count * inverse_secs); // (step/sec) Always > 0 + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM) // Only for extruder with filament sensor + filwidth.advance_e(steps_dist_mm.e); + #endif + + // Calculate and limit speed in mm/sec + + xyze_float_t current_speed; + float speed_factor = 1.0f; // factor <1 decreases speed + + // Linear axes first with less logic + LOOP_XYZ(i) { + current_speed[i] = steps_dist_mm[i] * inverse_secs; + const feedRate_t cs = ABS(current_speed[i]), + max_fr = settings.max_feedrate_mm_s[i]; + if (cs > max_fr) NOMORE(speed_factor, max_fr / cs); + } + + // Limit speed on extruders, if any + #if EXTRUDERS + { + current_speed.e = steps_dist_mm.e * inverse_secs; + #if HAS_MIXER_SYNC_CHANNEL + // Move all mixing extruders at the specified rate + if (mixer.get_current_vtool() == MIXER_AUTORETRACT_TOOL) + current_speed.e *= MIXING_STEPPERS; + #endif + + const feedRate_t cs = ABS(current_speed.e), + max_fr = settings.max_feedrate_mm_s[E_AXIS_N(extruder)] + * TERN(HAS_MIXER_SYNC_CHANNEL, MIXING_STEPPERS, 1); + + if (cs > max_fr) NOMORE(speed_factor, max_fr / cs); //respect max feedrate on any movement (doesn't matter if E axes only or not) + + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + const feedRate_t max_vfr = volumetric_extruder_feedrate_limit[extruder] + * TERN(HAS_MIXER_SYNC_CHANNEL, MIXING_STEPPERS, 1); + + // TODO: Doesn't work properly for joined segments. Set MIN_STEPS_PER_SEGMENT 1 as workaround. + + if (block->steps.a || block->steps.b || block->steps.c) { + + if (max_vfr > 0 && cs > max_vfr) { + NOMORE(speed_factor, max_vfr / cs); // respect volumetric extruder limit (if any) + /* <-- add a slash to enable + SERIAL_ECHOPAIR("volumetric extruder limit enforced: ", (cs * CIRCLE_AREA(filament_size[extruder] * 0.5f))); + SERIAL_ECHOPAIR(" mm^3/s (", cs); + SERIAL_ECHOPAIR(" mm/s) limited to ", (max_vfr * CIRCLE_AREA(filament_size[extruder] * 0.5f))); + SERIAL_ECHOPAIR(" mm^3/s (", max_vfr); + SERIAL_ECHOLNPGM(" mm/s)"); + //*/ + } + } + #endif + } + #endif + + #ifdef XY_FREQUENCY_LIMIT + + static uint8_t old_direction_bits; // = 0 + + if (xy_freq_limit_hz) { + // Check and limit the xy direction change frequency + const uint8_t direction_change = block->direction_bits ^ old_direction_bits; + old_direction_bits = block->direction_bits; + segment_time_us = LROUND(float(segment_time_us) / speed_factor); + + static int32_t xs0, xs1, xs2, ys0, ys1, ys2; + if (segment_time_us > xy_freq_min_interval_us) + xs2 = xs1 = ys2 = ys1 = xy_freq_min_interval_us; + else { + xs2 = xs1; xs1 = xs0; + ys2 = ys1; ys1 = ys0; + } + xs0 = TEST(direction_change, X_AXIS) ? segment_time_us : xy_freq_min_interval_us; + ys0 = TEST(direction_change, Y_AXIS) ? segment_time_us : xy_freq_min_interval_us; + + if (segment_time_us < xy_freq_min_interval_us) { + const int32_t least_xy_segment_time = _MIN(_MAX(xs0, xs1, xs2), _MAX(ys0, ys1, ys2)); + if (least_xy_segment_time < xy_freq_min_interval_us) { + float freq_xy_feedrate = (speed_factor * least_xy_segment_time) / xy_freq_min_interval_us; + NOLESS(freq_xy_feedrate, xy_freq_min_speed_factor); + NOMORE(speed_factor, freq_xy_feedrate); + } + } + } + + #endif // XY_FREQUENCY_LIMIT + + // Correct the speed + if (speed_factor < 1.0f) { + current_speed *= speed_factor; + block->nominal_rate *= speed_factor; + block->nominal_speed_sqr = block->nominal_speed_sqr * sq(speed_factor); + } + + // Compute and limit the acceleration rate for the trapezoid generator. + const float steps_per_mm = block->step_event_count * inverse_millimeters; + uint32_t accel; + if (!block->steps.a && !block->steps.b && !block->steps.c) { + // convert to: acceleration steps/sec^2 + accel = CEIL(settings.retract_acceleration * steps_per_mm); + TERN_(LIN_ADVANCE, block->use_advance_lead = false); + } + else { + #define LIMIT_ACCEL_LONG(AXIS,INDX) do{ \ + if (block->steps[AXIS] && max_acceleration_steps_per_s2[AXIS+INDX] < accel) { \ + const uint32_t comp = max_acceleration_steps_per_s2[AXIS+INDX] * block->step_event_count; \ + if (accel * block->steps[AXIS] > comp) accel = comp / block->steps[AXIS]; \ + } \ + }while(0) + + #define LIMIT_ACCEL_FLOAT(AXIS,INDX) do{ \ + if (block->steps[AXIS] && max_acceleration_steps_per_s2[AXIS+INDX] < accel) { \ + const float comp = (float)max_acceleration_steps_per_s2[AXIS+INDX] * (float)block->step_event_count; \ + if ((float)accel * (float)block->steps[AXIS] > comp) accel = comp / (float)block->steps[AXIS]; \ + } \ + }while(0) + + // Start with print or travel acceleration + accel = CEIL((esteps ? settings.acceleration : settings.travel_acceleration) * steps_per_mm); + + #if ENABLED(LIN_ADVANCE) + + #define MAX_E_JERK(N) TERN(HAS_LINEAR_E_JERK, max_e_jerk[E_INDEX_N(N)], max_jerk.e) + + /** + * Use LIN_ADVANCE for blocks if all these are true: + * + * esteps : This is a print move, because we checked for A, B, C steps before. + * + * extruder_advance_K[active_extruder] : There is an advance factor set for this extruder. + * + * de > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves) + */ + block->use_advance_lead = esteps + && extruder_advance_K[active_extruder] + && de > 0; + + if (block->use_advance_lead) { + block->e_D_ratio = (target_float.e - position_float.e) / + #if IS_KINEMATIC + block->millimeters + #else + SQRT(sq(target_float.x - position_float.x) + + sq(target_float.y - position_float.y) + + sq(target_float.z - position_float.z)) + #endif + ; + + // Check for unusual high e_D ratio to detect if a retract move was combined with the last print move due to min. steps per segment. Never execute this with advance! + // This assumes no one will use a retract length of 0mm < retr_length < ~0.2mm and no one will print 100mm wide lines using 3mm filament or 35mm wide lines using 1.75mm filament. + if (block->e_D_ratio > 3.0f) + block->use_advance_lead = false; + else { + const uint32_t max_accel_steps_per_s2 = MAX_E_JERK(extruder) / (extruder_advance_K[active_extruder] * block->e_D_ratio) * steps_per_mm; + if (TERN0(LA_DEBUG, accel > max_accel_steps_per_s2)) + SERIAL_ECHOLNPGM("Acceleration limited."); + NOMORE(accel, max_accel_steps_per_s2); + } + } + #endif + + // Limit acceleration per axis + if (block->step_event_count <= cutoff_long) { + LIMIT_ACCEL_LONG(A_AXIS, 0); + LIMIT_ACCEL_LONG(B_AXIS, 0); + LIMIT_ACCEL_LONG(C_AXIS, 0); + LIMIT_ACCEL_LONG(E_AXIS, E_INDEX_N(extruder)); + } + else { + LIMIT_ACCEL_FLOAT(A_AXIS, 0); + LIMIT_ACCEL_FLOAT(B_AXIS, 0); + LIMIT_ACCEL_FLOAT(C_AXIS, 0); + LIMIT_ACCEL_FLOAT(E_AXIS, E_INDEX_N(extruder)); + } + } + block->acceleration_steps_per_s2 = accel; + block->acceleration = accel / steps_per_mm; + #if DISABLED(S_CURVE_ACCELERATION) + block->acceleration_rate = (uint32_t)(accel * (4096.0f * 4096.0f / (STEPPER_TIMER_RATE))); + #endif + #if ENABLED(LIN_ADVANCE) + if (block->use_advance_lead) { + block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * settings.axis_steps_per_mm[E_AXIS_N(extruder)]); + #if ENABLED(LA_DEBUG) + if (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio) + SERIAL_ECHOLNPGM("More than 2 steps per eISR loop executed."); + if (block->advance_speed < 200) + SERIAL_ECHOLNPGM("eISR running at > 10kHz."); + #endif + } + #endif + + float vmax_junction_sqr; // Initial limit on the segment entry velocity (mm/s)^2 + + #if HAS_JUNCTION_DEVIATION + /** + * Compute maximum allowable entry speed at junction by centripetal acceleration approximation. + * Let a circle be tangent to both previous and current path line segments, where the junction + * deviation is defined as the distance from the junction to the closest edge of the circle, + * colinear with the circle center. The circular segment joining the two paths represents the + * path of centripetal acceleration. Solve for max velocity based on max acceleration about the + * radius of the circle, defined indirectly by junction deviation. This may be also viewed as + * path width or max_jerk in the previous Grbl version. This approach does not actually deviate + * from path, but used as a robust way to compute cornering speeds, as it takes into account the + * nonlinearities of both the junction angle and junction velocity. + * + * NOTE: If the junction deviation value is finite, Grbl executes the motions in an exact path + * mode (G61). If the junction deviation value is zero, Grbl will execute the motion in an exact + * stop mode (G61.1) manner. In the future, if continuous mode (G64) is desired, the math here + * is exactly the same. Instead of motioning all the way to junction point, the machine will + * just follow the arc circle defined here. The Arduino doesn't have the CPU cycles to perform + * a continuous mode path, but ARM-based microcontrollers most certainly do. + * + * NOTE: The max junction speed is a fixed value, since machine acceleration limits cannot be + * changed dynamically during operation nor can the line move geometry. This must be kept in + * memory in the event of a feedrate override changing the nominal speeds of blocks, which can + * change the overall maximum entry speed conditions of all blocks. + * + * ####### + * https://github.com/MarlinFirmware/Marlin/issues/10341#issuecomment-388191754 + * + * hoffbaked: on May 10 2018 tuned and improved the GRBL algorithm for Marlin: + Okay! It seems to be working good. I somewhat arbitrarily cut it off at 1mm + on then on anything with less sides than an octagon. With this, and the + reverse pass actually recalculating things, a corner acceleration value + of 1000 junction deviation of .05 are pretty reasonable. If the cycles + can be spared, a better acos could be used. For all I know, it may be + already calculated in a different place. */ + + // Unit vector of previous path line segment + static xyze_float_t prev_unit_vec; + + xyze_float_t unit_vec = + #if HAS_DIST_MM_ARG + cart_dist_mm + #else + { steps_dist_mm.x, steps_dist_mm.y, steps_dist_mm.z, steps_dist_mm.e } + #endif + ; + + /** + * 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 will factor-in the E component + */ + 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)) + + // Skip first block or when previous_nominal_speed is used as a flag for homing and offset cycles. + if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { + // Compute cosine of angle between previous and current path. (prev_unit_vec is negative) + // NOTE: Max junction velocity is computed without sin() or acos() by trig half angle identity. + float junction_cos_theta = (-prev_unit_vec.x * unit_vec.x) + (-prev_unit_vec.y * unit_vec.y) + + (-prev_unit_vec.z * unit_vec.z) + (-prev_unit_vec.e * unit_vec.e); + + // NOTE: Computed without any expensive trig, sin() or acos(), by trig half angle identity of cos(theta). + if (junction_cos_theta > 0.999999f) { + // For a 0 degree acute junction, just set minimum junction speed. + vmax_junction_sqr = sq(float(MINIMUM_PLANNER_SPEED)); + } + else { + NOLESS(junction_cos_theta, -0.999999f); // Check for numerical round-off to avoid divide by zero. + + // Convert delta vector to unit vector + xyze_float_t junction_unit_vec = unit_vec - prev_unit_vec; + normalize_junction_vector(junction_unit_vec); + + const float junction_acceleration = limit_value_by_axis_maximum(block->acceleration, junction_unit_vec), + sin_theta_d2 = SQRT(0.5f * (1.0f - junction_cos_theta)); // Trig half angle identity. Always positive. + + vmax_junction_sqr = junction_acceleration * junction_deviation_mm * sin_theta_d2 / (1.0f - sin_theta_d2); + + #if ENABLED(JD_HANDLE_SMALL_SEGMENTS) + + // For small moves with >135° junction (octagon) find speed for approximate arc + if (block->millimeters < 1 && junction_cos_theta < -0.7071067812f) { + + #if ENABLED(JD_USE_MATH_ACOS) + + #error "TODO: Inline maths with the MCU / FPU." + + #elif ENABLED(JD_USE_LOOKUP_TABLE) + + // Fast acos approximation (max. error +-0.01 rads) + // Based on LUT table and linear interpolation + + /** + * // Generate the JD Lookup Table + * constexpr float c = 1.00751495f; // Correction factor to center error around 0 + * for (int i = 0; i < jd_lut_count - 1; ++i) { + * const float x0 = (sq(i) - 1) / sq(i), + * y0 = acos(x0) * (i == 0 ? 1 : c), + * x1 = i < jd_lut_count - 1 ? 0.5 * x0 + 0.5 : 0.999999f, + * y1 = acos(x1) * (i < jd_lut_count - 1 ? c : 1); + * jd_lut_k[i] = (y0 - y1) / (x0 - x1); + * jd_lut_b[i] = (y1 * x0 - y0 * x1) / (x0 - x1); + * } + * + * // Compute correction factor (Set c to 1.0f first!) + * float min = INFINITY, max = -min; + * for (float t = 0; t <= 1; t += 0.0003f) { + * const float e = acos(t) / approx(t); + * if (isfinite(e)) { + * if (e < min) min = e; + * if (e > max) max = e; + * } + * } + * fprintf(stderr, "%.9gf, ", (min + max) / 2); + */ + static constexpr int16_t jd_lut_count = 16; + static constexpr uint16_t jd_lut_tll = _BV(jd_lut_count - 1); + static constexpr int16_t jd_lut_tll0 = __builtin_clz(jd_lut_tll) + 1; // i.e., 16 - jd_lut_count + 1 + static constexpr float jd_lut_k[jd_lut_count] PROGMEM = { + -1.03145837f, -1.30760646f, -1.75205851f, -2.41705704f, + -3.37769222f, -4.74888992f, -6.69649887f, -9.45661736f, + -13.3640480f, -18.8928222f, -26.7136841f, -37.7754593f, + -53.4201813f, -75.5458374f, -106.836761f, -218.532821f }; + static constexpr float jd_lut_b[jd_lut_count] PROGMEM = { + 1.57079637f, 1.70887053f, 2.04220939f, 2.62408352f, + 3.52467871f, 4.85302639f, 6.77020454f, 9.50875854f, + 13.4009285f, 18.9188995f, 26.7321243f, 37.7885055f, + 53.4293975f, 75.5523529f, 106.841369f, 218.534011f }; + + const float neg = junction_cos_theta < 0 ? -1 : 1, + t = neg * junction_cos_theta; + + const int16_t idx = (t < 0.00000003f) ? 0 : __builtin_clz(uint16_t((1.0f - t) * jd_lut_tll)) - jd_lut_tll0; + + float junction_theta = t * pgm_read_float(&jd_lut_k[idx]) + pgm_read_float(&jd_lut_b[idx]); + if (neg > 0) junction_theta = RADIANS(180) - junction_theta; // acos(-t) + + #else + + // Fast acos(-t) approximation (max. error +-0.033rad = 1.89°) + // Based on MinMax polynomial published by W. Randolph Franklin, see + // https://wrf.ecse.rpi.edu/Research/Short_Notes/arcsin/onlyelem.html + // acos( t) = pi / 2 - asin(x) + // acos(-t) = pi - acos(t) ... pi / 2 + asin(x) + + const float neg = junction_cos_theta < 0 ? -1 : 1, + t = neg * junction_cos_theta, + asinx = 0.032843707f + + t * (-1.451838349f + + t * ( 29.66153956f + + t * (-131.1123477f + + t * ( 262.8130562f + + t * (-242.7199627f + + t * ( 84.31466202f ) ))))), + junction_theta = RADIANS(90) + neg * asinx; // acos(-t) + + // NOTE: junction_theta bottoms out at 0.033 which avoids divide by 0. + + #endif + + const float limit_sqr = (block->millimeters * junction_acceleration) / junction_theta; + NOMORE(vmax_junction_sqr, limit_sqr); + } + + #endif // JD_HANDLE_SMALL_SEGMENTS + } + + // Get the lowest speed + vmax_junction_sqr = _MIN(vmax_junction_sqr, block->nominal_speed_sqr, previous_nominal_speed_sqr); + } + else // Init entry speed to zero. Assume it starts from rest. Planner will correct this later. + vmax_junction_sqr = 0; + + prev_unit_vec = unit_vec; + + #endif + + #ifdef USE_CACHED_SQRT + #define CACHED_SQRT(N, V) \ + static float saved_V, N; \ + if (V != saved_V) { N = SQRT(V); saved_V = V; } + #else + #define CACHED_SQRT(N, V) const float N = SQRT(V) + #endif + + #if HAS_CLASSIC_JERK + + /** + * Adapted from Průša MKS firmware + * https://github.com/prusa3d/Prusa-Firmware + */ + CACHED_SQRT(nominal_speed, block->nominal_speed_sqr); + + // Exit speed limited by a jerk to full halt of a previous last segment + static float previous_safe_speed; + + // Start with a safe speed (from which the machine may halt to stop immediately). + float safe_speed = nominal_speed; + + #ifndef TRAVEL_EXTRA_XYJERK + #define TRAVEL_EXTRA_XYJERK 0 + #endif + const float extra_xyjerk = (de <= 0) ? TRAVEL_EXTRA_XYJERK : 0; + + uint8_t limited = 0; + TERN(HAS_LINEAR_E_JERK, LOOP_XYZ, LOOP_XYZE)(i) { + const float jerk = ABS(current_speed[i]), // cs : Starting from zero, change in speed for this axis + maxj = (max_jerk[i] + (i == X_AXIS || i == Y_AXIS ? extra_xyjerk : 0.0f)); // mj : The max jerk setting for this axis + if (jerk > maxj) { // cs > mj : New current speed too fast? + if (limited) { // limited already? + const float mjerk = nominal_speed * maxj; // ns*mj + if (jerk * safe_speed > mjerk) safe_speed = mjerk / jerk; // ns*mj/cs + } + else { + safe_speed *= maxj / jerk; // Initial limit: ns*mj/cs + ++limited; // Initially limited + } + } + } + + float vmax_junction; + if (moves_queued && !UNEAR_ZERO(previous_nominal_speed_sqr)) { + // Estimate a maximum velocity allowed at a joint of two successive segments. + // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities, + // then the machine is not coasting anymore and the safe entry / exit velocities shall be used. + + // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. + float v_factor = 1; + limited = 0; + + // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. + // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. + CACHED_SQRT(previous_nominal_speed, previous_nominal_speed_sqr); + + float smaller_speed_factor = 1.0f; + if (nominal_speed < previous_nominal_speed) { + vmax_junction = nominal_speed; + smaller_speed_factor = vmax_junction / previous_nominal_speed; + } + else + vmax_junction = previous_nominal_speed; + + // Now limit the jerk in all axes. + TERN(HAS_LINEAR_E_JERK, LOOP_XYZ, LOOP_XYZE)(axis) { + // Limit an axis. We have to differentiate: coasting, reversal of an axis, full stop. + float v_exit = previous_speed[axis] * smaller_speed_factor, + v_entry = current_speed[axis]; + if (limited) { + v_exit *= v_factor; + v_entry *= v_factor; + } + + // Calculate jerk depending on whether the axis is coasting in the same direction or reversing. + const float jerk = (v_exit > v_entry) + ? // coasting axis reversal + ( (v_entry > 0 || v_exit < 0) ? (v_exit - v_entry) : _MAX(v_exit, -v_entry) ) + : // v_exit <= v_entry coasting axis reversal + ( (v_entry < 0 || v_exit > 0) ? (v_entry - v_exit) : _MAX(-v_exit, v_entry) ); + + const float maxj = (max_jerk[axis] + (axis == X_AXIS || axis == Y_AXIS ? extra_xyjerk : 0.0f)); + + if (jerk > maxj) { + v_factor *= maxj / jerk; + ++limited; + } + } + if (limited) vmax_junction *= v_factor; + // Now the transition velocity is known, which maximizes the shared exit / entry velocity while + // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. + const float vmax_junction_threshold = vmax_junction * 0.99f; + if (previous_safe_speed > vmax_junction_threshold && safe_speed > vmax_junction_threshold) + vmax_junction = safe_speed; + } + else + vmax_junction = safe_speed; + + previous_safe_speed = safe_speed; + + #if HAS_JUNCTION_DEVIATION + NOMORE(vmax_junction_sqr, sq(vmax_junction)); // Throttle down to max speed + #else + vmax_junction_sqr = sq(vmax_junction); // Go up or down to the new speed + #endif + + #endif // Classic Jerk Limiting + + // Max entry speed of this block equals the max exit speed of the previous block. + block->max_entry_speed_sqr = vmax_junction_sqr; + + // Initialize block entry speed. Compute based on deceleration to user-defined MINIMUM_PLANNER_SPEED. + const float v_allowable_sqr = max_allowable_speed_sqr(-block->acceleration, sq(float(MINIMUM_PLANNER_SPEED)), block->millimeters); + + // If we are trying to add a split block, start with the + // max. allowed speed to avoid an interrupted first move. + block->entry_speed_sqr = !split_move ? sq(float(MINIMUM_PLANNER_SPEED)) : _MIN(vmax_junction_sqr, v_allowable_sqr); + + // Initialize planner efficiency flags + // Set flag if block will always reach maximum junction speed regardless of entry/exit speeds. + // If a block can de/ac-celerate from nominal speed to zero within the length of the block, then + // the current block and next block junction speeds are guaranteed to always be at their maximum + // junction speeds in deceleration and acceleration, respectively. This is due to how the current + // block nominal speed limits both the current and next maximum junction speeds. Hence, in both + // the reverse and forward planners, the corresponding block junction speed will always be at the + // the maximum junction speed and may always be ignored for any speed reduction checks. + block->flag |= block->nominal_speed_sqr <= v_allowable_sqr ? BLOCK_FLAG_RECALCULATE | BLOCK_FLAG_NOMINAL_LENGTH : BLOCK_FLAG_RECALCULATE; + + // Update previous path unit_vector and nominal speed + previous_speed = current_speed; + previous_nominal_speed_sqr = block->nominal_speed_sqr; + + position = target; // Update the position + + TERN_(HAS_POSITION_FLOAT, position_float = target_float); + TERN_(GRADIENT_MIX, mixer.gradient_control(target_float.z)); + TERN_(POWER_LOSS_RECOVERY, block->sdpos = recovery.command_sdpos()); + + return true; // Movement was accepted + +} // _populate_block() + +/** + * Planner::buffer_sync_block + * Add a block to the buffer that just updates the position + */ +void Planner::buffer_sync_block() { + // Wait for the next available block + uint8_t next_buffer_head; + block_t * const block = get_next_free_block(next_buffer_head); + + // Clear block + memset(block, 0, sizeof(block_t)); + + block->flag = BLOCK_FLAG_SYNC_POSITION; + + block->position = position; + + // If this is the first added movement, reload the delay, otherwise, cancel it. + if (block_buffer_head == block_buffer_tail) { + // If it was the first queued block, restart the 1st block delivery delay, to + // give the planner an opportunity to queue more movements and plan them + // As there are no queued movements, the Stepper ISR will not touch this + // variable, so there is no risk setting this here (but it MUST be done + // before the following line!!) + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + } + + block_buffer_head = next_buffer_head; + + stepper.wake_up(); +} // buffer_sync_block() + +/** + * Planner::buffer_segment + * + * Add a new linear movement to the buffer in axis units. + * + * Leveling and kinematics should be applied ahead of calling this. + * + * a,b,c,e - target positions in mm and/or degrees + * 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 + , const xyze_float_t &cart_dist_mm + #endif + , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ +) { + + // If we are cleaning, do not accept queuing of movements + if (cleaning_buffer_counter) return false; + + // When changing extruders recalculate steps corresponding to the E position + #if ENABLED(DISTINCT_E_FACTORS) + if (last_extruder != extruder && settings.axis_steps_per_mm[E_AXIS_N(extruder)] != settings.axis_steps_per_mm[E_AXIS_N(last_extruder)]) { + position.e = LROUND(position.e * settings.axis_steps_per_mm[E_AXIS_N(extruder)] * steps_to_mm[E_AXIS_N(last_extruder)]); + last_extruder = extruder; + } + #endif + + // The target position of the tool in absolute steps + // Calculate target position in absolute steps + const abce_long_t target = { + int32_t(LROUND(a * settings.axis_steps_per_mm[A_AXIS])), + int32_t(LROUND(b * settings.axis_steps_per_mm[B_AXIS])), + int32_t(LROUND(c * settings.axis_steps_per_mm[C_AXIS])), + int32_t(LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(extruder)])) + }; + + #if HAS_POSITION_FLOAT + const xyze_pos_t target_float = { a, b, c, e }; + #endif + + // DRYRUN prevents E moves from taking place + if (DEBUGGING(DRYRUN) || TERN0(CANCEL_OBJECTS, cancelable.skipping)) { + position.e = target.e; + TERN_(HAS_POSITION_FLOAT, position_float.e = e); + } + + /* <-- add a slash to enable + SERIAL_ECHOPAIR(" buffer_segment FR:", fr_mm_s); + #if IS_KINEMATIC + SERIAL_ECHOPAIR(" A:", a); + SERIAL_ECHOPAIR(" (", position.a); + SERIAL_ECHOPAIR("->", target.a); + SERIAL_ECHOPAIR(") B:", b); + #else + SERIAL_ECHOPAIR_P(SP_X_LBL, a); + SERIAL_ECHOPAIR(" (", position.x); + SERIAL_ECHOPAIR("->", target.x); + SERIAL_CHAR(')'); + SERIAL_ECHOPAIR_P(SP_Y_LBL, b); + #endif + SERIAL_ECHOPAIR(" (", position.y); + SERIAL_ECHOPAIR("->", target.y); + #if ENABLED(DELTA) + SERIAL_ECHOPAIR(") C:", c); + #else + SERIAL_CHAR(')'); + SERIAL_ECHOPAIR_P(SP_Z_LBL, c); + #endif + SERIAL_ECHOPAIR(" (", position.z); + SERIAL_ECHOPAIR("->", target.z); + SERIAL_CHAR(')'); + SERIAL_ECHOPAIR_P(SP_E_LBL, e); + SERIAL_ECHOPAIR(" (", position.e); + SERIAL_ECHOPAIR("->", target.e); + SERIAL_ECHOLNPGM(")"); + //*/ + + // Queue the movement. Return 'false' if the move was not queued. + if (!_buffer_steps(target + #if HAS_POSITION_FLOAT + , target_float + #endif + #if HAS_DIST_MM_ARG + , cart_dist_mm + #endif + , fr_mm_s, extruder, millimeters) + ) return false; + + stepper.wake_up(); + return true; +} // buffer_segment() + +/** + * Add a new linear movement to the buffer. + * The target is cartesian. It's translated to + * delta/scara if needed. + * + * rx,ry,rz,e - target position in mm or degrees + * fr_mm_s - (target) speed of the move (mm/s) + * extruder - target extruder + * millimeters - the length of the movement, if known + * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) + */ +bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters + #if ENABLED(SCARA_FEEDRATE_SCALING) + , const float &inv_duration + #endif +) { + xyze_pos_t machine = { rx, ry, rz, e }; + TERN_(HAS_POSITION_MODIFIERS, apply_modifiers(machine)); + + #if IS_KINEMATIC + + #if HAS_JUNCTION_DEVIATION + const xyze_pos_t cart_dist_mm = { + rx - position_cart.x, ry - position_cart.y, + rz - position_cart.z, e - position_cart.e + }; + #else + const xyz_pos_t cart_dist_mm = { rx - position_cart.x, ry - position_cart.y, rz - position_cart.z }; + #endif + + float mm = millimeters; + if (mm == 0.0) + mm = (cart_dist_mm.x != 0.0 || cart_dist_mm.y != 0.0) ? cart_dist_mm.magnitude() : ABS(cart_dist_mm.z); + + // Cartesian XYZ to kinematic ABC, stored in global 'delta' + inverse_kinematics(machine); + + #if ENABLED(SCARA_FEEDRATE_SCALING) + // For SCARA scale the feed rate from mm/s to degrees/s + // i.e., Complete the angular vector in the given time. + const float duration_recip = inv_duration ?: fr_mm_s / mm; + const xyz_pos_t diff = delta - position_float; + const feedRate_t feedrate = diff.magnitude() * duration_recip; + #else + const feedRate_t feedrate = fr_mm_s; + #endif + if (buffer_segment(delta.a, delta.b, delta.c, machine.e + #if HAS_JUNCTION_DEVIATION + , cart_dist_mm + #endif + , feedrate, extruder, mm + )) { + position_cart.set(rx, ry, rz, e); + return true; + } + else + return false; + #else + return buffer_segment(machine, fr_mm_s, extruder, millimeters); + #endif +} // buffer_line() + +#if ENABLED(DIRECT_STEPPING) + + void Planner::buffer_page(const page_idx_t page_idx, const uint8_t extruder, const uint16_t num_steps) { + if (!last_page_step_rate) { + kill(GET_TEXT(MSG_BAD_PAGE_SPEED)); + return; + } + + uint8_t next_buffer_head; + block_t * const block = get_next_free_block(next_buffer_head); + + block->flag = BLOCK_FLAG_IS_PAGE; + + #if FAN_COUNT > 0 + FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; + #endif + + #if HAS_MULTI_EXTRUDER + block->extruder = extruder; + #endif + + block->page_idx = page_idx; + + block->step_event_count = num_steps; + block->initial_rate = + block->final_rate = + block->nominal_rate = last_page_step_rate; // steps/s + + block->accelerate_until = 0; + block->decelerate_after = block->step_event_count; + + // Will be set to last direction later if directional format. + block->direction_bits = 0; + + #define PAGE_UPDATE_DIR(AXIS) \ + if (!last_page_dir[_AXIS(AXIS)]) SBI(block->direction_bits, _AXIS(AXIS)); + + if (!DirectStepping::Config::DIRECTIONAL) { + PAGE_UPDATE_DIR(X); + PAGE_UPDATE_DIR(Y); + PAGE_UPDATE_DIR(Z); + PAGE_UPDATE_DIR(E); + } + + // If this is the first added movement, reload the delay, otherwise, cancel it. + if (block_buffer_head == block_buffer_tail) { + // If it was the first queued block, restart the 1st block delivery delay, to + // give the planner an opportunity to queue more movements and plan them + // As there are no queued movements, the Stepper ISR will not touch this + // variable, so there is no risk setting this here (but it MUST be done + // before the following line!!) + delay_before_delivering = BLOCK_DELAY_FOR_1ST_MOVE; + } + + // Move buffer head + block_buffer_head = next_buffer_head; + + enable_all_steppers(); + stepper.wake_up(); + } + +#endif // DIRECT_STEPPING + +/** + * Directly set the planner ABC position (and stepper positions) + * converting mm (or angles for SCARA) into steps. + * + * The provided ABC position is in machine units. + */ + +void Planner::set_machine_position_mm(const float &a, const float &b, const float &c, const float &e) { + TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); + TERN_(HAS_POSITION_FLOAT, position_float.set(a, b, c, e)); + position.set(LROUND(a * settings.axis_steps_per_mm[A_AXIS]), + LROUND(b * settings.axis_steps_per_mm[B_AXIS]), + LROUND(c * settings.axis_steps_per_mm[C_AXIS]), + LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(active_extruder)])); + if (has_blocks_queued()) { + //previous_nominal_speed_sqr = 0.0; // Reset planner junction speeds. Assume start from rest. + //previous_speed.reset(); + buffer_sync_block(); + } + else + stepper.set_position(position); +} + +void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, const float &e) { + xyze_pos_t machine = { rx, ry, rz, e }; + #if HAS_POSITION_MODIFIERS + apply_modifiers(machine, true); + #endif + #if IS_KINEMATIC + position_cart.set(rx, ry, rz, e); + inverse_kinematics(machine); + set_machine_position_mm(delta.a, delta.b, delta.c, machine.e); + #else + set_machine_position_mm(machine); + #endif +} + +/** + * Setters for planner position (also setting stepper position). + */ +void Planner::set_e_position_mm(const float &e) { + const uint8_t axis_index = E_AXIS_N(active_extruder); + TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); + + const float e_new = e - TERN0(FWRETRACT, fwretract.current_retract[active_extruder]); + position.e = LROUND(settings.axis_steps_per_mm[axis_index] * e_new); + TERN_(HAS_POSITION_FLOAT, position_float.e = e_new); + TERN_(IS_KINEMATIC, position_cart.e = e); + + if (has_blocks_queued()) + buffer_sync_block(); + else + stepper.set_axis_position(E_AXIS, position.e); +} + +// Recalculate the steps/s^2 acceleration rates, based on the mm/s^2 +void Planner::reset_acceleration_rates() { + #if ENABLED(DISTINCT_E_FACTORS) + #define AXIS_CONDITION (i < E_AXIS || i == E_AXIS_N(active_extruder)) + #else + #define AXIS_CONDITION true + #endif + uint32_t highest_rate = 1; + LOOP_XYZE_N(i) { + max_acceleration_steps_per_s2[i] = settings.max_acceleration_mm_per_s2[i] * settings.axis_steps_per_mm[i]; + if (AXIS_CONDITION) NOLESS(highest_rate, max_acceleration_steps_per_s2[i]); + } + cutoff_long = 4294967295UL / highest_rate; // 0xFFFFFFFFUL + TERN_(HAS_LINEAR_E_JERK, recalculate_max_e_jerk()); +} + +// Recalculate position, steps_to_mm if settings.axis_steps_per_mm changes! +void Planner::refresh_positioning() { + LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / settings.axis_steps_per_mm[i]; + set_position_mm(current_position); + reset_acceleration_rates(); +} + +inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_name, const xyze_float_t &max_limit) { + const uint8_t lim_axis = axis > E_AXIS ? E_AXIS : axis; + const float before = val; + LIMIT(val, 0.1, max_limit[lim_axis]); + if (before != val) { + SERIAL_CHAR(axis_codes[lim_axis]); + SERIAL_ECHOPGM(" Max "); + serialprintPGM(setting_name); + SERIAL_ECHOLNPAIR(" limited to ", val); + } +} + +void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { + #if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #ifdef MAX_ACCEL_EDIT_VALUES + constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; + const xyze_float_t &max_acc_edit_scaled = max_accel_edit; + #else + constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION; + const xyze_float_t max_acc_edit_scaled = max_accel_edit * 2; + #endif + limit_and_warn(targetValue, axis, PSTR("Acceleration"), max_acc_edit_scaled); + #endif + settings.max_acceleration_mm_per_s2[axis] = targetValue; + + // Update steps per s2 to agree with the units per s2 (since they are used in the planner) + reset_acceleration_rates(); +} + +void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { + #if ENABLED(LIMITED_MAX_FR_EDITING) + #ifdef MAX_FEEDRATE_EDIT_VALUES + constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; + const xyze_float_t &max_fr_edit_scaled = max_fr_edit; + #else + constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE; + const xyze_float_t max_fr_edit_scaled = max_fr_edit * 2; + #endif + limit_and_warn(targetValue, axis, PSTR("Feedrate"), max_fr_edit_scaled); + #endif + settings.max_feedrate_mm_s[axis] = targetValue; +} + +void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { + #if HAS_CLASSIC_JERK + #if ENABLED(LIMITED_JERK_EDITING) + constexpr xyze_float_t max_jerk_edit = + #ifdef MAX_JERK_EDIT_VALUES + MAX_JERK_EDIT_VALUES + #else + { (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, + (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } + #endif + ; + limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); + #endif + max_jerk[axis] = targetValue; + #else + UNUSED(axis); UNUSED(targetValue); + #endif +} + +#if HAS_WIRED_LCD + + uint16_t Planner::block_buffer_runtime() { + #ifdef __AVR__ + // Protect the access to the variable. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = stepper.suspend(); + #endif + + uint32_t bbru = block_buffer_runtime_us; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) stepper.wake_up(); + #endif + + // To translate µs to ms a division by 1000 would be required. + // We introduce 2.4% error here by dividing by 1024. + // Doesn't matter because block_buffer_runtime_us is already too small an estimation. + bbru >>= 10; + // limit to about a minute. + NOMORE(bbru, 0x0000FFFFUL); + return bbru; + } + + void Planner::clear_block_buffer_runtime() { + #ifdef __AVR__ + // Protect the access to the variable. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = stepper.suspend(); + #endif + + block_buffer_runtime_us = 0; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) stepper.wake_up(); + #endif + } + +#endif + +#if ENABLED(AUTOTEMP) + +void Planner::autotemp_update() { + #if ENABLED(AUTOTEMP_PROPORTIONAL) + const int16_t target = thermalManager.degTargetHotend(active_extruder); + autotemp_min = target + AUTOTEMP_MIN_P; + autotemp_max = target + AUTOTEMP_MAX_P; + #endif + autotemp_factor = TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); + autotemp_enabled = autotemp_factor != 0; +} + + void Planner::autotemp_M104_M109() { + + #if ENABLED(AUTOTEMP_PROPORTIONAL) + const int16_t target = thermalManager.degTargetHotend(active_extruder); + autotemp_min = target + AUTOTEMP_MIN_P; + autotemp_max = target + AUTOTEMP_MAX_P; + #endif + + if (parser.seenval('S')) autotemp_min = parser.value_celsius(); + if (parser.seenval('B')) autotemp_max = parser.value_celsius(); + + // When AUTOTEMP_PROPORTIONAL is enabled, F0 disables autotemp. + // Normally, leaving off F also disables autotemp. + autotemp_factor = parser.seen('F') ? parser.value_float() : TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); + autotemp_enabled = autotemp_factor != 0; + } +#endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h new file mode 100644 index 00000000..c4e11490 --- /dev/null +++ b/Marlin/src/module/planner.h @@ -0,0 +1,979 @@ +/** + * 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 + +/** + * planner.h + * + * Buffer movement commands and manage the acceleration profile plan + * + * Derived from Grbl + * Copyright (c) 2009-2011 Simen Svale Skogsrud + */ + +#include "../MarlinCore.h" + +#if ENABLED(JD_HANDLE_SMALL_SEGMENTS) + // Enable this option for perfect accuracy but maximum + // computation. Should be fine on ARM processors. + //#define JD_USE_MATH_ACOS + + // Disable this option to save 120 bytes of PROGMEM, + // but incur increased computation and a reduction + // in accuracy. + #define JD_USE_LOOKUP_TABLE +#endif + +#include "motion.h" +#include "../gcode/queue.h" + +#if ENABLED(DELTA) + #include "delta.h" +#endif + +#if ABL_PLANAR + #include "../libs/vector_3.h" // for matrix_3x3 +#endif + +#if ENABLED(FWRETRACT) + #include "../feature/fwretract.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" +#endif + +#if HAS_CUTTER + #include "../feature/spindle_laser_types.h" +#endif + +#if ENABLED(DIRECT_STEPPING) + #include "../feature/direct_stepping.h" + #define IS_PAGE(B) TEST(B->flag, BLOCK_BIT_IS_PAGE) +#else + #define IS_PAGE(B) false +#endif + +// Feedrate for manual moves +#ifdef MANUAL_FEEDRATE + constexpr xyze_feedrate_t _mf = MANUAL_FEEDRATE, + manual_feedrate_mm_s { _mf.x / 60.0f, _mf.y / 60.0f, _mf.z / 60.0f, _mf.e / 60.0f }; +#endif + +#if IS_KINEMATIC && HAS_JUNCTION_DEVIATION + #define HAS_DIST_MM_ARG 1 +#endif + +enum BlockFlagBit : char { + // Recalculate trapezoids on entry junction. For optimization. + BLOCK_BIT_RECALCULATE, + + // Nominal speed always reached. + // i.e., The segment is long enough, so the nominal speed is reachable if accelerating + // from a safe speed (in consideration of jerking from zero speed). + BLOCK_BIT_NOMINAL_LENGTH, + + // The block is segment 2+ of a longer move + BLOCK_BIT_CONTINUED, + + // Sync the stepper counts from the block + BLOCK_BIT_SYNC_POSITION + + // Direct stepping page + #if ENABLED(DIRECT_STEPPING) + , BLOCK_BIT_IS_PAGE + #endif +}; + +enum BlockFlag : char { + BLOCK_FLAG_RECALCULATE = _BV(BLOCK_BIT_RECALCULATE) + , BLOCK_FLAG_NOMINAL_LENGTH = _BV(BLOCK_BIT_NOMINAL_LENGTH) + , BLOCK_FLAG_CONTINUED = _BV(BLOCK_BIT_CONTINUED) + , BLOCK_FLAG_SYNC_POSITION = _BV(BLOCK_BIT_SYNC_POSITION) + #if ENABLED(DIRECT_STEPPING) + , BLOCK_FLAG_IS_PAGE = _BV(BLOCK_BIT_IS_PAGE) + #endif +}; + +#if ENABLED(LASER_POWER_INLINE) + + typedef struct { + bool isPlanned:1; + bool isEnabled:1; + bool dir:1; + bool Reserved:6; + } power_status_t; + + typedef struct { + power_status_t status; // See planner settings for meaning + uint8_t power; // Ditto; When in trapezoid mode this is nominal power + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + uint8_t power_entry; // Entry power for the laser + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + uint8_t power_exit; // Exit power for the laser + uint32_t entry_per, // Steps per power increment (to avoid floats in stepper calcs) + exit_per; // Steps per power decrement + #endif + #endif + } block_laser_t; + +#endif + +/** + * struct block_t + * + * A single entry in the planner buffer. + * Tracks linear movement over multiple axes. + * + * The "nominal" values are as-specified by gcode, and + * may never actually be reached due to acceleration limits. + */ +typedef struct block_t { + + volatile uint8_t flag; // Block flags (See BlockFlag enum above) - Modified by ISR and main thread! + + // Fields used by the motion planner to manage acceleration + float nominal_speed_sqr, // The nominal speed for this block in (mm/sec)^2 + entry_speed_sqr, // Entry speed at previous-current junction in (mm/sec)^2 + max_entry_speed_sqr, // Maximum allowable junction entry speed in (mm/sec)^2 + millimeters, // The total travel of this block in mm + acceleration; // acceleration mm/sec^2 + + union { + abce_ulong_t steps; // Step count along each axis + abce_long_t position; // New position to force when this sync block is executed + }; + uint32_t step_event_count; // The number of step events required to complete this block + + #if HAS_MULTI_EXTRUDER + uint8_t extruder; // The extruder to move (if E move) + #else + static constexpr uint8_t extruder = 0; + #endif + + TERN_(MIXING_EXTRUDER, MIXER_BLOCK_FIELD); // Normalized color for the mixing steppers + + // Settings for the trapezoid generator + uint32_t accelerate_until, // The index of the step event on which to stop acceleration + decelerate_after; // The index of the step event on which to start decelerating + + #if ENABLED(S_CURVE_ACCELERATION) + uint32_t cruise_rate, // The actual cruise rate to use, between end of the acceleration phase and start of deceleration phase + acceleration_time, // Acceleration time and deceleration time in STEP timer counts + deceleration_time, + acceleration_time_inverse, // Inverse of acceleration and deceleration periods, expressed as integer. Scale depends on CPU being used + deceleration_time_inverse; + #else + uint32_t acceleration_rate; // The acceleration rate used for acceleration calculation + #endif + + uint8_t direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) + + // Advance extrusion + #if ENABLED(LIN_ADVANCE) + bool use_advance_lead; + uint16_t advance_speed, // STEP timer value for extruder speed offset ISR + max_adv_steps, // max. advance steps to get cruising speed pressure (not always nominal_speed!) + final_adv_steps; // advance steps due to exit speed + float e_D_ratio; + #endif + + uint32_t nominal_rate, // The nominal step rate for this block in step_events/sec + initial_rate, // The jerk-adjusted step rate at start of block + final_rate, // The minimal rate at exit + acceleration_steps_per_s2; // acceleration steps/sec^2 + + #if ENABLED(DIRECT_STEPPING) + page_idx_t page_idx; // Page index used for direct stepping + #endif + + #if HAS_CUTTER + cutter_power_t cutter_power; // Power level for Spindle, Laser, etc. + #endif + + #if HAS_FAN + uint8_t fan_speed[FAN_COUNT]; + #endif + + #if ENABLED(BARICUDA) + uint8_t valve_pressure, e_to_p_pressure; + #endif + + #if HAS_WIRED_LCD + uint32_t segment_time_us; + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + uint32_t sdpos; + #endif + + #if ENABLED(LASER_POWER_INLINE) + block_laser_t laser; + #endif + +} block_t; + +#if ANY(LIN_ADVANCE, SCARA_FEEDRATE_SCALING, GRADIENT_MIX, LCD_SHOW_E_TOTAL) + #define HAS_POSITION_FLOAT 1 +#endif + +#define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1)) + +#if ENABLED(LASER_POWER_INLINE) + typedef struct { + /** + * Laser status flags + */ + power_status_t status; + /** + * Laser power: 0 or 255 in case of PWM-less laser, + * or the OCR (oscillator count register) value; + * + * Using OCR instead of raw power, because it avoids + * floating point operations during the move loop. + */ + uint8_t power; + } laser_state_t; +#endif + +typedef struct { + uint32_t max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE + min_segment_time_us; // (µs) M205 B + float axis_steps_per_mm[XYZE_N]; // (steps) M92 XYZE - Steps per millimeter + feedRate_t max_feedrate_mm_s[XYZE_N]; // (mm/s) M203 XYZE - Max speeds + float acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves. + retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes + travel_acceleration; // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves. + feedRate_t min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate + min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate +} planner_settings_t; + +#if DISABLED(SKEW_CORRECTION) + #define XY_SKEW_FACTOR 0 + #define XZ_SKEW_FACTOR 0 + #define YZ_SKEW_FACTOR 0 +#endif + +typedef struct { + #if ENABLED(SKEW_CORRECTION_GCODE) + float xy; + #if ENABLED(SKEW_CORRECTION_FOR_Z) + float xz, yz; + #else + const float xz = XZ_SKEW_FACTOR, yz = YZ_SKEW_FACTOR; + #endif + #else + const float xy = XY_SKEW_FACTOR, + xz = XZ_SKEW_FACTOR, yz = YZ_SKEW_FACTOR; + #endif +} skew_factor_t; + +class Planner { + public: + + /** + * The move buffer, calculated in stepper steps + * + * block_buffer is a ring buffer... + * + * head,tail : indexes for write,read + * head==tail : the buffer is empty + * head!=tail : blocks are in the buffer + * head==(tail-1)%size : the buffer is full + * + * Writer of head is Planner::buffer_segment(). + * Reader of tail is Stepper::isr(). Always consider tail busy / read-only + */ + static block_t block_buffer[BLOCK_BUFFER_SIZE]; + static volatile uint8_t block_buffer_head, // Index of the next block to be pushed + block_buffer_nonbusy, // Index of the first non busy block + block_buffer_planned, // Index of the optimally planned block + block_buffer_tail; // Index of the busy block, if any + static uint16_t cleaning_buffer_counter; // A counter to disable queuing of blocks + static uint8_t delay_before_delivering; // This counter delays delivery of blocks when queue becomes empty to allow the opportunity of merging blocks + + + #if ENABLED(DISTINCT_E_FACTORS) + static uint8_t last_extruder; // Respond to extruder change + #endif + + #if ENABLED(DIRECT_STEPPING) + static uint32_t last_page_step_rate; // Last page step rate given + static xyze_bool_t last_page_dir; // Last page direction given + #endif + + #if EXTRUDERS + static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder + static float e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement + #endif + + #if DISABLED(NO_VOLUMETRICS) + static float filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder + volumetric_area_nominal, // Nominal cross-sectional area + volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner + // May be auto-adjusted by a filament width sensor + #endif + + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + static float volumetric_extruder_limit[EXTRUDERS], // Maximum mm^3/sec the extruder can handle + volumetric_extruder_feedrate_limit[EXTRUDERS]; // Feedrate limit (mm/s) calculated from volume limit + #endif + + static planner_settings_t settings; + + #if ENABLED(LASER_POWER_INLINE) + static laser_state_t laser_inline; + #endif + + static uint32_t max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2 + static float steps_to_mm[XYZE_N]; // Millimeters per step + + #if HAS_JUNCTION_DEVIATION + static float junction_deviation_mm; // (mm) M205 J + #if HAS_LINEAR_E_JERK + static float max_e_jerk[DISTINCT_E]; // Calculated from junction_deviation_mm + #endif + #endif + + #if HAS_CLASSIC_JERK + // (mm/s^2) M205 XYZ(E) - The largest speed change requiring no acceleration. + static TERN(HAS_LINEAR_E_JERK, xyz_pos_t, xyze_pos_t) max_jerk; + #endif + + #if HAS_LEVELING + static bool leveling_active; // Flag that bed leveling is enabled + #if ABL_PLANAR + static matrix_3x3 bed_level_matrix; // Transform to compensate for bed level + #endif + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + static float z_fade_height, inverse_z_fade_height; + #endif + #else + static constexpr bool leveling_active = false; + #endif + + #if ENABLED(LIN_ADVANCE) + static float extruder_advance_K[EXTRUDERS]; + #endif + + /** + * The current position of the tool in absolute steps + * Recalculated if any axis_steps_per_mm are changed by gcode + */ + static xyze_long_t position; + + #if HAS_POSITION_FLOAT + static xyze_pos_t position_float; + #endif + + #if IS_KINEMATIC + static xyze_pos_t position_cart; + #endif + + static skew_factor_t skew_factor; + + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + static bool abort_on_endstop_hit; + #endif + #ifdef XY_FREQUENCY_LIMIT + static int8_t xy_freq_limit_hz; // Minimum XY frequency setting + static float xy_freq_min_speed_factor; // Minimum speed factor setting + static int32_t xy_freq_min_interval_us; // Minimum segment time based on xy_freq_limit_hz + static inline void refresh_frequency_limit() { + //xy_freq_min_interval_us = xy_freq_limit_hz ?: LROUND(1000000.0f / xy_freq_limit_hz); + if (xy_freq_limit_hz) + xy_freq_min_interval_us = LROUND(1000000.0f / xy_freq_limit_hz); + } + static inline void set_min_speed_factor_u8(const uint8_t v255) { + xy_freq_min_speed_factor = float(ui8_to_percent(v255)) / 100; + } + static inline void set_frequency_limit(const uint8_t hz) { + xy_freq_limit_hz = constrain(hz, 0, 100); + refresh_frequency_limit(); + } + #endif + + private: + + /** + * Speed of previous path line segment + */ + static xyze_float_t previous_speed; + + /** + * Nominal speed of previous path line segment (mm/s)^2 + */ + static float previous_nominal_speed_sqr; + + /** + * Limit where 64bit math is necessary for acceleration calculation + */ + static uint32_t cutoff_long; + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + static float last_fade_z; + #endif + + #if ENABLED(DISABLE_INACTIVE_EXTRUDER) + // Counters to manage disabling inactive extruders + static uint8_t g_uc_extruder_last_move[EXTRUDERS]; + #endif + + #if HAS_WIRED_LCD + volatile static uint32_t block_buffer_runtime_us; // Theoretical block buffer runtime in µs + #endif + + public: + + /** + * Instance Methods + */ + + Planner(); + + void init(); + + /** + * Static (class) Methods + */ + + static void reset_acceleration_rates(); + static void refresh_positioning(); + static void set_max_acceleration(const uint8_t axis, float targetValue); + static void set_max_feedrate(const uint8_t axis, float targetValue); + static void set_max_jerk(const AxisEnum axis, float targetValue); + + + #if EXTRUDERS + FORCE_INLINE static void refresh_e_factor(const uint8_t e) { + e_factor[e] = flow_percentage[e] * 0.01f * TERN(NO_VOLUMETRICS, 1.0f, volumetric_multiplier[e]); + } + + static inline void set_flow(const uint8_t e, const int16_t flow) { + flow_percentage[e] = flow; + refresh_e_factor(e); + } + + #endif + + // Manage fans, paste pressure, etc. + static void check_axes_activity(); + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + void apply_filament_width_sensor(const int8_t encoded_ratio); + + static inline float volumetric_percent(const bool vol) { + return 100.0f * (vol + ? volumetric_area_nominal / volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + : volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] + ); + } + #endif + + #if DISABLED(NO_VOLUMETRICS) + + // Update multipliers based on new diameter measurements + static void calculate_volumetric_multipliers(); + + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + // Update pre calculated extruder feedrate limits based on volumetric values + static void calculate_volumetric_extruder_limit(const uint8_t e); + static void calculate_volumetric_extruder_limits(); + #endif + + FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) { + filament_size[e] = v; + if (v > 0) volumetric_area_nominal = CIRCLE_AREA(v * 0.5); //TODO: should it be per extruder + // make sure all extruders have some sane value for the filament size + LOOP_L_N(i, COUNT(filament_size)) + if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA; + } + + #endif + + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + FORCE_INLINE static void set_volumetric_extruder_limit(const uint8_t e, const float &v) { + volumetric_extruder_limit[e] = v; + calculate_volumetric_extruder_limit(e); + } + #endif + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + + /** + * Get the Z leveling fade factor based on the given Z height, + * re-calculating only when needed. + * + * Returns 1.0 if planner.z_fade_height is 0.0. + * Returns 0.0 if Z is past the specified 'Fade Height'. + */ + static inline float fade_scaling_factor_for_z(const float &rz) { + static float z_fade_factor = 1; + if (!z_fade_height) return 1; + if (rz >= z_fade_height) return 0; + if (last_fade_z != rz) { + last_fade_z = rz; + z_fade_factor = 1 - rz * inverse_z_fade_height; + } + return z_fade_factor; + } + + FORCE_INLINE static void force_fade_recalc() { last_fade_z = -999.999f; } + + FORCE_INLINE static void set_z_fade_height(const float &zfh) { + z_fade_height = zfh > 0 ? zfh : 0; + inverse_z_fade_height = RECIPROCAL(z_fade_height); + force_fade_recalc(); + } + + FORCE_INLINE static bool leveling_active_at_z(const float &rz) { + return !z_fade_height || rz < z_fade_height; + } + + #else + + FORCE_INLINE static float fade_scaling_factor_for_z(const float&) { return 1; } + + FORCE_INLINE static bool leveling_active_at_z(const float&) { return true; } + + #endif + + #if ENABLED(SKEW_CORRECTION) + + FORCE_INLINE static void skew(float &cx, float &cy, const float &cz) { + if (WITHIN(cx, X_MIN_POS + 1, X_MAX_POS) && WITHIN(cy, Y_MIN_POS + 1, Y_MAX_POS)) { + const float sx = cx - cy * skew_factor.xy - cz * (skew_factor.xz - (skew_factor.xy * skew_factor.yz)), + sy = cy - cz * skew_factor.yz; + if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) { + cx = sx; cy = sy; + } + } + } + FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } + + FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { + if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) { + const float sx = cx + cy * skew_factor.xy + cz * skew_factor.xz, + sy = cy + cz * skew_factor.yz; + if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) { + cx = sx; cy = sy; + } + } + } + FORCE_INLINE static void unskew(xyz_pos_t &raw) { unskew(raw.x, raw.y, raw.z); } + + #endif // SKEW_CORRECTION + + #if HAS_LEVELING + /** + * Apply leveling to transform a cartesian position + * as it will be given to the planner and steppers. + */ + static void apply_leveling(xyz_pos_t &raw); + static void unapply_leveling(xyz_pos_t &raw); + FORCE_INLINE static void force_unapply_leveling(xyz_pos_t &raw) { + leveling_active = true; + unapply_leveling(raw); + leveling_active = false; + } + #else + FORCE_INLINE static void apply_leveling(xyz_pos_t&) {} + FORCE_INLINE static void unapply_leveling(xyz_pos_t&) {} + #endif + + #if ENABLED(FWRETRACT) + static void apply_retract(float &rz, float &e); + FORCE_INLINE static void apply_retract(xyze_pos_t &raw) { apply_retract(raw.z, raw.e); } + static void unapply_retract(float &rz, float &e); + FORCE_INLINE static void unapply_retract(xyze_pos_t &raw) { unapply_retract(raw.z, raw.e); } + #endif + + #if HAS_POSITION_MODIFIERS + FORCE_INLINE static void apply_modifiers(xyze_pos_t &pos, bool leveling=ENABLED(PLANNER_LEVELING)) { + TERN_(SKEW_CORRECTION, skew(pos)); + if (leveling) apply_leveling(pos); + TERN_(FWRETRACT, apply_retract(pos)); + } + + FORCE_INLINE static void unapply_modifiers(xyze_pos_t &pos, bool leveling=ENABLED(PLANNER_LEVELING)) { + TERN_(FWRETRACT, unapply_retract(pos)); + if (leveling) unapply_leveling(pos); + TERN_(SKEW_CORRECTION, unskew(pos)); + } + #endif // HAS_POSITION_MODIFIERS + + // Number of moves currently in the planner including the busy block, if any + FORCE_INLINE static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail); } + + // Number of nonbusy moves currently in the planner + FORCE_INLINE static uint8_t nonbusy_movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_nonbusy); } + + // Remove all blocks from the buffer + FORCE_INLINE static void clear_block_buffer() { block_buffer_nonbusy = block_buffer_planned = block_buffer_head = block_buffer_tail = 0; } + + // Check if movement queue is full + FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); } + + // Get count of movement slots free + FORCE_INLINE static uint8_t moves_free() { return BLOCK_BUFFER_SIZE - 1 - movesplanned(); } + + /** + * Planner::get_next_free_block + * + * - Get the next head indices (passed by reference) + * - Wait for the number of spaces to open up in the planner + * - Return the first head block + */ + FORCE_INLINE static block_t* get_next_free_block(uint8_t &next_buffer_head, const uint8_t count=1) { + + // Wait until there are enough slots free + while (moves_free() < count) { idle(); } + + // Return the first available block + next_buffer_head = next_block_index(block_buffer_head); + return &block_buffer[block_buffer_head]; + } + + /** + * Planner::_buffer_steps + * + * Add a new linear movement to the buffer (in terms of steps). + * + * target - target position in steps units + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * millimeters - the length of the movement, if known + * + * Returns true if movement was buffered, false otherwise + */ + static bool _buffer_steps(const xyze_long_t &target + #if HAS_POSITION_FLOAT + , const xyze_pos_t &target_float + #endif + #if HAS_DIST_MM_ARG + , const xyze_float_t &cart_dist_mm + #endif + , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ); + + /** + * Planner::_populate_block + * + * Fills a new linear movement in the block (in terms of steps). + * + * target - target position in steps units + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * millimeters - the length of the movement, if known + * + * Returns true is movement is acceptable, false otherwise + */ + static bool _populate_block(block_t * const block, bool split_move, + const xyze_long_t &target + #if HAS_POSITION_FLOAT + , const xyze_pos_t &target_float + #endif + #if HAS_DIST_MM_ARG + , const xyze_float_t &cart_dist_mm + #endif + , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ); + + /** + * Planner::buffer_sync_block + * Add a block to the buffer that just updates the position + */ + static void buffer_sync_block(); + + #if IS_KINEMATIC + private: + + // Allow do_homing_move to access internal functions, such as buffer_segment. + friend void do_homing_move(const AxisEnum, const float, const feedRate_t); + #endif + + /** + * Planner::buffer_segment + * + * Add a new linear movement to the buffer in axis units. + * + * Leveling and kinematics should be applied ahead of calling this. + * + * a,b,c,e - target positions in mm and/or degrees + * fr_mm_s - (target) speed of the move + * extruder - target extruder + * millimeters - the length of the movement, if known + */ + static bool buffer_segment(const float &a, const float &b, const float &c, const float &e + #if HAS_DIST_MM_ARG + , const xyze_float_t &cart_dist_mm + #endif + , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ); + + FORCE_INLINE static bool buffer_segment(abce_pos_t &abce + #if HAS_DIST_MM_ARG + , const xyze_float_t &cart_dist_mm + #endif + , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + ) { + return buffer_segment(abce.a, abce.b, abce.c, abce.e + #if HAS_DIST_MM_ARG + , cart_dist_mm + #endif + , fr_mm_s, extruder, millimeters); + } + + public: + + /** + * Add a new linear movement to the buffer. + * The target is cartesian. It's translated to + * delta/scara if needed. + * + * rx,ry,rz,e - target position in mm or degrees + * fr_mm_s - (target) speed of the move (mm/s) + * extruder - target extruder + * millimeters - the length of the movement, if known + * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) + */ + static bool buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + #if ENABLED(SCARA_FEEDRATE_SCALING) + , const float &inv_duration=0.0 + #endif + ); + + FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + #if ENABLED(SCARA_FEEDRATE_SCALING) + , const float &inv_duration=0.0 + #endif + ) { + return buffer_line(cart.x, cart.y, cart.z, cart.e, fr_mm_s, extruder, millimeters + #if ENABLED(SCARA_FEEDRATE_SCALING) + , inv_duration + #endif + ); + } + + #if ENABLED(DIRECT_STEPPING) + static void buffer_page(const page_idx_t page_idx, const uint8_t extruder, const uint16_t num_steps); + #endif + + /** + * Set the planner.position and individual stepper positions. + * Used by G92, G28, G29, and other procedures. + * + * The supplied position is in the cartesian coordinate space and is + * translated in to machine space as needed. Modifiers such as leveling + * and skew are also applied. + * + * Multiplies by axis_steps_per_mm[] and does necessary conversion + * for COREXY / COREXZ / COREYZ to set the corresponding stepper positions. + * + * Clears previous speed values. + */ + static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e); + FORCE_INLINE static void set_position_mm(const xyze_pos_t &cart) { set_position_mm(cart.x, cart.y, cart.z, cart.e); } + static void set_e_position_mm(const float &e); + + /** + * Set the planner.position and individual stepper positions. + * + * The supplied position is in machine space, and no additional + * conversions are applied. + */ + static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e); + FORCE_INLINE static void set_machine_position_mm(const abce_pos_t &abce) { set_machine_position_mm(abce.a, abce.b, abce.c, abce.e); } + + /** + * Get an axis position according to stepper position(s) + * For CORE machines apply translation from ABC to XYZ. + */ + static float get_axis_position_mm(const AxisEnum axis); + + static inline abce_pos_t get_axis_positions_mm() { + const abce_pos_t out = { + get_axis_position_mm(A_AXIS), + get_axis_position_mm(B_AXIS), + get_axis_position_mm(C_AXIS), + get_axis_position_mm(E_AXIS) + }; + return out; + } + + // SCARA AB axes are in degrees, not mm + #if IS_SCARA + FORCE_INLINE static float get_axis_position_degrees(const AxisEnum axis) { return get_axis_position_mm(axis); } + #endif + + // Called to force a quick stop of the machine (for example, when + // a Full Shutdown is required, or when endstops are hit) + static void quick_stop(); + + // Called when an endstop is triggered. Causes the machine to stop inmediately + static void endstop_triggered(const AxisEnum axis); + + // Triggered position of an axis in mm (not core-savvy) + static float triggered_position_mm(const AxisEnum axis); + + // Block until all buffered steps are executed / cleaned + static void synchronize(); + + // Wait for moves to finish and disable all steppers + static void finish_and_disable(); + + // Periodic tick to handle cleaning timeouts + // Called from the Temperature ISR at ~1kHz + static void tick() { + if (cleaning_buffer_counter) --cleaning_buffer_counter; + } + + /** + * Does the buffer have any blocks queued? + */ + FORCE_INLINE static bool has_blocks_queued() { return (block_buffer_head != block_buffer_tail); } + + /** + * Get the current block for processing + * and mark the block as busy. + * Return nullptr if the buffer is empty + * or if there is a first-block delay. + * + * WARNING: Called from Stepper ISR context! + */ + static block_t* get_current_block(); + + /** + * "Release" the current block so its slot can be reused. + * Called when the current block is no longer needed. + */ + FORCE_INLINE static void release_current_block() { + if (has_blocks_queued()) + block_buffer_tail = next_block_index(block_buffer_tail); + } + + #if HAS_WIRED_LCD + static uint16_t block_buffer_runtime(); + static void clear_block_buffer_runtime(); + #endif + + #if ENABLED(AUTOTEMP) + static float autotemp_min, autotemp_max, autotemp_factor; + static bool autotemp_enabled; + static void getHighESpeed(); + static void autotemp_M104_M109(); + static void autotemp_update(); + #endif + + #if HAS_LINEAR_E_JERK + FORCE_INLINE static void recalculate_max_e_jerk() { + const float prop = junction_deviation_mm * SQRT(0.5) / (1.0f - SQRT(0.5)); + LOOP_L_N(i, EXTRUDERS) + max_e_jerk[E_INDEX_N(i)] = SQRT(prop * settings.max_acceleration_mm_per_s2[E_INDEX_N(i)]); + } + #endif + + private: + + /** + * Get the index of the next / previous block in the ring buffer + */ + static constexpr uint8_t next_block_index(const uint8_t block_index) { return BLOCK_MOD(block_index + 1); } + static constexpr uint8_t prev_block_index(const uint8_t block_index) { return BLOCK_MOD(block_index - 1); } + + /** + * Calculate the distance (not time) it takes to accelerate + * from initial_rate to target_rate using the given acceleration: + */ + static float estimate_acceleration_distance(const float &initial_rate, const float &target_rate, const float &accel) { + if (accel == 0) return 0; // accel was 0, set acceleration distance to 0 + return (sq(target_rate) - sq(initial_rate)) / (accel * 2); + } + + /** + * Return the point at which you must start braking (at the rate of -'accel') if + * you start at 'initial_rate', accelerate (until reaching the point), and want to end at + * 'final_rate' after traveling 'distance'. + * + * This is used to compute the intersection point between acceleration and deceleration + * in cases where the "trapezoid" has no plateau (i.e., never reaches maximum speed) + */ + static float intersection_distance(const float &initial_rate, const float &final_rate, const float &accel, const float &distance) { + if (accel == 0) return 0; // accel was 0, set intersection distance to 0 + return (accel * 2 * distance - sq(initial_rate) + sq(final_rate)) / (accel * 4); + } + + /** + * Calculate the maximum allowable speed squared at this point, in order + * to reach 'target_velocity_sqr' using 'acceleration' within a given + * 'distance'. + */ + static float max_allowable_speed_sqr(const float &accel, const float &target_velocity_sqr, const float &distance) { + return target_velocity_sqr - 2 * accel * distance; + } + + #if ENABLED(S_CURVE_ACCELERATION) + /** + * Calculate the speed reached given initial speed, acceleration and distance + */ + static float final_speed(const float &initial_velocity, const float &accel, const float &distance) { + return SQRT(sq(initial_velocity) + 2 * accel * distance); + } + #endif + + static void calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor); + + static void reverse_pass_kernel(block_t* const current, const block_t * const next); + static void forward_pass_kernel(const block_t * const previous, block_t* const current, uint8_t block_index); + + static void reverse_pass(); + static void forward_pass(); + + static void recalculate_trapezoids(); + + static void recalculate(); + + #if HAS_JUNCTION_DEVIATION + + FORCE_INLINE static void normalize_junction_vector(xyze_float_t &vector) { + float magnitude_sq = 0; + LOOP_XYZE(idx) if (vector[idx]) magnitude_sq += sq(vector[idx]); + vector *= RSQRT(magnitude_sq); + } + + FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, xyze_float_t &unit_vec) { + float limit_value = max_value; + LOOP_XYZE(idx) { + if (unit_vec[idx]) { + if (limit_value * ABS(unit_vec[idx]) > settings.max_acceleration_mm_per_s2[idx]) + limit_value = ABS(settings.max_acceleration_mm_per_s2[idx] / unit_vec[idx]); + } + } + return limit_value; + } + + #endif // !CLASSIC_JERK +}; + +#define PLANNER_XY_FEEDRATE() (_MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS])) + +extern Planner planner; diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp new file mode 100644 index 00000000..02d878d5 --- /dev/null +++ b/Marlin/src/module/planner_bezier.cpp @@ -0,0 +1,204 @@ +/** + * 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 . + * + */ + +/** + * planner_bezier.cpp + * + * Compute and buffer movement commands for bezier curves + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(BEZIER_CURVE_SUPPORT) + +#include "planner.h" +#include "motion.h" +#include "temperature.h" + +#include "../MarlinCore.h" +#include "../gcode/queue.h" + +// See the meaning in the documentation of cubic_b_spline(). +#define MIN_STEP 0.002f +#define MAX_STEP 0.1f +#define SIGMA 0.1f + +// Compute the linear interpolation between two real numbers. +static inline float interp(const float &a, const float &b, const float &t) { return (1 - t) * a + t * b; } + +/** + * Compute a Bézier curve using the De Casteljau's algorithm (see + * https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm), which is + * easy to code and has good numerical stability (very important, + * since Arudino works with limited precision real numbers). + */ +static inline float eval_bezier(const float &a, const float &b, const float &c, const float &d, const float &t) { + const float iab = interp(a, b, t), + ibc = interp(b, c, t), + icd = interp(c, d, t), + iabc = interp(iab, ibc, t), + ibcd = interp(ibc, icd, t); + return interp(iabc, ibcd, t); +} + +/** + * We approximate Euclidean distance with the sum of the coordinates + * offset (so-called "norm 1"), which is quicker to compute. + */ +static inline float dist1(const float &x1, const float &y1, const float &x2, const float &y2) { return ABS(x1 - x2) + ABS(y1 - y2); } + +/** + * The algorithm for computing the step is loosely based on the one in Kig + * (See https://sources.debian.net/src/kig/4:15.08.3-1/misc/kigpainter.cpp/#L759) + * However, we do not use the stack. + * + * The algorithm goes as it follows: the parameters t runs from 0.0 to + * 1.0 describing the curve, which is evaluated by eval_bezier(). At + * each iteration we have to choose a step, i.e., the increment of the + * t variable. By default the step of the previous iteration is taken, + * and then it is enlarged or reduced depending on how straight the + * curve locally is. The step is always clamped between MIN_STEP/2 and + * 2*MAX_STEP. MAX_STEP is taken at the first iteration. + * + * For some t, the step value is considered acceptable if the curve in + * the interval [t, t+step] is sufficiently straight, i.e., + * sufficiently close to linear interpolation. In practice the + * following test is performed: the distance between eval_bezier(..., + * t+step/2) is evaluated and compared with 0.5*(eval_bezier(..., + * t)+eval_bezier(..., t+step)). If it is smaller than SIGMA, then the + * step value is considered acceptable, otherwise it is not. The code + * seeks to find the larger step value which is considered acceptable. + * + * At every iteration the recorded step value is considered and then + * iteratively halved until it becomes acceptable. If it was already + * acceptable in the beginning (i.e., no halving were done), then + * maybe it was necessary to enlarge it; then it is iteratively + * doubled while it remains acceptable. The last acceptable value + * found is taken, provided that it is between MIN_STEP and MAX_STEP + * and does not bring t over 1.0. + * + * Caveat: this algorithm is not perfect, since it can happen that a + * step is considered acceptable even when the curve is not linear at + * all in the interval [t, t+step] (but its mid point coincides "by + * chance" with the midpoint according to the parametrization). This + * kind of glitches can be eliminated with proper first derivative + * estimates; however, given the improbability of such configurations, + * the mitigation offered by MIN_STEP and the small computational + * power available on Arduino, I think it is not wise to implement it. + */ +void cubic_b_spline( + const xyze_pos_t &position, // current position + const xyze_pos_t &target, // target position + const xy_pos_t (&offsets)[2], // a pair of offsets + const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % + const uint8_t extruder +) { + // Absolute first and second control points are recovered. + const xy_pos_t first = position + offsets[0], second = target + offsets[1]; + + xyze_pos_t bez_target; + bez_target.set(position.x, position.y); + float step = MAX_STEP; + + millis_t next_idle_ms = millis() + 200UL; + + for (float t = 0; t < 1;) { + + thermalManager.manage_heater(); + millis_t now = millis(); + if (ELAPSED(now, next_idle_ms)) { + next_idle_ms = now + 200UL; + idle(); + } + + // First try to reduce the step in order to make it sufficiently + // close to a linear interpolation. + bool did_reduce = false; + float new_t = t + step; + NOMORE(new_t, 1); + float new_pos0 = eval_bezier(position.x, first.x, second.x, target.x, new_t), + new_pos1 = eval_bezier(position.y, first.y, second.y, target.y, new_t); + for (;;) { + if (new_t - t < (MIN_STEP)) break; + const float candidate_t = 0.5f * (t + new_t), + candidate_pos0 = eval_bezier(position.x, first.x, second.x, target.x, candidate_t), + candidate_pos1 = eval_bezier(position.y, first.y, second.y, target.y, candidate_t), + interp_pos0 = 0.5f * (bez_target.x + new_pos0), + interp_pos1 = 0.5f * (bez_target.y + new_pos1); + if (dist1(candidate_pos0, candidate_pos1, interp_pos0, interp_pos1) <= (SIGMA)) break; + new_t = candidate_t; + new_pos0 = candidate_pos0; + new_pos1 = candidate_pos1; + did_reduce = true; + } + + // If we did not reduce the step, maybe we should enlarge it. + if (!did_reduce) for (;;) { + if (new_t - t > MAX_STEP) break; + const float candidate_t = t + 2 * (new_t - t); + if (candidate_t >= 1) break; + const float candidate_pos0 = eval_bezier(position.x, first.x, second.x, target.x, candidate_t), + candidate_pos1 = eval_bezier(position.y, first.y, second.y, target.y, candidate_t), + interp_pos0 = 0.5f * (bez_target.x + candidate_pos0), + interp_pos1 = 0.5f * (bez_target.y + candidate_pos1); + if (dist1(new_pos0, new_pos1, interp_pos0, interp_pos1) > (SIGMA)) break; + new_t = candidate_t; + new_pos0 = candidate_pos0; + new_pos1 = candidate_pos1; + } + + // Check some postcondition; they are disabled in the actual + // Marlin build, but if you test the same code on a computer you + // may want to check they are respect. + /* + assert(new_t <= 1.0); + if (new_t < 1.0) { + assert(new_t - t >= (MIN_STEP) / 2.0); + assert(new_t - t <= (MAX_STEP) * 2.0); + } + */ + + step = new_t - t; + t = new_t; + + // Compute and send new position + xyze_pos_t new_bez = { + new_pos0, new_pos1, + interp(position.z, target.z, t), // FIXME. These two are wrong, since the parameter t is + interp(position.e, target.e, t) // not linear in the distance. + }; + apply_motion_limits(new_bez); + bez_target = new_bez; + + #if HAS_LEVELING && !PLANNER_LEVELING + xyze_pos_t pos = bez_target; + planner.apply_leveling(pos); + #else + const xyze_pos_t &pos = bez_target; + #endif + + if (!planner.buffer_line(pos, scaled_fr_mm_s, active_extruder, step)) + break; + } +} + +#endif // BEZIER_CURVE_SUPPORT diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h new file mode 100644 index 00000000..72048c42 --- /dev/null +++ b/Marlin/src/module/planner_bezier.h @@ -0,0 +1,38 @@ +/** + * 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 + +/** + * planner_bezier.h + * + * Compute and buffer movement commands for Bézier curves + */ + +#include "../core/types.h" + +void cubic_b_spline( + const xyze_pos_t &position, // current position + const xyze_pos_t &target, // target position + const xy_pos_t (&offsets)[2], // a pair of offsets + const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % + const uint8_t extruder +); diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp new file mode 100644 index 00000000..86aedf21 --- /dev/null +++ b/Marlin/src/module/printcounter.cpp @@ -0,0 +1,341 @@ +/** + * 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 DISABLED(PRINTCOUNTER) + +#include "../libs/stopwatch.h" +Stopwatch print_job_timer; // Global Print Job Timer instance + +#else // PRINTCOUNTER + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#include "printcounter.h" +#include "../MarlinCore.h" +#include "../HAL/shared/eeprom_api.h" + +#if HAS_BUZZER && SERVICE_WARNING_BUZZES > 0 + #include "../libs/buzzer.h" +#endif + +// Service intervals +#if HAS_SERVICE_INTERVALS + #if SERVICE_INTERVAL_1 > 0 + #define SERVICE_INTERVAL_SEC_1 (3600UL * SERVICE_INTERVAL_1) + #else + #define SERVICE_INTERVAL_SEC_1 (3600UL * 100) + #endif + #if SERVICE_INTERVAL_2 > 0 + #define SERVICE_INTERVAL_SEC_2 (3600UL * SERVICE_INTERVAL_2) + #else + #define SERVICE_INTERVAL_SEC_2 (3600UL * 100) + #endif + #if SERVICE_INTERVAL_3 > 0 + #define SERVICE_INTERVAL_SEC_3 (3600UL * SERVICE_INTERVAL_3) + #else + #define SERVICE_INTERVAL_SEC_3 (3600UL * 100) + #endif +#endif + +PrintCounter print_job_timer; // Global Print Job Timer instance + +printStatistics PrintCounter::data; + +const PrintCounter::eeprom_address_t PrintCounter::address = STATS_EEPROM_ADDRESS; + +millis_t PrintCounter::lastDuration; +bool PrintCounter::loaded = false; + +millis_t PrintCounter::deltaDuration() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("deltaDuration"))); + millis_t tmp = lastDuration; + lastDuration = duration(); + return lastDuration - tmp; +} + +void PrintCounter::incFilamentUsed(float const &amount) { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("incFilamentUsed"))); + + // Refuses to update data if object is not loaded + if (!isLoaded()) return; + + data.filamentUsed += amount; // mm +} + +void PrintCounter::initStats() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("initStats"))); + + loaded = true; + data = { 0, 0, 0, 0, 0.0 + #if HAS_SERVICE_INTERVALS + #if SERVICE_INTERVAL_1 > 0 + , SERVICE_INTERVAL_SEC_1 + #endif + #if SERVICE_INTERVAL_2 > 0 + , SERVICE_INTERVAL_SEC_2 + #endif + #if SERVICE_INTERVAL_3 > 0 + , SERVICE_INTERVAL_SEC_3 + #endif + #endif + }; + + saveStats(); + persistentStore.access_start(); + persistentStore.write_data(address, (uint8_t)0x16); + persistentStore.access_finish(); +} + +#if HAS_SERVICE_INTERVALS + inline void _print_divider() { SERIAL_ECHO_MSG("============================================="); } + inline bool _service_warn(const char * const msg) { + _print_divider(); + SERIAL_ECHO_START(); + serialprintPGM(msg); + SERIAL_ECHOLNPGM("!"); + _print_divider(); + return true; + } +#endif + +void PrintCounter::loadStats() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("loadStats"))); + + // Check if the EEPROM block is initialized + uint8_t value = 0; + persistentStore.access_start(); + persistentStore.read_data(address, &value, sizeof(uint8_t)); + if (value != 0x16) + initStats(); + else + persistentStore.read_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics)); + persistentStore.access_finish(); + loaded = true; + + #if HAS_SERVICE_INTERVALS + bool doBuzz = false; + #if SERVICE_INTERVAL_1 > 0 + if (data.nextService1 == 0) doBuzz = _service_warn(PSTR(" " SERVICE_NAME_1)); + #endif + #if SERVICE_INTERVAL_2 > 0 + if (data.nextService2 == 0) doBuzz = _service_warn(PSTR(" " SERVICE_NAME_2)); + #endif + #if SERVICE_INTERVAL_3 > 0 + if (data.nextService3 == 0) doBuzz = _service_warn(PSTR(" " SERVICE_NAME_3)); + #endif + #if HAS_BUZZER && SERVICE_WARNING_BUZZES > 0 + if (doBuzz) for (int i = 0; i < SERVICE_WARNING_BUZZES; i++) BUZZ(200, 404); + #else + UNUSED(doBuzz); + #endif + #endif // HAS_SERVICE_INTERVALS +} + +void PrintCounter::saveStats() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("saveStats"))); + + // Refuses to save data if object is not loaded + if (!isLoaded()) return; + + // Saves the struct to EEPROM + persistentStore.access_start(); + persistentStore.write_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics)); + persistentStore.access_finish(); + + TERN_(EXTENSIBLE_UI, ExtUI::onConfigurationStoreWritten(true)); +} + +#if HAS_SERVICE_INTERVALS + inline void _service_when(char buffer[], const char * const msg, const uint32_t when) { + SERIAL_ECHOPGM(STR_STATS); + serialprintPGM(msg); + SERIAL_ECHOLNPAIR(" in ", duration_t(when).toString(buffer)); + } +#endif + +void PrintCounter::showStats() { + char buffer[21]; + + SERIAL_ECHOPGM(STR_STATS); + SERIAL_ECHOLNPAIR( + "Prints: ", data.totalPrints, + ", Finished: ", data.finishedPrints, + ", Failed: ", data.totalPrints - data.finishedPrints + - ((isRunning() || isPaused()) ? 1 : 0) // Remove 1 from failures with an active counter + ); + + SERIAL_ECHOPGM(STR_STATS); + duration_t elapsed = data.printTime; + elapsed.toString(buffer); + SERIAL_ECHOPAIR("Total time: ", buffer); + #if ENABLED(DEBUG_PRINTCOUNTER) + SERIAL_ECHOPAIR(" (", data.printTime); + SERIAL_CHAR(')'); + #endif + + elapsed = data.longestPrint; + elapsed.toString(buffer); + SERIAL_ECHOPAIR(", Longest job: ", buffer); + #if ENABLED(DEBUG_PRINTCOUNTER) + SERIAL_ECHOPAIR(" (", data.longestPrint); + SERIAL_CHAR(')'); + #endif + + SERIAL_ECHOPAIR("\n" STR_STATS "Filament used: ", data.filamentUsed / 1000); + SERIAL_CHAR('m'); + SERIAL_EOL(); + + #if SERVICE_INTERVAL_1 > 0 + _service_when(buffer, PSTR(SERVICE_NAME_1), data.nextService1); + #endif + #if SERVICE_INTERVAL_2 > 0 + _service_when(buffer, PSTR(SERVICE_NAME_2), data.nextService2); + #endif + #if SERVICE_INTERVAL_3 > 0 + _service_when(buffer, PSTR(SERVICE_NAME_3), data.nextService3); + #endif +} + +void PrintCounter::tick() { + if (!isRunning()) return; + + millis_t now = millis(); + + static uint32_t update_next; // = 0 + if (ELAPSED(now, update_next)) { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("tick"))); + millis_t delta = deltaDuration(); + data.printTime += delta; + + #if SERVICE_INTERVAL_1 > 0 + data.nextService1 -= _MIN(delta, data.nextService1); + #endif + #if SERVICE_INTERVAL_2 > 0 + data.nextService2 -= _MIN(delta, data.nextService2); + #endif + #if SERVICE_INTERVAL_3 > 0 + data.nextService3 -= _MIN(delta, data.nextService3); + #endif + + update_next = now + updateInterval * 1000; + } + + static uint32_t eeprom_next; // = 0 + if (ELAPSED(now, eeprom_next)) { + eeprom_next = now + saveInterval * 1000; + saveStats(); + } +} + +// @Override +bool PrintCounter::start() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("start"))); + + bool paused = isPaused(); + + if (super::start()) { + if (!paused) { + data.totalPrints++; + lastDuration = 0; + } + return true; + } + + return false; +} + +// @Override +bool PrintCounter::stop() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop"))); + + if (super::stop()) { + data.finishedPrints++; + data.printTime += deltaDuration(); + + if (duration() > data.longestPrint) + data.longestPrint = duration(); + + saveStats(); + return true; + } + else return false; +} + +// @Override +void PrintCounter::reset() { + TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop"))); + + super::reset(); + lastDuration = 0; +} + +#if HAS_SERVICE_INTERVALS + + void PrintCounter::resetServiceInterval(const int index) { + switch (index) { + #if SERVICE_INTERVAL_1 > 0 + case 1: data.nextService1 = SERVICE_INTERVAL_SEC_1; + #endif + #if SERVICE_INTERVAL_2 > 0 + case 2: data.nextService2 = SERVICE_INTERVAL_SEC_2; + #endif + #if SERVICE_INTERVAL_3 > 0 + case 3: data.nextService3 = SERVICE_INTERVAL_SEC_3; + #endif + } + saveStats(); + } + + bool PrintCounter::needsService(const int index) { + switch (index) { + #if SERVICE_INTERVAL_1 > 0 + case 1: return data.nextService1 == 0; + #endif + #if SERVICE_INTERVAL_2 > 0 + case 2: return data.nextService2 == 0; + #endif + #if SERVICE_INTERVAL_3 > 0 + case 3: return data.nextService3 == 0; + #endif + default: return false; + } + } + +#endif // HAS_SERVICE_INTERVALS + +#if ENABLED(DEBUG_PRINTCOUNTER) + + void PrintCounter::debug(const char func[]) { + if (DEBUGGING(INFO)) { + SERIAL_ECHOPGM("PrintCounter::"); + serialprintPGM(func); + SERIAL_ECHOLNPGM("()"); + } + } + +#endif + +#endif // PRINTCOUNTER diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h new file mode 100644 index 00000000..66d8cbb7 --- /dev/null +++ b/Marlin/src/module/printcounter.h @@ -0,0 +1,203 @@ +/** + * 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 "../libs/stopwatch.h" +#include "../libs/duration_t.h" +#include "../inc/MarlinConfig.h" + +// Print debug messages with M111 S2 +//#define DEBUG_PRINTCOUNTER + +// Round up I2C / SPI address to next page boundary (assuming 32 byte pages) +#define STATS_EEPROM_ADDRESS TERN(USE_WIRED_EEPROM, 0x40, 0x32) + +struct printStatistics { // 16 bytes + //const uint8_t magic; // Magic header, it will always be 0x16 + uint16_t totalPrints; // Number of prints + uint16_t finishedPrints; // Number of complete prints + uint32_t printTime; // Accumulated printing time + uint32_t longestPrint; // Longest successful print job + float filamentUsed; // Accumulated filament consumed in mm + #if SERVICE_INTERVAL_1 > 0 + uint32_t nextService1; // Service intervals (or placeholders) + #endif + #if SERVICE_INTERVAL_2 > 0 + uint32_t nextService2; + #endif + #if SERVICE_INTERVAL_3 > 0 + uint32_t nextService3; + #endif +}; + +class PrintCounter: public Stopwatch { + private: + typedef Stopwatch super; + + #if EITHER(USE_WIRED_EEPROM, CPU_32_BIT) + typedef uint32_t eeprom_address_t; + #else + typedef uint16_t eeprom_address_t; + #endif + + static printStatistics data; + + /** + * @brief EEPROM address + * @details Defines the start offset address where the data is stored. + */ + static const eeprom_address_t address; + + /** + * @brief Interval in seconds between counter updates + * @details This const value defines what will be the time between each + * accumulator update. This is different from the EEPROM save interval. + * + * @note The max value for this option is 60(s), otherwise integer + * overflow will happen. + */ + static constexpr uint16_t updateInterval = 10; + + /** + * @brief Interval in seconds between EEPROM saves + * @details This const value defines what will be the time between each + * EEPROM save cycle, the development team recommends to set this value + * no lower than 3600 secs (1 hour). + */ + static constexpr uint16_t saveInterval = 3600; + + /** + * @brief Timestamp of the last call to deltaDuration() + * @details Store the timestamp of the last deltaDuration(), this is + * required due to the updateInterval cycle. + */ + static millis_t lastDuration; + + /** + * @brief Stats were loaded from EEPROM + * @details If set to true it indicates if the statistical data was already + * loaded from the EEPROM. + */ + static bool loaded; + + protected: + /** + * @brief dT since the last call + * @details Return the elapsed time in seconds since the last call, this is + * used internally for print statistics accounting is not intended to be a + * user callable function. + */ + static millis_t deltaDuration(); + + public: + + /** + * @brief Initialize the print counter + */ + static inline void init() { + super::init(); + loadStats(); + } + + /** + * @brief Check if Print Statistics has been loaded + * @details Return true if the statistical data has been loaded. + * @return bool + */ + FORCE_INLINE static bool isLoaded() { return loaded; } + + /** + * @brief Increment the total filament used + * @details The total filament used counter will be incremented by "amount". + * + * @param amount The amount of filament used in mm + */ + static void incFilamentUsed(float const &amount); + + /** + * @brief Reset the Print Statistics + * @details Reset the statistics to zero and saves them to EEPROM creating + * also the magic header. + */ + static void initStats(); + + /** + * @brief Load the Print Statistics + * @details Load the statistics from EEPROM + */ + static void loadStats(); + + /** + * @brief Save the Print Statistics + * @details Save the statistics to EEPROM + */ + static void saveStats(); + + /** + * @brief Serial output the Print Statistics + * @details This function may change in the future, for now it directly + * prints the statistical data to serial. + */ + static void showStats(); + + /** + * @brief Return the currently loaded statistics + * @details Return the raw data, in the same structure used internally + */ + static printStatistics getStats() { return data; } + + /** + * @brief Loop function + * @details This function should be called at loop, it will take care of + * periodically save the statistical data to EEPROM and do time keeping. + */ + static void tick(); + + /** + * The following functions are being overridden + */ + static bool start(); + static bool stop(); + static void reset(); + + #if HAS_SERVICE_INTERVALS + static void resetServiceInterval(const int index); + static bool needsService(const int index); + #endif + + #if ENABLED(DEBUG_PRINTCOUNTER) + + /** + * @brief Print a debug message + * @details Print a simple debug message + */ + static void debug(const char func[]); + + #endif +}; + +// Global Print Job Timer instance +#if ENABLED(PRINTCOUNTER) + extern PrintCounter print_job_timer; +#else + extern Stopwatch print_job_timer; +#endif diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp new file mode 100644 index 00000000..defc22b1 --- /dev/null +++ b/Marlin/src/module/probe.cpp @@ -0,0 +1,738 @@ +/** + * 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 . + * + */ + +/** + * module/probe.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_BED_PROBE + +#include "probe.h" + +#include "../libs/buzzer.h" +#include "motion.h" +#include "temperature.h" +#include "endstops.h" + +#include "../gcode/gcode.h" +#include "../lcd/ultralcd.h" + +#include "../MarlinCore.h" // for stop(), disable_e_steppers, wait_for_user + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(DELTA) + #include "delta.h" +#endif + +#if ENABLED(BABYSTEP_ZPROBE_OFFSET) + #include "planner.h" +#endif + +#if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + #include "../feature/backlash.h" +#endif + +#if ENABLED(BLTOUCH) + #include "../feature/bltouch.h" +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../feature/host_actions.h" // for PROMPT_USER_CONTINUE +#endif + +#if HAS_Z_SERVO_PROBE + #include "servo.h" +#endif + +#if ENABLED(SENSORLESS_PROBING) + #include "stepper.h" + #include "../feature/tmc_util.h" +#endif + +#if QUIET_PROBING + #include "stepper/indirection.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../core/debug_out.h" + +Probe probe; + +xyz_pos_t Probe::offset; // Initialized by settings.load() + +#if HAS_PROBE_XY_OFFSET + const xyz_pos_t &Probe::offset_xy = Probe::offset; +#endif + +#if ENABLED(Z_PROBE_SLED) + + #ifndef SLED_DOCKING_OFFSET + #define SLED_DOCKING_OFFSET 0 + #endif + + /** + * Method to dock/undock a sled designed by Charles Bell. + * + * stow[in] If false, move to MAX_X and engage the solenoid + * If true, move to MAX_X and release the solenoid + */ + static void dock_sled(const bool stow) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("dock_sled(", stow, ")"); + + // Dock sled a bit closer to ensure proper capturing + do_blocking_move_to_x(X_MAX_POS + SLED_DOCKING_OFFSET - ((stow) ? 1 : 0)); + + #if HAS_SOLENOID_1 && DISABLED(EXT_SOLENOID) + WRITE(SOL1_PIN, !stow); // switch solenoid + #endif + } + +#elif ENABLED(TOUCH_MI_PROBE) + + // Move to the magnet to unlock the probe + inline void run_deploy_moves_script() { + #ifndef TOUCH_MI_DEPLOY_XPOS + #define TOUCH_MI_DEPLOY_XPOS X_MIN_POS + #elif TOUCH_MI_DEPLOY_XPOS > X_MAX_BED + TemporaryGlobalEndstopsState unlock_x(false); + #endif + #if TOUCH_MI_DEPLOY_YPOS > Y_MAX_BED + TemporaryGlobalEndstopsState unlock_y(false); + #endif + + #if ENABLED(TOUCH_MI_MANUAL_DEPLOY) + + const screenFunc_t prev_screen = ui.currentScreen; + LCD_MESSAGEPGM(MSG_MANUAL_DEPLOY_TOUCHMI); + ui.return_to_status(); + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Deploy TouchMI"), CONTINUE_STR)); + wait_for_user_response(); + ui.reset_status(); + ui.goto_screen(prev_screen); + + #elif defined(TOUCH_MI_DEPLOY_XPOS) && defined(TOUCH_MI_DEPLOY_YPOS) + do_blocking_move_to_xy(TOUCH_MI_DEPLOY_XPOS, TOUCH_MI_DEPLOY_YPOS); + #elif defined(TOUCH_MI_DEPLOY_XPOS) + do_blocking_move_to_x(TOUCH_MI_DEPLOY_XPOS); + #elif defined(TOUCH_MI_DEPLOY_YPOS) + do_blocking_move_to_y(TOUCH_MI_DEPLOY_YPOS); + #endif + } + + // Move down to the bed to stow the probe + inline void run_stow_moves_script() { + const xyz_pos_t oldpos = current_position; + endstops.enable_z_probe(false); + do_blocking_move_to_z(TOUCH_MI_RETRACT_Z, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + do_blocking_move_to(oldpos, MMM_TO_MMS(HOMING_FEEDRATE_Z)); + } + +#elif ENABLED(Z_PROBE_ALLEN_KEY) + + inline void run_deploy_moves_script() { + #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_1 + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t deploy_1 = Z_PROBE_ALLEN_KEY_DEPLOY_1; + do_blocking_move_to(deploy_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_1_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_2 + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t deploy_2 = Z_PROBE_ALLEN_KEY_DEPLOY_2; + do_blocking_move_to(deploy_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_2_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_3 + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t deploy_3 = Z_PROBE_ALLEN_KEY_DEPLOY_3; + do_blocking_move_to(deploy_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_3_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_4 + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t deploy_4 = Z_PROBE_ALLEN_KEY_DEPLOY_4; + do_blocking_move_to(deploy_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_4_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_DEPLOY_5 + #ifndef Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE + #define Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t deploy_5 = Z_PROBE_ALLEN_KEY_DEPLOY_5; + do_blocking_move_to(deploy_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_DEPLOY_5_FEEDRATE)); + #endif + } + + inline void run_stow_moves_script() { + #ifdef Z_PROBE_ALLEN_KEY_STOW_1 + #ifndef Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t stow_1 = Z_PROBE_ALLEN_KEY_STOW_1; + do_blocking_move_to(stow_1, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_1_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_STOW_2 + #ifndef Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t stow_2 = Z_PROBE_ALLEN_KEY_STOW_2; + do_blocking_move_to(stow_2, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_2_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_STOW_3 + #ifndef Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t stow_3 = Z_PROBE_ALLEN_KEY_STOW_3; + do_blocking_move_to(stow_3, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_3_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_STOW_4 + #ifndef Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t stow_4 = Z_PROBE_ALLEN_KEY_STOW_4; + do_blocking_move_to(stow_4, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_4_FEEDRATE)); + #endif + #ifdef Z_PROBE_ALLEN_KEY_STOW_5 + #ifndef Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE + #define Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE 0.0 + #endif + constexpr xyz_pos_t stow_5 = Z_PROBE_ALLEN_KEY_STOW_5; + do_blocking_move_to(stow_5, MMM_TO_MMS(Z_PROBE_ALLEN_KEY_STOW_5_FEEDRATE)); + #endif + } + +#endif // Z_PROBE_ALLEN_KEY + +#if QUIET_PROBING + + void Probe::set_probing_paused(const bool p) { + TERN_(PROBING_HEATERS_OFF, thermalManager.pause(p)); + TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(p)); + #if ENABLED(PROBING_STEPPERS_OFF) + disable_e_steppers(); + #if NONE(DELTA, HOME_AFTER_DEACTIVATE) + DISABLE_AXIS_X(); DISABLE_AXIS_Y(); + #endif + #endif + if (p) safe_delay(25 + #if DELAY_BEFORE_PROBING > 25 + - 25 + DELAY_BEFORE_PROBING + #endif + ); + } + +#endif // QUIET_PROBING + +/** + * 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::do_z_raise(", z_raise, ")"); + float z_dest = z_raise; + if (offset.z < 0) z_dest -= offset.z; + do_z_clearance(z_dest); +} + +FORCE_INLINE void probe_specific_action(const bool deploy) { + #if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) + do { + #if ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED) + if (deploy == ( + #if HAS_CUSTOM_PROBE_PIN + READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_INVERTING + #else + READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_INVERTING + #endif + )) break; + #endif + + BUZZ(100, 659); + BUZZ(100, 698); + + PGM_P const ds_str = deploy ? GET_TEXT(MSG_MANUAL_DEPLOY) : GET_TEXT(MSG_MANUAL_STOW); + ui.return_to_status(); // To display the new status message + ui.set_status_P(ds_str, 99); + serialprintPGM(ds_str); + SERIAL_EOL(); + + TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), CONTINUE_STR)); + TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe"))); + + wait_for_user_response(); + ui.reset_status(); + + } while (ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED)); + + #endif // PAUSE_BEFORE_DEPLOY_STOW + + #if ENABLED(SOLENOID_PROBE) + + #if HAS_SOLENOID_1 + WRITE(SOL1_PIN, deploy); + #endif + + #elif ENABLED(Z_PROBE_SLED) + + dock_sled(!deploy); + + #elif ENABLED(BLTOUCH) + + deploy ? bltouch.deploy() : bltouch.stow(); + + #elif HAS_Z_SERVO_PROBE + + MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][deploy ? 0 : 1]); + + #elif EITHER(TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY) + + deploy ? run_deploy_moves_script() : run_stow_moves_script(); + + #elif ENABLED(RACK_AND_PINION_PROBE) + + do_blocking_move_to_x(deploy ? Z_PROBE_DEPLOY_X : Z_PROBE_RETRACT_X); + + #elif DISABLED(PAUSE_BEFORE_DEPLOY_STOW) + + UNUSED(deploy); + + #endif +} + +/** + * Attempt to deploy or stow the probe + * + * Return TRUE if the probe could not be deployed/stowed + */ +bool Probe::set_deployed(const bool deploy) { + + if (DEBUGGING(LEVELING)) { + DEBUG_POS("Probe::set_deployed", current_position); + DEBUG_ECHOLNPAIR("deploy: ", deploy); + } + + if (endstops.z_probe_enabled == deploy) return false; + + // Make room for probe to deploy (or stow) + // Fix-mounted probe should only raise for deploy + // unless PAUSE_BEFORE_DEPLOY_STOW is enabled + #if EITHER(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW) + const bool deploy_stow_condition = deploy; + #else + constexpr bool deploy_stow_condition = true; + #endif + + // For beds that fall when Z is powered off only raise for trusted Z + #if ENABLED(UNKNOWN_Z_NO_RAISE) + const bool unknown_condition = TEST(axis_known_position, Z_AXIS); + #else + constexpr float unknown_condition = true; + #endif + + if (deploy_stow_condition && unknown_condition) + do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); + + #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) + if (homing_needed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { + SERIAL_ERROR_MSG(STR_STOP_UNHOMED); + stop(); + return true; + } + #endif + + const xy_pos_t old_xy = current_position; + + #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) + #if HAS_CUSTOM_PROBE_PIN + #define PROBE_STOWED() (READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING) + #else + #define PROBE_STOWED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) + #endif + #endif + + #ifdef PROBE_STOWED + + // Only deploy/stow if needed + if (PROBE_STOWED() == deploy) { + if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early + // otherwise an Allen-Key probe can't be stowed. + probe_specific_action(deploy); + } + + if (PROBE_STOWED() == deploy) { // Unchanged after deploy/stow action? + if (IsRunning()) { + SERIAL_ERROR_MSG("Z-Probe failed"); + LCD_ALERTMESSAGEPGM_P(PSTR("Err: ZPROBE")); + } + stop(); + return true; + } + + #else + + probe_specific_action(deploy); + + #endif + + do_blocking_move_to(old_xy); + endstops.enable_z_probe(deploy); + return false; +} + +/** + * @brief Used by run_z_probe to do a single Z probe move. + * + * @param z Z destination + * @param fr_mm_s Feedrate in mm/s + * @return true to indicate an error + */ + +/** + * @brief Move down until the probe triggers or the low limit is reached + * + * @details Used by run_z_probe to get each bed Z height measurement. + * Sets current_position.z to the height where the probe triggered + * (according to the Z stepper count). The float Z is propagated + * back to the planner.position to preempt any rounding error. + * + * @return TRUE if the probe failed to trigger. + */ +bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { + 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(); + #endif + + #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + if (bltouch.deploy()) return true; // DEPLOY in LOW SPEED MODE on every probe action + #endif + + // Disable stealthChop if used. Enable diag1 pin on driver. + #if ENABLED(SENSORLESS_PROBING) + sensorless_t stealth_states { false }; + #if ENABLED(DELTA) + stealth_states.x = tmc_enable_stallguard(stepperX); + stealth_states.y = tmc_enable_stallguard(stepperY); + #endif + stealth_states.z = tmc_enable_stallguard(stepperZ); + endstops.enable(true); + #endif + + TERN_(QUIET_PROBING, set_probing_paused(true)); + + // Move down until the probe is triggered + do_blocking_move_to_z(z, fr_mm_s); + + // Check to see if the probe was triggered + const bool probe_triggered = + #if BOTH(DELTA, SENSORLESS_PROBING) + endstops.trigger_state() & (_BV(X_MIN) | _BV(Y_MIN) | _BV(Z_MIN)) + #else + TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE)) + #endif + ; + + TERN_(QUIET_PROBING, set_probing_paused(false)); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + #if ENABLED(SENSORLESS_PROBING) + endstops.not_homing(); + #if ENABLED(DELTA) + tmc_disable_stallguard(stepperX, stealth_states.x); + tmc_disable_stallguard(stepperY, stealth_states.y); + #endif + tmc_disable_stallguard(stepperZ, stealth_states.z); + #endif + + #if ENABLED(BLTOUCH) && DISABLED(BLTOUCH_HS_MODE) + if (probe_triggered && bltouch.stow()) return true; // STOW in LOW SPEED MODE on trigger on every probe action + #endif + + // Clear endstop flags + endstops.hit_on_purpose(); + + // Get Z where the steppers were interrupted + set_current_from_steppers_for_axis(Z_AXIS); + + // Tell the planner where we actually are + sync_plan_position(); + + return !probe_triggered; +} + +/** + * @brief Probe at the current XY (possibly more than once) to find the bed Z. + * + * @details Used by probe_at_point to get the bed Z height at the current XY. + * Leaves current_position.z at the height where the probe triggered. + * + * @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*/) { + 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 + const bool probe_fail = probe_down_to_z(z_probe_low_point, fr_mm_s), // No probe trigger? + early_fail = (scheck && current_position.z > -offset.z + clearance); // Probe triggered too high? + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING) && (probe_fail || early_fail)) { + DEBUG_PRINT_P(plbl); + DEBUG_ECHOPGM(" Probe fail! -"); + if (probe_fail) DEBUG_ECHOPGM(" No trigger."); + if (early_fail) DEBUG_ECHOPGM(" Triggered early."); + DEBUG_EOL(); + } + #else + UNUSED(plbl); + #endif + return probe_fail || early_fail; + }; + + // Stop the probe before it goes too low to prevent damage. + // If Z isn't known then probe to -10mm. + const float z_probe_low_point = TEST(axis_known_position, Z_AXIS) ? -offset.z + Z_PROBE_LOW_POINT : -10.0; + + // Double-probing does a fast probe followed by a slow probe + #if TOTAL_PROBING == 2 + + // 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, Z_CLEARANCE_BETWEEN_PROBES) ) return NAN; + + const float first_probe_z = current_position.z; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("1st Probe Z:", first_probe_z); + + // Raise to give the probe clearance + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + + #elif Z_PROBE_SPEED_FAST != Z_PROBE_SPEED_SLOW + + // If the nozzle is well over the travel height then + // move down quickly before doing the slow probe + const float z = Z_CLEARANCE_DEPLOY_PROBE + 5.0 + (offset.z < 0 ? -offset.z : 0); + if (current_position.z > z) { + // Probe down fast. If the probe never triggered, raise for probe clearance + if (!probe_down_to_z(z, MMM_TO_MMS(Z_PROBE_SPEED_FAST))) + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + } + #endif + + #if EXTRA_PROBING > 0 + float probes[TOTAL_PROBING]; + #endif + + #if TOTAL_PROBING > 2 + float probes_z_sum = 0; + for ( + #if EXTRA_PROBING > 0 + uint8_t p = 0; p < TOTAL_PROBING; p++ + #else + uint8_t p = TOTAL_PROBING; p--; + #endif + ) + #endif + { + // 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, Z_CLEARANCE_MULTI_PROBE) ) return NAN; + + TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); + + const float z = current_position.z; + + #if EXTRA_PROBING > 0 + // Insert Z measurement into probes[]. Keep it sorted ascending. + LOOP_LE_N(i, p) { // Iterate the saved Zs to insert the new Z + if (i == p || probes[i] > z) { // Last index or new Z is smaller than this Z + for (int8_t m = p; --m >= i;) probes[m + 1] = probes[m]; // Shift items down after the insertion point + probes[i] = z; // Insert the new Z measurement + break; // Only one to insert. Done! + } + } + #elif TOTAL_PROBING > 2 + probes_z_sum += z; + #else + UNUSED(z); + #endif + + #if TOTAL_PROBING > 2 + // Small Z raise after all but the last probe + if (p + #if EXTRA_PROBING > 0 + < TOTAL_PROBING - 1 + #endif + ) do_blocking_move_to_z(z + Z_CLEARANCE_MULTI_PROBE, MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + #endif + } + + #if TOTAL_PROBING > 2 + + #if EXTRA_PROBING > 0 + // Take the center value (or average the two middle values) as the median + static constexpr int PHALF = (TOTAL_PROBING - 1) / 2; + const float middle = probes[PHALF], + median = ((TOTAL_PROBING) & 1) ? middle : (middle + probes[PHALF + 1]) * 0.5f; + + // Remove values farthest from the median + uint8_t min_avg_idx = 0, max_avg_idx = TOTAL_PROBING - 1; + for (uint8_t i = EXTRA_PROBING; i--;) + if (ABS(probes[max_avg_idx] - median) > ABS(probes[min_avg_idx] - median)) + max_avg_idx--; else min_avg_idx++; + + // Return the average value of all remaining probes. + LOOP_S_LE_N(i, min_avg_idx, max_avg_idx) + probes_z_sum += probes[i]; + + #endif + + const float measured_z = probes_z_sum * RECIPROCAL(MULTIPLE_PROBING); + + #elif TOTAL_PROBING == 2 + + const float z2 = current_position.z; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("2nd Probe Z:", z2, " Discrepancy:", first_probe_z - z2); + + // Return a weighted average of the fast and slow probes + const float measured_z = (z2 * 3.0 + first_probe_z * 2.0) * 0.2; + + #else + + // Return the single probe result + const float measured_z = current_position.z; + + #endif + + return measured_z; +} + +/** + * - Move to the given XY + * - Deploy the probe, if not already deployed + * - Probe the bed, get the Z position + * - Depending on the 'stow' flag + * - Stow the probe, or + * - Raise to the BETWEEN height + * - 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( + "...(", 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)" + ); + DEBUG_POS("", current_position); + } + + #if BOTH(BLTOUCH, BLTOUCH_HS_MODE) + if (bltouch.triggered()) bltouch._reset(); + #endif + + // TODO: Adapt for SCARA, where the offset rotates + xyz_pos_t npos = { rx, ry }; + if (probe_relative) { // The given position is in terms of the probe + if (!can_reach(npos)) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable"); + return NAN; + } + npos -= offset_xy; // Get the nozzle position + } + else if (!position_is_reachable(npos)) return NAN; // The given position is in terms of the nozzle + + npos.z = + #if ENABLED(DELTA) + // Move below clip height or xy move will be aborted by do_blocking_move_to + _MIN(current_position.z, delta_clip_start_height) + #else + current_position.z + #endif + ; + + const float old_feedrate_mm_s = feedrate_mm_s; + feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S; + + // Move the probe to the starting XYZ + do_blocking_move_to(npos); + + float measured_z = NAN; + if (!deploy()) measured_z = run_z_probe(sanity_check) + offset.z; + if (!isnan(measured_z)) { + const bool big_raise = raise_after == PROBE_PT_BIG_RAISE; + if (big_raise || raise_after == PROBE_PT_RAISE) + do_blocking_move_to_z(current_position.z + (big_raise ? 25 : Z_CLEARANCE_BETWEEN_PROBES), MMM_TO_MMS(Z_PROBE_SPEED_FAST)); + else if (raise_after == PROBE_PT_STOW) + if (stow()) measured_z = NAN; // Error on stow? + + 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; + + if (isnan(measured_z)) { + stow(); + LCD_MESSAGEPGM(MSG_LCD_PROBING_FAILED); + #if DISABLED(G29_RETRY_AND_RECOVER) + SERIAL_ERROR_MSG(STR_ERR_PROBING_FAILED); + #endif + } + + return measured_z; +} + +#if HAS_Z_SERVO_PROBE + + void Probe::servo_probe_init() { + /** + * Set position of Z Servo Endstop + * + * The servo might be deployed and positioned too low to stow + * when starting up the machine or rebooting the board. + * There's no way to know where the nozzle is positioned until + * homing has been done - no homing with z-probe without init! + */ + STOW_Z_SERVO(); + } + +#endif // HAS_Z_SERVO_PROBE + +#endif // HAS_BED_PROBE diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h new file mode 100644 index 00000000..f0f56ec1 --- /dev/null +++ b/Marlin/src/module/probe.h @@ -0,0 +1,225 @@ +/** + * 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 + +/** + * module/probe.h - Move, deploy, enable, etc. + */ + +#include "../inc/MarlinConfig.h" + +#include "motion.h" + +#if HAS_BED_PROBE + enum ProbePtRaise : uint8_t { + PROBE_PT_NONE, // No raise or stow after run_z_probe + PROBE_PT_STOW, // Do a complete stow after run_z_probe + PROBE_PT_RAISE, // Raise to "between" clearance after run_z_probe + PROBE_PT_BIG_RAISE // Raise to big clearance after run_z_probe + }; +#endif + +class Probe { +public: + + #if HAS_BED_PROBE + + static xyz_pos_t offset; + + static bool set_deployed(const bool deploy); + + #if IS_KINEMATIC + + #if HAS_PROBE_XY_OFFSET + // Return true if the both nozzle and the probe can reach the given point. + // Note: This won't work on SCARA since the probe offset rotates with the arm. + static inline bool can_reach(const float &rx, const float &ry) { + return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) // The nozzle can go where it needs to go? + && position_is_reachable(rx, ry, ABS(PROBING_MARGIN)); // Can the nozzle also go near there? + } + #else + FORCE_INLINE static bool can_reach(const float &rx, const float &ry) { + return position_is_reachable(rx, ry, PROBING_MARGIN); + } + #endif + + #else + + /** + * Return whether the given position is within the bed, and whether the nozzle + * can reach the position required to put the probe at the given position. + * + * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the + * nozzle must be be able to reach +10,-10. + */ + static inline bool can_reach(const float &rx, const float &ry) { + return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) + && WITHIN(rx, min_x() - fslop, max_x() + fslop) + && WITHIN(ry, min_y() - fslop, max_y() + fslop); + } + + #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 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); + } + + #else + + static constexpr xyz_pos_t offset = xyz_pos_t({ 0, 0, 0 }); // See #16767 + + static bool set_deployed(const bool) { return false; } + + FORCE_INLINE static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } + + #endif + + static inline void move_z_after_homing() { + #ifdef Z_AFTER_HOMING + do_z_clearance(Z_AFTER_HOMING, true, true, true); + #elif BOTH(Z_AFTER_PROBING,HAS_BED_PROBE) + move_z_after_probing(); + #endif + } + + FORCE_INLINE static bool can_reach(const xy_pos_t &pos) { return can_reach(pos.x, pos.y); } + + FORCE_INLINE static bool good_bounds(const xy_pos_t &lf, const xy_pos_t &rb) { + return ( + #if IS_KINEMATIC + can_reach(lf.x, 0) && can_reach(rb.x, 0) && can_reach(0, lf.y) && can_reach(0, rb.y) + #else + can_reach(lf) && can_reach(rb) + #endif + ); + } + + // Use offset_xy for read only access + // More optimal the XY offset is known to always be zero. + #if HAS_PROBE_XY_OFFSET + static const xyz_pos_t &offset_xy; + #else + static constexpr xy_pos_t offset_xy = xy_pos_t({ 0, 0 }); // See #16767 + #endif + + static inline bool deploy() { return set_deployed(true); } + static inline bool stow() { return set_deployed(false); } + + #if HAS_BED_PROBE || HAS_LEVELING + #if IS_KINEMATIC + static constexpr float printable_radius = ( + #if ENABLED(DELTA) + DELTA_PRINTABLE_RADIUS + #elif IS_SCARA + SCARA_PRINTABLE_RADIUS + #endif + ); + + static inline float probe_radius() { + return printable_radius - _MAX(PROBING_MARGIN, HYPOT(offset_xy.x, offset_xy.y)); + } + #endif + + static inline float min_x() { + return ( + #if IS_KINEMATIC + (X_CENTER) - probe_radius() + #else + _MAX((X_MIN_BED) + (PROBING_MARGIN_LEFT), (X_MIN_POS) + offset_xy.x) + #endif + ); + } + static inline float max_x() { + return ( + #if IS_KINEMATIC + (X_CENTER) + probe_radius() + #else + _MIN((X_MAX_BED) - (PROBING_MARGIN_RIGHT), (X_MAX_POS) + offset_xy.x) + #endif + ); + } + static inline float min_y() { + return ( + #if IS_KINEMATIC + (Y_CENTER) - probe_radius() + #else + _MAX((Y_MIN_BED) + (PROBING_MARGIN_FRONT), (Y_MIN_POS) + offset_xy.y) + #endif + ); + } + static inline float max_y() { + return ( + #if IS_KINEMATIC + (Y_CENTER) + probe_radius() + #else + _MIN((Y_MAX_BED) - (PROBING_MARGIN_BACK), (Y_MAX_POS) + offset_xy.y) + #endif + ); + } + + #if NEEDS_THREE_PROBE_POINTS + // Retrieve three points to probe the bed. Any type exposing set(X,Y) may be used. + template + static inline void get_three_points(T points[3]) { + #if HAS_FIXED_3POINT + points[0].set(PROBE_PT_1_X, PROBE_PT_1_Y); + points[1].set(PROBE_PT_2_X, PROBE_PT_2_Y); + points[2].set(PROBE_PT_3_X, PROBE_PT_3_Y); + #else + #if IS_KINEMATIC + constexpr float SIN0 = 0.0, SIN120 = 0.866025, SIN240 = -0.866025, + COS0 = 1.0, COS120 = -0.5 , COS240 = -0.5; + points[0].set((X_CENTER) + probe_radius() * COS0, (Y_CENTER) + probe_radius() * SIN0); + points[1].set((X_CENTER) + probe_radius() * COS120, (Y_CENTER) + probe_radius() * SIN120); + points[2].set((X_CENTER) + probe_radius() * COS240, (Y_CENTER) + probe_radius() * SIN240); + #else + points[0].set(min_x(), min_y()); + points[1].set(max_x(), min_y()); + points[2].set((min_x() + max_x()) / 2, max_y()); + #endif + #endif + } + #endif + + #endif // HAS_BED_PROBE + + #if HAS_Z_SERVO_PROBE + static void servo_probe_init(); + #endif + + #if QUIET_PROBING + static void set_probing_paused(const bool p); + #endif + +private: + static bool probe_down_to_z(const float z, const feedRate_t fr_mm_s); + static void do_z_raise(const float z_raise); + static float run_z_probe(const bool sanity_check=true); +}; + +extern Probe probe; diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp new file mode 100644 index 00000000..e4b2f0b7 --- /dev/null +++ b/Marlin/src/module/scara.cpp @@ -0,0 +1,164 @@ +/** + * 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 . + * + */ + +/** + * scara.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if IS_SCARA + +#include "scara.h" +#include "motion.h" +#include "planner.h" + +float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND; + +void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + + /** + * SCARA homes XY at the same time + */ + xyz_pos_t homeposition; + LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); + + #if ENABLED(MORGAN_SCARA) + // MORGAN_SCARA uses arm angles for AB home position + // SERIAL_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); + inverse_kinematics(homeposition); + forward_kinematics_SCARA(delta.a, delta.b); + current_position[axis] = cartes[axis]; + #else + // MP_SCARA uses a Cartesian XY home position + // SERIAL_ECHOPGM("homeposition"); + // SERIAL_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); + current_position[axis] = homeposition[axis]; + #endif + + // SERIAL_ECHOPGM("Cartesian"); + // SERIAL_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } +} + +static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; + +/** + * Morgan SCARA Forward Kinematics. Results in 'cartes'. + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ +void forward_kinematics_SCARA(const float &a, const float &b) { + + const float a_sin = sin(RADIANS(a)) * L1, + a_cos = cos(RADIANS(a)) * L1, + b_sin = sin(RADIANS(b)) * L2, + b_cos = cos(RADIANS(b)) * L2; + + cartes.set(a_cos + b_cos + scara_offset.x, // theta + a_sin + b_sin + scara_offset.y); // theta+phi + + /* + SERIAL_ECHOLNPAIR( + "SCARA FK Angle a=", a, + " b=", b, + " a_sin=", a_sin, + " a_cos=", a_cos, + " b_sin=", b_sin, + " b_cos=", b_cos + ); + SERIAL_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); + //*/ +} + +void inverse_kinematics(const xyz_pos_t &raw) { + + #if ENABLED(MORGAN_SCARA) + /** + * Morgan SCARA Inverse Kinematics. Results in 'delta'. + * + * See https://reprap.org/forum/read.php?185,283327 + * + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ + float C2, S2, SK1, SK2, THETA, PSI; + + // Translate SCARA to standard XY with scaling factor + const xy_pos_t spos = raw - scara_offset; + + const float H2 = HYPOT2(spos.x, spos.y); + if (L1 == L2) + C2 = H2 / L1_2_2 - 1; + else + C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); + + S2 = SQRT(1.0f - sq(C2)); + + // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End + SK1 = L1 + L2 * C2; + + // Rotated Arm2 gives the distance from Arm1 to Arm2 + SK2 = L2 * S2; + + // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow + THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); + + // Angle of Arm2 + PSI = ATAN2(S2, C2); + + delta.set(DEGREES(THETA), DEGREES(THETA + PSI), raw.z); + + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + SERIAL_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Phi=", PHI); + //*/ + + #else // MP_SCARA + + const float x = raw.x, y = raw.y, c = HYPOT(x, y), + THETA3 = ATAN2(y, x), + THETA1 = THETA3 + ACOS((sq(c) + sq(L1) - sq(L2)) / (2.0f * c * L1)), + THETA2 = THETA3 - ACOS((sq(c) + sq(L2) - sq(L1)) / (2.0f * c * L2)); + + delta.set(DEGREES(THETA1), DEGREES(THETA2), raw.z); + + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + SERIAL_ECHOLNPAIR(" SCARA (x,y) ", x, ",", y," Theta1=", THETA1, " Theta2=", THETA2); + //*/ + + #endif // MP_SCARA +} + +void scara_report_positions() { + SERIAL_ECHOLNPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS), " Psi+Theta:", planner.get_axis_position_degrees(B_AXIS)); + SERIAL_EOL(); +} + +#endif // IS_SCARA diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h new file mode 100644 index 00000000..e2acaf30 --- /dev/null +++ b/Marlin/src/module/scara.h @@ -0,0 +1,42 @@ +/** + * 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 + +/** + * scara.h - SCARA-specific functions + */ + +#include "../core/macros.h" + +extern float delta_segments_per_second; + +// Float constants for SCARA calculations +float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, + L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, + L2_2 = sq(float(L2)); + +void scara_set_axis_is_at_home(const AxisEnum axis); + +void inverse_kinematics(const xyz_pos_t &raw); +void forward_kinematics_SCARA(const float &a, const float &b); + +void scara_report_positions(); diff --git a/Marlin/src/module/servo.cpp b/Marlin/src/module/servo.cpp new file mode 100644 index 00000000..27e5a2af --- /dev/null +++ b/Marlin/src/module/servo.cpp @@ -0,0 +1,56 @@ +/** + * 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 . + * + */ + +/** + * module/servo.cpp + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "servo.h" + +HAL_SERVO_LIB servo[NUM_SERVOS]; + +TERN_(EDITABLE_SERVO_ANGLES, uint16_t servo_angles[NUM_SERVOS][2]); + +void servo_init() { + #if NUM_SERVOS >= 1 && HAS_SERVO_0 + servo[0].attach(SERVO0_PIN); + servo[0].detach(); // Just set up the pin. We don't have a position yet. Don't move to a random position. + #endif + #if NUM_SERVOS >= 2 && HAS_SERVO_1 + servo[1].attach(SERVO1_PIN); + servo[1].detach(); + #endif + #if NUM_SERVOS >= 3 && HAS_SERVO_2 + servo[2].attach(SERVO2_PIN); + servo[2].detach(); + #endif + #if NUM_SERVOS >= 4 && HAS_SERVO_3 + servo[3].attach(SERVO3_PIN); + servo[3].detach(); + #endif +} + +#endif // HAS_SERVOS diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h new file mode 100644 index 00000000..29bd3b87 --- /dev/null +++ b/Marlin/src/module/servo.h @@ -0,0 +1,115 @@ +/** + * 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 + +/** + * module/servo.h + */ + +#include "../inc/MarlinConfig.h" +#include "../HAL/shared/servo.h" + +#if HAS_SERVO_ANGLES + + #if ENABLED(SWITCHING_EXTRUDER) + // Switching extruder can have 2 or 4 angles + #if EXTRUDERS > 3 + #define REQ_ANGLES 4 + #else + #define REQ_ANGLES 2 + #endif + constexpr uint16_t sase[] = SWITCHING_EXTRUDER_SERVO_ANGLES; + static_assert(COUNT(sase) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles."); + #else + constexpr uint16_t sase[4] = { 0 }; + #endif + + #if ENABLED(SWITCHING_NOZZLE) + constexpr uint16_t sasn[] = SWITCHING_NOZZLE_SERVO_ANGLES; + static_assert(COUNT(sasn) == 2, "SWITCHING_NOZZLE_SERVO_ANGLES needs 2 angles."); + #else + constexpr uint16_t sasn[2] = { 0 }; + #endif + + #ifdef Z_PROBE_SERVO_NR + #if ENABLED(BLTOUCH) + #include "../feature/bltouch.h" + #undef Z_SERVO_ANGLES + #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW } + #endif + constexpr uint16_t sazp[] = Z_SERVO_ANGLES; + static_assert(COUNT(sazp) == 2, "Z_SERVO_ANGLES needs 2 angles."); + #else + constexpr uint16_t sazp[2] = { 0 }; + #endif + + #ifndef SWITCHING_EXTRUDER_SERVO_NR + #define SWITCHING_EXTRUDER_SERVO_NR -1 + #endif + #ifndef SWITCHING_EXTRUDER_E23_SERVO_NR + #define SWITCHING_EXTRUDER_E23_SERVO_NR -1 + #endif + #ifndef SWITCHING_NOZZLE_SERVO_NR + #define SWITCHING_NOZZLE_SERVO_NR -1 + #endif + #ifndef Z_PROBE_SERVO_NR + #define Z_PROBE_SERVO_NR -1 + #endif + + #define ASRC(N,I) ( \ + N == SWITCHING_EXTRUDER_SERVO_NR ? sase[I] \ + : N == SWITCHING_EXTRUDER_E23_SERVO_NR ? sase[I+2] \ + : N == SWITCHING_NOZZLE_SERVO_NR ? sasn[I] \ + : N == Z_PROBE_SERVO_NR ? sazp[I] \ + : 0 ) + + #if ENABLED(EDITABLE_SERVO_ANGLES) + extern uint16_t servo_angles[NUM_SERVOS][2]; + #define CONST_SERVO_ANGLES base_servo_angles + #else + #define CONST_SERVO_ANGLES servo_angles + #endif + + constexpr uint16_t CONST_SERVO_ANGLES [NUM_SERVOS][2] = { + { ASRC(0,0), ASRC(0,1) } + #if NUM_SERVOS > 1 + , { ASRC(1,0), ASRC(1,1) } + #if NUM_SERVOS > 2 + , { ASRC(2,0), ASRC(2,1) } + #if NUM_SERVOS > 3 + , { ASRC(3,0), ASRC(3,1) } + #endif + #endif + #endif + }; + + #if HAS_Z_SERVO_PROBE + #define DEPLOY_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][0]) + #define STOW_Z_SERVO() MOVE_SERVO(Z_PROBE_SERVO_NR, servo_angles[Z_PROBE_SERVO_NR][1]) + #endif + +#endif // HAS_SERVO_ANGLES + +#define MOVE_SERVO(I, P) servo[I].move(P) + +extern HAL_SERVO_LIB servo[NUM_SERVOS]; +extern void servo_init(); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp new file mode 100644 index 00000000..33e5c351 --- /dev/null +++ b/Marlin/src/module/settings.cpp @@ -0,0 +1,3785 @@ +/** + * 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 . + * + */ + +/** + * settings.cpp + * + * Settings and EEPROM storage + * + * IMPORTANT: Whenever there are changes made to the variables stored in EEPROM + * in the functions below, also increment the version number. This makes sure that + * the default values are used whenever there is a change to the data, to prevent + * wrong data being written to the variables. + * + * ALSO: Variables in the Store and Retrieve sections must be in the same order. + * If a feature is disabled, some data must still be written that, when read, + * either sets a Sane Default, or results in No Change to the existing value. + */ + +// Change EEPROM version if the structure changes +#define EEPROM_VERSION "V82" +#define EEPROM_OFFSET 100 + +// Check the integrity of data offsets. +// Can be disabled for production build. +//#define DEBUG_EEPROM_READWRITE + +#include "settings.h" + +#include "endstops.h" +#include "planner.h" +#include "stepper.h" +#include "temperature.h" + +#if ENABLED(DWIN_CREALITY_LCD) + #include "../lcd/dwin/e3v2/dwin.h" +#endif + +#include "../lcd/ultralcd.h" +#include "../libs/vector_3.h" // for matrix_3x3 +#include "../gcode/gcode.h" +#include "../MarlinCore.h" + +#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) + #include "../HAL/shared/eeprom_api.h" +#endif + +#include "probe.h" + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + #include "../feature/z_stepper_align.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#if HAS_SERVOS + #include "servo.h" +#endif + +#if HAS_SERVOS && HAS_SERVO_ANGLES + #define EEPROM_NUM_SERVOS NUM_SERVOS +#else + #define EEPROM_NUM_SERVOS NUM_SERVO_PLUGS +#endif + +#include "../feature/fwretract.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/powerloss.h" +#endif + +#if HAS_POWER_MONITOR + #include "../feature/power_monitor.h" +#endif + +#include "../feature/pause.h" + +#if ENABLED(BACKLASH_COMPENSATION) + #include "../feature/backlash.h" +#endif + +#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) + extern float other_extruder_advance_K[EXTRUDERS]; +#endif + +#if HAS_MULTI_EXTRUDER + #include "tool_change.h" + void M217_report(const bool eeprom); +#endif + +#if ENABLED(BLTOUCH) + #include "../feature/bltouch.h" +#endif + +#if HAS_TRINAMIC_CONFIG + #include "stepper/indirection.h" + #include "../feature/tmc_util.h" +#endif + +#if ENABLED(PROBE_TEMP_COMPENSATION) + #include "../feature/probe_temp_comp.h" +#endif + +#include "../feature/controllerfan.h" +#if ENABLED(CONTROLLER_FAN_EDITABLE) + void M710_report(const bool forReplay); +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && DISABLED(CASE_LIGHT_NO_BRIGHTNESS) + #include "../feature/caselight.h" + #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 + +#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; +typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7; } tmc_hybrid_threshold_t; +typedef struct { int16_t X, Y, Z, X2, Y2, Z2, Z3, Z4; } tmc_sgt_t; +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) + +// Defaults for reset / fill in on load +static const uint32_t _DMA[] PROGMEM = DEFAULT_MAX_ACCELERATION; +static const float _DASU[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT; +static const feedRate_t _DMF[] PROGMEM = DEFAULT_MAX_FEEDRATE; + +extern const char SP_X_STR[], SP_Y_STR[], SP_Z_STR[], SP_E_STR[]; + +/** + * Current EEPROM Layout + * + * Keep this data structure up to date so + * EEPROM size is known at compile time! + */ +typedef struct SettingsDataStruct { + char version[4]; // Vnn\0 + uint16_t crc; // Data Checksum + + // + // DISTINCT_E_FACTORS + // + uint8_t esteppers; // XYZE_N - XYZ + + planner_settings_t planner_settings; + + xyze_float_t planner_max_jerk; // M205 XYZE planner.max_jerk + float planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm + + xyz_pos_t home_offset; // M206 XYZ / M665 TPZ + + #if HAS_HOTEND_OFFSET + xyz_pos_t hotend_offset[HOTENDS - 1]; // M218 XYZ + #endif + + // + // FILAMENT_RUNOUT_SENSOR + // + bool runout_sensor_enabled; // M412 S + float runout_distance_mm; // M412 D + + // + // ENABLE_LEVELING_FADE_HEIGHT + // + float planner_z_fade_height; // M420 Zn planner.z_fade_height + + // + // MESH_BED_LEVELING + // + float mbl_z_offset; // mbl.z_offset + uint8_t mesh_num_x, mesh_num_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y + float mbl_z_values[TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3)] // mbl.z_values + [TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3)]; + + // + // HAS_BED_PROBE + // + + xyz_pos_t probe_offset; + + // + // ABL_PLANAR + // + matrix_3x3 planner_bed_level_matrix; // planner.bed_level_matrix + + // + // AUTO_BED_LEVELING_BILINEAR + // + uint8_t grid_max_x, grid_max_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y + xy_pos_t bilinear_grid_spacing, bilinear_start; // G29 L F + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + bed_mesh_t z_values; // G29 + #else + float z_values[3][3]; + #endif + + // + // AUTO_BED_LEVELING_UBL + // + bool planner_leveling_active; // M420 S planner.leveling_active + int8_t ubl_storage_slot; // ubl.storage_slot + + // + // SERVO_ANGLES + // + uint16_t servo_angles[EEPROM_NUM_SERVOS][2]; // M281 P L U + + // + // Temperature first layer compensation values + // + #if ENABLED(PROBE_TEMP_COMPENSATION) + int16_t z_offsets_probe[COUNT(temp_comp.z_offsets_probe)], // M871 P I V + z_offsets_bed[COUNT(temp_comp.z_offsets_bed)] // M871 B I V + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + , z_offsets_ext[COUNT(temp_comp.z_offsets_ext)] // M871 E I V + #endif + ; + #endif + + // + // BLTOUCH + // + bool bltouch_last_written_mode; + + // + // DELTA / [XYZ]_DUAL_ENDSTOPS + // + #if ENABLED(DELTA) + float delta_height; // M666 H + 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 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 + z2_endstop_adj, // M666 (S2) Z + z3_endstop_adj, // M666 (S3) Z + z4_endstop_adj; // M666 (S4) Z + #endif + + // + // Z_STEPPER_AUTO_ALIGN, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + // + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + xy_pos_t z_stepper_align_xy[NUM_Z_STEPPER_DRIVERS]; // M422 S X Y + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + xy_pos_t z_stepper_align_stepper_xy[NUM_Z_STEPPER_DRIVERS]; // M422 W X Y + #endif + #endif + + // + // Material Presets + // + #if PREHEAT_COUNT + preheat_t ui_material_preset[PREHEAT_COUNT]; // M145 S0 H B F + #endif + + // + // PIDTEMP + // + PIDCF_t hotendPID[HOTENDS]; // M301 En PIDCF / M303 En U + int16_t lpq_len; // M301 L + + // + // PIDTEMPBED + // + PID_t bedPID; // M304 PID / M303 E-1 U + + // + // User-defined Thermistors + // + #if HAS_USER_THERMISTORS + user_thermistor_t user_thermistor[USER_THERMISTORS]; // M305 P0 R4700 T100000 B3950 + #endif + + // + // Power monitor + // + uint8_t power_monitor_flags; // M430 I V W + + // + // HAS_LCD_CONTRAST + // + int16_t lcd_contrast; // M250 C + + // + // Controller fan settings + // + controllerFan_settings_t controllerFan_settings; // M710 + + // + // POWER_LOSS_RECOVERY + // + bool recovery_enabled; // M413 S + + // + // FWRETRACT + // + fwretract_settings_t fwretract_settings; // M207 S F Z W, M208 S F W R + bool autoretract_enabled; // M209 S + + // + // !NO_VOLUMETRIC + // + bool parser_volumetric_enabled; // M200 S parser.volumetric_enabled + float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[] + float planner_volumetric_extruder_limit[EXTRUDERS]; // M200 T L planner.volumetric_extruder_limit[] + + // + // HAS_TRINAMIC_CONFIG + // + tmc_stepper_current_t tmc_stepper_current; // M906 X Y Z X2 Y2 Z2 Z3 Z4 E0 E1 E2 E3 E4 E5 + tmc_hybrid_threshold_t tmc_hybrid_threshold; // M913 X Y Z X2 Y2 Z2 Z3 Z4 E0 E1 E2 E3 E4 E5 + tmc_sgt_t tmc_sgt; // M914 X Y Z X2 Y2 Z2 Z3 Z4 + tmc_stealth_enabled_t tmc_stealth_enabled; // M569 X Y Z X2 Y2 Z2 Z3 Z4 E0 E1 E2 E3 E4 E5 + + // + // LIN_ADVANCE + // + float planner_extruder_advance_K[_MAX(EXTRUDERS, 1)]; // M900 K planner.extruder_advance_K + + // + // HAS_MOTOR_CURRENT_PWM + // + #ifndef MOTOR_CURRENT_COUNT + #define MOTOR_CURRENT_COUNT 3 + #endif + uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // M907 X Z E + + // + // CNC_COORDINATE_SYSTEMS + // + xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; // G54-G59.3 + + // + // SKEW_CORRECTION + // + skew_factor_t planner_skew_factor; // M852 I J K planner.skew_factor + + // + // ADVANCED_PAUSE_FEATURE + // + #if EXTRUDERS + fil_change_settings_t fc_settings[EXTRUDERS]; // M603 T U L + #endif + + // + // Tool-change settings + // + #if HAS_MULTI_EXTRUDER + toolchange_settings_t toolchange_settings; // M217 S P R + #endif + + // + // BACKLASH_COMPENSATION + // + xyz_float_t backlash_distance_mm; // M425 X Y Z + uint8_t backlash_correction; // M425 F + float backlash_smoothing_mm; // M425 S + + // + // EXTENSIBLE_UI + // + #if ENABLED(EXTENSIBLE_UI) + // This is a significant hardware change; don't reserve space when not present + uint8_t extui_data[ExtUI::eeprom_data_size]; + #endif + + // + // HAS_CASE_LIGHT_BRIGHTNESS + // + #if HAS_CASE_LIGHT_BRIGHTNESS + 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 + // + #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!"); + +MarlinSettings settings; + +uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } + +/** + * Post-process after Retrieve or Reset + */ + +#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + float new_z_fade_height; +#endif + +void MarlinSettings::postprocess() { + xyze_pos_t oldpos = current_position; + + // steps per s2 needs to be updated to agree with units per s2 + planner.reset_acceleration_rates(); + + // Make sure delta kinematics are updated before refreshing the + // planner position so the stepper counts will be set correctly. + TERN_(DELTA, recalc_delta_settings()); + + TERN_(PIDTEMP, thermalManager.updatePID()); + + #if DISABLED(NO_VOLUMETRICS) + planner.calculate_volumetric_multipliers(); + #elif EXTRUDERS + for (uint8_t i = COUNT(planner.e_factor); i--;) + planner.refresh_e_factor(i); + #endif + + // Software endstops depend on home_offset + LOOP_XYZ(i) { + update_workspace_offset((AxisEnum)i); + update_software_endstops((AxisEnum)i); + } + + TERN_(ENABLE_LEVELING_FADE_HEIGHT, set_z_fade_height(new_z_fade_height, false)); // false = no report + + TERN_(AUTO_BED_LEVELING_BILINEAR, refresh_bed_level()); + + TERN_(HAS_MOTOR_CURRENT_PWM, stepper.refresh_motor_power()); + + TERN_(FWRETRACT, fwretract.refresh_autoretract()); + + TERN_(HAS_LINEAR_E_JERK, planner.recalculate_max_e_jerk()); + + 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 + planner.refresh_positioning(); + + // Various factors can change the current position + if (oldpos != current_position) + report_current_position(); +} + +#if BOTH(PRINTCOUNTER, EEPROM_SETTINGS) + #include "printcounter.h" + static_assert( + !WITHIN(STATS_EEPROM_ADDRESS, EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)) && + !WITHIN(STATS_EEPROM_ADDRESS + sizeof(printStatistics), EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)), + "STATS_EEPROM_ADDRESS collides with EEPROM settings storage." + ); +#endif + +#if ENABLED(SD_FIRMWARE_UPDATE) + + #if ENABLED(EEPROM_SETTINGS) + static_assert( + !WITHIN(SD_FIRMWARE_UPDATE_EEPROM_ADDR, EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)), + "SD_FIRMWARE_UPDATE_EEPROM_ADDR collides with EEPROM settings storage." + ); + #endif + + bool MarlinSettings::sd_update_status() { + uint8_t val; + persistentStore.read_data(SD_FIRMWARE_UPDATE_EEPROM_ADDR, &val); + return (val == SD_FIRMWARE_UPDATE_ACTIVE_VALUE); + } + + bool MarlinSettings::set_sd_update_status(const bool enable) { + if (enable != sd_update_status()) + persistentStore.write_data( + SD_FIRMWARE_UPDATE_EEPROM_ADDR, + enable ? SD_FIRMWARE_UPDATE_ACTIVE_VALUE : SD_FIRMWARE_UPDATE_INACTIVE_VALUE + ); + return true; + } + +#endif // SD_FIRMWARE_UPDATE + +#ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + static_assert( + EEPROM_OFFSET + sizeof(SettingsData) < ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE, + "ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE is insufficient to capture all EEPROM data." + ); +#endif + +#define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) +#include "../core/debug_out.h" + +#if ENABLED(EEPROM_SETTINGS) + + #define EEPROM_START() if (!persistentStore.access_start()) { SERIAL_ECHO_MSG("No EEPROM."); return false; } \ + int eeprom_index = EEPROM_OFFSET + #define EEPROM_FINISH() persistentStore.access_finish() + #define EEPROM_SKIP(VAR) (eeprom_index += sizeof(VAR)) + #define EEPROM_WRITE(VAR) do{ persistentStore.write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) + #define EEPROM_READ(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating); }while(0) + #define EEPROM_READ_ALWAYS(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) + #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0) + + #if ENABLED(DEBUG_EEPROM_READWRITE) + #define _FIELD_TEST(FIELD) \ + EEPROM_ASSERT( \ + eeprom_error || eeprom_index == offsetof(SettingsData, FIELD) + EEPROM_OFFSET, \ + "Field " STRINGIFY(FIELD) " mismatch." \ + ) + #else + #define _FIELD_TEST(FIELD) NOOP + #endif + + const char version[4] = EEPROM_VERSION; + + bool MarlinSettings::eeprom_error, MarlinSettings::validating; + + bool MarlinSettings::size_error(const uint16_t size) { + if (size != datasize()) { + DEBUG_ERROR_MSG("EEPROM datasize error."); + return true; + } + return false; + } + + /** + * M500 - Store Configuration + */ + bool MarlinSettings::save() { + float dummyf = 0; + char ver[4] = "ERR"; + + uint16_t working_crc = 0; + + EEPROM_START(); + + eeprom_error = false; + + // Write or Skip version. (Flash doesn't allow rewrite without erase.) + TERN(FLASH_EEPROM_EMULATION, EEPROM_SKIP, EEPROM_WRITE)(ver); + + EEPROM_SKIP(working_crc); // Skip the checksum slot + + working_crc = 0; // clear before first "real data" + + _FIELD_TEST(esteppers); + + const uint8_t esteppers = COUNT(planner.settings.axis_steps_per_mm) - XYZ; + EEPROM_WRITE(esteppers); + + // + // Planner Motion + // + { + EEPROM_WRITE(planner.settings); + + #if HAS_CLASSIC_JERK + EEPROM_WRITE(planner.max_jerk); + #if HAS_LINEAR_E_JERK + dummyf = float(DEFAULT_EJERK); + EEPROM_WRITE(dummyf); + #endif + #else + const xyze_pos_t planner_max_jerk = { 10, 10, 0.4, float(DEFAULT_EJERK) }; + EEPROM_WRITE(planner_max_jerk); + #endif + + TERN_(CLASSIC_JERK, dummyf = 0.02f); + EEPROM_WRITE(TERN(CLASSIC_JERK, dummyf, planner.junction_deviation_mm)); + } + + // + // Home Offset + // + { + _FIELD_TEST(home_offset); + + #if HAS_SCARA_OFFSET + EEPROM_WRITE(scara_home_offset); + #else + #if !HAS_HOME_OFFSET + const xyz_pos_t home_offset{0}; + #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) + EEPROM_WRITE(hotend_offset[e]); + #endif + } + + // + // Filament Runout Sensor + // + { + #if HAS_FILAMENT_SENSOR + const bool &runout_sensor_enabled = runout.enabled; + #else + 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 + EEPROM_WRITE(runout_distance_mm); + } + + // + // Global Leveling + // + { + const float zfh = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height, 10.0f); + EEPROM_WRITE(zfh); + } + + // + // Mesh Bed Leveling + // + { + #if ENABLED(MESH_BED_LEVELING) + static_assert( + sizeof(mbl.z_values) == (GRID_MAX_POINTS) * sizeof(mbl.z_values[0][0]), + "MBL Z array is the wrong size." + ); + #else + dummyf = 0; + #endif + + const uint8_t mesh_num_x = TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3), + mesh_num_y = TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3); + + EEPROM_WRITE(TERN(MESH_BED_LEVELING, mbl.z_offset, dummyf)); + EEPROM_WRITE(mesh_num_x); + EEPROM_WRITE(mesh_num_y); + + #if ENABLED(MESH_BED_LEVELING) + EEPROM_WRITE(mbl.z_values); + #else + for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummyf); + #endif + } + + // + // Probe XYZ Offsets + // + { + _FIELD_TEST(probe_offset); + #if HAS_BED_PROBE + const xyz_pos_t &zpo = probe.offset; + #else + constexpr xyz_pos_t zpo{0}; + #endif + EEPROM_WRITE(zpo); + } + + // + // Planar Bed Leveling matrix + // + { + #if ABL_PLANAR + EEPROM_WRITE(planner.bed_level_matrix); + #else + dummyf = 0; + for (uint8_t q = 9; q--;) EEPROM_WRITE(dummyf); + #endif + } + + // + // Bilinear Auto Bed Leveling + // + { + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + static_assert( + sizeof(z_values) == (GRID_MAX_POINTS) * sizeof(z_values[0][0]), + "Bilinear Z array is the wrong size." + ); + #else + const xy_pos_t bilinear_start{0}, bilinear_grid_spacing{0}; + #endif + + const uint8_t grid_max_x = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_X, 3), + grid_max_y = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_Y, 3); + EEPROM_WRITE(grid_max_x); + EEPROM_WRITE(grid_max_y); + EEPROM_WRITE(bilinear_grid_spacing); + EEPROM_WRITE(bilinear_start); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + EEPROM_WRITE(z_values); // 9-256 floats + #else + dummyf = 0; + for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_WRITE(dummyf); + #endif + } + + // + // Unified Bed Leveling + // + { + _FIELD_TEST(planner_leveling_active); + const bool ubl_active = TERN(AUTO_BED_LEVELING_UBL, planner.leveling_active, false); + const int8_t storage_slot = TERN(AUTO_BED_LEVELING_UBL, ubl.storage_slot, -1); + EEPROM_WRITE(ubl_active); + EEPROM_WRITE(storage_slot); + } + + // + // Servo Angles + // + { + _FIELD_TEST(servo_angles); + #if !HAS_SERVO_ANGLES + uint16_t servo_angles[EEPROM_NUM_SERVOS][2] = { { 0, 0 } }; + #endif + EEPROM_WRITE(servo_angles); + } + + // + // Thermal first layer compensation values + // + #if ENABLED(PROBE_TEMP_COMPENSATION) + EEPROM_WRITE(temp_comp.z_offsets_probe); + EEPROM_WRITE(temp_comp.z_offsets_bed); + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + EEPROM_WRITE(temp_comp.z_offsets_ext); + #endif + #else + // No placeholder data for this feature + #endif + + // + // BLTOUCH + // + { + _FIELD_TEST(bltouch_last_written_mode); + const bool bltouch_last_written_mode = TERN(BLTOUCH, bltouch.last_written_mode, false); + EEPROM_WRITE(bltouch_last_written_mode); + } + + // + // DELTA Geometry or Dual Endstops offsets + // + { + #if ENABLED(DELTA) + + _FIELD_TEST(delta_height); + + EEPROM_WRITE(delta_height); // 1 float + EEPROM_WRITE(delta_endstop_adj); // 3 floats + EEPROM_WRITE(delta_radius); // 1 float + 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 + + _FIELD_TEST(x2_endstop_adj); + + // Write dual endstops in X, Y, Z order. Unused = 0.0 + dummyf = 0; + EEPROM_WRITE(TERN(X_DUAL_ENDSTOPS, endstops.x2_endstop_adj, dummyf)); // 1 float + EEPROM_WRITE(TERN(Y_DUAL_ENDSTOPS, endstops.y2_endstop_adj, dummyf)); // 1 float + EEPROM_WRITE(TERN(Z_MULTI_ENDSTOPS, endstops.z2_endstop_adj, dummyf)); // 1 float + + #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 + EEPROM_WRITE(endstops.z3_endstop_adj); // 1 float + #else + EEPROM_WRITE(dummyf); + #endif + + #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 + EEPROM_WRITE(endstops.z4_endstop_adj); // 1 float + #else + EEPROM_WRITE(dummyf); + #endif + + #endif + } + + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + EEPROM_WRITE(z_stepper_align.xy); + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + EEPROM_WRITE(z_stepper_align.stepper_xy); + #endif + #endif + + // + // LCD Preheat settings + // + #if PREHEAT_COUNT + _FIELD_TEST(ui_material_preset); + EEPROM_WRITE(ui.material_preset); + #endif + + // + // PIDTEMP + // + { + _FIELD_TEST(hotendPID); + HOTEND_LOOP() { + PIDCF_t pidcf = { + #if DISABLED(PIDTEMP) + NAN, NAN, NAN, + NAN, NAN + #else + PID_PARAM(Kp, e), + unscalePID_i(PID_PARAM(Ki, e)), + unscalePID_d(PID_PARAM(Kd, e)), + PID_PARAM(Kc, e), + PID_PARAM(Kf, e) + #endif + }; + EEPROM_WRITE(pidcf); + } + + _FIELD_TEST(lpq_len); + #if DISABLED(PID_EXTRUSION_SCALING) + const int16_t lpq_len = 20; + #endif + EEPROM_WRITE(TERN(PID_EXTRUSION_SCALING, thermalManager.lpq_len, lpq_len)); + } + + // + // PIDTEMPBED + // + { + _FIELD_TEST(bedPID); + + const PID_t bed_pid = { + #if DISABLED(PIDTEMPBED) + NAN, NAN, NAN + #else + // Store the unscaled PID values + thermalManager.temp_bed.pid.Kp, + unscalePID_i(thermalManager.temp_bed.pid.Ki), + unscalePID_d(thermalManager.temp_bed.pid.Kd) + #endif + }; + EEPROM_WRITE(bed_pid); + } + + // + // User-defined Thermistors + // + #if HAS_USER_THERMISTORS + { + _FIELD_TEST(user_thermistor); + EEPROM_WRITE(thermalManager.user_thermistor); + } + #endif + + // + // Power monitor + // + { + #if HAS_POWER_MONITOR + const uint8_t &power_monitor_flags = power_monitor.flags; + #else + constexpr uint8_t power_monitor_flags = 0x00; + #endif + _FIELD_TEST(power_monitor_flags); + EEPROM_WRITE(power_monitor_flags); + } + + // + // LCD Contrast + // + { + _FIELD_TEST(lcd_contrast); + + const int16_t lcd_contrast = + #if HAS_LCD_CONTRAST + ui.contrast + #else + 127 + #endif + ; + EEPROM_WRITE(lcd_contrast); + } + + // + // Controller Fan + // + { + _FIELD_TEST(controllerFan_settings); + #if ENABLED(USE_CONTROLLER_FAN) + const controllerFan_settings_t &cfs = controllerFan.settings; + #else + controllerFan_settings_t cfs = controllerFan_defaults; + #endif + EEPROM_WRITE(cfs); + } + + // + // Power-Loss Recovery + // + { + _FIELD_TEST(recovery_enabled); + const bool recovery_enabled = TERN(POWER_LOSS_RECOVERY, recovery.enabled, ENABLED(PLR_ENABLED_DEFAULT)); + EEPROM_WRITE(recovery_enabled); + } + + // + // Firmware Retraction + // + { + _FIELD_TEST(fwretract_settings); + #if DISABLED(FWRETRACT) + const fwretract_settings_t autoretract_defaults = { 3, 45, 0, 0, 0, 13, 0, 8 }; + #endif + EEPROM_WRITE(TERN(FWRETRACT, fwretract.settings, autoretract_defaults)); + + #if DISABLED(FWRETRACT_AUTORETRACT) + const bool autoretract_enabled = false; + #endif + EEPROM_WRITE(TERN(FWRETRACT_AUTORETRACT, fwretract.autoretract_enabled, autoretract_enabled)); + } + + // + // Volumetric & Filament Size + // + { + _FIELD_TEST(parser_volumetric_enabled); + + #if DISABLED(NO_VOLUMETRICS) + + EEPROM_WRITE(parser.volumetric_enabled); + EEPROM_WRITE(planner.filament_size); + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + EEPROM_WRITE(planner.volumetric_extruder_limit); + #else + dummyf = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; + for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummyf); + #endif + + #else + + const bool volumetric_enabled = false; + EEPROM_WRITE(volumetric_enabled); + dummyf = DEFAULT_NOMINAL_FILAMENT_DIA; + for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummyf); + dummyf = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; + for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummyf); + + #endif + } + + // + // TMC Configuration + // + { + _FIELD_TEST(tmc_stepper_current); + + tmc_stepper_current_t tmc_stepper_current = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + #if HAS_TRINAMIC_CONFIG + #if AXIS_IS_TMC(X) + tmc_stepper_current.X = stepperX.getMilliamps(); + #endif + #if AXIS_IS_TMC(Y) + tmc_stepper_current.Y = stepperY.getMilliamps(); + #endif + #if AXIS_IS_TMC(Z) + tmc_stepper_current.Z = stepperZ.getMilliamps(); + #endif + #if AXIS_IS_TMC(X2) + tmc_stepper_current.X2 = stepperX2.getMilliamps(); + #endif + #if AXIS_IS_TMC(Y2) + tmc_stepper_current.Y2 = stepperY2.getMilliamps(); + #endif + #if AXIS_IS_TMC(Z2) + tmc_stepper_current.Z2 = stepperZ2.getMilliamps(); + #endif + #if AXIS_IS_TMC(Z3) + tmc_stepper_current.Z3 = stepperZ3.getMilliamps(); + #endif + #if AXIS_IS_TMC(Z4) + tmc_stepper_current.Z4 = stepperZ4.getMilliamps(); + #endif + #if MAX_EXTRUDERS + #if AXIS_IS_TMC(E0) + tmc_stepper_current.E0 = stepperE0.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 1 + #if AXIS_IS_TMC(E1) + tmc_stepper_current.E1 = stepperE1.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 2 + #if AXIS_IS_TMC(E2) + tmc_stepper_current.E2 = stepperE2.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 3 + #if AXIS_IS_TMC(E3) + tmc_stepper_current.E3 = stepperE3.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 4 + #if AXIS_IS_TMC(E4) + tmc_stepper_current.E4 = stepperE4.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 5 + #if AXIS_IS_TMC(E5) + tmc_stepper_current.E5 = stepperE5.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 6 + #if AXIS_IS_TMC(E6) + tmc_stepper_current.E6 = stepperE6.getMilliamps(); + #endif + #if MAX_EXTRUDERS > 7 + #if AXIS_IS_TMC(E7) + tmc_stepper_current.E7 = stepperE7.getMilliamps(); + #endif + #endif // MAX_EXTRUDERS > 7 + #endif // MAX_EXTRUDERS > 6 + #endif // MAX_EXTRUDERS > 5 + #endif // MAX_EXTRUDERS > 4 + #endif // MAX_EXTRUDERS > 3 + #endif // MAX_EXTRUDERS > 2 + #endif // MAX_EXTRUDERS > 1 + #endif // MAX_EXTRUDERS + #endif + EEPROM_WRITE(tmc_stepper_current); + } + + // + // TMC Hybrid Threshold, and placeholder values + // + { + _FIELD_TEST(tmc_hybrid_threshold); + + #if ENABLED(HYBRID_THRESHOLD) + tmc_hybrid_threshold_t tmc_hybrid_threshold = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + #if AXIS_HAS_STEALTHCHOP(X) + tmc_hybrid_threshold.X = stepperX.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_hybrid_threshold.Y = stepperY.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_hybrid_threshold.Z = stepperZ.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + tmc_hybrid_threshold.X2 = stepperX2.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + tmc_hybrid_threshold.Y2 = stepperY2.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + tmc_hybrid_threshold.Z2 = stepperZ2.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + tmc_hybrid_threshold.Z3 = stepperZ3.get_pwm_thrs(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + tmc_hybrid_threshold.Z4 = stepperZ4.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS + #if AXIS_HAS_STEALTHCHOP(E0) + tmc_hybrid_threshold.E0 = stepperE0.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 1 + #if AXIS_HAS_STEALTHCHOP(E1) + tmc_hybrid_threshold.E1 = stepperE1.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 2 + #if AXIS_HAS_STEALTHCHOP(E2) + tmc_hybrid_threshold.E2 = stepperE2.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 3 + #if AXIS_HAS_STEALTHCHOP(E3) + tmc_hybrid_threshold.E3 = stepperE3.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 4 + #if AXIS_HAS_STEALTHCHOP(E4) + tmc_hybrid_threshold.E4 = stepperE4.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 5 + #if AXIS_HAS_STEALTHCHOP(E5) + tmc_hybrid_threshold.E5 = stepperE5.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 6 + #if AXIS_HAS_STEALTHCHOP(E6) + tmc_hybrid_threshold.E6 = stepperE6.get_pwm_thrs(); + #endif + #if MAX_EXTRUDERS > 7 + #if AXIS_HAS_STEALTHCHOP(E7) + tmc_hybrid_threshold.E7 = stepperE7.get_pwm_thrs(); + #endif + #endif // MAX_EXTRUDERS > 7 + #endif // MAX_EXTRUDERS > 6 + #endif // MAX_EXTRUDERS > 5 + #endif // MAX_EXTRUDERS > 4 + #endif // MAX_EXTRUDERS > 3 + #endif // MAX_EXTRUDERS > 2 + #endif // MAX_EXTRUDERS > 1 + #endif // MAX_EXTRUDERS + #else + const tmc_hybrid_threshold_t tmc_hybrid_threshold = { + .X = 100, .Y = 100, .Z = 3, + .X2 = 100, .Y2 = 100, .Z2 = 3, .Z3 = 3, .Z4 = 3, + .E0 = 30, .E1 = 30, .E2 = 30, + .E3 = 30, .E4 = 30, .E5 = 30 + }; + #endif + EEPROM_WRITE(tmc_hybrid_threshold); + } + + // + // TMC StallGuard threshold + // + { + tmc_sgt_t tmc_sgt{0}; + #if USE_SENSORLESS + TERN_(X_SENSORLESS, tmc_sgt.X = stepperX.homing_threshold()); + TERN_(X2_SENSORLESS, tmc_sgt.X2 = stepperX2.homing_threshold()); + TERN_(Y_SENSORLESS, tmc_sgt.Y = stepperY.homing_threshold()); + TERN_(Y2_SENSORLESS, tmc_sgt.Y2 = stepperY2.homing_threshold()); + TERN_(Z_SENSORLESS, tmc_sgt.Z = stepperZ.homing_threshold()); + TERN_(Z2_SENSORLESS, tmc_sgt.Z2 = stepperZ2.homing_threshold()); + TERN_(Z3_SENSORLESS, tmc_sgt.Z3 = stepperZ3.homing_threshold()); + TERN_(Z4_SENSORLESS, tmc_sgt.Z4 = stepperZ4.homing_threshold()); + #endif + EEPROM_WRITE(tmc_sgt); + } + + // + // TMC stepping mode + // + { + _FIELD_TEST(tmc_stealth_enabled); + + tmc_stealth_enabled_t tmc_stealth_enabled = { false, false, false, false, false, false, false, false, false, false, false, false, false }; + + #if HAS_STEALTHCHOP + #if AXIS_HAS_STEALTHCHOP(X) + tmc_stealth_enabled.X = stepperX.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_stealth_enabled.Y = stepperY.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_stealth_enabled.Z = stepperZ.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + tmc_stealth_enabled.X2 = stepperX2.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + tmc_stealth_enabled.Y2 = stepperY2.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + tmc_stealth_enabled.Z2 = stepperZ2.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + tmc_stealth_enabled.Z3 = stepperZ3.get_stored_stealthChop_status(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + tmc_stealth_enabled.Z4 = stepperZ4.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS + #if AXIS_HAS_STEALTHCHOP(E0) + tmc_stealth_enabled.E0 = stepperE0.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 1 + #if AXIS_HAS_STEALTHCHOP(E1) + tmc_stealth_enabled.E1 = stepperE1.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 2 + #if AXIS_HAS_STEALTHCHOP(E2) + tmc_stealth_enabled.E2 = stepperE2.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 3 + #if AXIS_HAS_STEALTHCHOP(E3) + tmc_stealth_enabled.E3 = stepperE3.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 4 + #if AXIS_HAS_STEALTHCHOP(E4) + tmc_stealth_enabled.E4 = stepperE4.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 5 + #if AXIS_HAS_STEALTHCHOP(E5) + tmc_stealth_enabled.E5 = stepperE5.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 6 + #if AXIS_HAS_STEALTHCHOP(E6) + tmc_stealth_enabled.E6 = stepperE6.get_stored_stealthChop_status(); + #endif + #if MAX_EXTRUDERS > 7 + #if AXIS_HAS_STEALTHCHOP(E7) + tmc_stealth_enabled.E7 = stepperE7.get_stored_stealthChop_status(); + #endif + #endif // MAX_EXTRUDERS > 7 + #endif // MAX_EXTRUDERS > 6 + #endif // MAX_EXTRUDERS > 5 + #endif // MAX_EXTRUDERS > 4 + #endif // MAX_EXTRUDERS > 3 + #endif // MAX_EXTRUDERS > 2 + #endif // MAX_EXTRUDERS > 1 + #endif // MAX_EXTRUDERS + #endif + EEPROM_WRITE(tmc_stealth_enabled); + } + + // + // Linear Advance + // + { + _FIELD_TEST(planner_extruder_advance_K); + + #if ENABLED(LIN_ADVANCE) + EEPROM_WRITE(planner.extruder_advance_K); + #else + dummyf = 0; + for (uint8_t q = _MAX(EXTRUDERS, 1); q--;) EEPROM_WRITE(dummyf); + #endif + } + + // + // Motor Current PWM + // + { + _FIELD_TEST(motor_current_setting); + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + EEPROM_WRITE(stepper.motor_current_setting); + #else + const uint32_t no_current[MOTOR_CURRENT_COUNT] = { 0 }; + EEPROM_WRITE(no_current); + #endif + } + + // + // CNC Coordinate Systems + // + + _FIELD_TEST(coordinate_system); + + #if DISABLED(CNC_COORDINATE_SYSTEMS) + const xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS] = { { 0 } }; + #endif + EEPROM_WRITE(TERN(CNC_COORDINATE_SYSTEMS, gcode.coordinate_system, coordinate_system)); + + // + // Skew correction factors + // + _FIELD_TEST(planner_skew_factor); + EEPROM_WRITE(planner.skew_factor); + + // + // Advanced Pause filament load & unload lengths + // + #if EXTRUDERS + { + #if DISABLED(ADVANCED_PAUSE_FEATURE) + const fil_change_settings_t fc_settings[EXTRUDERS] = { 0, 0 }; + #endif + _FIELD_TEST(fc_settings); + EEPROM_WRITE(fc_settings); + } + #endif + + // + // Multiple Extruders + // + + #if HAS_MULTI_EXTRUDER + _FIELD_TEST(toolchange_settings); + EEPROM_WRITE(toolchange_settings); + #endif + + // + // Backlash Compensation + // + { + #if ENABLED(BACKLASH_GCODE) + const xyz_float_t &backlash_distance_mm = backlash.distance_mm; + const uint8_t &backlash_correction = backlash.correction; + #else + const xyz_float_t backlash_distance_mm{0}; + const uint8_t backlash_correction = 0; + #endif + #if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) + const float &backlash_smoothing_mm = backlash.smoothing_mm; + #else + const float backlash_smoothing_mm = 3; + #endif + _FIELD_TEST(backlash_distance_mm); + EEPROM_WRITE(backlash_distance_mm); + EEPROM_WRITE(backlash_correction); + EEPROM_WRITE(backlash_smoothing_mm); + } + + // + // Extensible UI User Data + // + #if ENABLED(EXTENSIBLE_UI) + { + char extui_data[ExtUI::eeprom_data_size] = { 0 }; + ExtUI::onStoreSettings(extui_data); + _FIELD_TEST(extui_data); + EEPROM_WRITE(extui_data); + } + #endif + + // + // Case Light Brightness + // + #if HAS_CASE_LIGHT_BRIGHTNESS + EEPROM_WRITE(caselight.brightness); + #endif + + // + // Password feature + // + #if ENABLED(PASSWORD_FEATURE) + EEPROM_WRITE(password.is_set); + EEPROM_WRITE(password.value); + #endif + + // + // TOUCH_SCREEN_CALIBRATION + // + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + EEPROM_WRITE(touch.calibration); + #endif + + // + // Validate CRC and Data Size + // + if (!eeprom_error) { + const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET), + final_crc = working_crc; + + // Write the EEPROM header + eeprom_index = EEPROM_OFFSET; + + EEPROM_WRITE(version); + EEPROM_WRITE(final_crc); + + // Report storage size + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("Settings Stored (", eeprom_size, " bytes; crc ", (uint32_t)final_crc, ")"); + + eeprom_error |= size_error(eeprom_size); + } + EEPROM_FINISH(); + + // + // UBL Mesh + // + #if ENABLED(UBL_SAVE_ACTIVE_ON_M500) + if (ubl.storage_slot >= 0) + store_mesh(ubl.storage_slot); + #endif + + if (!eeprom_error) LCD_MESSAGEPGM(MSG_SETTINGS_STORED); + + TERN_(EXTENSIBLE_UI, ExtUI::onConfigurationStoreWritten(!eeprom_error)); + + return !eeprom_error; + } + + /** + * M501 - Retrieve Configuration + */ + bool MarlinSettings::_load() { + uint16_t working_crc = 0; + + EEPROM_START(); + + char stored_ver[4]; + EEPROM_READ_ALWAYS(stored_ver); + + uint16_t stored_crc; + EEPROM_READ_ALWAYS(stored_crc); + + // Version has to match or defaults are used + if (strncmp(version, stored_ver, 3) != 0) { + if (stored_ver[3] != '\0') { + stored_ver[0] = '?'; + stored_ver[1] = '\0'; + } + DEBUG_ECHO_START(); + DEBUG_ECHOLNPAIR("EEPROM version mismatch (EEPROM=", stored_ver, " Marlin=" EEPROM_VERSION ")"); + TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_version()); + eeprom_error = true; + } + else { + float dummyf = 0; + working_crc = 0; // Init to 0. Accumulated by EEPROM_READ + + _FIELD_TEST(esteppers); + + // Number of esteppers may change + uint8_t esteppers; + EEPROM_READ_ALWAYS(esteppers); + + // + // Planner Motion + // + { + // Get only the number of E stepper parameters previously stored + // Any steppers added later are set to their defaults + uint32_t tmp1[XYZ + esteppers]; + float tmp2[XYZ + esteppers]; + feedRate_t tmp3[XYZ + esteppers]; + EEPROM_READ(tmp1); // max_acceleration_mm_per_s2 + EEPROM_READ(planner.settings.min_segment_time_us); + EEPROM_READ(tmp2); // axis_steps_per_mm + EEPROM_READ(tmp3); // max_feedrate_mm_s + + if (!validating) LOOP_XYZE_N(i) { + const bool in = (i < esteppers + XYZ); + planner.settings.max_acceleration_mm_per_s2[i] = in ? tmp1[i] : pgm_read_dword(&_DMA[ALIM(i, _DMA)]); + planner.settings.axis_steps_per_mm[i] = in ? tmp2[i] : pgm_read_float(&_DASU[ALIM(i, _DASU)]); + planner.settings.max_feedrate_mm_s[i] = in ? tmp3[i] : pgm_read_float(&_DMF[ALIM(i, _DMF)]); + } + + EEPROM_READ(planner.settings.acceleration); + EEPROM_READ(planner.settings.retract_acceleration); + EEPROM_READ(planner.settings.travel_acceleration); + EEPROM_READ(planner.settings.min_feedrate_mm_s); + EEPROM_READ(planner.settings.min_travel_feedrate_mm_s); + + #if HAS_CLASSIC_JERK + EEPROM_READ(planner.max_jerk); + #if HAS_LINEAR_E_JERK + EEPROM_READ(dummyf); + #endif + #else + for (uint8_t q = 4; q--;) EEPROM_READ(dummyf); + #endif + + EEPROM_READ(TERN(CLASSIC_JERK, dummyf, planner.junction_deviation_mm)); + } + + // + // Home Offset (M206 / M665) + // + { + _FIELD_TEST(home_offset); + + #if HAS_SCARA_OFFSET + EEPROM_READ(scara_home_offset); + #else + #if !HAS_HOME_OFFSET + xyz_pos_t home_offset; + #endif + EEPROM_READ(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) + EEPROM_READ(hotend_offset[e]); + #endif + } + + // + // Filament Runout Sensor + // + { + 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()); + + float runout_distance_mm; + EEPROM_READ(runout_distance_mm); + #if HAS_FILAMENT_RUNOUT_DISTANCE + if (!validating) runout.set_runout_distance(runout_distance_mm); + #endif + } + + // + // Global Leveling + // + EEPROM_READ(TERN(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height, dummyf)); + + // + // Mesh (Manual) Bed Leveling + // + { + uint8_t mesh_num_x, mesh_num_y; + EEPROM_READ(dummyf); + EEPROM_READ_ALWAYS(mesh_num_x); + EEPROM_READ_ALWAYS(mesh_num_y); + + #if ENABLED(MESH_BED_LEVELING) + if (!validating) mbl.z_offset = dummyf; + if (mesh_num_x == GRID_MAX_POINTS_X && mesh_num_y == GRID_MAX_POINTS_Y) { + // EEPROM data fits the current mesh + EEPROM_READ(mbl.z_values); + } + else { + // EEPROM data is stale + if (!validating) mbl.reset(); + for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummyf); + } + #else + // MBL is disabled - skip the stored data + for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummyf); + #endif // MESH_BED_LEVELING + } + + // + // Probe Z Offset + // + { + _FIELD_TEST(probe_offset); + #if HAS_BED_PROBE + const xyz_pos_t &zpo = probe.offset; + #else + xyz_pos_t zpo; + #endif + EEPROM_READ(zpo); + } + + // + // Planar Bed Leveling matrix + // + { + #if ABL_PLANAR + EEPROM_READ(planner.bed_level_matrix); + #else + for (uint8_t q = 9; q--;) EEPROM_READ(dummyf); + #endif + } + + // + // Bilinear Auto Bed Leveling + // + { + uint8_t grid_max_x, grid_max_y; + EEPROM_READ_ALWAYS(grid_max_x); // 1 byte + EEPROM_READ_ALWAYS(grid_max_y); // 1 byte + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + if (grid_max_x == GRID_MAX_POINTS_X && grid_max_y == GRID_MAX_POINTS_Y) { + if (!validating) set_bed_leveling_enabled(false); + EEPROM_READ(bilinear_grid_spacing); // 2 ints + EEPROM_READ(bilinear_start); // 2 ints + EEPROM_READ(z_values); // 9 to 256 floats + } + else // EEPROM data is stale + #endif // AUTO_BED_LEVELING_BILINEAR + { + // Skip past disabled (or stale) Bilinear Grid data + xy_pos_t bgs, bs; + EEPROM_READ(bgs); + EEPROM_READ(bs); + for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_READ(dummyf); + } + } + + // + // Unified Bed Leveling active state + // + { + _FIELD_TEST(planner_leveling_active); + #if ENABLED(AUTO_BED_LEVELING_UBL) + const bool &planner_leveling_active = planner.leveling_active; + const int8_t &ubl_storage_slot = ubl.storage_slot; + #else + bool planner_leveling_active; + int8_t ubl_storage_slot; + #endif + EEPROM_READ(planner_leveling_active); + EEPROM_READ(ubl_storage_slot); + } + + // + // SERVO_ANGLES + // + { + _FIELD_TEST(servo_angles); + #if ENABLED(EDITABLE_SERVO_ANGLES) + uint16_t (&servo_angles_arr)[EEPROM_NUM_SERVOS][2] = servo_angles; + #else + uint16_t servo_angles_arr[EEPROM_NUM_SERVOS][2]; + #endif + EEPROM_READ(servo_angles_arr); + } + + // + // Thermal first layer compensation values + // + #if ENABLED(PROBE_TEMP_COMPENSATION) + EEPROM_READ(temp_comp.z_offsets_probe); + EEPROM_READ(temp_comp.z_offsets_bed); + #if ENABLED(USE_TEMP_EXT_COMPENSATION) + EEPROM_READ(temp_comp.z_offsets_ext); + #endif + temp_comp.reset_index(); + #else + // No placeholder data for this feature + #endif + + // + // BLTOUCH + // + { + _FIELD_TEST(bltouch_last_written_mode); + #if ENABLED(BLTOUCH) + const bool &bltouch_last_written_mode = bltouch.last_written_mode; + #else + bool bltouch_last_written_mode; + #endif + EEPROM_READ(bltouch_last_written_mode); + } + + // + // DELTA Geometry or Dual Endstops offsets + // + { + #if ENABLED(DELTA) + + _FIELD_TEST(delta_height); + + EEPROM_READ(delta_height); // 1 float + EEPROM_READ(delta_endstop_adj); // 3 floats + EEPROM_READ(delta_radius); // 1 float + 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 + + _FIELD_TEST(x2_endstop_adj); + + EEPROM_READ(TERN(X_DUAL_ENDSTOPS, endstops.x2_endstop_adj, dummyf)); // 1 float + EEPROM_READ(TERN(Y_DUAL_ENDSTOPS, endstops.y2_endstop_adj, dummyf)); // 1 float + EEPROM_READ(TERN(Z_MULTI_ENDSTOPS, endstops.z2_endstop_adj, dummyf)); // 1 float + + #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 + EEPROM_READ(endstops.z3_endstop_adj); // 1 float + #else + EEPROM_READ(dummyf); + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 + EEPROM_READ(endstops.z4_endstop_adj); // 1 float + #else + EEPROM_READ(dummyf); + #endif + + #endif + } + + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + EEPROM_READ(z_stepper_align.xy); + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + EEPROM_READ(z_stepper_align.stepper_xy); + #endif + #endif + + // + // LCD Preheat settings + // + #if PREHEAT_COUNT + _FIELD_TEST(ui_material_preset); + EEPROM_READ(ui.material_preset); + #endif + + // + // Hotend PID + // + { + HOTEND_LOOP() { + PIDCF_t pidcf; + EEPROM_READ(pidcf); + #if ENABLED(PIDTEMP) + if (!validating && !isnan(pidcf.Kp)) { + // Scale PID values since EEPROM values are unscaled + PID_PARAM(Kp, e) = pidcf.Kp; + PID_PARAM(Ki, e) = scalePID_i(pidcf.Ki); + PID_PARAM(Kd, e) = scalePID_d(pidcf.Kd); + TERN_(PID_EXTRUSION_SCALING, PID_PARAM(Kc, e) = pidcf.Kc); + TERN_(PID_FAN_SCALING, PID_PARAM(Kf, e) = pidcf.Kf); + } + #endif + } + } + + // + // PID Extrusion Scaling + // + { + _FIELD_TEST(lpq_len); + #if ENABLED(PID_EXTRUSION_SCALING) + const int16_t &lpq_len = thermalManager.lpq_len; + #else + int16_t lpq_len; + #endif + EEPROM_READ(lpq_len); + } + + // + // Heated Bed PID + // + { + PID_t pid; + EEPROM_READ(pid); + #if ENABLED(PIDTEMPBED) + if (!validating && !isnan(pid.Kp)) { + // Scale PID values since EEPROM values are unscaled + thermalManager.temp_bed.pid.Kp = pid.Kp; + thermalManager.temp_bed.pid.Ki = scalePID_i(pid.Ki); + thermalManager.temp_bed.pid.Kd = scalePID_d(pid.Kd); + } + #endif + } + + // + // User-defined Thermistors + // + #if HAS_USER_THERMISTORS + { + _FIELD_TEST(user_thermistor); + EEPROM_READ(thermalManager.user_thermistor); + } + #endif + + // + // Power monitor + // + { + #if HAS_POWER_MONITOR + uint8_t &power_monitor_flags = power_monitor.flags; + #else + uint8_t power_monitor_flags; + #endif + _FIELD_TEST(power_monitor_flags); + EEPROM_READ(power_monitor_flags); + } + + // + // LCD Contrast + // + { + _FIELD_TEST(lcd_contrast); + int16_t lcd_contrast; + EEPROM_READ(lcd_contrast); + if (!validating) { + TERN_(HAS_LCD_CONTRAST, ui.set_contrast(lcd_contrast)); + } + } + + // + // Controller Fan + // + { + _FIELD_TEST(controllerFan_settings); + #if ENABLED(CONTROLLER_FAN_EDITABLE) + const controllerFan_settings_t &cfs = controllerFan.settings; + #else + controllerFan_settings_t cfs = { 0 }; + #endif + EEPROM_READ(cfs); + } + + // + // Power-Loss Recovery + // + { + _FIELD_TEST(recovery_enabled); + #if ENABLED(POWER_LOSS_RECOVERY) + const bool &recovery_enabled = recovery.enabled; + #else + bool recovery_enabled; + #endif + EEPROM_READ(recovery_enabled); + } + + // + // Firmware Retraction + // + { + _FIELD_TEST(fwretract_settings); + + #if ENABLED(FWRETRACT) + EEPROM_READ(fwretract.settings); + #else + fwretract_settings_t fwretract_settings; + EEPROM_READ(fwretract_settings); + #endif + #if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) + EEPROM_READ(fwretract.autoretract_enabled); + #else + bool autoretract_enabled; + EEPROM_READ(autoretract_enabled); + #endif + } + + // + // Volumetric & Filament Size + // + { + struct { + bool volumetric_enabled; + float filament_size[EXTRUDERS]; + float volumetric_extruder_limit[EXTRUDERS]; + } storage; + + _FIELD_TEST(parser_volumetric_enabled); + EEPROM_READ(storage); + + #if DISABLED(NO_VOLUMETRICS) + if (!validating) { + parser.volumetric_enabled = storage.volumetric_enabled; + COPY(planner.filament_size, storage.filament_size); + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + COPY(planner.volumetric_extruder_limit, storage.volumetric_extruder_limit); + #endif + } + #endif + } + + // + // TMC Stepper Settings + // + + if (!validating) reset_stepper_drivers(); + + // TMC Stepper Current + { + _FIELD_TEST(tmc_stepper_current); + + tmc_stepper_current_t currents; + EEPROM_READ(currents); + + #if HAS_TRINAMIC_CONFIG + + #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT) + if (!validating) { + #if AXIS_IS_TMC(X) + SET_CURR(X); + #endif + #if AXIS_IS_TMC(Y) + SET_CURR(Y); + #endif + #if AXIS_IS_TMC(Z) + SET_CURR(Z); + #endif + #if AXIS_IS_TMC(X2) + SET_CURR(X2); + #endif + #if AXIS_IS_TMC(Y2) + SET_CURR(Y2); + #endif + #if AXIS_IS_TMC(Z2) + SET_CURR(Z2); + #endif + #if AXIS_IS_TMC(Z3) + SET_CURR(Z3); + #endif + #if AXIS_IS_TMC(Z4) + SET_CURR(Z4); + #endif + #if AXIS_IS_TMC(E0) + SET_CURR(E0); + #endif + #if AXIS_IS_TMC(E1) + SET_CURR(E1); + #endif + #if AXIS_IS_TMC(E2) + SET_CURR(E2); + #endif + #if AXIS_IS_TMC(E3) + SET_CURR(E3); + #endif + #if AXIS_IS_TMC(E4) + SET_CURR(E4); + #endif + #if AXIS_IS_TMC(E5) + SET_CURR(E5); + #endif + #if AXIS_IS_TMC(E6) + SET_CURR(E6); + #endif + #if AXIS_IS_TMC(E7) + SET_CURR(E7); + #endif + } + #endif + } + + // TMC Hybrid Threshold + { + tmc_hybrid_threshold_t tmc_hybrid_threshold; + _FIELD_TEST(tmc_hybrid_threshold); + EEPROM_READ(tmc_hybrid_threshold); + + #if ENABLED(HYBRID_THRESHOLD) + if (!validating) { + #if AXIS_HAS_STEALTHCHOP(X) + stepperX.set_pwm_thrs(tmc_hybrid_threshold.X); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + stepperY.set_pwm_thrs(tmc_hybrid_threshold.Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + stepperZ.set_pwm_thrs(tmc_hybrid_threshold.Z); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + stepperX2.set_pwm_thrs(tmc_hybrid_threshold.X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + stepperY2.set_pwm_thrs(tmc_hybrid_threshold.Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + stepperZ2.set_pwm_thrs(tmc_hybrid_threshold.Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + stepperZ3.set_pwm_thrs(tmc_hybrid_threshold.Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + stepperZ4.set_pwm_thrs(tmc_hybrid_threshold.Z4); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + stepperE0.set_pwm_thrs(tmc_hybrid_threshold.E0); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + stepperE1.set_pwm_thrs(tmc_hybrid_threshold.E1); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + stepperE2.set_pwm_thrs(tmc_hybrid_threshold.E2); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + stepperE3.set_pwm_thrs(tmc_hybrid_threshold.E3); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + stepperE4.set_pwm_thrs(tmc_hybrid_threshold.E4); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + stepperE5.set_pwm_thrs(tmc_hybrid_threshold.E5); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + stepperE6.set_pwm_thrs(tmc_hybrid_threshold.E6); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + stepperE7.set_pwm_thrs(tmc_hybrid_threshold.E7); + #endif + } + #endif + } + + // + // TMC StallGuard threshold. + // + { + tmc_sgt_t tmc_sgt; + _FIELD_TEST(tmc_sgt); + EEPROM_READ(tmc_sgt); + #if USE_SENSORLESS + if (!validating) { + TERN_(X_SENSORLESS, stepperX.homing_threshold(tmc_sgt.X)); + TERN_(X2_SENSORLESS, stepperX2.homing_threshold(tmc_sgt.X2)); + TERN_(Y_SENSORLESS, stepperY.homing_threshold(tmc_sgt.Y)); + TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(tmc_sgt.Y2)); + TERN_(Z_SENSORLESS, stepperZ.homing_threshold(tmc_sgt.Z)); + TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(tmc_sgt.Z2)); + TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(tmc_sgt.Z3)); + TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(tmc_sgt.Z4)); + } + #endif + } + + // TMC stepping mode + { + _FIELD_TEST(tmc_stealth_enabled); + + tmc_stealth_enabled_t tmc_stealth_enabled; + EEPROM_READ(tmc_stealth_enabled); + + #if HAS_TRINAMIC_CONFIG + + #define SET_STEPPING_MODE(ST) stepper##ST.stored.stealthChop_enabled = tmc_stealth_enabled.ST; stepper##ST.refresh_stepping_mode(); + if (!validating) { + #if AXIS_HAS_STEALTHCHOP(X) + SET_STEPPING_MODE(X); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + SET_STEPPING_MODE(Y); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + SET_STEPPING_MODE(Z); + #endif + #if AXIS_HAS_STEALTHCHOP(X2) + SET_STEPPING_MODE(X2); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + SET_STEPPING_MODE(Y2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + SET_STEPPING_MODE(Z2); + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + SET_STEPPING_MODE(Z3); + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + SET_STEPPING_MODE(Z4); + #endif + #if AXIS_HAS_STEALTHCHOP(E0) + SET_STEPPING_MODE(E0); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + SET_STEPPING_MODE(E1); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + SET_STEPPING_MODE(E2); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + SET_STEPPING_MODE(E3); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + SET_STEPPING_MODE(E4); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + SET_STEPPING_MODE(E5); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + SET_STEPPING_MODE(E6); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + SET_STEPPING_MODE(E7); + #endif + } + #endif + } + + // + // Linear Advance + // + { + float extruder_advance_K[_MAX(EXTRUDERS, 1)]; + _FIELD_TEST(planner_extruder_advance_K); + EEPROM_READ(extruder_advance_K); + #if ENABLED(LIN_ADVANCE) + if (!validating) + COPY(planner.extruder_advance_K, extruder_advance_K); + #endif + } + + // + // Motor Current PWM + // + { + _FIELD_TEST(motor_current_setting); + uint32_t motor_current_setting[MOTOR_CURRENT_COUNT] + #if HAS_MOTOR_CURRENT_SPI + = DIGIPOT_MOTOR_CURRENT + #endif + ; + DEBUG_ECHOLNPGM("DIGIPOTS Loading"); + EEPROM_READ(motor_current_setting); + DEBUG_ECHOLNPGM("DIGIPOTS Loaded"); + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + if (!validating) + COPY(stepper.motor_current_setting, motor_current_setting); + #endif + } + + // + // CNC Coordinate System + // + { + _FIELD_TEST(coordinate_system); + #if ENABLED(CNC_COORDINATE_SYSTEMS) + if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space + EEPROM_READ(gcode.coordinate_system); + #else + xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; + EEPROM_READ(coordinate_system); + #endif + } + + // + // Skew correction factors + // + { + skew_factor_t skew_factor; + _FIELD_TEST(planner_skew_factor); + EEPROM_READ(skew_factor); + #if ENABLED(SKEW_CORRECTION_GCODE) + if (!validating) { + planner.skew_factor.xy = skew_factor.xy; + #if ENABLED(SKEW_CORRECTION_FOR_Z) + planner.skew_factor.xz = skew_factor.xz; + planner.skew_factor.yz = skew_factor.yz; + #endif + } + #endif + } + + // + // Advanced Pause filament load & unload lengths + // + #if EXTRUDERS + { + #if DISABLED(ADVANCED_PAUSE_FEATURE) + fil_change_settings_t fc_settings[EXTRUDERS]; + #endif + _FIELD_TEST(fc_settings); + EEPROM_READ(fc_settings); + } + #endif + + // + // Tool-change settings + // + #if HAS_MULTI_EXTRUDER + _FIELD_TEST(toolchange_settings); + EEPROM_READ(toolchange_settings); + #endif + + // + // Backlash Compensation + // + { + #if ENABLED(BACKLASH_GCODE) + const xyz_float_t &backlash_distance_mm = backlash.distance_mm; + const uint8_t &backlash_correction = backlash.correction; + #else + float backlash_distance_mm[XYZ]; + uint8_t backlash_correction; + #endif + #if ENABLED(BACKLASH_GCODE) && defined(BACKLASH_SMOOTHING_MM) + const float &backlash_smoothing_mm = backlash.smoothing_mm; + #else + float backlash_smoothing_mm; + #endif + _FIELD_TEST(backlash_distance_mm); + EEPROM_READ(backlash_distance_mm); + EEPROM_READ(backlash_correction); + EEPROM_READ(backlash_smoothing_mm); + } + + // + // Extensible UI User Data + // + #if ENABLED(EXTENSIBLE_UI) + // This is a significant hardware change; don't reserve EEPROM space when not present + { + const char extui_data[ExtUI::eeprom_data_size] = { 0 }; + _FIELD_TEST(extui_data); + EEPROM_READ(extui_data); + if (!validating) ExtUI::onLoadSettings(extui_data); + } + #endif + + // + // Case Light Brightness + // + #if HAS_CASE_LIGHT_BRIGHTNESS + _FIELD_TEST(caselight_brightness); + 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 + // + #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(); + DEBUG_ECHOLNPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET)), " Size: ", datasize()); + TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_index()); + } + else if (working_crc != stored_crc) { + eeprom_error = true; + DEBUG_ERROR_START(); + DEBUG_ECHOLNPAIR("EEPROM CRC mismatch - (stored) ", stored_crc, " != ", working_crc, " (calculated)!"); + TERN(EEPROM_AUTO_INIT,,ui.eeprom_alert_crc()); + } + else if (!validating) { + DEBUG_ECHO_START(); + DEBUG_ECHO(version); + DEBUG_ECHOLNPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET), " bytes; crc ", (uint32_t)working_crc, ")"); + } + + if (!validating && !eeprom_error) postprocess(); + + #if ENABLED(AUTO_BED_LEVELING_UBL) + if (!validating) { + ubl.report_state(); + + if (!ubl.sanity_check()) { + SERIAL_EOL(); + #if ENABLED(EEPROM_CHITCHAT) + ubl.echo_name(); + DEBUG_ECHOLNPGM(" initialized.\n"); + #endif + } + else { + eeprom_error = true; + #if ENABLED(EEPROM_CHITCHAT) + DEBUG_ECHOPGM("?Can't enable "); + ubl.echo_name(); + DEBUG_ECHOLNPGM("."); + #endif + ubl.reset(); + } + + if (ubl.storage_slot >= 0) { + load_mesh(ubl.storage_slot); + DEBUG_ECHOLNPAIR("Mesh ", ubl.storage_slot, " loaded from storage."); + } + else { + ubl.reset(); + DEBUG_ECHOLNPGM("UBL reset"); + } + } + #endif + } + + #if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503) + // Report the EEPROM settings + if (!validating && (DISABLED(EEPROM_BOOT_SILENT) || IsRunning())) report(); + #endif + + EEPROM_FINISH(); + + return !eeprom_error; + } + + #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + extern bool restoreEEPROM(); + #endif + + bool MarlinSettings::validate() { + validating = true; + #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE + bool success = _load(); + if (!success && restoreEEPROM()) { + SERIAL_ECHOLNPGM("Recovered backup EEPROM settings from SPI Flash"); + success = _load(); + } + #else + const bool success = _load(); + #endif + validating = false; + return success; + } + + bool MarlinSettings::load() { + if (validate()) { + const bool success = _load(); + TERN_(EXTENSIBLE_UI, ExtUI::onConfigurationStoreRead(success)); + return success; + } + reset(); + #if ENABLED(EEPROM_AUTO_INIT) + (void)save(); + SERIAL_ECHO_MSG("EEPROM Initialized"); + #endif + return false; + } + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + inline void ubl_invalid_slot(const int s) { + #if ENABLED(EEPROM_CHITCHAT) + DEBUG_ECHOLNPGM("?Invalid slot."); + DEBUG_ECHO(s); + DEBUG_ECHOLNPGM(" mesh slots available."); + #else + UNUSED(s); + #endif + } + + const uint16_t MarlinSettings::meshes_end = persistentStore.capacity() - 129; // 128 (+1 because of the change to capacity rather than last valid address) + // is a placeholder for the size of the MAT; the MAT will always + // live at the very end of the eeprom + + uint16_t MarlinSettings::meshes_start_index() { + return (datasize() + EEPROM_OFFSET + 32) & 0xFFF8; // Pad the end of configuration data so it can float up + // or down a little bit without disrupting the mesh data + } + + uint16_t MarlinSettings::calc_num_meshes() { + return (meshes_end - meshes_start_index()) / sizeof(ubl.z_values); + } + + int MarlinSettings::mesh_slot_offset(const int8_t slot) { + return meshes_end - (slot + 1) * sizeof(ubl.z_values); + } + + void MarlinSettings::store_mesh(const int8_t slot) { + + #if ENABLED(AUTO_BED_LEVELING_UBL) + const int16_t a = calc_num_meshes(); + if (!WITHIN(slot, 0, a - 1)) { + ubl_invalid_slot(a); + DEBUG_ECHOLNPAIR("E2END=", persistentStore.capacity() - 1, " meshes_end=", meshes_end, " slot=", slot); + DEBUG_EOL(); + return; + } + + int pos = mesh_slot_offset(slot); + uint16_t crc = 0; + + // Write crc to MAT along with other data, or just tack on to the beginning or end + persistentStore.access_start(); + const bool status = persistentStore.write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc); + persistentStore.access_finish(); + + if (status) SERIAL_ECHOLNPGM("?Unable to save mesh data."); + else DEBUG_ECHOLNPAIR("Mesh saved in slot ", slot); + + #else + + // Other mesh types + + #endif + } + + void MarlinSettings::load_mesh(const int8_t slot, void * const into/*=nullptr*/) { + + #if ENABLED(AUTO_BED_LEVELING_UBL) + + const int16_t a = settings.calc_num_meshes(); + + if (!WITHIN(slot, 0, a - 1)) { + ubl_invalid_slot(a); + return; + } + + int pos = mesh_slot_offset(slot); + uint16_t crc = 0; + uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values; + + persistentStore.access_start(); + const uint16_t status = persistentStore.read_data(pos, dest, sizeof(ubl.z_values), &crc); + persistentStore.access_finish(); + + if (status) SERIAL_ECHOLNPGM("?Unable to load mesh data."); + else DEBUG_ECHOLNPAIR("Mesh loaded from slot ", slot); + + EEPROM_FINISH(); + + #else + + // Other mesh types + + #endif + } + + //void MarlinSettings::delete_mesh() { return; } + //void MarlinSettings::defrag_meshes() { return; } + + #endif // AUTO_BED_LEVELING_UBL + +#else // !EEPROM_SETTINGS + + bool MarlinSettings::save() { + DEBUG_ERROR_MSG("EEPROM disabled"); + return false; + } + +#endif // !EEPROM_SETTINGS + +/** + * M502 - Reset Configuration + */ +void MarlinSettings::reset() { + LOOP_XYZE_N(i) { + planner.settings.max_acceleration_mm_per_s2[i] = pgm_read_dword(&_DMA[ALIM(i, _DMA)]); + planner.settings.axis_steps_per_mm[i] = pgm_read_float(&_DASU[ALIM(i, _DASU)]); + planner.settings.max_feedrate_mm_s[i] = pgm_read_float(&_DMF[ALIM(i, _DMF)]); + } + + planner.settings.min_segment_time_us = DEFAULT_MINSEGMENTTIME; + planner.settings.acceleration = DEFAULT_ACCELERATION; + planner.settings.retract_acceleration = DEFAULT_RETRACT_ACCELERATION; + planner.settings.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION; + planner.settings.min_feedrate_mm_s = feedRate_t(DEFAULT_MINIMUMFEEDRATE); + planner.settings.min_travel_feedrate_mm_s = feedRate_t(DEFAULT_MINTRAVELFEEDRATE); + + #if HAS_CLASSIC_JERK + #ifndef DEFAULT_XJERK + #define DEFAULT_XJERK 0 + #endif + #ifndef DEFAULT_YJERK + #define DEFAULT_YJERK 0 + #endif + #ifndef DEFAULT_ZJERK + #define DEFAULT_ZJERK 0 + #endif + planner.max_jerk.set(DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK); + TERN_(HAS_CLASSIC_E_JERK, planner.max_jerk.e = DEFAULT_EJERK;); + #endif + + #if HAS_JUNCTION_DEVIATION + planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM); + #endif + + #if HAS_SCARA_OFFSET + scara_home_offset.reset(); + #elif HAS_HOME_OFFSET + home_offset.reset(); + #endif + + TERN_(HAS_HOTEND_OFFSET, reset_hotend_offsets()); + + // + // Filament Runout Sensor + // + + #if HAS_FILAMENT_SENSOR + runout.enabled = FIL_RUNOUT_ENABLED_DEFAULT; + runout.reset(); + TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, runout.set_runout_distance(FILAMENT_RUNOUT_DISTANCE_MM)); + #endif + + // + // Tool-change Settings + // + + #if HAS_MULTI_EXTRUDER + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + toolchange_settings.swap_length = TOOLCHANGE_FS_LENGTH; + toolchange_settings.extra_resume = TOOLCHANGE_FS_EXTRA_RESUME_LENGTH; + toolchange_settings.retract_speed = TOOLCHANGE_FS_RETRACT_SPEED; + toolchange_settings.unretract_speed = TOOLCHANGE_FS_UNRETRACT_SPEED; + toolchange_settings.extra_prime = TOOLCHANGE_FS_EXTRA_PRIME; + toolchange_settings.prime_speed = TOOLCHANGE_FS_PRIME_SPEED; + toolchange_settings.fan_speed = TOOLCHANGE_FS_FAN_SPEED; + toolchange_settings.fan_time = TOOLCHANGE_FS_FAN_TIME; + #endif + + #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) + enable_first_prime = false; + #endif + + #if ENABLED(TOOLCHANGE_PARK) + constexpr xyz_pos_t tpxy = TOOLCHANGE_PARK_XY; + toolchange_settings.enable_park = true; + toolchange_settings.change_point = tpxy; + #endif + + toolchange_settings.z_raise = TOOLCHANGE_ZRAISE; + + #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + migration = migration_defaults; + #endif + + #endif + + #if ENABLED(BACKLASH_GCODE) + backlash.correction = (BACKLASH_CORRECTION) * 255; + constexpr xyz_float_t tmp = BACKLASH_DISTANCE_MM; + backlash.distance_mm = tmp; + #ifdef BACKLASH_SMOOTHING_MM + backlash.smoothing_mm = BACKLASH_SMOOTHING_MM; + #endif + #endif + + TERN_(EXTENSIBLE_UI, ExtUI::onFactoryReset()); + + // + // Case Light Brightness + // + TERN_(HAS_CASE_LIGHT_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + + // + // TOUCH_SCREEN_CALIBRATION + // + TERN_(TOUCH_SCREEN_CALIBRATION, touch.calibration_reset()); + + // + // Magnetic Parking Extruder + // + TERN_(MAGNETIC_PARKING_EXTRUDER, mpe_settings_init()); + + // + // Global Leveling + // + TERN_(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height = 0.0); + TERN_(HAS_LEVELING, reset_bed_level()); + + #if HAS_BED_PROBE + constexpr float dpo[] = NOZZLE_TO_PROBE_OFFSET; + static_assert(COUNT(dpo) == 3, "NOZZLE_TO_PROBE_OFFSET must contain offsets for X, Y, and Z."); + #if HAS_PROBE_XY_OFFSET + LOOP_XYZ(a) probe.offset[a] = dpo[a]; + #else + probe.offset.set(0, 0, dpo[Z_AXIS]); + #endif + #endif + + // + // Z Stepper Auto-alignment points + // + TERN_(Z_STEPPER_AUTO_ALIGN, z_stepper_align.reset_to_default()); + + // + // Servo Angles + // + TERN_(EDITABLE_SERVO_ANGLES, COPY(servo_angles, base_servo_angles)); // When not editable only one copy of servo angles exists + + // + // BLTOUCH + // + //#if ENABLED(BLTOUCH) + // bltouch.last_written_mode; + //#endif + + // + // Endstop Adjustments + // + + #if ENABLED(DELTA) + 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) + #ifndef X2_ENDSTOP_ADJUSTMENT + #define X2_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.x2_endstop_adj = X2_ENDSTOP_ADJUSTMENT; + #endif + + #if ENABLED(Y_DUAL_ENDSTOPS) + #ifndef Y2_ENDSTOP_ADJUSTMENT + #define Y2_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.y2_endstop_adj = Y2_ENDSTOP_ADJUSTMENT; + #endif + + #if ENABLED(Z_MULTI_ENDSTOPS) + #ifndef Z2_ENDSTOP_ADJUSTMENT + #define Z2_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.z2_endstop_adj = Z2_ENDSTOP_ADJUSTMENT; + #if NUM_Z_STEPPER_DRIVERS >= 3 + #ifndef Z3_ENDSTOP_ADJUSTMENT + #define Z3_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.z3_endstop_adj = Z3_ENDSTOP_ADJUSTMENT; + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + #ifndef Z4_ENDSTOP_ADJUSTMENT + #define Z4_ENDSTOP_ADJUSTMENT 0 + #endif + endstops.z4_endstop_adj = Z4_ENDSTOP_ADJUSTMENT; + #endif + #endif + + // + // Preheat parameters + // + #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 + + // + // Hotend PID + // + + #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(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 + + // + // PID Extrusion Scaling + // + TERN_(PID_EXTRUSION_SCALING, thermalManager.lpq_len = 20); // Default last-position-queue size + + // + // Heated Bed PID + // + + #if ENABLED(PIDTEMPBED) + thermalManager.temp_bed.pid.Kp = DEFAULT_bedKp; + thermalManager.temp_bed.pid.Ki = scalePID_i(DEFAULT_bedKi); + thermalManager.temp_bed.pid.Kd = scalePID_d(DEFAULT_bedKd); + #endif + + // + // User-Defined Thermistors + // + TERN_(HAS_USER_THERMISTORS, thermalManager.reset_user_thermistors()); + + // + // Power Monitor + // + TERN_(POWER_MONITOR, power_monitor.reset()); + + // + // LCD Contrast + // + TERN_(HAS_LCD_CONTRAST, ui.set_contrast(DEFAULT_LCD_CONTRAST)); + + // + // Controller Fan + // + TERN_(USE_CONTROLLER_FAN, controllerFan.reset()); + + // + // Power-Loss Recovery + // + TERN_(POWER_LOSS_RECOVERY, recovery.enable(ENABLED(PLR_ENABLED_DEFAULT))); + + // + // Firmware Retraction + // + TERN_(FWRETRACT, fwretract.reset()); + + // + // Volumetric & Filament Size + // + + #if DISABLED(NO_VOLUMETRICS) + parser.volumetric_enabled = ENABLED(VOLUMETRIC_DEFAULT_ON); + LOOP_L_N(q, COUNT(planner.filament_size)) + planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA; + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + LOOP_L_N(q, COUNT(planner.volumetric_extruder_limit)) + planner.volumetric_extruder_limit[q] = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; + #endif + #endif + + endstops.enable_globally(ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)); + + reset_stepper_drivers(); + + // + // Linear Advance + // + + #if ENABLED(LIN_ADVANCE) + LOOP_L_N(i, EXTRUDERS) { + planner.extruder_advance_K[i] = LIN_ADVANCE_K; + TERN_(EXTRA_LIN_ADVANCE_K, other_extruder_advance_K[i] = LIN_ADVANCE_K); + } + #endif + + // + // Motor Current PWM + // + + #if HAS_MOTOR_CURRENT_PWM + constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; + LOOP_L_N(q, MOTOR_CURRENT_COUNT) + stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + #endif + + // + // DIGIPOTS + // + #if HAS_MOTOR_CURRENT_SPI + static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; + DEBUG_ECHOLNPGM("Writing Digipot"); + LOOP_L_N(q, COUNT(tmp_motor_current_setting)) + stepper.set_digipot_current(q, tmp_motor_current_setting[q]); + DEBUG_ECHOLNPGM("Digipot Written"); + #endif + + // + // CNC Coordinate System + // + TERN_(CNC_COORDINATE_SYSTEMS, (void)gcode.select_coordinate_system(-1)); // Go back to machine space + + // + // Skew Correction + // + #if ENABLED(SKEW_CORRECTION_GCODE) + planner.skew_factor.xy = XY_SKEW_FACTOR; + #if ENABLED(SKEW_CORRECTION_FOR_Z) + planner.skew_factor.xz = XZ_SKEW_FACTOR; + planner.skew_factor.yz = YZ_SKEW_FACTOR; + #endif + #endif + + // + // Advanced Pause filament load & unload lengths + // + #if ENABLED(ADVANCED_PAUSE_FEATURE) + LOOP_L_N(e, EXTRUDERS) { + fc_settings[e].unload_length = FILAMENT_CHANGE_UNLOAD_LENGTH; + fc_settings[e].load_length = FILAMENT_CHANGE_FAST_LOAD_LENGTH; + } + #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(); + DEBUG_ECHOLNPGM("Hardcoded Default Settings Loaded"); + + TERN_(EXTENSIBLE_UI, ExtUI::onFactoryReset()); +} + +#if DISABLED(DISABLE_M503) + + static void config_heading(const bool repl, PGM_P const pstr, const bool eol=true) { + if (!repl) { + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("; "); + serialprintPGM(pstr); + if (eol) SERIAL_EOL(); + } + } + + #define CONFIG_ECHO_START() do{ if (!forReplay) SERIAL_ECHO_START(); }while(0) + #define CONFIG_ECHO_MSG(STR) do{ CONFIG_ECHO_START(); SERIAL_ECHOLNPGM(STR); }while(0) + #define CONFIG_ECHO_HEADING(STR) config_heading(forReplay, PSTR(STR)) + + #if HAS_TRINAMIC_CONFIG + inline void say_M906(const bool forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM(" M906"); } + #if HAS_STEALTHCHOP + void say_M569(const bool forReplay, const char * const etc=nullptr, const bool newLine = false) { + CONFIG_ECHO_START(); + SERIAL_ECHOPGM(" M569 S1"); + if (etc) { + SERIAL_CHAR(' '); + serialprintPGM(etc); + } + if (newLine) SERIAL_EOL(); + } + #endif + #if ENABLED(HYBRID_THRESHOLD) + inline void say_M913(const bool forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM(" M913"); } + #endif + #if USE_SENSORLESS + inline void say_M914() { SERIAL_ECHOPGM(" M914"); } + #endif + #endif + + #if ENABLED(ADVANCED_PAUSE_FEATURE) + inline void say_M603(const bool forReplay) { CONFIG_ECHO_START(); SERIAL_ECHOPGM(" M603 "); } + #endif + + inline void say_units(const bool colon) { + serialprintPGM( + #if ENABLED(INCH_MODE_SUPPORT) + parser.linear_unit_factor != 1.0 ? PSTR(" (in)") : + #endif + PSTR(" (mm)") + ); + if (colon) SERIAL_ECHOLNPGM(":"); + } + + void report_M92(const bool echo=true, const int8_t e=-1); + + /** + * M503 - Report current settings in RAM + * + * Unless specifically disabled, M503 is available even without EEPROM + */ + void MarlinSettings::report(const bool forReplay) { + /** + * Announce current units, in case inches are being displayed + */ + CONFIG_ECHO_START(); + #if ENABLED(INCH_MODE_SUPPORT) + SERIAL_ECHOPGM(" G2"); + SERIAL_CHAR(parser.linear_unit_factor == 1.0 ? '1' : '0'); + SERIAL_ECHOPGM(" ;"); + say_units(false); + #else + SERIAL_ECHOPGM(" G21 ; Units in mm"); + say_units(false); + #endif + SERIAL_EOL(); + + #if HAS_LCD_MENU + + // Temperature units - for Ultipanel temperature options + + CONFIG_ECHO_START(); + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + SERIAL_ECHOPGM(" M149 "); + SERIAL_CHAR(parser.temp_units_code()); + SERIAL_ECHOPGM(" ; Units in "); + serialprintPGM(parser.temp_units_name()); + #else + SERIAL_ECHOLNPGM(" M149 C ; Units in Celsius"); + #endif + + #endif + + SERIAL_EOL(); + + #if EXTRUDERS && DISABLED(NO_VOLUMETRICS) + + /** + * Volumetric extrusion M200 + */ + if (!forReplay) { + config_heading(forReplay, PSTR("Filament settings:"), false); + if (parser.volumetric_enabled) + SERIAL_EOL(); + else + SERIAL_ECHOLNPGM(" Disabled"); + } + + #if EXTRUDERS == 1 + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled) + , " D", LINEAR_UNIT(planner.filament_size[0]) + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[0]) + #endif + ); + #else + LOOP_L_N(i, EXTRUDERS) { + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M200 T", int(i) + , " D", LINEAR_UNIT(planner.filament_size[i]) + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + , " L", LINEAR_UNIT(planner.volumetric_extruder_limit[i]) + #endif + ); + } + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M200 S", int(parser.volumetric_enabled)); + #endif + #endif // EXTRUDERS && !NO_VOLUMETRICS + + CONFIG_ECHO_HEADING("Steps per unit:"); + report_M92(!forReplay); + + CONFIG_ECHO_HEADING("Maximum feedrates (units/s):"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]) + , SP_Y_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Y_AXIS]) + , SP_Z_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Z_AXIS]) + #if DISABLED(DISTINCT_E_FACTORS) + , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS]) + #endif + ); + #if ENABLED(DISTINCT_E_FACTORS) + LOOP_L_N(i, E_STEPPERS) { + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M203 T"), (int)i + , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS_N(i)]) + ); + } + #endif + + CONFIG_ECHO_HEADING("Maximum Acceleration (units/s2):"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]) + , SP_Y_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Y_AXIS]) + , SP_Z_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Z_AXIS]) + #if DISABLED(DISTINCT_E_FACTORS) + , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS]) + #endif + ); + #if ENABLED(DISTINCT_E_FACTORS) + LOOP_L_N(i, E_STEPPERS) { + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M201 T"), (int)i + , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(i)]) + ); + } + #endif + + CONFIG_ECHO_HEADING("Acceleration (units/s2): P R T"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M204 P"), LINEAR_UNIT(planner.settings.acceleration) + , PSTR(" R"), LINEAR_UNIT(planner.settings.retract_acceleration) + , SP_T_STR, LINEAR_UNIT(planner.settings.travel_acceleration) + ); + + CONFIG_ECHO_HEADING( + "Advanced: B S T" + #if HAS_JUNCTION_DEVIATION + " J" + #endif + #if HAS_CLASSIC_JERK + " X Y Z" + TERN_(HAS_CLASSIC_E_JERK, " E") + #endif + ); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M205 B"), LINEAR_UNIT(planner.settings.min_segment_time_us) + , PSTR(" S"), LINEAR_UNIT(planner.settings.min_feedrate_mm_s) + , SP_T_STR, LINEAR_UNIT(planner.settings.min_travel_feedrate_mm_s) + #if HAS_JUNCTION_DEVIATION + , PSTR(" J"), LINEAR_UNIT(planner.junction_deviation_mm) + #endif + #if HAS_CLASSIC_JERK + , SP_X_STR, LINEAR_UNIT(planner.max_jerk.x) + , SP_Y_STR, LINEAR_UNIT(planner.max_jerk.y) + , SP_Z_STR, LINEAR_UNIT(planner.max_jerk.z) + #if HAS_CLASSIC_E_JERK + , SP_E_STR, LINEAR_UNIT(planner.max_jerk.e) + #endif + #endif + ); + + #if HAS_M206_COMMAND + CONFIG_ECHO_HEADING("Home offset:"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + #if IS_CARTESIAN + PSTR(" M206 X"), LINEAR_UNIT(home_offset.x) + , SP_Y_STR, LINEAR_UNIT(home_offset.y) + , SP_Z_STR + #else + PSTR(" M206 Z") + #endif + , LINEAR_UNIT(home_offset.z) + ); + #endif + + #if HAS_HOTEND_OFFSET + CONFIG_ECHO_HEADING("Hotend offsets:"); + CONFIG_ECHO_START(); + LOOP_S_L_N(e, 1, HOTENDS) { + SERIAL_ECHOPAIR_P( + PSTR(" M218 T"), (int)e, + SP_X_STR, LINEAR_UNIT(hotend_offset[e].x), + SP_Y_STR, LINEAR_UNIT(hotend_offset[e].y) + ); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(hotend_offset[e].z), 3); + } + #endif + + /** + * Bed Leveling + */ + #if HAS_LEVELING + + #if ENABLED(MESH_BED_LEVELING) + + CONFIG_ECHO_HEADING("Mesh Bed Leveling:"); + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + + config_heading(forReplay, PSTR(""), false); + if (!forReplay) { + ubl.echo_name(); + SERIAL_CHAR(':'); + SERIAL_EOL(); + } + + #elif HAS_ABL_OR_UBL + + CONFIG_ECHO_HEADING("Auto Bed Leveling:"); + + #endif + + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M420 S"), planner.leveling_active ? 1 : 0 + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + , SP_Z_STR, LINEAR_UNIT(planner.z_fade_height) + #endif + ); + + #if ENABLED(MESH_BED_LEVELING) + + if (leveling_is_valid()) { + LOOP_L_N(py, GRID_MAX_POINTS_Y) { + LOOP_L_N(px, GRID_MAX_POINTS_X) { + CONFIG_ECHO_START(); + SERIAL_ECHOPAIR_P(PSTR(" G29 S3 I"), (int)px, PSTR(" J"), (int)py); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(mbl.z_values[px][py]), 5); + } + } + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_F_P(PSTR(" G29 S4 Z"), LINEAR_UNIT(mbl.z_offset), 5); + } + + #elif ENABLED(AUTO_BED_LEVELING_UBL) + + if (!forReplay) { + SERIAL_EOL(); + ubl.report_state(); + SERIAL_EOL(); + config_heading(false, PSTR("Active Mesh Slot: "), false); + SERIAL_ECHOLN(ubl.storage_slot); + config_heading(false, PSTR("EEPROM can hold "), false); + SERIAL_ECHO(calc_num_meshes()); + SERIAL_ECHOLNPGM(" meshes.\n"); + } + + //ubl.report_current_mesh(); // This is too verbose for large meshes. A better (more terse) + // solution needs to be found. + #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) + + if (leveling_is_valid()) { + LOOP_L_N(py, GRID_MAX_POINTS_Y) { + LOOP_L_N(px, GRID_MAX_POINTS_X) { + CONFIG_ECHO_START(); + SERIAL_ECHOPAIR(" G29 W I", (int)px, " J", (int)py); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(z_values[px][py]), 5); + } + } + } + + #endif + + #endif // HAS_LEVELING + + #if ENABLED(EDITABLE_SERVO_ANGLES) + + CONFIG_ECHO_HEADING("Servo Angles:"); + LOOP_L_N(i, NUM_SERVOS) { + switch (i) { + #if ENABLED(SWITCHING_EXTRUDER) + case SWITCHING_EXTRUDER_SERVO_NR: + #if EXTRUDERS > 3 + case SWITCHING_EXTRUDER_E23_SERVO_NR: + #endif + #elif ENABLED(SWITCHING_NOZZLE) + case SWITCHING_NOZZLE_SERVO_NR: + #elif ENABLED(BLTOUCH) || (HAS_Z_SERVO_PROBE && defined(Z_SERVO_ANGLES)) + case Z_PROBE_SERVO_NR: + #endif + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M281 P", int(i), " L", servo_angles[i][0], " U", servo_angles[i][1]); + default: break; + } + } + + #endif // EDITABLE_SERVO_ANGLES + + #if HAS_SCARA_OFFSET + + CONFIG_ECHO_HEADING("SCARA settings: S P T"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M665 S"), delta_segments_per_second + , SP_P_STR, scara_home_offset.a + , SP_T_STR, scara_home_offset.b + , SP_Z_STR, LINEAR_UNIT(scara_home_offset.z) + ); + + #elif ENABLED(DELTA) + + CONFIG_ECHO_HEADING("Endstop adjustment:"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M666 X"), LINEAR_UNIT(delta_endstop_adj.a) + , SP_Y_STR, LINEAR_UNIT(delta_endstop_adj.b) + , SP_Z_STR, LINEAR_UNIT(delta_endstop_adj.c) + ); + + 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) + , PSTR(" R"), LINEAR_UNIT(delta_radius) + , PSTR(" H"), LINEAR_UNIT(delta_height) + , PSTR(" S"), delta_segments_per_second + , 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 + + CONFIG_ECHO_HEADING("Endstop adjustment:"); + CONFIG_ECHO_START(); + SERIAL_ECHOPGM(" M666"); + #if ENABLED(X_DUAL_ENDSTOPS) + SERIAL_ECHOLNPAIR_P(SP_X_STR, LINEAR_UNIT(endstops.x2_endstop_adj)); + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + SERIAL_ECHOLNPAIR_P(SP_Y_STR, LINEAR_UNIT(endstops.y2_endstop_adj)); + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) + #if NUM_Z_STEPPER_DRIVERS >= 3 + SERIAL_ECHOPAIR(" S2 Z", LINEAR_UNIT(endstops.z3_endstop_adj)); + CONFIG_ECHO_START(); + SERIAL_ECHOPAIR(" M666 S3 Z", LINEAR_UNIT(endstops.z3_endstop_adj)); + #if NUM_Z_STEPPER_DRIVERS >= 4 + CONFIG_ECHO_START(); + SERIAL_ECHOPAIR(" M666 S4 Z", LINEAR_UNIT(endstops.z4_endstop_adj)); + #endif + #else + SERIAL_ECHOLNPAIR_P(SP_Z_STR, LINEAR_UNIT(endstops.z2_endstop_adj)); + #endif + #endif + + #endif // [XYZ]_DUAL_ENDSTOPS + + #if PREHEAT_COUNT + + CONFIG_ECHO_HEADING("Material heatup parameters:"); + LOOP_L_N(i, PREHEAT_COUNT) { + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M145 S"), (int)i + #if HAS_HOTEND + , PSTR(" H"), TEMP_UNIT(ui.material_preset[i].hotend_temp) + #endif + #if HAS_HEATED_BED + , SP_B_STR, TEMP_UNIT(ui.material_preset[i].bed_temp) + #endif + #if HAS_FAN + , PSTR(" F"), ui.material_preset[i].fan_speed + #endif + ); + } + + #endif + + #if HAS_PID_HEATING + + CONFIG_ECHO_HEADING("PID settings:"); + + #if ENABLED(PIDTEMP) + HOTEND_LOOP() { + CONFIG_ECHO_START(); + SERIAL_ECHOPAIR_P( + #if ENABLED(PID_PARAMS_PER_HOTEND) + PSTR(" M301 E"), e, + SP_P_STR + #else + PSTR(" M301 P") + #endif + , PID_PARAM(Kp, e) + , PSTR(" I"), unscalePID_i(PID_PARAM(Ki, e)) + , PSTR(" D"), unscalePID_d(PID_PARAM(Kd, e)) + ); + #if ENABLED(PID_EXTRUSION_SCALING) + 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) + SERIAL_ECHOPAIR(" F", PID_PARAM(Kf, e)); + #endif + SERIAL_EOL(); + } + #endif // PIDTEMP + + #if ENABLED(PIDTEMPBED) + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR( + " M304 P", thermalManager.temp_bed.pid.Kp + , " I", unscalePID_i(thermalManager.temp_bed.pid.Ki) + , " D", unscalePID_d(thermalManager.temp_bed.pid.Kd) + ); + #endif + + #endif // PIDTEMP || PIDTEMPBED + + #if HAS_USER_THERMISTORS + CONFIG_ECHO_HEADING("User thermistors:"); + LOOP_L_N(i, USER_THERMISTORS) + thermalManager.log_user_thermistor(i, true); + #endif + + #if HAS_LCD_CONTRAST + CONFIG_ECHO_HEADING("LCD Contrast:"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M250 C", ui.contrast); + #endif + + TERN_(CONTROLLER_FAN_EDITABLE, M710_report(forReplay)); + + #if ENABLED(POWER_LOSS_RECOVERY) + CONFIG_ECHO_HEADING("Power-Loss Recovery:"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M413 S", int(recovery.enabled)); + #endif + + #if ENABLED(FWRETRACT) + + CONFIG_ECHO_HEADING("Retract: S F Z"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M207 S"), LINEAR_UNIT(fwretract.settings.retract_length) + , PSTR(" W"), LINEAR_UNIT(fwretract.settings.swap_retract_length) + , PSTR(" F"), LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_feedrate_mm_s)) + , SP_Z_STR, LINEAR_UNIT(fwretract.settings.retract_zraise) + ); + + CONFIG_ECHO_HEADING("Recover: S F"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR( + " M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_extra) + , " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_extra) + , " F", LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_recover_feedrate_mm_s)) + ); + + #if ENABLED(FWRETRACT_AUTORETRACT) + + CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M209 S", fwretract.autoretract_enabled ? 1 : 0); + + #endif // FWRETRACT_AUTORETRACT + + #endif // FWRETRACT + + /** + * Probe Offset + */ + #if HAS_BED_PROBE + config_heading(forReplay, PSTR("Z-Probe Offset"), false); + if (!forReplay) say_units(true); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + #if HAS_PROBE_XY_OFFSET + PSTR(" M851 X"), LINEAR_UNIT(probe.offset_xy.x), + SP_Y_STR, LINEAR_UNIT(probe.offset_xy.y), + SP_Z_STR + #else + PSTR(" M851 X0 Y0 Z") + #endif + , LINEAR_UNIT(probe.offset.z) + ); + #endif + + /** + * Bed Skew Correction + */ + #if ENABLED(SKEW_CORRECTION_GCODE) + CONFIG_ECHO_HEADING("Skew Factor: "); + CONFIG_ECHO_START(); + #if ENABLED(SKEW_CORRECTION_FOR_Z) + SERIAL_ECHOPAIR_F(" M852 I", LINEAR_UNIT(planner.skew_factor.xy), 6); + SERIAL_ECHOPAIR_F(" J", LINEAR_UNIT(planner.skew_factor.xz), 6); + SERIAL_ECHOLNPAIR_F(" K", LINEAR_UNIT(planner.skew_factor.yz), 6); + #else + SERIAL_ECHOLNPAIR_F(" M852 S", LINEAR_UNIT(planner.skew_factor.xy), 6); + #endif + #endif + + #if HAS_TRINAMIC_CONFIG + + /** + * TMC stepper driver current + */ + CONFIG_ECHO_HEADING("Stepper driver current:"); + + #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + say_M906(forReplay); + #if AXIS_IS_TMC(X) + SERIAL_ECHOPAIR_P(SP_X_STR, stepperX.getMilliamps()); + #endif + #if AXIS_IS_TMC(Y) + SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY.getMilliamps()); + #endif + #if AXIS_IS_TMC(Z) + SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ.getMilliamps()); + #endif + SERIAL_EOL(); + #endif + + #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + say_M906(forReplay); + SERIAL_ECHOPGM(" I1"); + #if AXIS_IS_TMC(X2) + SERIAL_ECHOPAIR_P(SP_X_STR, stepperX2.getMilliamps()); + #endif + #if AXIS_IS_TMC(Y2) + SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY2.getMilliamps()); + #endif + #if AXIS_IS_TMC(Z2) + SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ2.getMilliamps()); + #endif + SERIAL_EOL(); + #endif + + #if AXIS_IS_TMC(Z3) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.getMilliamps()); + #endif + + #if AXIS_IS_TMC(Z4) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" I3 Z", stepperZ4.getMilliamps()); + #endif + + #if AXIS_IS_TMC(E0) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T0 E", stepperE0.getMilliamps()); + #endif + #if AXIS_IS_TMC(E1) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T1 E", stepperE1.getMilliamps()); + #endif + #if AXIS_IS_TMC(E2) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T2 E", stepperE2.getMilliamps()); + #endif + #if AXIS_IS_TMC(E3) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T3 E", stepperE3.getMilliamps()); + #endif + #if AXIS_IS_TMC(E4) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T4 E", stepperE4.getMilliamps()); + #endif + #if AXIS_IS_TMC(E5) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T5 E", stepperE5.getMilliamps()); + #endif + #if AXIS_IS_TMC(E6) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T6 E", stepperE6.getMilliamps()); + #endif + #if AXIS_IS_TMC(E7) + say_M906(forReplay); + SERIAL_ECHOLNPAIR(" T7 E", stepperE7.getMilliamps()); + #endif + SERIAL_EOL(); + + /** + * TMC Hybrid Threshold + */ + #if ENABLED(HYBRID_THRESHOLD) + CONFIG_ECHO_HEADING("Hybrid Threshold:"); + #if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Z) + say_M913(forReplay); + #if AXIS_HAS_STEALTHCHOP(X) + SERIAL_ECHOPAIR_P(SP_X_STR, stepperX.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ.get_pwm_thrs()); + #endif + SERIAL_EOL(); + #endif + + #if AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z2) + say_M913(forReplay); + SERIAL_ECHOPGM(" I1"); + #if AXIS_HAS_STEALTHCHOP(X2) + SERIAL_ECHOPAIR_P(SP_X_STR, stepperX2.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY2.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ2.get_pwm_thrs()); + #endif + SERIAL_EOL(); + #endif + + #if AXIS_HAS_STEALTHCHOP(Z3) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.get_pwm_thrs()); + #endif + + #if AXIS_HAS_STEALTHCHOP(Z4) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" I3 Z", stepperZ4.get_pwm_thrs()); + #endif + + #if AXIS_HAS_STEALTHCHOP(E0) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T0 E", stepperE0.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T1 E", stepperE1.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T2 E", stepperE2.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T3 E", stepperE3.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T4 E", stepperE4.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T5 E", stepperE5.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T6 E", stepperE6.get_pwm_thrs()); + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + say_M913(forReplay); + SERIAL_ECHOLNPAIR(" T7 E", stepperE7.get_pwm_thrs()); + #endif + SERIAL_EOL(); + #endif // HYBRID_THRESHOLD + + /** + * TMC Sensorless homing thresholds + */ + #if USE_SENSORLESS + CONFIG_ECHO_HEADING("StallGuard threshold:"); + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + CONFIG_ECHO_START(); + say_M914(); + #if X_SENSORLESS + SERIAL_ECHOPAIR_P(SP_X_STR, stepperX.homing_threshold()); + #endif + #if Y_SENSORLESS + SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY.homing_threshold()); + #endif + #if Z_SENSORLESS + SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ.homing_threshold()); + #endif + SERIAL_EOL(); + #endif + + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS + CONFIG_ECHO_START(); + say_M914(); + SERIAL_ECHOPGM(" I1"); + #if X2_SENSORLESS + SERIAL_ECHOPAIR_P(SP_X_STR, stepperX2.homing_threshold()); + #endif + #if Y2_SENSORLESS + SERIAL_ECHOPAIR_P(SP_Y_STR, stepperY2.homing_threshold()); + #endif + #if Z2_SENSORLESS + SERIAL_ECHOPAIR_P(SP_Z_STR, stepperZ2.homing_threshold()); + #endif + SERIAL_EOL(); + #endif + + #if Z3_SENSORLESS + CONFIG_ECHO_START(); + say_M914(); + SERIAL_ECHOLNPAIR(" I2 Z", stepperZ3.homing_threshold()); + #endif + + #if Z4_SENSORLESS + CONFIG_ECHO_START(); + say_M914(); + SERIAL_ECHOLNPAIR(" I3 Z", stepperZ4.homing_threshold()); + #endif + + #endif // USE_SENSORLESS + + /** + * TMC stepping mode + */ + #if HAS_STEALTHCHOP + CONFIG_ECHO_HEADING("Driver stepping mode:"); + #if AXIS_HAS_STEALTHCHOP(X) + const bool chop_x = stepperX.get_stored_stealthChop_status(); + #else + constexpr bool chop_x = false; + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + const bool chop_y = stepperY.get_stored_stealthChop_status(); + #else + constexpr bool chop_y = false; + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + const bool chop_z = stepperZ.get_stored_stealthChop_status(); + #else + constexpr bool chop_z = false; + #endif + + if (chop_x || chop_y || chop_z) { + say_M569(forReplay); + if (chop_x) SERIAL_ECHOPGM_P(SP_X_STR); + if (chop_y) SERIAL_ECHOPGM_P(SP_Y_STR); + if (chop_z) SERIAL_ECHOPGM_P(SP_Z_STR); + SERIAL_EOL(); + } + + #if AXIS_HAS_STEALTHCHOP(X2) + const bool chop_x2 = stepperX2.get_stored_stealthChop_status(); + #else + constexpr bool chop_x2 = false; + #endif + #if AXIS_HAS_STEALTHCHOP(Y2) + const bool chop_y2 = stepperY2.get_stored_stealthChop_status(); + #else + constexpr bool chop_y2 = false; + #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + const bool chop_z2 = stepperZ2.get_stored_stealthChop_status(); + #else + constexpr bool chop_z2 = false; + #endif + + if (chop_x2 || chop_y2 || chop_z2) { + say_M569(forReplay, PSTR("I1")); + if (chop_x2) SERIAL_ECHOPGM_P(SP_X_STR); + if (chop_y2) SERIAL_ECHOPGM_P(SP_Y_STR); + if (chop_z2) SERIAL_ECHOPGM_P(SP_Z_STR); + SERIAL_EOL(); + } + + #if AXIS_HAS_STEALTHCHOP(Z3) + if (stepperZ3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I2 Z"), true); } + #endif + + #if AXIS_HAS_STEALTHCHOP(Z4) + if (stepperZ4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("I3 Z"), true); } + #endif + + #if AXIS_HAS_STEALTHCHOP(E0) + if (stepperE0.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T0 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E1) + if (stepperE1.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T1 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E2) + if (stepperE2.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T2 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E3) + if (stepperE3.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T3 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E4) + if (stepperE4.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T4 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E5) + if (stepperE5.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T5 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E6) + if (stepperE6.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T6 E"), true); } + #endif + #if AXIS_HAS_STEALTHCHOP(E7) + if (stepperE7.get_stored_stealthChop_status()) { say_M569(forReplay, PSTR("T7 E"), true); } + #endif + + #endif // HAS_STEALTHCHOP + + #endif // HAS_TRINAMIC_CONFIG + + /** + * Linear Advance + */ + #if ENABLED(LIN_ADVANCE) + CONFIG_ECHO_HEADING("Linear Advance:"); + #if EXTRUDERS < 2 + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M900 K", planner.extruder_advance_K[0]); + #else + LOOP_L_N(i, EXTRUDERS) { + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR(" M900 T", int(i), " K", planner.extruder_advance_K[i]); + } + #endif + #endif + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + CONFIG_ECHO_HEADING("Stepper motor currents:"); + CONFIG_ECHO_START(); + #if HAS_MOTOR_CURRENT_PWM + SERIAL_ECHOLNPAIR_P( + PSTR(" M907 X"), stepper.motor_current_setting[0] + , SP_Z_STR, stepper.motor_current_setting[1] + , SP_E_STR, stepper.motor_current_setting[2] + ); + #elif HAS_MOTOR_CURRENT_SPI + SERIAL_ECHOPGM(" M907"); + LOOP_L_N(q, MOTOR_CURRENT_COUNT) { + SERIAL_CHAR(' '); + SERIAL_CHAR(axis_codes[q]); + SERIAL_ECHO(stepper.motor_current_setting[q]); + } + #endif + #endif + + /** + * Advanced Pause filament load & unload lengths + */ + #if ENABLED(ADVANCED_PAUSE_FEATURE) + CONFIG_ECHO_HEADING("Filament load/unload lengths:"); + #if EXTRUDERS == 1 + say_M603(forReplay); + SERIAL_ECHOLNPAIR("L", LINEAR_UNIT(fc_settings[0].load_length), " U", LINEAR_UNIT(fc_settings[0].unload_length)); + #else + #define _ECHO_603(N) do{ say_M603(forReplay); SERIAL_ECHOLNPAIR("T" STRINGIFY(N) " L", LINEAR_UNIT(fc_settings[N].load_length), " U", LINEAR_UNIT(fc_settings[N].unload_length)); }while(0); + REPEAT(EXTRUDERS, _ECHO_603) + #endif + #endif + + #if HAS_MULTI_EXTRUDER + CONFIG_ECHO_HEADING("Tool-changing:"); + CONFIG_ECHO_START(); + M217_report(true); + #endif + + #if ENABLED(BACKLASH_GCODE) + CONFIG_ECHO_HEADING("Backlash compensation:"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR_P( + PSTR(" M425 F"), backlash.get_correction() + , SP_X_STR, LINEAR_UNIT(backlash.distance_mm.x) + , SP_Y_STR, LINEAR_UNIT(backlash.distance_mm.y) + , SP_Z_STR, LINEAR_UNIT(backlash.distance_mm.z) + #ifdef BACKLASH_SMOOTHING_MM + , PSTR(" S"), LINEAR_UNIT(backlash.smoothing_mm) + #endif + ); + #endif + + #if HAS_FILAMENT_SENSOR + CONFIG_ECHO_HEADING("Filament runout sensor:"); + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR( + " M412 S", int(runout.enabled) + #if HAS_FILAMENT_RUNOUT_DISTANCE + , " D", LINEAR_UNIT(runout.runout_distance()) + #endif + ); + #endif + } + +#endif // !DISABLE_M503 + +#pragma pack(pop) diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h new file mode 100644 index 00000000..b213de93 --- /dev/null +++ b/Marlin/src/module/settings.h @@ -0,0 +1,111 @@ +/** + * 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 + +// +// settings.cpp - Settings and EEPROM storage +// + +#include "../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) + #include "../HAL/shared/eeprom_api.h" +#endif + +class MarlinSettings { + public: + static uint16_t datasize(); + + static void reset(); + static bool save(); // Return 'true' if data was saved + + FORCE_INLINE static bool init_eeprom() { + reset(); + #if ENABLED(EEPROM_SETTINGS) + const bool success = save(); + if (TERN0(EEPROM_CHITCHAT, success)) report(); + return success; + #else + return true; + #endif + } + + #if ENABLED(SD_FIRMWARE_UPDATE) + static bool sd_update_status(); // True if the SD-Firmware-Update EEPROM flag is set + static bool set_sd_update_status(const bool enable); // Return 'true' after EEPROM is set (-> always true) + #endif + + #if ENABLED(EEPROM_SETTINGS) + + static bool load(); // Return 'true' if data was loaded ok + static bool validate(); // Return 'true' if EEPROM data is ok + + static inline void first_load() { + static bool loaded = false; + if (!loaded && load()) loaded = true; + } + + #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system + // That can store is enabled + static uint16_t meshes_start_index(); + FORCE_INLINE static uint16_t meshes_end_index() { return meshes_end; } + static uint16_t calc_num_meshes(); + static int mesh_slot_offset(const int8_t slot); + static void store_mesh(const int8_t slot); + static void load_mesh(const int8_t slot, void * const into=nullptr); + + //static void delete_mesh(); // necessary if we have a MAT + //static void defrag_meshes(); // " + #endif + #else + FORCE_INLINE + static bool load() { reset(); report(); return true; } + FORCE_INLINE + static void first_load() { (void)load(); } + #endif + + #if DISABLED(DISABLE_M503) + static void report(const bool forReplay=false); + #else + FORCE_INLINE + static void report(const bool=false) {} + #endif + + private: + static void postprocess(); + + #if ENABLED(EEPROM_SETTINGS) + + static bool eeprom_error, validating; + + #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system + // That can store is enabled + static const uint16_t meshes_end; // 128 is a placeholder for the size of the MAT; the MAT will always + // live at the very end of the eeprom + #endif + + static bool _load(); + static bool size_error(const uint16_t size); + #endif +}; + +extern MarlinSettings settings; diff --git a/Marlin/src/module/speed_lookuptable.h b/Marlin/src/module/speed_lookuptable.h new file mode 100644 index 00000000..b173ebec --- /dev/null +++ b/Marlin/src/module/speed_lookuptable.h @@ -0,0 +1,168 @@ +/** + * 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 + +#if F_CPU == 16000000 + + const uint16_t speed_lookuptable_fast[256][2] PROGMEM = { + { 62500, 55556}, { 6944, 3268}, { 3676, 1176}, { 2500, 607}, { 1893, 369}, { 1524, 249}, { 1275, 179}, { 1096, 135}, + { 961, 105}, { 856, 85}, { 771, 69}, { 702, 58}, { 644, 49}, { 595, 42}, { 553, 37}, { 516, 32}, + { 484, 28}, { 456, 25}, { 431, 23}, { 408, 20}, { 388, 19}, { 369, 16}, { 353, 16}, { 337, 14}, + { 323, 13}, { 310, 11}, { 299, 11}, { 288, 11}, { 277, 9}, { 268, 9}, { 259, 8}, { 251, 8}, + { 243, 8}, { 235, 7}, { 228, 6}, { 222, 6}, { 216, 6}, { 210, 6}, { 204, 5}, { 199, 5}, + { 194, 5}, { 189, 4}, { 185, 4}, { 181, 4}, { 177, 4}, { 173, 4}, { 169, 4}, { 165, 3}, + { 162, 3}, { 159, 4}, { 155, 3}, { 152, 3}, { 149, 2}, { 147, 3}, { 144, 3}, { 141, 2}, + { 139, 3}, { 136, 2}, { 134, 2}, { 132, 3}, { 129, 2}, { 127, 2}, { 125, 2}, { 123, 2}, + { 121, 2}, { 119, 1}, { 118, 2}, { 116, 2}, { 114, 1}, { 113, 2}, { 111, 2}, { 109, 1}, + { 108, 2}, { 106, 1}, { 105, 2}, { 103, 1}, { 102, 1}, { 101, 1}, { 100, 2}, { 98, 1}, + { 97, 1}, { 96, 1}, { 95, 2}, { 93, 1}, { 92, 1}, { 91, 1}, { 90, 1}, { 89, 1}, + { 88, 1}, { 87, 1}, { 86, 1}, { 85, 1}, { 84, 1}, { 83, 0}, { 83, 1}, { 82, 1}, + { 81, 1}, { 80, 1}, { 79, 1}, { 78, 0}, { 78, 1}, { 77, 1}, { 76, 1}, { 75, 0}, + { 75, 1}, { 74, 1}, { 73, 1}, { 72, 0}, { 72, 1}, { 71, 1}, { 70, 0}, { 70, 1}, + { 69, 0}, { 69, 1}, { 68, 1}, { 67, 0}, { 67, 1}, { 66, 0}, { 66, 1}, { 65, 0}, + { 65, 1}, { 64, 1}, { 63, 0}, { 63, 1}, { 62, 0}, { 62, 1}, { 61, 0}, { 61, 1}, + { 60, 0}, { 60, 0}, { 60, 1}, { 59, 0}, { 59, 1}, { 58, 0}, { 58, 1}, { 57, 0}, + { 57, 1}, { 56, 0}, { 56, 0}, { 56, 1}, { 55, 0}, { 55, 1}, { 54, 0}, { 54, 0}, + { 54, 1}, { 53, 0}, { 53, 0}, { 53, 1}, { 52, 0}, { 52, 0}, { 52, 1}, { 51, 0}, + { 51, 0}, { 51, 1}, { 50, 0}, { 50, 0}, { 50, 1}, { 49, 0}, { 49, 0}, { 49, 1}, + { 48, 0}, { 48, 0}, { 48, 1}, { 47, 0}, { 47, 0}, { 47, 0}, { 47, 1}, { 46, 0}, + { 46, 0}, { 46, 1}, { 45, 0}, { 45, 0}, { 45, 0}, { 45, 1}, { 44, 0}, { 44, 0}, + { 44, 0}, { 44, 1}, { 43, 0}, { 43, 0}, { 43, 0}, { 43, 1}, { 42, 0}, { 42, 0}, + { 42, 0}, { 42, 1}, { 41, 0}, { 41, 0}, { 41, 0}, { 41, 0}, { 41, 1}, { 40, 0}, + { 40, 0}, { 40, 0}, { 40, 0}, { 40, 1}, { 39, 0}, { 39, 0}, { 39, 0}, { 39, 0}, + { 39, 1}, { 38, 0}, { 38, 0}, { 38, 0}, { 38, 0}, { 38, 1}, { 37, 0}, { 37, 0}, + { 37, 0}, { 37, 0}, { 37, 0}, { 37, 1}, { 36, 0}, { 36, 0}, { 36, 0}, { 36, 0}, + { 36, 1}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 1}, + { 34, 0}, { 34, 0}, { 34, 0}, { 34, 0}, { 34, 0}, { 34, 1}, { 33, 0}, { 33, 0}, + { 33, 0}, { 33, 0}, { 33, 0}, { 33, 0}, { 33, 1}, { 32, 0}, { 32, 0}, { 32, 0}, + { 32, 0}, { 32, 0}, { 32, 0}, { 32, 0}, { 32, 1}, { 31, 0}, { 31, 0}, { 31, 0}, + { 31, 0}, { 31, 0}, { 31, 0}, { 31, 1}, { 30, 0}, { 30, 0}, { 30, 0}, { 30, 0} + }; + + const uint16_t speed_lookuptable_slow[256][2] PROGMEM = { + { 62500, 12500}, { 50000, 8334}, { 41666, 5952}, { 35714, 4464}, { 31250, 3473}, { 27777, 2777}, { 25000, 2273}, { 22727, 1894}, + { 20833, 1603}, { 19230, 1373}, { 17857, 1191}, { 16666, 1041}, { 15625, 920}, { 14705, 817}, { 13888, 731}, { 13157, 657}, + { 12500, 596}, { 11904, 541}, { 11363, 494}, { 10869, 453}, { 10416, 416}, { 10000, 385}, { 9615, 356}, { 9259, 331}, + { 8928, 308}, { 8620, 287}, { 8333, 269}, { 8064, 252}, { 7812, 237}, { 7575, 223}, { 7352, 210}, { 7142, 198}, + { 6944, 188}, { 6756, 178}, { 6578, 168}, { 6410, 160}, { 6250, 153}, { 6097, 145}, { 5952, 139}, { 5813, 132}, + { 5681, 126}, { 5555, 121}, { 5434, 115}, { 5319, 111}, { 5208, 106}, { 5102, 102}, { 5000, 99}, { 4901, 94}, + { 4807, 91}, { 4716, 87}, { 4629, 84}, { 4545, 81}, { 4464, 79}, { 4385, 75}, { 4310, 73}, { 4237, 71}, + { 4166, 68}, { 4098, 66}, { 4032, 64}, { 3968, 62}, { 3906, 60}, { 3846, 59}, { 3787, 56}, { 3731, 55}, + { 3676, 53}, { 3623, 52}, { 3571, 50}, { 3521, 49}, { 3472, 48}, { 3424, 46}, { 3378, 45}, { 3333, 44}, + { 3289, 43}, { 3246, 41}, { 3205, 41}, { 3164, 39}, { 3125, 39}, { 3086, 38}, { 3048, 36}, { 3012, 36}, + { 2976, 35}, { 2941, 35}, { 2906, 33}, { 2873, 33}, { 2840, 32}, { 2808, 31}, { 2777, 30}, { 2747, 30}, + { 2717, 29}, { 2688, 29}, { 2659, 28}, { 2631, 27}, { 2604, 27}, { 2577, 26}, { 2551, 26}, { 2525, 25}, + { 2500, 25}, { 2475, 25}, { 2450, 23}, { 2427, 24}, { 2403, 23}, { 2380, 22}, { 2358, 22}, { 2336, 22}, + { 2314, 21}, { 2293, 21}, { 2272, 20}, { 2252, 20}, { 2232, 20}, { 2212, 20}, { 2192, 19}, { 2173, 18}, + { 2155, 19}, { 2136, 18}, { 2118, 18}, { 2100, 17}, { 2083, 17}, { 2066, 17}, { 2049, 17}, { 2032, 16}, + { 2016, 16}, { 2000, 16}, { 1984, 16}, { 1968, 15}, { 1953, 16}, { 1937, 14}, { 1923, 15}, { 1908, 15}, + { 1893, 14}, { 1879, 14}, { 1865, 14}, { 1851, 13}, { 1838, 14}, { 1824, 13}, { 1811, 13}, { 1798, 13}, + { 1785, 12}, { 1773, 13}, { 1760, 12}, { 1748, 12}, { 1736, 12}, { 1724, 12}, { 1712, 12}, { 1700, 11}, + { 1689, 12}, { 1677, 11}, { 1666, 11}, { 1655, 11}, { 1644, 11}, { 1633, 10}, { 1623, 11}, { 1612, 10}, + { 1602, 10}, { 1592, 10}, { 1582, 10}, { 1572, 10}, { 1562, 10}, { 1552, 9}, { 1543, 10}, { 1533, 9}, + { 1524, 9}, { 1515, 9}, { 1506, 9}, { 1497, 9}, { 1488, 9}, { 1479, 9}, { 1470, 9}, { 1461, 8}, + { 1453, 8}, { 1445, 9}, { 1436, 8}, { 1428, 8}, { 1420, 8}, { 1412, 8}, { 1404, 8}, { 1396, 8}, + { 1388, 7}, { 1381, 8}, { 1373, 7}, { 1366, 8}, { 1358, 7}, { 1351, 7}, { 1344, 8}, { 1336, 7}, + { 1329, 7}, { 1322, 7}, { 1315, 7}, { 1308, 6}, { 1302, 7}, { 1295, 7}, { 1288, 6}, { 1282, 7}, + { 1275, 6}, { 1269, 7}, { 1262, 6}, { 1256, 6}, { 1250, 7}, { 1243, 6}, { 1237, 6}, { 1231, 6}, + { 1225, 6}, { 1219, 6}, { 1213, 6}, { 1207, 6}, { 1201, 5}, { 1196, 6}, { 1190, 6}, { 1184, 5}, + { 1179, 6}, { 1173, 5}, { 1168, 6}, { 1162, 5}, { 1157, 5}, { 1152, 6}, { 1146, 5}, { 1141, 5}, + { 1136, 5}, { 1131, 5}, { 1126, 5}, { 1121, 5}, { 1116, 5}, { 1111, 5}, { 1106, 5}, { 1101, 5}, + { 1096, 5}, { 1091, 5}, { 1086, 4}, { 1082, 5}, { 1077, 5}, { 1072, 4}, { 1068, 5}, { 1063, 4}, + { 1059, 5}, { 1054, 4}, { 1050, 4}, { 1046, 5}, { 1041, 4}, { 1037, 4}, { 1033, 5}, { 1028, 4}, + { 1024, 4}, { 1020, 4}, { 1016, 4}, { 1012, 4}, { 1008, 4}, { 1004, 4}, { 1000, 4}, { 996, 4}, + { 992, 4}, { 988, 4}, { 984, 4}, { 980, 4}, { 976, 4}, { 972, 4}, { 968, 3}, { 965, 3} + }; + +#elif F_CPU == 20000000 + + const uint16_t speed_lookuptable_fast[256][2] PROGMEM = { + {62500, 54055}, {8445, 3917}, {4528, 1434}, {3094, 745}, {2349, 456}, {1893, 307}, {1586, 222}, {1364, 167}, + {1197, 131}, {1066, 105}, {961, 86}, {875, 72}, {803, 61}, {742, 53}, {689, 45}, {644, 40}, + {604, 35}, {569, 32}, {537, 28}, {509, 25}, {484, 23}, {461, 21}, {440, 19}, {421, 17}, + {404, 16}, {388, 15}, {373, 14}, {359, 13}, {346, 12}, {334, 11}, {323, 10}, {313, 10}, + {303, 9}, {294, 9}, {285, 8}, {277, 7}, {270, 8}, {262, 7}, {255, 6}, {249, 6}, + {243, 6}, {237, 6}, {231, 5}, {226, 5}, {221, 5}, {216, 5}, {211, 4}, {207, 5}, + {202, 4}, {198, 4}, {194, 4}, {190, 3}, {187, 4}, {183, 3}, {180, 3}, {177, 4}, + {173, 3}, {170, 3}, {167, 2}, {165, 3}, {162, 3}, {159, 2}, {157, 3}, {154, 2}, + {152, 3}, {149, 2}, {147, 2}, {145, 2}, {143, 2}, {141, 2}, {139, 2}, {137, 2}, + {135, 2}, {133, 2}, {131, 2}, {129, 1}, {128, 2}, {126, 2}, {124, 1}, {123, 2}, + {121, 1}, {120, 2}, {118, 1}, {117, 1}, {116, 2}, {114, 1}, {113, 1}, {112, 2}, + {110, 1}, {109, 1}, {108, 1}, {107, 2}, {105, 1}, {104, 1}, {103, 1}, {102, 1}, + {101, 1}, {100, 1}, {99, 1}, {98, 1}, {97, 1}, {96, 1}, {95, 1}, {94, 1}, + {93, 1}, {92, 1}, {91, 0}, {91, 1}, {90, 1}, {89, 1}, {88, 1}, {87, 0}, + {87, 1}, {86, 1}, {85, 1}, {84, 0}, {84, 1}, {83, 1}, {82, 1}, {81, 0}, + {81, 1}, {80, 1}, {79, 0}, {79, 1}, {78, 0}, {78, 1}, {77, 1}, {76, 0}, + {76, 1}, {75, 0}, {75, 1}, {74, 1}, {73, 0}, {73, 1}, {72, 0}, {72, 1}, + {71, 0}, {71, 1}, {70, 0}, {70, 1}, {69, 0}, {69, 1}, {68, 0}, {68, 1}, + {67, 0}, {67, 1}, {66, 0}, {66, 1}, {65, 0}, {65, 0}, {65, 1}, {64, 0}, + {64, 1}, {63, 0}, {63, 1}, {62, 0}, {62, 0}, {62, 1}, {61, 0}, {61, 1}, + {60, 0}, {60, 0}, {60, 1}, {59, 0}, {59, 0}, {59, 1}, {58, 0}, {58, 0}, + {58, 1}, {57, 0}, {57, 0}, {57, 1}, {56, 0}, {56, 0}, {56, 1}, {55, 0}, + {55, 0}, {55, 1}, {54, 0}, {54, 0}, {54, 1}, {53, 0}, {53, 0}, {53, 0}, + {53, 1}, {52, 0}, {52, 0}, {52, 1}, {51, 0}, {51, 0}, {51, 0}, {51, 1}, + {50, 0}, {50, 0}, {50, 0}, {50, 1}, {49, 0}, {49, 0}, {49, 0}, {49, 1}, + {48, 0}, {48, 0}, {48, 0}, {48, 1}, {47, 0}, {47, 0}, {47, 0}, {47, 1}, + {46, 0}, {46, 0}, {46, 0}, {46, 0}, {46, 1}, {45, 0}, {45, 0}, {45, 0}, + {45, 1}, {44, 0}, {44, 0}, {44, 0}, {44, 0}, {44, 1}, {43, 0}, {43, 0}, + {43, 0}, {43, 0}, {43, 1}, {42, 0}, {42, 0}, {42, 0}, {42, 0}, {42, 0}, + {42, 1}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 1}, {40, 0}, + {40, 0}, {40, 0}, {40, 0}, {40, 1}, {39, 0}, {39, 0}, {39, 0}, {39, 0}, + {39, 0}, {39, 0}, {39, 1}, {38, 0}, {38, 0}, {38, 0}, {38, 0}, {38, 0}, + }; + + const uint16_t speed_lookuptable_slow[256][2] PROGMEM = { + {62500, 10417}, {52083, 7441}, {44642, 5580}, {39062, 4340}, {34722, 3472}, {31250, 2841}, {28409, 2368}, {26041, 2003}, + {24038, 1717}, {22321, 1488}, {20833, 1302}, {19531, 1149}, {18382, 1021}, {17361, 914}, {16447, 822}, {15625, 745}, + {14880, 676}, {14204, 618}, {13586, 566}, {13020, 520}, {12500, 481}, {12019, 445}, {11574, 414}, {11160, 385}, + {10775, 359}, {10416, 336}, {10080, 315}, {9765, 296}, {9469, 278}, {9191, 263}, {8928, 248}, {8680, 235}, + {8445, 222}, {8223, 211}, {8012, 200}, {7812, 191}, {7621, 181}, {7440, 173}, {7267, 165}, {7102, 158}, + {6944, 151}, {6793, 145}, {6648, 138}, {6510, 133}, {6377, 127}, {6250, 123}, {6127, 118}, {6009, 113}, + {5896, 109}, {5787, 106}, {5681, 101}, {5580, 98}, {5482, 95}, {5387, 91}, {5296, 88}, {5208, 86}, + {5122, 82}, {5040, 80}, {4960, 78}, {4882, 75}, {4807, 73}, {4734, 70}, {4664, 69}, {4595, 67}, + {4528, 64}, {4464, 63}, {4401, 61}, {4340, 60}, {4280, 58}, {4222, 56}, {4166, 55}, {4111, 53}, + {4058, 52}, {4006, 51}, {3955, 49}, {3906, 48}, {3858, 48}, {3810, 45}, {3765, 45}, {3720, 44}, + {3676, 43}, {3633, 42}, {3591, 40}, {3551, 40}, {3511, 39}, {3472, 38}, {3434, 38}, {3396, 36}, + {3360, 36}, {3324, 35}, {3289, 34}, {3255, 34}, {3221, 33}, {3188, 32}, {3156, 31}, {3125, 31}, + {3094, 31}, {3063, 30}, {3033, 29}, {3004, 28}, {2976, 28}, {2948, 28}, {2920, 27}, {2893, 27}, + {2866, 26}, {2840, 25}, {2815, 25}, {2790, 25}, {2765, 24}, {2741, 24}, {2717, 24}, {2693, 23}, + {2670, 22}, {2648, 22}, {2626, 22}, {2604, 22}, {2582, 21}, {2561, 21}, {2540, 20}, {2520, 20}, + {2500, 20}, {2480, 20}, {2460, 19}, {2441, 19}, {2422, 19}, {2403, 18}, {2385, 18}, {2367, 18}, + {2349, 17}, {2332, 18}, {2314, 17}, {2297, 16}, {2281, 17}, {2264, 16}, {2248, 16}, {2232, 16}, + {2216, 16}, {2200, 15}, {2185, 15}, {2170, 15}, {2155, 15}, {2140, 15}, {2125, 14}, {2111, 14}, + {2097, 14}, {2083, 14}, {2069, 14}, {2055, 13}, {2042, 13}, {2029, 13}, {2016, 13}, {2003, 13}, + {1990, 13}, {1977, 12}, {1965, 12}, {1953, 13}, {1940, 11}, {1929, 12}, {1917, 12}, {1905, 12}, + {1893, 11}, {1882, 11}, {1871, 11}, {1860, 11}, {1849, 11}, {1838, 11}, {1827, 11}, {1816, 10}, + {1806, 11}, {1795, 10}, {1785, 10}, {1775, 10}, {1765, 10}, {1755, 10}, {1745, 9}, {1736, 10}, + {1726, 9}, {1717, 10}, {1707, 9}, {1698, 9}, {1689, 9}, {1680, 9}, {1671, 9}, {1662, 9}, + {1653, 9}, {1644, 8}, {1636, 9}, {1627, 8}, {1619, 9}, {1610, 8}, {1602, 8}, {1594, 8}, + {1586, 8}, {1578, 8}, {1570, 8}, {1562, 8}, {1554, 7}, {1547, 8}, {1539, 8}, {1531, 7}, + {1524, 8}, {1516, 7}, {1509, 7}, {1502, 7}, {1495, 7}, {1488, 7}, {1481, 7}, {1474, 7}, + {1467, 7}, {1460, 7}, {1453, 7}, {1446, 6}, {1440, 7}, {1433, 7}, {1426, 6}, {1420, 6}, + {1414, 7}, {1407, 6}, {1401, 6}, {1395, 7}, {1388, 6}, {1382, 6}, {1376, 6}, {1370, 6}, + {1364, 6}, {1358, 6}, {1352, 6}, {1346, 5}, {1341, 6}, {1335, 6}, {1329, 5}, {1324, 6}, + {1318, 5}, {1313, 6}, {1307, 5}, {1302, 6}, {1296, 5}, {1291, 5}, {1286, 6}, {1280, 5}, + {1275, 5}, {1270, 5}, {1265, 5}, {1260, 5}, {1255, 5}, {1250, 5}, {1245, 5}, {1240, 5}, + {1235, 5}, {1230, 5}, {1225, 5}, {1220, 5}, {1215, 4}, {1211, 5}, {1206, 5}, {1201, 5}, + }; + +#endif diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp new file mode 100644 index 00000000..6d451f8f --- /dev/null +++ b/Marlin/src/module/stepper.cpp @@ -0,0 +1,3491 @@ +/** + * 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 . + * + */ + +/** + * stepper.cpp - A singleton object to execute motion plans using stepper motors + * Marlin Firmware + * + * Derived from Grbl + * Copyright (c) 2009-2011 Simen Svale Skogsrud + * + * Grbl 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. + * + * Grbl 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 Grbl. If not, see . + */ + +/** + * Timer calculations informed by the 'RepRap cartesian firmware' by Zack Smith + * and Philipp Tiefenbacher. + */ + +/** + * __________________________ + * /| |\ _________________ ^ + * / | | \ /| |\ | + * / | | \ / | | \ s + * / | | | | | \ p + * / | | | | | \ e + * +-----+------------------------+---+--+---------------+----+ e + * | BLOCK 1 | BLOCK 2 | d + * + * time -----> + * + * The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates + * first block->accelerate_until step_events_completed, then keeps going at constant speed until + * step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. + * The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far. + */ + +/** + * Marlin uses the Bresenham algorithm. For a detailed explanation of theory and + * method see https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html + */ + +/** + * Jerk controlled movements planner added Apr 2018 by Eduardo José Tagle. + * Equations based on Synthethos TinyG2 sources, but the fixed-point + * implementation is new, as we are running the ISR with a variable period. + * Also implemented the Bézier velocity curve evaluation in ARM assembler, + * to avoid impacting ISR speed. + */ + +#include "stepper.h" + +Stepper stepper; // Singleton + +#define BABYSTEPPING_EXTRA_DIR_WAIT + +#ifdef __AVR__ + #include "speed_lookuptable.h" +#endif + +#include "endstops.h" +#include "planner.h" +#include "motion.h" + +#include "temperature.h" +#include "../lcd/ultralcd.h" +#include "../gcode/queue.h" +#include "../sd/cardreader.h" +#include "../MarlinCore.h" +#include "../HAL/shared/Delay.h" + +#if ENABLED(INTEGRATED_BABYSTEPPING) + #include "../feature/babystep.h" +#endif + +#if MB(ALLIGATOR) + #include "../feature/dac/dac_dac084s085.h" +#endif + +#if HAS_MOTOR_CURRENT_SPI + #include +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" +#endif + +#if HAS_FILAMENT_RUNOUT_DISTANCE + #include "../feature/runout.h" +#endif + +#if HAS_L64XX + #include "../libs/L64XX/L64XX_Marlin.h" + uint8_t L6470_buf[MAX_L64XX + 1]; // chip command sequence - element 0 not used + bool L64XX_OK_to_power_up = false; // flag to keep L64xx steppers powered down after a reset or power up +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/powerloss.h" +#endif + +#if HAS_CUTTER + #include "../feature/spindle_laser.h" +#endif + +// public: + +#if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + bool Stepper::separate_multi_axis = false; +#endif + +#if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + bool Stepper::initialized; // = false + uint32_t Stepper::motor_current_setting[MOTOR_CURRENT_COUNT]; // Initialized by settings.load() + #if HAS_MOTOR_CURRENT_SPI + constexpr uint32_t Stepper::digipot_count[]; + #endif +#endif + +// private: + +block_t* Stepper::current_block; // (= nullptr) A pointer to the block currently being traced + +uint8_t Stepper::last_direction_bits, // = 0 + Stepper::axis_did_move; // = 0 + +bool Stepper::abort_current_block; + +#if DISABLED(MIXING_EXTRUDER) && HAS_MULTI_EXTRUDER + uint8_t Stepper::last_moved_extruder = 0xFF; +#endif + +#if ENABLED(X_DUAL_ENDSTOPS) + bool Stepper::locked_X_motor = false, Stepper::locked_X2_motor = false; +#endif +#if ENABLED(Y_DUAL_ENDSTOPS) + bool Stepper::locked_Y_motor = false, Stepper::locked_Y2_motor = false; +#endif + +#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 + ; +#endif + +uint32_t Stepper::acceleration_time, Stepper::deceleration_time; +uint8_t Stepper::steps_per_isr; + +TERN(ADAPTIVE_STEP_SMOOTHING,,constexpr) uint8_t Stepper::oversampling_factor; + +xyze_long_t Stepper::delta_error{0}; + +xyze_ulong_t Stepper::advance_dividend{0}; +uint32_t Stepper::advance_divisor = 0, + Stepper::step_events_completed = 0, // The number of step events executed in the current block + Stepper::accelerate_until, // The count at which to stop accelerating + Stepper::decelerate_after, // The count at which to start decelerating + Stepper::step_event_count; // The total event count for the current block + +#if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) + uint8_t Stepper::stepper_extruder; +#else + constexpr uint8_t Stepper::stepper_extruder; +#endif + +#if ENABLED(S_CURVE_ACCELERATION) + int32_t __attribute__((used)) Stepper::bezier_A __asm__("bezier_A"); // A coefficient in Bézier speed curve with alias for assembler + int32_t __attribute__((used)) Stepper::bezier_B __asm__("bezier_B"); // B coefficient in Bézier speed curve with alias for assembler + int32_t __attribute__((used)) Stepper::bezier_C __asm__("bezier_C"); // C coefficient in Bézier speed curve with alias for assembler + uint32_t __attribute__((used)) Stepper::bezier_F __asm__("bezier_F"); // F coefficient in Bézier speed curve with alias for assembler + uint32_t __attribute__((used)) Stepper::bezier_AV __asm__("bezier_AV"); // AV coefficient in Bézier speed curve with alias for assembler + #ifdef __AVR__ + bool __attribute__((used)) Stepper::A_negative __asm__("A_negative"); // If A coefficient was negative + #endif + bool Stepper::bezier_2nd_half; // =false If Bézier curve has been initialized or not +#endif + +#if ENABLED(LIN_ADVANCE) + + uint32_t Stepper::nextAdvanceISR = LA_ADV_NEVER, + Stepper::LA_isr_rate = LA_ADV_NEVER; + uint16_t Stepper::LA_current_adv_steps = 0, + Stepper::LA_final_adv_steps, + Stepper::LA_max_adv_steps; + + int8_t Stepper::LA_steps = 0; + + bool Stepper::LA_use_advance_lead; + +#endif // LIN_ADVANCE + +#if ENABLED(INTEGRATED_BABYSTEPPING) + uint32_t Stepper::nextBabystepISR = BABYSTEP_NEVER; +#endif + +#if ENABLED(DIRECT_STEPPING) + page_step_state_t Stepper::page_step_state; +#endif + +int32_t Stepper::ticks_nominal = -1; +#if DISABLED(S_CURVE_ACCELERATION) + uint32_t Stepper::acc_step_rate; // needed for deceleration start point +#endif + +xyz_long_t Stepper::endstops_trigsteps; +xyze_long_t Stepper::count_position{0}; +xyze_int8_t Stepper::count_direction{0}; + +#if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + Stepper::stepper_laser_t Stepper::laser_trap = { + .enabled = false, + .cur_power = 0, + .cruise_set = false, + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + .last_step_count = 0, + .acc_step_count = 0 + #else + .till_update = 0 + #endif + }; +#endif + +#define DUAL_ENDSTOP_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + } + +#define DUAL_SEPARATE_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (!locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!locked_##A##2_motor) A##2_STEP_WRITE(V); \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + } + +#define TRIPLE_ENDSTOP_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##3_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##3_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + A##3_STEP_WRITE(V); \ + } + +#define TRIPLE_SEPARATE_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (!locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!locked_##A##3_motor) A##3_STEP_WRITE(V); \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + A##3_STEP_WRITE(V); \ + } + +#define QUAD_ENDSTOP_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (A##_HOME_DIR < 0) { \ + if (!(TEST(endstops.state(), A##_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##3_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##4_MIN) && count_direction[_AXIS(A)] < 0) && !locked_##A##4_motor) A##4_STEP_WRITE(V); \ + } \ + else { \ + if (!(TEST(endstops.state(), A##_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##2_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##3_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##3_motor) A##3_STEP_WRITE(V); \ + if (!(TEST(endstops.state(), A##4_MAX) && count_direction[_AXIS(A)] > 0) && !locked_##A##4_motor) A##4_STEP_WRITE(V); \ + } \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + A##3_STEP_WRITE(V); \ + A##4_STEP_WRITE(V); \ + } + +#define QUAD_SEPARATE_APPLY_STEP(A,V) \ + if (separate_multi_axis) { \ + if (!locked_##A##_motor) A##_STEP_WRITE(V); \ + if (!locked_##A##2_motor) A##2_STEP_WRITE(V); \ + if (!locked_##A##3_motor) A##3_STEP_WRITE(V); \ + if (!locked_##A##4_motor) A##4_STEP_WRITE(V); \ + } \ + else { \ + A##_STEP_WRITE(V); \ + A##2_STEP_WRITE(V); \ + A##3_STEP_WRITE(V); \ + A##4_STEP_WRITE(V); \ + } + +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE((v) != INVERT_X2_VS_X_DIR); }while(0) + #if ENABLED(X_DUAL_ENDSTOPS) + #define X_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(X,v) + #else + #define X_APPLY_STEP(v,Q) do{ X_STEP_WRITE(v); X2_STEP_WRITE(v); }while(0) + #endif +#elif ENABLED(DUAL_X_CARRIAGE) + #define X_APPLY_DIR(v,ALWAYS) do{ \ + if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(v); X2_DIR_WRITE(mirrored_duplication_mode ? !(v) : v); } \ + else if (last_moved_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ + }while(0) + #define X_APPLY_STEP(v,ALWAYS) do{ \ + if (extruder_duplication_enabled || ALWAYS) { X_STEP_WRITE(v); X2_STEP_WRITE(v); } \ + else if (last_moved_extruder) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ + }while(0) +#else + #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) + #define X_APPLY_STEP(v,Q) X_STEP_WRITE(v) +#endif + +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #define Y_APPLY_DIR(v,Q) do{ Y_DIR_WRITE(v); Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR); }while(0) + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Y,v) + #else + #define Y_APPLY_STEP(v,Q) do{ Y_STEP_WRITE(v); Y2_STEP_WRITE(v); }while(0) + #endif +#else + #define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v) + #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) +#endif + +#if NUM_Z_STEPPER_DRIVERS == 4 + #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); Z4_DIR_WRITE(v); }while(0) + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z_APPLY_STEP(v,Q) QUAD_ENDSTOP_APPLY_STEP(Z,v) + #elif ENABLED(Z_STEPPER_AUTO_ALIGN) + #define Z_APPLY_STEP(v,Q) QUAD_SEPARATE_APPLY_STEP(Z,v) + #else + #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); Z4_STEP_WRITE(v); }while(0) + #endif +#elif NUM_Z_STEPPER_DRIVERS == 3 + #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); }while(0) + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z_APPLY_STEP(v,Q) TRIPLE_ENDSTOP_APPLY_STEP(Z,v) + #elif ENABLED(Z_STEPPER_AUTO_ALIGN) + #define Z_APPLY_STEP(v,Q) TRIPLE_SEPARATE_APPLY_STEP(Z,v) + #else + #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }while(0) + #endif +#elif NUM_Z_STEPPER_DRIVERS == 2 + #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }while(0) + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) + #elif ENABLED(Z_STEPPER_AUTO_ALIGN) + #define Z_APPLY_STEP(v,Q) DUAL_SEPARATE_APPLY_STEP(Z,v) + #else + #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }while(0) + #endif +#else + #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v) + #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v) +#endif + +#if DISABLED(MIXING_EXTRUDER) + #define E_APPLY_STEP(v,Q) E_STEP_WRITE(stepper_extruder, v) +#endif + +#define CYCLES_TO_NS(CYC) (1000UL * (CYC) / ((F_CPU) / 1000000)) +#define NS_PER_PULSE_TIMER_TICK (1000000000UL / (STEPPER_TIMER_RATE)) + +// Round up when converting from ns to timer ticks +#define NS_TO_PULSE_TIMER_TICKS(NS) (((NS) + (NS_PER_PULSE_TIMER_TICK) / 2) / (NS_PER_PULSE_TIMER_TICK)) + +#define TIMER_SETUP_NS (CYCLES_TO_NS(TIMER_READ_ADD_AND_STORE_CYCLES)) + +#define PULSE_HIGH_TICK_COUNT hal_timer_t(NS_TO_PULSE_TIMER_TICKS(_MIN_PULSE_HIGH_NS - _MIN(_MIN_PULSE_HIGH_NS, TIMER_SETUP_NS))) +#define PULSE_LOW_TICK_COUNT hal_timer_t(NS_TO_PULSE_TIMER_TICKS(_MIN_PULSE_LOW_NS - _MIN(_MIN_PULSE_LOW_NS, TIMER_SETUP_NS))) + +#define USING_TIMED_PULSE() hal_timer_t start_pulse_count = 0 +#define START_TIMED_PULSE(DIR) (start_pulse_count = HAL_timer_get_count(PULSE_TIMER_NUM)) +#define AWAIT_TIMED_PULSE(DIR) while (PULSE_##DIR##_TICK_COUNT > HAL_timer_get_count(PULSE_TIMER_NUM) - start_pulse_count) { } +#define START_HIGH_PULSE() START_TIMED_PULSE(HIGH) +#define AWAIT_HIGH_PULSE() AWAIT_TIMED_PULSE(HIGH) +#define START_LOW_PULSE() START_TIMED_PULSE(LOW) +#define AWAIT_LOW_PULSE() AWAIT_TIMED_PULSE(LOW) + +#if MINIMUM_STEPPER_PRE_DIR_DELAY > 0 + #define DIR_WAIT_BEFORE() DELAY_NS(MINIMUM_STEPPER_PRE_DIR_DELAY) +#else + #define DIR_WAIT_BEFORE() +#endif + +#if MINIMUM_STEPPER_POST_DIR_DELAY > 0 + #define DIR_WAIT_AFTER() DELAY_NS(MINIMUM_STEPPER_POST_DIR_DELAY) +#else + #define DIR_WAIT_AFTER() +#endif + +/** + * Set the stepper direction of each axis + * + * COREXY: X_AXIS=A_AXIS and Y_AXIS=B_AXIS + * COREXZ: X_AXIS=A_AXIS and Z_AXIS=C_AXIS + * COREYZ: Y_AXIS=B_AXIS and Z_AXIS=C_AXIS + */ +void Stepper::set_directions() { + + DIR_WAIT_BEFORE(); + + #define SET_STEP_DIR(A) \ + if (motor_direction(_AXIS(A))) { \ + A##_APPLY_DIR(INVERT_##A##_DIR, false); \ + count_direction[_AXIS(A)] = -1; \ + } \ + else { \ + A##_APPLY_DIR(!INVERT_##A##_DIR, false); \ + count_direction[_AXIS(A)] = 1; \ + } + + #if HAS_X_DIR + SET_STEP_DIR(X); // A + #endif + #if HAS_Y_DIR + SET_STEP_DIR(Y); // B + #endif + #if HAS_Z_DIR + SET_STEP_DIR(Z); // C + #endif + + #if DISABLED(LIN_ADVANCE) + #if ENABLED(MIXING_EXTRUDER) + // Because this is valid for the whole block we don't know + // what e-steppers will step. Likely all. Set all. + if (motor_direction(E_AXIS)) { + MIXER_STEPPER_LOOP(j) REV_E_DIR(j); + count_direction.e = -1; + } + else { + MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); + count_direction.e = 1; + } + #else + if (motor_direction(E_AXIS)) { + REV_E_DIR(stepper_extruder); + count_direction.e = -1; + } + else { + NORM_E_DIR(stepper_extruder); + count_direction.e = 1; + } + #endif + #endif // !LIN_ADVANCE + + #if HAS_L64XX + if (L64XX_OK_to_power_up) { // OK to send the direction commands (which powers up the L64XX steppers) + if (L64xxManager.spi_active) { + L64xxManager.spi_abort = true; // Interrupted SPI transfer needs to shut down gracefully + for (uint8_t j = 1; j <= L64XX::chain[0]; j++) + L6470_buf[j] = dSPIN_NOP; // Fill buffer with NOOPs + L64xxManager.transfer(L6470_buf, L64XX::chain[0]); // Send enough NOOPs to complete any command + L64xxManager.transfer(L6470_buf, L64XX::chain[0]); + L64xxManager.transfer(L6470_buf, L64XX::chain[0]); + } + + // L64xxManager.dir_commands[] is an array that holds direction command for each stepper + + // Scan command array, copy matches into L64xxManager.transfer + for (uint8_t j = 1; j <= L64XX::chain[0]; j++) + L6470_buf[j] = L64xxManager.dir_commands[L64XX::chain[j]]; + + L64xxManager.transfer(L6470_buf, L64XX::chain[0]); // send the command stream to the drivers + } + #endif + + DIR_WAIT_AFTER(); +} + +#if ENABLED(S_CURVE_ACCELERATION) + /** + * This uses a quintic (fifth-degree) Bézier polynomial for the velocity curve, giving + * a "linear pop" velocity curve; with pop being the sixth derivative of position: + * velocity - 1st, acceleration - 2nd, jerk - 3rd, snap - 4th, crackle - 5th, pop - 6th + * + * The Bézier curve takes the form: + * + * V(t) = P_0 * B_0(t) + P_1 * B_1(t) + P_2 * B_2(t) + P_3 * B_3(t) + P_4 * B_4(t) + P_5 * B_5(t) + * + * Where 0 <= t <= 1, and V(t) is the velocity. P_0 through P_5 are the control points, and B_0(t) + * through B_5(t) are the Bernstein basis as follows: + * + * B_0(t) = (1-t)^5 = -t^5 + 5t^4 - 10t^3 + 10t^2 - 5t + 1 + * B_1(t) = 5(1-t)^4 * t = 5t^5 - 20t^4 + 30t^3 - 20t^2 + 5t + * B_2(t) = 10(1-t)^3 * t^2 = -10t^5 + 30t^4 - 30t^3 + 10t^2 + * B_3(t) = 10(1-t)^2 * t^3 = 10t^5 - 20t^4 + 10t^3 + * B_4(t) = 5(1-t) * t^4 = -5t^5 + 5t^4 + * B_5(t) = t^5 = t^5 + * ^ ^ ^ ^ ^ ^ + * | | | | | | + * A B C D E F + * + * Unfortunately, we cannot use forward-differencing to calculate each position through + * the curve, as Marlin uses variable timer periods. So, we require a formula of the form: + * + * V_f(t) = A*t^5 + B*t^4 + C*t^3 + D*t^2 + E*t + F + * + * Looking at the above B_0(t) through B_5(t) expanded forms, if we take the coefficients of t^5 + * through t of the Bézier form of V(t), we can determine that: + * + * A = -P_0 + 5*P_1 - 10*P_2 + 10*P_3 - 5*P_4 + P_5 + * B = 5*P_0 - 20*P_1 + 30*P_2 - 20*P_3 + 5*P_4 + * C = -10*P_0 + 30*P_1 - 30*P_2 + 10*P_3 + * D = 10*P_0 - 20*P_1 + 10*P_2 + * E = - 5*P_0 + 5*P_1 + * F = P_0 + * + * Now, since we will (currently) *always* want the initial acceleration and jerk values to be 0, + * We set P_i = P_0 = P_1 = P_2 (initial velocity), and P_t = P_3 = P_4 = P_5 (target velocity), + * which, after simplification, resolves to: + * + * A = - 6*P_i + 6*P_t = 6*(P_t - P_i) + * B = 15*P_i - 15*P_t = 15*(P_i - P_t) + * C = -10*P_i + 10*P_t = 10*(P_t - P_i) + * D = 0 + * E = 0 + * F = P_i + * + * As the t is evaluated in non uniform steps here, there is no other way rather than evaluating + * the Bézier curve at each point: + * + * V_f(t) = A*t^5 + B*t^4 + C*t^3 + F [0 <= t <= 1] + * + * Floating point arithmetic execution time cost is prohibitive, so we will transform the math to + * use fixed point values to be able to evaluate it in realtime. Assuming a maximum of 250000 steps + * per second (driver pulses should at least be 2µS hi/2µS lo), and allocating 2 bits to avoid + * overflows on the evaluation of the Bézier curve, means we can use + * + * t: unsigned Q0.32 (0 <= t < 1) |range 0 to 0xFFFFFFFF unsigned + * A: signed Q24.7 , |range = +/- 250000 * 6 * 128 = +/- 192000000 = 0x0B71B000 | 28 bits + sign + * B: signed Q24.7 , |range = +/- 250000 *15 * 128 = +/- 480000000 = 0x1C9C3800 | 29 bits + sign + * C: signed Q24.7 , |range = +/- 250000 *10 * 128 = +/- 320000000 = 0x1312D000 | 29 bits + sign + * F: signed Q24.7 , |range = +/- 250000 * 128 = 32000000 = 0x01E84800 | 25 bits + sign + * + * The trapezoid generator state contains the following information, that we will use to create and evaluate + * the Bézier curve: + * + * blk->step_event_count [TS] = The total count of steps for this movement. (=distance) + * blk->initial_rate [VI] = The initial steps per second (=velocity) + * blk->final_rate [VF] = The ending steps per second (=velocity) + * and the count of events completed (step_events_completed) [CS] (=distance until now) + * + * Note the abbreviations we use in the following formulae are between []s + * + * For Any 32bit CPU: + * + * At the start of each trapezoid, calculate the coefficients A,B,C,F and Advance [AV], as follows: + * + * A = 6*128*(VF - VI) = 768*(VF - VI) + * B = 15*128*(VI - VF) = 1920*(VI - VF) + * C = 10*128*(VF - VI) = 1280*(VF - VI) + * F = 128*VI = 128*VI + * AV = (1<<32)/TS ~= 0xFFFFFFFF / TS (To use ARM UDIV, that is 32 bits) (this is computed at the planner, to offload expensive calculations from the ISR) + * + * And for each point, evaluate the curve with the following sequence: + * + * void lsrs(uint32_t& d, uint32_t s, int cnt) { + * d = s >> cnt; + * } + * void lsls(uint32_t& d, uint32_t s, int cnt) { + * d = s << cnt; + * } + * void lsrs(int32_t& d, uint32_t s, int cnt) { + * d = uint32_t(s) >> cnt; + * } + * void lsls(int32_t& d, uint32_t s, int cnt) { + * d = uint32_t(s) << cnt; + * } + * void umull(uint32_t& rlo, uint32_t& rhi, uint32_t op1, uint32_t op2) { + * uint64_t res = uint64_t(op1) * op2; + * rlo = uint32_t(res & 0xFFFFFFFF); + * rhi = uint32_t((res >> 32) & 0xFFFFFFFF); + * } + * void smlal(int32_t& rlo, int32_t& rhi, int32_t op1, int32_t op2) { + * int64_t mul = int64_t(op1) * op2; + * int64_t s = int64_t(uint32_t(rlo) | ((uint64_t(uint32_t(rhi)) << 32U))); + * mul += s; + * rlo = int32_t(mul & 0xFFFFFFFF); + * rhi = int32_t((mul >> 32) & 0xFFFFFFFF); + * } + * int32_t _eval_bezier_curve_arm(uint32_t curr_step) { + * uint32_t flo = 0; + * uint32_t fhi = bezier_AV * curr_step; + * uint32_t t = fhi; + * int32_t alo = bezier_F; + * int32_t ahi = 0; + * int32_t A = bezier_A; + * int32_t B = bezier_B; + * int32_t C = bezier_C; + * + * lsrs(ahi, alo, 1); // a = F << 31 + * lsls(alo, alo, 31); // + * umull(flo, fhi, fhi, t); // f *= t + * umull(flo, fhi, fhi, t); // f>>=32; f*=t + * lsrs(flo, fhi, 1); // + * smlal(alo, ahi, flo, C); // a+=(f>>33)*C + * umull(flo, fhi, fhi, t); // f>>=32; f*=t + * lsrs(flo, fhi, 1); // + * smlal(alo, ahi, flo, B); // a+=(f>>33)*B + * umull(flo, fhi, fhi, t); // f>>=32; f*=t + * lsrs(flo, fhi, 1); // f>>=33; + * smlal(alo, ahi, flo, A); // a+=(f>>33)*A; + * lsrs(alo, ahi, 6); // a>>=38 + * + * return alo; + * } + * + * This is rewritten in ARM assembly for optimal performance (43 cycles to execute). + * + * For AVR, the precision of coefficients is scaled so the Bézier curve can be evaluated in real-time: + * Let's reduce precision as much as possible. After some experimentation we found that: + * + * Assume t and AV with 24 bits is enough + * A = 6*(VF - VI) + * B = 15*(VI - VF) + * C = 10*(VF - VI) + * F = VI + * AV = (1<<24)/TS (this is computed at the planner, to offload expensive calculations from the ISR) + * + * Instead of storing sign for each coefficient, we will store its absolute value, + * and flag the sign of the A coefficient, so we can save to store the sign bit. + * It always holds that sign(A) = - sign(B) = sign(C) + * + * So, the resulting range of the coefficients are: + * + * t: unsigned (0 <= t < 1) |range 0 to 0xFFFFFF unsigned + * A: signed Q24 , range = 250000 * 6 = 1500000 = 0x16E360 | 21 bits + * B: signed Q24 , range = 250000 *15 = 3750000 = 0x393870 | 22 bits + * C: signed Q24 , range = 250000 *10 = 2500000 = 0x1312D0 | 21 bits + * F: signed Q24 , range = 250000 = 250000 = 0x0ED090 | 20 bits + * + * And for each curve, estimate its coefficients with: + * + * void _calc_bezier_curve_coeffs(int32_t v0, int32_t v1, uint32_t av) { + * // Calculate the Bézier coefficients + * if (v1 < v0) { + * A_negative = true; + * bezier_A = 6 * (v0 - v1); + * bezier_B = 15 * (v0 - v1); + * bezier_C = 10 * (v0 - v1); + * } + * else { + * A_negative = false; + * bezier_A = 6 * (v1 - v0); + * bezier_B = 15 * (v1 - v0); + * bezier_C = 10 * (v1 - v0); + * } + * bezier_F = v0; + * } + * + * And for each point, evaluate the curve with the following sequence: + * + * // unsigned multiplication of 24 bits x 24bits, return upper 16 bits + * void umul24x24to16hi(uint16_t& r, uint24_t op1, uint24_t op2) { + * r = (uint64_t(op1) * op2) >> 8; + * } + * // unsigned multiplication of 16 bits x 16bits, return upper 16 bits + * void umul16x16to16hi(uint16_t& r, uint16_t op1, uint16_t op2) { + * r = (uint32_t(op1) * op2) >> 16; + * } + * // unsigned multiplication of 16 bits x 24bits, return upper 24 bits + * void umul16x24to24hi(uint24_t& r, uint16_t op1, uint24_t op2) { + * r = uint24_t((uint64_t(op1) * op2) >> 16); + * } + * + * int32_t _eval_bezier_curve(uint32_t curr_step) { + * // To save computing, the first step is always the initial speed + * if (!curr_step) + * return bezier_F; + * + * uint16_t t; + * umul24x24to16hi(t, bezier_AV, curr_step); // t: Range 0 - 1^16 = 16 bits + * uint16_t f = t; + * umul16x16to16hi(f, f, t); // Range 16 bits (unsigned) + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^3 (unsigned) + * uint24_t acc = bezier_F; // Range 20 bits (unsigned) + * if (A_negative) { + * uint24_t v; + * umul16x24to24hi(v, f, bezier_C); // Range 21bits + * acc -= v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) + * umul16x24to24hi(v, f, bezier_B); // Range 22bits + * acc += v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) + * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) + * acc -= v; + * } + * else { + * uint24_t v; + * umul16x24to24hi(v, f, bezier_C); // Range 21bits + * acc += v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^4 (unsigned) + * umul16x24to24hi(v, f, bezier_B); // Range 22bits + * acc -= v; + * umul16x16to16hi(f, f, t); // Range 16 bits : f = t^5 (unsigned) + * umul16x24to24hi(v, f, bezier_A); // Range 21bits + 15 = 36bits (plus sign) + * acc += v; + * } + * return acc; + * } + * These functions are translated to assembler for optimal performance. + * Coefficient calculation takes 70 cycles. Bezier point evaluation takes 150 cycles. + */ + + #ifdef __AVR__ + + // For AVR we use assembly to maximize speed + void Stepper::_calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av) { + + // Store advance + bezier_AV = av; + + // Calculate the rest of the coefficients + uint8_t r2 = v0 & 0xFF; + uint8_t r3 = (v0 >> 8) & 0xFF; + uint8_t r12 = (v0 >> 16) & 0xFF; + uint8_t r5 = v1 & 0xFF; + uint8_t r6 = (v1 >> 8) & 0xFF; + uint8_t r7 = (v1 >> 16) & 0xFF; + uint8_t r4,r8,r9,r10,r11; + + __asm__ __volatile__( + /* Calculate the Bézier coefficients */ + /* %10:%1:%0 = v0*/ + /* %5:%4:%3 = v1*/ + /* %7:%6:%10 = temporary*/ + /* %9 = val (must be high register!)*/ + /* %10 (must be high register!)*/ + + /* Store initial velocity*/ + A("sts bezier_F, %0") + A("sts bezier_F+1, %1") + A("sts bezier_F+2, %10") /* bezier_F = %10:%1:%0 = v0 */ + + /* Get delta speed */ + A("ldi %2,-1") /* %2 = 0xFF, means A_negative = true */ + A("clr %8") /* %8 = 0 */ + A("sub %0,%3") + A("sbc %1,%4") + A("sbc %10,%5") /* v0 -= v1, C=1 if result is negative */ + A("brcc 1f") /* branch if result is positive (C=0), that means v0 >= v1 */ + + /* Result was negative, get the absolute value*/ + A("com %10") + A("com %1") + A("neg %0") + A("sbc %1,%2") + A("sbc %10,%2") /* %10:%1:%0 +1 -> %10:%1:%0 = -(v0 - v1) = (v1 - v0) */ + A("clr %2") /* %2 = 0, means A_negative = false */ + + /* Store negative flag*/ + L("1") + A("sts A_negative, %2") /* Store negative flag */ + + /* Compute coefficients A,B and C [20 cycles worst case]*/ + A("ldi %9,6") /* %9 = 6 */ + A("mul %0,%9") /* r1:r0 = 6*LO(v0-v1) */ + A("sts bezier_A, r0") + A("mov %6,r1") + A("clr %7") /* %7:%6:r0 = 6*LO(v0-v1) */ + A("mul %1,%9") /* r1:r0 = 6*MI(v0-v1) */ + A("add %6,r0") + A("adc %7,r1") /* %7:%6:?? += 6*MI(v0-v1) << 8 */ + A("mul %10,%9") /* r1:r0 = 6*HI(v0-v1) */ + A("add %7,r0") /* %7:%6:?? += 6*HI(v0-v1) << 16 */ + A("sts bezier_A+1, %6") + A("sts bezier_A+2, %7") /* bezier_A = %7:%6:?? = 6*(v0-v1) [35 cycles worst] */ + + A("ldi %9,15") /* %9 = 15 */ + A("mul %0,%9") /* r1:r0 = 5*LO(v0-v1) */ + A("sts bezier_B, r0") + A("mov %6,r1") + A("clr %7") /* %7:%6:?? = 5*LO(v0-v1) */ + A("mul %1,%9") /* r1:r0 = 5*MI(v0-v1) */ + A("add %6,r0") + A("adc %7,r1") /* %7:%6:?? += 5*MI(v0-v1) << 8 */ + A("mul %10,%9") /* r1:r0 = 5*HI(v0-v1) */ + A("add %7,r0") /* %7:%6:?? += 5*HI(v0-v1) << 16 */ + A("sts bezier_B+1, %6") + A("sts bezier_B+2, %7") /* bezier_B = %7:%6:?? = 5*(v0-v1) [50 cycles worst] */ + + A("ldi %9,10") /* %9 = 10 */ + A("mul %0,%9") /* r1:r0 = 10*LO(v0-v1) */ + A("sts bezier_C, r0") + A("mov %6,r1") + A("clr %7") /* %7:%6:?? = 10*LO(v0-v1) */ + A("mul %1,%9") /* r1:r0 = 10*MI(v0-v1) */ + A("add %6,r0") + A("adc %7,r1") /* %7:%6:?? += 10*MI(v0-v1) << 8 */ + A("mul %10,%9") /* r1:r0 = 10*HI(v0-v1) */ + A("add %7,r0") /* %7:%6:?? += 10*HI(v0-v1) << 16 */ + A("sts bezier_C+1, %6") + " sts bezier_C+2, %7" /* bezier_C = %7:%6:?? = 10*(v0-v1) [65 cycles worst] */ + : "+r" (r2), + "+d" (r3), + "=r" (r4), + "+r" (r5), + "+r" (r6), + "+r" (r7), + "=r" (r8), + "=r" (r9), + "=r" (r10), + "=d" (r11), + "+r" (r12) + : + : "r0", "r1", "cc", "memory" + ); + } + + FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { + + // If dealing with the first step, save expensive computing and return the initial speed + if (!curr_step) + return bezier_F; + + uint8_t r0 = 0; /* Zero register */ + uint8_t r2 = (curr_step) & 0xFF; + uint8_t r3 = (curr_step >> 8) & 0xFF; + uint8_t r4 = (curr_step >> 16) & 0xFF; + uint8_t r1,r5,r6,r7,r8,r9,r10,r11; /* Temporary registers */ + + __asm__ __volatile( + /* umul24x24to16hi(t, bezier_AV, curr_step); t: Range 0 - 1^16 = 16 bits*/ + A("lds %9,bezier_AV") /* %9 = LO(AV)*/ + A("mul %9,%2") /* r1:r0 = LO(bezier_AV)*LO(curr_step)*/ + A("mov %7,r1") /* %7 = LO(bezier_AV)*LO(curr_step) >> 8*/ + A("clr %8") /* %8:%7 = LO(bezier_AV)*LO(curr_step) >> 8*/ + A("lds %10,bezier_AV+1") /* %10 = MI(AV)*/ + A("mul %10,%2") /* r1:r0 = MI(bezier_AV)*LO(curr_step)*/ + A("add %7,r0") + A("adc %8,r1") /* %8:%7 += MI(bezier_AV)*LO(curr_step)*/ + A("lds r1,bezier_AV+2") /* r11 = HI(AV)*/ + A("mul r1,%2") /* r1:r0 = HI(bezier_AV)*LO(curr_step)*/ + A("add %8,r0") /* %8:%7 += HI(bezier_AV)*LO(curr_step) << 8*/ + A("mul %9,%3") /* r1:r0 = LO(bezier_AV)*MI(curr_step)*/ + A("add %7,r0") + A("adc %8,r1") /* %8:%7 += LO(bezier_AV)*MI(curr_step)*/ + A("mul %10,%3") /* r1:r0 = MI(bezier_AV)*MI(curr_step)*/ + A("add %8,r0") /* %8:%7 += LO(bezier_AV)*MI(curr_step) << 8*/ + A("mul %9,%4") /* r1:r0 = LO(bezier_AV)*HI(curr_step)*/ + A("add %8,r0") /* %8:%7 += LO(bezier_AV)*HI(curr_step) << 8*/ + /* %8:%7 = t*/ + + /* uint16_t f = t;*/ + A("mov %5,%7") /* %6:%5 = f*/ + A("mov %6,%8") + /* %6:%5 = f*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits (unsigned) [17] */ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %9,r1") /* store MIL(LO(f) * LO(t)) in %9, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %9,r0") /* %9 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %9,r0") /* %9 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t)) */ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 = */ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + /* [15 +17*2] = [49]*/ + + /* %4:%3:%2 will be acc from now on*/ + + /* uint24_t acc = bezier_F; / Range 20 bits (unsigned)*/ + A("clr %9") /* "decimal place we get for free"*/ + A("lds %2,bezier_F") + A("lds %3,bezier_F+1") + A("lds %4,bezier_F+2") /* %4:%3:%2 = acc*/ + + /* if (A_negative) {*/ + A("lds r0,A_negative") + A("or r0,%0") /* Is flag signalling negative? */ + A("brne 3f") /* If yes, Skip next instruction if A was negative*/ + A("rjmp 1f") /* Otherwise, jump */ + + /* uint24_t v; */ + /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29] */ + /* acc -= v; */ + L("3") + A("lds %10, bezier_C") /* %10 = LO(bezier_C)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_C) * LO(f)*/ + A("sub %9,r1") + A("sbc %2,%0") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_C) * LO(f))*/ + A("lds %11, bezier_C+1") /* %11 = MI(bezier_C)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_C) * LO(f)*/ + A("lds %1, bezier_C+2") /* %1 = HI(bezier_C)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_C) * MI(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_C) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_C) * MI(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_C) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_C) * LO(f)*/ + A("sub %3,r0") + A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_C) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/ + /* acc += v; */ + A("lds %10, bezier_B") /* %10 = LO(bezier_B)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_B) * LO(f)*/ + A("add %9,r1") + A("adc %2,%0") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_B) * LO(f))*/ + A("lds %11, bezier_B+1") /* %11 = MI(bezier_B)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_B) * LO(f)*/ + A("lds %1, bezier_B+2") /* %1 = HI(bezier_B)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_B) * MI(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_B) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_B) * MI(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_B) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_B) * LO(f)*/ + A("add %3,r0") + A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_B) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/ + /* acc -= v; */ + A("lds %10, bezier_A") /* %10 = LO(bezier_A)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_A) * LO(f)*/ + A("sub %9,r1") + A("sbc %2,%0") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_A) * LO(f))*/ + A("lds %11, bezier_A+1") /* %11 = MI(bezier_A)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_A) * LO(f)*/ + A("lds %1, bezier_A+2") /* %1 = HI(bezier_A)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_A) * MI(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_A) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_A) * MI(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_A) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_A) * LO(f)*/ + A("sub %3,r0") + A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_A) * LO(f) << 16*/ + A("jmp 2f") /* Done!*/ + + L("1") + + /* uint24_t v; */ + /* umul16x24to24hi(v, f, bezier_C); / Range 21bits [29]*/ + /* acc += v; */ + A("lds %10, bezier_C") /* %10 = LO(bezier_C)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_C) * LO(f)*/ + A("add %9,r1") + A("adc %2,%0") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_C) * LO(f))*/ + A("lds %11, bezier_C+1") /* %11 = MI(bezier_C)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_C) * LO(f)*/ + A("lds %1, bezier_C+2") /* %1 = HI(bezier_C)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_C) * LO(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_C) * MI(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_C) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_C) * MI(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_C) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_C) * LO(f)*/ + A("add %3,r0") + A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_C) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^3 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_B); / Range 22bits [29]*/ + /* acc -= v;*/ + A("lds %10, bezier_B") /* %10 = LO(bezier_B)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_B) * LO(f)*/ + A("sub %9,r1") + A("sbc %2,%0") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(LO(bezier_B) * LO(f))*/ + A("lds %11, bezier_B+1") /* %11 = MI(bezier_B)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_B) * LO(f)*/ + A("lds %1, bezier_B+2") /* %1 = HI(bezier_B)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_B) * LO(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_B) * MI(f)*/ + A("sub %9,r0") + A("sbc %2,r1") + A("sbc %3,%0") + A("sbc %4,%0") /* %4:%3:%2:%9 -= LO(bezier_B) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_B) * MI(f)*/ + A("sub %2,r0") + A("sbc %3,r1") + A("sbc %4,%0") /* %4:%3:%2:%9 -= MI(bezier_B) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_B) * LO(f)*/ + A("sub %3,r0") + A("sbc %4,r1") /* %4:%3:%2:%9 -= HI(bezier_B) * LO(f) << 16*/ + + /* umul16x16to16hi(f, f, t); / Range 16 bits : f = t^5 (unsigned) [17]*/ + A("mul %5,%7") /* r1:r0 = LO(f) * LO(t)*/ + A("mov %1,r1") /* store MIL(LO(f) * LO(t)) in %1, we need it for rounding*/ + A("clr %10") /* %10 = 0*/ + A("clr %11") /* %11 = 0*/ + A("mul %5,%8") /* r1:r0 = LO(f) * HI(t)*/ + A("add %1,r0") /* %1 += LO(LO(f) * HI(t))*/ + A("adc %10,r1") /* %10 = HI(LO(f) * HI(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%7") /* r1:r0 = HI(f) * LO(t)*/ + A("add %1,r0") /* %1 += LO(HI(f) * LO(t))*/ + A("adc %10,r1") /* %10 += HI(HI(f) * LO(t))*/ + A("adc %11,%0") /* %11 += carry*/ + A("mul %6,%8") /* r1:r0 = HI(f) * HI(t)*/ + A("add %10,r0") /* %10 += LO(HI(f) * HI(t))*/ + A("adc %11,r1") /* %11 += HI(HI(f) * HI(t))*/ + A("mov %5,%10") /* %6:%5 =*/ + A("mov %6,%11") /* f = %10:%11*/ + + /* umul16x24to24hi(v, f, bezier_A); / Range 21bits [29]*/ + /* acc += v; */ + A("lds %10, bezier_A") /* %10 = LO(bezier_A)*/ + A("mul %10,%5") /* r1:r0 = LO(bezier_A) * LO(f)*/ + A("add %9,r1") + A("adc %2,%0") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(LO(bezier_A) * LO(f))*/ + A("lds %11, bezier_A+1") /* %11 = MI(bezier_A)*/ + A("mul %11,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_A) * LO(f)*/ + A("lds %1, bezier_A+2") /* %1 = HI(bezier_A)*/ + A("mul %1,%5") /* r1:r0 = MI(bezier_A) * LO(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 8*/ + A("mul %10,%6") /* r1:r0 = LO(bezier_A) * MI(f)*/ + A("add %9,r0") + A("adc %2,r1") + A("adc %3,%0") + A("adc %4,%0") /* %4:%3:%2:%9 += LO(bezier_A) * MI(f)*/ + A("mul %11,%6") /* r1:r0 = MI(bezier_A) * MI(f)*/ + A("add %2,r0") + A("adc %3,r1") + A("adc %4,%0") /* %4:%3:%2:%9 += MI(bezier_A) * MI(f) << 8*/ + A("mul %1,%6") /* r1:r0 = HI(bezier_A) * LO(f)*/ + A("add %3,r0") + A("adc %4,r1") /* %4:%3:%2:%9 += HI(bezier_A) * LO(f) << 16*/ + L("2") + " clr __zero_reg__" /* C runtime expects r1 = __zero_reg__ = 0 */ + : "+r"(r0), + "+r"(r1), + "+r"(r2), + "+r"(r3), + "+r"(r4), + "+r"(r5), + "+r"(r6), + "+r"(r7), + "+r"(r8), + "+r"(r9), + "+r"(r10), + "+r"(r11) + : + :"cc","r0","r1" + ); + return (r2 | (uint16_t(r3) << 8)) | (uint32_t(r4) << 16); + } + + #else + + // For all the other 32bit CPUs + FORCE_INLINE void Stepper::_calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av) { + // Calculate the Bézier coefficients + bezier_A = 768 * (v1 - v0); + bezier_B = 1920 * (v0 - v1); + bezier_C = 1280 * (v1 - v0); + bezier_F = 128 * v0; + bezier_AV = av; + } + + FORCE_INLINE int32_t Stepper::_eval_bezier_curve(const uint32_t curr_step) { + #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; + uint32_t fhi = bezier_AV * curr_step; + uint32_t t = fhi; + int32_t alo = bezier_F; + int32_t ahi = 0; + int32_t A = bezier_A; + int32_t B = bezier_B; + int32_t C = bezier_C; + + __asm__ __volatile__( + ".syntax unified" "\n\t" // is to prevent CM0,CM1 non-unified syntax + A("lsrs %[ahi],%[alo],#1") // a = F << 31 1 cycles + A("lsls %[alo],%[alo],#31") // 1 cycles + A("umull %[flo],%[fhi],%[fhi],%[t]") // f *= t 5 cycles [fhi:flo=64bits] + A("umull %[flo],%[fhi],%[fhi],%[t]") // f>>=32; f*=t 5 cycles [fhi:flo=64bits] + A("lsrs %[flo],%[fhi],#1") // 1 cycles [31bits] + A("smlal %[alo],%[ahi],%[flo],%[C]") // a+=(f>>33)*C; 5 cycles + A("umull %[flo],%[fhi],%[fhi],%[t]") // f>>=32; f*=t 5 cycles [fhi:flo=64bits] + A("lsrs %[flo],%[fhi],#1") // 1 cycles [31bits] + A("smlal %[alo],%[ahi],%[flo],%[B]") // a+=(f>>33)*B; 5 cycles + A("umull %[flo],%[fhi],%[fhi],%[t]") // f>>=32; f*=t 5 cycles [fhi:flo=64bits] + A("lsrs %[flo],%[fhi],#1") // f>>=33; 1 cycles [31bits] + A("smlal %[alo],%[ahi],%[flo],%[A]") // a+=(f>>33)*A; 5 cycles + A("lsrs %[alo],%[ahi],#6") // a>>=38 1 cycles + : [alo]"+r"( alo ) , + [flo]"+r"( flo ) , + [fhi]"+r"( fhi ) , + [ahi]"+r"( ahi ) , + [A]"+r"( A ) , // <== Note: Even if A, B, C, and t registers are INPUT ONLY + [B]"+r"( B ) , // GCC does bad optimizations on the code if we list them as + [C]"+r"( C ) , // such, breaking this function. So, to avoid that problem, + [t]"+r"( t ) // we list all registers as input-outputs. + : + : "cc" + ); + return alo; + + #else + + // For non ARM targets, we provide a fallback implementation. Really doubt it + // will be useful, unless the processor is fast and 32bit + + uint32_t t = bezier_AV * curr_step; // t: Range 0 - 1^32 = 32 bits + uint64_t f = t; + f *= t; // Range 32*2 = 64 bits (unsigned) + f >>= 32; // Range 32 bits (unsigned) + f *= t; // Range 32*2 = 64 bits (unsigned) + f >>= 32; // Range 32 bits : f = t^3 (unsigned) + int64_t acc = (int64_t) bezier_F << 31; // Range 63 bits (signed) + acc += ((uint32_t) f >> 1) * (int64_t) bezier_C; // Range 29bits + 31 = 60bits (plus sign) + f *= t; // Range 32*2 = 64 bits + f >>= 32; // Range 32 bits : f = t^3 (unsigned) + acc += ((uint32_t) f >> 1) * (int64_t) bezier_B; // Range 29bits + 31 = 60bits (plus sign) + f *= t; // Range 32*2 = 64 bits + f >>= 32; // Range 32 bits : f = t^3 (unsigned) + acc += ((uint32_t) f >> 1) * (int64_t) bezier_A; // Range 28bits + 31 = 59bits (plus sign) + acc >>= (31 + 7); // Range 24bits (plus sign) + return (int32_t) acc; + + #endif + } + #endif +#endif // S_CURVE_ACCELERATION + +/** + * Stepper Driver Interrupt + * + * Directly pulses the stepper motors at high frequency. + */ + +HAL_STEP_TIMER_ISR() { + HAL_timer_isr_prologue(STEP_TIMER_NUM); + + Stepper::isr(); + + HAL_timer_isr_epilogue(STEP_TIMER_NUM); +} + +#ifdef CPU_32_BIT + #define STEP_MULTIPLY(A,B) MultiU32X24toH32(A, B) +#else + #define STEP_MULTIPLY(A,B) MultiU24X32toH16(A, B) +#endif + +void Stepper::isr() { + + static uint32_t nextMainISR = 0; // Interval until the next main Stepper Pulse phase (0 = Now) + + #ifndef __AVR__ + // Disable interrupts, to avoid ISR preemption while we reprogram the period + // (AVR enters the ISR with global interrupts disabled, so no need to do it here) + DISABLE_ISRS(); + #endif + + // Program timer compare for the maximum period, so it does NOT + // flag an interrupt while this ISR is running - So changes from small + // periods to big periods are respected and the timer does not reset to 0 + HAL_timer_set_compare(STEP_TIMER_NUM, hal_timer_t(HAL_TIMER_TYPE_MAX)); + + // Count of ticks for the next ISR + hal_timer_t next_isr_ticks = 0; + + // Limit the amount of iterations + uint8_t max_loops = 10; + + // We need this variable here to be able to use it in the following loop + hal_timer_t min_ticks; + do { + // Enable ISRs to reduce USART processing latency + ENABLE_ISRS(); + + if (!nextMainISR) pulse_phase_isr(); // 0 = Do coordinated axes Stepper pulses + + #if ENABLED(LIN_ADVANCE) + if (!nextAdvanceISR) nextAdvanceISR = advance_isr(); // 0 = Do Linear Advance E Stepper pulses + #endif + + #if ENABLED(INTEGRATED_BABYSTEPPING) + const bool is_babystep = (nextBabystepISR == 0); // 0 = Do Babystepping (XY)Z pulses + if (is_babystep) nextBabystepISR = babystepping_isr(); + #endif + + // ^== Time critical. NOTHING besides pulse generation should be above here!!! + + if (!nextMainISR) nextMainISR = block_phase_isr(); // Manage acc/deceleration, get next block + + #if ENABLED(INTEGRATED_BABYSTEPPING) + if (is_babystep) // Avoid ANY stepping too soon after baby-stepping + NOLESS(nextMainISR, (BABYSTEP_TICKS) / 8); // FULL STOP for 125µs after a baby-step + + if (nextBabystepISR != BABYSTEP_NEVER) // Avoid baby-stepping too close to axis Stepping + NOLESS(nextBabystepISR, nextMainISR / 2); // TODO: Only look at axes enabled for baby-stepping + #endif + + // Get the interval to the next ISR call + const uint32_t interval = _MIN( + nextMainISR // Time until the next Pulse / Block phase + #if ENABLED(LIN_ADVANCE) + , nextAdvanceISR // Come back early for Linear Advance? + #endif + #if ENABLED(INTEGRATED_BABYSTEPPING) + , nextBabystepISR // Come back early for Babystepping? + #endif + , uint32_t(HAL_TIMER_TYPE_MAX) // Come back in a very long time + ); + + // + // Compute remaining time for each ISR phase + // NEVER : The phase is idle + // Zero : The phase will occur on the next ISR call + // Non-zero : The phase will occur on a future ISR call + // + + nextMainISR -= interval; + + #if ENABLED(LIN_ADVANCE) + if (nextAdvanceISR != LA_ADV_NEVER) nextAdvanceISR -= interval; + #endif + + #if ENABLED(INTEGRATED_BABYSTEPPING) + if (nextBabystepISR != BABYSTEP_NEVER) nextBabystepISR -= interval; + #endif + + /** + * This needs to avoid a race-condition caused by interleaving + * of interrupts required by both the LA and Stepper algorithms. + * + * Assume the following tick times for stepper pulses: + * Stepper ISR (S): 1 1000 2000 3000 4000 + * Linear Adv. (E): 10 1010 2010 3010 4010 + * + * The current algorithm tries to interleave them, giving: + * 1:S 10:E 1000:S 1010:E 2000:S 2010:E 3000:S 3010:E 4000:S 4010:E + * + * Ideal timing would yield these delta periods: + * 1:S 9:E 990:S 10:E 990:S 10:E 990:S 10:E 990:S 10:E + * + * But, since each event must fire an ISR with a minimum duration, the + * minimum delta might be 900, so deltas under 900 get rounded up: + * 900:S d900:E d990:S d900:E d990:S d900:E d990:S d900:E d990:S d900:E + * + * It works, but divides the speed of all motors by half, leading to a sudden + * reduction to 1/2 speed! Such jumps in speed lead to lost steps (not even + * accounting for double/quad stepping, which makes it even worse). + */ + + // Compute the tick count for the next ISR + next_isr_ticks += interval; + + /** + * The following section must be done with global interrupts disabled. + * We want nothing to interrupt it, as that could mess the calculations + * we do for the next value to program in the period register of the + * stepper timer and lead to skipped ISRs (if the value we happen to program + * is less than the current count due to something preempting between the + * read and the write of the new period value). + */ + DISABLE_ISRS(); + + /** + * Get the current tick value + margin + * Assuming at least 6µs between calls to this ISR... + * On AVR the ISR epilogue+prologue is estimated at 100 instructions - Give 8µs as margin + * On ARM the ISR epilogue+prologue is estimated at 20 instructions - Give 1µs as margin + */ + min_ticks = HAL_timer_get_count(STEP_TIMER_NUM) + hal_timer_t( + #ifdef __AVR__ + 8 + #else + 1 + #endif + * (STEPPER_TIMER_TICKS_PER_US) + ); + + /** + * NB: If for some reason the stepper monopolizes the MPU, eventually the + * timer will wrap around (and so will 'next_isr_ticks'). So, limit the + * loop to 10 iterations. Beyond that, there's no way to ensure correct pulse + * timing, since the MCU isn't fast enough. + */ + if (!--max_loops) next_isr_ticks = min_ticks; + + // Advance pulses if not enough time to wait for the next ISR + } while (next_isr_ticks < min_ticks); + + // Now 'next_isr_ticks' contains the period to the next Stepper ISR - And we are + // sure that the time has not arrived yet - Warrantied by the scheduler + + // Set the next ISR to fire at the proper time + HAL_timer_set_compare(STEP_TIMER_NUM, hal_timer_t(next_isr_ticks)); + + // Don't forget to finally reenable interrupts + ENABLE_ISRS(); +} + +#if MINIMUM_STEPPER_PULSE || MAXIMUM_STEPPER_RATE + #define ISR_PULSE_CONTROL 1 +#endif +#if ISR_PULSE_CONTROL && DISABLED(I2S_STEPPER_STREAM) + #define ISR_MULTI_STEPS 1 +#endif + +/** + * This phase of the ISR should ONLY create the pulses for the steppers. + * This prevents jitter caused by the interval between the start of the + * interrupt and the start of the pulses. DON'T add any logic ahead of the + * call to this method that might cause variation in the timing. The aim + * is to keep pulse timing as regular as possible. + */ +void Stepper::pulse_phase_isr() { + + // If we must abort the current block, do so! + if (abort_current_block) { + abort_current_block = false; + if (current_block) discard_current_block(); + } + + // If there is no current block, do nothing + if (!current_block) return; + + // Count of pending loops and events for this iteration + const uint32_t pending_events = step_event_count - step_events_completed; + uint8_t events_to_do = _MIN(pending_events, steps_per_isr); + + // Just update the value we will get at the end of the loop + step_events_completed += events_to_do; + + // Take multiple steps per interrupt (For high speed moves) + #if ISR_MULTI_STEPS + bool firstStep = true; + USING_TIMED_PULSE(); + #endif + xyze_bool_t step_needed{0}; + + do { + #define _APPLY_STEP(AXIS, INV, ALWAYS) AXIS ##_APPLY_STEP(INV, ALWAYS) + #define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN + + // Determine if a pulse is needed using Bresenham + #define PULSE_PREP(AXIS) do{ \ + delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \ + step_needed[_AXIS(AXIS)] = (delta_error[_AXIS(AXIS)] >= 0); \ + if (step_needed[_AXIS(AXIS)]) { \ + count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)]; \ + delta_error[_AXIS(AXIS)] -= advance_divisor; \ + } \ + }while(0) + + // Start an active pulse if needed + #define PULSE_START(AXIS) do{ \ + if (step_needed[_AXIS(AXIS)]) { \ + _APPLY_STEP(AXIS, !_INVERT_STEP_PIN(AXIS), 0); \ + } \ + }while(0) + + // Stop an active pulse if needed + #define PULSE_STOP(AXIS) do { \ + if (step_needed[_AXIS(AXIS)]) { \ + _APPLY_STEP(AXIS, _INVERT_STEP_PIN(AXIS), 0); \ + } \ + }while(0) + + // Direct Stepping page? + const bool is_page = IS_PAGE(current_block); + + #if ENABLED(DIRECT_STEPPING) + + if (is_page) { + + #if STEPPER_PAGE_FORMAT == SP_4x4D_128 + + #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{ \ + step_needed[_AXIS(AXIS)] = \ + pgm_read_byte(&segment_table[page_step_state.sd[_AXIS(AXIS)]][page_step_state.segment_steps & 0x7]); \ + }while(0) + + switch (page_step_state.segment_steps) { + case DirectStepping::Config::SEGMENT_STEPS: + page_step_state.segment_idx += 2; + page_step_state.segment_steps = 0; + // fallthru + case 0: { + const uint8_t low = page_step_state.page[page_step_state.segment_idx], + high = page_step_state.page[page_step_state.segment_idx + 1]; + uint8_t dm = last_direction_bits; + + 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; + set_directions(); + } + } break; + + default: break; + } + + PAGE_PULSE_PREP(X); + PAGE_PULSE_PREP(Y); + PAGE_PULSE_PREP(Z); + PAGE_PULSE_PREP(E); + + page_step_state.segment_steps++; + + #elif STEPPER_PAGE_FORMAT == SP_4x2_256 + + #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) \ + page_step_state.sd[_AXIS(AXIS)] = VALUE; \ + page_step_state.bd[_AXIS(AXIS)] += VALUE; + + #define PAGE_PULSE_PREP(AXIS) do{ \ + step_needed[_AXIS(AXIS)] = \ + pgm_read_byte(&segment_table[page_step_state.sd[_AXIS(AXIS)]][page_step_state.segment_steps & 0x3]); \ + }while(0) + + switch (page_step_state.segment_steps) { + case DirectStepping::Config::SEGMENT_STEPS: + page_step_state.segment_idx++; + page_step_state.segment_steps = 0; + // fallthru + case 0: { + const uint8_t b = page_step_state.page[page_step_state.segment_idx]; + PAGE_SEGMENT_UPDATE(X, (b >> 6) & 0x3); + PAGE_SEGMENT_UPDATE(Y, (b >> 4) & 0x3); + PAGE_SEGMENT_UPDATE(Z, (b >> 2) & 0x3); + PAGE_SEGMENT_UPDATE(E, (b >> 0) & 0x3); + } break; + default: break; + } + + PAGE_PULSE_PREP(X); + PAGE_PULSE_PREP(Y); + PAGE_PULSE_PREP(Z); + PAGE_PULSE_PREP(E); + + page_step_state.segment_steps++; + + #elif STEPPER_PAGE_FORMAT == SP_4x1_512 + + #define PAGE_PULSE_PREP(AXIS, BITS) do{ \ + step_needed[_AXIS(AXIS)] = (steps >> BITS) & 0x1; \ + if (step_needed[_AXIS(AXIS)]) \ + page_step_state.bd[_AXIS(AXIS)]++; \ + }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); + PAGE_PULSE_PREP(Y, 2); + PAGE_PULSE_PREP(Z, 1); + PAGE_PULSE_PREP(E, 0); + + page_step_state.segment_idx++; + + #else + #error "Unknown direct stepping page format!" + #endif + } + + #endif // DIRECT_STEPPING + + if (!is_page) { + // Determine if pulses are needed + #if HAS_X_STEP + PULSE_PREP(X); + #endif + #if HAS_Y_STEP + PULSE_PREP(Y); + #endif + #if HAS_Z_STEP + PULSE_PREP(Z); + #endif + + #if EITHER(LIN_ADVANCE, MIXING_EXTRUDER) + delta_error.e += advance_dividend.e; + if (delta_error.e >= 0) { + count_position.e += count_direction.e; + #if ENABLED(LIN_ADVANCE) + delta_error.e -= advance_divisor; + // Don't step E here - But remember the number of steps to perform + motor_direction(E_AXIS) ? --LA_steps : ++LA_steps; + #else + step_needed.e = true; + #endif + } + #elif HAS_E0_STEP + PULSE_PREP(E); + #endif + } + + #if ISR_MULTI_STEPS + if (firstStep) + firstStep = false; + else + AWAIT_LOW_PULSE(); + #endif + + // Pulse start + #if HAS_X_STEP + PULSE_START(X); + #endif + #if HAS_Y_STEP + PULSE_START(Y); + #endif + #if HAS_Z_STEP + PULSE_START(Z); + #endif + + #if DISABLED(LIN_ADVANCE) + #if ENABLED(MIXING_EXTRUDER) + if (step_needed.e) E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN); + #elif HAS_E0_STEP + PULSE_START(E); + #endif + #endif + + #if ENABLED(I2S_STEPPER_STREAM) + i2s_push_sample(); + #endif + + // TODO: need to deal with MINIMUM_STEPPER_PULSE over i2s + #if ISR_MULTI_STEPS + START_HIGH_PULSE(); + AWAIT_HIGH_PULSE(); + #endif + + // Pulse stop + #if HAS_X_STEP + PULSE_STOP(X); + #endif + #if HAS_Y_STEP + PULSE_STOP(Y); + #endif + #if HAS_Z_STEP + PULSE_STOP(Z); + #endif + + #if DISABLED(LIN_ADVANCE) + #if ENABLED(MIXING_EXTRUDER) + if (delta_error.e >= 0) { + delta_error.e -= advance_divisor; + E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN); + } + #elif HAS_E0_STEP + PULSE_STOP(E); + #endif + #endif + + #if ISR_MULTI_STEPS + if (events_to_do) START_LOW_PULSE(); + #endif + + } while (--events_to_do); +} + +// This is the last half of the stepper interrupt: This one processes and +// properly schedules blocks from the planner. This is executed after creating +// the step pulses, so it is not time critical, as pulses are already done. + +uint32_t Stepper::block_phase_isr() { + + // If no queued movements, just wait 1ms for the next block + uint32_t interval = (STEPPER_TIMER_RATE) / 1000UL; + + // If there is a current block + if (current_block) { + + // If current block is finished, reset pointer and finalize state + if (step_events_completed >= step_event_count) { + #if ENABLED(DIRECT_STEPPING) + #if STEPPER_PAGE_FORMAT == SP_4x4D_128 + #define PAGE_SEGMENT_UPDATE_POS(AXIS) \ + count_position[_AXIS(AXIS)] += page_step_state.bd[_AXIS(AXIS)] - 128 * 7; + #elif STEPPER_PAGE_FORMAT == SP_4x1_512 || STEPPER_PAGE_FORMAT == SP_4x2_256 + #define PAGE_SEGMENT_UPDATE_POS(AXIS) \ + count_position[_AXIS(AXIS)] += page_step_state.bd[_AXIS(AXIS)] * count_direction[_AXIS(AXIS)]; + #endif + + if (IS_PAGE(current_block)) { + PAGE_SEGMENT_UPDATE_POS(X); + PAGE_SEGMENT_UPDATE_POS(Y); + PAGE_SEGMENT_UPDATE_POS(Z); + PAGE_SEGMENT_UPDATE_POS(E); + } + #endif + TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, runout.block_completed(current_block)); + discard_current_block(); + } + else { + // Step events not completed yet... + + // Are we in acceleration phase ? + if (step_events_completed <= accelerate_until) { // Calculate new timer value + + #if ENABLED(S_CURVE_ACCELERATION) + // Get the next speed to use (Jerk limited!) + uint32_t acc_step_rate = acceleration_time < current_block->acceleration_time + ? _eval_bezier_curve(acceleration_time) + : current_block->cruise_rate; + #else + acc_step_rate = STEP_MULTIPLY(acceleration_time, current_block->acceleration_rate) + current_block->initial_rate; + NOMORE(acc_step_rate, current_block->nominal_rate); + #endif + + // acc_step_rate is in steps/second + + // step_rate to timer interval and steps per stepper isr + interval = calc_timer_interval(acc_step_rate, &steps_per_isr); + acceleration_time += interval; + + #if ENABLED(LIN_ADVANCE) + if (LA_use_advance_lead) { + // Fire ISR if final adv_rate is reached + if (LA_steps && LA_isr_rate != current_block->advance_speed) nextAdvanceISR = 0; + } + else if (LA_steps) nextAdvanceISR = 0; + #endif + + // Update laser - Accelerating + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + if (laser_trap.enabled) { + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + if (current_block->laser.entry_per) { + laser_trap.acc_step_count -= step_events_completed - laser_trap.last_step_count; + laser_trap.last_step_count = step_events_completed; + + // Should be faster than a divide, since this should trip just once + if (laser_trap.acc_step_count < 0) { + while (laser_trap.acc_step_count < 0) { + laser_trap.acc_step_count += current_block->laser.entry_per; + if (laser_trap.cur_power < current_block->laser.power) laser_trap.cur_power++; + } + cutter.set_ocr_power(laser_trap.cur_power); + } + } + #else + if (laser_trap.till_update) + laser_trap.till_update--; + else { + laser_trap.till_update = LASER_POWER_INLINE_TRAPEZOID_CONT_PER; + laser_trap.cur_power = (current_block->laser.power * acc_step_rate) / current_block->nominal_rate; + cutter.set_ocr_power(laser_trap.cur_power); // Cycle efficiency is irrelevant it the last line was many cycles + } + #endif + } + #endif + } + // Are we in Deceleration phase ? + else if (step_events_completed > decelerate_after) { + uint32_t step_rate; + + #if ENABLED(S_CURVE_ACCELERATION) + // If this is the 1st time we process the 2nd half of the trapezoid... + if (!bezier_2nd_half) { + // Initialize the Bézier speed curve + _calc_bezier_curve_coeffs(current_block->cruise_rate, current_block->final_rate, current_block->deceleration_time_inverse); + bezier_2nd_half = true; + // The first point starts at cruise rate. Just save evaluation of the Bézier curve + step_rate = current_block->cruise_rate; + } + else { + // Calculate the next speed to use + step_rate = deceleration_time < current_block->deceleration_time + ? _eval_bezier_curve(deceleration_time) + : current_block->final_rate; + } + #else + + // Using the old trapezoidal control + step_rate = STEP_MULTIPLY(deceleration_time, current_block->acceleration_rate); + if (step_rate < acc_step_rate) { // Still decelerating? + step_rate = acc_step_rate - step_rate; + NOLESS(step_rate, current_block->final_rate); + } + else + step_rate = current_block->final_rate; + #endif + + // step_rate is in steps/second + + // step_rate to timer interval and steps per stepper isr + interval = calc_timer_interval(step_rate, &steps_per_isr); + deceleration_time += interval; + + #if ENABLED(LIN_ADVANCE) + if (LA_use_advance_lead) { + // Wake up eISR on first deceleration loop and fire ISR if final adv_rate is reached + if (step_events_completed <= decelerate_after + steps_per_isr || (LA_steps && LA_isr_rate != current_block->advance_speed)) { + initiateLA(); + LA_isr_rate = current_block->advance_speed; + } + } + else if (LA_steps) nextAdvanceISR = 0; + #endif // LIN_ADVANCE + + // Update laser - Decelerating + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + if (laser_trap.enabled) { + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + if (current_block->laser.exit_per) { + laser_trap.acc_step_count -= step_events_completed - laser_trap.last_step_count; + laser_trap.last_step_count = step_events_completed; + + // Should be faster than a divide, since this should trip just once + if (laser_trap.acc_step_count < 0) { + while (laser_trap.acc_step_count < 0) { + laser_trap.acc_step_count += current_block->laser.exit_per; + if (laser_trap.cur_power > current_block->laser.power_exit) laser_trap.cur_power--; + } + cutter.set_ocr_power(laser_trap.cur_power); + } + } + #else + if (laser_trap.till_update) + laser_trap.till_update--; + else { + laser_trap.till_update = LASER_POWER_INLINE_TRAPEZOID_CONT_PER; + laser_trap.cur_power = (current_block->laser.power * step_rate) / current_block->nominal_rate; + cutter.set_ocr_power(laser_trap.cur_power); // Cycle efficiency isn't relevant when the last line was many cycles + } + #endif + } + #endif + } + // Must be in cruise phase otherwise + else { + + #if ENABLED(LIN_ADVANCE) + // If there are any esteps, fire the next advance_isr "now" + if (LA_steps && LA_isr_rate != current_block->advance_speed) initiateLA(); + #endif + + // Calculate the ticks_nominal for this nominal speed, if not done yet + if (ticks_nominal < 0) { + // step_rate to timer interval and loops for the nominal speed + ticks_nominal = calc_timer_interval(current_block->nominal_rate, &steps_per_isr); + } + + // The timer interval is just the nominal value for the nominal speed + interval = ticks_nominal; + + // Update laser - Cruising + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + if (laser_trap.enabled) { + if (!laser_trap.cruise_set) { + laser_trap.cur_power = current_block->laser.power; + cutter.set_ocr_power(laser_trap.cur_power); + laser_trap.cruise_set = true; + } + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + laser_trap.till_update = LASER_POWER_INLINE_TRAPEZOID_CONT_PER; + #else + laser_trap.last_step_count = step_events_completed; + #endif + } + #endif + } + } + } + + // If there is no current block at this point, attempt to pop one from the buffer + // and prepare its movement + if (!current_block) { + + // Anything in the buffer? + if ((current_block = planner.get_current_block())) { + + // Sync block? Sync the stepper counts and return + while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { + _set_position(current_block->position); + discard_current_block(); + + // Try to get a new block + if (!(current_block = planner.get_current_block())) + return interval; // No more queued movements! + } + + // For non-inline cutter, grossly apply power + #if ENABLED(LASER_FEATURE) && DISABLED(LASER_POWER_INLINE) + cutter.apply_power(current_block->cutter_power); + #endif + + TERN_(POWER_LOSS_RECOVERY, recovery.info.sdpos = current_block->sdpos); + + #if ENABLED(DIRECT_STEPPING) + if (IS_PAGE(current_block)) { + page_step_state.segment_steps = 0; + page_step_state.segment_idx = 0; + page_step_state.page = page_manager.get_page(current_block->page_idx); + page_step_state.bd.reset(); + + if (DirectStepping::Config::DIRECTIONAL) + current_block->direction_bits = last_direction_bits; + + if (!page_step_state.page) { + discard_current_block(); + return interval; + } + } + #endif + + // Flag all moving axes for proper endstop handling + + #if IS_CORE + // Define conditions for checking endstops + #define S_(N) current_block->steps[CORE_AXIS_##N] + #define D_(N) TEST(current_block->direction_bits, CORE_AXIS_##N) + #endif + + #if CORE_IS_XY || CORE_IS_XZ + /** + * Head direction in -X axis for CoreXY and CoreXZ bots. + * + * If steps differ, both axes are moving. + * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z, handled below) + * If DeltaA == DeltaB, the movement is only in the 1st axis (X) + */ + #if EITHER(COREXY, COREXZ) + #define X_CMP(A,B) ((A)==(B)) + #else + #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 + + #if CORE_IS_XY || CORE_IS_YZ + /** + * Head direction in -Y axis for CoreXY / CoreYZ bots. + * + * If steps differ, both axes are moving + * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y) + * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z) + */ + #if EITHER(COREYX, COREYZ) + #define Y_CMP(A,B) ((A)==(B)) + #else + #define Y_CMP(A,B) ((A)!=(B)) + #endif + #define Y_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && Y_CMP(D_(1),D_(2))) ) + #else + #define Y_MOVE_TEST !!current_block->steps.b + #endif + + #if CORE_IS_XZ || CORE_IS_YZ + /** + * Head direction in -Z axis for CoreXZ or CoreYZ bots. + * + * If steps differ, both axes are moving + * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y, already handled above) + * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Z) + */ + #if EITHER(COREZX, COREZY) + #define Z_CMP(A,B) ((A)==(B)) + #else + #define Z_CMP(A,B) ((A)!=(B)) + #endif + #define Z_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && Z_CMP(D_(1),D_(2))) ) + #else + #define Z_MOVE_TEST !!current_block->steps.c + #endif + + uint8_t axis_bits = 0; + if (X_MOVE_TEST) SBI(axis_bits, A_AXIS); + if (Y_MOVE_TEST) SBI(axis_bits, B_AXIS); + if (Z_MOVE_TEST) SBI(axis_bits, C_AXIS); + //if (!!current_block->steps.e) SBI(axis_bits, E_AXIS); + //if (!!current_block->steps.a) SBI(axis_bits, X_HEAD); + //if (!!current_block->steps.b) SBI(axis_bits, Y_HEAD); + //if (!!current_block->steps.c) SBI(axis_bits, Z_HEAD); + axis_did_move = axis_bits; + + // No acceleration / deceleration time elapsed so far + acceleration_time = deceleration_time = 0; + + #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 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 < 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 + constexpr uint8_t oversampling = 0; + #endif + + // Based on the oversampling factor, do the calculations + step_event_count = current_block->step_event_count << oversampling; + + // Initialize Bresenham delta errors to 1/2 + delta_error = -int32_t(step_event_count); + + // Calculate Bresenham dividends and divisors + advance_dividend = current_block->steps << 1; + advance_divisor = step_event_count << 1; + + // No step events completed so far + step_events_completed = 0; + + // Compute the acceleration and deceleration points + accelerate_until = current_block->accelerate_until << oversampling; + decelerate_after = current_block->decelerate_after << oversampling; + + #if ENABLED(MIXING_EXTRUDER) + MIXER_STEPPER_SETUP(); + #endif + + #if HAS_MULTI_EXTRUDER + stepper_extruder = current_block->extruder; + #endif + + // Initialize the trapezoid generator from the current block. + #if ENABLED(LIN_ADVANCE) + #if DISABLED(MIXING_EXTRUDER) && E_STEPPERS > 1 + // If the now active extruder wasn't in use during the last move, its pressure is most likely gone. + if (stepper_extruder != last_moved_extruder) LA_current_adv_steps = 0; + #endif + + if ((LA_use_advance_lead = current_block->use_advance_lead)) { + LA_final_adv_steps = current_block->final_adv_steps; + LA_max_adv_steps = current_block->max_adv_steps; + initiateLA(); // Start the ISR + LA_isr_rate = current_block->advance_speed; + } + else LA_isr_rate = LA_ADV_NEVER; + #endif + + if ( ENABLED(HAS_L64XX) // Always set direction for L64xx (Also enables the chips) + || current_block->direction_bits != last_direction_bits + || TERN(MIXING_EXTRUDER, false, stepper_extruder != last_moved_extruder) + ) { + last_direction_bits = current_block->direction_bits; + #if HAS_MULTI_EXTRUDER + last_moved_extruder = stepper_extruder; + #endif + + TERN_(HAS_L64XX, L64XX_OK_to_power_up = true); + set_directions(); + } + + #if ENABLED(LASER_POWER_INLINE) + const power_status_t stat = current_block->laser.status; + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + laser_trap.enabled = stat.isPlanned && stat.isEnabled; + laser_trap.cur_power = current_block->laser.power_entry; // RESET STATE + laser_trap.cruise_set = false; + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + laser_trap.last_step_count = 0; + laser_trap.acc_step_count = current_block->laser.entry_per / 2; + #else + laser_trap.till_update = 0; + #endif + // Always have PWM in this case + if (stat.isPlanned) { // Planner controls the laser + cutter.set_ocr_power( + stat.isEnabled ? laser_trap.cur_power : 0 // ON with power or OFF + ); + } + #else + if (stat.isPlanned) { // Planner controls the laser + #if ENABLED(SPINDLE_LASER_PWM) + cutter.set_ocr_power( + stat.isEnabled ? current_block->laser.power : 0 // ON with power or OFF + ); + #else + cutter.set_enabled(stat.isEnabled); + #endif + } + #endif + #endif // LASER_POWER_INLINE + + // At this point, we must ensure the movement about to execute isn't + // trying to force the head against a limit switch. If using interrupt- + // driven change detection, and already against a limit then no call to + // the endstop_triggered method will be done and the movement will be + // done against the endstop. So, check the limits here: If the movement + // is against the limits, the block will be marked as to be killed, and + // on the next call to this ISR, will be discarded. + endstops.update(); + + #if ENABLED(Z_LATE_ENABLE) + // If delayed Z enable, enable it now. This option will severely interfere with + // timing between pulses when chaining motion between blocks, and it could lead + // to lost steps in both X and Y axis, so avoid using it unless strictly necessary!! + if (current_block->steps.z) ENABLE_AXIS_Z(); + #endif + + // Mark the time_nominal as not calculated yet + ticks_nominal = -1; + + #if ENABLED(S_CURVE_ACCELERATION) + // Initialize the Bézier speed curve + _calc_bezier_curve_coeffs(current_block->initial_rate, current_block->cruise_rate, current_block->acceleration_time_inverse); + // We haven't started the 2nd half of the trapezoid + bezier_2nd_half = false; + #else + // Set as deceleration point the initial rate of the block + acc_step_rate = current_block->initial_rate; + #endif + + // Calculate the initial timer interval + interval = calc_timer_interval(current_block->initial_rate, &steps_per_isr); + } + #if ENABLED(LASER_POWER_INLINE_CONTINUOUS) + else { // No new block found; so apply inline laser parameters + // This should mean ending file with 'M5 I' will stop the laser; thus the inline flag isn't needed + const power_status_t stat = planner.laser_inline.status; + if (stat.isPlanned) { // Planner controls the laser + #if ENABLED(SPINDLE_LASER_PWM) + cutter.set_ocr_power( + stat.isEnabled ? planner.laser_inline.power : 0 // ON with power or OFF + ); + #else + cutter.set_enabled(stat.isEnabled); + #endif + } + } + #endif + } + + // Return the interval to wait + return interval; +} + +#if ENABLED(LIN_ADVANCE) + + // Timer interrupt for E. LA_steps is set in the main routine + uint32_t Stepper::advance_isr() { + uint32_t interval; + + if (LA_use_advance_lead) { + if (step_events_completed > decelerate_after && LA_current_adv_steps > LA_final_adv_steps) { + LA_steps--; + LA_current_adv_steps--; + interval = LA_isr_rate; + } + else if (step_events_completed < decelerate_after && LA_current_adv_steps < LA_max_adv_steps) { + LA_steps++; + LA_current_adv_steps++; + interval = LA_isr_rate; + } + else + interval = LA_isr_rate = LA_ADV_NEVER; + } + else + interval = LA_ADV_NEVER; + + if (!LA_steps) return interval; // Leave pins alone if there are no steps! + + DIR_WAIT_BEFORE(); + + #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) + MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); + else if (LA_steps < 0) + MIXER_STEPPER_LOOP(j) REV_E_DIR(j); + #else + if (LA_steps > 0) + NORM_E_DIR(stepper_extruder); + else if (LA_steps < 0) + REV_E_DIR(stepper_extruder); + #endif + + DIR_WAIT_AFTER(); + + //const hal_timer_t added_step_ticks = hal_timer_t(ADDED_STEP_TICKS); + + // Step E stepper if we have steps + #if ISR_MULTI_STEPS + bool firstStep = true; + USING_TIMED_PULSE(); + #endif + + while (LA_steps) { + #if ISR_MULTI_STEPS + if (firstStep) + firstStep = false; + else + AWAIT_LOW_PULSE(); + #endif + + // Set the STEP pulse ON + #if ENABLED(MIXING_EXTRUDER) + E_STEP_WRITE(mixer.get_next_stepper(), !INVERT_E_STEP_PIN); + #else + E_STEP_WRITE(stepper_extruder, !INVERT_E_STEP_PIN); + #endif + + // Enforce a minimum duration for STEP pulse ON + #if ISR_PULSE_CONTROL + START_HIGH_PULSE(); + #endif + + LA_steps < 0 ? ++LA_steps : --LA_steps; + + #if ISR_PULSE_CONTROL + AWAIT_HIGH_PULSE(); + #endif + + // Set the STEP pulse OFF + #if ENABLED(MIXING_EXTRUDER) + E_STEP_WRITE(mixer.get_stepper(), INVERT_E_STEP_PIN); + #else + E_STEP_WRITE(stepper_extruder, INVERT_E_STEP_PIN); + #endif + + // For minimum pulse time wait before looping + // Just wait for the requested pulse duration + #if ISR_PULSE_CONTROL + if (LA_steps) START_LOW_PULSE(); + #endif + } // LA_steps + + return interval; + } + +#endif // LIN_ADVANCE + +#if ENABLED(INTEGRATED_BABYSTEPPING) + + // Timer interrupt for baby-stepping + uint32_t Stepper::babystepping_isr() { + babystep.task(); + return babystep.has_steps() ? BABYSTEP_TICKS : BABYSTEP_NEVER; + } + +#endif + +// Check if the given block is busy or not - Must not be called from ISR contexts +// The current_block could change in the middle of the read by an Stepper ISR, so +// we must explicitly prevent that! +bool Stepper::is_block_busy(const block_t* const block) { + #ifdef __AVR__ + // A SW memory barrier, to ensure GCC does not overoptimize loops + #define sw_barrier() asm volatile("": : :"memory"); + + // Keep reading until 2 consecutive reads return the same value, + // meaning there was no update in-between caused by an interrupt. + // This works because stepper ISRs happen at a slower rate than + // successive reads of a variable, so 2 consecutive reads with + // the same value means no interrupt updated it. + block_t* vold, *vnew = current_block; + sw_barrier(); + do { + vold = vnew; + vnew = current_block; + sw_barrier(); + } while (vold != vnew); + #else + block_t *vnew = current_block; + #endif + + // Return if the block is busy or not + return block == vnew; +} + +void Stepper::init() { + + #if MB(ALLIGATOR) + const float motor_current[] = MOTOR_CURRENT; + unsigned int digipot_motor = 0; + LOOP_L_N(i, 3 + EXTRUDERS) { + digipot_motor = 255 * (motor_current[i] / 2.5); + dac084s085::setValue(i, digipot_motor); + } + #endif + + // Init Microstepping Pins + TERN_(HAS_MICROSTEPS, microstep_init()); + + // Init Dir Pins + TERN_(HAS_X_DIR, X_DIR_INIT()); + TERN_(HAS_X2_DIR, X2_DIR_INIT()); + #if HAS_Y_DIR + Y_DIR_INIT(); + #if BOTH(Y_DUAL_STEPPER_DRIVERS, HAS_Y2_DIR) + Y2_DIR_INIT(); + #endif + #endif + #if HAS_Z_DIR + Z_DIR_INIT(); + #if NUM_Z_STEPPER_DRIVERS >= 2 && HAS_Z2_DIR + Z2_DIR_INIT(); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 && HAS_Z3_DIR + Z3_DIR_INIT(); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 && HAS_Z4_DIR + Z4_DIR_INIT(); + #endif + #endif + #if HAS_E0_DIR + E0_DIR_INIT(); + #endif + #if HAS_E1_DIR + E1_DIR_INIT(); + #endif + #if HAS_E2_DIR + E2_DIR_INIT(); + #endif + #if HAS_E3_DIR + E3_DIR_INIT(); + #endif + #if HAS_E4_DIR + E4_DIR_INIT(); + #endif + #if HAS_E5_DIR + E5_DIR_INIT(); + #endif + #if HAS_E6_DIR + E6_DIR_INIT(); + #endif + #if HAS_E7_DIR + E7_DIR_INIT(); + #endif + + // Init Enable Pins - steppers default to disabled. + #if HAS_X_ENABLE + X_ENABLE_INIT(); + if (!X_ENABLE_ON) X_ENABLE_WRITE(HIGH); + #if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) && HAS_X2_ENABLE + X2_ENABLE_INIT(); + if (!X_ENABLE_ON) X2_ENABLE_WRITE(HIGH); + #endif + #endif + #if HAS_Y_ENABLE + Y_ENABLE_INIT(); + if (!Y_ENABLE_ON) Y_ENABLE_WRITE(HIGH); + #if BOTH(Y_DUAL_STEPPER_DRIVERS, HAS_Y2_ENABLE) + Y2_ENABLE_INIT(); + if (!Y_ENABLE_ON) Y2_ENABLE_WRITE(HIGH); + #endif + #endif + #if HAS_Z_ENABLE + Z_ENABLE_INIT(); + if (!Z_ENABLE_ON) Z_ENABLE_WRITE(HIGH); + #if NUM_Z_STEPPER_DRIVERS >= 2 && HAS_Z2_ENABLE + Z2_ENABLE_INIT(); + if (!Z_ENABLE_ON) Z2_ENABLE_WRITE(HIGH); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 && HAS_Z3_ENABLE + Z3_ENABLE_INIT(); + if (!Z_ENABLE_ON) Z3_ENABLE_WRITE(HIGH); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 && HAS_Z4_ENABLE + Z4_ENABLE_INIT(); + if (!Z_ENABLE_ON) Z4_ENABLE_WRITE(HIGH); + #endif + #endif + #if HAS_E0_ENABLE + E0_ENABLE_INIT(); + if (!E_ENABLE_ON) E0_ENABLE_WRITE(HIGH); + #endif + #if HAS_E1_ENABLE + E1_ENABLE_INIT(); + if (!E_ENABLE_ON) E1_ENABLE_WRITE(HIGH); + #endif + #if HAS_E2_ENABLE + E2_ENABLE_INIT(); + if (!E_ENABLE_ON) E2_ENABLE_WRITE(HIGH); + #endif + #if HAS_E3_ENABLE + E3_ENABLE_INIT(); + if (!E_ENABLE_ON) E3_ENABLE_WRITE(HIGH); + #endif + #if HAS_E4_ENABLE + E4_ENABLE_INIT(); + if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH); + #endif + #if HAS_E5_ENABLE + E5_ENABLE_INIT(); + if (!E_ENABLE_ON) E5_ENABLE_WRITE(HIGH); + #endif + #if HAS_E6_ENABLE + E6_ENABLE_INIT(); + if (!E_ENABLE_ON) E6_ENABLE_WRITE(HIGH); + #endif + #if HAS_E7_ENABLE + E7_ENABLE_INIT(); + if (!E_ENABLE_ON) E7_ENABLE_WRITE(HIGH); + #endif + + #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT() + #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) + #define _DISABLE_AXIS(AXIS) DISABLE_AXIS_## AXIS() + + #define AXIS_INIT(AXIS, PIN) \ + _STEP_INIT(AXIS); \ + _WRITE_STEP(AXIS, _INVERT_STEP_PIN(PIN)); \ + _DISABLE_AXIS(AXIS) + + #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) + + // Init Step Pins + #if HAS_X_STEP + #if EITHER(X_DUAL_STEPPER_DRIVERS, DUAL_X_CARRIAGE) + X2_STEP_INIT(); + X2_STEP_WRITE(INVERT_X_STEP_PIN); + #endif + AXIS_INIT(X, X); + #endif + + #if HAS_Y_STEP + #if ENABLED(Y_DUAL_STEPPER_DRIVERS) + Y2_STEP_INIT(); + Y2_STEP_WRITE(INVERT_Y_STEP_PIN); + #endif + AXIS_INIT(Y, Y); + #endif + + #if HAS_Z_STEP + #if NUM_Z_STEPPER_DRIVERS >= 2 + Z2_STEP_INIT(); + Z2_STEP_WRITE(INVERT_Z_STEP_PIN); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 3 + Z3_STEP_INIT(); + Z3_STEP_WRITE(INVERT_Z_STEP_PIN); + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + Z4_STEP_INIT(); + Z4_STEP_WRITE(INVERT_Z_STEP_PIN); + #endif + AXIS_INIT(Z, Z); + #endif + + #if E_STEPPERS && HAS_E0_STEP + E_AXIS_INIT(0); + #endif + #if E_STEPPERS > 1 && HAS_E1_STEP + E_AXIS_INIT(1); + #endif + #if E_STEPPERS > 2 && HAS_E2_STEP + E_AXIS_INIT(2); + #endif + #if E_STEPPERS > 3 && HAS_E3_STEP + E_AXIS_INIT(3); + #endif + #if E_STEPPERS > 4 && HAS_E4_STEP + E_AXIS_INIT(4); + #endif + #if E_STEPPERS > 5 && HAS_E5_STEP + E_AXIS_INIT(5); + #endif + #if E_STEPPERS > 6 && HAS_E6_STEP + E_AXIS_INIT(6); + #endif + #if E_STEPPERS > 7 && HAS_E7_STEP + E_AXIS_INIT(7); + #endif + + #if DISABLED(I2S_STEPPER_STREAM) + HAL_timer_start(STEP_TIMER_NUM, 122); // Init Stepper ISR to 122 Hz for quick starting + wake_up(); + sei(); + #endif + + // Init direction bits for first moves + last_direction_bits = 0 + | (INVERT_X_DIR ? _BV(X_AXIS) : 0) + | (INVERT_Y_DIR ? _BV(Y_AXIS) : 0) + | (INVERT_Z_DIR ? _BV(Z_AXIS) : 0); + + set_directions(); + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + initialized = true; + digipot_init(); + #endif +} + +/** + * Set the stepper positions directly in steps + * + * The input is based on the typical per-axis XYZ steps. + * For CORE machines XYZ needs to be translated to ABC. + * + * This allows get_axis_position_mm to correctly + * derive the current XYZ position later on. + */ +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 https://www.corexy.com/theory.html + count_position.set(a + b, CORESIGN(a - b), c); + #elif CORE_IS_XZ + // corexz planning + count_position.set(a + c, b, CORESIGN(a - 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); + #endif + count_position.e = e; +} + +/** + * Get a stepper's position in steps. + */ +int32_t Stepper::position(const AxisEnum axis) { + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = suspend(); + #endif + + const int32_t v = count_position[axis]; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) wake_up(); + #endif + return v; +} + +// Set the current position in steps +void Stepper::set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e) { + planner.synchronize(); + const bool was_enabled = suspend(); + _set_position(a, b, c, e); + if (was_enabled) wake_up(); +} + +void Stepper::set_axis_position(const AxisEnum a, const int32_t &v) { + planner.synchronize(); + + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = suspend(); + #endif + + count_position[a] = v; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) wake_up(); + #endif +} + +// Signal endstops were triggered - This function can be called from +// an ISR context (Temperature, Stepper or limits ISR), so we must +// be very careful here. If the interrupt being preempted was the +// Stepper ISR (this CAN happen with the endstop limits ISR) then +// when the stepper ISR resumes, we must be very sure that the movement +// is properly canceled +void Stepper::endstop_triggered(const AxisEnum axis) { + + const bool was_enabled = suspend(); + endstops_trigsteps[axis] = ( + #if IS_CORE + (axis == CORE_AXIS_2 + ? 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 + ); + + // Discard the rest of the move if there is a current block + quick_stop(); + + if (was_enabled) wake_up(); +} + +int32_t Stepper::triggered_position(const AxisEnum axis) { + #ifdef __AVR__ + // Protect the access to the position. Only required for AVR, as + // any 32bit CPU offers atomic access to 32bit variables + const bool was_enabled = suspend(); + #endif + + const int32_t v = endstops_trigsteps[axis]; + + #ifdef __AVR__ + // Reenable Stepper ISR + if (was_enabled) wake_up(); + #endif + + return v; +} + +void Stepper::report_a_position(const xyz_long_t &pos) { + #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 ANY(CORE_IS_XZ, CORE_IS_YZ, DELTA) + SERIAL_ECHOLNPAIR(" C:", pos.z); + #else + SERIAL_ECHOLNPAIR_P(SP_Z_LBL, pos.z); + #endif +} + +void Stepper::report_positions() { + + #ifdef __AVR__ + // Protect the access to the position. + const bool was_enabled = suspend(); + #endif + + const xyz_long_t pos = count_position; + + #ifdef __AVR__ + if (was_enabled) wake_up(); + #endif + + report_a_position(pos); +} + +#if ENABLED(BABYSTEPPING) + + #define _ENABLE_AXIS(AXIS) ENABLE_AXIS_## AXIS() + #define _READ_DIR(AXIS) AXIS ##_DIR_READ() + #define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR + #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) + + #if MINIMUM_STEPPER_PULSE + #define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND) + #else + #define STEP_PULSE_CYCLES 0 + #endif + + #if ENABLED(DELTA) + #define CYCLES_EATEN_BABYSTEP (2 * 15) + #else + #define CYCLES_EATEN_BABYSTEP 0 + #endif + #define EXTRA_CYCLES_BABYSTEP (STEP_PULSE_CYCLES - (CYCLES_EATEN_BABYSTEP)) + + #if EXTRA_CYCLES_BABYSTEP > 20 + #define _SAVE_START() const hal_timer_t pulse_start = HAL_timer_get_count(PULSE_TIMER_NUM) + #define _PULSE_WAIT() while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ } + #else + #define _SAVE_START() NOOP + #if EXTRA_CYCLES_BABYSTEP > 0 + #define _PULSE_WAIT() DELAY_NS(EXTRA_CYCLES_BABYSTEP * NANOSECONDS_PER_CYCLE) + #elif ENABLED(DELTA) + #define _PULSE_WAIT() DELAY_US(2); + #elif STEP_PULSE_CYCLES > 0 + #define _PULSE_WAIT() NOOP + #else + #define _PULSE_WAIT() DELAY_US(4); + #endif + #endif + + #if ENABLED(BABYSTEPPING_EXTRA_DIR_WAIT) + #define EXTRA_DIR_WAIT_BEFORE DIR_WAIT_BEFORE + #define EXTRA_DIR_WAIT_AFTER DIR_WAIT_AFTER + #else + #define EXTRA_DIR_WAIT_BEFORE() + #define EXTRA_DIR_WAIT_AFTER() + #endif + + #if DISABLED(DELTA) + + #define BABYSTEP_AXIS(AXIS, INV, DIR) do{ \ + const uint8_t old_dir = _READ_DIR(AXIS); \ + _ENABLE_AXIS(AXIS); \ + DIR_WAIT_BEFORE(); \ + _APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^DIR^INV); \ + DIR_WAIT_AFTER(); \ + _SAVE_START(); \ + _APPLY_STEP(AXIS, !_INVERT_STEP_PIN(AXIS), true); \ + _PULSE_WAIT(); \ + _APPLY_STEP(AXIS, _INVERT_STEP_PIN(AXIS), true); \ + EXTRA_DIR_WAIT_BEFORE(); \ + _APPLY_DIR(AXIS, old_dir); \ + EXTRA_DIR_WAIT_AFTER(); \ + }while(0) + + #endif + + #if IS_CORE + + #define BABYSTEP_CORE(A, B, INV, DIR, ALT) do{ \ + const xy_byte_t old_dir = { _READ_DIR(A), _READ_DIR(B) }; \ + _ENABLE_AXIS(A); _ENABLE_AXIS(B); \ + DIR_WAIT_BEFORE(); \ + _APPLY_DIR(A, _INVERT_DIR(A)^DIR^INV); \ + _APPLY_DIR(B, _INVERT_DIR(B)^DIR^INV^ALT); \ + DIR_WAIT_AFTER(); \ + _SAVE_START(); \ + _APPLY_STEP(A, !_INVERT_STEP_PIN(A), true); \ + _APPLY_STEP(B, !_INVERT_STEP_PIN(B), true); \ + _PULSE_WAIT(); \ + _APPLY_STEP(A, _INVERT_STEP_PIN(A), true); \ + _APPLY_STEP(B, _INVERT_STEP_PIN(B), true); \ + EXTRA_DIR_WAIT_BEFORE(); \ + _APPLY_DIR(A, old_dir.a); _APPLY_DIR(B, old_dir.b); \ + EXTRA_DIR_WAIT_AFTER(); \ + }while(0) + + #endif + + // MUST ONLY BE CALLED BY AN ISR, + // No other ISR should ever interrupt this! + void Stepper::do_babystep(const AxisEnum axis, const bool direction) { + + #if DISABLED(INTEGRATED_BABYSTEPPING) + cli(); + #endif + + switch (axis) { + + #if ENABLED(BABYSTEP_XY) + + case X_AXIS: + #if CORE_IS_XY + BABYSTEP_CORE(X, Y, 0, direction, 0); + #elif CORE_IS_XZ + BABYSTEP_CORE(X, Z, 0, direction, 0); + #else + BABYSTEP_AXIS(X, 0, direction); + #endif + break; + + case Y_AXIS: + #if CORE_IS_XY + BABYSTEP_CORE(X, Y, 1, !direction, (CORESIGN(1)>0)); + #elif CORE_IS_YZ + BABYSTEP_CORE(Y, Z, 0, direction, (CORESIGN(1)<0)); + #else + BABYSTEP_AXIS(Y, 0, direction); + #endif + break; + + #endif + + case Z_AXIS: { + + #if CORE_IS_XZ + BABYSTEP_CORE(X, Z, BABYSTEP_INVERT_Z, direction, (CORESIGN(1)<0)); + #elif CORE_IS_YZ + BABYSTEP_CORE(Y, Z, BABYSTEP_INVERT_Z, direction, (CORESIGN(1)<0)); + #elif DISABLED(DELTA) + BABYSTEP_AXIS(Z, BABYSTEP_INVERT_Z, direction); + + #else // DELTA + + const bool z_direction = direction ^ BABYSTEP_INVERT_Z; + + ENABLE_AXIS_X(); + ENABLE_AXIS_Y(); + ENABLE_AXIS_Z(); + + DIR_WAIT_BEFORE(); + + const xyz_byte_t old_dir = { X_DIR_READ(), Y_DIR_READ(), Z_DIR_READ() }; + + X_DIR_WRITE(INVERT_X_DIR ^ z_direction); + Y_DIR_WRITE(INVERT_Y_DIR ^ z_direction); + Z_DIR_WRITE(INVERT_Z_DIR ^ z_direction); + + DIR_WAIT_AFTER(); + + _SAVE_START(); + + X_STEP_WRITE(!INVERT_X_STEP_PIN); + Y_STEP_WRITE(!INVERT_Y_STEP_PIN); + Z_STEP_WRITE(!INVERT_Z_STEP_PIN); + + _PULSE_WAIT(); + + X_STEP_WRITE(INVERT_X_STEP_PIN); + Y_STEP_WRITE(INVERT_Y_STEP_PIN); + Z_STEP_WRITE(INVERT_Z_STEP_PIN); + + // Restore direction bits + EXTRA_DIR_WAIT_BEFORE(); + + X_DIR_WRITE(old_dir.x); + Y_DIR_WRITE(old_dir.y); + Z_DIR_WRITE(old_dir.z); + + EXTRA_DIR_WAIT_AFTER(); + + #endif + + } break; + + default: break; + } + + #if DISABLED(INTEGRATED_BABYSTEPPING) + sei(); + #endif + } + +#endif // BABYSTEPPING + +/** + * Software-controlled Stepper Motor Current + */ + +#if HAS_MOTOR_CURRENT_SPI + + // From Arduino DigitalPotControl example + void Stepper::set_digipot_value_spi(const int16_t address, const int16_t value) { + WRITE(DIGIPOTSS_PIN, LOW); // Take the SS pin low to select the chip + SPI.transfer(address); // Send the address and value via SPI + SPI.transfer(value); + WRITE(DIGIPOTSS_PIN, HIGH); // Take the SS pin high to de-select the chip + //delay(10); + } + +#endif // HAS_MOTOR_CURRENT_SPI + +#if HAS_MOTOR_CURRENT_PWM + + void Stepper::refresh_motor_power() { + if (!initialized) return; + LOOP_L_N(i, COUNT(motor_current_setting)) { + switch (i) { + #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) + case 0: + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + case 1: + #endif + #if ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_E0, MOTOR_CURRENT_PWM_E1) + case 2: + #endif + set_digipot_current(i, motor_current_setting[i]); + default: break; + } + } + } + +#endif // HAS_MOTOR_CURRENT_PWM + +#if !MB(PRINTRBOARD_G2) + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + + void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { + if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) + motor_current_setting[driver] = current; // update motor_current_setting + + if (!initialized) return; + + #if HAS_MOTOR_CURRENT_SPI + + //SERIAL_ECHOLNPAIR("Digipotss current ", current); + + const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; + set_digipot_value_spi(digipot_ch[driver], current); + + #elif HAS_MOTOR_CURRENT_PWM + + #define _WRITE_CURRENT_PWM(P) analogWrite(pin_t(MOTOR_CURRENT_PWM_## P ##_PIN), 255L * current / (MOTOR_CURRENT_PWM_RANGE)) + switch (driver) { + case 0: + #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) + _WRITE_CURRENT_PWM(X); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) + _WRITE_CURRENT_PWM(Y); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + _WRITE_CURRENT_PWM(XY); + #endif + break; + case 1: + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + _WRITE_CURRENT_PWM(Z); + #endif + break; + case 2: + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + _WRITE_CURRENT_PWM(E); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) + _WRITE_CURRENT_PWM(E0); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E1) + _WRITE_CURRENT_PWM(E1); + #endif + break; + } + #endif + } + + void Stepper::digipot_init() { + + #if HAS_MOTOR_CURRENT_SPI + + SPI.begin(); + SET_OUTPUT(DIGIPOTSS_PIN); + + LOOP_L_N(i, COUNT(motor_current_setting)) + set_digipot_current(i, motor_current_setting[i]); + + #elif HAS_MOTOR_CURRENT_PWM + + #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) + SET_PWM(MOTOR_CURRENT_PWM_X_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) + SET_PWM(MOTOR_CURRENT_PWM_Y_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + SET_PWM(MOTOR_CURRENT_PWM_XY_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + SET_PWM(MOTOR_CURRENT_PWM_Z_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + SET_PWM(MOTOR_CURRENT_PWM_E_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) + SET_PWM(MOTOR_CURRENT_PWM_E0_PIN); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E1) + SET_PWM(MOTOR_CURRENT_PWM_E1_PIN); + #endif + + refresh_motor_power(); + + // Set Timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) + #ifdef __AVR__ + SET_CS5(PRESCALER_1); + #endif + #endif + } + + #endif + +#else // PRINTRBOARD_G2 + + #include HAL_PATH(../HAL, fastio/G2_PWM.h) + +#endif + +#if HAS_MICROSTEPS + + /** + * Software-controlled Microstepping + */ + + void Stepper::microstep_init() { + #if HAS_X_MS_PINS + SET_OUTPUT(X_MS1_PIN); + SET_OUTPUT(X_MS2_PIN); + #if PIN_EXISTS(X_MS3) + SET_OUTPUT(X_MS3_PIN); + #endif + #endif + #if HAS_X2_MS_PINS + SET_OUTPUT(X2_MS1_PIN); + SET_OUTPUT(X2_MS2_PIN); + #if PIN_EXISTS(X2_MS3) + SET_OUTPUT(X2_MS3_PIN); + #endif + #endif + #if HAS_Y_MS_PINS + SET_OUTPUT(Y_MS1_PIN); + SET_OUTPUT(Y_MS2_PIN); + #if PIN_EXISTS(Y_MS3) + SET_OUTPUT(Y_MS3_PIN); + #endif + #endif + #if HAS_Y2_MS_PINS + SET_OUTPUT(Y2_MS1_PIN); + SET_OUTPUT(Y2_MS2_PIN); + #if PIN_EXISTS(Y2_MS3) + SET_OUTPUT(Y2_MS3_PIN); + #endif + #endif + #if HAS_Z_MS_PINS + SET_OUTPUT(Z_MS1_PIN); + SET_OUTPUT(Z_MS2_PIN); + #if PIN_EXISTS(Z_MS3) + SET_OUTPUT(Z_MS3_PIN); + #endif + #endif + #if HAS_Z2_MS_PINS + SET_OUTPUT(Z2_MS1_PIN); + SET_OUTPUT(Z2_MS2_PIN); + #if PIN_EXISTS(Z2_MS3) + SET_OUTPUT(Z2_MS3_PIN); + #endif + #endif + #if HAS_Z3_MS_PINS + SET_OUTPUT(Z3_MS1_PIN); + SET_OUTPUT(Z3_MS2_PIN); + #if PIN_EXISTS(Z3_MS3) + SET_OUTPUT(Z3_MS3_PIN); + #endif + #endif + #if HAS_Z4_MS_PINS + SET_OUTPUT(Z4_MS1_PIN); + SET_OUTPUT(Z4_MS2_PIN); + #if PIN_EXISTS(Z4_MS3) + SET_OUTPUT(Z4_MS3_PIN); + #endif + #endif + #if HAS_E0_MS_PINS + SET_OUTPUT(E0_MS1_PIN); + SET_OUTPUT(E0_MS2_PIN); + #if PIN_EXISTS(E0_MS3) + SET_OUTPUT(E0_MS3_PIN); + #endif + #endif + #if HAS_E1_MS_PINS + SET_OUTPUT(E1_MS1_PIN); + SET_OUTPUT(E1_MS2_PIN); + #if PIN_EXISTS(E1_MS3) + SET_OUTPUT(E1_MS3_PIN); + #endif + #endif + #if HAS_E2_MS_PINS + SET_OUTPUT(E2_MS1_PIN); + SET_OUTPUT(E2_MS2_PIN); + #if PIN_EXISTS(E2_MS3) + SET_OUTPUT(E2_MS3_PIN); + #endif + #endif + #if HAS_E3_MS_PINS + SET_OUTPUT(E3_MS1_PIN); + SET_OUTPUT(E3_MS2_PIN); + #if PIN_EXISTS(E3_MS3) + SET_OUTPUT(E3_MS3_PIN); + #endif + #endif + #if HAS_E4_MS_PINS + SET_OUTPUT(E4_MS1_PIN); + SET_OUTPUT(E4_MS2_PIN); + #if PIN_EXISTS(E4_MS3) + SET_OUTPUT(E4_MS3_PIN); + #endif + #endif + #if HAS_E5_MS_PINS + SET_OUTPUT(E5_MS1_PIN); + SET_OUTPUT(E5_MS2_PIN); + #if PIN_EXISTS(E5_MS3) + SET_OUTPUT(E5_MS3_PIN); + #endif + #endif + #if HAS_E6_MS_PINS + SET_OUTPUT(E6_MS1_PIN); + SET_OUTPUT(E6_MS2_PIN); + #if PIN_EXISTS(E6_MS3) + SET_OUTPUT(E6_MS3_PIN); + #endif + #endif + #if HAS_E7_MS_PINS + SET_OUTPUT(E7_MS1_PIN); + SET_OUTPUT(E7_MS2_PIN); + #if PIN_EXISTS(E7_MS3) + SET_OUTPUT(E7_MS3_PIN); + #endif + #endif + + static const uint8_t microstep_modes[] = MICROSTEP_MODES; + for (uint16_t i = 0; i < COUNT(microstep_modes); i++) + microstep_mode(i, microstep_modes[i]); + } + + void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3) { + if (ms1 >= 0) switch (driver) { + #if HAS_X_MS_PINS || HAS_X2_MS_PINS + case 0: + #if HAS_X_MS_PINS + WRITE(X_MS1_PIN, ms1); + #endif + #if HAS_X2_MS_PINS + WRITE(X2_MS1_PIN, ms1); + #endif + break; + #endif + #if HAS_Y_MS_PINS || HAS_Y2_MS_PINS + case 1: + #if HAS_Y_MS_PINS + WRITE(Y_MS1_PIN, ms1); + #endif + #if HAS_Y2_MS_PINS + WRITE(Y2_MS1_PIN, ms1); + #endif + break; + #endif + #if HAS_SOME_Z_MS_PINS + case 2: + #if HAS_Z_MS_PINS + WRITE(Z_MS1_PIN, ms1); + #endif + #if HAS_Z2_MS_PINS + WRITE(Z2_MS1_PIN, ms1); + #endif + #if HAS_Z3_MS_PINS + WRITE(Z3_MS1_PIN, ms1); + #endif + #if HAS_Z4_MS_PINS + WRITE(Z4_MS1_PIN, ms1); + #endif + break; + #endif + #if HAS_E0_MS_PINS + case 3: WRITE(E0_MS1_PIN, ms1); break; + #endif + #if HAS_E1_MS_PINS + case 4: WRITE(E1_MS1_PIN, ms1); break; + #endif + #if HAS_E2_MS_PINS + case 5: WRITE(E2_MS1_PIN, ms1); break; + #endif + #if HAS_E3_MS_PINS + case 6: WRITE(E3_MS1_PIN, ms1); break; + #endif + #if HAS_E4_MS_PINS + case 7: WRITE(E4_MS1_PIN, ms1); break; + #endif + #if HAS_E5_MS_PINS + case 8: WRITE(E5_MS1_PIN, ms1); break; + #endif + #if HAS_E6_MS_PINS + case 9: WRITE(E6_MS1_PIN, ms1); break; + #endif + #if HAS_E7_MS_PINS + case 10: WRITE(E7_MS1_PIN, ms1); break; + #endif + } + if (ms2 >= 0) switch (driver) { + #if HAS_X_MS_PINS || HAS_X2_MS_PINS + case 0: + #if HAS_X_MS_PINS + WRITE(X_MS2_PIN, ms2); + #endif + #if HAS_X2_MS_PINS + WRITE(X2_MS2_PIN, ms2); + #endif + break; + #endif + #if HAS_Y_MS_PINS || HAS_Y2_MS_PINS + case 1: + #if HAS_Y_MS_PINS + WRITE(Y_MS2_PIN, ms2); + #endif + #if HAS_Y2_MS_PINS + WRITE(Y2_MS2_PIN, ms2); + #endif + break; + #endif + #if HAS_SOME_Z_MS_PINS + case 2: + #if HAS_Z_MS_PINS + WRITE(Z_MS2_PIN, ms2); + #endif + #if HAS_Z2_MS_PINS + WRITE(Z2_MS2_PIN, ms2); + #endif + #if HAS_Z3_MS_PINS + WRITE(Z3_MS2_PIN, ms2); + #endif + #if HAS_Z4_MS_PINS + WRITE(Z4_MS2_PIN, ms2); + #endif + break; + #endif + #if HAS_E0_MS_PINS + case 3: WRITE(E0_MS2_PIN, ms2); break; + #endif + #if HAS_E1_MS_PINS + case 4: WRITE(E1_MS2_PIN, ms2); break; + #endif + #if HAS_E2_MS_PINS + case 5: WRITE(E2_MS2_PIN, ms2); break; + #endif + #if HAS_E3_MS_PINS + case 6: WRITE(E3_MS2_PIN, ms2); break; + #endif + #if HAS_E4_MS_PINS + case 7: WRITE(E4_MS2_PIN, ms2); break; + #endif + #if HAS_E5_MS_PINS + case 8: WRITE(E5_MS2_PIN, ms2); break; + #endif + #if HAS_E6_MS_PINS + case 9: WRITE(E6_MS2_PIN, ms2); break; + #endif + #if HAS_E7_MS_PINS + case 10: WRITE(E7_MS2_PIN, ms2); break; + #endif + } + if (ms3 >= 0) switch (driver) { + #if HAS_X_MS_PINS || HAS_X2_MS_PINS + case 0: + #if HAS_X_MS_PINS && PIN_EXISTS(X_MS3) + WRITE(X_MS3_PIN, ms3); + #endif + #if HAS_X2_MS_PINS && PIN_EXISTS(X2_MS3) + WRITE(X2_MS3_PIN, ms3); + #endif + break; + #endif + #if HAS_Y_MS_PINS || HAS_Y2_MS_PINS + case 1: + #if HAS_Y_MS_PINS && PIN_EXISTS(Y_MS3) + WRITE(Y_MS3_PIN, ms3); + #endif + #if HAS_Y2_MS_PINS && PIN_EXISTS(Y2_MS3) + WRITE(Y2_MS3_PIN, ms3); + #endif + break; + #endif + #if HAS_SOME_Z_MS_PINS + case 2: + #if HAS_Z_MS_PINS && PIN_EXISTS(Z_MS3) + WRITE(Z_MS3_PIN, ms3); + #endif + #if HAS_Z2_MS_PINS && PIN_EXISTS(Z2_MS3) + WRITE(Z2_MS3_PIN, ms3); + #endif + #if HAS_Z3_MS_PINS && PIN_EXISTS(Z3_MS3) + WRITE(Z3_MS3_PIN, ms3); + #endif + #if HAS_Z4_MS_PINS && PIN_EXISTS(Z4_MS3) + WRITE(Z4_MS3_PIN, ms3); + #endif + break; + #endif + #if HAS_E0_MS_PINS && PIN_EXISTS(E0_MS3) + case 3: WRITE(E0_MS3_PIN, ms3); break; + #endif + #if HAS_E1_MS_PINS && PIN_EXISTS(E1_MS3) + case 4: WRITE(E1_MS3_PIN, ms3); break; + #endif + #if HAS_E2_MS_PINS && PIN_EXISTS(E2_MS3) + case 5: WRITE(E2_MS3_PIN, ms3); break; + #endif + #if HAS_E3_MS_PINS && PIN_EXISTS(E3_MS3) + case 6: WRITE(E3_MS3_PIN, ms3); break; + #endif + #if HAS_E4_MS_PINS && PIN_EXISTS(E4_MS3) + case 7: WRITE(E4_MS3_PIN, ms3); break; + #endif + #if HAS_E5_MS_PINS && PIN_EXISTS(E5_MS3) + case 8: WRITE(E5_MS3_PIN, ms3); break; + #endif + #if HAS_E6_MS_PINS && PIN_EXISTS(E6_MS3) + case 9: WRITE(E6_MS3_PIN, ms3); break; + #endif + #if HAS_E7_MS_PINS && PIN_EXISTS(E7_MS3) + case 10: WRITE(E7_MS3_PIN, ms3); break; + #endif + } + } + + void Stepper::microstep_mode(const uint8_t driver, const uint8_t stepping_mode) { + switch (stepping_mode) { + #if HAS_MICROSTEP1 + case 1: microstep_ms(driver, MICROSTEP1); break; + #endif + #if HAS_MICROSTEP2 + case 2: microstep_ms(driver, MICROSTEP2); break; + #endif + #if HAS_MICROSTEP4 + case 4: microstep_ms(driver, MICROSTEP4); break; + #endif + #if HAS_MICROSTEP8 + case 8: microstep_ms(driver, MICROSTEP8); break; + #endif + #if HAS_MICROSTEP16 + case 16: microstep_ms(driver, MICROSTEP16); break; + #endif + #if HAS_MICROSTEP32 + case 32: microstep_ms(driver, MICROSTEP32); break; + #endif + #if HAS_MICROSTEP64 + case 64: microstep_ms(driver, MICROSTEP64); break; + #endif + #if HAS_MICROSTEP128 + case 128: microstep_ms(driver, MICROSTEP128); break; + #endif + + default: SERIAL_ERROR_MSG("Microsteps unavailable"); break; + } + } + + void Stepper::microstep_readings() { + #define PIN_CHAR(P) SERIAL_CHAR('0' + READ(P##_PIN)) + #define MS_LINE(A) do{ SERIAL_ECHOPGM(" " STRINGIFY(A) ":"); PIN_CHAR(A##_MS1); PIN_CHAR(A##_MS2); }while(0) + SERIAL_ECHOPGM("MS1|2|3 Pins"); + #if HAS_X_MS_PINS + MS_LINE(X); + #if PIN_EXISTS(X_MS3) + PIN_CHAR(X_MS3); + #endif + #endif + #if HAS_Y_MS_PINS + MS_LINE(Y); + #if PIN_EXISTS(Y_MS3) + PIN_CHAR(Y_MS3); + #endif + #endif + #if HAS_Z_MS_PINS + MS_LINE(Z); + #if PIN_EXISTS(Z_MS3) + PIN_CHAR(Z_MS3); + #endif + #endif + #if HAS_E0_MS_PINS + MS_LINE(E0); + #if PIN_EXISTS(E0_MS3) + PIN_CHAR(E0_MS3); + #endif + #endif + #if HAS_E1_MS_PINS + MS_LINE(E1); + #if PIN_EXISTS(E1_MS3) + PIN_CHAR(E1_MS3); + #endif + #endif + #if HAS_E2_MS_PINS + MS_LINE(E2); + #if PIN_EXISTS(E2_MS3) + PIN_CHAR(E2_MS3); + #endif + #endif + #if HAS_E3_MS_PINS + MS_LINE(E3); + #if PIN_EXISTS(E3_MS3) + PIN_CHAR(E3_MS3); + #endif + #endif + #if HAS_E4_MS_PINS + MS_LINE(E4); + #if PIN_EXISTS(E4_MS3) + PIN_CHAR(E4_MS3); + #endif + #endif + #if HAS_E5_MS_PINS + MS_LINE(E5); + #if PIN_EXISTS(E5_MS3) + PIN_CHAR(E5_MS3); + #endif + #endif + #if HAS_E6_MS_PINS + MS_LINE(E6); + #if PIN_EXISTS(E6_MS3) + PIN_CHAR(E6_MS3); + #endif + #endif + #if HAS_E7_MS_PINS + MS_LINE(E7); + #if PIN_EXISTS(E7_MS3) + PIN_CHAR(E7_MS3); + #endif + #endif + SERIAL_EOL(); + } + +#endif // HAS_MICROSTEPS diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h new file mode 100644 index 00000000..572c3f3f --- /dev/null +++ b/Marlin/src/module/stepper.h @@ -0,0 +1,601 @@ +/** + * 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 + +/** + * stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors + * Derived from Grbl + * + * Copyright (c) 2009-2011 Simen Svale Skogsrud + * + * Grbl 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. + * + * Grbl 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 Grbl. If not, see . + */ + +#include "../inc/MarlinConfig.h" + +#include "planner.h" +#include "stepper/indirection.h" +#ifdef __AVR__ + #include "speed_lookuptable.h" +#endif + +// Disable multiple steps per ISR +//#define DISABLE_MULTI_STEPPING + +// +// Estimate the amount of time the Stepper ISR will take to execute +// + +/** + * The method of calculating these cycle-constants is unclear. + * Most of them are no longer used directly for pulse timing, and exist + * only to estimate a maximum step rate based on the user's configuration. + * As 32-bit processors continue to diverge, maintaining cycle counts + * will become increasingly difficult and error-prone. + */ + +#ifdef CPU_32_BIT + /** + * Duration of START_TIMED_PULSE + * + * ...as measured on an LPC1768 with a scope and converted to cycles. + * Not applicable to other 32-bit processors, but as long as others + * take longer, pulses will be longer. For example the SKR Pro + * (stm32f407zgt6) requires ~60 cyles. + */ + #define TIMER_READ_ADD_AND_STORE_CYCLES 34UL + + // The base ISR takes 792 cycles + #define ISR_BASE_CYCLES 792UL + + // Linear advance base time is 64 cycles + #if ENABLED(LIN_ADVANCE) + #define ISR_LA_BASE_CYCLES 64UL + #else + #define ISR_LA_BASE_CYCLES 0UL + #endif + + // S curve interpolation adds 40 cycles + #if ENABLED(S_CURVE_ACCELERATION) + #define ISR_S_CURVE_CYCLES 40UL + #else + #define ISR_S_CURVE_CYCLES 0UL + #endif + + // Stepper Loop base cycles + #define ISR_LOOP_BASE_CYCLES 4UL + + // To start the step pulse, in the worst case takes + #define ISR_START_STEPPER_CYCLES 13UL + + // And each stepper (start + stop pulse) takes in worst case + #define ISR_STEPPER_CYCLES 16UL + +#else + // Cycles to perform actions in START_TIMED_PULSE + #define TIMER_READ_ADD_AND_STORE_CYCLES 13UL + + // The base ISR takes 752 cycles + #define ISR_BASE_CYCLES 752UL + + // Linear advance base time is 32 cycles + #if ENABLED(LIN_ADVANCE) + #define ISR_LA_BASE_CYCLES 32UL + #else + #define ISR_LA_BASE_CYCLES 0UL + #endif + + // S curve interpolation adds 160 cycles + #if ENABLED(S_CURVE_ACCELERATION) + #define ISR_S_CURVE_CYCLES 160UL + #else + #define ISR_S_CURVE_CYCLES 0UL + #endif + + // Stepper Loop base cycles + #define ISR_LOOP_BASE_CYCLES 32UL + + // To start the step pulse, in the worst case takes + #define ISR_START_STEPPER_CYCLES 57UL + + // And each stepper (start + stop pulse) takes in worst case + #define ISR_STEPPER_CYCLES 88UL + +#endif + +// Add time for each stepper +#if HAS_X_STEP + #define ISR_X_STEPPER_CYCLES ISR_STEPPER_CYCLES +#else + #define ISR_X_STEPPER_CYCLES 0UL +#endif +#if HAS_Y_STEP + #define ISR_Y_STEPPER_CYCLES ISR_STEPPER_CYCLES +#else + #define ISR_START_Y_STEPPER_CYCLES 0UL + #define ISR_Y_STEPPER_CYCLES 0UL +#endif +#if HAS_Z_STEP + #define ISR_Z_STEPPER_CYCLES ISR_STEPPER_CYCLES +#else + #define ISR_Z_STEPPER_CYCLES 0UL +#endif + +// E is always interpolated, even for mixing extruders +#define ISR_E_STEPPER_CYCLES ISR_STEPPER_CYCLES + +// If linear advance is disabled, the loop also handles them +#if DISABLED(LIN_ADVANCE) && ENABLED(MIXING_EXTRUDER) + #define ISR_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) +#else + #define ISR_MIXING_STEPPER_CYCLES 0UL +#endif + +// And the total minimum loop time, not including the base +#define MIN_ISR_LOOP_CYCLES (ISR_X_STEPPER_CYCLES + ISR_Y_STEPPER_CYCLES + ISR_Z_STEPPER_CYCLES + ISR_E_STEPPER_CYCLES + ISR_MIXING_STEPPER_CYCLES) + +// Calculate the minimum MPU cycles needed per pulse to enforce, limited to the max stepper rate +#define _MIN_STEPPER_PULSE_CYCLES(N) _MAX(uint32_t((F_CPU) / (MAXIMUM_STEPPER_RATE)), ((F_CPU) / 500000UL) * (N)) +#if MINIMUM_STEPPER_PULSE + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(uint32_t(MINIMUM_STEPPER_PULSE)) +#elif HAS_DRIVER(LV8729) + #define MIN_STEPPER_PULSE_CYCLES uint32_t((((F_CPU) - 1) / 2000000) + 1) // 0.5µs, aka 500ns +#else + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(1UL) +#endif + +// Calculate the minimum pulse times (high and low) +#if MINIMUM_STEPPER_PULSE && MAXIMUM_STEPPER_RATE + constexpr uint32_t _MIN_STEP_PERIOD_NS = 1000000000UL / MAXIMUM_STEPPER_RATE; + constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; + constexpr uint32_t _MIN_PULSE_LOW_NS = _MAX((_MIN_STEP_PERIOD_NS - _MIN(_MIN_STEP_PERIOD_NS, _MIN_PULSE_HIGH_NS)), _MIN_PULSE_HIGH_NS); +#elif MINIMUM_STEPPER_PULSE + // Assume 50% duty cycle + constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; + constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; +#elif MAXIMUM_STEPPER_RATE + // Assume 50% duty cycle + constexpr uint32_t _MIN_PULSE_HIGH_NS = 500000000UL / MAXIMUM_STEPPER_RATE; + constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; +#else + #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)) + +// If linear advance is enabled, then it is handled separately +#if ENABLED(LIN_ADVANCE) + + // Estimate the minimum LA loop time + #if ENABLED(MIXING_EXTRUDER) // ToDo: ??? + // HELP ME: What is what? + // Directions are set up for MIXING_STEPPERS - like before. + // Finding the right stepper may last up to MIXING_STEPPERS loops in get_next_stepper(). + // These loops are a bit faster than advancing a bresenham counter. + // Always only one e-stepper is stepped. + #define MIN_ISR_LA_LOOP_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) + #else + #define MIN_ISR_LA_LOOP_CYCLES ISR_STEPPER_CYCLES + #endif + + // And the real loop time + #define ISR_LA_LOOP_CYCLES _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LA_LOOP_CYCLES) + +#else + #define ISR_LA_LOOP_CYCLES 0UL +#endif + +// Now estimate the total ISR execution time in cycles given a step per ISR multiplier +#define ISR_EXECUTION_CYCLES(R) (((ISR_BASE_CYCLES + ISR_S_CURVE_CYCLES + (ISR_LOOP_CYCLES) * (R) + ISR_LA_BASE_CYCLES + ISR_LA_LOOP_CYCLES)) / (R)) + +// The maximum allowable stepping frequency when doing x128-x1 stepping (in Hz) +#define MAX_STEP_ISR_FREQUENCY_128X ((F_CPU) / ISR_EXECUTION_CYCLES(128)) +#define MAX_STEP_ISR_FREQUENCY_64X ((F_CPU) / ISR_EXECUTION_CYCLES(64)) +#define MAX_STEP_ISR_FREQUENCY_32X ((F_CPU) / ISR_EXECUTION_CYCLES(32)) +#define MAX_STEP_ISR_FREQUENCY_16X ((F_CPU) / ISR_EXECUTION_CYCLES(16)) +#define MAX_STEP_ISR_FREQUENCY_8X ((F_CPU) / ISR_EXECUTION_CYCLES(8)) +#define MAX_STEP_ISR_FREQUENCY_4X ((F_CPU) / ISR_EXECUTION_CYCLES(4)) +#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 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 +// +class Stepper { + + public: + + #if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + static bool separate_multi_axis; + #endif + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + #if HAS_MOTOR_CURRENT_PWM + #ifndef PWM_MOTOR_CURRENT + #define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT + #endif + #define MOTOR_CURRENT_COUNT 3 + #elif HAS_MOTOR_CURRENT_SPI + static constexpr uint32_t digipot_count[] = DIGIPOT_MOTOR_CURRENT; + #define MOTOR_CURRENT_COUNT COUNT(Stepper::digipot_count) + #endif + static bool initialized; + static uint32_t motor_current_setting[MOTOR_CURRENT_COUNT]; // Initialized by settings.load() + #endif + + // Last-moved extruder, as set when the last movement was fetched from planner + #if HAS_MULTI_EXTRUDER + static uint8_t last_moved_extruder; + #else + static constexpr uint8_t last_moved_extruder = 0; + #endif + + private: + + static block_t* current_block; // A pointer to the block currently being traced + + static uint8_t last_direction_bits, // The next stepping-bits to be output + axis_did_move; // Last Movement in the given direction is not null, as computed when the last movement was fetched from planner + + static bool abort_current_block; // Signals to the stepper that current block should be aborted + + #if ENABLED(X_DUAL_ENDSTOPS) + static bool locked_X_motor, locked_X2_motor; + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + static bool locked_Y_motor, locked_Y2_motor; + #endif + #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + static bool locked_Z_motor, locked_Z2_motor + #if NUM_Z_STEPPER_DRIVERS >= 3 + , locked_Z3_motor + #if NUM_Z_STEPPER_DRIVERS >= 4 + , locked_Z4_motor + #endif + #endif + ; + #endif + + static uint32_t acceleration_time, deceleration_time; // time measured in Stepper Timer ticks + static uint8_t steps_per_isr; // Count of steps to perform per Stepper ISR call + + #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + static uint8_t oversampling_factor; // Oversampling factor (log2(multiplier)) to increase temporal resolution of axis + #else + static constexpr uint8_t oversampling_factor = 0; + #endif + + // Delta error variables for the Bresenham line tracer + static xyze_long_t delta_error; + static xyze_ulong_t advance_dividend; + static uint32_t advance_divisor, + step_events_completed, // The number of step events executed in the current block + accelerate_until, // The point from where we need to stop acceleration + decelerate_after, // The point from where we need to start decelerating + step_event_count; // The total event count for the current block + + #if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) + static uint8_t stepper_extruder; + #else + static constexpr uint8_t stepper_extruder = 0; + #endif + + #if ENABLED(S_CURVE_ACCELERATION) + static int32_t bezier_A, // A coefficient in Bézier speed curve + bezier_B, // B coefficient in Bézier speed curve + bezier_C; // C coefficient in Bézier speed curve + static uint32_t bezier_F, // F coefficient in Bézier speed curve + bezier_AV; // AV coefficient in Bézier speed curve + #ifdef __AVR__ + static bool A_negative; // If A coefficient was negative + #endif + static bool bezier_2nd_half; // If Bézier curve has been initialized or not + #endif + + #if ENABLED(LIN_ADVANCE) + static constexpr uint32_t LA_ADV_NEVER = 0xFFFFFFFF; + static uint32_t nextAdvanceISR, LA_isr_rate; + static uint16_t LA_current_adv_steps, LA_final_adv_steps, LA_max_adv_steps; // Copy from current executed block. Needed because current_block is set to NULL "too early". + static int8_t LA_steps; + static bool LA_use_advance_lead; + #endif + + #if ENABLED(INTEGRATED_BABYSTEPPING) + static constexpr uint32_t BABYSTEP_NEVER = 0xFFFFFFFF; + static uint32_t nextBabystepISR; + #endif + + #if ENABLED(DIRECT_STEPPING) + static page_step_state_t page_step_state; + #endif + + static int32_t ticks_nominal; + #if DISABLED(S_CURVE_ACCELERATION) + static uint32_t acc_step_rate; // needed for deceleration start point + #endif + + // Exact steps at which an endstop was triggered + static xyz_long_t endstops_trigsteps; + + // Positions of stepper motors, in step units + static xyze_long_t count_position; + + // Current stepper motor directions (+1 or -1) + static xyze_int8_t count_direction; + + #if ENABLED(LASER_POWER_INLINE_TRAPEZOID) + + typedef struct { + bool enabled; // Trapezoid needed flag (i.e., laser on, planner in control) + uint8_t cur_power; // Current laser power + bool cruise_set; // Power set up for cruising? + + #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT) + uint32_t last_step_count, // Step count from the last update + acc_step_count; // Bresenham counter for laser accel/decel + #else + uint16_t till_update; // Countdown to the next update + #endif + } stepper_laser_t; + + static stepper_laser_t laser_trap; + + #endif + + public: + // Initialize stepper hardware + static void init(); + + // Interrupt Service Routine and phases + + // The stepper subsystem goes to sleep when it runs out of things to execute. + // Call this to notify the subsystem that it is time to go to work. + static inline void wake_up() { ENABLE_STEPPER_DRIVER_INTERRUPT(); } + + static inline bool is_awake() { return STEPPER_ISR_ENABLED(); } + + static inline bool suspend() { + const bool awake = is_awake(); + if (awake) DISABLE_STEPPER_DRIVER_INTERRUPT(); + return awake; + } + + // The ISR scheduler + static void isr(); + + // The stepper pulse ISR phase + static void pulse_phase_isr(); + + // The stepper block processing ISR phase + static uint32_t block_phase_isr(); + + #if ENABLED(LIN_ADVANCE) + // The Linear advance ISR phase + static uint32_t advance_isr(); + FORCE_INLINE static void initiateLA() { nextAdvanceISR = 0; } + #endif + + #if ENABLED(INTEGRATED_BABYSTEPPING) + // The Babystepping ISR phase + static uint32_t babystepping_isr(); + FORCE_INLINE static void initiateBabystepping() { + if (nextBabystepISR == BABYSTEP_NEVER) { + nextBabystepISR = 0; + wake_up(); + } + } + #endif + + // Check if the given block is busy or not - Must not be called from ISR contexts + static bool is_block_busy(const block_t* const block); + + // Get the position of a stepper, in steps + static int32_t position(const AxisEnum axis); + + // Set the current position in steps + static void set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); + static inline void set_position(const xyze_long_t &abce) { set_position(abce.a, abce.b, abce.c, abce.e); } + static void set_axis_position(const AxisEnum a, const int32_t &v); + + // Report the positions of the steppers, in steps + static void report_a_position(const xyz_long_t &pos); + static void report_positions(); + + // Discard current block and free any resources + FORCE_INLINE static void discard_current_block() { + #if ENABLED(DIRECT_STEPPING) + if (IS_PAGE(current_block)) + page_manager.free_page(current_block->page_idx); + #endif + current_block = nullptr; + axis_did_move = 0; + planner.release_current_block(); + } + + // Quickly stop all steppers + FORCE_INLINE static void quick_stop() { abort_current_block = true; } + + // The direction of a single motor + FORCE_INLINE static bool motor_direction(const AxisEnum axis) { return TEST(last_direction_bits, axis); } + + // The last movement direction was not null on the specified axis. Note that motor direction is not necessarily the same. + FORCE_INLINE static bool axis_is_moving(const AxisEnum axis) { return TEST(axis_did_move, axis); } + + // Handle a triggered endstop + static void endstop_triggered(const AxisEnum axis); + + // Triggered position of an axis in steps + static int32_t triggered_position(const AxisEnum axis); + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + static void set_digipot_value_spi(const int16_t address, const int16_t value); + static void set_digipot_current(const uint8_t driver, const int16_t current); + #endif + + #if HAS_MICROSTEPS + static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3); + static void microstep_mode(const uint8_t driver, const uint8_t stepping); + static void microstep_readings(); + #endif + + #if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + FORCE_INLINE static void set_separate_multi_axis(const bool state) { separate_multi_axis = state; } + #endif + #if ENABLED(X_DUAL_ENDSTOPS) + FORCE_INLINE static void set_x_lock(const bool state) { locked_X_motor = state; } + FORCE_INLINE static void set_x2_lock(const bool state) { locked_X2_motor = state; } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + FORCE_INLINE static void set_y_lock(const bool state) { locked_Y_motor = state; } + FORCE_INLINE static void set_y2_lock(const bool state) { locked_Y2_motor = state; } + #endif + #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + FORCE_INLINE static void set_z1_lock(const bool state) { locked_Z_motor = state; } + FORCE_INLINE static void set_z2_lock(const bool state) { locked_Z2_motor = state; } + #if NUM_Z_STEPPER_DRIVERS >= 3 + FORCE_INLINE static void set_z3_lock(const bool state) { locked_Z3_motor = state; } + #if NUM_Z_STEPPER_DRIVERS >= 4 + FORCE_INLINE static void set_z4_lock(const bool state) { locked_Z4_motor = state; } + #endif + #endif + static inline void set_all_z_lock(const bool lock, const int8_t except=-1) { + set_z1_lock(lock ^ (except == 0)); + set_z2_lock(lock ^ (except == 1)); + #if NUM_Z_STEPPER_DRIVERS >= 3 + set_z3_lock(lock ^ (except == 2)); + #if NUM_Z_STEPPER_DRIVERS >= 4 + set_z4_lock(lock ^ (except == 3)); + #endif + #endif + } + #endif + + #if ENABLED(BABYSTEPPING) + static void do_babystep(const AxisEnum axis, const bool direction); // perform a short step with a single stepper motor, outside of any convention + #endif + + #if HAS_MOTOR_CURRENT_PWM + static void refresh_motor_power(); + #endif + + // Set direction bits for all steppers + static void set_directions(); + + private: + + // Set the current position in steps + static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); + FORCE_INLINE static void _set_position(const abce_long_t &spos) { _set_position(spos.a, spos.b, spos.c, spos.e); } + + FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t* loops) { + uint32_t timer; + + // Scale the frequency, as requested by the caller + step_rate <<= oversampling_factor; + + uint8_t multistep = 1; + #if DISABLED(DISABLE_MULTI_STEPPING) + + // The stepping frequency limits for each multistepping rate + static const uint32_t limit[] PROGMEM = { + ( MAX_STEP_ISR_FREQUENCY_1X ), + ( MAX_STEP_ISR_FREQUENCY_2X >> 1), + ( MAX_STEP_ISR_FREQUENCY_4X >> 2), + ( MAX_STEP_ISR_FREQUENCY_8X >> 3), + ( MAX_STEP_ISR_FREQUENCY_16X >> 4), + ( MAX_STEP_ISR_FREQUENCY_32X >> 5), + ( MAX_STEP_ISR_FREQUENCY_64X >> 6), + (MAX_STEP_ISR_FREQUENCY_128X >> 7) + }; + + // Select the proper multistepping + uint8_t idx = 0; + while (idx < 7 && step_rate > (uint32_t)pgm_read_dword(&limit[idx])) { + step_rate >>= 1; + multistep <<= 1; + ++idx; + }; + #else + NOMORE(step_rate, uint32_t(MAX_STEP_ISR_FREQUENCY_1X)); + #endif + *loops = multistep; + + #ifdef CPU_32_BIT + // 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; + NOLESS(step_rate, min_step_rate); + step_rate -= min_step_rate; // Correct for minimal speed + if (step_rate >= (8 * 256)) { // higher step rate + const uint8_t tmp_step_rate = (step_rate & 0x00FF); + const uint16_t table_address = (uint16_t)&speed_lookuptable_fast[(uint8_t)(step_rate >> 8)][0], + gain = (uint16_t)pgm_read_word(table_address + 2); + timer = MultiU16X8toH16(tmp_step_rate, gain); + timer = (uint16_t)pgm_read_word(table_address) - timer; + } + else { // lower step rates + uint16_t table_address = (uint16_t)&speed_lookuptable_slow[0][0]; + table_address += ((step_rate) >> 1) & 0xFFFC; + timer = (uint16_t)pgm_read_word(table_address) + - (((uint16_t)pgm_read_word(table_address + 2) * (uint8_t)(step_rate & 0x0007)) >> 3); + } + // (there is no need to limit the timer value here. All limits have been + // applied above, and AVR is able to keep up at 30khz Stepping ISR rate) + #endif + + return timer; + } + + #if ENABLED(S_CURVE_ACCELERATION) + static void _calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av); + static int32_t _eval_bezier_curve(const uint32_t curr_step); + #endif + + #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM + static void digipot_init(); + #endif + + #if HAS_MICROSTEPS + static void microstep_init(); + #endif + +}; + +extern Stepper stepper; diff --git a/Marlin/src/module/stepper/L64xx.cpp b/Marlin/src/module/stepper/L64xx.cpp new file mode 100644 index 00000000..3e2bf094 --- /dev/null +++ b/Marlin/src/module/stepper/L64xx.cpp @@ -0,0 +1,225 @@ +/** + * 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 . + * + */ + +/** + * stepper/L64xx.cpp + * Stepper driver indirection for L64XX drivers + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_L64XX + +#include "L64xx.h" + +#if AXIS_IS_L64XX(X) + L64XX_CLASS(X) stepperX(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(X2) + L64XX_CLASS(X2) stepperX2(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(Y) + L64XX_CLASS(Y) stepperY(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(Y2) + L64XX_CLASS(Y2) stepperY2(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(Z) + L64XX_CLASS(Z) stepperZ(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(Z2) + L64XX_CLASS(Z2) stepperZ2(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(Z3) + L64XX_CLASS(Z3) stepperZ3(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(Z4) + L64XX_CLASS(Z4) stepperZ4(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E0) + L64XX_CLASS(E0) stepperE0(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E1) + L64XX_CLASS(E1) stepperE1(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E2) + L64XX_CLASS(E2) stepperE2(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E3) + L64XX_CLASS(E3) stepperE3(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E4) + L64XX_CLASS(E4) stepperE4(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E5) + L64XX_CLASS(E5) stepperE5(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E6) + L64XX_CLASS(E6) stepperE6(L6470_CHAIN_SS_PIN); +#endif +#if AXIS_IS_L64XX(E7) + L64XX_CLASS(E7) stepperE7(L6470_CHAIN_SS_PIN); +#endif + +// Not using L64XX class init method because it +// briefly sends power to the steppers + +inline void L6470_init_chip(L64XX &st, const int ms, const int oc, const int sc, const int mv, const int slew_rate) { + st.set_handlers(L64xxManager.spi_init, L64xxManager.transfer_single, L64xxManager.transfer_chain); // specify which external SPI routines to use + switch (st.L6470_status_layout) { + case L6470_STATUS_LAYOUT: { + st.resetDev(); + st.softFree(); + st.SetParam(st.L64XX_CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ); + st.SetParam(L6470_KVAL_RUN, 0xFF); + st.SetParam(L6470_KVAL_ACC, 0xFF); + st.SetParam(L6470_KVAL_DEC, 0xFF); + st.setMicroSteps(ms); + st.setOverCurrent(oc); + st.setStallCurrent(sc); + st.SetParam(L6470_KVAL_HOLD, mv); + st.SetParam(L6470_ABS_POS, 0); + uint32_t config_temp = st.GetParam(st.L64XX_CONFIG); + config_temp &= ~CONFIG_POW_SR; + switch (slew_rate) { + case 0: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_75V_us); break; + default: + case 1: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_110V_us); break; + case 3: + case 2: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_260V_us); break; + } + st.getStatus(); + st.getStatus(); + break; + } + + case L6474_STATUS_LAYOUT: { + st.free(); + //st.SetParam(st.L64XX_CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ); + //st.SetParam(L6474_TVAL, 0xFF); + st.setMicroSteps(ms); + st.setOverCurrent(oc); + st.setTVALCurrent(sc); + st.SetParam(L6470_ABS_POS, 0); + uint32_t config_temp = st.GetParam(st.L64XX_CONFIG); + config_temp &= ~CONFIG_POW_SR & ~CONFIG_EN_TQREG; // clear out slew rate and set current to be controlled by TVAL register + switch (slew_rate) { + case 0: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_75V_us); break; + default: + case 1: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_110V_us); break; + case 3: + case 2: st.SetParam(st.L64XX_CONFIG, config_temp | CONFIG_SR_260V_us); break; + //case 0: st.SetParam(st.L64XX_CONFIG, 0x2E88 | CONFIG_EN_TQREG | CONFIG_SR_75V_us); break; + //default: + //case 1: st.SetParam(st.L64XX_CONFIG, 0x2E88 | CONFIG_EN_TQREG | CONFIG_SR_110V_us); break; + //case 3: + //case 2: st.SetParam(st.L64XX_CONFIG, 0x2E88 | CONFIG_EN_TQREG | CONFIG_SR_260V_us); break; + + //case 0: st.SetParam(st.L64XX_CONFIG, 0x2E88 ); break; + //default: + //case 1: st.SetParam(st.L64XX_CONFIG, 0x2E88 ); break; + //case 3: + //case 2: st.SetParam(st.L64XX_CONFIG, 0x2E88 ); break; + } + st.getStatus(); + st.getStatus(); + break; + } + + case L6480_STATUS_LAYOUT: { + st.resetDev(); + st.softFree(); + st.SetParam(st.L64XX_CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ); + st.SetParam(L6470_KVAL_RUN, 0xFF); + st.SetParam(L6470_KVAL_ACC, 0xFF); + st.SetParam(L6470_KVAL_DEC, 0xFF); + st.setMicroSteps(ms); + st.setOverCurrent(oc); + st.setStallCurrent(sc); + st.SetParam(+-L6470_KVAL_HOLD, mv); + st.SetParam(L6470_ABS_POS, 0); + st.SetParam(st.L64XX_CONFIG,(st.GetParam(st.L64XX_CONFIG) | PWR_VCC_7_5V)); + st.getStatus(); // must clear out status bits before can set slew rate + st.getStatus(); + switch (slew_rate) { + case 0: st.SetParam(L6470_GATECFG1, CONFIG1_SR_220V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_220V_us); break; + default: + case 1: st.SetParam(L6470_GATECFG1, CONFIG1_SR_400V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_400V_us); break; + case 2: st.SetParam(L6470_GATECFG1, CONFIG1_SR_520V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_520V_us); break; + case 3: st.SetParam(L6470_GATECFG1, CONFIG1_SR_980V_us); st.SetParam(L6470_GATECFG2, CONFIG2_SR_980V_us); break; + } + break; + } + } +} + +#define L6470_INIT_CHIP(Q) L6470_init_chip(stepper##Q, Q##_MICROSTEPS, Q##_OVERCURRENT, Q##_STALLCURRENT, Q##_MAX_VOLTAGE, Q##_SLEW_RATE) + +void L64XX_Marlin::init_to_defaults() { + #if AXIS_IS_L64XX(X) + L6470_INIT_CHIP(X); + #endif + #if AXIS_IS_L64XX(X2) + L6470_INIT_CHIP(X2); + #endif + #if AXIS_IS_L64XX(Y) + L6470_INIT_CHIP(Y); + #endif + #if AXIS_IS_L64XX(Y2) + L6470_INIT_CHIP(Y2); + #endif + #if AXIS_IS_L64XX(Z) + L6470_INIT_CHIP(Z); + #endif + #if AXIS_IS_L64XX(Z2) + L6470_INIT_CHIP(Z2); + #endif + #if AXIS_IS_L64XX(Z3) + L6470_INIT_CHIP(Z3); + #endif + #if AXIS_IS_L64XX(E0) + L6470_INIT_CHIP(E0); + #endif + #if AXIS_IS_L64XX(E1) + L6470_INIT_CHIP(E1); + #endif + #if AXIS_IS_L64XX(E2) + L6470_INIT_CHIP(E2); + #endif + #if AXIS_IS_L64XX(E3) + L6470_INIT_CHIP(E3); + #endif + #if AXIS_IS_L64XX(E4) + L6470_INIT_CHIP(E4); + #endif + #if AXIS_IS_L64XX(E5) + L6470_INIT_CHIP(E5); + #endif + #if AXIS_IS_L64XX(E6) + L6470_INIT_CHIP(E6); + #endif + #if AXIS_IS_L64XX(E7) + L6470_INIT_CHIP(E7); + #endif +} + +#endif // HAS_L64XX diff --git a/Marlin/src/module/stepper/L64xx.h b/Marlin/src/module/stepper/L64xx.h new file mode 100644 index 00000000..9c8b0b1b --- /dev/null +++ b/Marlin/src/module/stepper/L64xx.h @@ -0,0 +1,364 @@ +/** + * 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 + +/** + * stepper/L64xx.h + * Stepper driver indirection for L64XX drivers + */ + +#include "../../inc/MarlinConfig.h" +#include "../../libs/L64XX/L64XX_Marlin.h" + +// Convert option names to L64XX classes +#define CLASS_L6470 L6470 +#define CLASS_L6474 L6474 +#define CLASS_POWERSTEP01 powerSTEP01 + +#define __L64XX_CLASS(TYPE) CLASS_##TYPE +#define _L64XX_CLASS(TYPE) __L64XX_CLASS(TYPE) +#define L64XX_CLASS(ST) _L64XX_CLASS(ST##_DRIVER_TYPE) + +#define L6474_DIR_WRITE(A,STATE) do{ L64xxManager.dir_commands[A] = dSPIN_L6474_ENABLE; WRITE(A##_DIR_PIN, STATE); }while(0) +#define L64XX_DIR_WRITE(A,STATE) do{ L64xxManager.dir_commands[A] = (STATE) ? dSPIN_STEP_CLOCK_REV : dSPIN_STEP_CLOCK_FWD; }while(0) + +// X Stepper +#if AXIS_IS_L64XX(X) + extern L64XX_CLASS(X) stepperX; + #define X_ENABLE_INIT() NOOP + #define X_ENABLE_WRITE(STATE) (STATE ? stepperX.hardStop() : stepperX.free()) + #define X_ENABLE_READ() (stepperX.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_X(L6474) + #define X_DIR_INIT() SET_OUTPUT(X_DIR_PIN) + #define X_DIR_WRITE(STATE) L6474_DIR_WRITE(X, STATE) + #define X_DIR_READ() READ(X_DIR_PIN) + #else + #define X_DIR_INIT() NOOP + #define X_DIR_WRITE(STATE) L64XX_DIR_WRITE(X, STATE) + #define X_DIR_READ() (stepper##X.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_X(L6470) + #define DISABLE_STEPPER_X() stepperX.free() + #endif + #endif +#endif + +// Y Stepper +#if AXIS_IS_L64XX(Y) + extern L64XX_CLASS(Y) stepperY; + #define Y_ENABLE_INIT() NOOP + #define Y_ENABLE_WRITE(STATE) (STATE ? stepperY.hardStop() : stepperY.free()) + #define Y_ENABLE_READ() (stepperY.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_Y(L6474) + #define Y_DIR_INIT() SET_OUTPUT(Y_DIR_PIN) + #define Y_DIR_WRITE(STATE) L6474_DIR_WRITE(Y, STATE) + #define Y_DIR_READ() READ(Y_DIR_PIN) + #else + #define Y_DIR_INIT() NOOP + #define Y_DIR_WRITE(STATE) L64XX_DIR_WRITE(Y, STATE) + #define Y_DIR_READ() (stepper##Y.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_Y(L6470) + #define DISABLE_STEPPER_Y() stepperY.free() + #endif + #endif +#endif + +// Z Stepper +#if AXIS_IS_L64XX(Z) + extern L64XX_CLASS(Z) stepperZ; + #define Z_ENABLE_INIT() NOOP + #define Z_ENABLE_WRITE(STATE) (STATE ? stepperZ.hardStop() : stepperZ.free()) + #define Z_ENABLE_READ() (stepperZ.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_Z(L6474) + #define Z_DIR_INIT() SET_OUTPUT(Z_DIR_PIN) + #define Z_DIR_WRITE(STATE) L6474_DIR_WRITE(Z, STATE) + #define Z_DIR_READ() READ(Z_DIR_PIN) + #else + #define Z_DIR_INIT() NOOP + #define Z_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z, STATE) + #define Z_DIR_READ() (stepper##Z.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_Z(L6470) + #define DISABLE_STEPPER_Z() stepperZ.free() + #endif + #endif +#endif + +// X2 Stepper +#if HAS_X2_ENABLE && AXIS_IS_L64XX(X2) + extern L64XX_CLASS(X2) stepperX2; + #define X2_ENABLE_INIT() NOOP + #define X2_ENABLE_WRITE(STATE) (STATE ? stepperX2.hardStop() : stepperX2.free()) + #define X2_ENABLE_READ() (stepperX2.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_X2(L6474) + #define X2_DIR_INIT() SET_OUTPUT(X2_DIR_PIN) + #define X2_DIR_WRITE(STATE) L6474_DIR_WRITE(X2, STATE) + #define X2_DIR_READ() READ(X2_DIR_PIN) + #else + #define X2_DIR_INIT() NOOP + #define X2_DIR_WRITE(STATE) L64XX_DIR_WRITE(X2, STATE) + #define X2_DIR_READ() (stepper##X2.getStatus() & STATUS_DIR); + #endif +#endif + +#if AXIS_DRIVER_TYPE_X2(L6470) + #define DISABLE_STEPPER_X2() stepperX2.free() +#endif + +// Y2 Stepper +#if HAS_Y2_ENABLE && AXIS_IS_L64XX(Y2) + extern L64XX_CLASS(Y2) stepperY2; + #define Y2_ENABLE_INIT() NOOP + #define Y2_ENABLE_WRITE(STATE) (STATE ? stepperY2.hardStop() : stepperY2.free()) + #define Y2_ENABLE_READ() (stepperY2.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_Y2(L6474) + #define Y2_DIR_INIT() SET_OUTPUT(Y2_DIR_PIN) + #define Y2_DIR_WRITE(STATE) L6474_DIR_WRITE(Y2, STATE) + #define Y2_DIR_READ() READ(Y2_DIR_PIN) + #else + #define Y2_DIR_INIT() NOOP + #define Y2_DIR_WRITE(STATE) L64XX_DIR_WRITE(Y2, STATE) + #define Y2_DIR_READ() (stepper##Y2.getStatus() & STATUS_DIR); + #endif +#endif + +#if AXIS_DRIVER_TYPE_Y2(L6470) + #define DISABLE_STEPPER_Y2() stepperY2.free() +#endif + +// Z2 Stepper +#if HAS_Z2_ENABLE && AXIS_IS_L64XX(Z2) + extern L64XX_CLASS(Z2) stepperZ2; + #define Z2_ENABLE_INIT() NOOP + #define Z2_ENABLE_WRITE(STATE) (STATE ? stepperZ2.hardStop() : stepperZ2.free()) + #define Z2_ENABLE_READ() (stepperZ2.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_Z2(L6474) + #define Z2_DIR_INIT() SET_OUTPUT(Z2_DIR_PIN) + #define Z2_DIR_WRITE(STATE) L6474_DIR_WRITE(Z2, STATE) + #define Z2_DIR_READ() READ(Z2_DIR_PIN) + #else + #define Z2_DIR_INIT() NOOP + #define Z2_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z2, STATE) + #define Z2_DIR_READ() (stepper##Z2.getStatus() & STATUS_DIR); + #endif +#endif + +#if AXIS_DRIVER_TYPE_Z2(L6470) + #define DISABLE_STEPPER_Z2() stepperZ2.free() +#endif + +// Z3 Stepper +#if HAS_Z3_ENABLE && AXIS_IS_L64XX(Z3) + extern L64XX_CLASS(Z3) stepperZ3; + #define Z3_ENABLE_INIT() NOOP + #define Z3_ENABLE_WRITE(STATE) (STATE ? stepperZ3.hardStop() : stepperZ3.free()) + #define Z3_ENABLE_READ() (stepperZ3.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_Z3(L6474) + #define Z3_DIR_INIT() SET_OUTPUT(Z3_DIR_PIN) + #define Z3_DIR_WRITE(STATE) L6474_DIR_WRITE(Z3, STATE) + #define Z3_DIR_READ() READ(Z3_DIR_PIN) + #else + #define Z3_DIR_INIT() NOOP + #define Z3_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z3, STATE) + #define Z3_DIR_READ() (stepper##Z3.getStatus() & STATUS_DIR); + #endif +#endif + +#if AXIS_DRIVER_TYPE_Z3(L6470) + #define DISABLE_STEPPER_Z3() stepperZ3.free() +#endif + +// Z4 Stepper +#if HAS_Z4_ENABLE && AXIS_IS_L64XX(Z4) + extern L64XX_CLASS(Z4) stepperZ4; + #define Z4_ENABLE_INIT() NOOP + #define Z4_ENABLE_WRITE(STATE) (STATE ? stepperZ4.hardStop() : stepperZ4.free()) + #define Z4_ENABLE_READ() (stepperZ4.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_Z4(L6474) + #define Z4_DIR_INIT() SET_OUTPUT(Z4_DIR_PIN) + #define Z4_DIR_WRITE(STATE) L6474_DIR_WRITE(Z4, STATE) + #define Z4_DIR_READ() READ(Z4_DIR_PIN) + #else + #define Z4_DIR_INIT() NOOP + #define Z4_DIR_WRITE(STATE) L64XX_DIR_WRITE(Z4, STATE) + #define Z4_DIR_READ() (stepper##Z4.getStatus() & STATUS_DIR); + #endif +#endif + +#if AXIS_DRIVER_TYPE_Z4(L6470) + #define DISABLE_STEPPER_Z4() stepperZ4.free() +#endif + +// E0 Stepper +#if AXIS_IS_L64XX(E0) + extern L64XX_CLASS(E0) stepperE0; + #define E0_ENABLE_INIT() NOOP + #define E0_ENABLE_WRITE(STATE) (STATE ? stepperE0.hardStop() : stepperE0.free()) + #define E0_ENABLE_READ() (stepperE0.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E0(L6474) + #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) + #define E0_DIR_WRITE(STATE) L6474_DIR_WRITE(E0, STATE) + #define E0_DIR_READ() READ(E0_DIR_PIN) + #else + #define E0_DIR_INIT() NOOP + #define E0_DIR_WRITE(STATE) L64XX_DIR_WRITE(E0, STATE) + #define E0_DIR_READ() (stepper##E0.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E0(L6470) + #define DISABLE_STEPPER_E0() do{ stepperE0.free(); }while(0) + #endif + #endif +#endif + +// E1 Stepper +#if AXIS_IS_L64XX(E1) + extern L64XX_CLASS(E1) stepperE1; + #define E1_ENABLE_INIT() NOOP + #define E1_ENABLE_WRITE(STATE) (STATE ? stepperE1.hardStop() : stepperE1.free()) + #define E1_ENABLE_READ() (stepperE1.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E1(L6474) + #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) + #define E1_DIR_WRITE(STATE) L6474_DIR_WRITE(E1, STATE) + #define E1_DIR_READ() READ(E1_DIR_PIN) + #else + #define E1_DIR_INIT() NOOP + #define E1_DIR_WRITE(STATE) L64XX_DIR_WRITE(E1, STATE) + #define E1_DIR_READ() (stepper##E1.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E1(L6470) + #define DISABLE_STEPPER_E1() do{ stepperE1.free(); }while(0) + #endif + #endif +#endif + +// E2 Stepper +#if AXIS_IS_L64XX(E2) + extern L64XX_CLASS(E2) stepperE2; + #define E2_ENABLE_INIT() NOOP + #define E2_ENABLE_WRITE(STATE) (STATE ? stepperE2.hardStop() : stepperE2.free()) + #define E2_ENABLE_READ() (stepperE2.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E2(L6474) + #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) + #define E2_DIR_WRITE(STATE) L6474_DIR_WRITE(E2, STATE) + #define E2_DIR_READ() READ(E2_DIR_PIN) + #else + #define E2_DIR_INIT() NOOP + #define E2_DIR_WRITE(STATE) L64XX_DIR_WRITE(E2, STATE) + #define E2_DIR_READ() (stepper##E2.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E2(L6470) + #define DISABLE_STEPPER_E2() do{ stepperE2.free(); }while(0) + #endif + #endif +#endif + +// E3 Stepper +#if AXIS_IS_L64XX(E3) + extern L64XX_CLASS(E3) stepperE3; + #define E3_ENABLE_INIT() NOOP + #define E3_ENABLE_WRITE(STATE) (STATE ? stepperE3.hardStop() : stepperE3.free()) + #define E3_ENABLE_READ() (stepperE3.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E3(L6474) + #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) + #define E3_DIR_WRITE(STATE) L6474_DIR_WRITE(E3, STATE) + #define E3_DIR_READ() READ(E3_DIR_PIN) + #else + #define E3_DIR_INIT() NOOP + #define E3_DIR_WRITE(STATE) L64XX_DIR_WRITE(E3, STATE) + #define E3_DIR_READ() (stepper##E3.getStatus() & STATUS_DIR); + #endif +#endif + +// E4 Stepper +#if AXIS_IS_L64XX(E4) + extern L64XX_CLASS(E4) stepperE4; + #define E4_ENABLE_INIT() NOOP + #define E4_ENABLE_WRITE(STATE) (STATE ? stepperE4.hardStop() : stepperE4.free()) + #define E4_ENABLE_READ() (stepperE4.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E4(L6474) + #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) + #define E4_DIR_WRITE(STATE) L6474_DIR_WRITE(E4, STATE) + #define E4_DIR_READ() READ(E4_DIR_PIN) + #else + #define E4_DIR_INIT() NOOP + #define E4_DIR_WRITE(STATE) L64XX_DIR_WRITE(E4, STATE) + #define E4_DIR_READ() (stepper##E4.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E4(L6470) + #define DISABLE_STEPPER_E4() do{ stepperE4.free(); }while(0) + #endif + #endif +#endif + +// E5 Stepper +#if AXIS_IS_L64XX(E5) + extern L64XX_CLASS(E5) stepperE5; + #define E5_ENABLE_INIT() NOOP + #define E5_ENABLE_WRITE(STATE) (STATE ? stepperE5.hardStop() : stepperE5.free()) + #define E5_ENABLE_READ() (stepperE5.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E5(L6474) + #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) + #define E5_DIR_WRITE(STATE) L6474_DIR_WRITE(E5, STATE) + #define E5_DIR_READ() READ(E5_DIR_PIN) + #else + #define E5_DIR_INIT() NOOP + #define E5_DIR_WRITE(STATE) L64XX_DIR_WRITE(E5, STATE) + #define E5_DIR_READ() (stepper##E5.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E5(L6470) + #define DISABLE_STEPPER_E5() do{ stepperE5.free(); }while(0) + #endif + #endif +#endif + +// E6 Stepper +#if AXIS_IS_L64XX(E6) + extern L64XX_CLASS(E6) stepperE6; + #define E6_ENABLE_INIT() NOOP + #define E6_ENABLE_WRITE(STATE) (STATE ? stepperE6.hardStop() : stepperE6.free()) + #define E6_ENABLE_READ() (stepperE6.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E6(L6474) + #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) + #define E6_DIR_WRITE(STATE) L6474_DIR_WRITE(E6, STATE) + #define E6_DIR_READ() READ(E6_DIR_PIN) + #else + #define E6_DIR_INIT() NOOP + #define E6_DIR_WRITE(STATE) L64XX_DIR_WRITE(E6, STATE) + #define E6_DIR_READ() (stepper##E6.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E6(L6470) + #define DISABLE_STEPPER_E6() do{ stepperE6.free(); }while(0) + #endif + #endif +#endif + +// E7 Stepper +#if AXIS_IS_L64XX(E7) + extern L64XX_CLASS(E7) stepperE7; + #define E7_ENABLE_INIT() NOOP + #define E7_ENABLE_WRITE(STATE) (STATE ? stepperE7.hardStop() : stepperE7.free()) + #define E7_ENABLE_READ() (stepperE7.getStatus() & STATUS_HIZ) + #if AXIS_DRIVER_TYPE_E7(L6474) + #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) + #define E7_DIR_WRITE(STATE) L6474_DIR_WRITE(E7, STATE) + #define E7_DIR_READ() READ(E7_DIR_PIN) + #else + #define E7_DIR_INIT() NOOP + #define E7_DIR_WRITE(STATE) L64XX_DIR_WRITE(E7, STATE) + #define E7_DIR_READ() (stepper##E7.getStatus() & STATUS_DIR); + #if AXIS_DRIVER_TYPE_E7(L6470) + #define DISABLE_STEPPER_E7() do{ stepperE7.free(); }while(0) + #endif + #endif +#endif diff --git a/Marlin/src/module/stepper/TMC26X.cpp b/Marlin/src/module/stepper/TMC26X.cpp new file mode 100644 index 00000000..926f1a4e --- /dev/null +++ b/Marlin/src/module/stepper/TMC26X.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 . + * + */ + +/** + * stepper/TMC26X.cpp + * Stepper driver indirection for TMC26X drivers + */ + +#include "../../inc/MarlinConfig.h" + +// +// TMC26X Driver objects and inits +// +#if HAS_TMC26X + +#include "TMC26X.h" + +#define _TMC26X_DEFINE(ST) TMC26XStepper stepper##ST(200, ST##_CS_PIN, ST##_STEP_PIN, ST##_DIR_PIN, ST##_MAX_CURRENT, ST##_SENSE_RESISTOR) + +#if AXIS_DRIVER_TYPE_X(TMC26X) + _TMC26X_DEFINE(X); +#endif +#if AXIS_DRIVER_TYPE_X2(TMC26X) + _TMC26X_DEFINE(X2); +#endif +#if AXIS_DRIVER_TYPE_Y(TMC26X) + _TMC26X_DEFINE(Y); +#endif +#if AXIS_DRIVER_TYPE_Y2(TMC26X) + _TMC26X_DEFINE(Y2); +#endif +#if AXIS_DRIVER_TYPE_Z(TMC26X) + _TMC26X_DEFINE(Z); +#endif +#if AXIS_DRIVER_TYPE_Z2(TMC26X) + _TMC26X_DEFINE(Z2); +#endif +#if AXIS_DRIVER_TYPE_Z3(TMC26X) + _TMC26X_DEFINE(Z3); +#endif +#if AXIS_DRIVER_TYPE_Z4(TMC26X) + _TMC26X_DEFINE(Z4); +#endif +#if AXIS_DRIVER_TYPE_E0(TMC26X) + _TMC26X_DEFINE(E0); +#endif +#if AXIS_DRIVER_TYPE_E1(TMC26X) + _TMC26X_DEFINE(E1); +#endif +#if AXIS_DRIVER_TYPE_E2(TMC26X) + _TMC26X_DEFINE(E2); +#endif +#if AXIS_DRIVER_TYPE_E3(TMC26X) + _TMC26X_DEFINE(E3); +#endif +#if AXIS_DRIVER_TYPE_E4(TMC26X) + _TMC26X_DEFINE(E4); +#endif +#if AXIS_DRIVER_TYPE_E5(TMC26X) + _TMC26X_DEFINE(E5); +#endif +#if AXIS_DRIVER_TYPE_E6(TMC26X) + _TMC26X_DEFINE(E6); +#endif +#if AXIS_DRIVER_TYPE_E7(TMC26X) + _TMC26X_DEFINE(E7); +#endif + +#define _TMC26X_INIT(A) do{ \ + stepper##A.setMicrosteps(A##_MICROSTEPS); \ + stepper##A.start(); \ +}while(0) + +void tmc26x_init_to_defaults() { + #if AXIS_DRIVER_TYPE_X(TMC26X) + _TMC26X_INIT(X); + #endif + #if AXIS_DRIVER_TYPE_X2(TMC26X) + _TMC26X_INIT(X2); + #endif + #if AXIS_DRIVER_TYPE_Y(TMC26X) + _TMC26X_INIT(Y); + #endif + #if AXIS_DRIVER_TYPE_Y2(TMC26X) + _TMC26X_INIT(Y2); + #endif + #if AXIS_DRIVER_TYPE_Z(TMC26X) + _TMC26X_INIT(Z); + #endif + #if AXIS_DRIVER_TYPE_Z2(TMC26X) + _TMC26X_INIT(Z2); + #endif + #if AXIS_DRIVER_TYPE_Z3(TMC26X) + _TMC26X_INIT(Z3); + #endif + #if AXIS_DRIVER_TYPE_Z4(TMC26X) + _TMC26X_INIT(Z4); + #endif + #if AXIS_DRIVER_TYPE_E0(TMC26X) + _TMC26X_INIT(E0); + #endif + #if AXIS_DRIVER_TYPE_E1(TMC26X) + _TMC26X_INIT(E1); + #endif + #if AXIS_DRIVER_TYPE_E2(TMC26X) + _TMC26X_INIT(E2); + #endif + #if AXIS_DRIVER_TYPE_E3(TMC26X) + _TMC26X_INIT(E3); + #endif + #if AXIS_DRIVER_TYPE_E4(TMC26X) + _TMC26X_INIT(E4); + #endif + #if AXIS_DRIVER_TYPE_E5(TMC26X) + _TMC26X_INIT(E5); + #endif + #if AXIS_DRIVER_TYPE_E6(TMC26X) + _TMC26X_INIT(E6); + #endif + #if AXIS_DRIVER_TYPE_E7(TMC26X) + _TMC26X_INIT(E7); + #endif +} + +#endif // HAS_TMC26X diff --git a/Marlin/src/module/stepper/TMC26X.h b/Marlin/src/module/stepper/TMC26X.h new file mode 100644 index 00000000..8977266b --- /dev/null +++ b/Marlin/src/module/stepper/TMC26X.h @@ -0,0 +1,168 @@ +/** + * 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 + +/** + * stepper/TMC26X.h + * Stepper driver indirection for TMC26X drivers + */ + +#include "../../inc/MarlinConfig.h" + +// TMC26X drivers have STEP/DIR on normal pins, but ENABLE via SPI + +#include +#if defined(STM32GENERIC) && defined(STM32F7) + #include "../../HAL/STM32_F4_F7/STM32F7/TMC2660.h" +#else + #include +#endif + +void tmc26x_init_to_defaults(); + +// X Stepper +#if AXIS_DRIVER_TYPE_X(TMC26X) + extern TMC26XStepper stepperX; + #define X_ENABLE_INIT() NOOP + #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE) + #define X_ENABLE_READ() stepperX.isEnabled() +#endif + +// Y Stepper +#if AXIS_DRIVER_TYPE_Y(TMC26X) + extern TMC26XStepper stepperY; + #define Y_ENABLE_INIT() NOOP + #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE) + #define Y_ENABLE_READ() stepperY.isEnabled() +#endif + +// Z Stepper +#if AXIS_DRIVER_TYPE_Z(TMC26X) + extern TMC26XStepper stepperZ; + #define Z_ENABLE_INIT() NOOP + #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE) + #define Z_ENABLE_READ() stepperZ.isEnabled() +#endif + +// X2 Stepper +#if HAS_X2_ENABLE && AXIS_DRIVER_TYPE_X2(TMC26X) + extern TMC26XStepper stepperX2; + #define X2_ENABLE_INIT() NOOP + #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE) + #define X2_ENABLE_READ() stepperX2.isEnabled() +#endif + +// Y2 Stepper +#if HAS_Y2_ENABLE && AXIS_DRIVER_TYPE_Y2(TMC26X) + extern TMC26XStepper stepperY2; + #define Y2_ENABLE_INIT() NOOP + #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE) + #define Y2_ENABLE_READ() stepperY2.isEnabled() +#endif + +// Z2 Stepper +#if HAS_Z2_ENABLE && AXIS_DRIVER_TYPE_Z2(TMC26X) + extern TMC26XStepper stepperZ2; + #define Z2_ENABLE_INIT() NOOP + #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE) + #define Z2_ENABLE_READ() stepperZ2.isEnabled() +#endif + +// Z3 Stepper +#if HAS_Z3_ENABLE && AXIS_DRIVER_TYPE_Z3(TMC26X) + extern TMC26XStepper stepperZ3; + #define Z3_ENABLE_INIT() NOOP + #define Z3_ENABLE_WRITE(STATE) stepperZ3.setEnabled(STATE) + #define Z3_ENABLE_READ() stepperZ3.isEnabled() +#endif + +// Z4 Stepper +#if HAS_Z4_ENABLE && AXIS_DRIVER_TYPE_Z4(TMC26X) + extern TMC26XStepper stepperZ4; + #define Z4_ENABLE_INIT() NOOP + #define Z4_ENABLE_WRITE(STATE) stepperZ4.setEnabled(STATE) + #define Z4_ENABLE_READ() stepperZ4.isEnabled() +#endif + +// E0 Stepper +#if AXIS_DRIVER_TYPE_E0(TMC26X) + extern TMC26XStepper stepperE0; + #define E0_ENABLE_INIT() NOOP + #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE) + #define E0_ENABLE_READ() stepperE0.isEnabled() +#endif + +// E1 Stepper +#if AXIS_DRIVER_TYPE_E1(TMC26X) + extern TMC26XStepper stepperE1; + #define E1_ENABLE_INIT() NOOP + #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE) + #define E1_ENABLE_READ() stepperE1.isEnabled() +#endif + +// E2 Stepper +#if AXIS_DRIVER_TYPE_E2(TMC26X) + extern TMC26XStepper stepperE2; + #define E2_ENABLE_INIT() NOOP + #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE) + #define E2_ENABLE_READ() stepperE2.isEnabled() +#endif + +// E3 Stepper +#if AXIS_DRIVER_TYPE_E3(TMC26X) + extern TMC26XStepper stepperE3; + #define E3_ENABLE_INIT() NOOP + #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE) + #define E3_ENABLE_READ() stepperE3.isEnabled() +#endif + +// E4 Stepper +#if AXIS_DRIVER_TYPE_E4(TMC26X) + extern TMC26XStepper stepperE4; + #define E4_ENABLE_INIT() NOOP + #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE) + #define E4_ENABLE_READ() stepperE4.isEnabled() +#endif + +// E5 Stepper +#if AXIS_DRIVER_TYPE_E5(TMC26X) + extern TMC26XStepper stepperE5; + #define E5_ENABLE_INIT() NOOP + #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE) + #define E5_ENABLE_READ() stepperE5.isEnabled() +#endif + +// E6 Stepper +#if AXIS_DRIVER_TYPE_E6(TMC26X) + extern TMC26XStepper stepperE6; + #define E6_ENABLE_INIT() NOOP + #define E6_ENABLE_WRITE(STATE) stepperE6.setEnabled(STATE) + #define E6_ENABLE_READ() stepperE6.isEnabled() +#endif + +// E7 Stepper +#if AXIS_DRIVER_TYPE_E7(TMC26X) + extern TMC26XStepper stepperE7; + #define E7_ENABLE_INIT() NOOP + #define E7_ENABLE_WRITE(STATE) stepperE7.setEnabled(STATE) + #define E7_ENABLE_READ() stepperE7.isEnabled() +#endif diff --git a/Marlin/src/module/stepper/indirection.cpp b/Marlin/src/module/stepper/indirection.cpp new file mode 100644 index 00000000..6f9ac9ba --- /dev/null +++ b/Marlin/src/module/stepper/indirection.cpp @@ -0,0 +1,45 @@ +/** + * 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 . + * + */ + +/** + * stepper/indirection.cpp + * + * Stepper motor driver indirection to allow some stepper functions to + * be done via SPI/I2c instead of direct pin manipulation. + * + * Copyright (c) 2015 Dominik Wenger + */ + +#include "../../inc/MarlinConfig.h" +#include "indirection.h" + +void restore_stepper_drivers() { + TERN_(HAS_TRINAMIC_CONFIG, restore_trinamic_drivers()); +} + +void reset_stepper_drivers() { + #if HAS_DRIVER(TMC26X) + tmc26x_init_to_defaults(); + #endif + TERN_(HAS_L64XX, L64xxManager.init_to_defaults()); + TERN_(HAS_TRINAMIC_CONFIG, reset_trinamic_drivers()); +} diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h new file mode 100644 index 00000000..ec0d63a8 --- /dev/null +++ b/Marlin/src/module/stepper/indirection.h @@ -0,0 +1,992 @@ +/** + * 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 + +/** + * stepper/indirection.h + * + * Stepper motor driver indirection to allow some stepper functions to + * be done via SPI/I2c instead of direct pin manipulation. + * + * Copyright (c) 2015 Dominik Wenger + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_L64XX + #include "L64xx.h" +#endif + +#if HAS_DRIVER(TMC26X) + #include "TMC26X.h" +#endif + +#if HAS_TRINAMIC_CONFIG + #include "trinamic.h" +#endif + +void restore_stepper_drivers(); // Called by PSU_ON +void reset_stepper_drivers(); // Called by settings.load / settings.reset + +// X Stepper +#ifndef X_ENABLE_INIT + #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) + #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) + #define X_ENABLE_READ() bool(READ(X_ENABLE_PIN)) +#endif +#ifndef X_DIR_INIT + #define X_DIR_INIT() SET_OUTPUT(X_DIR_PIN) + #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE) + #define X_DIR_READ() bool(READ(X_DIR_PIN)) +#endif +#define X_STEP_INIT() SET_OUTPUT(X_STEP_PIN) +#ifndef X_STEP_WRITE + #define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE) +#endif +#define X_STEP_READ() bool(READ(X_STEP_PIN)) + +// Y Stepper +#ifndef Y_ENABLE_INIT + #define Y_ENABLE_INIT() SET_OUTPUT(Y_ENABLE_PIN) + #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) + #define Y_ENABLE_READ() bool(READ(Y_ENABLE_PIN)) +#endif +#ifndef Y_DIR_INIT + #define Y_DIR_INIT() SET_OUTPUT(Y_DIR_PIN) + #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE) + #define Y_DIR_READ() bool(READ(Y_DIR_PIN)) +#endif +#define Y_STEP_INIT() SET_OUTPUT(Y_STEP_PIN) +#ifndef Y_STEP_WRITE + #define Y_STEP_WRITE(STATE) WRITE(Y_STEP_PIN,STATE) +#endif +#define Y_STEP_READ() bool(READ(Y_STEP_PIN)) + +// Z Stepper +#ifndef Z_ENABLE_INIT + #define Z_ENABLE_INIT() SET_OUTPUT(Z_ENABLE_PIN) + #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) + #define Z_ENABLE_READ() bool(READ(Z_ENABLE_PIN)) +#endif +#ifndef Z_DIR_INIT + #define Z_DIR_INIT() SET_OUTPUT(Z_DIR_PIN) + #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE) + #define Z_DIR_READ() bool(READ(Z_DIR_PIN)) +#endif +#define Z_STEP_INIT() SET_OUTPUT(Z_STEP_PIN) +#ifndef Z_STEP_WRITE + #define Z_STEP_WRITE(STATE) WRITE(Z_STEP_PIN,STATE) +#endif +#define Z_STEP_READ() bool(READ(Z_STEP_PIN)) + +// X2 Stepper +#if HAS_X2_ENABLE + #ifndef X2_ENABLE_INIT + #define X2_ENABLE_INIT() SET_OUTPUT(X2_ENABLE_PIN) + #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) + #define X2_ENABLE_READ() bool(READ(X2_ENABLE_PIN)) + #endif + #ifndef X2_DIR_INIT + #define X2_DIR_INIT() SET_OUTPUT(X2_DIR_PIN) + #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE) + #define X2_DIR_READ() bool(READ(X2_DIR_PIN)) + #endif + #define X2_STEP_INIT() SET_OUTPUT(X2_STEP_PIN) + #ifndef X2_STEP_WRITE + #define X2_STEP_WRITE(STATE) WRITE(X2_STEP_PIN,STATE) + #endif + #define X2_STEP_READ() bool(READ(X2_STEP_PIN)) +#endif + +// Y2 Stepper +#if HAS_Y2_ENABLE + #ifndef Y2_ENABLE_INIT + #define Y2_ENABLE_INIT() SET_OUTPUT(Y2_ENABLE_PIN) + #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) + #define Y2_ENABLE_READ() bool(READ(Y2_ENABLE_PIN)) + #endif + #ifndef Y2_DIR_INIT + #define Y2_DIR_INIT() SET_OUTPUT(Y2_DIR_PIN) + #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE) + #define Y2_DIR_READ() bool(READ(Y2_DIR_PIN)) + #endif + #define Y2_STEP_INIT() SET_OUTPUT(Y2_STEP_PIN) + #ifndef Y2_STEP_WRITE + #define Y2_STEP_WRITE(STATE) WRITE(Y2_STEP_PIN,STATE) + #endif + #define Y2_STEP_READ() bool(READ(Y2_STEP_PIN)) +#else + #define Y2_DIR_WRITE(STATE) NOOP +#endif + +// Z2 Stepper +#if HAS_Z2_ENABLE + #ifndef Z2_ENABLE_INIT + #define Z2_ENABLE_INIT() SET_OUTPUT(Z2_ENABLE_PIN) + #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) + #define Z2_ENABLE_READ() bool(READ(Z2_ENABLE_PIN)) + #endif + #ifndef Z2_DIR_INIT + #define Z2_DIR_INIT() SET_OUTPUT(Z2_DIR_PIN) + #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE) + #define Z2_DIR_READ() bool(READ(Z2_DIR_PIN)) + #endif + #define Z2_STEP_INIT() SET_OUTPUT(Z2_STEP_PIN) + #ifndef Z2_STEP_WRITE + #define Z2_STEP_WRITE(STATE) WRITE(Z2_STEP_PIN,STATE) + #endif + #define Z2_STEP_READ() bool(READ(Z2_STEP_PIN)) +#else + #define Z2_DIR_WRITE(STATE) NOOP +#endif + +// Z3 Stepper +#if HAS_Z3_ENABLE + #ifndef Z3_ENABLE_INIT + #define Z3_ENABLE_INIT() SET_OUTPUT(Z3_ENABLE_PIN) + #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE) + #define Z3_ENABLE_READ() bool(READ(Z3_ENABLE_PIN)) + #endif + #ifndef Z3_DIR_INIT + #define Z3_DIR_INIT() SET_OUTPUT(Z3_DIR_PIN) + #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE) + #define Z3_DIR_READ() bool(READ(Z3_DIR_PIN)) + #endif + #define Z3_STEP_INIT() SET_OUTPUT(Z3_STEP_PIN) + #ifndef Z3_STEP_WRITE + #define Z3_STEP_WRITE(STATE) WRITE(Z3_STEP_PIN,STATE) + #endif + #define Z3_STEP_READ() bool(READ(Z3_STEP_PIN)) +#else + #define Z3_DIR_WRITE(STATE) NOOP +#endif + +// Z4 Stepper +#if HAS_Z4_ENABLE + #ifndef Z4_ENABLE_INIT + #define Z4_ENABLE_INIT() SET_OUTPUT(Z4_ENABLE_PIN) + #define Z4_ENABLE_WRITE(STATE) WRITE(Z4_ENABLE_PIN,STATE) + #define Z4_ENABLE_READ() bool(READ(Z4_ENABLE_PIN)) + #endif + #ifndef Z4_DIR_INIT + #define Z4_DIR_INIT() SET_OUTPUT(Z4_DIR_PIN) + #define Z4_DIR_WRITE(STATE) WRITE(Z4_DIR_PIN,STATE) + #define Z4_DIR_READ() bool(READ(Z4_DIR_PIN)) + #endif + #define Z4_STEP_INIT() SET_OUTPUT(Z4_STEP_PIN) + #ifndef Z4_STEP_WRITE + #define Z4_STEP_WRITE(STATE) WRITE(Z4_STEP_PIN,STATE) + #endif + #define Z4_STEP_READ() bool(READ(Z4_STEP_PIN)) +#else + #define Z4_DIR_WRITE(STATE) NOOP +#endif + +// E0 Stepper +#ifndef E0_ENABLE_INIT + #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) + #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) + #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) +#endif +#ifndef E0_DIR_INIT + #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) + #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE) + #define E0_DIR_READ() bool(READ(E0_DIR_PIN)) +#endif +#define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) +#ifndef E0_STEP_WRITE + #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) +#endif +#define E0_STEP_READ() bool(READ(E0_STEP_PIN)) + +// E1 Stepper +#ifndef E1_ENABLE_INIT + #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) + #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) + #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) +#endif +#ifndef E1_DIR_INIT + #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) + #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE) + #define E1_DIR_READ() bool(READ(E1_DIR_PIN)) +#endif +#define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) +#ifndef E1_STEP_WRITE + #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) +#endif +#define E1_STEP_READ() bool(READ(E1_STEP_PIN)) + +// E2 Stepper +#ifndef E2_ENABLE_INIT + #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) + #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) + #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) +#endif +#ifndef E2_DIR_INIT + #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) + #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE) + #define E2_DIR_READ() bool(READ(E2_DIR_PIN)) +#endif +#define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) +#ifndef E2_STEP_WRITE + #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) +#endif +#define E2_STEP_READ() bool(READ(E2_STEP_PIN)) + +// E3 Stepper +#ifndef E3_ENABLE_INIT + #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) + #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) + #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) +#endif +#ifndef E3_DIR_INIT + #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) + #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE) + #define E3_DIR_READ() bool(READ(E3_DIR_PIN)) +#endif +#define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) +#ifndef E3_STEP_WRITE + #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) +#endif +#define E3_STEP_READ() bool(READ(E3_STEP_PIN)) + +// E4 Stepper +#ifndef E4_ENABLE_INIT + #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) + #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) + #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) +#endif +#ifndef E4_DIR_INIT + #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) + #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE) + #define E4_DIR_READ() bool(READ(E4_DIR_PIN)) +#endif +#define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) +#ifndef E4_STEP_WRITE + #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) +#endif +#define E4_STEP_READ() bool(READ(E4_STEP_PIN)) + +// E5 Stepper +#ifndef E5_ENABLE_INIT + #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) + #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) + #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) +#endif +#ifndef E5_DIR_INIT + #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) + #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE) + #define E5_DIR_READ() bool(READ(E5_DIR_PIN)) +#endif +#define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) +#ifndef E5_STEP_WRITE + #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) +#endif +#define E5_STEP_READ() bool(READ(E5_STEP_PIN)) + +// E6 Stepper +#ifndef E6_ENABLE_INIT + #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) + #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) + #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) +#endif +#ifndef E6_DIR_INIT + #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) + #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,STATE) + #define E6_DIR_READ() bool(READ(E6_DIR_PIN)) +#endif +#define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) +#ifndef E6_STEP_WRITE + #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) +#endif +#define E6_STEP_READ() bool(READ(E6_STEP_PIN)) + +// E7 Stepper +#ifndef E7_ENABLE_INIT + #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) + #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) + #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) +#endif +#ifndef E7_DIR_INIT + #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) + #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,STATE) + #define E7_DIR_READ() bool(READ(E7_DIR_PIN)) +#endif +#define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) +#ifndef E7_STEP_WRITE + #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) +#endif +#define E7_STEP_READ() bool(READ(E7_STEP_PIN)) + +/** + * Extruder indirection for the single E axis + */ +#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index + #if EXTRUDERS > 7 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 5: E2_DIR_WRITE( INVERT_E2_DIR); break; \ + case 6: E3_DIR_WRITE( INVERT_E3_DIR); break; case 7: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + } }while(0) + #define REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; case 5: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ + case 6: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 7: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ + } }while(0) + #elif EXTRUDERS > 6 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 5: E2_DIR_WRITE( INVERT_E2_DIR); break; \ + case 6: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + } }while(0) + #define REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; case 5: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ + case 6: E3_DIR_WRITE(!INVERT_E3_DIR); } }while(0) + #elif EXTRUDERS > 5 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 5: E2_DIR_WRITE( INVERT_E2_DIR); break; \ + } }while(0) + #define REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; case 5: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ + } }while(0) + #elif EXTRUDERS > 4 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE(!INVERT_E2_DIR); break; \ + } }while(0) + #define REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 4: E2_DIR_WRITE( INVERT_E2_DIR); break; \ + } }while(0) + #elif EXTRUDERS > 3 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + } }while(0) + #define REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + } }while(0) + #elif EXTRUDERS > 2 + #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + } }while(0) + #define REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; \ + case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + } }while(0) + #else + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) + #endif +#elif ENABLED(PRUSA_MMU2) + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) + #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) + +#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) + +#elif E_STEPPERS > 1 + + #if E_STEPPERS > 7 + + #define _E_STEP_WRITE(E,V) do{ switch (E) { \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; case 7: E7_STEP_WRITE(V); break; \ + } }while(0) + #define _NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; case 5: E5_DIR_WRITE(!INVERT_E5_DIR); break; \ + case 6: E6_DIR_WRITE(!INVERT_E6_DIR); break; case 7: E7_DIR_WRITE(!INVERT_E7_DIR); break; \ + } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; case 5: E5_DIR_WRITE( INVERT_E5_DIR); break; \ + case 6: E6_DIR_WRITE( INVERT_E6_DIR); break; case 7: E7_DIR_WRITE( INVERT_E7_DIR); break; \ + } }while(0) + + #elif E_STEPPERS > 6 + + #define _E_STEP_WRITE(E,V) do{ switch (E) { \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; \ + } }while(0) + #define _NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; case 5: E5_DIR_WRITE(!INVERT_E5_DIR); break; \ + case 6: E6_DIR_WRITE(!INVERT_E6_DIR); break; \ + } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; case 5: E5_DIR_WRITE( INVERT_E5_DIR); break; \ + case 6: E6_DIR_WRITE( INVERT_E6_DIR); break; \ + } }while(0) + + #elif E_STEPPERS > 5 + + #define _E_STEP_WRITE(E,V) do{ switch (E) { \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; \ + } }while(0) + #define _NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; case 5: E5_DIR_WRITE(!INVERT_E5_DIR); break; \ + } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; case 5: E5_DIR_WRITE( INVERT_E5_DIR); break; \ + } }while(0) + + #elif E_STEPPERS > 4 + + #define _E_STEP_WRITE(E,V) do{ switch (E) { \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 4: E4_STEP_WRITE(V); break; \ + } }while(0) + #define _NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE(!INVERT_E4_DIR); break; \ + } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + case 4: E4_DIR_WRITE( INVERT_E4_DIR); break; \ + } }while(0) + + #elif E_STEPPERS > 3 + + #define _E_STEP_WRITE(E,V) do{ switch (E) { \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + } }while(0) + #define _NORM_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; \ + } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; \ + case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; \ + } }while(0) + + #elif E_STEPPERS > 2 + + #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0) + #define _NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0) + + #else + + #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define _NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0) + #define _REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0) + #endif + + #if HAS_DUPLICATION_MODE + + #if ENABLED(MULTI_NOZZLE_DUPLICATION) + #define _DUPE(N,T,V) do{ if (TEST(duplication_e_mask, N)) E##N##_##T##_WRITE(V); }while(0) + #else + #define _DUPE(N,T,V) E##N##_##T##_WRITE(V) + #endif + + #define NDIR(N) _DUPE(N,DIR,!INVERT_E##N##_DIR) + #define RDIR(N) _DUPE(N,DIR, INVERT_E##N##_DIR) + + #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { DUPE(STEP,V); } else _E_STEP_WRITE(E,V); }while(0) + + #if E_STEPPERS > 2 + #if E_STEPPERS > 7 + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); _DUPE(6,T,V); _DUPE(7,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); NDIR(6); NDIR(7); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); RDIR(6); RDIR(7); } else _REV_E_DIR(E); }while(0) + #elif E_STEPPERS > 6 + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); _DUPE(6,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); NDIR(6); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); RDIR(6); } else _REV_E_DIR(E); }while(0) + #elif E_STEPPERS > 5 + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); _DUPE(5,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); NDIR(5); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); RDIR(5); } else _REV_E_DIR(E); }while(0) + #elif E_STEPPERS > 4 + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); _DUPE(4,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); NDIR(4); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); RDIR(4); } else _REV_E_DIR(E); }while(0) + #elif E_STEPPERS > 3 + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); _DUPE(3,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); NDIR(3); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); RDIR(3); } else _REV_E_DIR(E); }while(0) + #else + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); _DUPE(2,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); NDIR(2); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); RDIR(2); } else _REV_E_DIR(E); }while(0) + #endif + #else + #define DUPE(T,V) do{ _DUPE(0,T,V); _DUPE(1,T,V); }while(0) + #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { NDIR(0); NDIR(1); } else _NORM_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { RDIR(0); RDIR(1); } else _REV_E_DIR(E); }while(0) + #endif + + #else + + #define E_STEP_WRITE(E,V) _E_STEP_WRITE(E,V) + #define NORM_E_DIR(E) _NORM_E_DIR(E) + #define REV_E_DIR(E) _REV_E_DIR(E) + + #endif + +#elif E_STEPPERS + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR) + #define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR) + +#else + #define E_STEP_WRITE(E,V) NOOP + #define NORM_E_DIR(E) NOOP + #define REV_E_DIR(E) NOOP + +#endif + +// +// Individual stepper enable / disable macros +// + +#ifndef ENABLE_STEPPER_X + #if HAS_X_ENABLE + #define ENABLE_STEPPER_X() X_ENABLE_WRITE( X_ENABLE_ON) + #else + #define ENABLE_STEPPER_X() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_X + #if HAS_X_ENABLE + #define DISABLE_STEPPER_X() X_ENABLE_WRITE(!X_ENABLE_ON) + #else + #define DISABLE_STEPPER_X() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_X2 + #if HAS_X2_ENABLE + #define ENABLE_STEPPER_X2() X2_ENABLE_WRITE( X_ENABLE_ON) + #else + #define ENABLE_STEPPER_X2() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_X2 + #if HAS_X2_ENABLE + #define DISABLE_STEPPER_X2() X2_ENABLE_WRITE(!X_ENABLE_ON) + #else + #define DISABLE_STEPPER_X2() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_Y + #if HAS_Y_ENABLE + #define ENABLE_STEPPER_Y() Y_ENABLE_WRITE( Y_ENABLE_ON) + #else + #define ENABLE_STEPPER_Y() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_Y + #if HAS_Y_ENABLE + #define DISABLE_STEPPER_Y() Y_ENABLE_WRITE(!Y_ENABLE_ON) + #else + #define DISABLE_STEPPER_Y() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_Y2 + #if HAS_Y2_ENABLE + #define ENABLE_STEPPER_Y2() Y2_ENABLE_WRITE( Y_ENABLE_ON) + #else + #define ENABLE_STEPPER_Y2() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_Y2 + #if HAS_Y2_ENABLE + #define DISABLE_STEPPER_Y2() Y2_ENABLE_WRITE(!Y_ENABLE_ON) + #else + #define DISABLE_STEPPER_Y2() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_Z + #if HAS_Z_ENABLE + #define ENABLE_STEPPER_Z() Z_ENABLE_WRITE( Z_ENABLE_ON) + #else + #define ENABLE_STEPPER_Z() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_Z + #if HAS_Z_ENABLE + #define DISABLE_STEPPER_Z() Z_ENABLE_WRITE(!Z_ENABLE_ON) + #else + #define DISABLE_STEPPER_Z() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_Z2 + #if HAS_Z2_ENABLE + #define ENABLE_STEPPER_Z2() Z2_ENABLE_WRITE( Z_ENABLE_ON) + #else + #define ENABLE_STEPPER_Z2() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_Z2 + #if HAS_Z2_ENABLE + #define DISABLE_STEPPER_Z2() Z2_ENABLE_WRITE(!Z_ENABLE_ON) + #else + #define DISABLE_STEPPER_Z2() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_Z3 + #if HAS_Z3_ENABLE + #define ENABLE_STEPPER_Z3() Z3_ENABLE_WRITE( Z_ENABLE_ON) + #else + #define ENABLE_STEPPER_Z3() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_Z3 + #if HAS_Z3_ENABLE + #define DISABLE_STEPPER_Z3() Z3_ENABLE_WRITE(!Z_ENABLE_ON) + #else + #define DISABLE_STEPPER_Z3() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_Z4 + #if HAS_Z4_ENABLE + #define ENABLE_STEPPER_Z4() Z4_ENABLE_WRITE( Z_ENABLE_ON) + #else + #define ENABLE_STEPPER_Z4() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_Z4 + #if HAS_Z4_ENABLE + #define DISABLE_STEPPER_Z4() Z4_ENABLE_WRITE(!Z_ENABLE_ON) + #else + #define DISABLE_STEPPER_Z4() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E0 + #if HAS_E0_ENABLE + #define ENABLE_STEPPER_E0() E0_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E0() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E0 + #if HAS_E0_ENABLE + #define DISABLE_STEPPER_E0() E0_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E0() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E1 + #if E_STEPPERS > 1 && HAS_E1_ENABLE + #define ENABLE_STEPPER_E1() E1_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E1() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E1 + #if E_STEPPERS > 1 && HAS_E1_ENABLE + #define DISABLE_STEPPER_E1() E1_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E1() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E2 + #if E_STEPPERS > 2 && HAS_E2_ENABLE + #define ENABLE_STEPPER_E2() E2_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E2() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E2 + #if E_STEPPERS > 2 && HAS_E2_ENABLE + #define DISABLE_STEPPER_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E2() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E3 + #if E_STEPPERS > 3 && HAS_E3_ENABLE + #define ENABLE_STEPPER_E3() E3_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E3() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E3 + #if E_STEPPERS > 3 && HAS_E3_ENABLE + #define DISABLE_STEPPER_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E3() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E4 + #if E_STEPPERS > 4 && HAS_E4_ENABLE + #define ENABLE_STEPPER_E4() E4_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E4() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E4 + #if E_STEPPERS > 4 && HAS_E4_ENABLE + #define DISABLE_STEPPER_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E4() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E5 + #if E_STEPPERS > 5 && HAS_E5_ENABLE + #define ENABLE_STEPPER_E5() E5_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E5() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E5 + #if E_STEPPERS > 5 && HAS_E5_ENABLE + #define DISABLE_STEPPER_E5() E5_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E5() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E6 + #if E_STEPPERS > 6 && HAS_E6_ENABLE + #define ENABLE_STEPPER_E6() E6_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E6() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E6 + #if E_STEPPERS > 6 && HAS_E6_ENABLE + #define DISABLE_STEPPER_E6() E6_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E6() NOOP + #endif +#endif + +#ifndef ENABLE_STEPPER_E7 + #if E_STEPPERS > 7 && HAS_E7_ENABLE + #define ENABLE_STEPPER_E7() E7_ENABLE_WRITE( E_ENABLE_ON) + #else + #define ENABLE_STEPPER_E7() NOOP + #endif +#endif +#ifndef DISABLE_STEPPER_E7 + #if E_STEPPERS > 7 && HAS_E7_ENABLE + #define DISABLE_STEPPER_E7() E7_ENABLE_WRITE(!E_ENABLE_ON) + #else + #define DISABLE_STEPPER_E7() NOOP + #endif +#endif + +// +// 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(); 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(); 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) + +#ifdef Z_AFTER_DEACTIVATE + #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; 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(); FORGET_AXIS(Z_AXIS); Z_RESET(); }while(0) + +// +// Extruder steppers enable / disable macros +// + +#if ENABLED(MIXING_EXTRUDER) + /** + * Mixing steppers keep all their enable (and direction) states synchronized + */ + #define _CALL_ENA_E(N) ENABLE_STEPPER_E##N () ; + #define _CALL_DIS_E(N) DISABLE_STEPPER_E##N () ; + #define ENABLE_AXIS_E0() { RREPEAT(MIXING_STEPPERS, _CALL_ENA_E) } + #define DISABLE_AXIS_E0() { RREPEAT(MIXING_STEPPERS, _CALL_DIS_E) } +#endif + +#ifndef ENABLE_AXIS_E0 + #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 && HAS_E0_ENABLE + #define DISABLE_AXIS_E0() DISABLE_STEPPER_E0() + #else + #define DISABLE_AXIS_E0() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E1 + #if E_STEPPERS > 1 && HAS_E1_ENABLE + #define ENABLE_AXIS_E1() ENABLE_STEPPER_E1() + #else + #define ENABLE_AXIS_E1() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E1 + #if E_STEPPERS > 1 && HAS_E1_ENABLE + #define DISABLE_AXIS_E1() DISABLE_STEPPER_E1() + #else + #define DISABLE_AXIS_E1() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E2 + #if E_STEPPERS > 2 && HAS_E2_ENABLE + #define ENABLE_AXIS_E2() ENABLE_STEPPER_E2() + #else + #define ENABLE_AXIS_E2() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E2 + #if E_STEPPERS > 2 && HAS_E2_ENABLE + #define DISABLE_AXIS_E2() DISABLE_STEPPER_E2() + #else + #define DISABLE_AXIS_E2() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E3 + #if E_STEPPERS > 3 && HAS_E3_ENABLE + #define ENABLE_AXIS_E3() ENABLE_STEPPER_E3() + #else + #define ENABLE_AXIS_E3() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E3 + #if E_STEPPERS > 3 && HAS_E3_ENABLE + #define DISABLE_AXIS_E3() DISABLE_STEPPER_E3() + #else + #define DISABLE_AXIS_E3() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E4 + #if E_STEPPERS > 4 && HAS_E4_ENABLE + #define ENABLE_AXIS_E4() ENABLE_STEPPER_E4() + #else + #define ENABLE_AXIS_E4() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E4 + #if E_STEPPERS > 4 && HAS_E4_ENABLE + #define DISABLE_AXIS_E4() DISABLE_STEPPER_E4() + #else + #define DISABLE_AXIS_E4() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E5 + #if E_STEPPERS > 5 && HAS_E5_ENABLE + #define ENABLE_AXIS_E5() ENABLE_STEPPER_E5() + #else + #define ENABLE_AXIS_E5() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E5 + #if E_STEPPERS > 5 && HAS_E5_ENABLE + #define DISABLE_AXIS_E5() DISABLE_STEPPER_E5() + #else + #define DISABLE_AXIS_E5() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E6 + #if E_STEPPERS > 6 && HAS_E6_ENABLE + #define ENABLE_AXIS_E6() ENABLE_STEPPER_E6() + #else + #define ENABLE_AXIS_E6() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E6 + #if E_STEPPERS > 6 && HAS_E6_ENABLE + #define DISABLE_AXIS_E6() DISABLE_STEPPER_E6() + #else + #define DISABLE_AXIS_E6() NOOP + #endif +#endif + +#ifndef ENABLE_AXIS_E7 + #if E_STEPPERS > 7 && HAS_E7_ENABLE + #define ENABLE_AXIS_E7() ENABLE_STEPPER_E7() + #else + #define ENABLE_AXIS_E7() NOOP + #endif +#endif +#ifndef DISABLE_AXIS_E7 + #if E_STEPPERS > 7 && HAS_E7_ENABLE + #define DISABLE_AXIS_E7() DISABLE_STEPPER_E7() + #else + #define DISABLE_AXIS_E7() NOOP + #endif +#endif diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp new file mode 100644 index 00000000..d5a861d7 --- /dev/null +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -0,0 +1,877 @@ +/** + * 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 . + * + */ + +/** + * stepper/trinamic.cpp + * Stepper driver indirection for Trinamic + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_TRINAMIC_CONFIG + +#include "trinamic.h" +#include "../stepper.h" + +#include +#include + +enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E }; +#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX]) + +// IC = TMC model number +// ST = Stepper object letter +// L = Label characters +// AI = Axis Enum Index +// SWHW = SW/SH UART selection +#if ENABLED(TMC_USE_SW_SPI) + #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK, ST##_CHAIN_POS) +#else + #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS) +#endif + +#if ENABLED(TMC_SERIAL_MULTIPLEXER) + #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(&ST##_HARDWARE_SERIAL, float(ST##_RSENSE), ST##_SLAVE_ADDRESS, SERIAL_MUL_PIN1, SERIAL_MUL_PIN2) +#else + #define TMC_UART_HW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(&ST##_HARDWARE_SERIAL, float(ST##_RSENSE), ST##_SLAVE_ADDRESS) +#endif +#define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, float(ST##_RSENSE), ST##_SLAVE_ADDRESS) + +#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI) +#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS) + +#define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI) +#define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS) + +#if DISTINCT_E > 1 + #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI) + #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI) +#else + #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E) + #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E) +#endif + +// Stepper objects of TMC2130/TMC2160/TMC2660/TMC5130/TMC5160 steppers used +#if AXIS_HAS_SPI(X) + TMC_SPI_DEFINE(X, X); +#endif +#if AXIS_HAS_SPI(X2) + TMC_SPI_DEFINE(X2, X); +#endif +#if AXIS_HAS_SPI(Y) + TMC_SPI_DEFINE(Y, Y); +#endif +#if AXIS_HAS_SPI(Y2) + TMC_SPI_DEFINE(Y2, Y); +#endif +#if AXIS_HAS_SPI(Z) + TMC_SPI_DEFINE(Z, Z); +#endif +#if AXIS_HAS_SPI(Z2) + TMC_SPI_DEFINE(Z2, Z); +#endif +#if AXIS_HAS_SPI(Z3) + TMC_SPI_DEFINE(Z3, Z); +#endif +#if AXIS_HAS_SPI(Z4) + TMC_SPI_DEFINE(Z4, Z); +#endif +#if AXIS_HAS_SPI(E0) + TMC_SPI_DEFINE_E(0); +#endif +#if AXIS_HAS_SPI(E1) + TMC_SPI_DEFINE_E(1); +#endif +#if AXIS_HAS_SPI(E2) + TMC_SPI_DEFINE_E(2); +#endif +#if AXIS_HAS_SPI(E3) + TMC_SPI_DEFINE_E(3); +#endif +#if AXIS_HAS_SPI(E4) + TMC_SPI_DEFINE_E(4); +#endif +#if AXIS_HAS_SPI(E5) + TMC_SPI_DEFINE_E(5); +#endif +#if AXIS_HAS_SPI(E6) + TMC_SPI_DEFINE_E(6); +#endif +#if AXIS_HAS_SPI(E7) + TMC_SPI_DEFINE_E(7); +#endif + +#ifndef TMC_BAUD_RATE + // Reduce baud rate for boards not already overriding TMC_BAUD_RATE for software serial. + // Testing has shown that 115200 is not 100% reliable on AVR platforms, occasionally + // failing to read status properly. 32-bit platforms typically define an even lower + // TMC_BAUD_RATE, due to differences in how SoftwareSerial libraries work on different + // platforms. + #define TMC_BAUD_RATE TERN(HAS_TMC_SW_SERIAL, 57600, 115200) +#endif + +#if HAS_DRIVER(TMC2130) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + st.begin(); + + CHOPCONF_t chopconf{0}; + chopconf.tbl = 1; + chopconf.toff = chopper_timing.toff; + chopconf.intpol = INTERPOLATE; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); + st.CHOPCONF(chopconf.sr); + + st.rms_current(mA, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.iholddelay(10); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + + st.en_pwm_mode(stealth); + st.stored.stealthChop_enabled = stealth; + + PWMCONF_t pwmconf{0}; + pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk + pwmconf.pwm_autoscale = true; + pwmconf.pwm_grad = 5; + pwmconf.pwm_ampl = 180; + st.PWMCONF(pwmconf.sr); + + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + + st.GSTAT(); // Clear GSTAT + } +#endif // TMC2130 + +#if HAS_DRIVER(TMC2160) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + st.begin(); + + CHOPCONF_t chopconf{0}; + chopconf.tbl = 1; + chopconf.toff = chopper_timing.toff; + chopconf.intpol = INTERPOLATE; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); + st.CHOPCONF(chopconf.sr); + + st.rms_current(mA, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.iholddelay(10); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + + st.en_pwm_mode(stealth); + st.stored.stealthChop_enabled = stealth; + + TMC2160_n::PWMCONF_t pwmconf{0}; + pwmconf.pwm_lim = 12; + pwmconf.pwm_reg = 8; + pwmconf.pwm_autograd = true; + pwmconf.pwm_autoscale = true; + pwmconf.pwm_freq = 0b01; + pwmconf.pwm_grad = 14; + pwmconf.pwm_ofs = 36; + st.PWMCONF(pwmconf.sr); + + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + + st.GSTAT(); // Clear GSTAT + } +#endif // TMC2160 + +// +// TMC2208/2209 Driver objects and inits +// +#if HAS_TMC220x + #if AXIS_HAS_UART(X) + #ifdef X_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, X, X); + #define X_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, X, X); + #define X_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(X2) + #ifdef X2_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, X2, X); + #define X2_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, X2, X); + #define X2_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(Y) + #ifdef Y_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, Y, Y); + #define Y_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, Y, Y); + #define Y_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(Y2) + #ifdef Y2_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, Y2, Y); + #define Y2_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, Y2, Y); + #define Y2_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(Z) + #ifdef Z_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, Z, Z); + #define Z_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, Z, Z); + #define Z_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(Z2) + #ifdef Z2_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, Z2, Z); + #define Z2_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, Z2, Z); + #define Z2_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(Z3) + #ifdef Z3_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, Z3, Z); + #define Z3_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, Z3, Z); + #define Z3_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(Z4) + #ifdef Z4_HARDWARE_SERIAL + TMC_UART_DEFINE(HW, Z4, Z); + #define Z4_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE(SW, Z4, Z); + #define Z4_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E0) + #ifdef E0_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 0); + #define E0_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 0); + #define E0_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E1) + #ifdef E1_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 1); + #define E1_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 1); + #define E1_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E2) + #ifdef E2_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 2); + #define E2_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 2); + #define E2_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E3) + #ifdef E3_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 3); + #define E3_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 3); + #define E3_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E4) + #ifdef E4_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 4); + #define E4_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 4); + #define E4_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E5) + #ifdef E5_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 5); + #define E5_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 5); + #define E5_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E6) + #ifdef E6_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 6); + #define E6_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 6); + #define E6_HAS_SW_SERIAL 1 + #endif + #endif + #if AXIS_HAS_UART(E7) + #ifdef E7_HARDWARE_SERIAL + TMC_UART_DEFINE_E(HW, 7); + #define E7_HAS_HW_SERIAL 1 + #else + TMC_UART_DEFINE_E(SW, 7); + #define E7_HAS_SW_SERIAL 1 + #endif + #endif + + enum TMCAxis : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4, E0, E1, E2, E3, E4, E5, E6, E7, TOTAL }; + + void tmc_serial_begin() { + #if HAS_TMC_HW_SERIAL + struct { + const void *ptr[TMCAxis::TOTAL]; + bool began(const TMCAxis a, const void * const p) { + LOOP_L_N(i, a) if (p == ptr[i]) return true; + ptr[a] = p; return false; + }; + } sp_helper; + + #define HW_SERIAL_BEGIN(A) do{ if (!sp_helper.began(TMCAxis::A, &A##_HARDWARE_SERIAL)) \ + A##_HARDWARE_SERIAL.begin(TMC_BAUD_RATE); }while(0) + #endif + + #if AXIS_HAS_UART(X) + #ifdef X_HARDWARE_SERIAL + HW_SERIAL_BEGIN(X); + #else + stepperX.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(X2) + #ifdef X2_HARDWARE_SERIAL + HW_SERIAL_BEGIN(X2); + #else + stepperX2.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(Y) + #ifdef Y_HARDWARE_SERIAL + HW_SERIAL_BEGIN(Y); + #else + stepperY.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(Y2) + #ifdef Y2_HARDWARE_SERIAL + HW_SERIAL_BEGIN(Y2); + #else + stepperY2.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(Z) + #ifdef Z_HARDWARE_SERIAL + HW_SERIAL_BEGIN(Z); + #else + stepperZ.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(Z2) + #ifdef Z2_HARDWARE_SERIAL + HW_SERIAL_BEGIN(Z2); + #else + stepperZ2.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(Z3) + #ifdef Z3_HARDWARE_SERIAL + HW_SERIAL_BEGIN(Z3); + #else + stepperZ3.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(Z4) + #ifdef Z4_HARDWARE_SERIAL + HW_SERIAL_BEGIN(Z4); + #else + stepperZ4.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E0) + #ifdef E0_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E0); + #else + stepperE0.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E1) + #ifdef E1_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E1); + #else + stepperE1.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E2) + #ifdef E2_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E2); + #else + stepperE2.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E3) + #ifdef E3_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E3); + #else + stepperE3.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E4) + #ifdef E4_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E4); + #else + stepperE4.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E5) + #ifdef E5_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E5); + #else + stepperE5.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E6) + #ifdef E6_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E6); + #else + stepperE6.beginSerial(TMC_BAUD_RATE); + #endif + #endif + #if AXIS_HAS_UART(E7) + #ifdef E7_HARDWARE_SERIAL + HW_SERIAL_BEGIN(E7); + #else + stepperE7.beginSerial(TMC_BAUD_RATE); + #endif + #endif + } +#endif + +#if HAS_DRIVER(TMC2208) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + TMC2208_n::GCONF_t gconf{0}; + gconf.pdn_disable = true; // Use UART + gconf.mstep_reg_select = true; // Select microsteps with UART + gconf.i_scale_analog = false; + gconf.en_spreadcycle = !stealth; + st.GCONF(gconf.sr); + st.stored.stealthChop_enabled = stealth; + + TMC2208_n::CHOPCONF_t chopconf{0}; + chopconf.tbl = 0b01; // blank_time = 24 + chopconf.toff = chopper_timing.toff; + chopconf.intpol = INTERPOLATE; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); + st.CHOPCONF(chopconf.sr); + + st.rms_current(mA, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.iholddelay(10); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + + TMC2208_n::PWMCONF_t pwmconf{0}; + pwmconf.pwm_lim = 12; + pwmconf.pwm_reg = 8; + pwmconf.pwm_autograd = true; + pwmconf.pwm_autoscale = true; + pwmconf.pwm_freq = 0b01; + pwmconf.pwm_grad = 14; + pwmconf.pwm_ofs = 36; + st.PWMCONF(pwmconf.sr); + + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + + st.GSTAT(0b111); // Clear + delay(200); + } +#endif // TMC2208 + +#if HAS_DRIVER(TMC2209) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + TMC2208_n::GCONF_t gconf{0}; + gconf.pdn_disable = true; // Use UART + gconf.mstep_reg_select = true; // Select microsteps with UART + gconf.i_scale_analog = false; + gconf.en_spreadcycle = !stealth; + st.GCONF(gconf.sr); + st.stored.stealthChop_enabled = stealth; + + TMC2208_n::CHOPCONF_t chopconf{0}; + chopconf.tbl = 0b01; // blank_time = 24 + chopconf.toff = chopper_timing.toff; + chopconf.intpol = INTERPOLATE; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); + st.CHOPCONF(chopconf.sr); + + st.rms_current(mA, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.iholddelay(10); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + + TMC2208_n::PWMCONF_t pwmconf{0}; + pwmconf.pwm_lim = 12; + pwmconf.pwm_reg = 8; + pwmconf.pwm_autograd = true; + pwmconf.pwm_autoscale = true; + pwmconf.pwm_freq = 0b01; + pwmconf.pwm_grad = 14; + pwmconf.pwm_ofs = 36; + st.PWMCONF(pwmconf.sr); + + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + + st.GSTAT(0b111); // Clear + delay(200); + } +#endif // TMC2209 + +#if HAS_DRIVER(TMC2660) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool) { + st.begin(); + + TMC2660_n::CHOPCONF_t chopconf{0}; + chopconf.tbl = 1; + chopconf.toff = chopper_timing.toff; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + st.CHOPCONF(chopconf.sr); + + st.sdoff(0); + st.rms_current(mA); + st.microsteps(microsteps); + TERN_(SQUARE_WAVE_STEPPING, st.dedge(true)); + st.intpol(INTERPOLATE); + st.diss2g(true); // Disable short to ground protection. Too many false readings? + TERN_(TMC_DEBUG, st.rdsel(0b01)); + } +#endif // TMC2660 + +#if HAS_DRIVER(TMC5130) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + st.begin(); + + CHOPCONF_t chopconf{0}; + chopconf.tbl = 1; + chopconf.toff = chopper_timing.toff; + chopconf.intpol = INTERPOLATE; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); + st.CHOPCONF(chopconf.sr); + + st.rms_current(mA, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.iholddelay(10); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + + st.en_pwm_mode(stealth); + st.stored.stealthChop_enabled = stealth; + + PWMCONF_t pwmconf{0}; + pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk + pwmconf.pwm_autoscale = true; + pwmconf.pwm_grad = 5; + pwmconf.pwm_ampl = 180; + st.PWMCONF(pwmconf.sr); + + TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs)); + + st.GSTAT(); // Clear GSTAT + } +#endif // TMC5130 + +#if HAS_DRIVER(TMC5160) + template + void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth) { + st.begin(); + + CHOPCONF_t chopconf{0}; + chopconf.tbl = 1; + chopconf.toff = chopper_timing.toff; + chopconf.intpol = INTERPOLATE; + chopconf.hend = chopper_timing.hend + 3; + chopconf.hstrt = chopper_timing.hstrt - 1; + TERN_(SQUARE_WAVE_STEPPING, chopconf.dedge = true); + st.CHOPCONF(chopconf.sr); + + st.rms_current(mA, HOLD_MULTIPLIER); + st.microsteps(microsteps); + st.iholddelay(10); + st.TPOWERDOWN(128); // ~2s until driver lowers to hold current + + st.en_pwm_mode(stealth); + st.stored.stealthChop_enabled = stealth; + + TMC2160_n::PWMCONF_t pwmconf{0}; + pwmconf.pwm_lim = 12; + pwmconf.pwm_reg = 8; + pwmconf.pwm_autograd = true; + pwmconf.pwm_autoscale = true; + pwmconf.pwm_freq = 0b01; + pwmconf.pwm_grad = 14; + pwmconf.pwm_ofs = 36; + st.PWMCONF(pwmconf.sr); + + #if ENABLED(HYBRID_THRESHOLD) + st.set_pwm_thrs(hyb_thrs); + #else + UNUSED(hyb_thrs); + #endif + st.GSTAT(); // Clear GSTAT + } +#endif // TMC5160 + +void restore_trinamic_drivers() { + #if AXIS_IS_TMC(X) + stepperX.push(); + #endif + #if AXIS_IS_TMC(X2) + stepperX2.push(); + #endif + #if AXIS_IS_TMC(Y) + stepperY.push(); + #endif + #if AXIS_IS_TMC(Y2) + stepperY2.push(); + #endif + #if AXIS_IS_TMC(Z) + stepperZ.push(); + #endif + #if AXIS_IS_TMC(Z2) + stepperZ2.push(); + #endif + #if AXIS_IS_TMC(Z3) + stepperZ3.push(); + #endif + #if AXIS_IS_TMC(Z4) + stepperZ4.push(); + #endif + #if AXIS_IS_TMC(E0) + stepperE0.push(); + #endif + #if AXIS_IS_TMC(E1) + stepperE1.push(); + #endif + #if AXIS_IS_TMC(E2) + stepperE2.push(); + #endif + #if AXIS_IS_TMC(E3) + stepperE3.push(); + #endif + #if AXIS_IS_TMC(E4) + stepperE4.push(); + #endif + #if AXIS_IS_TMC(E5) + stepperE5.push(); + #endif + #if AXIS_IS_TMC(E6) + stepperE6.push(); + #endif + #if AXIS_IS_TMC(E7) + stepperE7.push(); + #endif +} + +void reset_trinamic_drivers() { + static constexpr bool stealthchop_by_axis[] = { ENABLED(STEALTHCHOP_XY), ENABLED(STEALTHCHOP_Z), ENABLED(STEALTHCHOP_E) }; + + #if AXIS_IS_TMC(X) + TMC_INIT(X, STEALTH_AXIS_XY); + #endif + #if AXIS_IS_TMC(X2) + TMC_INIT(X2, STEALTH_AXIS_XY); + #endif + #if AXIS_IS_TMC(Y) + TMC_INIT(Y, STEALTH_AXIS_XY); + #endif + #if AXIS_IS_TMC(Y2) + TMC_INIT(Y2, STEALTH_AXIS_XY); + #endif + #if AXIS_IS_TMC(Z) + TMC_INIT(Z, STEALTH_AXIS_Z); + #endif + #if AXIS_IS_TMC(Z2) + TMC_INIT(Z2, STEALTH_AXIS_Z); + #endif + #if AXIS_IS_TMC(Z3) + TMC_INIT(Z3, STEALTH_AXIS_Z); + #endif + #if AXIS_IS_TMC(Z4) + TMC_INIT(Z4, STEALTH_AXIS_Z); + #endif + #if AXIS_IS_TMC(E0) + TMC_INIT(E0, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E1) + TMC_INIT(E1, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E2) + TMC_INIT(E2, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E3) + TMC_INIT(E3, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E4) + TMC_INIT(E4, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E5) + TMC_INIT(E5, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E6) + TMC_INIT(E6, STEALTH_AXIS_E); + #endif + #if AXIS_IS_TMC(E7) + TMC_INIT(E7, STEALTH_AXIS_E); + #endif + + #if USE_SENSORLESS + #if X_SENSORLESS + stepperX.homing_threshold(X_STALL_SENSITIVITY); + #if AXIS_HAS_STALLGUARD(X2) + stepperX2.homing_threshold(CAT(TERN(X2_SENSORLESS, X2, X), _STALL_SENSITIVITY)); + #endif + #endif + #if Y_SENSORLESS + stepperY.homing_threshold(Y_STALL_SENSITIVITY); + #if AXIS_HAS_STALLGUARD(Y2) + stepperY2.homing_threshold(CAT(TERN(Y2_SENSORLESS, Y2, Y), _STALL_SENSITIVITY)); + #endif + #endif + #if Z_SENSORLESS + stepperZ.homing_threshold(Z_STALL_SENSITIVITY); + #if AXIS_HAS_STALLGUARD(Z2) + stepperZ2.homing_threshold(CAT(TERN(Z2_SENSORLESS, Z2, Z), _STALL_SENSITIVITY)); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + stepperZ3.homing_threshold(CAT(TERN(Z3_SENSORLESS, Z3, Z), _STALL_SENSITIVITY)); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + stepperZ4.homing_threshold(CAT(TERN(Z4_SENSORLESS, Z4, Z), _STALL_SENSITIVITY)); + #endif + #endif + #endif + + #ifdef TMC_ADV + TMC_ADV() + #endif + + stepper.set_directions(); +} + +// TMC Slave Address Conflict Detection +// +// Conflict detection is performed in the following way. Similar methods are used for +// hardware and software serial, but the implementations are indepenent. +// +// 1. Populate a data structure with UART parameters and addresses for all possible axis. +// If an axis is not in use, populate it with recognizable placeholder data. +// 2. For each axis in use, static_assert using a constexpr function, which counts the +// number of matching/conflicting axis. If the value is not exactly 1, fail. + +#if ANY_AXIS_HAS(HW_SERIAL) + // Hardware serial names are compared as strings, since actually resolving them cannot occur in a constexpr. + // Using a fixed-length character array for the port name allows this to be constexpr compatible. + struct SanityHwSerialDetails { const char port[20]; uint32_t address; }; + #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS) + #define TMC_HW_DETAIL(A) {TMC_HW_DETAIL_ARGS(A)} + constexpr SanityHwSerialDetails sanity_tmc_hw_details[] = { + TMC_HW_DETAIL(X), TMC_HW_DETAIL(X2), + TMC_HW_DETAIL(Y), TMC_HW_DETAIL(Y2), + TMC_HW_DETAIL(Z), TMC_HW_DETAIL(Z2), TMC_HW_DETAIL(Z3), TMC_HW_DETAIL(Z4), + TMC_HW_DETAIL(E0), TMC_HW_DETAIL(E1), TMC_HW_DETAIL(E2), TMC_HW_DETAIL(E3), TMC_HW_DETAIL(E4), TMC_HW_DETAIL(E5), TMC_HW_DETAIL(E6), TMC_HW_DETAIL(E7) + }; + + // constexpr compatible string comparison + constexpr bool str_eq_ce(const char * a, const char * b) { + return *a == *b && (*a == '\0' || str_eq_ce(a+1,b+1)); + } + + constexpr bool sc_hw_done(size_t start, size_t end) { return start == end; } + constexpr bool sc_hw_skip(const char* port_name) { return !(*port_name); } + constexpr bool sc_hw_match(const char* port_name, uint32_t address, size_t start, size_t end) { + return !sc_hw_done(start, end) && !sc_hw_skip(port_name) && (address == sanity_tmc_hw_details[start].address && str_eq_ce(port_name, sanity_tmc_hw_details[start].port)); + } + constexpr int count_tmc_hw_serial_matches(const char* port_name, uint32_t address, size_t start, size_t end) { + return sc_hw_done(start, end) ? 0 : ((sc_hw_skip(port_name) ? 0 : (sc_hw_match(port_name, address, start, end) ? 1 : 0)) + count_tmc_hw_serial_matches(port_name, address, start + 1, end)); + } + + #define TMC_HWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_HARDWARE_SERIAL" + #define SA_NO_TMC_HW_C(A) static_assert(1 >= count_tmc_hw_serial_matches(TMC_HW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_hw_details)), TMC_HWSERIAL_CONFLICT_MSG(A)); + SA_NO_TMC_HW_C(X);SA_NO_TMC_HW_C(X2); + SA_NO_TMC_HW_C(Y);SA_NO_TMC_HW_C(Y2); + SA_NO_TMC_HW_C(Z);SA_NO_TMC_HW_C(Z2);SA_NO_TMC_HW_C(Z3);SA_NO_TMC_HW_C(Z4); + SA_NO_TMC_HW_C(E0);SA_NO_TMC_HW_C(E1);SA_NO_TMC_HW_C(E2);SA_NO_TMC_HW_C(E3);SA_NO_TMC_HW_C(E4);SA_NO_TMC_HW_C(E5);SA_NO_TMC_HW_C(E6);SA_NO_TMC_HW_C(E7); +#endif + +#if ANY_AXIS_HAS(SW_SERIAL) + struct SanitySwSerialDetails { int32_t txpin; int32_t rxpin; uint32_t address; }; + #define TMC_SW_DETAIL_ARGS(A) TERN(A##_HAS_SW_SERIAL, A##_SERIAL_TX_PIN, -1), TERN(A##_HAS_SW_SERIAL, A##_SERIAL_RX_PIN, -1), TERN0(A##_HAS_SW_SERIAL, A##_SLAVE_ADDRESS) + #define TMC_SW_DETAIL(A) TMC_SW_DETAIL_ARGS(A) + constexpr SanitySwSerialDetails sanity_tmc_sw_details[] = { + TMC_SW_DETAIL(X), TMC_SW_DETAIL(X2), + TMC_SW_DETAIL(Y), TMC_SW_DETAIL(Y2), + TMC_SW_DETAIL(Z), TMC_SW_DETAIL(Z2), TMC_SW_DETAIL(Z3), TMC_SW_DETAIL(Z4), + TMC_SW_DETAIL(E0), TMC_SW_DETAIL(E1), TMC_SW_DETAIL(E2), TMC_SW_DETAIL(E3), TMC_SW_DETAIL(E4), TMC_SW_DETAIL(E5), TMC_SW_DETAIL(E6), TMC_SW_DETAIL(E7) + }; + + constexpr bool sc_sw_done(size_t start, size_t end) { return start == end; } + constexpr bool sc_sw_skip(int32_t txpin) { return txpin < 0; } + constexpr bool sc_sw_match(int32_t txpin, int32_t rxpin, uint32_t address, size_t start, size_t end) { + return !sc_sw_done(start, end) && !sc_sw_skip(txpin) && (txpin == sanity_tmc_sw_details[start].txpin || rxpin == sanity_tmc_sw_details[start].rxpin) && (address == sanity_tmc_sw_details[start].address); + } + constexpr int count_tmc_sw_serial_matches(int32_t txpin, int32_t rxpin, uint32_t address, size_t start, size_t end) { + return sc_sw_done(start, end) ? 0 : ((sc_sw_skip(txpin) ? 0 : (sc_sw_match(txpin, rxpin, address, start, end) ? 1 : 0)) + count_tmc_sw_serial_matches(txpin, rxpin, address, start + 1, end)); + } + + #define TMC_SWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_SERIAL_RX_PIN or " STRINGIFY(A) "_SERIAL_TX_PIN" + #define SA_NO_TMC_SW_C(A) static_assert(1 >= count_tmc_sw_serial_matches(TMC_SW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_sw_details)), TMC_SWSERIAL_CONFLICT_MSG(A)); + SA_NO_TMC_SW_C(X);SA_NO_TMC_SW_C(X2); + SA_NO_TMC_SW_C(Y);SA_NO_TMC_SW_C(Y2); + SA_NO_TMC_SW_C(Z);SA_NO_TMC_SW_C(Z2);SA_NO_TMC_SW_C(Z3);SA_NO_TMC_SW_C(Z4); + SA_NO_TMC_SW_C(E0);SA_NO_TMC_SW_C(E1);SA_NO_TMC_SW_C(E2);SA_NO_TMC_SW_C(E3);SA_NO_TMC_SW_C(E4);SA_NO_TMC_SW_C(E5);SA_NO_TMC_SW_C(E6);SA_NO_TMC_SW_C(E7); +#endif + +#endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h new file mode 100644 index 00000000..9cc3404c --- /dev/null +++ b/Marlin/src/module/stepper/trinamic.h @@ -0,0 +1,296 @@ +/** + * 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 + +/** + * stepper/trinamic.h + * Stepper driver indirection for Trinamic + */ + +#include +#if TMCSTEPPER_VERSION < 0x000500 + #error "Update TMCStepper library to 0.5.0 or newer." +#endif + +#include "../../inc/MarlinConfig.h" +#include "../../feature/tmc_util.h" + +#define CLASS_TMC2130 TMC2130Stepper +#define CLASS_TMC2160 TMC2160Stepper +#define CLASS_TMC2208 TMC2208Stepper +#define CLASS_TMC2209 TMC2209Stepper +#define CLASS_TMC2660 TMC2660Stepper +#define CLASS_TMC5130 TMC5130Stepper +#define CLASS_TMC5160 TMC5160Stepper + +#define TMC_X_LABEL 'X', '0' +#define TMC_Y_LABEL 'Y', '0' +#define TMC_Z_LABEL 'Z', '0' + +#define TMC_X2_LABEL 'X', '2' +#define TMC_Y2_LABEL 'Y', '2' +#define TMC_Z2_LABEL 'Z', '2' +#define TMC_Z3_LABEL 'Z', '3' +#define TMC_Z4_LABEL 'Z', '4' + +#define TMC_E0_LABEL 'E', '0' +#define TMC_E1_LABEL 'E', '1' +#define TMC_E2_LABEL 'E', '2' +#define TMC_E3_LABEL 'E', '3' +#define TMC_E4_LABEL 'E', '4' +#define TMC_E5_LABEL 'E', '5' +#define TMC_E6_LABEL 'E', '6' +#define TMC_E7_LABEL 'E', '7' + +#define __TMC_CLASS(TYPE, L, I, A) TMCMarlin +#define _TMC_CLASS(TYPE, LandI, A) __TMC_CLASS(TYPE, LandI, A) +#define TMC_CLASS(ST, A) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL, A##_AXIS) +#if ENABLED(DISTINCT_E_FACTORS) + #define TMC_CLASS_E(N) TMC_CLASS(E##N, E##N) +#else + #define TMC_CLASS_E(N) TMC_CLASS(E##N, E) +#endif + +typedef struct { + uint8_t toff; + int8_t hend; + uint8_t hstrt; +} chopper_timing_t; + +static constexpr chopper_timing_t chopper_timing = CHOPPER_TIMING; + +#if HAS_TMC220x + void tmc_serial_begin(); +#endif + +void restore_trinamic_drivers(); +void reset_trinamic_drivers(); + +#define AXIS_HAS_SQUARE_WAVE(A) (AXIS_IS_TMC(A) && ENABLED(SQUARE_WAVE_STEPPING)) + +// X Stepper +#if AXIS_IS_TMC(X) + extern TMC_CLASS(X, X) stepperX; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define X_ENABLE_INIT() NOOP + #define X_ENABLE_WRITE(STATE) stepperX.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0) + #define X_ENABLE_READ() stepperX.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(X) + #define X_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X_STEP_PIN); }while(0) + #endif +#endif + +// Y Stepper +#if AXIS_IS_TMC(Y) + extern TMC_CLASS(Y, Y) stepperY; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define Y_ENABLE_INIT() NOOP + #define Y_ENABLE_WRITE(STATE) stepperY.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0) + #define Y_ENABLE_READ() stepperY.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(Y) + #define Y_STEP_WRITE(STATE) do{ if (STATE) TOGGLE(Y_STEP_PIN); }while(0) + #endif +#endif + +// Z Stepper +#if AXIS_IS_TMC(Z) + extern TMC_CLASS(Z, Z) stepperZ; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define Z_ENABLE_INIT() NOOP + #define Z_ENABLE_WRITE(STATE) stepperZ.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z_ENABLE_READ() stepperZ.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(Z) + #define Z_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z_STEP_PIN); }while(0) + #endif +#endif + +// X2 Stepper +#if HAS_X2_ENABLE && AXIS_IS_TMC(X2) + extern TMC_CLASS(X2, X) stepperX2; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define X2_ENABLE_INIT() NOOP + #define X2_ENABLE_WRITE(STATE) stepperX2.toff((STATE)==X_ENABLE_ON ? chopper_timing.toff : 0) + #define X2_ENABLE_READ() stepperX2.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(X2) + #define X2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(X2_STEP_PIN); }while(0) + #endif +#endif + +// Y2 Stepper +#if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) + extern TMC_CLASS(Y2, Y) stepperY2; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define Y2_ENABLE_INIT() NOOP + #define Y2_ENABLE_WRITE(STATE) stepperY2.toff((STATE)==Y_ENABLE_ON ? chopper_timing.toff : 0) + #define Y2_ENABLE_READ() stepperY2.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(Y2) + #define Y2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Y2_STEP_PIN); }while(0) + #endif +#endif + +// Z2 Stepper +#if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) + extern TMC_CLASS(Z2, Z) stepperZ2; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2) + #define Z2_ENABLE_INIT() NOOP + #define Z2_ENABLE_WRITE(STATE) stepperZ2.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z2_ENABLE_READ() stepperZ2.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(Z2) + #define Z2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z2_STEP_PIN); }while(0) + #endif +#endif + +// Z3 Stepper +#if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) + extern TMC_CLASS(Z3, Z) stepperZ3; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define Z3_ENABLE_INIT() NOOP + #define Z3_ENABLE_WRITE(STATE) stepperZ3.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z3_ENABLE_READ() stepperZ3.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(Z3) + #define Z3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z3_STEP_PIN); }while(0) + #endif +#endif + +// Z4 Stepper +#if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) + extern TMC_CLASS(Z4, Z) stepperZ4; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + #define Z4_ENABLE_INIT() NOOP + #define Z4_ENABLE_WRITE(STATE) stepperZ4.toff((STATE)==Z_ENABLE_ON ? chopper_timing.toff : 0) + #define Z4_ENABLE_READ() stepperZ4.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(Z4) + #define Z4_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(Z4_STEP_PIN); }while(0) + #endif +#endif + +// E0 Stepper +#if AXIS_IS_TMC(E0) + extern TMC_CLASS_E(0) stepperE0; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0) + #define E0_ENABLE_INIT() NOOP + #define E0_ENABLE_WRITE(STATE) stepperE0.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E0_ENABLE_READ() stepperE0.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E0) + #define E0_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E0_STEP_PIN); }while(0) + #endif +#endif + +// E1 Stepper +#if AXIS_IS_TMC(E1) + extern TMC_CLASS_E(1) stepperE1; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1) + #define E1_ENABLE_INIT() NOOP + #define E1_ENABLE_WRITE(STATE) stepperE1.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E1_ENABLE_READ() stepperE1.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E1) + #define E1_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E1_STEP_PIN); }while(0) + #endif +#endif + +// E2 Stepper +#if AXIS_IS_TMC(E2) + extern TMC_CLASS_E(2) stepperE2; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2) + #define E2_ENABLE_INIT() NOOP + #define E2_ENABLE_WRITE(STATE) stepperE2.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E2_ENABLE_READ() stepperE2.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E2) + #define E2_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E2_STEP_PIN); }while(0) + #endif +#endif + +// E3 Stepper +#if AXIS_IS_TMC(E3) + extern TMC_CLASS_E(3) stepperE3; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3) + #define E3_ENABLE_INIT() NOOP + #define E3_ENABLE_WRITE(STATE) stepperE3.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E3_ENABLE_READ() stepperE3.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E3) + #define E3_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E3_STEP_PIN); }while(0) + #endif +#endif + +// E4 Stepper +#if AXIS_IS_TMC(E4) + extern TMC_CLASS_E(4) stepperE4; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4) + #define E4_ENABLE_INIT() NOOP + #define E4_ENABLE_WRITE(STATE) stepperE4.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E4_ENABLE_READ() stepperE4.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E4) + #define E4_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E4_STEP_PIN); }while(0) + #endif +#endif + +// E5 Stepper +#if AXIS_IS_TMC(E5) + extern TMC_CLASS_E(5) stepperE5; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5) + #define E5_ENABLE_INIT() NOOP + #define E5_ENABLE_WRITE(STATE) stepperE5.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E5_ENABLE_READ() stepperE5.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E5) + #define E5_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E5_STEP_PIN); }while(0) + #endif +#endif + +// E6 Stepper +#if AXIS_IS_TMC(E6) + extern TMC_CLASS_E(6) stepperE6; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6) + #define E6_ENABLE_INIT() NOOP + #define E6_ENABLE_WRITE(STATE) stepperE6.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E6_ENABLE_READ() stepperE6.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E6) + #define E6_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E6_STEP_PIN); }while(0) + #endif +#endif + +// E7 Stepper +#if AXIS_IS_TMC(E7) + extern TMC_CLASS_E(7) stepperE7; + #if ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7) + #define E7_ENABLE_INIT() NOOP + #define E7_ENABLE_WRITE(STATE) stepperE7.toff((STATE)==E_ENABLE_ON ? chopper_timing.toff : 0) + #define E7_ENABLE_READ() stepperE7.isEnabled() + #endif + #if AXIS_HAS_SQUARE_WAVE(E7) + #define E7_STEP_WRITE(STATE) do{ if(STATE) TOGGLE(E7_STEP_PIN); }while(0) + #endif +#endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp new file mode 100644 index 00000000..cf35bbcd --- /dev/null +++ b/Marlin/src/module/temperature.cpp @@ -0,0 +1,3538 @@ +/** + * 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 . + * + */ + +/** + * temperature.cpp - temperature control + */ + +// Useful when debugging thermocouples +//#define IGNORE_THERMOCOUPLE_ERRORS + +#include "temperature.h" +#include "endstops.h" + +#include "../MarlinCore.h" +#include "planner.h" +#include "../HAL/shared/Delay.h" + +#include "../lcd/ultralcd.h" + +#if ENABLED(DWIN_CREALITY_LCD) + #include "../lcd/dwin/e3v2/dwin.h" +#endif + +#if ENABLED(EXTENSIBLE_UI) + #include "../lcd/extui/ui_api.h" +#endif + +#if ENABLED(MAX6675_IS_MAX31865) + #include + #ifndef MAX31865_CS_PIN + #define MAX31865_CS_PIN MAX6675_SS_PIN // HW:49 SW:65 for example + #endif + #ifndef MAX31865_MOSI_PIN + #define MAX31865_MOSI_PIN MOSI_PIN // 63 + #endif + #ifndef MAX31865_MISO_PIN + #define MAX31865_MISO_PIN MAX6675_DO_PIN // 42 + #endif + #ifndef MAX31865_SCK_PIN + #define MAX31865_SCK_PIN MAX6675_SCK_PIN // 40 + #endif + Adafruit_MAX31865 max31865 = Adafruit_MAX31865(MAX31865_CS_PIN + #if MAX31865_CS_PIN != MAX6675_SS_PIN + , MAX31865_MOSI_PIN // For software SPI also set MOSI/MISO/SCK + , MAX31865_MISO_PIN + , MAX31865_SCK_PIN + #endif + ); +#endif + +#define MAX6675_SEPARATE_SPI (EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO)) + +#if MAX6675_SEPARATE_SPI + #include "../libs/private_spi.h" +#endif + +#if ENABLED(PID_EXTRUSION_SCALING) + #include "stepper.h" +#endif + +#if ENABLED(BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING) + #include "../feature/babystep.h" +#endif + +#include "printcounter.h" + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #include "../feature/filwidth.h" +#endif + +#if HAS_POWER_MONITOR + #include "../feature/power_monitor.h" +#endif + +#if ENABLED(EMERGENCY_PARSER) + #include "../feature/e_parser.h" +#endif + +#if ENABLED(PRINTER_EVENT_LEDS) + #include "../feature/leds/printer_event_leds.h" +#endif + +#if ENABLED(JOYSTICK) + #include "../feature/joystick.h" +#endif + +#if ENABLED(SINGLENOZZLE) + #include "tool_change.h" +#endif + +#if USE_BEEPER + #include "../libs/buzzer.h" +#endif + +#if HAS_SERVOS + #include "./servo.h" +#endif +#if HOTEND_USES_THERMISTOR + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + 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 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 + +Temperature thermalManager; + +const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, + str_t_heating_failed[] PROGMEM = STR_T_HEATING_FAILED; + +/** + * Macros to include the heater id in temp errors. The compiler's dead-code + * elimination should (hopefully) optimize out the unused strings. + */ + +#if HAS_HEATED_BED + #define _BED_PSTR(h) (h) == H_BED ? GET_TEXT(MSG_BED) : +#else + #define _BED_PSTR(h) +#endif +#if HAS_HEATED_CHAMBER + #define _CHAMBER_PSTR(h) (h) == H_CHAMBER ? GET_TEXT(MSG_CHAMBER) : +#else + #define _CHAMBER_PSTR(h) +#endif +#define _E_PSTR(h,N) ((HOTENDS) > N && (h) == N) ? PSTR(LCD_STR_E##N) : +#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) + +// public: + +#if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) + bool Temperature::adaptive_fan_slowing = true; +#endif + +#if HAS_HOTEND + hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } + 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) + uint8_t Temperature::autofan_speed[HOTENDS]; // = { 0 } +#endif + +#if ENABLED(AUTO_POWER_CHAMBER_FAN) + uint8_t Temperature::chamberfan_speed; // = 0 +#endif + +#if HAS_FAN + + uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } + + #if ENABLED(EXTRA_FAN_SPEED) + uint8_t Temperature::old_fan_speed[FAN_COUNT], Temperature::new_fan_speed[FAN_COUNT]; + + void Temperature::set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp) { + switch (tmp_temp) { + case 1: + set_fan_speed(fan, old_fan_speed[fan]); + break; + case 2: + old_fan_speed[fan] = fan_speed[fan]; + set_fan_speed(fan, new_fan_speed[fan]); + break; + default: + new_fan_speed[fan] = _MIN(tmp_temp, 255U); + break; + } + } + + #endif + + #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + bool Temperature::fans_paused; // = false; + uint8_t Temperature::saved_fan_speed[FAN_COUNT]; // = { 0 } + #endif + + #if ENABLED(ADAPTIVE_FAN_SLOWING) + uint8_t Temperature::fan_speed_scaler[FAN_COUNT] = ARRAY_N(FAN_COUNT, 128, 128, 128, 128, 128, 128, 128, 128); + #endif + + /** + * Set the print fan speed for a target extruder + */ + void Temperature::set_fan_speed(uint8_t target, uint16_t speed) { + + NOMORE(speed, 255U); + + #if ENABLED(SINGLENOZZLE_STANDBY_FAN) + if (target != active_extruder) { + if (target < EXTRUDERS) singlenozzle_fan_speed[target] = speed; + return; + } + #endif + + TERN_(SINGLENOZZLE, target = 0); // Always use fan index 0 with SINGLENOZZLE + + if (target >= FAN_COUNT) return; + + fan_speed[target] = speed; + + 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) { + if (p != fans_paused) { + fans_paused = p; + if (p) + FANS_LOOP(i) { saved_fan_speed[i] = fan_speed[i]; fan_speed[i] = 0; } + else + FANS_LOOP(i) fan_speed[i] = saved_fan_speed[i]; + } + } + + #endif + +#endif // HAS_FAN + +#if WATCH_HOTENDS + hotend_watch_t Temperature::watch_hotend[HOTENDS]; // = { { 0 } } +#endif +#if HEATER_IDLE_HANDLER + Temperature::heater_idle_t Temperature::heater_idle[NR_HEATER_IDLE]; // = { { 0 } } +#endif + +#if HAS_HEATED_BED + bed_info_t Temperature::temp_bed; // = { 0 } + // Init min and max temp with extreme values to prevent false errors during startup + #ifdef BED_MINTEMP + int16_t Temperature::mintemp_raw_BED = HEATER_BED_RAW_LO_TEMP; + #endif + #ifdef BED_MAXTEMP + int16_t Temperature::maxtemp_raw_BED = HEATER_BED_RAW_HI_TEMP; + #endif + TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } + TERN(PIDTEMPBED,, millis_t Temperature::next_bed_check_ms); +#endif // HAS_HEATED_BED + +#if HAS_TEMP_CHAMBER + chamber_info_t Temperature::temp_chamber; // = { 0 } + #if HAS_HEATED_CHAMBER + int16_t fan_chamber_pwm; + bool flag_chamber_off; + bool flag_chamber_excess_heat = false; + millis_t next_cool_check_ms_2 = 0; + float old_temp = 9999; + #ifdef CHAMBER_MINTEMP + int16_t Temperature::mintemp_raw_CHAMBER = HEATER_CHAMBER_RAW_LO_TEMP; + #endif + #ifdef CHAMBER_MAXTEMP + int16_t Temperature::maxtemp_raw_CHAMBER = HEATER_CHAMBER_RAW_HI_TEMP; + #endif + #if WATCH_CHAMBER + chamber_watch_t Temperature::watch_chamber{0}; + #endif + millis_t Temperature::next_chamber_check_ms; + #endif // HAS_HEATED_CHAMBER +#endif // HAS_TEMP_CHAMBER + +#if HAS_TEMP_PROBE + probe_info_t Temperature::temp_probe; // = { 0 } +#endif + +// Initialized by settings.load() +#if ENABLED(PIDTEMP) + //hotend_pid_t Temperature::pid[HOTENDS]; +#endif + +#if ENABLED(PREVENT_COLD_EXTRUSION) + bool Temperature::allow_cold_extrude = false; + int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; +#endif + +// private: + +#if EARLY_WATCHDOG + bool Temperature::inited = false; +#endif + +#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + uint16_t Temperature::redundant_temperature_raw = 0; + float Temperature::redundant_temperature = 0.0; +#endif + +volatile bool Temperature::raw_temps_ready = false; + +#if ENABLED(PID_EXTRUSION_SCALING) + int32_t Temperature::last_e_position, Temperature::lpq[LPQ_MAX_LEN]; + lpq_ptr_t Temperature::lpq_ptr = 0; +#endif + +#define TEMPDIR(N) ((HEATER_##N##_RAW_LO_TEMP) < (HEATER_##N##_RAW_HI_TEMP) ? 1 : -1) + +#if HAS_HOTEND + // Init mintemp and maxtemp with extreme values to prevent false errors during startup + constexpr temp_range_t sensor_heater_0 { HEATER_0_RAW_LO_TEMP, HEATER_0_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_1 { HEATER_1_RAW_LO_TEMP, HEATER_1_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_2 { HEATER_2_RAW_LO_TEMP, HEATER_2_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_3 { HEATER_3_RAW_LO_TEMP, HEATER_3_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_4 { HEATER_4_RAW_LO_TEMP, HEATER_4_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_5 { HEATER_5_RAW_LO_TEMP, HEATER_5_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_6 { HEATER_6_RAW_LO_TEMP, HEATER_6_RAW_HI_TEMP, 0, 16383 }, + sensor_heater_7 { HEATER_7_RAW_LO_TEMP, HEATER_7_RAW_HI_TEMP, 0, 16383 }; + + temp_range_t Temperature::temp_range[HOTENDS] = ARRAY_BY_HOTENDS(sensor_heater_0, sensor_heater_1, sensor_heater_2, sensor_heater_3, sensor_heater_4, sensor_heater_5, sensor_heater_6, sensor_heater_7); +#endif + +#ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED + uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; +#endif + +#ifdef MILLISECONDS_PREHEAT_TIME + millis_t Temperature::preheat_end_time[HOTENDS] = { 0 }; +#endif + +#if HAS_AUTO_FAN + millis_t Temperature::next_auto_fan_check_ms = 0; +#endif + +#if ENABLED(FAN_SOFT_PWM) + uint8_t Temperature::soft_pwm_amount_fan[FAN_COUNT], + Temperature::soft_pwm_count_fan[FAN_COUNT]; +#endif + +#if ENABLED(PROBING_HEATERS_OFF) + bool Temperature::paused; +#endif + +// public: + +#if HAS_ADC_BUTTONS + uint32_t Temperature::current_ADCKey_raw = HAL_ADC_RANGE; + uint16_t Temperature::ADCKey_count = 0; +#endif + +#if ENABLED(PID_EXTRUSION_SCALING) + int16_t Temperature::lpq_len; // Initialized in settings.cpp +#endif + +#if HAS_PID_HEATING + + inline void say_default_() { SERIAL_ECHOPGM("#define DEFAULT_"); } + + /** + * PID Autotuning (M303) + * + * Alternately heat and cool the nozzle, observing its behavior to + * determine the best PID values to achieve a stable temperature. + * Needs sufficient heater power to make some overshoot at target + * temperature to succeed. + */ + void Temperature::PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { + float current_temp = 0.0; + int cycles = 0; + bool heating = true; + + millis_t next_temp_ms = millis(), t1 = next_temp_ms, t2 = next_temp_ms; + long t_high = 0, t_low = 0; + + long bias, d; + PID_t tune_pid = { 0, 0, 0 }; + float maxT = 0, minT = 10000; + + const bool isbed = (heater_id == H_BED); + + #if HAS_PID_FOR_BOTH + #define GHV(B,H) (isbed ? (B) : (H)) + #define SHV(B,H) do{ if (isbed) temp_bed.soft_pwm_amount = B; else temp_hotend[heater_id].soft_pwm_amount = H; }while(0) + #define ONHEATINGSTART() (isbed ? printerEventLEDs.onBedHeatingStart() : printerEventLEDs.onHotendHeatingStart()) + #define ONHEATING(S,C,T) (isbed ? printerEventLEDs.onBedHeating(S,C,T) : printerEventLEDs.onHotendHeating(S,C,T)) + #elif ENABLED(PIDTEMPBED) + #define GHV(B,H) B + #define SHV(B,H) (temp_bed.soft_pwm_amount = B) + #define ONHEATINGSTART() printerEventLEDs.onBedHeatingStart() + #define ONHEATING(S,C,T) printerEventLEDs.onBedHeating(S,C,T) + #else + #define GHV(B,H) H + #define SHV(B,H) (temp_hotend[heater_id].soft_pwm_amount = H) + #define ONHEATINGSTART() printerEventLEDs.onHotendHeatingStart() + #define ONHEATING(S,C,T) printerEventLEDs.onHotendHeating(S,C,T) + #endif + #define WATCH_PID BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP) + + #if WATCH_PID + #if ALL(THERMAL_PROTECTION_HOTENDS, PIDTEMP, THERMAL_PROTECTION_BED, PIDTEMPBED) + #define GTV(B,H) (isbed ? (B) : (H)) + #elif BOTH(THERMAL_PROTECTION_HOTENDS, PIDTEMP) + #define GTV(B,H) (H) + #else + #define GTV(B,H) (B) + #endif + const uint16_t watch_temp_period = GTV(WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); + const uint8_t watch_temp_increase = GTV(WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); + const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); + millis_t temp_change_ms = next_temp_ms + SEC_TO_MS(watch_temp_period); + float next_watch_temp = 0.0; + bool heated = false; + #endif + + TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); + + if (target > GHV(BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { + SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); + return; + } + + 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); + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); + LEDColor color = ONHEATINGSTART(); + #endif + + TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = false); + + // PID Tuning loop + wait_for_heatup = true; // Can be interrupted with M108 + while (wait_for_heatup) { + + const millis_t ms = millis(); + + if (raw_temps_ready) { // temp sample ready + updateTemperaturesFromRawValues(); + + // Get the current temperature and constrain it + current_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); + NOLESS(maxT, current_temp); + NOMORE(minT, current_temp); + + #if ENABLED(PRINTER_EVENT_LEDS) + ONHEATING(start_temp, current_temp, target); + #endif + + #if HAS_AUTO_FAN + if (ELAPSED(ms, next_auto_fan_check_ms)) { + checkExtruderAutoFans(); + next_auto_fan_check_ms = ms + 2500UL; + } + #endif + + if (heating && current_temp > target) { + if (ELAPSED(ms, t2 + 5000UL)) { + heating = false; + SHV((bias - d) >> 1, (bias - d) >> 1); + t1 = ms; + t_high = t1 - t2; + maxT = target; + } + } + + if (!heating && current_temp < target) { + if (ELAPSED(ms, t1 + 5000UL)) { + heating = true; + t2 = ms; + t_low = t2 - t1; + if (cycles > 0) { + const long max_pow = GHV(MAX_BED_POWER, PID_MAX); + bias += (d * (t_high - t_low)) / (t_low + t_high); + LIMIT(bias, 20, max_pow - 20); + d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias; + + SERIAL_ECHOPAIR(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT); + if (cycles > 2) { + const float Ku = (4.0f * d) / (float(M_PI) * (maxT - minT) * 0.5f), + Tu = float(t_low + t_high) * 0.001f, + pf = isbed ? 0.2f : 0.6f, + df = isbed ? 1.0f / 3.0f : 1.0f / 8.0f; + + SERIAL_ECHOPAIR(STR_KU, Ku, STR_TU, Tu); + if (isbed) { // Do not remove this otherwise PID autotune won't work right for the bed! + tune_pid.Kp = Ku * 0.2f; + tune_pid.Ki = 2 * tune_pid.Kp / Tu; + tune_pid.Kd = tune_pid.Kp * Tu / 3; + SERIAL_ECHOLNPGM("\n" " No overshoot"); // Works far better for the bed. Classic and some have bad ringing. + SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); + } + else { + tune_pid.Kp = Ku * pf; + tune_pid.Kd = tune_pid.Kp * Tu * df; + tune_pid.Ki = 2 * tune_pid.Kp / Tu; + SERIAL_ECHOLNPGM("\n" STR_CLASSIC_PID); + SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); + } + + /** + tune_pid.Kp = 0.33 * Ku; + tune_pid.Ki = tune_pid.Kp / Tu; + tune_pid.Kd = tune_pid.Kp * Tu / 3; + SERIAL_ECHOLNPGM(" Some overshoot"); + SERIAL_ECHOLNPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd, " No overshoot"); + tune_pid.Kp = 0.2 * Ku; + tune_pid.Ki = 2 * tune_pid.Kp / Tu; + tune_pid.Kd = tune_pid.Kp * Tu / 3; + SERIAL_ECHOPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd); + */ + } + } + SHV((bias + d) >> 1, (bias + d) >> 1); + cycles++; + minT = target; + } + } + } + + // Did the temperature overshoot very far? + #ifndef MAX_OVERSHOOT_PID_AUTOTUNE + #define MAX_OVERSHOOT_PID_AUTOTUNE 30 + #endif + if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { + SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); + break; + } + + // Report heater states every 2 seconds + if (ELAPSED(ms, next_temp_ms)) { + #if HAS_TEMP_SENSOR + print_heater_states(isbed ? active_extruder : heater_id); + SERIAL_EOL(); + #endif + next_temp_ms = ms + 2000UL; + + // Make sure heating is actually working + #if WATCH_PID + if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS)) { + if (!heated) { // If not yet reached target... + if (current_temp > next_watch_temp) { // Over the watch temp? + next_watch_temp = current_temp + watch_temp_increase; // - set the next temp to watch for + temp_change_ms = ms + SEC_TO_MS(watch_temp_period); // - move the expiration timer up + if (current_temp > watch_temp_target) heated = true; // - Flag if target temperature reached + } + else if (ELAPSED(ms, temp_change_ms)) // Watch timer expired + _temp_error(heater_id, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + } + else if (current_temp < target - (MAX_OVERSHOOT_PID_AUTOTUNE)) // Heated, then temperature fell too far? + _temp_error(heater_id, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + } + #endif + } // every 2 seconds + + // Timeout after MAX_CYCLE_TIME_PID_AUTOTUNE minutes since the last undershoot/overshoot cycle + #ifndef MAX_CYCLE_TIME_PID_AUTOTUNE + #define MAX_CYCLE_TIME_PID_AUTOTUNE 20L + #endif + if ((ms - _MIN(t1, t2)) > (MAX_CYCLE_TIME_PID_AUTOTUNE * 60L * 1000L)) { + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); + SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); + break; + } + + if (cycles > ncycles && cycles > 2) { + SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); + + #if HAS_PID_FOR_BOTH + const char * const estring = GHV(PSTR("bed"), NUL_STR); + say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); + say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); + say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); + #elif ENABLED(PIDTEMP) + say_default_(); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); + say_default_(); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); + say_default_(); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); + #else + say_default_(); SERIAL_ECHOLNPAIR("bedKp ", tune_pid.Kp); + say_default_(); SERIAL_ECHOLNPAIR("bedKi ", tune_pid.Ki); + say_default_(); SERIAL_ECHOLNPAIR("bedKd ", tune_pid.Kd); + #endif + + #define _SET_BED_PID() do { \ + temp_bed.pid.Kp = tune_pid.Kp; \ + temp_bed.pid.Ki = scalePID_i(tune_pid.Ki); \ + temp_bed.pid.Kd = scalePID_d(tune_pid.Kd); \ + }while(0) + + #define _SET_EXTRUDER_PID() do { \ + PID_PARAM(Kp, heater_id) = tune_pid.Kp; \ + PID_PARAM(Ki, heater_id) = scalePID_i(tune_pid.Ki); \ + PID_PARAM(Kd, heater_id) = scalePID_d(tune_pid.Kd); \ + updatePID(); }while(0) + + // Use the result? (As with "M303 U1") + if (set_result) { + #if HAS_PID_FOR_BOTH + if (isbed) _SET_BED_PID(); else _SET_EXTRUDER_PID(); + #elif ENABLED(PIDTEMP) + _SET_EXTRUDER_PID(); + #else + _SET_BED_PID(); + #endif + } + + TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); + + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); + + goto EXIT_M303; + } + + // Run HAL idle tasks + TERN_(HAL_IDLETASK, HAL_idletask()); + + // Run UI update + TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + } + wait_for_heatup = false; + + disable_all_heaters(); + + TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); + + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); + + EXIT_M303: + TERN_(NO_FAN_SLOWING_IN_PID_TUNING, adaptive_fan_slowing = true); + return; + } + +#endif // HAS_PID_HEATING + +/** + * Class and Instance Methods + */ + +int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { + switch (heater_id) { + #if HAS_HEATED_BED + case H_BED: return temp_bed.soft_pwm_amount; + #endif + #if HAS_HEATED_CHAMBER + case H_CHAMBER: return temp_chamber.soft_pwm_amount; + #endif + default: + return TERN0(HAS_HOTEND, temp_hotend[heater_id].soft_pwm_amount); + } +} + +#define _EFANOVERLAP(A,B) _FANOVERLAP(E##A,B) + +#if HAS_AUTO_FAN + + #define CHAMBER_FAN_INDEX HOTENDS + + void Temperature::checkExtruderAutoFans() { + #define _EFAN(B,A) _EFANOVERLAP(A,B) ? B : + static const uint8_t fanBit[] PROGMEM = { + 0 + #if HAS_MULTI_HOTEND + #define _NEXT_FAN(N) , REPEAT2(N,_EFAN,N) N + RREPEAT_S(1, HOTENDS, _NEXT_FAN) + #endif + #if HAS_AUTO_CHAMBER_FAN + #define _CFAN(B) _FANOVERLAP(CHAMBER,B) ? B : + , REPEAT(HOTENDS,_CFAN) (HOTENDS) + #endif + }; + + uint8_t fanState = 0; + HOTEND_LOOP() + if (temp_hotend[e].celsius >= EXTRUDER_AUTO_FAN_TEMPERATURE) + SBI(fanState, pgm_read_byte(&fanBit[e])); + + #if HAS_AUTO_CHAMBER_FAN + if (temp_chamber.celsius >= CHAMBER_AUTO_FAN_TEMPERATURE) + SBI(fanState, pgm_read_byte(&fanBit[CHAMBER_FAN_INDEX])); + #endif + + #define _UPDATE_AUTO_FAN(P,D,A) do{ \ + if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ + analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ + else \ + WRITE(P##_AUTO_FAN_PIN, D); \ + }while(0) + + uint8_t fanDone = 0; + LOOP_L_N(f, COUNT(fanBit)) { + const uint8_t realFan = pgm_read_byte(&fanBit[f]); + if (TEST(fanDone, realFan)) continue; + const bool fan_on = TEST(fanState, realFan); + switch (f) { + #if ENABLED(AUTO_POWER_CHAMBER_FAN) + case CHAMBER_FAN_INDEX: + chamberfan_speed = fan_on ? CHAMBER_AUTO_FAN_SPEED : 0; + break; + #endif + default: + #if ENABLED(AUTO_POWER_E_FANS) + autofan_speed[realFan] = fan_on ? EXTRUDER_AUTO_FAN_SPEED : 0; + #endif + break; + } + + switch (f) { + #if HAS_AUTO_FAN_0 + case 0: _UPDATE_AUTO_FAN(E0, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_1 + case 1: _UPDATE_AUTO_FAN(E1, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_2 + case 2: _UPDATE_AUTO_FAN(E2, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_3 + case 3: _UPDATE_AUTO_FAN(E3, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_4 + case 4: _UPDATE_AUTO_FAN(E4, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_5 + case 5: _UPDATE_AUTO_FAN(E5, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_6 + case 6: _UPDATE_AUTO_FAN(E6, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_FAN_7 + case 7: _UPDATE_AUTO_FAN(E7, fan_on, EXTRUDER_AUTO_FAN_SPEED); break; + #endif + #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E + case CHAMBER_FAN_INDEX: _UPDATE_AUTO_FAN(CHAMBER, fan_on, CHAMBER_AUTO_FAN_SPEED); break; + #endif + } + SBI(fanDone, realFan); + } + } + +#endif // HAS_AUTO_FAN + +// +// Temperature Error Handlers +// + +inline void loud_kill(PGM_P const lcd_msg, const heater_id_t heater_id) { + marlin_state = MF_KILLED; + #if USE_BEEPER + for (uint8_t i = 20; i--;) { + WRITE(BEEPER_PIN, HIGH); delay(25); + WRITE(BEEPER_PIN, LOW); delay(80); + } + WRITE(BEEPER_PIN, HIGH); + #endif + kill(lcd_msg, HEATER_PSTR(heater_id)); +} + +void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_msg, PGM_P const lcd_msg) { + + static uint8_t killed = 0; + + if (IsRunning() && TERN1(BOGUS_TEMPERATURE_GRACE_PERIOD, killed == 2)) { + SERIAL_ERROR_START(); + serialprintPGM(serial_msg); + SERIAL_ECHOPGM(STR_STOPPED_HEATER); + if (heater_id >= 0) + SERIAL_ECHO((int)heater_id); + else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) + SERIAL_ECHOPGM(STR_HEATER_CHAMBER); + else + SERIAL_ECHOPGM(STR_HEATER_BED); + SERIAL_EOL(); + } + + disable_all_heaters(); // always disable (even for bogus temp) + + #if BOGUS_TEMPERATURE_GRACE_PERIOD + const millis_t ms = millis(); + static millis_t expire_ms; + switch (killed) { + case 0: + expire_ms = ms + BOGUS_TEMPERATURE_GRACE_PERIOD; + ++killed; + break; + case 1: + if (ELAPSED(ms, expire_ms)) ++killed; + break; + case 2: + loud_kill(lcd_msg, heater_id); + ++killed; + break; + } + #elif defined(BOGUS_TEMPERATURE_GRACE_PERIOD) + UNUSED(killed); + #else + if (!killed) { killed = 1; loud_kill(lcd_msg, heater_id); } + #endif +} + +void Temperature::max_temp_error(const heater_id_t heater_id) { + #if ENABLED(DWIN_CREALITY_LCD) && (HAS_HOTEND || HAS_HEATED_BED) + DWIN_Popup_Temperature(1); + #endif + _temp_error(heater_id, PSTR(STR_T_MAXTEMP), GET_TEXT(MSG_ERR_MAXTEMP)); +} + +void Temperature::min_temp_error(const heater_id_t heater_id) { + #if ENABLED(DWIN_CREALITY_LCD) && (HAS_HOTEND || HAS_HEATED_BED) + DWIN_Popup_Temperature(0); + #endif + _temp_error(heater_id, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); +} + +#if HAS_HOTEND + #if ENABLED(PID_DEBUG) + extern bool pid_debug_flag; + #endif + + float Temperature::get_pid_output_hotend(const uint8_t E_NAME) { + const uint8_t ee = HOTEND_INDEX; + #if ENABLED(PIDTEMP) + #if DISABLED(PID_OPENLOOP) + static hotend_pid_t work_pid[HOTENDS]; + static float temp_iState[HOTENDS] = { 0 }, + temp_dState[HOTENDS] = { 0 }; + static bool pid_reset[HOTENDS] = { false }; + const float pid_error = temp_hotend[ee].target - temp_hotend[ee].celsius; + + float pid_output; + + if (temp_hotend[ee].target == 0 + || pid_error < -(PID_FUNCTIONAL_RANGE) + || TERN0(HEATER_IDLE_HANDLER, heater_idle[ee].timed_out) + ) { + pid_output = 0; + pid_reset[ee] = true; + } + else if (pid_error > PID_FUNCTIONAL_RANGE) { + pid_output = BANG_MAX; + pid_reset[ee] = true; + } + else { + if (pid_reset[ee]) { + temp_iState[ee] = 0.0; + work_pid[ee].Kd = 0.0; + pid_reset[ee] = false; + } + + work_pid[ee].Kd = work_pid[ee].Kd + PID_K2 * (PID_PARAM(Kd, ee) * (temp_dState[ee] - temp_hotend[ee].celsius) - work_pid[ee].Kd); + const float max_power_over_i_gain = float(PID_MAX) / PID_PARAM(Ki, ee) - float(MIN_POWER); + temp_iState[ee] = constrain(temp_iState[ee] + pid_error, 0, max_power_over_i_gain); + work_pid[ee].Kp = PID_PARAM(Kp, ee) * pid_error; + work_pid[ee].Ki = PID_PARAM(Ki, ee) * temp_iState[ee]; + + pid_output = work_pid[ee].Kp + work_pid[ee].Ki + work_pid[ee].Kd + float(MIN_POWER); + + #if ENABLED(PID_EXTRUSION_SCALING) + #if HOTENDS == 1 + constexpr bool this_hotend = true; + #else + const bool this_hotend = (ee == active_extruder); + #endif + work_pid[ee].Kc = 0; + if (this_hotend) { + const long e_position = stepper.position(E_AXIS); + if (e_position > last_e_position) { + lpq[lpq_ptr] = e_position - last_e_position; + last_e_position = e_position; + } + else + lpq[lpq_ptr] = 0; + + if (++lpq_ptr >= lpq_len) lpq_ptr = 0; + work_pid[ee].Kc = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, ee); + pid_output += work_pid[ee].Kc; + } + #endif // PID_EXTRUSION_SCALING + #if ENABLED(PID_FAN_SCALING) + if (thermalManager.fan_speed[active_extruder] > PID_FAN_SCALING_MIN_SPEED) { + work_pid[ee].Kf = PID_PARAM(Kf, ee) + (PID_FAN_SCALING_LIN_FACTOR) * thermalManager.fan_speed[active_extruder]; + pid_output += work_pid[ee].Kf; + } + //pid_output -= work_pid[ee].Ki; + //pid_output += work_pid[ee].Ki * work_pid[ee].Kf + #endif // PID_FAN_SCALING + LIMIT(pid_output, 0, PID_MAX); + } + temp_dState[ee] = temp_hotend[ee].celsius; + + #else // PID_OPENLOOP + + const float pid_output = constrain(temp_hotend[ee].target, 0, PID_MAX); + + #endif // PID_OPENLOOP + + #if ENABLED(PID_DEBUG) + if (ee == active_extruder && pid_debug_flag) { + 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(); + } + #endif // PID_DEBUG + + #else // No PID enabled + + const bool is_idling = TERN0(HEATER_IDLE_HANDLER, heater_idle[ee].timed_out); + const float pid_output = (!is_idling && temp_hotend[ee].celsius < temp_hotend[ee].target) ? BANG_MAX : 0; + + #endif + + return pid_output; + } + +#endif // HAS_HOTEND + +#if ENABLED(PIDTEMPBED) + + float Temperature::get_pid_output_bed() { + + #if DISABLED(PID_OPENLOOP) + + static PID_t work_pid{0}; + static float temp_iState = 0, temp_dState = 0; + static bool pid_reset = true; + float pid_output = 0; + const float max_power_over_i_gain = float(MAX_BED_POWER) / temp_bed.pid.Ki - float(MIN_BED_POWER), + pid_error = temp_bed.target - temp_bed.celsius; + + if (!temp_bed.target || pid_error < -(PID_FUNCTIONAL_RANGE)) { + pid_output = 0; + pid_reset = true; + } + else if (pid_error > PID_FUNCTIONAL_RANGE) { + pid_output = MAX_BED_POWER; + pid_reset = true; + } + else { + if (pid_reset) { + temp_iState = 0.0; + work_pid.Kd = 0.0; + pid_reset = false; + } + + temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); + + work_pid.Kp = temp_bed.pid.Kp * pid_error; + work_pid.Ki = temp_bed.pid.Ki * temp_iState; + work_pid.Kd = work_pid.Kd + PID_K2 * (temp_bed.pid.Kd * (temp_dState - temp_bed.celsius) - work_pid.Kd); + + temp_dState = temp_bed.celsius; + + pid_output = constrain(work_pid.Kp + work_pid.Ki + work_pid.Kd + float(MIN_BED_POWER), 0, MAX_BED_POWER); + } + + #else // PID_OPENLOOP + + const float pid_output = constrain(temp_bed.target, 0, MAX_BED_POWER); + + #endif // PID_OPENLOOP + + #if ENABLED(PID_BED_DEBUG) + { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR( + " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output, + #if DISABLED(PID_OPENLOOP) + STR_PID_DEBUG_PTERM, work_pid.Kp, + STR_PID_DEBUG_ITERM, work_pid.Ki, + STR_PID_DEBUG_DTERM, work_pid.Kd, + #endif + ); + } + #endif + + return pid_output; + } + +#endif // PIDTEMPBED + +/** + * Manage heating activities for extruder hot-ends and a heated bed + * - Acquire updated temperature readings + * - Also resets the watchdog timer + * - Invoke thermal runaway protection + * - Manage extruder auto-fan + * - Apply filament width to the extrusion rate (may move) + * - Update the heated bed PID output value + */ +void Temperature::manage_heater() { + + #if EARLY_WATCHDOG + // If thermal manager is still not running, make sure to at least reset the watchdog! + if (!inited) return watchdog_refresh(); + #endif + + if (TERN0(EMERGENCY_PARSER, emergency_parser.killed_by_M112)) + kill(M112_KILL_STR, nullptr, true); + + if (!raw_temps_ready) return; + + updateTemperaturesFromRawValues(); // also resets the watchdog + + #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(); + + #if HAS_HOTEND + + HOTEND_LOOP() { + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + if (degHotend(e) > temp_range[e].maxtemp) max_temp_error((heater_id_t)e); + #endif + + TERN_(HEATER_IDLE_HANDLER, heater_idle[e].update(ms)); + + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + // Check for thermal runaway + tr_state_machine[e].run(temp_hotend[e].celsius, temp_hotend[e].target, (heater_id_t)e, THERMAL_PROTECTION_PERIOD, THERMAL_PROTECTION_HYSTERESIS); + #endif + + temp_hotend[e].soft_pwm_amount = (temp_hotend[e].celsius > temp_range[e].mintemp || is_preheating(e)) && temp_hotend[e].celsius < temp_range[e].maxtemp ? (int)get_pid_output_hotend(e) >> 1 : 0; + + #if WATCH_HOTENDS + // Make sure temperature is increasing + if (watch_hotend[e].next_ms && ELAPSED(ms, watch_hotend[e].next_ms)) { // Time to check this extruder? + if (degHotend(e) < watch_hotend[e].target) { // Failed to increase enough? + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); + _temp_error((heater_id_t)e, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + } + else // Start again if the target is still far off + start_watching_hotend(e); + } + #endif + + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + // Make sure measured temperatures are close together + if (ABS(temp_hotend[0].celsius - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) + _temp_error(H_E0, PSTR(STR_REDUNDANCY), GET_TEXT(MSG_ERR_REDUNDANT_TEMP)); + #endif + + } // HOTEND_LOOP + + #endif // HAS_HOTEND + + #if HAS_AUTO_FAN + if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently + checkExtruderAutoFans(); + next_auto_fan_check_ms = ms + 2500UL; + } + #endif + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + /** + * Dynamically set the volumetric multiplier based + * on the delayed Filament Width measurement. + */ + filwidth.update_volumetric(); + #endif + + #if HAS_HEATED_BED + + #if ENABLED(THERMAL_PROTECTION_BED) + if (degBed() > BED_MAXTEMP) max_temp_error(H_BED); + #endif + + #if WATCH_BED + // Make sure temperature is increasing + if (watch_bed.elapsed(ms)) { // Time to check the bed? + if (degBed() < watch_bed.target) { // Failed to increase enough? + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); + _temp_error(H_BED, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + } + else // Start again if the target is still far off + start_watching_bed(); + } + #endif // WATCH_BED + + #if BOTH(PROBING_HEATERS_OFF, BED_LIMIT_SWITCHING) + #define PAUSE_CHANGE_REQD 1 + #endif + + #if PAUSE_CHANGE_REQD + static bool last_pause_state; + #endif + + do { + + #if DISABLED(PIDTEMPBED) + if (PENDING(ms, next_bed_check_ms) + && TERN1(PAUSE_CHANGE_REQD, paused == last_pause_state) + ) break; + next_bed_check_ms = ms + BED_CHECK_INTERVAL; + TERN_(PAUSE_CHANGE_REQD, last_pause_state = paused); + #endif + + TERN_(HEATER_IDLE_HANDLER, heater_idle[IDLE_INDEX_BED].update(ms)); + + #if HAS_THERMALLY_PROTECTED_BED + tr_state_machine[RUNAWAY_IND_BED].run(temp_bed.celsius, temp_bed.target, H_BED, THERMAL_PROTECTION_BED_PERIOD, THERMAL_PROTECTION_BED_HYSTERESIS); + #endif + + #if HEATER_IDLE_HANDLER + if (heater_idle[IDLE_INDEX_BED].timed_out) { + temp_bed.soft_pwm_amount = 0; + #if DISABLED(PIDTEMPBED) + WRITE_HEATER_BED(LOW); + #endif + } + else + #endif + { + #if ENABLED(PIDTEMPBED) + temp_bed.soft_pwm_amount = WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP) ? (int)get_pid_output_bed() >> 1 : 0; + #else + // Check if temperature is within the correct band + if (WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP)) { + #if ENABLED(BED_LIMIT_SWITCHING) + if (temp_bed.celsius >= temp_bed.target + BED_HYSTERESIS) + temp_bed.soft_pwm_amount = 0; + else if (temp_bed.celsius <= temp_bed.target - (BED_HYSTERESIS)) + temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; + #else // !PIDTEMPBED && !BED_LIMIT_SWITCHING + temp_bed.soft_pwm_amount = temp_bed.celsius < temp_bed.target ? MAX_BED_POWER >> 1 : 0; + #endif + } + else { + temp_bed.soft_pwm_amount = 0; + WRITE_HEATER_BED(LOW); + } + #endif + } + + } while (false); + + #endif // HAS_HEATED_BED + + #if HAS_HEATED_CHAMBER + + #ifndef CHAMBER_CHECK_INTERVAL + #define CHAMBER_CHECK_INTERVAL 1000UL + #endif + + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + if (degChamber() > CHAMBER_MAXTEMP) max_temp_error(H_CHAMBER); + #endif + + #if WATCH_CHAMBER + // Make sure temperature is increasing + if (watch_chamber.elapsed(ms)) { // Time to check the chamber? + if (degChamber() < watch_chamber.target) // Failed to increase enough? + _temp_error(H_CHAMBER, str_t_heating_failed, GET_TEXT(MSG_HEATING_FAILED_LCD)); + else + start_watching_chamber(); // Start again if the target is still far off + } + #endif + + #if EITHER(CHAMBER_FAN, CHAMBER_VENT) + if (temp_chamber.target > CHAMBER_MINTEMP) { + flag_chamber_off = false; + + #if ENABLED(CHAMBER_FAN) + #if CHAMBER_FAN_MODE == 0 + fan_chamber_pwm = CHAMBER_FAN_BASE + #elif CHAMBER_FAN_MODE == 1 + fan_chamber_pwm = (temp_chamber.celsius > temp_chamber.target) ? (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * (temp_chamber.celsius - temp_chamber.target) : 0; + #elif CHAMBER_FAN_MODE == 2 + fan_chamber_pwm = (CHAMBER_FAN_BASE) + (CHAMBER_FAN_FACTOR) * ABS(temp_chamber.celsius - temp_chamber.target); + if (temp_chamber.soft_pwm_amount) + fan_chamber_pwm += (CHAMBER_FAN_FACTOR) * 2; + #endif + NOMORE(fan_chamber_pwm, 225); + thermalManager.set_fan_speed(2, fan_chamber_pwm); // TODO: instead of fan 2, set to chamber fan + #endif + + #if ENABLED(CHAMBER_VENT) + #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER_VENT + #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 + #endif + #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT + #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 + #endif + if( (temp_chamber.celsius - temp_chamber.target >= HIGH_EXCESS_HEAT_LIMIT) && !flag_chamber_excess_heat) { + // open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT + if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { + if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much + next_cool_check_ms_2 = ms + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER_VENT; + old_temp = temp_chamber.celsius; + } + } + else { + next_cool_check_ms_2 = 0; + old_temp = 9999; + } + if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) { + flag_chamber_excess_heat = false; + } + #endif + } + else if (!flag_chamber_off) { + #if ENABLED(CHAMBER_FAN) + flag_chamber_off = true; + thermalManager.set_fan_speed(2, 0); + #endif + #if ENABLED(CHAMBER_VENT) + flag_chamber_excess_heat = false; + MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 90); + #endif + } + #endif + + if (ELAPSED(ms, next_chamber_check_ms)) { + next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; + + if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { + if (flag_chamber_excess_heat) { + temp_chamber.soft_pwm_amount = 0; + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); + #endif + } + else { + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) + temp_chamber.soft_pwm_amount = 0; + else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) + temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; + #else + temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; + #endif + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); + #endif + } + } + else { + temp_chamber.soft_pwm_amount = 0; + WRITE_HEATER_CHAMBER(LOW); + } + + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); + #endif + } + + // TODO: Implement true PID pwm + //temp_bed.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; + + #endif // HAS_HEATED_CHAMBER + + UNUSED(ms); +} + +#define TEMP_AD595(RAW) ((RAW) * 5.0 * 100.0 / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET) +#define TEMP_AD8495(RAW) ((RAW) * 6.6 * 100.0 / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET) + +/** + * 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 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 + + user_thermistor_t Temperature::user_thermistor[USER_THERMISTORS]; // Initialized by settings.load() + + void Temperature::reset_user_thermistors() { + user_thermistor_t user_thermistor[USER_THERMISTORS] = { + #if ENABLED(HEATER_0_USER_THERMISTOR) + { true, 0, 0, HOTEND0_PULLUP_RESISTOR_OHMS, HOTEND0_RESISTANCE_25C_OHMS, 0, 0, HOTEND0_BETA, 0 }, + #endif + #if ENABLED(HEATER_1_USER_THERMISTOR) + { true, 0, 0, HOTEND1_PULLUP_RESISTOR_OHMS, HOTEND1_RESISTANCE_25C_OHMS, 0, 0, HOTEND1_BETA, 0 }, + #endif + #if ENABLED(HEATER_2_USER_THERMISTOR) + { true, 0, 0, HOTEND2_PULLUP_RESISTOR_OHMS, HOTEND2_RESISTANCE_25C_OHMS, 0, 0, HOTEND2_BETA, 0 }, + #endif + #if ENABLED(HEATER_3_USER_THERMISTOR) + { true, 0, 0, HOTEND3_PULLUP_RESISTOR_OHMS, HOTEND3_RESISTANCE_25C_OHMS, 0, 0, HOTEND3_BETA, 0 }, + #endif + #if ENABLED(HEATER_4_USER_THERMISTOR) + { true, 0, 0, HOTEND4_PULLUP_RESISTOR_OHMS, HOTEND4_RESISTANCE_25C_OHMS, 0, 0, HOTEND4_BETA, 0 }, + #endif + #if ENABLED(HEATER_5_USER_THERMISTOR) + { true, 0, 0, HOTEND5_PULLUP_RESISTOR_OHMS, HOTEND5_RESISTANCE_25C_OHMS, 0, 0, HOTEND5_BETA, 0 }, + #endif + #if ENABLED(HEATER_6_USER_THERMISTOR) + { true, 0, 0, HOTEND6_PULLUP_RESISTOR_OHMS, HOTEND6_RESISTANCE_25C_OHMS, 0, 0, HOTEND6_BETA, 0 }, + #endif + #if ENABLED(HEATER_7_USER_THERMISTOR) + { true, 0, 0, HOTEND7_PULLUP_RESISTOR_OHMS, HOTEND7_RESISTANCE_25C_OHMS, 0, 0, HOTEND7_BETA, 0 }, + #endif + #if ENABLED(HEATER_BED_USER_THERMISTOR) + { true, 0, 0, BED_PULLUP_RESISTOR_OHMS, BED_RESISTANCE_25C_OHMS, 0, 0, BED_BETA, 0 }, + #endif + #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) + { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } + #endif + }; + COPY(thermalManager.user_thermistor, user_thermistor); + } + + void Temperature::log_user_thermistor(const uint8_t t_index, const bool eprom/*=false*/) { + + if (eprom) + SERIAL_ECHOPGM(" M305 "); + else + SERIAL_ECHO_START(); + SERIAL_CHAR('P'); + SERIAL_CHAR('0' + t_index); + + const user_thermistor_t &t = user_thermistor[t_index]; + + SERIAL_ECHOPAIR_F(" R", t.series_res, 1); + SERIAL_ECHOPAIR_F_P(SP_T_STR, t.res_25, 1); + 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") :) + TERN_(HEATER_1_USER_THERMISTOR, t_index == CTI_HOTEND_1 ? PSTR("HOTEND 1") :) + TERN_(HEATER_2_USER_THERMISTOR, t_index == CTI_HOTEND_2 ? PSTR("HOTEND 2") :) + TERN_(HEATER_3_USER_THERMISTOR, t_index == CTI_HOTEND_3 ? PSTR("HOTEND 3") :) + TERN_(HEATER_4_USER_THERMISTOR, t_index == CTI_HOTEND_4 ? PSTR("HOTEND 4") :) + TERN_(HEATER_5_USER_THERMISTOR, t_index == CTI_HOTEND_5 ? PSTR("HOTEND 5") :) + TERN_(HEATER_6_USER_THERMISTOR, t_index == CTI_HOTEND_6 ? PSTR("HOTEND 6") :) + TERN_(HEATER_7_USER_THERMISTOR, t_index == CTI_HOTEND_7 ? PSTR("HOTEND 7") :) + TERN_(HEATER_BED_USER_THERMISTOR, t_index == CTI_BED ? PSTR("BED") :) + TERN_(HEATER_CHAMBER_USER_THERMISTOR, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :) + nullptr + ); + SERIAL_EOL(); + } + + float Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { + //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) + // static uint32_t clocks_total = 0; + // static uint32_t calls = 0; + // uint32_t tcnt5 = TCNT5; + //#endif + + if (!WITHIN(t_index, 0, COUNT(user_thermistor) - 1)) return 25; + + user_thermistor_t &t = user_thermistor[t_index]; + if (t.pre_calc) { // pre-calculate some variables + t.pre_calc = false; + t.res_25_recip = 1.0f / t.res_25; + t.res_25_log = logf(t.res_25); + t.beta_recip = 1.0f / t.beta; + t.sh_alpha = RECIPROCAL(THERMISTOR_RESISTANCE_NOMINAL_C - (THERMISTOR_ABS_ZERO_C)) + - (t.beta_recip * t.res_25_log) - (t.sh_c_coeff * cu(t.res_25_log)); + } + + // maximum adc value .. take into account the over sampling + const int adc_max = MAX_RAW_THERMISTOR_VALUE, + adc_raw = constrain(raw, 1, adc_max - 1); // constrain to prevent divide-by-zero + + const float adc_inverse = (adc_max - adc_raw) - 0.5f, + resistance = t.series_res * (adc_raw + 0.5f) / adc_inverse, + log_resistance = logf(resistance); + + float value = t.sh_alpha; + value += log_resistance * t.beta_recip; + if (t.sh_c_coeff != 0) + value += t.sh_c_coeff * cu(log_resistance); + value = 1.0f / value; + + //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) + // int32_t clocks = TCNT5 - tcnt5; + // if (clocks >= 0) { + // clocks_total += clocks; + // calls++; + // } + //#endif + + // Return degrees C (up to 999, as the LCD only displays 3 digits) + return _MIN(value + THERMISTOR_ABS_ZERO_C, 999); + } +#endif + +#if HAS_HOTEND + // Derived from RepRap FiveD extruder::getTemperature() + // For hot end temperature measurement. + float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { + if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { + SERIAL_ERROR_START(); + SERIAL_ECHO((int)e); + SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER_NUM); + kill(); + return 0; + } + + switch (e) { + case 0: + #if ENABLED(HEATER_0_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_0, raw); + #elif ENABLED(HEATER_0_USES_MAX6675) + return ( + #if ENABLED(MAX6675_IS_MAX31865) + max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS) + #else + raw * 0.25 + #endif + ); + #elif ENABLED(HEATER_0_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_0_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 1: + #if ENABLED(HEATER_1_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_1, raw); + #elif ENABLED(HEATER_1_USES_MAX6675) + return raw * 0.25; + #elif ENABLED(HEATER_1_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_1_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 2: + #if ENABLED(HEATER_2_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_2, raw); + #elif ENABLED(HEATER_2_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_2_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 3: + #if ENABLED(HEATER_3_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_3, raw); + #elif ENABLED(HEATER_3_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_3_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 4: + #if ENABLED(HEATER_4_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_4, raw); + #elif ENABLED(HEATER_4_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_4_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 5: + #if ENABLED(HEATER_5_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_5, raw); + #elif ENABLED(HEATER_5_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_5_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 6: + #if ENABLED(HEATER_6_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_6, raw); + #elif ENABLED(HEATER_6_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_6_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + case 7: + #if ENABLED(HEATER_7_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_HOTEND_7, raw); + #elif ENABLED(HEATER_7_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_7_USES_AD8495) + return TEMP_AD8495(raw); + #else + break; + #endif + default: break; + } + + #if HOTEND_USES_THERMISTOR + // Thermistor with conversion table? + const temp_entry_t(*tt)[] = (temp_entry_t(*)[])(heater_ttbl_map[e]); + SCAN_THERMISTOR_TABLE((*tt), heater_ttbllen_map[e]); + #endif + + return 0; + } +#endif // HAS_HOTEND + +#if HAS_HEATED_BED + // Derived from RepRap FiveD extruder::getTemperature() + // For bed temperature measurement. + float Temperature::analog_to_celsius_bed(const int raw) { + #if ENABLED(HEATER_BED_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_BED, raw); + #elif ENABLED(HEATER_BED_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(BED_TEMPTABLE, BED_TEMPTABLE_LEN); + #elif ENABLED(HEATER_BED_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_BED_USES_AD8495) + return TEMP_AD8495(raw); + #else + UNUSED(raw); + return 0; + #endif + } +#endif // HAS_HEATED_BED + +#if HAS_TEMP_CHAMBER + // Derived from RepRap FiveD extruder::getTemperature() + // For chamber temperature measurement. + float Temperature::analog_to_celsius_chamber(const int raw) { + #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_CHAMBER, raw); + #elif ENABLED(HEATER_CHAMBER_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(CHAMBER_TEMPTABLE, CHAMBER_TEMPTABLE_LEN); + #elif ENABLED(HEATER_CHAMBER_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(HEATER_CHAMBER_USES_AD8495) + return TEMP_AD8495(raw); + #else + UNUSED(raw); + return 0; + #endif + } +#endif // HAS_TEMP_CHAMBER + +#if HAS_TEMP_PROBE + // Derived from RepRap FiveD extruder::getTemperature() + // For probe temperature measurement. + float Temperature::analog_to_celsius_probe(const int raw) { + #if ENABLED(PROBE_USER_THERMISTOR) + return user_thermistor_to_deg_c(CTI_PROBE, raw); + #elif ENABLED(PROBE_USES_THERMISTOR) + SCAN_THERMISTOR_TABLE(PROBE_TEMPTABLE, PROBE_TEMPTABLE_LEN); + #elif ENABLED(PROBE_USES_AD595) + return TEMP_AD595(raw); + #elif ENABLED(PROBE_USES_AD8495) + return TEMP_AD8495(raw); + #else + UNUSED(raw); + return 0; + #endif + } +#endif // HAS_TEMP_PROBE + +/** + * Get the raw values into the actual temperatures. + * The raw values are created in interrupt context, + * and this function is called from normal context + * as it would block the stepper routine. + */ +void Temperature::updateTemperaturesFromRawValues() { + #if ENABLED(HEATER_0_USES_MAX6675) + temp_hotend[0].raw = READ_MAX6675(0); + #endif + #if ENABLED(HEATER_1_USES_MAX6675) + temp_hotend[1].raw = READ_MAX6675(1); + #endif + #if HAS_HOTEND + HOTEND_LOOP() temp_hotend[e].celsius = analog_to_celsius_hotend(temp_hotend[e].raw, e); + #endif + + TERN_(HAS_HEATED_BED, temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw)); + TERN_(HAS_TEMP_CHAMBER, temp_chamber.celsius = analog_to_celsius_chamber(temp_chamber.raw)); + TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.raw)); + TERN_(TEMP_SENSOR_1_AS_REDUNDANT, redundant_temperature = analog_to_celsius_hotend(redundant_temperature_raw, 1)); + TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm()); + TERN_(HAS_POWER_MONITOR, power_monitor.capture_values()); + + // Reset the watchdog on good temperature measurement + watchdog_refresh(); + + raw_temps_ready = false; +} + +#if MAX6675_SEPARATE_SPI + template SoftSPI SPIclass::softSPI; + SPIclass max6675_spi; +#endif + +// Init fans according to whether they're native PWM or Software PWM +#ifdef ALFAWISE_UX0 + #define _INIT_SOFT_FAN(P) OUT_WRITE_OD(P, FAN_INVERTING ? LOW : HIGH) +#else + #define _INIT_SOFT_FAN(P) OUT_WRITE(P, FAN_INVERTING ? LOW : HIGH) +#endif +#if ENABLED(FAN_SOFT_PWM) + #define _INIT_FAN_PIN(P) _INIT_SOFT_FAN(P) +#else + #define _INIT_FAN_PIN(P) do{ if (PWM_PIN(P)) SET_PWM(P); else _INIT_SOFT_FAN(P); }while(0) +#endif +#if ENABLED(FAST_PWM_FAN) + #define SET_FAST_PWM_FREQ(P) set_pwm_frequency(P, FAST_PWM_FAN_FREQUENCY) +#else + #define SET_FAST_PWM_FREQ(P) NOOP +#endif +#define INIT_FAN_PIN(P) do{ _INIT_FAN_PIN(P); SET_FAST_PWM_FREQ(P); }while(0) +#if EXTRUDER_AUTO_FAN_SPEED != 255 + #define INIT_E_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0) +#else + #define INIT_E_AUTO_FAN_PIN(P) SET_OUTPUT(P) +#endif +#if CHAMBER_AUTO_FAN_SPEED != 255 + #define INIT_CHAMBER_AUTO_FAN_PIN(P) do{ if (P == FAN1_PIN || P == FAN2_PIN) { SET_PWM(P); SET_FAST_PWM_FREQ(P); } else SET_OUTPUT(P); }while(0) +#else + #define INIT_CHAMBER_AUTO_FAN_PIN(P) SET_OUTPUT(P) +#endif + +/** + * Initialize the temperature manager + * The manager is implemented by periodic calls to manage_heater() + */ +void Temperature::init() { + + TERN_(MAX6675_IS_MAX31865, max31865.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE + + #if EARLY_WATCHDOG + // Flag that the thermalManager should be running + if (inited) return; + inited = true; + #endif + + #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) + MCUCR = _BV(JTD); + MCUCR = _BV(JTD); + #endif + #endif + + // Thermistor activation by MCU pin + #if PIN_EXISTS(TEMP_0_TR_ENABLE) + OUT_WRITE(TEMP_0_TR_ENABLE_PIN, ENABLED(HEATER_0_USES_MAX6675)); + #endif + #if PIN_EXISTS(TEMP_1_TR_ENABLE) + OUT_WRITE(TEMP_1_TR_ENABLE_PIN, ENABLED(HEATER_1_USES_MAX6675)); + #endif + + #if BOTH(PIDTEMP, PID_EXTRUSION_SCALING) + last_e_position = 0; + #endif + + #if HAS_HEATER_0 + #ifdef ALFAWISE_UX0 + OUT_WRITE_OD(HEATER_0_PIN, HEATER_0_INVERTING); + #else + OUT_WRITE(HEATER_0_PIN, HEATER_0_INVERTING); + #endif + #endif + + #if HAS_HEATER_1 + OUT_WRITE(HEATER_1_PIN, HEATER_1_INVERTING); + #endif + #if HAS_HEATER_2 + OUT_WRITE(HEATER_2_PIN, HEATER_2_INVERTING); + #endif + #if HAS_HEATER_3 + OUT_WRITE(HEATER_3_PIN, HEATER_3_INVERTING); + #endif + #if HAS_HEATER_4 + OUT_WRITE(HEATER_4_PIN, HEATER_4_INVERTING); + #endif + #if HAS_HEATER_5 + OUT_WRITE(HEATER_5_PIN, HEATER_5_INVERTING); + #endif + #if HAS_HEATER_6 + OUT_WRITE(HEATER_6_PIN, HEATER_6_INVERTING); + #endif + #if HAS_HEATER_7 + OUT_WRITE(HEATER_7_PIN, HEATER_7_INVERTING); + #endif + + #if HAS_HEATED_BED + #ifdef ALFAWISE_UX0 + OUT_WRITE_OD(HEATER_BED_PIN, HEATER_BED_INVERTING); + #else + OUT_WRITE(HEATER_BED_PIN, HEATER_BED_INVERTING); + #endif + #endif + + #if HAS_HEATED_CHAMBER + OUT_WRITE(HEATER_CHAMBER_PIN, HEATER_CHAMBER_INVERTING); + #endif + + #if HAS_FAN0 + INIT_FAN_PIN(FAN_PIN); + #endif + #if HAS_FAN1 + INIT_FAN_PIN(FAN1_PIN); + #endif + #if HAS_FAN2 + INIT_FAN_PIN(FAN2_PIN); + #endif + #if HAS_FAN3 + INIT_FAN_PIN(FAN3_PIN); + #endif + #if HAS_FAN4 + INIT_FAN_PIN(FAN4_PIN); + #endif + #if HAS_FAN5 + INIT_FAN_PIN(FAN5_PIN); + #endif + #if HAS_FAN6 + INIT_FAN_PIN(FAN6_PIN); + #endif + #if HAS_FAN7 + INIT_FAN_PIN(FAN7_PIN); + #endif + #if ENABLED(USE_CONTROLLER_FAN) + INIT_FAN_PIN(CONTROLLER_FAN_PIN); + #endif + + #if MAX6675_SEPARATE_SPI + + OUT_WRITE(SCK_PIN, LOW); + OUT_WRITE(MOSI_PIN, HIGH); + SET_INPUT_PULLUP(MISO_PIN); + + max6675_spi.init(); + + OUT_WRITE(SS_PIN, HIGH); + OUT_WRITE(MAX6675_SS_PIN, HIGH); + + #endif + + #if ENABLED(HEATER_1_USES_MAX6675) + OUT_WRITE(MAX6675_SS2_PIN, HIGH); + #endif + + HAL_adc_init(); + + #if HAS_TEMP_ADC_0 + HAL_ANALOG_SELECT(TEMP_0_PIN); + #endif + #if HAS_TEMP_ADC_1 + HAL_ANALOG_SELECT(TEMP_1_PIN); + #endif + #if HAS_TEMP_ADC_2 + HAL_ANALOG_SELECT(TEMP_2_PIN); + #endif + #if HAS_TEMP_ADC_3 + HAL_ANALOG_SELECT(TEMP_3_PIN); + #endif + #if HAS_TEMP_ADC_4 + HAL_ANALOG_SELECT(TEMP_4_PIN); + #endif + #if HAS_TEMP_ADC_5 + HAL_ANALOG_SELECT(TEMP_5_PIN); + #endif + #if HAS_TEMP_ADC_6 + HAL_ANALOG_SELECT(TEMP_6_PIN); + #endif + #if HAS_TEMP_ADC_7 + HAL_ANALOG_SELECT(TEMP_7_PIN); + #endif + #if HAS_JOY_ADC_X + HAL_ANALOG_SELECT(JOY_X_PIN); + #endif + #if HAS_JOY_ADC_Y + HAL_ANALOG_SELECT(JOY_Y_PIN); + #endif + #if HAS_JOY_ADC_Z + HAL_ANALOG_SELECT(JOY_Z_PIN); + #endif + #if HAS_JOY_ADC_EN + SET_INPUT_PULLUP(JOY_EN_PIN); + #endif + #if HAS_HEATED_BED + HAL_ANALOG_SELECT(TEMP_BED_PIN); + #endif + #if HAS_TEMP_CHAMBER + HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN); + #endif + #if HAS_TEMP_PROBE + HAL_ANALOG_SELECT(TEMP_PROBE_PIN); + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + HAL_ANALOG_SELECT(FILWIDTH_PIN); + #endif + #if HAS_ADC_BUTTONS + HAL_ANALOG_SELECT(ADC_KEYPAD_PIN); + #endif + #if ENABLED(POWER_MONITOR_CURRENT) + HAL_ANALOG_SELECT(POWER_MONITOR_CURRENT_PIN); + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + HAL_ANALOG_SELECT(POWER_MONITOR_VOLTAGE_PIN); + #endif + + HAL_timer_start(TEMP_TIMER_NUM, TEMP_TIMER_FREQUENCY); + ENABLE_TEMPERATURE_INTERRUPT(); + + #if HAS_AUTO_FAN_0 + INIT_E_AUTO_FAN_PIN(E0_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_1 && !_EFANOVERLAP(1,0) + INIT_E_AUTO_FAN_PIN(E1_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_2 && !(_EFANOVERLAP(2,0) || _EFANOVERLAP(2,1)) + INIT_E_AUTO_FAN_PIN(E2_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_3 && !(_EFANOVERLAP(3,0) || _EFANOVERLAP(3,1) || _EFANOVERLAP(3,2)) + INIT_E_AUTO_FAN_PIN(E3_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_4 && !(_EFANOVERLAP(4,0) || _EFANOVERLAP(4,1) || _EFANOVERLAP(4,2) || _EFANOVERLAP(4,3)) + INIT_E_AUTO_FAN_PIN(E4_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_5 && !(_EFANOVERLAP(5,0) || _EFANOVERLAP(5,1) || _EFANOVERLAP(5,2) || _EFANOVERLAP(5,3) || _EFANOVERLAP(5,4)) + INIT_E_AUTO_FAN_PIN(E5_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_6 && !(_EFANOVERLAP(6,0) || _EFANOVERLAP(6,1) || _EFANOVERLAP(6,2) || _EFANOVERLAP(6,3) || _EFANOVERLAP(6,4) || _EFANOVERLAP(6,5)) + INIT_E_AUTO_FAN_PIN(E6_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_FAN_7 && !(_EFANOVERLAP(7,0) || _EFANOVERLAP(7,1) || _EFANOVERLAP(7,2) || _EFANOVERLAP(7,3) || _EFANOVERLAP(7,4) || _EFANOVERLAP(7,5) || _EFANOVERLAP(7,6)) + INIT_E_AUTO_FAN_PIN(E7_AUTO_FAN_PIN); + #endif + #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E + INIT_CHAMBER_AUTO_FAN_PIN(CHAMBER_AUTO_FAN_PIN); + #endif + + // Wait for temperature measurement to settle + delay(250); + + #if HAS_HOTEND + + #define _TEMP_MIN_E(NR) do{ \ + 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, 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); \ + }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); + #endif + #if _MINMAX_TEST(1, MIN) + _TEMP_MIN_E(1); + #endif + #if _MINMAX_TEST(1, MAX) + _TEMP_MAX_E(1); + #endif + #if _MINMAX_TEST(2, MIN) + _TEMP_MIN_E(2); + #endif + #if _MINMAX_TEST(2, MAX) + _TEMP_MAX_E(2); + #endif + #if _MINMAX_TEST(3, MIN) + _TEMP_MIN_E(3); + #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 + + #if HAS_HEATED_BED + #ifdef BED_MINTEMP + while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR); + #endif + #ifdef BED_MAXTEMP + while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR); + #endif + #endif // HAS_HEATED_BED + + #if HAS_HEATED_CHAMBER + #ifdef CHAMBER_MINTEMP + while (analog_to_celsius_chamber(mintemp_raw_CHAMBER) < CHAMBER_MINTEMP) mintemp_raw_CHAMBER += TEMPDIR(CHAMBER) * (OVERSAMPLENR); + #endif + #ifdef CHAMBER_MAXTEMP + while (analog_to_celsius_chamber(maxtemp_raw_CHAMBER) > CHAMBER_MAXTEMP) maxtemp_raw_CHAMBER -= TEMPDIR(CHAMBER) * (OVERSAMPLENR); + #endif + #endif + + TERN_(PROBING_HEATERS_OFF, paused = false); +} + +#if WATCH_HOTENDS + /** + * Start Heating Sanity Check for hotends that are below + * their target temperature by a configurable margin. + * This is called when the temperature is set. (M104, M109) + */ + void Temperature::start_watching_hotend(const uint8_t E_NAME) { + const uint8_t ee = HOTEND_INDEX; + watch_hotend[ee].restart(degHotend(ee), degTargetHotend(ee)); + } +#endif + +#if WATCH_BED + /** + * Start Heating Sanity Check for hotends that are below + * their target temperature by a configurable margin. + * This is called when the temperature is set. (M140, M190) + */ + void Temperature::start_watching_bed() { + watch_bed.restart(degBed(), degTargetBed()); + } +#endif + +#if WATCH_CHAMBER + /** + * Start Heating Sanity Check for chamber that is below + * its target temperature by a configurable margin. + * This is called when the temperature is set. (M141, M191) + */ + void Temperature::start_watching_chamber() { + watch_chamber.restart(degChamber(), degTargetChamber()); + } +#endif + +#if HAS_THERMAL_PROTECTION + + Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } }; + + /** + * @brief Thermal Runaway state machine for a single heater + * @param current current measured temperature + * @param target current target temperature + * @param heater_id extruder index + * @param period_seconds missed temperature allowed time + * @param hysteresis_degc allowed distance from target + * + * TODO: Embed the last 3 parameters during init, if not less optimal + */ + void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { + + #if HEATER_IDLE_HANDLER + // Convert the given heater_id_t to an idle array index + const IdleIndex idle_index = idle_index_for_id(heater_id); + #endif + + /** + SERIAL_ECHO_START(); + SERIAL_ECHOPGM("Thermal Runaway Running. Heater ID: "); + switch (heater_id) { + case H_BED: SERIAL_ECHOPGM("bed"); break; + case H_CHAMBER: SERIAL_ECHOPGM("chamber"); break; + default: SERIAL_ECHO(heater_id); + } + SERIAL_ECHOLNPAIR( + " ; sizeof(running_temp):", sizeof(running_temp), + " ; State:", state, " ; Timer:", timer, " ; Temperature:", current, " ; Target Temp:", target + #if HEATER_IDLE_HANDLER + , " ; Idle Timeout:", heater_idle[idle_index].timed_out + #endif + ); + //*/ + + #if HEATER_IDLE_HANDLER + // If the heater idle timeout expires, restart + if (heater_idle[idle_index].timed_out) { + state = TRInactive; + running_temp = 0; + } + else + #endif + { + // If the target temperature changes, restart + if (running_temp != target) { + running_temp = target; + state = target > 0 ? TRFirstHeating : TRInactive; + } + } + + switch (state) { + // Inactive state waits for a target temperature to be set + case TRInactive: break; + + // When first heating, wait for the temperature to be reached then go to Stable state + case TRFirstHeating: + if (current < running_temp) break; + state = TRStable; + + // While the temperature is stable watch for a bad temperature + case TRStable: + + #if ENABLED(ADAPTIVE_FAN_SLOWING) + if (adaptive_fan_slowing && heater_id >= 0) { + const int fan_index = _MIN(heater_id, FAN_COUNT - 1); + if (fan_speed[fan_index] == 0 || current >= running_temp - (hysteresis_degc * 0.25f)) + fan_speed_scaler[fan_index] = 128; + else if (current >= running_temp - (hysteresis_degc * 0.3335f)) + fan_speed_scaler[fan_index] = 96; + else if (current >= running_temp - (hysteresis_degc * 0.5f)) + fan_speed_scaler[fan_index] = 64; + else if (current >= running_temp - (hysteresis_degc * 0.8f)) + fan_speed_scaler[fan_index] = 32; + else + fan_speed_scaler[fan_index] = 0; + } + #endif + + if (current >= running_temp - hysteresis_degc) { + timer = millis() + SEC_TO_MS(period_seconds); + break; + } + else if (PENDING(millis(), timer)) break; + state = TRRunaway; + + case TRRunaway: + TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); + _temp_error(heater_id, str_t_thermal_runaway, GET_TEXT(MSG_THERMAL_RUNAWAY)); + } + } + +#endif // HAS_THERMAL_PROTECTION + +void Temperature::disable_all_heaters() { + + TERN_(AUTOTEMP, planner.autotemp_enabled = false); + + // Unpause and reset everything + TERN_(PROBING_HEATERS_OFF, pause(false)); + + #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 + setTargetBed(0); + temp_bed.soft_pwm_amount = 0; + WRITE_HEATER_BED(LOW); + #endif + + #if HAS_HEATED_CHAMBER + setTargetChamber(0); + temp_chamber.soft_pwm_amount = 0; + WRITE_HEATER_CHAMBER(LOW); + #endif +} + +#if ENABLED(PRINTJOB_TIMER_AUTOSTART) + + bool Temperature::over_autostart_threshold() { + #if HAS_HOTEND + HOTEND_LOOP() if (degTargetHotend(e) > (EXTRUDE_MINTEMP) / 2) return true; + #endif + return TERN0(HAS_HEATED_BED, degTargetBed() > BED_MINTEMP) + || TERN0(HAS_HEATED_CHAMBER, degTargetChamber() > CHAMBER_MINTEMP); + } + + void Temperature::check_timer_autostart(const bool can_start, const bool can_stop) { + if (over_autostart_threshold()) { + if (can_start) startOrResumeJob(); + } + else if (can_stop) { + print_job_timer.stop(); + ui.reset_status(); + } + } + +#endif + + +#if ENABLED(PROBING_HEATERS_OFF) + + void Temperature::pause(const bool p) { + if (p != paused) { + paused = p; + if (p) { + HOTEND_LOOP() heater_idle[e].expire(); // Timeout immediately + TERN_(HAS_HEATED_BED, heater_idle[IDLE_INDEX_BED].expire()); // Timeout immediately + } + else { + HOTEND_LOOP() reset_hotend_idle_timer(e); + TERN_(HAS_HEATED_BED, reset_bed_idle_timer()); + } + } + } + +#endif // PROBING_HEATERS_OFF + +#if HAS_MAX6675 + + #ifndef THERMOCOUPLE_MAX_ERRORS + #define THERMOCOUPLE_MAX_ERRORS 15 + #endif + + int Temperature::read_max6675( + #if COUNT_6675 > 1 + const uint8_t hindex + #endif + ) { + #if COUNT_6675 == 1 + constexpr uint8_t hindex = 0; + #else + // Needed to return the correct temp when this is called too soon + static uint16_t max6675_temp_previous[COUNT_6675] = { 0 }; + #endif + + static uint8_t max6675_errors[COUNT_6675] = { 0 }; + + #define MAX6675_HEAT_INTERVAL 250UL + + #if ENABLED(MAX6675_IS_MAX31855) + static uint32_t max6675_temp = 2000; + #define MAX6675_ERROR_MASK 7 + #define MAX6675_DISCARD_BITS 18 + #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #else + static uint16_t max6675_temp = 2000; + #define MAX6675_ERROR_MASK 4 + #define MAX6675_DISCARD_BITS 3 + #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16 + #endif + + // Return last-read value between readings + static millis_t next_max6675_ms[COUNT_6675] = { 0 }; + millis_t ms = millis(); + if (PENDING(ms, next_max6675_ms[hindex])) + return int( + #if COUNT_6675 == 1 + max6675_temp + #else + max6675_temp_previous[hindex] // Need to return the correct previous value + #endif + ); + + next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; + + #if ENABLED(MAX6675_IS_MAX31865) + max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)); + #endif + + // + // TODO: spiBegin, spiRec and spiInit doesn't work when soft spi is used. + // + #if !MAX6675_SEPARATE_SPI + spiBegin(); + spiInit(MAX6675_SPEED_BITS); + #endif + + #if COUNT_6675 > 1 + #define WRITE_MAX6675(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) + #define SET_OUTPUT_MAX6675() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0) + #elif ENABLED(HEATER_1_USES_MAX6675) + #define WRITE_MAX6675(V) WRITE(MAX6675_SS2_PIN, V) + #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS2_PIN) + #else + #define WRITE_MAX6675(V) WRITE(MAX6675_SS_PIN, V) + #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS_PIN) + #endif + + SET_OUTPUT_MAX6675(); + WRITE_MAX6675(LOW); // enable TT_MAX6675 + + DELAY_NS(100); // Ensure 100ns delay + + // Read a big-endian temperature value + max6675_temp = 0; + for (uint8_t i = sizeof(max6675_temp); i--;) { + max6675_temp |= ( + #if MAX6675_SEPARATE_SPI + max6675_spi.receive() + #else + spiRec() + #endif + ); + if (i > 0) max6675_temp <<= 8; // shift left if not the last byte + } + + WRITE_MAX6675(HIGH); // disable TT_MAX6675 + + if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK)) { + max6675_errors[hindex] += 1; + if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { + SERIAL_ERROR_START(); + SERIAL_ECHOPGM("Temp measurement error! "); + #if MAX6675_ERROR_MASK == 7 + SERIAL_ECHOPGM("MAX31855 "); + if (max6675_temp & 1) + SERIAL_ECHOLNPGM("Open Circuit"); + else if (max6675_temp & 2) + SERIAL_ECHOLNPGM("Short to GND"); + else if (max6675_temp & 4) + SERIAL_ECHOLNPGM("Short to VCC"); + #else + SERIAL_ECHOLNPGM("MAX6675"); + #endif + + // Thermocouple open + max6675_temp = 4 * ( + #if COUNT_6675 > 1 + hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX + #else + TERN(HEATER_1_USES_MAX6675, HEATER_1_MAX6675_TMAX, HEATER_0_MAX6675_TMAX) + #endif + ); + } + else + max6675_temp >>= MAX6675_DISCARD_BITS; + } + else { + max6675_temp >>= MAX6675_DISCARD_BITS; + max6675_errors[hindex] = 0; + } + + #if ENABLED(MAX6675_IS_MAX31855) + if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature + #endif + + #if COUNT_6675 > 1 + max6675_temp_previous[hindex] = max6675_temp; + #endif + + return int(max6675_temp); + } + +#endif // HAS_MAX6675 + +/** + * Update raw temperatures + */ +void Temperature::update_raw_temperatures() { + + #if HAS_TEMP_ADC_0 && DISABLED(HEATER_0_USES_MAX6675) + temp_hotend[0].update(); + #endif + + #if HAS_TEMP_ADC_1 + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + redundant_temperature_raw = temp_hotend[1].acc; + #elif DISABLED(HEATER_1_USES_MAX6675) + temp_hotend[1].update(); + #endif + #endif + + TERN_(HAS_TEMP_ADC_2, temp_hotend[2].update()); + TERN_(HAS_TEMP_ADC_3, temp_hotend[3].update()); + TERN_(HAS_TEMP_ADC_4, temp_hotend[4].update()); + TERN_(HAS_TEMP_ADC_5, temp_hotend[5].update()); + TERN_(HAS_TEMP_ADC_6, temp_hotend[6].update()); + TERN_(HAS_TEMP_ADC_7, temp_hotend[7].update()); + TERN_(HAS_HEATED_BED, temp_bed.update()); + TERN_(HAS_TEMP_CHAMBER, temp_chamber.update()); + TERN_(HAS_TEMP_PROBE, temp_probe.update()); + + TERN_(HAS_JOY_ADC_X, joystick.x.update()); + TERN_(HAS_JOY_ADC_Y, joystick.y.update()); + TERN_(HAS_JOY_ADC_Z, joystick.z.update()); + + raw_temps_ready = true; +} + +void Temperature::readings_ready() { + + // Update the raw values if they've been read. Else we could be updating them during reading. + if (!raw_temps_ready) update_raw_temperatures(); + + // Filament Sensor - can be read any time since IIR filtering is used + TERN_(FILAMENT_WIDTH_SENSOR, filwidth.reading_ready()); + + #if HAS_HOTEND + HOTEND_LOOP() temp_hotend[e].reset(); + TERN_(TEMP_SENSOR_1_AS_REDUNDANT, temp_hotend[1].reset()); + #endif + + TERN_(HAS_HEATED_BED, temp_bed.reset()); + TERN_(HAS_TEMP_CHAMBER, temp_chamber.reset()); + TERN_(HAS_TEMP_PROBE, temp_probe.reset()); + + TERN_(HAS_JOY_ADC_X, joystick.x.reset()); + TERN_(HAS_JOY_ADC_Y, joystick.y.reset()); + TERN_(HAS_JOY_ADC_Z, joystick.z.reset()); + + #if HAS_HOTEND + + static constexpr int8_t temp_dir[] = { + TERN(HEATER_0_USES_MAX6675, 0, TEMPDIR(0)) + #if HAS_MULTI_HOTEND + , TERN(HEATER_1_USES_MAX6675, 0, TEMPDIR(1)) + #if HOTENDS > 2 + #define _TEMPDIR(N) , TEMPDIR(N) + REPEAT_S(2, HOTENDS, _TEMPDIR) + #endif + #endif + }; + + LOOP_L_N(e, COUNT(temp_dir)) { + const int8_t tdir = temp_dir[e]; + if (tdir) { + const int16_t rawtemp = temp_hotend[e].raw * tdir; // normal direction, +rawtemp, else -rawtemp + const bool heater_on = (temp_hotend[e].target > 0 + || TERN0(PIDTEMP, temp_hotend[e].soft_pwm_amount) > 0 + ); + if (rawtemp > temp_range[e].raw_max * tdir) max_temp_error((heater_id_t)e); + if (heater_on && rawtemp < temp_range[e].raw_min * tdir && !is_preheating(e)) { + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED + if (++consecutive_low_temperature_error[e] >= MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED) + #endif + min_temp_error((heater_id_t)e); + } + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED + else + consecutive_low_temperature_error[e] = 0; + #endif + } + } + + #endif // HAS_HOTEND + + #if HAS_HEATED_BED + #if TEMPDIR(BED) < 0 + #define BEDCMP(A,B) ((A)<(B)) + #else + #define BEDCMP(A,B) ((A)>(B)) + #endif + const bool bed_on = (temp_bed.target > 0) || TERN0(PIDTEMPBED, temp_bed.soft_pwm_amount > 0); + if (BEDCMP(temp_bed.raw, maxtemp_raw_BED)) max_temp_error(H_BED); + if (bed_on && BEDCMP(mintemp_raw_BED, temp_bed.raw)) min_temp_error(H_BED); + #endif + + #if HAS_HEATED_CHAMBER + #if TEMPDIR(CHAMBER) < 0 + #define CHAMBERCMP(A,B) ((A)<(B)) + #else + #define CHAMBERCMP(A,B) ((A)>(B)) + #endif + const bool chamber_on = (temp_chamber.target > 0); + if (CHAMBERCMP(temp_chamber.raw, maxtemp_raw_CHAMBER)) max_temp_error(H_CHAMBER); + if (chamber_on && CHAMBERCMP(mintemp_raw_CHAMBER, temp_chamber.raw)) min_temp_error(H_CHAMBER); + #endif +} + +/** + * Timer 0 is shared with millies so don't change the prescaler. + * + * On AVR this ISR uses the compare method so it runs at the base + * frequency (16 MHz / 64 / 256 = 976.5625 Hz), but at the TCNT0 set + * in OCR0B above (128 or halfway between OVFs). + * + * - Manage PWM to all the heaters and fan + * - Prepare or Measure one of the raw ADC sensor values + * - Check new temperature values for MIN/MAX errors (kill on error) + * - Step the babysteps value for each axis towards 0 + * - For PINS_DEBUGGING, monitor and report endstop pins + * - For ENDSTOP_INTERRUPTS_FEATURE check endstops if flagged + * - Call planner.tick to count down its "ignore" time + */ +HAL_TEMP_TIMER_ISR() { + HAL_timer_isr_prologue(TEMP_TIMER_NUM); + + Temperature::tick(); + + HAL_timer_isr_epilogue(TEMP_TIMER_NUM); +} + +#if ENABLED(SLOW_PWM_HEATERS) && !defined(MIN_STATE_TIME) + #define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds +#endif + +class SoftPWM { +public: + uint8_t count; + inline bool add(const uint8_t mask, const uint8_t amount) { + count = (count & mask) + amount; return (count > mask); + } + #if ENABLED(SLOW_PWM_HEATERS) + bool state_heater; + uint8_t state_timer_heater; + inline void dec() { if (state_timer_heater > 0) state_timer_heater--; } + inline bool ready(const bool v) { + const bool rdy = !state_timer_heater; + if (rdy && state_heater != v) { + state_heater = v; + state_timer_heater = MIN_STATE_TIME; + } + return rdy; + } + #endif +}; + +/** + * Handle various ~1KHz tasks associated with temperature + * - Heater PWM (~1KHz with scaler) + * - LCD Button polling (~500Hz) + * - Start / Read one ADC sensor + * - Advance Babysteps + * - Endstop polling + * - Planner clean buffer + */ +void Temperature::tick() { + + static int8_t temp_count = -1; + static ADCSensorState adc_sensor_state = StartupDelay; + static uint8_t pwm_count = _BV(SOFT_PWM_SCALE); + + // avoid multiple loads of pwm_count + uint8_t pwm_count_tmp = pwm_count; + + #if HAS_ADC_BUTTONS + static unsigned int raw_ADCKey_value = 0; + static bool ADCKey_pressed = false; + #endif + + #if HAS_HOTEND + static SoftPWM soft_pwm_hotend[HOTENDS]; + #endif + + #if HAS_HEATED_BED + static SoftPWM soft_pwm_bed; + #endif + + #if HAS_HEATED_CHAMBER + static SoftPWM soft_pwm_chamber; + #endif + + #if DISABLED(SLOW_PWM_HEATERS) + + #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, FAN_SOFT_PWM) + constexpr uint8_t pwm_mask = TERN0(SOFT_PWM_DITHER, _BV(SOFT_PWM_SCALE) - 1); + #define _PWM_MOD(N,S,T) do{ \ + const bool on = S.add(pwm_mask, T.soft_pwm_amount); \ + WRITE_HEATER_##N(on); \ + }while(0) + #endif + + /** + * Standard heater PWM modulation + */ + if (pwm_count_tmp >= 127) { + pwm_count_tmp -= 127; + + #if HAS_HOTEND + #define _PWM_MOD_E(N) _PWM_MOD(N,soft_pwm_hotend[N],temp_hotend[N]); + REPEAT(HOTENDS, _PWM_MOD_E); + #endif + + #if HAS_HEATED_BED + _PWM_MOD(BED,soft_pwm_bed,temp_bed); + #endif + + #if HAS_HEATED_CHAMBER + _PWM_MOD(CHAMBER,soft_pwm_chamber,temp_chamber); + #endif + + #if ENABLED(FAN_SOFT_PWM) + #define _FAN_PWM(N) do{ \ + uint8_t &spcf = soft_pwm_count_fan[N]; \ + spcf = (spcf & pwm_mask) + (soft_pwm_amount_fan[N] >> 1); \ + WRITE_FAN(N, spcf > pwm_mask ? HIGH : LOW); \ + }while(0) + #if HAS_FAN0 + _FAN_PWM(0); + #endif + #if HAS_FAN1 + _FAN_PWM(1); + #endif + #if HAS_FAN2 + _FAN_PWM(2); + #endif + #if HAS_FAN3 + _FAN_PWM(3); + #endif + #if HAS_FAN4 + _FAN_PWM(4); + #endif + #if HAS_FAN5 + _FAN_PWM(5); + #endif + #if HAS_FAN6 + _FAN_PWM(6); + #endif + #if HAS_FAN7 + _FAN_PWM(7); + #endif + #endif + } + else { + #define _PWM_LOW(N,S) do{ if (S.count <= pwm_count_tmp) WRITE_HEATER_##N(LOW); }while(0) + #if HAS_HOTEND + #define _PWM_LOW_E(N) _PWM_LOW(N, soft_pwm_hotend[N]); + REPEAT(HOTENDS, _PWM_LOW_E); + #endif + + #if HAS_HEATED_BED + _PWM_LOW(BED, soft_pwm_bed); + #endif + + #if HAS_HEATED_CHAMBER + _PWM_LOW(CHAMBER, soft_pwm_chamber); + #endif + + #if ENABLED(FAN_SOFT_PWM) + #if HAS_FAN0 + if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(0, LOW); + #endif + #if HAS_FAN1 + if (soft_pwm_count_fan[1] <= pwm_count_tmp) WRITE_FAN(1, LOW); + #endif + #if HAS_FAN2 + if (soft_pwm_count_fan[2] <= pwm_count_tmp) WRITE_FAN(2, LOW); + #endif + #if HAS_FAN3 + if (soft_pwm_count_fan[3] <= pwm_count_tmp) WRITE_FAN(3, LOW); + #endif + #if HAS_FAN4 + if (soft_pwm_count_fan[4] <= pwm_count_tmp) WRITE_FAN(4, LOW); + #endif + #if HAS_FAN5 + if (soft_pwm_count_fan[5] <= pwm_count_tmp) WRITE_FAN(5, LOW); + #endif + #if HAS_FAN6 + if (soft_pwm_count_fan[6] <= pwm_count_tmp) WRITE_FAN(6, LOW); + #endif + #if HAS_FAN7 + if (soft_pwm_count_fan[7] <= pwm_count_tmp) WRITE_FAN(7, LOW); + #endif + #endif + } + + // SOFT_PWM_SCALE to frequency: + // + // 0: 16000000/64/256/128 = 7.6294 Hz + // 1: / 64 = 15.2588 Hz + // 2: / 32 = 30.5176 Hz + // 3: / 16 = 61.0352 Hz + // 4: / 8 = 122.0703 Hz + // 5: / 4 = 244.1406 Hz + pwm_count = pwm_count_tmp + _BV(SOFT_PWM_SCALE); + + #else // SLOW_PWM_HEATERS + + /** + * SLOW PWM HEATERS + * + * For relay-driven heaters + */ + #define _SLOW_SET(NR,PWM,V) do{ if (PWM.ready(V)) WRITE_HEATER_##NR(V); }while(0) + #define _SLOW_PWM(NR,PWM,SRC) do{ PWM.count = SRC.soft_pwm_amount; _SLOW_SET(NR,PWM,(PWM.count > 0)); }while(0) + #define _PWM_OFF(NR,PWM) do{ if (PWM.count < slow_pwm_count) _SLOW_SET(NR,PWM,0); }while(0) + + static uint8_t slow_pwm_count = 0; + + if (slow_pwm_count == 0) { + + #if HAS_HOTEND + #define _SLOW_PWM_E(N) _SLOW_PWM(N, soft_pwm_hotend[N], temp_hotend[N]); + REPEAT(HOTENDS, _SLOW_PWM_E); + #endif + + #if HAS_HEATED_BED + _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 + #define _PWM_OFF_E(N) _PWM_OFF(N, soft_pwm_hotend[N]); + REPEAT(HOTENDS, _PWM_OFF_E); + #endif + + #if HAS_HEATED_BED + _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; + #define _PWM_FAN(N) do{ \ + soft_pwm_count_fan[N] = soft_pwm_amount_fan[N] >> 1; \ + WRITE_FAN(N, soft_pwm_count_fan[N] > 0 ? HIGH : LOW); \ + }while(0) + #if HAS_FAN0 + _PWM_FAN(0); + #endif + #if HAS_FAN1 + _PWM_FAN(1); + #endif + #if HAS_FAN2 + _PWM_FAN(2); + #endif + #if HAS_FAN3 + _FAN_PWM(3); + #endif + #if HAS_FAN4 + _FAN_PWM(4); + #endif + #if HAS_FAN5 + _FAN_PWM(5); + #endif + #if HAS_FAN6 + _FAN_PWM(6); + #endif + #if HAS_FAN7 + _FAN_PWM(7); + #endif + } + #if HAS_FAN0 + if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(0, LOW); + #endif + #if HAS_FAN1 + if (soft_pwm_count_fan[1] <= pwm_count_tmp) WRITE_FAN(1, LOW); + #endif + #if HAS_FAN2 + if (soft_pwm_count_fan[2] <= pwm_count_tmp) WRITE_FAN(2, LOW); + #endif + #if HAS_FAN3 + if (soft_pwm_count_fan[3] <= pwm_count_tmp) WRITE_FAN(3, LOW); + #endif + #if HAS_FAN4 + if (soft_pwm_count_fan[4] <= pwm_count_tmp) WRITE_FAN(4, LOW); + #endif + #if HAS_FAN5 + if (soft_pwm_count_fan[5] <= pwm_count_tmp) WRITE_FAN(5, LOW); + #endif + #if HAS_FAN6 + if (soft_pwm_count_fan[6] <= pwm_count_tmp) WRITE_FAN(6, LOW); + #endif + #if HAS_FAN7 + if (soft_pwm_count_fan[7] <= pwm_count_tmp) WRITE_FAN(7, LOW); + #endif + #endif // FAN_SOFT_PWM + + // SOFT_PWM_SCALE to frequency: + // + // 0: 16000000/64/256/128 = 7.6294 Hz + // 1: / 64 = 15.2588 Hz + // 2: / 32 = 30.5176 Hz + // 3: / 16 = 61.0352 Hz + // 4: / 8 = 122.0703 Hz + // 5: / 4 = 244.1406 Hz + pwm_count = pwm_count_tmp + _BV(SOFT_PWM_SCALE); + + // increment slow_pwm_count only every 64th pwm_count, + // i.e. yielding a PWM frequency of 16/128 Hz (8s). + if (((pwm_count >> SOFT_PWM_SCALE) & 0x3F) == 0) { + slow_pwm_count++; + slow_pwm_count &= 0x7F; + + #if HAS_HOTEND + 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 + + // + // Update lcd buttons 488 times per second + // + static bool do_buttons; + if ((do_buttons ^= true)) ui.update_buttons(); + + /** + * One sensor is sampled on every other call of the ISR. + * Each sensor is read 16 (OVERSAMPLENR) times, taking the average. + * + * On each Prepare pass, ADC is started for a sensor pin. + * On the next pass, the ADC value is read and accumulated. + * + * This gives each ADC 0.9765ms to charge up. + */ + #define ACCUMULATE_ADC(obj) do{ \ + if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; \ + else obj.sample(HAL_READ_ADC()); \ + }while(0) + + ADCSensorState next_sensor_state = adc_sensor_state < SensorsReady ? (ADCSensorState)(int(adc_sensor_state) + 1) : StartSampling; + + switch (adc_sensor_state) { + + case SensorsReady: { + // All sensors have been read. Stay in this state for a few + // ISRs to save on calls to temp update/checking code below. + constexpr int8_t extra_loops = MIN_ADC_ISR_LOOPS - (int8_t)SensorsReady; + static uint8_t delay_count = 0; + if (extra_loops > 0) { + if (delay_count == 0) delay_count = extra_loops; // Init this delay + if (--delay_count) // While delaying... + next_sensor_state = SensorsReady; // retain this state (else, next state will be 0) + break; + } + else { + adc_sensor_state = StartSampling; // Fall-through to start sampling + next_sensor_state = (ADCSensorState)(int(StartSampling) + 1); + } + } + + case StartSampling: // Start of sampling loops. Do updates/checks. + if (++temp_count >= OVERSAMPLENR) { // 10 * 16 * 1/(16000000/64/256) = 164ms. + temp_count = 0; + readings_ready(); + } + break; + + #if HAS_TEMP_ADC_0 + case PrepareTemp_0: HAL_START_ADC(TEMP_0_PIN); break; + case MeasureTemp_0: ACCUMULATE_ADC(temp_hotend[0]); break; + #endif + + #if HAS_HEATED_BED + case PrepareTemp_BED: HAL_START_ADC(TEMP_BED_PIN); break; + case MeasureTemp_BED: ACCUMULATE_ADC(temp_bed); break; + #endif + + #if HAS_TEMP_CHAMBER + case PrepareTemp_CHAMBER: HAL_START_ADC(TEMP_CHAMBER_PIN); break; + case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break; + #endif + + #if HAS_TEMP_PROBE + case PrepareTemp_PROBE: HAL_START_ADC(TEMP_PROBE_PIN); break; + case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break; + #endif + + #if HAS_TEMP_ADC_1 + case PrepareTemp_1: HAL_START_ADC(TEMP_1_PIN); break; + case MeasureTemp_1: ACCUMULATE_ADC(temp_hotend[1]); break; + #endif + + #if HAS_TEMP_ADC_2 + case PrepareTemp_2: HAL_START_ADC(TEMP_2_PIN); break; + case MeasureTemp_2: ACCUMULATE_ADC(temp_hotend[2]); break; + #endif + + #if HAS_TEMP_ADC_3 + case PrepareTemp_3: HAL_START_ADC(TEMP_3_PIN); break; + case MeasureTemp_3: ACCUMULATE_ADC(temp_hotend[3]); break; + #endif + + #if HAS_TEMP_ADC_4 + case PrepareTemp_4: HAL_START_ADC(TEMP_4_PIN); break; + case MeasureTemp_4: ACCUMULATE_ADC(temp_hotend[4]); break; + #endif + + #if HAS_TEMP_ADC_5 + case PrepareTemp_5: HAL_START_ADC(TEMP_5_PIN); break; + case MeasureTemp_5: ACCUMULATE_ADC(temp_hotend[5]); break; + #endif + + #if HAS_TEMP_ADC_6 + case PrepareTemp_6: HAL_START_ADC(TEMP_6_PIN); break; + case MeasureTemp_6: ACCUMULATE_ADC(temp_hotend[6]); break; + #endif + + #if HAS_TEMP_ADC_7 + case PrepareTemp_7: HAL_START_ADC(TEMP_7_PIN); break; + case MeasureTemp_7: ACCUMULATE_ADC(temp_hotend[7]); break; + #endif + + #if ENABLED(FILAMENT_WIDTH_SENSOR) + case Prepare_FILWIDTH: HAL_START_ADC(FILWIDTH_PIN); break; + case Measure_FILWIDTH: + if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // Redo this state + else filwidth.accumulate(HAL_READ_ADC()); + break; + #endif + + #if ENABLED(POWER_MONITOR_CURRENT) + case Prepare_POWER_MONITOR_CURRENT: + HAL_START_ADC(POWER_MONITOR_CURRENT_PIN); + break; + case Measure_POWER_MONITOR_CURRENT: + if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // Redo this state + else power_monitor.add_current_sample(HAL_READ_ADC()); + break; + #endif + + #if ENABLED(POWER_MONITOR_VOLTAGE) + case Prepare_POWER_MONITOR_VOLTAGE: + HAL_START_ADC(POWER_MONITOR_VOLTAGE_PIN); + break; + case Measure_POWER_MONITOR_VOLTAGE: + if (!HAL_ADC_READY()) next_sensor_state = adc_sensor_state; // Redo this state + else power_monitor.add_voltage_sample(HAL_READ_ADC()); + break; + #endif + + #if HAS_JOY_ADC_X + case PrepareJoy_X: HAL_START_ADC(JOY_X_PIN); break; + case MeasureJoy_X: ACCUMULATE_ADC(joystick.x); break; + #endif + + #if HAS_JOY_ADC_Y + case PrepareJoy_Y: HAL_START_ADC(JOY_Y_PIN); break; + case MeasureJoy_Y: ACCUMULATE_ADC(joystick.y); break; + #endif + + #if HAS_JOY_ADC_Z + case PrepareJoy_Z: HAL_START_ADC(JOY_Z_PIN); break; + case MeasureJoy_Z: ACCUMULATE_ADC(joystick.z); break; + #endif + + #if HAS_ADC_BUTTONS + #ifndef ADC_BUTTON_DEBOUNCE_DELAY + #define ADC_BUTTON_DEBOUNCE_DELAY 16 + #endif + case Prepare_ADC_KEY: HAL_START_ADC(ADC_KEYPAD_PIN); break; + case Measure_ADC_KEY: + if (!HAL_ADC_READY()) + next_sensor_state = adc_sensor_state; // redo this state + else if (ADCKey_count < ADC_BUTTON_DEBOUNCE_DELAY) { + raw_ADCKey_value = HAL_READ_ADC(); + if (raw_ADCKey_value <= 900UL * HAL_ADC_RANGE / 1024UL) { + NOMORE(current_ADCKey_raw, raw_ADCKey_value); + ADCKey_count++; + } + else { //ADC Key release + if (ADCKey_count > 0) ADCKey_count++; else ADCKey_pressed = false; + if (ADCKey_pressed) { + ADCKey_count = 0; + current_ADCKey_raw = HAL_ADC_RANGE; + } + } + } + if (ADCKey_count == ADC_BUTTON_DEBOUNCE_DELAY) ADCKey_pressed = true; + break; + #endif // HAS_ADC_BUTTONS + + case StartupDelay: break; + + } // switch(adc_sensor_state) + + // Go to the next state + adc_sensor_state = next_sensor_state; + + // + // Additional ~1KHz Tasks + // + + #if ENABLED(BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING) + babystep.task(); + #endif + + // Poll endstops state, if required + endstops.poll(); + + // Periodically call the planner timer + planner.tick(); +} + +#if HAS_TEMP_SENSOR + + #include "../gcode/gcode.h" + + static void print_heater_state(const float &c, const float &t + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , const float r + #endif + , const heater_id_t e=INDEX_NONE + ) { + char k; + switch (e) { + #if HAS_TEMP_CHAMBER + case H_CHAMBER: k = 'C'; break; + #endif + #if HAS_TEMP_PROBE + case H_PROBE: k = 'P'; break; + #endif + #if HAS_TEMP_HOTEND + default: k = 'T'; break; + #if HAS_HEATED_BED + case H_BED: k = 'B'; break; + #endif + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + case H_REDUNDANT: k = 'R'; break; + #endif + #elif HAS_HEATED_BED + default: k = 'B'; break; + #endif + } + SERIAL_CHAR(' '); + SERIAL_CHAR(k); + #if HAS_MULTI_HOTEND + if (e >= 0) SERIAL_CHAR('0' + e); + #endif + SERIAL_CHAR(':'); + SERIAL_ECHO(c); + SERIAL_ECHOPAIR(" /" , t); + #if ENABLED(SHOW_TEMP_ADC_VALUES) + SERIAL_ECHOPAIR(" (", r * RECIPROCAL(OVERSAMPLENR)); + SERIAL_CHAR(')'); + #endif + delay(2); + } + + void Temperature::print_heater_states(const uint8_t target_extruder + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + , const bool include_r/*=false*/ + #endif + ) { + #if HAS_TEMP_HOTEND + print_heater_state(degHotend(target_extruder), degTargetHotend(target_extruder) + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawHotendTemp(target_extruder) + #endif + ); + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + if (include_r) print_heater_state(redundant_temperature, degTargetHotend(target_extruder) + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , redundant_temperature_raw + #endif + , H_REDUNDANT + ); + #endif + #endif + #if HAS_HEATED_BED + print_heater_state(degBed(), degTargetBed() + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawBedTemp() + #endif + , H_BED + ); + #endif + #if HAS_TEMP_CHAMBER + print_heater_state(degChamber() + #if HAS_HEATED_CHAMBER + , degTargetChamber() + #else + , 0 + #endif + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawChamberTemp() + #endif + , H_CHAMBER + ); + #endif // HAS_TEMP_CHAMBER + #if HAS_TEMP_PROBE + print_heater_state(degProbe(), 0 + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawProbeTemp() + #endif + , H_PROBE + ); + #endif // HAS_TEMP_PROBE + #if HAS_MULTI_HOTEND + HOTEND_LOOP() print_heater_state(degHotend(e), degTargetHotend(e) + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawHotendTemp(e) + #endif + , (heater_id_t)e + ); + #endif + SERIAL_ECHOPAIR(" @:", getHeaterPower((heater_id_t)target_extruder)); + #if HAS_HEATED_BED + SERIAL_ECHOPAIR(" B@:", getHeaterPower(H_BED)); + #endif + #if HAS_HEATED_CHAMBER + SERIAL_ECHOPAIR(" C@:", getHeaterPower(H_CHAMBER)); + #endif + #if HAS_MULTI_HOTEND + HOTEND_LOOP() { + SERIAL_ECHOPAIR(" @", e); + SERIAL_CHAR(':'); + SERIAL_ECHO(getHeaterPower((heater_id_t)e)); + } + #endif + } + + #if ENABLED(AUTO_REPORT_TEMPERATURES) + + uint8_t Temperature::auto_report_temp_interval; + millis_t Temperature::next_temp_report_ms; + + void Temperature::auto_report_temperatures() { + if (auto_report_temp_interval && ELAPSED(millis(), next_temp_report_ms)) { + next_temp_report_ms = millis() + 1000UL * auto_report_temp_interval; + PORT_REDIRECT(SERIAL_BOTH); + print_heater_states(active_extruder); + SERIAL_EOL(); + } + } + + #endif // AUTO_REPORT_TEMPERATURES + + #if HAS_HOTEND && HAS_DISPLAY + void Temperature::set_heating_message(const uint8_t e) { + const bool heating = isHeatingHotend(e); + ui.status_printf_P(0, + #if HAS_MULTI_HOTEND + PSTR("E%c " S_FMT), '1' + e + #else + PSTR("E " S_FMT) + #endif + , heating ? GET_TEXT(MSG_HEATING) : GET_TEXT(MSG_COOLING) + ); + } + #endif + + #if HAS_TEMP_HOTEND + + #ifndef MIN_COOLING_SLOPE_DEG + #define MIN_COOLING_SLOPE_DEG 1.50 + #endif + #ifndef MIN_COOLING_SLOPE_TIME + #define MIN_COOLING_SLOPE_TIME 60 + #endif + + bool Temperature::wait_for_hotend(const uint8_t target_extruder, const bool no_wait_for_cooling/*=true*/ + #if G26_CLICK_CAN_CANCEL + , const bool click_to_cancel/*=false*/ + #endif + ) { + + #if ENABLED(AUTOTEMP) + REMEMBER(1, planner.autotemp_enabled, false); + #endif + + #if TEMP_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + bool first_loop = true; + // Loop until the temperature has stabilized + #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_RESIDENCY_TIME))) + #else + // Loop until the temperature is very close target + #define TEMP_CONDITIONS (wants_to_cool ? isCoolingHotend(target_extruder) : isHeatingHotend(target_extruder)) + #endif + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = degHotend(target_extruder); + printerEventLEDs.onHotendHeatingStart(); + #endif + + bool wants_to_cool = false; + float target_temp = -1.0, old_temp = 9999.0; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + wait_for_heatup = true; + do { + // Target temperature might be changed during the loop + if (target_temp != degTargetHotend(target_extruder)) { + wants_to_cool = isCoolingHotend(target_extruder); + target_temp = degTargetHotend(target_extruder); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { // Print temp & remaining time every 1s while waiting + next_temp_ms = now + 1000UL; + print_heater_states(target_extruder); + #if TEMP_RESIDENCY_TIME > 0 + SERIAL_ECHOPGM(" W:"); + if (residency_start_ms) + SERIAL_ECHO(long((SEC_TO_MS(TEMP_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_CHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + const float temp = degHotend(target_extruder); + + #if ENABLED(PRINTER_EVENT_LEDS) + // Gradually change LED strip from violet to red as nozzle heats up + if (!wants_to_cool) printerEventLEDs.onHotendHeating(start_temp, temp, target_temp); + #endif + + #if TEMP_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + 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 + (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. + residency_start_ms = now; + } + + first_loop = false; + + #endif + + // Prevent a wait-forever situation if R is misused i.e. M109 R0 + if (wants_to_cool) { + // break after MIN_COOLING_SLOPE_TIME seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG)) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME; + old_temp = temp; + } + } + + #if G26_CLICK_CAN_CANCEL + if (click_to_cancel && ui.use_click()) { + wait_for_heatup = false; + ui.quick_feedback(); + } + #endif + + } while (wait_for_heatup && TEMP_CONDITIONS); + + if (wait_for_heatup) { + wait_for_heatup = false; + #if ENABLED(DWIN_CREALITY_LCD) + HMI_flag.heat_flag = 0; + duration_t elapsed = print_job_timer.duration(); // print timer + dwin_heat_time = elapsed.value; + #else + ui.reset_status(); + #endif + TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onHeatingDone()); + return true; + } + + return false; + } + + #endif // HAS_TEMP_HOTEND + + #if HAS_HEATED_BED + + #ifndef MIN_COOLING_SLOPE_DEG_BED + #define MIN_COOLING_SLOPE_DEG_BED 1.00 + #endif + #ifndef MIN_COOLING_SLOPE_TIME_BED + #define MIN_COOLING_SLOPE_TIME_BED 60 + #endif + + bool Temperature::wait_for_bed(const bool no_wait_for_cooling/*=true*/ + #if G26_CLICK_CAN_CANCEL + , const bool click_to_cancel/*=false*/ + #endif + ) { + #if TEMP_BED_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + bool first_loop = true; + // Loop until the temperature has stabilized + #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) + #else + // Loop until the temperature is very close target + #define TEMP_BED_CONDITIONS (wants_to_cool ? isCoolingBed() : isHeatingBed()) + #endif + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + #if ENABLED(PRINTER_EVENT_LEDS) + const float start_temp = degBed(); + printerEventLEDs.onBedHeatingStart(); + #endif + + bool wants_to_cool = false; + float target_temp = -1, old_temp = 9999; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + wait_for_heatup = true; + do { + // Target temperature might be changed during the loop + if (target_temp != degTargetBed()) { + wants_to_cool = isCoolingBed(); + target_temp = degTargetBed(); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + 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_BED_RESIDENCY_TIME > 0 + SERIAL_ECHOPGM(" W:"); + if (residency_start_ms) + SERIAL_ECHO(long((SEC_TO_MS(TEMP_BED_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_CHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + const float temp = degBed(); + + #if ENABLED(PRINTER_EVENT_LEDS) + // Gradually change LED strip from blue to violet as bed heats up + if (!wants_to_cool) printerEventLEDs.onBedHeating(start_temp, temp, target_temp); + #endif + + #if TEMP_BED_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + 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 + (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. + residency_start_ms = now; + } + + #endif // TEMP_BED_RESIDENCY_TIME > 0 + + // Prevent a wait-forever situation if R is misused i.e. M190 R0 + if (wants_to_cool) { + // Break after MIN_COOLING_SLOPE_TIME_BED seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_BED)) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_BED; + old_temp = temp; + } + } + + #if G26_CLICK_CAN_CANCEL + if (click_to_cancel && ui.use_click()) { + wait_for_heatup = false; + ui.quick_feedback(); + } + #endif + + #if TEMP_BED_RESIDENCY_TIME > 0 + first_loop = false; + #endif + + } while (wait_for_heatup && TEMP_BED_CONDITIONS); + + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } + + return false; + } + + void Temperature::wait_for_bed_heating() { + if (isHeatingBed()) { + SERIAL_ECHOLNPGM("Wait for bed heating..."); + LCD_MESSAGEPGM(MSG_BED_HEATING); + wait_for_bed(); + ui.reset_status(); + } + } + + #endif // HAS_HEATED_BED + + #if HAS_TEMP_PROBE + + #ifndef MIN_DELTA_SLOPE_DEG_PROBE + #define MIN_DELTA_SLOPE_DEG_PROBE 1.0 + #endif + #ifndef MIN_DELTA_SLOPE_TIME_PROBE + #define MIN_DELTA_SLOPE_TIME_PROBE 600 + #endif + + bool Temperature::wait_for_probe(const float target_temp, bool no_wait_for_cooling/*=true*/) { + + const bool wants_to_cool = isProbeAboveTemp(target_temp); + const bool will_wait = !(wants_to_cool && no_wait_for_cooling); + if (will_wait) + SERIAL_ECHOLNPAIR("Waiting for probe to ", (wants_to_cool ? PSTR("cool down") : PSTR("heat up")), " to ", target_temp, " degrees."); + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + float old_temp = 9999; + millis_t next_temp_ms = 0, next_delta_check_ms = 0; + wait_for_heatup = true; + while (will_wait && wait_for_heatup) { + + // Print Temp Reading every 10 seconds while heating up. + millis_t now = millis(); + if (!next_temp_ms || ELAPSED(now, next_temp_ms)) { + next_temp_ms = now + 10000UL; + print_heater_states(active_extruder); + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + // Break after MIN_DELTA_SLOPE_TIME_PROBE seconds if the temperature + // did not drop at least MIN_DELTA_SLOPE_DEG_PROBE. This avoids waiting + // forever as the probe is not actively heated. + if (!next_delta_check_ms || ELAPSED(now, next_delta_check_ms)) { + const float temp = degProbe(), + delta_temp = old_temp > temp ? old_temp - temp : temp - old_temp; + if (delta_temp < float(MIN_DELTA_SLOPE_DEG_PROBE)) { + SERIAL_ECHOLNPGM("Timed out waiting for probe temperature."); + break; + } + next_delta_check_ms = now + 1000UL * MIN_DELTA_SLOPE_TIME_PROBE; + old_temp = temp; + } + + // Loop until the temperature is very close target + if (!(wants_to_cool ? isProbeAboveTemp(target_temp) : isProbeBelowTemp(target_temp))) { + SERIAL_ECHOLN(wants_to_cool ? PSTR("Cooldown") : PSTR("Heatup")); + SERIAL_ECHOLNPGM(" complete, target probe temperature reached."); + break; + } + } + + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } + else if (will_wait) + SERIAL_ECHOLNPGM("Canceled wait for probe temperature."); + + return false; + } + + #endif // HAS_TEMP_PROBE + + #if HAS_HEATED_CHAMBER + + #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER + #define MIN_COOLING_SLOPE_DEG_CHAMBER 1.50 + #endif + #ifndef MIN_COOLING_SLOPE_TIME_CHAMBER + #define MIN_COOLING_SLOPE_TIME_CHAMBER 120 + #endif + + bool Temperature::wait_for_chamber(const bool no_wait_for_cooling/*=true*/) { + #if TEMP_CHAMBER_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + bool first_loop = true; + // Loop until the temperature has stabilized + #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) + #else + // Loop until the temperature is very close target + #define TEMP_CHAMBER_CONDITIONS (wants_to_cool ? isCoolingChamber() : isHeatingChamber()) + #endif + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + bool wants_to_cool = false; + float target_temp = -1, old_temp = 9999; + millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + wait_for_heatup = true; + do { + // Target temperature might be changed during the loop + if (target_temp != degTargetChamber()) { + wants_to_cool = isCoolingChamber(); + target_temp = degTargetChamber(); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + 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 + SERIAL_ECHOPGM(" W:"); + if (residency_start_ms) + SERIAL_ECHO(long((SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_CHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + const float temp = degChamber(); + + #if TEMP_CHAMBER_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + 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 + (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. + residency_start_ms = now; + } + + first_loop = false; + #endif // TEMP_CHAMBER_RESIDENCY_TIME > 0 + + // Prevent a wait-forever situation if R is misused i.e. M191 R0 + if (wants_to_cool) { + // Break after MIN_COOLING_SLOPE_TIME_CHAMBER seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER + if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_CHAMBER)) break; + next_cool_check_ms = now + 1000UL * MIN_COOLING_SLOPE_TIME_CHAMBER; + old_temp = temp; + } + } + } while (wait_for_heatup && TEMP_CHAMBER_CONDITIONS); + + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } + + return false; + } + + #endif // HAS_HEATED_CHAMBER + +#endif // HAS_TEMP_SENSOR diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h new file mode 100644 index 00000000..57b0fecb --- /dev/null +++ b/Marlin/src/module/temperature.h @@ -0,0 +1,882 @@ +/** + * 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 + +/** + * temperature.h - temperature controller + */ + +#include "thermistor/thermistors.h" + +#include "../inc/MarlinConfig.h" + +#if ENABLED(AUTO_POWER_CONTROL) + #include "../feature/power.h" +#endif + +#ifndef SOFT_PWM_SCALE + #define SOFT_PWM_SCALE 0 +#endif + +#define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) +#define E_NAME TERN_(HAS_MULTI_HOTEND, e) + +// Heater identifiers. Positive values are hotends. Negative values are other heaters. +typedef enum : int8_t { + INDEX_NONE = -5, + H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, + H_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7 +} heater_id_t; + +// PID storage +typedef struct { float Kp, Ki, Kd; } PID_t; +typedef struct { float Kp, Ki, Kd, Kc; } PIDC_t; +typedef struct { float Kp, Ki, Kd, Kf; } PIDF_t; +typedef struct { float Kp, Ki, Kd, Kc, Kf; } PIDCF_t; + +typedef + #if BOTH(PID_EXTRUSION_SCALING, PID_FAN_SCALING) + PIDCF_t + #elif ENABLED(PID_EXTRUSION_SCALING) + PIDC_t + #elif ENABLED(PID_FAN_SCALING) + PIDF_t + #else + PID_t + #endif +hotend_pid_t; + +#if ENABLED(PID_EXTRUSION_SCALING) + 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_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_Kc(H) 1 + #define _PID_Kf(H) 0 +#endif + +/** + * States for ADC reading in the ISR + */ +enum ADCSensorState : char { + StartSampling, + #if HAS_TEMP_ADC_0 + PrepareTemp_0, MeasureTemp_0, + #endif + #if HAS_HEATED_BED + PrepareTemp_BED, MeasureTemp_BED, + #endif + #if HAS_TEMP_CHAMBER + PrepareTemp_CHAMBER, MeasureTemp_CHAMBER, + #endif + #if HAS_TEMP_PROBE + PrepareTemp_PROBE, MeasureTemp_PROBE, + #endif + #if HAS_TEMP_ADC_1 + PrepareTemp_1, MeasureTemp_1, + #endif + #if HAS_TEMP_ADC_2 + PrepareTemp_2, MeasureTemp_2, + #endif + #if HAS_TEMP_ADC_3 + PrepareTemp_3, MeasureTemp_3, + #endif + #if HAS_TEMP_ADC_4 + PrepareTemp_4, MeasureTemp_4, + #endif + #if HAS_TEMP_ADC_5 + PrepareTemp_5, MeasureTemp_5, + #endif + #if HAS_TEMP_ADC_6 + PrepareTemp_6, MeasureTemp_6, + #endif + #if HAS_TEMP_ADC_7 + PrepareTemp_7, MeasureTemp_7, + #endif + #if HAS_JOY_ADC_X + PrepareJoy_X, MeasureJoy_X, + #endif + #if HAS_JOY_ADC_Y + PrepareJoy_Y, MeasureJoy_Y, + #endif + #if HAS_JOY_ADC_Z + PrepareJoy_Z, MeasureJoy_Z, + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) + Prepare_FILWIDTH, Measure_FILWIDTH, + #endif + #if ENABLED(POWER_MONITOR_CURRENT) + Prepare_POWER_MONITOR_CURRENT, + Measure_POWER_MONITOR_CURRENT, + #endif + #if ENABLED(POWER_MONITOR_VOLTAGE) + Prepare_POWER_MONITOR_VOLTAGE, + Measure_POWER_MONITOR_VOLTAGE, + #endif + #if HAS_ADC_BUTTONS + Prepare_ADC_KEY, Measure_ADC_KEY, + #endif + SensorsReady, // Temperatures ready. Delay the next round of readings to let ADC pins settle. + StartupDelay // Startup, delay initial temp reading a tiny bit so the hardware can settle +}; + +// Minimum number of Temperature::ISR loops between sensor readings. +// Multiplied by 16 (OVERSAMPLENR) to obtain the total time to +// get all oversampled sensor readings +#define MIN_ADC_ISR_LOOPS 10 + +#define ACTUAL_ADC_SAMPLES _MAX(int(MIN_ADC_ISR_LOOPS), int(SensorsReady)) + +#if HAS_PID_HEATING + #define PID_K2 (1-float(PID_K1)) + #define PID_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / TEMP_TIMER_FREQUENCY) + + // Apply the scale factors to the PID values + #define scalePID_i(i) ( float(i) * PID_dT ) + #define unscalePID_i(i) ( float(i) / PID_dT ) + #define scalePID_d(d) ( float(d) / PID_dT ) + #define unscalePID_d(d) ( float(d) * PID_dT ) +#endif + +#if BOTH(HAS_LCD_MENU, G26_MESH_VALIDATION) + #define G26_CLICK_CAN_CANCEL 1 +#endif + +// A temperature sensor +typedef struct TempInfo { + uint16_t acc; + int16_t raw; + float celsius; + inline void reset() { acc = 0; } + inline void sample(const uint16_t s) { acc += s; } + inline void update() { raw = acc; } +} temp_info_t; + +// A PWM heater with temperature sensor +typedef struct HeaterInfo : public TempInfo { + int16_t target; + uint8_t soft_pwm_amount; +} heater_info_t; + +// A heater with PID stabilization +template +struct PIDHeaterInfo : public HeaterInfo { + T pid; // Initialized by settings.load() +}; + +#if ENABLED(PIDTEMP) + typedef struct PIDHeaterInfo hotend_info_t; +#else + typedef heater_info_t hotend_info_t; +#endif +#if HAS_HEATED_BED + #if ENABLED(PIDTEMPBED) + typedef struct PIDHeaterInfo bed_info_t; + #else + typedef heater_info_t bed_info_t; + #endif +#endif +#if HAS_TEMP_PROBE + typedef temp_info_t probe_info_t; +#endif +#if HAS_HEATED_CHAMBER + typedef heater_info_t chamber_info_t; +#elif HAS_TEMP_CHAMBER + typedef temp_info_t chamber_info_t; +#endif + +// Heater watch handling +template +struct HeaterWatch { + uint16_t target; + millis_t next_ms; + inline bool elapsed(const millis_t &ms) { return next_ms && ELAPSED(ms, next_ms); } + inline bool elapsed() { return elapsed(millis()); } + + inline void restart(const int16_t curr, const int16_t tgt) { + if (tgt) { + const int16_t newtarget = curr + INCREASE; + if (newtarget < tgt - HYSTERESIS - 1) { + target = newtarget; + next_ms = millis() + SEC_TO_MS(PERIOD); + return; + } + } + next_ms = 0; + } +}; + +#if WATCH_HOTENDS + typedef struct HeaterWatch hotend_watch_t; +#endif +#if WATCH_BED + typedef struct HeaterWatch bed_watch_t; +#endif +#if WATCH_CHAMBER + typedef struct HeaterWatch chamber_watch_t; +#endif + +// Temperature sensor read value ranges +typedef struct { int16_t raw_min, raw_max; } raw_range_t; +typedef struct { int16_t mintemp, maxtemp; } celsius_range_t; +typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; + +#define THERMISTOR_ABS_ZERO_C -273.15f // bbbbrrrrr cold ! +#define THERMISTOR_RESISTANCE_NOMINAL_C 25.0f // mmmmm comfortable + +#if HAS_USER_THERMISTORS + + enum CustomThermistorIndex : uint8_t { + #if ENABLED(HEATER_0_USER_THERMISTOR) + CTI_HOTEND_0, + #endif + #if ENABLED(HEATER_1_USER_THERMISTOR) + CTI_HOTEND_1, + #endif + #if ENABLED(HEATER_2_USER_THERMISTOR) + CTI_HOTEND_2, + #endif + #if ENABLED(HEATER_3_USER_THERMISTOR) + CTI_HOTEND_3, + #endif + #if ENABLED(HEATER_4_USER_THERMISTOR) + CTI_HOTEND_4, + #endif + #if ENABLED(HEATER_5_USER_THERMISTOR) + CTI_HOTEND_5, + #endif + #if ENABLED(HEATER_BED_USER_THERMISTOR) + CTI_BED, + #endif + #if ENABLED(HEATER_PROBE_USER_THERMISTOR) + CTI_PROBE, + #endif + #if ENABLED(HEATER_CHAMBER_USER_THERMISTOR) + CTI_CHAMBER, + #endif + USER_THERMISTORS + }; + + // User-defined thermistor + typedef struct { + bool pre_calc; // true if pre-calculations update needed + float sh_c_coeff, // Steinhart-Hart C coefficient .. defaults to '0.0' + sh_alpha, + series_res, + res_25, res_25_recip, + res_25_log, + beta, beta_recip; + } user_thermistor_t; + +#endif + +class Temperature { + + public: + + #if HAS_HOTEND + #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) + static hotend_info_t temp_hotend[HOTEND_TEMPS]; + 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); + TERN_(HAS_TEMP_CHAMBER, static chamber_info_t temp_chamber); + + TERN_(AUTO_POWER_E_FANS, static uint8_t autofan_speed[HOTENDS]); + TERN_(AUTO_POWER_CHAMBER_FAN, static uint8_t chamberfan_speed); + + #if ENABLED(FAN_SOFT_PWM) + static uint8_t soft_pwm_amount_fan[FAN_COUNT], + soft_pwm_count_fan[FAN_COUNT]; + #endif + + #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 - (TEMP_WINDOW); } + FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { + return tooCold(degHotend(HOTEND_INDEX)); + } + FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t E_NAME) { + return tooCold(degTargetHotend(HOTEND_INDEX)); + } + #else + FORCE_INLINE static bool tooColdToExtrude(const uint8_t) { return false; } + FORCE_INLINE static bool targetTooColdToExtrude(const uint8_t) { return false; } + #endif + + FORCE_INLINE static bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } + FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } + + #if HEATER_IDLE_HANDLER + + // Heater idle handling. Marlin creates one per hotend and one for the heated bed. + typedef struct { + millis_t timeout_ms; + bool timed_out; + inline void update(const millis_t &ms) { if (!timed_out && timeout_ms && ELAPSED(ms, timeout_ms)) timed_out = true; } + inline void start(const millis_t &ms) { timeout_ms = millis() + ms; timed_out = false; } + inline void reset() { timeout_ms = 0; timed_out = false; } + inline void expire() { start(0); } + } heater_idle_t; + + // Indices and size for the heater_idle array + #define _ENUM_FOR_E(N) IDLE_INDEX_E##N, + enum IdleIndex : uint8_t { + REPEAT(HOTENDS, _ENUM_FOR_E) + #if ENABLED(HAS_HEATED_BED) + IDLE_INDEX_BED, + #endif + NR_HEATER_IDLE + }; + #undef _ENUM_FOR_E + + // Convert the given heater_id_t to idle array index + static inline IdleIndex idle_index_for_id(const int8_t heater_id) { + #if HAS_HEATED_BED + if (heater_id == H_BED) return IDLE_INDEX_BED; + #endif + return (IdleIndex)_MAX(heater_id, 0); + } + + static heater_idle_t heater_idle[NR_HEATER_IDLE]; + + #endif + + private: + + TERN_(EARLY_WATCHDOG, static bool inited); // If temperature controller is running + + static volatile bool raw_temps_ready; + + TERN_(WATCH_HOTENDS, static hotend_watch_t watch_hotend[HOTENDS]); + + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + static uint16_t redundant_temperature_raw; + static float redundant_temperature; + #endif + + #if ENABLED(PID_EXTRUSION_SCALING) + static int32_t last_e_position, lpq[LPQ_MAX_LEN]; + static lpq_ptr_t lpq_ptr; + #endif + + TERN_(HAS_HOTEND, static temp_range_t temp_range[HOTENDS]); + + #if HAS_HEATED_BED + TERN_(WATCH_BED, static bed_watch_t watch_bed); + TERN(PIDTEMPBED,,static millis_t next_bed_check_ms); + #ifdef BED_MINTEMP + static int16_t mintemp_raw_BED; + #endif + #ifdef BED_MAXTEMP + static int16_t maxtemp_raw_BED; + #endif + #endif + + #if HAS_HEATED_CHAMBER + TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); + static millis_t next_chamber_check_ms; + #ifdef CHAMBER_MINTEMP + static int16_t mintemp_raw_CHAMBER; + #endif + #ifdef CHAMBER_MAXTEMP + static int16_t maxtemp_raw_CHAMBER; + #endif + #endif + + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED + static uint8_t consecutive_low_temperature_error[HOTENDS]; + #endif + + #ifdef MILLISECONDS_PREHEAT_TIME + static millis_t preheat_end_time[HOTENDS]; + #endif + + TERN_(HAS_AUTO_FAN, static millis_t next_auto_fan_check_ms); + + TERN_(PROBING_HEATERS_OFF, static bool paused); + + public: + #if HAS_ADC_BUTTONS + static uint32_t current_ADCKey_raw; + static uint16_t ADCKey_count; + #endif + + TERN_(PID_EXTRUSION_SCALING, static int16_t lpq_len); + + /** + * Instance Methods + */ + + void init(); + + /** + * Static (class) methods + */ + + #if HAS_USER_THERMISTORS + static user_thermistor_t user_thermistor[USER_THERMISTORS]; + static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); + static void reset_user_thermistors(); + static float user_thermistor_to_deg_c(const uint8_t t_index, const int raw); + static bool set_pull_up_res(int8_t t_index, float value) { + //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; + if (!WITHIN(value, 1, 1000000)) return false; + user_thermistor[t_index].series_res = value; + return true; + } + static bool set_res25(int8_t t_index, float value) { + if (!WITHIN(value, 1, 10000000)) return false; + user_thermistor[t_index].res_25 = value; + user_thermistor[t_index].pre_calc = true; + return true; + } + static bool set_beta(int8_t t_index, float value) { + if (!WITHIN(value, 1, 1000000)) return false; + user_thermistor[t_index].beta = value; + user_thermistor[t_index].pre_calc = true; + return true; + } + static bool set_sh_coeff(int8_t t_index, float value) { + if (!WITHIN(value, -0.01f, 0.01f)) return false; + user_thermistor[t_index].sh_c_coeff = value; + user_thermistor[t_index].pre_calc = true; + return true; + } + #endif + + #if HAS_HOTEND + static float analog_to_celsius_hotend(const int raw, const uint8_t e); + #endif + + #if HAS_HEATED_BED + static float analog_to_celsius_bed(const int raw); + #endif + #if HAS_TEMP_PROBE + static float analog_to_celsius_probe(const int raw); + #endif + #if HAS_TEMP_CHAMBER + static float analog_to_celsius_chamber(const int raw); + #endif + + #if HAS_FAN + + static uint8_t fan_speed[FAN_COUNT]; + #define FANS_LOOP(I) LOOP_L_N(I, FAN_COUNT) + + static void set_fan_speed(const uint8_t target, const uint16_t speed); + + #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; + static uint8_t saved_fan_speed[FAN_COUNT]; + #endif + + static constexpr inline uint8_t fanPercent(const uint8_t speed) { return ui8_to_percent(speed); } + + TERN_(ADAPTIVE_FAN_SLOWING, static uint8_t fan_speed_scaler[FAN_COUNT]); + + static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { + UNUSED(target); // Potentially unused! + return (fs * uint16_t(TERN(ADAPTIVE_FAN_SLOWING, fan_speed_scaler[target], 128))) >> 7; + } + + static inline uint8_t scaledFanSpeed(const uint8_t target) { + return scaledFanSpeed(target, fan_speed[target]); + } + + #if ENABLED(EXTRA_FAN_SPEED) + static uint8_t old_fan_speed[FAN_COUNT], new_fan_speed[FAN_COUNT]; + static void set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp); + #endif + + #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + void set_fans_paused(const bool p); + #endif + + #endif // HAS_FAN + + static inline void zero_fan_speeds() { + #if HAS_FAN + FANS_LOOP(i) set_fan_speed(i, 0); + #endif + } + + /** + * Called from the Temperature ISR + */ + static void readings_ready(); + static void tick(); + + /** + * Call periodically to manage heaters + */ + static void manage_heater() _O2; // Added _O2 to work around a compiler error + + /** + * Preheating hotends + */ + #ifdef MILLISECONDS_PREHEAT_TIME + static bool is_preheating(const uint8_t E_NAME) { + return preheat_end_time[HOTEND_INDEX] && PENDING(millis(), preheat_end_time[HOTEND_INDEX]); + } + static void start_preheat_time(const uint8_t E_NAME) { + preheat_end_time[HOTEND_INDEX] = millis() + MILLISECONDS_PREHEAT_TIME; + } + static void reset_preheat_time(const uint8_t E_NAME) { + preheat_end_time[HOTEND_INDEX] = 0; + } + #else + #define is_preheating(n) (false) + #endif + + //high level conversion routines, for use outside of temperature.cpp + //inline so that there is no performance decrease. + //deg=degreeCelsius + + FORCE_INLINE static float degHotend(const uint8_t E_NAME) { + return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].celsius); + } + + #if ENABLED(SHOW_TEMP_ADC_VALUES) + FORCE_INLINE static int16_t rawHotendTemp(const uint8_t E_NAME) { + return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].raw); + } + #endif + + FORCE_INLINE static int16_t degTargetHotend(const uint8_t E_NAME) { + return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target); + } + + #if WATCH_HOTENDS + static void start_watching_hotend(const uint8_t e=0); + #else + static inline void start_watching_hotend(const uint8_t=0) {} + #endif + + #if HAS_HOTEND + + static void setTargetHotend(const int16_t celsius, const uint8_t E_NAME) { + const uint8_t ee = HOTEND_INDEX; + #ifdef MILLISECONDS_PREHEAT_TIME + if (celsius == 0) + reset_preheat_time(ee); + else if (temp_hotend[ee].target == 0) + start_preheat_time(ee); + #endif + 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); + } + + FORCE_INLINE static bool isHeatingHotend(const uint8_t E_NAME) { + return temp_hotend[HOTEND_INDEX].target > temp_hotend[HOTEND_INDEX].celsius; + } + + FORCE_INLINE static bool isCoolingHotend(const uint8_t E_NAME) { + return temp_hotend[HOTEND_INDEX].target < temp_hotend[HOTEND_INDEX].celsius; + } + + #if HAS_TEMP_HOTEND + static bool wait_for_hotend(const uint8_t target_extruder, const bool no_wait_for_cooling=true + #if G26_CLICK_CAN_CANCEL + , const bool click_to_cancel=false + #endif + ); + #endif + + FORCE_INLINE static bool still_heating(const uint8_t e) { + return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; + } + + FORCE_INLINE static bool degHotendNear(const uint8_t e, const float &temp) { + return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); + } + + #endif // HAS_HOTEND + + #if HAS_HEATED_BED + + #if ENABLED(SHOW_TEMP_ADC_VALUES) + FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } + #endif + FORCE_INLINE static float degBed() { return temp_bed.celsius; } + FORCE_INLINE static int16_t degTargetBed() { return temp_bed.target; } + FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } + FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } + + #if WATCH_BED + static void start_watching_bed(); + #else + static inline void start_watching_bed() {} + #endif + + static void setTargetBed(const int16_t celsius) { + TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); + temp_bed.target = + #ifdef BED_MAX_TARGET + _MIN(celsius, BED_MAX_TARGET) + #else + celsius + #endif + ; + start_watching_bed(); + } + + static bool wait_for_bed(const bool no_wait_for_cooling=true + #if G26_CLICK_CAN_CANCEL + , const bool click_to_cancel=false + #endif + ); + + static void wait_for_bed_heating(); + + FORCE_INLINE static bool degBedNear(const float &temp) { + return ABS(degBed() - temp) < (TEMP_BED_HYSTERESIS); + } + + #endif // HAS_HEATED_BED + + #if HAS_TEMP_PROBE + #if ENABLED(SHOW_TEMP_ADC_VALUES) + FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } + #endif + FORCE_INLINE static float degProbe() { return temp_probe.celsius; } + FORCE_INLINE static bool isProbeBelowTemp(const float target_temp) { return temp_probe.celsius < target_temp; } + FORCE_INLINE static bool isProbeAboveTemp(const float target_temp) { return temp_probe.celsius > target_temp; } + static bool wait_for_probe(const float target_temp, bool no_wait_for_cooling=true); + #endif + + #if WATCH_PROBE + static void start_watching_probe(); + #else + static inline void start_watching_probe() {} + #endif + + #if HAS_TEMP_CHAMBER + #if ENABLED(SHOW_TEMP_ADC_VALUES) + FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } + #endif + FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } + #if HAS_HEATED_CHAMBER + FORCE_INLINE static int16_t degTargetChamber() { return temp_chamber.target; } + FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } + FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } + + static bool wait_for_chamber(const bool no_wait_for_cooling=true); + #endif + #endif // HAS_TEMP_CHAMBER + + #if WATCH_CHAMBER + static void start_watching_chamber(); + #else + static inline void start_watching_chamber() {} + #endif + + #if HAS_HEATED_CHAMBER + static void setTargetChamber(const int16_t celsius) { + temp_chamber.target = + #ifdef CHAMBER_MAXTEMP + _MIN(celsius, CHAMBER_MAXTEMP - 10) + #else + celsius + #endif + ; + start_watching_chamber(); + } + #endif // HAS_HEATED_CHAMBER + + /** + * The software PWM power for a heater + */ + static int16_t getHeaterPower(const heater_id_t heater_id); + + /** + * Switch off all heaters, set all target temperatures to 0 + */ + static void disable_all_heaters(); + + #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + /** + * Methods to check if heaters are enabled, indicating an active job + */ + static bool over_autostart_threshold(); + static void check_timer_autostart(const bool can_start, const bool can_stop); + #endif + + /** + * Perform auto-tuning for hotend or bed in response to M303 + */ + #if HAS_PID_HEATING + static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); + + #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) + static bool adaptive_fan_slowing; + #elif ENABLED(ADAPTIVE_FAN_SLOWING) + static constexpr bool adaptive_fan_slowing = true; + #endif + + /** + * Update the temp manager when PID values change + */ + #if ENABLED(PIDTEMP) + FORCE_INLINE static void updatePID() { + TERN_(PID_EXTRUSION_SCALING, last_e_position = 0); + } + #endif + + #endif + + #if ENABLED(PROBING_HEATERS_OFF) + static void pause(const bool p); + FORCE_INLINE static bool is_paused() { return paused; } + #endif + + #if HEATER_IDLE_HANDLER + + static void reset_hotend_idle_timer(const uint8_t E_NAME) { + heater_idle[HOTEND_INDEX].reset(); + start_watching_hotend(HOTEND_INDEX); + } + + #if HAS_HEATED_BED + static void reset_bed_idle_timer() { + heater_idle[IDLE_INDEX_BED].reset(); + start_watching_bed(); + } + #endif + + #endif // HEATER_IDLE_HANDLER + + #if HAS_TEMP_SENSOR + static void print_heater_states(const uint8_t target_extruder + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + , const bool include_r=false + #endif + ); + #if ENABLED(AUTO_REPORT_TEMPERATURES) + static uint8_t auto_report_temp_interval; + static millis_t next_temp_report_ms; + static void auto_report_temperatures(); + static inline void set_auto_report_interval(uint8_t v) { + NOMORE(v, 60); + auto_report_temp_interval = v; + next_temp_report_ms = millis() + 1000UL * v; + } + #endif + #endif + + TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); + + #if HAS_LCD_MENU && HAS_TEMPERATURE + static void lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb); + #endif + + private: + static void update_raw_temperatures(); + static void updateTemperaturesFromRawValues(); + + #define HAS_MAX6675 EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) + #if HAS_MAX6675 + #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 + #define READ_MAX6675(N) read_max6675() + #endif + static int read_max6675( + #if COUNT_6675 > 1 + const uint8_t hindex=0 + #endif + ); + #endif + + static void checkExtruderAutoFans(); + + static float get_pid_output_hotend(const uint8_t e); + + TERN_(PIDTEMPBED, static float get_pid_output_bed()); + + TERN_(HAS_HEATED_CHAMBER, static float get_pid_output_chamber()); + + static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); + static void min_temp_error(const heater_id_t e); + static void max_temp_error(const heater_id_t e); + + #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED) + + #if HAS_THERMAL_PROTECTION + + // Indices and size for the tr_state_machine array. One for each protected heater. + #define _ENUM_FOR_E(N) RUNAWAY_IND_E##N, + enum RunawayIndex : uint8_t { + #if ENABLED(THERMAL_PROTECTION_HOTENDS) + REPEAT(HOTENDS, _ENUM_FOR_E) + #endif + #if ENABLED(HAS_THERMALLY_PROTECTED_BED) + RUNAWAY_IND_BED, + #endif + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + RUNAWAY_IND_CHAMBER, + #endif + NR_HEATER_RUNAWAY + }; + #undef _ENUM_FOR_E + + // Convert the given heater_id_t to runaway state array index + static inline RunawayIndex runaway_index_for_id(const int8_t heater_id) { + #if HAS_THERMALLY_PROTECTED_CHAMBER + if (heater_id == H_CHAMBER) return RUNAWAY_IND_CHAMBER; + #endif + #if HAS_THERMALLY_PROTECTED_BED + if (heater_id == H_BED) return RUNAWAY_IND_BED; + #endif + return (RunawayIndex)_MAX(heater_id, 0); + } + + enum TRState : char { TRInactive, TRFirstHeating, TRStable, TRRunaway }; + + typedef struct { + millis_t timer = 0; + TRState state = TRInactive; + float running_temp; + void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); + } tr_state_machine_t; + + static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; + + #endif // HAS_THERMAL_PROTECTION +}; + +extern Temperature thermalManager; diff --git a/Marlin/src/module/thermistor/thermistor_1.h b/Marlin/src/module/thermistor/thermistor_1.h new file mode 100644 index 00000000..fad79083 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_1.h @@ -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 . + * + */ +#pragma once + +// R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor +const temp_entry_t temptable_1[] PROGMEM = { + { OV( 23), 300 }, + { OV( 25), 295 }, + { OV( 27), 290 }, + { OV( 28), 285 }, + { OV( 31), 280 }, + { OV( 33), 275 }, + { OV( 35), 270 }, + { OV( 38), 265 }, + { OV( 41), 260 }, + { OV( 44), 255 }, + { OV( 48), 250 }, + { OV( 52), 245 }, + { OV( 56), 240 }, + { OV( 61), 235 }, + { OV( 66), 230 }, + { OV( 71), 225 }, + { OV( 78), 220 }, + { OV( 84), 215 }, + { OV( 92), 210 }, + { OV( 100), 205 }, + { OV( 109), 200 }, + { OV( 120), 195 }, + { OV( 131), 190 }, + { OV( 143), 185 }, + { OV( 156), 180 }, + { OV( 171), 175 }, + { OV( 187), 170 }, + { OV( 205), 165 }, + { OV( 224), 160 }, + { OV( 245), 155 }, + { OV( 268), 150 }, + { OV( 293), 145 }, + { OV( 320), 140 }, + { OV( 348), 135 }, + { OV( 379), 130 }, + { OV( 411), 125 }, + { OV( 445), 120 }, + { OV( 480), 115 }, + { OV( 516), 110 }, + { OV( 553), 105 }, + { OV( 591), 100 }, + { OV( 628), 95 }, + { OV( 665), 90 }, + { OV( 702), 85 }, + { OV( 737), 80 }, + { OV( 770), 75 }, + { OV( 801), 70 }, + { OV( 830), 65 }, + { OV( 857), 60 }, + { OV( 881), 55 }, + { OV( 903), 50 }, + { OV( 922), 45 }, + { OV( 939), 40 }, + { OV( 954), 35 }, + { OV( 966), 30 }, + { OV( 977), 25 }, + { OV( 985), 20 }, + { OV( 993), 15 }, + { OV( 999), 10 }, + { OV(1004), 5 }, + { OV(1008), 0 }, + { OV(1012), -5 }, + { OV(1016), -10 }, + { OV(1020), -15 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_10.h b/Marlin/src/module/thermistor/thermistor_10.h new file mode 100644 index 00000000..c24ad40b --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_10.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 + +// R25 = 100 kOhm, beta25 = 3960 K, 4.7 kOhm pull-up, RS thermistor 198-961 +const temp_entry_t temptable_10[] PROGMEM = { + { OV( 1), 929 }, + { OV( 36), 299 }, + { OV( 71), 246 }, + { OV( 106), 217 }, + { OV( 141), 198 }, + { OV( 176), 184 }, + { OV( 211), 173 }, + { OV( 246), 163 }, + { OV( 281), 154 }, + { OV( 316), 147 }, + { OV( 351), 140 }, + { OV( 386), 134 }, + { OV( 421), 128 }, + { OV( 456), 122 }, + { OV( 491), 117 }, + { OV( 526), 112 }, + { OV( 561), 107 }, + { OV( 596), 102 }, + { OV( 631), 97 }, + { OV( 666), 91 }, + { OV( 701), 86 }, + { OV( 736), 81 }, + { OV( 771), 76 }, + { OV( 806), 70 }, + { OV( 841), 63 }, + { OV( 876), 56 }, + { OV( 911), 48 }, + { OV( 946), 38 }, + { OV( 981), 23 }, + { OV(1005), 5 }, + { OV(1016), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_1010.h b/Marlin/src/module/thermistor/thermistor_1010.h new file mode 100644 index 00000000..8ab5e3b3 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_1010.h @@ -0,0 +1,41 @@ +/** + * 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 REVERSE_TEMP_SENSOR_RANGE_1010 1 + +// Pt1000 with 1k0 pullup +const temp_entry_t temptable_1010[] PROGMEM = { + PtLine( 0, 1000, 1000), + PtLine( 25, 1000, 1000), + PtLine( 50, 1000, 1000), + PtLine( 75, 1000, 1000), + PtLine(100, 1000, 1000), + PtLine(125, 1000, 1000), + PtLine(150, 1000, 1000), + PtLine(175, 1000, 1000), + PtLine(200, 1000, 1000), + PtLine(225, 1000, 1000), + PtLine(250, 1000, 1000), + PtLine(275, 1000, 1000), + PtLine(300, 1000, 1000) +}; diff --git a/Marlin/src/module/thermistor/thermistor_1047.h b/Marlin/src/module/thermistor/thermistor_1047.h new file mode 100644 index 00000000..6e1b61f9 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_1047.h @@ -0,0 +1,40 @@ +/** + * 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 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 + PtLine( 0, 1000, 4700), + PtLine( 50, 1000, 4700), + PtLine(100, 1000, 4700), + PtLine(150, 1000, 4700), + PtLine(200, 1000, 4700), + PtLine(250, 1000, 4700), + PtLine(300, 1000, 4700), + PtLine(350, 1000, 4700), + PtLine(400, 1000, 4700), + PtLine(450, 1000, 4700), + PtLine(500, 1000, 4700) +}; diff --git a/Marlin/src/module/thermistor/thermistor_11.h b/Marlin/src/module/thermistor/thermistor_11.h new file mode 100644 index 00000000..345d009a --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_11.h @@ -0,0 +1,76 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, QU-BD silicone bed QWG-104F-3950 thermistor +const temp_entry_t temptable_11[] PROGMEM = { + { OV( 1), 938 }, + { OV( 31), 314 }, + { OV( 41), 290 }, + { OV( 51), 272 }, + { OV( 61), 258 }, + { OV( 71), 247 }, + { OV( 81), 237 }, + { OV( 91), 229 }, + { OV( 101), 221 }, + { OV( 111), 215 }, + { OV( 121), 209 }, + { OV( 131), 204 }, + { OV( 141), 199 }, + { OV( 151), 195 }, + { OV( 161), 190 }, + { OV( 171), 187 }, + { OV( 181), 183 }, + { OV( 191), 179 }, + { OV( 201), 176 }, + { OV( 221), 170 }, + { OV( 241), 165 }, + { OV( 261), 160 }, + { OV( 281), 155 }, + { OV( 301), 150 }, + { OV( 331), 144 }, + { OV( 361), 139 }, + { OV( 391), 133 }, + { OV( 421), 128 }, + { OV( 451), 123 }, + { OV( 491), 117 }, + { OV( 531), 111 }, + { OV( 571), 105 }, + { OV( 611), 100 }, + { OV( 641), 95 }, + { OV( 681), 90 }, + { OV( 711), 85 }, + { OV( 751), 79 }, + { OV( 791), 72 }, + { OV( 811), 69 }, + { OV( 831), 65 }, + { OV( 871), 57 }, + { OV( 881), 55 }, + { OV( 901), 51 }, + { OV( 921), 45 }, + { OV( 941), 39 }, + { OV( 971), 28 }, + { OV( 981), 23 }, + { OV( 991), 17 }, + { OV(1001), 9 }, + { OV(1021), -27 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_110.h b/Marlin/src/module/thermistor/thermistor_110.h new file mode 100644 index 00000000..215495e2 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_110.h @@ -0,0 +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 . + * + */ +#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 + PtLine( 0, 100, 1000), + PtLine( 50, 100, 1000), + PtLine(100, 100, 1000), + PtLine(150, 100, 1000), + PtLine(200, 100, 1000), + PtLine(250, 100, 1000), + PtLine(300, 100, 1000) +}; diff --git a/Marlin/src/module/thermistor/thermistor_12.h b/Marlin/src/module/thermistor/thermistor_12.h new file mode 100644 index 00000000..d1ee23b2 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_12.h @@ -0,0 +1,56 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 4700 K, 4.7 kOhm pull-up, (personal calibration for Makibox hot bed) +const temp_entry_t temptable_12[] PROGMEM = { + { OV( 35), 180 }, // top rating 180C + { OV( 211), 140 }, + { OV( 233), 135 }, + { OV( 261), 130 }, + { OV( 290), 125 }, + { OV( 328), 120 }, + { OV( 362), 115 }, + { OV( 406), 110 }, + { OV( 446), 105 }, + { OV( 496), 100 }, + { OV( 539), 95 }, + { OV( 585), 90 }, + { OV( 629), 85 }, + { OV( 675), 80 }, + { OV( 718), 75 }, + { OV( 758), 70 }, + { OV( 793), 65 }, + { OV( 822), 60 }, + { OV( 841), 55 }, + { OV( 875), 50 }, + { OV( 899), 45 }, + { OV( 926), 40 }, + { OV( 946), 35 }, + { OV( 962), 30 }, + { OV( 977), 25 }, + { OV( 987), 20 }, + { OV( 995), 15 }, + { OV(1001), 10 }, + { OV(1010), 0 }, + { OV(1023), -40 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_13.h b/Marlin/src/module/thermistor/thermistor_13.h new file mode 100644 index 00000000..bb622240 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_13.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 + +// R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, Hisens thermistor +const temp_entry_t temptable_13[] PROGMEM = { + { OV( 20.04), 300 }, + { OV( 23.19), 290 }, + { OV( 26.71), 280 }, + { OV( 31.23), 270 }, + { OV( 36.52), 260 }, + { OV( 42.75), 250 }, + { OV( 50.68), 240 }, + { OV( 60.22), 230 }, + { OV( 72.03), 220 }, + { OV( 86.84), 210 }, + { OV(102.79), 200 }, + { OV(124.46), 190 }, + { OV(151.02), 180 }, + { OV(182.86), 170 }, + { OV(220.72), 160 }, + { OV(316.96), 140 }, + { OV(447.17), 120 }, + { OV(590.61), 100 }, + { OV(737.31), 80 }, + { OV(857.77), 60 }, + { OV(939.52), 40 }, + { OV(986.03), 20 }, + { OV(1008.7), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_147.h b/Marlin/src/module/thermistor/thermistor_147.h new file mode 100644 index 00000000..6d846ad5 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_147.h @@ -0,0 +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 . + * + */ +#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 + PtLine( 0, 100, 4700), + PtLine( 50, 100, 4700), + PtLine(100, 100, 4700), + PtLine(150, 100, 4700), + PtLine(200, 100, 4700), + PtLine(250, 100, 4700), + PtLine(300, 100, 4700) +}; diff --git a/Marlin/src/module/thermistor/thermistor_15.h b/Marlin/src/module/thermistor/thermistor_15.h new file mode 100644 index 00000000..46dcce8c --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_15.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 + + // 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 temp_entry_t temptable_15[] PROGMEM = { + { OV( 31), 275 }, + { OV( 33), 270 }, + { OV( 35), 260 }, + { OV( 38), 253 }, + { OV( 41), 248 }, + { OV( 48), 239 }, + { OV( 56), 232 }, + { OV( 66), 222 }, + { OV( 78), 212 }, + { OV( 93), 206 }, + { OV( 106), 199 }, + { OV( 118), 191 }, + { OV( 130), 186 }, + { OV( 158), 176 }, + { OV( 187), 167 }, + { OV( 224), 158 }, + { OV( 270), 148 }, + { OV( 321), 137 }, + { OV( 379), 127 }, + { OV( 446), 117 }, + { OV( 518), 106 }, + { OV( 593), 96 }, + { OV( 668), 86 }, + { OV( 739), 76 }, + { OV( 767), 72 }, + { OV( 830), 62 }, + { OV( 902), 48 }, + { OV( 926), 45 }, + { OV( 955), 35 }, + { OV( 966), 30 }, + { OV( 977), 25 }, + { OV( 985), 20 }, + { OV( 993), 15 }, + { OV( 999), 10 }, + { OV(1004), 5 }, + { OV(1008), 0 }, + { OV(1012), -5 }, + { OV(1016), -10 }, + { OV(1020), -15 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_18.h b/Marlin/src/module/thermistor/thermistor_18.h new file mode 100644 index 00000000..9c2d81b3 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_18.h @@ -0,0 +1,59 @@ +/** + * 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 + +// ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 - version (measured/tested/approved) +const temp_entry_t temptable_18[] PROGMEM = { + { OV( 1), 713 }, + { OV( 17), 284 }, + { OV( 20), 275 }, + { OV( 23), 267 }, + { OV( 27), 257 }, + { OV( 31), 250 }, + { OV( 37), 240 }, + { OV( 43), 232 }, + { OV( 51), 222 }, + { OV( 61), 213 }, + { OV( 73), 204 }, + { OV( 87), 195 }, + { OV( 106), 185 }, + { OV( 128), 175 }, + { OV( 155), 166 }, + { OV( 189), 156 }, + { OV( 230), 146 }, + { OV( 278), 137 }, + { OV( 336), 127 }, + { OV( 402), 117 }, + { OV( 476), 107 }, + { OV( 554), 97 }, + { OV( 635), 87 }, + { OV( 713), 78 }, + { OV( 784), 68 }, + { OV( 846), 58 }, + { OV( 897), 49 }, + { OV( 937), 39 }, + { OV( 966), 30 }, + { OV( 986), 20 }, + { OV(1000), 10 }, + { OV(1010), 0 }, + { OV(1024),-273 } // for safety +}; diff --git a/Marlin/src/module/thermistor/thermistor_2.h b/Marlin/src/module/thermistor/thermistor_2.h new file mode 100644 index 00000000..d0e1e4f3 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_2.h @@ -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 . + * + */ +#pragma once + +// +// R25 = 200 kOhm, beta25 = 4338 K, 4.7 kOhm pull-up, ATC Semitec 204GT-2 +// 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 = { + { OV( 1), 848 }, + { OV( 30), 300 }, // top rating 300C + { OV( 34), 290 }, + { OV( 39), 280 }, + { OV( 46), 270 }, + { OV( 53), 260 }, + { OV( 63), 250 }, + { OV( 74), 240 }, + { OV( 87), 230 }, + { OV( 104), 220 }, + { OV( 124), 210 }, + { OV( 148), 200 }, + { OV( 176), 190 }, + { OV( 211), 180 }, + { OV( 252), 170 }, + { OV( 301), 160 }, + { OV( 357), 150 }, + { OV( 420), 140 }, + { OV( 489), 130 }, + { OV( 562), 120 }, + { OV( 636), 110 }, + { OV( 708), 100 }, + { OV( 775), 90 }, + { OV( 835), 80 }, + { OV( 884), 70 }, + { OV( 924), 60 }, + { OV( 955), 50 }, + { OV( 977), 40 }, + { OV( 993), 30 }, + { OV(1004), 20 }, + { OV(1012), 10 }, + { OV(1016), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_20.h b/Marlin/src/module/thermistor/thermistor_20.h new file mode 100644 index 00000000..73094f14 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_20.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 + +#define REVERSE_TEMP_SENSOR_RANGE_20 1 + +// Pt100 with INA826 amp on Ultimaker v2.0 electronics +const temp_entry_t temptable_20[] PROGMEM = { + { OV( 0), 0 }, + { OV(227), 1 }, + { OV(236), 10 }, + { OV(245), 20 }, + { OV(253), 30 }, + { OV(262), 40 }, + { OV(270), 50 }, + { OV(279), 60 }, + { OV(287), 70 }, + { OV(295), 80 }, + { OV(304), 90 }, + { OV(312), 100 }, + { OV(320), 110 }, + { OV(329), 120 }, + { OV(337), 130 }, + { OV(345), 140 }, + { OV(353), 150 }, + { OV(361), 160 }, + { OV(369), 170 }, + { OV(377), 180 }, + { OV(385), 190 }, + { OV(393), 200 }, + { OV(401), 210 }, + { OV(409), 220 }, + { OV(417), 230 }, + { OV(424), 240 }, + { OV(432), 250 }, + { OV(440), 260 }, + { OV(447), 270 }, + { OV(455), 280 }, + { OV(463), 290 }, + { OV(470), 300 }, + { OV(478), 310 }, + { OV(485), 320 }, + { OV(493), 330 }, + { OV(500), 340 }, + { OV(507), 350 }, + { OV(515), 360 }, + { OV(522), 370 }, + { OV(529), 380 }, + { OV(537), 390 }, + { OV(544), 400 }, + { OV(614), 500 }, + { OV(681), 600 }, + { OV(744), 700 }, + { OV(805), 800 }, + { OV(862), 900 }, + { OV(917), 1000 }, + { OV(968), 1100 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_201.h b/Marlin/src/module/thermistor/thermistor_201.h new file mode 100644 index 00000000..44d52806 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_201.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 + +#define REVERSE_TEMP_SENSOR_RANGE_201 1 + +// Pt100 with LMV324 amp on Overlord v1.1 electronics +const temp_entry_t temptable_201[] PROGMEM = { + { OV( 0), 0 }, + { OV( 8), 1 }, + { OV( 23), 6 }, + { OV( 41), 15 }, + { OV( 51), 20 }, + { OV( 68), 28 }, + { OV( 74), 30 }, + { OV( 88), 35 }, + { OV( 99), 40 }, + { OV( 123), 50 }, + { OV( 148), 60 }, + { OV( 173), 70 }, + { OV( 198), 80 }, + { OV( 221), 90 }, + { OV( 245), 100 }, + { OV( 269), 110 }, + { OV( 294), 120 }, + { OV( 316), 130 }, + { OV( 342), 140 }, + { OV( 364), 150 }, + { OV( 387), 160 }, + { OV( 412), 170 }, + { OV( 433), 180 }, + { OV( 456), 190 }, + { OV( 480), 200 }, + { OV( 500), 210 }, + { OV( 548), 224 }, + { OV( 572), 233 }, + { OV(1155), 490 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_202.h b/Marlin/src/module/thermistor/thermistor_202.h new file mode 100644 index 00000000..c5229607 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_202.h @@ -0,0 +1,69 @@ +// +// Unknown 200K thermistor on a Copymaster 3D hotend +// Temptable sent from dealer technologyoutlet.co.uk +// + +const temp_entry_t temptable_202[] PROGMEM = { + { OV( 1), 864 }, + { OV( 35), 300 }, + { OV( 38), 295 }, + { OV( 41), 290 }, + { OV( 44), 285 }, + { OV( 47), 280 }, + { OV( 51), 275 }, + { OV( 55), 270 }, + { OV( 60), 265 }, + { OV( 65), 260 }, + { OV( 70), 255 }, + { OV( 76), 250 }, + { OV( 83), 245 }, + { OV( 90), 240 }, + { OV( 98), 235 }, + { OV( 107), 230 }, + { OV( 116), 225 }, + { OV( 127), 220 }, + { OV( 138), 215 }, + { OV( 151), 210 }, + { OV( 164), 205 }, + { OV( 179), 200 }, + { OV( 195), 195 }, + { OV( 213), 190 }, + { OV( 232), 185 }, + { OV( 253), 180 }, + { OV( 275), 175 }, + { OV( 299), 170 }, + { OV( 325), 165 }, + { OV( 352), 160 }, + { OV( 381), 155 }, + { OV( 411), 150 }, + { OV( 443), 145 }, + { OV( 476), 140 }, + { OV( 511), 135 }, + { OV( 546), 130 }, + { OV( 581), 125 }, + { OV( 617), 120 }, + { OV( 652), 115 }, + { OV( 687), 110 }, + { OV( 720), 105 }, + { OV( 753), 100 }, + { OV( 783), 95 }, + { OV( 812), 90 }, + { OV( 839), 85 }, + { OV( 864), 80 }, + { OV( 886), 75 }, + { OV( 906), 70 }, + { OV( 924), 65 }, + { OV( 940), 60 }, + { OV( 954), 55 }, + { OV( 966), 50 }, + { OV( 976), 45 }, + { OV( 985), 40 }, + { OV( 992), 35 }, + { OV( 998), 30 }, + { OV(1003), 25 }, + { OV(1007), 20 }, + { OV(1011), 15 }, + { OV(1014), 10 }, + { OV(1016), 5 }, + { OV(1018), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_21.h b/Marlin/src/module/thermistor/thermistor_21.h new file mode 100644 index 00000000..cd867df2 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_21.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 + +#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 temp_entry_t temptable_21[] PROGMEM = { + { OV( 0), 0 }, + { OV(227), 1 }, + { OV(236), 10 }, + { OV(245), 20 }, + { OV(253), 30 }, + { OV(262), 40 }, + { OV(270), 50 }, + { OV(279), 60 }, + { OV(287), 70 }, + { OV(295), 80 }, + { OV(304), 90 }, + { OV(312), 100 }, + { OV(320), 110 }, + { OV(329), 120 }, + { OV(337), 130 }, + { OV(345), 140 }, + { OV(353), 150 }, + { OV(361), 160 }, + { OV(369), 170 }, + { OV(377), 180 }, + { OV(385), 190 }, + { OV(393), 200 }, + { OV(401), 210 }, + { OV(409), 220 }, + { OV(417), 230 }, + { OV(424), 240 }, + { OV(432), 250 }, + { OV(440), 260 }, + { OV(447), 270 }, + { OV(455), 280 }, + { OV(463), 290 }, + { OV(470), 300 }, + { OV(478), 310 }, + { OV(485), 320 }, + { OV(493), 330 }, + { OV(500), 340 }, + { OV(507), 350 }, + { OV(515), 360 }, + { OV(522), 370 }, + { OV(529), 380 }, + { OV(537), 390 }, + { OV(544), 400 }, + { OV(614), 500 } +}; + +#undef OV_SCALE +#define OV_SCALE(N) (N) diff --git a/Marlin/src/module/thermistor/thermistor_22.h b/Marlin/src/module/thermistor/thermistor_22.h new file mode 100644 index 00000000..6f4a3105 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_22.h @@ -0,0 +1,72 @@ +/** + * 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 . + * + */ + +// 100k hotend thermistor with 4.7k pull up to 3.3v and 220R to analog input as in GTM32 Pro vB +const temp_entry_t temptable_22[] PROGMEM = { + { OV( 1), 352 }, + { OV( 6), 341 }, + { OV( 11), 330 }, + { OV( 16), 319 }, + { OV( 20), 307 }, + { OV( 26), 296 }, + { OV( 31), 285 }, + { OV( 40), 274 }, + { OV( 51), 263 }, + { OV( 61), 251 }, + { OV( 72), 245 }, + { OV( 77), 240 }, + { OV( 82), 237 }, + { OV( 87), 232 }, + { OV( 91), 229 }, + { OV( 94), 227 }, + { OV( 97), 225 }, + { OV( 100), 223 }, + { OV( 104), 221 }, + { OV( 108), 219 }, + { OV( 115), 214 }, + { OV( 126), 209 }, + { OV( 137), 204 }, + { OV( 147), 200 }, + { OV( 158), 193 }, + { OV( 167), 192 }, + { OV( 177), 189 }, + { OV( 197), 163 }, + { OV( 230), 174 }, + { OV( 267), 165 }, + { OV( 310), 158 }, + { OV( 336), 151 }, + { OV( 379), 143 }, + { OV( 413), 138 }, + { OV( 480), 127 }, + { OV( 580), 110 }, + { OV( 646), 100 }, + { OV( 731), 88 }, + { OV( 768), 84 }, + { OV( 861), 69 }, + { OV( 935), 50 }, + { OV( 975), 38 }, + { OV(1001), 27 }, + { OV(1011), 22 }, + { OV(1015), 13 }, + { OV(1020), 6 }, + { OV(1023), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_23.h b/Marlin/src/module/thermistor/thermistor_23.h new file mode 100644 index 00000000..02ff9fb2 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_23.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 . + * + */ + +// 100k hotbed thermistor with 4.7k pull up to 3.3v and 220R to analog input as in GTM32 Pro vB +const temp_entry_t temptable_23[] PROGMEM = { + { OV( 1), 938 }, + { OV( 11), 423 }, + { OV( 21), 351 }, + { OV( 31), 314 }, + { OV( 41), 290 }, + { OV( 51), 272 }, + { OV( 61), 258 }, + { OV( 71), 247 }, + { OV( 81), 237 }, + { OV( 91), 229 }, + { OV( 101), 221 }, + { OV( 111), 215 }, + { OV( 121), 209 }, + { OV( 131), 204 }, + { OV( 141), 199 }, + { OV( 151), 195 }, + { OV( 161), 190 }, + { OV( 171), 187 }, + { OV( 181), 183 }, + { OV( 191), 179 }, + { OV( 201), 176 }, + { OV( 211), 173 }, + { OV( 221), 170 }, + { OV( 231), 167 }, + { OV( 241), 165 }, + { OV( 251), 162 }, + { OV( 261), 160 }, + { OV( 271), 157 }, + { OV( 281), 155 }, + { OV( 291), 153 }, + { OV( 301), 150 }, + { OV( 311), 148 }, + { OV( 321), 146 }, + { OV( 331), 144 }, + { OV( 341), 142 }, + { OV( 351), 140 }, + { OV( 361), 139 }, + { OV( 371), 137 }, + { OV( 381), 135 }, + { OV( 391), 133 }, + { OV( 401), 131 }, + { OV( 411), 130 }, + { OV( 421), 128 }, + { OV( 431), 126 }, + { OV( 441), 125 }, + { OV( 451), 123 }, + { OV( 461), 122 }, + { OV( 471), 120 }, + { OV( 481), 119 }, + { OV( 491), 117 }, + { OV( 501), 116 }, + { OV( 511), 114 }, + { OV( 521), 113 }, + { OV( 531), 111 }, + { OV( 541), 110 }, + { OV( 551), 108 }, + { OV( 561), 107 }, + { OV( 571), 105 }, + { OV( 581), 104 }, + { OV( 591), 102 }, + { OV( 601), 101 }, + { OV( 611), 100 }, + { OV( 621), 98 }, + { OV( 631), 97 }, + { OV( 641), 95 }, + { OV( 651), 94 }, + { OV( 661), 92 }, + { OV( 671), 91 }, + { OV( 681), 90 }, + { OV( 691), 88 }, + { OV( 701), 87 }, + { OV( 711), 85 }, + { OV( 721), 84 }, + { OV( 731), 82 }, + { OV( 741), 81 }, + { OV( 751), 79 }, + { OV( 761), 77 }, + { OV( 771), 76 }, + { OV( 781), 74 }, + { OV( 791), 72 }, + { OV( 801), 71 }, + { OV( 811), 69 }, + { OV( 821), 67 }, + { OV( 831), 65 }, + { OV( 841), 63 }, + { OV( 851), 62 }, + { OV( 861), 60 }, + { OV( 871), 57 }, + { OV( 881), 55 }, + { OV( 891), 53 }, + { OV( 901), 51 }, + { OV( 911), 48 }, + { OV( 921), 45 }, + { OV( 931), 42 }, + { OV( 941), 39 }, + { OV( 951), 36 }, + { OV( 961), 32 }, + { OV( 971), 28 }, + { OV( 981), 25 }, + { OV( 991), 23 }, + { OV(1001), 21 }, + { OV(1011), 19 }, + { OV(1021), 5 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_3.h b/Marlin/src/module/thermistor/thermistor_3.h new file mode 100644 index 00000000..74e00e2b --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_3.h @@ -0,0 +1,54 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 4120 K, 4.7 kOhm pull-up, mendel-parts +const temp_entry_t temptable_3[] PROGMEM = { + { OV( 1), 864 }, + { OV( 21), 300 }, + { OV( 25), 290 }, + { OV( 29), 280 }, + { OV( 33), 270 }, + { OV( 39), 260 }, + { OV( 46), 250 }, + { OV( 54), 240 }, + { OV( 64), 230 }, + { OV( 75), 220 }, + { OV( 90), 210 }, + { OV( 107), 200 }, + { OV( 128), 190 }, + { OV( 154), 180 }, + { OV( 184), 170 }, + { OV( 221), 160 }, + { OV( 265), 150 }, + { OV( 316), 140 }, + { OV( 375), 130 }, + { OV( 441), 120 }, + { OV( 513), 110 }, + { OV( 588), 100 }, + { OV( 734), 80 }, + { OV( 856), 60 }, + { OV( 938), 40 }, + { OV( 986), 20 }, + { OV(1008), 0 }, + { OV(1018), -20 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_30.h b/Marlin/src/module/thermistor/thermistor_30.h new file mode 100644 index 00000000..bc1781b1 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_30.h @@ -0,0 +1,66 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up +// Resistance 100k Ohms at 25deg. C +// Resistance Tolerance + / -1% +// B Value 3950K at 25/50 deg. C +// B Value Tolerance + / - 1% +// Kis3d Silicone Heater 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) +// Temperature setting time 10 min to determine the 12Bit ADC value on the surface. (le3tspeak) +const temp_entry_t temptable_30[] PROGMEM = { + { OV( 1), 938 }, + { OV( 298), 125 }, // 1193 - 125° + { OV( 321), 121 }, // 1285 - 121° + { OV( 348), 117 }, // 1392 - 117° + { OV( 387), 113 }, // 1550 - 113° + { OV( 411), 110 }, // 1644 - 110° + { OV( 445), 106 }, // 1780 - 106° + { OV( 480), 101 }, // 1920 - 101° + { OV( 516), 97 }, // 2064 - 97° + { OV( 553), 92 }, // 2212 - 92° + { OV( 591), 88 }, // 2364 - 88° + { OV( 628), 84 }, // 2512 - 84° + { OV( 665), 79 }, // 2660 - 79° + { OV( 702), 75 }, // 2808 - 75° + { OV( 736), 71 }, // 2945 - 71° + { OV( 770), 67 }, // 3080 - 67° + { OV( 801), 63 }, // 3204 - 63° + { OV( 830), 59 }, // 3320 - 59° + { OV( 857), 55 }, // 3428 - 55° + { OV( 881), 51 }, // 3524 - 51° + { OV( 902), 47 }, // 3611 - 47° + { OV( 922), 42 }, // 3688 - 42° + { OV( 938), 38 }, // 3754 - 38° + { OV( 952), 34 }, // 3811 - 34° + { OV( 964), 29 }, // 3857 - 29° + { OV( 975), 25 }, // 3900 - 25° + { OV( 980), 23 }, // 3920 - 23° + { OV( 991), 17 }, // 3964 - 17° + { OV(1001), 9 }, // Calculated + { OV(1004), 5 }, // Calculated + { OV(1008), 0 }, // Calculated + { OV(1012), -5 }, // Calculated + { OV(1016), -10 }, // Calculated + { OV(1020), -15 } // Calculated +}; diff --git a/Marlin/src/module/thermistor/thermistor_331.h b/Marlin/src/module/thermistor/thermistor_331.h new file mode 100644 index 00000000..ccb0f6b6 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_331.h @@ -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 . + * + */ +#pragma once + +#define OVM(V) OV((V)*(0.327/0.5)) + +// R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor +const temp_entry_t temptable_331[] PROGMEM = { + { OVM( 23), 300 }, + { OVM( 25), 295 }, + { OVM( 27), 290 }, + { OVM( 28), 285 }, + { OVM( 31), 280 }, + { OVM( 33), 275 }, + { OVM( 35), 270 }, + { OVM( 38), 265 }, + { OVM( 41), 260 }, + { OVM( 44), 255 }, + { OVM( 48), 250 }, + { OVM( 52), 245 }, + { OVM( 56), 240 }, + { OVM( 61), 235 }, + { OVM( 66), 230 }, + { OVM( 71), 225 }, + { OVM( 78), 220 }, + { OVM( 84), 215 }, + { OVM( 92), 210 }, + { OVM( 100), 205 }, + { OVM( 109), 200 }, + { OVM( 120), 195 }, + { OVM( 131), 190 }, + { OVM( 143), 185 }, + { OVM( 156), 180 }, + { OVM( 171), 175 }, + { OVM( 187), 170 }, + { OVM( 205), 165 }, + { OVM( 224), 160 }, + { OVM( 245), 155 }, + { OVM( 268), 150 }, + { OVM( 293), 145 }, + { OVM( 320), 140 }, + { OVM( 348), 135 }, + { OVM( 379), 130 }, + { OVM( 411), 125 }, + { OVM( 445), 120 }, + { OVM( 480), 115 }, + { OVM( 516), 110 }, + { OVM( 553), 105 }, + { OVM( 591), 100 }, + { OVM( 628), 95 }, + { OVM( 665), 90 }, + { OVM( 702), 85 }, + { OVM( 737), 80 }, + { OVM( 770), 75 }, + { OVM( 801), 70 }, + { OVM( 830), 65 }, + { OVM( 857), 60 }, + { OVM( 881), 55 }, + { OVM( 903), 50 }, + { OVM( 922), 45 }, + { OVM( 939), 40 }, + { OVM( 954), 35 }, + { OVM( 966), 30 }, + { OVM( 977), 25 }, + { OVM( 985), 20 }, + { OVM( 993), 15 }, + { OVM( 999), 10 }, + { OVM(1004), 5 }, + { OVM(1008), 0 }, + { OVM(1012), -5 }, + { OVM(1016), -10 }, + { OVM(1020), -15 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_332.h b/Marlin/src/module/thermistor/thermistor_332.h new file mode 100644 index 00000000..9502f1bd --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_332.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 + +#define OVM(V) OV((V)*(0.327/0.327)) + +// R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor +const temp_entry_t temptable_332[] PROGMEM = { + { OVM( 268), 150 }, + { OVM( 293), 145 }, + { OVM( 320), 141 }, + { OVM( 379), 133 }, + { OVM( 445), 122 }, + { OVM( 516), 108 }, + { OVM( 591), 98 }, + { OVM( 665), 88 }, + { OVM( 737), 79 }, + { OVM( 801), 70 }, + { OVM( 857), 55 }, + { OVM( 903), 46 }, + { OVM( 939), 39 }, + { OVM( 954), 33 }, + { OVM( 966), 27 }, + { OVM( 977), 22 }, + { OVM( 999), 15 }, + { OVM(1004), 5 }, + { OVM(1008), 0 }, + { OVM(1012), -5 }, + { OVM(1016), -10 }, + { OVM(1020), -15 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_4.h b/Marlin/src/module/thermistor/thermistor_4.h new file mode 100644 index 00000000..92d90724 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_4.h @@ -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 . + * + */ +#pragma once + +// R25 = 10 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, Generic 10k thermistor +const temp_entry_t temptable_4[] PROGMEM = { + { OV( 1), 430 }, + { OV( 54), 137 }, + { OV( 107), 107 }, + { OV( 160), 91 }, + { OV( 213), 80 }, + { OV( 266), 71 }, + { OV( 319), 64 }, + { OV( 372), 57 }, + { OV( 425), 51 }, + { OV( 478), 46 }, + { OV( 531), 41 }, + { OV( 584), 35 }, + { OV( 637), 30 }, + { OV( 690), 25 }, + { OV( 743), 20 }, + { OV( 796), 14 }, + { OV( 849), 7 }, + { OV( 902), 0 }, + { OV( 955), -11 }, + { OV(1008), -35 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_5.h b/Marlin/src/module/thermistor/thermistor_5.h new file mode 100644 index 00000000..1d5fa2fe --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_5.h @@ -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 . + * + */ +#pragma once + +// 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: 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 }, + { OV( 17), 300 }, // top rating 300C + { OV( 20), 290 }, + { OV( 23), 280 }, + { OV( 27), 270 }, + { OV( 31), 260 }, + { OV( 37), 250 }, + { OV( 43), 240 }, + { OV( 51), 230 }, + { OV( 61), 220 }, + { OV( 73), 210 }, + { OV( 87), 200 }, + { OV( 106), 190 }, + { OV( 128), 180 }, + { OV( 155), 170 }, + { OV( 189), 160 }, + { OV( 230), 150 }, + { OV( 278), 140 }, + { OV( 336), 130 }, + { OV( 402), 120 }, + { OV( 476), 110 }, + { OV( 554), 100 }, + { OV( 635), 90 }, + { OV( 713), 80 }, + { OV( 784), 70 }, + { OV( 846), 60 }, + { OV( 897), 50 }, + { OV( 937), 40 }, + { OV( 966), 30 }, + { OV( 986), 20 }, + { OV(1000), 10 }, + { OV(1010), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_501.h b/Marlin/src/module/thermistor/thermistor_501.h new file mode 100644 index 00000000..d40e341f --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_501.h @@ -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 . + * + */ +#pragma once + +// 100k Zonestar thermistor. Adjusted By Hally +const temp_entry_t temptable_501[] PROGMEM = { + { OV( 1), 713 }, + { OV( 14), 300 }, // Top rating 300C + { OV( 16), 290 }, + { OV( 19), 280 }, + { OV( 23), 270 }, + { OV( 27), 260 }, + { OV( 31), 250 }, + { OV( 37), 240 }, + { OV( 47), 230 }, + { OV( 57), 220 }, + { OV( 68), 210 }, + { OV( 84), 200 }, + { OV( 100), 190 }, + { OV( 128), 180 }, + { OV( 155), 170 }, + { OV( 189), 160 }, + { OV( 230), 150 }, + { OV( 278), 140 }, + { OV( 336), 130 }, + { OV( 402), 120 }, + { OV( 476), 110 }, + { OV( 554), 100 }, + { OV( 635), 90 }, + { OV( 713), 80 }, + { OV( 784), 70 }, + { OV( 846), 60 }, + { OV( 897), 50 }, + { OV( 937), 40 }, + { OV( 966), 30 }, + { OV( 986), 20 }, + { OV(1000), 10 }, + { OV(1010), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_502.h b/Marlin/src/module/thermistor/thermistor_502.h new file mode 100644 index 00000000..69cee243 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_502.h @@ -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 . + * + */ +#pragma once + +// 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 temp_entry_t temptable_502[] PROGMEM = { + { OV( 56.0 / 4), 300 }, + { OV( 187.0 / 4), 250 }, + { OV( 615.0 / 4), 190 }, + { OV( 690.0 / 4), 185 }, + { OV( 750.0 / 4), 180 }, + { OV( 830.0 / 4), 175 }, + { OV( 920.0 / 4), 170 }, + { OV(1010.0 / 4), 165 }, + { OV(1118.0 / 4), 160 }, + { OV(1215.0 / 4), 155 }, + { OV(1330.0 / 4), 145 }, + { OV(1460.0 / 4), 140 }, + { OV(1594.0 / 4), 135 }, + { OV(1752.0 / 4), 130 }, + { OV(1900.0 / 4), 125 }, + { OV(2040.0 / 4), 120 }, + { OV(2200.0 / 4), 115 }, + { OV(2350.0 / 4), 110 }, + { OV(2516.0 / 4), 105 }, + { OV(2671.0 / 4), 98 }, + { OV(2831.0 / 4), 92 }, + { OV(2975.0 / 4), 85 }, + { OV(3115.0 / 4), 76 }, + { OV(3251.0 / 4), 72 }, + { OV(3480.0 / 4), 62 }, + { OV(3580.0 / 4), 52 }, + { OV(3660.0 / 4), 46 }, + { OV(3740.0 / 4), 40 }, + { OV(3869.0 / 4), 30 }, + { OV(3912.0 / 4), 25 }, + { OV(3948.0 / 4), 20 }, + { OV(4077.0 / 4), -20 }, + { OV(4094.0 / 4), -55 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_51.h b/Marlin/src/module/thermistor/thermistor_51.h new file mode 100644 index 00000000..d02dd47b --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_51.h @@ -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 . + * + */ +#pragma once + +// R25 = 100 kOhm, beta25 = 4092 K, 1 kOhm pull-up, +// 100k EPCOS (WITH 1kohm RESISTOR FOR PULLUP, R9 ON SANGUINOLOLU! NOT FOR 4.7kohm PULLUP! THIS IS NOT NORMAL!) +// 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 temp_entry_t temptable_51[] PROGMEM = { + { OV( 1), 350 }, + { OV( 190), 250 }, // top rating 250C + { OV( 203), 245 }, + { OV( 217), 240 }, + { OV( 232), 235 }, + { OV( 248), 230 }, + { OV( 265), 225 }, + { OV( 283), 220 }, + { OV( 302), 215 }, + { OV( 322), 210 }, + { OV( 344), 205 }, + { OV( 366), 200 }, + { OV( 390), 195 }, + { OV( 415), 190 }, + { OV( 440), 185 }, + { OV( 467), 180 }, + { OV( 494), 175 }, + { OV( 522), 170 }, + { OV( 551), 165 }, + { OV( 580), 160 }, + { OV( 609), 155 }, + { OV( 638), 150 }, + { OV( 666), 145 }, + { OV( 695), 140 }, + { OV( 722), 135 }, + { OV( 749), 130 }, + { OV( 775), 125 }, + { OV( 800), 120 }, + { OV( 823), 115 }, + { OV( 845), 110 }, + { OV( 865), 105 }, + { OV( 884), 100 }, + { OV( 901), 95 }, + { OV( 917), 90 }, + { OV( 932), 85 }, + { OV( 944), 80 }, + { OV( 956), 75 }, + { OV( 966), 70 }, + { OV( 975), 65 }, + { OV( 982), 60 }, + { OV( 989), 55 }, + { OV( 995), 50 }, + { OV(1000), 45 }, + { OV(1004), 40 }, + { OV(1007), 35 }, + { OV(1010), 30 }, + { OV(1013), 25 }, + { OV(1015), 20 }, + { OV(1017), 15 }, + { OV(1018), 10 }, + { OV(1019), 5 }, + { OV(1020), 0 }, + { OV(1021), -5 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_512.h b/Marlin/src/module/thermistor/thermistor_512.h new file mode 100644 index 00000000..e8021e1e --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_512.h @@ -0,0 +1,87 @@ +/** + * 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 . + * + */ + +// 100k thermistor supplied with RPW-Ultra hotend, 4.7k pullup + +const temp_entry_t temptable_512[] PROGMEM = { + { OV(26), 300 }, + { OV(28), 295 }, + { OV(30), 290 }, + { OV(32), 285 }, + { OV(34), 280 }, + { OV(37), 275 }, + { OV(39), 270 }, + { OV(42), 265 }, + { OV(46), 260 }, + { OV(49), 255 }, + { OV(53), 250 }, // 256.5 + { OV(57), 245 }, + { OV(62), 240 }, + { OV(67), 235 }, + { OV(73), 230 }, + { OV(79), 225 }, + { OV(86), 220 }, + { OV(94), 215 }, + { OV(103), 210 }, + { OV(112), 205 }, + { OV(123), 200 }, + { OV(135), 195 }, + { OV(148), 190 }, + { OV(162), 185 }, + { OV(178), 180 }, + { OV(195), 175 }, + { OV(215), 170 }, + { OV(235), 165 }, + { OV(258), 160 }, + { OV(283), 155 }, + { OV(310), 150 }, // 2040.6 + { OV(338), 145 }, + { OV(369), 140 }, + { OV(401), 135 }, + { OV(435), 130 }, + { OV(470), 125 }, + { OV(505), 120 }, + { OV(542), 115 }, + { OV(579), 110 }, + { OV(615), 105 }, + { OV(651), 100 }, + { OV(686), 95 }, + { OV(720), 90 }, + { OV(751), 85 }, + { OV(781), 80 }, + { OV(809), 75 }, + { OV(835), 70 }, + { OV(858), 65 }, + { OV(880), 60 }, + { OV(899), 55 }, + { OV(915), 50 }, + { OV(930), 45 }, + { OV(944), 40 }, + { OV(955), 35 }, + { OV(965), 30 }, // 78279.3 + { OV(974), 25 }, + { OV(981), 20 }, + { OV(988), 15 }, + { OV(993), 10 }, + { OV(998), 5 }, + { OV(1002), 0 }, +}; diff --git a/Marlin/src/module/thermistor/thermistor_52.h b/Marlin/src/module/thermistor/thermistor_52.h new file mode 100644 index 00000000..5c9cb9dc --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_52.h @@ -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 . + * + */ +#pragma once + +// 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: 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 = { + { OV( 1), 500 }, + { OV( 125), 300 }, // top rating 300C + { OV( 142), 290 }, + { OV( 162), 280 }, + { OV( 185), 270 }, + { OV( 211), 260 }, + { OV( 240), 250 }, + { OV( 274), 240 }, + { OV( 312), 230 }, + { OV( 355), 220 }, + { OV( 401), 210 }, + { OV( 452), 200 }, + { OV( 506), 190 }, + { OV( 563), 180 }, + { OV( 620), 170 }, + { OV( 677), 160 }, + { OV( 732), 150 }, + { OV( 783), 140 }, + { OV( 830), 130 }, + { OV( 871), 120 }, + { OV( 906), 110 }, + { OV( 935), 100 }, + { OV( 958), 90 }, + { OV( 976), 80 }, + { OV( 990), 70 }, + { OV(1000), 60 }, + { OV(1008), 50 }, + { OV(1013), 40 }, + { OV(1017), 30 }, + { OV(1019), 20 }, + { OV(1021), 10 }, + { OV(1022), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_55.h b/Marlin/src/module/thermistor/thermistor_55.h new file mode 100644 index 00000000..707b7d42 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_55.h @@ -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 . + * + */ +#pragma once + +// 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: 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 = { + { OV( 1), 500 }, + { OV( 76), 300 }, + { OV( 87), 290 }, + { OV( 100), 280 }, + { OV( 114), 270 }, + { OV( 131), 260 }, + { OV( 152), 250 }, + { OV( 175), 240 }, + { OV( 202), 230 }, + { OV( 234), 220 }, + { OV( 271), 210 }, + { OV( 312), 200 }, + { OV( 359), 190 }, + { OV( 411), 180 }, + { OV( 467), 170 }, + { OV( 527), 160 }, + { OV( 590), 150 }, + { OV( 652), 140 }, + { OV( 713), 130 }, + { OV( 770), 120 }, + { OV( 822), 110 }, + { OV( 867), 100 }, + { OV( 905), 90 }, + { OV( 936), 80 }, + { OV( 961), 70 }, + { OV( 979), 60 }, + { OV( 993), 50 }, + { OV(1003), 40 }, + { OV(1010), 30 }, + { OV(1015), 20 }, + { OV(1018), 10 }, + { OV(1020), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_6.h b/Marlin/src/module/thermistor/thermistor_6.h new file mode 100644 index 00000000..68113419 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_6.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 + +// R25 = 100 kOhm, beta25 = 4092 K, 8.2 kOhm pull-up, 100k Epcos (?) thermistor +const temp_entry_t temptable_6[] PROGMEM = { + { OV( 1), 350 }, + { OV( 28), 250 }, // top rating 250C + { OV( 31), 245 }, + { OV( 35), 240 }, + { OV( 39), 235 }, + { OV( 42), 230 }, + { OV( 44), 225 }, + { OV( 49), 220 }, + { OV( 53), 215 }, + { OV( 62), 210 }, + { OV( 71), 205 }, // fitted graphically + { OV( 78), 200 }, // fitted graphically + { OV( 94), 190 }, + { OV( 102), 185 }, + { OV( 116), 170 }, + { OV( 143), 160 }, + { OV( 183), 150 }, + { OV( 223), 140 }, + { OV( 270), 130 }, + { OV( 318), 120 }, + { OV( 383), 110 }, + { OV( 413), 105 }, + { OV( 439), 100 }, + { OV( 484), 95 }, + { OV( 513), 90 }, + { OV( 607), 80 }, + { OV( 664), 70 }, + { OV( 781), 60 }, + { OV( 810), 55 }, + { OV( 849), 50 }, + { OV( 914), 45 }, + { OV( 914), 40 }, + { OV( 935), 35 }, + { OV( 954), 30 }, + { OV( 970), 25 }, + { OV( 978), 22 }, + { OV(1008), 3 }, + { OV(1023), 0 } // to allow internal 0 degrees C +}; diff --git a/Marlin/src/module/thermistor/thermistor_60.h b/Marlin/src/module/thermistor/thermistor_60.h new file mode 100644 index 00000000..a3fe5055 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_60.h @@ -0,0 +1,107 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, +// Maker's Tool Works Kapton Bed Thermistor +// ./createTemperatureLookup.py --r0=100000 --t0=25 --r1=0 --r2=4700 --beta=3950 +// r0: 100000 +// t0: 25 +// r1: 0 (parallel with rTherm) +// r2: 4700 (series with rTherm) +// beta: 3950 +// min adc: 1 at 0.0048828125 V +// max adc: 1023 at 4.9951171875 V +const temp_entry_t temptable_60[] PROGMEM = { + { OV( 51), 272 }, + { OV( 61), 258 }, + { OV( 71), 247 }, + { OV( 81), 237 }, + { OV( 91), 229 }, + { OV( 101), 221 }, + { OV( 131), 204 }, + { OV( 161), 190 }, + { OV( 191), 179 }, + { OV( 231), 167 }, + { OV( 271), 157 }, + { OV( 311), 148 }, + { OV( 351), 140 }, + { OV( 381), 135 }, + { OV( 411), 130 }, + { OV( 441), 125 }, + { OV( 451), 123 }, + { OV( 461), 122 }, + { OV( 471), 120 }, + { OV( 481), 119 }, + { OV( 491), 117 }, + { OV( 501), 116 }, + { OV( 511), 114 }, + { OV( 521), 113 }, + { OV( 531), 111 }, + { OV( 541), 110 }, + { OV( 551), 108 }, + { OV( 561), 107 }, + { OV( 571), 105 }, + { OV( 581), 104 }, + { OV( 591), 102 }, + { OV( 601), 101 }, + { OV( 611), 100 }, + { OV( 621), 98 }, + { OV( 631), 97 }, + { OV( 641), 95 }, + { OV( 651), 94 }, + { OV( 661), 92 }, + { OV( 671), 91 }, + { OV( 681), 90 }, + { OV( 691), 88 }, + { OV( 701), 87 }, + { OV( 711), 85 }, + { OV( 721), 84 }, + { OV( 731), 82 }, + { OV( 741), 81 }, + { OV( 751), 79 }, + { OV( 761), 77 }, + { OV( 771), 76 }, + { OV( 781), 74 }, + { OV( 791), 72 }, + { OV( 801), 71 }, + { OV( 811), 69 }, + { OV( 821), 67 }, + { OV( 831), 65 }, + { OV( 841), 63 }, + { OV( 851), 62 }, + { OV( 861), 60 }, + { OV( 871), 57 }, + { OV( 881), 55 }, + { OV( 891), 53 }, + { OV( 901), 51 }, + { OV( 911), 48 }, + { OV( 921), 45 }, + { OV( 931), 42 }, + { OV( 941), 39 }, + { OV( 951), 36 }, + { OV( 961), 32 }, + { OV( 981), 23 }, + { OV( 991), 17 }, + { OV(1001), 9 }, + { OV(1008), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_61.h b/Marlin/src/module/thermistor/thermistor_61.h new file mode 100644 index 00000000..ed4c4c88 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_61.h @@ -0,0 +1,116 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 3950 K, 4.7 kOhm pull-up, +// Formbot / Vivedino high temp 100k thermistor +// 100KR13950181203 +// Generated with modified version of https://www.thingiverse.com/thing:103668 +// Using table 1 with datasheet values +// Resistance 100k Ohms at 25deg. C +// Resistance Tolerance + / -1% +// B Value 3950K at 25/50 deg. C +// B Value Tolerance + / - 1% +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 }, + { OV( 13.59), 340 }, + { OV( 14.44), 335 }, + { OV( 15.37), 330 }, + { OV( 16.38), 325 }, + { OV( 17.46), 320 }, + { OV( 18.63), 315 }, + { OV( 19.91), 310 }, + { OV( 21.29), 305 }, + { OV( 22.79), 300 }, + { OV( 24.43), 295 }, + { OV( 26.21), 290 }, + { OV( 28.15), 285 }, + { OV( 30.27), 280 }, + { OV( 32.58), 275 }, + { OV( 35.10), 270 }, + { OV( 38.44), 265 }, + { OV( 40.89), 260 }, + { OV( 44.19), 255 }, + { OV( 47.83), 250 }, + { OV( 51.80), 245 }, + { OV( 56.20), 240 }, + { OV( 61.00), 235 }, + { OV( 66.30), 230 }, + { OV( 72.11), 225 }, + { OV( 78.51), 220 }, + { OV( 85.57), 215 }, + { OV( 93.34), 210 }, + { OV( 101.91), 205 }, + { OV( 111.34), 200 }, + { OV( 121.73), 195 }, + { OV( 133.17), 190 }, + { OV( 145.74), 185 }, + { OV( 159.57), 180 }, + { OV( 174.73), 175 }, + { OV( 191.35), 170 }, + { OV( 209.53), 165 }, + { OV( 229.35), 160 }, + { OV( 250.90), 155 }, + { OV( 274.25), 150 }, + { OV( 299.46), 145 }, + { OV( 326.52), 140 }, + { OV( 355.44), 135 }, + { OV( 386.15), 130 }, + { OV( 418.53), 125 }, + { OV( 452.43), 120 }, + { OV( 487.62), 115 }, + { OV( 523.82), 110 }, + { OV( 560.70), 105 }, + { OV( 597.88), 100 }, + { OV( 634.97), 95 }, + { OV( 671.55), 90 }, + { OV( 707.21), 85 }, + { OV( 741.54), 80 }, + { OV( 779.65), 75 }, + { OV( 809.57), 70 }, + { OV( 833.40), 65 }, + { OV( 859.55), 60 }, + { OV( 883.27), 55 }, + { OV( 904.53), 50 }, + { OV( 923.38), 45 }, + { OV( 939.91), 40 }, + { OV( 954.26), 35 }, + { OV( 966.59), 30 }, + { OV( 977.08), 25 }, + { OV( 985.92), 20 }, + { OV( 993.39), 15 }, + { OV( 999.42), 10 }, + { OV(1004.43), 5 }, + { OV(1008.51), 0 }, + { OV(1011.79), -5 }, + { OV(1014.40), -10 }, + { OV(1016.48), -15 }, + { OV(1018.10), -20 }, + { OV(1019.35), -25 }, + { OV(1020.32), -30 }, + { OV(1021.05), -35 }, + { OV(1021.60), -40 }, + { OV(1022.01), -45 }, + { OV(1022.31), -50 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_66.h b/Marlin/src/module/thermistor/thermistor_66.h new file mode 100644 index 00000000..0ad5994e --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_66.h @@ -0,0 +1,53 @@ +/** + * 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 + +// R25 = 2.5 MOhm, beta25 = 4500 K, 4.7 kOhm pull-up, DyzeDesign 500 °C Thermistor +const temp_entry_t temptable_66[] PROGMEM = { + { OV( 17.5), 850 }, + { OV( 17.9), 500 }, + { OV( 21.7), 480 }, + { OV( 26.6), 460 }, + { OV( 33.1), 440 }, + { OV( 41.0), 420 }, + { OV( 52.3), 400 }, + { OV( 67.7), 380 }, + { OV( 86.5), 360 }, + { OV( 112.0), 340 }, + { OV( 147.2), 320 }, + { OV( 194.0), 300 }, + { OV( 254.3), 280 }, + { OV( 330.2), 260 }, + { OV( 427.9), 240 }, + { OV( 533.4), 220 }, + { OV( 646.5), 200 }, + { OV( 754.4), 180 }, + { OV( 844.3), 160 }, + { OV( 911.7), 140 }, + { OV( 958.6), 120 }, + { OV( 988.8), 100 }, + { OV(1006.6), 80 }, + { OV(1015.8), 60 }, + { OV(1021.3), 30 }, + { OV( 1022), 25 }, + { OV( 1023), 20 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_666.h b/Marlin/src/module/thermistor/thermistor_666.h new file mode 100644 index 00000000..490dbd5f --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_666.h @@ -0,0 +1,98 @@ +/** + * 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 + +/** + * This file was generated by tltgen on Thu Jul 5 15:46:43 2018. + * tltgen was created by Pieter Agten (pieter.agten@gmail.com). + */ +//#include "output_table.h" + +/* + * Parameters: + * A: -0.000480634 + * B: 0.00031362 + * C: -2.03978e-07 + */ +const temp_entry_t temptable_666[] PROGMEM = { + { OV( 1), 794 }, + { OV( 18), 288 }, + { OV( 35), 234 }, + { OV( 52), 207 }, + { OV( 69), 189 }, + { OV( 86), 176 }, + { OV(103), 166 }, + { OV(120), 157 }, + { OV(137) ,150 }, + { OV(154), 144 }, + { OV(172), 138 }, + { OV(189), 134 }, + { OV(206), 129 }, + { OV(223), 125 }, + { OV(240), 121 }, + { OV(257), 118 }, + { OV(274), 115 }, + { OV(291), 112 }, + { OV(308), 109 }, + { OV(325), 106 }, + { OV(342), 103 }, + { OV(359), 101 }, + { OV(376), 99 }, + { OV(393), 96 }, + { OV(410), 94 }, + { OV(427), 92 }, + { OV(444), 90 }, + { OV(461), 88 }, + { OV(478), 86 }, + { OV(495), 84 }, + { OV(512), 82 }, + { OV(530), 80 }, + { OV(547), 78 }, + { OV(564), 76 }, + { OV(581), 74 }, + { OV(598), 72 }, + { OV(615), 70 }, + { OV(632), 68 }, + { OV(649), 67 }, + { OV(666), 65 }, + { OV(683), 63 }, + { OV(700), 61 }, + { OV(717), 59 }, + { OV(734), 57 }, + { OV(751), 55 }, + { OV(768), 53 }, + { OV(785), 51 }, + { OV(802), 49 }, + { OV(819), 47 }, + { OV(836), 44 }, + { OV(853), 42 }, + { OV(871), 39 }, + { OV(888), 37 }, + { OV(905), 34 }, + { OV(922), 30 }, + { OV(939), 27 }, + { OV(956), 23 }, + { OV(973), 18 }, + { OV(990), 11 }, + { OV(1007), 2 }, + { OV(1023),-25 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_67.h b/Marlin/src/module/thermistor/thermistor_67.h new file mode 100644 index 00000000..7d6d7f69 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_67.h @@ -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 . + * + */ +#pragma once + +// R25 = 500 KOhm, beta25 = 3800 K, 4.7 kOhm pull-up, SliceEngineering 450 °C Thermistor +const temp_entry_t temptable_67[] PROGMEM = { + { OV( 22 ), 500 }, + { OV( 23 ), 490 }, + { OV( 25 ), 480 }, + { OV( 27 ), 470 }, + { OV( 29 ), 460 }, + { OV( 32 ), 450 }, + { OV( 35 ), 440 }, + { OV( 38 ), 430 }, + { OV( 41 ), 420 }, + { OV( 45 ), 410 }, + { OV( 50 ), 400 }, + { OV( 55 ), 390 }, + { OV( 60 ), 380 }, + { OV( 67 ), 370 }, + { OV( 74 ), 360 }, + { OV( 82 ), 350 }, + { OV( 91 ), 340 }, + { OV( 102 ), 330 }, + { OV( 114 ), 320 }, + { OV( 127 ), 310 }, + { OV( 143 ), 300 }, + { OV( 161 ), 290 }, + { OV( 181 ), 280 }, + { OV( 204 ), 270 }, + { OV( 229 ), 260 }, + { OV( 259 ), 250 }, + { OV( 290 ), 240 }, + { OV( 325 ), 230 }, + { OV( 364 ), 220 }, + { OV( 407 ), 210 }, + { OV( 453 ), 200 }, + { OV( 501 ), 190 }, + { OV( 551 ), 180 }, + { OV( 603 ), 170 }, + { OV( 655 ), 160 }, + { OV( 706 ), 150 }, + { OV( 755 ), 140 }, + { OV( 801 ), 130 }, + { OV( 842 ), 120 }, + { OV( 879 ), 110 }, + { OV( 910 ), 100 }, + { OV( 936 ), 90 }, + { OV( 948 ), 85 }, + { OV( 958 ), 80 }, + { OV( 975 ), 70 }, + { OV( 988 ), 60 }, + { OV( 998 ), 50 }, + { OV(1006 ), 40 }, + { OV(1011 ), 30 }, + { OV(1013 ), 25 }, + { OV(1015 ), 20 }, + { OV(1018 ), 10 }, + { OV(1020 ), 0 }, + { OV(1021 ), -10 }, + { OV(1022 ), -20 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_7.h b/Marlin/src/module/thermistor/thermistor_7.h new file mode 100644 index 00000000..7a737559 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_7.h @@ -0,0 +1,84 @@ +/** + * 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 + +// R25 = 100 kOhm, beta25 = 3974 K, 4.7 kOhm pull-up, Honeywell 135-104LAG-J01 +const temp_entry_t temptable_7[] PROGMEM = { + { OV( 1), 941 }, + { OV( 19), 362 }, + { OV( 37), 299 }, // top rating 300C + { OV( 55), 266 }, + { OV( 73), 245 }, + { OV( 91), 229 }, + { OV( 109), 216 }, + { OV( 127), 206 }, + { OV( 145), 197 }, + { OV( 163), 190 }, + { OV( 181), 183 }, + { OV( 199), 177 }, + { OV( 217), 171 }, + { OV( 235), 166 }, + { OV( 253), 162 }, + { OV( 271), 157 }, + { OV( 289), 153 }, + { OV( 307), 149 }, + { OV( 325), 146 }, + { OV( 343), 142 }, + { OV( 361), 139 }, + { OV( 379), 135 }, + { OV( 397), 132 }, + { OV( 415), 129 }, + { OV( 433), 126 }, + { OV( 451), 123 }, + { OV( 469), 121 }, + { OV( 487), 118 }, + { OV( 505), 115 }, + { OV( 523), 112 }, + { OV( 541), 110 }, + { OV( 559), 107 }, + { OV( 577), 105 }, + { OV( 595), 102 }, + { OV( 613), 99 }, + { OV( 631), 97 }, + { OV( 649), 94 }, + { OV( 667), 92 }, + { OV( 685), 89 }, + { OV( 703), 86 }, + { OV( 721), 84 }, + { OV( 739), 81 }, + { OV( 757), 78 }, + { OV( 775), 75 }, + { OV( 793), 72 }, + { OV( 811), 69 }, + { OV( 829), 66 }, + { OV( 847), 62 }, + { OV( 865), 59 }, + { OV( 883), 55 }, + { OV( 901), 51 }, + { OV( 919), 46 }, + { OV( 937), 41 }, + { OV( 955), 35 }, + { OV( 973), 27 }, + { OV( 991), 17 }, + { OV(1009), 1 }, + { OV(1023), 0 } // to allow internal 0 degrees C +}; diff --git a/Marlin/src/module/thermistor/thermistor_70.h b/Marlin/src/module/thermistor/thermistor_70.h new file mode 100644 index 00000000..466b9255 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_70.h @@ -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 . + * + */ +#pragma once + +// Stock BQ Hephestos 2 100k thermistor. +// Created on 29/12/2017 with an ambient temperature of 20C. +// 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 temp_entry_t temptable_70[] PROGMEM = { + { OV( 18), 270 }, + { OV( 27), 248 }, + { OV( 34), 234 }, + { OV( 45), 220 }, + { OV( 61), 205 }, + { OV( 86), 188 }, + { OV( 123), 172 }, + { OV( 420), 110 }, + { OV( 590), 90 }, + { OV( 845), 56 }, + { OV( 970), 25 }, + { OV( 986), 20 }, + { OV( 994), 15 }, + { OV(1000), 10 }, + { OV(1005), 5 }, + { OV(1009), 0 } // safety +}; diff --git a/Marlin/src/module/thermistor/thermistor_71.h b/Marlin/src/module/thermistor/thermistor_71.h new file mode 100644 index 00000000..abd7fc5b --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_71.h @@ -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 . + * + */ +#pragma once + +// R25 = 100 kOhm, beta25 = 3974 K, 4.7 kOhm pull-up, Honeywell 135-104LAF-J01 +// R0 = 100000 Ohm +// T0 = 25 °C +// Beta = 3974 +// R1 = 0 Ohm +// R2 = 4700 Ohm +const temp_entry_t temptable_71[] PROGMEM = { + { OV( 35), 300 }, + { OV( 51), 269 }, + { OV( 59), 258 }, + { OV( 64), 252 }, + { OV( 71), 244 }, + { OV( 81), 235 }, + { OV( 87), 230 }, + { OV( 92), 226 }, + { OV( 102), 219 }, + { OV( 110), 214 }, + { OV( 115), 211 }, + { OV( 126), 205 }, + { OV( 128), 204 }, + { OV( 130), 203 }, + { OV( 132), 202 }, + { OV( 134), 201 }, + { OV( 136), 200 }, + { OV( 147), 195 }, + { OV( 154), 192 }, + { OV( 159), 190 }, + { OV( 164), 188 }, + { OV( 172), 185 }, + { OV( 175), 184 }, + { OV( 178), 183 }, + { OV( 181), 182 }, + { OV( 184), 181 }, + { OV( 187), 180 }, + { OV( 190), 179 }, + { OV( 193), 178 }, + { OV( 196), 177 }, + { OV( 199), 176 }, + { OV( 202), 175 }, + { OV( 205), 174 }, + { OV( 208), 173 }, + { OV( 215), 171 }, + { OV( 237), 165 }, + { OV( 256), 160 }, + { OV( 300), 150 }, + { OV( 351), 140 }, + { OV( 470), 120 }, + { OV( 504), 115 }, + { OV( 538), 110 }, + { OV( 745), 80 }, + { OV( 770), 76 }, + { OV( 806), 70 }, + { OV( 829), 66 }, + { OV( 860), 60 }, + { OV( 879), 56 }, + { OV( 888), 54 }, + { OV( 905), 50 }, + { OV( 924), 45 }, + { OV( 940), 40 }, + { OV( 955), 35 }, + { OV( 972), 28 }, + { OV( 974), 27 }, + { OV( 976), 26 }, + { OV( 978), 25 }, + { OV( 980), 24 }, + { OV( 987), 20 }, + { OV( 995), 15 }, + { OV(1001), 10 }, + { OV(1006), 5 }, + { OV(1010), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_75.h b/Marlin/src/module/thermistor/thermistor_75.h new file mode 100644 index 00000000..79800d2e --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_75.h @@ -0,0 +1,80 @@ +/** + * 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 + +/** + * R25 = 100 kOhm, beta25 = 4100 K, 4.7 kOhm pull-up, + * Generic Silicon Heat Pad with NTC 100K thermistor + * + * Many generic silicone heat pads use the MGB18-104F39050L32 thermistor, applicable to various + * wattages and voltages. This table is correct if this part is used. It's been optimized + * to provide good granularity in the 60-110C range, good for PLA and ABS. For higher temperature + * filament (e.g., nylon) uncomment HIGH_TEMP_RANGE_75 for increased accuracy. If higher + * temperatures aren't used it can improve performance slightly to leave it commented out. + */ + +//#define HIGH_TEMP_RANGE_75 + +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 + { OV(174.87), 175 }, // v=0.854 r=967.950 res=0.311 degC/count These values are valid. But they serve no + { OV(191.64), 170 }, // v=0.936 r=1082.139 res=0.284 degC/count purpose. It is better to delete them so + { OV(209.99), 165 }, // v=1.025 r=1212.472 res=0.260 degC/count the search is quicker and get to the meaningful + { OV(230.02), 160 }, // v=1.123 r=1361.590 res=0.239 degC/count part of the table sooner. + { OV(251.80), 155 }, // v=1.230 r=1532.621 res=0.220 degC/count + #endif + + { OV(275.43), 150 }, // v=1.345 r=1729.283 res=0.203 degC/count + + #ifdef HIGH_TEMP_RANGE_75 + { OV(300.92), 145 }, // v=1.469 r=1956.004 res=0.189 degC/coun + #endif + + { OV( 328.32), 140 }, // v=1.603 r=2218.081 res=0.176 degC/count + { OV( 388.65), 130 }, // v=1.898 r=2874.980 res=0.156 degC/count + { OV( 421.39), 125 }, // v=2.058 r=3286.644 res=0.149 degC/count + { OV( 455.65), 120 }, // v=2.225 r=3768.002 res=0.143 degC/count + { OV( 491.17), 115 }, // v=2.398 r=4332.590 res=0.139 degC/count + { OV( 527.68), 110 }, // v=2.577 r=4996.905 res=0.136 degC/count + { OV( 564.81), 105 }, // v=2.758 r=5781.120 res=0.134 degC/count + { OV( 602.19), 100 }, // v=2.940 r=6710.000 res=0.134 degC/count + { OV( 676.03), 90 }, // v=3.301 r=9131.018 res=0.138 degC/count + { OV( 745.85), 80 }, // v=3.642 r=12602.693 res=0.150 degC/count + { OV( 778.31), 75 }, // v=3.800 r=14889.001 res=0.159 degC/count + { OV( 808.75), 70 }, // v=3.949 r=17658.700 res=0.171 degC/count + { OV( 836.94), 65 }, // v=4.087 r=21028.040 res=0.185 degC/count + { OV( 862.74), 60 }, // v=4.213 r=25144.568 res=0.204 degC/count + { OV( 886.08), 55 }, // v=4.327 r=30196.449 res=0.227 degC/count + { OV( 906.97), 50 }, // v=4.429 r=36424.838 res=0.255 degC/count + { OV( 941.65), 40 }, // v=4.598 r=53745.337 res=0.333 degC/count + { OV( 967.76), 30 }, // v=4.725 r=80880.630 res=0.452 degC/count + { OV( 978.03), 25 }, // v=4.776 r=100000.000 res=0.535 degC/count + { OV( 981.68), 23 }, // v=4.793 r=109024.395 res=0.573 degC/count + { OV( 983.41), 22 }, // v=4.802 r=113875.430 res=0.594 degC/count + { OV( 985.08), 21 }, // v=4.810 r=118968.955 res=0.616 degC/count + { OV( 986.70), 20 }, // v=4.818 r=124318.354 res=0.638 degC/count + { OV( 993.94), 15 }, // v=4.853 r=155431.302 res=0.768 degC/count + { OV( 999.96), 10 }, // v=4.883 r=195480.023 res=0.934 degC/count + { OV(1008.95), 0 } // v=4.926 r=314997.575 res=1.418 degC/count +}; diff --git a/Marlin/src/module/thermistor/thermistor_8.h b/Marlin/src/module/thermistor/thermistor_8.h new file mode 100644 index 00000000..9e19168f --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_8.h @@ -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 . + * + */ +#pragma once + +// R25 = 100 kOhm, beta25 = 3950 K, 10 kOhm pull-up, NTCS0603E3104FHT +const temp_entry_t temptable_8[] PROGMEM = { + { OV( 1), 704 }, + { OV( 54), 216 }, + { OV( 107), 175 }, + { OV( 160), 152 }, + { OV( 213), 137 }, + { OV( 266), 125 }, + { OV( 319), 115 }, + { OV( 372), 106 }, + { OV( 425), 99 }, + { OV( 478), 91 }, + { OV( 531), 85 }, + { OV( 584), 78 }, + { OV( 637), 71 }, + { OV( 690), 65 }, + { OV( 743), 58 }, + { OV( 796), 50 }, + { OV( 849), 42 }, + { OV( 902), 31 }, + { OV( 955), 17 }, + { OV(1008), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_9.h b/Marlin/src/module/thermistor/thermistor_9.h new file mode 100644 index 00000000..29097420 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_9.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 + +// R25 = 100 kOhm, beta25 = 3960 K, 4.7 kOhm pull-up, GE Sensing AL03006-58.2K-97-G1 +const temp_entry_t temptable_9[] PROGMEM = { + { OV( 1), 936 }, + { OV( 36), 300 }, + { OV( 71), 246 }, + { OV( 106), 218 }, + { OV( 141), 199 }, + { OV( 176), 185 }, + { OV( 211), 173 }, + { OV( 246), 163 }, + { OV( 281), 155 }, + { OV( 316), 147 }, + { OV( 351), 140 }, + { OV( 386), 134 }, + { OV( 421), 128 }, + { OV( 456), 122 }, + { OV( 491), 117 }, + { OV( 526), 112 }, + { OV( 561), 107 }, + { OV( 596), 102 }, + { OV( 631), 97 }, + { OV( 666), 92 }, + { OV( 701), 87 }, + { OV( 736), 81 }, + { OV( 771), 76 }, + { OV( 806), 70 }, + { OV( 841), 63 }, + { OV( 876), 56 }, + { OV( 911), 48 }, + { OV( 946), 38 }, + { OV( 981), 23 }, + { OV(1005), 5 }, + { OV(1016), 0 } +}; diff --git a/Marlin/src/module/thermistor/thermistor_99.h b/Marlin/src/module/thermistor/thermistor_99.h new file mode 100644 index 00000000..839a511c --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_99.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 + +// 100k bed thermistor with a 10K pull-up resistor - made by $ buildroot/share/scripts/createTemperatureLookupMarlin.py --rp=10000 + +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 + { OV( 8.36), 320 }, // v=0.041 r= 82.336 res= 8.772 degC/count + { OV( 9.51), 310 }, // v=0.046 r= 93.780 res= 7.535 degC/count + { OV( 10.87), 300 }, // v=0.053 r= 107.281 res= 6.439 degC/count + { OV( 12.47), 290 }, // v=0.061 r= 123.286 res= 5.473 degC/count + { OV( 14.37), 280 }, // v=0.070 r= 142.360 res= 4.627 degC/count + { OV( 16.64), 270 }, // v=0.081 r= 165.215 res= 3.891 degC/count + { OV( 19.37), 260 }, // v=0.095 r= 192.758 res= 3.253 degC/count + { OV( 22.65), 250 }, // v=0.111 r= 226.150 res= 2.705 degC/count + { OV( 26.62), 240 }, // v=0.130 r= 266.891 res= 2.236 degC/count + { OV( 31.46), 230 }, // v=0.154 r= 316.931 res= 1.839 degC/count + { OV( 37.38), 220 }, // v=0.182 r= 378.822 res= 1.504 degC/count + { OV( 44.65), 210 }, // v=0.218 r= 455.939 res= 1.224 degC/count + { OV( 53.64), 200 }, // v=0.262 r= 552.778 res= 0.991 degC/count + { OV( 64.78), 190 }, // v=0.316 r= 675.386 res= 0.799 degC/count + { OV( 78.65), 180 }, // v=0.384 r= 831.973 res= 0.643 degC/count + { OV( 95.94), 170 }, // v=0.468 r= 1033.801 res= 0.516 degC/count + { OV(117.52), 160 }, // v=0.574 r= 1296.481 res= 0.414 degC/count + { OV(144.42), 150 }, // v=0.705 r= 1641.900 res= 0.333 degC/count + { OV(177.80), 140 }, // v=0.868 r= 2101.110 res= 0.269 degC/count + { OV(218.89), 130 }, // v=1.069 r= 2718.725 res= 0.220 degC/count + { OV(268.82), 120 }, // v=1.313 r= 3559.702 res= 0.183 degC/count + { OV(328.35), 110 }, // v=1.603 r= 4719.968 res= 0.155 degC/count + { OV(397.44), 100 }, // v=1.941 r= 6343.323 res= 0.136 degC/count + { OV(474.90), 90 }, // v=2.319 r= 8648.807 res= 0.124 degC/count + { OV(558.03), 80 }, // v=2.725 r= 11975.779 res= 0.118 degC/count + { OV(642.76), 70 }, // v=3.138 r= 16859.622 res= 0.119 degC/count + { OV(724.25), 60 }, // v=3.536 r= 24161.472 res= 0.128 degC/count + { OV(797.93), 50 }, // v=3.896 r= 35295.361 res= 0.146 degC/count + { OV(860.51), 40 }, // v=4.202 r= 52635.209 res= 0.178 degC/count + { OV(910.55), 30 }, // v=4.446 r= 80262.251 res= 0.229 degC/count + { OV(948.36), 20 }, // v=4.631 r=125374.433 res= 0.313 degC/count + { OV(975.47), 10 }, // v=4.763 r=201020.458 res= 0.449 degC/count + { OV(994.02), 0 } // v=4.854 r=331567.870 res= 0.676 degC/count +}; diff --git a/Marlin/src/module/thermistor/thermistor_998.h b/Marlin/src/module/thermistor/thermistor_998.h new file mode 100644 index 00000000..e4cfbbaa --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_998.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 + +// User-defined table 1 +// Dummy Thermistor table.. It will ALWAYS read a fixed value. +#ifndef DUMMY_THERMISTOR_998_VALUE + #define DUMMY_THERMISTOR_998_VALUE 25 +#endif + +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 new file mode 100644 index 00000000..0271c47f --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_999.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 + +// User-defined table 2 +// Dummy Thermistor table.. It will ALWAYS read a fixed value. +#ifndef DUMMY_THERMISTOR_999_VALUE + #define DUMMY_THERMISTOR_999_VALUE 25 +#endif + +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 new file mode 100644 index 00000000..0b0419c5 --- /dev/null +++ b/Marlin/src/module/thermistor/thermistors.h @@ -0,0 +1,499 @@ +/** + * 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" + +#define THERMISTOR_TABLE_ADC_RESOLUTION 10 +#define THERMISTOR_TABLE_SCALE (HAL_ADC_RANGE / _BV(THERMISTOR_TABLE_ADC_RESOLUTION)) +#if ENABLED(HAL_ADC_FILTERED) + #define OVERSAMPLENR 1 +#else + #define OVERSAMPLENR 16 +#endif +#define MAX_RAW_THERMISTOR_VALUE (HAL_ADC_RANGE * (OVERSAMPLENR) - 1) + +// Currently Marlin stores all oversampled ADC values as int16_t, make sure the HAL settings do not overflow 15bit +#if MAX_RAW_THERMISTOR_VALUE > ((1 << 15) - 1) + #error "MAX_RAW_THERMISTOR_VALUE is too large for int16_t. Reduce OVERSAMPLENR or HAL_ADC_RESOLUTION." +#endif + +#define OV_SCALE(N) (N) +#define OV(N) int16_t(OV_SCALE(N) * (OVERSAMPLENR) * (THERMISTOR_TABLE_SCALE)) + +#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] +// a=3.9083E-3, b=-5.775E-7 +#define PtA 3.9083E-3 +#define PtB -5.775E-7 +#define PtRt(T,R0) ((R0) * (1.0 + (PtA) * (T) + (PtB) * (T) * (T))) +#define PtAdVal(T,R0,Rup) (short)(1024 / (Rup / PtRt(T, R0) + 1)) +#define PtLine(T,R0,Rup) { OV(PtAdVal(T, R0, Rup)), T } + +#if ANY_THERMISTOR_IS(1) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "EPCOS" + #include "thermistor_1.h" +#endif +#if ANY_THERMISTOR_IS(2) // 4338 K, R25 = 200 kOhm, Pull-up = 4.7 kOhm, "ATC Semitec 204GT-2" + #include "thermistor_2.h" +#endif +#if ANY_THERMISTOR_IS(3) // beta25 = 4120 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Mendel-parts" + #include "thermistor_3.h" +#endif +#if ANY_THERMISTOR_IS(4) // beta25 = 3950 K, R25 = 10 kOhm, Pull-up = 4.7 kOhm, "Generic" + #include "thermistor_4.h" +#endif +#if ANY_THERMISTOR_IS(5) // beta25 = 4267 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "ParCan, ATC 104GT-2" + #include "thermistor_5.h" +#endif +#if ANY_THERMISTOR_IS(501) // 100K Zonestar thermistor + #include "thermistor_501.h" +#endif +#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" + #include "thermistor_512.h" +#endif +#if ANY_THERMISTOR_IS(6) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 8.2 kOhm, "EPCOS ?" + #include "thermistor_6.h" +#endif +#if ANY_THERMISTOR_IS(7) // beta25 = 3974 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Honeywell 135-104LAG-J01" + #include "thermistor_7.h" +#endif +#if ANY_THERMISTOR_IS(71) // beta25 = 3974 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Honeywell 135-104LAF-J01" + #include "thermistor_71.h" +#endif +#if ANY_THERMISTOR_IS(8) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 10 kOhm, "Vishay E3104FHT" + #include "thermistor_8.h" +#endif +#if ANY_THERMISTOR_IS(9) // beta25 = 3960 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "GE Sensing AL03006-58.2K-97-G1" + #include "thermistor_9.h" +#endif +#if ANY_THERMISTOR_IS(10) // beta25 = 3960 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "RS 198-961" + #include "thermistor_10.h" +#endif +#if ANY_THERMISTOR_IS(11) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "QU-BD silicone bed, QWG-104F-3950" + #include "thermistor_11.h" +#endif +#if ANY_THERMISTOR_IS(13) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Hisens" + #include "thermistor_13.h" +#endif +#if ANY_THERMISTOR_IS(15) // JGAurora A5 thermistor calibration + #include "thermistor_15.h" +#endif +#if ANY_THERMISTOR_IS(18) // ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 + #include "thermistor_18.h" +#endif +#if ANY_THERMISTOR_IS(20) // Pt100 with INA826 amp on Ultimaker v2.0 electronics + #include "thermistor_20.h" +#endif +#if ANY_THERMISTOR_IS(21) // Pt100 with INA826 amp with 3.3v excitation based on "Pt100 with INA826 amp on Ultimaker v2.0 electronics" + #include "thermistor_21.h" +#endif +#if ANY_THERMISTOR_IS(22) // Thermistor in a Rostock 301 hot end, calibrated with a multimeter + #include "thermistor_22.h" +#endif +#if ANY_THERMISTOR_IS(23) // By AluOne #12622. Formerly 22 above. May need calibration/checking. + #include "thermistor_23.h" +#endif +#if ANY_THERMISTOR_IS(30) // Kis3d Silicone mat 24V 200W/300W with 6mm Precision cast plate (EN AW 5083) + #include "thermistor_30.h" +#endif +#if ANY_THERMISTOR_IS(51) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "EPCOS" + #include "thermistor_51.h" +#endif +#if ANY_THERMISTOR_IS(52) // beta25 = 4338 K, R25 = 200 kOhm, Pull-up = 1 kOhm, "ATC Semitec 204GT-2" + #include "thermistor_52.h" +#endif +#if ANY_THERMISTOR_IS(55) // beta25 = 4267 K, R25 = 100 kOhm, Pull-up = 1 kOhm, "ATC Semitec 104GT-2 (Used on ParCan)" + #include "thermistor_55.h" +#endif +#if ANY_THERMISTOR_IS(60) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Maker's Tool Works Kapton Bed" + #include "thermistor_60.h" +#endif +#if ANY_THERMISTOR_IS(61) // beta25 = 3950 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Formbot 350°C Thermistor" + #include "thermistor_61.h" +#endif +#if ANY_THERMISTOR_IS(66) // beta25 = 4500 K, R25 = 2.5 MOhm, Pull-up = 4.7 kOhm, "DyzeDesign 500 °C Thermistor" + #include "thermistor_66.h" +#endif +#if ANY_THERMISTOR_IS(67) // R25 = 500 KOhm, beta25 = 3800 K, 4.7 kOhm pull-up, SliceEngineering 450 °C Thermistor + #include "thermistor_67.h" +#endif +#if ANY_THERMISTOR_IS(12) // beta25 = 4700 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Personal calibration for Makibox hot bed" + #include "thermistor_12.h" +#endif +#if ANY_THERMISTOR_IS(70) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Hephestos 2, bqh2 stock thermistor" + #include "thermistor_70.h" +#endif +#if ANY_THERMISTOR_IS(75) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "MGB18-104F39050L32 thermistor" + #include "thermistor_75.h" +#endif +#if ANY_THERMISTOR_IS(99) // 100k bed thermistor with a 10K pull-up resistor (on some Wanhao i3 models) + #include "thermistor_99.h" +#endif +#if ANY_THERMISTOR_IS(110) // Pt100 with 1k0 pullup + #include "thermistor_110.h" +#endif +#if ANY_THERMISTOR_IS(147) // Pt100 with 4k7 pullup + #include "thermistor_147.h" +#endif +#if ANY_THERMISTOR_IS(201) // Pt100 with LMV324 Overlord + #include "thermistor_201.h" +#endif +#if ANY_THERMISTOR_IS(202) // 200K thermistor in Copymaker3D hotend + #include "thermistor_202.h" +#endif +#if ANY_THERMISTOR_IS(331) // Like table 1, but with 3V3 as input voltage for MEGA + #include "thermistor_331.h" +#endif +#if ANY_THERMISTOR_IS(332) // Like table 1, but with 3V3 as input voltage for DUE + #include "thermistor_332.h" +#endif +#if ANY_THERMISTOR_IS(666) // beta25 = UNK, R25 = 200K, Pull-up = 10 kOhm, "Unidentified 200K NTC thermistor (Einstart S)" + #include "thermistor_666.h" +#endif +#if ANY_THERMISTOR_IS(1010) // Pt1000 with 1k0 pullup + #include "thermistor_1010.h" +#endif +#if ANY_THERMISTOR_IS(1047) // Pt1000 with 4k7 pullup + #include "thermistor_1047.h" +#endif +#if ANY_THERMISTOR_IS(998) // User-defined table 1 + #include "thermistor_998.h" +#endif +#if ANY_THERMISTOR_IS(999) // User-defined table 2 + #include "thermistor_999.h" +#endif +#if ANY_THERMISTOR_IS(1000) // Custom + 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) +#elif defined(HEATER_0_USES_THERMISTOR) + #error "No heater 0 thermistor table specified" +#else + #define HEATER_0_TEMPTABLE nullptr + #define HEATER_0_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_1 + #define HEATER_1_TEMPTABLE TT_NAME(THERMISTOR_HEATER_1) + #define HEATER_1_TEMPTABLE_LEN COUNT(HEATER_1_TEMPTABLE) +#elif defined(HEATER_1_USES_THERMISTOR) + #error "No heater 1 thermistor table specified" +#else + #define HEATER_1_TEMPTABLE nullptr + #define HEATER_1_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_2 + #define HEATER_2_TEMPTABLE TT_NAME(THERMISTOR_HEATER_2) + #define HEATER_2_TEMPTABLE_LEN COUNT(HEATER_2_TEMPTABLE) +#elif defined(HEATER_2_USES_THERMISTOR) + #error "No heater 2 thermistor table specified" +#else + #define HEATER_2_TEMPTABLE nullptr + #define HEATER_2_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_3 + #define HEATER_3_TEMPTABLE TT_NAME(THERMISTOR_HEATER_3) + #define HEATER_3_TEMPTABLE_LEN COUNT(HEATER_3_TEMPTABLE) +#elif defined(HEATER_3_USES_THERMISTOR) + #error "No heater 3 thermistor table specified" +#else + #define HEATER_3_TEMPTABLE nullptr + #define HEATER_3_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_4 + #define HEATER_4_TEMPTABLE TT_NAME(THERMISTOR_HEATER_4) + #define HEATER_4_TEMPTABLE_LEN COUNT(HEATER_4_TEMPTABLE) +#elif defined(HEATER_4_USES_THERMISTOR) + #error "No heater 4 thermistor table specified" +#else + #define HEATER_4_TEMPTABLE nullptr + #define HEATER_4_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_5 + #define HEATER_5_TEMPTABLE TT_NAME(THERMISTOR_HEATER_5) + #define HEATER_5_TEMPTABLE_LEN COUNT(HEATER_5_TEMPTABLE) +#elif defined(HEATER_5_USES_THERMISTOR) + #error "No heater 5 thermistor table specified" +#else + #define HEATER_5_TEMPTABLE nullptr + #define HEATER_5_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_6 + #define HEATER_6_TEMPTABLE TT_NAME(THERMISTOR_HEATER_6) + #define HEATER_6_TEMPTABLE_LEN COUNT(HEATER_6_TEMPTABLE) +#elif defined(HEATER_6_USES_THERMISTOR) + #error "No heater 6 thermistor table specified" +#else + #define HEATER_6_TEMPTABLE nullptr + #define HEATER_6_TEMPTABLE_LEN 0 +#endif + +#if THERMISTOR_HEATER_7 + #define HEATER_7_TEMPTABLE TT_NAME(THERMISTOR_HEATER_7) + #define HEATER_7_TEMPTABLE_LEN COUNT(HEATER_7_TEMPTABLE) +#elif defined(HEATER_7_USES_THERMISTOR) + #error "No heater 7 thermistor table specified" +#else + #define HEATER_7_TEMPTABLE nullptr + #define HEATER_7_TEMPTABLE_LEN 0 +#endif + +#ifdef THERMISTORBED + #define BED_TEMPTABLE TT_NAME(THERMISTORBED) + #define BED_TEMPTABLE_LEN COUNT(BED_TEMPTABLE) +#elif defined(HEATER_BED_USES_THERMISTOR) + #error "No bed thermistor table specified" +#else + #define BED_TEMPTABLE_LEN 0 +#endif + +#ifdef THERMISTORCHAMBER + #define CHAMBER_TEMPTABLE TT_NAME(THERMISTORCHAMBER) + #define CHAMBER_TEMPTABLE_LEN COUNT(CHAMBER_TEMPTABLE) +#elif defined(HEATER_CHAMBER_USES_THERMISTOR) + #error "No chamber thermistor table specified" +#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 + +// The SCAN_THERMISTOR_TABLE macro needs alteration? +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 < 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." +); + +// 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 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 + #define HEATER_0_RAW_HI_TEMP 0 + #define HEATER_0_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_1_RAW_HI_TEMP + #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 + #define HEATER_1_RAW_HI_TEMP 0 + #define HEATER_1_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_2_RAW_HI_TEMP + #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 + #define HEATER_2_RAW_HI_TEMP 0 + #define HEATER_2_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_3_RAW_HI_TEMP + #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 + #define HEATER_3_RAW_HI_TEMP 0 + #define HEATER_3_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_4_RAW_HI_TEMP + #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 + #define HEATER_4_RAW_HI_TEMP 0 + #define HEATER_4_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_5_RAW_HI_TEMP + #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 + #define HEATER_5_RAW_HI_TEMP 0 + #define HEATER_5_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_6_RAW_HI_TEMP + #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 + #define HEATER_6_RAW_HI_TEMP 0 + #define HEATER_6_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_7_RAW_HI_TEMP + #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 + #define HEATER_7_RAW_HI_TEMP 0 + #define HEATER_7_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_BED_RAW_HI_TEMP + #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 + #define HEATER_BED_RAW_HI_TEMP 0 + #define HEATER_BED_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif +#ifndef HEATER_CHAMBER_RAW_HI_TEMP + #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 + #define HEATER_CHAMBER_RAW_HI_TEMP 0 + #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 _TT_REV +#undef TT_REV diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp new file mode 100644 index 00000000..4ab818f4 --- /dev/null +++ b/Marlin/src/module/tool_change.cpp @@ -0,0 +1,1301 @@ +/** + * 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 "tool_change.h" + +#include "probe.h" +#include "motion.h" +#include "planner.h" +#include "temperature.h" + +#include "../MarlinCore.h" + +//#define DEBUG_TOOL_CHANGE + +#define DEBUG_OUT ENABLED(DEBUG_TOOL_CHANGE) +#include "../core/debug_out.h" + +#if HAS_MULTI_EXTRUDER + toolchange_settings_t toolchange_settings; // Initialized by settings.load() +#endif + +#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + migration_settings_t migration = migration_defaults; + bool enable_first_prime; +#endif + +#if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP) + bool toolchange_extruder_ready[EXTRUDERS]; +#endif + +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + uint16_t singlenozzle_temp[EXTRUDERS]; +#endif + +#if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) + uint8_t singlenozzle_fan_speed[EXTRUDERS]; +#endif + +#if ENABLED(MAGNETIC_PARKING_EXTRUDER) || defined(EVENT_GCODE_AFTER_TOOLCHANGE) || (ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0) + #include "../gcode/gcode.h" +#endif + +#if ANY(SWITCHING_EXTRUDER, SWITCHING_NOZZLE, SWITCHING_TOOLHEAD) + #include "servo.h" +#endif + +#if ENABLED(EXT_SOLENOID) && DISABLED(PARKING_EXTRUDER) + #include "../feature/solenoid.h" +#endif + +#if ENABLED(MK2_MULTIPLEXER) + #include "../feature/snmm.h" +#endif + +#if ENABLED(MIXING_EXTRUDER) + #include "../feature/mixing.h" +#endif + +#if HAS_LEVELING + #include "../feature/bedlevel/bedlevel.h" +#endif + +#if HAS_FANMUX + #include "../feature/fanmux.h" +#endif + +#if ENABLED(PRUSA_MMU2) + #include "../feature/mmu2/mmu2.h" +#endif + +#if HAS_LCD_MENU + #include "../lcd/ultralcd.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" +#endif + +#if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + #include "../gcode/gcode.h" + #if TOOLCHANGE_FS_WIPE_RETRACT <= 0 + #undef TOOLCHANGE_FS_WIPE_RETRACT + #define TOOLCHANGE_FS_WIPE_RETRACT 0 + #endif +#endif + +#if DO_SWITCH_EXTRUDER + + #if EXTRUDERS > 3 + #define _SERVO_NR(E) ((E) < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR) + #else + #define _SERVO_NR(E) SWITCHING_EXTRUDER_SERVO_NR + #endif + + void move_extruder_servo(const uint8_t e) { + planner.synchronize(); + #if EXTRUDERS & 1 + if (e < EXTRUDERS - 1) + #endif + { + MOVE_SERVO(_SERVO_NR(e), servo_angles[_SERVO_NR(e)][e]); + safe_delay(500); + } + } + +#endif // DO_SWITCH_EXTRUDER + +#if ENABLED(SWITCHING_NOZZLE) + + #if SWITCHING_NOZZLE_TWO_SERVOS + + inline void _move_nozzle_servo(const uint8_t e, const uint8_t angle_index) { + constexpr int8_t sns_index[2] = { SWITCHING_NOZZLE_SERVO_NR, SWITCHING_NOZZLE_E1_SERVO_NR }; + constexpr int16_t sns_angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES; + planner.synchronize(); + MOVE_SERVO(sns_index[e], sns_angles[angle_index]); + safe_delay(500); + } + + void lower_nozzle(const uint8_t e) { _move_nozzle_servo(e, 0); } + void raise_nozzle(const uint8_t e) { _move_nozzle_servo(e, 1); } + + #else + + void move_nozzle_servo(const uint8_t angle_index) { + planner.synchronize(); + MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, servo_angles[SWITCHING_NOZZLE_SERVO_NR][angle_index]); + safe_delay(500); + } + + #endif + +#endif // SWITCHING_NOZZLE + +inline void _line_to_current(const AxisEnum fr_axis, const float fscale=1) { + line_to_current_position(planner.settings.max_feedrate_mm_s[fr_axis] * fscale); +} +inline void slow_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.5f); } +inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis); } + +#if ENABLED(MAGNETIC_PARKING_EXTRUDER) + + float parkingposx[2], // M951 R L + parkinggrabdistance, // M951 I + parkingslowspeed, // M951 J + parkinghighspeed, // M951 H + parkingtraveldistance, // M951 D + compensationmultiplier; + + inline void magnetic_parking_extruder_tool_change(const uint8_t new_tool) { + + const float oldx = current_position.x, + 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 (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 + * + * Steps: + * 1. Move high speed to park position of new extruder + * 2. Move to couple position of new extruder (this also discouple the old extruder) + * 3. Move to park position of new extruder + * 4. Move high speed to approach park position of old extruder + * 5. Move to park position of old extruder + * 6. Move to starting position + */ + + // STEP 1 + + current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; + + 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(); + + // STEP 2 + + current_position.x = grabpos + offsetcompensation; + + 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(); + + // Delay before moving tool, to allow magnetic coupling + gcode.dwell(150); + + // STEP 3 + + current_position.x = mpe_settings.parking_xpos[new_tool] + offsetcompensation; + + 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(); + + // STEP 4 + + current_position.x = mpe_settings.parking_xpos[active_extruder] + (active_extruder == 0 ? MPE_TRAVEL_DISTANCE : -MPE_TRAVEL_DISTANCE) + offsetcompensation; + + 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(); + + // STEP 5 + + current_position.x = mpe_settings.parking_xpos[active_extruder] + offsetcompensation; + + 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(); + + // STEP 6 + + current_position.x = oldx; + + 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(); + + DEBUG_ECHOLNPGM("Autopark done."); + } + +#elif ENABLED(PARKING_EXTRUDER) + + void pe_solenoid_init() { + LOOP_LE_N(n, 1) + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + pe_activate_solenoid(n); + #else + pe_deactivate_solenoid(n); + #endif + } + + void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state) { + switch (extruder_num) { + case 1: OUT_WRITE(SOL1_PIN, state); break; + default: OUT_WRITE(SOL0_PIN, state); break; + } + #if PARKING_EXTRUDER_SOLENOIDS_DELAY > 0 + gcode.dwell(PARKING_EXTRUDER_SOLENOIDS_DELAY); + #endif + } + + inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) { + if (!no_move) { + + constexpr float parkingposx[] = PARKING_EXTRUDER_PARKING_X; + + #if HAS_HOTEND_OFFSET + const float x_offset = hotend_offset[active_extruder].x; + #else + constexpr float x_offset = 0; + #endif + + const float midpos = (parkingposx[0] + parkingposx[1]) * 0.5f + x_offset, + grabpos = parkingposx[new_tool] + (new_tool ? PARKING_EXTRUDER_GRAB_DISTANCE : -(PARKING_EXTRUDER_GRAB_DISTANCE)) + x_offset; + + /** + * 1. Move to park position of old extruder + * 2. Disengage magnetic field, wait for delay + * 3. Move near new extruder + * 4. Engage magnetic field for new extruder + * 5. Move to parking incl. offset of new extruder + * 6. Lower Z-Axis + */ + + // STEP 1 + + DEBUG_POS("Start PE Tool-Change", current_position); + + current_position.x = parkingposx[active_extruder] + x_offset; + + DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder)); + DEBUG_POS("Moving ParkPos", current_position); + + fast_line_to_current(X_AXIS); + + // STEP 2 + + planner.synchronize(); + 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 + + 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(); + 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); + + // STEP 5 + + current_position.x = grabpos + (new_tool ? -10 : 10); + fast_line_to_current(X_AXIS); + + current_position.x = grabpos; + + 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); + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("(6) Move midway between hotends", current_position); + + fast_line_to_current(X_AXIS); + planner.synchronize(); // Always sync the final move + + DEBUG_POS("PE Tool-Change done.", current_position); + } + else { // nomove == true + // Only engage magnetic field for new extruder + pe_activate_solenoid(new_tool); + // Just save power for inverted magnets + TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder)); + } + } + +#endif // PARKING_EXTRUDER + +#if ENABLED(SWITCHING_TOOLHEAD) + + inline void swt_lock(const bool locked=true) { + const uint16_t swt_angles[2] = SWITCHING_TOOLHEAD_SERVO_ANGLES; + MOVE_SERVO(SWITCHING_TOOLHEAD_SERVO_NR, swt_angles[locked ? 0 : 1]); + } + + void swt_init() { swt_lock(); } + + inline void switching_toolhead_tool_change(const uint8_t new_tool, bool no_move/*=false*/) { + if (no_move) return; + + constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS; + const float placexpos = toolheadposx[active_extruder], + grabxpos = toolheadposx[new_tool]; + + /** + * 1. Move to switch position of current toolhead + * 2. Unlock tool and drop it in the dock + * 3. Move to the new toolhead + * 4. Grab and lock the new toolhead + */ + + // 1. Move to switch position of current toolhead + + DEBUG_POS("Start ST Tool-Change", current_position); + + current_position.x = placexpos; + + 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); + + 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(); + DEBUG_ECHOLNPGM("(2) Unlock and Place Toolhead"); + swt_lock(false); + safe_delay(500); + + current_position.y = SWITCHING_TOOLHEAD_Y_POS; + DEBUG_POS("Move Y SwitchPos", current_position); + slow_line_to_current(Y_AXIS); + + // Wait for move to complete, then another 0.2s + planner.synchronize(); + safe_delay(200); + + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; + 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; + + 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); + + 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; + + 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 + planner.synchronize(); + safe_delay(200); + swt_lock(); + safe_delay(500); + + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; + 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 + + DEBUG_POS("ST Tool-Change done.", current_position); + } + +#elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) + + inline void magnetic_switching_toolhead_tool_change(const uint8_t new_tool, bool no_move/*=false*/) { + if (no_move) return; + + constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS, + toolheadclearx[] = SWITCHING_TOOLHEAD_X_SECURITY; + + const float placexpos = toolheadposx[active_extruder], + placexclear = toolheadclearx[active_extruder], + grabxpos = toolheadposx[new_tool], + grabxclear = toolheadclearx[new_tool]; + + /** + * 1. Move to switch position of current toolhead + * 2. Release and place toolhead in the dock + * 3. Move to the new toolhead + * 4. Grab the new toolhead and move to security 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; + + 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; + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move X SwitchPos + Security", current_position); + + fast_line_to_current(X_AXIS); + + current_position.y = SWITCHING_TOOLHEAD_Y_POS; + + DEBUG_SYNCHRONIZE(); + DEBUG_POS("Move Y SwitchPos", current_position); + + fast_line_to_current(Y_AXIS); + + current_position.x = placexpos; + + 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 + + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(2) Release and Place Toolhead"); + + current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; + 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; + + 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 + + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(3) Move to new toolhead position"); + + current_position.x = grabxpos; + 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 + + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(4) Grab new toolhead, move to security position"); + + current_position.y = SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_RELEASE; + 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; + + 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) + #if SWITCHING_TOOLHEAD_PRIME_MM + current_position.e += SWITCHING_TOOLHEAD_PRIME_MM; + planner.buffer_line(current_position, MMM_TO_MMS(SWITCHING_TOOLHEAD_PRIME_FEEDRATE), new_tool); + #endif + #if SWITCHING_TOOLHEAD_RETRACT_MM + current_position.e -= SWITCHING_TOOLHEAD_RETRACT_MM; + planner.buffer_line(current_position, MMM_TO_MMS(SWITCHING_TOOLHEAD_RETRACT_FEEDRATE), new_tool); + #endif + #else + planner.synchronize(); + safe_delay(100); // Give switch time to settle + #endif + + current_position.x = grabxclear; + 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; + 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 + + DEBUG_POS("MST Tool-Change done.", current_position); + } + +#elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + + inline void est_activate_solenoid() { OUT_WRITE(SOL0_PIN, HIGH); } + inline void est_deactivate_solenoid() { OUT_WRITE(SOL0_PIN, LOW); } + void est_init() { est_activate_solenoid(); } + + inline void em_switching_toolhead_tool_change(const uint8_t new_tool, bool no_move) { + if (no_move) return; + + constexpr float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS; + const float placexpos = toolheadposx[active_extruder], + grabxpos = toolheadposx[new_tool]; + const xyz_pos_t &hoffs = hotend_offset[active_extruder]; + + /** + * 1. Raise Z-Axis to give enough clearance + * 2. Move to position near active extruder parking + * 3. Move gently to park position of active extruder + * 4. Disengage magnetic field, wait for delay + * 5. Leave extruder and move to position near new extruder parking + * 6. Move gently to park position of new extruder + * 7. Engage magnetic field for new extruder parking + * 8. Unpark extruder + * 9. Apply Z hotend offset to 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; + DEBUG_POS("(1) Raise Z-Axis ", current_position); + fast_line_to_current(Z_AXIS); + + // 2. Move to position near active extruder parking + + 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 + + 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); + + // 4. Disengage magnetic field, wait for delay + + planner.synchronize(); + DEBUG_ECHOLNPGM("(4) Disengage magnet"); + est_deactivate_solenoid(); + + // 5. Leave extruder and move to position near new extruder parking + + 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); + current_position.set(hoffs.x + grabxpos, + hoffs.y + SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR); + fast_line_to_current(X_AXIS); + + // 6. Move gently to park position of new extruder + + current_position.y -= SWITCHING_TOOLHEAD_Y_CLEAR; + if (DEBUGGING(LEVELING)) { + planner.synchronize(); + DEBUG_ECHOLNPGM("(6) Move near new extruder"); + } + slow_line_to_current(Y_AXIS); + + // 7. Engage magnetic field for new extruder parking + + DEBUG_SYNCHRONIZE(); + DEBUG_ECHOLNPGM("(7) Engage magnetic field"); + est_activate_solenoid(); + + // 8. Unpark extruder + + current_position.y += SWITCHING_TOOLHEAD_Y_CLEAR; + 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 + + DEBUG_POS("(9) Applying Z-offset", current_position); + current_position.z += hoffs.z - hotend_offset[new_tool].z; + + DEBUG_POS("EMST Tool-Change done.", current_position); + } + +#endif // ELECTROMAGNETIC_SWITCHING_TOOLHEAD + +#if EXTRUDERS + inline void invalid_extruder_error(const uint8_t e) { + SERIAL_ECHO_START(); + SERIAL_CHAR('T'); SERIAL_ECHO(int(e)); + SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(STR_INVALID_EXTRUDER); + } +#endif + +#if ENABLED(DUAL_X_CARRIAGE) + + inline void dualx_tool_change(const uint8_t new_tool, bool &no_move) { + + 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); + if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE + && IsRunning() && !no_move + && (delayed_move_time || current_position.x != xhome) + ) { + + DEBUG_ECHOLNPAIR("MoveX to ", xhome); + + // Park old head + current_position.x = xhome; + line_to_current_position(planner.settings.max_feedrate_mm_s[X_AXIS]); + planner.synchronize(); + } + + // Activate the new extruder ahead of calling set_axis_is_at_home! + active_extruder = new_tool; + + // This function resets the max/min values - the current position may be overwritten below. + set_axis_is_at_home(X_AXIS); + + DEBUG_POS("New Extruder", current_position); + + switch (dual_x_carriage_mode) { + case DXC_FULL_CONTROL_MODE: + // New current position is the position of the activated extruder + current_position.x = inactive_extruder_x_pos; + // Save the inactive extruder's position (from the old current_position) + inactive_extruder_x_pos = destination.x; + break; + case DXC_AUTO_PARK_MODE: + // record current raised toolhead position for use by unpark + raised_parked_position = current_position; + active_extruder_parked = true; + delayed_move_time = 0; + break; + default: + break; + } + + DEBUG_ECHOLNPAIR("Active extruder parked: ", active_extruder_parked ? "yes" : "no"); + DEBUG_POS("New extruder (parked)", current_position); + } + +#endif // DUAL_X_CARRIAGE + +/** + * Prime active tool using TOOLCHANGE_FILAMENT_SWAP settings + */ +#if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + +void tool_change_prime() { + if (toolchange_settings.extra_prime > 0 + && TERN(PREVENT_COLD_EXTRUSION, !thermalManager.targetTooColdToExtrude(active_extruder), 1) + ) { + destination = current_position; // Remember the old position + + const bool ok = TERN1(TOOLCHANGE_PARK, all_axes_homed() && toolchange_settings.enable_park); + + #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 + // Store and stop fan. Restored on any exit. + REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); + #endif + + // Z raise + if (ok) { + // Do a small lift to avoid the workpiece in the move back (below) + current_position.z += toolchange_settings.z_raise; + #if HAS_SOFTWARE_ENDSTOPS + NOMORE(current_position.z, soft_endstop.max.z); + #endif + fast_line_to_current(Z_AXIS); + planner.synchronize(); + } + + // Park + #if ENABLED(TOOLCHANGE_PARK) + if (ok) { + TERN(TOOLCHANGE_PARK_Y_ONLY,,current_position.x = toolchange_settings.change_point.x); + TERN(TOOLCHANGE_PARK_X_ONLY,,current_position.y = toolchange_settings.change_point.y); + planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), active_extruder); + planner.synchronize(); + } + #endif + + // Prime (All distances are added and slowed down to ensure secure priming in all circumstances) + unscaled_e_move(toolchange_settings.swap_length + toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); + + // Cutting retraction + #if TOOLCHANGE_FS_WIPE_RETRACT + unscaled_e_move(-(TOOLCHANGE_FS_WIPE_RETRACT), MMM_TO_MMS(toolchange_settings.retract_speed)); + #endif + + // Cool down with fan + #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 + thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; + gcode.dwell(toolchange_settings.fan_time * 1000); + thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; + #endif + + // Move back + #if ENABLED(TOOLCHANGE_PARK) + if (ok) { + #if ENABLED(TOOLCHANGE_NO_RETURN) + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + #else + do_blocking_move_to(destination, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE)); + #endif + } + #endif + + // Cutting recover + unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); + + planner.synchronize(); + current_position.e = destination.e; + sync_plan_position_e(); // Resume at the old E position + } +} +#endif + +/** + * Perform a tool-change, which may result in moving the + * previous tool out of the way and the new tool into place. + */ +void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { + + if (TERN0(MAGNETIC_SWITCHING_TOOLHEAD, new_tool == active_extruder)) + return; + + #if ENABLED(MIXING_EXTRUDER) + + UNUSED(no_move); + + if (new_tool >= MIXING_VIRTUAL_TOOLS) + return invalid_extruder_error(new_tool); + + #if MIXING_VIRTUAL_TOOLS > 1 + // T0-Tnnn: Switch virtual tool by changing the index to the mix + mixer.T(new_tool); + #endif + + #elif ENABLED(PRUSA_MMU2) + + UNUSED(no_move); + + mmu2.tool_change(new_tool); + + #elif EXTRUDERS == 0 + + // Nothing to do + UNUSED(new_tool); UNUSED(no_move); + + #elif EXTRUDERS < 2 + + UNUSED(no_move); + + if (new_tool) invalid_extruder_error(new_tool); + return; + + #elif HAS_MULTI_EXTRUDER + + planner.synchronize(); + + #if ENABLED(DUAL_X_CARRIAGE) // Only T0 allowed if the Printer is in DXC_DUPLICATION_MODE or DXC_MIRRORED_MODE + if (new_tool != 0 && dxc_is_duplicating()) + return invalid_extruder_error(new_tool); + #endif + + if (new_tool >= EXTRUDERS) + return invalid_extruder_error(new_tool); + + if (!no_move && homing_needed()) { + no_move = true; + DEBUG_ECHOLNPGM("No move (not homed)"); + } + + TERN_(HAS_LCD_MENU, if (!no_move) ui.return_to_status()); + + #if ENABLED(DUAL_X_CARRIAGE) + const bool idex_full_control = dual_x_carriage_mode == DXC_FULL_CONTROL_MODE; + #else + constexpr bool idex_full_control = false; + #endif + + const uint8_t old_tool = active_extruder; + const bool can_move_away = !no_move && !idex_full_control; + + #if HAS_LEVELING + // Set current position to the physical position + TEMPORARY_BED_LEVELING_STATE(false); + #endif + + // First tool priming. To prime again, reboot the machine. + #if BOTH(TOOLCHANGE_FILAMENT_SWAP, TOOLCHANGE_FS_PRIME_FIRST_USED) + static bool first_tool_is_primed = false; + if (new_tool == old_tool && !first_tool_is_primed && enable_first_prime) { + tool_change_prime(); + first_tool_is_primed = true; + toolchange_extruder_ready[old_tool] = true; // Primed and initialized + } + #endif + + if (new_tool != old_tool) { + destination = current_position; + + #if BOTH(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0 + // Store and stop fan. Restored on any exit. + REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); + #endif + + // Z raise before retraction + #if ENABLED(TOOLCHANGE_ZRAISE_BEFORE_RETRACT) && DISABLED(SWITCHING_NOZZLE) + if (can_move_away && TERN1(TOOLCHANGE_PARK, toolchange_settings.enable_park)) { + // Do a small lift to avoid the workpiece in the move back (below) + current_position.z += toolchange_settings.z_raise; + #if HAS_SOFTWARE_ENDSTOPS + NOMORE(current_position.z, soft_endstop.max.z); + #endif + fast_line_to_current(Z_AXIS); + planner.synchronize(); + } + #endif + + // Unload / Retract + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + const bool should_swap = can_move_away && toolchange_settings.swap_length, + too_cold = TERN0(PREVENT_COLD_EXTRUSION, + !DEBUGGING(DRYRUN) && (thermalManager.targetTooColdToExtrude(old_tool) || thermalManager.targetTooColdToExtrude(new_tool)) + ); + if (should_swap) { + if (too_cold) { + SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD); + if (ENABLED(SINGLENOZZLE)) { active_extruder = new_tool; return; } + } + else { + #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) + // For first new tool, change without unloading the old. 'Just prime/init the new' + if (first_tool_is_primed) + unscaled_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed)); + first_tool_is_primed = true; // The first new tool will be primed by toolchanging + #endif + } + } + #endif + + TERN_(SWITCHING_NOZZLE_TWO_SERVOS, raise_nozzle(old_tool)); + + REMEMBER(fr, feedrate_mm_s, XY_PROBE_FEEDRATE_MM_S); + + #if HAS_SOFTWARE_ENDSTOPS + #if HAS_HOTEND_OFFSET + #define _EXT_ARGS , old_tool, new_tool + #else + #define _EXT_ARGS + #endif + update_software_endstops(X_AXIS _EXT_ARGS); + #if DISABLED(DUAL_X_CARRIAGE) + update_software_endstops(Y_AXIS _EXT_ARGS); + update_software_endstops(Z_AXIS _EXT_ARGS); + #endif + #endif + + #if DISABLED(TOOLCHANGE_ZRAISE_BEFORE_RETRACT) && DISABLED(SWITCHING_NOZZLE) + if (can_move_away && TERN1(TOOLCHANGE_PARK, toolchange_settings.enable_park)) { + // Do a small lift to avoid the workpiece in the move back (below) + current_position.z += toolchange_settings.z_raise; + #if HAS_SOFTWARE_ENDSTOPS + NOMORE(current_position.z, soft_endstop.max.z); + #endif + fast_line_to_current(Z_AXIS); + } + #endif + + // Toolchange park + #if ENABLED(TOOLCHANGE_PARK) && DISABLED(SWITCHING_NOZZLE) + if (can_move_away && toolchange_settings.enable_park) { + TERN(TOOLCHANGE_PARK_Y_ONLY,,current_position.x = toolchange_settings.change_point.x); + TERN(TOOLCHANGE_PARK_X_ONLY,,current_position.y = toolchange_settings.change_point.y); + planner.buffer_line(current_position, MMM_TO_MMS(TOOLCHANGE_PARK_XY_FEEDRATE), old_tool); + planner.synchronize(); + } + #endif + + #if HAS_HOTEND_OFFSET + xyz_pos_t diff = hotend_offset[new_tool] - hotend_offset[old_tool]; + TERN_(DUAL_X_CARRIAGE, diff.x = 0); + #else + constexpr xyz_pos_t diff{0}; + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + dualx_tool_change(new_tool, no_move); + #elif ENABLED(PARKING_EXTRUDER) // Dual Parking extruder + parking_extruder_tool_change(new_tool, no_move); + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) // Magnetic Parking extruder + magnetic_parking_extruder_tool_change(new_tool); + #elif ENABLED(SWITCHING_TOOLHEAD) // Switching Toolhead + switching_toolhead_tool_change(new_tool, no_move); + #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) // Magnetic Switching Toolhead + magnetic_switching_toolhead_tool_change(new_tool, no_move); + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) // Magnetic Switching ToolChanger + em_switching_toolhead_tool_change(new_tool, no_move); + #elif ENABLED(SWITCHING_NOZZLE) && !SWITCHING_NOZZLE_TWO_SERVOS // Switching Nozzle (single servo) + // Raise by a configured distance to avoid workpiece, except with + // SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead. + if (!no_move) { + const float newz = current_position.z + _MAX(-diff.z, 0.0); + + // Check if Z has space to compensate at least z_offset, and if not, just abort now + const float maxz = _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS); + if (newz > maxz) return; + + current_position.z = _MIN(newz + toolchange_settings.z_raise, maxz); + fast_line_to_current(Z_AXIS); + } + move_nozzle_servo(new_tool); + #endif + + // Set the new active extruder + if (DISABLED(DUAL_X_CARRIAGE)) active_extruder = new_tool; + + // The newly-selected extruder XYZ is actually at... + DEBUG_ECHOLNPAIR("Offset Tool XYZ by { ", diff.x, ", ", diff.y, ", ", diff.z, " }"); + current_position += diff; + + // Tell the planner the new "current position" + sync_plan_position(); + + #if ENABLED(DELTA) + //LOOP_XYZ(i) update_software_endstops(i); // or modify the constrain function + const bool safe_to_move = current_position.z < delta_clip_start_height - 1; + #else + constexpr bool safe_to_move = true; + #endif + + // Return to position and lower again + const bool should_move = safe_to_move && !no_move && IsRunning(); + if (should_move) { + + #if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) + singlenozzle_fan_speed[old_tool] = thermalManager.fan_speed[0]; + thermalManager.fan_speed[0] = singlenozzle_fan_speed[new_tool]; + #endif + + #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + singlenozzle_temp[old_tool] = thermalManager.temp_hotend[0].target; + if (singlenozzle_temp[new_tool] && singlenozzle_temp[new_tool] != singlenozzle_temp[old_tool]) { + thermalManager.setTargetHotend(singlenozzle_temp[new_tool], 0); + TERN_(AUTOTEMP, planner.autotemp_update()); + TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); + (void)thermalManager.wait_for_hotend(0, false); // Wait for heating or cooling + } + #endif + + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + if (should_swap && !too_cold) { + + float fr = toolchange_settings.unretract_speed; + + #if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP) + if (!toolchange_extruder_ready[new_tool]) { + toolchange_extruder_ready[new_tool] = true; + fr = toolchange_settings.prime_speed; // Next move is a prime + unscaled_e_move(0, MMM_TO_MMS(fr)); // Init planner with 0 length move + } + #endif + + // Unretract (or Prime) + unscaled_e_move(toolchange_settings.swap_length, MMM_TO_MMS(fr)); + + // Extra Prime + unscaled_e_move(toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); + + // Cutting retraction + #if TOOLCHANGE_FS_WIPE_RETRACT + unscaled_e_move(-(TOOLCHANGE_FS_WIPE_RETRACT), MMM_TO_MMS(toolchange_settings.retract_speed)); + #endif + + // Cool down with fan + #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 + thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = toolchange_settings.fan_speed; + gcode.dwell(toolchange_settings.fan_time * 1000); + thermalManager.fan_speed[TOOLCHANGE_FS_FAN] = 0; + #endif + } + #endif + + // Prevent a move outside physical bounds + #if ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) + // If the original position is within tool store area, go to X origin at once + if (destination.y < SWITCHING_TOOLHEAD_Y_POS + SWITCHING_TOOLHEAD_Y_CLEAR) { + current_position.x = 0; + planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], new_tool); + planner.synchronize(); + } + #else + apply_motion_limits(destination); + #endif + + // Should the nozzle move back to the old position? + if (can_move_away) { + #if ENABLED(TOOLCHANGE_NO_RETURN) + // Just move back down + DEBUG_ECHOLNPGM("Move back Z only"); + + #if ENABLED(TOOLCHANGE_PARK) + if (toolchange_settings.enable_park) + #endif + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + + #else + // Move back to the original (or adjusted) position + 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)); + #else + do_blocking_move_to_xy(destination, planner.settings.max_feedrate_mm_s[X_AXIS]); + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + #endif + + #endif + } + + else DEBUG_ECHOLNPGM("Move back skipped"); + + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + if (should_swap && !too_cold) { + // Cutting recover + unscaled_e_move(toolchange_settings.extra_resume + TOOLCHANGE_FS_WIPE_RETRACT, MMM_TO_MMS(toolchange_settings.unretract_speed)); + current_position.e = 0; + sync_plan_position_e(); // New extruder primed and set to 0 + + // Restart Fan + #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0 + RESTORE(fan); + #endif + } + #endif + + TERN_(DUAL_X_CARRIAGE, active_extruder_parked = false); + } + + #if ENABLED(SWITCHING_NOZZLE) + // Move back down. (Including when the new tool is higher.) + if (!should_move) + do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); + #endif + + TERN_(PRUSA_MMU2, mmu2.tool_change(new_tool)); + + TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool)); + + } // (new_tool != old_tool) + + planner.synchronize(); + + #if ENABLED(EXT_SOLENOID) && DISABLED(PARKING_EXTRUDER) + disable_all_solenoids(); + enable_solenoid_on_active_extruder(); + #endif + + #if ENABLED(MK2_MULTIPLEXER) + if (new_tool >= E_STEPPERS) return invalid_extruder_error(new_tool); + select_multiplexed_stepper(new_tool); + #endif + + #if DO_SWITCH_EXTRUDER + planner.synchronize(); + move_extruder_servo(active_extruder); + #endif + + TERN_(HAS_FANMUX, fanmux_switch(active_extruder)); + + #ifdef EVENT_GCODE_AFTER_TOOLCHANGE + if (!no_move && TERN1(DUAL_X_CARRIAGE, dual_x_carriage_mode == DXC_AUTO_PARK_MODE)) + gcode.process_subcommands_now_P(PSTR(EVENT_GCODE_AFTER_TOOLCHANGE)); + #endif + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_ACTIVE_EXTRUDER, int(active_extruder)); + + #endif // HAS_MULTI_EXTRUDER +} + +#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + + bool extruder_migration() { + + #if ENABLED(PREVENT_COLD_EXTRUSION) + 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 false; + } + + // Migrate to a target or the next extruder + + 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; + } + else if (migration.automode && migration_extruder < migration.last && migration_extruder < EXTRUDERS - 1) + migration_extruder++; + + 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(); + + // Remember position before migration + const float resume_current_e = current_position.e; + + // Migrate the flow + planner.set_flow(migration_extruder, planner.flow_percentage[active_extruder]); + + // Migrate the retracted state + #if ENABLED(FWRETRACT) + fwretract.retracted[migration_extruder] = fwretract.retracted[active_extruder]; + #endif + + // Migrate the temperature to the new hotend + #if HAS_MULTI_HOTEND + thermalManager.setTargetHotend(thermalManager.temp_hotend[active_extruder].target, migration_extruder); + TERN_(AUTOTEMP, planner.autotemp_update()); + TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); + thermalManager.wait_for_hotend(active_extruder); + #endif + + // Migrate Linear Advance K factor to the new extruder + TERN_(LIN_ADVANCE, planner.extruder_advance_K[active_extruder] = planner.extruder_advance_K[migration_extruder]); + + // Perform the tool change + tool_change(migration_extruder); + + // Retract if previously retracted + #if ENABLED(FWRETRACT) + if (fwretract.retracted[active_extruder]) + unscaled_e_move(-fwretract.settings.retract_length, fwretract.settings.retract_feedrate_mm_s); + #endif + + // If no available extruder + if (EXTRUDERS < 2 || active_extruder >= EXTRUDERS - 2 || active_extruder == migration.last) + migration.automode = false; + + migration.in_progress = false; + + current_position.e = resume_current_e; + + 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 new file mode 100644 index 00000000..38347191 --- /dev/null +++ b/Marlin/src/module/tool_change.h @@ -0,0 +1,127 @@ +/** + * 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 "../core/types.h" + +#if HAS_MULTI_EXTRUDER + + typedef struct { + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + float swap_length, extra_prime, extra_resume; + int16_t prime_speed, retract_speed, unretract_speed, fan, fan_speed, fan_time; + #endif + #if ENABLED(TOOLCHANGE_PARK) + bool enable_park; + xy_pos_t change_point; + #endif + float z_raise; + } toolchange_settings_t; + + extern toolchange_settings_t toolchange_settings; + + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + extern void tool_change_prime(); + #endif + + #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) + extern bool enable_first_prime; + #endif + + #if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP) + extern bool toolchange_extruder_ready[EXTRUDERS]; + #endif + + #if ENABLED(TOOLCHANGE_MIGRATION_FEATURE) + typedef struct { + uint8_t target, last; + bool automode, in_progress; + } migration_settings_t; + constexpr migration_settings_t migration_defaults = { 0, 0, false, false }; + extern migration_settings_t migration; + bool extruder_migration(); + #endif +#endif + +#if DO_SWITCH_EXTRUDER + void move_extruder_servo(const uint8_t e); +#endif + +#if ENABLED(SWITCHING_NOZZLE) + #if SWITCHING_NOZZLE_TWO_SERVOS + void lower_nozzle(const uint8_t e); + void raise_nozzle(const uint8_t e); + #else + void move_nozzle_servo(const uint8_t angle_index); + #endif +#endif + +#if ENABLED(PARKING_EXTRUDER) + + #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) + #define PE_MAGNET_ON_STATE !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE + #else + #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE + #endif + + void pe_set_solenoid(const uint8_t extruder_num, const uint8_t state); + + inline void pe_activate_solenoid(const uint8_t extruder_num) { pe_set_solenoid(extruder_num, PE_MAGNET_ON_STATE); } + inline void pe_deactivate_solenoid(const uint8_t extruder_num) { pe_set_solenoid(extruder_num, !PE_MAGNET_ON_STATE); } + + void pe_solenoid_init(); + +#elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + + typedef struct MPESettings { + float parking_xpos[2], // M951 L R + grab_distance; // M951 I + feedRate_t slow_feedrate, // M951 J + fast_feedrate; // M951 H + float travel_distance, // M951 D + compensation_factor; // M951 C + } mpe_settings_t; + + extern mpe_settings_t mpe_settings; + + void mpe_settings_init(); + +#endif + +#if ENABLED(SINGLENOZZLE_STANDBY_TEMP) + extern uint16_t singlenozzle_temp[EXTRUDERS]; +#endif + +#if BOTH(HAS_FAN, SINGLENOZZLE_STANDBY_FAN) + extern uint8_t singlenozzle_fan_speed[EXTRUDERS]; +#endif + +TERN_(ELECTROMAGNETIC_SWITCHING_TOOLHEAD, void est_init()); + +TERN_(SWITCHING_TOOLHEAD, void swt_init()); + +/** + * Perform a tool-change, which may result in moving the + * previous tool out of the way and the new tool into place. + */ +void tool_change(const uint8_t tmp_extruder, bool no_move=false); diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h new file mode 100644 index 00000000..7b559544 --- /dev/null +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -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 . + * + */ +#pragma once + +/** + * 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 https://atbox.tech/ and join to Facebook page E4d@box. + */ + +#if NOT_TARGET(ARDUINO_ARCH_ESP32) + #error "Oops! Select an ESP32 board in 'Tools > Board.'" +#elif EXTRUDERS > 1 || E_STEPPERS > 1 + #error "E4d@box only supports one E Stepper. Comment out this line to continue." +#elif HOTENDS > 2 + #error "E4d@box currently supports only one hotend. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "E4D@BOX" +#define BOARD_WEBSITE_URL "github.com/Exilaus/E4d@box" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Limit Switches +// +#define X_MIN_PIN 34 +#define Y_MIN_PIN 35 +#define Z_MIN_PIN 16 // 15 + +// +// Steppers +// +#define X_STEP_PIN 12 // 34//27 +#define X_DIR_PIN 13 // 35//26 +#define X_ENABLE_PIN 17 // 0//17//25 // used free pin +//#define X_CS_PIN 0 + +#define Y_STEP_PIN 32 // 33 +#define Y_DIR_PIN 33 // 32 +#define Y_ENABLE_PIN X_ENABLE_PIN +//#define Y_CS_PIN 13 + +#define Z_STEP_PIN 25 // 14 +#define Z_DIR_PIN 26 // 12 +#define Z_ENABLE_PIN X_ENABLE_PIN +//#define Z_CS_PIN 5 // SS_PIN + +#define E0_STEP_PIN 27 // 16 +#define E0_DIR_PIN 14 // 17 +#define E0_ENABLE_PIN X_ENABLE_PIN +//#define E0_CS_PIN 21 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 // 4//2//(D8) +#define FAN_PIN 0 // 2//15//13 (D9) +#define HEATER_BED_PIN 15 // 15//0 //(D10) + +// SPI +#define SDSS 5 +#define I2S_STEPPER_STREAM +#define I2S_WS 23 +#define I2S_BCK 22 +#define I2S_DATA 21 diff --git a/Marlin/src/pins/esp32/pins_ESP32.h b/Marlin/src/pins/esp32/pins_ESP32.h new file mode 100644 index 00000000..d54a92b9 --- /dev/null +++ b/Marlin/src/pins/esp32/pins_ESP32.h @@ -0,0 +1,86 @@ +/** + * 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 + +/** + * Espressif ESP32 (Tensilica Xtensa LX6) pin assignments + */ + +#if NOT_TARGET(ARDUINO_ARCH_ESP32) + "Oops! Select an ESP32 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Espressif ESP32" + +// +// I2S (steppers & other output-only pins) +// +#define I2S_STEPPER_STREAM +#define I2S_WS 25 +#define I2S_BCK 26 +#define I2S_DATA 27 + +// +// Limit Switches +// +#define X_MIN_PIN 34 +#define Y_MIN_PIN 35 +#define Z_MIN_PIN 15 + +// +// Steppers +// +#define X_STEP_PIN 128 +#define X_DIR_PIN 129 +#define X_ENABLE_PIN 130 +//#define X_CS_PIN 0 + +#define Y_STEP_PIN 131 +#define Y_DIR_PIN 132 +#define Y_ENABLE_PIN 133 +//#define Y_CS_PIN 13 + +#define Z_STEP_PIN 134 +#define Z_DIR_PIN 135 +#define Z_ENABLE_PIN 136 +//#define Z_CS_PIN 5 // SS_PIN + +#define E0_STEP_PIN 137 +#define E0_DIR_PIN 138 +#define E0_ENABLE_PIN 139 +//#define E0_CS_PIN 21 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define FAN_PIN 13 +#define HEATER_BED_PIN 4 + +// SPI +#define SDSS 5 diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h new file mode 100644 index 00000000..0457b0af --- /dev/null +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -0,0 +1,110 @@ +/** + * 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 + +/** + * MRR ESPA pin assignments + * MRR ESPA is a 3D printer control board based on the ESP32 microcontroller. + * Supports 4 stepper drivers, heated bed, single hotend. + */ + +#if NOT_TARGET(ARDUINO_ARCH_ESP32) + #error "Oops! Select an ESP32 board in 'Tools > Board.'" +#elif EXTRUDERS > 1 || E_STEPPERS > 1 + #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." +#elif HOTENDS > 1 + #error "MRR ESPA currently supports only one hotend. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MRR ESPA" +#define BOARD_WEBSITE_URL "github.com/maplerainresearch/MRR_ESPA" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Disable I2S stepper stream +// +#ifdef I2S_STEPPER_STREAM + #undef I2S_STEPPER_STREAM +#endif +#define I2S_WS -1 +#define I2S_BCK -1 +#define I2S_DATA -1 + +// +// Limit Switches +// +#define X_STOP_PIN 34 +#define Y_STOP_PIN 35 +#define Z_STOP_PIN 15 + +// +// Steppers +// +#define X_STEP_PIN 27 +#define X_DIR_PIN 26 +#define X_ENABLE_PIN 25 +//#define X_CS_PIN 21 + +#define Y_STEP_PIN 33 +#define Y_DIR_PIN 32 +#define Y_ENABLE_PIN X_ENABLE_PIN +//#define Y_CS_PIN 22 + +#define Z_STEP_PIN 14 +#define Z_DIR_PIN 12 +#define Z_ENABLE_PIN X_ENABLE_PIN +//#define Z_CS_PIN 5 // SS_PIN + +#define E0_STEP_PIN 16 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN X_ENABLE_PIN +//#define E0_CS_PIN 21 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define FAN_PIN 13 +#define HEATER_BED_PIN 4 + +// +// MicroSD card +// +#define MOSI_PIN 23 +#define MISO_PIN 19 +#define SCK_PIN 18 +#define SDSS 5 +#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers + +// Hardware serial pins +// Add the following to Configuration.h or Configuration_adv.h to assign +// specific pins to hardware Serial1. +// Note: Serial2 can be defined using HARDWARE_SERIAL2_RX and HARDWARE_SERIAL2_TX but +// MRR ESPA does not have enough spare pins for such reassignment. +//#define HARDWARE_SERIAL1_RX 21 +//#define HARDWARE_SERIAL1_TX 22 diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h new file mode 100644 index 00000000..95f761f2 --- /dev/null +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -0,0 +1,165 @@ +/** + * 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 + +/** + * MRR ESPE pin assignments + * MRR ESPE is a 3D printer control board based on the ESP32 microcontroller. + * Supports 5 stepper drivers (using I2S stepper stream), heated bed, + * single hotend, and LCD controller. + */ + +#if NOT_TARGET(ARDUINO_ARCH_ESP32) + #error "Oops! Select an ESP32 board in 'Tools > Board.'" +#elif EXTRUDERS > 2 || E_STEPPERS > 2 + #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." +#elif HOTENDS > 1 + #error "MRR ESPE currently supports only one hotend. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MRR ESPE" +#define BOARD_WEBSITE_URL "github.com/maplerainresearch/MRR_ESPE" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Limit Switches +// +#define X_STOP_PIN 35 +#define Y_STOP_PIN 32 +#define Z_STOP_PIN 33 + +// +// Enable I2S stepper stream +// +#undef I2S_STEPPER_STREAM +#define I2S_STEPPER_STREAM + +#undef LIN_ADVANCE // Currently, I2S stream does not work with linear advance + +#define I2S_WS 26 +#define I2S_BCK 25 +#define I2S_DATA 27 + +// +// Steppers +// +#define X_STEP_PIN 129 +#define X_DIR_PIN 130 +#define X_ENABLE_PIN 128 +//#define X_CS_PIN 21 + +#define Y_STEP_PIN 132 +#define Y_DIR_PIN 133 +#define Y_ENABLE_PIN 131 +//#define Y_CS_PIN 22 + +#define Z_STEP_PIN 135 +#define Z_DIR_PIN 136 +#define Z_ENABLE_PIN 134 +//#define Z_CS_PIN 5 // SS_PIN + +#define E0_STEP_PIN 138 +#define E0_DIR_PIN 139 +#define E0_ENABLE_PIN 137 +//#define E0_CS_PIN 21 + +#define E1_STEP_PIN 141 +#define E1_DIR_PIN 142 +#define E1_ENABLE_PIN 140 +//#define E1_CS_PIN 22 + +#define Z2_STEP_PIN 141 +#define Z2_DIR_PIN 142 +#define Z2_ENABLE_PIN 140 +//#define Z2_CS_PIN 5 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_1_PIN 34 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 145 // 2 +#define FAN_PIN 146 // 15 +#define HEATER_BED_PIN 144 // 4 + +#define CONTROLLER_FAN_PIN 147 +//#define E0_AUTO_FAN_PIN 148 // need to update Configuration_adv.h @section extruder +//#define E1_AUTO_FAN_PIN 149 // need to update Configuration_adv.h @section extruder +#define FAN1_PIN 149 + +// +// MicroSD card +// +#define MOSI_PIN 23 +#define MISO_PIN 19 +#define SCK_PIN 18 +#define SDSS 5 +#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if HAS_MARLINUI_U8GLIB + + #define LCD_PINS_RS 13 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + + #if ENABLED(CR10_STOCKDISPLAY) + + #define BEEPER_PIN 151 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define BEEPER_PIN 151 + + //#define LCD_PINS_D5 150 + //#define LCD_PINS_D6 152 + //#define LCD_PINS_D7 153 + + #else + + #error "Only CR10_STOCKDISPLAY and REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER are currently supported. Comment out this line to continue." + + #endif + + #define BTN_EN1 0 + #define BTN_EN2 12 + #define BTN_ENC 14 + +#endif // HAS_MARLINUI_U8GLIB + +// Hardware serial pins +// Add the following to Configuration.h or Configuration_adv.h to assign +// specific pins to hardware Serial1 and Serial2. +// Note: Serial2 can be defined using HARDWARE_SERIAL2_RX and HARDWARE_SERIAL2_TX but +// MRR ESPA does not have enough spare pins for such reassignment. +//#define HARDWARE_SERIAL1_RX 21 +//#define HARDWARE_SERIAL1_TX 22 +//#define HARDWARE_SERIAL2_RX 2 +//#define HARDWARE_SERIAL2_TX 4 diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h new file mode 100644 index 00000000..002d2ebd --- /dev/null +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -0,0 +1,635 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.4 (or v1.3) pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Hotend, Fan, Bed) + * RAMPS_14_EEB (Hotend0, Hotend1, Bed) + * RAMPS_14_EFF (Hotend, Fan0, Fan1) + * RAMPS_14_EEF (Hotend0, Hotend1, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + * + * RAMPS_13_EFB (Hotend, Fan, Bed) + * RAMPS_13_EEB (Hotend0, Hotend1, Bed) + * RAMPS_13_EFF (Hotend, Fan0, Fan1) + * RAMPS_13_EEF (Hotend0, Hotend1, Fan) + * RAMPS_13_SF (Spindle, Controller Fan) + * + * Other pins_MYBOARD.h files may override these defaults + * + * Differences between + * RAMPS_13 | RAMPS_14 + * 7 | 11 + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "RAMPS 1.4" +#endif + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +#define IS_RAMPS_EFB + +// +// Servos +// +#ifdef IS_RAMPS_13 + #define SERVO0_PIN 7 // RAMPS_13 // Will conflict with BTN_EN2 on LCD_I2C_VIKI +#else + #define SERVO0_PIN 11 +#endif +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#ifndef SERVO3_PIN + #define SERVO3_PIN 4 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HAS_MULTI_HOTEND + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_D8_PIN + #define RAMPS_D8_PIN 8 +#endif +#ifndef RAMPS_D9_PIN + #define RAMPS_D9_PIN 9 +#endif +#ifndef RAMPS_D10_PIN + #define RAMPS_D10_PIN 10 +#endif + +#define HEATER_0_PIN RAMPS_D10_PIN + +#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed + #define FAN_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN RAMPS_D9_PIN + #define FAN_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #define FAN1_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_SF) // Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN +#else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN + #if HOTENDS == 1 + #define FAN1_PIN MOSFET_D_PIN + #else + #define HEATER_1_PIN MOSFET_D_PIN + #endif +#endif + +#ifndef FAN_PIN + #define FAN_PIN 4 // IO pin. Buffer needed +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif + +// define digital pin 4 for the filament runout sensor. Use the RAMPS 1.4 digital input 4 on the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 4 +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) + #if NUM_SERVOS <= 1 // Prefer the servo connector + #define CASE_LIGHT_PIN 6 // Hardware PWM + #elif HAS_FREE_AUX2_PINS // try to use AUX 2 + #define CASE_LIGHT_PIN 44 // Hardware PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) + #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // Prefer the servo connector + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_DIR_PIN 5 + #elif HAS_FREE_AUX2_PINS // try to use AUX 2 + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_DIR_PIN 65 + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#ifndef E_MUX0_PIN + #define E_MUX0_PIN 40 // Z_CS_PIN +#endif +#ifndef E_MUX1_PIN + #define E_MUX1_PIN 42 // E0_CS_PIN +#endif +#ifndef E_MUX2_PIN + #define E_MUX2_PIN 44 // E1_CS_PIN +#endif + +/** + * Default pins for TMC software SPI + */ +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 66 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 44 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 64 + #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 Serial1 + //#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 + */ + + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN 40 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN 63 + #endif + #ifndef X2_SERIAL_TX_PIN + #define X2_SERIAL_TX_PIN -1 + #endif + #ifndef X2_SERIAL_RX_PIN + #define X2_SERIAL_RX_PIN -1 + #endif + + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN 59 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN 64 + #endif + #ifndef Y2_SERIAL_TX_PIN + #define Y2_SERIAL_TX_PIN -1 + #endif + #ifndef Y2_SERIAL_RX_PIN + #define Y2_SERIAL_RX_PIN -1 + #endif + + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN 42 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN 65 + #endif + #ifndef Z2_SERIAL_TX_PIN + #define Z2_SERIAL_TX_PIN -1 + #endif + #ifndef Z2_SERIAL_RX_PIN + #define Z2_SERIAL_RX_PIN -1 + #endif + + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN 44 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN 66 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN -1 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN -1 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN -1 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN -1 + #endif + #ifndef E3_SERIAL_TX_PIN + #define E3_SERIAL_TX_PIN -1 + #endif + #ifndef E3_SERIAL_RX_PIN + #define E3_SERIAL_RX_PIN -1 + #endif + #ifndef E4_SERIAL_TX_PIN + #define E4_SERIAL_TX_PIN -1 + #endif + #ifndef E4_SERIAL_RX_PIN + #define E4_SERIAL_RX_PIN -1 + #endif + #ifndef E5_SERIAL_TX_PIN + #define E5_SERIAL_TX_PIN -1 + #endif + #ifndef E5_SERIAL_RX_PIN + #define E5_SERIAL_RX_PIN -1 + #endif + #ifndef E6_SERIAL_TX_PIN + #define E6_SERIAL_TX_PIN -1 + #endif + #ifndef E6_SERIAL_RX_PIN + #define E6_SERIAL_RX_PIN -1 + #endif + #ifndef E7_SERIAL_TX_PIN + #define E7_SERIAL_TX_PIN -1 + #endif + #ifndef E7_SERIAL_RX_PIN + #define E7_SERIAL_RX_PIN -1 + #endif +#endif + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if HAS_WIRED_LCD + + // + // LCD Display output pins + // + #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 + + #elif BOTH(NEWPANEL, PANEL_ONE) + + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 65 + #define LCD_PINS_D5 66 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 64 + + #else + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 25 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 37 + #endif + + #elif ENABLED(ZONESTAR_LCD) + + #define LCD_PINS_RS 64 + #define LCD_PINS_ENABLE 44 + #define LCD_PINS_D4 63 + #define LCD_PINS_D5 40 + #define LCD_PINS_D6 42 + #define LCD_PINS_D7 65 + + #else + + #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #define LCD_PINS_DC 25 // Set as output on init + #define LCD_PINS_RS 27 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS 16 + #define DOGLCD_MOSI 17 + #define DOGLCD_SCK 23 + #define DOGLCD_A0 LCD_PINS_DC + #else + #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 + #endif + + #define LCD_PINS_D7 29 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + #endif + + #endif + + #if DISABLED(NEWPANEL) + // 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 + #endif + + #endif + + // + // LCD Display input pins + // + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #if ENABLED(CR10_STOCKDISPLAY) + #define BTN_EN1 17 + #define BTN_EN2 23 + #else + #define BTN_EN1 31 + #define BTN_EN2 33 + #endif + + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #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 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS SDSS + #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_ENC -1 + + #define LCD_SDSS SDSS + #define SD_DETECT_PIN 49 + + #elif ANY(VIKI2, miniVIKI) + + #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define LCD_SCREEN_ROT_180 + + #define BEEPER_PIN 33 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + #define KILL_PIN 31 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + + #define BEEPER_PIN 23 + #define LCD_BACKLIGHT_PIN 33 + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + + #define LCD_SDSS SDSS + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 27 + #define DOGLCD_CS 25 + + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BEEPER_PIN 37 + // not connected to a pin + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 64 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // not connected to a pin + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 64 + + #elif ENABLED(ZONESTAR_LCD) + + #define ADC_KEYPAD_PIN 12 + + #elif ENABLED(AZSMZ_12864) + + // Pins only defined for RAMPS_SMART currently + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // Buttons are directly attached to AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #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 + #else + #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 + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h new file mode 100644 index 00000000..78e74266 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.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 + +/** + * AZSMZ MINI pin assignments + */ + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "AZSMZ MINI" + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define Y_MIN_PIN P1_26 +#define Z_MIN_PIN P1_28 +#define Z_MAX_PIN P1_29 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // A0 (TH1) +#define TEMP_BED_PIN P0_24_A1 // A1 (TH2) +#define TEMP_1_PIN P0_25_A2 // A2 (TH3) + +// +// Heaters / Fans +// +// EFB +#define HEATER_0_PIN P2_04 +#define HEATER_BED_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P2_07 +#endif +#define FAN1_PIN P0_26 + +#define LCD_SDSS P0_16 // LCD SD chip select +#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card + +#if ENABLED(AZSMZ_12864) + #define BEEPER_PIN P1_30 + #define DOGLCD_A0 P2_06 + #define DOGLCD_CS P1_22 + #define BTN_EN1 P4_28 + #define BTN_EN2 P1_27 + #define BTN_ENC P3_26 + #ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION LCD + #endif +#endif + +#if SD_CONNECTION_IS(LCD) + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 + #define SS_PIN LCD_SDSS + #define SD_DETECT_PIN P3_25 +#elif SD_CONNECTION_IS(ONBOARD) + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN ONBOARD_SD_CS_PIN +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 + +/** + * PWMs + * + * There are 6 PWMs. Each PWM can be assigned to one of two pins. + * + * SERVO2 does NOT have a PWM assigned to it. + * + * PWM1.1 DIO4 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM + * PWM1.1 DIO26 E0_STEP_PIN + * PWM1.2 DIO11 SERVO0_PIN + * PWM1.2 DIO54 X_STEP_PIN + * PWM1.3 DIO6 SERVO1_PIN J5-1 + * PWM1.3 DIO60 Y_STEP_PIN + * PWM1.4 DIO53 SDSS(SSEL0) J3-5 AUX-3 + * PWM1.4 DIO46 Z_STEP_PIN + * PWM1.5 DIO3 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.5 DIO9 RAMPS_D9_PIN + * PWM1.6 DIO14 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.6 DIO10 RAMPS_D10_PIN + */ + + /** + * Special pins + * D37 - not 5V tolerant + * D49 - not 5V tolerant + * D57 - open collector + * D58 - open collector + */ diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h new file mode 100644 index 00000000..df182049 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -0,0 +1,182 @@ +/** + * 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 + +/** + * BIQU BQ111-A4 + * + * Applies to the following boards: + * + * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) + */ + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "BIQU Thunder B300 V1.0" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#ifndef X_CS_PIN + #define X_CS_PIN P1_15 // ETH +#endif + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_14 // ETH +#endif + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_16 // ETH +#endif + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#ifndef E0_CS_PIN + #define E0_CS_PIN P1_17 // ETH +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P0_18 // ETH + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P0_17 // ETH + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P0_15 // ETH + #endif +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_24_A1 // A0 (T0) +#define TEMP_BED_PIN P0_23_A0 // A1 (T1) + +// +// Heaters / Fans +// +#define HEATER_0_PIN P2_07 +#define HEATER_BED_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif + +// +// Unused +// +//#define PIN_P2_10 P2_10 // IBOOT-1 +//#define PIN_P0_27 P0_27 // Onboard SD Detect + +/** + * LCD / Controller + * + * REPRAP_DISCOUNT_SMART_CONTROLLER is not supported due to the lack of LCD_PINS_D5, + * LCD_PINS_D6 or LCD_PINS_D7 in the EXP1 connector. + * + * A remote SD card is not supported as the pins routed to EXP2 are the same as used + * for the onboard SD card, and a chip select signal is not provided for the remote + * SD card. + */ +#if HAS_WIRED_LCD + + #define BEEPER_PIN P1_31 // EXP1-1 + + #define BTN_EN1 P3_26 // EXP2-3 + #define BTN_EN2 P3_25 // EXP2-5 + #define BTN_ENC P1_30 // EXP1-2 + + #define SD_DETECT_PIN P0_27 // EXP2-7 + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 + #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 + + #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) + #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU B300 v1.0" + #endif + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not supported by the BIQU B300 v1.0 when an LCD controller is used" + #endif + +#endif // HAS_WIRED_LCD + +/** + * SD Card Reader + * + * Software SPI is used to interface with a stand-alone SD card reader connected to EXP1. + * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. + */ +#if ENABLED(SDSUPPORT) + #define SCK_PIN P0_15 // EXP1-5 + #define MISO_PIN P0_16 // EXP1-4 + #define MOSI_PIN P0_18 // EXP1-3 + #define SS_PIN P1_30 // EXP1-2 + #define SDSS SS_PIN +#endif + +/** + * PWMS + * + * There are 6 PWMS. Each PWM can be assigned to one of two pins. + * + * PWM1.1 P0_18 LCD_PINS_ENABLE + * PWM1.1 P2_0 X_STEP_PIN + * PWM1.2 P1_20 + * PWM1.2 P2_1 Y_STEP_PIN + * PWM1.3 P1_21 + * PWM1.3 P2_2 Z_STEP_PIN + * PWM1.4 P1_23 + * PWM1.4 P2_3 E0_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN + * PWM1.5 P2_4 FAN_PIN + * PWM1.6 P1_26 Y_MIN_PIN + * PWM1.6 P2_5 HEATER_BED_PIN + */ diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h new file mode 100644 index 00000000..bcff04eb --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.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 + +/** + * BIQU BQ111-A4 + * + * Applies to the following boards: + * + * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) + */ + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "BIQU BQ111-A4" + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // A0 (T0) +#define TEMP_BED_PIN P0_24_A1 // A1 (T1) + +// +// Heaters / Fans +// +#define HEATER_0_PIN P2_07 +#define HEATER_BED_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif + +// +// Unused +// +//#define PIN_P2_10 P2_10 // IBOOT-1 +//#define PIN_P0_27 P0_27 // Onboard SD Detect + +/** + * LCD / Controller + * + * REPRAP_DISCOUNT_SMART_CONTROLLER is not supported due to the lack of LCD_PINS_D5, + * LCD_PINS_D6 or LCD_PINS_D7 in the EXP1 connector. + * + * A remote SD card is not supported as the pins routed to EXP2 are the same as used + * for the onboard SD card, and a chip select signal is not provided for the remote + * SD card. + */ +#if HAS_WIRED_LCD + + #define BEEPER_PIN P1_31 // EXP1-1 + + #define BTN_EN1 P3_26 // EXP2-3 + #define BTN_EN2 P3_25 // EXP2-5 + #define BTN_ENC P1_30 // EXP1-2 + + #define SD_DETECT_PIN P0_27 // EXP2-7 + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_PINS_ENABLE P0_18 // (MOSI) EXP1-3 + #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 + + #if BOTH(HAS_MARLINUI_HD44780, REPRAP_DISCOUNT_SMART_CONTROLLER) + #error "REPRAP_DISCOUNT_SMART_CONTROLLER is not supported by the BIQU BQ111-A4" + #endif + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not supported by the BIQU BQ111-A4 when an LCD controller is used" + #endif + +#endif // HAS_WIRED_LCD + +/** + * SD Card Reader + * + * Software SPI is used to interface with a stand-alone SD card reader connected to EXP1. + * Hardware SPI can't be used because P0_17 (MISO) is not brought out on this board. + */ +#if ENABLED(SDSUPPORT) + + #define SCK_PIN P0_15 // EXP1-5 + #define MISO_PIN P0_16 // EXP1-4 + #define MOSI_PIN P0_18 // EXP1-3 + #define SS_PIN P1_30 // EXP1-2 + #define SDSS SS_PIN + +#endif // SDSUPPORT + +/** + * PWMS + * + * There are 6 PWMS. Each PWM can be assigned to one of two pins. + * + * PWM1.1 P0_18 LCD_PINS_ENABLE + * PWM1.1 P2_0 X_STEP_PIN + * PWM1.2 P1_20 + * PWM1.2 P2_1 Y_STEP_PIN + * PWM1.3 P1_21 + * PWM1.3 P2_2 Z_STEP_PIN + * PWM1.4 P1_23 + * PWM1.4 P2_3 E0_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN + * PWM1.5 P2_4 FAN_PIN + * PWM1.6 P1_26 Y_MIN_PIN + * PWM1.6 P2_5 HEATER_BED_PIN + */ diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h new file mode 100644 index 00000000..0701e459 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_1.h @@ -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 . + * + */ +#pragma once + +#define BOARD_INFO_NAME "BTT SKR V1.1" + +// +// Limit Switches +// +#define X_MIN_PIN P1_29 +#define X_MAX_PIN P1_28 +#define Y_MIN_PIN P1_27 +#define Y_MAX_PIN P1_26 +#define Z_MIN_PIN P1_25 +#define Z_MAX_PIN P1_24 + +// +// Steppers +// +#define X_STEP_PIN P0_04 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P4_28 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P2_02 +#define Y_ENABLE_PIN P2_00 + +#define Z_STEP_PIN P0_20 +#define Z_DIR_PIN P0_21 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P0_11 +#define E0_DIR_PIN P2_13 +#define E0_ENABLE_PIN P2_12 + +/** + * LCD / Controller + * + * As of 20 JAN 2019 only the REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER display has + * been tested with these settings. It can be connected to the SKR using standard cables + * via the EXP1 and EXP2 ports. Other displays may need a custom cable and/or changes to + * the pins defined below. + * + * The SD card on the LCD controller uses the same SPI signals as the LCD, resulting in + * garbage/lines on the LCD display during SD card access. The LCD code mitigates this + * by redrawing the screen after SD card accesses. + */ + +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 + #endif + + #define SD_DETECT_PIN P1_31 + +#elif HAS_WIRED_LCD + + #define BTN_EN1 P3_26 + #define BTN_EN2 P3_25 + #define BTN_ENC P2_11 + + #define SD_DETECT_PIN P1_31 + #define LCD_SDSS P1_23 + #define LCD_PINS_RS P0_16 + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS P2_06 + #define DOGLCD_A0 P0_16 + #endif + +#endif // HAS_WIRED_LCD + +// +// SD Support +// +// MKS_MINI_12864 strongly prefers the SD card on the display and +// requires jumpers on the SKR V1.1 board as documented here: +// https://www.facebook.com/groups/505736576548648/permalink/630639874058317/ +#ifndef SDCARD_CONNECTION + #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, IS_TFTGLCD_PANEL) + #define SDCARD_CONNECTION LCD + #else + #define SDCARD_CONNECTION ONBOARD + #endif +#endif + +#if SD_CONNECTION_IS(LCD) + #define SS_PIN P1_23 +#endif + +// Trinamic driver support + +#if HAS_TRINAMIC_CONFIG + // Using TMC devices in intelligent mode requires extra connections to each device. Unfortunately + // the SKR does not have many free pins (especially if a display is in use). The SPI-based devices + // will require 3 connections (clock, mosi, miso), plus a chip select line (CS) for each driver. + // The UART-based devices require 2 pis per deriver (one of which must be interrupt capable). + // The same SPI pins can be shared with the display/SD card reader, meaning SPI-based devices are + // probably a good choice for this board. + // + // SOFTWARE_DRIVER_ENABLE is a good option. It uses SPI to control the driver enable and allows the + // hardware ENABLE pins for each driver to be repurposed as SPI chip select. To use this mode the + // driver modules will probably need to be modified, removing the pin used for the enable line from + // the module and wiring this connection directly to GND (as is the case for TMC2130). + // Using this option and sharing all of the SPI pins allows 5 TMC2130 drivers to be used along with + // a REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER without requiring the use of any extra pins. + // + // Other options will probably require the use of any free pins and the TFT serial port or a + // different type of display (like the TFT), using the pins normally used for the display and encoder. + // Unfortunately, tests show it's not possible to use endstop and thermistor pins for chip-select. + // Sample settings are provided below, but only some have been tested. + // + // Another option is to share the enable and chip-select pins when using SPI. Several users have + // reported that this works. However, it's unlikely that this configuration will allow SPI communi- + // cation with the device when the drivers are active, meaning that some of the more advanced TMC + // options may not be available. + + // When using any TMC SPI-based drivers, software SPI is used + // because pins may be shared with the display or SD card. + #define TMC_USE_SW_SPI + #define TMC_SW_MOSI P0_18 + #define TMC_SW_MISO P0_17 + // To minimize pin usage use the same clock pin as the display/SD card reader. (May generate LCD noise.) + #define TMC_SW_SCK P0_15 + // If pin 2_06 is unused, it can be used for the clock to avoid the LCD noise. + //#define TMC_SW_SCK P2_06 + + #if ENABLED(SOFTWARE_DRIVER_ENABLE) + + // Software enable allows the enable pins to be repurposed as chip-select pins. + // Note: Requires the driver modules to be modified to always be enabled with the enable pin removed. + #if AXIS_DRIVER_TYPE_X(TMC2130) + #define X_CS_PIN P4_28 + #undef X_ENABLE_PIN + #endif + + #if AXIS_DRIVER_TYPE_Y(TMC2130) + #define Y_CS_PIN P2_00 + #undef Y_ENABLE_PIN + #endif + + #if AXIS_DRIVER_TYPE_Z(TMC2130) + #define Z_CS_PIN P0_19 + #undef Z_ENABLE_PIN + #endif + + #if AXIS_DRIVER_TYPE_E0(TMC2130) + #define E0_CS_PIN P2_12 + #undef E0_ENABLE_PIN + #endif + + #if AXIS_DRIVER_TYPE_E1(TMC2130) + #define E1_CS_PIN P0_10 + #undef E1_ENABLE_PIN + #endif + + #else // !SOFTWARE_DRIVER_ENABLE + + // A chip-select pin is needed for each driver. + + // EXAMPLES + + // Example 1: No LCD attached or a TFT style display using the AUX header RX/TX pins. + // SDCARD_CONNECTION must not be 'LCD'. Nothing should be connected to EXP1/EXP2. + //#define SKR_USE_LCD_PINS_FOR_CS + #if ENABLED(SKR_USE_LCD_PINS_FOR_CS) + #if SD_CONNECTION_IS(LCD) + #error "SDCARD_CONNECTION must not be 'LCD' with SKR_USE_LCD_PINS_FOR_CS." + #endif + #define X_CS_PIN P1_23 + #define Y_CS_PIN P3_26 + #define Z_CS_PIN P2_11 + #define E0_CS_PIN P3_25 + #define E1_CS_PIN P1_31 + #endif + + // Example 2: A REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + // The SD card reader attached to the LCD (if present) can't be used because + // the pins will be in use. So SDCARD_CONNECTION must not be 'LCD'. + //#define SKR_USE_LCD_SD_CARD_PINS_FOR_CS + #if ENABLED(SKR_USE_LCD_SD_CARD_PINS_FOR_CS) + #if SD_CONNECTION_IS(LCD) + #error "SDCARD_CONNECTION must not be 'LCD' with SKR_USE_LCD_SD_CARD_PINS_FOR_CS." + #endif + #define X_CS_PIN P0_02 + #define Y_CS_PIN P0_03 + #define Z_CS_PIN P2_06 + // We use SD_DETECT_PIN for E0 + #undef SD_DETECT_PIN + #define E0_CS_PIN P1_31 + // We use LCD_SDSS pin for E1 + #undef LCD_SDSS + #define LCD_SDSS -1 + #define E1_CS_PIN P1_23 + #endif + + // Example 3: Use the driver enable pins for chip-select. + // Commands must not be sent to the drivers when enabled. So certain + // advanced features (like driver monitoring) will not be available. + //#define SKR_USE_ENABLE_CS + #if ENABLED(SKR_USE_ENABLE_FOR_CS) + #define X_CS_PIN X_ENABLE_PIN + #define Y_CS_PIN Y_ENABLE_PIN + #define Z_CS_PIN Z_ENABLE_PIN + #define E0_CS_PIN E0_ENABLE_PIN + #define E1_CS_PIN E1_ENABLE_PIN + #endif + + #endif // SOFTWARE_DRIVER_ENABLE + +#endif + +// Include common SKR pins +#include "pins_BTT_SKR_common.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h new file mode 100644 index 00000000..31373fed --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -0,0 +1,384 @@ +/** + * 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 BOARD_INFO_NAME "BTT SKR V1.3" + +// +// Trinamic Stallguard pins +// +#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 +// +#ifdef 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 + +#ifdef 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 + +#ifdef 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 + +#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups + +// +// Servos +// +#ifndef SERVO0_PIN + #define SERVO0_PIN P2_00 +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P1_24 +#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN P1_28 +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_02 +#define X_DIR_PIN P2_06 +#define X_ENABLE_PIN P2_01 +#ifndef X_CS_PIN + #define X_CS_PIN P1_17 +#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_15 +#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_08 +#endif + +#ifndef E1_CS_PIN + #define E1_CS_PIN P1_01 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P4_28 + #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 Serial1 + //#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 P4_29 + #define X_SERIAL_RX_PIN P1_17 + + #define Y_SERIAL_TX_PIN P1_16 + #define Y_SERIAL_RX_PIN P1_15 + + #define Z_SERIAL_TX_PIN P1_14 + #define Z_SERIAL_RX_PIN P1_10 + + #define E0_SERIAL_TX_PIN P1_09 + #define E0_SERIAL_RX_PIN P1_08 + + #define E1_SERIAL_TX_PIN P1_04 + #define E1_SERIAL_RX_PIN P1_01 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +/** + * _____ _____ + * NC | 1 2 | GND 5V | 1 2 | GND + * RESET | 3 4 | 1.31 (SD_DETECT) (LCD_D7) 1.23 | 3 4 | 1.22 (LCD_D6) + * (MOSI) 0.18 | 5 6 3.25 (BTN_EN2) (LCD_D5) 1.21 | 5 6 1.20 (LCD_D4) + * (SD_SS) 0.16 | 7 8 | 3.26 (BTN_EN1) (LCD_RS) 1.19 | 7 8 | 1.18 (LCD_EN) + * (SCK) 0.15 | 9 10| 0.17 (MISO) (BTN_ENC) 0.28 | 9 10| 1.30 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +#define EXPA1_03_PIN P1_23 +#define EXPA1_04_PIN P1_22 +#define EXPA1_05_PIN P1_21 +#define EXPA1_06_PIN P1_20 +#define EXPA1_07_PIN P1_19 +#define EXPA1_08_PIN P1_18 +#define EXPA1_09_PIN P0_28 +#define EXPA1_10_PIN P1_30 + +#define EXPA2_03_PIN -1 +#define EXPA2_04_PIN P1_31 +#define EXPA2_05_PIN P0_18 +#define EXPA2_06_PIN P3_25 +#define EXPA2_07_PIN P0_16 +#define EXPA2_08_PIN P3_26 +#define EXPA2_09_PIN P0_15 +#define EXPA2_10_PIN P0_17 + +#if HAS_WIRED_LCD + + #if ENABLED(ANET_FULL_GRAPHICS_LCD) + + #error "CAUTION! ANET_FULL_GRAPHICS_LCD requires wiring modifications. See 'pins_BTT_SKR_V1_3.h' for details. Comment out this line to continue." + + /** + * 1. Cut the tab off the LCD connector so it can be plugged into the "EXP1" connector the other way. + * 2. Swap the LCD's +5V (Pin2) and GND (Pin1) wires. (This is the critical part!) + * 3. Rewire the CLK Signal (LCD Pin9) to LCD Pin7. (LCD Pin9 remains open because this pin is open drain.) + * 4. A wire is needed to connect the Reset switch at J3 (LCD Pin7) to EXP2 (Pin3) on the board. + * + * !!! If you are unsure, ask for help! Your motherboard may be damaged in some circumstances !!! + * + * The ANET_FULL_GRAPHICS_LCD connector plug: + * + * BEFORE AFTER + * _____ _____ + * GND 1 | 1 2 | 2 5V 5V 1 | 1 2 | 2 GND + * CS 3 | 3 4 | 4 BTN_EN2 CS 3 | 3 4 | 4 BTN_EN2 + * SID 5 | 5 6 6 BTN_EN1 SID 5 | 5 6 6 BTN_EN1 + * open 7 | 7 8 | 8 BTN_ENC CLK 7 | 7 8 | 8 BTN_ENC + * CLK 9 | 9 10| 10 Beeper open 9 | 9 10| 10 Beeper + * ----- ----- + * LCD LCD + */ + + #define LCD_PINS_RS EXPA1_03_PIN + + #define BTN_EN1 EXPA1_06_PIN + #define BTN_EN2 EXPA1_04_PIN + #define BTN_ENC EXPA1_08_PIN + + #define LCD_PINS_ENABLE EXPA1_05_PIN + #define LCD_PINS_D4 EXPA1_07_PIN + + #elif ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS EXPA1_04_PIN + + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN // (58) open-drain + + #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." + + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS EXPA2_08_PIN + #endif + + #define SD_DETECT_PIN EXPA2_04_PIN + + #else // !CR10_STOCKDISPLAY + + #define LCD_PINS_RS EXPA1_07_PIN + + #define BTN_EN1 EXPA2_08_PIN // (31) J3-2 & AUX-4 + #define BTN_EN2 EXPA2_06_PIN // (33) J3-4 & AUX-4 + #define BTN_ENC EXPA1_09_PIN // (58) open-drain + + #define LCD_PINS_ENABLE EXPA1_08_PIN + #define LCD_PINS_D4 EXPA1_06_PIN + + #define LCD_SDSS EXPA2_07_PIN // (16) J3-7 & AUX-4 + #define SD_DETECT_PIN EXPA2_04_PIN // (49) (NOT 5V tolerant) + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS EXPA1_08_PIN + #define DOGLCD_A0 EXPA1_07_PIN + #define DOGLCD_SCK EXPA2_09_PIN + #define DOGLCD_MOSI EXPA2_05_PIN + + #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 EXPA1_06_PIN // 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 EXPA1_05_PIN + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN EXPA1_04_PIN + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN EXPA1_03_PIN + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN EXPA1_05_PIN + #endif + + #else // !FYSETC_MINI_12864 + + #if ENABLED(MKS_MINI_12864) + + #define DOGLCD_CS EXPA1_05_PIN + #define DOGLCD_A0 EXPA1_04_PIN + #define DOGLCD_SCK EXPA2_09_PIN + #define DOGLCD_MOSI EXPA2_05_PIN + + #elif ENABLED(ENDER2_STOCKDISPLAY) + + /** + * Creality Ender-2 display pinout + * _____ + * 5V | 1 2 | GND + * (MOSI) P1_23 | 3 4 | P1_22 (LCD_CS) + * (LCD_A0) P1_21 | 5 6 P1_20 (BTN_EN2) + * RESET P1_19 | 7 8 | P1_18 (BTN_EN1) + * (BTN_ENC) P0_28 | 9 10| P1_30 (SCK) + * ----- + * EXP1 + */ + + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN + #define DOGLCD_CS EXPA1_04_PIN + #define DOGLCD_A0 EXPA1_05_PIN + #define DOGLCD_SCK EXPA1_10_PIN + #define DOGLCD_MOSI EXPA1_03_PIN + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + #endif + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 EXPA1_05_PIN + #define LCD_PINS_D6 EXPA1_04_PIN + #define LCD_PINS_D7 EXPA1_03_PIN + #endif + + #endif // !FYSETC_MINI_12864 + + #endif // !CR10_STOCKDISPLAY + +#endif // HAS_WIRED_LCD + +// +// SD Support +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION LCD +#endif + +#if SD_CONNECTION_IS(LCD) + #define SS_PIN EXPA2_07_PIN +#endif + +/** + * Special pins + * P1_30 (37) (NOT 5V tolerant) + * P1_31 (49) (NOT 5V tolerant) + * P0_27 (57) (Open collector) + * P0_28 (58) (Open collector) + */ + +// Include common SKR pins +#include "pins_BTT_SKR_common.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h new file mode 100644 index 00000000..4686e984 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -0,0 +1,435 @@ +/** + * 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 BOARD_INFO_NAME + #define BOARD_INFO_NAME "BTT SKR V1.4" +#endif + +#ifndef BOARD_CUSTOM_BUILD_FLAGS + #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 +#endif + +// +// SD Connection +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION LCD +#endif + +// +// Servos +// +#define SERVO0_PIN P2_00 + +// +// TMC StallGuard DIAG pins +// +#define X_DIAG_PIN P1_29 // X-STOP +#define Y_DIAG_PIN P1_28 // Y-STOP +#define Z_DIAG_PIN P1_27 // Z-STOP +#define E0_DIAG_PIN P1_26 // E0DET +#define E1_DIAG_PIN P1_25 // E1DET + +// +// Limit Switches +// +#ifdef X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_DIR < 0 + #define X_MAX_PIN P1_26 // E0DET + #else + #define X_MIN_PIN P1_26 // E0DET + #endif +#else + #define X_STOP_PIN P1_29 // X-STOP +#endif + +#ifdef Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_DIR < 0 + #define Y_MAX_PIN P1_25 // E1DET + #else + #define Y_MIN_PIN P1_25 // E1DET + #endif +#else + #define Y_STOP_PIN P1_28 // Y-STOP +#endif + +#ifdef Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_DIR < 0 + #define Z_MAX_PIN P1_00 // PWRDET + #else + #define Z_MIN_PIN P1_00 // PWRDET + #endif +#else + #ifndef Z_STOP_PIN + #define Z_STOP_PIN P1_27 // Z-STOP + #endif +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P0_10 +#endif + +// +// Filament Runout Sensor +// +#define FIL_RUNOUT_PIN P1_26 // E0DET +#define FIL_RUNOUT2_PIN P1_25 // E1DET + +// +// Power Supply Control +// +#ifndef PS_ON_PIN + #define PS_ON_PIN P1_00 // PWRDET +#endif + +// +// Power Loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN P1_00 // PWRDET +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_02 +#define X_DIR_PIN P2_06 +#define X_ENABLE_PIN P2_01 +#ifndef X_CS_PIN + #define X_CS_PIN P1_10 +#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_09 +#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_08 +#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_04 +#endif + +#define E1_STEP_PIN P1_15 +#define E1_DIR_PIN P1_14 +#define E1_ENABLE_PIN P1_16 +#ifndef E1_CS_PIN + #define E1_CS_PIN P1_01 +#endif + +#define TEMP_1_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_1_PIN +#define TEMP_BED_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_BED_PIN + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_17 + #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 Serial1 + //#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_10 + #define X_SERIAL_RX_PIN P1_10 + + #define Y_SERIAL_TX_PIN P1_09 + #define Y_SERIAL_RX_PIN P1_09 + + #define Z_SERIAL_TX_PIN P1_08 + #define Z_SERIAL_RX_PIN P1_08 + + #define E0_SERIAL_TX_PIN P1_04 + #define E0_SERIAL_RX_PIN P1_04 + + #define E1_SERIAL_TX_PIN P1_01 + #define E1_SERIAL_RX_PIN P1_01 + + #define Z2_SERIAL_TX_PIN P1_01 + #define Z2_SERIAL_RX_PIN P1_01 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// SD Connection +// +#if SD_CONNECTION_IS(LCD) + #define SS_PIN P0_16 +#endif + +/** + * _____ _____ + * NC | · · | GND 5V | · · | GND + * RESET | · · | 1.31 (SD_DETECT) (LCD_D7) 1.23 | · · | 1.22 (LCD_D6) + * (MOSI) 0.18 | · · | 3.25 (BTN_EN2) (LCD_D5) 1.21 | · · | 1.20 (LCD_D4) + * (SD_SS) 0.16 | · · | 3.26 (BTN_EN1) (LCD_RS) 1.19 | · · | 1.18 (LCD_EN) + * (SCK) 0.15 | · · | 0.17 (MISO) (BTN_ENC) 0.28 | · · | 1.30 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ +#if HAS_WIRED_LCD + #if ENABLED(ANET_FULL_GRAPHICS_LCD) + + #define LCD_PINS_RS P1_23 + + #define BTN_EN1 P1_20 + #define BTN_EN2 P1_22 + #define BTN_ENC P1_18 + + #define LCD_PINS_ENABLE P1_21 + #define LCD_PINS_D4 P1_19 + + #elif ENABLED(CR10_STOCKDISPLAY) + #define BTN_ENC P0_28 // (58) open-drain + #define LCD_PINS_RS P1_22 + + #define BTN_EN1 P1_18 + #define BTN_EN2 P1_20 + + #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 + + #elif HAS_SPI_TFT // Config for Classic UI (emulated DOGM) and Color UI + #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 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 + + // XPT2046 Touch Screen calibration + #if ENABLED(TFT_CLASSIC_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -11245 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 8629 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 685 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -285 + #endif + #elif ENABLED(TFT_480x320_SPI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17232 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11196 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 1047 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -358 + #endif + + #define TFT_BUFFER_SIZE 2400 + #endif + + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 + #endif + + #define SD_DETECT_PIN P1_31 + + #else + + #define BTN_ENC P0_28 // (58) open-drain + #define LCD_PINS_RS P1_19 + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + + #define LCD_PINS_ENABLE P1_18 + #define LCD_PINS_D4 P1_20 + + #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 + + #if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN P1_31 // (49) (NOT 5V tolerant) + #endif + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS P1_18 + #define DOGLCD_A0 P1_19 + #define DOGLCD_SCK P0_15 + #define DOGLCD_MOSI P0_18 + + #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 P1_20 // 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 P1_21 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_22 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_23 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN P1_21 + #endif + + #else // !FYSETC_MINI_12864 + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS P1_21 + #define DOGLCD_A0 P1_22 + #define DOGLCD_SCK P0_15 + #define DOGLCD_MOSI P0_18 + #define FORCE_SOFT_SPI + #endif + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P1_21 + #define LCD_PINS_D6 P1_22 + #define LCD_PINS_D7 P1_23 + #endif + + #endif // !FYSETC_MINI_12864 + + #endif // HAS_MARLINUI_U8GLIB + +#endif // HAS_WIRED_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 +// +#ifndef NEOPIXEL_PIN + #define NEOPIXEL_PIN P1_24 +#endif + +/** + * Special pins + * P1_30 (37) (NOT 5V tolerant) + * P1_31 (49) (NOT 5V tolerant) + * P0_27 (57) (Open collector) + * P0_28 (58) (Open collector) + */ + +// +// Include common SKR pins +// +#include "pins_BTT_SKR_common.h" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h new file mode 100644 index 00000000..820c35a0 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -0,0 +1,117 @@ +/** + * 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 SKR_HAS_LPC1769 + #if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." + #endif +#elif NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Steppers +// +#ifndef E1_STEP_PIN + #define E1_STEP_PIN P0_01 +#endif +#ifndef E1_DIR_PIN + #define E1_DIR_PIN P0_00 +#endif +#ifndef E1_ENABLE_PIN + #define E1_ENABLE_PIN P0_10 +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#ifndef TEMP_0_PIN + #define TEMP_0_PIN P0_24_A1 // A1 (T1) - (68) - TEMP_0_PIN +#endif +#ifndef TEMP_1_PIN + #define TEMP_1_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_1_PIN +#endif +#ifndef TEMP_BED_PIN + #define TEMP_BED_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_BED_PIN +#endif + +#if HOTENDS == 1 + #if TEMP_SENSOR_PROBE + #define TEMP_PROBE_PIN TEMP_1_PIN + #elif TEMP_SENSOR_CHAMBER + #define TEMP_CHAMBER_PIN TEMP_1_PIN + #endif +#endif + +// +// Heaters / Fans +// +#ifndef HEATER_0_PIN + #define HEATER_0_PIN P2_07 +#endif +#if HOTENDS == 1 + #ifndef FAN1_PIN + #define FAN1_PIN P2_04 + #endif +#else + #ifndef HEATER_1_PIN + #define HEATER_1_PIN P2_04 + #endif +#endif +#ifndef FAN_PIN + #define FAN_PIN P2_03 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN P2_05 +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD && DISABLED(LCD_USE_I2C_BUZZER) + #define BEEPER_PIN P1_30 // (37) not 5V tolerant +#endif + +// +// SD Support +// +#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card + +#if SD_CONNECTION_IS(LCD) + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 +#elif SD_CONNECTION_IS(ONBOARD) + #undef SD_DETECT_PIN + #define SD_DETECT_PIN P0_27 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN ONBOARD_SD_CS_PIN +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h new file mode 100644 index 00000000..5132081a --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -0,0 +1,163 @@ +/** + * 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 + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "GMARSH X6 REV1" + +// Ignore temp readings during develpment. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Enable 12MHz clock output on P1.27 pin to sync TMC2208 chip clocks +// +#define LPC1768_ENABLE_CLKOUT_12M + +// +// Servos +// +#define SERVO0_PIN P1_26 // PWM1[6] +#define SERVO1_PIN P1_18 // PWM1[1] + +// +// Limit Switches +// +#define X_MIN_PIN P0_00 +#define X_MAX_PIN P0_01 +#define Y_MIN_PIN P0_10 +#define Y_MAX_PIN P0_21 +#define Z_MIN_PIN P2_13 +#define Z_MAX_PIN P2_22 + +// +// Steppers +// + +#define X_STEP_PIN P1_01 +#define X_DIR_PIN P1_04 +#define X_ENABLE_PIN P0_26 + +#define Y_STEP_PIN P1_10 +#define Y_DIR_PIN P1_14 +#define Y_ENABLE_PIN P1_08 + +#define Z_STEP_PIN P1_17 +#define Z_DIR_PIN P4_29 +#define Z_ENABLE_PIN P1_15 + +#define E0_STEP_PIN P0_05 +#define E0_DIR_PIN P2_00 +#define E0_ENABLE_PIN P4_28 + +#define E1_STEP_PIN P2_03 +#define E1_DIR_PIN P2_04 +#define E1_ENABLE_PIN P2_01 + +#define E2_STEP_PIN P2_07 +#define E2_DIR_PIN P2_08 +#define E2_ENABLE_PIN P2_05 + +// +// TMC2208 UART pins +// +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN P1_00 + #define X_SERIAL_RX_PIN P1_00 + #define Y_SERIAL_TX_PIN P1_09 + #define Y_SERIAL_RX_PIN P1_09 + #define Z_SERIAL_TX_PIN P1_16 + #define Z_SERIAL_RX_PIN P1_16 + #define E0_SERIAL_TX_PIN P0_04 + #define E0_SERIAL_RX_PIN P0_04 + #define E1_SERIAL_TX_PIN P2_02 + #define E1_SERIAL_RX_PIN P2_02 + #define E2_SERIAL_TX_PIN P2_06 + #define E2_SERIAL_RX_PIN P2_06 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#else + #error "TMC2208 UART configuration is required for GMarsh X6." +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_24_A1 // AD0[0] on P0_23 +#define TEMP_BED_PIN P0_23_A0 // AD0[1] on P0_24 + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P1_19 // Not a PWM pin, software PWM required +#define HEATER_0_PIN P3_26 // PWM1[3] +#define FAN_PIN P3_25 // Part cooling fan - connected to PWM1[2] +#define E0_AUTO_FAN_PIN P0_27 // Extruder cooling fan + +// +// Misc. Functions +// +#define LED_PIN P1_31 + +// +// LCD +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BEEPER_PIN P0_19 + #define BTN_EN1 P1_23 + #define BTN_EN2 P1_24 + #define BTN_ENC P1_25 + #define LCD_PINS_RS P0_20 + #define LCD_PINS_ENABLE P0_21 + #define LCD_PINS_D4 P2_11 + #define LCD_PINS_D5 P0_22 + #define LCD_PINS_D6 P1_29 + #define LCD_PINS_D7 P1_28 +#endif + +// +// SD Support +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION LCD +#endif + +#define ONBOARD_SD_CS_PIN P0_06 // Chip select for "System" SD card + +#if SD_CONNECTION_IS(LCD) + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 + #define SS_PIN P0_16 +#elif SD_CONNECTION_IS(ONBOARD) + #undef SD_DETECT_PIN + #define SD_DETECT_PIN P0_27 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN ONBOARD_SD_CS_PIN +#endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h new file mode 100644 index 00000000..6c6a9ea3 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -0,0 +1,389 @@ +/** + * 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 SBASE pin assignments + */ + +#if defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#elif NOT_TARGET(MKS_HAS_LPC1769, MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS SBASE" +#endif +#ifndef BOARD_WEBSITE_URL + #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SBASE" +#endif + +#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 + +// +// Servos +// +#define SERVO0_PIN P1_23 // J8-3 (low jitter) +#define SERVO1_PIN P2_12 // J8-4 +#define SERVO2_PIN P2_11 // J8-5 +#define SERVO3_PIN P4_28 // J8-6 + +// +// Limit Switches - Not Interrupt Capable +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_28 // The original Mks Sbase DIO19 has a 10k pullup to 3.3V or 5V, 1K series, so when using a Zprobe we must use DIO41 (J8 P1.22) +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V, 1K series + +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P4_28 // Connector J8 +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) +#define TEMP_0_PIN P0_24_A1 // A1 (TH2) +#define TEMP_1_PIN P0_25_A2 // A2 (TH3) +#define TEMP_2_PIN P0_26_A3 // A3 (TH4) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P2_06 +#ifndef FAN_PIN + #define FAN_PIN P2_04 +#endif + +// +// Connector J7 +// Note: These pins are all digitally shared with the EXP1/EXP2 Connector. +// Using them with an LCD connected or configured will lead to hangs & crashes. +// + +// 5V +// NC +// GND +#define PIN_P0_17 P0_17 +#define PIN_P0_16 P0_16 +#define PIN_P0_15 P0_15 + +// +// Connector J8 +// + +// GND +#define PIN_P1_22 P1_22 +#define PIN_P1_23 P1_23 // PWM Capable +#define PIN_P2_12 P2_12 // Interrupt Capable +#define PIN_P2_11 P2_11 // Interrupt Capable + +// +// Průša i3 MK2 Multi Material Multiplexer Support +// +#if ENABLED(MK2_MULTIPLEXER) + #define E_MUX0_PIN P1_23 // J8-3 + #define E_MUX1_PIN P2_12 // J8-4 + #define E_MUX2_PIN P2_11 // J8-5 +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN P0_25 // TH3 Connector + +// +// Ethernet pins +// +#ifndef ULTIPANEL + #define ENET_MDIO P1_17 // J12-4 + #define ENET_RX_ER P1_14 // J12-6 + #define ENET_RXD1 P1_10 // J12-8 +#endif + +#define ENET_MOC P1_16 // J12-3 +#define REF_CLK P1_15 // J12-5 +#define ENET_RXD0 P1_09 // J12-7 +#define ENET_CRS P1_08 // J12-9 +#define ENET_TX_EN P1_04 // J12-10 +#define ENET_TXD0 P1_00 // J12-11 +#define ENET_TXD1 P1_01 // J12-12 + +#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(CUSTOM_CABLE) + + /** + * A custom cable is needed. See the README file in the + * Marlin\src\config\examples\Mks\Sbase directory + * P0.27 is on EXP2 and the on-board SD card's socket. That means it can't be + * used as the SD_DETECT for the LCD's SD card. + * + * The best solution is to use the custom cable to connect the LCD's SD_DETECT + * to a pin NOT on EXP2. + * + * If you can't find a pin to use for the LCD's SD_DETECT then comment out + * SD_DETECT_PIN entirely and remove that wire from the the custom cable. + */ + #define SD_DETECT_PIN P2_11 // J8-5 (moved from EXP2 P0.27) + #define SCK_PIN P1_22 // J8-2 (moved from EXP2 P0.7) + #define MISO_PIN P1_23 // J8-3 (moved from EXP2 P0.8) + #define MOSI_PIN P2_12 // J8-4 (moved from EXP2 P0.9) + #define SS_PIN P0_28 + #define LPC_SOFTWARE_SPI // With a custom cable we need software SPI because the + // selected pins are not on a hardware SPI controller +#elif SD_CONNECTION_IS(LCD) + // use standard cable and header, SPI and SD detect sre shared with on-board SD card + // hardware SPI is used for both SD cards. The detect pin is shred between the + // LCD and onboard SD readers so we disable it. + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN P0_28 +#elif 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 + #define SS_PIN ONBOARD_SD_CS_PIN +#endif + +/** + * Smart LCD adapter + * + * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as + * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use + * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable + * is needed to pick up 5V for the EXP1 connection. + * + * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines + * on the LCD display during accesses of the SD card. The menus/code has been arranged so + * that the garbage/lines are erased immediately after the SD card accesses are completed. + */ + +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_25 // EXP2.3 + #endif + + #if SD_CONNECTION_IS(LCD) + #define SD_DETECT_PIN P0_28 // EXP2.4 + #endif + +#elif HAS_WIRED_LCD + + #define BEEPER_PIN P1_31 // EXP1.1 + #define BTN_ENC P1_30 // EXP1.2 + #define BTN_EN1 P3_26 // EXP2.5 + #define BTN_EN2 P3_25 // EXP2.3 + #define LCD_PINS_RS P0_16 // EXP1.4 + #define LCD_SDSS P0_28 // EXP2.4 + #define LCD_PINS_ENABLE P0_18 // EXP1.3 + #define LCD_PINS_D4 P0_15 // EXP1.5 + #if ANY(VIKI2, miniVIKI) + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + #endif + + #if ENABLED(FYSETC_MINI_12864) + /** + * The FYSETC display can NOT use the SCK and MOSI pins on EXP2, so a + * special cable is needed to go between EXP2 on the FYSETC and the + * controller board's EXP2 and J8. It also means that a software SPI + * is needed to drive those pins. + * + * The FYSETC requires mode 3 SPI interface. + * + * Pins 6, 7 & 8 on EXP2 are no connects. That means a second special + * cable will be needed if the RGB LEDs are to be active. + */ + #define DOGLCD_CS LCD_PINS_ENABLE // EXP1.3 (LCD_EN on FYSETC schematic) + #define DOGLCD_A0 LCD_PINS_RS // EXP1.4 (LCD_A0 on FYSETC schematic) + #define DOGLCD_SCK P2_11 // J8-5 (SCK on FYSETC schematic) + #define DOGLCD_MOSI P4_28 // J8-6 (MOSI on FYSETC schematic) + + //#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 + + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN P2_12 // J8-4 (LCD_D6 on FYSETC schematic) + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_23 // J8-3 (LCD_D5 on FYSETC schematic) + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_22 // J8-2 (LCD_D7 on FYSETC schematic) + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN P2_12 + #endif + + #elif ENABLED(MINIPANEL) + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + #endif + +#endif // HAS_WIRED_LCD + +/** + * Example for trinamic drivers using the J8 connector on MKs Sbase. + * 2130s need 1 pin for each driver. 2208/2209s need 2 pins for serial control. + * This board does not have enough pins to use hardware serial. + */ + +#if HAS_DRIVER(TMC2130) + // J8 + #define X_CS_PIN P1_22 + #define Y_CS_PIN P1_23 + #define Z_CS_PIN P2_12 + #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 + #endif + #endif + +#endif + +#if MB(MKS_SBASE) && HAS_TMC_UART + + /** + * TMC2208/TMC2209 stepper drivers + * + * The shortage of pins becomes apparent. + * Worst case you may have to give up the LCD + * RX pins need to be interrupt capable + */ + #define X_SERIAL_TX_PIN P1_22 // J8-2 + #define X_SERIAL_RX_PIN P2_12 // J8-4 Interrupt Capable + #define Y_SERIAL_TX_PIN P1_23 // J8-3 + #define Y_SERIAL_RX_PIN P2_11 // J8-5 Interrupt Capable + #define Z_SERIAL_TX_PIN P2_12 // J8-4 + #define Z_SERIAL_RX_PIN P0_25 // TH3 + #define E0_SERIAL_TX_PIN P4_28 // J8-6 + #define E0_SERIAL_RX_PIN P0_26 // TH4 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// UNUSED +#define PIN_P0_27 P0_27 // EXP2/Onboard SD +#define PIN_P0_28 P0_28 // EXP2 +#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) + +/** + * PWMs + * + * There are 6 PWMs. Each PWM can be assigned to one of two pins. + * + * SERVO2 does NOT have a PWM assigned to it. + * + * PWM1.1 P1_18 SERVO3_PIN FIL_RUNOUT_PIN 5V output, PWM + * PWM1.1 P2_00 E0_STEP_PIN + * PWM1.2 P1_20 SERVO0_PIN + * PWM1.2 P2_01 X_STEP_PIN + * PWM1.3 P1_21 SERVO1_PIN J5-1 + * PWM1.3 P2_02 Y_STEP_PIN + * PWM1.4 P1_23 SDSS(SSEL0) J3-5 AUX-3 + * PWM1.4 P2_03 Z_STEP_PIN + * PWM1.5 P1_24 X_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.5 P2_04 RAMPS_D9_PIN + * PWM1.6 P1_26 Y_MIN_PIN 10K PULLUP TO 3.3v, 1K SERIES + * PWM1.6 P2_05 RAMPS_D10_PIN + */ + +/** + * Special pins + * P1_30 - not 5V tolerant - EXP1 + * P1_31 - not 5V tolerant - EXP1 + * P0_27 - open collector - EXP2 + * P0_28 - open collector - EXP2 + */ + +/** + * Serial Ports + * P0_00 - Port 3 + * P0_01 - SD Card (Onboard) + * P0_10 - Port 2 + * P0_11 - Y_EN/Y_DIR + * P0_15 - Port 1 + * P0_16 - EXP1 + * P0_02 - Port 0 + * P0_03 - AUX1 + * P0_29 - Port -1 + * P0_30 - USB + */ diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h new file mode 100644 index 00000000..d269ecbd --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -0,0 +1,361 @@ +/** + * 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-L pin assignments + */ + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "MKS SGen-L" +#define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN_L" + +// +// Servos +// +#define SERVO0_PIN P1_23 // SERVO P1.23 +#define SERVO1_PIN P2_00 // SERVO P2.0 + +// +// Trinamic Stallguard pins +// +#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 +// +#ifdef 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 + +#ifdef 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 + +#ifdef 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 P0_01 +#define E1_DIR_PIN P0_00 +#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 P4_28 + #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 Serial1 + //#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_04 + #define X_SERIAL_RX_PIN P1_01 + + #define Y_SERIAL_TX_PIN P1_09 + #define Y_SERIAL_RX_PIN P1_08 + + #define Z_SERIAL_TX_PIN P1_14 + #define Z_SERIAL_RX_PIN P1_10 + + #define E0_SERIAL_TX_PIN P1_16 + #define E0_SERIAL_RX_PIN P1_15 + + #define E1_SERIAL_TX_PIN P4_29 + #define E1_SERIAL_RX_PIN P1_17 + + #define Z2_SERIAL_TX_PIN P4_29 + #define Z2_SERIAL_RX_PIN P1_17 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif // TMC2208 || TMC2209 + +// +// 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) + +// +// 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 + +// +// 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_WIRED_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 + + #elif IS_TFTGLCD_PANEL + + #undef BEEPER_PIN + #undef BTN_ENC + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_25 + #endif + + #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 P0_09 + + #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_WIRED_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/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h new file mode 100644 index 00000000..294e7527 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -0,0 +1,514 @@ +/** + * 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 + +/** + * Re-ARM with RAMPS v1.4 pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Hotend, Fan, Bed) + * RAMPS_14_EEB (Hotend0, Hotend1, Bed) + * RAMPS_14_EFF (Hotend, Fan0, Fan1) + * RAMPS_14_EEF (Hotend0, Hotend1, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + */ + +// Numbers in parentheses () are the corresponding mega2560 pin numbers + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Re-ARM RAMPS 1.4" + +// +// Servos +// +#define SERVO0_PIN P1_20 // (11) +#define SERVO1_PIN P1_21 // ( 6) also on J5-1 +#define SERVO2_PIN P1_19 // ( 5) +#define SERVO3_PIN P1_18 // ( 4) 5V output + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // ( 3) 10k pullup to 3.3V, 1K series +#define X_MAX_PIN P1_25 // ( 2) 10k pullup to 3.3V, 1K series +#define Y_MIN_PIN P1_26 // (14) 10k pullup to 3.3V, 1K series +#define Y_MAX_PIN P1_27 // (15) 10k pullup to 3.3V, 1K series +#define Z_MIN_PIN P1_29 // (18) 10k pullup to 3.3V, 1K series +#define Z_MAX_PIN P1_28 // (19) 10k pullup to 3.3V, 1K series +#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups + +// +// Steppers +// +#define X_STEP_PIN P2_01 // (54) +#define X_DIR_PIN P0_11 // (55) +#define X_ENABLE_PIN P0_10 // (38) +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 // ETH +#endif + +#define Y_STEP_PIN P2_02 // (60) +#define Y_DIR_PIN P0_20 // (61) +#define Y_ENABLE_PIN P0_19 // (56) +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_04 // ETH +#endif + +#define Z_STEP_PIN P2_03 // (46) +#define Z_DIR_PIN P0_22 // (48) +#define Z_ENABLE_PIN P0_21 // (62) +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_10 // ETH +#endif + +#define E0_STEP_PIN P2_00 // (26) +#define E0_DIR_PIN P0_05 // (28) +#define E0_ENABLE_PIN P0_04 // (24) +#ifndef E0_CS_PIN + #define E0_CS_PIN P1_14 // ETH +#endif + +#define E1_STEP_PIN P2_08 // (36) +#define E1_DIR_PIN P2_13 // (34) +#define E1_ENABLE_PIN P4_29 // (30) +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_00 // ETH + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_08 // ETH + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_09 // ETH + #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 + */ + + // + // Software serial + // + + // P2_08 E1-Step + // P2_13 E1-Dir + + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN P0_01 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN P0_01 + #endif + + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN P0_00 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN P0_00 + #endif + + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN P2_13 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN P2_13 + #endif + + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN P2_08 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN P2_08 + #endif + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // A0 (T0) - (67) - TEMP_0_PIN +#define TEMP_BED_PIN P0_24_A1 // A1 (T1) - (68) - TEMP_BED_PIN +#define TEMP_1_PIN P0_25_A2 // A2 (T2) - (69) - TEMP_1_PIN +#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 FILWIDTH_PIN P0_02_A7 // A7 - ( 1) - TXD0 - J4-5 & AUX-1 + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HAS_MULTI_HOTEND + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_D8_PIN + #define RAMPS_D8_PIN P2_07 // (8) +#endif +#ifndef RAMPS_D9_PIN + #define RAMPS_D9_PIN P2_04 // (9) +#endif +#ifndef RAMPS_D10_PIN + #define RAMPS_D10_PIN P2_05 // (10) +#endif + +#define HEATER_0_PIN RAMPS_D10_PIN + +#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN RAMPS_D9_PIN +#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN RAMPS_D8_PIN +#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") + #define HEATER_BED_PIN RAMPS_D8_PIN + #if HOTENDS == 1 + #define FAN1_PIN MOSFET_D_PIN + #else + #define HEATER_1_PIN MOSFET_D_PIN + #endif +#endif + +#ifndef FAN_PIN + #if EITHER(IS_RAMPS_EFB, IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #elif EITHER(IS_RAMPS_EEF, IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN + #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define FAN_PIN P1_18 // (4) IO pin. Buffer needed + #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #endif +#endif + +// +// Misc. Functions +// +#define LED_PIN P4_28 // (13) + +// define digital pin 5 for the filament runout sensor. Use the RAMPS 1.4 digital input 5 on the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN P1_19 // (5) +#endif + +#define PS_ON_PIN P2_12 // (12) + +#if !defined(MAX6675_SS_PIN) && DISABLED(USE_ZMAX_PLUG) + #define MAX6675_SS_PIN P1_28 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENA_PIN) + #if !defined(NUM_SERVOS) || NUM_SERVOS < 4 // Try to use servo connector + #define CASE_LIGHT_PIN P1_18 // (4) MUST BE HARDWARE PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// Use servo pins, if available +// +#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) + #if NUM_SERVOS > 1 + #if ENABLED(SPINDLE_FEATURE) + #error "SPINDLE_FEATURE requires 3 free servo pins." + #else + #error "LASER_FEATURE requires 3 free servo pins." + #endif + #endif + #define SPINDLE_LASER_ENA_PIN SERVO1_PIN // (6) Pin should have a pullup/pulldown! + #define SPINDLE_LASER_PWM_PIN SERVO3_PIN // (4) MUST BE HARDWARE PWM + #define SPINDLE_DIR_PIN SERVO2_PIN // (5) +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#if SERIAL_PORT != 0 && SERIAL_PORT_2 != 0 + #define E_MUX0_PIN P0_03 // ( 0) Z_CS_PIN + #define E_MUX1_PIN P0_02 // ( 1) E0_CS_PIN +#endif +#define E_MUX2_PIN P0_26 // (63) E1_CS_PIN + +/** + * LCD / Controller + * + * All controllers can use J3 and J5 on the Re-ARM board. Custom cabling will be required. + * + * - https://github.com/wolfmanjm/universal-panel-adapter + * - https://panucattdevices.freshdesk.com/support/solutions/articles/1000243195-lcd-display-installation + */ + +/** + * Smart LCD adapter + * + * The Smart LCD adapter can be used for the two 10 pin LCD controllers such as + * REPRAP_DISCOUNT_SMART_CONTROLLER. It can't be used for controllers that use + * DOGLCD_A0, DOGLCD_CS, LCD_PINS_D5, LCD_PINS_D6 or LCD_PINS_D7. A custom cable + * is needed to pick up 5V for the EXP1 connection. + * + * SD card on the LCD uses the same SPI signals as the LCD. This results in garbage/lines + * on the LCD display during accesses of the SD card. The menus/code has been arranged so + * that the garbage/lines are erased immediately after the SD card accesses are completed. + */ + +#if ENABLED(CR10_STOCKDISPLAY) + + // Re-Arm can support Creality stock display without SD card reader and single cable on EXP3. + // Re-Arm J3 pins 1 (p1.31) & 2 (P3.26) are not used. Stock cable will need to have one + // 10-pin IDC connector trimmed or replaced with a 12-pin IDC connector to fit J3. + // Requires REVERSE_ENCODER_DIRECTION in Configuration.h + + #define BEEPER_PIN P2_11 // J3-3 & AUX-4 + + #define BTN_EN1 P0_16 // J3-7 & AUX-4 + #define BTN_EN2 P1_23 // J3-5 & AUX-4 + #define BTN_ENC P3_25 // J3-4 & AUX-4 + + #define LCD_PINS_RS P0_15 // J3-9 & AUX-4 (CS) + #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) + #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) + +#elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 // (31) J3-2 & AUX-4 + #endif + + #define SD_DETECT_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + +#elif HAS_WIRED_LCD + + //#define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 + //#define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 + //#define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 + //#define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) + + #if ENABLED(FYSETC_MINI_12864) + #define BEEPER_PIN P1_01 + #define BTN_ENC P1_04 + #else + #define BEEPER_PIN P1_30 // (37) not 5V tolerant + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + #endif + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 + #define LCD_SDSS P1_23 // (53) J3-5 & AUX-3 + + #if ENABLED(NEWPANEL) + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD P1_31 // (49) J3-1 & AUX-3 (NOT 5V tolerant) + #endif + #else + //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + #endif + + #if ANY(VIKI2, miniVIKI) + //#define LCD_SCREEN_ROT_180 + + #define DOGLCD_CS P0_16 // (16) + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + + #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes + #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes + + #else + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_SCK P0_15 + #define DOGLCD_MOSI P0_18 + + // EXP1 on LCD adapter is not usable - using Ethernet connector instead + #define DOGLCD_CS P1_09 + #define DOGLCD_A0 P1_14 + //#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_16 // 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 P1_00 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_01 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_08 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN P1_00 + #endif + #else + #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + #endif + + #define LCD_BACKLIGHT_PIN P0_16 //(16) J3-7 & AUX-4 - only used on DOGLCD controllers + #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO + #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER + #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 + #endif + #endif + + #if ENABLED(MINIPANEL) + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + #endif + +#endif // HAS_WIRED_LCD + +// +// Ethernet pins +// +#if DISABLED(ULTIPANEL) + #define ENET_MDIO P1_17 // (71) J12-4 + #define ENET_RX_ER P1_14 // (73) J12-6 + #define ENET_RXD1 P1_10 // (75) J12-8 +#endif +#define ENET_MOC P1_16 // (70) J12-3 +#define REF_CLK P1_15 // (72) J12-5 +#define ENET_RXD0 P1_09 // (74) J12-7 +#define ENET_CRS P1_08 // (76) J12-9 +#define ENET_TX_EN P1_04 // (77) J12-10 +#define ENET_TXD0 P1_00 // (78) J12-11 +#define ENET_TXD1 P1_01 // (79) J12-12 + +// +// SD Support +// +#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) + #define SCK_PIN P0_15 // (52) system defined J3-9 & AUX-3 + #define MISO_PIN P0_17 // (50) system defined J3-10 & AUX-3 + #define MOSI_PIN P0_18 // (51) system defined J3-10 & AUX-3 + #define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin +#elif SD_CONNECTION_IS(ONBOARD) + #undef SD_DETECT_PIN + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN ONBOARD_SD_CS_PIN +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +/** + * Fast PWMs + * + * The LPC1768's hardware PWM controller has 6 channels. Each channel + * can be setup to either control a dedicated pin directly or to generate + * an interrupt. The direct method's duty cycle is accurate to within a + * a microsecond. The interrupt method's average duty cycle has the + * the same accuracy but the individual cycles can vary because of higher + * priority interrupts. + * + * All Fast PWMs have a 50Hz rate. + * + * The following pins/signals use the direct method. All other pins use the + * the interrupt method. Note that SERVO2_PIN and RAMPS_D8_PIN use the + * interrupt method. + * + * P1_20 (11) SERVO0_PIN + * P1_21 ( 6) SERVO1_PIN J5-1 + * P0_18 ( 4) SERVO3_PIN 5V output + * *P2_04 ( 9) RAMPS_D9_PIN + * *P2_05 (10) RAMPS_D10_PIN + * + * * - If used as a heater driver then a Fast PWM is NOT assigned. If used as + * a fan driver then enabling FAST_PWM_FAN assigns a Fast PWM to it. + */ + + /** + * Special pins + * P1_30 (37) (NOT 5V tolerant) + * P1_31 (49) (NOT 5V tolerant) + * P0_27 (57) (Open collector) + * P0_28 (58) (Open collector) + */ + +/** + * The following mega2560 pins are NOT available in a Re-ARM system: + * + * 7, 17, 22, 23, 25, 27, 29, 32, 39, 40, 42, 43, 44, 45, 47, 64, 65, 66 + */ diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h new file mode 100644 index 00000000..f9b9db91 --- /dev/null +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.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 + +/** + * Selena Compact pin assignments + */ + +#if NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Selena Compact" +#define BOARD_WEBSITE_URL "github.com/Ales2-k/Selena" + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_28 +#define X_MAX_PIN P1_25 +#define Y_MIN_PIN P2_11 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN P1_27 +#define Z_MAX_PIN -1 +#define Z_PROBE P1_22 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) +#define TEMP_0_PIN P0_24_A1 // A1 (TH2) +#define TEMP_1_PIN P0_25_A2 // A2 (TH3) + +// +// Heaters / Fans +// + +#define HEATER_BED_PIN P2_05 +#define HEATER_BED2_PIN P2_04 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P2_06 +#ifndef FAN_PIN + #define FAN_PIN P1_24 +#endif +#define FAN1_PIN P1_26 + +// +// Display +// + +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define LCD_PINS_RS P0_16 + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + #define LCD_PINS_D5 P1_00 + #define LCD_PINS_D6 P1_01 + #define LCD_PINS_D7 P1_04 + #define BEEPER_PIN P1_31 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P1_30 + + #define SD_DETECT_PIN -1 +#endif // REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h new file mode 100644 index 00000000..adf90852 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -0,0 +1,126 @@ +/** + * 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 + +/** + * Azteeg X5 GT pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Azteeg X5 GT" +#define BOARD_WEBSITE_URL "tinyurl.com/yx8tdqa3" + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define X_MAX_PIN P1_27 +#define Y_MIN_PIN P1_25 +#define Y_MAX_PIN P1_28 +#define Z_MIN_PIN P1_26 +#define Z_MAX_PIN P1_29 + +// +// Steppers +// +#define X_STEP_PIN P2_01 +#define X_DIR_PIN P0_11 +#define X_ENABLE_PIN P0_10 +#ifndef X_CS_PIN + #define X_CS_PIN P0_10 // BSD2660 default +#endif + +#define Y_STEP_PIN P2_02 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P0_19 +#ifndef Y_CS_PIN + #define Y_CS_PIN P0_19 // BSD2660 default +#endif + +#define Z_STEP_PIN P2_03 +#define Z_DIR_PIN P0_22 +#define Z_ENABLE_PIN P0_21 +#ifndef Z_CS_PIN + #define Z_CS_PIN P0_21 // BSD2660 default +#endif + +#define E0_STEP_PIN P2_00 +#define E0_DIR_PIN P0_05 +#define E0_ENABLE_PIN P0_04 +#ifndef E0_CS_PIN + #define E0_CS_PIN P0_04 // BSD2660 default +#endif + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 +#ifndef E1_CS_PIN + #define E1_CS_PIN P4_29 // BSD2660 default +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) +#define TEMP_0_PIN P0_24_A1 // A1 (TH2) +#define TEMP_1_PIN P0_25_A2 // A2 (TH3) + +// +// Heaters / Fans +// + +#define HEATER_BED_PIN P2_07 +#define HEATER_0_PIN P2_04 +#define HEATER_1_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P0_26 +#endif +#define FAN1_PIN P1_22 + +// +// Display +// + +#if ANY(VIKI2, miniVIKI) + #define BEEPER_PIN P1_31 + #define DOGLCD_A0 P2_06 + #define DOGLCD_CS P0_16 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P2_11 + + #define SD_DETECT_PIN P1_18 + #define SDSS P1_21 + + #define STAT_LED_RED_PIN P1_19 + #define STAT_LED_BLUE_PIN P1_20 +#endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h new file mode 100644 index 00000000..6331d6aa --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -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 . + * + */ +#pragma once + +/** + * Azteeg X5 MINI pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Azteeg X5 MINI" +#endif +#define BOARD_WEBSITE_URL "tiny.cc/x5_mini" + +// +// LED +// +#define LED_PIN P1_18 + +// +// Servos +// +#define SERVO0_PIN P1_29 + +// +// Limit Switches +// +#define X_STOP_PIN P1_24 +#define Y_STOP_PIN P1_26 +#define Z_STOP_PIN P1_28 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN P2_04 +#endif + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN P0_25_A2 // Analog Input (P0_25) +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_01 +#define X_DIR_PIN P0_11 +#define X_ENABLE_PIN P0_10 + +#define Y_STEP_PIN P2_02 +#define Y_DIR_PIN P0_20 +#define Y_ENABLE_PIN P0_19 + +#define Z_STEP_PIN P2_03 +#define Z_DIR_PIN P0_22 +#define Z_ENABLE_PIN P0_21 + +#define E0_STEP_PIN P2_00 +#define E0_DIR_PIN P0_05 +#define E0_ENABLE_PIN P0_04 + +// +// DIGIPOT slave addresses +// +#ifndef DIGIPOT_I2C_ADDRESS_A + #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 +#endif + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_BED_PIN P0_23_A0 // A0 (TH1) +#define TEMP_0_PIN P0_24_A1 // A1 (TH2) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_07 +#define HEATER_0_PIN P2_05 +#ifndef FAN_PIN + #define FAN_PIN P0_26 +#endif +#define FAN1_PIN P1_25 + +// +// Display +// +#if HAS_WIRED_LCD + + #if ENABLED(CR10_STOCKDISPLAY) + + // Re-Arm can support Creality stock display without SD card reader and single cable on EXP3. + // Re-Arm J3 pins 1 (p1.31) & 2 (P3.26) are not used. Stock cable will need to have one + // 10-pin IDC connector trimmed or replaced with a 12-pin IDC connector to fit J3. + // Requires REVERSE_ENCODER_DIRECTION in Configuration.h + + #define BEEPER_PIN P2_11 // J3-3 & AUX-4 + + #define BTN_EN1 P0_16 // J3-7 & AUX-4 + #define BTN_EN2 P1_23 // J3-5 & AUX-4 + #define BTN_ENC P3_25 // J3-4 & AUX-4 + + #define LCD_PINS_RS P0_15 // J3-9 & AUX-4 (CS) + #define LCD_PINS_ENABLE P0_18 // J3-10 & AUX-3 (SID, MOSI) + #define LCD_PINS_D4 P2_06 // J3-8 & AUX-3 (SCK, CLK) + + #else + + #define BTN_EN1 P3_26 // (31) J3-2 & AUX-4 + #define BTN_EN2 P3_25 // (33) J3-4 & AUX-4 + #define BTN_ENC P2_11 // (35) J3-3 & AUX-4 + + #define SD_DETECT_PIN P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #define KILL_PIN P1_22 // (41) J5-4 & AUX-4 + #define LCD_PINS_RS P0_16 // (16) J3-7 & AUX-4 + #define LCD_SDSS P0_16 // (16) J3-7 & AUX-4 + #define LCD_BACKLIGHT_PIN P0_16 // (16) J3-7 & AUX-4 - only used on DOGLCD controllers + #define LCD_PINS_ENABLE P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define LCD_PINS_D4 P0_15 // (52) (SCK) J3-9 & AUX-3 + + #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 + + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT P0_18 // (51) (MOSI) J3-10 & AUX-3 + #define SHIFT_CLK P0_15 // (52) (SCK) J3-9 & AUX-3 + #define SHIFT_LD P1_31 // (49) not 5V tolerant J3-1 & AUX-3 + #elif DISABLED(NEWPANEL) + //#define SHIFT_OUT P2_11 // (35) J3-3 & AUX-4 + //#define SHIFT_CLK P3_26 // (31) J3-2 & AUX-4 + //#define SHIFT_LD P3_25 // (33) J3-4 & AUX-4 + //#define SHIFT_EN P1_22 // (41) J5-4 & AUX-4 + #endif + + #if ANY(VIKI2, miniVIKI) + //#define LCD_SCREEN_ROT_180 + + #define BEEPER_PIN P1_30 // (37) may change if cable changes + #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 + #define DOGLCD_SCK SCK_PIN + #define DOGLCD_MOSI MOSI_PIN + + #define STAT_LED_BLUE_PIN P0_26 // (63) may change if cable changes + #define STAT_LED_RED_PIN P1_21 // ( 6) may change if cable changes + #else + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 P1_17 // (71) ENET_MDIO + #define LCD_PINS_D6 P1_14 // (73) ENET_RX_ER + #define LCD_PINS_D7 P1_10 // (75) ENET_RXD1 + #endif + #define BEEPER_PIN P1_30 // (37) not 5V tolerant + #define DOGLCD_CS P0_16 // (16) + #endif + + #if ENABLED(MINIPANEL) + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + #endif + + #endif + +#endif // HAS_WIRED_LCD + +// +// SD Support +// +#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) + #define SCK_PIN P0_15 + #define MISO_PIN P0_17 + #define MOSI_PIN P0_18 + #define SS_PIN P1_23 +#elif SD_CONNECTION_IS(ONBOARD) + #undef SD_DETECT_PIN + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN ONBOARD_SD_CS_PIN +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h new file mode 100644 index 00000000..99ff0fd2 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h @@ -0,0 +1,44 @@ +/** + * 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 + +/** + * Azteeg X5 MINI pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Azteeg X5 MINI WIFI" + +// +// DIGIPOT slave addresses +// +#ifndef DIGIPOT_I2C_ADDRESS_A + #define DIGIPOT_I2C_ADDRESS_A 0x58 // shifted slave address for first DIGIPOT (0x58 <- 0x2C << 1) +#endif +#ifndef DIGIPOT_I2C_ADDRESS_B + #define DIGIPOT_I2C_ADDRESS_B 0x5C // shifted slave address for second DIGIPOT (0x5C <- 0x2E << 1) +#endif + +#include "pins_AZTEEG_X5_MINI.h" diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h new file mode 100644 index 00000000..6d6d7557 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -0,0 +1,260 @@ +/** + * 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 BOARD_INFO_NAME + #define BOARD_INFO_NAME "BTT SKR E3 Turbo" +#endif + +// Onboard I2C EEPROM +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB (AT24C32) + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// TMC StallGuard DIAG pins +// +#define X_DIAG_PIN P1_29 // X-STOP +#define Y_DIAG_PIN P1_28 // Y-STOP +#define Z_DIAG_PIN P1_27 // Z-STOP +#define E0_DIAG_PIN P1_26 // E0DET +#define E1_DIAG_PIN P1_25 // E1DET + +// +// Limit Switches +#define X_STOP_PIN X_DIAG_PIN +#define Y_STOP_PIN Y_DIAG_PIN +#define Z_STOP_PIN Z_DIAG_PIN + +// +// Z Probe +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P1_22 +#endif + +// +// Filament Runout Sensor +// +#define FIL_RUNOUT_PIN P1_26 // E0DET +#define FIL_RUNOUT2_PIN P1_25 // E1DET + +// +// Power Supply Control +// +#ifndef PS_ON_PIN + #define PS_ON_PIN P1_21 +#endif + +// LED driving pin +#define NEOPIXEL_PIN P1_24 + +// +// Power Loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN P1_20 // PWRDET +#endif + +// +// Steppers +// +#define X_STEP_PIN P1_04 +#define X_DIR_PIN P1_08 +#define X_ENABLE_PIN P1_00 +#ifndef X_CS_PIN + #define X_CS_PIN P1_01 +#endif + +#define Y_STEP_PIN P1_14 +#define Y_DIR_PIN P1_15 +#define Y_ENABLE_PIN P1_09 +#ifndef Y_CS_PIN + #define Y_CS_PIN P1_10 +#endif + +#define Z_STEP_PIN P4_29 +#define Z_DIR_PIN P4_28 +#define Z_ENABLE_PIN P1_16 +#ifndef Z_CS_PIN + #define Z_CS_PIN P1_17 +#endif + +#define E0_STEP_PIN P2_06 +#define E0_DIR_PIN P2_07 +#define E0_ENABLE_PIN P0_04 +#ifndef E0_CS_PIN + #define E0_CS_PIN P0_05 +#endif + +#define E1_STEP_PIN P2_11 +#define E1_DIR_PIN P2_12 +#define E1_ENABLE_PIN P0_21 +#ifndef E1_CS_PIN + #define E1_CS_PIN P0_22 +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + + // + // Software serial + // + #define X_SERIAL_TX_PIN P1_01 + #define X_SERIAL_RX_PIN P1_01 + + #define Y_SERIAL_TX_PIN P1_10 + #define Y_SERIAL_RX_PIN P1_10 + + #define Z_SERIAL_TX_PIN P1_17 + #define Z_SERIAL_RX_PIN P1_17 + + #define E0_SERIAL_TX_PIN P0_05 + #define E0_SERIAL_RX_PIN P0_05 + + #define E1_SERIAL_TX_PIN P0_22 + #define E1_SERIAL_RX_PIN P0_22 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// TMC Low Power Standby pins +// +#define X_STDBY_PIN P3_26 +#define Y_STDBY_PIN P3_25 +#define Z_STDBY_PIN P1_18 +#define E0_STDBY_PIN P1_19 +#define E1_STDBY_PIN P2_13 + +// +// Temperature Sensors +// +#define TEMP_0_PIN P0_24 +#define TEMP_1_PIN P0_23 +//#define TEMP_2_PIN P1_30 // Onboard thermistor +#define TEMP_BED_PIN P0_25 + +// +// Heaters / Fans +// +#define HEATER_0_PIN P2_03 // EXTRUDER 0 +#define HEATER_1_PIN P2_04 // EXTRUDER 1 +#define HEATER_BED_PIN P2_05 // BED +#define FAN_PIN P2_01 +#define FAN1_PIN P2_02 + +/** + * _____ + * 5V | 1 2 | GND + * (LCD_EN) P0_18 | 3 4 | P0_17 (LCD_RS) + * (LCD_D4) P0_15 | 5 6 P0_20 (BTN_EN2) + * RESET | 7 8 | P0_19 (BTN_EN1) + * (BTN_ENC) P0_16 | 9 10| P2_08 (BEEPER) + * ----- + * EXP + */ + +#define EXPA1_03_PIN P0_18 +#define EXPA1_04_PIN P0_17 +#define EXPA1_05_PIN P0_15 +#define EXPA1_06_PIN P0_20 +#define EXPA1_07_PIN -1 +#define EXPA1_08_PIN P0_19 +#define EXPA1_09_PIN P0_16 +#define EXPA1_10_PIN P2_08 + +#if HAS_WIRED_LCD + + #if ENABLED(CR10_STOCKDISPLAY) + + #define BEEPER_PIN EXPA1_10_PIN + + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN + + #define LCD_PINS_RS EXPA1_04_PIN + #define LCD_PINS_ENABLE EXPA1_03_PIN + #define LCD_PINS_D4 EXPA1_05_PIN + + #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_E3_TURBO.h' for details. Comment out this line to continue." + + #define LCD_PINS_RS EXPA1_05_PIN + #define LCD_PINS_ENABLE EXPA1_09_PIN + #define LCD_PINS_D4 EXPA1_04_PIN + #define LCD_PINS_D5 EXPA1_06_PIN + #define LCD_PINS_D6 EXPA1_08_PIN + #define LCD_PINS_D7 EXPA1_10_PIN + #define ADC_KEYPAD_PIN P1_23 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + #define BTN_EN1 EXPA1_08_PIN + #define BTN_EN2 EXPA1_06_PIN + #define BTN_ENC EXPA1_09_PIN + + #define DOGLCD_CS EXPA1_04_PIN + #define DOGLCD_A0 EXPA1_05_PIN + #define DOGLCD_SCK EXPA1_10_PIN + #define DOGLCD_MOSI EXPA1_03_PIN + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + + #else + + #error "Only ZONESTAR_LCD, MKS_MINI_12864, ENDER2_STOCKDISPLAY, and CR10_STOCKDISPLAY are currently supported on the BTT_SKR_E3_TURBO." + + #endif + +#endif // HAS_WIRED_LCD + +// +// SD Support +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN P2_00 + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN P0_06 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "SD CUSTOM_CABLE is not compatible with SKR E3 Turbo." +#endif + +#define ON_BOARD_SPI_DEVICE 1 // SPI1 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 new file mode 100644 index 00000000..a751286e --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.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 + +#define BOARD_INFO_NAME "BTT SKR V1.4 TURBO" +#define SKR_HAS_LPC1769 + +// +// Include SKR 1.4 pins +// +#include "../lpc1768/pins_BTT_SKR_V1_4.h" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h new file mode 100644 index 00000000..d66ffbe4 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -0,0 +1,177 @@ +/** + * 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 + +/** + * Cohesion3D Mini pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Cohesion3D Mini" + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 + +// +// Default pins for TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 + #endif +#endif + +// +// Analog Inputs +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // P0_23 +#define TEMP_BED_PIN P0_24_A1 // P0_24 + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 // FET 1 +#ifndef FAN_PIN + #define FAN_PIN P2_06 // FET 3 +#endif + +// +// Auto fans +// +#define AUTO_FAN_PIN P2_04 // FET 4 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif + +// +// Misc. Functions +// +#define LED_PIN P4_28 // Play LED + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER + #undef HEATER_0_PIN + #define SPINDLE_LASER_ENA_PIN P2_07 // FET 1 + #undef HEATER_BED_PIN + #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #undef FAN_PIN + #define SPINDLE_DIR_PIN P2_06 // FET 3 +#endif + +// +// LCD / Controller +// +// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be +// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. +// +// A remote SD card is currently not supported because the pins routed to the EXP2 +// connector are shared with the onboard SD card, and Marlin does not support reading +// G-code files from the onboard SD card. +// +#if HAS_WIRED_LCD + + #define BEEPER_PIN P0_27 // EXP2-7 - open drain + + #define BTN_EN1 P3_26 // EXP2-5 + #define BTN_EN2 P3_25 // EXP2-3 + #define BTN_ENC P1_30 // EXP1-2 + + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_SDSS P0_28 // EXP2-4 + #define LCD_PINS_ENABLE P0_18 // EXP1-3 + #define LCD_PINS_D4 P0_15 // EXP1-5 + + #define KILL_PIN P2_11 // EXP2-10 + + #if ENABLED(SDSUPPORT) + #error "SDSUPPORT is not currently supported by the Cohesion3D boards" + #endif + +#endif // HAS_WIRED_LCD + +// +// Ethernet pins +// +#define ENET_MDIO P1_17 +#define ENET_RX_ER P1_14 +#define ENET_RXD1 P1_10 +#define ENET_MOC P1_16 +#define REF_CLK P1_15 +#define ENET_RXD0 P1_09 +#define ENET_CRS P1_08 +#define ENET_TX_EN P1_04 +#define ENET_TXD0 P1_00 +#define ENET_TXD1 P1_01 diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h new file mode 100644 index 00000000..66604ef6 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -0,0 +1,290 @@ +/** + * 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 + +/** + * Cohesion3D ReMix pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Cohesion3D ReMix" + +// +// Servos +// +#define SERVO0_PIN P2_04 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 // 10k pullup to 3.3V +#define X_MAX_PIN P1_25 // 10k pullup to 3.3V +#define Y_MIN_PIN P1_26 // 10k pullup to 3.3V +#define Y_MAX_PIN P1_27 // 10k pullup to 3.3V +#define Z_MIN_PIN P1_28 // 10k pullup to 3.3V +#define Z_MAX_PIN P1_29 // 10k pullup to 3.3V + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN P1_29 +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 +#define X_CS_PIN P1_10 // Ethernet Expansion - Pin 9 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 +#define Y_CS_PIN P1_09 // Ethernet Expansion - Pin 10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 +#define Z_CS_PIN P1_00 // Ethernet Expansion - Pin 11 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 +#define E0_CS_PIN P1_04 // Ethernet Expansion - Pin 12 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 +#define E1_CS_PIN P1_01 // Ethernet Expansion - Pin 14 + +#define E2_STEP_PIN P1_20 +#define E2_DIR_PIN P1_19 +#define E2_ENABLE_PIN P1_21 +#define E2_CS_PIN P1_18 // FET 6 + +// +// Default pins for TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI P1_16 // Ethernet Expansion - Pin 5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO P1_17 // Ethernet Expansion - Pin 6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK P1_08 // Ethernet Expansion - Pin 7 + #endif +#endif + +// +// Analog Inputs +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 +#define TEMP_BED_PIN P0_24_A1 +#define TEMP_1_PIN P0_25_A2 +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILWIDTH_PIN P0_26_A3 +#else + #define TEMP_2_PIN P0_26_A3 +#endif + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 // FET 1 +#define HEATER_1_PIN P1_23 // FET 2 +#define HEATER_2_PIN P1_22 // FET 3 +#ifndef FAN_PIN + #define FAN_PIN P2_06 // FET 4 +#endif + +// +// Auto fans +// +#if HOTENDS == 3 + #define AUTO_FAN_PIN P1_18 // FET 6 +#else + #define AUTO_FAN_PIN P1_22 // FET 3 +#endif +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif + +// +// Misc. Functions +// +#define LED_PIN P4_28 // Play LED + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER + #undef HEATER_0_PIN + #undef HEATER_BED_PIN + #undef FAN_PIN + #define SPINDLE_LASER_ENA_PIN P2_07 // FET 1 + #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #define SPINDLE_DIR_PIN P2_06 // FET 4 +#endif + +// +// LCD / Controller +// +// LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be +// defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. +// +// A remote SD card is currently not supported because the pins routed to the EXP2 +// connector are shared with the onboard SD card, and Marlin does not support that +// hardware configuration. +// + +#if ENABLED(FYSETC_MINI_12864) + + #define FORCE_SOFT_SPI // REQUIRED - results in LCD soft SPI mode 3 + + #define BEEPER_PIN P1_31 // EXP1-1 + #define BTN_ENC P1_30 // EXP1-2 + #define DOGLCD_CS P0_18 // EXP1-3 + #define DOGLCD_A0 P0_16 // EXP1-4 + #define LCD_RESET_PIN P0_15 // EXP1-5 + + // A custom cable is REQUIRED for EXP2 cable because the SCK & MOSI on the card's EXP2 are dedicated + // to the onboard SD card. All required EXP2 signals come from the Ethernet connector. Pin 1 of this + // connector is the one nearest the motor power connector. + #define DOGLCD_SCK P1_17 // EXP2-2 => Ethernet pin 5 (bottom, 3 from left) + #define BTN_EN2 P1_09 // EXP2-3 => Ethernet pin 9 (bottom, 5 from left) + #define BTN_EN1 P1_04 // EXP2-5 => Ethernet pin 11 (bottom, 6 from left) + #define DOGLCD_MOSI P1_01 // EXP2-6 => Ethernet pin 13 (bottom, 7 from left) + + // A custom EXP1 cable is required colored LEDs. Pins 1-5, 9, 10 of the cable go to pins 1-5, 9, 10 + // on the board's EXP1 connector. Pins 6, 7, and 8 of the EXP1 cable go to the Ethernet connector. + // Rev 1.2 displays do NOT require the RGB LEDs. 2.0 and 2.1 displays do require RGB. + #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left) + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN P1_10 // EXP1-7 => Ethernet pin 10 (top row, 5 from left) + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN P1_00 // EXP1-8 => Ethernet pin 12 (top row, 6 from left) + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left) + #endif + +#elif HAS_WIRED_LCD + + #define BEEPER_PIN P1_31 // EXP1-1 + //#define SD_DETECT_PIN P0_27 // EXP2-7 + + #define BTN_EN1 P3_26 // EXP2-5 + #define BTN_EN2 P3_25 // EXP2-3 + #define BTN_ENC P1_30 // EXP1-2 + + #define LCD_PINS_RS P0_16 // EXP1-4 + #define LCD_SDSS P0_28 // EXP2-4 + #define LCD_PINS_ENABLE P0_18 // EXP1-3 + #define LCD_PINS_D4 P0_15 // EXP1-5 + + #define KILL_PIN P2_11 // EXP2-10 + +#endif // HAS_WIRED_LCD + +// +// SD Support +// +#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) + #define SCK_PIN P0_07 // (52) system defined J3-9 & AUX-3 + #define MISO_PIN P0_08 // (50) system defined J3-10 & AUX-3 + #define MOSI_PIN P0_09 // (51) system defined J3-10 & AUX-3 + #define SS_PIN P1_23 // (53) system defined J3-5 & AUX-3 (Sometimes called SDSS) - CS used by Marlin +#elif SD_CONNECTION_IS(ONBOARD) + #undef SD_DETECT_PIN + #define SCK_PIN P0_07 + #define MISO_PIN P0_08 + #define MOSI_PIN P0_09 + #define SS_PIN ONBOARD_SD_CS_PIN +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +// +// Ethernet pins +// +//#define ENET_MDIO P1_17 // Ethernet pin 5 (bottom, 3 from left) +//#define ENET_RX_ER P1_14 +//#define ENET_RXD1 P1_10 // Ethernet pin 10 (top row, 5 from left) +//#define ENET_MOC P1_16 // Ethernet pin 6 (top row, 3 from left) +//#define REF_CLK P1_15 +//#define ENET_RXD0 P1_09 // Ethernet pin 9 (bottom, 5 from left) +//#define ENET_CRS P1_08 // Ethernet pin 8 (top row, 4 from left) - INPUT ONLY +//#define ENET_TX_EN P1_04 // Ethernet pin 11 (bottom, 6 from left) +//#define ENET_TXD0 P1_00 // Ethernet pin 12 (top row, 6 from left) +//#define ENET_TXD1 P1_01 // Ethernet pin 13 (bottom, 7 from left) + +/** + * EXP1 pins + * 1 - P1_31 + * 2 - P1_30 + * 3 - P0_18 + * 4 - P0_16 + * 5 - P0_15 + * 6 - N/C + * 7 - N/C + * 8 - P0_27 (also on EXP2-7) + * 9 - GND + * 10 - +5V + * + * + * EXP2 pins + * 1 - P0_08 + * 2 - P0_07 + * 3 - P3_26 + * 4 - P0_28 + * 5 - P3_25 + * 6 - P0_09 + * 7 - P0_27 (also on EXP1_8) + * 8 - P2_11 + * 9 - GND + * 10 - N/C + */ diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h new file mode 100644 index 00000000..d6754999 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -0,0 +1,59 @@ +/** + * 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 + * + * The pins diagram can be found and the following URL: + * https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "MKS SGen" +#define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN" + +#define MKS_HAS_LPC1769 +#include "../lpc1768/pins_MKS_SBASE.h" + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + */ + + #define X_SERIAL_TX_PIN P1_22 // J8-2 + #define X_SERIAL_RX_PIN P1_22 // J8-2 + #define Y_SERIAL_TX_PIN P1_23 // J8-3 + #define Y_SERIAL_RX_PIN P1_23 // J8-3 + #define Z_SERIAL_TX_PIN P2_12 // J8-4 + #define Z_SERIAL_RX_PIN P2_12 // J8-4 + #define E0_SERIAL_TX_PIN P2_11 // J8-5 + #define E0_SERIAL_RX_PIN P2_11 // J8-5 + #define E1_SERIAL_TX_PIN P4_28 // J8-6 + #define E1_SERIAL_RX_PIN P4_28 // J8-6 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif 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 00000000..62660935 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -0,0 +1,367 @@ +/** + * 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 + */ + +#if NOT_TARGET(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 Serial1 + //#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 HAS_MULTI_HOTEND + #ifndef HEATER_1_PIN + #define HEATER_1_PIN P2_06 + #endif +#else + #ifndef FAN2_PIN + #define FAN2_PIN P2_06 // HE1 for FAN3 + #endif +#endif +#ifndef FAN_PIN + #define FAN_PIN P2_04 // FAN1 +#endif +#ifndef FAN1_PIN + #define FAN1_PIN P1_04 // FAN2 +#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 IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_25 + #endif + + #define SD_DETECT_PIN P0_27 + +#elif HAS_WIRED_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_WIRED_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/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h new file mode 100644 index 00000000..f2811b14 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -0,0 +1,181 @@ +/** + * 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 + +/** + * Smoothieboard pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "Smoothieboard" +#define BOARD_WEBSITE_URL "smoothieware.org/smoothieboard" + +// +// Servos +// +#define SERVO0_PIN P1_23 + +// +// Limit Switches +// +#define X_MIN_PIN P1_24 +#define X_MAX_PIN P1_25 +#define Y_MIN_PIN P1_26 +#define Y_MAX_PIN P1_27 +#define Z_MIN_PIN P1_28 +#define Z_MAX_PIN P1_29 + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P0_05 +#define X_ENABLE_PIN P0_04 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P0_11 +#define Y_ENABLE_PIN P0_10 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P0_20 +#define Z_ENABLE_PIN P0_19 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P0_22 +#define E0_ENABLE_PIN P0_21 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +// +// Temperature Sensors +// 3.3V max when defined as an analog input +// +#define TEMP_0_PIN P0_23_A0 // (T1) +#define TEMP_BED_PIN P0_24_A1 // (T2) +#define TEMP_1_PIN P0_25_A2 // (T3) +#define TEMP_2_PIN P0_26_A3 // (T4) + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#define HEATER_1_PIN P1_23 +#ifndef FAN_PIN + #define FAN_PIN P2_06 +#endif +#define FAN1_PIN P2_04 + +// +// LCD / Controller +// +#if ANY(VIKI2, miniVIKI) + + #define BEEPER_PIN P1_31 + #define DOGLCD_A0 P2_11 + #define DOGLCD_CS P0_16 + + #define BTN_EN1 P3_25 + #define BTN_EN2 P3_26 + #define BTN_ENC P1_30 + + #define SD_DETECT_PIN P1_18 + #define SDSS P1_21 + + #define STAT_LED_RED_PIN P1_19 + #define STAT_LED_BLUE_PIN P1_20 + +#elif HAS_WIRED_LCD + + /** + * 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 SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) + + #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) + + /** + * 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 + + #elif IS_TFTGLCD_PANEL + + #define SD_DETECT_PIN P0_27 // EXP2 Pin 7 (SD_CD, SD_DET) + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS P3_26 // EXP2 Pin 3 + #endif + + #else + #error "Marlin's Smoothieboard support cannot drive your LCD." + #endif + +#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 diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h new file mode 100644 index 00000000..a0174f26 --- /dev/null +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -0,0 +1,182 @@ +/** + * 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 + +/** + * TH3D EZBoard pin assignments + */ + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif + +#define BOARD_INFO_NAME "TH3D EZBoard" +#define BOARD_WEBSITE_URL "th3dstudio.com" + +// +// Servos +// +#define SERVO0_PIN P2_04 + +// +// Limit Switches +// +#define X_STOP_PIN P1_24 +#define Y_STOP_PIN P1_25 +#define Z_STOP_PIN P1_26 + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN P1_27 +#endif + +// +// Steppers +// +#define X_STEP_PIN P2_00 +#define X_DIR_PIN P1_16 +#define X_ENABLE_PIN P1_17 + +#define Y_STEP_PIN P2_01 +#define Y_DIR_PIN P1_10 +#define Y_ENABLE_PIN P1_09 + +#define Z_STEP_PIN P2_02 +#define Z_DIR_PIN P1_15 +#define Z_ENABLE_PIN P1_14 + +#define E0_STEP_PIN P2_03 +#define E0_DIR_PIN P1_04 +#define E0_ENABLE_PIN P1_08 + +#define E1_STEP_PIN P2_08 +#define E1_DIR_PIN P2_13 +#define E1_ENABLE_PIN P4_29 + +#if HAS_TMC_UART + // + // TMC220x stepper drivers + // Software serial + // + #define X_SERIAL_TX_PIN P0_04 + #define X_SERIAL_RX_PIN P0_05 + #define Y_SERIAL_TX_PIN P0_10 + #define Y_SERIAL_RX_PIN P0_11 + #define Z_SERIAL_TX_PIN P0_19 + #define Z_SERIAL_RX_PIN P0_20 + #define E0_SERIAL_TX_PIN P0_22 + #define E0_SERIAL_RX_PIN P0_21 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temp Sensors +// 3.3V max when defined as an Analog Input! +// +#if TEMP_SENSOR_0 == 20 // PT100 Adapter + #define TEMP_0_PIN P0_02_A7 // Analog Input +#else + #define TEMP_0_PIN P0_23_A0 // Analog Input P0_23 +#endif + +#define TEMP_BED_PIN P0_24_A1 // Analog Input P0_24 +#define TEMP_1_PIN P0_25_A2 // Analog Input P0_25 + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILWIDTH_PIN P0_26_A3 // Analog Input P0_26 +#else + #define TEMP_2_PIN P0_26_A3 // Analog Input P0_26 +#endif + +// +// Heaters / Fans +// +#define HEATER_BED_PIN P2_05 +#define HEATER_0_PIN P2_07 +#ifndef FAN_PIN + #define FAN_PIN P2_06 +#endif +#define FAN1_PIN P1_22 + +// +// Auto fans +// +#define AUTO_FAN_PIN P1_22 // FET 3 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif + +// +// SD Card +// + +#define SDCARD_CONNECTION ONBOARD + +#define SCK_PIN P0_07 +#define MISO_PIN P0_08 +#define MOSI_PIN P0_09 +#define ONBOARD_SD_CS_PIN P0_06 +#define SS_PIN ONBOARD_SD_CS_PIN + +// +// LCD / Controller +// + +/** + * _____ + * 5V | · · | GND + * (LCD_EN) P0_18 | · · | P0_16 (LCD_RS) + * (LCD_D4) P0_15 | · · | P3_25 (BTN_EN2) + * (RESET) P2_11 | · · | P3_26 (BTN_EN1) + * (BTN_ENC) P1_30 | · · | P1_31 (BEEPER) + * ----- + * EXP1 + * + * LCD_PINS_D5, D6, and D7 are not present in the EXP1 connector, and will need to be + * defined to use the REPRAP_DISCOUNT_SMART_CONTROLLER. + * + * A remote SD card is currently not supported because the pins routed to the EXP2 + * connector are shared with the onboard SD card. + */ + +#if ENABLED(CR10_STOCKDISPLAY) + #define BEEPER_PIN P1_31 + #define BTN_EN1 P3_26 + #define BTN_EN2 P3_25 + #define BTN_ENC P1_30 + #define LCD_PINS_RS P0_16 + #define LCD_PINS_ENABLE P0_18 + #define LCD_PINS_D4 P0_15 + #define KILL_PIN P2_11 +#elif HAS_WIRED_LCD + #error "Only the CR10_STOCKDISPLAY is supported with TH3D EZBoard." +#endif diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h new file mode 100644 index 00000000..98427d9e --- /dev/null +++ b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h @@ -0,0 +1,80 @@ +/** + * 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 + +/** + * Cheaptronic v1.0 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Cheaptronic v1.0" +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 2 +#define Z_STOP_PIN 5 + +// +// Steppers +// +#define X_STEP_PIN 14 +#define X_DIR_PIN 15 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 35 +#define Y_DIR_PIN 36 +#define Y_ENABLE_PIN 31 + +#define Z_STEP_PIN 40 +#define Z_DIR_PIN 41 +#define Z_ENABLE_PIN 37 + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 25 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 + +// +// Temperature sensors +// +#define TEMP_0_PIN 15 // Analog Input +#define TEMP_1_PIN 14 // Analog Input +#define TEMP_BED_PIN 13 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 19 // EXTRUDER 1 +#define HEATER_1_PIN 23 // EXTRUDER 2 +#define HEATER_BED_PIN 22 + +// +// LCD / Controller +// +// Cheaptronic v1.0 doesn't support LCD diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h new file mode 100644 index 00000000..3a84f439 --- /dev/null +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -0,0 +1,136 @@ +/** + * 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 + +/** + * Cheaptronic v2.0 pin assignments + * Built and sold by Michal Dyntar - RRO + * www.reprapobchod.cz + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Cheaptronic v2.0" + +// +// Limit Switches +// +#define X_MIN_PIN 30 +#define X_MAX_PIN 31 +#define Y_MIN_PIN 32 +#define Y_MAX_PIN 33 +#define Z_MIN_PIN 34 +#define Z_MAX_PIN 35 + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 54 +#define Y_DIR_PIN 47 +#define Y_ENABLE_PIN 55 + +#define Z_STEP_PIN 57 +#define Z_DIR_PIN 56 +#define Z_ENABLE_PIN 62 + +#define E0_STEP_PIN 23 +#define E0_DIR_PIN 22 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 25 +#define E1_ENABLE_PIN 27 + +#define E2_STEP_PIN 29 +#define E2_DIR_PIN 28 +#define E2_ENABLE_PIN 39 + +// +// Temperature sensors +// +#define TEMP_0_PIN 15 +#define TEMP_1_PIN 13 +#define TEMP_2_PIN 14 +#define TEMP_3_PIN 11 // should be used for chamber temperature control +#define TEMP_BED_PIN 12 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 6 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 8 +#define HEATER_BED_PIN 9 +#ifndef FAN_PIN + #define FAN_PIN 3 +#endif +#define FAN2_PIN 58 // additional fan or light control output + +// +// Other board specific pins +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 37 // board input labeled as F-DET +#endif +#define Z_MIN_PROBE_PIN 36 // additional external board input labeled as E-SENS (should be used for Z-probe) +#define LED_PIN 13 +#define SPINDLE_ENABLE_PIN 4 // additional PWM pin 1 at JP1 connector - should be used for laser control too +#define EXT_2 5 // additional PWM pin 2 at JP1 connector +#define EXT_3 2 // additional PWM pin 3 at JP1 connector +#define PS_ON_PIN 45 +#define KILL_PIN 46 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 11 // shared with TEMP_3 analog input +#endif + +// +// LCD / Controller +// +#define LCD_PINS_RS 19 +#define LCD_PINS_ENABLE 42 +#define LCD_PINS_D4 18 +#define LCD_PINS_D5 38 +#define LCD_PINS_D6 41 +#define LCD_PINS_D7 40 + +// +// Beeper, SD Card, Encoder +// +#define BEEPER_PIN 44 + +#if ENABLED(SDSUPPORT) + #define SDSS 53 + #define SD_DETECT_PIN 49 +#endif + +#if ENABLED(NEWPANEL) + #define BTN_EN1 11 + #define BTN_EN2 12 + #define BTN_ENC 43 +#endif diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h new file mode 100644 index 00000000..675d4b72 --- /dev/null +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.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 + +/** + * CartesioV11 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "CN Controls V11" + +// +// Limit Switches +// +#define X_STOP_PIN 43 +#define Y_STOP_PIN 45 +#define Z_STOP_PIN 42 + +// +// Steppers +// +#define X_STEP_PIN 34 +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 35 + +#define Y_STEP_PIN 37 +#define Y_DIR_PIN 39 +#define Y_ENABLE_PIN 38 + +#define Z_STEP_PIN 40 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 41 + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 3 + +#define E1_STEP_PIN 61 +#define E1_DIR_PIN 62 +#define E1_ENABLE_PIN 60 + +#define E2_STEP_PIN 15 +#define E2_DIR_PIN 14 +#define E2_ENABLE_PIN 16 + +#define E3_STEP_PIN 44 +#define E3_DIR_PIN 49 +#define E3_ENABLE_PIN 47 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 3 // Analog Input. 3 for tool2 -> 2 for chambertemp +#define TEMP_2_PIN 2 // Analog Input. 9 for tool3 -> 2 for chambertemp +#define TEMP_3_PIN 11 // Analog Input. 11 for tool4 -> 2 for chambertemp +#define TEMP_BED_PIN 1 // Analog Input + +#ifndef TEMP_CHAMBER_PIN + //#define TEMP_CHAMBER_PIN 2 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 5 +#define HEATER_1_PIN 58 +#define HEATER_2_PIN 64 +#define HEATER_3_PIN 46 +#define HEATER_BED_PIN 2 + +#ifndef FAN_PIN + //#define FAN_PIN 7 // common PWM pin for all tools +#endif + +// +// Auto fans +// +#define AUTO_FAN_PIN 7 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN AUTO_FAN_PIN +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 13 + +// Tools + +//#define TOOL_0_PIN 4 +//#define TOOL_1_PIN 59 +//#define TOOL_2_PIN 8 +//#define TOOL_3_PIN 30 +//#define TOOL_PWM_PIN 7 // common PWM pin for all tools + +// Common I/O + +//#define FIL_RUNOUT_PIN -1 +//#define PWM_1_PIN 11 +//#define PWM_2_PIN 10 +//#define SPARE_IO 12 + +// +// LCD / Controller +// +#define BEEPER_PIN 6 + +// Pins for DOGM SPI LCD Support +#define DOGLCD_A0 26 +#define DOGLCD_CS 24 +#define DOGLCD_MOSI -1 +#define DOGLCD_SCK -1 + +#define BTN_EN1 23 +#define BTN_EN2 25 +#define BTN_ENC 27 + +// Hardware buttons for manual movement of XYZ +#define SHIFT_OUT 19 +#define SHIFT_LD 18 +#define SHIFT_CLK 17 + +//#define UI1 31 +//#define UI2 22 + +#define STAT_LED_BLUE_PIN -1 +#define STAT_LED_RED_PIN 31 diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h new file mode 100644 index 00000000..35426a45 --- /dev/null +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h @@ -0,0 +1,167 @@ +/** + * 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 + +/** + * CartesioV12 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "CN Controls V12" + +// +// Limit Switches +// +#define X_STOP_PIN 19 +#define Y_STOP_PIN 22 +#define Z_STOP_PIN 23 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 27 +#define X_ENABLE_PIN 26 + +#define Y_STEP_PIN 28 +#define Y_DIR_PIN 30 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 31 +#define Z_DIR_PIN 33 +#define Z_ENABLE_PIN 32 + +#define E0_STEP_PIN 57 +#define E0_DIR_PIN 55 +#define E0_ENABLE_PIN 58 + +#define E1_STEP_PIN 61 +#define E1_DIR_PIN 62 +#define E1_ENABLE_PIN 60 + +#define E2_STEP_PIN 46 +#define E2_DIR_PIN 66 +#define E2_ENABLE_PIN 44 + +#define E3_STEP_PIN 45 +#define E3_DIR_PIN 69 +#define E3_ENABLE_PIN 47 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 9 // Analog Input. 9 for tool2 -> 13 for chambertemp +#define TEMP_2_PIN 13 // Analog Input. 10 for tool3 -> 13 for chambertemp +#define TEMP_3_PIN 11 // Analog Input. 11 for tool4 -> 13 for chambertemp +#define TEMP_BED_PIN 14 // Analog Input + +#ifndef TEMP_CHAMBER_PIN + //#define TEMP_CHAMBER_PIN 13 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 11 +#define HEATER_1_PIN 9 +#define HEATER_2_PIN 6 +#define HEATER_3_PIN 3 +#define HEATER_BED_PIN 24 + +#ifndef FAN_PIN + #define FAN_PIN 5 // 5 is PWMtool3 -> 7 is common PWM pin for all tools +#endif + +// +// Auto fans +// +#define AUTO_FAN_PIN 7 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN AUTO_FAN_PIN +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 15 + +// Tools + +//#define TOOL_0_PIN 56 +//#define TOOL_0_PWM_PIN 10 // red warning led at dual extruder +//#define TOOL_1_PIN 59 +//#define TOOL_1_PWM_PIN 8 // lights at dual extruder +//#define TOOL_2_PIN 4 +//#define TOOL_2_PWM_PIN 5 +//#define TOOL_3_PIN 14 +//#define TOOL_3_PWM_PIN 2 + +// Common I/O + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 18 +#endif +//#define PWM_1_PIN 12 +//#define PWM_2_PIN 13 +//#define SPARE_IO 17 + +// +// LCD / Controller +// +#define BEEPER_PIN 16 + +// Pins for DOGM SPI LCD Support +#define DOGLCD_A0 39 +#define DOGLCD_CS 35 +#define DOGLCD_MOSI 48 +#define DOGLCD_SCK 49 +#define LCD_SCREEN_ROT_180 + +// The encoder and click button +#define BTN_EN1 36 +#define BTN_EN2 34 +#define BTN_ENC 38 + +// Hardware buttons for manual movement of XYZ +#define SHIFT_OUT 42 +#define SHIFT_LD 41 +#define SHIFT_CLK 40 + +//#define UI1 43 +//#define UI2 37 + +#define STAT_LED_BLUE_PIN -1 +#define STAT_LED_RED_PIN 10 // TOOL_0_PWM_PIN diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h new file mode 100644 index 00000000..8bafbdf0 --- /dev/null +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h @@ -0,0 +1,127 @@ +/** + * 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 + +/** + * CNControls V15 for HMS434 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "CN Controls V15" + +// +// Servos +// +#define SERVO0_PIN 6 + +// +// Limit Switches +// +#define X_STOP_PIN 34 +#define Y_STOP_PIN 39 +#define Z_STOP_PIN 62 + +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 49 +#endif + +// +// Steppers +// +#define X_STEP_PIN 14 +#define X_DIR_PIN 25 +#define X_ENABLE_PIN 26 + +#define Y_STEP_PIN 11 +#define Y_DIR_PIN 12 +#define Y_ENABLE_PIN 15 + +#define Z_STEP_PIN 24 +#define Z_DIR_PIN 27 +#define Z_ENABLE_PIN 28 + +#define E0_STEP_PIN 64 +#define E0_DIR_PIN 65 +#define E0_ENABLE_PIN 63 + +// +// Temperature Sensors +// Analog Inputs +// +#define TEMP_0_PIN 2 // Analog Input +#define TEMP_BED_PIN 4 // Analog Input + +#ifndef TEMP_CHAMBER_PIN + #define TEMP_CHAMBER_PIN 5 // Analog Input +#endif + +// +// Heaters +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 32 +#define HEATER_CHAMBER_PIN 33 + +// +// Fans +// +#define FAN_PIN 8 + +// +// Auto fans +// +#define AUTO_FAN_PIN 30 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef CHAMBER_AUTO_FAN_PIN + //#define CHAMBER_AUTO_FAN_PIN 10 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 40 + +// Common I/O + +#define FIL_RUNOUT_PIN 9 +//#define FIL_RUNOUT_PIN 29 // encoder sensor +//#define PWM_1_PIN 12 +//#define PWM_2_PIN 13 +//#define SPARE_IO 17 +#define BEEPER_PIN 13 +#define STAT_LED_BLUE_PIN -1 +#define STAT_LED_RED_PIN 10 // 31 diff --git a/Marlin/src/pins/mega/pins_EINSTART-S.h b/Marlin/src/pins/mega/pins_EINSTART-S.h new file mode 100644 index 00000000..40d65c35 --- /dev/null +++ b/Marlin/src/pins/mega/pins_EINSTART-S.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 + +/** + * Einstart-S pin assignments + * PCB Silkscreen: 3DPrinterCon_v3.5 + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Einstart-S" + +// +// Limit Switches +// +#define X_STOP_PIN 44 +#define Y_STOP_PIN 43 +#define Z_STOP_PIN 42 + +// +// Steppers +// +#define X_STEP_PIN 76 +#define X_DIR_PIN 75 +#define X_ENABLE_PIN 73 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 32 +#define Y_ENABLE_PIN 72 + +#define Z_STEP_PIN 34 +#define Z_DIR_PIN 35 +#define Z_ENABLE_PIN 33 + +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 37 +#define E0_ENABLE_PIN 30 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 83 +#define HEATER_BED_PIN 38 + +#define FAN_PIN 82 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 4 + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +// +// LCD Display output pins +// + +// Requires #define U8GLIB_SH1106_EINSTART in Configuration.h +// u8glib constructor +// U8GLIB_SH1106_128X64 u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS, LCD_PINS_DC, LCD_PINS_RS); + +#define LCD_PINS_DC 78 +#define LCD_PINS_RS 79 +// DOGM SPI LCD Support +#define DOGLCD_CS 3 +#define DOGLCD_MOSI 2 +#define DOGLCD_SCK 5 +#define DOGLCD_A0 2 + +// +// LCD Display input pins +// +#define BTN_UP 25 +#define BTN_DWN 26 +#define BTN_LFT 27 +#define BTN_RT 28 + +// 'OK' button +#define BTN_ENC 29 + +// Set Kill to right arrow, same as RIGID_PANEL +#define KILL_PIN 28 diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h new file mode 100644 index 00000000..af93c408 --- /dev/null +++ b/Marlin/src/pins/mega/pins_ELEFU_3.h @@ -0,0 +1,152 @@ +/** + * 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 + +/** + * Elefu RA Board Pin Assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Elefu Ra v3" + +// +// Limit Switches +// +#define X_MIN_PIN 35 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 33 +#define Y_MAX_PIN 32 +#define Z_MIN_PIN 31 +#define Z_MAX_PIN 30 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 30 +#endif + +// +// Steppers +// +#define X_STEP_PIN 49 +#define X_DIR_PIN 13 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 11 +#define Y_DIR_PIN 9 +#define Y_ENABLE_PIN 12 + +#define Z_STEP_PIN 7 +#define Z_DIR_PIN 6 +#define Z_ENABLE_PIN 8 + +#define E0_STEP_PIN 40 +#define E0_DIR_PIN 41 +#define E0_ENABLE_PIN 37 + +#define E1_STEP_PIN 18 +#define E1_DIR_PIN 19 +#define E1_ENABLE_PIN 38 + +#define E2_STEP_PIN 43 +#define E2_DIR_PIN 47 +#define E2_ENABLE_PIN 42 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 3 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 45 // 12V PWM1 +#define HEATER_1_PIN 46 // 12V PWM2 +#define HEATER_2_PIN 17 // 12V PWM3 +#define HEATER_BED_PIN 44 // DOUBLE 12V PWM + +#ifndef FAN_PIN + #define FAN_PIN 16 // 5V PWM +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN 10 // Set to -1 if using a manual switch on the PWRSW Connector +#define SLEEP_WAKE_PIN 26 // This feature still needs work +#define PHOTOGRAPH_PIN 29 + +// +// LCD / Controller +// +#define BEEPER_PIN 36 + +#if ENABLED(RA_CONTROL_PANEL) + + #define SDSS 53 + #define SD_DETECT_PIN 28 + + #define BTN_EN1 14 + #define BTN_EN2 39 + #define BTN_ENC 15 + +#endif // RA_CONTROL_PANEL + +#if ENABLED(RA_DISCO) + // variables for which pins the TLC5947 is using + #define TLC_CLOCK_PIN 25 + #define TLC_BLANK_PIN 23 + #define TLC_XLAT_PIN 22 + #define TLC_DATA_PIN 24 + + // We also need to define pin to port number mapping for the 2560 to match the pins listed above. + // If you change the TLC pins, update this as well per the 2560 datasheet! This currently only works with the RA Board. + #define TLC_CLOCK_BIT 3 + #define TLC_CLOCK_PORT &PORTA + + #define TLC_BLANK_BIT 1 + #define TLC_BLANK_PORT &PORTA + + #define TLC_DATA_BIT 2 + #define TLC_DATA_PORT &PORTA + + #define TLC_XLAT_BIT 0 + #define TLC_XLAT_PORT &PORTA + + // Change this to match your situation. Lots of TLCs takes up the arduino SRAM very quickly, so be careful + // Leave it at at least 1 if you have enabled RA_LIGHTING + // The number of TLC5947 boards chained together for use with the animation, additional ones will repeat the animation on them, but are not individually addressable and mimic those before them. You can leave the default at 2 even if you only have 1 TLC5947 module. + #define NUM_TLCS 2 + + // These TRANS_ARRAY values let you change the order the LEDs on the lighting modules will animate for chase functions. + // Modify them according to your specific situation. + // NOTE: the array should be 8 long for every TLC you have. These defaults assume (2) TLCs. + #define TRANS_ARRAY { 0, 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8 } // forward + //#define TRANS_ARRAY { 7, 6, 5, 4, 3, 2, 1, 0, 8, 9, 10, 11, 12, 13, 14, 15 } // backward +#endif // RA_DISCO diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h new file mode 100644 index 00000000..2fe9a43b --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -0,0 +1,151 @@ +/** + * 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 + +/** + * Geeetech GT2560 Revision A board pin assignments, based on the work of + * George Robles (https://georges3dprinters.com) and + * Richard Smith + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "GT2560 Rev.A" +#endif +#define DEFAULT_MACHINE_NAME "Prusa i3 Pro B" + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 26 +#define Y_MAX_PIN 28 +#define Z_MIN_PIN 30 + +#if ENABLED(BLTOUCH) + #if MB(GT2560_REV_A_PLUS) + #define SERVO0_PIN 11 + #else + #define SERVO0_PIN 32 + #endif + #define Z_MAX_PIN -1 +#else + #define Z_MAX_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#define E0_STEP_PIN 43 +#define E0_DIR_PIN 45 +#define E0_ENABLE_PIN 41 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 +#define TEMP_1_PIN 9 +#define TEMP_BED_PIN 10 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define SUICIDE_PIN 54 // Must be enabled at startup to keep power flowing +#define KILL_PIN -1 + +#if HAS_WIRED_LCD + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_A0 5 + #define DOGLCD_CS 21 + #define BTN_EN1 40 + #define BTN_EN2 42 + #else + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + #define BTN_EN1 42 + #define BTN_EN2 40 + #endif + + #define BTN_ENC 19 + #define SD_DETECT_PIN 38 + + #else // !NEWPANEL + + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #define SD_DETECT_PIN -1 + + #endif // !NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h new file mode 100644 index 00000000..7e2ce20c --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.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 + +/** + * Geeetech GT2560 Revision A+ board pin assignments + */ + +#define BOARD_INFO_NAME "GT2560 Rev.A+" + +#include "pins_GT2560_REV_A.h" + +#if DISABLED(BLTOUCH) + #define SERVO0_PIN 32 +#endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h new file mode 100644 index 00000000..d71a1954 --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -0,0 +1,185 @@ +/** + * 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 + +/** + * GT2560 RevB + GT2560 V3.0 + GT2560 V3.1 + GT2560 V4.0 pin assignment + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "GT2560 V3.0" +#endif + +// +// Servos +// +#define SERVO0_PIN 11 //13 untested 3Dtouch + +// +// Limit Switches +// +#ifndef X_STOP_PIN + #ifndef X_MIN_PIN + #define X_MIN_PIN 24 + #endif + #ifndef X_MAX_PIN + #define X_MAX_PIN 22 + #endif +#endif +#ifndef Y_STOP_PIN + #ifndef Y_MIN_PIN + #define Y_MIN_PIN 28 + #endif + #ifndef Y_MAX_PIN + #define Y_MAX_PIN 26 + #endif +#endif +#ifndef Z_STOP_PIN + #ifndef Z_MIN_PIN + #define Z_MIN_PIN 30 + #endif + #ifndef Z_MAX_PIN + #define Z_MAX_PIN 32 + #endif +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 66 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN 67 +#endif + +// +// Power Recovery +// +#define POWER_LOSS_PIN 69 // Pin to detect power loss +#define POWER_LOSS_STATE LOW + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 39 +#define X_ENABLE_PIN 35 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 25 +#define Z_DIR_PIN 23 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 46 +#define E0_DIR_PIN 44 +#define E0_ENABLE_PIN 12 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +#define E2_STEP_PIN 43 +#define E2_DIR_PIN 45 +#define E2_ENABLE_PIN 41 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 11 // Analog Input +#define TEMP_1_PIN 9 // Analog Input +#define TEMP_2_PIN 8 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 3 +#define HEATER_2_PIN 2 +#define HEATER_BED_PIN 4 +#define FAN_PIN 9 +#define FAN1_PIN 8 +#define FAN2_PIN 7 + +// +// Misc. Functions +// +#define SD_DETECT_PIN 38 +#define SDSS 53 +#define LED_PIN 13 // Use 6 (case light) for external LED. 13 is internal (yellow) LED. +#define PS_ON_PIN 12 +#define SUICIDE_PIN 54 // This pin must be enabled at boot to keep power flowing + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 6 // 21 +#endif + +// +// LCD Controller +// +#define BEEPER_PIN 18 + +#ifndef LCD_PINS_RS + #define LCD_PINS_RS 20 +#endif +#ifndef LCD_PINS_ENABLE + #define LCD_PINS_ENABLE 17 +#endif +#ifndef LCD_PINS_D4 + #define LCD_PINS_D4 16 +#endif +#ifndef LCD_PINS_D5 + #define LCD_PINS_D5 21 +#endif +#ifndef LCD_PINS_D6 + #define LCD_PINS_D6 5 +#endif +#ifndef LCD_PINS_D7 + #define LCD_PINS_D7 36 +#endif + +#if ENABLED(NEWPANEL) + #ifndef BTN_EN1 + #define BTN_EN1 42 + #endif + #ifndef BTN_EN2 + #define BTN_EN2 40 + #endif + #ifndef BTN_ENC + #define BTN_ENC 19 + #endif +#endif diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h new file mode 100644 index 00000000..e1956488 --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h @@ -0,0 +1,41 @@ +/** + * 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 + +/** + * Geeetech A20M pin assignment + */ + +#define LCD_PINS_RS 5 +#define LCD_PINS_ENABLE 36 +#define LCD_PINS_D4 21 +#define LCD_PINS_D7 6 + +#define SPEAKER // The speaker can produce tones + +#if ENABLED(NEWPANEL) + #define BTN_EN1 16 + #define BTN_EN2 17 + #define BTN_ENC 19 +#endif + +#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h new file mode 100644 index 00000000..26721df3 --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_V3_MC2.h @@ -0,0 +1,35 @@ +/** + * 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 + +/***************************************************************** + * GT2560 V3.0 pin assignment (for Mecreator 2) + *****************************************************************/ + +#define BOARD_INFO_NAME "GT2560 V3.0 (MC2)" + +#define X_MIN_PIN 22 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 26 +#define Y_MAX_PIN 28 + +#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h new file mode 100644 index 00000000..e30a65b9 --- /dev/null +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -0,0 +1,173 @@ +/** + * 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 + +/** + * HJC2560-C Rev2.x pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define DEFAULT_MACHINE_NAME "ADIMLab Gantry v2" +#define BOARD_INFO_NAME "HJC2560-C" + +// +// Servos +// +//#ifndef SERVO0_PIN +// #define SERVO0_PIN 11 +//#endif + +// +// Limit Switches +// +#define X_STOP_PIN 22 +#define Y_STOP_PIN 26 +#define Z_STOP_PIN 29 +//#define EXP_STOP_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 32 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 31 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 36 +#define Z_ENABLE_PIN 34 + +#define E0_STEP_PIN 42 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 37 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +#define MOTOR_CURRENT_PWM_XY_PIN 44 +#define MOTOR_CURRENT_PWM_Z_PIN 45 +#define MOTOR_CURRENT_PWM_E_PIN 46 +// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 9 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 7 //默认不使用PWM_FAN冷却喷嘴,如果需要,则取消注释 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 39 +//#define LED_PIN 8 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 8 // 8 默认挤出机风扇作为Case LED,如果需要PWM FAN,则需要将FAN_PIN置为7,LED_PIN置为8 +#endif + +//#define SAFETY_TRIGGERED_PIN 28 // PIN to detect the safety circuit has triggered +//#define MAIN_VOLTAGE_MEASURE_PIN 14 // ANALOG PIN to measure the main voltage, with a 100k - 4k7 resitor divider. + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) + #define SPINDLE_DIR_PIN 16 + #define SPINDLE_LASER_ENABLE_PIN 17 // Pin should have a pullup! + #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #define LCD_PINS_RS 20 // LCD_CS + #define LCD_PINS_ENABLE 15 // LCD_SDA + #define LCD_PINS_D4 14 // LCD_SCK + + #if ENABLED(HJC_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN 5 // LCD_Backlight + //#ifndef LCD_CONTRAST_PIN + // #define LCD_CONTRAST_PIN 5 // LCD_Contrast + //#endif + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 24 // Filament runout + #endif + #else + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + #endif + + #define BTN_EN1 41 + #define BTN_EN2 40 + #define BTN_ENC 19 + + #define SD_DETECT_PIN 39 + + #else + + // Buttons attached to a shift register + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #endif // !NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h new file mode 100644 index 00000000..be5f461d --- /dev/null +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -0,0 +1,151 @@ +/** + * 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 + +/** + * Intamsys Funmat HT V4.0 Mainboard + * 4988 Drivers Tested + * 2208 version exists and may or may not work + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Intamsys 4.0" + +// +// Servos +// +#define SERVO0_PIN 12 // Uses High Temp Present Jumper Pin + +// +// Limit Switches +// +#define X_STOP_PIN 22 +#define Y_STOP_PIN 26 +#define Z_MIN_PIN 29 +#define Z_MAX_PIN 69 + +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 69 +#endif + +#define FIL_RUNOUT_PIN 10 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 // 44 + +#define Y_STEP_PIN 32 // 33 +#define Y_DIR_PIN 33 // 31, 32 +#define Y_ENABLE_PIN 31 // 32 + +#define Z_STEP_PIN 35 // 35 +#define Z_DIR_PIN 36 +#define Z_ENABLE_PIN 34 // 34 + +#define E0_STEP_PIN 42 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 37 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +#define MOTOR_CURRENT_PWM_X_PIN 11 +#define MOTOR_CURRENT_PWM_Y_PIN 44 +#define MOTOR_CURRENT_PWM_Z_PIN 45 +#define MOTOR_CURRENT_PWM_E_PIN 46 + +// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT { 1300, 1300, 1250 } + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input D62 +#define TEMP_BED_PIN 10 // Analog Input D64 + +#define TEMP_CHAMBER_PIN 9 // Analog Input D63 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 // PWM +#define HEATER_BED_PIN 4 // PWM +#define HEATER_CHAMBER_PIN 3 // PWM +#define FAN_PIN 7 // PWM + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 39 + +#if ENABLED(CASE_LIGHT_ENABLE) + #define CASE_LIGHT_PIN 8 +#endif + +#if ENABLED(PSU_CONTROL) + #define PS_ON_PIN 38 // UPS Module +#endif + +// +// LCD Controller +// + +#define BEEPER_PIN 18 + +#if HAS_WIRED_LCD + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 30 + #define LCD_PINS_D4 14 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + #define BTN_EN1 40 + #define BTN_EN2 41 + #define BTN_ENC 19 +#endif + +///////////////////// SPARE HEADERS ////////////// + +/** + * J25 + * 1 D54 + * 2 D55 + * 3 D56 + * 4 D57 + * 5 D58 + * 6 D59 + * 7 D60 + * 8 D61 + +Hotend High Temp Connected : D12 +*/ diff --git a/Marlin/src/pins/mega/pins_LEAPFROG.h b/Marlin/src/pins/mega/pins_LEAPFROG.h new file mode 100644 index 00000000..9e6802b2 --- /dev/null +++ b/Marlin/src/pins/mega/pins_LEAPFROG.h @@ -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 . + * + */ +#pragma once + +/** + * Leapfrog Driver board pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Leapfrog" + +// +// Limit Switches +// +#define X_MIN_PIN 47 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 48 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 49 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 28 +#define X_DIR_PIN 63 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 14 // A6 +#define Y_DIR_PIN 15 // A0 +#define Y_ENABLE_PIN 39 + +#define Z_STEP_PIN 31 // A2 +#define Z_DIR_PIN 32 // A6 +#define Z_ENABLE_PIN 30 // A1 + +#define E0_STEP_PIN 34 // 34 +#define E0_DIR_PIN 35 // 35 +#define E0_ENABLE_PIN 33 // 33 + +#define E1_STEP_PIN 37 // 37 +#define E1_DIR_PIN 40 // 40 +#define E1_ENABLE_PIN 36 // 36 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input (D27) +#define TEMP_1_PIN 15 // Analog Input (1) +#define TEMP_BED_PIN 14 // Analog Input (1,2 or I2C) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 8 // 12 +#define HEATER_2_PIN 11 // 13 +#define HEATER_BED_PIN 10 // 14/15 + +#define FAN_PIN 7 + +// +// Misc. Functions +// +#define SDSS 11 +#define LED_PIN 13 +#define SOL1_PIN 16 +#define SOL2_PIN 17 + +/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */ diff --git a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h new file mode 100644 index 00000000..9c316aa7 --- /dev/null +++ b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h @@ -0,0 +1,115 @@ +/** + * 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 + +/** + * Leapfrog Xeed Driver board pin assignments + * + * This board is used by other Leapfrog printers in addition to the Xeed, + * such as the Creatr HS and Bolt. The pin assignments vary wildly between + * printer models. As such this file is currently specific to the Xeed. + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Leapfrog Xeed 2015" + +// +// Limit Switches +// +#define X_STOP_PIN 47 // 'X Min' +#define Y_STOP_PIN 48 // 'Y Min' +#define Z_STOP_PIN 49 // 'Z Min' + +// +// Steppers +// The Xeed utilizes three Z-axis motors, which use the X, Y, and Z stepper connectors +// on the board. The X and Y steppers use external drivers, attached to signal-level +// Y-axis and X-axis connectors on the board, which map to distinct CPU pins from +// the on-board X/Y stepper drivers. +// + +// X-axis signal-level connector +#define X_STEP_PIN 65 +#define X_DIR_PIN 64 +#define X_ENABLE_PIN 66 // Not actually used on Xeed, could be repurposed + +// Y-axis signal-level connector +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 // Not actually used on Xeed, could be repurposed + +// ZMOT connector (Front Right Z Motor) +#define Z_STEP_PIN 31 +#define Z_DIR_PIN 32 +#define Z_ENABLE_PIN 30 + +// XMOT connector (Rear Z Motor) +#define Z2_STEP_PIN 28 +#define Z2_DIR_PIN 63 +#define Z2_ENABLE_PIN 29 + +// YMOT connector (Front Left Z Motor) +#define Z3_STEP_PIN 14 +#define Z3_DIR_PIN 15 +#define Z3_ENABLE_PIN 39 + +// EMOT2 connector +#define E0_STEP_PIN 37 +#define E0_DIR_PIN 40 +#define E0_ENABLE_PIN 36 + +// EMOT connector +#define E1_STEP_PIN 34 +#define E1_DIR_PIN 35 +#define E1_ENABLE_PIN 33 + +// +// Filament runout +// +#define FIL_RUNOUT_PIN 42 // ROT2 Connector +#define FIL_RUNOUT2_PIN 44 // ROT1 Connector + +// +// Temperature Sensors +// +#define TEMP_0_PIN 15 // T3 Connector +#define TEMP_1_PIN 13 // T1 Connector +#define TEMP_BED_PIN 14 // BED Connector (Between T1 and T3) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 8 // Misc Connector, pins 3 and 4 (Out2) +#define HEATER_1_PIN 9 // Misc Connector, pins 5 and 6 (Out3) +#define HEATER_BED_PIN 6 // Misc Connector, pins 9(-) and 10(+) (OutA) + +#define FAN_PIN 10 // Misc Connector, pins 7(-) and 8 (+) (Out4) + +#define LED_PIN 13 + +#define SOL1_PIN 7 // Misc Connector, pins 1(-) and 2(+) (Out1) + +// Door Closed Sensor +//#define DOOR_PIN 45 // HM1 Connector diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h new file mode 100644 index 00000000..938ad82e --- /dev/null +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -0,0 +1,167 @@ +/** + * 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 + +/** + * Mega controller pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Mega Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Mega Controller" + +// +// Servos +// +#define SERVO0_PIN 30 +#define SERVO1_PIN 31 +#define SERVO2_PIN 32 +#define SERVO3_PIN 33 + +// +// Limit Switches +// +#define X_MIN_PIN 43 +#define X_MAX_PIN 42 +#define Y_MIN_PIN 38 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 40 +#define Z_MAX_PIN 37 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 37 +#endif + +// +// Steppers +// +#define X_STEP_PIN 62 // A8 +#define X_DIR_PIN 63 // A9 +#define X_ENABLE_PIN 61 // A7 + +#define Y_STEP_PIN 65 // A11 +#define Y_DIR_PIN 66 // A12 +#define Y_ENABLE_PIN 64 // A10 + +#define Z_STEP_PIN 68 // A14 +#define Z_DIR_PIN 69 // A15 +#define Z_ENABLE_PIN 67 // A13 + +#define E0_STEP_PIN 23 +#define E0_DIR_PIN 24 +#define E0_ENABLE_PIN 22 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 27 +#define E1_ENABLE_PIN 25 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 4 // Analog Input +#else + #define TEMP_0_PIN 0 // Analog Input +#endif + +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 5 // Analog Input +#else + #define TEMP_1_PIN 2 // Analog Input +#endif + +#define TEMP_2_PIN 3 // Analog Input + +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 6 // Analog Input +#else + #define TEMP_BED_PIN 1 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 29 +#define HEATER_1_PIN 34 +#define HEATER_BED_PIN 28 + +#ifndef FAN_PIN + #define FAN_PIN 39 +#endif +#define FAN1_PIN 35 +#define FAN2_PIN 36 + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN FAN2_PIN +#endif + +#define FAN_SOFT_PWM + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 2 +#endif + +// +// LCD / Controller +// +#if ENABLED(MINIPANEL) + + #define BEEPER_PIN 46 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 47 + #define DOGLCD_CS 45 + #define LCD_BACKLIGHT_PIN 44 // backlight LED on PA3 + + #define KILL_PIN 12 + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BTN_EN1 48 + #define BTN_EN2 11 + #define BTN_ENC 10 + + #define SD_DETECT_PIN 49 + +#endif // MINIPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 7 // Pullup! +#define SPINDLE_DIR_PIN 8 diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h new file mode 100644 index 00000000..1c37b21a --- /dev/null +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -0,0 +1,134 @@ +/** + * 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 + +/** + * MegaTronics pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Megatronics" +// +// Limit Switches +// +#define X_MIN_PIN 41 +#define X_MAX_PIN 37 +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 28 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 60 // A6 +#define Y_DIR_PIN 61 // A7 +#define Y_ENABLE_PIN 22 + +#define Z_STEP_PIN 54 // A0 +#define Z_DIR_PIN 55 // A1 +#define Z_ENABLE_PIN 56 // A2 + +#define E0_STEP_PIN 31 +#define E0_DIR_PIN 32 +#define E0_ENABLE_PIN 38 + +#define E1_STEP_PIN 34 +#define E1_DIR_PIN 36 +#define E1_ENABLE_PIN 30 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 8 // Analog Input +#else + #define TEMP_0_PIN 13 // Analog Input +#endif +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 14 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 8 +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 7 // IO pin. Buffer needed +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 2 +#endif + +// +// LCD / Controller +// +#define BEEPER_PIN 33 + +#if BOTH(ULTRA_LCD, NEWPANEL) + + #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 + + // Buttons directly attached to AUX-2 + #define BTN_EN1 59 + #define BTN_EN2 64 + #define BTN_ENC 43 + + #define SD_DETECT_PIN -1 // RAMPS doesn't use this + +#endif // ULTRA_LCD && NEWPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 4 // Pullup! +#define SPINDLE_DIR_PIN 11 diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h new file mode 100644 index 00000000..ff7cf157 --- /dev/null +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.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 + +/** + * MegaTronics v2.0 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Megatronics v2.0" +// +// Limit Switches +// +#define X_MIN_PIN 37 +#define X_MAX_PIN 40 +#define Y_MIN_PIN 41 +#define Y_MAX_PIN 38 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 27 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 4 // A6 +#define Y_DIR_PIN 54 // A0 +#define Y_ENABLE_PIN 5 + +#define Z_STEP_PIN 56 // A2 +#define Z_DIR_PIN 60 // A6 +#define Z_ENABLE_PIN 55 // A1 + +#define E0_STEP_PIN 35 +#define E0_DIR_PIN 36 +#define E0_ENABLE_PIN 34 + +#define E1_STEP_PIN 29 +#define E1_DIR_PIN 39 +#define E1_ENABLE_PIN 28 + +#define E2_STEP_PIN 23 // ? schematic says 24 +#define E2_DIR_PIN 24 // ? schematic says 23 +#define E2_ENABLE_PIN 22 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 4 // Analog Input +#else + #define TEMP_0_PIN 13 // Analog Input +#endif + +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 8 // Analog Input +#else + #define TEMP_1_PIN 15 // Analog Input +#endif + +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 8 // Analog Input +#else + #define TEMP_BED_PIN 14 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 8 +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif +#define FAN1_PIN 6 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 2 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 16 // Pullup! +#define SPINDLE_DIR_PIN 11 + +// +// LCD / Controller +// +#define BEEPER_PIN 64 + +#if HAS_WIRED_LCD + + #define LCD_PINS_RS 14 + #define LCD_PINS_ENABLE 15 + #define LCD_PINS_D4 30 + #define LCD_PINS_D5 31 + #define LCD_PINS_D6 32 + #define LCD_PINS_D7 33 + + #if ENABLED(NEWPANEL) + // Buttons are directly attached using keypad + #define BTN_EN1 61 + #define BTN_EN2 59 + #define BTN_ENC 43 + #else + // Buttons attached to shift register of reprapworld keypad v1.1 + #define SHIFT_CLK 63 + #define SHIFT_LD 42 + #define SHIFT_OUT 17 + #define SHIFT_EN 17 + #endif + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h new file mode 100644 index 00000000..45ebd163 --- /dev/null +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -0,0 +1,198 @@ +/** + * 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 + +/** + * MegaTronics v3.0 / v3.1 / v3.2 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#if MB(MEGATRONICS_32) + #define BOARD_INFO_NAME "Megatronics v3.2" +#elif MB(MEGATRONICS_31) + #define BOARD_INFO_NAME "Megatronics v3.1" +#else + #define BOARD_INFO_NAME "Megatronics v3.0" +#endif + +// +// Servos +// +#define SERVO0_PIN 46 // AUX3-6 +#define SERVO1_PIN 47 // AUX3-5 +#define SERVO2_PIN 48 // AUX3-4 +#define SERVO3_PIN 49 // AUX3-3 + +// +// Limit Switches +// +#define X_MIN_PIN 37 // No INT +#define X_MAX_PIN 40 // No INT +#define Y_MIN_PIN 41 // No INT +#define Y_MAX_PIN 38 // No INT +#define Z_MIN_PIN 18 // No INT +#define Z_MAX_PIN 19 // No INT + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 58 +#define X_DIR_PIN 57 +#define X_ENABLE_PIN 59 + +#define Y_STEP_PIN 5 +#define Y_DIR_PIN 17 +#define Y_ENABLE_PIN 4 + +#define Z_STEP_PIN 16 +#define Z_DIR_PIN 11 +#define Z_ENABLE_PIN 3 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 29 + +#define E1_STEP_PIN 25 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 + +#define E2_STEP_PIN 22 +#define E2_DIR_PIN 60 +#define E2_ENABLE_PIN 23 + +// +// Temperature Sensors +// +#if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 11 // Analog Input +#else + #define TEMP_0_PIN 15 // Analog Input +#endif +#if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 10 // Analog Input +#else + #define TEMP_1_PIN 13 // Analog Input +#endif +#if TEMP_SENSOR_2 == -1 + #define TEMP_2_PIN 9 // Analog Input +#else + #define TEMP_2_PIN 12 // Analog Input +#endif +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 8 // Analog Input +#else + #define TEMP_BED_PIN 14 // Analog Input +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 9 +#define HEATER_2_PIN 8 +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif +#define FAN1_PIN 7 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 45 // Try the keypad connector +#endif + +// +// LCD / Controller +// +#define BEEPER_PIN 61 + +#define BTN_EN1 44 +#define BTN_EN2 45 +#define BTN_ENC 33 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS 56 // CS chip select / SS chip slave select + #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_D4 52 // SCK (CLK) clock + #define SD_DETECT_PIN 35 + +#else + + #define LCD_PINS_RS 32 + #define LCD_PINS_ENABLE 31 + #define LCD_PINS_D4 14 + #define LCD_PINS_D5 30 + #define LCD_PINS_D6 39 + #define LCD_PINS_D7 15 + + #define SHIFT_CLK 43 + #define SHIFT_LD 35 + #define SHIFT_OUT 34 + #define SHIFT_EN 44 + + #if MB(MEGATRONICS_31, MEGATRONICS_32) + #define SD_DETECT_PIN 56 + #endif + +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if DISABLED(REPRAPWORLD_KEYPAD) // try to use the keypad connector first + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 43 // Pullup! + #define SPINDLE_DIR_PIN 42 +#elif EXTRUDERS <= 2 + // Hijack the last extruder so that we can get the PWM signal off the Y breakout + // Move Y to the E2 plug. This makes dual Y steppers harder + #undef Y_ENABLE_PIN // 4 + #undef Y_STEP_PIN // 5 + #undef Y_DIR_PIN // 17 + #undef E2_ENABLE_PIN // 23 + #undef E2_STEP_PIN // 22 + #undef E2_DIR_PIN // 60 + #define Y_ENABLE_PIN 23 + #define Y_STEP_PIN 22 + #define Y_DIR_PIN 60 + #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 17 // Pullup! + #define SPINDLE_DIR_PIN 5 +#endif diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h new file mode 100644 index 00000000..963911ec --- /dev/null +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -0,0 +1,303 @@ +/** + * 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 + +/** + * Mightyboard Rev.E pin assignments + * also works for Rev D boards. It's all rev E despite what the silk screen says + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for: + * M3, M4 & M5 spindle control commands + * case light + * + * Corrected pin assignment for EX2_HEAT_PIN pin. Changed it from 9 to 11. The port + * number (B5) agrees with the schematic but B5 is assigned to logical pin 11. + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Mightyboard" +#define DEFAULT_MACHINE_NAME "MB Replicator" + +// +// Servos +// +#define SERVO0_PIN 36 // C1 (1280-EX1) +#define SERVO1_PIN 37 // C0 (1280-EX2) +#define SERVO2_PIN 40 // G1 (1280-EX3) +#define SERVO3_PIN 41 // G0 (1280-EX4) + +// +// Limit Switches +// +#define X_MIN_PIN 49 // L0 +#define X_MAX_PIN 48 // L1 +#define Y_MIN_PIN 47 // L2 +#define Y_MAX_PIN 46 // L3 +#define Z_MIN_PIN 43 // L6 +#define Z_MAX_PIN 42 // L7 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 42 +#endif + +// +// Filament Runout Pins +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 49 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN 47 +#endif + +// +// Steppers +// +#define X_STEP_PIN 55 // F1 +#define X_DIR_PIN 54 // F0 +#define X_ENABLE_PIN 56 // F2 + +#define Y_STEP_PIN 59 // F5 +#define Y_DIR_PIN 58 // F4 +#define Y_ENABLE_PIN 60 // F6 + +#define Z_STEP_PIN 63 // K1 +#define Z_DIR_PIN 62 // K0 +#define Z_ENABLE_PIN 64 // K2 + +#define E0_STEP_PIN 25 // A3 +#define E0_DIR_PIN 24 // A2 +#define E0_ENABLE_PIN 26 // A4 + +#define E1_STEP_PIN 29 // A7 +#define E1_DIR_PIN 28 // A6 +#define E1_ENABLE_PIN 39 // G2 + +// +// I2C Digipots - MCP4018 +// Address 5E (2F << 1) +// Set from 0 - 127 with stop bit. +// (Ex. 3F << 1 | 1) +// +#define DIGIPOTS_I2C_SCL 76 // J5 +#define DIGIPOTS_I2C_SDA_X 57 // F3 +#define DIGIPOTS_I2C_SDA_Y 61 // F7 +#define DIGIPOTS_I2C_SDA_Z 65 // K3 +#define DIGIPOTS_I2C_SDA_E0 27 // A5 +#define DIGIPOTS_I2C_SDA_E1 77 // J6 + +#ifndef DIGIPOT_I2C_ADDRESS_A + #define DIGIPOT_I2C_ADDRESS_A 0x2F // unshifted slave address (5E <- 2F << 1) +#endif + +// +// Temperature Sensors +// +// K7 - 69 / ADC15 - 15 +#define TEMP_BED_PIN 15 + +// SPI for Max6675 or Max31855 Thermocouple +// Uses a separate SPI bus +// +// 3 E5 DO (SO) +// 5 E3 CS1 +// 2 E4 CS2 +// 78 E2 SCK +// +#define THERMO_SCK_PIN 78 // E2 +#define THERMO_DO_PIN 3 // E5 +#define THERMO_CS1_PIN 5 // E3 +#define THERMO_CS2_PIN 2 // E4 + +#define MAX6675_SS_PIN THERMO_CS1_PIN +#define MAX6675_SS2_PIN THERMO_CS2_PIN +#define MAX6675_SCK_PIN THERMO_SCK_PIN +#define MAX6675_DO_PIN THERMO_DO_PIN + +// +// Augmentation for auto-assigning plugs +// +// Two thermocouple connectors allows for either +// 2 extruders or 1 extruder and a heated bed. +// With no heated bed, an additional 24V fan is possible. +// + +// Labels from the schematic: +#define EX1_HEAT_PIN 6 // H3 +#define EX1_FAN_PIN 7 // H4 +#define EX2_HEAT_PIN 11 // B5 +#define EX2_FAN_PIN 12 // B6 +#define HBP_PIN 45 // L4 +#define EXTRA_FET_PIN 44 // L5 + +#if HAS_MULTI_HOTEND + #if TEMP_SENSOR_BED + #define IS_EEB + #else + #define IS_EEF + #endif +#elif TEMP_SENSOR_BED + #define IS_EFB +#else + #define IS_EFF +#endif + +// +// Heaters / Fans (24V) +// +#define HEATER_0_PIN EX1_HEAT_PIN + +#if ENABLED(IS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN HBP_PIN +#elif ENABLED(IS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN EX2_HEAT_PIN +#elif ENABLED(IS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN EX2_HEAT_PIN + #define HEATER_BED_PIN HBP_PIN +#elif ENABLED(IS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN HBP_PIN +#endif + +#ifndef FAN_PIN + #if EITHER(IS_EFB, IS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN EX2_HEAT_PIN + #elif EITHER(IS_EEF, IS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN HBP_PIN + #else + #define FAN_PIN EXTRA_FET_PIN + #endif +#endif + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN EX2_FAN_PIN +#endif + +// +// Misc. Functions +// +#define LED_PIN 13 // B7 +#define CUTOFF_RESET_PIN 16 // H1 +#define CUTOFF_TEST_PIN 17 // H0 +#define CUTOFF_SR_CHECK_PIN 70 // G4 (TOSC1) + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 33 // C4: LCD-STROBE + #define LCD_PINS_ENABLE 72 // J2: LEFT + #define LCD_PINS_D4 35 // C2: LCD-CLK + #define LCD_PINS_D5 32 // C5: RLED + #define LCD_PINS_D6 34 // C3: LCD-DATA + #define LCD_PINS_D7 31 // C6: GLED + + #define BTN_EN2 75 // J4, UP + #define BTN_EN1 73 // J3, DOWN + //STOP button connected as KILL_PIN + #define KILL_PIN 14 // J1, RIGHT + //KILL - not connected + + #define BEEPER_PIN 8 // H5, SD_WP + + //on board leds + #define STAT_LED_RED_LED SERVO0_PIN // C1 (1280-EX1, DEBUG2) + #define STAT_LED_BLUE_PIN SERVO1_PIN // C0 (1280-EX2, DEBUG3) + + #else + // Replicator uses a 3-wire SR controller with HD44780 + #define SR_DATA_PIN 34 // C3 + #define SR_CLK_PIN 35 // C2 + #define SR_STROBE_PIN 33 // C4 + + #define BTN_UP 75 // J4 + #define BTN_DWN 73 // J3 + #define BTN_LFT 72 // J2 + #define BTN_RT 14 // J1 + + // Disable encoder + #undef BTN_EN1 + #undef BTN_EN2 + + #define BEEPER_PIN 4 // G5 + + #define STAT_LED_RED_PIN 32 // C5 + #define STAT_LED_BLUE_PIN 31 // C6 (Actually green) + + #endif + + #define BTN_CENTER 15 // J0 + #define BTN_ENC BTN_CENTER + +#endif // HAS_WIRED_LCD + +// +// SD Card +// +#define SDSS 53 // B0 +#define SD_DETECT_PIN 9 // H6 + +// +// TMC 220x +// +#if HAS_TMC_UART + /** + * TMC220x stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + #define X_HARDWARE_SERIAL Serial2 + #define Y_HARDWARE_SERIAL Serial1 + + /** + * Software serial + */ + + #define X_SERIAL_TX_PIN 16 + #define X_SERIAL_RX_PIN 17 + + #define Y_SERIAL_TX_PIN 18 + #define Y_SERIAL_RX_PIN 19 + + #define Z_SERIAL_TX_PIN 41 + #define Z_SERIAL_RX_PIN 66 + + #define E0_SERIAL_TX_PIN 40 + #define E0_SERIAL_RX_PIN 67 + + #define E1_SERIAL_TX_PIN 37 + #define E1_SERIAL_RX_PIN 68 + +#endif diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h new file mode 100644 index 00000000..bbe74646 --- /dev/null +++ b/Marlin/src/pins/mega/pins_MINITRONICS.h @@ -0,0 +1,142 @@ +/** + * 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 + +/** + * Minitronics v1.0/1.1 pin assignments + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for M3, M4 & M5 spindle control commands + */ + +#if NOT_TARGET(__AVR_ATmega1281__) + #error "Oops! Select 'Minitronics' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Minitronics supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Minitronics v1.0/1.1" +// +// Limit Switches +// +#define X_MIN_PIN 5 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 2 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 6 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 48 +#define X_DIR_PIN 47 +#define X_ENABLE_PIN 49 + +#define Y_STEP_PIN 39 // A6 +#define Y_DIR_PIN 40 // A0 +#define Y_ENABLE_PIN 38 + +#define Z_STEP_PIN 42 // A2 +#define Z_DIR_PIN 43 // A6 +#define Z_ENABLE_PIN 41 // A1 + +#define E0_STEP_PIN 45 +#define E0_DIR_PIN 44 +#define E0_ENABLE_PIN 27 + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 35 +#define E1_ENABLE_PIN 37 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input +#define TEMP_1_PIN 6 // Analog Input +#define TEMP_BED_PIN 6 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 7 // EXTRUDER 1 +#define HEATER_1_PIN 8 // EXTRUDER 2 +#define HEATER_BED_PIN 3 // BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif + +// +// Misc. Functions +// +#define SDSS 16 +#define LED_PIN 46 + +// +// LCD / Controller +// +#define BEEPER_PIN -1 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS 15 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 11 // SID (MOSI) + #define LCD_PINS_D4 10 // SCK (CLK) clock + + #define BTN_EN1 18 + #define BTN_EN2 17 + #define BTN_ENC 25 + + #define SD_DETECT_PIN 30 + +#else + + #define LCD_PINS_RS -1 + #define LCD_PINS_ENABLE -1 + + // Buttons are directly attached using keypad + #define BTN_EN1 -1 + #define BTN_EN2 -1 + #define BTN_ENC -1 + + #define SD_DETECT_PIN -1 // Minitronics doesn't use this +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER // assumes we're only doing CNC work (no 3D printing) + #undef HEATER_BED_PIN + #undef TEMP_BED_PIN // need to free up some pins but also need to + #undef TEMP_0_PIN // re-assign them (to unused pins) because Marlin + #undef TEMP_1_PIN // requires the presence of certain pins or else it + #define HEATER_BED_PIN 4 // won't compile + #define TEMP_BED_PIN 50 + #define TEMP_0_PIN 51 + #define SPINDLE_LASER_ENA_PIN 52 // using A6 because it already has a pullup + #define SPINDLE_LASER_PWM_PIN 3 // WARNING - LED & resistor pull up to +12/+24V stepper voltage + #define SPINDLE_DIR_PIN 53 +#endif diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h new file mode 100644 index 00000000..045c1bc0 --- /dev/null +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -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 . + * + */ +#pragma once + +/** + * Dreammaker Overlord v1.1 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Overlord Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "OVERLORD" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Limit Switches +// +#define X_STOP_PIN 24 +#define Y_STOP_PIN 28 +#define Z_MIN_PIN 46 +#define Z_MAX_PIN 32 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 46 // JP4, Tfeed1 +#endif + +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_PIN 44 // JP3, Tfeed2 +#endif + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#define E0_STEP_PIN 43 +#define E0_DIR_PIN 45 +#define E0_ENABLE_PIN 41 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 9 // Analog Input - Redundant temp sensor +#define TEMP_2_PIN 12 // Analog Input +#define TEMP_3_PIN 14 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 + +#define FAN_PIN 7 // material cooling fan + +// +// SD Card +// +#define SDSS 53 +#define SD_DETECT_PIN 38 + +// +// Misc. Functions +// +#define LED_PIN 13 // On PCB status led +#define PS_ON_PIN 12 // For stepper/heater/fan power. Active HIGH. +#define POWER_LOSS_PIN 34 // Power check - whether hotends/steppers/fans have power + +#if ENABLED(BATTERY_STATUS_AVAILABLE) + #undef BATTERY_STATUS_PIN + #define BATTERY_STATUS_PIN 26 // Status of power loss battery, whether it is charged (low) or charging (high) +#endif +#if ENABLED(INPUT_VOLTAGE_AVAILABLE) + #undef VOLTAGE_DETECTION_PIN + #define VOLTAGE_DETECTION_PIN 11 // Analog Input - ADC Voltage level of main input +#endif + +// +// LCD / Controller +// +#if HAS_MARLINUI_U8GLIB + // OVERLORD OLED pins + #define LCD_PINS_RS 20 + #define LCD_PINS_D5 21 + #define LCD_PINS_ENABLE 15 + #define LCD_PINS_D4 14 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + #ifndef LCD_RESET_PIN + #define LCD_RESET_PIN 5 // LCD_PINS_D6 + #endif +#endif + +#if ENABLED(NEWPANEL) + #define BTN_ENC 16 // Enter Pin + #define BTN_UP 19 // Button UP Pin + #define BTN_DWN 17 // Button DOWN Pin +#endif + +// Additional connectors/pins on the Overlord V1.X board +#define PCB_VERSION_PIN 22 +#define APPROACH_PIN 11 // JP7, Tpd +#define GATE_PIN 36 // Threshold, JP6, Tg diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h new file mode 100644 index 00000000..ff4d3e83 --- /dev/null +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -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 . + * + */ + +/** + * Arduino Mega with PICA pin assignments + * + * PICA is Power, Interface, and Control Adapter and is open source hardware. + * See https://github.com/mjrice/PICA for schematics etc. + * + * Applies to PICA, PICA_REVB + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "PICA" +#endif + +/* +// Note that these are the "pins" that correspond to the analog inputs on the arduino mega. +// These are not the same as the physical pin numbers + AD0 = 54; AD1 = 55; AD2 = 56; AD3 = 57; + AD4 = 58; AD5 = 59; AD6 = 60; AD7 = 61; + AD8 = 62; AD9 = 63; AD10 = 64; AD11 = 65; + AD12 = 66; AD13 = 67; AD14 = 68; AD15 = 69; +*/ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." +#endif + +// +// Servos +// +#define SERVO0_PIN 3 +#define SERVO1_PIN 4 +#define SERVO2_PIN 5 +// +// Limit Switches +// +#define X_MIN_PIN 14 +#define X_MAX_PIN 15 +#define Y_MIN_PIN 16 +#define Y_MAX_PIN 17 +#define Z_MIN_PIN 23 +#define Z_MAX_PIN 22 + +// +// Steppers +// +#define X_STEP_PIN 55 +#define X_DIR_PIN 54 +#define X_ENABLE_PIN 60 + +#define Y_STEP_PIN 57 +#define Y_DIR_PIN 56 +#define Y_ENABLE_PIN 61 + +#define Z_STEP_PIN 59 +#define Z_DIR_PIN 58 +#define Z_ENABLE_PIN 62 + +#define E0_STEP_PIN 67 +#define E0_DIR_PIN 24 +#define E0_ENABLE_PIN 26 + +#define E1_STEP_PIN 68 +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 27 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 9 // Analog Input +#define TEMP_1_PIN 10 +#define TEMP_BED_PIN 10 +#define TEMP_2_PIN 11 +#define TEMP_3_PIN 12 + +// +// Heaters / Fans +// +#ifndef HEATER_0_PIN + #define HEATER_0_PIN 10 // E0 +#endif +#ifndef HEATER_1_PIN + #define HEATER_1_PIN 2 // E1 +#endif +#define HEATER_BED_PIN 8 // HEAT-BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#ifndef FAN_2_PIN + #define FAN_2_PIN 7 +#endif + +#define SDPOWER_PIN -1 +#define LED_PIN -1 +#define PS_ON_PIN -1 +#define KILL_PIN -1 + +#define SSR_PIN 6 + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// SD Support +// +#define SD_DETECT_PIN 49 +#define SDSS 53 + +// +// LCD / Controller +// +#define BEEPER_PIN 29 + +#if HAS_WIRED_LCD + #define LCD_PINS_RS 33 + #define LCD_PINS_ENABLE 30 + #define LCD_PINS_D4 35 + #define LCD_PINS_D5 32 + #define LCD_PINS_D6 37 + #define LCD_PINS_D7 36 + + #define BTN_EN1 47 + #define BTN_EN2 48 + #define BTN_ENC 31 + + #define LCD_SDSS 53 +#endif diff --git a/Marlin/src/pins/mega/pins_PICAOLD.h b/Marlin/src/pins/mega/pins_PICAOLD.h new file mode 100644 index 00000000..f53a4cdc --- /dev/null +++ b/Marlin/src/pins/mega/pins_PICAOLD.h @@ -0,0 +1,28 @@ +/** + * 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 . + * + */ + +#define HEATER_0_PIN 9 // E0 +#define HEATER_1_PIN 10 // E1 +#define FAN_PIN 11 +#define FAN2_PIN 12 + +#include "pins_PICA.h" diff --git a/Marlin/src/pins/mega/pins_SILVER_GATE.h b/Marlin/src/pins/mega/pins_SILVER_GATE.h new file mode 100644 index 00000000..41cbe5e0 --- /dev/null +++ b/Marlin/src/pins/mega/pins_SILVER_GATE.h @@ -0,0 +1,99 @@ +/** + * 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 + +#if NOT_TARGET(__AVR_ATmega1281__, __AVR_ATmega2561__) + #error "Oops! Select 'Silvergate' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Silver Gate" + +#define X_STEP_PIN 43 +#define X_DIR_PIN 44 +#define X_ENABLE_PIN 42 +#define X_MIN_PIN 31 +#define X_MAX_PIN 34 + +#define Y_STEP_PIN 40 +#define Y_DIR_PIN 41 +#define Y_ENABLE_PIN 39 +#define Y_MIN_PIN 32 +#define Y_MAX_PIN 35 + +#define Z_STEP_PIN 13 +#define Z_DIR_PIN 38 +#define Z_ENABLE_PIN 14 +#define Z_MIN_PIN 33 +#define Z_MAX_PIN 36 + +#define E0_STEP_PIN 27 +#define E0_DIR_PIN 37 +#define E0_ENABLE_PIN 45 + +#define SDSS 16 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 34 // X_MAX unless overridden +#endif + +#ifndef FAN_PIN + #define FAN_PIN 5 +#endif + +#define HEATER_0_PIN 7 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 3 +#endif + +#define CONTROLLER_FAN_PIN 2 + +#define TEMP_0_PIN 7 // Analog Input + +#define HEATER_BED_PIN 8 +#define TEMP_BED_PIN 6 + +#if HAS_MARLINUI_U8GLIB + #if ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 + #define LCD_PINS_RS 30 + #define LCD_PINS_ENABLE 20 + #define LCD_PINS_D4 25 + #define BEEPER_PIN 29 + #define BTN_EN1 19 + #define BTN_EN2 22 + #define BTN_ENC 24 + #define LCD_BACKLIGHT_PIN 6 + #if ENABLED(SILVER_GATE_GLCD_CONTROLLER) + #define KILL_PIN 21 + #define HOME_PIN 28 + #endif + #endif +#endif + +#define SD_DETECT_PIN 15 + +#define STAT_LED_RED_PIN 23 +#define STAT_LED_BLUE_PIN 26 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 51 +#endif diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h new file mode 100644 index 00000000..52e757c5 --- /dev/null +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -0,0 +1,111 @@ +/** + * 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 + +/** + * Wanhao 0ne+ pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Wanhao i3 Mini 0ne+" +#define DEFAULT_MACHINE_NAME "i3 Mini" +#define BOARD_WEBSITE_URL "https://tinyurl.com/yyxw7se7" + +// +// Limit Switches +// +#define X_STOP_PIN 19 +#define Y_STOP_PIN 18 +#define Z_STOP_PIN 38 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 38 +#endif + +// +// Steppers +// +#define X_STEP_PIN 22 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 57 + +#define Y_STEP_PIN 25 +#define Y_DIR_PIN 26 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 29 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 28 + +#define E0_STEP_PIN 55 +#define E0_DIR_PIN 56 +#define E0_ENABLE_PIN 54 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 +#define TEMP_BED_PIN 14 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 44 +#define FAN_PIN 12 // IO pin. Buffer needed + +// +// SD Card +// +#define SD_DETECT_PIN -1 +#define SDSS 53 + +// +// Misc. Functions +// +#define BEEPER_PIN 37 +#define KILL_PIN 64 + +// +// LCD / Controller (Integrated MINIPANEL) +// +#if ENABLED(MINIPANEL) + #define DOGLCD_A0 40 + #define DOGLCD_CS 41 + #define LCD_BACKLIGHT_PIN 65 // Backlight LED on A11/D65 + #define LCD_RESET_PIN 27 + + #define BTN_EN1 2 + #define BTN_EN2 3 + #define BTN_ENC 5 + + // This display has adjustable contrast + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 255 + #define LCD_CONTRAST_INIT LCD_CONTRAST_MAX +#endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h new file mode 100644 index 00000000..7f7aa63f --- /dev/null +++ b/Marlin/src/pins/pins.h @@ -0,0 +1,1623 @@ +/** + * 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 "../core/boards.h" + +/** + * Include pins definitions + * + * Pins numbering schemes: + * + * - Digital I/O pin number if used by READ/WRITE macros. (e.g., X_STEP_DIR) + * The FastIO headers map digital pins to their ports and functions. + * + * - Analog Input number if used by analogRead or DAC. (e.g., TEMP_n_PIN) + * These numbers are the same in any pin mapping. + */ + +#define MAX_EXTRUDERS 8 + +#if MB(RAMPS_13_EFB, RAMPS_14_EFB, RAMPS_PLUS_EFB, RAMPS_14_RE_ARM_EFB, RAMPS_SMART_EFB, RAMPS_DUO_EFB, RAMPS4DUE_EFB) + #define IS_RAMPS_EFB +#elif MB(RAMPS_13_EEB, RAMPS_14_EEB, RAMPS_PLUS_EEB, RAMPS_14_RE_ARM_EEB, RAMPS_SMART_EEB, RAMPS_DUO_EEB, RAMPS4DUE_EEB) + #define IS_RAMPS_EEB +#elif MB(RAMPS_13_EFF, RAMPS_14_EFF, RAMPS_PLUS_EFF, RAMPS_14_RE_ARM_EFF, RAMPS_SMART_EFF, RAMPS_DUO_EFF, RAMPS4DUE_EFF) + #define IS_RAMPS_EFF +#elif MB(RAMPS_13_EEF, RAMPS_14_EEF, RAMPS_PLUS_EEF, RAMPS_14_RE_ARM_EEF, RAMPS_SMART_EEF, RAMPS_DUO_EEF, RAMPS4DUE_EEF) + #define IS_RAMPS_EEF +#elif MB(RAMPS_13_SF, RAMPS_14_SF, RAMPS_PLUS_SF, RAMPS_14_RE_ARM_SF, RAMPS_SMART_SF, RAMPS_DUO_SF, RAMPS4DUE_SF) + #define IS_RAMPS_SF +#endif + +#define HAS_FREE_AUX2_PINS !(BOTH(ULTRA_LCD, NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD)) + +// Test the target within the included pins file +#ifdef __MARLIN_DEPS__ + #define NOT_TARGET(V...) 0 +#else + #define NOT_TARGET(V...) NONE(V) +#endif + +// +// RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 +// + +#if MB(RAMPS_OLD) + #include "ramps/pins_RAMPS_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_13_EFB) + #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_13_EEB) + #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_13_EFF) + #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_13_EEF) + #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_13_SF) + #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_14_EFB) + #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_14_EEB) + #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_14_EFF) + #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_14_EEF) + #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_14_SF) + #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_PLUS_EFB) + #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_PLUS_EEB) + #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_PLUS_EFF) + #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_PLUS_EEF) + #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RAMPS_PLUS_SF) + #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + +// +// RAMPS Derivatives - ATmega1280, ATmega2560 +// + +#elif MB(3DRAG) + #include "ramps/pins_3DRAG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(K8200) + #include "ramps/pins_K8200.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) +#elif MB(K8400) + #include "ramps/pins_K8400.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) +#elif MB(K8600) + #include "ramps/pins_K8600.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(K8800) + #include "ramps/pins_K8800.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (3DRAG) +#elif MB(BAM_DICE) + #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(BAM_DICE_DUE) + #include "ramps/pins_BAM_DICE_DUE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(MKS_BASE) + #include "ramps/pins_MKS_BASE_10.h" // ATmega2560 env:mega2560 +#elif MB(MKS_BASE_14) + #include "ramps/pins_MKS_BASE_14.h" // ATmega2560 env:mega2560 +#elif MB(MKS_BASE_15) + #include "ramps/pins_MKS_BASE_15.h" // ATmega2560 env:mega2560 +#elif MB(MKS_BASE_16) + #include "ramps/pins_MKS_BASE_16.h" // ATmega2560 env:mega2560 +#elif MB(MKS_BASE_HEROIC) + #include "ramps/pins_MKS_BASE_HEROIC.h" // ATmega2560 env:mega2560 +#elif MB(MKS_GEN_13) + #include "ramps/pins_MKS_GEN_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(MKS_GEN_L) + #include "ramps/pins_MKS_GEN_L.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(KFB_2) + #include "ramps/pins_BIQU_KFB_2.h" // ATmega2560 env:mega2560 +#elif MB(ZRIB_V20) + #include "ramps/pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 (MKS_GEN_13) +#elif MB(FELIX2) + #include "ramps/pins_FELIX2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RIGIDBOARD) + #include "ramps/pins_RIGIDBOARD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(RIGIDBOARD_V2) + #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(SAINSMART_2IN1) + #include "ramps/pins_SAINSMART_2IN1.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(ULTIMAKER) + #include "ramps/pins_ULTIMAKER.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(ULTIMAKER_OLD) + #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(AZTEEG_X3) + #include "ramps/pins_AZTEEG_X3.h" // ATmega2560 env:mega2560 +#elif MB(AZTEEG_X3_PRO) + #include "ramps/pins_AZTEEG_X3_PRO.h" // ATmega2560 env:mega2560 +#elif MB(ULTIMAIN_2) + #include "ramps/pins_ULTIMAIN_2.h" // ATmega2560 env:mega2560ext +#elif MB(FORMBOT_RAPTOR) + #include "ramps/pins_FORMBOT_RAPTOR.h" // ATmega2560 env:mega2560 +#elif MB(FORMBOT_RAPTOR2) + #include "ramps/pins_FORMBOT_RAPTOR2.h" // ATmega2560 env:mega2560 +#elif MB(FORMBOT_TREX2PLUS) + #include "ramps/pins_FORMBOT_TREX2PLUS.h" // ATmega2560 env:mega2560 +#elif MB(FORMBOT_TREX3) + #include "ramps/pins_FORMBOT_TREX3.h" // ATmega2560 env:mega2560 +#elif MB(RUMBA) + #include "ramps/pins_RUMBA.h" // ATmega2560 env:mega2560 +#elif MB(RUMBA_RAISE3D) + #include "ramps/pins_RUMBA_RAISE3D.h" // ATmega2560 env:mega2560 +#elif MB(RL200) + #include "ramps/pins_RL200.h" // ATmega2560 env:mega2560 +#elif MB(BQ_ZUM_MEGA_3D) + #include "ramps/pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:mega2560ext +#elif MB(MAKEBOARD_MINI) + #include "ramps/pins_MAKEBOARD_MINI.h" // ATmega2560 env:mega2560 +#elif MB(TRIGORILLA_13) + #include "ramps/pins_TRIGORILLA_13.h" // ATmega2560 env:mega2560 +#elif MB(TRIGORILLA_14) + #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 +#elif MB(TRIGORILLA_14_11) + #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_ENDER_4) + #include "ramps/pins_RAMPS_ENDER_4.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_CREALITY) + #include "ramps/pins_RAMPS_CREALITY.h" // ATmega2560 env:mega2560 +#elif MB(RAMPS_DAGOMA) + #include "ramps/pins_RAMPS_DAGOMA.h" // ATmega2560 env:mega2560 +#elif MB(FYSETC_F6_13) + #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6_13 +#elif MB(FYSETC_F6_14) + #include "ramps/pins_FYSETC_F6_14.h" // ATmega2560 env:FYSETC_F6_14 +#elif MB(DUPLICATOR_I3_PLUS) + #include "ramps/pins_DUPLICATOR_I3_PLUS.h" // ATmega2560 env:mega2560 +#elif MB(VORON) + #include "ramps/pins_VORON.h" // ATmega2560 env:mega2560 +#elif MB(TRONXY_V3_1_0) + #include "ramps/pins_TRONXY_V3_1_0.h" // ATmega2560 env:mega2560 +#elif MB(Z_BOLT_X_SERIES) + #include "ramps/pins_Z_BOLT_X_SERIES.h" // ATmega2560 env:mega2560 +#elif MB(TT_OSCAR) + #include "ramps/pins_TT_OSCAR.h" // ATmega2560 env:mega2560 +#elif MB(TANGO) + #include "ramps/pins_TANGO.h" // ATmega2560 env:mega2560 +#elif MB(MKS_GEN_L_V2) + #include "ramps/pins_MKS_GEN_L_V2.h" // ATmega2560 env:mega2560 +#elif MB(COPYMASTER_3D) + #include "ramps/pins_COPYMASTER_3D.h" // ATmega2560 env:mega2560 +#elif MB(ORTUR_4) + #include "ramps/pins_ORTUR_4.h" // ATmega2560 env:mega2560 +#elif MB(TENLOG_D3_HERO) + #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 +#elif MB(MKS_GEN_L_V21) + #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 + +// +// RAMBo and derivatives +// + +#elif MB(RAMBO) + #include "rambo/pins_RAMBO.h" // ATmega2560 env:rambo +#elif MB(MINIRAMBO, MINIRAMBO_10A) + #include "rambo/pins_MINIRAMBO.h" // ATmega2560 env:rambo +#elif MB(EINSY_RAMBO) + #include "rambo/pins_EINSY_RAMBO.h" // ATmega2560 env:rambo +#elif MB(EINSY_RETRO) + #include "rambo/pins_EINSY_RETRO.h" // ATmega2560 env:rambo +#elif MB(SCOOVO_X9H) + #include "rambo/pins_SCOOVO_X9H.h" // ATmega2560 env:rambo + +// +// Other ATmega1280, ATmega2560 +// + +#elif MB(CNCONTROLS_11) + #include "mega/pins_CNCONTROLS_11.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(CNCONTROLS_12) + #include "mega/pins_CNCONTROLS_12.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(CNCONTROLS_15) + #include "mega/pins_CNCONTROLS_15.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(MIGHTYBOARD_REVE) + #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext +#elif MB(CHEAPTRONIC) + #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 +#elif MB(CHEAPTRONIC_V2) + #include "mega/pins_CHEAPTRONICv2.h" // ATmega2560 env:mega2560 +#elif MB(MEGATRONICS) + #include "mega/pins_MEGATRONICS.h" // ATmega2560 env:mega2560 +#elif MB(MEGATRONICS_2) + #include "mega/pins_MEGATRONICS_2.h" // ATmega2560 env:mega2560 +#elif MB(MEGATRONICS_3, MEGATRONICS_31, MEGATRONICS_32) + #include "mega/pins_MEGATRONICS_3.h" // ATmega2560 env:mega2560 +#elif MB(ELEFU_3) + #include "mega/pins_ELEFU_3.h" // ATmega2560 env:mega2560 +#elif MB(LEAPFROG) + #include "mega/pins_LEAPFROG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(MEGACONTROLLER) + #include "mega/pins_MEGACONTROLLER.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_REV_A) + #include "mega/pins_GT2560_REV_A.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(GT2560_REV_A_PLUS) + #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 +#elif MB(GT2560_V3) + #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_V3_MC2) + #include "mega/pins_GT2560_V3_MC2.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_V3_A20) + #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 +#elif MB(EINSTART_S) + #include "mega/pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext +#elif MB(WANHAO_ONEPLUS) + #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 +#elif MB(OVERLORD) + #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 +#elif MB(HJC2560C_REV2) + #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 +#elif MB(LEAPFROG_XEED2015) + #include "mega/pins_LEAPFROG_XEED2015.h" // ATmega2560 env:mega2560 +#elif MB(PICA) + #include "mega/pins_PICA.h" // ATmega2560 env:mega2560 +#elif MB(PICA_REVB) + #include "mega/pins_PICAOLD.h" // ATmega2560 env:mega2560 +#elif MB(INTAMSYS40) + #include "mega/pins_INTAMSYS40.h" // ATmega2560 env:mega2560 + +// +// ATmega1281, ATmega2561 +// + +#elif MB(MINITRONICS) + #include "mega/pins_MINITRONICS.h" // ATmega1281 env:mega1280 +#elif MB(SILVER_GATE) + #include "mega/pins_SILVER_GATE.h" // ATmega2561 env:mega2560 + +// +// Sanguinololu and Derivatives - ATmega644P, ATmega1284P +// + +#elif MB(SANGUINOLOLU_11) + #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(SANGUINOLOLU_12) + #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(MELZI) + #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(MELZI_V2) + #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(MELZI_MAKR3D) + #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(MELZI_CREALITY) + #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi env:melzi_optimized env:melzi_optiboot +#elif MB(MELZI_MALYAN) + #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(MELZI_TRONXY) + #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(STB_11) + #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 +// + +#elif MB(GEN3_MONOLITHIC) + #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p +#elif MB(GEN3_PLUS) + #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(GEN6) + #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(GEN6_DELUXE) + #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(GEN7_CUSTOM) + #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(GEN7_12) + #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(GEN7_13) + #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(GEN7_14) + #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p +#elif MB(OMCA_A) + #include "sanguino/pins_OMCA_A.h" // ATmega644 env:sanguino644p +#elif MB(OMCA) + #include "sanguino/pins_OMCA.h" // ATmega644P, ATmega644 env:sanguino644p +#elif MB(ANET_10) + #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p +#elif MB(SETHI) + #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p + +// +// Teensyduino - AT90USB1286, AT90USB1286P +// + +#elif MB(TEENSYLU) + #include "teensy2/pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:at90usb1286_cdc +#elif MB(PRINTRBOARD) + #include "teensy2/pins_PRINTRBOARD.h" // AT90USB1286 env:at90usb1286_dfu +#elif MB(PRINTRBOARD_REVF) + #include "teensy2/pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:at90usb1286_dfu +#elif MB(BRAINWAVE) + #include "teensy2/pins_BRAINWAVE.h" // AT90USB646 env:at90usb1286_cdc +#elif MB(BRAINWAVE_PRO) + #include "teensy2/pins_BRAINWAVE_PRO.h" // AT90USB1286 env:at90usb1286_cdc +#elif MB(SAV_MKI) + #include "teensy2/pins_SAV_MKI.h" // AT90USB1286 env:at90usb1286_cdc +#elif MB(TEENSY2) + #include "teensy2/pins_TEENSY2.h" // AT90USB1286 env:teensy20 +#elif MB(5DPRINT) + #include "teensy2/pins_5DPRINT.h" // AT90USB1286 env:at90usb1286_dfu + +// +// LPC1768 ARM Cortex M3 +// + +#elif MB(RAMPS_14_RE_ARM_EFB) + #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 +#elif MB(RAMPS_14_RE_ARM_EEB) + #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 +#elif MB(RAMPS_14_RE_ARM_EFF) + #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 +#elif MB(RAMPS_14_RE_ARM_EEF) + #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 +#elif MB(RAMPS_14_RE_ARM_SF) + #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 +#elif MB(MKS_SBASE) + #include "lpc1768/pins_MKS_SBASE.h" // LPC1768 env:LPC1768 +#elif MB(MKS_SGEN_L) + #include "lpc1768/pins_MKS_SGEN_L.h" // LPC1768 env:LPC1768 +#elif MB(AZSMZ_MINI) + #include "lpc1768/pins_AZSMZ_MINI.h" // LPC1768 env:LPC1768 +#elif MB(BIQU_BQ111_A4) + #include "lpc1768/pins_BIQU_BQ111_A4.h" // LPC1768 env:LPC1768 +#elif MB(SELENA_COMPACT) + #include "lpc1768/pins_SELENA_COMPACT.h" // LPC1768 env:LPC1768 +#elif MB(BIQU_B300_V1_0) + #include "lpc1768/pins_BIQU_B300_V1.0.h" // LPC1768 env:LPC1768 +#elif MB(GMARSH_X6_REV1) + #include "lpc1768/pins_GMARSH_X6_REV1.h" // LPC1768 env:LPC1768 +#elif MB(BTT_SKR_V1_1) + #include "lpc1768/pins_BTT_SKR_V1_1.h" // LPC1768 env:LPC1768 +#elif MB(BTT_SKR_V1_3) + #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 +#elif MB(BTT_SKR_V1_4) + #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768 + +// +// LPC1769 ARM Cortex M3 +// + +#elif MB(MKS_SGEN) + #include "lpc1769/pins_MKS_SGEN.h" // LPC1769 env:LPC1769 +#elif MB(AZTEEG_X5_GT) + #include "lpc1769/pins_AZTEEG_X5_GT.h" // LPC1769 env:LPC1769 +#elif MB(AZTEEG_X5_MINI) + #include "lpc1769/pins_AZTEEG_X5_MINI.h" // LPC1769 env:LPC1769 +#elif MB(AZTEEG_X5_MINI_WIFI) + #include "lpc1769/pins_AZTEEG_X5_MINI_WIFI.h" // LPC1769 env:LPC1769 +#elif MB(COHESION3D_REMIX) + #include "lpc1769/pins_COHESION3D_REMIX.h" // LPC1769 env:LPC1769 +#elif MB(COHESION3D_MINI) + #include "lpc1769/pins_COHESION3D_MINI.h" // LPC1769 env:LPC1769 +#elif MB(SMOOTHIEBOARD) + #include "lpc1769/pins_SMOOTHIEBOARD.h" // LPC1769 env:LPC1769 +#elif MB(TH3D_EZBOARD) + #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 +#elif MB(BTT_SKR_E3_TURBO) + #include "lpc1769/pins_BTT_SKR_E3_TURBO.h" // LPC1769 env:LPC1769 + +// +// Due (ATSAM) boards +// + +#elif MB(DUE3DOM) + #include "sam/pins_DUE3DOM.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(DUE3DOM_MINI) + #include "sam/pins_DUE3DOM_MINI.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RADDS) + #include "sam/pins_RADDS.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RURAMPS4D_11) + #include "sam/pins_RURAMPS4D_11.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RURAMPS4D_13) + #include "sam/pins_RURAMPS4D_13.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_FD_V1) + #include "sam/pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_FD_V2) + #include "sam/pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EFB) + #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EEB) + #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EFF) + #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_EEF) + #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_SMART_SF) + #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EFB) + #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EEB) + #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EFF) + #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_EEF) + #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS_DUO_SF) + #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EFB) + #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EEB) + #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EFF) + #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_EEF) + #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(RAMPS4DUE_SF) + #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug +#elif MB(ULTRATRONICS_PRO) + #include "sam/pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug +#elif MB(ARCHIM1) + #include "sam/pins_ARCHIM1.h" // SAM3X8E env:DUE env:DUE_debug +#elif MB(ARCHIM2) + #include "sam/pins_ARCHIM2.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug +#elif MB(ALLIGATOR) + #include "sam/pins_ALLIGATOR_R2.h" // SAM3X8E env:DUE env:DUE_debug +#elif MB(ADSK) + #include "sam/pins_ADSK.h" // SAM3X8E env:DUE env:DUE_debug +#elif MB(PRINTRBOARD_G2) + #include "sam/pins_PRINTRBOARD_G2.h" // SAM3X8C env:DUE_USB +#elif MB(CNCONTROLS_15D) + #include "sam/pins_CNCONTROLS_15D.h" // SAM3X8E env:DUE env:DUE_USB + +// +// STM32 ARM Cortex-M0 +// +#elif MB(MALYAN_M200_V2) + #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 + +// +// STM32 ARM Cortex-M3 +// + +#elif MB(STM32F103RE) + #include "stm32f1/pins_STM32F1R.h" // STM32F1 env:STM32F103RE +#elif MB(MALYAN_M200) + #include "stm32f1/pins_MALYAN_M200.h" // STM32F1 env:STM32F103CB_malyan +#elif MB(STM3R_MINI) + #include "stm32f1/pins_STM3R_MINI.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_PRO_VB) + #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_MINI) + #include "stm32f1/pins_GTM32_MINI.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_MINI_A30) + #include "stm32f1/pins_GTM32_MINI_A30.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_REV_B) + #include "stm32f1/pins_GTM32_REV_B.h" // STM32F1 env:STM32F103RE +#elif MB(MORPHEUS) + #include "stm32f1/pins_MORPHEUS.h" // STM32F1 env:STM32F103RE +#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 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) + #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_nano35 +#elif MB(MKS_ROBIN_LITE) + #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite +#elif MB(MKS_ROBIN_LITE3) + #include "stm32f1/pins_MKS_ROBIN_LITE3.h" // STM32F1 env:mks_robin_lite3 +#elif MB(MKS_ROBIN_PRO) + #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro +#elif MB(MKS_ROBIN_E3) + #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 +#elif MB(MKS_ROBIN_E3D) + #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 +#elif MB(MKS_ROBIN_E3P) + #include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p +#elif MB(BTT_SKR_MINI_V1_1) + #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(BTT_SKR_MINI_E3_V1_0) + #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(BTT_SKR_MINI_E3_V1_2) + #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(BTT_SKR_MINI_E3_V2_0) + #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(BTT_SKR_E3_DIP) + #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB +#elif MB(JGAURORA_A5S_A1) + #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 +#elif MB(FYSETC_AIO_II) + #include "stm32f1/pins_FYSETC_AIO_II.h" // STM32F1 env:STM32F103RC_fysetc +#elif MB(FYSETC_CHEETAH) + #include "stm32f1/pins_FYSETC_CHEETAH.h" // STM32F1 env:STM32F103RC_fysetc +#elif MB(FYSETC_CHEETAH_V12) + #include "stm32f1/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103RC_fysetc +#elif MB(LONGER3D_LK) + #include "stm32f1/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103VE_longer +#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 +#elif MB(CHITU3D_V6) + #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 +#elif MB(FLY_MINI) + #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI + +// +// ARM Cortex-M4F +// + +#elif MB(TEENSY31_32) + #include "teensy3/pins_TEENSY31_32.h" // TEENSY31_32 env:teensy31 +#elif MB(TEENSY35_36) + #include "teensy3/pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 + +// +// STM32 ARM Cortex-M4F +// + +#elif MB(BEAST) + #include "stm32f4/pins_BEAST.h" // STM32F4 env:STM32F4 +#elif MB(GENERIC_STM32F4) + #include "stm32f4/pins_GENERIC_STM32F4.h" // STM32F4 env:STM32F4 +#elif MB(ARMED) + #include "stm32f4/pins_ARMED.h" // STM32F4 env:ARMED +#elif MB(RUMBA32_V1_0) + #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 +#elif MB(RUMBA32_V1_1) + #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 +#elif MB(RUMBA32_MKS) + #include "stm32f4/pins_RUMBA32_MKS.h" // STM32F4 env:rumba32 +#elif MB(BLACK_STM32F407VE) + #include "stm32f4/pins_BLACK_STM32F407VE.h" // STM32F4 env:STM32F407VE_black +#elif MB(STEVAL_3DP001V1) + #include "stm32f4/pins_STEVAL_3DP001V1.h" // STM32F4 env:STM32F401VE_STEVAL +#elif MB(BTT_SKR_PRO_V1_1) + #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO +#elif MB(BTT_SKR_PRO_V1_2) + #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO +#elif MB(BTT_GTR_V1_0) + #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 +#elif MB(BTT_BTT002_V1_0) + #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:LERDGE_X +#elif MB(VAKE403D) + #include "stm32f4/pins_VAKE403D.h" // STM32F4 env:STM32F4 +#elif MB(FYSETC_S6) + #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 +#elif MB(FLYF407ZG) + #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 +#elif MB(ARTILLERY_RUBY) + #include "stm32f4/pins_ARTILLERY_RUBY.h" // STM32F4 env:ARTILLERY_RUBY + +// +// ARM Cortex M7 +// + +#elif MB(THE_BORG) + #include "stm32f7/pins_THE_BORG.h" // STM32F7 env:STM32F7 +#elif MB(REMRAM_V1) + #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:STM32F7 +#elif MB(NUCLEO_F767ZI) + #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI +#elif MB(TEENSY41) + #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 +#elif MB(T41U5XBB) + #include "teensy4/pins_T41U5XBB.h" // Teensy-4.x env:teensy41 + +// +// Espressif ESP32 +// + +#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 +#elif MB(MRR_ESPE) + #include "esp32/pins_MRR_ESPE.h" // ESP32 env:esp32 +#elif MB(E4D_BOX) + #include "esp32/pins_E4D.h" // ESP32 env:esp32 + +// +// Adafruit Grand Central M4 (SAMD51 ARM Cortex-M4) +// + +#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 +// + +#elif MB(LINUX_RAMPS) + #include "linux/pins_RAMPS_LINUX.h" // Linux env:linux_native + +#else + + // + // Obsolete or unknown board + // + + #define BOARD_MKS_13 -1000 + #define BOARD_TRIGORILLA -1001 + #define BOARD_RURAMPS4D -1002 + #define BOARD_FORMBOT_TREX2 -1003 + #define BOARD_BIQU_SKR_V1_1 -1004 + #define BOARD_STM32F1R -1005 + #define BOARD_STM32F103R -1006 + #define BOARD_ESP32 -1007 + #define BOARD_STEVAL -1008 + #define BOARD_BIGTREE_SKR_V1_1 -1009 + #define BOARD_BIGTREE_SKR_V1_3 -1010 + #define BOARD_BIGTREE_SKR_V1_4 -1011 + #define BOARD_BIGTREE_SKR_V1_4_TURBO -1012 + #define BOARD_BIGTREE_BTT002_V1_0 -1013 + #define BOARD_BIGTREE_SKR_PRO_V1_1 -1014 + #define BOARD_BIGTREE_SKR_MINI_V1_1 -1015 + #define BOARD_BIGTREE_SKR_MINI_E3 -1016 + #define BOARD_BIGTREE_SKR_E3_DIP -1017 + #define BOARD_RUMBA32 -1018 + #define BOARD_RUMBA32_AUS3D -1019 + + #if MB(MKS_13) + #error "BOARD_MKS_13 has been renamed BOARD_MKS_GEN_13. Please update your configuration." + #elif MB(TRIGORILLA) + #error "BOARD_TRIGORILLA has been renamed BOARD_TRIGORILLA_13. Please update your configuration." + #elif MB(RURAMPS4D) + #error "BOARD_RURAMPS4D has been renamed BOARD_RURAMPS4D_11. Please update your configuration." + #elif MB(FORMBOT_TREX2) + #error "FORMBOT_TREX2 has been renamed BOARD_FORMBOT_TREX2PLUS. Please update your configuration." + #elif MB(BIQU_SKR_V1_1) + #error "BOARD_BIQU_SKR_V1_1 has been renamed BOARD_BTT_SKR_V1_1. Please update your configuration." + #elif MB(BIGTREE_SKR_V1_1) + #error "BOARD_BIGTREE_SKR_V1_1 has been renamed BOARD_BTT_SKR_V1_1. Please update your configuration." + #elif MB(BIGTREE_SKR_V2_2) + #error "BOARD_BIGTREE_SKR_V1_2 has been renamed BOARD_BTT_SKR_V1_2. Please update your configuration." + #elif MB(BIGTREE_SKR_V1_3) + #error "BOARD_BIGTREE_SKR_V1_3 has been renamed BOARD_BTT_SKR_V1_3. Please update your configuration." + #elif MB(BIGTREE_SKR_V1_4) + #error "BOARD_BIGTREE_SKR_V1_4 has been renamed BOARD_BTT_SKR_V1_4. Please update your configuration." + #elif MB(BIGTREE_SKR_V1_4_TURBO) + #error "BOARD_BIGTREE_SKR_V1_4_TURBO has been renamed BOARD_BTT_SKR_V1_4_TURBO. Please update your configuration." + #elif MB(BIGTREE_BTT002_V1_0) + #error "BOARD_BIGTREE_BTT002_V1_0 has been renamed BOARD_BTT_BTT002_V1_0. Please update your configuration." + #elif MB(BIGTREE_SKR_PRO_V1_1) + #error "BOARD_BIGTREE_SKR_PRO_V1_1 has been renamed BOARD_BTT_SKR_PRO_V1_1. Please update your configuration." + #elif MB(BIGTREE_SKR_MINI_V1_1) + #error "BOARD_BIGTREE_SKR_MINI_V1_1 has been renamed BOARD_BTT_SKR_MINI_V1_1. Please update your configuration." + #elif MB(BIGTREE_SKR_MINI_E3) + #error "BOARD_BIGTREE_SKR_MINI_E3 has been renamed BOARD_BTT_SKR_MINI_E3_V1_0. Please update your configuration." + #elif MB(BIGTREE_SKR_E3_DIP) + #error "BOARD_BIGTREE_SKR_E3_DIP has been renamed BOARD_BTT_SKR_E3_DIP. Please update your configuration." + #elif MB(STM32F1R) + #error "BOARD_STM32F1R has been renamed BOARD_STM32F103RE. Please update your configuration." + #elif MB(STM32F103R) + #error "BOARD_STM32F103R has been renamed BOARD_STM32F103RE. Please update your configuration." + #elif MOTHERBOARD == BOARD_ESP32 + #error "BOARD_ESP32 has been renamed BOARD_ESPRESSIF_ESP32. Please update your configuration." + #elif MB(STEVAL) + #error "BOARD_STEVAL has been renamed BOARD_STEVAL_3DP001V1. Please update your configuration." + #elif MB(RUMBA32) + #error "BOARD_RUMBA32 is now BOARD_RUMBA32_MKS or BOARD_RUMBA32_V1_0. Please update your configuration." + #elif MB(RUMBA32_AUS3D) + #error "BOARD_RUMBA32_AUS3D is now BOARD_RUMBA32_V1_0. Please update your configuration." + #else + #error "Unknown MOTHERBOARD value set in Configuration.h" + #endif + + #undef BOARD_MKS_13 + #undef BOARD_TRIGORILLA + #undef BOARD_RURAMPS4D + #undef BOARD_FORMBOT_TREX2 + #undef BOARD_BIQU_SKR_V1_1 + #undef BOARD_STM32F1R + #undef BOARD_STM32F103R + #undef BOARD_ESP32 + #undef BOARD_STEVAL + #undef BOARD_BIGTREE_SKR_MINI_E3 + #undef BOARD_BIGTREE_SKR_V1_1 + #undef BOARD_BIGTREE_SKR_V1_3 + #undef BOARD_BIGTREE_SKR_V1_4 + #undef BOARD_BIGTREE_SKR_V1_4_TURBO + #undef BOARD_BIGTREE_BTT002_V1_0 + #undef BOARD_BIGTREE_SKR_PRO_V1_1 + #undef BOARD_BIGTREE_SKR_MINI_V1_1 + #undef BOARD_BIGTREE_SKR_E3_DIP + #undef BOARD_RUMBA32 + #undef BOARD_RUMBA32_AUS3D + +#endif + +// Define certain undefined pins +#ifndef X_MS1_PIN + #define X_MS1_PIN -1 +#endif +#ifndef X_MS2_PIN + #define X_MS2_PIN -1 +#endif +#ifndef X_MS3_PIN + #define X_MS3_PIN -1 +#endif +#ifndef Y_MS1_PIN + #define Y_MS1_PIN -1 +#endif +#ifndef Y_MS2_PIN + #define Y_MS2_PIN -1 +#endif +#ifndef Y_MS3_PIN + #define Y_MS3_PIN -1 +#endif +#ifndef Z_MS1_PIN + #define Z_MS1_PIN -1 +#endif +#ifndef Z_MS2_PIN + #define Z_MS2_PIN -1 +#endif +#ifndef Z_MS3_PIN + #define Z_MS3_PIN -1 +#endif +#ifndef E0_MS1_PIN + #define E0_MS1_PIN -1 +#endif +#ifndef E0_MS2_PIN + #define E0_MS2_PIN -1 +#endif +#ifndef E0_MS3_PIN + #define E0_MS3_PIN -1 +#endif +#ifndef E1_MS1_PIN + #define E1_MS1_PIN -1 +#endif +#ifndef E1_MS2_PIN + #define E1_MS2_PIN -1 +#endif +#ifndef E1_MS3_PIN + #define E1_MS3_PIN -1 +#endif +#ifndef E2_MS1_PIN + #define E2_MS1_PIN -1 +#endif +#ifndef E2_MS2_PIN + #define E2_MS2_PIN -1 +#endif +#ifndef E2_MS3_PIN + #define E2_MS3_PIN -1 +#endif +#ifndef E3_MS1_PIN + #define E3_MS1_PIN -1 +#endif +#ifndef E3_MS2_PIN + #define E3_MS2_PIN -1 +#endif +#ifndef E3_MS3_PIN + #define E3_MS3_PIN -1 +#endif +#ifndef E4_MS1_PIN + #define E4_MS1_PIN -1 +#endif +#ifndef E4_MS2_PIN + #define E4_MS2_PIN -1 +#endif +#ifndef E4_MS3_PIN + #define E4_MS3_PIN -1 +#endif +#ifndef E5_MS1_PIN + #define E5_MS1_PIN -1 +#endif +#ifndef E5_MS2_PIN + #define E5_MS2_PIN -1 +#endif +#ifndef E5_MS3_PIN + #define E5_MS3_PIN -1 +#endif +#ifndef E6_MS1_PIN + #define E6_MS1_PIN -1 +#endif +#ifndef E6_MS2_PIN + #define E6_MS2_PIN -1 +#endif +#ifndef E6_MS3_PIN + #define E6_MS3_PIN -1 +#endif +#ifndef E7_MS1_PIN + #define E7_MS1_PIN -1 +#endif +#ifndef E7_MS2_PIN + #define E7_MS2_PIN -1 +#endif +#ifndef E7_MS3_PIN + #define E7_MS3_PIN -1 +#endif + +#ifndef E0_STEP_PIN + #define E0_STEP_PIN -1 +#endif +#ifndef E0_DIR_PIN + #define E0_DIR_PIN -1 +#endif +#ifndef E0_ENABLE_PIN + #define E0_ENABLE_PIN -1 +#endif +#ifndef E1_STEP_PIN + #define E1_STEP_PIN -1 +#endif +#ifndef E1_DIR_PIN + #define E1_DIR_PIN -1 +#endif +#ifndef E1_ENABLE_PIN + #define E1_ENABLE_PIN -1 +#endif +#ifndef E2_STEP_PIN + #define E2_STEP_PIN -1 +#endif +#ifndef E2_DIR_PIN + #define E2_DIR_PIN -1 +#endif +#ifndef E2_ENABLE_PIN + #define E2_ENABLE_PIN -1 +#endif +#ifndef E3_STEP_PIN + #define E3_STEP_PIN -1 +#endif +#ifndef E3_DIR_PIN + #define E3_DIR_PIN -1 +#endif +#ifndef E3_ENABLE_PIN + #define E3_ENABLE_PIN -1 +#endif +#ifndef E4_STEP_PIN + #define E4_STEP_PIN -1 +#endif +#ifndef E4_DIR_PIN + #define E4_DIR_PIN -1 +#endif +#ifndef E4_ENABLE_PIN + #define E4_ENABLE_PIN -1 +#endif +#ifndef E5_STEP_PIN + #define E5_STEP_PIN -1 +#endif +#ifndef E5_DIR_PIN + #define E5_DIR_PIN -1 +#endif +#ifndef E5_ENABLE_PIN + #define E5_ENABLE_PIN -1 +#endif +#ifndef E6_STEP_PIN + #define E6_STEP_PIN -1 +#endif +#ifndef E6_DIR_PIN + #define E6_DIR_PIN -1 +#endif +#ifndef E6_ENABLE_PIN + #define E6_ENABLE_PIN -1 +#endif +#ifndef E7_STEP_PIN + #define E7_STEP_PIN -1 +#endif +#ifndef E7_DIR_PIN + #define E7_DIR_PIN -1 +#endif +#ifndef E7_ENABLE_PIN + #define E7_ENABLE_PIN -1 +#endif + +// +// Destroy unused CS pins +// +#if !AXIS_HAS_SPI(X) + #undef X_CS_PIN +#endif +#if !AXIS_HAS_SPI(Y) + #undef Y_CS_PIN +#endif +#if !AXIS_HAS_SPI(Z) + #undef Z_CS_PIN +#endif +#if E_STEPPERS && !AXIS_HAS_SPI(E0) + #undef E0_CS_PIN +#endif +#if E_STEPPERS > 1 && !AXIS_HAS_SPI(E1) + #undef E1_CS_PIN +#endif +#if E_STEPPERS > 2 && !AXIS_HAS_SPI(E2) + #undef E2_CS_PIN +#endif +#if E_STEPPERS > 3 && !AXIS_HAS_SPI(E3) + #undef E3_CS_PIN +#endif +#if E_STEPPERS > 4 && !AXIS_HAS_SPI(E4) + #undef E4_CS_PIN +#endif +#if E_STEPPERS > 5 && !AXIS_HAS_SPI(E5) + #undef E5_CS_PIN +#endif +#if E_STEPPERS > 6 && !AXIS_HAS_SPI(E6) + #undef E6_CS_PIN +#endif +#if E_STEPPERS > 7 && !AXIS_HAS_SPI(E7) + #undef E7_CS_PIN +#endif + +#ifndef X_CS_PIN + #define X_CS_PIN -1 +#endif +#ifndef Y_CS_PIN + #define Y_CS_PIN -1 +#endif +#ifndef Z_CS_PIN + #define Z_CS_PIN -1 +#endif +#ifndef E0_CS_PIN + #define E0_CS_PIN -1 +#endif +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif +#ifndef E2_CS_PIN + #define E2_CS_PIN -1 +#endif +#ifndef E3_CS_PIN + #define E3_CS_PIN -1 +#endif +#ifndef E4_CS_PIN + #define E4_CS_PIN -1 +#endif +#ifndef E5_CS_PIN + #define E5_CS_PIN -1 +#endif +#ifndef E6_CS_PIN + #define E6_CS_PIN -1 +#endif +#ifndef E7_CS_PIN + #define E7_CS_PIN -1 +#endif + +#ifndef FAN_PIN + #define FAN_PIN -1 +#endif +#define FAN0_PIN FAN_PIN +#ifndef FAN1_PIN + #define FAN1_PIN -1 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN -1 +#endif +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN -1 +#endif + +#ifndef FANMUX0_PIN + #define FANMUX0_PIN -1 +#endif +#ifndef FANMUX1_PIN + #define FANMUX1_PIN -1 +#endif +#ifndef FANMUX2_PIN + #define FANMUX2_PIN -1 +#endif + +#ifndef HEATER_0_PIN + #define HEATER_0_PIN -1 +#endif +#ifndef HEATER_1_PIN + #define HEATER_1_PIN -1 +#endif +#ifndef HEATER_2_PIN + #define HEATER_2_PIN -1 +#endif +#ifndef HEATER_3_PIN + #define HEATER_3_PIN -1 +#endif +#ifndef HEATER_4_PIN + #define HEATER_4_PIN -1 +#endif +#ifndef HEATER_5_PIN + #define HEATER_5_PIN -1 +#endif +#ifndef HEATER_6_PIN + #define HEATER_6_PIN -1 +#endif +#ifndef HEATER_7_PIN + #define HEATER_7_PIN -1 +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN -1 +#endif + +#ifndef TEMP_0_PIN + #define TEMP_0_PIN -1 +#endif +#ifndef TEMP_1_PIN + #define TEMP_1_PIN -1 +#endif +#ifndef TEMP_2_PIN + #define TEMP_2_PIN -1 +#endif +#ifndef TEMP_3_PIN + #define TEMP_3_PIN -1 +#endif +#ifndef TEMP_4_PIN + #define TEMP_4_PIN -1 +#endif +#ifndef TEMP_5_PIN + #define TEMP_5_PIN -1 +#endif +#ifndef TEMP_6_PIN + #define TEMP_6_PIN -1 +#endif +#ifndef TEMP_7_PIN + #define TEMP_7_PIN -1 +#endif +#ifndef TEMP_BED_PIN + #define TEMP_BED_PIN -1 +#endif + +#ifndef SD_DETECT_PIN + #define SD_DETECT_PIN -1 +#endif +#ifndef SDPOWER_PIN + #define SDPOWER_PIN -1 +#endif +#ifndef SDSS + #define SDSS -1 +#endif +#ifndef LED_PIN + #define LED_PIN -1 +#endif +#if DISABLED(PSU_CONTROL) || !defined(PS_ON_PIN) + #undef PS_ON_PIN + #define PS_ON_PIN -1 +#endif +#ifndef KILL_PIN + #define KILL_PIN -1 +#endif +#ifndef SUICIDE_PIN + #define SUICIDE_PIN -1 +#endif +#ifndef SUICIDE_PIN_INVERTING + #define SUICIDE_PIN_INVERTING false +#endif + +#ifndef NUM_SERVO_PLUGS + #define NUM_SERVO_PLUGS 4 +#endif + +// +// Assign endstop pins for boards with only 3 connectors +// +#ifdef X_STOP_PIN + #if X_HOME_DIR < 0 + #define X_MIN_PIN X_STOP_PIN + #ifndef X_MAX_PIN + #define X_MAX_PIN -1 + #endif + #else + #define X_MAX_PIN X_STOP_PIN + #ifndef X_MIN_PIN + #define X_MIN_PIN -1 + #endif + #endif +#elif X_HOME_DIR < 0 + #define X_STOP_PIN X_MIN_PIN +#else + #define X_STOP_PIN X_MAX_PIN +#endif + +#ifdef Y_STOP_PIN + #if Y_HOME_DIR < 0 + #define Y_MIN_PIN Y_STOP_PIN + #ifndef Y_MAX_PIN + #define Y_MAX_PIN -1 + #endif + #else + #define Y_MAX_PIN Y_STOP_PIN + #ifndef Y_MIN_PIN + #define Y_MIN_PIN -1 + #endif + #endif +#elif Y_HOME_DIR < 0 + #define Y_STOP_PIN Y_MIN_PIN +#else + #define Y_STOP_PIN Y_MAX_PIN +#endif + +#ifdef Z_STOP_PIN + #if Z_HOME_DIR < 0 + #define Z_MIN_PIN Z_STOP_PIN + #ifndef Z_MAX_PIN + #define Z_MAX_PIN -1 + #endif + #else + #define Z_MAX_PIN Z_STOP_PIN + #ifndef Z_MIN_PIN + #define Z_MIN_PIN -1 + #endif + #endif +#elif Z_HOME_DIR < 0 + #define Z_STOP_PIN Z_MIN_PIN +#else + #define Z_STOP_PIN Z_MAX_PIN +#endif + +// +// Disable unused endstop / probe pins +// +#if !HAS_CUSTOM_PROBE_PIN + #undef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN -1 +#endif + +#if DISABLED(USE_XMAX_PLUG) + #undef X_MAX_PIN + #define X_MAX_PIN -1 +#endif + +#if DISABLED(USE_YMAX_PLUG) + #undef Y_MAX_PIN + #define Y_MAX_PIN -1 +#endif + +#if DISABLED(USE_ZMAX_PLUG) + #undef Z_MAX_PIN + #define Z_MAX_PIN -1 +#endif + +#if DISABLED(USE_XMIN_PLUG) + #undef X_MIN_PIN + #define X_MIN_PIN -1 +#endif + +#if DISABLED(USE_YMIN_PLUG) + #undef Y_MIN_PIN + #define Y_MIN_PIN -1 +#endif + +#if DISABLED(USE_ZMIN_PLUG) + #undef Z_MIN_PIN + #define Z_MIN_PIN -1 +#endif + +#if HAS_FILAMENT_SENSOR + #define FIL_RUNOUT1_PIN FIL_RUNOUT_PIN +#else + #undef FIL_RUNOUT_PIN + #undef FIL_RUNOUT1_PIN +#endif + +#ifndef LCD_PINS_D4 + #define LCD_PINS_D4 -1 +#endif + +#if HAS_MARLINUI_HD44780 || TOUCH_UI_ULTIPANEL + #ifndef LCD_PINS_D5 + #define LCD_PINS_D5 -1 + #endif + #ifndef LCD_PINS_D6 + #define LCD_PINS_D6 -1 + #endif + #ifndef LCD_PINS_D7 + #define LCD_PINS_D7 -1 + #endif +#endif + +/** + * Auto-Assignment for Dual X, Dual Y, Multi-Z Steppers + * + * By default X2 is assigned to the next open E plug + * on the board, then in order, Y2, Z2, Z3. These can be + * overridden in Configuration.h or Configuration_adv.h. + */ + +#define __PEXI(p,q) PIN_EXISTS(E##p##_##q) +#define _PEXI(p,q) __PEXI(p,q) +#define __EPIN(p,q) E##p##_##q##_PIN +#define _EPIN(p,q) __EPIN(p,q) +#define DIAG_REMAPPED(p,q) (PIN_EXISTS(q) && _EPIN(p##_E_INDEX, DIAG) == q##_PIN) + +// The X2 axis, if any, should be the next open extruder port +#define X2_E_INDEX E_STEPPERS + +#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) + #ifndef X2_STEP_PIN + #define X2_STEP_PIN _EPIN(X2_E_INDEX, STEP) + #define X2_DIR_PIN _EPIN(X2_E_INDEX, DIR) + #define X2_ENABLE_PIN _EPIN(X2_E_INDEX, ENABLE) + #if X2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(X2_STEP) + #error "No E stepper plug left for X2!" + #endif + #endif + #ifndef X2_MS1_PIN + #define X2_MS1_PIN _EPIN(X2_E_INDEX, MS1) + #endif + #ifndef X2_MS2_PIN + #define X2_MS2_PIN _EPIN(X2_E_INDEX, MS2) + #endif + #ifndef X2_MS3_PIN + #define X2_MS3_PIN _EPIN(X2_E_INDEX, MS3) + #endif + #if AXIS_HAS_SPI(X2) && !defined(X2_CS_PIN) + #define X2_CS_PIN _EPIN(X2_E_INDEX, CS) + #endif + #if AXIS_HAS_UART(X2) + #ifndef X2_SERIAL_TX_PIN + #define X2_SERIAL_TX_PIN _EPIN(X2_E_INDEX, SERIAL_TX) + #endif + #ifndef X2_SERIAL_RX_PIN + #define X2_SERIAL_RX_PIN _EPIN(X2_E_INDEX, SERIAL_RX) + #endif + #endif + + // + // Auto-assign pins for stallGuard sensorless homing + // + #if defined(X2_STALL_SENSITIVITY) && ENABLED(X_DUAL_ENDSTOPS) && _PEXI(X2_E_INDEX, DIAG) + #define X2_DIAG_PIN _EPIN(X2_E_INDEX, DIAG) + #if DIAG_REMAPPED(X2, X_MIN) // If already remapped in the pins file... + #define X2_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(X2, Y_MIN) + #define X2_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(X2, Z_MIN) + #define X2_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(X2, X_MAX) + #define X2_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(X2, Y_MAX) + #define X2_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(X2, Z_MAX) + #define X2_USE_ENDSTOP _ZMAX_ + #else // Otherwise use the driver DIAG_PIN directly + #define _X2_USE_ENDSTOP(P) _E##P##_DIAG_ + #define X2_USE_ENDSTOP _X2_USE_ENDSTOP(X2_E_INDEX) + #endif + #undef X2_DIAG_PIN + #endif + + #define Y2_E_INDEX INCREMENT(X2_E_INDEX) +#else + #define Y2_E_INDEX X2_E_INDEX +#endif + +#ifndef X2_CS_PIN + #define X2_CS_PIN -1 +#endif +#ifndef X2_MS1_PIN + #define X2_MS1_PIN -1 +#endif +#ifndef X2_MS2_PIN + #define X2_MS2_PIN -1 +#endif +#ifndef X2_MS3_PIN + #define X2_MS3_PIN -1 +#endif + +// The Y2 axis, if any, should be the next open extruder port +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #ifndef Y2_STEP_PIN + #define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP) + #define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR) + #define Y2_ENABLE_PIN _EPIN(Y2_E_INDEX, ENABLE) + #if Y2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Y2_STEP) + #error "No E stepper plug left for Y2!" + #endif + #endif + #ifndef Y2_MS1_PIN + #define Y2_MS1_PIN _EPIN(Y2_E_INDEX, MS1) + #endif + #ifndef Y2_MS2_PIN + #define Y2_MS2_PIN _EPIN(Y2_E_INDEX, MS2) + #endif + #ifndef Y2_MS3_PIN + #define Y2_MS3_PIN _EPIN(Y2_E_INDEX, MS3) + #endif + #if AXIS_HAS_SPI(Y2) && !defined(Y2_CS_PIN) + #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS) + #endif + #if AXIS_HAS_UART(Y2) + #ifndef Y2_SERIAL_TX_PIN + #define Y2_SERIAL_TX_PIN _EPIN(Y2_E_INDEX, SERIAL_TX) + #endif + #ifndef Y2_SERIAL_RX_PIN + #define Y2_SERIAL_RX_PIN _EPIN(Y2_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Y2_STALL_SENSITIVITY) && ENABLED(Y_DUAL_ENDSTOPS) && _PEXI(Y2_E_INDEX, DIAG) + #define Y2_DIAG_PIN _EPIN(Y2_E_INDEX, DIAG) + #if DIAG_REMAPPED(Y2, X_MIN) + #define Y2_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Y2, Y_MIN) + #define Y2_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Y2, Z_MIN) + #define Y2_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Y2, X_MAX) + #define Y2_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Y2, Y_MAX) + #define Y2_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Y2, Z_MAX) + #define Y2_USE_ENDSTOP _ZMAX_ + #else + #define _Y2_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Y2_USE_ENDSTOP _Y2_USE_ENDSTOP(Y2_E_INDEX) + #endif + #undef Y2_DIAG_PIN + #endif + #define Z2_E_INDEX INCREMENT(Y2_E_INDEX) +#else + #define Z2_E_INDEX Y2_E_INDEX +#endif + +#ifndef Y2_CS_PIN + #define Y2_CS_PIN -1 +#endif +#ifndef Y2_MS1_PIN + #define Y2_MS1_PIN -1 +#endif +#ifndef Y2_MS2_PIN + #define Y2_MS2_PIN -1 +#endif +#ifndef Y2_MS3_PIN + #define Y2_MS3_PIN -1 +#endif + +// The Z2 axis, if any, should be the next open extruder port +#if NUM_Z_STEPPER_DRIVERS >= 2 + #ifndef Z2_STEP_PIN + #define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP) + #define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR) + #define Z2_ENABLE_PIN _EPIN(Z2_E_INDEX, ENABLE) + #if Z2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z2_STEP) + #error "No E stepper plug left for Z2!" + #endif + #endif + #ifndef Z2_MS1_PIN + #define Z2_MS1_PIN _EPIN(Z2_E_INDEX, MS1) + #endif + #ifndef Z2_MS2_PIN + #define Z2_MS2_PIN _EPIN(Z2_E_INDEX, MS2) + #endif + #ifndef Z2_MS3_PIN + #define Z2_MS3_PIN _EPIN(Z2_E_INDEX, MS3) + #endif + #if AXIS_HAS_SPI(Z2) && !defined(Z2_CS_PIN) + #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS) + #endif + #if AXIS_HAS_UART(Z2) + #ifndef Z2_SERIAL_TX_PIN + #define Z2_SERIAL_TX_PIN _EPIN(Z2_E_INDEX, SERIAL_TX) + #endif + #ifndef Z2_SERIAL_RX_PIN + #define Z2_SERIAL_RX_PIN _EPIN(Z2_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 2 && _PEXI(Z2_E_INDEX, DIAG) + #define Z2_DIAG_PIN _EPIN(Z2_E_INDEX, DIAG) + #if DIAG_REMAPPED(Z2, X_MIN) + #define Z2_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Z2, Y_MIN) + #define Z2_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Z2, Z_MIN) + #define Z2_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Z2, X_MAX) + #define Z2_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Z2, Y_MAX) + #define Z2_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Z2, Z_MAX) + #define Z2_USE_ENDSTOP _ZMAX_ + #else + #define _Z2_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Z2_USE_ENDSTOP _Z2_USE_ENDSTOP(Z2_E_INDEX) + #endif + #undef Z2_DIAG_PIN + #endif + #define Z3_E_INDEX INCREMENT(Z2_E_INDEX) +#else + #define Z3_E_INDEX Z2_E_INDEX +#endif + +#ifndef Z2_CS_PIN + #define Z2_CS_PIN -1 +#endif +#ifndef Z2_MS1_PIN + #define Z2_MS1_PIN -1 +#endif +#ifndef Z2_MS2_PIN + #define Z2_MS2_PIN -1 +#endif +#ifndef Z2_MS3_PIN + #define Z2_MS3_PIN -1 +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 3 + #ifndef Z3_STEP_PIN + #define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP) + #define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR) + #define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE) + #if Z3_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z3_STEP) + #error "No E stepper plug left for Z3!" + #endif + #endif + #if AXIS_HAS_SPI(Z3) + #ifndef Z3_CS_PIN + #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS) + #endif + #endif + #ifndef Z3_MS1_PIN + #define Z3_MS1_PIN _EPIN(Z3_E_INDEX, MS1) + #endif + #ifndef Z3_MS2_PIN + #define Z3_MS2_PIN _EPIN(Z3_E_INDEX, MS2) + #endif + #ifndef Z3_MS3_PIN + #define Z3_MS3_PIN _EPIN(Z3_E_INDEX, MS3) + #endif + #if AXIS_HAS_UART(Z3) + #ifndef Z3_SERIAL_TX_PIN + #define Z3_SERIAL_TX_PIN _EPIN(Z3_E_INDEX, SERIAL_TX) + #endif + #ifndef Z3_SERIAL_RX_PIN + #define Z3_SERIAL_RX_PIN _EPIN(Z3_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 && _PEXI(Z3_E_INDEX, DIAG) + #define Z3_DIAG_PIN _EPIN(Z3_E_INDEX, DIAG) + #if DIAG_REMAPPED(Z3, X_MIN) + #define Z3_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Z3, Y_MIN) + #define Z3_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Z3, Z_MIN) + #define Z3_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Z3, X_MAX) + #define Z3_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Z3, Y_MAX) + #define Z3_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Z3, Z_MAX) + #define Z3_USE_ENDSTOP _ZMAX_ + #else + #define _Z3_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Z3_USE_ENDSTOP _Z3_USE_ENDSTOP(Z3_E_INDEX) + #endif + #undef Z3_DIAG_PIN + #endif + #define Z4_E_INDEX INCREMENT(Z3_E_INDEX) +#endif + +#ifndef Z3_CS_PIN + #define Z3_CS_PIN -1 +#endif +#ifndef Z3_MS1_PIN + #define Z3_MS1_PIN -1 +#endif +#ifndef Z3_MS2_PIN + #define Z3_MS2_PIN -1 +#endif +#ifndef Z3_MS3_PIN + #define Z3_MS3_PIN -1 +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 4 + #ifndef Z4_STEP_PIN + #define Z4_STEP_PIN _EPIN(Z4_E_INDEX, STEP) + #define Z4_DIR_PIN _EPIN(Z4_E_INDEX, DIR) + #define Z4_ENABLE_PIN _EPIN(Z4_E_INDEX, ENABLE) + #if Z4_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z4_STEP) + #error "No E stepper plug left for Z4!" + #endif + #endif + #if AXIS_HAS_SPI(Z4) + #ifndef Z4_CS_PIN + #define Z4_CS_PIN _EPIN(Z4_E_INDEX, CS) + #endif + #endif + #ifndef Z4_MS1_PIN + #define Z4_MS1_PIN _EPIN(Z4_E_INDEX, MS1) + #endif + #ifndef Z4_MS2_PIN + #define Z4_MS2_PIN _EPIN(Z4_E_INDEX, MS2) + #endif + #ifndef Z4_MS3_PIN + #define Z4_MS3_PIN _EPIN(Z4_E_INDEX, MS3) + #endif + #if AXIS_HAS_UART(Z4) + #ifndef Z4_SERIAL_TX_PIN + #define Z4_SERIAL_TX_PIN _EPIN(Z4_E_INDEX, SERIAL_TX) + #endif + #ifndef Z4_SERIAL_RX_PIN + #define Z4_SERIAL_RX_PIN _EPIN(Z4_E_INDEX, SERIAL_RX) + #endif + #endif + #if defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 4 && _PEXI(Z4_E_INDEX, DIAG) + #define Z4_DIAG_PIN _EPIN(Z4_E_INDEX, DIAG) + #if DIAG_REMAPPED(Z4, X_MIN) + #define Z4_USE_ENDSTOP _XMIN_ + #elif DIAG_REMAPPED(Z4, Y_MIN) + #define Z4_USE_ENDSTOP _YMIN_ + #elif DIAG_REMAPPED(Z4, Z_MIN) + #define Z4_USE_ENDSTOP _ZMIN_ + #elif DIAG_REMAPPED(Z4, X_MAX) + #define Z4_USE_ENDSTOP _XMAX_ + #elif DIAG_REMAPPED(Z4, Y_MAX) + #define Z4_USE_ENDSTOP _YMAX_ + #elif DIAG_REMAPPED(Z4, Z_MAX) + #define Z4_USE_ENDSTOP _ZMAX_ + #else + #define _Z4_USE_ENDSTOP(P) _E##P##_DIAG_ + #define Z4_USE_ENDSTOP _Z4_USE_ENDSTOP(Z4_E_INDEX) + #endif + #undef Z4_DIAG_PIN + #endif +#endif + +#ifndef Z4_CS_PIN + #define Z4_CS_PIN -1 +#endif +#ifndef Z4_MS1_PIN + #define Z4_MS1_PIN -1 +#endif +#ifndef Z4_MS2_PIN + #define Z4_MS2_PIN -1 +#endif +#ifndef Z4_MS3_PIN + #define Z4_MS3_PIN -1 +#endif + +#if HAS_MARLINUI_U8GLIB + #if !defined(ST7920_DELAY_1) && defined(BOARD_ST7920_DELAY_1) + #define ST7920_DELAY_1 BOARD_ST7920_DELAY_1 + #endif + #if !defined(ST7920_DELAY_2) && defined(BOARD_ST7920_DELAY_2) + #define ST7920_DELAY_2 BOARD_ST7920_DELAY_2 + #endif + #if !defined(ST7920_DELAY_3) && defined(BOARD_ST7920_DELAY_3) + #define ST7920_DELAY_3 BOARD_ST7920_DELAY_3 + #endif +#else + #undef ST7920_DELAY_1 + #undef ST7920_DELAY_2 + #undef ST7920_DELAY_3 +#endif + +#undef HAS_FREE_AUX2_PINS +#undef DIAG_REMAPPED diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h new file mode 100644 index 00000000..5f153cfa --- /dev/null +++ b/Marlin/src/pins/pinsDebug.h @@ -0,0 +1,363 @@ +/** + * 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" + +#define MAX_NAME_LENGTH 39 // one place to specify the format of all the sources of names + // "-" left justify, "39" minimum width of name, pad with blanks + +/** + * This routine minimizes RAM usage by creating a FLASH resident array to + * store the pin names, pin numbers and analog/digital flag. + * + * Creating the array in FLASH is a two pass process. The first pass puts the + * name strings into FLASH. The second pass actually creates the array. + * + * Both passes use the same pin list. The list contains two macro names. The + * actual macro definitions are changed depending on which pass is being done. + */ + +// first pass - put the name strings into FLASH + +#define _ADD_PIN_2(PIN_NAME, ENTRY_NAME) static const char ENTRY_NAME[] PROGMEM = { PIN_NAME }; +#define _ADD_PIN(PIN_NAME, COUNTER) _ADD_PIN_2(PIN_NAME, entry_NAME_##COUNTER) +#define REPORT_NAME_DIGITAL(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) +#define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) + +#include "pinsDebug_list.h" +#line 46 + +// manually add pins that have names that are macros which don't play well with these macros +#if ANY(AVR_ATmega2560_FAMILY, AVR_ATmega1284_FAMILY, ARDUINO_ARCH_SAM, TARGET_LPC1768) + #if SERIAL_PORT == 0 + static const char RXD_NAME_0[] PROGMEM = { "RXD0" }; + static const char TXD_NAME_0[] PROGMEM = { "TXD0" }; + #elif SERIAL_PORT == 1 + static const char RXD_NAME_1[] PROGMEM = { "RXD1" }; + static const char TXD_NAME_1[] PROGMEM = { "TXD1" }; + #elif SERIAL_PORT == 2 + static const char RXD_NAME_2[] PROGMEM = { "RXD2" }; + static const char TXD_NAME_2[] PROGMEM = { "TXD2" }; + #elif SERIAL_PORT == 3 + static const char RXD_NAME_3[] PROGMEM = { "RXD3" }; + static const char TXD_NAME_3[] PROGMEM = { "TXD3" }; + #endif + #ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == 0 + static const char RXD_NAME_0[] PROGMEM = { "RXD0" }; + static const char TXD_NAME_0[] PROGMEM = { "TXD0" }; + #elif SERIAL_PORT_2 == 1 + static const char RXD_NAME_1[] PROGMEM = { "RXD1" }; + static const char TXD_NAME_1[] PROGMEM = { "TXD1" }; + #elif SERIAL_PORT_2 == 2 + static const char RXD_NAME_2[] PROGMEM = { "RXD2" }; + static const char TXD_NAME_2[] PROGMEM = { "TXD2" }; + #elif SERIAL_PORT_2 == 3 + static const char RXD_NAME_3[] PROGMEM = { "RXD3" }; + static const char TXD_NAME_3[] PROGMEM = { "TXD3" }; + #endif + #endif +#endif + +///////////////////////////////////////////////////////////////////////////// + +// second pass - create the array + +#undef _ADD_PIN_2 +#undef _ADD_PIN +#undef REPORT_NAME_DIGITAL +#undef REPORT_NAME_ANALOG + +#define _ADD_PIN_2(ENTRY_NAME, NAME, IS_DIGITAL) { ENTRY_NAME, NAME, IS_DIGITAL }, +#define _ADD_PIN(NAME, COUNTER, IS_DIGITAL) _ADD_PIN_2(entry_NAME_##COUNTER, NAME, IS_DIGITAL) +#define REPORT_NAME_DIGITAL(COUNTER, NAME) _ADD_PIN(NAME, COUNTER, true) +#define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(analogInputToDigitalPin(NAME), COUNTER, false) + + +typedef struct { + PGM_P const name; + pin_t pin; + bool is_digital; +} PinInfo; + +const PinInfo pin_array[] PROGMEM = { + + /** + * [pin name] [pin number] [is digital or analog] 1 = digital, 0 = analog + * Each entry takes up 6 bytes in FLASH: + * 2 byte pointer to location of the name string + * 2 bytes containing the pin number + * analog pin numbers were convereted to digital when the array was created + * 2 bytes containing the digital/analog bool flag + */ + + // manually add pins ... + #if SERIAL_PORT == 0 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_0, 0, true }, + { TXD_NAME_0, 1, true }, + #elif AVR_ATmega1284_FAMILY + { RXD_NAME_0, 8, true }, + { TXD_NAME_0, 9, true }, + #elif defined(TARGET_LPC1768) // TX P0_02 RX P0_03 + { RXD_NAME_0, 3, true }, + { TXD_NAME_0, 2, true }, + #endif + #elif SERIAL_PORT == 1 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_1, 19, true }, + { TXD_NAME_1, 18, true }, + #elif AVR_ATmega1284_FAMILY + { RXD_NAME_1, 10, true }, + { TXD_NAME_1, 11, true }, + #elif defined(TARGET_LPC1768) + #ifdef LPC_PINCFG_UART1_P2_00 // TX P2_00 RX P2_01 + { RXD_NAME_1, 0x41, true }, + { TXD_NAME_1, 0x40, true }, + #else // TX P0_15 RX P0_16 + { RXD_NAME_1, 16, true }, + { TXD_NAME_1, 15, true }, + #endif + #endif + #elif SERIAL_PORT == 2 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_2, 17, true }, + { TXD_NAME_2, 16, true }, + #elif defined(TARGET_LPC1768) + #ifdef LPC_PINCFG_UART2_P2_08 // TX P2_08 RX P2_09 + { RXD_NAME_2, 0x49, true }, + { TXD_NAME_2, 0x48, true }, + #else // TX P0_10 RX P0_11 + { RXD_NAME_2, 11, true }, + { TXD_NAME_2, 10, true }, + #endif + #endif + #elif SERIAL_PORT == 3 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_3, 15, true }, + { TXD_NAME_3, 14, true }, + #elif defined(TARGET_LPC1768) + #ifdef LPC_PINCFG_UART3_P0_25 // TX P0_25 RX P0_26 + { RXD_NAME_3, 0x1A, true }, + { TXD_NAME_3, 0x19, true }, + #elif defined(LPC_PINCFG_UART3_P4_28) // TX P4_28 RX P4_29 + { RXD_NAME_3, 0x9D, true }, + { TXD_NAME_3, 0x9C, true }, + #else // TX P0_00 RX P0_01 + { RXD_NAME_3, 1, true }, + { TXD_NAME_3, 0, true }, + #endif + #endif + #endif + + #ifdef SERIAL_PORT_2 + #if SERIAL_PORT_2 == 0 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_0, 0, true }, + { TXD_NAME_0, 1, true }, + #elif AVR_ATmega1284_FAMILY + { RXD_NAME_0, 8, true }, + { TXD_NAME_0, 9, true }, + #elif defined(TARGET_LPC1768) // TX P0_02 RX P0_03 + { RXD_NAME_0, 3, true }, + { TXD_NAME_0, 2, true }, + #endif + #elif SERIAL_PORT_2 == 1 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_1, 19, true }, + { TXD_NAME_1, 18, true }, + #elif AVR_ATmega1284_FAMILY + { RXD_NAME_1, 10, true }, + { TXD_NAME_1, 11, true }, + #elif defined(TARGET_LPC1768) + #ifdef LPC_PINCFG_UART1_P2_00 // TX P2_00 RX P2_01 + { RXD_NAME_1, 0x41, true }, + { TXD_NAME_1, 0x40, true }, + #else // TX P0_15 RX P0_16 + { RXD_NAME_1, 16, true }, + { TXD_NAME_1, 15, true }, + #endif + #endif + #elif SERIAL_PORT_2 == 2 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_2, 17, true }, + { TXD_NAME_2, 16, true }, + #elif defined(TARGET_LPC1768) + #ifdef LPC_PINCFG_UART2_P2_08 // TX P2_08 RX P2_09 + { RXD_NAME_2, 0x49, true }, + { TXD_NAME_2, 0x48, true }, + #else // TX P0_10 RX P0_11 + { RXD_NAME_2, 11, true }, + { TXD_NAME_2, 10, true }, + #endif + #endif + #elif SERIAL_PORT_2 == 3 + #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + { RXD_NAME_3, 15, true }, + { TXD_NAME_3, 14, true }, + #elif defined(TARGET_LPC1768) + #ifdef LPC_PINCFG_UART3_P0_25 // TX P0_25 RX P0_26 + { RXD_NAME_3, 0x1A, true }, + { TXD_NAME_3, 0x19, true }, + #elif defined(LPC_PINCFG_UART3_P4_28) // TX P4_28 RX P4_29 + { RXD_NAME_3, 0x9D, true }, + { TXD_NAME_3, 0x9C, true }, + #else // TX P0_00 RX P0_01 + { RXD_NAME_3, 1, true }, + { TXD_NAME_3, 0, true }, + #endif + #endif + #endif + #endif + + #include "pinsDebug_list.h" + #line 172 + +}; + +#include HAL_PATH(../HAL, pinsDebug.h) // get the correct support file for this CPU + +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(Q) false +#endif + +static void print_input_or_output(const bool isout) { + serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); +} + +// pretty report with PWM info +inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool extended=false, PGM_P const start_string=nullptr) { + char buffer[MAX_NAME_LENGTH + 1]; // for the sprintf statements + bool found = false, multi_name_pin = false; + + auto alt_pin_echo = [](const pin_t &pin) { + #if AVR_AT90USB1286_FAMILY + // Use FastIO for pins Teensy doesn't expose + if (pin == 46) { + print_input_or_output(IS_OUTPUT(46)); + SERIAL_CHAR('0' + READ(46)); + return false; + } + else if (pin == 47) { + print_input_or_output(IS_OUTPUT(47)); + SERIAL_CHAR('0' + READ(47)); + return false; + } + #endif + return true; + }; + + LOOP_L_N(x, COUNT(pin_array)) { // scan entire array and report all instances of this pin + if (GET_ARRAY_PIN(x) == pin) { + if (!found) { // report digital and analog pin number only on the first time through + if (start_string) serialprintPGM(start_string); + serialprintPGM(PSTR("PIN: ")); + PRINT_PIN(pin); + PRINT_PORT(pin); + if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { + sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number + SERIAL_ECHO(buffer); + } + else SERIAL_ECHO_SP(8); // add padding if not an analog pin + } + else { + SERIAL_CHAR('.'); + SERIAL_ECHO_SP(MULTI_NAME_PAD + (start_string ? strlen_P(start_string) : 0)); // add padding if not the first instance found + } + PRINT_ARRAY_NAME(x); + if (extended) { + if (pin_is_protected(pin) && !ignore) + SERIAL_ECHOPGM("protected "); + else { + if (alt_pin_echo(pin)) { + if (!GET_ARRAY_IS_DIGITAL(x)) { + sprintf_P(buffer, PSTR("Analog in = %5ld"), (long)analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + SERIAL_ECHO(buffer); + } + else { + if (!GET_PINMODE(pin)) { + //pinMode(pin, INPUT_PULLUP); // make sure input isn't floating - stopped doing this + // because this could interfere with inductive/capacitive + // sensors (high impedance voltage divider) and with Pt100 amplifier + print_input_or_output(false); + SERIAL_ECHO(digitalRead_mod(pin)); + } + else if (pwm_status(pin)) { + // do nothing + } + else { + print_input_or_output(true); + SERIAL_ECHO(digitalRead_mod(pin)); + } + } + if (!multi_name_pin && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report + } + } + } + SERIAL_EOL(); + multi_name_pin = found; + found = true; + } // end of IF + } // end of for loop + + if (!found) { + if (start_string) serialprintPGM(start_string); + serialprintPGM(PSTR("PIN: ")); + PRINT_PIN(pin); + PRINT_PORT(pin); + if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { + sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); // analog pin number + SERIAL_ECHO(buffer); + } + else + SERIAL_ECHO_SP(8); // add padding if not an analog pin + SERIAL_ECHOPGM(""); + if (extended) { + + if (alt_pin_echo(pin)) { + if (pwm_status(pin)) { + // do nothing + } + else if (GET_PINMODE(pin)) { + SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); + print_input_or_output(true); + SERIAL_ECHO(digitalRead_mod(pin)); + } + else { + if (IS_ANALOG(pin)) { + sprintf_P(buffer, PSTR(" Analog in = %5ld"), (long)analogRead(DIGITAL_PIN_TO_ANALOG_PIN(pin))); + SERIAL_ECHO(buffer); + SERIAL_ECHOPGM(" "); + } + else + SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); // add padding if not an analog pin + + print_input_or_output(false); + SERIAL_ECHO(digitalRead_mod(pin)); + } + //if (!pwm_status(pin)) SERIAL_CHAR(' '); // add padding if it's not a PWM pin + if (extended) { + SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); + pwm_details(pin); // report PWM capabilities only if doing an extended report + } + } + } + SERIAL_EOL(); + } +} diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h new file mode 100644 index 00000000..704f2a48 --- /dev/null +++ b/Marlin/src/pins/pinsDebug_list.h @@ -0,0 +1,1445 @@ +/** + * 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 . + * + */ + +// Please update this list when adding new pins to Marlin. +// The order doesn't matter. +// Following this pattern is a must. +// If the new pin name is over 28 characters long then pinsDebug.h will need to be modified. + +// Pin lists 1.1.x and 2.0.x synchronized 2018-02-17 + +#line 28 // set __LINE__ to a known value for both passes + +// +// Analog Pin Assignments +// + +#define ANALOG_OK(PN) ((PN) >= 0 && (PN) < NUM_ANALOG_INPUTS) + +#if defined(EXT_AUX_A0) && ANALOG_OK(EXT_AUX_A0) + REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A0) +#endif +#if defined(EXT_AUX_A1) && ANALOG_OK(EXT_AUX_A0) + REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A1) +#endif +#if defined(EXT_AUX_A2) && ANALOG_OK(EXT_AUX_A0) + REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A2) +#endif +#if defined(EXT_AUX_A3) && ANALOG_OK(EXT_AUX_A0) + REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A3) +#endif +#if defined(EXT_AUX_A4) && ANALOG_OK(EXT_AUX_A0) + REPORT_NAME_ANALOG(__LINE__, EXT_AUX_A4) +#endif +#if PIN_EXISTS(FILWIDTH) && ANALOG_OK(FILWIDTH_PIN) + REPORT_NAME_ANALOG(__LINE__, FILWIDTH_PIN) +#endif +#if PIN_EXISTS(MAIN_VOLTAGE_MEASURE) && ANALOG_OK(MAIN_VOLTAGE_MEASURE_PIN) + REPORT_NAME_ANALOG(__LINE__, MAIN_VOLTAGE_MEASURE_PIN) +#endif +#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) // TC1 & TC2 are macros in the SAM/SAMD tool chain + #if defined(TC1) && ANALOG_OK(TC1) + REPORT_NAME_ANALOG(__LINE__, TC1) + #endif + #if defined(TC2) && ANALOG_OK(TC1) + REPORT_NAME_ANALOG(__LINE__, TC2) + #endif +#endif +#if PIN_EXISTS(TEMP_0) && ANALOG_OK(TEMP_0_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_0_PIN) +#endif +#if PIN_EXISTS(TEMP_1) && ANALOG_OK(TEMP_1_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_1_PIN) +#endif +#if PIN_EXISTS(TEMP_2) && ANALOG_OK(TEMP_2_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_2_PIN) +#endif +#if PIN_EXISTS(TEMP_3) && ANALOG_OK(TEMP_3_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_3_PIN) +#endif +#if PIN_EXISTS(TEMP_4) && ANALOG_OK(TEMP_4_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_4_PIN) +#endif +#if PIN_EXISTS(TEMP_5) && ANALOG_OK(TEMP_5_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_5_PIN) +#endif +#if PIN_EXISTS(TEMP_6) && ANALOG_OK(TEMP_6_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_6_PIN) +#endif +#if PIN_EXISTS(TEMP_7) && ANALOG_OK(TEMP_7_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_7_PIN) +#endif +#if PIN_EXISTS(TEMP_BED) && ANALOG_OK(TEMP_BED_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_BED_PIN) +#endif +#if PIN_EXISTS(TEMP_CHAMBER) && ANALOG_OK(TEMP_CHAMBER_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_CHAMBER_PIN) +#endif +#if PIN_EXISTS(ADC_KEYPAD) && ANALOG_OK(ADC_KEYPAD_PIN) + REPORT_NAME_ANALOG(__LINE__, ADC_KEYPAD_PIN) +#endif + +// +// Digital Pin Assignments +// + +#if defined(__FD) && __FD >= 0 + REPORT_NAME_DIGITAL(__LINE__, __FD) +#endif +#if defined(__FS) && __FS >= 0 + REPORT_NAME_DIGITAL(__LINE__, __FS) +#endif +#if defined(__GD) && __GD >= 0 + REPORT_NAME_DIGITAL(__LINE__, __GD) +#endif +#if defined(__GS) && __GS >= 0 + REPORT_NAME_DIGITAL(__LINE__, __GS) +#endif +#if PIN_EXISTS(AVR_MISO) + REPORT_NAME_DIGITAL(__LINE__, AVR_MISO_PIN) +#endif +#if PIN_EXISTS(AVR_MOSI) + REPORT_NAME_DIGITAL(__LINE__, AVR_MOSI_PIN) +#endif +#if PIN_EXISTS(AVR_SCK) + REPORT_NAME_DIGITAL(__LINE__, AVR_SCK_PIN) +#endif +#if PIN_EXISTS(ALARM) + REPORT_NAME_DIGITAL(__LINE__, ALARM_PIN) +#endif +#if PIN_EXISTS(AVR_SS) + REPORT_NAME_DIGITAL(__LINE__, AVR_SS_PIN) +#endif +#if PIN_EXISTS(BEEPER) + REPORT_NAME_DIGITAL(__LINE__, BEEPER_PIN) +#endif +#if defined(BTN_BACK) && BTN_BACK >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_BACK) +#endif +#if defined(BTN_CENTER) && BTN_CENTER >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_CENTER) +#endif +#if defined(BTN_DOWN) && BTN_DOWN >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_DOWN) +#endif +#if defined(BTN_DWN) && BTN_DWN >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_DWN) +#endif +#if defined(BTN_EN1) && BTN_EN1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_EN1) +#endif +#if defined(BTN_EN2) && BTN_EN2 >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_EN2) +#endif +#if defined(BTN_ENC) && BTN_ENC >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_ENC) +#endif +#if defined(BTN_HOME) && BTN_HOME >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_HOME) +#endif +#if defined(BTN_LEFT) && BTN_LEFT >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_LEFT) +#endif +#if defined(BTN_LFT) && BTN_LFT >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_LFT) +#endif +#if defined(BTN_RIGHT) && BTN_RIGHT >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_RIGHT) +#endif +#if defined(BTN_RT) && BTN_RT >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_RT) +#endif +#if defined(BTN_UP) && BTN_UP >= 0 + REPORT_NAME_DIGITAL(__LINE__, BTN_UP) +#endif +#if PIN_EXISTS(JOY_X) + REPORT_NAME_DIGITAL(__LINE__, JOY_X_PIN) +#endif +#if PIN_EXISTS(JOY_Y) + REPORT_NAME_DIGITAL(__LINE__, JOY_Y_PIN) +#endif +#if PIN_EXISTS(JOY_Z) + REPORT_NAME_DIGITAL(__LINE__, JOY_Z_PIN) +#endif +#if PIN_EXISTS(JOY_EN) + REPORT_NAME_DIGITAL(__LINE__, JOY_EN_PIN) +#endif +#if PIN_EXISTS(CASE_LIGHT) + REPORT_NAME_DIGITAL(__LINE__, CASE_LIGHT_PIN) +#endif +#if PIN_EXISTS(CHAMBER_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, CHAMBER_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(CONTROLLER_FAN) + REPORT_NAME_DIGITAL(__LINE__, CONTROLLER_FAN_PIN) +#endif +#if PIN_EXISTS(COOLANT_FLOOD) + REPORT_NAME_DIGITAL(__LINE__, COOLANT_FLOOD_PIN) +#endif +#if PIN_EXISTS(COOLANT_MIST) + REPORT_NAME_DIGITAL(__LINE__, COOLANT_MIST_PIN) +#endif +#if PIN_EXISTS(CUTOFF_RESET) + REPORT_NAME_DIGITAL(__LINE__, CUTOFF_RESET_PIN) +#endif +#if PIN_EXISTS(CUTOFF_TEST) + REPORT_NAME_DIGITAL(__LINE__, CUTOFF_TEST_PIN) +#endif +#if defined(D57) && D57 >= 0 + REPORT_NAME_DIGITAL(__LINE__, D57) +#endif +#if defined(D58) && D58 >= 0 + REPORT_NAME_DIGITAL(__LINE__, D58) +#endif +#if PIN_EXISTS(DAC_DISABLE) + REPORT_NAME_DIGITAL(__LINE__, DAC_DISABLE_PIN) +#endif +#if defined(DAC0_SYNC) && DAC0_SYNC >= 0 + REPORT_NAME_DIGITAL(__LINE__, DAC0_SYNC) +#endif +#if defined(DAC1_SYNC) && DAC1_SYNC >= 0 + REPORT_NAME_DIGITAL(__LINE__, DAC1_SYNC) +#endif +#if PIN_EXISTS(DEBUG) + REPORT_NAME_DIGITAL(__LINE__, DEBUG_PIN) +#endif +#if defined(DIGIPOTS_I2C_SCL) && DIGIPOTS_I2C_SCL >= 0 + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTS_I2C_SCL) +#endif +#if defined(DIGIPOTS_I2C_SDA_E0) && DIGIPOTS_I2C_SDA_E0 >= 0 + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTS_I2C_SDA_E0) +#endif +#if defined(DIGIPOTS_I2C_SDA_E1) && DIGIPOTS_I2C_SDA_E1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTS_I2C_SDA_E1) +#endif +#if defined(DIGIPOTS_I2C_SDA_X) && DIGIPOTS_I2C_SDA_X >= 0 + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTS_I2C_SDA_X) +#endif +#if defined(DIGIPOTS_I2C_SDA_Y) && DIGIPOTS_I2C_SDA_Y >= 0 + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTS_I2C_SDA_Y) +#endif +#if defined(DIGIPOTS_I2C_SDA_Z) && DIGIPOTS_I2C_SDA_Z >= 0 + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTS_I2C_SDA_Z) +#endif +#if PIN_EXISTS(DIGIPOTSS) + REPORT_NAME_DIGITAL(__LINE__, DIGIPOTSS_PIN) +#endif +#if defined(DOGLCD_A0) && DOGLCD_A0 >= 0 + REPORT_NAME_DIGITAL(__LINE__, DOGLCD_A0) +#endif +#if defined(DOGLCD_CS) && DOGLCD_CS >= 0 + REPORT_NAME_DIGITAL(__LINE__, DOGLCD_CS) +#endif +#if defined(DOGLCD_MOSI) && DOGLCD_MOSI >= 0 + REPORT_NAME_DIGITAL(__LINE__, DOGLCD_MOSI) +#endif +#if defined(DOGLCD_SCK) && DOGLCD_SCK >= 0 + REPORT_NAME_DIGITAL(__LINE__, DOGLCD_SCK) +#endif +#if defined(TMC_SW_MISO) && TMC_SW_MISO >= 0 + REPORT_NAME_DIGITAL(__LINE__, TMC_SW_MISO) +#endif +#if defined(TMC_SW_MOSI) && TMC_SW_MOSI >= 0 + REPORT_NAME_DIGITAL(__LINE__, TMC_SW_MOSI) +#endif +#if defined(TMC_SW_SCK) && TMC_SW_SCK >= 0 + REPORT_NAME_DIGITAL(__LINE__, TMC_SW_SCK) +#endif +#if defined(TFTGLCD_CS) && TFTGLCD_CS >= 0 + REPORT_NAME_DIGITAL(__LINE__, TFTGLCD_CS) +#endif +#if PIN_EXISTS(E_MUX0) + REPORT_NAME_DIGITAL(__LINE__, E_MUX0_PIN) +#endif +#if PIN_EXISTS(E_MUX1) + REPORT_NAME_DIGITAL(__LINE__, E_MUX1_PIN) +#endif +#if PIN_EXISTS(E_MUX2) + REPORT_NAME_DIGITAL(__LINE__, E_MUX2_PIN) +#endif +#if PIN_EXISTS(E_STOP) + REPORT_NAME_DIGITAL(__LINE__, E_STOP_PIN) +#endif +#if PIN_EXISTS(E0_ATT) + REPORT_NAME_DIGITAL(__LINE__, E0_ATT_PIN) +#endif +#if PIN_EXISTS(E0_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E0_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E0_CS) + REPORT_NAME_DIGITAL(__LINE__, E0_CS_PIN) +#endif +#if PIN_EXISTS(E0_DIR) + REPORT_NAME_DIGITAL(__LINE__, E0_DIR_PIN) +#endif +#if PIN_EXISTS(E0_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E0_ENABLE_PIN) +#endif +#if PIN_EXISTS(E0_MS1) + REPORT_NAME_DIGITAL(__LINE__, E0_MS1_PIN) +#endif +#if PIN_EXISTS(E0_MS2) + REPORT_NAME_DIGITAL(__LINE__, E0_MS2_PIN) +#endif +#if PIN_EXISTS(E0_MS3) + REPORT_NAME_DIGITAL(__LINE__, E0_MS3_PIN) +#endif +#if PIN_EXISTS(E0_STEP) + REPORT_NAME_DIGITAL(__LINE__, E0_STEP_PIN) +#endif +#if PIN_EXISTS(E1_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E1_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E1_CS) + REPORT_NAME_DIGITAL(__LINE__, E1_CS_PIN) +#endif +#if PIN_EXISTS(E1_DIR) + REPORT_NAME_DIGITAL(__LINE__, E1_DIR_PIN) +#endif +#if PIN_EXISTS(E1_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E1_ENABLE_PIN) +#endif +#if PIN_EXISTS(E1_MS1) + REPORT_NAME_DIGITAL(__LINE__, E1_MS1_PIN) +#endif +#if PIN_EXISTS(E1_MS2) + REPORT_NAME_DIGITAL(__LINE__, E1_MS2_PIN) +#endif +#if PIN_EXISTS(E1_MS3) + REPORT_NAME_DIGITAL(__LINE__, E1_MS3_PIN) +#endif +#if PIN_EXISTS(E1_STEP) + REPORT_NAME_DIGITAL(__LINE__, E1_STEP_PIN) +#endif +#if PIN_EXISTS(E2_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E2_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E2_CS) + REPORT_NAME_DIGITAL(__LINE__, E2_CS_PIN) +#endif +#if PIN_EXISTS(E2_DIR) + REPORT_NAME_DIGITAL(__LINE__, E2_DIR_PIN) +#endif +#if PIN_EXISTS(E2_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E2_ENABLE_PIN) +#endif +#if PIN_EXISTS(E2_MS1) + REPORT_NAME_DIGITAL(__LINE__, E2_MS1_PIN) +#endif +#if PIN_EXISTS(E2_MS2) + REPORT_NAME_DIGITAL(__LINE__, E2_MS2_PIN) +#endif +#if PIN_EXISTS(E2_MS3) + REPORT_NAME_DIGITAL(__LINE__, E2_MS3_PIN) +#endif +#if PIN_EXISTS(E2_STEP) + REPORT_NAME_DIGITAL(__LINE__, E2_STEP_PIN) +#endif +#if PIN_EXISTS(E3_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E3_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E3_CS) + REPORT_NAME_DIGITAL(__LINE__, E3_CS_PIN) +#endif +#if PIN_EXISTS(E3_DIR) + REPORT_NAME_DIGITAL(__LINE__, E3_DIR_PIN) +#endif +#if PIN_EXISTS(E3_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E3_ENABLE_PIN) +#endif +#if PIN_EXISTS(E3_MS1) + REPORT_NAME_DIGITAL(__LINE__, E3_MS1_PIN) +#endif +#if PIN_EXISTS(E3_MS2) + REPORT_NAME_DIGITAL(__LINE__, E3_MS2_PIN) +#endif +#if PIN_EXISTS(E3_MS3) + REPORT_NAME_DIGITAL(__LINE__, E3_MS3_PIN) +#endif +#if PIN_EXISTS(E3_STEP) + REPORT_NAME_DIGITAL(__LINE__, E3_STEP_PIN) +#endif +#if PIN_EXISTS(E4_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E4_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E4_CS) + REPORT_NAME_DIGITAL(__LINE__, E4_CS_PIN) +#endif +#if PIN_EXISTS(E4_DIR) + REPORT_NAME_DIGITAL(__LINE__, E4_DIR_PIN) +#endif +#if PIN_EXISTS(E4_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E4_ENABLE_PIN) +#endif +#if PIN_EXISTS(E4_MS1) + REPORT_NAME_DIGITAL(__LINE__, E4_MS1_PIN) +#endif +#if PIN_EXISTS(E4_MS2) + REPORT_NAME_DIGITAL(__LINE__, E4_MS2_PIN) +#endif +#if PIN_EXISTS(E4_MS3) + REPORT_NAME_DIGITAL(__LINE__, E4_MS3_PIN) +#endif +#if PIN_EXISTS(E4_STEP) + REPORT_NAME_DIGITAL(__LINE__, E4_STEP_PIN) +#endif +#if PIN_EXISTS(E5_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E5_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E5_CS) + REPORT_NAME_DIGITAL(__LINE__, E5_CS_PIN) +#endif +#if PIN_EXISTS(E5_DIR) + REPORT_NAME_DIGITAL(__LINE__, E5_DIR_PIN) +#endif +#if PIN_EXISTS(E5_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E5_ENABLE_PIN) +#endif +#if PIN_EXISTS(E5_MS1) + REPORT_NAME_DIGITAL(__LINE__, E5_MS1_PIN) +#endif +#if PIN_EXISTS(E5_MS2) + REPORT_NAME_DIGITAL(__LINE__, E5_MS2_PIN) +#endif +#if PIN_EXISTS(E5_MS3) + REPORT_NAME_DIGITAL(__LINE__, E5_MS3_PIN) +#endif +#if PIN_EXISTS(E5_STEP) + REPORT_NAME_DIGITAL(__LINE__, E5_STEP_PIN) +#endif +#if PIN_EXISTS(E6_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E6_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E6_CS) + REPORT_NAME_DIGITAL(__LINE__, E6_CS_PIN) +#endif +#if PIN_EXISTS(E6_DIR) + REPORT_NAME_DIGITAL(__LINE__, E6_DIR_PIN) +#endif +#if PIN_EXISTS(E6_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E6_ENABLE_PIN) +#endif +#if PIN_EXISTS(E6_MS1) + REPORT_NAME_DIGITAL(__LINE__, E6_MS1_PIN) +#endif +#if PIN_EXISTS(E6_MS2) + REPORT_NAME_DIGITAL(__LINE__, E6_MS2_PIN) +#endif +#if PIN_EXISTS(E6_MS3) + REPORT_NAME_DIGITAL(__LINE__, E6_MS3_PIN) +#endif +#if PIN_EXISTS(E6_STEP) + REPORT_NAME_DIGITAL(__LINE__, E6_STEP_PIN) +#endif +#if PIN_EXISTS(E7_AUTO_FAN) + REPORT_NAME_DIGITAL(__LINE__, E7_AUTO_FAN_PIN) +#endif +#if PIN_EXISTS(E7_CS) + REPORT_NAME_DIGITAL(__LINE__, E7_CS_PIN) +#endif +#if PIN_EXISTS(E7_DIR) + REPORT_NAME_DIGITAL(__LINE__, E7_DIR_PIN) +#endif +#if PIN_EXISTS(E7_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, E7_ENABLE_PIN) +#endif +#if PIN_EXISTS(E7_MS1) + REPORT_NAME_DIGITAL(__LINE__, E7_MS1_PIN) +#endif +#if PIN_EXISTS(E7_MS2) + REPORT_NAME_DIGITAL(__LINE__, E7_MS2_PIN) +#endif +#if PIN_EXISTS(E7_MS3) + REPORT_NAME_DIGITAL(__LINE__, E7_MS3_PIN) +#endif +#if PIN_EXISTS(E7_STEP) + REPORT_NAME_DIGITAL(__LINE__, E7_STEP_PIN) +#endif +#if defined(ENET_CRS) && ENET_CRS >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_CRS) +#endif +#if defined(ENET_MDIO) && ENET_MDIO >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_MDIO) +#endif +#if defined(ENET_MOC) && ENET_MOC >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_MOC) +#endif +#if defined(ENET_RX_ER) && ENET_RX_ER >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_RX_ER) +#endif +#if defined(ENET_RXD0) && ENET_RXD0 >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_RXD0) +#endif +#if defined(ENET_RXD1) && ENET_RXD1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_RXD1) +#endif +#if defined(ENET_TX_EN) && ENET_TX_EN >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_TX_EN) +#endif +#if defined(ENET_TXD0) && ENET_TXD0 >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_TXD0) +#endif +#if defined(ENET_TXD1) && ENET_TXD1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, ENET_TXD1) +#endif +#if PIN_EXISTS(EXP_VOLTAGE_LEVEL) + REPORT_NAME_DIGITAL(__LINE__, EXP_VOLTAGE_LEVEL_PIN) +#endif + +#if defined(EXT_AUX_A0_IO) && EXT_AUX_A0_IO >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_A0_IO) +#endif +#if defined(EXT_AUX_A1_IO) && EXT_AUX_A1_IO >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_A1_IO) +#endif +#if defined(EXT_AUX_A2_IO) && EXT_AUX_A2_IO >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_A2_IO) +#endif +#if defined(EXT_AUX_A3_IO) && EXT_AUX_A3_IO >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_A3_IO) +#endif +#if defined(EXT_AUX_A4_IO) && EXT_AUX_A4_IO >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_A4_IO) +#endif +#if defined(EXT_AUX_PWM_D24) && EXT_AUX_PWM_D24 >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_PWM_D24) +#endif +#if defined(EXT_AUX_RX1_D2) && EXT_AUX_RX1_D2 >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_RX1_D2) +#endif +#if defined(EXT_AUX_SCL_D0) && EXT_AUX_SCL_D0 >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_SCL_D0) +#endif +#if defined(EXT_AUX_SDA_D1) && EXT_AUX_SDA_D1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_SDA_D1) +#endif +#if defined(EXT_AUX_TX1_D3) && EXT_AUX_TX1_D3 >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXT_AUX_TX1_D3) +#endif +#if defined(EXTRUDER_0_AUTO_FAN) && EXTRUDER_0_AUTO_FAN >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXTRUDER_0_AUTO_FAN) +#endif +#if defined(EXTRUDER_1_AUTO_FAN) && EXTRUDER_1_AUTO_FAN >= 0 + REPORT_NAME_DIGITAL(__LINE__, EXTRUDER_1_AUTO_FAN) +#endif +#if PIN_EXISTS(FAN) + REPORT_NAME_DIGITAL(__LINE__, FAN_PIN) +#endif +#if PIN_EXISTS(FAN1) + REPORT_NAME_DIGITAL(__LINE__, FAN1_PIN) +#endif +#if PIN_EXISTS(FAN2) + REPORT_NAME_DIGITAL(__LINE__, FAN2_PIN) +#endif +#if PIN_EXISTS(FAN3) + REPORT_NAME_DIGITAL(__LINE__, FAN3_PIN) +#endif +#if PIN_EXISTS(FAN4) + REPORT_NAME_DIGITAL(__LINE__, FAN4_PIN) +#endif +#if PIN_EXISTS(FAN5) + REPORT_NAME_DIGITAL(__LINE__, FAN5_PIN) +#endif +#if PIN_EXISTS(FAN6) + REPORT_NAME_DIGITAL(__LINE__, FAN6_PIN) +#endif +#if PIN_EXISTS(FAN7) + REPORT_NAME_DIGITAL(__LINE__, FAN7_PIN) +#endif +#if PIN_EXISTS(FAN_MUX0) + REPORT_NAME_DIGITAL(__LINE__, FAN_MUX0_PIN) +#endif +#if PIN_EXISTS(FAN_MUX1) + REPORT_NAME_DIGITAL(__LINE__, FAN_MUX1_PIN) +#endif +#if PIN_EXISTS(FAN_MUX2) + REPORT_NAME_DIGITAL(__LINE__, FAN_MUX2_PIN) +#endif +#if PIN_EXISTS(POWER_LOSS) + REPORT_NAME_DIGITAL(__LINE__, POWER_LOSS_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT2) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT2_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT3) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT3_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT4) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT4_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT5) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT5_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT6) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT6_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT7) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT7_PIN) +#endif +#if PIN_EXISTS(FIL_RUNOUT8) + REPORT_NAME_DIGITAL(__LINE__, FIL_RUNOUT8_PIN) +#endif +#if PIN_EXISTS(HEATER_0) + REPORT_NAME_DIGITAL(__LINE__, HEATER_0_PIN) +#endif +#if PIN_EXISTS(HEATER_1) + REPORT_NAME_DIGITAL(__LINE__, HEATER_1_PIN) +#endif +#if PIN_EXISTS(HEATER_2) + REPORT_NAME_DIGITAL(__LINE__, HEATER_2_PIN) +#endif +#if PIN_EXISTS(HEATER_3) + REPORT_NAME_DIGITAL(__LINE__, HEATER_3_PIN) +#endif +#if PIN_EXISTS(HEATER_4) + REPORT_NAME_DIGITAL(__LINE__, HEATER_4_PIN) +#endif +#if PIN_EXISTS(HEATER_5) + REPORT_NAME_DIGITAL(__LINE__, HEATER_5_PIN) +#endif +#if PIN_EXISTS(HEATER_6) + REPORT_NAME_DIGITAL(__LINE__, HEATER_6_PIN) +#endif +#if PIN_EXISTS(HEATER_7) + REPORT_NAME_DIGITAL(__LINE__, HEATER_7_PIN) +#endif +#if PIN_EXISTS(HEATER_BED) + REPORT_NAME_DIGITAL(__LINE__, HEATER_BED_PIN) +#endif +#if PIN_EXISTS(HEATER_CHAMBER) + REPORT_NAME_DIGITAL(__LINE__, HEATER_CHAMBER_PIN) +#endif +#if PIN_EXISTS(HOME) + REPORT_NAME_DIGITAL(__LINE__, HOME_PIN) +#endif +#if PIN_EXISTS(I2C_SCL) + REPORT_NAME_DIGITAL(__LINE__, I2C_SCL_PIN) +#endif +#if PIN_EXISTS(I2C_SDA) + REPORT_NAME_DIGITAL(__LINE__, I2C_SDA_PIN) +#endif +#if PIN_EXISTS(KILL) + REPORT_NAME_DIGITAL(__LINE__, KILL_PIN) +#endif +#if PIN_EXISTS(LCD_BACKLIGHT) + REPORT_NAME_DIGITAL(__LINE__, LCD_BACKLIGHT_PIN) +#endif +#if defined(LCD_PINS_D4) && LCD_PINS_D4 >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_PINS_D4) +#endif +#if defined(LCD_PINS_D5) && LCD_PINS_D5 >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_PINS_D5) +#endif +#if defined(LCD_PINS_D6) && LCD_PINS_D6 >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_PINS_D6) +#endif +#if defined(LCD_PINS_D7) && LCD_PINS_D7 >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_PINS_D7) +#endif +#if defined(LCD_PINS_ENABLE) && LCD_PINS_ENABLE >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_PINS_ENABLE) +#endif +#if defined(LCD_PINS_RS) && LCD_PINS_RS >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_PINS_RS) +#endif +#if defined(LCD_SDSS) && LCD_SDSS >= 0 + REPORT_NAME_DIGITAL(__LINE__, LCD_SDSS) +#endif +#if PIN_EXISTS(LED_GREEN) + REPORT_NAME_DIGITAL(__LINE__, LED_GREEN_PIN) +#endif +#if PIN_EXISTS(LED) + REPORT_NAME_DIGITAL(__LINE__, LED_PIN) +#endif +#if PIN_EXISTS(LED_RED) + REPORT_NAME_DIGITAL(__LINE__, LED_RED_PIN) +#endif +#if PIN_EXISTS(MAX6675_DO) + REPORT_NAME_DIGITAL(__LINE__, MAX6675_DO_PIN) +#endif +#if PIN_EXISTS(MAX6675_SCK) + REPORT_NAME_DIGITAL(__LINE__, MAX6675_SCK_PIN) +#endif +#if PIN_EXISTS(MAX6675_SS) + REPORT_NAME_DIGITAL(__LINE__, MAX6675_SS_PIN) +#endif +#if PIN_EXISTS(MAX6675_SS2) + REPORT_NAME_DIGITAL(__LINE__, MAX6675_SS2_PIN) +#endif +#if PIN_EXISTS(MAX7219_CLK) + REPORT_NAME_DIGITAL(__LINE__, MAX7219_CLK_PIN) +#endif +#if PIN_EXISTS(MAX7219_DIN) + REPORT_NAME_DIGITAL(__LINE__, MAX7219_DIN_PIN) +#endif +#if PIN_EXISTS(MAX7219_LOAD) + REPORT_NAME_DIGITAL(__LINE__, MAX7219_LOAD_PIN) +#endif + +// #if defined(MISO) && MISO >= 0 +// REPORT_NAME_DIGITAL(__LINE__, MISO) +// #endif +#if PIN_EXISTS(MISO) + REPORT_NAME_DIGITAL(__LINE__, MISO_PIN) +#endif +#if PIN_EXISTS(MOSFET_A) + REPORT_NAME_DIGITAL(__LINE__, MOSFET_A_PIN) +#endif +#if PIN_EXISTS(MOSFET_B) + REPORT_NAME_DIGITAL(__LINE__, MOSFET_B_PIN) +#endif +#if PIN_EXISTS(MOSFET_C) + REPORT_NAME_DIGITAL(__LINE__, MOSFET_C_PIN) +#endif +#if PIN_EXISTS(MOSFET_D) + REPORT_NAME_DIGITAL(__LINE__, MOSFET_D_PIN) +#endif +// #if defined(MOSI) && MOSI >= 0 +// REPORT_NAME_DIGITAL(__LINE__, MOSI) +// #endif +#if PIN_EXISTS(MOSI) + REPORT_NAME_DIGITAL(__LINE__, MOSI_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_E_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_X) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_X_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Y_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_XY_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_X) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_X_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Y_PIN) +#endif +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Z_PIN) +#endif +#if PIN_EXISTS(MOTOR_FAULT) + REPORT_NAME_DIGITAL(__LINE__, MOTOR_FAULT_PIN) +#endif +#if PIN_EXISTS(PHOTOGRAPH) + REPORT_NAME_DIGITAL(__LINE__, PHOTOGRAPH_PIN) +#endif +#if PIN_EXISTS(CHDK) + REPORT_NAME_DIGITAL(__LINE__, CHDK_PIN) +#endif +#if PIN_EXISTS(PS_ON) + REPORT_NAME_DIGITAL(__LINE__, PS_ON_PIN) +#endif +#if PIN_EXISTS(PWM_1) + REPORT_NAME_DIGITAL(__LINE__, PWM_1_PIN) +#endif +#if PIN_EXISTS(PWM_2) + REPORT_NAME_DIGITAL(__LINE__, PWM_2_PIN) +#endif +#if defined(REF_CLK) && REF_CLK >= 0 + REPORT_NAME_DIGITAL(__LINE__, REF_CLK) +#endif +#if PIN_EXISTS(RAMPS_D10) + REPORT_NAME_DIGITAL(__LINE__, RAMPS_D10_PIN) +#endif +#if PIN_EXISTS(RAMPS_D8) + REPORT_NAME_DIGITAL(__LINE__, RAMPS_D8_PIN) +#endif +#if PIN_EXISTS(RAMPS_D9) + REPORT_NAME_DIGITAL(__LINE__, RAMPS_D9_PIN) +#endif +#if PIN_EXISTS(NEOPIXEL) + REPORT_NAME_DIGITAL(__LINE__, NEOPIXEL_PIN) +#endif +#if PIN_EXISTS(NEOPIXEL2) + REPORT_NAME_DIGITAL(__LINE__, NEOPIXEL2_PIN) +#endif +#if PIN_EXISTS(RGB_LED_R) + REPORT_NAME_DIGITAL(__LINE__, RGB_LED_R_PIN) +#endif +#if PIN_EXISTS(RGB_LED_G) + REPORT_NAME_DIGITAL(__LINE__, RGB_LED_G_PIN) +#endif +#if PIN_EXISTS(RGB_LED_B) + REPORT_NAME_DIGITAL(__LINE__, RGB_LED_B_PIN) +#endif +#if PIN_EXISTS(RGB_LED_W) + REPORT_NAME_DIGITAL(__LINE__, RGB_LED_W_PIN) +#endif +#if PIN_EXISTS(RX_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, RX_ENABLE_PIN) +#endif +#if PIN_EXISTS(SAFETY_TRIGGERED) + REPORT_NAME_DIGITAL(__LINE__, SAFETY_TRIGGERED_PIN) +#endif +// #if defined(SCK) && SCK >= 0 +// REPORT_NAME_DIGITAL(__LINE__, SCK) +// #endif +#if PIN_EXISTS(SCK) + REPORT_NAME_DIGITAL(__LINE__, SCK_PIN) +#endif +// #if defined(SCL) && SCL >= 0 +// REPORT_NAME_DIGITAL(__LINE__, SCL) +// #endif +#if PIN_EXISTS(SD_DETECT) + REPORT_NAME_DIGITAL(__LINE__, SD_DETECT_PIN) +#endif +// #if defined(SDA) && SDA >= 0 +// REPORT_NAME_DIGITAL(__LINE__, SDA) +// #endif +#if PIN_EXISTS(SDPOWER) + REPORT_NAME_DIGITAL(__LINE__, SDPOWER_PIN) +#endif +#if defined(SDSS) && SDSS >= 0 + REPORT_NAME_DIGITAL(__LINE__, SDSS) +#endif +#if defined(SERVO0) && SERVO0 >= 0 + REPORT_NAME_DIGITAL(__LINE__, SERVO0) +#endif +#if PIN_EXISTS(SERVO0) + REPORT_NAME_DIGITAL(__LINE__, SERVO0_PIN) +#endif +#if PIN_EXISTS(SERVO1) + REPORT_NAME_DIGITAL(__LINE__, SERVO1_PIN) +#endif +#if PIN_EXISTS(SERVO2) + REPORT_NAME_DIGITAL(__LINE__, SERVO2_PIN) +#endif +#if PIN_EXISTS(SERVO3) + REPORT_NAME_DIGITAL(__LINE__, SERVO3_PIN) +#endif +#if defined(SHIFT_CLK) && SHIFT_CLK >= 0 + REPORT_NAME_DIGITAL(__LINE__, SHIFT_CLK) +#endif +#if defined(SHIFT_EN) && SHIFT_EN >= 0 + REPORT_NAME_DIGITAL(__LINE__, SHIFT_EN) +#endif +#if defined(SHIFT_LD) && SHIFT_LD >= 0 + REPORT_NAME_DIGITAL(__LINE__, SHIFT_LD) +#endif +#if defined(SHIFT_OUT) && SHIFT_OUT >= 0 + REPORT_NAME_DIGITAL(__LINE__, SHIFT_OUT) +#endif +#if PIN_EXISTS(SLED) + REPORT_NAME_DIGITAL(__LINE__, SLED_PIN) +#endif +#if PIN_EXISTS(SLEEP_WAKE) + REPORT_NAME_DIGITAL(__LINE__, SLEEP_WAKE_PIN) +#endif +#if PIN_EXISTS(SOL0) + REPORT_NAME_DIGITAL(__LINE__, SOL0_PIN) +#endif +#if PIN_EXISTS(SOL1) + REPORT_NAME_DIGITAL(__LINE__, SOL1_PIN) +#endif +#if PIN_EXISTS(SOL2) + REPORT_NAME_DIGITAL(__LINE__, SOL2_PIN) +#endif +#if PIN_EXISTS(SOL3) + REPORT_NAME_DIGITAL(__LINE__, SOL3_PIN) +#endif +#if PIN_EXISTS(SOL4) + REPORT_NAME_DIGITAL(__LINE__, SOL4_PIN) +#endif +#if PIN_EXISTS(SOL5) + REPORT_NAME_DIGITAL(__LINE__, SOL5_PIN) +#endif +#if PIN_EXISTS(SOL6) + REPORT_NAME_DIGITAL(__LINE__, SOL6_PIN) +#endif +#if PIN_EXISTS(SOL7) + REPORT_NAME_DIGITAL(__LINE__, SOL7_PIN) +#endif +#if defined(SPARE_IO) && SPARE_IO >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPARE_IO) +#endif +#if defined(SPI_EEPROM1_CS) && SPI_EEPROM1_CS >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPI_EEPROM1_CS) +#endif +#if defined(SPI_EEPROM2_CS) && SPI_EEPROM2_CS >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPI_EEPROM2_CS) +#endif +#if defined(SPI_FLASH_CS) && SPI_FLASH_CS >= 0 + REPORT_NAME_DIGITAL(__LINE__, SPI_FLASH_CS) +#endif +#if PIN_EXISTS(SPINDLE_DIR) + REPORT_NAME_DIGITAL(__LINE__, SPINDLE_DIR_PIN) +#endif +#if PIN_EXISTS(SPINDLE_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, SPINDLE_ENABLE_PIN) +#endif +#if PIN_EXISTS(SPINDLE_LASER_ENA) + REPORT_NAME_DIGITAL(__LINE__, SPINDLE_LASER_ENA_PIN) +#endif +#if PIN_EXISTS(SPINDLE_LASER_PWM) + REPORT_NAME_DIGITAL(__LINE__, SPINDLE_LASER_PWM_PIN) +#endif +#if PIN_EXISTS(SR_CLK) + REPORT_NAME_DIGITAL(__LINE__, SR_CLK_PIN) +#endif +#if PIN_EXISTS(SR_DATA) + REPORT_NAME_DIGITAL(__LINE__, SR_DATA_PIN) +#endif +#if PIN_EXISTS(SR_STROBE) + REPORT_NAME_DIGITAL(__LINE__, SR_STROBE_PIN) +#endif +#if PIN_EXISTS(SS) + REPORT_NAME_DIGITAL(__LINE__, SS_PIN) +#endif +#if PIN_EXISTS(STAT_LED_BLUE) + REPORT_NAME_DIGITAL(__LINE__, STAT_LED_BLUE_PIN) +#endif +#if defined(STAT_LED_RED_LED) && STAT_LED_RED_LED >= 0 + REPORT_NAME_DIGITAL(__LINE__, STAT_LED_RED_LED) +#endif +#if PIN_EXISTS(STAT_LED_RED) + REPORT_NAME_DIGITAL(__LINE__, STAT_LED_RED_PIN) +#endif +#if PIN_EXISTS(STEPPER_RESET) + REPORT_NAME_DIGITAL(__LINE__, STEPPER_RESET_PIN) +#endif +#if PIN_EXISTS(SUICIDE) + REPORT_NAME_DIGITAL(__LINE__, SUICIDE_PIN) +#endif +#if PIN_EXISTS(THERMO_CS1) + REPORT_NAME_DIGITAL(__LINE__, THERMO_CS1_PIN) +#endif +#if PIN_EXISTS(THERMO_CS2) + REPORT_NAME_DIGITAL(__LINE__, THERMO_CS2_PIN) +#endif +#if PIN_EXISTS(THERMO_DO) + REPORT_NAME_DIGITAL(__LINE__, THERMO_DO_PIN) +#endif +#if PIN_EXISTS(THERMO_SCK) + REPORT_NAME_DIGITAL(__LINE__, THERMO_SCK_PIN) +#endif +#if PIN_EXISTS(TLC_BLANK) + REPORT_NAME_DIGITAL(__LINE__, TLC_BLANK_PIN) +#endif +#if PIN_EXISTS(TLC_CLOCK) + REPORT_NAME_DIGITAL(__LINE__, TLC_CLOCK_PIN) +#endif +#if PIN_EXISTS(TLC_DATA) + REPORT_NAME_DIGITAL(__LINE__, TLC_DATA_PIN) +#endif +#if PIN_EXISTS(TLC_XLAT) + REPORT_NAME_DIGITAL(__LINE__, TLC_XLAT_PIN) +#endif +#if PIN_EXISTS(TOOL_0) + REPORT_NAME_DIGITAL(__LINE__, TOOL_0_PIN) +#endif +#if PIN_EXISTS(TOOL_0_PWM) + REPORT_NAME_DIGITAL(__LINE__, TOOL_0_PWM_PIN) +#endif +#if PIN_EXISTS(TOOL_1) + REPORT_NAME_DIGITAL(__LINE__, TOOL_1_PIN) +#endif +#if PIN_EXISTS(TOOL_1_PWM) + REPORT_NAME_DIGITAL(__LINE__, TOOL_1_PWM_PIN) +#endif +#if PIN_EXISTS(TOOL_2) + REPORT_NAME_DIGITAL(__LINE__, TOOL_2_PIN) +#endif +#if PIN_EXISTS(TOOL_2_PWM) + REPORT_NAME_DIGITAL(__LINE__, TOOL_2_PWM_PIN) +#endif +#if PIN_EXISTS(TOOL_3) + REPORT_NAME_DIGITAL(__LINE__, TOOL_3_PIN) +#endif +#if PIN_EXISTS(TOOL_3_PWM) + REPORT_NAME_DIGITAL(__LINE__, TOOL_3_PWM_PIN) +#endif +#if PIN_EXISTS(TOOL_PWM) + REPORT_NAME_DIGITAL(__LINE__, TOOL_PWM_PIN) +#endif +#if PIN_EXISTS(TX_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, TX_ENABLE_PIN) +#endif +#if defined(UI1) && UI1 >= 0 + REPORT_NAME_DIGITAL(__LINE__, UI1) +#endif +#if defined(UI2) && UI2 >= 0 + REPORT_NAME_DIGITAL(__LINE__, UI2) +#endif +#if defined(UNUSED_PWM) && UNUSED_PWM >= 0 + REPORT_NAME_DIGITAL(__LINE__, UNUSED_PWM) +#endif +#if PIN_EXISTS(X_ATT) + REPORT_NAME_DIGITAL(__LINE__, X_ATT_PIN) +#endif +#if PIN_EXISTS(X_CS) + REPORT_NAME_DIGITAL(__LINE__, X_CS_PIN) +#endif +#if PIN_EXISTS(X_DIR) + REPORT_NAME_DIGITAL(__LINE__, X_DIR_PIN) +#endif +#if PIN_EXISTS(X_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, X_ENABLE_PIN) +#endif +#if PIN_EXISTS(X_MAX) + REPORT_NAME_DIGITAL(__LINE__, X_MAX_PIN) +#endif +#if PIN_EXISTS(X_MIN) + REPORT_NAME_DIGITAL(__LINE__, X_MIN_PIN) +#endif +#if PIN_EXISTS(X_DIAG) + REPORT_NAME_DIGITAL(__LINE__, X_DIAG_PIN) +#endif +#if PIN_EXISTS(X_MS1) + REPORT_NAME_DIGITAL(__LINE__, X_MS1_PIN) +#endif +#if PIN_EXISTS(X_MS2) + REPORT_NAME_DIGITAL(__LINE__, X_MS2_PIN) +#endif +#if PIN_EXISTS(X_MS3) + REPORT_NAME_DIGITAL(__LINE__, X_MS3_PIN) +#endif +#if PIN_EXISTS(X_STEP) + REPORT_NAME_DIGITAL(__LINE__, X_STEP_PIN) +#endif +#if PIN_EXISTS(X_STOP) + REPORT_NAME_DIGITAL(__LINE__, X_STOP_PIN) +#endif +#if PIN_EXISTS(X2_CS) + REPORT_NAME_DIGITAL(__LINE__, X2_CS_PIN) +#endif +#if PIN_EXISTS(X2_DIR) + REPORT_NAME_DIGITAL(__LINE__, X2_DIR_PIN) +#endif +#if PIN_EXISTS(X2_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, X2_ENABLE_PIN) +#endif +#if PIN_EXISTS(X2_MAX) + REPORT_NAME_DIGITAL(__LINE__, X2_MAX_PIN) +#endif +#if PIN_EXISTS(X2_MIN) + REPORT_NAME_DIGITAL(__LINE__, X2_MIN_PIN) +#endif +#if PIN_EXISTS(X2_MS1) + REPORT_NAME_DIGITAL(__LINE__, X2_MS1_PIN) +#endif +#if PIN_EXISTS(X2_MS2) + REPORT_NAME_DIGITAL(__LINE__, X2_MS2_PIN) +#endif +#if PIN_EXISTS(X2_MS3) + REPORT_NAME_DIGITAL(__LINE__, X2_MS3_PIN) +#endif +#if PIN_EXISTS(X2_STEP) + REPORT_NAME_DIGITAL(__LINE__, X2_STEP_PIN) +#endif +#if PIN_EXISTS(Y_ATT) + REPORT_NAME_DIGITAL(__LINE__, Y_ATT_PIN) +#endif +#if PIN_EXISTS(Y_CS) + REPORT_NAME_DIGITAL(__LINE__, Y_CS_PIN) +#endif +#if PIN_EXISTS(Y_DIR) + REPORT_NAME_DIGITAL(__LINE__, Y_DIR_PIN) +#endif +#if PIN_EXISTS(Y_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Y_ENABLE_PIN) +#endif +#if PIN_EXISTS(Y_MAX) + REPORT_NAME_DIGITAL(__LINE__, Y_MAX_PIN) +#endif +#if PIN_EXISTS(Y_MIN) + REPORT_NAME_DIGITAL(__LINE__, Y_MIN_PIN) +#endif +#if PIN_EXISTS(Y_DIAG) + REPORT_NAME_DIGITAL(__LINE__, Y_DIAG_PIN) +#endif +#if PIN_EXISTS(Y_MS1) + REPORT_NAME_DIGITAL(__LINE__, Y_MS1_PIN) +#endif +#if PIN_EXISTS(Y_MS2) + REPORT_NAME_DIGITAL(__LINE__, Y_MS2_PIN) +#endif +#if PIN_EXISTS(Y_MS3) + REPORT_NAME_DIGITAL(__LINE__, Y_MS3_PIN) +#endif +#if PIN_EXISTS(Y_STEP) + REPORT_NAME_DIGITAL(__LINE__, Y_STEP_PIN) +#endif +#if PIN_EXISTS(Y_STOP) + REPORT_NAME_DIGITAL(__LINE__, Y_STOP_PIN) +#endif +#if PIN_EXISTS(Y2_CS) + REPORT_NAME_DIGITAL(__LINE__, Y2_CS_PIN) +#endif +#if PIN_EXISTS(Y2_DIR) + REPORT_NAME_DIGITAL(__LINE__, Y2_DIR_PIN) +#endif +#if PIN_EXISTS(Y2_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Y2_ENABLE_PIN) +#endif +#if PIN_EXISTS(Y2_MAX) + REPORT_NAME_DIGITAL(__LINE__, Y2_MAX_PIN) +#endif +#if PIN_EXISTS(Y2_MIN) + REPORT_NAME_DIGITAL(__LINE__, Y2_MIN_PIN) +#endif +#if PIN_EXISTS(Y2_MS1) + REPORT_NAME_DIGITAL(__LINE__, Y2_MS1_PIN) +#endif +#if PIN_EXISTS(Y2_MS2) + REPORT_NAME_DIGITAL(__LINE__, Y2_MS2_PIN) +#endif +#if PIN_EXISTS(Y2_MS3) + REPORT_NAME_DIGITAL(__LINE__, Y2_MS3_PIN) +#endif +#if PIN_EXISTS(Y2_STEP) + REPORT_NAME_DIGITAL(__LINE__, Y2_STEP_PIN) +#endif +#if PIN_EXISTS(Z_ATT) + REPORT_NAME_DIGITAL(__LINE__, Z_ATT_PIN) +#endif +#if PIN_EXISTS(Z_CS) + REPORT_NAME_DIGITAL(__LINE__, Z_CS_PIN) +#endif +#if PIN_EXISTS(Z_DIR) + REPORT_NAME_DIGITAL(__LINE__, Z_DIR_PIN) +#endif +#if PIN_EXISTS(Z_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Z_ENABLE_PIN) +#endif +#if PIN_EXISTS(Z_MAX) + REPORT_NAME_DIGITAL(__LINE__, Z_MAX_PIN) +#endif +#if PIN_EXISTS(Z_MIN) + REPORT_NAME_DIGITAL(__LINE__, Z_MIN_PIN) +#endif +#if PIN_EXISTS(Z_DIAG) + REPORT_NAME_DIGITAL(__LINE__, Z_DIAG_PIN) +#endif +#if PIN_EXISTS(Z_MS1) + REPORT_NAME_DIGITAL(__LINE__, Z_MS1_PIN) +#endif +#if PIN_EXISTS(Z_MS2) + REPORT_NAME_DIGITAL(__LINE__, Z_MS2_PIN) +#endif +#if PIN_EXISTS(Z_MS3) + REPORT_NAME_DIGITAL(__LINE__, Z_MS3_PIN) +#endif +#if PIN_EXISTS(Z_STEP) + REPORT_NAME_DIGITAL(__LINE__, Z_STEP_PIN) +#endif +#if PIN_EXISTS(Z_STOP) + REPORT_NAME_DIGITAL(__LINE__, Z_STOP_PIN) +#endif +#if PIN_EXISTS(Z2_CS) + REPORT_NAME_DIGITAL(__LINE__, Z2_CS_PIN) +#endif +#if PIN_EXISTS(Z2_DIR) + REPORT_NAME_DIGITAL(__LINE__, Z2_DIR_PIN) +#endif +#if PIN_EXISTS(Z2_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Z2_ENABLE_PIN) +#endif +#if PIN_EXISTS(Z2_MAX) + REPORT_NAME_DIGITAL(__LINE__, Z2_MAX_PIN) +#endif +#if PIN_EXISTS(Z2_MIN) + REPORT_NAME_DIGITAL(__LINE__, Z2_MIN_PIN) +#endif +#if PIN_EXISTS(Z2_MS1) + REPORT_NAME_DIGITAL(__LINE__, Z2_MS1_PIN) +#endif +#if PIN_EXISTS(Z2_MS2) + REPORT_NAME_DIGITAL(__LINE__, Z2_MS2_PIN) +#endif +#if PIN_EXISTS(Z2_MS3) + REPORT_NAME_DIGITAL(__LINE__, Z2_MS3_PIN) +#endif +#if PIN_EXISTS(Z2_STEP) + REPORT_NAME_DIGITAL(__LINE__, Z2_STEP_PIN) +#endif +#if PIN_EXISTS(Z3_CS) + REPORT_NAME_DIGITAL(__LINE__, Z3_CS_PIN) +#endif +#if PIN_EXISTS(Z3_DIR) + REPORT_NAME_DIGITAL(__LINE__, Z3_DIR_PIN) +#endif +#if PIN_EXISTS(Z3_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Z3_ENABLE_PIN) +#endif +#if PIN_EXISTS(Z3_MAX) + REPORT_NAME_DIGITAL(__LINE__, Z3_MAX_PIN) +#endif +#if PIN_EXISTS(Z3_MIN) + REPORT_NAME_DIGITAL(__LINE__, Z3_MIN_PIN) +#endif +#if PIN_EXISTS(Z3_MS1) + REPORT_NAME_DIGITAL(__LINE__, Z3_MS1_PIN) +#endif +#if PIN_EXISTS(Z3_MS2) + REPORT_NAME_DIGITAL(__LINE__, Z3_MS2_PIN) +#endif +#if PIN_EXISTS(Z3_MS3) + REPORT_NAME_DIGITAL(__LINE__, Z3_MS3_PIN) +#endif +#if PIN_EXISTS(Z3_STEP) + REPORT_NAME_DIGITAL(__LINE__, Z3_STEP_PIN) +#endif +#if PIN_EXISTS(Z4_CS) + REPORT_NAME_DIGITAL(__LINE__, Z4_CS_PIN) +#endif +#if PIN_EXISTS(Z4_DIR) + REPORT_NAME_DIGITAL(__LINE__, Z4_DIR_PIN) +#endif +#if PIN_EXISTS(Z4_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, Z4_ENABLE_PIN) +#endif +#if PIN_EXISTS(Z4_MAX) + REPORT_NAME_DIGITAL(__LINE__, Z4_MAX_PIN) +#endif +#if PIN_EXISTS(Z4_MIN) + REPORT_NAME_DIGITAL(__LINE__, Z4_MIN_PIN) +#endif +#if PIN_EXISTS(Z4_MS1) + REPORT_NAME_DIGITAL(__LINE__, Z4_MS1_PIN) +#endif +#if PIN_EXISTS(Z4_MS2) + REPORT_NAME_DIGITAL(__LINE__, Z4_MS2_PIN) +#endif +#if PIN_EXISTS(Z4_MS3) + REPORT_NAME_DIGITAL(__LINE__, Z4_MS3_PIN) +#endif +#if PIN_EXISTS(Z4_STEP) + REPORT_NAME_DIGITAL(__LINE__, Z4_STEP_PIN) +#endif +#if PIN_EXISTS(Z_MIN_PROBE) + REPORT_NAME_DIGITAL(__LINE__, Z_MIN_PROBE_PIN) +#endif +#if PIN_EXISTS(ZRIB_V20_D6) + REPORT_NAME_DIGITAL(__LINE__, ZRIB_V20_D6_PIN) +#endif +#if PIN_EXISTS(ZRIB_V20_D9) + REPORT_NAME_DIGITAL(__LINE__, ZRIB_V20_D9_PIN) +#endif +#if PIN_EXISTS(X_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, X_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(X_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, X_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(X2_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, X2_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(X2_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, X2_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(Y_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Y_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Y_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Y_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(Y2_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Y2_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Y2_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Y2_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(Z_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Z_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Z_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Z_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(Z2_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Z2_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Z2_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Z2_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(Z3_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Z3_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Z3_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Z3_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(Z4_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, Z4_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(Z4_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, Z4_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E0_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E0_DIAG_PIN) +#endif +#if PIN_EXISTS(E0_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E0_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E0_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E0_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E1_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E1_DIAG_PIN) +#endif +#if PIN_EXISTS(E1_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E1_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E1_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E1_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E2_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E2_DIAG_PIN) +#endif +#if PIN_EXISTS(E2_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E2_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E2_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E2_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E3_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E3_DIAG_PIN) +#endif +#if PIN_EXISTS(E3_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E3_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E3_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E3_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E4_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E4_DIAG_PIN) +#endif +#if PIN_EXISTS(E4_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E4_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E5_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E5_DIAG_PIN) +#endif +#if PIN_EXISTS(E5_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E5_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E6_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E6_DIAG_PIN) +#endif +#if PIN_EXISTS(E6_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E6_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E6_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E6_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(E7_DIAG) + REPORT_NAME_DIGITAL(__LINE__, E7_DIAG_PIN) +#endif +#if PIN_EXISTS(E7_SERIAL_TX) + REPORT_NAME_DIGITAL(__LINE__, E7_SERIAL_TX_PIN) +#endif +#if PIN_EXISTS(E7_SERIAL_RX) + REPORT_NAME_DIGITAL(__LINE__, E7_SERIAL_RX_PIN) +#endif +#if PIN_EXISTS(L6470_CHAIN_SCK) + REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_SCK_PIN) +#endif +#if PIN_EXISTS(L6470_CHAIN_MISO) + REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_MISO_PIN) +#endif +#if PIN_EXISTS(L6470_CHAIN_MOSI) + REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_MOSI_PIN) +#endif +#if PIN_EXISTS(L6470_CHAIN_SS) + REPORT_NAME_DIGITAL(__LINE__, L6470_CHAIN_SS_PIN) +#endif +#if PIN_EXISTS(L6470_RESET_CHAIN) + REPORT_NAME_DIGITAL(__LINE__, L6470_RESET_CHAIN_PIN) +#endif +#if PIN_EXISTS(FET_SAFETY) + REPORT_NAME_DIGITAL(__LINE__, FET_SAFETY_PIN) +#endif +#if PIN_EXISTS(TOUCH_MISO) + REPORT_NAME_DIGITAL(__LINE__, TOUCH_MISO_PIN) +#endif +#if PIN_EXISTS(TOUCH_MOSI) + REPORT_NAME_DIGITAL(__LINE__, TOUCH_MOSI_PIN) +#endif +#if PIN_EXISTS(TOUCH_SCK) + REPORT_NAME_DIGITAL(__LINE__, TOUCH_SCK_PIN) +#endif +#if PIN_EXISTS(TOUCH_CS) + REPORT_NAME_DIGITAL(__LINE__, TOUCH_CS_PIN) +#endif +#if PIN_EXISTS(TOUCH_INT) + REPORT_NAME_DIGITAL(__LINE__, TOUCH_INT_PIN) +#endif +#if PIN_EXISTS(USB_CS) + REPORT_NAME_DIGITAL(__LINE__, USB_CS_PIN) +#endif +#if PIN_EXISTS(USB_INTR) + REPORT_NAME_DIGITAL(__LINE__, USB_INTR_PIN) +#endif +#if PIN_EXISTS(MMU2_RST) + REPORT_NAME_DIGITAL(__LINE__, MMU2_RST_PIN) +#endif +#if PIN_EXISTS(CALIBRATION) + REPORT_NAME_DIGITAL(__LINE__, CALIBRATION_PIN) +#endif +#if PIN_EXISTS(SMART_EFFECTOR_MOD) + REPORT_NAME_DIGITAL(__LINE__, SMART_EFFECTOR_MOD_PIN) +#endif +#if PIN_EXISTS(CLOSED_LOOP_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, CLOSED_LOOP_ENABLE_PIN) +#endif +#if PIN_EXISTS(CLOSED_LOOP_MOVE_COMPLETE) + REPORT_NAME_DIGITAL(__LINE__, CLOSED_LOOP_MOVE_COMPLETE_PIN) +#endif +#if PIN_EXISTS(ESP_WIFI_MODULE_RESET) + REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_RESET_PIN) +#endif +#if PIN_EXISTS(ESP_WIFI_MODULE_ENABLE) + REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_ENABLE_PIN) +#endif +#if PIN_EXISTS(ESP_WIFI_MODULE_GPIO0) + REPORT_NAME_DIGITAL(__LINE__, ESP_WIFI_MODULE_GPIO0_PIN) +#endif +#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 diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h new file mode 100644 index 00000000..2ea15c97 --- /dev/null +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -0,0 +1,191 @@ +/** + * 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 + +/** + * Einsy-Rambo pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Einsy Rambo" + +// +// TMC2130 Configuration_adv defaults for EinsyRambo +// +#if !AXIS_DRIVER_TYPE_X(TMC2130) || !AXIS_DRIVER_TYPE_Y(TMC2130) || !AXIS_DRIVER_TYPE_Z(TMC2130) || !AXIS_DRIVER_TYPE_E0(TMC2130) + #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRambo." +#endif + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 64 +#define Y_DIAG_PIN 69 +#define Z_DIAG_PIN 68 +#define E0_DIAG_PIN 65 + +// +// Limit Switches +// +// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. +// Otherwise use a physical endstop based configuration. +// +// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. +// + +#if DISABLED(SENSORLESS_HOMING) + + #define X_STOP_PIN 12 + #define Y_STOP_PIN 11 + #define Z_STOP_PIN 10 + +#else + + #define X_STOP_PIN X_DIAG_PIN + #define Y_STOP_PIN Y_DIAG_PIN + + #if ENABLED(BLTOUCH) + #define Z_STOP_PIN 11 // Y-MIN + #define SERVO0_PIN 10 // Z-MIN + #else + #define Z_STOP_PIN 10 + #endif + +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 10 +#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 62 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 49 +#define X_ENABLE_PIN 29 +#define X_CS_PIN 41 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 48 +#define Y_ENABLE_PIN 28 +#define Y_CS_PIN 39 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 +#define Z_CS_PIN 67 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 +#define E0_CS_PIN 66 + +// +// Temperature Sensors +// +#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 +// +#define HEATER_0_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif + +#ifndef FAN1_PIN + #define FAN1_PIN 6 +#endif + +// +// Misc. Functions +// +#define SDSS 77 +#define LED_PIN 13 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 9 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +// use P1 connector for spindle pins +#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 18 // Pullup! +#define SPINDLE_DIR_PIN 19 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL + + #define KILL_PIN 32 + + #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS 85 + #define LCD_PINS_ENABLE 71 + #define LCD_PINS_D4 70 + #define BTN_EN1 61 + #define BTN_EN2 59 + #else + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 61 + #define LCD_PINS_D4 59 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + #define BTN_EN1 14 + #define BTN_EN2 72 + #endif + + #define BTN_ENC 9 // AUX-2 + #define BEEPER_PIN 84 // AUX-4 + #define SD_DETECT_PIN 15 + + #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h new file mode 100644 index 00000000..4a1bf70b --- /dev/null +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -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 . + * + */ +#pragma once + +/** + * Einsy-Retro pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Einsy Retro" + +// +// TMC2130 Configuration_adv defaults for EinsyRetro +// +#if !AXIS_DRIVER_TYPE_X(TMC2130) || !AXIS_DRIVER_TYPE_Y(TMC2130) || !AXIS_DRIVER_TYPE_Z(TMC2130) || !AXIS_DRIVER_TYPE_E0(TMC2130) + #error "You must set ([XYZ]|E0)_DRIVER_TYPE to TMC2130 in Configuration.h for EinsyRetro." +#endif + +// TMC2130 Diag Pins +#define X_DIAG_PIN 64 +#define Y_DIAG_PIN 69 +#define Z_DIAG_PIN 68 +#define E0_DIAG_PIN 65 + +// +// Limit Switches +// +// Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. +// Otherwise use a physical endstop based configuration. +// +// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING. +// + +#if DISABLED(SENSORLESS_HOMING) + + #define X_MIN_PIN 12 // X- + #define Y_MIN_PIN 11 // Y- + #define Z_MIN_PIN 10 // Z- + #define X_MAX_PIN 81 // X+ + #define Y_MAX_PIN 57 // Y+ + +#else + + #if X_HOME_DIR < 0 + #define X_MIN_PIN X_DIAG_PIN + #define X_MAX_PIN 81 // X+ + #else + #define X_MIN_PIN 12 // X- + #define X_MAX_PIN X_DIAG_PIN + #endif + + #if Y_HOME_DIR < 0 + #define Y_MIN_PIN Y_DIAG_PIN + #define Y_MAX_PIN 57 // Y+ + #else + #define Y_MIN_PIN 11 // Y- + #define Y_MAX_PIN Y_DIAG_PIN + #endif + + #if ENABLED(BLTOUCH) + #define Z_MIN_PIN 11 // Y-MIN + #define SERVO0_PIN 10 // Z-MIN + #else + #define Z_MIN_PIN 10 + #endif + +#endif + +#define Z_MAX_PIN 7 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 10 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 49 +#define X_ENABLE_PIN 29 +#define X_CS_PIN 41 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 48 +#define Y_ENABLE_PIN 28 +#define Y_CS_PIN 39 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 +#define Z_CS_PIN 67 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 +#define E0_CS_PIN 66 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 9 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +// use P1 connector for spindle pins +#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 18 // Pullup! +#define SPINDLE_DIR_PIN 19 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 + +// +// LCD / Controller +// +#if ANY(HAS_WIRED_LCD, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) + + #define KILL_PIN 32 + + #if ANY(ULTIPANEL, TOUCH_UI_ULTIPANEL, TOUCH_UI_FTDI_EVE) + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS 85 + #define LCD_PINS_ENABLE 71 + #define LCD_PINS_D4 70 + #define BTN_EN1 18 + #define BTN_EN2 19 + #else + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 // On 0.6b, use 61 + #define LCD_PINS_D4 19 // On 0.6b, use 59 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + #define BTN_EN1 14 + #define BTN_EN2 72 + #endif + + #define BTN_ENC 9 // AUX-2 + #define BEEPER_PIN 84 // AUX-4 + + #define SD_DETECT_PIN 15 + + #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL || TOUCH_UI_FTDI_EVE + +#endif // HAS_WIRED_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 new file mode 100644 index 00000000..6314bc07 --- /dev/null +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -0,0 +1,192 @@ +/** + * 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 + +/** + * Mini-RAMBo pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'RAMBo' in 'Tools > Board' or the Mega2560 environment in PlatformIO." +#endif + +#if MB(MINIRAMBO_10A) + #define BOARD_INFO_NAME "Mini RAMBo 1.0a" +#else + #define BOARD_INFO_NAME "Mini RAMBo" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 12 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 24 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 23 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 23 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_ENABLE_PIN 28 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 + +#define MOTOR_CURRENT_PWM_XY_PIN 46 +#define MOTOR_CURRENT_PWM_Z_PIN 45 +#define MOTOR_CURRENT_PWM_E_PIN 44 +// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_1_PIN 7 +#if !MB(MINIRAMBO_10A) + #define HEATER_2_PIN 6 +#endif +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#if !MB(MINIRAMBO_10A) + #define CASE_LIGHT_PIN 9 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +// use P1 connector for spindle pins +#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 18 // Pullup! +#define SPINDLE_DIR_PIN 19 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#if !MB(MINIRAMBO_10A) + #define E_MUX2_PIN 78 // 84 in MK2 Firmware, with BEEPER as 78 +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL + + #if !MB(MINIRAMBO_10A) + #define KILL_PIN 32 + #endif + + #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL + + #if MB(MINIRAMBO_10A) + + #define BEEPER_PIN 78 + + #define BTN_EN1 80 + #define BTN_EN2 73 + #define BTN_ENC 21 + + #define LCD_PINS_RS 38 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 14 + #define LCD_PINS_D5 15 + #define LCD_PINS_D6 32 + #define LCD_PINS_D7 31 + + #define SD_DETECT_PIN 72 + + #else // !MINIRAMBO_10A + + // AUX-4 + #define BEEPER_PIN 84 + + // AUX-2 + #define BTN_EN1 14 + #define BTN_EN2 72 + #define BTN_ENC 9 + + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 + #define LCD_PINS_D4 19 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + + #define SD_DETECT_PIN 15 + + #endif // !MINIRAMBO_10A + + #endif // ULTIPANEL || TOUCH_UI_ULTIPANEL + +#endif // HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h new file mode 100644 index 00000000..735852b2 --- /dev/null +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -0,0 +1,252 @@ +/** + * 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 + +/** + * IMPORTANT NOTE: + * Rambo users should be sure to compile Marlin using either the RAMBo + * board type if using the Arduino IDE - available via the link below - or + * the 'rambo' environment if using platformio, by specifying '-e rambo' on + * the command line or by changing the value of the 'env_default' variable to + * 'rambo' in the supplied platformio.ini. + * + * If you don't compile using the proper board type, the RAMBo's extended + * pins will likely be unavailable and accessories/addons may not work. + * + * Instructions for installing the Arduino RAMBo board type for the + * Arduino IDE are available at: + * https://reprap.org/wiki/Rambo_firmware + */ + +/** + * Rambo pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Rambo" + +// +// Servos +// +#define SERVO0_PIN 22 // Motor header MX1 +#define SERVO1_PIN 23 // Motor header MX2 +#define SERVO2_PIN 24 // Motor header MX3 +#define SERVO3_PIN 5 // PWM header pin 5 + +// +// Limit Switches +// +#define X_MIN_PIN 12 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 23 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 30 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 30 +#endif + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 5 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_ENABLE_PIN 28 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 42 +#define E1_ENABLE_PIN 25 + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 +#define E1_MS1_PIN 63 +#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 +#ifndef DIGIPOT_MOTOR_CURRENT + #define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 6 +#define HEATER_BED_PIN 3 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 +#define FAN2_PIN 2 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 4 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 46 +#endif + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 3 // Analog Input +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 31 // Pullup! +#define SPINDLE_DIR_PIN 32 + +// +// SPI for Max6675 or Max31855 Thermocouple +// +#ifndef MAX6675_SS_PIN + #define MAX6675_SS_PIN 32 // SPINDLE_DIR_PIN / STAT_LED_BLUE_PIN +#endif + +// +// M7/M8/M9 - Coolant Control +// +#define COOLANT_MIST_PIN 22 +#define COOLANT_FLOOD_PIN 44 + +// +// Průša i3 MK2 Multiplexer Support +// +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 +#define E_MUX2_PIN 84 // 84 in MK2 Firmware + +// +// LCD / Controller +// +#if HAS_WIRED_LCD || TOUCH_UI_ULTIPANEL + + #define KILL_PIN 80 + + #if ENABLED(ULTIPANEL) || TOUCH_UI_ULTIPANEL + + #define LCD_PINS_RS 70 + #define LCD_PINS_ENABLE 71 + #define LCD_PINS_D4 72 + #define LCD_PINS_D5 73 + #define LCD_PINS_D6 74 + #define LCD_PINS_D7 75 + + #if ANY(VIKI2, miniVIKI) + #define BEEPER_PIN 44 + // NB: Panucatt's Viki 2.0 wiring diagram (v1.2) indicates that the + // beeper/buzzer is connected to pin 33; however, the pin used in the + // diagram is actually pin 44, so this is correct. + + #define DOGLCD_A0 70 + #define DOGLCD_CS 71 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 85 + #define BTN_EN2 84 + #define BTN_ENC 83 + + #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board + + #define STAT_LED_RED_PIN 22 + #define STAT_LED_BLUE_PIN 32 + + #else // !VIKI2 && !miniVIKI + + #define BEEPER_PIN 79 // AUX-4 + + // AUX-2 + #define BTN_EN1 76 + #define BTN_EN2 77 + #define BTN_ENC 78 + + #define SD_DETECT_PIN 81 + + #endif // !VIKI2 && !miniVIKI + + #else // !NEWPANEL - old style panel with shift register + + // No Beeper added + #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 LCD_PINS_RS 75 + #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 + + #endif // !NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h new file mode 100644 index 00000000..4af38e1d --- /dev/null +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -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 . + * + */ +#pragma once + +/************************************************ + * Rambo pin assignments MODIFIED FOR Scoovo X9H + ************************************************/ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Scoovo X9H" + +// +// Servos +// +#define SERVO0_PIN 22 // Motor header MX1 +#define SERVO1_PIN 23 // Motor header MX2 +#define SERVO2_PIN 24 // Motor header MX3 +#define SERVO3_PIN 5 // PWM header pin 5 + +// +// Limit Switches +// +#define X_MIN_PIN 12 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 11 +#define Y_MAX_PIN 23 +#define Z_MIN_PIN 10 +#define Z_MAX_PIN 30 + +// +// Z Probe (when not Z_MIN_IN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 30 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 +#define X_DIR_PIN 48 +#define X_ENABLE_PIN 29 + +#define Y_STEP_PIN 36 +#define Y_DIR_PIN 49 +#define Y_ENABLE_PIN 28 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 47 +#define Z_ENABLE_PIN 27 + +#define E0_STEP_PIN 34 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 26 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 42 +#define E1_ENABLE_PIN 25 + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 40 +#define X_MS2_PIN 41 +#define Y_MS1_PIN 69 +#define Y_MS2_PIN 39 +#define Z_MS1_PIN 68 +#define Z_MS2_PIN 67 +#define E0_MS1_PIN 65 +#define E0_MS2_PIN 66 +#define E1_MS1_PIN 63 +#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 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_BED_PIN 7 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 3 + +#ifndef FAN_PIN + #define FAN_PIN 8 +#endif +#define FAN1_PIN 6 +#define FAN2_PIN 2 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 4 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 3 // Analog Input +#endif + +// +// LCD / Controller +// +#define LCD_PINS_RS 70 // Ext2_5 +#define LCD_PINS_ENABLE 71 // Ext2_7 +#define LCD_PINS_D4 72 // Ext2_9 ? +#define LCD_PINS_D5 73 // Ext2_11 ? +#define LCD_PINS_D6 74 // Ext2_13 +#define LCD_PINS_D7 75 // Ext2_15 ? +#define BEEPER_PIN -1 + +#define BTN_HOME 80 // Ext_16 +#define BTN_CENTER 81 // Ext_14 +#define BTN_ENC BTN_CENTER +#define BTN_RIGHT 82 // Ext_12 +#define BTN_LEFT 83 // Ext_10 +#define BTN_UP 84 // Ext2_8 +#define BTN_DOWN 85 // Ext2_6 + +#define HOME_PIN BTN_HOME + +#if ANY(VIKI2, miniVIKI) + #define BEEPER_PIN 44 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 70 + #define DOGLCD_CS 71 + #define LCD_SCREEN_ROT_180 + + #define SD_DETECT_PIN -1 // Pin 72 if using easy adapter board + + #define STAT_LED_RED_PIN 22 + #define STAT_LED_BLUE_PIN 32 +#endif // VIKI2/miniVIKI diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h new file mode 100644 index 00000000..f0057e1f --- /dev/null +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -0,0 +1,164 @@ +/** + * 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 + +/** + * 3DRAG (and K8200 / K8400) Arduino Mega with RAMPS v1.4 pin assignments + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "3Drag" +#endif + +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +#ifndef DEFAULT_SOURCE_CODE_URL + #define DEFAULT_SOURCE_CODE_URL "https://3dprint.elettronicain.it/" +#endif + +// +// Heaters / Fans +// +#define RAMPS_D8_PIN 9 +#define RAMPS_D9_PIN 8 +#define MOSFET_D_PIN 12 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN -1 // Hardware PWM but one is not available on expansion header +#endif + +#include "pins_RAMPS.h" + +// +// Limit Switches +// +#undef Z_MAX_PIN + +// +// Steppers +// +#undef Z_ENABLE_PIN +#define Z_ENABLE_PIN 63 + +// +// Heaters / Fans +// +#define HEATER_2_PIN 6 + +// +// Misc. Functions +// +#undef SDSS +#define SDSS 25 + +#undef SD_DETECT_PIN +#define SD_DETECT_PIN 53 + +// +// LCD / Controller +// +#if BOTH(ULTRA_LCD, NEWPANEL) + #undef BEEPER_PIN + + #undef LCD_PINS_RS + #undef LCD_PINS_ENABLE + #undef LCD_PINS_D4 + #undef LCD_PINS_D5 + #undef LCD_PINS_D6 + #undef LCD_PINS_D7 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 37 + #define LCD_PINS_D5 35 + #define LCD_PINS_D6 33 + #define LCD_PINS_D7 31 + + // Buttons + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #define BTN_EN1 16 + #define BTN_EN2 17 + #define BTN_ENC 23 + +#else + + #define BEEPER_PIN 33 + +#endif // ULTRA_LCD && NEWPANEL + +/** + * M3/M4/M5 - Spindle/Laser Control + * + * If you want to control the speed of your spindle then you'll have + * have to sacrifce the Extruder and pull some signals off the Z stepper + * driver socket. + * + * The following assumes: + * - the Z stepper driver socket is empty + * - the extruder driver socket has a driver board plugged into it + * - the Z stepper wires are attached the the extruder connector + * + * If you want to keep the extruder AND don't have a LCD display then + * you can still control the power on/off and spindle direction. + * + * Where to get spindle signals + * + * stepper signal socket name socket name + * ------- + * SPINDLE_LASER_ENA_PIN /ENABLE O| |O VMOT + * MS1 O| |O GND + * MS2 O| |O 2B + * MS3 O| |O 2A + * /RESET O| |O 1A + * /SLEEP O| |O 1B + * SPINDLE_LASER_PWM_PIN STEP O| |O VDD + * SPINDLE_DIR_PIN DIR O| |O GND + * ------- + * + * Note: Socket names vary from vendor to vendor + */ +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are not good with 3DRAG +#undef SPINDLE_LASER_ENA_PIN +#undef SPINDLE_DIR_PIN + +#if HAS_CUTTER + #if !EXTRUDERS + #undef E0_DIR_PIN + #undef E0_ENABLE_PIN + #undef E0_STEP_PIN + #undef Z_DIR_PIN + #undef Z_ENABLE_PIN + #undef Z_STEP_PIN + #define Z_DIR_PIN 28 + #define Z_ENABLE_PIN 24 + #define Z_STEP_PIN 26 + #define SPINDLE_LASER_PWM_PIN 46 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 62 // Pullup! + #define SPINDLE_DIR_PIN 48 + #elif !BOTH(ULTRA_LCD, NEWPANEL) // use expansion header if no LCD in use + #define SPINDLE_LASER_ENA_PIN 16 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 17 + #endif +#endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h new file mode 100644 index 00000000..e919b30c --- /dev/null +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -0,0 +1,96 @@ +/** + * 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 + +/** + * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Azteeg X3 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) + #define CASE_LIGHT_PIN 6 // Define before RAMPS pins include +#endif +#define BOARD_INFO_NAME "Azteeg X3" + +// +// Servos +// +#define SERVO0_PIN 44 // SERVO1 port +#define SERVO1_PIN 55 // SERVO2 port + +#include "pins_RAMPS_13.h" + +// +// LCD / Controller +// +#undef STAT_LED_RED_PIN +#undef STAT_LED_BLUE_PIN + +#if ANY(VIKI2, miniVIKI) + + #undef DOGLCD_A0 + #undef DOGLCD_CS + #undef BTN_ENC + #define DOGLCD_A0 31 + #define DOGLCD_CS 32 + #define BTN_ENC 12 + + #define STAT_LED_RED_PIN 64 + #define STAT_LED_BLUE_PIN 63 + +#else + + #define STAT_LED_RED_PIN 6 + #define STAT_LED_BLUE_PIN 11 + +#endif + +// +// Misc +// +#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT, STAT_LED_RED) && STAT_LED_RED_PIN == CASE_LIGHT_PIN + #undef STAT_LED_RED_PIN +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are no good with the AzteegX3 board +#undef SPINDLE_LASER_ENA_PIN +#undef SPINDLE_DIR_PIN + +#if HAS_CUTTER + #undef SDA // use EXP3 header + #undef SCL + #if SERVO0_PIN == 7 + #undef SERVO0_PIN + #define SERVO0_PIN 11 + #endif + #define SPINDLE_LASER_PWM_PIN 7 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 20 // Pullup! + #define SPINDLE_DIR_PIN 21 +#endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h new file mode 100644 index 00000000..9ba6a0c1 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -0,0 +1,177 @@ +/** + * 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 + +/** + * AZTEEG_X3_PRO (Arduino Mega) pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 5 || E_STEPPERS > 5 + #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Azteeg X3 Pro" + +// +// RAMPS pins overrides +// + +// +// Servos +// +// Tested this pin with bed leveling on a Delta with 1 servo. +// Physical wire attachment on EXT1: GND, 5V, D47. +// +#define SERVO0_PIN 47 + +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 14 +#define Z_STOP_PIN 18 + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) + #define CASE_LIGHT_PIN 44 +#endif + +// +// Import RAMPS 1.4 pins +// +#include "pins_RAMPS.h" + +// DIGIPOT slave addresses +#ifndef DIGIPOT_I2C_ADDRESS_A + #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) +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 18 +#endif + +// +// Steppers +// +#define E2_STEP_PIN 23 +#define E2_DIR_PIN 25 +#define E2_ENABLE_PIN 40 + +#define E3_STEP_PIN 27 +#define E3_DIR_PIN 29 +#define E3_ENABLE_PIN 41 + +#define E4_STEP_PIN 43 +#define E4_DIR_PIN 37 +#define E4_ENABLE_PIN 42 + +// +// Temperature Sensors +// +#define TEMP_2_PIN 12 // Analog Input +#define TEMP_3_PIN 11 // Analog Input +#define TEMP_4_PIN 10 // Analog Input +#define TC1 4 // Analog Input (Thermo couple on Azteeg X3Pro) +#define TC2 5 // Analog Input (Thermo couple on Azteeg X3Pro) + +// +// Heaters / Fans +// +#define HEATER_2_PIN 16 +#define HEATER_3_PIN 17 +#define HEATER_4_PIN 4 +#define HEATER_5_PIN 5 +#define HEATER_6_PIN 6 +#define HEATER_7_PIN 11 + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN 4 // Pin used for the fan to cool motherboard (-1 to disable) +#endif + +// +// Auto fans +// +#define AUTO_FAN_PIN 5 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN AUTO_FAN_PIN +#endif + +// +// LCD / Controller +// +#undef BEEPER_PIN +#define BEEPER_PIN 33 + +#if ANY(VIKI2, miniVIKI) + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 49 // For easy adapter board + #undef BEEPER_PIN + #define BEEPER_PIN 12 // 33 isn't physically available to the LCD display +#else + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 +#endif + +// +// Misc. Functions +// +#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT) && defined(DOGLCD_A0) && DOGLCD_A0 == CASE_LIGHT_PIN + #undef DOGLCD_A0 // Steal pin 44 for the case light; if you have a Viki2 and have connected it + #define DOGLCD_A0 57 // following the Panucatt wiring diagram, you may need to tweak these pin assignments + // as the wiring diagram uses pin 44 for DOGLCD_A0 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are no good with the AzteegX3pro board +#undef SPINDLE_LASER_ENA_PIN +#undef SPINDLE_DIR_PIN + +#if HAS_CUTTER // EXP2 header + #if ANY(VIKI2, miniVIKI) + #define BTN_EN2 31 // Pin 7 needed for Spindle PWM + #endif + #define SPINDLE_LASER_PWM_PIN 7 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 20 // Pullup! + #define SPINDLE_DIR_PIN 21 +#endif diff --git a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h new file mode 100644 index 00000000..af1adabb --- /dev/null +++ b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.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 + +/** + * BAM&DICE Due (Arduino Mega) pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "2PrintBeta Due supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "2PrintBeta Due" + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 66 // Pullup or pulldown! +#define SPINDLE_DIR_PIN 67 +#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + +#include "pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#undef TEMP_1_PIN +#define TEMP_0_PIN 9 // Analog Input +#define TEMP_1_PIN 11 // Analog Input diff --git a/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h b/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h new file mode 100644 index 00000000..b31df115 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_BIQU_KFB_2.h @@ -0,0 +1,40 @@ +/** + * 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 + +/** + * KFB 2.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "KFB 2.0 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "KFB 2.0" + +// +// Heaters / Fans +// +// Power outputs BEEF or BEFF +#define MOSFET_D_PIN 7 + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h new file mode 100644 index 00000000..967fec7b --- /dev/null +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -0,0 +1,126 @@ +/** + * 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 + +/** + * bq ZUM Mega 3D board definition + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "ZUM Mega 3D" + +// +// Heaters / Fans +// +#define RAMPS_D8_PIN 10 +#define RAMPS_D9_PIN 12 +#define RAMPS_D10_PIN 9 +#define MOSFET_D_PIN 7 + +// +// Auto fans +// +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 11 +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN 6 +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN 6 +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN 6 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! +#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM +#define SPINDLE_DIR_PIN 42 + +// +// Limit Switches +// +#define X_MAX_PIN 79 // 2 + +// +// Import RAMPS 1.3 pins +// +#include "pins_RAMPS_13.h" + +// +// Z Probe (when not Z_MIN_PIN) +// +#undef Z_MIN_PROBE_PIN +#define Z_MIN_PROBE_PIN 19 // IND_S_5V + +#undef Z_ENABLE_PIN +#define Z_ENABLE_PIN 77 // 62 + +// +// Steppers +// +#define DIGIPOTSS_PIN 22 +#define DIGIPOT_CHANNELS { 4, 5, 3, 0, 1 } + +// +// Temperature Sensors +// +#undef TEMP_1_PIN +#define TEMP_1_PIN 14 // Analog Input (15) + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 15 // Analog Input (14) + +// +// Misc. Functions +// +#undef PS_ON_PIN // 12 +#define PS_ON_PIN 81 // External Power Supply + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 44 // Hardware PWM +#endif + +// This board has headers for Z-min, Z-max and IND_S_5V *but* as the bq team +// decided to ship the printer only with the probe and no additional Z-min +// endstop and the instruction manual advises the user to connect the probe to +// IND_S_5V the option Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN will not work. +#ifdef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + #undef Z_MIN_PIN + #undef Z_MAX_PIN + #define Z_MIN_PIN 19 // IND_S_5V + #define Z_MAX_PIN 18 // Z-MIN Label +#endif + +// +// Used by the Hephestos 2 heated bed upgrade kit +// +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef HEATER_BED_PIN + #define HEATER_BED_PIN 8 +#endif diff --git a/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h b/Marlin/src/pins/ramps/pins_COPYMASTER_3D.h new file mode 100644 index 00000000..b9eee6bd --- /dev/null +++ b/Marlin/src/pins/ramps/pins_COPYMASTER_3D.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 + +#define BOARD_INFO_NAME "Copymaster 3D RAMPS" + +#define Z_STEP_PIN 47 +#define Y_MAX_PIN 14 +#define FIL_RUNOUT_PIN 15 +#define SD_DETECT_PIN 66 + +// +// Import RAMPS 1.4 pins +// +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h new file mode 100644 index 00000000..87d24890 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -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 . + * + */ +#pragma once + +/** + * Wanhao Duplicator i3 Plus pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Duplicator i3 Plus" + +// +// Limit Switches +// +#define X_STOP_PIN 54 // PF0 / A0 +#define Y_STOP_PIN 24 // PA2 / AD2 +#define Z_MIN_PIN 23 // PA1 / AD1 +#define Z_MAX_PIN 25 // PA3 / AD3 +#define SERVO0_PIN 40 // PG1 / !RD + +// +// Steppers +// +#define X_STEP_PIN 61 // PF7 / A7 +#define X_DIR_PIN 62 // PK0 / A8 +#define X_ENABLE_PIN 60 // PF6 / A6 + +#define Y_STEP_PIN 64 // PK2 / A10 +#define Y_DIR_PIN 65 // PK3 / A11 +#define Y_ENABLE_PIN 63 // PK1 / A9 + +#define Z_STEP_PIN 67 // PK5 / A13 +#define Z_DIR_PIN 69 // PK7 / A15 +#define Z_ENABLE_PIN 66 // PK4 / A12 +#define Z_MIN_PROBE_PIN 25 // PA3 / AD3 + +#define E0_STEP_PIN 58 // PF4 / A4 +#define E0_DIR_PIN 59 // PF5 / A5 +#define E0_ENABLE_PIN 57 // PF3 / A3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // PF1 / A1 Analog +#define TEMP_BED_PIN 14 // PK6 / A14 Analog + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 // PG5 / PWM4 +#define HEATER_BED_PIN 3 // PE5 / PWM3 + +#define FAN_PIN 5 // PE3 / PWM5 + +// +// Misc. Functions +// +#define SDSS 53 // PB0 / SS +#define LED_PIN 13 // PB7 / PWM13 + +#define MISO_PIN 50 // PB3 +#define MOSI_PIN 51 // PB2 +#define SCK_PIN 52 // PB1 + +// +// LCDs and Controllers +// +#if HAS_WIRED_LCD + #if ENABLED(ZONESTAR_LCD) + #define LCD_PINS_RS 2 + #define LCD_PINS_ENABLE 36 + #define LCD_PINS_D4 37 + #define LCD_PINS_D5 34 + #define LCD_PINS_D6 35 + #define LCD_PINS_D7 32 + #define ADC_KEYPAD_PIN 12 // Analog + #endif +#endif + +/** + * == EXT connector == + * + * 2 4 6 8 10 + * #---------------# + * #2 | ° ° ° ° ° | + * #1 | ° ° ° ° ° | + * #---------------# + * 1 3 5 7 9 + * + * ################################## + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################## + * # 1 | 52 / PG1 (!RD) | 40 # + * # 2 | 95 / PF2 (A2) | 56 # + * # 3 | 54 / PC1 (A9) | 36 # + * # 4 | 53 / PC0 (A8) | 37 # + * # 5 | 56 / PC3 (A11) | 34 # + * # 6 | 55 / PC2 (A10) | 35 # + * # 7 | 58 / PC5 (A13) | 32 # + * # 8 | 57 / PC4 (A12) | 33 # + * # 9 | GND | - # + * # 10 | VCC | + # + * ################################## + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * == Z-probe connector == + * + * 1 2 3 + * #---------# + * | ° ° ° | + * #---------# + * + * ################################## + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################## + * # 1 | 24V or 5V | + # + * # 2 | 75 / PA3 (AD3) | 25 # + * # 3 | GND | - # + * ################################## + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * == Y-endstop == == Z-endstop == == Bed temperature == + * + * 1 2 1 2 1 2 + * #------# #------# #------# + * | ° ° | | ° ° | | ° ° | + * #------# #------# #------# + * + * ############### Y ################ ############### Z ################ ############## BED ############### + * # Pin | ATMEGA2560 Pin | Arduino # # Pin | ATMEGA2560 Pin | Arduino # # Pin | ATMEGA2560 Pin | Arduino # + * ################################## ################################## ################################## + * # 1 | GND | - # # 1 | GND | - # # 1 | GND | - # + * # 2 | 76 / PA2 (AD2) | 24 # # 2 | 77 / PA1 (AD1) | 23 # # 2 |83 / PK6 (ADC14)| 14 # + * ################################## ################################## ################################## + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * == SPI connector == + * + * 5 3 1 + * #---------# + * | ° ° ° | + * | ° ° ° | + * #---------# + * 6 4 2 + * + * ################################## + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################## + * # 1 | 22 / PB3 (MISO)| 50 # + * # 2 | VCC | + # + * # 3 | 20 / PB1 (SCK) | 52 # + * # 4 | 21 / PB2 (MOSI)| 51 # + * # 5 | 30 / !RESET | RESET # + * # 6 | GND | - # + * ################################## + * + * Pictogram by Ludy https://github.com/Ludy87 + * See: https://sebastien.andrivet.com/en/posts/wanhao-duplicator-i3-plus-3d-printer/ + */ diff --git a/Marlin/src/pins/ramps/pins_FELIX2.h b/Marlin/src/pins/ramps/pins_FELIX2.h new file mode 100644 index 00000000..6cc6997a --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FELIX2.h @@ -0,0 +1,63 @@ +/** + * 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 + +/** + * FELIXprinters v2.0/3.0 (RAMPS v1.4) pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Felix 2.0+ supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Felix 2.0+" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +#include "pins_RAMPS.h" + +// +// Misc. Functions +// +#define SDPOWER_PIN 1 + +#define PS_ON_PIN 12 + +// +// LCD / Controller +// +#if BOTH(ULTRA_LCD, NEWPANEL) + + #define SD_DETECT_PIN 6 + +#endif // NEWPANEL && ULTRA_LCD + +// +// M3/M4/M5 - Spindle/Laser Control +// +#undef SPINDLE_LASER_PWM_PIN // Definitions in pins_RAMPS.h are not valid with this board +#undef SPINDLE_LASER_ENA_PIN +#undef SPINDLE_DIR_PIN diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h new file mode 100644 index 00000000..0877d168 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -0,0 +1,197 @@ +/** + * 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 + +/** + * Formbot Raptor pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 3 || E_STEPPERS > 3 + #error "Formbot supports up to 3 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Formbot Raptor" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 43 +#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 14 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HAS_MULTI_HOTEND + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 8 + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 57 +#endif + +#if !HAS_FILAMENT_SENSOR + #define FAN1_PIN 4 +#endif + +// +// Misc. Functions +// +#ifndef SDSS + #define SDSS 53 +#endif +#define LED_PIN 13 +#define LED4_PIN 5 + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +#define FILWIDTH_PIN 5 // Analog Input + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 5 +#endif + +// +// LCD / Controller +// +// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #define BEEPER_PIN 37 + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #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 +#endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h new file mode 100644 index 00000000..843eadb4 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h @@ -0,0 +1,68 @@ +/** + * 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 + +/** + * Formbot Raptor 2 pin assignments + */ + +#define BOARD_INFO_NAME "Formbot Raptor2" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +#define FAN_PIN 6 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 22 +#endif + +#include "pins_FORMBOT_RAPTOR.h" + +#define GREEDY_PANEL ANY(PANEL_ONE, VIKI2, miniVIKI, MINIPANEL, REPRAPWORLD_KEYPAD) + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) + #if !NUM_SERVOS // Try to use servo connector first + #define SPINDLE_LASER_ENA_PIN 6 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM + #define SPINDLE_DIR_PIN 5 + #elif !GREEDY_PANEL // Try to use AUX2 + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_DIR_PIN 65 + #endif +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) + #if NUM_SERVOS <= 1 // Try to use servo connector first + #define CASE_LIGHT_PIN 6 // Hardware PWM + #elif !GREEDY_PANEL // Try to use AUX2 + #define CASE_LIGHT_PIN 44 // Hardware PWM + #endif +#endif + +#undef GREEDY_PANEL + +#if ENABLED(CASE_LIGHT_ENABLE) && PIN_EXISTS(CASE_LIGHT) && (CASE_LIGHT_PIN == SPINDLE_LASER_ENA_PIN || CASE_LIGHT_PIN == SPINDLE_LASER_PWM_PIN) + #error "CASE_LIGHT_PIN conflicts with a Spindle / Laser pin." +#endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h new file mode 100644 index 00000000..75a219c1 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -0,0 +1,210 @@ +/** + * 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 + +/** + * Formbot pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Formbot" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN -1 // was 6 +#define SERVO2_PIN -1 // was 5 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 43 +#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 3 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HAS_MULTI_HOTEND + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 58 + +#define FAN_PIN 9 + +#if HAS_FILAMENT_SENSOR + #define FIL_RUNOUT_PIN 4 + //#define FIL_RUNOUT2_PIN -1 +#else + // Though defined as a fan pin, it is utilized as a dedicated laser pin by Formbot. + #define FAN1_PIN 4 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#ifndef LED_PIN + #define LED_PIN 13 // The Formbot v 1 board has almost no unassigned pins on it. The Board's LED +#endif // is a good place to get a signal to control the Max7219 LED Matrix. + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +#define FILWIDTH_PIN 5 // Analog Input + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 8 +#endif + +// +// LCD / Controller +// +// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #ifndef BEEPER_PIN + #define BEEPER_PIN 37 + #endif + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + + // Allow MAX7219 to steal the KILL pin + #if !defined(KILL_PIN) && MAX7219_CLK_PIN != 41 && MAX7219_DIN_PIN != 41 && MAX7219_LOAD_PIN != 41 + #define KILL_PIN 41 + #endif + + #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 +#endif + +#if HAS_MARLINUI_U8GLIB + #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/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h new file mode 100644 index 00000000..0470fc47 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.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 + +/** + * Formbot pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Formbot" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN -1 // was 6 +#define SERVO2_PIN -1 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 43 +#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 14 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_BED_PIN 8 + +#define FAN_PIN 9 +#define FAN1_PIN 12 + +#define NUM_RUNOUT_SENSORS 2 +#define FIL_RUNOUT_PIN 22 +#define FIL_RUNOUT2_PIN 21 + +// +// Misc. Functions +// +#define SDSS 53 + +#ifndef LED_PIN + #define LED_PIN 13 +#endif + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 5 +#endif + +#define SPINDLE_LASER_PWM_PIN -1 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 4 // Pullup! + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +#define FILWIDTH_PIN 5 // Analog Input + +// +// LCD / Controller +// +// Formbot only supports REPRAP_DISCOUNT_SMART_CONTROLLER +// +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + #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 BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + #ifndef KILL_PIN + #define KILL_PIN 41 + #endif + #ifndef BEEPER_PIN + #define BEEPER_PIN 37 + #endif +#endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h new file mode 100644 index 00000000..3fa3cc9e --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -0,0 +1,298 @@ +/** + * 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 + +// +// FYSETC F6 1.3 (and 1.4) pin assignments +// + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'FYSETC F6' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "FYSETC F6 1.3" +#endif + +#define RESET_PIN 30 +#define SPI_FLASH_CS 83 + +// +// Servos +// +#define SERVO0_PIN 13 +#define SERVO1_PIN 11 // (PS_ON_PIN) +#define SERVO2_PIN 10 // (FIL_RUNOUT_PIN) +#define SERVO3_PIN 4 // (RGB_LED_G_PIN) + +// +// Limit Switches +// +#define X_MIN_PIN 63 +#define X_MAX_PIN 64 +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 12 +#ifndef Z_MAX_PIN + #define Z_MAX_PIN 9 +#endif + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN SERVO2_PIN +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 9 // Servos pin +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 70 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 39 +#endif + +#define Z_STEP_PIN 43 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 58 +#ifndef Z_CS_PIN + #define Z_CS_PIN 74 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 47 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 32 +#endif + +#define E2_STEP_PIN 59 +#define E2_DIR_PIN 57 +#define E2_ENABLE_PIN 40 +#ifndef E2_CS_PIN + #define E2_CS_PIN 42 +#endif + +// +// Sensorless homing DIAG pin is not directly connected to the MCU. Close +// the jumper next to the limit switch socket when using sensorless homing. +// + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Software serial communication pins. + * At the moment, F6 rx pins are not pc interrupt pins + */ + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN -1 // 71 + #endif + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN 72 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN -1 // 73 + #endif + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN 75 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN -1 // 78 + #endif + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN 79 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN -1 // 76 + #endif + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN 77 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN -1 // 80 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN 81 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN -1 // 22 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN 82 + #endif +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 12 // Analog Input +#define TEMP_1_PIN 13 // Analog Input +#define TEMP_2_PIN 14 // Analog Input +#define TEMP_BED_PIN 15 // Analog Input + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 9 // Analog Input on X+ endstop +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 5 +#define HEATER_1_PIN 6 +#define HEATER_2_PIN 7 +#define HEATER_BED_PIN 8 + +#define FAN_PIN 44 +#define FAN1_PIN 45 +#define FAN2_PIN 46 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define KILL_PIN 41 + +#ifndef PS_ON_PIN + #define PS_ON_PIN SERVO1_PIN +#endif + +/** + * ----- ----- + * 5V/D41 | · · | GND 5V | · · | GND + * RESET | · · | D49 (SD_DETECT) (LCD_D7) D29 | · · | D27 (LCD_D6) + * (MOSI) D51 | · · | D33 (BTN_EN2) (LCD_D5) D25 | · · | D23 (LCD_D4) + * (SD_SS) D53 | · · | D31 (BTN_EN1) (LCD_RS) D16 | · · | D17 (LCD_EN) + * (SCK) D52 | · · | D50 (MISO) (BTN_ENC) D35 | · · | D37 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +// +// LCDs and Controllers +// +#define SD_DETECT_PIN 49 + +#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 + + #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 HAS_MARLINUI_U8GLIB + + #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 + + #endif + + #if ENABLED(NEWPANEL) + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + #endif +#endif + +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN 3 +#endif +#ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN 4 +#endif +#ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN 9 +#endif +#ifndef RGB_LED_W_PIN + #define RGB_LED_W_PIN -1 +#endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.h new file mode 100644 index 00000000..4280204b --- /dev/null +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_14.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 + +// +// FYSETC F6 v1.4 pin assignments +// + +#define BOARD_INFO_NAME "FYSETC F6 1.4" + +#define Z_MAX_PIN 2 + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + */ + #define X_SERIAL_RX_PIN 72 + #define X_SERIAL_TX_PIN 71 + #define Y_SERIAL_RX_PIN 73 + #define Y_SERIAL_TX_PIN 78 + #define Z_SERIAL_RX_PIN 75 + #define Z_SERIAL_TX_PIN 79 + #define E0_SERIAL_RX_PIN 77 + #define E0_SERIAL_TX_PIN 81 + #define E1_SERIAL_RX_PIN 76 + #define E1_SERIAL_TX_PIN 80 + #define E2_SERIAL_RX_PIN 62 + #define E2_SERIAL_TX_PIN 82 +#endif + +#include "pins_FYSETC_F6_13.h" diff --git a/Marlin/src/pins/ramps/pins_K8200.h b/Marlin/src/pins/ramps/pins_K8200.h new file mode 100644 index 00000000..5d4d2d70 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_K8200.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 + +/** + * K8200 Arduino Mega with RAMPS v1.3 pin assignments + * Identical to 3DRAG + */ + +#define BOARD_INFO_NAME "Velleman K8200" +#define DEFAULT_MACHINE_NAME "K8200" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/CONSULitAS/Marlin-K8200" + +#include "pins_3DRAG.h" diff --git a/Marlin/src/pins/ramps/pins_K8400.h b/Marlin/src/pins/ramps/pins_K8400.h new file mode 100644 index 00000000..c36e2915 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_K8400.h @@ -0,0 +1,73 @@ +/** + * 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 + +/** + * Velleman K8400 (Vertex) + * 3DRAG clone + * + * K8400 has some minor differences over a normal 3Drag: + * - No X/Y max endstops + * - Second extruder step pin has moved + * - No power supply control + * - Second heater has moved pin + */ + +#define BOARD_INFO_NAME "K8400" +#define DEFAULT_MACHINE_NAME "Vertex" + +#include "pins_3DRAG.h" + +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 14 + +#undef X_MIN_PIN +#undef X_MAX_PIN +#undef Y_MIN_PIN +#undef Y_MAX_PIN + +// +// Steppers +// +#undef E1_STEP_PIN +#define E1_STEP_PIN 32 + +// +// Heaters / Fans +// +#undef HEATER_1_PIN +#define HEATER_1_PIN 11 + +// +// Misc. Functions +// +#undef PS_ON_PIN +#undef KILL_PIN +#undef SD_DETECT_PIN + +#if Z_STEP_PIN == 26 + #undef Z_STEP_PIN + #define Z_STEP_PIN 32 +#endif diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h new file mode 100644 index 00000000..0de01927 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_K8600.h @@ -0,0 +1,127 @@ +/** + * 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 . + * + */ + +/** + * VERTEX NANO Arduino Mega with RAMPS EFB v1.4 pin assignments. + */ + +#if HOTENDS > 1 + #error "Only 1 hotend is supported for Vertex Nano." +#endif + +#define BOARD_INFO_NAME "K8600" +#define DEFAULT_MACHINE_NAME "Vertex Nano" + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define Y_MAX_PIN 14 +#define Z_MAX_PIN 18 +#define Z_MIN_PIN -1 + +// +// Heaters / Fans +// +#define FAN_PIN 8 + +// +// Misc. Functions +// +#define CASE_LIGHT_PIN 7 + +// +// Other RAMPS pins +// +#define IS_RAMPS_EFB // Override autodetection. Bed will be undefined. +#include "pins_RAMPS.h" + +// +// Steppers +// +#undef X_STEP_PIN +#undef X_DIR_PIN +#undef X_ENABLE_PIN +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 + +#undef Y_STEP_PIN +#undef Y_DIR_PIN +#undef Y_ENABLE_PIN +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 + +#undef Z_ENABLE_PIN +#define Z_ENABLE_PIN 63 + +#undef E0_STEP_PIN +#undef E0_DIR_PIN +#undef E0_ENABLE_PIN +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 + +// +// Heaters / Fans +// +#undef HEATER_BED_PIN + +// +// Misc. Functions +// +#undef SDSS +#define SDSS 25 // 53 + +// +// LCD / Controller +// +#if BOTH(ULTRA_LCD, NEWPANEL) + #undef BEEPER_PIN + + #undef LCD_PINS_RS + #undef LCD_PINS_ENABLE + #undef LCD_PINS_D4 + #undef LCD_PINS_D5 + #undef LCD_PINS_D6 + #undef LCD_PINS_D7 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 37 + #define LCD_PINS_D5 35 + #define LCD_PINS_D6 33 + #define LCD_PINS_D7 31 + + // Buttons + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #define BTN_EN1 17 + #define BTN_EN2 16 + #define BTN_ENC 23 + +#else + + #define BEEPER_PIN 33 + +#endif diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h new file mode 100644 index 00000000..7e8c245a --- /dev/null +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -0,0 +1,122 @@ +/** + * 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 + +/** + * Velleman K8800 (Vertex) + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "K8800" +#define DEFAULT_MACHINE_NAME "Vertex Delta" + +//#define LCD_SCREEN_ROT_180 + +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 14 +#define Z_STOP_PIN 66 + +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 68 +#endif + +#define FIL_RUNOUT_PIN 69 // PK7 + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 63 + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define FAN_PIN 8 +#define CONTROLLER_FAN_PIN 9 + +// +// Misc. Functions +// +#define KILL_PIN 20 // PD1 +#define CASE_LIGHT_PIN 7 + +// +// SD Card +// +#define SDSS 25 +#define SD_DETECT_PIN 21 // PD0 + +// +// LCD / Controller +// +#define BEEPER_PIN 6 + +#if HAS_WIRED_LCD + + #define LCD_SDSS 53 + + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 37 + #define LCD_PINS_D5 35 + #define LCD_PINS_D6 33 + #define LCD_PINS_D7 31 + + #define LCD_CONTRAST_MIN 0 + #define LCD_CONTRAST_MAX 100 + #define DEFAULT_LCD_CONTRAST 30 + + #if ENABLED(NEWPANEL) + #define BTN_EN1 17 + #define BTN_EN2 16 + #define BTN_ENC 23 + #endif + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h b/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.h new file mode 100644 index 00000000..a42dba87 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MAKEBOARD_MINI.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 + +#define BOARD_INFO_NAME "MAKEboard Mini" + +// +// Only 3 Limit Switch plugs on Micromake C1 +// +#define X_STOP_PIN 2 +#define Y_STOP_PIN 15 +#define Z_STOP_PIN 19 + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_10.h b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h new file mode 100644 index 00000000..0be58653 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_10.h @@ -0,0 +1,37 @@ +/** + * 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 BASE 1.0 – Arduino Mega2560 with RAMPS v1.4 pin assignments + * + * Rev B - Override pin definitions for CASE_LIGHT and M3/M4/M5 spindle control + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS BASE 1.0 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS BASE 1.0" +#define MKS_BASE_VERSION 10 + +#include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_14.h b/Marlin/src/pins/ramps/pins_MKS_BASE_14.h new file mode 100644 index 00000000..3612f9b8 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_14.h @@ -0,0 +1,170 @@ +/** + * 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 BASE v1.4 with A4982 stepper drivers and digital micro-stepping + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS BASE 1.4 only supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS BASE 1.4" +#define MKS_BASE_VERSION 14 + +// +// Heaters / Fans +// +#define FAN_PIN 9 // PH6 ** Pin18 ** PWM9 + +// Other Mods + +#define SERVO3_PIN 12 // PB6 ** Pin25 ** D12 +#define PS_ON_PIN 2 // X+ // PE4 ** Pin6 ** PWM2 **MUST BE HARDWARE PWM +#define FILWIDTH_PIN 15 // Y+ // PJ0 ** Pin63 ** USART3_RX **Pin should have a pullup! +#define FIL_RUNOUT_PIN 19 // Z+ // PD2 ** Pin45 ** USART1_RX + +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN 50 +#endif +#ifndef RGB_LED_R_PIN + #define RGB_LED_G_PIN 51 +#endif +#ifndef RGB_LED_R_PIN + #define RGB_LED_B_PIN 52 +#endif + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 11 // PB5 ** Pin24 ** PWM11 +#endif + +#include "pins_MKS_BASE_common.h" + +/* + Available connectors on MKS BASE v1.4 + + ======= + | GND | + |-----| E0 + | 10 | (10) PB4 ** Pin23 ** PWM10 + |-----| + | GND | + |-----| E1 + | 7 | ( 7) PH4 ** Pin16 ** PWM7 + |-----| + | GND | + |-----| FAN + | 9 | ( 9) PH6 ** Pin18 ** PWM9 + ======= + + ======= + | GND | + |-----| Heated Bed + | 8 | ( 8) PH5 ** Pin17 ** PWM8 + ======= + + ========== + | 12-24V | + |--------| Power + | GND | + ========== + + XS3 Connector + ================= + | 65 | GND | 5V | (65) PK3 ** Pin86 ** A11 + |----|-----|----| + | 66 | GND | 5V | (66) PK4 ** Pin85 ** A12 + ================= + + Servos Connector + ================= + | 11 | GND | 5V | (11) PB5 ** Pin24 ** PWM11 + |----|-----|----| + | 12 | GND | 5V | (12) PB6 ** Pin25 ** PWM12 + ================= + + ICSP + ================= + | 5V | 51 | GND | (51) PB2 ** Pin21 ** SPI_MOSI + |----|----|-----| + | 50 | 52 | RST | (50) PB3 ** Pin22 ** SPI_MISO + ================= (52) PB1 ** Pin20 ** SPI_SCK + + XS6/AUX-1 Connector + ====================== + | 5V | GND | NC | 20 | (20) PD1 ** Pin44 ** I2C_SDA + |----|-----|----|----| + | 50 | 51 | 52 | 21 | (50) PB3 ** Pin22 ** SPI_MISO + ====================== (51) PB2 ** Pin21 ** SPI_MOSI + (52) PB1 ** Pin20 ** SPI_SCK + (21) PD0 ** Pin43 ** I2C_SCL + + Temperature + ================================== + | GND | 69 | GND | 68 | GND | 67 | + ================================== + (69) PK7 ** Pin82 ** A15 + (68) PK6 ** Pin83 ** A14 + (67) PK5 ** Pin84 ** A13 + + Limit Switches + ============ + | 2 | GND | X+ ( 2) PE4 ** Pin6 ** PWM2 + |----|-----| + | 3 | GND | X- ( 3) PE5 ** Pin7 ** PWM3 + |----|-----| + | 15 | GND | Y+ (15) PJ0 ** Pin63 ** USART3_RX + |----|-----| + | 14 | GND | Y- (14) PJ1 ** Pin64 ** USART3_TX + |----|-----| + | 19 | GND | Z+ (19) PD2 ** Pin45 ** USART1_RX + |----|-----| + | 18 | GND | Z- (18) PD3 ** Pin46 ** USART1_TX + ============ + + EXP1 + ============ + | 37 | 35 | (37) PC0 ** Pin53 ** D37 + |-----|----| (35) PC2 ** Pin55 ** D35 + | 17 | 16 | (17) PH0 ** Pin12 ** USART2_RX + |-----|----| (16) PH1 ** Pin13 ** USART2_TX + | 23 | 25 | (23) PA1 ** Pin77 ** D23 + |-----|----| (25) PA3 ** Pin75 ** D25 + | 27 | 29 | (27) PA5 ** Pin73 ** D27 + |-----|----| (29) PA7 ** Pin71 ** D29 + | GND | 5V | + ============ + + EXP2 + ============ + | 50 | 52 | (50) PB3 ** Pin22 ** SPI_MISO + |-----|----| (52) PB1 ** Pin20 ** SPI_SCK + | 31 | 53 | (31) PC6 ** Pin59 ** D31 + |-----|----| (53) PB0 ** Pin19 ** SPI_SS + | 33 | 51 | (33) PC4 ** Pin57 ** D33 + |-----|----| (51) PB2 ** Pin21 ** SPI_MOSI + | 49 | 41 | (49) PL0 ** Pin35 ** D49 + |-----|----| (41) PG0 ** Pin51 ** D41 + | GND | NC | + ============ +*/ diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_15.h b/Marlin/src/pins/ramps/pins_MKS_BASE_15.h new file mode 100644 index 00000000..9e670d1b --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_15.h @@ -0,0 +1,35 @@ +/** + * 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 BASE v1.5 with A4982 stepper drivers and digital micro-stepping + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS BASE 1.5 only supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS BASE 1.5" +#define MKS_BASE_VERSION 15 + +#include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_16.h b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h new file mode 100644 index 00000000..42796acf --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_16.h @@ -0,0 +1,59 @@ +/** + * 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 BASE v1.6 with A4982 stepper drivers and digital micro-stepping + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS BASE 1.6 only supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS BASE 1.6" +#define MKS_BASE_VERSION 16 + +// +// Servos +// +#define SERVO1_PIN 12 // Digital 12 / Pin 25 + +// +// Omitted RAMPS pins +// +#ifndef SERVO2_PIN + #define SERVO2_PIN -1 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN -1 +#endif +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN -1 +#endif +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN -1 +#endif +#ifndef PS_ON_PIN + #define PS_ON_PIN -1 +#endif + +#include "pins_MKS_BASE_common.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h b/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h new file mode 100644 index 00000000..3ce138b9 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_HEROIC.h @@ -0,0 +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 . + * + */ +#pragma once + +/** + * MKS BASE with Heroic HR4982 stepper drivers + */ + +#include "pins_MKS_BASE_15.h" + +/** + * Some new boards use HR4982 (Heroic) instead of the A4982 (Allegro) stepper drivers. + * Most the functionality is similar, the HR variant obviously doesn't work with diode + * smoothers (no fast decay). And the Heroic has a 128 µStepping mode where the A4982 + * is doing quarter steps (MS1=0, MS2=1). + */ +#define HEROIC_STEPPER_DRIVERS diff --git a/Marlin/src/pins/ramps/pins_MKS_BASE_common.h b/Marlin/src/pins/ramps/pins_MKS_BASE_common.h new file mode 100644 index 00000000..9047a4bc --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_BASE_common.h @@ -0,0 +1,75 @@ +/** + * 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 BASE – Arduino Mega2560 with RAMPS pin assignments + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS BASE" +#endif + +#if MKS_BASE_VERSION >= 14 + // + // Heaters / Fans + // + // Power outputs EFBF or EFBE + #define MOSFET_D_PIN 7 + + // + // M3/M4/M5 - Spindle/Laser Control + // + #if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 2 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 15 // Pullup! + #define SPINDLE_DIR_PIN 19 + #endif + + #ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 2 + #endif + +#endif + +// +// Microstepping pins +// +#if MKS_BASE_VERSION >= 14 // |===== 1.4 =====|===== 1.5+ =====| + #define X_MS1_PIN 5 // PE3 | Pin 5 | PWM5 | | D3 | SERVO2_PIN + #define X_MS2_PIN 6 // PH3 | Pin 15 | PWM6 | Pin 14 | D6 | SERVO1_PIN + #define Y_MS1_PIN 59 // PF5 | Pin 92 | A5 | | | + #define Y_MS2_PIN 58 // PF4 | Pin 93 | A4 | | | + #define Z_MS1_PIN 22 // PA0 | Pin 78 | D22 | | | + #define Z_MS2_PIN 39 // PG2 | Pin 70 | D39 | | | + #if MKS_BASE_VERSION == 14 + #define E0_MS1_PIN 64 // PK2 | Pin 87 | A10 | | | + #define E0_MS2_PIN 63 // PK1 | Pin 88 | A9 | | | + #else + #define E0_MS1_PIN 63 // PK1 | | | Pin 86 | A9 | + #define E0_MS2_PIN 64 // PK2 | | | Pin 87 | A10 | + #endif + #define E1_MS1_PIN 57 // PF3 | Pin 94 | A3 | Pin 93 | A3 | + #define E1_MS2_PIN 4 // PG5 | Pin 1 | PWM4 | | D4 | SERVO3_PIN +#endif + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h new file mode 100644 index 00000000..08dd0f44 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h @@ -0,0 +1,147 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.4 adjusted pin assignments + * + * MKS GEN v1.3 (Extruder, Fan, Bed) + * MKS GEN v1.3 (Extruder, Extruder, Fan, Bed) + * MKS GEN v1.4 (Extruder, Fan, Bed) + * MKS GEN v1.4 (Extruder, Extruder, Fan, Bed) + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS GEN 1.3/1.4 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS GEN >= v1.3" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +// +// PSU / SERVO +// +// If PSU_CONTROL is specified, always hijack Servo 3 +// +#if ENABLED(PSU_CONTROL) + #define SERVO3_PIN -1 + #define PS_ON_PIN 4 +#endif + +#include "pins_RAMPS.h" + +// +// LCD / Controller +// +#if ANY(VIKI2, miniVIKI) + /** + * VIKI2 Has two groups of wires with... + * + * +Vin + Input supply, requires 120ma for LCD and mSD card + * GND Ground Pin + * MOSI Data input for LCD and SD + * MISO Data output for SD + * SCK Clock for LCD and SD + * AO Reg. Sel for LCD + * LCS Chip Select for LCD + * SDCS Chip Select for SD + * SDCD Card Detect pin for SD + * ENCA Encoder output A + * ENCB Encoder output B + * ENCBTN Encoder button switch + * + * BTN Panel mounted button switch + * BUZZER Piezo buzzer + * BLUE-LED Blue LED ring pin (3 to 5v, mosfet buffered) + * RED-LED Red LED ring pin (3 to 5v, mosfet buffered) + * + * This configuration uses the following arrangement: + * + * EXP1 D37 = EN2 D35 = EN1 EXP2 D50 = MISO D52 = SCK + * D17 = BLUE D16 = RED D31 = ENC D53 = SDCS + * D23 = KILL D25 = BUZZ D33 = --- D51 = MOSI + * D27 = A0 D29 = LCS D49 = SDCD RST = --- + * GND = GND 5V = 5V GND = --- D41 = --- + */ + + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #undef DOGLCD_A0 + #undef DOGLCD_CS + #undef SD_DETECT_PIN + #undef BEEPER_PIN + #undef KILL_PIN + #undef STAT_LED_RED_PIN + #undef STAT_LED_BLUE_PIN + + // + // VIKI2 12-wire lead + // + + // orange/white SDCD + #define SD_DETECT_PIN 49 + + // white ENCA + #define BTN_EN1 35 + + // green ENCB + #define BTN_EN2 37 + + // purple ENCBTN + #define BTN_ENC 31 + + // brown A0 + #define DOGLCD_A0 27 + + // green/white LCS + #define DOGLCD_CS 29 + + // 50 gray MISO + // 51 yellow MOSI + // 52 orange SCK + + // blue SDCS + //#define SDSS 53 + + // + // VIKI2 4-wire lead + // + + // blue BTN + #define KILL_PIN 23 + + // green BUZZER + #define BEEPER_PIN 25 + + // yellow RED-LED + #define STAT_LED_RED_PIN 16 + + // white BLUE-LED + #define STAT_LED_BLUE_PIN 17 + +#endif diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h new file mode 100644 index 00000000..522a34cd --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h @@ -0,0 +1,53 @@ +/** + * 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 GEN L – Arduino Mega2560 with RAMPS v1.4 pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS GEN L supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS GEN L" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +// +// CS Pins wired to avoid conflict with the LCD +// See https://www.thingiverse.com/asset:66604 +// + +#ifndef X_CS_PIN + #define X_CS_PIN 59 +#endif + +#ifndef Y_CS_PIN + #define Y_CS_PIN 63 +#endif + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h new file mode 100644 index 00000000..20f3dece --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V2.h @@ -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 . + * + */ +#pragma once + +/** + * MKS GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS GEN L V2 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS GEN L V2" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +// +// CS Pins wired to avoid conflict with the LCD +// See https://www.thingiverse.com/asset:66604 +// + +#ifndef X_CS_PIN + #define X_CS_PIN 63 +#endif + +#ifndef Y_CS_PIN + #define Y_CS_PIN 64 +#endif + +#ifndef Z_CS_PIN + #define Z_CS_PIN 65 +#endif + +#ifndef E0_CS_PIN + #define E0_CS_PIN 66 +#endif + +#ifndef E1_CS_PIN + #define E1_CS_PIN 21 +#endif + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 3 +#define Y_DIAG_PIN 14 +#define Z_DIAG_PIN 18 +#define E0_DIAG_PIN 2 +#define E1_DIAG_PIN 15 + +#ifndef SERVO1_PIN + #define SERVO1_PIN 12 +#endif +#ifndef SERVO2_PIN + #define SERVO2_PIN 39 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN 32 +#endif + +#ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN 20 +#endif +#ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN 21 +#endif + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h new file mode 100644 index 00000000..24e04a39 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L_V21.h @@ -0,0 +1,85 @@ +/** + * 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 GEN L V2 – Arduino Mega2560 with RAMPS v1.4 pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS GEN L V2.1 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS GEN L V2.1" + +// +// Heaters / Fans +// +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +// +// CS Pins wired to avoid conflict with the LCD +// See https://www.thingiverse.com/asset:66604 +// + +#ifndef X_CS_PIN + #define X_CS_PIN 63 +#endif +#ifndef Y_CS_PIN + #define Y_CS_PIN 64 +#endif +#ifndef Z_CS_PIN + #define Z_CS_PIN 65 +#endif +#ifndef E0_CS_PIN + #define E0_CS_PIN 66 +#endif +#ifndef E1_CS_PIN + #define E1_CS_PIN 12 +#endif + +// TMC2130 Diag Pins (currently just for reference) +#define X_DIAG_PIN 3 +#define Y_DIAG_PIN 14 +#define Z_DIAG_PIN 18 +#define E0_DIAG_PIN 2 +#define E1_DIAG_PIN 15 + +#ifndef SERVO1_PIN + #define SERVO1_PIN 21 +#endif +#ifndef SERVO2_PIN + #define SERVO2_PIN 39 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN 32 +#endif + +#ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN 20 +#endif +#ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN 12 +#endif + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_ORTUR_4.h b/Marlin/src/pins/ramps/pins_ORTUR_4.h new file mode 100644 index 00000000..cef01bf6 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_ORTUR_4.h @@ -0,0 +1,116 @@ +/** + * 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 + +/** + * Ortur 4 Arduino Mega based on RAMPS v1.4 pin assignments + */ + +#define BOARD_INFO_NAME "Ortur 4.3" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Servos +// +#define SERVO0_PIN 29 + +// +// Limit Switches +// +#define X_MAX_PIN 18 +#define Z_MIN_PIN 63 + +#define Z_MIN_PROBE_PIN 2 +#define FIL_RUNOUT_PIN 59 + +// +// Steppers +// +#define E0_CS_PIN 44 +#define E1_CS_PIN 42 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 15 // Analog Input +#define TEMP_1_PIN 13 // Analog Input + +// +// Software serial +// +#define X_SERIAL_TX_PIN 59 +#define X_SERIAL_RX_PIN 63 + +#define Y_SERIAL_TX_PIN 64 +#define Y_SERIAL_RX_PIN 40 + +#define Z_SERIAL_TX_PIN 44 +#define Z_SERIAL_RX_PIN 42 + +#define E0_SERIAL_TX_PIN 66 +#define E0_SERIAL_RX_PIN 65 + +#include "pins_RAMPS.h" + +// +// Steppers +// +#undef E0_STEP_PIN +#undef E0_DIR_PIN +#undef E0_ENABLE_PIN +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 24 + +// +// LCD / Controller +// +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #undef BEEPER_PIN + #define BEEPER_PIN 35 + + #undef LCD_PINS_RS + #undef LCD_PINS_ENABLE + #undef LCD_PINS_D4 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 23 + #define LCD_PINS_D4 37 + + #undef LCD_SDSS + #undef SD_DETECT_PIN + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #undef BTN_EN1 + #undef BTN_EN2 + #undef BTN_ENC + #define BTN_EN1 29 + #define BTN_EN2 25 + #define BTN_ENC 16 +#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h new file mode 100644 index 00000000..de56d2b5 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -0,0 +1,775 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.4 (or v1.3) pin assignments + * + * Applies to the following boards: + * + * RAMPS_14_EFB (Hotend, Fan, Bed) + * RAMPS_14_EEB (Hotend0, Hotend1, Bed) + * RAMPS_14_EFF (Hotend, Fan0, Fan1) + * RAMPS_14_EEF (Hotend0, Hotend1, Fan) + * RAMPS_14_SF (Spindle, Controller Fan) + * + * RAMPS_13_EFB (Hotend, Fan, Bed) + * RAMPS_13_EEB (Hotend0, Hotend1, Bed) + * RAMPS_13_EFF (Hotend, Fan0, Fan1) + * RAMPS_13_EEF (Hotend0, Hotend1, Fan) + * RAMPS_13_SF (Spindle, Controller Fan) + * + * Other pins_MYBOARD.h files may override these defaults + * + * Differences between + * RAMPS_13 | RAMPS_14 + * 7 | 11 + */ + +#ifdef TARGET_LPC1768 + #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." +#elif defined(__STM32F1__) + #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." +#endif + +#if NOT_TARGET(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768, __AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "RAMPS 1.4" +#endif + +// +// Servos +// +#ifndef SERVO0_PIN + #ifdef IS_RAMPS_13 + #define SERVO0_PIN 7 + #else + #define SERVO0_PIN 11 + #endif +#endif +#ifndef SERVO1_PIN + #define SERVO1_PIN 6 +#endif +#ifndef SERVO2_PIN + #define SERVO2_PIN 5 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN 4 +#endif + +// +// Limit Switches +// +#ifndef X_STOP_PIN + #ifndef X_MIN_PIN + #define X_MIN_PIN 3 + #endif + #ifndef X_MAX_PIN + #define X_MAX_PIN 2 + #endif +#endif +#ifndef Y_STOP_PIN + #ifndef Y_MIN_PIN + #define Y_MIN_PIN 14 + #endif + #ifndef Y_MAX_PIN + #define Y_MAX_PIN 15 + #endif +#endif +#ifndef Z_STOP_PIN + #ifndef Z_MIN_PIN + #define Z_MIN_PIN 18 + #endif + #ifndef Z_MAX_PIN + #define Z_MAX_PIN 19 + #endif +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 53 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN 49 +#endif + +#ifndef Z_STEP_PIN + #define Z_STEP_PIN 46 +#endif +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN 40 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 42 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN 44 +#endif + +// +// Temperature Sensors +// +#ifndef TEMP_0_PIN + #define TEMP_0_PIN 13 // Analog Input +#endif +#ifndef TEMP_1_PIN + #define TEMP_1_PIN 15 // Analog Input +#endif +#ifndef TEMP_BED_PIN + #define TEMP_BED_PIN 14 // Analog Input +#endif + +// +// SPI for Max6675 or Max31855 Thermocouple +// +#ifndef MAX6675_SS_PIN + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card (SDSS) or 49 (SD_DETECT_PIN) +#endif + +// +// Augmentation for auto-assigning RAMPS plugs +// +#if NONE(IS_RAMPS_EEB, IS_RAMPS_EEF, IS_RAMPS_EFB, IS_RAMPS_EFF, IS_RAMPS_SF) && !PIN_EXISTS(MOSFET_D) + #if HAS_MULTI_HOTEND + #if TEMP_SENSOR_BED + #define IS_RAMPS_EEB + #else + #define IS_RAMPS_EEF + #endif + #elif TEMP_SENSOR_BED + #define IS_RAMPS_EFB + #else + #define IS_RAMPS_EFF + #endif +#endif + +// +// Heaters / Fans +// +#ifndef MOSFET_D_PIN + #define MOSFET_D_PIN -1 +#endif +#ifndef RAMPS_D8_PIN + #define RAMPS_D8_PIN 8 +#endif +#ifndef RAMPS_D9_PIN + #define RAMPS_D9_PIN 9 +#endif +#ifndef RAMPS_D10_PIN + #define RAMPS_D10_PIN 10 +#endif + +#define HEATER_0_PIN RAMPS_D10_PIN + +#if ENABLED(IS_RAMPS_EFB) // Hotend, Fan, Bed + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EEF) // Hotend, Hotend, Fan + #define HEATER_1_PIN RAMPS_D9_PIN +#elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define HEATER_1_PIN RAMPS_D9_PIN + #define HEATER_BED_PIN RAMPS_D8_PIN +#elif ENABLED(IS_RAMPS_EFF) // Hotend, Fan, Fan + #define FAN1_PIN RAMPS_D8_PIN +#elif DISABLED(IS_RAMPS_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") + #define HEATER_BED_PIN RAMPS_D8_PIN + #if HOTENDS == 1 + #define FAN1_PIN MOSFET_D_PIN + #else + #define HEATER_1_PIN MOSFET_D_PIN + #endif +#endif + +#ifndef FAN_PIN + #if EITHER(IS_RAMPS_EFB, IS_RAMPS_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #define FAN_PIN RAMPS_D9_PIN + #elif EITHER(IS_RAMPS_EEF, IS_RAMPS_SF) // Hotend, Hotend, Fan or Spindle, Fan + #define FAN_PIN RAMPS_D8_PIN + #elif ENABLED(IS_RAMPS_EEB) // Hotend, Hotend, Bed + #define FAN_PIN 4 // IO pin. Buffer needed + #else // Non-specific are "EFB" (i.e., "EFBF" or "EFBE") + #define FAN_PIN RAMPS_D9_PIN + #endif +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif + +// RAMPS 1.4 DIO 4 on the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 4 +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) + #if NUM_SERVOS <= 1 // Prefer the servo connector + #define CASE_LIGHT_PIN 6 // Hardware PWM + #elif HAS_FREE_AUX2_PINS + #define CASE_LIGHT_PIN 44 // Hardware PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) + #if !NUM_SERVOS // Use servo connector if possible + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_DIR_PIN 5 + #elif HAS_FREE_AUX2_PINS + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_DIR_PIN 65 + #else + #error "No auto-assignable Spindle/Laser pins available." + #endif +#endif + +// +// TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 66 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 44 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 64 + #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 Serial1 + //#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 + // + + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN 40 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN 63 + #endif + #ifndef X2_SERIAL_TX_PIN + #define X2_SERIAL_TX_PIN -1 + #endif + #ifndef X2_SERIAL_RX_PIN + #define X2_SERIAL_RX_PIN -1 + #endif + + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN 59 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN 64 + #endif + #ifndef Y2_SERIAL_TX_PIN + #define Y2_SERIAL_TX_PIN -1 + #endif + #ifndef Y2_SERIAL_RX_PIN + #define Y2_SERIAL_RX_PIN -1 + #endif + + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN 42 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN 65 + #endif + #ifndef Z2_SERIAL_TX_PIN + #define Z2_SERIAL_TX_PIN -1 + #endif + #ifndef Z2_SERIAL_RX_PIN + #define Z2_SERIAL_RX_PIN -1 + #endif + + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN 44 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN 66 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN -1 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN -1 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN -1 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN -1 + #endif + #ifndef E3_SERIAL_TX_PIN + #define E3_SERIAL_TX_PIN -1 + #endif + #ifndef E3_SERIAL_RX_PIN + #define E3_SERIAL_RX_PIN -1 + #endif + #ifndef E4_SERIAL_TX_PIN + #define E4_SERIAL_TX_PIN -1 + #endif + #ifndef E4_SERIAL_RX_PIN + #define E4_SERIAL_RX_PIN -1 + #endif + #ifndef E5_SERIAL_TX_PIN + #define E5_SERIAL_TX_PIN -1 + #endif + #ifndef E5_SERIAL_RX_PIN + #define E5_SERIAL_RX_PIN -1 + #endif + #ifndef E6_SERIAL_TX_PIN + #define E6_SERIAL_TX_PIN -1 + #endif + #ifndef E6_SERIAL_RX_PIN + #define E6_SERIAL_RX_PIN -1 + #endif + #ifndef E7_SERIAL_TX_PIN + #define E7_SERIAL_TX_PIN -1 + #endif + #ifndef E7_SERIAL_RX_PIN + #define E7_SERIAL_RX_PIN -1 + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +#ifndef E_MUX0_PIN + #define E_MUX0_PIN 40 // Z_CS_PIN +#endif +#ifndef E_MUX1_PIN + #define E_MUX1_PIN 42 // E0_CS_PIN +#endif +#ifndef E_MUX2_PIN + #define E_MUX2_PIN 44 // E1_CS_PIN +#endif + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if HAS_WIRED_LCD + + // + // LCD Display output pins + // + #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 + + #elif BOTH(NEWPANEL, PANEL_ONE) + + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 65 + #define LCD_PINS_D5 66 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 64 + + #elif ENABLED(TFTGLCD_PANEL_SPI) + + #define TFTGLCD_CS 33 + + #else + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 25 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 37 + #endif + + #elif ENABLED(ZONESTAR_LCD) + + #define LCD_PINS_RS 64 + #define LCD_PINS_ENABLE 44 + #define LCD_PINS_D4 63 + #define LCD_PINS_D5 40 + #define LCD_PINS_D6 42 + #define LCD_PINS_D7 65 + + #else + + #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #define LCD_PINS_DC 25 // Set as output on init + #define LCD_PINS_RS 27 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS 16 + #define DOGLCD_MOSI 17 + #define DOGLCD_SCK 23 + #define DOGLCD_A0 LCD_PINS_DC + #else + #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 + #endif + + #define LCD_PINS_D7 29 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + #endif + + #endif + + #if DISABLED(NEWPANEL) + // 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 + #endif + + #endif + + // + // LCD Display input pins + // + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #if ENABLED(CR10_STOCKDISPLAY) + #define BTN_EN1 17 + #define BTN_EN2 23 + #else + #define BTN_EN1 31 + #define BTN_EN2 33 + #endif + + #define BTN_ENC 35 + #ifndef SD_DETECT_PIN + #define SD_DETECT_PIN 49 + #endif + #ifndef KILL_PIN + #define KILL_PIN 41 + #endif + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #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 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS SDSS + #define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #define BTN_EN1 40 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + #define BTN_EN2 42 + #define BTN_ENC -1 + + #define LCD_SDSS SDSS + #define SD_DETECT_PIN 49 + + #elif ANY(VIKI2, miniVIKI) + + #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define LCD_SCREEN_ROT_180 + + #define BEEPER_PIN 33 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board + #define KILL_PIN 31 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + + #define BEEPER_PIN 23 + #define LCD_BACKLIGHT_PIN 33 + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + + #define LCD_SDSS SDSS + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + + #define BEEPER_PIN 37 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + + #ifndef KILL_PIN + #define KILL_PIN 41 + #endif + + #if ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 27 + #define DOGLCD_CS 25 + + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + // not connected to a pin + #define LCD_BACKLIGHT_PIN -1 // 65 (MKS mini12864 can't adjust backlight by software!) + + #define BTN_EN1 31 + #define BTN_EN2 33 + + #elif ENABLED(FYSETC_MINI_12864) + + // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 + + #define DOGLCD_A0 16 + #define DOGLCD_CS 17 + + #define BTN_EN1 33 + #define BTN_EN2 31 + + //#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 23 // 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 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 + + #endif + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // not connected to a pin + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 64 + + #elif ENABLED(ZONESTAR_LCD) + + #define ADC_KEYPAD_PIN 12 + + #elif ENABLED(AZSMZ_12864) + + // Pins only defined for RAMPS_SMART currently + + #elif IS_TFTGLCD_PANEL + + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // Buttons are directly attached to AUX-2 + #if ENABLED(PANEL_ONE) + #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 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD + +#if ENABLED(REPRAPWORLD_KEYPAD) && DISABLED(ADC_KEYPAD) + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #ifndef BTN_EN1 + #define BTN_EN1 64 + #endif + #ifndef BTN_EN2 + #define BTN_EN2 59 + #endif + #ifndef BTN_ENC + #define BTN_ENC 63 + #endif +#endif + +#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + + #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_RAMPS.h' for details. Comment out this line to continue." + + /** FYSETC TFT TFT81050 display pinout + * + * Board Display + * _____ _____ + * (SCK) D52 | 1 2 | D50 (MISO) MISO | 1 2 | SCK + * (SD_CS) D53 | 3 4 | D33 (BNT_EN2) (BNT_EN2) MOD_RESET | 3 4 | SD_CS + * (MOSI) D51 | 5 6 D31 (BNT_EN1) (BNT_EN1) LCD_CS | 5 6 MOSI + * RESET | 7 8 | D49 (SD_DET) SD_DET | 7 8 | RESET + * NC | 9 10| GND GND | 9 10| 5V + * ----- ----- + * EXP2 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP2-1 ----------- EXP1-10 + * EXP2-2 ----------- EXP1-9 + * EXP2-4 ----------- EXP1-8 + * EXP2-4 ----------- EXP1-7 + * EXP2-3 ----------- EXP1-6 + * EXP2-6 ----------- EXP1-5 + * EXP2-7 ----------- EXP1-4 + * EXP2-8 ----------- EXP1-3 + * EXP2-1 ----------- EXP1-2 + * EXP1-10 ----------- EXP1-1 + * + * NOTE: The MISO pin should not get a 5V signal. + * To fix, insert a 1N4148 diode in the MISO line. + */ + + #define BEEPER_PIN 37 + + #define SD_DETECT_PIN 49 + + #define CLCD_MOD_RESET 31 + #define CLCD_SPI_CS 33 +#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_13.h b/Marlin/src/pins/ramps/pins_RAMPS_13.h new file mode 100644 index 00000000..6e7c8cba --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_13.h @@ -0,0 +1,42 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.3 pin assignments + * + * Applies to the following boards: + * + * RAMPS_13_EFB (Extruder, Fan, Bed) + * RAMPS_13_EEB (Extruder, Extruder, Bed) + * RAMPS_13_EFF (Extruder, Fan, Fan) + * RAMPS_13_EEF (Extruder, Extruder, Fan) + * RAMPS_13_SF (Spindle, Controller Fan) + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "RAMPS 1.3" +#endif + +#define IS_RAMPS_13 + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h new file mode 100644 index 00000000..1dc898e6 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h @@ -0,0 +1,68 @@ +/** + * 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 + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Creality3D RAMPS supports only 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Creality3D RAMPS" + +// +// Heaters / Fans +// + +// Power outputs EFBF or EFBE +#define MOSFET_D_PIN 7 + +#define FIL_RUNOUT_PIN 2 +#if NUM_RUNOUT_SENSORS > 1 + #define FIL_RUNOUT2_PIN 15 // Creality CR-X can use dual runout sensors +#endif + +#ifndef SD_DETECT_PIN + #define SD_DETECT_PIN 49 // Always define onboard SD detect +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 40 // Used by CR2020 Industrial series +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) + #define CASE_LIGHT_PIN 65 +#endif + +#include "pins_RAMPS.h" + +#ifndef BEEPER_PIN + #define BEEPER_PIN 37 // Always define beeper pin so Play Tone works with ExtUI +#endif + +#define EXP1_PIN 65 // A11 - Used by CR2020 Industrial series for case +#define EXP2_PIN 66 // A12 +#define EXP3_PIN 11 // SERVO0_PIN +#define EXP4_PIN 12 // PS_ON_PIN + +#define SUICIDE_PIN 12 // Used by CR2020 Industrial series +#ifndef SUICIDE_PIN_INVERTING + #define SUICIDE_PIN_INVERTING true +#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h b/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h new file mode 100644 index 00000000..ad56b7f9 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_DAGOMA.h @@ -0,0 +1,42 @@ +/** + * 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 + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Dagoma3D F5 RAMPS supports only 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Dagoma3D F5 RAMPS" + +#define X_STOP_PIN 2 +#define Y_STOP_PIN 3 +#define Z_STOP_PIN 15 +#define FIL_RUNOUT_PIN 39 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 7 +#endif + +// +// Import RAMPS 1.4 pins +// +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h new file mode 100644 index 00000000..513c7fe8 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h @@ -0,0 +1,41 @@ +/** + * 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 + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "Ender-4 supports only 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Ender-4" + +#include "pins_RAMPS.h" + +// The board only has one PWM fan connector. The others are 12V always-on. +// The default config uses this pin to control the brightness of the LED +// band (case light). Thus the hotend and controller fans are always-on. + +#if ENABLED(CASE_LIGHT_ENABLE) + #undef FAN_PIN + #ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN RAMPS_D9_PIN + #endif +#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h new file mode 100644 index 00000000..6d2dad23 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h @@ -0,0 +1,119 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.0, v1.1, v1.2 pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RAMPS <1.2" + +// Uncomment the following line for RAMPS v1.0 +//#define RAMPS_V_1_0 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 16 +#define Y_MAX_PIN 17 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 +#endif + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 28 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 38 +#define Y_DIR_PIN 40 +#define Y_ENABLE_PIN 36 + +#define Z_STEP_PIN 44 +#define Z_DIR_PIN 46 +#define Z_ENABLE_PIN 42 + +#define E0_STEP_PIN 32 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// Heaters / Fans +// +#if ENABLED(RAMPS_V_1_0) + #define HEATER_0_PIN 12 + #define HEATER_BED_PIN -1 + #ifndef FAN_PIN + #define FAN_PIN 11 + #endif +#else // RAMPS_V_1_1 or RAMPS_V_1_2 + #define HEATER_0_PIN 10 + #define HEATER_BED_PIN 8 + #ifndef FAN_PIN + #define FAN_PIN 9 + #endif +#endif + +// +// Misc. Functions +// +#define SDPOWER_PIN 48 +#define SDSS 53 +#define LED_PIN 13 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 45 // Hardware PWM +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 41 // Pullup or pulldown! +#define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM +#define SPINDLE_DIR_PIN 43 diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h new file mode 100644 index 00000000..9908d949 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -0,0 +1,85 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.4Plus, also known as 3DYMY version, pin assignments + * The differences to the RAMPS v1.4 are: + * - Swap heater E0 with E1 + * - Swap pins 8 and 10. Bed/Fan/Hotend as labeled on the board are on pins 8/9/10. + * - Change pins 16->42, 17->44 and 29->53 used for display. + * + * Applies to the following boards: + * + * RAMPS_PLUS_EFB (Extruder, Fan, Bed) + * RAMPS_PLUS_EEB (Extruder, Extruder, Bed) + * RAMPS_PLUS_EFF (Extruder, Fan, Fan) + * RAMPS_PLUS_EEF (Extruder, Extruder, Fan) + * RAMPS_PLUS_SF (Spindle, Controller Fan) + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RAMPS 1.4 Plus" + +#define RAMPS_D8_PIN 10 +#define RAMPS_D10_PIN 8 + +#include "pins_RAMPS.h" + +// +// Steppers - Swap E0 / E1 on 3DYMY +// +#undef E0_STEP_PIN +#undef E0_DIR_PIN +#undef E0_ENABLE_PIN + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN + +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 24 + +#undef X_CS_PIN +#undef Y_CS_PIN +#undef Z_CS_PIN +#undef E0_CS_PIN +#undef E1_CS_PIN + +#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 + #undef LCD_PINS_ENABLE + #define LCD_PINS_ENABLE 44 // 3DYMY boards pin 17 -> 44 + #endif + #undef LCD_PINS_D7 + #define LCD_PINS_D7 53 // 3DYMY boards pin 29 -> 53 +#endif diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h new file mode 100644 index 00000000..c43d786a --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD.h @@ -0,0 +1,135 @@ +/** + * 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 + +/** + * RIGIDBOARD Arduino Mega with RAMPS v1.4 pin assignments + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "RigidBoard" +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 19 // Z-MAX pin J14 End Stops +#endif + +// +// MOSFET changes +// +#define RAMPS_D9_PIN 8 // FAN (by default) +#define RAMPS_D10_PIN 9 // EXTRUDER 1 +#define MOSFET_D_PIN 12 // EXTRUDER 2 or FAN + +#include "pins_RAMPS.h" + +// +// Steppers +// +// RigidBot swaps E0 / E1 plugs vs RAMPS 1.3 +#undef E0_STEP_PIN +#undef E0_DIR_PIN +#undef E0_ENABLE_PIN +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 34 +#define E0_ENABLE_PIN 30 + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 24 + +#define STEPPER_RESET_PIN 41 // Stepper drivers have a reset on RigidBot + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#undef TEMP_1_PIN +#undef TEMP_BED_PIN +#define TEMP_0_PIN 14 // Analog Input +#define TEMP_1_PIN 13 // Analog Input +#define TEMP_BED_PIN 15 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#undef MAX6675_SS_PIN +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 53 // Don't use pin 53 if there is even the remote possibility of using Display/SD card +#else + #define MAX6675_SS_PIN 49 // Don't use pin 49 as this is tied to the switch inside the SD card socket to detect if there is an SD card present +#endif + +// +// Heaters / Fans +// +#undef HEATER_BED_PIN +#define HEATER_BED_PIN 10 + +#ifndef FAN_PIN + #define FAN_PIN 8 // Same as RAMPS_13_EEF +#endif + +// +// Misc. Functions +// +#undef PS_ON_PIN + +// +// LCD / Controller +// +// LCD Panel options for the RigidBoard +#if ENABLED(RIGIDBOT_PANEL) + + #undef BEEPER_PIN + #define BEEPER_PIN -1 + + // Direction buttons + #define BTN_UP 37 + #define BTN_DWN 35 + #define BTN_LFT 33 + #define BTN_RT 32 + + // 'R' button + #undef BTN_ENC + #define BTN_ENC 31 + + // Disable encoder + #undef BTN_EN1 + #undef BTN_EN2 + + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 22 + +#elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 22 + + #undef KILL_PIN + #define KILL_PIN 32 + +#endif diff --git a/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h new file mode 100644 index 00000000..1428de31 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RIGIDBOARD_V2.h @@ -0,0 +1,52 @@ +/** + * 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 + +/** + * RIGIDBOARD V2 Arduino Mega with RAMPS v1.4 pin assignments + */ + +#define BOARD_INFO_NAME "RigidBoard V2" + +#include "pins_RIGIDBOARD.h" + +// +// Steppers +// + +// I2C based DAC like on the Printrboard REVF +#define HAS_MOTOR_CURRENT_DAC + +// Channels available for DAC, For Rigidboard there are 4 +#define DAC_STEPPER_ORDER { 0, 1, 2, 3 } + +#define DAC_STEPPER_SENSE 0.05 // sense resistors on rigidboard stepper chips are .05 value +#define DAC_STEPPER_ADDRESS 0 +#define DAC_STEPPER_MAX 4096 // was 5000 but max allowable value is actually 4096 +#define DAC_STEPPER_VREF 1 // internal Vref, gain 2x = 4.096V +#define DAC_STEPPER_GAIN 1 // value of 1 here sets gain of 2 +#define DAC_DISABLE_PIN 42 // set low to enable DAC +#define DAC_OR_ADDRESS 0x01 + +#ifndef DAC_MOTOR_CURRENT_DEFAULT + #define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis +#endif diff --git a/Marlin/src/pins/ramps/pins_RL200.h b/Marlin/src/pins/ramps/pins_RL200.h new file mode 100644 index 00000000..3fccb902 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RL200.h @@ -0,0 +1,52 @@ +/** + * 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 + +/** + * Rapide Lite 200 v1 (RUMBA clone) pin assignments. Has slightly different assignment for + * extruder motors due to dual Z motors. Pinout therefore based on pins_RUMBA.h. + */ + +#define BOARD_INFO_NAME "RL200" +#define DEFAULT_MACHINE_NAME "Rapide Lite 200" + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "RL200v1 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#elif NUM_Z_STEPPER_DRIVERS != 2 + #error "RL200 uses dual Z stepper motors. Set NUM_Z_STEPPER_DRIVERS to 2 or comment out this line to continue." +#elif !(AXIS_DRIVER_TYPE_X(DRV8825) && AXIS_DRIVER_TYPE_Y(DRV8825) && AXIS_DRIVER_TYPE_Z(DRV8825) && AXIS_DRIVER_TYPE_Z2(DRV8825) && AXIS_DRIVER_TYPE_E0(DRV8825)) + #error "You must set ([XYZ]|Z2|E0)_DRIVER_TYPE to DRV8825 in Configuration.h for RL200." +#endif + +#define E0_STEP_PIN 26 // (RUMBA E1 pins) +#define E0_DIR_PIN 25 +#define E0_ENABLE_PIN 27 + +#define E1_STEP_PIN 29 // (RUMBA E2 pins) +#define E1_DIR_PIN 28 +#define E1_ENABLE_PIN 39 + +#define Z2_STEP_PIN 23 // (RUMBA E0 pins) +#define Z2_DIR_PIN 22 +#define Z2_ENABLE_PIN 24 + +#include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h new file mode 100644 index 00000000..5be2896e --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -0,0 +1,234 @@ +/** + * 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 + +/** + * RUMBA pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 3 || E_STEPPERS > 3 + #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Rumba" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +// +// Servos +// +#define SERVO0_PIN 5 + +// +// Limit Switches +// +#define X_MIN_PIN 37 +#define X_MAX_PIN 36 +#define Y_MIN_PIN 35 +#define Y_MAX_PIN 34 +#define Z_MIN_PIN 33 +#define Z_MAX_PIN 32 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 48 + +#define Y_STEP_PIN 54 +#define Y_DIR_PIN 47 +#define Y_ENABLE_PIN 55 + +#define Z_STEP_PIN 57 +#define Z_DIR_PIN 56 +#define Z_ENABLE_PIN 62 + +#ifndef E0_STEP_PIN + #define E0_STEP_PIN 23 + #define E0_DIR_PIN 22 + #define E0_ENABLE_PIN 24 +#endif + +#ifndef E1_STEP_PIN + #define E1_STEP_PIN 26 + #define E1_DIR_PIN 25 + #define E1_ENABLE_PIN 27 +#endif + +#if E1_STEP_PIN != 29 + #define E2_STEP_PIN 29 + #define E2_DIR_PIN 28 + #define E2_ENABLE_PIN 39 +#endif + +// +// Temperature Sensors +// +#ifndef TEMP_0_PIN + #if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 6 // Analog Input (connector *K1* on RUMBA thermocouple ADD ON is used) + #else + #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) + #endif +#endif + +#ifndef TEMP_1_PIN + #if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 5 // Analog Input (connector *K2* on RUMBA thermocouple ADD ON is used) + #else + #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) + #endif +#endif + +#if TEMP_SENSOR_2 == -1 + #define TEMP_2_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_BED is defined as thermocouple) +#else + #define TEMP_2_PIN 13 // Analog Input (default connector for thermistor *T2* on rumba board is used) +#endif + +// Optional for extruder 4 or chamber: +//#define TEMP_X_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) + +#ifndef TEMP_CHAMBER_PIN + //#define TEMP_CHAMBER_PIN 12 // Analog Input (default connector for thermistor *T3* on rumba board is used) +#endif + +#if TEMP_SENSOR_BED == -1 + #define TEMP_BED_PIN 7 // Analog Input (connector *K3* on RUMBA thermocouple ADD ON is used <-- this can't be used when TEMP_SENSOR_2 is defined as thermocouple) +#else + #define TEMP_BED_PIN 11 // Analog Input (default connector for thermistor *THB* on rumba board is used) +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_2_PIN 6 +#define HEATER_3_PIN 8 +#define HEATER_BED_PIN 9 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif +#ifndef FAN1_PIN + #define FAN1_PIN 8 +#endif + +// +// Misc. Functions +// +#define LED_PIN 13 +#define PS_ON_PIN 45 +#define KILL_PIN 46 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 45 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#ifndef SPINDLE_LASER_PWM_PIN + #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM. Pin 4 interrupts OC0* and OC1* always in use? +#endif +#ifndef SPINDLE_LASER_ENA_PIN + #define SPINDLE_LASER_ENA_PIN 14 // Pullup! +#endif +#ifndef SPINDLE_DIR_PIN + #define SPINDLE_DIR_PIN 15 +#endif + +// +// LCD / Controller +// +#if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #define LCD_PINS_DC 38 // Set as output on init + #define LCD_PINS_RS 41 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS 19 + #define DOGLCD_MOSI 42 + #define DOGLCD_SCK 18 + #define DOGLCD_A0 LCD_PINS_DC +#elif ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS 42 + #define DOGLCD_A0 19 + #define DOGLCD_MOSI 51 + #define DOGLCD_SCK 52 + + //#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 18 // 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 41 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN 38 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN 40 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN 25 + #endif + +#else + #define LCD_PINS_RS 19 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 18 + #define LCD_PINS_D5 38 + #define LCD_PINS_D6 41 +#endif + +#define LCD_PINS_D7 40 + +// +// Beeper, SD Card, Encoder +// +#define BEEPER_PIN 44 + +#if ENABLED(SDSUPPORT) + #define SDSS 53 + #define SD_DETECT_PIN 49 +#endif + +#if ENABLED(NEWPANEL) + #define BTN_EN1 11 + #define BTN_EN2 12 + #define BTN_ENC 43 +#endif diff --git a/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h b/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h new file mode 100644 index 00000000..39942613 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RUMBA_RAISE3D.h @@ -0,0 +1,31 @@ +/** + * 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 BOARD_INFO_NAME "Raise3D Rumba" +#define DEFAULT_MACHINE_NAME "Raise3D N Series" + +// Raise3D uses thermocouples on the standard input pins +#define TEMP_0_PIN 15 // Analog Input +#define TEMP_1_PIN 14 // Analog Input + +#include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h b/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h new file mode 100644 index 00000000..e15fc94a --- /dev/null +++ b/Marlin/src/pins/ramps/pins_SAINSMART_2IN1.h @@ -0,0 +1,42 @@ +/** + * 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 + +/** + * Sainsmart 2-in-1 pin assignments + */ + +#if HOTENDS > 2 || E_STEPPERS > 2 + #error "Sainsmart 2-in-1 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Sainsmart" + +// +// Heaters / Fans +// +#define RAMPS_D10_PIN 9 // E +#define RAMPS_D9_PIN 7 // F PART FAN in front of board next to Extruder heat + // RAMPS_D8_PIN 8 // B +#define MOSFET_D_PIN 10 // F / E + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_TANGO.h b/Marlin/src/pins/ramps/pins_TANGO.h new file mode 100644 index 00000000..715444ce --- /dev/null +++ b/Marlin/src/pins/ramps/pins_TANGO.h @@ -0,0 +1,53 @@ +/** + * 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 + +/** + * BIQU Tango pin assignments + */ + +#define BOARD_INFO_NAME "Tango" + +#define FAN_PIN 8 +#define FAN1_PIN -1 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 7 +#endif + +#ifndef TEMP_0_PIN + #if TEMP_SENSOR_0 == -1 + #define TEMP_0_PIN 10 // Analog Input (connector *K1* on Tango thermocouple ADD ON is used) + #else + #define TEMP_0_PIN 15 // Analog Input (default connector for thermistor *T0* on rumba board is used) + #endif +#endif + +#ifndef TEMP_1_PIN + #if TEMP_SENSOR_1 == -1 + #define TEMP_1_PIN 9 // Analog Input (connector *K2* on Tango thermocouple ADD ON is used) + #else + #define TEMP_1_PIN 14 // Analog Input (default connector for thermistor *T1* on rumba board is used) + #endif +#endif + +#include "pins_RUMBA.h" diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h new file mode 100644 index 00000000..e7a59a69 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h @@ -0,0 +1,185 @@ +/** + * 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 + +/** + * Tenlog pin assignments + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Tenlog supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Tenlog D3 Hero" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN 6 +#define SERVO2_PIN -1 // Original pin 5 used for hotend fans +#define SERVO3_PIN 4 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 14 +//#define Y_MAX_PIN 15 // Connected to "DJ" plug on extruder heads +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 15 // Ramps is normally 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +//#ifndef X_CS_PIN + //#define X_CS_PIN 53 +//#endif + +#define X2_STEP_PIN 36 +#define X2_DIR_PIN 34 +#define X2_ENABLE_PIN 30 +//#ifndef X2_CS_PIN + //#define X2_CS_PIN 53 +//#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +//#ifndef Y_CS_PIN + //#define Y_CS_PIN 49 +//#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +//#ifndef Z_CS_PIN + //#define Z_CS_PIN 40 +//#endif + +#define Z2_STEP_PIN 65 +#define Z2_DIR_PIN 66 +#define Z2_ENABLE_PIN 64 +//#ifndef Z2_CS_PIN + //#define Z2_CS_PIN 40 +//#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +//#ifndef E0_CS_PIN + //define E0_CS_PIN 42 +//#endif + +#define E1_STEP_PIN 57 +#define E1_DIR_PIN 58 +#define E1_ENABLE_PIN 59 +//#ifndef E1_CS_PIN + //define E1_CS_PIN 44 +//#endif + +//#define E2_STEP_PIN 42 +//#define E2_DIR_PIN 43 +//#define E2_ENABLE_PIN 44 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_BED_PIN 14 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN -1 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN -1 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 11 +#define HEATER_BED_PIN 8 + +#define FAN_PIN 9 +#define FAN1_PIN 5 // Normall this would be a servo pin + +// XXX Runout support unknown? +//#define NUM_RUNOUT_SENSORS 0 +//#define FIL_RUNOUT_PIN 22 +//#define FIL_RUNOUT2_PIN 21 + +// +// Misc. Functions +// +//#define CASE_LIGHT_PIN 5 +#define SDSS 53 +//#ifndef LED_PIN + //#define LED_PIN 13 +//#endif + +//#define SPINDLE_LASER_PWM_PIN -1 // Hardware PWM +//#define SPINDLE_LASER_ENA_PIN 4 // Pullup! + +// Use the RAMPS 1.4 Analog input 5 on the AUX2 connector +//#define FILWIDTH_PIN 5 // Analog Input + +// +// LCD / Controller +// + +//#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + +#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 31 +//#define BTN_EN2 33 +//#define BTN_ENC 35 +#define SD_DETECT_PIN 49 +//#ifndef KILL_PIN + //#define KILL_PIN 41 +//#endif +//#ifndef BEEPER_PIN +#define BEEPER_PIN -1 +//#endif + +//#endif // REPRAP_DISCOUNT_SMART_CONTROLLER diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h new file mode 100644 index 00000000..9508be01 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_13.h @@ -0,0 +1,43 @@ +/** + * 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 + +/** + * Arduino Mega with RAMPS v1.3 for Anycubic + */ + +#define BOARD_INFO_NAME "Anycubic RAMPS 1.3" + +#define IS_RAMPS_EFB +#define RAMPS_D9_PIN 44 +#define FAN2_PIN 9 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 9 +#endif + +#include "pins_RAMPS_13.h" + +#undef E1_STEP_PIN +#undef E1_DIR_PIN +#undef E1_ENABLE_PIN +#undef E1_CS_PIN diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h new file mode 100644 index 00000000..1c2cb609 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.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 + +/** + * Arduino Mega with RAMPS v1.4 for Anycubic + */ + +#define BOARD_INFO_NAME "Anycubic RAMPS 1.4" + +// Board labeled pins: + +#define TG_HEATER_BED_PIN 8 +#define TG_HEATER_0_PIN 10 +#define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused + +#define TG_FAN0_PIN 9 // Anycubic Kossel: Usually the part cooling fan +#define TG_FAN1_PIN 7 // Anycubic Kossel: Unused +#define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan + +// +// 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: + +#define RAMPS_D10_PIN TG_HEATER_0_PIN // HEATER_0_PIN is always RAMPS_D10_PIN in pins_RAMPS.h + +#if HAS_MULTI_HOTEND // EEF and EEB + #define RAMPS_D9_PIN TG_HEATER_1_PIN + #if !TEMP_SENSOR_BED + // EEF + #define RAMPS_D8_PIN TG_FAN0_PIN + #else + // EEB + #define RAMPS_D8_PIN TG_HEATER_BED_PIN + #define FAN_PIN TG_FAN0_PIN // Override pin 4 in pins_RAMPS.h + #endif +#elif TEMP_SENSOR_BED + // EFB (Anycubic Kossel default) + #define RAMPS_D9_PIN TG_FAN0_PIN + #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 + #endif +#else + // EFF + #define RAMPS_D9_PIN TG_FAN1_PIN + #define RAMPS_D8_PIN TG_FAN0_PIN +#endif + +#if HAS_MULTI_HOTEND || TEMP_SENSOR_BED // EEF, EEB, EFB + #define FAN1_PIN TG_FAN1_PIN +#endif +#define FAN2_PIN TG_FAN2_PIN + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config +#endif + +#if ENABLED(ANYCUBIC_LCD_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_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_LCD_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" + +// +// AnyCubic made the following changes to 1.1.0-RC8 +// If these are appropriate for your LCD let us know. +// +#if 0 && HAS_WIRED_LCD + + // LCD Display output pins + #if BOTH(NEWPANEL, PANEL_ONE) + #undef LCD_PINS_D6 + #define LCD_PINS_D6 57 + #endif + + // LCD Display input pins + #if ENABLED(NEWPANEL) + #if ANY(VIKI2, miniVIKI) + #undef DOGLCD_A0 + #define DOGLCD_A0 23 + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #undef BEEPER_PIN + #define BEEPER_PIN 33 + #undef LCD_BACKLIGHT_PIN + #define LCD_BACKLIGHT_PIN 67 + #endif + #elif ENABLED(MINIPANEL) + #undef BEEPER_PIN + #define BEEPER_PIN 33 + #undef DOGLCD_A0 + #define DOGLCD_A0 42 + #endif + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h new file mode 100644 index 00000000..f342eff8 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h @@ -0,0 +1,279 @@ +/** + * 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 + +/** + * Arduino Mega for Tronxy X5S-2E, etc. + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "TRONXY-V3-1.0 supports only 2 hotends/E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "TRONXY-V3-1.0" + +// +// Servos +// +#define SERVO1_PIN 12 // 2560 PIN 25/PB6 + +// +// Import RAMPS 1.4 pins +// +#include "pins_RAMPS.h" + +/** + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== AUX-1 connector ===== + * + * 2 4 6 8 + * #----------------# + * #2 | ° ° ° ° | + * #1 | ° ° ° ° | + * NOTCH #------ ------# + * 1 3 5 7 + * + * ################################### + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################### + * # 1 | VCC | + # + * # 2 | VCC | + # + * # 3 | GND | - # + * # 4 | GND | - # + * # 5 | N/C | # + * # 6 | 3 / PE1 (TXD0) | D1 # + * # 7 | N/C | # + * # 8 | 2 / PE0 (RXD0) | D0 # + * ################################### + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== Limit Switch connectors ===== + * + * ############## X+ ################# + * X+ # Pin | ATMEGA2560 Pin | Arduino # + * 1 2 3 ################################### + * #- --- -# # 1 | 6 / PE4 (INT4) | D2 # + * | ° ° ° | # 2 | GND | - # + * #-------# # 3 | VCC | + # + * ################################### + * + * ############## X- ################# + * X- # Pin | ATMEGA2560 Pin | Arduino # + * 1 2 3 ################################### + * #- --- -# # 1 | 7 / PE5 (INT5) | D3 # + * | ° ° ° | # 2 | GND | - # + * #-------# # 3 | VCC | + # + * ################################### + * + * ############## Y+ ################# + * Y+ # Pin | ATMEGA2560 Pin | Arduino # + * 1 2 3 ################################### + * #- --- -# # 1 | 63/PJ0 (PCINT9) | D15 # + * | ° ° ° | # 2 | GND | - # + * #-------# # 3 | VCC | + # + * ################################### + * + * ############## Y- ################# + * Y- # Pin | ATMEGA2560 Pin | Arduino # + * 1 2 3 ################################### + * #- --- -# # 1 | 64/PJ1 (PCINT10)| D14 # + * | ° ° ° | # 2 | GND | - # + * #-------# # 3 | VCC | + # + * ################################### + * + * ############## Z+ ################# + * Z+ # Pin | ATMEGA2560 Pin | Arduino # + * 1 2 3 ################################### + * #- --- -# # 1 | 45 / PD2 (INT2) | D19 # + * | ° ° ° | # 2 | GND | - # + * #-------# # 3 | VCC | + # + * ################################### + * + * ############## Z- ################# + * Z- # Pin | ATMEGA2560 Pin | Arduino # + * 1 2 3 ################################### + * #- --- -# # 1 | 46 / PD3 (INT3) | D18 # + * | ° ° ° | # 2 | GND | - # + * #-------# # 3 | VCC | + # + * ################################### + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== EXP1/EXP2 connectors ===== + * + * (NOTE ORDER) EXP2 EXP1 + * 2 4 6 8 10 2 4 6 8 10 + * #-------------------# #-------------------# + * #2 | ° ° ° ° ° | #2 | ° ° ° ° ° | + * #1 | ° ° ° ° ° | #1 | ° ° ° ° ° | + * NOTCH #-------- -------# NOTCH #-------- -------# + * 1 3 5 7 9 1 3 5 7 9 + * + * ############# EXP1 ################ + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################### + * # 1 | 53 / PC0 | D37 # + * # 2 | 55 / PC2 | D35 # + * # 3 | 12 / PH0 (RXD2) | D17 # + * # 4 | 13 / PH1 (TXD2) | D16 # + * # 5 | 77 / PA1 | D23 # + * # 6 | 75 / PA3 | D25 # + * # 7 | 73 / PA5 | D27 # + * # 8 | 71 / PA7 | D29 # + * # 9 | GND | - # + * # 10 | VCC | + # + * ################################### + * + * ############# EXP2 ################ + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################### + * # 1 | 22 / PB3 (MISO) | D50 # + * # 2 | 20 / PB1 (SCK) | D52 # + * # 3 | 59 / PC6 | D31 # + * # 4 | N/C | # + * # 5 | 57 / PC4 | D33 # + * # 6 | 21 / PB2 (MOSI) | D51 # + * # 7 | N/C | # + * # 8 | 30 / !RESET | RESET # + * # 9 | GND | - # + * # 10 | 51 / PG0 | D41 # + * ################################### + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== ICSP connector ===== + * + * 2 4 6 + * #---------# + * | ° ° ° | + * | ° ° ° | + * #---------# + * 1 3 5 + * + * ################################## + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################## + * # 1 | 22 / PB3 (MISO)| 50 # + * # 2 | VCC | + # + * # 3 | 20 / PB1 (SCK) | 52 # + * # 4 | 21 / PB2 (MOSI)| 51 # + * # 5 | 30 / !RESET | RESET # + * # 6 | GND | - # + * ################################## + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== SERVOS connector ===== + * + * 2 4 6 + * #---------# + * | ° ° ° | + * | ° ° ° | + * #---------# + * 1 3 5 + * + * ################################## + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################## + * # 1 | 25 / PB6 (OC1B)| D12 # + * # 2 | 24 / PB5 (OC1A)| D11 # + * # 3 | GND | - # + * # 4 | GND | - # + * # 5 | VCC | + # + * # 6 | VCC | + # + * ################################## + * + * NOTE: Pins 1 and 2 are the ones closest to the "L" and "PWR" LEDs. + * + * NOTE: Check servo wiring before connecting, for example: + * + Airtronics (non-Z) use: Red = +; Black = -; Black & White, White or Orange = signal. + * + Airtronics-Z use: Red = +; Black = -; Blue = signal. + * + Futaba use: Red = +; Black = -; White = signal. + * + Hitec use: Red = +; Black = -; Yellow = signal. + * + JR use: Red = +; Brown = -; Orange = signal. + * + * NOTE: Test your servo limits: + * Due to effects of component tolerances and/or age, the usable range of S-values for individual servos may be less than the settable 0-255 range. For example: + * 1. One servo may have a fully usable range of M280 P0 S0 through M280 P0 S255. + * 2. A different servo (of the same brand and model) may have a usable range of only M280 P0 S0 through M280 P0 S165 after which you experience binding. + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== Thermistor connectors ===== + * + * (NOTE ORDER) TH2 TH1 TB + * 1 2 1 2 1 2 + * #- -# #- -# #- -# + * | ° ° | | ° ° | | ° ° | + * #-----# #-----# #-----# + * + * ############## TB ################# + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################### + * # 1 | GND | - # + * # 2 | 83 / PK6 (ADC14)| A14 # + * ################################### + * + * ############## TH1 ################ + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################### + * # 1 | GND | - # + * # 2 | 84 / PK5 (ADC13)| A13 # + * ################################### + * + * ############## TH2 ################ + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################### + * # 1 | GND | - # + * # 2 | 82 / PK7 (ADC15)| A15 # + * ################################### + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + * + * ===== XS3 connector ===== + * + * 2 4 6 + * #---------# + * | ° ° ° | + * | ° ° ° | + * #---------# + * 1 3 5 + * + * ################################## + * # Pin | ATMEGA2560 Pin | Arduino # + * ################################## + * # 1 | 85 / ADC12 | A12 # + * # 2 | 86 / ADC11 | A11 # + * # 3 | GND | - # + * # 4 | GND | - # + * # 5 | VCC | + # + * # 6 | VCC | + # + * ################################## + * + * NOTE: Pins 1 and 2 are the ones closest to the "L" and "PWR" LEDs. + * + * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + */ diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h new file mode 100644 index 00000000..1568288e --- /dev/null +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -0,0 +1,515 @@ +/** + * 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 . + * + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#if HOTENDS > 5 || E_STEPPERS > 5 + #error "TTOSCAR supports up to 5 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "TT OSCAR" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN 12 +#define SERVO2_PIN 5 +#define SERVO3_PIN 4 + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN SERVO3_PIN +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#define X_CS_PIN 57 + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#define Y_CS_PIN 58 + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#define Z_CS_PIN 53 + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#define E0_CS_PIN 49 + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#define E1_CS_PIN E0_CS_PIN + +#define E2_STEP_PIN 63 +#define E2_DIR_PIN 22 +#define E2_ENABLE_PIN 59 +#define E2_CS_PIN E0_CS_PIN + +#define E3_STEP_PIN 32 +#define E3_DIR_PIN 40 +#define E3_ENABLE_PIN 39 +#define E3_CS_PIN E0_CS_PIN + +#define E4_STEP_PIN 43 +#define E4_DIR_PIN 42 +#define E4_ENABLE_PIN 47 +#define E4_CS_PIN E0_CS_PIN + +#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 Serial1 + //#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 E3_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + + #define X_SERIAL_TX_PIN -1 // 59 + #define X_SERIAL_RX_PIN -1 // 63 + #define X2_SERIAL_TX_PIN -1 + #define X2_SERIAL_RX_PIN -1 + + #define Y_SERIAL_TX_PIN -1 // 64 + #define Y_SERIAL_RX_PIN -1 // 40 + #define Y2_SERIAL_TX_PIN -1 + #define Y2_SERIAL_RX_PIN -1 + + #define Z_SERIAL_TX_PIN -1 // 44 + #define Z_SERIAL_RX_PIN -1 // 42 + #define Z2_SERIAL_TX_PIN -1 + #define Z2_SERIAL_RX_PIN -1 + + #define E0_SERIAL_TX_PIN -1 // 66 + #define E0_SERIAL_RX_PIN -1 // 65 + #define E1_SERIAL_TX_PIN -1 + #define E1_SERIAL_RX_PIN -1 + #define E2_SERIAL_TX_PIN -1 + #define E2_SERIAL_RX_PIN -1 + #define E3_SERIAL_TX_PIN -1 + #define E3_SERIAL_RX_PIN -1 + #define E4_SERIAL_TX_PIN -1 + #define E4_SERIAL_RX_PIN -1 + #define E5_SERIAL_RX_PIN -1 + #define E6_SERIAL_RX_PIN -1 + #define E7_SERIAL_RX_PIN -1 +#endif + +// +// Default pins for TMC software SPI +// +//#if ENABLED(TMC_USE_SW_SPI) +// #ifndef TMC_SW_MOSI +// #define TMC_SW_MOSI 66 +// #endif +// #ifndef TMC_SW_MISO +// #define TMC_SW_MISO 44 +// #endif +// #ifndef TMC_SW_SCK +// #define TMC_SW_SCK 64 +// #endif +//#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 +#define TEMP_1_PIN 15 +#define TEMP_2_PIN 10 +#define TEMP_3_PIN 11 +#define TEMP_BED_PIN 14 + +#if TEMP_SENSOR_CHAMBER > 0 + #define TEMP_CHAMBER_PIN 12 +#else + #define TEMP_4_PIN 12 +#endif + +// SPI for Max6675 or Max31855 Thermocouple +//#if DISABLED(SDSUPPORT) +// #define MAX6675_SS_PIN 66 // Don't use 53 if using Display/SD card +//#else +// #define MAX6675_SS_PIN 66 // Don't use 49 (SD_DETECT_PIN) +//#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 44 +#define HEATER_BED_PIN 8 + +#define FAN_PIN 9 + +#if EXTRUDERS >= 5 + #define HEATER_4_PIN 6 +#else + #define FAN1_PIN 6 +#endif + +#if EXTRUDERS >= 4 + #define HEATER_3_PIN 45 +#else + #define FAN2_PIN 45 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +//#ifndef FILWIDTH_PIN +// #define FILWIDTH_PIN 5 // Analog Input +//#endif + +// DIO 4 (Servos plug) for the runout sensor. +//#define FIL_RUNOUT_PIN SERVO3_PIN + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +// +// Case Light +// +#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENABLE_PIN) + #if !NUM_SERVOS // Prefer the servo connector + #define CASE_LIGHT_PIN 6 // Hardware PWM + #elif HAS_FREE_AUX2_PINS // Try to use AUX 2 + #define CASE_LIGHT_PIN 44 // Hardware PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE) + #if !NUM_SERVOS // Prefer the servo connector + #define SPINDLE_LASER_ENABLE_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_DIR_PIN 5 + #elif HAS_FREE_AUX2_PINS // Try to use AUX 2 + #define SPINDLE_LASER_ENABLE_PIN 40 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_DIR_PIN 65 + #endif +#endif + +// +// Průša i3 MK2 Multiplexer Support +// +//#ifndef E_MUX0_PIN +// #define E_MUX0_PIN 58 // Y_CS_PIN +//#endif +//#ifndef E_MUX1_PIN +// #define E_MUX1_PIN 53 // Z_CS_PIN +//#endif +//#ifndef E_MUX2_PIN +// #define E_MUX2_PIN 49 // En_CS_PIN +//#endif + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if HAS_WIRED_LCD + + // + // LCD Display output pins + // + #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 + + #elif BOTH(NEWPANEL, PANEL_ONE) + + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 42 + #define LCD_PINS_D4 65 + #define LCD_PINS_D5 66 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 64 + + #elif ENABLED(ZONESTAR_LCD) + + #define LCD_PINS_RS 64 + #define LCD_PINS_ENABLE 44 + #define LCD_PINS_D4 63 + #define LCD_PINS_D5 40 + #define LCD_PINS_D6 42 + #define LCD_PINS_D7 65 + #define ADC_KEYPAD_PIN 12 + + #else + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 25 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 37 + #endif + + #else + + #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #define LCD_PINS_DC 25 // Set as output on init + #define LCD_PINS_RS 27 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS 16 + #define DOGLCD_MOSI 17 + #define DOGLCD_SCK 23 + #define DOGLCD_A0 LCD_PINS_DC + #else + #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 + #endif + + #define LCD_PINS_D7 29 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + #endif + + #endif + + #if DISABLED(NEWPANEL) + // 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 + #endif + + #endif + + // + // LCD Display input pins + // + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #if ENABLED(CR10_STOCKDISPLAY) + #define BTN_EN1 17 + #define BTN_EN2 23 + #else + #define BTN_EN1 31 + #define BTN_EN2 33 + #endif + + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + //#define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #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 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 47 + #define BTN_EN2 43 + #define BTN_ENC 32 + #define LCD_SDSS 53 + //#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_ENC -1 + + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif EITHER(VIKI2, miniVIKI) + + #define DOGLCD_CS 45 + #define DOGLCD_A0 44 + #define LCD_SCREEN_ROT_180 + + #define BEEPER_PIN 33 + #define STAT_LED_RED_PIN 32 + #define STAT_LED_BLUE_PIN 35 + + #define BTN_EN1 22 + #define BTN_EN2 7 + #define BTN_ENC 39 + + #define SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board + //#define KILL_PIN 31 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + #define DOGLCD_CS 29 + #define DOGLCD_A0 27 + + #define BEEPER_PIN 23 + #define LCD_BACKLIGHT_PIN 33 + + #define BTN_EN1 35 + #define BTN_EN2 37 + #define BTN_ENC 31 + + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + //#define KILL_PIN 41 + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 27 + #define DOGLCD_CS 25 + + // GLCD features + //#define LCD_CONTRAST_INIT 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BEEPER_PIN 37 + + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + //#define SDSS 53 + #define SD_DETECT_PIN 49 + //#define KILL_PIN 64 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN 42 + // not connected to a pin + #define LCD_BACKLIGHT_PIN 65 // backlight LED on A11/D65 + + #define DOGLCD_A0 44 + #define DOGLCD_CS 66 + + // GLCD features + //#define LCD_CONTRAST_INIT 190 + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #define BTN_EN1 40 + #define BTN_EN2 63 + #define BTN_ENC 59 + + #define SDSS 53 + #define SD_DETECT_PIN 49 + //#define KILL_PIN 64 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN 33 + + // Buttons are directly attached to AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 + #define BTN_EN1 64 + #define BTN_EN2 59 + #define BTN_ENC 63 + #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 + #else + #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 + #endif + + #endif + + #endif // NEWPANEL + +#endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h new file mode 100644 index 00000000..c6251ae8 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -0,0 +1,142 @@ +/** + * 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 + +/** + * Ultiboard v2.0 pin assignments + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for: + * M3, M4 & M5 spindle control commands + * case light + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Ultimaker 2.x" +#define DEFAULT_MACHINE_NAME "Ultimaker" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" + +// +// Limit Switches +// +#define X_STOP_PIN 22 +#define Y_STOP_PIN 26 +#define Z_STOP_PIN 29 + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 32 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 31 + +#define Z_STEP_PIN 35 +#define Z_DIR_PIN 36 +#define Z_ENABLE_PIN 34 + +#define E0_STEP_PIN 42 +#define E0_DIR_PIN 43 +#define E0_ENABLE_PIN 37 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +#define MOTOR_CURRENT_PWM_XY_PIN 44 +#define MOTOR_CURRENT_PWM_Z_PIN 45 +#define MOTOR_CURRENT_PWM_E_PIN 46 +// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 9 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 77 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define SD_DETECT_PIN 39 +#define LED_PIN 8 +#define SAFETY_TRIGGERED_PIN 28 // PIN to detect the safety circuit has triggered +#define MAIN_VOLTAGE_MEASURE_PIN 14 // ANALOG PIN to measure the main voltage, with a 100k - 4k7 resitor divider. + +// +// LCD / Controller +// +#define BEEPER_PIN 18 + +#define LCD_PINS_RS 20 +#define LCD_PINS_ENABLE 15 +#define LCD_PINS_D4 14 +#define LCD_PINS_D5 21 +#define LCD_PINS_D6 5 +#define LCD_PINS_D7 6 + +// Buttons are directly attached +#define BTN_EN1 40 +#define BTN_EN2 41 +#define BTN_ENC 19 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER // use the LED_PIN for spindle speed control or case light + #undef LED_PIN + #define SPINDLE_DIR_PIN 16 + #define SPINDLE_LASER_ENA_PIN 17 // Pullup! + #define SPINDLE_LASER_PWM_PIN 8 // Hardware PWM +#else + #undef LED_PIN + #define CASE_LIGHT_PIN 8 +#endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h new file mode 100644 index 00000000..597a37bd --- /dev/null +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -0,0 +1,168 @@ +/** + * 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 + +/** + * Ultimaker pin assignments + */ + +/** + * Rev B 2 JAN 2017 + * + * Added pin definitions for: + * M3, M4 & M5 spindle control commands + * case light + */ + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Ultimaker" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" + +// +// Servos +// +#define SERVO0_PIN 11 + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 24 +#define Y_MIN_PIN 26 +#define Y_MAX_PIN 28 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN 32 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#define E0_STEP_PIN 43 +#define E0_DIR_PIN 45 +#define E0_ENABLE_PIN 41 + +#define E1_STEP_PIN 49 +#define E1_DIR_PIN 47 +#define E1_ENABLE_PIN 48 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 9 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +#define HEATER_1_PIN 3 +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 7 +#endif + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 +#define PS_ON_PIN 12 +#define SUICIDE_PIN 54 // PIN that has to be turned on right after start, to keep power flowing. + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 8 +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + + // Buttons directly attached + #define BTN_EN1 40 + #define BTN_EN2 42 + #define BTN_ENC 19 + + #define SD_DETECT_PIN 38 + + #else // !NEWPANEL - Old style panel with shift register + + // Buttons attached to a shift register + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #define SD_DETECT_PIN -1 + + #endif // !NEWPANEL + +#endif // HAS_WIRED_LCD + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM +#define SPINDLE_LASER_ENA_PIN 10 // Pullup! +#define SPINDLE_DIR_PIN 11 // use the EXP3 PWM header diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h new file mode 100644 index 00000000..c5bbd02b --- /dev/null +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -0,0 +1,274 @@ +/** + * 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 + +/** + * Ultimaker pin assignments (Old electronics) + */ + +/** + * Rev B 3 JAN 2017 + * + * Details on pin definitions for M3, M4 & M5 spindle control commands and for + * the CASE_LIGHT_PIN are at the end of this file. + * + * This started out as an attempt to add pin definitions for M3, M4 & M5 spindle + * control commands but quickly turned into a head scratcher as the sources for + * the revisions provided inconsistent information. + * + * As best I can determine: + * 1.5.3 boards should use the pins_ULTIMAKER.h file which means the BOARD_INFO_NAME + * define in this file should say 1.5.3 rather than 1.5.4 + * This file is meant for 1.1 - 1.3 boards. + * The endstops for the 1.0 boards use different definitions than on the 1.1 - 1.3 + * boards. + * + * I've added sections that have the 1.0 and 1.5.3 + endstop definitions so you can + * easily switch if needed. I've also copied over the 1.5.3 + LCD definitions. + * + * To be 100% sure of the board you have: + * 1. In Configuration_adv.h enable "PINS_DEBUGGING" + * 2. Compile & uploade + * 3. Enter the command "M43 W1 I1". This command will report that pin nmumber and + * name of any pin that changes state. + * 4. Using a 1k (approximately) resistor pull the endstops and some of the LCD pins + * to ground and see what is reported. + * 5. If the reported pin doesn't match the file then try a different board revision + * and repeat steps 2 - 5 + */ + +#define BOARD_REV_1_1_TO_1_3 +//#define BOARD_REV_1_0 +//#define BOARD_REV_1_5 + +#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#ifdef BOARD_REV_1_1_TO_1_3 + #define BOARD_INFO_NAME "Ultimaker 1.1-1.3" +#elif defined(BOARD_REV_1_0) + #define BOARD_INFO_NAME "Ultimaker 1.0" +#elif defined(BOARD_REV_1_5) + #define BOARD_INFO_NAME "Ultimaker 1.5" +#else + #define BOARD_INFO_NAME "Ultimaker 1.5.4+" +#endif +#define DEFAULT_MACHINE_NAME "Ultimaker" +#define DEFAULT_SOURCE_CODE_URL "https://github.com/Ultimaker/Marlin" + +// +// Limit Switches +// +#if ENABLED(BOARD_REV_1_1_TO_1_3) + #define X_MIN_PIN 15 // SW1 + #define X_MAX_PIN 14 // SW2 + #define Y_MIN_PIN 17 // SW3 + #define Y_MAX_PIN 16 // SW4 + #define Z_MIN_PIN 19 // SW5 + #define Z_MAX_PIN 18 // SW6 +#endif + +#if ENABLED(BOARD_REV_1_0) + #if HAS_CUTTER + #define X_STOP_PIN 13 // SW1 (didn't change) - also has a useable hardware PWM + #define Y_STOP_PIN 12 // SW2 + #define Z_STOP_PIN 11 // SW3 + #else + #define X_MIN_PIN 13 // SW1 + #define X_MAX_PIN 12 // SW2 + #define Y_MIN_PIN 11 // SW3 + #define Y_MAX_PIN 10 // SW4 + #define Z_MIN_PIN 9 // SW5 + #define Z_MAX_PIN 8 // SW6 + #endif +#endif + +#if ENABLED(BOARD_REV_1_5) + #define X_MIN_PIN 22 + #define X_MAX_PIN 24 + #define Y_MIN_PIN 26 + #define Y_MAX_PIN 28 + #define Z_MIN_PIN 30 + #define Z_MAX_PIN 32 +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#if !defined(Z_MIN_PROBE_PIN) && !BOTH(HAS_CUTTER, BOARD_REV_1_0) + #define Z_MIN_PROBE_PIN Z_MAX_PIN +#endif + +// +// Steppers +// +#define X_STEP_PIN 25 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 27 + +#define Y_STEP_PIN 31 +#define Y_DIR_PIN 33 +#define Y_ENABLE_PIN 29 + +#define Z_STEP_PIN 37 +#define Z_DIR_PIN 39 +#define Z_ENABLE_PIN 35 + +#if BOTH(HAS_CUTTER, BOARD_REV_1_1_TO_1_3) && EXTRUDERS == 1 + // Move E0 to the spare and get Spindle/Laser signals from E0 + #define E0_STEP_PIN 49 + #define E0_DIR_PIN 47 + #define E0_ENABLE_PIN 48 +#else + #define E0_STEP_PIN 43 + #define E0_DIR_PIN 45 + #define E0_ENABLE_PIN 41 + + #define E1_STEP_PIN 49 + #define E1_DIR_PIN 47 + #define E1_ENABLE_PIN 48 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 8 // Analog Input +#define TEMP_1_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 2 +//#define HEATER_1_PIN 3 // used for case light Rev A said "1" +#define HEATER_BED_PIN 4 + +// +// LCD / Controller +// +#if ANY(BOARD_REV_1_0, BOARD_REV_1_1_TO_1_3) + + #define LCD_PINS_RS 24 + #define LCD_PINS_ENABLE 22 + #define LCD_PINS_D4 36 + #define LCD_PINS_D5 34 + #define LCD_PINS_D6 32 + #define LCD_PINS_D7 30 + +#elif BOTH(BOARD_REV_1_5, ULTRA_LCD) + + #define BEEPER_PIN 18 + + #if ENABLED(NEWPANEL) + + #define LCD_PINS_RS 20 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 5 + #define LCD_PINS_D7 6 + + // Buttons directly attached + #define BTN_EN1 40 + #define BTN_EN2 42 + #define BTN_ENC 19 + + #define SD_DETECT_PIN 38 + + #else // !NEWPANEL - Old style panel with shift register + + // Buttons attached to a shift register + #define SHIFT_CLK 38 + #define SHIFT_LD 42 + #define SHIFT_OUT 40 + #define SHIFT_EN 17 + + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 6 + #define LCD_PINS_D5 21 + #define LCD_PINS_D6 20 + #define LCD_PINS_D7 19 + + #endif // !NEWPANEL + +#endif + +// +// case light - see spindle section for more info on available hardware PWMs +// +#if !PIN_EXISTS(CASE_LIGHT) && ENABLED(BOARD_REV_1_5) + #define CASE_LIGHT_PIN 7 // use PWM - MUST BE HARDWARE PWM +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER + #if EITHER(BOARD_REV_1_0, BOARD_REV_1_5) // Use the last three SW positions + #define SPINDLE_DIR_PIN 10 // 1.0: SW4 1.5: EXP3-6 ("10") + #define SPINDLE_LASER_PWM_PIN 9 // 1.0: SW5 1.5: EXP3-7 ( "9") .. MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENA_PIN 8 // 1.0: SW6 1.5: EXP3-8 ( "8") .. Pin should have a pullup! + #elif ENABLED(BOARD_REV_1_1_TO_1_3) + /** + * Only four hardware PWMs physically connected to anything on these boards: + * + * HEATER_0_PIN 2 silkscreen varies - usually "PWM 1" or "HEATER1" + * HEATER_1_PIN 3 silkscreen varies - usually "PWM 2" or "HEATER2" + * HEATER_BED_PIN 4 silkscreen varies - usually "PWM 3" or "HEATED BED" + * E0_DIR_PIN 45 + * + * If one of the heaters is used then special precautions will usually be needed. + * They have an LED and resistor pullup to +24V which could damage 3.3V-5V ICs. + */ + #if EXTRUDERS == 1 + #define SPINDLE_DIR_PIN 43 + #define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 41 // Pullup! + #elif TEMP_SENSOR_BED == 0 // Can't use E0 so see if HEATER_BED_PIN is available + #undef HEATER_BED_PIN + #define SPINDLE_DIR_PIN 38 // Probably pin 4 on 10 pin connector closest to the E0 socket + #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM - Special precautions usually needed. + #define SPINDLE_LASER_ENA_PIN 40 // Pullup! (Probably pin 6 on the 10-pin + // connector closest to the E0 socket) + #endif + #endif +#endif + +/** + * Where to get the spindle signals on the E0 socket + * + * spindle signal socket name socket name + * ------- + * SPINDLE_LASER_ENA_PIN /ENABLE *| |O VMOT + * MS1 O| |O GND + * MS2 O| |O 2B + * MS3 O| |O 2A + * /RESET O| |O 1A + * /SLEEP O| |O 1B + * SPINDLE_DIR_PIN STEP O| |O VDD + * SPINDLE_LASER_PWM_PIN DIR O| |O GND + * ------- + * * - pin closest to MS1, MS2 & MS3 jumpers on the board + * + * Note: Socket names vary from vendor to vendor. + */ diff --git a/Marlin/src/pins/ramps/pins_VORON.h b/Marlin/src/pins/ramps/pins_VORON.h new file mode 100644 index 00000000..40ec71b6 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_VORON.h @@ -0,0 +1,55 @@ +/** + * 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 + +/** + * VORON Design v2 pin assignments + * See https://github.com/mzbotreprap/VORON/blob/master/Firmware/Marlin/pins_RAMPS_VORON.h + */ + +#define BOARD_INFO_NAME "VORON Design v2" + +#define RAMPS_D8_PIN 11 + +#include "pins_RAMPS.h" + +// +// Heaters / Fans +// +#undef FAN_PIN +#define FAN_PIN 5 // Using the pin for the controller fan since controller fan is always on. +#define CONTROLLER_FAN_PIN 8 + +// +// Auto fans +// +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN 6 // Servo pin 6 for E3D Fan (same pin for both extruders since it's the same fan) +#endif + +// +// LCDs and Controllers +// +#undef BEEPER_PIN diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V20.h b/Marlin/src/pins/ramps/pins_ZRIB_V20.h new file mode 100644 index 00000000..90433c62 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_ZRIB_V20.h @@ -0,0 +1,87 @@ +/** + * 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 + +/** + * ZRIB V2.0 & V3.0 pin assignments + * V2 and V3 Boards only differ in USB controller, nothing affecting the pins. + */ + +#include "pins_MKS_GEN_13.h" + +#define ZRIB_V20_D6_PIN 6 // Fan +#define ZRIB_V20_D9_PIN 9 // Fan2 +#define ZRIB_V20_A10_PIN 10 +#define ZRIB_V20_D16_PIN 16 +#define ZRIB_V20_D17_PIN 17 +#define ZRIB_V20_D23_PIN 23 +#define ZRIB_V20_D25_PIN 25 +#define ZRIB_V20_D27_PIN 27 +#define ZRIB_V20_D29_PIN 29 +#define ZRIB_V20_D37_PIN 37 + +// +// Auto fans +// +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN ZRIB_V20_D6_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN ZRIB_V20_D6_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN ZRIB_V20_D6_PIN +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN ZRIB_V20_D6_PIN +#endif + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 11 // Analog Input +#endif + +#if ENABLED(ZONESTAR_LCD) + #undef LCD_PINS_RS + #undef LCD_PINS_ENABLE + #undef LCD_PINS_D4 + #undef LCD_PINS_D5 + #undef LCD_PINS_D6 + #undef LCD_PINS_D7 + #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 + #define LCD_PINS_D5 ZRIB_V20_D25_PIN + #define LCD_PINS_D6 ZRIB_V20_D27_PIN + #define LCD_PINS_D7 ZRIB_V20_D29_PIN + #define ADC_KEYPAD_PIN ZRIB_V20_A10_PIN + #define BEEPER_PIN ZRIB_V20_D37_PIN +#endif diff --git a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h new file mode 100644 index 00000000..096d9708 --- /dev/null +++ b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h @@ -0,0 +1,306 @@ +/** + * 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 + +/** + * Z-Bolt X Series board – based on Arduino Mega2560 + */ + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif HOTENDS > 4 || E_STEPPERS > 4 + #error "Z-Bolt X Series board supports up to 4 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Z-Bolt X Series" + +// +// Servos +// +#ifndef SERVO0_PIN + #define SERVO0_PIN 11 +#endif +#ifndef SERVO3_PIN + #define SERVO3_PIN 4 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#ifndef X_MAX_PIN + #define X_MAX_PIN 2 +#endif +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 54 +#define X_DIR_PIN 55 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN -1 +#endif + +#define Y_STEP_PIN 60 +#define Y_DIR_PIN 61 +#define Y_ENABLE_PIN 56 +#ifndef Y_CS_PIN + #define Y_CS_PIN -1 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 62 +#ifndef Z_CS_PIN + #define Z_CS_PIN -1 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN -1 +#endif + +#define E1_STEP_PIN 36 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 30 +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +// Red +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 40 +#define E2_ENABLE_PIN 65 +#ifndef E2_CS_PIN + #define E2_CS_PIN -1 +#endif + +// Black +#define E3_STEP_PIN 44 +#define E3_DIR_PIN 64 +#define E3_ENABLE_PIN 66 +#ifndef E3_CS_PIN + #define E3_CS_PIN -1 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 // Analog Input +#define TEMP_1_PIN 15 // Analog Input +#define TEMP_2_PIN 5 // Analog Input (BLACK) +#define TEMP_3_PIN 9 // Analog Input (RED) +#define TEMP_BED_PIN 14 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_1_PIN 7 +#define HEATER_2_PIN 6 +#define HEATER_3_PIN 5 +#define HEATER_BED_PIN 8 + +#define FAN_PIN 9 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif + +// Оn the servos connector +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 4 +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) + #if NUM_SERVOS <= 1 // Prefer the servo connector + #define CASE_LIGHT_PIN 6 // Hardware PWM + #elif HAS_FREE_AUX2_PINS + #define CASE_LIGHT_PIN 44 // Hardware PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) + #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // Prefer the servo connector + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_DIR_PIN 5 + #elif HAS_FREE_AUX2_PINS + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_DIR_PIN 65 + #endif +#endif + +// +// TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 66 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 44 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 64 + #endif +#endif + +#if HAS_TMC_UART + /** + * TMC220x stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#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 + // + + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN 40 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN 63 + #endif + #ifndef X2_SERIAL_TX_PIN + #define X2_SERIAL_TX_PIN -1 + #endif + #ifndef X2_SERIAL_RX_PIN + #define X2_SERIAL_RX_PIN -1 + #endif + + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN 59 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN 64 + #endif + #ifndef Y2_SERIAL_TX_PIN + #define Y2_SERIAL_TX_PIN -1 + #endif + #ifndef Y2_SERIAL_RX_PIN + #define Y2_SERIAL_RX_PIN -1 + #endif + + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN 42 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN 65 + #endif + #ifndef Z2_SERIAL_TX_PIN + #define Z2_SERIAL_TX_PIN -1 + #endif + #ifndef Z2_SERIAL_RX_PIN + #define Z2_SERIAL_RX_PIN -1 + #endif + + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN 44 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN 66 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN -1 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN -1 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN -1 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN -1 + #endif + #ifndef E3_SERIAL_TX_PIN + #define E3_SERIAL_TX_PIN -1 + #endif + #ifndef E3_SERIAL_RX_PIN + #define E3_SERIAL_RX_PIN -1 + #endif + #ifndef E4_SERIAL_TX_PIN + #define E4_SERIAL_TX_PIN -1 + #endif + #ifndef E4_SERIAL_RX_PIN + #define E4_SERIAL_RX_PIN -1 + #endif + #ifndef E5_SERIAL_TX_PIN + #define E5_SERIAL_TX_PIN -1 + #endif + #ifndef E5_SERIAL_RX_PIN + #define E5_SERIAL_RX_PIN -1 + #endif + #ifndef E6_SERIAL_TX_PIN + #define E6_SERIAL_TX_PIN -1 + #endif + #ifndef E6_SERIAL_RX_PIN + #define E6_SERIAL_RX_PIN -1 + #endif + #ifndef E7_SERIAL_TX_PIN + #define E7_SERIAL_TX_PIN -1 + #endif + #ifndef E7_SERIAL_RX_PIN + #define E7_SERIAL_RX_PIN -1 + #endif +#endif diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h new file mode 100644 index 00000000..b0e171cf --- /dev/null +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -0,0 +1,207 @@ +/** + * 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 + +/** + * Arduino DUE Shield Kit (ADSK) pin assignments + */ + +#define BOARD_INFO_NAME "ADSK" + +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" +#endif + +/* CNC shield modifications: +FROM THE BOTTOM CUT THE 5V PIN THAT GOES TO ARDUINO!!! +On the top put jumper between 5V and 3V3 pins, + jumper between D12 and A.STEP, jumper between D13 and A.DIR +*/ + +/* CNC shield 3D printer connections: +X,Y,Z steppers as normal +A stepper for E0 extruder +(X-)&(GND) - X limit +(Y-)&(GND) - Y limit +(Z-)&(GND) - Z limit +(Abort)&(GND) - Extruder thermistor (also require pullup resistor 4.7K between "Abort" and + Vcc (now "5V" on the board but actual 3.3V because of jumper)) +(Hold)&(GND) - Bed thermistor (also require pullup resistor 4.7K between "Hold" and + Vcc (now "5V" on the board but actual 3.3V because of jumper)) +(CoolEn) - 3.3v signal to controll extruder heater MOSFET +(Resume) - 3.3v signal to control heatbed MOSFET +(SDA) - 3.3v signal to controll extruder fan +(SCL) - 3.3v signal to controll extruder cooling fan +*/ + +/* CNC Shield pinout +"Name on the board": DUE pin +"Abort": Analog pin 0 or Digital pin 54 +"Hold": Analog pin 1 or Digital pin 55 +"Resume": Analog pin 2 or Digital pin 56 +"CoolEn": Analog pin 3 or Digital pin 57 +"SDA": Analog pin 4 or Digital pin 58 +"SCL": Analog pin 5 or Digital pin 59 +"E-STOP": Reset pin +"RX": Digital pin 0 +"TX": Digital pin 1 +"X.STEP": Digital pin 2 +"Y.STEP": Digital pin 3 +"Z.STEP": Digital pin 4 +"X.DIR": Digital pin 5 +"Y.DIR": Digital pin 6 +"Z.DIR": Digital pin 7 +"EN": Digital pin 8 +"X+","X-": Digital pin 9 +"Y+","Y-": Digital pin 10 +"Z+","Z-": Digital pin 11 +"SpinEn": Digital pin 12 -> will be connected to A.STEP with jumper +"SpinDir": Digital pin 13 -> will be connected to A.DIR with jumper +*/ + +// +// Servos +// +#define SERVO0_PIN 61 // Analog pin 7, Digital pin 61 + +// +// Limit Switches +// +#define X_MIN_PIN 9 +#define Y_MIN_PIN 10 +#define Z_MIN_PIN 11 + +#define Z_MIN_PROBE_PIN 62 // Analog pin 8, Digital pin 62 + +// +// Steppers +// +#define X_STEP_PIN 2 +#define X_DIR_PIN 5 +#define X_ENABLE_PIN 8 + +#define Y_STEP_PIN 3 +#define Y_DIR_PIN 6 +#define Y_ENABLE_PIN 8 + +#define Z_STEP_PIN 4 +#define Z_DIR_PIN 7 +#define Z_ENABLE_PIN 8 + +#define E0_STEP_PIN 12 +#define E0_DIR_PIN 13 +#define E0_ENABLE_PIN 8 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 55 // "Hold": Analog pin 1, Digital pin 55 +#define HEATER_BED_PIN 57 // "CoolEn": Analog pin 3, Digital pin 57 +#define FAN_PIN 54 // "Abort": Analog pin 0, Digital pin 54 +#undef E0_AUTO_FAN_PIN +#define E0_AUTO_FAN_PIN 56 // "Resume": Analog pin 2, Digital pin 56 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 4 // "SDA": Analog pin 4, Digital pin 58 +#define TEMP_BED_PIN 5 // "SCL": Analog pin 5, Digital pin 59 + +// +// Misc. Functions +// +#define SDSS 52 + +#if ENABLED(ZONESTAR_LCD) + + /** + * The 2004 LCD should be powered with 5V. + * The next LCD pins RS,D4,D5,D6,D7 have internal pull-ups to 5V and as result the 5V will be on these pins. + * Luckily these internal pull-ups have really high resistance and adding 33K pull-down resistors will create + * simple voltage divider that will bring the voltage down just slightly bellow 3.3V. + * + * This LCD also has buttons that connected to the same ADC pin with different voltage divider combinations. + * On the LCD panel there is internal pull-up resistor of the 4.7K connected to 5V. + * Connecting another 4.7K pull-down resistor between ADC pin and the GND + * will result in scaled values for voltage dividers and will bring them down to be always below 3.3V. + * + * For 2004 LCD to work with 3.3V board like Arduino DUE the next required: + * Pull-down resistors of 33K between each of LCD pins RS,D4,D5,D6,D7 and the GND. + * Pull-down resistor of 4.7K between ADC_KEYPAD_PIN and the GND + * + * All these modifications will still work with 5V based boards but require proper scaled ADC values + */ + + #ifdef __SAM3X8E__ + #define AREF_VOLTS 3.3 + #else + #define AREF_VOLTS 5.0 + #endif + + // + // LCD / Controller + // + #define LCD_PINS_ENABLE 14 + #define LCD_PINS_RS 15 + #define LCD_PINS_D4 16 + #define LCD_PINS_D5 17 + #define LCD_PINS_D6 18 + #define LCD_PINS_D7 19 + #define ADC_KEYPAD_PIN 6 //60 // Analog pin 6, Digital pin 60 + + /** + * The below defines will scale all the values to work properly on both + * 5V (Mega) and 3.3V (DUE) boards with all pull-up resistors added for 3.3V + */ + + #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 + // 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 + // 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) + #define ADC_BUTTONS_UP_R_PULLDOWN _ADC_BUTTONS_R_SCALED(1.0) + #define ADC_BUTTONS_DOWN_R_PULLDOWN _ADC_BUTTONS_R_SCALED(10.0) + #define ADC_BUTTONS_MIDDLE_R_PULLDOWN _ADC_BUTTONS_R_SCALED(2.2) + +#endif // ZONESTAR_LCD + +/** + * RJ45 8 pins extruder connector + * + * 1 - GND (Please do not connect to the same GND as extruder heater to prevent ground offset voltage) + * 2 - thermistor + * 3 - SERVO PWM + * 4 - extruder heater + * 5 - FAN (print cooling) + * 6 - FAN (extruder cooling) + * 7 - Probe signal + * 8 - 5V + * + * Standard ethernet pairs: 1&2, 3&6, 4&5, 7&8 + * Use CAT7 cable to have all pairs shielded + */ diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h new file mode 100644 index 00000000..8d690611 --- /dev/null +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -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 . + * + */ +#pragma once + +/** + * Alligator Board R2 + * https://reprap.org/wiki/Alligator_Board + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Alligator Board R2" + +// +// Servos +// +#define SERVO0_PIN 36 +#define SERVO1_PIN 40 +#define SERVO2_PIN 41 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 33 // PC1 +#define X_MAX_PIN 34 // PC2 +#define Y_MIN_PIN 35 // PC3 +#define Y_MAX_PIN 37 // PC5 +#define Z_MIN_PIN 38 // PC6 +#define Z_MAX_PIN 39 // PC7 + +// +// Steppers +// +#define X_STEP_PIN 96 // PB24 +#define X_DIR_PIN 2 // PB25 +#define X_ENABLE_PIN 24 // PA15, motor RESET pin + +#define Y_STEP_PIN 94 // PB22 +#define Y_DIR_PIN 95 // PB23 +#define Y_ENABLE_PIN 24 // PA15, motor RESET pin + +#define Z_STEP_PIN 98 // PC27 +#define Z_DIR_PIN 3 // PC28 +#define Z_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E0_STEP_PIN 5 // PC25 +#define E0_DIR_PIN 4 // PC26 +#define E0_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E1_STEP_PIN 28 // PD3 on piggy +#define E1_DIR_PIN 27 // PD2 on piggy +#define E1_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E2_STEP_PIN 11 // PD7 on piggy +#define E2_DIR_PIN 29 // PD6 on piggy +#define E2_ENABLE_PIN 24 // PA15, motor RESET pin + +#define E3_STEP_PIN 30 // PD9 on piggy +#define E3_DIR_PIN 12 // PD8 on piggy +#define E3_ENABLE_PIN 24 // PA15, motor RESET pin + +// Microstepping pins - Mapping not from fastio.h (?) +#define X_MS1_PIN 99 // PC10 +#define Y_MS1_PIN 10 // PC29 +#define Z_MS1_PIN 44 // PC19 +#define E0_MS1_PIN 45 // PC18 + +//#define MOTOR_FAULT_PIN 22 // PB26 , motor X-Y-Z-E0 motor FAULT + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input (PA24) +#define TEMP_1_PIN 2 // Analog Input (PA23 on piggy) +#define TEMP_2_PIN 3 // Analog Input (PA22 on piggy) +#define TEMP_3_PIN 4 // Analog Input (PA6 on piggy) +#define TEMP_BED_PIN 0 // Analog Input (PA16) + +// +// Heaters / Fans +// +// Note that on the Due pin A0 on the board is channel 2 on the ARM chip +#define HEATER_0_PIN 68 // PA1 +#define HEATER_1_PIN 8 // PC22 on piggy +#define HEATER_2_PIN 9 // PC21 on piggy +#define HEATER_3_PIN 97 // PC20 on piggy +#define HEATER_BED_PIN 69 // PA0 + +#ifndef FAN_PIN + #define FAN_PIN 92 // PA5 +#endif +#define FAN1_PIN 31 // PA7 + +// +// Misc. Functions +// +#define SDSS 77 // PA28 +#define SD_DETECT_PIN 87 // PA29 +#define LED_RED_PIN 40 // PC8 +#define LED_GREEN_PIN 41 // PC9 + +#define EXP_VOLTAGE_LEVEL_PIN 65 + +#define SPI_CHAN_DAC 1 + +#define DAC0_SYNC 53 // PB14 +#define DAC1_SYNC 6 // PC24 + +// 64K SPI EEPROM +#define SPI_EEPROM +#define SPI_CHAN_EEPROM1 2 +#define SPI_EEPROM1_CS 25 // PD0 + +// 2K SPI EEPROM +#define SPI_EEPROM2_CS 26 // PD1 + +// FLASH SPI +// 32Mb +#define SPI_FLASH_CS 23 // PA14 + +// +// 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 +#endif diff --git a/Marlin/src/pins/sam/pins_ARCHIM1.h b/Marlin/src/pins/sam/pins_ARCHIM1.h new file mode 100644 index 00000000..6e3768c6 --- /dev/null +++ b/Marlin/src/pins/sam/pins_ARCHIM1.h @@ -0,0 +1,201 @@ +/** + * 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 + +/** + * ARCHIM1 pin assignment + * + * The Archim 1.0 board requires Arduino Archim addons installed. + * + * - Add the following URL to Arduino IDE's Additional Board Manager URLs: + * https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json + * + * - In the Arduino IDE Board Manager search for Archim and install the package. + * + * - Change your target board to "Archim". + * + * Further information on the UltiMachine website... + * https://github.com/ultimachine/Archim/wiki + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Archim' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Archim 1.0" + +// +// Timers +// +// These are already defined in DUE, so must be undefined first +#define STEP_TIMER_NUM 3 +#define HAL_STEP_TIMER_ISR() void TC3_Handler() + +// +// Items marked * have been altered from Archim v1.0 +// + +// +// Servos +// +#define SERVO0_PIN 20 // D20 PB12 (Header J20 20) +#define SERVO1_PIN 21 // D21 PB13 (Header J20 19) + +// +// Limit Switches +// +#define X_MIN_PIN 14 // PD4 MIN ES1 +#define X_MAX_PIN 32 // PD10 MAX ES1 +#define Y_MIN_PIN 29 // PD6 MIN ES2 +#define Y_MAX_PIN 15 // PD5 MAX ES2 +#define Z_MIN_PIN 31 // PA7 MIN ES3 +#define Z_MAX_PIN 30 // PD9 MAX ES3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 66 // D66 PB15 (Header J20 15) +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN 67 // D67 PB16 (Header J20 16) +#endif + +// +// Steppers +// +#define X_STEP_PIN 40 // PC8 STEP1 * +#define X_DIR_PIN 59 // PA4 DIR1 * +#define X_ENABLE_PIN 41 // PC9 EN1 + +#define Y_STEP_PIN 49 // PC14 STEP2 * +#define Y_DIR_PIN 47 // PC16 DIR2 * +#define Y_ENABLE_PIN 48 // PC15 EN2 * + +#define Z_STEP_PIN 36 // PC4 STEP Z * +#define Z_DIR_PIN 107 // PB10 DIR Z * +#define Z_ENABLE_PIN 96 // PC10 EN Z -AddOns * + +#define E0_STEP_PIN 78 // PB23 STEP3 * +#define E0_DIR_PIN 22 // PB26 DIR3 * +#define E0_ENABLE_PIN 97 // PB24 EN3 -Addons * + +#define E1_STEP_PIN 26 // PD1 STEP4 * +#define E1_DIR_PIN 27 // PD2 DIR4 * +#define E1_ENABLE_PIN 28 // PD3 EN4 * + +// Microstepping mode pins * +#define X_MS1_PIN 39 // PC7 MOD0E1 - As listed in schematic +#define X_MS2_PIN 38 // PC6 MOD1E1 +#define X_MS3_PIN 37 // PC5 MOD2E1 + +#define Y_MS1_PIN 50 // PC13 MODE0E2 +#define Y_MS2_PIN 51 // PC12 MODE1E2 +#define Y_MS3_PIN 92 // PC11 MODE2E2 - AddOns + +#define Z_MS1_PIN 44 // PC19 MOD0E Z +#define Z_MS2_PIN 45 // PC18 MOD1E Z +#define Z_MS3_PIN 46 // PC17 MOD2E Z + +#define E0_MS1_PIN 105 // PB22 MOD0E3 - AddOns +#define E0_MS2_PIN 106 // PC27 MOD1E3 - AddOns +#define E0_MS3_PIN 104 // PC20 MOD2E3 - AddOns + +#define E1_MS1_PIN 25 // PD0 MOD0E4 +#define E1_MS2_PIN 18 // PA11 MOD1E4 +#define E1_MS3_PIN 19 // PA10 MOD2E4 + +// Motor current PWM pins * +#define MOTOR_CURRENT_PWM_X_PIN 58 // PA6 X-REF TIOB2 +#define MOTOR_CURRENT_PWM_Y_PIN 12 // PD8 Y-REF TIOB8 +#define MOTOR_CURRENT_PWM_Z_PIN 10 // PC29 Z-REF TIOB7 +#define MOTOR_CURRENT_PWM_E0_PIN 3 // PC28 E1-REF TIOA7 +#define MOTOR_CURRENT_PWM_E1_PIN 11 // PD7 E2-REF TIOA8 + +#define MOTOR_CURRENT_PWM_RANGE 2750 // (3.3 Volts * 100000 Ohms) / (100000 Ohms + 20000 Ohms) = 2.75 Volts (max vref) +#define DEFAULT_PWM_MOTOR_CURRENT { 1000, 1000, 1000 } //, 1000, 1000} // X Y Z E0 E1, 1000 = 1000mAh + +// +// Temperature Sensors +// +#define TEMP_0_PIN 10 // D10 PB19 THERM AN1 * +#define TEMP_1_PIN 9 // D9 PB18 THERM AN2 * +#define TEMP_2_PIN 8 // D8 PB17 THERM AN4 * +#define TEMP_BED_PIN 11 // D11 PB20 THERM AN3 * + +// +// Heaters / Fans +// +#define HEATER_0_PIN 6 // D6 PC24 FET_PWM3 +#define HEATER_1_PIN 7 // D7 PC23 FET_PWM4 +#define HEATER_2_PIN 8 // D8 PC22 FET_PWM5 +#define HEATER_BED_PIN 9 // D9 PC21 BED_PWM + +#ifndef FAN_PIN + #define FAN_PIN 4 // D4 PC26 FET_PWM1 +#endif +#define FAN1_PIN 5 // D5 PC25 FET_PWM2 + +// +// Misc. Functions +// + +// Internal MicroSD card reader on the PCB +#define INT_SCK_PIN 42 // D42 PA19/MCCK +#define INT_MISO_PIN 43 // D43 PA20/MCCDA +#define INT_MOSI_PIN 73 // D73 PA21/MCDA0 +#define INT_SDSS 55 // D55 PA24/MCDA3 + +// External SD card reader on SC2 +#define SCK_PIN 76 // D76 PA27 +#define MISO_PIN 74 // D74 PA25 +#define MOSI_PIN 75 // D75 PA26 +#define SDSS 87 // D87 PA29 + +// 2MB SPI Flash +#define SPI_FLASH_SS 52 // D52 PB21 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + #define BEEPER_PIN 23 // D24 PA15_CTS1 + #define LCD_PINS_RS 17 // D17 PA12_RXD1 + #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1 + #define LCD_PINS_D4 69 // D69 PA0_CANTX0 + #define LCD_PINS_D5 54 // D54 PA16_SCK1 + #define LCD_PINS_D6 68 // D68 PA1_CANRX0 + #define LCD_PINS_D7 34 // D34 PC2_PWML0 + + #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 + + #if ENABLED(NEWPANEL) + // 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 + #endif // NEWPANEL +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h new file mode 100644 index 00000000..5a3fe0e4 --- /dev/null +++ b/Marlin/src/pins/sam/pins_ARCHIM2.h @@ -0,0 +1,257 @@ +/** + * 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 + +/** + * ARCHIM2 pin assignment + * + * The Archim 2.0 board requires Arduino Archim addons installed. + * + * - Add the following URL to Arduino IDE's Additional Board Manager URLs: + * https://raw.githubusercontent.com/ultimachine/ArduinoAddons/master/package_ultimachine_index.json + * + * - In the Arduino IDE Board Manager search for Archim and install the package. + * + * - Change your target board to "Archim". + * + * Further information on the UltiMachine website... + * https://github.com/ultimachine/Archim/wiki + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Archim' in 'Tools > Board.'" +#elif DISABLED(TMC_USE_SW_SPI) + #error "Archim2 requires Software SPI. Enable TMC_USE_SW_SPI in Configuration_adv.h." +#endif + +#define BOARD_INFO_NAME "Archim 2.0" + +// +// Items marked * have been altered from Archim v1.0 +// + +// +// Servos +// +#define SERVO0_PIN 20 // D20 PB12 (Header J20 20) +#define SERVO1_PIN 21 // D21 PB13 (Header J20 19) + +// +// Limit Switches +// + +#if ENABLED(SENSORLESS_HOMING) + + // Only use Diag Pins when SENSORLESS_HOMING is enabled for the TMC2130 drivers. + // Otherwise use a physical endstop based configuration. + + // TMC2130 Diag Pins + #define X_DIAG_PIN 59 // PA4 + #define Y_DIAG_PIN 48 // PC15 + #define Z_DIAG_PIN 36 // PC4 + #define E0_DIAG_PIN 78 // PB23 + #define E1_DIAG_PIN 25 // PD0 + + #if X_HOME_DIR < 0 + #define X_MIN_PIN X_DIAG_PIN + #define X_MAX_PIN 32 + #else + #define X_MIN_PIN 14 + #define X_MAX_PIN X_DIAG_PIN + #endif + + #if Y_HOME_DIR < 0 + #define Y_MIN_PIN Y_DIAG_PIN + #define Y_MAX_PIN 15 + #else + #define Y_MIN_PIN 29 + #define Y_MAX_PIN Y_DIAG_PIN + #endif + +#else + + #define X_MIN_PIN 14 // PD4 MIN ES1 + #define X_MAX_PIN 32 // PD10 MAX ES1 + #define Y_MIN_PIN 29 // PD6 MIN ES2 + #define Y_MAX_PIN 15 // PD5 MAX ES2 + +#endif + +#define Z_MIN_PIN 31 // PA7 MIN ES3 +#define Z_MAX_PIN 30 // PD9 MAX ES3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 32 +#endif + +// +// Steppers +// +#define X_STEP_PIN 38 // PC6 X-STEP * +#define X_DIR_PIN 37 // PC5 X-DIR * +#define X_ENABLE_PIN 41 // PC9 EN1 +#ifndef X_CS_PIN + #define X_CS_PIN 39 // PC7 X_nCS +#endif + +#define Y_STEP_PIN 51 // PC12 Y-STEP * +#define Y_DIR_PIN 92 // PC11 Y-DIR -AddOns * +#define Y_ENABLE_PIN 49 // PC14 Y-EN * +#ifndef Y_CS_PIN + #define Y_CS_PIN 50 // PC13 Y_nCS +#endif + +#define Z_STEP_PIN 46 // PC17 Z-STEP * +#define Z_DIR_PIN 47 // PC16 Z-DIR * +#define Z_ENABLE_PIN 44 // PC19 Z-END * +#ifndef Z_CS_PIN + #define Z_CS_PIN 45 // PC18 Z_nCS +#endif + +#define E0_STEP_PIN 107 // PB10 E1-STEP -AddOns * +#define E0_DIR_PIN 96 // PC10 E1-DIR -AddOns * +#define E0_ENABLE_PIN 105 // PB22 E1-EN -AddOns * +#ifndef E0_CS_PIN + #define E0_CS_PIN 104 // PC20 E1_nCS -AddOns * +#endif + +#define E1_STEP_PIN 22 // PB26 E2_STEP * +#define E1_DIR_PIN 97 // PB24 E2_DIR -AddOns * +#define E1_ENABLE_PIN 18 // PA11 E2-EN +#ifndef E1_CS_PIN + #define E1_CS_PIN 19 // PA10 E2_nCS +#endif + +// +// Software SPI pins for TMC2130 stepper drivers. +// Required for the Archim2 board. +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 28 // PD3 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 26 // PD1 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 27 // PD2 + #endif +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 10 // D10 PB19 THERM AN1 * +#define TEMP_1_PIN 9 // D9 PB18 THERM AN2 * +#define TEMP_2_PIN 8 // D8 PB17 THERM AN4 * +#define TEMP_BED_PIN 11 // D11 PB20 THERM AN3 * + +// +// Heaters / Fans +// +#define HEATER_0_PIN 6 // D6 PC24 FET_PWM3 +#define HEATER_1_PIN 7 // D7 PC23 FET_PWM4 +#define HEATER_2_PIN 8 // D8 PC22 FET_PWM5 +#define HEATER_BED_PIN 9 // D9 PC21 BED_PWM + +#ifndef FAN_PIN + #define FAN_PIN 4 // D4 PC26 FET_PWM1 +#endif +#define FAN1_PIN 5 // D5 PC25 FET_PWM2 + +// +// Misc. Functions +// + +// Internal MicroSD card reader on the PCB +#define INT_SCK_PIN 42 // D42 PA19/MCCK +#define INT_MISO_PIN 43 // D43 PA20/MCCDA +#define INT_MOSI_PIN 73 // D73 PA21/MCDA0 +#define INT_SDSS 55 // D55 PA24/MCDA3 + +// External SD card reader on SC2 +#define SCK_PIN 76 // D76 PA27 +#define MISO_PIN 74 // D74 PA25 +#define MOSI_PIN 75 // D75 PA26 +#define SDSS 87 // D87 PA29 + +// Unused Digital GPIO J20 Pins +#define GPIO_PB1_J20_5 94 // D94 PB1 (Header J20 5) +#define GPIO_PB0_J20_6 95 // D95 PB0 (Header J20 6) +#define GPIO_PB3_J20_7 103 // D103 PB3 (Header J20 7) +#define GPIO_PB2_J20_8 93 // D93 PB2 (Header J20 8) +#define GPIO_PB6_J20_9 99 // D99 PB6 (Header J20 9) +#define GPIO_PB5_J20_10 101 // D101 PB5 (Header J20 10) +#define GPIO_PB8_J20_11 100 // D100 PB8 (Header J20 11) +#define GPIO_PB4_J20_12 102 // D102 PB4 (Header J20 12) +#define GPIO_PB9_J20_13 108 // D108 PB9 (Header J20 13) +#define GPIO_PB7_J20_14 98 // D98 PB7 (Header J20 14) +#define GPIO_PB15_J20_15 66 // D66 PB15 (Header J20 15) +#define GPIO_PB16_J20_16 67 // D67 PB16 (Header J20 16) +#define GPIO_PB14_J20_17 53 // D53 PB14 (Header J20 17) +#define GPIO_PA18_J20_21 71 // D71 PA17 (Header J20 21) +#define GPIO_PA17_J20_22 70 // D70 PA17 (Header J20 22) + +// Case Light + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN GPIO_PB1_J20_5 +#endif + +// 2MB SPI Flash +#define SPI_FLASH_SS 52 // D52 PB21 + +// +// Filament Runout Sensor +// + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN GPIO_PB15_J20_15 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN GPIO_PB16_J20_16 +#endif + +// +// LCD / Controller +// +#if ANY(HAS_WIRED_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 + #define LCD_PINS_D4 69 // D69 PA0_CANTX0 + #define LCD_PINS_D5 54 // D54 PA16_SCK1 + #define LCD_PINS_D6 68 // D68 PA1_CANRX0 + #define LCD_PINS_D7 34 // D34 PC2_PWML0 + + #define SD_DETECT_PIN 2 // D2 PB25_TIOA0 + + #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 +#endif diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h new file mode 100644 index 00000000..fcd2bb4c --- /dev/null +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -0,0 +1,138 @@ +/** + * 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 . + * + */ + +/** + * CNControls V15 for HMS434 with DUE pin assignments + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "CN Controls V15D" + +// +// Servos +// +#define SERVO0_PIN 6 + +// +// Limit Switches +// +#define X_STOP_PIN 34 +#define Y_STOP_PIN 39 +#define Z_STOP_PIN 62 + +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 49 +#endif + +// +// Steppers +// +#define X_STEP_PIN 14 +#define X_DIR_PIN 25 +#define X_ENABLE_PIN 26 + +#define Y_STEP_PIN 11 +#define Y_DIR_PIN 12 +#define Y_ENABLE_PIN 15 + +#define Z_STEP_PIN 24 +#define Z_DIR_PIN 27 +#define Z_ENABLE_PIN 28 + +#define E0_STEP_PIN 64 +#define E0_DIR_PIN 65 +#define E0_ENABLE_PIN 63 + +#define E1_STEP_PIN 8 +#define E1_DIR_PIN 7 +#define E1_ENABLE_PIN 29 + +// +// Temperature Sensors +// Analog Inputs +// +#define TEMP_0_PIN 1 +#define TEMP_1_PIN 2 +#define TEMP_BED_PIN 4 + +#ifndef TEMP_CHAMBER_PIN + #define TEMP_CHAMBER_PIN 5 +#endif + +// +// Heaters +// +#define HEATER_0_PIN 3 +#define HEATER_1_PIN 4 +#define HEATER_BED_PIN 32 +#define HEATER_CHAMBER_PIN 33 + +// +// Fans +// +//#define FAN_PIN 8 + +// +// Auto fans +// +#define AUTO_FAN_PIN 30 +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN AUTO_FAN_PIN +#endif +#ifndef CHAMBER_AUTO_FAN_PIN + #define CHAMBER_AUTO_FAN_PIN 10 +#endif + +// +// SD card +// +#define SCK_PIN 76 +#define MISO_PIN 74 +#define MOSI_PIN 75 +#define SDSS 53 +#define SD_DETECT_PIN 40 + +// Common I/O + +//#define PWM_1_PIN 6 // probe +//#define PWM_2_PIN 13 +//#define SPARE_IO 17 +#define BEEPER_PIN 13 +#define STAT_LED_BLUE_PIN -1 +#define STAT_LED_RED_PIN 31 + +// G425 CALIBRATION_GCODE default pin +#ifndef CALIBRATION_PIN + #define CALIBRATION_PIN 66 +#endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h new file mode 100644 index 00000000..cd4033aa --- /dev/null +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -0,0 +1,171 @@ +/** + * 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 + +/** + * DUE3DOM pin assignments + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "DUE3DOM" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 13 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 38 +#define X_MAX_PIN 36 +#define Y_MIN_PIN 34 +#define Y_MAX_PIN 32 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 2 +#define X_DIR_PIN 3 +#define X_ENABLE_PIN 22 + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 26 + +#define Z_STEP_PIN 61 // Z1 STP +#define Z_DIR_PIN 60 // Z1 DIR +#define Z_ENABLE_PIN 15 // Z1 ENA + +#define E0_STEP_PIN 64 // Z2 STP +#define E0_DIR_PIN 63 // Z2 DIR +#define E0_ENABLE_PIN 62 // Z2 ENA + +#define E1_STEP_PIN 51 // E1 STP +#define E1_DIR_PIN 53 // E1 DIR +#define E1_ENABLE_PIN 65 // E1 ENA + +#define E2_STEP_PIN 24 // E2 STP +#define E2_DIR_PIN 23 // E2 DIR +#define E2_ENABLE_PIN 49 // E2 ENA + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) +#define TEMP_1_PIN 2 // Analog Input (HOTEND1 thermistor) +#define TEMP_2_PIN 5 // Analog Input (unused) +#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN -1 +#else + #define MAX6675_SS_PIN -1 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 7 // HOTEND0 MOSFET +#define HEATER_1_PIN 8 // HOTEND1 MOSFET +#define HEATER_BED_PIN 39 // BED MOSFET + +#ifndef FAN_PIN + #define FAN_PIN 11 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN 9 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN 12 // FAN3 header on board - EXTRUDER0 FAN + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(RADDS_DISPLAY) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif HAS_U8GLIB_I2C_OLED + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #define BEEPER_PIN -1 + #endif // SPARK_FULL_GRAPHICS +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h new file mode 100644 index 00000000..5f9ad48a --- /dev/null +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -0,0 +1,174 @@ +/** + * 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 + +/** + * DUE3DOM MINI pin assignments + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "DUE3DOM MINI" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 6 +#define SERVO2_PIN 8 // 4-pin header FAN0 +#define SERVO3_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 38 +#define X_MAX_PIN -1 +#define Y_MIN_PIN 34 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN 30 +#define Z_MAX_PIN -1 + +// +// Steppers +// +#define X_STEP_PIN 17 +#define X_DIR_PIN 16 +#define X_ENABLE_PIN 22 + +#define Y_STEP_PIN 2 +#define Y_DIR_PIN 3 +#define Y_ENABLE_PIN 26 + +#define Z_STEP_PIN 64 +#define Z_DIR_PIN 63 +#define Z_ENABLE_PIN 15 + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) +#define TEMP_1_PIN 2 // Analog Input (unused) +#define TEMP_2_PIN 5 // Analog Input (OnBoard thermistor beta 3950) +#define TEMP_BED_PIN 1 // Analog Input (BED thermistor) + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 53 +#else + #define MAX6675_SS_PIN 53 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // HOTEND0 MOSFET +#define HEATER_BED_PIN 7 // BED MOSFET + +#ifndef FAN_PIN + #define FAN_PIN 11 // FAN1 header on board - PRINT FAN +#endif +#define FAN1_PIN 12 // FAN2 header on board - CONTROLLER FAN +#define FAN2_PIN 9 // FAN3 header on board - EXTRUDER0 FAN +//#define FAN3_PIN 8 // FAN0 4-pin header on board + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 40 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(RADDS_DISPLAY) + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #undef SDSS + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #elif HAS_U8GLIB_I2C_OLED + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #define BEEPER_PIN -1 + + #elif ENABLED(MINIPANEL) + #define BTN_EN1 52 + #define BTN_EN2 50 + #define BTN_ENC 48 + #define LCD_SDSS 4 + #define SD_DETECT_PIN 14 + #define BEEPER_PIN 41 + #define DOGLCD_A0 46 + #define DOGLCD_CS 45 + + #endif // SPARK_FULL_GRAPHICS +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h new file mode 100644 index 00000000..22edb702 --- /dev/null +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -0,0 +1,173 @@ +/** + * 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 + +/** + * PRINTRBOARD_G2 + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "PRINTRBOARD_G2" +#endif + +// +// Servos +// +//#define SERVO0_PIN -1 +//#define SERVO1_PIN -1 + +// +// Limit Switches +// +#define X_MIN_PIN 22 // PB26 +#define Y_MAX_PIN 18 // PA11 +#define Z_MIN_PIN 19 // PA10 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 22 +#endif + +#ifndef FIL_RUNOUT_PIN + //#define FIL_RUNOUT_PIN 57 // PA22 +#endif +#ifndef FIL_RUNOUT2_PIN + //#define FIL_RUNOUT2_PIN 21 // PB13 +#endif + +// +// LED defines +// +//#define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) +//#define NEOPIXEL_PIN 20 // LED driving pin on motherboard +//#define NEOPIXEL_PIXELS 3 // Number of LEDs in the strip +//#define SDA0 20 // PB12 NeoPixel pin I2C data +//#define SCL0 21 // PB13 I2C clock + +// D0_12 #REF! (INDICATOR_LED) +// B28 JTAG-CLK +// B31 JTAG_TMS /SWD_DIO +//A18 INTERRUPT_OUT +//A12 USART_RX not used +//A13 USART_TX not used +//A14 UART_RTS +//A15 UART_CTS +//PB2 Unassigned +//PB4 to PB9 Unassigned +//#define UART_RX_PIN 0 // PA8 "RX0" +//#define UART_TX_PIN 1 // PA9 "TX0" +//#define UART_RTS_PIN 23 // PA14 +//#define UART_CTS_PIN 24 // PA15 + +// +// Steppers +// +#define Z_STEP_PIN 73 // PA21 MOTOR 1 +#define Z_DIR_PIN 75 // PA26 +#define Z_ENABLE_PIN 74 // PA25 + +#define X_STEP_PIN 66 // PB15 MOTOR 2 +#define X_DIR_PIN 54 // PA16 +#define X_ENABLE_PIN 67 // PB16 + +#define Y_STEP_PIN 34 // PA29 MOTOR 3 +#define Y_DIR_PIN 35 // PB1 +#define Y_ENABLE_PIN 36 // PB0 + +#define E0_STEP_PIN 53 // PB14 MOTOR 4 +#define E0_DIR_PIN 78 // PB23 +#define E0_ENABLE_PIN 37 // PB22 + +// Microstepping mode pins +#define Z_MS1_PIN 52 // PB21 MODE0 MOTOR 1 +#define Z_MS2_PIN 52 // PB21 MODE1 +#define Z_MS3_PIN 65 // PB20 MODE2 + +#define X_MS1_PIN 43 // PA20 MODE0 MOTOR 2 +#define X_MS2_PIN 43 // PA20 MODE1 +#define X_MS3_PIN 42 // PA19 MODE2 + +#define Y_MS1_PIN 77 // PA28 MODE0 MOTOR 3 +#define Y_MS2_PIN 77 // PA28 MODE1 +#define Y_MS3_PIN 76 // PA27 MODE2 + +#define E0_MS1_PIN 38 // PB11 MODE0 MOTOR 4 +#define E0_MS2_PIN 38 // PB11 MODE1 +#define E0_MS3_PIN 39 // PB10 MODE2 + +// Motor current PWM pins +#define MOTOR_CURRENT_PWM_X_PIN 62 // PB17 MOTOR 1 +#define MOTOR_CURRENT_PWM_Z_PIN 63 // PB18 MOTOR 2 +#define MOTOR_CURRENT_PWM_Y_PIN 64 // PB19 MOTOR 3 +#define MOTOR_CURRENT_PWM_E_PIN 61 // PA2 MOTOR 4 + +#define DEFAULT_PWM_MOTOR_CURRENT { 300, 400, 1000} // XY Z E0, 1000 = 1000mAh + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // digital 56 PA23 +#define TEMP_BED_PIN 5 // digital 59 PA4 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 40 // PA5 +#define HEATER_BED_PIN 41 // PB24 + +#ifndef FAN_PIN + #define FAN_PIN 13 // PB27 Fan1A +#endif +#define FAN1_PIN 58 // PA6 Fan1B + +#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 MISO_PIN 68 // set to unused pins for now +#define MOSI_PIN 69 // set to unused pins for now +#define SCK_PIN 70 // set to unused pins for now +#define SDSS 71 // set to unused pins for now + +/** + * G2 uses 8 pins that are not available in the DUE environment: + * 34 PA29 - Y_STEP_PIN + * 35 PB1 - Y_DIR_PIN + * 36 PB0 - Y_ENABLE_PIN + * 37 PB22 - E0_ENABLE_PIN + * 38 PB11 - E0_MS1_PIN - normally used by the USB native port + * 39 PB10 - E0_MS3_PIN - normally used by the USB native port + * 40 PA5 - HEATER_0_PIN + * 41 PB24 - HEATER_BED_PIN + * + * None of these are in the arduino_due_x variant so digitalWrite and digitalRead can't be used on them. + * + * They can be accessed via FASTIO functions WRITE, READ, OUT_WRITE, OUTPUT, ... + */ diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h new file mode 100644 index 00000000..60fe3512 --- /dev/null +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -0,0 +1,294 @@ +/** + * 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 + +/** + * RADDS + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RADDS" + +// +// EEPROM +// +#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB +#endif + +// +// Servos +// +#if !HAS_CUTTER + #define SERVO0_PIN 5 +#endif +#define SERVO1_PIN 6 +#define SERVO2_PIN 39 +#define SERVO3_PIN 40 + +// +// Limit Switches +// +#define X_MIN_PIN 28 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 30 +#define Y_MAX_PIN 36 +#define Z_MIN_PIN 32 +#define Z_MAX_PIN 38 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 38 +#endif + +// +// Steppers +// +#define X_STEP_PIN 24 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 26 +#ifndef X_CS_PIN + #define X_CS_PIN 25 +#endif + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 22 +#ifndef Y_CS_PIN + #define Y_CS_PIN 27 +#endif + +#define Z_STEP_PIN 2 +#define Z_DIR_PIN 3 +#define Z_ENABLE_PIN 15 +#ifndef Z_CS_PIN + #define Z_CS_PIN 29 +#endif + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 +#ifndef E0_CS_PIN + #define E0_CS_PIN 31 +#endif + +#define E1_STEP_PIN 64 +#define E1_DIR_PIN 63 +#define E1_ENABLE_PIN 65 +#ifndef E1_CS_PIN + #define E1_CS_PIN 33 +#endif + +#define E2_STEP_PIN 51 +#define E2_DIR_PIN 53 +#define E2_ENABLE_PIN 49 +#ifndef E2_CS_PIN + #define E2_CS_PIN 35 +#endif + +/** + * RADDS Extension Board V2 / V3 + * http://doku.radds.org/dokumentation/extension-board + */ +//#define RADDS_EXTENSION 2 +#if RADDS_EXTENSION >= 2 + #define E3_DIR_PIN 33 + #define E3_STEP_PIN 35 + #define E3_ENABLE_PIN 37 + #ifndef E3_CS_PIN + #define E3_CS_PIN 6 + #endif + + #if RADDS_EXTENSION == 3 + + #define E4_DIR_PIN 27 + #define E4_STEP_PIN 29 + #define E4_ENABLE_PIN 31 + #ifndef E4_CS_PIN + #define E4_CS_PIN 39 + #endif + + #define E5_DIR_PIN 66 + #define E5_STEP_PIN 67 + #define E5_ENABLE_PIN 68 + #ifndef E5_CS_PIN + #define E5_CS_PIN 6 + #endif + + #define RADDS_EXT_MSI_PIN 69 + + #define BOARD_INIT() OUT_WRITE(RADDS_EXT_VDD_PIN, HIGH) + + #else + + #define E4_DIR_PIN 27 + #define E4_STEP_PIN 29 + #define E4_ENABLE_PIN 31 + #ifndef E4_CS_PIN + #define E4_CS_PIN 39 + #endif + + // E3 and E4 share the same MSx pins + #define E3_MS1_PIN 67 + #define E4_MS1_PIN 67 + #define E3_MS2_PIN 68 + #define E4_MS2_PIN 68 + #define E3_MS3_PIN 69 + #define E4_MS3_PIN 69 + + #define RADDS_EXT_VDD2_PIN 66 + + #define BOARD_INIT() do{ OUT_WRITE(RADDS_EXT_VDD_PIN, HIGH); OUT_WRITE(RADDS_EXT_VDD2_PIN, HIGH); }while(0) + + #endif + + #define RADDS_EXT_VDD_PIN 25 + +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_2_PIN 2 // Analog Input +#define TEMP_3_PIN 3 // Analog Input +#define TEMP_4_PIN 5 // dummy so will compile when PINS_DEBUGGING is enabled +#define TEMP_BED_PIN 4 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 53 +#else + #define MAX6675_SS_PIN 49 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#if !HAS_CUTTER + #define HEATER_BED_PIN 7 // BED +#endif + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 + +// +// Misc. Functions +// +#define SD_DETECT_PIN 14 +#define PS_ON_PIN 40 // SERVO3_PIN + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 39 // SERVO2_PIN +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER + #if !NUM_SERVOS + #define SPINDLE_LASER_PWM_PIN 5 // SERVO0_PIN + #endif + #define SPINDLE_LASER_ENA_PIN 7 // HEATER_BED_PIN - Pullup/down! +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ENABLED(RADDS_DISPLAY) + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + #define LCD_PINS_D5 45 + #define LCD_PINS_D6 46 + #define LCD_PINS_D7 47 + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define BTN_BACK 71 + + #define SDSS 10 + #define SD_DETECT_PIN 14 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + // The REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER requires + // an adapter such as https://www.thingiverse.com/thing:1740725 + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + + #define BEEPER_PIN 41 + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + + #define SDSS 10 + #define SD_DETECT_PIN 14 + + #elif HAS_U8GLIB_I2C_OLED + + #define BTN_EN1 50 + #define BTN_EN2 52 + #define BTN_ENC 48 + #define BEEPER_PIN 41 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 14 + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + #define LCD_PINS_D4 29 + #define LCD_PINS_ENABLE 27 + #define LCD_PINS_RS 25 + + #define BTN_EN1 35 + #define BTN_EN2 33 + #define BTN_ENC 37 + + #endif // SPARK_FULL_GRAPHICS + +#endif // HAS_WIRED_LCD + +#ifndef SDSS + #define SDSS 4 +#endif diff --git a/Marlin/src/pins/sam/pins_RAMPS4DUE.h b/Marlin/src/pins/sam/pins_RAMPS4DUE.h new file mode 100644 index 00000000..54548333 --- /dev/null +++ b/Marlin/src/pins/sam/pins_RAMPS4DUE.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 + +/** + * Arduino Mega or Due with RAMPS4DUE pin assignments + * + * Applies to the following boards: + * + * RAMPS4DUE_EFB (Hotend, Fan, Bed) + * RAMPS4DUE_EEB (Hotend0, Hotend1, Bed) + * RAMPS4DUE_EFF (Hotend, Fan0, Fan1) + * RAMPS4DUE_EEF (Hotend0, Hotend1, Fan) + * RAMPS4DUE_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS4DUE + * A13 | A9/D63 (shares the same pin with AUX2_4PIN) + * A14 | A10/D64 (shares the same pin with AUX2_5PIN) + * A15 | NC + */ + +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RAMPS4DUE" + +#define IS_RAMPS4DUE + +// +// Temperature Sensors +// +#define TEMP_0_PIN 9 // Analog Input +#define TEMP_1_PIN -1 // Analog Input +#define TEMP_BED_PIN 10 // Analog Input + +#include "../ramps/pins_RAMPS.h" diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h new file mode 100644 index 00000000..bfc3968f --- /dev/null +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -0,0 +1,132 @@ +/** + * 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 + +/** + * Arduino Mega or Due with RAMPS Duo pin assignments + * + * Applies to the following boards: + * + * RAMPS_DUO_EFB (Hotend, Fan, Bed) + * RAMPS_DUO_EEB (Hotend0, Hotend1, Bed) + * RAMPS_DUO_EFF (Hotend, Fan0, Fan1) + * RAMPS_DUO_EEF (Hotend0, Hotend1, Fan) + * RAMPS_DUO_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS_DUO + * A9/D63 | A12/D66 + * A10/D64 | A13/D67 + * A11/D65 | A14/D68 + * A12/D66 | A15/D69 + * A13 | A9 + * A14 | A10 + * A15 | A11 + */ + +#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RAMPS Duo" + +#define IS_RAMPS_DUO + +#include "../ramps/pins_RAMPS.h" + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN 11 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 10 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#undef MAX6675_SS_PIN +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 69 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 69 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if BOTH(NEWPANEL, PANEL_ONE) + #undef LCD_PINS_D4 + #define LCD_PINS_D4 68 + + #undef LCD_PINS_D5 + #define LCD_PINS_D5 69 + + #undef LCD_PINS_D7 + #define LCD_PINS_D7 67 + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #undef BTN_EN1 + #define BTN_EN1 67 + + #undef BTN_ENC + #define BTN_ENC 66 + + #elif ENABLED(MINIPANEL) + + #undef DOGLCD_CS + #define DOGLCD_CS 69 + + #undef LCD_BACKLIGHT_PIN + #define LCD_BACKLIGHT_PIN 68 // backlight LED on A14/D68 + + #undef KILL_PIN + #define KILL_PIN 67 + + #undef BTN_EN2 + #define BTN_EN2 66 + + #else + + #if ENABLED(REPRAPWORLD_KEYPAD) + #undef BTN_EN1 + #define BTN_EN1 67 // encoder + + #undef BTN_ENC + #define BTN_ENC 66 // enter button + #elif ENABLED(PANEL_ONE) + #undef BTN_EN2 + #define BTN_EN2 66 // AUX2 PIN 4 + #endif + #endif + + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h new file mode 100644 index 00000000..ee525eef --- /dev/null +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -0,0 +1,235 @@ +/** + * 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 + +/** + * RAMPS-FD + * + * No EEPROM + * Use 4k7 thermistor tables + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "RAMPS-FD v1" +#endif + +#define INVERTED_HEATER_PINS +#define INVERTED_BED_PINS +#define INVERTED_FAN_PINS + +// +// Servos +// +#define SERVO0_PIN 7 +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#define SERVO3_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 22 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 24 +#define Y_MAX_PIN 38 +#define Z_MIN_PIN 26 +#define Z_MAX_PIN 34 + +// +// Steppers +// +#define X_STEP_PIN 63 +#define X_DIR_PIN 62 +#define X_ENABLE_PIN 48 +#ifndef X_CS_PIN + #define X_CS_PIN 68 +#endif + +#define Y_STEP_PIN 65 +#define Y_DIR_PIN 64 +#define Y_ENABLE_PIN 46 +#ifndef Y_CS_PIN + #define Y_CS_PIN 60 +#endif + +#define Z_STEP_PIN 67 +#define Z_DIR_PIN 66 +#define Z_ENABLE_PIN 44 +#ifndef Z_CS_PIN + #define Z_CS_PIN 58 +#endif + +#define E0_STEP_PIN 36 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 42 +#ifndef E0_CS_PIN + #define E0_CS_PIN 67 +#endif + +#define E1_STEP_PIN 43 +#define E1_DIR_PIN 41 +#define E1_ENABLE_PIN 39 +#ifndef E1_CS_PIN + #define E1_CS_PIN 61 +#endif + +#define E2_STEP_PIN 32 +#define E2_DIR_PIN 47 +#define E2_ENABLE_PIN 45 +#ifndef E2_CS_PIN + #define E2_CS_PIN 59 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 3 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 53 +#else + #define MAX6675_SS_PIN 49 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 9 +#define HEATER_1_PIN 10 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 8 + +#ifndef FAN_PIN + #define FAN_PIN 12 +#endif + +// +// Misc. Functions +// +#define SDSS 4 +#define LED_PIN 13 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + // ramps-fd lcd adaptor + + #define BEEPER_PIN 37 + #define BTN_EN1 33 + #define BTN_EN2 31 + #define BTN_ENC 35 + #define SD_DETECT_PIN 49 + + #if ENABLED(NEWPANEL) + #define LCD_PINS_RS 16 + #define LCD_PINS_ENABLE 17 + #endif + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS LCD_PINS_ENABLE + #define DOGLCD_A0 LCD_PINS_RS + #define DOGLCD_SCK 76 + #define DOGLCD_MOSI 75 + + //#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 23 // 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 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(NEWPANEL) + + #define LCD_PINS_D4 23 + #define LCD_PINS_D5 25 + #define LCD_PINS_D6 27 + #define LCD_PINS_D7 29 + + #if ENABLED(MINIPANEL) + #define DOGLCD_CS 25 + #define DOGLCD_A0 27 + #endif + + #endif + + #if ANY(VIKI2, miniVIKI) + #define DOGLCD_A0 16 + #define KILL_PIN 51 + #define STAT_LED_BLUE_PIN 29 + #define STAT_LED_RED_PIN 23 + #define DOGLCD_CS 17 + #define DOGLCD_SCK 76 // SCK_PIN - Required for DUE Hardware SPI + #define DOGLCD_MOSI 75 // MOSI_PIN + #define DOGLCD_MISO 74 // MISO_PIN + #endif + +#endif // HAS_WIRED_LCD + +#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 Serial1 + //#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 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HOTENDS < 3 && HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) + #define SPINDLE_LASER_ENA_PIN 45 // Use E2 ENA + #define SPINDLE_LASER_PWM_PIN 12 // Hardware PWM + #define SPINDLE_DIR_PIN 47 // Use E2 DIR +#endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h new file mode 100644 index 00000000..55a42b2a --- /dev/null +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V2.h @@ -0,0 +1,52 @@ +/** + * 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 + +/** + * RAMPS-FD v2 + * + * EEPROM supported + * Use 1k thermistor tables + */ + +#define BOARD_INFO_NAME "RAMPS-FD v2" + +#ifndef E0_CS_PIN + #define E0_CS_PIN 69 // moved from A13 to A15 on v2.2, if not earlier +#endif + +#include "pins_RAMPS_FD_V1.h" + +#undef INVERTED_HEATER_PINS +#undef INVERTED_BED_PINS +#undef INVERTED_FAN_PINS + +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x10000 // 64K in a 24C512 + +#ifndef PS_ON_PIN + #define PS_ON_PIN 12 +#endif + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h new file mode 100644 index 00000000..9b76ee29 --- /dev/null +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -0,0 +1,110 @@ +/** + * 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 + +/** + * Arduino Due with RAMPS-SMART pin assignments + * + * Applies to the following boards: + * + * RAMPS_SMART_EFB (Hotend, Fan, Bed) + * RAMPS_SMART_EEB (Hotend0, Hotend1, Bed) + * RAMPS_SMART_EFF (Hotend, Fan0, Fan1) + * RAMPS_SMART_EEF (Hotend0, Hotend1, Fan) + * RAMPS_SMART_SF (Spindle, Controller Fan) + * + * Differences between + * RAMPS_14 | RAMPS-SMART + * NONE | D16 (Additional AUX-3 pin(AUX3_2PIN), shares the same pin with AUX4_18PIN) + * NONE | D17 (Additional AUX-3 pin(AUX3_1PIN), shares the same pin with AUX4_17PIN) + * D0 | NONE + * D1 | NONE + * A3/D57 | NONE + * A4/D58 | NONE + * A5/D59 | A3/D57 + * A9/D63 | A4/D58 + * A10/D64 | A5/D59 + * A11/D65 | D66 + * A12/D66 | D67 + * A13 | A9 + * A14 | A10 + * A15 | A11 + * + * + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER works fine connected to AUX-4 with + * Smart Adapter, but requires removing the AUX3 pin header on the adapter to fit. + * To use the SD card reader, wire its pins to AUX-3 (and use Software SPI). + * + * To use Hardware SPI for SD, the SDSS pin must be set to 52 instead of 53. + * Hardware SPI also requires additional wiring because the board doesn't pass + * the 6-pin SPI header from the DUE board. + * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RAMPS-SMART" +#define IS_RAMPS_SMART +#include "../ramps/pins_RAMPS.h" + +// I2C EEPROM with 4K of space +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 + +#define RESET_PIN 42 // Resets the board if the jumper is attached + +// +// Temperature Sensors +// +#undef TEMP_0_PIN +#define TEMP_0_PIN 9 // Analog Input + +#undef TEMP_1_PIN +#define TEMP_1_PIN 10 // Analog Input + +#undef TEMP_BED_PIN +#define TEMP_BED_PIN 11 // Analog Input + +// SPI for Max6675 or Max31855 Thermocouple +#undef MAX6675_SS_PIN +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 67 // Don't use 53 if using Display/SD card +#else + #define MAX6675_SS_PIN 67 // Don't use 49 (SD_DETECT_PIN) +#endif + +// +// LCD / Controller +// +// Support for AZSMZ 12864 LCD with SD Card 3D printer smart controller control panel +#if ENABLED(AZSMZ_12864) + #define BEEPER_PIN 66 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 65 + #define DOGLCD_A0 59 + #define DOGLCD_CS 44 + #define BTN_EN1 58 + #define BTN_EN2 40 + #define BTN_ENC 67 // Smart RAMPS 1.42 pinout diagram on RepRap WIKI erroneously says this should be pin 66 + #define SD_DETECT_PIN 49 // Pin 49 for display sd interface, 72 for easy adapter board + #define KILL_PIN 42 +#endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h new file mode 100644 index 00000000..b9e61fb2 --- /dev/null +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -0,0 +1,274 @@ +/** + * 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 . + * + * Ported sys0724 & Vynt + */ + +/** + * Arduino Mega? or Due with RuRAMPS4DUE pin assignments + * + * Applies to the following boards: + * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) + * + * Differences between + * RADDS | RuRAMPS4DUE + * | + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RuRAMPS4Due v1.1" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 45 +#define X_MAX_PIN 39 +#define Y_MIN_PIN 46 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 47 +#define Z_MAX_PIN 43 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 43 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 // Support Extension Board +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN -1 +#endif + +#define Y_STEP_PIN 32 // Support Extension Board +#define Y_DIR_PIN 35 +#define Y_ENABLE_PIN 34 +#ifndef Y_CS_PIN + #define Y_CS_PIN -1 +#endif + +#define Z_STEP_PIN 30 // Support Extension Board +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 33 +#ifndef Z_CS_PIN + #define Z_CS_PIN -1 +#endif + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 31 +#ifndef E0_CS_PIN + #define E0_CS_PIN -1 +#endif + +#define E1_STEP_PIN 22 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +#define E2_STEP_PIN 25 +#define E2_DIR_PIN 23 +#define E2_ENABLE_PIN 27 +#ifndef E2_CS_PIN + #define E2_CS_PIN -1 +#endif + +#define E3_STEP_PIN 15 // Only For Extension Board +#define E3_DIR_PIN 14 +#define E3_ENABLE_PIN 61 +#ifndef E3_CS_PIN + #define E3_CS_PIN -1 +#endif + +// For Future: Microstepping pins - Mapping not from fastio.h (?) +//#define E3_MS1_PIN ? +//#define E3_MS2_PIN ? +//#define E3_MS3_PIN ? + +#if HAS_CUSTOM_PROBE_PIN + #define Z_MIN_PROBE_PIN 49 +#endif + +#if HAS_FILAMENT_SENSOR + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN Y_MIN_PIN + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED H1 + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 +#define CONTROLLER_FAN_PIN -1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // ANALOG A0 +#define TEMP_1_PIN 1 // ANALOG A1 +#define TEMP_2_PIN 2 // ANALOG A2 +#define TEMP_3_PIN 3 // ANALOG A3 +#define TEMP_BED_PIN 4 // ANALOG A4 + +// The thermocouple uses Analog pins +#if ENABLED(VER_WITH_THERMOCOUPLE) // Defined in Configuration.h + #define TEMP_4_PIN 5 // A5 + #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) +#endif + +// SPI for Max6675 or Max31855 Thermocouple +/* +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 53 +#else + #define MAX6675_SS_PIN 49 +#endif +*/ + +// +// Misc. Functions +// +#define SDSS 4 // 4,10,52 if using HW SPI. +#define LED_PIN -1 // 13 - HEATER_0_PIN +#define PS_ON_PIN -1 // 65 + +// MKS TFT / Nextion Use internal USART-1 +#define TFT_LCD_MODULE_COM 1 +#define TFT_LCD_MODULE_BAUDRATE 115600 + +// ESP WiFi Use internal USART-2 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115600 +#define ESP_WIFI_MODULE_RESET_PIN -1 +#define PIGGY_GPIO_PIN -1 + +// +// EEPROM +// +#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 +//#define SPI_CHAN_EEPROM1 ? +//#define SPI_EEPROM1_CS ? +// 2K EEPROM +//#define SPI_EEPROM2_CS ? +// 32Mb FLASH +//#define SPI_FLASH_CS ? + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BEEPER_PIN 62 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + #define SD_DETECT_PIN 51 + #endif + + #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define LCD_PINS_RS 63 + #define LCD_PINS_ENABLE 64 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 52 + #define LCD_PINS_ENABLE 53 + + #elif HAS_U8GLIB_I2C_OLED + + #define BEEPER_PIN 62 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 51 + + #elif ENABLED(FYSETC_MINI_12864) + + #define BEEPER_PIN 62 + #define DOGLCD_CS 64 + #define DOGLCD_A0 63 + + //#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 48 // 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 50 // D5 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN 52 // D6 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN 53 // D7 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN 50 // D5 + #endif + + #elif ENABLED(SPARK_FULL_GRAPHICS) + + //http://doku.radds.org/dokumentation/other-electronics/sparklcd/ + #error "Oops! SPARK_FULL_GRAPHICS not supported with RURAMPS4D." + //#define LCD_PINS_D4 29 //? + //#define LCD_PINS_ENABLE 27 //? + //#define LCD_PINS_RS 25 //? + //#define BTN_EN1 35 //? + //#define BTN_EN2 33 //? + //#define BTN_ENC 37 //? + + #endif // SPARK_FULL_GRAPHICS + + #if ENABLED(NEWPANEL) + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + #endif + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h new file mode 100644 index 00000000..dc0c1279 --- /dev/null +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -0,0 +1,256 @@ +/** + * 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 . + * + * Ported sys0724 & Vynt + */ + +/** + * Arduino Mega? or Due with RuRAMPS4DUE pin assignments + * + * Applies to the following boards: + * RURAMPS4DUE (Hotend0, Hotend1, Hotend2, Fan0, Fan1, Bed) + * + * Differences between + * RADDS | RuRAMPS4DUE + * | + */ + +#if NOT_TARGET(__SAM3X8E__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RuRAMPS4Due v1.3" + +// +// Servos +// +#define SERVO0_PIN 5 +#define SERVO1_PIN 3 + +// +// Limit Switches +// +#define X_MIN_PIN 45 +#define X_MAX_PIN 39 +#define Y_MIN_PIN 46 +#define Y_MAX_PIN 41 +#define Z_MIN_PIN 47 +#define Z_MAX_PIN 43 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 49 +#endif + +// +// Steppers +// +#define X_STEP_PIN 37 // Support Extension Board +#define X_DIR_PIN 36 +#define X_ENABLE_PIN 31 +#ifndef X_CS_PIN + #define X_CS_PIN 38 +#endif + +#define Y_STEP_PIN 32 // Support Extension Board +#define Y_DIR_PIN 35 +#define Y_ENABLE_PIN 31 +#ifndef Y_CS_PIN + #define Y_CS_PIN 34 +#endif + +#define Z_STEP_PIN 30 // Support Extension Board +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 31 +#ifndef Z_CS_PIN + #define Z_CS_PIN 10 +#endif + +#define E0_STEP_PIN 29 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 33 +#ifndef E0_CS_PIN + #define E0_CS_PIN 14 +#endif + +#define E1_STEP_PIN 22 +#define E1_DIR_PIN 24 +#define E1_ENABLE_PIN 26 +#ifndef E1_CS_PIN + #define E1_CS_PIN 15 +#endif + +#define E2_STEP_PIN 25 +#define E2_DIR_PIN 23 +#define E2_ENABLE_PIN 27 +#ifndef E2_CS_PIN + #define E2_CS_PIN 61 +#endif + +#if HAS_CUSTOM_PROBE_PIN + #define Z_MIN_PROBE_PIN 49 +#endif + +#if HAS_FILAMENT_SENSOR + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN Y_MIN_PIN + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_BED_PIN 7 // BED H1 + +#define FAN_PIN 9 +#define FAN1_PIN 8 +#define CONTROLLER_FAN_PIN -1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // ANALOG A0 +#define TEMP_1_PIN 1 // ANALOG A1 +#define TEMP_2_PIN 2 // ANALOG A2 +#define TEMP_3_PIN 3 // ANALOG A3 +#define TEMP_BED_PIN 4 // ANALOG A4 + +// The thermocouple uses Analog pins +#if ENABLED(VER_WITH_THERMOCOUPLE) // Defined in Configuration.h + #define TEMP_4_PIN 5 // A5 + #define TEMP_5_PIN 6 // A6 (Marlin 2.0 not support) +#endif + +// SPI for Max6675 or Max31855 Thermocouple +/* +#if DISABLED(SDSUPPORT) + #define MAX6675_SS_PIN 53 +#else + #define MAX6675_SS_PIN 49 +#endif +*/ + +// +// Misc. Functions +// +#define SDSS 4 // 4,10,52 if using HW SPI. +#define LED_PIN -1 // 13 - HEATER_0_PIN +#define PS_ON_PIN -1 // 65 + +// MKS TFT / Nextion Use internal USART-1 +#define TFT_LCD_MODULE_COM 1 +#define TFT_LCD_MODULE_BAUDRATE 115200 + +// ESP WiFi Use internal USART-2 +#define ESP_WIFI_MODULE_COM 2 +#define ESP_WIFI_MODULE_BAUDRATE 115200 +#define ESP_WIFI_MODULE_RESET_PIN -1 +#define PIGGY_GPIO_PIN -1 + +// +// EEPROM +// +#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 +//#define SPI_CHAN_EEPROM1 ? +//#define SPI_EEPROM1_CS ? +// 2K EEPROM +//#define SPI_EEPROM2_CS ? +// 32Mb FLASH +//#define SPI_FLASH_CS ? + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ANY(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER, REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BEEPER_PIN 62 + #define LCD_PINS_D4 48 + #define LCD_PINS_D5 50 + #define LCD_PINS_D6 52 + #define LCD_PINS_D7 53 + #define SD_DETECT_PIN 51 + #endif + + #if EITHER(RADDS_DISPLAY, REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define LCD_PINS_RS 63 + #define LCD_PINS_ENABLE 64 + + #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + + #define LCD_PINS_RS 52 + #define LCD_PINS_ENABLE 53 + + #elif HAS_U8GLIB_I2C_OLED + + #define BEEPER_PIN 62 + #define LCD_SDSS 10 + #define SD_DETECT_PIN 51 + + #elif ENABLED(FYSETC_MINI_12864) + + #define BEEPER_PIN 62 + #define DOGLCD_CS 64 + #define DOGLCD_A0 63 + + //#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 48 // 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 50 // D5 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN 52 // D6 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN 53 // D7 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN 50 // D5 + #endif + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 52 + #define DOGLCD_CS 50 + + #define SD_DETECT_PIN 51 + + #endif + + #if ENABLED(NEWPANEL) + #define BTN_EN1 44 + #define BTN_EN2 42 + #define BTN_ENC 40 + #endif + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h new file mode 100644 index 00000000..0b91ba61 --- /dev/null +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -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 . + * + */ +#pragma once + +/** + * ReprapWorld ULTRATRONICS v1.0 + * https://reprapworld.com/documentation/datasheet_ultratronics10_05.pdf + */ + +#if NOT_TARGET(ARDUINO_ARCH_SAM) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Ultratronics v1.0" + +// +// Servos +// +#if NUM_SERVOS > 0 + #define SERVO0_PIN 11 + #if NUM_SERVOS > 1 + #define SERVO1_PIN 12 + #endif +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 31 +#define X_MAX_PIN 30 +#define Y_MIN_PIN 12 +#define Y_MAX_PIN 11 +#define Z_MIN_PIN 29 +#define Z_MAX_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 35 +#define X_DIR_PIN 34 +#define X_ENABLE_PIN 37 +#ifndef X_CS_PIN + #define X_CS_PIN 18 +#endif + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 +#define Y_ENABLE_PIN 33 +#ifndef Y_CS_PIN + #define Y_CS_PIN 19 +#endif + +#define Z_STEP_PIN 25 +#define Z_DIR_PIN 26 +#define Z_ENABLE_PIN 24 +#ifndef Z_CS_PIN + #define Z_CS_PIN 16 +#endif + +#define E0_STEP_PIN 47 +#define E0_DIR_PIN 46 +#define E0_ENABLE_PIN 48 +#ifndef E0_CS_PIN + #define E0_CS_PIN 17 +#endif + +#define E1_STEP_PIN 44 +#define E1_DIR_PIN 36 +#define E1_ENABLE_PIN 45 +#ifndef E1_CS_PIN + #define E1_CS_PIN -1 +#endif + +#define E2_STEP_PIN 42 +#define E2_DIR_PIN 41 +#define E2_ENABLE_PIN 43 +#ifndef E2_CS_PIN + #define E2_CS_PIN -1 +#endif + +#define E3_STEP_PIN 39 +#define E3_DIR_PIN 38 +#define E3_ENABLE_PIN 40 +#ifndef E3_CS_PIN + #define E3_CS_PIN -1 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 2 // Analog Input +#define TEMP_2_PIN 3 // Analog Input +#define TEMP_3_PIN 4 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 +#define HEATER_1_PIN 8 +#define HEATER_2_PIN 7 +#define HEATER_3_PIN 9 +#define HEATER_BED_PIN 2 + +#ifndef FAN_PIN + #define FAN_PIN 6 +#endif +#define FAN2_PIN 5 + +// +// Misc. Functions +// +#define SDSS 59 +#define SD_DETECT_PIN 60 +#define LED_PIN 13 +#define PS_ON_PIN 32 + +// +// SPI Buses +// + +#define DAC0_SYNC 53 // PB14 +#define SPI_CHAN_DAC 1 + +#define SPI_CHAN_EEPROM1 -1 +#define SPI_EEPROM1_CS -1 +#define SPI_EEPROM2_CS -1 +#define SPI_FLASH_CS -1 + +#define SCK_PIN 76 +#define MISO_PIN 74 +#define MOSI_PIN 75 + +// SPI for Max6675 or Max31855 Thermocouple +#define MAX6675_SS_PIN 65 +#define MAX31855_SS0 65 +#define MAX31855_SS1 52 +#define MAX31855_SS2 50 +#define MAX31855_SS3 51 + +#define ENC424_SS 61 + +// +// LCD / Controller +// + +#define BEEPER_PIN 27 + +#if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define LCD_PINS_RS A8 // CS chip select / SS chip slave select + #define LCD_PINS_ENABLE MOSI // SID (MOSI) + #define LCD_PINS_D4 SCK // SCK (CLK) clock + + #define BTN_EN1 20 + #define BTN_EN2 21 + #define BTN_ENC 64 + +#endif // REPRAPWORLD_GRAPHICAL_LCD diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h new file mode 100644 index 00000000..6076be07 --- /dev/null +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -0,0 +1,611 @@ +/** + * 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 + +/** + * AGCM4 with RAMPS v1.4.4 pin assignments + */ + +#if NOT_TARGET(ARDUINO_GRAND_CENTRAL_M4) + #error "Oops! Select 'Adafruit Grand Central M4' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "AGCM4 RAMPS 1.4.4" +#endif + +// +// Servos +// +#define SERVO0_PIN 11 +#define SERVO1_PIN 6 +#define SERVO2_PIN 5 +#define SERVO3_PIN 4 + +// +// EEPROM +// +//#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) + +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define X_MAX_PIN 2 +#define Y_MIN_PIN 14 +#define Y_MAX_PIN 15 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN 19 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 18 +#endif + +// +// Steppers +// +#define X_STEP_PIN 67 // Mega/Due:54 - AGCM4:67 +#define X_DIR_PIN 68 // Mega/Due:55 - AGCM4:68 +#define X_ENABLE_PIN 38 +#ifndef X_CS_PIN + #define X_CS_PIN 47 +#endif + +#define Y_STEP_PIN 73 // Mega/Due:60 - AGCM4:73 +#define Y_DIR_PIN 74 // Mega/Due:61 - AGCM4:74 +#define Y_ENABLE_PIN 69 // Mega/Due:56 - AGCM4:69 +#ifndef Y_CS_PIN + #define Y_CS_PIN 45 +#endif + +#define Z_STEP_PIN 46 +#define Z_DIR_PIN 48 +#define Z_ENABLE_PIN 54 // Mega/Due:62 - AGCM4:54 +#ifndef Z_CS_PIN + #define Z_CS_PIN 32 +#endif + +#define Z2_STEP_PIN 36 +#define Z2_DIR_PIN 34 +#define Z2_ENABLE_PIN 30 +#ifndef Z2_CS_PIN + #define Z2_CS_PIN 22 +#endif + +#define E0_STEP_PIN 26 +#define E0_DIR_PIN 28 +#define E0_ENABLE_PIN 24 +#ifndef E0_CS_PIN + #define E0_CS_PIN 43 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 13 +#define TEMP_BED_PIN 14 +#define TEMP_CHAMBER_PIN 15 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 10 +#define HEATER_BED_PIN 8 +#define FAN_PIN 9 +#define FAN1_PIN 7 +#define FAN2_PIN 12 + +// +// Misc. Functions +// +#define SDSS 53 +#define LED_PIN 13 + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 5 // Analog Input on AUX2 +#endif + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 70 +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 39 +#endif + +#if ENABLED(CASE_LIGHT_ENABLE) && !defined(CASE_LIGHT_PIN) && !defined(SPINDLE_LASER_ENA_PIN) + #if NUM_SERVOS <= 1 // Prefer the servo connector + #define CASE_LIGHT_PIN 6 // Hardware PWM + #endif +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) + #if !NUM_SERVOS // Use servo connector if possible + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_DIR_PIN 5 + #else + #error "No auto-assignable Spindle/Laser pins available." + #endif +#endif + +// +// TMC software SPI +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI 58 // Mega/Due:66 - AGCM4:58 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO 44 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK 56 // Mega/Due:64 - AGCM4:56 + #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 Serial1 + //#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 + // + + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN 47 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN 47 + #endif + #ifndef X2_SERIAL_TX_PIN + #define X2_SERIAL_TX_PIN -1 + #endif + #ifndef X2_SERIAL_RX_PIN + #define X2_SERIAL_RX_PIN -1 + #endif + + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN 45 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN 45 + #endif + #ifndef Y2_SERIAL_TX_PIN + #define Y2_SERIAL_TX_PIN -1 + #endif + #ifndef Y2_SERIAL_RX_PIN + #define Y2_SERIAL_RX_PIN -1 + #endif + + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN 32 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN 32 + #endif + #ifndef Z2_SERIAL_TX_PIN + #define Z2_SERIAL_TX_PIN 22 + #endif + #ifndef Z2_SERIAL_RX_PIN + #define Z2_SERIAL_RX_PIN 22 + #endif + + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN 43 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN 43 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN -1 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN -1 + #endif + #ifndef E2_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN -1 + #endif + #ifndef E2_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN -1 + #endif + #ifndef E3_SERIAL_TX_PIN + #define E3_SERIAL_TX_PIN -1 + #endif + #ifndef E3_SERIAL_RX_PIN + #define E3_SERIAL_RX_PIN -1 + #endif + #ifndef E4_SERIAL_TX_PIN + #define E4_SERIAL_TX_PIN -1 + #endif + #ifndef E4_SERIAL_RX_PIN + #define E4_SERIAL_RX_PIN -1 + #endif + #ifndef E5_SERIAL_TX_PIN + #define E5_SERIAL_TX_PIN -1 + #endif + #ifndef E5_SERIAL_RX_PIN + #define E5_SERIAL_RX_PIN -1 + #endif + #ifndef E6_SERIAL_TX_PIN + #define E6_SERIAL_TX_PIN -1 + #endif + #ifndef E6_SERIAL_RX_PIN + #define E6_SERIAL_RX_PIN -1 + #endif + #ifndef E7_SERIAL_TX_PIN + #define E7_SERIAL_TX_PIN -1 + #endif + #ifndef E7_SERIAL_RX_PIN + #define E7_SERIAL_RX_PIN -1 + #endif +#endif + +////////////////////////// +// LCDs and Controllers // +////////////////////////// + +#if HAS_WIRED_LCD + + // + // LCD Display output pins + // + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + // TO TEST + //#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) + + // TO TEST + //#define LCD_PINS_RS 40 + //#define LCD_PINS_ENABLE 42 + //#define LCD_PINS_D4 57 // Mega/Due:65 - AGCM4:57 + //#define LCD_PINS_D5 58 // Mega/Due:66 - AGCM4:58 + //#define LCD_PINS_D6 44 + //#define LCD_PINS_D7 56 // Mega/Due:64 - AGCM4:56 + + #else + + #if ENABLED(CR10_STOCKDISPLAY) + + // TO TEST + //#define LCD_PINS_RS 27 + //#define LCD_PINS_ENABLE 29 + //#define LCD_PINS_D4 25 + + #if DISABLED(NEWPANEL) + // TO TEST + //#define BEEPER_PIN 37 + #endif + + #elif ENABLED(ZONESTAR_LCD) + + // TO TEST + //#define LCD_PINS_RS 56 // Mega/Due:64 - AGCM4:56 + //#define LCD_PINS_ENABLE 44 + //#define LCD_PINS_D4 55 // Mega/Due:63 - AGCM4:55 + //#define LCD_PINS_D5 40 + //#define LCD_PINS_D6 42 + //#define LCD_PINS_D7 57 // Mega/Due:65 - AGCM4:57 + + #else + + #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + // TO TEST + //#define LCD_PINS_DC 25 // Set as output on init + //#define LCD_PINS_RS 27 // Pull low for 1s to init + // DOGM SPI LCD Support + //#define DOGLCD_CS 16 + //#define DOGLCD_MOSI 17 + //#define DOGLCD_SCK 23 + //#define DOGLCD_A0 LCD_PINS_DC + #else + #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 + #endif + + #define LCD_PINS_D7 29 + + #if DISABLED(NEWPANEL) + #define BEEPER_PIN 33 + #endif + + #endif + + #if DISABLED(NEWPANEL) + // 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 + #endif + + #endif + + // + // LCD Display input pins + // + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #if ENABLED(CR10_STOCKDISPLAY) + // TO TEST + //#define BTN_EN1 17 + //#define BTN_EN2 23 + #else + #define BTN_EN1 31 + #define BTN_EN2 33 + #endif + + #define BTN_ENC 35 + #ifndef SD_DETECT_PIN + #define SD_DETECT_PIN 49 + #endif + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + // TO TEST + //#define LCD_BACKLIGHT_PIN 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + // TO TEST + //#define BTN_EN1 56 // Mega/Due:64 - AGCM4:56 + //#define BTN_EN2 72 // Mega/Due:59 - AGCM4:72 + //#define BTN_ENC 55 + //#define SD_DETECT_PIN 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + // TO TEST + //#define BTN_EN1 47 + //#define BTN_EN2 43 + //#define BTN_ENC 32 + //#define LCD_SDSS SDSS + //#define KILL_PIN 41 + + #elif ENABLED(LCD_I2C_VIKI) + + // TO TEST + //#define BTN_EN1 40 // https://files.panucatt.com/datasheets/viki_wiring_diagram.pdf explains 40/42. + //#define BTN_EN2 42 + //#define BTN_ENC -1 + + //#define LCD_SDSS SDSS + //#define SD_DETECT_PIN 49 + + #elif ANY(VIKI2, miniVIKI) + + // TO TEST + //#define DOGLCD_CS 45 + //#define DOGLCD_A0 44 + //#define LCD_SCREEN_ROT_180 + + //#define BEEPER_PIN 33 + //#define STAT_LED_RED_PIN 32 + //#define STAT_LED_BLUE_PIN 35 + + //#define BTN_EN1 22 + //#define BTN_EN2 7 + //#define BTN_ENC 39 + + //#define SD_DETECT_PIN -1 // Pin 49 for display SD interface, 72 for easy adapter board + //#define KILL_PIN 31 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + + // TO TEST + //#define DOGLCD_CS 29 + //#define DOGLCD_A0 27 + + //#define BEEPER_PIN 23 + //#define LCD_BACKLIGHT_PIN 33 + + //#define BTN_EN1 35 + //#define BTN_EN2 37 + //#define BTN_ENC 31 + + //#define LCD_SDSS SDSS + //#define SD_DETECT_PIN 49 + //#define KILL_PIN 41 + + #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + + // TO TEST + //#define BEEPER_PIN 37 + //#define BTN_ENC 35 + //#define SD_DETECT_PIN 49 + + //#ifndef KILL_PIN + // #define KILL_PIN 41 + //#endif + + #if ENABLED(MKS_MINI_12864) + + // TO TEST + //#define DOGLCD_A0 27 + //#define DOGLCD_CS 25 + + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + // not connected to a pin + //#define LCD_BACKLIGHT_PIN 57 // backlight LED on A11/D? (Mega/Due:65 - AGCM4:57) + + //#define BTN_EN1 31 + //#define BTN_EN2 33 + + #elif ENABLED(FYSETC_MINI_12864) + + // From https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 + + // TO TEST + //#define DOGLCD_A0 16 + //#define DOGLCD_CS 17 + + //#define BTN_EN1 33 + //#define BTN_EN2 31 + + //#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 23 // 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 + // TO TEST + //#define RGB_LED_R_PIN 25 + #endif + #ifndef RGB_LED_G_PIN + // TO TEST + //#define RGB_LED_G_PIN 27 + #endif + #ifndef RGB_LED_B_PIN + // TO TEST + //#define RGB_LED_B_PIN 29 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + // TO TEST + //#define NEOPIXEL_PIN 25 + #endif + + #endif + + #elif ENABLED(MINIPANEL) + + // TO TEST + //#define BEEPER_PIN 42 + // not connected to a pin + //#define LCD_BACKLIGHT_PIN 57 // backlight LED on A11/D? (Mega/Due:65 - AGCM4:57) + + //#define DOGLCD_A0 44 + //#define DOGLCD_CS 58 // Mega/Due:66 - AGCM4:58 + + // GLCD features + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + //#define BTN_EN1 40 + //#define BTN_EN2 55 // Mega/Due:63 - AGCM4:55 + //#define BTN_ENC 72 // Mega/Due:59 - AGCM4:72 + + //#define SD_DETECT_PIN 49 + //#define KILL_PIN 56 // Mega/Due:64 - AGCM4:56 + + #elif ENABLED(ZONESTAR_LCD) + + // TO TEST + //#define ADC_KEYPAD_PIN 12 + + #elif ENABLED(AZSMZ_12864) + + // TO TEST + + #else + + // Beeper on AUX-4 + //#define BEEPER_PIN 33 + + // Buttons are directly attached to AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + // TO TEST + //#define SHIFT_OUT 40 + //#define SHIFT_CLK 44 + //#define SHIFT_LD 42 + //#define BTN_EN1 56 // Mega/Due:64 - AGCM4:56 + //#define BTN_EN2 72 // Mega/Due:59 - AGCM4:72 + //#define BTN_ENC 55 // Mega/Due:63 - AGCM4:55 + #elif ENABLED(PANEL_ONE) + // TO TEST + //#define BTN_EN1 72 // AUX2 PIN 3 (Mega/Due:59 - AGCM4:72) + //#define BTN_EN2 55 // AUX2 PIN 4 (Mega/Due:63 - AGCM4:55) + //#define BTN_ENC 49 // AUX3 PIN 7 + #else + // TO TEST + //#define BTN_EN1 37 + //#define BTN_EN2 35 + //#define BTN_ENC 31 + #endif + + #if ENABLED(G3D_PANEL) + // TO TEST + //#define SD_DETECT_PIN 49 + //#define KILL_PIN 41 + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD + +// +// SD Support +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #undef SDSS + #define SDSS 83 + #undef SD_DETECT_PIN + #define SD_DETECT_PIN 95 +#endif diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h new file mode 100644 index 00000000..74692a21 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -0,0 +1,265 @@ +/** + * 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 + +/** + * Anet V1.0 board pin assignments + */ + +/** + * Rev B 16 JUN 2017 + * + * 1) no longer uses Sanguino files to define some of the pins + * 2) added pointers to useable Arduino IDE extensions + */ + +/** + * The standard Arduino IDE extension (board manager) for this board + * is located at https://github.com/SkyNet3D/anet-board. + * + * Installation instructions are on that page. + * + * After copying the files to the appropriate location, restart Arduino and + * you'll see "Anet V1.0" and "Anet V1.0 (Optiboot)" in the boards list. + * + * "Anet V1.0" uses the bootloader that was installed on the board when + * it shipped from the factory. + * + * "Anet V1.0 (Optiboot)" frees up another 3K of FLASH. You'll need to burn + * a new bootloader to the board to be able to automatically download a + * compiled image. + */ + +/** + * Another usable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +/** + * To burn a new bootloader: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select the board and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +/** + * Additional info: + * + * Anet Schematics - https://github.com/ralf-e/ANET-3D-Board-V1.0 + * 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/ + * + * Many thanks to Hans Raaf (@oderwat) for developing the Anet-specific software and supporting the Anet community. + */ + +#if NOT_TARGET(__AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega1284P' in 'Tools > Processor.' (For PlatformIO, use 'melzi' or 'melzi_optiboot.')" +#endif + +#define BOARD_INFO_NAME "Anet 1.0" + +// +// Limit Switches +// +#define X_STOP_PIN 18 +#define Y_STOP_PIN 19 +#define Z_STOP_PIN 20 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 21 +#define X_ENABLE_PIN 14 + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 +#define Y_ENABLE_PIN 14 + +#define Z_STEP_PIN 3 +#define Z_DIR_PIN 2 +#define Z_ENABLE_PIN 26 + +#define E0_STEP_PIN 1 +#define E0_DIR_PIN 0 +#define E0_ENABLE_PIN 14 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input (pin 33 extruder) +#define TEMP_BED_PIN 6 // Analog Input (pin 34 bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // (extruder) +#define HEATER_BED_PIN 12 // (bed) + +#ifndef FAN_PIN + #define FAN_PIN 4 +#endif + +// +// Misc. Functions +// +#define SDSS 31 +#define LED_PIN -1 + +/** + * LCD / Controller + * + * Only the following displays are supported: + * ZONESTAR_LCD + * ANET_FULL_GRAPHICS_LCD + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + */ + +#if HAS_WIRED_LCD + #define LCD_SDSS 28 + #if ENABLED(ADC_KEYPAD) + #define SERVO0_PIN 27 // free for BLTouch/3D-Touch + #define LCD_PINS_RS 28 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 10 + #define LCD_PINS_D5 11 + #define LCD_PINS_D6 16 + #define LCD_PINS_D7 17 + #define ADC_KEYPAD_PIN 1 + #elif ENABLED(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 + #define SERVO0_PIN 29 // free for BLTouch/3D-Touch + #define BEEPER_PIN 17 + #define LCD_PINS_RS 27 + #define LCD_PINS_ENABLE 28 + #define LCD_PINS_D4 30 + #define BTN_EN1 11 + #define BTN_EN2 10 + #define BTN_ENC 16 + #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #define BOARD_ST7920_DELAY_2 DELAY_NS(63) + #define BOARD_ST7920_DELAY_3 DELAY_NS(125) + #define STD_ENCODER_PULSES_PER_STEP 4 + #define STD_ENCODER_STEPS_PER_MENU_ITEM 1 + #endif +#else + #define SERVO0_PIN 27 +#endif + +/** + * ==================================================================== + * =============== Alternative RepRapDiscount Wiring ================== + * ==================================================================== + * + * An alternative wiring scheme for the RepRapDiscount Full Graphics Display is + * published by oderwat on Thingiverse at https://www.thingiverse.com/thing:2103748. + * + * Using that adapter requires changing the pin definition as follows: + * #define SERVO0_PIN 27 // free for BLTouch/3D-Touch + * #define BEEPER_PIN 28 + * #define LCD_PINS_RS 30 + * #define LCD_PINS_ENABLE 29 + * #define LCD_PINS_D4 17 + * + * The BLTouch pin becomes LCD:3 + */ + +/** + * ==================================================================== + * ===================== LCD PINOUTS ================================== + * ==================================================================== + * + * Anet V1.0 controller | ZONESTAR_LCD | ANET_FULL_ | RepRapDiscount Full | Thingiverse RepRap wiring + * 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 *** | | + * ANET-J3.2 9 *** | N/A | J3_RX *** | | + * ANET-J3.3 6 MISO | N/A | MISO *** | EXP2.1 MISO | EXP2.1 MISO + * ANET-J3.4 +5V | N/A | +5V | | + * ANET-J3.5 7 SCK | N/A | SCK *** | EXP2.2 SCK | EXP2.2 SCK + * ANET-J3.6 5 MOSI | N/A | MOSI *** | EXP2.6 MOSI | EXP2.6 MOSI + * ANET-J3.7 !RESET | N/A | button | EXP2.8 panel button | EXP2.8 panel button + * ANET-J3.8 GND | N/A | GND | EXP2.9 GND | EXP2.9 GND + * ANET-J3.9 4 Don't use | N/A | N/C | | + * ANET-J3.10 +3.3V | N/A | +3.3V *** | | + * | | | | + * | | | | + * ANET-LCD.1 GND | GND | GND | EXP1.9 GND | EXP1.9 GND + * ANET-LCD.2 +5V | +5V | +5V | EXP1.10 +5V | EXP1.10 +5V + * ANET-LCD.3 27 A4 | N/C * | LCD_PINS_RS | EXP1.4 LCD_PINS_RS | EXP2.4 SDSS or N/C * + * ANET-LCD.4 10 | LCD_PINS_D4 | BTN_EN2 | EXP2.3 BTN_EN2 | EXP2.3 BTN_EN2 + * ANET-LCD.5 28 A3 | LCD_PINS_RS | LCD_PINS_ENABLE | EXP1.3 LCD_PINS_ENABLE | EXP1.1 BEEPER_PIN + * ANET-LCD.6 11 | LCD_PINS_D5 | BTN_EN1 | EXP2.5 BTN_EN1 | EXP2.5 BTN_EN1 + * ANET-LCD.7 29 A2 | LCD_PINS_ENABLE | N/C * | EXP2.4 SDSS or N/C * | EXP1.3 LCD_PINS_ENABLE + * ANET-LCD.8 16 SCL | LCD_PINS_D6 | BTN_ENC | EXP1.2 BTN_ENC | EXP1.2 BTN_ENC + * ANET-LCD.9 30 A1 | ADC_KEYPAD_PIN ** | LCD_PINS_D4 | EXP1.5 LCD_PINS_D4 | EXP1.4 LCD_PINS_RS + * ANET-LCD.10 17 SDA | LCD_PINS_D7 | BEEPER_PIN | EXP1.1 BEEPER_PIN | EXP1.5 LCD_PINS_D4 + * + * N/C * - if not connected to the LCD can be used for BLTouch servo input + * ** - analog pin -WITHOUT a pullup + * *** - only connected to something if the Bluetooth module is populated + */ + +/** + * REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + * physical pin function + * EXP1.1 BEEPER + * EXP1.2 BTN_ENC + * EXP1.3 LCD_PINS_ENABLE + * EXP1.4 LCD_PINS_RS + * EXP1.5 LCD_PINS_D4 + * EXP1.6 LCD_PINS_D5 (not used) + * EXP1.7 LCD_PINS_D6 (not used) + * EXP1.8 LCD_PINS_D7 (not used) + * EXP1.9 GND + * EXP1.10 VCC + * + * + * EXP2.1 MISO + * EXP2.2 SCK + * EXP2.3 BTN_EN2 + * EXP2.4 SDSS + * EXP2.5 BTN_EN1 + * EXP2.6 MOSI + * EXP2.7 SD_DETECT_PIN + * EXP2.8 button + * EXP2.9 GND + * EXP2.10 NC + */ diff --git a/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h b/Marlin/src/pins/sanguino/pins_AZTEEG_X1.h new file mode 100644 index 00000000..c3c38eb6 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_AZTEEG_X1.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 + +/** + * Azteeg X1 pin assignments + */ + +#define BOARD_INFO_NAME "Azteeg X1" + +#include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h new file mode 100644 index 00000000..29905c10 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h @@ -0,0 +1,99 @@ +/** + * 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 + +/** + * Gen3 Monolithic Electronics pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__) + #error "Oops! Select 'Sanguino' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Gen3 Monolithic" +#define DEBUG_PIN 0 + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 25 +#define Z_STOP_PIN 30 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 24 // actually uses Y_enable_pin + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 // shared with X_enable_pin + +#define Z_STEP_PIN 27 +#define Z_DIR_PIN 28 +#define Z_ENABLE_PIN 29 + +#define E0_STEP_PIN 12 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN 3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input + +// +// Heaters +// +#define HEATER_0_PIN 16 + +// +// Misc. Functions +// +#define PS_ON_PIN 14 // Alex, does this work on the card? + +// Alex extras from Gen3+ diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h new file mode 100644 index 00000000..33fc233f --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h @@ -0,0 +1,99 @@ +/** + * 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 + +/** + * Gen3+ pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Gen3+" + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 25 +#define Z_STOP_PIN 30 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 19 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 27 +#define Z_DIR_PIN 28 +#define Z_ENABLE_PIN 29 + +#define E0_STEP_PIN 17 +#define E0_DIR_PIN 21 +#define E0_ENABLE_PIN 13 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (pin 33 extruder) +#define TEMP_BED_PIN 5 // Analog Input (pin 34 bed) + +// +// Heaters +// +#define HEATER_0_PIN 12 +#define HEATER_BED_PIN 16 + +// +// Misc. Functions +// +#define SDSS 4 +#define PS_ON_PIN 14 diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h new file mode 100644 index 00000000..bfca8e90 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -0,0 +1,121 @@ +/** + * 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 + +/** + * Gen6 pin assignments + */ + + /** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Gen6" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 25 +#define Z_STOP_PIN 30 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 19 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 27 +#define Z_DIR_PIN 28 +#define Z_ENABLE_PIN 29 + +#define E0_STEP_PIN 4 // Edited @ EJE Electronics 20100715 +#define E0_DIR_PIN 2 // Edited @ EJE Electronics 20100715 +#define E0_ENABLE_PIN 3 // Added @ EJE Electronics 20100715 + +// +// Temperature Sensor +// +#define TEMP_0_PIN 5 // Analog Input + +// +// Heaters +// +#define HEATER_0_PIN 14 // changed @ rkoeppl 20110410 + +#if !MB(GEN6) + #define HEATER_BED_PIN 1 // changed @ rkoeppl 20110410 + #define TEMP_BED_PIN 0 // Analog Input +#endif + +// +// Misc. Functions +// +#define SDSS 17 +#define DEBUG_PIN 0 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 16 // Hardware PWM +#endif + +// RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! +#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM +#define SPINDLE_DIR_PIN 6 diff --git a/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h new file mode 100644 index 00000000..9c635706 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN6_DELUXE.h @@ -0,0 +1,54 @@ +/** + * 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 + +/** + * Gen6 Deluxe pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + + +#define BOARD_INFO_NAME "Gen6 Deluxe" + +#include "pins_GEN6.h" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h new file mode 100644 index 00000000..9db7d721 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -0,0 +1,147 @@ +/** + * 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 + +/** + * Gen7 v1.1, v1.2, v1.3 pin assignments + */ + + /** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Gen7 v1.1 / 1.2" +#endif + +#ifndef GEN7_VERSION + #define GEN7_VERSION 12 // v1.x +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 7 +#define Y_MIN_PIN 5 +#define Z_MIN_PIN 1 +#define Z_MAX_PIN 0 +#define Y_MAX_PIN 2 +#define X_MAX_PIN 6 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 0 +#endif + +// +// Steppers +// +#define X_STEP_PIN 19 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 + +#if !defined(FAN_PIN) && GEN7_VERSION < 13 // Gen7 v1.3 removed the fan pin + #define FAN_PIN 31 +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN 15 + +#if GEN7_VERSION < 13 + #define CASE_LIGHT_PIN 16 // Hardware PWM +#else // Gen7 v1.3 removed the I2C connector & signals so need to get PWM off the PC power supply header + #define CASE_LIGHT_PIN 15 // Hardware PWM +#endif + +// All these generations of Gen7 supply thermistor power +// via PS_ON, so ignore bad thermistor readings +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#define DEBUG_PIN 0 + +// RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! +#define SPINDLE_DIR_PIN 11 +#if GEN7_VERSION < 13 + #define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM +#else // Gen7 v1.3 removed the I2C connector & signals so need to get PWM off the PC power supply header + #define SPINDLE_LASER_PWM_PIN 15 // Hardware PWM +#endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_13.h b/Marlin/src/pins/sanguino/pins_GEN7_13.h new file mode 100644 index 00000000..55881aaf --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN7_13.h @@ -0,0 +1,54 @@ +/** + * 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 + +/** + * Gen7 v1.3 pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#define BOARD_INFO_NAME "Gen7 v1.3" + +#define GEN7_VERSION 13 // v1.3 +#include "pins_GEN7_12.h" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h new file mode 100644 index 00000000..66dba533 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -0,0 +1,120 @@ +/** + * 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 + +/** + * Gen7 v1.4 pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Gen7 v1.4" + +#define GEN7_VERSION 14 // v1.4 + +// +// Limit switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 29 +#define X_DIR_PIN 28 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 27 +#define Y_DIR_PIN 26 +#define Y_ENABLE_PIN 25 + +#define Z_STEP_PIN 23 +#define Z_DIR_PIN 22 +#define Z_ENABLE_PIN 25 + +#define E0_STEP_PIN 19 +#define E0_DIR_PIN 18 +#define E0_ENABLE_PIN 25 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 + +// +// Misc. Functions +// +#define PS_ON_PIN 15 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 15 // Hardware PWM +#endif + +// A pin for debugging +#define DEBUG_PIN 0 + +// RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 20 // Pullup or pulldown! +#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM +#define SPINDLE_DIR_PIN 21 diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h new file mode 100644 index 00000000..0c4871fb --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.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 + +/** + * Gen7 Alfons3 board pin assignments + * + * These Pins are assigned for the modified GEN7 Board from Alfons3. + * Please review the pins and adjust them for your needs. + */ + +/** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Gen7 Custom" + +// +// Limit Switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 21 // different from standard GEN7 +#define X_DIR_PIN 20 // different from standard GEN7 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // Analog Input +#define TEMP_BED_PIN 1 // Analog Input (pin 34 bed) + +// +// Heaters +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 // (bed) + +// +// Misc. Functions +// +#define SDSS 31 // SCL pin of I2C header || CS Pin for SD Card support +#define PS_ON_PIN 19 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 15 // Hardware PWM +#endif + +// A pin for debugging +#define DEBUG_PIN -1 + +// +// LCD / Controller +// +#define BEEPER_PIN -1 + +// 4bit LCD Support +#define LCD_PINS_RS 18 +#define LCD_PINS_ENABLE 17 +#define LCD_PINS_D4 16 +#define LCD_PINS_D5 15 +#define LCD_PINS_D6 13 +#define LCD_PINS_D7 14 + +// Buttons are directly attached +#define BTN_EN1 11 +#define BTN_EN2 10 +#define BTN_ENC 12 + +// RS485 pins +//#define TX_ENABLE_PIN 12 +//#define RX_ENABLE_PIN 13 + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! +#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM +#define SPINDLE_DIR_PIN 6 diff --git a/Marlin/src/pins/sanguino/pins_MELZI.h b/Marlin/src/pins/sanguino/pins_MELZI.h new file mode 100644 index 00000000..887aae18 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI.h @@ -0,0 +1,32 @@ +/** + * 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 + +/** + * Melzi pin assignments + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Melzi" +#endif + +#include "pins_SANGUINOLOLU_12.h" diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h new file mode 100644 index 00000000..9f406c1f --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -0,0 +1,143 @@ +/** + * 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 + +/** + * Melzi (Creality) pin assignments + * + * The Creality 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 https://www.instructables.com/id/Burn-Arduino-Bootloader-with-Arduino-MEGA/ + * + * Schematic: https://bit.ly/2XOnsWb + */ + +#define BOARD_INFO_NAME "Melzi (Creality)" + +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #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" + +// +// For the stock CR-10 enable CR10_STOCKDISPLAY in Configuration.h +// +#undef LCD_SDSS +#undef LED_PIN +#undef LCD_PINS_RS +#undef LCD_PINS_ENABLE +#undef LCD_PINS_D4 +#undef LCD_PINS_D5 +#undef LCD_PINS_D6 +#undef LCD_PINS_D7 + +#define LCD_SDSS 31 // Smart Controller SD card reader (rather than the Melzi) +#define LCD_PINS_RS 28 // ST9720 CS +#define LCD_PINS_ENABLE 17 // ST9720 DAT +#define LCD_PINS_D4 30 // ST9720 CLK + +#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) + #undef DOGLCD_CS + #define DOGLCD_CS LCD_PINS_RS +#endif + +/** + PIN: 0 Port: B0 E0_DIR_PIN protected + PIN: 1 Port: B1 E0_STEP_PIN protected + PIN: 2 Port: B2 Z_DIR_PIN protected + PIN: 3 Port: B3 Z_STEP_PIN protected + PIN: 4 Port: B4 AVR_SS_PIN protected + . FAN_PIN protected + . SS_PIN protected + PIN: 5 Port: B5 AVR_MOSI_PIN Output = 1 + . MOSI_PIN Output = 1 + PIN: 6 Port: B6 AVR_MISO_PIN Input = 0 TIMER3A PWM: 0 WGM: 1 COM3A: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 + . MISO_PIN Input = 0 + PIN: 7 Port: B7 AVR_SCK_PIN Output = 0 TIMER3B PWM: 0 WGM: 1 COM3B: 0 CS: 3 TCCR3A: 1 TCCR3B: 3 TIMSK3: 0 + . SCK_PIN Output = 0 + PIN: 8 Port: D0 RXD Input = 1 + PIN: 9 Port: D1 TXD Input = 0 + PIN: 10 Port: D2 BTN_EN2 Input = 1 + PIN: 11 Port: D3 BTN_EN1 Input = 1 + PIN: 12 Port: D4 HEATER_BED_PIN protected + PIN: 13 Port: D5 HEATER_0_PIN protected + PIN: 14 Port: D6 E0_ENABLE_PIN protected + . X_ENABLE_PIN protected + . Y_ENABLE_PIN protected + PIN: 15 Port: D7 X_STEP_PIN protected + PIN: 16 Port: C0 BTN_ENC Input = 1 + . SCL Input = 1 + PIN: 17 Port: C1 LCD_PINS_ENABLE Output = 0 + . SDA Output = 0 + PIN: 18 Port: C2 X_MIN_PIN protected + . X_STOP_PIN protected + PIN: 19 Port: C3 Y_MIN_PIN protected + . Y_STOP_PIN protected + PIN: 20 Port: C4 Z_MIN_PIN protected + . Z_STOP_PIN protected + PIN: 21 Port: C5 X_DIR_PIN protected + PIN: 22 Port: C6 Y_STEP_PIN protected + PIN: 23 Port: C7 Y_DIR_PIN protected + PIN: 24 Port: A7 TEMP_0_PIN protected + PIN: 25 Port: A6 TEMP_BED_PIN protected + PIN: 26 Port: A5 Z_ENABLE_PIN protected + PIN: 27 Port: A4 BEEPER_PIN Output = 0 + PIN: 28 Port: A3 LCD_PINS_RS Output = 0 + PIN: 29 Port: A2 Input = 0 + PIN: 30 Port: A1 LCD_PINS_D4 Output = 1 + PIN: 31 Port: A0 SDSS Output = 1 +*/ + +/** + * EXP1 Connector EXP1 as CR10 STOCKDISPLAY + * _____ _____ + * PA4 | 6 5 | PC0 BEEPER_PIN | 6 5 | BTN_ENC + * PD3 | 7 4 | RESET BTN_EN1 | 7 4 | RESET + * PD2 8 3 | PA1 BTN_EN2 8 3 | LCD_PINS_D4 (ST9720 CLK) + * PA3 | 9 2 | PC1 (ST9720 CS) LCD_PINS_RS | 9 2 | LCD_PINS_ENABLE (ST9720 DAT) + * GND |10 1 | 5V GND |10 1 | 5V + * ----- ----- + */ diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h b/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h new file mode 100644 index 00000000..0e09c1f0 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI_MAKR3D.h @@ -0,0 +1,29 @@ +/** + * 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 + +/** + * Melzi with ATmega1284 (MaKr3d version) pin assignments + */ + +#define BOARD_INFO_NAME "Melzi (ATmega1284)" +#include "pins_MELZI.h" diff --git a/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h new file mode 100644 index 00000000..5014620c --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI_MALYAN.h @@ -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 . + * + */ +#pragma once + +/** + * Melzi (Malyan M150) pin assignments + */ + +#define BOARD_INFO_NAME "Melzi (Malyan)" + +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #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" + +#undef LCD_SDSS +#undef LCD_PINS_RS +#undef LCD_PINS_ENABLE +#undef LCD_PINS_D4 +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC + +#define LCD_PINS_RS 17 // ST9720 CS +#define LCD_PINS_ENABLE 16 // ST9720 DAT +#define LCD_PINS_D4 11 // ST9720 CLK +#define BTN_EN1 30 +#define BTN_EN2 29 +#define BTN_ENC 28 diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h new file mode 100644 index 00000000..f8789410 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.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 + +/** + * Melzi pin assignments + */ + +#define BOARD_INFO_NAME "Melzi (Tronxy)" + +#if HAS_MARLINUI_U8GLIB + #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" + +#undef Z_ENABLE_PIN +#undef LCD_PINS_RS +#undef LCD_PINS_ENABLE +#undef LCD_PINS_D4 +#undef LCD_PINS_D5 +#undef LCD_PINS_D6 +#undef LCD_PINS_D7 +#undef BTN_EN1 +#undef BTN_EN2 +#undef BTN_ENC +#undef LCD_SDSS + +#define Z_ENABLE_PIN 14 +#define LCD_PINS_RS 30 +#define LCD_PINS_ENABLE 28 +#define LCD_PINS_D4 16 +#define LCD_PINS_D5 17 +#define LCD_PINS_D6 27 +#define LCD_PINS_D7 29 +#define BTN_EN1 10 +#define BTN_EN2 11 +#define BTN_ENC 26 diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h new file mode 100644 index 00000000..275498d5 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -0,0 +1,39 @@ +/** + * 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 + +/** + * Melzi V2.0 as found at https://www.reprap.org/wiki/Melzi + */ + +#define BOARD_INFO_NAME "Melzi V2" + +#if HAS_MARLINUI_U8GLIB + #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/sanguino/pins_OMCA.h b/Marlin/src/pins/sanguino/pins_OMCA.h new file mode 100644 index 00000000..7f18283d --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_OMCA.h @@ -0,0 +1,149 @@ +/** + * 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 + +/** + * Open Motion controller with enable based extruders (Final!) + * + * ATmega644 + * + * +---\/---+ + * (D 0) PB0 1| |40 PA0 (AI 0 / D31) + * (D 1) PB1 2| |39 PA1 (AI 1 / D30) + * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) + * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) + * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) + * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) + * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) + * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) + * RST 9| |32 AREF + * VCC 10| |31 GND + * GND 11| |30 AVCC + * XTAL2 12| |29 PC7 (D 23) + * XTAL1 13| |28 PC6 (D 22) + * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI + * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO + * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS + * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK + * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA + * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL + * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM + * +--------+ + * + * REF http://sanguino.wikidot.com/hardware + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * 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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644' or 'ATmega644P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Final OMCA" + +// +// Limit Switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 26 +#define X_DIR_PIN 25 +#define X_ENABLE_PIN 10 + +#define Y_STEP_PIN 28 +#define Y_DIR_PIN 27 +#define Y_ENABLE_PIN 10 + +#define Z_STEP_PIN 23 +#define Z_DIR_PIN 22 +#define Z_ENABLE_PIN 10 + +#define E0_STEP_PIN 24 +#define E0_DIR_PIN 21 +#define E0_ENABLE_PIN 10 + +#define E1_STEP_PIN -1 // 21 +#define E1_DIR_PIN -1 // 20 +#define E1_ENABLE_PIN -1 // 19 + +#define E2_STEP_PIN -1 // 21 +#define E2_DIR_PIN -1 // 20 +#define E2_ENABLE_PIN -1 // 18 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input (1,2 or I2C) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 3 // DONE PWM on RIGHT connector +#define HEATER_BED_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 14 // PWM on MIDDLE connector +#endif + +// +// Misc. Functions +// +#define SDSS 11 + +#define I2C_SCL_PIN 16 +#define I2C_SDA_PIN 17 + +// future proofing +#define __FS 20 +#define __FD 19 +#define __GS 18 +#define __GD 13 + +#define UNUSED_PWM 14 // PWM on LEFT connector diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h new file mode 100644 index 00000000..77073205 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h @@ -0,0 +1,135 @@ +/** + * 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 + +/** + * Open Motion controller with enable based extruders (Alpha!) + * + * ATmega644 + * + * +---\/---+ + * (D 0) PB0 1| |40 PA0 (AI 0 / D31) + * (D 1) PB1 2| |39 PA1 (AI 1 / D30) + * INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29) + * PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28) + * PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27) + * MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26) + * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) + * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) + * RST 9| |32 AREF + * VCC 10| |31 GND + * GND 11| |30 AVCC + * XTAL2 12| |29 PC7 (D 23) + * XTAL1 13| |28 PC6 (D 22) + * RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI + * TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO + * INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS + * INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK + * PWM (D 12) PD4 18| |23 PC1 (D 17) SDA + * PWM (D 13) PD5 19| |22 PC0 (D 16) SCL + * PWM (D 14) PD6 20| |21 PD7 (D 15) PWM + * +--------+ + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and ATmega644 in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Alpha OMCA" + +// +// Limit Switches +// +#define X_STOP_PIN 0 +#define Y_STOP_PIN 1 +#define Z_STOP_PIN 2 + +// +// Steppers +// +#define X_STEP_PIN 21 +#define X_DIR_PIN 20 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +#define E1_STEP_PIN -1 // 19 +#define E1_DIR_PIN -1 // 18 +#define E1_ENABLE_PIN 24 + +#define E2_STEP_PIN -1 // 17 +#define E2_DIR_PIN -1 // 16 +#define E2_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input (D27) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 + +#ifndef FAN_PIN + #define FAN_PIN 3 +#endif + +// +// Misc. Functions +// +#define SDSS 11 + +/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */ diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h new file mode 100644 index 00000000..438d49d6 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -0,0 +1,342 @@ +/** + * 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 + +/** + * Sanguinololu board pin assignments + */ + +/** + * Rev B 26 DEC 2016 + * + * 1) added pointer to a current Arduino IDE extension + * 2) added support for M3, M4 & M5 spindle control commands + * 3) added case light pin definition + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Sanguinololu <1.2" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 18 +#define Y_STOP_PIN 19 +#define Z_STOP_PIN 20 + +// +// Steppers +// +#define X_STEP_PIN 15 +#define X_DIR_PIN 21 + +#define Y_STEP_PIN 22 +#define Y_DIR_PIN 23 + +#define Z_STEP_PIN 3 +#define Z_DIR_PIN 2 + +#define E0_STEP_PIN 1 +#define E0_DIR_PIN 0 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input (pin 33 extruder) +#define TEMP_BED_PIN 6 // Analog Input (pin 34 bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 // (extruder) + +#if ENABLED(SANGUINOLOLU_V_1_2) + + #define HEATER_BED_PIN 12 // (bed) + #define X_ENABLE_PIN 14 + #define Y_ENABLE_PIN 14 + #define Z_ENABLE_PIN 26 + #define E0_ENABLE_PIN 14 + + #if !defined(FAN_PIN) && ENABLED(LCD_I2C_PANELOLU2) + #define FAN_PIN 4 // Uses Transistor1 (PWM) on Panelolu2's Sanguino Adapter Board to drive the fan + #endif + +#else + + #define HEATER_BED_PIN 14 // (bed) + #define X_ENABLE_PIN -1 + #define Y_ENABLE_PIN -1 + #define Z_ENABLE_PIN -1 + #define E0_ENABLE_PIN -1 + +#endif + +#if !defined(FAN_PIN) && (MB(AZTEEG_X1, STB_11) || IS_MELZI) + #define FAN_PIN 4 // Works for Panelolu2 too +#endif + +// +// Misc. Functions +// + +/** + * In some versions of the Sanguino libraries the pin + * definitions are wrong, with SDSS = 24 and LED_PIN = 28 (Melzi). + * If you encounter issues with these pins, upgrade your + * Sanguino libraries! See #368. + */ +//#define SDSS 24 +#define SDSS 31 + +#if IS_MELZI + #define LED_PIN 27 +#elif MB(STB_11) + #define LCD_BACKLIGHT_PIN 17 // LCD backlight LED +#endif + +#if NONE(SPINDLE_FEATURE, LASER_FEATURE) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(ULTRA_LCD, NEWPANEL)// try to use IO Header + #define CASE_LIGHT_PIN 4 // Hardware PWM - see if IO Header is available +#endif + +/** + * Sanguinololu 1.4 AUX pins: + * + * PWM TX1 RX1 SDA SCL + * 12V 5V D12 D11 D10 D17 D16 + * GND GND D31 D30 D29 D28 D27 + * A4 A3 A2 A1 A0 + */ + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define SD_DETECT_PIN -1 + + #if HAS_MARLINUI_U8GLIB + + #if ENABLED(LCD_FOR_MELZI) + + #define LCD_PINS_RS 17 + #define LCD_PINS_ENABLE 16 + #define LCD_PINS_D4 11 + + #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 + + #elif ENABLED(U8GLIB_ST7920) // SPI GLCD 12864 ST7920 ( like [www.digole.com] ) For Melzi V2.0 + + #if IS_MELZI + #define LCD_PINS_RS 30 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE 29 // SID (MOSI) + #define LCD_PINS_D4 17 // SCK (CLK) clock + // Pin 27 is taken by LED_PIN, but Melzi LED does nothing with + // Marlin so this can be used for BEEPER_PIN. You can use this pin + // with M42 instead of BEEPER_PIN. + #define BEEPER_PIN 27 + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #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 + + #else // Sanguinololu >=1.3 + #define LCD_PINS_RS 4 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 30 + #define LCD_PINS_D5 29 + #define LCD_PINS_D6 28 + #define LCD_PINS_D7 27 + #endif + + #else + + #define DOGLCD_A0 30 + + #if ENABLED(MAKRPANEL) + + #define BEEPER_PIN 29 + #define DOGLCD_CS 17 + #define LCD_BACKLIGHT_PIN 28 // PA3 + + #elif IS_MELZI + + #define BEEPER_PIN 27 + #define DOGLCD_CS 28 + + #else // !MAKRPANEL + + #define DOGLCD_CS 29 + + #endif + + #endif + + // Uncomment screen orientation + //#define LCD_SCREEN_ROT_0 + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #elif ENABLED(ZONESTAR_LCD) // For the Tronxy Melzi boards + + #define LCD_PINS_RS 28 + #define LCD_PINS_ENABLE 29 + #define LCD_PINS_D4 10 + #define LCD_PINS_D5 11 + #define LCD_PINS_D6 16 + #define LCD_PINS_D7 17 + + #else + + #define LCD_PINS_RS 4 + #define LCD_PINS_ENABLE 17 + #define LCD_PINS_D4 30 + #define LCD_PINS_D5 29 + #define LCD_PINS_D6 28 + #define LCD_PINS_D7 27 + + #endif + + #if ENABLED(LCD_FOR_MELZI) + + #define BTN_ENC 28 + #define BTN_EN1 29 + #define BTN_EN2 30 + + #elif ENABLED(ZONESTAR_LCD) // For the Tronxy Melzi boards + + #define ADC_KEYPAD_PIN 1 + #define BTN_EN1 -1 + #define BTN_EN2 -1 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #if IS_MELZI + #define BTN_ENC 29 + #define LCD_SDSS 30 // Panelolu2 SD card reader rather than the Melzi + #else + #define BTN_ENC 30 + #endif + + #else // !LCD_FOR_MELZI && !ZONESTAR_LCD && !LCD_I2C_PANELOLU2 + + #define BTN_ENC 16 + #define LCD_SDSS 28 // Smart Controller SD card reader rather than the Melzi + + #endif + + #if ENABLED(NEWPANEL) && !defined(BTN_EN1) + #define BTN_EN1 11 + #define BTN_EN2 10 + #endif + +#endif // HAS_WIRED_LCD + +// +// M3/M4/M5 - Spindle/Laser Control +// +#if HAS_CUTTER + #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(ULTRA_LCD, NEWPANEL)// try to use IO Header + + #define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! + #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM + #define SPINDLE_DIR_PIN 11 + + #elif !MB(MELZI) // use X stepper motor socket + + /** + * To control the spindle speed and have an LCD you must sacrifice + * the Extruder and pull some signals off the X stepper driver socket. + * + * The following assumes: + * - The X stepper driver socket is empty + * - The extruder driver socket has a driver board plugged into it + * - The X stepper wires are attached the the extruder connector + */ + + /** + * Where to get the spindle signals + * + * spindle signal socket name socket name + * ------- + * /ENABLE O| |O VMOT + * MS1 O| |O GND + * MS2 O| |O 2B + * MS3 O| |O 2A + * /RESET O| |O 1A + * /SLEEP O| |O 1B + * SPINDLE_LASER_PWM_PIN STEP O| |O VDD + * SPINDLE_LASER_ENA_PIN DIR O| |O GND + * ------- + * + * Note: Socket names vary from vendor to vendor. + */ + #undef X_DIR_PIN + #undef X_ENABLE_PIN + #undef X_STEP_PIN + #define X_DIR_PIN 0 + #define X_ENABLE_PIN 14 + #define X_STEP_PIN 1 + #define SPINDLE_LASER_PWM_PIN 15 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 21 // Pullup! + #define SPINDLE_DIR_PIN -1 // No pin available on the socket for the direction pin + #endif +#endif diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h new file mode 100644 index 00000000..c5c8b4f5 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_12.h @@ -0,0 +1,42 @@ +/** + * 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 + +/** + * Sanguinololu V1.2 pin assignments + * + * Applies to the following boards: + * + * AZTEEG_X1 + * MELZI + * MELZI_CREALITY + * MELZI_MAKR3D + * SANGUINOLOLU_12 + * STB_11 + */ + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Sanguinololu 1.2" +#endif + +#define SANGUINOLOLU_V_1_2 +#include "pins_SANGUINOLOLU_11.h" diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h new file mode 100644 index 00000000..dc2133e4 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_SETHI.h @@ -0,0 +1,124 @@ +/** + * 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 + +/** + * Sethi 3D_1 pin assignments - www.sethi3d.com.br + */ + +/** + * Rev B 26 DEC 2016 + * + * added pointer to a current Arduino IDE extension + * this assumes that this board uses the Sanguino pin map + */ + +/** + * A useable Arduino IDE extension (board manager) can be found at + * https://github.com/Lauszus/Sanguino + * + * This extension has been tested on Arduino 1.6.12 & 1.8.0 + * + * Here's the JSON path: + * https://raw.githubusercontent.com/Lauszus/Sanguino/master/package_lauszus_sanguino_index.json + * + * When installing select 1.0.2 + * + * Installation instructions can be found at https://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. + */ + +#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" +#endif + +#define BOARD_INFO_NAME "Sethi 3D_1" + +#ifndef GEN7_VERSION + #define GEN7_VERSION 12 // v1.x +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 2 +#define Y_STOP_PIN 0 +#define Z_MIN_PIN 1 +#define Z_MAX_PIN 0 + +// +// Steppers +// +#define X_STEP_PIN 19 +#define X_DIR_PIN 18 +#define X_ENABLE_PIN 24 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 22 +#define Y_ENABLE_PIN 24 + +#define Z_STEP_PIN 26 +#define Z_DIR_PIN 25 +#define Z_ENABLE_PIN 24 + +#define E0_STEP_PIN 28 +#define E0_DIR_PIN 27 +#define E0_ENABLE_PIN 24 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 2 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 +#define HEATER_BED_PIN 3 + +#ifndef FAN_PIN + #if GEN7_VERSION >= 13 + // Gen7 v1.3 removed the fan pin + #define FAN_PIN -1 + #else + #define FAN_PIN 31 + #endif +#endif + +// +// Misc. Functions +// +#define PS_ON_PIN 15 + +// All these generations of Gen7 supply thermistor power +// via PS_ON, so ignore bad thermistor readings +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// our pin for debugging. +#define DEBUG_PIN 0 + +// our RS485 pins +#define TX_ENABLE_PIN 12 +#define RX_ENABLE_PIN 13 diff --git a/Marlin/src/pins/sanguino/pins_STB_11.h b/Marlin/src/pins/sanguino/pins_STB_11.h new file mode 100644 index 00000000..b10a0984 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_STB_11.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 + +/** + * STB V1.1 pin assignments + */ + +#define BOARD_INFO_NAME "STB V1.1" + +#include "pins_SANGUINOLOLU_12.h" 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 00000000..838ffe38 --- /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 NOT_TARGET(__AVR_ATmega644P__, __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/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h new file mode 100644 index 00000000..d7eb1872 --- /dev/null +++ b/Marlin/src/pins/sensitive_pins.h @@ -0,0 +1,689 @@ +/** + * 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 + +// +// Prepare a list of protected pins for M42/M43 +// + +#if PIN_EXISTS(X_MIN) + #define _X_MIN X_MIN_PIN, +#else + #define _X_MIN +#endif +#if PIN_EXISTS(X_MAX) + #define _X_MAX X_MAX_PIN, +#else + #define _X_MAX +#endif +#if PIN_EXISTS(X_CS) && AXIS_HAS_SPI(X) + #define _X_CS X_CS_PIN, +#else + #define _X_CS +#endif +#if PIN_EXISTS(X_MS1) + #define _X_MS1 X_MS1_PIN, +#else + #define _X_MS1 +#endif +#if PIN_EXISTS(X_MS2) + #define _X_MS2 X_MS2_PIN, +#else + #define _X_MS2 +#endif +#if PIN_EXISTS(X_MS3) + #define _X_MS3 X_MS3_PIN, +#else + #define _X_MS3 +#endif + +#define _X_PINS X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, _X_MIN _X_MAX _X_MS1 _X_MS2 _X_MS3 _X_CS + +#if PIN_EXISTS(Y_MIN) + #define _Y_MIN Y_MIN_PIN, +#else + #define _Y_MIN +#endif +#if PIN_EXISTS(Y_MAX) + #define _Y_MAX Y_MAX_PIN, +#else + #define _Y_MAX +#endif +#if PIN_EXISTS(Y_CS) && AXIS_HAS_SPI(Y) + #define _Y_CS Y_CS_PIN, +#else + #define _Y_CS +#endif +#if PIN_EXISTS(Y_MS1) + #define _Y_MS1 Y_MS1_PIN, +#else + #define _Y_MS1 +#endif +#if PIN_EXISTS(Y_MS2) + #define _Y_MS2 Y_MS2_PIN, +#else + #define _Y_MS2 +#endif +#if PIN_EXISTS(Y_MS3) + #define _Y_MS3 Y_MS3_PIN, +#else + #define _Y_MS3 +#endif + +#define _Y_PINS Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, _Y_MIN _Y_MAX _Y_MS1 _Y_MS2 _Y_MS3 _Y_CS + +#if PIN_EXISTS(Z_MIN) + #define _Z_MIN Z_MIN_PIN, +#else + #define _Z_MIN +#endif +#if PIN_EXISTS(Z_MAX) + #define _Z_MAX Z_MAX_PIN, +#else + #define _Z_MAX +#endif +#if PIN_EXISTS(Z_CS) && AXIS_HAS_SPI(Z) + #define _Z_CS Z_CS_PIN, +#else + #define _Z_CS +#endif +#if PIN_EXISTS(Z_MS1) + #define _Z_MS1 Z_MS1_PIN, +#else + #define _Z_MS1 +#endif +#if PIN_EXISTS(Z_MS2) + #define _Z_MS2 Z_MS2_PIN, +#else + #define _Z_MS2 +#endif +#if PIN_EXISTS(Z_MS3) + #define _Z_MS3 Z_MS3_PIN, +#else + #define _Z_MS3 +#endif + +#define _Z_PINS Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, _Z_MIN _Z_MAX _Z_MS1 _Z_MS2 _Z_MS3 _Z_CS + +// +// Extruder Chip Select, Digital Micro-steps +// + +// Mixing stepper, Switching stepper, or regular stepper +#define E_NEEDED(N) (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > N) \ + || (ENABLED(SWITCHING_EXTRUDER) && E_STEPPERS > N) \ + || (NONE(SWITCHING_EXTRUDER, MIXING_EXTRUDER) && EXTRUDERS > N) + +#define _E0_CS +#define _E0_MS1 +#define _E0_MS2 +#define _E0_MS3 + +#if E_NEEDED(0) + #if PIN_EXISTS(E0_CS) && AXIS_HAS_SPI(E0) + #undef _E0_CS + #define _E0_CS E0_CS_PIN, + #endif + #if PIN_EXISTS(E0_MS1) + #undef _E0_MS1 + #define _E0_MS1 E0_MS1_PIN, + #endif + #if PIN_EXISTS(E0_MS2) + #undef _E0_MS2 + #define _E0_MS2 E0_MS2_PIN, + #endif + #if PIN_EXISTS(E0_MS3) + #undef _E0_MS3 + #define _E0_MS3 E0_MS3_PIN, + #endif +#endif + +#define _E1_CS +#define _E1_MS1 +#define _E1_MS2 +#define _E1_MS3 + +#if E_NEEDED(1) + #if PIN_EXISTS(E1_CS) && AXIS_HAS_SPI(E1) + #undef _E1_CS + #define _E1_CS E1_CS_PIN, + #endif + #if PIN_EXISTS(E1_MS1) + #undef _E1_MS1 + #define _E1_MS1 E1_MS1_PIN, + #endif + #if PIN_EXISTS(E1_MS2) + #undef _E1_MS2 + #define _E1_MS2 E1_MS2_PIN, + #endif + #if PIN_EXISTS(E1_MS3) + #undef _E1_MS3 + #define _E1_MS3 E1_MS3_PIN, + #endif +#endif + +#define _E2_CS +#define _E2_MS1 +#define _E2_MS2 +#define _E2_MS3 + +#if E_NEEDED(2) + #if PIN_EXISTS(E2_CS) && AXIS_HAS_SPI(E2) + #undef _E2_CS + #define _E2_CS E2_CS_PIN, + #endif + #if PIN_EXISTS(E2_MS1) + #undef _E2_MS1 + #define _E2_MS1 E2_MS1_PIN, + #endif + #if PIN_EXISTS(E2_MS2) + #undef _E2_MS2 + #define _E2_MS2 E2_MS2_PIN, + #endif + #if PIN_EXISTS(E2_MS3) + #undef _E2_MS3 + #define _E2_MS3 E2_MS3_PIN, + #endif +#endif + +#define _E3_CS +#define _E3_MS1 +#define _E3_MS2 +#define _E3_MS3 + +#if E_NEEDED(3) + #if PIN_EXISTS(E3_CS) && AXIS_HAS_SPI(E3) + #undef _E3_CS + #define _E3_CS E3_CS_PIN, + #endif + #if PIN_EXISTS(E3_MS1) + #undef _E3_MS1 + #define _E3_MS1 E3_MS1_PIN, + #endif + #if PIN_EXISTS(E3_MS2) + #undef _E3_MS2 + #define _E3_MS2 E3_MS2_PIN, + #endif + #if PIN_EXISTS(E3_MS3) + #undef _E3_MS3 + #define _E3_MS3 E3_MS3_PIN, + #endif +#endif + +#define _E4_CS +#define _E4_MS1 +#define _E4_MS2 +#define _E4_MS3 + +#if E_NEEDED(4) + #if PIN_EXISTS(E4_CS) && AXIS_HAS_SPI(E4) + #undef _E4_CS + #define _E4_CS E4_CS_PIN, + #endif + #if PIN_EXISTS(E4_MS1) + #undef _E4_MS1 + #define _E4_MS1 E4_MS1_PIN, + #endif + #if PIN_EXISTS(E4_MS2) + #undef _E4_MS2 + #define _E4_MS2 E4_MS2_PIN, + #endif + #if PIN_EXISTS(E4_MS3) + #undef _E4_MS3 + #define _E4_MS3 E4_MS3_PIN, + #endif +#endif + +#define _E5_CS +#define _E5_MS1 +#define _E5_MS2 +#define _E5_MS3 + +#if E_NEEDED(5) + #if PIN_EXISTS(E5_CS) && AXIS_HAS_SPI(E5) + #undef _E5_CS + #define _E5_CS E5_CS_PIN, + #endif + #if PIN_EXISTS(E5_MS1) + #undef _E5_MS1 + #define _E5_MS1 E5_MS1_PIN, + #endif + #if PIN_EXISTS(E5_MS2) + #undef _E5_MS2 + #define _E5_MS2 E5_MS2_PIN, + #endif + #if PIN_EXISTS(E5_MS3) + #undef _E5_MS3 + #define _E5_MS3 E5_MS3_PIN, + #endif +#endif + +#define _E6_CS +#define _E6_MS1 +#define _E6_MS2 +#define _E6_MS3 + +#if E_NEEDED(6) + #if PIN_EXISTS(E6_CS) && AXIS_HAS_SPI(E6) + #undef _E6_CS + #define _E6_CS E6_CS_PIN, + #endif + #if PIN_EXISTS(E6_MS2) + #undef _E6_MS2 + #define _E6_MS2 E6_MS2_PIN, + #endif + #if PIN_EXISTS(E6_MS3) + #undef _E6_MS3 + #define _E6_MS3 E6_MS3_PIN, + #endif + #if PIN_EXISTS(E6_MS4) + #undef _E6_MS4 + #define _E6_MS4 E6_MS4_PIN, + #endif +#endif + +#define _E7_CS +#define _E7_MS1 +#define _E7_MS2 +#define _E7_MS3 + +#if E_NEEDED(7) + #if PIN_EXISTS(E7_CS) && AXIS_HAS_SPI(E7) + #undef _E7_CS + #define _E7_CS E7_CS_PIN, + #endif + #if PIN_EXISTS(E7_MS3) + #undef _E7_MS3 + #define _E7_MS3 E7_MS3_PIN, + #endif + #if PIN_EXISTS(E7_MS4) + #undef _E7_MS4 + #define _E7_MS4 E7_MS4_PIN, + #endif + #if PIN_EXISTS(E7_MS5) + #undef _E7_MS5 + #define _E7_MS5 E7_MS5_PIN, + #endif +#endif + +// +// E Steppers +// + +#define _E0_PINS +#define _E1_PINS +#define _E2_PINS +#define _E3_PINS +#define _E4_PINS +#define _E5_PINS +#define _E6_PINS +#define _E7_PINS + +#if EXTRUDERS + #undef _E0_PINS + #define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, _E0_CS _E0_MS1 _E0_MS2 _E0_MS3 +#endif + +#if ENABLED(SWITCHING_EXTRUDER) + // Tools 0 and 1 use E0 + #if EXTRUDERS > 2 // Tools 2 and 3 use E1 + #undef _E1_PINS + #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3 + #if EXTRUDERS > 4 // Tools 4 and 5 use E2 + #undef _E2_PINS + #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, _E2_CS _E2_MS1 _E2_MS2 _E2_MS3 + #endif + #endif + +#elif EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) + + #undef _E1_PINS + #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3 + #if EXTRUDERS > 2 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 2) + #undef _E2_PINS + #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, _E2_CS _E2_MS1 _E2_MS2 _E2_MS3 + #if EXTRUDERS > 3 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 3) + #undef _E3_PINS + #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, _E3_CS _E3_MS1 _E3_MS2 _E3_MS3 + #if EXTRUDERS > 4 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 4) + #undef _E4_PINS + #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, _E4_CS _E4_MS1 _E4_MS2 _E4_MS3 + #if EXTRUDERS > 5 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 5) + #undef _E5_PINS + #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, _E5_CS _E5_MS1 _E5_MS2 _E5_MS3 + #if EXTRUDERS > 6 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 6) + #undef _E6_PINS + #define _E6_PINS E6_STEP_PIN, E6_DIR_PIN, E6_ENABLE_PIN, _E6_CS _E6_MS1 _E6_MS2 _E6_MS3 + #if EXTRUDERS > 7 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 7) + #undef _E7_PINS + #define _E7_PINS E7_STEP_PIN, E7_DIR_PIN, E7_ENABLE_PIN, _E7_CS _E7_MS1 _E7_MS2 _E7_MS3 + #endif // EXTRUDERS > 7 || MIXING_EXTRUDER > 7 + #endif // EXTRUDERS > 6 || MIXING_EXTRUDER > 6 + #endif // EXTRUDERS > 5 || MIXING_EXTRUDER > 5 + #endif // EXTRUDERS > 4 || MIXING_EXTRUDER > 4 + #endif // EXTRUDERS > 3 || MIXING_EXTRUDER > 3 + #endif // EXTRUDERS > 2 || MIXING_EXTRUDER > 2 + +#endif // HAS_MULTI_EXTRUDER || MIXING_EXTRUDER + +// +// Heaters, Fans, Temp Sensors +// + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN -1 +#endif +#ifndef E1_AUTO_FAN_PIN + #define E1_AUTO_FAN_PIN -1 +#endif +#ifndef E2_AUTO_FAN_PIN + #define E2_AUTO_FAN_PIN -1 +#endif +#ifndef E3_AUTO_FAN_PIN + #define E3_AUTO_FAN_PIN -1 +#endif +#ifndef E4_AUTO_FAN_PIN + #define E4_AUTO_FAN_PIN -1 +#endif +#ifndef E5_AUTO_FAN_PIN + #define E5_AUTO_FAN_PIN -1 +#endif +#ifndef E6_AUTO_FAN_PIN + #define E6_AUTO_FAN_PIN -1 +#endif +#ifndef E7_AUTO_FAN_PIN + #define E7_AUTO_FAN_PIN -1 +#endif + +#define _H0_PINS +#define _H1_PINS +#define _H2_PINS +#define _H3_PINS +#define _H4_PINS +#define _H5_PINS +#define _H6_PINS +#define _H7_PINS + +#if HAS_HOTEND + #undef _H0_PINS + #define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_0_PIN), + #if HAS_MULTI_HOTEND + #undef _H1_PINS + #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_1_PIN), + #if HOTENDS > 2 + #undef _H2_PINS + #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_2_PIN), + #if HOTENDS > 3 + #undef _H3_PINS + #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN), + #if HOTENDS > 4 + #undef _H4_PINS + #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN), + #if HOTENDS > 5 + #undef _H5_PINS + #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN), + #if HOTENDS > 6 + #undef _H6_PINS + #define _H6_PINS HEATER_6_PIN, E6_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_6_PIN), + #if HOTENDS > 7 + #undef _H7_PINS + #define _H7_PINS HEATER_7_PIN, E7_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_7_PIN), + #endif // HOTENDS > 7 + #endif // HOTENDS > 6 + #endif // HOTENDS > 5 + #endif // HOTENDS > 4 + #endif // HOTENDS > 3 + #endif // HOTENDS > 2 + #endif // HAS_MULTI_HOTEND +#endif // HOTENDS + +// +// Dual X, Dual Y, Multi-Z +// Chip Select and Digital Micro-stepping +// + +#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS) + #if PIN_EXISTS(X2_CS) && AXIS_HAS_SPI(X2) + #define _X2_CS X2_CS_PIN, + #else + #define _X2_CS + #endif + #if PIN_EXISTS(X2_MS1) + #define _X2_MS1 X2_MS1_PIN, + #else + #define _X2_MS1 + #endif + #if PIN_EXISTS(X2_MS2) + #define _X2_MS2 X2_MS2_PIN, + #else + #define _X2_MS2 + #endif + #if PIN_EXISTS(X2_MS3) + #define _X2_MS3 X2_MS3_PIN, + #else + #define _X2_MS3 + #endif + #define _X2_PINS X2_STEP_PIN, X2_DIR_PIN, X2_ENABLE_PIN, _X2_CS _X2_MS1 _X2_MS2 _X2_MS3 +#else + #define _X2_PINS +#endif + +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + #if PIN_EXISTS(Y2_CS) && AXIS_HAS_SPI(Y2) + #define _Y2_CS Y2_CS_PIN, + #else + #define _Y2_CS + #endif + #if PIN_EXISTS(Y2_MS1) + #define _Y2_MS1 Y2_MS1_PIN, + #else + #define _Y2_MS1 + #endif + #if PIN_EXISTS(Y2_MS2) + #define _Y2_MS2 Y2_MS2_PIN, + #else + #define _Y2_MS2 + #endif + #if PIN_EXISTS(Y2_MS3) + #define _Y2_MS3 Y2_MS3_PIN, + #else + #define _Y2_MS3 + #endif + #define _Y2_PINS Y2_STEP_PIN, Y2_DIR_PIN, Y2_ENABLE_PIN, _Y2_CS _Y2_MS1 _Y2_MS2 _Y2_MS3 +#else + #define _Y2_PINS +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 2 + #if PIN_EXISTS(Z2_CS) && AXIS_HAS_SPI(Z2) + #define _Z2_CS Z2_CS_PIN, + #else + #define _Z2_CS + #endif + #if PIN_EXISTS(Z2_MS1) + #define _Z2_MS1 Z2_MS1_PIN, + #else + #define _Z2_MS1 + #endif + #if PIN_EXISTS(Z2_MS2) + #define _Z2_MS2 Z2_MS2_PIN, + #else + #define _Z2_MS2 + #endif + #if PIN_EXISTS(Z2_MS3) + #define _Z2_MS3 Z2_MS3_PIN, + #else + #define _Z2_MS3 + #endif + #define _Z2_PINS Z2_STEP_PIN, Z2_DIR_PIN, Z2_ENABLE_PIN, _Z2_CS _Z2_MS1 _Z2_MS2 _Z2_MS3 +#else + #define _Z2_PINS +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 3 + #if PIN_EXISTS(Z3_CS) && AXIS_HAS_SPI(Z3) + #define _Z3_CS Z3_CS_PIN, + #else + #define _Z3_CS + #endif + #if PIN_EXISTS(Z3_MS1) + #define _Z3_MS1 Z3_MS1_PIN, + #else + #define _Z3_MS1 + #endif + #if PIN_EXISTS(Z3_MS2) + #define _Z3_MS2 Z3_MS2_PIN, + #else + #define _Z3_MS2 + #endif + #if PIN_EXISTS(Z3_MS3) + #define _Z3_MS3 Z3_MS3_PIN, + #else + #define _Z3_MS3 + #endif + #define _Z3_PINS Z3_STEP_PIN, Z3_DIR_PIN, Z3_ENABLE_PIN, _Z3_CS _Z3_MS1 _Z3_MS2 _Z3_MS3 +#else + #define _Z3_PINS +#endif + +#if NUM_Z_STEPPER_DRIVERS >= 4 + #if PIN_EXISTS(Z4_CS) && AXIS_HAS_SPI(Z4) + #define _Z4_CS Z4_CS_PIN, + #else + #define _Z4_CS + #endif + #if PIN_EXISTS(Z4_MS1) + #define _Z4_MS1 Z4_MS1_PIN, + #else + #define _Z4_MS1 + #endif + #if PIN_EXISTS(Z4_MS2) + #define _Z4_MS2 Z4_MS2_PIN, + #else + #define _Z4_MS2 + #endif + #if PIN_EXISTS(Z4_MS3) + #define _Z4_MS3 Z4_MS3_PIN, + #else + #define _Z4_MS3 + #endif + #define _Z4_PINS Z4_STEP_PIN, Z4_DIR_PIN, Z4_ENABLE_PIN, _Z4_CS _Z4_MS1 _Z4_MS2 _Z4_MS3 +#else + #define _Z4_PINS +#endif + +// +// Generate the final Sensitive Pins array, +// keeping the array as small as possible. +// + +#if PIN_EXISTS(PS_ON) + #define _PS_ON PS_ON_PIN, +#else + #define _PS_ON +#endif + +#if HAS_BED_PROBE && PIN_EXISTS(Z_MIN_PROBE) + #define _Z_PROBE Z_MIN_PROBE_PIN, +#else + #define _Z_PROBE +#endif + +#if PIN_EXISTS(FAN) + #define _FAN0 FAN_PIN, +#else + #define _FAN0 +#endif +#if PIN_EXISTS(FAN1) + #define _FAN1 FAN1_PIN, +#else + #define _FAN1 +#endif +#if PIN_EXISTS(FAN2) + #define _FAN2 FAN2_PIN, +#else + #define _FAN2 +#endif +#if PIN_EXISTS(FAN3) + #define _FAN3 FAN3_PIN, +#else + #define _FAN3 +#endif +#if PIN_EXISTS(FAN4) + #define _FAN4 FAN4_PIN, +#else + #define _FAN4 +#endif +#if PIN_EXISTS(FAN5) + #define _FAN5 FAN5_PIN, +#else + #define _FAN5 +#endif +#if PIN_EXISTS(FAN6) + #define _FAN6 FAN6_PIN, +#else + #define _FAN6 +#endif +#if PIN_EXISTS(FAN7) + #define _FAN7 FAN7_PIN, +#else + #define _FAN7 +#endif +#if PIN_EXISTS(CONTROLLER_FAN) + #define _FANC CONTROLLER_FAN_PIN, +#else + #define _FANC +#endif + +#if TEMP_SENSOR_BED && PINS_EXIST(TEMP_BED, HEATER_BED) + #define _BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN), +#else + #define _BED_PINS +#endif + +#if TEMP_SENSOR_CHAMBER && PIN_EXISTS(TEMP_CHAMBER) + #define _CHAMBER_TEMP analogInputToDigitalPin(TEMP_CHAMBER_PIN), +#else + #define _CHAMBER_TEMP +#endif +#if TEMP_SENSOR_CHAMBER && PINS_EXIST(TEMP_CHAMBER, HEATER_CHAMBER) + #define _CHAMBER_HEATER HEATER_CHAMBER_PIN, +#else + #define _CHAMBER_HEATER +#endif +#if TEMP_SENSOR_CHAMBER && PINS_EXIST(TEMP_CHAMBER, CHAMBER_AUTO_FAN) + #define _CHAMBER_FAN CHAMBER_AUTO_FAN_PIN, +#else + #define _CHAMBER_FAN +#endif + +#ifndef HAL_SENSITIVE_PINS + #define HAL_SENSITIVE_PINS +#endif + +#define SENSITIVE_PINS { \ + _X_PINS _Y_PINS _Z_PINS _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS _Z4_PINS _Z_PROBE \ + _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS _E6_PINS _E7_PINS \ + _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS _H6_PINS _H7_PINS \ + _PS_ON _FAN0 _FAN1 _FAN2 _FAN3 _FAN4 _FAN5 _FAN6 _FAN7 _FANC \ + _BED_PINS _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ +} diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h new file mode 100644 index 00000000..abdd088f --- /dev/null +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M200_V2.h @@ -0,0 +1,31 @@ +/** + * 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 + +#if NOT_TARGET(STM32F0xx) + #error "Oops! Select an STM32F0 board in your IDE." +#endif + +#define BOARD_INFO_NAME "Malyan M200 V2" + +#include "../stm32f1/pins_MALYAN_M200.h" diff --git a/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h new file mode 100644 index 00000000..a0e035a9 --- /dev/null +++ b/Marlin/src/pins/stm32f0/pins_MALYAN_M300.h @@ -0,0 +1,91 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__, STM32F1xx, STM32F0xx) + #error "Oops! Select a 'Malyan M300' board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Malyan M300" + +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION + #ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x800U // 2KB + #endif +#endif + +// +// SD CARD SPI +// +#define SDSS SS_PIN + +// +// Timers +// +#define STEP_TIMER 6 +#define TEMP_TIMER 7 + +// +// Limit Switches +// +#define X_MAX_PIN PC13 +#define Y_MAX_PIN PC14 +#define Z_MAX_PIN PC15 +#define Z_MIN_PIN PB7 + +// +// Steppers +// +#define X_STEP_PIN PB14 +#define X_DIR_PIN PB13 +#define X_ENABLE_PIN PB10 + +#define Y_STEP_PIN PB12 +#define Y_DIR_PIN PB11 +#define Y_ENABLE_PIN PB10 + +#define Z_STEP_PIN PB2 +#define Z_DIR_PIN PB1 +#define Z_ENABLE_PIN PB10 + +#define E0_STEP_PIN PA7 +#define E0_DIR_PIN PA6 +#define E0_ENABLE_PIN PB0 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input (HOTEND0 thermistor) +#define TEMP_BED_PIN PA4 // Analog Input (BED thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA1 // HOTEND0 MOSFET +#define HEATER_BED_PIN PA5 // BED MOSFET + +#define AUTO_FAN_PIN PA8 diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h new file mode 100644 index 00000000..63b97b66 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -0,0 +1,289 @@ +/** + * 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 + +#if NOT_TARGET(TARGET_STM32F1) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "BTT SKR E3 DIP V1.0" + +// Release PB3/PB4 (TMC_SW Pins) from JTAG pins +#define DISABLE_JTAG + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#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 + +// +// Servos +// +#define SERVO0_PIN PA1 // SERVOS + +// +// Limit Switches +// +#define X_STOP_PIN PC1 // "X-STOP" +#define Y_STOP_PIN PC0 // "Y-STOP" +#define Z_STOP_PIN PC15 // "Z-STOP" + +// +// Z Probe must be this pin +// +#define Z_MIN_PROBE_PIN PC14 // "PROBE" + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PC2 // "E0-STOP" +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PC7 +#define X_STEP_PIN PC6 +#define X_DIR_PIN PB15 +#ifndef X_CS_PIN + #define X_CS_PIN PC10 +#endif + +#define Y_ENABLE_PIN PB14 +#define Y_STEP_PIN PB13 +#define Y_DIR_PIN PB12 +#ifndef Y_CS_PIN + #define Y_CS_PIN PC11 +#endif + +#define Z_ENABLE_PIN PB11 +#define Z_STEP_PIN PB10 +#define Z_DIR_PIN PB2 +#ifndef Z_CS_PIN + #define Z_CS_PIN PC12 +#endif + +#define E0_ENABLE_PIN PB1 +#define E0_STEP_PIN PB0 +#define E0_DIR_PIN PC5 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD2 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB5 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB4 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB3 + #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 MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN PC10 + #define X_SERIAL_RX_PIN PC10 + + #define Y_SERIAL_TX_PIN PC11 + #define Y_SERIAL_RX_PIN PC11 + + #define Z_SERIAL_TX_PIN PC12 + #define Z_SERIAL_RX_PIN PC12 + + #define E0_SERIAL_TX_PIN PD2 + #define E0_SERIAL_RX_PIN PD2 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input "TH0" +#define TEMP_BED_PIN PC3 // Analog Input "TB0" + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC8 // "HE" +#define HEATER_BED_PIN PC9 // "HB" +#define FAN_PIN PA8 // "FAN0" + +// +// USB connect control +// +#define USB_CONNECT_PIN PC13 +#define USB_CONNECT_INVERTING false + +/** + * _____ + * 5V | 1 2 | GND + * (LCD_EN) PB7 | 3 4 | PB8 (LCD_RS) + * (LCD_D4) PB9 | 5 6 PA10 (BTN_EN2) + * RESET | 7 8 | PA9 (BTN_EN1) + * (BTN_ENC) PB6 | 9 10| PA15 (BEEPER) + * ----- + * EXP1 + */ + +#if HAS_WIRED_LCD + + #if ENABLED(CR10_STOCKDISPLAY) + + #define BEEPER_PIN PA15 + + #define BTN_ENC PB6 + #define BTN_EN1 PA9 + #define BTN_EN2 PA10 + + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PB7 + #define LCD_PINS_D4 PB9 + + #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." + + #define LCD_PINS_RS PB9 + #define LCD_PINS_ENABLE PB6 + #define LCD_PINS_D4 PB8 + #define LCD_PINS_D5 PA10 + #define LCD_PINS_D6 PA9 + #define LCD_PINS_D7 PA15 + #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + /** Creality Ender-2 display pinout + * _____ + * 5V | 1 2 | GND + * (MOSI) PB7 | 3 4 | PB8 (LCD_RS) + * (LCD_A0) PB9 | 5 6 PA10 (BTN_EN2) + * RESET | 7 8 | PA9 (BTN_EN1) + * (BTN_ENC) PB6 | 9 10| PA15 (SCK) + * ----- + * EXP1 + */ + + #define BTN_ENC PB6 + #define BTN_EN1 PA9 + #define BTN_EN2 PA10 + + #define DOGLCD_CS PB8 + #define DOGLCD_A0 PB9 + #define DOGLCD_SCK PA15 + #define DOGLCD_MOSI PB7 + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + + #else + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and MKS_LCD12864 are currently supported on the BIGTREE_SKR_E3_DIP." + #endif + +#endif // HAS_WIRED_LCD + +#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + + #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_E3_DIP.h' for details. Comment out this line to continue." + + /** FYSETC TFT TFT81050 display pinout + * + * Board Display + * _____ _____ + * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) + * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) MOD_RESET | 3 4 | SD_CS (PA10) + * (FREE) PB9 | 5 6 PA10 (SD_CS) (PB8) LCD_CS | 5 6 MOSI (SPI1-MOSI) + * RESET | 7 8 | PA9 (MOD_RESET) (PA15) SD_DET | 7 8 | RESET + * (BEEPER) PB6 | 9 10| PA15 (SD_DET) GND | 9 10| 5V + * ----- ----- + * EXP1 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP1-1 ----------- EXP1-10 + * EXP1-2 ----------- EXP1-9 + * SPI1-4 ----------- EXP1-6 + * EXP1-4 ----------- EXP1-5 + * SP11-3 ----------- EXP1-2 + * EXP1-6 ----------- EXP1-4 + * EXP1-7 ----------- EXP1-8 + * EXP1-8 ----------- EXP1-3 + * SPI1-1 ----------- EXP1-1 + * EXP1-10 ----------- EXP1-7 + */ + + #define CLCD_SPI_BUS 1 // SPI1 connector + + #define BEEPER_PIN PB6 + + #define CLCD_MOD_RESET PA9 + #define CLCD_SPI_CS PA8 + +#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 + +// +// SD Support +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN PC4 +#elif SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + #define SD_DETECT_PIN PA15 + #define SS_PIN PA10 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "SD CUSTOM_CABLE is not compatible with SKR E3 DIP." +#endif + +#define ONBOARD_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_V1_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h new file mode 100644 index 00000000..78751a6b --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h @@ -0,0 +1,37 @@ +/** + * 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 "pins_BTT_SKR_MINI_E3_common.h" + +#define BOARD_INFO_NAME "BTT SKR Mini E3 V1.0" + +/** + * TMC220x stepper drivers + * Hardware serial communication ports. + */ +#if HAS_TMC_UART + #define X_HARDWARE_SERIAL MSerial4 + #define Y_HARDWARE_SERIAL MSerial4 + #define Z_HARDWARE_SERIAL MSerial4 + #define E0_HARDWARE_SERIAL MSerial4 +#endif 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 new file mode 100644 index 00000000..8d384c73 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h @@ -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 . + * + */ +#pragma once + +#include "pins_BTT_SKR_MINI_E3_common.h" + +#define BOARD_INFO_NAME "BTT SKR Mini E3 V1.2" + +#define NEOPIXEL_PIN PC7 // LED driving pin + +/** + * TMC2208/TMC2209 stepper drivers + */ +#if HAS_TMC_UART + // + // Software serial + // + #define X_SERIAL_TX_PIN PB15 + #define X_SERIAL_RX_PIN PB15 + + #define Y_SERIAL_TX_PIN PC6 + #define Y_SERIAL_RX_PIN PC6 + + #define Z_SERIAL_TX_PIN PC10 + #define Z_SERIAL_RX_PIN PC10 + + #define E0_SERIAL_TX_PIN PC11 + #define E0_SERIAL_RX_PIN PC11 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif 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 new file mode 100644 index 00000000..0a0d857d --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -0,0 +1,59 @@ +/** + * 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 SKR_MINI_E3_V2 + +// Onboard I2C EEPROM +#if NO_EEPROM_SELECTED + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #undef NO_EEPROM_SELECTED +#endif + +#include "pins_BTT_SKR_MINI_E3_common.h" + +#define BOARD_INFO_NAME "BTT SKR Mini E3 V2.0" + +// Release PA13/PA14 (led, usb control) from SWD pins +#define DISABLE_DEBUG + +#define NEOPIXEL_PIN PA8 // LED driving pin + +#define PS_ON_PIN PC13 // Power Supply Control + +#define FAN1_PIN PC7 + +#ifndef CONTROLLER_FAN_PIN + #define CONTROLLER_FAN_PIN FAN1_PIN +#endif + +/** + * TMC220x stepper drivers + * Hardware serial communication ports. + */ +#if HAS_TMC_UART + #define X_HARDWARE_SERIAL MSerial4 + #define Y_HARDWARE_SERIAL MSerial4 + #define Z_HARDWARE_SERIAL MSerial4 + #define E0_HARDWARE_SERIAL MSerial4 +#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 new file mode 100644 index 00000000..50257f4f --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -0,0 +1,276 @@ +/** + * 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 + +#if NOT_TARGET(TARGET_STM32F1) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +// Release PB3/PB4 (E0 STP/DIR) from JTAG pins +#define DISABLE_JTAG + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#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 + +// +// Servos +// +#define SERVO0_PIN PA1 // "SERVOS" + +// +// Limit Switches +// +#define X_STOP_PIN PC0 // "X-STOP" +#define Y_STOP_PIN PC1 // "Y-STOP" +#define Z_STOP_PIN PC2 // "Z-STOP" + +// +// Z Probe must be this pin +// +#define Z_MIN_PROBE_PIN PC14 // "PROBE" + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PC15 // "E0-STOP" +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PB14 +#define X_STEP_PIN PB13 +#define X_DIR_PIN PB12 + +#define Y_ENABLE_PIN PB11 +#define Y_STEP_PIN PB10 +#define Y_DIR_PIN PB2 + +#define Z_ENABLE_PIN PB1 +#define Z_STEP_PIN PB0 +#define Z_DIR_PIN PC5 + +#define E0_ENABLE_PIN PD2 +#define E0_STEP_PIN PB3 +#define E0_DIR_PIN PB4 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input "TH0" +#define TEMP_BED_PIN PC3 // Analog Input "TB0" + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC8 // "HE" +#define HEATER_BED_PIN PC9 // "HB" + +#ifdef SKR_MINI_E3_V2 + #define FAN_PIN PC6 +#else + #define FAN_PIN PA8 // "FAN0" +#endif + +// +// USB connect control +// +#ifdef SKR_MINI_E3_V2 + #define USB_CONNECT_PIN PA14 +#else + #define USB_CONNECT_PIN PC13 +#endif + +#define USB_CONNECT_INVERTING false + +/** + * SKR Mini E3 V1.0, V1.2 SKR Mini E3 V2.0 + * _____ _____ + * 5V | 1 2 | GND 5V | 1 2 | GND + * (LCD_EN) PB7 | 3 4 | PB8 (LCD_RS) (LCD_EN) PB15 | 3 4 | PB8 (LCD_RS) + * (LCD_D4) PB9 | 5 6 PA10 (BTN_EN2) (LCD_D4) PB9 | 5 6 PA10 (BTN_EN2) + * RESET | 7 8 | PA9 (BTN_EN1) RESET | 7 8 | PA9 (BTN_EN1) + * (BTN_ENC) PB6 | 9 10| PB5 (BEEPER) (BTN_ENC) PA15 | 9 10| PB5 (BEEPER) + * ----- ----- + * EXP1 EXP1 + */ +#ifdef SKR_MINI_E3_V2 + #define EXP1_9 PA15 + #define EXP1_3 PB15 +#else + #define EXP1_9 PB6 + #define EXP1_3 PB7 +#endif + +#if HAS_WIRED_LCD + + #if ENABLED(CR10_STOCKDISPLAY) + + #define BEEPER_PIN PB5 + #define BTN_ENC EXP1_9 + + #define BTN_EN1 PA9 + #define BTN_EN2 PA10 + + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE EXP1_3 + #define LCD_PINS_D4 PB9 + + #elif ENABLED(ZONESTAR_LCD) // ANET A8 LCD Controller - Must convert to 3.3V - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #error "CAUTION! ZONESTAR_LCD requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." + + #define LCD_PINS_RS PB9 + #define LCD_PINS_ENABLE EXP1_9 + #define LCD_PINS_D4 PB8 + #define LCD_PINS_D5 PA10 + #define LCD_PINS_D6 PA9 + #define LCD_PINS_D7 PB5 + #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! + + #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + + #define BTN_ENC EXP1_9 + #define BTN_EN1 PA9 + #define BTN_EN2 PA10 + + #define DOGLCD_CS PB8 + #define DOGLCD_A0 PB9 + #define DOGLCD_SCK PB5 + #define DOGLCD_MOSI EXP1_3 + + #define FORCE_SOFT_SPI + #define LCD_BACKLIGHT_PIN -1 + + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + + #error "CAUTION! TFTGLCD_PANEL_SPI requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." + + /** + * TFTGLCD_PANEL_SPI display pinout + * + * Board Display + * _____ _____ + * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) + * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) GLCD_CS | 3 4 | SD_CS (PA10) + * (FREE) PB9 | 5 6 | PA10 (SD_CS) (FREE) | 5 6 | MOSI (SPI1-MOSI) + * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | (FREE) + * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V + * ----- ----- + * EXP1 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP1-1 ----------- EXP1-10 + * EXP1-2 ----------- EXP1-9 + * SPI1-4 ----------- EXP1-6 + * EXP1-4 ----------- FREE + * SPI1-3 ----------- EXP1-2 + * EXP1-6 ----------- EXP1-4 + * EXP1-7 ----------- FREE + * EXP1-8 ----------- EXP1-3 + * SPI1-1 ----------- EXP1-1 + * EXP1-10 ----------- EXP1-7 + */ + + #define TFTGLCD_CS PA9 + + #endif + + #else + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, and TFTGLCD_PANEL_(SPI|I2C) are currently supported on the BIGTREE_SKR_MINI_E3." + #endif + +#endif // HAS_WIRED_LCD + +#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + + #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. Comment out this line to continue." + + /** FYSETC TFT TFT81050 display pinout + * + * Board Display + * _____ _____ + * 5V | 1 2 | GND (SPI1-MISO) MISO | 1 2 | SCK (SPI1-SCK) + * (FREE) PB7 | 3 4 | PB8 (LCD_CS) (PA9) MOD_RESET | 3 4 | SD_CS (PA10) + * (FREE) PB9 | 5 6 | PA10 (SD_CS) (PB8) LCD_CS | 5 6 | MOSI (SPI1-MOSI) + * RESET | 7 8 | PA9 (MOD_RESET) (PB5) SD_DET | 7 8 | RESET + * (BEEPER) PB6 | 9 10| PB5 (SD_DET) GND | 9 10| 5V + * ----- ----- + * EXP1 EXP1 + * + * Needs custom cable: + * + * Board Adapter Display + * _________ + * EXP1-1 ----------- EXP1-10 + * EXP1-2 ----------- EXP1-9 + * SPI1-4 ----------- EXP1-6 + * EXP1-4 ----------- EXP1-5 + * SPI1-3 ----------- EXP1-2 + * EXP1-6 ----------- EXP1-4 + * EXP1-7 ----------- EXP1-8 + * EXP1-8 ----------- EXP1-3 + * SPI1-1 ----------- EXP1-1 + * EXP1-10 ----------- EXP1-7 + */ + + #define CLCD_SPI_BUS 1 // SPI1 connector + + #define BEEPER_PIN EXP1_9 + + #define CLCD_MOD_RESET PA9 + #define CLCD_SPI_CS PB8 + +#endif // TOUCH_UI_FTDI_EVE && LCD_FYSETC_TFT81050 + +// +// SD Support +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN PC4 +#elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) + #define SD_DETECT_PIN PB5 + #define SS_PIN PA10 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "SD CUSTOM_CABLE is not compatible with SKR Mini E3." +#endif + +#define ONBOARD_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 new file mode 100644 index 00000000..47fff446 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -0,0 +1,228 @@ +/** + * 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 + +#if NOT_TARGET(TARGET_STM32F1) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "BTT SKR Mini V1.1" + +//#define DISABLE_DEBUG +#define DISABLE_JTAG + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#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 + +// +// Limit Switches +// +#define X_MIN_PIN PC2 +#define X_MAX_PIN PA2 +#define Y_MIN_PIN PC1 +#define Y_MAX_PIN PA1 +#define Z_MIN_PIN PC0 +#define Z_MAX_PIN PC3 + +// +// Steppers +// + +#define X_STEP_PIN PC6 +#define X_DIR_PIN PC7 +#define X_ENABLE_PIN PB15 + +#define Y_STEP_PIN PB13 +#define Y_DIR_PIN PB14 +#define Y_ENABLE_PIN PB12 + +#define Z_STEP_PIN PB10 +#define Z_DIR_PIN PB11 +#define Z_ENABLE_PIN PB2 + +#define E0_STEP_PIN PC5 +#define E0_DIR_PIN PB0 +#define E0_ENABLE_PIN PC4 + +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB3 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB4 + #endif + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB5 + #endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA8 +#define FAN_PIN PC8 +#define HEATER_BED_PIN PC9 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PB1 // Analog Input +#define TEMP_0_PIN PA0 // Analog Input + +// +// LCD Pins +// + +/** + * _____ _____ + * NC | · · | GND 5V | · · | GND + * RESET | · · | PB9 (SD_DETECT) (LCD_D7) PC14 | · · | PC15 (LCD_D6) + * (MOSI) PB5 | · · | PB8 (BTN_EN2) (LCD_D5) PB7 | · · | PC13 (LCD_D4) + * (SD_SS) PA15 | · · | PD2 (BTN_EN1) (LCD_RS) PC12 | · · | PB6 (LCD_EN) + * (SCK) PB3 | · · | PB4 (MISO) (BTN_ENC) PC11 | · · | PC10 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +#if HAS_WIRED_LCD + #define BEEPER_PIN PC10 + #define BTN_ENC PC11 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS PC15 + + #define BTN_EN1 PB6 + #define BTN_EN2 PC13 + + #define LCD_PINS_ENABLE PC14 + #define LCD_PINS_D4 PB7 + + #elif IS_TFTGLCD_PANEL + + #undef BEEPER_PIN + #undef BTN_ENC + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PD2 + #endif + + #define SD_DETECT_PIN PB9 + + #else + + #define LCD_PINS_RS PC12 + + #define BTN_EN1 PD2 + #define BTN_EN2 PB8 + + #define LCD_PINS_ENABLE PB6 + + #if ENABLED(FYSETC_MINI_12864) + + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN PC13 + #define DOGLCD_A0 PC12 + #define DOGLCD_CS PB6 + #define DOGLCD_SCK PB3 + #define DOGLCD_MOSI PB5 + + #define FORCE_SOFT_SPI // SPI MODE3 + + #define LED_PIN PB7 // red pwm + //#define LED_PIN PC15 // green + //#define LED_PIN PC14 // blue + + //#if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + // #ifndef RGB_LED_R_PIN + // #define RGB_LED_R_PIN PB7 + // #endif + // #ifndef RGB_LED_G_PIN + // #define RGB_LED_G_PIN PC15 + // #endif + // #ifndef RGB_LED_B_PIN + // #define RGB_LED_B_PIN PC14 + // #endif + //#elif ENABLED(FYSETC_MINI_12864_2_1) + // #define NEOPIXEL_PIN PB7 + //#endif + + #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 + + #endif // !FYSETC_MINI_12864 + + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +// +// SD Card +// + +// By default the onboard SD is enabled. +// Change SDCARD_CONNECTION from 'ONBOARD' to 'LCD' for an external (LCD module) SD +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(LCD) + #define ENABLE_SPI3 + #define SD_DETECT_PIN PB9 + #define SCK_PIN PB3 + #define MISO_PIN PB4 + #define MOSI_PIN PB5 + #define SS_PIN PA15 +#elif SD_CONNECTION_IS(ONBOARD) + #define ENABLE_SPI1 + #define SD_DETECT_PIN PA3 + #define SCK_PIN PA5 + #define MISO_PIN PA6 + #define MOSI_PIN PA7 + #define SS_PIN PA4 +#endif +#define ONBOARD_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 new file mode 100644 index 00000000..66930a2e --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -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 . + * + */ +#pragma once + +#if NOT_TARGET(TARGET_STM32F1) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "CCROBOT-ONLINE MEEB_3DP only supports 1 hotend / E-stepper. Comment out this line to continue." +#endif + +// https://github.com/ccrobot-online/MEEB_3DP +// Pin assignments for 32-bit MEEB_3DP +#define BOARD_INFO_NAME "CCROBOT-ONLINE MEEB_3DP" +#define DEFAULT_MACHINE_NAME "STM32F103RCT6" +#define BOARD_WEBSITE_URL "ccrobot-online.com" + +// +// Release PB4 from JTAG NRST role +// +#define DISABLE_JTAG + +// +// EEPROM +// +#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 0x1000 // 4KB +#endif + +// +// Servos +// +#define SERVO0_PIN PA1 + +// +// Limit Switches +// +#define X_STOP_PIN PC0 +#define Y_STOP_PIN PC1 +#define Z_STOP_PIN PC2 + +// +// Z Probe must be this pin +// +#define Z_MIN_PROBE_PIN PC15 // "PROBE" + +// +// TMC2208 stepper drivers +// +#define X_ENABLE_PIN PB4 +#define X_STEP_PIN PC12 +#define X_DIR_PIN PC11 + +#define Y_ENABLE_PIN PC10 +#define Y_STEP_PIN PB14 +#define Y_DIR_PIN PB13 + +#define Z_ENABLE_PIN PB12 +#define Z_STEP_PIN PB2 +#define Z_DIR_PIN PB1 + +#define E0_ENABLE_PIN PB0 +#define E0_STEP_PIN PA6 +#define E0_DIR_PIN PA5 + +// Stepper drivers Serial UART +#define X_SERIAL_TX_PIN PB3 +#define X_SERIAL_RX_PIN PD2 +#define Y_SERIAL_TX_PIN PA15 +#define Y_SERIAL_RX_PIN PC6 +#define Z_SERIAL_TX_PIN PB11 +#define Z_SERIAL_RX_PIN PB10 +#define E0_SERIAL_TX_PIN PC5 +#define E0_SERIAL_RX_PIN PC4 + +// Reduce baud rate to improve software serial reliability +#define TMC_BAUD_RATE 19200 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // TH0 +#define TEMP_BED_PIN PC3 // THB + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC8 // HEATER0 +#define HEATER_BED_PIN PC9 // HOT BED + +#define FAN_PIN PA7 // FAN (fan2 on board) model cool fan +#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 +#define NEOPIXEL_PIN PC7 // The NEOPIXEL LED driving pin + +/** + * 1 _____ 2 + * PB5 | · · | PB6 + * PA2 | · · | RESET + * PA3 | · · | PB8 + * PB7 | · · | PA4 + * GND | · · | VCC5 + * 9 ----- 10 + * LCD EXP + */ + +// +// LCD / Controller +// +#if ENABLED(CR10_STOCKDISPLAY) + #define BEEPER_PIN PB5 + #define BTN_EN1 PA2 + #define BTN_EN2 PA3 + #define BTN_ENC PB6 + + #define LCD_PINS_RS PB7 // CS -- SOFT SPI for ENDER3 LCD + #define LCD_PINS_D4 PB8 // SCLK + #define LCD_PINS_ENABLE PA4 // DATA MOSI +#endif + +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #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 + +// +// Camera +// +#define CHDK_PIN PB15 + +#if 0 + +// +// SD-NAND +// +#if SD_CONNECTION_IS(ONBOARD) + #define ENABLE_SPI1 + #define SD_DETECT_PIN -1 + #define SCK_PIN PA5 + #define MISO_PIN PA6 + #define MOSI_PIN PA7 + #define SS_PIN PA4 +#endif + +#define ONBOARD_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 new file mode 100644 index 00000000..3a872db0 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -0,0 +1,284 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__, __STM32F4__) + #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#endif + +/** + * 2017 Victor Perez Marlin for stm32f1 test + */ + +#define BOARD_INFO_NAME "Chitu3D" +#define DEFAULT_MACHINE_NAME "STM32F103RET6" + +// Enable I2C_EEPROM for testing +//#define I2C_EEPROM + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Steppers +// +#define X_STEP_PIN PE5 +#define X_DIR_PIN PE6 +#define X_ENABLE_PIN PC13 +#define X_MIN_PIN PG10 +#define X_MAX_PIN -1 + +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 +#define Y_ENABLE_PIN PE4 +#define Y_MIN_PIN PA12 +#define Y_MAX_PIN + +#define Z_STEP_PIN PB9 +#define Z_DIR_PIN PE0 +#define Z_ENABLE_PIN PE1 +#define Z_MIN_PIN PA14 +#define Z_MAX_PIN -1 + +#define Y2_STEP_PIN -1 +#define Y2_DIR_PIN -1 +#define Y2_ENABLE_PIN -1 + +#define Z2_STEP_PIN -1 +#define Z2_DIR_PIN -1 +#define Z2_ENABLE_PIN -1 + +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB5 +#define E0_ENABLE_PIN PB8 + +#define E1_STEP_PIN -1 +#define E1_DIR_PIN -1 +#define E1_ENABLE_PIN -1 + +#define E2_STEP_PIN -1 +#define E2_DIR_PIN -1 +#define E2_ENABLE_PIN -1 + +// +// Misc. Functions +// +#define SDSS -1 +#define LED_PIN -1 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN PA8 // 8 +#endif + +#define PS_ON_PIN -1 +#define KILL_PIN PD6 // LED strip 24v + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // HOT-END +#define HEATER_1_PIN -1 +#define HEATER_2_PIN -1 + +#define HEATER_BED_PIN PG11 // HOT-BED +#define HEATER_BED2_PIN -1 // BED2 +#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PG14 // MAIN BOARD FAN +#endif + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // Analog Input +#define TEMP_0_PIN PA1 // Analog Input +#define TEMP_1_PIN -1 // Analog Input +#define TEMP_2_PIN -1 // Analog Input + +// +// LCD Pins +// +#if HAS_WIRED_LCD + + #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + #define LCD_PINS_RS PD1 // 49 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE PD3 // 51 // SID (MOSI) + #define LCD_PINS_D4 PD4 // 52 // SCK (CLK) clock + #elif BOTH(NEWPANEL, PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #define BEEPER_PIN PC1 // 33 + // Buttons attached to a shift register + // Not wired yet + //#define SHIFT_CLK PC6 // 38 + //#define SHIFT_LD PC10 // 42 + //#define SHIFT_OUT PC8 // 40 + //#define SHIFT_EN PA1 // 17 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN PC5 + + #define BTN_EN1 PB15 // 31 + #define BTN_EN2 PC1 // 33 + #define BTN_ENC PC3 // 35 + + #define SD_DETECT_PIN PD1 // 49 + #define KILL_PIN PC9 // 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #define LCD_BACKLIGHT_PIN PC7 // 39 + #endif + + #elif ENABLED(REPRAPWORLD_GRAPHICAL_LCD) + + #define BTN_EN1 PE0 // 64 + #define BTN_EN2 PD11 // 59 + #define BTN_ENC PD15 // 63 + #define SD_DETECT_PIN PC10 // 42 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 PC15 // 47 + #define BTN_EN2 PC11 // 43 + #define BTN_ENC PC0 // 32 + #define LCD_SDSS PD5 // 53 + #define SD_DETECT_PIN -1 + #define KILL_PIN PC9 // 41 + + #elif ENABLED(LCD_I2C_VIKI) + + #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 + #define LCD_SDSS PD5 // 53 + #define SD_DETECT_PIN PD1 // 49 + + #elif ANY(VIKI2, miniVIKI) + + #define BEEPER_PIN PC1 // 33 + + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 PC12 // 44 + #define DOGLCD_CS PC13 // 45 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 PB6 // 22 + #define BTN_EN2 PA7 // 7 + #define BTN_ENC PC7 // 39 + + #define SDSS PD5 // 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN PB15 // 31 + + #define STAT_LED_RED_PIN PC0 // 32 + #define STAT_LED_BLUE_PIN PC3 // 35 + + #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) + #define BTN_EN1 PC3 // 35 + #define BTN_EN2 PC5 // 37 + #define BTN_ENC PB15 // 31 + #define SD_DETECT_PIN PD1 // 49 + #define LCD_SDSS PD5 // 53 + #define KILL_PIN PC9 // 41 + #define BEEPER_PIN PB7 // 23 + #define DOGLCD_CS PB13 // 29 + #define DOGLCD_A0 PB11 // 27 + #define LCD_BACKLIGHT_PIN PC1 // 33 + + #elif ENABLED(MINIPANEL) + + #define BEEPER_PIN PC10 // 42 + // Pins for DOGM SPI LCD Support + #define DOGLCD_A0 PC12 // 44 + #define DOGLCD_CS PE2 // 66 + #define LCD_BACKLIGHT_PIN PE1 // 65 // backlight LED on A11/D65 + #define SDSS PD5 // 53 + + #define KILL_PIN PE0 // 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 PC8 // 40 + #define BTN_EN2 PD15 // 63 + #define BTN_ENC PD11 // 59 + // not connected to a pin + #define SD_DETECT_PIN PD1 // 49 + + #else + + // Beeper on AUX-4 + #define BEEPER_PIN PC1 // 33 + + // Buttons directly attached to AUX-2 + #if ENABLED(REPRAPWORLD_KEYPAD) + #define BTN_EN1 PE0 // 64 + #define BTN_EN2 PD11 // 59 + #define BTN_ENC PD15 // 63 + #define SHIFT_OUT PC8 // 40 + #define SHIFT_CLK PC12 // 44 + #define SHIFT_LD PC10 // 42 + #elif ENABLED(PANEL_ONE) + #define BTN_EN1 PD11 // 59 // AUX2 PIN 3 + #define BTN_EN2 PD15 // 63 // AUX2 PIN 4 + #define BTN_ENC PD1 // 49 // AUX3 PIN 7 + #else + #define BTN_EN1 PC5 // 37 + #define BTN_EN2 PC3 // 35 + #define BTN_ENC PB15 // 31 + #endif + + #if ENABLED(G3D_PANEL) + #define SD_DETECT_PIN PD1 // 49 + #define KILL_PIN PC9 // 41 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h new file mode 100644 index 00000000..b02d4140 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -0,0 +1,203 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__, __STM32F4__) + #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#endif + +/** + * 2017 Victor Perez Marlin for stm32f1 test + */ + +#define BOARD_INFO_NAME "Chitu3D V5" +#define DEFAULT_MACHINE_NAME "STM32F103ZET6" + +#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_STOP_PIN PG10 +#define Y_STOP_PIN PA12 +#define Z_STOP_PIN PA14 + +// +// 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 + +// +// Fans +// +#define CONTROLLER_FAN_PIN PD6 // BOARD FAN +#define FAN_PIN PG13 // FAN +#define FAN_PIN_2 PG14 + +// +// Misc +// +#define BEEPER_PIN PB0 +//#define LED_PIN -1 +//#define POWER_LOSS_PIN -1 +#define FIL_RUNOUT_PIN PA15 + +// SPI Flash +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x200000 // 2MB +#endif + +// SPI 2 +#define W25QXX_CS_PIN PB12 +#define W25QXX_MOSI_PIN PB15 +#define W25QXX_MISO_PIN PB14 +#define W25QXX_SCK_PIN PB13 + +// +// 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 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 + +#endif + +#if ENABLED(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 +#elif ENABLED(TFT_COLOR_UI) + // Color UI + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 +#elif ENABLED(TFT_CLASSIC_UI) + // Emulated DOGM + #define GRAPHICAL_TFT_UPSCALE 3 +#endif + +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17181 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11434 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 501 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -9 + #endif +#elif ENABLED(TFT_CLASSIC_UI) + #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 +// Needs to use SPI2 +#define ENABLE_SPI2 +#define SCK_PIN PB13 +#define MISO_PIN PB14 +#define MOSI_PIN PB15 +#define SS_PIN PB12 + +// +// SD Card +// +#define SDIO_SUPPORT +#define SD_DETECT_PIN -1 // PF0, but it isn't connected +#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 new file mode 100644 index 00000000..cafd50dc --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -0,0 +1,218 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__, __STM32F4__) + #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#endif + +/** + * 2017 Victor Perez Marlin for stm32f1 test + */ + +#define BOARD_INFO_NAME "Chitu3D" +#define DEFAULT_MACHINE_NAME "STM32F103ZET6" + +#define DISABLE_JTAG + +// +// EEPROM +// + +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION +#endif + +#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_STOP_PIN PG10 +#define Y_STOP_PIN PA12 +#define Z_STOP_PIN PG9 + +// +// 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 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 + +#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 // BOARD FAN +#define FAN_PIN PG13 // FAN +#define FAN_PIN_2 PG14 + +// +// Misc +// +#define BEEPER_PIN PB0 +//#define LED_PIN PD3 +//#define POWER_LOSS_PIN PG2 // PG4 PW_DET + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA15 // MT_DET +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN PF13 +#endif + +// SPI Flash +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x200000 // 2MB +#endif + +// SPI 2 +#define W25QXX_CS_PIN PB12 +#define W25QXX_MOSI_PIN PB15 +#define W25QXX_MISO_PIN PB14 +#define W25QXX_SCK_PIN PB13 + +// +// 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 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 + +#endif + +#if ENABLED(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 +#elif ENABLED(TFT_COLOR_UI) + // Color UI + #define TFT_DRIVER ILI9488 + #define TFT_BUFFER_SIZE 14400 +#elif ENABLED(TFT_CLASSIC_UI) + // Emulated DOGM + #define GRAPHICAL_TFT_UPSCALE 3 +#endif + +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17181 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11434 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 501 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -9 + #endif +#elif ENABLED(TFT_CLASSIC_UI) + #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 +// so SPI2 is required. +#define ENABLE_SPI2 +#define SCK_PIN PB13 +#define MISO_PIN PB14 +#define MOSI_PIN PB15 +#define SS_PIN PB12 + +// +// SD Card +// +#define SDIO_SUPPORT +#define SD_DETECT_PIN -1 // PF0, but it isn't connected +#define SDIO_CLOCK 4500000 +#define SDIO_READ_RETRIES 16 diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h new file mode 100644 index 00000000..eb910dd8 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -0,0 +1,208 @@ +/** + * 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 (STM32F103) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Ender 3 V2" +#endif + +// +// EEPROM +// +#if NO_EEPROM_SELECTED + // FLASH + //#define FLASH_EEPROM_EMULATION + + // I2C + #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 0x800 // 2Kb (24C16) + #else + #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb + #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 +// +#define SERVO0_PIN PB0 // BLTouch OUT + +// +// Limit Switches +// +#define X_STOP_PIN PA5 +#define Y_STOP_PIN PA6 +#define Z_STOP_PIN PA7 + +#define Z_MIN_PROBE_PIN PB1 // BLTouch IN + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA4 // "Pulled-high" +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PC3 +#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 +#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 +#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 +#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 +// +#define DISABLE_DEBUG + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC5 // TH1 +#define TEMP_BED_PIN PC4 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA1 // HEATER1 +#define HEATER_BED_PIN PA2 // HOT BED + +#define FAN_PIN PA0 // FAN +#define FAN_SOFT_PWM + +// +// SD Card +// +#define SD_DETECT_PIN PC7 +#define SDCARD_CONNECTION ONBOARD +#define ONBOARD_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." +#endif + +#if ENABLED(RET6_12864_LCD) + + // RET6 12864 LCD + #define LCD_PINS_RS PB12 + #define LCD_PINS_ENABLE PB15 + #define LCD_PINS_D4 PB13 + + #define BTN_ENC PB2 + #define BTN_EN1 PB10 + #define BTN_EN2 PB14 + + #define BEEPER_PIN PC6 + +#elif ENABLED(VET6_12864_LCD) + + // VET6 12864 LCD + #define LCD_PINS_RS PA4 + #define LCD_PINS_ENABLE PA7 + #define LCD_PINS_D4 PA5 + + #define BTN_ENC PC5 + #define BTN_EN1 PB10 + #define BTN_EN2 PA6 + +#elif ENABLED(DWIN_CREALITY_LCD) + + // RET6 DWIN ENCODER LCD + #define BTN_ENC PB14 + #define BTN_EN1 PB15 + #define BTN_EN2 PB12 + + //#define LCD_LED_PIN PB2 + #ifndef BEEPER_PIN + #define BEEPER_PIN PB13 + #undef SPEAKER + #endif + +#elif ENABLED(DWIN_VET6_CREALITY_LCD) + + // VET6 DWIN ENCODER LCD + #define BTN_ENC PA6 + #define BTN_EN1 PA7 + #define BTN_EN2 PA4 + + #define BEEPER_PIN PA5 + +#endif 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 00000000..5b51ece0 --- /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 + */ + +#if NOT_TARGET(__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" diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h new file mode 100644 index 00000000..55a809ef --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -0,0 +1,172 @@ +/** + * 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 __STM32F1__ + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "FLY_MINI" +#define BOARD_WEBSITE_URL "github.com/FLYmaker" +#define DISABLE_JTAG + +// +// Flash EEPROM Emulation +// +#define FLASH_EEPROM_EMULATION +#define EEPROM_PAGE_SIZE 0x800 // 2KB +#define EEPROM_START_ADDRESS (0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) // 256K firmware space +#define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE + +// +// Servos +// +#define SERVO0_PIN PA8 + +// +// Limit Switches +// +#define X_MIN_PIN PC12 +#define X_MAX_PIN PC11 +#define Y_MIN_PIN PC10 +#define Y_MAX_PIN PA15 +#define Z_MIN_PIN PA14 +#define Z_MAX_PIN PA13 + +// +// Steppers +// +#define X_STEP_PIN PB1 +#define X_DIR_PIN PB2 +#define X_ENABLE_PIN PB10 +#ifndef X_CS_PIN + #define X_CS_PIN PB0 +#endif + +#define Y_STEP_PIN PA2 +#define Y_DIR_PIN PC4 +#define Y_ENABLE_PIN PC5 +#ifndef Y_CS_PIN + #define Y_CS_PIN PA7 +#endif + +#define Z_STEP_PIN PA3 +#define Z_DIR_PIN PA5 +#define Z_ENABLE_PIN PA6 +#ifndef Z_CS_PIN + #define Z_CS_PIN PA4 +#endif + +#define E0_STEP_PIN PA1 +#define E0_DIR_PIN PC3 +#define E0_ENABLE_PIN PA0 +#ifndef E0_CS_PIN + #define E0_CS_PIN PC2 +#endif + +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #endif +#endif + +#if HAS_TMC_UART + // + // Software serial + // + #define X_SERIAL_TX_PIN PB0 + #define X_SERIAL_RX_PIN PB0 + #define Y_SERIAL_TX_PIN PA7 + #define Y_SERIAL_RX_PIN PA7 + #define Z_SERIAL_TX_PIN PA4 + #define Z_SERIAL_RX_PIN PA4 + #define E0_SERIAL_TX_PIN PC2 + #define E0_SERIAL_RX_PIN PC2 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC6 +#define HEATER_BED_PIN PC7 +#ifndef FAN_PIN + #define FAN_PIN PC8 +#endif +#define FAN1_PIN PC9 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC0 // Analog Input +#define TEMP_0_PIN PC1 // Analog Input + +// +// LCD Pins +// + +// +// LCD / Controller +// +#define ENABLE_SPI2 +#define SS_PIN PB12 +#define SCK_PIN PB13 +#define MISO_PIN PB14 +#define MOSI_PIN PB15 + +#define SDSS SS_PIN +#define SD_DETECT_PIN PB11 + +#define BEEPER_PIN PC14 + +#define LCD_PINS_RS PB8 +#define LCD_PINS_ENABLE PB9 +#define LCD_PINS_D4 PB7 +#define LCD_PINS_D5 PB6 +#define LCD_PINS_D6 PB5 +#define LCD_PINS_D7 PB4 + +#define BTN_EN1 PD2 +#define BTN_EN2 PB3 +#define BTN_ENC PC13 + +// +// Filament runout +// + +// +// ST7920 Delays +// +#ifndef ST7920_DELAY_1 + #define ST7920_DELAY_1 DELAY_NS(96) +#endif +#ifndef ST7920_DELAY_2 + #define ST7920_DELAY_2 DELAY_NS(48) +#endif +#ifndef ST7920_DELAY_3 + #define ST7920_DELAY_3 DELAY_NS(715) +#endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h new file mode 100644 index 00000000..ebe5964d --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -0,0 +1,196 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "FYSETC AIO II" +#define BOARD_WEBSITE_URL "fysetc.com" + +#define DISABLE_JTAG + +#define pins_v2_20190128 // new pins define + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Flash 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 + +// +// Limit Switches +// +#define X_STOP_PIN PA1 +#define Y_STOP_PIN PA0 +#define Z_STOP_PIN PB14 + +// +// Filament runout +// +#ifdef pins_v2_20190128 + #define FIL_RUNOUT_PIN PB15 +#else + #define FIL_RUNOUT_PIN PB5 +#endif + +// +// Steppers +// +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB9 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PB2 +#ifdef pins_v2_20190128 + #define Y_DIR_PIN PB3 +#else + #define Y_DIR_PIN PB0 +#endif +#define Y_ENABLE_PIN PB1 + +#define Z_STEP_PIN PC0 +#define Z_DIR_PIN PC1 +#define Z_ENABLE_PIN PC2 + +#define E0_STEP_PIN PC15 +#define E0_DIR_PIN PC14 +#define E0_ENABLE_PIN PC13 + +#if HAS_TMC_UART + + /** + * TMC2208/TMC2209 stepper drivers + */ + + // + // Hardware serial with switch + // + #define X_HARDWARE_SERIAL MSerial1 + #define Y_HARDWARE_SERIAL MSerial1 + #define Z_HARDWARE_SERIAL MSerial1 + #define E0_HARDWARE_SERIAL MSerial1 + + // 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 + +// +// Stepper current PWM +// +#ifndef MOTOR_CURRENT_PWM_RANGE + #define MOTOR_CURRENT_PWM_RANGE 1500 // origin:2000 +#endif +#define DEFAULT_PWM_MOTOR_CURRENT { 500, 500, 400 } // origin: {1300,1300,1250} + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC7 +#define HEATER_BED_PIN PC6 +#ifndef FAN_PIN + #define FAN_PIN PC8 +#endif + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC5 // Analog Input +#define TEMP_0_PIN PC4 // Analog Input + +// +// Misc. Functions +// +#define SDSS PA4 + +// +// LCD Pins +// +#if HAS_WIRED_LCD + + #define BEEPER_PIN PC9 + + #if HAS_MARLINUI_U8GLIB + + #define DOGLCD_A0 PA15 + #ifdef pins_v2_20190128 + #define DOGLCD_CS PB5 + #else + #define DOGLCD_CS PB7 + #endif + + //#define LCD_CONTRAST_INIT 190 + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #endif + + // not connected to a pin + #define SD_DETECT_PIN PC3 + + #if ENABLED(NEWPANEL) + // The encoder and click button + #define BTN_EN1 PC10 + #define BTN_EN2 PC11 + #define BTN_ENC PC12 + #endif + + #ifdef pins_v2_20190128 + #define LCD_RESET_PIN PB4 + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB0 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB6 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB7 + #endif + #else + #define LCD_RESET_PIN PB6 + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB3 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB4 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB5 + #endif + #endif + +#endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h new file mode 100644 index 00000000..de5ea45d --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -0,0 +1,177 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define DEFAULT_MACHINE_NAME "3D Printer" + +#define BOARD_INFO_NAME "FYSETC Cheetah" +#define BOARD_WEBSITE_URL "fysetc.com" +// https://github.com/FYSETC/Cheetah + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#define DISABLE_JTAG + +#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 + +// +// Servos +// +#define SERVO0_PIN PA0 + +// +// Limit Switches +// +#define X_STOP_PIN PA1 +#define Y_STOP_PIN PB4 +#define Z_STOP_PIN PA15 + +// +// Filament runout +// +#define FIL_RUNOUT_PIN PB5 + +// +// Steppers +// +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB9 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PB2 +#define Y_DIR_PIN PB3 +#define Y_ENABLE_PIN PB1 + +#define Z_STEP_PIN PC0 +#define Z_DIR_PIN PC1 +#define Z_ENABLE_PIN PC2 + +#define E0_STEP_PIN PC15 +#define E0_DIR_PIN PC14 +#define E0_ENABLE_PIN PC13 + +#define X_HARDWARE_SERIAL MSerial2 +#define Y_HARDWARE_SERIAL MSerial2 +#define Z_HARDWARE_SERIAL MSerial2 +#define E0_HARDWARE_SERIAL MSerial2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC6 +#define HEATER_BED_PIN PC7 +#ifndef FAN_PIN + #define FAN_PIN PC8 +#endif + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PC5 // Analog Input +#define TEMP_0_PIN PC4 // Analog Input + +// +// Misc. Functions +// +#define SDSS PA4 +#define SD_DETECT_PIN PC3 + +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB0 +#endif +#ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB7 +#endif +#ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB6 +#endif + +/* +* EXP1 pinout for the LCD according to Fysetcs schematic for the Cheetah board +* _____ +* (Beeper) PC9 | 1 2 | PC12 (BTN_ENC) +* (BTN_EN2) PC11 | 3 4 | PB14 (LCD_RS / MISO) +* (BTN_EN1) PC10 5 6 | PB13 (SCK) +* (LCD_EN) PB12 | 7 8 | PB15 (MOSI) +* GND | 9 10| 5V +* ----- +* EXP1 +* Note: The pin-numbers match the connector correctly and are not in reverse order like on the Ender-3 board. +* Note: Functionally the pins are assigned in the same order as on the Ender-3 board. +* Note: Pin 4 on the Cheetah board is assigned to an I/O, it is assigned to RESET on the Ender-3 board. +*/ + +#if HAS_WIRED_LCD + #define BEEPER_PIN PC9 + + #if HAS_MARLINUI_U8GLIB + #define DOGLCD_A0 PB14 + #define DOGLCD_CS PB12 + #define DOGLCD_SCK PB13 + #define DOGLCD_MOSI PB15 + //#define LCD_SCREEN_ROT_90 + //#define LCD_SCREEN_ROT_180 + //#define LCD_SCREEN_ROT_270 + + #if EITHER(FYSETC_MINI_12864, U8GLIB_ST7920) + #define FORCE_SOFT_SPI + #endif + #endif + + #define LCD_PINS_RS PB12 // CS -- SOFT SPI for ENDER3 LCD + #define LCD_PINS_D4 PB13 // SCLK + #define LCD_PINS_ENABLE PB15 // DATA MOSI + + //#define LCD_CONTRAST_INIT 190 + + #if ENABLED(NEWPANEL) + #define BTN_EN1 PC10 + #define BTN_EN2 PC11 + #define BTN_ENC PC12 + #endif +#endif + +#if ENABLED(TOUCH_UI_FTDI_EVE) + #define BEEPER_PIN PC9 + #define CLCD_MOD_RESET PC11 + #define CLCD_SPI_CS PB12 + + //#define CLCD_USE_SOFT_SPI // the Cheetah can use hardware-SPI so we do not really need this + + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI PB15 + #define CLCD_SOFT_SPI_MISO PB14 + #define CLCD_SOFT_SPI_SCLK PB13 + #else + #define CLCD_SPI_BUS 2 + #endif +#endif diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h new file mode 100644 index 00000000..5e8bd11b --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.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 + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#include "pins_FYSETC_CHEETAH.h" + +#undef X_HARDWARE_SERIAL +#undef Y_HARDWARE_SERIAL +#undef Z_HARDWARE_SERIAL +#undef E0_HARDWARE_SERIAL + +#undef RGB_LED_R_PIN +#undef RGB_LED_G_PIN +#undef RGB_LED_B_PIN + +#define FAN1_PIN PB0 // Fan1 + +#if HAS_TMC_UART + + /** + * TMC2208/TMC2209 stepper drivers + */ + + // + // Software serial + // + #define X_SERIAL_TX_PIN PA11 + #define X_SERIAL_RX_PIN PA12 + + #define Y_SERIAL_TX_PIN PB6 + #define Y_SERIAL_RX_PIN PB7 + + #define Z_SERIAL_TX_PIN PB10 + #define Z_SERIAL_RX_PIN PB11 + + #define E0_SERIAL_TX_PIN PA2 + #define E0_SERIAL_RX_PIN PA3 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h new file mode 100644 index 00000000..ca25c45a --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -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 . + * + */ +#pragma once + +/** + * 24 May 2018 - @chepo for STM32F103VET6 + * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "GTM32 Pro VB" +#define DEFAULT_MACHINE_NAME "STM32F103VET6" + +//#define DISABLE_DEBUG + +// +// It is required to disable JTAG function because its pins are +// used as GPIO to drive the Y axis stepper. +// DO NOT ENABLE! +// +#define DISABLE_JTAG + +// +// If you don't need the SWDIO functionality (any more), you may +// disable SWD here to regain PA13/PA14 pins for other use. +// +//#define DISABLE_JTAGSWD + +// Ignore temp readings during development. +//#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 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE5 // ENDSTOPS 15,17 +#define X_MAX_PIN PE4 // ENDSTOPS 16,18 +#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 +#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 +#define Z_MIN_PIN PE1 // ENDSTOPS 3,5 +#define Z_MAX_PIN PE0 // ENDSTOPS 4,6 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PD13 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PA12 +#define Y_DIR_PIN PA11 +#define Y_ENABLE_PIN PA15 + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PB3 + +// Extruder stepper pins +// NOTE: Numbering here is made according to EXT connector numbers, +// the FANx_PWM line numbering in the schematics is reverse. +// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step +// stick that drives the EXT0 output on the board. +// +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 + +#define E1_STEP_PIN PA0 +#define E1_DIR_PIN PB6 +#define E1_ENABLE_PIN PA1 + +#define E2_STEP_PIN PB2 +#define E2_DIR_PIN PB11 +#define E2_ENABLE_PIN PC4 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 // EXT0 port +#define HEATER_1_PIN PB5 // EXT1 port +#define HEATER_2_PIN PB4 // EXT2 port +#define HEATER_BED_PIN PB1 // CON2X3 hotbed port + +// +// These are FAN PWM pins on EXT0..EXT2 connectors. +// +//#define FAN_PIN PB9 // EXT0 port +#define FAN1_PIN PB8 // EXT1 port +#define FAN2_PIN PB7 // EXT2 port + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC2 // EXT0 port +#define TEMP_1_PIN PC1 // EXT1 port +#define TEMP_2_PIN PC0 // EXT2 port +#define TEMP_BED_PIN PC3 // CON2X3 hotbed port + +// +// Misc. Functions +// +#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + // + // LCD display on J2 FFC40 + // Geeetech's LCD2004A Control Panel is very much like + // RepRapDiscount Smart Controller, but adds an FFC40 connector + // + #define LCD_PINS_RS PE6 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE PE14 // SID (MOSI) + #define LCD_PINS_D4 PD8 // SCK (CLK) clock + #define LCD_PINS_D5 PD9 + #define LCD_PINS_D6 PD10 + #define LCD_PINS_D7 PE15 + + #else + // + // Serial LCDs can be implemented in ExtUI + // + //#define LCD_UART_TX PD8 + //#define LCD_UART_RX PD9 + #endif + + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + // + // Geeetech's LCD2004A Control Panel is very much like + // RepRapDiscount Smart Controller, but adds an FFC40 connector + // connected with a flat wire to J2 connector on the board. + // + #define BTN_EN1 PE8 + #define BTN_EN2 PE9 + #define BTN_ENC PE13 + + #define GTM32_PRO_VB_USE_LCD_BEEPER + #define GTM32_PRO_VB_USE_EXT_SDCARD +#endif + +// +// Beeper +// +#ifdef GTM32_PRO_VB_USE_LCD_BEEPER + // This is pin 32 on J2 FFC40 and pin, goes to the beeper + // on Geeetech's version of RepRapDiscount Smart Controller + // (e.g. on Rostock 301) + #define BEEPER_PIN PE12 +#else + // This is the beeper on the board itself + #define BEEPER_PIN PB10 +#endif + +/** + * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. + * + * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) + * connector, which usually go to the SD Card slot on the Geeetech version of the + * RepRapDiscount Smart Controller. Both connectors have the card detect signal. + * + * The on-board SD card and the external card (on either SD_CARD or J2) are two + * separate devices and can work simultaneously. Unfortunately, Marlin only supports + * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. + */ +#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) + // + // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector + // + #define SS_PIN PC11 + #define SCK_PIN PC12 + #define MOSI_PIN PD2 + #define MISO_PIN PC8 + #define SD_DETECT_PIN PC7 +#else + // + // Use the on-board card socket labeled TF_CARD_SOCKET + // + #define SS_PIN PA4 + #define SCK_PIN PA5 + #define MOSI_PIN PA7 + #define MISO_PIN PA6 + #define SD_DETECT_PIN -1 // Card detect is not connected +#endif + +#define SDSS SS_PIN + +// +// 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_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 new file mode 100644 index 00000000..02fd3bca --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -0,0 +1,235 @@ +/** + * 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 + +/** + * 24 May 2018 - @chepo for STM32F103VET6 + * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "GTM32 Pro VB" +#define DEFAULT_MACHINE_NAME "STM32F103VET6" + +//#define DISABLE_DEBUG + +// +// It is required to disable JTAG function because its pins are +// used as GPIO to drive the Y axis stepper. +// DO NOT ENABLE! +// +#define DISABLE_JTAG + +// +// If you don't need the SWDIO functionality (any more), you may +// disable SWD here to regain PA13/PA14 pins for other use. +// +//#define DISABLE_JTAGSWD + +// Ignore temp readings during development. +//#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 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE5 // ENDSTOPS 15,17 +#define X_MAX_PIN PE4 // ENDSTOPS 16,18 +#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 +#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 +#define Z_MIN_PIN PE0 // ENDSTOPS 3,5 +#define Z_MAX_PIN PE1 // ENDSTOPS 4,6 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PD13 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PA12 +#define Y_DIR_PIN PA11 +#define Y_ENABLE_PIN PA15 + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PB3 + +// Extruder stepper pins +// NOTE: Numbering here is made according to EXT connector numbers, +// the FANx_PWM line numbering in the schematics is reverse. +// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step +// stick that drives the EXT0 output on the board. +// +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 + +#define E1_STEP_PIN PA0 +#define E1_DIR_PIN PB6 +#define E1_ENABLE_PIN PA1 + +#define E2_STEP_PIN PB2 +#define E2_DIR_PIN PB11 +#define E2_ENABLE_PIN PC4 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 // EXT0 port +#define HEATER_1_PIN PB5 // EXT1 port +#define HEATER_2_PIN PB4 // EXT2 port +#define HEATER_BED_PIN PB1 // CON2X3 hotbed port + +// +// These are FAN PWM pins on EXT0..EXT2 connectors. +// +//#define FAN_PIN PB9 // EXT0 port +#define FAN1_PIN PB8 // EXT1 port +#define FAN2_PIN PB7 // EXT2 port + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC2 // EXT0 port +#define TEMP_1_PIN PC1 // EXT1 port +#define TEMP_2_PIN PC0 // EXT2 port +#define TEMP_BED_PIN PC3 // CON2X3 hotbed port + +// +// Misc. Functions +// +#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + // + // LCD display on J2 FFC40 + // Geeetech's LCD2004A Control Panel is very much like + // RepRapDiscount Smart Controller, but adds an FFC40 connector + // connected with a flat wire to J2 connector on the board. + // + #define LCD_PINS_RS PE6 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE PE14 // SID (MOSI) + #define LCD_PINS_D4 PD8 // SCK (CLK) clock + #define LCD_PINS_D5 PD9 + #define LCD_PINS_D6 PD10 + #define LCD_PINS_D7 PE15 + + #define BTN_EN1 PE8 + #define BTN_EN2 PE9 + #define BTN_ENC PE13 + + #define GTM32_PRO_VB_USE_LCD_BEEPER + #define GTM32_PRO_VB_USE_EXT_SDCARD + + #else + // + // Serial LCDs can be implemented in ExtUI + // + //#define LCD_UART_TX PD8 + //#define LCD_UART_RX PD9 + #endif + + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +// +// Beeper +// +#ifdef GTM32_PRO_VB_USE_LCD_BEEPER + // This is pin 32 on J2 FFC40 and pin, goes to the beeper + // on Geeetech's version of RepRapDiscount Smart Controller + // (e.g. on Rostock 301) + #define BEEPER_PIN PE12 +#else + // This is the beeper on the board itself + #define BEEPER_PIN PB10 +#endif + +/** + * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. + * + * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) + * connector, which usually go to the SD Card slot on the Geeetech version of the + * RepRapDiscount Smart Controller. Both connectors have the card detect signal. + * + * The on-board SD card and the external card (on either SD_CARD or J2) are two + * separate devices and can work simultaneously. Unfortunately, Marlin only supports + * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. + */ +#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) + // + // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector + // + #define SS_PIN PC11 + #define SCK_PIN PC12 + #define MOSI_PIN PD2 + #define MISO_PIN PC8 + #define SD_DETECT_PIN PC7 +#else + // + // Use the on-board card socket labeled TF_CARD_SOCKET + // + #define SS_PIN PA4 + #define SCK_PIN PA5 + #define MOSI_PIN PA7 + #define MISO_PIN PA6 + #define SD_DETECT_PIN -1 // Card detect is not connected +#endif + +#define SDSS SS_PIN + +// +// 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_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 new file mode 100644 index 00000000..ca25c45a --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -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 . + * + */ +#pragma once + +/** + * 24 May 2018 - @chepo for STM32F103VET6 + * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "GTM32 Pro VB" +#define DEFAULT_MACHINE_NAME "STM32F103VET6" + +//#define DISABLE_DEBUG + +// +// It is required to disable JTAG function because its pins are +// used as GPIO to drive the Y axis stepper. +// DO NOT ENABLE! +// +#define DISABLE_JTAG + +// +// If you don't need the SWDIO functionality (any more), you may +// disable SWD here to regain PA13/PA14 pins for other use. +// +//#define DISABLE_JTAGSWD + +// Ignore temp readings during development. +//#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 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE5 // ENDSTOPS 15,17 +#define X_MAX_PIN PE4 // ENDSTOPS 16,18 +#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 +#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 +#define Z_MIN_PIN PE1 // ENDSTOPS 3,5 +#define Z_MAX_PIN PE0 // ENDSTOPS 4,6 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PD13 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PA12 +#define Y_DIR_PIN PA11 +#define Y_ENABLE_PIN PA15 + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PB3 + +// Extruder stepper pins +// NOTE: Numbering here is made according to EXT connector numbers, +// the FANx_PWM line numbering in the schematics is reverse. +// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step +// stick that drives the EXT0 output on the board. +// +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 + +#define E1_STEP_PIN PA0 +#define E1_DIR_PIN PB6 +#define E1_ENABLE_PIN PA1 + +#define E2_STEP_PIN PB2 +#define E2_DIR_PIN PB11 +#define E2_ENABLE_PIN PC4 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 // EXT0 port +#define HEATER_1_PIN PB5 // EXT1 port +#define HEATER_2_PIN PB4 // EXT2 port +#define HEATER_BED_PIN PB1 // CON2X3 hotbed port + +// +// These are FAN PWM pins on EXT0..EXT2 connectors. +// +//#define FAN_PIN PB9 // EXT0 port +#define FAN1_PIN PB8 // EXT1 port +#define FAN2_PIN PB7 // EXT2 port + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC2 // EXT0 port +#define TEMP_1_PIN PC1 // EXT1 port +#define TEMP_2_PIN PC0 // EXT2 port +#define TEMP_BED_PIN PC3 // CON2X3 hotbed port + +// +// Misc. Functions +// +#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + // + // LCD display on J2 FFC40 + // Geeetech's LCD2004A Control Panel is very much like + // RepRapDiscount Smart Controller, but adds an FFC40 connector + // + #define LCD_PINS_RS PE6 // CS chip select /SS chip slave select + #define LCD_PINS_ENABLE PE14 // SID (MOSI) + #define LCD_PINS_D4 PD8 // SCK (CLK) clock + #define LCD_PINS_D5 PD9 + #define LCD_PINS_D6 PD10 + #define LCD_PINS_D7 PE15 + + #else + // + // Serial LCDs can be implemented in ExtUI + // + //#define LCD_UART_TX PD8 + //#define LCD_UART_RX PD9 + #endif + + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +#if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + // + // Geeetech's LCD2004A Control Panel is very much like + // RepRapDiscount Smart Controller, but adds an FFC40 connector + // connected with a flat wire to J2 connector on the board. + // + #define BTN_EN1 PE8 + #define BTN_EN2 PE9 + #define BTN_ENC PE13 + + #define GTM32_PRO_VB_USE_LCD_BEEPER + #define GTM32_PRO_VB_USE_EXT_SDCARD +#endif + +// +// Beeper +// +#ifdef GTM32_PRO_VB_USE_LCD_BEEPER + // This is pin 32 on J2 FFC40 and pin, goes to the beeper + // on Geeetech's version of RepRapDiscount Smart Controller + // (e.g. on Rostock 301) + #define BEEPER_PIN PE12 +#else + // This is the beeper on the board itself + #define BEEPER_PIN PB10 +#endif + +/** + * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. + * + * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) + * connector, which usually go to the SD Card slot on the Geeetech version of the + * RepRapDiscount Smart Controller. Both connectors have the card detect signal. + * + * The on-board SD card and the external card (on either SD_CARD or J2) are two + * separate devices and can work simultaneously. Unfortunately, Marlin only supports + * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. + */ +#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) + // + // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector + // + #define SS_PIN PC11 + #define SCK_PIN PC12 + #define MOSI_PIN PD2 + #define MISO_PIN PC8 + #define SD_DETECT_PIN PC7 +#else + // + // Use the on-board card socket labeled TF_CARD_SOCKET + // + #define SS_PIN PA4 + #define SCK_PIN PA5 + #define MOSI_PIN PA7 + #define MISO_PIN PA6 + #define SD_DETECT_PIN -1 // Card detect is not connected +#endif + +#define SDSS SS_PIN + +// +// 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_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 new file mode 100644 index 00000000..fc18263f --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -0,0 +1,238 @@ +/** + * 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 + +/** + * 24 May 2018 - @chepo for STM32F103VET6 + * Schematic: https://github.com/chepo92/Smartto/blob/master/circuit_diagram/Rostock301/Hardware_GTM32_PRO_VB.pdf + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "GTM32 Pro VB" +#define DEFAULT_MACHINE_NAME "M201" + +//#define DISABLE_DEBUG + +// +// It is required to disable JTAG function because its pins are +// used as GPIO to drive the Y axis stepper. +// DO NOT ENABLE! +// +#define DISABLE_JTAG + +// +// If you don't need the SWDIO functionality (any more), you may +// disable SWD here to regain PA13/PA14 pins for other use. +// +//#define DISABLE_JTAGSWD + +// Ignore temp readings during development. +//#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 +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PE5 // ENDSTOPS 15,17 +#define X_MAX_PIN PE4 // ENDSTOPS 16,18 +#define Y_MIN_PIN PE3 // ENDSTOPS 9,11 +#define Y_MAX_PIN PE2 // ENDSTOPS 10,12 +#define Z_MIN_PIN PE1 // ENDSTOPS 3,5 +#define Z_MAX_PIN PE0 // ENDSTOPS 4,6 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PD13 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PA12 +#define Y_DIR_PIN PA11 +#define Y_ENABLE_PIN PA15 + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PB3 + +// Extruder stepper pins +// NOTE: Numbering here is made according to EXT connector numbers, +// the FANx_PWM line numbering in the schematics is reverse. +// That is, E0_*_PIN are the E2_* lines connected to E2_A1 step +// stick that drives the EXT0 output on the board. +// +#define E0_STEP_PIN PC14 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PC15 + +#define E1_STEP_PIN PA0 +#define E1_DIR_PIN PB6 +#define E1_ENABLE_PIN PA1 + +#define E2_STEP_PIN PB2 +#define E2_DIR_PIN PB11 +#define E2_ENABLE_PIN PC4 + +// +// Heaters / Fans - INFO: Extruders ports are in reverse order. Pin numbers here differ from schematic. Original firmware assumes heater, fan and temp sensor on port EXT0 PB0, PB9, PC2. +// +#define HEATER_0_PIN PB0 // EXT0 port. +#define HEATER_1_PIN PB5 // EXT1 port +#define HEATER_2_PIN PB4 // EXT2 port +#define HEATER_BED_PIN PB1 // CON2X3 hotbed port + +// +// These are FAN PWM pins on EXT0..EXT2 connectors. +// +//#define FAN_PIN PB9 // EXT0 port +#define FAN1_PIN PB8 // EXT1 port +#define FAN2_PIN PB7 // EXT2 port + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PB9 // EXT0 port, used as main extruder fan +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC2 // EXT0 port +#define TEMP_1_PIN PC1 // EXT1 port +#define TEMP_2_PIN PC0 // EXT2 port +#define TEMP_BED_PIN PC3 // CON2X3 hotbed port + +// +// Misc. Functions +// +#define LED_PWM PD12 // External LED, pin 2 on LED labeled connector + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + // + // LCD display on J2 FFC40 + // Geeetech's LCD2004A Control Panel is very much like + // RepRapDiscount Smart Controller, but adds an FFC40 connector + // connected with a flat wire to J2 connector on the board. + // + #define LCD_PINS_RS PA12 // CS chip select /SS chip slave select + // RW is hardwired to VSS + #define LCD_PINS_ENABLE PC7 // SID (MOSI) + #define LCD_PINS_D4 PD1 // SCK (CLK) clock + #define LCD_PINS_D5 PD4 + #define LCD_PINS_D6 PD5 + #define LCD_PINS_D7 PD7 + + #define BTN_EN1 PE8 + #define BTN_EN2 PE9 + #define BTN_ENC PE13 + + //#define GTM32_PRO_VB_USE_LCD_BEEPER + #define GTM32_PRO_VB_USE_EXT_SDCARD + + #else + // + // Serial LCDs can be implemented in ExtUI + // + //#define LCD_UART_TX PD8 + //#define LCD_UART_RX PD9 + #endif + + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +// +// Beeper +// +#ifdef GTM32_PRO_VB_USE_LCD_BEEPER + // This is pin 32 on J2 FFC40 and pin, goes to the beeper + // on Geeetech's version of RepRapDiscount Smart Controller + // (e.g. on Rostock 301) + #define BEEPER_PIN PE12 +#else + // This is the beeper on the board itself + #define BEEPER_PIN PB10 +#endif + +/** + * The on-board TF_CARD_SOCKET microSD card socket has no SD Detect pin wired. + * + * The FFC10 (SD_CARD) connector has the same pins as those routed to the FFC40 (J2) + * connector, which usually go to the SD Card slot on the Geeetech version of the + * RepRapDiscount Smart Controller. Both connectors have the card detect signal. + * + * The on-board SD card and the external card (on either SD_CARD or J2) are two + * separate devices and can work simultaneously. Unfortunately, Marlin only supports + * a single SPI Flash device (as of 2019-07-05) so only one is enabled here. + */ +#if ENABLED(GTM32_PRO_VB_USE_EXT_SDCARD) + // + // SD Card on RepRapDiscount Smart Controller (J2) or on SD_CARD connector + // + #define SS_PIN PB12 // PC11 + #define SCK_PIN PB13 // PC12 // PC1 + #define MOSI_PIN PB15 // PD2 // PD2 + #define MISO_PIN PB14 // PC8 + #define SD_DETECT_PIN PC7 + +#else + // + // Use the on-board card socket labeled TF_CARD_SOCKET + // + #define SS_PIN PA4 + #define SCK_PIN PA5 + #define MOSI_PIN PA7 + #define MISO_PIN PA6 // PA6 + #define SD_DETECT_PIN -1 // Card detect is not connected +#endif + +#define SDSS SS_PIN + +// +// 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_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 new file mode 100644 index 00000000..3c277233 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -0,0 +1,132 @@ +/** + * 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 + + /** + * ╦╔═╗╔═╗┬ ┬┬─┐┌─┐┬─┐┌─┐╔═╗┌─┐┬─┐┬ ┬┌┬┐ ┌─┐┌─┐┌┬┐ + * ║║ ╦╠═╣│ │├┬┘│ │├┬┘├─┤╠╣ │ │├┬┘│ ││││ │ │ ││││ + * ╚╝╚═╝╩ ╩└─┘┴└─└─┘┴└─┴ ┴╚ └─┘┴└─└─┘┴ ┴o└─┘└─┘┴ ┴ + * Pin assignments for 32-bit JGAurora A5S & A1 + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "JGAurora 32-bit board only supports 1 hotend / E-stepper. Comment out this line to continue." +#endif +#define BOARD_INFO_NAME "JGAurora A5S A1 board" + +#ifndef STM32_XL_DENSITY + #define STM32_XL_DENSITY +#endif + +//#define MCU_STM32F103ZE // not yet required +// 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 FLASH_EEPROM_EMULATION +//#define MARLIN_EEPROM_SIZE 0x1000UL // 4KB +//#define MARLIN_EEPROM_SIZE (EEPROM_START_ADDRESS + (EEPROM_PAGE_SIZE) * 2UL) + +//#define EEPROM_CHITCHAT +//#define DEBUG_EEPROM_READWRITE + +// +// Limit Switches +// +#define X_STOP_PIN PC6 +#define Y_STOP_PIN PG8 +#define Z_STOP_PIN PG7 +//#define X_MAX_PIN PC5 +//#define Y_MAX_PIN PC4 +//#define Z_MAX_PIN PB0 + +// +// Steppers +// +#define X_STEP_PIN PD6 +#define X_DIR_PIN PD3 +#define X_ENABLE_PIN PG9 + +#define Y_STEP_PIN PG12 +#define Y_DIR_PIN PG11 +#define Y_ENABLE_PIN PG13 + +#define Z_STEP_PIN PG15 +#define Z_DIR_PIN PG14 +#define Z_ENABLE_PIN PB8 + +#define E0_STEP_PIN PE2 +#define E0_DIR_PIN PB9 +#define E0_ENABLE_PIN PE3 + +#define E1_STEP_PIN PE5 +#define E1_DIR_PIN PE4 +#define E1_ENABLE_PIN PE6 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC2 +#define TEMP_BED_PIN PC1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA2 +#define HEATER_BED_PIN PA3 + +#define FAN_PIN PA1 + +#define FIL_RUNOUT_PIN PC7 + +// +// LCD +// +#define LCD_BACKLIGHT_PIN PF11 +#define FSMC_CS_PIN PD7 +#define FSMC_RS_PIN PG0 + +#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 + +// +// SD Card +// +#define SD_DETECT_PIN PF10 + +// +// Misc. +// +#define BEEPER_PIN PC3 // use PB7 to shut up if desired +#define LED_PIN PC13 + +// +// Touch support +// +#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 new file mode 100644 index 00000000..af81bbeb --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -0,0 +1,177 @@ +/** + * 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 + +/** + * Longer3D LK1/LK2 & Alfawise U20/U30 (STM32F103VET6) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__, STM32F1xx) + #error "Oops! Select a STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "Longer3D board only supports 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "Longer3D" +#define ALFAWISE_UX0 // Common to all Longer3D STM32F1 boards (used for Open drain mosfets) + +//#define DISABLE_DEBUG // We still want to debug with STLINK... +#define DISABLE_JTAG // We free the jtag pins (PA15) but keep STLINK + // Release PB4 (STEP_X_PIN) from JTAG NRST role. +// +// Limit Switches +// +#define X_MIN_PIN PC1 // pin 16 +#define X_MAX_PIN PC0 // pin 15 (Filament sensor on Alfawise setup) +#define Y_MIN_PIN PC15 // pin 9 +#define Y_MAX_PIN PC14 // pin 8 (Unused in stock Alfawise setup) +#define Z_MIN_PIN PE6 // pin 5 Standard Endstop or Z_Probe endstop function +#define Z_MAX_PIN PE5 // pin 4 (Unused in stock Alfawise setup) + // May be used for BLTouch Servo function on older variants (<= V08) +#define ONBOARD_ENDSTOPPULLUPS + +// +// Filament Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PC0 // XMAX plug on PCB used as filament runout sensor on Alfawise boards (inverting true) +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PB5 // pin 91 +#define X_STEP_PIN PB4 // pin 90 +#define X_DIR_PIN PB3 // pin 89 + +#define Y_ENABLE_PIN PB8 // pin 95 +#define Y_STEP_PIN PB7 // pin 93 +#define Y_DIR_PIN PB6 // pin 92 + +#define Z_ENABLE_PIN PE1 // pin 98 +#define Z_STEP_PIN PE0 // pin 97 +#define Z_DIR_PIN PB9 // pin 96 + +#define E0_ENABLE_PIN PE4 // pin 3 +#define E0_STEP_PIN PE3 // pin 2 +#define E0_DIR_PIN PE2 // pin 1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // pin 23 (Nozzle 100K/3950 thermistor) +#define TEMP_BED_PIN PA1 // pin 24 (Hot Bed 100K/3950 thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD3 // pin 84 (Nozzle Heat Mosfet) +#define HEATER_BED_PIN PA8 // pin 67 (Hot Bed Mosfet) + +#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 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 + +#define LED_PIN PC2 // pin 17 + +// +// PWM for a servo probe +// Other servo devices are not supported on this board! +// +#if HAS_Z_SERVO_PROBE + #define SERVO0_PIN PD13 // Open drain PWM pin on the V0G (GND or floating 5V) + #define SERVO0_PWM_OD // Comment this if using PE5 + + //#define SERVO0_PIN PE5 // Pulled up PWM pin on the V08 (3.3V or 0) + //#undef Z_MAX_PIN // Uncomment if using ZMAX connector (PE5) +#endif + +/** + * Note: Alfawise screens use various TFT controllers. Supported screens + * are based on the ILI9341, ILI9328 and ST7798V. 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 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 FSMC_DMA_DEV DMA2 +#define FSMC_DMA_CHANNEL DMA_CH5 + +#define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h +#define DOGLCD_SCK -1 + +// Longer/Alfawise TFT +#define LONGER_LK_TFT28 + +// Buffer for Color UI +#define TFT_BUFFER_SIZE 3200 + +/** + * 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 + * declared below. + */ +#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 + #define TOUCH_MISO_PIN PB15 // pin 54 + #define TOUCH_INT_PIN PC6 // pin 63 (PenIRQ coming from ADS7843) +#endif + +// +// Persistent Storage +// If no option is selected below the SD Card will be used +// +#if NO_EEPROM_SELECTED + //#define SPI_EEPROM + #define FLASH_EEPROM_EMULATION +#endif + +#if ENABLED(SPI_EEPROM) + // SPI1 EEPROM Winbond W25Q64 (8MB/64Mbits) + #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 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_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 +#endif diff --git a/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h new file mode 100644 index 00000000..95e7e921 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MALYAN_M200.h @@ -0,0 +1,95 @@ +/** + * 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 + +/** + * MALYAN M200 pin assignments + */ + +#if NOT_TARGET(__STM32F1__, STM32F1xx, STM32F0xx) + #error "Oops! Select an STM32 board in your IDE." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Malyan M200" +#endif + +// Prevents hanging from an extra watchdog init +#define DISABLE_WATCHDOG_INIT + +// Assume Flash EEPROM +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION +#endif + +#define SDSS SS_PIN + +// Based on PWM timer usage, we have to use these timers and soft PWM for the fans +// 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 + +// +// Limit Switches +// +#define X_MIN_PIN PB4 +#define Y_MIN_PIN PA15 +#define Z_MIN_PIN PB5 + +// +// Steppers +// +// X & Y enable are the same +#define X_STEP_PIN PB14 +#define X_DIR_PIN PB15 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PB12 +#define Y_DIR_PIN PB13 +#define Y_ENABLE_PIN PA8 + +#define Z_STEP_PIN PB10 +#define Z_DIR_PIN PB2 +#define Z_ENABLE_PIN PB11 + +#define E0_STEP_PIN PB0 +#define E0_DIR_PIN PC13 +#define E0_ENABLE_PIN PB1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input (HOTEND0 thermistor) +#define TEMP_BED_PIN PA1 // Analog Input (BED thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB6 // HOTEND0 MOSFET +#define HEATER_BED_PIN PB7 // BED MOSFET + +#define MALYAN_FAN1_PIN PB8 // FAN1 header on board - PRINT FAN +#define MALYAN_FAN2_PIN PB3 // FAN2 header on board - CONTROLLER FAN + +#define FAN1_PIN MALYAN_FAN2_PIN diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h new file mode 100644 index 00000000..8831d680 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -0,0 +1,213 @@ +/** + * 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 (STM32F130ZET6) board pin assignments + * + * https://github.com/makerbase-mks/MKS-Robin/tree/master/MKS%20Robin/Hardware + */ + +#if NOT_TARGET(STM32F1, 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." +#endif + +#define BOARD_INFO_NAME "MKS Robin" + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// +#define DISABLE_JTAG + +// +// Enable SD EEPROM to prevent infinite boot loop +// +#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 +// +#define SERVO0_PIN PC3 // XS1 - 5 +#define SERVO1_PIN PA1 // XS1 - 6 +#define SERVO2_PIN PF9 // XS2 - 5 +#define SERVO3_PIN PF8 // XS2 - 6 + +// +// Limit Switches +// +#define X_MIN_PIN PB12 +#define X_MAX_PIN PB0 +#define Y_MIN_PIN PC5 +#define Y_MAX_PIN PC4 +#define Z_MIN_PIN PA4 +#define Z_MAX_PIN PF7 + +// +// Steppers +// +#define X_ENABLE_PIN PB9 +#define X_STEP_PIN PB8 +#define X_DIR_PIN PB5 + +#define Y_ENABLE_PIN PB4 +#define Y_STEP_PIN PG15 +#define Y_DIR_PIN PG10 + +#define Z_ENABLE_PIN PD7 +#define Z_STEP_PIN PD3 +#define Z_DIR_PIN PG14 + +#define E0_ENABLE_PIN PG13 +#define E0_STEP_PIN PG8 +#define E0_DIR_PIN PA15 + +#define E1_ENABLE_PIN PA12 +#define E1_STEP_PIN PA11 +#define E1_DIR_PIN PA8 + +// +// 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 PC7 // HEATER1 +#define HEATER_1_PIN PA6 // HEATER2 +#define HEATER_BED_PIN PC6 // HOT BED + +#define FAN_PIN PA7 // FAN + +/** + * Note: MKS Robin board is using SPI2 interface. Make sure your stm32duino library is configured accordingly + */ +//#define MAX6675_SS_PIN PE5 // TC1 - CS1 +//#define MAX6675_SS_PIN PE6 // TC2 - CS2 + +#define POWER_LOSS_PIN PA2 // PW_DET +#define PS_ON_PIN PA3 // PW_OFF +#define FIL_RUNOUT_PIN PF11 // MT_DET + +#ifdef ARDUINO_ARCH_STM32F1 + #define BEEPER_PIN PC13 +#else + #define BEEPER_PIN -1 +#endif +#define LED_PIN PB2 + +#if HAS_FSMC_TFT + /** + * 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 TFT_CS_PIN FSMC_CS_PIN + #define TFT_RS_PIN FSMC_RS_PIN + + #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 +#elif 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 +#endif + +#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 +#define ENABLE_SPI2 + +#if ENABLED(SDIO_SUPPORT) + #define SCK_PIN PB13 // SPI2 + #define MISO_PIN PB14 // SPI2 + #define MOSI_PIN PB15 // SPI2 + #define SD_DETECT_PIN PF12 // SD_CD +#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 + +#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 MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + //#define E1_HARDWARE_SERIAL MSerial1 + + // Unused servo pins may be repurposed with SoftwareSerialM + //#define X_SERIAL_TX_PIN PF8 // SERVO3_PIN -- XS2 - 6 + //#define Y_SERIAL_TX_PIN PF9 // SERVO2_PIN -- XS2 - 5 + //#define Z_SERIAL_TX_PIN PA1 // SERVO1_PIN -- XS1 - 6 + //#define E0_SERIAL_TX_PIN PC3 // SERVO0_PIN -- XS1 - 5 + //#define X_SERIAL_RX_PIN X_SERIAL_TX_PIN + //#define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN + //#define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN + //#define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN + + // Reduce baud rate for software serial reliability + #if HAS_TMC_SW_SERIAL + #define TMC_BAUD_RATE 19200 + #endif +#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h new file mode 100644 index 00000000..2028cd9d --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h @@ -0,0 +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 . + * + */ +#pragma once + +/** + * MKS Robin E3 (STM32F103RCT6) board pin assignments + */ + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin E3 supports up to 1 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS Robin E3" +#endif + +#include "pins_MKS_ROBIN_E3_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h new file mode 100644 index 00000000..d1f6dece --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.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 + +/** + * MKS Robin E3D (STM32F103RCT6) board pin assignments + */ + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin E3D supports up to 1 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS Robin E3D" +#endif + +// +// Steppers +// +#ifndef X_CS_PIN + #define X_CS_PIN PC7 +#endif +#ifndef Y_CS_PIN + #define Y_CS_PIN PD2 +#endif +#ifndef Z_CS_PIN + #define Z_CS_PIN PC12 +#endif +#ifndef E0_CS_PIN + #define E0_CS_PIN PC11 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #endif +#endif + +#include "pins_MKS_ROBIN_E3_common.h" diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h new file mode 100644 index 00000000..94a28953 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -0,0 +1,376 @@ +/** + * 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 + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin e3p supports up to 1 hotends / E-steppers. Comment out this line to continue." +#elif HAS_FSMC_TFT + #error "MKS Robin e3p doesn't support FSMC-based TFT displays." +#endif + +#define BOARD_INFO_NAME "MKS Robin e3p" + +// +// 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 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 + +// +// 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 + + // 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_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC3 // HEATER1 +#define HEATER_BED_PIN PA0 // HOT BED + +#define FAN_PIN PB1 // FAN + +// +// Misc. Functions +// +#if HAS_TFT_LVGL_UI + //#define MKSPWC + #ifdef MKSPWC + #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN + #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE + #define KILL_PIN PA2 // Enable MKSPWC DET PIN + #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE + #endif + + #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN + #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE + + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN + + #if ENABLED(MKS_TEST) + #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET + #define MKS_TEST_PS_ON_PIN PB0 // PW_OFF + #endif +#else + //#define POWER_LOSS_PIN PA2 // PW_DET + //#define PS_ON_PIN PB2 // PW_OFF + #define FIL_RUNOUT_PIN PA4 +#endif + +#define SERVO0_PIN PA8 // Enable BLTOUCH + +//#define LED_PIN PB2 + +// +// 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 +// +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif + +/** + * 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 HAS_SPI_TFT + + // Shared SPI TFT + + #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 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 TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #ifndef TFT_WIDTH + #define TFT_WIDTH 480 + #endif + #ifndef TFT_HEIGHT + #define TFT_HEIGHT 320 + #endif + + #define LCD_READ_ID 0xD3 + #define LCD_USE_DMA_SPI + +#endif + +#if ENABLED(SPI_GRAPHICAL_TFT) + // Emulated DOGM SPI + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_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(TFT_480x320_SPI) + #define TFT_DRIVER ST7796 + #define TFT_BUFFER_SIZE 14400 +#endif + +// XPT2046 Touch Screen calibration +#if EITHER(HAS_TFT_LVGL_UI, TFT_480x320_SPI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17253 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11579 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 514 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -24 + #endif +#elif ENABLED(SPI_GRAPHICAL_TFT) + #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 +#endif + +#if HAS_WIRED_LCD && !HAS_SPI_TFT + + // NON TFT Displays + + #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 + + #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_WIRED_LCD && !HAS_SPI_TFT + +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #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 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h new file mode 100644 index 00000000..015e29bd --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -0,0 +1,185 @@ +/** + * 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 E3 & E3D (STM32F103RCT6) common board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_WEBSITE_URL "github.com/makerbase-mks" + +//#define DISABLE_DEBUG +#define DISABLE_JTAG + +// +// EEPROM +// +#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 + +// +// Servos +// +#define SERVO0_PIN PA3 + +// +// Limit Switches +// +#define X_STOP_PIN PA12 +#define Y_STOP_PIN PA11 +#define Z_MIN_PIN PC6 +#define Z_MAX_PIN PB1 + +// +// Steppers +// +#define X_STEP_PIN PC0 +#define X_DIR_PIN PB2 +#define X_ENABLE_PIN PC13 + +#define Y_STEP_PIN PC2 +#define Y_DIR_PIN PB9 +#define Y_ENABLE_PIN PB12 + +#define Z_STEP_PIN PB7 +#define Z_DIR_PIN PB6 +#define Z_ENABLE_PIN PB8 + +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB3 +#define E0_ENABLE_PIN PB5 + +#if HAS_TMC220x + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN PC7 + #define X_SERIAL_RX_PIN PC7 + + #define Y_SERIAL_TX_PIN PD2 + #define Y_SERIAL_RX_PIN PD2 + + #define Z_SERIAL_TX_PIN PC12 + #define Z_SERIAL_RX_PIN PC12 + + #define E0_SERIAL_TX_PIN PC11 + #define E0_SERIAL_RX_PIN PC11 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Heaters 0,1 / Fans / Bed +// +#define HEATER_0_PIN PC9 +#define FAN_PIN PA8 +#define HEATER_BED_PIN PC8 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA1 // TB +#define TEMP_0_PIN PA0 // TH1 + +#define FIL_RUNOUT_PIN PB10 // MT_DET + +/** + * _____ _____ _____ + * (BEEPER) PC1 | 1 2 | PC3 (BTN_ENC) (MISO) PB14 | 1 2 | PB13 (SD_SCK) 5V | 1 2 | GND + * (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS) (BTN_EN1) PB11 | 3 4 | PA15 (SD_SS) (LCD_EN) PA4 | 3 4 | PA5 (LCD_RS) + * (LCD_D4) PA6 | 5 6 PA7 (LCD_D5) (BTN_EN2) PB0 | 5 6 PB15 (SD_MOSI) (LCD_D4) PA6 | 5 6 PB0 (BTN_EN2) + * (LCD_D6) PC4 | 7 8 | PC5 (LCD_D7) (SD_DETECT) PC10 | 7 8 | RESET RESET | 7 8 | PB11 (BTN_EN1) + * GND | 9 10| 5V GND | 9 10| NC (BTN_ENC) PC3 | 9 10| PC1 (BEEPER) + * ----- ----- ----- + * EXP1 EXP2 EXP3 + */ +#if HAS_WIRED_LCD + + #define BEEPER_PIN PC1 + #define BTN_ENC PC3 + #define LCD_PINS_ENABLE PA4 + #define LCD_PINS_RS PA5 + #define BTN_EN1 PB11 + #define BTN_EN2 PB0 + + // 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 PC4 + #define DOGLCD_CS PA7 + #define DOGLCD_SCK PB13 + #define DOGLCD_MOSI PB15 + + #else + + #define LCD_PINS_D4 PA6 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PA7 + #define LCD_PINS_D6 PC4 + #define LCD_PINS_D7 PC5 + #endif + + #endif // !MKS_MINI_12864 + +#endif // HAS_WIRED_LCD + +// +// SD Card +// +#define ENABLE_SPI2 +#define SD_DETECT_PIN PC10 +#define SCK_PIN PB13 +#define MISO_PIN PB14 +#define MOSI_PIN PB15 +#define SS_PIN PA15 + +#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 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h new file mode 100644 index 00000000..aa1ccedb --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -0,0 +1,143 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin Lite supports only 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS Robin Lite" +#endif +#define BOARD_WEBSITE_URL "github.com/makerbase-mks" + +//#define DISABLE_DEBUG +#define DISABLE_JTAG +#define ENABLE_SPI2 + +// +// Limit Switches +// +#define X_STOP_PIN PC13 +#define Y_STOP_PIN PC0 +#define Z_MIN_PIN PC12 +#define Z_MAX_PIN PB9 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PB12 +#define X_ENABLE_PIN PB10 + +#define Y_STEP_PIN PB11 +#define Y_DIR_PIN PB2 +#define Y_ENABLE_PIN PB10 + +#define Z_STEP_PIN PB1 +#define Z_DIR_PIN PC5 +#define Z_ENABLE_PIN PB10 + +#define E0_STEP_PIN PC4 +#define E0_DIR_PIN PA5 +#define E0_ENABLE_PIN PA4 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC9 +#define FAN_PIN PA8 +#define HEATER_BED_PIN PC8 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA1 +#define TEMP_0_PIN PA0 + +#define FIL_RUNOUT_PIN PB8 // MT_DET + +// +// LCD Pins +// +#if HAS_WIRED_LCD + #define BEEPER_PIN PD2 + #define BTN_ENC PB3 + #define LCD_PINS_RS PC3 + + #define BTN_EN1 PB5 + #define BTN_EN2 PB4 + + #define LCD_PINS_ENABLE PC2 + + #if ENABLED(MKS_MINI_12864) + + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN -1 + #define DOGLCD_A0 PC1 + #define DOGLCD_CS PC2 + #define DOGLCD_SCK PB13 + #define DOGLCD_MOSI PB15 + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PC1 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 -1 + #define LCD_PINS_D6 -1 + #define LCD_PINS_D7 -1 + #endif + + #endif // !MKS_MINI_12864 + + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +// Motor current PWM pins +#define MOTOR_CURRENT_PWM_XY_PIN PB0 +#define MOTOR_CURRENT_PWM_Z_PIN PA7 +#define MOTOR_CURRENT_PWM_E_PIN PA6 +#define MOTOR_CURRENT_PWM_RANGE (65535/10/3.3) // (255 * (1000mA / 65535)) * 257 = 1000 is equal 1.6v Vref in turn equal 1Amp +#define DEFAULT_PWM_MOTOR_CURRENT { 1000, 1000, 1000 } // 1.05Amp per driver, here is XY, Z and E. This values determined empirically. + +// +// SD Card +// +#define ENABLE_SPI2 +#define SD_DETECT_PIN PC10 +#define SCK_PIN PB13 +#define MISO_PIN P1B4 +#define MOSI_PIN P1B5 +#define SS_PIN PA15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h new file mode 100644 index 00000000..d5318b8e --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.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 + +/** + * MKS Robin Lite 3 (STM32F103RCT6) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS Robin Lite3 supports up to 2 hotends / E-steppers. Comment out this line to continue." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS Robin Lite3" +#endif +#define BOARD_WEBSITE_URL "github.com/makerbase-mks" + +//#define DISABLE_DEBUG +#define DISABLE_JTAG +#define ENABLE_SPI2 + +// +// Servos +// +#define SERVO0_PIN PA3 + +// +// Limit Switches +// +#define X_STOP_PIN PA12 +#define Y_STOP_PIN PA11 +#define Z_MIN_PIN PC6 +#define Z_MAX_PIN PB1 + +// +// Steppers +// +#define X_STEP_PIN PC0 +#define X_DIR_PIN PB2 +#define X_ENABLE_PIN PC13 + +#define Y_STEP_PIN PC2 +#define Y_DIR_PIN PB9 +#define Y_ENABLE_PIN PB12 + +#define Z_STEP_PIN PB7 +#define Z_DIR_PIN PB6 +#define Z_ENABLE_PIN PB8 + +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB3 +#define E0_ENABLE_PIN PB5 + +#define E1_STEP_PIN PC12 +#define E1_DIR_PIN PC11 +#define E1_ENABLE_PIN PD2 + +// +// Heaters 0,1 / Fans / Bed +// +#define HEATER_0_PIN PC9 +#define HEATER_1_PIN PC7 +#define FAN_PIN PA8 +#define HEATER_BED_PIN PC8 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA1 //TB +#define TEMP_0_PIN PA0 //TH1 +#define TEMP_1_PIN PA2 //TH2 + +#define FIL_RUNOUT_PIN PB10 // MT_DET + +// +// LCD Pins +// +#if HAS_WIRED_LCD + + #define BEEPER_PIN PC1 + #define BTN_ENC PC3 + #define LCD_PINS_ENABLE PA4 + #define LCD_PINS_RS PA5 + #define BTN_EN1 PB11 + #define BTN_EN2 PB0 + + // 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 PC4 + #define DOGLCD_CS PA7 + #define DOGLCD_SCK PB13 + #define DOGLCD_MOSI PB15 + + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PB11 + #endif + + #else // !MKS_MINI_12864 + + #define LCD_PINS_D4 PA6 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PA7 + #define LCD_PINS_D6 PC4 + #define LCD_PINS_D7 PC5 + #endif + + #endif // !MKS_MINI_12864 + +#endif // HAS_WIRED_LCD + +// +// SD Card +// +#define ENABLE_SPI2 +#define SD_DETECT_PIN PC10 +#define SCK_PIN PB13 +#define MISO_PIN PB14 +#define MOSI_PIN PB15 +#define SS_PIN PA15 + +#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 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h new file mode 100644 index 00000000..2b099b3e --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -0,0 +1,210 @@ +/** + * 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 mini (STM32F130VET6) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "MKS Robin mini only supports 1 hotend / E-stepper. Comment out this line to continue." +#endif + +#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 + #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 + +// +// Limit Switches +// +#define X_STOP_PIN PA15 +#define Y_STOP_PIN PA12 +#define Z_MIN_PIN PA11 +#define Z_MAX_PIN PC4 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA4 // MT_DET +#endif + +// +// Steppers +// +#define X_ENABLE_PIN PE4 +#define X_STEP_PIN PE3 +#define X_DIR_PIN PE2 + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 + +#define E0_ENABLE_PIN PB3 +#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 +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC3 +#define HEATER_BED_PIN PA0 + +#define FAN_PIN PB1 // FAN + +// +// Misc. Functions +// +#define POWER_LOSS_PIN PA2 // PW_DET +#define PS_ON_PIN PA3 // PW_OFF + +#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_SPI_DEVICE 1 // SPI1 +#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(TOUCH_SCREEN) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION 12033 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION -9047 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET -30 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET 254 + #endif +#endif + +#if ENABLED(FSMC_GRAPHICAL_TFT) + + #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 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 + +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB + #define W25QXX_CS_PIN PB12 // Flash chip-select + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h new file mode 100644 index 00000000..16d6d2ff --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h @@ -0,0 +1,249 @@ +/** + * 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 + */ + +#if NOT_TARGET(STM32F1, STM32F1xx) + #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" + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// +#define DISABLE_JTAG + +// +// EEPROM +// +#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 + +// +// Limit Switches +// +#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 + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 + +#define E0_ENABLE_PIN PB3 +#define E0_STEP_PIN PD6 +#define E0_DIR_PIN PD3 + +#define E1_ENABLE_PIN PA3 +#define E1_STEP_PIN PA6 +#define E1_DIR_PIN PA1 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_1_PIN PC2 // TH2 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#ifndef HEATER_0_PIN + #define HEATER_0_PIN PC3 +#endif +#if HOTENDS == 1 + #ifndef FAN1_PIN + #define FAN1_PIN PB0 + #endif +#else + #ifndef HEATER_1_PIN + #define HEATER_1_PIN PB0 + #endif +#endif +#ifndef FAN_PIN + #define FAN_PIN PB1 // FAN +#endif +#ifndef HEATER_BED_PIN + #define HEATER_BED_PIN PA0 +#endif + +// +// Thermocouples +// +//#define MAX6675_SS_PIN PE5 // TC1 - CS1 +//#define MAX6675_SS_PIN PE6 // TC2 - CS2 + +// +// Misc. Functions +// +#if HAS_TFT_LVGL_UI + //#define MKSPWC + #ifdef MKSPWC + #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN + #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE + #define KILL_PIN PA2 // Enable MKSPWC DET PIN + #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE + #endif + + #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN + #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN + #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE + + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PA5 // MKS ESP WIFI RESET PIN +#else + //#define POWER_LOSS_PIN PA2 // PW_DET + //#define PS_ON_PIN PB2 // PW_OFF + #define FIL_RUNOUT_PIN PA4 + #define FIL_RUNOUT2_PIN PE6 +#endif + +#define SERVO0_PIN PA8 // Enable BLTOUCH support + +//#define LED_PIN PB2 + +// +// 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. + */ + +// Shared FSMC Configs +#if HAS_FSMC_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 + + #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_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 + #define FSMC_RS_PIN PD11 + #define FSMC_DMA_DEV DMA2 + #define FSMC_DMA_CHANNEL DMA_CH5 + + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 2 + + #define TFT_BUFFER_SIZE 14400 +#endif + +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI_FSMC, TFT_480x320) + #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 +#elif ENABLED(TFT_CLASSIC_UI) + #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_320x240) + #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 +#endif + +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#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 new file mode 100644 index 00000000..846fe80a --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -0,0 +1,392 @@ +/** + * 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 + */ + +#if NOT_TARGET(__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." +#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" + +// +// 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 MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + //#define E1_HARDWARE_SERIAL MSerial1 + + // + // 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 +// +#if HAS_TFT_LVGL_UI + //#define MKSPWC + #ifdef MKSPWC + #define SUICIDE_PIN PB2 // Enable MKSPWC SUICIDE PIN + #define SUICIDE_PIN_INVERTING false // Enable MKSPWC PIN STATE + #define KILL_PIN PA2 // Enable MKSPWC DET PIN + #define KILL_PIN_STATE true // Enable MKSPWC PIN STATE + #endif + + #define MT_DET_1_PIN PA4 // LVGL UI FILAMENT RUNOUT1 PIN + #define MT_DET_2_PIN PE6 // LVGL UI FILAMENT RUNOUT2 PIN + #define MT_DET_PIN_INVERTING false // LVGL UI filament RUNOUT PIN STATE + + #define WIFI_IO0_PIN PC13 // MKS ESP WIFI IO0 PIN + #define WIFI_IO1_PIN PC7 // MKS ESP WIFI IO1 PIN + #define WIFI_RESET_PIN PE9 // MKS ESP WIFI RESET PIN + + #if ENABLED(MKS_TEST) + #define MKS_TEST_POWER_LOSS_PIN PA2 // PW_DET + #define MKS_TEST_PS_ON_PIN PB2 // PW_OFF + #endif +#else + //#define POWER_LOSS_PIN PA2 // PW_DET + //#define PS_ON_PIN PB2 // PW_OFF + #define FIL_RUNOUT_PIN PA4 + #define FIL_RUNOUT2_PIN PE6 +#endif + +#define SERVO0_PIN PA8 // Enable BLTOUCH + +//#define LED_PIN PB2 + +// +// 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 +// + +/** + * 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 HAS_SPI_TFT + + // Shared SPI TFT + + #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 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 TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + + #define LCD_USE_DMA_SPI + +#endif + +#if ENABLED(TFT_CLASSIC_UI) + // Emulated DOGM SPI + #ifndef GRAPHICAL_TFT_UPSCALE + #define GRAPHICAL_TFT_UPSCALE 3 + #endif + #ifndef TFT_PIXEL_OFFSET_Y + #define TFT_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(TFT_COLOR_UI) + #define TFT_BUFFER_SIZE 14400 +#endif + +// XPT2046 Touch Screen calibration +#if EITHER(TFT_LVGL_UI, TFT_COLOR_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17253 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11579 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 514 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -24 + #endif +#elif ENABLED(TFT_CLASSIC_UI) + #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 +#endif + +#if HAS_WIRED_LCD && !HAS_SPI_TFT + + // NON TFT Displays + + #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 + + #elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define PIN_SPI_SCK PA5 + #define PIN_TFT_MISO PA6 + #define PIN_TFT_MOSI PA7 + #define TFTGLCD_CS PE8 + #endif + + #ifndef BEEPER_PIN + #define BEEPER_PIN -1 + #endif + + #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_WIRED_LCD && !HAS_SPI_TFT + +#define HAS_SPI_FLASH 1 +#if HAS_SPI_FLASH + #define SPI_FLASH_SIZE 0x1000000 // 16MB + #define W25QXX_CS_PIN PB12 + #define W25QXX_MOSI_PIN PB15 + #define W25QXX_MISO_PIN PB14 + #define W25QXX_SCK_PIN PB13 +#endif + +#ifndef BEEPER_PIN + #define BEEPER_PIN PC5 +#endif + +#if ENABLED(SPEAKER) && BEEPER_PIN == PC5 + #error "MKS Robin nano default BEEPER_PIN is not a SPEAKER." +#endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h new file mode 100644 index 00000000..32203f52 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -0,0 +1,275 @@ +/** + * 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 pro (STM32F103ZET6) board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#elif HOTENDS > 3 || E_STEPPERS > 3 + #error "MKS Robin pro supports up to 3 hotends / E-steppers. Comment out this line to continue." +#endif + +#define BOARD_INFO_NAME "MKS Robin pro" + +// +// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role +// +#define DISABLE_DEBUG + +// +// Note: MKS Robin board is using SPI2 interface. +// +//#define SPI_MODULE 2 +#define ENABLE_SPI2 + +// +// Servos +// +#define SERVO0_PIN PA8 // BLTOUCH + +// +// Limit Switches +// +#define X_MIN_PIN PA15 +#define X_MAX_PIN PG7 +#define Y_MIN_PIN PA12 +#define Y_MAX_PIN PG8 +#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 PF8 +#endif + +#define Y_ENABLE_PIN PE1 +#define Y_STEP_PIN PE0 +#define Y_DIR_PIN PB9 +#ifndef Y_CS_PIN + #define Y_CS_PIN PF3 +#endif + +#define Z_ENABLE_PIN PB8 +#define Z_STEP_PIN PB5 +#define Z_DIR_PIN PB4 +#ifndef Z_CS_PIN + #define Z_CS_PIN PF6 +#endif + +#define E0_ENABLE_PIN PB3 +#define E0_STEP_PIN PD6 +#define E0_DIR_PIN PD3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PG15 +#endif + +#define E1_ENABLE_PIN PA3 +#define E1_STEP_PIN PA6 +#define E1_DIR_PIN PA1 +#ifndef E1_CS_PIN + #define E1_CS_PIN PG10 +#endif + +#define E2_ENABLE_PIN PF0 +#define E2_STEP_PIN PF2 +#define E2_DIR_PIN PF1 +#ifndef E2_CS_PIN + #define E2_CS_PIN PG9 +#endif +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #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 MSerial1 + //#define Y_HARDWARE_SERIAL MSerial1 + //#define Z_HARDWARE_SERIAL MSerial1 + //#define E0_HARDWARE_SERIAL MSerial1 + //#define E1_HARDWARE_SERIAL MSerial1 + //#define E2_HARDWARE_SERIAL MSerial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN PF7 + #define X_SERIAL_RX_PIN PF8 + + #define Y_SERIAL_TX_PIN PF4 + #define Y_SERIAL_RX_PIN PF3 + + #define Z_SERIAL_TX_PIN PF5 + #define Z_SERIAL_RX_PIN PF6 + + #define E0_SERIAL_TX_PIN PG13 + #define E0_SERIAL_RX_PIN PG15 + + #define E1_SERIAL_TX_PIN PG12 + #define E1_SERIAL_RX_PIN PG10 + + #define E2_SERIAL_TX_PIN PC13 + #define E2_SERIAL_RX_PIN PG9 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // TH1 +#define TEMP_1_PIN PC2 // TH2 +#define TEMP_2_PIN PC3 // TH3 +#define TEMP_BED_PIN PC0 // TB1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PF10 // +HE0- +#define HEATER_1_PIN PB0 // +HE1- +#define HEATER_2_PIN PF9 // +HE2- +#define HEATER_BED_PIN PA0 // +HOT-BED- +#define FAN_PIN PB1 // +FAN- + +/** + * Note: MKS Robin Pro board is using SPI2 interface. Make sure your stm32duino library is configured accordingly + */ +//#define MAX6675_SS_PIN PE5 // TC1 - CS1 +//#define MAX6675_SS_PIN PF11 // TC2 - CS2 + +#define POWER_LOSS_PIN PA2 // PW_DET +#define PS_ON_PIN PG11 // PW_OFF +#define FIL_RUNOUT_PIN PA4 // MT_DET1 +//#define FIL_RUNOUT_PIN PE6 // MT_DET2 +//#define FIL_RUNOUT_PIN PG14 // MT_DET3 + +// +// SD Card +// +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(LCD) + #define ENABLE_SPI2 + #define SD_DETECT_PIN PG3 + #define SCK_PIN PB13 + #define MISO_PIN PB14 + #define MOSI_PIN PB15 + #define SS_PIN PG6 +#elif SD_CONNECTION_IS(ONBOARD) + #define SDIO_SUPPORT + #define SD_DETECT_PIN PD12 + #define ONBOARD_SD_CS_PIN PC11 +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "No custom SD drive cable defined for this board." +#endif + +/** + * 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(FSMC_GRAPHICAL_TFT) + #define FSMC_CS_PIN PD7 // NE4 + #define FSMC_RS_PIN PD11 // A0 + + #define LCD_RESET_PIN PF6 + #define LCD_BACKLIGHT_PIN PD13 + + #if NEED_TOUCH_PINS + #define TOUCH_CS_PIN PA7 + #else + #define BEEPER_PIN PC5 + #define BTN_ENC PG2 + #define BTN_EN1 PG5 + #define BTN_EN2 PG4 + #endif + +#elif IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PG5 + #endif + +#elif HAS_WIRED_LCD + + #define BEEPER_PIN PC5 + #define BTN_ENC PG2 + #define LCD_PINS_ENABLE PG0 + #define LCD_PINS_RS PG1 + #define BTN_EN1 PG5 + #define BTN_EN2 PG4 + + // 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 PF12 + #define DOGLCD_CS PF15 + #define DOGLCD_SCK PB13 + #define DOGLCD_MOSI PB15 + + #else // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY + + #define LCD_PINS_D4 PF14 + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PF15 + #define LCD_PINS_D6 PF12 + #define LCD_PINS_D7 PF13 + #endif + + #endif // !MKS_MINI_12864 && !ENDER2_STOCKDISPLAY + +#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 diff --git a/Marlin/src/pins/stm32f1/pins_MORPHEUS.h b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h new file mode 100644 index 00000000..ccc92b75 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_MORPHEUS.h @@ -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 . + * + */ +#pragma once + + /** + * 2017 Victor Perez Marlin for stm32f1 test + * 2018 Modified by Pablo Crespo for Morpheus Board (https://github.com/pscrespo/Morpheus-STM32) + */ + +/** + * MORPHEUS Board pin assignments + */ + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Bluepill based board" + +// +// Limit Switches +// +#define X_MIN_PIN PB14 +#define Y_MIN_PIN PB13 +#define Z_MIN_PIN PB12 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PB9 +#endif + +// +// Steppers +// +// X & Y enable are the same +#define X_STEP_PIN PB7 +#define X_DIR_PIN PB6 +#define X_ENABLE_PIN PB8 + +#define Y_STEP_PIN PB5 +#define Y_DIR_PIN PB4 +#define Y_ENABLE_PIN PB8 + +#define Z_STEP_PIN PA15 +#define Z_DIR_PIN PA10 +#define Z_ENABLE_PIN PB3 + +#define E0_STEP_PIN PA8 +#define E0_DIR_PIN PB15 +#define E0_ENABLE_PIN PA9 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PB1 // Analog Input (HOTEND thermistor) +#define TEMP_BED_PIN PB0 // Analog Input (BED thermistor) + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA2 // HOTEND MOSFET +#define HEATER_BED_PIN PA0 // BED MOSFET + +#define FAN_PIN PA1 // FAN1 header on board - PRINT FAN + +// +// Misc. +// +#define LED_PIN PC13 +#define SDSS PA3 +#define TFTGLCD_CS PA4 diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h new file mode 100644 index 00000000..cf2ba2c5 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -0,0 +1,261 @@ +/** + * 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 + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define BOARD_INFO_NAME "Misc. STM32F1R" +#define DEFAULT_MACHINE_NAME "STM32F103RET6" + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Limit Switches +// +#define X_STOP_PIN PB3 +#define Y_STOP_PIN PB4 +#define Z_STOP_PIN PB5 + +// +// Steppers +// +#define X_STEP_PIN PC0 +#define X_DIR_PIN PC1 +#define X_ENABLE_PIN PA8 + +#define Y_STEP_PIN PC2 +#define Y_DIR_PIN PC3 +#define Y_ENABLE_PIN PA8 + +#define Z_STEP_PIN PC4 +#define Z_DIR_PIN PC5 +#define Z_ENABLE_PIN PA8 + +#define E0_STEP_PIN PC6 +#define E0_DIR_PIN PC7 +#define E0_ENABLE_PIN PA8 + +/** + * TODO: Currently using same Enable pin to all steppers. + */ + +#define E1_STEP_PIN PC8 +#define E1_DIR_PIN PC9 +#define E1_ENABLE_PIN PA8 + +#define E2_STEP_PIN PC10 +#define E2_DIR_PIN PC11 +#define E2_ENABLE_PIN PA8 + +// +// Misc. Functions +// +#define SDSS PA4 +#define LED_PIN PD2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB0 // EXTRUDER 1 +#define HEATER_1_PIN PB1 + +#define HEATER_BED_PIN PA3 // BED + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // Analog Input +#define TEMP_0_PIN PA1 // Analog Input +#define TEMP_1_PIN PA2 // Analog Input + +// +// LCD Pins +// +#if HAS_WIRED_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 + #elif BOTH(NEWPANEL, PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #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 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #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 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #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 + + #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_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ANY(VIKI2, miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #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 SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #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 + + #elif ENABLED(MINIPANEL) + + #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 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 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #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 + #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 + #else + #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 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h new file mode 100644 index 00000000..e74698f8 --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -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 . + * + */ +#pragma once + +#if NOT_TARGET(__STM32F1__, __STM32F4__) + #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define BOARD_INFO_NAME "STM3R Mini" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// Enable I2C_EEPROM for testing +#define I2C_EEPROM + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Limit Switches +// +#define X_STOP_PIN PD0 +#define Y_STOP_PIN PD1 +#define Z_STOP_PIN PD4 + +// +// Steppers +// +#define X_STEP_PIN PE1 +#define X_DIR_PIN PE0 +#define X_ENABLE_PIN PC0 + +#define Y_STEP_PIN PE3 +#define Y_DIR_PIN PE2 +#define Y_ENABLE_PIN PC1 + +#define Z_STEP_PIN PE5 +#define Z_DIR_PIN PE4 +#define Z_ENABLE_PIN PC2 + +#define E0_STEP_PIN PE7 +#define E0_DIR_PIN PE6 +#define E0_ENABLE_PIN PC3 + +#define E1_STEP_PIN PE9 +#define E1_DIR_PIN PE8 +#define E1_ENABLE_PIN PC4 + +#define E2_STEP_PIN PE11 +#define E2_DIR_PIN PE10 +#define E2_ENABLE_PIN PC5 + +// +// Misc. Functions +// +#define SDSS PA15 +#define LED_PIN PB2 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // EXTRUDER 1 +//#define HEATER_1_PIN PD13 + +#define HEATER_BED_PIN PB9 // BED +//#define HEATER_BED2_PIN -1 // BED2 +//#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PD14 +#endif +#define FAN1_PIN PD13 + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 +#define TEMP_0_PIN PA1 +#define TEMP_1_PIN PA2 +#define TEMP_2_PIN PA3 + +// Laser control +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN PB8 + #define SPINDLE_LASER_ENA_PIN PD5 +#endif + +// +// LCD Pins +// +#if HAS_WIRED_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 + #elif BOTH(NEWPANEL, PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #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 + #endif + #endif + + #if NEED_TOUCH_PINS + + #define TOUCH_CS_PIN PB12 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 + #define TOUCH_MOSI_PIN PB14 + #define TOUCH_MISO_PIN PB15 + #define TOUCH_INT_PIN PC6 // (PenIRQ coming from ADS7843) + + #elif ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #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 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #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 + + #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_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ANY(VIKI2, miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #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 SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #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 + + #elif ENABLED(MINIPANEL) + + #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 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 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #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 + #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 + #else + #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 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD 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 00000000..bfd1f2ab --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -0,0 +1,193 @@ +/** + * 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 + */ + +#if NOT_TARGET(__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. + */ +#if HAS_FSMC_TFT + #define TFT_RESET_PIN PF11 + #define TFT_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 + + #define ANYCUBIC_TFT35 +#else + #define LCD_RESET_PIN PF11 + #define LCD_BACKLIGHT_PIN PD13 +#endif + +// XPT2046 Touch Screen calibration +#if ENABLED(TFT_COLOR_UI) || ENABLED(TFT_LVGL_UI) + #ifndef XPT2046_X_CALIBRATION + #define XPT2046_X_CALIBRATION -17181 + #endif + #ifndef XPT2046_Y_CALIBRATION + #define XPT2046_Y_CALIBRATION 11434 + #endif + #ifndef XPT2046_X_OFFSET + #define XPT2046_X_OFFSET 501 + #endif + #ifndef XPT2046_Y_OFFSET + #define XPT2046_Y_OFFSET -9 + #endif +#elif ENABLED(TFT_CLASSIC_UI) + #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 + +#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 + #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/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h new file mode 100644 index 00000000..db57db14 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -0,0 +1,229 @@ +/** + * 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 . + * + */ + +// https://github.com/ktand/Armed + +#pragma once + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Arm'ed supports up to 2 hotends / E-steppers." +#endif + +#ifndef ARMED_V1_0 + #define ARMED_V1_1 +#endif + +#undef BOARD_INFO_NAME // Defined on the command line by Arduino Core STM32 +#define BOARD_INFO_NAME "Arm'ed" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB + +// +// Limit Switches +// +#define X_STOP_PIN PE0 +#define Y_STOP_PIN PE1 +#define Z_STOP_PIN PE14 + +// +// Z Probe (when not Z_MIN_PIN) +// +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN PA4 +//#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA3 +#endif + +// +// Steppers +// + +#ifdef ARMED_SWAP_X_E1 + #define X_STEP_PIN PE4 + #define X_DIR_PIN PE2 + #define X_ENABLE_PIN PE3 + #define X_CS_PIN PE5 +#else + #define X_STEP_PIN PD3 + #define X_DIR_PIN PD2 + #define X_ENABLE_PIN PD0 + #define X_CS_PIN PD1 +#endif + +#define Y_STEP_PIN PE11 +#define Y_DIR_PIN PE10 +#define Y_ENABLE_PIN PE13 +#define Y_CS_PIN PE12 + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD7 +#define Z_ENABLE_PIN PD4 +#define Z_CS_PIN PD5 + +#define E0_STEP_PIN PB5 +#define E0_DIR_PIN PB6 +#ifdef ARMED_V1_1 + #define E0_ENABLE_PIN PC12 +#else + #define E0_ENABLE_PIN PB3 +#endif +#define E0_CS_PIN PB4 + +#ifdef ARMED_SWAP_X_E1 + #define E1_STEP_PIN PD3 + #define E1_DIR_PIN PD2 + #define E1_ENABLE_PIN PD0 + #define E1_CS_PIN PD1 +#else + #define E1_STEP_PIN PE4 + #define E1_DIR_PIN PE2 + #define E1_ENABLE_PIN PE3 + #define E1_CS_PIN PE5 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 // Analog Input +#define TEMP_1_PIN PC1 // Analog Input +#define TEMP_BED_PIN PC2 // Analog Input + +#if HOTENDS == 1 && TEMP_SENSOR_PROBE + #define TEMP_PROBE_PIN PC1 +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA1 // Hardware PWM +#define HEATER_1_PIN PA2 // Hardware PWM +#define HEATER_BED_PIN PA0 // Hardware PWM + +#define FAN_PIN PC6 // Hardware PWM, Part cooling fan +#define FAN1_PIN PC7 // Hardware PWM, Extruder fan +#define FAN2_PIN PC8 // Hardware PWM, Controller fan + +// +// Misc functions +// +#define SDSS PE7 +#define LED_PIN PB7 // Heart beat +#define PS_ON_PIN PA10 +#define KILL_PIN PA8 +#define PWR_LOSS PA4 // Power loss / nAC_FAULT + +// +// LCD / Controller +// +#define SD_DETECT_PIN PA15 +#define BEEPER_PIN PC9 + +#if ENABLED(FYSETC_MINI_12864) + // + // See https://wiki.fysetc.com/Mini12864_Panel/?fbclid=IwAR1FyjuNdVOOy9_xzky3qqo_WeM5h-4gpRnnWhQr_O1Ef3h0AFnFXmCehK8 + // + #define DOGLCD_A0 PE9 + #define DOGLCD_CS PE8 + + #define LCD_BACKLIGHT_PIN -1 + + #define LCD_RESET_PIN PB12 // 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 PB13 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB14 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB15 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN PB13 + #endif +#else + #define LCD_PINS_RS PE9 + #define LCD_PINS_ENABLE PE8 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS PB13 + #define DOGLCD_A0 PB14 + #endif +#endif + +#define BTN_EN1 PC4 +#define BTN_EN2 PC5 +#define BTN_ENC PC3 + +// +// Extension pins +// +#define EXT0_PIN PB0 +#define EXT1_PIN PB1 +#define EXT2_PIN PB2 +#define EXT3_PIN PD8 +#define EXT4_PIN PD9 +#define EXT5_PIN PD10 +#define EXT6_PIN PD11 +#define EXT7_PIN PD12 +#define EXT8_PIN PB10 +#define EXT9_PIN PB11 + +#if HAS_TMC_UART + // TMC2208/TMC2209 stepper drivers + // + // Software serial + // + #define X_SERIAL_TX_PIN EXT0_PIN + #define X_SERIAL_RX_PIN EXT0_PIN + + #define Y_SERIAL_TX_PIN EXT1_PIN + #define Y_SERIAL_RX_PIN EXT1_PIN + + #define Z_SERIAL_TX_PIN EXT2_PIN + #define Z_SERIAL_RX_PIN EXT2_PIN + + #define E0_SERIAL_TX_PIN EXT3_PIN + #define E0_SERIAL_RX_PIN EXT3_PIN + + #define E1_SERIAL_RX_PIN EXT4_PIN + #define E1_SERIAL_TX_PIN EXT4_PIN + + #define Z2_SERIAL_RX_PIN EXT4_PIN + #define Z2_SERIAL_TX_PIN EXT4_PIN + + #define TMC_BAUD_RATE 19200 +#endif diff --git a/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h new file mode 100644 index 00000000..83ff0c01 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h @@ -0,0 +1,174 @@ +/** + * 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 + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 1 || E_STEPPERS > 1 + #error "Artillery X supports up to 1 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Artillery Ruby" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +#define FLASH_EEPROM_EMULATION +//#define I2C_EEPROM +//#define E2END 0xFFF // 4KB + +#define HAL_TIMER_RATE F_CPU + +// +// Limit Switches +// +#if (X_HOME_DIR == 1) + #define X_MIN_PIN -1 + #define X_MAX_PIN PA2 +#else + #define X_MIN_PIN PA2 + #define X_MAX_PIN -1 +#endif +#if (Y_HOME_DIR == 1) + #define Y_MIN_PIN -1 + #define Y_MAX_PIN PA1 +#else + #define Y_MIN_PIN PA1 + #define Y_MAX_PIN -1 +#endif +#if (Z_HOME_DIR == 1) + #define Z_MIN_PIN PC2 + #define Z_MAX_PIN PA0 +#else + #define Z_MIN_PIN PA0 + #define Z_MAX_PIN PC2 +#endif + +// +// Steppers +// +#define X_STEP_PIN PB14 +#define X_DIR_PIN PB13 +#define X_ENABLE_PIN PB15 + +#define Y_STEP_PIN PB10 +#define Y_DIR_PIN PB2 +#define Y_ENABLE_PIN PB12 + +#define Z_STEP_PIN PB0 +#define Z_DIR_PIN PC5 +#define Z_ENABLE_PIN PB1 + +#define E0_STEP_PIN PA7 +#define E0_DIR_PIN PA6 +#define E0_ENABLE_PIN PC4 + +#define E1_STEP_PIN PA4 +#define E1_DIR_PIN PA3 +#define E1_ENABLE_PIN PA5 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 +#define TEMP_BED_PIN PC1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC9 +#define HEATER_BED_PIN PA8 + +#define FAN_PIN PC8 +#define FAN1_PIN PC7 +#define FAN2_PIN PC6 + +// +// Servos +// +#define SERVO0_PIN PC3 + +// +// SPI +// +#define SCK_PIN PC10 +#define MISO_PIN PC11 +#define MOSI_PIN PC12 + +// +// LCD / Controller +// +#if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #define LCD_PINS_DC PB8 // Set as output on init + #define LCD_PINS_RS PB9 // Pull low for 1s to init + // DOGM SPI LCD Support + #define DOGLCD_CS PC15 + #define DOGLCD_MOSI PB6 + #define DOGLCD_SCK PB5 + #define DOGLCD_A0 LCD_PINS_DC +#elif ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS PB6 + #define DOGLCD_A0 PC15 + + //#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 PB5 // 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 PB9 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB8 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB7 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN PB9 + #endif + + #define DEFAULT_LCD_CONTRAST 255 +#else + #define LCD_PINS_RS PC15 + #define LCD_PINS_ENABLE PB6 + #define LCD_PINS_D4 PB5 + #define LCD_PINS_D5 PB9 + #define LCD_PINS_D6 PB8 +#endif + +#define LCD_PINS_D7 PB7 + +// +// Beeper, SD Card, Encoder +// +#define BEEPER_PIN PC13 + +#if ENABLED(SDSUPPORT) + #define SDSS PA15 + #define SD_DETECT_PIN PD2 +#endif + +#if ENABLED(NEWPANEL) + #define BTN_EN1 PB4 + #define BTN_EN2 PB3 + #define BTN_ENC PC14 +#endif diff --git a/Marlin/src/pins/stm32f4/pins_BEAST.h b/Marlin/src/pins/stm32f4/pins_BEAST.h new file mode 100644 index 00000000..268b7b59 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BEAST.h @@ -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 . + * + */ +#pragma once + +#if NOT_TARGET(__STM32F1__, __STM32F4__) + #error "Oops! Select an STM32F1/4 board in 'Tools > Board.'" +#endif + +/** + * 21017 Victor Perez Marlin for stm32f1 test + */ + +#define BOARD_INFO_NAME "Beast STM32" +#define DEFAULT_MACHINE_NAME "STM32F103RET6" + +// Enable I2C_EEPROM for testing +#define I2C_EEPROM + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Steppers +// +#define X_STEP_PIN PE0 +#define X_DIR_PIN PE1 +#define X_ENABLE_PIN PC0 +#define X_MIN_PIN PD5 +#define X_MAX_PIN -1 + +#define Y_STEP_PIN PE2 +#define Y_DIR_PIN PE3 +#define Y_ENABLE_PIN PC1 +#define Y_MIN_PIN PD6 +#define Y_MAX_PIN + +#define Z_STEP_PIN PE4 +#define Z_DIR_PIN PE5 +#define Z_ENABLE_PIN PC2 +#define Z_MIN_PIN PD7 +#define Z_MAX_PIN -1 + +#define Y2_STEP_PIN -1 +#define Y2_DIR_PIN -1 +#define Y2_ENABLE_PIN -1 + +#define Z2_STEP_PIN -1 +#define Z2_DIR_PIN -1 +#define Z2_ENABLE_PIN -1 + +#define E0_STEP_PIN PE6 +#define E0_DIR_PIN PE7 +#define E0_ENABLE_PIN PC3 + +/** + * TODO: Currently using same Enable pin to all steppers. + */ + +#define E1_STEP_PIN PE8 +#define E1_DIR_PIN PE9 +#define E1_ENABLE_PIN PC4 + +#define E2_STEP_PIN PE10 +#define E2_DIR_PIN PE11 +#define E2_ENABLE_PIN PC5 + +// +// Misc. Functions +// +#define SDSS PA15 +#define LED_PIN PB2 + +#define PS_ON_PIN -1 +#define KILL_PIN -1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD12 // EXTRUDER 1 +#define HEATER_1_PIN PD13 +#define HEATER_2_PIN PD14 + +#define HEATER_BED_PIN PB9 // BED +#define HEATER_BED2_PIN -1 // BED2 +#define HEATER_BED3_PIN -1 // BED3 + +#ifndef FAN_PIN + #define FAN_PIN PB10 +#endif + +#define FAN_SOFT_PWM + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PA0 // Analog Input +#define TEMP_0_PIN PA1 // Analog Input +#define TEMP_1_PIN PA2 // Analog Input +#define TEMP_2_PIN PA3 // Analog Input + +// +// LCD Pins +// +#if HAS_WIRED_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 + #elif BOTH(NEWPANEL, PANEL_ONE) + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #else + #define LCD_PINS_RS PB8 + #define LCD_PINS_ENABLE PD2 + #define LCD_PINS_D4 PB12 + #define LCD_PINS_D5 PB13 + #define LCD_PINS_D6 PB14 + #define LCD_PINS_D7 PB15 + #if DISABLED(NEWPANEL) + #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 + #endif + #endif + + #if ENABLED(NEWPANEL) + + #if ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) + + #define BEEPER_PIN 37 + + #define BTN_EN1 31 + #define BTN_EN2 33 + #define BTN_ENC 35 + + #define SD_DETECT_PIN 49 + #define KILL_PIN 41 + + #if ENABLED(BQ_LCD_SMART_CONTROLLER) + #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 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #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 + + #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_ENC -1 + #define LCD_SDSS 53 + #define SD_DETECT_PIN 49 + + #elif ANY(VIKI2, miniVIKI) + + #define BEEPER_PIN 33 + + // Pins for DOGM SPI LCD Support + #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 SDSS 53 + #define SD_DETECT_PIN -1 // Pin 49 for display sd interface, 72 for easy adapter board + + #define KILL_PIN 31 + + #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 + + #elif ENABLED(MINIPANEL) + + #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 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 + // not connected to a pin + #define SD_DETECT_PIN 49 + + #else + + // Beeper on AUX-4 + #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 + #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 + #else + #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 + #else + //#define SD_DETECT_PIN -1 // Ramps doesn't use this + #endif + + #endif + #endif // NEWPANEL + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h new file mode 100644 index 00000000..b13d4955 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -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 . + * + */ +#pragma once + +/** + * STM32F407VET6 with RAMPS-like shield + * 'Black' STM32F407VET6 board - https://www.stm32duino.com/viewtopic.php?t=485 + * Shield - https://github.com/jmz52/Hardware + */ + +#if NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "Black STM32F4VET6 supports up to 2 hotends / E-steppers." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Black STM32F4VET6" +#endif + +#define DEFAULT_MACHINE_NAME "STM32F407VET6" + +//#define I2C_EEPROM +#define SRAM_EEPROM_EMULATION +#define MARLIN_EEPROM_SIZE 0x2000 // 8KB + +// +// Servos +// +#define SERVO0_PIN PC6 +#define SERVO1_PIN PC7 + +// +// Limit Switches +// +#define X_MIN_PIN PC13 +#define X_MAX_PIN PA15 +#define Y_MIN_PIN PA5 +#define Y_MAX_PIN PD12 +#define Z_MIN_PIN PD14 +#define Z_MAX_PIN PD15 + +// +// Steppers +// +#define X_STEP_PIN PC4 +#define X_DIR_PIN PA4 +#define X_ENABLE_PIN PE7 + +#define Y_STEP_PIN PE5 +#define Y_DIR_PIN PE2 +#define Y_ENABLE_PIN PE6 + +#define Z_STEP_PIN PD5 +#define Z_DIR_PIN PD3 +#define Z_ENABLE_PIN PD6 + +#define E0_STEP_PIN PD7 +#define E0_DIR_PIN PD0 +#define E0_ENABLE_PIN PB9 + +#define E1_STEP_PIN PE0 +#define E1_DIR_PIN PE1 +#define E1_ENABLE_PIN PB8 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 // T0 +#define TEMP_1_PIN PC1 // T1 +#define TEMP_BED_PIN PC2 // TB + +#ifndef TEMP_CHAMBER_PIN + #define TEMP_CHAMBER_PIN PC3 // TC +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA2 // Heater0 +#define HEATER_1_PIN PA3 // Heater1 +#define HEATER_BED_PIN PA1 // Hotbed + +#define FAN_PIN PE9 // Fan0 +#define FAN1_PIN PE11 // Fan1 +#define FAN2_PIN PE13 // Fan2 +#define FAN3_PIN PE14 // Fan3 + +// +// Misc. Functions +// +#define LED_PIN PA6 +//#define LED_PIN PA7 +#define KILL_PIN PB1 + +// +// LCD / Controller +// +//#define SD_DETECT_PIN PC5 +//#define SD_DETECT_PIN PA8 // SDIO SD_DETECT_PIN, external SDIO card reader only + +#define BEEPER_PIN PD10 +#define LCD_PINS_RS PE15 +#define LCD_PINS_ENABLE PD8 +#define LCD_PINS_D4 PE10 +#define LCD_PINS_D5 PE12 +#define LCD_PINS_D6 PD1 +#define LCD_PINS_D7 PE8 +#define BTN_ENC PD9 +#define BTN_EN1 PD4 +#define BTN_EN2 PD13 + +#define DOGLCD_CS LCD_PINS_D5 +#define DOGLCD_A0 LCD_PINS_D6 + +// +// Onboard SD support +// +#define SDIO_D0_PIN PC8 +#define SDIO_D1_PIN PC9 +#define SDIO_D2_PIN PC10 +#define SDIO_D3_PIN PC11 +#define SDIO_CK_PIN PC12 +#define SDIO_CMD_PIN PD2 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #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 + #define SCK_PIN SDIO_CK_PIN + #define MISO_PIN SDIO_D0_PIN + #define MOSI_PIN SDIO_CMD_PIN + #endif +#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 new file mode 100644 index 00000000..c37f6cce --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -0,0 +1,268 @@ +/** + * 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 + +#if NOT_TARGET(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." +#endif + +#define BOARD_INFO_NAME "BTT BTT002 V1.0" + +// Use one of these or SDCard-based Emulation will be used +#if NO_EEPROM_SELECTED + //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#endif + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Limit Switches +// +#define X_STOP_PIN PD3 +#define Y_STOP_PIN PD2 +#define Z_STOP_PIN PD1 // Shares J4 connector with PC3 + +// +// Z Probe must be this pin +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PD1 +#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA15 +#endif + +// +// Power Loss Detection +// +#ifndef POWER_LOSS_PIN + #define POWER_LOSS_PIN PD4 +#endif + +// +// Steppers +// +#define X_STEP_PIN PA9 +#define X_DIR_PIN PA10 +#define X_ENABLE_PIN PA8 +#ifndef X_CS_PIN + #define X_CS_PIN PE2 +#endif + +#define Y_STEP_PIN PC8 +#define Y_DIR_PIN PC9 +#define Y_ENABLE_PIN PC7 + #ifndef Y_CS_PIN + #define Y_CS_PIN PE3 +#endif + +#define Z_STEP_PIN PD15 +#define Z_DIR_PIN PC6 +#define Z_ENABLE_PIN PD14 +#ifndef Z_CS_PIN + #define Z_CS_PIN PE4 +#endif + +#define E0_STEP_PIN PD12 +#define E0_DIR_PIN PD13 +#define E0_ENABLE_PIN PD11 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD7 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #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 Serial1 + //#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 PE2 + #define X_SERIAL_RX_PIN PE2 + + #define Y_SERIAL_TX_PIN PE3 + #define Y_SERIAL_RX_PIN PE3 + + #define Z_SERIAL_TX_PIN PE4 + #define Z_SERIAL_RX_PIN PE4 + + #define E0_SERIAL_TX_PIN PD7 + #define E0_SERIAL_RX_PIN PD7 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA2 // T0 <-> E0 +#define TEMP_1_PIN PA0 // T1 <-> E1 +#define TEMP_BED_PIN PA1 // T2 <-> Bed +#define TEMP_PROBE_PIN PC3 // Shares J4 connector with PD1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PE6 // Heater0 +#define HEATER_BED_PIN PE5 // Hotbed +#define FAN_PIN PB8 // Fan1 +#define FAN1_PIN PB9 // Fan0 + +// HAL SPI1 pins +#define CUSTOM_SPI_PINS +#if ENABLED(CUSTOM_SPI_PINS) + #define SCK_PIN PA5 // SPI1 SCLK + #define SS_PIN PA4 // SPI1 SSEL + #define MISO_PIN PA6 // SPI1 MISO + #define MOSI_PIN PA7 // SPI1 MOSI +#endif + +// +// Misc. Functions +// +#define SDSS PA4 + +/** + * -------------------------------------BTT002 V1.0-------------------------------------------- + * ----- ----- | + * PA3 | · · | GND 5V | · · | GND | + * NRESET | · · | PC4(SD_DET) (LCD_D7) PE13 | · · | PE12 (LCD_D6) | + * (MOSI)PA7 | · · | PB0(BTN_EN2) (LCD_D5) PE11 | · · | PE10 (LCD_D4) | + * (SD_SS)PA4 | · · | PC5(BTN_EN1) (LCD_RS) PE8 | · · | PE9 (LCD_EN) | + * (SCK)PA5 | · · | PA6(MISO) (BTN_ENC) PB1 | · · | PE7 (BEEPER) | + * ----- ----- | + * EXP2 EXP1 | + * -------------------------------------------------------------------------------------------- + */ + +// +// LCDs and Controllers +// +#if HAS_WIRED_LCD + #define BEEPER_PIN PE7 + #define BTN_ENC PB1 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS PE12 + + #define BTN_EN1 PE9 + #define BTN_EN2 PE10 + + #define LCD_PINS_ENABLE PE13 + #define LCD_PINS_D4 PE11 + + #else + + #define LCD_PINS_RS PE8 + + #define BTN_EN1 PC5 + #define BTN_EN2 PB0 + #define SD_DETECT_PIN PC4 + + #define LCD_SDSS PA4 + + #define LCD_PINS_ENABLE PE9 + #define LCD_PINS_D4 PE10 + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE11 + #define LCD_PINS_D6 PE12 + #define LCD_PINS_D7 PE13 + #endif + + #endif + + // Alter timing for graphical display + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +// +// RGB LEDs +// +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB5 +#endif +#ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB4 +#endif +#ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB3 +#endif +#ifndef RGB_LED_W_PIN + #define RGB_LED_W_PIN -1 +#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 new file mode 100644 index 00000000..dc8ce9f2 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -0,0 +1,411 @@ +/** + * 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 + +#if NOT_TARGET(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." +#elif HOTENDS > MAX_EXTRUDERS || E_STEPPERS > MAX_EXTRUDERS + #error "Marlin extruder/hotends limit! Increase MAX_EXTRUDERS to continue." +#endif + +#define BOARD_INFO_NAME "BTT GTR V1.0" + +// Onboard I2C EEPROM +#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24C64 ... 64Kb = 8KB) + +#define TP // Enable to define servo and probe pins + +// +// Servos +// +#if ENABLED(TP) + #define SERVO0_PIN PB11 +#endif + +#define PS_ON_PIN PH6 + +// +// Limit Switches +// +#define X_MIN_PIN PF2 +#define X_MAX_PIN PG14 +#define Y_MIN_PIN PC13 +#define Y_MAX_PIN PG9 +#define Z_MIN_PIN PE0 +#define Z_MAX_PIN PD3 + +// +// Pins on the extender +// +//#define X_MIN_PIN PI4 +//#define X2_MIN_PIN PF12 +//#define Y_MIN_PIN PF4 +//#define Y2_MIN_PIN PI7 +//#define Z_MIN_PIN PF6 + +#if ENABLED(TP) && !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN PH11 // Z Probe must be PH11 +#endif + +// +// Steppers +// +#define X_STEP_PIN PC15 +#define X_DIR_PIN PF0 +#define X_ENABLE_PIN PF1 +#ifndef X_CS_PIN + #define X_CS_PIN PC14 +#endif + +#define Y_STEP_PIN PE3 +#define Y_DIR_PIN PE2 +#define Y_ENABLE_PIN PE4 +#ifndef Y_CS_PIN + #define Y_CS_PIN PE1 +#endif + +#define Z_STEP_PIN PB8 +#define Z_DIR_PIN PB7 // PB7 +#define Z_ENABLE_PIN PB9 +#ifndef Z_CS_PIN + #define Z_CS_PIN PB5 +#endif + +#define E0_STEP_PIN PG12 +#define E0_DIR_PIN PG11 +#define E0_ENABLE_PIN PG13 +#ifndef E0_CS_PIN + #define E0_CS_PIN PG10 +#endif + +#define E1_STEP_PIN PD6 +#define E1_DIR_PIN PD5 +#define E1_ENABLE_PIN PD7 +#ifndef E1_CS_PIN + #define E1_CS_PIN PD4 +#endif + +#define E2_STEP_PIN PD1 +#define E2_DIR_PIN PD0 +#define E2_ENABLE_PIN PD2 +#ifndef E2_CS_PIN + #define E2_CS_PIN PC12 +#endif + +#define E3_STEP_PIN PF3 +#define E3_DIR_PIN PG3 +#define E3_ENABLE_PIN PF8 +#ifndef E3_CS_PIN + #define E3_CS_PIN PG4 +#endif + +#define E4_STEP_PIN PD14 +#define E4_DIR_PIN PD11 +#define E4_ENABLE_PIN PG2 +#ifndef E4_CS_PIN + #define E4_CS_PIN PE15 +#endif + +#define E5_STEP_PIN PE12 +#define E5_DIR_PIN PE10 +#define E5_ENABLE_PIN PF14 +#ifndef E5_CS_PIN + #define E5_CS_PIN PE7 +#endif + +#define E6_STEP_PIN PG0 +#define E6_DIR_PIN PG1 +#define E6_ENABLE_PIN PE8 +#ifndef E6_CS_PIN + #define E6_CS_PIN PF15 +#endif + +#define E7_STEP_PIN PH12 +#define E7_DIR_PIN PH15 +#define E7_ENABLE_PIN PI0 +#ifndef E7_CS_PIN + #define E7_CS_PIN PH14 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PG15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB3 + #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 Serial1 + //#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 + //#define E5_HARDWARE_SERIAL Serial1 + //#define E6_HARDWARE_SERIAL Serial1 + //#define E7_HARDWARE_SERIAL Serial1 + + // + // Software serial + // + #define X_SERIAL_TX_PIN PC14 + #define X_SERIAL_RX_PIN PC14 + + #define Y_SERIAL_TX_PIN PE1 + #define Y_SERIAL_RX_PIN PE1 + + #define Z_SERIAL_TX_PIN PB5 + #define Z_SERIAL_RX_PIN PB5 + + #define E0_SERIAL_TX_PIN PG10 + #define E0_SERIAL_RX_PIN PG10 + + #define E1_SERIAL_TX_PIN PD4 + #define E1_SERIAL_RX_PIN PD4 + + #define E2_SERIAL_TX_PIN PC12 + #define E2_SERIAL_RX_PIN PC12 + + #define E3_SERIAL_TX_PIN PG4 + #define E3_SERIAL_RX_PIN PG4 + + #define E4_SERIAL_TX_PIN PE15 + #define E4_SERIAL_RX_PIN PE15 + + #define E5_SERIAL_TX_PIN PE7 + #define E5_SERIAL_RX_PIN PE7 + + #define E6_SERIAL_TX_PIN PF15 + #define E6_SERIAL_RX_PIN PF15 + + #define E7_SERIAL_TX_PIN PH14 + #define E7_SERIAL_RX_PIN PH14 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // T1 <-> E0 +#define TEMP_1_PIN PC2 // T2 <-> E1 +#define TEMP_2_PIN PC3 // T3 <-> E2 + +#define TEMP_3_PIN PA3 // T4 <-> E3 +#define TEMP_4_PIN PF9 // T5 <-> E4 +#define TEMP_5_PIN PF10 // T6 <-> E5 +#define TEMP_6_PIN PF7 // T7 <-> E6 +#define TEMP_7_PIN PF5 // T8 <-> E7 + +#define TEMP_BED_PIN PC0 // T0 <-> Bed + +// SPI for Max6675 or Max31855 Thermocouple +// Uses a separate SPI bus +// If you have a two-way thermocouple, you can customize two THERMO_CSx_PIN pins (x:1~2) + +#define THERMO_SCK_PIN PI1 // SCK +#define THERMO_DO_PIN PI2 // MISO +#define THERMO_CS1_PIN PH9 // CS1 +#define THERMO_CS2_PIN PH2 // CS2 + +#define MAX6675_SS_PIN THERMO_CS1_PIN +#define MAX6675_SS2_PIN THERMO_CS2_PIN +#define MAX6675_SCK_PIN THERMO_SCK_PIN +#define MAX6675_DO_PIN THERMO_DO_PIN + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB1 // Heater0 +#define HEATER_1_PIN PA1 // Heater1 +#define HEATER_2_PIN PB0 // Heater2 + +#define HEATER_3_PIN PD15 // Heater3 +#define HEATER_4_PIN PD13 // Heater4 +#define HEATER_5_PIN PD12 // Heater5 +#define HEATER_6_PIN PE13 // Heater6 +#define HEATER_7_PIN PI6 // Heater7 + +#define HEATER_BED_PIN PA2 // Hotbed + +#define FAN_PIN PE5 // Fan0 +#define FAN1_PIN PE6 // Fan1 +#define FAN2_PIN PC8 // Fan2 + +#define FAN3_PIN PI5 // Fan3 +#define FAN4_PIN PE9 // Fan4 +#define FAN5_PIN PE11 // Fan5 +//#define FAN6_PIN PC9 // Fan6 +//#define FAN7_PIN PE14 // Fan7 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +// +// By default the LCD SD (SPI2) is enabled +// Onboard SD is on a completely separate SPI bus, and requires +// overriding pins to access. +// +#if SD_CONNECTION_IS(LCD) + + #define SD_DETECT_PIN PB10 + #define SDSS PB12 + +#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 SS_PIN SDSS + #define SCK_PIN PA5 + #define MISO_PIN PA6 + #define MOSI_PIN PA7 + #define SD_DETECT_PIN PC4 + +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" +#endif + +/** + * ----- ----- + * NC | · · | GND 5V | · · | GND + * RESET | · · | PB10(SD_DETECT) (LCD_D7) PG5 | · · | PG6 (LCD_D6) + * (MOSI)PB15 | · · | PH10(BTN_EN2) (LCD_D5) PG7 | · · | PG8 (LCD_D4) + * (SD_SS)PB12 | · · | PD10(BTN_EN1) (LCD_RS) PA8 | · · | PC10 (LCD_EN) + * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA15 | · · | PC11 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +// +// LCDs and Controllers +// +#if HAS_WIRED_LCD + #define BEEPER_PIN PC11 + #define BTN_ENC PA15 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS PG6 + + #define BTN_EN1 PC10 + #define BTN_EN2 PG8 + + #define LCD_PINS_ENABLE PG5 + #define LCD_PINS_D4 PG7 + + // 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 + #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 + + #define BTN_EN1 PD10 + #define BTN_EN2 PH10 + + #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) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PG7 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PG6 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PG5 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN PF13 + #endif + #endif // !FYSETC_MINI_12864 + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PG7 + #define LCD_PINS_D6 PG6 + #define LCD_PINS_D7 PG5 + #endif + + #endif + + // Alter timing for graphical display + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +#undef TP 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 new file mode 100644 index 00000000..fb4b17b6 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_1.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 + +#if HOTENDS > 3 || E_STEPPERS > 3 + #error "BIGTREE SKR Pro V1.1 supports up to 3 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "BTT SKR Pro V1.1" + +#include "pins_BTT_SKR_PRO_common.h" 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 new file mode 100644 index 00000000..615751b6 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_V1_2.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 + +#if HOTENDS > 3 || E_STEPPERS > 3 + #error "BIGTREE SKR Pro V1.2 supports up to 3 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "BTT SKR Pro V1.2" + +#include "pins_BTT_SKR_PRO_common.h" diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h new file mode 100644 index 00000000..83fd987d --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -0,0 +1,394 @@ +/** + * 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 + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#endif + +// Use one of these or SDCard-based Emulation will be used +#if NO_EEPROM_SELECTED + //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#endif + +// +// Servos +// +#define SERVO0_PIN PA1 +#define SERVO1_PIN PC9 + +// +// Trinamic Stallguard pins +// +#define X_DIAG_PIN PB10 // X- +#define Y_DIAG_PIN PE12 // Y- +#define Z_DIAG_PIN PG8 // Z- +#define E0_DIAG_PIN PE15 // E0 +#define E1_DIAG_PIN PE10 // E1 +#define E2_DIAG_PIN PG5 // E2 + +// +// Limit Switches +// +#ifdef X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_DIR < 0 + #define X_MAX_PIN PE15 // E0 + #else + #define X_MIN_PIN PE15 // E0 + #endif +#else + #define X_MIN_PIN PB10 // X- + #define X_MAX_PIN PE15 // E0 +#endif + +#ifdef Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_DIR < 0 + #define Y_MAX_PIN PE10 // E1 + #else + #define Y_MIN_PIN PE10 // E1 + #endif +#else + #define Y_MIN_PIN PE12 // Y- + #define Y_MAX_PIN PE10 // E1 +#endif + +#ifdef Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_DIR < 0 + #define Z_MAX_PIN PG5 // E2 + #else + #define Z_MIN_PIN PG5 // E2 + #endif +#else + #define Z_MIN_PIN PG8 // Z- + #define Z_MAX_PIN PG5 // E2 +#endif + +// +// Z Probe must be this pin +// +#ifndef Z_MIN_PROBE_PIN + #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 +// +#define X_STEP_PIN PE9 +#define X_DIR_PIN PF1 +#define X_ENABLE_PIN PF2 +#ifndef X_CS_PIN + #define X_CS_PIN PA15 +#endif + +#define Y_STEP_PIN PE11 +#define Y_DIR_PIN PE8 +#define Y_ENABLE_PIN PD7 + #ifndef Y_CS_PIN + #define Y_CS_PIN PB8 +#endif + +#define Z_STEP_PIN PE13 +#define Z_DIR_PIN PC2 +#define Z_ENABLE_PIN PC0 +#ifndef Z_CS_PIN + #define Z_CS_PIN PB9 +#endif + +#define E0_STEP_PIN PE14 +#define E0_DIR_PIN PA0 +#define E0_ENABLE_PIN PC3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PB3 +#endif + +#define E1_STEP_PIN PD15 +#define E1_DIR_PIN PE7 +#define E1_ENABLE_PIN PA3 +#ifndef E1_CS_PIN + #define E1_CS_PIN PG15 +#endif + +#define E2_STEP_PIN PD13 +#define E2_DIR_PIN PG9 +#define E2_ENABLE_PIN PF0 +#ifndef E2_CS_PIN + #define E2_CS_PIN PG12 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PC12 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PC11 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PC10 + #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 Serial1 + //#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 PC13 + #define X_SERIAL_RX_PIN PC13 + + #define Y_SERIAL_TX_PIN PE3 + #define Y_SERIAL_RX_PIN PE3 + + #define Z_SERIAL_TX_PIN PE1 + #define Z_SERIAL_RX_PIN PE1 + + #define E0_SERIAL_TX_PIN PD4 + #define E0_SERIAL_RX_PIN PD4 + + #define E1_SERIAL_TX_PIN PD1 + #define E1_SERIAL_RX_PIN PD1 + + #define E2_SERIAL_TX_PIN PD6 + #define E2_SERIAL_RX_PIN PD6 + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PF4 // T1 <-> E0 +#define TEMP_1_PIN PF5 // T2 <-> E1 +#define TEMP_2_PIN PF6 // T3 <-> E2 +#define TEMP_BED_PIN PF3 // T0 <-> Bed + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB1 // Heater0 +#define HEATER_1_PIN PD14 // Heater1 +#define HEATER_2_PIN PB0 // Heater1 +#define HEATER_BED_PIN PD12 // Hotbed +#define FAN_PIN PC8 // Fan0 +#define FAN1_PIN PE5 // Fan1 +#define FAN2_PIN PE6 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN FAN1_PIN +#endif + +// +// Misc. Functions +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION LCD +#endif + +// +// Onboard SD card +// Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 +// +#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) + #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" +#endif + +/** + * ----- ----- + * NC | · · | GND 5V | · · | GND + * RESET | · · | PF12(SD_DETECT) (LCD_D7) PG7 | · · | PG6 (LCD_D6) + * (MOSI)PB15 | · · | PF11(BTN_EN2) (LCD_D5) PG3 | · · | PG2 (LCD_D4) + * (SD_SS)PB12 | · · | PG10(BTN_EN1) (LCD_RS) PD10 | · · | PD11 (LCD_EN) + * (SCK)PB13 | · · | PB14(MISO) (BTN_ENC) PA8 | · · | PG4 (BEEPER) + * ----- ----- + * EXP2 EXP1 + */ + +// +// LCDs and Controllers +// +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS PG10 + #endif + +#elif HAS_WIRED_LCD + + #define BEEPER_PIN PG4 + #define BTN_ENC PA8 + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS PG6 + + #define BTN_EN1 PD11 + #define BTN_EN2 PG2 + + #define LCD_PINS_ENABLE PG7 + #define LCD_PINS_D4 PG3 + + // 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 + #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 LCD_PINS_ENABLE PD11 + #define LCD_PINS_D4 PG2 + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS PD11 + #define DOGLCD_A0 PD10 + //#define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN PG2 // 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 PG3 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PG6 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PG7 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN PG3 + #endif + #endif // !FYSETC_MINI_12864 + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PG3 + #define LCD_PINS_D6 PG6 + #define LCD_PINS_D7 PG7 + #endif + + #endif + +#endif // HAS_WIRED_LCD + +// Alter timing for graphical display +#if HAS_MARLINUI_U8GLIB + #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 + +// +// WIFI +// + +/** + * ----- + * TX | 1 2 | GND Enable PG1 // Must be high for module to run + * Enable | 3 4 | GPIO2 Reset PG0 // active low, probably OK to leave floating + * Reset | 5 6 | GPIO0 GPIO2 PF15 // must be high (ESP3D software configures this with a pullup so OK to leave as floating) + * 3.3V | 7 8 | RX GPIO0 PF14 // Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) + * ----- + * W1 + */ +#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 +#define ESP_WIFI_MODULE_GPIO0_PIN PF14 +#define ESP_WIFI_MODULE_GPIO2_PIN PF15 diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h new file mode 100644 index 00000000..808751d7 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -0,0 +1,292 @@ +/** + * 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 + +#if NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 6 || E_STEPPERS > 6 + #error "FLYF407ZG supports up to 6 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "FLYF407ZG" +#define BOARD_WEBSITE_URL "github.com/FLYmaker/FLYF407ZG" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// +// 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 +// +#define SERVO0_PIN PE11 + +// +// Limit Switches +// +#define X_MIN_PIN PC3 +#define X_MAX_PIN PC2 +#define Y_MIN_PIN PF2 +#define Y_MAX_PIN PF1 +#define Z_MIN_PIN PF0 +#define Z_MAX_PIN PC15 + +// +// Z Probe (when not Z_MIN_PIN) +// +#define Z_MIN_PROBE_PIN PC14 // Z3_PIN + +// +// Steppers +// + +#define X_STEP_PIN PB9 +#define X_DIR_PIN PE0 +#define X_ENABLE_PIN PE1 +#ifndef X_CS_PIN + #define X_CS_PIN PG13 +#endif + +#define Y_STEP_PIN PB8 +#define Y_DIR_PIN PG11 +#define Y_ENABLE_PIN PG12 +#ifndef Y_CS_PIN + #define Y_CS_PIN PG10 +#endif + +#define Z_STEP_PIN PA8 +#define Z_DIR_PIN PD6 +#define Z_ENABLE_PIN PD7 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD5 +#endif + +#define E0_STEP_PIN PC7 +#define E0_DIR_PIN PD3 +#define E0_ENABLE_PIN PD4 +#ifndef E0_CS_PIN + #define E0_CS_PIN PD1 +#endif + +#define E1_STEP_PIN PC6 +#define E1_DIR_PIN PA15 +#define E1_ENABLE_PIN PD0 +#ifndef E1_CS_PIN + #define E1_CS_PIN PA14 +#endif + +#define E2_STEP_PIN PD15 +#define E2_DIR_PIN PG7 +#define E2_ENABLE_PIN PG8 +#ifndef E2_CS_PIN + #define E2_CS_PIN PG6 +#endif + +#define E3_STEP_PIN PD14 +#define E3_DIR_PIN PG4 +#define E3_ENABLE_PIN PG5 +#ifndef E3_CS_PIN + #define E3_CS_PIN PG3 +#endif + +#define E4_STEP_PIN PD13 +#define E4_DIR_PIN PD11 +#define E4_ENABLE_PIN PG2 +#ifndef E4_CS_PIN + #define E4_CS_PIN PD10 +#endif + +#define E5_STEP_PIN PD12 +#define E5_DIR_PIN PD8 +#define E5_ENABLE_PIN PD9 +#ifndef E5_CS_PIN + #define E5_CS_PIN PB12 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // Analog Input +#define TEMP_1_PIN PC1 // Analog Input +#define TEMP_2_PIN PC0 // Analog Input +#define TEMP_3_PIN PF10 // Analog Input +#define TEMP_4_PIN PF5 // Analog Input +#define TEMP_5_PIN PF4 // Analog Input +#define TEMP_BED_PIN PF3 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN PF7 +#define HEATER_1_PIN PF6 +#define HEATER_2_PIN PE6 +#define HEATER_3_PIN PE5 +#define HEATER_4_PIN PE4 +#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 PA2 +#define FAN3_PIN PA1 +#define FAN4_PIN PE13 +#define FAN5_PIN PB11 + +// +// Onboard SD support +// + +#define SDIO_D0_PIN PC8 +#define SDIO_D1_PIN PC9 +//#define SD_CARD_DETECT_PIN PC13 +#define SDIO_D2_PIN PC10 +#define SDIO_D3_PIN PC11 +#define SDIO_CK_PIN PC12 +#define SDIO_CMD_PIN PD2 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + + #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 + #define SCK_PIN SDIO_CK_PIN + #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 + +// +// Trinamic Software SPI +// + +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB15 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB14 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB13 + #endif +#endif + +// +// Trinamic Software Serial +// + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PG13 + #define X_SERIAL_RX_PIN PG13 + + #define Y_SERIAL_TX_PIN PG10 + #define Y_SERIAL_RX_PIN PG10 + + #define Z_SERIAL_TX_PIN PD5 + #define Z_SERIAL_RX_PIN PD5 + + #define E0_SERIAL_TX_PIN PD1 + #define E0_SERIAL_RX_PIN PD1 + + #define E1_SERIAL_TX_PIN PA14 + #define E1_SERIAL_RX_PIN PA14 + + #define E2_SERIAL_TX_PIN PG6 + #define E2_SERIAL_RX_PIN PG6 + + #define E3_SERIAL_TX_PIN PG3 + #define E3_SERIAL_RX_PIN PG3 + + #define E4_SERIAL_TX_PIN PD10 + #define E4_SERIAL_RX_PIN PD10 + + #define E5_SERIAL_TX_PIN PB12 + #define E5_SERIAL_RX_PIN PB12 + +#endif + +// +// LCD / Controller +// + +#define BEEPER_PIN PB10 +#define LCD_PINS_RS PE12 +#define LCD_PINS_ENABLE PE14 +#define LCD_PINS_D4 PE10 +#define LCD_PINS_D5 PE9 +#define LCD_PINS_D6 PE8 +#define LCD_PINS_D7 PE7 +#define BTN_EN1 PC4 +#define BTN_EN2 PC5 +#define BTN_ENC PE15 + +// +// Filament runout +// + +#define FIL_RUNOUT_PIN PA3 + +// +// ST7920 Delays +// +#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 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h new file mode 100644 index 00000000..151f6c3b --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -0,0 +1,289 @@ +/** + * 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 + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 3 || E_STEPPERS > 3 + #error "RUMBA32 supports up to 3 hotends / E-steppers." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "FYSETC S6" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +// Change the priority to 3. Priority 2 is for software serial. +//#define TEMP_TIMER_IRQ_PRIO 3 + +// +// 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 + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#elif ENABLED(I2C_EEPROM) + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Servos +// +#define SERVO0_PIN PA3 + +// +// Limit Switches +// +#define X_MIN_PIN PB14 +#define X_MAX_PIN PA1 +#define Y_MIN_PIN PB13 +#define Y_MAX_PIN PA2 +#define Z_MIN_PIN PA0 +#define Z_MAX_PIN PA3 + +// +// Filament Sensor +// share with X_MAX_PIN +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PA1 +#endif + +// +// Steppers +// +#define X_STEP_PIN PE11 +#define X_DIR_PIN PE10 +#ifndef X_ENABLE_PIN + #define X_ENABLE_PIN PE12 +#endif +#define X_CS_PIN PE7 + +#define Y_STEP_PIN PD8 +#define Y_DIR_PIN PB12 +#define Y_ENABLE_PIN PD9 +#define Y_CS_PIN PE15 + +#define Z_STEP_PIN PD14 +#define Z_DIR_PIN PD13 +#define Z_ENABLE_PIN PD15 +#define Z_CS_PIN PD10 + +#define E0_STEP_PIN PD5 +#define E0_DIR_PIN PD6 +#define E0_ENABLE_PIN PD4 +#define E0_CS_PIN PD7 + +#define E1_STEP_PIN PE6 +#define E1_DIR_PIN PC13 +#define E1_ENABLE_PIN PE5 +#define E1_CS_PIN PC14 + +#define E2_STEP_PIN PE2 +#define E2_DIR_PIN PE4 +#define E2_ENABLE_PIN PE3 +#define E2_CS_PIN PC15 + +#if HAS_TMC_UART + // + // TMC2208/TMC2209 stepper drivers + // + + // + // Software serial + // + #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 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 +#define TEMP_1_PIN PC1 +#define TEMP_2_PIN PC2 +#define TEMP_BED_PIN PC3 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB3 +#define HEATER_1_PIN PB4 +#define HEATER_2_PIN PB15 +#define HEATER_BED_PIN PC8 + +#define FAN_PIN PB0 +#define FAN1_PIN PB1 +#define FAN2_PIN PB2 + +// +// SPI +// +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +// +// Misc. Functions +// +//#define LED_PIN PB14 +//#define BTN_PIN PC10 +//#define PS_ON_PIN PE11 +//#define KILL_PIN PC5 + +#define SDSS PA4 +#define SD_DETECT_PIN PB10 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + #define BEEPER_PIN PC9 + #define BTN_ENC PA8 + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS PD0 + + #define BTN_EN1 PC11 + #define BTN_EN2 PC10 + + #define LCD_PINS_ENABLE PD1 + #define LCD_PINS_D4 PC12 + + // CR10_STOCKDISPLAY default timing is too fast + #undef BOARD_ST7920_DELAY_1 + #undef BOARD_ST7920_DELAY_2 + #undef BOARD_ST7920_DELAY_3 + + #else + + #define LCD_PINS_RS PD2 + + #define BTN_EN1 PC6 + #define BTN_EN2 PC7 + + #define LCD_SDSS PA4 + + #define LCD_PINS_ENABLE PC11 + #define LCD_PINS_D4 PC10 + + #if ENABLED(FYSETC_MINI_12864) + // See https://wiki.fysetc.com/Mini12864_Panel + #define DOGLCD_CS PC11 + #define DOGLCD_A0 PD2 + #if ENABLED(FYSETC_GENERIC_12864_1_1) + #define LCD_BACKLIGHT_PIN PD0 + #endif + #define LCD_RESET_PIN PC10 // 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 PC12 + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PD0 + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PD1 + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN PC12 + #endif + #endif // !FYSETC_MINI_12864 + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PC12 + #define LCD_PINS_D6 PD0 + #define LCD_PINS_D7 PD1 + #endif + + #endif + + // Alter timing for graphical display + #if HAS_MARLINUI_U8GLIB + #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_WIRED_LCD + +#ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN PB6 +#endif +#ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN PB5 +#endif +#ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN PB7 +#endif +#ifndef RGB_LED_W_PIN + #define RGB_LED_W_PIN -1 +#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 00000000..021ef1d5 --- /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" diff --git a/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h new file mode 100644 index 00000000..4acfd743 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_GENERIC_STM32F4.h @@ -0,0 +1,197 @@ +/** + * 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 + +/** + * To build with Arduino IDE use "Discovery F407VG" + * To build with PlatformIO use environment "STM32F4" + */ +#if NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "STM32F4 supports up to 2 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Misc. STM32F4" +#define DEFAULT_MACHINE_NAME "STM32F407VET6" + +//#define I2C_EEPROM + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Limit Switches +// +#define X_MIN_PIN PE0 +#define X_MAX_PIN -1 +#define Y_MIN_PIN PE1 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN PE14 +#define Z_MAX_PIN -1 + +// +// Z Probe (when not Z_MIN_PIN) +// + +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN PA4 +//#endif + +// +// Steppers +// + +#define X_STEP_PIN PD3 +#define X_DIR_PIN PD2 +#define X_ENABLE_PIN PD0 +//#ifndef X_CS_PIN +// #define X_CS_PIN PD1 +//#endif + +#define Y_STEP_PIN PE11 +#define Y_DIR_PIN PE10 +#define Y_ENABLE_PIN PE13 +//#ifndef Y_CS_PIN +// #define Y_CS_PIN PE12 +//#endif + +#define Z_STEP_PIN PD6 +#define Z_DIR_PIN PD7 +#define Z_ENABLE_PIN PD4 +//#ifndef Z_CS_PIN +// #define Z_CS_PIN PD5 +//#endif + +#define E0_STEP_PIN PB5 +#define E0_DIR_PIN PB6 +#define E0_ENABLE_PIN PB3 +//#ifndef E0_CS_PIN +// #define E0_CS_PIN PB4 +//#endif + +#define E1_STEP_PIN PE4 +#define E1_DIR_PIN PE2 +#define E1_ENABLE_PIN PE3 +//#ifndef E1_CS_PIN +// #define E1_CS_PIN PE5 +//#endif + +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +// +// Temperature Sensors +// + +#define TEMP_0_PIN PC0 // Analog Input +#define TEMP_1_PIN PC1 // Analog Input +#define TEMP_BED_PIN PC2 // Analog Input + +// +// Heaters / Fans +// + +#define HEATER_0_PIN PA1 +#define HEATER_1_PIN PA2 +#define HEATER_BED_PIN PA0 + +#ifndef FAN_PIN + #define FAN_PIN PC6 +#endif +#define FAN1_PIN PC7 +#define FAN2_PIN PC8 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PC7 +#endif + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Průša i3 MK2 Multi Material Multiplexer Support +// + +//#define E_MUX0_PIN PG3 +//#define E_MUX1_PIN PG4 + +// +// Servos +// + +//#define SERVO0_PIN PE13 +//#define SERVO1_PIN PE14 + +#define SDSS PE7 +#define SS_PIN PE7 +#define LED_PIN PB7 //Alive +#define PS_ON_PIN PA10 +#define KILL_PIN PA8 +#define PWR_LOSS PA4 //Power loss / nAC_FAULT + +// +// LCD / Controller +// + +#define SD_DETECT_PIN PA15 +#define BEEPER_PIN PC9 +#define LCD_PINS_RS PE9 +#define LCD_PINS_ENABLE PE8 +#define LCD_PINS_D4 PB12 +#define LCD_PINS_D5 PB13 +#define LCD_PINS_D6 PB14 +#define LCD_PINS_D7 PB15 +#define BTN_EN1 PC4 +#define BTN_EN2 PC5 +#define BTN_ENC PC3 + +// +// Filament runout +// + +#define FIL_RUNOUT_PIN PA3 + +// +// ST7920 Delays +// +#if HAS_MARLINUI_U8GLIB + #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 new file mode 100644 index 00000000..48973688 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -0,0 +1,180 @@ +/** + * 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 NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "LERDGE K supports up to 2 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "Lerdge K" +#define DEFAULT_MACHINE_NAME "LERDGE" + +#define I2C_EEPROM + +// +// Servos +// +//#define SERVO0_PIN PB11 + +// +// Limit Switches +// +#define X_STOP_PIN PG3 +#define Y_STOP_PIN PG4 +#define Z_STOP_PIN PG5 + +// +// Z Probe (when not Z_MIN_PIN) +// +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN PG6 +//#endif + +// +// Filament runout +// +#define FIL_RUNOUT_PIN PE5 +#define FIL_RUNOUT2_PIN PE6 + +// +// Steppers +// +#define X_STEP_PIN PG1 +#define X_DIR_PIN PB10 +#define X_ENABLE_PIN PG0 +//#ifndef X_CS_PIN +// #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 +//#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 +//#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 +//#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 +//#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // Analog Input +#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 +// +#define HEATER_0_PIN PA1 +#define HEATER_1_PIN PA0 +#define HEATER_BED_PIN PA2 + +#ifndef FAN_PIN + #define FAN_PIN PF7 +#endif +#define FAN1_PIN PF6 +#define FAN2_PIN PF8 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PF6 +#endif + +// +// LED / Lighting +// +//#define CASE_LIGHT_PIN_CI -1 +//#define CASE_LIGHT_PIN_DO -1 +//#define NEOPIXEL_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 +// +#define SDIO_SUPPORT + +// +// Misc. Functions +// +#define SDSS PC11 +#define LED_PIN PA15 // Alive +#define PS_ON_PIN -1 +#define KILL_PIN -1 +#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 +// + +#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 00000000..0600ed43 --- /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 NOT_TARGET(STM32F4, 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 + +// +// Průša 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 new file mode 100644 index 00000000..bed51ca6 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -0,0 +1,151 @@ +/** + * 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 NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#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 STEP_TIMER 4 +#define TEMP_TIMER 2 + +#define I2C_EEPROM + +// +// Servos +// +//#define SERVO0_PIN PD13 + +// +// Limit Switches +// +#define X_STOP_PIN PB12 +#define Y_STOP_PIN PB13 +#define Z_STOP_PIN PB14 + +// +// Filament runout +// +#define FIL_RUNOUT_PIN PE1 + +// +// Z Probe (when not Z_MIN_PIN) +// +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN PB15 +//#endif + +// +// Steppers +// +#define X_STEP_PIN PB10 +#define X_DIR_PIN PB2 +#define X_ENABLE_PIN PB11 + +#define Y_STEP_PIN PB0 +#define Y_DIR_PIN PC5 +#define Y_ENABLE_PIN PB1 + +#define Z_STEP_PIN PA7 +#define Z_DIR_PIN PA6 +#define Z_ENABLE_PIN PC4 + +#define E0_STEP_PIN PA4 +#define E0_DIR_PIN PA3 +#define E0_ENABLE_PIN PA5 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC0 // Analog Input +#define TEMP_1_PIN -1 // Analog Input +#define TEMP_BED_PIN PC1 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA1 +#define HEATER_1_PIN -1 +#define HEATER_BED_PIN PA2 + +//#ifndef FAN_PIN +// #define FAN_PIN PC15 +//#endif +#define FAN1_PIN PC15 +#define FAN2_PIN PA0 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PC15 // FAN1_PIN +#endif + +// +// LED / Lighting +// +//#define CASE_LIGHT_PIN_CI -1 +//#define CASE_LIGHT_PIN_DO -1 +//#define NEOPIXEL_PIN -1 + +// +// Misc. Functions +// +#define SDSS PC11 +#define LED_PIN PC7 // Alive +#define PS_ON_PIN -1 +#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 SCK_PIN PC12 +#define MISO_PIN PC8 +#define MOSI_PIN PD2 +#define SS_PIN PC11 + +// +// SD support +// +#define SDIO_SUPPORT +#define SD_DETECT_PIN PA8 + +// +// LCD / Controller +// + +// The LCD is initialized in FSMC mode +#define BEEPER_PIN PD12 + +#define BTN_EN1 PE3 +#define BTN_EN2 PE4 +#define BTN_ENC PE2 + +#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/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h new file mode 100644 index 00000000..c2f5f324 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h @@ -0,0 +1,101 @@ +/** + * 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 + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "MKS_ROBIN2 supports up to 2 hotends / E-steppers." +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "MKS_ROBIN2" +#endif + +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +#define SRAM_EEPROM_EMULATION + +// +// Limit Switches +// +#define X_MIN_PIN PG8 +#define X_MAX_PIN PG7 +#define Y_MIN_PIN PG6 +#define Y_MAX_PIN PG5 +#define Z_MIN_PIN PG4 +#define Z_MAX_PIN PG3 + +// +// Servos +// +#define SERVO0_PIN PB0 // XS2-5 +#define SERVO1_PIN PF7 // XS1-5 +#define SERVO2_PIN PF8 // XS1-6 + +// +// Steppers +// +#define X_STEP_PIN PE6 +#define X_DIR_PIN PE5 +#define X_ENABLE_PIN PC13 + +#define Y_STEP_PIN PE3 +#define Y_DIR_PIN PE2 +#define Y_ENABLE_PIN PE4 + +#define Z_STEP_PIN PE0 +#define Z_DIR_PIN PB9 +#define Z_ENABLE_PIN PE1 + +#define E0_STEP_PIN PG10 +#define E0_DIR_PIN PG9 +#define E0_ENABLE_PIN PB8 + +#define E1_STEP_PIN PD3 +#define E1_DIR_PIN PA15 +#define E1_ENABLE_PIN PD6 + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC1 // T1 <-> E0 +#define TEMP_1_PIN PC2 // T2 <-> E1 +#define TEMP_BED_PIN PC0 // T0 <-> Bed + +// +// Heaters / Fans +// +#define HEATER_0_PIN PF3 // Heater0 +#define HEATER_1_PIN PF2 // Heater1 +#define HEATER_BED_PIN PF4 // Hotbed +#define FAN_PIN PA7 // Fan0 + +// +// Misc. Functions +// +#define SDSS -1 // PB12 + +#define SD_DETECT_PIN PF9 +#define BEEPER_PIN PG2 diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h new file mode 100644 index 00000000..a60a2781 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_AUS3D.h @@ -0,0 +1,78 @@ +/** + * 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 + +/** + * Pin assignments for the RUMBA32 + * + * https://aus3d.com.au/rumba32 + * https://github.com/Aus3D/RUMBA32 + */ + +#define BOARD_INFO_NAME "RUMBA32" + +#if NO_EEPROM_SELECTED + #if MB(RUMBA32_V1_0) + #define FLASH_EEPROM_EMULATION + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB + #elif MB(RUMBA32_V1_1) + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x2000 // 8KB (24LC64T-I/OT) + #endif +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#endif + +#include "pins_RUMBA32_common.h" + +#if MB(RUMBA32_V1_1) + + #define SERVO0_PIN PA15 + #undef BTN_PIN + + #if HAS_TMC_UART + // + // TMC2208/TMC2209 stepper drivers - Software Serial is used according to below pins + // + #define X_SERIAL_TX_PIN PA14 + #define X_SERIAL_RX_PIN PC14 + + #define Y_SERIAL_TX_PIN PA13 + #define Y_SERIAL_RX_PIN PE4 + + #define Z_SERIAL_TX_PIN PB10 + #define Z_SERIAL_RX_PIN PE0 + + #define E0_SERIAL_TX_PIN PD11 + #define E0_SERIAL_RX_PIN PC13 + + #define E1_SERIAL_TX_PIN PB3 + #define E1_SERIAL_RX_PIN PD5 + + #define E2_SERIAL_TX_PIN PB4 + #define E2_SERIAL_RX_PIN PD1 + #endif +#endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h new file mode 100644 index 00000000..ab277d43 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_MKS.h @@ -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 . + * + */ +#pragma once + +/** + * Pin assignments for the MKS RUMBA32 + * + * https://github.com/makerbase-mks/MKS-RUMBA32 + * + * The MKS and Aus3D versions have the same pinout but the MKS version + * has some added resistors and LEDs. The resistors needed for the + * TMC2208/9 UART interface are among the additions. Also added were + * connectors and resistors dedicated to the TMC2130 sensorless homing + * interface. + */ + +#define BOARD_INFO_NAME "MKS RUMBA32" + +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#endif + +#define ENABLE_SPI1 + +#include "pins_RUMBA32_common.h" + +#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 Serial1 + //#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 PA3 + #define X_SERIAL_RX_PIN PC14 + + #define Y_SERIAL_TX_PIN PA4 + #define Y_SERIAL_RX_PIN PE4 + + #define Z_SERIAL_TX_PIN PD13 + #define Z_SERIAL_RX_PIN PE0 + + #define E0_SERIAL_TX_PIN PD14 + #define E0_SERIAL_RX_PIN PC13 + + #define E1_SERIAL_TX_PIN PD15 + #define E1_SERIAL_RX_PIN PD5 + + #define E2_SERIAL_TX_PIN PD12 + #define E2_SERIAL_RX_PIN PD1 +#endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h new file mode 100644 index 00000000..d52bb11d --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -0,0 +1,183 @@ +/** + * 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 + +/** + * Common pin assignments for all RUMBA32 boards + */ + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 3 || E_STEPPERS > 3 + #error "RUMBA32 boards support up to 3 hotends / E-steppers." +#endif + +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +// Use soft PWM for fans - PWM is not working properly when paired with STM32 Arduino Core v1.7.0 +// This can be removed when Core version is updated and PWM behaviour is fixed. +#define FAN_SOFT_PWM + +// +// Configure Timers +// TIM6 is used for TONE +// TIM7 is used for SERVO +// 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 + +// +// Limit Switches +// +#define X_MIN_PIN PB12 +#define X_MAX_PIN PB13 +#define Y_MIN_PIN PB15 +#define Y_MAX_PIN PD8 +#define Z_MIN_PIN PD9 +#define Z_MAX_PIN PD10 + +// +// Steppers +// +#define X_STEP_PIN PA0 +#define X_DIR_PIN PC15 +#define X_ENABLE_PIN PC11 +#define X_CS_PIN PC14 + +#define Y_STEP_PIN PE5 +#define Y_DIR_PIN PE6 +#define Y_ENABLE_PIN PE3 +#define Y_CS_PIN PE4 + +#define Z_STEP_PIN PE1 +#define Z_DIR_PIN PE2 +#define Z_ENABLE_PIN PB7 +#define Z_CS_PIN PE0 + +#define E0_STEP_PIN PB5 +#define E0_DIR_PIN PB6 +#define E0_ENABLE_PIN PC12 +#define E0_CS_PIN PC13 + +#define E1_STEP_PIN PD6 +#define E1_DIR_PIN PD7 +#define E1_ENABLE_PIN PD4 +#define E1_CS_PIN PD5 + +#define E2_STEP_PIN PD2 +#define E2_DIR_PIN PD3 +#define E2_ENABLE_PIN PD0 +#define E2_CS_PIN PD1 + +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PA7 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PA6 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PA5 + #endif +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PC4 +#define TEMP_1_PIN PC3 +#define TEMP_2_PIN PC2 +#define TEMP_3_PIN PC1 +#define TEMP_BED_PIN PC0 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PC6 +#define HEATER_1_PIN PC7 +#define HEATER_2_PIN PC8 +#define HEATER_BED_PIN PA1 + +#define FAN_PIN PC9 +#define FAN1_PIN PA8 + +// +// SPI +// +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +// +// Misc. Functions +// +#define LED_PIN PB14 +#define BTN_PIN PC10 +#define PS_ON_PIN PE11 +#define KILL_PIN PC5 + +#define SDSS PA2 +#define SD_DETECT_PIN PB0 +#define BEEPER_PIN PE8 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define BTN_EN1 PB2 + #define BTN_EN2 PB1 + #define BTN_ENC PE7 + + #define LCD_PINS_RS PE10 + #define LCD_PINS_ENABLE PE9 + #define LCD_PINS_D4 PE12 + + #if ENABLED(MKS_MINI_12864) + #define DOGLCD_CS PE13 + #define DOGLCD_A0 PE14 + #endif + + #if ENABLED(ULTIPANEL) + #define LCD_PINS_D5 PE13 + #define LCD_PINS_D6 PE14 + #define LCD_PINS_D7 PE15 + #endif + + // Alter timing for graphical display + #if HAS_MARLINUI_U8GLIB + #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 diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h new file mode 100644 index 00000000..0278dd84 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h @@ -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 . + * + */ + +// Source: https://github.com/stm32duino/Arduino_Core_STM32/blob/master/variants/ST3DP001_EVAL/variant.cpp + +/** + * HOW TO COMPILE + * + * PlatformIO - Use the STM32F401VE_STEVAL environment (or the "Auto Build Marlin" extension). + * + * Arduino - Tested with 1.8.10 + * Install library per https://github.com/stm32duino/Arduino_Core_STM32 + * Make the following selections under the TOOL menu in the Arduino IDE + * Board: "3D printer boards" + * Board part number: "STEVAL-3DP001V1" + * U(S)ART support: "Enabled (generic "Serial")" + * USB support (if available): "CDC (no generic "Serial")" + * Optimize: "Smallest (-Os default)" + * C Runtime Library: "newlib Nano (default)" + */ + +#pragma once + +#if NOT_TARGET(STM32F4) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#endif + +#ifndef MACHINE_NAME + #define MACHINE_NAME "STEVAL-3DP001V1" +#endif + +// +// Limit Switches +// +#define X_MIN_PIN 39 // PD8 X_STOP +#define Y_MIN_PIN 40 // PD9 Y_STOP +#define Z_MIN_PIN 41 // PD10 Z_STOP + +#define X_MAX_PIN 44 // PD0 W_STOP +#define Y_MAX_PIN 43 // PA8 V_STOP +#define Z_MAX_PIN 42 // PD11 U_STOP + +// +// Z Probe (when not Z_MIN_PIN) +// +//#ifndef Z_MIN_PROBE_PIN +// #define Z_MIN_PROBE_PIN 16 // PA4 +//#endif + +// +// Filament runout +// +//#define FIL_RUNOUT_PIN 53 // PA3 BED_THE + +// +// Steppers +// + +#define X_STEP_PIN 61 // PE14 X_PWM +#define X_DIR_PIN 62 // PE15 X_DIR +#define X_ENABLE_PIN 60 // PE13 X_RES +#define X_CS_PIN 16 // PA4 SPI_CS + +#define Y_STEP_PIN 64 // PB10 Y_PWM +#define Y_DIR_PIN 65 // PE9 Y_DIR +#define Y_ENABLE_PIN 63 // PE10 Y_RES +#define Y_CS_PIN 16 // PA4 SPI_CS + +#define Z_STEP_PIN 67 // PC6 Z_PWM +#define Z_DIR_PIN 68 // PC0 Z_DIR +#define Z_ENABLE_PIN 66 // PC15 Z_RES +#define Z_CS_PIN 16 // PA4 SPI_CS + +#define E0_STEP_PIN 71 // PD12 E1_PW +#define E0_DIR_PIN 70 // PC13 E1_DIR +#define E0_ENABLE_PIN 69 // PC14 E1_RE +#define E0_CS_PIN 16 // PA4 SPI_CS + +#define E1_STEP_PIN 73 // PE5 E2_PWM +#define E1_DIR_PIN 74 // PE6 E2_DIR +#define E1_ENABLE_PIN 72 // PE4 E2_RESE +#define E1_CS_PIN 16 // PA4 SPI_CS + +#define E2_STEP_PIN 77 // PB8 E3_PWM +#define E2_DIR_PIN 76 // PE2 E3_DIR +#define E2_ENABLE_PIN 75 // PE3 E3_RESE +#define E2_CS_PIN 16 // PA4 SPI_CS + +// needed to pass a sanity check +#define X2_CS_PIN 16 // PA4 SPI_CS +#define Y2_CS_PIN 16 // PA4 SPI_CS +#define Z2_CS_PIN 16 // PA4 SPI_CS +#define Z3_CS_PIN 16 // PA4 SPI_CS +#define E3_CS_PIN 16 // PA4 SPI_CS +#define E4_CS_PIN 16 // PA4 SPI_CS +#define E5_CS_PIN 16 // PA4 SPI_CS + +#if HAS_L64XX + #define L6470_CHAIN_SCK_PIN 17 // PA5 + #define L6470_CHAIN_MISO_PIN 18 // PA6 + #define L6470_CHAIN_MOSI_PIN 19 // PA7 + #define L6470_CHAIN_SS_PIN 16 // PA4 + + //#define SCK_PIN L6470_CHAIN_SCK_PIN + //#define MISO_PIN L6470_CHAIN_MISO_PIN + //#define MOSI_PIN L6470_CHAIN_MOSI_PIN +#else + //#define SCK_PIN 13 // PB13 SPI_S + //#define MISO_PIN 12 // PB14 SPI_M + //#define MOSI_PIN 11 // PB15 SPI_M +#endif + +/** + * Macro to reset/enable L6474 stepper drivers + * + * IMPORTANT - To disable (bypass) L6474s, install the corresponding + * resistors (R11 - R17) and change the "V" to "0" for the + * corresponding pins here: + */ +#define ENABLE_RESET_L64XX_CHIPS(V) do{ OUT_WRITE(X_ENABLE_PIN, V); \ + OUT_WRITE(Y_ENABLE_PIN, V); \ + OUT_WRITE(Z_ENABLE_PIN, V); \ + OUT_WRITE(E0_ENABLE_PIN,V); \ + OUT_WRITE(E1_ENABLE_PIN,V); \ + OUT_WRITE(E2_ENABLE_PIN,V); \ + }while(0) + +// +// Temperature Sensors +// +#define TEMP_0_PIN 3 // Analog input 3, digital pin 54 PA0 E1_THERMISTOR +#define TEMP_1_PIN 4 // Analog input 4, digital pin 55 PA1 E2_THERMISTOR +#define TEMP_2_PIN 5 // Analog input 5, digital pin 56 PA2 E3_THERMISTOR +#define TEMP_BED_PIN 0 // Analog input 0, digital pin 51 PC2 BED_THERMISTOR_1 +#define TEMP_BED_1_PIN 1 // Analog input 1, digital pin 52 PC3 BED_THERMISTOR_2 +#define TEMP_BED_2_PIN 2 // Analog input 2, digital pin 53 PA3 BED_THERMISTOR_3 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 48 // PC7 E1_HEAT_PWM +#define HEATER_1_PIN 49 // PB0 E2_HEAT_PWM +#define HEATER_2_PIN 50 // PB1 E3_HEAT_PWM +#define HEATER_BED_PIN 46 // PD14 (BED_HEAT_1 FET +#define HEATER_BED_1_PIN 45 // PD13 (BED_HEAT_2 FET +#define HEATER_BED_2_PIN 47 // PD15 (BED_HEAT_3 FET + +#define FAN_PIN 57 // PC4 E1_FAN PWM pin, Part cooling fan FET +#define FAN1_PIN 58 // PC5 E2_FAN PWM pin, Extruder fan FET +#define FAN2_PIN 59 // PE8 E3_FAN PWM pin, Controller fan FET + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 58 // FAN1_PIN +#endif + +// +// Misc functions +// +#define SDSS 16 // PA4 SPI_CS +#define LED_PIN -1 // 9 // PE1 green LED Heart beat +#define PS_ON_PIN -1 +#define KILL_PIN -1 +#define POWER_LOSS_PIN -1 // PWR_LOSS / nAC_FAULT + +// +// LCD / Controller +// +//#define SD_DETECT_PIN 66 // PA15 SD_CA +//#define BEEPER_PIN 24 // PC9 SDIO_D1 +//#define LCD_PINS_RS 65 // PE9 Y_DIR +//#define LCD_PINS_ENABLE 59 // PE8 E3_FAN +//#define LCD_PINS_D4 10 // PB12 SPI_C +//#define LCD_PINS_D5 13 // PB13 SPI_S +//#define LCD_PINS_D6 12 // PB14 SPI_M +//#define LCD_PINS_D7 11 // PB15 SPI_M +//#define BTN_EN1 57 // PC4 E1_FAN +//#define BTN_EN2 58 // PC5 E2_FAN +//#define BTN_ENC 52 // PC3 BED_THE + +// +// Extension pins +// +//#define EXT0_PIN 49 // PB0 E2_HEAT +//#define EXT1_PIN 50 // PB1 E3_HEAT +//#define EXT2_PIN // PB2 not used (tied to ground +//#define EXT3_PIN 39 // PD8 X_STOP +//#define EXT4_PIN 40 // PD9 Y_STOP +//#define EXT5_PIN 41 // PD10 Z_STOP +//#define EXT6_PIN 42 // PD11 +//#define EXT7_PIN 71 // PD12 E1_PW +//#define EXT8_PIN 64 // PB10 Y_PWM + +// WIFI +// 2 // PD3 CTS +// 3 // PD4 RTS +// 4 // PD5 TX +// 5 // PD6 RX +// 6 // PB5 WIFI_WAKEUP +// 7 // PE11 WIFI_RESET +// 8 // PE12 WIFI_BOOT + +// I2C USER +// 14 // PB7 SDA +// 15 // PB6 SCL + +// JTAG +// 20 // PA13 JTAG_TMS/SWDIO +// 21 // PA14 JTAG_TCK/SWCLK +// 22 // PB3 JTAG_TDO/SWO + +// +// Onboard SD support +// +#define SDIO_D0_PIN 23 // PC8 SDIO_D0 +#define SDIO_D1_PIN 24 // PC9 SDIO_D1 +//#define SD_CARD_DETECT_PIN 25 // PA15 SD_CARD_DETECT +#define SDIO_D2_PIN 26 // PC10 SDIO_D2 +#define SDIO_D3_PIN 27 // PC11 SDIO_D3 +#define SDIO_CK_PIN 28 // PC12 SDIO_CK +#define SDIO_CMD_PIN 29 // PD2 SDIO_CMD + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(ONBOARD) + #define SDIO_SUPPORT // Use SDIO for onboard SD + + #ifndef SDIO_SUPPORT + #define SOFTWARE_SPI // Use soft SPI for onboard SD + #undef SDSS + #define SDSS SDIO_D3_PIN + #define SCK_PIN SDIO_CK_PIN + #define MISO_PIN SDIO_D0_PIN + #define MOSI_PIN SDIO_CMD_PIN + #endif +#endif + +// OTG +// 30 // PA11 OTG_DM +// 31 // PA12 OTG_DP + +// USER_PINS +// 34 // PD7 USER3 +// 35 // PB9 USER1 +// 36 // PE0 USER2 +// 37 // PB4 USER4 + +// USERKET +// 38 // PE7 USER_BUTTON + +// 0 // PA9 TX +// 1 // PA10 RX + +// IR/PROBE +// 32 // PD1 IR_OUT +// 33 // PC1 IR_ON + +/** + * Logical pin vs. port/pin cross reference + * + * PA0 54 // E1_THERMISTOR PA9 0 // TX + * PA1 55 // E2_THERMISTOR PA10 1 // RX + * PA2 56 // E3_THERMISTOR PD3 2 // CTS + * PA3 53 // BED_THERMISTOR_3 PD4 3 // RTS + * PA4 16 // SPI_CS PD5 4 // TX + * PA5 17 // SPI_SCK PD6 5 // RX + * PA6 18 // SPI_MISO PB5 6 // WIFI_WAKEUP + * PA7 19 // SPI_MOSI PE11 7 // WIFI_RESET + * PA8 43 // V_STOP PE12 8 // WIFI_BOOT + * PA9 0 // TX PE1 9 // STATUS_LED + * PA10 1 // RX PB12 10 // SPI_CS + * PA11 30 // OTG_DM PB15 11 // SPI_MOSI + * PA12 31 // OTG_DP PB14 12 // SPI_MISO + * PA13 20 // JTAG_TMS/SWDIO PB13 13 // SPI_SCK + * PA14 21 // JTAG_TCK/SWCLK PB7 14 // SDA + * PA15 25 // SD_CARD_DETECT PB6 15 // SCL + * PB0 49 // E2_HEAT_PWM PA4 16 // SPI_CS + * PB1 50 // E3_HEAT_PWM PA5 17 // SPI_SCK + * PB3 22 // JTAG_TDO/SWO PA6 18 // SPI_MISO + * PB4 37 // USER4 PA7 19 // SPI_MOSI + * PB5 6 // WIFI_WAKEUP PA13 20 // JTAG_TMS/SWDIO + * PB6 15 // SCL PA14 21 // JTAG_TCK/SWCLK + * PB7 14 // SDA PB3 22 // JTAG_TDO/SWO + * PB8 77 // E3_PWM PC8 23 // SDIO_D0 + * PB9 35 // USER1 PC9 24 // SDIO_D1 + * PB10 64 // Y_PWM PA15 25 // SD_CARD_DETECT + * PB12 10 // SPI_CS PC10 26 // SDIO_D2 + * PB13 13 // SPI_SCK PC11 27 // SDIO_D3 + * PB14 12 // SPI_MISO PC12 28 // SDIO_CK + * PB15 11 // SPI_MOSI PD2 29 // SDIO_CMD + * PC0 68 // Z_DIR PA11 30 // OTG_DM + * PC1 33 // IR_ON PA12 31 // OTG_DP + * PC2 51 // BED_THERMISTOR_1 PD1 32 // IR_OUT + * PC3 52 // BED_THERMISTOR_2 PC1 33 // IR_ON + * PC4 57 // E1_FAN PD7 34 // USER3 + * PC5 58 // E2_FAN PB9 35 // USER1 + * PC6 67 // Z_PWM PE0 36 // USER2 + * PC7 48 // E1_HEAT_PWM PB4 37 // USER4 + * PC8 23 // SDIO_D0 PE7 38 // USER_BUTTON + * PC9 24 // SDIO_D1 PD8 39 // X_STOP + * PC10 26 // SDIO_D2 PD9 40 // Y_STOP + * PC11 27 // SDIO_D3 PD10 41 // Z_STOP + * PC12 28 // SDIO_CK PD11 42 // U_STOP + * PC13 70 // E1_DIR PA8 43 // V_STOP + * PC14 69 // E1_RESET PD0 44 // W_STOP + * PC15 66 // Z_RESET PD13 45 // BED_HEAT_2 + * PD0 44 // W_STOP PD14 46 // BED_HEAT_1 + * PD1 32 // IR_OUT PD15 47 // BED_HEAT_3 + * PD2 29 // SDIO_CMD PC7 48 // E1_HEAT_PWM + * PD3 2 // CTS PB0 49 // E2_HEAT_PWM + * PD4 3 // RTS PB1 50 // E3_HEAT_PWM + * PD5 4 // TX PC2 51 // BED_THERMISTOR_1 + * PD6 5 // RX PC3 52 // BED_THERMISTOR_2 + * PD7 34 // USER3 PA3 53 // BED_THERMISTOR_3 + * PD8 39 // X_STOP PA0 54 // E1_THERMISTOR + * PD9 40 // Y_STOP PA1 55 // E2_THERMISTOR + * PD10 41 // Z_STOP PA2 56 // E3_THERMISTOR + * PD11 42 // U_STOP PC4 57 // E1_FAN + * PD12 71 // E1_PWM PC5 58 // E2_FAN + * PD13 45 // BED_HEAT_2 PE8 59 // E3_FAN + * PD14 46 // BED_HEAT_1 PE13 60 // X_RESET + * PD15 47 // BED_HEAT_3 PE14 61 // X_PWM + * PE0 36 // USER2 PE15 62 // X_DIR + * PE1 9 // STATUS_LED PE10 63 // Y_RESET + * PE2 76 // E3_DIR PB10 64 // Y_PWM + * PE3 75 // E3_RESET PE9 65 // Y_DIR + * PE4 72 // E2_RESET PC15 66 // Z_RESET + * PE5 73 // E2_PWM PC6 67 // Z_PWM + * PE6 74 // E2_DIR PC0 68 // Z_DIR + * PE7 38 // USER_BUTTON PC14 69 // E1_RESET + * PE8 59 // E3_FAN PC13 70 // E1_DIR + * PE9 65 // Y_DIR PD12 71 // E1_PWM + * PE10 63 // Y_RESET PE4 72 // E2_RESET + * PE11 7 // WIFI_RESET PE5 73 // E2_PWM + * PE12 8 // WIFI_BOOT PE6 74 // E2_DIR + * PE13 60 // X_RESET PE3 75 // E3_RESET + * PE14 61 // X_PWM PE2 76 // E3_DIR + * PE15 62 // X_DIR PB8 77 // E3_PWM + */ diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h new file mode 100644 index 00000000..e2463fd4 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -0,0 +1,195 @@ +/** + * 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 + +#if NOT_TARGET(STM32F4, STM32F4xx) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#elif HOTENDS > 2 || E_STEPPERS > 2 + #error "STM32F4 supports up to 2 hotends / E-steppers." +#endif + +#define DEFAULT_MACHINE_NAME "STM32F446VET6" +#define BOARD_INFO_NAME "STM32F4 VAkE" + +//#define I2C_EEPROM +#define MARLIN_EEPROM_SIZE 0x1000 // 4KB + +// +// Servos +// +//#define SERVO0_PIN PE13 +//#define SERVO1_PIN PE14 + +// +// Limit Switches +// +#define X_STOP_PIN PE10 +#define Y_STOP_PIN PE9 +#define Z_STOP_PIN PE8 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PA4 +#endif + +// +// Filament runout +// +#define FIL_RUNOUT_PIN PA3 + +// +// Steppers +// + +#define STEPPER_ENABLE_PIN PB2 + +#define X_STEP_PIN PC6 // X_STEP +#define X_DIR_PIN PC7 // X_DIR +#define X_ENABLE_PIN PB2 // +#ifndef X_CS_PIN + #define X_CS_PIN PC8 // X_CS +#endif + +#define Y_STEP_PIN PD9 // Y_STEP +#define Y_DIR_PIN PD10 // Y_DIR +#define Y_ENABLE_PIN PB2 // +#ifndef Y_CS_PIN + #define Y_CS_PIN PD11 // Y_CS +#endif + +#define Z_STEP_PIN PE15 // Z_STEP +#define Z_DIR_PIN PB10 // Z_DIR +#define Z_ENABLE_PIN PB2 +#ifndef Z_CS_PIN + #define Z_CS_PIN PD8 +#endif + +#define E0_STEP_PIN PB1 +#define E0_DIR_PIN PB13 +#define E0_ENABLE_PIN PB2 +#ifndef E0_CS_PIN + #define E0_CS_PIN PE11 +#endif + +#define E1_STEP_PIN PC4 +#define E1_DIR_PIN PC5 +#define E1_ENABLE_PIN PB2 +#ifndef E1_CS_PIN + #define E1_CS_PIN PB0 +#endif + +#define SCK_PIN PE12 // PA5 // SPI1 for SD card +#define MISO_PIN PE13 // PA6 +#define MOSI_PIN PE14 // PA7 + +// added for SD card : optional or not ??? +//#define SD_CHIP_SELECT_PIN SDSS // The default chip select pin for the SD card is SS. +// The following three pins must not be redefined for hardware SPI. +//#define SPI_MOSI_PIN MOSI_PIN // SPI Master Out Slave In pin +//#define SPI_MISO_PIN MISO_PIN // SPI Master In Slave Out pin +//#define SPI_SCK_PIN SCK_PIN // SPI Clock pin + +// +// Temperature Sensors (Analog inputs) +// + +#define TEMP_0_PIN PC0 // Analog Input +#define TEMP_1_PIN PC1 // Analog Input +#define TEMP_2_PIN PC2 // Analog Input +#define TEMP_3_PIN PC3 // Analog Input +#define TEMP_BED_PIN PC3 // Analog Input + +// +// Heaters / Fans +// + +#define HEATER_0_PIN PD15 +#define HEATER_1_PIN PD14 +#define HEATER_BED_PIN PD12 + +#ifndef FAN_PIN + #define FAN_PIN PD13 +#endif +#define FAN1_PIN PB5 // PA0 +#define FAN2_PIN PB4 // PA1 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PD13 +#endif + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Průša i3 MK2 Multi Material Multiplexer Support +// +//#define E_MUX0_PIN PG3 +//#define E_MUX1_PIN PG4 + +#define LED_PIN PB14 // Alive +#define PS_ON_PIN PE0 +#define KILL_PIN PD5 +#define POWER_LOSS_PIN PA4 // ?? Power loss / nAC_FAULT + +#if ENABLED(SDSUPPORT) + #define SD_DETECT_PIN PB7 + #define SS_PIN PB_15 // USD_CS -> CS for onboard SD +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + #if ENABLED(SDSUPPORT) + #define SDSS PB6 // CS for SD card in LCD + #endif + #define BEEPER_PIN PC9 + #define LCD_PINS_RS PC12 + #define LCD_PINS_ENABLE PD7 + #define LCD_PINS_D4 PD1 + #define LCD_PINS_D5 PD2 + #define LCD_PINS_D6 PD3 + #define LCD_PINS_D7 PD4 + #define BTN_EN1 PD6 + #define BTN_EN2 PD0 + #define BTN_ENC PB12 +#endif + +// +// ST7920 Delays +// +#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 diff --git a/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h new file mode 100644 index 00000000..5e3d5f4a --- /dev/null +++ b/Marlin/src/pins/stm32f7/pins_NUCLEO_F767ZI.h @@ -0,0 +1,201 @@ +/** + * 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 STM32F767xx + #error "Oops! Select an STM32F767 environment" +#endif + +#define BOARD_INFO_NAME "NUCLEO-F767ZI" +#define DEFAULT_MACHINE_NAME "Prototype Board" + +#if NO_EEPROM_SELECTED + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + // Not yet supported on F7 hardware + // #define FLASH_EEPROM_LEVELING +#endif + +/** + * Timer assignments + * + * TIM1 - + * TIM2 - Hardware PWM (Fan/Heater Pins) + * TIM3 - Hardware PWM (Servo Pins) + * TIM4 - STEP_TIMER (Marlin) + * TIM5 - + * TIM6 - TIMER_TONE (variant.h) + * TIM7 - TIMER_SERVO (variant.h) + * TIM9 - TIMER_SERIAL (platformio.ini) + * TIM10 - For some reason trips Watchdog when used for SW Serial + * TIM11 - + * TIM12 - + * TIM13 - + * TIM14 - TEMP_TIMER (Marlin) + * + */ +#define STEP_TIMER 4 +#define TEMP_TIMER 14 + + +/** + * These pin assignments are arbitrary and intending for testing purposes. + * Assignments may not be ideal, and not every assignment has been tested. + * Proceed at your own risk. + * _CN7_ + * (X_STEP) PC6 | · · | PB8 (X_EN) + * (X_DIR) PB15 | · · | PB9 (X_CS) + * (LCD_D4) PB13 | · · | AVDD + * _CN8_ PB12 | · · | GND + * NC | · · | PC8 (HEATER_0) PA15 | · · | PA5 (SCLK) + * IOREF | · · | PC9 (BEEPER) PC7 | · · | PA6 (MISO) + * RESET | · · | PC10 (SERVO1_PIN) PB5 | · · | PA7 (MOSI) + * +3.3V | · · | PC11 (HEATER_BED) PB3 | · · | PD14 (SD_DETECT) + * +5V | · · | PC12 (SDSS) PA4 | · · | PD15 (LCD_ENABLE) + * GND | · · | PD2 (SERVO0_PIN) PB4 | · · | PF12 (LCD_RS) + * GND | · · | PG2  ̄ ̄ ̄ + * VIN | · · | PG3 +_*  ̄ ̄ ̄ _CN10 + * AVDD | · · | PF13 (BTN_EN1) + * _CN9_ AGND | · · | PE9 (BTN_EN2) + * (TEMP_0) PA3 | · · | PD7 GND | · · | PE11 (BTN_ENC) + * (TEMP_BED) PC0 | · · | PD6 PB1 | · · | PF14 + * PC3 | · · | PD5 PC2 | · · | PE13 + * PF3 | · · | PD4 PF4 | · · | PF15 + * PF5 | · · | PD3 (E_STEP) PB6 | · · | PG14 (E_EN) + * PF10 | · · | GND (E_DIR) PB2 | · · | PG9 (E_CS) + * NC | · · | PE2 GND | · · | PE8 + * PA7 | · · | PE4 PD13 | · · | PE7 + * PF2 | · · | PE5 PD12 | · · | GND + * (Y_STEP) PF1 | · · | PE6 (Y_EN) (Z_STEP) PD11 | · · | PE10 (Z_EN) + * (Y_DIR) PF0 | · · | PE3 (Y_CS) (Z_DIR) PE2 | · · | PE12 (Z_CS) + * GND | · · | PF8 GND | · · | PE14 + * (Z_MAX) PD0 | · · | PF7 (X_MIN) PA0 | · · | PE15 + * (Z_MIN) PD1 | · · | PF9 (X_MAX) PB0 | · · | PB10 (FAN) + * (Y_MAX) PG0 | · · | PG1 (Y_MIN) PE0 | · · | PB11 (FAN1) + *  ̄ ̄ ̄  ̄ ̄ ̄ ̄ + */ + +#define X_MIN_PIN PF7 +#define X_MAX_PIN PF9 +#define Y_MIN_PIN PG1 +#define Y_MAX_PIN PG0 +#define Z_MIN_PIN PD1 +#define Z_MAX_PIN PD0 + +// +// Steppers +// +#define X_STEP_PIN PC6 +#define X_DIR_PIN PB15 +#define X_ENABLE_PIN PB8 +#define X_CS_PIN PB9 + +#define Y_STEP_PIN PF1 +#define Y_DIR_PIN PF0 +#define Y_ENABLE_PIN PE6 +#define Y_CS_PIN PE3 + +#define Z_STEP_PIN PD11 +#define Z_DIR_PIN PE2 +#define Z_ENABLE_PIN PE10 +#define Z_CS_PIN PE12 + +#define E0_STEP_PIN PB6 +#define E0_DIR_PIN PB2 +#define E0_ENABLE_PIN PG14 +#define E0_CS_PIN PG9 + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PB9 + #define X_SERIAL_RX_PIN PB9 + + #define Y_SERIAL_TX_PIN PE3 + #define Y_SERIAL_RX_PIN PE3 + + #define Z_SERIAL_TX_PIN PE12 + #define Z_SERIAL_RX_PIN PE12 + + #define E_SERIAL_TX_PIN PG9 + #define E_SERIAL_RX_PIN PG9 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA3 +#define TEMP_BED_PIN PC0 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA15 // PWM Capable, TIM2_CH1 +#define HEATER_BED_PIN PB3 // PWM Capable, TIM2_CH2 + +#ifndef FAN_PIN + #define FAN_PIN PB10 // PWM Capable, TIM2_CH3 +#endif +#define FAN1_PIN PB11 // PWM Capable, TIM2_CH4 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN FAN1_PIN +#endif + +// +// Servos +// +#define SERVO0_PIN PB4 // PWM Capable, TIM3_CH1 +#define SERVO1_PIN PB5 // PWM Capable, TIM3_CH2 + +// SPI for external SD Card (Not entirely sure this will work) +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 +#define SS_PIN PA4 +#define SDSS PA4 + +#define LED_PIN LED_BLUE + +// +// LCD / Controller +// +#if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BEEPER_PIN PC7 // LCD_BEEPER + #define BTN_ENC PE11 // BTN_ENC + #define SD_DETECT_PIN PD14 + #define LCD_PINS_RS PF12 // LCD_RS + #define LCD_PINS_ENABLE PD15 // LCD_EN + #define LCD_PINS_D4 PB13 // LCD_D4 + // #define LCD_PINS_D5 + // #define LCD_PINS_D6 + // #define LCD_PINS_D7 + #define BTN_EN1 PF13 // BTN_EN1 + #define BTN_EN2 PE9 // BTN_EN2 + + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) + #define BOARD_ST7920_DELAY_2 DELAY_NS(63) + #define BOARD_ST7920_DELAY_3 DELAY_NS(780) +#endif diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h new file mode 100644 index 00000000..c3dc0047 --- /dev/null +++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h @@ -0,0 +1,137 @@ +/** + * 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 + +#if NOT_TARGET(STM32F7xx) + #error "Oops! Select an STM32F7 board in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "RemRam v1" +#define DEFAULT_MACHINE_NAME "RemRam" + +#if NO_EEPROM_SELECTED + #define SRAM_EEPROM_EMULATION // Emulate the EEPROM using Backup SRAM +#endif + +#if HOTENDS > 1 || E_STEPPERS > 1 + #error "RemRam supports only one hotend / E-stepper." +#endif + +// +// Limit Switches +// +#if DISABLED(SENSORLESS_HOMING) + #define X_MIN_PIN 58 + #define X_MAX_PIN 59 + #define Y_MIN_PIN 60 + #define Y_MAX_PIN 61 + #define Z_MIN_PIN 62 + #define Z_MAX_PIN 63 +#else + #define X_STOP_PIN 36 + #define Y_STOP_PIN 39 + #define Z_MIN_PIN 62 + #define Z_MAX_PIN 42 +#endif + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 26 // EXT_D1 +#endif + +// +// Steppers +// +#define X_STEP_PIN 22 +#define X_DIR_PIN 35 +#define X_ENABLE_PIN 34 +#define X_CS_PIN 14 + +#define Y_STEP_PIN 23 +#define Y_DIR_PIN 38 +#define Y_ENABLE_PIN 37 +#define Y_CS_PIN 15 + +#define Z_STEP_PIN 24 +#define Z_DIR_PIN 41 +#define Z_ENABLE_PIN 40 +#define Z_CS_PIN 16 + +#define E0_STEP_PIN 25 +#define E0_DIR_PIN 44 +#define E0_ENABLE_PIN 43 +#define E0_CS_PIN 10 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 64 // THERM_1 +#define TEMP_1_PIN 65 // THERM_2 +#define TEMP_BED_PIN 66 // THERM_3 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 33 +#define HEATER_BED_PIN 31 + +#ifndef FAN_PIN + #define FAN_PIN 30 // "FAN1" +#endif +#define FAN1_PIN 32 // "FAN2" + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN 32 +#endif + +// +// Servos +// +#define SERVO0_PIN 26 // PWM_EXT1 +#define SERVO1_PIN 27 // PWM_EXT2 + +#define SDSS 57 // Onboard SD card reader +//#define SDSS 9 // LCD SD card reader +#define LED_PIN 21 // STATUS_LED + +// +// LCD / Controller +// +#define SD_DETECT_PIN 56 // SD_CARD_DET +#define BEEPER_PIN 46 // LCD_BEEPER +#define LCD_PINS_RS 49 // LCD_RS +#define LCD_PINS_ENABLE 48 // LCD_EN +#define LCD_PINS_D4 50 // LCD_D4 +#define LCD_PINS_D5 51 // LCD_D5 +#define LCD_PINS_D6 52 // LCD_D6 +#define LCD_PINS_D7 53 // LCD_D7 +#define BTN_EN1 54 // BTN_EN1 +#define BTN_EN2 55 // BTN_EN2 +#define BTN_ENC 47 // BTN_ENC + +// +// Timers +// + +#define STEP_TIMER 2 diff --git a/Marlin/src/pins/stm32f7/pins_THE_BORG.h b/Marlin/src/pins/stm32f7/pins_THE_BORG.h new file mode 100644 index 00000000..c050824a --- /dev/null +++ b/Marlin/src/pins/stm32f7/pins_THE_BORG.h @@ -0,0 +1,183 @@ +/** + * 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 + +#if NOT_TARGET(STM32F7) + #error "Oops! Select an STM32F7 board in 'Tools > Board.'" +#elif HOTENDS > 3 || E_STEPPERS > 3 + #error "The-Borg supports up to 3 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "The-Borge" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE 0x1000 +#endif + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +// +// Limit Switches +// +#define X_MIN_PIN PE9 +#define X_MAX_PIN PE10 +#define Y_MIN_PIN PE7 +#define Y_MAX_PIN PE8 +#define Z_MIN_PIN PF15 +#define Z_MAX_PIN PG0 +#define E_MIN_PIN PE2 +#define E_MAX_PIN PE3 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PA4 +#endif + +// +// Steppers +// +#define STEPPER_ENABLE_PIN PE0 + +#define X_STEP_PIN PC6 // 96, 39 in Arduino +#define X_DIR_PIN PC7 +#define X_ENABLE_PIN PC8 + +#define Y_STEP_PIN PD9 +#define Y_DIR_PIN PD10 +#define Y_ENABLE_PIN PD11 + +#define Z_STEP_PIN PE15 +#define Z_DIR_PIN PG1 +#define Z_ENABLE_PIN PD8 + +#define E0_STEP_PIN PB1 +#define E0_DIR_PIN PB2 +#define E0_ENABLE_PIN PE11 + +#define E1_STEP_PIN PC4 +#define E1_DIR_PIN PC5 +#define E1_ENABLE_PIN PB0 + +#define E2_STEP_PIN PC13 +#define E2_DIR_PIN PC14 +#define E2_ENABLE_PIN PC15 + +#define Z2_STEP_PIN PC13 +#define Z2_DIR_PIN PC14 +#define Z2_ENABLE_PIN PC15 + +#define SCK_PIN PA5 +#define MISO_PIN PA6 +#define MOSI_PIN PA7 + +#define SPI1_SCK_PIN PA5 +#define SPI1_MISO_PIN PA6 +#define SPI1_MOSI_PIN PA7 + +#define SPI6_SCK_PIN PG13 +#define SPI6_MISO_PIN PG12 +#define SPI6_MOSI_PIN PG14 + +// +// Temperature Sensors +// + +#define TEMP_0_PIN PC3 // Analog Input +#define TEMP_1_PIN PC2 // Analog Input +#define TEMP_2_PIN PC1 // Analog Input +#define TEMP_3_PIN PC0 // Analog Input + +#define TEMP_BED_PIN PF10 // Analog Input + +#define TEMP_5_PIN PE12 // Analog Input, Probe temp + +// +// Heaters / Fans +// +#define HEATER_0_PIN PD15 +#define HEATER_1_PIN PD14 +#define HEATER_BED_PIN PF6 + +#ifndef FAN_PIN + #define FAN_PIN PD13 +#endif +#define FAN1_PIN PA0 +#define FAN2_PIN PA1 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PA1 +#endif + +// +// Misc. Functions +// + +//#define CASE_LIGHT_PIN_CI PF13 +//#define CASE_LIGHT_PIN_DO PF14 +//#define NEOPIXEL_PIN PF13 + +// +// Průša i3 MK2 Multi Material Multiplexer Support +// + +#define E_MUX0_PIN PG3 +#define E_MUX1_PIN PG4 + +// +// Servos +// + +#define SERVO0_PIN PE13 +#define SERVO1_PIN PE14 + +#define SDSS PA8 +#define SS_PIN PA8 +#define LED_PIN PA2 // Alive +#define PS_ON_PIN PA3 +#define KILL_PIN -1 //PD5 // EXP2-10 +#define PWR_LOSS PG5 // Power loss / nAC_FAULT + +// +// MAX7219_DEBUG +// +#define MAX7219_CLK_PIN PG10 // EXP1-1 +#define MAX7219_DIN_PIN PD7 // EXP1-3 +#define MAX7219_LOAD_PIN PD1 // EXP1-5 + +// +// LCD / Controller +// +//#define SD_DETECT_PIN -1 //PB6) // EXP2-4 +#define BEEPER_PIN PG10 // EXP1-1 +#define LCD_PINS_RS PG9 // EXP1-4 +#define LCD_PINS_ENABLE PD7 // EXP1-3 +#define LCD_PINS_D4 PD1 // EXP1-5 +#define LCD_PINS_D5 PF0 // EXP1-6 +#define LCD_PINS_D6 PD3 // EXP1-7 +#define LCD_PINS_D7 PD4 // EXP1-8 +#define BTN_EN1 PD6 // EXP2-5 +#define BTN_EN2 PD0 // EXP2-3 +#define BTN_ENC PG11 // EXP1-2 diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h new file mode 100644 index 00000000..908e12e0 --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.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 + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * 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 + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +/** + * 5DPrint D8 Driver board pin assignments + * + * https://bitbucket.org/makible/5dprint-d8-controller-board + */ + +#if NOT_TARGET(__AVR_AT90USB1286__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#define DEFAULT_MACHINE_NAME "Makibox" +#define BOARD_INFO_NAME "5DPrint D8" + +// +// Servos +// +#define SERVO0_PIN 41 +#define SERVO1_PIN 42 +#define SERVO2_PIN 43 +#define SERVO3_PIN 44 + +// +// Limit Switches +// +#define X_STOP_PIN 37 // E5 +#define Y_STOP_PIN 36 // E4 +#define Z_STOP_PIN 19 // E7 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 17 // C7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 13 // C3 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 12 // C2 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 11 // C1 + +// +// Digital Microstepping +// +#define X_MS1_PIN 25 // B5 +#define X_MS2_PIN 26 // B6 +#define Y_MS1_PIN 9 // E1 +#define Y_MS2_PIN 8 // E0 +#define Z_MS1_PIN 7 // D7 +#define Z_MS2_PIN 6 // D6 +#define E0_MS1_PIN 5 // D5 +#define E0_MS2_PIN 4 // D4 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // F1 Analog Input +#define TEMP_BED_PIN 0 // F0 Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 +#define HEATER_BED_PIN 14 // C4 + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 + +//DIGIPOTS slave addresses +#ifndef DIGIPOT_I2C_ADDRESS_A + #define DIGIPOT_I2C_ADDRESS_A 0x2C // unshifted slave address for DIGIPOT 0x2C (0x58 <- 0x2C << 1) +#endif diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h new file mode 100644 index 00000000..97d210a0 --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h @@ -0,0 +1,126 @@ +/** + * 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 + +/** + * Brainwave 1.0 pin assignments (AT90USB646) + * + * Requires hardware bundle for Arduino: + * https://github.com/unrepentantgeek/brainwave-arduino + */ + +/** + * Rev B 16 JAN 2017 + * + * Added pointer to a currently available Arduino IDE extension that will + * allow this board to use the latest Marlin software + */ + +/** + * Rev C 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * Marlin_AT90USB - https://github.com/Bob-the-Kuhn/Marlin_AT90USB + * This is the only known IDE extension that is compatible with the pin definitions + * in this file, Adrduino 1.6.12 and the latest mainstream Marlin software. + * + * "Marlin_AT90USB" makes PWM0A available rather than the usual PWM1C. These PWMs share + * the same physical pin. Marlin uses TIMER1 to generate interrupts and sets it up such + * that PWM1A, PWM1B & PWM1C can't be used. + * + * Installation: + * + * 1. In the Arduino IDE, under Files -> Preferences paste the following URL + * https://rawgit.com/Bob-the-Kuhn/Marlin_AT90USB/master/package_MARLIN_AT90USB_index.json + * 2. Under Tools > Board -> Boards manager, scroll to the bottom, click on MARLIN_AT90USB + * and then click on "Install" + * 3. Select "AT90USB646_TEENSYPP" from the 'Tools > Board' menu. + */ + +/** + * To burn the bootloader that comes with Marlin_AT90USB: + * + * 1. Connect your programmer to the board. + * 2. In Arduino IDE select "AT90USB646_TEENSYPP" and then select the programmer. + * 3. In Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#if NOT_TARGET(__AVR_AT90USB646__) + #error "Oops! Select 'AT90USB646_TEENSYPP' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Brainwave" + +// +// Limit Switches +// +#define X_STOP_PIN 35 // A7 +#define Y_STOP_PIN 34 // A6 +#define Z_STOP_PIN 33 // A5 + +// +// Steppers +// +#define X_STEP_PIN 3 // D3 +#define X_DIR_PIN 5 // D5 +#define X_ENABLE_PIN 4 // D4 +#define X_ATT_PIN 2 // D2 + +#define Y_STEP_PIN 7 // D7 +#define Y_DIR_PIN 9 // E1 +#define Y_ENABLE_PIN 8 // E0 +#define Y_ATT_PIN 6 // D6 + +#define Z_STEP_PIN 11 // C1 +#define Z_DIR_PIN 13 // C3 +#define Z_ENABLE_PIN 12 // C2 +#define Z_ATT_PIN 10 // C0 + +#define E0_STEP_PIN 15 // C5 +#define E0_DIR_PIN 17 // C7 +#define E0_ENABLE_PIN 16 // C6 +#define E0_ATT_PIN 14 // C4 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // F7 Analog Input +#define TEMP_BED_PIN 6 // F6 Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 32 // A4 Extruder +#define HEATER_BED_PIN 18 // E6 Bed + +#ifndef FAN_PIN + #define FAN_PIN 31 // A3 Fan +#endif + +// +// Misc. Functions +// +#define LED_PIN 19 // E7 diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h new file mode 100644 index 00000000..e41fcaab --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h @@ -0,0 +1,138 @@ +/** + * 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 + +/** + * Brainwave Pro pin assignments (AT90USB1286) + * + * Requires hardware bundle for Arduino: + * https://github.com/unrepentantgeek/brainwave-arduino + */ + +/** + * Rev B 16 JAN 2017 + * + * Added pointers to currently available Arduino IDE extensions that will + * allow this board to use the latest Marlin software + * + * + * Rev C 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * 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 + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#if NOT_TARGET(__AVR_AT90USB1286__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Brainwave Pro" + +// +// Limit Switches +// +#define X_STOP_PIN 45 // F7 +#define Y_STOP_PIN 12 // C2 +#define Z_STOP_PIN 36 // E4 + +// +// Z Probe (when not Z_MIN_PIN) +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN 11 // C1 +#endif + +// +// Steppers +// +#define X_STEP_PIN 9 // E1 +#define X_DIR_PIN 8 // E0 +#define X_ENABLE_PIN 23 // B3 + +#define Y_STEP_PIN 7 // D7 +#define Y_DIR_PIN 6 // D6 +#define Y_ENABLE_PIN 20 // B0 + +#define Z_STEP_PIN 5 // D5 +#define Z_DIR_PIN 4 // D4 +#define Z_ENABLE_PIN 37 // E5 + +#define E0_STEP_PIN 47 // E3 +#define E0_DIR_PIN 46 // E2 +#define E0_ENABLE_PIN 25 // B5 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // F2 Analog Input +#define TEMP_1_PIN 1 // F1 Analog Input +#define TEMP_BED_PIN 0 // F0 Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 27 // B7 +#define HEATER_BED_PIN 26 // B6 Bed +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 Fan, PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 +#define SD_DETECT_PIN 24 // B4 +#define LED_PIN 13 // C3 diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h new file mode 100644 index 00000000..ffecc03b --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -0,0 +1,169 @@ +/** + * 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 + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * 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 + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#if NOT_TARGET(__AVR_AT90USB1286__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Printrboard" + +// Disable JTAG pins so they can be used for the Extrudrboard +#define DISABLE_JTAG + +// +// Limit Switches +// +#define X_STOP_PIN 47 // E3 +#define Y_STOP_PIN 20 // B0 SS +#define Z_STOP_PIN 36 // E4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input +#define TEMP_BED_PIN 0 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_1_PIN 44 // F6 +#define HEATER_2_PIN 45 // F7 +#define HEATER_BED_PIN 14 // C4 PWM3C + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 26 // B6 SDCS +#define FILWIDTH_PIN 2 // Analog Input + +// +// LCD / Controller +// +#if BOTH(ULTRA_LCD, NEWPANEL) + + #define LCD_PINS_RS 9 // E1 JP11-11 + #define LCD_PINS_ENABLE 8 // E0 JP11-10 + #define LCD_PINS_D4 7 // D7 JP11-8 + #define LCD_PINS_D5 6 // D6 JP11-7 + #define LCD_PINS_D6 5 // D5 JP11-6 + #define LCD_PINS_D7 4 // D4 JP11-5 + + #if ANY(VIKI2, miniVIKI) + #define BEEPER_PIN 8 // E0 JP11-10 + + #define DOGLCD_A0 40 // F2 JP2-2 + #define DOGLCD_CS 41 // F3 JP2-4 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 2 // D2 TX1 JP2-5 + #define BTN_EN2 3 // D3 RX1 JP2-7 + #define BTN_ENC 45 // F7 TDI JP2-12 + + #undef SDSS + #define SDSS 43 // F5 TMS JP2-8 + + #define STAT_LED_RED_PIN 12 // C2 JP11-14 + #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 + + #elif ENABLED(LCD_I2C_PANELOLU2) + + #define BTN_EN1 3 // D3 RX1 JP2-7 + #define BTN_EN2 2 // D2 TX1 JP2-5 + #define BTN_ENC 41 // F3 JP2-4 + #undef SDSS + #define SDSS 38 // F0 B-THERM connector - use SD card on Panelolu2 + + #else + + #define BTN_EN1 10 // C0 JP11-12 + #define BTN_EN2 11 // C1 JP11-13 + #define BTN_ENC 12 // C2 JP11-14 + + #endif + +#endif // ULTRA_LCD && NEWPANEL diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h new file mode 100644 index 00000000..d4f9fc76 --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -0,0 +1,281 @@ +/** + * 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 + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * Teensyduino - https://www.pjrc.com/teensy/teensyduino.html + * Installation - https://www.pjrc.com/teensy/td_download.html + * + * Select Teensy++ 2.0 in Arduino IDE from the 'Tools > Board' menu + * + * Note: With Teensyduino extension, the Arduino IDE will report 130048 bytes of program storage space available, + * but there is actually only 122880 bytes due to the larger DFU bootloader shipped by default on all Printrboard RevF. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular and easiest option. + */ + +/** + * To burn the bootloader that comes with Printrboard HID extension: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#if NOT_TARGET(__AVR_AT90USB1286__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#if !defined(__MARLIN_DEPS__) && !defined(USBCON) + #error "USBCON should be defined by the platform for this board." +#endif + +#define BOARD_INFO_NAME "Printrboard Rev.F" + +// Disable JTAG pins so EXP1 pins work correctly +// (Its pins are used for the Extrudrboard and filament sensor, for example). +#define DISABLE_JTAG + +/** + * Note that REV F6 of the Printrboard stole the A HOTEND pin and + * reassigned it to a second fan for the extruder heater. It's + * recommended that you swap the A and B outputs on the Extrudrboard + * so EXTRUDERS=2 will still work on F6, using B for E1/HEATER_1/TEMP_1. + * See https://printrbot.zendesk.com/hc/en-us/articles/115003072346 + * + * If you have REV F6 you probably also want to set E0_AUTO_FAN_PIN + * to PRINTRBOARD_F6_HEATER_FAN_PIN (44). + * + * Define NO_EXTRUDRBOARD if you don't have an EXTRUDRBOARD and wish to + * reassign different functions to EXP1. + * + * Define NO_EXTRUDRBOARD_OUTPUT_SWAP if you have a REV F5 or lower and + * want to use EXTRUDRBOARD A for E1 and EXTRUDRBOARD B for E2. + */ +//#define NO_EXTRUDRBOARD +//#define NO_EXTRUDRBOARD_OUTPUT_SWAP + +// +// Limit Switches +// +#define X_STOP_PIN 47 // E3 +#define Y_STOP_PIN 24 // B4 PWM2A +#define Z_STOP_PIN 36 // E4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +#if DISABLED(NO_EXTRUDRBOARD) +#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) + #define E1_STEP_PIN 25 // B5 + #define E1_DIR_PIN 37 // E5 + #define E1_ENABLE_PIN 42 // F4 + + #define E2_STEP_PIN 2 // D2 + #define E2_DIR_PIN 3 // D3 + #define E2_ENABLE_PIN 43 // F5 +#else + #define E1_STEP_PIN 2 // D2 + #define E1_DIR_PIN 3 // D3 + #define E1_ENABLE_PIN 43 // F5 + + #define E2_STEP_PIN 25 // B5 + #define E2_DIR_PIN 37 // E5 + #define E2_ENABLE_PIN 42 // F4 +#endif +#endif // NO_EXTRUDRBOARD + +// Enable control of stepper motor currents with the I2C based MCP4728 DAC used on Printrboard REVF +#define HAS_MOTOR_CURRENT_DAC + +// Set default drive strength percents if not already defined - X, Y, Z, E axis +#ifndef DAC_MOTOR_CURRENT_DEFAULT + #define DAC_MOTOR_CURRENT_DEFAULT { 70, 70, 50, 70 } +#endif + +// Number of channels available for DAC +#define DAC_STEPPER_ORDER { 3, 2, 1, 0 } + +#define DAC_STEPPER_SENSE 0.11 +#define DAC_STEPPER_ADDRESS 0 +#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 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 1 // Analog Input (Extruder) +#define TEMP_BED_PIN 0 // Analog Input (Bed) + +#if DISABLED(NO_EXTRUDRBOARD) +#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) + #define TEMP_1_PIN 2 // Analog Input (Extrudrboard A THERM) + #define TEMP_2_PIN 3 // Analog Input (Extrudrboard B THERM) +#else + #define TEMP_1_PIN 3 // Analog Input (Extrudrboard B THERM) + #define TEMP_2_PIN 2 // Analog Input (Extrudrboard A THERM) +#endif +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C + +#if DISABLED(NO_EXTRUDRBOARD) +#if DISABLED(NO_EXTRUDRBOARD_OUTPUT_SWAP) + #define HEATER_1_PIN 44 // F6 - Extrudrboard A HOTEND + #define HEATER_2_PIN 45 // F7 - Extrudrboard B HOTEND +#else + #define HEATER_1_PIN 45 // F7 - Extrudrboard B HOTEND + #define HEATER_2_PIN 44 // F6 - Extrudrboard A HOTEND +#endif +#endif + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// LCD / Controller +// +//#define USE_INTERNAL_SD + +#if HAS_WIRED_LCD + #define LCD_PINS_RS 9 // E1 JP11-11 + #define LCD_PINS_ENABLE 8 // E0 JP11-10 + #define LCD_PINS_D4 7 // D7 JP11-8 + #define LCD_PINS_D5 6 // D6 JP11-7 + #define LCD_PINS_D6 5 // D5 JP11-6 + #define LCD_PINS_D7 4 // D4 JP11-5 + + #if ANY(VIKI2, miniVIKI) + + #define BEEPER_PIN 8 // E0 JP11-10 + #define DOGLCD_A0 40 // F2 JP2-2 + #define DOGLCD_CS 41 // F3 JP2-4 + #define LCD_SCREEN_ROT_180 + + #define BTN_EN1 2 // D2 TX1 JP2-5 + #define BTN_EN2 3 // D3 RX1 JP2-7 + #define BTN_ENC 45 // F7 TDI JP2-12 + + #define SDSS 3 // F5 TMS JP2-8 + + #define STAT_LED_RED_PIN 12 // C2 JP11-14 + #define STAT_LED_BLUE_PIN 10 // C0 JP11-12 + + #elif ENABLED(MINIPANEL) + + #if DISABLED(USE_INTERNAL_SD) + // PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. MKSLCD12864 PIN# + #define SDSS 11 // 36 C1 EXP2-13 EXP2-07 + #define SD_DETECT_PIN 9 // 34 E1 EXP2-11 EXP2-04 + #endif + + // PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. MKSLCD12864 PIN# + #define DOGLCD_A0 4 // 29 D4 EXP2-05 EXP1-04 + #define DOGLCD_CS 5 // 30 D5 EXP2-06 EXP1-05 + #define BTN_ENC 6 // 31 D6 EXP2-07 EXP1-09 + #define BEEPER_PIN 7 // 32 D7 EXP2-08 EXP1-10 + #define KILL_PIN 8 // 33 E0 EXP2-10 EXP2-03 + #define BTN_EN1 10 // 35 C0 EXP2-12 EXP2-06 + #define BTN_EN2 12 // 37 C2 EXP2-14 EXP2-08 + //#define LCD_BACKLIGHT_PIN 43 // 56 F5 EXP1-12 Not Implemented + //#define SCK 21 // 11 B1 ICSP-04 EXP2-09 + //#define MOSI 22 // 12 B2 ICSP-03 EXP2-05 + //#define MISO 23 // 13 B3 ICSP-06 EXP2-05 + + // 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) + + #else + + #define BTN_EN1 10 // C0 JP11-12 + #define BTN_EN2 11 // C1 JP11-13 + #define BTN_ENC 12 // C2 JP11-14 + + #endif + +#endif + +// +// Misc. Functions +// +// PIN FASTIO PIN# ATUSB90 PIN# Teensy2.0++ PIN# Printrboard RevF Conn. +#ifndef SDSS + #define SDSS 20 // 10 B0 +#endif + +/** + * This is EXP1-2, which is also the TEMP_A_PIN for the Extrudrboard. + * If using w/ Extrudrboard, cut off pin 2 on the Extrudrboard male + * connector to ensure this is disconnected from the A THERM pullups. + * You probably want to set EXTRUDERS=2 and swap the Extrudrboard outputs, + * which will let you use Channel B on the Extrudrboard as E1. + */ +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 2 // Analog Input +#endif diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h new file mode 100644 index 00000000..4d083ecd --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -0,0 +1,185 @@ +/** + * 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 + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * 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 + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +#if NOT_TARGET(__AVR_AT90USB1286__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "SAV MkI" +#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#define DEFAULT_SOURCE_CODE_URL "https://tinyurl.com/onru38b" + +// +// Servos +// +#define SERVO0_PIN 39 // F1 In teensy's pin definition for pinMode (in servo.cpp) + +// +// Limit Switches +// +#define X_STOP_PIN 25 // B5 +#define Y_STOP_PIN 26 // B6 +//#define Z_STOP_PIN 27 // B7 +#define Z_STOP_PIN 36 // E4 For inductive sensor. +//#define E_STOP_PIN 36 // E4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // F7 Analog Input (Extruder) +#define TEMP_BED_PIN 6 // F6 Analog Input (Bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C - Bed + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 + +// Extension header pin mapping +// ---------------------------- +// SCL (I2C)-D0 A0 (An), IO +// SDA (I2C)-D1 A1 (An), IO +// RX1-D2 A2 (An), IO +// TX1-D3 A3 (An), IO +// PWM-D24 A4 (An), IO +// 5V GND +// 12V GND +#define EXT_AUX_SCL_D0 0 // D0 PWM0B +#define EXT_AUX_SDA_D1 1 // D1 +#define EXT_AUX_RX1_D2 2 // D2 +#define EXT_AUX_TX1_D3 3 // D3 +#define EXT_AUX_PWM_D24 24 // B4 PWM2A +#define EXT_AUX_A0 0 // F0 Analog Input +#define EXT_AUX_A0_IO 38 // F0 Digital IO +#define EXT_AUX_A1 1 // F1 Analog Input +#define EXT_AUX_A1_IO 39 // F1 Digital IO +#define EXT_AUX_A2 2 // F2 Analog Input +#define EXT_AUX_A2_IO 40 // F2 Digital IO +#define EXT_AUX_A3 3 // F3 Analog Input +#define EXT_AUX_A3_IO 41 // F3 Digital IO +#define EXT_AUX_A4 4 // F4 Analog Input +#define EXT_AUX_A4_IO 42 // F4 Digital IO + +// +// LCD / Controller +// +#define BEEPER_PIN -1 +#define LCD_PINS_RS -1 +#define LCD_PINS_ENABLE -1 + +#if ENABLED(SAV_3DLCD) + // For LCD SHIFT register LCD + #define SR_DATA_PIN EXT_AUX_SDA_D1 + #define SR_CLK_PIN EXT_AUX_SCL_D0 +#endif + +#if EITHER(SAV_3DLCD, SAV_3DGLCD) + + #define BTN_EN1 EXT_AUX_A1_IO + #define BTN_EN2 EXT_AUX_A0_IO + #define BTN_ENC EXT_AUX_PWM_D24 + + #define KILL_PIN EXT_AUX_A2_IO + #define HOME_PIN EXT_AUX_A4_IO + +#else // Use the expansion header for spindle control + + // + // M3/M4/M5 - Spindle/Laser Control + // + #define SPINDLE_LASER_PWM_PIN 24 // B4 PWM2A + #define SPINDLE_LASER_ENA_PIN 39 // F1 Pin should have a pullup! + #define SPINDLE_DIR_PIN 40 // F2 + + #define CASE_LIGHT_PIN 0 // D0 PWM0B + +#endif diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h new file mode 100644 index 00000000..4efd83d9 --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -0,0 +1,188 @@ +/** + * 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 + +/** + * Rev B 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * There are two Arduino IDE extensions that are compatible with this board + * and with the mainstream Marlin software. + * + * 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 + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + +/** + * Teensy++ 2.0 Breadboard pin assignments (AT90USB1286) + * Requires the Teensyduino software with Teensy++ 2.0 selected in Arduino IDE! + * https://www.pjrc.com/teensy/teensyduino.html + * See https://reprap.org/wiki/Printrboard for more info + * + * CLI build: HARDWARE_MOTHERBOARD=84 make + * + * DaveX plan for Teensylu/printrboard-type pinouts for a TeensyBreadboard: + * (ref teensylu & sprinter) + * + * USB + * GND GND |-----#####-----| +5V ATX +5SB + * ATX PS_ON PWM 27 |b7 ##### b6| 26 PWM* Stepper Enable + * PWM 0 |d0 b5| 25 PWM* + * PWM 1 |d1 b4| 24 PWM + * X_MIN 2 |d2 b3| 23 MISO_PIN + * Y_MIN 3 |d3 b2| 22 MOSI_PIN + * Z_MIN 4 |d4 * * b1| 21 SCK_PIN + * 5 |d5 e e b0| 20 SDSS + * LED 6 |d6 5 4 e7| 19 + * 7 |d7 e6| 18 + * LCD RS 8 |e0 | GND + * LCD EN 9 |e1 a4 a0 R| AREF + * LCD D4 10 |c0 a5 a1 f0| 38 A0 ENC_1 + * LCD D5 11 |c1 a6 a2 f1| 39 A1 ENC_2 + * LCD D6 12 |c2 a7 a3 f2| 40 A2 ENC_CLK + * LCD D6 13 |c3 f3| 41 A3 + * Bed Heat PWM 14 |c4 V G R f4| 42 A4 + * Extruder Heat PWM 15 |c5 c n S f5| 43 A5 + * Fan PWM 16 |c6 c d T f6| 44 A6 Bed TC + * 17 |c7 * * * f7| 45 A7 Extruder TC * 4.7k * +5 + * ----------------- + * + * Interior E4: 36, INT4 + * Interior E5: 37, INT5 + * Interior PA0-7: 28-35 -- Printrboard and Teensylu use these pins for step & direction: + * T++ PA Signal Marlin + * + * Z STEP 32 a4 a0 28 X STEP + * Z DIR 33 a5 a1 29 X DIR + * E STEP 34 a6 a2 30 Y STEP + * E DIR 35 a7 a3 31 Y DIR + */ + +#if NOT_TARGET(__AVR_AT90USB1286__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Teensy++2.0" + +// +// Limit Switches +// +#define X_STOP_PIN 2 // D2 +#define Y_STOP_PIN 3 // D3 +#define Z_STOP_PIN 4 // D4 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 Marlin +#define X_DIR_PIN 29 // A1 Marlin +#define X_ENABLE_PIN 26 // B6 + +#define Y_STEP_PIN 30 // A2 Marlin +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 26 // B6 Shared w/x + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 26 // B6 Shared w/x + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 26 // B6 Shared w/x + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // F7 Analog Input (Extruder) +#define TEMP_BED_PIN 6 // F6 Analog Input (Bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A Fan +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 +#define LED_PIN 6 // D6 +#define PS_ON_PIN 27 // B7 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 1 // D1 PWM2B MUST BE HARDWARE PWM +#endif + +// +// LCD / Controller +// +#if ENABLED(ULTIPANEL) + #define LCD_PINS_RS 8 // E0 + #define LCD_PINS_ENABLE 9 // E1 + #define LCD_PINS_D4 10 // C0 + #define LCD_PINS_D5 11 // C1 + #define LCD_PINS_D6 12 // C2 + #define LCD_PINS_D7 13 // C3 + #define BTN_EN1 38 // F0 + #define BTN_EN2 39 // F1 + #define BTN_ENC 40 // F2 +#endif + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_ENA_PIN 5 // D5 Pin should have a pullup! +#define SPINDLE_LASER_PWM_PIN 0 // D0 PWM0B MUST BE HARDWARE PWM +#define SPINDLE_DIR_PIN 7 // D7 diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h new file mode 100644 index 00000000..9de119b6 --- /dev/null +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -0,0 +1,164 @@ +/** + * 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 . + */ + +/** + * Rev C 2 JUN 2017 + * + * Converted to Arduino pin numbering + */ + +/** + * 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 - 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 + * libraries - they are not used with the Marlin software. + * + * Printrboard - https://github.com/scwimbush/Printrboard-HID-Arduino-IDE-Support + * This is basically Teensyduino but with a bootloader that can handle image sizes + * larger than 64K. + * + * Installation: + * + * 1. Go to the above URL, click on the "Clone or Download" button and then + * click on "Download ZIP" button. + * 2. Unzip the file, find the "printrboard" directory and then copy it to the + * hardware directory in Arduino. The Arduino hardware directory will probably + * be located in a path similar to this: C:\Program Files (x86)\Arduino\hardware. + * 3. Restart Arduino. + * 4. Select "Printrboard" from the 'Tools > Board' menu. + * + * Teensyduino is the most popular option. Printrboard is used if your board doesn't have + * the Teensyduino bootloader on it. + */ + +/** + * To burn the bootloader that comes with Printrboard: + * + * 1. Connect your programmer to the board. + * 2. In the Arduino IDE select "Printrboard" and then select the programmer. + * 3. In the Arduino IDE click on "burn bootloader". Don't worry about the "verify failed at 1F000" error message. + * 4. The programmer is no longer needed. Remove it. + */ + + /** + * SILKSCREEN ERROR + * + * The silkscreen for the endstops do NOT match the schematic. The silkscreen SHOULD + * read (from left to right) X-STOP, Y-STOP, Z-STOP & E-STOP. The silkscreen actually + * reads E-STOP, X-STOP, Y-STOP & Z-STOP. + * + * The pin assignments in this file match the silkscreen. + */ + +#if NOT_TARGET(__AVR_AT90USB1286__, __AVR_AT90USB1286P__) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Teensylu" + +// +// Limit Switch definitions that match the SCHEMATIC +// +//#define X_STOP_PIN 25 // B5 +//#define Y_STOP_PIN 26 // B6 +//#define Z_STOP_PIN 27 // B7 +//#define E_STOP_PIN 36 // E4 + +// +// Limit Switch definitions that match the SILKSCREEN +// +#define X_STOP_PIN 26 // B6 +#define Y_STOP_PIN 27 // B7 +#define Z_STOP_PIN 36 // E4 +//#define E_STOP_PIN 25 // B5 + +// +// Steppers +// +#define X_STEP_PIN 28 // A0 +#define X_DIR_PIN 29 // A1 +#define X_ENABLE_PIN 19 // E7 + +#define Y_STEP_PIN 30 // A2 +#define Y_DIR_PIN 31 // A3 +#define Y_ENABLE_PIN 18 // E6 + +#define Z_STEP_PIN 32 // A4 +#define Z_DIR_PIN 33 // A5 +#define Z_ENABLE_PIN 17 // C7 + +#define E0_STEP_PIN 34 // A6 +#define E0_DIR_PIN 35 // A7 +#define E0_ENABLE_PIN 13 // C3 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 7 // Analog Input (Extruder) +#define TEMP_BED_PIN 6 // Analog Input (Bed) + +// +// Heaters / Fans +// +#define HEATER_0_PIN 15 // C5 PWM3B - Extruder +#define HEATER_BED_PIN 14 // C4 PWM3C + +#ifndef FAN_PIN + #define FAN_PIN 16 // C6 PWM3A +#endif + +// +// Misc. Functions +// +#define SDSS 20 // B0 JP31-6 + +#ifndef CASE_LIGHT_PIN + #define CASE_LIGHT_PIN 0 // D0 IO-14 PWM0B +#endif + +// +// LCD / Controller +// +#if BOTH(ULTRA_LCD, NEWPANEL) + + #define BEEPER_PIN -1 + + #if ENABLED(LCD_I2C_PANELOLU2) + #define BTN_EN1 3 // D3 IO-8 + #define BTN_EN2 2 // D2 IO-10 + #define BTN_ENC 41 // F3 IO-7 + #define SDSS 38 // F0 IO-13 use SD card on Panelolu2 + #endif + + #define SD_DETECT_PIN -1 + +#endif // ULTRA_LCD && NEWPANEL + +// +// M3/M4/M5 - Spindle/Laser Control +// +#define SPINDLE_LASER_PWM_PIN 24 // B4 IO-3 PWM2A - MUST BE HARDWARE PWM +#define SPINDLE_LASER_ENA_PIN 39 // F1 IO-11 - Pin should have a pullup! +#define SPINDLE_DIR_PIN 40 // F2 IO-9 diff --git a/Marlin/src/pins/teensy3/pins_TEENSY31_32.h b/Marlin/src/pins/teensy3/pins_TEENSY31_32.h new file mode 100644 index 00000000..0edb5cb1 --- /dev/null +++ b/Marlin/src/pins/teensy3/pins_TEENSY31_32.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 + +/** + * 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! + * https://www.pjrc.com/teensy/teensyduino.html + */ + +#if NOT_TARGET(IS_TEENSY_31_32) + #error "Oops! Select 'Teensy 3.1' or 'Teensy 3.2' in 'Tools > Board.'" +#endif + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Teensy3.2" +#endif + +// +// Limit Switches +// +#define X_STOP_PIN 3 +#define Y_STOP_PIN 4 +#define Z_STOP_PIN 5 + +// +// Steppers +// +#define X_STEP_PIN 5 +#define X_DIR_PIN 6 +#define X_ENABLE_PIN 2 + +#define Y_STEP_PIN 7 +#define Y_DIR_PIN 8 +#define Y_ENABLE_PIN 2 + +#define Z_STEP_PIN 9 +#define Z_DIR_PIN 10 +#define Z_ENABLE_PIN 2 + +#define E0_STEP_PIN 11 +#define E0_DIR_PIN 12 +#define E0_ENABLE_PIN 2 + +//#define E1_STEP_PIN 33 +//#define E1_DIR_PIN 34 +//#define E1_ENABLE_PIN 35 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 20 +//#define HEATER_1_PIN 36 +#define HEATER_BED_PIN 21 +#ifndef FAN_PIN + #define FAN_PIN 22 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 14 // Analog Input - Extruder 2 => A2 +//#define TEMP_1_PIN 0 // Analog Input +#define TEMP_BED_PIN 15 // Analog Input - Bed + +#ifndef FILWIDTH_PIN + #define FILWIDTH_PIN 6 // Analog Input +#endif + +// +// Misc. Functions +// +#define LED_PIN 13 +//#define SOL1_PIN 28 +//#define SDSS 16 // 8 + +// +// LCD / Controller +// + +/* +#if HAS_WIRED_LCD + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 41 + #define LCD_PINS_D4 42 + #define LCD_PINS_D5 43 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 45 + #define BTN_EN1 46 + #define BTN_EN2 47 + #define BTN_ENC 48 +#endif +*/ diff --git a/Marlin/src/pins/teensy3/pins_TEENSY35_36.h b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h new file mode 100644 index 00000000..2e09c8a4 --- /dev/null +++ b/Marlin/src/pins/teensy3/pins_TEENSY35_36.h @@ -0,0 +1,152 @@ +/** + * 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 + +/**************************************************************************************** +* 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! +* https://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if NOT_TARGET(IS_TEENSY_35_36) + #error "Oops! Select 'Teensy 3.5' or 'Teensy 3.6' in 'Tools > Board.'" +#endif + +#if IS_TEENSY35 + #define BOARD_INFO_NAME "Teensy3.5" +#elif IS_TEENSY36 + #define BOARD_INFO_NAME "Teensy3.6" +#endif + +/** + * Plan for Teensy 3.5 and Teensy 3.6: + * USB + * GND |-----#####-----| VIN 5V + * X_STEP_PIN MOSI1 RX1 0 | ##### | Analog GND + * X_DIR_PIN MISO1 TX1 1 | | 3.3V + * Y_STEP_PIN PWM 2 | *NC AREF* | 23 A9 PWM + * Y_DIR_PIN SCL2 CAN0TX PWM 3 | *A26 A10* | 22 A8 PWM + * Z_STEP_PIN SDA2 CAN0RX PWM 4 | *A25 A11* | 21 A7 PWM CS0 MOSI1 RX1 + * Z_DIR_PIN MISO1 TX1 PWM 5 | *GND * * 57 | 20 A6 PWM CS0 SCK1 FILWIDTH_PIN + * X_ENABLE_PIN PWM 6 | *GND * * 56 | 19 A5 SCL0 E0_STEP_PIN + * Y_ENABLE_PIN SCL0 MOSI0 RX3 PWM 7 | * * 55 | 18 A4 SDA0 E0_DIR_PIN + * Z_ENABLE_PIN SDA0 MISO0 TX3 PWM 8 | * * 54 | 17 A3 SDA0 E0_ENABLE_PIN + * CS0 RX2 PWM 9 | | 16 A2 SCL0 TEMP_0_PIN + * CS0 TX2 PWM 10 | | 15 A1 CS0 TEMP_BED_PIN + * X_STOP_PIN MOSI0 11 | | 14 A0 PWM CS0 TEMP_1_PIN + * Y_STOP_PIN MISO0 12 | | 13 LED SCK0 LED_PIN + * 3.3V | | GND + * Z_STOP_PIN 24 | 40 * * 53 | A22 DAC1 + * AUX2 25 | 41 * * 52 | A21 DAC0 + * AUX2 FAN_PIN SCL2 TX1 26 | 42 * * 51 | 39 A20 MISO0 SDSS + * AUX2 Z-PROBE PWR SCK0 RX1 27 | * * * * * | 38 A19 PWM SDA1 + * AUX2 SOL1_PIN MOSI0 28 | 43 * * 50 | 37 A18 PWM SCL1 + * D10 CONTROLLER_FAN_PIN CAN0TX PWM 29 | 44 * * 49 | 36 A17 PWM + * D9 HEATER_0_PIN CAN0RX PWM 30 | 45 * * 48 | 35 A16 PWM E1_ENABLE_PIN + * D8 HEATER_BED_PIN CS1 RX4 A12 31 | 46 * * 47 | 34 A15 PWM SDA0 RX5 E1_DIR_PIN + * SCK1 TX4 A13 32 |__GND_*_*_3.3V_| 33 A14 PWM SCL0 TX5 E1_STEP_PIN + * + * Interior pins: + * LCD_PINS_RS 40 * * 53 SCK2 + * LCD_PINS_ENABLE 41 * * 52 MOSI2 + * LCD_PINS_D4 42 * * 51 MISO2 + * LCD_PINS_D5 CS2 43 * * 50 A24 + * LCD_PINS_D6 MOSI2 44 * * 49 A23 + * LCD_PINS_D7 MISO2 45 * * 48 TX6 SDA0 BTN_ENC + * BTN_EN1 SCK2 46 * * 47 RX6 SCL0 BTN_EN2 + * GND * * 3.3V + */ + +// +// Limit Switches +// +#define X_STOP_PIN 24 +#define Y_STOP_PIN 26 +#define Z_STOP_PIN 28 + +// +// Steppers +// +#define X_STEP_PIN 22 +#define X_DIR_PIN 21 +#define X_ENABLE_PIN 39 + +#define Y_STEP_PIN 19 +#define Y_DIR_PIN 18 +#define Y_ENABLE_PIN 20 + +#define Z_STEP_PIN 38 +#define Z_DIR_PIN 37 +#define Z_ENABLE_PIN 17 + +#define E0_STEP_PIN 31 +#define E0_DIR_PIN 30 +#define E0_ENABLE_PIN 32 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 35 + +#define HEATER_0_PIN 30 +#define HEATER_1_PIN 36 +#define HEATER_BED_PIN 31 +#ifndef FAN_PIN + #define FAN_PIN 2 +#endif + +#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 0 +#define TEMP_BED_PIN 1 // Bed / Analog pin numbering + +// +// Misc. Functions +// +#define LED_PIN 13 +#define PS_ON_PIN 1 +#define FILWIDTH_PIN 6 +#define SOL1_PIN 28 + +// +// SD Card +// +#define SDSS 39 // 8 + +#if HAS_WIRED_LCD + #define LCD_PINS_RS 40 + #define LCD_PINS_ENABLE 41 + #define LCD_PINS_D4 42 + #define LCD_PINS_D5 43 + #define LCD_PINS_D6 44 + #define LCD_PINS_D7 45 +#endif + +#if ENABLED(NEWPANEL) + #define BTN_EN1 46 + #define BTN_EN2 47 + #define BTN_ENC 48 +#endif + +#if ENABLED(REPRAPWORLD_KEYPAD) + #define SHIFT_OUT 40 + #define SHIFT_CLK 44 + #define SHIFT_LD 42 +#endif diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h new file mode 100644 index 00000000..5f62bb05 --- /dev/null +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -0,0 +1,126 @@ +/** + * 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 + +/**************************************************************************************** +* Teensy 4.1 (IMXRT1062) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 4.1 selected in Arduino IDE! +* https://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if NOT_TARGET(IS_TEENSY41) + #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Teensy4.1" + +/** + * Plan for Teensy 4.0 and Teensy 4.1: + * USB + * GND |-----#####-----| VIN (3.65 TO 5.5V) + * RX1 CS1 RX1 PWM 0 | ##### | GND + * TX1 MISO1 TX1 PWM 1 | | 3.3V + * STPX PWM 2 | | 23 A9 PWM + * DIRX PWM 3 | | 22 A8 PWM LIMZ + * STPY PWM 4 | | 21 A7 RX5 LIMY + * DIRY PWM 5 | | 20 A6 TX5 LIMX + * STPZ PWM 6 | | 19 A5 PWM SCL0 COOL + * DIRZ RX2 PWM 7 | | 18 A4 PWM SDA0 MIST + * STPA TX2 PWM 8 | | 17 A3 RX4 SDA1 CYST + * DIRA PWM 9 | | 16 A2 TX4 SCL1 EHOLD + * STEN PWM 10 | | 15 A1 PWM RX3 PRB + * SPDI MOSI0 PWM 11 | | 14 A0 PWM TX3 PANIC + * SPEN MISO0 PWM 12 | | 13 LED PWM SCK0 SPWM + * 3.3V | | GND + * SCL PWM 24 | | 41 A17 KPSTR + * SDA PWM 25 | | 40 A16 STENY + * STPB MOSI1 26 | | 39 A15 MISO1 STENZ + * DIRB SCK1 27 | * * * * * | 38 A14 STENA + * LIMB RX7 PWM 28 | | 37 PWM STENB + * DOOR TX7 PWM 29 | | 36 PWM ST0 + * ST1 30 | | 35 TX8 ST3 + * AUX0 31 | SDCARD | 34 RX8 ST2 + * AUX1 32 |_______________| 33 PWM AUX2 + */ + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +// +// Servos +// +#define SERVO0_PIN 24 +#define SERVO1_PIN 25 + +// +// Limit Switches +// +#define X_STOP_PIN 20 +#define Y_STOP_PIN 21 +#define Z_STOP_PIN 22 + +// +// Steppers +// +#define X_STEP_PIN 2 +#define X_DIR_PIN 3 +#define X_ENABLE_PIN 10 +//#define X_CS_PIN 30 + +#define Y_STEP_PIN 4 +#define Y_DIR_PIN 5 +#define Y_ENABLE_PIN 40 +//#define Y_CS_PIN 31 + +#define Z_STEP_PIN 6 +#define Z_DIR_PIN 7 +#define Z_ENABLE_PIN 39 +//#define Z_CS_PIN 32 + +#define E0_STEP_PIN 8 +#define E0_DIR_PIN 9 +#define E0_ENABLE_PIN 38 + +#define E1_STEP_PIN 26 +#define E1_DIR_PIN 27 +#define E1_ENABLE_PIN 37 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 31 +#define HEATER_1_PIN 32 +#define HEATER_BED_PIN 33 + +// +// Temperature Sensors +// +#define TEMP_0_PIN 5 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 4 +#define TEMP_BED_PIN 15 // Bed / Analog pin numbering + +// +// Misc. Functions +// +#define LED_PIN 13 +#define SOL0_PIN 17 diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h new file mode 100644 index 00000000..21a1ff67 --- /dev/null +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -0,0 +1,131 @@ +/** + * 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 + +/**************************************************************************************** +* Teensy 4.1 (IMXRT1062) Breadboard pin assignments +* Requires the Teensyduino software with Teensy 4.1 selected in Arduino IDE! +* https://www.pjrc.com/teensy/teensyduino.html +****************************************************************************************/ + +#if NOT_TARGET(IS_TEENSY41) + #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" +#endif + +#define BOARD_INFO_NAME "Teensy4.1" + +/** + * Plan for Teensy 4.0 and Teensy 4.1: + * USB + * GND |-----#####-----| VIN (3.65 TO 5.5V) + * X_STEP_PIN CS1 RX1 PWM 0 | ##### | GND + * X_DIR_PIN MISO1 TX1 PWM 1 | | 3.3V + * Y_STEP_PIN PWM 2 | | 23 A9 PWM SERVO1_PIN + * Y_DIR_PIN PWM 3 | | 22 A8 PWM SERVO0_PIN + * Z_STEP_PIN PWM 4 | | 21 A7 RX5 + * Z_DIR_PIN PWM 5 | | 20 A6 TX5 FILWIDTH_PIN + * X_ENABLE_PIN PWM 6 | | 19 A5 PWM SCL0 + * Y_ENABLE_PIN RX2 PWM 7 | | 18 A4 PWM SDA0 HEATER_1_PIN + * Z_ENABLE_PIN TX2 PWM 8 | | 17 A3 RX4 SDA1 + * E0_STEP_PIN PWM 9 | | 16 A2 TX4 SCL1 TEMP_0_PIN + * E0_DIR_PIN PWM 10 | | 15 A1 PWM RX3 TEMP_BED_PIN + * MOSI_PIN MOSI0 PWM 11 | | 14 A0 PWM TX3 TEMP_1_PIN + * MISO_PIN MISO0 PWM 12 | | 13 LED PWM SCK0 SCK_PIN + * 3.3V | | GND + * Z_STOP_PIN PWM 24 | | 41 A17 + * E0_ENABLE_PIN PWM 25 | | 40 A16 + * FAN_PIN MOSI1 26 | | 39 A15 MISO1 X_STOP_PIN + * Z-PROBE PWR SCK1 27 | * * * * * | 38 A14 Y_STOP_PIN + * SOL1_PIN RX7 PWM 28 | | 37 PWM HEATER_0_PIN + * FAN_PIN TX7 PWM 29 | | 36 PWM HEATER_BED_PIN + * X_CS_PIN 30 | | 35 TX8 E1_ENABLE_PIN + * y_CS_PIN 31 | SDCARD | 34 RX8 E1_DIR_PIN + * Z_CS_PIN 32 |_______________| 33 PWM E1_STEP_PIN + */ + +// +// Servos +// +#define SERVO0_PIN 22 +#define SERVO1_PIN 23 + +// +// Limit Switches +// +#define X_STOP_PIN 39 +#define Y_STOP_PIN 38 +#define Z_STOP_PIN 24 + +// +// Steppers +// +#define X_STEP_PIN 0 +#define X_DIR_PIN 1 +#define X_ENABLE_PIN 6 +//#define X_CS_PIN 30 + +#define Y_STEP_PIN 2 +#define Y_DIR_PIN 3 +#define Y_ENABLE_PIN 7 +//#define Y_CS_PIN 31 + +#define Z_STEP_PIN 4 +#define Z_DIR_PIN 5 +#define Z_ENABLE_PIN 8 +//#define Z_CS_PIN 32 + +#define E0_STEP_PIN 9 +#define E0_DIR_PIN 10 +#define E0_ENABLE_PIN 25 + +#define E1_STEP_PIN 33 +#define E1_DIR_PIN 34 +#define E1_ENABLE_PIN 35 + +// +// Heaters / Fans +// +#define HEATER_0_PIN 37 +#define HEATER_1_PIN 18 +#define HEATER_BED_PIN 36 +#ifndef FAN_PIN + #define FAN_PIN 29 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 2 // Extruder / Analog pin numbering: 2 => A2 +#define TEMP_1_PIN 0 +#define TEMP_BED_PIN 1 // Bed / Analog pin numbering + +// +// Misc. Functions +// +#define LED_PIN 13 +#define SOL0_PIN 28 +//#define PS_ON_PIN 1 +//#define FILWIDTH_PIN 6 // A6 + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp new file mode 100644 index 00000000..491c0692 --- /dev/null +++ b/Marlin/src/sd/Sd2Card.cpp @@ -0,0 +1,669 @@ +/** + * 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 . + * + */ + +/** + * Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + * Updated with backports of the latest SdFat library from the same author + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) && NONE(USB_FLASH_DRIVE_SUPPORT, SDIO_SUPPORT) + +/* Enable FAST CRC computations - You can trade speed for FLASH space if + * needed by disabling the following define */ +#define FAST_CRC 1 + +#include "Sd2Card.h" + +#include "../MarlinCore.h" + +#if ENABLED(SD_CHECK_AND_RETRY) + static bool crcSupported = true; + + #ifdef FAST_CRC + static const uint8_t crctab7[] PROGMEM = { + 0x00,0x09,0x12,0x1B,0x24,0x2D,0x36,0x3F,0x48,0x41,0x5A,0x53,0x6C,0x65,0x7E,0x77, + 0x19,0x10,0x0B,0x02,0x3D,0x34,0x2F,0x26,0x51,0x58,0x43,0x4A,0x75,0x7C,0x67,0x6E, + 0x32,0x3B,0x20,0x29,0x16,0x1F,0x04,0x0D,0x7A,0x73,0x68,0x61,0x5E,0x57,0x4C,0x45, + 0x2B,0x22,0x39,0x30,0x0F,0x06,0x1D,0x14,0x63,0x6A,0x71,0x78,0x47,0x4E,0x55,0x5C, + 0x64,0x6D,0x76,0x7F,0x40,0x49,0x52,0x5B,0x2C,0x25,0x3E,0x37,0x08,0x01,0x1A,0x13, + 0x7D,0x74,0x6F,0x66,0x59,0x50,0x4B,0x42,0x35,0x3C,0x27,0x2E,0x11,0x18,0x03,0x0A, + 0x56,0x5F,0x44,0x4D,0x72,0x7B,0x60,0x69,0x1E,0x17,0x0C,0x05,0x3A,0x33,0x28,0x21, + 0x4F,0x46,0x5D,0x54,0x6B,0x62,0x79,0x70,0x07,0x0E,0x15,0x1C,0x23,0x2A,0x31,0x38, + 0x41,0x48,0x53,0x5A,0x65,0x6C,0x77,0x7E,0x09,0x00,0x1B,0x12,0x2D,0x24,0x3F,0x36, + 0x58,0x51,0x4A,0x43,0x7C,0x75,0x6E,0x67,0x10,0x19,0x02,0x0B,0x34,0x3D,0x26,0x2F, + 0x73,0x7A,0x61,0x68,0x57,0x5E,0x45,0x4C,0x3B,0x32,0x29,0x20,0x1F,0x16,0x0D,0x04, + 0x6A,0x63,0x78,0x71,0x4E,0x47,0x5C,0x55,0x22,0x2B,0x30,0x39,0x06,0x0F,0x14,0x1D, + 0x25,0x2C,0x37,0x3E,0x01,0x08,0x13,0x1A,0x6D,0x64,0x7F,0x76,0x49,0x40,0x5B,0x52, + 0x3C,0x35,0x2E,0x27,0x18,0x11,0x0A,0x03,0x74,0x7D,0x66,0x6F,0x50,0x59,0x42,0x4B, + 0x17,0x1E,0x05,0x0C,0x33,0x3A,0x21,0x28,0x5F,0x56,0x4D,0x44,0x7B,0x72,0x69,0x60, + 0x0E,0x07,0x1C,0x15,0x2A,0x23,0x38,0x31,0x46,0x4F,0x54,0x5D,0x62,0x6B,0x70,0x79 + }; + + static uint8_t CRC7(const uint8_t* data, uint8_t n) { + uint8_t crc = 0; + while (n > 0) { + crc = pgm_read_byte(&crctab7[ (crc << 1) ^ *data++ ]); + n--; + } + return (crc << 1) | 1; + } + #else + static uint8_t CRC7(const uint8_t* data, uint8_t n) { + uint8_t crc = 0; + LOOP_L_N(i, n) { + uint8_t d = data[i]; + d ^= crc << 1; + if (d & 0x80) d ^= 9; + crc = d ^ (crc & 0x78) ^ (crc << 4) ^ ((crc >> 3) & 15); + crc &= 0x7F; + } + crc = (crc << 1) ^ (crc << 4) ^ (crc & 0x70) ^ ((crc >> 3) & 0x0F); + return crc | 1; + } + #endif +#endif + +// Send command and return error code. Return zero for OK +uint8_t Sd2Card::cardCommand(const uint8_t cmd, const uint32_t arg) { + // Select card + chipSelect(); + + // Wait up to 300 ms if busy + waitNotBusy(SD_WRITE_TIMEOUT); + + uint8_t *pa = (uint8_t *)(&arg); + + #if ENABLED(SD_CHECK_AND_RETRY) + + // Form message + uint8_t d[6] = {(uint8_t) (cmd | 0x40), pa[3], pa[2], pa[1], pa[0] }; + + // Add crc + d[5] = CRC7(d, 5); + + // Send message + LOOP_L_N(k, 6) spiSend(d[k]); + + #else + // Send command + spiSend(cmd | 0x40); + + // Send argument + for (int8_t i = 3; i >= 0; i--) spiSend(pa[i]); + + // Send CRC - correct for CMD0 with arg zero or CMD8 with arg 0X1AA + spiSend(cmd == CMD0 ? 0X95 : 0X87); + #endif + + // Skip stuff byte for stop read + if (cmd == CMD12) spiRec(); + + // Wait for response + for (uint8_t i = 0; ((status_ = spiRec()) & 0x80) && i != 0xFF; i++) { /* Intentionally left empty */ } + return status_; +} + +/** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data blocks in the card + * or zero if an error occurs. + */ +uint32_t Sd2Card::cardSize() { + csd_t csd; + if (!readCSD(&csd)) return 0; + if (csd.v1.csd_ver == 0) { + uint8_t read_bl_len = csd.v1.read_bl_len; + uint16_t c_size = (csd.v1.c_size_high << 10) + | (csd.v1.c_size_mid << 2) | csd.v1.c_size_low; + uint8_t c_size_mult = (csd.v1.c_size_mult_high << 1) + | csd.v1.c_size_mult_low; + return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); + } + else if (csd.v2.csd_ver == 1) { + uint32_t c_size = ((uint32_t)csd.v2.c_size_high << 16) + | (csd.v2.c_size_mid << 8) | csd.v2.c_size_low; + return (c_size + 1) << 10; + } + else { + error(SD_CARD_ERROR_BAD_CSD); + return 0; + } +} + +void Sd2Card::chipDeselect() { + extDigitalWrite(chipSelectPin_, HIGH); + spiSend(0xFF); // Ensure MISO goes high impedance +} + +void Sd2Card::chipSelect() { + spiInit(spiRate_); + extDigitalWrite(chipSelectPin_, LOW); +} + +/** + * Erase a range of blocks. + * + * \param[in] firstBlock The address of the first block in the range. + * \param[in] lastBlock The address of the last block in the range. + * + * \note This function requests the SD card to do a flash erase for a + * range of blocks. The data on the card after an erase operation is + * either 0 or 1, depends on the card vendor. The card must support + * single block erase. + * + * \return true for success, false for failure. + */ +bool Sd2Card::erase(uint32_t firstBlock, uint32_t lastBlock) { + if (ENABLED(SDCARD_READONLY)) return false; + + csd_t csd; + if (!readCSD(&csd)) goto FAIL; + + // check for single block erase + if (!csd.v1.erase_blk_en) { + // erase size mask + uint8_t m = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; + if ((firstBlock & m) != 0 || ((lastBlock + 1) & m) != 0) { + // error card can't erase specified area + error(SD_CARD_ERROR_ERASE_SINGLE_BLOCK); + goto FAIL; + } + } + if (type_ != SD_CARD_TYPE_SDHC) { firstBlock <<= 9; lastBlock <<= 9; } + if (cardCommand(CMD32, firstBlock) || cardCommand(CMD33, lastBlock) || cardCommand(CMD38, 0)) { + error(SD_CARD_ERROR_ERASE); + goto FAIL; + } + if (!waitNotBusy(SD_ERASE_TIMEOUT)) { + error(SD_CARD_ERROR_ERASE_TIMEOUT); + goto FAIL; + } + chipDeselect(); + return true; + FAIL: + chipDeselect(); + return false; +} + +/** + * Determine if card supports single block erase. + * + * \return true if single block erase is supported. + * false if single block erase is not supported. + */ +bool Sd2Card::eraseSingleBlockEnable() { + csd_t csd; + return readCSD(&csd) ? csd.v1.erase_blk_en : false; +} + +/** + * Initialize an SD flash memory card. + * + * \param[in] sckRateID SPI clock rate selector. See setSckRate(). + * \param[in] chipSelectPin SD chip select pin number. + * + * \return true for success, false for failure. + * The reason for failure can be determined by calling errorCode() and errorData(). + */ +bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { + #if IS_TEENSY_35_36 || IS_TEENSY_40_41 + chipSelectPin_ = BUILTIN_SDCARD; + const uint8_t ret = SDHC_CardInit(); + type_ = SDHC_CardGetType(); + return (ret == 0); + #endif + + errorCode_ = type_ = 0; + chipSelectPin_ = chipSelectPin; + // 16-bit init start time allows over a minute + const millis_t init_timeout = millis() + SD_INIT_TIMEOUT; + uint32_t arg; + + watchdog_refresh(); // In case init takes too long + + // Set pin modes + #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 + spiRate_ = SPI_SD_INIT_RATE; + spiInit(spiRate_); + + // Must supply min of 74 clock cycles with CS high. + LOOP_L_N(i, 10) spiSend(0xFF); + + watchdog_refresh(); // In case init takes too long + + // Command to go idle in SPI mode + while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) { + if (ELAPSED(millis(), init_timeout)) { + error(SD_CARD_ERROR_CMD0); + goto FAIL; + } + } + + #if ENABLED(SD_CHECK_AND_RETRY) + crcSupported = (cardCommand(CMD59, 1) == R1_IDLE_STATE); + #endif + + watchdog_refresh(); // In case init takes too long + + // check SD version + for (;;) { + if (cardCommand(CMD8, 0x1AA) == (R1_ILLEGAL_COMMAND | R1_IDLE_STATE)) { + type(SD_CARD_TYPE_SD1); + break; + } + + // Get the last byte of r7 response + LOOP_L_N(i, 4) status_ = spiRec(); + if (status_ == 0xAA) { + type(SD_CARD_TYPE_SD2); + break; + } + + if (ELAPSED(millis(), init_timeout)) { + error(SD_CARD_ERROR_CMD8); + goto FAIL; + } + } + + watchdog_refresh(); // In case init takes too long + + // Initialize card and send host supports SDHC if SD2 + arg = type() == SD_CARD_TYPE_SD2 ? 0x40000000 : 0; + while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) { + // Check for timeout + if (ELAPSED(millis(), init_timeout)) { + error(SD_CARD_ERROR_ACMD41); + goto FAIL; + } + } + // If SD2 read OCR register to check for SDHC card + if (type() == SD_CARD_TYPE_SD2) { + if (cardCommand(CMD58, 0)) { + error(SD_CARD_ERROR_CMD58); + goto FAIL; + } + if ((spiRec() & 0xC0) == 0xC0) type(SD_CARD_TYPE_SDHC); + // Discard rest of ocr - contains allowed voltage range + LOOP_L_N(i, 3) spiRec(); + } + chipDeselect(); + + return setSckRate(sckRateID); + + FAIL: + chipDeselect(); + return false; +} + +/** + * Read a 512 byte block from an SD card. + * + * \param[in] blockNumber Logical block to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success, false for failure. + */ +bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { + #if IS_TEENSY_35_36 || IS_TEENSY_40_41 + return 0 == SDHC_CardReadBlock(dst, blockNumber); + #endif + + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card + + #if ENABLED(SD_CHECK_AND_RETRY) + uint8_t retryCnt = 3; + for (;;) { + if (cardCommand(CMD17, blockNumber)) + error(SD_CARD_ERROR_CMD17); + else if (readData(dst, 512)) + return true; + + chipDeselect(); + if (!--retryCnt) break; + + cardCommand(CMD12, 0); // Try sending a stop command, ignore the result. + errorCode_ = 0; + } + return false; + #else + if (cardCommand(CMD17, blockNumber)) { + error(SD_CARD_ERROR_CMD17); + chipDeselect(); + return false; + } + else + return readData(dst, 512); + #endif +} + +/** + * Read one data block in a multiple block read sequence + * + * \param[in] dst Pointer to the location for the data to be read. + * + * \return true for success, false for failure. + */ +bool Sd2Card::readData(uint8_t* dst) { + chipSelect(); + return readData(dst, 512); +} + +#if ENABLED(SD_CHECK_AND_RETRY) + #ifdef FAST_CRC + static const uint16_t crctab16[] PROGMEM = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 + }; + // faster CRC-CCITT + // uses the x^16,x^12,x^5,x^1 polynomial. + static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + uint16_t crc = 0; + for (size_t i = 0; i < n; i++) { + crc = pgm_read_word(&crctab16[(crc >> 8 ^ data[i]) & 0xFF]) ^ (crc << 8); + } + return crc; + } + #else + // slower CRC-CCITT + // uses the x^16,x^12,x^5,x^1 polynomial. + static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + uint16_t crc = 0; + for (size_t i = 0; i < n; i++) { + crc = (uint8_t)(crc >> 8) | (crc << 8); + crc ^= data[i]; + crc ^= (uint8_t)(crc & 0xFF) >> 4; + crc ^= crc << 12; + crc ^= (crc & 0xFF) << 5; + } + return crc; + } + #endif +#endif // SD_CHECK_AND_RETRY + +bool Sd2Card::readData(uint8_t* dst, const uint16_t count) { + bool success = false; + + const millis_t read_timeout = millis() + SD_READ_TIMEOUT; + while ((status_ = spiRec()) == 0xFF) { // Wait for start block token + if (ELAPSED(millis(), read_timeout)) { + error(SD_CARD_ERROR_READ_TIMEOUT); + goto FAIL; + } + } + + if (status_ == DATA_START_BLOCK) { + spiRead(dst, count); // Transfer data + + const uint16_t recvCrc = (spiRec() << 8) | spiRec(); + #if ENABLED(SD_CHECK_AND_RETRY) + success = !crcSupported || recvCrc == CRC_CCITT(dst, count); + if (!success) error(SD_CARD_ERROR_READ_CRC); + #else + success = true; + UNUSED(recvCrc); + #endif + } + else + error(SD_CARD_ERROR_READ); + + FAIL: + chipDeselect(); + return success; +} + +/** read CID or CSR register */ +bool Sd2Card::readRegister(const uint8_t cmd, void* buf) { + uint8_t* dst = reinterpret_cast(buf); + if (cardCommand(cmd, 0)) { + error(SD_CARD_ERROR_READ_REG); + chipDeselect(); + return false; + } + return readData(dst, 16); +} + +/** + * Start a read multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * + * \note This function is used with readData() and readStop() for optimized + * multiple block reads. SPI chipSelect must be low for the entire sequence. + * + * \return true for success, false for failure. + */ +bool Sd2Card::readStart(uint32_t blockNumber) { + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; + + const bool success = !cardCommand(CMD18, blockNumber); + if (!success) error(SD_CARD_ERROR_CMD18); + chipDeselect(); + return success; +} + +/** + * End a read multiple blocks sequence. + * + * \return true for success, false for failure. + */ +bool Sd2Card::readStop() { + chipSelect(); + const bool success = !cardCommand(CMD12, 0); + if (!success) error(SD_CARD_ERROR_CMD12); + chipDeselect(); + return success; +} + +/** + * Set the SPI clock rate. + * + * \param[in] sckRateID A value in the range [0, 6]. + * + * The SPI clock will be set to F_CPU/pow(2, 1 + sckRateID). The maximum + * SPI rate is F_CPU/2 for \a sckRateID = 0 and the minimum rate is F_CPU/128 + * for \a scsRateID = 6. + * + * \return The value one, true, is returned for success and the value zero, + * false, is returned for an invalid value of \a sckRateID. + */ +bool Sd2Card::setSckRate(const uint8_t sckRateID) { + const bool success = (sckRateID <= 6); + if (success) spiRate_ = sckRateID; else error(SD_CARD_ERROR_SCK_RATE); + return success; +} + +/** + * Wait for card to become not-busy + * \param[in] timeout_ms Timeout to abort. + * \return true for success, false for timeout. + */ +bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { + const millis_t wait_timeout = millis() + timeout_ms; + while (spiRec() != 0xFF) if (ELAPSED(millis(), wait_timeout)) return false; + return true; +} + +/** + * Write a 512 byte block to an SD card. + * + * \param[in] blockNumber Logical block to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return true for success, false for failure. + */ +bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { + if (ENABLED(SDCARD_READONLY)) return false; + + #if IS_TEENSY_35_36 || IS_TEENSY_40_41 + return 0 == SDHC_CardWriteBlock(src, blockNumber); + #endif + + bool success = false; + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card + if (!cardCommand(CMD24, blockNumber)) { + if (writeData(DATA_START_BLOCK, src)) { + if (waitNotBusy(SD_WRITE_TIMEOUT)) { // Wait for flashing to complete + success = !(cardCommand(CMD13, 0) || spiRec()); // Response is r2 so get and check two bytes for nonzero + if (!success) error(SD_CARD_ERROR_WRITE_PROGRAMMING); + } + else + error(SD_CARD_ERROR_WRITE_TIMEOUT); + } + } + else + error(SD_CARD_ERROR_CMD24); + + chipDeselect(); + return success; +} + +/** + * Write one data block in a multiple block write sequence + * \param[in] src Pointer to the location of the data to be written. + * \return true for success, false for failure. + */ +bool Sd2Card::writeData(const uint8_t* src) { + if (ENABLED(SDCARD_READONLY)) return false; + + bool success = true; + chipSelect(); + // Wait for previous write to finish + if (!waitNotBusy(SD_WRITE_TIMEOUT) || !writeData(WRITE_MULTIPLE_TOKEN, src)) { + error(SD_CARD_ERROR_WRITE_MULTIPLE); + success = false; + } + chipDeselect(); + return success; +} + +// Send one block of data for write block or write multiple blocks +bool Sd2Card::writeData(const uint8_t token, const uint8_t* src) { + if (ENABLED(SDCARD_READONLY)) return false; + + const uint16_t crc = TERN(SD_CHECK_AND_RETRY, CRC_CCITT(src, 512), 0xFFFF); + spiSendBlock(token, src); + spiSend(crc >> 8); + spiSend(crc & 0xFF); + + status_ = spiRec(); + if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) { + error(SD_CARD_ERROR_WRITE); + chipDeselect(); + return false; + } + return true; +} + +/** + * Start a write multiple blocks sequence. + * + * \param[in] blockNumber Address of first block in sequence. + * \param[in] eraseCount The number of blocks to be pre-erased. + * + * \note This function is used with writeData() and writeStop() + * for optimized multiple block writes. + * + * \return true for success, false for failure. + */ +bool Sd2Card::writeStart(uint32_t blockNumber, const uint32_t eraseCount) { + if (ENABLED(SDCARD_READONLY)) return false; + + bool success = false; + if (!cardAcmd(ACMD23, eraseCount)) { // Send pre-erase count + if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9; // Use address if not SDHC card + success = !cardCommand(CMD25, blockNumber); + if (!success) error(SD_CARD_ERROR_CMD25); + } + else + error(SD_CARD_ERROR_ACMD23); + + chipDeselect(); + return success; +} + +/** + * End a write multiple blocks sequence. + * + * \return true for success, false for failure. + */ +bool Sd2Card::writeStop() { + if (ENABLED(SDCARD_READONLY)) return false; + + bool success = false; + chipSelect(); + if (waitNotBusy(SD_WRITE_TIMEOUT)) { + spiSend(STOP_TRAN_TOKEN); + success = waitNotBusy(SD_WRITE_TIMEOUT); + } + else + error(SD_CARD_ERROR_STOP_TRAN); + + chipDeselect(); + return success; +} + +#endif // SDSUPPORT diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h new file mode 100644 index 00000000..6900502e --- /dev/null +++ b/Marlin/src/sd/Sd2Card.h @@ -0,0 +1,186 @@ +/** + * 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 + +/** + * \file + * \brief Sd2Card class for V2 SD/SDHC cards + */ + +/** + * Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "SdFatConfig.h" +#include "SdInfo.h" + +#include + +uint16_t const SD_INIT_TIMEOUT = 2000, // init timeout ms + SD_ERASE_TIMEOUT = 10000, // erase timeout ms + SD_READ_TIMEOUT = 300, // read timeout ms + SD_WRITE_TIMEOUT = 600; // write time out ms + +// SD card errors +uint8_t const SD_CARD_ERROR_CMD0 = 0x01, // timeout error for command CMD0 (initialize card in SPI mode) + SD_CARD_ERROR_CMD8 = 0x02, // CMD8 was not accepted - not a valid SD card + SD_CARD_ERROR_CMD12 = 0x03, // card returned an error response for CMD12 (write stop) + SD_CARD_ERROR_CMD17 = 0x04, // card returned an error response for CMD17 (read block) + SD_CARD_ERROR_CMD18 = 0x05, // card returned an error response for CMD18 (read multiple block) + SD_CARD_ERROR_CMD24 = 0x06, // card returned an error response for CMD24 (write block) + SD_CARD_ERROR_CMD25 = 0x07, // WRITE_MULTIPLE_BLOCKS command failed + SD_CARD_ERROR_CMD58 = 0x08, // card returned an error response for CMD58 (read OCR) + SD_CARD_ERROR_ACMD23 = 0x09, // SET_WR_BLK_ERASE_COUNT failed + SD_CARD_ERROR_ACMD41 = 0x0A, // ACMD41 initialization process timeout + SD_CARD_ERROR_BAD_CSD = 0x0B, // card returned a bad CSR version field + SD_CARD_ERROR_ERASE = 0x0C, // erase block group command failed + SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0x0D, // card not capable of single block erase + SD_CARD_ERROR_ERASE_TIMEOUT = 0x0E, // Erase sequence timed out + SD_CARD_ERROR_READ = 0x0F, // card returned an error token instead of read data + SD_CARD_ERROR_READ_REG = 0x10, // read CID or CSD failed + SD_CARD_ERROR_READ_TIMEOUT = 0x11, // timeout while waiting for start of read data + SD_CARD_ERROR_STOP_TRAN = 0x12, // card did not accept STOP_TRAN_TOKEN + SD_CARD_ERROR_WRITE = 0x13, // card returned an error token as a response to a write operation + SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0x14, // REMOVE - not used ... attempt to write protected block zero + SD_CARD_ERROR_WRITE_MULTIPLE = 0x15, // card did not go ready for a multiple block write + SD_CARD_ERROR_WRITE_PROGRAMMING = 0x16, // card returned an error to a CMD13 status check after a write + SD_CARD_ERROR_WRITE_TIMEOUT = 0x17, // timeout occurred during write programming + SD_CARD_ERROR_SCK_RATE = 0x18, // incorrect rate selected + SD_CARD_ERROR_INIT_NOT_CALLED = 0x19, // init() not called + // 0x1A is unused now, it was: card returned an error for CMD59 (CRC_ON_OFF) + SD_CARD_ERROR_READ_CRC = 0x1B; // invalid read CRC + +// card types +uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD card + SD_CARD_TYPE_SD2 = 2, // Standard capacity V2 SD card + SD_CARD_TYPE_SDHC = 3; // High Capacity SD card + +/** + * Define SOFTWARE_SPI to use bit-bang SPI + */ +#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) + #define SOFTWARE_SPI +#endif + +#if IS_TEENSY_35_36 || IS_TEENSY_40_41 + #include "NXP_SDHC.h" + #define BUILTIN_SDCARD 254 +#endif + +/** + * \class Sd2Card + * \brief Raw access to SD and SDHC flash memory cards. + */ +class Sd2Card { +public: + + Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {} + + uint32_t cardSize(); + bool erase(uint32_t firstBlock, uint32_t lastBlock); + bool eraseSingleBlockEnable(); + + /** + * Set SD error code. + * \param[in] code value for error code. + */ + inline void error(const uint8_t code) { errorCode_ = code; } + + /** + * \return error code for last error. See Sd2Card.h for a list of error codes. + */ + inline int errorCode() const { return errorCode_; } + + /** \return error data for last error. */ + inline int errorData() const { return status_; } + + /** + * Initialize an SD flash memory card with default clock rate and chip + * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). + * + * \return true for success or false for failure. + */ + bool init(const uint8_t sckRateID, const pin_t chipSelectPin); + + bool readBlock(uint32_t block, uint8_t* dst); + + /** + * Read a card's CID register. The CID contains card identification + * information such as Manufacturer ID, Product name, Product serial + * number and Manufacturing date. + * + * \param[out] cid pointer to area for returned data. + * + * \return true for success or false for failure. + */ + bool readCID(cid_t* cid) { return readRegister(CMD10, cid); } + + /** + * Read a card's CSD register. The CSD contains Card-Specific Data that + * provides information regarding access to the card's contents. + * + * \param[out] csd pointer to area for returned data. + * + * \return true for success or false for failure. + */ + inline bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } + + bool readData(uint8_t* dst); + bool readStart(uint32_t blockNumber); + bool readStop(); + bool setSckRate(const uint8_t sckRateID); + + /** + * Return the card type: SD V1, SD V2 or SDHC + * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. + */ + int type() const {return type_;} + bool writeBlock(uint32_t blockNumber, const uint8_t* src); + bool writeData(const uint8_t* src); + bool writeStart(uint32_t blockNumber, const uint32_t eraseCount); + bool writeStop(); + +private: + uint8_t chipSelectPin_, + errorCode_, + spiRate_, + status_, + type_; + + // private functions + inline uint8_t cardAcmd(const uint8_t cmd, const uint32_t arg) { + cardCommand(CMD55, 0); + return cardCommand(cmd, arg); + } + uint8_t cardCommand(const uint8_t cmd, const uint32_t arg); + + bool readData(uint8_t* dst, const uint16_t count); + bool readRegister(const uint8_t cmd, void* buf); + void chipDeselect(); + void chipSelect(); + inline void type(const uint8_t value) { type_ = value; } + bool waitNotBusy(const millis_t timeout_ms); + bool writeData(const uint8_t token, const uint8_t* src); +}; diff --git a/Marlin/src/sd/Sd2Card_sdio.h b/Marlin/src/sd/Sd2Card_sdio.h new file mode 100644 index 00000000..10fb7573 --- /dev/null +++ b/Marlin/src/sd/Sd2Card_sdio.h @@ -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 . + * + */ +#pragma once + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDIO_SUPPORT) + +bool SDIO_Init(); +bool SDIO_ReadBlock(uint32_t block, uint8_t *dst); +bool SDIO_WriteBlock(uint32_t block, const uint8_t *src); + +class Sd2Card { + public: + bool init(uint8_t sckRateID = 0, uint8_t chipSelectPin = 0) { return SDIO_Init(); } + bool readBlock(uint32_t block, uint8_t *dst) { return SDIO_ReadBlock(block, dst); } + bool writeBlock(uint32_t block, const uint8_t *src) { return SDIO_WriteBlock(block, src); } +}; + +#endif // SDIO_SUPPORT diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp new file mode 100644 index 00000000..2bc9f96e --- /dev/null +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -0,0 +1,1766 @@ +/** + * 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 . + * + */ + +#if __GNUC__ > 8 + // The NXP platform updated GCC from 7.2.1 to 9.2.1 + // and this new warning apparently can be ignored. + #pragma GCC diagnostic ignored "-Waddress-of-packed-member" +#endif + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "SdBaseFile.h" + +#include "../MarlinCore.h" +SdBaseFile* SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory + +// callback function for date/time +void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0; + +// add a cluster to a file +bool SdBaseFile::addCluster() { + if (ENABLED(SDCARD_READONLY)) return false; + + if (!vol_->allocContiguous(1, &curCluster_)) return false; + + // if first cluster of file link to directory entry + if (firstCluster_ == 0) { + firstCluster_ = curCluster_; + flags_ |= F_FILE_DIR_DIRTY; + } + return true; +} + +// Add a cluster to a directory file and zero the cluster. +// return with first block of cluster in the cache +bool SdBaseFile::addDirCluster() { + if (ENABLED(SDCARD_READONLY)) return false; + + uint32_t block; + // max folder size + if (fileSize_ / sizeof(dir_t) >= 0xFFFF) return false; + + if (!addCluster()) return false; + if (!vol_->cacheFlush()) return false; + + block = vol_->clusterStartBlock(curCluster_); + + // set cache to first block of cluster + vol_->cacheSetBlockNumber(block, true); + + // zero first block of cluster + memset(vol_->cacheBuffer_.data, 0, 512); + + // zero rest of cluster + for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) { + if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) return false; + } + // Increase directory file size by cluster size + fileSize_ += 512UL << vol_->clusterSizeShift_; + return true; +} + +// cache a file's directory entry +// return pointer to cached entry or null for failure +dir_t* SdBaseFile::cacheDirEntry(uint8_t action) { + if (!vol_->cacheRawBlock(dirBlock_, action)) return nullptr; + return vol_->cache()->dir + dirIndex_; +} + +/** + * Close a file and force cached data and directory information + * to be written to the storage device. + * + * \return true for success, false for failure. + * Reasons for failure include no file is open or an I/O error. + */ +bool SdBaseFile::close() { + bool rtn = sync(); + type_ = FAT_FILE_TYPE_CLOSED; + return rtn; +} + +/** + * Check for contiguous file and return its raw block range. + * + * \param[out] bgnBlock the first block address for the file. + * \param[out] endBlock the last block address for the file. + * + * \return true for success, false for failure. + * Reasons for failure include file is not contiguous, file has zero length + * or an I/O error occurred. + */ +bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { + // error if no blocks + if (firstCluster_ == 0) return false; + + for (uint32_t c = firstCluster_; ; c++) { + uint32_t next; + if (!vol_->fatGet(c, &next)) return false; + + // check for contiguous + if (next != (c + 1)) { + // error if not end of chain + if (!vol_->isEOC(next)) return false; + *bgnBlock = vol_->clusterStartBlock(firstCluster_); + *endBlock = vol_->clusterStartBlock(c) + + vol_->blocksPerCluster_ - 1; + return true; + } + } + return false; +} + +/** + * Create and open a new contiguous file of a specified size. + * + * \note This function only supports short DOS 8.3 names. + * See open() for more information. + * + * \param[in] dirFile The directory where the file will be created. + * \param[in] path A path with a valid DOS 8.3 file name. + * \param[in] size The desired file size. + * + * \return true for success, false for failure. + * Reasons for failure include \a path contains + * an invalid DOS 8.3 file name, the FAT volume has not been initialized, + * a file is already open, the file already exists, the root + * directory is full or an I/O error. + */ +bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) { + if (ENABLED(SDCARD_READONLY)) return false; + + uint32_t count; + // don't allow zero length file + if (size == 0) return false; + if (!open(dirFile, path, O_CREAT | O_EXCL | O_RDWR)) return false; + + // calculate number of clusters needed + count = ((size - 1) >> (vol_->clusterSizeShift_ + 9)) + 1; + + // allocate clusters + if (!vol_->allocContiguous(count, &firstCluster_)) { + remove(); + return false; + } + fileSize_ = size; + + // insure sync() will update dir entry + flags_ |= F_FILE_DIR_DIRTY; + + return sync(); +} + +/** + * Return a file's directory entry. + * + * \param[out] dir Location for return of the file's directory entry. + * + * \return true for success, false for failure. + */ +bool SdBaseFile::dirEntry(dir_t* dir) { + dir_t* p; + // make sure fields on SD are correct + if (!sync()) return false; + + // read entry + p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) return false; + + // copy to caller's struct + memcpy(dir, p, sizeof(dir_t)); + return true; +} + +/** + * Format the name field of \a dir into the 13 byte array + * \a name in standard 8.3 short name format. + * + * \param[in] dir The directory structure containing the name. + * \param[out] name A 13 byte char array for the formatted name. + */ +void SdBaseFile::dirName(const dir_t& dir, char* name) { + uint8_t j = 0; + LOOP_L_N(i, 11) { + if (dir.name[i] == ' ')continue; + if (i == 8) name[j++] = '.'; + name[j++] = dir.name[i]; + } + name[j] = 0; +} + +/** + * Test for the existence of a file in a directory + * + * \param[in] name Name of the file to be tested for. + * + * The calling instance must be an open directory file. + * + * dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory + * dirFile. + * + * \return true if the file exists else false. + */ +bool SdBaseFile::exists(const char* name) { + SdBaseFile file; + return file.open(this, name, O_READ); +} + +/** + * Get a string from a file. + * + * fgets() reads bytes from a file into the array pointed to by \a str, until + * \a num - 1 bytes are read, or a delimiter is read and transferred to \a str, + * or end-of-file is encountered. The string is then terminated + * with a null byte. + * + * fgets() deletes CR, '\\r', from the string. This insures only a '\\n' + * terminates the string for Windows text files which use CRLF for newline. + * + * \param[out] str Pointer to the array where the string is stored. + * \param[in] num Maximum number of characters to be read + * (including the final null byte). Usually the length + * of the array \a str is used. + * \param[in] delim Optional set of delimiters. The default is "\n". + * + * \return For success fgets() returns the length of the string in \a str. + * If no data is read, fgets() returns zero for EOF or -1 if an error occurred. + **/ +int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { + char ch; + int16_t n = 0; + int16_t r = -1; + while ((n + 1) < num && (r = read(&ch, 1)) == 1) { + // delete CR + if (ch == '\r') continue; + str[n++] = ch; + if (!delim) { + if (ch == '\n') break; + } + else { + if (strchr(delim, ch)) break; + } + } + if (r < 0) { + // read error + return -1; + } + str[n] = '\0'; + return n; +} + +/** + * Get a file's name + * + * \param[out] name An array of 13 characters for the file's name. + * + * \return true for success, false for failure. + */ +bool SdBaseFile::getDosName(char * const name) { + if (!isOpen()) return false; + + if (isRoot()) { + name[0] = '/'; + name[1] = '\0'; + return true; + } + // cache entry + dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + if (!p) return false; + + // format name + dirName(*p, name); + return true; +} + +void SdBaseFile::getpos(filepos_t* pos) { + pos->position = curPosition_; + pos->cluster = curCluster_; +} + +/** + * List directory contents. + * + * \param[in] pr Print stream for list. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + * + * \param[in] indent Amount of space before file name. Used for recursive + * list to indicate subdirectory level. + */ +void SdBaseFile::ls(uint8_t flags, uint8_t indent) { + rewind(); + int8_t status; + while ((status = lsPrintNext(flags, indent))) { + if (status > 1 && (flags & LS_R)) { + uint16_t index = curPosition() / 32 - 1; + SdBaseFile s; + if (s.open(this, index, O_READ)) s.ls(flags, indent + 2); + seekSet(32 * (index + 1)); + } + } +} + +// saves 32 bytes on stack for ls recursion +// return 0 - EOF, 1 - normal file, or 2 - directory +int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) { + dir_t dir; + uint8_t w = 0; + + while (1) { + if (read(&dir, sizeof(dir)) != sizeof(dir)) return 0; + if (dir.name[0] == DIR_NAME_FREE) return 0; + + // skip deleted entry and entries for . and .. + if (dir.name[0] != DIR_NAME_DELETED && dir.name[0] != '.' + && DIR_IS_FILE_OR_SUBDIR(&dir)) break; + } + // indent for dir level + LOOP_L_N(i, indent) SERIAL_CHAR(' '); + + // print name + LOOP_L_N(i, 11) { + if (dir.name[i] == ' ')continue; + if (i == 8) { + SERIAL_CHAR('.'); + w++; + } + SERIAL_CHAR(dir.name[i]); + w++; + } + if (DIR_IS_SUBDIR(&dir)) { + SERIAL_CHAR('/'); + w++; + } + if (flags & (LS_DATE | LS_SIZE)) { + while (w++ < 14) SERIAL_CHAR(' '); + } + // print modify date/time if requested + if (flags & LS_DATE) { + SERIAL_CHAR(' '); + printFatDate(dir.lastWriteDate); + SERIAL_CHAR(' '); + printFatTime(dir.lastWriteTime); + } + // print size if requested + if (!DIR_IS_SUBDIR(&dir) && (flags & LS_SIZE)) { + SERIAL_CHAR(' '); + SERIAL_ECHO(dir.fileSize); + } + SERIAL_EOL(); + return DIR_IS_FILE(&dir) ? 1 : 2; +} + +// Format directory name field from a 8.3 name string +bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { + uint8_t n = 7, // Max index until a dot is found + i = 11; + while (i) name[--i] = ' '; // Set whole FILENAME.EXT to spaces + while (*str && *str != '/') { // For each character, until nul or '/' + uint8_t c = *str++; // Get char and advance + if (c == '.') { // For a dot... + if (n == 10) return false; // Already moved the max index? fail! + n = 10; // Move the max index for full 8.3 name + i = 8; // Move up to the extension place + } + else { + // Fail for illegal characters + PGM_P p = PSTR("|<>^+=?/[];,*\"\\"); + while (uint8_t b = pgm_read_byte(p++)) if (b == c) return false; + if (i > n || c < 0x21 || c == 0x7F) return false; // Check size, non-printable characters + name[i++] = (c < 'a' || c > 'z') ? (c) : (c + ('A' - 'a')); // Uppercase required for 8.3 name + } + } + *ptr = str; // Set passed pointer to the end + return name[0] != ' '; // Return true if any name was set +} + +/** + * Make a new directory. + * + * \param[in] parent An open SdFat instance for the directory that will contain + * the new directory. + * + * \param[in] path A path with a valid 8.3 DOS name for the new directory. + * + * \param[in] pFlag Create missing parent directories if true. + * + * \return true for success, false for failure. + * Reasons for failure include this file is already open, \a parent is not a + * directory, \a path is invalid or already exists in \a parent. + */ +bool SdBaseFile::mkdir(SdBaseFile* parent, const char* path, bool pFlag) { + if (ENABLED(SDCARD_READONLY)) return false; + + uint8_t dname[11]; + SdBaseFile dir1, dir2; + SdBaseFile* sub = &dir1; + SdBaseFile* start = parent; + + if (!parent || isOpen()) return false; + + if (*path == '/') { + while (*path == '/') path++; + if (!parent->isRoot()) { + if (!dir2.openRoot(parent->vol_)) return false; + parent = &dir2; + } + } + while (1) { + if (!make83Name(path, dname, &path)) return false; + while (*path == '/') path++; + if (!*path) break; + if (!sub->open(parent, dname, O_READ)) { + if (!pFlag || !sub->mkdir(parent, dname)) + return false; + } + if (parent != start) parent->close(); + parent = sub; + sub = parent != &dir1 ? &dir1 : &dir2; + } + return mkdir(parent, dname); +} + +bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { + if (ENABLED(SDCARD_READONLY)) return false; + + uint32_t block; + dir_t d; + dir_t* p; + + if (!parent->isDir()) return false; + + // create a normal file + if (!open(parent, dname, O_CREAT | O_EXCL | O_RDWR)) return false; + + // convert file to directory + flags_ = O_READ; + type_ = FAT_FILE_TYPE_SUBDIR; + + // allocate and zero first cluster + if (!addDirCluster()) return false; + + // force entry to SD + if (!sync()) return false; + + // cache entry - should already be in cache due to sync() call + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + + // change directory entry attribute + p->attributes = DIR_ATT_DIRECTORY; + + // make entry for '.' + memcpy(&d, p, sizeof(d)); + d.name[0] = '.'; + LOOP_S_L_N(i, 1, 11) d.name[i] = ' '; + + // cache block for '.' and '..' + block = vol_->clusterStartBlock(firstCluster_); + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; + + // copy '.' to block + memcpy(&vol_->cache()->dir[0], &d, sizeof(d)); + + // make entry for '..' + d.name[1] = '.'; + if (parent->isRoot()) { + d.firstClusterLow = 0; + d.firstClusterHigh = 0; + } + else { + d.firstClusterLow = parent->firstCluster_ & 0xFFFF; + d.firstClusterHigh = parent->firstCluster_ >> 16; + } + // copy '..' to block + memcpy(&vol_->cache()->dir[1], &d, sizeof(d)); + + // write first block + return vol_->cacheFlush(); +} + +/** + * Open a file in the current working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). + * + * \return true for success, false for failure. + */ +bool SdBaseFile::open(const char* path, uint8_t oflag) { + return open(cwd_, path, oflag); +} + +/** + * Open a file or directory by name. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * O_READ - Open for reading. + * + * O_RDONLY - Same as O_READ. + * + * O_WRITE - Open for writing. + * + * O_WRONLY - Same as O_WRITE. + * + * O_RDWR - Open for reading and writing. + * + * O_APPEND - If set, the file offset shall be set to the end of the + * file prior to each write. + * + * O_AT_END - Set the initial position at the end of the file. + * + * O_CREAT - If the file exists, this flag has no effect except as noted + * under O_EXCL below. Otherwise, the file shall be created + * + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * + * O_SYNC - Call sync() after each write. This flag should not be used with + * write(uint8_t), write_P(PGM_P), writeln_P(PGM_P), or the Arduino Print class. + * These functions do character at a time writes so sync() will be called + * after each byte. + * + * O_TRUNC - If the file exists and is a regular file, and the file is + * successfully opened and is not read only, its length shall be truncated to 0. + * + * WARNING: A given file must not be opened by more than one SdBaseFile object + * of file corruption may occur. + * + * \note Directory files must be opened read only. Write and truncation is + * not allowed for directory files. + * + * \return true for success, false for failure. + * Reasons for failure include this file is already open, \a dirFile is not + * a directory, \a path is invalid, the file does not exist + * or can't be opened in the access mode specified by oflag. + */ +bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { + uint8_t dname[11]; + SdBaseFile dir1, dir2; + SdBaseFile *parent = dirFile, *sub = &dir1; + + if (!dirFile || isOpen()) return false; + + if (*path == '/') { // Path starts with '/' + if (!dirFile->isRoot()) { // Is the passed dirFile the root? + if (!dir2.openRoot(dirFile->vol_)) return false; // Get the root in dir2, if possible + parent = &dir2; // Change 'parent' to point at the root dir + } + while (*path == '/') path++; // Skip all leading slashes + } + + for (;;) { + if (!make83Name(path, dname, &path)) return false; + while (*path == '/') path++; + if (!*path) break; + if (!sub->open(parent, dname, O_READ)) return false; + if (parent != dirFile) parent->close(); + parent = sub; + sub = parent != &dir1 ? &dir1 : &dir2; + } + return open(parent, dname, oflag); +} + +// open with filename in dname +bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { + bool emptyFound = false, fileFound = false; + uint8_t index; + dir_t* p; + + vol_ = dirFile->vol_; + + dirFile->rewind(); + // search for file + + while (dirFile->curPosition_ < dirFile->fileSize_) { + index = 0xF & (dirFile->curPosition_ >> 5); + p = dirFile->readDirCache(); + if (!p) return false; + + if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) { + // remember first empty slot + if (!emptyFound) { + dirBlock_ = dirFile->vol_->cacheBlockNumber(); + dirIndex_ = index; + emptyFound = true; + } + // done if no entries follow + if (p->name[0] == DIR_NAME_FREE) break; + } + else if (!memcmp(dname, p->name, 11)) { + fileFound = true; + break; + } + } + if (fileFound) { + // don't open existing file if O_EXCL + if (oflag & O_EXCL) return false; + } + else { + // don't create unless O_CREAT and O_WRITE + if ((oflag & (O_CREAT | O_WRITE)) != (O_CREAT | O_WRITE)) return false; + if (emptyFound) { + index = dirIndex_; + p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!p) return false; + } + else { + if (dirFile->type_ == FAT_FILE_TYPE_ROOT_FIXED) return false; + + // add and zero cluster for dirFile - first cluster is in cache for write + if (!dirFile->addDirCluster()) return false; + + // use first entry in cluster + p = dirFile->vol_->cache()->dir; + index = 0; + } + // initialize as empty file + memset(p, 0, sizeof(*p)); + memcpy(p->name, dname, 11); + + // set timestamps + if (dateTime_) { + // call user date/time function + dateTime_(&p->creationDate, &p->creationTime); + } + else { + // use default date/time + p->creationDate = FAT_DEFAULT_DATE; + p->creationTime = FAT_DEFAULT_TIME; + } + p->lastAccessDate = p->creationDate; + p->lastWriteDate = p->creationDate; + p->lastWriteTime = p->creationTime; + + // write entry to SD + if (!dirFile->vol_->cacheFlush()) return false; + } + // open entry in cache + return openCachedEntry(index, oflag); +} + +/** + * Open a file by index. + * + * \param[in] dirFile An open SdFat instance for the directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ +bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { + dir_t* p; + + vol_ = dirFile->vol_; + + // error if already open + if (isOpen() || !dirFile) return false; + + // don't open existing file if O_EXCL - user call error + if (oflag & O_EXCL) return false; + + // seek to location of entry + if (!dirFile->seekSet(32 * index)) return false; + + // read entry into cache + p = dirFile->readDirCache(); + if (!p) return false; + + // error if empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_FREE || + p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + return false; + } + // open cached entry + return openCachedEntry(index & 0xF, oflag); +} + +// open a cached directory entry. Assumes vol_ is initialized +bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { + dir_t* p; + + #if ENABLED(SDCARD_READONLY) + if (oflag & (O_WRITE | O_CREAT | O_TRUNC)) goto FAIL; + #endif + + // location of entry in cache + p = &vol_->cache()->dir[dirIndex]; + + // write or truncate is an error for a directory or read-only file + if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) { + if (oflag & (O_WRITE | O_TRUNC)) goto FAIL; + } + // remember location of directory entry on SD + dirBlock_ = vol_->cacheBlockNumber(); + dirIndex_ = dirIndex; + + // copy first cluster number for directory fields + firstCluster_ = (uint32_t)p->firstClusterHigh << 16; + firstCluster_ |= p->firstClusterLow; + + // make sure it is a normal file or subdirectory + if (DIR_IS_FILE(p)) { + fileSize_ = p->fileSize; + type_ = FAT_FILE_TYPE_NORMAL; + } + else if (DIR_IS_SUBDIR(p)) { + if (!vol_->chainSize(firstCluster_, &fileSize_)) goto FAIL; + type_ = FAT_FILE_TYPE_SUBDIR; + } + else + goto FAIL; + + // save open flags for read/write + flags_ = oflag & F_OFLAG; + + // set to start of file + curCluster_ = 0; + curPosition_ = 0; + if ((oflag & O_TRUNC) && !truncate(0)) return false; + return oflag & O_AT_END ? seekEnd(0) : true; + + FAIL: + type_ = FAT_FILE_TYPE_CLOSED; + return false; +} + +/** + * Open the next file or subdirectory in a directory. + * + * \param[in] dirFile An open SdFat instance for the directory containing the + * file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC. + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ +bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { + dir_t* p; + uint8_t index; + + if (!dirFile) return false; + + // error if already open + if (isOpen()) return false; + + vol_ = dirFile->vol_; + + while (1) { + index = 0xF & (dirFile->curPosition_ >> 5); + + // read entry into cache + p = dirFile->readDirCache(); + if (!p) return false; + + // done if last entry + if (p->name[0] == DIR_NAME_FREE) return false; + + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') { + continue; + } + // must be file or dir + if (DIR_IS_FILE_OR_SUBDIR(p)) { + return openCachedEntry(index, oflag); + } + } + return false; +} + +#if 0 +/** + * Open a directory's parent directory. + * + * \param[in] dir Parent of this directory will be opened. Must not be root. + * + * \return true for success, false for failure. + */ +bool SdBaseFile::openParent(SdBaseFile* dir) { + dir_t entry; + dir_t* p; + SdBaseFile file; + uint32_t c; + uint32_t cluster; + uint32_t lbn; + // error if already open or dir is root or dir is not a directory + if (isOpen() || !dir || dir->isRoot() || !dir->isDir()) return false; + vol_ = dir->vol_; + // position to '..' + if (!dir->seekSet(32)) return false; + // read '..' entry + if (dir->read(&entry, sizeof(entry)) != 32) return false; + // verify it is '..' + if (entry.name[0] != '.' || entry.name[1] != '.') return false; + // start cluster for '..' + cluster = entry.firstClusterLow; + cluster |= (uint32_t)entry.firstClusterHigh << 16; + if (cluster == 0) return openRoot(vol_); + // start block for '..' + lbn = vol_->clusterStartBlock(cluster); + // first block of parent dir + if (!vol_->cacheRawBlock(lbn, SdVolume::CACHE_FOR_READ)) return false; + + p = &vol_->cacheBuffer_.dir[1]; + // verify name for '../..' + if (p->name[0] != '.' || p->name[1] != '.') return false; + // '..' is pointer to first cluster of parent. open '../..' to find parent + if (p->firstClusterHigh == 0 && p->firstClusterLow == 0) { + if (!file.openRoot(dir->volume())) return false; + } + else if (!file.openCachedEntry(1, O_READ)) + return false; + + // search for parent in '../..' + do { + if (file.readDir(&entry, nullptr) != 32) return false; + c = entry.firstClusterLow; + c |= (uint32_t)entry.firstClusterHigh << 16; + } while (c != cluster); + + // open parent + return open(&file, file.curPosition() / 32 - 1, O_READ); +} +#endif + +/** + * Open a volume's root directory. + * + * \param[in] vol The FAT volume containing the root directory to be opened. + * + * \return true for success, false for failure. + * Reasons for failure include the file is already open, the FAT volume has + * not been initialized or it a FAT12 volume. + */ +bool SdBaseFile::openRoot(SdVolume* vol) { + // error if file is already open + if (isOpen()) return false; + + if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) { + type_ = FAT_FILE_TYPE_ROOT_FIXED; + firstCluster_ = 0; + fileSize_ = 32 * vol->rootDirEntryCount(); + } + else if (vol->fatType() == 32) { + type_ = FAT_FILE_TYPE_ROOT32; + firstCluster_ = vol->rootDirStart(); + if (!vol->chainSize(firstCluster_, &fileSize_)) return false; + } + else // volume is not initialized, invalid, or FAT12 without support + return false; + + vol_ = vol; + // read only + flags_ = O_READ; + + // set to start of file + curCluster_ = curPosition_ = 0; + + // root has no directory entry + dirBlock_ = dirIndex_ = 0; + return true; +} + +/** + * Return the next available byte without consuming it. + * + * \return The byte if no error and not at eof else -1; + */ +int SdBaseFile::peek() { + filepos_t pos; + getpos(&pos); + int c = read(); + if (c >= 0) setpos(&pos); + return c; +} + +// print uint8_t with width 2 +static void print2u(const uint8_t v) { + if (v < 10) SERIAL_CHAR('0'); + SERIAL_ECHO(int(v)); +} + +/** + * %Print a directory date field to Serial. + * + * Format is yyyy-mm-dd. + * + * \param[in] fatDate The date field from a directory entry. + */ + + +/** + * %Print a directory date field. + * + * Format is yyyy-mm-dd. + * + * \param[in] pr Print stream for output. + * \param[in] fatDate The date field from a directory entry. + */ +void SdBaseFile::printFatDate(uint16_t fatDate) { + SERIAL_ECHO(FAT_YEAR(fatDate)); + SERIAL_CHAR('-'); + print2u(FAT_MONTH(fatDate)); + SERIAL_CHAR('-'); + print2u(FAT_DAY(fatDate)); +} + + +/** + * %Print a directory time field. + * + * Format is hh:mm:ss. + * + * \param[in] pr Print stream for output. + * \param[in] fatTime The time field from a directory entry. + */ +void SdBaseFile::printFatTime(uint16_t fatTime) { + print2u(FAT_HOUR(fatTime)); + SERIAL_CHAR(':'); + print2u(FAT_MINUTE(fatTime)); + SERIAL_CHAR(':'); + print2u(FAT_SECOND(fatTime)); +} + +/** + * Print a file's name to Serial + * + * \return true for success, false for failure. + */ +bool SdBaseFile::printName() { + char name[FILENAME_LENGTH]; + if (!getDosName(name)) return false; + SERIAL_ECHO(name); + return true; +} + +/** + * Read the next byte from a file. + * + * \return For success read returns the next byte in the file as an int. + * If an error occurs or end of file is reached -1 is returned. + */ +int16_t SdBaseFile::read() { + uint8_t b; + return read(&b, 1) == 1 ? b : -1; +} + +/** + * Read data from a file starting at the current position. + * + * \param[out] buf Pointer to the location that will receive the data. + * + * \param[in] nbyte Maximum number of bytes to read. + * + * \return For success read() returns the number of bytes read. + * A value less than \a nbyte, including zero, will be returned + * if end of file is reached. + * If an error occurs, read() returns -1. Possible errors include + * read() called before a file has been opened, corrupt file system + * or an I/O error occurred. + */ +int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { + uint8_t* dst = reinterpret_cast(buf); + uint16_t offset, toRead; + uint32_t block; // raw device block number + + // error if not open or write only + if (!isOpen() || !(flags_ & O_READ)) return -1; + + // max bytes left in file + NOMORE(nbyte, fileSize_ - curPosition_); + + // amount left to read + toRead = nbyte; + while (toRead > 0) { + offset = curPosition_ & 0x1FF; // offset in block + if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { + block = vol_->rootDirStart() + (curPosition_ >> 9); + } + else { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + if (offset == 0 && blockOfCluster == 0) { + // start of new cluster + if (curPosition_ == 0) + curCluster_ = firstCluster_; // use first cluster in file + else if (!vol_->fatGet(curCluster_, &curCluster_)) // get next cluster from FAT + return -1; + } + block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + } + uint16_t n = toRead; + + // amount to be read from current block + NOMORE(n, 512 - offset); + + // no buffering needed if n == 512 + if (n == 512 && block != vol_->cacheBlockNumber()) { + if (!vol_->readBlock(block, dst)) return -1; + } + else { + // read block to cache and copy data to caller + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; + uint8_t* src = vol_->cache()->data + offset; + memcpy(dst, src, n); + } + dst += n; + curPosition_ += n; + toRead -= n; + } + return nbyte; +} + +/** + * Read the next entry in a directory. + * + * \param[out] dir The dir_t struct that will receive the data. + * + * \return For success readDir() returns the number of bytes read. + * A value of zero will be returned if end of file is reached. + * If an error occurs, readDir() returns -1. Possible errors include + * readDir() called before a directory has been opened, this is not + * a directory file or an I/O error occurred. + */ +int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { + int16_t n; + // if not a directory file or miss-positioned return an error + if (!isDir() || (0x1F & curPosition_)) return -1; + + // If we have a longFilename buffer, mark it as invalid. + // If a long filename is found it will be filled automatically. + if (longFilename) longFilename[0] = '\0'; + + while (1) { + + n = read(dir, sizeof(dir_t)); + if (n != sizeof(dir_t)) return n ? -1 : 0; + + // last entry if DIR_NAME_FREE + if (dir->name[0] == DIR_NAME_FREE) return 0; + + // skip deleted entry and entry for . and .. + if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') { + if (longFilename) longFilename[0] = '\0'; // Invalidate erased file long name, if any + continue; + } + + // Fill the long filename if we have a long filename entry. + // Long filename entries are stored before the short filename. + if (longFilename && DIR_IS_LONG_NAME(dir)) { + vfat_t* VFAT = (vfat_t*)dir; + // Sanity-check the VFAT entry. The first cluster is always set to zero. And the sequence number should be higher than 0 + if (VFAT->firstClusterLow == 0) { + const uint8_t seq = VFAT->sequenceNumber & 0x1F; + if (WITHIN(seq, 1, MAX_VFAT_ENTRIES)) { + // TODO: Store the filename checksum to verify if a long-filename-unaware system modified the file table. + n = (seq - 1) * (FILENAME_LENGTH); + LOOP_L_N(i, FILENAME_LENGTH) + longFilename[n + i] = (i < 5) ? VFAT->name1[i] : (i < 11) ? VFAT->name2[i - 5] : VFAT->name3[i - 11]; + // If this VFAT entry is the last one, add a NUL terminator at the end of the string + if (VFAT->sequenceNumber & 0x40) longFilename[n + FILENAME_LENGTH] = '\0'; + } + } + } + // Return if normal file or subdirectory + if (DIR_IS_FILE_OR_SUBDIR(dir)) return n; + } +} + + +// Read next directory entry into the cache +// Assumes file is correctly positioned +dir_t* SdBaseFile::readDirCache() { + uint8_t i; + // error if not directory + if (!isDir()) return 0; + + // index of entry in cache + i = (curPosition_ >> 5) & 0xF; + + // use read to locate and cache block + if (read() < 0) return 0; + + // advance to next entry + curPosition_ += 31; + + // return pointer to entry + return vol_->cache()->dir + i; +} + +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return true for success, false for failure. + * Reasons for failure include the file read-only, is a directory, + * or an I/O error occurred. + */ +bool SdBaseFile::remove() { + if (ENABLED(SDCARD_READONLY)) return false; + + dir_t* d; + // free any clusters - will fail if read-only or directory + if (!truncate(0)) return false; + + // cache directory entry + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // set this file closed + type_ = FAT_FILE_TYPE_CLOSED; + + // write entry to SD + return vol_->cacheFlush(); + return true; +} + +/** + * Remove a file. + * + * The directory entry and all data for the file are deleted. + * + * \param[in] dirFile The directory that contains the file. + * \param[in] path Path for the file to be removed. + * + * \note This function should not be used to delete the 8.3 version of a + * file that has a long name. For example if a file has the long name + * "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT". + * + * \return true for success, false for failure. + * Reasons for failure include the file is a directory, is read only, + * \a dirFile is not a directory, \a path is not found + * or an I/O error occurred. + */ +bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { + if (ENABLED(SDCARD_READONLY)) return false; + + SdBaseFile file; + return file.open(dirFile, path, O_WRITE) ? file.remove() : false; +} + +/** + * Rename a file or subdirectory. + * + * \param[in] dirFile Directory for the new path. + * \param[in] newPath New path name for the file/directory. + * + * \return true for success, false for failure. + * Reasons for failure include \a dirFile is not open or is not a directory + * file, newPath is invalid or already exists, or an I/O error occurs. + */ +bool SdBaseFile::rename(SdBaseFile* dirFile, const char* newPath) { + if (ENABLED(SDCARD_READONLY)) return false; + + dir_t entry; + uint32_t dirCluster = 0; + SdBaseFile file; + dir_t* d; + + // must be an open file or subdirectory + if (!(isFile() || isSubDir())) return false; + + // can't move file + if (vol_ != dirFile->vol_) return false; + + // sync() and cache directory entry + sync(); + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // save directory entry + memcpy(&entry, d, sizeof(entry)); + + // mark entry deleted + d->name[0] = DIR_NAME_DELETED; + + // make directory entry for new path + if (isFile()) { + if (!file.open(dirFile, newPath, O_CREAT | O_EXCL | O_WRITE)) { + goto restore; + } + } + else { + // don't create missing path prefix components + if (!file.mkdir(dirFile, newPath, false)) { + goto restore; + } + // save cluster containing new dot dot + dirCluster = file.firstCluster_; + } + // change to new directory entry + dirBlock_ = file.dirBlock_; + dirIndex_ = file.dirIndex_; + + // mark closed to avoid possible destructor close call + file.type_ = FAT_FILE_TYPE_CLOSED; + + // cache new directory entry + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // copy all but name field to new directory entry + memcpy(&d->attributes, &entry.attributes, sizeof(entry) - sizeof(d->name)); + + // update dot dot if directory + if (dirCluster) { + // get new dot dot + uint32_t block = vol_->clusterStartBlock(dirCluster); + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return false; + memcpy(&entry, &vol_->cache()->dir[1], sizeof(entry)); + + // free unused cluster + if (!vol_->freeChain(dirCluster)) return false; + + // store new dot dot + block = vol_->clusterStartBlock(firstCluster_); + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) return false; + memcpy(&vol_->cache()->dir[1], &entry, sizeof(entry)); + } + return vol_->cacheFlush(); + +restore: + if ((d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE))) { + // restore entry + d->name[0] = entry.name[0]; + vol_->cacheFlush(); + } + return false; +} + +/** + * Remove a directory file. + * + * The directory file will be removed only if it is empty and is not the + * root directory. rmdir() follows DOS and Windows and ignores the + * read-only attribute for the directory. + * + * \note This function should not be used to delete the 8.3 version of a + * directory that has a long name. For example if a directory has the + * long name "New folder" you should not delete the 8.3 name "NEWFOL~1". + * + * \return true for success, false for failure. + * Reasons for failure include the file is not a directory, is the root + * directory, is not empty, or an I/O error occurred. + */ +bool SdBaseFile::rmdir() { + if (ENABLED(SDCARD_READONLY)) return false; + + // must be open subdirectory + if (!isSubDir()) return false; + + rewind(); + + // make sure directory is empty + while (curPosition_ < fileSize_) { + dir_t* p = readDirCache(); + if (!p) return false; + // done if past last used entry + if (p->name[0] == DIR_NAME_FREE) break; + // skip empty slot, '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + // error not empty + if (DIR_IS_FILE_OR_SUBDIR(p)) return false; + } + // convert empty directory to normal file for remove + type_ = FAT_FILE_TYPE_NORMAL; + flags_ |= O_WRITE; + return remove(); +} + +/** + * Recursively delete a directory and all contained files. + * + * This is like the Unix/Linux 'rm -rf *' if called with the root directory + * hence the name. + * + * Warning - This will remove all contents of the directory including + * subdirectories. The directory will then be removed if it is not root. + * The read-only attribute for files will be ignored. + * + * \note This function should not be used to delete the 8.3 version of + * a directory that has a long name. See remove() and rmdir(). + * + * \return true for success, false for failure. + */ +bool SdBaseFile::rmRfStar() { + if (ENABLED(SDCARD_READONLY)) return false; + + uint32_t index; + SdBaseFile f; + rewind(); + while (curPosition_ < fileSize_) { + // remember position + index = curPosition_ / 32; + + dir_t* p = readDirCache(); + if (!p) return false; + + // done if past last entry + if (p->name[0] == DIR_NAME_FREE) break; + + // skip empty slot or '.' or '..' + if (p->name[0] == DIR_NAME_DELETED || p->name[0] == '.') continue; + + // skip if part of long file name or volume label in root + if (!DIR_IS_FILE_OR_SUBDIR(p)) continue; + + if (!f.open(this, index, O_READ)) return false; + if (f.isSubDir()) { + // recursively delete + if (!f.rmRfStar()) return false; + } + else { + // ignore read-only + f.flags_ |= O_WRITE; + if (!f.remove()) return false; + } + // position to next entry if required + if (curPosition_ != (32 * (index + 1))) { + if (!seekSet(32 * (index + 1))) return false; + } + } + // don't try to delete root + if (!isRoot()) { + if (!rmdir()) return false; + } + return true; +} + +/** + * Create a file object and open it in the current working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). + */ +SdBaseFile::SdBaseFile(const char* path, uint8_t oflag) { + type_ = FAT_FILE_TYPE_CLOSED; + writeError = false; + open(path, oflag); +} + +/** + * Sets a file's position. + * + * \param[in] pos The new position in bytes from the beginning of the file. + * + * \return true for success, false for failure. + */ +bool SdBaseFile::seekSet(const uint32_t pos) { + uint32_t nCur, nNew; + // error if file not open or seek past end of file + if (!isOpen() || pos > fileSize_) return false; + + if (type_ == FAT_FILE_TYPE_ROOT_FIXED) { + curPosition_ = pos; + return true; + } + if (pos == 0) { + curCluster_ = curPosition_ = 0; // set position to start of file + return true; + } + + // calculate cluster index for cur and new position + nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9); + nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9); + + if (nNew < nCur || curPosition_ == 0) + curCluster_ = firstCluster_; // must follow chain from first cluster + else + nNew -= nCur; // advance from curPosition + + while (nNew--) + if (!vol_->fatGet(curCluster_, &curCluster_)) return false; + + curPosition_ = pos; + return true; +} + +void SdBaseFile::setpos(filepos_t* pos) { + curPosition_ = pos->position; + curCluster_ = pos->cluster; +} + +/** + * The sync() call causes all modified data and directory fields + * to be written to the storage device. + * + * \return true for success, false for failure. + * Reasons for failure include a call to sync() before a file has been + * opened or an I/O error. + */ +bool SdBaseFile::sync() { + // only allow open files and directories + if (ENABLED(SDCARD_READONLY) || !isOpen()) goto FAIL; + + if (flags_ & F_FILE_DIR_DIRTY) { + dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + // check for deleted by another open file object + if (!d || d->name[0] == DIR_NAME_DELETED) goto FAIL; + + // do not set filesize for dir files + if (!isDir()) d->fileSize = fileSize_; + + // update first cluster fields + d->firstClusterLow = firstCluster_ & 0xFFFF; + d->firstClusterHigh = firstCluster_ >> 16; + + // set modify time if user supplied a callback date/time function + if (dateTime_) { + dateTime_(&d->lastWriteDate, &d->lastWriteTime); + d->lastAccessDate = d->lastWriteDate; + } + // clear directory dirty + flags_ &= ~F_FILE_DIR_DIRTY; + } + return vol_->cacheFlush(); + + FAIL: + writeError = true; + return false; +} + +/** + * Copy a file's timestamps + * + * \param[in] file File to copy timestamps from. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return true for success, false for failure. + */ +bool SdBaseFile::timestamp(SdBaseFile* file) { + dir_t* d; + dir_t dir; + + // get timestamps + if (!file->dirEntry(&dir)) return false; + + // update directory fields + if (!sync()) return false; + + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + // copy timestamps + d->lastAccessDate = dir.lastAccessDate; + d->creationDate = dir.creationDate; + d->creationTime = dir.creationTime; + d->creationTimeTenths = dir.creationTimeTenths; + d->lastWriteDate = dir.lastWriteDate; + d->lastWriteTime = dir.lastWriteTime; + + // write back entry + return vol_->cacheFlush(); +} + +/** + * Set a file's timestamps in its directory entry. + * + * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive + * OR of flags from the following list + * + * T_ACCESS - Set the file's last access date. + * + * T_CREATE - Set the file's creation date and time. + * + * T_WRITE - Set the file's last write/modification date and time. + * + * \param[in] year Valid range 1980 - 2107 inclusive. + * + * \param[in] month Valid range 1 - 12 inclusive. + * + * \param[in] day Valid range 1 - 31 inclusive. + * + * \param[in] hour Valid range 0 - 23 inclusive. + * + * \param[in] minute Valid range 0 - 59 inclusive. + * + * \param[in] second Valid range 0 - 59 inclusive + * + * \note It is possible to set an invalid date since there is no check for + * the number of days in a month. + * + * \note + * Modify and access timestamps may be overwritten if a date time callback + * function has been set by dateTimeCallback(). + * + * \return true for success, false for failure. + */ +bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, + uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + if (ENABLED(SDCARD_READONLY)) return false; + + uint16_t dirDate, dirTime; + dir_t* d; + + if (!isOpen() + || year < 1980 + || year > 2107 + || month < 1 + || month > 12 + || day < 1 + || day > 31 + || hour > 23 + || minute > 59 + || second > 59) { + return false; + } + // update directory entry + if (!sync()) return false; + + d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + if (!d) return false; + + dirDate = FAT_DATE(year, month, day); + dirTime = FAT_TIME(hour, minute, second); + if (flags & T_ACCESS) { + d->lastAccessDate = dirDate; + } + if (flags & T_CREATE) { + d->creationDate = dirDate; + d->creationTime = dirTime; + // seems to be units of 1/100 second not 1/10 as Microsoft states + d->creationTimeTenths = second & 1 ? 100 : 0; + } + if (flags & T_WRITE) { + d->lastWriteDate = dirDate; + d->lastWriteTime = dirTime; + } + return vol_->cacheFlush(); +} + +/** + * Truncate a file to a specified length. The current file position + * will be maintained if it is less than or equal to \a length otherwise + * it will be set to end of file. + * + * \param[in] length The desired length for the file. + * + * \return true for success, false for failure. + * Reasons for failure include file is read only, file is a directory, + * \a length is greater than the current file size or an I/O error occurs. + */ +bool SdBaseFile::truncate(uint32_t length) { + if (ENABLED(SDCARD_READONLY)) return false; + + uint32_t newPos; + // error if not a normal file or read-only + if (!isFile() || !(flags_ & O_WRITE)) return false; + + // error if length is greater than current size + if (length > fileSize_) return false; + + // fileSize and length are zero - nothing to do + if (fileSize_ == 0) return true; + + // remember position for seek after truncation + newPos = curPosition_ > length ? length : curPosition_; + + // position to last cluster in truncated file + if (!seekSet(length)) return false; + + if (length == 0) { + // free all clusters + if (!vol_->freeChain(firstCluster_)) return false; + firstCluster_ = 0; + } + else { + uint32_t toFree; + if (!vol_->fatGet(curCluster_, &toFree)) return false; + + if (!vol_->isEOC(toFree)) { + // free extra clusters + if (!vol_->freeChain(toFree)) return false; + + // current cluster is end of chain + if (!vol_->fatPutEOC(curCluster_)) return false; + } + } + fileSize_ = length; + + // need to update directory entry + flags_ |= F_FILE_DIR_DIRTY; + + if (!sync()) return false; + + // set file to correct position + return seekSet(newPos); +} + +/** + * Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + */ +int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { + #if ENABLED(SDCARD_READONLY) + writeError = true; return -1; + #endif + + // convert void* to uint8_t* - must be before goto statements + const uint8_t* src = reinterpret_cast(buf); + + // number of bytes left to write - must be before goto statements + uint16_t nToWrite = nbyte; + + // error if not a normal file or is read-only + if (!isFile() || !(flags_ & O_WRITE)) goto FAIL; + + // seek to end of file if append flag + if ((flags_ & O_APPEND) && curPosition_ != fileSize_) { + if (!seekEnd()) goto FAIL; + } + + while (nToWrite > 0) { + uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_); + uint16_t blockOffset = curPosition_ & 0x1FF; + if (blockOfCluster == 0 && blockOffset == 0) { + // start of new cluster + if (curCluster_ == 0) { + if (firstCluster_ == 0) { + // allocate first cluster of file + if (!addCluster()) goto FAIL; + } + else { + curCluster_ = firstCluster_; + } + } + else { + uint32_t next; + if (!vol_->fatGet(curCluster_, &next)) goto FAIL; + if (vol_->isEOC(next)) { + // add cluster if at end of chain + if (!addCluster()) goto FAIL; + } + else { + curCluster_ = next; + } + } + } + // max space in block + uint16_t n = 512 - blockOffset; + + // lesser of space and amount to write + NOMORE(n, nToWrite); + + // block for data write + uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster; + if (n == 512) { + // full block - don't need to use cache + if (vol_->cacheBlockNumber() == block) { + // invalidate cache if block is in cache + vol_->cacheSetBlockNumber(0xFFFFFFFF, false); + } + if (!vol_->writeBlock(block, src)) goto FAIL; + } + else { + if (blockOffset == 0 && curPosition_ >= fileSize_) { + // start of new block don't need to read into cache + if (!vol_->cacheFlush()) goto FAIL; + // set cache dirty and SD address of block + vol_->cacheSetBlockNumber(block, true); + } + else { + // rewrite part of block + if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto FAIL; + } + uint8_t* dst = vol_->cache()->data + blockOffset; + memcpy(dst, src, n); + } + curPosition_ += n; + src += n; + nToWrite -= n; + } + if (curPosition_ > fileSize_) { + // update fileSize and insure sync will update dir entry + fileSize_ = curPosition_; + flags_ |= F_FILE_DIR_DIRTY; + } + else if (dateTime_ && nbyte) { + // insure sync will update modified date and time + flags_ |= F_FILE_DIR_DIRTY; + } + + if (flags_ & O_SYNC) { + if (!sync()) goto FAIL; + } + return nbyte; + + FAIL: + // return for write error + writeError = true; + return -1; +} + +#endif // SDSUPPORT diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h new file mode 100644 index 00000000..13a1be86 --- /dev/null +++ b/Marlin/src/sd/SdBaseFile.h @@ -0,0 +1,387 @@ +/** + * 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 + +/** + * \file + * \brief SdBaseFile class + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "SdFatConfig.h" +#include "SdVolume.h" + +#include + +/** + * \struct filepos_t + * \brief internal type for istream + * do not use in user apps + */ +struct filepos_t { + uint32_t position; // stream byte position + uint32_t cluster; // cluster of position + filepos_t() : position(0), cluster(0) {} +}; + +// use the gnu style oflag in open() +uint8_t const O_READ = 0x01, // open() oflag for reading + O_RDONLY = O_READ, // open() oflag - same as O_IN + O_WRITE = 0x02, // open() oflag for write + O_WRONLY = O_WRITE, // open() oflag - same as O_WRITE + O_RDWR = (O_READ | O_WRITE), // open() oflag for reading and writing + O_ACCMODE = (O_READ | O_WRITE), // open() oflag mask for access modes + O_APPEND = 0x04, // The file offset shall be set to the end of the file prior to each write. + O_SYNC = 0x08, // Synchronous writes - call sync() after each write + O_TRUNC = 0x10, // Truncate the file to zero length + O_AT_END = 0x20, // Set the initial position at the end of the file + O_CREAT = 0x40, // Create the file if nonexistent + O_EXCL = 0x80; // If O_CREAT and O_EXCL are set, open() shall fail if the file exists + +// SdBaseFile class static and const definitions + +// flags for ls() +uint8_t const LS_DATE = 1, // ls() flag to print modify date + LS_SIZE = 2, // ls() flag to print file size + LS_R = 4; // ls() flag for recursive list of subdirectories + + +// flags for timestamp +uint8_t const T_ACCESS = 1, // Set the file's last access date + T_CREATE = 2, // Set the file's creation date and time + T_WRITE = 4; // Set the file's write date and time + +// values for type_ +uint8_t const FAT_FILE_TYPE_CLOSED = 0, // This file has not been opened. + FAT_FILE_TYPE_NORMAL = 1, // A normal file + FAT_FILE_TYPE_ROOT_FIXED = 2, // A FAT12 or FAT16 root directory + FAT_FILE_TYPE_ROOT32 = 3, // A FAT32 root directory + FAT_FILE_TYPE_SUBDIR = 4, // A subdirectory file + FAT_FILE_TYPE_MIN_DIR = FAT_FILE_TYPE_ROOT_FIXED; // Test value for directory type + +/** + * date field for FAT directory entry + * \param[in] year [1980,2107] + * \param[in] month [1,12] + * \param[in] day [1,31] + * + * \return Packed date for dir_t entry. + */ +static inline uint16_t FAT_DATE(uint16_t year, uint8_t month, uint8_t day) { return (year - 1980) << 9 | month << 5 | day; } + +/** + * year part of FAT directory date field + * \param[in] fatDate Date in packed dir format. + * + * \return Extracted year [1980,2107] + */ +static inline uint16_t FAT_YEAR(uint16_t fatDate) { return 1980 + (fatDate >> 9); } + +/** + * month part of FAT directory date field + * \param[in] fatDate Date in packed dir format. + * + * \return Extracted month [1,12] + */ +static inline uint8_t FAT_MONTH(uint16_t fatDate) { return (fatDate >> 5) & 0xF; } + +/** + * day part of FAT directory date field + * \param[in] fatDate Date in packed dir format. + * + * \return Extracted day [1,31] + */ +static inline uint8_t FAT_DAY(uint16_t fatDate) { return fatDate & 0x1F; } + +/** + * time field for FAT directory entry + * \param[in] hour [0,23] + * \param[in] minute [0,59] + * \param[in] second [0,59] + * + * \return Packed time for dir_t entry. + */ +static inline uint16_t FAT_TIME(uint8_t hour, uint8_t minute, uint8_t second) { return hour << 11 | minute << 5 | second >> 1; } + +/** + * hour part of FAT directory time field + * \param[in] fatTime Time in packed dir format. + * + * \return Extracted hour [0,23] + */ +static inline uint8_t FAT_HOUR(uint16_t fatTime) { return fatTime >> 11; } + +/** + * minute part of FAT directory time field + * \param[in] fatTime Time in packed dir format. + * + * \return Extracted minute [0,59] + */ +static inline uint8_t FAT_MINUTE(uint16_t fatTime) { return (fatTime >> 5) & 0x3F; } + +/** + * second part of FAT directory time field + * Note second/2 is stored in packed time. + * + * \param[in] fatTime Time in packed dir format. + * + * \return Extracted second [0,58] + */ +static inline uint8_t FAT_SECOND(uint16_t fatTime) { return 2 * (fatTime & 0x1F); } + +// Default date for file timestamps is 1 Jan 2000 +uint16_t const FAT_DEFAULT_DATE = ((2000 - 1980) << 9) | (1 << 5) | 1; +// Default time for file timestamp is 1 am +uint16_t const FAT_DEFAULT_TIME = (1 << 11); + +/** + * \class SdBaseFile + * \brief Base class for SdFile with Print and C++ streams. + */ +class SdBaseFile { + public: + SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} + SdBaseFile(const char* path, uint8_t oflag); + ~SdBaseFile() { if (isOpen()) close(); } + + /** + * writeError is set to true if an error occurs during a write(). + * Set writeError to false before calling print() and/or write() and check + * for true after calls to print() and/or write(). + */ + bool writeError; + + // helpers for stream classes + + /** + * get position for streams + * \param[out] pos struct to receive position + */ + void getpos(filepos_t* pos); + + /** + * set position for streams + * \param[out] pos struct with value for new position + */ + void setpos(filepos_t* pos); + + bool close(); + bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + bool createContiguous(SdBaseFile* dirFile, + const char* path, uint32_t size); + /** + * \return The current cluster number for a file or directory. + */ + uint32_t curCluster() const { return curCluster_; } + + /** + * \return The current position for a file or directory. + */ + uint32_t curPosition() const { return curPosition_; } + + /** + * \return Current working directory + */ + static SdBaseFile* cwd() { return cwd_; } + + /** + * Set the date/time callback function + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here + * + * // return date using FAT_DATE macro to format fields + * *date = FAT_DATE(year, month, day); + * + * // return time using FAT_TIME macro to format fields + * *time = FAT_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + * See the timestamp() function. + */ + static void dateTimeCallback( + void (*dateTime)(uint16_t* date, uint16_t* time)) { + dateTime_ = dateTime; + } + + /** + * Cancel the date/time callback function. + */ + static void dateTimeCallbackCancel() { dateTime_ = 0; } + bool dirEntry(dir_t* dir); + static void dirName(const dir_t& dir, char* name); + bool exists(const char* name); + int16_t fgets(char* str, int16_t num, char* delim = 0); + + /** + * \return The total number of bytes in a file or directory. + */ + uint32_t fileSize() const { return fileSize_; } + + /** + * \return The first cluster number for a file or directory. + */ + uint32_t firstCluster() const { return firstCluster_; } + + /** + * \return True if this is a directory else false. + */ + bool isDir() const { return type_ >= FAT_FILE_TYPE_MIN_DIR; } + + /** + * \return True if this is a normal file else false. + */ + bool isFile() const { return type_ == FAT_FILE_TYPE_NORMAL; } + + /** + * \return True if this is an open file/directory else false. + */ + bool isOpen() const { return type_ != FAT_FILE_TYPE_CLOSED; } + + /** + * \return True if this is a subdirectory else false. + */ + bool isSubDir() const { return type_ == FAT_FILE_TYPE_SUBDIR; } + + /** + * \return True if this is the root directory. + */ + bool isRoot() const { return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32; } + + bool getDosName(char * const name); + void ls(uint8_t flags = 0, uint8_t indent = 0); + + bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true); + bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); + bool open(SdBaseFile* dirFile, const char* path, uint8_t oflag); + bool open(const char* path, uint8_t oflag = O_READ); + bool openNext(SdBaseFile* dirFile, uint8_t oflag); + bool openRoot(SdVolume* vol); + int peek(); + static void printFatDate(uint16_t fatDate); + static void printFatTime(uint16_t fatTime); + bool printName(); + int16_t read(); + int16_t read(void* buf, uint16_t nbyte); + int8_t readDir(dir_t* dir, char* longFilename); + static bool remove(SdBaseFile* dirFile, const char* path); + bool remove(); + + /** + * Set the file's current position to zero. + */ + void rewind() { seekSet(0); } + bool rename(SdBaseFile* dirFile, const char* newPath); + bool rmdir(); + bool rmRfStar(); + + /** + * Set the files position to current position + \a pos. See seekSet(). + * \param[in] offset The new position in bytes from the current position. + * \return true for success or false for failure. + */ + bool seekCur(const int32_t offset) { return seekSet(curPosition_ + offset); } + + /** + * Set the files position to end-of-file + \a offset. See seekSet(). + * \param[in] offset The new position in bytes from end-of-file. + * \return true for success or false for failure. + */ + bool seekEnd(const int32_t offset = 0) { return seekSet(fileSize_ + offset); } + bool seekSet(const uint32_t pos); + bool sync(); + bool timestamp(SdBaseFile* file); + bool timestamp(uint8_t flag, uint16_t year, uint8_t month, uint8_t day, + uint8_t hour, uint8_t minute, uint8_t second); + + /** + * Type of file. Use isFile() or isDir() instead of type() if possible. + * + * \return The file or directory type. + */ + uint8_t type() const { return type_; } + bool truncate(uint32_t size); + + /** + * \return SdVolume that contains this file. + */ + SdVolume* volume() const { return vol_; } + int16_t write(const void* buf, uint16_t nbyte); + + private: + friend class SdFat; // allow SdFat to set cwd_ + static SdBaseFile* cwd_; // global pointer to cwd dir + + // data time callback function + static void (*dateTime_)(uint16_t* date, uint16_t* time); + + // bits defined in flags_ + static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC), // should be 0x0F + F_FILE_DIR_DIRTY = 0x80; // sync of directory entry required + + // private data + uint8_t flags_; // See above for definition of flags_ bits + uint8_t fstate_; // error and eof indicator + uint8_t type_; // type of file see above for values + uint32_t curCluster_; // cluster for current file position + uint32_t curPosition_; // current file position in bytes from beginning + uint32_t dirBlock_; // block for this files directory entry + uint8_t dirIndex_; // index of directory entry in dirBlock + uint32_t fileSize_; // file size in bytes + uint32_t firstCluster_; // first cluster of file + SdVolume* vol_; // volume where file is located + + /** + * EXPERIMENTAL - Don't use! + */ + //bool openParent(SdBaseFile* dir); + + // private functions + bool addCluster(); + bool addDirCluster(); + dir_t* cacheDirEntry(uint8_t action); + int8_t lsPrintNext(uint8_t flags, uint8_t indent); + static bool make83Name(const char* str, uint8_t* name, const char** ptr); + bool mkdir(SdBaseFile* parent, const uint8_t dname[11]); + bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag); + bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); + dir_t* readDirCache(); +}; diff --git a/Marlin/src/sd/SdFatConfig.h b/Marlin/src/sd/SdFatConfig.h new file mode 100644 index 00000000..2e03a418 --- /dev/null +++ b/Marlin/src/sd/SdFatConfig.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 + +/** + * SdFatConfig.h + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +/** + * To use multiple SD cards set USE_MULTIPLE_CARDS nonzero. + * + * Using multiple cards costs 400 - 500 bytes of flash. + * + * Each card requires about 550 bytes of SRAM so use of a Mega is recommended. + */ +#define USE_MULTIPLE_CARDS 0 + +/** + * Call flush for endl if ENDL_CALLS_FLUSH is nonzero + * + * The standard for iostreams is to call flush. This is very costly for + * SdFat. Each call to flush causes 2048 bytes of I/O to the SD. + * + * SdFat has a single 512 byte buffer for SD I/O so it must write the current + * data block to the SD, read the directory block from the SD, update the + * directory entry, write the directory block to the SD and read the data + * block back into the buffer. + * + * The SD flash memory controller is not designed for this many rewrites + * so performance may be reduced by more than a factor of 100. + * + * If ENDL_CALLS_FLUSH is zero, you must call flush and/or close to force + * all data to be written to the SD. + */ +#define ENDL_CALLS_FLUSH 0 + +/** + * Allow FAT12 volumes if FAT12_SUPPORT is nonzero. + * FAT12 has not been well tested. + */ +#define FAT12_SUPPORT 0 + +/** + * SPI init rate for SD initialization commands. Must be 5 (F_CPU/64) + * or 6 (F_CPU/128). + */ +#define SPI_SD_INIT_RATE 5 + +/** + * Set the SS pin high for hardware SPI. If SS is chip select for another SPI + * device this will disable that device during the SD init phase. + */ +#define SET_SPI_SS_HIGH 1 + +/** + * Define MEGA_SOFT_SPI nonzero to use software SPI on Mega Arduinos. + * Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. + * + * MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used + * on Mega Arduinos. Software SPI works well with GPS Shield V1.1 + * but many SD cards will fail with GPS Shield V1.0. + */ +#define MEGA_SOFT_SPI 0 + +// Set USE_SOFTWARE_SPI nonzero to ALWAYS use Software SPI. +#define USE_SOFTWARE_SPI 0 + +/** + * The __cxa_pure_virtual function is an error handler that is invoked when + * a pure virtual function is called. + */ +#define USE_CXA_PURE_VIRTUAL 1 + +/** + * Defines for 8.3 and long (vfat) filenames + */ + +#define FILENAME_LENGTH 13 // Number of UTF-16 characters per entry + +// Total bytes needed to store a single long filename +#define LONG_FILENAME_LENGTH (FILENAME_LENGTH * MAX_VFAT_ENTRIES + 1) diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h new file mode 100644 index 00000000..484d4e50 --- /dev/null +++ b/Marlin/src/sd/SdFatStructs.h @@ -0,0 +1,612 @@ +/** + * 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 + +/** + * \file + * \brief FAT file structures + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include + +#define PACKED __attribute__((__packed__)) + +/** + * mostly from Microsoft document fatgen103.doc + * https://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx + */ + +uint8_t const BOOTSIG0 = 0x55, // Value for byte 510 of boot block or MBR + BOOTSIG1 = 0xAA, // Value for byte 511 of boot block or MBR + EXTENDED_BOOT_SIG = 0x29; // Value for bootSignature field int FAT/FAT32 boot sector + +/** + * \struct partitionTable + * \brief MBR partition table entry + * + * A partition table entry for a MBR formatted storage device. + * The MBR partition table has four entries. + */ +struct partitionTable { + /** + * Boot Indicator . Indicates whether the volume is the active + * partition. Legal values include: 0x00. Do not use for booting. + * 0x80 Active partition. + */ + uint8_t boot; + /** + * Head part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t beginHead; + /** + * Sector part of Cylinder-head-sector address of the first block in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned beginSector : 6; + /** High bits cylinder for first block in partition. */ + unsigned beginCylinderHigh : 2; + /** + * Combine beginCylinderLow with beginCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t beginCylinderLow; + /** + * Partition type. See defines that begin with PART_TYPE_ for + * some Microsoft partition types. + */ + uint8_t type; + /** + * head part of cylinder-head-sector address of the last sector in the + * partition. Legal values are 0-255. Only used in old PC BIOS. + */ + uint8_t endHead; + /** + * Sector part of cylinder-head-sector address of the last sector in + * the partition. Legal values are 1-63. Only used in old PC BIOS. + */ + unsigned endSector : 6; + /** High bits of end cylinder */ + unsigned endCylinderHigh : 2; + /** + * Combine endCylinderLow with endCylinderHigh. Legal values + * are 0-1023. Only used in old PC BIOS. + */ + uint8_t endCylinderLow; + + uint32_t firstSector; // Logical block address of the first block in the partition. + uint32_t totalSectors; // Length of the partition, in blocks. +} PACKED; + +typedef struct partitionTable part_t; // Type name for partitionTable + +/** + * \struct masterBootRecord + * + * \brief Master Boot Record + * + * The first block of a storage device that is formatted with a MBR. + */ +struct masterBootRecord { + uint8_t codeArea[440]; // Code Area for master boot program. + uint32_t diskSignature; // Optional Windows NT disk signature. May contain boot code. + uint16_t usuallyZero; // Usually zero but may be more boot code. + part_t part[4]; // Partition tables. + uint8_t mbrSig0; // First MBR signature byte. Must be 0x55 + uint8_t mbrSig1; // Second MBR signature byte. Must be 0xAA +} PACKED; +/** Type name for masterBootRecord */ +typedef struct masterBootRecord mbr_t; + +/** + * \struct fat_boot + * + * \brief Boot sector for a FAT12/FAT16 volume. + */ +struct fat_boot { + /** + * The first three bytes of the boot sector must be valid, + * executable x 86-based CPU instructions. This includes a + * jump instruction that skips the next nonexecutable bytes. + */ + uint8_t jump[3]; + /** + * This is typically a string of characters that identifies + * the operating system that formatted the volume. + */ + char oemId[8]; + /** + * The size of a hardware sector. Valid decimal values for this + * field are 512, 1024, 2048, and 4096. For most disks used in + * the United States, the value of this field is 512. + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. 128 should be avoided. + */ + uint8_t sectorsPerCluster; + /** + * The number of sectors preceding the start of the first FAT, + * including the boot sector. The value of this field is always 1. + */ + uint16_t reservedSectorCount; + /** + * The number of copies of the FAT on the volume. + * The value of this field is always 2. + */ + uint8_t fatCount; + /** + * For FAT12 and FAT16 volumes, this field contains the count of + * 32-byte directory entries in the root directory. For FAT32 volumes, + * this field must be set to 0. For FAT12 and FAT16 volumes, this + * value should always specify a count that when multiplied by 32 + * results in a multiple of bytesPerSector. FAT16 volumes should + * use the value 512. + */ + uint16_t rootDirEntryCount; + /** + * This field is the old 16-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then totalSectors32 + * must be nonzero. For FAT32 volumes, this field must be 0. For + * FAT12 and FAT16 volumes, this field contains the sector count, and + * totalSectors32 is 0 if the total sector count fits + * (is less than 0x10000). + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (nonremovable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * Count of sectors occupied by one FAT on FAT12/FAT16 volumes. + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + + uint16_t sectorsPerTrack; // Sectors per track for interrupt 0x13. Not used otherwise. + uint16_t headCount; // Number of heads for interrupt 0x13. Not used otherwise. + + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * This field is the new 32-bit total count of sectors on the volume. + * This count includes the count of all sectors in all four regions + * of the volume. This field can be 0; if it is 0, then + * totalSectors16 must be nonzero. + */ + uint32_t totalSectors32; + /** + * Related to the BIOS physical drive number. Floppy drives are + * identified as 0x00 and physical hard disks are identified as + * 0x80, regardless of the number of physical disk drives. + * Typically, this value is set prior to issuing an INT 13h BIOS + * call to specify the device to access. The value is only + * relevant if the device is a boot device. + */ + uint8_t driveNumber; + + uint8_t reserved1; // used by Windows NT - should be zero for FAT + uint8_t bootSignature; // 0x29 if next three fields are valid + + /** + * A random serial number created when formatting a disk, + * which helps to distinguish between disks. + * Usually generated by combining date and time. + */ + uint32_t volumeSerialNumber; + /** + * A field once used to store the volume label. The volume label + * is now stored as a special file in the root directory. + */ + char volumeLabel[11]; + /** + * A field with a value of either FAT, FAT12 or FAT16, + * depending on the disk format. + */ + char fileSystemType[8]; + + uint8_t bootCode[448]; // X86 boot code + uint8_t bootSectorSig0; // must be 0x55 + uint8_t bootSectorSig1; // must be 0xAA +} PACKED; + +typedef struct fat_boot fat_boot_t; // Type name for FAT Boot Sector + +/** + * \struct fat32_boot + * + * \brief Boot sector for a FAT32 volume. + */ +struct fat32_boot { + /** + * The first three bytes of the boot sector must be valid, + * executable x 86-based CPU instructions. This includes a + * jump instruction that skips the next nonexecutable bytes. + */ + uint8_t jump[3]; + /** + * This is typically a string of characters that identifies + * the operating system that formatted the volume. + */ + char oemId[8]; + /** + * The size of a hardware sector. Valid decimal values for this + * field are 512, 1024, 2048, and 4096. For most disks used in + * the United States, the value of this field is 512. + */ + uint16_t bytesPerSector; + /** + * Number of sectors per allocation unit. This value must be a + * power of 2 that is greater than 0. The legal values are + * 1, 2, 4, 8, 16, 32, 64, and 128. 128 should be avoided. + */ + uint8_t sectorsPerCluster; + /** + * The number of sectors preceding the start of the first FAT, + * including the boot sector. Must not be zero + */ + uint16_t reservedSectorCount; + /** + * The number of copies of the FAT on the volume. + * The value of this field is always 2. + */ + uint8_t fatCount; + /** + * FAT12/FAT16 only. For FAT32 volumes, this field must be set to 0. + */ + uint16_t rootDirEntryCount; + /** + * For FAT32 volumes, this field must be 0. + */ + uint16_t totalSectors16; + /** + * This dates back to the old MS-DOS 1.x media determination and is + * no longer usually used for anything. 0xF8 is the standard value + * for fixed (nonremovable) media. For removable media, 0xF0 is + * frequently used. Legal values are 0xF0 or 0xF8-0xFF. + */ + uint8_t mediaType; + /** + * On FAT32 volumes this field must be 0, and sectorsPerFat32 + * contains the FAT size count. + */ + uint16_t sectorsPerFat16; + + uint16_t sectorsPerTrack; // Sectors per track for interrupt 0x13. Not used otherwise. + uint16_t headCount; // Number of heads for interrupt 0x13. Not used otherwise. + + /** + * Count of hidden sectors preceding the partition that contains this + * FAT volume. This field is generally only relevant for media + * visible on interrupt 0x13. + */ + uint32_t hidddenSectors; + /** + * Contains the total number of sectors in the FAT32 volume. + */ + uint32_t totalSectors32; + /** + * Count of sectors occupied by one FAT on FAT32 volumes. + */ + uint32_t sectorsPerFat32; + /** + * This field is only defined for FAT32 media and does not exist on + * FAT12 and FAT16 media. + * Bits 0-3 -- Zero-based number of active FAT. + * Only valid if mirroring is disabled. + * Bits 4-6 -- Reserved. + * Bit 7 -- 0 means the FAT is mirrored at runtime into all FATs. + * -- 1 means only one FAT is active; it is the one referenced + * in bits 0-3. + * Bits 8-15 -- Reserved. + */ + uint16_t fat32Flags; + /** + * FAT32 version. High byte is major revision number. + * Low byte is minor revision number. Only 0.0 define. + */ + uint16_t fat32Version; + /** + * Cluster number of the first cluster of the root directory for FAT32. + * This usually 2 but not required to be 2. + */ + uint32_t fat32RootCluster; + /** + * Sector number of FSINFO structure in the reserved area of the + * FAT32 volume. Usually 1. + */ + uint16_t fat32FSInfo; + /** + * If nonzero, indicates the sector number in the reserved area + * of the volume of a copy of the boot record. Usually 6. + * No value other than 6 is recommended. + */ + uint16_t fat32BackBootBlock; + /** + * Reserved for future expansion. Code that formats FAT32 volumes + * should always set all of the bytes of this field to 0. + */ + uint8_t fat32Reserved[12]; + /** + * Related to the BIOS physical drive number. Floppy drives are + * identified as 0x00 and physical hard disks are identified as + * 0x80, regardless of the number of physical disk drives. + * Typically, this value is set prior to issuing an INT 13h BIOS + * call to specify the device to access. The value is only + * relevant if the device is a boot device. + */ + uint8_t driveNumber; + + uint8_t reserved1; // Used by Windows NT - should be zero for FAT + uint8_t bootSignature; // 0x29 if next three fields are valid + + /** + * A random serial number created when formatting a disk, + * which helps to distinguish between disks. + * Usually generated by combining date and time. + */ + uint32_t volumeSerialNumber; + /** + * A field once used to store the volume label. The volume label + * is now stored as a special file in the root directory. + */ + char volumeLabel[11]; + /** + * A text field with a value of FAT32. + */ + char fileSystemType[8]; + + uint8_t bootCode[420]; // X86 boot code + uint8_t bootSectorSig0; // must be 0x55 + uint8_t bootSectorSig1; // must be 0xAA + +} PACKED; + +typedef struct fat32_boot fat32_boot_t; // Type name for FAT32 Boot Sector + +uint32_t const FSINFO_LEAD_SIG = 0x41615252, // 'AaRR' Lead signature for a FSINFO sector + FSINFO_STRUCT_SIG = 0x61417272; // 'aArr' Struct signature for a FSINFO sector + +/** + * \struct fat32_fsinfo + * + * \brief FSINFO sector for a FAT32 volume. + */ +struct fat32_fsinfo { + uint32_t leadSignature; // must be 0x52, 0x52, 0x61, 0x41 'RRaA' + uint8_t reserved1[480]; // must be zero + uint32_t structSignature; // must be 0x72, 0x72, 0x41, 0x61 'rrAa' + /** + * Contains the last known free cluster count on the volume. + * If the value is 0xFFFFFFFF, then the free count is unknown + * and must be computed. Any other value can be used, but is + * not necessarily correct. It should be range checked at least + * to make sure it is <= volume cluster count. + */ + uint32_t freeCount; + /** + * This is a hint for the FAT driver. It indicates the cluster + * number at which the driver should start looking for free clusters. + * If the value is 0xFFFFFFFF, then there is no hint and the driver + * should start looking at cluster 2. + */ + uint32_t nextFree; + + uint8_t reserved2[12]; // must be zero + uint8_t tailSignature[4]; // must be 0x00, 0x00, 0x55, 0xAA +} PACKED; + +typedef struct fat32_fsinfo fat32_fsinfo_t; // Type name for FAT32 FSINFO Sector + +// End Of Chain values for FAT entries +uint16_t const FAT12EOC = 0xFFF, // FAT12 end of chain value used by Microsoft. + FAT12EOC_MIN = 0xFF8, // Minimum value for FAT12 EOC. Use to test for EOC. + FAT16EOC = 0xFFFF, // FAT16 end of chain value used by Microsoft. + FAT16EOC_MIN = 0xFFF8; // Minimum value for FAT16 EOC. Use to test for EOC. +uint32_t const FAT32EOC = 0x0FFFFFFF, // FAT32 end of chain value used by Microsoft. + FAT32EOC_MIN = 0x0FFFFFF8, // Minimum value for FAT32 EOC. Use to test for EOC. + FAT32MASK = 0x0FFFFFFF; // Mask a for FAT32 entry. Entries are 28 bits. + +/** + * \struct directoryEntry + * \brief FAT short directory entry + * + * Short means short 8.3 name, not the entry size. + * + * Date Format. A FAT directory entry date stamp is a 16-bit field that is + * basically a date relative to the MS-DOS epoch of 01/01/1980. Here is the + * format (bit 0 is the LSB of the 16-bit word, bit 15 is the MSB of the + * 16-bit word): + * + * Bits 9-15: Count of years from 1980, valid value range 0-127 + * inclusive (1980-2107). + * + * Bits 5-8: Month of year, 1 = January, valid value range 1-12 inclusive. + * + * Bits 0-4: Day of month, valid value range 1-31 inclusive. + * + * Time Format. A FAT directory entry time stamp is a 16-bit field that has + * a granularity of 2 seconds. Here is the format (bit 0 is the LSB of the + * 16-bit word, bit 15 is the MSB of the 16-bit word). + * + * Bits 11-15: Hours, valid value range 0-23 inclusive. + * + * Bits 5-10: Minutes, valid value range 0-59 inclusive. + * + * Bits 0-4: 2-second count, valid value range 0-29 inclusive (0 - 58 seconds). + * + * The valid time range is from Midnight 00:00:00 to 23:59:58. + */ +struct directoryEntry { + /** + * Short 8.3 name. + * + * The first eight bytes contain the file name with blank fill. + * The last three bytes contain the file extension with blank fill. + */ + uint8_t name[11]; + /** + * Entry attributes. + * + * The upper two bits of the attribute byte are reserved and should + * always be set to 0 when a file is created and never modified or + * looked at after that. See defines that begin with DIR_ATT_. + */ + uint8_t attributes; + /** + * Reserved for use by Windows NT. Set value to 0 when a file is + * created and never modify or look at it after that. + */ + uint8_t reservedNT; + /** + * The granularity of the seconds part of creationTime is 2 seconds + * so this field is a count of tenths of a second and it's valid + * value range is 0-199 inclusive. (WHG note - seems to be hundredths) + */ + uint8_t creationTimeTenths; + + uint16_t creationTime; // Time file was created. + uint16_t creationDate; // Date file was created. + + /** + * Last access date. Note that there is no last access time, only + * a date. This is the date of last read or write. In the case of + * a write, this should be set to the same date as lastWriteDate. + */ + uint16_t lastAccessDate; + /** + * High word of this entry's first cluster number (always 0 for a + * FAT12 or FAT16 volume). + */ + uint16_t firstClusterHigh; + + uint16_t lastWriteTime; // Time of last write. File creation is considered a write. + uint16_t lastWriteDate; // Date of last write. File creation is considered a write. + uint16_t firstClusterLow; // Low word of this entry's first cluster number. + uint32_t fileSize; // 32-bit unsigned holding this file's size in bytes. +} PACKED; + +/** + * \struct directoryVFATEntry + * \brief VFAT long filename directory entry + * + * directoryVFATEntries are found in the same list as normal directoryEntry. + * But have the attribute field set to DIR_ATT_LONG_NAME. + * + * Long filenames are saved in multiple directoryVFATEntries. + * Each entry containing 13 UTF-16 characters. + */ +struct directoryVFATEntry { + /** + * Sequence number. Consists of 2 parts: + * bit 6: indicates first long filename block for the next file + * bit 0-4: the position of this long filename block (first block is 1) + */ + uint8_t sequenceNumber; + + uint16_t name1[5]; // First set of UTF-16 characters + uint8_t attributes; // attributes (at the same location as in directoryEntry), always 0x0F + uint8_t reservedNT; // Reserved for use by Windows NT. Always 0. + uint8_t checksum; // Checksum of the short 8.3 filename, can be used to checked if the file system as modified by a not-long-filename aware implementation. + uint16_t name2[6]; // Second set of UTF-16 characters + uint16_t firstClusterLow; // firstClusterLow is always zero for longFilenames + uint16_t name3[2]; // Third set of UTF-16 characters +} PACKED; + +// Definitions for directory entries +// +typedef struct directoryEntry dir_t; // Type name for directoryEntry +typedef struct directoryVFATEntry vfat_t; // Type name for directoryVFATEntry + +uint8_t const DIR_NAME_0xE5 = 0x05, // escape for name[0] = 0xE5 + DIR_NAME_DELETED = 0xE5, // name[0] value for entry that is free after being "deleted" + DIR_NAME_FREE = 0x00, // name[0] value for entry that is free and no allocated entries follow + DIR_ATT_READ_ONLY = 0x01, // file is read-only + DIR_ATT_HIDDEN = 0x02, // File should hidden in directory listings + DIR_ATT_SYSTEM = 0x04, // Entry is for a system file + DIR_ATT_VOLUME_ID = 0x08, // Directory entry contains the volume label + DIR_ATT_DIRECTORY = 0x10, // Entry is for a directory + DIR_ATT_ARCHIVE = 0x20, // Old DOS archive bit for backup support + DIR_ATT_LONG_NAME = 0x0F, // Test value for long name entry. Test is (d->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME. + DIR_ATT_LONG_NAME_MASK = 0x3F, // Test mask for long name entry + DIR_ATT_DEFINED_BITS = 0x3F; // defined attribute bits + +/** + * Directory entry is part of a long name + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for part of a long name else false. + */ +static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { + return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; +} + +/** Mask for file/subdirectory tests */ +uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); + +/** + * Directory entry is for a file + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for a normal file else false. + */ +static inline uint8_t DIR_IS_FILE(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; +} + +/** + * Directory entry is for a subdirectory + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for a subdirectory else false. + */ +static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; +} + +/** + * Directory entry is for a file or subdirectory + * \param[in] dir Pointer to a directory entry. + * + * \return true if the entry is for a normal file or subdirectory else false. + */ +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { + return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; +} diff --git a/Marlin/src/sd/SdFatUtil.cpp b/Marlin/src/sd/SdFatUtil.cpp new file mode 100644 index 00000000..e2c467c5 --- /dev/null +++ b/Marlin/src/sd/SdFatUtil.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 . + * + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2008 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "SdFatUtil.h" +#include + +/** + * Amount of free RAM + * \return The number of free bytes. + */ +#ifdef __arm__ + + extern "C" char* sbrk(int incr); + int SdFatUtil::FreeRam() { + char top; + return &top - reinterpret_cast(sbrk(0)); + } + +#else + + extern char* __brkval; + extern char __bss_end; + int SdFatUtil::FreeRam() { + char top; + return __brkval ? &top - __brkval : &top - &__bss_end; + } + +#endif + +#endif // SDSUPPORT diff --git a/Marlin/src/sd/SdFatUtil.h b/Marlin/src/sd/SdFatUtil.h new file mode 100644 index 00000000..7afed2ed --- /dev/null +++ b/Marlin/src/sd/SdFatUtil.h @@ -0,0 +1,40 @@ +/** + * 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 + +/** + * Arduino SdFat Library + * Copyright (c) 2008 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +/** + * \file + * \brief Useful utility functions. + */ + +namespace SdFatUtil { + int FreeRam(); +} + +using namespace SdFatUtil; // NOLINT diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp new file mode 100644 index 00000000..c82fe2c5 --- /dev/null +++ b/Marlin/src/sd/SdFile.cpp @@ -0,0 +1,100 @@ +/** + * 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 . + * + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "SdFile.h" + +/** + * Create a file object and open it in the current working directory. + * + * \param[in] path A path with a valid 8.3 DOS name for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). + */ +SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { } + +/** + * Write data to an open file. + * + * \note Data is moved to the cache but may not be written to the + * storage device until sync() is called. + * + * \param[in] buf Pointer to the location of the data to be written. + * + * \param[in] nbyte Number of bytes to write. + * + * \return For success write() returns the number of bytes written, always + * \a nbyte. If an error occurs, write() returns -1. Possible errors + * include write() is called before a file has been opened, write is called + * for a read-only file, device is full, a corrupt file system or an I/O error. + */ +int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::write(buf, nbyte); } + +/** + * Write a byte to a file. Required by the Arduino Print class. + * \param[in] b the byte to be written. + * Use writeError to check for errors. + */ +#if ARDUINO >= 100 + size_t SdFile::write(uint8_t b) { return SdBaseFile::write(&b, 1); } +#else + void SdFile::write(uint8_t b) { SdBaseFile::write(&b, 1); } +#endif + +/** + * Write a string to a file. Used by the Arduino Print class. + * \param[in] str Pointer to the string. + * Use writeError to check for errors. + */ +void SdFile::write(const char* str) { SdBaseFile::write(str, strlen(str)); } + +/** + * Write a PROGMEM string to a file. + * \param[in] str Pointer to the PROGMEM string. + * Use writeError to check for errors. + */ +void SdFile::write_P(PGM_P str) { + for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c); +} + +/** + * Write a PROGMEM string followed by CR/LF to a file. + * \param[in] str Pointer to the PROGMEM string. + * Use writeError to check for errors. + */ +void SdFile::writeln_P(PGM_P str) { + write_P(str); + write_P(PSTR("\r\n")); +} + +#endif // SDSUPPORT diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h new file mode 100644 index 00000000..52c8f1f0 --- /dev/null +++ b/Marlin/src/sd/SdFile.h @@ -0,0 +1,59 @@ +/** + * 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 + +/** + * \file + * \brief SdFile class + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "SdBaseFile.h" + +#include +#include + +/** + * \class SdFile + * \brief SdBaseFile with Print. + */ +class SdFile : public SdBaseFile/*, public Print*/ { + public: + SdFile() {} + SdFile(const char* name, uint8_t oflag); + #if ARDUINO >= 100 + size_t write(uint8_t b); + #else + void write(uint8_t b); + #endif + + int16_t write(const void* buf, uint16_t nbyte); + void write(const char* str); + void write_P(PGM_P str); + void writeln_P(PGM_P str); +}; diff --git a/Marlin/src/sd/SdInfo.h b/Marlin/src/sd/SdInfo.h new file mode 100644 index 00000000..bfa5a01a --- /dev/null +++ b/Marlin/src/sd/SdInfo.h @@ -0,0 +1,265 @@ +/** + * 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 + +/** + * Arduino Sd2Card Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include + +// Based on the document: +// +// SD Specifications +// Part 1 +// Physical Layer +// Simplified Specification +// Version 3.01 +// May 18, 2010 +// +// 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 + CMD8 = 0x08, // SEND_IF_COND - verify SD Memory Card interface operating condition + CMD9 = 0x09, // SEND_CSD - read the Card Specific Data (CSD register) + CMD10 = 0x0A, // SEND_CID - read the card identification information (CID register) + CMD12 = 0x0C, // STOP_TRANSMISSION - end multiple block read sequence + CMD13 = 0x0D, // SEND_STATUS - read the card status register + CMD17 = 0x11, // READ_SINGLE_BLOCK - read a single data block from the card + CMD18 = 0x12, // READ_MULTIPLE_BLOCK - read a multiple data blocks from the card + CMD24 = 0x18, // WRITE_BLOCK - write a single data block to the card + CMD25 = 0x19, // WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION + CMD32 = 0x20, // ERASE_WR_BLK_START - sets the address of the first block to be erased + CMD33 = 0x21, // ERASE_WR_BLK_END - sets the address of the last block of the continuous range to be erased + CMD38 = 0x26, // ERASE - erase all previously selected blocks + CMD55 = 0x37, // APP_CMD - escape for application specific command + CMD58 = 0x3A, // READ_OCR - read the OCR register of a card + CMD59 = 0x3B, // CRC_ON_OFF - enable or disable CRC checking + ACMD23 = 0x17, // SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be pre-erased before writing + ACMD41 = 0x29; // SD_SEND_OP_COMD - Sends host capacity support information and activates the card's initialization process + +/** status for card in the ready state */ +uint8_t const R1_READY_STATE = 0x00; +/** status for card in the idle state */ +uint8_t const R1_IDLE_STATE = 0x01; +/** status bit for illegal command */ +uint8_t const R1_ILLEGAL_COMMAND = 0x04; +/** start data token for read or write single block*/ +uint8_t const DATA_START_BLOCK = 0xFE; +/** stop token for write multiple blocks*/ +uint8_t const STOP_TRAN_TOKEN = 0xFD; +/** start data token for write multiple blocks*/ +uint8_t const WRITE_MULTIPLE_TOKEN = 0xFC; +/** mask for data response tokens after a write block operation */ +uint8_t const DATA_RES_MASK = 0x1F; +/** write data accepted token */ +uint8_t const DATA_RES_ACCEPTED = 0x05; + +/** Card IDentification (CID) register */ +typedef struct CID { + // byte 0 + /** Manufacturer ID */ + unsigned char mid; + // byte 1-2 + /** OEM/Application ID */ + char oid[2]; + // byte 3-7 + /** Product name */ + char pnm[5]; + // byte 8 + /** Product revision least significant digit */ + unsigned char prv_m : 4; + /** Product revision most significant digit */ + unsigned char prv_n : 4; + // byte 9-12 + /** Product serial number */ + uint32_t psn; + // byte 13 + /** Manufacturing date year low digit */ + unsigned char mdt_year_high : 4; + /** not used */ + unsigned char reserved : 4; + // byte 14 + /** Manufacturing date month */ + unsigned char mdt_month : 4; + /** Manufacturing date year low digit */ + unsigned char mdt_year_low : 4; + // byte 15 + /** not used always 1 */ + unsigned char always1 : 1; + /** CRC7 checksum */ + unsigned char crc : 7; +} cid_t; + +/** CSD for version 1.00 cards */ +typedef struct CSDV1 { + // byte 0 + unsigned char reserved1 : 6; + unsigned char csd_ver : 2; + // byte 1 + unsigned char taac; + // byte 2 + unsigned char nsac; + // byte 3 + unsigned char tran_speed; + // byte 4 + unsigned char ccc_high; + // byte 5 + unsigned char read_bl_len : 4; + unsigned char ccc_low : 4; + // byte 6 + unsigned char c_size_high : 2; + unsigned char reserved2 : 2; + unsigned char dsr_imp : 1; + unsigned char read_blk_misalign : 1; + unsigned char write_blk_misalign : 1; + unsigned char read_bl_partial : 1; + // byte 7 + unsigned char c_size_mid; + // byte 8 + unsigned char vdd_r_curr_max : 3; + unsigned char vdd_r_curr_min : 3; + unsigned char c_size_low : 2; + // byte 9 + unsigned char c_size_mult_high : 2; + unsigned char vdd_w_cur_max : 3; + unsigned char vdd_w_curr_min : 3; + // byte 10 + unsigned char sector_size_high : 6; + unsigned char erase_blk_en : 1; + unsigned char c_size_mult_low : 1; + // byte 11 + unsigned char wp_grp_size : 7; + unsigned char sector_size_low : 1; + // byte 12 + unsigned char write_bl_len_high : 2; + unsigned char r2w_factor : 3; + unsigned char reserved3 : 2; + unsigned char wp_grp_enable : 1; + // byte 13 + unsigned char reserved4 : 5; + unsigned char write_partial : 1; + unsigned char write_bl_len_low : 2; + // byte 14 + unsigned char reserved5: 2; + unsigned char file_format : 2; + unsigned char tmp_write_protect : 1; + unsigned char perm_write_protect : 1; + unsigned char copy : 1; + /** Indicates the file format on the card */ + unsigned char file_format_grp : 1; + // byte 15 + unsigned char always1 : 1; + unsigned char crc : 7; +} csd1_t; + +/** CSD for version 2.00 cards */ +typedef struct CSDV2 { + // byte 0 + unsigned char reserved1 : 6; + unsigned char csd_ver : 2; + // byte 1 + /** fixed to 0x0E */ + unsigned char taac; + // byte 2 + /** fixed to 0 */ + unsigned char nsac; + // byte 3 + unsigned char tran_speed; + // byte 4 + unsigned char ccc_high; + // byte 5 + /** This field is fixed to 9h, which indicates READ_BL_LEN=512 Byte */ + unsigned char read_bl_len : 4; + unsigned char ccc_low : 4; + // byte 6 + /** not used */ + unsigned char reserved2 : 4; + unsigned char dsr_imp : 1; + /** fixed to 0 */ + unsigned char read_blk_misalign : 1; + /** fixed to 0 */ + unsigned char write_blk_misalign : 1; + /** fixed to 0 - no partial read */ + unsigned char read_bl_partial : 1; + // byte 7 + /** not used */ + unsigned char reserved3 : 2; + /** high part of card size */ + unsigned char c_size_high : 6; + // byte 8 + /** middle part of card size */ + unsigned char c_size_mid; + // byte 9 + /** low part of card size */ + unsigned char c_size_low; + // byte 10 + /** sector size is fixed at 64 KB */ + unsigned char sector_size_high : 6; + /** fixed to 1 - erase single is supported */ + unsigned char erase_blk_en : 1; + /** not used */ + unsigned char reserved4 : 1; + // byte 11 + unsigned char wp_grp_size : 7; + /** sector size is fixed at 64 KB */ + unsigned char sector_size_low : 1; + // byte 12 + /** write_bl_len fixed for 512 byte blocks */ + unsigned char write_bl_len_high : 2; + /** fixed value of 2 */ + unsigned char r2w_factor : 3; + /** not used */ + unsigned char reserved5 : 2; + /** fixed value of 0 - no write protect groups */ + unsigned char wp_grp_enable : 1; + // byte 13 + unsigned char reserved6 : 5; + /** always zero - no partial block read*/ + unsigned char write_partial : 1; + /** write_bl_len fixed for 512 byte blocks */ + unsigned char write_bl_len_low : 2; + // byte 14 + unsigned char reserved7: 2; + /** Do not use always 0 */ + unsigned char file_format : 2; + unsigned char tmp_write_protect : 1; + unsigned char perm_write_protect : 1; + unsigned char copy : 1; + /** Do not use always 0 */ + unsigned char file_format_grp : 1; + // byte 15 + /** not used always 1 */ + unsigned char always1 : 1; + /** checksum */ + unsigned char crc : 7; +} csd2_t; + +/** union of old and new style CSD register */ +union csd_t { + csd1_t v1; + csd2_t v2; +}; diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp new file mode 100644 index 00000000..63731f72 --- /dev/null +++ b/Marlin/src/sd/SdVolume.cpp @@ -0,0 +1,403 @@ +/** + * 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 . + * + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include "../inc/MarlinConfig.h" + +#if ENABLED(SDSUPPORT) + +#include "SdVolume.h" + +#include "../MarlinCore.h" + +#if !USE_MULTIPLE_CARDS + // raw block cache + uint32_t SdVolume::cacheBlockNumber_; // current block number + cache_t SdVolume::cacheBuffer_; // 512 byte cache for Sd2Card + Sd2Card* SdVolume::sdCard_; // pointer to SD card object + bool SdVolume::cacheDirty_; // cacheFlush() will write block if true + uint32_t SdVolume::cacheMirrorBlock_; // mirror block for second FAT +#endif // USE_MULTIPLE_CARDS + +// find a contiguous group of clusters +bool SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { + if (ENABLED(SDCARD_READONLY)) return false; + + // start of group + uint32_t bgnCluster; + // end of group + uint32_t endCluster; + // last cluster of FAT + uint32_t fatEnd = clusterCount_ + 1; + + // flag to save place to start next search + bool setStart; + + // set search start cluster + if (*curCluster) { + // try to make file contiguous + bgnCluster = *curCluster + 1; + + // don't save new start location + setStart = false; + } + else { + // start at likely place for free cluster + bgnCluster = allocSearchStart_; + + // save next search start if one cluster + setStart = count == 1; + } + // end of group + endCluster = bgnCluster; + + // search the FAT for free clusters + for (uint32_t n = 0;; n++, endCluster++) { + // can't find space checked all clusters + if (n >= clusterCount_) return false; + + // past end - start from beginning of FAT + if (endCluster > fatEnd) { + bgnCluster = endCluster = 2; + } + uint32_t f; + if (!fatGet(endCluster, &f)) return false; + + if (f != 0) { + // cluster in use try next cluster as bgnCluster + bgnCluster = endCluster + 1; + } + else if ((endCluster - bgnCluster + 1) == count) { + // done - found space + break; + } + } + // mark end of chain + if (!fatPutEOC(endCluster)) return false; + + // link clusters + while (endCluster > bgnCluster) { + if (!fatPut(endCluster - 1, endCluster)) return false; + endCluster--; + } + if (*curCluster != 0) { + // connect chains + if (!fatPut(*curCluster, bgnCluster)) return false; + } + // return first cluster number to caller + *curCluster = bgnCluster; + + // remember possible next free cluster + if (setStart) allocSearchStart_ = bgnCluster + 1; + + return true; +} + +bool SdVolume::cacheFlush() { + #if DISABLED(SDCARD_READONLY) + if (cacheDirty_) { + if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) + return false; + + // mirror FAT tables + if (cacheMirrorBlock_) { + if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) + return false; + cacheMirrorBlock_ = 0; + } + cacheDirty_ = 0; + } + #endif + return true; +} + +bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { + if (cacheBlockNumber_ != blockNumber) { + if (!cacheFlush()) return false; + if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) return false; + cacheBlockNumber_ = blockNumber; + } + if (dirty) cacheDirty_ = true; + return true; +} + +// return the size in bytes of a cluster chain +bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { + uint32_t s = 0; + do { + if (!fatGet(cluster, &cluster)) return false; + s += 512UL << clusterSizeShift_; + } while (!isEOC(cluster)); + *size = s; + return true; +} + +// Fetch a FAT entry +bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { + uint32_t lba; + if (cluster > (clusterCount_ + 1)) return false; + if (FAT12_SUPPORT && fatType_ == 12) { + uint16_t index = cluster; + index += index >> 1; + lba = fatStartBlock_ + (index >> 9); + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return false; + index &= 0x1FF; + uint16_t tmp = cacheBuffer_.data[index]; + index++; + if (index == 512) { + if (!cacheRawBlock(lba + 1, CACHE_FOR_READ)) return false; + index = 0; + } + tmp |= cacheBuffer_.data[index] << 8; + *value = cluster & 1 ? tmp >> 4 : tmp & 0xFFF; + return true; + } + + if (fatType_ == 16) + lba = fatStartBlock_ + (cluster >> 8); + else if (fatType_ == 32) + lba = fatStartBlock_ + (cluster >> 7); + else + return false; + + if (lba != cacheBlockNumber_ && !cacheRawBlock(lba, CACHE_FOR_READ)) + return false; + + *value = (fatType_ == 16) ? cacheBuffer_.fat16[cluster & 0xFF] : (cacheBuffer_.fat32[cluster & 0x7F] & FAT32MASK); + return true; +} + +// Store a FAT entry +bool SdVolume::fatPut(uint32_t cluster, uint32_t value) { + if (ENABLED(SDCARD_READONLY)) return false; + + uint32_t lba; + // error if reserved cluster + if (cluster < 2) return false; + + // error if not in FAT + if (cluster > (clusterCount_ + 1)) return false; + + if (FAT12_SUPPORT && fatType_ == 12) { + uint16_t index = cluster; + index += index >> 1; + lba = fatStartBlock_ + (index >> 9); + if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) return false; + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + index &= 0x1FF; + uint8_t tmp = value; + if (cluster & 1) { + tmp = (cacheBuffer_.data[index] & 0xF) | tmp << 4; + } + cacheBuffer_.data[index] = tmp; + index++; + if (index == 512) { + lba++; + index = 0; + if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) return false; + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + } + tmp = value >> 4; + if (!(cluster & 1)) { + tmp = ((cacheBuffer_.data[index] & 0xF0)) | tmp >> 4; + } + cacheBuffer_.data[index] = tmp; + return true; + } + + if (fatType_ == 16) + lba = fatStartBlock_ + (cluster >> 8); + else if (fatType_ == 32) + lba = fatStartBlock_ + (cluster >> 7); + else + return false; + + if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) return false; + + // store entry + if (fatType_ == 16) + cacheBuffer_.fat16[cluster & 0xFF] = value; + else + cacheBuffer_.fat32[cluster & 0x7F] = value; + + // mirror second FAT + if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_; + return true; +} + +// free a cluster chain +bool SdVolume::freeChain(uint32_t cluster) { + // clear free cluster location + allocSearchStart_ = 2; + + do { + uint32_t next; + if (!fatGet(cluster, &next)) return false; + + // free cluster + if (!fatPut(cluster, 0)) return false; + + cluster = next; + } while (!isEOC(cluster)); + + return true; +} + +/** Volume free space in clusters. + * + * \return Count of free clusters for success or -1 if an error occurs. + */ +int32_t SdVolume::freeClusterCount() { + uint32_t free = 0; + uint16_t n; + uint32_t todo = clusterCount_ + 2; + + if (fatType_ == 16) + n = 256; + else if (fatType_ == 32) + n = 128; + else // put FAT12 here + return -1; + + for (uint32_t lba = fatStartBlock_; todo; todo -= n, lba++) { + if (!cacheRawBlock(lba, CACHE_FOR_READ)) return -1; + NOMORE(n, todo); + if (fatType_ == 16) { + for (uint16_t i = 0; i < n; i++) + if (cacheBuffer_.fat16[i] == 0) free++; + } + else { + for (uint16_t i = 0; i < n; i++) + if (cacheBuffer_.fat32[i] == 0) free++; + } + #ifdef ESP32 + // Needed to reset the idle task watchdog timer on ESP32 as reading the complete FAT may easily + // block for 10+ seconds. yield() is insufficient since it blocks lower prio tasks (e.g., idle). + static millis_t nextTaskTime = 0; + const millis_t ms = millis(); + if (ELAPSED(ms, nextTaskTime)) { + vTaskDelay(1); // delay 1 tick (Minimum. Usually 10 or 1 ms depending on skdconfig.h) + nextTaskTime = ms + 1000; // tickle the task manager again in 1 second + } + #endif // ESP32 + } + return free; +} + +/** Initialize a FAT volume. + * + * \param[in] dev The SD card where the volume is located. + * + * \param[in] part The partition to be used. Legal values for \a part are + * 1-4 to use the corresponding partition on a device formatted with + * a MBR, Master Boot Record, or zero if the device is formatted as + * a super floppy with the FAT boot sector in block zero. + * + * \return true for success, false for failure. + * Reasons for failure include not finding a valid partition, not finding a valid + * FAT file system in the specified partition or an I/O error. + */ +bool SdVolume::init(Sd2Card* dev, uint8_t part) { + uint32_t totalBlocks, volumeStartBlock = 0; + fat32_boot_t* fbs; + + sdCard_ = dev; + fatType_ = 0; + allocSearchStart_ = 2; + cacheDirty_ = 0; // cacheFlush() will write block if true + cacheMirrorBlock_ = 0; + cacheBlockNumber_ = 0xFFFFFFFF; + + // if part == 0 assume super floppy with FAT boot sector in block zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4) return false; + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + part_t* p = &cacheBuffer_.mbr.part[part - 1]; + if ((p->boot & 0x7F) != 0 || p->totalSectors < 100 || p->firstSector == 0) + return false; // not a valid partition + volumeStartBlock = p->firstSector; + } + if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; + fbs = &cacheBuffer_.fbs32; + if (fbs->bytesPerSector != 512 || + fbs->fatCount == 0 || + fbs->reservedSectorCount == 0 || + fbs->sectorsPerCluster == 0) { + // not valid FAT volume + return false; + } + fatCount_ = fbs->fatCount; + blocksPerCluster_ = fbs->sectorsPerCluster; + // determine shift that is same as multiply by blocksPerCluster_ + clusterSizeShift_ = 0; + while (blocksPerCluster_ != _BV(clusterSizeShift_)) { + // error if not power of 2 + if (clusterSizeShift_++ > 7) return false; + } + blocksPerFat_ = fbs->sectorsPerFat16 ? + fbs->sectorsPerFat16 : fbs->sectorsPerFat32; + + fatStartBlock_ = volumeStartBlock + fbs->reservedSectorCount; + + // count for FAT16 zero for FAT32 + rootDirEntryCount_ = fbs->rootDirEntryCount; + + // directory start for FAT16 dataStart for FAT32 + rootDirStart_ = fatStartBlock_ + fbs->fatCount * blocksPerFat_; + + // data start for FAT16 and FAT32 + dataStartBlock_ = rootDirStart_ + ((32 * fbs->rootDirEntryCount + 511) / 512); + + // total blocks for FAT16 or FAT32 + totalBlocks = fbs->totalSectors16 ? + fbs->totalSectors16 : fbs->totalSectors32; + + // total data blocks + clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock); + + // divide by cluster size to get cluster count + clusterCount_ >>= clusterSizeShift_; + + // FAT type is determined by cluster count + if (clusterCount_ < 4085) { + fatType_ = 12; + if (!FAT12_SUPPORT) return false; + } + else if (clusterCount_ < 65525) + fatType_ = 16; + else { + rootDirStart_ = fbs->fat32RootCluster; + fatType_ = 32; + } + return true; +} + +#endif // SDSUPPORT diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h new file mode 100644 index 00000000..1ffa8884 --- /dev/null +++ b/Marlin/src/sd/SdVolume.h @@ -0,0 +1,201 @@ +/** + * 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 + +/** + * \file + * \brief SdVolume class + */ + +/** + * Arduino SdFat Library + * Copyright (c) 2009 by William Greiman + * + * This file is part of the Arduino Sd2Card Library + */ + +#include + +#include "../inc/MarlinConfigPre.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #include "usb_flashdrive/Sd2Card_FlashDrive.h" +#elif ENABLED(SDIO_SUPPORT) + #include "Sd2Card_sdio.h" +#else + #include "Sd2Card.h" +#endif + +#include "SdFatConfig.h" +#include "SdFatStructs.h" + +//============================================================================== +// SdVolume class +/** + * \brief Cache for an SD data block + */ +union cache_t { + uint8_t data[512]; // Used to access cached file data blocks. + uint16_t fat16[256]; // Used to access cached FAT16 entries. + uint32_t fat32[128]; // Used to access cached FAT32 entries. + dir_t dir[16]; // Used to access cached directory entries. + mbr_t mbr; // Used to access a cached Master Boot Record. + fat_boot_t fbs; // Used to access to a cached FAT boot sector. + fat32_boot_t fbs32; // Used to access to a cached FAT32 boot sector. + fat32_fsinfo_t fsinfo; // Used to access to a cached FAT32 FSINFO sector. +}; + +/** + * \class SdVolume + * \brief Access FAT16 and FAT32 volumes on SD and SDHC cards. + */ +class SdVolume { + public: + // Create an instance of SdVolume + SdVolume() : fatType_(0) {} + /** + * Clear the cache and returns a pointer to the cache. Used by the WaveRP + * recorder to do raw write to the SD card. Not for normal apps. + * \return A pointer to the cache buffer or zero if an error occurs. + */ + cache_t* cacheClear() { + if (!cacheFlush()) return 0; + cacheBlockNumber_ = 0xFFFFFFFF; + return &cacheBuffer_; + } + + /** + * Initialize a FAT volume. Try partition one first then try super + * floppy format. + * + * \param[in] dev The Sd2Card where the volume is located. + * + * \return true for success, false for failure. + * Reasons for failure include not finding a valid partition, not finding + * a valid FAT file system or an I/O error. + */ + bool init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0); } + bool init(Sd2Card* dev, uint8_t part); + + // inline functions that return volume info + uint8_t blocksPerCluster() const { return blocksPerCluster_; } //> \return The volume's cluster size in blocks. + uint32_t blocksPerFat() const { return blocksPerFat_; } //> \return The number of blocks in one FAT. + uint32_t clusterCount() const { return clusterCount_; } //> \return The total number of clusters in the volume. + uint8_t clusterSizeShift() const { return clusterSizeShift_; } //> \return The shift count required to multiply by blocksPerCluster. + uint32_t dataStartBlock() const { return dataStartBlock_; } //> \return The logical block number for the start of file data. + uint8_t fatCount() const { return fatCount_; } //> \return The number of FAT structures on the volume. + uint32_t fatStartBlock() const { return fatStartBlock_; } //> \return The logical block number for the start of the first FAT. + uint8_t fatType() const { return fatType_; } //> \return The FAT type of the volume. Values are 12, 16 or 32. + int32_t freeClusterCount(); + uint32_t rootDirEntryCount() const { return rootDirEntryCount_; } /** \return The number of entries in the root directory for FAT16 volumes. */ + + /** + * \return The logical block number for the start of the root directory + * on FAT16 volumes or the first cluster number on FAT32 volumes. + */ + uint32_t rootDirStart() const { return rootDirStart_; } + + /** + * Sd2Card object for this volume + * \return pointer to Sd2Card object. + */ + Sd2Card* sdCard() { return sdCard_; } + + /** + * Debug access to FAT table + * + * \param[in] n cluster number. + * \param[out] v value of entry + * \return true for success or false for failure + */ + bool dbgFat(uint32_t n, uint32_t* v) { return fatGet(n, v); } + + private: + // Allow SdBaseFile access to SdVolume private data. + friend class SdBaseFile; + + // value for dirty argument in cacheRawBlock to indicate read from cache + static bool const CACHE_FOR_READ = false; + // value for dirty argument in cacheRawBlock to indicate write to cache + static bool const CACHE_FOR_WRITE = true; + + #if USE_MULTIPLE_CARDS + cache_t cacheBuffer_; // 512 byte cache for device blocks + uint32_t cacheBlockNumber_; // Logical number of block in the cache + Sd2Card* sdCard_; // Sd2Card object for cache + bool cacheDirty_; // cacheFlush() will write block if true + uint32_t cacheMirrorBlock_; // block number for mirror FAT + #else + static cache_t cacheBuffer_; // 512 byte cache for device blocks + static uint32_t cacheBlockNumber_; // Logical number of block in the cache + static Sd2Card* sdCard_; // Sd2Card object for cache + static bool cacheDirty_; // cacheFlush() will write block if true + static uint32_t cacheMirrorBlock_; // block number for mirror FAT + #endif + + uint32_t allocSearchStart_; // start cluster for alloc search + uint8_t blocksPerCluster_; // cluster size in blocks + uint32_t blocksPerFat_; // FAT size in blocks + uint32_t clusterCount_; // clusters in one FAT + uint8_t clusterSizeShift_; // shift to convert cluster count to block count + uint32_t dataStartBlock_; // first data block number + uint8_t fatCount_; // number of FATs on volume + uint32_t fatStartBlock_; // start block for first FAT + uint8_t fatType_; // volume type (12, 16, OR 32) + uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir + uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 + + bool allocContiguous(uint32_t count, uint32_t* curCluster); + uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1); } + uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_); } + uint32_t blockNumber(uint32_t cluster, uint32_t position) const { return clusterStartBlock(cluster) + blockOfCluster(position); } + + cache_t* cache() { return &cacheBuffer_; } + uint32_t cacheBlockNumber() const { return cacheBlockNumber_; } + + #if USE_MULTIPLE_CARDS + bool cacheFlush(); + bool cacheRawBlock(uint32_t blockNumber, bool dirty); + #else + static bool cacheFlush(); + static bool cacheRawBlock(uint32_t blockNumber, bool dirty); + #endif + + // used by SdBaseFile write to assign cache to SD location + void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) { + cacheDirty_ = dirty; + cacheBlockNumber_ = blockNumber; + } + void cacheSetDirty() { cacheDirty_ |= CACHE_FOR_WRITE; } + bool chainSize(uint32_t beginCluster, uint32_t* size); + bool fatGet(uint32_t cluster, uint32_t* value); + bool fatPut(uint32_t cluster, uint32_t value); + bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); } + bool freeChain(uint32_t cluster); + bool isEOC(uint32_t cluster) const { + if (FAT12_SUPPORT && fatType_ == 12) return cluster >= FAT12EOC_MIN; + if (fatType_ == 16) return cluster >= FAT16EOC_MIN; + return cluster >= FAT32EOC_MIN; + } + bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst); } + bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); } +}; diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp new file mode 100644 index 00000000..e154ea9f --- /dev/null +++ b/Marlin/src/sd/cardreader.cpp @@ -0,0 +1,1224 @@ +/** + * 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(SDSUPPORT) + +//#define DEBUG_CARDREADER + +#include "cardreader.h" + +#include "../MarlinCore.h" +#include "../lcd/ultralcd.h" + +#if ENABLED(DWIN_CREALITY_LCD) + #include "../lcd/dwin/e3v2/dwin.h" +#endif + +#include "../module/planner.h" // for synchronize +#include "../module/printcounter.h" +#include "../gcode/queue.h" +#include "../module/settings.h" +#include "../module/stepper/indirection.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../feature/e_parser.h" +#endif + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../feature/powerloss.h" +#endif + +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #include "../feature/pause.h" +#endif + +#define DEBUG_OUT EITHER(DEBUG_CARDREADER, MARLIN_DEV_MODE) +#include "../core/debug_out.h" +#include "../libs/hex_print.h" + +// public: + +card_flags_t CardReader::flag; +char CardReader::filename[FILENAME_LENGTH], CardReader::longFilename[LONG_FILENAME_LENGTH]; +int8_t CardReader::autostart_index; + +#if BOTH(HAS_MULTI_SERIAL, BINARY_FILE_TRANSFER) + int8_t CardReader::transfer_port_index; +#endif + +// private: + +SdFile CardReader::root, CardReader::workDir, CardReader::workDirParents[MAX_DIR_DEPTH]; +uint8_t CardReader::workDirDepth; + +#if ENABLED(SDCARD_SORT_ALPHA) + + uint16_t CardReader::sort_count; + #if ENABLED(SDSORT_GCODE) + bool CardReader::sort_alpha; + int CardReader::sort_folders; + //bool CardReader::sort_reverse; + #endif + + #if ENABLED(SDSORT_DYNAMIC_RAM) + uint8_t *CardReader::sort_order; + #else + uint8_t CardReader::sort_order[SDSORT_LIMIT]; + #endif + + #if ENABLED(SDSORT_USES_RAM) + + #if ENABLED(SDSORT_CACHE_NAMES) + uint16_t CardReader::nrFiles; // Cached total file count + #if ENABLED(SDSORT_DYNAMIC_RAM) + char **CardReader::sortshort, **CardReader::sortnames; + #else + char CardReader::sortshort[SDSORT_LIMIT][FILENAME_LENGTH]; + char CardReader::sortnames[SDSORT_LIMIT][SORTED_LONGNAME_STORAGE]; + #endif + #elif DISABLED(SDSORT_USES_STACK) + char CardReader::sortnames[SDSORT_LIMIT][SORTED_LONGNAME_STORAGE]; + #endif + + #if HAS_FOLDER_SORTING + #if ENABLED(SDSORT_DYNAMIC_RAM) + uint8_t *CardReader::isDir; + #elif ENABLED(SDSORT_CACHE_NAMES) || DISABLED(SDSORT_USES_STACK) + uint8_t CardReader::isDir[(SDSORT_LIMIT+7)>>3]; + #endif + #define IS_DIR(n) TEST(isDir[(n) >> 3], (n) & 0x07) + #endif + + #endif // SDSORT_USES_RAM + +#endif // SDCARD_SORT_ALPHA + +Sd2Card CardReader::sd2card; +SdVolume CardReader::volume; +SdFile CardReader::file; + +uint8_t CardReader::file_subcall_ctr; +uint32_t CardReader::filespos[SD_PROCEDURE_DEPTH]; +char CardReader::proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; + +uint32_t CardReader::filesize, CardReader::sdpos; + +CardReader::CardReader() { + #if ENABLED(SDCARD_SORT_ALPHA) + sort_count = 0; + #if ENABLED(SDSORT_GCODE) + sort_alpha = true; + sort_folders = FOLDER_SORTING; + //sort_reverse = false; + #endif + #endif + flag.sdprinting = flag.mounted = flag.saving = flag.logging = false; + filesize = sdpos = 0; + file_subcall_ctr = 0; + + workDirDepth = 0; + ZERO(workDirParents); + + // 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 +} + +// +// Get a DOS 8.3 filename in its useful form +// +char *createFilename(char * const buffer, const dir_t &p) { + char *pos = buffer; + LOOP_L_N(i, 11) { + if (p.name[i] == ' ') continue; + if (i == 8) *pos++ = '.'; + *pos++ = p.name[i]; + } + *pos++ = 0; + return buffer; +} + +// +// Return 'true' if the item is a folder or G-code file +// +bool CardReader::is_dir_or_gcode(const dir_t &p) { + //uint8_t pn0 = p.name[0]; + + if ( (p.attributes & DIR_ATT_HIDDEN) // Hidden by attribute + // When readDir() > 0 these must be false: + //|| pn0 == DIR_NAME_FREE || pn0 == DIR_NAME_DELETED // Clear or Deleted entry + //|| pn0 == '.' || longFilename[0] == '.' // Hidden file + //|| !DIR_IS_FILE_OR_SUBDIR(&p) // Not a File or Directory + ) return false; + + flag.filenameIsDir = DIR_IS_SUBDIR(&p); // We know it's a File or Folder + + return ( + flag.filenameIsDir // All Directories are ok + || (p.name[8] == 'G' && p.name[9] != '~') // Non-backup *.G* files are accepted + ); +} + +// +// Get the number of (compliant) items in the folder +// +int CardReader::countItems(SdFile dir) { + dir_t p; + int c = 0; + while (dir.readDir(&p, longFilename) > 0) + c += is_dir_or_gcode(p); + + #if ALL(SDCARD_SORT_ALPHA, SDSORT_USES_RAM, SDSORT_CACHE_NAMES) + nrFiles = c; + #endif + + return c; +} + +// +// Get file/folder info for an item by index +// +void CardReader::selectByIndex(SdFile dir, const uint8_t index) { + dir_t p; + for (uint8_t cnt = 0; dir.readDir(&p, longFilename) > 0;) { + if (is_dir_or_gcode(p)) { + if (cnt == index) { + createFilename(filename, p); + return; // 0 based index + } + cnt++; + } + } +} + +// +// Get file/folder info for an item by name +// +void CardReader::selectByName(SdFile dir, const char * const match) { + dir_t p; + for (uint8_t cnt = 0; dir.readDir(&p, longFilename) > 0; cnt++) { + if (is_dir_or_gcode(p)) { + createFilename(filename, p); + if (strcasecmp(match, filename) == 0) return; + } + } +} + +// +// Recursive method to list all files within a folder +// +void CardReader::printListing(SdFile parent, const char * const prepend/*=nullptr*/) { + dir_t p; + while (parent.readDir(&p, longFilename) > 0) { + if (DIR_IS_SUBDIR(&p)) { + + // Get the short name for the item, which we know is a folder + char dosFilename[FILENAME_LENGTH]; + createFilename(dosFilename, p); + + // Allocate enough stack space for the full path to a folder, trailing slash, and nul + const bool prepend_is_empty = (!prepend || prepend[0] == '\0'); + const int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(dosFilename) + 1 + 1; + char path[len]; + + // Append the FOLDERNAME12/ to the passed string. + // It contains the full path to the "parent" argument. + // We now have the full path to the item in this folder. + strcpy(path, prepend_is_empty ? "/" : prepend); // root slash if prepend is empty + strcat(path, dosFilename); // FILENAME_LENGTH characters maximum + strcat(path, "/"); // 1 character + + // Serial.print(path); + + // Get a new directory object using the full path + // and dive recursively into it. + SdFile child; + if (!child.open(&parent, dosFilename, O_READ)) { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_SD_CANT_OPEN_SUBDIR, dosFilename); + } + printListing(child, path); + // close() is done automatically by destructor of SdFile + } + else if (is_dir_or_gcode(p)) { + createFilename(filename, p); + if (prepend) SERIAL_ECHO(prepend); + SERIAL_ECHO(filename); + SERIAL_CHAR(' '); + SERIAL_ECHOLN(p.fileSize); + } + } +} + +// +// List all files on the SD card +// +void CardReader::ls() { + if (flag.mounted) { + root.rewind(); + printListing(root); + } +} + +#if ENABLED(LONG_FILENAME_HOST_SUPPORT) + + // + // Get a long pretty path based on a DOS 8.3 path + // + void CardReader::printLongPath(char * const path) { + + int i, pathLen = strlen(path); + + // SERIAL_ECHOPGM("Full Path: "); SERIAL_ECHOLN(path); + + // Zero out slashes to make segments + for (i = 0; i < pathLen; i++) if (path[i] == '/') path[i] = '\0'; + + SdFile diveDir = root; // start from the root for segment 1 + for (i = 0; i < pathLen;) { + + if (path[i] == '\0') i++; // move past a single nul + + char *segment = &path[i]; // The segment after most slashes + + // If a segment is empty (extra-slash) then exit + if (!*segment) break; + + // Go to the next segment + while (path[++i]) { } + + // SERIAL_ECHOPGM("Looking for segment: "); SERIAL_ECHOLN(segment); + + // Find the item, setting the long filename + diveDir.rewind(); + selectByName(diveDir, segment); + + // Print /LongNamePart to serial output + SERIAL_CHAR('/'); + SERIAL_ECHO(longFilename[0] ? longFilename : "???"); + + // If the filename was printed then that's it + if (!flag.filenameIsDir) break; + + // SERIAL_ECHOPGM("Opening dir: "); SERIAL_ECHOLN(segment); + + // Open the sub-item as the new dive parent + SdFile dir; + if (!dir.open(&diveDir, segment, O_READ)) { + SERIAL_EOL(); + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(STR_SD_CANT_OPEN_SUBDIR, segment); + break; + } + + diveDir.close(); + diveDir = dir; + + } // while i SD_PROCEDURE_DEPTH - 1) { + SERIAL_ERROR_MSG("Exceeded max SUBROUTINE depth:" STRINGIFY(SD_PROCEDURE_DEPTH)); + kill(GET_TEXT(MSG_KILL_SUBCALL_OVERFLOW)); + return; + } + + // Store current filename (based on workDirParents) and position + getAbsFilename(proc_filenames[file_subcall_ctr]); + filespos[file_subcall_ctr] = sdpos; + + // For sub-procedures say 'SUBROUTINE CALL target: "..." parent: "..." pos12345' + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR("SUBROUTINE CALL target:\"", path, "\" parent:\"", proc_filenames[file_subcall_ctr], "\" pos", sdpos); + file_subcall_ctr++; + break; + + case 2: // Resuming previous file after sub-procedure + SERIAL_ECHO_MSG("END SUBROUTINE"); + break; + } + + endFilePrint(); + + SdFile *diveDir; + const char * const fname = diveToFile(true, diveDir, path); + if (!fname) return; + + if (file.open(diveDir, fname, O_READ)) { + filesize = file.fileSize(); + sdpos = 0; + + PORT_REDIRECT(SERIAL_BOTH); + SERIAL_ECHOLNPAIR(STR_SD_FILE_OPENED, fname, STR_SD_SIZE, filesize); + SERIAL_ECHOLNPGM(STR_SD_FILE_SELECTED); + PORT_RESTORE(); + + selectFileByName(fname); + ui.set_status(longFilename[0] ? longFilename : fname); + } + else + openFailed(fname); +} + +inline void echo_write_to_file(const char * const fname) { + SERIAL_ECHOLNPAIR(STR_SD_WRITE_TO_FILE, fname); +} + +// +// Open a file by DOS path for write +// +void CardReader::openFileWrite(char * const path) { + if (!isMounted()) return; + + announceOpen(2, path); + file_subcall_ctr = 0; + + endFilePrint(); + + SdFile *diveDir; + const char * const fname = diveToFile(false, diveDir, path); + if (!fname) return; + + #if ENABLED(SDCARD_READONLY) + openFailed(fname); + #else + if (file.open(diveDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { + flag.saving = true; + selectFileByName(fname); + TERN_(EMERGENCY_PARSER, emergency_parser.disable()); + echo_write_to_file(fname); + ui.set_status(fname); + } + else + openFailed(fname); + #endif +} + +// +// Check if a file exists by absolute or workDir-relative path +// If the file exists, the long name can also be fetched. +// +bool CardReader::fileExists(const char * const path) { + if (!isMounted()) return false; + SdFile *diveDir = nullptr; + const char * const fname = diveToFile(false, diveDir, path); + if (fname) { + diveDir->rewind(); + selectByName(*diveDir, fname); + diveDir->close(); + } + return fname != nullptr; +} + +// +// Delete a file by name in the working directory +// +void CardReader::removeFile(const char * const name) { + if (!isMounted()) return; + + //endFilePrint(); + + SdFile *curDir; + const char * const fname = diveToFile(false, curDir, name); + if (!fname) return; + + #if ENABLED(SDCARD_READONLY) + SERIAL_ECHOLNPAIR("Deletion failed (read-only), File: ", fname, "."); + #else + if (file.remove(curDir, fname)) { + SERIAL_ECHOLNPAIR("File deleted:", fname); + sdpos = 0; + TERN_(SDCARD_SORT_ALPHA, presort()); + } + else + SERIAL_ECHOLNPAIR("Deletion failed, File: ", fname, "."); + #endif +} + +void CardReader::report_status() { + if (isPrinting()) { + SERIAL_ECHOPGM(STR_SD_PRINTING_BYTE); + SERIAL_ECHO(sdpos); + SERIAL_CHAR('/'); + SERIAL_ECHOLN(filesize); + } + else + SERIAL_ECHOLNPGM(STR_SD_NOT_PRINTING); +} + +void CardReader::write_command(char * const buf) { + char* begin = buf; + char* npos = nullptr; + char* end = buf + strlen(buf) - 1; + + file.writeError = false; + if ((npos = strchr(buf, 'N')) != nullptr) { + begin = strchr(npos, ' ') + 1; + end = strchr(npos, '*') - 1; + } + end[1] = '\r'; + end[2] = '\n'; + end[3] = '\0'; + file.write(begin); + + if (file.writeError) SERIAL_ERROR_MSG(STR_SD_ERR_WRITE_TO_FILE); +} + +// +// Run the next autostart file. Called: +// - On boot after successful card init +// - After finishing the previous autostart file +// - From the LCD command to run the autostart file +// + +void CardReader::checkautostart() { + + if (autostart_index < 0 || flag.sdprinting) return; + + if (!isMounted()) mount(); + TERN_(SDCARD_EEPROM_EMULATION, else settings.first_load()); + + // Don't run auto#.g when a PLR file exists + if (isMounted() && TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) { + char autoname[8]; + sprintf_P(autoname, PSTR("auto%c.g"), autostart_index + '0'); + dir_t p; + root.rewind(); + while (root.readDir(&p, nullptr) > 0) { + for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); + if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { + openAndPrintFile(autoname); + autostart_index++; + return; + } + } + } + autostart_index = -1; +} + +void CardReader::beginautostart() { + autostart_index = 0; + cdroot(); +} + +void CardReader::closefile(const bool store_location/*=false*/) { + file.sync(); + file.close(); + flag.saving = flag.logging = false; + sdpos = 0; + TERN_(EMERGENCY_PARSER, emergency_parser.enable()); + + if (store_location) { + //future: store printer state, filename and position for continuing a stopped print + // so one can unplug the printer and continue printing the next day. + } +} + +// +// Get info for a file in the working directory by index +// +void CardReader::selectFileByIndex(const uint16_t nr) { + #if ENABLED(SDSORT_CACHE_NAMES) + if (nr < sort_count) { + strcpy(filename, sortshort[nr]); + strcpy(longFilename, sortnames[nr]); + flag.filenameIsDir = IS_DIR(nr); + return; + } + #endif + workDir.rewind(); + selectByIndex(workDir, nr); +} + +// +// Get info for a file in the working directory by DOS name +// +void CardReader::selectFileByName(const char * const match) { + #if ENABLED(SDSORT_CACHE_NAMES) + for (uint16_t nr = 0; nr < sort_count; nr++) + if (strcasecmp(match, sortshort[nr]) == 0) { + strcpy(filename, sortshort[nr]); + strcpy(longFilename, sortnames[nr]); + flag.filenameIsDir = IS_DIR(nr); + return; + } + #endif + workDir.rewind(); + selectByName(workDir, match); +} + +uint16_t CardReader::countFilesInWorkDir() { + workDir.rewind(); + return countItems(workDir); +} + +/** + * Dive to the given DOS 8.3 file path, with optional echo of the dive paths. + * + * On exit: + * - Your curDir pointer contains an SdFile reference to the file's directory. + * - If update_cwd was 'true' the workDir now points to the file's directory. + * + * Returns a pointer to the last segment (filename) of the given DOS 8.3 path. + * + * A nullptr result indicates an unrecoverable error. + */ +const char* CardReader::diveToFile(const bool update_cwd, SdFile*& diveDir, const char * const path, const bool echo/*=false*/) { + // Track both parent and subfolder + static SdFile newDir1, newDir2; + SdFile *sub = &newDir1, *startDir; + + // Parsing the path string + const char *item_name_adr = path; + + DEBUG_ECHOLNPAIR("diveToFile: path = '", path, "'"); + + if (path[0] == '/') { // Starting at the root directory? + diveDir = &root; + item_name_adr++; + DEBUG_ECHOLNPAIR("diveToFile: CWD to root: ", hex_address((void*)diveDir)); + if (update_cwd) workDirDepth = 0; // The cwd can be updated for the benefit of sub-programs + } + else + diveDir = &workDir; // Dive from workDir (as set by the UI) + + startDir = diveDir; + + DEBUG_ECHOLNPAIR("diveToFile: startDir = ", hex_address((void*)startDir)); + + while (item_name_adr) { + // Find next subdirectory delimiter + char * const name_end = strchr(item_name_adr, '/'); + + // Last atom in the path? Item found. + if (name_end <= item_name_adr) break; + + // Set subDirName + const uint8_t len = name_end - item_name_adr; + char dosSubdirname[len + 1]; + strncpy(dosSubdirname, item_name_adr, len); + dosSubdirname[len] = 0; + + if (echo) SERIAL_ECHOLN(dosSubdirname); + + DEBUG_ECHOLNPAIR("diveToFile: sub = ", hex_address((void*)sub)); + + // Open diveDir (closing first) + sub->close(); + if (!sub->open(diveDir, dosSubdirname, O_READ)) { + openFailed(dosSubdirname); + item_name_adr = nullptr; + break; + } + + // Close diveDir if not at starting-point + if (diveDir != startDir) { + DEBUG_ECHOLNPAIR("diveToFile: closing diveDir: ", hex_address((void*)diveDir)); + diveDir->close(); + } + + // diveDir now subDir + diveDir = sub; + DEBUG_ECHOLNPAIR("diveToFile: diveDir = sub: ", hex_address((void*)diveDir)); + + // Update workDirParents and workDirDepth + if (update_cwd) { + DEBUG_ECHOLNPAIR("diveToFile: update_cwd"); + if (workDirDepth < MAX_DIR_DEPTH) + workDirParents[workDirDepth++] = *diveDir; + } + + // Point sub at the other scratch object + sub = (diveDir != &newDir1) ? &newDir1 : &newDir2; + DEBUG_ECHOLNPAIR("diveToFile: swapping sub = ", hex_address((void*)sub)); + + // Next path atom address + item_name_adr = name_end + 1; + } + + if (update_cwd) { + workDir = *diveDir; + DEBUG_ECHOLNPAIR("diveToFile: final workDir = ", hex_address((void*)diveDir)); + flag.workDirIsRoot = (workDirDepth == 0); + TERN_(SDCARD_SORT_ALPHA, presort()); + } + + return item_name_adr; +} + +void CardReader::cd(const char * relpath) { + SdFile newDir; + SdFile *parent = workDir.isOpen() ? &workDir : &root; + + if (newDir.open(parent, relpath, O_READ)) { + workDir = newDir; + flag.workDirIsRoot = false; + if (workDirDepth < MAX_DIR_DEPTH) + workDirParents[workDirDepth++] = workDir; + TERN_(SDCARD_SORT_ALPHA, presort()); + } + else { + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(STR_SD_CANT_ENTER_SUBDIR, relpath); + } +} + +int8_t CardReader::cdup() { + if (workDirDepth > 0) { // At least 1 dir has been saved + workDir = --workDirDepth ? workDirParents[workDirDepth - 1] : root; // Use parent, or root if none + TERN_(SDCARD_SORT_ALPHA, presort()); + } + if (!workDirDepth) flag.workDirIsRoot = true; + return workDirDepth; +} + +void CardReader::cdroot() { + workDir = root; + flag.workDirIsRoot = true; + TERN_(SDCARD_SORT_ALPHA, presort()); +} + +#if ENABLED(SDCARD_SORT_ALPHA) + + /** + * Get the name of a file in the working directory by sort-index + */ + void CardReader::getfilename_sorted(const uint16_t nr) { + selectFileByIndex(TERN1(SDSORT_GCODE, sort_alpha) && (nr < sort_count) + ? sort_order[nr] : nr); + } + + #if ENABLED(SDSORT_USES_RAM) + #if ENABLED(SDSORT_DYNAMIC_RAM) + // Use dynamic method to copy long filename + #define SET_SORTNAME(I) (sortnames[I] = strdup(longest_filename())) + #if ENABLED(SDSORT_CACHE_NAMES) + // When caching also store the short name, since + // we're replacing the selectFileByIndex() behavior. + #define SET_SORTSHORT(I) (sortshort[I] = strdup(filename)) + #else + #define SET_SORTSHORT(I) NOOP + #endif + #else + // Copy filenames into the static array + #define _SET_SORTNAME(I) strncpy(sortnames[I], longest_filename(), SORTED_LONGNAME_MAXLEN) + #if SORTED_LONGNAME_MAXLEN == LONG_FILENAME_LENGTH + // Short name sorting always use LONG_FILENAME_LENGTH with no trailing nul + #define SET_SORTNAME(I) _SET_SORTNAME(I) + #else + // Copy multiple name blocks. Add a nul for the longest case. + #define SET_SORTNAME(I) do{ _SET_SORTNAME(I); sortnames[I][SORTED_LONGNAME_MAXLEN] = '\0'; }while(0) + #endif + #if ENABLED(SDSORT_CACHE_NAMES) + #define SET_SORTSHORT(I) strcpy(sortshort[I], filename) + #else + #define SET_SORTSHORT(I) NOOP + #endif + #endif + #endif + + /** + * Read all the files and produce a sort key + * + * We can do this in 3 ways... + * - Minimal RAM: Read two filenames at a time sorting along... + * - Some RAM: Buffer the directory just for this sort + * - Most RAM: Buffer the directory and return filenames from RAM + */ + void CardReader::presort() { + + // Throw away old sort index + flush_presort(); + + // Sorting may be turned off + if (TERN0(SDSORT_GCODE, !sort_alpha)) return; + + // If there are files, sort up to the limit + uint16_t fileCnt = countFilesInWorkDir(); + if (fileCnt > 0) { + + // Never sort more than the max allowed + // If you use folders to organize, 20 may be enough + NOMORE(fileCnt, uint16_t(SDSORT_LIMIT)); + + // Sort order is always needed. May be static or dynamic. + TERN_(SDSORT_DYNAMIC_RAM, sort_order = new uint8_t[fileCnt]); + + // Use RAM to store the entire directory during pre-sort. + // SDSORT_LIMIT should be set to prevent over-allocation. + #if ENABLED(SDSORT_USES_RAM) + + // If using dynamic ram for names, allocate on the heap. + #if ENABLED(SDSORT_CACHE_NAMES) + #if ENABLED(SDSORT_DYNAMIC_RAM) + sortshort = new char*[fileCnt]; + sortnames = new char*[fileCnt]; + #endif + #elif ENABLED(SDSORT_USES_STACK) + char sortnames[fileCnt][SORTED_LONGNAME_STORAGE]; + #endif + + // Folder sorting needs 1 bit per entry for flags. + #if HAS_FOLDER_SORTING + #if ENABLED(SDSORT_DYNAMIC_RAM) + isDir = new uint8_t[(fileCnt + 7) >> 3]; + #elif ENABLED(SDSORT_USES_STACK) + uint8_t isDir[(fileCnt + 7) >> 3]; + #endif + #endif + + #else // !SDSORT_USES_RAM + + // By default re-read the names from SD for every compare + // retaining only two filenames at a time. This is very + // slow but is safest and uses minimal RAM. + char name1[LONG_FILENAME_LENGTH]; + + #endif + + if (fileCnt > 1) { + + // Init sort order. + for (uint16_t i = 0; i < fileCnt; i++) { + sort_order[i] = i; + // If using RAM then read all filenames now. + #if ENABLED(SDSORT_USES_RAM) + selectFileByIndex(i); + SET_SORTNAME(i); + SET_SORTSHORT(i); + // char out[30]; + // sprintf_P(out, PSTR("---- %i %s %s"), i, flag.filenameIsDir ? "D" : " ", sortnames[i]); + // SERIAL_ECHOLN(out); + #if HAS_FOLDER_SORTING + const uint16_t bit = i & 0x07, ind = i >> 3; + if (bit == 0) isDir[ind] = 0x00; + if (flag.filenameIsDir) SBI(isDir[ind], bit); + #endif + #endif + } + + // Bubble Sort + for (uint16_t i = fileCnt; --i;) { + bool didSwap = false; + uint8_t o1 = sort_order[0]; + #if DISABLED(SDSORT_USES_RAM) + selectFileByIndex(o1); // Pre-fetch the first entry and save it + strcpy(name1, longest_filename()); // so the loop only needs one fetch + TERN_(HAS_FOLDER_SORTING, bool dir1 = flag.filenameIsDir); + #endif + + for (uint16_t j = 0; j < i; ++j) { + const uint16_t o2 = sort_order[j + 1]; + + // Compare names from the array or just the two buffered names + #if ENABLED(SDSORT_USES_RAM) + #define _SORT_CMP_NODIR() (strcasecmp(sortnames[o1], sortnames[o2]) > 0) + #else + #define _SORT_CMP_NODIR() (strcasecmp(name1, name2) > 0) + #endif + + #if HAS_FOLDER_SORTING + #if ENABLED(SDSORT_USES_RAM) + // Folder sorting needs an index and bit to test for folder-ness. + #define _SORT_CMP_DIR(fs) (IS_DIR(o1) == IS_DIR(o2) ? _SORT_CMP_NODIR() : IS_DIR(fs > 0 ? o1 : o2)) + #else + #define _SORT_CMP_DIR(fs) ((dir1 == flag.filenameIsDir) ? _SORT_CMP_NODIR() : (fs > 0 ? dir1 : !dir1)) + #endif + #endif + + // The most economical method reads names as-needed + // throughout the loop. Slow if there are many. + #if DISABLED(SDSORT_USES_RAM) + selectFileByIndex(o2); + const bool dir2 = flag.filenameIsDir; + char * const name2 = longest_filename(); // use the string in-place + #endif // !SDSORT_USES_RAM + + // Sort the current pair according to settings. + if ( + #if HAS_FOLDER_SORTING + #if ENABLED(SDSORT_GCODE) + sort_folders ? _SORT_CMP_DIR(sort_folders) : _SORT_CMP_NODIR() + #else + _SORT_CMP_DIR(FOLDER_SORTING) + #endif + #else + _SORT_CMP_NODIR() + #endif + ) { + // Reorder the index, indicate that sorting happened + // Note that the next o1 will be the current o1. No new fetch needed. + sort_order[j] = o2; + sort_order[j + 1] = o1; + didSwap = true; + } + else { + // The next o1 is the current o2. No new fetch needed. + o1 = o2; + #if DISABLED(SDSORT_USES_RAM) + TERN_(HAS_FOLDER_SORTING, dir1 = dir2); + strcpy(name1, name2); + #endif + } + } + if (!didSwap) break; + } + // Using RAM but not keeping names around + #if ENABLED(SDSORT_USES_RAM) && DISABLED(SDSORT_CACHE_NAMES) + #if ENABLED(SDSORT_DYNAMIC_RAM) + for (uint16_t i = 0; i < fileCnt; ++i) free(sortnames[i]); + TERN_(HAS_FOLDER_SORTING, free(isDir)); + #endif + #endif + } + else { + sort_order[0] = 0; + #if BOTH(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) + #if ENABLED(SDSORT_DYNAMIC_RAM) + sortnames = new char*[1]; + sortshort = new char*[1]; + isDir = new uint8_t[1]; + #endif + selectFileByIndex(0); + SET_SORTNAME(0); + SET_SORTSHORT(0); + isDir[0] = flag.filenameIsDir; + #endif + } + + sort_count = fileCnt; + } + } + + void CardReader::flush_presort() { + if (sort_count > 0) { + #if ENABLED(SDSORT_DYNAMIC_RAM) + delete sort_order; + #if ENABLED(SDSORT_CACHE_NAMES) + LOOP_L_N(i, sort_count) { + free(sortshort[i]); // strdup + free(sortnames[i]); // strdup + } + delete sortshort; + delete sortnames; + #endif + #endif + sort_count = 0; + } + } + +#endif // SDCARD_SORT_ALPHA + +uint16_t CardReader::get_num_Files() { + if (!isMounted()) return 0; + return ( + #if ALL(SDCARD_SORT_ALPHA, SDSORT_USES_RAM, SDSORT_CACHE_NAMES) + nrFiles // no need to access the SD card for filenames + #else + countFilesInWorkDir() + #endif + ); +} + +// +// Return from procedure or close out the Print Job +// +void CardReader::fileHasFinished() { + planner.synchronize(); + file.close(); + if (file_subcall_ctr > 0) { // Resume calling file after closing procedure + file_subcall_ctr--; + openFileRead(proc_filenames[file_subcall_ctr], 2); // 2 = Returning from sub-procedure + setIndex(filespos[file_subcall_ctr]); + startFileprint(); + } + else { + endFilePrint(TERN_(SD_RESORT, true)); + + marlin_state = MF_SD_COMPLETE; + } +} + +#if ENABLED(AUTO_REPORT_SD_STATUS) + uint8_t CardReader::auto_report_sd_interval = 0; + millis_t CardReader::next_sd_report_ms; + #if HAS_MULTI_SERIAL + int8_t CardReader::auto_report_port; + #endif + + void CardReader::auto_report_sd_status() { + millis_t current_ms = millis(); + if (auto_report_sd_interval && ELAPSED(current_ms, next_sd_report_ms)) { + next_sd_report_ms = current_ms + 1000UL * auto_report_sd_interval; + PORT_REDIRECT(auto_report_port); + report_status(); + } + } +#endif // AUTO_REPORT_SD_STATUS + +#if ENABLED(POWER_LOSS_RECOVERY) + + bool CardReader::jobRecoverFileExists() { + const bool exists = recovery.file.open(&root, recovery.filename, O_READ); + if (exists) recovery.file.close(); + return exists; + } + + void CardReader::openJobRecoveryFile(const bool read) { + if (!isMounted()) return; + if (recovery.file.isOpen()) return; + if (!recovery.file.open(&root, recovery.filename, read ? O_READ : O_CREAT | O_WRITE | O_TRUNC | O_SYNC)) + SERIAL_ECHOLNPAIR(STR_SD_OPEN_FILE_FAIL, recovery.filename, "."); + else if (!read) + echo_write_to_file(recovery.filename); + } + + // Removing the job recovery file currently requires closing + // the file being printed, so during SD printing the file should + // be zeroed and written instead of deleted. + void CardReader::removeJobRecoveryFile() { + if (jobRecoverFileExists()) { + recovery.init(); + removeFile(recovery.filename); + #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) + SERIAL_ECHOPGM("Power-loss file delete"); + serialprintPGM(jobRecoverFileExists() ? PSTR(" failed.\n") : PSTR("d.\n")); + #endif + } + } + +#endif // POWER_LOSS_RECOVERY + +#endif // SDSUPPORT diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h new file mode 100644 index 00000000..33645b65 --- /dev/null +++ b/Marlin/src/sd/cardreader.h @@ -0,0 +1,307 @@ +/** + * 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" + +#define IFSD(A,B) TERN(SDSUPPORT,A,B) + +#if ENABLED(SDSUPPORT) + +#if BOTH(SDCARD_SORT_ALPHA, SDSORT_DYNAMIC_RAM) + #define SD_RESORT 1 +#endif + +#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 +#define MAXPATHNAMELENGTH (1 + (MAXDIRNAMELENGTH + 1) * (MAX_DIR_DEPTH) + 1 + FILENAME_LENGTH) // "/" + N * ("ADIRNAME/") + "filename.ext" + +#include "SdFile.h" + +typedef struct { + bool saving:1, + logging:1, + sdprinting:1, + mounted:1, + filenameIsDir:1, + workDirIsRoot:1, + abort_sd_printing:1 + #if ENABLED(BINARY_FILE_TRANSFER) + , binary_mode:1 + #endif + ; +} card_flags_t; + +class CardReader { +public: + static card_flags_t flag; // Flags (above) + static char filename[FILENAME_LENGTH], // DOS 8.3 filename of the selected item + longFilename[LONG_FILENAME_LENGTH]; // Long name of the selected item + + // Fast! binary file transfer + #if ENABLED(BINARY_FILE_TRANSFER) + #if HAS_MULTI_SERIAL + static int8_t transfer_port_index; + #else + static constexpr int8_t transfer_port_index = 0; + #endif + #endif + + // // // Methods // // // + + CardReader(); + + static SdFile getroot() { return root; } + + static void mount(); + static void release(); + static inline bool isMounted() { return flag.mounted; } + static void ls(); + + // Handle media insert/remove + static void manage_media(); + + // SD Card Logging + static void openLogFile(char * const path); + static void write_command(char * const buf); + + // Auto-Start files + static int8_t autostart_index; // Index of autoX.g files + static void beginautostart(); + static void checkautostart(); + + // Basic file ops + static void openFileRead(char * const path, const uint8_t subcall=0); + static void openFileWrite(char * const path); + static void closefile(const bool store_location=false); + static bool fileExists(const char * const name); + static void removeFile(const char * const name); + + static inline char* longest_filename() { return longFilename[0] ? longFilename : filename; } + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + static void printLongPath(char * const path); // Used by M33 + #endif + + // Working Directory for SD card menu + static void cdroot(); + static void cd(const char *relpath); + static int8_t cdup(); + static uint16_t countFilesInWorkDir(); + static uint16_t get_num_Files(); + + // Select a file + static void selectFileByIndex(const uint16_t nr); + static void selectFileByName(const char* const match); + + // Print job + static void openAndPrintFile(const char *name); // (working directory) + static void fileHasFinished(); + static void getAbsFilename(char *dst); + static void printFilename(); + static void startFileprint(); + static void endFilePrint(TERN_(SD_RESORT, const bool re_sort=false)); + static void report_status(); + static inline void pauseSDPrint() { flag.sdprinting = false; } + static inline bool isPaused() { return isFileOpen() && !flag.sdprinting; } + static inline bool isPrinting() { return flag.sdprinting; } + #if HAS_PRINT_PROGRESS_PERMYRIAD + static inline uint16_t permyriadDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 9999) / 10000) : 0; } + #endif + static inline uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } + + // Helper for open and remove + static const char* diveToFile(const bool update_cwd, SdFile*& curDir, const char * const path, const bool echo=false); + + #if ENABLED(SDCARD_SORT_ALPHA) + static void presort(); + static void getfilename_sorted(const uint16_t nr); + #if ENABLED(SDSORT_GCODE) + FORCE_INLINE static void setSortOn(bool b) { sort_alpha = b; presort(); } + FORCE_INLINE static void setSortFolders(int i) { sort_folders = i; presort(); } + //FORCE_INLINE static void setSortReverse(bool b) { sort_reverse = b; } + #endif + #else + FORCE_INLINE static void getfilename_sorted(const uint16_t nr) { selectFileByIndex(nr); } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + static bool jobRecoverFileExists(); + static void openJobRecoveryFile(const bool read); + static void removeJobRecoveryFile(); + #endif + + static inline bool isFileOpen() { return isMounted() && file.isOpen(); } + static inline uint32_t getIndex() { return sdpos; } + static inline uint32_t getFileSize() { return filesize; } + static inline bool eof() { return sdpos >= filesize; } + static inline void setIndex(const uint32_t index) { sdpos = index; file.seekSet(index); } + static inline char* getWorkDirName() { workDir.getDosName(filename); return filename; } + static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } + static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } + static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } + + static Sd2Card& getSd2Card() { return sd2card; } + + #if ENABLED(AUTO_REPORT_SD_STATUS) + static void auto_report_sd_status(); + static inline void set_auto_report_interval(uint8_t v) { + TERN_(HAS_MULTI_SERIAL, auto_report_port = serial_port_index); + NOMORE(v, 60); + auto_report_sd_interval = v; + next_sd_report_ms = millis() + 1000UL * v; + } + #endif + +private: + // + // Working directory and parents + // + static SdFile root, workDir, workDirParents[MAX_DIR_DEPTH]; + static uint8_t workDirDepth; + + // + // Alphabetical file and folder sorting + // + #if ENABLED(SDCARD_SORT_ALPHA) + static uint16_t sort_count; // Count of sorted items in the current directory + #if ENABLED(SDSORT_GCODE) + static bool sort_alpha; // Flag to enable / disable the feature + static int sort_folders; // Folder sorting before/none/after + //static bool sort_reverse; // Flag to enable / disable reverse sorting + #endif + + // By default the sort index is static + #if ENABLED(SDSORT_DYNAMIC_RAM) + static uint8_t *sort_order; + #else + static uint8_t sort_order[SDSORT_LIMIT]; + #endif + + #if BOTH(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM) + #define SORTED_LONGNAME_MAXLEN (SDSORT_CACHE_VFATS) * (FILENAME_LENGTH) + #define SORTED_LONGNAME_STORAGE (SORTED_LONGNAME_MAXLEN + 1) + #else + #define SORTED_LONGNAME_MAXLEN LONG_FILENAME_LENGTH + #define SORTED_LONGNAME_STORAGE SORTED_LONGNAME_MAXLEN + #endif + + // Cache filenames to speed up SD menus. + #if ENABLED(SDSORT_USES_RAM) + + // If using dynamic ram for names, allocate on the heap. + #if ENABLED(SDSORT_CACHE_NAMES) + static uint16_t nrFiles; // Cache the total count + #if ENABLED(SDSORT_DYNAMIC_RAM) + static char **sortshort, **sortnames; + #else + static char sortshort[SDSORT_LIMIT][FILENAME_LENGTH]; + #endif + #endif + + #if (ENABLED(SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM)) || NONE(SDSORT_CACHE_NAMES, SDSORT_USES_STACK) + static char sortnames[SDSORT_LIMIT][SORTED_LONGNAME_STORAGE]; + #endif + + // Folder sorting uses an isDir array when caching items. + #if HAS_FOLDER_SORTING + #if ENABLED(SDSORT_DYNAMIC_RAM) + static uint8_t *isDir; + #elif ENABLED(SDSORT_CACHE_NAMES) || DISABLED(SDSORT_USES_STACK) + static uint8_t isDir[(SDSORT_LIMIT+7)>>3]; + #endif + #endif + + #endif // SDSORT_USES_RAM + + #endif // SDCARD_SORT_ALPHA + + static Sd2Card sd2card; + static SdVolume volume; + static SdFile file; + + static uint32_t filesize, sdpos; + + // + // Procedure calls to other files + // + #ifndef SD_PROCEDURE_DEPTH + #define SD_PROCEDURE_DEPTH 1 + #endif + static uint8_t file_subcall_ctr; + static uint32_t filespos[SD_PROCEDURE_DEPTH]; + static char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; + + // + // SD Auto Reporting + // + #if ENABLED(AUTO_REPORT_SD_STATUS) + static uint8_t auto_report_sd_interval; + static millis_t next_sd_report_ms; + #if HAS_MULTI_SERIAL + static int8_t auto_report_port; + #endif + #endif + + // + // Directory items + // + static bool is_dir_or_gcode(const dir_t &p); + static int countItems(SdFile dir); + static void selectByIndex(SdFile dir, const uint8_t index); + static void selectByName(SdFile dir, const char * const match); + static void printListing(SdFile parent, const char * const prepend=nullptr); + + #if ENABLED(SDCARD_SORT_ALPHA) + static void flush_presort(); + #endif +}; + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #define IS_SD_INSERTED() Sd2Card::isInserted() +#elif PIN_EXISTS(SD_DETECT) + #define IS_SD_INSERTED() (READ(SD_DETECT_PIN) == SD_DETECT_STATE) +#else + // No card detect line? Assume the card is inserted. + #define IS_SD_INSERTED() true +#endif + +#define IS_SD_PRINTING() card.flag.sdprinting +#define IS_SD_PAUSED() card.isPaused() +#define IS_SD_FILE_OPEN() card.isFileOpen() + +extern CardReader card; + +#else // !SDSUPPORT + +#define IS_SD_PRINTING() false +#define IS_SD_PAUSED() false +#define IS_SD_FILE_OPEN() false + +#define LONG_FILENAME_LENGTH 0 + +#endif // !SDSUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp new file mode 100644 index 00000000..a097df51 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -0,0 +1,314 @@ +/** + * 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" + +/** + * Adjust USB_DEBUG to select debugging verbosity. + * 0 - no debug messages + * 1 - basic insertion/removal messages + * 2 - show USB state transitions + * 3 - perform block range checking + * 4 - print each block access + */ +#define USB_DEBUG 1 +#define USB_STARTUP_DELAY 0 + +// uncomment to get 'printf' console debugging. NOT FOR UNO! +//#define HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);} +//#define BS_HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);} +//#define MAX_HOST_DEBUG(...) {char s[255]; sprintf(s,__VA_ARGS__); SERIAL_ECHOLNPAIR("UHS:",s);} + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) + +#include "../../MarlinCore.h" +#include "../../core/serial.h" +#include "../../module/temperature.h" + +static_assert(USB_CS_PIN != -1, "USB_CS_PIN must be defined"); +static_assert(USB_INTR_PIN != -1, "USB_INTR_PIN must be defined"); + +#if ENABLED(USE_UHS3_USB) + #define NO_AUTO_SPEED + #define UHS_MAX3421E_SPD 8000000 >> SPI_SPEED + #define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1 + #define UHS_HOST_MAX_INTERFACE_DRIVERS 2 + #define MASS_MAX_SUPPORTED_LUN 1 + #define USB_HOST_SERIAL MYSERIAL0 + + // Workaround for certain issues with UHS3 + #define SKIP_PAGE3F // Required for IOGEAR media adapter + #define USB_NO_TEST_UNIT_READY // Required for removable media adapter + #define USB_HOST_MANUAL_POLL // Optimization to shut off IRQ automatically + + // Workarounds for keeping Marlin's watchdog timer from barking... + void marlin_yield() { + thermalManager.manage_heater(); + } + #define SYSTEM_OR_SPECIAL_YIELD(...) marlin_yield(); + #define delay(x) safe_delay(x) + + #define LOAD_USB_HOST_SYSTEM + #define LOAD_USB_HOST_SHIELD + #define LOAD_UHS_BULK_STORAGE + + #define MARLIN_UHS_WRITE_SS(v) WRITE(USB_CS_PIN, v) + #define MARLIN_UHS_READ_IRQ() READ(USB_INTR_PIN) + + #include "lib-uhs3/UHS_host/UHS_host.h" + + MAX3421E_HOST usb(USB_CS_PIN, USB_INTR_PIN); + UHS_Bulk_Storage bulk(&usb); + + #define UHS_START (usb.Init() == 0) + #define UHS_STATE(state) UHS_USB_HOST_STATE_##state +#else + #include "lib-uhs2/Usb.h" + #include "lib-uhs2/masstorage.h" + + USB usb; + BulkOnly bulk(&usb); + + #define UHS_START usb.start() + #define UHS_STATE(state) USB_STATE_##state +#endif + +#include "Sd2Card_FlashDrive.h" + +#include "../../lcd/ultralcd.h" + +static enum { + UNINITIALIZED, + DO_STARTUP, + WAIT_FOR_DEVICE, + WAIT_FOR_LUN, + MEDIA_READY, + MEDIA_ERROR +} state; + +#if USB_DEBUG >= 3 + uint32_t lun0_capacity; +#endif + +bool Sd2Card::usbStartup() { + if (state <= DO_STARTUP) { + SERIAL_ECHOPGM("Starting USB host..."); + if (!UHS_START) { + SERIAL_ECHOLNPGM(" failed."); + LCD_MESSAGEPGM(MSG_MEDIA_USB_FAILED); + return false; + } + + // SPI quick test - check revision register + switch (usb.regRd(rREVISION)) { + case 0x01: SERIAL_ECHOLNPGM("rev.01 started"); break; + case 0x12: SERIAL_ECHOLNPGM("rev.02 started"); break; + case 0x13: SERIAL_ECHOLNPGM("rev.03 started"); break; + default: SERIAL_ECHOLNPGM("started. rev unknown."); break; + } + state = WAIT_FOR_DEVICE; + } + return true; +} + +// The USB library needs to be called periodically to detect USB thumbdrive +// insertion and removals. Call this idle() function periodically to allow +// the USB library to monitor for such events. This function also takes care +// of initializing the USB library for the first time. + +void Sd2Card::idle() { + usb.Task(); + + const uint8_t task_state = usb.getUsbTaskState(); + + #if USB_DEBUG >= 2 + if (state > DO_STARTUP) { + static uint8_t laststate = 232; + if (task_state != laststate) { + laststate = task_state; + #define UHS_USB_DEBUG(x) case UHS_STATE(x): SERIAL_ECHOLNPGM(#x); break + switch (task_state) { + UHS_USB_DEBUG(IDLE); + UHS_USB_DEBUG(RESET_DEVICE); + UHS_USB_DEBUG(RESET_NOT_COMPLETE); + UHS_USB_DEBUG(DEBOUNCE); + UHS_USB_DEBUG(DEBOUNCE_NOT_COMPLETE); + UHS_USB_DEBUG(WAIT_SOF); + UHS_USB_DEBUG(ERROR); + UHS_USB_DEBUG(CONFIGURING); + UHS_USB_DEBUG(CONFIGURING_DONE); + UHS_USB_DEBUG(RUNNING); + default: + SERIAL_ECHOLNPAIR("UHS_USB_HOST_STATE: ", task_state); + break; + } + } + } + #endif + + static millis_t next_state_ms = millis(); + + #define GOTO_STATE_AFTER_DELAY(STATE, DELAY) do{ state = STATE; next_state_ms = millis() + DELAY; }while(0) + + if (ELAPSED(millis(), next_state_ms)) { + GOTO_STATE_AFTER_DELAY(state, 250); // Default delay + + switch (state) { + + case UNINITIALIZED: + #ifndef MANUAL_USB_STARTUP + GOTO_STATE_AFTER_DELAY( DO_STARTUP, USB_STARTUP_DELAY ); + #endif + break; + + case DO_STARTUP: usbStartup(); break; + + case WAIT_FOR_DEVICE: + if (task_state == UHS_STATE(RUNNING)) { + #if USB_DEBUG >= 1 + SERIAL_ECHOLNPGM("USB device inserted"); + #endif + GOTO_STATE_AFTER_DELAY( WAIT_FOR_LUN, 250 ); + } + break; + + case WAIT_FOR_LUN: + /* USB device is inserted, but if it is an SD card, + * adapter it may not have an SD card in it yet. */ + if (bulk.LUNIsGood(0)) { + #if USB_DEBUG >= 1 + SERIAL_ECHOLNPGM("LUN is good"); + #endif + GOTO_STATE_AFTER_DELAY( MEDIA_READY, 100 ); + } + else { + #ifdef USB_HOST_MANUAL_POLL + // Make sure we catch disconnect events + usb.busprobe(); + usb.VBUS_changed(); + #endif + #if USB_DEBUG >= 1 + SERIAL_ECHOLNPGM("Waiting for media"); + #endif + LCD_MESSAGEPGM(MSG_MEDIA_WAITING); + GOTO_STATE_AFTER_DELAY(state, 2000); + } + break; + + case MEDIA_READY: break; + case MEDIA_ERROR: break; + } + + if (state > WAIT_FOR_DEVICE && task_state != UHS_STATE(RUNNING)) { + // Handle device removal events + #if USB_DEBUG >= 1 + SERIAL_ECHOLNPGM("USB device removed"); + #endif + 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)) { + // Handle media removal events + #if USB_DEBUG >= 1 + SERIAL_ECHOLNPGM("Media removed"); + #endif + LCD_MESSAGEPGM(MSG_MEDIA_REMOVED); + GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0); + } + + else if (task_state == UHS_STATE(ERROR)) { + LCD_MESSAGEPGM(MSG_MEDIA_READ_ERROR); + GOTO_STATE_AFTER_DELAY(MEDIA_ERROR, 0); + } + } +} + +// Marlin calls this function to check whether an USB drive is inserted. +// This is equivalent to polling the SD_DETECT when using SD cards. +bool Sd2Card::isInserted() { + return state == MEDIA_READY; +} + +bool Sd2Card::ready() { + return state > DO_STARTUP; +} + +// Marlin calls this to initialize an SD card once it is inserted. +bool Sd2Card::init(const uint8_t, const pin_t) { + if (!isInserted()) return false; + + #if USB_DEBUG >= 1 + const uint32_t sectorSize = bulk.GetSectorSize(0); + if (sectorSize != 512) { + SERIAL_ECHOLNPAIR("Expecting sector size of 512. Got: ", sectorSize); + return false; + } + #endif + + #if USB_DEBUG >= 3 + lun0_capacity = bulk.GetCapacity(0); + SERIAL_ECHOLNPAIR("LUN Capacity (in blocks): ", lun0_capacity); + #endif + return true; +} + +// Returns the capacity of the card in blocks. +uint32_t Sd2Card::cardSize() { + if (!isInserted()) return false; + #if USB_DEBUG < 3 + const uint32_t + #endif + lun0_capacity = bulk.GetCapacity(0); + return lun0_capacity; +} + +bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) { + if (!isInserted()) return false; + #if USB_DEBUG >= 3 + if (block >= lun0_capacity) { + SERIAL_ECHOLNPAIR("Attempt to read past end of LUN: ", block); + return false; + } + #if USB_DEBUG >= 4 + SERIAL_ECHOLNPAIR("Read block ", block); + #endif + #endif + return bulk.Read(0, block, 512, 1, dst) == 0; +} + +bool Sd2Card::writeBlock(uint32_t block, const uint8_t* src) { + if (!isInserted()) return false; + #if USB_DEBUG >= 3 + if (block >= lun0_capacity) { + SERIAL_ECHOLNPAIR("Attempt to write past end of LUN: ", block); + return false; + } + #if USB_DEBUG >= 4 + SERIAL_ECHOLNPAIR("Write block ", block); + #endif + #endif + return bulk.Write(0, block, 512, 1, src) == 0; +} + +#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h new file mode 100644 index 00000000..8ca95ba7 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -0,0 +1,75 @@ +/** + * 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 + +/** + * \file + * \brief Sd2Card class for V2 SD/SDHC cards + */ + +#include "../SdFatConfig.h" +#include "../SdInfo.h" + +/** + * Define SOFTWARE_SPI to use bit-bang SPI + */ +#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) + #define SOFTWARE_SPI +#endif + +// SPI pin definitions - do not edit here - change in SdFatConfig.h +#if ENABLED(SOFTWARE_SPI) + #warning "Auto-assigning '10' as the SD_CHIP_SELECT_PIN." + #define SD_CHIP_SELECT_PIN 10 // Software SPI chip select pin for the SD +#else + // hardware pin defs + #define SD_CHIP_SELECT_PIN SS_PIN // The default chip select pin for the SD card is SS. +#endif + +class Sd2Card { + private: + uint32_t pos; + + static void usbStateDebug(); + + public: + static bool usbStartup(); + + bool init(const uint8_t sckRateID=0, const pin_t chipSelectPin=SD_CHIP_SELECT_PIN); + + static void idle(); + + inline bool readStart(const uint32_t block) { pos = block; return ready(); } + inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } + inline bool readStop() const { return true; } + + inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return ready(); } + inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } + inline bool writeStop() const { return true; } + + bool readBlock(uint32_t block, uint8_t* dst); + bool writeBlock(uint32_t blockNumber, const uint8_t* src); + + uint32_t cardSize(); + static bool isInserted(); + static bool ready(); +}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp new file mode 100644 index 00000000..8a989157 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -0,0 +1,797 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +/* USB functions */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) + +#include "Usb.h" + +static uint8_t usb_error = 0; +static uint8_t usb_task_state; + +/* constructor */ +USB::USB() : bmHubPre(0) { + usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; //set up state machine + init(); +} + +/* Initialize data structures */ +void USB::init() { + //devConfigIndex = 0; + bmHubPre = 0; +} + +uint8_t USB::getUsbTaskState() { + return usb_task_state; +} + +void USB::setUsbTaskState(uint8_t state) { + usb_task_state = state; +} + +EpInfo* USB::getEpInfoEntry(uint8_t addr, uint8_t ep) { + UsbDevice *p = addrPool.GetUsbDevicePtr(addr); + + if (!p || !p->epinfo) + return nullptr; + + EpInfo *pep = p->epinfo; + + for (uint8_t i = 0; i < p->epcount; i++) { + if ((pep)->epAddr == ep) + return pep; + + pep++; + } + return nullptr; +} + +/* set device table entry */ + +/* each device is different and has different number of endpoints. This function plugs endpoint record structure, defined in application, to devtable */ +uint8_t USB::setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr) { + if (!eprecord_ptr) + return USB_ERROR_INVALID_ARGUMENT; + + UsbDevice *p = addrPool.GetUsbDevicePtr(addr); + + if (!p) + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + p->address.devAddress = addr; + p->epinfo = eprecord_ptr; + p->epcount = epcount; + + return 0; +} + +uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit) { + UsbDevice *p = addrPool.GetUsbDevicePtr(addr); + + if (!p) + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + if (!p->epinfo) + return USB_ERROR_EPINFO_IS_NULL; + + *ppep = getEpInfoEntry(addr, ep); + + if (!*ppep) + return USB_ERROR_EP_NOT_FOUND_IN_TBL; + + *nak_limit = (0x0001UL << (((*ppep)->bmNakPower > USB_NAK_MAX_POWER) ? USB_NAK_MAX_POWER : (*ppep)->bmNakPower)); + (*nak_limit)--; + /* + USBTRACE2("\r\nAddress: ", addr); + USBTRACE2(" EP: ", ep); + USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower); + USBTRACE2(" NAK Limit: ", nak_limit); + USBTRACE("\r\n"); + */ + regWr(rPERADDR, addr); //set peripheral address + + uint8_t mode = regRd(rMODE); + + //Serial.print("\r\nMode: "); + //Serial.println( mode, HEX); + //Serial.print("\r\nLS: "); + //Serial.println(p->lowspeed, HEX); + + + + // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise + regWr(rMODE, (p->lowspeed) ? mode | bmLOWSPEED | bmHubPre : mode & ~(bmHUBPRE | bmLOWSPEED)); + + return 0; +} + +/* Control transfer. Sets address, endpoint, fills control packet with necessary data, dispatches control packet, and initiates bulk IN transfer, */ +/* depending on request. Actual requests are defined as inlines */ +/* return codes: */ +/* 00 = success */ + +/* 01-0f = non-zero HRSLT */ +uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, + uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) { + bool direction = false; //request direction, IN or OUT + uint8_t rcode; + SETUP_PKT setup_pkt; + + EpInfo *pep = nullptr; + uint16_t nak_limit = 0; + + rcode = SetAddress(addr, ep, &pep, &nak_limit); + if (rcode) return rcode; + + direction = ((bmReqType & 0x80) > 0); + + /* fill in setup packet */ + setup_pkt.ReqType_u.bmRequestType = bmReqType; + setup_pkt.bRequest = bRequest; + setup_pkt.wVal_u.wValueLo = wValLo; + setup_pkt.wVal_u.wValueHi = wValHi; + setup_pkt.wIndex = wInd; + setup_pkt.wLength = total; + + bytesWr(rSUDFIFO, 8, (uint8_t*) & setup_pkt); //transfer to setup packet FIFO + + rcode = dispatchPkt(tokSETUP, ep, nak_limit); //dispatch packet + if (rcode) return rcode; // Return HRSLT if not zero + + if (dataptr != nullptr) { //data stage, if present + if (direction) { //IN transfer + uint16_t left = total; + pep->bmRcvToggle = 1; //bmRCVTOG1; + + while (left) { + // Bytes read into buffer + uint16_t read = nbytes; + //uint16_t read = (leftbmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; + continue; + } + + if (rcode) return rcode; + + // Invoke callback function if inTransfer completed successfully and callback function pointer is specified + if (!rcode && p) ((USBReadParser*)p)->Parse(read, dataptr, total - left); + + left -= read; + + if (read < nbytes) break; + } + } + else { //OUT transfer + pep->bmSndToggle = 1; //bmSNDTOG1; + rcode = OutTransfer(pep, nak_limit, nbytes, dataptr); + } + if (rcode) return rcode; // return error + } + // Status stage + return dispatchPkt((direction) ? tokOUTHS : tokINHS, ep, nak_limit); //GET if direction +} + +/* IN transfer to arbitrary endpoint. Assumes PERADDR is set. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */ +/* Keep sending INs and writes data to memory area pointed by 'data' */ + +/* rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error, + fe USB xfer timeout */ +uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { + EpInfo *pep = nullptr; + uint16_t nak_limit = 0; + + uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit); + if (rcode) { + USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81); + USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81); + USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81); + return rcode; + } + return InTransfer(pep, nak_limit, nbytesptr, data, bInterval); +} + +uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { + uint8_t rcode = 0; + uint8_t pktsize; + + uint16_t nbytes = *nbytesptr; + //printf("Requesting %i bytes ", nbytes); + uint8_t maxpktsize = pep->maxPktSize; + + *nbytesptr = 0; + regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value + + // use a 'break' to exit this loop + for (;;) { + rcode = dispatchPkt(tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS. + if (rcode == hrTOGERR) { + // yes, we flip it wrong here so that next time it is actually correct! + pep->bmRcvToggle = (regRd(rHRSL) & bmRCVTOGRD) ? 0 : 1; + regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value + continue; + } + if (rcode) { + //printf(">>>>>>>> Problem! dispatchPkt %2.2x\r\n", rcode); + break; //should be 0, indicating ACK. Else return error code. + } + /* check for RCVDAVIRQ and generate error if not present */ + /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */ + if ((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) { + //printf(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n"); + rcode = 0xF0; //receive error + break; + } + pktsize = regRd(rRCVBC); //number of received bytes + //printf("Got %i bytes \r\n", pktsize); + // This would be OK, but... + //assert(pktsize <= nbytes); + if (pktsize > nbytes) { + // This can happen. Use of assert on Arduino locks up the Arduino. + // So I will trim the value, and hope for the best. + //printf(">>>>>>>> Problem! Wanted %i bytes but got %i.\r\n", nbytes, pktsize); + pktsize = nbytes; + } + + int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr); + if (mem_left < 0) mem_left = 0; + + data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data); + + regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer + *nbytesptr += pktsize; // add this packet's byte count to total transfer length + + /* The transfer is complete under two conditions: */ + /* 1. The device sent a short packet (L.T. maxPacketSize) */ + /* 2. 'nbytes' have been transferred. */ + if (pktsize < maxpktsize || *nbytesptr >= nbytes) { // Transferred 'nbytes' bytes? + // Save toggle value + pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0; + //printf("\r\n"); + rcode = 0; + break; + } + else if (bInterval > 0) + delay(bInterval); // Delay according to polling interval + } + return rcode; +} + +/* OUT transfer to arbitrary endpoint. Handles multiple packets if necessary. Transfers 'nbytes' bytes. */ +/* Handles NAK bug per Maxim Application Note 4000 for single buffer transfer */ + +/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ +uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { + EpInfo *pep = nullptr; + uint16_t nak_limit = 0; + + uint8_t rcode = SetAddress(addr, ep, &pep, &nak_limit); + if (rcode) return rcode; + + return OutTransfer(pep, nak_limit, nbytes, data); +} + +uint8_t USB::OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) { + uint8_t rcode = hrSUCCESS, retry_count; + uint8_t *data_p = data; //local copy of the data pointer + uint16_t bytes_tosend, nak_count; + uint16_t bytes_left = nbytes; + + uint8_t maxpktsize = pep->maxPktSize; + + if (maxpktsize < 1 || maxpktsize > 64) + return USB_ERROR_INVALID_MAX_PKT_SIZE; + + uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT; + + regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value + + while (bytes_left) { + retry_count = 0; + nak_count = 0; + bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; + bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO + regWr(rSNDBC, bytes_tosend); //set number of bytes + regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet + while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ + regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ + rcode = (regRd(rHRSL) & 0x0F); + + while (rcode && ((int32_t)((uint32_t)millis() - timeout) < 0L)) { + switch (rcode) { + case hrNAK: + nak_count++; + if (nak_limit && (nak_count == nak_limit)) + goto breakout; + //return ( rcode); + break; + case hrTIMEOUT: + retry_count++; + if (retry_count == USB_RETRY_LIMIT) + goto breakout; + //return ( rcode); + break; + case hrTOGERR: + // yes, we flip it wrong here so that next time it is actually correct! + pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; + regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value + break; + default: + goto breakout; + } + + /* process NAK according to Host out NAK bug */ + regWr(rSNDBC, 0); + regWr(rSNDFIFO, *data_p); + regWr(rSNDBC, bytes_tosend); + regWr(rHXFR, (tokOUT | pep->epAddr)); //dispatch packet + while (!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ + regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ + rcode = (regRd(rHRSL) & 0x0F); + } // while rcode && .... + bytes_left -= bytes_tosend; + data_p += bytes_tosend; + } // while bytes_left... +breakout: + + pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle + return ( rcode); //should be 0 in all cases +} + +/* dispatch USB packet. Assumes peripheral address is set and relevant buffer is loaded/empty */ +/* If NAK, tries to re-send up to nak_limit times */ +/* If nak_limit == 0, do not count NAKs, exit after timeout */ +/* If bus timeout, re-sends up to USB_RETRY_LIMIT times */ + +/* return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout */ +uint8_t USB::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { + uint32_t timeout = (uint32_t)millis() + USB_XFER_TIMEOUT; + uint8_t tmpdata; + uint8_t rcode = hrSUCCESS; + uint8_t retry_count = 0; + uint16_t nak_count = 0; + + while ((int32_t)((uint32_t)millis() - timeout) < 0L) { + #if defined(ESP8266) || defined(ESP32) + yield(); // needed in order to reset the watchdog timer on the ESP8266 + #endif + regWr(rHXFR, (token | ep)); //launch the transfer + rcode = USB_ERROR_TRANSFER_TIMEOUT; + + while ((int32_t)((uint32_t)millis() - timeout) < 0L) { //wait for transfer completion + #if defined(ESP8266) || defined(ESP32) + yield(); // needed to reset the watchdog timer on the ESP8266 + #endif + tmpdata = regRd(rHIRQ); + + if (tmpdata & bmHXFRDNIRQ) { + regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt + rcode = 0x00; + break; + } + + } // while millis() < timeout + + //if (rcode != 0x00) //exit if timeout + // return ( rcode); + + rcode = (regRd(rHRSL) & 0x0F); //analyze transfer result + + switch (rcode) { + case hrNAK: + nak_count++; + if (nak_limit && (nak_count == nak_limit)) + return (rcode); + break; + case hrTIMEOUT: + retry_count++; + if (retry_count == USB_RETRY_LIMIT) + return (rcode); + break; + default: + return (rcode); + } + + } // while timeout > millis() + return rcode; +} + +/* USB main task. Performs enumeration/cleanup */ +void USB::Task() { //USB state machine + uint8_t rcode; + uint8_t tmpdata; + static uint32_t delay = 0; + //USB_FD_DEVICE_DESCRIPTOR buf; + bool lowspeed = false; + + MAX3421E::Task(); + + tmpdata = getVbusState(); + + /* modify USB task state if Vbus changed */ + switch (tmpdata) { + case SE1: //illegal state + usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL; + lowspeed = false; + break; + case SE0: //disconnected + if ((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED) + usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE; + lowspeed = false; + break; + case LSHOST: + lowspeed = true; + //intentional fallthrough + case FSHOST: //attached + if ((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) { + delay = (uint32_t)millis() + USB_SETTLE_DELAY; + usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE; + } + break; + } + + for (uint8_t i = 0; i < USB_NUMDEVICES; i++) + if (devConfig[i]) rcode = devConfig[i]->Poll(); + + switch (usb_task_state) { + case USB_DETACHED_SUBSTATE_INITIALIZE: + init(); + + for (uint8_t i = 0; i < USB_NUMDEVICES; i++) + if (devConfig[i]) + rcode = devConfig[i]->Release(); + + usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE; + break; + case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here + break; + case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here + break; + case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device + if ((int32_t)((uint32_t)millis() - delay) >= 0L) + usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE; + else break; // don't fall through + case USB_ATTACHED_SUBSTATE_RESET_DEVICE: + regWr(rHCTL, bmBUSRST); //issue bus reset + usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE; + break; + case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE: + if ((regRd(rHCTL) & bmBUSRST) == 0) { + tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation + regWr(rMODE, tmpdata); + usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF; + //delay = (uint32_t)millis() + 20; //20ms wait after reset per USB spec + } + break; + case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order + if (regRd(rHIRQ) & bmFRAMEIRQ) { + //when first SOF received _and_ 20ms has passed we can continue + /* + if (delay < (uint32_t)millis()) //20ms passed + usb_task_state = USB_STATE_CONFIGURING; + */ + usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET; + delay = (uint32_t)millis() + 20; + } + break; + case USB_ATTACHED_SUBSTATE_WAIT_RESET: + if ((int32_t)((uint32_t)millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING; + else break; // don't fall through + case USB_STATE_CONFIGURING: + + //Serial.print("\r\nConf.LS: "); + //Serial.println(lowspeed, HEX); + + rcode = Configuring(0, 0, lowspeed); + + if (!rcode) + usb_task_state = USB_STATE_RUNNING; + else if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) { + usb_error = rcode; + usb_task_state = USB_STATE_ERROR; + } + break; + case USB_STATE_RUNNING: + break; + case USB_STATE_ERROR: + //MAX3421E::Init(); + break; + } +} + +uint8_t USB::DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed) { + //uint8_t buf[12]; + uint8_t rcode; + UsbDevice *p0 = nullptr, *p = nullptr; + + // Get pointer to pseudo device with address 0 assigned + p0 = addrPool.GetUsbDevicePtr(0); + if (!p0) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + if (!p0->epinfo) return USB_ERROR_EPINFO_IS_NULL; + + p0->lowspeed = lowspeed; + + // Allocate new address according to device class + uint8_t bAddress = addrPool.AllocAddress(parent, false, port); + if (!bAddress) return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL; + + p = addrPool.GetUsbDevicePtr(bAddress); + if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + p->lowspeed = lowspeed; + + // Assign new address to the device + rcode = setAddr(0, 0, bAddress); + if (rcode) { + addrPool.FreeAddress(bAddress); + bAddress = 0; + } + return rcode; +} + +uint8_t USB::AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed) { + //printf("AttemptConfig: parent = %i, port = %i\r\n", parent, port); + uint8_t retries = 0; + +again: + uint8_t rcode = devConfig[driver]->ConfigureDevice(parent, port, lowspeed); + if (rcode == USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET) { + if (parent == 0) { + // Send a bus reset on the root interface. + regWr(rHCTL, bmBUSRST); //issue bus reset + delay(102); // delay 102ms, compensate for clock inaccuracy. + } + else { + // reset parent port + devConfig[parent]->ResetHubPort(port); + } + } + else if (rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works + delay(100); + retries++; + goto again; + } + else if (rcode) + return rcode; + + rcode = devConfig[driver]->Init(parent, port, lowspeed); + if (rcode == hrJERR && retries < 3) { // Some devices returns this when plugged in - trying to initialize the device again usually works + delay(100); + retries++; + goto again; + } + + if (rcode) { + // Issue a bus reset, because the device may be in a limbo state + if (parent == 0) { + // Send a bus reset on the root interface. + regWr(rHCTL, bmBUSRST); //issue bus reset + delay(102); // delay 102ms, compensate for clock inaccuracy. + } + else { + // reset parent port + devConfig[parent]->ResetHubPort(port); + } + } + return rcode; +} + +/** + * This is broken. It needs to enumerate differently. + * It causes major problems with several devices if detected in an unexpected order. + * + * Oleg - I wouldn't do anything before the newly connected device is considered sane. + * i.e.(delays are not indicated for brevity): + * 1. reset + * 2. GetDevDescr(); + * 3a. If ACK, continue with allocating address, addressing, etc. + * 3b. Else reset again, count resets, stop at some number (5?). + * 4. When max.number of resets is reached, toggle power/fail + * If desired, this could be modified by performing two resets with GetDevDescr() in the middle - however, from my experience, if a device answers to GDD() + * it doesn't need to be reset again + * New steps proposal: + * 1: get address pool instance. exit on fail + * 2: pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf). exit on fail. + * 3: bus reset, 100ms delay + * 4: set address + * 5: pUsb->setEpInfoEntry(bAddress, 1, epInfo), exit on fail + * 6: while (configurations) { + * for (each configuration) { + * for (each driver) { + * 6a: Ask device if it likes configuration. Returns 0 on OK. + * If successful, the driver configured device. + * The driver now owns the endpoints, and takes over managing them. + * The following will need codes: + * Everything went well, instance consumed, exit with success. + * Instance already in use, ignore it, try next driver. + * Not a supported device, ignore it, try next driver. + * Not a supported configuration for this device, ignore it, try next driver. + * Could not configure device, fatal, exit with fail. + * } + * } + * } + * 7: for (each driver) { + * 7a: Ask device if it knows this VID/PID. Acts exactly like 6a, but using VID/PID + * 8: if we get here, no driver likes the device plugged in, so exit failure. + */ +uint8_t USB::Configuring(uint8_t parent, uint8_t port, bool lowspeed) { + //uint8_t bAddress = 0; + //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); + UsbDevice *p = nullptr; + EpInfo *oldep_ptr = nullptr; + EpInfo epInfo; + + epInfo.epAddr = 0; + epInfo.maxPktSize = 8; + epInfo.bmSndToggle = 0; + epInfo.bmRcvToggle = 0; + epInfo.bmNakPower = USB_NAK_MAX_POWER; + + //delay(2000); + AddressPool &addrPool = GetAddressPool(); + // Get pointer to pseudo device with address 0 assigned + p = addrPool.GetUsbDevicePtr(0); + if (!p) { + //printf("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n"); + return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + } + + // Save old pointer to EP_RECORD of address 0 + oldep_ptr = p->epinfo; + + // Temporary assign new pointer to epInfo to p->epinfo in order to + // avoid toggle inconsistence + + p->epinfo = &epInfo; + + p->lowspeed = lowspeed; + // Get device descriptor + 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_FD_DEVICE_DESCRIPTOR\r\n"); + return rcode; + } + + // to-do? + // Allocate new address according to device class + //bAddress = addrPool.AllocAddress(parent, false, port); + + uint16_t vid = udd->idVendor, pid = udd->idProduct; + uint8_t klass = udd->bDeviceClass, subklass = udd->bDeviceSubClass; + + // Attempt to configure if VID/PID or device class matches with a driver + // Qualify with subclass too. + // + // VID/PID & class tests default to false for drivers not yet ported + // subclass defaults to true, so you don't have to define it if you don't have to. + // + for (devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) { + if (!devConfig[devConfigIndex]) continue; // no driver + if (devConfig[devConfigIndex]->GetAddress()) continue; // consumed + if (devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) { + rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed); + if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED) + break; + } + } + + if (devConfigIndex < USB_NUMDEVICES) return rcode; + + // blindly attempt to configure + for (devConfigIndex = 0; devConfigIndex < USB_NUMDEVICES; devConfigIndex++) { + if (!devConfig[devConfigIndex]) continue; + if (devConfig[devConfigIndex]->GetAddress()) continue; // consumed + if (devConfig[devConfigIndex]->DEVSUBCLASSOK(subklass) && (devConfig[devConfigIndex]->VIDPIDOK(vid, pid) || devConfig[devConfigIndex]->DEVCLASSOK(klass))) continue; // If this is true it means it must have returned USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED above + rcode = AttemptConfig(devConfigIndex, parent, port, lowspeed); + + //printf("ERROR ENUMERATING %2.2x\r\n", rcode); + if (!(rcode == USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED || rcode == USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE)) { + // in case of an error dev_index should be reset to 0 + // in order to start from the very beginning the + // next time the program gets here + //if (rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) + // devConfigIndex = 0; + return rcode; + } + } + // Arriving here means the device class is unsupported by registered classes + return DefaultAddressing(parent, port, lowspeed); +} + +uint8_t USB::ReleaseDevice(uint8_t addr) { + if (addr) { + for (uint8_t i = 0; i < USB_NUMDEVICES; i++) { + if (!devConfig[i]) continue; + if (devConfig[i]->GetAddress() == addr) + return devConfig[i]->Release(); + } + } + return 0; +} + +#if 1 //!defined(USB_METHODS_INLINE) +//get device descriptor + +uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { + return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, nullptr); +} +//get configuration descriptor + +uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { + return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, nullptr); +} + +/* Requests Configuration Descriptor. Sends two Get Conf Descr requests. The first one gets the total length of all descriptors, then the second one requests this + total length. The length of the first request can be shorter ( 4 bytes ), however, there are devices which won't work unless this length is set to 9 */ +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); + + uint8_t ret = getConfDescr(addr, ep, 9, conf, buf); + if (ret) return ret; + + uint16_t total = ucd->wTotalLength; + + //USBTRACE2("\r\ntotal conf.size:", total); + + return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, total, bufSize, buf, p); +} + +//get string descriptor + +uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { + return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, nullptr); +} +//set address + +uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) { + uint8_t rcode = ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); + //delay(2); //per USB 2.0 sect.9.2.6.3 + delay(300); // Older spec says you should wait at least 200ms + return rcode; + //return ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); +} +//set configuration + +uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) { + return ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, 0x0000, nullptr, nullptr); +} + +#endif // defined(USB_METHODS_INLINE) +#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h new file mode 100644 index 00000000..b1ec1469 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.h @@ -0,0 +1,53 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +/* USB functions */ +#define _usb_h_ + +#include "../../../inc/MarlinConfigPre.h" + +// WARNING: Do not change the order of includes, or stuff will break! +#include +#include +#include + +// None of these should ever be included by a driver, or a user's sketch. +#include "settings.h" +#include "printhex.h" +#include "message.h" + +#include "hexdump.h" +//#include "sink_parser.h" +#include "max3421e.h" +#include "address.h" +//#include "avrpins.h" +#include "usb_ch9.h" +#include "usbhost.h" +#include "UsbCore.h" +#include "parsetools.h" +#include "confdescparser.h" + +#undef _usb_h_ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h new file mode 100644 index 00000000..d94958dd --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h @@ -0,0 +1,312 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#ifndef _usb_h_ + #error "Never include UsbCore.h directly; include Usb.h instead" +#endif + +#pragma once + +// Not used anymore? If anyone uses this, please let us know so that this may be +// moved to the proper place, settings.h. +//#define USB_METHODS_INLINE + +/* shield pins. First parameter - SS pin, second parameter - INT pin */ + +#ifdef __MARLIN_FIRMWARE__ +typedef MAX3421e MAX3421E; // Marlin redefines this class in "../usb_host.h" +#elif defined(BOARD_BLACK_WIDDOW) +typedef MAX3421e MAX3421E; // Black Widow +#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) +#if EXT_RAM +typedef MAX3421e MAX3421E; // Teensy++ 2.0 with XMEM2 +#else +typedef MAX3421e MAX3421E; // Teensy++ 1.0 and 2.0 +#endif +#elif defined(BOARD_MEGA_ADK) +typedef MAX3421e MAX3421E; // Arduino Mega ADK +#elif defined(ARDUINO_AVR_BALANDUINO) +typedef MAX3421e MAX3421E; // Balanduino +#elif defined(__ARDUINO_X86__) && PLATFORM_ID == 0x06 +typedef MAX3421e MAX3421E; // The Intel Galileo supports much faster read and write speed at pin 2 and 3 +#elif defined(ESP8266) +typedef MAX3421e MAX3421E; // ESP8266 boards +#elif defined(ESP32) +typedef MAX3421e MAX3421E; // ESP32 boards +#else +typedef MAX3421e MAX3421E; // Official Arduinos (UNO, Duemilanove, Mega, 2560, Leonardo, Due etc.), Intel Edison, Intel Galileo 2 or Teensy 2.0 and 3.x +#endif + +/* Common setup data constant combinations */ +#define bmREQ_GET_DESCR USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //get descriptor request type +#define bmREQ_SET USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE //set request type for all but 'set feature' and 'set interface' +#define bmREQ_CL_GET_INTF USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE //get interface request type + +// D7 data transfer direction (0 - host-to-device, 1 - device-to-host) +// D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved) +// D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved) + +// USB Device Classes +#define USB_CLASS_USE_CLASS_INFO 0x00 // Use Class Info in the Interface Descriptors +#define USB_CLASS_AUDIO 0x01 // Audio +#define USB_CLASS_COM_AND_CDC_CTRL 0x02 // Communications and CDC Control +#define USB_CLASS_HID 0x03 // HID +#define USB_CLASS_PHYSICAL 0x05 // Physical +#define USB_CLASS_IMAGE 0x06 // Image +#define USB_CLASS_PRINTER 0x07 // Printer +#define USB_CLASS_MASS_STORAGE 0x08 // Mass Storage +#define USB_CLASS_HUB 0x09 // Hub +#define USB_CLASS_CDC_DATA 0x0A // CDC-Data +#define USB_CLASS_SMART_CARD 0x0B // Smart-Card +#define USB_CLASS_CONTENT_SECURITY 0x0D // Content Security +#define USB_CLASS_VIDEO 0x0E // Video +#define USB_CLASS_PERSONAL_HEALTH 0x0F // Personal Healthcare +#define USB_CLASS_DIAGNOSTIC_DEVICE 0xDC // Diagnostic Device +#define USB_CLASS_WIRELESS_CTRL 0xE0 // Wireless Controller +#define USB_CLASS_MISC 0xEF // Miscellaneous +#define USB_CLASS_APP_SPECIFIC 0xFE // Application Specific +#define USB_CLASS_VENDOR_SPECIFIC 0xFF // Vendor Specific + +// Additional Error Codes +#define USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED 0xD1 +#define USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE 0xD2 +#define USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS 0xD3 +#define USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL 0xD4 +#define USB_ERROR_HUB_ADDRESS_OVERFLOW 0xD5 +#define USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL 0xD6 +#define USB_ERROR_EPINFO_IS_NULL 0xD7 +#define USB_ERROR_INVALID_ARGUMENT 0xD8 +#define USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE 0xD9 +#define USB_ERROR_INVALID_MAX_PKT_SIZE 0xDA +#define USB_ERROR_EP_NOT_FOUND_IN_TBL 0xDB +#define USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET 0xE0 +#define USB_ERROR_FailGetDevDescr 0xE1 +#define USB_ERROR_FailSetDevTblEntry 0xE2 +#define USB_ERROR_FailGetConfDescr 0xE3 +#define USB_ERROR_TRANSFER_TIMEOUT 0xFF + +#define USB_XFER_TIMEOUT 5000 // (5000) USB transfer timeout in milliseconds, per section 9.2.6.1 of USB 2.0 spec +//#define USB_NAK_LIMIT 32000 // NAK limit for a transfer. 0 means NAKs are not counted +#define USB_RETRY_LIMIT 3 // 3 retry limit for a transfer +#define USB_SETTLE_DELAY 200 // settle delay in milliseconds + +#define USB_NUMDEVICES 16 //number of USB devices +//#define HUB_MAX_HUBS 7 // maximum number of hubs that can be attached to the host controller +#define HUB_PORT_RESET_DELAY 20 // hub port reset delay 10 ms recomended, can be up to 20 ms + +/* USB state machine states */ +#define USB_STATE_MASK 0xF0 + +#define USB_STATE_DETACHED 0x10 +#define USB_DETACHED_SUBSTATE_INITIALIZE 0x11 +#define USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE 0x12 +#define USB_DETACHED_SUBSTATE_ILLEGAL 0x13 +#define USB_ATTACHED_SUBSTATE_SETTLE 0x20 +#define USB_ATTACHED_SUBSTATE_RESET_DEVICE 0x30 +#define USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE 0x40 +#define USB_ATTACHED_SUBSTATE_WAIT_SOF 0x50 +#define USB_ATTACHED_SUBSTATE_WAIT_RESET 0x51 +#define USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE 0x60 +#define USB_STATE_ADDRESSING 0x70 +#define USB_STATE_CONFIGURING 0x80 +#define USB_STATE_RUNNING 0x90 +#define USB_STATE_ERROR 0xA0 + +class USBDeviceConfig { +public: + + virtual uint8_t Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) { + return 0; + } + + virtual uint8_t ConfigureDevice(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed __attribute__((unused))) { + return 0; + } + + virtual uint8_t Release() { + return 0; + } + + virtual uint8_t Poll() { + return 0; + } + + virtual uint8_t GetAddress() { + return 0; + } + + virtual void ResetHubPort(uint8_t port __attribute__((unused))) { + return; + } // Note used for hubs only! + + virtual bool VIDPIDOK(uint16_t vid __attribute__((unused)), uint16_t pid __attribute__((unused))) { + return false; + } + + virtual bool DEVCLASSOK(uint8_t klass __attribute__((unused))) { + return false; + } + + virtual bool DEVSUBCLASSOK(uint8_t subklass __attribute__((unused))) { + return true; + } + +}; + +/* USB Setup Packet Structure */ +typedef struct { + + union { // offset description + uint8_t bmRequestType; // 0 Bit-map of request type + + struct { + uint8_t recipient : 5; // Recipient of the request + uint8_t type : 2; // Type of request + uint8_t direction : 1; // Direction of data X-fer + } __attribute__((packed)); + } ReqType_u; + uint8_t bRequest; // 1 Request + + union { + uint16_t wValue; // 2 Depends on bRequest + + struct { + uint8_t wValueLo; + uint8_t wValueHi; + } __attribute__((packed)); + } wVal_u; + uint16_t wIndex; // 4 Depends on bRequest + uint16_t wLength; // 6 Depends on bRequest +} __attribute__((packed)) SETUP_PKT, *PSETUP_PKT; + + + +// Base class for incoming data parser + +class USBReadParser { +public: + virtual void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset) = 0; +}; + +class USB : public MAX3421E { + AddressPoolImpl addrPool; + USBDeviceConfig* devConfig[USB_NUMDEVICES]; + uint8_t bmHubPre; + +public: + USB(); + + void SetHubPreMask() { + bmHubPre |= bmHUBPRE; + }; + + void ResetHubPreMask() { + bmHubPre &= (~bmHUBPRE); + }; + + AddressPool& GetAddressPool() { + return (AddressPool&)addrPool; + }; + + uint8_t RegisterDeviceClass(USBDeviceConfig *pdev) { + for (uint8_t i = 0; i < USB_NUMDEVICES; i++) { + if (!devConfig[i]) { + devConfig[i] = pdev; + return 0; + } + } + return USB_ERROR_UNABLE_TO_REGISTER_DEVICE_CLASS; + }; + + void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) { + addrPool.ForEachUsbDevice(pfunc); + }; + uint8_t getUsbTaskState(); + void setUsbTaskState(uint8_t state); + + EpInfo* getEpInfoEntry(uint8_t addr, uint8_t ep); + uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr); + + /* Control requests */ + uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr); + uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); + + uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p); + + uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr); + uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value); + /**/ + uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction); + uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit); + uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0); + uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); + uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); + + void Task(); + + uint8_t DefaultAddressing(uint8_t parent, uint8_t port, bool lowspeed); + uint8_t Configuring(uint8_t parent, uint8_t port, bool lowspeed); + uint8_t ReleaseDevice(uint8_t addr); + + uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, + uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p); + +private: + void init(); + uint8_t SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_limit); + uint8_t OutTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data); + uint8_t InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0); + uint8_t AttemptConfig(uint8_t driver, uint8_t parent, uint8_t port, bool lowspeed); +}; + +#if 0 //defined(USB_METHODS_INLINE) +//get device descriptor + +inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { + return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr)); +} +//get configuration descriptor + +inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { + return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr)); +} +//get string descriptor + +inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) { + return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr)); +} +//set address + +inline uint8_t USB::setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr) { + return ( ctrlReq(oldaddr, ep, bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000, nullptr)); +} +//set configuration + +inline uint8_t USB::setConf(uint8_t addr, uint8_t ep, uint8_t conf_value) { + return ( ctrlReq(addr, ep, bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000, nullptr)); +} + +#endif // defined(USB_METHODS_INLINE) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h new file mode 100644 index 00000000..373b95a7 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/address.h @@ -0,0 +1,271 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include address.h directly; include Usb.h instead" +#endif + +/* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */ +/* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */ +#define USB_NAK_MAX_POWER 15 //NAK binary order maximum value +#define USB_NAK_DEFAULT 14 //default 32K-1 NAKs before giving up +#define USB_NAK_NOWAIT 1 //Single NAK stops transfer +#define USB_NAK_NONAK 0 //Do not count NAKs, stop retrying after USB Timeout + +struct EpInfo { + uint8_t epAddr; // Endpoint address + uint8_t maxPktSize; // Maximum packet size + + union { + uint8_t epAttribs; + + struct { + uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise + uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise + uint8_t bmNakPower : 6; // Binary order for NAK_LIMIT value + } __attribute__((packed)); + }; +} __attribute__((packed)); + +// 7 6 5 4 3 2 1 0 +// --------------------------------- +// | | H | P | P | P | A | A | A | +// --------------------------------- +// +// H - if 1 the address is a hub address +// P - parent hub address +// A - device address / port number in case of hub +// + +struct UsbDeviceAddress { + union { + struct { + uint8_t bmAddress : 3; // device address/port number + uint8_t bmParent : 3; // parent hub address + uint8_t bmHub : 1; // hub flag + uint8_t bmReserved : 1; // reserved, must be zero + } __attribute__((packed)); + uint8_t devAddress; + }; +} __attribute__((packed)); + +#define bmUSB_DEV_ADDR_ADDRESS 0x07 +#define bmUSB_DEV_ADDR_PARENT 0x38 +#define bmUSB_DEV_ADDR_HUB 0x40 + +struct UsbDevice { + EpInfo *epinfo; // endpoint info pointer + UsbDeviceAddress address; + uint8_t epcount; // number of endpoints + bool lowspeed; // indicates if a device is the low speed one + // uint8_t devclass; // device class +} __attribute__((packed)); + +class AddressPool { + public: + virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) = 0; + virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) = 0; + virtual void FreeAddress(uint8_t addr) = 0; +}; + +typedef void (*UsbDeviceHandleFunc)(UsbDevice *pdev); + +#define ADDR_ERROR_INVALID_INDEX 0xFF +#define ADDR_ERROR_INVALID_ADDRESS 0xFF + +template +class AddressPoolImpl : public AddressPool { + EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device + + uint8_t hubCounter; // hub counter is kept + // in order to avoid hub address duplication + + UsbDevice thePool[MAX_DEVICES_ALLOWED]; + + // Initialize address pool entry + + void InitEntry(uint8_t index) { + thePool[index].address.devAddress = 0; + thePool[index].epcount = 1; + thePool[index].lowspeed = 0; + thePool[index].epinfo = &dev0ep; + } + + // Return thePool index for a given address + + uint8_t FindAddressIndex(uint8_t address = 0) { + for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) + if (thePool[i].address.devAddress == address) + return i; + + return 0; + } + + // Return thePool child index for a given parent + + uint8_t FindChildIndex(UsbDeviceAddress addr, uint8_t start = 1) { + for (uint8_t i = (start < 1 || start >= MAX_DEVICES_ALLOWED) ? 1 : start; i < MAX_DEVICES_ALLOWED; i++) { + if (thePool[i].address.bmParent == addr.bmAddress) + return i; + } + return 0; + } + + // Frees address entry specified by index parameter + + void FreeAddressByIndex(uint8_t index) { + // Zero field is reserved and should not be affected + if (index == 0) return; + + UsbDeviceAddress uda = thePool[index].address; + // If a hub was switched off all port addresses should be freed + if (uda.bmHub == 1) { + for (uint8_t i = 1; (i = FindChildIndex(uda, i));) + FreeAddressByIndex(i); + + // If the hub had the last allocated address, hubCounter should be decremented + if (hubCounter == uda.bmAddress) hubCounter--; + } + InitEntry(index); + } + + // Initialize the whole address pool at once + + void InitAllAddresses() { + for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) + InitEntry(i); + + hubCounter = 0; + } + +public: + + AddressPoolImpl() : hubCounter(0) { + // Zero address is reserved + InitEntry(0); + + thePool[0].address.devAddress = 0; + thePool[0].epinfo = &dev0ep; + dev0ep.epAddr = 0; + dev0ep.maxPktSize = 8; + dev0ep.bmSndToggle = 0; // Set DATA0/1 toggles to 0 + dev0ep.bmRcvToggle = 0; + dev0ep.bmNakPower = USB_NAK_MAX_POWER; + + InitAllAddresses(); + } + + // Return a pointer to a specified address entry + + virtual UsbDevice* GetUsbDevicePtr(uint8_t addr) { + if (!addr) return thePool; + uint8_t index = FindAddressIndex(addr); + return index ? thePool + index : nullptr; + } + + // Perform an operation specified by pfunc for each addressed device + + void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) { + if (pfunc) { + for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) + if (thePool[i].address.devAddress) + pfunc(thePool + i); + } + } + + // Allocate new address + + virtual uint8_t AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 0) { + /* if (parent != 0 && port == 0) + USB_HOST_SERIAL.println("PRT:0"); */ + UsbDeviceAddress _parent; + _parent.devAddress = parent; + if (_parent.bmReserved || port > 7) + //if(parent > 127 || port > 7) + return 0; + + if (is_hub && hubCounter == 7) return 0; + + // finds first empty address entry starting from one + uint8_t index = FindAddressIndex(0); + + if (!index) return 0; // if empty entry is not found + + if (_parent.devAddress == 0) { + if (is_hub) { + thePool[index].address.devAddress = 0x41; + hubCounter++; + } + else + thePool[index].address.devAddress = 1; + + return thePool[index].address.devAddress; + } + + UsbDeviceAddress addr; + addr.devAddress = 0; // Ensure all bits are zero + addr.bmParent = _parent.bmAddress; + if (is_hub) { + addr.bmHub = 1; + addr.bmAddress = ++hubCounter; + } + else { + addr.bmHub = 0; + addr.bmAddress = port; + } + thePool[index].address = addr; + /* + USB_HOST_SERIAL.print("Addr:"); + USB_HOST_SERIAL.print(addr.bmHub, HEX); + USB_HOST_SERIAL.print("."); + USB_HOST_SERIAL.print(addr.bmParent, HEX); + USB_HOST_SERIAL.print("."); + USB_HOST_SERIAL.println(addr.bmAddress, HEX); + */ + return thePool[index].address.devAddress; + } + + // Empty the pool entry + + virtual void FreeAddress(uint8_t addr) { + // if the root hub is disconnected all the addresses should be initialized + if (addr == 0x41) { + InitAllAddresses(); + return; + } + FreeAddressByIndex(FindAddressIndex(addr)); + } + + // Return number of hubs attached + // It can be helpful to find out if hubs are attached when getting the exact number of hubs. + //uint8_t GetNumHubs() { return hubCounter; } + //uint8_t GetNumDevices() { + // uint8_t counter = 0; + // for (uint8_t i = 1; i < MAX_DEVICES_ALLOWED; i++) + // if (thePool[i].address != 0); counter++; + // return counter; + //} +}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h new file mode 100644 index 00000000..9ed35fff --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/confdescparser.h @@ -0,0 +1,201 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include confdescparser.h directly; include Usb.h instead" +#endif + +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 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))) { + } +}; + +#define CP_MASK_COMPARE_CLASS 1 +#define CP_MASK_COMPARE_SUBCLASS 2 +#define CP_MASK_COMPARE_PROTOCOL 4 +#define CP_MASK_COMPARE_ALL 7 + +// Configuration Descriptor Parser Class Template + +template +class ConfigDescParser : public USBReadParser { + UsbConfigXtracter *theXtractor; + MultiValueBuffer theBuffer; + MultiByteValueParser valParser; + ByteSkipper theSkipper; + uint8_t varBuffer[16 /*sizeof(USB_FD_CONFIGURATION_DESCRIPTOR)*/]; + + uint8_t stateParseDescr; // ParseDescriptor state + + uint8_t dscrLen; // Descriptor length + uint8_t dscrType; // Descriptor type + + bool isGoodInterface; // Apropriate interface flag + uint8_t confValue; // Configuration value + uint8_t protoValue; // Protocol value + uint8_t ifaceNumber; // Interface number + uint8_t ifaceAltSet; // Interface alternate settings + + bool UseOr; + bool ParseDescriptor(uint8_t **pp, uint16_t *pcntdn); + void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc); + +public: + + void SetOR() { UseOr = true; } + ConfigDescParser(UsbConfigXtracter *xtractor); + void Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset); +}; + +template +ConfigDescParser::ConfigDescParser(UsbConfigXtracter *xtractor) : + theXtractor(xtractor), + stateParseDescr(0), + dscrLen(0), + dscrType(0), + UseOr(false) { + theBuffer.pValue = varBuffer; + valParser.Initialize(&theBuffer); + theSkipper.Initialize(&theBuffer); + }; + +template +void ConfigDescParser::Parse(const uint16_t len, const uint8_t *pbuf, const uint16_t &offset __attribute__((unused))) { + uint16_t cntdn = (uint16_t)len; + uint8_t *p = (uint8_t*)pbuf; + while (cntdn) if (!ParseDescriptor(&p, &cntdn)) return; +} + +/* Parser for the configuration descriptor. Takes values for class, subclass, protocol fields in interface descriptor and + 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); + switch (stateParseDescr) { + case 0: + theBuffer.valueSize = 2; + valParser.Initialize(&theBuffer); + stateParseDescr = 1; + case 1: + if (!valParser.Parse(pp, pcntdn)) return false; + dscrLen = *((uint8_t*)theBuffer.pValue); + dscrType = *((uint8_t*)theBuffer.pValue + 1); + stateParseDescr = 2; + case 2: + // This is a sort of hack. Assuming that two bytes are all ready in the buffer + // the pointer is positioned two bytes ahead in order for the rest of descriptor + // to be read right after the size and the type fields. + // This should be used carefully. varBuffer should be used directly to handle data + // in the buffer. + theBuffer.pValue = varBuffer + 2; + stateParseDescr = 3; + case 3: + switch (dscrType) { + case USB_DESCRIPTOR_INTERFACE: + isGoodInterface = false; + break; + case USB_DESCRIPTOR_CONFIGURATION: + case USB_DESCRIPTOR_ENDPOINT: + case HID_DESCRIPTOR_HID: + break; + } + theBuffer.valueSize = dscrLen - 2; + valParser.Initialize(&theBuffer); + stateParseDescr = 4; + case 4: + switch (dscrType) { + case USB_DESCRIPTOR_CONFIGURATION: + if (!valParser.Parse(pp, pcntdn)) return false; + confValue = ucd->bConfigurationValue; + break; + case USB_DESCRIPTOR_INTERFACE: + if (!valParser.Parse(pp, pcntdn)) return false; + if ((MASK & CP_MASK_COMPARE_CLASS) && uid->bInterfaceClass != CLASS_ID) + break; + if ((MASK & CP_MASK_COMPARE_SUBCLASS) && uid->bInterfaceSubClass != SUBCLASS_ID) + break; + if (UseOr) { + if ((!((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol))) break; + } + else if ((MASK & CP_MASK_COMPARE_PROTOCOL) && uid->bInterfaceProtocol != PROTOCOL_ID) + break; + isGoodInterface = true; + ifaceNumber = uid->bInterfaceNumber; + ifaceAltSet = uid->bAlternateSetting; + protoValue = uid->bInterfaceProtocol; + break; + 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); + break; + //case HID_DESCRIPTOR_HID: + // if (!valParser.Parse(pp, pcntdn)) return false; + // PrintHidDescriptor((const USB_HID_DESCRIPTOR*)varBuffer); + // break; + default: + if (!theSkipper.Skip(pp, pcntdn, dscrLen - 2)) return false; + } + theBuffer.pValue = varBuffer; + stateParseDescr = 0; + } + return true; +} + +template +void ConfigDescParser::PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc) { + Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80); + Notify(PSTR("bDescLength:\t\t"), 0x80); + PrintHex (pDesc->bLength, 0x80); + + Notify(PSTR("\r\nbDescriptorType:\t"), 0x80); + PrintHex (pDesc->bDescriptorType, 0x80); + + Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80); + PrintHex (pDesc->bcdHID, 0x80); + + Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80); + PrintHex (pDesc->bCountryCode, 0x80); + + Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80); + PrintHex (pDesc->bNumDescriptors, 0x80); + + for (uint8_t i = 0; i < pDesc->bNumDescriptors; i++) { + HID_CLASS_DESCRIPTOR_LEN_AND_TYPE *pLT = (HID_CLASS_DESCRIPTOR_LEN_AND_TYPE*)&(pDesc->bDescrType); + + Notify(PSTR("\r\nbDescrType:\t\t"), 0x80); + PrintHex (pLT[i].bDescrType, 0x80); + + Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80); + PrintHex (pLT[i].wDescriptorLength, 0x80); + } + Notify(PSTR("\r\n"), 0x80); +} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h new file mode 100644 index 00000000..c948e5ab --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/hexdump.h @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include hexdump.h directly; include Usb.h instead" +#endif + +extern int UsbDEBUGlvl; + +template +class HexDumper : public BASE_CLASS { + uint8_t byteCount; + OFFSET_TYPE byteTotal; + +public: + + HexDumper() : byteCount(0), byteTotal(0) { + }; + + void Initialize() { + byteCount = 0; + byteTotal = 0; + }; + + void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset); +}; + +template +void HexDumper::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset __attribute__((unused))) { + if (UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug. + for (LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) { + if (!byteCount) { + PrintHex (byteTotal, 0x80); + E_Notify(PSTR(": "), 0x80); + } + PrintHex (pbuf[j], 0x80); + E_Notify(PSTR(" "), 0x80); + + if (byteCount == 15) { + E_Notify(PSTR("\r\n"), 0x80); + byteCount = 0xFF; + } + } + } +} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h new file mode 100644 index 00000000..8cb5b6bf --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/macros.h @@ -0,0 +1,86 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include macros.h directly; include Usb.h instead" +#endif + +//////////////////////////////////////////////////////////////////////////////// +// HANDY MACROS +//////////////////////////////////////////////////////////////////////////////// + +#define VALUE_BETWEEN(v,l,h) (((v)>(l)) && ((v)<(h))) +#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h))) +#define output_pgm_message(wa,fp,mp,el) wa = &mp, fp((char *)pgm_read_pointer(wa), el) +#define output_if_between(v,l,h,wa,fp,mp,el) if (VALUE_BETWEEN(v,l,h)) output_pgm_message(wa,fp,mp[v-(l+1)],el); + +#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) +#ifndef __BYTE_GRABBING_DEFINED__ +#define __BYTE_GRABBING_DEFINED__ 1 +#ifdef BROKEN_OPTIMIZER_LITTLE_ENDIAN +// Note: Use this if your compiler generates horrible assembler! +#define BGRAB0(__usi__) (((uint8_t *)&(__usi__))[0]) +#define BGRAB1(__usi__) (((uint8_t *)&(__usi__))[1]) +#define BGRAB2(__usi__) (((uint8_t *)&(__usi__))[2]) +#define BGRAB3(__usi__) (((uint8_t *)&(__usi__))[3]) +#define BGRAB4(__usi__) (((uint8_t *)&(__usi__))[4]) +#define BGRAB5(__usi__) (((uint8_t *)&(__usi__))[5]) +#define BGRAB6(__usi__) (((uint8_t *)&(__usi__))[6]) +#define BGRAB7(__usi__) (((uint8_t *)&(__usi__))[7]) +#else +// Note: The cast alone to uint8_t is actually enough. +// GCC throws out the "& 0xFF", and the size is no different. +// Some compilers need it. +#define BGRAB0(__usi__) ((uint8_t)((__usi__) & 0xFF )) +#define BGRAB1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xFF)) +#define BGRAB2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xFF)) +#define BGRAB3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xFF)) +#define BGRAB4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xFF)) +#define BGRAB5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xFF)) +#define BGRAB6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xFF)) +#define BGRAB7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xFF)) +#endif +#define BOVER1(__usi__) ((uint16_t)(__usi__) << 8) +#define BOVER2(__usi__) ((uint32_t)(__usi__) << 16) +#define BOVER3(__usi__) ((uint32_t)(__usi__) << 24) +#define BOVER4(__usi__) ((uint64_t)(__usi__) << 32) +#define BOVER5(__usi__) ((uint64_t)(__usi__) << 40) +#define BOVER6(__usi__) ((uint64_t)(__usi__) << 48) +#define BOVER7(__usi__) ((uint64_t)(__usi__) << 56) + +// These are the smallest and fastest ways I have found so far in pure C/C++. +#define BMAKE16(__usc1__,__usc0__) ((uint16_t)((uint16_t)(__usc0__) | (uint16_t)BOVER1(__usc1__))) +#define BMAKE32(__usc3__,__usc2__,__usc1__,__usc0__) ((uint32_t)((uint32_t)(__usc0__) | (uint32_t)BOVER1(__usc1__) | (uint32_t)BOVER2(__usc2__) | (uint32_t)BOVER3(__usc3__))) +#define BMAKE64(__usc7__,__usc6__,__usc5__,__usc4__,__usc3__,__usc2__,__usc1__,__usc0__) ((uint64_t)((uint64_t)__usc0__ | (uint64_t)BOVER1(__usc1__) | (uint64_t)BOVER2(__usc2__) | (uint64_t)BOVER3(__usc3__) | (uint64_t)BOVER4(__usc4__) | (uint64_t)BOVER5(__usc5__) | (uint64_t)BOVER6(__usc6__) | (uint64_t)BOVER1(__usc7__))) +#endif + +/* + * Debug macros: Strings are stored in progmem (flash) instead of RAM. + */ +#define USBTRACE(s) (Notify(PSTR(s), 0x80)) +#define USBTRACE1(s,l) (Notify(PSTR(s), l)) +#define USBTRACE2(s,r) (Notify(PSTR(s), 0x80), D_PrintHex((r), 0x80), Notify(PSTR("\r\n"), 0x80)) +#define USBTRACE3(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l), Notify(PSTR("\r\n"), l)) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp new file mode 100644 index 00000000..a84a6832 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.cpp @@ -0,0 +1,1217 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) + +#include "masstorage.h" + +const uint8_t BulkOnly::epDataInIndex = 1; +const uint8_t BulkOnly::epDataOutIndex = 2; +const uint8_t BulkOnly::epInterruptInIndex = 3; + +//////////////////////////////////////////////////////////////////////////////// +// Interface code +//////////////////////////////////////////////////////////////////////////////// + +/** + * Get the capacity of the media + * + * @param lun Logical Unit Number + * @return media capacity + */ +uint32_t BulkOnly::GetCapacity(uint8_t lun) { + return LUNOk[lun] ? CurrentCapacity[lun] : 0UL; +} + +/** + * Get the sector (block) size used on the media + * + * @param lun Logical Unit Number + * @return media sector size + */ +uint16_t BulkOnly::GetSectorSize(uint8_t lun) { + return LUNOk[lun] ? CurrentSectorSize[lun] : 0U; +} + +/** + * Test if LUN is ready for use + * + * @param lun Logical Unit Number + * @return true if LUN is ready for use + */ +bool BulkOnly::LUNIsGood(uint8_t lun) { return LUNOk[lun]; } + +/** + * Test if LUN is write protected + * + * @param lun Logical Unit Number + * @return cached status of write protect switch + */ +bool BulkOnly::WriteProtected(uint8_t lun) { return WriteOk[lun]; } + +/** + * Wrap and execute a SCSI CDB with length of 6 + * + * @param cdb CDB to execute + * @param buf_size Size of expected transaction + * @param buf Buffer + * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT + * @return + */ +uint8_t BulkOnly::SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { + // promote buf_size to 32bits. + CommandBlockWrapper cbw = CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); + //SetCurLUN(cdb->LUN); + return (HandleSCSIError(Transaction(&cbw, buf_size, buf))); +} + +/** + * Wrap and execute a SCSI CDB with length of 10 + * + * @param cdb CDB to execute + * @param buf_size Size of expected transaction + * @param buf Buffer + * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT + * @return + */ +uint8_t BulkOnly::SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { + // promote buf_size to 32bits. + CommandBlockWrapper cbw = CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); + //SetCurLUN(cdb->LUN); + return (HandleSCSIError(Transaction(&cbw, buf_size, buf))); +} + +/** + * Lock or Unlock the tray or door on device. + * Caution: Some devices with buggy firmware will lock up. + * + * @param lun Logical Unit Number + * @param lock 1 to lock, 0 to unlock + * @return + */ +uint8_t BulkOnly::LockMedia(uint8_t lun, uint8_t lock) { + Notify(PSTR("\r\nLockMedia\r\n"), 0x80); + Notify(PSTR("---------\r\n"), 0x80); + + CDB6_t cdb = CDB6_t(SCSI_CMD_PREVENT_REMOVAL, lun, (uint8_t)0, lock); + return SCSITransaction6(&cdb, (uint16_t)0, nullptr, (uint8_t)MASS_CMD_DIR_IN); +} + +/** + * Media control, for spindle motor and media tray or door. + * This includes CDROM, TAPE and anything with a media loader. + * + * @param lun Logical Unit Number + * @param ctl 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media + * @return 0 on success + */ +uint8_t BulkOnly::MediaCTL(uint8_t lun, uint8_t ctl) { + Notify(PSTR("\r\nMediaCTL\r\n"), 0x80); + Notify(PSTR("-----------------\r\n"), 0x80); + + uint8_t rcode = MASS_ERR_UNIT_NOT_READY; + if (bAddress) { + CDB6_t cdb = CDB6_t(SCSI_CMD_START_STOP_UNIT, lun, ctl & 0x03, 0); + rcode = SCSITransaction6(&cdb, (uint16_t)0, nullptr, (uint8_t)MASS_CMD_DIR_OUT); + } + else + SetCurLUN(lun); + + return rcode; +} + +/** + * Read data from media + * + * @param lun Logical Unit Number + * @param addr LBA address on media to read + * @param bsize size of a block (we should probably use the cached size) + * @param blocks how many blocks to read + * @param buf memory that is able to hold the requested data + * @return 0 on success + */ +uint8_t BulkOnly::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) { + if (!LUNOk[lun]) return MASS_ERR_NO_MEDIA; + Notify(PSTR("\r\nRead LUN:\t"), 0x80); + D_PrintHex (lun, 0x90); + Notify(PSTR("\r\nLBA:\t\t"), 0x90); + D_PrintHex (addr, 0x90); + Notify(PSTR("\r\nblocks:\t\t"), 0x90); + D_PrintHex (blocks, 0x90); + Notify(PSTR("\r\nblock size:\t"), 0x90); + D_PrintHex (bsize, 0x90); + Notify(PSTR("\r\n---------\r\n"), 0x80); + CDB10_t cdb = CDB10_t(SCSI_CMD_READ_10, lun, blocks, addr); + +again: + uint8_t er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), buf, (uint8_t)MASS_CMD_DIR_IN); + + if (er == MASS_ERR_STALL) { + MediaCTL(lun, 1); + delay(150); + if (!TestUnitReady(lun)) goto again; + } + return er; +} + +/** + * Write data to media + * + * @param lun Logical Unit Number + * @param addr LBA address on media to write + * @param bsize size of a block (we should probably use the cached size) + * @param blocks how many blocks to write + * @param buf memory that contains the data to write + * @return 0 on success + */ +uint8_t BulkOnly::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) { + if (!LUNOk[lun]) return MASS_ERR_NO_MEDIA; + if (!WriteOk[lun]) return MASS_ERR_WRITE_PROTECTED; + Notify(PSTR("\r\nWrite LUN:\t"), 0x80); + D_PrintHex (lun, 0x90); + Notify(PSTR("\r\nLBA:\t\t"), 0x90); + D_PrintHex (addr, 0x90); + Notify(PSTR("\r\nblocks:\t\t"), 0x90); + D_PrintHex (blocks, 0x90); + Notify(PSTR("\r\nblock size:\t"), 0x90); + D_PrintHex (bsize, 0x90); + Notify(PSTR("\r\n---------\r\n"), 0x80); + CDB10_t cdb = CDB10_t(SCSI_CMD_WRITE_10, lun, blocks, addr); + +again: + uint8_t er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), (void*)buf, (uint8_t)MASS_CMD_DIR_OUT); + + if (er == MASS_ERR_WRITE_STALL) { + MediaCTL(lun, 1); + delay(150); + if (!TestUnitReady(lun)) goto again; + } + return er; +} + +// End of user functions, the remaining code below is driver internals. +// Only developer serviceable parts below! + +//////////////////////////////////////////////////////////////////////////////// +// Main driver code +//////////////////////////////////////////////////////////////////////////////// + +BulkOnly::BulkOnly(USB *p) : +pUsb(p), +bAddress(0), +bIface(0), +bNumEP(1), +qNextPollTime(0), +bPollEnable(false), +//dCBWTag(0), +bLastUsbError(0) { + ClearAllEP(); + dCBWTag = 0; + if (pUsb) pUsb->RegisterDeviceClass(this); +} + +/** + * USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET == success + * We need to standardize either the rcode, or change the API to return values + * so a signal that additional actions are required can be produced. + * Some of these codes do exist already. + * + * TECHNICAL: We could do most of this code elsewhere, with the exception of checking the class instance. + * Doing so would save some program memory when using multiple drivers. + * + * @param parent USB address of parent + * @param port address of port on parent + * @param lowspeed true if device is low speed + * @return + */ +uint8_t BulkOnly::ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed) { + + const uint8_t constBufSize = sizeof (USB_FD_DEVICE_DESCRIPTOR); + + uint8_t buf[constBufSize]; + USB_FD_DEVICE_DESCRIPTOR * udd = reinterpret_cast(buf); + uint8_t rcode; + UsbDevice *p = nullptr; + EpInfo *oldep_ptr = nullptr; + USBTRACE("MS ConfigureDevice\r\n"); + ClearAllEP(); + AddressPool &addrPool = pUsb->GetAddressPool(); + + if (bAddress) return USB_ERROR_CLASS_INSTANCE_ALREADY_IN_USE; + + // + // Get pointer to pseudo device with address 0 assigned + p = addrPool.GetUsbDevicePtr(0); + if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + if (!p->epinfo) { + USBTRACE("epinfo\r\n"); + return USB_ERROR_EPINFO_IS_NULL; + } + + // Save old pointer to EP_RECORD of address 0 + oldep_ptr = p->epinfo; + + // Temporary assign new pointer to epInfo to p->epinfo in order to avoid toggle inconsistence + p->epinfo = epInfo; + + p->lowspeed = lowspeed; + // Get device descriptor + rcode = pUsb->getDevDescr(0, 0, constBufSize, (uint8_t*)buf); + + // Restore p->epinfo + p->epinfo = oldep_ptr; + + if (rcode) goto FailGetDevDescr; + + // Allocate new address according to device class + bAddress = addrPool.AllocAddress(parent, false, port); + + if (!bAddress) return USB_ERROR_OUT_OF_ADDRESS_SPACE_IN_POOL; + + // Extract Max Packet Size from the device descriptor + epInfo[0].maxPktSize = udd->bMaxPacketSize0; + // Steal and abuse from epInfo structure to save on memory. + epInfo[1].epAddr = udd->bNumConfigurations; + // + return USB_ERROR_CONFIG_REQUIRES_ADDITIONAL_RESET; + +FailGetDevDescr: + + #ifdef DEBUG_USB_HOST + NotifyFailGetDevDescr(rcode); + #endif + rcode = USB_ERROR_FailGetDevDescr; + + Release(); + return rcode; +} + +/** + * @param parent (not used) + * @param port (not used) + * @param lowspeed true if device is low speed + * @return 0 for success + */ +uint8_t BulkOnly::Init(uint8_t parent __attribute__((unused)), uint8_t port __attribute__((unused)), bool lowspeed) { + uint8_t rcode; + uint8_t num_of_conf = epInfo[1].epAddr; // number of configurations + epInfo[1].epAddr = 0; + USBTRACE("MS Init\r\n"); + + AddressPool &addrPool = pUsb->GetAddressPool(); + UsbDevice *p = addrPool.GetUsbDevicePtr(bAddress); + + if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + // Assign new address to the device + delay(2000); + rcode = pUsb->setAddr(0, 0, bAddress); + + if (rcode) { + p->lowspeed = false; + addrPool.FreeAddress(bAddress); + bAddress = 0; + USBTRACE2("setAddr:", rcode); + return rcode; + } + + USBTRACE2("Addr:", bAddress); + + p->lowspeed = false; + + p = addrPool.GetUsbDevicePtr(bAddress); + + if (!p) return USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL; + + p->lowspeed = lowspeed; + + // Assign epInfo to epinfo pointer + rcode = pUsb->setEpInfoEntry(bAddress, 1, epInfo); + + if (rcode) goto FailSetDevTblEntry; + + USBTRACE2("NC:", num_of_conf); + + for (uint8_t i = 0; i < num_of_conf; i++) { + ConfigDescParser< USB_CLASS_MASS_STORAGE, + MASS_SUBCLASS_SCSI, + MASS_PROTO_BBB, + CP_MASK_COMPARE_CLASS | + CP_MASK_COMPARE_SUBCLASS | + CP_MASK_COMPARE_PROTOCOL > BulkOnlyParser(this); + + rcode = pUsb->getConfDescr(bAddress, 0, i, &BulkOnlyParser); + + if (rcode) goto FailGetConfDescr; + + if (bNumEP > 1) break; + } + + if (bNumEP < 3) return USB_DEV_CONFIG_ERROR_DEVICE_NOT_SUPPORTED; + + // Assign epInfo to epinfo pointer + pUsb->setEpInfoEntry(bAddress, bNumEP, epInfo); + + USBTRACE2("Conf:", bConfNum); + + // Set Configuration Value + rcode = pUsb->setConf(bAddress, 0, bConfNum); + + if (rcode) goto FailSetConfDescr; + + //Linux does a 1sec delay after this. + delay(1000); + + rcode = GetMaxLUN(&bMaxLUN); + if (rcode) goto FailGetMaxLUN; + + if (bMaxLUN >= MASS_MAX_SUPPORTED_LUN) bMaxLUN = MASS_MAX_SUPPORTED_LUN - 1; + ErrorMessage (PSTR("MaxLUN"), bMaxLUN); + + delay(1000); // Delay a bit for slow firmware. + + for (uint8_t lun = 0; lun <= bMaxLUN; lun++) { + InquiryResponse response; + rcode = Inquiry(lun, sizeof (InquiryResponse), (uint8_t*) & response); + if (rcode) { + ErrorMessage (PSTR("Inquiry"), rcode); + } + else { + #if 0 + printf("LUN %i `", lun); + uint8_t *buf = response.VendorID; + for (int i = 0; i < 28; i++) printf("%c", buf[i]); + printf("'\r\nQualifier %1.1X ", response.PeripheralQualifier); + printf("Device type %2.2X ", response.DeviceType); + printf("RMB %1.1X ", response.Removable); + printf("SSCS %1.1X ", response.SCCS); + uint8_t sv = response.Version; + printf("SCSI version %2.2X\r\nDevice conforms to ", sv); + switch (sv) { + case 0: + printf("No specific"); + break; + case 1: + printf("ANSI X3.131-1986 (ANSI 1)"); + break; + case 2: + printf("ANSI X3.131-1994 (ANSI 2)"); + break; + case 3: + printf("ANSI INCITS 301-1997 (SPC)"); + break; + case 4: + printf("ANSI INCITS 351-2001 (SPC-2)"); + break; + case 5: + printf("ANSI INCITS 408-2005 (SPC-4)"); + break; + case 6: + printf("T10/1731-D (SPC-4)"); + break; + default: printf("unknown"); + } + printf(" standards.\r\n"); + #endif + + uint8_t tries = 0xF0; + while ((rcode = TestUnitReady(lun))) { + if (rcode == 0x08) break; // break on no media, this is OK to do. + // try to lock media and spin up + if (tries < 14) { + LockMedia(lun, 1); + MediaCTL(lun, 1); // I actually have a USB stick that needs this! + } else + delay(2 * (tries + 1)); + tries++; + if (!tries) break; + } + if (!rcode) { + delay(1000); + LUNOk[lun] = CheckLUN(lun); + if (!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun); + } + } + } + + CheckMedia(); + + rcode = OnInit(); + + if (rcode) goto FailOnInit; + + #ifdef DEBUG_USB_HOST + USBTRACE("MS configured\r\n\r\n"); + #endif + + bPollEnable = true; + + //USBTRACE("Poll enabled\r\n"); + return 0; + + FailSetConfDescr: + + #ifdef DEBUG_USB_HOST + NotifyFailSetConfDescr(); + goto Fail; + #endif + + FailOnInit: + + #ifdef DEBUG_USB_HOST + USBTRACE("OnInit:"); + goto Fail; + #endif + + FailGetMaxLUN: + + #ifdef DEBUG_USB_HOST + USBTRACE("GetMaxLUN:"); + goto Fail; + #endif + + //#ifdef DEBUG_USB_HOST + // FailInvalidSectorSize: + // USBTRACE("Sector Size is NOT VALID: "); + // goto Fail; + //#endif + + FailSetDevTblEntry: + #ifdef DEBUG_USB_HOST + NotifyFailSetDevTblEntry(); + goto Fail; + #endif + + FailGetConfDescr: + #ifdef DEBUG_USB_HOST + NotifyFailGetConfDescr(); + #endif + + #ifdef DEBUG_USB_HOST + Fail: + NotifyFail(rcode); + #endif + Release(); + return rcode; +} + +/** + * For driver use only. + * + * @param conf + * @param iface + * @param alt + * @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) { + ErrorMessage (PSTR("Conf.Val"), conf); + ErrorMessage (PSTR("Iface Num"), iface); + ErrorMessage (PSTR("Alt.Set"), alt); + + bConfNum = conf; + + uint8_t index; + + #if 1 + if ((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_BULK) { + index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex; + // Fill in the endpoint info structure + epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F); + epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize; + epInfo[index].bmSndToggle = 0; + epInfo[index].bmRcvToggle = 0; + + bNumEP++; + + PrintEndpointDescriptor(pep); + } + #else + if ((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_INTERRUPT && (pep->bEndpointAddress & 0x80) == 0x80) + index = epInterruptInIndex; + else if ((pep->bmAttributes & bmUSB_TRANSFER_TYPE) == USB_TRANSFER_TYPE_BULK) + index = ((pep->bEndpointAddress & 0x80) == 0x80) ? epDataInIndex : epDataOutIndex; + else + return; + + // Fill in the endpoint info structure + epInfo[index].epAddr = (pep->bEndpointAddress & 0x0F); + epInfo[index].maxPktSize = (uint8_t)pep->wMaxPacketSize; + epInfo[index].bmSndToggle = 0; + epInfo[index].bmRcvToggle = 0; + + bNumEP++; + + PrintEndpointDescriptor(pep); + #endif +} + +/** + * For driver use only. + * + * @return + */ +uint8_t BulkOnly::Release() { + ClearAllEP(); + pUsb->GetAddressPool().FreeAddress(bAddress); + return 0; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @return true if LUN is ready for use. + */ +bool BulkOnly::CheckLUN(uint8_t lun) { + uint8_t rcode; + Capacity capacity; + for (uint8_t i = 0; i < 8; i++) capacity.data[i] = 0; + + rcode = ReadCapacity10(lun, (uint8_t*)capacity.data); + if (rcode) { + //printf(">>>>>>>>>>>>>>>>ReadCapacity returned %i\r\n", rcode); + return false; + } + ErrorMessage (PSTR(">>>>>>>>>>>>>>>>CAPACITY OK ON LUN"), lun); + for (uint8_t i = 0; i < 8 /*sizeof (Capacity)*/; i++) + D_PrintHex (capacity.data[i], 0x80); + Notify(PSTR("\r\n\r\n"), 0x80); + + // Only 512/1024/2048/4096 are valid values! + uint32_t c = BMAKE32(capacity.data[4], capacity.data[5], capacity.data[6], capacity.data[7]); + if (c != 0x0200UL && c != 0x0400UL && c != 0x0800UL && c != 0x1000UL) return false; + + // Store capacity information. + CurrentSectorSize[lun] = (uint16_t)(c); // & 0xFFFF); + + CurrentCapacity[lun] = BMAKE32(capacity.data[0], capacity.data[1], capacity.data[2], capacity.data[3]) + 1; + if (CurrentCapacity[lun] == /*0xFFFFFFFFUL */ 0x01UL || CurrentCapacity[lun] == 0x00UL) { + // Buggy firmware will report 0xFFFFFFFF or 0 for no media + if (CurrentCapacity[lun]) + ErrorMessage (PSTR(">>>>>>>>>>>>>>>>BUGGY FIRMWARE. CAPACITY FAIL ON LUN"), lun); + return false; + } + delay(20); + Page3F(lun); + return !TestUnitReady(lun); +} + +/** + * For driver use only. + * + * Scan for media change on all LUNs + */ +void BulkOnly::CheckMedia() { + for (uint8_t lun = 0; lun <= bMaxLUN; lun++) { + if (TestUnitReady(lun)) { + LUNOk[lun] = false; + continue; + } + if (!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun); + } + #if 0 + printf("}}}}}}}}}}}}}}}}STATUS "); + for (uint8_t lun = 0; lun <= bMaxLUN; lun++) + printf(LUNOk[lun] ? "#" : "."); + printf("\r\n"); + #endif + qNextPollTime = (uint32_t)millis() + 2000; +} + +/** + * For driver use only. + * + * @return + */ +uint8_t BulkOnly::Poll() { + //uint8_t rcode = 0; + if (!bPollEnable) return 0; + if ((int32_t)((uint32_t)millis() - qNextPollTime) >= 0L) CheckMedia(); + //rcode = 0; + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// +// SCSI code +//////////////////////////////////////////////////////////////////////////////// + +/** + * For driver use only. + * + * @param plun + * @return + */ +uint8_t BulkOnly::GetMaxLUN(uint8_t *plun) { + uint8_t ret = pUsb->ctrlReq(bAddress, 0, bmREQ_MASSIN, MASS_REQ_GET_MAX_LUN, 0, 0, bIface, 1, 1, plun, nullptr); + + if (ret == hrSTALL) + *plun = 0; + + return 0; +} + +/** + * For driver use only. Used during Driver Init + * + * @param lun Logical Unit Number + * @param bsize + * @param buf + * @return + */ +uint8_t BulkOnly::Inquiry(uint8_t lun, uint16_t bsize, uint8_t *buf) { + Notify(PSTR("\r\nInquiry\r\n"), 0x80); + Notify(PSTR("---------\r\n"), 0x80); + + CDB6_t cdb = CDB6_t(SCSI_CMD_INQUIRY, lun, 0UL, (uint8_t)bsize, 0); + uint8_t rc = SCSITransaction6(&cdb, bsize, buf, (uint8_t)MASS_CMD_DIR_IN); + + return rc; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @return + */ +uint8_t BulkOnly::TestUnitReady(uint8_t lun) { + //SetCurLUN(lun); + if (!bAddress) + return MASS_ERR_UNIT_NOT_READY; + + Notify(PSTR("\r\nTestUnitReady\r\n"), 0x80); + Notify(PSTR("-----------------\r\n"), 0x80); + + CDB6_t cdb = CDB6_t(SCSI_CMD_TEST_UNIT_READY, lun, (uint8_t)0, 0); + return SCSITransaction6(&cdb, 0, nullptr, (uint8_t)MASS_CMD_DIR_IN); + +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @param pc + * @param page + * @param subpage + * @param len + * @param pbuf + * @return + */ +uint8_t BulkOnly::ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t * pbuf) { + Notify(PSTR("\r\rModeSense\r\n"), 0x80); + Notify(PSTR("------------\r\n"), 0x80); + + CDB6_t cdb = CDB6_t(SCSI_CMD_MODE_SENSE_6, lun, (uint32_t)((((pc << 6) | page) << 8) | subpage), len, 0); + return SCSITransaction6(&cdb, len, pbuf, (uint8_t)MASS_CMD_DIR_IN); +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @param bsize + * @param buf + * @return + */ +uint8_t BulkOnly::ReadCapacity10(uint8_t lun, uint8_t *buf) { + Notify(PSTR("\r\nReadCapacity\r\n"), 0x80); + Notify(PSTR("---------------\r\n"), 0x80); + + CDB10_t cdb = CDB10_t(SCSI_CMD_READ_CAPACITY_10, lun); + return SCSITransaction10(&cdb, 8, buf, (uint8_t)MASS_CMD_DIR_IN); +} + +/** + * For driver use only. + * + * Page 3F contains write protect status. + * + * @param lun Logical Unit Number to test. + * @return Write protect switch status. + */ +uint8_t BulkOnly::Page3F(uint8_t lun) { + uint8_t buf[192]; + for (int i = 0; i < 192; i++) { + buf[i] = 0x00; + } + WriteOk[lun] = true; + #ifdef SKIP_WRITE_PROTECT + return 0; + #endif + uint8_t rc = ModeSense6(lun, 0, 0x3F, 0, 192, buf); + if (!rc) { + WriteOk[lun] = ((buf[2] & 0x80) == 0); + Notify(PSTR("Mode Sense: "), 0x80); + for (int i = 0; i < 4; i++) { + D_PrintHex (buf[i], 0x80); + Notify(PSTR(" "), 0x80); + } + Notify(PSTR("\r\n"), 0x80); + } + return rc; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @param size + * @param buf + * @return + */ +uint8_t BulkOnly::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) { + Notify(PSTR("\r\nRequestSense\r\n"), 0x80); + Notify(PSTR("----------------\r\n"), 0x80); + + CDB6_t cdb = CDB6_t(SCSI_CMD_REQUEST_SENSE, lun, 0UL, (uint8_t)size, 0); + CommandBlockWrapper cbw = CommandBlockWrapper(++dCBWTag, (uint32_t)size, &cdb, (uint8_t)MASS_CMD_DIR_IN); + //SetCurLUN(lun); + return Transaction(&cbw, size, buf); +} + + +//////////////////////////////////////////////////////////////////////////////// +// USB code +//////////////////////////////////////////////////////////////////////////////// + +/** + * For driver use only. + * + * @param index + * @return + */ +uint8_t BulkOnly::ClearEpHalt(uint8_t index) { + if (index == 0) + return 0; + + uint8_t ret = 0; + + while ((ret = (pUsb->ctrlReq(bAddress, 0, USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT, USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, ((index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr), 0, 0, nullptr, nullptr)) == 0x01)) + delay(6); + + if (ret) { + ErrorMessage (PSTR("ClearEpHalt"), ret); + ErrorMessage (PSTR("EP"), ((index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr)); + return ret; + } + epInfo[index].bmSndToggle = 0; + epInfo[index].bmRcvToggle = 0; + return 0; +} + +/** + * For driver use only. + */ +void BulkOnly::Reset() { + while (pUsb->ctrlReq(bAddress, 0, bmREQ_MASSOUT, MASS_REQ_BOMSR, 0, 0, bIface, 0, 0, nullptr, nullptr) == 0x01) delay(6); +} + +/** + * For driver use only. + * + * @return 0 if successful + */ +uint8_t BulkOnly::ResetRecovery() { + Notify(PSTR("\r\nResetRecovery\r\n"), 0x80); + Notify(PSTR("-----------------\r\n"), 0x80); + + delay(6); + Reset(); + delay(6); + ClearEpHalt(epDataInIndex); + delay(6); + bLastUsbError = ClearEpHalt(epDataOutIndex); + delay(6); + return bLastUsbError; +} + +/** + * For driver use only. + * + * Clear all EP data and clear all LUN status + */ +void BulkOnly::ClearAllEP() { + for (uint8_t i = 0; i < MASS_MAX_ENDPOINTS; i++) { + epInfo[i].epAddr = 0; + epInfo[i].maxPktSize = (i) ? 0 : 8; + epInfo[i].bmSndToggle = 0; + epInfo[i].bmRcvToggle = 0; + epInfo[i].bmNakPower = USB_NAK_DEFAULT; + } + + for (uint8_t i = 0; i < MASS_MAX_SUPPORTED_LUN; i++) { + LUNOk[i] = false; + WriteOk[i] = false; + CurrentCapacity[i] = 0UL; + CurrentSectorSize[i] = 0; + } + + bIface = 0; + bNumEP = 1; + bAddress = 0; + qNextPollTime = 0; + bPollEnable = false; + bLastUsbError = 0; + bMaxLUN = 0; + bTheLUN = 0; +} + +/** + * For driver use only. + * + * @param pcsw + * @param pcbw + * @return + */ +bool BulkOnly::IsValidCSW(CommandStatusWrapper *pcsw, CommandBlockWrapperBase *pcbw) { + if (pcsw->dCSWSignature != MASS_CSW_SIGNATURE) { + Notify(PSTR("CSW:Sig error\r\n"), 0x80); + return false; + } + if (pcsw->dCSWTag != pcbw->dCBWTag) { + Notify(PSTR("CSW:Wrong tag\r\n"), 0x80); + return false; + } + return true; +} + +/** + * For driver use only. + * + * @param error + * @param index + * @return + */ +uint8_t BulkOnly::HandleUsbError(uint8_t error, uint8_t index) { + uint8_t count = 3; + + bLastUsbError = error; + //if (error) + //ClearEpHalt(index); + while (error && count) { + if (error != hrSUCCESS) { + ErrorMessage (PSTR("USB Error"), error); + ErrorMessage (PSTR("Index"), index); + } + switch (error) { + // case hrWRONGPID: + case hrSUCCESS: return MASS_ERR_SUCCESS; + case hrBUSY: return MASS_ERR_UNIT_BUSY; // SIE is busy, just hang out and try again. + case hrTIMEOUT: + case hrJERR: return MASS_ERR_DEVICE_DISCONNECTED; + case hrSTALL: + if (index) { + ClearEpHalt(index); + return (index == epDataInIndex) ? MASS_ERR_STALL : MASS_ERR_WRITE_STALL; + } + return MASS_ERR_STALL; + + case hrNAK: + return index ? MASS_ERR_UNIT_BUSY : MASS_ERR_UNIT_BUSY; + + case hrTOGERR: + // Handle a super rare corner case, where toggles become de-synced. + // I've only run into one device that has this firmware bug, and this is + // the only clean way to get back into sync with the buggy device firmware. + // --AJK + if (bAddress && bConfNum) { + error = pUsb->setConf(bAddress, 0, bConfNum); + if (error) break; + } + return MASS_ERR_SUCCESS; + default: + ErrorMessage (PSTR("\r\nUSB"), error); + return MASS_ERR_GENERAL_USB_ERROR; + } + count--; + } // while + + return ((error && !count) ? MASS_ERR_GENERAL_USB_ERROR : MASS_ERR_SUCCESS); +} + +#if MS_WANT_PARSER + uint8_t BulkOnly::Transaction(CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf) { + return Transaction(CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf, 0); + } +#endif + +/** + * For driver use only. + * + * @param pcbw + * @param buf_size + * @param buf + * @param flags + * @return + */ +uint8_t BulkOnly::Transaction(CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf + #if MS_WANT_PARSER + , uint8_t flags + #endif +) { + #if MS_WANT_PARSER + uint16_t bytes = (pcbw->dCBWDataTransferLength > buf_size) ? buf_size : pcbw->dCBWDataTransferLength; + printf("Transfersize %i\r\n", bytes); + delay(1000); + + bool callback = (flags & MASS_TRANS_FLG_CALLBACK) == MASS_TRANS_FLG_CALLBACK; + #else + uint16_t bytes = buf_size; + #endif + + bool write = (pcbw->bmCBWFlags & MASS_CMD_DIR_IN) != MASS_CMD_DIR_IN; + uint8_t ret = 0; + uint8_t usberr; + CommandStatusWrapper csw; // up here, we allocate ahead to save cpu cycles. + SetCurLUN(pcbw->bmCBWLUN); + ErrorMessage (PSTR("CBW.dCBWTag"), pcbw->dCBWTag); + + while ((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (CommandBlockWrapper), (uint8_t*)pcbw)) == hrBUSY) delay(1); + + ret = HandleUsbError(usberr, epDataOutIndex); + //ret = HandleUsbError(pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (CommandBlockWrapper), (uint8_t*)pcbw), epDataOutIndex); + if (ret) + ErrorMessage (PSTR("============================ CBW"), ret); + else { + if (bytes) { + if (!write) { + #if MS_WANT_PARSER + if (callback) { + uint8_t rbuf[bytes]; + while ((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, rbuf)) == hrBUSY) delay(1); + if (usberr == hrSUCCESS) ((USBReadParser*)buf)->Parse(bytes, rbuf, 0); + } + else + #endif + { + while ((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*)buf)) == hrBUSY) delay(1); + } + ret = HandleUsbError(usberr, epDataInIndex); + } + else { + while ((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, bytes, (uint8_t*)buf)) == hrBUSY) delay(1); + ret = HandleUsbError(usberr, epDataOutIndex); + } + if (ret) ErrorMessage (PSTR("============================ DAT"), ret); + } + } + + bytes = sizeof (CommandStatusWrapper); + int tries = 2; + while (tries--) { + while ((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*) & csw)) == hrBUSY) delay(1); + if (!usberr) break; + ClearEpHalt(epDataInIndex); + if (tries) ResetRecovery(); + } + + if (!ret) { + Notify(PSTR("CBW:\t\tOK\r\n"), 0x80); + Notify(PSTR("Data Stage:\tOK\r\n"), 0x80); + } + else { + // Throw away csw, IT IS NOT OF ANY USE. + ResetRecovery(); + return ret; + } + + ret = HandleUsbError(usberr, epDataInIndex); + if (ret) ErrorMessage (PSTR("============================ CSW"), ret); + + if (usberr == hrSUCCESS) { + if (IsValidCSW(&csw, pcbw)) { + //ErrorMessage (PSTR("CSW.dCBWTag"), csw.dCSWTag); + //ErrorMessage (PSTR("bCSWStatus"), csw.bCSWStatus); + //ErrorMessage (PSTR("dCSWDataResidue"), csw.dCSWDataResidue); + Notify(PSTR("CSW:\t\tOK\r\n\r\n"), 0x80); + return csw.bCSWStatus; + } + else { + // NOTE! Sometimes this is caused by the reported residue being wrong. + // Get a different device. It isn't compliant, and should have never passed Q&A. + // I own one... 05e3:0701 Genesys Logic, Inc. USB 2.0 IDE Adapter. + // Other devices that exhibit this behavior exist in the wild too. + // Be sure to check quirks in the Linux source code before reporting a bug. --xxxajk + Notify(PSTR("Invalid CSW\r\n"), 0x80); + ResetRecovery(); + //return MASS_ERR_SUCCESS; + return MASS_ERR_INVALID_CSW; + } + } + return ret; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @return + */ +uint8_t BulkOnly::SetCurLUN(uint8_t lun) { + if (lun > bMaxLUN) return MASS_ERR_INVALID_LUN; + bTheLUN = lun; + return MASS_ERR_SUCCESS; +} + +/** + * For driver use only. + * + * @param status + * @return + */ +uint8_t BulkOnly::HandleSCSIError(uint8_t status) { + uint8_t ret = 0; + + switch (status) { + case 0: return MASS_ERR_SUCCESS; + + case 2: + ErrorMessage (PSTR("Phase Error"), status); + ErrorMessage (PSTR("LUN"), bTheLUN); + ResetRecovery(); + return MASS_ERR_GENERAL_SCSI_ERROR; + + case 1: + ErrorMessage (PSTR("SCSI Error"), status); + ErrorMessage (PSTR("LUN"), bTheLUN); + RequestSenseResponce rsp; + + ret = RequestSense(bTheLUN, sizeof (RequestSenseResponce), (uint8_t*) & rsp); + + if (ret) return MASS_ERR_GENERAL_SCSI_ERROR; + + ErrorMessage (PSTR("Response Code"), rsp.bResponseCode); + if (rsp.bResponseCode & 0x80) { + Notify(PSTR("Information field: "), 0x80); + for (int i = 0; i < 4; i++) { + D_PrintHex (rsp.CmdSpecificInformation[i], 0x80); + Notify(PSTR(" "), 0x80); + } + Notify(PSTR("\r\n"), 0x80); + } + ErrorMessage (PSTR("Sense Key"), rsp.bmSenseKey); + ErrorMessage (PSTR("Add Sense Code"), rsp.bAdditionalSenseCode); + ErrorMessage (PSTR("Add Sense Qual"), rsp.bAdditionalSenseQualifier); + // warning, this is not testing ASQ, only SK and ASC. + switch (rsp.bmSenseKey) { + case SCSI_S_UNIT_ATTENTION: + switch (rsp.bAdditionalSenseCode) { + case SCSI_ASC_MEDIA_CHANGED: + return MASS_ERR_MEDIA_CHANGED; + default: + return MASS_ERR_UNIT_NOT_READY; + } + case SCSI_S_NOT_READY: + switch (rsp.bAdditionalSenseCode) { + case SCSI_ASC_MEDIUM_NOT_PRESENT: + return MASS_ERR_NO_MEDIA; + default: + return MASS_ERR_UNIT_NOT_READY; + } + case SCSI_S_ILLEGAL_REQUEST: + switch (rsp.bAdditionalSenseCode) { + case SCSI_ASC_LBA_OUT_OF_RANGE: + return MASS_ERR_BAD_LBA; + default: + return MASS_ERR_CMD_NOT_SUPPORTED; + } + default: + return MASS_ERR_GENERAL_SCSI_ERROR; + } + + // case 4: return MASS_ERR_UNIT_BUSY; // Busy means retry later. + // case 0x05/0x14: we stalled out + // case 0x15/0x16: we naked out. + default: + ErrorMessage (PSTR("Gen SCSI Err"), status); + ErrorMessage (PSTR("LUN"), bTheLUN); + return status; + } // switch +} + + +//////////////////////////////////////////////////////////////////////////////// +// Debugging code +//////////////////////////////////////////////////////////////////////////////// + +/** + * @param 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); + Notify(PSTR("\r\nType:\t\t"), 0x80); + D_PrintHex (ep_ptr->bDescriptorType, 0x80); + Notify(PSTR("\r\nAddress:\t"), 0x80); + D_PrintHex (ep_ptr->bEndpointAddress, 0x80); + Notify(PSTR("\r\nAttributes:\t"), 0x80); + D_PrintHex (ep_ptr->bmAttributes, 0x80); + Notify(PSTR("\r\nMaxPktSize:\t"), 0x80); + D_PrintHex (ep_ptr->wMaxPacketSize, 0x80); + Notify(PSTR("\r\nPoll Intrv:\t"), 0x80); + D_PrintHex (ep_ptr->bInterval, 0x80); + Notify(PSTR("\r\n"), 0x80); +} + +//////////////////////////////////////////////////////////////////////////////// +// misc/to kill/to-do +//////////////////////////////////////////////////////////////////////////////// + +/* We won't be needing this... */ +uint8_t BulkOnly::Read(uint8_t lun __attribute__((unused)), uint32_t addr __attribute__((unused)), uint16_t bsize __attribute__((unused)), uint8_t blocks __attribute__((unused)), USBReadParser * prs __attribute__((unused))) { + #if MS_WANT_PARSER + if (!LUNOk[lun]) return MASS_ERR_NO_MEDIA; + Notify(PSTR("\r\nRead (With parser)\r\n"), 0x80); + Notify(PSTR("---------\r\n"), 0x80); + + CommandBlockWrapper cbw = CommandBlockWrapper(); + + cbw.dCBWSignature = MASS_CBW_SIGNATURE; + cbw.dCBWTag = ++dCBWTag; + cbw.dCBWDataTransferLength = ((uint32_t)bsize * blocks); + cbw.bmCBWFlags = MASS_CMD_DIR_IN, + cbw.bmCBWLUN = lun; + cbw.bmCBWCBLength = 10; + + cbw.CBWCB[0] = SCSI_CMD_READ_10; + cbw.CBWCB[8] = blocks; + cbw.CBWCB[2] = ((addr >> 24) & 0xFF); + cbw.CBWCB[3] = ((addr >> 16) & 0xFF); + cbw.CBWCB[4] = ((addr >> 8) & 0xFF); + cbw.CBWCB[5] = (addr & 0xFF); + + return HandleSCSIError(Transaction(&cbw, bsize, prs, 1)); + #else + return MASS_ERR_NOT_IMPLEMENTED; + #endif +} + +#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h new file mode 100644 index 00000000..25df006e --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/masstorage.h @@ -0,0 +1,562 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#pragma once + +// Cruft removal, makes driver smaller, faster. +#ifndef MS_WANT_PARSER + #define MS_WANT_PARSER 0 +#endif + +#include "Usb.h" + +#define bmREQ_MASSOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE +#define bmREQ_MASSIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE + +// Mass Storage Subclass Constants +#define MASS_SUBCLASS_SCSI_NOT_REPORTED 0x00 // De facto use +#define MASS_SUBCLASS_RBC 0x01 +#define MASS_SUBCLASS_ATAPI 0x02 // MMC-5 (ATAPI) +#define MASS_SUBCLASS_OBSOLETE1 0x03 // Was QIC-157 +#define MASS_SUBCLASS_UFI 0x04 // Specifies how to interface Floppy Disk Drives to USB +#define MASS_SUBCLASS_OBSOLETE2 0x05 // Was SFF-8070i +#define MASS_SUBCLASS_SCSI 0x06 // SCSI Transparent Command Set +#define MASS_SUBCLASS_LSDFS 0x07 // Specifies how host has to negotiate access before trying SCSI +#define MASS_SUBCLASS_IEEE1667 0x08 + +// Mass Storage Class Protocols +#define MASS_PROTO_CBI 0x00 // CBI (with command completion interrupt) +#define MASS_PROTO_CBI_NO_INT 0x01 // CBI (without command completion interrupt) +#define MASS_PROTO_OBSOLETE 0x02 +#define MASS_PROTO_BBB 0x50 // Bulk Only Transport +#define MASS_PROTO_UAS 0x62 + +// Request Codes +#define MASS_REQ_ADSC 0x00 +#define MASS_REQ_GET 0xFC +#define MASS_REQ_PUT 0xFD +#define MASS_REQ_GET_MAX_LUN 0xFE +#define MASS_REQ_BOMSR 0xFF // Bulk-Only Mass Storage Reset + +#define MASS_CBW_SIGNATURE 0x43425355 +#define MASS_CSW_SIGNATURE 0x53425355 + +#define MASS_CMD_DIR_OUT 0 // (0 << 7) +#define MASS_CMD_DIR_IN 0x80 //(1 << 7) + +/* + * 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) + */ + +/* Group 1 commands (CDB's here are should all be 6-bytes) */ +#define SCSI_CMD_TEST_UNIT_READY 0x00 +#define SCSI_CMD_REQUEST_SENSE 0x03 +#define SCSI_CMD_FORMAT_UNIT 0x04 +#define SCSI_CMD_READ_6 0x08 +#define SCSI_CMD_WRITE_6 0x0A +#define SCSI_CMD_INQUIRY 0x12 +#define SCSI_CMD_MODE_SELECT_6 0x15 +#define SCSI_CMD_MODE_SENSE_6 0x1A +#define SCSI_CMD_START_STOP_UNIT 0x1B +#define SCSI_CMD_PREVENT_REMOVAL 0x1E +/* Group 2 Commands (CDB's here are 10-bytes) */ +#define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23 +#define SCSI_CMD_READ_CAPACITY_10 0x25 +#define SCSI_CMD_READ_10 0x28 +#define SCSI_CMD_WRITE_10 0x2A +#define SCSI_CMD_SEEK_10 0x2B +#define SCSI_CMD_ERASE_10 0x2C +#define SCSI_CMD_WRITE_AND_VERIFY_10 0x2E +#define SCSI_CMD_VERIFY_10 0x2F +#define SCSI_CMD_SYNCHRONIZE_CACHE 0x35 +#define SCSI_CMD_WRITE_BUFFER 0x3B +#define SCSI_CMD_READ_BUFFER 0x3C +#define SCSI_CMD_READ_SUBCHANNEL 0x42 +#define SCSI_CMD_READ_TOC 0x43 +#define SCSI_CMD_READ_HEADER 0x44 +#define SCSI_CMD_PLAY_AUDIO_10 0x45 +#define SCSI_CMD_GET_CONFIGURATION 0x46 +#define SCSI_CMD_PLAY_AUDIO_MSF 0x47 +#define SCSI_CMD_PLAY_AUDIO_TI 0x48 +#define SCSI_CMD_PLAY_TRACK_REL_10 0x49 +#define SCSI_CMD_GET_EVENT_STATUS 0x4A +#define SCSI_CMD_PAUSE_RESUME 0x4B +#define SCSI_CMD_READ_DISC_INFORMATION 0x51 +#define SCSI_CMD_READ_TRACK_INFORMATION 0x52 +#define SCSI_CMD_RESERVE_TRACK 0x53 +#define SCSI_CMD_SEND_OPC_INFORMATION 0x54 +#define SCSI_CMD_MODE_SELECT_10 0x55 +#define SCSI_CMD_REPAIR_TRACK 0x58 +#define SCSI_CMD_MODE_SENSE_10 0x5A +#define SCSI_CMD_CLOSE_TRACK_SESSION 0x5B +#define SCSI_CMD_READ_BUFFER_CAPACITY 0x5C +#define SCSI_CMD_SEND_CUE_SHEET 0x5D +/* Group 5 Commands (CDB's here are 12-bytes) */ +#define SCSI_CMD_REPORT_LUNS 0xA0 +#define SCSI_CMD_BLANK 0xA1 +#define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2 +#define SCSI_CMD_SEND_KEY 0xA3 +#define SCSI_CMD_REPORT_KEY 0xA4 +#define SCSI_CMD_PLAY_AUDIO_12 0xA5 +#define SCSI_CMD_LOAD_UNLOAD 0xA6 +#define SCSI_CMD_SET_READ_AHEAD 0xA7 +#define SCSI_CMD_READ_12 0xA8 +#define SCSI_CMD_PLAY_TRACK_REL_12 0xA9 +#define SCSI_CMD_WRITE_12 0xAA +#define SCSI_CMD_READ_MEDIA_SERIAL_12 0xAB +#define SCSI_CMD_GET_PERFORMANCE 0xAC +#define SCSI_CMD_READ_DVD_STRUCTURE 0xAD +#define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5 +#define SCSI_CMD_SET_STREAMING 0xB6 +#define SCSI_CMD_READ_MSF 0xB9 +#define SCSI_CMD_SET_SPEED 0xBB +#define SCSI_CMD_MECHANISM_STATUS 0xBD +#define SCSI_CMD_READ_CD 0xBE +#define SCSI_CMD_SEND_DISC_STRUCTURE 0xBF +/* Vendor-unique Commands, included for completeness */ +#define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4 /* SONY unique */ +#define SCSI_CMD_PLAYBACK_CONTROL 0xC9 /* SONY unique */ +#define SCSI_CMD_READ_CDDA 0xD8 /* Vendor unique */ +#define SCSI_CMD_READ_CDXA 0xDB /* Vendor unique */ +#define SCSI_CMD_READ_ALL_SUBCODES 0xDF /* Vendor unique */ + +/* SCSI error codes */ +#define SCSI_S_NOT_READY 0x02 +#define SCSI_S_MEDIUM_ERROR 0x03 +#define SCSI_S_ILLEGAL_REQUEST 0x05 +#define SCSI_S_UNIT_ATTENTION 0x06 +#define SCSI_ASC_LBA_OUT_OF_RANGE 0x21 +#define SCSI_ASC_MEDIA_CHANGED 0x28 +#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A + +/* USB error codes */ +#define MASS_ERR_SUCCESS 0x00 +#define MASS_ERR_PHASE_ERROR 0x02 +#define MASS_ERR_UNIT_NOT_READY 0x03 +#define MASS_ERR_UNIT_BUSY 0x04 +#define MASS_ERR_STALL 0x05 +#define MASS_ERR_CMD_NOT_SUPPORTED 0x06 +#define MASS_ERR_INVALID_CSW 0x07 +#define MASS_ERR_NO_MEDIA 0x08 +#define MASS_ERR_BAD_LBA 0x09 +#define MASS_ERR_MEDIA_CHANGED 0x0A +#define MASS_ERR_DEVICE_DISCONNECTED 0x11 +#define MASS_ERR_UNABLE_TO_RECOVER 0x12 // Reset recovery error +#define MASS_ERR_INVALID_LUN 0x13 +#define MASS_ERR_WRITE_STALL 0x14 +#define MASS_ERR_READ_NAKS 0x15 +#define MASS_ERR_WRITE_NAKS 0x16 +#define MASS_ERR_WRITE_PROTECTED 0x17 +#define MASS_ERR_NOT_IMPLEMENTED 0xFD +#define MASS_ERR_GENERAL_SCSI_ERROR 0xFE +#define MASS_ERR_GENERAL_USB_ERROR 0xFF +#define MASS_ERR_USER 0xA0 // For subclasses to define their own error codes + +#define MASS_TRANS_FLG_CALLBACK 0x01 // Callback is involved +#define MASS_TRANS_FLG_NO_STALL_CHECK 0x02 // STALL condition is not checked +#define MASS_TRANS_FLG_NO_PHASE_CHECK 0x04 // PHASE_ERROR is not checked + +#define MASS_MAX_ENDPOINTS 3 + +struct Capacity { + uint8_t data[8]; + //uint32_t dwBlockAddress; + //uint32_t dwBlockLength; +} __attribute__((packed)); + +struct BASICCDB { + uint8_t Opcode; + + unsigned unused : 5; + unsigned LUN : 3; + + uint8_t info[12]; +} __attribute__((packed)); + +typedef BASICCDB BASICCDB_t; + +struct CDB6 { + uint8_t Opcode; + + unsigned LBAMSB : 5; + unsigned LUN : 3; + + uint8_t LBAHB; + uint8_t LBALB; + uint8_t AllocationLength; + uint8_t Control; + +public: + + CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) : + Opcode(_Opcode), LBAMSB(BGRAB2(LBA) & 0x1F), LUN(_LUN), LBAHB(BGRAB1(LBA)), LBALB(BGRAB0(LBA)), + AllocationLength(_AllocationLength), Control(_Control) { + } + + CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control) : + Opcode(_Opcode), LBAMSB(0), LUN(_LUN), LBAHB(0), LBALB(0), + AllocationLength(_AllocationLength), Control(_Control) { + } +} __attribute__((packed)); + +typedef CDB6 CDB6_t; + +struct CDB10 { + uint8_t Opcode; + + unsigned Service_Action : 5; + unsigned LUN : 3; + + uint8_t LBA_L_M_MB; + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t Misc2; + + uint8_t ALC_MB; + uint8_t ALC_LB; + + uint8_t Control; +public: + + CDB10(uint8_t _Opcode, uint8_t _LUN) : + Opcode(_Opcode), Service_Action(0), LUN(_LUN), + LBA_L_M_MB(0), LBA_L_M_LB(0), LBA_L_L_MB(0), LBA_L_L_LB(0), + Misc2(0), ALC_MB(0), ALC_LB(0), Control(0) { + } + + CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA) : + Opcode(_Opcode), Service_Action(0), LUN(_LUN), + LBA_L_M_MB(BGRAB3(_LBA)), LBA_L_M_LB(BGRAB2(_LBA)), LBA_L_L_MB(BGRAB1(_LBA)), LBA_L_L_LB(BGRAB0(_LBA)), + Misc2(0), ALC_MB(BGRAB1(xflen)), ALC_LB(BGRAB0(xflen)), Control(0) { + } +} __attribute__((packed)); + +typedef CDB10 CDB10_t; + +struct CDB12 { + uint8_t Opcode; + + unsigned Service_Action : 5; + unsigned Misc : 3; + + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t ALC_M_LB; + uint8_t ALC_L_MB; + uint8_t ALC_L_LB; + uint8_t Control; +} __attribute__((packed)); + +typedef CDB12 CDB12_t; + +struct CDB_LBA32_16 { + uint8_t Opcode; + + unsigned Service_Action : 5; + unsigned Misc : 3; + + uint8_t LBA_L_M_MB; + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t A_M_M_MB; + uint8_t A_M_M_LB; + uint8_t A_M_L_MB; + uint8_t A_M_L_LB; + + uint8_t ALC_M_MB; + uint8_t ALC_M_LB; + uint8_t ALC_L_MB; + uint8_t ALC_L_LB; + + uint8_t Misc2; + uint8_t Control; +} __attribute__((packed)); + +struct CDB_LBA64_16 { + uint8_t Opcode; + uint8_t Misc; + + uint8_t LBA_M_M_MB; + uint8_t LBA_M_M_LB; + uint8_t LBA_M_L_MB; + uint8_t LBA_M_L_LB; + + uint8_t LBA_L_M_MB; + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t ALC_M_MB; + uint8_t ALC_M_LB; + uint8_t ALC_L_MB; + uint8_t ALC_L_LB; + + uint8_t Misc2; + uint8_t Control; +} __attribute__((packed)); + +struct InquiryResponse { + uint8_t DeviceType : 5; + uint8_t PeripheralQualifier : 3; + + unsigned Reserved : 7; + unsigned Removable : 1; + + uint8_t Version; + + unsigned ResponseDataFormat : 4; + unsigned HISUP : 1; + unsigned NormACA : 1; + unsigned TrmTsk : 1; + unsigned AERC : 1; + + uint8_t AdditionalLength; + //uint8_t Reserved3[2]; + + unsigned PROTECT : 1; + unsigned Res : 2; + unsigned ThreePC : 1; + unsigned TPGS : 2; + unsigned ACC : 1; + unsigned SCCS : 1; + + unsigned ADDR16 : 1; + unsigned R1 : 1; + unsigned R2 : 1; + unsigned MCHNGR : 1; + unsigned MULTIP : 1; + unsigned VS : 1; + unsigned ENCSERV : 1; + unsigned BQUE : 1; + + unsigned SoftReset : 1; + unsigned CmdQue : 1; + unsigned Reserved4 : 1; + unsigned Linked : 1; + unsigned Sync : 1; + unsigned WideBus16Bit : 1; + unsigned WideBus32Bit : 1; + unsigned RelAddr : 1; + + uint8_t VendorID[8]; + uint8_t ProductID[16]; + uint8_t RevisionID[4]; +} __attribute__((packed)); + +struct CommandBlockWrapperBase { + uint32_t dCBWSignature; + uint32_t dCBWTag; + uint32_t dCBWDataTransferLength; + uint8_t bmCBWFlags; +public: + + CommandBlockWrapperBase() { + } + + CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs) : + dCBWSignature(MASS_CBW_SIGNATURE), dCBWTag(tag), dCBWDataTransferLength(xflen), bmCBWFlags(flgs) { + } +} __attribute__((packed)); + +struct CommandBlockWrapper : public CommandBlockWrapperBase { + + struct { + uint8_t bmCBWLUN : 4; + uint8_t bmReserved1 : 4; + }; + + struct { + uint8_t bmCBWCBLength : 4; + uint8_t bmReserved2 : 4; + }; + + uint8_t CBWCB[16]; + +public: + // All zeroed. + + CommandBlockWrapper() : + CommandBlockWrapperBase(0, 0, 0), bmReserved1(0), bmReserved2(0) { + for (int i = 0; i < 16; i++) CBWCB[i] = 0; + } + + // Generic Wrap, CDB zeroed. + + CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd) : + CommandBlockWrapperBase(tag, xflen, flgs), + bmCBWLUN(lu), bmReserved1(0), bmCBWCBLength(cmdlen), bmReserved2(0) { + for (int i = 0; i < 16; i++) CBWCB[i] = 0; + // Type punning can cause optimization problems and bugs. + // Using reinterpret_cast to a dreinterpretifferent object is the proper way to do this. + //(((BASICCDB_t *) CBWCB)->LUN) = cmd; + BASICCDB_t *x = reinterpret_cast(CBWCB); + x->LUN = cmd; + } + + // Wrap for CDB of 6 + + CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB6_t *cdb, uint8_t dir) : + CommandBlockWrapperBase(tag, xflen, dir), + bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(6), bmReserved2(0) { + memcpy(&CBWCB, cdb, 6); + } + // Wrap for CDB of 10 + + CommandBlockWrapper(uint32_t tag, uint32_t xflen, CDB10_t *cdb, uint8_t dir) : + CommandBlockWrapperBase(tag, xflen, dir), + bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(10), bmReserved2(0) { + memcpy(&CBWCB, cdb, 10); + } +} __attribute__((packed)); + +struct CommandStatusWrapper { + uint32_t dCSWSignature; + uint32_t dCSWTag; + uint32_t dCSWDataResidue; + uint8_t bCSWStatus; +} __attribute__((packed)); + +struct RequestSenseResponce { + uint8_t bResponseCode; + uint8_t bSegmentNumber; + + uint8_t bmSenseKey : 4; + uint8_t bmReserved : 1; + uint8_t bmILI : 1; + uint8_t bmEOM : 1; + uint8_t bmFileMark : 1; + + uint8_t Information[4]; + uint8_t bAdditionalLength; + uint8_t CmdSpecificInformation[4]; + uint8_t bAdditionalSenseCode; + uint8_t bAdditionalSenseQualifier; + uint8_t bFieldReplaceableUnitCode; + uint8_t SenseKeySpecific[3]; +} __attribute__((packed)); + +class BulkOnly : public USBDeviceConfig, public UsbConfigXtracter { +protected: + static const uint8_t epDataInIndex; // DataIn endpoint index + static const uint8_t epDataOutIndex; // DataOUT endpoint index + static const uint8_t epInterruptInIndex; // InterruptIN endpoint index + + USB *pUsb; + uint8_t bAddress; + uint8_t bConfNum; // configuration number + uint8_t bIface; // interface value + uint8_t bNumEP; // total number of EP in the configuration + uint32_t qNextPollTime; // next poll time + bool bPollEnable; // poll enable flag + + EpInfo epInfo[MASS_MAX_ENDPOINTS]; + + uint32_t dCBWTag; // Tag + //uint32_t dCBWDataTransferLength; // Data Transfer Length + uint8_t bLastUsbError; // Last USB error + uint8_t bMaxLUN; // Max LUN + uint8_t bTheLUN; // Active LUN + uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]; // Total sectors + 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); + + // Additional Initialization Method for Subclasses + + virtual uint8_t OnInit() { return 0; } + +public: + BulkOnly(USB *p); + + uint8_t GetLastUsbError() { return bLastUsbError; }; + + uint8_t GetbMaxLUN() { return bMaxLUN; } // Max LUN + uint8_t GetbTheLUN() { return bTheLUN; } // Active LUN + + bool WriteProtected(uint8_t lun); + uint8_t MediaCTL(uint8_t lun, uint8_t ctl); + uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf); + uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, USBReadParser *prs); + uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf); + uint8_t LockMedia(uint8_t lun, uint8_t lock); + + bool LUNIsGood(uint8_t lun); + uint32_t GetCapacity(uint8_t lun); + uint16_t GetSectorSize(uint8_t lun); + + // USBDeviceConfig implementation + uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed); + uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed); + + uint8_t Release(); + uint8_t Poll(); + + 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); + + virtual bool DEVCLASSOK(uint8_t klass) { return klass == USB_CLASS_MASS_STORAGE; } + + uint8_t SCSITransaction6(CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); + uint8_t SCSITransaction10(CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); + +private: + uint8_t Inquiry(uint8_t lun, uint16_t size, uint8_t *buf); + uint8_t TestUnitReady(uint8_t lun); + uint8_t RequestSense(uint8_t lun, uint16_t size, uint8_t *buf); + uint8_t ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t *buf); + uint8_t GetMaxLUN(uint8_t *max_lun); + uint8_t SetCurLUN(uint8_t lun); + void Reset(); + uint8_t ResetRecovery(); + uint8_t ReadCapacity10(uint8_t lun, uint8_t *buf); + void ClearAllEP(); + void CheckMedia(); + bool CheckLUN(uint8_t lun); + uint8_t Page3F(uint8_t lun); + bool IsValidCBW(uint8_t size, uint8_t *pcbw); + bool IsMeaningfulCBW(uint8_t size, uint8_t *pcbw); + + bool IsValidCSW(CommandStatusWrapper *pcsw, CommandBlockWrapperBase *pcbw); + + uint8_t ClearEpHalt(uint8_t index); + #if MS_WANT_PARSER + uint8_t Transaction(CommandBlockWrapper *cbw, uint16_t bsize, void *buf, uint8_t flags); + #endif + uint8_t Transaction(CommandBlockWrapper *cbw, uint16_t bsize, void *buf); + uint8_t HandleUsbError(uint8_t error, uint8_t index); + uint8_t HandleSCSIError(uint8_t status); +}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h new file mode 100644 index 00000000..6cad39d0 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/max3421e.h @@ -0,0 +1,242 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include max3421e.h directly; include Usb.h instead" +#endif + +/* MAX3421E register/bit names and bitmasks */ + +/* Arduino pin definitions */ +/* pin numbers to port numbers */ + +#define SE0 0 +#define SE1 1 +#define FSHOST 2 +#define LSHOST 3 + +/* MAX3421E command byte format: rrrrr0wa where 'r' is register number */ +// +// MAX3421E Registers in HOST mode. +// +#define rRCVFIFO 0x08 //1<<3 +#define rSNDFIFO 0x10 //2<<3 +#define rSUDFIFO 0x20 //4<<3 +#define rRCVBC 0x30 //6<<3 +#define rSNDBC 0x38 //7<<3 + +#define rUSBIRQ 0x68 //13<<3 +/* USBIRQ Bits */ +#define bmVBUSIRQ 0x40 //b6 +#define bmNOVBUSIRQ 0x20 //b5 +#define bmOSCOKIRQ 0x01 //b0 + +#define rUSBIEN 0x70 //14<<3 +/* USBIEN Bits */ +#define bmVBUSIE 0x40 //b6 +#define bmNOVBUSIE 0x20 //b5 +#define bmOSCOKIE 0x01 //b0 + +#define rUSBCTL 0x78 //15<<3 +/* USBCTL Bits */ +#define bmCHIPRES 0x20 //b5 +#define bmPWRDOWN 0x10 //b4 + +#define rCPUCTL 0x80 //16<<3 +/* CPUCTL Bits */ +#define bmPUSLEWID1 0x80 //b7 +#define bmPULSEWID0 0x40 //b6 +#define bmIE 0x01 //b0 + +#define rPINCTL 0x88 //17<<3 +/* PINCTL Bits */ +#define bmFDUPSPI 0x10 //b4 +#define bmINTLEVEL 0x08 //b3 +#define bmPOSINT 0x04 //b2 +#define bmGPXB 0x02 //b1 +#define bmGPXA 0x01 //b0 +// GPX pin selections +#define GPX_OPERATE 0x00 +#define GPX_VBDET 0x01 +#define GPX_BUSACT 0x02 +#define GPX_SOF 0x03 + +#define rREVISION 0x90 //18<<3 + +#define rIOPINS1 0xA0 //20<<3 + +/* IOPINS1 Bits */ +#define bmGPOUT0 0x01 +#define bmGPOUT1 0x02 +#define bmGPOUT2 0x04 +#define bmGPOUT3 0x08 +#define bmGPIN0 0x10 +#define bmGPIN1 0x20 +#define bmGPIN2 0x40 +#define bmGPIN3 0x80 + +#define rIOPINS2 0xA8 //21<<3 +/* IOPINS2 Bits */ +#define bmGPOUT4 0x01 +#define bmGPOUT5 0x02 +#define bmGPOUT6 0x04 +#define bmGPOUT7 0x08 +#define bmGPIN4 0x10 +#define bmGPIN5 0x20 +#define bmGPIN6 0x40 +#define bmGPIN7 0x80 + +#define rGPINIRQ 0xB0 //22<<3 +/* GPINIRQ Bits */ +#define bmGPINIRQ0 0x01 +#define bmGPINIRQ1 0x02 +#define bmGPINIRQ2 0x04 +#define bmGPINIRQ3 0x08 +#define bmGPINIRQ4 0x10 +#define bmGPINIRQ5 0x20 +#define bmGPINIRQ6 0x40 +#define bmGPINIRQ7 0x80 + +#define rGPINIEN 0xB8 //23<<3 +/* GPINIEN Bits */ +#define bmGPINIEN0 0x01 +#define bmGPINIEN1 0x02 +#define bmGPINIEN2 0x04 +#define bmGPINIEN3 0x08 +#define bmGPINIEN4 0x10 +#define bmGPINIEN5 0x20 +#define bmGPINIEN6 0x40 +#define bmGPINIEN7 0x80 + +#define rGPINPOL 0xC0 //24<<3 +/* GPINPOL Bits */ +#define bmGPINPOL0 0x01 +#define bmGPINPOL1 0x02 +#define bmGPINPOL2 0x04 +#define bmGPINPOL3 0x08 +#define bmGPINPOL4 0x10 +#define bmGPINPOL5 0x20 +#define bmGPINPOL6 0x40 +#define bmGPINPOL7 0x80 + +#define rHIRQ 0xC8 //25<<3 +/* HIRQ Bits */ +#define bmBUSEVENTIRQ 0x01 // indicates BUS Reset Done or BUS Resume +#define bmRWUIRQ 0x02 +#define bmRCVDAVIRQ 0x04 +#define bmSNDBAVIRQ 0x08 +#define bmSUSDNIRQ 0x10 +#define bmCONDETIRQ 0x20 +#define bmFRAMEIRQ 0x40 +#define bmHXFRDNIRQ 0x80 + +#define rHIEN 0xD0 //26<<3 + +/* HIEN Bits */ +#define bmBUSEVENTIE 0x01 +#define bmRWUIE 0x02 +#define bmRCVDAVIE 0x04 +#define bmSNDBAVIE 0x08 +#define bmSUSDNIE 0x10 +#define bmCONDETIE 0x20 +#define bmFRAMEIE 0x40 +#define bmHXFRDNIE 0x80 + +#define rMODE 0xD8 //27<<3 + +/* MODE Bits */ +#define bmHOST 0x01 +#define bmLOWSPEED 0x02 +#define bmHUBPRE 0x04 +#define bmSOFKAENAB 0x08 +#define bmSEPIRQ 0x10 +#define bmDELAYISO 0x20 +#define bmDMPULLDN 0x40 +#define bmDPPULLDN 0x80 + +#define rPERADDR 0xE0 //28<<3 + +#define rHCTL 0xE8 //29<<3 +/* HCTL Bits */ +#define bmBUSRST 0x01 +#define bmFRMRST 0x02 +#define bmSAMPLEBUS 0x04 +#define bmSIGRSM 0x08 +#define bmRCVTOG0 0x10 +#define bmRCVTOG1 0x20 +#define bmSNDTOG0 0x40 +#define bmSNDTOG1 0x80 + +#define rHXFR 0xF0 //30<<3 + +#undef tokSETUP +#undef tokIN +#undef tokOUT +#undef tokINHS +#undef tokOUTHS +#undef tokISOIN +#undef tokISOOUT + +/* Host transfer token values for writing the HXFR register (R30) */ +/* OR this bit field with the endpoint number in bits 3:0 */ +#define tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1 +#define tokIN 0x00 // HS=0, ISO=0, OUTNIN=0, SETUP=0 +#define tokOUT 0x20 // HS=0, ISO=0, OUTNIN=1, SETUP=0 +#define tokINHS 0x80 // HS=1, ISO=0, OUTNIN=0, SETUP=0 +#define tokOUTHS 0xA0 // HS=1, ISO=0, OUTNIN=1, SETUP=0 +#define tokISOIN 0x40 // HS=0, ISO=1, OUTNIN=0, SETUP=0 +#define tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0 + +#define rHRSL 0xF8 //31<<3 + +/* HRSL Bits */ +#define bmRCVTOGRD 0x10 +#define bmSNDTOGRD 0x20 +#define bmKSTATUS 0x40 +#define bmJSTATUS 0x80 +#define bmSE0 0x00 //SE0 - disconnect state +#define bmSE1 0xC0 //SE1 - illegal state + +/* Host error result codes, the 4 LSB's in the HRSL register */ +#define hrSUCCESS 0x00 +#define hrBUSY 0x01 +#define hrBADREQ 0x02 +#define hrUNDEF 0x03 +#define hrNAK 0x04 +#define hrSTALL 0x05 +#define hrTOGERR 0x06 +#define hrWRONGPID 0x07 +#define hrBADBC 0x08 +#define hrPIDERR 0x09 +#define hrPKTERR 0x0A +#define hrCRCERR 0x0B +#define hrKERR 0x0C +#define hrJERR 0x0D +#define hrTIMEOUT 0x0E +#define hrBABBLE 0x0F + +#define MODE_FS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmSOFKAENAB) +#define MODE_LS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmLOWSPEED|bmSOFKAENAB) diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp new file mode 100644 index 00000000..dcc30902 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.cpp @@ -0,0 +1,128 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) + +#include "Usb.h" + +// 0x80 is the default (i.e. trace) to turn off set this global to something lower. +// this allows for 126 other debugging levels. +// TO-DO: Allow assignment to a different serial port by software +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) + , BYTE + #endif + ); + //USB_HOST_SERIAL.flush(); +} + +void E_Notify(char const * msg, int lvl) { + if (UsbDEBUGlvl < lvl) return; + if (!msg) return; + while (const char c = pgm_read_byte(msg++)) E_Notifyc(c, lvl); +} + +void E_NotifyStr(char const * msg, int lvl) { + if (UsbDEBUGlvl < lvl) return; + if (!msg) return; + while (const char c = *msg++) E_Notifyc(c, lvl); +} + +void E_Notify(uint8_t b, int lvl) { + if (UsbDEBUGlvl < lvl) return; + USB_HOST_SERIAL.print(b + #if !defined(ARDUINO) || ARDUINO < 100 + , DEC + #endif + ); + //USB_HOST_SERIAL.flush(); +} + +void E_Notify(double d, int lvl) { + if (UsbDEBUGlvl < lvl) return; + USB_HOST_SERIAL.print(d); + //USB_HOST_SERIAL.flush(); +} + +#ifdef DEBUG_USB_HOST + + void NotifyFailGetDevDescr() { + Notify(PSTR("\r\ngetDevDescr "), 0x80); + } + + void NotifyFailSetDevTblEntry() { + Notify(PSTR("\r\nsetDevTblEn "), 0x80); + } + + void NotifyFailGetConfDescr() { + Notify(PSTR("\r\ngetConf "), 0x80); + } + + void NotifyFailSetConfDescr() { + Notify(PSTR("\r\nsetConf "), 0x80); + } + + void NotifyFailGetDevDescr(uint8_t reason) { + NotifyFailGetDevDescr(); + NotifyFail(reason); + } + + void NotifyFailSetDevTblEntry(uint8_t reason) { + NotifyFailSetDevTblEntry(); + NotifyFail(reason); + + } + + void NotifyFailGetConfDescr(uint8_t reason) { + NotifyFailGetConfDescr(); + NotifyFail(reason); + } + + void NotifyFailSetConfDescr(uint8_t reason) { + NotifyFailSetConfDescr(); + NotifyFail(reason); + } + + void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) { + Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80); + D_PrintHex (VID, 0x80); + Notify(PSTR(" PID: "), 0x80); + D_PrintHex (PID, 0x80); + } + + void NotifyFail(uint8_t rcode) { + D_PrintHex (rcode, 0x80); + Notify(PSTR("\r\n"), 0x80); + } + +#endif // DEBUG_USB_HOST + +#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h new file mode 100644 index 00000000..12195dcf --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/message.h @@ -0,0 +1,85 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include message.h directly; include Usb.h instead" +#endif + +extern int UsbDEBUGlvl; + +void E_Notify(char const * msg, int lvl); +void E_Notify(uint8_t b, int lvl); +void E_NotifyStr(char const * msg, int lvl); +void E_Notifyc(char c, int lvl); + +#ifdef DEBUG_USB_HOST + #define Notify E_Notify + #define NotifyStr E_NotifyStr + #define Notifyc E_Notifyc + void NotifyFailGetDevDescr(uint8_t reason); + void NotifyFailSetDevTblEntry(uint8_t reason); + void NotifyFailGetConfDescr(uint8_t reason); + void NotifyFailSetConfDescr(uint8_t reason); + void NotifyFailGetDevDescr(); + void NotifyFailSetDevTblEntry(); + void NotifyFailGetConfDescr(); + void NotifyFailSetConfDescr(); + void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID); + void NotifyFail(uint8_t rcode); +#else + #define Notify(...) ((void)0) + #define NotifyStr(...) ((void)0) + #define Notifyc(...) ((void)0) + #define NotifyFailGetDevDescr(...) ((void)0) + #define NotifyFailSetDevTblEntry(...) ((void)0) + #define NotifyFailGetConfDescr(...) ((void)0) + #define NotifyFailGetDevDescr(...) ((void)0) + #define NotifyFailSetDevTblEntry(...) ((void)0) + #define NotifyFailGetConfDescr(...) ((void)0) + #define NotifyFailSetConfDescr(...) ((void)0) + #define NotifyFailUnknownDevice(...) ((void)0) + #define NotifyFail(...) ((void)0) +#endif + +template +void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) { + #ifdef DEBUG_USB_HOST + Notify(msg, level); + Notify(PSTR(": "), level); + D_PrintHex (rcode, level); + Notify(PSTR("\r\n"), level); + #endif +} + +template +void ErrorMessage(char const * msg __attribute__((unused)), ERROR_TYPE rcode __attribute__((unused)) = 0) { + #ifdef DEBUG_USB_HOST + Notify(msg, 0x80); + Notify(PSTR(": "), 0x80); + D_PrintHex (rcode, 0x80); + Notify(PSTR("\r\n"), 0x80); + #endif +} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp new file mode 100644 index 00000000..5d25576c --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.cpp @@ -0,0 +1,77 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) + +#include "Usb.h" + +bool MultiByteValueParser::Parse(uint8_t **pp, uint16_t *pcntdn) { + if (!pBuf) { + Notify(PSTR("Buffer pointer is NULL!\r\n"), 0x80); + return false; + } + for (; countDown && (*pcntdn); countDown--, (*pcntdn)--, (*pp)++) + pBuf[valueSize - countDown] = (**pp); + + if (countDown) return false; + + countDown = valueSize; + return true; +} + +bool PTPListParser::Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me) { + switch (nStage) { + case 0: + pBuf->valueSize = lenSize; + theParser.Initialize(pBuf); + nStage = 1; + + case 1: + if (!theParser.Parse(pp, pcntdn)) return false; + + arLen = 0; + arLen = (pBuf->valueSize >= 4) ? *((uint32_t*)pBuf->pValue) : (uint32_t)(*((uint16_t*)pBuf->pValue)); + arLenCntdn = arLen; + nStage = 2; + + case 2: + pBuf->valueSize = valSize; + theParser.Initialize(pBuf); + nStage = 3; + + case 3: + for (; arLenCntdn; arLenCntdn--) { + if (!theParser.Parse(pp, pcntdn)) return false; + if (pf) pf(pBuf, (arLen - arLenCntdn), me); + } + + nStage = 0; + } + return true; +} + +#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h new file mode 100644 index 00000000..403766da --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/parsetools.h @@ -0,0 +1,145 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include parsetools.h directly; include Usb.h instead" +#endif + +struct MultiValueBuffer { + uint8_t valueSize; + void *pValue; +} __attribute__((packed)); + +class MultiByteValueParser { + uint8_t * pBuf; + uint8_t countDown; + uint8_t valueSize; + +public: + + MultiByteValueParser() : pBuf(nullptr), countDown(0), valueSize(0) { + }; + + const uint8_t* GetBuffer() { return pBuf; } + + void Initialize(MultiValueBuffer * const pbuf) { + pBuf = (uint8_t*)pbuf->pValue; + countDown = valueSize = pbuf->valueSize; + } + + bool Parse(uint8_t **pp, uint16_t *pcntdn); +}; + +class ByteSkipper { + uint8_t *pBuf; + uint8_t nStage; + uint16_t countDown; + +public: + + ByteSkipper() : pBuf(nullptr), nStage(0), countDown(0) { + } + + void Initialize(MultiValueBuffer *pbuf) { + pBuf = (uint8_t*)pbuf->pValue; + countDown = 0; + } + + bool Skip(uint8_t **pp, uint16_t *pcntdn, uint16_t bytes_to_skip) { + switch (nStage) { + case 0: + countDown = bytes_to_skip; + nStage++; + case 1: + for (; countDown && (*pcntdn); countDown--, (*pp)++, (*pcntdn)--); + + if (!countDown) + nStage = 0; + } + return (!countDown); + } +}; + +// Pointer to a callback function triggered for each element of PTP array when used with PTPArrayParser +typedef void (*PTP_ARRAY_EL_FUNC)(const MultiValueBuffer * const p, uint32_t count, const void *me); + +class PTPListParser { +public: + + enum ParseMode { + modeArray, modeRange/*, modeEnum*/ + }; + +private: + uint8_t nStage; + uint8_t enStage; + + uint32_t arLen; + uint32_t arLenCntdn; + + uint8_t lenSize; // size of the array length field in bytes + uint8_t valSize; // size of the array element in bytes + + MultiValueBuffer *pBuf; + + // The only parser for both size and array element parsing + MultiByteValueParser theParser; + + uint8_t /*ParseMode*/ prsMode; + +public: + + PTPListParser() : + nStage(0), + enStage(0), + arLen(0), + arLenCntdn(0), + lenSize(0), + valSize(0), + pBuf(nullptr), + prsMode(modeArray) {} + ; + + void Initialize(const uint8_t len_size, const uint8_t val_size, MultiValueBuffer * const p, const uint8_t mode = modeArray) { + pBuf = p; + lenSize = len_size; + valSize = val_size; + prsMode = mode; + + if (prsMode == modeRange) { + arLenCntdn = arLen = 3; + nStage = 2; + } + else { + arLenCntdn = arLen = 0; + nStage = 0; + } + enStage = 0; + theParser.Initialize(p); + } + + bool Parse(uint8_t **pp, uint16_t *pcntdn, PTP_ARRAY_EL_FUNC pf, const void *me = nullptr); +}; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h new file mode 100644 index 00000000..319cd9c4 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/printhex.h @@ -0,0 +1,80 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ +#pragma once + +#ifndef _usb_h_ + #error "Never include printhex.h directly; include Usb.h instead" +#endif + +void E_Notifyc(char c, int lvl); + +template +void PrintHex(T val, int lvl) { + int num_nibbles = sizeof (T) * 2; + do { + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + if (v > 57) v += 7; + E_Notifyc(v, lvl); + } while (--num_nibbles); +} + +template +void PrintBin(T val, int lvl) { + for (T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1) + E_Notifyc(val & mask ? '1' : '0', lvl); +} + +template +void SerialPrintHex(T val) { + int num_nibbles = sizeof (T) * 2; + do { + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + if (v > 57) v += 7; + USB_HOST_SERIAL.print(v); + } while (--num_nibbles); +} + +template +void PrintHex2(Print *prn, T val) { + T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2)); + while (mask > 1) { + if (val < mask) prn->print("0"); + mask >>= 4; + } + prn->print((T)val, HEX); +} + +template void D_PrintHex(T val __attribute__((unused)), int lvl __attribute__((unused))) { + #ifdef DEBUG_USB_HOST + PrintHex (val, lvl); + #endif +} + +template +void D_PrintBin(T val, int lvl) { + #ifdef DEBUG_USB_HOST + PrintBin (val, lvl); + #endif +} diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h new file mode 100644 index 00000000..2de0d465 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/settings.h @@ -0,0 +1,236 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#pragma once + +#include "../../../inc/MarlinConfig.h" + +#include "macros.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) + //////////////////////////////////////////////////////////////////////////////// + /* Added by Bill Greiman to speed up mass storage initialization with USB + * flash drives and simple USB hard drives. + * Disable this by defining DELAY(x) to be delay(x). + */ + #define delay(x) if ((x) < 200) safe_delay(x) + /* Almost all USB flash drives and simple USB hard drives fail the write + * protect test and add 20 - 30 seconds to USB init. Set SKIP_WRITE_PROTECT + * to nonzero to skip the test and assume the drive is writable. + */ + #define SKIP_WRITE_PROTECT 1 + /* Since Marlin only cares about USB flash drives, we only need one LUN. */ + #define MASS_MAX_SUPPORTED_LUN 1 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// SPI Configuration +//////////////////////////////////////////////////////////////////////////////// + +#ifndef USB_SPI + #define USB_SPI SPI + //#define USB_SPI SPI1 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// DEBUGGING +//////////////////////////////////////////////////////////////////////////////// + +/* Set this to 1 to activate serial debugging */ +#define ENABLE_UHS_DEBUGGING 0 + +/* This can be used to select which serial port to use for debugging if + * multiple serial ports are available. + * For example Serial3. + */ +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) + #define USB_HOST_SERIAL MYSERIAL0 +#endif + +#ifndef USB_HOST_SERIAL + #define USB_HOST_SERIAL Serial +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Manual board activation +//////////////////////////////////////////////////////////////////////////////// + +/* Set this to 1 if you are using an Arduino Mega ADK board with MAX3421e built-in */ +#define USE_UHS_MEGA_ADK 0 // If you are using Arduino 1.5.5 or newer there is no need to do this manually + +/* Set this to 1 if you are using a Black Widdow */ +#define USE_UHS_BLACK_WIDDOW 0 + +/* Set this to a one to use the xmem2 lock. This is needed for multitasking and threading */ +#define USE_XMEM_SPI_LOCK 0 + +//////////////////////////////////////////////////////////////////////////////// +// Wii IR camera +//////////////////////////////////////////////////////////////////////////////// + +/* Set this to 1 to activate code for the Wii IR camera */ +#define ENABLE_WII_IR_CAMERA 0 + +//////////////////////////////////////////////////////////////////////////////// +// MASS STORAGE +//////////////////////////////////////////////////////////////////////////////// +// ******* IMPORTANT ******* +// Set this to 1 to support single LUN devices, and save RAM. -- I.E. thumb drives. +// Each LUN needs ~13 bytes to be able to track the state of each unit. +#ifndef MASS_MAX_SUPPORTED_LUN + #define MASS_MAX_SUPPORTED_LUN 8 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Set to 1 to use the faster spi4teensy3 driver. +//////////////////////////////////////////////////////////////////////////////// +#ifndef USE_SPI4TEENSY3 + #define USE_SPI4TEENSY3 1 +#endif + +// Disabled on the Teensy LC, as it is incompatible for now +#ifdef __MKL26Z64__ + #undef USE_SPI4TEENSY3 + #define USE_SPI4TEENSY3 0 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// AUTOMATIC Settings +//////////////////////////////////////////////////////////////////////////////// + +// No user serviceable parts below this line. +// DO NOT change anything below here unless you are a developer! + +//#include "version_helper.h" + +#if defined(__GNUC__) && defined(__AVR__) + #ifndef GCC_VERSION + #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) + #endif + #if GCC_VERSION < 40602 // Test for GCC < 4.6.2 + #ifdef PROGMEM + #undef PROGMEM + #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 + #endif + #endif + #endif +#endif + +#if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING + #define DEBUG_USB_HOST +#endif + +#if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA + #define WIICAMERA +#endif + +// To use some other locking (e.g. freertos), +// define XMEM_ACQUIRE_SPI and XMEM_RELEASE_SPI to point to your lock and unlock. +// NOTE: NO argument is passed. You have to do this within your routine for +// whatever you are using to lock and unlock. +#ifndef XMEM_ACQUIRE_SPI + #if USE_XMEM_SPI_LOCK || defined(USE_MULTIPLE_APP_API) + #include + #else + #define XMEM_ACQUIRE_SPI() (void(0)) + #define XMEM_RELEASE_SPI() (void(0)) + #endif +#endif + +#if !defined(EXT_RAM) && defined(EXT_RAM_STACK) || defined(EXT_RAM_HEAP) + #include +#else + #define EXT_RAM 0 +#endif + +#if defined(CORE_TEENSY) && defined(KINETISK) + #define USING_SPI4TEENSY3 USE_SPI4TEENSY3 +#else + #define USING_SPI4TEENSY3 0 +#endif +#if ((defined(ARDUINO_SAM_DUE) && defined(__SAM3X8E__)) || defined(__ARDUINO_X86__) || ARDUINO >= 10600) && !USING_SPI4TEENSY3 + #include // Use the Arduino SPI library for the Arduino Due, Intel Galileo 1 & 2, Intel Edison or if the SPI library with transaction is available +#endif +#ifdef RBL_NRF51822 + #include + #include + #define SPI SPI_Master + #define MFK_CASTUINT8T (uint8_t) // RBLs return type for sizeof needs casting to uint8_t +#endif +#if defined(__PIC32MX__) || defined(__PIC32MZ__) + #include <../../../../hardware/pic32/libraries/SPI/SPI.h> // Hack to use the SPI library +#endif + +#if defined(ESP8266) || defined(ESP32) + #define MFK_CASTUINT8T (uint8_t) // ESP return type for sizeof needs casting to uint8_t +#endif + +#ifdef STM32F4 + #include "stm32f4xx_hal.h" + extern SPI_HandleTypeDef SPI_Handle; // Needed to be declared in your main.cpp +#endif + +// Fix defines on Arduino Due +#ifdef ARDUINO_SAM_DUE + #ifdef tokSETUP + #undef tokSETUP + #endif + #ifdef tokIN + #undef tokIN + #endif + #ifdef tokOUT + #undef tokOUT + #endif + #ifdef tokINHS + #undef tokINHS + #endif + #ifdef tokOUTHS + #undef tokOUTHS + #endif +#endif + +// Set defaults +#ifndef MFK_CASTUINT8T + #define MFK_CASTUINT8T +#endif + +// Workaround issue: https://github.com/esp8266/Arduino/issues/2078 +#ifdef ESP8266 + #undef PROGMEM + #define PROGMEM +#undef PSTR + #define PSTR(s) (s) +#undef pgm_read_byte + #define pgm_read_byte(addr) (*reinterpret_cast(addr)) + #undef pgm_read_word + #define pgm_read_word(addr) (*reinterpret_cast(addr)) +#endif + +#ifdef ARDUINO_ESP8266_WIFIO + #error "This board is currently not supported" +#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 new file mode 100644 index 00000000..99c628f8 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usb_ch9.h @@ -0,0 +1,170 @@ +/** + * Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information + * ------------------- + * + * Circuits At Home, LTD + * Web : https://www.circuitsathome.com + * e-mail : support@circuitsathome.com + */ + +#ifndef _usb_h_ + #error "Never include usb_ch9.h directly; include Usb.h instead" +#endif + +/* USB chapter 9 structures */ + +/* Misc.USB constants */ +#define DEV_DESCR_LEN 18 //device descriptor length +#define CONF_DESCR_LEN 9 //configuration descriptor length +#define INTR_DESCR_LEN 9 //interface descriptor length +#define EP_DESCR_LEN 7 //endpoint descriptor length + +/* Standard Device Requests */ + +#define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS +#define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE +#define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE +#define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS +#define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR +#define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR +#define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION +#define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION +#define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE +#define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE +#define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME + +#define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt +#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up +#define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode + +/* Setup Data Constants */ + +#define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer +#define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer +#define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard +#define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class +#define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor +#define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device +#define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface +#define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint +#define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other + +/* USB descriptors */ + +#define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor. +#define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor. +#define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor. +#define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor. +#define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor. +#define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier. +#define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration. +#define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power. +#define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor. + +#define HID_DESCRIPTOR_HID 0x21 + + +/* OTG SET FEATURE Constants */ +#define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP +#define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP +#define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP + +/* USB Endpoint Transfer Types */ +#define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint. +#define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint. +#define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint. +#define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint. +#define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes + + +/* Standard Feature Selectors for CLEAR_FEATURE Requests */ +#define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient +#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient +#define USB_FEATURE_TEST_MODE 2 // Device recipient + +/* descriptor data structures */ + +/* Device descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE). + uint16_t bcdUSB; // USB Spec Release Number (BCD). + uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. + uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF). + uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. + uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0. + uint16_t idVendor; // Vendor ID (assigned by the USB-IF). + uint16_t idProduct; // Product ID (assigned by the manufacturer). + uint16_t bcdDevice; // Device release number (BCD). + uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer. + 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; + +/* Configuration descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION). + uint16_t wTotalLength; // Total length of all descriptors for this configuration. + uint8_t bNumInterfaces; // Number of interfaces in this configuration. + uint8_t bConfigurationValue; // Value of this configuration (1 based). + 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; + +/* Interface descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE). + uint8_t bInterfaceNumber; // Number of this interface (0 based). + uint8_t bAlternateSetting; // Value of this alternate interface setting. + uint8_t bNumEndpoints; // Number of endpoints in this interface. + uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. + 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; + +/* Endpoint descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT). + uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN). + 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; + +/* HID descriptor */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdHID; // HID class specification release + uint8_t bCountryCode; + uint8_t bNumDescriptors; // Number of additional class specific descriptors + uint8_t bDescrType; // Type of class descriptor + uint16_t wDescriptorLength; // Total size of the Report descriptor +} __attribute__((packed)) USB_HID_DESCRIPTOR; + +typedef struct { + uint8_t bDescrType; // Type of class descriptor + uint16_t wDescriptorLength; // Total size of the Report descriptor +} __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp new file mode 100644 index 00000000..6d2182cb --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -0,0 +1,213 @@ +/**************** + * usb_host.cpp * + ****************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +/* What follows is a modified version of the MAX3421e originally defined in + * lib/usbhost.c". This has been rewritten to use SPI routines from the + * Marlin HAL */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(USB_FLASH_DRIVE_SUPPORT) && DISABLED(USE_UHS3_USB) + +#include "Usb.h" +#include "usbhost.h" + +uint8_t MAX3421e::vbusState = 0; + +// constructor +void MAX3421e::cs() { + WRITE(USB_CS_PIN,0); +} + +void MAX3421e::ncs() { + WRITE(USB_CS_PIN,1); +} + +// write single byte into MAX3421 register +void MAX3421e::regWr(uint8_t reg, uint8_t data) { + cs(); + spiSend(reg | 0x02); + spiSend(data); + ncs(); +}; + +// multiple-byte write +// return a pointer to memory position after last written +uint8_t* MAX3421e::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { + cs(); + spiSend(reg | 0x02); + while (nbytes--) spiSend(*data_p++); + ncs(); + return data_p; +} + +// GPIO write +// GPIO byte is split between 2 registers, so two writes are needed to write one byte + +// GPOUT bits are in the low nybble. 0-3 in IOPINS1, 4-7 in IOPINS2 +void MAX3421e::gpioWr(uint8_t data) { + regWr(rIOPINS1, data); + regWr(rIOPINS2, data >> 4); +} + +// single host register read +uint8_t MAX3421e::regRd(uint8_t reg) { + cs(); + spiSend(reg); + uint8_t rv = spiRec(); + ncs(); + return rv; +} +// multiple-byte register read + +// return a pointer to a memory position after last read +uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { + cs(); + spiSend(reg); + while (nbytes--) *data_p++ = spiRec(); + ncs(); + return data_p; +} +// GPIO read. See gpioWr for explanation + +// GPIN pins are in high nybbles of IOPINS1, IOPINS2 +uint8_t MAX3421e::gpioRd() { + return (regRd(rIOPINS2) & 0xF0) | // pins 4-7, clean lower nybble + (regRd(rIOPINS1) >> 4); // shift low bits and OR with upper from previous operation. +} + +// reset MAX3421e. Returns false if PLL failed to stabilize 1 second after reset +bool MAX3421e::reset() { + regWr(rUSBCTL, bmCHIPRES); + regWr(rUSBCTL, 0x00); + for (uint8_t i = 100; i--;) { + if (regRd(rUSBIRQ) & bmOSCOKIRQ) return true; + delay(10); + } + return false; +} + +// initialize MAX3421e. Set Host mode, pullups, and stuff. Returns 0 if success, -1 if not +bool MAX3421e::start() { + // Initialize pins and SPI bus + + SET_OUTPUT(USB_CS_PIN); + SET_INPUT_PULLUP(USB_INTR_PIN); + ncs(); + spiBegin(); + + spiInit( + #ifdef SPI_SPEED + SPI_SPEED + #else + SPI_FULL_SPEED + #endif + ); + + // MAX3421e - full-duplex, level interrupt, vbus off. + regWr(rPINCTL, (bmFDUPSPI | bmINTLEVEL | GPX_VBDET)); + + const uint8_t revision = regRd(rREVISION); + if (revision == 0x00 || revision == 0xFF) { + SERIAL_ECHOLNPAIR("Revision register appears incorrect on MAX3421e initialization. Got ", revision); + return false; + } + + if (!reset()) { + SERIAL_ECHOLNPGM("OSCOKIRQ hasn't asserted in time"); + return false; + } + + // Delay a minimum of 1 second to ensure any capacitors are drained. + // 1 second is required to make sure we do not smoke a Microdrive! + + delay(1000); + + regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host + regWr(rHIEN, bmCONDETIE | bmFRAMEIE); // connection detection + + // check if device is connected + regWr(rHCTL, bmSAMPLEBUS); // sample USB bus + while (!(regRd(rHCTL) & bmSAMPLEBUS)) delay(10); // wait for sample operation to finish + + busprobe(); // check if anything is connected + + regWr(rHIRQ, bmCONDETIRQ); // clear connection detect interrupt + regWr(rCPUCTL, 0x01); // enable interrupt pin + + // GPX pin on. This is done here so that busprobe will fail if we have a switch connected. + regWr(rPINCTL, bmFDUPSPI | bmINTLEVEL); + + return true; +} + +// Probe bus to determine device presence and speed. Switch host to this speed. +void MAX3421e::busprobe() { + // Switch on just the J & K bits + switch (regRd(rHRSL) & (bmJSTATUS | bmKSTATUS)) { + case bmJSTATUS: + if ((regRd(rMODE) & bmLOWSPEED) == 0) { + regWr(rMODE, MODE_FS_HOST); // start full-speed host + vbusState = FSHOST; + } + else { + regWr(rMODE, MODE_LS_HOST); // start low-speed host + vbusState = LSHOST; + } + break; + case bmKSTATUS: + if ((regRd(rMODE) & bmLOWSPEED) == 0) { + regWr(rMODE, MODE_LS_HOST); // start low-speed host + vbusState = LSHOST; + } + else { + regWr(rMODE, MODE_FS_HOST); // start full-speed host + vbusState = FSHOST; + } + break; + case bmSE1: // illegal state + vbusState = SE1; + break; + case bmSE0: // disconnected state + regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST | bmSEPIRQ); + vbusState = SE0; + break; + } +} + +// MAX3421 state change task and interrupt handler +uint8_t MAX3421e::Task() { + return READ(USB_INTR_PIN) ? 0 : IntHandler(); +} + +uint8_t MAX3421e::IntHandler() { + uint8_t HIRQ = regRd(rHIRQ), // determine interrupt source + HIRQ_sendback = 0x00; + if (HIRQ & bmCONDETIRQ) { + busprobe(); + HIRQ_sendback |= bmCONDETIRQ; + } + // End HIRQ interrupts handling, clear serviced IRQs + regWr(rHIRQ, HIRQ_sendback); + return HIRQ_sendback; +} + +#endif // USB_FLASH_DRIVE_SUPPORT diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h new file mode 100644 index 00000000..07ca811a --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h @@ -0,0 +1,58 @@ +/************** + * usb_host.h * + **************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - 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: . * + ****************************************************************************/ + +#pragma once + +/* This the following comes from "lib/usbhost.h", but has been rewritten + * to use the SPI functions from Marlin's HAL */ + +class MAX3421e { + private: + static uint8_t vbusState; + void cs(); + void ncs(); + + uint8_t GpxHandler(); + uint8_t IntHandler(); + + public: + bool start(); + + void regWr(uint8_t reg, uint8_t data); + uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + void gpioWr(uint8_t data); + uint8_t regRd(uint8_t reg); + uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t gpioRd(); + bool reset(); + + uint8_t getVbusState() {return vbusState;}; + + void busprobe(); + + uint8_t Task(); +}; + +#define USE_MARLIN_MAX3421E + +#if defined(__SAM3X8E__) && !defined(ARDUINO_SAM_DUE) + #define ARDUINO_SAM_DUE // Spoof the USB library that this is a DUE +#endif 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 new file mode 100644 index 00000000..b35e5368 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE.h @@ -0,0 +1,249 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and + Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef __UHS_BULK_STORAGE_H__ +#define __UHS_BULK_STORAGE_H__ + + +//////////////////////////////////////////////////////////////////////////////// +// Define any of these options at the top of your sketch to override +// the defaults contained herewith. Do NOT do modifications here. +// Macro | Settings and notes | Default +// -----------------------------------------+-----------------------+----------- +// | 1 to 8 | +// | Each LUN needs | +// MASS_MAX_SUPPORTED_LUN | ~13 bytes to be able | 8 +// | to track the state of | +// | each unit. | +// -----------------------------------------+-----------------------+----------- +// | Just define to use. | +// DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE | works only if extra | +// | huge debug is on too. | +// -----------------------------------------^-----------------------^----------- + +#ifndef MASS_MAX_SUPPORTED_LUN +#define MASS_MAX_SUPPORTED_LUN 8 +#endif + +#include "UHS_SCSI.h" + +#define UHS_BULK_bmREQ_OUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE +#define UHS_BULK_bmREQ_IN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE + +// Request Codes +#define UHS_BULK_REQ_ADSC 0x00U +#define UHS_BULK_REQ_GET 0xFCU +#define UHS_BULK_REQ_PUT 0xFDU +#define UHS_BULK_REQ_GET_MAX_LUN 0xFEU +#define UHS_BULK_REQ_BOMSR 0xFFU // Mass Storage Reset + +#define UHS_BULK_CBW_SIGNATURE 0x43425355LU +#define UHS_BULK_CSW_SIGNATURE 0x53425355LU + +#define UHS_BULK_CMD_DIR_OUT 0x00U +#define UHS_BULK_CMD_DIR_IN 0x80U + +/* Bulk error codes */ +#define UHS_BULK_ERR_SUCCESS UHS_HOST_ERROR_NONE +#define UHS_BULK_ERR_PHASE_ERROR 0x22U +#define UHS_BULK_ERR_UNIT_NOT_READY 0x23U +#define UHS_BULK_ERR_UNIT_BUSY 0x24U +#define UHS_BULK_ERR_STALL 0x25U +#define UHS_BULK_ERR_CMD_NOT_SUPPORTED 0x26U +#define UHS_BULK_ERR_INVALID_CSW 0x27U +#define UHS_BULK_ERR_NO_MEDIA 0x28U +#define UHS_BULK_ERR_BAD_LBA 0x29U +#define UHS_BULK_ERR_MEDIA_CHANGED 0x2AU +#define UHS_BULK_ERR_DEVICE_DISCONNECTED UHS_HOST_ERROR_UNPLUGGED +#define UHS_BULK_ERR_UNABLE_TO_RECOVER 0x32U // Reset recovery error +#define UHS_BULK_ERR_INVALID_LUN 0x33U +#define UHS_BULK_ERR_WRITE_STALL 0x34U +#define UHS_BULK_ERR_READ_NAKS 0x35U +#define UHS_BULK_ERR_WRITE_NAKS 0x36U +#define UHS_BULK_ERR_WRITE_PROTECTED 0x37U +#define UHS_BULK_ERR_NOT_IMPLEMENTED 0xFDU +#define UHS_BULK_ERR_GENERAL_SCSI_ERROR 0xF0U +#define UHS_BULK_ERR_GENERAL_USB_ERROR 0xFFU +#define UHS_BULK_ERR_USER 0xA0U // For subclasses to define their own error codes + +#define MASS_MAX_ENDPOINTS 3 + +struct UHS_BULK_CommandBlockWrapperBase { + volatile uint32_t dCBWSignature; + volatile uint32_t dCBWTag; + volatile uint32_t dCBWDataTransferLength; + volatile uint8_t bmCBWFlags; +public: + + UHS_BULK_CommandBlockWrapperBase() { + } + + UHS_BULK_CommandBlockWrapperBase(uint32_t tag, uint32_t xflen, uint8_t flgs) : + dCBWSignature(UHS_BULK_CBW_SIGNATURE), dCBWTag(tag), dCBWDataTransferLength(xflen), bmCBWFlags(flgs) { + } +} __attribute__((packed)); + +struct UHS_BULK_CommandBlockWrapper : public UHS_BULK_CommandBlockWrapperBase { + + struct { + uint8_t bmCBWLUN : 4; + uint8_t bmReserved1 : 4; + }; + + struct { + uint8_t bmCBWCBLength : 4; + uint8_t bmReserved2 : 4; + }; + + uint8_t CBWCB[16]; + +public: + // All zeroed. + + UHS_BULK_CommandBlockWrapper() : + UHS_BULK_CommandBlockWrapperBase(0, 0, 0), bmReserved1(0), bmReserved2(0) { + for(int i = 0; i < 16; i++) CBWCB[i] = 0; + } + + // Generic Wrap, CDB zeroed. + + UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, uint8_t flgs, uint8_t lu, uint8_t cmdlen, uint8_t cmd) : + UHS_BULK_CommandBlockWrapperBase(tag, xflen, flgs), + bmCBWLUN(lu), bmReserved1(0), bmCBWCBLength(cmdlen), bmReserved2(0) { + for(int i = 0; i < 16; i++) CBWCB[i] = 0; + SCSI_CDB_BASE_t *x = reinterpret_cast(CBWCB); + x->LUN = cmd; + } + + // Wrap for CDB of 6 + + UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, SCSI_CDB6_t *cdb, uint8_t dir) : + UHS_BULK_CommandBlockWrapperBase(tag, xflen, dir), + bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(6), bmReserved2(0) { + memcpy(&CBWCB, cdb, 6); + } + // Wrap for CDB of 10 + + UHS_BULK_CommandBlockWrapper(uint32_t tag, uint32_t xflen, SCSI_CDB10_t *cdb, uint8_t dir) : + UHS_BULK_CommandBlockWrapperBase(tag, xflen, dir), + bmCBWLUN(cdb->LUN), bmReserved1(0), bmCBWCBLength(10), bmReserved2(0) { + memcpy(&CBWCB, cdb, 10); + } +} __attribute__((packed)); + +struct UHS_BULK_CommandStatusWrapper { + uint32_t dCSWSignature; + uint32_t dCSWTag; + uint32_t dCSWDataResidue; + uint8_t bCSWStatus; +} __attribute__((packed)); + +class UHS_Bulk_Storage : public UHS_USBInterface { +protected: + static const uint8_t epDataInIndex = 1; // DataIn endpoint index + static const uint8_t epDataOutIndex = 2; // DataOUT endpoint index + static const uint8_t epInterruptInIndex = 3; // InterruptIN endpoint index + + uint8_t bMaxLUN; // Max LUN + volatile uint32_t dCBWTag; // Tag + volatile uint8_t bTheLUN; // Active LUN + volatile uint32_t CurrentCapacity[MASS_MAX_SUPPORTED_LUN]; // Total sectors + 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); + +public: + UHS_Bulk_Storage(UHS_USB_HOST_BASE *p); + + volatile UHS_EpInfo epInfo[MASS_MAX_ENDPOINTS]; + + uint8_t GetbMaxLUN() { + return bMaxLUN; // Max LUN + } + + uint8_t GetbTheLUN() { + return bTheLUN; // Active LUN + } + + bool WriteProtected(uint8_t lun); + uint8_t MediaCTL(uint8_t lun, uint8_t ctl); + uint8_t Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf); + uint8_t Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t *buf); + uint8_t LockMedia(uint8_t lun, uint8_t lock); + + bool LUNIsGood(uint8_t lun); + uint32_t GetCapacity(uint8_t lun); + uint16_t GetSectorSize(uint8_t lun); + uint8_t SCSITransaction6(SCSI_CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); + uint8_t SCSITransaction10(SCSI_CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir); + + + // Configure and internal methods, these should never be called by a user's sketch. + uint8_t Start(); + bool OKtoEnumerate(ENUMERATION_INFO *ei); + uint8_t SetInterface(ENUMERATION_INFO *ei); + + uint8_t GetAddress() { + return bAddress; + }; + + + void Poll(); + + void DriverDefaults(); + + +private: + void Reset(); + void CheckMedia(); + + bool IsValidCBW(uint8_t size, uint8_t *pcbw); + bool IsMeaningfulCBW(uint8_t size, uint8_t *pcbw); + bool IsValidCSW(UHS_BULK_CommandStatusWrapper *pcsw, UHS_BULK_CommandBlockWrapperBase *pcbw); + + bool CheckLUN(uint8_t lun); + + uint8_t Inquiry(uint8_t lun, uint16_t size, uint8_t *buf); + uint8_t TestUnitReady(uint8_t lun); + uint8_t RequestSense(uint8_t lun, uint16_t size, uint8_t *buf); + uint8_t ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t *buf); + uint8_t GetMaxLUN(uint8_t *max_lun); + uint8_t SetCurLUN(uint8_t lun); + uint8_t ResetRecovery(); + uint8_t ReadCapacity10(uint8_t lun, uint8_t *buf); + uint8_t Page3F(uint8_t lun); + uint8_t ClearEpHalt(uint8_t index); + uint8_t Transaction(UHS_BULK_CommandBlockWrapper *cbw, uint16_t bsize, void *buf); + uint8_t HandleUsbError(uint8_t error, uint8_t index); + uint8_t HandleSCSIError(uint8_t status); + +}; + +#if defined(LOAD_UHS_BULK_STORAGE) && !defined(UHS_BULK_STORAGE_LOADED) +#include "UHS_BULK_STORAGE_INLINE.h" +#endif +#endif // __MASSTORAGE_H__ 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 new file mode 100644 index 00000000..37ba681c --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_BULK_STORAGE_INLINE.h @@ -0,0 +1,1205 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if defined(LOAD_UHS_BULK_STORAGE) && defined(__UHS_BULK_STORAGE_H__) && !defined(UHS_BULK_STORAGE_LOADED) +#define UHS_BULK_STORAGE_LOADED + +// uncomment to get 'printf' console debugging. NOT FOR UNO! +//#define DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE + +#if DEBUG_PRINTF_EXTRA_HUGE +#ifdef DEBUG_PRINTF_EXTRA_HUGE_UHS_BULK_STORAGE +#define BS_HOST_DEBUG(...) printf(__VA_ARGS__) +#else +#define BS_HOST_DEBUG(...) VOID0 +#endif +#else +#define BS_HOST_DEBUG(...) VOID0 +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// Interface code + +//////////////////////////////////////////////////////////////////////////////// + +/** + * Get the capacity of the media + * + * @param lun Logical Unit Number + * @return media capacity + */ +uint32_t UHS_NI UHS_Bulk_Storage::GetCapacity(uint8_t lun) { + uint32_t v = 0LU; + pUsb->DisablePoll(); + if(LUNOk[lun]) + v = CurrentCapacity[lun]; + pUsb->EnablePoll(); + return v; +} + +/** + * Get the sector (block) size used on the media + * + * @param lun Logical Unit Number + * @return media sector size + */ +uint16_t UHS_NI UHS_Bulk_Storage::GetSectorSize(uint8_t lun) { + uint16_t v = 0U; + pUsb->DisablePoll(); + if(LUNOk[lun]) + v = CurrentSectorSize[lun]; + pUsb->EnablePoll(); + return v; +} + +/** + * Test if LUN is ready for use + * + * @param lun Logical Unit Number + * @return true if LUN is ready for use + */ +bool UHS_NI UHS_Bulk_Storage::LUNIsGood(uint8_t lun) { + bool v; + pUsb->DisablePoll(); + v = LUNOk[lun]; + pUsb->EnablePoll(); + return v; +} + +/** + * Test if LUN is write protected + * + * @param lun Logical Unit Number + * @return cached status of write protect switch + */ +bool UHS_NI UHS_Bulk_Storage::WriteProtected(uint8_t lun) { + bool v; + pUsb->DisablePoll(); + v = WriteOk[lun]; + pUsb->EnablePoll(); + return v; +} + +/** + * Wrap and execute a SCSI CDB with length of 6 + * + * @param cdb CDB to execute + * @param buf_size Size of expected transaction + * @param buf Buffer + * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::SCSITransaction6(SCSI_CDB6_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + pUsb->DisablePoll(); + // promote buf_size to 32bits. + UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); + +#if 0 + // Lets check the CBW here: + printf("\r\n"); + printf("\r\n"); + uint8_t *dump = (uint8_t*)(&cbw); + + for(int i=0; i<(sizeof (UHS_BULK_CommandBlockWrapper)); i++) { + printf("%02.2x ", *dump); + dump++; + } + printf("\r\n"); + printf("\r\n"); +#endif + + uint8_t v = (HandleSCSIError(Transaction(&cbw, buf_size, buf))); + pUsb->EnablePoll(); + return v; +} + +/** + * Wrap and execute a SCSI CDB with length of 10 + * + * @param cdb CDB to execute + * @param buf_size Size of expected transaction + * @param buf Buffer + * @param dir MASS_CMD_DIR_IN | MASS_CMD_DIR_OUT + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::SCSITransaction10(SCSI_CDB10_t *cdb, uint16_t buf_size, void *buf, uint8_t dir) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + pUsb->DisablePoll(); + // promote buf_size to 32bits. + UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)buf_size, cdb, dir); + //SetCurLUN(cdb->LUN); + uint8_t v = (HandleSCSIError(Transaction(&cbw, buf_size, buf))); + pUsb->EnablePoll(); + return v; +} + +/** + * Lock or Unlock the tray or door on device. + * Caution: Some devices with buggy firmware will lock up. + * + * @param lun Logical Unit Number + * @param lock 1 to lock, 0 to unlock + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::LockMedia(uint8_t lun, uint8_t lock) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + pUsb->DisablePoll(); + Notify(PSTR("\r\nLockMedia\r\n"), 0x80); + Notify(PSTR("---------\r\n"), 0x80); + + SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_PREVENT_REMOVAL, lun, (uint8_t)0, lock); + + uint8_t v = SCSITransaction6(&cdb, (uint16_t)0, NULL, (uint8_t)UHS_BULK_CMD_DIR_IN); + pUsb->EnablePoll(); + return v; +} + +/** + * Media control, for spindle motor and media tray or door. + * This includes CDROM, TAPE and anything with a media loader. + * + * @param lun Logical Unit Number + * @param ctl 0x00 Stop Motor, 0x01 Start Motor, 0x02 Eject Media, 0x03 Load Media + * @return 0 on success + */ +uint8_t UHS_NI UHS_Bulk_Storage::MediaCTL(uint8_t lun, uint8_t ctl) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + pUsb->DisablePoll(); + Notify(PSTR("\r\nMediaCTL\r\n"), 0x80); + Notify(PSTR("-----------------\r\n"), 0x80); + + uint8_t rcode = UHS_BULK_ERR_UNIT_NOT_READY; + if(bAddress) { + SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_START_STOP_UNIT, lun, ctl & 0x03, 0); + rcode = SCSITransaction6(&cdb, (uint16_t)0, NULL, (uint8_t)UHS_BULK_CMD_DIR_OUT); + } else { + SetCurLUN(lun); + } + pUsb->EnablePoll(); + return rcode; +} + +/** + * Read data from media + * + * @param lun Logical Unit Number + * @param addr LBA address on media to read + * @param bsize size of a block (we should probably use the cached size) + * @param blocks how many blocks to read + * @param buf memory that is able to hold the requested data + * @return 0 on success + */ +uint8_t UHS_NI UHS_Bulk_Storage::Read(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, uint8_t *buf) { + if(!bAddress) return UHS_BULK_ERR_NO_MEDIA; + uint8_t er = UHS_BULK_ERR_NO_MEDIA; + pUsb->DisablePoll(); + if(LUNOk[lun]) { + Notify(PSTR("\r\nRead LUN:\t"), 0x80); + D_PrintHex (lun, 0x90); + Notify(PSTR("\r\nLBA:\t\t"), 0x90); + D_PrintHex (addr, 0x90); + Notify(PSTR("\r\nblocks:\t\t"), 0x90); + D_PrintHex (blocks, 0x90); + Notify(PSTR("\r\nblock size:\t"), 0x90); + D_PrintHex (bsize, 0x90); + Notify(PSTR("\r\n---------\r\n"), 0x80); + SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_READ_10, lun, blocks, addr); + +again: + er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), buf, (uint8_t)UHS_BULK_CMD_DIR_IN); + + if(er == UHS_BULK_ERR_STALL) { + MediaCTL(lun, 1); + + if(UHS_SLEEP_MS(150)) { + if(!TestUnitReady(lun)) goto again; + } + } + } + qNextPollTime = millis() + 100; + pUsb->EnablePoll(); + + return er; +} + +/** + * Write data to media + * + * @param lun Logical Unit Number + * @param addr LBA address on media to write + * @param bsize size of a block (we should probably use the cached size) + * @param blocks how many blocks to write + * @param buf memory that contains the data to write + * @return 0 on success + */ +uint8_t UHS_NI UHS_Bulk_Storage::Write(uint8_t lun, uint32_t addr, uint16_t bsize, uint8_t blocks, const uint8_t * buf) { + if(!bAddress) return UHS_BULK_ERR_NO_MEDIA; + uint8_t er = UHS_BULK_ERR_NO_MEDIA; + pUsb->DisablePoll(); + if(LUNOk[lun]) { + if(!WriteOk[lun]) { + er = UHS_BULK_ERR_WRITE_PROTECTED; + } else { + Notify(PSTR("\r\nWrite LUN:\t"), 0x80); + D_PrintHex (lun, 0x90); + Notify(PSTR("\r\nLBA:\t\t"), 0x90); + D_PrintHex (addr, 0x90); + Notify(PSTR("\r\nblocks:\t\t"), 0x90); + D_PrintHex (blocks, 0x90); + Notify(PSTR("\r\nblock size:\t"), 0x90); + D_PrintHex (bsize, 0x90); + Notify(PSTR("\r\n---------\r\n"), 0x80); + SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_WRITE_10, lun, blocks, addr); + +again: + er = SCSITransaction10(&cdb, ((uint16_t)bsize * blocks), (void*)buf, (uint8_t)UHS_BULK_CMD_DIR_OUT); + + if(er == UHS_BULK_ERR_WRITE_STALL) { + MediaCTL(lun, 1); + + if(UHS_SLEEP_MS(150)) { + if(!TestUnitReady(lun)) goto again; + } + } + } + } + qNextPollTime = millis() + 100; + pUsb->EnablePoll(); + + return er; +} + +// End of user functions, the remaining code below is driver internals. +// Only developer serviceable parts below! + +//////////////////////////////////////////////////////////////////////////////// + +// Main driver code + +//////////////////////////////////////////////////////////////////////////////// + +UHS_NI UHS_Bulk_Storage::UHS_Bulk_Storage(UHS_USB_HOST_BASE *p) { + pUsb = p; + dCBWTag = 0; + if(pUsb) { + + DriverDefaults(); + pUsb->RegisterDeviceClass(this); + // Serial.print("Bulk Register to USB Host @ 0x"); + // Serial.println((uint32_t)pUsb, HEX); + // Serial.print("Bulk Register to USB Host Address Pool @ 0x"); + // Serial.println((uint32_t)pUsb->GetAddressPool(), HEX); + } +} + +/** + * @param ei Enumeration information + * @return true if this interface driver can handle this interface description + */ +bool UHS_NI UHS_Bulk_Storage::OKtoEnumerate(ENUMERATION_INFO *ei) { + BS_HOST_DEBUG("BulkOnly: checking numep %i, klass %2.2x, subklass %2.2x\r\n", ei->interface.numep, ei->klass, ei->subklass); + BS_HOST_DEBUG("BulkOnly: checking protocol %2.2x, interface.klass %2.2x, interface.subklass %2.2x\r\n", ei->protocol, ei->interface.klass, ei->interface.subklass); + BS_HOST_DEBUG("BulkOnly: checking interface.protocol %2.2x\r\n", ei->interface.protocol); + // + // TO-DO? + // Check that we have 2 bulk endpoints, and one in each direction?? + // e.g. (ei->interface.numep > 1) && // two or more endpoints AND check types + // This will work with proper hardware though. + // + + return ( + ((ei->klass == UHS_USB_CLASS_MASS_STORAGE) || (ei->interface.klass == UHS_USB_CLASS_MASS_STORAGE)) && // mass storage class AND + ((ei->subklass == UHS_BULK_SUBCLASS_SCSI) || (ei->interface.subklass == UHS_BULK_SUBCLASS_SCSI)) && // SCSI command set AND + ((ei->protocol == UHS_STOR_PROTO_BBB) || (ei->interface.protocol == UHS_STOR_PROTO_BBB)) // Bulk Only transport + ); +} + +/** + * @param ei Enumeration information + * @return 0 always + */ +uint8_t UHS_NI UHS_Bulk_Storage::SetInterface(ENUMERATION_INFO *ei) { + uint8_t index; + + bAddress = ei->address; + BS_HOST_DEBUG("BS SetInterface\r\n"); + // Fill in the endpoint info structure + for(uint8_t ep = 0; ep < ei->interface.numep; ep++) { + BS_HOST_DEBUG("ep: 0x%2.2x bmAttributes: 0x%2.2x ", ep, ei->interface.epInfo[ep].bmAttributes); + if(ei->interface.epInfo[ep].bmAttributes == USB_TRANSFER_TYPE_BULK) { + index = ((ei->interface.epInfo[ep].bEndpointAddress & USB_TRANSFER_DIRECTION_IN) == USB_TRANSFER_DIRECTION_IN) ? epDataInIndex : epDataOutIndex; + epInfo[index].epAddr = (ei->interface.epInfo[ep].bEndpointAddress & 0x0F); + epInfo[index].maxPktSize = ei->interface.epInfo[ep].wMaxPacketSize; + epInfo[index].epAttribs = 0; + epInfo[index].bmNakPower = UHS_USB_NAK_MAX_POWER; + epInfo[index].bmSndToggle = 0; + epInfo[index].bmRcvToggle = 0; + epInfo[index].bIface=ei->interface.bInterfaceNumber; + BS_HOST_DEBUG("index: %i\r\n", index); + } + BS_HOST_DEBUG("\r\n"); + } + bNumEP = 3; + epInfo[0].epAddr = 0; + epInfo[0].maxPktSize = ei->bMaxPacketSize0; + epInfo[0].bmNakPower = UHS_USB_NAK_MAX_POWER; + bIface = ei->interface.bInterfaceNumber; + + return 0; +}; + +/** + * @return 0 for success + */ +uint8_t UHS_NI UHS_Bulk_Storage::Start() { + uint8_t rcode; + // Serial.print("Bulk Start from USB Host @ 0x"); + // Serial.println((uint32_t)pUsb, HEX); + // Serial.print("Bulk Start USB Host Address Pool @ 0x"); + // Serial.println((uint32_t)pUsb->GetAddressPool(), HEX); + + BS_HOST_DEBUG("BS Start, speed: %i\r\n", pUsb->GetAddressPool()->GetUsbDevicePtr(bAddress)->speed); + BS_HOST_DEBUG("BS Start\r\n"); + rcode = pUsb->setEpInfoEntry(bAddress, bIface, 3, epInfo); + // Serial.println(rcode,HEX); + if(rcode) goto FailOnInit; + + // Do a 1 second delay before LUN query + if(!UHS_SLEEP_MS(1000)) goto FailUnPlug; + + rcode = GetMaxLUN(&bMaxLUN); + BS_HOST_DEBUG("GetMaxLUN 0x%2.2x\r\n", rcode); + if(rcode) { + goto FailGetMaxLUN; + } + if(bMaxLUN >= MASS_MAX_SUPPORTED_LUN) bMaxLUN = MASS_MAX_SUPPORTED_LUN - 1; + BS_HOST_DEBUG("MaxLUN %u\r\n", bMaxLUN); + //ErrorMessage (PSTR("MaxLUN"), bMaxLUN); + if(!UHS_SLEEP_MS(150)) goto FailUnPlug; // Delay a bit for slow firmware. (again) + + for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { + if(!UHS_SLEEP_MS(3)) goto FailUnPlug; + SCSI_Inquiry_Response response; + rcode = Inquiry(lun, sizeof (SCSI_Inquiry_Response), (uint8_t*) & response); + BS_HOST_DEBUG("Inquiry 0x%2.2x 0x%2.2x\r\n", sizeof (SCSI_Inquiry_Response), rcode); + if(rcode) { + goto FailInquiry; +#if 0 + } else { + BS_HOST_DEBUG("LUN %i `", lun); + uint8_t *buf = response.VendorID; + for(int i = 0; i < 28; i++) BS_HOST_DEBUG("%c", buf[i]); + BS_HOST_DEBUG("'\r\nQualifier %1.1X ", response.PeripheralQualifier); + BS_HOST_DEBUG("Device type %2.2X ", response.DeviceType); + BS_HOST_DEBUG("RMB %1.1X ", response.Removable); + BS_HOST_DEBUG("SSCS %1.1X ", response.SCCS); + uint8_t sv = response.Version; + BS_HOST_DEBUG("SCSI version %2.2X\r\nDevice conforms to ", sv); + switch(sv) { + case 0: + BS_HOST_DEBUG("No specific"); + break; + case 1: + BS_HOST_DEBUG("ANSI X3.131-1986 (ANSI 1)"); + break; + case 2: + BS_HOST_DEBUG("ANSI X3.131-1994 (ANSI 2)"); + break; + case 3: + BS_HOST_DEBUG("ANSI INCITS 301-1997 (SPC)"); + break; + case 4: + BS_HOST_DEBUG("ANSI INCITS 351-2001 (SPC-2)"); + break; + case 5: + BS_HOST_DEBUG("ANSI INCITS 408-2005 (SPC-4)"); + break; + case 6: + BS_HOST_DEBUG("T10/1731-D (SPC-4)"); + break; + default: + BS_HOST_DEBUG("unknown"); + } + BS_HOST_DEBUG(" standards.\r\n"); +#endif + } + } + + for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { + if(!UHS_SLEEP_MS(3)) goto FailUnPlug; + #ifndef USB_NO_TEST_UNIT_READY + uint8_t tries = 0xF0; + while((rcode = TestUnitReady(lun))) { + BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xF0, rcode); + if(rcode == 0x08) break; // break on no media, this is OK to do. + if(rcode == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; + if(rcode == UHS_BULK_ERR_INVALID_CSW) goto Fail; + if(rcode != UHS_BULK_ERR_MEDIA_CHANGED) goto Fail; + if(!UHS_SLEEP_MS(2 * (tries + 1))) goto FailUnPlug; + tries++; + if(!tries) break; + } + #else + // Don't wait for the LUN to become ready, as this will + // trigger Marlin's watchdog timer + rcode = -1; + #endif + if(!UHS_SLEEP_MS(3)) goto FailUnPlug; + LockMedia(lun, 1); + if(rcode == 0x08) { + if(!UHS_SLEEP_MS(3)) goto FailUnPlug; + if(MediaCTL(lun, 1) == UHS_BULK_ERR_DEVICE_DISCONNECTED) goto FailUnPlug; // I actually have a USB stick that needs this! + } + BS_HOST_DEBUG("\r\nTry %2.2x TestUnitReady %2.2x\r\n", tries - 0xF0, rcode); + if(!rcode) { + if(!UHS_SLEEP_MS(3)) goto FailUnPlug; + BS_HOST_DEBUG("CheckLUN...\r\n"); + BS_HOST_DEBUG("%lu\r\n", millis()/1000); + // Stalls on ***some*** devices, ***WHY***?! Device SAID it is READY!! + LUNOk[lun] = CheckLUN(lun); + BS_HOST_DEBUG("%lu\r\n", millis()/1000); + if(!LUNOk[lun]) LUNOk[lun] = CheckLUN(lun); + if(!UHS_SLEEP_MS(1)) goto FailUnPlug; + BS_HOST_DEBUG("Checked LUN...\r\n"); + } else { + LUNOk[lun] = false; + } + } + + rcode = OnStart(); + + if(rcode) goto FailOnInit; + +#ifdef DEBUG_USB_HOST + USBTRACE("BS configured\r\n\r\n"); +#endif + qNextPollTime = millis() + 100; + bPollEnable = true; + + return 0; +FailUnPlug: + rcode = UHS_BULK_ERR_DEVICE_DISCONNECTED; + goto Fail; + +FailOnInit: +#ifdef DEBUG_USB_HOST + USBTRACE("OnStart:"); + goto Fail; +#endif + +FailGetMaxLUN: +#ifdef DEBUG_USB_HOST + USBTRACE("GetMaxLUN:"); + goto Fail; +#endif + +FailInquiry: +#ifdef DEBUG_USB_HOST + USBTRACE("Inquiry:"); +#endif + +Fail: +#ifdef DEBUG_USB_HOST + NotifyFail(rcode); +#endif + Release(); + + return rcode; +} + +// Base class definition of Release() used. See UHS_USBInterface class definition for details + +/** + * For driver use only. + * + * @return + */ +//void UHS_NI UHS_Bulk_Storage::Release() { +// pUsb->DisablePoll(); +// OnRelease(); +// DriverDefaults(); +// pUsb->EnablePoll(); +// return; +//} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @return true if LUN is ready for use. + */ +bool UHS_NI UHS_Bulk_Storage::CheckLUN(uint8_t lun) { + uint8_t rcode; + SCSI_Capacity capacity; + for(uint8_t i = 0; i < 8; i++) capacity.data[i] = 0; + + rcode = ReadCapacity10(lun, (uint8_t*)capacity.data); + if(rcode) { + BS_HOST_DEBUG(">>>>>>>>>>>>>>>>ReadCapacity returned %i\r\n", rcode); + return false; + } +#ifdef DEBUG_USB_HOST + ErrorMessage (PSTR(">>>>>>>>>>>>>>>>CAPACITY OK ON LUN"), lun); + for(uint8_t i = 0; i < 8 /*sizeof (Capacity)*/; i++) + D_PrintHex (capacity.data[i], 0x80); + Notify(PSTR("\r\n\r\n"), 0x80); +#endif + // Only 512/1024/2048/4096 are valid values! + uint32_t c = UHS_BYTES_TO_UINT32(capacity.data[4], capacity.data[5], capacity.data[6], capacity.data[7]); + if(c != 0x0200LU && c != 0x0400LU && c != 0x0800LU && c != 0x1000LU) { + return false; + } + // Store capacity information. + CurrentSectorSize[lun] = (uint16_t)(c); // & 0xFFFF); + + CurrentCapacity[lun] = UHS_BYTES_TO_UINT32(capacity.data[0], capacity.data[1], capacity.data[2], capacity.data[3]) + 1; + if(CurrentCapacity[lun] == /*0xffffffffLU */ 0x01LU || CurrentCapacity[lun] == 0x00LU) { + // Buggy firmware will report 0xFFFFFFFF or 0 for no media +#ifdef DEBUG_USB_HOST + if(CurrentCapacity[lun]) + ErrorMessage (PSTR(">>>>>>>>>>>>>>>>BUGGY FIRMWARE. CAPACITY FAIL ON LUN"), lun); +#endif + return false; + } + if(!UHS_SLEEP_MS(20)) return false; + #ifndef SKIP_PAGE3F + Page3F(lun); + #endif + if(!TestUnitReady(lun)) return true; + + return false; +} + +/** + * For driver use only. + * + * Scan for media change on all LUNs + */ +void UHS_NI UHS_Bulk_Storage::CheckMedia() { + if(!bAddress) return; + for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { + if(TestUnitReady(lun)) { + LUNOk[lun] = false; + continue; + } + if(!LUNOk[lun]) + LUNOk[lun] = CheckLUN(lun); + } +#if 0 + BS_HOST_DEBUG("}}}}}}}}}}}}}}}}STATUS "); + for(uint8_t lun = 0; lun <= bMaxLUN; lun++) { + if(LUNOk[lun]) + BS_HOST_DEBUG("#"); + + else BS_HOST_DEBUG("."); + } + BS_HOST_DEBUG("\r\n"); +#endif + OnPoll(); + qNextPollTime = millis() + 100; +} + +/** + * For driver use only. + */ +void UHS_NI UHS_Bulk_Storage::Poll() { + if((long)(millis() - qNextPollTime) >= 0L) { + + CheckMedia(); + } + + return; +} + +//////////////////////////////////////////////////////////////////////////////// + + +// SCSI code + + +//////////////////////////////////////////////////////////////////////////////// + +/** + * For driver use only. + * + * @param plun + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::GetMaxLUN(uint8_t *plun) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + uint8_t ret = pUsb->ctrlReq(bAddress, mkSETUP_PKT16(UHS_BULK_bmREQ_IN, UHS_BULK_REQ_GET_MAX_LUN, 0x0000U, bIface, 1), 1, plun); + + if(ret == UHS_HOST_ERROR_STALL) { + + *plun = 0; + Notify(PSTR("\r\nGetMaxLUN Stalled\r\n"), 0x80); + } + return 0; +} + +/** + * For driver use only. Used during Driver Start + * + * @param lun Logical Unit Number + * @param bsize + * @param buf + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::Inquiry(uint8_t lun, uint16_t bsize, uint8_t *buf) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + Notify(PSTR("\r\nInquiry\r\n"), 0x80); + Notify(PSTR("---------\r\n"), 0x80); + + SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_INQUIRY, lun, 0LU, (uint8_t)bsize, 0); + uint8_t rc = SCSITransaction6(&cdb, bsize, buf, (uint8_t)UHS_BULK_CMD_DIR_IN); + + return rc; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::TestUnitReady(uint8_t lun) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + //SetCurLUN(lun); + if(!bAddress) + return UHS_BULK_ERR_UNIT_NOT_READY; + + Notify(PSTR("\r\nTestUnitReady\r\n"), 0x80); + Notify(PSTR("-----------------\r\n"), 0x80); + + SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_TEST_UNIT_READY, lun, (uint8_t)0, 0); + + return SCSITransaction6(&cdb, 0, NULL, (uint8_t)UHS_BULK_CMD_DIR_IN); + +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @param pc + * @param page + * @param subpage + * @param len + * @param pbuf + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::ModeSense6(uint8_t lun, uint8_t pc, uint8_t page, uint8_t subpage, uint8_t len, uint8_t * pbuf) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + Notify(PSTR("\r\rModeSense\r\n"), 0x80); + Notify(PSTR("------------\r\n"), 0x80); + + SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_MODE_SENSE_6, lun, (uint32_t)((((pc << 6) | page) << 8) | subpage), len, 0); + + return SCSITransaction6(&cdb, len, pbuf, (uint8_t)UHS_BULK_CMD_DIR_IN); +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @param bsize + * @param buf + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::ReadCapacity10(uint8_t lun, uint8_t *buf) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + Notify(PSTR("\r\nReadCapacity\r\n"), 0x80); + Notify(PSTR("---------------\r\n"), 0x80); + + SCSI_CDB10_t cdb = SCSI_CDB10_t(SCSI_CMD_READ_CAPACITY_10, lun); + + return SCSITransaction10(&cdb, 8, buf, (uint8_t)UHS_BULK_CMD_DIR_IN); +} + +/** + * For driver use only. + * + * Page 3F contains write protect status. + * + * @param lun Logical Unit Number to test. + * @return Write protect switch status. + */ +uint8_t UHS_NI UHS_Bulk_Storage::Page3F(uint8_t lun) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + uint8_t buf[192]; + for(int i = 0; i < 192; i++) { + buf[i] = 0x00; + } + WriteOk[lun] = true; + uint8_t rc = ModeSense6(lun, 0, 0x3F, 0, 192, buf); + if(!rc) { + WriteOk[lun] = ((buf[2] & 0x80) == 0); +#ifdef DEBUG_USB_HOST + Notify(PSTR("Mode Sense: "), 0x80); + for(int i = 0; i < 4; i++) { + + D_PrintHex (buf[i], 0x80); + Notify(PSTR(" "), 0x80); + } + Notify(PSTR("\r\n"), 0x80); +#endif + } + return rc; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @param size + * @param buf + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::RequestSense(uint8_t lun, uint16_t size, uint8_t *buf) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + pUsb->DisablePoll(); + Notify(PSTR("\r\nRequestSense\r\n"), 0x80); + Notify(PSTR("----------------\r\n"), 0x80); + + SCSI_CDB6_t cdb = SCSI_CDB6_t(SCSI_CMD_REQUEST_SENSE, lun, 0LU, (uint8_t)size, 0); + UHS_BULK_CommandBlockWrapper cbw = UHS_BULK_CommandBlockWrapper(++dCBWTag, (uint32_t)size, &cdb, (uint8_t)UHS_BULK_CMD_DIR_IN); + uint8_t v = Transaction(&cbw, size, buf); + pUsb->EnablePoll(); + + return v; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +// USB code + + +//////////////////////////////////////////////////////////////////////////////// + +/** + * For driver use only. + * + * @param index + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::ClearEpHalt(uint8_t index) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + uint8_t ret = 0; + if(index != 0) { + uint8_t ep = (index == epDataInIndex) ? (0x80 | epInfo[index].epAddr) : epInfo[index].epAddr; + do { + ret = pUsb->EPClearHalt(bAddress, ep); + if(!UHS_SLEEP_MS(6)) break; + } while(ret == 0x01); + + if(ret) { + ErrorMessage (PSTR("ClearEpHalt"), ret); + ErrorMessage (PSTR("EP"), ep); + epInfo[index].bmSndToggle = 0; + epInfo[index].bmRcvToggle = 0; + return ret; + } else { + + epInfo[index].bmSndToggle = 0; + epInfo[index].bmRcvToggle = 0; + } + } + return ret; +} + +/** + * For driver use only. + */ +void UHS_NI UHS_Bulk_Storage::Reset() { + if(!bAddress) return; + + while(pUsb->ctrlReq(bAddress, mkSETUP_PKT16(UHS_BULK_bmREQ_OUT, UHS_BULK_REQ_BOMSR, 0x0000U, bIface, 0), 0, NULL) == 0x01) { + if(!UHS_SLEEP_MS(6)) break; + } + + if(!bAddress) return; + + UHS_SLEEP_MS(2500); +} + +/** + * For driver use only. + * + * @return 0 if successful + */ +uint8_t UHS_NI UHS_Bulk_Storage::ResetRecovery() { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + Notify(PSTR("\r\nResetRecovery\r\n"), 0x80); + Notify(PSTR("-----------------\r\n"), 0x80); + qNextPollTime = millis() + 90000; + uint8_t bLastUsbError = UHS_HOST_ERROR_UNPLUGGED; + if(UHS_SLEEP_MS(6)) { + Reset(); + if(UHS_SLEEP_MS(6)) { + bLastUsbError = ClearEpHalt(epDataInIndex); + if(UHS_SLEEP_MS(6)) { + + bLastUsbError = ClearEpHalt(epDataOutIndex); + UHS_SLEEP_MS(6); + } + } + } + return bLastUsbError; +} + +/** + * For driver use only. + * + * Clear all EP data and clear all LUN status + */ +void UHS_NI UHS_Bulk_Storage::DriverDefaults() { + + pUsb->DeviceDefaults(MASS_MAX_ENDPOINTS, this); + + for(uint8_t i = 0; i < MASS_MAX_SUPPORTED_LUN; i++) { + + LUNOk[i] = false; + WriteOk[i] = false; + CurrentCapacity[i] = 0lu; + CurrentSectorSize[i] = 0; + } + + dCBWTag = 0; + bMaxLUN = 0; + bTheLUN = 0; +} + +/** + * For driver use only. + * + * @param pcsw + * @param pcbw + * @return + */ +bool UHS_NI UHS_Bulk_Storage::IsValidCSW(UHS_BULK_CommandStatusWrapper *pcsw, UHS_BULK_CommandBlockWrapperBase *pcbw) { + if(!bAddress) return false; + if(pcsw->dCSWSignature != UHS_BULK_CSW_SIGNATURE) { + Notify(PSTR("CSW:Sig error\r\n"), 0x80); + return false; + } + if(pcsw->dCSWTag != pcbw->dCBWTag) { + Notify(PSTR("CSW:Wrong tag\r\n"), 0x80); + ErrorMessage (PSTR("dCSWTag"), pcsw->dCSWTag); + ErrorMessage (PSTR("dCBWTag"), pcbw->dCBWTag); + + return false; + } + return true; +} + +/** + * For driver use only. + * + * @param error + * @param index + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::HandleUsbError(uint8_t error, uint8_t index) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + + uint8_t count = 3; + while(error && count) { + if(error != UHS_HOST_ERROR_NONE) { + ErrorMessage (PSTR("USB Error"), error); + ErrorMessage (PSTR("Index"), index); + } + switch(error) { + // case UHS_HOST_ERROR_WRONGPID: + case UHS_HOST_ERROR_NONE: + return UHS_BULK_ERR_SUCCESS; + case UHS_HOST_ERROR_BUSY: + // SIE is busy, just hang out and try again. + return UHS_BULK_ERR_UNIT_BUSY; + case UHS_HOST_ERROR_NAK: + return UHS_BULK_ERR_UNIT_BUSY; + case UHS_HOST_ERROR_UNPLUGGED: + case UHS_HOST_ERROR_TIMEOUT: + case UHS_HOST_ERROR_JERR: + return UHS_BULK_ERR_DEVICE_DISCONNECTED; + case UHS_HOST_ERROR_STALL: + if(index == 0) return UHS_BULK_ERR_STALL; + ClearEpHalt(index); + if(index != epDataInIndex) return UHS_BULK_ERR_WRITE_STALL; + return UHS_BULK_ERR_STALL; + + + case UHS_HOST_ERROR_TOGERR: + // Handle a very super rare corner case, where toggles become de-synched. + // I have only ran into one device that has this firmware bug, and this is + // the only clean way to get back into sync with the buggy device firmware. + // --AJK + if(bAddress && bConfNum) { + error = pUsb->setConf(bAddress, bConfNum); + + if(error) break; + } + return UHS_BULK_ERR_SUCCESS; + + default: + ErrorMessage (PSTR("\r\nUSB"), error); + + return UHS_BULK_ERR_GENERAL_USB_ERROR; + } + count--; + } // while + + return ((error && !count) ? UHS_BULK_ERR_GENERAL_USB_ERROR : UHS_BULK_ERR_SUCCESS); +} + +/** + * For driver use only. + * + * @param pcbw + * @param buf_size + * @param buf + * @param flags + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::Transaction(UHS_BULK_CommandBlockWrapper *pcbw, uint16_t buf_size, void *buf) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + + uint16_t bytes = buf_size; + bool write = (pcbw->bmCBWFlags & UHS_BULK_CMD_DIR_IN) != UHS_BULK_CMD_DIR_IN; + uint8_t ret = 0; + uint8_t usberr; + UHS_BULK_CommandStatusWrapper csw; // up here, we allocate ahead to save cpu cycles. + SetCurLUN(pcbw->bmCBWLUN); + ErrorMessage (PSTR("CBW.dCBWTag"), pcbw->dCBWTag); + + while((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, sizeof (UHS_BULK_CommandBlockWrapper), (uint8_t*)pcbw)) == UHS_HOST_ERROR_BUSY) { + if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + } + ret = HandleUsbError(usberr, epDataOutIndex); + if(ret) { + ErrorMessage (PSTR("============================ CBW"), ret); + } else { + if(bytes) { + if(!write) { + while((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*)buf)) == UHS_HOST_ERROR_BUSY) { + if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + } + ret = HandleUsbError(usberr, epDataInIndex); + } else { + while((usberr = pUsb->outTransfer(bAddress, epInfo[epDataOutIndex].epAddr, bytes, (uint8_t*)buf)) == UHS_HOST_ERROR_BUSY) { + if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + } + ret = HandleUsbError(usberr, epDataOutIndex); + } + if(ret) { + ErrorMessage (PSTR("============================ DAT"), ret); + } + } + } + + { + bytes = sizeof (UHS_BULK_CommandStatusWrapper); + int tries = 2; + while(tries--) { + while((usberr = pUsb->inTransfer(bAddress, epInfo[epDataInIndex].epAddr, &bytes, (uint8_t*) & csw)) == UHS_HOST_ERROR_BUSY) { + if(!UHS_SLEEP_MS(1)) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + } + if(!usberr) break; + if(tries) { + if(usberr == UHS_HOST_ERROR_STALL) { + ResetRecovery(); + } else { + ClearEpHalt(epDataInIndex); + } + } + } + if(!ret) { + Notify(PSTR("CBW:\t\tOK\r\n"), 0x80); + Notify(PSTR("Data Stage:\tOK\r\n"), 0x80); + } else { + // Throw away csw, IT IS NOT OF ANY USE. + ResetRecovery(); + return ret; + } + ret = HandleUsbError(usberr, epDataInIndex); + if(ret) { + ErrorMessage (PSTR("============================ CSW"), ret); + } + if(usberr == UHS_HOST_ERROR_NONE) { + if(IsValidCSW(&csw, pcbw)) { + //ErrorMessage (PSTR("CSW.dCBWTag"), csw.dCSWTag); + //ErrorMessage (PSTR("bCSWStatus"), csw.bCSWStatus); + //ErrorMessage (PSTR("dCSWDataResidue"), csw.dCSWDataResidue); + Notify(PSTR("CSW:\t\tOK\r\n\r\n"), 0x80); + return csw.bCSWStatus; + } else { + // NOTE! Sometimes this is caused by the reported residue being wrong. + // Get a different device. It isn't compliant, and should have never passed Q&A. + // I own one... 05e3:0701 Genesys Logic, Inc. USB 2.0 IDE Adapter. + // Other devices that exhibit this behavior exist in the wild too. + // Be sure to check quirks in the Linux source code before reporting a bug. --xxxajk + Notify(PSTR("Invalid CSW\r\n"), 0x80); + Reset(); + ResetRecovery(); + + return UHS_BULK_ERR_INVALID_CSW; + } + } + } + return ret; +} + +/** + * For driver use only. + * + * @param lun Logical Unit Number + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::SetCurLUN(uint8_t lun) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + if(lun > bMaxLUN) + return UHS_BULK_ERR_INVALID_LUN; + bTheLUN = lun; + + return UHS_BULK_ERR_SUCCESS; +}; + +/** + * For driver use only. + * + * @param status + * @return + */ +uint8_t UHS_NI UHS_Bulk_Storage::HandleSCSIError(uint8_t status) { + if(!bAddress) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + uint8_t ret = 0; + switch(status) { + case 0: return UHS_BULK_ERR_SUCCESS; + + case 2: + ErrorMessage (PSTR("Phase Error"), status); + ErrorMessage (PSTR("LUN"), bTheLUN); + ResetRecovery(); + return UHS_BULK_ERR_GENERAL_SCSI_ERROR; + + case 1: + ErrorMessage (PSTR("SCSI Error"), status); + ErrorMessage (PSTR("LUN"), bTheLUN); + SCSI_Request_Sense_Response rsp; + + ret = RequestSense(bTheLUN, sizeof (SCSI_Request_Sense_Response), (uint8_t*) & rsp); + + if(ret) { + if(ret == UHS_BULK_ERR_DEVICE_DISCONNECTED) return UHS_BULK_ERR_DEVICE_DISCONNECTED; + return UHS_BULK_ERR_GENERAL_SCSI_ERROR; + } +#if ENABLE_UHS_DEBUGGING + ErrorMessage (PSTR("Response Code"), rsp.bResponseCode); + if(rsp.bResponseCode & 0x80) { + Notify(PSTR("Information field: "), 0x80); + for(int i = 0; i < 4; i++) { + D_PrintHex (rsp.CmdSpecificInformation[i], 0x80); + Notify(PSTR(" "), 0x80); + } + Notify(PSTR("\r\n"), 0x80); + } + ErrorMessage (PSTR("Sense Key"), rsp.bmSenseKey); + ErrorMessage (PSTR("Add Sense Code"), rsp.bAdditionalSenseCode); + ErrorMessage (PSTR("Add Sense Qual"), rsp.bAdditionalSenseQualifier); +#endif + // warning, this is not testing ASQ, only SK and ASC. + switch(rsp.bmSenseKey) { + case SCSI_S_UNIT_ATTENTION: + switch(rsp.bAdditionalSenseCode) { + case SCSI_ASC_MEDIA_CHANGED: + return UHS_BULK_ERR_MEDIA_CHANGED; + default: + return UHS_BULK_ERR_UNIT_NOT_READY; + } + case SCSI_S_NOT_READY: + switch(rsp.bAdditionalSenseCode) { + case SCSI_ASC_MEDIUM_NOT_PRESENT: + return UHS_BULK_ERR_NO_MEDIA; + default: + return UHS_BULK_ERR_UNIT_NOT_READY; + } + case SCSI_S_ILLEGAL_REQUEST: + switch(rsp.bAdditionalSenseCode) { + case SCSI_ASC_LBA_OUT_OF_RANGE: + return UHS_BULK_ERR_BAD_LBA; + default: + return UHS_BULK_ERR_CMD_NOT_SUPPORTED; + } + default: + return UHS_BULK_ERR_GENERAL_SCSI_ERROR; + } + + // case 4: return MASS_ERR_UNIT_BUSY; // Busy means retry later. + // case 0x05/0x14: we stalled out + // case 0x15/0x16: we naked out. + default: + ErrorMessage (PSTR("Gen SCSI Err"), status); + ErrorMessage (PSTR("LUN"), bTheLUN); + + return status; + } // switch +} + + +//////////////////////////////////////////////////////////////////////////////// + + +// Debugging code + + +//////////////////////////////////////////////////////////////////////////////// + +/** + * @param 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); + Notify(PSTR("\r\nType:\t\t"), 0x80); + D_PrintHex (ep_ptr->bDescriptorType, 0x80); + Notify(PSTR("\r\nAddress:\t"), 0x80); + D_PrintHex (ep_ptr->bEndpointAddress, 0x80); + Notify(PSTR("\r\nAttributes:\t"), 0x80); + D_PrintHex (ep_ptr->bmAttributes, 0x80); + Notify(PSTR("\r\nMaxPktSize:\t"), 0x80); + D_PrintHex (ep_ptr->wMaxPacketSize, 0x80); + Notify(PSTR("\r\nPoll Intrv:\t"), 0x80); + D_PrintHex (ep_ptr->bInterval, 0x80); + Notify(PSTR("\r\n"), 0x80); +} + +#else +#error "Never include UHS_BULK_STORAGE_INLINE.h, include UHS_host.h instead" +#endif 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 new file mode 100644 index 00000000..bead520b --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_BULK_STORAGE/UHS_SCSI.h @@ -0,0 +1,327 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef UHS_SCSI_H +#define UHS_SCSI_H + +/* + * 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) + */ + +/* Group 1 commands (CDB's here are should all be 6-bytes) */ +#define SCSI_CMD_TEST_UNIT_READY 0x00U +#define SCSI_CMD_REQUEST_SENSE 0x03U +#define SCSI_CMD_FORMAT_UNIT 0x04U +#define SCSI_CMD_READ_6 0x08U +#define SCSI_CMD_WRITE_6 0x0AU +#define SCSI_CMD_INQUIRY 0x12U +#define SCSI_CMD_MODE_SELECT_6 0x15U +#define SCSI_CMD_MODE_SENSE_6 0x1AU +#define SCSI_CMD_START_STOP_UNIT 0x1BU +#define SCSI_CMD_PREVENT_REMOVAL 0x1EU +/* Group 2 Commands (CDB's here are 10-bytes) */ +#define SCSI_CMD_READ_FORMAT_CAPACITIES 0x23U +#define SCSI_CMD_READ_CAPACITY_10 0x25U +#define SCSI_CMD_READ_10 0x28U +#define SCSI_CMD_WRITE_10 0x2AU +#define SCSI_CMD_SEEK_10 0x2BU +#define SCSI_CMD_ERASE_10 0x2CU +#define SCSI_CMD_WRITE_AND_VERIFY_10 0x2EU +#define SCSI_CMD_VERIFY_10 0x2FU +#define SCSI_CMD_SYNCHRONIZE_CACHE 0x35U +#define SCSI_CMD_WRITE_BUFFER 0x3BU +#define SCSI_CMD_READ_BUFFER 0x3CU +#define SCSI_CMD_READ_SUBCHANNEL 0x42U +#define SCSI_CMD_READ_TOC 0x43U +#define SCSI_CMD_READ_HEADER 0x44U +#define SCSI_CMD_PLAY_AUDIO_10 0x45U +#define SCSI_CMD_GET_CONFIGURATION 0x46U +#define SCSI_CMD_PLAY_AUDIO_MSF 0x47U +#define SCSI_CMD_PLAY_AUDIO_TI 0x48U +#define SCSI_CMD_PLAY_TRACK_REL_10 0x49U +#define SCSI_CMD_GET_EVENT_STATUS 0x4AU +#define SCSI_CMD_PAUSE_RESUME 0x4BU +#define SCSI_CMD_READ_DISC_INFORMATION 0x51U +#define SCSI_CMD_READ_TRACK_INFORMATION 0x52U +#define SCSI_CMD_RESERVE_TRACK 0x53U +#define SCSI_CMD_SEND_OPC_INFORMATION 0x54U +#define SCSI_CMD_MODE_SELECT_10 0x55U +#define SCSI_CMD_REPAIR_TRACK 0x58U +#define SCSI_CMD_MODE_SENSE_10 0x5AU +#define SCSI_CMD_CLOSE_TRACK_SESSION 0x5BU +#define SCSI_CMD_READ_BUFFER_CAPACITY 0x5CU +#define SCSI_CMD_SEND_CUE_SHEET 0x5DU +/* Group 5 Commands (CDB's here are 12-bytes) */ +#define SCSI_CMD_REPORT_LUNS 0xA0U +#define SCSI_CMD_BLANK 0xA1U +#define SCSI_CMD_SECURITY_PROTOCOL_IN 0xA2U +#define SCSI_CMD_SEND_KEY 0xA3U +#define SCSI_CMD_REPORT_KEY 0xA4U +#define SCSI_CMD_PLAY_AUDIO_12 0xA5U +#define SCSI_CMD_LOAD_UNLOAD 0xA6U +#define SCSI_CMD_SET_READ_AHEAD 0xA7U +#define SCSI_CMD_READ_12 0xA8U +#define SCSI_CMD_PLAY_TRACK_REL_12 0xA9U +#define SCSI_CMD_WRITE_12 0xAAU +#define SCSI_CMD_READ_MEDIA_SERIAL_12 0xABU +#define SCSI_CMD_GET_PERFORMANCE 0xACU +#define SCSI_CMD_READ_DVD_STRUCTURE 0xADU +#define SCSI_CMD_SECURITY_PROTOCOL_OUT 0xB5U +#define SCSI_CMD_SET_STREAMING 0xB6U +#define SCSI_CMD_READ_MSF 0xB9U +#define SCSI_CMD_SET_SPEED 0xBBU +#define SCSI_CMD_MECHANISM_STATUS 0xBDU +#define SCSI_CMD_READ_CD 0xBEU +#define SCSI_CMD_SEND_DISC_STRUCTURE 0xBFU +/* Vendor-unique Commands, included for completeness */ +#define SCSI_CMD_CD_PLAYBACK_STATUS 0xC4U /* SONY unique */ +#define SCSI_CMD_PLAYBACK_CONTROL 0xC9U /* SONY unique */ +#define SCSI_CMD_READ_CDDA 0xD8U /* Vendor unique */ +#define SCSI_CMD_READ_CDXA 0xDBU /* Vendor unique */ +#define SCSI_CMD_READ_ALL_SUBCODES 0xDFU /* Vendor unique */ + +/* SCSI error codes */ +#define SCSI_S_NOT_READY 0x02U +#define SCSI_S_MEDIUM_ERROR 0x03U +#define SCSI_S_ILLEGAL_REQUEST 0x05U +#define SCSI_S_UNIT_ATTENTION 0x06U +#define SCSI_ASC_LBA_OUT_OF_RANGE 0x21U +#define SCSI_ASC_MEDIA_CHANGED 0x28U +#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3AU + +struct SCSI_Capacity { + uint8_t data[8]; + //uint32_t dwBlockAddress; + //uint32_t dwBlockLength; +} __attribute__((packed)); + +struct SCSI_CDB_BASE { + uint8_t Opcode; + + unsigned unused : 5; + unsigned LUN : 3; + + uint8_t info[12]; +} __attribute__((packed)); + +typedef SCSI_CDB_BASE SCSI_CDB_BASE_t; + +struct SCSI_CDB6 { + uint8_t Opcode; + + unsigned LBAMSB : 5; + unsigned LUN : 3; + + uint8_t LBAHB; + uint8_t LBALB; + uint8_t AllocationLength; + uint8_t Control; + +public: + + SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint32_t LBA, uint8_t _AllocationLength, uint8_t _Control) : + Opcode(_Opcode), LBAMSB(UHS_UINT8_BYTE2(LBA) & 0x1F), LUN(_LUN), LBAHB(UHS_UINT8_BYTE1(LBA)), LBALB(UHS_UINT8_BYTE0(LBA)), + AllocationLength(_AllocationLength), Control(_Control) { + } + + SCSI_CDB6(uint8_t _Opcode, uint8_t _LUN, uint8_t _AllocationLength, uint8_t _Control) : + Opcode(_Opcode), LBAMSB(0), LUN(_LUN), LBAHB(0), LBALB(0), + AllocationLength(_AllocationLength), Control(_Control) { + } +} __attribute__((packed)); + +typedef SCSI_CDB6 SCSI_CDB6_t; + +struct SCSI_CDB10 { + uint8_t Opcode; + + unsigned Service_Action : 5; + unsigned LUN : 3; + + uint8_t LBA_L_M_MB; + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t Misc2; + + uint8_t ALC_MB; + uint8_t ALC_LB; + + uint8_t Control; +public: + + SCSI_CDB10(uint8_t _Opcode, uint8_t _LUN) : + Opcode(_Opcode), Service_Action(0), LUN(_LUN), + LBA_L_M_MB(0), LBA_L_M_LB(0), LBA_L_L_MB(0), LBA_L_L_LB(0), + Misc2(0), ALC_MB(0), ALC_LB(0), Control(0) { + } + + SCSI_CDB10(uint8_t _Opcode, uint8_t _LUN, uint16_t xflen, uint32_t _LBA) : + Opcode(_Opcode), Service_Action(0), LUN(_LUN), + LBA_L_M_MB(UHS_UINT8_BYTE3(_LBA)), LBA_L_M_LB(UHS_UINT8_BYTE2(_LBA)), LBA_L_L_MB(UHS_UINT8_BYTE1(_LBA)), LBA_L_L_LB(UHS_UINT8_BYTE0(_LBA)), + Misc2(0), ALC_MB(UHS_UINT8_BYTE1(xflen)), ALC_LB(UHS_UINT8_BYTE0(xflen)), Control(0) { + } +} __attribute__((packed)); + +typedef SCSI_CDB10 SCSI_CDB10_t; + +struct SCSI_CDB12 { + uint8_t Opcode; + + unsigned Service_Action : 5; + unsigned Misc : 3; + + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t ALC_M_LB; + uint8_t ALC_L_MB; + uint8_t ALC_L_LB; + uint8_t Control; +} __attribute__((packed)); + +typedef SCSI_CDB12 SCSI_CDB12_t; + +struct SCSI_CDB_LBA32_16 { + uint8_t Opcode; + + unsigned Service_Action : 5; + unsigned Misc : 3; + + uint8_t LBA_L_M_MB; + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t A_M_M_MB; + uint8_t A_M_M_LB; + uint8_t A_M_L_MB; + uint8_t A_M_L_LB; + + uint8_t ALC_M_MB; + uint8_t ALC_M_LB; + uint8_t ALC_L_MB; + uint8_t ALC_L_LB; + + uint8_t Misc2; + uint8_t Control; +} __attribute__((packed)); + +struct SCSI_CDB_LBA64_16 { + uint8_t Opcode; + uint8_t Misc; + + uint8_t LBA_M_M_MB; + uint8_t LBA_M_M_LB; + uint8_t LBA_M_L_MB; + uint8_t LBA_M_L_LB; + + uint8_t LBA_L_M_MB; + uint8_t LBA_L_M_LB; + uint8_t LBA_L_L_MB; + uint8_t LBA_L_L_LB; + + uint8_t ALC_M_MB; + uint8_t ALC_M_LB; + uint8_t ALC_L_MB; + uint8_t ALC_L_LB; + + uint8_t Misc2; + uint8_t Control; +} __attribute__((packed)); + +struct SCSI_Inquiry_Response { + uint8_t DeviceType : 5; + uint8_t PeripheralQualifier : 3; + + unsigned Reserved : 7; + unsigned Removable : 1; + + uint8_t Version; + + unsigned ResponseDataFormat : 4; + unsigned HISUP : 1; + unsigned NormACA : 1; + unsigned TrmTsk : 1; + unsigned AERC : 1; + + uint8_t AdditionalLength; + + unsigned PROTECT : 1; + unsigned Res : 2; + unsigned ThreePC : 1; + unsigned TPGS : 2; + unsigned ACC : 1; + unsigned SCCS : 1; + + unsigned ADDR16 : 1; + unsigned R1 : 1; + unsigned R2 : 1; + unsigned MCHNGR : 1; + unsigned MULTIP : 1; + unsigned VS : 1; + unsigned ENCSERV : 1; + unsigned BQUE : 1; + + unsigned SoftReset : 1; + unsigned CmdQue : 1; + unsigned Reserved4 : 1; + unsigned Linked : 1; + unsigned Sync : 1; + unsigned WideBus16Bit : 1; + unsigned WideBus32Bit : 1; + unsigned RelAddr : 1; + + uint8_t VendorID[8]; + uint8_t ProductID[16]; + uint8_t RevisionID[4]; +} __attribute__((packed)); + +struct SCSI_Request_Sense_Response { + uint8_t bResponseCode; + uint8_t bSegmentNumber; + + uint8_t bmSenseKey : 4; + uint8_t bmReserved : 1; + uint8_t bmILI : 1; + uint8_t bmEOM : 1; + uint8_t bmFileMark : 1; + + uint8_t Information[4]; + uint8_t bAdditionalLength; + uint8_t CmdSpecificInformation[4]; + uint8_t bAdditionalSenseCode; + uint8_t bAdditionalSenseQualifier; + uint8_t bFieldReplaceableUnitCode; + uint8_t SenseKeySpecific[3]; +} __attribute__((packed)); + +#endif /* UHS_SCSI_H */ 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 new file mode 100644 index 00000000..6442bcc4 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UNOFFICIAL_IDs.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ +#ifndef _UHS_UNOFFICIAL_IDs_h +#define _UHS_UNOFFICIAL_IDs_h + +// Bogus unofficial and unregistered VIDs from cloners to be listed here. + +#define UHS_VID_UNOFFICIAL_JOYTECH 0x162EU // For unofficial Joytech controllers + +#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_USB_IDs.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_USB_IDs.h new file mode 100644 index 00000000..417c9f6e --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_USB_IDs.h @@ -0,0 +1,2993 @@ +/* + * USB vendor ids + * This file was generated by running python ./make-USB_IDs.py > UHS_USB_IDs.h + * Don't change it directly. + * + * Copyright 2014, Andrew J. Kroll for Circuits At Home, LTD. All rights reserved. + * + * Copyright 2012, Michal Labedzki for Tieto Corporation + * Other values imported from libghoto2/camlibs/ptp2/library.c, music-players.h + * Copyright (C) 2001-2005 Mariusz Woloszyn + * Copyright (C) 2003-2013 Marcus Meissner + * Copyright (C) 2005 Hubert Figuiere + * Copyright (C) 2009 Axel Waggershauser + * Copyright (C) 2005-2007 Richard A. Low + * Copyright (C) 2005-2012 Linus Walleij + * Copyright (C) 2007 Ted Bullock + * Copyright (C) 2012 Sony Mobile Communications AB + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * 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 2 + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef _UHS_USB_IDs_h_ +#define _UHS_USB_IDs_h_ +#include "UHS_UNOFFICIAL_IDs.h" + +#define UHS_VID_FRYS_ELECTRONICS 0x0001U // Fry's Electronics +#define UHS_VID_INGRAM 0x0002U // Ingram +#define UHS_VID_CLUB_MAC 0x0003U // Club Mac +#define UHS_VID_NEBRASKA_FURNITURE_MART 0x0004U // Nebraska Furniture Mart +#define UHS_VID_UNKNOWN 0x0011U // Unknown +#define UHS_VID_PLANEX 0x0053U // Planex +#define UHS_VID_DRAGONRISE 0x0079U // DragonRise Inc. +#define UHS_VID_TRUST_INTERNATIONAL_BV 0x0105U // Trust International B.V. +#define UHS_VID_IBP 0x0127U // IBP +#define UHS_VID_UNKNOWN_1 0x0145U // Unknown +#define UHS_VID_MLK 0x017cU // MLK +#define UHS_VID_TP_LINK 0x0200U // TP-Link +#define UHS_VID_CHIPSBANK_MICROELECTRONICS 0x0204U // Chipsbank Microelectronics Co., Ltd +#define UHS_VID_HANGZHOU_WORLDE 0x0218U // Hangzhou Worlde +#define UHS_VID_HUMAX 0x02adU // HUMAX Co., Ltd. +#define UHS_VID_MM300_EBOOK_READER 0x0300U // MM300 eBook Reader +#define UHS_VID_OCZ_TECHNOLOGY 0x0324U // OCZ Technology Inc +#define UHS_VID_OCZ_TECHNOLOGY_1 0x0325U // OCZ Technology Inc +#define UHS_VID_LTS 0x0386U // LTS +#define UHS_VID_SHENZHEN_SINOTE_TECH_ELECTRON 0x03d9U // Shenzhen Sinote Tech-Electron Co., Ltd +#define UHS_VID_BERND_WALTER_COMPUTER_TECHNOLOGY 0x03daU // Bernd Walter Computer Technology +#define UHS_VID_ENDPOINTS 0x03e8U // EndPoints, Inc. +#define UHS_VID_THESYS_MICROELECTRONICS 0x03e9U // Thesys Microelectronics +#define UHS_VID_DATA_BROADCASTING 0x03eaU // Data Broadcasting Corp. +#define UHS_VID_ATMEL 0x03ebU // Atmel Corp. +#define UHS_VID_IWATSU_AMERICA 0x03ecU // Iwatsu America, Inc. +#define UHS_VID_MITEL 0x03edU // Mitel Corp. +#define UHS_VID_MITSUMI 0x03eeU // Mitsumi +#define UHS_VID_HEWLETT_PACKARD 0x03f0U // Hewlett-Packard +#define UHS_VID_GENOA_TECHNOLOGY 0x03f1U // Genoa Technology +#define UHS_VID_OAK_TECHNOLOGY 0x03f2U // Oak Technology, Inc. +#define UHS_VID_ADAPTEC 0x03f3U // Adaptec, Inc. +#define UHS_VID_DIEBOLD 0x03f4U // Diebold, Inc. +#define UHS_VID_SIEMENS_ELECTROMECHANICAL 0x03f5U // Siemens Electromechanical +#define UHS_VID_EPSON_IMAGING_TECHNOLOGY_CENTER 0x03f8U // Epson Imaging Technology Center +#define UHS_VID_KEYTRONIC 0x03f9U // KeyTronic Corp. +#define UHS_VID_OPTI 0x03fbU // OPTi, Inc. +#define UHS_VID_ELITEGROUP_COMPUTER_SYSTEMS 0x03fcU // Elitegroup Computer Systems +#define UHS_VID_XILINX 0x03fdU // Xilinx, Inc. +#define UHS_VID_FARALLON_COMUNICATIONS 0x03feU // Farallon Communications +#define UHS_VID_NATIONAL_SEMICONDUCTOR 0x0400U // National Semiconductor Corp. +#define UHS_VID_NATIONAL_REGISTRY 0x0401U // National Registry, Inc. +#define UHS_VID_ALI 0x0402U // ALi Corp. +#define UHS_VID_FUTURE_TECHNOLOGY_DEVICES_INTERNATIONAL 0x0403U // Future Technology Devices International, Ltd +#define UHS_VID_NCR 0x0404U // NCR Corp. +#define UHS_VID_SYNOPSYS 0x0405U // Synopsys, Inc. +#define UHS_VID_FUJITSU_ICL_COMPUTERS 0x0406U // Fujitsu-ICL Computers +#define UHS_VID_FUJITSU_PERSONAL_SYSTEMS 0x0407U // Fujitsu Personal Systems, Inc. +#define UHS_VID_QUANTA_COMPUTER 0x0408U // Quanta Computer, Inc. +#define UHS_VID_NEC 0x0409U // NEC Corp. +#define UHS_VID_KODAK 0x040aU // Kodak Co. +#define UHS_VID_WELTREND_SEMICONDUCTOR 0x040bU // Weltrend Semiconductor +#define UHS_VID_VTECH_COMPUTERS 0x040cU // VTech Computers, Ltd +#define UHS_VID_VIA_TECHNOLOGIES 0x040dU // VIA Technologies, Inc. +#define UHS_VID_MCCI 0x040eU // MCCI +#define UHS_VID_ECHO_SPEECH 0x040fU // Echo Speech Corp. +#define UHS_VID_BUFFALO_INC_FORMERLY_MELCO 0x0411U // BUFFALO INC. (formerly MelCo., Inc.) +#define UHS_VID_AWARD_SOFTWARE_INTERNATIONAL 0x0412U // Award Software International +#define UHS_VID_LEADTEK_RESEARCH 0x0413U // Leadtek Research, Inc. +#define UHS_VID_GIGA_BYTE_TECHNOLOGY 0x0414U // Giga-Byte Technology Co., Ltd +#define UHS_VID_WINBOND_ELECTRONICS 0x0416U // Winbond Electronics Corp. +#define UHS_VID_SYMBIOS_LOGIC 0x0417U // Symbios Logic +#define UHS_VID_AST_RESEARCH 0x0418U // AST Research +#define UHS_VID_SAMSUNG_INFO_SYSTEMS_AMERICA 0x0419U // Samsung Info. Systems America, Inc. +#define UHS_VID_PHOENIX_TECHNOLOGIES 0x041aU // Phoenix Technologies, Ltd +#define UHS_VID_DTV 0x041bU // d'TV +#define UHS_VID_S3 0x041dU // S3, Inc. +#define UHS_VID_CREATIVE_TECHNOLOGY 0x041eU // Creative Technology, Ltd +#define UHS_VID_LCS_TELEGRAPHICS 0x041fU // LCS Telegraphics +#define UHS_VID_CHIPS_AND_TECHNOLOGIES 0x0420U // Chips and Technologies +#define UHS_VID_NOKIA_MOBILE_PHONES 0x0421U // Nokia Mobile Phones +#define UHS_VID_ADI_SYSTEMS 0x0422U // ADI Systems, Inc. +#define UHS_VID_COMPUTER_ACCESS_TECHNOLOGY 0x0423U // Computer Access Technology Corp. +#define UHS_VID_STANDARD_MICROSYSTEMS 0x0424U // Standard Microsystems Corp. +#define UHS_VID_MOTOROLA_SEMICONDUCTORS_HK 0x0425U // Motorola Semiconductors HK, Ltd +#define UHS_VID_INTEGRATED_DEVICE_TECHNOLOGY 0x0426U // Integrated Device Technology, Inc. +#define UHS_VID_MOTOROLA_ELECTRONICS_TAIWAN 0x0427U // Motorola Electronics Taiwan, Ltd +#define UHS_VID_ADVANCED_GRAVIS_COMPUTER_TECH 0x0428U // Advanced Gravis Computer Tech, Ltd +#define UHS_VID_CIRRUS_LOGIC 0x0429U // Cirrus Logic +#define UHS_VID_ERICSSON_AUSTRIAN_AG 0x042aU // Ericsson Austrian, AG +#define UHS_VID_INTEL 0x042bU // Intel Corp. +#define UHS_VID_INNOVATIVE_SEMICONDUCTORS 0x042cU // Innovative Semiconductors, Inc. +#define UHS_VID_MICRONICS 0x042dU // Micronics +#define UHS_VID_ACER 0x042eU // Acer, Inc. +#define UHS_VID_MOLEX 0x042fU // Molex, Inc. +#define UHS_VID_SUN_MICROSYSTEMS 0x0430U // Sun Microsystems, Inc. +#define UHS_VID_ITAC_SYSTEMS 0x0431U // Itac Systems, Inc. +#define UHS_VID_UNISYS 0x0432U // Unisys Corp. +#define UHS_VID_ALPS_ELECTRIC 0x0433U // Alps Electric, Inc. +#define UHS_VID_SAMSUNG_INFO_SYSTEMS_AMERICA_1 0x0434U // Samsung Info. Systems America, Inc. +#define UHS_VID_HYUNDAI_ELECTRONICS_AMERICA 0x0435U // Hyundai Electronics America +#define UHS_VID_TAUGAGREINING_HF 0x0436U // Taugagreining HF +#define UHS_VID_FRAMATOME_CONNECTORS_USA 0x0437U // Framatome Connectors USA +#define UHS_VID_ADVANCED_MICRO_DEVICES 0x0438U // Advanced Micro Devices, Inc. +#define UHS_VID_VOICE_TECHNOLOGIES_GROUP 0x0439U // Voice Technologies Group +#define UHS_VID_LEXMARK_INTERNATIONAL 0x043dU // Lexmark International, Inc. +#define UHS_VID_LG_ELECTRONICS_USA 0x043eU // LG Electronics USA, Inc. +#define UHS_VID_RADISYS 0x043fU // RadiSys Corp. +#define UHS_VID_EIZO_NANAO 0x0440U // Eizo Nanao Corp. +#define UHS_VID_WINBOND_SYSTEMS_LAB 0x0441U // Winbond Systems Lab. +#define UHS_VID_ERICSSON 0x0442U // Ericsson, Inc. +#define UHS_VID_GATEWAY 0x0443U // Gateway, Inc. +#define UHS_VID_LUCENT_TECHNOLOGIES 0x0445U // Lucent Technologies, Inc. +#define UHS_VID_NMB_TECHNOLOGIES 0x0446U // NMB Technologies Corp. +#define UHS_VID_MOMENTUM_MICROSYSTEMS 0x0447U // Momentum Microsystems +#define UHS_VID_SHAMROCK_TECH 0x044aU // Shamrock Tech. Co., Ltd +#define UHS_VID_WSI 0x044bU // WSI +#define UHS_VID_CCLITRI 0x044cU // CCL/ITRI +#define UHS_VID_SIEMENS_NIXDORF_AG 0x044dU // Siemens Nixdorf AG +#define UHS_VID_ALPS_ELECTRIC_1 0x044eU // Alps Electric Co., Ltd +#define UHS_VID_THRUSTMASTER 0x044fU // ThrustMaster, Inc. +#define UHS_VID_DFI 0x0450U // DFI, Inc. +#define UHS_VID_TEXAS_INSTRUMENTS 0x0451U // Texas Instruments, Inc. +#define UHS_VID_MITSUBISHI_ELECTRONICS_AMERICA 0x0452U // Mitsubishi Electronics America, Inc. +#define UHS_VID_CMD_TECHNOLOGY 0x0453U // CMD Technology +#define UHS_VID_VOBIS_MICROCOMPUTER_AG 0x0454U // Vobis Microcomputer AG +#define UHS_VID_TELEMATICS_INTERNATIONAL 0x0455U // Telematics International, Inc. +#define UHS_VID_ANALOG_DEVICES 0x0456U // Analog Devices, Inc. +#define UHS_VID_SILICON_INTEGRATED_SYSTEMS 0x0457U // Silicon Integrated Systems Corp. +#define UHS_VID_KYE_SYSTEMS_CORP_MOUSE_SYSTEMS 0x0458U // KYE Systems Corp. (Mouse Systems) +#define UHS_VID_ADOBE_SYSTEMS 0x0459U // Adobe Systems, Inc. +#define UHS_VID_SONICBLUE 0x045aU // SONICblue, Inc. +#define UHS_VID_HITACHI 0x045bU // Hitachi, Ltd +#define UHS_VID_NORTEL_NETWORKS 0x045dU // Nortel Networks, Ltd +#define UHS_VID_MICROSOFT 0x045eU // Microsoft Corp. +#define UHS_VID_ACE_CAD_ENTERPRISE 0x0460U // Ace Cad Enterprise Co., Ltd +#define UHS_VID_PRIMAX_ELECTRONICS 0x0461U // Primax Electronics, Ltd +#define UHS_VID_MGE_UPS_SYSTEMS 0x0463U // MGE UPS Systems +#define UHS_VID_AMPTYCOELECTRONICS 0x0464U // AMP/Tycoelectronics Corp. +#define UHS_VID_ATANDT_PARADYNE 0x0467U // AT&T Paradyne +#define UHS_VID_WIESON_TECHNOLOGIES 0x0468U // Wieson Technologies Co., Ltd +#define UHS_VID_CHERRY 0x046aU // Cherry GmbH +#define UHS_VID_AMERICAN_MEGATRENDS 0x046bU // American Megatrends, Inc. +#define UHS_VID_TOSHIBA_CORP_DIGITAL_MEDIA_EQUIPMENT 0x046cU // Toshiba Corp., Digital Media Equipment +#define UHS_VID_LOGITECH 0x046dU // Logitech, Inc. +#define UHS_VID_BEHAVIOR_TECH_COMPUTER 0x046eU // Behavior Tech. Computer Corp. +#define UHS_VID_CRYSTAL_SEMICONDUCTOR 0x046fU // Crystal Semiconductor +#define UHS_VID_PHILIPS_OR_NXP 0x0471U // Philips (or NXP) +#define UHS_VID_CHICONY_ELECTRONICS 0x0472U // Chicony Electronics Co., Ltd +#define UHS_VID_SANYO_INFORMATION_BUSINESS 0x0473U // Sanyo Information Business Co., Ltd +#define UHS_VID_SANYO_ELECTRIC 0x0474U // Sanyo Electric Co., Ltd +#define UHS_VID_RELISYSTECO_INFORMATION_SYSTEM 0x0475U // Relisys/Teco Information System +#define UHS_VID_AESP 0x0476U // AESP +#define UHS_VID_SEAGATE_TECHNOLOGY 0x0477U // Seagate Technology, Inc. +#define UHS_VID_CONNECTIX 0x0478U // Connectix Corp. +#define UHS_VID_ADVANCED_PERIPHERAL_LABORATORIES 0x0479U // Advanced Peripheral Laboratories +#define UHS_VID_SEMTECH 0x047aU // Semtech Corp. +#define UHS_VID_SILITEK 0x047bU // Silitek Corp. +#define UHS_VID_DELL_COMPUTER 0x047cU // Dell Computer Corp. +#define UHS_VID_KENSINGTON 0x047dU // Kensington +#define UHS_VID_AGERE_SYSTEMS_INC_LUCENT 0x047eU // Agere Systems, Inc. (Lucent) +#define UHS_VID_PLANTRONICS 0x047fU // Plantronics, Inc. +#define UHS_VID_TOSHIBA_AMERICA 0x0480U // Toshiba America Inc +#define UHS_VID_ZENITH_DATA_SYSTEMS 0x0481U // Zenith Data Systems +#define UHS_VID_KYOCERA 0x0482U // Kyocera Corp. +#define UHS_VID_STMICROELECTRONICS 0x0483U // STMicroelectronics +#define UHS_VID_SPECIALIX 0x0484U // Specialix +#define UHS_VID_NOKIA_MONITORS 0x0485U // Nokia Monitors +#define UHS_VID_ASUS_COMPUTERS 0x0486U // ASUS Computers, Inc. +#define UHS_VID_STEWART_CONNECTOR 0x0487U // Stewart Connector +#define UHS_VID_CIRQUE 0x0488U // Cirque Corp. +#define UHS_VID_FOXCONN_HON_HAI 0x0489U // Foxconn / Hon Hai +#define UHS_VID_S_MOS_SYSTEMS 0x048aU // S-MOS Systems, Inc. +#define UHS_VID_ALPS_ELECTRIC_IRELAND 0x048cU // Alps Electric Ireland, Ltd +#define UHS_VID_INTEGRATED_TECHNOLOGY_EXPRESS 0x048dU // Integrated Technology Express, Inc. +#define UHS_VID_EICON_TECH 0x048fU // Eicon Tech. +#define UHS_VID_UNITED_MICROELECTRONICS 0x0490U // United Microelectronics Corp. +#define UHS_VID_CAPETRONIC 0x0491U // Capetronic +#define UHS_VID_SAMSUNG_SEMICONDUCTOR 0x0492U // Samsung SemiConductor, Inc. +#define UHS_VID_MAG_TECHNOLOGY 0x0493U // MAG Technology Co., Ltd +#define UHS_VID_ESS_TECHNOLOGY 0x0495U // ESS Technology, Inc. +#define UHS_VID_MICRON_ELECTRONICS 0x0496U // Micron Electronics +#define UHS_VID_SMILE_INTERNATIONAL 0x0497U // Smile International +#define UHS_VID_CAPETRONIC_KAOHSIUNG 0x0498U // Capetronic (Kaohsiung) Corp. +#define UHS_VID_YAMAHA 0x0499U // Yamaha Corp. +#define UHS_VID_GANDALF_TECHNOLOGIES 0x049aU // Gandalf Technologies, Ltd +#define UHS_VID_CURTIS_COMPUTER_PRODUCTS 0x049bU // Curtis Computer Products +#define UHS_VID_ACER_ADVANCED_LABS 0x049cU // Acer Advanced Labs, Inc. +#define UHS_VID_VLSI_TECHNOLOGY 0x049dU // VLSI Technology +#define UHS_VID_COMPAQ_COMPUTER 0x049fU // Compaq Computer Corp. +#define UHS_VID_DIGITAL_EQUIPMENT 0x04a0U // Digital Equipment Corp. +#define UHS_VID_SYSTEMSOFT 0x04a1U // SystemSoft Corp. +#define UHS_VID_FIREPOWER_SYSTEMS 0x04a2U // FirePower Systems +#define UHS_VID_TRIDENT_MICROSYSTEMS 0x04a3U // Trident Microsystems, Inc. +#define UHS_VID_HITACHI_1 0x04a4U // Hitachi, Ltd +#define UHS_VID_ACER_PERIPHERALS_INC_NOW_BENQ 0x04a5U // Acer Peripherals Inc. (now BenQ Corp.) +#define UHS_VID_NOKIA_DISPLAY_PRODUCTS 0x04a6U // Nokia Display Products +#define UHS_VID_VISIONEER 0x04a7U // Visioneer +#define UHS_VID_MULTIVIDEO_LABS 0x04a8U // Multivideo Labs, Inc. +#define UHS_VID_CANON 0x04a9U // Canon, Inc. +#define UHS_VID_DAEWOO_TELECOM 0x04aaU // DaeWoo Telecom, Ltd +#define UHS_VID_CHROMATIC_RESEARCH 0x04abU // Chromatic Research +#define UHS_VID_MICRO_AUDIOMETRICS 0x04acU // Micro Audiometrics Corp. +#define UHS_VID_DOOIN_ELECTRONICS 0x04adU // Dooin Electronics +#define UHS_VID_WINNOV_LP 0x04afU // Winnov L.P. +#define UHS_VID_NIKON 0x04b0U // Nikon Corp. +#define UHS_VID_PAN_INTERNATIONAL 0x04b1U // Pan International +#define UHS_VID_IBM 0x04b3U // IBM Corp. +#define UHS_VID_CYPRESS_SEMICONDUCTOR 0x04b4U // Cypress Semiconductor Corp. +#define UHS_VID_ROHM_LSI_SYSTEMS_USA 0x04b5U // ROHM LSI Systems USA, LLC +#define UHS_VID_HINT 0x04b6U // Hint Corp. +#define UHS_VID_COMPAL_ELECTRONICS 0x04b7U // Compal Electronics, Inc. +#define UHS_VID_SEIKO_EPSON 0x04b8U // Seiko Epson Corp. +#define UHS_VID_RAINBOW_TECHNOLOGIES 0x04b9U // Rainbow Technologies, Inc. +#define UHS_VID_TOUCAN_SYSTEMS 0x04baU // Toucan Systems, Ltd +#define UHS_VID_I_O_DATA_DEVICE 0x04bbU // I-O Data Device, Inc. +#define UHS_VID_TOSHIBA_ELECTRONICS_TAIWAN 0x04bdU // Toshiba Electronics Taiwan Corp. +#define UHS_VID_TELIA_RESEARCH 0x04beU // Telia Research AB +#define UHS_VID_TDK 0x04bfU // TDK Corp. +#define UHS_VID_US_ROBOTICS_3COM 0x04c1U // U.S. Robotics (3Com) +#define UHS_VID_METHODE_ELECTRONICS_FAR_EAST_PTE 0x04c2U // Methode Electronics Far East PTE, Ltd +#define UHS_VID_MAXI_SWITCH 0x04c3U // Maxi Switch, Inc. +#define UHS_VID_LOCKHEED_MARTIN_ENERGY_RESEARCH 0x04c4U // Lockheed Martin Energy Research +#define UHS_VID_FUJITSU 0x04c5U // Fujitsu, Ltd +#define UHS_VID_TOSHIBA_AMERICA_ELECTRONIC_COMPONENTS 0x04c6U // Toshiba America Electronic Components +#define UHS_VID_MICRO_MACRO_TECHNOLOGIES 0x04c7U // Micro Macro Technologies +#define UHS_VID_KONICA 0x04c8U // Konica Corp. +#define UHS_VID_LITE_ON_TECHNOLOGY 0x04caU // Lite-On Technology Corp. +#define UHS_VID_FUJI_PHOTO_FILM 0x04cbU // Fuji Photo Film Co., Ltd +#define UHS_VID_ST_ERICSSON 0x04ccU // ST-Ericsson +#define UHS_VID_TATUNG_CO_OF_AMERICA 0x04cdU // Tatung Co. Of America +#define UHS_VID_SCANLOGIC 0x04ceU // ScanLogic Corp. +#define UHS_VID_MYSON_CENTURY 0x04cfU // Myson Century, Inc. +#define UHS_VID_DIGI_INTERNATIONAL 0x04d0U // Digi International +#define UHS_VID_ITT_CANON 0x04d1U // ITT Canon +#define UHS_VID_ALTEC_LANSING_TECHNOLOGIES 0x04d2U // Altec Lansing Technologies +#define UHS_VID_VIDUS 0x04d3U // VidUS, Inc. +#define UHS_VID_LSI_LOGIC 0x04d4U // LSI Logic, Inc. +#define UHS_VID_FORTE_TECHNOLOGIES 0x04d5U // Forte Technologies, Inc. +#define UHS_VID_MENTOR_GRAPHICS 0x04d6U // Mentor Graphics +#define UHS_VID_OKI_SEMICONDUCTOR 0x04d7U // Oki Semiconductor +#define UHS_VID_MICROCHIP_TECHNOLOGY 0x04d8U // Microchip Technology, Inc. +#define UHS_VID_HOLTEK_SEMICONDUCTOR 0x04d9U // Holtek Semiconductor, Inc. +#define UHS_VID_PANASONIC_MATSUSHITA 0x04daU // Panasonic (Matsushita) +#define UHS_VID_HYPERTEC_PTY 0x04dbU // Hypertec Pty, Ltd +#define UHS_VID_HUAN_HSIN_HOLDINGS 0x04dcU // Huan Hsin Holdings, Ltd +#define UHS_VID_SHARP 0x04ddU // Sharp Corp. +#define UHS_VID_MINDSHARE 0x04deU // MindShare, Inc. +#define UHS_VID_INTERLINK_ELECTRONICS 0x04dfU // Interlink Electronics +#define UHS_VID_IIYAMA_NORTH_AMERICA 0x04e1U // Iiyama North America, Inc. +#define UHS_VID_EXAR 0x04e2U // Exar Corp. +#define UHS_VID_ZILOG 0x04e3U // Zilog, Inc. +#define UHS_VID_ACC_MICROELECTRONICS 0x04e4U // ACC Microelectronics +#define UHS_VID_PROMISE_TECHNOLOGY 0x04e5U // Promise Technology +#define UHS_VID_SCM_MICROSYSTEMS 0x04e6U // SCM Microsystems, Inc. +#define UHS_VID_ELO_TOUCHSYSTEMS 0x04e7U // Elo TouchSystems +#define UHS_VID_SAMSUNG_ELECTRONICS 0x04e8U // Samsung Electronics Co., Ltd +#define UHS_VID_PC_TEL 0x04e9U // PC-Tel, Inc. +#define UHS_VID_BROOKTREE 0x04eaU // Brooktree Corp. +#define UHS_VID_NORTHSTAR_SYSTEMS 0x04ebU // Northstar Systems, Inc. +#define UHS_VID_TOKYO_ELECTRON_DEVICE 0x04ecU // Tokyo Electron Device, Ltd +#define UHS_VID_ANNABOOKS 0x04edU // Annabooks +#define UHS_VID_PACIFIC_ELECTRONIC_INTERNATIONAL 0x04efU // Pacific Electronic International, Inc. +#define UHS_VID_DAEWOO_ELECTRONICS 0x04f0U // Daewoo Electronics Co., Ltd +#define UHS_VID_VICTOR_COMPANY_OF_JAPAN 0x04f1U // Victor Company of Japan, Ltd +#define UHS_VID_CHICONY_ELECTRONICS_1 0x04f2U // Chicony Electronics Co., Ltd +#define UHS_VID_ELAN_MICROELECTRONICS 0x04f3U // Elan Microelectronics Corp. +#define UHS_VID_HARTING_ELEKTRONIK 0x04f4U // Harting Elektronik, Inc. +#define UHS_VID_FUJITSU_ICL_SYSTEMS 0x04f5U // Fujitsu-ICL Systems, Inc. +#define UHS_VID_NORAND 0x04f6U // Norand Corp. +#define UHS_VID_NEWNEX_TECHNOLOGY 0x04f7U // Newnex Technology Corp. +#define UHS_VID_FUTUREPLUS_SYSTEMS 0x04f8U // FuturePlus Systems +#define UHS_VID_BROTHER_INDUSTRIES 0x04f9U // Brother Industries, Ltd +#define UHS_VID_DALLAS_SEMICONDUCTOR 0x04faU // Dallas Semiconductor +#define UHS_VID_BIOSTAR_MICROTECH_INTERNATIONAL 0x04fbU // Biostar Microtech International Corp. +#define UHS_VID_SUNPLUS_TECHNOLOGY 0x04fcU // Sunplus Technology Co., Ltd +#define UHS_VID_SOLITON_SYSTEMS_KK 0x04fdU // Soliton Systems, K.K. +#define UHS_VID_PFU 0x04feU // PFU, Ltd +#define UHS_VID_E_CMOS 0x04ffU // E-CMOS Corp. +#define UHS_VID_SIAM_UNITED_HI_TECH 0x0500U // Siam United Hi-Tech +#define UHS_VID_FUJIKURA_DDK 0x0501U // Fujikura DDK, Ltd +#define UHS_VID_ACER_1 0x0502U // Acer, Inc. +#define UHS_VID_HITACHI_AMERICA 0x0503U // Hitachi America, Ltd +#define UHS_VID_HAYES_MICROCOMPUTER_PRODUCTS 0x0504U // Hayes Microcomputer Products +#define UHS_VID_3COM 0x0506U // 3Com Corp. +#define UHS_VID_HOSIDEN 0x0507U // Hosiden Corp. +#define UHS_VID_CLARION 0x0508U // Clarion Co., Ltd +#define UHS_VID_AZTECH_SYSTEMS 0x0509U // Aztech Systems, Ltd +#define UHS_VID_CINCH_CONNECTORS 0x050aU // Cinch Connectors +#define UHS_VID_CABLE_SYSTEM_INTERNATIONAL 0x050bU // Cable System International +#define UHS_VID_INNOMEDIA 0x050cU // InnoMedia, Inc. +#define UHS_VID_BELKIN_COMPONENTS 0x050dU // Belkin Components +#define UHS_VID_NEON_TECHNOLOGY 0x050eU // Neon Technology, Inc. +#define UHS_VID_KC_TECHNOLOGY 0x050fU // KC Technology, Inc. +#define UHS_VID_SEJIN_ELECTRON 0x0510U // Sejin Electron, Inc. +#define UHS_VID_NABLE_DATABOOK_TECHNOLOGIES 0x0511U // N'Able (DataBook) Technologies, Inc. +#define UHS_VID_HUALON_MICROELECTRONICS 0x0512U // Hualon Microelectronics Corp. +#define UHS_VID_DIGITAL_X 0x0513U // digital-X, Inc. +#define UHS_VID_FCI_ELECTRONICS 0x0514U // FCI Electronics +#define UHS_VID_ACTC 0x0515U // ACTC +#define UHS_VID_LONGWELL_ELECTRONICS 0x0516U // Longwell Electronics +#define UHS_VID_BUTTERFLY_COMMUNICATIONS 0x0517U // Butterfly Communications +#define UHS_VID_EZKEY 0x0518U // EzKEY Corp. +#define UHS_VID_STAR_MICRONICS 0x0519U // Star Micronics Co., Ltd +#define UHS_VID_WYSE_TECHNOLOGY 0x051aU // WYSE Technology +#define UHS_VID_SILICON_GRAPHICS 0x051bU // Silicon Graphics +#define UHS_VID_SHUTTLE 0x051cU // Shuttle, Inc. +#define UHS_VID_AMERICAN_POWER_CONVERSION 0x051dU // American Power Conversion +#define UHS_VID_SCIENTIFIC_ATLANTA 0x051eU // Scientific Atlanta, Inc. +#define UHS_VID_IO_SYSTEMS_ELITE_ELECTRONICS 0x051fU // IO Systems (Elite Electronics), Inc. +#define UHS_VID_TAIWAN_SEMICONDUCTOR_MANUFACTURING 0x0520U // Taiwan Semiconductor Manufacturing Co. +#define UHS_VID_AIRBORN_CONNECTORS 0x0521U // Airborn Connectors +#define UHS_VID_ADVANCED_CONNECTEK 0x0522U // Advanced Connectek, Inc. +#define UHS_VID_ATEN 0x0523U // ATEN GmbH +#define UHS_VID_SOLA_ELECTRONICS 0x0524U // Sola Electronics +#define UHS_VID_NETCHIP_TECHNOLOGY 0x0525U // Netchip Technology, Inc. +#define UHS_VID_TEMIC_MHS 0x0526U // Temic MHS S.A. +#define UHS_VID_ALTRA 0x0527U // ALTRA +#define UHS_VID_ATI_TECHNOLOGIES 0x0528U // ATI Technologies, Inc. +#define UHS_VID_ALADDIN_KNOWLEDGE_SYSTEMS 0x0529U // Aladdin Knowledge Systems +#define UHS_VID_CRESCENT_HEART_SOFTWARE 0x052aU // Crescent Heart Software +#define UHS_VID_TEKOM_TECHNOLOGIES 0x052bU // Tekom Technologies, Inc. +#define UHS_VID_CANON_INFORMATION_SYSTEMS 0x052cU // Canon Information Systems, Inc. +#define UHS_VID_AVID_ELECTRONICS 0x052dU // Avid Electronics Corp. +#define UHS_VID_STANDARD_MICROSYSTEMS_1 0x052eU // Standard Microsystems Corp. +#define UHS_VID_UNICORE_SOFTWARE 0x052fU // Unicore Software, Inc. +#define UHS_VID_AMERICAN_MICROSYSTEMS 0x0530U // American Microsystems, Inc. +#define UHS_VID_WACOM_TECHNOLOGY 0x0531U // Wacom Technology Corp. +#define UHS_VID_SYSTECH 0x0532U // Systech Corp. +#define UHS_VID_ALCATEL_MOBILE_PHONES 0x0533U // Alcatel Mobile Phones +#define UHS_VID_MOTOROLA 0x0534U // Motorola, Inc. +#define UHS_VID_LIH_TZU_ELECTRIC 0x0535U // LIH TZU Electric Co., Ltd +#define UHS_VID_HAND_HELD_PRODUCTS_WELCH_ALLYN 0x0536U // Hand Held Products (Welch Allyn, Inc.) +#define UHS_VID_INVENTEC 0x0537U // Inventec Corp. +#define UHS_VID_CALDERA_INTERNATIONAL_INC_SCO 0x0538U // Caldera International, Inc. (SCO) +#define UHS_VID_SHYH_SHIUN_TERMINALS 0x0539U // Shyh Shiun Terminals Co., Ltd +#define UHS_VID_PREHKEYTEC 0x053aU // PrehKeyTec GmbH +#define UHS_VID_GLOBAL_VILLAGE_COMMUNICATION 0x053bU // Global Village Communication +#define UHS_VID_INSTITUT_OF_MICROELECTRONIC_AND_MECHATRONIC_SYSTEMS 0x053cU // Institut of Microelectronic & Mechatronic Systems +#define UHS_VID_SILICON_ARCHITECT 0x053dU // Silicon Architect +#define UHS_VID_MOBILITY_ELECTRONICS 0x053eU // Mobility Electronics +#define UHS_VID_SYNOPSYS_1 0x053fU // Synopsys, Inc. +#define UHS_VID_UNIACCESS 0x0540U // UniAccess AB +#define UHS_VID_SIRF_TECHNOLOGY 0x0541U // Sirf Technology, Inc. +#define UHS_VID_VIEWSONIC 0x0543U // ViewSonic Corp. +#define UHS_VID_CRISTIE_ELECTRONICS 0x0544U // Cristie Electronics, Ltd +#define UHS_VID_XIRLINK 0x0545U // Xirlink, Inc. +#define UHS_VID_POLAROID 0x0546U // Polaroid Corp. +#define UHS_VID_ANCHOR_CHIPS 0x0547U // Anchor Chips, Inc. +#define UHS_VID_TYAN_COMPUTER 0x0548U // Tyan Computer Corp. +#define UHS_VID_PIXERA 0x0549U // Pixera Corp. +#define UHS_VID_FUJITSU_MICROELECTRONICS 0x054aU // Fujitsu Microelectronics, Inc. +#define UHS_VID_NEW_MEDIA 0x054bU // New Media Corp. +#define UHS_VID_SONY 0x054cU // Sony Corp. +#define UHS_VID_TRY 0x054dU // Try Corp. +#define UHS_VID_PROSIDE 0x054eU // Proside Corp. +#define UHS_VID_WYSE_TECHNOLOGY_TAIWAN 0x054fU // WYSE Technology Taiwan +#define UHS_VID_FUJI_XEROX 0x0550U // Fuji Xerox Co., Ltd +#define UHS_VID_COMPUTREND_SYSTEMS 0x0551U // CompuTrend Systems, Inc. +#define UHS_VID_PHILIPS_MONITORS 0x0552U // Philips Monitors +#define UHS_VID_STMICROELECTRONICS_IMAGING_DIVISION_VLSI_VISION 0x0553U // STMicroelectronics Imaging Division (VLSI Vision) +#define UHS_VID_DICTAPHONE 0x0554U // Dictaphone Corp. +#define UHS_VID_ANAM_SANDT 0x0555U // ANAM S&T Co., Ltd +#define UHS_VID_ASAHI_KASEI_MICROSYSTEMS 0x0556U // Asahi Kasei Microsystems Co., Ltd +#define UHS_VID_ATEN_INTERNATIONAL 0x0557U // ATEN International Co., Ltd +#define UHS_VID_TRUEVISION 0x0558U // Truevision, Inc. +#define UHS_VID_CADENCE_DESIGN_SYSTEMS 0x0559U // Cadence Design Systems, Inc. +#define UHS_VID_KENWOOD_USA 0x055aU // Kenwood USA +#define UHS_VID_KNOWLEDGETEK 0x055bU // KnowledgeTek, Inc. +#define UHS_VID_PROTON_ELECTRONIC_IND 0x055cU // Proton Electronic Ind. +#define UHS_VID_SAMSUNG_ELECTRO_MECHANICS 0x055dU // Samsung Electro-Mechanics Co. +#define UHS_VID_CTX_OPTO_ELECTRONICS 0x055eU // CTX Opto-Electronics Corp. +#define UHS_VID_MUSTEK_SYSTEMS 0x055fU // Mustek Systems, Inc. +#define UHS_VID_INTERFACE 0x0560U // Interface Corp. +#define UHS_VID_OASIS_DESIGN 0x0561U // Oasis Design, Inc. +#define UHS_VID_TELEX_COMMUNICATIONS 0x0562U // Telex Communications, Inc. +#define UHS_VID_IMMERSION 0x0563U // Immersion Corp. +#define UHS_VID_KODAK_DIGITAL_PRODUCT_CENTER_JAPAN_LTD_FORMERLY_CHINON_INDUSTRIES 0x0564U // Kodak Digital Product Center, Japan Ltd. (formerly Chinon Industries Inc.) +#define UHS_VID_PERACOM_NETWORKS 0x0565U // Peracom Networks, Inc. +#define UHS_VID_MONTEREY_INTERNATIONAL 0x0566U // Monterey International Corp. +#define UHS_VID_XYRATEX_INTERNATIONAL 0x0567U // Xyratex International, Ltd +#define UHS_VID_QUARTZ_INGENIERIE 0x0568U // Quartz Ingenierie +#define UHS_VID_SEGASOFT 0x0569U // SegaSoft +#define UHS_VID_WACOM 0x056aU // Wacom Co., Ltd +#define UHS_VID_DECICON 0x056bU // Decicon, Inc. +#define UHS_VID_ETEK_LABS 0x056cU // eTEK Labs +#define UHS_VID_EIZO 0x056dU // EIZO Corp. +#define UHS_VID_ELECOM 0x056eU // Elecom Co., Ltd +#define UHS_VID_KOREA_DATA_SYSTEMS 0x056fU // Korea Data Systems Co., Ltd +#define UHS_VID_EPSON_AMERICA 0x0570U // Epson America +#define UHS_VID_INTEREX 0x0571U // Interex, Inc. +#define UHS_VID_CONEXANT_SYSTEMS_ROCKWELL 0x0572U // Conexant Systems (Rockwell), Inc. +#define UHS_VID_ZORAN_CO_PERSONAL_MEDIA_DIVISION_NOGATECH 0x0573U // Zoran Co. Personal Media Division (Nogatech) +#define UHS_VID_CITY_UNIVERSITY_OF_HONG_KONG 0x0574U // City University of Hong Kong +#define UHS_VID_PHILIPS_CREATIVE_DISPLAY_SOLUTIONS 0x0575U // Philips Creative Display Solutions +#define UHS_VID_BAFOQUALITY_COMPUTER_ACCESSORIES 0x0576U // BAFO/Quality Computer Accessories +#define UHS_VID_ELSA 0x0577U // ELSA +#define UHS_VID_INTRINSIX 0x0578U // Intrinsix Corp. +#define UHS_VID_GVC 0x0579U // GVC Corp. +#define UHS_VID_SAMSUNG_ELECTRONICS_AMERICA 0x057aU // Samsung Electronics America +#define UHS_VID_Y_E_DATA 0x057bU // Y-E Data, Inc. +#define UHS_VID_AVM 0x057cU // AVM GmbH +#define UHS_VID_SHARK_MULTIMEDIA 0x057dU // Shark Multimedia, Inc. +#define UHS_VID_NINTENDO 0x057eU // Nintendo Co., Ltd +#define UHS_VID_QUICKSHOT 0x057fU // QuickShot, Ltd +#define UHS_VID_DENRON 0x0580U // Denron, Inc. +#define UHS_VID_RACAL_DATA_GROUP 0x0581U // Racal Data Group +#define UHS_VID_ROLAND 0x0582U // Roland Corp. +#define UHS_VID_PADIX_CO_LTD_ROCKFIRE 0x0583U // Padix Co., Ltd (Rockfire) +#define UHS_VID_RATOC_SYSTEM 0x0584U // RATOC System, Inc. +#define UHS_VID_FLASHPOINT_TECHNOLOGY 0x0585U // FlashPoint Technology, Inc. +#define UHS_VID_ZYXEL_COMMUNICATIONS 0x0586U // ZyXEL Communications Corp. +#define UHS_VID_AMERICA_KOTOBUKI_ELECTRONICS_INDUSTRIES 0x0587U // America Kotobuki Electronics Industries, Inc. +#define UHS_VID_SAPIEN_DESIGN 0x0588U // Sapien Design +#define UHS_VID_VICTRON 0x0589U // Victron +#define UHS_VID_NOHAU 0x058aU // Nohau Corp. +#define UHS_VID_INFINEON_TECHNOLOGIES 0x058bU // Infineon Technologies +#define UHS_VID_IN_FOCUS_SYSTEMS 0x058cU // In Focus Systems +#define UHS_VID_MICREL_SEMICONDUCTOR 0x058dU // Micrel Semiconductor +#define UHS_VID_TRIPATH_TECHNOLOGY 0x058eU // Tripath Technology, Inc. +#define UHS_VID_ALCOR_MICRO 0x058fU // Alcor Micro Corp. +#define UHS_VID_OMRON 0x0590U // Omron Corp. +#define UHS_VID_QUESTRA_CONSULTING 0x0591U // Questra Consulting +#define UHS_VID_POWERWARE 0x0592U // Powerware Corp. +#define UHS_VID_INCITE 0x0593U // Incite +#define UHS_VID_PRINCETON_GRAPHIC_SYSTEMS 0x0594U // Princeton Graphic Systems +#define UHS_VID_ZORAN_MICROELECTRONICS 0x0595U // Zoran Microelectronics, Ltd +#define UHS_VID_MICROTOUCH_SYSTEMS 0x0596U // MicroTouch Systems, Inc. +#define UHS_VID_TRISIGNAL_COMMUNICATIONS 0x0597U // Trisignal Communications +#define UHS_VID_NIIGATA_CANOTEC 0x0598U // Niigata Canotec Co., Inc. +#define UHS_VID_BRILLIANCE_SEMICONDUCTOR 0x0599U // Brilliance Semiconductor, Inc. +#define UHS_VID_SPECTRUM_SIGNAL_PROCESSING 0x059aU // Spectrum Signal Processing, Inc. +#define UHS_VID_IOMEGA 0x059bU // Iomega Corp. +#define UHS_VID_A_TREND_TECHNOLOGY 0x059cU // A-Trend Technology Co., Ltd +#define UHS_VID_ADVANCED_INPUT_DEVICES 0x059dU // Advanced Input Devices +#define UHS_VID_INTELLIGENT_INSTRUMENTATION 0x059eU // Intelligent Instrumentation +#define UHS_VID_LACIE 0x059fU // LaCie, Ltd +#define UHS_VID_VETRONIX 0x05a0U // Vetronix Corp. +#define UHS_VID_USC 0x05a1U // USC Corp. +#define UHS_VID_FUJI_FILM_MICRODEVICES 0x05a2U // Fuji Film Microdevices Co., Ltd +#define UHS_VID_ARC_INTERNATIONAL 0x05a3U // ARC International +#define UHS_VID_ORTEK_TECHNOLOGY 0x05a4U // Ortek Technology, Inc. +#define UHS_VID_SAMPO_TECHNOLOGY 0x05a5U // Sampo Technology Corp. +#define UHS_VID_CISCO_SYSTEMS 0x05a6U // Cisco Systems, Inc. +#define UHS_VID_BOSE 0x05a7U // Bose Corp. +#define UHS_VID_SPACETEC_IMC 0x05a8U // Spacetec IMC Corp. +#define UHS_VID_OMNIVISION_TECHNOLOGIES 0x05a9U // OmniVision Technologies, Inc. +#define UHS_VID_UTILUX_SOUTH_CHINA 0x05aaU // Utilux South China, Ltd +#define UHS_VID_IN_SYSTEM_DESIGN 0x05abU // In-System Design +#define UHS_VID_APPLE 0x05acU // Apple, Inc. +#define UHS_VID_YC_CABLE_USA 0x05adU // Y.C. Cable U.S.A., Inc. +#define UHS_VID_SYNOPSYS_2 0x05aeU // Synopsys, Inc. +#define UHS_VID_JING_MOLD_ENTERPRISE 0x05afU // Jing-Mold Enterprise Co., Ltd +#define UHS_VID_FOUNTAIN_TECHNOLOGIES 0x05b0U // Fountain Technologies, Inc. +#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER 0x05b1U // First International Computer, Inc. +#define UHS_VID_LG_SEMICON 0x05b4U // LG Semicon Co., Ltd +#define UHS_VID_DIALOGIC 0x05b5U // Dialogic Corp. +#define UHS_VID_PROXIMA 0x05b6U // Proxima Corp. +#define UHS_VID_MEDIANIX_SEMICONDUCTOR 0x05b7U // Medianix Semiconductor, Inc. +#define UHS_VID_AGILER 0x05b8U // Agiler, Inc. +#define UHS_VID_PHILIPS_RESEARCH_LABORATORIES 0x05b9U // Philips Research Laboratories +#define UHS_VID_DIGITALPERSONA 0x05baU // DigitalPersona, Inc. +#define UHS_VID_GREY_CELL_SYSTEMS 0x05bbU // Grey Cell Systems +#define UHS_VID_3G_GREEN_GREEN_GLOBE 0x05bcU // 3G Green Green Globe Co., Ltd +#define UHS_VID_RAFI_GMBH_AND_CO_KG 0x05bdU // RAFI GmbH & Co. KG +#define UHS_VID_TYCO_ELECTRONICS_RAYCHEM 0x05beU // Tyco Electronics (Raychem) +#define UHS_VID_S_AND_S_RESEARCH 0x05bfU // S & S Research +#define UHS_VID_KEIL_SOFTWARE 0x05c0U // Keil Software +#define UHS_VID_KAWASAKI_MICROELECTRONICS 0x05c1U // Kawasaki Microelectronics, Inc. +#define UHS_VID_MEDIA_PHONICS_SUISSE 0x05c2U // Media Phonics (Suisse) S.A. +#define UHS_VID_DIGI_INTERNATIONAL_1 0x05c5U // Digi International, Inc. +#define UHS_VID_QUALCOMM 0x05c6U // Qualcomm, Inc. +#define UHS_VID_QTRONIX 0x05c7U // Qtronix Corp. +#define UHS_VID_CHENG_UEI_PRECISION_INDUSTRY_CO_LTD_FOXLINK 0x05c8U // Cheng Uei Precision Industry Co., Ltd (Foxlink) +#define UHS_VID_SEMTECH_1 0x05c9U // Semtech Corp. +#define UHS_VID_RICOH 0x05caU // Ricoh Co., Ltd +#define UHS_VID_POWERVISION_TECHNOLOGIES 0x05cbU // PowerVision Technologies, Inc. +#define UHS_VID_ELSA_AG 0x05ccU // ELSA AG +#define UHS_VID_SILICOM 0x05cdU // Silicom, Ltd +#define UHS_VID_SCI_WORX 0x05ceU // sci-worx GmbH +#define UHS_VID_SUNG_FORN 0x05cfU // Sung Forn Co., Ltd +#define UHS_VID_GE_MEDICAL_SYSTEMS_LUNAR 0x05d0U // GE Medical Systems Lunar +#define UHS_VID_BRAINBOXES 0x05d1U // Brainboxes, Ltd +#define UHS_VID_WAVE_SYSTEMS 0x05d2U // Wave Systems Corp. +#define UHS_VID_TOHOKU_RICOH 0x05d3U // Tohoku Ricoh Co., Ltd +#define UHS_VID_SUPER_GATE_TECHNOLOGY 0x05d5U // Super Gate Technology Co., Ltd +#define UHS_VID_PHILIPS_SEMICONDUCTORS_CICT 0x05d6U // Philips Semiconductors, CICT +#define UHS_VID_THOMAS_AND_BETTS 0x05d7U // Thomas & Betts Corp. +#define UHS_VID_ULTIMA_ELECTRONICS 0x05d8U // Ultima Electronics Corp. +#define UHS_VID_AXIOHM_TRANSACTION_SOLUTIONS 0x05d9U // Axiohm Transaction Solutions +#define UHS_VID_MICROTEK_INTERNATIONAL 0x05daU // Microtek International, Inc. +#define UHS_VID_SUN_CORP_SUNTAC_UNKNOWN 0x05dbU // Sun Corp. (Suntac?) +#define UHS_VID_LEXAR_MEDIA 0x05dcU // Lexar Media, Inc. +#define UHS_VID_DELTA_ELECTRONICS 0x05ddU // Delta Electronics, Inc. +#define UHS_VID_SILICON_VISION 0x05dfU // Silicon Vision, Inc. +#define UHS_VID_SYMBOL_TECHNOLOGIES 0x05e0U // Symbol Technologies +#define UHS_VID_SYNTEK_SEMICONDUCTOR 0x05e1U // Syntek Semiconductor Co., Ltd +#define UHS_VID_ELECVISION 0x05e2U // ElecVision, Inc. +#define UHS_VID_GENESYS_LOGIC 0x05e3U // Genesys Logic, Inc. +#define UHS_VID_RED_WING 0x05e4U // Red Wing Corp. +#define UHS_VID_FUJI_ELECTRIC 0x05e5U // Fuji Electric Co., Ltd +#define UHS_VID_KEITHLEY_INSTRUMENTS 0x05e6U // Keithley Instruments +#define UHS_VID_ICC 0x05e8U // ICC, Inc. +#define UHS_VID_KAWASAKI_LSI 0x05e9U // Kawasaki LSI +#define UHS_VID_FFC 0x05ebU // FFC, Ltd +#define UHS_VID_COM21 0x05ecU // COM21, Inc. +#define UHS_VID_CYTECHINFO 0x05eeU // Cytechinfo Inc. +#define UHS_VID_AVB_INC_ANKO_UNKNOWN_ 0x05efU // AVB, Inc. [anko?] +#define UHS_VID_CANOPUS 0x05f0U // Canopus Co., Ltd +#define UHS_VID_COMPASS_COMMUNICATIONS 0x05f1U // Compass Communications +#define UHS_VID_DEXIN 0x05f2U // Dexin Corp., Ltd +#define UHS_VID_PI_ENGINEERING 0x05f3U // PI Engineering, Inc. +#define UHS_VID_UNIXTAR_TECHNOLOGY 0x05f5U // Unixtar Technology, Inc. +#define UHS_VID_AOC_INTERNATIONAL 0x05f6U // AOC International +#define UHS_VID_RFC_DISTRIBUTIONS_PTE 0x05f7U // RFC Distribution(s) PTE, Ltd +#define UHS_VID_PSC_SCANNING 0x05f9U // PSC Scanning, Inc. +#define UHS_VID_SIEMENS_TELECOMMUNICATIONS_SYSTEMS 0x05faU // Siemens Telecommunications Systems, Ltd +#define UHS_VID_HARMAN 0x05fcU // Harman +#define UHS_VID_INTERACT 0x05fdU // InterAct, Inc. +#define UHS_VID_CHIC_TECHNOLOGY 0x05feU // Chic Technology Corp. +#define UHS_VID_LECROY 0x05ffU // LeCroy Corp. +#define UHS_VID_BARCO_DISPLAY_SYSTEMS 0x0600U // Barco Display Systems +#define UHS_VID_JAZZ_HIPSTER 0x0601U // Jazz Hipster Corp. +#define UHS_VID_VISTA_IMAGING 0x0602U // Vista Imaging, Inc. +#define UHS_VID_NOVATEK_MICROELECTRONICS 0x0603U // Novatek Microelectronics Corp. +#define UHS_VID_JEAN 0x0604U // Jean Co., Ltd +#define UHS_VID_ANCHOR_CANDC 0x0605U // Anchor C&C Co., Ltd +#define UHS_VID_ROYAL_INFORMATION_ELECTRONICS 0x0606U // Royal Information Electronics Co., Ltd +#define UHS_VID_BRIDGE_INFORMATION 0x0607U // Bridge Information Co., Ltd +#define UHS_VID_GENRAD_ADS 0x0608U // Genrad Ads +#define UHS_VID_SMK_MANUFACTURING 0x0609U // SMK Manufacturing, Inc. +#define UHS_VID_WORTHINGTON_DATA_SOLUTIONS 0x060aU // Worthington Data Solutions, Inc. +#define UHS_VID_SOLID_YEAR 0x060bU // Solid Year +#define UHS_VID_EEH_DATALINK 0x060cU // EEH Datalink GmbH +#define UHS_VID_AUCTOR 0x060dU // Auctor Corp. +#define UHS_VID_TRANSMONDE_TECHNOLOGIES 0x060eU // Transmonde Technologies, Inc. +#define UHS_VID_JOINSOON_ELECTRONICS_MFG 0x060fU // Joinsoon Electronics Mfg. Co., Ltd +#define UHS_VID_COSTAR_ELECTRONICS 0x0610U // Costar Electronics, Inc. +#define UHS_VID_TOTOKU_ELECTRIC 0x0611U // Totoku Electric Co., Ltd +#define UHS_VID_TRANSACT_TECHNOLOGIES 0x0613U // TransAct Technologies, Inc. +#define UHS_VID_BIO_RAD_LABORATORIES 0x0614U // Bio-Rad Laboratories +#define UHS_VID_QUABBIN_WIRE_AND_CABLE 0x0615U // Quabbin Wire & Cable Co., Inc. +#define UHS_VID_FUTURE_TECHNO_DESIGNS_PVT 0x0616U // Future Techno Designs PVT, Ltd +#define UHS_VID_SWISS_FEDERAL_INSITUTE_OF_TECHNOLOGY 0x0617U // Swiss Federal Insitute of Technology +#define UHS_VID_MACALLY 0x0618U // MacAlly +#define UHS_VID_SEIKO_INSTRUMENTS 0x0619U // Seiko Instruments, Inc. +#define UHS_VID_VERIDICOM_INTERNATIONAL 0x061aU // Veridicom International, Inc. +#define UHS_VID_PROMPTUS_COMMUNICATIONS 0x061bU // Promptus Communications, Inc. +#define UHS_VID_ACT_LABS 0x061cU // Act Labs, Ltd +#define UHS_VID_QUATECH 0x061dU // Quatech, Inc. +#define UHS_VID_NISSEI_ELECTRIC 0x061eU // Nissei Electric Co. +#define UHS_VID_ALARIS 0x0620U // Alaris, Inc. +#define UHS_VID_ODU_STECKVERBINDUNGSSYSTEME_GMBH_AND_CO_KG 0x0621U // ODU-Steckverbindungssysteme GmbH & Co. KG +#define UHS_VID_IOTECH 0x0622U // Iotech, Inc. +#define UHS_VID_LITTELFUSE 0x0623U // Littelfuse, Inc. +#define UHS_VID_AVOCENT 0x0624U // Avocent Corp. +#define UHS_VID_TIMEDIA_TECHNOLOGY 0x0625U // TiMedia Technology Co., Ltd +#define UHS_VID_NIPPON_SYSTEMS_DEVELOPMENT 0x0626U // Nippon Systems Development Co., Ltd +#define UHS_VID_ADOMAX_TECHNOLOGY 0x0627U // Adomax Technology Co., Ltd +#define UHS_VID_TASKING_SOFTWARE 0x0628U // Tasking Software, Inc. +#define UHS_VID_ZIDA_TECHNOLOGIES 0x0629U // Zida Technologies, Ltd +#define UHS_VID_CREATIVE_LABS 0x062aU // Creative Labs +#define UHS_VID_GREATLINK_ELECTRONICS_TAIWAN 0x062bU // Greatlink Electronics Taiwan, Ltd +#define UHS_VID_INSTITUTE_FOR_INFORMATION_INDUSTRY 0x062cU // Institute for Information Industry +#define UHS_VID_TAIWAN_TAI_HAO_ENTERPRISES 0x062dU // Taiwan Tai-Hao Enterprises Co., Ltd +#define UHS_VID_MAINSUPER_ENTERPRISES 0x062eU // Mainsuper Enterprises Co., Ltd +#define UHS_VID_SIN_SHENG_TERMINAL_AND_MACHINE 0x062fU // Sin Sheng Terminal & Machine, Inc. +#define UHS_VID_JUJO_ELECTRONICS 0x0631U // JUJO Electronics Corp. +#define UHS_VID_CYRIX 0x0633U // Cyrix Corp. +#define UHS_VID_MICRON_TECHNOLOGY 0x0634U // Micron Technology, Inc. +#define UHS_VID_METHODE_ELECTRONICS 0x0635U // Methode Electronics, Inc. +#define UHS_VID_SIERRA_IMAGING 0x0636U // Sierra Imaging, Inc. +#define UHS_VID_AVISION 0x0638U // Avision, Inc. +#define UHS_VID_CHRONTEL 0x0639U // Chrontel, Inc. +#define UHS_VID_TECHWIN 0x063aU // Techwin Corp. +#define UHS_VID_TAUGAGREINING_HF_1 0x063bU // Taugagreining HF +#define UHS_VID_YAMAICHI_ELECTRONICS_CO_LTD_SAKURA 0x063cU // Yamaichi Electronics Co., Ltd (Sakura) +#define UHS_VID_FONG_KAI_INDUSTRIAL 0x063dU // Fong Kai Industrial Co., Ltd +#define UHS_VID_REALMEDIA_TECHNOLOGY 0x063eU // RealMedia Technology, Inc. +#define UHS_VID_NEW_TECHNOLOGY_CABLE 0x063fU // New Technology Cable, Ltd +#define UHS_VID_HITEX_DEVELOPMENT_TOOLS 0x0640U // Hitex Development Tools +#define UHS_VID_WOODS_INDUSTRIES 0x0641U // Woods Industries, Inc. +#define UHS_VID_VIA_MEDICAL 0x0642U // VIA Medical Corp. +#define UHS_VID_TEAC 0x0644U // TEAC Corp. +#define UHS_VID_WHO_UNKNOWN_VISION_SYSTEMS 0x0645U // Who? Vision Systems, Inc. +#define UHS_VID_UMAX 0x0646U // UMAX +#define UHS_VID_ACTON_RESEARCH 0x0647U // Acton Research Corp. +#define UHS_VID_INSIDE_OUT_NETWORKS 0x0648U // Inside Out Networks +#define UHS_VID_WELI_SCIENCE 0x0649U // Weli Science Co., Ltd +#define UHS_VID_ANALOG_DEVICES_INC_WHITE_MOUNTAIN_DSP 0x064bU // Analog Devices, Inc. (White Mountain DSP) +#define UHS_VID_JI_HAW_INDUSTRIAL 0x064cU // Ji-Haw Industrial Co., Ltd +#define UHS_VID_TRITECH_MICROELECTRONICS 0x064dU // TriTech Microelectronics, Ltd +#define UHS_VID_SUYIN 0x064eU // Suyin Corp. +#define UHS_VID_WIBU_SYSTEMS_AG 0x064fU // WIBU-Systems AG +#define UHS_VID_DYNAPRO_SYSTEMS 0x0650U // Dynapro Systems +#define UHS_VID_LIKOM_TECHNOLOGY_SDN_BHD 0x0651U // Likom Technology Sdn. Bhd. +#define UHS_VID_STARGATE_SOLUTIONS 0x0652U // Stargate Solutions, Inc. +#define UHS_VID_CNF 0x0653U // CNF, Inc. +#define UHS_VID_GRANITE_MICROSYSTEMS 0x0654U // Granite Microsystems, Inc. +#define UHS_VID_SPACE_SHUTTLE_HI_TECH 0x0655U // Space Shuttle Hi-Tech Co., Ltd +#define UHS_VID_GLORY_MARK_ELECTRONIC 0x0656U // Glory Mark Electronic, Ltd +#define UHS_VID_TEKCON_ELECTRONICS 0x0657U // Tekcon Electronics Corp. +#define UHS_VID_SIGMA_DESIGNS 0x0658U // Sigma Designs, Inc. +#define UHS_VID_AETHRA 0x0659U // Aethra +#define UHS_VID_OPTOELECTRONICS 0x065aU // Optoelectronics Co., Ltd +#define UHS_VID_TRACEWELL_SYSTEMS 0x065bU // Tracewell Systems +#define UHS_VID_SILICON_GRAPHICS_1 0x065eU // Silicon Graphics +#define UHS_VID_GOOD_WAY_TECHNOLOGY_CO_LTD_AND_GWC_TECHNOLOGY 0x065fU // Good Way Technology Co., Ltd & GWC technology Inc. +#define UHS_VID_TSAY_E_BVI_INTERNATIONAL 0x0660U // TSAY-E (BVI) International, Inc. +#define UHS_VID_HAMAMATSU_PHOTONICS_KK 0x0661U // Hamamatsu Photonics K.K. +#define UHS_VID_KANSAI_ELECTRIC 0x0662U // Kansai Electric Co., Ltd +#define UHS_VID_TOPMAX_ELECTRONIC 0x0663U // Topmax Electronic Co., Ltd +#define UHS_VID_ETANDT_TECHNOLOGY 0x0664U // ET&T Technology Co., Ltd. +#define UHS_VID_CYPRESS_SEMICONDUCTOR_1 0x0665U // Cypress Semiconductor +#define UHS_VID_AIWA 0x0667U // Aiwa Co., Ltd +#define UHS_VID_WORDWAND 0x0668U // WordWand +#define UHS_VID_OCE_PRINTING_SYSTEMS 0x0669U // Oce' Printing Systems GmbH +#define UHS_VID_TOTAL_TECHNOLOGIES 0x066aU // Total Technologies, Ltd +#define UHS_VID_LINKSYS 0x066bU // Linksys, Inc. +#define UHS_VID_ENTREGA 0x066dU // Entrega, Inc. +#define UHS_VID_ACER_SEMICONDUCTOR_AMERICA 0x066eU // Acer Semiconductor America, Inc. +#define UHS_VID_SIGMATEL 0x066fU // SigmaTel, Inc. +#define UHS_VID_SEQUEL_IMAGING 0x0670U // Sequel Imaging +#define UHS_VID_LABTEC 0x0672U // Labtec, Inc. +#define UHS_VID_HCL 0x0673U // HCL +#define UHS_VID_KEY_MOUSE_ELECTRONIC_ENTERPRISE 0x0674U // Key Mouse Electronic Enterprise Co., Ltd +#define UHS_VID_DRAYTEK 0x0675U // DrayTek Corp. +#define UHS_VID_TELES_AG 0x0676U // Teles AG +#define UHS_VID_AIWA_1 0x0677U // Aiwa Co., Ltd +#define UHS_VID_ACARD_TECHNOLOGY 0x0678U // ACard Technology Corp. +#define UHS_VID_PROLIFIC_TECHNOLOGY 0x067bU // Prolific Technology, Inc. +#define UHS_VID_EFFICIENT_NETWORKS 0x067cU // Efficient Networks, Inc. +#define UHS_VID_HOHNER 0x067dU // Hohner Corp. +#define UHS_VID_INTERMEC_TECHNOLOGIES 0x067eU // Intermec Technologies Corp. +#define UHS_VID_VIRATA 0x067fU // Virata, Ltd +#define UHS_VID_REALTEK_SEMICONDUCTOR_CORP_CPP_DIV_AVANCE_LOGIC 0x0680U // Realtek Semiconductor Corp., CPP Div. (Avance Logic) +#define UHS_VID_SIEMENS_INFORMATION_AND_COMMUNICATION_PRODUCTS 0x0681U // Siemens Information and Communication Products +#define UHS_VID_VICTOR_COMPANY_OF_JAPAN_1 0x0682U // Victor Company of Japan, Ltd +#define UHS_VID_ACTIONTEC_ELECTRONICS 0x0684U // Actiontec Electronics, Inc. +#define UHS_VID_ZD_INCORPORATED 0x0685U // ZD Incorporated +#define UHS_VID_MINOLTA 0x0686U // Minolta Co., Ltd +#define UHS_VID_PERTECH 0x068aU // Pertech, Inc. +#define UHS_VID_POTRANS_INTERNATIONAL 0x068bU // Potrans International, Inc. +#define UHS_VID_CH_PRODUCTS 0x068eU // CH Products, Inc. +#define UHS_VID_GOLDEN_BRIDGE_ELECTECH 0x0690U // Golden Bridge Electech, Inc. +#define UHS_VID_HAGIWARA_SYS_COM 0x0693U // Hagiwara Sys-Com Co., Ltd +#define UHS_VID_LEGO_GROUP 0x0694U // Lego Group +#define UHS_VID_CHUNTEX_CTX 0x0698U // Chuntex (CTX) +#define UHS_VID_TEKTRONIX 0x0699U // Tektronix, Inc. +#define UHS_VID_ASKEY_COMPUTER 0x069aU // Askey Computer Corp. +#define UHS_VID_THOMSON 0x069bU // Thomson, Inc. +#define UHS_VID_HUGHES_NETWORK_SYSTEMS_HNS 0x069dU // Hughes Network Systems (HNS) +#define UHS_VID_WELCAT 0x069eU // Welcat Inc. +#define UHS_VID_ALLIED_DATA_TECHNOLOGIES_BV 0x069fU // Allied Data Technologies BV +#define UHS_VID_TOPRO_TECHNOLOGY 0x06a2U // Topro Technology, Inc. +#define UHS_VID_SAITEK_PLC 0x06a3U // Saitek PLC +#define UHS_VID_XIAMEN_DOOWELL_ELECTRON 0x06a4U // Xiamen Doowell Electron Co., Ltd +#define UHS_VID_DIVIO 0x06a5U // Divio +#define UHS_VID_MICROSTORE 0x06a7U // MicroStore, Inc. +#define UHS_VID_TOPAZ_SYSTEMS 0x06a8U // Topaz Systems, Inc. +#define UHS_VID_WESTELL 0x06a9U // Westell +#define UHS_VID_SYSGRATION 0x06aaU // Sysgration, Ltd +#define UHS_VID_FUJITSU_LABORATORIES_OF_AMERICA 0x06acU // Fujitsu Laboratories of America, Inc. +#define UHS_VID_GREATLAND_ELECTRONICS_TAIWAN 0x06adU // Greatland Electronics Taiwan, Ltd +#define UHS_VID_PROFESSIONAL_MULTIMEDIA_TESTING_CENTRE 0x06aeU // Professional Multimedia Testing Centre +#define UHS_VID_HARTING_INC_OF_NORTH_AMERICA 0x06afU // Harting, Inc. of North America +#define UHS_VID_PIXELA 0x06b8U // Pixela Corp. +#define UHS_VID_ALCATEL_TELECOM 0x06b9U // Alcatel Telecom +#define UHS_VID_SMOOTH_CORD_AND_CONNECTOR 0x06baU // Smooth Cord & Connector Co., Ltd +#define UHS_VID_EDA 0x06bbU // EDA, Inc. +#define UHS_VID_OKI_DATA 0x06bcU // Oki Data Corp. +#define UHS_VID_AGFA_GEVAERT_NV 0x06bdU // AGFA-Gevaert NV +#define UHS_VID_AME_OPTIMEDIA_TECHNOLOGY 0x06beU // AME Optimedia Technology Co., Ltd +#define UHS_VID_LEOCO 0x06bfU // Leoco Corp. +#define UHS_VID_PHIDGETS_INC_FORMERLY_GLAB 0x06c2U // Phidgets Inc. (formerly GLAB) +#define UHS_VID_BIZLINK_INTERNATIONAL 0x06c4U // Bizlink International Corp. +#define UHS_VID_HAGENUK 0x06c5U // Hagenuk, GmbH +#define UHS_VID_INFOWAVE_SOFTWARE 0x06c6U // Infowave Software, Inc. +#define UHS_VID_SIIG 0x06c8U // SIIG, Inc. +#define UHS_VID_TAXAN_EUROPE 0x06c9U // Taxan (Europe), Ltd +#define UHS_VID_NEWER_TECHNOLOGY 0x06caU // Newer Technology, Inc. +#define UHS_VID_SYNAPTICS 0x06cbU // Synaptics, Inc. +#define UHS_VID_TERAYON_COMMUNICATION_SYSTEMS 0x06ccU // Terayon Communication Systems +#define UHS_VID_KEYSPAN 0x06cdU // Keyspan +#define UHS_VID_CONTEC 0x06ceU // Contec +#define UHS_VID_SPHERONVR_AG 0x06cfU // SpheronVR AG +#define UHS_VID_LAPLINK 0x06d0U // LapLink, Inc. +#define UHS_VID_DAEWOO_ELECTRONICS_1 0x06d1U // Daewoo Electronics Co., Ltd +#define UHS_VID_MITSUBISHI_ELECTRIC 0x06d3U // Mitsubishi Electric Corp. +#define UHS_VID_CISCO_SYSTEMS_1 0x06d4U // Cisco Systems +#define UHS_VID_TOSHIBA 0x06d5U // Toshiba +#define UHS_VID_AASHIMA_TECHNOLOGY_BV 0x06d6U // Aashima Technology B.V. +#define UHS_VID_NETWORK_COMPUTING_DEVICES_NCD 0x06d7U // Network Computing Devices (NCD) +#define UHS_VID_TECHNICAL_MARKETING_RESEARCH 0x06d8U // Technical Marketing Research, Inc. +#define UHS_VID_PHOENIXTEC_POWER 0x06daU // Phoenixtec Power Co., Ltd +#define UHS_VID_PARADYNE 0x06dbU // Paradyne +#define UHS_VID_FOXLINK_IMAGE_TECHNOLOGY 0x06dcU // Foxlink Image Technology Co., Ltd +#define UHS_VID_HEISEI_ELECTRONICS 0x06deU // Heisei Electronics Co., Ltd +#define UHS_VID_MULTI_TECH_SYSTEMS 0x06e0U // Multi-Tech Systems, Inc. +#define UHS_VID_ADS_TECHNOLOGIES 0x06e1U // ADS Technologies, Inc. +#define UHS_VID_ALCATEL_MICROELECTRONICS 0x06e4U // Alcatel Microelectronics +#define UHS_VID_TIGER_JET_NETWORK 0x06e6U // Tiger Jet Network, Inc. +#define UHS_VID_SIRIUS_TECHNOLOGIES 0x06eaU // Sirius Technologies +#define UHS_VID_PC_EXPERT_TECH 0x06ebU // PC Expert Tech. Co., Ltd +#define UHS_VID_IAC_GEOMETRISCHE_INGENIEURS_BV 0x06efU // I.A.C. Geometrische Ingenieurs B.V. +#define UHS_VID_TNC_INDUSTRIAL 0x06f0U // T.N.C Industrial Co., Ltd +#define UHS_VID_OPCODE_SYSTEMS 0x06f1U // Opcode Systems, Inc. +#define UHS_VID_EMINE_TECHNOLOGY 0x06f2U // Emine Technology Co. +#define UHS_VID_WINTREND_TECHNOLOGY 0x06f6U // Wintrend Technology Co., Ltd +#define UHS_VID_WAILLY_TECHNOLOGY 0x06f7U // Wailly Technology Ltd +#define UHS_VID_GUILLEMOT 0x06f8U // Guillemot Corp. +#define UHS_VID_ASYST_ELECTRONIC_DOO 0x06f9U // ASYST electronic d.o.o. +#define UHS_VID_HSD_SRL 0x06faU // HSD S.r.L +#define UHS_VID_MOTOROLA_SEMICONDUCTOR_PRODUCTS_SECTOR 0x06fcU // Motorola Semiconductor Products Sector +#define UHS_VID_BOSTON_ACOUSTICS 0x06fdU // Boston Acoustics +#define UHS_VID_GALLANT_COMPUTER 0x06feU // Gallant Computer, Inc. +#define UHS_VID_SUPERCOMAL_WIRE_AND_CABLE_SDN_BHD 0x0701U // Supercomal Wire & Cable SDN. BHD. +#define UHS_VID_BVTECH_INDUSTRY 0x0703U // Bvtech Industry, Inc. +#define UHS_VID_NKK 0x0705U // NKK Corp. +#define UHS_VID_ARIEL 0x0706U // Ariel Corp. +#define UHS_VID_STANDARD_MICROSYSTEMS_2 0x0707U // Standard Microsystems Corp. +#define UHS_VID_PUTERCOM 0x0708U // Putercom Co., Ltd +#define UHS_VID_SILICON_SYSTEMS_LTD_SSL 0x0709U // Silicon Systems, Ltd (SSL) +#define UHS_VID_OKI_ELECTRIC_INDUSTRY 0x070aU // Oki Electric Industry Co., Ltd +#define UHS_VID_COMOSS_ELECTRONIC 0x070dU // Comoss Electronic Co., Ltd +#define UHS_VID_EXCEL_CELL_ELECTRONIC 0x070eU // Excel Cell Electronic Co., Ltd +#define UHS_VID_CONNECT_TECH 0x0710U // Connect Tech, Inc. +#define UHS_VID_MAGIC_CONTROL_TECHNOLOGY 0x0711U // Magic Control Technology Corp. +#define UHS_VID_INTERVAL_RESEARCH 0x0713U // Interval Research Corp. +#define UHS_VID_NEWMOTION 0x0714U // NewMotion, Inc. +#define UHS_VID_ZNK 0x0717U // ZNK Corp. +#define UHS_VID_IMATION 0x0718U // Imation Corp. +#define UHS_VID_TREMON_ENTERPRISES 0x0719U // Tremon Enterprises Co., Ltd +#define UHS_VID_DOMAIN_TECHNOLOGIES 0x071bU // Domain Technologies, Inc. +#define UHS_VID_XIONICS_DOCUMENT_TECHNOLOGIES 0x071cU // Xionics Document Technologies, Inc. +#define UHS_VID_EICON_NETWORKS 0x071dU // Eicon Networks Corp. +#define UHS_VID_ARISTON_TECHNOLOGIES 0x071eU // Ariston Technologies +#define UHS_VID_CENTILLIUM_COMMUNICATIONS 0x0723U // Centillium Communications Corp. +#define UHS_VID_VANGUARD_INTERNATIONAL_SEMICONDUCTOR_AMERICA 0x0726U // Vanguard International Semiconductor-America +#define UHS_VID_AMITM 0x0729U // Amitm +#define UHS_VID_SUNIX 0x072eU // Sunix Co., Ltd +#define UHS_VID_ADVANCED_CARD_SYSTEMS 0x072fU // Advanced Card Systems, Ltd +#define UHS_VID_SUSTEEN 0x0731U // Susteen, Inc. +#define UHS_VID_GOLDFULL_ELECTRONICS_AND_TELECOMMUNICATIONS 0x0732U // Goldfull Electronics & Telecommunications Corp. +#define UHS_VID_VIEWQUEST_TECHNOLOGIES 0x0733U // ViewQuest Technologies, Inc. +#define UHS_VID_LASAT_COMMUNICATIONS_AS 0x0734U // Lasat Communications A/S +#define UHS_VID_ASUSCOM_NETWORK 0x0735U // Asuscom Network +#define UHS_VID_LOROM_INDUSTRIAL 0x0736U // Lorom Industrial Co., Ltd +#define UHS_VID_MAD_CATZ 0x0738U // Mad Catz, Inc. +#define UHS_VID_CHAPLET_SYSTEMS 0x073aU // Chaplet Systems, Inc. +#define UHS_VID_SUNCOM_TECHNOLOGIES 0x073bU // Suncom Technologies +#define UHS_VID_INDUSTRIAL_ELECTRONIC_ENGINEERS 0x073cU // Industrial Electronic Engineers, Inc. +#define UHS_VID_EUTRON_SPA 0x073dU // Eutron S.p.a. +#define UHS_VID_NEC_1 0x073eU // NEC, Inc. +#define UHS_VID_STOLLMANN 0x0742U // Stollmann +#define UHS_VID_SYNTECH_INFORMATION 0x0745U // Syntech Information Co., Ltd +#define UHS_VID_ONKYO 0x0746U // Onkyo Corp. +#define UHS_VID_LABWAY 0x0747U // Labway Corp. +#define UHS_VID_STRONG_MAN_ENTERPRISE 0x0748U // Strong Man Enterprise Co., Ltd +#define UHS_VID_EVER_ELECTRONICS 0x0749U // EVer Electronics Corp. +#define UHS_VID_MING_FORTUNE_INDUSTRY 0x074aU // Ming Fortune Industry Co., Ltd +#define UHS_VID_POLESTAR_TECH 0x074bU // Polestar Tech. Corp. +#define UHS_VID_C_C_C_GROUP_PLC 0x074cU // C-C-C Group PLC +#define UHS_VID_MICRONAS 0x074dU // Micronas GmbH +#define UHS_VID_DIGITAL_STREAM 0x074eU // Digital Stream Corp. +#define UHS_VID_AUREAL_SEMICONDUCTOR 0x0755U // Aureal Semiconductor +#define UHS_VID_NETWORK_TECHNOLOGIES 0x0757U // Network Technologies, Inc. +#define UHS_VID_SOPHISTICATED_CIRCUITS 0x075bU // Sophisticated Circuits, Inc. +#define UHS_VID_MIDIMAN 0x0763U // Midiman +#define UHS_VID_CYBER_POWER_SYSTEM 0x0764U // Cyber Power System, Inc. +#define UHS_VID_X_RITE 0x0765U // X-Rite, Inc. +#define UHS_VID_JESS_LINK_PRODUCTS 0x0766U // Jess-Link Products Co., Ltd +#define UHS_VID_TOKHEIM 0x0767U // Tokheim Corp. +#define UHS_VID_CAMTEL_TECHNOLOGY 0x0768U // Camtel Technology Corp. +#define UHS_VID_SURECOM_TECHNOLOGY 0x0769U // Surecom Technology Corp. +#define UHS_VID_SMART_TECHNOLOGY_ENABLERS 0x076aU // Smart Technology Enablers, Inc. +#define UHS_VID_OMNIKEY_AG 0x076bU // OmniKey AG +#define UHS_VID_PARTNER_TECH 0x076cU // Partner Tech +#define UHS_VID_DENSO 0x076dU // Denso Corp. +#define UHS_VID_KUAN_TECH_ENTERPRISE 0x076eU // Kuan Tech Enterprise Co., Ltd +#define UHS_VID_JHEN_VEI_ELECTRONIC 0x076fU // Jhen Vei Electronic Co., Ltd +#define UHS_VID_WELCH_ALLYN_INC__MEDICAL_DIVISION 0x0770U // Welch Allyn, Inc - Medical Division +#define UHS_VID_OBSERVATOR_INSTRUMENTS_BV 0x0771U // Observator Instruments BV +#define UHS_VID_YOUR_DATA_OUR_CARE 0x0772U // Your data Our Care +#define UHS_VID_AMTRAN_TECHNOLOGY 0x0774U // AmTRAN Technology Co., Ltd +#define UHS_VID_LONGSHINE_ELECTRONICS 0x0775U // Longshine Electronics Corp. +#define UHS_VID_INALWAYS 0x0776U // Inalways Corp. +#define UHS_VID_COMDA_ENTERPRISE 0x0777U // Comda Enterprise Corp. +#define UHS_VID_VOLEX 0x0778U // Volex, Inc. +#define UHS_VID_FAIRCHILD_SEMICONDUCTOR 0x0779U // Fairchild Semiconductor +#define UHS_VID_SANKYO_SEIKI_MFG 0x077aU // Sankyo Seiki Mfg. Co., Ltd +#define UHS_VID_LINKSYS_1 0x077bU // Linksys +#define UHS_VID_FORWARD_ELECTRONICS 0x077cU // Forward Electronics Co., Ltd +#define UHS_VID_GRIFFIN_TECHNOLOGY 0x077dU // Griffin Technology +#define UHS_VID_WELL_EXCELLENT_AND_MOST 0x077fU // Well Excellent & Most Corp. +#define UHS_VID_SAGEM_MONETEL 0x0780U // Sagem Monetel GmbH +#define UHS_VID_SANDISK 0x0781U // SanDisk Corp. +#define UHS_VID_TRACKERBALL 0x0782U // Trackerball +#define UHS_VID_C3PO 0x0783U // C3PO +#define UHS_VID_VIVITAR 0x0784U // Vivitar, Inc. +#define UHS_VID_NTT_ME 0x0785U // NTT-ME +#define UHS_VID_LOGITEC 0x0789U // Logitec Corp. +#define UHS_VID_HAPP_CONTROLS 0x078bU // Happ Controls, Inc. +#define UHS_VID_GTCOCALCOMP 0x078cU // GTCO/CalComp +#define UHS_VID_BRINCOM 0x078eU // Brincom, Inc. +#define UHS_VID_PRO_IMAGE_MANUFACTURING 0x0790U // Pro-Image Manufacturing Co., Ltd +#define UHS_VID_COPARTNER_WIRE_AND_CABLE_MFG 0x0791U // Copartner Wire and Cable Mfg. Corp. +#define UHS_VID_AXIS_COMMUNICATIONS 0x0792U // Axis Communications AB +#define UHS_VID_WHA_YU_INDUSTRIAL 0x0793U // Wha Yu Industrial Co., Ltd +#define UHS_VID_ABL_ELECTRONICS 0x0794U // ABL Electronics Corp. +#define UHS_VID_REALCHIP 0x0795U // RealChip, Inc. +#define UHS_VID_CERTICOM 0x0796U // Certicom Corp. +#define UHS_VID_GRANDTECH_SEMICONDUCTOR 0x0797U // Grandtech Semiconductor Corp. +#define UHS_VID_OPTELEC 0x0798U // Optelec +#define UHS_VID_ALTERA 0x0799U // Altera +#define UHS_VID_SAGEM 0x079bU // Sagem +#define UHS_VID_ALFADATA_COMPUTER 0x079dU // Alfadata Computer Corp. +#define UHS_VID_DIGICOM_SPA 0x07a1U // Digicom S.p.A. +#define UHS_VID_NATIONAL_TECHNICAL_SYSTEMS 0x07a2U // National Technical Systems +#define UHS_VID_ONNTO 0x07a3U // Onnto Corp. +#define UHS_VID_BE 0x07a4U // Be, Inc. +#define UHS_VID_ADMTEK 0x07a6U // ADMtek, Inc. +#define UHS_VID_COREGA_KK 0x07aaU // Corega K.K. +#define UHS_VID_FREECOM_TECHNOLOGIES 0x07abU // Freecom Technologies +#define UHS_VID_MICROTECH 0x07afU // Microtech +#define UHS_VID_TRUST_TECHNOLOGIES 0x07b0U // Trust Technologies +#define UHS_VID_IMP 0x07b1U // IMP, Inc. +#define UHS_VID_MOTOROLA_BCS 0x07b2U // Motorola BCS, Inc. +#define UHS_VID_PLUSTEK 0x07b3U // Plustek, Inc. +#define UHS_VID_OLYMPUS_OPTICAL 0x07b4U // Olympus Optical Co., Ltd +#define UHS_VID_MEGA_WORLD_INTERNATIONAL 0x07b5U // Mega World International, Ltd +#define UHS_VID_MARUBUN 0x07b6U // Marubun Corp. +#define UHS_VID_TIME_INTERCONNECT 0x07b7U // TIME Interconnect, Ltd +#define UHS_VID_ABOCOM_SYSTEMS 0x07b8U // AboCom Systems Inc +#define UHS_VID_CANON_COMPUTER_SYSTEMS 0x07bcU // Canon Computer Systems, Inc. +#define UHS_VID_WEBGEAR 0x07bdU // Webgear, Inc. +#define UHS_VID_VERIDICOM 0x07beU // Veridicom +#define UHS_VID_CODE_MERCENARIES_HARD_UND_SOFTWARE 0x07c0U // Code Mercenaries Hard- und Software GmbH +#define UHS_VID_KEISOKUGIKEN 0x07c1U // Keisokugiken +#define UHS_VID_DATAFAB_SYSTEMS 0x07c4U // Datafab Systems, Inc. +#define UHS_VID_APG_CASH_DRAWER 0x07c5U // APG Cash Drawer +#define UHS_VID_SHAREWAVE 0x07c6U // ShareWave, Inc. +#define UHS_VID_POWERTECH_INDUSTRIAL 0x07c7U // Powertech Industrial Co., Ltd +#define UHS_VID_BUG 0x07c8U // B.U.G., Inc. +#define UHS_VID_ALLIED_TELESYN_INTERNATIONAL 0x07c9U // Allied Telesyn International +#define UHS_VID_AVERMEDIA_TECHNOLOGIES 0x07caU // AVerMedia Technologies, Inc. +#define UHS_VID_KINGMAX_TECHNOLOGY 0x07cbU // Kingmax Technology, Inc. +#define UHS_VID_CARRY_COMPUTER_ENG 0x07ccU // Carry Computer Eng., Co., Ltd +#define UHS_VID_ELEKTOR 0x07cdU // Elektor +#define UHS_VID_CASIO_COMPUTER 0x07cfU // Casio Computer Co., Ltd +#define UHS_VID_DAZZLE 0x07d0U // Dazzle +#define UHS_VID_D_LINK_SYSTEM 0x07d1U // D-Link System +#define UHS_VID_APTIO_PRODUCTS 0x07d2U // Aptio Products, Inc. +#define UHS_VID_CYBERDATA 0x07d3U // Cyberdata Corp. +#define UHS_VID_RADIANT_SYSTEMS 0x07d5U // Radiant Systems +#define UHS_VID_GCC_TECHNOLOGIES 0x07d7U // GCC Technologies, Inc. +#define UHS_VID_ARASAN_CHIP_SYSTEMS 0x07daU // Arasan Chip Systems +#define UHS_VID_DIAMOND_MULTIMEDIA 0x07deU // Diamond Multimedia +#define UHS_VID_DAVID_ELECTRONICS 0x07dfU // David Electronics Co., Ltd +#define UHS_VID_AMBIENT_TECHNOLOGIES 0x07e1U // Ambient Technologies, Inc. +#define UHS_VID_ELMEG_GMBH_AND 0x07e2U // Elmeg GmbH & Co., Ltd +#define UHS_VID_PLANEX_COMMUNICATIONS 0x07e3U // Planex Communications, Inc. +#define UHS_VID_MOVADO_ENTERPRISE 0x07e4U // Movado Enterprise Co., Ltd +#define UHS_VID_QPS 0x07e5U // QPS, Inc. +#define UHS_VID_ALLIED_CABLE 0x07e6U // Allied Cable Corp. +#define UHS_VID_MIRVO_TOYS 0x07e7U // Mirvo Toys, Inc. +#define UHS_VID_LABSYSTEMS 0x07e8U // Labsystems +#define UHS_VID_IWATSU_ELECTRIC 0x07eaU // Iwatsu Electric Co., Ltd +#define UHS_VID_DOUBLE_H_TECHNOLOGY 0x07ebU // Double-H Technology Co., Ltd +#define UHS_VID_TAIYO_ELECTRIC_WIRE_AND_CABLE 0x07ecU // Taiyo Electric Wire & Cable Co., Ltd +#define UHS_VID_TOREX_RETAIL_FORMERLY_LOGWARE 0x07eeU // Torex Retail (formerly Logware) +#define UHS_VID_STSN 0x07efU // STSN +#define UHS_VID_MICROCOMPUTER_APPLICATIONS 0x07f2U // Microcomputer Applications, Inc. +#define UHS_VID_CIRCUIT_ASSEMBLY 0x07f6U // Circuit Assembly Corp. +#define UHS_VID_CENTURY 0x07f7U // Century Corp. +#define UHS_VID_DOTOP_TECHNOLOGY 0x07f9U // Dotop Technology, Inc. +#define UHS_VID_DRAYTEK_1 0x07faU // DrayTek Corp. +#define UHS_VID_MARK_OF_THE_UNICORN 0x07fdU // Mark of the Unicorn +#define UHS_VID_UNKNOWN_2 0x07ffU // Unknown +#define UHS_VID_MAGTEK 0x0801U // MagTek +#define UHS_VID_MAKO_TECHNOLOGIES 0x0802U // Mako Technologies, LLC +#define UHS_VID_ZOOM_TELEPHONICS 0x0803U // Zoom Telephonics, Inc. +#define UHS_VID_GENICOM_TECHNOLOGY 0x0809U // Genicom Technology, Inc. +#define UHS_VID_EVERMUCH_TECHNOLOGY 0x080aU // Evermuch Technology Co., Ltd +#define UHS_VID_CROSS_MATCH_TECHNOLOGIES 0x080bU // Cross Match Technologies +#define UHS_VID_DATALOGIC_SPA 0x080cU // Datalogic S.p.A. +#define UHS_VID_TECO_IMAGE_SYSTEMS 0x080dU // Teco Image Systems Co., Ltd +#define UHS_VID_PERSONAL_COMMUNICATION_SYSTEMS 0x0810U // Personal Communication Systems, Inc. +#define UHS_VID_MATTEL 0x0813U // Mattel, Inc. +#define UHS_VID_ELICENSER 0x0819U // eLicenser +#define UHS_VID_MG_LOGIC 0x081aU // MG Logic +#define UHS_VID_INDIGITA 0x081bU // Indigita Corp. +#define UHS_VID_MIPSYS 0x081cU // Mipsys +#define UHS_VID_ALPHASMART 0x081eU // AlphaSmart, Inc. +#define UHS_VID_REUDO 0x0822U // Reudo Corp. +#define UHS_VID_GC_PROTRONICS 0x0825U // GC Protronics +#define UHS_VID_DATA_TRANSIT 0x0826U // Data Transit +#define UHS_VID_BROADLOGIC 0x0827U // BroadLogic, Inc. +#define UHS_VID_SATO 0x0828U // Sato Corp. +#define UHS_VID_DIRECTV_BROADBAND_INC_TELOCITY 0x0829U // DirecTV Broadband, Inc. (Telocity) +#define UHS_VID_HANDSPRING 0x082dU // Handspring +#define UHS_VID_PALM 0x0830U // Palm, Inc. +#define UHS_VID_KOUWELL_ELECTRONICS 0x0832U // Kouwell Electronics Corp. +#define UHS_VID_SOURCENEXT 0x0833U // Sourcenext Corp. +#define UHS_VID_ACTION_STAR_ENTERPRISE 0x0835U // Action Star Enterprise Co., Ltd +#define UHS_VID_TREKSTOR 0x0836U // TrekStor +#define UHS_VID_SAMSUNG_TECHWIN 0x0839U // Samsung Techwin Co., Ltd +#define UHS_VID_ACCTON_TECHNOLOGY 0x083aU // Accton Technology Corp. +#define UHS_VID_GLOBAL_VILLAGE 0x083fU // Global Village +#define UHS_VID_ARGOSY_RESEARCH 0x0840U // Argosy Research, Inc. +#define UHS_VID_RIOPORTCOM 0x0841U // Rioport.com, Inc. +#define UHS_VID_WELLAND_INDUSTRIAL 0x0844U // Welland Industrial Co., Ltd +#define UHS_VID_NETGEAR 0x0846U // NetGear, Inc. +#define UHS_VID_MINTON_OPTIC_INDUSTRY 0x084dU // Minton Optic Industry Co., Inc. +#define UHS_VID_KB_GEAR 0x084eU // KB Gear +#define UHS_VID_EMPEG 0x084fU // Empeg +#define UHS_VID_FAST_POINT_TECHNOLOGIES 0x0850U // Fast Point Technologies, Inc. +#define UHS_VID_MACRONIX_INTERNATIONAL 0x0851U // Macronix International Co., Ltd +#define UHS_VID_CSEM 0x0852U // CSEM +#define UHS_VID_TOPRE_CORPORATION 0x0853U // Topre Corporation +#define UHS_VID_ACTIVEWIRE 0x0854U // ActiveWire, Inc. +#define UHS_VID_BANDB_ELECTRONICS 0x0856U // B&B Electronics +#define UHS_VID_HITACHI_MAXELL 0x0858U // Hitachi Maxell, Ltd +#define UHS_VID_MINOLTA_SYSTEMS_LABORATORY 0x0859U // Minolta Systems Laboratory, Inc. +#define UHS_VID_XIRCOM 0x085aU // Xircom +#define UHS_VID_COLORVISION 0x085cU // ColorVision, Inc. +#define UHS_VID_TELETROL_SYSTEMS 0x0862U // Teletrol Systems, Inc. +#define UHS_VID_FILANET 0x0863U // Filanet Corp. +#define UHS_VID_NETGEAR_1 0x0864U // NetGear, Inc. +#define UHS_VID_DATA_TRANSLATION 0x0867U // Data Translation, Inc. +#define UHS_VID_EMAGIC_SOFT_UND_HARDWARE 0x086aU // Emagic Soft- und Hardware GmbH +#define UHS_VID_DETEWE__DEUTSCHE_TELEPHONWERKE_AG_AND 0x086cU // DeTeWe - Deutsche Telephonwerke AG & Co. +#define UHS_VID_SYSTEM_TALKS 0x086eU // System TALKS, Inc. +#define UHS_VID_MEC_IMEX 0x086fU // MEC IMEX, Inc. +#define UHS_VID_METRICOM 0x0870U // Metricom +#define UHS_VID_SANDISK_1 0x0871U // SanDisk, Inc. +#define UHS_VID_XPEED 0x0873U // Xpeed, Inc. +#define UHS_VID_A_TEC_SUBSYSTEM 0x0874U // A-Tec Subsystem, Inc. +#define UHS_VID_COMTROL 0x0879U // Comtrol Corp. +#define UHS_VID_ADESSOKBTEK_AMERICA 0x087cU // Adesso/Kbtek America, Inc. +#define UHS_VID_JATON 0x087dU // Jaton Corp. +#define UHS_VID_FUJITSU_COMPUTER_PRODUCTS_OF_AMERICA 0x087eU // Fujitsu Computer Products of America +#define UHS_VID_QUALCORE_LOGIC 0x087fU // QualCore Logic Inc. +#define UHS_VID_APT_TECHNOLOGIES 0x0880U // APT Technologies, Inc. +#define UHS_VID_RECORDING_INDUSTRY_ASSOCIATION_OF_AMERICA_RIAA 0x0883U // Recording Industry Association of America (RIAA) +#define UHS_VID_BOCA_RESEARCH 0x0885U // Boca Research, Inc. +#define UHS_VID_XAC_AUTOMATION 0x0886U // XAC Automation Corp. +#define UHS_VID_HANNSTAR_ELECTRONICS 0x0887U // Hannstar Electronics Corp. +#define UHS_VID_TECHTOOLS 0x088aU // TechTools +#define UHS_VID_MASSWORKS 0x088bU // MassWorks, Inc. +#define UHS_VID_SWECOIN 0x088cU // Swecoin AB +#define UHS_VID_ILOK 0x088eU // iLok +#define UHS_VID_DIOGRAPHY 0x0892U // DioGraphy, Inc. +#define UHS_VID_TSI_INCORPORATED 0x0894U // TSI Incorporated +#define UHS_VID_LAUTERBACH 0x0897U // Lauterbach +#define UHS_VID_UNITED_TECHNOLOGIES_RESEARCH_CNTR 0x089cU // United Technologies Research Cntr. +#define UHS_VID_ICRON_TECHNOLOGIES 0x089dU // Icron Technologies Corp. +#define UHS_VID_NST 0x089eU // NST Co., Ltd +#define UHS_VID_PRIMEX_AEROSPACE 0x089fU // Primex Aerospace Co. +#define UHS_VID_E9 0x08a5U // e9, Inc. +#define UHS_VID_TOSHIBA_TEC 0x08a6U // Toshiba TEC +#define UHS_VID_ANDREA_ELECTRONICS 0x08a8U // Andrea Electronics +#define UHS_VID_CWAV 0x08a9U // CWAV Inc. +#define UHS_VID_MACRAIGOR_SYSTEMS 0x08acU // Macraigor Systems LLC +#define UHS_VID_MACALLY_MACE_GROUP 0x08aeU // Macally (Mace Group, Inc.) +#define UHS_VID_METROHM 0x08b0U // Metrohm +#define UHS_VID_SORENSON_VISION 0x08b4U // Sorenson Vision, Inc. +#define UHS_VID_NATSU 0x08b7U // NATSU +#define UHS_VID_J_GORDON_ELECTRONIC_DESIGN 0x08b8U // J. Gordon Electronic Design, Inc. +#define UHS_VID_RADIOSHACK_CORP_TANDY 0x08b9U // RadioShack Corp. (Tandy) +#define UHS_VID_TEXAS_INSTRUMENTS_1 0x08bbU // Texas Instruments +#define UHS_VID_CITIZEN_WATCH 0x08bdU // Citizen Watch Co., Ltd +#define UHS_VID_PRECISE_BIOMETRICS 0x08c3U // Precise Biometrics +#define UHS_VID_PROXIM 0x08c4U // Proxim, Inc. +#define UHS_VID_KEY_NICE_ENTERPRISE 0x08c7U // Key Nice Enterprise Co., Ltd +#define UHS_VID_2WIRE 0x08c8U // 2Wire, Inc. +#define UHS_VID_NIPPON_TELEGRAPH_AND_TELEPHONE 0x08c9U // Nippon Telegraph and Telephone Corp. +#define UHS_VID_AIPTEK_INTERNATIONAL 0x08caU // Aiptek International, Inc. +#define UHS_VID_JUE_HSUN_IND 0x08cdU // Jue Hsun Ind. Corp. +#define UHS_VID_LONG_WELL_ELECTRONICS 0x08ceU // Long Well Electronics Corp. +#define UHS_VID_PRODUCTIVITY_ENHANCEMENT_PRODUCTS 0x08cfU // Productivity Enhancement Products +#define UHS_VID_SMARTBRIDGES 0x08d1U // smartBridges, Inc. +#define UHS_VID_VIRTUAL_INK 0x08d3U // Virtual Ink +#define UHS_VID_FUJITSU_SIEMENS_COMPUTERS 0x08d4U // Fujitsu Siemens Computers +#define UHS_VID_IXXAT_AUTOMATION 0x08d8U // IXXAT Automation GmbH +#define UHS_VID_INCREMENT_P 0x08d9U // Increment P Corp. +#define UHS_VID_BILLIONTON_SYSTEMS 0x08ddU // Billionton Systems, Inc. +#define UHS_VID__UNKNOWN 0x08deU // ? +#define UHS_VID_SPYRUS 0x08dfU // Spyrus, Inc. +#define UHS_VID_OLITEC 0x08e3U // Olitec, Inc. +#define UHS_VID_PIONEER 0x08e4U // Pioneer Corp. +#define UHS_VID_LITRONIC 0x08e5U // Litronic +#define UHS_VID_GEMALTO_WAS_GEMPLUS 0x08e6U // Gemalto (was Gemplus) +#define UHS_VID_PAN_INTERNATIONAL_WIRE_AND_CABLE 0x08e7U // Pan-International Wire & Cable +#define UHS_VID_INTEGRATED_MEMORY_LOGIC 0x08e8U // Integrated Memory Logic +#define UHS_VID_EXTENDED_SYSTEMS 0x08e9U // Extended Systems, Inc. +#define UHS_VID_ERICSSON_INC_BLUE_RIDGE_LABS 0x08eaU // Ericsson, Inc., Blue Ridge Labs +#define UHS_VID_M_SYSTEMS_FLASH_DISK_PIONEERS 0x08ecU // M-Systems Flash Disk Pioneers +#define UHS_VID_MEDIATEK 0x08edU // MediaTek Inc. +#define UHS_VID_CCSIHESSO 0x08eeU // CCSI/Hesso +#define UHS_VID_COREX_TECHNOLOGIES 0x08f0U // Corex Technologies +#define UHS_VID_CTI_ELECTRONICS 0x08f1U // CTI Electronics Corp. +#define UHS_VID_GOTOP_INFORMATION 0x08f2U // Gotop Information Inc. +#define UHS_VID_SYSTEC 0x08f5U // SysTec Co., Ltd +#define UHS_VID_LOGIC_3_INTERNATIONAL 0x08f6U // Logic 3 International, Ltd +#define UHS_VID_VERNIER 0x08f7U // Vernier +#define UHS_VID_KEEN_TOP_INTERNATIONAL_ENTERPRISE 0x08f8U // Keen Top International Enterprise Co., Ltd +#define UHS_VID_WIPRO_TECHNOLOGIES 0x08f9U // Wipro Technologies +#define UHS_VID_CAERE 0x08faU // Caere +#define UHS_VID_SOCKET_COMMUNICATIONS 0x08fbU // Socket Communications +#define UHS_VID_SICON_CABLE_TECHNOLOGY 0x08fcU // Sicon Cable Technology Co., Ltd +#define UHS_VID_DIGIANSWER_AS 0x08fdU // Digianswer A/S +#define UHS_VID_AUTHENTEC 0x08ffU // AuthenTec, Inc. +#define UHS_VID_PINNACLE_SYSTEMS 0x0900U // Pinnacle Systems, Inc. +#define UHS_VID_VST_TECHNOLOGIES 0x0901U // VST Technologies +#define UHS_VID_FARADAY_TECHNOLOGY 0x0906U // Faraday Technology Corp. +#define UHS_VID_SIEMENS_AG 0x0908U // Siemens AG +#define UHS_VID_AUDIO_TECHNICA 0x0909U // Audio-Technica Corp. +#define UHS_VID_TRUMPION_MICROELECTRONICS 0x090aU // Trumpion Microelectronics, Inc. +#define UHS_VID_NEUROSMITH 0x090bU // Neurosmith +#define UHS_VID_SILICON_MOTION_INC__TAIWAN_FORMERLY_FEIYA_TECHNOLOGY 0x090cU // Silicon Motion, Inc. - Taiwan (formerly Feiya Technology Corp.) +#define UHS_VID_MULTIPORT_COMPUTER_VERTRIEBS 0x090dU // Multiport Computer Vertriebs GmbH +#define UHS_VID_SHINING_TECHNOLOGY 0x090eU // Shining Technology, Inc. +#define UHS_VID_FUJITSU_DEVICES 0x090fU // Fujitsu Devices, Inc. +#define UHS_VID_ALATION_SYSTEMS 0x0910U // Alation Systems, Inc. +#define UHS_VID_PHILIPS_SPEECH_PROCESSING 0x0911U // Philips Speech Processing +#define UHS_VID_VOQUETTE 0x0912U // Voquette, Inc. +#define UHS_VID_GLOBESPAN 0x0915U // GlobeSpan, Inc. +#define UHS_VID_SMARTDISK 0x0917U // SmartDisk Corp. +#define UHS_VID_TIGER_ELECTRONICS 0x0919U // Tiger Electronics +#define UHS_VID_GARMIN_INTERNATIONAL 0x091eU // Garmin International +#define UHS_VID_ECHELON 0x0920U // Echelon Co. +#define UHS_VID_GOHUBS 0x0921U // GoHubs, Inc. +#define UHS_VID_DYMO_COSTAR 0x0922U // Dymo-CoStar Corp. +#define UHS_VID_IC_MEDIA 0x0923U // IC Media Corp. +#define UHS_VID_XEROX 0x0924U // Xerox +#define UHS_VID_LAKEVIEW_RESEARCH 0x0925U // Lakeview Research +#define UHS_VID_SUMMUS 0x0927U // Summus, Ltd +#define UHS_VID_PLX_TECHNOLOGY_INC_FORMERLY_OXFORD_SEMICONDUCTOR 0x0928U // PLX Technology, Inc. (formerly Oxford Semiconductor, Ltd) +#define UHS_VID_AMERICAN_BIOMETRIC 0x0929U // American Biometric Co. +#define UHS_VID_TOSHIBA_INFORMATION_AND_INDUSTRIAL_SYS_AND_SERVICES 0x092aU // Toshiba Information & Industrial Sys. And Services +#define UHS_VID_SENA_TECHNOLOGIES 0x092bU // Sena Technologies, Inc. +#define UHS_VID_NORTHERN_EMBEDDED_SCIENCECAVNEX 0x092fU // Northern Embedded Science/CAVNEX +#define UHS_VID_TOSHIBA_1 0x0930U // Toshiba Corp. +#define UHS_VID_HARMONIC_DATA_SYSTEMS 0x0931U // Harmonic Data Systems, Ltd +#define UHS_VID_CRESCENTEC 0x0932U // Crescentec Corp. +#define UHS_VID_QUANTUM 0x0933U // Quantum Corp. +#define UHS_VID_SPIRENT_COMMUNICATIONS 0x0934U // Spirent Communications +#define UHS_VID_NUTESLA 0x0936U // NuTesla +#define UHS_VID_LUMBERG 0x0939U // Lumberg, Inc. +#define UHS_VID_PIXART_IMAGING 0x093aU // Pixart Imaging, Inc. +#define UHS_VID_PLEXTOR 0x093bU // Plextor Corp. +#define UHS_VID_INTREPID_CONTROL_SYSTEMS 0x093cU // Intrepid Control Systems, Inc. +#define UHS_VID_INNOSYNC 0x093dU // InnoSync, Inc. +#define UHS_VID_JST_MFG 0x093eU // J.S.T. Mfg. Co., Ltd +#define UHS_VID_OLYMPIA_TELECOM_VERTRIEBS 0x093fU // Olympia Telecom Vertriebs GmbH +#define UHS_VID_JAPAN_STORAGE_BATTERY 0x0940U // Japan Storage Battery Co., Ltd +#define UHS_VID_PHOTOBIT 0x0941U // Photobit Corp. +#define UHS_VID_I2GOCOM 0x0942U // i2Go.com, LLC +#define UHS_VID_HCL_TECHNOLOGIES_INDIA_PRIVATE 0x0943U // HCL Technologies India Private, Ltd +#define UHS_VID_KORG 0x0944U // KORG, Inc. +#define UHS_VID_PASCO_SCIENTIFIC 0x0945U // Pasco Scientific +#define UHS_VID_KRONAUER_MUSIC_IN_DIGITAL 0x0948U // Kronauer music in digital +#define UHS_VID_LINKUP_SYSTEMS 0x094bU // Linkup Systems Corp. +#define UHS_VID_CABLE_TELEVISION_LABORATORIES 0x094dU // Cable Television Laboratories +#define UHS_VID_YANO 0x094fU // Yano +#define UHS_VID_KINGSTON_TECHNOLOGY 0x0951U // Kingston Technology +#define UHS_VID_RPM_SYSTEMS 0x0954U // RPM Systems Corp. +#define UHS_VID_NVIDIA 0x0955U // NVidia Corp. +#define UHS_VID_BSQUARE 0x0956U // BSquare Corp. +#define UHS_VID_AGILENT_TECHNOLOGIES 0x0957U // Agilent Technologies, Inc. +#define UHS_VID_COMPULINK_RESEARCH 0x0958U // CompuLink Research, Inc. +#define UHS_VID_COLOGNE_CHIP_AG 0x0959U // Cologne Chip AG +#define UHS_VID_PORTSMITH 0x095aU // Portsmith +#define UHS_VID_MEDIALOGIC 0x095bU // Medialogic Corp. +#define UHS_VID_K_TEC_ELECTRONICS 0x095cU // K-Tec Electronics +#define UHS_VID_POLYCOM 0x095dU // Polycom, Inc. +#define UHS_VID_ACER_NEWEB 0x0967U // Acer NeWeb Corp. +#define UHS_VID_CATALYST_ENTERPRISES 0x0968U // Catalyst Enterprises, Inc. +#define UHS_VID_FEITIAN_TECHNOLOGIES 0x096eU // Feitian Technologies, Inc. +#define UHS_VID_GRETAG_MACBETH_AG 0x0971U // Gretag-Macbeth AG +#define UHS_VID_SCHLUMBERGER 0x0973U // Schlumberger +#define UHS_VID_DATAGRAPHIX_A_BUSINESS_UNIT_OF_ANACOMP 0x0974U // Datagraphix, a business unit of Anacomp +#define UHS_VID_OLE_COMMUNICATIONS 0x0975U // OL'E Communications, Inc. +#define UHS_VID_ADIRONDACK_WIRE_AND_CABLE 0x0976U // Adirondack Wire & Cable +#define UHS_VID_LIGHTSURF_TECHNOLOGIES 0x0977U // Lightsurf Technologies +#define UHS_VID_BECKHOFF 0x0978U // Beckhoff GmbH +#define UHS_VID_JEILIN_TECHNOLOGY 0x0979U // Jeilin Technology Corp., Ltd +#define UHS_VID_MINDS_AT_WORK 0x097aU // Minds At Work LLC +#define UHS_VID_KNUDSEN_ENGINEERING 0x097bU // Knudsen Engineering, Ltd +#define UHS_VID_MARUNIX 0x097cU // Marunix Co., Ltd +#define UHS_VID_ROSUN_TECHNOLOGIES 0x097dU // Rosun Technologies, Inc. +#define UHS_VID_BIOPAC_SYSTEMS 0x097eU // Biopac Systems Inc. +#define UHS_VID_BARUN_ELECTRONICS 0x097fU // Barun Electronics Co., Ltd +#define UHS_VID_OAK_TECHNOLOGY_1 0x0981U // Oak Technology, Ltd +#define UHS_VID_APRICORN 0x0984U // Apricorn +#define UHS_VID_CAB_PRODUKTTECHNIK_GMBH_AND_CO_KG 0x0985U // cab Produkttechnik GmbH & Co KG +#define UHS_VID_MATSUSHITA_ELECTRIC_WORKS 0x0986U // Matsushita Electric Works, Ltd. +#define UHS_VID_VITANA 0x098cU // Vitana Corp. +#define UHS_VID_INDESIGN 0x098dU // INDesign +#define UHS_VID_INTEGRATED_INTELLECTUAL_PROPERTY 0x098eU // Integrated Intellectual Property, Inc. +#define UHS_VID_KENWOOD_TMI 0x098fU // Kenwood TMI Corp. +#define UHS_VID_GEMSTAR_EBOOK_GROUP 0x0993U // Gemstar eBook Group, Ltd +#define UHS_VID_INTEGRATED_TELECOM_EXPRESS 0x0996U // Integrated Telecom Express, Inc. +#define UHS_VID_ZIPPY_TECHNOLOGY 0x099aU // Zippy Technology Corp. +#define UHS_VID_PAIRGAIN_TECHNOLOGIES 0x09a3U // PairGain Technologies +#define UHS_VID_CONTECH_RESEARCH 0x09a4U // Contech Research, Inc. +#define UHS_VID_VCON_TELECOMMUNICATIONS 0x09a5U // VCON Telecommunications +#define UHS_VID_POINCHIPS 0x09a6U // Poinchips +#define UHS_VID_DATA_TRANSMISSION_NETWORK 0x09a7U // Data Transmission Network Corp. +#define UHS_VID_LIN_SHIUNG_ENTERPRISE 0x09a8U // Lin Shiung Enterprise Co., Ltd +#define UHS_VID_SMART_CARD_TECHNOLOGIES 0x09a9U // Smart Card Technologies Co., Ltd +#define UHS_VID_INTERSIL 0x09aaU // Intersil Corp. +#define UHS_VID_JAPAN_CASH_MACHINE 0x09abU // Japan Cash Machine Co., Ltd. +#define UHS_VID_TRIPP_LITE 0x09aeU // Tripp Lite +#define UHS_VID_FRANKLIN_ELECTRONIC_PUBLISHERS 0x09b2U // Franklin Electronic Publishers, Inc. +#define UHS_VID_ALTIUS_SOLUTIONS 0x09b3U // Altius Solutions, Inc. +#define UHS_VID_MDS_TELEPHONE_SYSTEMS 0x09b4U // MDS Telephone Systems +#define UHS_VID_CELLTRIX_TECHNOLOGY 0x09b5U // Celltrix Technology Co., Ltd +#define UHS_VID_GRUNDIG 0x09bcU // Grundig +#define UHS_VID_MYSMARTCOM 0x09beU // MySmart.Com +#define UHS_VID_AUERSWALD_GMBH_AND_CO_KG 0x09bfU // Auerswald GmbH & Co. KG +#define UHS_VID_GENPIX_ELECTRONICS 0x09c0U // Genpix Electronics, LLC +#define UHS_VID_ARRIS_INTERACTIVE 0x09c1U // Arris Interactive LLC +#define UHS_VID_NISCA 0x09c2U // Nisca Corp. +#define UHS_VID_ACTIVCARD 0x09c3U // ActivCard, Inc. +#define UHS_VID_ACTISYS 0x09c4U // ACTiSYS Corp. +#define UHS_VID_MEMORY 0x09c5U // Memory Corp. +#define UHS_VID_BMC_MESSSYSTEME 0x09caU // BMC Messsysteme GmbH +#define UHS_VID_WORKBIT 0x09ccU // Workbit Corp. +#define UHS_VID_PSION_DACOM_HOME_NETWORKS 0x09cdU // Psion Dacom Home Networks, Ltd +#define UHS_VID_CITY_ELECTRONICS 0x09ceU // City Electronics, Ltd +#define UHS_VID_ELECTRONICS_TESTING_CENTER_TAIWAN 0x09cfU // Electronics Testing Center, Taiwan +#define UHS_VID_NEOMAGIC 0x09d1U // NeoMagic, Inc. +#define UHS_VID_VREELIN_ENGINEERING 0x09d2U // Vreelin Engineering, Inc. +#define UHS_VID_COM_ONE 0x09d3U // Com One +#define UHS_VID_NOVATEL_WIRELESS 0x09d7U // Novatel Wireless +#define UHS_VID_KRF_TECH 0x09d9U // KRF Tech, Ltd +#define UHS_VID_A4TECH 0x09daU // A4Tech Co., Ltd. +#define UHS_VID_MEASUREMENT_COMPUTING 0x09dbU // Measurement Computing Corp. +#define UHS_VID_AIMEX 0x09dcU // Aimex Corp. +#define UHS_VID_FELLOWES 0x09ddU // Fellowes, Inc. +#define UHS_VID_ADDONICS_TECHNOLOGIES 0x09dfU // Addonics Technologies Corp. +#define UHS_VID_INTELLON 0x09e1U // Intellon Corp. +#define UHS_VID_JO_DAN_INTERNATIONAL 0x09e5U // Jo-Dan International, Inc. +#define UHS_VID_SILUTIA 0x09e6U // Silutia, Inc. +#define UHS_VID_REAL_3D 0x09e7U // Real 3D, Inc. +#define UHS_VID_AKAI_PROFESSIONAL_MI 0x09e8U // AKAI Professional M.I. Corp. +#define UHS_VID_CHEN_SOURCE 0x09e9U // Chen-Source, Inc. +#define UHS_VID_IM_NETWORKS 0x09ebU // IM Networks, Inc. +#define UHS_VID_XITEL 0x09efU // Xitel +#define UHS_VID_GOFLIGHT 0x09f3U // GoFlight, Inc. +#define UHS_VID_ARESCOM 0x09f5U // AresCom +#define UHS_VID_ROCKETCHIPS 0x09f6U // RocketChips, Inc. +#define UHS_VID_EDU_SCIENCE_HK 0x09f7U // Edu-Science (H.K.), Ltd +#define UHS_VID_SOFTCONNEX_TECHNOLOGIES 0x09f8U // SoftConnex Technologies, Inc. +#define UHS_VID_BAY_ASSOCIATES 0x09f9U // Bay Associates +#define UHS_VID_MTEK_VISION 0x09faU // Mtek Vision +#define UHS_VID_ALTERA_1 0x09fbU // Altera +#define UHS_VID_GAIN_TECHNOLOGY 0x09ffU // Gain Technology Corp. +#define UHS_VID_LIQUID_AUDIO 0x0a00U // Liquid Audio +#define UHS_VID_VIA 0x0a01U // ViA, Inc. +#define UHS_VID_UNKNOWN_MANUFACTURER 0x0a05U // Unknown Manufacturer +#define UHS_VID_ONTRAK_CONTROL_SYSTEMS 0x0a07U // Ontrak Control Systems Inc. +#define UHS_VID_CYBEX_COMPUTER_PRODUCTS 0x0a0bU // Cybex Computer Products Co. +#define UHS_VID_SERVERGY 0x0a0dU // Servergy, Inc +#define UHS_VID_XENTEC 0x0a11U // Xentec, Inc. +#define UHS_VID_CAMBRIDGE_SILICON_RADIO 0x0a12U // Cambridge Silicon Radio, Ltd +#define UHS_VID_TELEBYTE 0x0a13U // Telebyte, Inc. +#define UHS_VID_SPACELABS_MEDICAL 0x0a14U // Spacelabs Medical, Inc. +#define UHS_VID_SCALAR 0x0a15U // Scalar Corp. +#define UHS_VID_TREK_TECHNOLOGY_S_PTE 0x0a16U // Trek Technology (S) PTE, Ltd +#define UHS_VID_PENTAX 0x0a17U // Pentax Corp. +#define UHS_VID_HEIDELBERGER_DRUCKMASCHINEN_AG 0x0a18U // Heidelberger Druckmaschinen AG +#define UHS_VID_HUA_GENG_TECHNOLOGIES 0x0a19U // Hua Geng Technologies, Inc. +#define UHS_VID_MEDTRONIC_PHYSIO_CONTROL 0x0a21U // Medtronic Physio Control Corp. +#define UHS_VID_CENTURY_SEMICONDUCTOR_USA 0x0a22U // Century Semiconductor USA, Inc. +#define UHS_VID_DATACARD_GROUP 0x0a27U // Datacard Group +#define UHS_VID_AK_MODUL_BUS_COMPUTER 0x0a2cU // AK-Modul-Bus Computer GmbH +#define UHS_VID_TG3_ELECTRONICS 0x0a34U // TG3 Electronics, Inc. +#define UHS_VID_RADIKAL_TECHNOLOGIES 0x0a35U // Radikal Technologies +#define UHS_VID_GILAT_SATELLITE_NETWORKS 0x0a39U // Gilat Satellite Networks, Ltd +#define UHS_VID_PENTAMEDIA 0x0a3aU // PentaMedia Co., Ltd +#define UHS_VID_NTT_DOCOMO 0x0a3cU // NTT DoCoMo, Inc. +#define UHS_VID_VARO_VISION 0x0a3dU // Varo Vision +#define UHS_VID_SWISSONIC_AG 0x0a3fU // Swissonic AG +#define UHS_VID_BOCA_SYSTEMS 0x0a43U // Boca Systems, Inc. +#define UHS_VID_DAVICOM_SEMICONDUCTOR 0x0a46U // Davicom Semiconductor, Inc. +#define UHS_VID_HIROSE_ELECTRIC 0x0a47U // Hirose Electric +#define UHS_VID_IO_INTERCONNECT 0x0a48U // I/O Interconnect +#define UHS_VID_PLOYTEC 0x0a4aU // Ploytec GmbH +#define UHS_VID_FUJITSU_MEDIA_DEVICES 0x0a4bU // Fujitsu Media Devices, Ltd +#define UHS_VID_COMPUTEX 0x0a4cU // Computex Co., Ltd +#define UHS_VID_EVOLUTION_ELECTRONICS 0x0a4dU // Evolution Electronics, Ltd +#define UHS_VID_STEINBERG_SOFT_UND_HARDWARE 0x0a4eU // Steinberg Soft-und Hardware GmbH +#define UHS_VID_LITTON_SYSTEMS 0x0a4fU // Litton Systems, Inc. +#define UHS_VID_MIMAKI_ENGINEERING 0x0a50U // Mimaki Engineering Co., Ltd +#define UHS_VID_SONY_ELECTRONICS 0x0a51U // Sony Electronics, Inc. +#define UHS_VID_JEBSEE_ELECTRONICS 0x0a52U // Jebsee Electronics Co., Ltd +#define UHS_VID_PORTABLE_PERIPHERAL 0x0a53U // Portable Peripheral Co., Ltd +#define UHS_VID_ELECTRONICS_FOR_IMAGING 0x0a5aU // Electronics For Imaging, Inc. +#define UHS_VID_EASICS_NV 0x0a5bU // EAsics NV +#define UHS_VID_BROADCOM 0x0a5cU // Broadcom Corp. +#define UHS_VID_DIATREND 0x0a5dU // Diatrend Corp. +#define UHS_VID_ZEBRA 0x0a5fU // Zebra +#define UHS_VID_MPMAN 0x0a62U // MPMan +#define UHS_VID_CLEARCUBE_TECHNOLOGY 0x0a66U // ClearCube Technology +#define UHS_VID_MEDELI_ELECTRONICS 0x0a67U // Medeli Electronics Co., Ltd +#define UHS_VID_COMAIDE 0x0a68U // Comaide Corp. +#define UHS_VID_CHROMA_ATE 0x0a69U // Chroma ate, Inc. +#define UHS_VID_GREEN_HOUSE 0x0a6bU // Green House Co., Ltd +#define UHS_VID_INTEGRATED_CIRCUIT_SYSTEMS 0x0a6cU // Integrated Circuit Systems, Inc. +#define UHS_VID_UPS_MANUFACTURING 0x0a6dU // UPS Manufacturing +#define UHS_VID_BENWIN 0x0a6eU // Benwin +#define UHS_VID_CORE_TECHNOLOGY 0x0a6fU // Core Technology, Inc. +#define UHS_VID_INTERNATIONAL_GAME_TECHNOLOGY 0x0a70U // International Game Technology +#define UHS_VID_VIPCOLOR_TECHNOLOGIES_USA 0x0a71U // VIPColor Technologies USA, Inc. +#define UHS_VID_SANWA_DENSHI 0x0a72U // Sanwa Denshi +#define UHS_VID_MACKIE_DESIGNS 0x0a73U // Mackie Designs +#define UHS_VID_NSTL 0x0a7dU // NSTL, Inc. +#define UHS_VID_OCTAGON_SYSTEMS 0x0a7eU // Octagon Systems Corp. +#define UHS_VID_REXON_TECHNOLOGY 0x0a80U // Rexon Technology Corp., Ltd +#define UHS_VID_CHESEN_ELECTRONICS 0x0a81U // Chesen Electronics Corp. +#define UHS_VID_SYSCAN 0x0a82U // Syscan +#define UHS_VID_NEXTCOMM 0x0a83U // NextComm, Inc. +#define UHS_VID_MAUI_INNOVATIVE_PERIPHERALS 0x0a84U // Maui Innovative Peripherals +#define UHS_VID_IDEXX_LABS 0x0a85U // Idexx Labs +#define UHS_VID_NITGEN 0x0a86U // NITGen Co., Ltd +#define UHS_VID_AKTIV 0x0a89U // Aktiv +#define UHS_VID_PICTURETEL 0x0a8dU // Picturetel +#define UHS_VID_JAPAN_AVIATION_ELECTRONICS_INDUSTRY 0x0a8eU // Japan Aviation Electronics Industry, Ltd +#define UHS_VID_CANDY_TECHNOLOGY 0x0a90U // Candy Technology Co., Ltd +#define UHS_VID_GLOBLINK_TECHNOLOGY 0x0a91U // Globlink Technology, Inc. +#define UHS_VID_EGO_SYSTEMS 0x0a92U // EGO SYStems, Inc. +#define UHS_VID_C_TECHNOLOGIES 0x0a93U // C Technologies AB +#define UHS_VID_INTERSENSE 0x0a94U // Intersense +#define UHS_VID_LAVA_COMPUTER_MFG 0x0aa3U // Lava Computer Mfg., Inc. +#define UHS_VID_DEVELCO_ELEKTRONIK 0x0aa4U // Develco Elektronik +#define UHS_VID_FIRST_INTERNATIONAL_DIGITAL 0x0aa5U // First International Digital +#define UHS_VID_PERCEPTION_DIGITAL 0x0aa6U // Perception Digital, Ltd +#define UHS_VID_WINCOR_NIXDORF_INTERNATIONAL 0x0aa7U // Wincor Nixdorf International GmbH +#define UHS_VID_TRIGEM_COMPUTER 0x0aa8U // TriGem Computer, Inc. +#define UHS_VID_BAROMTEC 0x0aa9U // Baromtec Co. +#define UHS_VID_JAPAN_CBM 0x0aaaU // Japan CBM Corp. +#define UHS_VID_VISION_SHAPE_EUROPE 0x0aabU // Vision Shape Europe SA +#define UHS_VID_ICOMPRESSION 0x0aacU // iCompression, Inc. +#define UHS_VID_ROHDE_AND_SCHWARZ_GMBH_AND_CO_KG 0x0aadU // Rohde & Schwarz GmbH & Co. KG +#define UHS_VID_NEC_INFRONTIA_CORP_NITSUKO 0x0aaeU // NEC infrontia Corp. (Nitsuko) +#define UHS_VID_DIGITALWAY 0x0aafU // Digitalway Co., Ltd +#define UHS_VID_ARROW_STRONG_ELECTRONICS 0x0ab0U // Arrow Strong Electronics Co., Ltd +#define UHS_VID_FEIG_ELECTRONIC 0x0ab1U // FEIG ELECTRONIC GmbH +#define UHS_VID_ELLISYS 0x0abaU // Ellisys +#define UHS_VID_STEREO_LINK 0x0abeU // Stereo-Link +#define UHS_VID_DIOLAN 0x0abfU // Diolan +#define UHS_VID_SANYO_SEMICONDUCTOR_COMPANY_MICRO 0x0ac3U // Sanyo Semiconductor Company Micro +#define UHS_VID_LECO 0x0ac4U // Leco Corp. +#define UHS_VID_I_AND_C 0x0ac5U // I & C Corp. +#define UHS_VID_SINGING_ELECTRONS 0x0ac6U // Singing Electrons, Inc. +#define UHS_VID_PANWEST 0x0ac7U // Panwest Corp. +#define UHS_VID_Z_STAR_MICROELECTRONICS 0x0ac8U // Z-Star Microelectronics Corp. +#define UHS_VID_MICRO_SOLUTIONS 0x0ac9U // Micro Solutions, Inc. +#define UHS_VID_OPEN_NETWORKS 0x0acaU // OPEN Networks Ltd +#define UHS_VID_KOGA_ELECTRONICS 0x0accU // Koga Electronics Co. +#define UHS_VID_ID_TECH 0x0acdU // ID Tech +#define UHS_VID_ZYDAS 0x0aceU // ZyDAS +#define UHS_VID_INTOTO 0x0acfU // Intoto, Inc. +#define UHS_VID_INTELLIX 0x0ad0U // Intellix Corp. +#define UHS_VID_REMOTEC_TECHNOLOGY 0x0ad1U // Remotec Technology, Ltd +#define UHS_VID_SERVICE_AND_QUALITY_TECHNOLOGY 0x0ad2U // Service & Quality Technology Co., Ltd +#define UHS_VID_DATA_ENCRYPTION_SYSTEMS 0x0adaU // Data Encryption Systems Ltd. +#define UHS_VID_ALLION_COMPUTER 0x0ae3U // Allion Computer, Inc. +#define UHS_VID_TAITO 0x0ae4U // Taito Corp. +#define UHS_VID_NEODYM_SYSTEMS 0x0ae7U // Neodym Systems, Inc. +#define UHS_VID_SYSTEM_SUPPORT 0x0ae8U // System Support Co., Ltd +#define UHS_VID_NORTH_SHORE_CIRCUIT_DESIGN_LLP 0x0ae9U // North Shore Circuit Design L.L.P. +#define UHS_VID_SCIESSENCE 0x0aeaU // SciEssence, LLC +#define UHS_VID_TTP_COMMUNICATIONS 0x0aebU // TTP Communications, Ltd +#define UHS_VID_NEODIO_TECHNOLOGIES 0x0aecU // Neodio Technologies Corp. +#define UHS_VID_OPTION 0x0af0U // Option +#define UHS_VID_SILVER_I 0x0af6U // Silver I Co., Ltd +#define UHS_VID_B2C2 0x0af7U // B2C2, Inc. +#define UHS_VID_HAMA 0x0af9U // Hama, Inc. +#define UHS_VID_DMC 0x0afaU // DMC Co., Ltd. +#define UHS_VID_ZAPTRONIX 0x0afcU // Zaptronix Ltd +#define UHS_VID_TATENO_DENNOU 0x0afdU // Tateno Dennou, Inc. +#define UHS_VID_CUMMINS_ENGINE 0x0afeU // Cummins Engine Co. +#define UHS_VID_JUMP_ZONE_NETWORK_PRODUCTS 0x0affU // Jump Zone Network Products, Inc. +#define UHS_VID_INGENICO 0x0b00U // INGENICO +#define UHS_VID_ASUSTEK_COMPUTER 0x0b05U // ASUSTek Computer, Inc. +#define UHS_VID_DATAMAX_ONEIL 0x0b0bU // Datamax-O'Neil +#define UHS_VID_TODOS 0x0b0cU // Todos AB +#define UHS_VID_PROJECTLAB 0x0b0dU // ProjectLab +#define UHS_VID_GN_NETCOM 0x0b0eU // GN Netcom +#define UHS_VID_AVID_TECHNOLOGY 0x0b0fU // AVID Technology +#define UHS_VID_PCALLY 0x0b10U // Pcally +#define UHS_VID_I_TECH_SOLUTIONS 0x0b11U // I Tech Solutions Co., Ltd +#define UHS_VID_ELECTRONIC_WARFARE_ASSOC_INC_EWA 0x0b1eU // Electronic Warfare Assoc., Inc. (EWA) +#define UHS_VID_INSYDE_SOFTWARE 0x0b1fU // Insyde Software Corp. +#define UHS_VID_TRANSDIMENSION 0x0b20U // TransDimension, Inc. +#define UHS_VID_YOKOGAWA_ELECTRIC 0x0b21U // Yokogawa Electric Corp. +#define UHS_VID_JAPAN_SYSTEM_DEVELOPMENT 0x0b22U // Japan System Development Co., Ltd +#define UHS_VID_PAN_ASIA_ELECTRONICS 0x0b23U // Pan-Asia Electronics Co., Ltd +#define UHS_VID_LINK_EVOLUTION 0x0b24U // Link Evolution Corp. +#define UHS_VID_RITEK 0x0b27U // Ritek Corp. +#define UHS_VID_KENWOOD 0x0b28U // Kenwood Corp. +#define UHS_VID_VILLAGE_CENTER 0x0b2cU // Village Center, Inc. +#define UHS_VID_PNY_TECHNOLOGIES 0x0b30U // PNY Technologies, Inc. +#define UHS_VID_CONTOUR_DESIGN 0x0b33U // Contour Design, Inc. +#define UHS_VID_HITACHI_ULSI_SYSTEMS 0x0b37U // Hitachi ULSI Systems Co., Ltd +#define UHS_VID_GEAR_HEAD 0x0b38U // Gear Head +#define UHS_VID_OMNIDIRECTIONAL_CONTROL_TECHNOLOGY 0x0b39U // Omnidirectional Control Technology, Inc. +#define UHS_VID_IPAXESS 0x0b3aU // IPaxess +#define UHS_VID_TEKRAM_TECHNOLOGY 0x0b3bU // Tekram Technology Co., Ltd +#define UHS_VID_OLIVETTI_TECHCENTER 0x0b3cU // Olivetti Techcenter +#define UHS_VID_KIKUSUI_ELECTRONICS 0x0b3eU // Kikusui Electronics Corp. +#define UHS_VID_HAL 0x0b41U // Hal Corp. +#define UHS_VID_PLAYCOM 0x0b43U // Play.com, Inc. +#define UHS_VID_SPORTBUGCOM 0x0b47U // Sportbug.com, Inc. +#define UHS_VID_TECHNOTREND_AG 0x0b48U // TechnoTrend AG +#define UHS_VID_ASCII 0x0b49U // ASCII Corp. +#define UHS_VID_PINE 0x0b4bU // Pine Corp. Ltd. +#define UHS_VID_GRAPHTEC_AMERICA 0x0b4dU // Graphtec America, Inc. +#define UHS_VID_MUSICAL_ELECTRONICS 0x0b4eU // Musical Electronics, Ltd +#define UHS_VID_DUMPRIES 0x0b50U // Dumpries Co., Ltd +#define UHS_VID_COMFORT_KEYBOARD 0x0b51U // Comfort Keyboard Co. +#define UHS_VID_COLORADO_MICRODISPLAY 0x0b52U // Colorado MicroDisplay, Inc. +#define UHS_VID_SINBON_ELECTRONICS 0x0b54U // Sinbon Electronics Co., Ltd +#define UHS_VID_TYI_SYSTEMS 0x0b56U // TYI Systems, Ltd +#define UHS_VID_BEIJING_HANWANGTECHNOLOGY 0x0b57U // Beijing HanwangTechnology Co., Ltd +#define UHS_VID_LAKE_COMMUNICATIONS 0x0b59U // Lake Communications, Ltd +#define UHS_VID_COREL 0x0b5aU // Corel Corp. +#define UHS_VID_GREEN_ELECTRONICS 0x0b5fU // Green Electronics Co., Ltd +#define UHS_VID_NSINE 0x0b60U // Nsine, Ltd +#define UHS_VID_NEC_VIEWTECHNOLOGY 0x0b61U // NEC Viewtechnology, Ltd +#define UHS_VID_ORANGE_MICRO 0x0b62U // Orange Micro, Inc. +#define UHS_VID_ADLINK_TECHNOLOGY 0x0b63U // ADLink Technology, Inc. +#define UHS_VID_WONDERFUL_WIRE_CABLE 0x0b64U // Wonderful Wire Cable Co., Ltd +#define UHS_VID_EXPERT_MAGNETICS 0x0b65U // Expert Magnetics Corp. +#define UHS_VID_CYBIKO 0x0b66U // Cybiko Inc. +#define UHS_VID_FAIRBANKS_SCALES 0x0b67U // Fairbanks Scales +#define UHS_VID_CACHEVISION 0x0b69U // CacheVision +#define UHS_VID_MAXIM_INTEGRATED_PRODUCTS 0x0b6aU // Maxim Integrated Products +#define UHS_VID_NAGANO_JAPAN_RADIO 0x0b6fU // Nagano Japan Radio Co., Ltd +#define UHS_VID_PORTALPLAYER 0x0b70U // PortalPlayer, Inc. +#define UHS_VID_SHIN_EI_SANGYO 0x0b71U // SHIN-EI Sangyo Co., Ltd +#define UHS_VID_EMBEDDED_WIRELESS_TECHNOLOGY 0x0b72U // Embedded Wireless Technology Co., Ltd +#define UHS_VID_COMPUTONE 0x0b73U // Computone Corp. +#define UHS_VID_ROLAND_DG 0x0b75U // Roland DG Corp. +#define UHS_VID_SUNRISE_TELECOM 0x0b79U // Sunrise Telecom, Inc. +#define UHS_VID_ZEEVO 0x0b7aU // Zeevo, Inc. +#define UHS_VID_TAIKO_DENKI 0x0b7bU // Taiko Denki Co., Ltd +#define UHS_VID_ITRAN_COMMUNICATIONS 0x0b7cU // ITRAN Communications, Ltd +#define UHS_VID_ASTRODESIGN 0x0b7dU // Astrodesign, Inc. +#define UHS_VID_ID3_TECHNOLOGIES 0x0b81U // id3 Technologies +#define UHS_VID_REXTRON_TECHNOLOGY 0x0b84U // Rextron Technology, Inc. +#define UHS_VID_ELKAT_ELECTRONICS_SDN_BHD 0x0b85U // Elkat Electronics, Sdn., Bhd. +#define UHS_VID_EXPUTER_SYSTEMS 0x0b86U // Exputer Systems, Inc. +#define UHS_VID_PLUS_ONE_I_AND_T 0x0b87U // Plus-One I & T, Inc. +#define UHS_VID_SIGMA_KOKI_CO_LTD_TECHNOLOGY_CENTER 0x0b88U // Sigma Koki Co., Ltd, Technology Center +#define UHS_VID_ADVANCED_DIGITAL_BROADCAST 0x0b89U // Advanced Digital Broadcast, Ltd +#define UHS_VID_SMART_TECHNOLOGIES 0x0b8cU // SMART Technologies Inc. +#define UHS_VID_ASIX_ELECTRONICS 0x0b95U // ASIX Electronics Corp. +#define UHS_VID_SEWON_TELECOM 0x0b96U // Sewon Telecom +#define UHS_VID_O2_MICRO 0x0b97U // O2 Micro, Inc. +#define UHS_VID_PLAYMATES_TOYS 0x0b98U // Playmates Toys, Inc. +#define UHS_VID_AUDIO_INTERNATIONAL 0x0b99U // Audio International, Inc. +#define UHS_VID_DIPL_ING_STEFAN_KUNDE 0x0b9bU // Dipl.-Ing. Stefan Kunde +#define UHS_VID_SOFTPROTEC 0x0b9dU // Softprotec Co. +#define UHS_VID_CHIPPO_TECHNOLOGIES 0x0b9fU // Chippo Technologies +#define UHS_VID_US_ROBOTICS 0x0bafU // U.S. Robotics +#define UHS_VID_CONCORD_CAMERA 0x0bb0U // Concord Camera Corp. +#define UHS_VID_INFINILINK 0x0bb1U // Infinilink Corp. +#define UHS_VID_AMBIT_MICROSYSTEMS 0x0bb2U // Ambit Microsystems Corp. +#define UHS_VID_OFUJI_TECHNOLOGY 0x0bb3U // Ofuji Technology +#define UHS_VID_HTC_HIGH_TECH_COMPUTER 0x0bb4U // HTC (High Tech Computer Corp.) +#define UHS_VID_MURATA_MANUFACTURING 0x0bb5U // Murata Manufacturing Co., Ltd +#define UHS_VID_NETWORK_ALCHEMY 0x0bb6U // Network Alchemy +#define UHS_VID_JOYTECH_COMPUTER 0x0bb7U // Joytech Computer Co., Ltd +#define UHS_VID_HITACHI_SEMICONDUCTOR_AND_DEVICES_SALES 0x0bb8U // Hitachi Semiconductor and Devices Sales Co., Ltd +#define UHS_VID_EIGER_MANDC 0x0bb9U // Eiger M&C Co., Ltd +#define UHS_VID_ZACCESS_SYSTEMS 0x0bbaU // ZAccess Systems +#define UHS_VID_GENERAL_METERS 0x0bbbU // General Meters Corp. +#define UHS_VID_ASSISTIVE_TECHNOLOGY 0x0bbcU // Assistive Technology, Inc. +#define UHS_VID_SYSTEM_CONNECTION 0x0bbdU // System Connection, Inc. +#define UHS_VID_KNILINK_TECHNOLOGY 0x0bc0U // Knilink Technology, Inc. +#define UHS_VID_FUW_YNG_ELECTRONICS 0x0bc1U // Fuw Yng Electronics Co., Ltd +#define UHS_VID_SEAGATE_RSS 0x0bc2U // Seagate RSS LLC +#define UHS_VID_IPWIRELESS 0x0bc3U // IPWireless, Inc. +#define UHS_VID_MICROCUBE 0x0bc4U // Microcube Corp. +#define UHS_VID_JCN 0x0bc5U // JCN Co., Ltd +#define UHS_VID_EXWAY 0x0bc6U // ExWAY, Inc. +#define UHS_VID_X10_WIRELESS_TECHNOLOGY 0x0bc7U // X10 Wireless Technology, Inc. +#define UHS_VID_TELMAX_COMMUNICATIONS 0x0bc8U // Telmax Communications +#define UHS_VID_ECI_TELECOM 0x0bc9U // ECI Telecom, Ltd +#define UHS_VID_STARTEK_ENGINEERING 0x0bcaU // Startek Engineering, Inc. +#define UHS_VID_PERFECT_TECHNIC_ENTERPRISE 0x0bcbU // Perfect Technic Enterprise Co., Ltd +#define UHS_VID_ANDREW_PARGETER_AND_ASSOCIATES 0x0bd7U // Andrew Pargeter & Associates +#define UHS_VID_REALTEK_SEMICONDUCTOR 0x0bdaU // Realtek Semiconductor Corp. +#define UHS_VID_ERICSSON_BUSINESS_MOBILE_NETWORKS_BV 0x0bdbU // Ericsson Business Mobile Networks BV +#define UHS_VID_Y_MEDIA 0x0bdcU // Y Media Corp. +#define UHS_VID_ORANGE_PCS 0x0bddU // Orange PCS +#define UHS_VID_KANDA_TSUSHIN_KOGYO 0x0be2U // Kanda Tsushin Kogyo Co., Ltd +#define UHS_VID_TOYO 0x0be3U // TOYO Corp. +#define UHS_VID_ELKA_INTERNATIONAL 0x0be4U // Elka International, Ltd +#define UHS_VID_DOME_IMAGING_SYSTEMS 0x0be5U // DOME imaging systems, Inc. +#define UHS_VID_DONG_GUAN_HUMEN_WONDERFUL_WIRE_CABLE_FACTORY 0x0be6U // Dong Guan Humen Wonderful Wire Cable Factory +#define UHS_VID_MEI 0x0bedU // MEI +#define UHS_VID_LTK_INDUSTRIES 0x0beeU // LTK Industries, Ltd +#define UHS_VID_WAY2CALL_COMMUNICATIONS 0x0befU // Way2Call Communications +#define UHS_VID_PACE_MICRO_TECHNOLOGY_PLC 0x0bf0U // Pace Micro Technology PLC +#define UHS_VID_INTRACOM 0x0bf1U // Intracom S.A. +#define UHS_VID_KONEXX 0x0bf2U // Konexx +#define UHS_VID_ADDONICS_TECHNOLOGIES_1 0x0bf6U // Addonics Technologies, Inc. +#define UHS_VID_SUNNY_GIKEN 0x0bf7U // Sunny Giken, Inc. +#define UHS_VID_FUJITSU_SIEMENS_COMPUTERS_1 0x0bf8U // Fujitsu Siemens Computers +#define UHS_VID_KVASER 0x0bfdU // Kvaser AB +#define UHS_VID_MOTO_DEVELOPMENT_GROUP 0x0c04U // MOTO Development Group, Inc. +#define UHS_VID_APPIAN_GRAPHICS 0x0c05U // Appian Graphics +#define UHS_VID_HASBRO_GAMES 0x0c06U // Hasbro Games, Inc. +#define UHS_VID_INFINITE_DATA_STORAGE 0x0c07U // Infinite Data Storage, Ltd +#define UHS_VID_AGATE 0x0c08U // Agate +#define UHS_VID_COMJET_INFORMATION_SYSTEM 0x0c09U // Comjet Information System +#define UHS_VID_HIGHPOINT_TECHNOLOGIES 0x0c0aU // Highpoint Technologies, Inc. +#define UHS_VID_DURA_MICRO_INC_ACOMDATA 0x0c0bU // Dura Micro, Inc. (Acomdata) +#define UHS_VID_ZEROPLUS 0x0c12U // Zeroplus +#define UHS_VID_IRIS_GRAPHICS 0x0c15U // Iris Graphics +#define UHS_VID_GYRATION 0x0c16U // Gyration, Inc. +#define UHS_VID_CYBERBOARD_AS 0x0c17U // Cyberboard A/S +#define UHS_VID_SYNERTEK_KOREA 0x0c18U // SynerTek Korea, Inc. +#define UHS_VID_CYBERPIXIE 0x0c19U // cyberPIXIE, Inc. +#define UHS_VID_SILICON_MOTION 0x0c1aU // Silicon Motion, Inc. +#define UHS_VID_MIPS_TECHNOLOGIES 0x0c1bU // MIPS Technologies +#define UHS_VID_HANG_ZHOU_SILAN_ELECTRONICS 0x0c1cU // Hang Zhou Silan Electronics Co., Ltd +#define UHS_VID_TALLY_PRINTER 0x0c22U // Tally Printer Corp. +#define UHS_VID_LERNOUT__HAUSPIE 0x0c23U // Lernout + Hauspie +#define UHS_VID_TAIYO_YUDEN 0x0c24U // Taiyo Yuden +#define UHS_VID_SAMPO 0x0c25U // Sampo Corp. +#define UHS_VID_PROLIFIC_TECHNOLOGY_1 0x0c26U // Prolific Technology Inc. +#define UHS_VID_RFIDEAS 0x0c27U // RFIDeas, Inc +#define UHS_VID_METROLOGIC_INSTRUMENTS 0x0c2eU // Metrologic Instruments +#define UHS_VID_EAGLETRON 0x0c35U // Eagletron, Inc. +#define UHS_VID_E_INK 0x0c36U // E Ink Corp. +#define UHS_VID_EDIGITAL 0x0c37U // e.Digital +#define UHS_VID_DER_AN_ELECTRIC_WIRE_AND_CABLE 0x0c38U // Der An Electric Wire & Cable Co., Ltd +#define UHS_VID_IFR 0x0c39U // IFR +#define UHS_VID_FURUI_PRECISE_COMPONENT_KUNSHAN 0x0c3aU // Furui Precise Component (Kunshan) Co., Ltd +#define UHS_VID_KOMATSU 0x0c3bU // Komatsu, Ltd +#define UHS_VID_RADIUS 0x0c3cU // Radius Co., Ltd +#define UHS_VID_INNOCOM 0x0c3dU // Innocom, Inc. +#define UHS_VID_NEXTCELL 0x0c3eU // Nextcell, Inc. +#define UHS_VID_MOTOROLA_IDEN 0x0c44U // Motorola iDEN +#define UHS_VID_MICRODIA 0x0c45U // Microdia +#define UHS_VID_WAVERIDER_COMMUNICATIONS 0x0c46U // WaveRider Communications, Inc. +#define UHS_VID_ALGE_TIMING 0x0c4aU // ALGE-TIMING GmbH +#define UHS_VID_REINER_SCT_KARTENSYSTEME 0x0c4bU // Reiner SCT Kartensysteme GmbH +#define UHS_VID_NEEDHAMS_ELECTRONICS 0x0c4cU // Needham's Electronics +#define UHS_VID_SEALEVEL_SYSTEMS 0x0c52U // Sealevel Systems, Inc. +#define UHS_VID_VIEWPLUS 0x0c53U // ViewPLUS, Inc. +#define UHS_VID_GLORY 0x0c54U // Glory, Ltd +#define UHS_VID_SPECTRUM_DIGITAL 0x0c55U // Spectrum Digital, Inc. +#define UHS_VID_BILLION_BRIGHT 0x0c56U // Billion Bright, Ltd +#define UHS_VID_IMAGINATIVE_DESIGN_OPERATION 0x0c57U // Imaginative Design Operation Co., Ltd +#define UHS_VID_VIDAR_SYSTEMS 0x0c58U // Vidar Systems Corp. +#define UHS_VID_DONG_GUAN_SHINKO_WIRE 0x0c59U // Dong Guan Shinko Wire Co., Ltd +#define UHS_VID_TRS_INTERNATIONAL_MFG 0x0c5aU // TRS International Mfg., Inc. +#define UHS_VID_XYTRONIX_RESEARCH_AND_DESIGN 0x0c5eU // Xytronix Research & Design +#define UHS_VID_APOGEE_ELECTRONICS 0x0c60U // Apogee Electronics Corp. +#define UHS_VID_CHANT_SINCERE 0x0c62U // Chant Sincere Co., Ltd +#define UHS_VID_TOKO 0x0c63U // Toko, Inc. +#define UHS_VID_SIGNALITY_SYSTEM_ENGINEERING 0x0c64U // Signality System Engineering Co., Ltd +#define UHS_VID_EMINENCE_ENTERPRISE 0x0c65U // Eminence Enterprise Co., Ltd +#define UHS_VID_REXON_ELECTRONICS 0x0c66U // Rexon Electronics Corp. +#define UHS_VID_CONCEPT_TELECOM 0x0c67U // Concept Telecom, Ltd +#define UHS_VID_ACS 0x0c6aU // ACS +#define UHS_VID_JETI_TECHNISCHE_INSTRUMENTE 0x0c6cU // JETI Technische Instrumente GmbH +#define UHS_VID_MCT_ELEKTRONIKLADEN 0x0c70U // MCT Elektronikladen +#define UHS_VID_PEAK_SYSTEM 0x0c72U // PEAK System +#define UHS_VID_OPTRONIC_LABORATORIES 0x0c74U // Optronic Laboratories Inc. +#define UHS_VID_JMTEK 0x0c76U // JMTek, LLC. +#define UHS_VID_SIPIX_GROUP 0x0c77U // Sipix Group, Ltd +#define UHS_VID_DETTO 0x0c78U // Detto Corp. +#define UHS_VID_NUCONNEX_TECHNOLOGIES_PTE 0x0c79U // NuConnex Technologies Pte., Ltd +#define UHS_VID_WING_SPAN_ENTERPRISE 0x0c7aU // Wing-Span Enterprise Co., Ltd +#define UHS_VID_NDA_TECHNOLOGIES 0x0c86U // NDA Technologies, Inc. +#define UHS_VID_KYOCERA_WIRELESS 0x0c88U // Kyocera Wireless Corp. +#define UHS_VID_HONDA_TSUSHIN_KOGYO 0x0c89U // Honda Tsushin Kogyo Co., Ltd +#define UHS_VID_PATHWAY_CONNECTIVITY 0x0c8aU // Pathway Connectivity, Inc. +#define UHS_VID_WAVEFLY 0x0c8bU // Wavefly Corp. +#define UHS_VID_COACTIVE_NETWORKS 0x0c8cU // Coactive Networks +#define UHS_VID_TEMPO 0x0c8dU // Tempo +#define UHS_VID_CESSCOM 0x0c8eU // Cesscom Co., Ltd +#define UHS_VID_APPLIED_MICROSYSTEMS 0x0c8fU // Applied Microsystems +#define UHS_VID_CRYPTERA 0x0c94U // Cryptera +#define UHS_VID_BERKSHIRE_PRODUCTS 0x0c98U // Berkshire Products, Inc. +#define UHS_VID_INNOCHIPS 0x0c99U // Innochips Co., Ltd +#define UHS_VID_HANWOOL_ROBOTICS 0x0c9aU // Hanwool Robotics Corp. +#define UHS_VID_JOBIN_YVON 0x0c9bU // Jobin Yvon, Inc. +#define UHS_VID_SEMTEK 0x0c9dU // SemTek +#define UHS_VID_ZYFER 0x0ca2U // Zyfer +#define UHS_VID_SEGA 0x0ca3U // Sega Corp. +#define UHS_VID_STANDT_INSTRUMENT 0x0ca4U // ST&T Instrument Corp. +#define UHS_VID_BAE_SYSTEMS_CANADA 0x0ca5U // BAE Systems Canada, Inc. +#define UHS_VID_CASTLES_TECHNOLOGY 0x0ca6U // Castles Technology Co., Ltd +#define UHS_VID_INFORMATION_SYSTEMS_LABORATORIES 0x0ca7U // Information Systems Laboratories +#define UHS_VID_MOTOROLA_CGISS 0x0cadU // Motorola CGISS +#define UHS_VID_ASCOM_BUSINESS_SYSTEMS 0x0caeU // Ascom Business Systems, Ltd +#define UHS_VID_BUSLINK 0x0cafU // Buslink +#define UHS_VID_FLYING_PIG_SYSTEMS 0x0cb0U // Flying Pig Systems +#define UHS_VID_INNOVONICS 0x0cb1U // Innovonics, Inc. +#define UHS_VID_CELESTIX_NETWORKS_PTE 0x0cb6U // Celestix Networks, Pte., Ltd +#define UHS_VID_SINGATRON_ENTERPRISE 0x0cb7U // Singatron Enterprise Co., Ltd +#define UHS_VID_OPTICIS 0x0cb8U // Opticis Co., Ltd +#define UHS_VID_TRUST_ELECTRONIC_SHANGHAI 0x0cbaU // Trust Electronic (Shanghai) Co., Ltd +#define UHS_VID_SHANGHAI_DARONG_ELECTRONICS 0x0cbbU // Shanghai Darong Electronics Co., Ltd +#define UHS_VID_PALMAX_TECHNOLOGY 0x0cbcU // Palmax Technology Co., Ltd +#define UHS_VID_PENTEL_CO_LTD_ELECTRONICS_EQUIPMENT_DIV 0x0cbdU // Pentel Co., Ltd (Electronics Equipment Div.) +#define UHS_VID_KERYX_TECHNOLOGIES 0x0cbeU // Keryx Technologies, Inc. +#define UHS_VID_UNION_GENIUS_COMPUTER 0x0cbfU // Union Genius Computer Co., Ltd +#define UHS_VID_KUON_YI_INDUSTRIAL 0x0cc0U // Kuon Yi Industrial Corp. +#define UHS_VID_GIVEN_IMAGING 0x0cc1U // Given Imaging, Ltd +#define UHS_VID_TIMEX 0x0cc2U // Timex Corp. +#define UHS_VID_RIMAGE 0x0cc3U // Rimage Corp. +#define UHS_VID_EMSYS 0x0cc4U // emsys GmbH +#define UHS_VID_SENDO 0x0cc5U // Sendo +#define UHS_VID_INTERMAGIC 0x0cc6U // Intermagic Corp. +#define UHS_VID_KONTRON_MEDICAL_AG 0x0cc7U // Kontron Medical AG +#define UHS_VID_TECHNOTOOLS 0x0cc8U // Technotools Corp. +#define UHS_VID_BROADMAX_TECHNOLOGIES 0x0cc9U // BroadMAX Technologies, Inc. +#define UHS_VID_AMPHENOL 0x0ccaU // Amphenol +#define UHS_VID_SKNET 0x0ccbU // SKNet Co., Ltd +#define UHS_VID_DOMEX_TECHNOLOGY 0x0cccU // Domex Technology Corp. +#define UHS_VID_TERRATEC_ELECTRONIC 0x0ccdU // TerraTec Electronic GmbH +#define UHS_VID_BANG_OLUFSEN 0x0cd4U // Bang Olufsen +#define UHS_VID_LABJACK_CORPORATION 0x0cd5U // LabJack Corporation +#define UHS_VID_NEWCHIP_SRL 0x0cd7U // NewChip S.r.l. +#define UHS_VID_JS_DIGITECH 0x0cd8U // JS Digitech, Inc. +#define UHS_VID_HITACHI_SHIN_DIN_CABLE 0x0cd9U // Hitachi Shin Din Cable, Ltd +#define UHS_VID_Z_COM 0x0cdeU // Z-Com +#define UHS_VID_VALIDATION_TECHNOLOGIES_INTERNATIONAL 0x0ce5U // Validation Technologies International +#define UHS_VID_PICO_TECHNOLOGY 0x0ce9U // Pico Technology +#define UHS_VID_E_CONN_ELECTRONIC 0x0cf1U // e-Conn Electronic Co., Ltd +#define UHS_VID_ENE_TECHNOLOGY 0x0cf2U // ENE Technology, Inc. +#define UHS_VID_ATHEROS_COMMUNICATIONS 0x0cf3U // Atheros Communications, Inc. +#define UHS_VID_FOMTEX 0x0cf4U // Fomtex Corp. +#define UHS_VID_CELLINK 0x0cf5U // Cellink Co., Ltd +#define UHS_VID_COMPUCABLE 0x0cf6U // Compucable Corp. +#define UHS_VID_ISHONI_NETWORKS 0x0cf7U // ishoni Networks +#define UHS_VID_CLARISYS 0x0cf8U // Clarisys, Inc. +#define UHS_VID_CENTRAL_SYSTEM_RESEARCH 0x0cf9U // Central System Research Co., Ltd +#define UHS_VID_INVISO 0x0cfaU // Inviso, Inc. +#define UHS_VID_MINOLTA_QMS 0x0cfcU // Minolta-QMS, Inc. +#define UHS_VID_SAFA_MEDIA 0x0cffU // SAFA MEDIA Co., Ltd. +#define UHS_VID_TELOS_EDV_SYSTEMENTWICKLUNG 0x0d06U // telos EDV Systementwicklung GmbH +#define UHS_VID_UTSTARCOM 0x0d08U // UTStarcom +#define UHS_VID_CONTEMPORARY_CONTROLS 0x0d0bU // Contemporary Controls +#define UHS_VID_ASTRON_ELECTRONICS 0x0d0cU // Astron Electronics Co., Ltd +#define UHS_VID_MKNET 0x0d0dU // MKNet Corp. +#define UHS_VID_HYBRID_NETWORKS 0x0d0eU // Hybrid Networks, Inc. +#define UHS_VID_FENG_SHIN_CABLE 0x0d0fU // Feng Shin Cable Co., Ltd +#define UHS_VID_ELASTIC_NETWORKS 0x0d10U // Elastic Networks +#define UHS_VID_MASPRO_DENKOH 0x0d11U // Maspro Denkoh Corp. +#define UHS_VID_HANSOL_ELECTRONICS 0x0d12U // Hansol Electronics, Inc. +#define UHS_VID_BMF 0x0d13U // BMF Corp. +#define UHS_VID_ARRAY_COMM 0x0d14U // Array Comm, Inc. +#define UHS_VID_ONSTREAM_BV 0x0d15U // OnStream b.v. +#define UHS_VID_HI_TOUCH_IMAGING_TECHNOLOGIES 0x0d16U // Hi-Touch Imaging Technologies Co., Ltd +#define UHS_VID_NALTEC 0x0d17U // NALTEC, Inc. +#define UHS_VID_COAXMEDIA 0x0d18U // coaXmedia +#define UHS_VID_HANK_CONNECTION_INDUSTRIAL 0x0d19U // Hank Connection Industrial Co., Ltd +#define UHS_VID_NXP 0x0d28U // NXP +#define UHS_VID_LEO_HUI_ELECTRIC_WIRE_AND_CABLE 0x0d32U // Leo Hui Electric Wire & Cable Co., Ltd +#define UHS_VID_AIRSPEAK 0x0d33U // AirSpeak, Inc. +#define UHS_VID_REARDEN_STEEL_TECHNOLOGIES 0x0d34U // Rearden Steel Technologies +#define UHS_VID_DAH_KUN 0x0d35U // Dah Kun Co., Ltd +#define UHS_VID_POSIFLEX_TECHNOLOGIES 0x0d3aU // Posiflex Technologies, Inc. +#define UHS_VID_SRI_CABLE_TECHNOLOGY 0x0d3cU // Sri Cable Technology, Ltd +#define UHS_VID_TANGTOP_TECHNOLOGY 0x0d3dU // Tangtop Technology Co., Ltd +#define UHS_VID_FITCOM 0x0d3eU // Fitcom, inc. +#define UHS_VID_MTS_SYSTEMS 0x0d3fU // MTS Systems Corp. +#define UHS_VID_ASCOR 0x0d40U // Ascor, Inc. +#define UHS_VID_TA_YUN_TERMINALS_INDUSTRIAL 0x0d41U // Ta Yun Terminals Industrial Co., Ltd +#define UHS_VID_FULL_DER 0x0d42U // Full Der Co., Ltd +#define UHS_VID_KOBIL_SYSTEMS 0x0d46U // Kobil Systems GmbH +#define UHS_VID_PROMETHEAN_LIMITED 0x0d48U // Promethean Limited +#define UHS_VID_MAXTOR 0x0d49U // Maxtor +#define UHS_VID_NF 0x0d4aU // NF Corp. +#define UHS_VID_GRAPE_SYSTEMS 0x0d4bU // Grape Systems, Inc. +#define UHS_VID_TEDAS_AG 0x0d4cU // Tedas AG +#define UHS_VID_COHERENT 0x0d4dU // Coherent, Inc. +#define UHS_VID_AGERE_SYSTEMS_NETHERLAND_BV 0x0d4eU // Agere Systems Netherland BV +#define UHS_VID_EADS_AIRBUS_FRANCE 0x0d4fU // EADS Airbus France +#define UHS_VID_CLEWARE 0x0d50U // Cleware GmbH +#define UHS_VID_VOLEX_ASIA_PTE 0x0d51U // Volex (Asia) Pte., Ltd +#define UHS_VID_HMI 0x0d53U // HMI Co., Ltd +#define UHS_VID_HOLON 0x0d54U // Holon Corp. +#define UHS_VID_ASKA_TECHNOLOGIES 0x0d55U // ASKA Technologies, Inc. +#define UHS_VID_AVLAB_TECHNOLOGY 0x0d56U // AVLAB Technology, Inc. +#define UHS_VID_SOLOMON_MICROTECH 0x0d57U // Solomon Microtech, Ltd +#define UHS_VID_SMC_NETWORKS 0x0d5cU // SMC Networks, Inc. +#define UHS_VID_MYACOM 0x0d5eU // Myacom, Ltd +#define UHS_VID_CSI 0x0d5fU // CSI, Inc. +#define UHS_VID_IVL_TECHNOLOGIES 0x0d60U // IVL Technologies, Ltd +#define UHS_VID_MEILU_ELECTRONICS_SHENZHEN 0x0d61U // Meilu Electronics (Shenzhen) Co., Ltd +#define UHS_VID_DARFON_ELECTRONICS 0x0d62U // Darfon Electronics Corp. +#define UHS_VID_FRITZ_GEGAUF_AG 0x0d63U // Fritz Gegauf AG +#define UHS_VID_DXG_TECHNOLOGY 0x0d64U // DXG Technology Corp. +#define UHS_VID_KMJP 0x0d65U // KMJP Co., Ltd +#define UHS_VID_TMT 0x0d66U // TMT +#define UHS_VID_ADVANET 0x0d67U // Advanet, Inc. +#define UHS_VID_SUPER_LINK_ELECTRONICS 0x0d68U // Super Link Electronics Co., Ltd +#define UHS_VID_NSI 0x0d69U // NSI +#define UHS_VID_MEGAPOWER_INTERNATIONAL 0x0d6aU // Megapower International Corp. +#define UHS_VID_AND_OR_LOGIC 0x0d6bU // And-Or Logic +#define UHS_VID_TRY_COMPUTER 0x0d70U // Try Computer Co., Ltd +#define UHS_VID_HIRAKAWA_HEWTECH 0x0d71U // Hirakawa Hewtech Corp. +#define UHS_VID_WINMATE_COMMUNICATION 0x0d72U // Winmate Communication, Inc. +#define UHS_VID_HITS_COMMUNICATIONS 0x0d73U // Hit's Communications, Inc. +#define UHS_VID_MFP_KOREA 0x0d76U // MFP Korea, Inc. +#define UHS_VID_POWER_SENTRYNEWPOINT 0x0d77U // Power Sentry/Newpoint +#define UHS_VID_JAPAN_DISTRIBUTOR 0x0d78U // Japan Distributor Corp. +#define UHS_VID_MARX_DATENTECHNIK 0x0d7aU // MARX Datentechnik GmbH +#define UHS_VID_WELLCO_TECHNOLOGY 0x0d7bU // Wellco Technology Co., Ltd +#define UHS_VID_TAIWAN_LINE_TEK_ELECTRONIC 0x0d7cU // Taiwan Line Tek Electronic Co., Ltd +#define UHS_VID_PHISON_ELECTRONICS 0x0d7dU // Phison Electronics Corp. +#define UHS_VID_AMERICAN_COMPUTER_AND_DIGITAL_COMPONENTS 0x0d7eU // American Computer & Digital Components +#define UHS_VID_ESSENTIAL_REALITY 0x0d7fU // Essential Reality LLC +#define UHS_VID_HR_SILVINE_ELECTRONICS 0x0d80U // H.R. Silvine Electronics, Inc. +#define UHS_VID_TECHNOVISION 0x0d81U // TechnoVision +#define UHS_VID_THINK_OUTSIDE 0x0d83U // Think Outside, Inc. +#define UHS_VID_DOLBY_LABORATORIES 0x0d87U // Dolby Laboratories Inc. +#define UHS_VID_OZ_SOFTWARE 0x0d89U // Oz Software +#define UHS_VID_KING_JIM 0x0d8aU // King Jim Co., Ltd +#define UHS_VID_ASCOM_TELECOMMUNICATIONS 0x0d8bU // Ascom Telecommunications, Ltd +#define UHS_VID_C_MEDIA_ELECTRONICS 0x0d8cU // C-Media Electronics, Inc. +#define UHS_VID_PROMOTION_AND_DISPLAY_TECHNOLOGY 0x0d8dU // Promotion & Display Technology, Ltd +#define UHS_VID_GLOBAL_SUN_TECHNOLOGY 0x0d8eU // Global Sun Technology, Inc. +#define UHS_VID_PITNEY_BOWES 0x0d8fU // Pitney Bowes +#define UHS_VID_SURE_FIRE_ELECTRICAL 0x0d90U // Sure-Fire Electrical Corp. +#define UHS_VID_SKANHEX_TECHNOLOGY 0x0d96U // Skanhex Technology, Inc. +#define UHS_VID_SANTA_BARBARA_INSTRUMENT_GROUP 0x0d97U // Santa Barbara Instrument Group +#define UHS_VID_MARS_SEMICONDUCTOR 0x0d98U // Mars Semiconductor Corp. +#define UHS_VID_TRAZER_TECHNOLOGIES 0x0d99U // Trazer Technologies, Inc. +#define UHS_VID_RTX_TELECOM_AS 0x0d9aU // RTX Telecom AS +#define UHS_VID_TAT_SHING_ELECTRICAL 0x0d9bU // Tat Shing Electrical Co. +#define UHS_VID_CHEE_CHEN_HI_TECHNOLOGY 0x0d9cU // Chee Chen Hi-Technology Co., Ltd +#define UHS_VID_SANWA_SUPPLY 0x0d9dU // Sanwa Supply, Inc. +#define UHS_VID_AVAYA 0x0d9eU // Avaya +#define UHS_VID_POWERCOM 0x0d9fU // Powercom Co., Ltd +#define UHS_VID_DANGER_RESEARCH 0x0da0U // Danger Research +#define UHS_VID_SUZHOU_PETERS_PRECISE_INDUSTRIAL 0x0da1U // Suzhou Peter's Precise Industrial Co., Ltd +#define UHS_VID_LAND_INSTRUMENTS_INTERNATIONAL 0x0da2U // Land Instruments International, Ltd +#define UHS_VID_NIPPON_ELECTRO_SENSORY_DEVICES 0x0da3U // Nippon Electro-Sensory Devices Corp. +#define UHS_VID_POLAR_ELECTRO_OY 0x0da4U // Polar Electro Oy +#define UHS_VID_IOGEAR 0x0da7U // IOGear, Inc. +#define UHS_VID_SOFTDSP 0x0da8U // softDSP Co., Ltd +#define UHS_VID_CUBIG_GROUP 0x0dabU // Cubig Group +#define UHS_VID_WESTOVER_SCIENTIFIC 0x0dadU // Westover Scientific +#define UHS_VID_MICRO_STAR_INTERNATIONAL 0x0db0U // Micro Star International +#define UHS_VID_WEN_TE_ELECTRONICS 0x0db1U // Wen Te Electronics Co., Ltd +#define UHS_VID_SHIAN_HWI_PLUG_PARTS_PLASTIC_FACTORY 0x0db2U // Shian Hwi Plug Parts, Plastic Factory +#define UHS_VID_TEKRAM_TECHNOLOGY_1 0x0db3U // Tekram Technology Co., Ltd +#define UHS_VID_CHUNG_FU_CHEN_YEH_ENTERPRISE 0x0db4U // Chung Fu Chen Yeh Enterprise Corp. +#define UHS_VID_ACCESS_IS 0x0db5U // Access IS +#define UHS_VID_ELCON_SYSTEMTECHNIK 0x0db7U // ELCON Systemtechnik +#define UHS_VID_DIGIDESIGN 0x0dbaU // Digidesign +#define UHS_VID_AANDD_MEDICAL 0x0dbcU // A&D Medical +#define UHS_VID_JIUH_SHIUH_PRECISION_INDUSTRY 0x0dbeU // Jiuh Shiuh Precision Industry Co., Ltd +#define UHS_VID_JESS_LINK_INTERNATIONAL 0x0dbfU // Jess-Link International +#define UHS_VID_G7_SOLUTIONS_FORMERLY_GREAT_NOTIONS 0x0dc0U // G7 Solutions (formerly Great Notions) +#define UHS_VID_TAMAGAWA_SEIKI 0x0dc1U // Tamagawa Seiki Co., Ltd +#define UHS_VID_ATHENA_SMARTCARD_SOLUTIONS 0x0dc3U // Athena Smartcard Solutions, Inc. +#define UHS_VID_MACPOWER_PERIPHERALS 0x0dc4U // Macpower Peripherals, Ltd +#define UHS_VID_SDK 0x0dc5U // SDK Co., Ltd +#define UHS_VID_PRECISION_SQUARED_TECHNOLOGY 0x0dc6U // Precision Squared Technology Corp. +#define UHS_VID_FIRST_CABLE_LINE 0x0dc7U // First Cable Line, Inc. +#define UHS_VID_NETWORKFAB 0x0dcdU // NetworkFab Corp. +#define UHS_VID_ACCESS_SOLUTIONS 0x0dd0U // Access Solutions +#define UHS_VID_CONTEK_ELECTRONICS 0x0dd1U // Contek Electronics Co., Ltd +#define UHS_VID_POWER_QUOTIENT_INTERNATIONAL 0x0dd2U // Power Quotient International Co., Ltd +#define UHS_VID_MEDIAQ 0x0dd3U // MediaQ +#define UHS_VID_CUSTOM_ENGINEERING_SPA 0x0dd4U // Custom Engineering SPA +#define UHS_VID_CALIFORNIA_MICRO_DEVICES 0x0dd5U // California Micro Devices +#define UHS_VID_KOCOM 0x0dd7U // Kocom Co., Ltd +#define UHS_VID_NETAC_TECHNOLOGY 0x0dd8U // Netac Technology Co., Ltd +#define UHS_VID_HIGHSPEED_SURFING 0x0dd9U // HighSpeed Surfing +#define UHS_VID_INTEGRATED_CIRCUIT_SOLUTION 0x0ddaU // Integrated Circuit Solution, Inc. +#define UHS_VID_TAMARACK 0x0ddbU // Tamarack, Inc. +#define UHS_VID_DATELINK_TECHNOLOGY 0x0dddU // Datelink Technology Co., Ltd +#define UHS_VID_UBICOM 0x0ddeU // Ubicom, Inc. +#define UHS_VID_BD_CONSUMER_HEALTHCARE 0x0de0U // BD Consumer Healthcare +#define UHS_VID_USBMICRO 0x0de7U // USBmicro +#define UHS_VID_UTECH_ELECTRONIC_DG 0x0deaU // UTECH Electronic (D.G.) Co., Ltd. +#define UHS_VID_NOVASONICS 0x0dedU // Novasonics +#define UHS_VID_LIFETIME_MEMORY_PRODUCTS 0x0deeU // Lifetime Memory Products +#define UHS_VID_FULL_RISE_ELECTRONIC 0x0defU // Full Rise Electronic Co., Ltd +#define UHS_VID_NETANDSYS 0x0df4U // NET&SYS +#define UHS_VID_SITECOM_EUROPE_BV 0x0df6U // Sitecom Europe B.V. +#define UHS_VID_MOBILE_ACTION_TECHNOLOGY 0x0df7U // Mobile Action Technology, Inc. +#define UHS_VID_TOYO_COMMUNICATION_EQUIPMENT 0x0dfaU // Toyo Communication Equipment Co., Ltd +#define UHS_VID_GENERALTOUCH_TECHNOLOGY 0x0dfcU // GeneralTouch Technology Co., Ltd +#define UHS_VID_NIPPON_SYSTEMWARE 0x0e03U // Nippon Systemware Co., Ltd +#define UHS_VID_WINBEST_TECHNOLOGY 0x0e08U // Winbest Technology Co., Ltd +#define UHS_VID_AMIGO_TECHNOLOGY 0x0e0bU // Amigo Technology Inc. +#define UHS_VID_GESYTEC 0x0e0cU // Gesytec +#define UHS_VID_PICOQUANT 0x0e0dU // PicoQuant GmbH +#define UHS_VID_VMWARE 0x0e0fU // VMware, Inc. +#define UHS_VID_JMTEK_1 0x0e16U // JMTek, LLC +#define UHS_VID_WALEX_ELECTRONIC 0x0e17U // Walex Electronic, Ltd +#define UHS_VID_UNISYS_1 0x0e1aU // Unisys +#define UHS_VID_CREWAVE 0x0e1bU // Crewave +#define UHS_VID_PEGASUS_TECHNOLOGIES 0x0e20U // Pegasus Technologies Ltd. +#define UHS_VID_COWON_SYSTEMS 0x0e21U // Cowon Systems, Inc. +#define UHS_VID_SYMBIAN 0x0e22U // Symbian Ltd. +#define UHS_VID_LIOU_YUANE_ENTERPRISE 0x0e23U // Liou Yuane Enterprise Co., Ltd +#define UHS_VID_VINCHIP_SYSTEMS 0x0e25U // VinChip Systems, Inc. +#define UHS_VID_J_PHONE_EAST 0x0e26U // J-Phone East Co., Ltd +#define UHS_VID_HEARTMATH 0x0e30U // HeartMath LLC +#define UHS_VID_MICRO_COMPUTER_CONTROL 0x0e34U // Micro Computer Control Corp. +#define UHS_VID_3PEA_TECHNOLOGIES 0x0e35U // 3Pea Technologies, Inc. +#define UHS_VID_TIEPIE_ENGINEERING 0x0e36U // TiePie engineering +#define UHS_VID_STRATITEC 0x0e38U // Stratitec, Inc. +#define UHS_VID_SMART_MODULAR_TECHNOLOGIES 0x0e39U // Smart Modular Technologies, Inc. +#define UHS_VID_NEOSTAR_TECHNOLOGY 0x0e3aU // Neostar Technology Co., Ltd +#define UHS_VID_MANSELLA 0x0e3bU // Mansella, Ltd +#define UHS_VID_LINE6 0x0e41U // Line6, Inc. +#define UHS_VID_SUN_RISEFUL_TECHNOLOGY 0x0e44U // Sun-Riseful Technology Co., Ltd. +#define UHS_VID_JULIA 0x0e48U // Julia Corp., Ltd +#define UHS_VID_SHENZHEN_BAO_HING_ELECTRIC_WIRE_AND_CABLE_MFR 0x0e4aU // Shenzhen Bao Hing Electric Wire & Cable Mfr. Co. +#define UHS_VID_RADICA_GAMES 0x0e4cU // Radica Games, Ltd +#define UHS_VID_TECHNODATA_INTERWARE 0x0e50U // TechnoData Interware +#define UHS_VID_SPEED_DRAGON_MULTIMEDIA 0x0e55U // Speed Dragon Multimedia, Ltd +#define UHS_VID_KINGSTON_TECHNOLOGY_COMPANY 0x0e56U // Kingston Technology Company, Inc. +#define UHS_VID_ACTIVE 0x0e5aU // Active Co., Ltd +#define UHS_VID_UNION_POWER_INFORMATION_INDUSTRIAL 0x0e5bU // Union Power Information Industrial Co., Ltd +#define UHS_VID_BITLAND_INFORMATION_TECHNOLOGY 0x0e5cU // Bitland Information Technology Co., Ltd +#define UHS_VID_NELTRON_INDUSTRIAL 0x0e5dU // Neltron Industrial Co., Ltd +#define UHS_VID_CONWISE_TECHNOLOGY 0x0e5eU // Conwise Technology Co., Ltd. +#define UHS_VID_HAWKING_TECHNOLOGIES 0x0e66U // Hawking Technologies +#define UHS_VID_FOSSIL 0x0e67U // Fossil, Inc. +#define UHS_VID_MEGAWIN_TECHNOLOGY 0x0e6aU // Megawin Technology Co., Ltd +#define UHS_VID_LOGIC3 0x0e6fU // Logic3 +#define UHS_VID_TOKYO_ELECTRONIC_INDUSTRY 0x0e70U // Tokyo Electronic Industry Co., Ltd +#define UHS_VID_HSI_CHIN_ELECTRONICS 0x0e72U // Hsi-Chin Electronics Co., Ltd +#define UHS_VID_TVS_ELECTRONICS 0x0e75U // TVS Electronics, Ltd +#define UHS_VID_ARCHOS 0x0e79U // Archos, Inc. +#define UHS_VID_ON_TECH_INDUSTRY 0x0e7bU // On-Tech Industry Co., Ltd +#define UHS_VID_GMATE 0x0e7eU // Gmate, Inc. +#define UHS_VID_CHING_TAI_ELECTRIC_WIRE_AND_CABLE 0x0e82U // Ching Tai Electric Wire & Cable Co., Ltd +#define UHS_VID_SHIN_AN_WIRE_AND_CABLE 0x0e83U // Shin An Wire & Cable Co. +#define UHS_VID_WELL_FORCE_ELECTRONIC 0x0e8cU // Well Force Electronic Co., Ltd +#define UHS_VID_MEDIATEK_1 0x0e8dU // MediaTek Inc. +#define UHS_VID_GREENASIA 0x0e8fU // GreenAsia Inc. +#define UHS_VID_WIEBETECH 0x0e90U // WiebeTech, LLC +#define UHS_VID_VTECH_ENGINEERING_CANADA 0x0e91U // VTech Engineering Canada, Ltd +#define UHS_VID_CS_GLORY_ENTERPRISE 0x0e92U // C's Glory Enterprise Co., Ltd +#define UHS_VID_EM_TECHNICS 0x0e93U // eM Technics Co., Ltd +#define UHS_VID_FUTURE_TECHNOLOGY 0x0e95U // Future Technology Co., Ltd +#define UHS_VID_APLUX_COMMUNICATIONS 0x0e96U // Aplux Communications, Ltd +#define UHS_VID_FINGERWORKS 0x0e97U // Fingerworks, Inc. +#define UHS_VID_ADVANCED_ANALOGIC_TECHNOLOGIES 0x0e98U // Advanced Analogic Technologies, Inc. +#define UHS_VID_PARALLEL_DICE 0x0e99U // Parallel Dice Co., Ltd +#define UHS_VID_TA_HSING_INDUSTRIES 0x0e9aU // TA HSING Industries, Ltd +#define UHS_VID_ADTEC 0x0e9bU // ADTEC Corp. +#define UHS_VID_STREAMZAP 0x0e9cU // Streamzap, Inc. +#define UHS_VID_TAMURA 0x0e9fU // Tamura Corp. +#define UHS_VID_OURS_TECHNOLOGY 0x0ea0U // Ours Technology, Inc. +#define UHS_VID_NIHON_COMPUTER 0x0ea6U // Nihon Computer Co., Ltd +#define UHS_VID_MSL_ENTERPRISES 0x0ea7U // MSL Enterprises Corp. +#define UHS_VID_CENDYNE 0x0ea8U // CenDyne, Inc. +#define UHS_VID_HUMAX_1 0x0eadU // Humax Co., Ltd +#define UHS_VID_NOVATECH 0x0eb0U // NovaTech +#define UHS_VID_WIS_TECHNOLOGIES 0x0eb1U // WIS Technologies, Inc. +#define UHS_VID_Y_S_ELECTRONIC 0x0eb2U // Y-S Electronic Co., Ltd +#define UHS_VID_SAINT_TECHNOLOGY 0x0eb3U // Saint Technology Corp. +#define UHS_VID_ENDOR_AG 0x0eb7U // Endor AG +#define UHS_VID_METTLER_TOLEDO 0x0eb8U // Mettler Toledo +#define UHS_VID_THERMO_FISHER_SCIENTIFIC 0x0ebbU // Thermo Fisher Scientific +#define UHS_VID_VWEB 0x0ebeU // VWeb Corp. +#define UHS_VID_OMEGA_TECHNOLOGY_OF_TAIWAN 0x0ebfU // Omega Technology of Taiwan, Inc. +#define UHS_VID_LHI_TECHNOLOGY_CHINA 0x0ec0U // LHI Technology (China) Co., Ltd +#define UHS_VID_ABIT_COMPUTER 0x0ec1U // Abit Computer Corp. +#define UHS_VID_SWEETRAY_INDUSTRIAL 0x0ec2U // Sweetray Industrial, Ltd +#define UHS_VID_AXELL 0x0ec3U // Axell Co., Ltd +#define UHS_VID_BALLRACING_DEVELOPMENTS 0x0ec4U // Ballracing Developments, Ltd +#define UHS_VID_GT_INFORMATION_SYSTEM 0x0ec5U // GT Information System Co., Ltd +#define UHS_VID_INNOVISION_MULTIMEDIA 0x0ec6U // InnoVISION Multimedia, Ltd +#define UHS_VID_THETA_LINK 0x0ec7U // Theta Link Corp. +#define UHS_VID_LITE_ON_IT 0x0ecdU // Lite-On IT Corp. +#define UHS_VID_TAISOL_ELECTRONICS 0x0eceU // TaiSol Electronics Co., Ltd +#define UHS_VID_PHOGENIX_IMAGING 0x0ecfU // Phogenix Imaging, LLC +#define UHS_VID_WINMAXGROUP 0x0ed1U // WinMaxGroup +#define UHS_VID_KYOTO_MICRO_COMPUTER 0x0ed2U // Kyoto Micro Computer Co., Ltd +#define UHS_VID_WING_TECH_ENTERPRISE 0x0ed3U // Wing-Tech Enterprise Co., Ltd +#define UHS_VID_FIBERBYTE 0x0ed5U // Fiberbyte +#define UHS_VID_NORIAKE_ITRON 0x0edaU // Noriake Itron Corp. +#define UHS_VID_E_MDT 0x0edfU // e-MDT Co., Ltd +#define UHS_VID_SHIMA_SEIKI_MFG 0x0ee0U // Shima Seiki Mfg., Ltd +#define UHS_VID_SAROTECH 0x0ee1U // Sarotech Co., Ltd +#define UHS_VID_AMI_SEMICONDUCTOR 0x0ee2U // AMI Semiconductor, Inc. +#define UHS_VID_COMTRUE_TECHNOLOGY 0x0ee3U // ComTrue Technology Corp. +#define UHS_VID_SUNRICH_TECHNOLOGY 0x0ee4U // Sunrich Technology, Ltd +#define UHS_VID_DIGITAL_STREAM_TECHNOLOGY 0x0eeeU // Digital Stream Technology, Inc. +#define UHS_VID_D_WAV_SCIENTIFIC 0x0eefU // D-WAV Scientific Co., Ltd +#define UHS_VID_HITACHI_CABLE 0x0ef0U // Hitachi Cable, Ltd +#define UHS_VID_AICHI_MICRO_INTELLIGENT 0x0ef1U // Aichi Micro Intelligent Corp. +#define UHS_VID_IO_MAGIC 0x0ef2U // I/O Magic Corp. +#define UHS_VID_LYNN_PRODUCTS 0x0ef3U // Lynn Products, Inc. +#define UHS_VID_DSI_DATOTECH 0x0ef4U // DSI Datotech +#define UHS_VID_POINTCHIPS 0x0ef5U // PointChips +#define UHS_VID_YIELD_MICROELECTRONICS 0x0ef6U // Yield Microelectronics Corp. +#define UHS_VID_SM_TECH_CO_LTD_TULIP 0x0ef7U // SM Tech Co., Ltd (Tulip) +#define UHS_VID_OASIS_SEMICONDUCTOR 0x0efdU // Oasis Semiconductor +#define UHS_VID_WEM_TECHNOLOGY 0x0efeU // Wem Technology, Inc. +#define UHS_VID_UNITEK_UPS_SYSTEMS 0x0f03U // Unitek UPS Systems +#define UHS_VID_VISUAL_FRONTIER_ENTERPRISE 0x0f06U // Visual Frontier Enterprise Co., Ltd +#define UHS_VID_CSL_WIRE_AND_PLUG_SHEN_ZHEN 0x0f08U // CSL Wire & Plug (Shen Zhen) Co. +#define UHS_VID_CAS 0x0f0cU // CAS Corp. +#define UHS_VID_HORI 0x0f0dU // Hori Co., Ltd +#define UHS_VID_ENERGY_FULL 0x0f0eU // Energy Full Corp. +#define UHS_VID_LD_DIDACTIC 0x0f11U // LD Didactic GmbH +#define UHS_VID_MARS_ENGINEERING 0x0f12U // Mars Engineering Corp. +#define UHS_VID_ACETEK_TECHNOLOGY 0x0f13U // Acetek Technology Co., Ltd +#define UHS_VID_INGENICO_1 0x0f14U // Ingenico +#define UHS_VID_FINGER_LAKES_INSTRUMENTATION 0x0f18U // Finger Lakes Instrumentation +#define UHS_VID_ORACOM 0x0f19U // Oracom Co., Ltd +#define UHS_VID_ONSET_COMPUTER 0x0f1bU // Onset Computer Corp. +#define UHS_VID_FUNAI_ELECTRIC 0x0f1cU // Funai Electric Co., Ltd +#define UHS_VID_IWILL 0x0f1dU // Iwill Corp. +#define UHS_VID_IOI_TECHNOLOGY 0x0f21U // IOI Technology Corp. +#define UHS_VID_SENIOR_INDUSTRIES 0x0f22U // Senior Industries, Inc. +#define UHS_VID_LEADER_TECH_MANUFACTURER 0x0f23U // Leader Tech Manufacturer Co., Ltd +#define UHS_VID_FLEX_P_INDUSTRIES_SND_BHD 0x0f24U // Flex-P Industries, Snd., Bhd. +#define UHS_VID_VIPOWER 0x0f2dU // ViPower, Inc. +#define UHS_VID_GENIALITY_MAPLE_TECHNOLOGY 0x0f2eU // Geniality Maple Technology Co., Ltd +#define UHS_VID_PRIVA_DESIGN_SERVICES 0x0f2fU // Priva Design Services +#define UHS_VID_JESS_TECHNOLOGY 0x0f30U // Jess Technology Co., Ltd +#define UHS_VID_CHRYSALIS_DEVELOPMENT 0x0f31U // Chrysalis Development +#define UHS_VID_YFC_BONEAGLE_ELECTRIC 0x0f32U // YFC-BonEagle Electric Co., Ltd +#define UHS_VID_KOKUYO 0x0f37U // Kokuyo Co., Ltd +#define UHS_VID_NIEN_YI_INDUSTRIAL 0x0f38U // Nien-Yi Industrial Corp. +#define UHS_VID_TG3_ELECTRONICS_1 0x0f39U // TG3 Electronics +#define UHS_VID_AIRPRIME_INCORPORATED 0x0f3dU // Airprime, Incorporated +#define UHS_VID_RDC_SEMICONDUCTOR 0x0f41U // RDC Semiconductor Co., Ltd +#define UHS_VID_NITAL_CONSULTING_SERVICES 0x0f42U // Nital Consulting Services, Inc. +#define UHS_VID_POLHEMUS 0x0f44U // Polhemus +#define UHS_VID_ST_JOHN_TECHNOLOGY 0x0f4bU // St. John Technology Co., Ltd +#define UHS_VID_WORLDWIDE_CABLE_OPTO 0x0f4cU // WorldWide Cable Opto Corp. +#define UHS_VID_MICROTUNE 0x0f4dU // Microtune, Inc. +#define UHS_VID_FREEDOM_SCIENTIFIC 0x0f4eU // Freedom Scientific +#define UHS_VID_WING_KEY_ELECTRICAL 0x0f52U // Wing Key Electrical Co., Ltd +#define UHS_VID_DONGGUAN_WHITE_HORSE_CABLE_FACTORY 0x0f53U // Dongguan White Horse Cable Factory, Ltd +#define UHS_VID_KAWAI_MUSICAL_INSTRUMENTS_MFG 0x0f54U // Kawai Musical Instruments Mfg. Co., Ltd +#define UHS_VID_AMBICOM 0x0f55U // AmbiCom, Inc. +#define UHS_VID_PRAIRIECOMM 0x0f5cU // Prairiecomm, Inc. +#define UHS_VID_NEWAGE_INTERNATIONAL 0x0f5dU // NewAge International, LLC +#define UHS_VID_KEY_TECHNOLOGY 0x0f5fU // Key Technology Corp. +#define UHS_VID_NTK 0x0f60U // NTK, Ltd +#define UHS_VID_VARIAN 0x0f61U // Varian, Inc. +#define UHS_VID_ACROX_TECHNOLOGIES 0x0f62U // Acrox Technologies Co., Ltd +#define UHS_VID_LEAPFROG_ENTERPRISES 0x0f63U // LeapFrog Enterprises +#define UHS_VID_KOBE_STEEL 0x0f68U // Kobe Steel, Ltd +#define UHS_VID_DIONEX 0x0f69U // Dionex Corp. +#define UHS_VID_VIBREN_TECHNOLOGIES 0x0f6aU // Vibren Technologies, Inc. +#define UHS_VID_INTELLIGENT_SYSTEMS 0x0f6eU // INTELLIGENT SYSTEMS +#define UHS_VID_DFI_1 0x0f73U // DFI +#define UHS_VID_GUNTERMANN_AND_DRUNCK 0x0f78U // Guntermann & Drunck GmbH +#define UHS_VID_DQ_TECHNOLOGY 0x0f7cU // DQ Technology, Inc. +#define UHS_VID_NETBOTZ 0x0f7dU // NetBotz, Inc. +#define UHS_VID_FLUKE 0x0f7eU // Fluke Corp. +#define UHS_VID_VTECH_HOLDINGS 0x0f88U // VTech Holdings, Ltd +#define UHS_VID_YAZAKI 0x0f8bU // Yazaki Corp. +#define UHS_VID_YOUNG_GENERATION_INTERNATIONAL 0x0f8cU // Young Generation International Corp. +#define UHS_VID_UNIWILL_COMPUTER 0x0f8dU // Uniwill Computer Corp. +#define UHS_VID_KINGNET_TECHNOLOGY 0x0f8eU // Kingnet Technology Co., Ltd +#define UHS_VID_SOMA_NETWORKS 0x0f8fU // Soma Networks +#define UHS_VID_CVILUX 0x0f97U // CviLux Corp. +#define UHS_VID_CYBERBANK 0x0f98U // CyberBank Corp. +#define UHS_VID_HYUN_WON 0x0f9cU // Hyun Won, Inc. +#define UHS_VID_LUCENT_TECHNOLOGIES_1 0x0f9eU // Lucent Technologies +#define UHS_VID_STARCONN_ELECTRONIC 0x0fa3U // Starconn Electronic Co., Ltd +#define UHS_VID_ATL_TECHNOLOGY 0x0fa4U // ATL Technology +#define UHS_VID_SOTEC 0x0fa5U // Sotec Co., Ltd +#define UHS_VID_EPOX_COMPUTER 0x0fa7U // Epox Computer Co., Ltd +#define UHS_VID_LOGIC_CONTROLS 0x0fa8U // Logic Controls, Inc. +#define UHS_VID_WINPOINT_ELECTRONIC 0x0fafU // Winpoint Electronic Corp. +#define UHS_VID_HAURTIAN_WIRE_AND_CABLE 0x0fb0U // Haurtian Wire & Cable Co., Ltd +#define UHS_VID_INCLOSE_DESIGN 0x0fb1U // Inclose Design, Inc. +#define UHS_VID_JUAN_CHERN_INDUSTRIAL 0x0fb2U // Juan-Chern Industrial Co., Ltd +#define UHS_VID_HEBER 0x0fb6U // Heber Ltd +#define UHS_VID_WISTRON 0x0fb8U // Wistron Corp. +#define UHS_VID_AACOM 0x0fb9U // AACom Corp. +#define UHS_VID_SAN_SHING_ELECTRONICS 0x0fbaU // San Shing Electronics Co., Ltd +#define UHS_VID_BITWISE_SYSTEMS 0x0fbbU // Bitwise Systems, Inc. +#define UHS_VID_MITAC_INTERNATINAL 0x0fc1U // Mitac Internatinal Corp. +#define UHS_VID_PLUG_AND_JACK_INDUSTRIAL 0x0fc2U // Plug and Jack Industrial, Inc. +#define UHS_VID_DELCOM_ENGINEERING 0x0fc5U // Delcom Engineering +#define UHS_VID_DATAPLUS_SUPPLIES 0x0fc6U // Dataplus Supplies, Inc. +#define UHS_VID_RESEARCH_IN_MOTION 0x0fcaU // Research In Motion, Ltd. +#define UHS_VID_SONY_ERICSSON_MOBILE_COMMUNICATIONS 0x0fceU // Sony Ericsson Mobile Communications AB +#define UHS_VID_DYNASTREAM_INNOVATIONS 0x0fcfU // Dynastream Innovations, Inc. +#define UHS_VID_TULIP_COMPUTERS_BV 0x0fd0U // Tulip Computers B.V. +#define UHS_VID_GIANT_ELECTRONICS 0x0fd1U // Giant Electronics Ltd. +#define UHS_VID_SEAC_BANCHE 0x0fd2U // Seac Banche +#define UHS_VID_TENOVIS_GMBH_AND_CO_KG 0x0fd4U // Tenovis GmbH & Co., KG +#define UHS_VID_DIRECT_ACCESS_TECHNOLOGY 0x0fd5U // Direct Access Technology, Inc. +#define UHS_VID_ELGATO_SYSTEMS 0x0fd9U // Elgato Systems GmbH +#define UHS_VID_QUANTEC_NETWORKS 0x0fdaU // Quantec Networks GmbH +#define UHS_VID_MICRO_PLUS 0x0fdcU // Micro Plus +#define UHS_VID_OREGON_SCIENTIFIC 0x0fdeU // Oregon Scientific +#define UHS_VID_OSTERHOUT_DESIGN_GROUP 0x0fe0U // Osterhout Design Group +#define UHS_VID_IN_TECH_ELECTRONICS 0x0fe4U // IN-Tech Electronics, Ltd +#define UHS_VID_GREENCONN_USA 0x0fe5U // Greenconn (U.S.A.), Inc. +#define UHS_VID_KONTRON_INDUSTRIAL_COMPUTER_SOURCE_ICS_ADVENT 0x0fe6U // Kontron (Industrial Computer Source / ICS Advent) +#define UHS_VID_DVICO 0x0fe9U // DVICO +#define UHS_VID_UNITED_COMPUTER_ACCESSORIES 0x0feaU // United Computer Accessories +#define UHS_VID_CRS_ELECTRONIC 0x0febU // CRS Electronic Co., Ltd +#define UHS_VID_UMC_ELECTRONICS 0x0fecU // UMC Electronics Co., Ltd +#define UHS_VID_ACCESS 0x0fedU // Access Co., Ltd +#define UHS_VID_XSIDO 0x0feeU // Xsido Corp. +#define UHS_VID_MJ_RESEARCH 0x0fefU // MJ Research, Inc. +#define UHS_VID_CORE_VALLEY 0x0ff6U // Core Valley Co., Ltd +#define UHS_VID_CHI_SHING_COMPUTER_ACCESSORIES 0x0ff7U // CHI SHING Computer Accessories Co., Ltd +#define UHS_VID_CLAVIA_DMI 0x0ffcU // Clavia DMI AB +#define UHS_VID_EARLYSENSE 0x0ffdU // EarlySense +#define UHS_VID_AOPEN 0x0fffU // Aopen, Inc. +#define UHS_VID_SPEED_TECH 0x1000U // Speed Tech Corp. +#define UHS_VID_RITRONICS_COMPONENTS_S_PTE 0x1001U // Ritronics Components (S) Pte., Ltd +#define UHS_VID_SIGMA 0x1003U // Sigma Corp. +#define UHS_VID_LG_ELECTRONICS 0x1004U // LG Electronics, Inc. +#define UHS_VID_APACER_TECHNOLOGY 0x1005U // Apacer Technology, Inc. +#define UHS_VID_IRIVER 0x1006U // iRiver, Ltd. +#define UHS_VID_EMUZED 0x1009U // Emuzed, Inc. +#define UHS_VID_AV_CHASEWAY 0x100aU // AV Chaseway, Ltd +#define UHS_VID_CHOU_CHIN_INDUSTRIAL 0x100bU // Chou Chin Industrial Co., Ltd +#define UHS_VID_NETOPIA 0x100dU // Netopia, Inc. +#define UHS_VID_FUKUDA_DENSHI 0x1010U // Fukuda Denshi Co., Ltd +#define UHS_VID_MOBILE_MEDIA_TECH 0x1011U // Mobile Media Tech. +#define UHS_VID_SDKM_FIBRES_WIRES_AND_CABLES_BERHAD 0x1012U // SDKM Fibres, Wires & Cables Berhad +#define UHS_VID_TST_TOUCHLESS_SENSOR_TECHNOLOGY_AG 0x1013U // TST-Touchless Sensor Technology AG +#define UHS_VID_DENSITRON_TECHNOLOGIES_PLC 0x1014U // Densitron Technologies PLC +#define UHS_VID_SOFTRONICS_PTY 0x1015U // Softronics Pty., Ltd +#define UHS_VID_XIAMEN_HUNGS_ENTERPRISE 0x1016U // Xiamen Hung's Enterprise Co., Ltd +#define UHS_VID_SPEEDY_INDUSTRIAL_SUPPLIES_PTE 0x1017U // Speedy Industrial Supplies, Pte., Ltd +#define UHS_VID_ELITEGROUP_COMPUTER_SYSTEMS_ECS 0x1019U // Elitegroup Computer Systems (ECS) +#define UHS_VID_LABTEC_1 0x1020U // Labtec +#define UHS_VID_SHINKO_SHOJI 0x1022U // Shinko Shoji Co., Ltd +#define UHS_VID_HYPER_PALTEK 0x1025U // Hyper-Paltek +#define UHS_VID_NEWLY 0x1026U // Newly Corp. +#define UHS_VID_TIME_DOMAIN 0x1027U // Time Domain +#define UHS_VID_INOVYS 0x1028U // Inovys Corp. +#define UHS_VID_ATLANTIC_COAST_TELESYS 0x1029U // Atlantic Coast Telesys +#define UHS_VID_RAMOS_TECHNOLOGY 0x102aU // Ramos Technology Co., Ltd +#define UHS_VID_INFOTRONIC_AMERICA 0x102bU // Infotronic America, Inc. +#define UHS_VID_ETOMS_ELECTRONICS 0x102cU // Etoms Electronics Corp. +#define UHS_VID_WINIC 0x102dU // Winic Corp. +#define UHS_VID_COMAX_TECHNOLOGY 0x1031U // Comax Technology, Inc. +#define UHS_VID_C_ONE_TECHNOLOGY 0x1032U // C-One Technology Corp. +#define UHS_VID_NUCAM 0x1033U // Nucam Corp. +#define UHS_VID_STEELSERIES_APS 0x1038U // SteelSeries ApS +#define UHS_VID_DEVOLO_AG 0x1039U // devolo AG +#define UHS_VID_PSA 0x103aU // PSA +#define UHS_VID_STANTON 0x103dU // Stanton +#define UHS_VID_ICREATE_TECHNOLOGIES 0x1043U // iCreate Technologies Corp. +#define UHS_VID_CHU_YUEN_ENTERPRISE 0x1044U // Chu Yuen Enterprise Co., Ltd +#define UHS_VID_WINBOND_ELECTRONICS_CORP_HEX_ 0x1046U // Winbond Electronics Corp. [hex] +#define UHS_VID_TARGUS_GROUP_INTERNATIONAL 0x1048U // Targus Group International +#define UHS_VID_MYLEX_BUSLOGIC 0x104bU // Mylex / Buslogic +#define UHS_VID_AMCO_TEC_INTERNATIONAL 0x104cU // AMCO TEC International, Inc. +#define UHS_VID_NEWPORT_CORPORATION 0x104dU // Newport Corporation +#define UHS_VID_WB_ELECTRONICS 0x104fU // WB Electronics +#define UHS_VID_YUBICOCOM 0x1050U // Yubico.com +#define UHS_VID_IMMANUEL_ELECTRONICS 0x1053U // Immanuel Electronics Co., Ltd +#define UHS_VID_BMS_INTERNATIONAL_BEHEER_NV 0x1054U // BMS International Beheer N.V. +#define UHS_VID_COMPLEX_MICRO_INTERCONNECTION 0x1055U // Complex Micro Interconnection Co., Ltd +#define UHS_VID_HSIN_CHEN_ENT 0x1056U // Hsin Chen Ent Co., Ltd +#define UHS_VID_ON_SEMICONDUCTOR 0x1057U // ON Semiconductor +#define UHS_VID_WESTERN_DIGITAL_TECHNOLOGIES 0x1058U // Western Digital Technologies, Inc. +#define UHS_VID_GIESECKE_AND_DEVRIENT 0x1059U // Giesecke & Devrient GmbH +#define UHS_VID_FOXCONN_INTERNATIONAL 0x105bU // Foxconn International, Inc. +#define UHS_VID_HONG_JI_ELECTRIC_WIRE_AND_CABLE_DONGGUAN 0x105cU // Hong Ji Electric Wire & Cable (Dongguan) Co., Ltd +#define UHS_VID_DELKIN_DEVICES 0x105dU // Delkin Devices, Inc. +#define UHS_VID_VALENCE_SEMICONDUCTOR_DESIGN 0x105eU // Valence Semiconductor Design, Ltd +#define UHS_VID_CHIN_SHONG_ENTERPRISE 0x105fU // Chin Shong Enterprise Co., Ltd +#define UHS_VID_EASTHOME_INDUSTRIAL 0x1060U // Easthome Industrial Co., Ltd +#define UHS_VID_MOTOROLA_ELECTRONICS_TAIWAN_LTD_HEX_ 0x1063U // Motorola Electronics Taiwan, Ltd [hex] +#define UHS_VID_CCYU_TECHNOLOGY 0x1065U // CCYU Technology +#define UHS_VID_LOYAL_LEGEND 0x106aU // Loyal Legend, Ltd +#define UHS_VID_CURITEL_COMMUNICATIONS 0x106cU // Curitel Communications, Inc. +#define UHS_VID_SAN_CHIEH_MANUFACTURING 0x106dU // San Chieh Manufacturing, Ltd +#define UHS_VID_CONECTL 0x106eU // ConectL +#define UHS_VID_MONEY_CONTROLS 0x106fU // Money Controls +#define UHS_VID_GCT_SEMICONDUCTOR 0x1076U // GCT Semiconductor, Inc. +#define UHS_VID_GATEWAY_1 0x107bU // Gateway, Inc. +#define UHS_VID_ARLEC_AUSTRALIA 0x107dU // Arlec Australia, Ltd +#define UHS_VID_MIDORIYA_ELECTRIC 0x107eU // Midoriya Electric Co., Ltd +#define UHS_VID_KIDZMOUSE 0x107fU // KidzMouse, Inc. +#define UHS_VID_SHIN_ETSUKAKEN 0x1082U // Shin-Etsukaken Co., Ltd +#define UHS_VID_CANON_ELECTRONICS 0x1083U // Canon Electronics, Inc. +#define UHS_VID_PANTECH 0x1084U // Pantech Co., Ltd +#define UHS_VID_CHLORIDE_POWER_PROTECTION 0x108aU // Chloride Power Protection +#define UHS_VID_GRAND_TEK_TECHNOLOGY 0x108bU // Grand-tek Technology Co., Ltd +#define UHS_VID_ROBERT_BOSCH 0x108cU // Robert Bosch GmbH +#define UHS_VID_LOTES 0x108eU // Lotes Co., Ltd. +#define UHS_VID_SURFACE_OPTICS 0x1099U // Surface Optics Corp. +#define UHS_VID_DATASOFT_SYSTEMS 0x109aU // DATASOFT Systems GmbH +#define UHS_VID_HISENSE 0x109bU // Hisense +#define UHS_VID_ESOL 0x109fU // eSOL Co., Ltd +#define UHS_VID_HIROTECH 0x10a0U // Hirotech, Inc. +#define UHS_VID_MITSUBISHI_MATERIALS 0x10a3U // Mitsubishi Materials Corp. +#define UHS_VID_SK_TELETECH 0x10a9U // SK Teletech Co., Ltd +#define UHS_VID_CABLES_TO_GO 0x10aaU // Cables To Go +#define UHS_VID_USI 0x10abU // USI Co., Ltd +#define UHS_VID_HONEYWELL 0x10acU // Honeywell, Inc. +#define UHS_VID_PRINCETON_TECHNOLOGY 0x10aeU // Princeton Technology Corp. +#define UHS_VID_LIEBERT 0x10afU // Liebert Corp. +#define UHS_VID_COMODO_PLX_UNKNOWN 0x10b5U // Comodo (PLX?) +#define UHS_VID_DIBCOM 0x10b8U // DiBcom +#define UHS_VID_TM_TECHNOLOGY 0x10bbU // TM Technology, Inc. +#define UHS_VID_DINGING_TECHNOLOGY 0x10bcU // Dinging Technology Co., Ltd +#define UHS_VID_TMT_TECHNOLOGY 0x10bdU // TMT Technology, Inc. +#define UHS_VID_SMARTHOME 0x10bfU // SmartHome +#define UHS_VID_UNIVERSAL_LASER_SYSTEMS 0x10c3U // Universal Laser Systems, Inc. +#define UHS_VID_CYGNAL_INTEGRATED_PRODUCTS 0x10c4U // Cygnal Integrated Products, Inc. +#define UHS_VID_SANEI_ELECTRIC 0x10c5U // Sanei Electric, Inc. +#define UHS_VID_INTEC 0x10c6U // Intec, Inc. +#define UHS_VID_ERATECH 0x10cbU // Eratech +#define UHS_VID_GBM_CONNECTOR 0x10ccU // GBM Connector Co., Ltd +#define UHS_VID_KYCON 0x10cdU // Kycon, Inc. +#define UHS_VID_SILICON_LABS 0x10ceU // Silicon Labs +#define UHS_VID_VELLEMAN_COMPONENTS 0x10cfU // Velleman Components, Inc. +#define UHS_VID_HOTTINGER_BALDWIN_MEASUREMENT 0x10d1U // Hottinger Baldwin Measurement +#define UHS_VID_RAYCOMPOSER__R_ADAMS 0x10d2U // RayComposer - R. Adams +#define UHS_VID_MAN_BOON_MANUFACTORY 0x10d4U // Man Boon Manufactory, Ltd +#define UHS_VID_UNI_CLASS_TECHNOLOGY 0x10d5U // Uni Class Technology Co., Ltd +#define UHS_VID_ACTIONS_SEMICONDUCTOR 0x10d6U // Actions Semiconductor Co., Ltd +#define UHS_VID_AUTHENEX 0x10deU // Authenex, Inc. +#define UHS_VID_IN_WIN_DEVELOPMENT 0x10dfU // In-Win Development, Inc. +#define UHS_VID_POST_OP_VIDEO 0x10e0U // Post-Op Video, Inc. +#define UHS_VID_CABLEPLUS 0x10e1U // CablePlus, Ltd +#define UHS_VID_NADA_ELECTRONICS 0x10e2U // Nada Electronics, Ltd +#define UHS_VID_VAST_TECHNOLOGIES 0x10ecU // Vast Technologies, Inc. +#define UHS_VID_NEXIO 0x10f0U // Nexio Co., Ltd +#define UHS_VID_IMPORTEK 0x10f1U // Importek +#define UHS_VID_TURTLE_BEACH 0x10f5U // Turtle Beach +#define UHS_VID_PICTOS_TECHNOLOGIES 0x10fbU // Pictos Technologies, Inc. +#define UHS_VID_ANUBIS_ELECTRONICS 0x10fdU // Anubis Electronics, Ltd +#define UHS_VID_THRANE_AND_THRANE 0x10feU // Thrane & Thrane +#define UHS_VID_VIRTOUCH 0x1100U // VirTouch, Ltd +#define UHS_VID_EASYPASS_INDUSTRIAL 0x1101U // EasyPass Industrial Co., Ltd +#define UHS_VID_BRIGHTCOM_TECHNOLOGIES 0x1108U // Brightcom Technologies, Ltd +#define UHS_VID_MOXA_TECHNOLOGIES 0x110aU // Moxa Technologies Co., Ltd. +#define UHS_VID_ANALOG_DEVICES_CANADA_LTD_ALLIED_TELESYN 0x1110U // Analog Devices Canada, Ltd (Allied Telesyn) +#define UHS_VID_PANDORA_INTERNATIONAL 0x1111U // Pandora International Ltd. +#define UHS_VID_YM_ELECTRIC 0x1112U // YM ELECTRIC CO., Ltd +#define UHS_VID_MEDION_AG 0x1113U // Medion AG +#define UHS_VID_VSO_ELECTRIC 0x111eU // VSO Electric Co., Ltd +#define UHS_VID_REDRAT 0x112aU // RedRat +#define UHS_VID_MASTER_HILL_ELECTRIC_WIRE_AND_CABLE 0x112eU // Master Hill Electric Wire and Cable Co., Ltd +#define UHS_VID_CELLON_INTERNATIONAL 0x112fU // Cellon International, Inc. +#define UHS_VID_TENX_TECHNOLOGY 0x1130U // Tenx Technology, Inc. +#define UHS_VID_INTEGRATED_SYSTEM_SOLUTION 0x1131U // Integrated System Solution Corp. +#define UHS_VID_TOSHIBA_CORP_DIGITAL_MEDIA_EQUIPMENT_HEX_ 0x1132U // Toshiba Corp., Digital Media Equipment [hex] +#define UHS_VID_CTS_ELECTRONINCS 0x1136U // CTS Electronincs +#define UHS_VID_ARIN_TECH 0x113cU // Arin Tech Co., Ltd +#define UHS_VID_MAPOWER_ELECTRONICS 0x113dU // Mapower Electronics Co., Ltd +#define UHS_VID_V_ONE_MULTIMEDIA_PTE 0x1141U // V One Multimedia, Pte., Ltd +#define UHS_VID_CYBERSCAN_TECHNOLOGIES 0x1142U // CyberScan Technologies, Inc. +#define UHS_VID_JAPAN_RADIO_COMPANY 0x1145U // Japan Radio Company +#define UHS_VID_SHIMANE_SANYO_ELECTRIC 0x1146U // Shimane SANYO Electric Co., Ltd. +#define UHS_VID_EVER_GREAT_ELECTRIC_WIRE_AND_CABLE 0x1147U // Ever Great Electric Wire and Cable Co., Ltd +#define UHS_VID_SPHAIRON_ACCESS_SYSTEMS 0x114bU // Sphairon Access Systems GmbH +#define UHS_VID_TINIUS_OLSEN_TESTING_MACHINE 0x114cU // Tinius Olsen Testing Machine Co., Inc. +#define UHS_VID_ALPHA_IMAGING_TECHNOLOGY 0x114dU // Alpha Imaging Technology Corp. +#define UHS_VID_WAVECOM 0x114fU // Wavecom +#define UHS_VID_SALIX_TECHNOLOGY 0x115bU // Salix Technology Co., Ltd. +#define UHS_VID_SECUGEN 0x1162U // Secugen Corp. +#define UHS_VID_DELORME_PUBLISHING 0x1163U // DeLorme Publishing, Inc. +#define UHS_VID_YUAN_HIGH_TECH_DEVELOPMENT 0x1164U // YUAN High-Tech Development Co., Ltd +#define UHS_VID_TELSON_ELECTRONICS 0x1165U // Telson Electronics Co., Ltd +#define UHS_VID_BANTAM_INTERACTIVE_TECHNOLOGIES 0x1166U // Bantam Interactive Technologies +#define UHS_VID_SALIENT_SYSTEMS 0x1167U // Salient Systems Corp. +#define UHS_VID_BIZCONN_INTERNATIONAL 0x1168U // BizConn International Corp. +#define UHS_VID_GIGASTORAGE 0x116eU // Gigastorage Corp. +#define UHS_VID_SILICON_10_TECHNOLOGY 0x116fU // Silicon 10 Technology Corp. +#define UHS_VID_SHENGYIH_STEEL_MOLD 0x1175U // Shengyih Steel Mold Co., Ltd +#define UHS_VID_SANTA_ELECTRONIC 0x117dU // Santa Electronic, Inc. +#define UHS_VID_JNC 0x117eU // JNC, Inc. +#define UHS_VID_VENTURE 0x1182U // Venture Corp., Ltd +#define UHS_VID_COMPAQ_COMPUTER_CORP_HEX_DIGITAL_DREAM_UNKNOWN 0x1183U // Compaq Computer Corp. [hex] (Digital Dream ?) +#define UHS_VID_KYOCERA_ELCO 0x1184U // Kyocera Elco Corp. +#define UHS_VID_BLOOMBERG_LP 0x1188U // Bloomberg L.P. +#define UHS_VID_ACER_COMMUNICATIONS_AND_MULTIMEDIA 0x1189U // Acer Communications & Multimedia +#define UHS_VID_YOU_YANG_TECHNOLOGY 0x118fU // You Yang Technology Co., Ltd +#define UHS_VID_TRIPACE 0x1190U // Tripace +#define UHS_VID_LOYALTY_FOUNDER_ENTERPRISE 0x1191U // Loyalty Founder Enterprise Co., Ltd +#define UHS_VID_YANKEE_ROBOTICS 0x1196U // Yankee Robotics, LLC +#define UHS_VID_TECHNOIMAGIA 0x1197U // Technoimagia Co., Ltd +#define UHS_VID_STARSHINE_TECHNOLOGY 0x1198U // StarShine Technology Corp. +#define UHS_VID_SIERRA_WIRELESS 0x1199U // Sierra Wireless, Inc. +#define UHS_VID_ZHAN_QI_TECHNOLOGY 0x119aU // ZHAN QI Technology Co., Ltd +#define UHS_VID_RUWIDO_AUSTRIA 0x119bU // ruwido austria GmbH +#define UHS_VID_CHIPCON_AS 0x11a0U // Chipcon AS +#define UHS_VID_TECHNOVAS 0x11a3U // Technovas Co., Ltd +#define UHS_VID_GLOBALMEDIA_GROUP 0x11aaU // GlobalMedia Group, LLC +#define UHS_VID_EXITO_ELECTRONICS 0x11abU // Exito Electronics Co., Ltd +#define UHS_VID_NIKE 0x11acU // Nike +#define UHS_VID_ATECH_FLASH_TECHNOLOGY 0x11b0U // ATECH FLASH TECHNOLOGY +#define UHS_VID_RANDD_INTERNATIONAL_NV 0x11beU // R&D International NV +#define UHS_VID_INMAX 0x11c5U // Inmax +#define UHS_VID_VERIFONE 0x11caU // VeriFone Inc +#define UHS_VID_TOPFIELD 0x11dbU // Topfield Co., Ltd. +#define UHS_VID_KI_TECHNOLOGY 0x11e6U // K.I. Technology Co. Ltd. +#define UHS_VID_SIEMENS_AG_1 0x11f5U // Siemens AG +#define UHS_VID_PROLIFIC 0x11f6U // Prolific +#define UHS_VID_ALCATEL_UNKNOWN 0x11f7U // Alcatel (?) +#define UHS_VID_TSC_AUTO_ID_TECHNOLOGY 0x1203U // TSC Auto ID Technology Co., Ltd +#define UHS_VID_INTERBIOMETRICS 0x1209U // InterBiometrics +#define UHS_VID_HUDSON_SOFT 0x120eU // Hudson Soft Co., Ltd +#define UHS_VID_MAGELLAN 0x120fU // Magellan +#define UHS_VID_DIGITECH 0x1210U // DigiTech +#define UHS_VID_JUNGSOFT 0x121eU // Jungsoft Co., Ltd +#define UHS_VID_UNKNOWN_MANUFACTURER_1 0x1221U // Unknown manufacturer +#define UHS_VID_SKYCABLE_ENTERPRISE 0x1223U // SKYCABLE ENTERPRISE. CO., LTD. +#define UHS_VID_DATAPAQ_LIMITED 0x1228U // Datapaq Limited +#define UHS_VID_CHIPIDEA_MICROELECTRONICA 0x1230U // Chipidea-Microelectronica, S.A. +#define UHS_VID_DENVER_ELECTRONICS 0x1233U // Denver Electronics +#define UHS_VID_BRAIN_ACTUATED_TECHNOLOGIES 0x1234U // Brain Actuated Technologies +#define UHS_VID_FOCUSRITE_NOVATION 0x1235U // Focusrite-Novation +#define UHS_VID_BELKIN 0x1241U // Belkin +#define UHS_VID_AIRVAST 0x124aU // AirVast +#define UHS_VID_NYKO_HONEY_BEE 0x124bU // Nyko (Honey Bee) +#define UHS_VID_MXI__MEMORY_EXPERTS_INTERNATIONAL 0x124cU // MXI - Memory Experts International, Inc. +#define UHS_VID_APOGEE 0x125cU // Apogee Inc. +#define UHS_VID_A_DATA_TECHNOLOGY 0x125fU // A-DATA Technology Co., Ltd. +#define UHS_VID_STANDARD_MICROSYSTEMS_3 0x1260U // Standard Microsystems Corp. +#define UHS_VID_COVIDIEN_ENERGY_BASED_DEVICES 0x1264U // Covidien Energy-based Devices +#define UHS_VID_PIRELLI_BROADBAND_SOLUTIONS 0x1266U // Pirelli Broadband Solutions +#define UHS_VID_LOGIC3_SPECTRAVIDEO_PLC 0x1267U // Logic3 / SpectraVideo plc +#define UHS_VID_ARISTOCRAT_TECHNOLOGIES 0x126cU // Aristocrat Technologies +#define UHS_VID_BEL_STEWART 0x126dU // Bel Stewart +#define UHS_VID_STROBE_DATA 0x126eU // Strobe Data, Inc. +#define UHS_VID_TWINMOS 0x126fU // TwinMOS +#define UHS_VID_ENSONIQ 0x1274U // Ensoniq +#define UHS_VID_XAXERO_MARINE_SOFTWARE_ENGINEERING 0x1275U // Xaxero Marine Software Engineering, Ltd. +#define UHS_VID_STARLIGHT_XPRESS 0x1278U // Starlight Xpress +#define UHS_VID_ZEBRIS_MEDICAL 0x1283U // zebris Medical GmbH +#define UHS_VID_MARVELL_SEMICONDUCTOR 0x1286U // Marvell Semiconductor, Inc. +#define UHS_VID_QUALCOMM_FLARION_TECHNOLOGIES_INC_LEADTEK_RESEARCH 0x1291U // Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc. +#define UHS_VID_INNOMEDIA_1 0x1292U // Innomedia +#define UHS_VID_BELKIN_COMPONENTS_HEX_ 0x1293U // Belkin Components [hex] +#define UHS_VID_RISO_KAGAKU 0x1294U // RISO KAGAKU CORP. +#define UHS_VID_CYBERTAN_TECHNOLOGY 0x129bU // CyberTAN Technology +#define UHS_VID_TRENDCHIP_TECHNOLOGIES 0x12a7U // Trendchip Technologies Corp. +#define UHS_VID_HONEY_BEE_ELECTRONIC_INTERNATIONAL 0x12abU // Honey Bee Electronic International Ltd. +#define UHS_VID_ZHEJIANG_XINYA_ELECTRONIC_TECHNOLOGY 0x12b8U // Zhejiang Xinya Electronic Technology Co., Ltd. +#define UHS_VID_E28 0x12b9U // E28 +#define UHS_VID_LICENSED_BY_SONY_COMPUTER_ENTERTAINMENT_AMERICA 0x12baU // Licensed by Sony Computer Entertainment America +#define UHS_VID_GEMBIRD 0x12bdU // Gembird +#define UHS_VID_AUTOCUE_GROUP 0x12c4U // Autocue Group Ltd +#define UHS_VID_DEXIN_1 0x12cfU // DEXIN +#define UHS_VID_HUAWEI_TECHNOLOGIES 0x12d1U // Huawei Technologies Co., Ltd. +#define UHS_VID_LINE_TECH_INDUSTRIAL 0x12d2U // LINE TECH INDUSTRIAL CO., LTD. +#define UHS_VID_EMS_DR_THOMAS_WUENSCHE 0x12d6U // EMS Dr. Thomas Wuensche +#define UHS_VID_BETTER_WIRE_FACTORY 0x12d7U // BETTER WIRE FACTORY CO., LTD. +#define UHS_VID_ARANEUS_INFORMATION_SYSTEMS_OY 0x12d8U // Araneus Information Systems Oy +#define UHS_VID_WALDORF_MUSIC 0x12e6U // Waldorf Music GmbH +#define UHS_VID_TAPWAVE 0x12efU // Tapwave, Inc. +#define UHS_VID_DYNAMIC_SYSTEM_ELECTRONICS 0x12f5U // Dynamic System Electronics Corp. +#define UHS_VID_MEMOREX_PRODUCTS 0x12f7U // Memorex Products, Inc. +#define UHS_VID_AIN_COMM_TECHNOLOGY 0x12fdU // AIN Comm. Technology Co., Ltd +#define UHS_VID_FASCINATING_ELECTRONICS 0x12ffU // Fascinating Electronics, Inc. +#define UHS_VID_TRANSCEND_INFORMATION 0x1307U // Transcend Information, Inc. +#define UHS_VID_SHUTTLE_1 0x1308U // Shuttle, Inc. +#define UHS_VID_ROPER 0x1310U // Roper +#define UHS_VID_ICS_ELECTRONICS 0x1312U // ICS Electronics +#define UHS_VID_THORLABS 0x1313U // ThorLabs +#define UHS_VID_NATURAL_POINT 0x131dU // Natural Point +#define UHS_VID_ENVARA 0x132aU // Envara Inc. +#define UHS_VID_KONICA_MINOLTA 0x132bU // Konica Minolta +#define UHS_VID_KEMPER_DIGITAL 0x133eU // Kemper Digital GmbH +#define UHS_VID_MOBILITY 0x1342U // Mobility +#define UHS_VID_CITIZEN_SYSTEMS 0x1343U // Citizen Systems +#define UHS_VID_SINO_LITE_TECHNOLOGY 0x1345U // Sino Lite Technology Corp. +#define UHS_VID_MORAVIAN_INSTRUMENTS 0x1347U // Moravian Instruments +#define UHS_VID_KATSURAGAWA_ELECTRIC 0x1348U // Katsuragawa Electric Co., Ltd. +#define UHS_VID_PANJIT_INTERNATIONAL 0x134cU // PanJit International Inc. +#define UHS_VID_DIGBYS_BITPILE_INC_DBA_D_BIT 0x134eU // Digby's Bitpile, Inc. DBA D Bit +#define UHS_VID_PANDE_MICROCOMPUTER_SYSTEMS 0x1357U // P&E Microcomputer Systems +#define UHS_VID_CONTROL_DEVELOPMENT 0x135fU // Control Development Inc. +#define UHS_VID_SEGGER 0x1366U // SEGGER +#define UHS_VID_STEC 0x136bU // STEC +#define UHS_VID_ANDOR_TECHNOLOGY 0x136eU // Andor Technology Ltd. +#define UHS_VID_SWISSBIT 0x1370U // Swissbit +#define UHS_VID_CNET_TECHNOLOGY 0x1371U // CNet Technology Inc. +#define UHS_VID_VIMTRON_ELECTRONICS 0x1376U // Vimtron Electronics Co., Ltd. +#define UHS_VID_SCAPS 0x137bU // SCAPS GmbH +#define UHS_VID_NETGEAR_2 0x1385U // Netgear, Inc +#define UHS_VID_VALIDITY_SENSORS 0x138aU // Validity Sensors, Inc. +#define UHS_VID_JUNGO 0x138eU // Jungo LTD +#define UHS_VID_TOMTOM_BV 0x1390U // TOMTOM B.V. +#define UHS_VID_IDEALTEK 0x1391U // IdealTEK, Inc. +#define UHS_VID_SENNHEISER_COMMUNICATIONS 0x1395U // Sennheiser Communications +#define UHS_VID_BEHRINGER_INTERNATIONAL 0x1397U // BEHRINGER International GmbH +#define UHS_VID_Q_TEC 0x1398U // Q-tec +#define UHS_VID_BALTECH 0x13adU // Baltech +#define UHS_VID_PERKINELMER_OPTOELECTRONICS 0x13b0U // PerkinElmer Optoelectronics +#define UHS_VID_LINKSYS_2 0x13b1U // Linksys +#define UHS_VID_ALESIS 0x13b2U // Alesis +#define UHS_VID_NIPPON_DICS 0x13b3U // Nippon Dics Co., Ltd. +#define UHS_VID_PCPLAY 0x13baU // PCPlay +#define UHS_VID_RICOH_PRINTING_SYSTEMS 0x13beU // Ricoh Printing Systems, Ltd. +#define UHS_VID_JYETAI_PRECISION_INDUSTRIAL 0x13caU // JyeTai Precision Industrial Co., Ltd. +#define UHS_VID_WISAIR 0x13cfU // Wisair Ltd. +#define UHS_VID_TECHSAN_ELECTRONICS 0x13d0U // Techsan Electronics Co., Ltd. +#define UHS_VID_A_MAX_TECHNOLOGY_MACAO_COMMERCIAL_OFFSHORE 0x13d1U // A-Max Technology Macao Commercial Offshore Co. Ltd. +#define UHS_VID_SHARK_MULTIMEDIA_1 0x13d2U // Shark Multimedia +#define UHS_VID_IMC_NETWORKS 0x13d3U // IMC Networks +#define UHS_VID_GUIDANCE_SOFTWARE 0x13d7U // Guidance Software, Inc. +#define UHS_VID_ALEREON 0x13dcU // ALEREON, INC. +#define UHS_VID_ITECH_DYNAMIC_LIMITED 0x13ddU // i.Tech Dynamic Limited +#define UHS_VID_KAIBO_WIRE_AND_CABLE_SHENZHEN 0x13e1U // Kaibo Wire & Cable (Shenzhen) Co., Ltd. +#define UHS_VID_RANE 0x13e5U // Rane +#define UHS_VID_TECHNOSCOPE 0x13e6U // TechnoScope Co., Ltd. +#define UHS_VID_HENGSTLER 0x13eaU // Hengstler +#define UHS_VID_ZYDACRON 0x13ecU // Zydacron +#define UHS_VID_MOSART 0x13eeU // MosArt +#define UHS_VID_INITIO_CORPORATION 0x13fdU // Initio Corporation +#define UHS_VID_KINGSTON_TECHNOLOGY_COMPANY_1 0x13feU // Kingston Technology Company Inc. +#define UHS_VID_AXXION_GROUP 0x1400U // Axxion Group Corp. +#define UHS_VID_BOWE_BELL_AND_HOWELL 0x1402U // Bowe Bell & Howell +#define UHS_VID_SITRONIX 0x1403U // Sitronix +#define UHS_VID_IDS_IMAGING_DEVELOPMENT_SYSTEMS 0x1409U // IDS Imaging Development Systems GmbH +#define UHS_VID_TELECHIPS 0x140eU // Telechips, Inc. +#define UHS_VID_NOVATEL_WIRELESS_1 0x1410U // Novatel Wireless +#define UHS_VID_NAM_TAI_EANDE_PRODUCTS_LTD_OR_OMNIVISION_TECHNOLOGIES 0x1415U // Nam Tai E&E Products Ltd. or OmniVision Technologies, Inc. +#define UHS_VID_ABILITY_ENTERPRISE 0x1419U // ABILITY ENTERPRISE CO., LTD. +#define UHS_VID_SENSOR_TECHNOLOGY 0x1421U // Sensor Technology +#define UHS_VID_VEGA_TECHNOLOGIES_INDUSTRIAL_AUSTRIA 0x1429U // Vega Technologies Industrial (Austria) Co. +#define UHS_VID_THALES_E_TRANSACTIONS 0x142aU // Thales E-Transactions +#define UHS_VID_ARBITER_SYSTEMS 0x142bU // Arbiter Systems, Inc. +#define UHS_VID_REDOCTANE 0x1430U // RedOctane +#define UHS_VID_PERTECH_RESOURCES 0x1431U // Pertech Resources, Inc. +#define UHS_VID_WISTRON_NEWEB 0x1435U // Wistron NeWeb +#define UHS_VID_DENALI_SOFTWARE 0x1436U // Denali Software, Inc. +#define UHS_VID_ALTEK_CORPORATION 0x143cU // Altek Corporation +#define UHS_VID_DIGILENT 0x1443U // Digilent +#define UHS_VID_XJGROUP 0x1446U // X.J.GROUP +#define UHS_VID_RADIO_SHACK 0x1453U // Radio Shack +#define UHS_VID_EXTENDING_WIRE_AND_CABLE 0x1456U // Extending Wire & Cable Co., Ltd. +#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER_1 0x1457U // First International Computer, Inc. +#define UHS_VID_TRUST 0x145fU // Trust +#define UHS_VID_TATUNG 0x1460U // Tatung Co. +#define UHS_VID_STACCATO_COMMUNICATIONS 0x1461U // Staccato Communications +#define UHS_VID_MICRO_STAR_INTERNATIONAL_1 0x1462U // Micro Star International +#define UHS_VID_HUAWEI_3COM 0x1472U // Huawei-3Com +#define UHS_VID_FORMOSA_INDUSTRIAL_COMPUTING 0x147aU // Formosa Industrial Computing, Inc. +#define UHS_VID_UPEK 0x147eU // Upek +#define UHS_VID_HAMA_GMBH_AND_CO_KG 0x147fU // Hama GmbH & Co., KG +#define UHS_VID_VAILLANT 0x1482U // Vaillant +#define UHS_VID_ELSA_AG_HEX_ 0x1484U // Elsa AG [hex] +#define UHS_VID_SILICOM_1 0x1485U // Silicom +#define UHS_VID_DSP_GROUP 0x1487U // DSP Group, Ltd. +#define UHS_VID_EVATRONIX 0x148eU // EVATRONIX SA +#define UHS_VID_RALINK_TECHNOLOGY 0x148fU // Ralink Technology, Corp. +#define UHS_VID_FUTRONIC_TECHNOLOGY 0x1491U // Futronic Technology Co. Ltd. +#define UHS_VID_SUUNTO 0x1493U // Suunto +#define UHS_VID_PANSTRONG_COMPANY 0x1497U // Panstrong Company Ltd. +#define UHS_VID_MICROTEK_INTERNATIONAL_1 0x1498U // Microtek International Inc. +#define UHS_VID_IMAGINATION_TECHNOLOGIES 0x149aU // Imagination Technologies +#define UHS_VID_WIDEVIEW_TECHNOLOGY 0x14aaU // WideView Technology Inc. +#define UHS_VID_CTK_CORPORATION 0x14adU // CTK Corporation +#define UHS_VID_PRINTRONIX 0x14aeU // Printronix Inc. +#define UHS_VID_ATP_ELECTRONICS 0x14afU // ATP Electronics Inc. +#define UHS_VID_STARTECHCOM 0x14b0U // StarTech.com Ltd. +#define UHS_VID_RALINK_TECHNOLOGY_1 0x14b2U // Ralink Technology, Corp. +#define UHS_VID_ROCKWELL_AUTOMATION 0x14c0U // Rockwell Automation, Inc. +#define UHS_VID_GEMLIGHT_COMPUTER 0x14c2U // Gemlight Computer, Ltd +#define UHS_VID_ZYTRONIC 0x14c8U // Zytronic +#define UHS_VID_SUPER_TOP 0x14cdU // Super Top +#define UHS_VID_JAMER_INDUSTRIES 0x14d8U // JAMER INDUSTRIES CO., LTD. +#define UHS_VID_RARITAN_COMPUTER 0x14ddU // Raritan Computer, Inc. +#define UHS_VID_WINRADIO_COMMUNICATIONS 0x14e0U // WiNRADiO Communications +#define UHS_VID_DIALOGUE_TECHNOLOGY 0x14e1U // Dialogue Technology Corp. +#define UHS_VID_SAIN_INFORMATION_AND_COMMUNICATIONS 0x14e5U // SAIN Information & Communications Co., Ltd. +#define UHS_VID_PLANEX_COMMUNICATIONS_1 0x14eaU // Planex Communications +#define UHS_VID_SHURE 0x14edU // Shure Inc. +#define UHS_VID_TECHNISAT_DIGITAL 0x14f7U // TechniSat Digital GmbH +#define UHS_VID_ELLISYS_1 0x1500U // Ellisys +#define UHS_VID_PINE_TUM_ENTERPRISE 0x1501U // Pine-Tum Enterprise Co., Ltd. +#define UHS_VID_FIRST_INTERNATIONAL_COMPUTER_2 0x1509U // First International Computer, Inc. +#define UHS_VID_MEDMOBILE 0x1513U // medMobile +#define UHS_VID_ACTEL 0x1514U // Actel +#define UHS_VID_COMPUSA 0x1516U // CompUSA +#define UHS_VID_CHESHIRE_ENGINEERING 0x1518U // Cheshire Engineering Corp. +#define UHS_VID_COMNEON 0x1519U // Comneon +#define UHS_VID_BITWIRE 0x1520U // Bitwire Corp. +#define UHS_VID_ENE_TECHNOLOGY_1 0x1524U // ENE Technology Inc +#define UHS_VID_SILICON_PORTALS 0x1527U // Silicon Portals +#define UHS_VID_UBIQUAM 0x1529U // UBIQUAM Co., Ltd. +#define UHS_VID_THESYCON_SYSTEMSOFTWARE_AND_CONSULTING 0x152aU // Thesycon Systemsoftware & Consulting GmbH +#define UHS_VID_MIR_SRL 0x152bU // MIR Srl +#define UHS_VID_JMICRON_TECHNOLOGY_CORP_JMICRON_USA_TECHNOLOGY 0x152dU // JMicron Technology Corp. / JMicron USA Technology Corp. +#define UHS_VID_LG_HLDS 0x152eU // LG (HLDS) +#define UHS_VID_RAZER_USA 0x1532U // Razer USA, Ltd +#define UHS_VID_TERRATEC_ELECTRONIC_1 0x153bU // TerraTec Electronic GmbH +#define UHS_VID_U_BLOX_AG 0x1546U // U-Blox AG +#define UHS_VID_SG_INTEC_LTD_AND_CO_KG 0x1547U // SG Intec Ltd & Co KG +#define UHS_VID_CELECTRONIC 0x154aU // Celectronic GmbH +#define UHS_VID_PNY 0x154bU // PNY +#define UHS_VID_CONNECTCOUNTY_HOLDINGS_BERHAD 0x154dU // ConnectCounty Holdings Berhad +#define UHS_VID_DANDM_HOLDINGS_INC_DENONMARANTZ 0x154eU // D&M Holdings, Inc. (Denon/Marantz) +#define UHS_VID_SNBC 0x154fU // SNBC CO., Ltd +#define UHS_VID_PROLINK_MICROSYSTEMS 0x1554U // Prolink Microsystems Corp. +#define UHS_VID_OQO 0x1557U // OQO +#define UHS_VID_SUNF_PU_TECHNOLOGY 0x1568U // Sunf Pu Technology Co., Ltd +#define UHS_VID_QUANTUM_CORPORATION 0x156fU // Quantum Corporation +#define UHS_VID_ALLTOP_TECHNOLOGY 0x1570U // ALLTOP TECHNOLOGY CO., LTD. +#define UHS_VID_KETRON_SRL 0x157bU // Ketron SRL +#define UHS_VID_TRENDNET 0x157eU // TRENDnet +#define UHS_VID_FIBERLINE 0x1582U // Fiberline +#define UHS_VID_SMA_TECHNOLOGIE_AG 0x1587U // SMA Technologie AG +#define UHS_VID_OAKLEY 0x158dU // Oakley Inc. +#define UHS_VID_JDS_UNIPHASE_CORPORATION_JDSU 0x158eU // JDS Uniphase Corporation (JDSU) +#define UHS_VID_KUNSHAN_GUOJI_ELECTRONICS 0x1598U // Kunshan Guoji Electronics Co., Ltd. +#define UHS_VID_FREESCALE_SEMICONDUCTOR 0x15a2U // Freescale Semiconductor, Inc. +#define UHS_VID_AFATECH_TECHNOLOGIES 0x15a4U // Afatech Technologies, Inc. +#define UHS_VID_TEAMS_POWER_LIMITED 0x15a8U // Teams Power Limited +#define UHS_VID_GEMTEK 0x15a9U // Gemtek +#define UHS_VID_GEARWAY_ELECTRONICS_DONG_GUAN 0x15aaU // Gearway Electronics (Dong Guan) Co., Ltd. +#define UHS_VID_VMWARE_1 0x15adU // VMware Inc. +#define UHS_VID_OLIMEX 0x15baU // Olimex Ltd. +#define UHS_VID_XL_IMAGING 0x15c0U // XL Imaging +#define UHS_VID_SOUNDGRAPH 0x15c2U // SoundGraph Inc. +#define UHS_VID_ADVANCE_MULTIMEDIA_INTERNET_TECHNOLOGY_INC_AMIT 0x15c5U // Advance Multimedia Internet Technology Inc. (AMIT) +#define UHS_VID_LABORATOIRES_MXM 0x15c6U // Laboratoires MXM +#define UHS_VID_KTF_TECHNOLOGIES 0x15c8U // KTF Technologies +#define UHS_VID_D_BOX_TECHNOLOGIES 0x15c9U // D-Box Technologies +#define UHS_VID_TEXTECH_INTERNATIONAL 0x15caU // Textech International Ltd. +#define UHS_VID_COULOMB_ELECTRONICS 0x15d5U // Coulomb Electronics Ltd. +#define UHS_VID_TRUST_INTERNATIONAL_BV_1 0x15d9U // Trust International B.V. +#define UHS_VID_HYNIX_SEMICONDUCTOR 0x15dcU // Hynix Semiconductor Inc. +#define UHS_VID_SEONG_JI_INDUSTRIAL 0x15e0U // Seong Ji Industrial Co., Ltd. +#define UHS_VID_RSA 0x15e1U // RSA +#define UHS_VID_NUMARK 0x15e4U // Numark +#define UHS_VID_SOHOWARE 0x15e8U // SohoWare +#define UHS_VID_PACIFIC_DIGITAL 0x15e9U // Pacific Digital Corp. +#define UHS_VID_BELCARRA_TECHNOLOGIES 0x15ecU // Belcarra Technologies Corp. +#define UHS_VID_HANFTEK 0x15f4U // HanfTek +#define UHS_VID_TASCAM 0x1604U // Tascam +#define UHS_VID_UMAX_1 0x1606U // Umax +#define UHS_VID_INSIDE_OUT_NETWORKS_HEX_ 0x1608U // Inside Out Networks [hex] +#define UHS_VID_VIA_TECHNOLOGIES_1 0x160aU // VIA Technologies, Inc. +#define UHS_VID_INRO 0x160eU // INRO +#define UHS_VID_AMOI_ELECTRONICS 0x1614U // Amoi Electronics +#define UHS_VID_SONY_1 0x1617U // Sony Corp. +#define UHS_VID_L_AND_K_PRECISION_TECHNOLOGY 0x1619U // L & K Precision Technology Co., Ltd. +#define UHS_VID_WIONICS_RESEARCH 0x1621U // Wionics Research +#define UHS_VID_STONESTREET_ONE 0x1628U // Stonestreet One, Inc. +#define UHS_VID_AIRGO_NETWORKS 0x162aU // Airgo Networks Inc. +#define UHS_VID_WIQUEST_COMMUNICATIONS 0x162fU // WiQuest Communications, Inc. +#define UHS_VID_2WIRE_1 0x1630U // 2Wire, Inc. +#define UHS_VID_GOOD_WAY_TECHNOLOGY 0x1631U // Good Way Technology +#define UHS_VID_ENTREGA_HEX_ 0x1645U // Entrega [hex] +#define UHS_VID_SOFTEC_MICROSYSTEMS 0x1649U // SofTec Microsystems +#define UHS_VID_CHIPX 0x164aU // ChipX +#define UHS_VID_MATRIX_VISION 0x164cU // Matrix Vision GmbH +#define UHS_VID_STRUCK_INNOVATIVE_SYSTEME 0x1657U // Struck Innovative Systeme GmbH +#define UHS_VID_FRONTIER_DESIGN_GROUP 0x165bU // Frontier Design Group +#define UHS_VID_KONDO_KAGAKU 0x165cU // Kondo Kagaku +#define UHS_VID_CREATIX_POLYMEDIA 0x1660U // Creatix Polymedia GmbH +#define UHS_VID_GIGA_TMS 0x1667U // GIGA-TMS INC. +#define UHS_VID_ACTIONTEC_ELECTRONICS_INC_HEX_ 0x1668U // Actiontec Electronics, Inc. [hex] +#define UHS_VID_PIKRON_LTD_HEX_ 0x1669U // PiKRON Ltd. [hex] +#define UHS_VID_CLIPSAL 0x166aU // Clipsal +#define UHS_VID_CHINA_HUADA_INTEGRATED_CIRCUIT_DESIGN_GROUP_CO_LTD_CIDC_GROUP 0x1677U // China Huada Integrated Circuit Design (Group) Co., Ltd. (CIDC Group) +#define UHS_VID_TOTAL_PHASE 0x1679U // Total Phase +#define UHS_VID_GOLDEN_BRIDGE_ELECTECH_1 0x1680U // Golden Bridge Electech Inc. +#define UHS_VID_PREVO_TECHNOLOGIES 0x1681U // Prevo Technologies, Inc. +#define UHS_VID_MAXWISE_PRODUCTION_ENTERPRISE 0x1682U // Maxwise Production Enterprise Ltd. +#define UHS_VID_GODSPEED_COMPUTER 0x1684U // Godspeed Computer Corp. +#define UHS_VID_DELOCK 0x1685U // Delock +#define UHS_VID_ZOOM_CORPORATION 0x1686U // ZOOM Corporation +#define UHS_VID_KINGMAX_DIGITAL 0x1687U // Kingmax Digital Inc. +#define UHS_VID_SAAB 0x1688U // Saab AB +#define UHS_VID_RAZER_USA_1 0x1689U // Razer USA, Ltd +#define UHS_VID_ATHEROS_COMMUNICATIONS_1 0x168cU // Atheros Communications +#define UHS_VID_ASKEY_COMPUTER_CORP_HEX_ 0x1690U // Askey Computer Corp. [hex] +#define UHS_VID_HITACHI_VIDEO_AND_INFORMATION_SYSTEM 0x1696U // Hitachi Video and Information System, Inc. +#define UHS_VID_VTEC_TEST 0x1697U // VTec Test, Inc. +#define UHS_VID_SHENZHEN_ZHENGERYA_CABLE 0x16a5U // Shenzhen Zhengerya Cable Co., Ltd. +#define UHS_VID_UNIGRAF 0x16a6U // Unigraf +#define UHS_VID_GLOBAL_SUN_TECHNOLOGY_1 0x16abU // Global Sun Technology +#define UHS_VID_DONGGUAN_CHINGLUNG_WIRE_AND_CABLE 0x16acU // Dongguan ChingLung Wire & Cable Co., Ltd. +#define UHS_VID_ISTATION 0x16b4U // iStation +#define UHS_VID_PERSENTEC 0x16b5U // Persentec, Inc. +#define UHS_VID_VAN_OOIJEN_TECHNISCHE_INFORMATICA 0x16c0U // Van Ooijen Technische Informatica +#define UHS_VID_WIRELESS_CABLES 0x16caU // Wireless Cables, Inc. +#define UHS_VID_SILEX_TECHNOLOGY 0x16ccU // silex technology, Inc. +#define UHS_VID_MCS 0x16d0U // MCS +#define UHS_VID_SUPREMA 0x16d1U // Suprema Inc. +#define UHS_VID_FRONTLINE_TEST_EQUIPMENT 0x16d3U // Frontline Test Equipment, Inc. +#define UHS_VID_ANYDATA_CORPORATION 0x16d5U // AnyDATA Corporation +#define UHS_VID_JABLOCOM_SRO 0x16d6U // JABLOCOM s.r.o. +#define UHS_VID_CMOTECH 0x16d8U // CMOTECH Co., Ltd. +#define UHS_VID_WIENER_PLEIN_AND_BAUS 0x16dcU // Wiener, Plein & Baus +#define UHS_VID_KING_BILLION_ELECTRONICS 0x16dfU // King Billion Electronics Co., Ltd. +#define UHS_VID_GN_RESOUND_AS 0x16f0U // GN ReSound A/S +#define UHS_VID_FUTURELOGIC 0x16f5U // Futurelogic Inc. +#define UHS_VID_BLUEVIEW_TECHNOLOGIES 0x1706U // BlueView Technologies, Inc. +#define UHS_VID_ARTIMI 0x1707U // ARTIMI +#define UHS_VID_SWISSONIC 0x170bU // Swissonic +#define UHS_VID_AVNERA 0x170dU // Avnera +#define UHS_VID_LEICA_MICROSYSTEMS 0x1711U // Leica Microsystems +#define UHS_VID_MEYER_INSTRUMENTS_MIS 0x1724U // Meyer Instruments (MIS) +#define UHS_VID_VITESSE_SEMICONDUCTOR 0x1725U // Vitesse Semiconductor +#define UHS_VID_AXESSTEL 0x1726U // Axesstel, Inc. +#define UHS_VID_WALTOP_INTERNATIONAL 0x172fU // Waltop International Corp. +#define UHS_VID_CELLINK_TECHNOLOGY 0x1733U // Cellink Technology Co., Ltd +#define UHS_VID_CANON_IMAGING_SYSTEM_TECHNOLOGIES 0x1736U // CANON IMAGING SYSTEM TECHNOLOGIES INC. +#define UHS_VID_LINKSYS_3 0x1737U // Linksys +#define UHS_VID_QSENN 0x173dU // QSENN +#define UHS_VID_SENAO 0x1740U // Senao +#define UHS_VID_GENERAL_ATOMICS 0x1743U // General Atomics +#define UHS_VID_MQP_ELECTRONICS 0x1748U // MQP Electronics +#define UHS_VID_ASMEDIA_TECHNOLOGY 0x174cU // ASMedia Technology Inc. +#define UHS_VID_SYNTEK 0x174fU // Syntek +#define UHS_VID_GERTEC_TELECOMUNICACOES_LTDA 0x1753U // GERTEC Telecomunicacoes Ltda. +#define UHS_VID_ENENSYS_TECHNOLOGIES 0x1756U // ENENSYS Technologies +#define UHS_VID_LUCIDPORT_TECHNOLOGY 0x1759U // LucidPort Technology, Inc. +#define UHS_VID_ASUSTEK_COMPUTER_INC_WRONG_ID 0x1761U // ASUSTek Computer, Inc. (wrong ID) +#define UHS_VID_SYSTEM_LEVEL_SOLUTIONS 0x1772U // System Level Solutions, Inc. +#define UHS_VID_AROWANA 0x1776U // Arowana +#define UHS_VID_SWEEX 0x177fU // Sweex +#define UHS_VID_MULTIPLE_VENDORS 0x1781U // Multiple Vendors +#define UHS_VID_SPREADTRUM_COMMUNICATIONS 0x1782U // Spreadtrum Communications Inc. +#define UHS_VID_TOPSEED_TECHNOLOGY 0x1784U // TopSeed Technology Corp. +#define UHS_VID_ATI_AIB 0x1787U // ATI AIB +#define UHS_VID_SHENZHEN_LITKCONN_TECHNOLOGY 0x1788U // ShenZhen Litkconn Technology Co., Ltd. +#define UHS_VID_PRINTREX 0x1796U // Printrex, Inc. +#define UHS_VID_JALCO 0x1797U // JALCO CO., LTD. +#define UHS_VID_THALES_NORWAY_AS 0x1799U // Thales Norway A/S +#define UHS_VID_RICAVISION_INTERNATIONAL 0x179dU // Ricavision International, Inc. +#define UHS_VID_SAMSON_TECHNOLOGIES 0x17a0U // Samson Technologies Corp. +#define UHS_VID_CONCEPT2 0x17a4U // Concept2 +#define UHS_VID_ADVANCED_CONNECTION_TECHNOLOGY 0x17a5U // Advanced Connection Technology Inc. +#define UHS_VID_MICOMSOFT 0x17a7U // MICOMSOFT CO., LTD. +#define UHS_VID_KAMSTRUP_AS 0x17a8U // Kamstrup A/S +#define UHS_VID_GREY_INNOVATION 0x17b3U // Grey Innovation +#define UHS_VID_LUNATONE 0x17b5U // Lunatone +#define UHS_VID_SAURIS 0x17baU // SAURIS GmbH +#define UHS_VID_SINGIM_INTERNATIONAL 0x17c3U // Singim International Corp. +#define UHS_VID_NATIVE_INSTRUMENTS 0x17ccU // Native Instruments +#define UHS_VID_HIP_HING_CABLE_AND_PLUG_MFY 0x17cfU // Hip Hing Cable & Plug Mfy. Ltd. +#define UHS_VID_SANFORD_LP 0x17d0U // Sanford L.P. +#define UHS_VID_KOREA_TECHTRON 0x17d3U // Korea Techtron Co., Ltd. +#define UHS_VID_DISPLAYLINK 0x17e9U // DisplayLink +#define UHS_VID_CORNICE 0x17ebU // Cornice, Inc. +#define UHS_VID_LENOVO 0x17efU // Lenovo +#define UHS_VID_WAVESENSE 0x17f4U // WaveSense +#define UHS_VID_KK_ROCKY 0x17f5U // K.K. Rocky +#define UHS_VID_UNICOMP 0x17f6U // Unicomp, Inc +#define UHS_VID_ADVANTECH 0x1809U // Advantech +#define UHS_VID_TWINHAN 0x1822U // Twinhan +#define UHS_VID_GWO_JINN_INDUSTRIES 0x1831U // Gwo Jinn Industries Co., Ltd. +#define UHS_VID_HUIZHOU_SHENGHUA_INDUSTRIAL 0x1832U // Huizhou Shenghua Industrial Co., Ltd. +#define UHS_VID_VIVOPHONE 0x183dU // VIVOphone +#define UHS_VID_VAISALA 0x1843U // Vaisala +#define UHS_VID_ASROCK_INCORPORATION 0x1849U // ASRock Incorporation +#define UHS_VID_GYROCOM_CANDC 0x1852U // GYROCOM C&C Co., LTD +#define UHS_VID_MEMORY_DEVICES 0x1854U // Memory Devices Ltd. +#define UHS_VID_COMPRO 0x185bU // Compro +#define UHS_VID_TECH_TECHNOLOGY_INDUSTRIAL_COMPANY 0x1861U // Tech Technology Industrial Company +#define UHS_VID_TERIDIAN_SEMICONDUCTOR 0x1862U // Teridian Semiconductor Corp. +#define UHS_VID_NEXIO_1 0x1870U // Nexio Co., Ltd +#define UHS_VID_AVEO_TECHNOLOGY 0x1871U // Aveo Technology Corp. +#define UHS_VID_NAVILOCK 0x1873U // Navilock +#define UHS_VID_ALIENWARE_CORPORATION 0x187cU // Alienware Corporation +#define UHS_VID_SIANO_MOBILE_SILICON 0x187fU // Siano Mobile Silicon +#define UHS_VID_VAST_TECHNOLOGIES_1 0x1892U // Vast Technologies, Inc. +#define UHS_VID_TOPSEED 0x1894U // Topseed +#define UHS_VID_EVERTOP_WIRE_CABLE 0x1897U // Evertop Wire Cable Co. +#define UHS_VID_3SHAPE_AS 0x189fU // 3Shape A/S +#define UHS_VID_CSSN 0x18a4U // CSSN +#define UHS_VID_VERBATIM 0x18a5U // Verbatim, Ltd +#define UHS_VID_PETALYNX 0x18b1U // Petalynx +#define UHS_VID_E3C_TECHNOLOGIES 0x18b4U // e3C Technologies +#define UHS_VID_MIKKON_TECHNOLOGY_LIMITED 0x18b6U // Mikkon Technology Limited +#define UHS_VID_ZOTEK_ELECTRONIC 0x18b7U // Zotek Electronic Co., Ltd. +#define UHS_VID_AMIT_TECHNOLOGY 0x18c5U // AMIT Technology, Inc. +#define UHS_VID_ECAMM 0x18cdU // Ecamm +#define UHS_VID_GOOGLE 0x18d1U // Google Inc. +#define UHS_VID_STARLINE_INTERNATIONAL_GROUP_LIMITED 0x18d5U // Starline International Group Limited +#define UHS_VID_KABA 0x18d9U // Kaba +#define UHS_VID_LKC_TECHNOLOGIES 0x18dcU // LKC Technologies, Inc. +#define UHS_VID_PLANON_SYSTEM_SOLUTIONS 0x18ddU // Planon System Solutions Inc. +#define UHS_VID_FITIPOWER_INTEGRATED_TECHNOLOGY 0x18e3U // Fitipower Integrated Technology Inc +#define UHS_VID_QCOM 0x18e8U // Qcom +#define UHS_VID_MATROX_GRAPHICS 0x18eaU // Matrox Graphics, Inc. +#define UHS_VID_ARKMICRO_TECHNOLOGIES 0x18ecU // Arkmicro Technologies Inc. +#define UHS_VID_FINEARCH 0x18fdU // FineArch Inc. +#define UHS_VID_GEMBIRD_1 0x1908U // GEMBIRD +#define UHS_VID_MOTOROLA_GSG 0x190dU // Motorola GSG +#define UHS_VID_ALCO_DIGITAL_DEVICES_LIMITED 0x1914U // Alco Digital Devices Limited +#define UHS_VID_NORDIC_SEMICONDUCTOR_ASA 0x1915U // Nordic Semiconductor ASA +#define UHS_VID_FITLINXX 0x1923U // FitLinxx +#define UHS_VID_NEXTWINDOW 0x1926U // NextWindow +#define UHS_VID_AVAGO_TECHNOLOGIES_PTE 0x192fU // Avago Technologies, Pte. +#define UHS_VID_SHENZHEN_XIANHE_TECHNOLOGY 0x1930U // Shenzhen Xianhe Technology Co., Ltd. +#define UHS_VID_NINGBO_BROAD_TELECOMMUNICATION 0x1931U // Ningbo Broad Telecommunication Co., Ltd. +#define UHS_VID_FEATURE_INTEGRATION_TECHNOLOGY_INC_FINTEK 0x1934U // Feature Integration Technology Inc. (Fintek) +#define UHS_VID_DREAM_LINK 0x1941U // Dream Link +#define UHS_VID_SENSORAY 0x1943U // Sensoray Co., Inc. +#define UHS_VID_LAB126 0x1949U // Lab126, Inc. +#define UHS_VID_PRESONUS_AUDIO_ELECTRONICS 0x194fU // PreSonus Audio Electronics, Inc. +#define UHS_VID_HYPERSTONE_AG 0x1951U // Hyperstone AG +#define UHS_VID_IRONKEY 0x1953U // Ironkey Inc. +#define UHS_VID_RADIIENT_TECHNOLOGIES 0x1954U // Radiient Technologies +#define UHS_VID_ITRON_TECHNOLOGY_IONE 0x195dU // Itron Technology iONE +#define UHS_VID_UNIDEN_CORPORATION 0x1965U // Uniden Corporation +#define UHS_VID_CASIO_HITACHI_MOBILE_COMMUNICATIONS 0x1967U // CASIO HITACHI Mobile Communications Co., Ltd. +#define UHS_VID_WISPRO_TECHNOLOGY 0x196bU // Wispro Technology Inc. +#define UHS_VID_DANE_ELEC_CORP_USA 0x1970U // Dane-Elec Corp. USA +#define UHS_VID_DONGGUAN_GUNEETAL_WIRE_AND_CABLE 0x1975U // Dongguan Guneetal Wire & Cable Co., Ltd. +#define UHS_VID_CHIPSBRAND_MICROELECTRONICS_HK 0x1976U // Chipsbrand Microelectronics (HK) Co., Ltd. +#define UHS_VID_T_LOGIC 0x1977U // T-Logic +#define UHS_VID_LEUZE_ELECTRONIC 0x197dU // Leuze electronic +#define UHS_VID_NUCONN_TECHNOLOGY 0x1989U // Nuconn Technology Corp. +#define UHS_VID_BECEEM_COMMUNICATIONS 0x198fU // Beceem Communications Inc. +#define UHS_VID_ACRON_PRECISION_INDUSTRIAL 0x1990U // Acron Precision Industrial Co., Ltd. +#define UHS_VID_TRILLIUM_TECHNOLOGY_PTY 0x1995U // Trillium Technology Pty. Ltd. +#define UHS_VID_PIXELINK 0x1996U // PixeLINK +#define UHS_VID_MICROSTRAIN 0x199bU // MicroStrain, Inc. +#define UHS_VID_THE_IMAGING_SOURCE_EUROPE 0x199eU // The Imaging Source Europe GmbH +#define UHS_VID_BENICA_CORPORATION 0x199fU // Benica Corporation +#define UHS_VID_BIFORST_TECHNOLOGY 0x19a8U // Biforst Technology Inc. +#define UHS_VID_BODELIN 0x19abU // Bodelin +#define UHS_VID_S_LIFE 0x19afU // S Life +#define UHS_VID_BATRONIX 0x19b2U // Batronix +#define UHS_VID_CELESTRON 0x19b4U // Celestron +#define UHS_VID_B_AND_W_GROUP 0x19b5U // B & W Group +#define UHS_VID_INFOTECH_LOGISTIC 0x19b6U // Infotech Logistic, LLC +#define UHS_VID_DATA_ROBOTICS 0x19b9U // Data Robotics +#define UHS_VID_FUTUBA 0x19c2U // Futuba +#define UHS_VID_MINDTRIBE 0x19caU // Mindtribe +#define UHS_VID_PARROT 0x19cfU // Parrot SA +#define UHS_VID_ZTE_WCDMA_TECHNOLOGIES_MSM 0x19d2U // ZTE WCDMA Technologies MSM +#define UHS_VID_KFI_PRINTERS 0x19dbU // KFI Printers +#define UHS_VID_WEIDUAN_ELECTRONIC_ACCESSORY_SZ 0x19e1U // WeiDuan Electronic Accessory (S.Z.) Co., Ltd. +#define UHS_VID_INDUSTRIAL_TECHNOLOGY_RESEARCH_INSTITUTE 0x19e8U // Industrial Technology Research Institute +#define UHS_VID_PAK_HENG_TECHNOLOGY_SHENZHEN 0x19efU // Pak Heng Technology (Shenzhen) Co., Ltd. +#define UHS_VID_RODE_MICROPHONES 0x19f7U // RODE Microphones +#define UHS_VID_GAMPAQ_COLTD 0x19faU // Gampaq Co.Ltd +#define UHS_VID_DYNEX 0x19ffU // Dynex +#define UHS_VID_BELLWOOD_INTERNATIONAL 0x1a08U // Bellwood International, Inc. +#define UHS_VID_USB_IF_NON_WORKSHOP 0x1a0aU // USB-IF non-workshop +#define UHS_VID_KES 0x1a12U // KES Co., Ltd. +#define UHS_VID_VEHO 0x1a1dU // Veho +#define UHS_VID_AMPHENOL_EAST_ASIA 0x1a25U // Amphenol East Asia Ltd. +#define UHS_VID_SEAGATE_BRANDED_SOLUTIONS 0x1a2aU // Seagate Branded Solutions +#define UHS_VID_CHINA_RESOURCE_SEMICO 0x1a2cU // China Resource Semico Co., Ltd +#define UHS_VID_QUANTA_MICROSYSTEMS 0x1a32U // Quanta Microsystems, Inc. +#define UHS_VID_ACRUX 0x1a34U // ACRUX +#define UHS_VID_BIWIN_TECHNOLOGY 0x1a36U // Biwin Technology Ltd. +#define UHS_VID_TERMINUS_TECHNOLOGY 0x1a40U // Terminus Technology Inc. +#define UHS_VID_ACTION_ELECTRONICS 0x1a41U // Action Electronics Co., Ltd. +#define UHS_VID_VASCO_DATA_SECURITY_INTERNATIONAL 0x1a44U // VASCO Data Security International +#define UHS_VID_SILICON_IMAGE 0x1a4aU // Silicon Image +#define UHS_VID_SAFEBOOT_INTERNATIONAL_BV 0x1a4bU // SafeBoot International B.V. +#define UHS_VID_TANDBERG_DATA 0x1a5aU // Tandberg Data +#define UHS_VID_ABBOTT_DIABETES_CARE 0x1a61U // Abbott Diabetes Care +#define UHS_VID_SPANSION 0x1a6aU // Spansion Inc. +#define UHS_VID_SAMYOUNG_ELECTRONICS 0x1a6dU // SamYoung Electronics Co., Ltd +#define UHS_VID_GLOBAL_UNICHIP 0x1a6eU // Global Unichip Corp. +#define UHS_VID_SAGEM_ORGA 0x1a6fU // Sagem Orga GmbH +#define UHS_VID_PHYSIK_INSTRUMENTE 0x1a72U // Physik Instrumente +#define UHS_VID_BAYER_HEALTH_CARE 0x1a79U // Bayer Health Care LLC +#define UHS_VID_LUMBERG_CONNECT_GMBH_AND_CO_KG 0x1a7bU // Lumberg Connect GmbH & Co. KG +#define UHS_VID_EVOLUENT 0x1a7cU // Evoluent +#define UHS_VID_HOLTEK_SEMICONDUCTOR_1 0x1a81U // Holtek Semiconductor, Inc. +#define UHS_VID_QINHENG_ELECTRONICS 0x1a86U // QinHeng Electronics +#define UHS_VID_DYNALITH_SYSTEMS 0x1a89U // Dynalith Systems Co., Ltd. +#define UHS_VID_SGS_TAIWAN 0x1a8bU // SGS Taiwan Ltd. +#define UHS_VID_BANDRICH 0x1a8dU // BandRich, Inc. +#define UHS_VID_LEICA_CAMERA_AG 0x1a98U // Leica Camera AG +#define UHS_VID_DATA_DRIVE_THRU 0x1aa4U // Data Drive Thru, Inc. +#define UHS_VID_UBEACON_TECHNOLOGIES 0x1aa5U // UBeacon Technologies, Inc. +#define UHS_VID_EFORTUNE_TECHNOLOGY 0x1aa6U // eFortune Technology Corp. +#define UHS_VID_KEETOUCH 0x1aadU // KeeTouch +#define UHS_VID_RIGOL_TECHNOLOGIES 0x1ab1U // Rigol Technologies +#define UHS_VID_SALCOMP_PLC 0x1acbU // Salcomp Plc +#define UHS_VID_MIDIPLUS 0x1accU // Midiplus Co, Ltd. +#define UHS_VID_DESAY_WIRE 0x1ad1U // Desay Wire Co., Ltd. +#define UHS_VID_APS 0x1ad4U // APS +#define UHS_VID_SEL_C662_SERIAL_CABLE 0x1adbU // SEL C662 Serial Cable +#define UHS_VID_IC_DESIGN_REINHARD_GOTTINGER 0x1ae4U // ic-design Reinhard Gottinger GmbH +#define UHS_VID_X_TENSIONS 0x1ae7U // X-TENSIONS +#define UHS_VID_HIGH_TOP_PRECISION_ELECTRONIC 0x1aedU // High Top Precision Electronic Co., Ltd. +#define UHS_VID_CONNTECH_ELECTRONIC_SUZHOU_CORPORATION 0x1aefU // Conntech Electronic (Suzhou) Corporation +#define UHS_VID_CONNECT_ONE 0x1af1U // Connect One Ltd. +#define UHS_VID_A_EBERLE_GMBH_AND_CO_KG 0x1afeU // A. Eberle GmbH & Co. KG +#define UHS_VID_MEILHAUS_ELECTRONIC 0x1b04U // Meilhaus Electronic GmbH +#define UHS_VID_BLUTRONICS_SRL 0x1b0eU // BLUTRONICS S.r.l. +#define UHS_VID_CORSAIR 0x1b1cU // Corsair +#define UHS_VID_MSTAR_SEMICONDUCTOR 0x1b20U // MStar Semiconductor, Inc. +#define UHS_VID_WILINX 0x1b22U // WiLinx Corp. +#define UHS_VID_CELLEX_POWER_PRODUCTS 0x1b26U // Cellex Power Products, Inc. +#define UHS_VID_CURRENT_ELECTRONICS 0x1b27U // Current Electronics Inc. +#define UHS_VID_NAVISIS 0x1b28U // NAVIsis Inc. +#define UHS_VID_UGOBE_LIFE_FORMS 0x1b32U // Ugobe Life Forms, Inc. +#define UHS_VID_VIXS_SYSTEMS 0x1b36U // ViXS Systems, Inc. +#define UHS_VID_IPASSION_TECHNOLOGY 0x1b3bU // iPassion Technology Inc. +#define UHS_VID_GENERALPLUS_TECHNOLOGY 0x1b3fU // Generalplus Technology Inc. +#define UHS_VID_ENERGIZER_HOLDINGS 0x1b47U // Energizer Holdings, Inc. +#define UHS_VID_PLASTRON_PRECISION 0x1b48U // Plastron Precision Co., Ltd. +#define UHS_VID_ARH 0x1b52U // ARH Inc. +#define UHS_VID_KS_TERMINALS 0x1b59U // K.S. Terminals Inc. +#define UHS_VID_CHAO_ZHOU_KAI_YUAN_ELECTRIC 0x1b5aU // Chao Zhou Kai Yuan Electric Co., Ltd. +#define UHS_VID_THE_HONG_KONG_STANDARDS_AND_TESTING_CENTRE 0x1b65U // The Hong Kong Standards and Testing Centre Ltd. +#define UHS_VID_FUSHICAI 0x1b71U // Fushicai +#define UHS_VID_ATERGI_TECHNOLOGY 0x1b72U // ATERGI TECHNOLOGY CO., LTD. +#define UHS_VID_FRESCO_LOGIC 0x1b73U // Fresco Logic +#define UHS_VID_OVISLINK 0x1b75U // Ovislink Corp. +#define UHS_VID_LEGEND_SILICON 0x1b76U // Legend Silicon Corp. +#define UHS_VID_AFATECH 0x1b80U // Afatech +#define UHS_VID_DONGGUAN_GUANSHANG_ELECTRONICS 0x1b86U // Dongguan Guanshang Electronics Co., Ltd. +#define UHS_VID_SHENMING_ELECTRON_DONG_GUAN 0x1b88U // ShenMing Electron (Dong Guan) Co., Ltd. +#define UHS_VID_ALTIUM_LIMITED 0x1b8cU // Altium Limited +#define UHS_VID_E_MOVE_TECHNOLOGY 0x1b8dU // e-MOVE Technology Co., Ltd. +#define UHS_VID_AMLOGIC 0x1b8eU // Amlogic, Inc. +#define UHS_VID_MA_LABS 0x1b8fU // MA LABS, Inc. +#define UHS_VID_N_TRIG 0x1b96U // N-Trig +#define UHS_VID_YMAX_COMMUNICATIONS 0x1b98U // YMax Communications Corp. +#define UHS_VID_SHENZHEN_YUANCHUAN_ELECTRONIC 0x1b99U // Shenzhen Yuanchuan Electronic +#define UHS_VID_JINQ_CHERN_ENTERPRISE 0x1ba1U // JINQ CHERN ENTERPRISE CO., LTD. +#define UHS_VID_LITE_METALS_AND_PLASTIC_SHENZHEN 0x1ba2U // Lite Metals & Plastic (Shenzhen) Co., Ltd. +#define UHS_VID_EMBER_CORPORATION 0x1ba4U // Ember Corporation +#define UHS_VID_ABILIS_SYSTEMS 0x1ba6U // Abilis Systems +#define UHS_VID_CHINA_TELECOMMUNICATION_TECHNOLOGY_LABS 0x1ba8U // China Telecommunication Technology Labs +#define UHS_VID_HARMONIX_MUSIC 0x1badU // Harmonix Music +#define UHS_VID_VUZIX_CORPORATION 0x1baeU // Vuzix Corporation +#define UHS_VID_T_AND_A_MOBILE_PHONES 0x1bbbU // T & A Mobile Phones +#define UHS_VID_FORD_MOTOR 0x1bc4U // Ford Motor Co. +#define UHS_VID_AVIXE_TECHNOLOGY_CHINA 0x1bc5U // AVIXE Technology (China) Ltd. +#define UHS_VID_TELIT_WIRELESS_SOLUTIONS 0x1bc7U // Telit Wireless Solutions +#define UHS_VID_CONTAC_CABLE_INDUSTRIAL_LIMITED 0x1bceU // Contac Cable Industrial Limited +#define UHS_VID_SUNPLUS_INNOVATION_TECHNOLOGY 0x1bcfU // Sunplus Innovation Technology Inc. +#define UHS_VID_HANGZHOU_RIYUE_ELECTRONIC 0x1bd0U // Hangzhou Riyue Electronic Co., Ltd. +#define UHS_VID_BG_SYSTEMS 0x1bd5U // BG Systems, Inc. +#define UHS_VID_P_TWO_INDUSTRIES 0x1bdeU // P-TWO INDUSTRIES, INC. +#define UHS_VID_SHENZHEN_TONGYUAN_NETWORK_COMMUNICATION_CABLES 0x1befU // Shenzhen Tongyuan Network-Communication Cables Co., Ltd +#define UHS_VID_REALVISION 0x1bf0U // RealVision Inc. +#define UHS_VID_EXTRANET_SYSTEMS 0x1bf5U // Extranet Systems Inc. +#define UHS_VID_ORIENT_SEMICONDUCTOR_ELECTRONICS 0x1bf6U // Orient Semiconductor Electronics, Ltd. +#define UHS_VID_TOUCHPACK 0x1bfdU // TouchPack +#define UHS_VID_KRETON_CORPORATION 0x1c02U // Kreton Corporation +#define UHS_VID_QNAP_SYSTEM 0x1c04U // QNAP System Inc. +#define UHS_VID_IONICS_EMS 0x1c0cU // Ionics EMS, Inc. +#define UHS_VID_RELM_WIRELESS 0x1c0dU // Relm Wireless +#define UHS_VID_LANTERRA_INDUSTRIAL 0x1c10U // Lanterra Industrial Co., Ltd. +#define UHS_VID_ALECTRONIC_LIMITED 0x1c13U // ALECTRONIC LIMITED +#define UHS_VID_DATEL_ELECTRONICS 0x1c1aU // Datel Electronics Ltd. +#define UHS_VID_VOLKSWAGEN_OF_AMERICA 0x1c1bU // Volkswagen of America, Inc. +#define UHS_VID_GOLDVISH 0x1c1fU // Goldvish S.A. +#define UHS_VID_FUJI_ELECTRIC_DEVICE_TECHNOLOGY 0x1c20U // Fuji Electric Device Technology Co., Ltd. +#define UHS_VID_ADDMM 0x1c21U // ADDMM LLC +#define UHS_VID_ZHONGSHAN_CHIANG_YU_ELECTRIC 0x1c22U // ZHONGSHAN CHIANG YU ELECTRIC CO., LTD. +#define UHS_VID_SHANGHAI_HAIYING_ELECTRONICS 0x1c26U // Shanghai Haiying Electronics Co., Ltd. +#define UHS_VID_HUIYANG_D_AND_S_CABLE 0x1c27U // HuiYang D & S Cable Co., Ltd. +#define UHS_VID_ELSTER 0x1c29U // Elster GmbH +#define UHS_VID_LS_CABLE 0x1c31U // LS Cable Ltd. +#define UHS_VID_SPRINGCARD 0x1c34U // SpringCard +#define UHS_VID_AUTHORIZER_TECHNOLOGIES 0x1c37U // Authorizer Technologies, Inc. +#define UHS_VID_NONIN_MEDICAL 0x1c3dU // NONIN MEDICAL INC. +#define UHS_VID_WEP_PERIPHERALS 0x1c3eU // Wep Peripherals +#define UHS_VID_EZPROTOTYPES 0x1c40U // EZPrototypes +#define UHS_VID_CHERNG_WEEI_TECHNOLOGY 0x1c49U // Cherng Weei Technology Corp. +#define UHS_VID_SIGMA_MICRO 0x1c4fU // SiGma Micro +#define UHS_VID_PHILIPS_AND_LITE_ON_DIGITAL_SOLUTIONS_CORPORATION 0x1c6bU // Philips & Lite-ON Digital Solutions Corporation +#define UHS_VID_SKYDIGITAL 0x1c6cU // Skydigital Inc. +#define UHS_VID_AMT 0x1c73U // AMT +#define UHS_VID_KAETAT_INDUSTRIAL 0x1c77U // Kaetat Industrial Co., Ltd. +#define UHS_VID_DATASCOPE 0x1c78U // Datascope Corp. +#define UHS_VID_UNIGEN_CORPORATION 0x1c79U // Unigen Corporation +#define UHS_VID_LIGHTUNING_TECHNOLOGY 0x1c7aU // LighTuning Technology Inc. +#define UHS_VID_LUXSHARE_PRECISION_INDUSTRY_SHENZHEN 0x1c7bU // LUXSHARE PRECISION INDUSTRY (SHENZHEN) CO., LTD. +#define UHS_VID_SCHOMAECKER 0x1c83U // Schomaecker GmbH +#define UHS_VID_2N_TELEKOMUNIKACE_AS 0x1c87U // 2N TELEKOMUNIKACE a.s. +#define UHS_VID_SOMAGIC 0x1c88U // Somagic, Inc. +#define UHS_VID_HONGKONG_WEIDIDA_ELECTRON_LIMITED 0x1c89U // HONGKONG WEIDIDA ELECTRON LIMITED +#define UHS_VID_ASTRON_INTERNATIONAL 0x1c8eU // ASTRON INTERNATIONAL CORP. +#define UHS_VID_ALPINE_ELECTRONICS 0x1c98U // ALPINE ELECTRONICS, INC. +#define UHS_VID_OMEGA_TECHNOLOGY 0x1c9eU // OMEGA TECHNOLOGY +#define UHS_VID_ACCARIO 0x1ca0U // ACCARIO Inc. +#define UHS_VID_SYMWAVE 0x1ca1U // Symwave +#define UHS_VID_KINSTONE 0x1cacU // Kinstone +#define UHS_VID_ACES_ELECTRONIC 0x1cb3U // Aces Electronic Co., Ltd. +#define UHS_VID_OPEX_CORPORATION 0x1cb4U // OPEX CORPORATION +#define UHS_VID_IDEACOM_TECHNOLOGY 0x1cb6U // IdeaCom Technology Inc. +#define UHS_VID_LUMINARY_MICRO 0x1cbeU // Luminary Micro Inc. +#define UHS_VID_FORTAT_SKYMARK_INDUSTRIAL_COMPANY 0x1cbfU // FORTAT SKYMARK INDUSTRIAL COMPANY +#define UHS_VID_PLANTSENSE 0x1cc0U // PlantSense +#define UHS_VID_NEXTWAVE_BROADBAND 0x1ccaU // NextWave Broadband Inc. +#define UHS_VID_BODATONG_TECHNOLOGY_SHENZHEN 0x1ccdU // Bodatong Technology (Shenzhen) Co., Ltd. +#define UHS_VID_ADP_CORPORATION 0x1cd4U // adp corporation +#define UHS_VID_FIRECOMMS 0x1cd5U // Firecomms Ltd. +#define UHS_VID_ANTONIO_PRECISE_PRODUCTS_MANUFACTORY 0x1cd6U // Antonio Precise Products Manufactory Ltd. +#define UHS_VID_TELECOMMUNICATIONS_TECHNOLOGY_ASSOCIATION_TTA 0x1cdeU // Telecommunications Technology Association (TTA) +#define UHS_VID_WONTEN_TECHNOLOGY 0x1cdfU // WonTen Technology Co., Ltd. +#define UHS_VID_EDIMAX_TECHNOLOGY 0x1ce0U // EDIMAX TECHNOLOGY CO., LTD. +#define UHS_VID_AMPHENOL_KAE 0x1ce1U // Amphenol KAE +#define UHS_VID_DRESDEN_ELEKTRONIK 0x1cf1U // Dresden Elektronik +#define UHS_VID_ANDES_TECHNOLOGY_CORPORATION 0x1cfcU // ANDES TECHNOLOGY CORPORATION +#define UHS_VID_FLEXTRONICS_DIGITAL_DESIGN_JAPAN 0x1cfdU // Flextronics Digital Design Japan, LTD. +#define UHS_VID_ICON 0x1d03U // iCON +#define UHS_VID_SOLID_MOTION 0x1d07U // Solid-Motion +#define UHS_VID_NINGBO_HENTEK_DRAGON_ELECTRONICS 0x1d08U // NINGBO HENTEK DRAGON ELECTRONICS CO., LTD. +#define UHS_VID_TECHFAITH_WIRELESS_TECHNOLOGY_LIMITED 0x1d09U // TechFaith Wireless Technology Limited +#define UHS_VID_JOHNSON_CONTROLS_INC_THE_AUTOMOTIVE_BUSINESS_UNIT 0x1d0aU // Johnson Controls, Inc. The Automotive Business Unit +#define UHS_VID_HAN_HUA_CABLE_AND_WIRE_TECHNOLOGY_JX 0x1d0bU // HAN HUA CABLE & WIRE TECHNOLOGY (J.X.) CO., LTD. +#define UHS_VID_SONIX_TECHNOLOGY 0x1d0fU // Sonix Technology Co., Ltd. +#define UHS_VID_ALPHA_SAT_TECHNOLOGY_LIMITED 0x1d14U // ALPHA-SAT TECHNOLOGY LIMITED +#define UHS_VID_C_THRU_MUSIC 0x1d17U // C-Thru Music Ltd. +#define UHS_VID_DEXATEK_TECHNOLOGY 0x1d19U // Dexatek Technology Ltd. +#define UHS_VID_DIOSTECH 0x1d1fU // Diostech Co., Ltd. +#define UHS_VID_SAMTACK 0x1d20U // SAMTACK INC. +#define UHS_VID_ASUS 0x1d27U // ASUS +#define UHS_VID_DREAM_CHEEKY 0x1d34U // Dream Cheeky +#define UHS_VID_TOUCH 0x1d45U // Touch +#define UHS_VID_PEGATRON_CORPORATION 0x1d4dU // PEGATRON CORPORATION +#define UHS_VID_OPENMOKO 0x1d50U // OpenMoko, Inc. +#define UHS_VID_XENTA 0x1d57U // Xenta +#define UHS_VID_SMARTRONIX 0x1d5bU // Smartronix, Inc. +#define UHS_VID_LINUX_FOUNDATION 0x1d6bU // Linux Foundation +#define UHS_VID_CITIZEN 0x1d90U // Citizen +#define UHS_VID_ACTIONS_MICROELECTRONICS 0x1de1U // Actions Microelectronics Co. +#define UHS_VID_QUALCOMM_OPTION 0x1e0eU // Qualcomm / Option +#define UHS_VID_POINT_GREY_RESEARCH 0x1e10U // Point Grey Research, Inc. +#define UHS_VID_MIRION_TECHNOLOGIES_DOSIMETRY_SERVICES_DIVISION 0x1e17U // Mirion Technologies Dosimetry Services Division +#define UHS_VID_LUMENSION_SECURITY 0x1e1dU // Lumension Security +#define UHS_VID_INVIA 0x1e1fU // INVIA +#define UHS_VID_FESTO_AG_AND_CO_KG 0x1e29U // Festo AG & Co. KG +#define UHS_VID_CHIPSBANK_MICROELECTRONICS_1 0x1e3dU // Chipsbank Microelectronics Co., Ltd +#define UHS_VID_CLEVERSCOPE 0x1e41U // Cleverscope +#define UHS_VID_CUBETERNET 0x1e4eU // Cubeternet +#define UHS_VID_TYPEMATRIX 0x1e54U // TypeMatrix +#define UHS_VID_TREKSTOR_GMBH_AND_CO_KG 0x1e68U // TrekStor GmbH & Co. KG +#define UHS_VID_NZXT 0x1e71U // NZXT +#define UHS_VID_COBY_ELECTRONICS_CORPORATION 0x1e74U // Coby Electronics Corporation +#define UHS_VID_ROCCAT 0x1e7dU // ROCCAT +#define UHS_VID_NUCORE_TECHNOLOGY 0x1ebbU // NuCORE Technology, Inc. +#define UHS_VID_AIRTIES_WIRELESS_NETWORKS 0x1edaU // AirTies Wireless Networks +#define UHS_VID_BLACKMAGIC_DESIGN 0x1edbU // Blackmagic design +#define UHS_VID_ONDA_COMMUNICATION_SPA 0x1ee8U // ONDA COMMUNICATION S.p.a. +#define UHS_VID_EADS_DEUTSCHLAND 0x1ef6U // EADS Deutschland GmbH +#define UHS_VID_CAL_COMP 0x1f28U // Cal-Comp +#define UHS_VID_ONDA_UNVERIFIED 0x1f3aU // Onda (unverified) +#define UHS_VID_THE_NEAT_COMPANY 0x1f44U // The Neat Company +#define UHS_VID_H_TRONIC 0x1f48U // H-TRONIC GmbH +#define UHS_VID_G_TEK_ELECTRONICS_GROUP 0x1f4dU // G-Tek Electronics Group +#define UHS_VID_ALIPH 0x1f6fU // Aliph +#define UHS_VID_INNOSTOR_TECHNOLOGY_CORPORATION 0x1f75U // Innostor Technology Corporation +#define UHS_VID_TANDBERG 0x1f82U // TANDBERG +#define UHS_VID_ALERE 0x1f84U // Alere, Inc. +#define UHS_VID_STANTUM 0x1f87U // Stantum +#define UHS_VID_UBIQUITI_NETWORKS 0x1f9bU // Ubiquiti Networks, Inc. +#define UHS_VID_SAMSUNG_OPTO_ELECTRONCS 0x1fabU // Samsung Opto-Electroncs Co., Ltd. +#define UHS_VID_DELPHIN_TECHNOLOGY_AG 0x1fbdU // Delphin Technology AG +#define UHS_VID_NXP_SEMICONDUCTORS 0x1fc9U // NXP Semiconductors +#define UHS_VID_ILX_LIGHTWAVE_CORPORATION 0x1fdeU // ILX Lightwave Corporation +#define UHS_VID_VERTEX_WIRELESS 0x1fe7U // Vertex Wireless Co., Ltd. +#define UHS_VID_CVT_ELECTRONICSCOLTD 0x1ff7U // CVT Electronics.Co.,Ltd +#define UHS_VID_IDEOFY 0x1fffU // Ideofy Inc. +#define UHS_VID_D_LINK 0x2001U // D-Link Corp. +#define UHS_VID_DAP_TECHNOLOGIES 0x2002U // DAP Technologies +#define UHS_VID_DETECTOMAT 0x2003U // detectomat +#define UHS_VID_RELOOP 0x200cU // Reloop +#define UHS_VID_PCTV_SYSTEMS 0x2013U // PCTV Systems +#define UHS_VID_PLANEX_1 0x2019U // PLANEX +#define UHS_VID_ENCORE_ELECTRONICS 0x203dU // Encore Electronics Inc. +#define UHS_VID_HAUPPAUGE 0x2040U // Hauppauge +#define UHS_VID_TEXAS_INSTRUMENTS_2 0x2047U // Texas Instruments +#define UHS_VID_NANO_RIVER_TECHNOLOGY 0x2058U // Nano River Technology +#define UHS_VID_TAICANG_TANDW_ELECTRONICS 0x2077U // Taicang T&W Electronics Co. Ltd +#define UHS_VID_BARNES_AND_NOBLE 0x2080U // Barnes & Noble +#define UHS_VID_SIMPASS 0x2086U // SIMPASS +#define UHS_VID_CANDO 0x2087U // Cando +#define UHS_VID_CLAY_LOGIC 0x20a0U // Clay Logic +#define UHS_VID_XMOS 0x20b1U // XMOS Ltd +#define UHS_VID_HANVON 0x20b3U // Hanvon +#define UHS_VID_QI_HARDWARE 0x20b7U // Qi Hardware +#define UHS_VID_MINICIRCUITS 0x20ceU // Minicircuits +#define UHS_VID_SIMTEC_ELECTRONICS 0x20dfU // Simtec Electronics +#define UHS_VID_NET_NEW_ELECTRONIC_TECHNOLOGY 0x20f1U // NET New Electronic Technology GmbH +#define UHS_VID_TRENDNET_1 0x20f4U // TRENDnet +#define UHS_VID_XIMEA 0x20f7U // XIMEA +#define UHS_VID_RT_SYSTEMS 0x2100U // RT Systems +#define UHS_VID_ACTIONSTAR 0x2101U // ActionStar +#define UHS_VID_VIA_LABS 0x2109U // VIA Labs, Inc. +#define UHS_VID_SOFTKINETIC 0x2113U // Softkinetic +#define UHS_VID_ADVANCED_SILICON 0x2149U // Advanced Silicon S.A. +#define UHS_VID_CREATIVE_UNKNOWN 0x2162U // Creative (?) +#define UHS_VID_GW_INSTEK 0x2184U // GW Instek +#define UHS_VID_EMOTIV_SYSTEMS_PTY 0x21a1U // Emotiv Systems Pty. Ltd. +#define UHS_VID_AGECODAGIS_SARL 0x21d6U // Agecodagis SARL +#define UHS_VID_MACALLY_1 0x2222U // MacAlly +#define UHS_VID_SAMWOO_ENTERPRISE 0x2227U // SAMWOO Enterprise +#define UHS_VID_SILICON_MOTION_1 0x2232U // Silicon Motion +#define UHS_VID_RADIOSHACK_CORPORATION 0x2233U // RadioShack Corporation +#define UHS_VID_KOBO 0x2237U // Kobo Inc. +#define UHS_VID_MORPHO 0x225dU // Morpho +#define UHS_VID_8D_TECHNOLOGIES 0x228dU // 8D Technologies inc. +#define UHS_VID_PIE_DIGITAL 0x22a6U // Pie Digital, Inc. +#define UHS_VID_MOTOROLA_PCS 0x22b8U // Motorola PCS +#define UHS_VID_ETURBOTOUCH_TECHNOLOGY 0x22b9U // eTurboTouch Technology, Inc. +#define UHS_VID_TECHNOLOGY_INNOVATION_HOLDINGS 0x22baU // Technology Innovation Holdings, Ltd +#define UHS_VID_PINNACLE_SYSTEMS_1 0x2304U // Pinnacle Systems, Inc. +#define UHS_VID_SHINING_TECHNOLOGIES_INC_HEX_ 0x2318U // Shining Technologies, Inc. [hex] +#define UHS_VID_ARDUINO 0x2341U // Arduino SA +#define UHS_VID_PUMATRONIX_LTDA 0x2373U // Pumatronix Ltda +#define UHS_VID_DIGITALWAY_1 0x2375U // Digit@lway, Inc. +#define UHS_VID_SANHO_DIGITAL_ELECTRONICS 0x2406U // SANHO Digital Electronics Co., Ltd. +#define UHS_VID_AESSENT_TECHNOLOGY 0x2443U // Aessent Technology Ltd +#define UHS_VID_TRIPP_LITE_1 0x2478U // Tripp-Lite +#define UHS_VID_MAXXTER 0x248aU // Maxxter +#define UHS_VID_M2TECH_SRL 0x249cU // M2Tech s.r.l. +#define UHS_VID_PARATRONIC 0x24e1U // Paratronic +#define UHS_VID_TWINMOS_1 0x2632U // TwinMOS +#define UHS_VID_XSENS 0x2639U // Xsens +#define UHS_VID_ELECTRONICS_FOR_IMAGING_INC_HEX_ 0x2650U // Electronics For Imaging, Inc. [hex] +#define UHS_VID_SUNDTEK 0x2659U // Sundtek +#define UHS_VID_BASLER_AG 0x2676U // Basler AG +#define UHS_VID_CITIZEN_1 0x2730U // Citizen +#define UHS_VID_DIGITALWAY_2 0x2735U // DigitalWay +#define UHS_VID_NHJ 0x2770U // NHJ, Ltd +#define UHS_VID_THINGM 0x27b8U // ThingM +#define UHS_VID_ASUSTEK_COMPUTER_1 0x2821U // ASUSTek Computer Inc. +#define UHS_VID_TOPTRONIC_INDUSTRIAL 0x2899U // Toptronic Industrial Co., Ltd +#define UHS_VID_DRACALRAPHNET_TECHNOLOGIES 0x289bU // Dracal/Raphnet technologies +#define UHS_VID_JOLLA_OY 0x2931U // Jolla Oy +#define UHS_VID_DOG_HUNTER_AG 0x2a03U // dog hunter AG +#define UHS_VID_RTD_EMBEDDED_TECHNOLOGIES 0x2a37U // RTD Embedded Technologies, Inc. +#define UHS_VID_MEIZU 0x2a45U // Meizu Corp. +#define UHS_VID_PLANEX_COMMUNICATIONS_2 0x2c02U // Planex Communications +#define UHS_VID_DOLPHIN_PERIPHERALS 0x2c1aU // Dolphin Peripherals +#define UHS_VID_FUJITSU_1 0x2fb2U // Fujitsu, Ltd +#define UHS_VID_EAGLETRON_1 0x3125U // Eagletron +#define UHS_VID_NAVINI_NETWORKS 0x3136U // Navini Networks +#define UHS_VID_WHANAM_ELECTRONICS 0x3176U // Whanam Electronics Co., Ltd +#define UHS_VID_LINK_INSTRUMENTS 0x3195U // Link Instruments +#define UHS_VID_VIDZMEDIA_PTE 0x3275U // VidzMedia Pte Ltd +#define UHS_VID_INLINE 0x3333U // InLine +#define UHS_VID_AEI 0x3334U // AEI +#define UHS_VID_YAKUMO 0x3340U // Yakumo +#define UHS_VID_LEAGUER_MICROELECTRONICS_LME 0x3344U // Leaguer Microelectronics (LME) +#define UHS_VID_MICRO_STAR 0x3504U // Micro Star +#define UHS_VID_POWER_QUOTIENT_INTERNATIONAL_1 0x3538U // Power Quotient International Co., Ltd +#define UHS_VID_DIVA 0x3579U // DIVA +#define UHS_VID_SHARKOON 0x357dU // Sharkoon +#define UHS_VID_INVIBRO 0x3636U // InVibro +#define UHS_VID_WEM 0x3838U // WEM +#define UHS_VID_NATIONAL_INSTRUMENTS 0x3923U // National Instruments Corp. +#define UHS_VID_I_O_DATA 0x40bbU // I-O Data +#define UHS_VID_I_ROCKS 0x4101U // i-rocks +#define UHS_VID_IRIVER_1 0x4102U // iRiver, Ltd. +#define UHS_VID_DELL_COMPUTER_1 0x413cU // Dell Computer Corp. +#define UHS_VID_USBEST_TECHNOLOGY 0x4146U // USBest Technology +#define UHS_VID_TARGUS 0x4168U // Targus +#define UHS_VID_USB_DESIGN_BY_EXAMPLE 0x4242U // USB Design by Example +#define UHS_VID_GOPRO 0x4255U // GoPro +#define UHS_VID_BROADCOM_1 0x4317U // Broadcom Corp. +#define UHS_VID_WINCHIPHEAD 0x4348U // WinChipHead +#define UHS_VID_SHUTTLE_2 0x4572U // Shuttle, Inc. +#define UHS_VID_PANRAM 0x4586U // Panram +#define UHS_VID_EMS_PRODUCTION 0x4670U // EMS Production +#define UHS_VID_MIDITECH 0x4752U // Miditech +#define UHS_VID_GW_INSTEK_1 0x4757U // GW Instek +#define UHS_VID_ACEECA 0x4766U // Aceeca +#define UHS_VID_MEMOREX 0x4855U // Memorex +#define UHS_VID_SIMPLETECH 0x4971U // SimpleTech +#define UHS_VID_MUSICAL_FIDELITY 0x4d46U // Musical Fidelity +#define UHS_VID_GRANDTEC 0x5032U // Grandtec +#define UHS_VID_LINKSYS_UNKNOWN 0x5041U // Linksys (?) +#define UHS_VID_AVERATEC_UNKNOWN 0x50c2U // Averatec (?) +#define UHS_VID_SWEEX_1 0x5173U // Sweex +#define UHS_VID_I_TETRA 0x5219U // I-Tetra +#define UHS_VID_OWON 0x5345U // Owon +#define UHS_VID_SATOSHILABS 0x534cU // SatoshiLabs +#define UHS_VID_MEYER_INSTRUMENTS_MIS_1 0x5354U // Meyer Instruments (MIS) +#define UHS_VID_TRANSMETA 0x544dU // Transmeta Corp. +#define UHS_VID_UC_LOGIC_TECHNOLOGY 0x5543U // UC-Logic Technology Corp. +#define UHS_VID_EPIPHAN_SYSTEMS 0x5555U // Epiphan Systems Inc. +#define UHS_VID_ONSPEC_ELECTRONIC 0x55aaU // OnSpec Electronic, Inc. +#define UHS_VID_GOTVIEW 0x5654U // Gotview +#define UHS_VID_UNI_TREND_GROUP_LIMITED 0x5656U // Uni-Trend Group Limited +#define UHS_VID_IRTOUCHSYSTEMS 0x595aU // IRTOUCHSYSTEMS Co. Ltd. +#define UHS_VID_ACER_2 0x5986U // Acer, Inc +#define UHS_VID_NONOLITH_LABS 0x59e3U // Nonolith Labs +#define UHS_VID_ZINWELL 0x5a57U // Zinwell +#define UHS_VID_BEHOLDER_INTERNATIONAL 0x6000U // Beholder International Ltd. +#define UHS_VID_INGENIC_SEMICONDUCTOR 0x601aU // Ingenic Semiconductor Ltd. +#define UHS_VID_SITECOM 0x6189U // Sitecom +#define UHS_VID_LIGHTINGSOFT_AG 0x6244U // LightingSoft AG +#define UHS_VID_TWINHAN_TECHNOLOGY 0x6253U // TwinHan Technology Co., Ltd +#define UHS_VID_CORELOGIC 0x636cU // CoreLogic, Inc. +#define UHS_VID_UNKNOWN_SONY_UNKNOWN 0x6472U // Unknown (Sony?) +#define UHS_VID_ARKMICRO_TECHNOLOGIES_1 0x6547U // Arkmicro Technologies Inc. +#define UHS_VID_IRTOUCHSYSTEMS_1 0x6615U // IRTOUCHSYSTEMS Co. Ltd. +#define UHS_VID_PROTOTYPE_PRODUCT_VENDOR_ID 0x6666U // Prototype product Vendor ID +#define UHS_VID_WISEGROUP 0x6677U // WiseGroup, Ltd. +#define UHS_VID_3COM_1 0x6891U // 3Com +#define UHS_VID_OPERA1 0x695cU // Opera1 +#define UHS_VID_YEALINK_NETWORK_TECHNOLOGY 0x6993U // Yealink Network Technology Co., Ltd. +#define UHS_VID_SHANGHAI_JUJO_ELECTRONICS 0x6a75U // Shanghai Jujo Electronics Co., Ltd +#define UHS_VID_CME_CENTRAL_MUSIC 0x7104U // CME (Central Music Co.) +#define UHS_VID_STACKFOUNDRY 0x726cU // StackFoundry LLC +#define UHS_VID_TBS_TECHNOLOGIES_CHINA 0x734cU // TBS Technologies China +#define UHS_VID_BEIJING_STONE_TECHNOLOGY 0x7373U // Beijing STONE Technology Co. Ltd. +#define UHS_VID_EDIMAX_TECHNOLOGY_1 0x7392U // Edimax Technology Co., Ltd +#define UHS_VID_INTEL_1 0x8086U // Intel Corp. +#define UHS_VID_INTEL_2 0x8087U // Intel Corp. +#define UHS_VID_VIRTUALBOX 0x80eeU // VirtualBox +#define UHS_VID_KEIO 0x8282U // Keio +#define UHS_VID_EGO_SYSTEMS_1 0x8341U // EGO Systems, Inc. +#define UHS_VID_TRANSCEND_INFORMATION_1 0x8564U // Transcend Information, Inc. +#define UHS_VID_INTENSO_GMBG 0x8644U // Intenso GmbG +#define UHS_VID_CH_PRODUCTS_1 0x8e06U // CH Products, Inc. +#define UHS_VID_SITECOM_1 0x9016U // Sitecom +#define UHS_VID_TEVII_TECHNOLOGY 0x9022U // TeVii Technology Ltd. +#define UHS_VID_GEOLAB 0x9148U // GeoLab, Ltd +#define UHS_VID_MOSCHIP_SEMICONDUCTOR 0x9710U // MosChip Semiconductor +#define UHS_VID_BESTMEDIA_CD_RECORDABLE_GMBH_AND_CO_KG 0x9849U // Bestmedia CD Recordable GmbH & Co. KG +#define UHS_VID_ODEON 0x9999U // Odeon +#define UHS_VID_GRANDTEC_1 0x99faU // Grandtec +#define UHS_VID_J_WESTHUES 0x9ac4U // J. Westhues +#define UHS_VID_MARVELL_SEMICONDUCTOR_1 0x9e88U // Marvell Semiconductor, Inc. +#define UHS_VID_ANMO_ELECTRONICS_CORP_DINO_LITE_UNKNOWN 0xa128U // AnMo Electronics Corp. / Dino-Lite (?) +#define UHS_VID_ANMO_ELECTRONICS_CORPORATION 0xa168U // AnMo Electronics Corporation +#define UHS_VID_ASIX 0xa600U // Asix +#define UHS_VID_3COM_2 0xa727U // 3Com +#define UHS_VID_MXT 0xaaaaU // MXT +#define UHS_VID_UNKNOWN_3 0xabcdU // Unknown +#define UHS_VID_BLUE_MICROPHONES 0xb58eU // Blue Microphones +#define UHS_VID_CARD_DEVICE_EXPERT 0xc216U // Card Device Expert Co., LTD +#define UHS_VID_KEIL_SOFTWARE_1 0xc251U // Keil Software, Inc. +#define UHS_VID_CACE_TECHNOLOGIES 0xcaceU // CACE Technologies Inc. +#define UHS_VID_SMART_TECHNOLOGY_INDUSTRIAL 0xcd12U // SMART TECHNOLOGY INDUSTRIAL LTD. +#define UHS_VID_ULTIMARC 0xd208U // Ultimarc +#define UHS_VID_ULTIMARC_1 0xd209U // Ultimarc +#define UHS_VID_LOGILINK 0xd904U // LogiLink +#define UHS_VID_XORCOM 0xe4e4U // Xorcom Ltd. +#define UHS_VID_MAKINGTHINGS 0xeb03U // MakingThings +#define UHS_VID_EMPIA_TECHNOLOGY 0xeb1aU // eMPIA Technology, Inc. +#define UHS_VID_KWORLD 0xeb2aU // KWorld +#define UHS_VID_SMART_TECHNOLOGY_INDUSTRIAL_1 0xef18U // SMART TECHNOLOGY INDUSTRIAL LTD. +#define UHS_VID_HEWLETT_PACKARD_1 0xf003U // Hewlett Packard +#define UHS_VID_LEAP_MOTION 0xf182U // Leap Motion +#define UHS_VID_ATTEN_ELECTRONICS_SIGLENT_TECHNOLOGIES 0xf4ecU // Atten Electronics / Siglent Technologies +#define UHS_VID_SHENZHEN_SIGLENT 0xf4edU // Shenzhen Siglent Co., Ltd. +#define UHS_VID_HAMA_1 0xf766U // Hama +#define UHS_VID_CONRAD_ELECTRONIC_SE 0xfc08U // Conrad Electronic SE +#define UHS_VID_FNK_TECH 0xffeeU // FNK Tech + +#endif 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 new file mode 100644 index 00000000..1591f3b7 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_UsbCore.h @@ -0,0 +1,336 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if !defined(_UHS_host_h_) || defined(USBCORE_H) +#error "Never include UHS_UsbCore.h directly; include UHS_Host.h instead" +#else +#define USBCORE_H + +#ifndef UHS_HOST_MAX_INTERFACE_DRIVERS +#define UHS_HOST_MAX_INTERFACE_DRIVERS 0x10U // Default maximum number of USB interface drivers +#endif + +#ifndef SYSTEM_OR_SPECIAL_YIELD +#define SYSTEM_OR_SPECIAL_YIELD(...) VOID0 +#endif + +#ifndef SYSTEM_OR_SPECIAL_YIELD_FROM_ISR +#define SYSTEM_OR_SPECIAL_YIELD_FROM_ISR(...) SYSTEM_OR_SPECIAL_YIELD +#endif + +// As we make extensions to a target interface add to UHS_HOST_MAX_INTERFACE_DRIVERS +// This offset gets calculated for supporting wide subclasses, such as HID, BT, etc. +#define UHS_HID_INDEX (UHS_HOST_MAX_INTERFACE_DRIVERS + 1) + +/* Common setup data constant combinations */ +//get descriptor request type +#define UHS_bmREQ_GET_DESCR (USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE) + +//set request type for all but 'set feature' and 'set interface' +#define UHS_bmREQ_SET (USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_DEVICE) + +//get interface request type +#define UHS_bmREQ_CL_GET_INTF (USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE) + +// D7 data transfer direction (0 - host-to-device, 1 - device-to-host) +// D6-5 Type (0- standard, 1 - class, 2 - vendor, 3 - reserved) +// D4-0 Recipient (0 - device, 1 - interface, 2 - endpoint, 3 - other, 4..31 - reserved) + + +// TO-DO: Use the python script to generate these. +// TO-DO: Add _all_ subclasses here. +// USB Device Classes, Subclasses and Protocols +//////////////////////////////////////////////////////////////////////////////// +// Use Class Info in the Interface Descriptors +#define UHS_USB_CLASS_USE_CLASS_INFO 0x00U + +//////////////////////////////////////////////////////////////////////////////// +// Audio +#define UHS_USB_CLASS_AUDIO 0x01U +// Subclasses +#define UHS_USB_SUBCLASS_AUDIOCONTROL 0x01U +#define UHS_USB_SUBCLASS_AUDIOSTREAMING 0x02U +#define UHS_USB_SUBCLASS_MIDISTREAMING 0x03U + +//////////////////////////////////////////////////////////////////////////////// +// Communications and CDC Control +#define UHS_USB_CLASS_COM_AND_CDC_CTRL 0x02U + +//////////////////////////////////////////////////////////////////////////////// +// HID +#define UHS_USB_CLASS_HID 0x03U +// Subclasses +#define UHS_HID_BOOT_SUBCLASS 0x01U +// Protocols +#define UHS_HID_PROTOCOL_HIDBOOT_KEYBOARD 0x01U +#define UHS_HID_PROTOCOL_HIDBOOT_MOUSE 0x02U +//////////////////////////////////////////////////////////////////////////////// +// Physical +#define UHS_USB_CLASS_PHYSICAL 0x05U + +//////////////////////////////////////////////////////////////////////////////// +// Image +#define UHS_USB_CLASS_IMAGE 0x06U + +//////////////////////////////////////////////////////////////////////////////// +// Printer +#define UHS_USB_CLASS_PRINTER 0x07U + +//////////////////////////////////////////////////////////////////////////////// +// Mass Storage +#define UHS_USB_CLASS_MASS_STORAGE 0x08 +// Subclasses +#define UHS_BULK_SUBCLASS_SCSI_NOT_REPORTED 0x00U // De facto use +#define UHS_BULK_SUBCLASS_RBC 0x01U +#define UHS_BULK_SUBCLASS_ATAPI 0x02U // MMC-5 (ATAPI) +#define UHS_BULK_SUBCLASS_OBSOLETE1 0x03U // Was QIC-157 +#define UHS_BULK_SUBCLASS_UFI 0x04U // Specifies how to interface Floppy Disk Drives to USB +#define UHS_BULK_SUBCLASS_OBSOLETE2 0x05U // Was SFF-8070i +#define UHS_BULK_SUBCLASS_SCSI 0x06U // SCSI Transparent Command Set +#define UHS_BULK_SUBCLASS_LSDFS 0x07U // Specifies how host has to negotiate access before trying SCSI +#define UHS_BULK_SUBCLASS_IEEE1667 0x08U +// Protocols +#define UHS_STOR_PROTO_CBI 0x00U // CBI (with command completion interrupt) +#define UHS_STOR_PROTO_CBI_NO_INT 0x01U // CBI (without command completion interrupt) +#define UHS_STOR_PROTO_OBSOLETE 0x02U +#define UHS_STOR_PROTO_BBB 0x50U // Bulk Only Transport +#define UHS_STOR_PROTO_UAS 0x62U + +//////////////////////////////////////////////////////////////////////////////// +// Hub +#define UHS_USB_CLASS_HUB 0x09U + +//////////////////////////////////////////////////////////////////////////////// +// CDC-Data +#define UHS_USB_CLASS_CDC_DATA 0x0AU + +//////////////////////////////////////////////////////////////////////////////// +// Smart-Card +#define UHS_USB_CLASS_SMART_CARD 0x0BU + +//////////////////////////////////////////////////////////////////////////////// +// Content Security +#define UHS_USB_CLASS_CONTENT_SECURITY 0x0DU + +//////////////////////////////////////////////////////////////////////////////// +// Video +#define UHS_USB_CLASS_VIDEO 0x0EU + +//////////////////////////////////////////////////////////////////////////////// +// Personal Healthcare +#define UHS_USB_CLASS_PERSONAL_HEALTH 0x0FU + +//////////////////////////////////////////////////////////////////////////////// +// Diagnostic Device +#define UHS_USB_CLASS_DIAGNOSTIC_DEVICE 0xDCU + +//////////////////////////////////////////////////////////////////////////////// +// Wireless Controller +#define UHS_USB_CLASS_WIRELESS_CTRL 0xE0U + +//////////////////////////////////////////////////////////////////////////////// +// Miscellaneous +#define UHS_USB_CLASS_MISC 0xEFU + +//////////////////////////////////////////////////////////////////////////////// +// Application Specific +#define UHS_USB_CLASS_APP_SPECIFIC 0xFEU + +//////////////////////////////////////////////////////////////////////////////// +// Vendor Specific +#define UHS_USB_CLASS_VENDOR_SPECIFIC 0xFFU + +//////////////////////////////////////////////////////////////////////////////// + + +/* USB state machine states */ +#define UHS_USB_HOST_STATE_MASK 0xF0U + +// Configure states, MSN == 0 --------------------------V +#define UHS_USB_HOST_STATE_DETACHED 0x00U +#define UHS_USB_HOST_STATE_DEBOUNCE 0x01U +#define UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE 0x02U +#define UHS_USB_HOST_STATE_RESET_NOT_COMPLETE 0x03U +#define UHS_USB_HOST_STATE_WAIT_SOF 0x04U +#define UHS_USB_HOST_STATE_WAIT_BUS_READY 0x05U +#define UHS_USB_HOST_STATE_RESET_DEVICE 0x0AU +#define UHS_USB_HOST_STATE_CONFIGURING 0x0CU // Looks like "CO"nfig (backwards) +#define UHS_USB_HOST_STATE_CONFIGURING_DONE 0x0DU // Looks like "DO"one (backwards) +#define UHS_USB_HOST_STATE_CHECK 0x0EU +#define UHS_USB_HOST_STATE_ILLEGAL 0x0FU // Foo + +// Run states, MSN != 0 --------------------------------V +#define UHS_USB_HOST_STATE_RUNNING 0x60U // Looks like "GO" +#define UHS_USB_HOST_STATE_IDLE 0x1DU // Looks like "ID"le +#define UHS_USB_HOST_STATE_ERROR 0xF0U // Looks like "FO"o +#define UHS_USB_HOST_STATE_INITIALIZE 0x10U // Looks like "I"nit + +// Host SE result codes. +// Common SE results are stored in the low nybble, all interface drivers understand these plus 0x1F. +// Extended SE results are 0x10-0x1E. SE code only understands these internal to the hardware. +// Values > 0x1F are driver or other internal error conditions. +// Return these result codes from your host controller driver to match the error condition +// ALL Non-zero values are errors. +// Values not listed in this table are not handled in the base class, or any host driver. + +#define UHS_HOST_ERROR_NONE 0x00U // No error +#define UHS_HOST_ERROR_BUSY 0x01U // transfer pending +#define UHS_HOST_ERROR_BADREQ 0x02U // Transfer Launch Request was bad +#define UHS_HOST_ERROR_DMA 0x03U // DMA was too short, or too long +#define UHS_HOST_ERROR_NAK 0x04U // Peripheral returned NAK +#define UHS_HOST_ERROR_STALL 0x05U // Peripheral returned STALL +#define UHS_HOST_ERROR_TOGERR 0x06U // Toggle error/ISO over-underrun +#define UHS_HOST_ERROR_WRONGPID 0x07U // Received wrong Packet ID +#define UHS_HOST_ERROR_BADBC 0x08U // Byte count is bad +#define UHS_HOST_ERROR_PIDERR 0x09U // Received Packet ID is corrupted +#define UHS_HOST_ERROR_BADRQ 0x0AU // Packet error. Increase max packet. +#define UHS_HOST_ERROR_CRC 0x0BU // USB CRC was incorrect +#define UHS_HOST_ERROR_KERR 0x0CU // K-state instead of response, usually indicates wrong speed +#define UHS_HOST_ERROR_JERR 0x0DU // J-state instead of response, usually indicates wrong speed +#define UHS_HOST_ERROR_TIMEOUT 0x0EU // Device did not respond in time +#define UHS_HOST_ERROR_BABBLE 0x0FU // Line noise/unexpected data +#define UHS_HOST_ERROR_MEM_LAT 0x10U // Error caused by memory latency. +#define UHS_HOST_ERROR_NYET 0x11U // OUT transfer accepted with NYET + +// Addressing error codes +#define ADDR_ERROR_INVALID_INDEX 0xA0U +#define ADDR_ERROR_INVALID_ADDRESS 0xA1U + +// Common Interface Driver error codes +#define UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED 0xD1U // Driver doesn't support the device or interfaces +#define UHS_HOST_ERROR_DEVICE_INIT_INCOMPLETE 0xD2U // Init partially finished, but died. +#define UHS_HOST_ERROR_CANT_REGISTER_DEVICE_CLASS 0xD3U // There was no driver for the interface requested. +#define UHS_HOST_ERROR_ADDRESS_POOL_FULL 0xD4U // No addresses left in the address pool. +#define UHS_HOST_ERROR_HUB_ADDRESS_OVERFLOW 0xD5U // No hub addresses left. The maximum is 7. +#define UHS_HOST_ERROR_NO_ADDRESS_IN_POOL 0xD6U // Address was not allocated in the pool, thus not found. +#define UHS_HOST_ERROR_NULL_EPINFO 0xD7U // The supplied endpoint was NULL, indicates a bug or other problem. +#define UHS_HOST_ERROR_BAD_ARGUMENT 0xD8U // Indicates a range violation bug. +#define UHS_HOST_ERROR_DEVICE_DRIVER_BUSY 0xD9U // The interface driver is busy or out buffer is full, try again later. +#define UHS_HOST_ERROR_BAD_MAX_PACKET_SIZE 0xDAU // The maximum packet size was exceeded. Try again with smaller size. +#define UHS_HOST_ERROR_NO_ENDPOINT_IN_TABLE 0xDBU // The endpoint could not be found in the endpoint table. +#define UHS_HOST_ERROR_UNPLUGGED 0xDEU // Someone removed the USB device, or Vbus was turned off. +#define UHS_HOST_ERROR_NOMEM 0xDFU // Out Of Memory. + +// Control request stream errors +#define UHS_HOST_ERROR_FailGetDevDescr 0xE1U +#define UHS_HOST_ERROR_FailSetDevTblEntry 0xE2U +#define UHS_HOST_ERROR_FailGetConfDescr 0xE3U +#define UHS_HOST_ERROR_END_OF_STREAM 0xEFU + +// Host base class specific Error codes +#define UHS_HOST_ERROR_NOT_IMPLEMENTED 0xFEU +#define UHS_HOST_ERROR_TRANSFER_TIMEOUT 0xFFU + +// SEI interaction defaults +#define UHS_HOST_TRANSFER_MAX_MS 10000 // USB transfer timeout in ms, per section 9.2.6.1 of USB 2.0 spec +#define UHS_HOST_TRANSFER_RETRY_MAXIMUM 3 // 3 retry limit for a transfer +#define UHS_HOST_DEBOUNCE_DELAY_MS 500 // settle delay in milliseconds +#define UHS_HUB_RESET_DELAY_MS 20 // hub port reset delay, 10ms recomended, but can be up to 20ms + +// +// We only provide the minimum needed information for enumeration. +// Interface drivers should be able to set up what is needed with nothing more. +// A driver needs to know the following information: +// 1: address on the USB network, parent and port (aka UsbDeviceAddress) +// 2: endpoints +// 3: vid:pid, class, subclass, protocol +// + +struct ENDPOINT_INFO { + uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN). + uint8_t bmAttributes; // Endpoint transfer type. + uint16_t wMaxPacketSize; // Maximum packet size. + uint8_t bInterval; // Polling interval in frames. +} __attribute__((packed)); + +struct INTERFACE_INFO { + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t numep; + uint8_t klass; + uint8_t subklass; + uint8_t protocol; + ENDPOINT_INFO epInfo[16]; +} __attribute__((packed)); + +struct ENUMERATION_INFO { + uint16_t vid; + uint16_t pid; + uint16_t bcdDevice; + uint8_t klass; + uint8_t subklass; + uint8_t protocol; + uint8_t bMaxPacketSize0; + uint8_t currentconfig; + uint8_t parent; + uint8_t port; + uint8_t address; + INTERFACE_INFO interface; +} __attribute__((packed)); + +/* USB Setup Packet Structure */ +typedef struct { + // offset description + // 0 Bit-map of request type + union { + uint8_t bmRequestType; + + struct { + uint8_t recipient : 5; // Recipient of the request + uint8_t type : 2; // Type of request + uint8_t direction : 1; // Direction of data transfer + } __attribute__((packed)); + } ReqType_u; + + // 1 Request + uint8_t bRequest; + + // 2 Depends on bRequest + union { + uint16_t wValue; + + struct { + uint8_t wValueLo; + uint8_t wValueHi; + } __attribute__((packed)); + } wVal_u; + // 4 Depends on bRequest + uint16_t wIndex; + // 6 Depends on bRequest + uint16_t wLength; + // 8 bytes total +} __attribute__((packed)) SETUP_PKT, *PSETUP_PKT; + + +// little endian :-) 8 8 8 8 16 16 +#define mkSETUP_PKT8(bmReqType, bRequest, wValLo, wValHi, wInd, total) ((uint64_t)(((uint64_t)(bmReqType)))|(((uint64_t)(bRequest))<<8)|(((uint64_t)(wValLo))<<16)|(((uint64_t)(wValHi))<<24)|(((uint64_t)(wInd))<<32)|(((uint64_t)(total)<<48))) +#define mkSETUP_PKT16(bmReqType, bRequest, wVal, wInd, total) ((uint64_t)(((uint64_t)(bmReqType)))|(((uint64_t)(bRequest))<<8)|(((uint64_t)(wVal ))<<16) |(((uint64_t)(wInd))<<32)|(((uint64_t)(total)<<48))) + +// Big endian -- but we aren't able to use this :-/ +//#define mkSETUP_PKT8(bmReqType, bRequest, wValLo, wValHi, wInd, total) ((uint64_t)(((uint64_t)(bmReqType))<<56)|(((uint64_t)(bRequest))<<48)|(((uint64_t)(wValLo))<<40)|(((uint64_t)(wValHi))<<32)|(((uint64_t)(wInd))<<16)|((uint64_t)(total))) +//#define mkSETUP_PKT16(bmReqType, bRequest, wVal, wInd, total) ((uint64_t)(((uint64_t)(bmReqType))<<56)|(((uint64_t)(bRequest))<<48) |(((uint64_t)(wVal))<<32) |(((uint64_t)(wInd))<<16)|((uint64_t)(total))) + +#endif /* USBCORE_H */ 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 new file mode 100644 index 00000000..4d9d35bd --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_address.h @@ -0,0 +1,248 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if !defined(_UHS_host_h_) || defined(__ADDRESS_H__) +#error "Never include UHS_address.h directly; include UHS_Usb.h instead" +#else +#define __ADDRESS_H__ + + + +/* NAK powers. To save space in endpoint data structure, amount of retries before giving up and returning 0x4 is stored in */ +/* bmNakPower as a power of 2. The actual nak_limit is then calculated as nak_limit = ( 2^bmNakPower - 1) */ +#define UHS_USB_NAK_MAX_POWER 14 // NAK binary order maximum value +#define UHS_USB_NAK_DEFAULT 13 // default 16K-1 NAKs before giving up +#define UHS_USB_NAK_NOWAIT 1 // Single NAK stops transfer +#define UHS_USB_NAK_NONAK 0 // Do not count NAKs, stop retrying after USB Timeout. Try not to use this. + +#define bmUSB_DEV_ADDR_PORT 0x07 +#define bmUSB_DEV_ADDR_PARENT 0x78 +#define bmUSB_DEV_ADDR_HUB 0x40 + +// TODO: embed parent? +struct UHS_EpInfo { + uint8_t epAddr; // Endpoint address + uint8_t bIface; + uint16_t maxPktSize; // Maximum packet size + + union { + uint8_t epAttribs; + + struct { + uint8_t bmSndToggle : 1; // Send toggle, when zero bmSNDTOG0, bmSNDTOG1 otherwise + uint8_t bmRcvToggle : 1; // Send toggle, when zero bmRCVTOG0, bmRCVTOG1 otherwise + uint8_t bmNeedPing : 1; // 1 == ping protocol needed for next out packet + uint8_t bmNakPower : 5; // Binary order for NAK_LIMIT value + } __attribute__((packed)); + }; +} __attribute__((packed)); + +// TODO: embed parent address and port into epinfo struct, +// and nuke this address stupidity. +// This is a compact scheme. Should also support full spec. +// This produces a 7 hub limit, 49 devices + 7 hubs, 56 total. +// +// 7 6 5 4 3 2 1 0 +// --------------------------------- +// | | H | P | P | P | A | A | A | +// --------------------------------- +// +// H - if 1 the address is a hub address +// P - parent hub number +// A - port number of parent +// + +struct UHS_DeviceAddress { + + union { + + struct { + uint8_t bmAddress : 3; // port number + uint8_t bmParent : 3; // parent hub address + uint8_t bmHub : 1; // hub flag + uint8_t bmReserved : 1; // reserved, must be zero + } __attribute__((packed)); + uint8_t devAddress; + }; +} __attribute__((packed)); + +struct UHS_Device { + volatile UHS_EpInfo *epinfo[UHS_HOST_MAX_INTERFACE_DRIVERS]; // endpoint info pointer + UHS_DeviceAddress address; + uint8_t epcount; // number of endpoints + uint8_t speed; // indicates device speed +} __attribute__((packed)); + +typedef void (*UsbDeviceHandleFunc)(UHS_Device *pdev); + +class AddressPool { + UHS_EpInfo dev0ep; //Endpoint data structure used during enumeration for uninitialized device + + // In order to avoid hub address duplication, this should use bits + uint8_t hubCounter; // hub counter + + UHS_Device thePool[UHS_HOST_MAX_INTERFACE_DRIVERS]; + + // Initializes address pool entry + + void UHS_NI InitEntry(uint8_t index) { + thePool[index].address.devAddress = 0; + thePool[index].epcount = 1; + thePool[index].speed = 0; + for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { + thePool[index].epinfo[i] = &dev0ep; + } + }; + + // Returns thePool index for a given address + + uint8_t UHS_NI FindAddressIndex(uint8_t address = 0) { + for(uint8_t i = 1; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { + if(thePool[i].address.devAddress == address) + return i; + } + return 0; + }; + + // Returns thePool child index for a given parent + + uint8_t UHS_NI FindChildIndex(UHS_DeviceAddress addr, uint8_t start = 1) { + for(uint8_t i = (start < 1 || start >= UHS_HOST_MAX_INTERFACE_DRIVERS) ? 1 : start; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { + if(thePool[i].address.bmParent == addr.bmAddress) + return i; + } + return 0; + }; + + // Frees address entry specified by index parameter + + void UHS_NI FreeAddressByIndex(uint8_t index) { + // Zero field is reserved and should not be affected + if(index == 0) + return; + + UHS_DeviceAddress uda = thePool[index].address; + // If a hub was switched off all port addresses should be freed + if(uda.bmHub == 1) { + for(uint8_t i = 1; (i = FindChildIndex(uda, i));) + FreeAddressByIndex(i); + + // FIXME: use BIT MASKS + // If the hub had the last allocated address, hubCounter should be decremented + if(hubCounter == uda.bmAddress) + hubCounter--; + } + InitEntry(index); + } + + void InitAllAddresses() { + for(uint8_t i = 1; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) InitEntry(i); + hubCounter = 0; + }; +public: + + AddressPool() { + hubCounter = 0; + // Zero address is reserved + InitEntry(0); + + thePool[0].epinfo[0] = &dev0ep; + dev0ep.epAddr = 0; +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + dev0ep.maxPktSize = 0x40; //starting at 0x40 and work down +#else + dev0ep.maxPktSize = 0x08; +#endif + dev0ep.epAttribs = 0; //set DATA0/1 toggles to 0 + dev0ep.bmNakPower = UHS_USB_NAK_MAX_POWER; + InitAllAddresses(); + }; + + // Returns a pointer to a specified address entry + + UHS_Device* UHS_NI GetUsbDevicePtr(uint8_t addr) { + if(!addr) + return thePool; + + uint8_t index = FindAddressIndex(addr); + + return (!index) ? NULL : &thePool[index]; + }; + + + // Allocates new address + + uint8_t UHS_NI AllocAddress(uint8_t parent, bool is_hub = false, uint8_t port = 1) { + /* if (parent != 0 && port == 0) + USB_HOST_SERIAL.println("PRT:0"); */ + UHS_DeviceAddress _parent; + _parent.devAddress = parent; + if(_parent.bmReserved || port > 7) + //if(parent > 127 || port > 7) + return 0; + + // FIXME: use BIT MASKS + if(is_hub && hubCounter == 7) + return 0; + + // finds first empty address entry starting from one + uint8_t index = FindAddressIndex(0); + + if(!index) // if empty entry is not found + return 0; + + UHS_DeviceAddress addr; + addr.devAddress = port; + addr.bmParent = _parent.bmAddress; + + // FIXME: use BIT MASKS + if(is_hub) { + hubCounter++; + addr.bmHub = 1; + addr.bmAddress = hubCounter; + } + thePool[index].address = addr; +#if DEBUG_PRINTF_EXTRA_HUGE +#ifdef UHS_DEBUG_USB_ADDRESS + printf("Address: %x (%x.%x.%x)\r\n", addr.devAddress, addr.bmHub, addr.bmParent, addr.bmAddress); +#endif +#endif + return thePool[index].address.devAddress; + }; + + void UHS_NI FreeAddress(uint8_t addr) { + // if the root hub is disconnected all the addresses should be initialized + if(addr == 0x41) { + InitAllAddresses(); + return; + } + uint8_t index = FindAddressIndex(addr); + FreeAddressByIndex(index); + }; + +}; + +#endif // __ADDRESS_H__ 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 new file mode 100644 index 00000000..945512cf --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_hexdump.h @@ -0,0 +1,70 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ +#if !defined(_usb_h_) || defined(__HEXDUMP_H__) +#error "Never include UHS_hexdump.h directly; include UHS_Usb.h instead" +#else +#define __HEXDUMP_H__ + +extern int UsbDEBUGlvl; + +template +class HexDumper : public BASE_CLASS { + uint8_t byteCount; + OFFSET_TYPE byteTotal; + +public: + + HexDumper() : byteCount(0), byteTotal(0) { + }; + + void Initialize() { + byteCount = 0; + byteTotal = 0; + }; + + virtual void Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset); +}; + +template +void HexDumper::Parse(const LEN_TYPE len, const uint8_t *pbuf, const OFFSET_TYPE &offset) { + if(UsbDEBUGlvl >= 0x80) { // Fully bypass this block of code if we do not debug. + for(LEN_TYPE j = 0; j < len; j++, byteCount++, byteTotal++) { + if(!byteCount) { + PrintHex (byteTotal, 0x80); + E_Notify(PSTR(": "), 0x80); + } + PrintHex (pbuf[j], 0x80); + E_Notify(PSTR(" "), 0x80); + + if(byteCount == 15) { + E_Notify(PSTR("\r\n"), 0x80); + byteCount = 0xFF; + } + } + } +} + +#endif // __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 new file mode 100644 index 00000000..5d711c1f --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host.h @@ -0,0 +1,111 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ +/* USB functions */ +#ifndef _UHS_host_h_ +#define _UHS_host_h_ + +// WARNING: Do not change the order of includes, or stuff will break! +#include +#include +#include +#include + +#if DISABLED(USE_UHS3_USB) +#include +#include +#include +#include +#endif +#include "UHS_macros.h" + +// None of these should ever be directly included by a driver, or a user's sketch. +#include "../dyn_SWI/dyn_SWI.h" +#include "UHS_USB_IDs.h" +#include "UHS_settings.h" +#include "UHS_usb_ch9.h" +#include "UHS_UsbCore.h" +#include "UHS_address.h" +#include "UHS_usbhost.h" +#include "UHS_printhex.h" +#include "UHS_message.h" + +// Load system components as required +#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_LOADED) +#include "UHS_util_INLINE.h" +#include "UHS_host_INLINE.h" +#include "UHS_printf_HELPER.h" + +#ifdef LOAD_USB_HOST_SHIELD +#include "USB_HOST_SHIELD/USB_HOST_SHIELD.h" +#endif + +#if defined(LOAD_UHS_KINETIS_FS_HOST) && !defined(UHS_KINETIS_FS_HOST_LOADED) +#include "UHS_KINETIS_FS_HOST/UHS_KINETIS_FS_HOST.h" +#endif + +#if defined(LOAD_UHS_KINETIS_EHCI) && !defined(UHS_KINETIS_EHCI_LOADED) +#include "UHS_KINETIS_EHCI/UHS_KINETIS_EHCI.h" +#endif + +// Load USB drivers and multiplexers + +#ifdef LOAD_UHS_HUB +#include "UHS_HUB/UHS_HUB.h" +#endif // HUB loaded + +#ifdef LOAD_UHS_BULK_STORAGE +#include "UHS_BULK_STORAGE/UHS_BULK_STORAGE.h" +#endif + +#ifdef LOAD_GENERIC_STORAGE +#include "../UHS_FS/UHS_FS.h" +#endif +// Add BT and optionally HID if directed to do so +#ifdef LOAD_UHS_BT +#include "UHS_BT/UHS_BT.h" +#endif // BT and optionally HID loaded + +// Add HID +#ifdef LOAD_UHS_HID +#include "UHS_HID/UHS_HID.h" +#endif // HID loaded + +// Add CDC multiplexers (currently only ACM) +#if defined(LOAD_UHS_CDC_ACM) || defined(LOAD_UHS_CDC_ACM_FTDI) || defined(LOAD_UHS_CDC_ACM_PROLIFIC) || defined(LOAD_UHS_CDC_ACM_XR21B1411) +#include "UHS_CDC/UHS_CDC.h" +#endif // CDC loaded + +#ifdef LOAD_UHS_ADK +#include "UHS_ADK/UHS_ADK.h" +#endif + +#ifdef LOAD_UHS_MIDI +#include "UHS_MIDI/UHS_MIDI.h" +#endif + +#endif // System code loaded + +#endif // _UHS_host_h_ 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 new file mode 100644 index 00000000..9c7b5001 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -0,0 +1,1222 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_LOADED) +#define USB_HOST_SYSTEM_LOADED + +#ifndef DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST +#define DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST 0 +#endif + +#if DEBUG_PRINTF_EXTRA_HUGE +#if DEBUG_PRINTF_EXTRA_HUGE_UHS_HOST +#define HOST_DEBUG(...) printf(__VA_ARGS__) +#else +#define HOST_DEBUG(...) VOID0 +#endif +#else +#define HOST_DEBUG(...) VOID0 +#endif + +UHS_EpInfo* UHS_USB_HOST_BASE::getEpInfoEntry(uint8_t addr, uint8_t ep) { + UHS_Device *p = addrPool.GetUsbDevicePtr(addr); + + if(!p || !p->epinfo) + return NULL; + + + UHS_EpInfo *pep; + for(uint8_t j = 0; j < UHS_HOST_MAX_INTERFACE_DRIVERS; j++) { + pep = (UHS_EpInfo *)(p->epinfo[j]); + + for(uint8_t i = 0; i < p->epcount; i++) { + if((pep)->epAddr == ep) { + HOST_DEBUG("ep entry for interface %d ep %d max packet size = %d\r\n", pep->bIface, ep, pep->maxPktSize); + return pep; + } + + pep++; + } + } + return NULL; +} + +/** + * Sets a device table entry for a device. + * Each device is different and has different number of endpoints. + * This function plugs endpoint record structure, defined in application, to devtable + * + * @param addr device address + * @param epcount how many endpoints + * @param eprecord pointer to the endpoint structure + * @return Zero for success, or error code + */ +uint8_t UHS_USB_HOST_BASE::setEpInfoEntry(uint8_t addr, uint8_t iface, uint8_t epcount, volatile UHS_EpInfo* eprecord) { + if(!eprecord) + return UHS_HOST_ERROR_BAD_ARGUMENT; + + UHS_Device *p = addrPool.GetUsbDevicePtr(addr); + + if(!p) + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + + p->address.devAddress = addr; + p->epinfo[iface] = eprecord; + p->epcount = epcount; + return 0; +} + +/** + * sets all enpoint addresses to zero. + * Sets all max packet sizes to defaults + * Clears all endpoint attributes + * Sets bmNakPower to USB_NAK_DEFAULT + * Sets binterface to zero. + * Sets bNumEP to zero. + * Sets bAddress to zero. + * Clears qNextPollTime and sets bPollEnable to false. + * + * @param maxep How many endpoints to initialize + * @param device pointer to the device driver instance (this) + */ + +void UHS_USB_HOST_BASE::DeviceDefaults(uint8_t maxep, UHS_USBInterface *interface) { + + for(uint8_t i = 0; i < maxep; i++) { + interface->epInfo[i].epAddr = 0; + interface->epInfo[i].maxPktSize = (i) ? 0 : 8; + interface->epInfo[i].epAttribs = 0; + interface->epInfo[i].bmNakPower = UHS_USB_NAK_DEFAULT; + } + interface->pUsb->GetAddressPool()->FreeAddress(interface->bAddress); + interface->bIface = 0; + interface->bNumEP = 1; + interface->bAddress = 0; + interface->qNextPollTime = 0; + interface->bPollEnable = false; +} + +/** + * Perform a bus reset to the port of the connected device + * + * @param parent index to Parent + * @param port what port on the parent + * @param address address of the device + * @return Zero for success, or error code + */ + +uint8_t UHS_USB_HOST_BASE::doSoftReset(uint8_t parent, uint8_t port, uint8_t address) { + uint8_t rcode = 0; + + if(parent == 0) { + // Send a bus reset on the root interface. + doHostReset(); + } else { + // reset parent port + devConfig[parent]->ResetHubPort(port); + } + + // + // Many devices require a delay before setting the address here... + // We loop upon fails for up to 2 seconds instead. + // Most devices will be happy without a retry. + // + uint8_t retries = 0; + if(address) { + do { + rcode = setAddr(0, address); + if(!rcode) break; + retries++; + sof_delay(10); + } while(retries < 200); + HOST_DEBUG("%i retries.\r\n", retries); + } else { +#if DEBUG_PRINTF_EXTRA_HUGE + printf("\r\ndoSoftReset called with address == 0.\r\n"); +#endif + } + return rcode; +} + +/* + * Pseudo code so you may understand the code flow. + * + * reset; (happens at the lower level) + * GetDevDescr(); + * reset; + * If there are no configuration descriptors { + * // + * // Note: I know of no device that does this. + * // I suppose there could be one though. + * // + * try to enumerate. + * } else { + * last success count = 0 + * best config = 0 + * for each configuration descriptor { + * for each interface descriptor { + * get the endpoint descriptors for this interface. + * Check to see if a driver can handle this interface. + * If it can, add 1 to the success count. + * } + * if success count > last success count { + * best config = current config + * last success count = success count + * } + * } + * set the device config to the best config + * for each best config interface descriptor { + * initialize driver that can handle this interface config + * } + * } + * + * NOTES: + * 1: We do not need to save toggle states anymore and have not + * needed to for some time, because the lower level driver + * actually corrects wrong toggles on-the-fly for us. + * + * 2: We always do a second reset, since this stupid bug is + * actually part of the specification documents that I + * have found all over the net. Even Linux does it, and + * many devices actually EXPECT this behavior. Some devices + * 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: + * https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf + * + */ + +/** + * Enumerates interfaces on devices + * + * @param parent index to Parent + * @param port what port on the parent + * @param speed the speed of the device + * @return Zero for success, or error code + */ +uint8_t UHS_USB_HOST_BASE::Configuring(uint8_t parent, uint8_t port, uint8_t speed) { + //uint8_t bAddress = 0; + HOST_DEBUG("\r\n\r\n\r\nConfiguring: parent = %i, port = %i, speed = %i\r\n", parent, port, speed); + uint8_t rcode = 0; + uint8_t retries = 0; + uint8_t numinf = 0; + uint8_t configs; + UHS_Device *p = NULL; + //EpInfo epInfo; // cap at 16, this should be fairly reasonable. + ENUMERATION_INFO ei; + uint8_t bestconf = 0; + uint8_t bestsuccess = 0; + + uint8_t devConfigIndex; + +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + const uint8_t biggest = 0x40; + // 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); +#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); +#endif + + //for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { + // if((devConfig[devConfigIndex]->bAddress) && (!devConfig[devConfigIndex]->bPollEnable)) { + // devConfig[devConfigIndex]->bAddress = 0; + // } + //} + // Serial.print("HOST USB Host @ 0x"); + // Serial.println((uint32_t)this, HEX); + // Serial.print("HOST USB Host Address Pool @ 0x"); + // Serial.println((uint32_t)GetAddressPool(), HEX); + + sof_delay(200); + p = addrPool.GetUsbDevicePtr(0); + if(!p) { + HOST_DEBUG("Configuring error: USB_ERROR_ADDRESS_NOT_FOUND_IN_POOL\r\n"); + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + } + + p->speed = speed; +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + + p->epinfo[0][0].maxPktSize = 0x40; // Windows bug is expected. + // poison data + // udd->bMaxPacketSize0 = 0U; +#else + p->epinfo[0][0].maxPktSize = 0x08; // USB Spec, start small, work your way up. +#endif +again: + memset((void *)buf, 0, biggest); + HOST_DEBUG("\r\n\r\nConfiguring PktSize 0x%2.2x, rcode: 0x%2.2x, retries %i,\r\n", p->epinfo[0][0].maxPktSize, rcode, retries); + rcode = getDevDescr(0, biggest, (uint8_t*)buf); +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + if(rcode || udd->bMaxPacketSize0 < 8) +#else + if(rcode) +#endif + { + if(rcode == UHS_HOST_ERROR_JERR && retries < 4) { + // + // Some devices return JERR when plugged in. + // Attempts to reinitialize the device usually works. + // + // I have a hub that will refuse to work and acts like + // this unless external power is supplied. + // So this may not always work, and you may be fooled. + // + sof_delay(100); + retries++; + goto again; +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + } else if(((rcode == UHS_HOST_ERROR_DMA || rcode == UHS_HOST_ERROR_MEM_LAT) && retries < 4) || (udd->bMaxPacketSize0 < 8 && !rcode)) { + + if(p->epinfo[0][0].maxPktSize > 8 && rcode == UHS_HOST_ERROR_DMA) p->epinfo[0][0].maxPktSize = p->epinfo[0][0].maxPktSize >> 1; +#else + } else if((rcode == UHS_HOST_ERROR_DMA || rcode == UHS_HOST_ERROR_MEM_LAT) && retries < 4) { + if(p->epinfo[0][0].maxPktSize < 32) p->epinfo[0][0].maxPktSize = p->epinfo[0][0].maxPktSize << 1; +#endif + HOST_DEBUG("Configuring error: 0x%2.2x UHS_HOST_ERROR_DMA. Retry with maxPktSize: %i\r\n", rcode, p->epinfo[0][0].maxPktSize); + doSoftReset(parent, port, 0); + retries++; + sof_delay(200); + goto again; + } + HOST_DEBUG("Configuring error: 0x%2.2x Can't get USB_FD_DEVICE_DESCRIPTOR\r\n", rcode); + return rcode; + } + + +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + ei.address = addrPool.AllocAddress(parent, false, port); + + if(!ei.address) { + return UHS_HOST_ERROR_ADDRESS_POOL_FULL; + } + + p = addrPool.GetUsbDevicePtr(ei.address); + // set to 1 if you suspect address table corruption. +#if 0 + if(!p) { + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + } +#endif + + p->speed = speed; + + rcode = doSoftReset(parent, port, ei.address); + + if(rcode) { + addrPool.FreeAddress(ei.address); + HOST_DEBUG("Configuring error: %2.2x Can't set USB INTERFACE ADDRESS\r\n", rcode); + return rcode; + } + + { // the { } wrapper saves on stack. + HOST_DEBUG("DevDescr 2nd poll, bMaxPacketSize0:%u\r\n", udd->bMaxPacketSize0); + UHS_EpInfo dev1ep; + dev1ep.maxPktSize = udd->bMaxPacketSize0; + dev1ep.epAddr = 0; + dev1ep.epAttribs = 0; + dev1ep.bmNakPower = UHS_USB_NAK_MAX_POWER; + p->address.devAddress = ei.address; + p->epcount = 1; + p->epinfo[0] = &dev1ep; + + sof_delay(10); + memset((void *)buf, 0, biggest); + rcode = getDevDescr(ei.address, 18, (uint8_t*)buf); + if(rcode) HOST_DEBUG("getDevDescr err: 0x%x \r\n", rcode); + + addrPool.FreeAddress(ei.address); + if(rcode && rcode != UHS_HOST_ERROR_DMA) { + return rcode; + } + sof_delay(10); + } +#endif + + ei.vid = udd->idVendor; + ei.pid = udd->idProduct; + ei.bcdDevice = udd->bcdDevice; + ei.klass = udd->bDeviceClass; + ei.subklass = udd->bDeviceSubClass; + ei.protocol = udd->bDeviceProtocol; + ei.bMaxPacketSize0 = udd->bMaxPacketSize0; + ei.currentconfig = 0; + ei.parent = parent; + ei.port = port; + configs = udd->bNumConfigurations; +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + } // unwrapped, old large buf now invalid and discarded. + + uint8_t buf[18]; + USB_FD_CONFIGURATION_DESCRIPTOR *ucd = reinterpret_cast(buf); +#endif + + ei.address = addrPool.AllocAddress(parent, IsHub(ei.klass), port); + + if(!ei.address) { + return UHS_HOST_ERROR_ADDRESS_POOL_FULL; + } + + p = addrPool.GetUsbDevicePtr(ei.address); + // set to 1 if you suspect address table corruption. +#if 0 + if(!p) { + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + } +#endif + + p->speed = speed; + + rcode = doSoftReset(parent, port, ei.address); + + if(rcode) { + addrPool.FreeAddress(ei.address); + HOST_DEBUG("Configuring error: %2.2x Can't set USB INTERFACE ADDRESS\r\n", rcode); + return rcode; + } + + if(configs < 1) { + HOST_DEBUG("No interfaces?!\r\n"); + addrPool.FreeAddress(ei.address); + // rcode = TestInterface(&ei); + // Not implemented (yet) + rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; + } else { + 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); + if(rcode) { + HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); + rcode = UHS_HOST_ERROR_FailGetConfDescr; + continue; + } + ei.currentconfig = conf; + numinf = ucd->bNumInterfaces; // Does _not_ include alternates! + HOST_DEBUG("CONFIGURATION: %i, bNumInterfaces %i, wTotalLength %i\r\n", conf, numinf, ucd->wTotalLength); + uint8_t success = 0; + uint16_t inf = 0; + uint8_t data[ei.bMaxPacketSize0]; + UHS_EpInfo *pep; + pep = ctrlReqOpen(ei.address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei.currentconfig, USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data); + if(!pep) { + rcode = UHS_HOST_ERROR_NULL_EPINFO; + continue; + } + uint16_t left; + uint16_t read; + 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); + break; + } + for(; (numinf) && (!rcode); inf++) { + // iterate for each interface on this config + rcode = getNextInterface(&ei, pep, data, &left, &read, &offset); + if(rcode == UHS_HOST_ERROR_END_OF_STREAM) { + HOST_DEBUG("USB_INTERFACE END OF STREAM\r\n"); + ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei.bMaxPacketSize0, data); + rcode = 0; + break; + } + if(rcode) { + HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + continue; + } + rcode = TestInterface(&ei); + if(!rcode) success++; + rcode = 0; + } + if(!inf) { + rcode = TestInterface(&ei); + if(!rcode) success++; + rcode = 0; + } + if(success > bestsuccess) { + bestconf = conf; + bestsuccess = success; + } + } + if(!bestsuccess) rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; + } + if(!rcode) { + rcode = getConfDescr(ei.address, sizeof (USB_FD_CONFIGURATION_DESCRIPTOR), bestconf, buf); + if(rcode) { + HOST_DEBUG("Configuring error: %2.2x Can't get USB_FD_INTERFACE_DESCRIPTOR\r\n", rcode); + rcode = UHS_HOST_ERROR_FailGetConfDescr; + } + } + if(!rcode) { + bestconf++; + ei.currentconfig = bestconf; + numinf = ucd->bNumInterfaces; // Does _not_ include alternates! + HOST_DEBUG("CONFIGURATION: %i, bNumInterfaces %i, wTotalLength %i\r\n", bestconf, numinf, ucd->wTotalLength); + if(!rcode) { + HOST_DEBUG("Best configuration is %i, enumerating interfaces.\r\n", bestconf); + uint16_t inf = 0; + uint8_t data[ei.bMaxPacketSize0]; + UHS_EpInfo *pep; + pep = ctrlReqOpen(ei.address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei.currentconfig - 1, USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data); + if(!pep) { + rcode = UHS_HOST_ERROR_NULL_EPINFO; + + } else { + uint16_t left; + uint16_t read; + 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); + } else { + for(; (numinf) && (!rcode); inf++) { + // iterate for each interface on this config + rcode = getNextInterface(&ei, pep, data, &left, &read, &offset); + if(rcode == UHS_HOST_ERROR_END_OF_STREAM) { + ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei.bMaxPacketSize0, data); + rcode = 0; + break; + } + if(rcode) { + HOST_DEBUG("Configuring error: %2.2x Can't close USB_FD_INTERFACE_DESCRIPTOR stream.\r\n", rcode); + continue; + } + + if(enumerateInterface(&ei) == UHS_HOST_MAX_INTERFACE_DRIVERS) { + HOST_DEBUG("No interface driver for this interface."); + } else { + HOST_DEBUG("Interface Configured\r\n"); + } + } + } + } + } else { + HOST_DEBUG("Configuring error: %2.2x Can't set USB_INTERFACE_CONFIG stream.\r\n", rcode); + } + } + + if(!rcode) { + rcode = setConf(ei.address, bestconf); + if(rcode) { + HOST_DEBUG("Configuring error: %2.2x Can't set Configuration.\r\n", rcode); + addrPool.FreeAddress(ei.address); + } else { + for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { + HOST_DEBUG("Driver %i ", devConfigIndex); + if(!devConfig[devConfigIndex]) { + HOST_DEBUG("no driver at this index.\r\n"); + continue; // no driver + } + HOST_DEBUG("@ %2.2x ", devConfig[devConfigIndex]->bAddress); + if(devConfig[devConfigIndex]->bAddress) { + if(!devConfig[devConfigIndex]->bPollEnable) { + HOST_DEBUG("Initialize\r\n"); + rcode = devConfig[devConfigIndex]->Finalize(); + rcode = devConfig[devConfigIndex]->Start(); + if(!rcode) { + HOST_DEBUG("Total endpoints = (%i)%i\r\n", p->epcount, devConfig[devConfigIndex]->bNumEP); + } else { + break; + } + } else { + HOST_DEBUG("Already initialized.\r\n"); + continue; // consumed + } + } else { + HOST_DEBUG("Skipped\r\n"); + } + } +#if 0 // defined(UHS_HID_LOADED) + // Now do HID +#endif + } + } else { + addrPool.FreeAddress(ei.address); + } + return rcode; +} + +/** + * Removes a device from the tables + * + * @param addr address of the device + * @return nothing + */ +void UHS_USB_HOST_BASE::ReleaseDevice(uint8_t addr) { + if(addr) { +#if 0 // defined(UHS_HID_LOADED) + // Release any HID children + UHS_HID_Release(this, addr); +#endif + for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { + if(!devConfig[i]) continue; + if(devConfig[i]->bAddress == addr) { + devConfig[i]->Release(); + break; + } + } + } +} + +/** + * Gets the device descriptor, or part of it from endpoint Zero. + * + * @param addr Address of the device + * @param nbytes how many bytes to return + * @param dataptr pointer to the data to return + * @return status of the request, zero is success. + */ +uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr) { + return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes), nbytes, dataptr)); +} + +/** + * Gets the config descriptor, or part of it from endpoint Zero. + * + * @param addr Address of the device + * @param nbytes how many bytes to return + * @param conf index to descriptor to return + * @param dataptr ointer to the data to return + * @return status of the request, zero is success. + */ +uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { + return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes), nbytes, dataptr)); +} + +/** + * Get the string descriptor from a device + * + * @param addr Address of the device + * @param ns + * @param index + * @param langid language ID + * @param dataptr pointer to the data to return + * @return status of the request, zero is success. + */ +uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { + return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns), ns, dataptr)); +} + +// +//set address +// + +/** + * Set the address of a device to a new address via endpoint Zero. + * + * @param oldaddr current address + * @param newaddr new address + * @return status of the request, zero is success. + */ +uint8_t UHS_USB_HOST_BASE::setAddr(uint8_t oldaddr, uint8_t newaddr) { + uint8_t rcode = ctrlReq(oldaddr, mkSETUP_PKT8(UHS_bmREQ_SET, USB_REQUEST_SET_ADDRESS, newaddr, 0x00, 0x0000, 0x0000), 0x0000, NULL); + sof_delay(300); // Older spec says you should wait at least 200ms + return rcode; +} + +// +//set configuration +// + +/** + * Set the configuration for the device to use via endpoint Zero. + * + * @param addr Address of the device + * @param conf_value configuration index value + * @return status of the request, zero is success. + */ +uint8_t UHS_USB_HOST_BASE::setConf(uint8_t addr, uint8_t conf_value) { + return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_SET, USB_REQUEST_SET_CONFIGURATION, conf_value, 0x00, 0x0000, 0x0000), 0x0000, NULL)); +} + +/* rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ + +/** + * Writes data to an interface pipe + * + * @param addr Address of the device + * @param ep Endpoint of the pipe + * @param nbytes number of bytes to transfer + * @param data pointer to buffer to hold transfer + * @return zero for success or error code + */ +uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { + UHS_EpInfo *pep = NULL; + uint16_t nak_limit = 0; + HOST_DEBUG("outTransfer: addr: 0x%2.2x ep: 0x%2.2x nbytes: 0x%4.4x data: 0x%p\r\n", addr, ep, nbytes, data); + + uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit); + HOST_DEBUG("outTransfer: SetAddress 0x%2.2x\r\n", rcode); + if(!rcode) + rcode = OutTransfer(pep, nak_limit, nbytes, data); + return rcode; +}; + +/** + * Reads data from an interface pipe + * + * @param addr Address of the device + * @param ep Endpoint of the pipe + * @param nbytesptr number of bytes to transfer + * @param data pointer to buffer to hold transfer + * @return zero for success or error code + */ +uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data) { + UHS_EpInfo *pep = NULL; + uint16_t nak_limit = 0; + + uint8_t rcode = SetAddress(addr, ep, &pep, nak_limit); + + // if(rcode) { + // USBTRACE3("(USB::InTransfer) SetAddress Failed ", rcode, 0x81); + // USBTRACE3("(USB::InTransfer) addr requested ", addr, 0x81); + // USBTRACE3("(USB::InTransfer) ep requested ", ep, 0x81); + // return rcode; + // } + if(!rcode) + rcode = InTransfer(pep, nak_limit, nbytesptr, data); + return rcode; + +} + +/** + * Initialize the descriptor stream, works much like opening a file. + * + * @param ei + * @param ucd + * @param pep + * @param data + * @param left + * @param read + * @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) { + if(!ei || !ucd) return UHS_HOST_ERROR_BAD_ARGUMENT; + if(!pep) return UHS_HOST_ERROR_NULL_EPINFO; + *left = ucd->wTotalLength; + *read = 0; + *offset = 1; + uint8_t rcode; + pep->maxPktSize = ei->bMaxPacketSize0; + rcode = getone(pep, left, read, data, offset); + return rcode; +} + +uint8_t UHS_USB_HOST_BASE::getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset) { + uint16_t remain; + uint8_t ty; + uint8_t rcode = UHS_HOST_ERROR_END_OF_STREAM; + uint8_t *ptr; + uint8_t epc = 0; + ei->interface.numep = 0; + ei->interface.klass = 0; + ei->interface.subklass = 0; + ei->interface.protocol = 0; + while(*left + *read) { + remain = data[*offset]; // bLength + while(remain < 2) { + rcode = getone(pep, left, read, data, offset); + if(rcode) + return rcode; + remain = data[*offset]; + } + rcode = getone(pep, left, read, data, offset); + if(rcode) + return rcode; + ty = data[*offset]; // bDescriptorType + HOST_DEBUG("bLength: %i ", remain); + HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); + remain--; + if(ty == USB_DESCRIPTOR_INTERFACE) { + HOST_DEBUG("INTERFACE DESCRIPTOR FOUND\r\n"); + ptr = (uint8_t *)(&(ei->interface.bInterfaceNumber)); + for(int i = 0; i < 6; i++) { + rcode = getone(pep, left, read, data, offset); + if(rcode) + return rcode; + *ptr = data[*offset]; + ptr++; + } + rcode = getone(pep, left, read, data, offset); + if(rcode) + return rcode; + // Now at iInterface + // Get endpoints. + HOST_DEBUG("Getting %i endpoints\r\n", ei->interface.numep); + while(epc < ei->interface.numep) { + rcode = getone(pep, left, read, data, offset); + if(rcode) { + HOST_DEBUG("ENDPOINT DESCRIPTOR DIED WAY EARLY\r\n"); + return rcode; + } + remain = data[*offset]; // bLength + while(remain < 2) { + rcode = getone(pep, left, read, data, offset); + if(rcode) + return rcode; + remain = data[*offset]; + } + rcode = getone(pep, left, read, data, offset); + if(rcode) { + HOST_DEBUG("ENDPOINT DESCRIPTOR DIED EARLY\r\n"); + return rcode; + } + ty = data[*offset]; // bDescriptorType + HOST_DEBUG("bLength: %i ", remain); + HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); + remain -= 2; + if(ty == USB_DESCRIPTOR_ENDPOINT) { + HOST_DEBUG("ENDPOINT DESCRIPTOR: %i\r\n", epc); + ptr = (uint8_t *)(&(ei->interface.epInfo[epc].bEndpointAddress)); + for(unsigned int i = 0; i< sizeof (ENDPOINT_INFO); i++) { + rcode = getone(pep, left, read, data, offset); + if(rcode) { + HOST_DEBUG("ENDPOINT DESCRIPTOR DIED LATE\r\n"); + return rcode; + } + *ptr = data[*offset]; + ptr++; + remain--; + } + epc++; + HOST_DEBUG("ENDPOINT DESCRIPTOR OK\r\n"); + } + rcode = eat(pep, left, read, data, offset, &remain); + if(rcode) { + HOST_DEBUG("ENDPOINT DESCRIPTOR DIED EATING\r\n"); + return rcode; + } + remain = 0; + } + remain = 1; + // queue ahead, but do not report if error. + rcode = eat(pep, left, read, data, offset, &remain); + if(!ei->interface.numep && rcode) { + return rcode; + } + HOST_DEBUG("ENDPOINT DESCRIPTORS FILLED\r\n"); + return 0; + } else { + rcode = eat(pep, left, read, data, offset, &remain); + if(rcode) + return rcode; + } + rcode = UHS_HOST_ERROR_END_OF_STREAM; + } + return rcode; +} + +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; + pep = ctrlReqOpen(ei->address, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, ei->currentconfig, + USB_DESCRIPTOR_CONFIGURATION, 0x0000U, ucd->wTotalLength), data); + if(!pep) return UHS_HOST_ERROR_NULL_EPINFO; + uint16_t left = ucd->wTotalLength; + uint8_t cinf = 0; + uint8_t ty; + uint8_t epc = 0; + uint16_t remain = ucd->bLength; + uint16_t read = 0; + uint8_t offset = remain; + uint8_t *ptr; + uint8_t rcode; + ei->interface.numep = 0; + ei->interface.klass = 0; + ei->interface.subklass = 0; + ei->interface.protocol = 0; + pep->maxPktSize = ei->bMaxPacketSize0; + + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + HOST_DEBUG("\r\nGetting interface: %i\r\n", inf); + inf++; + while(cinf != inf && (left + read)) { + //HOST_DEBUG("getInterface: cinf: %i inf: %i left: %i read: %i offset: %i remain %i\r\n", cinf, inf, left, read, offset, remain); + // Go past current descriptor + HOST_DEBUG("Skip: %i\r\n", remain); + rcode = eat(pep, &left, &read, data, &offset, &remain); + if(rcode) + return rcode; + remain = data[offset]; // bLength + while(remain < 2) { + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + remain = data[offset]; + } + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + ty = data[offset]; // bDescriptorType + HOST_DEBUG("bLength: %i ", remain); + HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); + remain--; + if(ty == USB_DESCRIPTOR_INTERFACE) { + HOST_DEBUG("INTERFACE DESCRIPTOR: %i\r\n", cinf); + cinf++; + if(cinf == inf) { + // Get the interface descriptor information. + ptr = (uint8_t *)(&(ei->interface.bInterfaceNumber)); + for(int i = 0; i < 6; i++) { + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + *ptr = data[offset]; + ptr++; + } + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + // Now at iInterface + remain = 0; + // Get endpoints. + HOST_DEBUG("Getting %i endpoints\r\n", ei->interface.numep); + while(epc < ei->interface.numep) { + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + remain = data[offset]; // bLength + while(remain < 2) { + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + remain = data[offset]; + } + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + ty = data[offset]; // bDescriptorType + HOST_DEBUG("bLength: %i ", remain); + HOST_DEBUG("bDescriptorType: %2.2x\r\n", ty); + remain--; + if(ty == USB_DESCRIPTOR_ENDPOINT) { + HOST_DEBUG("ENDPOINT DESCRIPTOR: %i\r\n", epc); + ptr = (uint8_t *)(&(ei->interface.epInfo[epc].bEndpointAddress)); + for(unsigned int i = 0; i< sizeof (ENDPOINT_INFO); i++) { + rcode = getone(pep, &left, &read, data, &offset); + if(rcode) + return rcode; + *ptr = data[offset]; + ptr++; + } + epc++; + remain = 0; + } else { + rcode = eat(pep, &left, &read, data, &offset, &remain); + if(rcode) + return rcode; + remain = 0; + } + } + } + } + } + + return ctrlReqClose(pep, UHS_bmREQ_GET_DESCR, left, ei->bMaxPacketSize0, data); +} + +uint8_t UHS_USB_HOST_BASE::getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset) { + uint8_t rcode = 0; + *offset += 1; + if(*offset < *read) { + return 0; + } else if(*left > 0) { + // uint16_t num = *left; + uint16_t num = pep->maxPktSize; + if(num > *left) num = *left; + *offset = 0; + rcode = ctrlReqRead(pep, left, read, num, dataptr); + if(rcode == 0) { + if(*read == 0) { + rcode = UHS_HOST_ERROR_END_OF_STREAM; + } else if(*read < num) *left = 0; + } + } else { + rcode = UHS_HOST_ERROR_END_OF_STREAM; + } + return rcode; +} + +uint8_t UHS_USB_HOST_BASE::eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum) { + uint8_t rcode = 0; + HOST_DEBUG("eating %i\r\n", *yum); + while(*yum) { + *yum -= 1; + rcode = getone(pep, left, read, dataptr, offset); + if(rcode) break; + } + return rcode; +} + +uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr) { + //bool direction = bmReqType & 0x80; //request direction, IN or OUT + uint8_t rcode = 0; + + // Serial.println(""); + UHS_EpInfo *pep = ctrlReqOpen(addr, Request, dataptr); + if(!pep) { + HOST_DEBUG("ctrlReq1: ERROR_NULL_EPINFO addr: %d\r\n", addr); + return UHS_HOST_ERROR_NULL_EPINFO; + } + uint8_t rt = (uint8_t)(Request & 0xFFU); + + // Serial.println("Opened"); + uint16_t left = (uint16_t)(Request >> 48) /*total*/; + if(dataptr != NULL) { + //data stage + if((rt & 0x80) == 0x80) { + //IN transfer + while(left) { + // Bytes read into buffer + uint16_t read = nbytes; + HOST_DEBUG("ctrlReq2: left: %i, read:%i, nbytes %i\r\n", left, read, nbytes); + rcode = ctrlReqRead(pep, &left, &read, nbytes, dataptr); + +#if UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + HOST_DEBUG("RESULT: 0x%2.2x 0x%2.2x 0x%2.2x 0x%8.8lx%8.8lx\r\n", rcode, addr, read, (uint32_t)((Request>>32)&0xFFFFFFFFLU), (uint32_t)(Request&0xFFFFFFFFLU)); + // Should only be used for GET_DESCRIPTOR USB_DESCRIPTOR_DEVICE + constexpr uint32_t req_match = ((uint32_t)USB_DESCRIPTOR_DEVICE << 24) | + ((uint32_t)USB_REQUEST_GET_DESCRIPTOR << 8); + const uint32_t req_found = Request & 0xFF00FF00ul; + if(!addr && read && (req_found == req_match)) { + HOST_DEBUG("ctrlReq3: acceptBuffer sz %i nbytes %i left %i\n\r", read, nbytes, left); + left = 0; + rcode = UHS_HOST_ERROR_NONE; + break; + } +#endif + if(rcode) { + return rcode; + } + } + } else { + // OUT transfer + rcode = OutTransfer(pep, 0, nbytes, dataptr); + } + if(rcode) { + //return error + return ( rcode); + } + } + + // Serial.println("Close Phase"); + // Serial.flush(); + // Status stage + rcode = ctrlReqClose(pep, rt, left, nbytes, dataptr); + // Serial.println("Closed"); + return rcode; +} + +uint8_t UHS_USB_HOST_BASE::EPClearHalt(uint8_t addr, uint8_t ep) { + return ctrlReq(addr, mkSETUP_PKT8(USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT, USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, ep, 0), 0, NULL); +} + +uint8_t UHS_USB_HOST_BASE::TestInterface(ENUMERATION_INFO *ei) { + + uint8_t devConfigIndex; + uint8_t rcode = 0; + HOST_DEBUG("TestInterface VID:%4.4x PID:%4.4x Class:%2.2x Subclass:%2.2x Protocol %2.2x\r\n", ei->vid, ei->pid, ei->klass, ei->subklass, ei->protocol); + HOST_DEBUG("Interface data: Class:%2.2x Subclass:%2.2x Protocol %2.2x, number of endpoints %i\r\n", ei->interface.klass, ei->interface.subklass, ei->interface.subklass, ei->interface.numep); + HOST_DEBUG("Parent: %2.2x, bAddress: %2.2x\r\n", ei->parent, ei->address); + for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { + if(!devConfig[devConfigIndex]) { + HOST_DEBUG("No driver at index %i\r\n", devConfigIndex); + continue; // no driver + } + if(devConfig[devConfigIndex]->bAddress) { + HOST_DEBUG("Driver %i is already consumed @ %2.2x\r\n", devConfigIndex, devConfig[devConfigIndex]->bAddress); + continue; // consumed + } + + if(devConfig[devConfigIndex]->OKtoEnumerate(ei)) { + HOST_DEBUG("Driver %i supports this interface\r\n", devConfigIndex); + break; + } + } + if(devConfigIndex == UHS_HOST_MAX_INTERFACE_DRIVERS) { + rcode = UHS_HOST_ERROR_DEVICE_NOT_SUPPORTED; +#if 0 // defined(UHS_HID_LOADED) + // Check HID here, if it is, then lie + if(ei->klass == UHS_USB_CLASS_HID) { + devConfigIndex = UHS_HID_INDEX; // for debugging, otherwise this has no use. + rcode = 0; + } +#endif + } + if(!rcode) HOST_DEBUG("Driver %i can be used for this interface\r\n", devConfigIndex); + else HOST_DEBUG("No driver for this interface.\r\n"); + return rcode; +}; + +uint8_t UHS_USB_HOST_BASE::enumerateInterface(ENUMERATION_INFO *ei) { + uint8_t devConfigIndex; + + HOST_DEBUG("AttemptConfig: parent = %i, port = %i\r\n", ei->parent, ei->port); + +#if 0 // defined(UHS_HID_LOADED) + // Check HID here, if it is, then lie + if(ei->klass == UHS_USB_CLASS_HID || ei->interface.klass == UHS_USB_CLASS_HID) { + UHS_HID_SetUSBInterface(this, ENUMERATION_INFO * ei); + devConfigIndex = UHS_HID_INDEX; + } else +#endif + for(devConfigIndex = 0; devConfigIndex < UHS_HOST_MAX_INTERFACE_DRIVERS; devConfigIndex++) { + if(!devConfig[devConfigIndex]) { + HOST_DEBUG("No driver at index %i\r\n", devConfigIndex); + continue; // no driver + } + if(devConfig[devConfigIndex]->bAddress) { + HOST_DEBUG("Driver %i is already consumed @ %2.2x\r\n", devConfigIndex, devConfig[devConfigIndex]->bAddress); + continue; // consumed + } + + if(devConfig[devConfigIndex]->OKtoEnumerate(ei)) { + HOST_DEBUG("Driver %i supports this interface\r\n", devConfigIndex); + if(!devConfig[devConfigIndex]->SetInterface(ei)) break; + else devConfigIndex = UHS_HOST_MAX_INTERFACE_DRIVERS; + } + } + return devConfigIndex; +}; + + +//////////////////////////////////////////////////////////////////////////////// +// Vendor Specific Interface Class +//////////////////////////////////////////////////////////////////////////////// + +#if 0 +/** + * Might go away, depends on if it is useful, or not. + * + * @param ei Enumeration information + * @return true if this interface driver can handle this interface description + */ +bool UHS_NI UHS_VSI::OKtoEnumerate(ENUMERATION_INFO *ei) { + return ( + (ei->subklass == UHS_USB_CLASS_VENDOR_SPECIFIC) || + (ei->interface.subklass == UHS_USB_CLASS_VENDOR_SPECIFIC) + ); +} + +/** + * Copy the entire ENUMERATION_INFO structure + * @param ei Enumeration information + * @return 0 + */ +uint8_t UHS_NI UHS_VSI::SetInterface(ENUMERATION_INFO *ei) { + bNumEP = 1; + bAddress = ei->address; + + eInfo.address = ei->address; + eInfo.bMaxPacketSize0 = ei->bMaxPacketSize0; + eInfo.currentconfig = ei->currentconfig; + eInfo.interface.bAlternateSetting = ei->interface.bAlternateSetting; + eInfo.interface.bInterfaceNumber = ei->interface.bInterfaceNumber; + eInfo.interface.numep = ei->interface.numep; + eInfo.interface.protocol = ei->interface.protocol; + eInfo.interface.subklass = ei->interface.subklass; + eInfo.klass = ei->klass; + eInfo.parent = ei->parent; + eInfo.pid = ei->pid; + eInfo.port = ei->port; + eInfo.protocol = ei->protocol; + eInfo.subklass = ei->subklass; + eInfo.vid = ei->vid; + for(uint8_t i = 0; i < eInfo.interface.numep; i++) { + eInfo.interface.epInfo[i].bEndpointAddress = ei->interface.epInfo[i].bEndpointAddress; + eInfo.interface.epInfo[i].bInterval = ei->interface.epInfo[i].bInterval; + eInfo.interface.epInfo[i].bmAttributes = ei->interface.epInfo[i].bmAttributes; + eInfo.interface.epInfo[i].wMaxPacketSize = ei->interface.epInfo[i].wMaxPacketSize; + } + return 0; +} +#endif + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + + +#if 0 + +/* TO-DO: Move this silliness to a NONE driver. + * When we have a generic NONE driver we can: + * o Extract ALL device information to help users with a new device. + * o Use an unknown device from a sketch, kind of like usblib does. + * This will aid in making more drivers in a faster way. + */ +uint8_t UHS_USB_HOST_BASE::DefaultAddressing(uint8_t parent, uint8_t port, uint8_t speed) { + uint8_t rcode; + UHS_Device *p0 = NULL, *p = NULL; + + // Get pointer to pseudo device with address 0 assigned + p0 = addrPool.GetUsbDevicePtr(0); + + if(!p0) + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + + if(!p0->epinfo) + return UHS_HOST_ERROR_NULL_EPINFO; + + p0->speed = speed; + + // Allocate new address according to device class + uint8_t bAddress = addrPool.AllocAddress(parent, false, port); + + if(!bAddress) + return UHS_HOST_ERROR_ADDRESS_POOL_FULL; + + p = addrPool.GetUsbDevicePtr(bAddress); + + if(!p) + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + + p->speed = speed; + + // Assign new address to the device + rcode = setAddr(0, bAddress); + + if(rcode) { + addrPool.FreeAddress(bAddress); + bAddress = 0; + return rcode; + } + return 0; +} +#endif + +#else +#error "Never include UHS_host_INLINE.h, include UHS_host.h instead" +#endif 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 new file mode 100644 index 00000000..c5458208 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_macros.h @@ -0,0 +1,392 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef MACROS_H +#define MACROS_H +#include "macro_logic.h" +/* + * Universal Arduino(tm) "IDE" fixups. + */ + + +// Just in case... +#ifndef SERIAL_PORT_MONITOR +#define SERIAL_PORT_MONITOR Serial +#endif + +#ifndef INT16_MIN +#define INT16_MIN -32768 +#endif +// require 10607+ +#if defined(ARDUINO) && ARDUINO >=10607 +// nop :-) +#else +#error "Arduino version too old, and must be at least 1.6.7" +#endif + +// Nuke screwed up macro junk from the IDE. +#ifdef __cplusplus +#ifdef true +#undef true +#endif +#ifdef false +#undef false +#endif +#endif + + +#ifndef UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE + +#ifndef UHS_BIG_FLASH + +#if defined(FLASHEND) && defined(FLASHSTART) +#if (FLASHEND - FLASHSTART) > 0x0FFFFU +#define UHS_BIG_FLASH 1 +#else +#define UHS_BIG_FLASH 0 +#endif + +#elif defined(__PIC32_FLASH_SIZE) +#if __PIC32_FLASH_SIZE > 511 +#define UHS_BIG_FLASH 1 +#else +#define UHS_BIG_FLASH 0 +#endif + +#elif defined(FLASHEND) && !defined(FLASHSTART) +// Assumes flash starts at 0x00000, is this a safe assumption? +// 192K + should be OK +#if FLASHEND > 0x02FFFFU +#define UHS_BIG_FLASH 1 +#else +#define UHS_BIG_FLASH 0 +#endif + +#elif defined(IFLASH_SIZE) +#if IFLASH_SIZE > 0x0FFFFU +#define UHS_BIG_FLASH 1 +#else +#define UHS_BIG_FLASH 0 +#endif + +#elif defined(ESP8266) +#define UHS_BIG_FLASH 1 +#define SYSTEM_OR_SPECIAL_YIELD(...) yield() + +#elif defined(__arm__) && defined(CORE_TEENSY) +#define UHS_BIG_FLASH 1 + +#elif defined(ARDUINO_spresense_ast) +#define UHS_BIG_FLASH 1 +#else +// safe default +#warning Small flash? +#define UHS_BIG_FLASH 0 +#endif +#endif + +#if UHS_BIG_FLASH +#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 1 +#else +#define UHS_DEVICE_WINDOWS_USB_SPEC_VIOLATION_DESCRIPTOR_DEVICE 0 +#endif +#endif + +#if defined(__arm__) && defined(CORE_TEENSY) +#define UHS_PIN_WRITE(p, v) digitalWriteFast(p, v) +#define UHS_PIN_READ(p) digitalReadFast(p) +#endif +// TODO: Fast inline code for AVR and SAM based microcontrollers +// This can be done pretty easily. +// For now, this will just work out-of-the-box. +#ifndef UHS_PIN_WRITE +#define UHS_PIN_WRITE(p, v) digitalWrite(p, v) +#endif +#ifndef UHS_PIN_READ +#define UHS_PIN_READ(p) digitalRead(p) +#endif + +#if defined( __PIC32MX__ ) && !defined(interrupts) // compiling with Microchip XC32 compiler +#define interrupts() __builtin_enable_interrupts() +#edfine noInterrupts() __builtin_disable_interrupts() +#endif + +#ifndef ARDUINO_SAMD_ZERO +#ifdef ARDUINO_AVR_ADK +#define UHS_GET_DPI(x) (x == 54 ? 6 : digitalPinToInterrupt(x)) +#else +#define UHS_GET_DPI(x) digitalPinToInterrupt(x) +#endif +#else +#define UHS_GET_DPI(x) (x) +#endif + +#ifndef __AVR__ +#ifndef __PGMSPACE_H_ +// This define should prevent reading the system pgmspace.h if included elsewhere +// This is not normally needed. +#define __PGMSPACE_H_ 1 +#endif + +#ifndef PROGMEM +#define PROGMEM +#endif +#ifndef PGM_P +#define PGM_P const char * +#endif +#ifndef PSTR +#define PSTR(str) (str) +#endif +#ifndef F +#define F(str) (str) +#endif +#ifndef _SFR_BYTE +#define _SFR_BYTE(n) (n) +#endif +#ifndef memchr_P +#define memchr_P(str, c, len) memchr((str), (c), (len)) +#endif +#ifndef memcmp_P +#define memcmp_P(a, b, n) memcmp((a), (b), (n)) +#endif +#ifndef memcpy_P +#define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) +#endif +#ifndef memmem_P +#define memmem_P(a, alen, b, blen) memmem((a), (alen), (b), (blen)) +#endif +#ifndef memrchr_P +#define memrchr_P(str, val, len) memrchr((str), (val), (len)) +#endif +#ifndef strcat_P +#define strcat_P(dest, src) strcat((dest), (src)) +#endif +#ifndef strchr_P +#define strchr_P(str, c) strchr((str), (c)) +#endif +#ifndef strchrnul_P +#define strchrnul_P(str, c) strchrnul((str), (c)) +#endif +#ifndef strcmp_P +#define strcmp_P(a, b) strcmp((a), (b)) +#endif +#ifndef strcpy_P +#define strcpy_P(dest, src) strcpy((dest), (src)) +#endif +#ifndef strcasecmp_P +#define strcasecmp_P(a, b) strcasecmp((a), (b)) +#endif +#ifndef strcasestr_P +#define strcasestr_P(a, b) strcasestr((a), (b)) +#endif +#ifndef strlcat_P +#define strlcat_P(dest, src, len) strlcat((dest), (src), (len)) +#endif +#ifndef strlcpy_P +#define strlcpy_P(dest, src, len) strlcpy((dest), (src), (len)) +#endif +#ifndef strlen_P +#define strlen_P(s) strlen((const char *)(s)) +#endif +#ifndef strnlen_P +#define strnlen_P(str, len) strnlen((str), (len)) +#endif +#ifndef strncmp_P +#define strncmp_P(a, b, n) strncmp((a), (b), (n)) +#endif +#ifndef strncasecmp_P +#define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n)) +#endif +#ifndef strncat_P +#define strncat_P(a, b, n) strncat((a), (b), (n)) +#endif +#ifndef strncpy_P +#define strncpy_P(a, b, n) strncmp((a), (b), (n)) +#endif +#ifndef strpbrk_P +#define strpbrk_P(str, chrs) strpbrk((str), (chrs)) +#endif +#ifndef strrchr_P +#define strrchr_P(str, c) strrchr((str), (c)) +#endif +#ifndef strsep_P +#define strsep_P(strp, delim) strsep((strp), (delim)) +#endif +#ifndef strspn_P +#define strspn_P(str, chrs) strspn((str), (chrs)) +#endif +#ifndef strstr_P +#define strstr_P(a, b) strstr((a), (b)) +#endif +#ifndef sprintf_P +#define sprintf_P(s, ...) sprintf((s), __VA_ARGS__) +#endif +#ifndef vfprintf_P +#define vfprintf_P(s, ...) vfprintf((s), __VA_ARGS__) +#endif +#ifndef printf_P +#define printf_P(...) printf(__VA_ARGS__) +#endif +#ifndef snprintf_P +#define snprintf_P(s, n, ...) ((s), (n), __VA_ARGS__) +#endif +#ifndef vsprintf_P +#define vsprintf_P(s, ...) ((s),__VA_ARGS__) +#endif +#ifndef vsnprintf_P +#define vsnprintf_P(s, n, ...) ((s), (n),__VA_ARGS__) +#endif +#ifndef fprintf_P +#define fprintf_P(s, ...) ((s), __VA_ARGS__) +#endif + +#ifndef pgm_read_byte +#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) +#endif +#ifndef pgm_read_word +#define pgm_read_word(addr) (*(const unsigned short *)(addr)) +#endif +#ifndef pgm_read_dword +#define pgm_read_dword(addr) (*(const unsigned long *)(addr)) +#endif +#ifndef pgm_read_float +#define pgm_read_float(addr) (*(const float *)(addr)) +#endif + +#ifndef pgm_read_byte_near +#define pgm_read_byte_near(addr) pgm_read_byte(addr) +#endif +#ifndef pgm_read_word_near +#define pgm_read_word_near(addr) pgm_read_word(addr) +#endif +#ifndef pgm_read_dword_near +#define pgm_read_dword_near(addr) pgm_read_dword(addr) +#endif +#ifndef pgm_read_float_near +#define pgm_read_float_near(addr) pgm_read_float(addr) +#endif +#ifndef pgm_read_byte_far +#define pgm_read_byte_far(addr) pgm_read_byte(addr) +#endif +#ifndef pgm_read_word_far +#define pgm_read_word_far(addr) pgm_read_word(addr) +#endif +#ifndef pgm_read_dword_far +#define pgm_read_dword_far(addr) pgm_read_dword(addr) +#endif +#ifndef pgm_read_float_far +#define pgm_read_float_far(addr) pgm_read_float(addr) +#endif + +#ifndef pgm_read_pointer +#define pgm_read_pointer +#endif + +#endif + + +//////////////////////////////////////////////////////////////////////////////// +// HANDY MACROS +//////////////////////////////////////////////////////////////////////////////// + +// Atmoically set/clear single bits using bitbands. +// Believe it or not, this boils down to a constant, +// and is less code than using |= &= operators. +// Bonus, it makes code easier to read too. +// Bitbanding is a wonderful thing. +#define BITNR(i) (i&0x1?0:i&0x2?1:i&0x4?2:i&0x8?3:i&0x10?4:i&0x20?5:i&0x40?6:i&0x80?7:i&0x100?8:i&0x200?9:i&0x400?10:i&0x800?11:i&0x1000?12:i&0x2000?13:i&0x4000?14:i&0x8000?15:i&0x10000?16:i&0x20000?17:i&0x40000?18:i&0x80000?19:i&0x100000?20:i&0x200000?21:i&0x400000?22:i&0x800000?23:i&0x1000000?24:i&0x2000000?25:i&0x4000000?26:i&0x8000000?27:i&0x10000000?28:i&0x20000000?29:i&0x40000000?30:i&0x80000000?31:32) +#define UHS_KIO_BITBAND_ADDR(r, i) (((uint32_t)&(r) - 0x40000000) * 32 + (i) * 4 + 0x42000000) +#define UHS_KIO_SETBIT_ATOMIC(r, m) (*(uint32_t *)UHS_KIO_BITBAND_ADDR((r), BITNR((m)))) = 1 +#define UHS_KIO_CLRBIT_ATOMIC(r, m) (*(uint32_t *)UHS_KIO_BITBAND_ADDR((r), BITNR((m)))) = 0 + + +#define VALUE_BETWEEN(v,l,h) (((v)>(l)) && ((v)<(h))) +#define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h))) +#define output_pgm_message(wa,fp,mp,el) wa = &mp, fp((char *)pgm_read_pointer(wa), el) +#define output_if_between(v,l,h,wa,fp,mp,el) if(VALUE_BETWEEN(v,l,h)) output_pgm_message(wa,fp,mp[v-(l+1)],el); + +#define UHS_SWAP_VALUES(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) +#ifndef __BYTE_GRABBING_DEFINED__ +#define __BYTE_GRABBING_DEFINED__ 1 +#ifdef BROKEN_OPTIMIZER_LITTLE_ENDIAN +// Note: Use this if your compiler generates horrible assembler! +#define UHS_UINT8_BYTE0(__usi__) (((uint8_t *)&(__usi__))[0]) +#define UHS_UINT8_BYTE1(__usi__) (((uint8_t *)&(__usi__))[1]) +#define UHS_UINT8_BYTE2(__usi__) (((uint8_t *)&(__usi__))[2]) +#define UHS_UINT8_BYTE3(__usi__) (((uint8_t *)&(__usi__))[3]) +#define UHS_UINT8_BYTE4(__usi__) (((uint8_t *)&(__usi__))[4]) +#define UHS_UINT8_BYTE5(__usi__) (((uint8_t *)&(__usi__))[5]) +#define UHS_UINT8_BYTE6(__usi__) (((uint8_t *)&(__usi__))[6]) +#define UHS_UINT8_BYTE7(__usi__) (((uint8_t *)&(__usi__))[7]) +#else +// Note: The cast alone to uint8_t is actually enough. +// GCC throws out the "& 0xFF", and the size is no different. +// Some compilers need it. +#define UHS_UINT8_BYTE0(__usi__) ((uint8_t)((__usi__) & 0xFF )) +#define UHS_UINT8_BYTE1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xFF)) +#define UHS_UINT8_BYTE2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xFF)) +#define UHS_UINT8_BYTE3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xFF)) +#define UHS_UINT8_BYTE4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xFF)) +#define UHS_UINT8_BYTE5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xFF)) +#define UHS_UINT8_BYTE6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xFF)) +#define UHS_UINT8_BYTE7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xFF)) +#endif +#define UHS_UINT16_SET_BYTE1(__usi__) ((uint16_t)(__usi__) << 8) +#define UHS_UINT32_SET_BYTE1(__usi__) ((uint32_t)(__usi__) << 8) +#define UHS_UINT64_SET_BYTE1(__usi__) ((uint64_t)(__usi__) << 8) +#define UHS_UINT32_SET_BYTE2(__usi__) ((uint32_t)(__usi__) << 16) +#define UHS_UINT64_SET_BYTE2(__usi__) ((uint64_t)(__usi__) << 16) +#define UHS_UINT32_SET_BYTE3(__usi__) ((uint32_t)(__usi__) << 24) +#define UHS_UINT64_SET_BYTE3(__usi__) ((uint64_t)(__usi__) << 24) +#define UHS_UINT64_SET_BYTE4(__usi__) ((uint64_t)(__usi__) << 32) +#define UHS_UINT64_SET_BYTE5(__usi__) ((uint64_t)(__usi__) << 40) +#define UHS_UINT64_SET_BYTE6(__usi__) ((uint64_t)(__usi__) << 48) +#define UHS_UINT64_SET_BYTE7(__usi__) ((uint64_t)(__usi__) << 56) + +// These are the smallest and fastest ways I have found so far in pure C/C++. +#define UHS_BYTES_TO_UINT16(__usc1__,__usc0__) ((uint16_t)((uint16_t)(__usc0__) | (uint16_t)UHS_UINT16_SET_BYTE1(__usc1__))) +#define UHS_BYTES_TO_UINT32(__usc3__,__usc2__,__usc1__,__usc0__) ((uint32_t)((uint32_t)(__usc0__) | UHS_UINT32_SET_BYTE1(__usc1__) | UHS_UINT32_SET_BYTE2(__usc2__) | UHS_UINT32_SET_BYTE3(__usc3__))) +#define UHS_BYTES_TO_UINT64(__usc7__,__usc6__,__usc5__,__usc4__,__usc3__,__usc2__,__usc1__,__usc0__) ((uint64_t)((uint64_t)__usc0__ | UHS_UINT64_SET_BYTE1(__usc1__) | UHS_UINT64_SET_BYTE2(__usc2__) | UHS_UINT64_SET_BYTE3(__usc3__) | UHS_UINT64_SET_BYTE4(__usc4__) | UHS_UINT64_SET_BYTE5(__usc5__) | UHS_UINT64_SET_BYTE6(__usc6__) | UHS_UINT64_SET_BYTE7(__usc7__))) +#endif +/* + * Debug macros. + * Useful when porting from UHS2. + * Do not use these for any new code. + * Change to better debugging after port is completed. + * Strings are stored in progmem (flash) instead of RAM. + */ +#define USBTRACE1(s,l) (Notify(PSTR(s), l)) +#define USBTRACE(s) (USBTRACE1((s), 0x80)); USB_HOST_SERIAL.flush() +#define USBTRACE3(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l), Notify(PSTR("\r\n"), l)) +#define USBTRACE3X(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l)) +#define USBTRACE2(s,r) (USBTRACE3((s),(r),0x80)); USB_HOST_SERIAL.flush() +#define USBTRACE2X(s,r) (USBTRACE3X((s),(r),0x80)); USB_HOST_SERIAL.flush() + +#define VOID0 ((void)0) +#ifndef NOTUSED +#define NOTUSED(...) __VA_ARGS__ __attribute__((unused)) +#endif +#endif /* MACROS_H */ 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 new file mode 100644 index 00000000..c0cc78d1 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_message.h @@ -0,0 +1,91 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ +#if !defined(_UHS_host_h_) || defined(__MESSAGE_H__) +#error "Never include UHS_message.h directly; include UHS_Usb.h instead" +#else +#define __MESSAGE_H__ + +extern int UsbDEBUGlvl; + +void E_Notify(char const * msg, int lvl); +void E_Notify(uint8_t b, int lvl); +void E_NotifyStr(char const * msg, int lvl); +void E_Notifyc(char c, int lvl); + +#ifdef DEBUG_USB_HOST +#define Notify E_Notify +#define NotifyStr E_NotifyStr +#define Notifyc E_Notifyc +void NotifyFailGetDevDescr(uint8_t reason); +void NotifyFailSetDevTblEntry(uint8_t reason); +void NotifyFailGetConfDescr(uint8_t reason); +void NotifyFailSetConfDescr(uint8_t reason); +void NotifyFailGetDevDescr(); +void NotifyFailSetDevTblEntry(); +void NotifyFailGetConfDescr(); +void NotifyFailSetConfDescr(); +void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID); +void NotifyFail(uint8_t rcode); +#else +#define Notify(...) VOID0 +#define NotifyStr(...) VOID0 +#define Notifyc(...) VOID0 +#define NotifyFailGetDevDescr(...) VOID0 +#define NotifyFailSetDevTblEntry(...) VOID0 +#define NotifyFailGetConfDescr(...) VOID0 +#define NotifyFailGetDevDescr(...) VOID0 +#define NotifyFailSetDevTblEntry(...) VOID0 +#define NotifyFailGetConfDescr(...) VOID0 +#define NotifyFailSetConfDescr(...) VOID0 +#define NotifyFailUnknownDevice(...) VOID0 +#define NotifyFail(...) VOID0 +#endif + +#ifdef DEBUG_USB_HOST +template void ErrorMessage(uint8_t level, char const * msg, ERROR_TYPE rcode = 0) { + Notify(msg, level); + Notify(PSTR(": "), level); + D_PrintHex (rcode, level); + Notify(PSTR("\r\n"), level); +#else +template void ErrorMessage(NOTUSED(uint8_t level), NOTUSED(char const * msg), ERROR_TYPE rcode = 0) { + (void)rcode; +#endif +} + +#ifdef DEBUG_USB_HOST +template void ErrorMessage(char const * msg, ERROR_TYPE rcode = 0) { + Notify(msg, 0x80); + Notify(PSTR(": "), 0x80); + D_PrintHex (rcode, 0x80); + Notify(PSTR("\r\n"), 0x80); +#else +template void ErrorMessage(NOTUSED(char const * msg), ERROR_TYPE rcode = 0) { + (void)rcode; +#endif +} + +#endif // __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 new file mode 100644 index 00000000..4fc9b940 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printf_HELPER.h @@ -0,0 +1,200 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef UHS_PRINTF_HELPER_H +#define UHS_PRINTF_HELPER_H + +#ifdef LOAD_UHS_PRINTF_HELPER +#include +#ifdef true +#undef true +#endif +#ifdef false +#undef false +#endif + +#ifndef STDIO_IS_OK_TO_USE_AS_IS +#if defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_SAM_DUE) || defined(ARDUINO_spresense_ast) +// STDIO patching not required. +#define STDIO_IS_OK_TO_USE_AS_IS +#endif +#endif + +#ifndef STDIO_IS_OK_TO_USE_AS_IS +// We need to patch STDIO so it can be used. + +#ifndef SERIAL_PORT_MONITOR +// Some don't define this. +#define SERIAL_PORT_MONITOR Serial +#endif + +#ifndef SERIAL_PORT_HARDWARE +// Some don't define this. +#define SERIAL_PORT_HARDWARE SERIAL_PORT_MONITOR +#endif + +#ifndef USB_HOST_SERIAL +#if defined(SERIAL_PORT_USBVIRTUAL) && defined(LOAD_UHS_KINETIS_FS_HOST) +#define USB_HOST_SERIAL SERIAL_PORT_HARDWARE +#else +#define USB_HOST_SERIAL SERIAL_PORT_MONITOR +#endif +#endif + +#ifndef NOTUSED +#define NOTUSED(...) __VA_ARGS__ __attribute__((unused)) +#endif + +#ifndef __AVR__ +#ifndef printf_P +#define printf_P(...) printf(__VA_ARGS__) +#endif +#endif + +#ifdef ARDUINO_ARCH_PIC32 +/* + * For printf() output with pic32 Arduino + */ +extern "C" { + + void _mon_putc(char s) { + USB_HOST_SERIAL.write(s); + } + + int _mon_getc() { + while(!USB_HOST_SERIAL.available()); + return USB_HOST_SERIAL.read(); + } +} + +#elif defined(__AVR__) +extern "C" { + + static FILE tty_stdio; + static FILE tty_stderr; + + static int NOTUSED(tty_stderr_putc(char c, NOTUSED(FILE *t))); + static int NOTUSED(tty_stderr_flush(NOTUSED(FILE *t))); + static int NOTUSED(tty_std_putc(char c, NOTUSED(FILE *t))); + static int NOTUSED(tty_std_getc(NOTUSED(FILE *t))); + static int NOTUSED(tty_std_flush(NOTUSED(FILE *t))); + + static int tty_stderr_putc(char c, NOTUSED(FILE *t)) { + USB_HOST_SERIAL.write(c); + return 0; + } + + static int tty_stderr_flush(NOTUSED(FILE *t)) { + USB_HOST_SERIAL.flush(); + return 0; + } + + static int tty_std_putc(char c, NOTUSED(FILE *t)) { + USB_HOST_SERIAL.write(c); + return 0; + } + + static int tty_std_getc(NOTUSED(FILE *t)) { + while(!USB_HOST_SERIAL.available()); + return USB_HOST_SERIAL.read(); + } + + static int tty_std_flush(NOTUSED(FILE *t)) { + USB_HOST_SERIAL.flush(); + return 0; + } +} +#elif defined(CORE_TEENSY) +extern "C" { + + int _write(int fd, const char *ptr, int len) { + int j; + for(j = 0; j < len; j++) { + if(fd == 1) + USB_HOST_SERIAL.write(*ptr++); + else if(fd == 2) + USB_HOST_SERIAL.write(*ptr++); + } + return len; + } + + int _read(int fd, char *ptr, int len) { + if(len > 0 && fd == 0) { + while(!USB_HOST_SERIAL.available()); + *ptr = USB_HOST_SERIAL.read(); + return 1; + } + return 0; + } + +#include + + int _fstat(int fd, struct stat *st) { + memset(st, 0, sizeof (*st)); + st->st_mode = S_IFCHR; + st->st_blksize = 1024; + return 0; + } + + int _isatty(int fd) { + return (fd < 3) ? 1 : 0; + } +} +#else +#error no STDIO +#endif // defined(ARDUINO_ARCH_PIC32) + + + +#ifdef __AVR__ +// The only wierdo in the bunch... +void UHS_AVR_printf_HELPER_init() { + // Set up stdio/stderr + tty_stdio.put = tty_std_putc; + tty_stdio.get = tty_std_getc; + tty_stdio.flags = _FDEV_SETUP_RW; + tty_stdio.udata = 0; + + tty_stderr.put = tty_stderr_putc; + tty_stderr.get = NULL; + tty_stderr.flags = _FDEV_SETUP_WRITE; + tty_stderr.udata = 0; + + stdout = &tty_stdio; + stdin = &tty_stdio; + stderr = &tty_stderr; + +} +#define UHS_printf_HELPER_init() UHS_AVR_printf_HELPER_init() +#endif + +#endif /* STDIO_IS_OK_TO_USE_AS_IS */ +#endif /* load.... */ + +#ifndef UHS_printf_HELPER_init +#define UHS_printf_HELPER_init() (void(0)) +#endif +#endif /* UHS_PRINTF_HELPER_H */ 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 new file mode 100644 index 00000000..bfa052b8 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_printhex.h @@ -0,0 +1,96 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if !defined(_UHS_host_h_) || defined(__PRINTHEX_H__) +#error "Never include UHS_printhex.h directly; include UHS_Usb.h instead" +#else +#define __PRINTHEX_H__ + +void E_Notifyc(char c, int lvl); + +template +void PrintHex(T val, int lvl) { + int num_nibbles = sizeof (T) * 2; + + do { + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + if(v > 57) v += 7; + E_Notifyc(v, lvl); + } while(--num_nibbles); +} + +template +void PrintBin(T val, int lvl) { + for(T mask = (((T)1) << ((sizeof (T) << 3) - 1)); mask; mask >>= 1) + if(val & mask) + E_Notifyc('1', lvl); + else + E_Notifyc('0', lvl); +} + +template +void SerialPrintHex(T val) { + int num_nibbles = sizeof (T) * 2; + + do { + char v = 48 + (((val >> (num_nibbles - 1) * 4)) & 0x0F); + if(v > 57) v += 7; + USB_HOST_SERIAL.print(v); + } while(--num_nibbles); +} + +template +void PrintHex2(Print *prn, T val) { + T mask = (((T)1) << (((sizeof (T) << 1) - 1) << 2)); + + while(mask > 1) { + if(val < mask) + prn->print("0"); + + mask >>= 4; + } + prn->print((T)val, HEX); +} + +#ifdef DEBUG_USB_HOST +template void D_PrintHex(T val, int lvl) { + PrintHex (val, lvl); +#else +template void D_PrintHex(NOTUSED(T val), NOTUSED(int lvl)) { +#endif +} + +#ifdef DEBUG_USB_HOST +template void D_PrintBin(T val, int lvl) { + PrintBin (val, lvl); +#else +template void D_PrintBin(NOTUSED(T val), NOTUSED(int lvl)) { +#endif +} + + + +#endif // __PRINTHEX_H__ 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 new file mode 100644 index 00000000..c516599d --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_settings.h @@ -0,0 +1,141 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef UHS_SETTINGS_H +#define UHS_SETTINGS_H + +// TO-DO: Move specific settings to modules which use them. + +//////////////////////////////////////////////////////////////////////////////// +// Define any of these options at the top of your sketch to override +// the defaults contained herewith. Do NOT do modifications here. +// Individual Components have their own settings. +// +// Macro | Settings and notes | Default +// -----------------------------+-----------------------+----------------------- +// | Any class that does | +// USB_HOST_SERIAL | text streaming | SERIAL_PORT_MONITOR +// | e.g. Serial2 | +// -----------------------------+-----------------------+----------------------- +// ENABLE_UHS_DEBUGGING | 0 = off, 1 = on | 0 +// -----------------------------+-----------------------+----------------------- +// | 0 = off, 1 = on | +// | Caution! Can make | +// DEBUG_PRINTF_EXTRA_HUGE | program too large! | 0 +// | Other modules depend | +// | on this setting. | +// -----------------------------+-----------------------+----------------------- +// USE_UHS_BLACK_WIDDOW | 0 = no, 1 = yes | 0 +// -----------------------------+-----------------------+----------------------- +// ENABLE_WII_IR_CAMERA | 0 = no, 1 = yes | 0 +// -----------------------------^-----------------------^----------------------- +// +//////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////// +// DEBUGGING +//////////////////////////////////////////////////////////////////////////////// + +#ifndef USB_HOST_SERIAL +#if defined(SERIAL_PORT_USBVIRTUAL) && defined(LOAD_UHS_KINETIS_FS_HOST) +#define USB_HOST_SERIAL SERIAL_PORT_HARDWARE +#else +#define USB_HOST_SERIAL SERIAL_PORT_MONITOR +#endif +#endif + +#ifndef ENABLE_UHS_DEBUGGING +#define ENABLE_UHS_DEBUGGING 0 +#endif + +#ifndef DEBUG_PRINTF_EXTRA_HUGE +#define DEBUG_PRINTF_EXTRA_HUGE 0 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Manual board activation +//////////////////////////////////////////////////////////////////////////////// + +/* Set this to 1 if you are using a Black Widdow */ +#ifndef USE_UHS_BLACK_WIDDOW +#define USE_UHS_BLACK_WIDDOW 0 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Wii IR camera +//////////////////////////////////////////////////////////////////////////////// + +/* Set this to 1 to activate code for the Wii IR camera */ +#ifndef ENABLE_WII_IR_CAMERA +#define ENABLE_WII_IR_CAMERA 0 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Set to 1 to use the faster spi4teensy3 driver. (not used yet)) +//////////////////////////////////////////////////////////////////////////////// +#ifndef USE_SPI4TEENSY3 +#define USE_SPI4TEENSY3 0 +#endif + +//////////////////////////////////////////////////////////////////////////////// +// AUTOMATIC Settings +//////////////////////////////////////////////////////////////////////////////// + +// No user serviceable parts below this line. +// DO NOT change anything below here unless you are a developer! + +#if defined(__GNUC__) && defined(__AVR__) +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#endif +#if GCC_VERSION < 40602 // Test for GCC < 4.6.2 +#ifdef PROGMEM +#undef PROGMEM +#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 +#endif +#endif +#endif +#endif + +#if !defined(DEBUG_USB_HOST) && ENABLE_UHS_DEBUGGING +#define DEBUG_USB_HOST +#endif + +#if !defined(WIICAMERA) && ENABLE_WII_IR_CAMERA +#define WIICAMERA +#endif + +#define UHS_SLEEP_MS(v) pUsb->sof_delay(v) + +#ifndef UHS_NI +#define UHS_NI __attribute__((noinline)) +#endif + +#endif /* SETTINGS_H */ 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 new file mode 100644 index 00000000..6486482d --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usb_ch9.h @@ -0,0 +1,222 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if !defined(_UHS_host_h_) || defined(_UHS_ch9_h_) +#error "Never include UHS_usb_ch9.h directly; include UHS_Usb.h instead" +#else + +/* USB chapter 9 structures */ +#define _UHS_ch9_h_ + +/* Misc.USB constants */ +#define DEV_DESCR_LEN 18 //device descriptor length +#define CONF_DESCR_LEN 9 //configuration descriptor length +#define INTR_DESCR_LEN 9 //interface descriptor length +#define EP_DESCR_LEN 7 //endpoint descriptor length + +/* Standard Device Requests */ +#define USB_REQUEST_GET_STATUS 0 // Standard Device Request - GET STATUS +#define USB_REQUEST_CLEAR_FEATURE 1 // Standard Device Request - CLEAR FEATURE +#define USB_REQUEST_SET_FEATURE 3 // Standard Device Request - SET FEATURE +#define USB_REQUEST_SET_ADDRESS 5 // Standard Device Request - SET ADDRESS +#define USB_REQUEST_GET_DESCRIPTOR 6 // Standard Device Request - GET DESCRIPTOR +#define USB_REQUEST_SET_DESCRIPTOR 7 // Standard Device Request - SET DESCRIPTOR +#define USB_REQUEST_GET_CONFIGURATION 8 // Standard Device Request - GET CONFIGURATION +#define USB_REQUEST_SET_CONFIGURATION 9 // Standard Device Request - SET CONFIGURATION +#define USB_REQUEST_GET_INTERFACE 10 // Standard Device Request - GET INTERFACE +#define USB_REQUEST_SET_INTERFACE 11 // Standard Device Request - SET INTERFACE +#define USB_REQUEST_SYNCH_FRAME 12 // Standard Device Request - SYNCH FRAME + +/* Wireless USB Device Requests */ +#define USB_REQ_SET_ENCRYPTION 0x0D +#define USB_REQ_GET_ENCRYPTION 0x0E +#define USB_REQ_RPIPE_ABORT 0x0E +#define USB_REQ_SET_HANDSHAKE 0x0F +#define USB_REQ_RPIPE_RESET 0x0F +#define USB_REQ_GET_HANDSHAKE 0x10 +#define USB_REQ_SET_CONNECTION 0x11 +#define USB_REQ_SET_SECURITY_DATA 0x12 +#define USB_REQ_GET_SECURITY_DATA 0x13 +#define USB_REQ_SET_WUSB_DATA 0x14 +#define USB_REQ_LOOPBACK_DATA_WRITE 0x15 +#define USB_REQ_LOOPBACK_DATA_READ 0x16 +#define USB_REQ_SET_INTERFACE_DS 0x17 + +/* USB feature flags */ +#define USB_DEVICE_SELF_POWERED 0 /* (read only) */ +#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ +#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ +#define USB_DEVICE_BATTERY 2 /* (wireless) */ +#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ +#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ +#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ +#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ +#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ + +#define USB_FEATURE_ENDPOINT_HALT 0 // CLEAR/SET FEATURE - Endpoint Halt +#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // CLEAR/SET FEATURE - Device remote wake-up +#define USB_FEATURE_TEST_MODE 2 // CLEAR/SET FEATURE - Test mode +/* OTG SET FEATURE Constants */ +#define OTG_FEATURE_B_HNP_ENABLE 3 // SET FEATURE OTG - Enable B device to perform HNP +#define OTG_FEATURE_A_HNP_SUPPORT 4 // SET FEATURE OTG - A device supports HNP +#define OTG_FEATURE_A_ALT_HNP_SUPPORT 5 // SET FEATURE OTG - Another port on the A device supports HNP + +/* Setup Data Constants */ +#define USB_SETUP_HOST_TO_DEVICE 0x00 // Device Request bmRequestType transfer direction - host to device transfer +#define USB_SETUP_DEVICE_TO_HOST 0x80 // Device Request bmRequestType transfer direction - device to host transfer +#define USB_SETUP_TYPE_STANDARD 0x00 // Device Request bmRequestType type - standard +#define USB_SETUP_TYPE_CLASS 0x20 // Device Request bmRequestType type - class +#define USB_SETUP_TYPE_VENDOR 0x40 // Device Request bmRequestType type - vendor +#define USB_SETUP_RECIPIENT_DEVICE 0x00 // Device Request bmRequestType recipient - device +#define USB_SETUP_RECIPIENT_INTERFACE 0x01 // Device Request bmRequestType recipient - interface +#define USB_SETUP_RECIPIENT_ENDPOINT 0x02 // Device Request bmRequestType recipient - endpoint +#define USB_SETUP_RECIPIENT_OTHER 0x03 // Device Request bmRequestType recipient - other +#define USB_SETUP_RECIPIENT_PORT 0x04 // Wireless USB 1.0 +#define USB_SETUP_RECIPIENT_RPIPE 0x05 // Wireless USB 1.0 + + +/* USB descriptors */ +#define USB_DESCRIPTOR_DEVICE 0x01 // bDescriptorType for a Device Descriptor. +#define USB_DESCRIPTOR_CONFIGURATION 0x02 // bDescriptorType for a Configuration Descriptor. +#define USB_DESCRIPTOR_STRING 0x03 // bDescriptorType for a String Descriptor. +#define USB_DESCRIPTOR_INTERFACE 0x04 // bDescriptorType for an Interface Descriptor. +#define USB_DESCRIPTOR_ENDPOINT 0x05 // bDescriptorType for an Endpoint Descriptor. +#define USB_DESCRIPTOR_DEVICE_QUALIFIER 0x06 // bDescriptorType for a Device Qualifier. +#define USB_DESCRIPTOR_OTHER_SPEED 0x07 // bDescriptorType for a Other Speed Configuration. +#define USB_DESCRIPTOR_INTERFACE_POWER 0x08 // bDescriptorType for Interface Power. +#define USB_DESCRIPTOR_OTG 0x09 // bDescriptorType for an OTG Descriptor. +#define USB_DESCRIPTOR_DEBUG 0x0A +#define USB_DESCRIPTOR_INTERFACE_ASSOCIATION 0x0B +#define USB_DESCRIPTOR_SECURITY 0x0C +#define USB_DESCRIPTOR_KEY 0x0D +#define USB_DESCRIPTOR_ENCRYPTION_TYPE 0x0E +#define USB_DESCRIPTOR_BOS 0x0F +#define USB_DESCRIPTOR_DEVICE_CAPABILITY 0x10 +#define USB_DESCRIPTOR_WIRELESS_ENDPOINT_COMP 0x11 +#define USB_DESCRIPTOR_WIRE_ADAPTER 0x21 +#define USB_DESCRIPTOR_RPIPE 0x22 +#define USB_DESCRIPTOR_CS_RADIO_CONTROL 0x23 +#define USB_DESCRIPTOR_SS_ENDPOINT_COMP 0x30 + +#define USB_HID_DESCRIPTOR 0x21 + + +// Conventional codes for class-specific descriptors. "Common Class" Spec (3.11) +#define USB_DESCRIPTOR_CS_DEVICE 0x21 +#define USB_DESCRIPTOR_CS_CONFIG 0x22 +#define USB_DESCRIPTOR_CS_STRING 0x23 +#define USB_DESCRIPTOR_CS_INTERFACE 0x24 +#define USB_DESCRIPTOR_CS_ENDPOINT 0x25 + + + +/* USB Endpoint Transfer Types */ +#define USB_TRANSFER_TYPE_CONTROL 0x00 // Endpoint is a control endpoint. +#define USB_TRANSFER_TYPE_ISOCHRONOUS 0x01 // Endpoint is an isochronous endpoint. +#define USB_TRANSFER_TYPE_BULK 0x02 // Endpoint is a bulk endpoint. +#define USB_TRANSFER_TYPE_INTERRUPT 0x03 // Endpoint is an interrupt endpoint. +#define bmUSB_TRANSFER_TYPE 0x03 // bit mask to separate transfer type from ISO attributes +#define USB_TRANSFER_DIRECTION_IN 0x80 // Indicate direction is IN + +/* Standard Feature Selectors for CLEAR_FEATURE Requests */ +#define USB_FEATURE_ENDPOINT_STALL 0 // Endpoint recipient +#define USB_FEATURE_DEVICE_REMOTE_WAKEUP 1 // Device recipient +#define USB_FEATURE_TEST_MODE 2 // Device recipient + +/* descriptor data structures */ + +/* Device descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // DEVICE descriptor type (USB_DESCRIPTOR_DEVICE). + uint16_t bcdUSB; // USB Spec Release Number (BCD). + uint8_t bDeviceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. + uint8_t bDeviceSubClass; // Subclass code (assigned by the USB-IF). + uint8_t bDeviceProtocol; // Protocol code (assigned by the USB-IF). 0xFF-Vendor specific. + uint8_t bMaxPacketSize0; // Maximum packet size for endpoint 0. + uint16_t idVendor; // Vendor ID (assigned by the USB-IF). + uint16_t idProduct; // Product ID (assigned by the manufacturer). + uint16_t bcdDevice; // Device release number (BCD). + uint8_t iManufacturer; // Index of String Descriptor describing the manufacturer. + 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; + +/* Configuration descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // CONFIGURATION descriptor type (USB_DESCRIPTOR_CONFIGURATION). + uint16_t wTotalLength; // Total length of all descriptors for this configuration. + uint8_t bNumInterfaces; // Number of interfaces in this configuration. + uint8_t bConfigurationValue; // Value of this configuration (1 based). + 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; + +/* Interface descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // INTERFACE descriptor type (USB_DESCRIPTOR_INTERFACE). + uint8_t bInterfaceNumber; // Number of this interface (0 based). + uint8_t bAlternateSetting; // Value of this alternate interface setting. + uint8_t bNumEndpoints; // Number of endpoints in this interface. + uint8_t bInterfaceClass; // Class code (assigned by the USB-IF). 0xFF-Vendor specific. + 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; + +/* Endpoint descriptor structure */ +typedef struct { + uint8_t bLength; // Length of this descriptor. + uint8_t bDescriptorType; // ENDPOINT descriptor type (USB_DESCRIPTOR_ENDPOINT). + uint8_t bEndpointAddress; // Endpoint address. Bit 7 indicates direction (0=OUT, 1=IN). + 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; + +/* HID descriptor */ +/* +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdHID; // HID class specification release + uint8_t bCountryCode; + uint8_t bNumDescriptors; // Number of additional class specific descriptors + uint8_t bDescrType; // Type of class descriptor + uint16_t wDescriptorLength; // Total size of the Report descriptor +} __attribute__((packed)) USB_HID_DESCRIPTOR; +*/ + +typedef struct { + uint8_t bDescrType; // Type of class descriptor + uint16_t wDescriptorLength; // Total size of the Report descriptor +} __attribute__((packed)) HID_CLASS_DESCRIPTOR_LEN_AND_TYPE; + +#endif // _ch9_h_ 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 new file mode 100644 index 00000000..b289a896 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -0,0 +1,449 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef _UHS_host_h_ +#error "Never include UHS_usbhost.h directly; include UHS_host.h instead" +#else +#ifndef _USBHOST_H_ +#define _USBHOST_H_ + +// Very early prototypes +#ifdef UHS_LOAD_BT +void UHS_BT_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei); +void UHS_BT_ScanUninitialized(UHS_USB_HOST_BASE *host); +void UHS_BT_Poll(UHS_USB_HOST_BASE *host); +#endif +#ifdef UHS_LOAD_HID +void UHS_HID_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei); +void UHS_HID_ScanUninitialized(UHS_USB_HOST_BASE *host); +void UHS_HID_Poll(UHS_USB_HOST_BASE *host); +#endif + +//#if defined(LOAD_UHS_CDC_ACM) || defined(LOAD_UHS_CDC_ACM_FTDI) || defined(LOAD_UHS_CDC_ACM_PROLIFIC) || defined(LOAD_UHS_CDC_ACM_XR21B1411) +//void UHS_CDC_ACM_SetUSBInterface(UHS_USB_HOST_BASE *host, ENUMERATION_INFO *ei); +//void UHS_CDC_ACM_ScanUninitialized(UHS_USB_HOST_BASE *host); +//void UHS_CDC_ACM_Poll(UHS_USB_HOST_BASE *host); +//#endif + +class UHS_USBInterface; // forward class declaration + +// enumerator to turn the VBUS on/off + +typedef enum { + vbus_on = 0, + vbus_off = 1 +} VBUS_t; + +// All host SEI use this base class + +class UHS_USB_HOST_BASE { +public: + AddressPool addrPool; + UHS_USBInterface* devConfig[UHS_HOST_MAX_INTERFACE_DRIVERS]; + volatile uint8_t usb_error; + volatile uint8_t usb_task_state; + volatile uint8_t usb_task_polling_disabled; + volatile uint8_t usb_host_speed; + volatile uint8_t hub_present; + + UHS_USB_HOST_BASE() { + for(uint16_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { + devConfig[i] = NULL; + } + usb_task_polling_disabled = 0; + usb_task_state = UHS_USB_HOST_STATE_INITIALIZE; //set up state machine + usb_host_speed = 0; + usb_error = 0; + }; + + ///////////////////////////////////////////// + // + // Virtual methods that interface to the SIE + // Overriding each is mandatory. + // + ///////////////////////////////////////////// + + /** + * Delay for x milliseconds + * Override if your controller provides an SOF IRQ, which may involve + * some sort of reentrant ISR or workaround with interrupts enabled. + * + * @param x how many milliseconds to delay + * @return true if delay completed without a state change, false if delay aborted + */ + virtual bool UHS_NI sof_delay(uint16_t x) { + if(!(usb_task_state & UHS_USB_HOST_STATE_MASK)) return false; + uint8_t current_state = usb_task_state; + while(current_state == usb_task_state && x--) { + delay(1); + } + return (current_state == usb_task_state); + }; + + virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t* dataptr)) { + return NULL; + }; + + virtual void UHS_NI vbusPower(NOTUSED(VBUS_t state)) { + }; + + virtual void UHS_NI Task() { + }; + + virtual uint8_t UHS_NI SetAddress(NOTUSED(uint8_t addr), NOTUSED(uint8_t ep), NOTUSED(UHS_EpInfo **ppep), NOTUSED(uint16_t &nak_limit)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t UHS_NI OutTransfer(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t nak_limit), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *data)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t UHS_NI InTransfer(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t nak_limit), NOTUSED(uint16_t *nbytesptr), NOTUSED(uint8_t *data)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t UHS_NI ctrlReqClose(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint8_t bmReqType), NOTUSED(uint16_t left), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *dataptr)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t UHS_NI ctrlReqRead(NOTUSED(UHS_EpInfo *pep), NOTUSED(uint16_t *left), NOTUSED(uint16_t *read), NOTUSED(uint16_t nbytes), NOTUSED(uint8_t *dataptr)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t UHS_NI dispatchPkt(NOTUSED(uint8_t token), NOTUSED(uint8_t ep), NOTUSED(uint16_t nak_limit)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t UHS_NI init() { + return 0; + }; + + virtual void UHS_NI doHostReset() { + }; + + virtual int16_t UHS_NI Init(NOTUSED(int16_t mseconds)) { + return -1; + }; + + virtual int16_t UHS_NI Init() { + return Init(INT16_MIN); + }; + + virtual uint8_t hwlPowerUp() { + /* This is for machine specific support to enable/power up the USB HW to operate*/ + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual uint8_t hwPowerDown() { + /* This is for machine specific support to disable/powerdown the USB Hw */ + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + virtual bool IsHub(uint8_t klass) { + return (klass == UHS_USB_CLASS_HUB); + }; + + virtual void UHS_NI suspend_host() { + // Used on MCU that lack control of IRQ priority (AVR). + // Suspends ISRs, for critical code. IRQ will be serviced after it is resumed. + // NOTE: you must track the state yourself! + }; + + virtual void UHS_NI resume_host() { + // Used on MCU that lack control of IRQ priority (AVR). + // Resumes ISRs. + // NOTE: you must track the state yourself! + }; + + ///////////////////////////////////////////// + // + // Built-ins, No need to override + // + ///////////////////////////////////////////// + // these two probably will go away, and won't be used, TBD + inline void Poll_Others() { +#ifdef UHS_LOAD_BT + UHS_BT_Poll(this); +#endif +#ifdef UHS_LOAD_HID + UHS_HID_Poll(this); +#endif + } + + inline void DisablePoll() { + noInterrupts(); + usb_task_polling_disabled++; + DDSB(); + interrupts(); + } + + inline void EnablePoll() { + noInterrupts(); + usb_task_polling_disabled--; + DDSB(); + interrupts(); + } + + 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); + + uint8_t UHS_NI EPClearHalt(uint8_t addr, uint8_t ep); + + uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr); + + uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr); + + uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); + + uint8_t UHS_NI setAddr(uint8_t oldaddr, uint8_t newaddr); + + uint8_t UHS_NI setConf(uint8_t addr, uint8_t conf_value); + + uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + + void UHS_NI ReleaseDevice(uint8_t addr); + + uint8_t UHS_NI Configuring(uint8_t parent, uint8_t port, uint8_t speed); + + void UHS_NI DeviceDefaults(uint8_t maxep, UHS_USBInterface *device); + + UHS_EpInfo* UHS_NI getEpInfoEntry(uint8_t addr, uint8_t ep); + + inline uint8_t getUsbTaskState() { + return ( usb_task_state); + }; + + inline AddressPool* GetAddressPool() { + return &addrPool; + }; + + int UHS_NI RegisterDeviceClass(UHS_USBInterface *pdev) { + for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) { + if(!devConfig[i]) { + devConfig[i] = pdev; + return i; + } + } + //return UHS_HOST_ERROR_CANT_REGISTER_DEVICE_CLASS; + return -1; + }; +#if 0 + + inline void ForEachUsbDevice(UsbDeviceHandleFunc pfunc) { + addrPool.ForEachUsbDevice(pfunc); + }; +#endif + + 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 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); + uint8_t getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset); + uint8_t eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum); + +}; + +// All device interface drivers use this subclass + +class UHS_USBInterface { +public: + + UHS_USB_HOST_BASE *pUsb; // Parent USB host + volatile uint8_t bNumEP; // total number of EP in this interface + volatile UHS_EpInfo epInfo[16]; // This is a stub, override in the driver. + + volatile uint8_t bAddress; // address of the device + volatile uint8_t bConfNum; // configuration number + volatile uint8_t bIface; // interface value + volatile bool bPollEnable; // poll enable flag, operating status + volatile uint32_t qNextPollTime; // next poll time + + /** + * Resets interface driver to unused state. You should override this in + * your driver if it requires extra class variable cleanup. + */ + virtual void DriverDefaults() { + printf("Default driver defaults.\r\n"); + pUsb->DeviceDefaults(bNumEP, this); + }; + + /** + * Checks if this interface is supported. + * Executed called when new devices are connected. + * + * @param ei + * @return true if the interface is supported + */ + virtual bool OKtoEnumerate(NOTUSED(ENUMERATION_INFO *ei)) { + return false; + }; + + /** + * Configures any needed endpoint information for an interface. + * You must provide this in your driver. + * Executed when new devices are connected and OKtoEnumerate() + * returned true. + * + * @param ei + * @return zero on success + */ + virtual uint8_t SetInterface(NOTUSED(ENUMERATION_INFO *ei)) { + return UHS_HOST_ERROR_NOT_IMPLEMENTED; + }; + + /** + * Interface specific additional setup and enumeration that + * can't occur when the descriptor stream is open. + * Also used for collection of unclaimed interfaces, to link to the master. + * + * @return zero on success + */ + virtual uint8_t Finalize() { + return 0; + }; + + /** + * Executed after interface is finalized but, before polling has started. + * + * @return 0 on success + */ + virtual uint8_t OnStart() { + return 0; + }; + + /** + * Start interface polling + * @return + */ + virtual uint8_t Start() { + uint8_t rcode = OnStart(); + if(!rcode) bPollEnable = true; + return rcode; + }; + + /** + * Executed before anything else in Release(). + */ + virtual void OnRelease() { + return; + }; + + /** + * Release resources when device is disconnected. + * Normally this does not need to be overridden. + */ + virtual void Release() { + OnRelease(); + DriverDefaults(); + return; + }; + + /** + * Executed After driver polls. + * Can be used when there is an important change detected during polling + * and you want to handle it elsewhere. + * Examples: + * Media status change for bulk, e.g. ready, not-ready, media changed, door opened. + * Button state/joystick position/etc changes on a HID device. + * Flow control status change on a communication device, e.g. CTS on serial + */ + virtual void OnPoll() { + return; + }; + + /** + * Poll interface driver. You should override this in your driver if you + * require polling faster or slower than every 100 milliseconds, or your + * driver requires special housekeeping. + */ + virtual void Poll() { + OnPoll(); + qNextPollTime = millis() + 100; + }; + + virtual bool UHS_NI Polling() { + return bPollEnable; + } + + /** + * This is only for a hub. + * @param port + */ + virtual void ResetHubPort(NOTUSED(uint8_t port)) { + return; + }; + +#if 0 + /** + * @return true if this interface is Vendor Specific. + */ + virtual bool IsVSI() { + return false; + } +#endif +}; + +#if 0 +/** + * Vendor Specific interface class. + * This is used by a partner interface. + * It can also be used to force-enumerate an interface that + * can use this interface directly. + * You can also add an instance of this class within the interface constructor + * if you expect the interface. + * + * If this is not needed, it may be removed. Nothing I have written needs this. + * Let me know if it is not required, then IsVSI method can also be shit-canned. + * -- AJK + */ + +class UHS_VSI : public UHS_USBInterface { +public: + volatile UHS_EpInfo epInfo[1]; + volatile ENUMERATION_INFO eInfo; + UHS_VSI(UHS_USB_HOST_BASE *p); + bool OKtoEnumerate(ENUMERATION_INFO *ei); + uint8_t SetInterface(ENUMERATION_INFO *ei); + virtual void DriverDefaults(); + virtual void Release(); + + uint8_t GetAddress() { + return bAddress; + }; + + virtual bool IsVSI() { + return true; + } + +}; +#endif + +#endif //_USBHOST_H_ +#endif 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 new file mode 100644 index 00000000..52015b59 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_util_INLINE.h @@ -0,0 +1,129 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if defined(LOAD_USB_HOST_SYSTEM) && !defined(USB_HOST_SYSTEM_UTIL_LOADED) +#define USB_HOST_SYSTEM_UTIL_LOADED + +// 0x80 is the default (i.e. trace) to turn off set this global to something lower. +// this allows for 126 other debugging levels. +// TO-DO: Allow assignment to a different serial port by software +int UsbDEBUGlvl = 0x80; + +void E_Notifyc(char c, int lvl) { + if(UsbDEBUGlvl < lvl) return; +#if defined(ARDUINO) && ARDUINO >=100 + USB_HOST_SERIAL.print(c); +#else + USB_HOST_SERIAL.print(c, BYTE); +#endif + //USB_HOST_SERIAL.flush(); +} + +void E_Notify(char const * msg, int lvl) { + if(UsbDEBUGlvl < lvl) return; + if(!msg) return; + char c; + + while((c = pgm_read_byte(msg++))) E_Notifyc(c, lvl); +} + +void E_NotifyStr(char const * msg, int lvl) { + if(UsbDEBUGlvl < lvl) return; + if(!msg) return; + char c; + + while((c = *msg++)) E_Notifyc(c, lvl); +} + +void E_Notify(uint8_t b, int lvl) { + if(UsbDEBUGlvl < lvl) return; +#if defined(ARDUINO) && ARDUINO >=100 + USB_HOST_SERIAL.print(b); +#else + USB_HOST_SERIAL.print(b, DEC); +#endif +} + +void E_Notify(double d, int lvl) { + if(UsbDEBUGlvl < lvl) return; + USB_HOST_SERIAL.print(d); +} + +#ifdef DEBUG_USB_HOST + +void NotifyFailGetDevDescr() { + Notify(PSTR("\r\ngetDevDescr "), 0x80); +} + +void NotifyFailSetDevTblEntry() { + Notify(PSTR("\r\nsetDevTblEn "), 0x80); +} + +void NotifyFailGetConfDescr() { + Notify(PSTR("\r\ngetConf "), 0x80); +} + +void NotifyFailSetConfDescr() { + Notify(PSTR("\r\nsetConf "), 0x80); +} + +void NotifyFailGetDevDescr(uint8_t reason) { + NotifyFailGetDevDescr(); + NotifyFail(reason); +} + +void NotifyFailSetDevTblEntry(uint8_t reason) { + NotifyFailSetDevTblEntry(); + NotifyFail(reason); + +} + +void NotifyFailGetConfDescr(uint8_t reason) { + NotifyFailGetConfDescr(); + NotifyFail(reason); +} + +void NotifyFailSetConfDescr(uint8_t reason) { + NotifyFailSetConfDescr(); + NotifyFail(reason); +} + +void NotifyFailUnknownDevice(uint16_t VID, uint16_t PID) { + Notify(PSTR("\r\nUnknown Device Connected - VID: "), 0x80); + D_PrintHex (VID, 0x80); + Notify(PSTR(" PID: "), 0x80); + D_PrintHex (PID, 0x80); +} + +void NotifyFail(uint8_t rcode) { + D_PrintHex (rcode, 0x80); + Notify(PSTR("\r\n"), 0x80); +} +#endif + +#else +#error "Never include UHS_util_INLINE.h, include UHS_host.h instead" +#endif 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 new file mode 100644 index 00000000..8ecafd4a --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/UHS_max3421e.h @@ -0,0 +1,226 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This software may be distributed and modified under the terms of the GNU +General Public License version 2 (GPL2) as published by the Free Software +Foundation and appearing in the file GPL2.TXT included in the packaging of +this file. Please note that GPL2 Section 2[b] requires that all works based +on this software must also be made publicly available under the terms of +the GPL2 ("Copyleft"). + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ +#if !defined(USB_HOST_SHIELD_H) || defined(_max3421e_h_) +#error "Never include UHS_max3421e.h directly; include USB_HOST_SHIELD.h instead" +#else + +#define _max3421e_h_ + +/* MAX3421E register/bit names and bitmasks */ + +#define SE0 0 +#define SE1 1 +#define FSHOST 2 +#define LSHOST 3 + +/* MAX3421E command byte format: rrrrr0wa where 'r' is register number */ + +// +// MAX3421E Registers in HOST mode. +// +#define rRCVFIFO 0x08 // Receive FIFO Register +#define rSNDFIFO 0x10 // Send FIFO Register +#define rSUDFIFO 0x20 // Set Up Data FIFO Register +#define rRCVBC 0x30 // Receive FIFO Byte Count Register +#define rSNDBC 0x38 // Send FIFO Byte Count Register + +// USB Interrupt Request Status (USBIRQ) +#define rUSBIRQ 0x68 // USB Interrupt Request Register +#define bmVBUSIRQ 0x40 // Vbus Present Interrupt Request +#define bmNOVBUSIRQ 0x20 // Vbus Absent Interrupt Request +#define bmOSCOKIRQ 0x01 // Oscillator OK Interrupt Request + +// USB Interrupt Request Control (USBIEN) +#define rUSBIEN 0x70 // USB Interrupt Request Enable Register +#define bmVBUSIE bmVBUSIRQ // Vbus Present Interrupt Request Enable +#define bmNOVBUSIE bmNOVBUSIRQ // Vbus Absent Interrupt Request Enable +#define bmOSCOKIE bmOSCOKIRQ // Oscillator OK Interrupt Request Enable + +// (USBCTL) +#define rUSBCTL 0x78 //15<<3 +#define bmCHIPRES 0x20 //b5 +#define bmPWRDOWN 0x10 //b4 + +// (CPUCTL) +#define rCPUCTL 0x80 //16<<3 +#define bmPUSLEWID1 0x80 //b7 +#define bmPULSEWID0 0x40 //b6 +#define bmIE 0x01 //b0 + +// bmPUSLEWID1 bmPULSEWID0 Pulse width +// 0 0 10.6uS +// 0 1 5.3uS +// 1 0 2.6uS +// 1 1 1.3uS +#define PUSLEWIDTH10_6 (0) +#define PUSLEWIDTH5_3 (bmPULSEWID0) +#define PUSLEWIDTH2_6 (bmPUSLEWID1) +#define PUSLEWIDTH1_3 (bmPULSEWID0 | bmPUSLEWID1) + +// (PINCTL) +#define rPINCTL 0x88 //17<<3 +#define bmFDUPSPI 0x10 //b4 +#define bmINTLEVEL 0x08 //b3 +#define bmPOSINT 0x04 //b2 +#define bmGPXB 0x02 //b1 +#define bmGPXA 0x01 //b0 + +// GPX pin selections +#define GPX_OPERATE 0x00 // +#define GPX_VBDET 0x01 // +#define GPX_BUSACT 0x02 // +#define GPX_SOF 0x03 // + +#define rREVISION 0x90 //18<<3 + +// (IOPINS1) +#define rIOPINS1 0xA0 //20<<3 +#define bmGPOUT0 0x01 // +#define bmGPOUT1 0x02 // +#define bmGPOUT2 0x04 // +#define bmGPOUT3 0x08 // +#define bmGPIN0 0x10 // +#define bmGPIN1 0x20 // +#define bmGPIN2 0x40 // +#define bmGPIN3 0x80 // + +// (IOPINS2) +#define rIOPINS2 0xA8 //21<<3 +#define bmGPOUT4 0x01 // +#define bmGPOUT5 0x02 // +#define bmGPOUT6 0x04 // +#define bmGPOUT7 0x08 // +#define bmGPIN4 0x10 // +#define bmGPIN5 0x20 // +#define bmGPIN6 0x40 // +#define bmGPIN7 0x80 // + +// (GPINIRQ) +#define rGPINIRQ 0xB0 //22<<3 +#define bmGPINIRQ0 0x01 // +#define bmGPINIRQ1 0x02 // +#define bmGPINIRQ2 0x04 // +#define bmGPINIRQ3 0x08 // +#define bmGPINIRQ4 0x10 // +#define bmGPINIRQ5 0x20 // +#define bmGPINIRQ6 0x40 // +#define bmGPINIRQ7 0x80 // + +// (GPINIEN) +#define rGPINIEN 0xB8 //23<<3 +#define bmGPINIEN0 0x01 // +#define bmGPINIEN1 0x02 // +#define bmGPINIEN2 0x04 // +#define bmGPINIEN3 0x08 // +#define bmGPINIEN4 0x10 // +#define bmGPINIEN5 0x20 // +#define bmGPINIEN6 0x40 // +#define bmGPINIEN7 0x80 // + +// (GPINPOL) +#define rGPINPOL 0xC0 //24<<3 +#define bmGPINPOL0 0x01 // +#define bmGPINPOL1 0x02 // +#define bmGPINPOL2 0x04 // +#define bmGPINPOL3 0x08 // +#define bmGPINPOL4 0x10 // +#define bmGPINPOL5 0x20 // +#define bmGPINPOL6 0x40 // +#define bmGPINPOL7 0x80 // + +// +// If any data transfer errors occur, the HXFRDNIRQ asserts, while the RCVDAVIRQ does not. +// +// The CPU clears the SNDBAVIRQ by writing the SNDBC register. +// The CPU should never directly clear the SNDBAVIRQ bit. + +// Host Interrupt Request Status (HIRQ) +#define rHIRQ 0xC8 // Host Interrupt Request Register +#define bmBUSEVENTIRQ 0x01 // BUS Reset Done or BUS Resume Interrupt Request +#define bmRWUIRQ 0x02 // Remote Wakeup Interrupt Request +#define bmRCVDAVIRQ 0x04 // Receive FIFO Data Available Interrupt Request +#define bmSNDBAVIRQ 0x08 // Send Buffer Available Interrupt Request +#define bmSUSDNIRQ 0x10 // Suspend operation Done Interrupt Request +#define bmCONDETIRQ 0x20 // Peripheral Connect/Disconnect Interrupt Request +#define bmFRAMEIRQ 0x40 // Frame Generator Interrupt Request +#define bmHXFRDNIRQ 0x80 // Host Transfer Done Interrupt Request + +// IRQs that are OK for the CPU to clear +#define ICLRALLBITS (bmBUSEVENTIRQ | bmRWUIRQ | bmRCVDAVIRQ | bmSUSDNIRQ | bmCONDETIRQ | bmFRAMEIRQ | bmHXFRDNIRQ) + +// Host Interrupt Request Control (HIEN) +#define rHIEN 0xD0 // +#define bmBUSEVENTIE bmBUSEVENTIRQ // BUS Reset Done or BUS Resume Interrupt Request Enable +#define bmRWUIE bmRWUIRQ // Remote Wakeup Interrupt Request Enable +#define bmRCVDAVIE bmRCVDAVIRQ // Receive FIFO Data Available Interrupt Request Enable +#define bmSNDBAVIE bmSNDBAVIRQ // Send Buffer Available Interrupt Request Enable +#define bmSUSDNIE bmSUSDNIRQ // Suspend operation Done Interrupt Request Enable +#define bmCONDETIE bmCONDETIRQ // Peripheral Connect/Disconnect Interrupt Request Enable +#define bmFRAMEIE bmFRAMEIRQ // Frame Generator Interrupt Request Enable +#define bmHXFRDNIE bmHXFRDNIRQ // Host Transfer Done Interrupt Request Enable + +// (MODE)) +#define rMODE 0xD8 //27<<3 +#define bmHOST 0x01 // +#define bmLOWSPEED 0x02 // +#define bmHUBPRE 0x04 // +#define bmSOFKAENAB 0x08 // +#define bmSEPIRQ 0x10 // +#define bmDELAYISO 0x20 // +#define bmDMPULLDN 0x40 // +#define bmDPPULLDN 0x80 // + +#define rPERADDR 0xE0 //28<<3 + +// (HCTL) +#define rHCTL 0xE8 //29<<3 +#define bmBUSRST 0x01 // +#define bmFRMRST 0x02 // +#define bmSAMPLEBUS 0x04 // +#define bmSIGRSM 0x08 // +#define bmRCVTOG0 0x10 // +#define bmRCVTOG1 0x20 // +#define bmSNDTOG0 0x40 // +#define bmSNDTOG1 0x80 // + +// Host transfer (HXFR) +#define rHXFR 0xF0 //30<<3 +/* Host transfer token values for writing the HXFR register (R30) */ +/* OR this bit field with the endpoint number in bits 3:0 */ +#define MAX3421E_tokSETUP 0x10 // HS=0, ISO=0, OUTNIN=0, SETUP=1 +#define MAX3421E_tokIN 0x00 // HS=0, ISO=0, OUTNIN=0, SETUP=0 +#define MAX3421E_tokOUT 0x20 // HS=0, ISO=0, OUTNIN=1, SETUP=0 +#define MAX3421E_tokINHS 0x80 // HS=1, ISO=0, OUTNIN=0, SETUP=0 +#define MAX3421E_tokOUTHS 0xA0 // HS=1, ISO=0, OUTNIN=1, SETUP=0 +#define MAX3421E_tokISOIN 0x40 // HS=0, ISO=1, OUTNIN=0, SETUP=0 +#define MAX3421E_tokISOOUT 0x60 // HS=0, ISO=1, OUTNIN=1, SETUP=0 + +// (HRSL) +#define rHRSL 0xF8 //31<<3 +#define bmRCVTOGRD 0x10 // +#define bmSNDTOGRD 0x20 // +#define bmKSTATUS 0x40 // +#define bmJSTATUS 0x80 // +#define bmSE0 0x00 //SE0 - disconnect state +#define bmSE1 0xC0 //SE1 - illegal state + +#define MODE_FS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmSOFKAENAB) +#define MODE_LS_HOST (bmDPPULLDN|bmDMPULLDN|bmHOST|bmLOWSPEED|bmSOFKAENAB) + +#endif //_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 new file mode 100644 index 00000000..56d64009 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h @@ -0,0 +1,519 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This software may be distributed and modified under the terms of the GNU +General Public License version 2 (GPL2) as published by the Free Software +Foundation and appearing in the file GPL2.TXT included in the packaging of +this file. Please note that GPL2 Section 2[b] requires that all works based +on this software must also be made publicly available under the terms of +the GPL2 ("Copyleft"). + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#ifndef USB_HOST_SHIELD_H +#define USB_HOST_SHIELD_H + +// uncomment to get 'printf' console debugging. NOT FOR UNO! +//#define DEBUG_PRINTF_EXTRA_HUGE_USB_HOST_SHIELD + +#ifdef LOAD_USB_HOST_SHIELD +#include "UHS_max3421e.h" +#include + + +#ifndef SPI_HAS_TRANSACTION +#error "Your SPI library installation is too old." +#else +#ifndef SPI_ATOMIC_VERSION +#warning "Your SPI library installation lacks 'SPI_ATOMIC_VERSION'. Please complain to the maintainer." +#elif SPI_ATOMIC_VERSION < 1 +#error "Your SPI library installation is too old." +#endif + +#endif +#if DEBUG_PRINTF_EXTRA_HUGE +#ifdef DEBUG_PRINTF_EXTRA_HUGE_USB_HOST_SHIELD +#define MAX_HOST_DEBUG(...) printf_P(__VA_ARGS__) +#else +#define MAX_HOST_DEBUG(...) VOID0 +#endif +#else +#define MAX_HOST_DEBUG(...) VOID0 +#endif + +#ifndef USB_HOST_SHIELD_USE_ISR +#ifdef USE_MULTIPLE_APP_API +#define USB_HOST_SHIELD_USE_ISR 0 +#else +#define USB_HOST_SHIELD_USE_ISR 1 +#endif +#else +#define USB_HOST_SHIELD_USE_ISR 1 +#endif + + + +#if !USB_HOST_SHIELD_USE_ISR +#error NOISR Polled mode _NOT SUPPORTED YET_ + +// +// Polled defaults +// +#ifdef BOARD_BLACK_WIDDOW +#define UHS_MAX3421E_SS_ 6 +#define UHS_MAX3421E_INT_ 3 +#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) +#if EXT_RAM +// Teensy++ 2.0 with XMEM2 +#define UHS_MAX3421E_SS_ 20 +#define UHS_MAX3421E_INT_ 7 +#else +#define UHS_MAX3421E_SS_ 9 +#define UHS_MAX3421E_INT_ 8 +#endif +#define UHS_MAX3421E_SPD +#elif defined(ARDUINO_AVR_ADK) +#define UHS_MAX3421E_SS_ 53 +#define UHS_MAX3421E_INT_ 54 +#elif defined(ARDUINO_AVR_BALANDUINO) +#define UHS_MAX3421E_SS_ 20 +#define UHS_MAX3421E_INT_ 19 +#else +#define UHS_MAX3421E_SS_ 10 +#define UHS_MAX3421E_INT_ 9 +#endif + +#else +#ifdef ARDUINO_ARCH_PIC32 +// PIC32 only allows edge interrupts, isn't that lovely? We'll emulate it... +#if CHANGE < 2 +#error core too old. +#endif + +#define IRQ_IS_EDGE 0 +#ifndef digitalPinToInterrupt +// great, this isn't implemented. +#warning digitalPinToInterrupt is not defined, complain here https://github.com/chipKIT32/chipKIT-core/issues/114 +#if defined(_BOARD_UNO_) || defined(_BOARD_UC32_) +#define digitalPinToInterrupt(p) ((p) == 2 ? 1 : ((p) == 7 ? 2 : ((p) == 8 ? 3 : ((p) == 35 ? 4 : ((p) == 38 ? 0 : NOT_AN_INTERRUPT))))) +#warning digitalPinToInterrupt is now defined until this is taken care of. +#else +#error digitalPinToInterrupt not defined for your board, complain here https://github.com/chipKIT32/chipKIT-core/issues/114 +#endif +#endif +#else +#define IRQ_IS_EDGE 0 +#endif + +// More stupidity from our friends @ Sony... +#ifdef ARDUINO_spresense_ast +#ifndef NOT_AN_INTERRUPT +#define NOT_AN_INTERRUPT -1 +#endif +#endif + +// SAMD uses an enum for this instead of a define. Isn't that just dandy? +#if !defined(NOT_AN_INTERRUPT) && !defined(ARDUINO_ARCH_SAMD) +#warning NOT_AN_INTERRUPT not defined, possible problems ahead. +#warning If NOT_AN_INTERRUPT is an enum or something else, complain to UHS30 developers on github. +#warning Otherwise complain to your board core developer/maintainer. +#define NOT_AN_INTERRUPT -1 +#endif + +// +// Interrupt defaults. Int0 or Int1 +// +#ifdef BOARD_BLACK_WIDDOW +#error "HELP! Please send us an email, I don't know the values for Int0 and Int1 on the Black Widow board!" +#elif defined(ARDUINO_AVR_ADK) +#define UHS_MAX3421E_SS_ 53 +#define UHS_MAX3421E_INT_ 54 +#elif defined(ARDUINO_spresense_ast) +#define UHS_MAX3421E_SS_ 21 +#define UHS_MAX3421E_INT_ 20 +#define SPIclass SPI5 +//#define UHS_MAX3421E_SPD 100000 +#elif defined(CORE_TEENSY) && (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) + +// TO-DO! + +#if EXT_RAM +// Teensy++ 2.0 with XMEM2 +#define UHS_MAX3421E_SS_ 20 +#define UHS_MAX3421E_INT_ 7 +#else +#define UHS_MAX3421E_SS_ 9 +#define UHS_MAX3421E_INT_ 8 +#endif + +#elif defined(ARDUINO_AVR_BALANDUINO) +#error "ISR mode is currently not supported on the Balanduino. Please set USB_HOST_SHIELD_USE_ISR to 0." +#else +#define UHS_MAX3421E_SS_ 10 +#ifdef __AVR__ +#ifdef __AVR_ATmega32U4__ +#define INT_FOR_PIN2 1 +#define INT_FOR_PIN3 0 +#else +// Everybody else??? +#define INT_FOR_PIN2 0 +#define INT_FOR_PIN3 1 +#endif +#define UHS_MAX3421E_INT_ 3 +#else +// Non-avr +#ifdef ARDUINO_ARCH_PIC32 +// UNO32 External Interrupts: +// Pin 38 (INT0), Pin 2 (INT1), Pin 7 (INT2), Pin 8 (INT3), Pin 35 (INT4) +#define UHS_MAX3421E_INT_ 7 +#else +#define UHS_MAX3421E_INT_ 9 +#endif +#endif +#endif +#endif + + + +#ifdef NO_AUTO_SPEED +// Ugly details section... +// MAX3421E characteristics +// SPI Serial - Clock Input. An external SPI master supplies SCLK with frequencies up to 26MHz. The +// logic level is referenced to the voltage on VL. Data is clocked into the SPI slave inter face on the +// rising edge of SCLK. Data is clocked out of the SPI slave interface on the falling edge of SCLK. +// Serial Clock (SCLK) Period 38.4ns minimum. 17ns minimum pulse width. VL >2.5V +// SCLK Fall to MISO Propagation Delay 14.2ns +// SCLK Fall to MOSI Propagation Delay 14.2ns +// SCLK Fall to MOSI Drive 3.5ns +// Theoretical deadline for reply 17.7ns +// 26MHz 38.4615ns period <-- MAX3421E theoretical maximum + +#ifndef UHS_MAX3421E_SPD +#ifdef ARDUINO_SAMD_ZERO +// Zero violates spec early, needs a long setup time, or doesn't like high latency. +#define UHS_MAX3421E_SPD 10000000 +#elif defined(ARDUINO_ARCH_PIC32) +// PIC MX 5/6/7 characteristics +// 25MHZ 40ns period <-- PIC MX 5/6/7 theoretical maximum +// pulse width minimum Tsclk/2ns +// Trise/fall 10ns maximum. 5ns is typical but not guaranteed. +// Tsetup minimum for MISO 10ns. +// We are in violation by 7.7ns @ 25MHz due to latency alone. +// Even reading at end of data cycle, we only have a 2.3ns window. +// This is too narrow to to compensate for capacitance, trace lengths, and noise. + +// 17.7ns + 10ns = 27.7ns +// 18MHz fits and has enough slack time to compensate for capacitance, trace lengths, and noise. +// For high speeds the SMP bit is recommended too, which samples at the end instead of the middle. +// 20Mhz seems to work. + +#define UHS_MAX3421E_SPD 20000000 +#else +#define UHS_MAX3421E_SPD 25000000 +#endif +#endif +#else +// We start at 25MHz, and back down until hardware can take it. +// Of course, SPI library can adjust this for us too. +// Why not 26MHz? Because I have not found any MCU board that +// can actually go that fast without problems. +// Could be a shield limitation too. +#ifndef UHS_MAX3421E_SPD +#define UHS_MAX3421E_SPD 25000000 +#endif +#endif + +#ifndef UHS_MAX3421E_INT +#define UHS_MAX3421E_INT UHS_MAX3421E_INT_ +#endif + +#ifndef UHS_MAX3421E_SS +#define UHS_MAX3421E_SS UHS_MAX3421E_SS_ +#endif + +// NOTE: On the max3421e the irq enable and irq bits are in the same position. + +// IRQs used if CPU polls +#define ENIBITSPOLLED (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE) +// IRQs used if CPU is interrupted +#define ENIBITSISR (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE /* | bmRCVDAVIRQ | bmSNDBAVIRQ | bmHXFRDNIRQ */ ) + +#if !USB_HOST_SHIELD_USE_ISR +#define IRQ_CHECK_MASK (ENIBITSPOLLED & ICLRALLBITS) +#define IRQ_IS_EDGE 0 +#else +#define IRQ_CHECK_MASK (ENIBITSISR & ICLRALLBITS) +#endif + +#if IRQ_IS_EDGE +// Note: UNO32 Interrupts can only be RISING, or FALLING. +// This poses an interesting problem, since we want to use a LOW level. +// The MAX3421E provides for pulse width control for an IRQ. +// We do need to watch the timing on this, as a second IRQ could cause +// a missed IRQ, since we read the level of the line to check if the IRQ +// is actually for this chip. The only other alternative is to add a capacitor +// and an NPN transistor, and use two lines. We can try this first, though. +// Worse case, we can ignore reading the pin for verification on UNO32. +// Too bad there is no minimum low width setting. +// +// Single Clear First Second Clear first Clear last +// IRQ Single IRQ IRQ Second active pending IRQ +// | | | | | | +// V V V V V V +// _____ _________ _ _ _______ +// |______| |______| |______| |______________| +// +#define IRQ_SENSE FALLING +#ifdef ARDUINO_ARCH_PIC32 +//#define bmPULSEWIDTH PUSLEWIDTH10_6 +#define bmPULSEWIDTH 0 +#define bmIRQ_SENSE 0 +#else +#define bmPULSEWIDTH PUSLEWIDTH1_3 +#define bmIRQ_SENSE 0 +#endif +#else +#ifndef IRQ_SENSE +#define IRQ_SENSE LOW +#endif +#ifndef bmPULSEWIDTH +#define bmPULSEWIDTH 0 +#endif +#ifndef bmIRQ_SENSE +#define bmIRQ_SENSE bmINTLEVEL +#endif +#endif + +class MAX3421E_HOST : +public UHS_USB_HOST_BASE +#ifdef SWI_IRQ_NUM +, public dyn_SWI +#endif +{ + // TO-DO: move these into the parent class. + volatile uint8_t vbusState; + volatile uint16_t sof_countdown; + + // TO-DO: pack into a struct/union and use one byte + volatile bool busevent; + volatile bool sofevent; + volatile bool counted; + volatile bool condet; + volatile bool doingreset; + + #ifdef USB_HOST_MANUAL_POLL + volatile bool frame_irq_enabled = false; + + bool enable_frame_irq(bool enable) { + const bool prev_state = frame_irq_enabled; + if(prev_state != enable) { + if(enable) + regWr(rHIEN, regRd(rHIEN) | bmFRAMEIE); + else + regWr(rHIEN, regRd(rHIEN) & ~bmFRAMEIE); + frame_irq_enabled = enable; + } + return prev_state; + } + #endif + +public: + SPISettings MAX3421E_SPI_Settings; + uint8_t ss_pin; + uint8_t irq_pin; + // Will use the defaults UHS_MAX3421E_SS, UHS_MAX3421E_INT and speed + + UHS_NI MAX3421E_HOST() { + sof_countdown = 0; + busevent = false; + doingreset = false; + sofevent = false; + condet = false; + ss_pin = UHS_MAX3421E_SS; + irq_pin = UHS_MAX3421E_INT; + MAX3421E_SPI_Settings = SPISettings(UHS_MAX3421E_SPD, MSBFIRST, SPI_MODE0); + hub_present = 0; + }; + + // Will use user supplied pins, and UHS_MAX3421E_SPD + + UHS_NI MAX3421E_HOST(uint8_t pss, uint8_t pirq) { + sof_countdown = 0; + busevent = false; + doingreset = false; + sofevent = false; + condet = false; + ss_pin = pss; + irq_pin = pirq; + MAX3421E_SPI_Settings = SPISettings(UHS_MAX3421E_SPD, MSBFIRST, SPI_MODE0); + hub_present = 0; + }; + + // Will use user supplied pins, and speed + + UHS_NI MAX3421E_HOST(uint8_t pss, uint8_t pirq, uint32_t pspd) { + sof_countdown = 0; + doingreset = false; + busevent = false; + sofevent = false; + condet = false; + ss_pin = pss; + irq_pin = pirq; + MAX3421E_SPI_Settings = SPISettings(pspd, MSBFIRST, SPI_MODE0); + hub_present = 0; + }; + + virtual bool UHS_NI sof_delay(uint16_t x) { +#ifdef USB_HOST_MANUAL_POLL + const bool saved_irq_state = enable_frame_irq(true); +#endif + sof_countdown = x; + while((sof_countdown != 0) && !condet) { + SYSTEM_OR_SPECIAL_YIELD(); +#if !USB_HOST_SHIELD_USE_ISR + Task(); +#endif + } +#ifdef USB_HOST_MANUAL_POLL + enable_frame_irq(saved_irq_state); +#endif + // Serial.println("...Wake"); + return (!condet); + }; + + virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t* dataptr); + + virtual void UHS_NI vbusPower(VBUS_t state) { + regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE) | (uint8_t)(state)); + }; + + void UHS_NI Task(); + + virtual uint8_t SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo **ppep, uint16_t &nak_limit); + virtual uint8_t OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data); + virtual uint8_t InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data); + virtual uint8_t ctrlReqClose(UHS_EpInfo *pep, uint8_t bmReqType, uint16_t left, uint16_t nbytes, uint8_t *dataptr); + virtual uint8_t ctrlReqRead(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint16_t nbytes, uint8_t *dataptr); + virtual uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); + + void UHS_NI ReleaseChildren() { + for(uint8_t i = 0; i < UHS_HOST_MAX_INTERFACE_DRIVERS; i++) + if(devConfig[i]) + devConfig[i]->Release(); + hub_present = 0; + }; + + virtual bool IsHub(uint8_t klass) { + if(klass == UHS_USB_CLASS_HUB) { + hub_present = bmHUBPRE; + return true; + } + return false; + }; + + virtual void VBUS_changed(); + + virtual void UHS_NI doHostReset() { +#if USB_HOST_SHIELD_USE_ISR + // Enable interrupts + noInterrupts(); +#endif + doingreset = true; + busevent = true; + regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet. + regWr(rHCTL, bmBUSRST); //issue bus reset +#if USB_HOST_SHIELD_USE_ISR + DDSB(); + // Enable interrupts + interrupts(); +#endif + while(busevent) { + DDSB(); + SYSTEM_OR_SPECIAL_YIELD(); + } +#endif +#if USB_HOST_SHIELD_USE_ISR + // Enable interrupts + noInterrupts(); +#endif + #ifdef USB_HOST_MANUAL_POLL + enable_frame_irq(true); + #endif + sofevent = true; +#if USB_HOST_SHIELD_USE_ISR + DDSB(); + // Enable interrupts + interrupts(); +#endif + // Wait for SOF + while(sofevent) { + } +#if USB_HOST_SHIELD_USE_ISR + // Enable interrupts + noInterrupts(); +#endif + doingreset = false; +#if USB_HOST_SHIELD_USE_ISR + DDSB(); + // Enable interrupts + interrupts(); + }; + + + int16_t UHS_NI Init(int16_t mseconds); + + int16_t UHS_NI Init() { + return Init(INT16_MIN); + }; + + void ISRTask(); + void ISRbottom(); + void busprobe(); + uint16_t reset(); + + // MAX3421e specific + void regWr(uint8_t reg, uint8_t data); + void gpioWr(uint8_t data); + uint8_t regRd(uint8_t reg); + uint8_t gpioRd(); + uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + + // ARM/NVIC specific, used to emulate reentrant ISR. +#ifdef SWI_IRQ_NUM + + void dyn_SWISR() { + ISRbottom(); + }; +#endif + + virtual void UHS_NI suspend_host() { + // Used on MCU that lack control of IRQ priority (AVR). + // Suspends ISRs, for critical code. IRQ will be serviced after it is resumed. + // NOTE: you must track the state yourself! +#ifdef __AVR__ + noInterrupts(); + detachInterrupt(UHS_GET_DPI(irq_pin)); + interrupts(); +#endif + }; + + virtual void UHS_NI resume_host(); +}; +#ifndef SPIclass +#define SPIclass SPI +#endif +#ifndef USB_HOST_SHIELD_LOADED +#include "USB_HOST_SHIELD_INLINE.h" +#endif +#else +#error "define LOAD_USB_HOST_SHIELD in your sketch, never include USB_HOST_SHIELD.h in a driver." +#endif +#endif /* USB_HOST_SHIELD_H */ 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 new file mode 100644 index 00000000..f7dd315a --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h @@ -0,0 +1,1003 @@ +/* Copyright (C) 2015-2016 Andrew J. Kroll + and +Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. + +This software may be distributed and modified under the terms of the GNU +General Public License version 2 (GPL2) as publishe7d by the Free Software +Foundation and appearing in the file GPL2.TXT included in the packaging of +this file. Please note that GPL2 Section 2[b] requires that all works based +on this software must also be made publicly available under the terms of +the GPL2 ("Copyleft"). + +Contact information +------------------- + +Circuits At Home, LTD +Web : https://www.circuitsathome.com +e-mail : support@circuitsathome.com + */ + +#if defined(USB_HOST_SHIELD_H) && !defined(USB_HOST_SHIELD_LOADED) +#define USB_HOST_SHIELD_LOADED +#include + +#ifndef digitalPinToInterrupt +#error digitalPinToInterrupt not defined, complain to your board maintainer. +#endif + + +#if USB_HOST_SHIELD_USE_ISR + +// allow two slots. this makes the maximum allowed shield count TWO +// for AVRs this is limited to pins 2 and 3 ONLY +// for all other boards, one odd and one even pin number is allowed. +static MAX3421E_HOST *ISReven; +static MAX3421E_HOST *ISRodd; + +static void UHS_NI call_ISReven() { + ISReven->ISRTask(); +} + +static void UHS_NI call_ISRodd() { + UHS_PIN_WRITE(LED_BUILTIN, HIGH); + ISRodd->ISRTask(); +} +#endif + + +void UHS_NI MAX3421E_HOST::resume_host() { + // Used on MCU that lack control of IRQ priority (AVR). + // Resumes ISRs. + // NOTE: you must track the state yourself! +#ifdef __AVR__ + noInterrupts(); + if(irq_pin & 1) { + ISRodd = this; + attachInterrupt(UHS_GET_DPI(irq_pin), call_ISRodd, IRQ_SENSE); + } else { + ISReven = this; + attachInterrupt(UHS_GET_DPI(irq_pin), call_ISReven, IRQ_SENSE); + } + interrupts(); +#endif + +} +/* write single byte into MAX3421e register */ +void UHS_NI MAX3421E_HOST::regWr(uint8_t reg, uint8_t data) { + SPIclass.beginTransaction(MAX3421E_SPI_Settings); + MARLIN_UHS_WRITE_SS(LOW); + SPIclass.transfer(reg | 0x02); + SPIclass.transfer(data); + MARLIN_UHS_WRITE_SS(HIGH); + SPIclass.endTransaction(); +} + + +/* multiple-byte write */ + +/* returns a pointer to memory position after last written */ +uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { + SPIclass.beginTransaction(MAX3421E_SPI_Settings); + MARLIN_UHS_WRITE_SS(LOW); + SPIclass.transfer(reg | 0x02); + //printf("%2.2x :", reg); + + while(nbytes) { + SPIclass.transfer(*data_p); + //printf("%2.2x ", *data_p); + nbytes--; + data_p++; // advance data pointer + } + MARLIN_UHS_WRITE_SS(HIGH); + SPIclass.endTransaction(); + //printf("\r\n"); + return (data_p); +} +/* GPIO write */ +/*GPIO byte is split between 2 registers, so two writes are needed to write one byte */ + +/* GPOUT bits are in the low nibble. 0-3 in IOPINS1, 4-7 in IOPINS2 */ +void UHS_NI MAX3421E_HOST::gpioWr(uint8_t data) { + regWr(rIOPINS1, data); + data >>= 4; + regWr(rIOPINS2, data); + return; +} + +/* single host register read */ +uint8_t UHS_NI MAX3421E_HOST::regRd(uint8_t reg) { + SPIclass.beginTransaction(MAX3421E_SPI_Settings); + MARLIN_UHS_WRITE_SS(LOW); + SPIclass.transfer(reg); + uint8_t rv = SPIclass.transfer(0); + MARLIN_UHS_WRITE_SS(HIGH); + SPIclass.endTransaction(); + return (rv); +} +/* multiple-byte register read */ + +/* returns a pointer to a memory position after last read */ +uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { + SPIclass.beginTransaction(MAX3421E_SPI_Settings); + MARLIN_UHS_WRITE_SS(LOW); + SPIclass.transfer(reg); + while(nbytes) { + *data_p++ = SPIclass.transfer(0); + nbytes--; + } + MARLIN_UHS_WRITE_SS(HIGH); + SPIclass.endTransaction(); + return ( data_p); +} + +/* GPIO read. See gpioWr for explanation */ + +/* GPIN pins are in high nibbles of IOPINS1, IOPINS2 */ +uint8_t UHS_NI MAX3421E_HOST::gpioRd() { + uint8_t gpin = 0; + gpin = regRd(rIOPINS2); //pins 4-7 + gpin &= 0xF0; //clean lower nibble + gpin |= (regRd(rIOPINS1) >> 4); //shift low bits and OR with upper from previous operation. + return ( gpin); +} + +/* reset MAX3421E. Returns number of microseconds it took for PLL to stabilize after reset + or zero if PLL haven't stabilized in 65535 cycles */ +uint16_t UHS_NI MAX3421E_HOST::reset() { + uint16_t i = 0; + + // Initiate chip reset + regWr(rUSBCTL, bmCHIPRES); + regWr(rUSBCTL, 0x00); + + int32_t now; + uint32_t expires = micros() + 65535; + + // Enable full-duplex SPI so we can read rUSBIRQ + regWr(rPINCTL, bmFDUPSPI); + while((int32_t)(micros() - expires) < 0L) { + if((regRd(rUSBIRQ) & bmOSCOKIRQ)) { + break; + } + } + now = (int32_t)(micros() - expires); + if(now < 0L) { + i = 65535 + now; // Note this subtracts, as now is negative + } + return (i); +} + +void UHS_NI MAX3421E_HOST::VBUS_changed() { + /* modify USB task state because Vbus changed or unknown */ + uint8_t speed = 1; + //printf("\r\n\r\n\r\n\r\nSTATE %2.2x -> ", usb_task_state); + switch(vbusState) { + case LSHOST: // Low speed + + speed = 0; + // Intentional fall-through + case FSHOST: // Full speed + // Start device initialization if we are not initializing + // Resets to the device cause an IRQ + // usb_task_state == UHS_USB_HOST_STATE_RESET_NOT_COMPLETE; + //if((usb_task_state & UHS_USB_HOST_STATE_MASK) != UHS_USB_HOST_STATE_DETACHED) { + ReleaseChildren(); + if(!doingreset) { + if(usb_task_state == UHS_USB_HOST_STATE_RESET_NOT_COMPLETE) { + usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY; + } else if(usb_task_state != UHS_USB_HOST_STATE_WAIT_BUS_READY) { + usb_task_state = UHS_USB_HOST_STATE_DEBOUNCE; + } + } + sof_countdown = 0; + break; + case SE1: //illegal state + sof_countdown = 0; + doingreset = false; + ReleaseChildren(); + usb_task_state = UHS_USB_HOST_STATE_ILLEGAL; + break; + case SE0: //disconnected + default: + sof_countdown = 0; + doingreset = false; + ReleaseChildren(); + usb_task_state = UHS_USB_HOST_STATE_IDLE; + break; + } + usb_host_speed = speed; + //printf("0x%2.2x\r\n\r\n\r\n\r\n", usb_task_state); + return; +}; + +/** + * Probe bus to determine device presence and speed, + * then switch host to detected speed. + */ +void UHS_NI MAX3421E_HOST::busprobe() { + uint8_t bus_sample; + uint8_t tmpdata; + bus_sample = regRd(rHRSL); //Get J,K status + bus_sample &= (bmJSTATUS | bmKSTATUS); //zero the rest of the byte + switch(bus_sample) { //start full-speed or low-speed host + case(bmJSTATUS): + // Serial.println("J"); + if((regRd(rMODE) & bmLOWSPEED) == 0) { + regWr(rMODE, MODE_FS_HOST); // start full-speed host + vbusState = FSHOST; + } else { + regWr(rMODE, MODE_LS_HOST); // start low-speed host + vbusState = LSHOST; + } + #ifdef USB_HOST_MANUAL_POLL + enable_frame_irq(true); + #endif + tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation + regWr(rHIRQ, bmFRAMEIRQ); // see data sheet. + regWr(rMODE, tmpdata); + break; + case(bmKSTATUS): + // Serial.println("K"); + if((regRd(rMODE) & bmLOWSPEED) == 0) { + regWr(rMODE, MODE_LS_HOST); // start low-speed host + vbusState = LSHOST; + } else { + regWr(rMODE, MODE_FS_HOST); // start full-speed host + vbusState = FSHOST; + } + #ifdef USB_HOST_MANUAL_POLL + enable_frame_irq(true); + #endif + tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation + regWr(rHIRQ, bmFRAMEIRQ); // see data sheet. + regWr(rMODE, tmpdata); + break; + case(bmSE1): //illegal state + // Serial.println("I"); + regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); + vbusState = SE1; + // sofevent = false; + break; + case(bmSE0): //disconnected state + // Serial.println("D"); + regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); + vbusState = SE0; + // sofevent = false; + break; + }//end switch( bus_sample ) +} + +/** + * Initialize USB hardware, turn on VBUS + * + * @param mseconds Delay energizing VBUS after mseconds, A value of INT16_MIN means no delay. + * @return 0 on success, -1 on error + */ +int16_t UHS_NI MAX3421E_HOST::Init(int16_t mseconds) { + usb_task_state = UHS_USB_HOST_STATE_INITIALIZE; //set up state machine + // Serial.print("MAX3421E 'this' USB Host @ 0x"); + // Serial.println((uint32_t)this, HEX); + // Serial.print("MAX3421E 'this' USB Host Address Pool @ 0x"); + // Serial.println((uint32_t)GetAddressPool(), HEX); + Init_dyn_SWI(); + UHS_printf_HELPER_init(); + noInterrupts(); +#ifdef ARDUINO_AVR_ADK + // For Mega ADK, which has a Max3421e on-board, + // set MAX_RESET to output mode, and then set it to HIGH + // PORTJ bit 2 + if(irq_pin == 54) { + DDRJ |= 0x04; // output + PORTJ |= 0x04; // HIGH + } +#endif + SPIclass.begin(); +#ifdef ARDUINO_AVR_ADK + if(irq_pin == 54) { + DDRE &= ~0x20; // input + PORTE |= 0x20; // pullup + } else +#endif + pinMode(irq_pin, INPUT_PULLUP); + //UHS_PIN_WRITE(irq_pin, HIGH); + pinMode(ss_pin, OUTPUT); + MARLIN_UHS_WRITE_SS(HIGH); + +#ifdef USB_HOST_SHIELD_TIMING_PIN + pinMode(USB_HOST_SHIELD_TIMING_PIN, OUTPUT); + // My counter/timer can't work on an inverted gate signal + // so we gate using a high pulse -- AJK + UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, LOW); +#endif + interrupts(); + +#if USB_HOST_SHIELD_USE_ISR + int intr = digitalPinToInterrupt(irq_pin); + if(intr == NOT_AN_INTERRUPT) { +#ifdef ARDUINO_AVR_ADK + if(irq_pin == 54) + intr = 6; + else +#endif + return (-2); + } + SPIclass.usingInterrupt(intr); +#else + SPIclass.usingInterrupt(255); +#endif +#ifndef NO_AUTO_SPEED + // test to get to reset acceptance. + uint32_t spd = UHS_MAX3421E_SPD; +again: + MAX3421E_SPI_Settings = SPISettings(spd, MSBFIRST, SPI_MODE0); + if(reset() == 0) { + MAX_HOST_DEBUG(PSTR("Fail SPI speed %lu\r\n"), spd); + if(spd > 1999999) { + spd -= 1000000; + goto again; + } + return (-1); + } else { + // reset passes, does 64k? + uint8_t sample_wr = 0; + uint8_t sample_rd = 0; + uint8_t gpinpol_copy = regRd(rGPINPOL); + for(uint16_t j = 0; j < 65535; j++) { + regWr(rGPINPOL, sample_wr); + sample_rd = regRd(rGPINPOL); + if(sample_rd != sample_wr) { + MAX_HOST_DEBUG(PSTR("Fail SPI speed %lu\r\n"), spd); + if(spd > 1999999) { + spd -= 1000000; + goto again; + } + return (-1); + } + sample_wr++; + } + regWr(rGPINPOL, gpinpol_copy); + } + + MAX_HOST_DEBUG(PSTR("Pass SPI speed %lu\r\n"), spd); +#endif + + if(reset() == 0) { //OSCOKIRQ hasn't asserted in time + MAX_HOST_DEBUG(PSTR("OSCOKIRQ hasn't asserted in time")); + return ( -1); + } + + /* MAX3421E - full-duplex SPI, interrupt kind, vbus off */ + regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE | GPX_VBDET)); + + // Delay a minimum of 1 second to ensure any capacitors are drained. + // 1 second is required to make sure we do not smoke a Microdrive! + if(mseconds != INT16_MIN) { + if(mseconds < 1000) mseconds = 1000; + delay(mseconds); // We can't depend on SOF timer here. + } + + regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host + + // Enable interrupts on the MAX3421e + regWr(rHIEN, IRQ_CHECK_MASK); + // Enable interrupt pin on the MAX3421e, set pulse width for edge + regWr(rCPUCTL, (bmIE | bmPULSEWIDTH)); + + /* check if device is connected */ + regWr(rHCTL, bmSAMPLEBUS); // sample USB bus + while(!(regRd(rHCTL) & bmSAMPLEBUS)); //wait for sample operation to finish + + busprobe(); //check if anything is connected + VBUS_changed(); + + // GPX pin on. This is done here so that a change is detected if we have a switch connected. + /* MAX3421E - full-duplex SPI, interrupt kind, vbus on */ + regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE)); + regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet. + regWr(rHCTL, bmBUSRST); // issue bus reset to force generate yet another possible IRQ + + +#if USB_HOST_SHIELD_USE_ISR + // Attach ISR to service IRQ from MAX3421e + noInterrupts(); + if(irq_pin & 1) { + ISRodd = this; + attachInterrupt(UHS_GET_DPI(irq_pin), call_ISRodd, IRQ_SENSE); + } else { + ISReven = this; + attachInterrupt(UHS_GET_DPI(irq_pin), call_ISReven, IRQ_SENSE); + } + interrupts(); +#endif + //printf("\r\nrPINCTL 0x%2.2X\r\n", rPINCTL); + //printf("rCPUCTL 0x%2.2X\r\n", rCPUCTL); + //printf("rHIEN 0x%2.2X\r\n", rHIEN); + //printf("irq_pin %i\r\n", irq_pin); + return 0; +} + +/** + * Setup UHS_EpInfo structure + * + * @param addr USB device address + * @param ep Endpoint + * @param ppep pointer to the pointer to a valid UHS_EpInfo structure + * @param nak_limit how many NAKs before aborting + * @return 0 on success + */ +uint8_t UHS_NI MAX3421E_HOST::SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo **ppep, uint16_t &nak_limit) { + UHS_Device *p = addrPool.GetUsbDevicePtr(addr); + + if(!p) + return UHS_HOST_ERROR_NO_ADDRESS_IN_POOL; + + if(!p->epinfo) + return UHS_HOST_ERROR_NULL_EPINFO; + + *ppep = getEpInfoEntry(addr, ep); + + if(!*ppep) + return UHS_HOST_ERROR_NO_ENDPOINT_IN_TABLE; + + nak_limit = (0x0001UL << (((*ppep)->bmNakPower > UHS_USB_NAK_MAX_POWER) ? UHS_USB_NAK_MAX_POWER : (*ppep)->bmNakPower)); + nak_limit--; + /* + USBTRACE2("\r\nAddress: ", addr); + USBTRACE2(" EP: ", ep); + USBTRACE2(" NAK Power: ",(*ppep)->bmNakPower); + USBTRACE2(" NAK Limit: ", nak_limit); + USBTRACE("\r\n"); + */ + regWr(rPERADDR, addr); //set peripheral address + + uint8_t mode = regRd(rMODE); + + //Serial.print("\r\nMode: "); + //Serial.println( mode, HEX); + //Serial.print("\r\nLS: "); + //Serial.println(p->speed, HEX); + + // Set bmLOWSPEED and bmHUBPRE in case of low-speed device, reset them otherwise + regWr(rMODE, (p->speed) ? mode & ~(bmHUBPRE | bmLOWSPEED) : mode | bmLOWSPEED | hub_present); + + return 0; +} + +/** + * Receive a packet + * + * @param pep pointer to a valid UHS_EpInfo structure + * @param nak_limit how many NAKs before aborting + * @param nbytesptr pointer to maximum number of bytes of data to receive + * @param data pointer to data buffer + * @return 0 on success + */ +uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data) { + uint8_t rcode = 0; + uint8_t pktsize; + + uint16_t nbytes = *nbytesptr; + MAX_HOST_DEBUG(PSTR("Requesting %i bytes "), nbytes); + uint8_t maxpktsize = pep->maxPktSize; + + *nbytesptr = 0; + regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value + + // use a 'break' to exit this loop + while(1) { + rcode = dispatchPkt(MAX3421E_tokIN, pep->epAddr, nak_limit); //IN packet to EP-'endpoint'. Function takes care of NAKS. +#if 0 + // This issue should be resolved now. + if(rcode == UHS_HOST_ERROR_TOGERR) { + //MAX_HOST_DEBUG(PSTR("toggle wrong\r\n")); + // yes, we flip it wrong here so that next time it is actually correct! + pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; + regWr(rHCTL, (pep->bmRcvToggle) ? bmRCVTOG1 : bmRCVTOG0); //set toggle value + continue; + } +#endif + if(rcode) { + //MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! dispatchPkt %2.2x\r\n"), rcode); + break; //should be 0, indicating ACK. Else return error code. + } + /* check for RCVDAVIRQ and generate error if not present */ + /* the only case when absence of RCVDAVIRQ makes sense is when toggle error occurred. Need to add handling for that */ + if((regRd(rHIRQ) & bmRCVDAVIRQ) == 0) { + //MAX_HOST_DEBUG(PSTR(">>>>>>>> Problem! NO RCVDAVIRQ!\r\n")); + rcode = 0xF0; //receive error + break; + } + pktsize = regRd(rRCVBC); //number of received bytes + MAX_HOST_DEBUG(PSTR("Got %i bytes \r\n"), pktsize); + + if(pktsize > nbytes) { //certain devices send more than asked + //MAX_HOST_DEBUG(PSTR(">>>>>>>> Warning: wanted %i bytes but got %i.\r\n"), nbytes, pktsize); + pktsize = nbytes; + } + + int16_t mem_left = (int16_t)nbytes - *((int16_t*)nbytesptr); + + if(mem_left < 0) + mem_left = 0; + + data = bytesRd(rRCVFIFO, ((pktsize > mem_left) ? mem_left : pktsize), data); + + regWr(rHIRQ, bmRCVDAVIRQ); // Clear the IRQ & free the buffer + *nbytesptr += pktsize; // add this packet's byte count to total transfer length + + /* The transfer is complete under two conditions: */ + /* 1. The device sent a short packet (L.T. maxPacketSize) */ + /* 2. 'nbytes' have been transferred. */ + if((pktsize < maxpktsize) || (*nbytesptr >= nbytes)) // have we transferred 'nbytes' bytes? + { + // Save toggle value + pep->bmRcvToggle = ((regRd(rHRSL) & bmRCVTOGRD)) ? 1 : 0; + //MAX_HOST_DEBUG(PSTR("\r\n")); + rcode = 0; + break; + } // if + } //while( 1 ) + return ( rcode); +} + +/** + * Transmit a packet + * + * @param pep pointer to a valid UHS_EpInfo structure + * @param nak_limit how many NAKs before aborting + * @param nbytes number of bytes of data to send + * @param data pointer to data buffer + * @return 0 on success + */ +uint8_t UHS_NI MAX3421E_HOST::OutTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t nbytes, uint8_t *data) { + uint8_t rcode = UHS_HOST_ERROR_NONE; + uint8_t retry_count; + uint8_t *data_p = data; //local copy of the data pointer + uint16_t bytes_tosend; + uint16_t nak_count; + uint16_t bytes_left = nbytes; + + uint8_t maxpktsize = pep->maxPktSize; + + if(maxpktsize < 1 || maxpktsize > 64) + return UHS_HOST_ERROR_BAD_MAX_PACKET_SIZE; + + unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS; + + regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value + + while(bytes_left) { + SYSTEM_OR_SPECIAL_YIELD(); + retry_count = 0; + nak_count = 0; + bytes_tosend = (bytes_left >= maxpktsize) ? maxpktsize : bytes_left; + bytesWr(rSNDFIFO, bytes_tosend, data_p); //filling output FIFO + regWr(rSNDBC, bytes_tosend); //set number of bytes + regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet + while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ + regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ + rcode = (regRd(rHRSL) & 0x0F); + + while(rcode && ((long)(millis() - timeout) < 0L)) { + switch(rcode) { + case UHS_HOST_ERROR_NAK: + nak_count++; + if(nak_limit && (nak_count == nak_limit)) + goto breakout; + break; + case UHS_HOST_ERROR_TIMEOUT: + retry_count++; + if(retry_count == UHS_HOST_TRANSFER_RETRY_MAXIMUM) + goto breakout; + break; + case UHS_HOST_ERROR_TOGERR: + // yes, we flip it wrong here so that next time it is actually correct! + pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; + regWr(rHCTL, (pep->bmSndToggle) ? bmSNDTOG1 : bmSNDTOG0); //set toggle value + break; + default: + goto breakout; + }//switch( rcode + + /* process NAK according to Host out NAK bug */ + regWr(rSNDBC, 0); + regWr(rSNDFIFO, *data_p); + regWr(rSNDBC, bytes_tosend); + regWr(rHXFR, (MAX3421E_tokOUT | pep->epAddr)); //dispatch packet + while(!(regRd(rHIRQ) & bmHXFRDNIRQ)); //wait for the completion IRQ + regWr(rHIRQ, bmHXFRDNIRQ); //clear IRQ + rcode = (regRd(rHRSL) & 0x0F); + SYSTEM_OR_SPECIAL_YIELD(); + }//while( rcode && .... + bytes_left -= bytes_tosend; + data_p += bytes_tosend; + }//while( bytes_left... +breakout: + + pep->bmSndToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 1 : 0; //bmSNDTOG1 : bmSNDTOG0; //update toggle + return ( rcode); //should be 0 in all cases +} + +/** + * Send the actual packet. + * + * @param token + * @param ep Endpoint + * @param nak_limit how many NAKs before aborting, 0 == exit after timeout + * @return 0 on success, 0xFF indicates NAK timeout. @see + */ +/* Assumes peripheral address is set and relevant buffer is loaded/empty */ +/* If NAK, tries to re-send up to nak_limit times */ +/* If nak_limit == 0, do not count NAKs, exit after timeout */ +/* If bus timeout, re-sends up to USB_RETRY_LIMIT times */ + +/* return codes 0x00-0x0F are HRSLT( 0x00 being success ), 0xFF means timeout */ +uint8_t UHS_NI MAX3421E_HOST::dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit) { + unsigned long timeout = millis() + UHS_HOST_TRANSFER_MAX_MS; + uint8_t tmpdata; + uint8_t rcode = UHS_HOST_ERROR_NONE; + uint8_t retry_count = 0; + uint16_t nak_count = 0; + + for(;;) { + regWr(rHXFR, (token | ep)); //launch the transfer + while((long)(millis() - timeout) < 0L) //wait for transfer completion + { + SYSTEM_OR_SPECIAL_YIELD(); + tmpdata = regRd(rHIRQ); + + if(tmpdata & bmHXFRDNIRQ) { + regWr(rHIRQ, bmHXFRDNIRQ); //clear the interrupt + //rcode = 0x00; + break; + }//if( tmpdata & bmHXFRDNIRQ + + }//while ( millis() < timeout + + rcode = (regRd(rHRSL) & 0x0F); //analyze transfer result + + switch(rcode) { + case UHS_HOST_ERROR_NAK: + nak_count++; + if(nak_limit && (nak_count == nak_limit)) + return (rcode); + delayMicroseconds(200); + break; + case UHS_HOST_ERROR_TIMEOUT: + retry_count++; + if(retry_count == UHS_HOST_TRANSFER_RETRY_MAXIMUM) + return (rcode); + break; + default: + return (rcode); + }//switch( rcode + } +} + +// +// NULL is error, we don't need to know the reason. +// + +UHS_EpInfo * UHS_NI MAX3421E_HOST::ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t *dataptr) { + uint8_t rcode; + UHS_EpInfo *pep = NULL; + uint16_t nak_limit = 0; + rcode = SetAddress(addr, 0, &pep, nak_limit); + + if(!rcode) { + + bytesWr(rSUDFIFO, 8, (uint8_t*)(&Request)); //transfer to setup packet FIFO + + rcode = dispatchPkt(MAX3421E_tokSETUP, 0, nak_limit); //dispatch packet + if(!rcode) { + if(dataptr != NULL) { + if(((Request)/* bmReqType*/ & 0x80) == 0x80) { + pep->bmRcvToggle = 1; //bmRCVTOG1; + } else { + pep->bmSndToggle = 1; //bmSNDTOG1; + } + } + } else { + pep = NULL; + } + } + return pep; +} + +uint8_t UHS_NI MAX3421E_HOST::ctrlReqRead(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint16_t nbytes, uint8_t *dataptr) { + *read = 0; + uint16_t nak_limit = 0; + MAX_HOST_DEBUG(PSTR("ctrlReqRead left: %i\r\n"), *left); + if(*left) { +again: + *read = nbytes; + uint8_t rcode = InTransfer(pep, nak_limit, read, dataptr); + if(rcode == UHS_HOST_ERROR_TOGERR) { + // yes, we flip it wrong here so that next time it is actually correct! + pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; + goto again; + } + + if(rcode) { + MAX_HOST_DEBUG(PSTR("ctrlReqRead ERROR: %2.2x, left: %i, read %i\r\n"), rcode, *left, *read); + return rcode; + } + *left -= *read; + MAX_HOST_DEBUG(PSTR("ctrlReqRead left: %i, read %i\r\n"), *left, *read); + } + return 0; +} + +uint8_t UHS_NI MAX3421E_HOST::ctrlReqClose(UHS_EpInfo *pep, uint8_t bmReqType, uint16_t left, uint16_t nbytes, uint8_t *dataptr) { + uint8_t rcode = 0; + + //MAX_HOST_DEBUG(PSTR("Closing")); + if(((bmReqType & 0x80) == 0x80) && pep && left && dataptr) { + MAX_HOST_DEBUG(PSTR("ctrlReqRead Sinking %i\r\n"), left); + // If reading, sink the rest of the data. + while(left) { + uint16_t read = nbytes; + rcode = InTransfer(pep, 0, &read, dataptr); + if(rcode == UHS_HOST_ERROR_TOGERR) { + // yes, we flip it wrong here so that next time it is actually correct! + pep->bmRcvToggle = (regRd(rHRSL) & bmSNDTOGRD) ? 0 : 1; + continue; + } + if(rcode) break; + left -= read; + if(read < nbytes) break; + } + } + if(!rcode) { + // Serial.println("Dispatching"); + rcode = dispatchPkt(((bmReqType & 0x80) == 0x80) ? MAX3421E_tokOUTHS : MAX3421E_tokINHS, 0, 0); //GET if direction + // } else { + // Serial.println("Bypassed Dispatch"); + } + return rcode; +} + +/** + * Bottom half of the ISR task + */ +void UHS_NI MAX3421E_HOST::ISRbottom() { + uint8_t x; + // Serial.print("Enter "); + // Serial.print((uint32_t)this,HEX); + // Serial.print(" "); + // Serial.println(usb_task_state, HEX); + + DDSB(); + if(condet) { + VBUS_changed(); +#if USB_HOST_SHIELD_USE_ISR + noInterrupts(); +#endif + condet = false; +#if USB_HOST_SHIELD_USE_ISR + interrupts(); +#endif + } + switch(usb_task_state) { + case UHS_USB_HOST_STATE_INITIALIZE: + // should never happen... + MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_INITIALIZE\r\n")); + busprobe(); + VBUS_changed(); + break; + case UHS_USB_HOST_STATE_DEBOUNCE: + MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_DEBOUNCE\r\n")); + // This seems to not be needed. The host controller has debounce built in. + sof_countdown = UHS_HOST_DEBOUNCE_DELAY_MS; + usb_task_state = UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE; + break; + case UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE: + MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_DEBOUNCE_NOT_COMPLETE\r\n")); + if(!sof_countdown) usb_task_state = UHS_USB_HOST_STATE_RESET_DEVICE; + break; + case UHS_USB_HOST_STATE_RESET_DEVICE: + MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_RESET_DEVICE\r\n")); + busevent = true; + usb_task_state = UHS_USB_HOST_STATE_RESET_NOT_COMPLETE; + regWr(rHIRQ, bmBUSEVENTIRQ); // see data sheet. + regWr(rHCTL, bmBUSRST); // issue bus reset + break; + case UHS_USB_HOST_STATE_RESET_NOT_COMPLETE: + MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_RESET_NOT_COMPLETE\r\n")); + if(!busevent) usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY; + break; + case UHS_USB_HOST_STATE_WAIT_BUS_READY: + MAX_HOST_DEBUG(PSTR("UHS_USB_HOST_STATE_WAIT_BUS_READY\r\n")); + usb_task_state = UHS_USB_HOST_STATE_CONFIGURING; + break; // don't fall through + + case UHS_USB_HOST_STATE_CONFIGURING: + usb_task_state = UHS_USB_HOST_STATE_CHECK; + x = Configuring(0, 1, usb_host_speed); + usb_error = x; + if(usb_task_state == UHS_USB_HOST_STATE_CHECK) { + if(x) { + MAX_HOST_DEBUG(PSTR("Error 0x%2.2x"), x); + if(x == UHS_HOST_ERROR_JERR) { + usb_task_state = UHS_USB_HOST_STATE_IDLE; + } else if(x != UHS_HOST_ERROR_DEVICE_INIT_INCOMPLETE) { + usb_error = x; + usb_task_state = UHS_USB_HOST_STATE_ERROR; + } + } else + usb_task_state = UHS_USB_HOST_STATE_CONFIGURING_DONE; + } + break; + + case UHS_USB_HOST_STATE_CHECK: + // Serial.println((uint32_t)__builtin_return_address(0), HEX); + break; + case UHS_USB_HOST_STATE_CONFIGURING_DONE: + usb_task_state = UHS_USB_HOST_STATE_RUNNING; + break; + #ifdef USB_HOST_MANUAL_POLL + case UHS_USB_HOST_STATE_RUNNING: + case UHS_USB_HOST_STATE_ERROR: + case UHS_USB_HOST_STATE_IDLE: + case UHS_USB_HOST_STATE_ILLEGAL: + enable_frame_irq(false); + break; + #else + case UHS_USB_HOST_STATE_RUNNING: + Poll_Others(); + for(x = 0; (usb_task_state == UHS_USB_HOST_STATE_RUNNING) && (x < UHS_HOST_MAX_INTERFACE_DRIVERS); x++) { + if(devConfig[x]) { + if(devConfig[x]->bPollEnable) devConfig[x]->Poll(); + } + } + // fall thru + #endif + default: + // Do nothing + break; + } // switch( usb_task_state ) + DDSB(); +#if USB_HOST_SHIELD_USE_ISR + if(condet) { + VBUS_changed(); + noInterrupts(); + condet = false; + interrupts(); + } +#endif +#ifdef USB_HOST_SHIELD_TIMING_PIN + // My counter/timer can't work on an inverted gate signal + // so we gate using a high pulse -- AJK + UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, LOW); +#endif + //usb_task_polling_disabled--; + EnablePoll(); + DDSB(); +} + + +/* USB main task. Services the MAX3421e */ +#if !USB_HOST_SHIELD_USE_ISR + +void UHS_NI MAX3421E_HOST::ISRTask() { +} +void UHS_NI MAX3421E_HOST::Task() +#else + +void UHS_NI MAX3421E_HOST::Task() { +#ifdef USB_HOST_MANUAL_POLL + if(usb_task_state == UHS_USB_HOST_STATE_RUNNING) { + noInterrupts(); + for(uint8_t x = 0; x < UHS_HOST_MAX_INTERFACE_DRIVERS; x++) + if(devConfig[x] && devConfig[x]->bPollEnable) + devConfig[x]->Poll(); + interrupts(); + } +#endif +} + +void UHS_NI MAX3421E_HOST::ISRTask() +#endif +{ + DDSB(); + +#ifndef SWI_IRQ_NUM + suspend_host(); +#if USB_HOST_SHIELD_USE_ISR + // Enable interrupts + interrupts(); +#endif +#endif + + counted = false; + if(!MARLIN_UHS_READ_IRQ()) { + uint8_t HIRQALL = regRd(rHIRQ); //determine interrupt source + uint8_t HIRQ = HIRQALL & IRQ_CHECK_MASK; + uint8_t HIRQ_sendback = 0x00; + + if((HIRQ & bmCONDETIRQ) || (HIRQ & bmBUSEVENTIRQ)) { + MAX_HOST_DEBUG + (PSTR("\r\nBEFORE CDIRQ %s BEIRQ %s resetting %s state 0x%2.2x\r\n"), + (HIRQ & bmCONDETIRQ) ? "T" : "F", + (HIRQ & bmBUSEVENTIRQ) ? "T" : "F", + doingreset ? "T" : "F", + usb_task_state + ); + } + // ALWAYS happens BEFORE or WITH CONDETIRQ + if(HIRQ & bmBUSEVENTIRQ) { + HIRQ_sendback |= bmBUSEVENTIRQ; + if(!doingreset) condet = true; + busprobe(); + busevent = false; + } + + if(HIRQ & bmCONDETIRQ) { + HIRQ_sendback |= bmCONDETIRQ; + if(!doingreset) condet = true; + busprobe(); + } + +#if 1 + if((HIRQ & bmCONDETIRQ) || (HIRQ & bmBUSEVENTIRQ)) { + MAX_HOST_DEBUG + (PSTR("\r\nAFTER CDIRQ %s BEIRQ %s resetting %s state 0x%2.2x\r\n"), + (HIRQ & bmCONDETIRQ) ? "T" : "F", + (HIRQ & bmBUSEVENTIRQ) ? "T" : "F", + doingreset ? "T" : "F", + usb_task_state + ); + } +#endif + + if(HIRQ & bmFRAMEIRQ) { + HIRQ_sendback |= bmFRAMEIRQ; + if(sof_countdown) { + sof_countdown--; + counted = true; + } + sofevent = false; + } + + //MAX_HOST_DEBUG(PSTR("\r\n%s%s%s\r\n"), + // sof_countdown ? "T" : "F", + // counted ? "T" : "F", + // usb_task_polling_disabled? "T" : "F"); + DDSB(); + regWr(rHIRQ, HIRQ_sendback); +#ifndef SWI_IRQ_NUM + resume_host(); +#if USB_HOST_SHIELD_USE_ISR + // Disable interrupts + noInterrupts(); +#endif +#endif + if(!sof_countdown && !counted && !usb_task_polling_disabled) { + DisablePoll(); + //usb_task_polling_disabled++; +#ifdef USB_HOST_SHIELD_TIMING_PIN + // My counter/timer can't work on an inverted gate signal + // so we gate using a high pulse -- AJK + UHS_PIN_WRITE(USB_HOST_SHIELD_TIMING_PIN, HIGH); +#endif + +#ifdef SWI_IRQ_NUM + // MAX_HOST_DEBUG(PSTR("--------------- Doing SWI ----------------")); + exec_SWI(this); +#else +#if USB_HOST_SHIELD_USE_ISR + // Enable interrupts + interrupts(); +#endif /* USB_HOST_SHIELD_USE_ISR */ + ISRbottom(); +#endif /* SWI_IRQ_NUM */ + } + } +} + +#if 0 +DDSB(); +#endif +#else +#error "Never include USB_HOST_SHIELD_INLINE.h, include UHS_host.h instead" +#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h new file mode 100644 index 00000000..0ac90f0d --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/macro_logic.h @@ -0,0 +1,152 @@ +/* + * File: macro_logic.h + * Author: root + * + * Created on December 22, 2018, 4:49 AM + * + * To test: + * gcc -DAJK_TEST_MACRO_LOGIC -E macro_logic.h + */ + +#ifndef MACRO_LOGIC_H +#define MACRO_LOGIC_H + +#define AJK_CAT(a, ...) AJK_PRIMITIVE_CAT(a, __VA_ARGS__) +#define AJK_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ + +#define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b) +#define AJK_COMPL_0 1 +#define AJK_COMPL_1 0 + +#define AJK_BITAND(x) AJK_PRIMITIVE_CAT(AJK_BITAND_, x) +#define AJK_BITAND_0(y) 0 +#define AJK_BITAND_1(y) y + +#define AJK_INC(x) AJK_PRIMITIVE_CAT(AJK_INC_, x) +#define AJK_INC_0 1 +#define AJK_INC_1 2 +#define AJK_INC_2 3 +#define AJK_INC_3 4 +#define AJK_INC_4 5 +#define AJK_INC_5 6 +#define AJK_INC_6 7 +#define AJK_INC_7 8 +#define AJK_INC_8 9 +#define AJK_INC_9 10 +#define AJK_INC_10 10 + +#define AJK_DEC(x) AJK_PRIMITIVE_CAT(AJK_DEC_, x) +#define AJK_DEC_0 0 +#define AJK_DEC_1 0 +#define AJK_DEC_2 1 +#define AJK_DEC_3 2 +#define AJK_DEC_4 3 +#define AJK_DEC_5 4 +#define AJK_DEC_6 5 +#define AJK_DEC_7 6 +#define AJK_DEC_8 7 +#define AJK_DEC_9 8 +#define AJK_DEC_10 9 + +#define AJK_CHECK_N(x, n, ...) n +#define AJK_CHECK(...) AJK_CHECK_N(__VA_ARGS__, 0,) +#define AJK_PROBE(x) x, 1, + +#define AJK_IS_PAREN(x) AJK_CHECK(AJK_IS_PAREN_PROBE x) +#define AJK_IS_PAREN_PROBE(...) AJK_PROBE(~) + +#define AJK_NOT(x) AJK_CHECK(AJK_PRIMITIVE_CAT(AJK_NOT_, x)) +#define AJK_NOT_0 AJK_PROBE(~) + +#define AJK_COMPL(b) AJK_PRIMITIVE_CAT(AJK_COMPL_, b) +#define AJK_COMPL_0 1 +#define AJK_COMPL_1 0 + +#define AJK_BOOL(x) AJK_COMPL(AJK_NOT(x)) + +#define AJK_IIF(c) AJK_PRIMITIVE_CAT(AJK_IIF_, c) +#define AJK_IIF_0(t, ...) __VA_ARGS__ +#define AJK_IIF_1(t, ...) t + +#define AJK_IF(c) AJK_IIF(AJK_BOOL(c)) + +#define AJK_EAT(...) +#define AJK_EXPAND(...) __VA_ARGS__ +#define AJK_WHEN(c) AJK_IF(c)(AJK_EXPAND, AJK_EAT) + +#define AJK_EMPTY() +#define AJK_DEFER(id) id AJK_EMPTY() +#define AJK_OBSTRUCT(id) id AJK_DEFER(AJK_EMPTY)() + +#define AJK_EVAL(...) AJK_EVAL1(AJK_EVAL1(AJK_EVAL1(__VA_ARGS__))) +#define AJK_EVAL1(...) AJK_EVAL2(AJK_EVAL2(AJK_EVAL2(__VA_ARGS__))) +#define AJK_EVAL2(...) AJK_EVAL3(AJK_EVAL3(AJK_EVAL3(__VA_ARGS__))) +#define AJK_EVAL3(...) AJK_EVAL4(AJK_EVAL4(AJK_EVAL4(__VA_ARGS__))) +#define AJK_EVAL4(...) AJK_EVAL5(AJK_EVAL5(AJK_EVAL5(__VA_ARGS__))) +#define AJK_EVAL5(...) __VA_ARGS__ + +#define AJK_REPEAT(AJK_count, AJK_macro, ...) \ + AJK_WHEN(AJK_count) \ + ( \ + AJK_OBSTRUCT(AJK_REPEAT_INDIRECT) () \ + ( \ + AJK_DEC(AJK_count), AJK_macro, __VA_ARGS__ \ + ) \ + AJK_OBSTRUCT(AJK_macro) \ + ( \ + AJK_DEC(AJK_count), __VA_ARGS__ \ + ) \ + ) +#define AJK_REPEAT_INDIRECT() AJK_REPEAT + +#define AJK_WHILE(AJK_pred, AJK_op, ...) \ + IF(AJK_pred(__VA_ARGS__)) \ + ( \ + AJK_OBSTRUCT(AJK_WHILE_INDIRECT) () \ + ( \ + AJK_pred, AJK_op, AJK_op(__VA_ARGS__) \ + ), \ + __VA_ARGS__ \ + ) +#define AJK_WHILE_INDIRECT() AJK_WHILE + +#define AJK_PRIMITIVE_COMPARE(x, y) AJK_IS_PAREN \ +( \ + AJK_COMPARE_ ## x ( AJK_COMPARE_ ## y) (()) \ +) + +#define AJK_IS_COMPARABLE(x) AJK_IS_PAREN( AJK_CAT(AJK_COMPARE_, x) (()) ) + +#define AJK_NOT_EQUAL(x, y) \ +AJK_IIF(AJK_BITAND(AJK_IS_COMPARABLE(x))(AJK_IS_COMPARABLE(y)) ) \ +( \ + AJK_PRIMITIVE_COMPARE, \ + 1 AJK_EAT \ +)(x, y) + +#define AJK_EQUAL(x, y) AJK_COMPL(AJK_NOT_EQUAL(x, y)) + + +#define AJK_COMMA() , + +#define AJK_COMMA_IF(n) AJK_IF(n)(AJK_COMMA, AJK_EAT)() + + +#define AJK_COMMA_VAR(AJK_count, AJK_v) AJK_COMMA_IF(AJK_count) AJK_v ## AJK_count + +#define AJK_MAKE_LIST(AJK_v, AJK_count) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_COMMA_VAR, AJK_v)) + +#define AJK_FUN(AJK_count, AJK_v, AJK_args, AJK_body) AJK_v ## AJK_count (AJK_args) { AJK_body(AJK_count) } +#define AJK_MAKE_FUNS(AJK_v, AJK_args, AJK_count, AJK_body) AJK_EVAL(AJK_REPEAT(AJK_count, AJK_FUN, AJK_v, AJK_args, AJK_body)) +#ifdef AJK_TEST_MACRO_LOGIC + +#define BODY(AJKindex) some(C, statement); contaning(a, test[AJKindex]); +#define ZERO_TIMES_TEST 0 +#define THREE_TIMES_TEST 3 +blank > AJK_MAKE_LIST(VARIABLE_, ZERO_TIMES_TEST) < because zero repeats +Make 3 comma separated indexed variables : AJK_MAKE_LIST(VARIABLE_, THREE_TIMES_TEST) +Make 3 bogus function bodies +AJK_MAKE_FUNS(unsigned Cfunc,(arg1, arg2),3,BODY) +#endif + +#endif /* MACRO_LOGIC_H */ diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h new file mode 100644 index 00000000..f86054ca --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/SWI_INLINE.h @@ -0,0 +1,244 @@ +/* + * File: SWI_INLINE.h + * Author: xxxajk@gmail.com + * + * Created on December 5, 2014, 9:40 AM + * + * This is the actual library. + * There are no 'c' or 'cpp' files. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef DYN_SWI_H +#ifndef SWI_INLINE_H +#define SWI_INLINE_H + +#ifndef SWI_MAXIMUM_ALLOWED +#define SWI_MAXIMUM_ALLOWED 4 +#endif + + + +#if defined(__arm__) || defined(ARDUINO_ARCH_PIC32) +static char dyn_SWI_initied = 0; +static dyn_SWI* dyn_SWI_LIST[SWI_MAXIMUM_ALLOWED]; +static dyn_SWI* dyn_SWI_EXEC[SWI_MAXIMUM_ALLOWED]; +#ifdef __arm__ +#ifdef __USE_CMSIS_VECTORS__ +extern "C" { + void (*_VectorsRam[VECTORTABLE_SIZE])(void)__attribute__((aligned(VECTORTABLE_ALIGNMENT))); +} +#else + +__attribute__((always_inline)) static inline void __DSB() { + __asm__ volatile ("dsb"); +} +#endif // defined(__USE_CMSIS_VECTORS__) +#else // defined(__arm__) +__attribute__((always_inline)) static inline void __DSB() { + __asm__ volatile ("sync" : : : "memory"); +} +#endif // defined(__arm__) + +/** + * Execute queued class ISR routines. + */ +#ifdef ARDUINO_ARCH_PIC32 +static p32_regset *ifs = ((p32_regset *) & IFS0) + (SWI_IRQ_NUM / 32); //interrupt flag register set +static p32_regset *iec = ((p32_regset *) & IEC0) + (SWI_IRQ_NUM / 32); //interrupt enable control reg set +static uint32_t swibit = 1 << (SWI_IRQ_NUM % 32); + +void +#ifdef __PIC32MZXX__ + __attribute__((nomips16,at_vector(SWI_VECTOR),interrupt(SWI_IPL))) +#else + __attribute__((interrupt(),nomips16)) +#endif + softISR() { +#else +#ifdef ARDUINO_spresense_ast +unsigned int softISR() { +#else +void softISR() { +#endif +#endif + + // + // TO-DO: Perhaps limit to 8, and inline this? + // + + + // Make a working copy, while clearing the queue. + noInterrupts(); +#ifdef ARDUINO_ARCH_PIC32 + //ifs->clr = swibit; +#endif + for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { + dyn_SWI_EXEC[i] = dyn_SWI_LIST[i]; + dyn_SWI_LIST[i] = NULL; + } + __DSB(); + interrupts(); + + // Execute each class SWI + for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { + if(dyn_SWI_EXEC[i]) { +#ifdef __DYN_SWI_DEBUG_LED__ + digitalWrite(__DYN_SWI_DEBUG_LED__, HIGH); +#endif + dyn_SWI_EXEC[i]->dyn_SWISR(); +#ifdef __DYN_SWI_DEBUG_LED__ + digitalWrite(__DYN_SWI_DEBUG_LED__, LOW); +#endif + } + } +#ifdef ARDUINO_ARCH_PIC32 + noInterrupts(); + if(!dyn_SWI_EXEC[0]) ifs->clr = swibit; + interrupts(); +#endif +#ifdef ARDUINO_spresense_ast + return 0; +#endif +} + +#define DDSB() __DSB() +#endif + + +#ifdef __arm__ +#ifndef interruptsStatus +#define interruptsStatus() __interruptsStatus() +static inline unsigned char __interruptsStatus() __attribute__((always_inline, unused)); + +static inline unsigned char __interruptsStatus() { + unsigned int primask; + asm volatile ("mrs %0, primask" : "=r" (primask)); + if(primask) return 0; + return 1; +} +#endif + +/** + * Initialize the Dynamic (class) Software Interrupt + */ +static void Init_dyn_SWI() { + if(!dyn_SWI_initied) { +#ifdef __USE_CMSIS_VECTORS__ + uint32_t *X_Vectors = (uint32_t*)SCB->VTOR; + for(int i = 0; i < VECTORTABLE_SIZE; i++) { + _VectorsRam[i] = reinterpret_cast(X_Vectors[i]); /* copy vector table to RAM */ + } + /* relocate vector table */ + noInterrupts(); + SCB->VTOR = reinterpret_cast(&_VectorsRam); + DDSB(); + interrupts(); +#endif +#ifndef ARDUINO_spresense_ast + for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) dyn_SWI_LIST[i] = NULL; + noInterrupts(); + _VectorsRam[SWI_IRQ_NUM + 16] = reinterpret_cast(softISR); + DDSB(); + interrupts(); + NVIC_SET_PRIORITY(SWI_IRQ_NUM, 255); + NVIC_ENABLE_IRQ(SWI_IRQ_NUM); +#endif +#ifdef __DYN_SWI_DEBUG_LED__ + pinMode(__DYN_SWI_DEBUG_LED__, OUTPUT); + digitalWrite(__DYN_SWI_DEBUG_LED__, LOW); +#endif + dyn_SWI_initied = 1; + } +} + +/** + * @param klass class that extends dyn_SWI + * @return 0 on queue full, else returns queue position (ones based) + */ +int exec_SWI(const dyn_SWI* klass) { + int rc = 0; + + uint8_t irestore = interruptsStatus(); + // Allow use from inside a critical section... + // ... and prevent races if also used inside an ISR + noInterrupts(); + for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { + if(!dyn_SWI_LIST[i]) { + rc = 1 + i; // Success! + dyn_SWI_LIST[i] = (dyn_SWI*)klass; +#ifndef ARDUINO_spresense_ast + if(!NVIC_GET_PENDING(SWI_IRQ_NUM)) NVIC_SET_PENDING(SWI_IRQ_NUM); +#else + // Launch 1-shot timer as an emulated SWI + // Hopefully the value of Zero is legal. + // 1 microsecond latency would suck! + attachTimerInterrupt(softISR, 100); +#endif + DDSB(); + break; + } + } + // Restore interrupts, if they were on. + if(irestore) interrupts(); + return rc; +} +#elif defined(ARDUINO_ARCH_PIC32) + +/** + * Initialize the Dynamic (class) Software Interrupt + */ +static void Init_dyn_SWI() { + if(!dyn_SWI_initied) { + uint32_t sreg = disableInterrupts(); + + setIntVector(SWI_VECTOR, softISR); + setIntPriority(SWI_VECTOR, 1, 1); // Lowest priority, ever. + ifs->clr = swibit; + iec->clr = swibit; + iec->set = swibit; + restoreInterrupts(sreg); +#ifdef __DYN_SWI_DEBUG_LED__ + pinMode(__DYN_SWI_DEBUG_LED__, OUTPUT); + UHS_PIN_WRITE(__DYN_SWI_DEBUG_LED__, LOW); +#endif + } +} + +/** + * @param klass class that extends dyn_SWI + * @return 0 on queue full, else returns queue position (ones based) + */ +int exec_SWI(const dyn_SWI* klass) { + int rc = 0; + uint32_t sreg = disableInterrupts(); + for(int i = 0; i < SWI_MAXIMUM_ALLOWED; i++) { + if(!dyn_SWI_LIST[i]) { + rc = 1 + i; // Success! + dyn_SWI_LIST[i] = (dyn_SWI*)klass; + if(!(ifs->reg & swibit)) ifs->set = swibit; + ; + break; + } + } + restoreInterrupts(sreg); + return rc; +} + +#endif /* defined(__arm__) */ +#endif /* SWI_INLINE_H */ +#else +#error "Never include SWI_INLINE.h directly, include dyn_SWI.h instead" +#endif diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h new file mode 100644 index 00000000..07f4ae05 --- /dev/null +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/dyn_SWI/dyn_SWI.h @@ -0,0 +1,172 @@ +/* + * File: dyn_SWI.h + * Author: xxxajk@gmail.com + * + * Created on December 5, 2014, 9:12 AM + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef DYN_SWI_H +#define DYN_SWI_H + + +#if defined(__arm__) || defined(ARDUINO_ARCH_PIC32) +#ifdef ARDUINO_ARCH_PIC32 +#include +#endif +#ifdef __cplusplus + +#ifdef true +#undef true +#endif + +#ifdef false +#undef false +#endif + +#endif + +#ifdef ARDUINO_spresense_ast +#define SWI_IRQ_NUM 666 // because this board is totally evil. +#elif defined(ARDUINO_ARCH_PIC32) +#ifndef SWI_IRQ_NUM +#ifdef _DSPI0_IPL_ISR +#define SWI_IPL _DSPI0_IPL_ISR +#define SWI_VECTOR _DSPI0_ERR_IRQ +#define SWI_IRQ_NUM _DSPI0_ERR_IRQ +#elif defined(_PMP_ERROR_IRQ) +#define SWI_IRQ_NUM _PMP_ERROR_IRQ +#define SWI_VECTOR _PMP_VECTOR +#else +#error SWI_IRQ_NUM and SWI_VECTOR need a definition +#endif +#ifdef __cplusplus +extern "C" +{ + void +#ifdef __PIC32MZXX__ + __attribute__((nomips16,at_vector(SWI_VECTOR),interrupt(SWI_IPL))) +#else + __attribute__((interrupt(),nomips16)) +#endif + softISR(); +} +#endif +#endif +#elif !defined(NVIC_NUM_INTERRUPTS) +// Assume CMSIS +#define __USE_CMSIS_VECTORS__ +#ifdef NUMBER_OF_INT_VECTORS +#define NVIC_NUM_INTERRUPTS (NUMBER_OF_INT_VECTORS-16) +#else +#define NVIC_NUM_INTERRUPTS ((int)PERIPH_COUNT_IRQn) +#endif +#define VECTORTABLE_SIZE (NVIC_NUM_INTERRUPTS+16) +#define VECTORTABLE_ALIGNMENT (0x100UL) +#define NVIC_GET_ACTIVE(n) NVIC_GetActive((IRQn_Type)n) +#define NVIC_GET_PENDING(n) NVIC_GetPendingIRQ((IRQn_Type)n) +#define NVIC_SET_PENDING(n) NVIC_SetPendingIRQ((IRQn_Type)n) +#define NVIC_ENABLE_IRQ(n) NVIC_EnableIRQ((IRQn_Type)n) +#define NVIC_SET_PRIORITY(n ,p) NVIC_SetPriority((IRQn_Type)n, (uint32_t) p) +//extern "C" { +// extern uint32_t _VectorsRam[VECTORTABLE_SIZE] __attribute__((aligned(VECTORTABLE_ALIGNMENT))); +//} + +#ifndef SWI_IRQ_NUM +#if defined(__SAM3X8E__) && defined(_VARIANT_ARDUINO_DUE_X_) +// DUE +// Choices available: +// HSMCI_IRQn Multimedia Card Interface (HSMCI) +// EMAC_IRQn Ethernet MAC (EMAC) +// EMAC is not broken out on the official DUE, but is on clones. +// SPI0_IRQn Serial Peripheral Interface (SPI0) +// SPI0_IRQn seems to be the best choice, as long as nobody uses an ISR based master +#define SWI_IRQ_NUM SPI0_IRQn +#elif defined(ARDUINO_SAMD_ZERO) +// Just use sercom4's unused IRQ vector. +#define SWI_IRQ_NUM I2S_IRQn +//#define SWI_IRQ_NUM SERCOM4_IRQn +#endif +#endif + +#ifndef SWI_IRQ_NUM +#error SWI_IRQ_NUM not defined (CMSIS) +#endif + +#elif defined(CORE_TEENSY) + +#ifndef NVIC_GET_ACTIVE +#define NVIC_GET_ACTIVE(n) (*((volatile uint32_t *)0xE000E300 + ((n) >> 5)) & (1 << ((n) & 31))) +#endif +#ifndef NVIC_GET_PENDING +#define NVIC_GET_PENDING(n) (*((volatile uint32_t *)0xE000E200 + ((n) >> 5)) & (1 << ((n) & 31))) +#ifndef SWI_IRQ_NUM +#ifdef __MK20DX256__ +#define SWI_IRQ_NUM 17 +#elif defined(__MK20DX128__) +#define SWI_IRQ_NUM 5 +#elif defined(__MKL26Z64__) +#define SWI_IRQ_NUM 4 +#elif defined(__MK66FX1M0__) +#define SWI_IRQ_NUM 30 +#elif defined(__MK64FX512__) +#define SWI_IRQ_NUM 30 +#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) +#define SWI_IRQ_NUM 71 +#else +#error Do not know how to relocate IRQ vectors for this pjrc product +#endif +#endif +#endif +#else // Not CMSIS or PJRC CORE_TEENSY or PIC32 or SPRESENSE +#error Do not know how to relocate IRQ vectors or perform SWI +#endif // SWI_IRQ_NUM + + +#ifndef SWI_IRQ_NUM +#error SWI_IRQ_NUM not defined +#else +/** + * Use this class to extend your class, in order to provide + * a C++ context callable SWI. + */ +class dyn_SWI { +public: + + /** + * Override this method with your code. + */ + virtual void dyn_SWISR() { + }; +}; + +extern int exec_SWI(const dyn_SWI* klass); + +#include "SWI_INLINE.h" + +// IMPORTANT! Define this so that you do NOT end up with a NULL stub! +#define SWI_NO_STUB +#endif /* SWI_IRQ_NUM */ +#endif /* __arm__ */ + +// if no SWI for CPU (e.g. AVR) make a void stub. +#ifndef SWI_NO_STUB +#define Init_dyn_SWI() (void(0)) +#ifndef DDSB +#define DDSB() (void(0)) +#endif +#endif +#endif /* DYN_SWI_H */ diff --git a/README.md b/README.md index 742cd3a6..1e78528b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,76 @@ -# hornet-firmware - Artillery Hornet Firmware +# Marlin 3D Printer Firmware + +![GitHub](https://img.shields.io/github/license/marlinfirmware/marlin.svg) +![GitHub contributors](https://img.shields.io/github/contributors/marlinfirmware/marlin.svg) +![GitHub Release Date](https://img.shields.io/github/release-date/marlinfirmware/marlin.svg) +[![Build Status](https://github.com/MarlinFirmware/Marlin/workflows/CI/badge.svg?branch=bugfix-2.0.x)](https://github.com/MarlinFirmware/Marlin/actions) + + + +Additional documentation can be found at the [Marlin Home Page](https://marlinfw.org/). +Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by! + +## Marlin 2.0 + +Marlin 2.0 takes this popular RepRap firmware to the next level by adding support for much faster 32-bit and ARM-based boards while improving support for 8-bit AVR boards. Read about Marlin's decision to use a "Hardware Abstraction Layer" below. + +Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases). + +## 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). Detailed build and install instructions are posted at: + + - [Installing Marlin (Arduino)](http://marlinfw.org/docs/basics/install_arduino.html) + - [Installing Marlin (VSCode)](http://marlinfw.org/docs/basics/install_platformio_vscode.html). + +### Supported Platforms + + Platform|MCU|Example Boards + --------|---|------- + [Arduino AVR](https://www.arduino.cc/)|ATmega|RAMPS, Melzi, RAMBo + [Teensy++ 2.0](http://www.microchip.com/wwwproducts/en/AT90USB1286)|AT90USB1286|Printrboard + [Arduino Due](https://www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE + [LPC1768](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)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact + [LPC1769](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard + [STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini + [STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6 + [STM32F7x6](https://www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1 + [SAMD51P20A](https://www.adafruit.com/product/4064)|ARM® Cortex-M4|Adafruit Grand Central M4 + [Teensy 3.5](https://www.pjrc.com/store/teensy35.html)|ARM® Cortex-M4| + [Teensy 3.6](https://www.pjrc.com/store/teensy36.html)|ARM® Cortex-M4| + [Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|ARM® Cortex-M7| + [Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7| + +## Submitting Changes + +- Submit **Bug Fixes** as Pull Requests to the ([bugfix-2.0.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x)) branch. +- Follow the [Coding Standards](http://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). + +## Marlin Support + +For best results getting help with configuration and troubleshooting, please use the following resources: + +- [Marlin Documentation](http://marlinfw.org) - Official Marlin documentation +- [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers +- Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/) +- RepRap.org [Marlin Forum](http://forums.reprap.org/list.php?415) +- [Tom's 3D Forums](https://forum.toms3d.org/) +- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/) +- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube + +## Credits + +The current Marlin dev team consists of: + + - Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA   [Donate](http://www.thinkyhead.com/donate-to-marlin) + - 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 + - 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 + +Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork. + +While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own. diff --git a/buildroot/bin/.gitattributes b/buildroot/bin/.gitattributes new file mode 100644 index 00000000..6313b56c --- /dev/null +++ b/buildroot/bin/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/buildroot/bin/format_code b/buildroot/bin/format_code new file mode 100644 index 00000000..8ae04b1b --- /dev/null +++ b/buildroot/bin/format_code @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# +# format_code [dir/file...] +# + +HERE=`dirname $0` + +while [[ $# -gt 0 ]]; do + + val="$1" + + if [ -d "$val" ]; then + + find $val -name *.cpp -exec "$HERE/uncrust" '{}' \; + + elif [ -d "./Marlin/src/$val" ]; then + + find "./Marlin/src/$val" -name *.cpp -exec "$HERE/uncrust" '{}' \; + + elif [ -f "./Marlin/src/$val" ]; then + + uncrust "./Marlin/src/$val" + + elif [ -f "$val" ]; then + + uncrust "$val" + + fi + +done diff --git a/buildroot/bin/generate_version b/buildroot/bin/generate_version new file mode 100644 index 00000000..b88e3de9 --- /dev/null +++ b/buildroot/bin/generate_version @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +# +# generate_version +# +# Make a Version.h file to accompany CUSTOM_VERSION_FILE +# + +DIR=${1:-"Marlin"} + +# MRCC3=$( git merge-base HEAD upstream/bugfix-2.0.x 2>/dev/null ) +# MRCC2=$( git merge-base HEAD upstream/bugfix-1.1.x 2>/dev/null ) +# MRCC1=$( git merge-base HEAD upstream/1.1.x 2>/dev/null ) + +# BASE='?' +# if [[ -n $MRCC3 && $MRCC3 != $MRCC2 ]]; then +# BASE=bugfix-2.0.x +# elif [[ -n $MRCC2 ]]; then +# BASE=bugfix-1.1.x +# elif [[ -n $MRCC1 ]]; then +# BASE=1.1.x +# fi + +BUILDATE=$(date '+%s') +DISTDATE=$(date '+%Y-%m-%d %H:%M') + +BRANCH=$(git -C "${DIR}" symbolic-ref -q --short HEAD) +VERSION=$(git -C "${DIR}" describe --tags --first-parent 2>/dev/null) + +[ -z "${BRANCH}" ] && BRANCH=$(echo "${TRAVIS_BRANCH}") +[ -z "${VERSION}" ] && VERSION=$(git -C "${DIR}" describe --tags --first-parent --always 2>/dev/null) + +SHORT_BUILD_VERSION=$(echo "${BRANCH}") +DETAILED_BUILD_VERSION=$(echo "${BRANCH}-${VERSION}") + +# Gets some misc options from their defaults +DEFAULT_MACHINE_UUID=$(awk -F'"' \ + '/#define DEFAULT_MACHINE_UUID/{ print $2 }' < "${DIR}/Version.h") +MACHINE_NAME=$(awk -F'"' \ + '/#define MACHINE_NAME/{ print $2 }' < "${DIR}/Version.h") +PROTOCOL_VERSION=$(awk -F'"' \ + '/#define PROTOCOL_VERSION/{ print $2 }' < "${DIR}/Version.h") +SOURCE_CODE_URL=$(awk -F'"' \ + '/#define SOURCE_CODE_URL/{ print $2 }' < "${DIR}/Version.h") +WEBSITE_URL=$(awk -F'"' \ + '/#define WEBSITE_URL/{ print $2 }' < "${DIR}/Version.h") + +cat > "${DIR}/Version.h" <. + * + */ +#pragma once + +/** + * THIS FILE IS AUTOMATICALLY GENERATED DO NOT MANUALLY EDIT IT. + * IT DOES NOT GET COMMITTED TO THE REPOSITORY. + * + * Branch: ${BRANCH} + * Version: ${VERSION} + */ + +/** + * Marlin release version identifier + */ +#ifndef SHORT_BUILD_VERSION + #define SHORT_BUILD_VERSION "${SHORT_BUILD_VERSION}" +#endif + +/** + * Verbose version identifier which should contain a reference to the location + * from where the binary was downloaded or the source code was compiled. + */ +#ifndef DETAILED_BUILD_VERSION + #define DETAILED_BUILD_VERSION "${DETAILED_BUILD_VERSION}" +#endif + +/** + * The STRING_DISTRIBUTION_DATE represents when the binary file was built, + * here we define this default string as the date where the latest release + * version was tagged. + */ +#ifndef STRING_DISTRIBUTION_DATE + #define STRING_DISTRIBUTION_DATE "${DISTDATE}" +#endif + +/** + * The protocol for communication to the host. Protocol indicates communication + * standards such as the use of ASCII, "echo:" and "error:" line prefixes, etc. + * (Other behaviors are given by the firmware version and capabilities report.) + */ +#ifndef PROTOCOL_VERSION + #define PROTOCOL_VERSION "${PROTOCOL_VERSION}" +#endif + +/** + * Defines a generic printer name to be output to the LCD after booting Marlin. + */ +#ifndef MACHINE_NAME + #define MACHINE_NAME "${MACHINE_NAME}" +#endif + +/** + * The SOURCE_CODE_URL is the location where users will find the Marlin Source + * Code which is installed on the device. In most cases —unless the manufacturer + * has a distinct Github fork— the Source Code URL should just be the main + * Marlin repository. + */ +#ifndef SOURCE_CODE_URL + #define SOURCE_CODE_URL "${SOURCE_CODE_URL}" +#endif + +/** + * Default generic printer UUID. + */ +#ifndef DEFAULT_MACHINE_UUID + #define DEFAULT_MACHINE_UUID "${DEFAULT_MACHINE_UUID}" +#endif + +/** + * The WEBSITE_URL is the location where users can get more information such as + * documentation about a specific Marlin release. + */ +#ifndef WEBSITE_URL + #define WEBSITE_URL "${WEBSITE_URL}" +#endif + +EOF diff --git a/buildroot/bin/opt_add b/buildroot/bin/opt_add new file mode 100644 index 00000000..2306ebda --- /dev/null +++ b/buildroot/bin/opt_add @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +eval "echo '#define ${@}' | cat - Marlin/Configuration.h > temp && mv temp Marlin/Configuration.h" diff --git a/buildroot/bin/opt_disable b/buildroot/bin/opt_disable new file mode 100644 index 00000000..11526132 --- /dev/null +++ b/buildroot/bin/opt_disable @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +SED=$(which gsed || which sed) + +for opt in "$@" ; do + # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 + eval "${SED} -i '/\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define \b${opt}\b\)/{s//\1\3\/\/\4/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define \b${opt}\b\)/{s//\1\3\/\/\4/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + (echo "ERROR: opt_disable Can't find ${opt}" >&2 && exit 9) +done diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable new file mode 100644 index 00000000..96686d6c --- /dev/null +++ b/buildroot/bin/opt_enable @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +SED=$(which gsed || which sed) + +for opt in "$@" ; do + # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 + eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) +done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set new file mode 100644 index 00000000..a646e09a --- /dev/null +++ b/buildroot/bin/opt_set @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +# exit on first failure +set -e + +SED=$(which gsed || which sed) + +# Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 +eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || +eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || +eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" || +(echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) diff --git a/buildroot/bin/pins_set b/buildroot/bin/pins_set new file mode 100644 index 00000000..87a8692a --- /dev/null +++ b/buildroot/bin/pins_set @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +IFS='/' read -r -a PINPATH <<< "$1" +DIR=${PINPATH[0]} +NAM=${PINPATH[1]} +PIN=$2 +VAL=$3 + +SED=$(which gsed || which sed) +eval "${SED} -i '/\(\/\/\)*\(#define \+${PIN}\b\).*$/{s//\2 ${VAL}/;h};\${x;/./{x;q0};x;q9}' Marlin/src/pins/$DIR/pins_${NAM}.h" || +(echo "ERROR: pins_set Can't find ${PIN}" >&2 && exit 9) diff --git a/buildroot/bin/restore_configs b/buildroot/bin/restore_configs new file mode 100644 index 00000000..b2d0ea19 --- /dev/null +++ b/buildroot/bin/restore_configs @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +git checkout Marlin/Configuration*.h 2>/dev/null +git checkout Marlin/src/pins/ramps/pins_RAMPS.h 2>/dev/null +rm -f Marlin/_Bootscreen.h Marlin/_Statusscreen.h diff --git a/buildroot/bin/uncrust b/buildroot/bin/uncrust new file mode 100644 index 00000000..9893b5c3 --- /dev/null +++ b/buildroot/bin/uncrust @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Run uncrustify for a file in-place +# + +TMPDIR=`mktemp -d` + +# Reformat a single file to tmp/ +uncrustify -l CPP -c ./buildroot/share/extras/uncrustify.cfg -f "$1" >$TMPDIR/uncrustify.out + +# Replace the original file +cp "$TMPDIR/uncrustify.out" "$1" + +# Clean up, deliberately +rm "$TMPDIR/uncrustify.out" +rmdir "$TMPDIR" diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs new file mode 100644 index 00000000..83c0f548 --- /dev/null +++ b/buildroot/bin/use_example_configs @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +IFS=: read -r PART1 PART2 <<< "$@" +[ -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 + +$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_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/etc/.astylerc b/buildroot/etc/.astylerc new file mode 100644 index 00000000..aefe32c7 --- /dev/null +++ b/buildroot/etc/.astylerc @@ -0,0 +1,23 @@ +--style=google +--keep-one-line-blocks + +--indent=spaces=2 +--indent-preproc-block +--indent-preproc-define +--indent-col1-comments + +--remove-brackets +--break-after-logical +--delete-empty-lines + +--pad-oper +--pad-header +--unpad-paren +--align-pointer=type +--align-reference=type + +--attach-classes +--attach-inlines +--keep-one-line-statements + +--indent-namespaces diff --git a/buildroot/etc/udev/rules.d/99-platformio-udev.rules b/buildroot/etc/udev/rules.d/99-platformio-udev.rules new file mode 100644 index 00000000..3c829882 --- /dev/null +++ b/buildroot/etc/udev/rules.d/99-platformio-udev.rules @@ -0,0 +1,207 @@ +# Copyright (c) 2014-present PlatformIO +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# 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, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +##################################################################################### +# +# INSTALLATION +# +# Please visit > https://docs.platformio.org/en/latest/faq.html#platformio-udev-rules +# +##################################################################################### + +# +# Boards +# + +# CP210X USB UART +SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666" + +# FT232R USB UART +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE:="0666" + +# Prolific Technology, Inc. PL2303 Serial Port +SUBSYSTEMS=="usb", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", MODE:="0666" + +# QinHeng Electronics HL-340 USB-Serial adapter +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666" + +# Arduino boards +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="[08][02]*", MODE:="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="[08][02]*", MODE:="0666" + +# Arduino SAM-BA +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", ENV{MTP_NO_PROBE}="1" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", MODE:="0666" + +# Digistump boards +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1" + +# STM32 discovery boards, with onboard st/linkv2 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374?", MODE:="0666" + +# USBtiny +SUBSYSTEMS=="usb", ATTRS{idProduct}=="0c9f", ATTRS{idVendor}=="1781", MODE="0666" + +# USBasp V2.0 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", MODE:="0666" + +# Teensy boards +ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", ENV{ID_MM_DEVICE_IGNORE}="1" +ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", ENV{MTP_NO_PROBE}="1" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", MODE:="0666" +KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789]?", MODE:="0666" + +#TI Stellaris Launchpad +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="0666" + +#TI MSP430 Launchpad +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0666" + + +# +# Debuggers +# + +# Black Magic Probe +SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic GDB Server" +SUBSYSTEM=="tty", ATTRS{interface}=="Black Magic UART Port" + +# opendous and estick +ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT232/FT245 VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT2232 VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT4232 VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Original FT232H VID:PID +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# DISTORTEC JTAG-lock-pick Tiny 2 +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TUMPA, TUMPA Lite +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a98", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a99", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# XDS100v2 +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Xverve Signalyzer Tool (DT-USB-ST), Signalyzer LITE (DT-USB-SLITE) +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca0", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca1", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI/Luminary Stellaris Evaluation Board FTDI (several) +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd9", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI/Luminary Stellaris In-Circuit Debug Interface FTDI (ICDI) Board +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# egnite Turtelizer 2 +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Section5 ICEbear +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c140", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c141", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Amontec JTAGkey and JTAGkey-tiny +ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI ICDI +ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# STLink v1 +ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# STLink v2 +ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# STLink v2-1 +ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Hilscher NXHX Boards +ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Hitex STR9-comStick +ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002c", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Hitex STM32-PerformanceStick +ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002d", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Altera USB Blaster +ATTRS{idVendor}=="09fb", ATTRS{idProduct}=="6001", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Amontec JTAGkey-HiSpeed +ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# SEGGER J-Link +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0102", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0103", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0104", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0105", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0107", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0108", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1010", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1011", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1012", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1013", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1014", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1016", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1017", MODE="660", GROUP="plugdev", TAG+="uaccess" +ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1018", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Raisonance RLink +ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Debug Board for Neo1973 +ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0003", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD-TINY +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-JTAG-EW +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="001e", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD-TINY-H +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Olimex ARM-USB-OCD-H +ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002b", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# USBprog with OpenOCD firmware +ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board +ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Marvell Sheevaplug +ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# Keil Software, Inc. ULink +ATTRS{idVendor}=="c251", ATTRS{idProduct}=="2710", MODE="660", GROUP="plugdev", TAG+="uaccess" + +# CMSIS-DAP compatible adapters +ATTRS{product}=="*CMSIS-DAP*", MODE="660", GROUP="plugdev", TAG+="uaccess" diff --git a/buildroot/share/PlatformIO/boards/Artillery_Ruby.json b/buildroot/share/PlatformIO/boards/Artillery_Ruby.json new file mode 100644 index 00000000..71fb86fe --- /dev/null +++ b/buildroot/share/PlatformIO/boards/Artillery_Ruby.json @@ -0,0 +1,64 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F401xx", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f401rct6", + "variant": "Artillery_Ruby" + }, + "debug": { + "jlink_device": "STM32F401RC", + "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": "STM32F401RC (64k RAM. 256k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 65536, + "maximum_size": 262144, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/en/evaluation-tools/steval-3dp001v1.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/boards/BigTree_Btt002.json b/buildroot/share/PlatformIO/boards/BigTree_Btt002.json new file mode 100644 index 00000000..d0d092f1 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/BigTree_Btt002.json @@ -0,0 +1,46 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407vgt6", + "variant": "BIGTREE_BTT002" + }, + "debug": { + "jlink_device": "STM32F407VG", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "STM32F407VG (192k RAM. 1024k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 131072, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "offset_address": "0x8008000", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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 new file mode 100644 index 00000000..32236301 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/BigTree_GTR_v1.json @@ -0,0 +1,46 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407zgt6", + "variant": "BIGTREE_GTR_V1" + }, + "debug": { + "jlink_device": "STM32F407ZG", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "STM32F407ZG (192k RAM. 1024k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 196608, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "offset_address": "0x8008000", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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 new file mode 100644 index 00000000..211ceacd --- /dev/null +++ b/buildroot/share/PlatformIO/boards/BigTree_SKR_Pro.json @@ -0,0 +1,46 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407zgt6", + "variant": "BIGTREE_SKR_PRO_1v1" + }, + "debug": { + "jlink_device": "STM32F407ZG", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "STM32F407ZG (192k RAM. 1024k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 196608, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "offset_address": "0x8008000", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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 new file mode 100644 index 00000000..ecf7bff6 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/CHITU_F103.json @@ -0,0 +1,48 @@ +{ + "build": { + "core": "maple", + "cpu": "cortex-m3", + "extra_flags": "-DSTM32F103xE -DSTM32F1", + "f_cpu": "72000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x1EAF", + "0x0004" + ] + ], + "mcu": "stm32f103zet6", + "variant": "CHITU_F103", + "ldscript": "chitu_f103.ld" + }, + "debug": { + "jlink_device": "STM32F103ZE", + "openocd_target": "stm32f1x", + "svd_path": "STM32F103xx.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "CHITU STM32F103Z (64k RAM. 512k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 60536, + "maximum_size": 480288, + "protocol": "stlink", + "protocols": [ + "jlink", + "stlink", + "blackmagic", + "serial", + "dfu" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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 new file mode 100644 index 00000000..7e585c50 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/FLYF407ZG.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": "FLY_F407ZG" + }, + "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": "dfu", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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 new file mode 100644 index 00000000..011814a1 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/LERDGE.json @@ -0,0 +1,65 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F407xx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407zgt6", + "variant": "LERDGE", + "ldscript": "LERDGE.ld" + }, + "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": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407ZG.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/boards/MEEB_3DP.json b/buildroot/share/PlatformIO/boards/MEEB_3DP.json new file mode 100644 index 00000000..870648b3 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/MEEB_3DP.json @@ -0,0 +1,53 @@ +{ + "build": { + "core": "maple", + "cpu": "cortex-m3", + "extra_flags": "-DSTM32F103xE -DSTM32F1", + "f_cpu": "72000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x1EAF", + "0x0004" + ] + ], + "libopencm3": { + "ldscript": "stm32f103xc.ld" + }, + "mcu": "stm32f103rct6", + "variant": "MEEB_3DP" + }, + "debug": { + "jlink_device": "STM32F103RC", + "openocd_target": "stm32f1x", + "svd_path": "STM32F103xx.svd" + }, + "frameworks": [ + "arduino", + "cmsis", + "libopencm3", + "stm32cube" + ], + "name": "3D Printer control board for MEEB with 512k flash/rs422 bus/tmc2208 drivers", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 49152, + "maximum_size": 524288, + "protocol": "dfu", + "protocols": [ + "jlink", + "stlink", + "blackmagic", + "serial", + "dfu" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://github.com/ccrobot-online/MEEB_3DP", + "vendor": "CCROBOT-ONLINE" +} diff --git a/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json b/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json new file mode 100644 index 00000000..bbfb3fdf --- /dev/null +++ b/buildroot/share/PlatformIO/boards/STEVAL_STM32F401VE.json @@ -0,0 +1,65 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F401xx", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "ldscript": "stm32f401xe.ld", + "mcu": "stm32f401vet6", + "variant": "STEVAL_F401VE" + }, + "debug": { + "jlink_device": "STM32F401VE", + "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": "STM32F401VE (96k RAM. 512k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 98304, + "maximum_size": 514288, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/en/evaluation-tools/steval-3dp001v1.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/boards/archim.json b/buildroot/share/PlatformIO/boards/archim.json new file mode 100644 index 00000000..60035197 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/archim.json @@ -0,0 +1,59 @@ +{ + "build": { + "core": "arduino", + "cpu": "cortex-m3", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_ARCH_SAM -DARDUINO_SAM_DUE", + "f_cpu": "84000000L", + "hwids": [ + [ + "0x27B1", + "0x0001" + ], + [ + "0x2341", + "0x003E" + ], + [ + "0x2341", + "0x003D" + ] + ], + "ldscript": "linker_scripts/gcc/flash.ld", + "mcu": "at91sam3x8e", + "usb_product": "Archim", + "variant": "archim" + }, + "connectivity": [ + "can" + ], + "debug": { + "jlink_device": "ATSAM3X8E", + "openocd_chipname": "at91sam3X8E", + "openocd_target": "at91sam3XXX", + "svd_path": "ATSAM3X8E.svd" + }, + "frameworks": [ + "arduino", + "simba" + ], + "name": "Archim", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 98304, + "maximum_size": 524288, + "native_usb": true, + "protocol": "sam-ba", + "protocols": [ + "sam-ba", + "jlink", + "blackmagic", + "atmel-ice", + "stlink" + ], + "require_upload_port": true, + "use_1200bps_touch": true, + "wait_for_upload_port": true + }, + "url": "https://ultimachine.com", + "vendor": "UltiMachine" +} diff --git a/buildroot/share/PlatformIO/boards/at90usb1286.json b/buildroot/share/PlatformIO/boards/at90usb1286.json new file mode 100644 index 00000000..3282722b --- /dev/null +++ b/buildroot/share/PlatformIO/boards/at90usb1286.json @@ -0,0 +1,21 @@ +{ + "build": { + "core": "teensy", + "extra_flags": "-DTEENSY2PP -fsingle-precision-constant", + "f_cpu": "16000000L", + "mcu": "at90usb1286" + }, + "frameworks": [ + "arduino" + ], + "platform": "teensy", + "name": "Atmel AT90USB1286 based", + "upload": { + "maximum_ram_size": 8192, + "maximum_size": 122880, + "require_upload_port": true, + "protocol": "" + }, + "url": "https://github.com/MarlinFirmware/Marlin", + "vendor": "various" +} diff --git a/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json b/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json new file mode 100644 index 00000000..17656340 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/blackSTM32F407VET6.json @@ -0,0 +1,64 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F407xx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407vet6", + "variant": "MARLIN_F407VE" + }, + "debug": { + "jlink_device": "STM32F407VE", + "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": "STM32F407VE (192k RAM. 512k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 131072, + "maximum_size": 514288, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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 new file mode 100644 index 00000000..4dbf7607 --- /dev/null +++ b/buildroot/share/PlatformIO/boards/malyanM200.json @@ -0,0 +1,35 @@ +{ + "build": { + "core": "maple", + "cpu": "cortex-m3", + "extra_flags": "-DARDUINO_GENERIC_STM32F103C -DMCU_STM32F103CB", + "f_cpu": "72000000L", + "hwids": [ + ["0x1EAF", "0x0003"], + ["0x1EAF", "0x0004"] + ], + "ldscript": "jtagOffset.ld", + "mcu": "stm32f103cb", + "variant": "malyanM200", + "vec_tab_addr": "0x8002000" + }, + "debug": { + "jlink_device": "STM32F103CB", + "openocd_target": "stm32f1x", + "svd_path": "STM32F103xx.svd" + }, + "platform": "ststm32", + "frameworks": ["arduino"], + "name": "Malyan STM32F103CB (20k RAM. 128k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 20480, + "maximum_size": 131072, + "protocol": "serial", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "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/PlatformIO/boards/malyanM200v2.json b/buildroot/share/PlatformIO/boards/malyanM200v2.json new file mode 100644 index 00000000..765a0c0a --- /dev/null +++ b/buildroot/share/PlatformIO/boards/malyanM200v2.json @@ -0,0 +1,41 @@ +{ + "build": { + "cpu": "cortex-m0", + "extra_flags": "-DSTM32F070xB", + "f_cpu": "48000000L", + "mcu": "stm32f070rbt6", + "variant": "MALYANMx00_F070CB", + "vec_tab_addr": "0x8002000" + }, + "debug": { + "jlink_device": "STM32F070RB", + "default_tools": [ + "stlink" + ], + "onboard_tools": [ + "stlink" + ], + "openocd_board": "st_nucleo_f0", + "openocd_target": "stm32f0x" + }, + "platform": "ststm32", + "frameworks": [ + "mbed", + "stm32cube", + "arduino" + ], + "name": "Malyan M200 V2/Delta", + "upload": { + "maximum_ram_size": 16384, + "maximum_size": 131072, + "protocol": "mbed", + "protocols": [ + "jlink", + "stlink", + "blackmagic", + "mbed" + ] + }, + "url": "https://developer.mbed.org/platforms/ST-Nucleo-F070RB/", + "vendor": "Malyan" +} diff --git a/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json new file mode 100644 index 00000000..286e46ff --- /dev/null +++ b/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json @@ -0,0 +1,35 @@ +{ + "build": { + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F446xx", + "f_cpu": "180000000L", + "mcu": "stm32f446ret6", + "variant": "MARLIN_FYSETC_S6" + }, + "connectivity": [ + "can" + ], + "debug": { + "jlink_device": "STM32F446RE", + "openocd_target": "stm32f4x", + "svd_path": "STM32F446x.svd" + }, + "frameworks": [ + "arduino", + "stm32cube" + ], + "name": "3D Printer control board", + "upload": { + "maximum_ram_size": 131072, + "maximum_size": 524288, + "protocol": "stlink", + "protocols": [ + "jlink", + "stlink", + "blackmagic", + "serial" + ] + }, + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f446.html", + "vendor": "FYSETC" +} diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld new file mode 100644 index 00000000..01609b9b --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 + rom (rx) : ORIGIN = 0x08002000, LENGTH = 512K - 8K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_256K.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_256K.ld new file mode 100644 index 00000000..1e720c17 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_256K.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 256K - 28K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_512K.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_512K.ld new file mode 100644 index 00000000..248b7781 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_512K.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld b/buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld new file mode 100644 index 00000000..e7a71012 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 + rom (rx) : ORIGIN = 0x08010000, LENGTH = 512K - 64K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld b/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld new file mode 100644 index 00000000..0938e8e5 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/chitu_f103.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 60K + rom (rx) : ORIGIN = 0x08008800, LENGTH = 512K - 34K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/creality.ld b/buildroot/share/PlatformIO/ldscripts/creality.ld new file mode 100644 index 00000000..78534554 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/creality.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/fly_mini.ld b/buildroot/share/PlatformIO/ldscripts/fly_mini.ld new file mode 100644 index 00000000..2404e7ca --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/fly_mini.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 + rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld b/buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld new file mode 100644 index 00000000..6777e591 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.ld @@ -0,0 +1,18 @@ +/* + * Linker script for Generic STM32F103RC boards, using the generic bootloader (which takes the lower 8k of memory) + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K + rom (rx) : ORIGIN = 0x08008000, LENGTH = 256K - 32K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld b/buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld new file mode 100644 index 00000000..db172c97 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 64K - 3K + rom (rx) : ORIGIN = 0x0800A000, LENGTH = 512K - 40K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/lerdge.ld b/buildroot/share/PlatformIO/ldscripts/lerdge.ld new file mode 100644 index 00000000..aa0b1dd9 --- /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/ldscripts/mks_robin_e3p.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld new file mode 100644 index 00000000..d8a138ca --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/mks_robin_e3p.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld new file mode 100644 index 00000000..13fa48ad --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/mks_robin_lite.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K - 40 + rom (rx) : ORIGIN = 0x08005000, LENGTH = 256K - 20K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld new file mode 100644 index 00000000..d8a138ca --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/mks_robin_nano.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K - 4K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld b/buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld new file mode 100644 index 00000000..78534554 --- /dev/null +++ b/buildroot/share/PlatformIO/ldscripts/mks_robin_pro.ld @@ -0,0 +1,14 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py b/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py new file mode 100644 index 00000000..580529c9 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py @@ -0,0 +1,9 @@ +import os +Import("env") + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.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 diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py new file mode 100644 index 00000000..547d80ac --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -0,0 +1,59 @@ +try: + import configparser +except ImportError: + import ConfigParser as configparser + +import os +Import("env", "projenv") +# access to global build environment +print(env) +# access to project build environment (is used source files in "src" folder) +print(projenv) + +config = configparser.ConfigParser() +config.read("platformio.ini") + +#com_port = config.get("env:STM32F103RC_meeb", "upload_port") +#print('Use the {0:s} to reboot the board to dfu mode.'.format(com_port)) + +# +# Upload actions +# + +def before_upload(source, target, env): + print("before_upload") + # do some actions + # use com_port + # + env.Execute("pwd") + +def after_upload(source, target, env): + print("after_upload") + # do some actions + # + # + env.Execute("pwd") + +print("Current build targets", map(str, BUILD_TARGETS)) + +env.AddPreAction("upload", before_upload) +env.AddPostAction("upload", after_upload) + +flash_size = 0 +vect_tab_addr = 0 + +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + vect_tab_addr = define[1] + if define[0] == "STM32_FLASH_SIZE": + flash_size = define[1] + +print('Use the {0:s} address as the marlin app entry point.'.format(vect_tab_addr)) +print('Use the {0:d}KB flash version of stm32f103rct6 chip.'.format(flash_size)) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RC_MEEB_3DP.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 diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py new file mode 100644 index 00000000..497a035f --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py @@ -0,0 +1,20 @@ +import os +Import("env") + +STM32_FLASH_SIZE = 256 + +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) + if define[0] == "STM32_FLASH_SIZE": + STM32_FLASH_SIZE = define[1] + +# Relocate firmware from 0x08000000 to 0x08007000 +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RC_SKR_MINI_" + str(STM32_FLASH_SIZE) + "K.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 diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py new file mode 100644 index 00000000..b69f6257 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -0,0 +1,36 @@ +import os +from os.path import join +from os.path import expandvars +Import("env") + +# Relocate firmware from 0x08000000 to 0x08008000 +#for define in env['CPPDEFINES']: +# if define[0] == "VECT_TAB_ADDR": +# env['CPPDEFINES'].remove(define) +#env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08008000")) + +#custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fysetc_stm32f103rc.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 + +# Custom HEX from ELF +env.AddPostAction( + join("$BUILD_DIR","${PROGNAME}.elf"), + env.VerboseAction(" ".join([ + "$OBJCOPY", "-O ihex", "$TARGET", # TARGET=.pio/build/fysetc_STM32F1/firmware.elf + "\"" + join("$BUILD_DIR","${PROGNAME}.hex") + "\"", # Note: $BUILD_DIR is a full path + ]), "Building $TARGET")) + +# In-line command with arguments +UPLOAD_TOOL="stm32flash" +platform = env.PioPlatform() +if platform.get_package_dir("tool-stm32duino") != None: + UPLOAD_TOOL=expandvars("\"" + join(platform.get_package_dir("tool-stm32duino"),"stm32flash","stm32flash") + "\"") + +env.Replace( + UPLOADER=UPLOAD_TOOL, + UPLOADCMD=expandvars(UPLOAD_TOOL + " -v -i rts,-dtr,dtr -R -b 115200 -g 0x8000000 -w \"" + join("$BUILD_DIR","${PROGNAME}.hex")+"\"" + " $UPLOAD_PORT") +) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py new file mode 100644 index 00000000..ecdd57f5 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py @@ -0,0 +1,16 @@ +import os +Import("env") + +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) + +# Relocate firmware from 0x08000000 to 0x08007000 +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08007000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103RE_SKR_E3_DIP.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 diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py new file mode 100644 index 00000000..ece47ed0 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py @@ -0,0 +1,33 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08010000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08010000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/STM32F103VE_longer.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 + + +# Rename ${PROGNAME}.bin and save it as 'project.bin' (No encryption on the Longer3D) +def encrypt(source, target, env): + firmware = open(target[0].path, "rb") + marlin_alfa = open(target[0].dir.path +'/project.bin', "wb") + length = os.path.getsize(target[0].path) + position = 0 + try: + while position < length: + byte = firmware.read(1) + marlin_alfa.write(byte) + position += 1 + finally: + firmware.close() + marlin_alfa.close() + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py new file mode 100644 index 00000000..4849f59c --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -0,0 +1,34 @@ +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() + +FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple") +assert os.path.isdir(FRAMEWORK_DIR) +assert os.path.isdir("buildroot/share/PlatformIO/variants") + +variant = board.get("build.variant") +variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "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/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py new file mode 100644 index 00000000..aa675878 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -0,0 +1,127 @@ +Import("env") +import os +import random +import struct +import uuid + +# Relocate firmware from 0x08000000 to 0x08008800 +env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08008800")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/chitu_f103.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 calculate_crc(contents, seed): + accumulating_xor_value = seed; + + for i in range(0, len(contents), 4): + value = struct.unpack('> ip + + # load a byte into IP + ip = r0[loop_counter] + + # XOR the seed with r7 + xor_seed = xor_seed ^ r7 + + # and then with IP + xor_seed = xor_seed ^ ip + + #Now store the byte back + r1[loop_counter] = xor_seed & 0xFF + + #increment the loop_counter + loop_counter = loop_counter + 1 + + +def encrypt_file(input, output_file, file_length): + input_file = bytearray(input.read()) + block_size = 0x800 + key_length = 0x18 + + uid_value = uuid.uuid4() + file_key = int(uid_value.hex[0:8], 16) + + xor_crc = 0xEF3D4323; + + # the input file is exepcted to be in chunks of 0x800 + # so round the size + while len(input_file) % block_size != 0: + input_file.extend(b'0x0') + + # write the file header + output_file.write(struct.pack(">I", 0x443D2D3F)) + # encrypt the contents using a known file header key + + # write the file_key + output_file.write(struct.pack(". + * + */ + +/** + * The purpose of this file is just include Marlin Configuration files, + * to discover which FEATURES are enabled, without any HAL include. + * Used by common-dependencies.py + */ + +#define NUM_SERIAL 1 // Normally provided by HAL/HAL.h + +#include "../../../../Marlin/src/inc/MarlinConfig.h" + +// +// 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_MARLINUI_HD44780, LCD_I2C_TYPE_PCF8575, LCD_I2C_TYPE_PCA8574, SR_LCD_2W_NL, LCM1602) + #define USES_LIQUIDCRYSTAL +#endif + +#if SAVED_POSITIONS + #define HAS_SAVED_POSITIONS +#endif + +#if ENABLED(HOST_PROMPT_SUPPORT) && DISABLED(EMERGENCY_PARSER) + #define HAS_GCODE_M876 +#endif + +#if EXTRUDERS + #define HAS_EXTRUDERS +#endif + +#if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) + #define HAS_SMART_EFF_MOD +#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 ENABLED(PASSWORD_FEATURE) + #define HAS_MENU_PASSWORD + #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 new file mode 100644 index 00000000..4b4bba62 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -0,0 +1,287 @@ +# +# common-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 +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") + +#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': + return PackageManager(spec).name + else: + name, _, _ = PackageManager.parse_pkg_uri(spec) + return name + +FEATURE_CONFIG = {} + +def add_to_feat_cnf(feature, flines): + + try: + feat = FEATURE_CONFIG[feature] + except: + FEATURE_CONFIG[feature] = {} + + 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: + 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 custom_marlin.MY_OPTION to the pile + all_opts = env.GetProjectOptions() + for n in all_opts: + mat = re.match(r'custom_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_CONFIG: + feat = FEATURE_CONFIG[feature] + if not 'lib_deps' in feat: + continue + for dep in feat['lib_deps']: + name = 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 = 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 + if verbose: + print("Ignore libraries:", lib_ignore) + set_env_field('lib_ignore', lib_ignore) + +def apply_features_config(): + load_config() + for feature in FEATURE_CONFIG: + if not env.MarlinFeatureIsEnabled(feature): + continue + + feat = FEATURE_CONFIG[feature] + + if 'lib_deps' in feat and len(feat['lib_deps']): + blab("Adding lib_deps for %s... " % feature) + + # feat to add + deps_to_add = {} + for dep in feat['lib_deps']: + 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 = 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 = parse_pkg_uri(dep) + if name in deps_to_add: + del deps_to_add[name] + + # Is there anything left? + if len(deps_to_add) > 0: + # Only add the missing dependencies + set_env_field('lib_deps', deps + list(deps_to_add.values())) + + if 'extra_scripts' in feat: + blab("Running extra_scripts for %s... " % feature) + env.SConscript(feat['extra_scripts'], exports="env") + + if 'src_filter' in feat: + 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']) + 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 = feat['src_filter'] + ' ' + src_filter + set_env_field('src_filter', [src_filter]) + env.Replace(SRC_FILTER=src_filter) + + if 'lib_ignore' in feat: + blab("Adding lib_ignore for %s... " % feature) + lib_ignore = env.GetProjectOption('lib_ignore') + [feat['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']) +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): + blab('Getting g++ path from cache') + with open(GCC_PATH_CACHE, 'r') as f: + return f.read() + + # 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 += r'.*\\bin' + gcc += ".exe" + else: + path_separator = ':' + path_regex += r'/.+/bin' + + # Search for the compiler + for pathdir in env['ENV']['PATH'].split(path_separator): + if not re.search(path_regex, pathdir, re.IGNORECASE): + continue + 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): + blab('Caching g++ for current env') + with open(GCC_PATH_CACHE, 'w+') as f: + f.write(filepath) + + return filepath + + 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 +# +def load_marlin_features(): + if 'MARLIN_FEATURES' in env: + return + + # Process defines + 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")] + for s in build_flags['CPPDEFINES']: + if isinstance(s, tuple): + cmd += ['-D' + s[0] + '=' + str(s[1])] + else: + cmd += ['-D' + s] + + cmd += ['-D__MARLIN_DEPS__ -w -dM -E -x c++ buildroot/share/PlatformIO/scripts/common-dependencies.h'] + cmd = ' '.join(cmd) + blab(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 + +# +# Return True if a matching feature is enabled +# +def MarlinFeatureIsEnabled(env, feature): + load_marlin_features() + 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 +# +env.AddMethod(MarlinFeatureIsEnabled) + +# +# Add dependencies for enabled Marlin features +# +apply_features_config() +force_ignore_unused_libs() 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 00000000..f7d3f0d0 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -0,0 +1,58 @@ +import os,shutil +from SCons.Script import DefaultEnvironment +from platformio import util +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): + 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") + +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 = 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") + +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/creality.py b/buildroot/share/PlatformIO/scripts/creality.py new file mode 100644 index 00000000..b9d7d703 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/creality.py @@ -0,0 +1,17 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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']): + if "-Wl,-T" in flag: + env['LINKFLAGS'][i] = "-Wl,-T" + custom_ld_script + elif flag == "-T": + env['LINKFLAGS'][i + 1] = custom_ld_script 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 00000000..ae2ce467 --- /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/buildroot/share/PlatformIO/scripts/fly_mini.py b/buildroot/share/PlatformIO/scripts/fly_mini.py new file mode 100644 index 00000000..34d13295 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/fly_mini.py @@ -0,0 +1,16 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08005000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/fly_mini.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 + diff --git a/buildroot/share/PlatformIO/scripts/generate_hex.py b/buildroot/share/PlatformIO/scripts/generate_hex.py new file mode 100644 index 00000000..93f0dc5b --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/generate_hex.py @@ -0,0 +1,10 @@ +Import("env") +from os.path import join + +env.AddPostAction( + "$BUILD_DIR/${PROGNAME}.elf", + env.VerboseAction(" ".join([ + "$OBJCOPY", "-O", "ihex", "-R", ".eeprom", + "$BUILD_DIR/${PROGNAME}.elf", "$BUILD_DIR/${PROGNAME}.hex" + ]), "Building $BUILD_DIR/${PROGNAME}.hex") +) \ No newline at end of file diff --git a/buildroot/share/PlatformIO/scripts/generic_create_variant.py b/buildroot/share/PlatformIO/scripts/generic_create_variant.py new file mode 100644 index 00000000..0b82c69f --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/generic_create_variant.py @@ -0,0 +1,27 @@ +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") +assert os.path.isdir(FRAMEWORK_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/scripts/jgaurora_a5s_a1_with_bootloader.py b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py new file mode 100644 index 00000000..6c8a4f60 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py @@ -0,0 +1,48 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x0800A000 +env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) +#alternatively, for STSTM <=5.1.0 use line below +#env['CPPDEFINES'].remove(("VECT_TAB_ADDR", 134217728)) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x0800A000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/jgaurora_a5s_a1.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 + +#append ${PROGNAME}.bin firmware after bootloader and save it as 'jgaurora_firmware.bin' +def addboot(source,target,env): + firmware = open(target[0].path, "rb") + lengthfirmware = os.path.getsize(target[0].path) + bootloader_dir = "buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin" + bootloader = open(bootloader_dir, "rb") + lengthbootloader = os.path.getsize(bootloader_dir) + firmware_with_boothloader_dir = target[0].dir.path +'/firmware_with_bootloader.bin' + if os.path.exists(firmware_with_boothloader_dir): + os.remove(firmware_with_boothloader_dir) + firmwareimage = open(firmware_with_boothloader_dir, "wb") + position = 0 + while position < lengthbootloader: + byte = bootloader.read(1) + firmwareimage.write(byte) + position += 1 + position = 0 + while position < lengthfirmware: + byte = firmware.read(1) + firmwareimage.write(byte) + position += 1 + bootloader.close() + firmware.close() + firmwareimage.close() + firmware_without_bootloader_dir = target[0].dir.path+'/firmware_for_sd_upload.bin' + if os.path.exists(firmware_without_bootloader_dir): + os.remove(firmware_without_bootloader_dir) + os.rename(target[0].path, firmware_without_bootloader_dir) + #os.rename(target[0].dir.path+'/firmware_with_bootloader.bin', target[0].dir.path+'/firmware.bin') + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", addboot); + diff --git a/buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin b/buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin new file mode 100644 index 00000000..c229e5b3 Binary files /dev/null and b/buildroot/share/PlatformIO/scripts/jgaurora_bootloader.bin differ diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py new file mode 100644 index 00000000..fd934a12 --- /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/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py new file mode 100644 index 00000000..0d53cdfb --- /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/scripts/mks_robin.py b/buildroot/share/PlatformIO/scripts/mks_robin.py new file mode 100644 index 00000000..dd2342bf --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin.py @@ -0,0 +1,39 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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/mks_robin.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 + +# Encrypt ${PROGNAME}.bin and save it as 'Robin.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py new file mode 100644 index 00000000..3af623cc --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08005000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_e3.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin_e3.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py new file mode 100644 index 00000000..2aab14ba --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_e3p.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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/mks_robin_e3p.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'mks_robin_e3p.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin_e3p.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py new file mode 100644 index 00000000..2f3ae1fa --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08005000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_lite.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' +def encrypt(source, target, env): + import sys + + 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 +'/mksLite.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py new file mode 100644 index 00000000..67ad442d --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_lite3.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08005000 +for define in env['CPPDEFINES']: + if define[0] == "VECT_TAB_ADDR": + env['CPPDEFINES'].remove(define) +env['CPPDEFINES'].append(("VECT_TAB_ADDR", "0x08005000")) + +custom_ld_script = os.path.abspath("buildroot/share/PlatformIO/ldscripts/mks_robin_lite.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'mksLite.bin' +def encrypt(source, target, env): + import sys + + 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 +'/mksLite3.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_mini.py b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py new file mode 100644 index 00000000..d3866983 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_mini.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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/mks_robin_mini.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'Robin_mini.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin_mini.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py new file mode 100644 index 00000000..a68fd308 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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/mks_robin_nano.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin_nano.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py new file mode 100644 index 00000000..0047289a --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_nano35.py @@ -0,0 +1,40 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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/mks_robin_nano.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 + + +# Encrypt ${PROGNAME}.bin and save it as 'Robin_nano35.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin_nano35.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/mks_robin_pro.py b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py new file mode 100644 index 00000000..2ebf1ffb --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/mks_robin_pro.py @@ -0,0 +1,39 @@ +import os +Import("env") + +# Relocate firmware from 0x08000000 to 0x08007000 +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/mks_robin_pro.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 + +# Encrypt ${PROGNAME}.bin and save it as 'Robin.bin' +def encrypt(source, target, env): + import sys + + 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 +'/Robin_pro.bin', "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() +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", encrypt); diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py new file mode 100644 index 00000000..4d7ca5dc --- /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/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py new file mode 100644 index 00000000..d517f1c8 --- /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/Artillery_Ruby/PeripheralPins.c b/buildroot/share/PlatformIO/variants/Artillery_Ruby/PeripheralPins.c new file mode 100644 index 00000000..b2783d8c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/Artillery_Ruby/PeripheralPins.c @@ -0,0 +1,247 @@ +/* + ******************************************************************************* + * 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 STM32F401R(B-C)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_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {NC, NP, 0} +}; +#endif + +//*** No DAC *** + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, + {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, + {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)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {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)}, + {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)}, + {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, 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_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_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_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_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_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_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_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {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 + {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 + {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, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + {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)}, + {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {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)}, + {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)}, + {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, 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 +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, 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 +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, 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 +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)}, + {NC, NP, 0} +}; +#endif + +//*** No CAN *** + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +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 + +//*** 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, GPIO_AF12_SDIO)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/Artillery_Ruby/PinNamesVar.h b/buildroot/share/PlatformIO/variants/Artillery_Ruby/PinNamesVar.h new file mode 100644 index 00000000..3082f884 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/Artillery_Ruby/PinNamesVar.h @@ -0,0 +1,33 @@ +/* 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, +#endif diff --git a/buildroot/share/PlatformIO/variants/Artillery_Ruby/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/Artillery_Ruby/hal_conf_custom.h new file mode 100644 index 00000000..9fa98807 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/Artillery_Ruby/hal_conf_custom.h @@ -0,0 +1,496 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL 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 __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ + /** + * @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_CRC_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +//#define HAL_DAC_MODULE_ENABLED +/* #define HAL_DCMI_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_QSPI_MODULE_ENABLED */ +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#ifndef HAL_PCD_MODULE_ENABLED + #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#endif +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ + +/* ########################## HSE/HSI 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). + */ +#ifndef HSE_VALUE +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#ifndef 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). + */ +#ifndef HSI_VALUE +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#ifndef LSI_VALUE +#define LSI_VALUE 32000U /*!< 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. + */ +#ifndef LSE_VALUE +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#ifndef LSE_STARTUP_TIMEOUT +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#ifndef EXTERNAL_CLOCK_VALUE +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* 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 +#if !defined (INSTRUCTION_CACHE_ENABLE) +#define INSTRUCTION_CACHE_ENABLE 1U +#endif +#if !defined (DATA_CACHE_ENABLE) +#define DATA_CACHE_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_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH 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_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC 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_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI 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_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS 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)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex 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 + */ +#ifndef USE_SPI_CRC +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_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 /* __STM32F4xx_HAL_CONF_CUSTOM_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/Artillery_Ruby/ldscript.ld b/buildroot/share/PlatformIO/variants/Artillery_Ruby/ldscript.ld new file mode 100644 index 00000000..57c01c8d --- /dev/null +++ b/buildroot/share/PlatformIO/variants/Artillery_Ruby/ldscript.ld @@ -0,0 +1,196 @@ +/* +***************************************************************************** +** +** File : ldscript.ld +** +** Abstract : Linker script for STM32F401RETx Device with +** 512KByte FLASH, 96KByte 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) 2014 Ac6

+** +** 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 Ac6 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 = 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 +{ +BOOT (rx) : ORIGIN = 0x08000000, LENGTH = 16K +EMULATED_EEPROM (rx) : ORIGIN = 0x08004000, LENGTH = 16K +FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 256K - 16K * 2 +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >BOOT + + .boot : + { + . = ALIGN(4); + *(.text.Reset_Handler) + . = ALIGN(4); + } >BOOT + + /* The program code and other data goes into FLASH */ + .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 goes into FLASH */ + .rodata : + { + . = 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 + + + /* 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/variants/Artillery_Ruby/variant.cpp b/buildroot/share/PlatformIO/variants/Artillery_Ruby/variant.cpp new file mode 100644 index 00000000..8f24d68e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/Artillery_Ruby/variant.cpp @@ -0,0 +1,172 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +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_12, //D27 + PB_13, //D28 + PB_14, //D29 + PB_15, //D30 + PC_0, //D31 + PC_1, //D32 + PC_2, //D33 + PC_3, //D34 + PC_4, //D35 + PC_5, //D36 + PC_6, //D37 + PC_7, //D38 + PC_8, //D39 + PC_9, //D40 + PC_10, //D41 + PC_11, //D42 + PC_12, //D43 + PC_13, //D44 + PC_14, //D45 + PC_15, //D46 + PD_2, //D47 + PH_0, //D48 + PH_1, //D49 + + //Duplicated ADC Pins + PA_0, //D50/A0 + PA_1, //D51/A1 + PA_2, //D52/A2 + PA_3, //D53/A3 + PA_4, //D54/A4 + PA_5, //D55/A5 + PA_6, //D56/A6 + PA_7, //D57/A7 + PB_0, //D58/A8 + PB_1, //D59/A9 + PC_0, //D60/A10 + PC_1, //D61/A11 + PC_2, //D62/A12 + PC_3, //D63/A13 + PC_4, //D64/A14 + PC_5 //D65/A15 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 84000000 + * HCLK(Hz) = 84000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 2 + * APB2 Prescaler = 1 + * HSE Frequency(Hz) = 8000000 + * PLL_M = 8 + * PLL_N = 336 + * PLL_P = 4 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale2 mode + * Flash Latency(WS) = 2 + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + + /* Enable Power Control clock */ + __HAL_RCC_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_SCALE2); + + /* Enable HSI Oscillator and activate PLL with HSI as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + /* Initialization Error */ + while (1); + } + /* 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_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) { + /* Initialization Error */ + while (1); + } +} + +#ifdef __cplusplus +} +#endif + +void flashFirmware(const int16_t) { + *((unsigned long *)0x2000FFF0) = 0xDEADBEEF; // End of RAM + NVIC_SystemReset(); +} diff --git a/buildroot/share/PlatformIO/variants/Artillery_Ruby/variant.h b/buildroot/share/PlatformIO/variants/Artillery_Ruby/variant.h new file mode 100644 index 00000000..0c66ae89 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/Artillery_Ruby/variant.h @@ -0,0 +1,148 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + + +#define PA0 0 //D0 +#define PA1 1 //D1 +#define PA2 2 //D2 +#define PA3 3 //D3 +#define PA4 4 //D4 +#define PA5 5 //D5 +#define PA6 6 //D6 +#define PA7 7 //D7 +#define PA8 8 //D8 +#define PA9 9 //D9 +#define PA10 10 //D10 +#define PA11 11 //D11 +#define PA12 12 //D12 +#define PA13 13 //D13 +#define PA14 14 //D14 +#define PA15 15 //D15 +#define PB0 16 //D16 +#define PB1 17 //D17 +#define PB2 18 //D18 +#define PB3 19 //D19 +#define PB4 20 //D20 +#define PB5 21 //D21 +#define PB6 22 //D22 +#define PB7 23 //D23 +#define PB8 24 //D24 +#define PB9 25 //D25 +#define PB10 26 //D26 +#define PB12 27 //D27 +#define PB13 28 //D28 +#define PB14 29 //D29 +#define PB15 30 //D30 +#define PC0 31 //D31 +#define PC1 32 //D32 +#define PC2 33 //D33 +#define PC3 34 //D34 +#define PC4 35 //D35 +#define PC5 36 //D36 +#define PC6 37 //D37 +#define PC7 38 //D38 +#define PC8 39 //D39 +#define PC9 40 //D40 +#define PC10 41 //D41 +#define PC11 42 //D42 +#define PC12 43 //D43 +#define PC13 44 //D44 +#define PC14 45 //D45 +#define PC15 46 //D46 +#define PD2 47 //D47 +#define PH0 48 //D48 +#define PH1 49 //D49 + +// This must be a literal +#define NUM_DIGITAL_PINS 66 +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 16 +#define NUM_ANALOG_FIRST 50 + +/* +// PWM resolution +#define PWM_RESOLUTION 8 +#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans +#define PWM_MAX_DUTY_CYCLE 255 +*/ + +// SPI Definitions +#define PIN_SPI_MOSI PC12 +#define PIN_SPI_MISO PC11 +#define PIN_SPI_SCK PC10 +#define PIN_SPI_SS PA15 + +// Timer Definitions +// TIM1 - Hardware PWM (HB) +// TIM2 - TIMER_SERVO +// TIM3 - Hardware PWM (FAN0/1/2, HE0) +// TIM4 - Hardware PWM (LED_R/G/B) +// TIM5 - TIMER_TONE +// TIM9 - STEP_TIMER +// TIM10 - TEMP_TIMER +// TIM11 - +#define TIMER_SERVO TIM2 +#define TIMER_TONE TIM5 + +// UART Definitions +#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 + +#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 Serial +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c new file mode 100644 index 00000000..cff269db --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PeripheralPins.c @@ -0,0 +1,347 @@ +/* + ******************************************************************************* + * 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 by default. + * If you change them, you should know what you're doing first. + * ===== + */ + +//*** 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 E0_DIR + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 + + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 + #endif + {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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + {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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {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 + {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 + + /** + * Unused by specifications on BTT002. (PLEASE CONFIRM) + * 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_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 BLTOUCH is a "servo" + //{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, 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 + //{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_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 + //{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 + {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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {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)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {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)}, + #endif + {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_NOPULL, GPIO_AF5_SPI1)}, + {PB_15, 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} +}; + +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_14, 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} +}; + +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {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} +}; + +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +#error "CAN bus isn't available on this board. Driver should be disabled." +#endif + +//*** ETHERNET *** +#ifdef HAL_ETH_MODULE_ENABLED +#error "Ethernet port isn't available on this board. Driver should be disabled." +#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 used by LCD + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used + {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} +}; + +const PinMap PinMap_USB_OTG_HS[] = { /* + #ifdef USE_USB_HS_IN_FS + {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 + #error "USB in HS mode isn't supported by the board" + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {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_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/BIGTREE_BTT002/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/PinNamesVar.h new file mode 100644 index 00000000..b4bb9d45 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/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/BIGTREE_BTT002/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h new file mode 100644 index 00000000..e0e8239a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/hal_conf_extra.h @@ -0,0 +1,52 @@ +#pragma once + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) + +#undef HAL_SD_MODULE_ENABLED +#undef HAL_DAC_MODULE_ENABLED +#undef HAL_FLASH_MODULE_ENABLED +#undef HAL_CAN_MODULE_ENABLED +#undef HAL_CAN_LEGACY_MODULE_ENABLED +#undef HAL_CEC_MODULE_ENABLED +#undef HAL_CRYP_MODULE_ENABLED +#undef HAL_DCMI_MODULE_ENABLED +#undef HAL_DMA2D_MODULE_ENABLED +#undef HAL_ETH_MODULE_ENABLED +#undef HAL_NAND_MODULE_ENABLED +#undef HAL_NOR_MODULE_ENABLED +#undef HAL_PCCARD_MODULE_ENABLED +#undef HAL_SRAM_MODULE_ENABLED +#undef HAL_SDRAM_MODULE_ENABLED +#undef HAL_HASH_MODULE_ENABLED +#undef HAL_EXTI_MODULE_ENABLED +#undef HAL_SMBUS_MODULE_ENABLED +#undef HAL_I2S_MODULE_ENABLED +#undef HAL_IWDG_MODULE_ENABLED +#undef HAL_LTDC_MODULE_ENABLED +#undef HAL_DSI_MODULE_ENABLED +#undef HAL_QSPI_MODULE_ENABLED +#undef HAL_RNG_MODULE_ENABLED +#undef HAL_SAI_MODULE_ENABLED +#undef HAL_IRDA_MODULE_ENABLED +#undef HAL_SMARTCARD_MODULE_ENABLED +#undef HAL_WWDG_MODULE_ENABLED +#undef HAL_HCD_MODULE_ENABLED +#undef HAL_FMPI2C_MODULE_ENABLED +#undef HAL_SPDIFRX_MODULE_ENABLED +#undef HAL_DFSDM_MODULE_ENABLED +#undef HAL_LPTIM_MODULE_ENABLED +#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld new file mode 100644 index 00000000..0c060d17 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/ldscript.ld @@ -0,0 +1,204 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F407ZGTx 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. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** 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 Ac6 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 = 0x20020000; /* 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 = 0x8008000, LENGTH = 1024K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +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/variants/BIGTREE_BTT002/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp new file mode 100644 index 00000000..1486b218 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.cpp @@ -0,0 +1,260 @@ +/* + ******************************************************************************* + * 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 + +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + PC_13, //D0 + PC_14, //D1 - OSC32_IN + PC_15, //D2 - OSC32_OUT + PH_0, //D3 - OSC_IN + PH_1, //D4 - OSC_OUT + PB_2, //D5 - BOOT1 + PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 + PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID + PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS + PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID + PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM + PA_12, //D20 - 1:OTG_FS_DP + PA_13, //D21 - 0:JTMS-SWDIO + PA_14, //D22 - 0:JTCK-SWCLK + PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS + PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK + PD_2, //D27 - 1:UART5_RX / SDIO_CMD + PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX + PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX + PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 + PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 + PC_0, //D45/A10 - 1: 2:ADC123_IN10 + PC_1, //D46/A11 - 1: 2:ADC123_IN11 + PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 + PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 + PC_4, //D49/A14 - 1: 2:ADC12_IN14 + PC_5, //D50/A15 - 1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 + PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 + PF_10, //D58/A23 - 2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + PE_2, //D59 - 1:FSMC_A23 + PE_3, //D60 - 1:FSMC_A19 + PE_4, //D61 - 1:FSMC_A20 + PE_5, //D62 - 1:FSMC_A21 + PE_6, //D63 - 1:FSMC_A22 + PE_7, //D64 - 1:FSMC_D4 + PE_8, //D65 - 1:FSMC_D5 + PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 + PE_10, //D67 - 1:FSMC_D7 + PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 + PE_12, //D69 - 1:FSMC_D9 + PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 + PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 + PE_15, //D72 - 1:FSMC_D12 + PD_8, //D73 - 1:FSMC_D13 / USART3_TX + PD_9, //D74 - 1:FSMC_D14 / USART3_RX + PD_10, //D75 - 1:FSMC_D15 + PD_11, //D76 - 1:FSMC_A16 + PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 + PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 + PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 + PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 + PD_0, //D81 - 1:FSMC_D2 + PD_1, //D82 - 1:FSMC_D3 + PD_3, //D83 - 1:FSMC_CLK + PD_4, //D84 - 1:FSMC_NOE + PD_5, //D85 - 1:USART2_TX + PD_6, //D86 - 1:USART2_RX + PD_7, //D87 + PE_0, //D88 + PE_1, //D89 +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA + PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL + PF_2, //D92 - 1:FSMC_A2 + PF_11, //D93 + PF_12, //D94 - 1:FSMC_A6 + PF_13, //D95 - 1:FSMC_A7 + PF_14, //D96 - 1:FSMC_A8 + PF_15, //D97 - 1:FSMC_A9 + PG_0, //D98 - 1:FSMC_A10 + PG_1, //D99 - 1:FSMC_A11 + PG_2, //D100 - 1:FSMC_A12 + PG_3, //D101 - 1:FSMC_A13 + PG_4, //D102 - 1:FSMC_A14 + PG_5, //D103 - 1:FSMC_A15 + PG_6, //D104 + PG_7, //D105 + PG_8, //D106 + PG_9, //D107 - 1:USART6_RX + PG_10, //D108 - 1:FSMC_NE3 + PG_11, //D109 + PG_12, //D110 - 1:FSMC_NE4 + PG_13, //D111 - 1:FSMC_A24 + PG_14, //D112 - 1:FSMC_A25 / USART6_TX + PG_15, //D113 +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + PI_8, //D114 + PI_9, //D115 + PI_10, //D116 + PI_11, //D117 + PH_2, //D118 + PH_3, //D119 + PH_4, //D120 - 1:I2C2_SCL + PH_5, //D121 - 1:I2C2_SDA + PH_6, //D122 - 1:TIM12_CH1 + PH_7, //D123 - 1:I2C3_SCL + PH_8, //D124 - 1:I2C3_SDA + PH_9, //D125 - 1:TIM12_CH2 + PH_10, //D126 - 1:TIM5_CH1 + PH_11, //D127 - 1:TIM5_CH2 + PH_12, //D128 - 1:TIM5_CH3 + PH_13, //D129 + PH_14, //D130 + PH_15, //D131 + PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS + PI_1, //D133 - 1:SPI2_SCK + PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO + PI_3, //D135 - 1:SPI2_MOS + PI_4, //D136 + PI_5, //D137 - 1:TIM8_CH1 + PI_6, //D138 - 1:TIM8_CH2 + PI_7, //D139 - 1:TIM8_CH3 +#endif +}; + +#ifdef __cplusplus +} +#endif + +// ------------------------ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config() { + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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/BIGTREE_BTT002/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h new file mode 100644 index 00000000..ecc319f4 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_BTT002/variant.h @@ -0,0 +1,292 @@ +/* + ******************************************************************************* + * 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 + *----------------------------------------------------------------------------*/ + +#ifdef STM32F405RX + #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio + #define STM32F4X_GPIO_NUM 51 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5VX) + #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio + #define STM32F4X_GPIO_NUM 82 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5ZX) + #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio + #define STM32F4X_GPIO_NUM 114 + #define STM32F4X_ADC_NUM 24 +#elif defined(STM32F407IX) + #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio + #define STM32F4X_GPIO_NUM 140 + #define STM32F4X_ADC_NUM 24 +#else + #error "no match MCU defined" +#endif + +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + #define PC13 0 + #define PC14 1 //OSC32_IN + #define PC15 2 //OSC32_OUT + #define PH0 3 //OSC_IN + #define PH1 4 //OSC_OUT + #define PB2 5 //BOOT1 + #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 + #define PB12 8 //1:SPI2_NSS / OTG_HS_ID + #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS + #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID + #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM + #define PA12 20 //1:OTG_FS_DP + #define PA13 21 //0:JTMS-SWDIO + #define PA14 22 //0:JTCK-SWCLK + #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS + #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK + #define PD2 27 //1:UART5_RX / SDIO_CMD + #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX + #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX + #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 + #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 + #define PC0 45 //1: 2:ADC123_IN10 + #define PC1 46 //1: 2:ADC123_IN11 + #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 + #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 + #define PC4 49 //1: 2:ADC12_IN14 + #define PC5 50 //1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 + #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 + #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 + #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 + #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 + #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 + #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 + #define PF10 58 //2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 + #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 + #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 + #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 + #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 + #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 + #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 + #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 + #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 + #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 + #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 + #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 + #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 + #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 + #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX + #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX + #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 + #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 + #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 + #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 + #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 + #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 + #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 + #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 + #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK + #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE + #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX + #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX + #define PD7 (63+STM32F4X_ADC_NUM) + #define PE0 (64+STM32F4X_ADC_NUM) + #define PE1 (65+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA + #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL + #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 + #define PF11 (69+STM32F4X_ADC_NUM) + #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 + #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 + #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 + #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 + #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 + #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 + #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 + #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 + #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 + #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 + #define PG6 (80+STM32F4X_ADC_NUM) + #define PG7 (81+STM32F4X_ADC_NUM) + #define PG8 (82+STM32F4X_ADC_NUM) + #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX + #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 + #define PG11 (85+STM32F4X_ADC_NUM) + #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 + #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 + #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX + #define PG15 (89+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + #define PI8 (90+STM32F4X_ADC_NUM) + #define PI9 (91+STM32F4X_ADC_NUM) + #define PI10 (92+STM32F4X_ADC_NUM) + #define PI11 (93+STM32F4X_ADC_NUM) + #define PH2 (94+STM32F4X_ADC_NUM) + #define PH3 (95+STM32F4X_ADC_NUM) + #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL + #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA + #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 + #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL + #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA + #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 + #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 + #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 + #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 + #define PH13 (105+STM32F4X_ADC_NUM) + #define PH14 (106+STM32F4X_ADC_NUM) + #define PH15 (107+STM32F4X_ADC_NUM) + #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS + #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK + #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO + #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS + #define PI4 (112+STM32F4X_ADC_NUM) + #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 + #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 + #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 +#endif + +// This must be a literal +#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) +#define NUM_ANALOG_FIRST 35 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +/* + * BEWARE: + * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) + * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) + */ +//#define PWM_FREQUENCY 20000 +//The bottom values are the default and don't need to be redefined +//#define PWM_RESOLUTION 8 +//#define PWM_MAX_DUTY_CYCLE 255 + +// 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_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 +#define PIN_SPI_SS PB12 + +// 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 TIM7 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM2 + +// 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 + +#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/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c new file mode 100644 index 00000000..db0a4395 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PeripheralPins.c @@ -0,0 +1,380 @@ +/* + ******************************************************************************* + * 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 by default. + * If you change them, you should know what you're doing first. + * ===== + */ + +//*** 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 E0_DIR + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 + + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 + #endif + {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)}, + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio + #if STM32F4X_PIN_NUM >= 176 + {PH_5, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #else + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + #endif + {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)}, + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio + #if STM32F4X_PIN_NUM >= 176 + //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_4, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_7, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #else + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + #endif + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#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 + {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_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 + + /* + * 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) + */ + //{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_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_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_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, 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 + //{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_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 + //{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 + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_8, 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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; + +const PinMap PinMap_UART_RX[] = { + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_9, 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)}, + //{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)}, + //{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_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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{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)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{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)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_15, 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} +}; + +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_14, 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} +}; + +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {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} +}; + +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +#error "CAN bus isn't available on this board. Driver should be disabled." +#endif + +//*** ETHERNET *** +#ifdef HAL_ETH_MODULE_ENABLED +#error "Ethernet port isn't available on this board. Driver should be disabled." +#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 used by LCD + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used + {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} +}; + +const PinMap PinMap_USB_OTG_HS[] = { /* + #ifdef USE_USB_HS_IN_FS + {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 + #error "USB in HS mode isn't supported by the board" + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {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_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/BIGTREE_GTR_V1/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/PinNamesVar.h new file mode 100644 index 00000000..b4bb9d45 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/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/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h new file mode 100644 index 00000000..e0e8239a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h @@ -0,0 +1,52 @@ +#pragma once + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) + +#undef HAL_SD_MODULE_ENABLED +#undef HAL_DAC_MODULE_ENABLED +#undef HAL_FLASH_MODULE_ENABLED +#undef HAL_CAN_MODULE_ENABLED +#undef HAL_CAN_LEGACY_MODULE_ENABLED +#undef HAL_CEC_MODULE_ENABLED +#undef HAL_CRYP_MODULE_ENABLED +#undef HAL_DCMI_MODULE_ENABLED +#undef HAL_DMA2D_MODULE_ENABLED +#undef HAL_ETH_MODULE_ENABLED +#undef HAL_NAND_MODULE_ENABLED +#undef HAL_NOR_MODULE_ENABLED +#undef HAL_PCCARD_MODULE_ENABLED +#undef HAL_SRAM_MODULE_ENABLED +#undef HAL_SDRAM_MODULE_ENABLED +#undef HAL_HASH_MODULE_ENABLED +#undef HAL_EXTI_MODULE_ENABLED +#undef HAL_SMBUS_MODULE_ENABLED +#undef HAL_I2S_MODULE_ENABLED +#undef HAL_IWDG_MODULE_ENABLED +#undef HAL_LTDC_MODULE_ENABLED +#undef HAL_DSI_MODULE_ENABLED +#undef HAL_QSPI_MODULE_ENABLED +#undef HAL_RNG_MODULE_ENABLED +#undef HAL_SAI_MODULE_ENABLED +#undef HAL_IRDA_MODULE_ENABLED +#undef HAL_SMARTCARD_MODULE_ENABLED +#undef HAL_WWDG_MODULE_ENABLED +#undef HAL_HCD_MODULE_ENABLED +#undef HAL_FMPI2C_MODULE_ENABLED +#undef HAL_SPDIFRX_MODULE_ENABLED +#undef HAL_DFSDM_MODULE_ENABLED +#undef HAL_LPTIM_MODULE_ENABLED +#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp new file mode 100644 index 00000000..1486b218 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.cpp @@ -0,0 +1,260 @@ +/* + ******************************************************************************* + * 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 + +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + PC_13, //D0 + PC_14, //D1 - OSC32_IN + PC_15, //D2 - OSC32_OUT + PH_0, //D3 - OSC_IN + PH_1, //D4 - OSC_OUT + PB_2, //D5 - BOOT1 + PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 + PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID + PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS + PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID + PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM + PA_12, //D20 - 1:OTG_FS_DP + PA_13, //D21 - 0:JTMS-SWDIO + PA_14, //D22 - 0:JTCK-SWCLK + PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS + PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK + PD_2, //D27 - 1:UART5_RX / SDIO_CMD + PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX + PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX + PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 + PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 + PC_0, //D45/A10 - 1: 2:ADC123_IN10 + PC_1, //D46/A11 - 1: 2:ADC123_IN11 + PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 + PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 + PC_4, //D49/A14 - 1: 2:ADC12_IN14 + PC_5, //D50/A15 - 1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 + PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 + PF_10, //D58/A23 - 2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + PE_2, //D59 - 1:FSMC_A23 + PE_3, //D60 - 1:FSMC_A19 + PE_4, //D61 - 1:FSMC_A20 + PE_5, //D62 - 1:FSMC_A21 + PE_6, //D63 - 1:FSMC_A22 + PE_7, //D64 - 1:FSMC_D4 + PE_8, //D65 - 1:FSMC_D5 + PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 + PE_10, //D67 - 1:FSMC_D7 + PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 + PE_12, //D69 - 1:FSMC_D9 + PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 + PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 + PE_15, //D72 - 1:FSMC_D12 + PD_8, //D73 - 1:FSMC_D13 / USART3_TX + PD_9, //D74 - 1:FSMC_D14 / USART3_RX + PD_10, //D75 - 1:FSMC_D15 + PD_11, //D76 - 1:FSMC_A16 + PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 + PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 + PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 + PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 + PD_0, //D81 - 1:FSMC_D2 + PD_1, //D82 - 1:FSMC_D3 + PD_3, //D83 - 1:FSMC_CLK + PD_4, //D84 - 1:FSMC_NOE + PD_5, //D85 - 1:USART2_TX + PD_6, //D86 - 1:USART2_RX + PD_7, //D87 + PE_0, //D88 + PE_1, //D89 +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA + PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL + PF_2, //D92 - 1:FSMC_A2 + PF_11, //D93 + PF_12, //D94 - 1:FSMC_A6 + PF_13, //D95 - 1:FSMC_A7 + PF_14, //D96 - 1:FSMC_A8 + PF_15, //D97 - 1:FSMC_A9 + PG_0, //D98 - 1:FSMC_A10 + PG_1, //D99 - 1:FSMC_A11 + PG_2, //D100 - 1:FSMC_A12 + PG_3, //D101 - 1:FSMC_A13 + PG_4, //D102 - 1:FSMC_A14 + PG_5, //D103 - 1:FSMC_A15 + PG_6, //D104 + PG_7, //D105 + PG_8, //D106 + PG_9, //D107 - 1:USART6_RX + PG_10, //D108 - 1:FSMC_NE3 + PG_11, //D109 + PG_12, //D110 - 1:FSMC_NE4 + PG_13, //D111 - 1:FSMC_A24 + PG_14, //D112 - 1:FSMC_A25 / USART6_TX + PG_15, //D113 +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + PI_8, //D114 + PI_9, //D115 + PI_10, //D116 + PI_11, //D117 + PH_2, //D118 + PH_3, //D119 + PH_4, //D120 - 1:I2C2_SCL + PH_5, //D121 - 1:I2C2_SDA + PH_6, //D122 - 1:TIM12_CH1 + PH_7, //D123 - 1:I2C3_SCL + PH_8, //D124 - 1:I2C3_SDA + PH_9, //D125 - 1:TIM12_CH2 + PH_10, //D126 - 1:TIM5_CH1 + PH_11, //D127 - 1:TIM5_CH2 + PH_12, //D128 - 1:TIM5_CH3 + PH_13, //D129 + PH_14, //D130 + PH_15, //D131 + PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS + PI_1, //D133 - 1:SPI2_SCK + PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO + PI_3, //D135 - 1:SPI2_MOS + PI_4, //D136 + PI_5, //D137 - 1:TIM8_CH1 + PI_6, //D138 - 1:TIM8_CH2 + PI_7, //D139 - 1:TIM8_CH3 +#endif +}; + +#ifdef __cplusplus +} +#endif + +// ------------------------ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config() { + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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/BIGTREE_GTR_V1/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h new file mode 100644 index 00000000..2da195c6 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/variant.h @@ -0,0 +1,322 @@ +/* + ******************************************************************************* + * 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 + *----------------------------------------------------------------------------*/ + +#ifdef STM32F405RX + #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio + #define STM32F4X_GPIO_NUM 51 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5VX) + #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio + #define STM32F4X_GPIO_NUM 82 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5ZX) + #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio + #define STM32F4X_GPIO_NUM 114 + #define STM32F4X_ADC_NUM 24 +#elif defined(STM32F407IX) + #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio + #define STM32F4X_GPIO_NUM 140 + #define STM32F4X_ADC_NUM 24 +#else + #error "no match MCU defined" +#endif + +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + #define PC13 0 + #define PC14 1 //OSC32_IN + #define PC15 2 //OSC32_OUT + #define PH0 3 //OSC_IN + #define PH1 4 //OSC_OUT + #define PB2 5 //BOOT1 + #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 + #define PB12 8 //1:SPI2_NSS / OTG_HS_ID + #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS + #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID + #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM + #define PA12 20 //1:OTG_FS_DP + #define PA13 21 //0:JTMS-SWDIO + #define PA14 22 //0:JTCK-SWCLK + #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS + #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK + #define PD2 27 //1:UART5_RX / SDIO_CMD + #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX + #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX + #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 + #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 + #define PC0 45 //1: 2:ADC123_IN10 + #define PC1 46 //1: 2:ADC123_IN11 + #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 + #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 + #define PC4 49 //1: 2:ADC12_IN14 + #define PC5 50 //1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 + #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 + #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 + #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 + #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 + #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 + #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 + #define PF10 58 //2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 + #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 + #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 + #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 + #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 + #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 + #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 + #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 + #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 + #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 + #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 + #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 + #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 + #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 + #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX + #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX + #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 + #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 + #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 + #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 + #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 + #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 + #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 + #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 + #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK + #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE + #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX + #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX + #define PD7 (63+STM32F4X_ADC_NUM) + #define PE0 (64+STM32F4X_ADC_NUM) + #define PE1 (65+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA + #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL + #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 + #define PF11 (69+STM32F4X_ADC_NUM) + #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 + #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 + #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 + #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 + #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 + #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 + #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 + #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 + #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 + #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 + #define PG6 (80+STM32F4X_ADC_NUM) + #define PG7 (81+STM32F4X_ADC_NUM) + #define PG8 (82+STM32F4X_ADC_NUM) + #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX + #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 + #define PG11 (85+STM32F4X_ADC_NUM) + #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 + #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 + #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX + #define PG15 (89+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + #define PI8 (90+STM32F4X_ADC_NUM) + #define PI9 (91+STM32F4X_ADC_NUM) + #define PI10 (92+STM32F4X_ADC_NUM) + #define PI11 (93+STM32F4X_ADC_NUM) + #define PH2 (94+STM32F4X_ADC_NUM) + #define PH3 (95+STM32F4X_ADC_NUM) + #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL + #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA + #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 + #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL + #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA + #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 + #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 + #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 + #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 + #define PH13 (105+STM32F4X_ADC_NUM) + #define PH14 (106+STM32F4X_ADC_NUM) + #define PH15 (107+STM32F4X_ADC_NUM) + #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS + #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK + #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO + #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS + #define PI4 (112+STM32F4X_ADC_NUM) + #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 + #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 + #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 +#endif + + +// This must be a literal +#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) +#define NUM_ANALOG_FIRST 35 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +/* + * BEWARE: + * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) + * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) + */ +//#define PWM_FREQUENCY 20000 +//The bottom values are the default and don't need to be redefined +//#define PWM_RESOLUTION 8 +//#define PWM_MAX_DUTY_CYCLE 255 + +// On-board LED pin number +#define LED_BUILTIN PA7 +#define LED_GREEN LED_BUILTIN + +// 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_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 +#define PIN_SPI_SS PB12 + +// I2C Definitions +#if STM32F4X_PIN_NUM >= 176 + #define PIN_WIRE_SDA PH5 + #define PIN_WIRE_SCL PH4 +#else + #define PIN_WIRE_SDA PB7 + #define PIN_WIRE_SCL PB6 +#endif + +// Timer Definitions +//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c +#define TIMER_TONE TIM10 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM7 + +// UART Definitions +//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below +#define ENABLE_HWSERIAL3 +#define ENABLE_HWSERIAL6 + +// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) +#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) + +// 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 + +// Optional PIN_SERIALn_RX and PIN_SERIALn_TX where 'n' is the U(S)ART number +// Used when user instanciate a hardware Serial using its peripheral name. +// Example: HardwareSerial mySerial(USART3); +// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. +#define PIN_SERIAL1_RX PA10 +#define PIN_SERIAL1_TX PA9 +#define PIN_SERIAL3_RX PD9 +#define PIN_SERIAL3_TX PD8 +#define PIN_SERIAL6_RX PC7 +#define PIN_SERIAL6_TX PC6 +//#define PIN_SERIALLP1_RX x // For LPUART1 RX +//#define PIN_SERIALLP1_TX x // For LPUART1 TX + +#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 +#define SERIAL_PORT_HARDWARE_OPEN Serial3 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial6 +#endif diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c new file mode 100644 index 00000000..6dc8b051 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PeripheralPins.c @@ -0,0 +1,372 @@ +/* + ******************************************************************************* + * 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 by default. + * If you change them, you should know what you're doing first. + * ===== + */ + +//*** 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 E0_DIR + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 + + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 + #endif + {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)}, + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio + #if STM32F4X_PIN_NUM >= 176 + {PH_5, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #else + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + #endif + {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)}, + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio + #if STM32F4X_PIN_NUM >= 176 + //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_4, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_7, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #else + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + #endif + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {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 + {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. + {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. + * 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 + //{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, 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_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, 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 + //{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 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_8, 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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; + +const PinMap PinMap_UART_RX[] = { + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_9, 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)}, + //{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)}, + //{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_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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{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)}, + #endif + {NC, NP, 0} +}; + +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)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{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)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_15, 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} +}; + +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_14, 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} +}; + +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {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} +}; + +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +#error "CAN bus isn't available on this board. Driver should be disabled." +#endif + +//*** ETHERNET *** +#ifdef HAL_ETH_MODULE_ENABLED +#error "Ethernet port isn't available on this board. Driver should be disabled." +#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 used by LCD + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used + {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} +}; + +const PinMap PinMap_USB_OTG_HS[] = { /* + #ifdef USE_USB_HS_IN_FS + {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 + #error "USB in HS mode isn't supported by the board" + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {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_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/BIGTREE_SKR_PRO_1v1/PinNamesVar.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/PinNamesVar.h new file mode 100644 index 00000000..b4bb9d45 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/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/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h new file mode 100644 index 00000000..e0e8239a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h @@ -0,0 +1,52 @@ +#pragma once + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED Real Time Clock...do we use it? +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) + +#undef HAL_SD_MODULE_ENABLED +#undef HAL_DAC_MODULE_ENABLED +#undef HAL_FLASH_MODULE_ENABLED +#undef HAL_CAN_MODULE_ENABLED +#undef HAL_CAN_LEGACY_MODULE_ENABLED +#undef HAL_CEC_MODULE_ENABLED +#undef HAL_CRYP_MODULE_ENABLED +#undef HAL_DCMI_MODULE_ENABLED +#undef HAL_DMA2D_MODULE_ENABLED +#undef HAL_ETH_MODULE_ENABLED +#undef HAL_NAND_MODULE_ENABLED +#undef HAL_NOR_MODULE_ENABLED +#undef HAL_PCCARD_MODULE_ENABLED +#undef HAL_SRAM_MODULE_ENABLED +#undef HAL_SDRAM_MODULE_ENABLED +#undef HAL_HASH_MODULE_ENABLED +#undef HAL_EXTI_MODULE_ENABLED +#undef HAL_SMBUS_MODULE_ENABLED +#undef HAL_I2S_MODULE_ENABLED +#undef HAL_IWDG_MODULE_ENABLED +#undef HAL_LTDC_MODULE_ENABLED +#undef HAL_DSI_MODULE_ENABLED +#undef HAL_QSPI_MODULE_ENABLED +#undef HAL_RNG_MODULE_ENABLED +#undef HAL_SAI_MODULE_ENABLED +#undef HAL_IRDA_MODULE_ENABLED +#undef HAL_SMARTCARD_MODULE_ENABLED +#undef HAL_WWDG_MODULE_ENABLED +#undef HAL_HCD_MODULE_ENABLED +#undef HAL_FMPI2C_MODULE_ENABLED +#undef HAL_SPDIFRX_MODULE_ENABLED +#undef HAL_DFSDM_MODULE_ENABLED +#undef HAL_LPTIM_MODULE_ENABLED +#undef HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp new file mode 100644 index 00000000..1486b218 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.cpp @@ -0,0 +1,260 @@ +/* + ******************************************************************************* + * 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 + +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + PC_13, //D0 + PC_14, //D1 - OSC32_IN + PC_15, //D2 - OSC32_OUT + PH_0, //D3 - OSC_IN + PH_1, //D4 - OSC_OUT + PB_2, //D5 - BOOT1 + PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 + PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID + PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS + PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID + PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM + PA_12, //D20 - 1:OTG_FS_DP + PA_13, //D21 - 0:JTMS-SWDIO + PA_14, //D22 - 0:JTCK-SWCLK + PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS + PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK + PD_2, //D27 - 1:UART5_RX / SDIO_CMD + PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX + PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX + PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 + PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 + PC_0, //D45/A10 - 1: 2:ADC123_IN10 + PC_1, //D46/A11 - 1: 2:ADC123_IN11 + PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 + PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 + PC_4, //D49/A14 - 1: 2:ADC12_IN14 + PC_5, //D50/A15 - 1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 + PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 + PF_10, //D58/A23 - 2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + PE_2, //D59 - 1:FSMC_A23 + PE_3, //D60 - 1:FSMC_A19 + PE_4, //D61 - 1:FSMC_A20 + PE_5, //D62 - 1:FSMC_A21 + PE_6, //D63 - 1:FSMC_A22 + PE_7, //D64 - 1:FSMC_D4 + PE_8, //D65 - 1:FSMC_D5 + PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 + PE_10, //D67 - 1:FSMC_D7 + PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 + PE_12, //D69 - 1:FSMC_D9 + PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 + PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 + PE_15, //D72 - 1:FSMC_D12 + PD_8, //D73 - 1:FSMC_D13 / USART3_TX + PD_9, //D74 - 1:FSMC_D14 / USART3_RX + PD_10, //D75 - 1:FSMC_D15 + PD_11, //D76 - 1:FSMC_A16 + PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 + PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 + PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 + PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 + PD_0, //D81 - 1:FSMC_D2 + PD_1, //D82 - 1:FSMC_D3 + PD_3, //D83 - 1:FSMC_CLK + PD_4, //D84 - 1:FSMC_NOE + PD_5, //D85 - 1:USART2_TX + PD_6, //D86 - 1:USART2_RX + PD_7, //D87 + PE_0, //D88 + PE_1, //D89 +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA + PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL + PF_2, //D92 - 1:FSMC_A2 + PF_11, //D93 + PF_12, //D94 - 1:FSMC_A6 + PF_13, //D95 - 1:FSMC_A7 + PF_14, //D96 - 1:FSMC_A8 + PF_15, //D97 - 1:FSMC_A9 + PG_0, //D98 - 1:FSMC_A10 + PG_1, //D99 - 1:FSMC_A11 + PG_2, //D100 - 1:FSMC_A12 + PG_3, //D101 - 1:FSMC_A13 + PG_4, //D102 - 1:FSMC_A14 + PG_5, //D103 - 1:FSMC_A15 + PG_6, //D104 + PG_7, //D105 + PG_8, //D106 + PG_9, //D107 - 1:USART6_RX + PG_10, //D108 - 1:FSMC_NE3 + PG_11, //D109 + PG_12, //D110 - 1:FSMC_NE4 + PG_13, //D111 - 1:FSMC_A24 + PG_14, //D112 - 1:FSMC_A25 / USART6_TX + PG_15, //D113 +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + PI_8, //D114 + PI_9, //D115 + PI_10, //D116 + PI_11, //D117 + PH_2, //D118 + PH_3, //D119 + PH_4, //D120 - 1:I2C2_SCL + PH_5, //D121 - 1:I2C2_SDA + PH_6, //D122 - 1:TIM12_CH1 + PH_7, //D123 - 1:I2C3_SCL + PH_8, //D124 - 1:I2C3_SDA + PH_9, //D125 - 1:TIM12_CH2 + PH_10, //D126 - 1:TIM5_CH1 + PH_11, //D127 - 1:TIM5_CH2 + PH_12, //D128 - 1:TIM5_CH3 + PH_13, //D129 + PH_14, //D130 + PH_15, //D131 + PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS + PI_1, //D133 - 1:SPI2_SCK + PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO + PI_3, //D135 - 1:SPI2_MOS + PI_4, //D136 + PI_5, //D137 - 1:TIM8_CH1 + PI_6, //D138 - 1:TIM8_CH2 + PI_7, //D139 - 1:TIM8_CH3 +#endif +}; + +#ifdef __cplusplus +} +#endif + +// ------------------------ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config() { + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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/BIGTREE_SKR_PRO_1v1/variant.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h new file mode 100644 index 00000000..1ba0a18d --- /dev/null +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/variant.h @@ -0,0 +1,322 @@ +/* + ******************************************************************************* + * 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 + *----------------------------------------------------------------------------*/ + +#ifdef STM32F405RX + #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio + #define STM32F4X_GPIO_NUM 51 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5VX) + #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio + #define STM32F4X_GPIO_NUM 82 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5ZX) + #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio + #define STM32F4X_GPIO_NUM 114 + #define STM32F4X_ADC_NUM 24 +#elif defined(STM32F407IX) + #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio + #define STM32F4X_GPIO_NUM 140 + #define STM32F4X_ADC_NUM 24 +#else + #error "no match MCU defined" +#endif + +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + #define PC13 0 + #define PC14 1 //OSC32_IN + #define PC15 2 //OSC32_OUT + #define PH0 3 //OSC_IN + #define PH1 4 //OSC_OUT + #define PB2 5 //BOOT1 + #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 + #define PB12 8 //1:SPI2_NSS / OTG_HS_ID + #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS + #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID + #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM + #define PA12 20 //1:OTG_FS_DP + #define PA13 21 //0:JTMS-SWDIO + #define PA14 22 //0:JTCK-SWCLK + #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS + #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK + #define PD2 27 //1:UART5_RX / SDIO_CMD + #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX + #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX + #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 + #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 + #define PC0 45 //1: 2:ADC123_IN10 + #define PC1 46 //1: 2:ADC123_IN11 + #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 + #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 + #define PC4 49 //1: 2:ADC12_IN14 + #define PC5 50 //1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 + #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 + #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 + #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 + #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 + #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 + #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 + #define PF10 58 //2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 + #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 + #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 + #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 + #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 + #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 + #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 + #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 + #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 + #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 + #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 + #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 + #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 + #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 + #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX + #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX + #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 + #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 + #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 + #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 + #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 + #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 + #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 + #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 + #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK + #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE + #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX + #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX + #define PD7 (63+STM32F4X_ADC_NUM) + #define PE0 (64+STM32F4X_ADC_NUM) + #define PE1 (65+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA + #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL + #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 + #define PF11 (69+STM32F4X_ADC_NUM) + #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 + #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 + #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 + #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 + #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 + #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 + #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 + #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 + #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 + #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 + #define PG6 (80+STM32F4X_ADC_NUM) + #define PG7 (81+STM32F4X_ADC_NUM) + #define PG8 (82+STM32F4X_ADC_NUM) + #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX + #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 + #define PG11 (85+STM32F4X_ADC_NUM) + #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 + #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 + #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX + #define PG15 (89+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + #define PI8 (90+STM32F4X_ADC_NUM) + #define PI9 (91+STM32F4X_ADC_NUM) + #define PI10 (92+STM32F4X_ADC_NUM) + #define PI11 (93+STM32F4X_ADC_NUM) + #define PH2 (94+STM32F4X_ADC_NUM) + #define PH3 (95+STM32F4X_ADC_NUM) + #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL + #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA + #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 + #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL + #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA + #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 + #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 + #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 + #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 + #define PH13 (105+STM32F4X_ADC_NUM) + #define PH14 (106+STM32F4X_ADC_NUM) + #define PH15 (107+STM32F4X_ADC_NUM) + #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS + #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK + #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO + #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS + #define PI4 (112+STM32F4X_ADC_NUM) + #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 + #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 + #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 +#endif + + +// This must be a literal +#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) +#define NUM_ANALOG_FIRST 35 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +/* + * BEWARE: + * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) + * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) + */ +//#define PWM_FREQUENCY 20000 +//The bottom values are the default and don't need to be redefined +//#define PWM_RESOLUTION 8 +//#define PWM_MAX_DUTY_CYCLE 255 + +// On-board LED pin number +#define LED_BUILTIN PA7 +#define LED_GREEN LED_BUILTIN + +// 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_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 +#define PIN_SPI_SS PB12 + +// I2C Definitions +#if STM32F4X_PIN_NUM >= 176 + #define PIN_WIRE_SDA PH5 + #define PIN_WIRE_SCL PH4 +#else + #define PIN_WIRE_SDA PB7 + #define PIN_WIRE_SCL PB6 +#endif + +// 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_SERIAL TIM7 + +// UART Definitions +//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below +#define ENABLE_HWSERIAL3 +#define ENABLE_HWSERIAL6 + +// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) +#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) + +// 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 + +// Optional PIN_SERIALn_RX and PIN_SERIALn_TX where 'n' is the U(S)ART number +// Used when user instanciate a hardware Serial using its peripheral name. +// Example: HardwareSerial mySerial(USART3); +// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. +#define PIN_SERIAL1_RX PA10 +#define PIN_SERIAL1_TX PA9 +#define PIN_SERIAL3_RX PD9 +#define PIN_SERIAL3_TX PD8 +#define PIN_SERIAL6_RX PC7 +#define PIN_SERIAL6_TX PC6 +//#define PIN_SERIALLP1_RX x // For LPUART1 RX +//#define PIN_SERIALLP1_TX x // For LPUART1 TX + +#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 +#define SERIAL_PORT_HARDWARE_OPEN Serial3 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial6 +#endif diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp new file mode 100644 index 00000000..6083664b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/board.cpp @@ -0,0 +1,233 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards/maple/board.cpp + * @author Marti Bolivar + * @brief Maple board file. + */ + +#include // For this board's header file + +/* Roger Clark. Added next to includes for changes to Serial */ +#include +#include + +#include // For stm32_pin_info and its contents + // (these go into PIN_MAP). + +#include "boards_private.h" // For PMAP_ROW(), which makes + // PIN_MAP easier to read. + +// boardInit(): nothing special to do for Maple. +// +// When defining your own board.cpp, you can put extra code in this +// function if you have anything you want done on reset, before main() +// or setup() are called. +// +// If there's nothing special you need done, feel free to leave this +// function out, as we do here. +/* +void boardInit(void) { +} +*/ + +// Pin map: this lets the basic I/O functions (digitalWrite(), +// analogRead(), pwmWrite()) translate from pin numbers to STM32 +// peripherals. +// +// PMAP_ROW() lets us specify a row (really a struct stm32_pin_info) +// in the pin map. Its arguments are: +// +// - GPIO device for the pin (&gpioa, etc.) +// - GPIO bit for the pin (0 through 15) +// - Timer device, or NULL if none +// - Timer channel (1 to 4, for PWM), or 0 if none +// - ADC device, or NULL if none +// - ADC channel, or ADCx if none + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { + /* + gpio_dev *gpio_device; GPIO device + timer_dev *timer_device; Pin's timer device, if any. + const adc_dev *adc_device; ADC device, if any. + uint8 gpio_bit; Pin's GPIO port bit. + uint8 timer_channel; Timer channel, or 0 if none. + uint8 adc_channel; Pin ADC channel, or ADCx if none. + */ + + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, &timer3, &adc1, 2, 4, 9}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + + + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ + {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ + {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ + {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ + + {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ + + {&gpiod, NULL, NULL, 3, 0, ADCx} , /* PD3 FSMC_CLK */ + {&gpiod, NULL, NULL, 4, 0, ADCx} , /* PD4 FSMC_NOE */ + {&gpiod, NULL, NULL, 5, 0, ADCx} , /* PD5 FSMC_NWE */ + {&gpiod, NULL, NULL, 6, 0, ADCx} , /* PD6 FSMC_NWAIT */ + {&gpiod, NULL, NULL, 7, 0, ADCx} , /* PD7 FSMC_NE1/FSMC_NCE2 */ + {&gpiod, NULL, NULL, 8, 0, ADCx} , /* PD8 FSMC_D13 */ + {&gpiod, NULL, NULL, 9, 0, ADCx} , /* PD9 FSMC_D14 */ + {&gpiod, NULL, NULL, 10, 0, ADCx} , /* PD10 FSMC_D15 */ + {&gpiod, NULL, NULL, 11, 0, ADCx} , /* PD11 FSMC_A16 */ + {&gpiod, NULL, NULL, 12, 0, ADCx} , /* PD12 FSMC_A17 */ + {&gpiod, NULL, NULL, 13, 0, ADCx} , /* PD13 FSMC_A18 */ + {&gpiod, NULL, NULL, 14, 0, ADCx} , /* PD14 FSMC_D0 */ + {&gpiod, NULL, NULL, 15, 0, ADCx} , /* PD15 FSMC_D1 */ + + {&gpioe, NULL, NULL, 0, 0, ADCx} , /* PE0 */ + {&gpioe, NULL, NULL, 1, 0, ADCx} , /* PE1 */ + {&gpioe, NULL, NULL, 2, 0, ADCx} , /* PE2 */ + {&gpioe, NULL, NULL, 3, 0, ADCx} , /* PE3 */ + {&gpioe, NULL, NULL, 4, 0, ADCx} , /* PE4 */ + {&gpioe, NULL, NULL, 5, 0, ADCx} , /* PE5 */ + {&gpioe, NULL, NULL, 6, 0, ADCx} , /* PE6 */ + {&gpioe, NULL, NULL, 7, 0, ADCx} , /* PE7 */ + {&gpioe, NULL, NULL, 8, 0, ADCx} , /* PE8 */ + {&gpioe, NULL, NULL, 9, 0, ADCx} , /* PE9 */ + {&gpioe, NULL, NULL, 10, 0, ADCx} , /* PE10 */ + {&gpioe, NULL, NULL, 11, 0, ADCx} , /* PE11 */ + {&gpioe, NULL, NULL, 12, 0, ADCx} , /* PE12 */ + {&gpioe, NULL, NULL, 13, 0, ADCx} , /* PE13 */ + {&gpioe, NULL, NULL, 14, 0, ADCx} , /* PE14 */ + {&gpioe, NULL, NULL, 15, 0, ADCx} , /* PE15 */ + + {&gpiof, NULL, NULL, 0, 0, ADCx} , /* PF0 */ + {&gpiof, NULL, NULL, 1, 0, ADCx} , /* PF1 */ + {&gpiof, NULL, NULL, 2, 0, ADCx} , /* PF2 */ + {&gpiof, NULL, NULL, 3, 0, ADCx} , /* PF3 */ + {&gpiof, NULL, NULL, 4, 0, ADCx} , /* PF4 */ + {&gpiof, NULL, NULL, 5, 0, ADCx} , /* PF5 */ + {&gpiof, NULL, NULL, 6, 0, ADCx} , /* PF6 */ + {&gpiof, NULL, NULL, 7, 0, ADCx} , /* PF7 */ + {&gpiof, NULL, NULL, 8, 0, ADCx} , /* PF8 */ + {&gpiof, NULL, NULL, 9, 0, ADCx} , /* PF9 */ + {&gpiof, NULL, NULL, 10, 0, ADCx} , /* PF10 */ + {&gpiof, NULL, NULL, 11, 0, ADCx} , /* PF11 */ + {&gpiof, NULL, NULL, 12, 0, ADCx} , /* PF12 */ + {&gpiof, NULL, NULL, 13, 0, ADCx} , /* PF13 */ + {&gpiof, NULL, NULL, 14, 0, ADCx} , /* PF14 */ + {&gpiof, NULL, NULL, 15, 0, ADCx} , /* PF15 */ + + {&gpiog, NULL, NULL, 0, 0, ADCx} , /* PG0 */ + {&gpiog, NULL, NULL, 1, 0, ADCx} , /* PG1 */ + {&gpiog, NULL, NULL, 2, 0, ADCx} , /* PG2 */ + {&gpiog, NULL, NULL, 3, 0, ADCx} , /* PG3 */ + {&gpiog, NULL, NULL, 4, 0, ADCx} , /* PG4 */ + {&gpiog, NULL, NULL, 5, 0, ADCx} , /* PG5 */ + {&gpiog, NULL, NULL, 6, 0, ADCx} , /* PG6 */ + {&gpiog, NULL, NULL, 7, 0, ADCx} , /* PG7 */ + {&gpiog, NULL, NULL, 8, 0, ADCx} , /* PG8 */ + {&gpiog, NULL, NULL, 9, 0, ADCx} , /* PG9 */ + {&gpiog, NULL, NULL, 10, 0, ADCx} , /* PG10 */ + {&gpiog, NULL, NULL, 11, 0, ADCx} , /* PG11 */ + {&gpiog, NULL, NULL, 12, 0, ADCx} , /* PG12 */ + {&gpiog, NULL, NULL, 13, 0, ADCx} , /* PG13 */ + {&gpiog, NULL, NULL, 14, 0, ADCx} , /* PG14 */ + {&gpiog, NULL, NULL, 15, 0, ADCx} /* PG15 */ +}; + +/* Basically everything that is defined as having a timer us PWM */ +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + PA0,PA1,PA2,PA3,PA6,PA7,PA8,PA9,PA10,PB0,PB1,PB6,PB7,PB8,PB9,PC6,PC7,PC8,PC9 +}; + +/* Basically everything that is defined having ADC */ +extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { + PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1,PC0,PC1,PC2,PC3,PC4,PC5 +}; + +/* not sure what this us used for */ +extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { + BOARD_JTMS_SWDIO_PIN, + BOARD_JTCK_SWCLK_PIN, BOARD_JTDI_PIN, BOARD_JTDO_PIN, BOARD_NJTRST_PIN +}; + + +#ifdef SERIAL_USB + DEFINE_HWSERIAL(Serial1, 1); + DEFINE_HWSERIAL(Serial2, 2); + DEFINE_HWSERIAL(Serial3, 3); + DEFINE_HWSERIAL_UART(Serial4, 4); + DEFINE_HWSERIAL_UART(Serial5, 5); +#else + DEFINE_HWSERIAL(Serial, 1); + DEFINE_HWSERIAL(Serial1, 2); + DEFINE_HWSERIAL(Serial2, 3); + DEFINE_HWSERIAL_UART(Serial3, 4); + DEFINE_HWSERIAL_UART(Serial4, 5); +#endif diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h b/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h new file mode 100644 index 00000000..20fd9d37 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/board/board.h @@ -0,0 +1,240 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file maple_RET6.h + * @author Marti Bolivar + * @brief Private include file for Maple RET6 Edition in boards.h + * + * See maple.h for more information on these definitions. + */ + +#ifndef _BOARDS_GENERIC_STM32F103Z_H_ +#define _BOARDS_GENERIC_STM32F103Z_H_ + +/* A few of these values will seem strange given that it's a + * high-density board. */ + +#define CYCLES_PER_MICROSECOND 72 +#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ + +// USARTS +#define BOARD_NR_USARTS 5 +#define BOARD_USART1_TX_PIN PA9 +#define BOARD_USART1_RX_PIN PA10 + +#define BOARD_USART2_TX_PIN PA2 +#define BOARD_USART2_RX_PIN PA3 + +#define BOARD_USART3_TX_PIN PB10 +#define BOARD_USART3_RX_PIN PB11 + +#define BOARD_USART4_TX_PIN PC10 +#define BOARD_USART4_RX_PIN PC11 + +#define BOARD_USART5_TX_PIN PC12 +#define BOARD_USART5_RX_PIN PD2 + +/* Note: + * + * SPI3 is unusable due to pin 43 (PB4) and NRST tie-together :(, but + * leave the definitions so as not to clutter things up. This is only + * OK since RET6 Ed. is specifically advertised as a beta board. */ +#define BOARD_NR_SPI 3 +#define BOARD_SPI1_NSS_PIN PA4 +#define BOARD_SPI1_SCK_PIN PA5 +#define BOARD_SPI1_MISO_PIN PA6 +#define BOARD_SPI1_MOSI_PIN PA7 + + + +#define BOARD_SPI2_NSS_PIN PB12 +#define BOARD_SPI2_SCK_PIN PB13 +#define BOARD_SPI2_MISO_PIN PB14 +#define BOARD_SPI2_MOSI_PIN PB15 + + +#define BOARD_SPI3_NSS_PIN PA15 +#define BOARD_SPI3_SCK_PIN PB3 +#define BOARD_SPI3_MISO_PIN PB4 +#define BOARD_SPI3_MOSI_PIN PB5 + + +/* GPIO A to E = 5 * 16 - BOOT1 not used = 79*/ +#define BOARD_NR_GPIO_PINS 112 +/* Note: NOT 19. The missing one is D38 a.k.a. BOARD_BUTTON_PIN, which + * isn't broken out to a header and is thus unusable for PWM. */ +#define BOARD_NR_PWM_PINS 19 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 7 + +#define BOARD_JTMS_SWDIO_PIN 39 +#define BOARD_JTCK_SWCLK_PIN 40 +#define BOARD_JTDI_PIN 41 +#define BOARD_JTDO_PIN 42 +#define BOARD_NJTRST_PIN 43 + +/* USB configuration. BOARD_USB_DISC_DEV is the GPIO port containing + * the USB_DISC pin, and BOARD_USB_DISC_BIT is that pin's bit. */ +#define BOARD_USB_DISC_DEV GPIOC +#define BOARD_USB_DISC_BIT 12 + +/* + * SDIO Pins + */ +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 + +/* Pin aliases: these give the GPIO port/bit for each pin as an + * enum. These are optional, but recommended. They make it easier to + * write code using low-level GPIO functionality. */ +enum { +PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, +PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15, +PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15, +PF0,PF1,PF2,PF3,PF4,PF5,PF6,PF7,PF8,PF9,PF10,PF11,PF12,PF13,PF14,PF15, +PG0,PG1,PG2,PG3,PG4,PG5,PG6,PG7,PG8,PG9,PG10,PG11,PG12,PG13,PG14,PG15 +};/* Note PB2 is skipped as this is Boot1 and is not going to be much use as its likely to be pulled permanently low */ +/* +#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 */ +#endif diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc new file mode 100644 index 00000000..e086a58b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/common.inc @@ -0,0 +1,220 @@ +/* + * Linker script for libmaple. + * + * Original author "lanchon" from ST forums, with modifications by LeafLabs. + */ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") + +/* + * Configure other libraries we want in the link. + * + * libgcc, libc, and libm are common across supported toolchains. + * However, some toolchains require additional archives which aren't + * present everywhere (e.g. ARM's gcc-arm-embedded releases). + * + * To hack around this, we let the build system specify additional + * archives by putting the right extra_libs.inc (in a directory under + * toolchains/) in our search path. + */ +GROUP(libgcc.a libc.a libm.a) +INCLUDE extra_libs.inc + +/* + * These force the linker to search for vector table symbols. + * + * These symbols vary by STM32 family (and also within families). + * It's up to the build system to configure the link's search path + * properly for the target MCU. + */ +INCLUDE vector_symbols.inc + +/* STM32 vector table. */ +EXTERN(__stm32_vector_table) + +/* C runtime initialization function. */ +EXTERN(start_c) + +/* main entry point */ +EXTERN(main) + +/* Initial stack pointer value. */ +EXTERN(__msp_init) +PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram)); + +/* Reset vector and chip reset entry point */ +EXTERN(__start__) +ENTRY(__start__) +PROVIDE(__exc_reset = __start__); + +/* Heap boundaries, for libmaple */ +EXTERN(_lm_heap_start); +EXTERN(_lm_heap_end); + +SECTIONS +{ + .text : + { + __text_start__ = .; + /* + * STM32 vector table. Leave this here. Yes, really. + */ + *(.stm32.interrupt_vector) + + /* + * Program code and vague linking + */ + *(.text .text.* .gnu.linkonce.t.*) + *(.plt) + *(.gnu.warning) + *(.glue_7t) *(.glue_7) *(.vfp11_veneer) + + *(.ARM.extab* .gnu.linkonce.armextab.*) + *(.gcc_except_table) + *(.eh_frame_hdr) + *(.eh_frame) + + . = ALIGN(4); + KEEP(*(.init)) + + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + } > REGION_TEXT + + /* + * End of text + */ + .text.align : + { + . = ALIGN(8); + __text_end__ = .; + } > REGION_TEXT + + /* + * .ARM.exidx exception unwinding; mandated by ARM's C++ ABI + */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > REGION_RODATA + __exidx_end = .; + + /* + * .data + */ + .data : + { + __data_start__ = .; + LONG(0) + . = ALIGN(8); + + *(.got.plt) *(.got) + *(.data .data.* .gnu.linkonce.d.*) + + . = ALIGN(8); + __data_end__ = .; + } > REGION_DATA AT> REGION_RODATA + + /* + * Read-only data + */ + .rodata : + { + *(.rodata .rodata.* .gnu.linkonce.r.*) + /* .USER_FLASH: We allow users to allocate into Flash here */ + *(.USER_FLASH) + /* ROM image configuration; for C startup */ + . = ALIGN(4); + _lm_rom_img_cfgp = .; + LONG(LOADADDR(.data)); + /* + * Heap: Linker scripts may choose a custom heap by overriding + * _lm_heap_start and _lm_heap_end. Otherwise, the heap is in + * internal SRAM, beginning after .bss, and growing towards + * the stack. + * + * I'm shoving these here naively; there's probably a cleaner way + * to go about this. [mbolivar] + */ + _lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end; + _lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init; + } > REGION_RODATA + + /* + * .bss + */ + .bss : + { + . = ALIGN(8); + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + . = ALIGN (8); + __bss_end__ = .; + _end = __bss_end__; + } > REGION_BSS + + /* + * Debugging sections + */ + .stab 0 (NOLOAD) : { *(.stab) } + .stabstr 0 (NOLOAD) : { *(.stabstr) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc new file mode 100644 index 00000000..dd2c84fa --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld new file mode 100644 index 00000000..81eaa8b0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103z_dfu.ld @@ -0,0 +1,29 @@ +/* + * libmaple linker script + * + * This build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * This build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ + + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08002000, LENGTH = 504K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld new file mode 100644 index 00000000..37bc3da0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zc.ld @@ -0,0 +1,27 @@ +/* + * libmaple linker script + * + * This build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * This build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld new file mode 100644 index 00000000..f3f21805 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103zd.ld @@ -0,0 +1,27 @@ +/* + * libmaple linker script + * + * This build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * This build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld new file mode 100644 index 00000000..2f86c3f0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/stm32f103ze.ld @@ -0,0 +1,29 @@ +/* + * libmaple linker script + * + * This build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * This build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ + + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc new file mode 100644 index 00000000..f8519bba --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h b/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h new file mode 100644 index 00000000..d5dce114 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/pins_arduino.h @@ -0,0 +1,2 @@ +// API compatibility +#include "variant.h" diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h b/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h new file mode 100644 index 00000000..cd10bb3c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/variant.h @@ -0,0 +1,17 @@ +#pragma once + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp new file mode 100644 index 00000000..2210e984 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp @@ -0,0 +1,225 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards.cpp + * @brief init() and board routines. + * + * This file is mostly interesting for the init() function, which + * configures Flash, the core clocks, and a variety of other available + * peripherals on the board so the rest of Wirish doesn't have to turn + * things on before using them. + * + * Prior to returning, init() calls boardInit(), which allows boards + * to perform any initialization they need to. This file includes a + * weak no-op definition of boardInit(), so boards that don't need any + * special initialization don't have to define their own. + * + * How init() works is chip-specific. See the boards_setup.cpp files + * under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be + * advised: their contents are unstable, and can/will change without + * notice. + */ + +#include +#include +#include +#include +#include +#include "boards_private.h" + +static void setup_flash(void); +static void setup_clocks(void); +static void setup_nvic(void); +static void setup_adcs(void); +static void setup_timers(void); + +/* + * Exported functions + */ + +void init(void) { + setup_flash(); + setup_clocks(); + setup_nvic(); + systick_init(SYSTICK_RELOAD_VAL); + wirish::priv::board_setup_gpio(); + setup_adcs(); + setup_timers(); + wirish::priv::board_setup_usb(); + wirish::priv::series_init(); + boardInit(); +} + +/* Provide a default no-op boardInit(). */ +__weak void boardInit(void) { +} + +/* You could farm this out to the files in boards/ if e.g. it takes + * too long to test on boards with lots of pins. */ +bool boardUsesPin(uint8 pin) { + for (int i = 0; i < BOARD_NR_USED_PINS; i++) { + if (pin == boardUsedPins[i]) { + return true; + } + } + return false; +} + +/* + * Auxiliary routines + */ + +static void setup_flash(void) { + // Turn on as many Flash "go faster" features as + // possible. flash_enable_features() just ignores any flags it + // can't support. + flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE); + // Configure the wait states, assuming we're operating at "close + // enough" to 3.3V. + flash_set_latency(FLASH_SAFE_WAIT_STATES); +} + +static void setup_clocks(void) { + // Turn on HSI. We'll switch to and run off of this while we're + // setting up the main PLL. + rcc_turn_on_clk(RCC_CLK_HSI); + + // Turn off and reset the clock subsystems we'll be using, as well + // as the clock security subsystem (CSS). Note that resetting CFGR + // to its default value of 0 implies a switch to HSI for SYSCLK. + RCC_BASE->CFGR = 0x00000000; + rcc_disable_css(); + rcc_turn_off_clk(RCC_CLK_PLL); + rcc_turn_off_clk(RCC_CLK_HSE); + wirish::priv::board_reset_pll(); + // Clear clock readiness interrupt flags and turn off clock + // readiness interrupts. + RCC_BASE->CIR = 0x00000000; +#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)) + ; +#endif + // Configure AHBx, APBx, etc. prescalers and the main PLL. + wirish::priv::board_setup_clock_prescalers(); + rcc_configure_pll(&wirish::priv::w_board_pll_cfg); + + // Enable the PLL, and wait until it's ready. + rcc_turn_on_clk(RCC_CLK_PLL); + while(!rcc_is_clk_ready(RCC_CLK_PLL)) + ; + + // Finally, switch to the now-ready PLL as the main clock source. + rcc_switch_sysclk(RCC_CLKSRC_PLL); +} + +/* + * These addresses are where usercode starts when a bootloader is + * present. If no bootloader is present, the user NVIC usually starts + * at the Flash base address, 0x08000000. + */ +#if defined(BOOTLOADER_maple) + #define USER_ADDR_ROM 0x08005000 +#else + #define USER_ADDR_ROM 0x08000000 +#endif +#define USER_ADDR_RAM 0x20000C00 +extern char __text_start__; + +static void setup_nvic(void) { + +nvic_init((uint32)VECT_TAB_ADDR, 0); + +/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater +#ifdef VECT_TAB_FLASH + nvic_init(USER_ADDR_ROM, 0); +#elif defined VECT_TAB_RAM + nvic_init(USER_ADDR_RAM, 0); +#elif defined VECT_TAB_BASE + nvic_init((uint32)0x08000000, 0); +#elif defined VECT_TAB_ADDR + // A numerically supplied value + nvic_init((uint32)VECT_TAB_ADDR, 0); +#else + // Use the __text_start__ value from the linker script; this + // should be the start of the vector table. + nvic_init((uint32)&__text_start__, 0); +#endif + +*/ +} + +static void adc_default_config(adc_dev *dev) { + adc_enable_single_swstart(dev); + adc_set_sample_rate(dev, wirish::priv::w_adc_smp); +} + +static void setup_adcs(void) { + adc_set_prescaler(wirish::priv::w_adc_pre); + adc_foreach(adc_default_config); +} + +static void timer_default_config(timer_dev *dev) { + timer_adv_reg_map *regs = (dev->regs).adv; + const uint16 full_overflow = 0xFFFF; + const uint16 half_duty = 0x8FFF; + + timer_init(dev); + timer_pause(dev); + + regs->CR1 = TIMER_CR1_ARPE; + regs->PSC = 1; + regs->SR = 0; + regs->DIER = 0; + regs->EGR = TIMER_EGR_UG; + switch (dev->type) { + case TIMER_ADVANCED: + regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; + // fall-through + case TIMER_GENERAL: + timer_set_reload(dev, full_overflow); + for (uint8 channel = 1; channel <= 4; channel++) { + if (timer_has_cc_channel(dev, channel)) { + timer_set_compare(dev, channel, half_duty); + timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, + TIMER_OC_PE); + } + } + // fall-through + case TIMER_BASIC: + break; + } + + timer_generate_update(dev); + timer_resume(dev); +} + +static void setup_timers(void) { + timer_foreach(timer_default_config); +} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp new file mode 100644 index 00000000..c3f52472 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp @@ -0,0 +1,128 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*****************************************************************************/ + +/** + * @file wirish/stm32f1/boards_setup.cpp + * @author Marti Bolivar + * @brief STM32F1 chip setup. + * + * This file controls how init() behaves on the STM32F1. Be very + * careful when changing anything here. Many of these values depend + * upon each other. + */ + +#include "boards_private.h" + +#include +#include + +#include +#include + +// Allow boards to provide a PLL multiplier. This is useful for +// e.g. STM32F100 value line MCUs, which use slower multipliers. +// (We're leaving the default to RCC_PLLMUL_9 for now, since that +// works for F103 performance line MCUs, which is all that LeafLabs +// currently officially supports). +#ifndef BOARD_RCC_PLLMUL + #if !USE_HSI_CLOCK + #if F_CPU==128000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #elif F_CPU==72000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 + #elif F_CPU==48000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_6 + #elif F_CPU==16000000 + #define BOARD_RCC_PLLMUL RCC_PLLMUL_2 + #endif + #else + #define BOARD_RCC_PLLMUL RCC_PLLMUL_16 + #endif +#endif + +namespace wirish { + namespace priv { + + static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL}; +#if !USE_HSI_CLOCK + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; +#else + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; +#endif + __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; + __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; + + __weak void board_reset_pll(void) { + // TODO + } + + __weak void board_setup_clock_prescalers(void) { + rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); + rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); + rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); + rcc_clk_disable(RCC_USB); +#if F_CPU == 72000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); +#elif F_CPU == 48000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); +#endif + } + + __weak void board_setup_gpio(void) { + /** + * PA14 is a pull up pin. But, some V5 boards it start with LOW state! And just behave properly when the Z- PROBE is actived at least once. + * So, if the sensor isnt actived, the PA14 pin will be forever in LOW state, telling Marlin the probe IS ALWAYS ACTIVE, that isnt the case! + * Chitu original firmware seems to start with every pullup PIN with HIGH to workaround this. + * So we are doing the same here. + * This hack only works if applied *before* the GPIO Init, it's the reason I did it here. + */ + #ifdef CHITU_V5_Z_MIN_BUGFIX + GPIOA->regs->BSRR = (1U << PA14); + #endif + gpio_init_all(); + } + + __weak void board_setup_usb(void) { +#ifdef SERIAL_USB +#ifdef GENERIC_BOOTLOADER + // Reset the USB interface on generic boards - developed by Victor PV + gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); + gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); + + for (volatile unsigned int i = 0; i < 512; i++); // Only small delay seems to be needed, and USB pins will get configured in Serial.begin + gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); +#endif + Serial.begin(); // Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility +#endif + } + + __weak void series_init(void) { + // Initialize AFIO here, too, so peripheral remaps and external + // interrupts work out of the box. + afio_init(); + } + } +} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c new file mode 100644 index 00000000..d305e6d5 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c @@ -0,0 +1,144 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +#include +#include +#include + +#include "rcc_private.h" + +#include +#include +#include "usart_private.h" + +#include +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; +extern void __lm_error(); +extern void timer_disable_all(); + + /* Turn off ADC */ +extern void adc_disable_all(); + + /* Turn off all USARTs */ +extern void usart_disable_all(); +extern void DisableEverything(); + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + asm("CPSID I"); + /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ + /* Set HSION bit */ + RCC_BASE->CR |= 0x00000001U; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ + RCC_BASE->CFGR &= 0xF0FF0000U; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC_BASE->CR &= 0xFEF6FFFFU; + + /* Reset HSEBYP bit */ + RCC_BASE->CR &= 0xFFFBFFFFU; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC_BASE->CFGR &= 0xFF80FFFFU; + + /* Disable all interrupts and clear pending bits */ + RCC_BASE->CIR = 0x009F0000U; + + USART1_BASE->CR1 = 0; + USART1_BASE->CR2 = 0; + USART1_BASE->CR3 = 0; + + memset(SDIO_BASE, 0, sizeof(sdio_reg_map)); + asm("CPSIE I"); + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} diff --git a/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c new file mode 100644 index 00000000..ec1c34db --- /dev/null +++ b/buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c @@ -0,0 +1,176 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/syscalls.c + * @brief newlib stubs + * + * Low level system routines used by newlib for basic I/O and memory + * allocation. You can override most of these. + */ + +#include + +#include +#include +#include + +/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then + * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by + * the linker */ +#ifndef CONFIG_HEAP_START +extern char _lm_heap_start; +#define CONFIG_HEAP_START ((void *)&_lm_heap_start) +#endif +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((void *)&_lm_heap_end) +#endif + +/* + * _sbrk -- Increment the program break. + * + * Get incr bytes more RAM (for use by the heap). malloc() and + * friends call this function behind the scenes. + */ +void *_sbrk(int incr) { + static void * pbreak = NULL; /* current program break */ + void * ret; + + if (pbreak == NULL) { + pbreak = CONFIG_HEAP_START; + } + + if ((CONFIG_HEAP_END - pbreak < incr) || + (pbreak - CONFIG_HEAP_START < -incr)) { + errno = ENOMEM; + return (void *)-1; + } + + ret = pbreak; + pbreak += incr; + return ret; +} + +__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) { + return 1; +} + +__weak int _close(int fd __attribute__((unused))) { + return 0; +} + +__weak int _fstat(int fd __attribute__((unused)), struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +__weak int _isatty(int fd __attribute__((unused))) { + return 1; +} + +__weak int isatty(int fd __attribute__((unused))) { + return 1; +} + +__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) { + return -1; +} + +__weak unsigned char getch(void) { + return 0; +} + + +__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) { + *buf = getch(); + + return 1; +} + +__weak void putch(unsigned char c __attribute__((unused))) { +} + +__weak void cgets(char *s, int bufsize) { + char *p; + int c; + int i; + + for (i = 0; i < bufsize; i++) { + *(s+i) = 0; + } +// memset(s, 0, bufsize); + + p = s; + + for (p = s; p < s + bufsize-1;) { + c = getch(); + switch (c) { + case '\r' : + case '\n' : + putch('\r'); + putch('\n'); + *p = '\n'; + return; + + case '\b' : + if (p > s) { + *p-- = 0; + putch('\b'); + putch(' '); + putch('\b'); + } + break; + + default : + putch(c); + *p++ = c; + break; + } + } + return; +} + +__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) { + int i; + + for (i = 0; i < cnt; i++) + putch(buf[i]); + + return cnt; +} + +/* Override fgets() in newlib with a version that does line editing */ +__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) { + cgets(s, bufsize); + return s; +} + +__weak void _exit(int exitcode __attribute__((unused))) { + while (1) + ; +} diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c new file mode 100644 index 00000000..f0f2c4b8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PeripheralPins.c @@ -0,0 +1,404 @@ +/* + ******************************************************************************* + * 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 +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_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 +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, 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} +}; + +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)}, + //{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 +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_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 + //{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 + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +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)}, + //{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} +}; + +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)}, + //{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} +}; + +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} +}; + +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 + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +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, 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} +}; + +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, 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} +}; + +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, 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} +}; + +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)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +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} +}; + +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 + +//*** ETHERNET *** + +#ifdef HAL_ETH_MODULE_ENABLED +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 + {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 +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} +}; + +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/FLY_F407ZG/PinNamesVar.h b/buildroot/share/PlatformIO/variants/FLY_F407ZG/PinNamesVar.h new file mode 100644 index 00000000..b4bb9d45 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/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/FLY_F407ZG/ldscript.ld b/buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld new file mode 100644 index 00000000..40abfe19 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/ldscript.ld @@ -0,0 +1,207 @@ +/* +***************************************************************************** +** + +** File : lscript.ld +** +** Abstract : Linker script for STM32F407(VZ)(EG)Tx Device with +** 512/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. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** 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 Ac6 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 = 0x20020000; /* 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 +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K -32K +} + +/* 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/variants/FLY_F407ZG/variant.cpp b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp new file mode 100644 index 00000000..1c7aedd9 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.cpp @@ -0,0 +1,212 @@ +/* + ******************************************************************************* + * 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[] = { +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 +} +#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; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h new file mode 100644 index 00000000..ae973c89 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/FLY_F407ZG/variant.h @@ -0,0 +1,239 @@ +/* + ******************************************************************************* + * 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 + *----------------------------------------------------------------------------*/ + + +#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 114 +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 7 +#define NUM_ANALOG_FIRST 107 + + +// 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/share/PlatformIO/variants/LERDGE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/LERDGE/PeripheralPins.c new file mode 100644 index 00000000..8cb0776f --- /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 00000000..b4bb9d45 --- /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 00000000..ebc1922e --- /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 00000000..87033a68 --- /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/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Vx/PeripheralPins.c new file mode 100644 index 00000000..c9d2bb88 --- /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 00000000..d9076b4d --- /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 00000000..c9197c8b --- /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 00000000..25b4b511 --- /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 00000000..b622b393 --- /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 00000000..5736e520 --- /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 00000000..d9076b4d --- /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 00000000..014943f3 --- /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 00000000..09088b62 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Zx/ldscript.ld @@ -0,0 +1,197 @@ +/* +****************************************************************************** +** + +** 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 00000000..ff7ab771 --- /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 00000000..fb878f8b --- /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/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c new file mode 100644 index 00000000..d3c76713 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PeripheralPins.c @@ -0,0 +1,440 @@ +/* + ******************************************************************************* + * 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 + * + * 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 "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 +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + //{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 +#endif + {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 +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + //{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 +#endif + {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, 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)}, +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, +#endif + {NC, NP, 0} +}; + +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)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, +#endif + {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, 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 +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {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 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +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)}, + {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)}, +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +#endif + {NC, NP, 0} +}; + +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)}, + {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)}, +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, +#endif + {NC, NP, 0} +}; + +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)}, +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {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)}, +#endif + {NC, NP, 0} +}; + +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)}, +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) + {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)}, +#endif + {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, 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} +}; + +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, 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} +}; + +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, 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} +}; + +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)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +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} +}; + +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 + +//*** ETHERNET *** + +#ifdef HAL_ETH_MODULE_ENABLED +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 + {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 + #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 + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +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} +}; + +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 + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + //{PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + //{PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + //{PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + //{PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/PinNamesVar.h new file mode 100644 index 00000000..b4bb9d45 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/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/MARLIN_F407VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h new file mode 100644 index 00000000..92e9fecb --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/hal_conf_custom.h @@ -0,0 +1,496 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL 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 __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ + /** + * @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_CRC_MODULE_ENABLED +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +#define HAL_DAC_MODULE_ENABLED +/* #define HAL_DCMI_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_QSPI_MODULE_ENABLED */ +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#ifndef HAL_PCD_MODULE_ENABLED + #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#endif +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ + +/* ########################## HSE/HSI 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). + */ +#ifndef HSE_VALUE +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#ifndef 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). + */ +#ifndef HSI_VALUE +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#ifndef LSI_VALUE +#define LSI_VALUE 32000U /*!< 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. + */ +#ifndef LSE_VALUE +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#ifndef LSE_STARTUP_TIMEOUT +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#ifndef EXTERNAL_CLOCK_VALUE +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* 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 +#if !defined (INSTRUCTION_CACHE_ENABLE) +#define INSTRUCTION_CACHE_ENABLE 1U +#endif +#if !defined (DATA_CACHE_ENABLE) +#define DATA_CACHE_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_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH 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_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC 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_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI 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_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS 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)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex 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 + */ +#ifndef USE_SPI_CRC +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_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 /* __STM32F4xx_HAL_CONF_CUSTOM_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407VE/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/ldscript.ld new file mode 100644 index 00000000..efe2db5c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/ldscript.ld @@ -0,0 +1,204 @@ +/* +***************************************************************************** +** + +** File : lscript.ld +** +** Abstract : Linker script for STM32F407(VZ)(EG)Tx Device with +** 512/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. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** 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 Ac6 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 */ +/* 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 +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +} + +/* 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/variants/MARLIN_F407VE/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.cpp new file mode 100644 index 00000000..e78718c8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.cpp @@ -0,0 +1,240 @@ +/* + ******************************************************************************* + * 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 + +#if defined(ARDUINO_BLACK_F407VE) || defined(ARDUINO_BLACK_F407VG) +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { + // Right Side + //Int //Ext + //3V3 //3V3 + //3V3 //3V3 + //BOOT0 //BOOT1 + //GND //GND + //GND //GND + PE_1, PE_0, // D0, D1 + PB_9, PB_8, + PB_7, PB_6, + PB_5, PB_3, + PD_7, PD_6, + PD_5, PD_4, // D10, D11 + PD_3, PD_2, + PD_1, PD_0, + PC_12, PC_11, + PC_10, PA_15, + PA_12, PA_11, // D20, D21 PA_11: USB_DM, PA_12: USB_DP + PA_10, PA_9, + PA_8, PC_9, + PC_8, PC_7, + PC_6, PD_15, + PD_14, PD_13, // D30, D31 + PD_12, PD_11, + PD_10, PD_9, + PD_8, PB_15, + // Left Side + //Ext //Int + //5V //5V + //5V //5V + //3V3 //3V3 + //3V3 //3V3 + //GND //GND + PE_2, PE_3, + PE_4, PE_5, // D40, D41 PE_4: BUT K0, PE_5: BUT K1 + PE_6, PC_13, + PC_0, PC_1, + PC_2, PC_3, + //VREF- //VREF+ + PA_0, PA_1, // PA_0(WK_UP): BUT K_UP) + PA_2, PA_3, // D50, D51 + PA_4, PA_5, + /*PA_6, PA_7,*/ // PA_6, PA_7: Moved to allow contiguous analog pins + PC_4, PC_5, + PB_0, PB_1, + PA_6, PA_7, // PA_6: LED D2, PA_7: LED D3 (active LOW) + PE_7, PE_8, // D60, D61 + PE_9, PE_10, + PE_11, PE_12, + PE_13, PE_14, + PE_15, PB_10, + PB_11, PB_12, // D70, D71 + PB_13, PB_14, + PB_4, +}; +#endif // ARDUINO_BLACK_F407VE || ARDUINO_BLACK_F407VG + +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) +const PinName digitalPin[] = { + // Left Side + //Ext //Int + //GND //5V + //GND //3V3 + 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_11: USB_DM, PA_12: USB_DP + 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, + + // Right Side + //Int //Ext + //3V3 //3V3 + //BOOT1 //BOOT0 + //GND //GND + //VREF+ //GND + 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, // PB1 PB2 Inverted to allow contiguous analog pins + 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, // PA_0(WK_UP): BUT K_UP) + PC_1, PC_2, + /*PF_10,*/PC_0, // PF_10: Moved to allow contiguous analog pins + PF_8, /*PF_9,*/ // PF_9: Moved to allow contiguous analog pins + PF_6, PF_7, + PF_10, PF_9, // PF_10: LED D2, PF_9: LED D1 (active low) + PF_4, PF_5, + PF_2, PF_3, + PF_0, PF_1, + PE_6, PC_13, + PE_4, PE_5, // PE_4: BUT K0, PE_5: BUT K1 + PE_2, PE_3, + PE_0, PE_1, +}; +#endif // ARDUINO_BLACK_F407ZE || ARDUINO_BLACK_F407ZG + +#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; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**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/MARLIN_F407VE/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.h new file mode 100644 index 00000000..4e7e299f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407VE/variant.h @@ -0,0 +1,353 @@ +/* + ******************************************************************************* + * 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. + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#if defined(ARDUINO_BLACK_F407VE) || defined(ARDUINO_BLACK_F407VG) +// Right Side +#define PE1 0 +#define PE0 1 +#define PB9 2 +#define PB8 3 +#define PB7 4 +#define PB6 5 +#define PB5 6 +#define PB3 7 +#define PD7 8 +#define PD6 9 +#define PD5 10 +#define PD4 11 +#define PD3 12 +#define PD2 13 +#define PD1 14 +#define PD0 15 +#define PC12 16 +#define PC11 17 +#define PC10 18 +#define PA15 19 +#define PA12 20 // USB_DP +#define PA11 21 // USB_DM +#define PA10 22 +#define PA9 23 +#define PA8 24 +#define PC9 25 +#define PC8 26 +#define PC7 27 +#define PC6 28 +#define PD15 29 +#define PD14 30 +#define PD13 31 +#define PD12 32 +#define PD11 33 +#define PD10 34 +#define PD9 35 +#define PD8 36 +#define PB15 37 +// Left Side +#define PE2 38 +#define PE3 39 +#define PE4 40 // BUT K0 +#define PE5 41 // BUT K1 +#define PE6 42 +#define PC13 43 +#define PC0 44 // A0 +#define PC1 45 // A1 +#define PC2 46 // A2 +#define PC3 47 // A3 +#define PA0 48 // A4/WK_UP: BUT K_UP +#define PA1 49 // A5 +#define PA2 50 // A6 +#define PA3 51 // A7 +#define PA4 52 // A8 +#define PA5 53 // A9 +#define PC4 54 // A10 +#define PC5 55 // A11 +#define PB0 56 // A12 +#define PB1 57 // A13 +#define PA6 58 // LED D2 +#define PA7 59 // LED D3 (active LOW) +#define PE7 60 +#define PE8 61 +#define PE9 62 +#define PE10 63 +#define PE11 64 +#define PE12 65 +#define PE13 66 +#define PE14 67 +#define PE15 68 +#define PB10 69 +#define PB11 70 +#define PB12 71 +#define PB13 72 +#define PB14 73 +#define PB4 74 + +// This must be a literal +#define NUM_DIGITAL_PINS 75 +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 14 +#define NUM_ANALOG_FIRST 44 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +//#define PWM_RESOLUTION 8 +//#define PWM_FREQUENCY 20000 +//#define PWM_MAX_DUTY_CYCLE 255 + +// On-board LED pin number +#define LED_D2 PA6 +#define LED_D3 PA7 + +// Board specific button +#define BTN_K_UP PA0 + +#endif // ARDUINO_BLACK_F407VE || ARDUINO_BLACK_F407VG + +#if defined(ARDUINO_BLACK_F407ZE) || defined(ARDUINO_BLACK_F407ZG) +// 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 + +// This must be a literal +#define NUM_DIGITAL_PINS 110 +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 19 +#define NUM_ANALOG_FIRST 75 + +// On-board LED pin number +#define LED_D2 PF10 +#define LED_D1 PF9 + +// Board specific button +#define BTN_WK_UP PA0 + +#endif // ARDUINO_BLACK_F407ZE || ARDUINO_BLACK_F407ZG + +#define LED_BUILTIN LED_D2 +#define LED_GREEN LED_D2 + +// On-board user button +#define BTN_K0 PE4 +#define BTN_K1 PE3 +#define USER_BTN BTN_K0 + +// 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_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 +#define PIN_SPI_SS PB12 +//#define PIN_SPI_SS1 PB0 // W25Q16 (on board flash) + +// 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 TIM2 //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 + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c new file mode 100644 index 00000000..cc700201 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c @@ -0,0 +1,361 @@ +/* + ******************************************************************************* + * Copyright (c) 2016, 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 "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 +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 + {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 - LD2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SDA[] = { + // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {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)}, + // {PC_7, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, + // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + // {PC_12, 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)}, + // {PC_6, FMPI2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)}, + {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 - STLink Tx + // {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 - STLink Tx + // {PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 - STLink Tx + // {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 - STLink Rx + // {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 - STLink Rx + // {PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 - STLink Rx + {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, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + // {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_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_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)}, // Fan0, 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)}, // Fan1, TIM8_CH3N + {PB_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // Fan2, TIM2_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // E0 Heater, TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // E1 Heater, TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // LED G, TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // LED R, TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // LED B, TIM4_CH2 + // {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + // {PB_8, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + // {PB_9, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + // {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {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, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + // {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_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + // {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 + {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_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {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 + {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)}, + {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)}, + // {PC_5, 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)}, + {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)}, + // {PA_15, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_8, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + {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_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + // {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + // {PC_9, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)}, + {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_0, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {PB_2, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI3)}, + // {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_1, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {PC_1, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_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[] = { + {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)}, + // {PA_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {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_7, 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_4, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_SPI2)}, + // {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)}, + {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)}, + {NC, NP, 0} +}; +#endif + +//*** ETHERNET *** + +//*** No Ethernet *** + +//*** QUADSPI *** + +#ifdef HAL_QSPI_MODULE_ENABLED +const PinMap PinMap_QUADSPI[] = { + // {PA_1, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO3 + // {PB_2, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_CLK + // {PB_6, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)}, // QUADSPI_BK1_NCS + // {PC_9, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO0 + // {PC_10, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK1_IO1 + // {PC_11, QUADSPI, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)}, // QUADSPI_BK2_NCS + {NC, NP, 0} +}; +#endif + +//*** 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, 0)}, // 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[] = { + {NC, NP, 0} +}; +#endif + + diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h new file mode 100644 index 00000000..bff3f213 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h @@ -0,0 +1,30 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, /* SYS_WKUP0 */ +#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_DM = PA_11, + USB_OTG_FS_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld new file mode 100644 index 00000000..2a61072c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld @@ -0,0 +1,187 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F407VETx Device with +** 512KByte 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. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** 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 Ac6 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 = 0x20020000; /* 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 = 0x8010000, LENGTH = 512K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +} + +/* 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);*/ + + /* 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/variants/MARLIN_FYSETC_S6/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp new file mode 100644 index 00000000..7e3df41f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp @@ -0,0 +1,201 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +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 + + //Duplicated ADC Pins + PA_3, //D80/A0 + PA_4, //D81/A1 + PC_0, //D82/A2 + PC_1, //D83/A3 + PC_2, //D84/A4 + PC_3, //D85/A5 + PC_4 //D86/A6 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSE) + * SYSCLK(Hz) = 180000000 + * HCLK(Hz) = 180000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 4 + * APB2 Prescaler = 2 + * HSE Frequency(Hz) = 12000000 + * PLL_M = 6 + * PLL_N = 180 + * PLL_P = 2 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale1 mode + * Flash Latency(WS) = 5 + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; + + + /* Enable Power Control clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + +#ifdef HAL_PWR_MODULE_ENABLED + /* 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); +#endif + + /* Enable HSE Oscillator and activate PLL with HSE as source */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 6; + RCC_OscInitStruct.PLL.PLLN = 180; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + RCC_OscInitStruct.PLL.PLLR = 2; + HAL_RCC_OscConfig(&RCC_OscInitStruct); + + HAL_PWREx_EnableOverDrive(); + + /* 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_PLLRCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48; + PeriphClkInitStruct.PLLSAI.PLLSAIM = 6; + PeriphClkInitStruct.PLLSAI.PLLSAIN = 96; + PeriphClkInitStruct.PLLSAI.PLLSAIQ = 2; + PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4; + PeriphClkInitStruct.PLLSAIDivQ = 1; + PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP; + HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h new file mode 100644 index 00000000..ee4b1ef2 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h @@ -0,0 +1,182 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +#define PA0 0 //D0 +#define PA1 1 //D1 +#define PA2 2 //D2 +#define PA3 3 //D3 +#define PA4 4 //D4 +#define PA5 5 //D5 +#define PA6 6 //D6 +#define PA7 7 //D7 +#define PA8 8 //D8 +#define PA9 9 //D9 +#define PA10 10 //D10 +#define PA11 11 //D11 +#define PA12 12 //D12 +#define PA13 13 //D13 +#define PA14 14 //D14 +#define PA15 15 //D15 +#define PB0 16 //D16 +#define PB1 17 //D17 +#define PB2 18 //D18 +#define PB3 19 //D19 +#define PB4 20 //D20 +#define PB5 21 //D21 +#define PB6 22 //D22 +#define PB7 23 //D23 +#define PB8 24 //D24 +#define PB9 25 //D25 +#define PB10 26 //D26 +#define PB11 27 //D27 +#define PB12 28 //D28 +#define PB13 29 //D29 +#define PB14 30 //D30 +#define PB15 31 //D31 +#define PC0 32 //D32 +#define PC1 33 //D33 +#define PC2 34 //D34 +#define PC3 35 //D35 +#define PC4 36 //D36 +#define PC5 37 //D37 +#define PC6 38 //D38 +#define PC7 39 //D39 +#define PC8 40 //D40 +#define PC9 41 //D41 +#define PC10 42 //D42 +#define PC11 43 //D43 +#define PC12 44 //D44 +#define PC13 45 //D45 +#define PC14 46 //D46 +#define PC15 47 //D47 +#define PD0 48 //D48 +#define PD1 49 //D49 +#define PD2 50 //D50 +#define PD3 51 //D51 +#define PD4 52 //D52 +#define PD5 53 //D53 +#define PD6 54 //D54 +#define PD7 55 //D55 +#define PD8 56 //D56 +#define PD9 57 //D57 +#define PD10 58 //D58 +#define PD11 59 //D59 +#define PD12 60 //D60 +#define PD13 61 //D61 +#define PD14 62 //D62 +#define PD15 63 //D63 +#define PE0 64 //D64 +#define PE1 65 //D65 +#define PE2 66 //D66 +#define PE3 67 //D67 +#define PE4 68 //D68 +#define PE5 69 //D69 +#define PE6 70 //D70 +#define PE7 71 //D71 +#define PE8 72 //D72 +#define PE9 73 //D73 +#define PE10 74 //D74 +#define PE11 75 //D75 +#define PE12 76 //D76 +#define PE13 77 //D77 +#define PE14 78 //D78 +#define PE15 79 //D79 + +// This must be a literal with the same value as PEND +#define NUM_DIGITAL_PINS 87 +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 7 +#define NUM_ANALOG_FIRST 80 + +// PWM resolution +// #define PWM_RESOLUTION 12 +#define PWM_FREQUENCY 20000 // >= 20 Khz => inaudible noise for fans +#define PWM_MAX_DUTY_CYCLE 255 + +// SPI Definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + +// I2C Definitions +#define PIN_WIRE_SDA PB9 +#define PIN_WIRE_SCL PB8 + +// Timer Definitions +// Do not use timer used by PWM pin. See PinMap_PWM. +#define TIMER_TONE TIM6 +#define TIMER_SERVO TIM5 +#define TIMER_SERIAL TIM7 + +// UART Definitions +//#define SERIAL_UART_INSTANCE 1 // Connected to EXP3 header +/* Enable Serial 3 */ +#define HAVE_HWSERIAL1 +#define HAVE_HWSERIAL3 + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +/* HAL configuration */ +#define HSE_VALUE 12000000U + +#define FLASH_PAGE_SIZE (4U * 1024U) + +#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_OPEN Serial +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp b/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp new file mode 100644 index 00000000..5ddeb1f1 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/board.cpp @@ -0,0 +1,161 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards/maple/board.cpp + * @author Marti Bolivar + * @brief Maple board file. + */ + +#include // For this board's header file + + +/* Roger Clark. Added next to includes for changes to Serial */ +#include +#include + +#include // For stm32_pin_info and its contents + // (these go into PIN_MAP). + +#include "boards_private.h" // For PMAP_ROW(), which makes + // PIN_MAP easier to read. + +// boardInit(): nothing special to do for Maple. +// +// When defining your own board.cpp, you can put extra code in this +// function if you have anything you want done on reset, before main() +// or setup() are called. +// +// If there's nothing special you need done, feel free to leave this +// function out, as we do here. + +void boardInit(void) { + // afio_remap(AFIO_REMAP_I2C1); +} + +// Pin map: this lets the basic I/O functions (digitalWrite(), +// analogRead(), pwmWrite()) translate from pin numbers to STM32 +// peripherals. +// +// PMAP_ROW() lets us specify a row (really a struct stm32_pin_info) +// in the pin map. Its arguments are: +// +// - GPIO device for the pin (&gpioa, etc.) +// - GPIO bit for the pin (0 through 15) +// - Timer device, or NULL if none +// - Timer channel (1 to 4, for PWM), or 0 if none +// - ADC device, or NULL if none +// - ADC channel, or ADCx if none + +extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = { + /* + gpio_dev *gpio_device; GPIO device + timer_dev *timer_device; Pin's timer device, if any. + const adc_dev *adc_device; ADC device, if any. + uint8 gpio_bit; Pin's GPIO port bit. + uint8 timer_channel; Timer channel, or 0 if none. + uint8 adc_channel; Pin ADC channel, or ADCx if none. + */ + + {&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */ + {&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */ + {&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */ + {&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */ + {&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */ + {&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */ + {&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */ + {&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */ + {&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */ + {&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */ + {&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */ + {&gpioa, NULL, NULL, 11, 0, ADCx}, /* PA11 */ + {&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */ + {&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */ + {&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */ + {&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */ + + {&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */ + {&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */ + {&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */ + {&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */ + {&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */ + {&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */ + {&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */ + {&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */ + {&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */ + {&gpiob, NULL, NULL, 9, 0, ADCx}, /* PB9 */ + {&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */ + {&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */ + {&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */ + {&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */ + {&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */ + {&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */ + + + {&gpioc, NULL, &adc1, 0, 0, 10}, /* PC0 */ + {&gpioc, NULL, &adc1, 1, 0, 11}, /* PC1 */ + {&gpioc, NULL, &adc1, 2, 0, 12}, /* PC2 */ + {&gpioc, NULL, &adc1, 3, 0, 13}, /* PC3 */ + {&gpioc, NULL, &adc1, 4, 0, 14}, /* PC4 */ + {&gpioc, NULL, &adc1, 5, 0, 15}, /* PC5 */ + {&gpioc, &timer8, NULL, 6, 1, ADCx}, /* PC6 */ + {&gpioc, &timer8, NULL, 7, 2, ADCx}, /* PC7 */ + {&gpioc, &timer8, NULL, 8, 3, ADCx}, /* PC8 */ + {&gpioc, &timer8, NULL, 9, 4, ADCx}, /* PC9 */ + {&gpioc, NULL, NULL, 10, 0, ADCx}, /* PC10 UART4_TX/SDIO_D2 */ + {&gpioc, NULL, NULL, 11, 0, ADCx}, /* PC11 UART4_RX/SDIO_D3 */ + {&gpioc, NULL, NULL, 12, 0, ADCx}, /* PC12 UART5_TX/SDIO_CK */ + {&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 TAMPER-RTC */ + {&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 OSC32_IN */ + {&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 OSC32_OUT */ + + {&gpiod, NULL, NULL, 0, 0, ADCx} , /* PD0 OSC_IN */ + {&gpiod, NULL, NULL, 1, 0, ADCx} , /* PD1 OSC_OUT */ + {&gpiod, NULL, NULL, 2, 0, ADCx} , /* PD2 TIM3_ETR/UART5_RX SDIO_CMD */ +}; + +/* Basically everything that is defined as having a timer us PWM */ +extern const uint8 boardPWMPins[BOARD_NR_PWM_PINS] __FLASH__ = { + PA0,PA1,PA2,PA3,PA6,PA7,PA8,PA9,PA10,PB0,PB1,PB6,PB7,PB8,PB9,PC6,PC7,PC8,PC9 +}; + +/* Basically everything that is defined having ADC */ +extern const uint8 boardADCPins[BOARD_NR_ADC_PINS] __FLASH__ = { + PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1,PC0,PC1,PC2,PC3,PC4,PC5 +}; + +/* not sure what this us used for */ +extern const uint8 boardUsedPins[BOARD_NR_USED_PINS] __FLASH__ = { + BOARD_JTMS_SWDIO_PIN, + BOARD_JTCK_SWCLK_PIN, BOARD_JTDI_PIN, BOARD_JTDO_PIN, BOARD_NJTRST_PIN +}; + +DEFINE_HWSERIAL(Serial1, 1); +DEFINE_HWSERIAL(Serial2, 2); +DEFINE_HWSERIAL(Serial3, 3); +DEFINE_HWSERIAL_UART(Serial4, 4); +DEFINE_HWSERIAL_UART(Serial5, 5); + diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h b/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h new file mode 100644 index 00000000..da9ffd89 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/board/board.h @@ -0,0 +1,125 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file maple_RET6.h + * @author Marti Bolivar + * @brief Private include file for Maple RET6 Edition in boards.h + * + * See maple.h for more information on these definitions. + */ + +#ifndef _BOARDS_GENERIC_STM32F103R_H_ +#define _BOARDS_GENERIC_STM32F103R_H_ + +/* A few of these values will seem strange given that it's a + * high-density board. */ + +#define CYCLES_PER_MICROSECOND 72 +#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */ + +// USARTS +#define BOARD_NR_USARTS 5 +#define BOARD_USART1_TX_PIN PA9 +#define BOARD_USART1_RX_PIN PA10 + +#define BOARD_USART2_TX_PIN PA2 +#define BOARD_USART2_RX_PIN PA3 + +#define BOARD_USART3_TX_PIN PB10 +#define BOARD_USART3_RX_PIN PB11 + +#define BOARD_USART4_TX_PIN PC10 +#define BOARD_USART4_RX_PIN PC11 + +#define BOARD_USART5_TX_PIN PC12 +#define BOARD_USART5_RX_PIN PD2 + +/* Note: + * + * SPI3 is unusable due to pin 43 (PB4) and NRST tie-together :(, but + * leave the definitions so as not to clutter things up. This is only + * OK since RET6 Ed. is specifically advertised as a beta board. */ +#define BOARD_NR_SPI 3 +#define BOARD_SPI1_NSS_PIN PA4 +#define BOARD_SPI1_SCK_PIN PA5 +#define BOARD_SPI1_MISO_PIN PA6 +#define BOARD_SPI1_MOSI_PIN PA7 + + + +#define BOARD_SPI2_NSS_PIN PB12 +#define BOARD_SPI2_SCK_PIN PB13 +#define BOARD_SPI2_MISO_PIN PB14 +#define BOARD_SPI2_MOSI_PIN PB15 + + +#define BOARD_SPI3_NSS_PIN PA15 +#define BOARD_SPI3_SCK_PIN PB3 +#define BOARD_SPI3_MISO_PIN PB4 +#define BOARD_SPI3_MOSI_PIN PB5 + + +/* GPIO A to E = 5 * 16 - BOOT1 not used = 79*/ +#define BOARD_NR_GPIO_PINS 51 +/* Note: NOT 19. The missing one is D38 a.k.a. BOARD_BUTTON_PIN, which + * isn't broken out to a header and is thus unusable for PWM. */ +#define BOARD_NR_PWM_PINS 19 +#define BOARD_NR_ADC_PINS 16 +#define BOARD_NR_USED_PINS 7 + +#define BOARD_JTMS_SWDIO_PIN 39 +#define BOARD_JTCK_SWCLK_PIN 40 +#define BOARD_JTDI_PIN 41 +#define BOARD_JTDO_PIN 42 +#define BOARD_NJTRST_PIN 43 + +/* USB configuration. BOARD_USB_DISC_DEV is the GPIO port containing + * the USB_DISC pin, and BOARD_USB_DISC_BIT is that pin's bit. */ +#define BOARD_USB_DISC_DEV GPIOC +#define BOARD_USB_DISC_BIT 12 + +/* + * SDIO Pins + */ +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 + +/* Pin aliases: these give the GPIO port/bit for each pin as an + * enum. These are optional, but recommended. They make it easier to + * write code using low-level GPIO functionality. */ +enum { +PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15, +PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15, +PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15, +PD0,PD1,PD2 +};/* Note PB2 is skipped as this is Boot1 and is not going to be much use as its likely to be pulled permanently low */ + +#endif diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld new file mode 100644 index 00000000..ca56532f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/bootloader.ld @@ -0,0 +1,18 @@ +/* + * Linker script for Generic STM32F103RE boards, using the generic bootloader (which takes the lower 8k of memory) + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08002000, LENGTH = 504K +} + + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc new file mode 100644 index 00000000..dd2c84fa --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/extra_libs.inc @@ -0,0 +1,7 @@ +/* + * Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi- + * releases (https://launchpad.net/gcc-arm-embedded/). + */ + +/* This is for the provided newlib. */ +GROUP(libnosys.a) diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld new file mode 100644 index 00000000..9e250cd7 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/flash.ld @@ -0,0 +1,26 @@ +/* + * libmaple linker script for "Flash" builds. + * + * A Flash build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but offsets the sections by + * enough space to store the Maple bootloader, which lives in low + * Flash and uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +INCLUDE mem-flash.inc + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld new file mode 100644 index 00000000..0612f958 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/jtag.ld @@ -0,0 +1,31 @@ +/* + * libmaple linker script for "JTAG" builds. + * + * A "JTAG" build puts .text (and .rodata) in Flash, and + * .data/.bss/heap (of course) in SRAM, but links starting at the + * Flash and SRAM starting addresses (0x08000000 and 0x20000000 + * respectively). This will wipe out a Maple bootloader if there's one + * on the board, so only use this if you know what you're doing. + * + * Of course, a "JTAG" build is perfectly usable for upload over SWD, + * the system memory bootloader, etc. The name is just a historical + * artifact. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +INCLUDE mem-jtag.inc + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc new file mode 100644 index 00000000..ddb8876f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-flash.inc @@ -0,0 +1,5 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K + rom (rx) : ORIGIN = 0x08005000, LENGTH = 492K +} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc new file mode 100644 index 00000000..d3ed9924 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-jtag.inc @@ -0,0 +1,5 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc new file mode 100644 index 00000000..360beafe --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/mem-ram.inc @@ -0,0 +1,5 @@ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K + rom (rx) : ORIGIN = 0x08005000, LENGTH = 0K +} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld new file mode 100644 index 00000000..34b468e0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/ram.ld @@ -0,0 +1,25 @@ +/* + * libmaple linker script for RAM builds. + * + * A Flash build puts .text, .rodata, and .data/.bss/heap (of course) + * in SRAM, but offsets the sections by enough space to store the + * Maple bootloader, which uses low memory. + */ + +/* + * This pulls in the appropriate MEMORY declaration from the right + * subdirectory of stm32/mem/ (the environment must call ld with the + * right include directory flags to make this happen). Boards can also + * use this file to use any of libmaple's memory-related hooks (like + * where the heap should live). + */ +INCLUDE mem-ram.inc + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", ram); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", ram); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld new file mode 100644 index 00000000..094f2d29 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb.ld @@ -0,0 +1,18 @@ +/* + * Linker script for Generic STM32F103RB boards. + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K +} + + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld new file mode 100644 index 00000000..d045db9f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rb_bootloader.ld @@ -0,0 +1,17 @@ +/* + * Linker script for Generic STM32F103RB boards, using the generic bootloader (which takes the lower 8k of memory) + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K + rom (rx) : ORIGIN = 0x08002000, LENGTH = 120K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld new file mode 100644 index 00000000..c890d69f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc.ld @@ -0,0 +1,18 @@ +/* + * Linker script for Generic STM32F103RC boards. + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K +} + + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld new file mode 100644 index 00000000..00b811b0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103rc_bootloader.ld @@ -0,0 +1,18 @@ +/* + * Linker script for Generic STM32F103RC boards, using the generic bootloader (which takes the lower 8k of memory) + */ + +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 48K + rom (rx) : ORIGIN = 0x08002000, LENGTH = 248K +} + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld new file mode 100644 index 00000000..9f74fd52 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/stm32f103re.ld @@ -0,0 +1,18 @@ +/* + * Linker script for Generic STM32F103RE boards. + */ +MEMORY +{ + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K +} + + +/* Provide memory region aliases for common.inc */ +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); +REGION_ALIAS("REGION_RODATA", rom); + +/* Let common.inc handle the real work. */ +INCLUDE common.inc diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc new file mode 100644 index 00000000..f8519bba --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/ld/vector_symbols.inc @@ -0,0 +1,78 @@ +EXTERN(__msp_init) +EXTERN(__exc_reset) +EXTERN(__exc_nmi) +EXTERN(__exc_hardfault) +EXTERN(__exc_memmanage) +EXTERN(__exc_busfault) +EXTERN(__exc_usagefault) +EXTERN(__stm32reservedexception7) +EXTERN(__stm32reservedexception8) +EXTERN(__stm32reservedexception9) +EXTERN(__stm32reservedexception10) +EXTERN(__exc_svc) +EXTERN(__exc_debug_monitor) +EXTERN(__stm32reservedexception13) +EXTERN(__exc_pendsv) +EXTERN(__exc_systick) + +EXTERN(__irq_wwdg) +EXTERN(__irq_pvd) +EXTERN(__irq_tamper) +EXTERN(__irq_rtc) +EXTERN(__irq_flash) +EXTERN(__irq_rcc) +EXTERN(__irq_exti0) +EXTERN(__irq_exti1) +EXTERN(__irq_exti2) +EXTERN(__irq_exti3) +EXTERN(__irq_exti4) +EXTERN(__irq_dma1_channel1) +EXTERN(__irq_dma1_channel2) +EXTERN(__irq_dma1_channel3) +EXTERN(__irq_dma1_channel4) +EXTERN(__irq_dma1_channel5) +EXTERN(__irq_dma1_channel6) +EXTERN(__irq_dma1_channel7) +EXTERN(__irq_adc) +EXTERN(__irq_usb_hp_can_tx) +EXTERN(__irq_usb_lp_can_rx0) +EXTERN(__irq_can_rx1) +EXTERN(__irq_can_sce) +EXTERN(__irq_exti9_5) +EXTERN(__irq_tim1_brk) +EXTERN(__irq_tim1_up) +EXTERN(__irq_tim1_trg_com) +EXTERN(__irq_tim1_cc) +EXTERN(__irq_tim2) +EXTERN(__irq_tim3) +EXTERN(__irq_tim4) +EXTERN(__irq_i2c1_ev) +EXTERN(__irq_i2c1_er) +EXTERN(__irq_i2c2_ev) +EXTERN(__irq_i2c2_er) +EXTERN(__irq_spi1) +EXTERN(__irq_spi2) +EXTERN(__irq_usart1) +EXTERN(__irq_usart2) +EXTERN(__irq_usart3) +EXTERN(__irq_exti15_10) +EXTERN(__irq_rtcalarm) +EXTERN(__irq_usbwakeup) + +EXTERN(__irq_tim8_brk) +EXTERN(__irq_tim8_up) +EXTERN(__irq_tim8_trg_com) +EXTERN(__irq_tim8_cc) +EXTERN(__irq_adc3) +EXTERN(__irq_fsmc) +EXTERN(__irq_sdio) +EXTERN(__irq_tim5) +EXTERN(__irq_spi3) +EXTERN(__irq_uart4) +EXTERN(__irq_uart5) +EXTERN(__irq_tim6) +EXTERN(__irq_tim7) +EXTERN(__irq_dma2_channel1) +EXTERN(__irq_dma2_channel2) +EXTERN(__irq_dma2_channel3) +EXTERN(__irq_dma2_channel4_5) diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h b/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h new file mode 100644 index 00000000..d5dce114 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/pins_arduino.h @@ -0,0 +1,2 @@ +// API compatibility +#include "variant.h" diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h b/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h new file mode 100644 index 00000000..cd10bb3c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/variant.h @@ -0,0 +1,17 @@ +#pragma once + +#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device ) +#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) ) +#define portOutputRegister(port) ( &(port->regs->ODR) ) +#define portInputRegister(port) ( &(port->regs->IDR) ) + +#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) ) +#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) ) + +#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) ) + +static const uint8_t SS = BOARD_SPI1_NSS_PIN; +static const uint8_t SS1 = BOARD_SPI2_NSS_PIN; +static const uint8_t MOSI = BOARD_SPI1_MOSI_PIN; +static const uint8_t MISO = BOARD_SPI1_MISO_PIN; +static const uint8_t SCK = BOARD_SPI1_SCK_PIN; diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp new file mode 100644 index 00000000..12321229 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards.cpp @@ -0,0 +1,225 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/boards.cpp + * @brief init() and board routines. + * + * This file is mostly interesting for the init() function, which + * configures Flash, the core clocks, and a variety of other available + * peripherals on the board so the rest of Wirish doesn't have to turn + * things on before using them. + * + * Prior to returning, init() calls boardInit(), which allows boards + * to perform any initialization they need to. This file includes a + * weak no-op definition of boardInit(), so boards that don't need any + * special initialization don't have to define their own. + * + * How init() works is chip-specific. See the boards_setup.cpp files + * under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be + * advised: their contents are unstable, and can/will change without + * notice. + */ + +#include +#include +#include +#include +#include +#include "boards_private.h" + +static void setup_flash(void); +static void setup_clocks(void); +static void setup_nvic(void); +static void setup_adcs(void); +static void setup_timers(void); + +/* + * Exported functions + */ + +void init(void) { + setup_flash(); + setup_clocks(); + setup_nvic(); + systick_init(SYSTICK_RELOAD_VAL); + wirish::priv::board_setup_gpio(); + setup_adcs(); + setup_timers(); + wirish::priv::board_setup_usb(); + wirish::priv::series_init(); + boardInit(); +} + +/* Provide a default no-op boardInit(). */ +__weak void boardInit(void) { +} + +/* You could farm this out to the files in boards/ if e.g. it takes + * too long to test on boards with lots of pins. */ +bool boardUsesPin(uint8 pin) { + for (int i = 0; i < BOARD_NR_USED_PINS; i++) { + if (pin == boardUsedPins[i]) { + return true; + } + } + return false; +} + +/* + * Auxiliary routines + */ + +static void setup_flash(void) { + // Turn on as many Flash "go faster" features as + // possible. flash_enable_features() just ignores any flags it + // can't support. + flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE); + // Configure the wait states, assuming we're operating at "close + // enough" to 3.3V. + flash_set_latency(FLASH_SAFE_WAIT_STATES); +} + +static void setup_clocks(void) { + // Turn on HSI. We'll switch to and run off of this while we're + // setting up the main PLL. + rcc_turn_on_clk(RCC_CLK_HSI); + + // Turn off and reset the clock subsystems we'll be using, as well + // as the clock security subsystem (CSS). Note that resetting CFGR + // to its default value of 0 implies a switch to HSI for SYSCLK. + RCC_BASE->CFGR = 0x00000000; + rcc_disable_css(); + rcc_turn_off_clk(RCC_CLK_PLL); + rcc_turn_off_clk(RCC_CLK_HSE); + wirish::priv::board_reset_pll(); + // Clear clock readiness interrupt flags and turn off clock + // readiness interrupts. + RCC_BASE->CIR = 0x00000000; +#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)) + ; +#endif + // Configure AHBx, APBx, etc. prescalers and the main PLL. + wirish::priv::board_setup_clock_prescalers(); + rcc_configure_pll(&wirish::priv::w_board_pll_cfg); + + // Enable the PLL, and wait until it's ready. + rcc_turn_on_clk(RCC_CLK_PLL); + while(!rcc_is_clk_ready(RCC_CLK_PLL)) + ; + + // Finally, switch to the now-ready PLL as the main clock source. + rcc_switch_sysclk(RCC_CLKSRC_PLL); +} + +/* + * These addresses are where usercode starts when a bootloader is + * present. If no bootloader is present, the user NVIC usually starts + * at the Flash base address, 0x08000000. + */ +#if defined(BOOTLOADER_maple) + #define USER_ADDR_ROM 0x08002000 +#else + #define USER_ADDR_ROM 0x08000000 +#endif +#define USER_ADDR_RAM 0x20000C00 +extern char __text_start__; + +static void setup_nvic(void) { + +nvic_init((uint32)VECT_TAB_ADDR, 0); + +/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater +#ifdef VECT_TAB_FLASH + nvic_init(USER_ADDR_ROM, 0); +#elif defined VECT_TAB_RAM + nvic_init(USER_ADDR_RAM, 0); +#elif defined VECT_TAB_BASE + nvic_init((uint32)0x08000000, 0); +#elif defined VECT_TAB_ADDR + // A numerically supplied value + nvic_init((uint32)VECT_TAB_ADDR, 0); +#else + // Use the __text_start__ value from the linker script; this + // should be the start of the vector table. + nvic_init((uint32)&__text_start__, 0); +#endif + +*/ +} + +static void adc_default_config(adc_dev *dev) { + adc_enable_single_swstart(dev); + adc_set_sample_rate(dev, wirish::priv::w_adc_smp); +} + +static void setup_adcs(void) { + adc_set_prescaler(wirish::priv::w_adc_pre); + adc_foreach(adc_default_config); +} + +static void timer_default_config(timer_dev *dev) { + timer_adv_reg_map *regs = (dev->regs).adv; + const uint16 full_overflow = 0xFFFF; + const uint16 half_duty = 0x8FFF; + + timer_init(dev); + timer_pause(dev); + + regs->CR1 = TIMER_CR1_ARPE; + regs->PSC = 1; + regs->SR = 0; + regs->DIER = 0; + regs->EGR = TIMER_EGR_UG; + switch (dev->type) { + case TIMER_ADVANCED: + regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF; + // fall-through + case TIMER_GENERAL: + timer_set_reload(dev, full_overflow); + for (uint8 channel = 1; channel <= 4; channel++) { + if (timer_has_cc_channel(dev, channel)) { + timer_set_compare(dev, channel, half_duty); + timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1, + TIMER_OC_PE); + } + } + // fall-through + case TIMER_BASIC: + break; + } + + timer_generate_update(dev); + timer_resume(dev); +} + +static void setup_timers(void) { + timer_foreach(timer_default_config); +} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp new file mode 100644 index 00000000..44418a52 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/boards_setup.cpp @@ -0,0 +1,106 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. +*****************************************************************************/ + +/** + * @file wirish/stm32f1/boards_setup.cpp + * @author Marti Bolivar + * @brief STM32F1 chip setup. + * + * This file controls how init() behaves on the STM32F1. Be very + * careful when changing anything here. Many of these values depend + * upon each other. + */ + +#include "boards_private.h" + +#include +#include + +#include +#include + +// Allow boards to provide a PLL multiplier. This is useful for +// e.g. STM32F100 value line MCUs, which use slower multipliers. +// (We're leaving the default to RCC_PLLMUL_9 for now, since that +// works for F103 performance line MCUs, which is all that LeafLabs +// currently officially supports). + +namespace wirish { + namespace priv { + + static stm32f1_rcc_pll_data pll_data = {RCC_PLLMUL_6}; +#if !USE_HSI_CLOCK + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; +#else + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; +#endif + __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; + __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; + + __weak void board_reset_pll(void) { + // TODO + } + + __weak void board_setup_clock_prescalers(void) { + rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1); + rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2); + rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1); + rcc_clk_disable(RCC_USB); + #if F_CPU == 72000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + #elif F_CPU == 48000000 + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); + #endif + } + + __weak void board_setup_gpio(void) { + gpio_init_all(); + } + + __weak void board_setup_usb(void) { +#ifdef SERIAL_USB + +#ifdef GENERIC_BOOTLOADER + //Reset the USB interface on generic boards - developed by Victor PV + gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); + gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); + + for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin + gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); +#endif + + Serial.begin();// Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility +#endif + } + + __weak void series_init(void) { + // Initialize AFIO here, too, so peripheral remaps and external + // interrupts work out of the box. + afio_init(); + } + + } +} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c new file mode 100644 index 00000000..655fefb8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/start_c.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2011 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/* + * This file is a modified version of a file obtained from + * CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the + * following text appeared: + * + * Copyright (c) 2006, 2007 CodeSourcery Inc + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern void __libc_init_array(void); + +extern int main(int, char**, char**); + +extern void exit(int) __attribute__((noreturn, weak)); + +/* The linker must ensure that these are at least 4-byte aligned. */ +extern char __data_start__, __data_end__; +extern char __bss_start__, __bss_end__; + +struct rom_img_cfg { + int *img_start; +}; + +extern char _lm_rom_img_cfgp; + +void __attribute__((noreturn)) start_c(void) { + struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp; + int *src = img_cfg->img_start; + int *dst = (int*)&__data_start__; + int exit_code; + + /* Initialize .data, if necessary. */ + if (src != dst) { + int *end = (int*)&__data_end__; + while (dst < end) { + *dst++ = *src++; + } + } + + /* Zero .bss. */ + dst = (int*)&__bss_start__; + while (dst < (int*)&__bss_end__) { + *dst++ = 0; + } + + /* Run initializers. */ + __libc_init_array(); + + /* Jump to main. */ + exit_code = main(0, 0, 0); + if (exit) { + exit(exit_code); + } + + /* If exit is NULL, make sure we don't return. */ + for (;;) + continue; +} diff --git a/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c new file mode 100644 index 00000000..d5f2d9fa --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MEEB_3DP/wirish/syscalls.c @@ -0,0 +1,176 @@ +/****************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * Copyright (c) 2011, 2012 LeafLabs, LLC. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + *****************************************************************************/ + +/** + * @file wirish/syscalls.c + * @brief newlib stubs + * + * Low level system routines used by newlib for basic I/O and memory + * allocation. You can override most of these. + */ + +#include + +#include +#include +#include + +/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then + * assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by + * the linker */ +#ifndef CONFIG_HEAP_START +extern char _lm_heap_start; +#define CONFIG_HEAP_START ((void *)&_lm_heap_start) +#endif +#ifndef CONFIG_HEAP_END +extern char _lm_heap_end; +#define CONFIG_HEAP_END ((void *)&_lm_heap_end) +#endif + +/* + * _sbrk -- Increment the program break. + * + * Get incr bytes more RAM (for use by the heap). malloc() and + * friends call this function behind the scenes. + */ +void *_sbrk(int incr) { + static void * pbreak = NULL; /* current program break */ + void * ret; + + if (pbreak == NULL) { + pbreak = CONFIG_HEAP_START; + } + + if ((CONFIG_HEAP_END - pbreak < incr) || + (pbreak - CONFIG_HEAP_START < -incr)) { + errno = ENOMEM; + return (void *)-1; + } + + ret = pbreak; + pbreak += incr; + return ret; +} + +__weak int _open(const char *path, int flags, ...) { + return 1; +} + +__weak int _close(int fd) { + return 0; +} + +__weak int _fstat(int fd, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +__weak int _isatty(int fd) { + return 1; +} + +__weak int isatty(int fd) { + return 1; +} + +__weak int _lseek(int fd, off_t pos, int whence) { + return -1; +} + +__weak unsigned char getch(void) { + return 0; +} + + +__weak int _read(int fd, char *buf, size_t cnt) { + *buf = getch(); + + return 1; +} + +__weak void putch(unsigned char c) { +} + +__weak void cgets(char *s, int bufsize) { + char *p; + int c; + int i; + + for (i = 0; i < bufsize; i++) { + *(s+i) = 0; + } +// memset(s, 0, bufsize); + + p = s; + + for (p = s; p < s + bufsize-1;) { + c = getch(); + switch (c) { + case '\r' : + case '\n' : + putch('\r'); + putch('\n'); + *p = '\n'; + return; + + case '\b' : + if (p > s) { + *p-- = 0; + putch('\b'); + putch(' '); + putch('\b'); + } + break; + + default : + putch(c); + *p++ = c; + break; + } + } + return; +} + +__weak int _write(int fd, const char *buf, size_t cnt) { + int i; + + for (i = 0; i < cnt; i++) + putch(buf[i]); + + return cnt; +} + +/* Override fgets() in newlib with a version that does line editing */ +__weak char *fgets(char *s, int bufsize, void *f) { + cgets(s, bufsize); + return s; +} + +__weak void _exit(int exitcode) { + while (1) + ; +} diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c new file mode 100644 index 00000000..5335361a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PeripheralPins.c @@ -0,0 +1,274 @@ + +/* + ******************************************************************************* + * 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 STM32F401V(D-E)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_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + // {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + // {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + // {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + // {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + // {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + // {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + // {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + // {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + // {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + // {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {NC, NP, 0} +}; +#endif + +//*** No DAC *** + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + // {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, + // {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, + {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)}, + // {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {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)}, + // {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)}, + {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, 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_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_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_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_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_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_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_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {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 + // {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_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 + {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, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_RX[] = { + // {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)}, + // {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + // {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + // {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {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)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {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)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {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, 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)}, + // {PD_6, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + // {PE_6, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_14, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {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)}, + // {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)}, + // {PE_5, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_13, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {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)}, + // {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)}, + // {PD_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + // {PE_2, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_12, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {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)}, + // {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)}, + // {PE_4, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + // {PE_11, SPI4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI4)}, + {NC, NP, 0} +}; +#endif + +//*** No CAN *** + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +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 + +//*** 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, GPIO_AF12_SDIO)}, // SDIO_D4 + // {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + // {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + // {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h new file mode 100644 index 00000000..6a1eb9b8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/PinNamesVar.h @@ -0,0 +1,33 @@ +/* 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, +#endif diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h new file mode 100644 index 00000000..0c778199 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/hal_conf_custom.h @@ -0,0 +1,496 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL 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 __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ + /** + * @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_CRC_MODULE_ENABLED +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +//#define HAL_DAC_MODULE_ENABLED +/* #define HAL_DCMI_MODULE_ENABLED */ +#define HAL_DMA_MODULE_ENABLED +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +#define HAL_FLASH_MODULE_ENABLED +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +#define HAL_PWR_MODULE_ENABLED +/* #define HAL_QSPI_MODULE_ENABLED */ +#define HAL_RCC_MODULE_ENABLED +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +/* #define HAL_UART_MODULE_ENABLED */ +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#ifndef HAL_PCD_MODULE_ENABLED + #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) +#endif +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ + +/* ########################## HSE/HSI 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). + */ +#ifndef HSE_VALUE +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#ifndef 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). + */ +#ifndef HSI_VALUE +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#ifndef LSI_VALUE +#define LSI_VALUE 32000U /*!< 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. + */ +#ifndef LSE_VALUE +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#ifndef LSE_STARTUP_TIMEOUT +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#ifndef EXTERNAL_CLOCK_VALUE +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* 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 +#if !defined (INSTRUCTION_CACHE_ENABLE) +#define INSTRUCTION_CACHE_ENABLE 1U +#endif +#if !defined (DATA_CACHE_ENABLE) +#define DATA_CACHE_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_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH 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_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC 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_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI 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_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS 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)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex 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 + */ +#ifndef USE_SPI_CRC +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_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 /* __STM32F4xx_HAL_CONF_CUSTOM_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld new file mode 100644 index 00000000..f20a047c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/ldscript.ld @@ -0,0 +1,187 @@ +/* +***************************************************************************** +** +** File : ldscript.ld +** +** Abstract : Linker script for STM32F401RETx Device with +** 512KByte FLASH, 96KByte 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) 2014 Ac6

+** +** 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 Ac6 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 = 0x20018000; /* 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 = 0x08000000, LENGTH = 512K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K +} + +/* 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); + *(.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); + *(.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 + + + /* 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/variants/STEVAL_F401VE/variant.cpp b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp new file mode 100644 index 00000000..4ecbff0e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.cpp @@ -0,0 +1,310 @@ +/* + ******************************************************************************* + * 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 + +#ifdef ARDUINO_STEVAL +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { + PA_9, // TX + PA_10, // RX + + // WIFI + PD_3, // CTS + PD_4, // RTS + PD_5, // TX + PD_6, // RX + PB_5, // WIFI_WAKEUP + PE_11, // WIFI_RESET + PE_12, // WIFI_BOOT + + // STATUS_LED + PE_1, //STATUS_LED + + // SPI USER + PB_12, // SPI_CS + PB_15, // SPI_MOSI + PB_14, // SPI_MISO + PB_13, // SPI_SCK + + // I2C USER + PB_7, // SDA + PB_6, // SCL + + // SPI + PA_4, // SPI_CS + PA_5, // SPI_SCK + PA_6, // SPI_MISO + PA_7, // SPI_MOSI + + // JTAG + PA_13, // JTAG_TMS/SWDIO + PA_14, // JTAG_TCK/SWCLK + PB_3, // JTAG_TDO/SWO + + // SDCARD + PC_8, // SDIO_D0 + PC_9, // SDIO_D1 + PA_15, // SD_CARD_DETECT + PC_10, // SDIO_D2 + PC_11, // SDIO_D3 + PC_12, // SDIO_CK + PD_2, // SDIO_CMD + + // OTG + PA_11, // OTG_DM + PA_12, // OTG_DP + + // IR/PROBE + PD_1, // IR_OUT + PC_1, // IR_ON + + // USER_PINS + PD_7, // USER3 + PB_9, // USER1 + PE_0, // USER2 + PB_4, // USER4 + + // USERKET + PE_7, // USER_BUTTON + + // ENDSTOPS + PD_8, // X_STOP + PD_9, // Y_STOP + PD_10, // Z_STOP + PD_11, // U_STOP + PA_8, // V_STOP + PD_0, // W_STOP + + // HEATERS + PD_13, // BED_HEAT_2 + PD_14, // BED_HEAT_1 + PD_15, // BED_HEAT_3 + PC_7, // E1_HEAT_PWM + PB_0, // E2_HEAT_PWM + PB_1, // E3_HEAT_PWM + + // THERMISTOR + PC_2, // BED_THERMISTOR_1 + PC_3, // BED_THERMISTOR_2 + PA_3, // BED_THERMISTOR_3 + PA_0, // E1_THERMISTOR + PA_1, // E2_THERMISTOR + PA_2, // E3_THERMISTOR + + // FANS + PC_4, // E1_FAN + PC_5, // E2_FAN + PE_8, // E3_FAN + + // X_MOTOR + PE_13, // X_RESET + PE_14, // X_PWM + PE_15, // X_DIR + + // Y_MOTOR + PE_10, // Y_RESET + PB_10, // Y_PWM + PE_9, // Y_DIR + + // Z_MOTOR + PC_15, // Z_RESET + PC_6, // Z_PWM + PC_0, // Z_DIR + + // E1_MOTOR + PC_14, // E1_RESET + PC_13, // E1_DIR + PD_12, // E1_PWM + + // E2_MOTOR + PE_4, // E2_RESET + PE_5, // E2_PWM + PE_6, // E2_DIR + + // E3_MOTOR + PE_3, // E3_RESET + PE_2, // E3_DIR + PB_8 // E3_PWM +}; +#endif + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief System Clock Configuration + * The system Clock is configured as follow : + * System Clock source = PLL (HSI) + * SYSCLK(Hz) = 84000000 + * HCLK(Hz) = 84000000 + * AHB Prescaler = 1 + * APB1 Prescaler = 2 + * APB2 Prescaler = 1 + * HSI Frequency(Hz) = 16000000 + * PLL_M = 16 + * PLL_N = 336 + * PLL_P = 4 + * PLL_Q = 7 + * VDD(V) = 3.3 + * Main regulator output voltage = Scale2 mode + * Flash Latency(WS) = 2 + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {}; + + /* Configure the main internal regulator output voltage */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + /* Initializes the CPU, AHB and APB busses clocks */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 15; + RCC_OscInitStruct.PLL.PLLN = 144; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 5; + 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_1) != HAL_OK) { + Error_Handler(); + } +} + +#ifdef __cplusplus +} +#endif + + +// PA_0 54 // E1_THERMISTOR +// PA_1 55 // E2_THERMISTOR +// PA_2 56 // E3_THERMISTOR +// PA_3 53 // BED_THERMISTOR_3 +// PA_4 16 // SPI_CS +// PA_5 17 // SPI_SCK +// PA_6 18 // SPI_MISO +// PA_7 19 // SPI_MOSI +// PA_8 43 // V_STOP +// PA_9 0 //TX +// PA_10 1 //RX +// PA_11 30 //OTG_DM +// PA_12 31 //OTG_DP +// PA_13 20 // JTAG_TMS/SWDIO +// PA_14 21 // JTAG_TCK/SWCLK +// PA_15 25 // SD_CARD_DETECT +// PB_0 49 // E2_HEAT_PWM +// PB_1 50 // E3_HEAT_PWM +// PB_3 22 // JTAG_TDO/SWO +// PB_4 37 // USER4 +// PB_5 6 // WIFI_WAKEUP +// PB_6 15 // SCL +// PB_7 14 // SDA +// PB_8 77 // E3_PWM +// PB_9 35 // USER1 +// PB_10 64 // Y_PWM +// PB_12 10 // SPI_CS +// PB_13 13 // SPI_SCK +// PB_14 12 // SPI_MISO +// PB_15 11 // SPI_MOSI +// PC_0 68 // Z_DIR +// PC_1 33 //IR_ON +// PC_2 51 // BED_THERMISTOR_1 +// PC_3 52 // BED_THERMISTOR_2 +// PC_4 57 // E1_FAN +// PC_5 58 // E2_FAN +// PC_6 67 // Z_PWM +// PC_7 48 // E1_HEAT_PWM +// PC_8 23 // SDIO_D0 +// PC_9 24 // SDIO_D1 +// PC_10 26 // SDIO_D2 +// PC_11 27 // SDIO_D3 +// PC_12 28 // SDIO_CK +// PC_13 70 // E1_DIR +// PC_14 69 // E1_RESET +// PC_15 66 // Z_RESET +// PD_0 44 // W_STOP +// PD_1 32 //IR_OUT +// PD_2 29 // SDIO_CMD +// PD_3 2 // CTS +// PD_4 3 // RTS +// PD_5 4 // TX +// PD_6 5 // RX +// PD_7 34 // USER3 +// PD_8 39 // X_STOP +// PD_9 40 // Y_STOP +// PD_10 41 // Z_STOP +// PD_11 42 // U_STOP +// PD_12 71 // E1_PWM +// PD_13 45 // BED_HEAT_2 +// PD_14 46 // BED_HEAT_1 +// PD_15 47 // BED_HEAT_3 +// PE_0 36 // USER2 +// PE_1 9 // STATUS_LED +// PE_2 76 // E3_DIR +// PE_3 75 // E3_RESET +// PE_4 72 // E2_RESET +// PE_5 73 // E2_PWM +// PE_6 74 // E2_DIR +// PE_7 38 // USER_BUTTON +// PE_8 59 // E3_FAN +// PE_9 65 // Y_DIR +// PE_10 63 // Y_RESET +// PE_11 7 // WIFI_RESET +// PE_12 8 // WIFI_BOOT +// PE_13 60 // X_RESET +// PE_14 61 // X_PWM +// PE_15 62 // X_DIR diff --git a/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h new file mode 100644 index 00000000..df7295ab --- /dev/null +++ b/buildroot/share/PlatformIO/variants/STEVAL_F401VE/variant.h @@ -0,0 +1,327 @@ +/* + ******************************************************************************* + * 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. + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +#ifdef ARDUINO_STEVAL + + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +// USART1_MAIN +#define PA9 0 //TX +#define PA10 1 //RX + +// WIFI (USART2) +#define PD3 2 // CTS +#define PD4 3 // RTS +#define PD5 4 // TX +#define PD6 5 // RX +#define PB5 6 // WIFI_WAKEUP +#define PE11 7 // WIFI_RESET +#define PE12 8 // WIFI_BOOT + +// STATUS_LED +#define PE1 9 // STATUS_LED + +// SPI USER +#define PB12 10 // SPI_CS +#define PB15 11 // SPI_MOSI +#define PB14 12 // SPI_MISO +#define PB13 13 // SPI_SCK + +// I2C USER +#define PB7 14 // SDA +#define PB6 15 // SCL + +// SPI +#define PA4 16 // SPI_CS +#define PA5 17 // SPI_SCK +#define PA6 18 // SPI_MISO +#define PA7 19 // SPI_MOSI + +// JTAG +#define PA13 20 // JTAG_TMS/SWDIO +#define PA14 21 // JTAG_TCK/SWCLK +#define PB3 22 // JTAG_TDO/SWO + +// SDCARD +#define PC8 23 // SDIO_D0 +#define PC9 24 // SDIO_D1 +#define PA15 25 // SD_CARD_DETECT +#define PC10 26 // SDIO_D2 +#define PC11 27 // SDIO_D3 +#define PC12 28 // SDIO_CK +#define PD2 29 // SDIO_CMD + +// OTG +#define PA11 30 //OTG_DM +#define PA12 31 //OTG_DP + +// IR/PROBE +#define PD1 32 //IR_OUT +#define PC1 33 //IR_ON + +// USER_PINS +#define PD7 34 // USER3 +#define PB9 35 // USER1 +#define PE0 36 // USER2 +#define PB4 37 // USER4 + +// USERKET +#define PE7 38 // USER_BUTTON + +// ENDSTOPS +#define PD8 39 // X_STOP +#define PD9 40 // Y_STOP +#define PD10 41 // Z_STOP +#define PD11 42 // U_STOP +#define PA8 43 // V_STOP +#define PD0 44 // W_STOP + +// HEATERS +#define PD13 45 // BED_HEAT_2 +#define PD14 46 // BED_HEAT_1 +#define PD15 47 // BED_HEAT_3 +#define PC7 48 // E1_HEAT_PWM +#define PB0 49 // E2_HEAT_PWM +#define PB1 50 // E3_HEAT_PWM + +// THERMISTOR +#define PC2 51 // BED_THERMISTOR_1 +#define PC3 52 // BED_THERMISTOR_2 +#define PA3 53 // BED_THERMISTOR_3 +#define PA0 54 // E1_THERMISTOR +#define PA1 55 // E2_THERMISTOR +#define PA2 56 // E3_THERMISTOR + +// FANS +#define PC4 57 // E1_FAN +#define PC5 58 // E2_FAN +#define PE8 59 // E3_FAN + +// X_MOTOR +#define PE13 60 // X_RESET +#define PE14 61 // X_PWM +#define PE15 62 // X_DIR + +// Y_MOTOR +#define PE10 63 // Y_RESET +#define PB10 64 // Y_PWM +#define PE9 65 // Y_DIR + +// Z_MOTOR +#define PC15 66 // Z_RESET +#define PC6 67 // Z_PWM +#define PC0 68 // Z_DIR + +// E1_MOTOR +#define PC14 69 // E1_RESET +#define PC13 70 // E1_DIR +#define PD12 71 // E1_PWM + +// E2_MOTOR +#define PE4 72 // E2_RESET +#define PE5 73 // E2_PWM +#define PE6 74 // E2_DIR + +// E3_MOTOR +#define PE3 75 // E3_RESET +#define PE2 76 // E3_DIR +#define PB8 77 // E3_PWM + +// This must be a literal +#define NUM_DIGITAL_PINS 78 +// This must be a literal with a value less than or equal to to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 6 +#define NUM_ANALOG_FIRST 51 + +// On-board LED pin number +#define LED_BUILTIN PE1 +#define LED_GREEN LED_BUILTIN + +// On-board user button +#define USER_BTN PE7 + +// UART Definitions +#define SERIAL_UART_INSTANCE 1 // Connected to ST-Link +//#define SERIAL_UART_INSTANCE 2 // Connected to WIFI + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#if SERIAL_UART_INSTANCE == 1 // ST-Link & J23 + #define PIN_SERIAL_RX PA10 + #define PIN_SERIAL_TX PA9 +#elif SERIAL_UART_INSTANCE == 2 // WIFI interface + #define PIN_SERIAL2_RX PD6 + #define PIN_SERIAL2_TX PD5 +#else + #error "Invalid setting for SERIAL_UART_INSTANCE." +#endif + +// Timer Definitions +#define TIMER_SERVO TIM4 // TIMER_SERVO must be defined in this file +#define TIMER_TONE TIM5 // TIMER_TONE must be defined in this file + +/* SD detect signal */ +/* + * By default, R67 is not provided, so SD card detect is not used. + * Note: SD CD (pin 16 of expansion connector J23) can be connected + * to GND in order to be able to use SD_DETECT_PIN + */ +/*#define SD_DETECT_PIN PA15*/ + +/* HAL configuration */ +#define HSE_VALUE 25000000U + +/* Extra HAL modules */ +#define HAL_SD_MODULE_ENABLED + +#endif + +#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_ + +// PA0 54 // E1_THERMISTOR +// PA1 55 // E2_THERMISTOR +// PA2 56 // E3_THERMISTOR +// PA3 53 // BED_THERMISTOR_3 +// PA4 16 // SPI_CS +// PA5 17 // SPI_SCK +// PA6 18 // SPI_MISO +// PA7 19 // SPI_MOSI +// PA8 43 // V_STOP +// PA9 0 //TX +// PA10 1 //RX +// PA11 30 //OTG_DM +// PA12 31 //OTG_DP +// PA13 20 // JTAG_TMS/SWDIO +// PA14 21 // JTAG_TCK/SWCLK +// PA15 25 // SD_CARD_DETECT +// PB0 49 // E2_HEAT_PWM +// PB1 50 // E3_HEAT_PWM +// PB3 22 // JTAG_TDO/SWO +// PB4 37 // USER4 +// PB5 6 // WIFI_WAKEUP +// PB6 15 // SCL +// PB7 14 // SDA +// PB8 77 // E3_PWM +// PB9 35 // USER1 +// PB10 64 // Y_PWM +// PB12 10 // SPI_CS +// PB13 13 // SPI_SCK +// PB14 12 // SPI_MISO +// PB15 11 // SPI_MOSI +// PC0 68 // Z_DIR +// PC1 33 //IR_ON +// PC2 51 // BED_THERMISTOR_1 +// PC3 52 // BED_THERMISTOR_2 +// PC4 57 // E1_FAN +// PC5 58 // E2_FAN +// PC6 67 // Z_PWM +// PC7 48 // E1_HEAT_PWM +// PC8 23 // SDIO_D0 +// PC9 24 // SDIO_D1 +// PC10 26 // SDIO_D2 +// PC11 27 // SDIO_D3 +// PC12 28 // SDIO_CK +// PC13 70 // E1_DIR +// PC14 69 // E1_RESET +// PC15 66 // Z_RESET +// PD0 44 // W_STOP +// PD1 32 //IR_OUT +// PD2 29 // SDIO_CMD +// PD3 2 // CTS +// PD4 3 // RTS +// PD5 4 // TX +// PD6 5 // RX +// PD7 34 // USER3 +// PD8 39 // X_STOP +// PD9 40 // Y_STOP +// PD10 41 // Z_STOP +// PD11 42 // U_STOP +// PD12 71 // E1_PWM +// PD13 45 // BED_HEAT_2 +// PD14 46 // BED_HEAT_1 +// PD15 47 // BED_HEAT_3 +// PE0 36 // USER2 +// PE1 9 // STATUS_LED +// PE2 76 // E3_DIR +// PE3 75 // E3_RESET +// PE4 72 // E2_RESET +// PE5 73 // E2_PWM +// PE6 74 // E2_DIR +// PE7 38 // USER_BUTTON +// PE8 59 // E3_FAN +// PE9 65 // Y_DIR +// PE10 63 // Y_RESET +// PE11 7 // WIFI_RESET +// PE12 8 // WIFI_BOOT +// PE13 60 // X_RESET +// PE14 61 // X_PWM +// PE15 62 // X_DIR diff --git a/buildroot/share/PlatformIO/variants/archim/.gitignore b/buildroot/share/PlatformIO/variants/archim/.gitignore new file mode 100644 index 00000000..2827c7d4 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/.gitignore @@ -0,0 +1,2 @@ +# Exception for libsam +!libsam_sam3x8e_gcc_rel.a diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile new file mode 100644 index 00000000..4332f360 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/Makefile @@ -0,0 +1,42 @@ +# +# Copyright (c) 2011 Arduino. 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 +# + +SUBMAKE_OPTIONS=--no-builtin-rules --no-builtin-variables --no-print-directory + +#------------------------------------------------------------------------------- +# Rules +#------------------------------------------------------------------------------- + +all: arduino_due_x + +.PHONY: arduino_due_x +arduino_due_x: + @echo ------------------------------------------------------------------------------------ + @echo --- Making variant arduino_due_x + @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk +# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk + @echo ------------------------------------------------------------------------------------ + +.PHONY: clean +clean: + @echo ------------------------------------------------------------------------------------ + @echo --- Cleaning variant arduino_due_x + @$(MAKE) DEBUG=1 $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ +# @$(MAKE) $(SUBMAKE_OPTIONS) -f libvariant_arduino_due_x.mk $@ + @echo ------------------------------------------------------------------------------------ + diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk new file mode 100644 index 00000000..a3cc2337 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/debug.mk @@ -0,0 +1,25 @@ +# +# Copyright (c) 2011 Arduino. 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 +# + +# Optimization level +# -O1 Optimize +# -O2 Optimize even more +# -O3 Optimize yet more +# -O0 Reduce compilation time and make debugging produce the expected results +# -Os Optimize for size +OPTIMIZATION = -g -O0 -DDEBUG diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk new file mode 100644 index 00000000..32f35d26 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/gcc.mk @@ -0,0 +1,82 @@ +# +# Copyright (c) 2011 Arduino. 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 +# + +# Tool suffix when cross-compiling +CROSS_COMPILE = $(ARM_GCC_TOOLCHAIN)/arm-none-eabi- + +# Compilation tools +AR = $(CROSS_COMPILE)ar +CC = $(CROSS_COMPILE)gcc +CXX = $(CROSS_COMPILE)g++ +AS = $(CROSS_COMPILE)as +NM = $(CROSS_COMPILE)nm +ifeq ($(OS),Windows_NT) +RM=cs-rm -Rf +else +RM=rm -Rf +endif + +SEP=\\ + +# --------------------------------------------------------------------------------------- +# C Flags + +CFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int +CFLAGS += -Werror-implicit-function-declaration -Wmain -Wparentheses +CFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused +CFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef +CFLAGS += -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings +CFLAGS += -Wsign-compare -Waggregate-return -Wstrict-prototypes +CFLAGS += -Wmissing-prototypes -Wmissing-declarations +CFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations +CFLAGS += -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long +CFLAGS += -Wunreachable-code +CFLAGS += -Wcast-align +#CFLAGS += -Wmissing-noreturn +#CFLAGS += -Wconversion + +CFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -nostdlib -std=c99 +CFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D$(VARIANT) + +# To reduce application size use only integer printf function. +CFLAGS += -Dprintf=iprintf + +# --------------------------------------------------------------------------------------- +# CPP Flags + +CPPFLAGS += -Wall -Wchar-subscripts -Wcomment -Wformat=2 +CPPFLAGS += -Wmain -Wparentheses -Wcast-align -Wunreachable-code +CPPFLAGS += -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused +CPPFLAGS += -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef +CPPFLAGS += -Wshadow -Wpointer-arith -Wwrite-strings +CPPFLAGS += -Wsign-compare -Waggregate-return -Wmissing-declarations +CPPFLAGS += -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations +CPPFLAGS += -Wpacked -Wredundant-decls -Winline -Wlong-long +#CPPFLAGS += -Wmissing-noreturn +#CPPFLAGS += -Wconversion + +CPPFLAGS += --param max-inline-insns-single=500 -mcpu=cortex-m3 -mthumb -mlong-calls -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions -std=c++98 +CPPFLAGS += $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) + +# To reduce application size use only integer printf function. +CPPFLAGS += -Dprintf=iprintf + +# --------------------------------------------------------------------------------------- +# ASM Flags + +ASFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g $(OPTIMIZATION) $(INCLUDES) diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk new file mode 100644 index 00000000..3f8b1b76 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/libvariant_arduino_due_x.mk @@ -0,0 +1,184 @@ +# +# Copyright (c) 2012 Arduino. 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 +# + +# Makefile for compiling libArduino +.SUFFIXES: .o .a .c .s + +CHIP=__SAM3X8E__ +VARIANT=arduino_due_x +LIBNAME=libvariant_$(VARIANT) +TOOLCHAIN=gcc + +#------------------------------------------------------------------------------- +# Path +#------------------------------------------------------------------------------- + +# Output directories +OUTPUT_BIN = ../../../cores/arduino + +# Libraries +PROJECT_BASE_PATH = .. +SYSTEM_PATH = ../../../system +CMSIS_ROOT_PATH = $(SYSTEM_PATH)/CMSIS +CMSIS_ARM_PATH=$(CMSIS_ROOT_PATH)/CMSIS/Include +CMSIS_ATMEL_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL +#CMSIS_CHIP_PATH=$(CMSIS_ROOT_PATH)/Device/ATMEL/$(CHIP_SERIE) + +ARDUINO_PATH = ../../../cores/arduino +VARIANT_BASE_PATH = ../../../variants +VARIANT_PATH = ../../../variants/$(VARIANT) + +#------------------------------------------------------------------------------- +# Files +#------------------------------------------------------------------------------- + +#vpath %.h $(PROJECT_BASE_PATH) $(SYSTEM_PATH) $(VARIANT_PATH) +vpath %.cpp $(PROJECT_BASE_PATH) + +VPATH+=$(PROJECT_BASE_PATH) + +INCLUDES = +#INCLUDES += -I$(PROJECT_BASE_PATH) +INCLUDES += -I$(ARDUINO_PATH) +INCLUDES += -I$(ARDUINO_PATH)/USB +INCLUDES += -I$(SYSTEM_PATH) +INCLUDES += -I$(SYSTEM_PATH)/libsam +INCLUDES += -I$(SYSTEM_PATH)/USBHost +INCLUDES += -I$(VARIANT_BASE_PATH) +INCLUDES += -I$(VARIANT_PATH) +INCLUDES += -I$(CMSIS_ARM_PATH) +INCLUDES += -I$(CMSIS_ATMEL_PATH) + +#------------------------------------------------------------------------------- +ifdef DEBUG +include debug.mk +else +include release.mk +endif + +#------------------------------------------------------------------------------- +# Tools +#------------------------------------------------------------------------------- + +include $(TOOLCHAIN).mk + +#------------------------------------------------------------------------------- +ifdef DEBUG +OUTPUT_OBJ=debug +OUTPUT_LIB_POSTFIX=dbg +else +OUTPUT_OBJ=release +OUTPUT_LIB_POSTFIX=rel +endif + +OUTPUT_LIB=$(LIBNAME)_$(TOOLCHAIN)_$(OUTPUT_LIB_POSTFIX).a +OUTPUT_PATH=$(OUTPUT_OBJ)_$(VARIANT) + +#------------------------------------------------------------------------------- +# C source files and objects +#------------------------------------------------------------------------------- +C_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.c) + +C_OBJ_TEMP = $(patsubst %.c, %.o, $(notdir $(C_SRC))) + +# during development, remove some files +C_OBJ_FILTER= + +C_OBJ=$(filter-out $(C_OBJ_FILTER), $(C_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# CPP source files and objects +#------------------------------------------------------------------------------- +CPP_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.cpp) + +CPP_OBJ_TEMP = $(patsubst %.cpp, %.o, $(notdir $(CPP_SRC))) + +# during development, remove some files +CPP_OBJ_FILTER= + +CPP_OBJ=$(filter-out $(CPP_OBJ_FILTER), $(CPP_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# Assembler source files and objects +#------------------------------------------------------------------------------- +A_SRC=$(wildcard $(PROJECT_BASE_PATH)/*.s) + +A_OBJ_TEMP=$(patsubst %.s, %.o, $(notdir $(A_SRC))) + +# during development, remove some files +A_OBJ_FILTER= + +A_OBJ=$(filter-out $(A_OBJ_FILTER), $(A_OBJ_TEMP)) + +#------------------------------------------------------------------------------- +# Rules +#------------------------------------------------------------------------------- +all: $(VARIANT) + +$(VARIANT): create_output $(OUTPUT_LIB) + +.PHONY: create_output +create_output: + @echo ------------------------------------------------------------------------------------ + @echo ------------------------- + @echo --- Preparing variant $(VARIANT) files in $(OUTPUT_PATH) $(OUTPUT_BIN) + @echo ------------------------- +# @echo *$(INCLUDES) +# @echo ------------------------- +# @echo *$(C_SRC) +# @echo ------------------------- +# @echo *$(C_OBJ) +# @echo ------------------------- +# @echo *$(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) +# @echo ------------------------- +# @echo *$(CPP_SRC) +# @echo ------------------------- +# @echo *$(CPP_OBJ) +# @echo ------------------------- +# @echo *$(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) +# @echo ------------------------- +# @echo *$(A_SRC) +# @echo ------------------------- + + -@mkdir $(OUTPUT_PATH) 1>NUL 2>&1 + @echo ------------------------------------------------------------------------------------ + +$(addprefix $(OUTPUT_PATH)/,$(C_OBJ)): $(OUTPUT_PATH)/%.o: %.c +# @"$(CC)" -v -c $(CFLAGS) $< -o $@ + @"$(CC)" -c $(CFLAGS) $< -o $@ + +$(addprefix $(OUTPUT_PATH)/,$(CPP_OBJ)): $(OUTPUT_PATH)/%.o: %.cpp +# @"$(CC)" -c $(CPPFLAGS) $< -o $@ + @"$(CC)" -xc++ -c $(CPPFLAGS) $< -o $@ + +$(addprefix $(OUTPUT_PATH)/,$(A_OBJ)): $(OUTPUT_PATH)/%.o: %.s + @"$(AS)" -c $(ASFLAGS) $< -o $@ + +$(OUTPUT_LIB): $(addprefix $(OUTPUT_PATH)/, $(C_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(CPP_OBJ)) $(addprefix $(OUTPUT_PATH)/, $(A_OBJ)) + @"$(AR)" -v -r "$(OUTPUT_BIN)/$@" $^ + @"$(NM)" "$(OUTPUT_BIN)/$@" > "$(OUTPUT_BIN)/$@.txt" + + +.PHONY: clean +clean: + @echo ------------------------------------------------------------------------------------ + @echo --- Cleaning $(VARIANT) files [$(OUTPUT_PATH)$(SEP)*.o] + -@$(RM) $(OUTPUT_PATH) 1>NUL 2>&1 + -@$(RM) $(OUTPUT_BIN)/$(OUTPUT_LIB) 1>NUL 2>&1 + @echo ------------------------------------------------------------------------------------ + diff --git a/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk new file mode 100644 index 00000000..2659255b --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/build_gcc/release.mk @@ -0,0 +1,25 @@ +# +# Copyright (c) 2011 Arduino. 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 +# + +# Optimization level +# -O1 Optimize +# -O2 Optimize even more +# -O3 Optimize yet more +# -O0 Reduce compilation time and make debugging produce the expected results +# -Os Optimize for size +OPTIMIZATION = -Os diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb new file mode 100644 index 00000000..4e8375b5 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_flash.gdb @@ -0,0 +1,37 @@ +#******************************************************* +# +# Connect to J-Link and debug application in flash on SAM3X. +# + +# Define 'reset' command +define reset + +# Connect to the J-Link gdb server +target remote localhost:2331 + +# Reset the chip to get to a known state +monitor reset + +# Select flash device +monitor flash device = AT91SAM3X8E + +# Enable flash download and flash breakpoints +monitor flash download = 1 + +# Load the program +load + +# Reset peripheral (RSTC_CR) +set *0x400e1a00 = 0xA5000004 + +# Initialize PC and stack pointer +mon reg sp=(0x80000) +#set *0x80004 = *0x80004 & 0xFFFFFFFE +mon reg pc=(0x80004) + +info reg + +break main + +# End of 'reset' command +end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb new file mode 100644 index 00000000..15a1792a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/gcc/arduino_due_x_sram.gdb @@ -0,0 +1,37 @@ +#******************************************************* +# +# Connect to J-Link and debug application in sram on SAM3X. +# + +# Define 'reset' command +define reset + +# Connect to the J-Link gdb server +target remote localhost:2331 + +# Reset the chip to get to a known state +monitor reset + +# Select flash device +monitor flash device = AT91SAM3X8E + +# Enable flash download and flash breakpoints +monitor flash download = 1 + +# Load the program +load + +# Reset peripheral (RSTC_CR) +set *0x400e1a00 = 0xA5000004 + +# Initialize PC and stack pointer +mon reg sp=(0x20000000) +#set *0x20000004 = *0x20000004 & 0xFFFFFFFE +mon reg pc=(0x20000004) + +info reg + +break main + +# End of 'reset' command +end diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac new file mode 100644 index 00000000..95958358 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_flash.mac @@ -0,0 +1,44 @@ +// --------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// --------------------------------------------------------- +// The software is delivered "AS IS" without warranty or +// condition of any kind, either express, implied or +// statutory. This includes without limitation any warranty +// or condition with respect to merchantability or fitness +// for any particular purpose, or against the infringements of +// intellectual property rights of others. +// --------------------------------------------------------- +// File: at91sam3u-ek-flash.mac +// User setup file for CSPY debugger. +// --------------------------------------------------------- +__var __mac_i; +__var __mac_pt; + +/********************************************************************* +* +* execUserReset() +*/ +execUserReset() +{ + __message "------------------------------ execUserReset ---------------------------------"; + __message "-------------------------------Set PC Reset ----------------------------------"; + + __hwReset(0); + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} + +/********************************************************************* +* +* execUserPreload() +*/ +execUserPreload() +{ + __message "------------------------------ execUserPreload ---------------------------------"; + + __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} diff --git a/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac new file mode 100644 index 00000000..d97a4ab6 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/debug_scripts/iar/arduino_due_sram.mac @@ -0,0 +1,44 @@ +// --------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// --------------------------------------------------------- +// The software is delivered "AS IS" without warranty or +// condition of any kind, either express, implied or +// statutory. This includes without limitation any warranty +// or condition with respect to merchantability or fitness +// for any particular purpose, or against the infringements of +// intellectual property rights of others. +// --------------------------------------------------------- +// File: at91sam3u-ek-sram.mac +// User setup file for CSPY debugger. +// --------------------------------------------------------- +__var __mac_i; +__var __mac_pt; + +/********************************************************************* +* +* execUserReset() +*/ +execUserReset() +{ + __message "------------------------------ execUserReset ---------------------------------"; + __message "-------------------------------Set PC Reset ----------------------------------"; + + //__hwReset(50); + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} + +/********************************************************************* +* +* execUserPreload() +*/ +execUserPreload() +{ + __message "------------------------------ execUserPreload ---------------------------------"; + + __hwReset(0); //* Hardware Reset: CPU is automatically halted after the reset + + // perpheral reset RSTC_CR + __writeMemory32(0xA5000004,0x400e1200,"Memory"); +} diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a new file mode 100644 index 00000000..3e25e6ca Binary files /dev/null and b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a differ diff --git a/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt new file mode 100644 index 00000000..9b614811 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/libsam_sam3x8e_gcc_rel.a.txt @@ -0,0 +1,576 @@ + +adc10_sam3u.o: + +adc12_sam3u.o: + +adc_sam3snxa.o: + +pio.o: +00000000 T PIO_Clear +00000000 T PIO_Configure +00000000 T PIO_DisableInterrupt +00000000 T PIO_Get +00000000 T PIO_GetOutputDataStatus +00000000 T PIO_PullUp +00000000 T PIO_Set +00000000 T PIO_SetDebounceFilter +00000000 T PIO_SetInput +00000000 T PIO_SetOutput +00000000 T PIO_SetPeripheral + +pmc.o: +00000000 T pmc_clr_fast_startup_input +00000000 T pmc_disable_all_pck +00000000 T pmc_disable_all_periph_clk +00000000 T pmc_disable_interrupt +00000000 T pmc_disable_pck +00000000 T pmc_disable_periph_clk +00000000 T pmc_disable_pllack +00000000 T pmc_disable_udpck +00000000 T pmc_disable_upll_clock +00000000 T pmc_enable_all_pck +00000000 T pmc_enable_all_periph_clk +00000000 T pmc_enable_backupmode +00000000 T pmc_enable_interrupt +00000000 T pmc_enable_pck +00000000 T pmc_enable_periph_clk +00000000 T pmc_enable_pllack +00000000 T pmc_enable_sleepmode +00000000 T pmc_enable_udpck +00000000 T pmc_enable_upll_clock +00000000 T pmc_enable_waitmode +00000000 T pmc_get_interrupt_mask +00000000 T pmc_get_status +00000000 T pmc_get_writeprotect_status +00000000 T pmc_is_locked_pllack +00000000 T pmc_is_locked_upll +00000000 T pmc_is_pck_enabled +00000000 T pmc_is_periph_clk_enabled +00000000 T pmc_mck_set_prescaler +00000000 T pmc_mck_set_source +00000000 T pmc_osc_disable_fastrc +00000000 T pmc_osc_disable_xtal +00000000 T pmc_osc_enable_fastrc +00000000 T pmc_osc_is_ready_32kxtal +00000000 T pmc_osc_is_ready_mainck +00000000 T pmc_pck_set_prescaler +00000000 T pmc_pck_set_source +00000000 T pmc_set_fast_startup_input +00000000 T pmc_set_writeprotect +00000000 T pmc_switch_mainck_to_fastrc +00000000 T pmc_switch_mainck_to_xtal +00000000 T pmc_switch_mck_to_mainck +00000000 T pmc_switch_mck_to_pllack +00000000 T pmc_switch_mck_to_sclk +00000000 T pmc_switch_mck_to_upllck +00000000 T pmc_switch_pck_to_mainck +00000000 T pmc_switch_pck_to_pllack +00000000 T pmc_switch_pck_to_sclk +00000000 T pmc_switch_pck_to_upllck +00000000 T pmc_switch_sclk_to_32kxtal +00000000 T pmc_switch_udpck_to_pllack +00000000 T pmc_switch_udpck_to_upllck + +pwmc.o: +00000000 t FindClockConfiguration +00000000 T PWMC_ConfigureChannel +00000000 T PWMC_ConfigureChannelExt +00000000 T PWMC_ConfigureClocks +00000000 T PWMC_ConfigureComparisonUnit +00000000 T PWMC_ConfigureEventLineMode +00000000 T PWMC_ConfigureSyncChannel +00000000 T PWMC_DisableChannel +00000000 T PWMC_DisableChannelIt +00000000 T PWMC_DisableIt +00000000 T PWMC_DisableOverrideOutput +00000000 T PWMC_EnableChannel +00000000 T PWMC_EnableChannelIt +00000000 T PWMC_EnableFaultProtection +00000000 T PWMC_EnableIt +00000000 T PWMC_EnableOverrideOutput +00000000 T PWMC_FaultClear +00000000 T PWMC_SetDeadTime +00000000 T PWMC_SetDutyCycle +00000000 T PWMC_SetFaultMode +00000000 T PWMC_SetFaultProtectionValue +00000000 T PWMC_SetOverrideValue +00000000 T PWMC_SetPeriod +00000000 T PWMC_SetSyncChannelUpdatePeriod +00000000 T PWMC_SetSyncChannelUpdateUnlock +00000000 T PWMC_WriteBuffer + U __assert_func +00000000 r __func__.6793 +00000000 r __func__.6804 +00000000 r __func__.6819 +00000000 r __func__.6830 +00000000 r __func__.6841 +00000000 r __func__.6848 +00000000 r __func__.6932 +00000000 r __func__.6938 + +rtc.o: +00000000 T RTC_ClearSCCR +00000000 T RTC_DisableIt +00000000 T RTC_EnableIt +00000000 T RTC_GetDate +00000000 T RTC_GetHourMode +00000000 T RTC_GetSR +00000000 T RTC_GetTime +00000000 T RTC_SetDate +00000000 T RTC_SetDateAlarm +00000000 T RTC_SetHourMode +00000000 T RTC_SetTime +00000000 T RTC_SetTimeAlarm + U __assert_func +00000000 r __func__.6790 +00000000 r __func__.6799 +00000000 r __func__.6804 + +rtt.o: +00000000 T RTT_EnableIT +00000000 T RTT_GetStatus +00000000 T RTT_GetTime +00000000 T RTT_SetAlarm +00000000 T RTT_SetPrescaler + U __assert_func +00000000 r __func__.6797 +00000000 r __func__.6805 + +spi.o: +00000000 T SPI_Configure +00000000 T SPI_ConfigureNPCS +00000000 T SPI_Disable +00000000 T SPI_DisableIt +00000000 T SPI_Enable +00000000 T SPI_EnableIt +00000000 T SPI_GetStatus +00000000 T SPI_IsFinished +00000000 T SPI_Read +00000000 T SPI_Write + U pmc_enable_periph_clk + +tc.o: +00000000 T TC_Configure +00000000 T TC_FindMckDivisor +00000000 T TC_GetStatus +00000000 T TC_ReadCV +00000000 T TC_SetRA +00000000 T TC_SetRB +00000000 T TC_SetRC +00000000 T TC_Start +00000000 T TC_Stop + U __assert_func +00000000 r __func__.6792 +00000000 r __func__.6798 +00000000 r __func__.6804 + +timetick.o: +00000000 T GetTickCount +00000000 T Sleep +00000000 T TimeTick_Configure +00000000 T TimeTick_Increment +00000000 T Wait +00000000 b _dwTickCount + +twi.o: +00000000 T TWI_ByteReceived +00000000 T TWI_ByteSent +00000000 T TWI_ConfigureMaster +00000000 T TWI_ConfigureSlave +00000000 T TWI_Disable +00000000 T TWI_DisableIt +00000000 T TWI_EnableIt +00000000 T TWI_GetMaskedStatus +00000000 T TWI_GetStatus +00000000 T TWI_ReadByte +00000000 T TWI_SendSTOPCondition +00000000 T TWI_SetClock +00000000 T TWI_StartRead +00000000 T TWI_StartWrite +00000000 T TWI_Stop +00000000 T TWI_TransferComplete +00000000 T TWI_WriteByte + U __assert_func +00000000 r __func__.7151 +00000000 r __func__.7157 +00000000 r __func__.7172 +00000000 r __func__.7176 +00000000 r __func__.7184 +00000000 r __func__.7191 +00000000 r __func__.7195 +00000000 r __func__.7200 +00000000 r __func__.7208 +00000000 r __func__.7222 +00000000 r __func__.7227 +00000000 r __func__.7231 +00000000 r __func__.7236 +00000000 r __func__.7240 + +usart.o: +00000000 T USART_Configure +00000000 T USART_DisableIt +00000000 T USART_EnableIt +00000000 T USART_GetChar +00000000 T USART_GetStatus +00000000 T USART_IsDataAvailable +00000000 T USART_IsRxReady +00000000 T USART_PutChar +00000000 T USART_Read +00000000 T USART_ReadBuffer +00000000 T USART_SetIrdaFilter +00000000 T USART_SetReceiverEnabled +00000000 T USART_SetTransmitterEnabled +00000000 T USART_Write +00000000 T USART_WriteBuffer + U __assert_func +00000000 r __func__.7068 + +wdt.o: +00000000 T WDT_Disable +00000000 T WDT_Enable +00000000 T WDT_GetPeriod +00000000 T WDT_GetStatus +00000000 T WDT_Restart + +system_sam3xa.o: +00000000 D SystemCoreClock +00000000 T SystemCoreClockUpdate +00000000 T SystemInit +00000000 T system_init_flash + +startup_sam3xa.o: + U ADC_Handler + U BusFault_Handler + U CAN0_Handler + U CAN1_Handler + U DACC_Handler + U DMAC_Handler + U DebugMon_Handler + U EFC0_Handler + U EFC1_Handler + U EMAC_Handler + U HSMCI_Handler + U HardFault_Handler + U MemManage_Handler + U NMI_Handler + U PIOA_Handler + U PIOB_Handler + U PIOC_Handler + U PIOD_Handler + U PMC_Handler + U PWM_Handler + U PendSV_Handler + U RSTC_Handler + U RTC_Handler + U RTT_Handler +00000000 T Reset_Handler + U SMC_Handler + U SPI0_Handler + U SSC_Handler + U SUPC_Handler + U SVC_Handler + U SysTick_Handler + U TC0_Handler + U TC1_Handler + U TC2_Handler + U TC3_Handler + U TC4_Handler + U TC5_Handler + U TC6_Handler + U TC7_Handler + U TC8_Handler + U TRNG_Handler + U TWI0_Handler + U TWI1_Handler + U UART_Handler + U UOTGHS_Handler + U USART0_Handler + U USART1_Handler + U USART2_Handler + U USART3_Handler + U UsageFault_Handler + U WDT_Handler + U _erelocate + U _estack + U _etext + U _ezero + U _sfixed + U _srelocate + U _szero +00000000 R exception_table + U main + +adc.o: +00000000 T adc_configure_power_save +00000000 T adc_configure_sequence +00000000 T adc_configure_timing +00000000 T adc_configure_trigger +00000000 T adc_disable_all_channel +00000000 T adc_disable_anch +00000000 T adc_disable_channel +00000000 T adc_disable_channel_differential_input +00000000 T adc_disable_channel_input_offset +00000000 T adc_disable_interrupt +00000000 T adc_disable_tag +00000000 T adc_disable_ts +00000000 T adc_enable_all_channel +00000000 T adc_enable_anch +00000000 T adc_enable_channel +00000000 T adc_enable_channel_differential_input +00000000 T adc_enable_channel_input_offset +00000000 T adc_enable_interrupt +00000000 T adc_enable_tag +00000000 T adc_enable_ts +00000000 T adc_get_actual_adc_clock +00000000 T adc_get_channel_status +00000000 T adc_get_channel_value +00000000 T adc_get_comparison_mode +00000000 T adc_get_interrupt_mask +00000000 T adc_get_latest_value +00000000 T adc_get_overrun_status +00000000 T adc_get_pdc_base +00000000 T adc_get_status +00000000 T adc_get_tag +00000000 T adc_get_writeprotect_status +00000000 T adc_init +00000000 T adc_set_bias_current +00000000 T adc_set_channel_input_gain +00000000 T adc_set_comparison_channel +00000000 T adc_set_comparison_mode +00000000 T adc_set_comparison_window +00000000 T adc_set_resolution +00000000 T adc_set_writeprotect +00000000 T adc_start +00000000 T adc_start_sequencer +00000000 T adc_stop +00000000 T adc_stop_sequencer + +udp.o: + +udphs.o: + +uotghs.o: +00000000 T UOTGHS_Handler +00000000 B gpf_isr + +interrupt_sam_nvic.o: +00000000 D g_interrupt_enabled + +uotghs_device.o: +00000000 T UDD_Attach +00000000 T UDD_ClearIN +00000000 T UDD_ClearOUT +00000000 T UDD_ClearSetupInt +00000000 T UDD_Detach +00000000 T UDD_FifoByteCount +00000000 T UDD_GetFrameNumber +00000000 T UDD_Init +00000000 T UDD_InitEP +00000000 T UDD_InitEndpoints +00000000 T UDD_ReadWriteAllowed +00000000 T UDD_ReceivedSetupInt +00000000 T UDD_Recv +00000000 T UDD_Recv8 +00000000 T UDD_ReleaseRX +00000000 T UDD_ReleaseTX +00000000 T UDD_Send +00000000 T UDD_Send8 +00000000 T UDD_SetAddress +00000000 T UDD_SetStack +00000000 T UDD_Stall +00000000 T UDD_WaitForINOrOUT +00000000 T UDD_WaitIN +00000000 T UDD_WaitOUT + U g_interrupt_enabled + U gpf_isr + U pmc_enable_periph_clk + U pmc_enable_udpck + U pmc_enable_upll_clock + U pmc_switch_udpck_to_upllck +00000000 b ul_recv_fifo_ptr +00000000 b ul_send_fifo_ptr + +uotghs_host.o: +00000000 T UHD_BusReset +00000000 T UHD_GetVBUSState +00000000 t UHD_ISR +00000000 T UHD_Init +00000000 T UHD_Pipe0_Alloc +00000000 T UHD_Pipe_Alloc +00000000 T UHD_Pipe_Free +00000000 T UHD_Pipe_Is_Transfer_Complete +00000000 T UHD_Pipe_Read +00000000 T UHD_Pipe_Send +00000000 T UHD_Pipe_Write +00000000 T UHD_SetStack + U g_interrupt_enabled + U gpf_isr + U pmc_enable_periph_clk + U pmc_enable_udpck + U pmc_enable_upll_clock + U pmc_switch_udpck_to_upllck +00000000 b uhd_state + +dacc.o: +00000000 T dacc_disable_channel +00000000 T dacc_disable_interrupt +00000000 T dacc_disable_trigger +00000000 T dacc_enable_channel +00000000 T dacc_enable_flexible_selection +00000000 T dacc_enable_interrupt +00000000 T dacc_get_analog_control +00000000 T dacc_get_channel_status +00000000 T dacc_get_interrupt_mask +00000000 T dacc_get_interrupt_status +00000000 T dacc_get_pdc_base +00000000 T dacc_get_writeprotect_status +00000000 T dacc_reset +00000000 T dacc_set_analog_control +00000000 T dacc_set_channel_selection +00000000 T dacc_set_power_save +00000000 T dacc_set_timing +00000000 T dacc_set_transfer_mode +00000000 T dacc_set_trigger +00000000 T dacc_set_writeprotect +00000000 T dacc_write_conversion_data + +can.o: +00000000 R can_bit_time +00000000 T can_disable +00000000 T can_disable_autobaud_listen_mode +00000000 T can_disable_interrupt +00000000 T can_disable_low_power_mode +00000000 T can_disable_overload_frame +00000000 T can_disable_time_triggered_mode +00000000 T can_disable_timer_freeze +00000000 T can_disable_tx_repeat +00000000 T can_enable +00000000 T can_enable_autobaud_listen_mode +00000000 T can_enable_interrupt +00000000 T can_enable_low_power_mode +00000000 T can_enable_overload_frame +00000000 T can_enable_time_triggered_mode +00000000 T can_enable_timer_freeze +00000000 T can_enable_tx_repeat +00000000 T can_get_internal_timer_value +00000000 T can_get_interrupt_mask +00000000 T can_get_rx_error_cnt +00000000 T can_get_status +00000000 T can_get_timestamp_value +00000000 T can_get_tx_error_cnt +00000000 T can_global_send_abort_cmd +00000000 T can_global_send_transfer_cmd +00000000 T can_init +00000000 T can_mailbox_get_status +00000000 T can_mailbox_init +00000000 T can_mailbox_read +00000000 T can_mailbox_send_abort_cmd +00000000 T can_mailbox_send_transfer_cmd +00000000 T can_mailbox_set_timemark +00000000 T can_mailbox_tx_remote_frame +00000000 T can_mailbox_write +00000000 T can_reset_all_mailbox +00000000 T can_reset_internal_timer +00000000 T can_reset_mailbox_data +00000000 T can_set_rx_sync_stage +00000000 T can_set_timestamp_capture_point + U memset + +efc.o: +00000000 T efc_disable_frdy_interrupt +00000000 T efc_enable_frdy_interrupt +00000000 T efc_get_flash_access_mode +00000000 T efc_get_result +00000000 T efc_get_status +00000000 T efc_get_wait_state +00000000 T efc_init +00000000 T efc_perform_command +0000006c T efc_perform_fcr +00000000 T efc_perform_read_sequence +00000000 T efc_set_flash_access_mode +00000000 T efc_set_wait_state +00000068 T efc_write_fmr +00000000 b iap_perform_command.7049 + +gpbr.o: +00000000 T gpbr_read +00000000 T gpbr_write + +ssc.o: + U memset +00000000 T ssc_disable_interrupt +00000000 T ssc_disable_rx +00000000 T ssc_disable_tx +00000000 T ssc_disable_tx_frame_sync_data +00000000 T ssc_enable_interrupt +00000000 T ssc_enable_rx +00000000 T ssc_enable_tx +00000000 T ssc_enable_tx_frame_sync_data +00000000 T ssc_get_interrupt_mask +00000000 T ssc_get_rx_access +00000000 T ssc_get_rx_compare +00000000 T ssc_get_status +00000000 T ssc_get_tx_access +00000000 T ssc_get_writeprotect_status +00000000 T ssc_i2s_set_receiver +00000000 T ssc_i2s_set_transmitter +00000000 T ssc_is_rx_enabled +00000000 T ssc_is_rx_ready +00000000 T ssc_is_tx_empty +00000000 T ssc_is_tx_enabled +00000000 T ssc_is_tx_ready +00000000 T ssc_read +00000000 T ssc_read_sync_data +00000000 T ssc_reset +00000000 T ssc_set_clock_divider +00000000 T ssc_set_loop_mode +00000000 T ssc_set_normal_mode +00000000 T ssc_set_receiver +00000000 T ssc_set_rx_compare +00000000 T ssc_set_rx_stop_selection +00000000 T ssc_set_td_default_level +00000000 T ssc_set_transmitter +00000000 T ssc_set_writeprotect +00000000 T ssc_write +00000000 T ssc_write_sync_data + +trng.o: +00000000 T trng_disable +00000000 T trng_disable_interrupt +00000000 T trng_enable +00000000 T trng_enable_interrupt +00000000 T trng_get_interrupt_mask +00000000 T trng_get_interrupt_status +00000000 T trng_read_output_data + +rstc.o: +00000000 T rstc_disable_user_reset +00000000 T rstc_disable_user_reset_interrupt +00000000 T rstc_enable_user_reset +00000000 T rstc_enable_user_reset_interrupt +00000000 T rstc_get_reset_cause +00000000 T rstc_get_status +00000000 T rstc_reset_extern +00000000 T rstc_set_external_reset +00000000 T rstc_start_software_reset + +emac.o: +00000000 t circ_inc +00000000 T emac_dev_get_tx_load +00000000 T emac_dev_init +00000000 T emac_dev_read +00000000 T emac_dev_reset +00000000 T emac_dev_set_rx_callback +00000000 T emac_dev_set_tx_wakeup_callback +00000000 T emac_dev_write +00000000 T emac_handler +00000000 T emac_phy_read +00000000 T emac_phy_write +00000000 t emac_reset_rx_mem +00000000 t emac_reset_tx_mem +00000000 b gs_rx_desc +00000000 b gs_tx_callback +00000000 b gs_tx_desc +00000000 b gs_uc_rx_buffer +00000000 b gs_uc_tx_buffer + U memcpy diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld new file mode 100644 index 00000000..53f2b5f1 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/flash.ld @@ -0,0 +1,146 @@ +/* ---------------------------------------------------------------------------- + * SAM Software Package License + * ---------------------------------------------------------------------------- + * Copyright (c) 2012, Atmel Corporation + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following condition is met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaimer below. + * + * Atmel's name may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * ---------------------------------------------------------------------------- + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + rom (rx) : ORIGIN = 0x00080000, LENGTH = 0x00080000 /* Flash, 512K */ + sram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram0, 64K */ + sram1 (rwx) : ORIGIN = 0x20080000, LENGTH = 0x00008000 /* sram1, 32K */ + ram (rwx) : ORIGIN = 0x20070000, LENGTH = 0x00018000 /* sram, 96K */ +} + +/* Section Definitions */ +SECTIONS +{ + .text : + { + . = ALIGN(4); + _sfixed = .; + KEEP(*(.vectors .vectors.*)) + *(.text .text.* .gnu.linkonce.t.*) + *(.glue_7t) *(.glue_7) + *(.rodata .rodata* .gnu.linkonce.r.*) + *(.ARM.extab* .gnu.linkonce.armextab.*) + + /* Support C constructors, and C destructors in both user code + and the C library. This also provides support for C++ code. */ + . = ALIGN(4); + KEEP(*(.init)) + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + + . = ALIGN(4); + _efixed = .; /* End of text section */ + } > rom + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > rom + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + /* .bss section which is used for uninitialized data */ + .bss ALIGN(4) (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + . = ALIGN(4); + _end = . ; + + /* .stack_dummy section doesn't contains any symbols. It is only + used for linker to calculate size of stack sections, and assign + values to stack symbols later */ + .stack_dummy : + { + *(.stack*) + } > ram + + /* Set stack top to end of ram, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(_sstack = __StackLimit); + PROVIDE(_estack = __StackTop); +} diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld new file mode 100644 index 00000000..2a0d54e1 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/gcc/sram.ld @@ -0,0 +1,145 @@ +/* ---------------------------------------------------------------------------- + * SAM Software Package License + * ---------------------------------------------------------------------------- + * Copyright (c) 2012, Atmel Corporation + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following condition is met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaimer below. + * + * Atmel's name may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + * ---------------------------------------------------------------------------- + */ + +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +SEARCH_DIR(.) + +/* Memory Spaces Definitions */ +MEMORY +{ + rom (rx) : ORIGIN = 0x00080000, LENGTH = 0x00080000 /* Flash, 512K */ + sram0 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 /* sram0, 64K */ + sram1 (rwx) : ORIGIN = 0x20080000, LENGTH = 0x00008000 /* sram1, 32K */ + ram (rwx) : ORIGIN = 0x20070000, LENGTH = 0x00018000 /* sram, 96K */ +} + +/* The stack size used by the application. NOTE: you need to adjust */ +STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : 0x2000 ; + +/* Section Definitions */ +SECTIONS +{ + .text : + { + . = ALIGN(4); + _sfixed = .; + KEEP(*(.vectors .vectors.*)) + *(.text .text.* .gnu.linkonce.t.*) + *(.glue_7t) *(.glue_7) + *(.rodata .rodata* .gnu.linkonce.r.*) + *(.ARM.extab* .gnu.linkonce.armextab.*) + + /* Support C constructors, and C destructors in both user code + and the C library. This also provides support for C++ code. */ + . = ALIGN(4); + KEEP(*(.init)) + . = ALIGN(4); + __preinit_array_start = .; + KEEP (*(.preinit_array)) + __preinit_array_end = .; + + . = ALIGN(4); + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; + + . = ALIGN(0x4); + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*crtend.o(.ctors)) + + . = ALIGN(4); + KEEP(*(.fini)) + + . = ALIGN(4); + __fini_array_start = .; + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + __fini_array_end = .; + + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*crtend.o(.dtors)) + + . = ALIGN(4); + _efixed = .; /* End of text section */ + } > ram + + . = ALIGN(4); + _etext = .; + + .relocate : AT (_etext) + { + . = ALIGN(4); + _srelocate = .; + *(.ramfunc .ramfunc.*); + *(.data .data.*); + . = ALIGN(4); + _erelocate = .; + } > ram + + /* .bss section which is used for uninitialized data */ + .bss (NOLOAD) : + { + . = ALIGN(4); + _sbss = . ; + _szero = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4); + _ebss = . ; + _ezero = .; + } > ram + + /* stack section */ + .stack (NOLOAD): + { + . = ALIGN(8); + _sstack = .; + . = . + STACK_SIZE; + . = ALIGN(8); + _estack = .; + } > ram + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + PROVIDE_HIDDEN (__exidx_start = .); + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > ram + PROVIDE_HIDDEN (__exidx_end = .); + + . = ALIGN(4); + _end = . ; +} + diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf new file mode 100644 index 00000000..956230fb --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/flash.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Vector table start*/ +define symbol __ICFEDIT_vector_start__ = 0x00080000; /*Add for CMSIS*/ +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; +define symbol __ICFEDIT_region_ROM0_start__ = 0x00080000; +define symbol __ICFEDIT_region_ROM0_end__ = 0x0009FFFF; +define symbol __ICFEDIT_region_ROM1_start__ = 0x00100000; +define symbol __ICFEDIT_region_ROM1_end__ = 0x0011FFFF; +/*-Sizes-*/ +/*define symbol __ICFEDIT_size_cstack__ = 0x1000;*//*for nandflash*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x200; +/*-Specials-*/ +/*define symbol __ICFEDIT_region_RAM_VECT_start__ = __ICFEDIT_region_RAM0_start__;*/ /*Referenced for CMSIS*/ +/*define symbol __ICFEDIT_size_vectors__ = 0x100;*/ /*Referenced for CMSIS*/ +/*-Exports-*/ +/*export symbol __ICFEDIT_region_RAM_VECT_start__;*/ +export symbol __ICFEDIT_vector_start__; /*Add for CMSIS*/ +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +/*define region RAM_VECT_region = mem:[from __ICFEDIT_region_RAM_VECT_start__ size __ICFEDIT_size_vectors__];*/ /*Referenced for CMSIS*/ +/*define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__];*/ /*Referenced for CMSIS*/ +define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | + mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ /*Referenced for CMSIS*/ +define region ROM0_region = mem:[from __ICFEDIT_region_ROM0_start__ to __ICFEDIT_region_ROM0_end__]; +define region ROM1_region = mem:[from __ICFEDIT_region_ROM1_start__ to __ICFEDIT_region_ROM1_end__]; + +/*define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { };*/ +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +/*place at start of ROM0_region { readonly section .vectors };*/ /*Referenced for CMSIS*/ +place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; /*Add for CMSIS*/ +place in ROM0_region { readonly }; +place in RAM0_region { readwrite, block HEAP }; +place in RAM1_region { block CSTACK }; /* for nandflash*/ +/*place in RAM_VECT_region { block RamVect };*/ /*Referenced for CMSIS*/ \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf new file mode 100644 index 00000000..d7d33537 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/linker_scripts/iar/sram.icf @@ -0,0 +1,33 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Vector table start*/ +define symbol __ICFEDIT_vector_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_RAM0_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM0_end__ = 0x20007FFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20080000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20083FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x900; +define symbol __ICFEDIT_size_heap__ = 0x200; +/*-Exports-*/ +export symbol __ICFEDIT_vector_start__; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region RAM0_region = mem:[from __ICFEDIT_region_RAM0_start__ to __ICFEDIT_region_RAM0_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +/*define region RAM_region = mem:[from __ICFEDIT_region_RAM0_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM0_end__] | + mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];*/ + +/* define block RamVect with alignment = 8, size = __ICFEDIT_size_vectors__ { }; */ +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_vector_start__ { readonly section .intvec }; +place in RAM0_region { readonly }; +place in RAM1_region { readwrite, block CSTACK, block HEAP }; diff --git a/buildroot/share/PlatformIO/variants/archim/pins_arduino.h b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h new file mode 100644 index 00000000..4e279aa7 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/pins_arduino.h @@ -0,0 +1,21 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +// API compatibility +#include "variant.h" + diff --git a/buildroot/share/PlatformIO/variants/archim/variant.cpp b/buildroot/share/PlatformIO/variants/archim/variant.cpp new file mode 100644 index 00000000..72ad45ef --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/variant.cpp @@ -0,0 +1,485 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +#include "variant.h" + +/* + * DUE Board pin | PORT | Label + * ----------------+--------+------- + * 0 | PA8 | "RX0" + * 1 | PA9 | "TX0" + * 2 TIOA0 | PB25 | + * 3 TIOA7 | PC28 | + * 4 NPCS1 | PA29 | + * TIOB6 | PC26 | + * 5 TIOA6 | PC25 | + * 6 PWML7 | PC24 | + * 7 PWML6 | PC23 | + * 8 PWML5 | PC22 | + * 9 PWML4 | PC21 | + * 10 NPCS0 | PA28 | + * TIOB7 | PC29 | + * 11 TIOA8 | PD7 | + * 12 TIOB8 | PD8 | + * 13 TIOB0 | PB27 | LED AMBER "L" + * 14 TXD3 | PD4 | "TX3" + * 15 RXD3 | PD5 | "RX3" + * 16 TXD1 | PA13 | "TX2" + * 17 RXD1 | PA12 | "RX2" + * 18 TXD0 | PA11 | "TX1" + * 19 RXD0 | PA10 | "RX1" + * 20 | PB12 | "SDA" + * 21 | PB13 | "SCL" + * 22 | PB26 | + * 23 | PA14 | + * 24 | PA15 | + * 25 | PD0 | + * 26 | PD1 | + * 27 | PD2 | + * 28 | PD3 | + * 29 | PD6 | + * 30 | PD9 | + * 31 | PA7 | + * 32 | PD10 | + * 33 | PC1 | + * 34 | PC2 | + * 35 | PC3 | + * 36 | PC4 | + * 37 | PC5 | + * 38 | PC6 | + * 39 | PC7 | + * 40 | PC8 | + * 41 | PC9 | + * 42 | PA19 | + * 43 | PA20 | + * 44 | PC19 | + * 45 | PC18 | + * 46 | PC17 | + * 47 | PC16 | + * 48 | PC15 | + * 49 | PC14 | + * 50 | PC13 | + * 51 | PC12 | + * 52 NPCS2 | PB21 | + * 53 | PB14 | + * 54 | PA16 | "A0" + * 55 | PA24 | "A1" + * 56 | PA23 | "A2" + * 57 | PA22 | "A3" + * 58 TIOB2 | PA6 | "A4" + * 69 | PA4 | "A5" + * 60 TIOB1 | PA3 | "A6" + * 61 TIOA1 | PA2 | "A7" + * 62 | PB17 | "A8" + * 63 | PB18 | "A9" + * 64 | PB19 | "A10" + * 65 | PB20 | "A11" + * 66 | PB15 | "DAC0" + * 67 | PB16 | "DAC1" + * 68 | PA1 | "CANRX" + * 69 | PA0 | "CANTX" + * 70 | PA17 | "SDA1" + * 71 | PA18 | "SCL1" + * 72 | PC30 | LED AMBER "RX" + * 73 | PA21 | LED AMBER "TX" + * 74 MISO | PA25 | + * 75 MOSI | PA26 | + * 76 SCLK | PA27 | + * 77 NPCS0 | PA28 | + * 78 NPCS3 | PB23 | unconnected! + * + * USB pin | PORT + * ----------------+-------- + * ID | PB11 + * VBOF | PB10 + * + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pins descriptions + */ +extern const PinDescription g_APinDescription[]= +{ + // 0 .. 53 - Digital pins + // ---------------------- + // 0/1 - UART (Serial) + { PIOA, PIO_PA8A_URXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // URXD + { PIOA, PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // UTXD + + // 2 + { PIOB, PIO_PB25B_TIOA0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHA0 }, // TIOA0 + { PIOC, PIO_PC28B_TIOA7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA7 }, // TIOA7 + { PIOC, PIO_PC26B_TIOB6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB6 }, // TIOB6 + + // 5 + { PIOC, PIO_PC25B_TIOA6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA6 }, // TIOA6 + { PIOC, PIO_PC24B_PWML7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH7, NOT_ON_TIMER }, // PWML7 + { PIOC, PIO_PC23B_PWML6, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH6, NOT_ON_TIMER }, // PWML6 + { PIOC, PIO_PC22B_PWML5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWML5 + { PIOC, PIO_PC21B_PWML4, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH4, NOT_ON_TIMER }, // PWML4 + // 10 + { PIOC, PIO_PC29B_TIOB7, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB7 }, // TIOB7 + { PIOD, PIO_PD7B_TIOA8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHA8 }, // TIOA8 + { PIOD, PIO_PD8B_TIOB8, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC2_CHB8 }, // TIOB8 + + // 13 - AMBER LED + { PIOB, PIO_PB27B_TIOB0, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_TIMER), NO_ADC, NO_ADC, NOT_ON_PWM, TC0_CHB0 }, // TIOB0 + + // 14/15 - USART3 (Serial3) + { PIOD, PIO_PD4B_TXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD3 + { PIOD, PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD3 + + // 16/17 - USART1 (Serial2) + { PIOA, PIO_PA13A_TXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD1 + { PIOA, PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD1 + + // 18/19 - USART0 (Serial1) + { PIOA, PIO_PA11A_TXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TXD0 + { PIOA, PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // RXD0 + + // 20/21 - TWI1 + { PIOB, PIO_PB12A_TWD1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD1 - SDA0 + { PIOB, PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK1 - SCL0 + + // 22 + { PIOB, PIO_PB26, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 22 + { PIOA, PIO_PA14, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 23 + { PIOA, PIO_PA15, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 24 + { PIOD, PIO_PD0, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 25 + + // 26 + { PIOD, PIO_PD1, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 26 + { PIOD, PIO_PD2, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 27 + { PIOD, PIO_PD3, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 28 + { PIOD, PIO_PD6, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 29 + + // 30 + { PIOD, PIO_PD9, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 30 + { PIOA, PIO_PA7, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 31 + { PIOD, PIO_PD10, ID_PIOD, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 32 + { PIOC, PIO_PC1, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 33 + + // 34 + { PIOC, PIO_PC2, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 34 + { PIOC, PIO_PC3, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 35 +//{ PIOC, PIO_PC3B_PWMH0, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH0, NOT_ON_TIMER }, // PWMH0 PIN 35 + { PIOC, PIO_PC4, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 36 + { PIOC, PIO_PC5, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 37 +//{ PIOC, PIO_PC5B_PWMH1, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH1, NOT_ON_TIMER }, // PWMH1 PIN 37 + + // 38 + { PIOC, PIO_PC6, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 38 + { PIOC, PIO_PC7, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 39 +//{ PIOC, PIO_PC7B_PWMH2, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH2, NOT_ON_TIMER }, // PWMH2 PIN 39 + { PIOC, PIO_PC8, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 40 +//{ PIOC, PIO_PC8B_PWML3, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH3, NOT_ON_TIMER }, // PWML3 PIN 40 + { PIOC, PIO_PC9, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 41 + + // 42 + { PIOA, PIO_PA19, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 42 + { PIOA, PIO_PA20, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 43 + { PIOC, PIO_PC19, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 44 +//{ PIOC, PIO_PC19B_PWMH5, ID_PIOC, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), NO_ADC, NO_ADC, PWM_CH5, NOT_ON_TIMER }, // PWMH5 PIN 44 + { PIOC, PIO_PC18, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 45 + + // 46 + { PIOC, PIO_PC17, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 46 + { PIOC, PIO_PC16, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 47 + { PIOC, PIO_PC15, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 48 + { PIOC, PIO_PC14, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 49 + + // 50 + { PIOC, PIO_PC13, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 50 + { PIOC, PIO_PC12, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 51 + { PIOB, PIO_PB21, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 52 + { PIOB, PIO_PB14, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // PIN 53 + + + // 54 .. 65 - Analog pins + // ---------------------- + { PIOA, PIO_PA16X1_AD7, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC0, ADC7, NOT_ON_PWM, NOT_ON_TIMER }, // AD0 + { PIOA, PIO_PA24X1_AD6, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC1, ADC6, NOT_ON_PWM, NOT_ON_TIMER }, // AD1 + { PIOA, PIO_PA23X1_AD5, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC2, ADC5, NOT_ON_PWM, NOT_ON_TIMER }, // AD2 + { PIOA, PIO_PA22X1_AD4, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC3, ADC4, NOT_ON_PWM, NOT_ON_TIMER }, // AD3 + // 58 +//{ PIOA, PIO_PA6X1_AD3, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // AD4 + { PIOA, PIO_PA6A_TIOB2, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_TIMER|PIN_ATTR_DIGITAL), ADC4, ADC3, NOT_ON_PWM, TC0_CHB2 }, // TIOB2 + { PIOA, PIO_PA4X1_AD2, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC5, ADC2, NOT_ON_PWM, NOT_ON_TIMER }, // AD5 + { PIOA, PIO_PA3X1_AD1, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC6, ADC1, NOT_ON_PWM, TC0_CHB1 }, // AD6 + { PIOA, PIO_PA2X1_AD0, ID_PIOA, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC7, ADC0, NOT_ON_PWM, TC0_CHA1 }, // AD7 + // 62 + { PIOB, PIO_PB17X1_AD10, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC8, ADC10, NOT_ON_PWM, NOT_ON_TIMER }, // AD8 + { PIOB, PIO_PB18X1_AD11, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC9, ADC11, NOT_ON_PWM, NOT_ON_TIMER }, // AD9 + { PIOB, PIO_PB19X1_AD12, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC10, ADC12, NOT_ON_PWM, NOT_ON_TIMER }, // AD10 + { PIOB, PIO_PB20X1_AD13, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC11, ADC13, NOT_ON_PWM, NOT_ON_TIMER }, // AD11 + + // 66/67 - DAC0/DAC1 + { PIOB, PIO_PB15X1_DAC0, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC12, DA0, NOT_ON_PWM, NOT_ON_TIMER }, // DAC0 + { PIOB, PIO_PB16X1_DAC1, ID_PIOB, PIO_INPUT, PIO_DEFAULT, PIN_ATTR_ANALOG, ADC13, DA1, NOT_ON_PWM, NOT_ON_TIMER }, // DAC1 + + // 68/69 - CANRX0/CANTX0 + { PIOA, PIO_PA1A_CANRX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC14, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX + { PIOA, PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, ADC15, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX + + // 70/71 - TWI0 + { PIOA, PIO_PA17A_TWD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWD0 - SDA1 + { PIOA, PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // TWCK0 - SCL1 + + // 72/73 - LEDs + { PIOC, PIO_PC30, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER RXL + { PIOA, PIO_PA21, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // LED AMBER TXL + + // 74/75/76 - SPI + { PIOA, PIO_PA25A_SPI0_MISO,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MISO + { PIOA, PIO_PA26A_SPI0_MOSI,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // MOSI + { PIOA, PIO_PA27A_SPI0_SPCK,ID_PIOA,PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // SPCK + + // 77 - SPI CS0 + { PIOA, PIO_PA28A_SPI0_NPCS0,ID_PIOA,PIO_PERIPH_A,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS0 + + // 78 - SPI CS3 (unconnected) + { PIOB, PIO_PB23B_SPI0_NPCS3,ID_PIOB,PIO_PERIPH_B,PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS3 + + // 79 .. 84 - "All pins" masks + + // 79 - TWI0 all pins + { PIOA, PIO_PA17A_TWD0|PIO_PA18A_TWCK0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 80 - TWI1 all pins + { PIOB, PIO_PB12A_TWD1|PIO_PB13A_TWCK1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 81 - UART (Serial) all pins + { PIOA, PIO_PA8A_URXD|PIO_PA9A_UTXD, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 82 - USART0 (Serial1) all pins + { PIOA, PIO_PA11A_TXD0|PIO_PA10A_RXD0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 83 - USART1 (Serial2) all pins + { PIOA, PIO_PA13A_TXD1|PIO_PA12A_RXD1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 84 - USART3 (Serial3) all pins + { PIOD, PIO_PD4B_TXD3|PIO_PD5B_RXD3, ID_PIOD, PIO_PERIPH_B, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 85 - USB +//{ PIOB, PIO_PB11A_UOTGID|PIO_PB10A_UOTGVBOF, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + // 85 - PB11 only + { PIOB, PIO_PB11A_UOTGID, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL,NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // ID - VBOF + + // 86 - SPI CS2 + { PIOB, PIO_PB21B_SPI0_NPCS2, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS2 + + // 87 - SPI CS1 + { PIOA, PIO_PA29A_SPI0_NPCS1, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // NPCS1 + + // 88/89 - CANRX1/CANTX1 (same physical pin for 66/53) + { PIOB, PIO_PB15A_CANRX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANRX1 + { PIOB, PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // CANTX1 + + // 90 .. 91 - "All CAN pins" masks + // 90 - CAN0 all pins + { PIOA, PIO_PA1A_CANRX0|PIO_PA0A_CANTX0, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + // 91 - CAN1 all pins + { PIOB, PIO_PB15A_CANRX1|PIO_PB14A_CANTX1, ID_PIOB, PIO_PERIPH_A, PIO_DEFAULT, (PIN_ATTR_DIGITAL|PIN_ATTR_COMBO), NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, + + // 92 - Extra AMBIT Pins + { PIOC, PIO_PC11, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 92 + { PIOB, PIO_PB2, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 93 + { PIOB, PIO_PB1, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 94 + { PIOB, PIO_PB0, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 95 + { PIOC, PIO_PC10, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 96 + { PIOB, PIO_PB24, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 97 + { PIOB, PIO_PB7, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 98 + { PIOB, PIO_PB6, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 99 + { PIOB, PIO_PB8, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 100 + { PIOB, PIO_PB5, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 101 + { PIOB, PIO_PB4, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 102 + { PIOB, PIO_PB3, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 103 + { PIOC, PIO_PC20, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 104 + { PIOB, PIO_PB22, ID_PIOB, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 105 + { PIOC, PIO_PC27, ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 106 + { PIOB, PIO_PB10B_A18, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 107 + { PIOB, PIO_PB9, ID_PIOB, PIO_PERIPH_B, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 108 + { PIOA, PIO_PA5, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }, // DIO PIN 109 + + // END + { NULL, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER } +} ; + + +uint8_t g_pinStatus[PINS_COUNT] = {0}; + +#ifdef __cplusplus +} +#endif + +/* + * UART objects + */ +RingBuffer rx_buffer1; +RingBuffer tx_buffer1; + +UARTClass Serial(UART, UART_IRQn, ID_UART, &rx_buffer1, &tx_buffer1); +void serialEvent() __attribute__((weak)); +void serialEvent() { } + +// IT handlers +void UART_Handler(void) +{ + Serial.IrqHandler(); +} + +// ---------------------------------------------------------------------------- +/* + * USART objects + */ +RingBuffer rx_buffer2; +RingBuffer rx_buffer3; +RingBuffer rx_buffer4; +RingBuffer tx_buffer2; +RingBuffer tx_buffer3; +RingBuffer tx_buffer4; + +USARTClass Serial1(USART0, USART0_IRQn, ID_USART0, &rx_buffer2, &tx_buffer2); +void serialEvent1() __attribute__((weak)); +void serialEvent1() { } +USARTClass Serial2(USART1, USART1_IRQn, ID_USART1, &rx_buffer3, &tx_buffer3); +void serialEvent2() __attribute__((weak)); +void serialEvent2() { } +USARTClass Serial3(USART3, USART3_IRQn, ID_USART3, &rx_buffer4, &tx_buffer4); +void serialEvent3() __attribute__((weak)); +void serialEvent3() { } + +// IT handlers +void USART0_Handler(void) +{ + Serial1.IrqHandler(); +} + +void USART1_Handler(void) +{ + Serial2.IrqHandler(); +} + +void USART3_Handler(void) +{ + Serial3.IrqHandler(); +} + +// ---------------------------------------------------------------------------- + +void serialEventRun(void) +{ + if (Serial.available()) serialEvent(); + if (Serial1.available()) serialEvent1(); + if (Serial2.available()) serialEvent2(); + if (Serial3.available()) serialEvent3(); +} + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +void __libc_init_array(void); + +void init( void ) +{ + SystemInit(); + + // Set Systick to 1ms interval, common to all SAM3 variants + if (SysTick_Config(SystemCoreClock / 1000)) + { + // Capture error + while (true); + } + + // Initialize C library + __libc_init_array(); + + // Disable pull-up on every pin + for (unsigned i = 0; i < PINS_COUNT; i++) + digitalWrite(i, LOW); + + // Enable parallel access on PIO output data registers + PIOA->PIO_OWER = 0xFFFFFFFF; + PIOB->PIO_OWER = 0xFFFFFFFF; + PIOC->PIO_OWER = 0xFFFFFFFF; + PIOD->PIO_OWER = 0xFFFFFFFF; + + // Set USB Full Speed for Archim + udd_low_speed_disable(); + udd_high_speed_disable(); + + // Initialize Serial port U(S)ART pins + PIO_Configure( + g_APinDescription[PINS_UART].pPort, + g_APinDescription[PINS_UART].ulPinType, + g_APinDescription[PINS_UART].ulPin, + g_APinDescription[PINS_UART].ulPinConfiguration); + digitalWrite(0, HIGH); // Enable pullup for RX0 + PIO_Configure( + g_APinDescription[PINS_USART0].pPort, + g_APinDescription[PINS_USART0].ulPinType, + g_APinDescription[PINS_USART0].ulPin, + g_APinDescription[PINS_USART0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART1].pPort, + g_APinDescription[PINS_USART1].ulPinType, + g_APinDescription[PINS_USART1].ulPin, + g_APinDescription[PINS_USART1].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_USART3].pPort, + g_APinDescription[PINS_USART3].ulPinType, + g_APinDescription[PINS_USART3].ulPin, + g_APinDescription[PINS_USART3].ulPinConfiguration); + + // Initialize USB pins + PIO_Configure( + g_APinDescription[PINS_USB].pPort, + g_APinDescription[PINS_USB].ulPinType, + g_APinDescription[PINS_USB].ulPin, + g_APinDescription[PINS_USB].ulPinConfiguration); + + // Initialize CAN pins + PIO_Configure( + g_APinDescription[PINS_CAN0].pPort, + g_APinDescription[PINS_CAN0].ulPinType, + g_APinDescription[PINS_CAN0].ulPin, + g_APinDescription[PINS_CAN0].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PINS_CAN1].pPort, + g_APinDescription[PINS_CAN1].ulPinType, + g_APinDescription[PINS_CAN1].ulPin, + g_APinDescription[PINS_CAN1].ulPinConfiguration); + + // Initialize Analog Controller + pmc_enable_periph_clk(ID_ADC); + adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); + adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); + adc_configure_trigger(ADC, ADC_TRIG_SW, 0); // Disable hardware trigger. + adc_disable_interrupt(ADC, 0xFFFFFFFF); // Disable all ADC interrupts. + adc_disable_all_channel(ADC); + + // Initialize analogOutput module + analogOutputInit(); +} + +#ifdef __cplusplus +} +#endif + diff --git a/buildroot/share/PlatformIO/variants/archim/variant.h b/buildroot/share/PlatformIO/variants/archim/variant.h new file mode 100644 index 00000000..179a1373 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/archim/variant.h @@ -0,0 +1,284 @@ +/* + Copyright (c) 2011 Arduino. 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 +*/ + +#ifndef _VARIANT_ARDUINO_DUE_X_ +#define _VARIANT_ARDUINO_DUE_X_ + +/*---------------------------------------------------------------------------- + * Definitions + *----------------------------------------------------------------------------*/ + +/** Frequency of the board main oscillator */ +#define VARIANT_MAINOSC 12000000 + +/** Master clock frequency */ +#define VARIANT_MCK 84000000 + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "Arduino.h" +#ifdef __cplusplus +#include "UARTClass.h" +#include "USARTClass.h" +#endif + +#ifdef __cplusplus +extern "C"{ +#endif // __cplusplus + +/** + * Libc porting layers + */ +#if defined ( __GNUC__ ) /* GCC CS3 */ +# include /** RedHat Newlib minimal stub */ +#endif + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +// Number of pins defined in PinDescription array +#define PINS_COUNT (79U) +#define NUM_DIGITAL_PINS (66U) +#define NUM_ANALOG_INPUTS (12U) +#define analogInputToDigitalPin(p) ((p < 12U) ? (p) + 54U : -1) + +#define digitalPinToPort(P) ( g_APinDescription[P].pPort ) +#define digitalPinToBitMask(P) ( g_APinDescription[P].ulPin ) +//#define analogInPinToBit(P) ( ) +#define portOutputRegister(port) ( &(port->PIO_ODSR) ) +#define portInputRegister(port) ( &(port->PIO_PDSR) ) +#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER ) + +/* + * portModeRegister(..) should return a register to set pin mode + * INPUT or OUTPUT by setting the corresponding bit to 0 or 1. + * Unfortunately on SAM architecture the PIO_OSR register is + * read-only and can be set only through the enable/disable registers + * pair PIO_OER/PIO_ODR. + */ +// #define portModeRegister(port) ( &(port->PIO_OSR) ) + +/* + * digitalPinToTimer(..) is AVR-specific and is not defined for SAM + * architecture. If you need to check if a pin supports PWM you must + * use digitalPinHasPWM(..). + * + * https://github.com/arduino/Arduino/issues/1833 + */ +// #define digitalPinToTimer(P) + +// Interrupts +#define digitalPinToInterrupt(p) ((p) < NUM_DIGITAL_PINS ? (p) : -1) + +// LEDs +#define PIN_LED_13 (13U) +#define PIN_LED_RXL (72U) +#define PIN_LED_TXL (73U) +#define PIN_LED PIN_LED_13 +#define PIN_LED2 PIN_LED_RXL +#define PIN_LED3 PIN_LED_TXL +#define LED_BUILTIN 13 + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 1 + +#define SPI_INTERFACE SPI0 +#define SPI_INTERFACE_ID ID_SPI0 +#define SPI_CHANNELS_NUM 4 +#define PIN_SPI_SS0 (77U) +#define PIN_SPI_SS1 (87U) +#define PIN_SPI_SS2 (86U) +#define PIN_SPI_SS3 (78U) +#define PIN_SPI_MOSI (75U) +#define PIN_SPI_MISO (74U) +#define PIN_SPI_SCK (76U) +#define BOARD_SPI_SS0 (77U) //(10U) +#define BOARD_SPI_SS1 (4U) +#define BOARD_SPI_SS2 (52U) +#define BOARD_SPI_SS3 PIN_SPI_SS3 +#define BOARD_SPI_DEFAULT_SS BOARD_SPI_SS3 + +#define BOARD_PIN_TO_SPI_PIN(x) \ + (x==BOARD_SPI_SS0 ? PIN_SPI_SS0 : \ + (x==BOARD_SPI_SS1 ? PIN_SPI_SS1 : \ + (x==BOARD_SPI_SS2 ? PIN_SPI_SS2 : PIN_SPI_SS3 ))) +#define BOARD_PIN_TO_SPI_CHANNEL(x) \ + (x==BOARD_SPI_SS0 ? 0 : \ + (x==BOARD_SPI_SS1 ? 1 : \ + (x==BOARD_SPI_SS2 ? 2 : 3))) + +static const uint8_t SS = BOARD_SPI_SS0; +static const uint8_t SS1 = BOARD_SPI_SS1; +static const uint8_t SS2 = BOARD_SPI_SS2; +static const uint8_t SS3 = BOARD_SPI_SS3; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 2 + +#define PIN_WIRE_SDA (20U) +#define PIN_WIRE_SCL (21U) +#define WIRE_INTERFACE TWI1 +#define WIRE_INTERFACE_ID ID_TWI1 +#define WIRE_ISR_HANDLER TWI1_Handler +#define WIRE_ISR_ID TWI1_IRQn + +#define PIN_WIRE1_SDA (70U) +#define PIN_WIRE1_SCL (71U) +#define WIRE1_INTERFACE TWI0 +#define WIRE1_INTERFACE_ID ID_TWI0 +#define WIRE1_ISR_HANDLER TWI0_Handler +#define WIRE1_ISR_ID TWI0_IRQn + +static const uint8_t SDA = PIN_WIRE_SDA; +static const uint8_t SCL = PIN_WIRE_SCL; +static const uint8_t SDA1 = PIN_WIRE1_SDA; +static const uint8_t SCL1 = PIN_WIRE1_SCL; + +/* + * UART/USART Interfaces + */ +// Serial +#define PINS_UART (81U) +// Serial1 +#define PINS_USART0 (82U) +// Serial2 +#define PINS_USART1 (83U) +// Serial3 +#define PINS_USART3 (84U) + +/* + * USB Interfaces + */ +#define PINS_USB (85U) + +/* + * Analog pins + */ +static const uint8_t A0 = 54; +static const uint8_t A1 = 55; +static const uint8_t A2 = 56; +static const uint8_t A3 = 57; +static const uint8_t A4 = 58; +static const uint8_t A5 = 59; +static const uint8_t A6 = 60; +static const uint8_t A7 = 61; +static const uint8_t A8 = 62; +static const uint8_t A9 = 63; +static const uint8_t A10 = 64; +static const uint8_t A11 = 65; +static const uint8_t DAC0 = 66; +static const uint8_t DAC1 = 67; +static const uint8_t CANRX = 68; +static const uint8_t CANTX = 69; +#define ADC_RESOLUTION 12 + +/* + * Complementary CAN pins + */ +static const uint8_t CAN1RX = 88; +static const uint8_t CAN1TX = 89; + +// CAN0 +#define PINS_CAN0 (90U) +// CAN1 +#define PINS_CAN1 (91U) + + +/* + * DACC + */ +#define DACC_INTERFACE DACC +#define DACC_INTERFACE_ID ID_DACC +#define DACC_RESOLUTION 12 +#define DACC_ISR_HANDLER DACC_Handler +#define DACC_ISR_ID DACC_IRQn + +/* + * PWM + */ +#define PWM_INTERFACE PWM +#define PWM_INTERFACE_ID ID_PWM +#define PWM_FREQUENCY 31000 +#define PWM_MAX_DUTY_CYCLE 255 +#define PWM_MIN_DUTY_CYCLE 0 +#define PWM_RESOLUTION 8 + +/* + * TC + */ +#define TC_INTERFACE TC0 +#define TC_INTERFACE_ID ID_TC0 +#define TC_FREQUENCY 100000 +#define TC_MAX_DUTY_CYCLE 255 +#define TC_MIN_DUTY_CYCLE 0 +#define TC_RESOLUTION 8 + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + +extern UARTClass Serial; +extern USARTClass Serial1; +extern USARTClass Serial2; +extern USARTClass Serial3; + +#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_USBVIRTUAL SerialUSB +#define SERIAL_PORT_HARDWARE_OPEN Serial1 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial2 +#define SERIAL_PORT_HARDWARE_OPEN2 Serial3 +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE1 Serial1 +#define SERIAL_PORT_HARDWARE2 Serial2 +#define SERIAL_PORT_HARDWARE3 Serial3 + +#endif /* _VARIANT_ARDUINO_DUE_X_ */ + diff --git a/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h b/buildroot/share/PlatformIO/variants/megaextendedpins/pins_arduino.h new file mode 100644 index 00000000..81f2ae3e --- /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/buildroot/share/extras/header.h b/buildroot/share/extras/header.h new file mode 100644 index 00000000..5d2c73df --- /dev/null +++ b/buildroot/share/extras/header.h @@ -0,0 +1,26 @@ +/** + * 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 . + * + */ + +/** + * $(filename) + */ + diff --git a/buildroot/share/extras/uncrustify.cfg b/buildroot/share/extras/uncrustify.cfg new file mode 100644 index 00000000..06661203 --- /dev/null +++ b/buildroot/share/extras/uncrustify.cfg @@ -0,0 +1,84 @@ +# +# Uncrustify Configuration File +# File Created With UncrustifyX 0.4.3 (252) +# +align_assign_span = 1 +cmt_cpp_to_c = false +cmt_indent_multi = false +cmt_insert_file_header = "./header.h" +cmt_reflow_mode = 1 +cmt_sp_after_star_cont = 1 +cmt_sp_before_star_cont = 1 +cmt_star_cont = true +eat_blanks_after_open_brace = false +eat_blanks_before_close_brace = false +indent_align_assign = false +indent_case_brace = 0 +indent_columns = 2 +indent_cpp_lambda_body = false +indent_func_call_param = true +indent_func_def_param = true +indent_switch_case = 2 +indent_with_tabs = 0 +input_tab_size = 2 +mod_add_long_ifdef_else_comment = 40 +mod_add_long_ifdef_endif_comment = 40 +mod_full_brace_do = false +mod_full_brace_for = false +mod_full_brace_if = false +mod_full_brace_if_chain = true +mod_full_brace_while = false +mod_remove_extra_semicolon = true +newlines = lf +nl_after_brace_close = true +nl_after_brace_open = true +nl_assign_leave_one_liners = true +nl_brace_else = add +nl_class_leave_one_liners = true +nl_create_for_one_liner = true +nl_create_if_one_liner = false +nl_create_while_one_liner = true +nl_else_brace = remove +nl_end_of_file = add +nl_enum_brace = remove +nl_enum_leave_one_liners = true +nl_fdef_brace = remove +nl_for_brace = remove +nl_func_leave_one_liners = true +nl_getset_leave_one_liners = true +nl_if_brace = remove +nl_if_leave_one_liners = true +nl_multi_line_sparen_close = add +nl_squeeze_ifdef = false +nl_struct_brace = remove +nl_switch_brace = remove +nl_union_brace = remove +pp_define_at_level = true +pp_if_indent_code = true +pp_indent = add +pp_indent_at_level = true +pp_indent_count = 2 +pp_indent_if = 0 +sp_after_comma = add +sp_after_semi = add +sp_after_sparen = add +sp_arith = add +sp_assign = add +sp_assign_default = remove +sp_before_comma = remove +sp_before_sparen = add +sp_bool = add +sp_brace_else = add +sp_cmt_cpp_start = add +sp_compare = add +sp_cond_colon = add +sp_cond_question = add +sp_else_brace = add +sp_endif_cmt = true +sp_fparen_brace = add +sp_func_call_paren = remove +sp_func_proto_paren = remove +sp_inside_sparen = remove +sp_inside_square = remove +sp_paren_brace = add +sp_paren_paren = remove diff --git a/buildroot/share/fonts/NanumGothic.bdf b/buildroot/share/fonts/NanumGothic.bdf new file mode 100644 index 00000000..9bd13123 --- /dev/null +++ b/buildroot/share/fonts/NanumGothic.bdf @@ -0,0 +1,302670 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "NanumGothic.ttf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-NanumGothic-Medium-R-Normal--11-80-100-100-P-90-ISO10646-1 +SIZE 8 100 100 +FONTBOUNDINGBOX 11 13 0 -3 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "NanumGothic" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 11 +POINT_SIZE 80 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 90 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 10 +FONT_DESCENT 2 +COPYRIGHT "Copyright 2011 NHN Corporation. All rights reserved. Font designed by Sandoll Communications Inc." +_OTF_FONTFILE "NanumGothic.ttf" +_OTF_PSNAME "NanumGothic" +ENDPROPERTIES +CHARS 17666 +STARTCHAR 0000 +ENCODING 0 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0001 +ENCODING 1 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0002 +ENCODING 2 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0003 +ENCODING 3 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0004 +ENCODING 4 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0005 +ENCODING 5 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0006 +ENCODING 6 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0007 +ENCODING 7 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0008 +ENCODING 8 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0009 +ENCODING 9 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 000A +ENCODING 10 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 000B +ENCODING 11 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 000C +ENCODING 12 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 000D +ENCODING 13 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 000E +ENCODING 14 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 000F +ENCODING 15 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0010 +ENCODING 16 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0011 +ENCODING 17 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0012 +ENCODING 18 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0013 +ENCODING 19 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0014 +ENCODING 20 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0015 +ENCODING 21 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0016 +ENCODING 22 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0017 +ENCODING 23 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0018 +ENCODING 24 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0019 +ENCODING 25 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 001A +ENCODING 26 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 001B +ENCODING 27 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 001C +ENCODING 28 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 001D +ENCODING 29 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 001E +ENCODING 30 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 001F +ENCODING 31 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0020 +ENCODING 32 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +48 +50 +F8 +50 +50 +F8 +50 +90 +90 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +70 +A0 +A0 +60 +20 +30 +28 +28 +F0 +20 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 1080 0 +DWIDTH 12 0 +BBX 10 9 1 -1 +BITMAP +6100 +9200 +9200 +9400 +6980 +0A40 +1240 +1240 +2180 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +70 +48 +48 +50 +64 +94 +8C +8C +74 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 3 1 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 11 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 4 1 2 +BITMAP +20 +F8 +20 +50 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 6 1 1 +BITMAP +20 +20 +FC +20 +20 +20 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 2 1 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 1 1 4 +BITMAP +E0 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 1 1 -1 +BITMAP +80 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 9 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +98 +70 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 2 9 2 -1 +BITMAP +40 +C0 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +90 +08 +10 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +F0 +18 +08 +10 +60 +10 +08 +18 +F0 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +08 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +F8 +80 +80 +F0 +08 +08 +08 +18 +F0 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +78 +C0 +80 +F0 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +40 +40 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +88 +88 +90 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +88 +88 +88 +78 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 6 1 1 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 8 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +10 +20 +40 +80 +80 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 4 1 2 +BITMAP +FC +00 +00 +FC +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +80 +40 +20 +10 +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +E0 +10 +10 +10 +20 +20 +40 +00 +40 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3C +42 +9D +A5 +C5 +C9 +BE +42 +3C +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 8 9 0 -1 +BITMAP +18 +18 +24 +24 +24 +3E +42 +42 +81 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +F0 +90 +88 +90 +E0 +98 +88 +88 +F0 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 9 1 -1 +BITMAP +3C +40 +80 +80 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 9 1 -1 +BITMAP +F0 +80 +80 +80 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +F0 +80 +80 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +3C +40 +80 +80 +9E +82 +82 +42 +3E +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +84 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 9 1 -1 +BITMAP +88 +90 +90 +A0 +E0 +90 +90 +88 +84 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 990 0 +DWIDTH 11 0 +BBX 9 9 1 -1 +BITMAP +C180 +C180 +C280 +A280 +A480 +9480 +9480 +9880 +8880 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +84 +C4 +C4 +A4 +94 +94 +8C +8C +84 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +38 +44 +82 +82 +82 +82 +82 +C4 +78 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 9 1 -1 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +38 +44 +82 +82 +82 +82 +82 +C4 +78 +04 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +F0 +88 +88 +88 +F0 +90 +90 +88 +88 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +70 +80 +80 +80 +60 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +84 +84 +84 +84 +84 +84 +84 +C4 +78 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 9 0 -1 +BITMAP +82 +42 +44 +44 +24 +28 +28 +18 +10 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 990 0 +DWIDTH 11 0 +BBX 11 9 0 -1 +BITMAP +8420 +4620 +4A20 +4A40 +4A40 +2940 +3180 +3180 +3080 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 9 0 -1 +BITMAP +42 +44 +24 +18 +10 +28 +24 +44 +82 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 9 1 -1 +BITMAP +84 +88 +48 +50 +30 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +08 +08 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 990 0 +DWIDTH 11 0 +BBX 9 9 1 -1 +BITMAP +8900 +8900 +5900 +FF80 +5500 +5600 +6600 +2200 +2200 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 11 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 2 2 0 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +F0 +10 +10 +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +80 +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 7 1 -1 +BITMAP +70 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +08 +08 +08 +78 +98 +88 +88 +88 +98 +78 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 7 1 -1 +BITMAP +60 +90 +88 +F8 +80 +80 +70 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 10 0 -1 +BITMAP +30 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 8 1 -2 +BITMAP +78 +88 +88 +88 +88 +78 +10 +F0 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +80 +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 10 1 -1 +BITMAP +80 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 2 11 0 -2 +BITMAP +40 +00 +00 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +80 +80 +90 +A0 +A0 +C0 +A0 +A0 +90 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 10 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -1 +BITMAP +F6 +99 +89 +89 +89 +89 +89 +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 -1 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 -1 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 8 1 -2 +BITMAP +F0 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 8 1 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 7 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 7 1 -1 +BITMAP +E0 +80 +80 +40 +20 +20 +E0 +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 9 0 -1 +BITMAP +40 +40 +F0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 -1 +BITMAP +88 +88 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +88 +48 +48 +50 +50 +30 +20 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 9 7 0 -1 +BITMAP +8880 +8C80 +5480 +5500 +5500 +2300 +2200 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +48 +50 +30 +20 +30 +48 +88 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 8 0 -2 +BITMAP +88 +48 +50 +50 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +78 +08 +10 +20 +40 +40 +F8 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 2 11 1 -2 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 3 11 0 -2 +BITMAP +C0 +40 +40 +40 +40 +20 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 2 1 3 +BITMAP +E0 +98 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 8 1 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +38 +4C +90 +90 +94 +64 +38 +40 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +38 +44 +40 +FC +20 +E4 +B4 +CC +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 9 8 0 -1 +BITMAP +9C80 +6300 +4100 +4100 +4100 +4100 +7F00 +0080 +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +84 +48 +FC +30 +FC +10 +10 +10 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 0 -1 +BITMAP +60 +80 +40 +E0 +A0 +60 +20 +20 +E0 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +90 +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 9 9 0 -1 +BITMAP +1E00 +6100 +5C80 +A280 +A080 +A280 +5C80 +6100 +1E00 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +60 +60 +A0 +50 +F0 +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +0D +16 +68 +B0 +78 +16 +0D +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 1 -2 +BITMAP +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3E00 +5900 +A500 +A480 +B880 +A480 +A500 +4200 +3C00 +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 3 1 5 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +FC +10 +10 +00 +FC +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 2 3 1 5 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 1 2 1 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +78 +E8 +E8 +E8 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 2 2 1 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +60 +90 +90 +60 +F0 +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +D0 +2C +1A +05 +1A +2C +D0 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +40 +44 +08 +10 +24 +4C +9C +04 +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +40 +48 +10 +10 +2C +54 +88 +18 +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +C0 +20 +64 +E8 +10 +24 +4C +9C +04 +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +00 +20 +20 +40 +80 +80 +80 +60 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +20 +10 +10 +28 +28 +24 +7C +44 +82 +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +08 +10 +10 +28 +28 +24 +7C +44 +82 +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +10 +28 +28 +24 +7C +44 +82 +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 8 7 1 0 +BITMAP +7F +50 +50 +9E +F0 +90 +9F +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +3C +40 +40 +80 +80 +40 +2C +10 +18 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +00 +F0 +80 +80 +F0 +80 +80 +F0 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +40 +F0 +80 +80 +F0 +80 +80 +E0 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +60 +00 +F0 +80 +80 +F0 +80 +80 +F0 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +A0 +00 +F0 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 9 2 0 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 1 0 +BITMAP +C0 +20 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 1 7 2 2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +7C +42 +42 +E2 +42 +42 +7C +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +28 +10 +84 +C4 +A4 +A4 +94 +8C +8C +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 10 1 -1 +BITMAP +10 +20 +78 +84 +84 +84 +84 +84 +C8 +30 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 10 1 -1 +BITMAP +30 +50 +78 +84 +84 +84 +84 +84 +C8 +30 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +88 +90 +60 +50 +88 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +3C +44 +8A +92 +92 +A2 +A2 +44 +78 +80 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +40 +20 +04 +84 +84 +84 +84 +88 +88 +70 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +10 +20 +04 +84 +84 +84 +84 +88 +88 +70 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +20 +50 +04 +84 +84 +84 +84 +88 +88 +70 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 10 1 -1 +BITMAP +50 +00 +04 +84 +84 +84 +84 +88 +88 +70 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 9 1 -1 +BITMAP +70 +88 +88 +88 +B0 +88 +84 +88 +38 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +40 +20 +60 +10 +10 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +20 +20 +60 +10 +10 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +60 +60 +60 +10 +10 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +10 +60 +10 +10 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -1 +BITMAP +66 +19 +11 +FF +90 +98 +66 +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +70 +80 +80 +80 +80 +C0 +20 +30 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +40 +20 +60 +90 +90 +F0 +80 +80 +70 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +20 +20 +60 +90 +90 +F0 +80 +80 +70 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +60 +40 +60 +90 +90 +F0 +80 +80 +70 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +10 +60 +90 +90 +F0 +80 +80 +70 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 8 1 0 +BITMAP +C0 +80 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +20 +30 +D8 +88 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +40 +30 +70 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +20 +50 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 8 1 -1 +BITMAP +50 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 5 0 1 +BITMAP +10 +00 +FE +00 +10 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 -1 +BITMAP +30 +D0 +A8 +A8 +C8 +D8 +60 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +40 +40 +00 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +20 +40 +00 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +60 +60 +00 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +10 +00 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +80 +E0 +90 +88 +88 +88 +90 +E0 +80 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 8 1 -1 +BITMAP +1C +68 +98 +88 +88 +88 +98 +60 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +84 +FE +84 +FC +84 +84 +84 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F0 +58 +64 +44 +44 +44 +44 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 5 1 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0132 +ENCODING 306 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 -1 +BITMAP +84 +84 +84 +84 +84 +C4 +C4 +38 +ENDCHAR +STARTCHAR 0133 +ENCODING 307 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 9 1 -2 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +20 +20 +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +E0 +A0 +A0 +90 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +B0 +80 +80 +F0 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +20 +30 +20 +40 +A0 +20 +3C +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 7 1 0 +BITMAP +40 +40 +60 +40 +C0 +40 +40 +ENDCHAR +STARTCHAR 0149 +ENCODING 329 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +80 +98 +A4 +44 +44 +44 +44 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -2 +BITMAP +84 +C4 +A4 +A4 +94 +8C +8C +24 +1C +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 -2 +BITMAP +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7F +90 +90 +8F +90 +90 +7F +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 7 0 -1 +BITMAP +3B80 +4640 +8440 +87C0 +8400 +4400 +3BC0 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +20 +20 +70 +20 +20 +20 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 8 1 -1 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +20 +ENDCHAR +STARTCHAR 02BC +ENCODING 700 +SWIDTH 180 0 +DWIDTH 2 0 +BBX 2 2 0 5 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR 02C7 +ENCODING 711 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 2 1 6 +BITMAP +B0 +40 +ENDCHAR +STARTCHAR 02D0 +ENCODING 720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 4 5 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR 02D8 +ENCODING 728 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 3 2 2 6 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR 02D9 +ENCODING 729 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 2 1 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 02DA +ENCODING 730 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 2 1 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 02DB +ENCODING 731 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 2 1 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 02DC +ENCODING 732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 1 3 7 +BITMAP +F8 +ENDCHAR +STARTCHAR 02DD +ENCODING 733 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 2 1 6 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR 0391 +ENCODING 913 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +30 +48 +48 +78 +84 +84 +ENDCHAR +STARTCHAR 0392 +ENCODING 914 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +F8 +84 +88 +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR 0393 +ENCODING 915 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0394 +ENCODING 916 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +30 +48 +48 +48 +84 +FC +ENDCHAR +STARTCHAR 0395 +ENCODING 917 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +80 +80 +F8 +80 +80 +F0 +ENDCHAR +STARTCHAR 0396 +ENCODING 918 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +08 +10 +20 +40 +40 +F8 +ENDCHAR +STARTCHAR 0397 +ENCODING 919 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +84 +84 +84 +FC +84 +84 +84 +ENDCHAR +STARTCHAR 0398 +ENCODING 920 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +30 +4C +84 +82 +FA +82 +84 +4C +30 +ENDCHAR +STARTCHAR 0399 +ENCODING 921 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 7 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 039A +ENCODING 922 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +E0 +90 +90 +88 +ENDCHAR +STARTCHAR 039B +ENCODING 923 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +30 +48 +48 +48 +84 +84 +ENDCHAR +STARTCHAR 039C +ENCODING 924 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +82 +C6 +C6 +CA +AA +AA +92 +ENDCHAR +STARTCHAR 039D +ENCODING 925 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +84 +C4 +A4 +A4 +94 +8C +8C +ENDCHAR +STARTCHAR 039E +ENCODING 926 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +00 +00 +78 +00 +00 +F8 +ENDCHAR +STARTCHAR 039F +ENCODING 927 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +30 +4C +84 +82 +82 +82 +84 +4C +30 +ENDCHAR +STARTCHAR 03A0 +ENCODING 928 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 03A1 +ENCODING 929 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR 03A3 +ENCODING 931 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +40 +40 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR 03A4 +ENCODING 932 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 03A5 +ENCODING 933 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +84 +48 +50 +30 +20 +20 +20 +ENDCHAR +STARTCHAR 03A6 +ENCODING 934 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 7 1 0 +BITMAP +10 +7C +92 +92 +92 +6C +10 +ENDCHAR +STARTCHAR 03A7 +ENCODING 935 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +48 +30 +20 +50 +48 +88 +ENDCHAR +STARTCHAR 03A8 +ENCODING 936 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +92 +94 +94 +94 +7C +10 +10 +ENDCHAR +STARTCHAR 03A9 +ENCODING 937 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +30 +C8 +84 +84 +84 +C8 +30 +FC +ENDCHAR +STARTCHAR 03B1 +ENCODING 945 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +78 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR 03B2 +ENCODING 946 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 10 0 -2 +BITMAP +20 +D0 +88 +90 +B0 +88 +88 +88 +F0 +80 +ENDCHAR +STARTCHAR 03B3 +ENCODING 947 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 7 0 -2 +BITMAP +90 +50 +20 +60 +50 +50 +70 +ENDCHAR +STARTCHAR 03B4 +ENCODING 948 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +40 +20 +D0 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 03B5 +ENCODING 949 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +70 +80 +60 +80 +98 +60 +ENDCHAR +STARTCHAR 03B6 +ENCODING 950 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 9 0 -2 +BITMAP +70 +20 +40 +40 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR 03B7 +ENCODING 951 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 6 0 -1 +BITMAP +F0 +90 +90 +90 +90 +10 +ENDCHAR +STARTCHAR 03B8 +ENCODING 952 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +88 +88 +F8 +88 +88 +50 +20 +ENDCHAR +STARTCHAR 03B9 +ENCODING 953 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 6 1 -1 +BITMAP +80 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR 03BA +ENCODING 954 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 5 0 0 +BITMAP +90 +A0 +E0 +90 +90 +ENDCHAR +STARTCHAR 03BB +ENCODING 955 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 9 0 -1 +BITMAP +80 +40 +40 +40 +40 +60 +60 +A0 +18 +ENDCHAR +STARTCHAR 03BC +ENCODING 956 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +98 +E0 +80 +ENDCHAR +STARTCHAR 03BD +ENCODING 957 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR 03BE +ENCODING 958 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 9 0 -2 +BITMAP +60 +40 +20 +40 +80 +80 +60 +10 +30 +ENDCHAR +STARTCHAR 03BF +ENCODING 959 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +70 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR 03C0 +ENCODING 960 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +70 +50 +50 +50 +58 +90 +ENDCHAR +STARTCHAR 03C1 +ENCODING 961 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +D0 +A0 +80 +ENDCHAR +STARTCHAR 03C3 +ENCODING 963 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -1 +BITMAP +38 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR 03C4 +ENCODING 964 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 6 1 -1 +BITMAP +E0 +40 +40 +40 +60 +40 +ENDCHAR +STARTCHAR 03C5 +ENCODING 965 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +90 +88 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 03C6 +ENCODING 966 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +B0 +60 +20 +ENDCHAR +STARTCHAR 03C7 +ENCODING 967 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -2 +BITMAP +50 +30 +20 +20 +60 +50 +98 +ENDCHAR +STARTCHAR 03C8 +ENCODING 968 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR 03C9 +ENCODING 969 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 6 0 -1 +BITMAP +90 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR 0401 +ENCODING 1025 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +78 +80 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR 0410 +ENCODING 1040 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +30 +48 +48 +78 +84 +84 +ENDCHAR +STARTCHAR 0411 +ENCODING 1041 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +F8 +80 +80 +F8 +84 +84 +FC +ENDCHAR +STARTCHAR 0412 +ENCODING 1042 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +F8 +84 +88 +F8 +84 +84 +FC +ENDCHAR +STARTCHAR 0413 +ENCODING 1043 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 4 7 1 0 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0414 +ENCODING 1044 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 8 1 -2 +BITMAP +3C +24 +24 +24 +44 +44 +44 +BA +ENDCHAR +STARTCHAR 0415 +ENCODING 1045 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR 0416 +ENCODING 1046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 0 -1 +BITMAP +C080 +2900 +2A00 +1A00 +1E00 +1A00 +1A00 +2900 +C080 +ENDCHAR +STARTCHAR 0417 +ENCODING 1047 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +60 +90 +88 +10 +30 +08 +88 +98 +60 +ENDCHAR +STARTCHAR 0418 +ENCODING 1048 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +84 +8C +94 +A4 +A4 +C4 +84 +ENDCHAR +STARTCHAR 0419 +ENCODING 1049 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +48 +20 +84 +8C +94 +A4 +A4 +C4 +84 +ENDCHAR +STARTCHAR 041A +ENCODING 1050 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +E0 +90 +90 +88 +ENDCHAR +STARTCHAR 041B +ENCODING 1051 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 -1 +BITMAP +7C +44 +44 +44 +44 +44 +44 +80 +ENDCHAR +STARTCHAR 041C +ENCODING 1052 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +82 +C6 +C6 +AA +AA +AA +92 +ENDCHAR +STARTCHAR 041D +ENCODING 1053 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR 041E +ENCODING 1054 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +30 +4C +84 +82 +82 +82 +84 +4C +30 +ENDCHAR +STARTCHAR 041F +ENCODING 1055 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 0420 +ENCODING 1056 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR 0421 +ENCODING 1057 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +30 +4C +84 +80 +80 +80 +84 +4C +30 +ENDCHAR +STARTCHAR 0422 +ENCODING 1058 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0423 +ENCODING 1059 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +90 +50 +60 +20 +20 +40 +ENDCHAR +STARTCHAR 0424 +ENCODING 1060 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +30 +5C +94 +94 +94 +5C +30 +ENDCHAR +STARTCHAR 0425 +ENCODING 1061 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +88 +48 +30 +20 +30 +48 +8C +ENDCHAR +STARTCHAR 0426 +ENCODING 1062 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 9 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +7C +02 +ENDCHAR +STARTCHAR 0427 +ENCODING 1063 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +90 +90 +90 +90 +70 +10 +ENDCHAR +STARTCHAR 0428 +ENCODING 1064 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +92 +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR 0429 +ENCODING 1065 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 8 1 -2 +BITMAP +92 +92 +92 +92 +92 +92 +92 +6E +ENDCHAR +STARTCHAR 042A +ENCODING 1066 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 7 1 0 +BITMAP +C0 +40 +40 +7C +42 +42 +7C +ENDCHAR +STARTCHAR 042B +ENCODING 1067 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 7 1 0 +BITMAP +82 +82 +82 +F2 +8A +8A +FA +ENDCHAR +STARTCHAR 042C +ENCODING 1068 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +80 +80 +80 +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR 042D +ENCODING 1069 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +30 +C8 +84 +04 +3C +04 +84 +C8 +30 +ENDCHAR +STARTCHAR 042E +ENCODING 1070 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 8 9 1 -1 +BITMAP +0C +92 +A2 +A1 +E1 +A1 +A2 +92 +0C +ENDCHAR +STARTCHAR 042F +ENCODING 1071 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +FC +84 +84 +7C +84 +84 +84 +ENDCHAR +STARTCHAR 0430 +ENCODING 1072 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 6 1 -1 +BITMAP +F0 +88 +78 +88 +98 +60 +ENDCHAR +STARTCHAR 0431 +ENCODING 1073 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +30 +60 +90 +88 +88 +88 +98 +60 +ENDCHAR +STARTCHAR 0432 +ENCODING 1074 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +F8 +88 +F0 +88 +F8 +ENDCHAR +STARTCHAR 0433 +ENCODING 1075 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0434 +ENCODING 1076 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 8 7 0 -2 +BITMAP +3E +22 +22 +22 +42 +FE +81 +ENDCHAR +STARTCHAR 0435 +ENCODING 1077 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 6 1 -1 +BITMAP +F0 +88 +F8 +80 +90 +60 +ENDCHAR +STARTCHAR 0436 +ENCODING 1078 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 6 1 -1 +BITMAP +D4 +58 +38 +58 +54 +82 +ENDCHAR +STARTCHAR 0437 +ENCODING 1079 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 6 1 -1 +BITMAP +F0 +88 +30 +08 +88 +70 +ENDCHAR +STARTCHAR 0438 +ENCODING 1080 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR 0439 +ENCODING 1081 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +F0 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR 043A +ENCODING 1082 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +B0 +C0 +A0 +A0 +90 +ENDCHAR +STARTCHAR 043B +ENCODING 1083 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 5 1 -1 +BITMAP +7C +44 +44 +44 +84 +ENDCHAR +STARTCHAR 043C +ENCODING 1084 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 5 1 0 +BITMAP +86 +C6 +CA +AA +B2 +ENDCHAR +STARTCHAR 043D +ENCODING 1085 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR 043E +ENCODING 1086 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 6 1 -1 +BITMAP +F0 +88 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 043F +ENCODING 1087 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 0440 +ENCODING 1088 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 -2 +BITMAP +F0 +88 +88 +88 +90 +E0 +80 +ENDCHAR +STARTCHAR 0441 +ENCODING 1089 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +90 +60 +ENDCHAR +STARTCHAR 0442 +ENCODING 1090 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 4 5 1 0 +BITMAP +F0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0443 +ENCODING 1091 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +90 +90 +50 +60 +20 +20 +40 +ENDCHAR +STARTCHAR 0444 +ENCODING 1092 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 9 1 -2 +BITMAP +10 +38 +D4 +92 +92 +92 +94 +78 +10 +ENDCHAR +STARTCHAR 0445 +ENCODING 1093 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 4 5 1 0 +BITMAP +90 +60 +20 +50 +90 +ENDCHAR +STARTCHAR 0446 +ENCODING 1094 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 1 -2 +BITMAP +88 +88 +88 +88 +88 +78 +04 +ENDCHAR +STARTCHAR 0447 +ENCODING 1095 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +90 +90 +F0 +10 +ENDCHAR +STARTCHAR 0448 +ENCODING 1096 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 5 1 0 +BITMAP +94 +94 +94 +94 +FC +ENDCHAR +STARTCHAR 0449 +ENCODING 1097 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 6 1 -2 +BITMAP +A4 +A4 +A4 +A4 +A4 +5A +ENDCHAR +STARTCHAR 044A +ENCODING 1098 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 5 1 0 +BITMAP +C0 +40 +78 +44 +7C +ENDCHAR +STARTCHAR 044B +ENCODING 1099 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 5 1 0 +BITMAP +84 +84 +F4 +94 +F4 +ENDCHAR +STARTCHAR 044C +ENCODING 1100 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +F0 +90 +F0 +ENDCHAR +STARTCHAR 044D +ENCODING 1101 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 6 1 -1 +BITMAP +F0 +08 +78 +08 +90 +60 +ENDCHAR +STARTCHAR 044E +ENCODING 1102 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 6 1 -1 +BITMAP +BC +A2 +E2 +A2 +A2 +1C +ENDCHAR +STARTCHAR 044F +ENCODING 1103 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR 0451 +ENCODING 1105 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 5 8 1 -1 +BITMAP +40 +20 +D0 +88 +F8 +80 +90 +60 +ENDCHAR +STARTCHAR 1100 +ENCODING 4352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 1101 +ENCODING 4353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +24 +24 +24 +24 +ENDCHAR +STARTCHAR 1102 +ENCODING 4354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 4 3 2 +BITMAP +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 1103 +ENCODING 4355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +7C +80 +80 +80 +7C +ENDCHAR +STARTCHAR 1104 +ENCODING 4356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FC +90 +90 +90 +FE +ENDCHAR +STARTCHAR 1105 +ENCODING 4357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +04 +7C +80 +FC +ENDCHAR +STARTCHAR 1106 +ENCODING 4358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F0 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR 1107 +ENCODING 4359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +08 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR 1108 +ENCODING 4360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +B0 +B4 +FC +B4 +EC +ENDCHAR +STARTCHAR 1109 +ENCODING 4361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +10 +10 +30 +28 +C4 +ENDCHAR +STARTCHAR 110A +ENCODING 4362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +08 +48 +68 +96 +20 +ENDCHAR +STARTCHAR 110B +ENCODING 4363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +78 +44 +84 +84 +78 +ENDCHAR +STARTCHAR 110C +ENCODING 4364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FC +08 +10 +38 +C6 +ENDCHAR +STARTCHAR 110D +ENCODING 4365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +7E +12 +24 +5E +89 +ENDCHAR +STARTCHAR 110E +ENCODING 4366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +30 +FC +08 +30 +CC +ENDCHAR +STARTCHAR 110F +ENCODING 4367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR 1110 +ENCODING 4368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +7C +80 +FC +80 +FC +ENDCHAR +STARTCHAR 1111 +ENCODING 4369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +48 +48 +48 +FC +ENDCHAR +STARTCHAR 1112 +ENCODING 4370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +38 +FC +78 +44 +48 +30 +ENDCHAR +STARTCHAR 115F +ENCODING 4447 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 1160 +ENCODING 4448 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 1161 +ENCODING 4449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 4 -2 +BITMAP +80 +80 +80 +80 +80 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 1162 +ENCODING 4450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +10 +90 +90 +90 +90 +F0 +90 +90 +90 +90 +10 +ENDCHAR +STARTCHAR 1163 +ENCODING 4451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 4 -2 +BITMAP +80 +80 +80 +C0 +80 +80 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 1164 +ENCODING 4452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +10 +90 +90 +F0 +90 +90 +F0 +90 +90 +90 +10 +ENDCHAR +STARTCHAR 1165 +ENCODING 4453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 11 4 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 1166 +ENCODING 4454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +30 +30 +30 +B0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 1167 +ENCODING 4455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 11 4 -2 +BITMAP +20 +20 +20 +E0 +20 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 1168 +ENCODING 4456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +30 +30 +F0 +30 +30 +D0 +30 +30 +30 +ENDCHAR +STARTCHAR 1169 +ENCODING 4457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 4 1 1 +BITMAP +08 +08 +08 +FF +ENDCHAR +STARTCHAR 116A +ENCODING 4458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 2 -2 +BITMAP +04 +04 +04 +04 +44 +47 +44 +7C +84 +04 +04 +ENDCHAR +STARTCHAR 116B +ENCODING 4459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0080 +0280 +0280 +0280 +2280 +2380 +2280 +FA80 +0280 +0280 +0080 +ENDCHAR +STARTCHAR 116C +ENCODING 4460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -2 +BITMAP +02 +02 +02 +02 +22 +22 +22 +3E +C2 +02 +ENDCHAR +STARTCHAR 116D +ENCODING 4461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 4 1 1 +BITMAP +24 +24 +24 +FF +ENDCHAR +STARTCHAR 116E +ENCODING 4462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 0 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 116F +ENCODING 4463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +01 +01 +01 +FF +11 +17 +11 +11 +ENDCHAR +STARTCHAR 1170 +ENCODING 4464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0080 +0280 +0280 +0280 +0280 +FA80 +2280 +2E80 +2280 +2280 +0080 +ENDCHAR +STARTCHAR 1171 +ENCODING 4465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +01 +01 +01 +FF +11 +11 +11 +11 +ENDCHAR +STARTCHAR 1172 +ENCODING 4466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 0 +BITMAP +FFC0 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR 1173 +ENCODING 4467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 1 1 2 +BITMAP +FF +ENDCHAR +STARTCHAR 1174 +ENCODING 4468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +01 +01 +01 +01 +01 +FD +01 +01 +ENDCHAR +STARTCHAR 1175 +ENCODING 4469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 11 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 11A8 +ENCODING 4520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 11A9 +ENCODING 4521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +24 +24 +24 +24 +ENDCHAR +STARTCHAR 11AA +ENCODING 4522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +E4 +14 +14 +16 +19 +ENDCHAR +STARTCHAR 11AB +ENCODING 4523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 4 3 2 +BITMAP +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 11AC +ENCODING 4524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +8E +82 +82 +86 +E9 +ENDCHAR +STARTCHAR 11AD +ENCODING 4525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +1C +BE +9C +92 +FC +ENDCHAR +STARTCHAR 11AE +ENCODING 4526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +7C +80 +80 +80 +7C +ENDCHAR +STARTCHAR 11AF +ENCODING 4527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +04 +7C +80 +FC +ENDCHAR +STARTCHAR 11B0 +ENCODING 4528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +24 +E4 +84 +E4 +ENDCHAR +STARTCHAR 11B1 +ENCODING 4529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +EC +34 +F4 +94 +EC +ENDCHAR +STARTCHAR 11B2 +ENCODING 4530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +F0 +34 +FC +94 +FC +ENDCHAR +STARTCHAR 11B3 +ENCODING 4531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +E4 +14 +64 +86 +E9 +ENDCHAR +STARTCHAR 11B4 +ENCODING 4532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +EC +30 +FC +90 +FC +ENDCHAR +STARTCHAR 11B5 +ENCODING 4533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FE +2C +EC +8C +FE +ENDCHAR +STARTCHAR 11B6 +ENCODING 4534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +EC +3E +EC +12 +FC +ENDCHAR +STARTCHAR 11B7 +ENCODING 4535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F0 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR 11B8 +ENCODING 4536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +08 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR 11B9 +ENCODING 4537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +08 +28 +C8 +34 +D2 +ENDCHAR +STARTCHAR 11BA +ENCODING 4538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +10 +10 +30 +28 +C4 +ENDCHAR +STARTCHAR 11BB +ENCODING 4539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +08 +48 +68 +96 +20 +ENDCHAR +STARTCHAR 11BC +ENCODING 4540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +78 +44 +84 +84 +78 +ENDCHAR +STARTCHAR 11BD +ENCODING 4541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FC +08 +10 +38 +C6 +ENDCHAR +STARTCHAR 11BE +ENCODING 4542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +30 +FC +08 +30 +CC +ENDCHAR +STARTCHAR 11BF +ENCODING 4543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR 11C0 +ENCODING 4544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +7C +80 +FC +80 +FC +ENDCHAR +STARTCHAR 11C1 +ENCODING 4545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +48 +48 +48 +FC +ENDCHAR +STARTCHAR 11C2 +ENCODING 4546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +38 +FC +78 +44 +48 +30 +ENDCHAR +STARTCHAR 2010 +ENCODING 8208 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR 2013 +ENCODING 8211 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR 2014 +ENCODING 8212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 1 0 3 +BITMAP +FF80 +ENDCHAR +STARTCHAR 2015 +ENCODING 8213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 1 0 3 +BITMAP +FF80 +ENDCHAR +STARTCHAR 2016 +ENCODING 8214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 4 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2018 +ENCODING 8216 +SWIDTH 180 0 +DWIDTH 2 0 +BBX 2 3 0 5 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR 2019 +ENCODING 8217 +SWIDTH 180 0 +DWIDTH 2 0 +BBX 2 3 0 5 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR 201B +ENCODING 8219 +SWIDTH 180 0 +DWIDTH 2 0 +BBX 2 3 0 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR 201C +ENCODING 8220 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 3 1 5 +BITMAP +A0 +C0 +E0 +ENDCHAR +STARTCHAR 201D +ENCODING 8221 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 3 0 5 +BITMAP +E0 +60 +A0 +ENDCHAR +STARTCHAR 201F +ENCODING 8223 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 3 0 5 +BITMAP +E0 +A0 +40 +ENDCHAR +STARTCHAR 2020 +ENCODING 8224 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +20 +F0 +20 +20 +20 +ENDCHAR +STARTCHAR 2021 +ENCODING 8225 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +F0 +20 +F0 +20 +20 +ENDCHAR +STARTCHAR 2022 +ENCODING 8226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 3 4 2 +BITMAP +40 +C0 +C0 +ENDCHAR +STARTCHAR 2025 +ENCODING 8229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 1 2 3 +BITMAP +84 +ENDCHAR +STARTCHAR 2026 +ENCODING 8230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 1 1 3 +BITMAP +89 +ENDCHAR +STARTCHAR 2030 +ENCODING 8240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +C800 +D000 +D000 +FB00 +3680 +5680 +5B00 +8000 +ENDCHAR +STARTCHAR 2032 +ENCODING 8242 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 1 2 2 5 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 2033 +ENCODING 8243 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 2 1 5 +BITMAP +60 +A0 +ENDCHAR +STARTCHAR 2034 +ENCODING 8244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 3 3 5 +BITMAP +B0 +D0 +40 +ENDCHAR +STARTCHAR 2035 +ENCODING 8245 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 2 2 0 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR 2036 +ENCODING 8246 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 2 4 0 4 +BITMAP +80 +40 +80 +40 +ENDCHAR +STARTCHAR 2039 +ENCODING 8249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +06 +18 +20 +C0 +60 +10 +0C +02 +ENDCHAR +STARTCHAR 203A +ENCODING 8250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +C0 +20 +18 +06 +01 +02 +0C +30 +40 +ENDCHAR +STARTCHAR 203B +ENCODING 8251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +B4 +48 +28 +96 +30 +48 +B4 +ENDCHAR +STARTCHAR 203C +ENCODING 8252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +90 +90 +90 +90 +90 +90 +10 +00 +90 +ENDCHAR +STARTCHAR 203E +ENCODING 8254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 0 0 0 8 +BITMAP +ENDCHAR +STARTCHAR 2042 +ENCODING 8258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +04 +1C +00 +00 +02 +A7 +27 +02 +ENDCHAR +STARTCHAR 2074 +ENCODING 8308 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 3 1 5 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR 207A +ENCODING 8314 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 1 4 2 4 +BITMAP +80 +80 +80 +80 +ENDCHAR +STARTCHAR 207B +ENCODING 8315 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 1 1 2 5 +BITMAP +80 +ENDCHAR +STARTCHAR 207C +ENCODING 8316 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 1 1 2 5 +BITMAP +80 +ENDCHAR +STARTCHAR 207D +ENCODING 8317 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 4 1 3 +BITMAP +80 +80 +80 +80 +ENDCHAR +STARTCHAR 207E +ENCODING 8318 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 3 1 4 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 207F +ENCODING 8319 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 2 3 1 5 +BITMAP +C0 +C0 +80 +ENDCHAR +STARTCHAR 2081 +ENCODING 8321 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR 2082 +ENCODING 8322 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 1 1 -1 +BITMAP +C0 +ENDCHAR +STARTCHAR 2083 +ENCODING 8323 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 2 2 1 -1 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR 2084 +ENCODING 8324 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 2 1 -1 +BITMAP +40 +C0 +ENDCHAR +STARTCHAR 20A9 +ENCODING 8361 +SWIDTH 990 0 +DWIDTH 11 0 +BBX 9 9 1 -1 +BITMAP +8900 +8900 +5900 +FF80 +5500 +5600 +6600 +2200 +2200 +ENDCHAR +STARTCHAR 20AC +ENCODING 8364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +3C +40 +40 +70 +F0 +40 +20 +18 +ENDCHAR +STARTCHAR 2103 +ENCODING 8451 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +C0 +DC +22 +40 +40 +42 +42 +24 +1C +ENDCHAR +STARTCHAR 2109 +ENCODING 8457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +80 +BE +20 +20 +3C +20 +20 +20 +ENDCHAR +STARTCHAR 2113 +ENCODING 8467 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +30 +50 +50 +50 +60 +40 +D0 +20 +ENDCHAR +STARTCHAR 2116 +ENCODING 8470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +9000 +9400 +DA00 +D900 +B900 +B900 +9980 +0600 +ENDCHAR +STARTCHAR 2121 +ENCODING 8481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +F080 +2480 +2A80 +3280 +3E80 +3080 +3280 +0C00 +ENDCHAR +STARTCHAR 2122 +ENCODING 8482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 1 4 +BITMAP +F880 +4980 +4E80 +4080 +ENDCHAR +STARTCHAR 2126 +ENCODING 8486 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +70 +88 +84 +84 +84 +C8 +30 +FC +ENDCHAR +STARTCHAR 212B +ENCODING 8491 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +70 +70 +00 +20 +50 +50 +78 +88 +88 +ENDCHAR +STARTCHAR 2153 +ENCODING 8531 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +40 +48 +10 +10 +2C +44 +84 +1C +ENDCHAR +STARTCHAR 2154 +ENCODING 8532 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +C0 +20 +44 +C8 +10 +2C +42 +86 +0E +ENDCHAR +STARTCHAR 215B +ENCODING 8539 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 0 +BITMAP +40 +44 +08 +10 +2C +54 +9C +1C +ENDCHAR +STARTCHAR 215C +ENCODING 8540 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +C0 +20 +24 +A8 +50 +2C +4A +8E +0E +ENDCHAR +STARTCHAR 215D +ENCODING 8541 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 9 1 -1 +BITMAP +C0 +C0 +24 +E8 +10 +2C +4A +8E +0E +ENDCHAR +STARTCHAR 215E +ENCODING 8542 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 9 1 -1 +BITMAP +E0 +44 +48 +88 +10 +2C +54 +9C +1C +ENDCHAR +STARTCHAR 2160 +ENCODING 8544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 7 5 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2161 +ENCODING 8545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 0 +BITMAP +90 +90 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR 2162 +ENCODING 8546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +94 +94 +94 +94 +94 +94 +94 +ENDCHAR +STARTCHAR 2163 +ENCODING 8547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +C2 +A4 +A4 +A4 +98 +98 +98 +ENDCHAR +STARTCHAR 2164 +ENCODING 8548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +84 +44 +48 +48 +28 +30 +30 +ENDCHAR +STARTCHAR 2165 +ENCODING 8549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +8A +8A +92 +52 +52 +62 +22 +ENDCHAR +STARTCHAR 2166 +ENCODING 8550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +8B +4B +53 +53 +53 +53 +23 +ENDCHAR +STARTCHAR 2167 +ENCODING 8551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +9B +9B +AB +6B +6B +6B +6B +ENDCHAR +STARTCHAR 2168 +ENCODING 8552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +92 +92 +8C +84 +8C +92 +91 +ENDCHAR +STARTCHAR 2169 +ENCODING 8553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +44 +48 +30 +10 +30 +48 +C4 +ENDCHAR +STARTCHAR 2170 +ENCODING 8560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 7 5 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2171 +ENCODING 8561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 0 +BITMAP +90 +00 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR 2172 +ENCODING 8562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +94 +00 +94 +94 +94 +94 +94 +ENDCHAR +STARTCHAR 2173 +ENCODING 8563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +80 +00 +A4 +A4 +A8 +98 +98 +ENDCHAR +STARTCHAR 2174 +ENCODING 8564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 3 0 +BITMAP +90 +90 +50 +60 +60 +ENDCHAR +STARTCHAR 2175 +ENCODING 8565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +04 +00 +94 +54 +54 +54 +24 +ENDCHAR +STARTCHAR 2176 +ENCODING 8566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +0A +00 +9A +AA +AA +AA +4A +ENDCHAR +STARTCHAR 2177 +ENCODING 8567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +02 +00 +97 +97 +67 +67 +67 +ENDCHAR +STARTCHAR 2178 +ENCODING 8568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +80 +00 +A4 +98 +88 +98 +A4 +ENDCHAR +STARTCHAR 2179 +ENCODING 8569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 3 0 +BITMAP +90 +60 +20 +60 +90 +ENDCHAR +STARTCHAR 2190 +ENCODING 8592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 3 1 2 +BITMAP +80 +FF +80 +ENDCHAR +STARTCHAR 2191 +ENCODING 8593 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 11 1 -2 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 2192 +ENCODING 8594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 1 1 +BITMAP +0100 +0080 +FF80 +0100 +ENDCHAR +STARTCHAR 2193 +ENCODING 8595 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 11 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR 2194 +ENCODING 8596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 1 1 +BITMAP +0100 +8080 +FF80 +8100 +ENDCHAR +STARTCHAR 2195 +ENCODING 8597 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 11 1 -2 +BITMAP +40 +E0 +40 +40 +40 +40 +40 +40 +40 +C0 +40 +ENDCHAR +STARTCHAR 2196 +ENCODING 8598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +8000 +C000 +A000 +1000 +0800 +0800 +0400 +0200 +0100 +0080 +0040 +ENDCHAR +STARTCHAR 2197 +ENCODING 8599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +0180 +0080 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR 2198 +ENCODING 8600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +8000 +4000 +2000 +1000 +0800 +0400 +0400 +0200 +0100 +00C0 +00C0 +ENDCHAR +STARTCHAR 2199 +ENCODING 8601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +0080 +0100 +0200 +0400 +0800 +1000 +2000 +C000 +C000 +ENDCHAR +STARTCHAR 21B0 +ENCODING 8624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +8000 +FF80 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 21B1 +ENCODING 8625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -2 +BITMAP +0100 +FF80 +8100 +8000 +8000 +8000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR 21B2 +ENCODING 8626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0080 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +FF80 +8000 +ENDCHAR +STARTCHAR 21B3 +ENCODING 8627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +FF +01 +ENDCHAR +STARTCHAR 21B4 +ENCODING 8628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +FE +01 +01 +01 +01 +01 +01 +01 +01 +03 +ENDCHAR +STARTCHAR 21BC +ENCODING 8636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 2 1 3 +BITMAP +40 +FF +ENDCHAR +STARTCHAR 21C0 +ENCODING 8640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 2 1 3 +BITMAP +0200 +FF80 +ENDCHAR +STARTCHAR 21C4 +ENCODING 8644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 7 0 0 +BITMAP +0080 +7FC0 +0040 +0000 +4000 +FFC0 +4000 +ENDCHAR +STARTCHAR 21C5 +ENCODING 8645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 11 2 -2 +BITMAP +40 +E8 +48 +48 +48 +48 +48 +48 +48 +58 +4C +ENDCHAR +STARTCHAR 21CD +ENCODING 8653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 0 0 +BITMAP +2000 +7F80 +8400 +7F80 +0400 +ENDCHAR +STARTCHAR 21CF +ENCODING 8655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 0 +BITMAP +0A00 +EF00 +1080 +FE80 +1100 +ENDCHAR +STARTCHAR 21D0 +ENCODING 8656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 0 1 +BITMAP +2000 +7F80 +8000 +7F80 +ENDCHAR +STARTCHAR 21D1 +ENCODING 8657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +5600 +9500 +1480 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR 21D2 +ENCODING 8658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +0200 +FF00 +0080 +FE80 +0100 +ENDCHAR +STARTCHAR 21D3 +ENCODING 8659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +14 +14 +14 +14 +14 +95 +55 +26 +24 +ENDCHAR +STARTCHAR 21D4 +ENCODING 8660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 1 +BITMAP +2100 +7F80 +8040 +7F40 +0080 +ENDCHAR +STARTCHAR 21E0 +ENCODING 8672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 1 1 +BITMAP +4000 +D580 +C000 +4000 +ENDCHAR +STARTCHAR 21E1 +ENCODING 8673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 9 4 -1 +BITMAP +40 +E0 +00 +40 +00 +00 +40 +00 +C0 +ENDCHAR +STARTCHAR 21E2 +ENCODING 8674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 3 1 1 +BITMAP +0100 +AD80 +0100 +ENDCHAR +STARTCHAR 21E3 +ENCODING 8675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 9 4 -2 +BITMAP +40 +40 +00 +C0 +00 +40 +00 +20 +C0 +ENDCHAR +STARTCHAR 21E6 +ENCODING 8678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -1 +BITMAP +2000 +5000 +8F80 +8080 +8080 +5F00 +2000 +ENDCHAR +STARTCHAR 21E7 +ENCODING 8679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -2 +BITMAP +30 +48 +84 +4A +48 +48 +48 +48 +48 +78 +ENDCHAR +STARTCHAR 21E8 +ENCODING 8680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -1 +BITMAP +0400 +0600 +F900 +8080 +8100 +7E00 +0400 +ENDCHAR +STARTCHAR 21E9 +ENCODING 8681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -2 +BITMAP +78 +48 +48 +48 +48 +48 +86 +44 +28 +10 +ENDCHAR +STARTCHAR 2200 +ENCODING 8704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +84 +84 +78 +48 +28 +30 +30 +ENDCHAR +STARTCHAR 2202 +ENCODING 8706 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 5 1 1 +BITMAP +60 +10 +F0 +A0 +E0 +ENDCHAR +STARTCHAR 2203 +ENCODING 8707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 0 +BITMAP +F8 +08 +08 +F8 +08 +08 +F8 +ENDCHAR +STARTCHAR 2206 +ENCODING 8710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +10 +30 +30 +48 +48 +84 +84 +FE +ENDCHAR +STARTCHAR 2207 +ENCODING 8711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +FF +41 +42 +22 +24 +18 +08 +ENDCHAR +STARTCHAR 2208 +ENCODING 8712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 1 0 +BITMAP +7E +80 +FE +80 +40 +3E +ENDCHAR +STARTCHAR 2209 +ENCODING 8713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +08 +7C +90 +FC +90 +D0 +28 +ENDCHAR +STARTCHAR 220B +ENCODING 8715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 0 +BITMAP +FC +02 +FE +02 +02 +FC +ENDCHAR +STARTCHAR 220C +ENCODING 8716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +10 +F8 +14 +FC +24 +2C +50 +ENDCHAR +STARTCHAR 220F +ENCODING 8719 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +FC +48 +48 +48 +48 +48 +48 +ENDCHAR +STARTCHAR 2211 +ENCODING 8721 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR 2213 +ENCODING 8723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 0 +BITMAP +FE +00 +10 +10 +7C +10 +ENDCHAR +STARTCHAR 221A +ENCODING 8730 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 8 7 0 -1 +BITMAP +0F +10 +10 +10 +20 +A0 +60 +ENDCHAR +STARTCHAR 221D +ENCODING 8733 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 7 4 0 1 +BITMAP +76 +88 +88 +76 +ENDCHAR +STARTCHAR 221E +ENCODING 8734 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 9 4 0 1 +BITMAP +7700 +8880 +8880 +7700 +ENDCHAR +STARTCHAR 221F +ENCODING 8735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR 2220 +ENCODING 8736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 2 0 +BITMAP +08 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR 2222 +ENCODING 8738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 1 +BITMAP +0C +38 +C4 +64 +18 +10 +ENDCHAR +STARTCHAR 2225 +ENCODING 8741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +0A +14 +28 +28 +50 +90 +A0 +ENDCHAR +STARTCHAR 2226 +ENCODING 8742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +02 +54 +24 +28 +50 +98 +A0 +ENDCHAR +STARTCHAR 2227 +ENCODING 8743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 0 +BITMAP +10 +30 +48 +44 +84 +ENDCHAR +STARTCHAR 2228 +ENCODING 8744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 0 +BITMAP +02 +84 +44 +48 +30 +10 +ENDCHAR +STARTCHAR 2229 +ENCODING 8745 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +F8 +84 +84 +84 +84 +84 +04 +ENDCHAR +STARTCHAR 222A +ENCODING 8746 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 8 1 -1 +BITMAP +04 +84 +84 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR 222B +ENCODING 8747 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +20 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR 222C +ENCODING 8748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +36 +28 +48 +48 +48 +48 +48 +48 +B0 +ENDCHAR +STARTCHAR 222E +ENCODING 8750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +10 +20 +20 +60 +B0 +B0 +60 +40 +C0 +ENDCHAR +STARTCHAR 2234 +ENCODING 8756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +10 +00 +00 +00 +84 +ENDCHAR +STARTCHAR 2235 +ENCODING 8757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +84 +00 +00 +00 +10 +ENDCHAR +STARTCHAR 2236 +ENCODING 8758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 4 5 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR 2237 +ENCODING 8759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 3 1 +BITMAP +90 +00 +00 +00 +90 +ENDCHAR +STARTCHAR 223C +ENCODING 8764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 3 2 2 +BITMAP +60 +94 +08 +ENDCHAR +STARTCHAR 223D +ENCODING 8765 +SWIDTH 810 0 +DWIDTH 9 0 +BBX 8 4 0 1 +BITMAP +47 +89 +89 +F3 +ENDCHAR +STARTCHAR 2243 +ENCODING 8771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 3 2 2 +BITMAP +7C +00 +FC +ENDCHAR +STARTCHAR 2245 +ENCODING 8773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +79 +06 +00 +FF +7E +ENDCHAR +STARTCHAR 2248 +ENCODING 8776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 4 3 1 +BITMAP +F8 +00 +C0 +38 +ENDCHAR +STARTCHAR 2250 +ENCODING 8784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR 2251 +ENCODING 8785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 1 +BITMAP +10 +FE +00 +FE +00 +10 +ENDCHAR +STARTCHAR 2252 +ENCODING 8786 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 7 1 0 +BITMAP +C0 +00 +7C +00 +7C +00 +04 +ENDCHAR +STARTCHAR 2253 +ENCODING 8787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 1 +BITMAP +04 +FE +00 +FE +00 +40 +ENDCHAR +STARTCHAR 225A +ENCODING 8794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +04 +48 +48 +30 +00 +FE +7C +ENDCHAR +STARTCHAR 2260 +ENCODING 8800 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +08 +08 +FE +10 +FE +10 +20 +ENDCHAR +STARTCHAR 2261 +ENCODING 8801 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 5 5 2 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR 2262 +ENCODING 8802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 1 +BITMAP +08 +74 +FE +20 +FE +40 +ENDCHAR +STARTCHAR 2264 +ENCODING 8804 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +38 +04 +00 +7C +ENDCHAR +STARTCHAR 2265 +ENCODING 8805 +SWIDTH 630 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +C0 +30 +0C +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR 2266 +ENCODING 8806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +0C +30 +C0 +30 +0C +FE +7C +ENDCHAR +STARTCHAR 2267 +ENCODING 8807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +60 +18 +0C +30 +C0 +FE +7C +ENDCHAR +STARTCHAR 226A +ENCODING 8810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +0D +16 +68 +B0 +78 +16 +0D +ENDCHAR +STARTCHAR 226B +ENCODING 8811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +D0 +2C +1A +05 +1A +2C +D0 +ENDCHAR +STARTCHAR 226E +ENCODING 8814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 1 +BITMAP +08 +30 +D0 +70 +18 +24 +ENDCHAR +STARTCHAR 226F +ENCODING 8815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 1 +BITMAP +70 +18 +14 +28 +30 +C0 +ENDCHAR +STARTCHAR 2270 +ENCODING 8816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +08 +0C +30 +D0 +38 +16 +FE +7C +ENDCHAR +STARTCHAR 2271 +ENCODING 8817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +F0 +10 +1C +30 +E0 +FC +78 +ENDCHAR +STARTCHAR 2272 +ENCODING 8818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +04 +38 +C0 +60 +1C +00 +FE +ENDCHAR +STARTCHAR 2273 +ENCODING 8819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +C0 +30 +0C +18 +E0 +00 +FE +ENDCHAR +STARTCHAR 2276 +ENCODING 8822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +0C +70 +F0 +CC +38 +1C +60 +ENDCHAR +STARTCHAR 2277 +ENCODING 8823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +E0 +18 +1C +EC +30 +E0 +1C +ENDCHAR +STARTCHAR 2279 +ENCODING 8825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +08 +E8 +18 +1C +FC +20 +E0 +3C +ENDCHAR +STARTCHAR 227A +ENCODING 8826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +04 +18 +E0 +30 +0C +ENDCHAR +STARTCHAR 227B +ENCODING 8827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR 2280 +ENCODING 8832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +10 +14 +18 +F0 +30 +1C +10 +ENDCHAR +STARTCHAR 2281 +ENCODING 8833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +D0 +20 +1C +30 +D0 +ENDCHAR +STARTCHAR 2282 +ENCODING 8834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 1 0 +BITMAP +7E +80 +80 +80 +80 +7E +ENDCHAR +STARTCHAR 2283 +ENCODING 8835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 0 +BITMAP +FC +02 +02 +02 +02 +FC +ENDCHAR +STARTCHAR 2284 +ENCODING 8836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +08 +7C +90 +90 +90 +D0 +28 +ENDCHAR +STARTCHAR 2285 +ENCODING 8837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +10 +F8 +14 +24 +24 +2C +50 +ENDCHAR +STARTCHAR 2286 +ENCODING 8838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7F +80 +80 +80 +7F +00 +7E +ENDCHAR +STARTCHAR 2287 +ENCODING 8839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7E +01 +01 +01 +FE +00 +7E +ENDCHAR +STARTCHAR 228A +ENCODING 8842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +7E +80 +80 +80 +7F +7E +08 +76 +ENDCHAR +STARTCHAR 228B +ENCODING 8843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +7E +01 +01 +01 +FE +7E +08 +76 +ENDCHAR +STARTCHAR 2295 +ENCODING 8853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +8900 +8880 +BE80 +8880 +8900 +4100 +3E00 +ENDCHAR +STARTCHAR 2296 +ENCODING 8854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +8100 +8080 +BE80 +8080 +8100 +4100 +3E00 +ENDCHAR +STARTCHAR 2297 +ENCODING 8855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +8300 +A480 +9880 +9880 +A500 +4100 +3E00 +ENDCHAR +STARTCHAR 2299 +ENCODING 8857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3E +41 +81 +99 +BD +99 +81 +41 +3E +ENDCHAR +STARTCHAR 22A3 +ENCODING 8867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +04 +04 +FC +04 +04 +ENDCHAR +STARTCHAR 22A4 +ENCODING 8868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 22A5 +ENCODING 8869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR 22BB +ENCODING 8891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +80 +44 +48 +28 +30 +10 +7C +ENDCHAR +STARTCHAR 22BC +ENCODING 8892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 3 0 +BITMAP +F8 +20 +50 +90 +88 +08 +ENDCHAR +STARTCHAR 22CE +ENCODING 8910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 1 +BITMAP +10 +30 +28 +48 +44 +84 +ENDCHAR +STARTCHAR 22CF +ENCODING 8911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +80 +44 +48 +28 +30 +10 +ENDCHAR +STARTCHAR 22DA +ENCODING 8922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +1C +70 +0E +FE +C0 +3C +70 +ENDCHAR +STARTCHAR 22DB +ENCODING 8923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +70 +3C +C0 +FE +0E +70 +1C +ENDCHAR +STARTCHAR 22EE +ENCODING 8942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 8 5 -1 +BITMAP +80 +00 +00 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR 22EF +ENCODING 8943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 1 1 3 +BITMAP +89 +ENDCHAR +STARTCHAR 2306 +ENCODING 8966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 0 +BITMAP +F8 +00 +20 +50 +90 +ENDCHAR +STARTCHAR 2312 +ENCODING 8978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 2 2 6 +BITMAP +78 +84 +ENDCHAR +STARTCHAR 2314 +ENCODING 8980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +78 +84 +84 +44 +48 +30 +10 +ENDCHAR +STARTCHAR 2460 +ENCODING 9312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8440 +8440 +8440 +8440 +4440 +4080 +3F00 +ENDCHAR +STARTCHAR 2461 +ENCODING 9313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9240 +8240 +8440 +8840 +5E40 +4080 +3F00 +ENDCHAR +STARTCHAR 2462 +ENCODING 9314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4C40 +9240 +8640 +8240 +9240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 2463 +ENCODING 9315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8C40 +8C40 +9440 +9E40 +4440 +4080 +3F00 +ENDCHAR +STARTCHAR 2464 +ENCODING 9316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9040 +9E40 +8240 +9240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 2465 +ENCODING 9317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9040 +9E40 +9240 +9240 +5E40 +4080 +3F00 +ENDCHAR +STARTCHAR 2466 +ENCODING 9318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +8240 +8440 +8440 +8840 +4840 +4080 +3F00 +ENDCHAR +STARTCHAR 2467 +ENCODING 9319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9240 +8E40 +9240 +9240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 2468 +ENCODING 9320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +9240 +9240 +9E40 +8240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 2469 +ENCODING 9321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5740 +9540 +9940 +9940 +9540 +5740 +4080 +3F00 +ENDCHAR +STARTCHAR 246A +ENCODING 9322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5240 +9240 +9240 +9240 +9240 +5240 +4080 +3F00 +ENDCHAR +STARTCHAR 246B +ENCODING 9323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5740 +9140 +9140 +9240 +9440 +5740 +4080 +3F00 +ENDCHAR +STARTCHAR 246C +ENCODING 9324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5740 +9140 +9240 +9140 +9940 +5740 +4080 +3F00 +ENDCHAR +STARTCHAR 246D +ENCODING 9325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5240 +9240 +9540 +9940 +9F40 +5040 +4080 +3F00 +ENDCHAR +STARTCHAR 246E +ENCODING 9326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5640 +9440 +9740 +9140 +9940 +5740 +4080 +3F00 +ENDCHAR +STARTCHAR 246F +ENCODING 9327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4280 +5540 +9A40 +9D40 +9940 +9940 +5680 +2100 +1E00 +ENDCHAR +STARTCHAR 2470 +ENCODING 9328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5740 +9240 +9240 +9240 +9440 +5480 +2100 +1E00 +ENDCHAR +STARTCHAR 2471 +ENCODING 9329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4280 +5540 +9540 +9640 +9940 +9940 +5780 +2100 +1E00 +ENDCHAR +STARTCHAR 2472 +ENCODING 9330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4280 +5540 +98C0 +9540 +92C0 +9140 +5680 +2100 +1E00 +ENDCHAR +STARTCHAR 2473 +ENCODING 9331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5280 +6D40 +A4C0 +8CC0 +94C0 +A4C0 +7B80 +2100 +1E00 +ENDCHAR +STARTCHAR 2474 +ENCODING 9332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8440 +8C40 +8440 +8440 +8440 +8440 +8440 +4040 +4080 +ENDCHAR +STARTCHAR 2475 +ENCODING 9333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9240 +8440 +8840 +9040 +9E40 +4040 +4080 +ENDCHAR +STARTCHAR 2476 +ENCODING 9334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +8240 +8640 +8140 +9140 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 2477 +ENCODING 9335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8440 +8440 +8A40 +9240 +9E40 +8240 +8240 +4040 +4080 +ENDCHAR +STARTCHAR 2478 +ENCODING 9336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9040 +9E40 +9240 +8140 +9240 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 2479 +ENCODING 9337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9040 +9E40 +9140 +9140 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 247A +ENCODING 9338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9E40 +8240 +8240 +8440 +8440 +8840 +8840 +4840 +4080 +ENDCHAR +STARTCHAR 247B +ENCODING 9339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9240 +8C40 +9240 +9140 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 247C +ENCODING 9340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9140 +9340 +8D40 +9240 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 247D +ENCODING 9341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9740 +B540 +94C0 +98C0 +98C0 +9540 +9740 +4040 +4080 +ENDCHAR +STARTCHAR 247E +ENCODING 9342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9140 +B340 +9140 +9140 +9140 +9140 +9140 +4040 +4080 +ENDCHAR +STARTCHAR 247F +ENCODING 9343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9740 +A540 +9940 +9240 +9440 +9840 +9F40 +4040 +4080 +ENDCHAR +STARTCHAR 2480 +ENCODING 9344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9740 +B940 +9140 +9340 +90C0 +98C0 +9740 +4040 +4080 +ENDCHAR +STARTCHAR 2481 +ENCODING 9345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9140 +B340 +9540 +9540 +9FC0 +9140 +9140 +4040 +4080 +ENDCHAR +STARTCHAR 2482 +ENCODING 9346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9740 +B440 +9740 +9540 +90C0 +98C0 +9740 +4040 +4080 +ENDCHAR +STARTCHAR 2483 +ENCODING 9347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +4340 +A540 +9A40 +9D40 +98C0 +98C0 +9740 +4040 +4080 +ENDCHAR +STARTCHAR 2484 +ENCODING 9348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +4640 +B140 +9140 +9240 +9240 +9240 +9440 +4040 +4080 +ENDCHAR +STARTCHAR 2485 +ENCODING 9349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +5340 +B4C0 +9540 +9740 +98C0 +98C0 +9740 +4040 +4080 +ENDCHAR +STARTCHAR 2486 +ENCODING 9350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +4340 +A4C0 +98C0 +94C0 +97C0 +90C0 +9740 +4040 +4080 +ENDCHAR +STARTCHAR 2487 +ENCODING 9351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +5340 +AAC0 +8CC0 +8CC0 +94C0 +A4C0 +BB40 +4040 +4080 +ENDCHAR +STARTCHAR 249C +ENCODING 9372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +8E40 +9240 +9240 +9D40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 249D +ENCODING 9373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9040 +9040 +9E40 +9140 +9140 +9140 +9E40 +4040 +4080 +ENDCHAR +STARTCHAR 249E +ENCODING 9374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9040 +9040 +9040 +9240 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 249F +ENCODING 9375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4240 +8240 +9E40 +9240 +A240 +A240 +9240 +9E40 +4040 +4080 +ENDCHAR +STARTCHAR 24A0 +ENCODING 9376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8C40 +9240 +9140 +9E40 +9040 +9240 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 24A1 +ENCODING 9377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8440 +8440 +8C40 +8440 +8440 +8440 +8440 +4440 +4080 +ENDCHAR +STARTCHAR 24A2 +ENCODING 9378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9140 +9240 +8E40 +9240 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 24A3 +ENCODING 9379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9040 +9040 +9E40 +9240 +9140 +9140 +9140 +4040 +4080 +ENDCHAR +STARTCHAR 24A4 +ENCODING 9380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8440 +8040 +8440 +8440 +8440 +8440 +8440 +4040 +4080 +ENDCHAR +STARTCHAR 24A5 +ENCODING 9381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4440 +8040 +8440 +8440 +8440 +8440 +8440 +8440 +4C40 +4080 +ENDCHAR +STARTCHAR 24A6 +ENCODING 9382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9040 +9040 +9240 +9440 +9C40 +9240 +9240 +4040 +4080 +ENDCHAR +STARTCHAR 24A7 +ENCODING 9383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8440 +8440 +8440 +8440 +8440 +8440 +8440 +4040 +4080 +ENDCHAR +STARTCHAR 24A8 +ENCODING 9384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +BB40 +A4C0 +A4C0 +A4C0 +A4C0 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24A9 +ENCODING 9385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9E40 +9240 +9240 +9240 +9240 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24AA +ENCODING 9386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +9140 +9140 +9240 +8E40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24AB +ENCODING 9387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9E40 +9140 +9140 +9140 +9140 +9E40 +9040 +4040 +4080 +ENDCHAR +STARTCHAR 24AC +ENCODING 9388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8D40 +9240 +9140 +9140 +9240 +8D40 +8140 +4040 +4080 +ENDCHAR +STARTCHAR 24AD +ENCODING 9389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +8E40 +8840 +8840 +8840 +8840 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24AE +ENCODING 9390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +9240 +8C40 +8240 +9240 +8E40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24AF +ENCODING 9391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8840 +8840 +8C40 +8840 +8840 +8840 +8440 +4040 +4080 +ENDCHAR +STARTCHAR 24B0 +ENCODING 9392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9240 +9240 +9240 +9240 +8E40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24B1 +ENCODING 9393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9240 +9240 +8A40 +8C40 +8C40 +8440 +4040 +4080 +ENDCHAR +STARTCHAR 24B2 +ENCODING 9394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +A4C0 +AD40 +AB40 +9340 +9240 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24B3 +ENCODING 9395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9240 +8C40 +8440 +8A40 +9240 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24B4 +ENCODING 9396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +9140 +9240 +8A40 +8A40 +8C40 +8440 +8440 +4840 +4080 +ENDCHAR +STARTCHAR 24B5 +ENCODING 9397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9E40 +8240 +8440 +8840 +9E40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 24B6 +ENCODING 9398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4480 +4C40 +8A40 +9240 +9E40 +9140 +6180 +2100 +1E00 +ENDCHAR +STARTCHAR 24B7 +ENCODING 9399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5E80 +5140 +9140 +9E40 +9140 +9140 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24B8 +ENCODING 9400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4C80 +5340 +A040 +A040 +A040 +A140 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24B9 +ENCODING 9401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4C80 +5340 +9140 +9140 +9140 +9140 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24BA +ENCODING 9402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4E80 +5040 +9040 +9E40 +9040 +9040 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24BB +ENCODING 9403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4E80 +5040 +9040 +9E40 +9040 +9040 +5080 +2100 +1E00 +ENDCHAR +STARTCHAR 24BC +ENCODING 9404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4C80 +5240 +A040 +A240 +A140 +A140 +5F80 +2100 +1E00 +ENDCHAR +STARTCHAR 24BD +ENCODING 9405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5140 +9140 +9F40 +9140 +9140 +4180 +2100 +1E00 +ENDCHAR +STARTCHAR 24BE +ENCODING 9406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8440 +8440 +8440 +8440 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR 24BF +ENCODING 9407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4280 +4240 +8240 +8240 +8240 +9240 +4C80 +2100 +1E00 +ENDCHAR +STARTCHAR 24C0 +ENCODING 9408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5240 +9440 +9840 +9440 +9240 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR 24C1 +ENCODING 9409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5080 +5040 +9040 +9040 +9040 +9040 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24C2 +ENCODING 9410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +6140 +B340 +B340 +AB40 +AD40 +6480 +2100 +1E00 +ENDCHAR +STARTCHAR 24C3 +ENCODING 9411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5140 +9940 +9540 +9540 +9340 +4180 +2100 +1E00 +ENDCHAR +STARTCHAR 24C4 +ENCODING 9412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4E80 +5140 +A140 +A140 +A140 +9140 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24C5 +ENCODING 9413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4E80 +5140 +9140 +9340 +9C40 +9040 +5080 +2100 +1E00 +ENDCHAR +STARTCHAR 24C6 +ENCODING 9414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4E80 +5140 +A140 +A140 +A140 +A140 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24C7 +ENCODING 9415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5E80 +5140 +9140 +9E40 +9140 +9140 +5180 +2100 +1E00 +ENDCHAR +STARTCHAR 24C8 +ENCODING 9416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4C80 +5240 +9040 +8C40 +8340 +9140 +5E80 +2100 +1E00 +ENDCHAR +STARTCHAR 24C9 +ENCODING 9417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +8440 +8440 +8440 +8440 +4480 +2100 +1E00 +ENDCHAR +STARTCHAR 24CA +ENCODING 9418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5140 +9140 +9140 +9140 +9140 +5280 +2D00 +1E00 +ENDCHAR +STARTCHAR 24CB +ENCODING 9419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5140 +9240 +9240 +8A40 +8C40 +4480 +2100 +1E00 +ENDCHAR +STARTCHAR 24CC +ENCODING 9420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +44C0 +ACC0 +AD40 +AB40 +B340 +5280 +2100 +1E00 +ENDCHAR +STARTCHAR 24CD +ENCODING 9421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5240 +8C40 +8440 +8C40 +9240 +5080 +2100 +1E00 +ENDCHAR +STARTCHAR 24CE +ENCODING 9422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5140 +9240 +8C40 +8440 +8440 +4480 +2100 +1E00 +ENDCHAR +STARTCHAR 24CF +ENCODING 9423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5F80 +4240 +8240 +8440 +8840 +9040 +5F80 +2100 +1E00 +ENDCHAR +STARTCHAR 24D0 +ENCODING 9424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9240 +8E40 +9240 +9F40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 24D1 +ENCODING 9425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5040 +9E40 +9140 +9140 +9140 +5E40 +4080 +3F00 +ENDCHAR +STARTCHAR 24D2 +ENCODING 9426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4C40 +9240 +9040 +9040 +9240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 24D3 +ENCODING 9427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4280 +4240 +8E40 +9240 +9240 +9240 +5E40 +4080 +3F00 +ENDCHAR +STARTCHAR 24D4 +ENCODING 9428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +9240 +9E40 +9040 +9240 +4C40 +4080 +3F00 +ENDCHAR +STARTCHAR 24D5 +ENCODING 9429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8840 +8840 +8840 +8840 +4840 +4880 +3F00 +ENDCHAR +STARTCHAR 24D6 +ENCODING 9430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9240 +9240 +8E40 +8240 +5E40 +4080 +3F00 +ENDCHAR +STARTCHAR 24D7 +ENCODING 9431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5040 +9040 +9E40 +9240 +9240 +5240 +4080 +3F00 +ENDCHAR +STARTCHAR 24D8 +ENCODING 9432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8040 +8440 +8440 +8440 +4440 +4080 +3F00 +ENDCHAR +STARTCHAR 24D9 +ENCODING 9433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8040 +8440 +8440 +8440 +4C40 +4080 +3F00 +ENDCHAR +STARTCHAR 24DA +ENCODING 9434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5040 +9240 +9440 +9C40 +9240 +5240 +4080 +3F00 +ENDCHAR +STARTCHAR 24DB +ENCODING 9435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8440 +8440 +8440 +8440 +4440 +4080 +3F00 +ENDCHAR +STARTCHAR 24DC +ENCODING 9436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +BB40 +A4C0 +A4C0 +A4C0 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 24DD +ENCODING 9437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +9240 +9240 +9240 +9240 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 24DE +ENCODING 9438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +8E40 +9140 +9140 +9240 +4C40 +4080 +3F00 +ENDCHAR +STARTCHAR 24DF +ENCODING 9439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +9140 +9140 +9240 +9E40 +5040 +5080 +3F00 +ENDCHAR +STARTCHAR 24E0 +ENCODING 9440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +9240 +9240 +9240 +8E40 +4240 +4080 +3F00 +ENDCHAR +STARTCHAR 24E1 +ENCODING 9441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +8C40 +8840 +8840 +8840 +4840 +4080 +3F00 +ENDCHAR +STARTCHAR 24E2 +ENCODING 9442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4E40 +9240 +8C40 +8240 +9240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 24E3 +ENCODING 9443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4840 +8840 +8840 +8840 +8840 +4440 +4080 +3F00 +ENDCHAR +STARTCHAR 24E4 +ENCODING 9444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9240 +9240 +9240 +9240 +4E40 +4080 +3F00 +ENDCHAR +STARTCHAR 24E5 +ENCODING 9445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9240 +9240 +8A40 +8C40 +4440 +4080 +3F00 +ENDCHAR +STARTCHAR 24E6 +ENCODING 9446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +A4C0 +AD40 +AD40 +9240 +5240 +4080 +3F00 +ENDCHAR +STARTCHAR 24E7 +ENCODING 9447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9240 +8C40 +8440 +8A40 +5240 +4080 +3F00 +ENDCHAR +STARTCHAR 24E8 +ENCODING 9448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5240 +9240 +8A40 +8C40 +8440 +4840 +4080 +3F00 +ENDCHAR +STARTCHAR 24E9 +ENCODING 9449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5E40 +8240 +8440 +8840 +9E40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 24EB +ENCODING 9451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7F80 +6DC0 +FFC0 +FFC0 +FFC0 +7FC0 +7F80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24EC +ENCODING 9452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6D80 +6FC0 +EFC0 +EEC0 +EDC0 +6BC0 +6880 +3F00 +0C00 +ENDCHAR +STARTCHAR 24ED +ENCODING 9453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7D80 +7EC0 +FEC0 +FDC0 +FFC0 +77C0 +7A80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24EE +ENCODING 9454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6F80 +6DC0 +EFC0 +EBC0 +EFC0 +6FC0 +6F80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24EF +ENCODING 9455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6880 +6FC0 +EFC0 +EEC0 +EFC0 +6FC0 +6A80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24F0 +ENCODING 9456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7D80 +7EC0 +FFC0 +F2C0 +F7C0 +7FC0 +7A80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24F1 +ENCODING 9457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7F80 +6FC0 +EFC0 +EDC0 +EFC0 +6FC0 +6B80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24F2 +ENCODING 9458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6D80 +6FC0 +EFC0 +E8C0 +EFC0 +77C0 +6A80 +3F00 +0C00 +ENDCHAR +STARTCHAR 24F3 +ENCODING 9459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6D80 +6FC0 +EFC0 +EF40 +EDC0 +6FC0 +6880 +3F00 +0C00 +ENDCHAR +STARTCHAR 24F4 +ENCODING 9460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6C80 +57C0 +FB40 +FB40 +EB40 +5FC0 +4480 +3F00 +0C00 +ENDCHAR +STARTCHAR 2500 +ENCODING 9472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 0 0 0 3 +BITMAP +ENDCHAR +STARTCHAR 2501 +ENCODING 9473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 1 0 3 +BITMAP +FFC0 +ENDCHAR +STARTCHAR 2502 +ENCODING 9474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 9 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2503 +ENCODING 9475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 11 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 250C +ENCODING 9484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 5 -2 +BITMAP +70 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 250D +ENCODING 9485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 5 -2 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 250E +ENCODING 9486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 6 5 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 250F +ENCODING 9487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 5 -2 +BITMAP +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2510 +ENCODING 9488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 1 -2 +BITMAP +E0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2511 +ENCODING 9489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 0 -2 +BITMAP +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2512 +ENCODING 9490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 1 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2513 +ENCODING 9491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2514 +ENCODING 9492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 5 4 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR 2515 +ENCODING 9493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 5 4 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 2516 +ENCODING 9494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 5 3 +BITMAP +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 2517 +ENCODING 9495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 5 3 +BITMAP +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 2518 +ENCODING 9496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 5 1 4 +BITMAP +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR 2519 +ENCODING 9497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 0 4 +BITMAP +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR 251A +ENCODING 9498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 0 3 +BITMAP +04 +04 +04 +04 +04 +FC +ENDCHAR +STARTCHAR 251B +ENCODING 9499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 0 3 +BITMAP +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR 251C +ENCODING 9500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 5 -1 +BITMAP +80 +80 +80 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 251D +ENCODING 9501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 5 -1 +BITMAP +80 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 251E +ENCODING 9502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 5 -2 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 251F +ENCODING 9503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 10 5 -1 +BITMAP +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2520 +ENCODING 9504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 5 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2521 +ENCODING 9505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 5 -2 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2522 +ENCODING 9506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 5 -1 +BITMAP +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2523 +ENCODING 9507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 11 5 -2 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2524 +ENCODING 9508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 1 -1 +BITMAP +10 +10 +10 +10 +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2525 +ENCODING 9509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 0 -1 +BITMAP +08 +08 +08 +08 +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2526 +ENCODING 9510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 1 -2 +BITMAP +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2527 +ENCODING 9511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 1 -1 +BITMAP +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2528 +ENCODING 9512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2529 +ENCODING 9513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 10 0 -2 +BITMAP +04 +04 +04 +04 +04 +F8 +04 +04 +04 +04 +ENDCHAR +STARTCHAR 252A +ENCODING 9514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 10 0 -1 +BITMAP +04 +04 +04 +04 +FC +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR 252B +ENCODING 9515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 252C +ENCODING 9516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 -2 +BITMAP +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 252D +ENCODING 9517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 0 -2 +BITMAP +FF80 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 252E +ENCODING 9518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 -2 +BITMAP +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 252F +ENCODING 9519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 -2 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2530 +ENCODING 9520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 -2 +BITMAP +FF +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2531 +ENCODING 9521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 0 -2 +BITMAP +FF80 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2532 +ENCODING 9522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 -2 +BITMAP +FF80 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 2533 +ENCODING 9523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 6 0 -2 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2534 +ENCODING 9524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 4 +BITMAP +08 +08 +08 +08 +FF +ENDCHAR +STARTCHAR 2535 +ENCODING 9525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 0 4 +BITMAP +0400 +0400 +0400 +0400 +FF80 +ENDCHAR +STARTCHAR 2536 +ENCODING 9526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 4 +BITMAP +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 2537 +ENCODING 9527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 4 +BITMAP +0400 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR 2538 +ENCODING 9528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 6 0 3 +BITMAP +0400 +0400 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR 2539 +ENCODING 9529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 0 3 +BITMAP +0400 +0400 +0400 +0400 +0400 +FF80 +ENDCHAR +STARTCHAR 253A +ENCODING 9530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 3 +BITMAP +0800 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 253B +ENCODING 9531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 6 0 3 +BITMAP +0400 +0400 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR 253C +ENCODING 9532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +08 +08 +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 253D +ENCODING 9533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 253E +ENCODING 9534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 253F +ENCODING 9535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2540 +ENCODING 9536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +08 +08 +08 +08 +08 +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2541 +ENCODING 9537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2542 +ENCODING 9538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +08 +08 +08 +08 +FF +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2543 +ENCODING 9539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -2 +BITMAP +0400 +0400 +0400 +0400 +0400 +FB80 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2544 +ENCODING 9540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +0800 +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 2545 +ENCODING 9541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FF80 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2546 +ENCODING 9542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 2547 +ENCODING 9543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0400 +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2548 +ENCODING 9544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2549 +ENCODING 9545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0400 +0400 +0400 +0400 +0400 +FF80 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 254A +ENCODING 9546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0800 +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 254B +ENCODING 9547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0400 +0400 +0400 +0400 +FFC0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 2592 +ENCODING 9618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +81 +81 +81 +81 +81 +81 +FF +ENDCHAR +STARTCHAR 25A0 +ENCODING 9632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR 25A1 +ENCODING 9633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +81 +81 +81 +81 +81 +81 +FF +ENDCHAR +STARTCHAR 25A3 +ENCODING 9635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +BF +BF +BF +BF +BF +81 +FF +ENDCHAR +STARTCHAR 25A4 +ENCODING 9636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +81 +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR 25A5 +ENCODING 9637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR 25A6 +ENCODING 9638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR 25A7 +ENCODING 9639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +D5 +EB +B5 +DB +AD +D7 +FF +ENDCHAR +STARTCHAR 25A8 +ENCODING 9640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +AB +D5 +AB +D5 +AB +D7 +FF +ENDCHAR +STARTCHAR 25A9 +ENCODING 9641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +BF +DF +AB +D7 +AB +D7 +FF +ENDCHAR +STARTCHAR 25B1 +ENCODING 9649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +7E +82 +82 +84 +FC +ENDCHAR +STARTCHAR 25B2 +ENCODING 9650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +08 +18 +1C +3C +7E +7F +FF +ENDCHAR +STARTCHAR 25B3 +ENCODING 9651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +08 +18 +24 +22 +42 +41 +FF +ENDCHAR +STARTCHAR 25B5 +ENCODING 9653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 1 +BITMAP +18 +14 +24 +42 +42 +FF +ENDCHAR +STARTCHAR 25B6 +ENCODING 9654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +80 +E0 +F8 +FC +F8 +F0 +C0 +80 +ENDCHAR +STARTCHAR 25B7 +ENCODING 9655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +C0 +B0 +88 +84 +88 +90 +E0 +80 +ENDCHAR +STARTCHAR 25B9 +ENCODING 9657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +C0 +A0 +98 +84 +88 +B0 +C0 +80 +ENDCHAR +STARTCHAR 25BC +ENCODING 9660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +FF +7F +7E +3C +1C +18 +08 +ENDCHAR +STARTCHAR 25BD +ENCODING 9661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +FF +41 +42 +22 +24 +18 +08 +ENDCHAR +STARTCHAR 25BF +ENCODING 9663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +FF +41 +42 +22 +24 +18 +08 +ENDCHAR +STARTCHAR 25C0 +ENCODING 9664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +02 +06 +1E +3E +FE +7E +1E +0E +02 +ENDCHAR +STARTCHAR 25C1 +ENCODING 9665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +02 +0E +12 +62 +82 +42 +32 +0A +06 +ENDCHAR +STARTCHAR 25C3 +ENCODING 9667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +02 +06 +1A +22 +C2 +62 +12 +0E +02 +ENDCHAR +STARTCHAR 25C6 +ENCODING 9670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +0800 +1C00 +3E00 +7F00 +FF80 +FF80 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR 25C7 +ENCODING 9671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +0800 +1400 +2200 +4100 +8080 +8080 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR 25C8 +ENCODING 9672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0C00 +1200 +2D00 +5E80 +BF40 +5E80 +2D00 +1200 +0C00 +ENDCHAR +STARTCHAR 25C9 +ENCODING 9673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3E +41 +81 +99 +BD +99 +81 +41 +3E +ENDCHAR +STARTCHAR 25CA +ENCODING 9674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +18 +24 +42 +C1 +42 +22 +14 +18 +ENDCHAR +STARTCHAR 25CB +ENCODING 9675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +3C +42 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR 25CC +ENCODING 9676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +4000 +0040 +0000 +8000 +0000 +0040 +0000 +0000 +0400 +ENDCHAR +STARTCHAR 25CE +ENCODING 9678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +BD00 +C280 +C280 +C280 +BD00 +4200 +3C00 +ENDCHAR +STARTCHAR 25CF +ENCODING 9679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +3C +7E +FF +FF +FF +FF +7E +3C +ENDCHAR +STARTCHAR 25D0 +ENCODING 9680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +1C +72 +71 +F1 +F1 +F1 +F1 +71 +3E +ENDCHAR +STARTCHAR 25D1 +ENCODING 9681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +38 +4E +8F +8F +8F +8F +8F +4E +3C +ENDCHAR +STARTCHAR 25E6 +ENCODING 9702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +78 +84 +84 +84 +4C +30 +ENDCHAR +STARTCHAR 25EF +ENCODING 9711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR 2605 +ENCODING 9733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +08 +18 +FF +3E +3C +3C +26 +42 +ENDCHAR +STARTCHAR 2606 +ENCODING 9734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +08 +18 +E7 +62 +24 +3A +66 +40 +ENDCHAR +STARTCHAR 260E +ENCODING 9742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 7 0 0 +BITMAP +1E00 +7780 +FFC0 +1240 +3100 +7180 +7F80 +ENDCHAR +STARTCHAR 260F +ENCODING 9743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 7 0 0 +BITMAP +3E00 +55C0 +9D40 +7BC0 +3280 +5280 +7F80 +ENDCHAR +STARTCHAR 261C +ENCODING 9756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 3 1 2 +BITMAP +FF +29 +1F +ENDCHAR +STARTCHAR 261D +ENCODING 9757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 8 4 -1 +BITMAP +80 +80 +80 +E0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR 261E +ENCODING 9758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 3 1 2 +BITMAP +FF +94 +F8 +ENDCHAR +STARTCHAR 261F +ENCODING 9759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 8 4 0 +BITMAP +C0 +A0 +A0 +A0 +E0 +E0 +80 +80 +ENDCHAR +STARTCHAR 262F +ENCODING 9775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3C +42 +81 +83 +8F +9F +FF +7E +3C +ENDCHAR +STARTCHAR 2640 +ENCODING 9792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 8 3 -1 +BITMAP +70 +90 +90 +50 +20 +F0 +20 +20 +ENDCHAR +STARTCHAR 2642 +ENCODING 9794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +20 +50 +A8 +20 +20 +50 +90 +90 +70 +ENDCHAR +STARTCHAR 2660 +ENCODING 9824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +10 +30 +78 +7C +FC +FE +FE +30 +30 +ENDCHAR +STARTCHAR 2661 +ENCODING 9825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +FF +89 +81 +41 +42 +22 +14 +08 +ENDCHAR +STARTCHAR 2663 +ENCODING 9827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +3C00 +3C00 +1800 +FF00 +FF80 +FF00 +7B00 +1800 +ENDCHAR +STARTCHAR 2664 +ENCODING 9828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +10 +28 +48 +84 +82 +82 +A2 +7C +38 +ENDCHAR +STARTCHAR 2665 +ENCODING 9829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +77 +FF +FF +7F +7E +3C +1C +08 +ENDCHAR +STARTCHAR 2667 +ENCODING 9831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +2400 +5600 +B500 +8080 +9080 +7F00 +1C00 +ENDCHAR +STARTCHAR 2668 +ENCODING 9832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +0800 +3400 +2C00 +2C00 +6C00 +AC80 +A100 +7E00 +ENDCHAR +STARTCHAR 2669 +ENCODING 9833 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 7 1 0 +BITMAP +40 +40 +40 +40 +40 +C0 +80 +ENDCHAR +STARTCHAR 266A +ENCODING 9834 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +60 +50 +50 +50 +40 +C0 +80 +ENDCHAR +STARTCHAR 266C +ENCODING 9836 +SWIDTH 720 0 +DWIDTH 8 0 +BBX 6 8 1 -1 +BITMAP +1C +64 +7C +44 +44 +4C +C8 +80 +ENDCHAR +STARTCHAR 266D +ENCODING 9837 +SWIDTH 540 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +E0 +90 +90 +A0 +E0 +ENDCHAR +STARTCHAR 266F +ENCODING 9839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +08 +08 +5C +E8 +48 +48 +FC +48 +08 +ENDCHAR +STARTCHAR 2716 +ENCODING 10006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -1 +BITMAP +66 +FF +7E +3C +7E +FF +66 +ENDCHAR +STARTCHAR 271A +ENCODING 10010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +1C +1C +1C +FF +FF +FF +1C +1C +1C +ENDCHAR +STARTCHAR 273D +ENCODING 10045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +10 +DC +10 +4C +10 +10 +ENDCHAR +STARTCHAR 2756 +ENCODING 10070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +18 +1C +4A +E7 +63 +18 +1C +08 +ENDCHAR +STARTCHAR 2776 +ENCODING 10102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7B80 +73C0 +FBC0 +FBC0 +FBC0 +7BC0 +7B80 +3F00 +0C00 +ENDCHAR +STARTCHAR 2777 +ENCODING 10103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7180 +6FC0 +FFC0 +FDC0 +F7C0 +6FC0 +6180 +3F00 +0C00 +ENDCHAR +STARTCHAR 2778 +ENCODING 10104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +6FC0 +FDC0 +FBC0 +FFC0 +6FC0 +7580 +3F00 +0C00 +ENDCHAR +STARTCHAR 2779 +ENCODING 10105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7B80 +7FC0 +F7C0 +EFC0 +FFC0 +7FC0 +7F80 +3F00 +0C00 +ENDCHAR +STARTCHAR 277A +ENCODING 10106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7180 +7FC0 +EFC0 +EDC0 +FFC0 +6FC0 +7580 +3F00 +0C00 +ENDCHAR +STARTCHAR 277B +ENCODING 10107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +6DC0 +EFC0 +EDC0 +EFC0 +6FC0 +7580 +3F00 +0C00 +ENDCHAR +STARTCHAR 277C +ENCODING 10108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7F80 +7DC0 +FFC0 +FBC0 +FFC0 +77C0 +7780 +3F00 +0C00 +ENDCHAR +STARTCHAR 277D +ENCODING 10109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +6DC0 +EDC0 +F3C0 +EFC0 +6FC0 +6D80 +3F00 +0C00 +ENDCHAR +STARTCHAR 277E +ENCODING 10110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +6DC0 +EFC0 +EDC0 +F3C0 +6FC0 +7580 +3F00 +0C00 +ENDCHAR +STARTCHAR 277F +ENCODING 10111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6D80 +6AC0 +EFC0 +EFC0 +EFC0 +6FC0 +6A80 +3F00 +0C00 +ENDCHAR +STARTCHAR 278A +ENCODING 10122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7B80 +73C0 +FBC0 +FBC0 +FBC0 +7BC0 +7B80 +3F00 +0C00 +ENDCHAR +STARTCHAR 278B +ENCODING 10123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7180 +75C0 +FDC0 +FBC0 +FBC0 +77C0 +6180 +3F00 +0C00 +ENDCHAR +STARTCHAR 278C +ENCODING 10124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +75C0 +FDC0 +FBC0 +FDC0 +75C0 +7180 +3F00 +0C00 +ENDCHAR +STARTCHAR 278D +ENCODING 10125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7B80 +73C0 +F3C0 +EBC0 +E1C0 +61C0 +7B80 +3F00 +0C00 +ENDCHAR +STARTCHAR 278E +ENCODING 10126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7180 +77C0 +F3C0 +F1C0 +FDC0 +75C0 +7180 +3F00 +0C00 +ENDCHAR +STARTCHAR 278F +ENCODING 10127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +75C0 +F7C0 +F1C0 +F5C0 +75C0 +7180 +3F00 +0C00 +ENDCHAR +STARTCHAR 2790 +ENCODING 10128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7180 +7DC0 +F9C0 +FBC0 +FBC0 +7BC0 +7380 +3F00 +0C00 +ENDCHAR +STARTCHAR 2791 +ENCODING 10129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +75C0 +F5C0 +F3C0 +E5C0 +65C0 +7180 +3F00 +0C00 +ENDCHAR +STARTCHAR 2792 +ENCODING 10130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +7380 +75C0 +E5C0 +F1C0 +FDC0 +75C0 +7180 +3F00 +0C00 +ENDCHAR +STARTCHAR 2793 +ENCODING 10131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1F00 +6D80 +4AC0 +EAC0 +EAC0 +EAC0 +6AC0 +6880 +3F00 +0C00 +ENDCHAR +STARTCHAR 2963 +ENCODING 10595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +5600 +9500 +1480 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR 2965 +ENCODING 10597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +14 +14 +14 +14 +14 +95 +55 +26 +24 +ENDCHAR +STARTCHAR 2AC5 +ENCODING 10949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7E +80 +80 +80 +7F +00 +7E +ENDCHAR +STARTCHAR 2AC6 +ENCODING 10950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7E +01 +01 +01 +FE +00 +7E +ENDCHAR +STARTCHAR 2ACB +ENCODING 10955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +7E +80 +80 +80 +7F +7E +08 +76 +ENDCHAR +STARTCHAR 2ACC +ENCODING 10956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +7E +01 +01 +01 +FE +7E +08 +76 +ENDCHAR +STARTCHAR 2F00 +ENCODING 12032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 1 1 3 +BITMAP +FF80 +ENDCHAR +STARTCHAR 2F04 +ENCODING 12036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +0400 +0800 +1000 +2000 +2000 +4080 +8100 +7F00 +ENDCHAR +STARTCHAR 2F06 +ENCODING 12038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7F +00 +00 +00 +00 +00 +FF +ENDCHAR +STARTCHAR 2F08 +ENCODING 12040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +08 +18 +18 +14 +22 +43 +81 +ENDCHAR +STARTCHAR 2F0A +ENCODING 12042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +78 +08 +08 +08 +18 +14 +22 +43 +81 +ENDCHAR +STARTCHAR 2F0B +ENCODING 12043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +0400 +2400 +2400 +2200 +4200 +4200 +8100 +8080 +ENDCHAR +STARTCHAR 2F11 +ENCODING 12049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +11 +11 +11 +11 +21 +21 +41 +86 +ENDCHAR +STARTCHAR 2F12 +ENCODING 12050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +FF +11 +11 +11 +21 +21 +41 +86 +ENDCHAR +STARTCHAR 2F14 +ENCODING 12052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +80 +84 +88 +B0 +C0 +80 +82 +82 +FE +ENDCHAR +STARTCHAR 2F17 +ENCODING 12055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +08 +08 +FF +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2F18 +ENCODING 12056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 10 4 -1 +BITMAP +80 +80 +80 +C0 +A0 +90 +90 +80 +80 +80 +ENDCHAR +STARTCHAR 2F1C +ENCODING 12060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +2200 +2400 +1800 +1800 +1400 +6300 +8180 +ENDCHAR +STARTCHAR 2F1D +ENCODING 12061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +FE +82 +82 +82 +82 +82 +FE +82 +ENDCHAR +STARTCHAR 2F1F +ENCODING 12063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +0800 +0800 +FF00 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 2F20 +ENCODING 12064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +0800 +FF00 +ENDCHAR +STARTCHAR 2F23 +ENCODING 12067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +1F +22 +42 +52 +8C +08 +30 +C0 +ENDCHAR +STARTCHAR 2F24 +ENCODING 12068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +FF00 +0800 +1800 +1400 +2200 +4100 +8080 +ENDCHAR +STARTCHAR 2F25 +ENCODING 12069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +10 +FF +22 +24 +34 +0C +33 +C1 +ENDCHAR +STARTCHAR 2F26 +ENCODING 12070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +0400 +0800 +0800 +FF80 +0800 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 2F28 +ENCODING 12072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +04 +04 +FF +04 +44 +24 +24 +04 +0C +ENDCHAR +STARTCHAR 2F29 +ENCODING 12073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +4A00 +4A00 +4A00 +4900 +8900 +8880 +0800 +3000 +ENDCHAR +STARTCHAR 2F2B +ENCODING 12075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +7F +40 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2F2D +ENCODING 12077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +89 +89 +89 +89 +89 +FF +81 +ENDCHAR +STARTCHAR 2F2F +ENCODING 12079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +08 +08 +08 +08 +08 +08 +FF +ENDCHAR +STARTCHAR 2F30 +ENCODING 12080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +0100 +0100 +7E00 +8100 +8000 +8080 +8100 +7F00 +ENDCHAR +STARTCHAR 2F31 +ENCODING 12081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +10 +10 +FE +92 +92 +92 +92 +96 +10 +10 +ENDCHAR +STARTCHAR 2F32 +ENCODING 12082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +08 +08 +08 +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 2F38 +ENCODING 12088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +01 +7E +40 +40 +7F +81 +01 +07 +ENDCHAR +STARTCHAR 2F3C +ENCODING 12092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1000 +0800 +2000 +2200 +6100 +A100 +A080 +2200 +3E00 +ENDCHAR +STARTCHAR 2F3D +ENCODING 12093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +12 +1F +F0 +11 +0E +0C +19 +75 +C3 +ENDCHAR +STARTCHAR 2F3E +ENCODING 12094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +7C +7F +41 +41 +7F +80 +80 +80 +ENDCHAR +STARTCHAR 2F3F +ENCODING 12095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +F800 +0800 +FF00 +0800 +FF80 +0800 +0800 +3800 +ENDCHAR +STARTCHAR 2F40 +ENCODING 12096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +0800 +FE00 +2200 +1400 +0800 +7600 +C100 +ENDCHAR +STARTCHAR 2F42 +ENCODING 12098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +42 +24 +34 +18 +18 +66 +81 +ENDCHAR +STARTCHAR 2F43 +ENCODING 12099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0400 +3400 +0400 +6400 +0400 +1F80 +FC00 +0400 +0400 +ENDCHAR +STARTCHAR 2F44 +ENCODING 12100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +06 +78 +40 +7F +44 +84 +84 +84 +84 +ENDCHAR +STARTCHAR 2F45 +ENCODING 12101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +2000 +3E00 +2100 +2100 +4200 +C200 +8E00 +ENDCHAR +STARTCHAR 2F46 +ENCODING 12102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +10 +10 +FF +18 +18 +28 +49 +8F +ENDCHAR +STARTCHAR 2F47 +ENCODING 12103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +FC +84 +84 +84 +FC +84 +84 +FC +84 +ENDCHAR +STARTCHAR 2F48 +ENCODING 12104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FE +02 +02 +02 +FE +02 +02 +FE +02 +ENDCHAR +STARTCHAR 2F49 +ENCODING 12105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 1 -1 +BITMAP +7E +42 +7E +42 +42 +7E +42 +42 +86 +ENDCHAR +STARTCHAR 2F4A +ENCODING 12106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +1800 +2C00 +2A00 +C900 +8880 +0800 +0800 +ENDCHAR +STARTCHAR 2F4B +ENCODING 12107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +2000 +3F00 +4900 +8A00 +9800 +1800 +2400 +4300 +8180 +ENDCHAR +STARTCHAR 2F4C +ENCODING 12108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +4800 +4F00 +4800 +4800 +4800 +4800 +FF80 +ENDCHAR +STARTCHAR 2F4F +ENCODING 12111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +4900 +FF80 +5200 +5200 +7F00 +8200 +8600 +ENDCHAR +STARTCHAR 2F50 +ENCODING 12112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4800 +4800 +4900 +7600 +4800 +4800 +4880 +7880 +C700 +ENDCHAR +STARTCHAR 2F51 +ENCODING 12113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7800 +0F00 +F000 +3F00 +D000 +1000 +1080 +0F00 +ENDCHAR +STARTCHAR 2F52 +ENCODING 12114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +7800 +4800 +4800 +7F00 +4400 +4400 +7A80 +E300 +ENDCHAR +STARTCHAR 2F54 +ENCODING 12116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +08 +E9 +2A +2C +4C +8B +89 +38 +ENDCHAR +STARTCHAR 2F55 +ENCODING 12117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +49 +49 +5A +9A +14 +26 +43 +81 +ENDCHAR +STARTCHAR 2F56 +ENCODING 12118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0F00 +7200 +4A00 +4A00 +4A00 +4900 +4900 +8900 +8880 +ENDCHAR +STARTCHAR 2F57 +ENCODING 12119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +4300 +A300 +6400 +6400 +1800 +1800 +6600 +8180 +ENDCHAR +STARTCHAR 2F58 +ENCODING 12120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C600 +3800 +7600 +E100 +6200 +6400 +1800 +1800 +7600 +C180 +ENDCHAR +STARTCHAR 2F5A +ENCODING 12122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +4800 +7F80 +4000 +7C00 +4400 +8400 +8400 +8400 +ENDCHAR +STARTCHAR 2F5B +ENCODING 12123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2400 +2400 +FF80 +0C00 +1400 +2400 +4400 +8C00 +ENDCHAR +STARTCHAR 2F5C +ENCODING 12124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4800 +7F00 +8800 +8800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 2F5D +ENCODING 12125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0C00 +0A00 +0900 +FF00 +0800 +1800 +1400 +2200 +C300 +8080 +ENDCHAR +STARTCHAR 2F5E +ENCODING 12126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +1000 +6200 +6400 +1A00 +1100 +2700 +F880 +ENDCHAR +STARTCHAR 2F5F +ENCODING 12127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +08 +08 +7F +0C +0A +08 +FF +ENDCHAR +STARTCHAR 2F60 +ENCODING 12128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +7E00 +5200 +5200 +5200 +5200 +5500 +BD00 +8280 +ENDCHAR +STARTCHAR 2F61 +ENCODING 12129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2000 +3C00 +2200 +3400 +4C00 +4400 +4C80 +F700 +ENDCHAR +STARTCHAR 2F62 +ENCODING 12130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +22 +22 +FF +22 +22 +3E +22 +22 +3E +22 +ENDCHAR +STARTCHAR 2F63 +ENCODING 12131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +7F00 +8800 +8800 +0800 +7E00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 2F64 +ENCODING 12132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +49 +7F +49 +49 +7F +89 +89 +8B +ENDCHAR +STARTCHAR 2F65 +ENCODING 12133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +FE +12 +12 +FE +12 +12 +12 +FE +ENDCHAR +STARTCHAR 2F66 +ENCODING 12134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0900 +0900 +4800 +4F00 +4800 +4800 +B800 +8F80 +ENDCHAR +STARTCHAR 2F69 +ENCODING 12137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +20 +20 +FE +82 +82 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR 2F6A +ENCODING 12138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7F +49 +49 +7F +62 +54 +8C +9E +E1 +ENDCHAR +STARTCHAR 2F6B +ENCODING 12139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +7F00 +9500 +9500 +9500 +9500 +9500 +9500 +FF80 +ENDCHAR +STARTCHAR 2F6C +ENCODING 12140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FE +82 +FE +82 +82 +FE +82 +FE +82 +ENDCHAR +STARTCHAR 2F6D +ENCODING 12141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +34 +08 +FF +19 +2A +48 +88 +18 +ENDCHAR +STARTCHAR 2F6E +ENCODING 12142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2000 +7F00 +4800 +8800 +FF00 +1800 +1400 +6200 +8180 +ENDCHAR +STARTCHAR 2F6F +ENCODING 12143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +2000 +2000 +2000 +7F00 +C100 +C100 +3F00 +4100 +ENDCHAR +STARTCHAR 2F70 +ENCODING 12144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +00 +00 +FF +4A +4A +49 +89 +18 +ENDCHAR +STARTCHAR 2F72 +ENCODING 12146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7800 +0800 +FF80 +1800 +2C00 +4B00 +8880 +0800 +ENDCHAR +STARTCHAR 2F73 +ENCODING 12147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +BD00 +0400 +2200 +2200 +4200 +C100 +8080 +ENDCHAR +STARTCHAR 2F74 +ENCODING 12148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +0000 +4200 +2200 +2400 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 2F75 +ENCODING 12149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +7780 +AA00 +AA00 +2200 +2200 +2200 +2200 +2600 +ENDCHAR +STARTCHAR 2F76 +ENCODING 12150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +49 +2A +08 +FF +18 +2C +4B +89 +08 +ENDCHAR +STARTCHAR 2F78 +ENCODING 12152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2000 +7F00 +8800 +0800 +FF80 +8900 +8900 +7F00 +8100 +ENDCHAR +STARTCHAR 2F7A +ENCODING 12154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +FF00 +0800 +7F00 +0800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 2F7B +ENCODING 12155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +31 +33 +D5 +99 +77 +99 +11 +33 +ENDCHAR +STARTCHAR 2F7C +ENCODING 12156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1100 +7E00 +1400 +FF80 +1800 +6200 +BC00 +2100 +3F00 +ENDCHAR +STARTCHAR 2F7D +ENCODING 12157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +10 +FF +A5 +A5 +A5 +A5 +A5 +83 +ENDCHAR +STARTCHAR 2F7F +ENCODING 12159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +3E00 +4200 +3E00 +4200 +FF80 +0200 +0200 +ENDCHAR +STARTCHAR 2F80 +ENCODING 12160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7E +09 +FF +7E +08 +FF +FF +08 +08 +ENDCHAR +STARTCHAR 2F81 +ENCODING 12161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +99 +AD +DB +BD +E3 +81 +83 +ENDCHAR +STARTCHAR 2F82 +ENCODING 12162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +88 +FF +81 +81 +FF +88 +FF +80 +ENDCHAR +STARTCHAR 2F83 +ENCODING 12163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +10 +20 +FE +82 +FE +82 +FE +82 +FE +82 +ENDCHAR +STARTCHAR 2F84 +ENCODING 12164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +22 +2E +F1 +08 +08 +7F +08 +FF +ENDCHAR +STARTCHAR 2F85 +ENCODING 12165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +EF +81 +81 +FF +81 +81 +FF +81 +ENDCHAR +STARTCHAR 2F86 +ENCODING 12166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7C00 +0800 +FF80 +0800 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 2F87 +ENCODING 12167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +7F00 +9A00 +DA00 +AA00 +3F80 +4200 +C200 +8200 +ENDCHAR +STARTCHAR 2F88 +ENCODING 12168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +7E +52 +4A +42 +FF +4A +4A +4A +86 +ENDCHAR +STARTCHAR 2F89 +ENCODING 12169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +42 +7E +51 +4E +5E +E1 +ENDCHAR +STARTCHAR 2F8A +ENCODING 12170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +3C +48 +FF +C9 +49 +7F +40 +41 +7F +ENDCHAR +STARTCHAR 2F8B +ENCODING 12171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +42 +DB +DB +DB +DB +DB +FF +42 +42 +82 +ENDCHAR +STARTCHAR 2F8E +ENCODING 12174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +1000 +7F00 +5500 +5500 +5500 +5500 +5500 +5500 +FF80 +ENDCHAR +STARTCHAR 2F8F +ENCODING 12175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +4F00 +A000 +4000 +5F80 +C200 +C200 +4200 +4200 +4600 +ENDCHAR +STARTCHAR 2F90 +ENCODING 12176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +1800 +1900 +2600 +E600 +A200 +2900 +7080 +ENDCHAR +STARTCHAR 2F92 +ENCODING 12178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +7E00 +4200 +7E00 +7E00 +1400 +2480 +C700 +ENDCHAR +STARTCHAR 2F93 +ENCODING 12179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +3C +44 +FF +7F +49 +49 +7F +81 +83 +ENDCHAR +STARTCHAR 2F94 +ENCODING 12180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF80 +0000 +7E00 +7E00 +0000 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 2F95 +ENCODING 12181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +42 +99 +24 +42 +FF +42 +7E +42 +ENDCHAR +STARTCHAR 2F96 +ENCODING 12182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0000 +7E00 +4200 +7E00 +0000 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 2F97 +ENCODING 12183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +18 +75 +96 +6C +DA +69 +89 +18 +ENDCHAR +STARTCHAR 2F99 +ENCODING 12185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +42 +7E +42 +7E +66 +81 +ENDCHAR +STARTCHAR 2F9A +ENCODING 12186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +0800 +0800 +FF00 +5600 +5500 +A500 +A480 +4C00 +ENDCHAR +STARTCHAR 2F9B +ENCODING 12187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +7E00 +0800 +FF00 +2800 +4E00 +4800 +6800 +9F80 +ENDCHAR +STARTCHAR 2F9C +ENCODING 12188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +4200 +7E00 +4800 +4F00 +4800 +B800 +9F80 +ENDCHAR +STARTCHAR 2F9D +ENCODING 12189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +7E80 +4300 +FE00 +0A00 +7200 +8600 +ENDCHAR +STARTCHAR 2F9E +ENCODING 12190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +7E00 +7E00 +4A00 +7E00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 2F9F +ENCODING 12191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2200 +2400 +FF80 +0800 +FF00 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 2FA0 +ENCODING 12192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +40 +7F +40 +7F +6E +A6 +AB +F1 +ENDCHAR +STARTCHAR 2FA2 +ENCODING 12194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +0000 +FF00 +8900 +FF00 +8000 +8080 +7F00 +ENDCHAR +STARTCHAR 2FA3 +ENCODING 12195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +18 +7F +A9 +AF +7F +81 +7F +81 +ENDCHAR +STARTCHAR 2FA5 +ENCODING 12197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4900 +7E00 +4900 +7E00 +0800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 2FA6 +ENCODING 12198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +4300 +BF80 +0800 +7F00 +4A00 +2C00 +FF80 +ENDCHAR +STARTCHAR 2FA7 +ENCODING 12199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7E +FF +4A +4C +5E +E1 +ENDCHAR +STARTCHAR 2FA8 +ENCODING 12200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +99 +FF +81 +81 +81 +81 +83 +ENDCHAR +STARTCHAR 2FA9 +ENCODING 12201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +7F00 +4100 +7F00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 2FAC +ENCODING 12204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +FF +ED +AB +ED +AB +89 +8B +ENDCHAR +STARTCHAR 2FAD +ENCODING 12205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +FF80 +0000 +7E00 +4900 +7E00 +4100 +4600 +ENDCHAR +STARTCHAR 2FAE +ENCODING 12206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +1400 +E780 +1400 +E700 +2400 +E780 +2400 +4400 +4400 +ENDCHAR +STARTCHAR 2FAF +ENCODING 12207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +1000 +FF00 +A500 +9D00 +A500 +9D00 +FF00 +8100 +ENDCHAR +STARTCHAR 2FB0 +ENCODING 12208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +3C00 +0800 +7F00 +8900 +7F00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 2FB1 +ENCODING 12209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +FF00 +0000 +7E00 +7E00 +FF00 +4800 +FF80 +0800 +ENDCHAR +STARTCHAR 2FB3 +ENCODING 12211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +FF +00 +7E +42 +7E +7E +42 +ENDCHAR +STARTCHAR 2FB4 +ENCODING 12212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +10 +7E +7E +42 +7E +7E +26 +C1 +ENDCHAR +STARTCHAR 2FB5 +ENCODING 12213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +8D00 +B100 +BD00 +B500 +BD00 +9580 +8D80 +F380 +ENDCHAR +STARTCHAR 2FB6 +ENCODING 12214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FD00 +3600 +D300 +5280 +FD00 +5500 +5300 +5280 +9100 +ENDCHAR +STARTCHAR 2FB7 +ENCODING 12215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +7E00 +8180 +7E00 +7E00 +7E00 +4900 +5E00 +E100 +ENDCHAR +STARTCHAR 2FB8 +ENCODING 12216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +FF +10 +7E +42 +7E +7E +7E +42 +ENDCHAR +STARTCHAR 2FB9 +ENCODING 12217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +7800 +FF00 +1400 +6A00 +FF80 +4200 +7E00 +4200 +7E00 +ENDCHAR +STARTCHAR 2FBA +ENCODING 12218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +48 +7E +7E +48 +7F +AD +AB +A3 +ENDCHAR +STARTCHAR 2FBB +ENCODING 12219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +4E +52 +FF +FF +7E +42 +7E +46 +ENDCHAR +STARTCHAR 2FBC +ENCODING 12220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +7E00 +0000 +FF00 +BD00 +BD00 +A100 +8300 +ENDCHAR +STARTCHAR 2FC1 +ENCODING 12225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4900 +7E00 +4900 +7E00 +2A00 +2F00 +4880 +8F00 +ENDCHAR +STARTCHAR 2FC2 +ENCODING 12226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3C00 +4800 +FE00 +C900 +7E00 +7E00 +4100 +9500 +9480 +ENDCHAR +STARTCHAR 2FC3 +ENCODING 12227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +7E00 +4200 +7E00 +7F80 +7F00 +0500 +AB00 +AB00 +ENDCHAR +STARTCHAR 2FC4 +ENCODING 12228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +1F +10 +FF +AD +DB +BF +AB +FF +81 +ENDCHAR +STARTCHAR 2FC5 +ENCODING 12229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9400 +FF00 +FF00 +A400 +A500 +BE00 +BC80 +E700 +ENDCHAR +STARTCHAR 2FC6 +ENCODING 12230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2A00 +6A00 +3500 +6A00 +BF80 +5400 +1C00 +E300 +ENDCHAR +STARTCHAR 2FC7 +ENCODING 12231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +A200 +F700 +A200 +F700 +F700 +F780 +EB80 +A200 +ENDCHAR +STARTCHAR 2FC8 +ENCODING 12232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +3C00 +FF80 +0800 +7E00 +7E00 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 2FC9 +ENCODING 12233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7C00 +FF00 +6E00 +9980 +6E00 +AB80 +3C00 +4E00 +9100 +ENDCHAR +STARTCHAR 2FCA +ENCODING 12234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +6B00 +6D00 +7F00 +7F00 +FF80 +0000 +A500 +9480 +ENDCHAR +STARTCHAR 2FCD +ENCODING 12237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +BD00 +BD00 +BD00 +8100 +F700 +F780 +5500 +9500 +ENDCHAR +STARTCHAR 2FCE +ENCODING 12238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F200 +FF80 +0200 +FF00 +F500 +0600 +A600 +7D00 +C880 +ENDCHAR +STARTCHAR 2FCF +ENCODING 12239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8100 +FF00 +FF00 +B600 +B600 +B600 +B580 +D900 +ENDCHAR +STARTCHAR 2FD0 +ENCODING 12240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +0000 +7F00 +8900 +FF80 +3C00 +C400 +ENDCHAR +STARTCHAR 2FD1 +ENCODING 12241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +FF00 +AD00 +EE80 +4200 +7E00 +7E00 +8200 +8200 +ENDCHAR +STARTCHAR 2FD2 +ENCODING 12242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +2F00 +FF80 +A500 +BB00 +C900 +FF00 +A500 +DB00 +FF00 +ENDCHAR +STARTCHAR 2FD3 +ENCODING 12243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +F700 +A700 +F100 +F700 +9700 +F700 +F700 +9880 +B700 +ENDCHAR +STARTCHAR 2FD4 +ENCODING 12244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7C00 +FF00 +7700 +D700 +F500 +1B00 +F700 +3880 +5F00 +ENDCHAR +STARTCHAR 3000 +ENCODING 12288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 3001 +ENCODING 12289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 2 1 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR 3002 +ENCODING 12290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 3 1 -2 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR 3003 +ENCODING 12291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 2 3 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR 3008 +ENCODING 12296 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 8 1 -1 +BITMAP +10 +20 +40 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR 3009 +ENCODING 12297 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 7 1 0 +BITMAP +80 +40 +20 +10 +20 +40 +80 +ENDCHAR +STARTCHAR 300A +ENCODING 12298 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 4 8 0 -1 +BITMAP +30 +20 +60 +C0 +C0 +60 +20 +30 +ENDCHAR +STARTCHAR 300B +ENCODING 12299 +SWIDTH 450 0 +DWIDTH 5 0 +BBX 3 8 1 -1 +BITMAP +C0 +A0 +60 +20 +20 +60 +A0 +C0 +ENDCHAR +STARTCHAR 300C +ENCODING 12300 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 300D +ENCODING 12301 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 5 0 -1 +BITMAP +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR 300E +ENCODING 12302 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 5 0 3 +BITMAP +F0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 300F +ENCODING 12303 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 4 0 -1 +BITMAP +30 +30 +30 +F0 +ENDCHAR +STARTCHAR 3010 +ENCODING 12304 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 0 -1 +BITMAP +E0 +C0 +C0 +80 +80 +80 +C0 +C0 +E0 +ENDCHAR +STARTCHAR 3011 +ENCODING 12305 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 1 -1 +BITMAP +E0 +60 +60 +20 +20 +20 +60 +60 +E0 +ENDCHAR +STARTCHAR 3012 +ENCODING 12306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +0000 +0000 +FF80 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 3013 +ENCODING 12307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 3 3 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR 3014 +ENCODING 12308 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 10 1 -2 +BITMAP +40 +80 +00 +00 +00 +00 +00 +00 +80 +40 +ENDCHAR +STARTCHAR 3015 +ENCODING 12309 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 2 10 1 -2 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR 3016 +ENCODING 12310 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 1 -1 +BITMAP +E0 +C0 +C0 +80 +80 +80 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 3017 +ENCODING 12311 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 1 -1 +BITMAP +E0 +A0 +A0 +60 +60 +60 +A0 +A0 +E0 +ENDCHAR +STARTCHAR 3018 +ENCODING 12312 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 10 1 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +E0 +60 +ENDCHAR +STARTCHAR 3019 +ENCODING 12313 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 9 1 -2 +BITMAP +80 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR 301C +ENCODING 12316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 3 2 2 +BITMAP +60 +94 +08 +ENDCHAR +STARTCHAR 301E +ENCODING 12318 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 4 2 0 5 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR 301F +ENCODING 12319 +SWIDTH 360 0 +DWIDTH 4 0 +BBX 3 2 1 -1 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR 3020 +ENCODING 12320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +38 +36 +AF +88 +64 +55 +3E +ENDCHAR +STARTCHAR 3036 +ENCODING 12342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +7F40 +8040 +BF40 +8440 +8440 +4480 +2500 +1E00 +ENDCHAR +STARTCHAR 3041 +ENCODING 12353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +20 +70 +28 +74 +B4 +E4 +08 +ENDCHAR +STARTCHAR 3042 +ENCODING 12354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +1C +30 +14 +2A +59 +91 +72 +04 +ENDCHAR +STARTCHAR 3043 +ENCODING 12355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 0 +BITMAP +80 +84 +84 +84 +60 +ENDCHAR +STARTCHAR 3044 +ENCODING 12356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 0 +BITMAP +80 +82 +81 +81 +50 +20 +ENDCHAR +STARTCHAR 3045 +ENCODING 12357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +20 +20 +D0 +10 +10 +10 +20 +ENDCHAR +STARTCHAR 3046 +ENCODING 12358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +40 +30 +00 +F0 +88 +08 +08 +10 +20 +ENDCHAR +STARTCHAR 3047 +ENCODING 12359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +20 +00 +E0 +40 +60 +A0 +18 +ENDCHAR +STARTCHAR 3048 +ENCODING 12360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +20 +10 +00 +F8 +10 +30 +50 +90 +0E +ENDCHAR +STARTCHAR 3049 +ENCODING 12361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +40 +64 +40 +78 +C4 +CC +40 +ENDCHAR +STARTCHAR 304A +ENCODING 12362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +20 +73 +21 +3C +62 +A2 +A2 +64 +ENDCHAR +STARTCHAR 304B +ENCODING 12363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +10 +3A +E5 +24 +44 +44 +88 +10 +ENDCHAR +STARTCHAR 304C +ENCODING 12364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +21 +32 +E9 +49 +48 +48 +88 +90 +ENDCHAR +STARTCHAR 304D +ENCODING 12365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +20 +38 +54 +38 +48 +38 +CC +80 +70 +ENDCHAR +STARTCHAR 304E +ENCODING 12366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +42 +74 +A0 +38 +D0 +70 +98 +80 +E0 +ENDCHAR +STARTCHAR 304F +ENCODING 12367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 8 3 0 +BITMAP +20 +20 +40 +80 +40 +20 +20 +10 +ENDCHAR +STARTCHAR 3050 +ENCODING 12368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +20 +4C +40 +80 +40 +20 +20 +10 +ENDCHAR +STARTCHAR 3051 +ENCODING 12369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +44 +4F +84 +84 +A4 +C4 +44 +08 +ENDCHAR +STARTCHAR 3052 +ENCODING 12370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +89 +8A +BC +88 +C8 +88 +88 +10 +ENDCHAR +STARTCHAR 3053 +ENCODING 12371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +78 +00 +00 +00 +00 +80 +7C +ENDCHAR +STARTCHAR 3054 +ENCODING 12372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +01 +32 +08 +00 +00 +00 +80 +7C +ENDCHAR +STARTCHAR 3055 +ENCODING 12373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +20 +24 +78 +10 +08 +7C +80 +40 +70 +ENDCHAR +STARTCHAR 3056 +ENCODING 12374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +21 +22 +78 +10 +08 +7C +80 +40 +70 +ENDCHAR +STARTCHAR 3057 +ENCODING 12375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +84 +8C +78 +ENDCHAR +STARTCHAR 3058 +ENCODING 12376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +80 +84 +48 +80 +80 +80 +84 +4C +78 +ENDCHAR +STARTCHAR 3059 +ENCODING 12377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +FF +18 +28 +28 +38 +08 +30 +ENDCHAR +STARTCHAR 305A +ENCODING 12378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 1 -1 +BITMAP +0A +08 +FE +08 +30 +48 +38 +10 +30 +ENDCHAR +STARTCHAR 305B +ENCODING 12379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0400 +2400 +3F80 +E400 +2400 +2000 +2000 +1C00 +ENDCHAR +STARTCHAR 305C +ENCODING 12380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0480 +4400 +7F00 +C400 +4400 +4800 +2000 +1C00 +ENDCHAR +STARTCHAR 305D +ENCODING 12381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +78 +10 +20 +40 +FC +10 +20 +20 +18 +ENDCHAR +STARTCHAR 305E +ENCODING 12382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +68 +1B +20 +40 +FC +10 +20 +20 +18 +ENDCHAR +STARTCHAR 305F +ENCODING 12383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +20 +38 +60 +2E +20 +40 +40 +CF +ENDCHAR +STARTCHAR 3060 +ENCODING 12384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +23 +70 +20 +4E +40 +40 +50 +8E +ENDCHAR +STARTCHAR 3061 +ENCODING 12385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +20 +F8 +20 +40 +7C +02 +04 +1C +ENDCHAR +STARTCHAR 3062 +ENCODING 12386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +22 +FC +20 +20 +3C +22 +02 +1C +ENDCHAR +STARTCHAR 3063 +ENCODING 12387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 0 +BITMAP +38 +C4 +04 +04 +18 +ENDCHAR +STARTCHAR 3064 +ENCODING 12388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 0 +BITMAP +1E +E1 +01 +01 +02 +0C +ENDCHAR +STARTCHAR 3065 +ENCODING 12389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 1 +BITMAP +0180 +3C00 +C200 +0100 +0200 +0200 +1C00 +ENDCHAR +STARTCHAR 3066 +ENCODING 12390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +1E +E8 +10 +20 +20 +10 +1C +04 +ENDCHAR +STARTCHAR 3067 +ENCODING 12391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -1 +BITMAP +1E00 +E800 +1280 +1000 +1000 +1000 +0C00 +ENDCHAR +STARTCHAR 3068 +ENCODING 12392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +40 +40 +3C +20 +40 +80 +80 +7C +ENDCHAR +STARTCHAR 3069 +ENCODING 12393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +86 +40 +78 +40 +80 +80 +80 +78 +ENDCHAR +STARTCHAR 306A +ENCODING 12394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +40 +F4 +42 +88 +88 +18 +2E +38 +ENDCHAR +STARTCHAR 306B +ENCODING 12395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +80 +9C +80 +80 +80 +A0 +9E +80 +ENDCHAR +STARTCHAR 306C +ENCODING 12396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +10 +18 +76 +D1 +D1 +A7 +CB +04 +ENDCHAR +STARTCHAR 306D +ENCODING 12397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +4000 +6C00 +B200 +6100 +4100 +CE00 +4B80 +0400 +ENDCHAR +STARTCHAR 306E +ENCODING 12398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +1C +2A +49 +91 +91 +A1 +46 +ENDCHAR +STARTCHAR 306F +ENCODING 12399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +44 +8E +94 +84 +84 +DE +55 +18 +ENDCHAR +STARTCHAR 3070 +ENCODING 12400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +84 +86 +B8 +84 +84 +9E +A5 +98 +ENDCHAR +STARTCHAR 3071 +ENCODING 12401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +85 +86 +B8 +84 +84 +9C +A7 +18 +ENDCHAR +STARTCHAR 3072 +ENCODING 12402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +C8 +4C +8A +88 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 3073 +ENCODING 12403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0280 +E400 +4400 +4600 +8400 +8400 +8800 +8800 +7000 +ENDCHAR +STARTCHAR 3074 +ENCODING 12404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0380 +E500 +4400 +4600 +8400 +8400 +8800 +8800 +7000 +ENDCHAR +STARTCHAR 3075 +ENCODING 12405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +18 +00 +00 +18 +08 +A5 +44 +18 +ENDCHAR +STARTCHAR 3076 +ENCODING 12406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +18 +00 +00 +18 +08 +A5 +44 +18 +ENDCHAR +STARTCHAR 3077 +ENCODING 12407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +1B +00 +00 +18 +08 +A5 +44 +18 +ENDCHAR +STARTCHAR 3078 +ENCODING 12408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 4 1 1 +BITMAP +30 +4C +82 +01 +ENDCHAR +STARTCHAR 3079 +ENCODING 12409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +03 +30 +48 +86 +01 +ENDCHAR +STARTCHAR 307A +ENCODING 12410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 2 +BITMAP +03 +30 +48 +86 +01 +ENDCHAR +STARTCHAR 307B +ENCODING 12411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +5E +84 +9E +84 +84 +DE +55 +18 +ENDCHAR +STARTCHAR 307C +ENCODING 12412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +9C +89 +BE +88 +88 +9C +AA +98 +ENDCHAR +STARTCHAR 307D +ENCODING 12413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +9D80 +8900 +BE00 +8800 +8800 +9C00 +AA00 +9800 +ENDCHAR +STARTCHAR 307E +ENCODING 12414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +10 +F8 +10 +78 +10 +70 +9C +E0 +ENDCHAR +STARTCHAR 307F +ENCODING 12415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -1 +BITMAP +78 +10 +12 +7A +A6 +A5 +C4 +ENDCHAR +STARTCHAR 3080 +ENCODING 12416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +20 +79 +21 +60 +A0 +E2 +22 +1E +ENDCHAR +STARTCHAR 3081 +ENCODING 12417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -1 +BITMAP +08 +5C +6B +51 +B1 +A1 +D3 +ENDCHAR +STARTCHAR 3082 +ENCODING 12418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +20 +70 +20 +A0 +74 +44 +44 +38 +ENDCHAR +STARTCHAR 3083 +ENCODING 12419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 0 +BITMAP +9C +62 +C2 +2C +20 +10 +ENDCHAR +STARTCHAR 3084 +ENCODING 12420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +48 +4F +35 +E1 +27 +10 +10 +08 +ENDCHAR +STARTCHAR 3085 +ENCODING 12421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +10 +B8 +D4 +94 +B4 +98 +20 +ENDCHAR +STARTCHAR 3086 +ENCODING 12422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +44 +5E +A5 +C5 +C5 +5E +08 +10 +ENDCHAR +STARTCHAR 3087 +ENCODING 12423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +20 +30 +20 +20 +E0 +B8 +40 +ENDCHAR +STARTCHAR 3088 +ENCODING 12424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +10 +1C +10 +10 +10 +78 +94 +60 +ENDCHAR +STARTCHAR 3089 +ENCODING 12425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +30 +00 +40 +40 +B8 +44 +04 +38 +ENDCHAR +STARTCHAR 308A +ENCODING 12426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 8 3 -1 +BITMAP +88 +88 +88 +88 +88 +10 +10 +20 +ENDCHAR +STARTCHAR 308B +ENCODING 12427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +70 +10 +28 +74 +84 +34 +2C +38 +ENDCHAR +STARTCHAR 308C +ENCODING 12428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +40 +2C +F2 +62 +44 +C4 +45 +02 +ENDCHAR +STARTCHAR 308D +ENCODING 12429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +70 +10 +20 +7C +84 +04 +04 +18 +ENDCHAR +STARTCHAR 308E +ENCODING 12430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +40 +68 +74 +44 +C4 +44 +40 +ENDCHAR +STARTCHAR 308F +ENCODING 12431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +20 +30 +FE +21 +61 +61 +22 +20 +ENDCHAR +STARTCHAR 3090 +ENCODING 12432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +38 +08 +0C +33 +51 +AD +AA +4C +ENDCHAR +STARTCHAR 3091 +ENCODING 12433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +70 +38 +64 +14 +38 +20 +DC +A2 +ENDCHAR +STARTCHAR 3092 +ENCODING 12434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +30 +C0 +60 +D4 +98 +28 +40 +38 +ENDCHAR +STARTCHAR 3093 +ENCODING 12435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +10 +20 +20 +40 +70 +92 +8A +0C +ENDCHAR +STARTCHAR 30A1 +ENCODING 12449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +FC +04 +28 +30 +20 +20 +40 +ENDCHAR +STARTCHAR 30A2 +ENCODING 12450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 -1 +BITMAP +FE +04 +28 +30 +20 +20 +40 +ENDCHAR +STARTCHAR 30A3 +ENCODING 12451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +08 +10 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR 30A4 +ENCODING 12452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +04 +08 +10 +70 +90 +10 +10 +10 +ENDCHAR +STARTCHAR 30A5 +ENCODING 12453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 3 -1 +BITMAP +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR 30A6 +ENCODING 12454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +10 +10 +FC +84 +84 +04 +08 +18 +20 +ENDCHAR +STARTCHAR 30A7 +ENCODING 12455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 0 +BITMAP +7C +10 +10 +10 +FC +ENDCHAR +STARTCHAR 30A8 +ENCODING 12456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +10 +10 +10 +10 +ENDCHAR +STARTCHAR 30A9 +ENCODING 12457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 3 0 +BITMAP +D8 +20 +50 +90 +10 +20 +ENDCHAR +STARTCHAR 30AA +ENCODING 12458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +08 +FE +18 +28 +48 +88 +08 +10 +ENDCHAR +STARTCHAR 30AB +ENCODING 12459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +20 +7C +22 +22 +24 +44 +C4 +88 +ENDCHAR +STARTCHAR 30AC +ENCODING 12460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +21 +7C +22 +22 +24 +64 +44 +88 +ENDCHAR +STARTCHAR 30AD +ENCODING 12461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +20 +3C +E0 +10 +FC +10 +10 +10 +ENDCHAR +STARTCHAR 30AE +ENCODING 12462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +06 +20 +38 +E0 +20 +FC +20 +20 +10 +ENDCHAR +STARTCHAR 30AF +ENCODING 12463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +20 +3C +44 +84 +08 +10 +20 +40 +ENDCHAR +STARTCHAR 30B0 +ENCODING 12464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +21 +3C +44 +84 +08 +10 +20 +40 +ENDCHAR +STARTCHAR 30B1 +ENCODING 12465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +10 +3F +44 +84 +08 +08 +10 +ENDCHAR +STARTCHAR 30B2 +ENCODING 12466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2080 +2100 +7E00 +4800 +8800 +0800 +1000 +1000 +2000 +ENDCHAR +STARTCHAR 30B3 +ENCODING 12467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +FC +04 +04 +04 +04 +7C +ENDCHAR +STARTCHAR 30B4 +ENCODING 12468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +03 +00 +FC +04 +04 +04 +04 +FC +ENDCHAR +STARTCHAR 30B5 +ENCODING 12469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +48 +48 +FE +48 +48 +08 +10 +20 +ENDCHAR +STARTCHAR 30B6 +ENCODING 12470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0080 +4500 +4400 +FE00 +4400 +4800 +0800 +1000 +2000 +ENDCHAR +STARTCHAR 30B7 +ENCODING 12471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +20 +00 +C1 +02 +04 +18 +60 +ENDCHAR +STARTCHAR 30B8 +ENCODING 12472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +23 +00 +C1 +02 +04 +18 +60 +ENDCHAR +STARTCHAR 30B9 +ENCODING 12473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +78 +08 +10 +28 +44 +80 +ENDCHAR +STARTCHAR 30BA +ENCODING 12474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +01 +02 +7C +08 +08 +14 +26 +C2 +ENDCHAR +STARTCHAR 30BB +ENCODING 12475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +40 +44 +7A +C4 +48 +40 +40 +3C +ENDCHAR +STARTCHAR 30BC +ENCODING 12476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +21 +24 +7A +A4 +24 +20 +20 +3E +ENDCHAR +STARTCHAR 30BD +ENCODING 12477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 -1 +BITMAP +82 +84 +44 +08 +08 +10 +20 +ENDCHAR +STARTCHAR 30BE +ENCODING 12478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0080 +0400 +8400 +4400 +0800 +0800 +1000 +2000 +4000 +ENDCHAR +STARTCHAR 30BF +ENCODING 12479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +20 +7C +C4 +AC +18 +18 +68 +C0 +ENDCHAR +STARTCHAR 30C0 +ENCODING 12480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +21 +7C +C4 +AC +18 +18 +68 +C0 +ENDCHAR +STARTCHAR 30C1 +ENCODING 12481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +04 +78 +10 +10 +FC +10 +20 +20 +C0 +ENDCHAR +STARTCHAR 30C2 +ENCODING 12482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +04 +78 +11 +10 +FE +10 +10 +20 +40 +ENDCHAR +STARTCHAR 30C3 +ENCODING 12483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 -1 +BITMAP +A4 +04 +08 +08 +10 +20 +ENDCHAR +STARTCHAR 30C4 +ENCODING 12484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 -1 +BITMAP +20 +92 +84 +04 +08 +10 +20 +ENDCHAR +STARTCHAR 30C5 +ENCODING 12485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0080 +2100 +9200 +8400 +0400 +0800 +1000 +2000 +ENDCHAR +STARTCHAR 30C6 +ENCODING 12486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +78 +00 +FE +10 +10 +20 +20 +40 +ENDCHAR +STARTCHAR 30C7 +ENCODING 12487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0280 +7C00 +0000 +FE00 +1000 +1000 +1000 +2000 +4000 +ENDCHAR +STARTCHAR 30C8 +ENCODING 12488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 8 3 -1 +BITMAP +80 +80 +C0 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 30C9 +ENCODING 12489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +10 +90 +80 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 30CA +ENCODING 12490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +10 +10 +FC +10 +10 +20 +20 +40 +ENDCHAR +STARTCHAR 30CB +ENCODING 12491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +7C +00 +00 +00 +FC +ENDCHAR +STARTCHAR 30CC +ENCODING 12492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 0 +BITMAP +F8 +08 +18 +70 +30 +58 +88 +ENDCHAR +STARTCHAR 30CD +ENCODING 12493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +10 +10 +FC +08 +10 +74 +92 +10 +10 +ENDCHAR +STARTCHAR 30CE +ENCODING 12494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +08 +08 +10 +10 +20 +40 +80 +ENDCHAR +STARTCHAR 30CF +ENCODING 12495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +04 +22 +22 +41 +C1 +ENDCHAR +STARTCHAR 30D0 +ENCODING 12496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 1 +BITMAP +0080 +2400 +2400 +4200 +4200 +8100 +ENDCHAR +STARTCHAR 30D1 +ENCODING 12497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 1 +BITMAP +0100 +0280 +2500 +2400 +4200 +4200 +8100 +ENDCHAR +STARTCHAR 30D2 +ENCODING 12498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +80 +88 +B0 +C0 +80 +80 +80 +7C +ENDCHAR +STARTCHAR 30D3 +ENCODING 12499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +04 +88 +B0 +C0 +80 +80 +80 +78 +ENDCHAR +STARTCHAR 30D4 +ENCODING 12500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +06 +06 +88 +B0 +C0 +80 +80 +80 +78 +ENDCHAR +STARTCHAR 30D5 +ENCODING 12501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +FC +04 +04 +04 +08 +10 +60 +40 +ENDCHAR +STARTCHAR 30D6 +ENCODING 12502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +06 +F8 +04 +08 +08 +10 +20 +40 +80 +ENDCHAR +STARTCHAR 30D7 +ENCODING 12503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +06 +FA +04 +08 +08 +10 +20 +40 +80 +ENDCHAR +STARTCHAR 30D8 +ENCODING 12504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 4 1 1 +BITMAP +30 +48 +86 +01 +ENDCHAR +STARTCHAR 30D9 +ENCODING 12505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +03 +30 +48 +86 +01 +ENDCHAR +STARTCHAR 30DA +ENCODING 12506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 2 +BITMAP +03 +30 +48 +86 +01 +ENDCHAR +STARTCHAR 30DB +ENCODING 12507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +10 +FE +10 +14 +94 +92 +10 +20 +ENDCHAR +STARTCHAR 30DC +ENCODING 12508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +10 +FE +10 +10 +52 +91 +10 +10 +ENDCHAR +STARTCHAR 30DD +ENCODING 12509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +11 +FE +10 +10 +52 +D1 +10 +10 +ENDCHAR +STARTCHAR 30DE +ENCODING 12510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 0 +BITMAP +FE +04 +0C +38 +10 +18 +ENDCHAR +STARTCHAR 30DF +ENCODING 12511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +60 +10 +C0 +20 +00 +C0 +30 +ENDCHAR +STARTCHAR 30E0 +ENCODING 12512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +10 +10 +10 +20 +22 +41 +FF +ENDCHAR +STARTCHAR 30E1 +ENCODING 12513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +04 +04 +28 +18 +1C +20 +C0 +ENDCHAR +STARTCHAR 30E2 +ENCODING 12514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +7E +10 +10 +FF +10 +10 +10 +0E +ENDCHAR +STARTCHAR 30E3 +ENCODING 12515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 0 +BITMAP +2C +F4 +28 +20 +20 +ENDCHAR +STARTCHAR 30E4 +ENCODING 12516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +40 +4E +F2 +24 +20 +20 +20 +10 +ENDCHAR +STARTCHAR 30E5 +ENCODING 12517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 0 +BITMAP +78 +08 +08 +08 +FC +ENDCHAR +STARTCHAR 30E6 +ENCODING 12518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 0 +BITMAP +7E +04 +04 +04 +04 +FF +ENDCHAR +STARTCHAR 30E7 +ENCODING 12519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 0 +BITMAP +F8 +08 +F8 +08 +F8 +ENDCHAR +STARTCHAR 30E8 +ENCODING 12520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +7C +04 +FC +04 +04 +FC +ENDCHAR +STARTCHAR 30E9 +ENCODING 12521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +78 +00 +FC +04 +04 +08 +10 +20 +ENDCHAR +STARTCHAR 30EA +ENCODING 12522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 8 3 -1 +BITMAP +90 +90 +90 +90 +10 +10 +20 +40 +ENDCHAR +STARTCHAR 30EB +ENCODING 12523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -1 +BITMAP +0800 +4800 +4800 +4980 +4900 +4A00 +8C00 +ENDCHAR +STARTCHAR 30EC +ENCODING 12524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +80 +80 +80 +84 +8C +90 +E0 +ENDCHAR +STARTCHAR 30ED +ENCODING 12525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +FC +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR 30EE +ENCODING 12526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 3 -1 +BITMAP +F8 +88 +08 +10 +10 +20 +ENDCHAR +STARTCHAR 30EF +ENCODING 12527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +FC +84 +84 +04 +04 +08 +10 +ENDCHAR +STARTCHAR 30F0 +ENCODING 12528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +08 +08 +FC +48 +48 +48 +BE +08 +08 +ENDCHAR +STARTCHAR 30F1 +ENCODING 12529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7E +03 +02 +1C +10 +10 +FF +ENDCHAR +STARTCHAR 30F2 +ENCODING 12530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +FC +04 +04 +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR 30F3 +ENCODING 12531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +80 +40 +02 +04 +18 +20 +C0 +ENDCHAR +STARTCHAR 30F4 +ENCODING 12532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 1 -1 +BITMAP +12 +10 +FE +84 +84 +04 +08 +18 +20 +ENDCHAR +STARTCHAR 30F5 +ENCODING 12533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 3 0 +BITMAP +F0 +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR 30F6 +ENCODING 12534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +20 +34 +48 +88 +10 +10 +20 +ENDCHAR +STARTCHAR 30FB +ENCODING 12539 +SWIDTH 270 0 +DWIDTH 3 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR 30FC +ENCODING 12540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 1 0 3 +BITMAP +FFC0 +ENDCHAR +STARTCHAR 3131 +ENCODING 12593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 3132 +ENCODING 12594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +24 +24 +24 +24 +ENDCHAR +STARTCHAR 3133 +ENCODING 12595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +E4 +14 +16 +1A +19 +ENDCHAR +STARTCHAR 3134 +ENCODING 12596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR 3135 +ENCODING 12597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +8E +82 +82 +86 +E9 +ENDCHAR +STARTCHAR 3136 +ENCODING 12598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 1 +BITMAP +1C +80 +BE +88 +94 +FC +ENDCHAR +STARTCHAR 3137 +ENCODING 12599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +80 +80 +80 +FC +ENDCHAR +STARTCHAR 3138 +ENCODING 12600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FC +90 +90 +90 +FE +ENDCHAR +STARTCHAR 3139 +ENCODING 12601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +04 +FC +80 +FC +ENDCHAR +STARTCHAR 313A +ENCODING 12602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +24 +E4 +84 +E4 +ENDCHAR +STARTCHAR 313B +ENCODING 12603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +EC +34 +F4 +94 +EC +ENDCHAR +STARTCHAR 313C +ENCODING 12604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +F4 +34 +FC +94 +FC +ENDCHAR +STARTCHAR 313D +ENCODING 12605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +E4 +14 +E4 +86 +E9 +ENDCHAR +STARTCHAR 313E +ENCODING 12606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +30 +FC +90 +FC +ENDCHAR +STARTCHAR 313F +ENCODING 12607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FE +2C +EC +8C +FE +ENDCHAR +STARTCHAR 3140 +ENCODING 12608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 6 2 1 +BITMAP +0C +E0 +3E +EC +12 +FC +ENDCHAR +STARTCHAR 3141 +ENCODING 12609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR 3142 +ENCODING 12610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +88 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR 3143 +ENCODING 12611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +B4 +B4 +FC +B4 +EC +ENDCHAR +STARTCHAR 3144 +ENCODING 12612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +28 +28 +C8 +34 +D2 +ENDCHAR +STARTCHAR 3145 +ENCODING 12613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +10 +20 +30 +48 +84 +ENDCHAR +STARTCHAR 3146 +ENCODING 12614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +48 +48 +EC +92 +20 +ENDCHAR +STARTCHAR 3147 +ENCODING 12615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +78 +44 +84 +44 +78 +ENDCHAR +STARTCHAR 3148 +ENCODING 12616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FC +08 +10 +78 +86 +ENDCHAR +STARTCHAR 3149 +ENCODING 12617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +7E +12 +34 +CB +10 +ENDCHAR +STARTCHAR 314A +ENCODING 12618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 1 +BITMAP +30 +00 +FC +08 +38 +C4 +ENDCHAR +STARTCHAR 314B +ENCODING 12619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 5 3 1 +BITMAP +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR 314C +ENCODING 12620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +80 +FC +80 +FC +ENDCHAR +STARTCHAR 314D +ENCODING 12621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +FC +48 +48 +48 +FC +ENDCHAR +STARTCHAR 314E +ENCODING 12622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +78 +00 +FC +00 +78 +44 +78 +ENDCHAR +STARTCHAR 314F +ENCODING 12623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 4 -2 +BITMAP +80 +80 +80 +80 +80 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 3150 +ENCODING 12624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +90 +90 +90 +90 +90 +F0 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR 3151 +ENCODING 12625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 4 -2 +BITMAP +80 +80 +80 +C0 +80 +80 +80 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR 3152 +ENCODING 12626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +F0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR 3153 +ENCODING 12627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 11 4 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 3154 +ENCODING 12628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +30 +30 +30 +30 +30 +D0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 3155 +ENCODING 12629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 11 4 -2 +BITMAP +20 +20 +20 +E0 +20 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 3156 +ENCODING 12630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +30 +30 +30 +D0 +30 +30 +D0 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 3157 +ENCODING 12631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 4 0 1 +BITMAP +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR 3158 +ENCODING 12632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0200 +0200 +0200 +0200 +2200 +2380 +2200 +2200 +FE00 +0200 +0200 +ENDCHAR +STARTCHAR 3159 +ENCODING 12633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0280 +0280 +0280 +0280 +2280 +2380 +2280 +2280 +FA80 +0280 +0280 +ENDCHAR +STARTCHAR 315A +ENCODING 12634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +01 +01 +01 +11 +11 +11 +11 +FF +01 +01 +ENDCHAR +STARTCHAR 315B +ENCODING 12635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 4 0 1 +BITMAP +1200 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR 315C +ENCODING 12636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 0 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR 315D +ENCODING 12637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +01 +01 +01 +01 +FF +11 +17 +11 +11 +01 +ENDCHAR +STARTCHAR 315E +ENCODING 12638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0280 +0280 +0280 +0280 +0280 +FA80 +2280 +2E80 +2280 +2280 +0280 +ENDCHAR +STARTCHAR 315F +ENCODING 12639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +01 +01 +01 +01 +FF +11 +11 +11 +11 +01 +ENDCHAR +STARTCHAR 3160 +ENCODING 12640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 5 0 0 +BITMAP +FFC0 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR 3161 +ENCODING 12641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 1 0 2 +BITMAP +FFC0 +ENDCHAR +STARTCHAR 3162 +ENCODING 12642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +01 +01 +01 +01 +01 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR 3163 +ENCODING 12643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 11 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 3164 +ENCODING 12644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 3165 +ENCODING 12645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +90 +90 +90 +90 +FC +ENDCHAR +STARTCHAR 3166 +ENCODING 12646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +9C +90 +90 +90 +FC +ENDCHAR +STARTCHAR 3167 +ENCODING 12647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +84 +84 +84 +8A +69 +ENDCHAR +STARTCHAR 3168 +ENCODING 12648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +88 +88 +8C +94 +FC +ENDCHAR +STARTCHAR 3169 +ENCODING 12649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +F800 +4A00 +CA00 +8B00 +CC80 +ENDCHAR +STARTCHAR 316A +ENCODING 12650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +EC +30 +F0 +90 +FE +ENDCHAR +STARTCHAR 316B +ENCODING 12651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +C800 +5A00 +DA00 +9B00 +FC80 +ENDCHAR +STARTCHAR 316C +ENCODING 12652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +E0 +28 +EC +94 +FC +ENDCHAR +STARTCHAR 316D +ENCODING 12653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +FE +20 +EC +92 +EC +ENDCHAR +STARTCHAR 316E +ENCODING 12654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +F0 +B4 +BC +B4 +FC +ENDCHAR +STARTCHAR 316F +ENCODING 12655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +C8 +28 +28 +34 +D2 +ENDCHAR +STARTCHAR 3170 +ENCODING 12656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +E0 +A8 +AC +B4 +FC +ENDCHAR +STARTCHAR 3171 +ENCODING 12657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +7C +84 +84 +FC +10 +28 +28 +10 +ENDCHAR +STARTCHAR 3172 +ENCODING 12658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +BC +A4 +E4 +A4 +E4 +ENDCHAR +STARTCHAR 3173 +ENCODING 12659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +BC +B0 +F0 +B0 +FC +ENDCHAR +STARTCHAR 3174 +ENCODING 12660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +AB +A9 +E9 +AD +F3 +ENDCHAR +STARTCHAR 3175 +ENCODING 12661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 1 +BITMAP +8B00 +AA00 +CA00 +BA00 +D780 +ENDCHAR +STARTCHAR 3176 +ENCODING 12662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +8E +A2 +E2 +A6 +E9 +ENDCHAR +STARTCHAR 3177 +ENCODING 12663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +AC +B0 +EC +B0 +FC +ENDCHAR +STARTCHAR 3178 +ENCODING 12664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 8 3 -1 +BITMAP +08 +F8 +88 +F8 +20 +50 +50 +20 +ENDCHAR +STARTCHAR 3179 +ENCODING 12665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +B0 +FC +B4 +FC +10 +28 +28 +10 +ENDCHAR +STARTCHAR 317A +ENCODING 12666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 1 +BITMAP +3C +24 +64 +64 +94 +ENDCHAR +STARTCHAR 317B +ENCODING 12667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +48 +48 +48 +A8 +9E +ENDCHAR +STARTCHAR 317C +ENCODING 12668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +4E +48 +48 +A8 +9E +ENDCHAR +STARTCHAR 317D +ENCODING 12669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +4A +4A +4E +AA +9E +ENDCHAR +STARTCHAR 317E +ENCODING 12670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +0E +21 +62 +66 +99 +ENDCHAR +STARTCHAR 317F +ENCODING 12671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 4 3 2 +BITMAP +60 +60 +90 +F0 +ENDCHAR +STARTCHAR 3180 +ENCODING 12672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 5 2 1 +BITMAP +CC +AA +B2 +AA +CC +ENDCHAR +STARTCHAR 3181 +ENCODING 12673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR 3182 +ENCODING 12674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +20 +54 +96 +96 +79 +ENDCHAR +STARTCHAR 3183 +ENCODING 12675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +20 +52 +96 +95 +7F +ENDCHAR +STARTCHAR 3184 +ENCODING 12676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +FC +48 +48 +FC +10 +28 +28 +10 +ENDCHAR +STARTCHAR 3185 +ENCODING 12677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 5 1 1 +BITMAP +66 +FF +66 +95 +77 +ENDCHAR +STARTCHAR 3186 +ENCODING 12678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 6 3 0 +BITMAP +F8 +70 +88 +88 +90 +60 +ENDCHAR +STARTCHAR 3187 +ENCODING 12679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 11 2 -2 +BITMAP +04 +04 +04 +06 +84 +94 +94 +BE +44 +04 +04 +ENDCHAR +STARTCHAR 3188 +ENCODING 12680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +0080 +0280 +0280 +0280 +5380 +5280 +5280 +FB80 +0280 +0280 +ENDCHAR +STARTCHAR 3189 +ENCODING 12681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 11 2 -2 +BITMAP +02 +02 +02 +02 +42 +52 +52 +7E +82 +02 +02 +ENDCHAR +STARTCHAR 318A +ENCODING 12682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +01 +01 +01 +01 +FD +2F +29 +2F +29 +ENDCHAR +STARTCHAR 318B +ENCODING 12683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0080 +0280 +0280 +0280 +0280 +FA80 +5680 +5280 +5680 +1280 +0080 +ENDCHAR +STARTCHAR 318C +ENCODING 12684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +01 +01 +01 +01 +FF +29 +29 +29 +29 +ENDCHAR +STARTCHAR 318D +ENCODING 12685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 1 5 3 +BITMAP +80 +ENDCHAR +STARTCHAR 318E +ENCODING 12686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +10 +10 +10 +10 +10 +D0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 3200 +ENCODING 12800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +BF40 +8140 +8140 +8140 +8140 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3201 +ENCODING 12801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9040 +9040 +9040 +9040 +9F40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3202 +ENCODING 12802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +BF40 +A040 +A040 +A040 +BF40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3203 +ENCODING 12803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +BF40 +8140 +BF40 +A040 +BF40 +8040 +4080 +4000 +ENDCHAR +STARTCHAR 3204 +ENCODING 12804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9F40 +A140 +A140 +A140 +9F40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3205 +ENCODING 12805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +4040 +8040 +A140 +9F40 +A140 +9F40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3206 +ENCODING 12806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8440 +8440 +8C40 +8C40 +9240 +A140 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3207 +ENCODING 12807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +4040 +8E40 +9140 +A140 +A140 +9140 +8E40 +4040 +4080 +ENDCHAR +STARTCHAR 3208 +ENCODING 12808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +BF40 +8440 +8C40 +9240 +A140 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 3209 +ENCODING 12809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +8040 +BF40 +8440 +8C40 +9A40 +A140 +4040 +4080 +ENDCHAR +STARTCHAR 320A +ENCODING 12810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9F40 +8140 +BF40 +8140 +8140 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 320B +ENCODING 12811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +9F40 +A040 +9F40 +A040 +9F40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 320C +ENCODING 12812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8040 +BF40 +9240 +9240 +9240 +BF40 +8040 +4040 +4080 +ENDCHAR +STARTCHAR 320D +ENCODING 12813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4040 +8E40 +8040 +BF40 +8040 +9E40 +9140 +9E40 +4040 +4080 +ENDCHAR +STARTCHAR 320E +ENCODING 12814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +8540 +8540 +89C0 +8940 +9140 +A140 +4140 +4080 +ENDCHAR +STARTCHAR 320F +ENCODING 12815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +8140 +A140 +A140 +A1C0 +A140 +BF40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3210 +ENCODING 12816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +A140 +A140 +A1C0 +A140 +BD40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3211 +ENCODING 12817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +8540 +BD40 +A1C0 +A140 +BF40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3212 +ENCODING 12818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +A540 +A540 +A5C0 +A540 +BD40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3213 +ENCODING 12819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +8140 +A540 +A540 +BDC0 +A540 +BD40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3214 +ENCODING 12820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +9140 +9140 +9140 +99C0 +A940 +E540 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3215 +ENCODING 12821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +9940 +A540 +A540 +A5C0 +A540 +9940 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3216 +ENCODING 12822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +8940 +8940 +99C0 +9540 +A540 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3217 +ENCODING 12823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +9940 +8140 +BD40 +89C0 +9540 +A340 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 3218 +ENCODING 12824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +8540 +BD40 +89C0 +8940 +9140 +A140 +4140 +4080 +ENDCHAR +STARTCHAR 3219 +ENCODING 12825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +A140 +BD40 +A1C0 +A140 +BF40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 321A +ENCODING 12826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +BD40 +8140 +9540 +95C0 +9540 +BF40 +8140 +4140 +4080 +ENDCHAR +STARTCHAR 321B +ENCODING 12827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4140 +9940 +8140 +BD40 +81C0 +9940 +A540 +9940 +4140 +4080 +ENDCHAR +STARTCHAR 321C +ENCODING 12828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +7F40 +8440 +9A40 +A140 +FFC0 +8440 +8440 +4440 +4080 +ENDCHAR +STARTCHAR 3231 +ENCODING 12849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +5280 +5640 +7F40 +9A40 +BFC0 +BA40 +9740 +9AC0 +5240 +4080 +ENDCHAR +STARTCHAR 3239 +ENCODING 12857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +4080 +5640 +9440 +AF40 +E440 +A440 +A240 +A2C0 +4140 +4080 +ENDCHAR +STARTCHAR 3251 +ENCODING 12881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5880 +6540 +A540 +8940 +9140 +A140 +7D80 +2100 +1E00 +ENDCHAR +STARTCHAR 3252 +ENCODING 12882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5380 +6CC0 +A4C0 +8940 +9240 +A440 +7F80 +2100 +1E00 +ENDCHAR +STARTCHAR 3253 +ENCODING 12883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5380 +6CC0 +A8C0 +8940 +90C0 +A4C0 +7B80 +2100 +1E00 +ENDCHAR +STARTCHAR 3254 +ENCODING 12884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5080 +6940 +A740 +8B40 +9740 +A140 +7880 +2100 +1E00 +ENDCHAR +STARTCHAR 3255 +ENCODING 12885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5280 +6840 +AF40 +8CC0 +90C0 +A4C0 +7B80 +2100 +1E00 +ENDCHAR +STARTCHAR 3256 +ENCODING 12886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5180 +6AC0 +A540 +8EC0 +94C0 +A4C0 +7B80 +2100 +1E00 +ENDCHAR +STARTCHAR 3257 +ENCODING 12887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5080 +6BC0 +A940 +8A40 +9240 +A240 +7A80 +2100 +1E00 +ENDCHAR +STARTCHAR 3258 +ENCODING 12888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5380 +6CC0 +ACC0 +8B40 +94C0 +A4C0 +7B80 +2100 +1E00 +ENDCHAR +STARTCHAR 3259 +ENCODING 12889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5380 +6CC0 +A4C0 +8CC0 +93C0 +A0C0 +7B80 +2100 +1E00 +ENDCHAR +STARTCHAR 325A +ENCODING 12890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +5180 +6AC0 +8CC0 +9CC0 +84C0 +ACC0 +5380 +2100 +1E00 +ENDCHAR +STARTCHAR 3260 +ENCODING 12896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +BE40 +8140 +8140 +8140 +4140 +4080 +3F00 +ENDCHAR +STARTCHAR 3261 +ENCODING 12897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9040 +9040 +9040 +9F40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3262 +ENCODING 12898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9F40 +A040 +A040 +9F40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3263 +ENCODING 12899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +5F40 +8140 +9F40 +A040 +9F40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3264 +ENCODING 12900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9F40 +9140 +9140 +9F40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3265 +ENCODING 12901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9140 +9F40 +9140 +9F40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3266 +ENCODING 12902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4440 +8440 +8C40 +9240 +A140 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3267 +ENCODING 12903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +9E40 +9140 +A140 +9140 +9E40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3268 +ENCODING 12904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +BF40 +8440 +8A40 +B140 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 3269 +ENCODING 12905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4C40 +8040 +BF40 +8440 +8A40 +7140 +4080 +3F00 +ENDCHAR +STARTCHAR 326A +ENCODING 12906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9F40 +8140 +BF40 +8140 +4140 +4080 +3F00 +ENDCHAR +STARTCHAR 326B +ENCODING 12907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +9F40 +A040 +9F40 +A040 +5F40 +4080 +3F00 +ENDCHAR +STARTCHAR 326C +ENCODING 12908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4080 +4040 +BF40 +9240 +9240 +BF40 +4040 +4080 +3F00 +ENDCHAR +STARTCHAR 326D +ENCODING 12909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +4080 +4E40 +8040 +BF40 +8040 +9E40 +9140 +5E80 +2080 +1F00 +ENDCHAR +STARTCHAR 326E +ENCODING 12910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5D40 +8540 +8940 +9140 +A140 +4140 +4080 +3F00 +ENDCHAR +STARTCHAR 326F +ENCODING 12911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +4140 +A140 +A140 +A140 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3270 +ENCODING 12912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +7940 +A140 +A140 +A140 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3271 +ENCODING 12913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5D40 +8540 +B940 +A140 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3272 +ENCODING 12914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +7D40 +A540 +A5C0 +A540 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3273 +ENCODING 12915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +4140 +A540 +BDC0 +A540 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3274 +ENCODING 12916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +4940 +8940 +9940 +9940 +A540 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3275 +ENCODING 12917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +7940 +A540 +A540 +A540 +B940 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3276 +ENCODING 12918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5940 +8940 +9940 +9940 +A540 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3277 +ENCODING 12919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +4140 +8140 +9940 +9940 +A540 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 3278 +ENCODING 12920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +4D40 +8540 +9D40 +8940 +9140 +6140 +4180 +3F00 +ENDCHAR +STARTCHAR 3279 +ENCODING 12921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +7940 +A140 +B940 +A140 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 327A +ENCODING 12922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +5940 +8140 +9540 +9940 +BD40 +4140 +4180 +3F00 +ENDCHAR +STARTCHAR 327B +ENCODING 12923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4180 +4140 +8140 +BD40 +A540 +A540 +5940 +4180 +3F00 +ENDCHAR +STARTCHAR 327F +ENCODING 12927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3C00 +4300 +A500 +A800 +D380 +2880 +AC80 +A500 +4200 +3C00 +ENDCHAR +STARTCHAR 328A +ENCODING 12938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +7E80 +5140 +9D40 +9140 +9940 +5140 +6080 +3F00 +ENDCHAR +STARTCHAR 328B +ENCODING 12939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +6080 +4440 +9540 +A440 +8C40 +5240 +6180 +3F00 +ENDCHAR +STARTCHAR 328C +ENCODING 12940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +6480 +4540 +9E40 +8C40 +9640 +6540 +4C80 +3F00 +ENDCHAR +STARTCHAR 328D +ENCODING 12941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +6080 +4440 +9E40 +8C40 +9640 +6540 +4480 +3F00 +ENDCHAR +STARTCHAR 328E +ENCODING 12942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +6480 +4A40 +9140 +A440 +8C40 +5640 +7F80 +3F00 +ENDCHAR +STARTCHAR 328F +ENCODING 12943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +6080 +4440 +9E40 +8440 +8440 +4440 +7F80 +3F00 +ENDCHAR +STARTCHAR 3290 +ENCODING 12944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1F00 +6E80 +5140 +9140 +9E40 +9140 +5140 +4E80 +3F00 +ENDCHAR +STARTCHAR 3294 +ENCODING 12948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +4880 +5E40 +B440 +9840 +BF40 +9140 +5F80 +3F00 +ENDCHAR +STARTCHAR 329E +ENCODING 12958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +4A80 +7540 +A540 +BD40 +A540 +BD40 +6480 +2100 +1E00 +ENDCHAR +STARTCHAR 32A5 +ENCODING 12965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +4480 +4440 +BF40 +A540 +BF40 +8440 +4480 +3F00 +ENDCHAR +STARTCHAR 3380 +ENCODING 13184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -2 +BITMAP +0600 +4600 +A600 +9900 +9F00 +9900 +9080 +E000 +8000 +ENDCHAR +STARTCHAR 3381 +ENCODING 13185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +0200 +4600 +A500 +A500 +9F00 +9900 +9080 +ENDCHAR +STARTCHAR 3382 +ENCODING 13186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +0100 +0300 +2A80 +2A80 +2B80 +5440 +5C40 +6000 +8000 +ENDCHAR +STARTCHAR 3383 +ENCODING 13187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 7 0 0 +BITMAP +0100 +5300 +AA80 +AA80 +AB80 +AC40 +AC40 +ENDCHAR +STARTCHAR 3384 +ENCODING 13188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +8200 +8600 +A500 +C900 +CF00 +A900 +B880 +ENDCHAR +STARTCHAR 3388 +ENCODING 13192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +45 +AB +83 +87 +8B +AA +44 +ENDCHAR +STARTCHAR 3389 +ENCODING 13193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0080 +9280 +ED80 +A580 +A380 +E580 +2D80 +1200 +ENDCHAR +STARTCHAR 338A +ENCODING 13194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +0F +48 +B8 +9F +98 +98 +98 +E0 +80 +ENDCHAR +STARTCHAR 338B +ENCODING 13195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +0F +68 +98 +9F +98 +98 +98 +ENDCHAR +STARTCHAR 338C +ENCODING 13196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -2 +BITMAP +0F +08 +58 +57 +58 +A8 +A8 +D0 +ENDCHAR +STARTCHAR 338D +ENCODING 13197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -2 +BITMAP +4F80 +5880 +5880 +9480 +A780 +D080 +0700 +ENDCHAR +STARTCHAR 338E +ENCODING 13198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -2 +BITMAP +F780 +D880 +D880 +D880 +D780 +0080 +0700 +ENDCHAR +STARTCHAR 338F +ENCODING 13199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +80 +82 +A5 +C9 +A9 +A9 +97 +09 +07 +ENDCHAR +STARTCHAR 3390 +ENCODING 13200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +90 +90 +97 +F1 +92 +94 +97 +ENDCHAR +STARTCHAR 3391 +ENCODING 13201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 7 0 0 +BITMAP +9200 +9200 +B2C0 +CE80 +D280 +B300 +B380 +ENDCHAR +STARTCHAR 3392 +ENCODING 13202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +3400 +B400 +B580 +BD00 +7500 +7500 +7700 +ENDCHAR +STARTCHAR 3393 +ENCODING 13203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4000 +B000 +B400 +9580 +7C80 +9500 +B500 +B200 +4100 +ENDCHAR +STARTCHAR 3394 +ENCODING 13204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +D400 +5400 +5580 +5D00 +5500 +5500 +5700 +ENDCHAR +STARTCHAR 3395 +ENCODING 13205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -2 +BITMAP +0100 +0280 +0280 +2A80 +4B00 +5300 +5200 +9500 +F200 +ENDCHAR +STARTCHAR 3396 +ENCODING 13206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0100 +0280 +5280 +AA80 +AB00 +AB00 +AA00 +AD00 +0200 +ENDCHAR +STARTCHAR 3397 +ENCODING 13207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +01 +0B +2B +DB +8D +8D +8A +9D +62 +ENDCHAR +STARTCHAR 3398 +ENCODING 13208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 0 +BITMAP +83 +85 +95 +A5 +E6 +A4 +9D +02 +ENDCHAR +STARTCHAR 3399 +ENCODING 13209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +80 +90 +AE +AA +AA +AA +AA +ENDCHAR +STARTCHAR 339A +ENCODING 13210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 0 +BITMAP +EF80 +AA80 +AA80 +AA80 +AA80 +ENDCHAR +STARTCHAR 339B +ENCODING 13211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 -2 +BITMAP +5F80 +5A80 +5A80 +AA80 +AA80 +D000 +ENDCHAR +STARTCHAR 339C +ENCODING 13212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 5 1 0 +BITMAP +FF80 +DA80 +DA80 +DA80 +DA80 +ENDCHAR +STARTCHAR 339D +ENCODING 13213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 -1 +BITMAP +FF80 +9A80 +8A80 +8A80 +9A80 +6000 +ENDCHAR +STARTCHAR 339E +ENCODING 13214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +8000 +8500 +AA80 +CA80 +CA80 +AA80 +AA80 +ENDCHAR +STARTCHAR 339F +ENCODING 13215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0180 +0100 +0500 +FA80 +DA80 +DA80 +DA80 +DA80 +ENDCHAR +STARTCHAR 33A0 +ENCODING 13216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0180 +0100 +4500 +BA80 +9A80 +8A80 +8A80 +9A80 +6000 +ENDCHAR +STARTCHAR 33A1 +ENCODING 13217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +06 +04 +48 +B4 +A4 +A4 +A4 +A4 +ENDCHAR +STARTCHAR 33A2 +ENCODING 13218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0180 +8100 +8500 +AA80 +CA80 +CA80 +AA80 +AA80 +ENDCHAR +STARTCHAR 33A3 +ENCODING 13219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0180 +0080 +2500 +DA80 +DA80 +DA80 +DA80 +DA80 +ENDCHAR +STARTCHAR 33A4 +ENCODING 13220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0180 +0080 +4500 +BA80 +9A80 +8A80 +8A80 +9A80 +6000 +ENDCHAR +STARTCHAR 33A5 +ENCODING 13221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 0 +BITMAP +06 +06 +48 +B4 +24 +24 +24 +24 +ENDCHAR +STARTCHAR 33A6 +ENCODING 13222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +8080 +8500 +AA80 +CA80 +CA80 +AA80 +AA80 +ENDCHAR +STARTCHAR 33A7 +ENCODING 13223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2000 +D200 +D200 +D400 +0700 +0C80 +1300 +1480 +0300 +ENDCHAR +STARTCHAR 33A8 +ENCODING 13224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2000 +D200 +D580 +D500 +5B00 +1400 +1300 +2480 +0300 +ENDCHAR +STARTCHAR 33A9 +ENCODING 13225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +F0 +96 +99 +F9 +87 +89 +89 +06 +ENDCHAR +STARTCHAR 33AA +ENCODING 13226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +1C00 +9400 +D700 +9880 +9300 +D480 +2500 +0200 +ENDCHAR +STARTCHAR 33AB +ENCODING 13227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +3C00 +B500 +B280 +DE80 +D180 +5280 +5280 +0100 +ENDCHAR +STARTCHAR 33AC +ENCODING 13228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4800 +B400 +B500 +9280 +7C80 +9180 +B280 +B280 +4100 +ENDCHAR +STARTCHAR 33AD +ENCODING 13229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0080 +1280 +AD80 +8C80 +BC80 +CC80 +CC80 +3300 +ENDCHAR +STARTCHAR 33AE +ENCODING 13230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0100 +BA00 +EA00 +7D00 +0680 +0900 +0A80 +1100 +ENDCHAR +STARTCHAR 33AF +ENCODING 13231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 8 0 0 +BITMAP +0880 +9540 +F540 +BB00 +0200 +0580 +0840 +0880 +ENDCHAR +STARTCHAR 33B0 +ENCODING 13232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -2 +BITMAP +F7 +94 +92 +91 +95 +E2 +80 +ENDCHAR +STARTCHAR 33B1 +ENCODING 13233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 -1 +BITMAP +F7 +98 +96 +91 +99 +06 +ENDCHAR +STARTCHAR 33B2 +ENCODING 13234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 -2 +BITMAP +2F00 +5400 +5300 +5080 +A480 +D300 +ENDCHAR +STARTCHAR 33B3 +ENCODING 13235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 6 1 -1 +BITMAP +FF00 +AC00 +AB00 +A880 +AC80 +0300 +ENDCHAR +STARTCHAR 33B4 +ENCODING 13236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +09 +69 +99 +99 +96 +96 +96 +E0 +80 +ENDCHAR +STARTCHAR 33B5 +ENCODING 13237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +09 +69 +99 +99 +96 +96 +96 +ENDCHAR +STARTCHAR 33B6 +ENCODING 13238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -2 +BITMAP +0880 +0900 +4900 +5500 +5500 +9600 +A200 +D000 +ENDCHAR +STARTCHAR 33B7 +ENCODING 13239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +0880 +0900 +F900 +D500 +D500 +D600 +D200 +ENDCHAR +STARTCHAR 33B8 +ENCODING 13240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +89 +89 +A9 +C9 +C6 +A6 +96 +ENDCHAR +STARTCHAR 33B9 +ENCODING 13241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +9880 +9480 +9500 +B500 +B500 +F200 +D200 +ENDCHAR +STARTCHAR 33BA +ENCODING 13242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -2 +BITMAP +1280 +4A80 +AE80 +9F00 +9F00 +9D00 +A900 +C000 +8000 +ENDCHAR +STARTCHAR 33BB +ENCODING 13243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +1680 +5680 +B680 +AF00 +AB00 +A900 +A900 +ENDCHAR +STARTCHAR 33BC +ENCODING 13244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +0540 +0540 +2F40 +2F40 +2E80 +5680 +5280 +6000 +8000 +ENDCHAR +STARTCHAR 33BD +ENCODING 13245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +0A80 +2A80 +DE80 +DF00 +DF00 +DD00 +D900 +ENDCHAR +STARTCHAR 33BE +ENCODING 13246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +9280 +8E80 +AE80 +CF00 +CF00 +A900 +A900 +ENDCHAR +STARTCHAR 33BF +ENCODING 13247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 0 +BITMAP +9A80 +9A80 +BE80 +BF00 +B500 +D500 +D500 +ENDCHAR +STARTCHAR 33C0 +ENCODING 13248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0600 +8900 +8880 +B080 +C880 +C900 +A600 +AF00 +ENDCHAR +STARTCHAR 33C1 +ENCODING 13249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0600 +9900 +B080 +B080 +B080 +B900 +D600 +DF80 +ENDCHAR +STARTCHAR 33C2 +ENCODING 13250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 -1 +BITMAP +DF +55 +D5 +D5 +D0 +80 +ENDCHAR +STARTCHAR 33C3 +ENCODING 13251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +F0 +92 +95 +E9 +99 +99 +99 +67 +01 +ENDCHAR +STARTCHAR 33C4 +ENCODING 13252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 -1 +BITMAP +F7 +98 +88 +88 +95 +62 +ENDCHAR +STARTCHAR 33C5 +ENCODING 13253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0080 +4280 +B580 +9880 +8880 +8880 +9980 +6600 +ENDCHAR +STARTCHAR 33C6 +ENCODING 13254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1000 +9000 +9000 +9000 +6000 +3780 +2A80 +4680 +4380 +ENDCHAR +STARTCHAR 33C7 +ENCODING 13255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6000 +9000 +9200 +8500 +8900 +8900 +9900 +9980 +6600 +ENDCHAR +STARTCHAR 33C8 +ENCODING 13256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +1F00 +5880 +B900 +9F00 +9880 +9880 +9900 +6600 +ENDCHAR +STARTCHAR 33C9 +ENCODING 13257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +6000 +9000 +8800 +8480 +BD00 +8D00 +8B00 +9A00 +6200 +0200 +ENDCHAR +STARTCHAR 33CA +ENCODING 13258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 8 1 -1 +BITMAP +80 +E2 +9D +99 +97 +99 +99 +06 +ENDCHAR +STARTCHAR 33CB +ENCODING 13259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 7 2 0 +BITMAP +1E +12 +12 +FC +10 +10 +10 +ENDCHAR +STARTCHAR 33CF +ENCODING 13263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +84 +84 +A4 +C4 +C4 +A4 +A4 +02 +ENDCHAR +STARTCHAR 33D0 +ENCODING 13264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +80 +92 +AD +A5 +A5 +A5 +A5 +ENDCHAR +STARTCHAR 33D3 +ENCODING 13267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 0 +BITMAP +80 +80 +A4 +98 +90 +98 +A4 +ENDCHAR +STARTCHAR 33D6 +ENCODING 13270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +0080 +0280 +F580 +C980 +C980 +C980 +0980 +0600 +ENDCHAR +STARTCHAR 33D8 +ENCODING 13272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 6 1 -2 +BITMAP +DF +B5 +B5 +B5 +D5 +80 +ENDCHAR +STARTCHAR 33DB +ENCODING 13275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 -1 +BITMAP +EC +88 +68 +18 +98 +60 +ENDCHAR +STARTCHAR 33DC +ENCODING 13276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6000 +9000 +8000 +8480 +7500 +0D00 +8D00 +9200 +6000 +ENDCHAR +STARTCHAR 33DD +ENCODING 13277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +A800 +FA00 +F500 +F480 +F880 +9480 +9480 +0300 +ENDCHAR +STARTCHAR 4E00 +ENCODING 19968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 1 1 3 +BITMAP +FF80 +ENDCHAR +STARTCHAR 4E01 +ENCODING 19969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +08 +08 +08 +08 +08 +08 +38 +ENDCHAR +STARTCHAR 4E03 +ENCODING 19971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +20 +20 +23 +7C +A0 +20 +21 +21 +3F +ENDCHAR +STARTCHAR 4E07 +ENCODING 19975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +20 +20 +3F +21 +21 +41 +CA +86 +ENDCHAR +STARTCHAR 4E08 +ENCODING 19976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +FF +28 +68 +78 +18 +66 +C3 +ENDCHAR +STARTCHAR 4E09 +ENCODING 19977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +7F00 +0000 +0000 +7E00 +0000 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR 4E0A +ENCODING 19978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1000 +1000 +1000 +0F00 +1000 +1000 +1000 +1000 +FF80 +ENDCHAR +STARTCHAR 4E0B +ENCODING 19979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +10 +08 +14 +12 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 4E0D +ENCODING 19981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +18 +2C +4B +89 +08 +08 +08 +ENDCHAR +STARTCHAR 4E11 +ENCODING 19985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +1200 +1200 +2200 +FF80 +2200 +2200 +2200 +FF00 +ENDCHAR +STARTCHAR 4E14 +ENCODING 19988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +4200 +7E00 +4200 +4200 +7E00 +4200 +FF80 +ENDCHAR +STARTCHAR 4E15 +ENCODING 19989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +1400 +2A00 +4900 +8880 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 4E16 +ENCODING 19990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5200 +5200 +FF80 +5200 +5200 +5200 +4E00 +7F00 +4000 +ENDCHAR +STARTCHAR 4E18 +ENCODING 19992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +06 +78 +40 +40 +7F +44 +44 +44 +FF +ENDCHAR +STARTCHAR 4E19 +ENCODING 19993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +FF +99 +99 +A5 +C3 +81 +83 +ENDCHAR +STARTCHAR 4E1E +ENCODING 19998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +04 +09 +EE +2A +4B +89 +18 +FF +ENDCHAR +STARTCHAR 4E2D +ENCODING 20013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +89 +89 +89 +FF +08 +08 +08 +ENDCHAR +STARTCHAR 4E32 +ENCODING 20018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7F +49 +7F +08 +FF +89 +FF +08 +08 +ENDCHAR +STARTCHAR 4E38 +ENCODING 20024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1000 +FC00 +1200 +5200 +2200 +3A00 +2200 +C280 +8300 +ENDCHAR +STARTCHAR 4E39 +ENCODING 20025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +5200 +4A00 +4A00 +FF80 +4200 +4200 +8200 +8600 +ENDCHAR +STARTCHAR 4E3B +ENCODING 20027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +08 +FF +08 +08 +08 +7F +08 +08 +FF +ENDCHAR +STARTCHAR 4E42 +ENCODING 20034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +42 +C2 +A4 +24 +18 +18 +34 +63 +81 +ENDCHAR +STARTCHAR 4E43 +ENCODING 20035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FC +24 +24 +27 +21 +41 +41 +81 +86 +ENDCHAR +STARTCHAR 4E45 +ENCODING 20037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +3C +44 +C4 +88 +18 +34 +63 +81 +ENDCHAR +STARTCHAR 4E4B +ENCODING 20043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1000 +FE00 +0200 +0400 +0800 +7000 +E000 +C000 +BF80 +ENDCHAR +STARTCHAR 4E4D +ENCODING 20045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +20 +7F +D0 +8F +10 +0F +10 +10 +10 +ENDCHAR +STARTCHAR 4E4E +ENCODING 20046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +F900 +4A00 +2A00 +0800 +FF80 +0800 +0800 +3800 +ENDCHAR +STARTCHAR 4E4F +ENCODING 20047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +F800 +0800 +FF00 +0200 +0C00 +7000 +A000 +9F80 +ENDCHAR +STARTCHAR 4E56 +ENCODING 20054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +7C00 +FF80 +2C00 +ED00 +2E00 +6C80 +AF00 +2800 +0800 +ENDCHAR +STARTCHAR 4E58 +ENCODING 20056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +7C00 +FF80 +ED00 +6E80 +B700 +4A00 +8980 +0800 +ENDCHAR +STARTCHAR 4E59 +ENCODING 20057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +0400 +0800 +1000 +2000 +2000 +4080 +8100 +7F00 +ENDCHAR +STARTCHAR 4E5D +ENCODING 20061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +2000 +2000 +FC00 +2400 +2400 +2400 +4480 +C480 +8300 +ENDCHAR +STARTCHAR 4E5E +ENCODING 20062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +2000 +7F00 +C000 +FC00 +0800 +1000 +2080 +4100 +7F00 +ENDCHAR +STARTCHAR 4E5F +ENCODING 20063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +4800 +4F00 +F900 +C900 +4900 +4900 +4E00 +4080 +7F00 +ENDCHAR +STARTCHAR 4E6B +ENCODING 20075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +F700 +5500 +5500 +B700 +0000 +FC00 +1000 +6080 +7F00 +ENDCHAR +STARTCHAR 4E6D +ENCODING 20077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2000 +7E00 +BE00 +0000 +FC00 +1000 +2080 +7F00 +ENDCHAR +STARTCHAR 4E73 +ENCODING 20083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1400 +F400 +AC00 +F400 +1400 +2C00 +F480 +2480 +6700 +ENDCHAR +STARTCHAR 4E76 +ENCODING 20086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +0A +FF +7F +7F +7F +8B +FC +10 +61 +7F +ENDCHAR +STARTCHAR 4E77 +ENCODING 20087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5500 +D480 +4D00 +CE00 +B000 +FC00 +1000 +6080 +7F00 +ENDCHAR +STARTCHAR 4E7E +ENCODING 20094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +F400 +4F80 +F800 +FF00 +9200 +F200 +4400 +F880 +4F80 +ENDCHAR +STARTCHAR 4E82 +ENCODING 20098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FA00 +AA00 +7A00 +5200 +FA00 +FA00 +FA00 +AA80 +DB80 +ENDCHAR +STARTCHAR 4E86 +ENCODING 20102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +02 +04 +08 +08 +08 +08 +08 +30 +ENDCHAR +STARTCHAR 4E88 +ENCODING 20104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +04 +18 +FF +09 +0A +08 +08 +30 +ENDCHAR +STARTCHAR 4E8B +ENCODING 20107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +4900 +7F00 +FF00 +FF80 +0900 +FF00 +3800 +ENDCHAR +STARTCHAR 4E8C +ENCODING 20108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 0 +BITMAP +7F +00 +00 +00 +00 +00 +FF +ENDCHAR +STARTCHAR 4E8E +ENCODING 20110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 4E90 +ENCODING 20112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1000 +FF80 +2000 +2000 +3F00 +2100 +0200 +0E00 +ENDCHAR +STARTCHAR 4E91 +ENCODING 20113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +00 +00 +FF +10 +22 +22 +4F +F1 +ENDCHAR +STARTCHAR 4E92 +ENCODING 20114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2000 +3E00 +2200 +4200 +7E00 +4200 +0200 +FF80 +ENDCHAR +STARTCHAR 4E94 +ENCODING 20116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1000 +1000 +1000 +7E00 +1200 +2200 +2200 +FF80 +ENDCHAR +STARTCHAR 4E95 +ENCODING 20117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +FF00 +2400 +2400 +FF80 +2400 +4400 +4400 +8400 +ENDCHAR +STARTCHAR 4E98 +ENCODING 20120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +00 +7E +42 +7E +42 +7E +00 +FF +ENDCHAR +STARTCHAR 4E9B +ENCODING 20123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +A500 +B600 +A400 +B480 +C700 +7F00 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR 4E9E +ENCODING 20126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1400 +1400 +6700 +8100 +6700 +1400 +1400 +FF80 +ENDCHAR +STARTCHAR 4EA1 +ENCODING 20129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +0800 +FF80 +4000 +4000 +4000 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR 4EA2 +ENCODING 20130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0000 +3C00 +2400 +2400 +2400 +4400 +C480 +8700 +ENDCHAR +STARTCHAR 4EA4 +ENCODING 20132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +FF +26 +C1 +24 +14 +08 +36 +C1 +ENDCHAR +STARTCHAR 4EA5 +ENCODING 20133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +1000 +6400 +2800 +1200 +6400 +CC00 +3200 +C100 +ENDCHAR +STARTCHAR 4EA6 +ENCODING 20134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +14 +56 +A5 +A5 +24 +44 +98 +ENDCHAR +STARTCHAR 4EA8 +ENCODING 20136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +4200 +7E00 +FF00 +0400 +0800 +0800 +1800 +ENDCHAR +STARTCHAR 4EAB +ENCODING 20139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +7E00 +0000 +7E00 +0800 +FF80 +0800 +1800 +ENDCHAR +STARTCHAR 4EAC +ENCODING 20140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +00 +7E +42 +7E +08 +2A +49 +B9 +ENDCHAR +STARTCHAR 4EAD +ENCODING 20141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +7E +7E +00 +FF +81 +7F +08 +38 +ENDCHAR +STARTCHAR 4EAE +ENCODING 20142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +7E00 +0000 +FF00 +A500 +2400 +6480 +C700 +ENDCHAR +STARTCHAR 4EB6 +ENCODING 20150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7F00 +A500 +7F00 +0000 +7E00 +7E00 +7E00 +FF80 +ENDCHAR +STARTCHAR 4EBA +ENCODING 20154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +08 +18 +18 +14 +22 +43 +81 +ENDCHAR +STARTCHAR 4EC0 +ENCODING 20160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +C400 +C400 +7F80 +4400 +4400 +4400 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 4EC1 +ENCODING 20161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4000 +5F00 +4000 +C000 +4000 +4000 +4000 +7F80 +4000 +ENDCHAR +STARTCHAR 4EC4 +ENCODING 20164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F80 +8800 +8800 +8800 +8800 +8C00 +9200 +A300 +E100 +ENDCHAR +STARTCHAR 4EC7 +ENCODING 20167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5000 +5000 +BE00 +9200 +9200 +5200 +5280 +6280 +6300 +ENDCHAR +STARTCHAR 4ECA +ENCODING 20170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +2400 +4300 +BD80 +0000 +7F00 +0200 +0200 +0400 +0800 +ENDCHAR +STARTCHAR 4ECB +ENCODING 20171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +1800 +2400 +4300 +A580 +2400 +2400 +2400 +4400 +8400 +ENDCHAR +STARTCHAR 4ECD +ENCODING 20173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +5E +52 +92 +93 +91 +51 +51 +61 +63 +ENDCHAR +STARTCHAR 4ED4 +ENCODING 20180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +5F00 +4200 +4400 +C400 +FF80 +4400 +4400 +4400 +5C00 +ENDCHAR +STARTCHAR 4ED5 +ENCODING 20181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4400 +4400 +7F80 +C400 +C400 +4400 +4400 +4400 +5F00 +ENDCHAR +STARTCHAR 4ED6 +ENCODING 20182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +5400 +5500 +5F00 +F500 +D500 +5700 +5400 +5080 +5F00 +ENDCHAR +STARTCHAR 4ED7 +ENCODING 20183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4400 +7F80 +4400 +D400 +CC00 +4C00 +4C00 +5B00 +6180 +ENDCHAR +STARTCHAR 4ED8 +ENCODING 20184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +4200 +5F80 +4200 +D200 +4A00 +4A00 +4200 +4200 +4600 +ENDCHAR +STARTCHAR 4ED9 +ENCODING 20185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +55 +D5 +D5 +D5 +55 +55 +5F +51 +ENDCHAR +STARTCHAR 4EDD +ENCODING 20189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +18 +14 +24 +43 +81 +7E +08 +08 +FF +ENDCHAR +STARTCHAR 4EDF +ENCODING 20191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +5C00 +4400 +4400 +FF80 +C400 +4400 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 4EE3 +ENCODING 20195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2A00 +4900 +4800 +FF00 +C800 +4400 +4400 +4280 +4300 +ENDCHAR +STARTCHAR 4EE4 +ENCODING 20196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +4300 +BD80 +0000 +7E00 +1100 +1200 +1000 +ENDCHAR +STARTCHAR 4EE5 +ENCODING 20197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4200 +5200 +4A00 +4200 +4200 +4A00 +7600 +8D00 +1080 +ENDCHAR +STARTCHAR 4EF0 +ENCODING 20208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +77 +65 +A5 +A5 +A5 +AD +B5 +84 +84 +ENDCHAR +STARTCHAR 4EF2 +ENCODING 20210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +44 +5F +65 +E5 +E5 +5F +44 +44 +44 +ENDCHAR +STARTCHAR 4EF6 +ENCODING 20214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +5400 +5F00 +E400 +E400 +7F80 +4400 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 4EF7 +ENCODING 20215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4A00 +5100 +6080 +D200 +D200 +5200 +5200 +7200 +6200 +ENDCHAR +STARTCHAR 4EFB +ENCODING 20219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +5C00 +4400 +4400 +FF80 +C400 +4400 +4400 +7F80 +4000 +ENDCHAR +STARTCHAR 4F01 +ENCODING 20225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +1C00 +2600 +CB00 +C880 +4F00 +4800 +4800 +FF80 +ENDCHAR +STARTCHAR 4F09 +ENCODING 20233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +4000 +DE00 +D200 +D200 +5200 +5280 +7280 +6300 +ENDCHAR +STARTCHAR 4F0A +ENCODING 20234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +5F00 +4500 +7F80 +C500 +DF00 +4900 +4800 +5800 +6000 +ENDCHAR +STARTCHAR 4F0B +ENCODING 20235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +5E00 +5200 +4A00 +DB00 +D500 +5600 +5600 +6D00 +7080 +ENDCHAR +STARTCHAR 4F0D +ENCODING 20237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +4800 +8800 +BF00 +8900 +4900 +4900 +4900 +7F80 +ENDCHAR +STARTCHAR 4F0E +ENCODING 20238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +7F80 +C400 +DF00 +5100 +4A00 +4400 +5B00 +6180 +ENDCHAR +STARTCHAR 4F0F +ENCODING 20239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +4500 +4400 +7F80 +C400 +CC00 +4A00 +5200 +7100 +6080 +ENDCHAR +STARTCHAR 4F10 +ENCODING 20240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4A00 +4F00 +7800 +C900 +C600 +4400 +4400 +5A80 +7100 +ENDCHAR +STARTCHAR 4F11 +ENCODING 20241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4400 +7F80 +4C00 +CC00 +CE00 +5500 +6500 +6480 +4400 +ENDCHAR +STARTCHAR 4F2F +ENCODING 20271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +44 +5F +91 +91 +9F +51 +51 +5F +51 +ENDCHAR +STARTCHAR 4F34 +ENCODING 20276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5600 +5500 +A480 +9F00 +4400 +7F80 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 4F36 +ENCODING 20278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +5300 +BE80 +8000 +BF00 +8900 +8900 +8B00 +8800 +ENDCHAR +STARTCHAR 4F38 +ENCODING 20280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +44 +5F +55 +DF +D5 +5F +55 +44 +44 +ENDCHAR +STARTCHAR 4F3A +ENCODING 20282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7F +41 +5F +81 +9D +95 +5D +55 +41 +43 +ENDCHAR +STARTCHAR 4F3C +ENCODING 20284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5900 +5500 +9500 +9100 +9200 +9200 +9F00 +B500 +8480 +ENDCHAR +STARTCHAR 4F3D +ENCODING 20285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +30 +53 +7B +5B +9B +9B +5B +6B +6B +5B +ENDCHAR +STARTCHAR 4F43 +ENCODING 20291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +5F +55 +55 +DF +D5 +55 +55 +5F +51 +ENDCHAR +STARTCHAR 4F46 +ENCODING 20294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +5F00 +5100 +5100 +DF00 +D100 +5F00 +4000 +4000 +7F80 +ENDCHAR +STARTCHAR 4F47 +ENCODING 20295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +5F00 +6080 +6080 +FF80 +C400 +4400 +4400 +4400 +4C00 +ENDCHAR +STARTCHAR 4F48 +ENCODING 20296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +7F80 +9400 +9F00 +7500 +7500 +5500 +5500 +4400 +ENDCHAR +STARTCHAR 4F4D +ENCODING 20301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +7F00 +9100 +9200 +9200 +4A00 +4A00 +4200 +7F80 +ENDCHAR +STARTCHAR 4F4E +ENCODING 20302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +5C00 +5400 +5400 +DF00 +D200 +5E00 +7280 +4100 +7E00 +ENDCHAR +STARTCHAR 4F4F +ENCODING 20303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4400 +7F00 +4400 +C400 +DF00 +4400 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 4F50 +ENCODING 20304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4800 +7F80 +4800 +D000 +DF00 +6400 +6400 +4400 +7F80 +ENDCHAR +STARTCHAR 4F51 +ENCODING 20305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4800 +7F80 +4800 +D000 +DF00 +7100 +7100 +5F00 +5100 +ENDCHAR +STARTCHAR 4F55 +ENCODING 20309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +5F80 +4100 +DD00 +D500 +D500 +5D00 +5500 +4100 +4300 +ENDCHAR +STARTCHAR 4F59 +ENCODING 20313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +18 +34 +43 +FF +08 +FF +2C +CB +B1 +ENDCHAR +STARTCHAR 4F5A +ENCODING 20314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +5400 +5F00 +5400 +E400 +FF80 +4400 +4A00 +5100 +6080 +ENDCHAR +STARTCHAR 4F5B +ENCODING 20315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4C +7F +4D +BF +AC +AC +7F +55 +55 +64 +ENDCHAR +STARTCHAR 4F5C +ENCODING 20316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +5000 +5F80 +7400 +E700 +C400 +4700 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 4F69 +ENCODING 20329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +6100 +7D00 +A900 +BD00 +BB00 +BB00 +B500 +A980 +C980 +ENDCHAR +STARTCHAR 4F6F +ENCODING 20335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3100 +4A00 +7F80 +4400 +DF00 +C400 +7F80 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 4F70 +ENCODING 20336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +4400 +9F00 +9100 +9100 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 4F73 +ENCODING 20339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +5F00 +4400 +4400 +FF80 +C400 +7F00 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 4F76 +ENCODING 20342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4400 +7F80 +8400 +9F00 +4000 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 4F7A +ENCODING 20346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3C00 +4C00 +4A00 +5100 +FF80 +4400 +5E00 +4400 +4400 +7F00 +ENDCHAR +STARTCHAR 4F7E +ENCODING 20350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2E00 +5200 +5100 +7F80 +F100 +DF00 +5100 +5F00 +5100 +6300 +ENDCHAR +STARTCHAR 4F7F +ENCODING 20351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +4400 +9F00 +9500 +9F00 +5400 +4800 +5600 +6180 +ENDCHAR +STARTCHAR 4F81 +ENCODING 20353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +5400 +5F00 +5400 +E400 +FF80 +4A00 +4A00 +5280 +6300 +ENDCHAR +STARTCHAR 4F83 +ENCODING 20355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2F80 +3080 +3080 +4F80 +4000 +AD00 +2D00 +2D00 +3540 +35C0 +ENDCHAR +STARTCHAR 4F84 +ENCODING 20356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +4900 +8B00 +BC80 +8400 +5F00 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 4F86 +ENCODING 20358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +2A +4A +6B +BD +2C +4B +89 +08 +ENDCHAR +STARTCHAR 4F88 +ENCODING 20360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4F00 +5200 +AC00 +9A00 +7780 +5900 +7600 +4C00 +7000 +ENDCHAR +STARTCHAR 4F8A +ENCODING 20362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6500 +5500 +9600 +BF00 +4A00 +4A00 +5200 +5280 +6300 +ENDCHAR +STARTCHAR 4F8B +ENCODING 20363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +79 +53 +9B +AB +BB +8B +93 +91 +A3 +ENDCHAR +STARTCHAR 4F8D +ENCODING 20365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +5F00 +4400 +BF80 +8200 +BF80 +5200 +4A00 +4200 +4600 +ENDCHAR +STARTCHAR 4F8F +ENCODING 20367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +5400 +5F00 +6400 +BF80 +8C00 +4E00 +5500 +6480 +4400 +ENDCHAR +STARTCHAR 4F91 +ENCODING 20369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +7F80 +4800 +9F00 +B100 +BF00 +5100 +5F00 +5100 +5300 +ENDCHAR +STARTCHAR 4F96 +ENCODING 20374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +2400 +3F00 +C080 +8000 +7F00 +5500 +7F00 +5500 +5700 +ENDCHAR +STARTCHAR 4F98 +ENCODING 20376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +6280 +CC00 +D800 +DF80 +6800 +4800 +4880 +4700 +ENDCHAR +STARTCHAR 4F9B +ENCODING 20379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5200 +5200 +BF00 +9200 +7F80 +4000 +5200 +7100 +6080 +ENDCHAR +STARTCHAR 4F9D +ENCODING 20381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +7F80 +4C00 +CD00 +D200 +7200 +5100 +5500 +7880 +ENDCHAR +STARTCHAR 4FAE +ENCODING 20398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F00 +B000 +BF00 +9500 +7F80 +5900 +5F00 +6100 +4600 +ENDCHAR +STARTCHAR 4FAF +ENCODING 20399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +4200 +7F80 +9000 +9F00 +A400 +BF80 +8C00 +9200 +A180 +ENDCHAR +STARTCHAR 4FB5 +ENCODING 20405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2F80 +2080 +3FC0 +6F80 +7F80 +B040 +3F80 +2500 +2700 +38C0 +ENDCHAR +STARTCHAR 4FB6 +ENCODING 20406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +5F +51 +9F +84 +48 +5F +61 +5F +61 +ENDCHAR +STARTCHAR 4FBF +ENCODING 20415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F80 +5F00 +9500 +9F00 +9F00 +5400 +4C00 +5600 +6180 +ENDCHAR +STARTCHAR 4FC2 +ENCODING 20418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +7C00 +5A00 +DC00 +C900 +7F00 +4400 +5700 +6480 +4400 +ENDCHAR +STARTCHAR 4FC3 +ENCODING 20419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +5100 +5100 +DF00 +C400 +D400 +5780 +5400 +6C00 +6780 +ENDCHAR +STARTCHAR 4FC4 +ENCODING 20420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +7500 +5300 +BF80 +9200 +5500 +7B00 +5200 +5680 +7500 +ENDCHAR +STARTCHAR 4FC9 +ENCODING 20425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +4800 +5F00 +8900 +BF80 +8000 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 4FCA +ENCODING 20426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4900 +5F00 +CC80 +FB00 +4800 +5F00 +6A00 +4E00 +7180 +ENDCHAR +STARTCHAR 4FCE +ENCODING 20430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +4900 +6900 +AF00 +4900 +4900 +6F00 +9900 +9F80 +ENDCHAR +STARTCHAR 4FD1 +ENCODING 20433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +4A +44 +9F +A5 +9F +65 +5F +65 +65 +ENDCHAR +STARTCHAR 4FD3 +ENCODING 20435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +5500 +5500 +EA00 +D500 +5500 +5F00 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 4FD4 +ENCODING 20436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +5100 +5F00 +D100 +DF00 +5100 +5F00 +4A00 +5280 +6300 +ENDCHAR +STARTCHAR 4FD7 +ENCODING 20439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4A +53 +65 +8C +92 +B1 +7F +52 +5E +52 +ENDCHAR +STARTCHAR 4FDA +ENCODING 20442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +5500 +9F00 +9500 +5F00 +5F00 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 4FDD +ENCODING 20445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +5100 +5100 +CE00 +FF80 +4E00 +4D00 +5480 +6400 +ENDCHAR +STARTCHAR 4FDF +ENCODING 20447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4900 +7F00 +9080 +9F00 +A400 +7F80 +4C00 +5B00 +6180 +ENDCHAR +STARTCHAR 4FE0 +ENCODING 20448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4400 +7F80 +5500 +D500 +F700 +6E80 +4A00 +5100 +6080 +ENDCHAR +STARTCHAR 4FE1 +ENCODING 20449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +4000 +7F80 +DF00 +C000 +5F00 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 4FEE +ENCODING 20462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +7900 +B600 +BF80 +A600 +BA00 +AD80 +A600 +9800 +ENDCHAR +STARTCHAR 4FEF +ENCODING 20463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +6500 +AF80 +A900 +BD00 +AB00 +A900 +A900 +AB00 +ENDCHAR +STARTCHAR 4FF1 +ENCODING 20465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +5100 +5F00 +D100 +DF00 +5F00 +7F80 +4000 +5A00 +6180 +ENDCHAR +STARTCHAR 4FF3 +ENCODING 20467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4A00 +7B80 +8A00 +BB80 +8A00 +5B80 +6A00 +5200 +6200 +ENDCHAR +STARTCHAR 4FF5 +ENCODING 20469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +4400 +9F00 +BF80 +4D00 +5200 +7200 +5D00 +7080 +ENDCHAR +STARTCHAR 4FF8 +ENCODING 20472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +4800 +9F00 +BF00 +9500 +7E80 +7F00 +4400 +4400 +ENDCHAR +STARTCHAR 4FFA +ENCODING 20474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +7F00 +4A00 +D500 +FF80 +D500 +5F00 +5F00 +4480 +4700 +ENDCHAR +STARTCHAR 5002 +ENCODING 20482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5200 +7F80 +9200 +9200 +9F80 +7200 +5200 +5200 +6200 +ENDCHAR +STARTCHAR 5006 +ENCODING 20486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F80 +8400 +BF00 +B700 +AF00 +BF00 +BD00 +A500 +A500 +ENDCHAR +STARTCHAR 5009 +ENCODING 20489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +3400 +7F00 +FF80 +7E00 +4200 +7E00 +7E00 +A100 +BE00 +ENDCHAR +STARTCHAR 500B +ENCODING 20491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +65 +65 +EF +E5 +EF +6B +6F +5F +61 +ENDCHAR +STARTCHAR 500D +ENCODING 20493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +5200 +8A00 +BF80 +8000 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 5011 +ENCODING 20497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7B +6B +7B +AB +BB +A1 +A1 +A1 +A1 +A3 +ENDCHAR +STARTCHAR 5012 +ENCODING 20498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +7F +9B +BF +87 +93 +BF +93 +BD +83 +ENDCHAR +STARTCHAR 5016 +ENCODING 20502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +4400 +7F80 +CA00 +FF80 +4400 +5F00 +4400 +4400 +ENDCHAR +STARTCHAR 5019 +ENCODING 20505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4100 +7F80 +A800 +AF00 +B400 +BF80 +A600 +8900 +9080 +ENDCHAR +STARTCHAR 501A +ENCODING 20506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +3F00 +4A00 +5100 +FF80 +C100 +5D00 +5D00 +5500 +4300 +ENDCHAR +STARTCHAR 501C +ENCODING 20508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +5F +DF +D5 +51 +5F +6F +69 +63 +ENDCHAR +STARTCHAR 501E +ENCODING 20510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +4000 +DF00 +D100 +5F00 +4400 +5500 +6480 +4C00 +ENDCHAR +STARTCHAR 501F +ENCODING 20511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F00 +4A00 +BF80 +8000 +5F00 +5100 +5F00 +5F00 +5100 +ENDCHAR +STARTCHAR 5021 +ENCODING 20513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3F +51 +5F +5F +C0 +5F +61 +5F +5F +61 +ENDCHAR +STARTCHAR 5023 +ENCODING 20515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5200 +7B80 +A500 +9D00 +AB00 +A900 +AB00 +AF00 +D480 +ENDCHAR +STARTCHAR 5024 +ENCODING 20516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +4400 +8F00 +AF00 +A900 +6F00 +6F00 +7F80 +6000 +ENDCHAR +STARTCHAR 5026 +ENCODING 20518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +6900 +BF00 +8C00 +BF80 +9F00 +B280 +9600 +9100 +9F00 +ENDCHAR +STARTCHAR 5027 +ENCODING 20519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +7F00 +6080 +5F00 +C000 +FF80 +5500 +5500 +6480 +4C00 +ENDCHAR +STARTCHAR 5028 +ENCODING 20520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +6100 +6100 +9F00 +9F80 +A400 +AF00 +A880 +AF00 +C880 +ENDCHAR +STARTCHAR 502A +ENCODING 20522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5300 +6100 +9B00 +A100 +9F00 +4A00 +5200 +5280 +6300 +ENDCHAR +STARTCHAR 502B +ENCODING 20523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5300 +5E80 +A000 +BF00 +6B00 +6B00 +7F00 +6B00 +6B00 +ENDCHAR +STARTCHAR 502C +ENCODING 20524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4700 +4400 +DF00 +DF00 +D100 +5F00 +7F80 +4400 +4400 +ENDCHAR +STARTCHAR 502D +ENCODING 20525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +7F00 +8E00 +B580 +8800 +7F80 +5A00 +4600 +7900 +ENDCHAR +STARTCHAR 503B +ENCODING 20539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7B80 +6B00 +6B00 +BB00 +AB00 +BA80 +AA80 +BB00 +8A00 +8A00 +ENDCHAR +STARTCHAR 5043 +ENCODING 20547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +6000 +6F00 +AF00 +AF00 +BF80 +AA00 +A700 +A800 +BF80 +ENDCHAR +STARTCHAR 5047 +ENCODING 20551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1D80 +3480 +3480 +5D80 +5000 +BF80 +5280 +5D00 +5180 +5240 +ENDCHAR +STARTCHAR 5048 +ENCODING 20552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +5F +9F +90 +7F +65 +6B +5F +43 +ENDCHAR +STARTCHAR 5049 +ENCODING 20553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F00 +7F80 +8000 +9F00 +9F00 +4400 +5F00 +7F80 +4400 +ENDCHAR +STARTCHAR 504F +ENCODING 20559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +43 +7C +7F +A1 +BF +BF +B7 +BF +B7 +57 +ENDCHAR +STARTCHAR 5055 +ENCODING 20565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +5D00 +5780 +9B00 +B400 +9F00 +5100 +5F00 +5100 +5F00 +ENDCHAR +STARTCHAR 505A +ENCODING 20570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5200 +7B80 +9500 +9500 +BB00 +AA00 +AA00 +BD00 +8480 +ENDCHAR +STARTCHAR 505C +ENCODING 20572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +5F00 +9F00 +8000 +7F00 +7F00 +4400 +4400 +4C00 +ENDCHAR +STARTCHAR 5065 +ENCODING 20581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +7F00 +5F80 +A300 +BF00 +9F00 +B200 +BF00 +9200 +AF80 +ENDCHAR +STARTCHAR 5074 +ENCODING 20596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +79 +6B +AB +BB +AB +BB +BB +81 +A9 +A7 +ENDCHAR +STARTCHAR 5075 +ENCODING 20597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4780 +5F00 +D100 +DF00 +D100 +5F00 +5F00 +5A00 +6180 +ENDCHAR +STARTCHAR 5076 +ENCODING 20598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3F +55 +5F +55 +DF +C4 +7F +67 +79 +63 +ENDCHAR +STARTCHAR 5078 +ENCODING 20600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5C00 +4A00 +5F00 +A080 +BB00 +BB00 +6500 +7B00 +6B00 +6A80 +ENDCHAR +STARTCHAR 5080 +ENCODING 20608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F00 +6500 +9F00 +A500 +5F00 +4F00 +5780 +5480 +6700 +ENDCHAR +STARTCHAR 5085 +ENCODING 20613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +7F80 +5F00 +D500 +DF00 +DF00 +4100 +7F80 +4900 +4200 +ENDCHAR +STARTCHAR 508D +ENCODING 20621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +7F +52 +BF +A5 +BF +88 +9F +91 +A6 +ENDCHAR +STARTCHAR 5091 +ENCODING 20625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5F00 +6D00 +9780 +B100 +A500 +BF00 +8C00 +9700 +A500 +ENDCHAR +STARTCHAR 5098 +ENCODING 20632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +3400 +6B00 +AB80 +6D00 +2A00 +6D00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 5099 +ENCODING 20633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F00 +4A00 +BF80 +AF00 +B500 +AF00 +AF00 +B500 +D500 +ENDCHAR +STARTCHAR 50AC +ENCODING 20652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5480 +5480 +5F00 +9400 +9F80 +B400 +5F00 +5F00 +5F80 +5000 +ENDCHAR +STARTCHAR 50AD +ENCODING 20653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +6F00 +BF80 +BF00 +A400 +7F00 +7F00 +7F00 +5500 +ENDCHAR +STARTCHAR 50B2 +ENCODING 20658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +7A00 +5380 +BD00 +9500 +BB00 +9B00 +AB00 +AB00 +DC80 +ENDCHAR +STARTCHAR 50B3 +ENCODING 20659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +7F00 +BF00 +BF00 +8500 +BF00 +BF80 +9200 +8600 +ENDCHAR +STARTCHAR 50B5 +ENCODING 20661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +5F00 +BF80 +9F00 +9F00 +5100 +5F00 +5A00 +6180 +ENDCHAR +STARTCHAR 50B7 +ENCODING 20663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F00 +7F00 +BF00 +9F00 +BF80 +9F00 +AB00 +9500 +8B00 +ENDCHAR +STARTCHAR 50BE +ENCODING 20670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +6200 +7F00 +B900 +AF00 +AF00 +A900 +BF00 +8D00 +9080 +ENDCHAR +STARTCHAR 50C5 +ENCODING 20677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +7F00 +9E00 +BF00 +A500 +BF00 +BF00 +9F00 +8400 +BF80 +ENDCHAR +STARTCHAR 50C9 +ENCODING 20681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +2400 +7E00 +8180 +7F00 +7F00 +0000 +2400 +6600 +9900 +ENDCHAR +STARTCHAR 50CA +ENCODING 20682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F80 +4A00 +5F00 +DF00 +C800 +FF80 +5F00 +7680 +5100 +5F00 +ENDCHAR +STARTCHAR 50CF +ENCODING 20687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5E00 +7F00 +B500 +9F00 +9B00 +6E00 +7500 +5C80 +6C00 +ENDCHAR +STARTCHAR 50D1 +ENCODING 20689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +7F80 +9F00 +BE80 +BF00 +A100 +AF00 +AF00 +A100 +ENDCHAR +STARTCHAR 50D5 +ENCODING 20693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +7F80 +8A00 +BF00 +5F00 +7F80 +4C00 +5A00 +6180 +ENDCHAR +STARTCHAR 50D6 +ENCODING 20694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +7F00 +9F00 +A100 +9E00 +BF80 +BF00 +BF00 +A100 +ENDCHAR +STARTCHAR 50DA +ENCODING 20698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +7F80 +6D00 +BF00 +A180 +9E00 +9E00 +9600 +A500 +A880 +ENDCHAR +STARTCHAR 50DE +ENCODING 20702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5D00 +6500 +BE00 +9F00 +9100 +5F80 +7680 +7500 +6300 +ENDCHAR +STARTCHAR 50E5 +ENCODING 20709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +5F00 +7F00 +9200 +BF00 +B780 +7F80 +4C00 +5480 +6300 +ENDCHAR +STARTCHAR 50E7 +ENCODING 20711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +5100 +7F00 +B780 +9F00 +8000 +5F00 +5F00 +5100 +5F00 +ENDCHAR +STARTCHAR 50ED +ENCODING 20717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +7300 +BF80 +9280 +BD80 +8000 +BF00 +BF00 +BF00 +A100 +ENDCHAR +STARTCHAR 50F9 +ENCODING 20729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +4A00 +7F80 +BF00 +9F00 +5F00 +6100 +5F00 +5200 +6100 +ENDCHAR +STARTCHAR 50FB +ENCODING 20731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7A00 +6F80 +AD00 +BB00 +A780 +A200 +BA00 +EF80 +9A00 +AA00 +ENDCHAR +STARTCHAR 50FF +ENCODING 20735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +4A00 +BF00 +9F00 +BF80 +9500 +BF80 +8400 +BF80 +ENDCHAR +STARTCHAR 5100 +ENCODING 20736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +7F00 +5F00 +BF80 +8000 +7D00 +7F80 +7B00 +5200 +7580 +ENDCHAR +STARTCHAR 5101 +ENCODING 20737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +34 +5F +74 +BF +9C +9F +5B +6B +6F +61 +ENDCHAR +STARTCHAR 5104 +ENCODING 20740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +7F80 +8000 +9F00 +9F00 +9F00 +AD00 +AB00 +AE80 +ENDCHAR +STARTCHAR 5106 +ENCODING 20742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6A00 +7E00 +6B80 +A300 +BB00 +B700 +7500 +B900 +8B00 +9C80 +ENDCHAR +STARTCHAR 5109 +ENCODING 20745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5300 +6F80 +A000 +BB00 +7B00 +4000 +5200 +7300 +6D00 +ENDCHAR +STARTCHAR 5112 +ENCODING 20754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +7F80 +A480 +8400 +BF80 +BF00 +AA80 +AA80 +AB00 +ENDCHAR +STARTCHAR 511F +ENCODING 20767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +7F80 +6080 +9F00 +8000 +9F00 +9F00 +9F00 +8200 +B180 +ENDCHAR +STARTCHAR 5121 +ENCODING 20769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +5F +9F +80 +BF +BF +BF +BF +AD +ENDCHAR +STARTCHAR 512A +ENCODING 20778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +5F00 +5F00 +9F00 +BF80 +BF80 +6F00 +5F00 +6A00 +7F80 +ENDCHAR +STARTCHAR 5132 +ENCODING 20786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7200 +4700 +7B00 +B780 +8300 +B700 +BD00 +AF00 +B700 +AD00 +ENDCHAR +STARTCHAR 5137 +ENCODING 20791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +7F00 +BE80 +8400 +BF80 +BF00 +BF00 +B300 +BE80 +D300 +ENDCHAR +STARTCHAR 513A +ENCODING 20794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6B00 +7D00 +BF80 +BD00 +BB80 +BD00 +BB80 +FD00 +B380 +CC00 +ENDCHAR +STARTCHAR 513C +ENCODING 20796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7B00 +7B00 +4000 +BF80 +BE00 +BF80 +BB00 +BB00 +B500 +4A80 +ENDCHAR +STARTCHAR 5140 +ENCODING 20800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2400 +2400 +2400 +2400 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5141 +ENCODING 20801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2400 +2200 +FF00 +2400 +2400 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5143 +ENCODING 20803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +0000 +0000 +FF00 +2400 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5144 +ENCODING 20804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4100 +4100 +4100 +7E00 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5145 +ENCODING 20805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2000 +2200 +FF00 +2500 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5146 +ENCODING 20806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +1900 +9A00 +5A00 +1800 +6A00 +A900 +2800 +4880 +8700 +ENDCHAR +STARTCHAR 5147 +ENCODING 20807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4500 +7900 +5D00 +6500 +7E00 +1800 +2800 +4880 +8700 +ENDCHAR +STARTCHAR 5148 +ENCODING 20808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +4800 +7F00 +4800 +FF80 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5149 +ENCODING 20809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +4A00 +2A00 +0800 +FF00 +2400 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 514B +ENCODING 20811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0800 +7E00 +4100 +7E00 +5900 +2800 +6880 +8700 +ENDCHAR +STARTCHAR 514C +ENCODING 20812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +FF00 +C280 +4200 +7E00 +1800 +2880 +C700 +ENDCHAR +STARTCHAR 514D +ENCODING 20813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +3C00 +4400 +FF00 +C900 +4900 +7F00 +1800 +3880 +CF00 +ENDCHAR +STARTCHAR 514E +ENCODING 20814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +F800 +7F00 +4900 +4900 +7F00 +2A00 +6880 +8700 +ENDCHAR +STARTCHAR 5152 +ENCODING 20818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +4100 +7F00 +2400 +6480 +8700 +ENDCHAR +STARTCHAR 515C +ENCODING 20828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DF00 +A500 +9D00 +DF00 +8100 +1400 +2400 +6480 +C700 +ENDCHAR +STARTCHAR 5162 +ENCODING 20834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF80 +4200 +FF00 +9900 +FF00 +6600 +6600 +BA80 +EB80 +ENDCHAR +STARTCHAR 5165 +ENCODING 20837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +78 +08 +08 +08 +18 +14 +22 +43 +81 +ENDCHAR +STARTCHAR 5167 +ENCODING 20839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +70 +08 +FF +89 +95 +A5 +C3 +81 +83 +ENDCHAR +STARTCHAR 5168 +ENCODING 20840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +78 +14 +26 +41 +FE +08 +7E +08 +FF +ENDCHAR +STARTCHAR 5169 +ENCODING 20841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +FF +ED +AB +EF +D5 +89 +8B +ENDCHAR +STARTCHAR 516A +ENCODING 20842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +78 +14 +7E +F5 +95 +BA +B5 +95 +B3 +ENDCHAR +STARTCHAR 516B +ENCODING 20843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +0400 +2400 +2400 +2200 +4200 +4200 +8100 +8080 +ENDCHAR +STARTCHAR 516C +ENCODING 20844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3C +24 +42 +D1 +91 +24 +22 +46 +F9 +ENDCHAR +STARTCHAR 516D +ENCODING 20845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +0000 +0000 +2400 +2200 +4200 +C100 +8080 +ENDCHAR +STARTCHAR 516E +ENCODING 20846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +2200 +4300 +FF80 +A000 +3E00 +4200 +0200 +0C00 +ENDCHAR +STARTCHAR 5171 +ENCODING 20849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +2400 +FF00 +2400 +2400 +FF80 +2400 +4300 +8100 +ENDCHAR +STARTCHAR 5175 +ENCODING 20853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7C00 +4000 +7F00 +4400 +FF80 +0000 +2600 +C100 +ENDCHAR +STARTCHAR 5176 +ENCODING 20854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +2200 +3E00 +2200 +3E00 +FF80 +0000 +6600 +8100 +ENDCHAR +STARTCHAR 5177 +ENCODING 20855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +4200 +7E00 +7E00 +4200 +FF80 +6600 +8100 +ENDCHAR +STARTCHAR 5178 +ENCODING 20856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +7E +55 +55 +7E +55 +FF +00 +66 +81 +ENDCHAR +STARTCHAR 517C +ENCODING 20860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +7F00 +9480 +7E00 +FF80 +7E00 +3400 +5700 +9500 +ENDCHAR +STARTCHAR 5180 +ENCODING 20864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1900 +EE80 +9F00 +7E00 +7E00 +7E00 +E700 +FF80 +6600 +8180 +ENDCHAR +STARTCHAR 5186 +ENCODING 20870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +89 +89 +FF +81 +81 +81 +83 +ENDCHAR +STARTCHAR 518A +ENCODING 20874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +5500 +5500 +5500 +FF80 +5500 +5500 +5500 +4300 +ENDCHAR +STARTCHAR 518D +ENCODING 20877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +7E00 +7E00 +4A00 +FF80 +4200 +4200 +4200 +ENDCHAR +STARTCHAR 5192 +ENCODING 20882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +81 +FF +7E +7E +7E +7E +42 +ENDCHAR +STARTCHAR 5195 +ENCODING 20885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4100 +7E00 +3C00 +7F00 +C900 +7F00 +3880 +CF00 +ENDCHAR +STARTCHAR 5197 +ENCODING 20887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8100 +3C00 +2400 +2400 +2400 +4480 +4480 +8700 +ENDCHAR +STARTCHAR 51A0 +ENCODING 20896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8280 +7200 +0F00 +F600 +6600 +6600 +A080 +9F00 +ENDCHAR +STARTCHAR 51A5 +ENCODING 20901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8100 +FF00 +7E00 +7E00 +FF80 +0000 +6600 +8100 +ENDCHAR +STARTCHAR 51AA +ENCODING 20906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +7E00 +7E00 +7E00 +FF80 +7E00 +CB80 +4E00 +ENDCHAR +STARTCHAR 51AC +ENCODING 20908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +3E00 +6400 +F400 +9800 +6600 +9980 +0C00 +7800 +0E00 +ENDCHAR +STARTCHAR 51B6 +ENCODING 20918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +8A00 +5100 +1F00 +0080 +5F00 +6100 +A100 +9F00 +2100 +ENDCHAR +STARTCHAR 51B7 +ENCODING 20919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8C00 +5400 +2300 +5E80 +0000 +7F00 +8900 +8B00 +0800 +ENDCHAR +STARTCHAR 51BD +ENCODING 20925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +81 +BB +53 +1B +2B +5B +9B +93 +91 +A3 +ENDCHAR +STARTCHAR 51C4 +ENCODING 20932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +BF80 +BF00 +0900 +7F80 +7F00 +BF00 +9200 +8E00 +7100 +ENDCHAR +STARTCHAR 51C6 +ENCODING 20934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +9400 +5F00 +3400 +3F00 +5400 +5F00 +9400 +9F80 +9000 +ENDCHAR +STARTCHAR 51C9 +ENCODING 20937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +BF80 +4000 +1F00 +2100 +5F00 +4400 +9600 +A500 +C880 +ENDCHAR +STARTCHAR 51CB +ENCODING 20939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +65 +2F +2F +65 +6F +AF +AB +43 +ENDCHAR +STARTCHAR 51CC +ENCODING 20940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +BF00 +4800 +3F80 +1F00 +7800 +7E00 +B200 +8E00 +B180 +ENDCHAR +STARTCHAR 51CD +ENCODING 20941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +BF80 +4400 +3F00 +3F00 +6500 +7F00 +8C00 +B700 +C480 +ENDCHAR +STARTCHAR 51DC +ENCODING 20956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F80 +8000 +7F00 +2B00 +3F00 +4300 +9C00 +BF80 +9E00 +2580 +ENDCHAR +STARTCHAR 51DD +ENCODING 20957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F00 +B900 +7A00 +2100 +3F80 +5680 +FF80 +9600 +BA00 +CB80 +ENDCHAR +STARTCHAR 51DE +ENCODING 20958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +D500 +7F00 +CC00 +FC80 +FF00 +4900 +A500 +9480 +ENDCHAR +STARTCHAR 51E1 +ENCODING 20961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7C00 +4400 +6400 +5400 +4C00 +4400 +4400 +8480 +8700 +ENDCHAR +STARTCHAR 51F0 +ENCODING 20976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +9200 +BE00 +BE00 +BE00 +FE00 +9180 +FF00 +8100 +ENDCHAR +STARTCHAR 51F1 +ENCODING 20977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D600 +F500 +0500 +F500 +0500 +F900 +F900 +A900 +7980 +D180 +ENDCHAR +STARTCHAR 51F6 +ENCODING 20982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +02 +85 +A5 +99 +99 +95 +A7 +C3 +FF +81 +ENDCHAR +STARTCHAR 51F8 +ENCODING 20984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3C +24 +24 +E7 +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR 51F9 +ENCODING 20985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +E7 +A5 +A5 +A5 +9D +81 +81 +FF +81 +ENDCHAR +STARTCHAR 51FA +ENCODING 20986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +49 +49 +49 +7F +08 +89 +89 +FF +81 +ENDCHAR +STARTCHAR 51FD +ENCODING 20989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +1000 +DB00 +AD00 +8900 +BD00 +FB00 +FF00 +8100 +ENDCHAR +STARTCHAR 5200 +ENCODING 20992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +11 +11 +11 +11 +21 +21 +41 +86 +ENDCHAR +STARTCHAR 5203 +ENCODING 20995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +09 +49 +51 +91 +11 +21 +61 +86 +ENDCHAR +STARTCHAR 5206 +ENCODING 20998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +C300 +FF80 +1200 +1200 +2200 +4200 +8C00 +ENDCHAR +STARTCHAR 5207 +ENCODING 20999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +45 +55 +E5 +45 +59 +69 +11 +17 +ENDCHAR +STARTCHAR 5208 +ENCODING 21000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +15 +95 +65 +25 +25 +35 +4D +81 +83 +ENDCHAR +STARTCHAR 520A +ENCODING 21002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +25 +25 +FD +25 +25 +21 +21 +23 +ENDCHAR +STARTCHAR 520E +ENCODING 21006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +43 +FB +BB +DB +6B +AB +4B +C9 +B3 +ENDCHAR +STARTCHAR 5211 +ENCODING 21009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +55 +55 +55 +FD +55 +55 +51 +91 +93 +ENDCHAR +STARTCHAR 5217 +ENCODING 21015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +45 +7D +4D +F5 +B5 +25 +41 +83 +ENDCHAR +STARTCHAR 521D +ENCODING 21021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +5F +E5 +25 +55 +E5 +D9 +49 +51 +57 +ENDCHAR +STARTCHAR 5224 +ENCODING 21028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +75 +AD +25 +FD +2D +F5 +45 +41 +83 +ENDCHAR +STARTCHAR 5225 +ENCODING 21029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F5 +95 +95 +F5 +45 +75 +55 +51 +91 +B3 +ENDCHAR +STARTCHAR 5229 +ENCODING 21033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +C5 +25 +F5 +65 +55 +B5 +A5 +21 +23 +ENDCHAR +STARTCHAR 522A +ENCODING 21034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +DB +DB +DB +FF +DB +DB +DB +D9 +9B +ENDCHAR +STARTCHAR 522E +ENCODING 21038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +E5 +25 +FD +25 +25 +FD +8D +F9 +8B +ENDCHAR +STARTCHAR 5230 +ENCODING 21040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +55 +5D +ED +25 +FD +25 +39 +E3 +ENDCHAR +STARTCHAR 5236 +ENCODING 21046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A1 +FB +A3 +FB +23 +FB +AB +A9 +B9 +23 +ENDCHAR +STARTCHAR 5237 +ENCODING 21047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +8B +FB +A3 +FB +EB +EB +EB +69 +23 +ENDCHAR +STARTCHAR 5238 +ENCODING 21048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +5200 +FF00 +9500 +FF80 +4200 +FF80 +1200 +2200 +CC00 +ENDCHAR +STARTCHAR 5239 +ENCODING 21049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +75 +55 +AD +25 +FD +65 +B5 +A9 +23 +ENDCHAR +STARTCHAR 523A +ENCODING 21050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FB +23 +FB +AB +AB +FB +B3 +A9 +23 +ENDCHAR +STARTCHAR 523B +ENCODING 21051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FD +25 +D5 +55 +2D +55 +A1 +51 +8B +ENDCHAR +STARTCHAR 5243 +ENCODING 21059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +51 +53 +FB +2B +FB +FB +2B +EB +B9 +23 +ENDCHAR +STARTCHAR 5247 +ENCODING 21063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F1 +95 +95 +F5 +95 +F5 +F5 +01 +51 +8B +ENDCHAR +STARTCHAR 524A +ENCODING 21066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +71 +AD +AD +FD +8D +FD +8D +FD +89 +93 +ENDCHAR +STARTCHAR 524B +ENCODING 21067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +FD00 +2500 +F500 +9500 +F500 +6100 +6300 +A080 +9F00 +ENDCHAR +STARTCHAR 524C +ENCODING 21068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FD +25 +FD +AD +FD +65 +B5 +A9 +23 +ENDCHAR +STARTCHAR 524D +ENCODING 21069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +F500 +9500 +F500 +9500 +F500 +9100 +B300 +ENDCHAR +STARTCHAR 5254 +ENCODING 21076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +8B +FB +8B +FB +7B +BB +6B +E9 +5B +ENDCHAR +STARTCHAR 5256 +ENCODING 21078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FD +55 +55 +FD +05 +F5 +8D +F1 +8B +ENDCHAR +STARTCHAR 525B +ENCODING 21083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +D7 +D7 +97 +FB +F7 +F7 +F7 +D5 +9B +ENDCHAR +STARTCHAR 525D +ENCODING 21085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +75 +55 +F5 +FD +AD +75 +79 +A9 +63 +ENDCHAR +STARTCHAR 5261 +ENCODING 21089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +29 +AD +B5 +55 +8D +AD +B5 +A5 +51 +8B +ENDCHAR +STARTCHAR 5269 +ENCODING 21097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +19 +E3 +FF +77 +EF +EF +33 +EB +A9 +23 +ENDCHAR +STARTCHAR 526A +ENCODING 21098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +F500 +F500 +F500 +B300 +0000 +FF00 +1100 +E700 +ENDCHAR +STARTCHAR 526F +ENCODING 21103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +03 +FB +FB +03 +FB +AB +FB +F9 +8B +ENDCHAR +STARTCHAR 5272 +ENCODING 21106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FD +AD +F5 +FD +FD +05 +F9 +F9 +8B +ENDCHAR +STARTCHAR 5275 +ENCODING 21109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +5B +FB +7B +7B +8B +FB +FB +C9 +FB +ENDCHAR +STARTCHAR 527D +ENCODING 21117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F9 +53 +FB +FB +03 +FB +FB +6B +A9 +E7 +ENDCHAR +STARTCHAR 527F +ENCODING 21119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +69 +D3 +6B +FB +FB +FB +FB +33 +F9 +AB +ENDCHAR +STARTCHAR 5283 +ENCODING 21123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FB +EF +FB +FF +03 +FB +F9 +F9 +FF +ENDCHAR +STARTCHAR 5287 +ENCODING 21127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +3B +FF +FB +BB +FB +F7 +D9 +B5 +73 +ENDCHAR +STARTCHAR 5288 +ENCODING 21128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +9F80 +F500 +FF80 +FF80 +D200 +FF00 +1100 +2100 +C700 +ENDCHAR +STARTCHAR 5289 +ENCODING 21129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +DB +D7 +FB +A3 +53 +FB +23 +69 +F3 +ENDCHAR +STARTCHAR 528D +ENCODING 21133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +5B +F7 +03 +DB +DB +03 +4B +D9 +A7 +ENDCHAR +STARTCHAR 5291 +ENCODING 21137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FF +03 +DF +F7 +FF +8B +FB +FB +89 +8B +ENDCHAR +STARTCHAR 5292 +ENCODING 21138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +67 +93 +FF +F7 +EB +F3 +95 +D5 +AB +ENDCHAR +STARTCHAR 529B +ENCODING 21147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +FF +11 +11 +11 +21 +21 +41 +86 +ENDCHAR +STARTCHAR 529F +ENCODING 21151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +F4 +4F +45 +45 +45 +79 +C9 +11 +17 +ENDCHAR +STARTCHAR 52A0 +ENCODING 21152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +47 +F5 +55 +55 +55 +55 +55 +97 +B5 +ENDCHAR +STARTCHAR 52A3 +ENCODING 21155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +2A +4B +9C +30 +C8 +FF +11 +31 +C6 +ENDCHAR +STARTCHAR 52A4 +ENCODING 21156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +E4 +8F +F5 +A5 +A5 +A5 +A5 +A9 +2B +ENDCHAR +STARTCHAR 52A9 +ENCODING 21161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +E4 +9F +E5 +95 +E5 +95 +B9 +C9 +13 +ENDCHAR +STARTCHAR 52AA +ENCODING 21162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +FF +95 +62 +DD +10 +FF +11 +62 +86 +ENDCHAR +STARTCHAR 52AB +ENCODING 21163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +22 +22 +F2 +2F +FB +45 +55 +BD +C9 +13 +ENDCHAR +STARTCHAR 52BE +ENCODING 21182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +22 +FA +47 +D3 +63 +55 +D5 +A5 +D5 +8B +ENDCHAR +STARTCHAR 52C1 +ENCODING 21185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FC +B4 +DF +D5 +AD +05 +F5 +25 +39 +CB +ENDCHAR +STARTCHAR 52C3 +ENCODING 21187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +F4 +2F +F5 +F5 +25 +FD +25 +29 +4B +ENDCHAR +STARTCHAR 52C5 +ENCODING 21189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +F4 +24 +FF +B5 +F5 +65 +B5 +B9 +2B +ENDCHAR +STARTCHAR 52C7 +ENCODING 21191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +14 +7F +7F +7F +08 +FF +31 +C3 +ENDCHAR +STARTCHAR 52C9 +ENCODING 21193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7400 +AF00 +F500 +AD00 +F500 +2D00 +6B00 +E080 +9F00 +ENDCHAR +STARTCHAR 52CD +ENCODING 21197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +FC +0F +F5 +95 +F5 +B5 +B5 +A9 +6B +ENDCHAR +STARTCHAR 52D2 +ENCODING 21202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A4 +F4 +AF +E5 +F5 +D5 +F5 +F9 +49 +4B +ENDCHAR +STARTCHAR 52D5 +ENCODING 21205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +E4 +F7 +F5 +B5 +F5 +F5 +F5 +35 +CB +ENDCHAR +STARTCHAR 52D6 +ENCODING 21206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F4 +94 +FF +F5 +05 +F5 +F5 +F5 +F5 +9B +ENDCHAR +STARTCHAR 52D8 +ENCODING 21208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +92 +FA +97 +F3 +73 +93 +FD +DD +FD +8B +ENDCHAR +STARTCHAR 52D9 +ENCODING 21209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +2F80 +5500 +F600 +5980 +6400 +CF00 +C500 +4900 +D300 +ENDCHAR +STARTCHAR 52DB +ENCODING 21211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F4 +94 +FF +F5 +95 +F5 +F5 +F5 +59 +9B +ENDCHAR +STARTCHAR 52DD +ENCODING 21213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +B500 +AE80 +CA00 +BF80 +F500 +BF80 +A500 +A900 +5600 +ENDCHAR +STARTCHAR 52DE +ENCODING 21214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BB +DB +77 +8C +FF +FF +12 +62 +C6 +ENDCHAR +STARTCHAR 52DF +ENCODING 21215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +2400 +7E00 +7E00 +7E00 +FF80 +5200 +FF80 +3200 +CC00 +ENDCHAR +STARTCHAR 52E2 +ENCODING 21218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +F500 +B500 +F780 +F900 +1000 +FF00 +3100 +C600 +ENDCHAR +STARTCHAR 52E3 +ENCODING 21219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +22 +F2 +27 +FB +F5 +F5 +95 +F5 +F9 +9B +ENDCHAR +STARTCHAR 52E4 +ENCODING 21220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +94 +F4 +6F +F5 +D5 +F5 +F5 +F5 +59 +EB +ENDCHAR +STARTCHAR 52F3 +ENCODING 21235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1A +E2 +FF +FB +FB +FB +FD +E5 +DD +CB +ENDCHAR +STARTCHAR 52F5 +ENCODING 21237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FA +B2 +FF +FB +FB +FB +FB +EB +FD +DF +ENDCHAR +STARTCHAR 52F8 +ENCODING 21240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +52 +FA +F7 +EB +15 +FD +F5 +F5 +A5 +FB +ENDCHAR +STARTCHAR 52FA +ENCODING 21242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +40 +7F +C1 +81 +79 +01 +01 +01 +06 +ENDCHAR +STARTCHAR 52FB +ENCODING 21243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +40 +7F +C1 +FD +01 +1D +71 +01 +07 +ENDCHAR +STARTCHAR 52FE +ENCODING 21246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +40 +7F +E1 +A1 +29 +59 +E5 +01 +06 +ENDCHAR +STARTCHAR 52FF +ENCODING 21247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +20 +7F +55 +95 +A5 +49 +89 +11 +27 +ENDCHAR +STARTCHAR 5305 +ENCODING 21253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7F00 +4100 +F900 +C900 +4900 +7D00 +4200 +4080 +7F00 +ENDCHAR +STARTCHAR 5308 +ENCODING 21256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7F +41 +A9 +93 +BB +6B +7D +41 +07 +ENDCHAR +STARTCHAR 530D +ENCODING 21261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7F +55 +FF +FD +55 +7D +7D +55 +03 +ENDCHAR +STARTCHAR 530F +ENCODING 21263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +FF00 +A880 +9E80 +EA80 +FF00 +8B00 +E800 +A880 +6F00 +ENDCHAR +STARTCHAR 5310 +ENCODING 21264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7F +41 +FD +C5 +39 +7D +7D +7D +03 +ENDCHAR +STARTCHAR 5315 +ENCODING 21269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +80 +84 +88 +B0 +C0 +80 +82 +82 +FE +ENDCHAR +STARTCHAR 5316 +ENCODING 21270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +2800 +4900 +4B00 +CC00 +C800 +4800 +4800 +4880 +4F00 +ENDCHAR +STARTCHAR 5317 +ENCODING 21271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +2500 +E700 +2400 +2400 +6400 +A400 +2480 +2700 +ENDCHAR +STARTCHAR 5319 +ENCODING 21273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F400 +F400 +F500 +0600 +FC00 +A480 +BF00 +E000 +BF80 +ENDCHAR +STARTCHAR 5320 +ENCODING 21280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8200 +BC00 +A000 +BF00 +A400 +A400 +FF80 +8000 +ENDCHAR +STARTCHAR 5321 +ENCODING 21281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8000 +BF00 +8800 +BE00 +8800 +FF00 +FF80 +8000 +ENDCHAR +STARTCHAR 5323 +ENCODING 21283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +8000 +BF00 +BF00 +A900 +BF00 +8800 +FF80 +8000 +ENDCHAR +STARTCHAR 532A +ENCODING 21290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +9400 +F700 +B700 +9400 +F700 +9400 +FF80 +8000 +ENDCHAR +STARTCHAR 532F +ENCODING 21295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +AA00 +9F00 +DF00 +9400 +AF00 +AF00 +D000 +FF80 +ENDCHAR +STARTCHAR 5339 +ENCODING 21305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +9400 +9400 +9400 +A500 +A700 +C000 +FF80 +8000 +ENDCHAR +STARTCHAR 533F +ENCODING 21311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +9C00 +FF00 +B000 +DE00 +9E00 +A000 +FF80 +ENDCHAR +STARTCHAR 5340 +ENCODING 21312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +9E00 +A200 +9E00 +B700 +D500 +B700 +8000 +FF80 +ENDCHAR +STARTCHAR 5341 +ENCODING 21313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +08 +08 +FF +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 5343 +ENCODING 21315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0E00 +F000 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 5344 +ENCODING 21316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +2400 +2400 +FF80 +2400 +2400 +2400 +2400 +2400 +ENDCHAR +STARTCHAR 5347 +ENCODING 21319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +14 +E4 +24 +24 +FF +24 +24 +44 +84 +ENDCHAR +STARTCHAR 5348 +ENCODING 21320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +4800 +8800 +0800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 5349 +ENCODING 21321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +2A00 +2200 +FF80 +2200 +4200 +4200 +8200 +ENDCHAR +STARTCHAR 534A +ENCODING 21322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +2A +4B +89 +7E +08 +FF +08 +08 +08 +ENDCHAR +STARTCHAR 534D +ENCODING 21325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F1 +09 +09 +09 +FF +88 +88 +88 +8F +ENDCHAR +STARTCHAR 5351 +ENCODING 21329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7F00 +4900 +7F00 +4900 +7F00 +2800 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 5352 +ENCODING 21330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2400 +2400 +6700 +D900 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 5353 +ENCODING 21331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0F00 +7E00 +4100 +7E00 +4100 +7E00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 5354 +ENCODING 21332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +5F +49 +E9 +53 +52 +7F +5B +6B +7D +ENDCHAR +STARTCHAR 5357 +ENCODING 21335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0800 +FF00 +9500 +BF00 +8900 +BF00 +8900 +8B00 +ENDCHAR +STARTCHAR 535A +ENCODING 21338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +7F80 +5F00 +D500 +5F00 +5F00 +4200 +7F80 +4A00 +4600 +ENDCHAR +STARTCHAR 535C +ENCODING 21340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 10 4 -1 +BITMAP +80 +80 +80 +C0 +A0 +90 +90 +80 +80 +80 +ENDCHAR +STARTCHAR 535E +ENCODING 21342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +00 +08 +0C +0E +09 +08 +08 +08 +ENDCHAR +STARTCHAR 5360 +ENCODING 21344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +20 +20 +1E +20 +20 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR 5366 +ENCODING 21350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +2200 +FA00 +FA00 +0300 +2280 +FA00 +2200 +3A00 +E200 +ENDCHAR +STARTCHAR 5368 +ENCODING 21352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +0F +7E +42 +4E +FF +81 +BD +BD +83 +ENDCHAR +STARTCHAR 536F +ENCODING 21359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +67 +95 +95 +95 +95 +E7 +24 +C4 +ENDCHAR +STARTCHAR 5370 +ENCODING 21360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +30 +EF +89 +89 +F9 +89 +F9 +8B +08 +ENDCHAR +STARTCHAR 5371 +ENCODING 21361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7C00 +C400 +FF00 +5E00 +6200 +6200 +6600 +A080 +9F00 +ENDCHAR +STARTCHAR 5374 +ENCODING 21364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +27 +25 +FD +25 +FD +45 +55 +57 +FC +0C +ENDCHAR +STARTCHAR 5375 +ENCODING 21365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +17 +F5 +D5 +D5 +B7 +B5 +E7 +64 +C4 +ENDCHAR +STARTCHAR 5377 +ENCODING 21367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +5200 +FF00 +9500 +FF80 +6200 +BD80 +2C00 +2100 +3E00 +ENDCHAR +STARTCHAR 537D +ENCODING 21373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +F7 +95 +F5 +F5 +05 +95 +E7 +94 +F4 +ENDCHAR +STARTCHAR 537F +ENCODING 21375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +68 +DB +B7 +BB +B7 +BB +DF +D3 +5E +92 +ENDCHAR +STARTCHAR 5384 +ENCODING 21380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +80 +BE +A2 +A2 +A6 +A0 +A1 +BF +ENDCHAR +STARTCHAR 5393 +ENCODING 21395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +8800 +BF00 +BF00 +8000 +8800 +BF00 +8800 +FF80 +ENDCHAR +STARTCHAR 5398 +ENCODING 21400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +8000 +BF00 +BF00 +A900 +BF00 +BF00 +8800 +7F00 +ENDCHAR +STARTCHAR 539A +ENCODING 21402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BE +BE +BE +80 +BE +FF +88 +98 +ENDCHAR +STARTCHAR 539F +ENCODING 21407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +8800 +BF00 +BF00 +A100 +BF00 +9600 +A500 +C880 +ENDCHAR +STARTCHAR 53A0 +ENCODING 21408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +B880 +AA80 +BA80 +AA80 +BA80 +BA80 +A880 +C700 +ENDCHAR +STARTCHAR 53A5 +ENCODING 21413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +AA00 +9380 +FE80 +DF00 +FA00 +A500 +A500 +4880 +ENDCHAR +STARTCHAR 53A6 +ENCODING 21414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +BF00 +BF00 +BF00 +BF00 +FE00 +9400 +FB80 +ENDCHAR +STARTCHAR 53AD +ENCODING 21421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +BB00 +BA80 +BF80 +FA00 +CA00 +FB00 +FD00 +5C80 +ENDCHAR +STARTCHAR 53BB +ENCODING 21435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +7F00 +0800 +0800 +FF80 +1400 +2200 +4700 +F880 +ENDCHAR +STARTCHAR 53C3 +ENCODING 21443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +7E00 +4200 +9D00 +F700 +6A00 +B580 +5B00 +6C00 +7000 +ENDCHAR +STARTCHAR 53C8 +ENCODING 21448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +2200 +2400 +1800 +1800 +1400 +6300 +8180 +ENDCHAR +STARTCHAR 53C9 +ENCODING 21449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +5200 +2A00 +2400 +1800 +1800 +3400 +6300 +8180 +ENDCHAR +STARTCHAR 53CA +ENCODING 21450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FC00 +2400 +2400 +2700 +3A00 +4A00 +4C00 +9A00 +E180 +ENDCHAR +STARTCHAR 53CB +ENCODING 21451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2000 +FF80 +2000 +3E00 +5200 +4C00 +8C00 +9200 +6100 +ENDCHAR +STARTCHAR 53CD +ENCODING 21453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4000 +7F00 +5200 +5200 +8C00 +8C00 +9300 +A180 +ENDCHAR +STARTCHAR 53D4 +ENCODING 21460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +2F00 +3500 +2500 +FD00 +B500 +AA00 +AA00 +A500 +6880 +ENDCHAR +STARTCHAR 53D6 +ENCODING 21462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F800 +9F00 +F500 +9500 +F500 +9300 +F200 +1500 +1880 +ENDCHAR +STARTCHAR 53D7 +ENCODING 21463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +52 +4A +FF +81 +FF +24 +1C +E3 +ENDCHAR +STARTCHAR 53DB +ENCODING 21467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +E800 +D000 +EF00 +5500 +5500 +F200 +5200 +9500 +A880 +ENDCHAR +STARTCHAR 53E1 +ENCODING 21473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3000 +2700 +FD00 +7500 +ED00 +7300 +FA00 +F300 +9500 +F480 +ENDCHAR +STARTCHAR 53E2 +ENCODING 21474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +FF00 +2400 +FF00 +7E00 +FF80 +7F00 +7500 +F200 +1D80 +ENDCHAR +STARTCHAR 53E3 +ENCODING 21475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +FE +82 +82 +82 +82 +82 +FE +82 +ENDCHAR +STARTCHAR 53E4 +ENCODING 21476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +0800 +0800 +7E00 +4200 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 53E5 +ENCODING 21477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +20 +7F +41 +81 +F9 +45 +79 +45 +07 +ENDCHAR +STARTCHAR 53E9 +ENCODING 21481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +99 +99 +99 +99 +99 +FB +88 +08 +ENDCHAR +STARTCHAR 53EA +ENCODING 21482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +42 +42 +7E +00 +24 +43 +81 +ENDCHAR +STARTCHAR 53EB +ENCODING 21483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0100 +E900 +A900 +A900 +A900 +A900 +EF80 +9D00 +0100 +0100 +ENDCHAR +STARTCHAR 53EC +ENCODING 21484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +11 +21 +66 +80 +7E +41 +7E +41 +ENDCHAR +STARTCHAR 53ED +ENCODING 21485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DE00 +B200 +B200 +B200 +B200 +D200 +A100 +6100 +4080 +ENDCHAR +STARTCHAR 53EF +ENCODING 21487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +02 +7A +4A +4A +7A +4A +02 +06 +ENDCHAR +STARTCHAR 53F0 +ENCODING 21488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2200 +2700 +F880 +0000 +0000 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 53F1 +ENCODING 21489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +E800 +A900 +AA00 +AC00 +A800 +F800 +A880 +8880 +0F00 +ENDCHAR +STARTCHAR 53F2 +ENCODING 21490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +7F00 +4900 +4900 +7F00 +6800 +1000 +2C00 +C380 +ENDCHAR +STARTCHAR 53F3 +ENCODING 21491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1000 +FF80 +2000 +2000 +7F00 +A100 +A100 +3F00 +2100 +ENDCHAR +STARTCHAR 53F8 +ENCODING 21496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +01 +FD +01 +79 +45 +79 +41 +03 +ENDCHAR +STARTCHAR 5403 +ENCODING 21507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +C800 +BF80 +B000 +BE00 +A400 +A800 +D080 +9080 +1F00 +ENDCHAR +STARTCHAR 5404 +ENCODING 21508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3E00 +C200 +B400 +1C00 +6380 +FE00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 5408 +ENCODING 21512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +3400 +6300 +FF80 +0000 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 5409 +ENCODING 21513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +0800 +FF00 +0000 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 540A +ENCODING 21514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FC +84 +FC +10 +FE +92 +92 +96 +10 +ENDCHAR +STARTCHAR 540C +ENCODING 21516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +81 +BF +BD +A5 +BD +A5 +81 +83 +ENDCHAR +STARTCHAR 540D +ENCODING 21517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +3E +62 +A4 +18 +70 +BF +21 +3F +21 +ENDCHAR +STARTCHAR 540E +ENCODING 21518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +7C00 +4000 +7F80 +4000 +BF00 +A100 +BF00 +A100 +ENDCHAR +STARTCHAR 540F +ENCODING 21519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0800 +7F00 +4900 +7F00 +2800 +1000 +2C00 +C380 +ENDCHAR +STARTCHAR 5410 +ENCODING 21520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +A400 +BF00 +A400 +A400 +E400 +A400 +8400 +3F80 +ENDCHAR +STARTCHAR 5411 +ENCODING 21521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +FF +81 +BD +A5 +BD +A5 +81 +83 +ENDCHAR +STARTCHAR 541B +ENCODING 21531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +1200 +FF80 +7E00 +2000 +7F00 +C100 +BF00 +2100 +ENDCHAR +STARTCHAR 541D +ENCODING 21533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2400 +1800 +3600 +C180 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 541F +ENCODING 21535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0400 +CA00 +A900 +BE80 +A000 +BF00 +C100 +A200 +0200 +ENDCHAR +STARTCHAR 5420 +ENCODING 21536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +E500 +A500 +BF80 +A400 +AC00 +EA00 +B200 +3100 +2080 +ENDCHAR +STARTCHAR 5426 +ENCODING 21542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +18 +6E +89 +08 +7E +41 +7E +41 +ENDCHAR +STARTCHAR 5429 +ENCODING 21545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +EA00 +A900 +B080 +BF00 +A900 +E900 +9900 +3600 +ENDCHAR +STARTCHAR 542B +ENCODING 21547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +2400 +7F00 +8080 +7E00 +0200 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 5433 +ENCODING 21555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +6200 +7E00 +4000 +7E00 +FF80 +1800 +6600 +C180 +ENDCHAR +STARTCHAR 5438 +ENCODING 21560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DE00 +D200 +D200 +DF00 +D500 +D600 +A600 +2B00 +5080 +ENDCHAR +STARTCHAR 5439 +ENCODING 21561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +E800 +AF00 +B500 +B500 +A400 +EC00 +AA00 +1100 +2080 +ENDCHAR +STARTCHAR 543B +ENCODING 21563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +E8 +AF +B7 +B7 +AB +AD +F5 +A9 +13 +ENDCHAR +STARTCHAR 543C +ENCODING 21564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3E00 +CA00 +CA00 +D200 +CE00 +B200 +D280 +D280 +3300 +ENDCHAR +STARTCHAR 543E +ENCODING 21566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1000 +7E00 +FF80 +0000 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 5442 +ENCODING 21570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FC +84 +84 +FC +20 +FE +02 +FE +02 +ENDCHAR +STARTCHAR 5448 +ENCODING 21576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +41 +7E +00 +FF +08 +FF +08 +FF +ENDCHAR +STARTCHAR 544A +ENCODING 21578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +4800 +7F00 +4800 +FF80 +0800 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 5451 +ENCODING 21585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0E00 +7000 +FF00 +2400 +4200 +FF80 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 5468 +ENCODING 21608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +89 +BD +BF +81 +BD +BD +A5 +83 +ENDCHAR +STARTCHAR 546A +ENCODING 21610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F00 +D100 +B100 +BF00 +AA00 +CA00 +AA00 +1280 +2300 +ENDCHAR +STARTCHAR 5471 +ENCODING 21617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +DE00 +B600 +B600 +B500 +B500 +D500 +9700 +3900 +2080 +ENDCHAR +STARTCHAR 5473 +ENCODING 21619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +C400 +BF00 +A400 +BF80 +A400 +CE00 +B500 +2480 +0400 +ENDCHAR +STARTCHAR 5475 +ENCODING 21621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +A100 +BD00 +B500 +B500 +DD00 +B500 +0100 +0300 +ENDCHAR +STARTCHAR 547B +ENCODING 21627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +C4 +BF +B5 +BF +B5 +BF +D5 +84 +04 +ENDCHAR +STARTCHAR 547C +ENCODING 21628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +DC00 +B500 +AD00 +A400 +DF80 +A400 +0400 +0C00 +ENDCHAR +STARTCHAR 547D +ENCODING 21629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +3400 +6300 +BD80 +FF00 +9900 +9900 +FB00 +9800 +0800 +ENDCHAR +STARTCHAR 5480 +ENCODING 21632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +B100 +B100 +AF00 +B100 +EF00 +B100 +1100 +3F80 +ENDCHAR +STARTCHAR 5486 +ENCODING 21638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DF00 +B100 +BD00 +B300 +BD00 +D100 +9300 +1080 +1F00 +ENDCHAR +STARTCHAR 548C +ENCODING 21644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +30 +CF +F9 +69 +59 +B9 +A9 +2F +29 +ENDCHAR +STARTCHAR 548E +ENCODING 21646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +7200 +D600 +A500 +7800 +DF80 +FE00 +4200 +4200 +7E00 +ENDCHAR +STARTCHAR 5490 +ENCODING 21648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0900 +C900 +A900 +B780 +B500 +AD00 +B300 +D100 +B100 +1300 +ENDCHAR +STARTCHAR 54A4 +ENCODING 21668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +E080 +C200 +DC00 +C580 +FE00 +C400 +8480 +0700 +ENDCHAR +STARTCHAR 54A8 +ENCODING 21672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +DF00 +2900 +6800 +9400 +2300 +7E80 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 54AB +ENCODING 21675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7700 +9500 +9500 +7700 +A500 +A500 +9880 +8800 +8780 +ENDCHAR +STARTCHAR 54AC +ENCODING 21676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +CA00 +D100 +B300 +CA00 +C400 +CC00 +1B00 +2180 +ENDCHAR +STARTCHAR 54B3 +ENCODING 21683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +C400 +DA00 +CA00 +C500 +DA00 +1600 +1900 +3080 +ENDCHAR +STARTCHAR 54B8 +ENCODING 21688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +0500 +FF80 +BC00 +8500 +B500 +AE00 +B400 +AE80 +8900 +ENDCHAR +STARTCHAR 54BD +ENCODING 21693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +1F +D5 +D5 +DF +D5 +D7 +D9 +1F +11 +ENDCHAR +STARTCHAR 54C0 +ENCODING 21696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +4200 +4200 +7E00 +2900 +E600 +3B00 +6080 +ENDCHAR +STARTCHAR 54C1 +ENCODING 21697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +42 +00 +F7 +99 +F7 +99 +ENDCHAR +STARTCHAR 54C4 +ENCODING 21700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +CA00 +BF00 +AA00 +AA00 +AA00 +DF80 +AA00 +1100 +2080 +ENDCHAR +STARTCHAR 54C8 +ENCODING 21704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +CA00 +D100 +AE80 +C000 +C000 +DF00 +9100 +1F00 +1100 +ENDCHAR +STARTCHAR 54C9 +ENCODING 21705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F600 +2500 +FF80 +0400 +F500 +9500 +9600 +FE80 +0900 +ENDCHAR +STARTCHAR 54E1 +ENCODING 21729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +00 +7F +7F +7F +7F +26 +C1 +ENDCHAR +STARTCHAR 54E5 +ENCODING 21733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +7A +4A +7E +FF +02 +7A +7A +06 +ENDCHAR +STARTCHAR 54E8 +ENCODING 21736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +CD00 +B480 +BF00 +B100 +BF00 +D100 +BF00 +1100 +1300 +ENDCHAR +STARTCHAR 54ED +ENCODING 21741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +9900 +F700 +0A00 +FF00 +1800 +2400 +4200 +8180 +ENDCHAR +STARTCHAR 54EE +ENCODING 21742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +C500 +BF80 +C400 +DE00 +D780 +3C00 +0400 +0C00 +ENDCHAR +STARTCHAR 54F2 +ENCODING 21746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +FE00 +4F80 +FA00 +4A00 +D200 +7F00 +4100 +4100 +7F00 +ENDCHAR +STARTCHAR 54FA +ENCODING 21754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +C500 +DF80 +DF00 +D500 +DF00 +D500 +DF00 +1500 +1500 +ENDCHAR +STARTCHAR 5504 +ENCODING 21764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F00 +F100 +BF00 +B100 +BF00 +F100 +9F00 +0B00 +1080 +ENDCHAR +STARTCHAR 5506 +ENCODING 21766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +C900 +BF00 +AA80 +BB00 +A800 +DF00 +A600 +0E00 +3180 +ENDCHAR +STARTCHAR 5507 +ENCODING 21767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BE +FF +A9 +FE +81 +7F +41 +7F +ENDCHAR +STARTCHAR 550E +ENCODING 21774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +0D +DB +CB +DF +CB +D7 +DF +8B +09 +09 +ENDCHAR +STARTCHAR 5510 +ENCODING 21776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BF00 +8900 +FF80 +BF00 +BF00 +A100 +A100 +BF00 +ENDCHAR +STARTCHAR 551C +ENCODING 21788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +2E00 +C980 +0800 +FB00 +9C00 +F880 +9700 +ENDCHAR +STARTCHAR 552F +ENCODING 21807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +EA00 +BF80 +B200 +AF00 +B200 +EF00 +B200 +0F80 +1000 +ENDCHAR +STARTCHAR 5531 +ENCODING 21809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +0F +D1 +AF +AF +A0 +DF +9F +11 +1F +ENDCHAR +STARTCHAR 5535 +ENCODING 21813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +CA00 +D500 +BF80 +B500 +BF00 +DF00 +9480 +0700 +ENDCHAR +STARTCHAR 553E +ENCODING 21822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +DC00 +DF00 +D500 +BF80 +D500 +DF00 +8400 +3F80 +ENDCHAR +STARTCHAR 5544 +ENCODING 21828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +CA00 +DA80 +A700 +DE00 +ED00 +9500 +2480 +0C00 +ENDCHAR +STARTCHAR 5546 +ENCODING 21830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +FF +A9 +AF +FD +A5 +BD +83 +ENDCHAR +STARTCHAR 554F +ENCODING 21839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +BD +A5 +BD +A5 +83 +ENDCHAR +STARTCHAR 5553 +ENCODING 21843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +E780 +F900 +9500 +F700 +8880 +FE00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 5556 +ENCODING 21846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +ED00 +B700 +AB00 +B180 +AD00 +B500 +F600 +0900 +1080 +ENDCHAR +STARTCHAR 555E +ENCODING 21854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F00 +CA00 +CA00 +DB00 +D100 +DB00 +CA00 +8A00 +3F80 +ENDCHAR +STARTCHAR 5563 +ENCODING 21859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +DF +EB +CB +FF +EF +EB +AB +2E +32 +ENDCHAR +STARTCHAR 557C +ENCODING 21884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +CA00 +DF80 +D480 +DF00 +D500 +D500 +1700 +0400 +ENDCHAR +STARTCHAR 5580 +ENCODING 21888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +E880 +EF80 +DA00 +CE00 +D180 +DF00 +9F00 +1100 +ENDCHAR +STARTCHAR 5584 +ENCODING 21892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +FF00 +2A00 +FF80 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR 5586 +ENCODING 21894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +FF80 +4200 +FF00 +0000 +F700 +9900 +F700 +9900 +ENDCHAR +STARTCHAR 5587 +ENCODING 21895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +09 +FF +CB +FF +EF +FF +DB +AD +2D +0B +ENDCHAR +STARTCHAR 5589 +ENCODING 21897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1F00 +D100 +DF00 +E800 +EF00 +EC00 +EF00 +E600 +A900 +2880 +ENDCHAR +STARTCHAR 558A +ENCODING 21898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +C200 +FF80 +EE00 +E280 +EF00 +F700 +AE00 +2580 +4980 +ENDCHAR +STARTCHAR 5598 +ENCODING 21912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1500 +D500 +DF00 +C000 +BF80 +DF00 +DB00 +DB00 +1B00 +1B00 +ENDCHAR +STARTCHAR 5599 +ENCODING 21913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DE00 +DE00 +BF80 +DA80 +AB00 +CE00 +FD00 +2480 +0C00 +ENDCHAR +STARTCHAR 559A +ENCODING 21914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DE00 +FF00 +DC80 +DD00 +D300 +C400 +BF80 +0A00 +3180 +ENDCHAR +STARTCHAR 559C +ENCODING 21916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +7E00 +4200 +7E00 +FF80 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 559D +ENCODING 21917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +DF00 +D100 +CE00 +DF80 +B480 +DA80 +1E80 +1300 +ENDCHAR +STARTCHAR 55A7 +ENCODING 21927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +E080 +DF00 +DF00 +D100 +DF00 +DF00 +8000 +3F80 +ENDCHAR +STARTCHAR 55A9 +ENCODING 21929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +CB00 +BF80 +DF00 +D700 +DD00 +DF00 +1700 +1D80 +ENDCHAR +STARTCHAR 55AA +ENCODING 21930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +EF00 +AD00 +EF00 +FF80 +4900 +4600 +5A00 +E180 +ENDCHAR +STARTCHAR 55AB +ENCODING 21931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1300 +FA80 +FA80 +DA80 +F500 +C400 +FF80 +CC00 +1200 +2180 +ENDCHAR +STARTCHAR 55AC +ENCODING 21932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +1000 +FF00 +FF80 +3C00 +FF00 +BD00 +BD00 +8300 +ENDCHAR +STARTCHAR 55AE +ENCODING 21934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +F700 +0000 +7E00 +7E00 +7E00 +0800 +FF80 +0800 +ENDCHAR +STARTCHAR 55C5 +ENCODING 21957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +DF00 +D100 +DF00 +DF00 +C600 +FF00 +0A00 +3180 +ENDCHAR +STARTCHAR 55C7 +ENCODING 21959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +6E00 +ED00 +FF80 +7F00 +4100 +7D00 +4100 +7F00 +ENDCHAR +STARTCHAR 55D4 +ENCODING 21972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1700 +D880 +DF00 +DF00 +DF00 +DF00 +DF00 +9F80 +0A00 +3180 +ENDCHAR +STARTCHAR 55DA +ENCODING 21978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +B100 +BF00 +B000 +BF80 +BF80 +FE80 +1D00 +2B00 +ENDCHAR +STARTCHAR 55DC +ENCODING 21980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DF00 +CA00 +BF80 +DC80 +CF00 +DF00 +DF00 +9F00 +1100 +ENDCHAR +STARTCHAR 55DF +ENCODING 21983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +DF80 +C400 +DF00 +C400 +DF80 +CF00 +9400 +2400 +3F80 +ENDCHAR +STARTCHAR 55E3 +ENCODING 21987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +F1 +0F +F7 +F7 +F7 +F7 +F1 +F3 +ENDCHAR +STARTCHAR 55E4 +ENCODING 21988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +D500 +DF00 +C000 +BF80 +DF00 +D500 +DF00 +0780 +3C80 +ENDCHAR +STARTCHAR 55FD +ENCODING 22013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +FE00 +D380 +FC80 +F700 +FA00 +DA00 +B700 +3300 +1480 +ENDCHAR +STARTCHAR 55FE +ENCODING 22014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +D780 +FC00 +D300 +DE00 +EA00 +EF80 +AB00 +2B00 +5480 +ENDCHAR +STARTCHAR 5606 +ENCODING 22022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +FF00 +CE00 +DF00 +D500 +DF00 +DF00 +BF80 +0A00 +3180 +ENDCHAR +STARTCHAR 5609 +ENCODING 22025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0000 +7E00 +4100 +FF80 +4000 +F700 +5900 +B700 +ENDCHAR +STARTCHAR 5614 +ENCODING 22036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F80 +DF00 +D900 +DF00 +DF00 +DE80 +DF00 +9000 +1F80 +ENDCHAR +STARTCHAR 5617 +ENCODING 22039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4A +FF +FF +7E +47 +7F +00 +7E +41 +7E +ENDCHAR +STARTCHAR 562F +ENCODING 22063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +BF80 +DF00 +DF00 +DF00 +DF00 +9F00 +2F00 +2F00 +ENDCHAR +STARTCHAR 5632 +ENCODING 22066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +13 +FF +D3 +FB +FB +EB +FB +BD +15 +15 +ENDCHAR +STARTCHAR 5634 +ENCODING 22068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0B00 +DF00 +DC80 +FB80 +DE00 +FF00 +DF00 +D480 +1F00 +2300 +ENDCHAR +STARTCHAR 5636 +ENCODING 22070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1B00 +FE00 +DA00 +DB80 +DB00 +DB00 +FD00 +DB00 +A500 +2500 +ENDCHAR +STARTCHAR 5653 +ENCODING 22099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +C700 +DF80 +EE80 +E480 +E700 +F700 +2F00 +2600 +5F80 +ENDCHAR +STARTCHAR 5668 +ENCODING 22120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +F700 +9900 +1200 +FF80 +6600 +FF80 +7F00 +9900 +ENDCHAR +STARTCHAR 566B +ENCODING 22123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +FF00 +C000 +DF00 +DF00 +DF00 +ED00 +EF00 +2E80 +ENDCHAR +STARTCHAR 5674 +ENCODING 22132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +BF80 +A900 +BF00 +BF00 +DF00 +BF00 +0A00 +3180 +ENDCHAR +STARTCHAR 5686 +ENCODING 22150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +DF80 +DF80 +C000 +CF00 +C000 +DF00 +DE80 +1E80 +1100 +ENDCHAR +STARTCHAR 56A5 +ENCODING 22181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +DF00 +CE00 +D180 +FD00 +DA80 +FD80 +D000 +1B00 +2A80 +ENDCHAR +STARTCHAR 56AC +ENCODING 22188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0F80 +EA00 +EF00 +ED00 +FF00 +F500 +FF00 +9F00 +1300 +2480 +ENDCHAR +STARTCHAR 56AE +ENCODING 22190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +D700 +5F00 +EA80 +5F00 +9E00 +FF00 +BD00 +BD00 +8300 +ENDCHAR +STARTCHAR 56B4 +ENCODING 22196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7700 +7700 +FF80 +FA00 +FF80 +F500 +F200 +CB00 +F480 +ENDCHAR +STARTCHAR 56BC +ENCODING 22204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +DC80 +BF00 +DF00 +C100 +DF80 +D700 +DF00 +9D00 +1300 +ENDCHAR +STARTCHAR 56CA +ENCODING 22218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +7E00 +FF00 +DA80 +2400 +7F00 +FF80 +2E00 +F180 +ENDCHAR +STARTCHAR 56CD +ENCODING 22221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF80 +F700 +F700 +9500 +F700 +FF80 +F700 +F700 +9900 +ENDCHAR +STARTCHAR 56D1 +ENCODING 22225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3F +FF +E4 +FF +FF +EF +B7 +3F +43 +ENDCHAR +STARTCHAR 56DA +ENCODING 22234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +89 +99 +99 +A5 +A3 +FF +81 +ENDCHAR +STARTCHAR 56DB +ENCODING 22235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A9 +A9 +A9 +A9 +C7 +81 +FF +81 +ENDCHAR +STARTCHAR 56DE +ENCODING 22238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +81 +BD +A5 +A5 +BD +81 +FF +81 +ENDCHAR +STARTCHAR 56E0 +ENCODING 22240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +89 +FF +99 +95 +A3 +FF +81 +ENDCHAR +STARTCHAR 56F0 +ENCODING 22256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +FF +99 +AD +CB +89 +FF +81 +ENDCHAR +STARTCHAR 56F9 +ENCODING 22265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +99 +A5 +FF +BF +93 +97 +FF +81 +ENDCHAR +STARTCHAR 56FA +ENCODING 22266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +FF +89 +BD +A5 +BD +FF +81 +ENDCHAR +STARTCHAR 5703 +ENCODING 22275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +8F +FF +BF +BF +BF +CF +FF +81 +ENDCHAR +STARTCHAR 5704 +ENCODING 22276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BF +91 +BD +FF +BD +BD +FF +81 +ENDCHAR +STARTCHAR 5708 +ENCODING 22280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +AD +FF +FF +A5 +DF +A3 +FF +81 +ENDCHAR +STARTCHAR 570B +ENCODING 22283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +8B +FF +BB +B5 +85 +FB +FF +81 +ENDCHAR +STARTCHAR 570D +ENCODING 22285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BD +FF +BF +BF +BF +BF +FF +81 +ENDCHAR +STARTCHAR 5712 +ENCODING 22290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BF +FF +81 +BF +B7 +CB +FF +81 +ENDCHAR +STARTCHAR 5713 +ENCODING 22291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A3 +9D +FF +FF +FF +BF +FF +81 +ENDCHAR +STARTCHAR 5716 +ENCODING 22294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BD +BD +FF +BF +D7 +BF +C3 +FF +ENDCHAR +STARTCHAR 5718 +ENCODING 22296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +CB +FF +FF +85 +FF +9D +FF +ENDCHAR +STARTCHAR 571F +ENCODING 22303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +0800 +0800 +FF00 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 5728 +ENCODING 22312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2000 +FF00 +2400 +4400 +DF00 +C400 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 572D +ENCODING 22317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +7F00 +0800 +FF00 +0800 +0800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 5730 +ENCODING 22320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5400 +5500 +F700 +7D00 +5500 +7500 +5700 +9080 +0F00 +ENDCHAR +STARTCHAR 573B +ENCODING 22331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4E00 +5000 +F000 +4F80 +5200 +7200 +D200 +1200 +2200 +ENDCHAR +STARTCHAR 5740 +ENCODING 22336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +5200 +F200 +5380 +5200 +5200 +7200 +D200 +3F80 +ENDCHAR +STARTCHAR 5742 +ENCODING 22338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +5000 +FF00 +5500 +5500 +7200 +9200 +1D00 +2880 +ENDCHAR +STARTCHAR 5747 +ENCODING 22343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +48 +5F +F1 +6D +41 +7F +41 +81 +07 +ENDCHAR +STARTCHAR 574A +ENCODING 22346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +5F80 +E800 +4F00 +4900 +6900 +5100 +9100 +2700 +ENDCHAR +STARTCHAR 574D +ENCODING 22349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +5500 +F300 +5100 +5F80 +7100 +5100 +9100 +2300 +ENDCHAR +STARTCHAR 574E +ENCODING 22350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +4F00 +F500 +5500 +4400 +6C00 +CA00 +1100 +2080 +ENDCHAR +STARTCHAR 5750 +ENCODING 22352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +4A00 +4A00 +6D00 +AD00 +0800 +7F00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 5751 +ENCODING 22353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +4000 +E000 +4E00 +4A00 +6A00 +5280 +B280 +2380 +ENDCHAR +STARTCHAR 5761 +ENCODING 22369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +5480 +F400 +5F00 +5900 +7600 +A600 +2F00 +3980 +ENDCHAR +STARTCHAR 5764 +ENCODING 22372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +5F +F5 +5F +55 +55 +7F +84 +04 +ENDCHAR +STARTCHAR 5766 +ENCODING 22374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +4900 +E900 +4F00 +4900 +6F00 +6900 +8800 +3F80 +ENDCHAR +STARTCHAR 576A +ENCODING 22378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +4D00 +F500 +5480 +4400 +7F80 +4400 +8400 +0400 +ENDCHAR +STARTCHAR 576E +ENCODING 22382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +4900 +EB00 +5C80 +5F00 +7100 +9100 +1F00 +1100 +ENDCHAR +STARTCHAR 5770 +ENCODING 22384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +51 +F7 +5B +5B +77 +99 +11 +13 +ENDCHAR +STARTCHAR 5775 +ENCODING 22389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4300 +5E00 +5000 +F000 +5F80 +5200 +7200 +D200 +3F80 +ENDCHAR +STARTCHAR 577C +ENCODING 22396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +5000 +FF80 +5200 +5E00 +7700 +D280 +1200 +2200 +ENDCHAR +STARTCHAR 5782 +ENCODING 22402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +06 +7C +FF +2A +FF +2A +FF +08 +FF +ENDCHAR +STARTCHAR 5788 +ENCODING 22408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4F00 +7800 +C400 +C400 +4280 +4B00 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 578B +ENCODING 22411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5500 +5500 +FD00 +5500 +9300 +8800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 5793 +ENCODING 22419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +4800 +FA00 +4A00 +4500 +7A00 +9600 +1900 +3080 +ENDCHAR +STARTCHAR 57A0 +ENCODING 22432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +5100 +5F00 +F100 +5F00 +5500 +7300 +DF00 +3180 +ENDCHAR +STARTCHAR 57A2 +ENCODING 22434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4300 +5E00 +5000 +FF80 +5000 +7F00 +9900 +2F00 +2900 +ENDCHAR +STARTCHAR 57A3 +ENCODING 22435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +4000 +5F00 +F100 +5F00 +5100 +7F00 +8000 +3F80 +ENDCHAR +STARTCHAR 57C3 +ENCODING 22467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4A00 +5F00 +F000 +5F00 +4400 +5F80 +8C00 +1B00 +2180 +ENDCHAR +STARTCHAR 57C7 +ENCODING 22471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +42 +44 +FF +55 +5F +75 +5F +95 +15 +ENDCHAR +STARTCHAR 57C8 +ENCODING 22472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4900 +5F00 +EA80 +5B00 +4F00 +7200 +AA00 +0E00 +3180 +ENDCHAR +STARTCHAR 57CB +ENCODING 22475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +5500 +FF00 +5500 +5F00 +7F00 +4400 +8400 +3F80 +ENDCHAR +STARTCHAR 57CE +ENCODING 22478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +4500 +5F80 +F480 +5B00 +5B00 +5A00 +AA00 +2580 +2900 +ENDCHAR +STARTCHAR 57DF +ENCODING 22495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4300 +7F80 +C200 +5B00 +5B00 +6300 +BE00 +0580 +0900 +ENDCHAR +STARTCHAR 57E0 +ENCODING 22496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +5100 +FF00 +5F00 +5100 +7F00 +BF80 +0400 +0400 +ENDCHAR +STARTCHAR 57F0 +ENCODING 22512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5F00 +5480 +F000 +4400 +5F00 +6E00 +9500 +2480 +0400 +ENDCHAR +STARTCHAR 57F4 +ENCODING 22516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +5F80 +4400 +EF00 +5F00 +5900 +7F00 +5F00 +9F80 +1000 +ENDCHAR +STARTCHAR 57F7 +ENCODING 22519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F400 +4F00 +F500 +AD00 +F500 +4500 +F900 +4980 +5180 +ENDCHAR +STARTCHAR 57F9 +ENCODING 22521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +4900 +EA00 +5F80 +4000 +7F00 +9100 +1F00 +1100 +ENDCHAR +STARTCHAR 57FA +ENCODING 22522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +3E00 +2200 +3E00 +FF80 +4A00 +BF80 +0800 +FF00 +ENDCHAR +STARTCHAR 57FC +ENCODING 22524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +4A00 +F100 +5F80 +4100 +7D00 +5D00 +9500 +0300 +ENDCHAR +STARTCHAR 5800 +ENCODING 22528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +5F +D0 +5D +5D +6F +B5 +2F +31 +ENDCHAR +STARTCHAR 5802 +ENCODING 22530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +2A00 +FF00 +BE80 +4200 +4200 +3E00 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 5805 +ENCODING 22533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A500 +F500 +F200 +F500 +0880 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 5806 +ENCODING 22534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +5F80 +F200 +4F00 +5200 +6F00 +D200 +0F80 +1000 +ENDCHAR +STARTCHAR 5808 +ENCODING 22536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +6B +6B +E3 +6F +6F +6F +AF +29 +23 +ENDCHAR +STARTCHAR 5809 +ENCODING 22537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +4A00 +FF00 +4000 +5F00 +7F00 +9F00 +1100 +1300 +ENDCHAR +STARTCHAR 580A +ENCODING 22538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1400 +7700 +7700 +FF80 +0000 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 581E +ENCODING 22558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +7F80 +5500 +F700 +5F00 +4400 +7F80 +8600 +1D80 +2400 +ENDCHAR +STARTCHAR 5821 +ENCODING 22561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +5F00 +C400 +FF80 +4E00 +7580 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 5824 +ENCODING 22564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +5100 +5F00 +FF00 +5F80 +7400 +5700 +AC00 +2780 +ENDCHAR +STARTCHAR 5827 +ENCODING 22567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +5F00 +FA80 +5B00 +4400 +7F80 +8400 +0B00 +1080 +ENDCHAR +STARTCHAR 582A +ENCODING 22570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +5F80 +4900 +EF00 +4E00 +4900 +7F80 +9700 +1800 +1F80 +ENDCHAR +STARTCHAR 582F +ENCODING 22575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +FF00 +4200 +FF00 +CF00 +FF80 +2400 +6480 +8700 +ENDCHAR +STARTCHAR 5830 +ENCODING 22576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F80 +6F00 +6900 +EF00 +6F00 +5F80 +6200 +AD00 +1F80 +ENDCHAR +STARTCHAR 5831 +ENCODING 22577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +4900 +FB00 +AF00 +FD00 +4B00 +FB00 +4B00 +4C80 +ENDCHAR +STARTCHAR 5834 +ENCODING 22580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +5F00 +FF00 +4000 +7F80 +7F00 +AB00 +1500 +0B00 +ENDCHAR +STARTCHAR 5835 +ENCODING 22581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +4600 +FF80 +4900 +5F00 +7100 +8F00 +0F00 +1100 +ENDCHAR +STARTCHAR 583A +ENCODING 22586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +5F00 +F500 +5F00 +6B00 +9A80 +2A00 +1200 +2200 +ENDCHAR +STARTCHAR 584A +ENCODING 22602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +5500 +FF00 +5500 +5F00 +6F00 +9700 +1480 +2700 +ENDCHAR +STARTCHAR 584B +ENCODING 22603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D700 +DB00 +6700 +9900 +FF00 +8900 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 584F +ENCODING 22607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +5500 +5F00 +E000 +5F80 +5F00 +7F00 +4000 +8A00 +3F80 +ENDCHAR +STARTCHAR 5851 +ENCODING 22609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5700 +FD00 +B700 +B500 +F700 +4500 +8900 +7E00 +0800 +FF80 +ENDCHAR +STARTCHAR 5854 +ENCODING 22612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F80 +4E00 +EA00 +5F00 +6080 +7F00 +9100 +1F00 +1100 +ENDCHAR +STARTCHAR 5857 +ENCODING 22615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +1200 +AF80 +0400 +7F00 +AD00 +8800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 5858 +ENCODING 22616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +9F80 +9F00 +D500 +9F80 +9F00 +5F00 +A900 +2900 +2F00 +ENDCHAR +STARTCHAR 585A +ENCODING 22618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +5080 +FF00 +4A80 +5700 +7D00 +5500 +9A80 +3C00 +ENDCHAR +STARTCHAR 585E +ENCODING 22622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +2400 +7F00 +FF80 +2A00 +7F00 +8880 +FF00 +ENDCHAR +STARTCHAR 5861 +ENCODING 22625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5300 +5C80 +5F00 +DF00 +5F00 +5F00 +6F00 +9F80 +0A00 +3180 +ENDCHAR +STARTCHAR 5862 +ENCODING 22626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +5100 +FF00 +5000 +5F80 +7F00 +5E80 +9F00 +2B00 +ENDCHAR +STARTCHAR 5864 +ENCODING 22628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +5F00 +FF00 +5100 +5F00 +7F00 +5F00 +8A00 +3180 +ENDCHAR +STARTCHAR 5875 +ENCODING 22645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +FF00 +A500 +B680 +FF00 +BF00 +8800 +7F80 +ENDCHAR +STARTCHAR 5879 +ENCODING 22649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +F600 +F400 +B780 +F500 +F900 +2900 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 587C +ENCODING 22652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +5F00 +DF00 +5500 +5F00 +5F00 +BF80 +1200 +0600 +ENDCHAR +STARTCHAR 587E +ENCODING 22654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +0F00 +F500 +6500 +6580 +3780 +C800 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 5883 +ENCODING 22659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +4A00 +FF80 +5F00 +5F00 +7100 +9F00 +0A80 +3380 +ENDCHAR +STARTCHAR 5885 +ENCODING 22661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F600 +FF80 +F300 +3200 +C600 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 5889 +ENCODING 22665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +6F00 +DF80 +6F00 +6F00 +6F00 +B500 +2F00 +3500 +ENDCHAR +STARTCHAR 5893 +ENCODING 22675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +2400 +7E00 +7E00 +4200 +7E00 +FF80 +4A00 +BF80 +FF00 +ENDCHAR +STARTCHAR 589C +ENCODING 22684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +DF00 +DA00 +AF00 +FB00 +9500 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 589E +ENCODING 22686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4E00 +5100 +7F80 +DF00 +5F00 +7F00 +5100 +9F00 +1F00 +ENDCHAR +STARTCHAR 589F +ENCODING 22687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +5F80 +E880 +6480 +6700 +7700 +AF00 +2600 +5F80 +ENDCHAR +STARTCHAR 58A8 +ENCODING 22696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +AD00 +7F00 +7F00 +FF80 +6500 +AC80 +7F00 +FF80 +ENDCHAR +STARTCHAR 58A9 +ENCODING 22697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +BA00 +BB80 +FB00 +8500 +BF00 +5300 +BF00 +1700 +3480 +ENDCHAR +STARTCHAR 58AE +ENCODING 22702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +BF80 +CA00 +B400 +AF00 +EF00 +8900 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 58B3 +ENCODING 22707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +5F80 +E900 +5F00 +5F00 +7F00 +5F00 +8A00 +3180 +ENDCHAR +STARTCHAR 58BA +ENCODING 22714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +5F00 +FF00 +5700 +5D00 +6400 +9F80 +0A00 +3180 +ENDCHAR +STARTCHAR 58BB +ENCODING 22715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +5F00 +EE80 +7F80 +5F00 +7100 +9F00 +1500 +1F00 +ENDCHAR +STARTCHAR 58BE +ENCODING 22718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +E900 +7F00 +EF00 +AB00 +DF00 +2880 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 58C1 +ENCODING 22721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +9F00 +F500 +8F80 +FF00 +F200 +0A00 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 58C5 +ENCODING 22725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +4A00 +AF00 +5A00 +AE00 +CF80 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 58C7 +ENCODING 22727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +4000 +5F00 +DB00 +5F00 +4000 +7F00 +5F00 +9F00 +3F80 +ENDCHAR +STARTCHAR 58CE +ENCODING 22734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +7F00 +DF00 +5F00 +5F00 +6400 +BF80 +1B00 +2A80 +ENDCHAR +STARTCHAR 58D1 +ENCODING 22737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3000 +F700 +ED00 +5500 +EA00 +FF00 +F500 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 58D3 +ENCODING 22739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +AB00 +BF80 +BA00 +BB00 +BC80 +D800 +BF00 +FF80 +ENDCHAR +STARTCHAR 58D5 +ENCODING 22741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +4000 +5F00 +FF00 +7F80 +7F80 +7B00 +9700 +1D00 +3C80 +ENDCHAR +STARTCHAR 58D8 +ENCODING 22744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF00 +FF00 +FF00 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 58D9 +ENCODING 22745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +5F80 +EE00 +5F80 +6F00 +6F00 +AD00 +2F00 +3180 +ENDCHAR +STARTCHAR 58DE +ENCODING 22750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +4000 +5F00 +DF00 +4400 +5F00 +7F00 +9500 +3700 +3880 +ENDCHAR +STARTCHAR 58DF +ENCODING 22751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +F700 +F700 +F800 +FE00 +FE80 +B700 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 58E4 +ENCODING 22756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF80 +8000 +9B00 +DB00 +BF00 +9F00 +4A00 +BF80 +3600 +1980 +ENDCHAR +STARTCHAR 58EB +ENCODING 22763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +0800 +FF00 +ENDCHAR +STARTCHAR 58EC +ENCODING 22764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +07 +F8 +08 +08 +FF +08 +08 +08 +FF +ENDCHAR +STARTCHAR 58EF +ENCODING 22767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +A400 +A400 +FF80 +2400 +E400 +A400 +A400 +AF00 +A000 +ENDCHAR +STARTCHAR 58F9 +ENCODING 22777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +0000 +FF00 +BF00 +7E00 +4200 +7E00 +FF80 +ENDCHAR +STARTCHAR 58FA +ENCODING 22778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +0000 +FF00 +9480 +7700 +7700 +1400 +FF80 +ENDCHAR +STARTCHAR 58FB +ENCODING 22779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F80 +5500 +5700 +EF80 +5F00 +7100 +5F00 +9F00 +1300 +ENDCHAR +STARTCHAR 58FD +ENCODING 22781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0000 +FF00 +7E00 +7E00 +FF80 +EF80 +E500 +9200 +ENDCHAR +STARTCHAR 590F +ENCODING 22799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +7E00 +7E00 +7E00 +4100 +7E00 +6400 +9C00 +E780 +ENDCHAR +STARTCHAR 5914 +ENCODING 22804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +5F00 +E780 +FF00 +9C00 +7E00 +7E00 +D400 +FF80 +ENDCHAR +STARTCHAR 5915 +ENCODING 22805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +1F +22 +42 +52 +8C +08 +30 +C0 +ENDCHAR +STARTCHAR 5916 +ENCODING 22806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +4400 +7400 +4C00 +D400 +3300 +2480 +2400 +4400 +8400 +ENDCHAR +STARTCHAR 5919 +ENCODING 22809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +8200 +BE00 +9E00 +A600 +BA00 +AA00 +9180 +A100 +ENDCHAR +STARTCHAR 591A +ENCODING 22810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +3E00 +6400 +9800 +3400 +DF80 +3100 +4E00 +1800 +E000 +ENDCHAR +STARTCHAR 591C +ENCODING 22812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +2800 +4F00 +5500 +DE00 +EC00 +4600 +5B00 +5100 +ENDCHAR +STARTCHAR 5922 +ENCODING 22818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7F00 +7F00 +0000 +FF00 +BF00 +C400 +1800 +E000 +ENDCHAR +STARTCHAR 5927 +ENCODING 22823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +FF00 +0800 +1800 +1400 +2200 +4100 +8080 +ENDCHAR +STARTCHAR 5929 +ENCODING 22825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +0800 +FF00 +0800 +1800 +2400 +4300 +8180 +ENDCHAR +STARTCHAR 592A +ENCODING 22826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0800 +1800 +1400 +3A00 +4900 +8080 +ENDCHAR +STARTCHAR 592B +ENCODING 22827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +7F +08 +FF +18 +14 +24 +43 +81 +ENDCHAR +STARTCHAR 592D +ENCODING 22829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7800 +0800 +FF00 +1800 +1400 +2400 +4300 +8180 +ENDCHAR +STARTCHAR 592E +ENCODING 22830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +7E00 +4900 +4900 +FF80 +1800 +3400 +6200 +8100 +ENDCHAR +STARTCHAR 5931 +ENCODING 22833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +7F00 +8800 +0800 +FF80 +1800 +2400 +6200 +8180 +ENDCHAR +STARTCHAR 5937 +ENCODING 22839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +FF00 +7F00 +8800 +FF00 +1B00 +2600 +C180 +ENDCHAR +STARTCHAR 593E +ENCODING 22846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +4A00 +4A00 +AD00 +9900 +2400 +4300 +8180 +ENDCHAR +STARTCHAR 5944 +ENCODING 22852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +2400 +4A00 +FF80 +CA00 +7E00 +7E00 +4880 +0F00 +ENDCHAR +STARTCHAR 5947 +ENCODING 22855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +3400 +C300 +FF80 +0200 +7A00 +4A00 +7A00 +0600 +ENDCHAR +STARTCHAR 5948 +ENCODING 22856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +FF +14 +62 +BD +00 +FF +2A +4B +B9 +ENDCHAR +STARTCHAR 5949 +ENCODING 22857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1000 +7F00 +FF80 +2A00 +FD00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 594E +ENCODING 22862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +2C00 +6A00 +BF80 +FF00 +0800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 594F +ENCODING 22863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7F00 +7E00 +1400 +FF80 +7E00 +9180 +7E00 +3400 +C300 +ENDCHAR +STARTCHAR 5950 +ENCODING 22864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7800 +FF00 +D900 +6B00 +6F00 +FF80 +1800 +2400 +C380 +ENDCHAR +STARTCHAR 5951 +ENCODING 22865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +FF00 +F500 +3500 +E900 +2B00 +FF00 +1800 +6600 +8180 +ENDCHAR +STARTCHAR 5954 +ENCODING 22868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +2400 +4A00 +BF00 +2C00 +2400 +FF80 +2400 +C400 +ENDCHAR +STARTCHAR 5955 +ENCODING 22869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +5600 +A500 +AD00 +4800 +FF80 +1800 +6600 +C180 +ENDCHAR +STARTCHAR 5957 +ENCODING 22871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +2400 +7F00 +BF80 +2000 +FF00 +2200 +2F00 +F100 +ENDCHAR +STARTCHAR 595A +ENCODING 22874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7D00 +9D00 +2400 +1A00 +FF00 +FF00 +2400 +C380 +ENDCHAR +STARTCHAR 5960 +ENCODING 22880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5C +FE +FF +67 +7F +7F +FF +34 +C3 +ENDCHAR +STARTCHAR 5962 +ENCODING 22882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF80 +7600 +FD80 +FF00 +1400 +7E00 +C200 +3E00 +3E00 +ENDCHAR +STARTCHAR 5967 +ENCODING 22887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +BD00 +AD00 +BF00 +AF00 +0800 +FF00 +2400 +C380 +ENDCHAR +STARTCHAR 596A +ENCODING 22890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF80 +6E00 +BF80 +7E00 +FE00 +7F00 +FF80 +2400 +2C00 +ENDCHAR +STARTCHAR 596B +ENCODING 22891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +FF +26 +E1 +ED +BF +BF +7F +AD +CD +ENDCHAR +STARTCHAR 596C +ENCODING 22892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +AF00 +FA00 +FD00 +BF80 +AB00 +0800 +FF00 +3400 +C380 +ENDCHAR +STARTCHAR 596D +ENCODING 22893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +EF00 +4A00 +EF00 +EF00 +FF00 +2400 +6200 +8100 +ENDCHAR +STARTCHAR 596E +ENCODING 22894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF80 +2B00 +DC80 +FC00 +7F00 +0000 +7F00 +7F00 +7F00 +ENDCHAR +STARTCHAR 5973 +ENCODING 22899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +10 +FF +22 +24 +34 +0C +33 +C1 +ENDCHAR +STARTCHAR 5974 +ENCODING 22900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +E900 +5900 +A500 +A600 +6600 +6600 +E900 +9080 +ENDCHAR +STARTCHAR 5978 +ENCODING 22904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +E400 +A400 +BF80 +A400 +4400 +6400 +D400 +8400 +ENDCHAR +STARTCHAR 597D +ENCODING 22909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4100 +E200 +A200 +A400 +BF80 +6400 +6400 +D400 +8C00 +ENDCHAR +STARTCHAR 5982 +ENCODING 22914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +47 +F5 +55 +95 +95 +65 +75 +D7 +85 +ENDCHAR +STARTCHAR 5983 +ENCODING 22915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4100 +E100 +A100 +AF00 +A800 +A800 +6880 +D880 +8F00 +ENDCHAR +STARTCHAR 5984 +ENCODING 22916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +4000 +6100 +7E00 +FF80 +2400 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 598A +ENCODING 22922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +E400 +A400 +BF80 +A400 +A400 +6400 +E400 +9F00 +ENDCHAR +STARTCHAR 5993 +ENCODING 22931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +A400 +BF00 +A900 +6600 +6600 +8B00 +9080 +ENDCHAR +STARTCHAR 5996 +ENCODING 22934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +E400 +A400 +BF80 +A400 +4600 +6A00 +9100 +9080 +ENDCHAR +STARTCHAR 5997 +ENCODING 22935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +E900 +BF00 +A080 +BF00 +4100 +6100 +E200 +8200 +ENDCHAR +STARTCHAR 5999 +ENCODING 22937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4500 +ED00 +AD00 +B480 +BD00 +6500 +6200 +8C00 +9000 +ENDCHAR +STARTCHAR 59A5 +ENCODING 22949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0100 +5200 +4200 +1000 +FF80 +6400 +1C00 +E300 +ENDCHAR +STARTCHAR 59A8 +ENCODING 22952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +A800 +AF00 +A900 +A900 +6900 +F100 +9700 +ENDCHAR +STARTCHAR 59AC +ENCODING 22956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E400 +A800 +AF00 +B900 +5900 +6900 +EF00 +8900 +ENDCHAR +STARTCHAR 59B9 +ENCODING 22969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +A400 +BF00 +A600 +4E00 +7500 +9480 +8400 +ENDCHAR +STARTCHAR 59BB +ENCODING 22971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +7E00 +0900 +FF80 +7E00 +FF80 +2400 +1C00 +E300 +ENDCHAR +STARTCHAR 59BE +ENCODING 22974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +FF +10 +10 +FF +24 +1C +E3 +ENDCHAR +STARTCHAR 59C3 +ENCODING 22979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E200 +AA00 +AB00 +AA00 +AA00 +4A00 +EA00 +9F80 +ENDCHAR +STARTCHAR 59C6 +ENCODING 22982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +ED00 +B300 +BF80 +B500 +5300 +7F80 +9100 +8600 +ENDCHAR +STARTCHAR 59C9 +ENCODING 22985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +A400 +AF00 +B500 +B500 +5500 +F500 +8400 +ENDCHAR +STARTCHAR 59CB +ENCODING 22987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4800 +E900 +BF00 +A080 +AF00 +4900 +6900 +AF00 +8900 +ENDCHAR +STARTCHAR 59D0 +ENCODING 22992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +E900 +AF00 +A900 +A900 +4F00 +6900 +A900 +9F80 +ENDCHAR +STARTCHAR 59D1 +ENCODING 22993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +A400 +A400 +AF00 +4900 +6900 +DF00 +8900 +ENDCHAR +STARTCHAR 59D3 +ENCODING 22995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4A00 +EF00 +B200 +B200 +A200 +6F00 +6200 +8200 +9F80 +ENDCHAR +STARTCHAR 59D4 +ENCODING 22996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1600 +6800 +FF00 +2E00 +D180 +FF00 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 59D9 +ENCODING 23001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8E00 +F200 +B200 +BF80 +D200 +D200 +5200 +B200 +9700 +ENDCHAR +STARTCHAR 59DA +ENCODING 23002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5A80 +FB00 +AB00 +AA00 +AB00 +5A80 +6A00 +F280 +9300 +ENDCHAR +STARTCHAR 59DC +ENCODING 23004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7F00 +FF80 +1000 +FF00 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 59DD +ENCODING 23005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4C00 +FF00 +B400 +BF80 +C600 +4E00 +7500 +9480 +8400 +ENDCHAR +STARTCHAR 59E6 +ENCODING 23014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +2400 +1C00 +E300 +4400 +FF80 +A900 +6600 +9D00 +ENDCHAR +STARTCHAR 59E8 +ENCODING 23016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +9F80 +E400 +BF00 +BF00 +D400 +DF80 +4500 +AB00 +B080 +ENDCHAR +STARTCHAR 59EA +ENCODING 23018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4800 +E900 +AF00 +A080 +A400 +DF00 +6400 +A400 +9F80 +ENDCHAR +STARTCHAR 59EC +ENCODING 23020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +9200 +F600 +B700 +B500 +B500 +5700 +7200 +BF80 +9000 +ENDCHAR +STARTCHAR 59EE +ENCODING 23022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4000 +E000 +AF00 +A900 +AF00 +4900 +6F00 +E000 +9F80 +ENDCHAR +STARTCHAR 59F8 +ENCODING 23032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +9B80 +E900 +A900 +BD00 +AF80 +4900 +7100 +B100 +A100 +ENDCHAR +STARTCHAR 59FB +ENCODING 23035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +95 +F5 +BF +B5 +D7 +59 +BF +91 +ENDCHAR +STARTCHAR 59FF +ENCODING 23039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DF00 +1900 +DE00 +6180 +1000 +FF80 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 5A01 +ENCODING 23041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +0500 +7F80 +BD00 +A500 +7D00 +AA00 +9280 +AE80 +C900 +ENDCHAR +STARTCHAR 5A03 +ENCODING 23043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +EF00 +A400 +BF80 +A400 +BF00 +6400 +E400 +9F80 +ENDCHAR +STARTCHAR 5A11 +ENCODING 23057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5500 +D500 +4E00 +C800 +B000 +FF80 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 5A18 +ENCODING 23064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +E900 +AF00 +A900 +AF00 +6D80 +6B00 +8D00 +9880 +ENDCHAR +STARTCHAR 5A1B +ENCODING 23067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4700 +5500 +F700 +B000 +BF00 +A500 +7F80 +AA00 +9180 +ENDCHAR +STARTCHAR 5A1C +ENCODING 23068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BB00 +9B00 +DB00 +BF00 +DB00 +DA80 +FE80 +5B00 +AA00 +AA00 +ENDCHAR +STARTCHAR 5A1F +ENCODING 23071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +49 +EF +A0 +AF +AF +71 +6F +91 +93 +ENDCHAR +STARTCHAR 5A20 +ENCODING 23072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +9F80 +FF00 +B000 +BF80 +BA80 +5B00 +7A00 +BF00 +A880 +ENDCHAR +STARTCHAR 5A25 +ENCODING 23077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +9B00 +EA00 +BF80 +AA00 +CE00 +5A00 +4A00 +AE00 +9F00 +ENDCHAR +STARTCHAR 5A29 +ENCODING 23081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +8E00 +F200 +BF00 +B500 +BF00 +C600 +6A00 +BA80 +B300 +ENDCHAR +STARTCHAR 5A36 +ENCODING 23094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F000 +FF00 +F500 +B200 +DD80 +FF80 +2400 +1C00 +F300 +ENDCHAR +STARTCHAR 5A3C +ENCODING 23100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +91 +EF +AF +A0 +BF +D1 +7F +BF +91 +ENDCHAR +STARTCHAR 5A41 +ENCODING 23105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +FF80 +7E00 +7F00 +7F00 +FF00 +2400 +1C00 +E300 +ENDCHAR +STARTCHAR 5A46 +ENCODING 23110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +9F00 +5A00 +A600 +B900 +FF80 +2400 +1E00 +F300 +ENDCHAR +STARTCHAR 5A49 +ENCODING 23113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F80 +F080 +AF00 +B700 +DB00 +CB00 +4B00 +B280 +9300 +ENDCHAR +STARTCHAR 5A5A +ENCODING 23130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4700 +9A00 +FF00 +BE80 +B900 +BF00 +D100 +7F00 +BF00 +9100 +ENDCHAR +STARTCHAR 5A62 +ENCODING 23138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F00 +F500 +BF00 +B500 +BF00 +CA00 +7F80 +A200 +8200 +ENDCHAR +STARTCHAR 5A66 +ENCODING 23142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +8F00 +FF80 +AF00 +BF80 +B480 +CF00 +7500 +B700 +8400 +ENDCHAR +STARTCHAR 5A92 +ENCODING 23186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +9F80 +EF00 +A900 +AF00 +DF80 +4600 +7D00 +9480 +8400 +ENDCHAR +STARTCHAR 5A9A +ENCODING 23194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +FF +B0 +B7 +B7 +D9 +57 +A7 +A9 +ENDCHAR +STARTCHAR 5A9B +ENCODING 23195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +8F00 +F480 +BF00 +A800 +BF80 +CF00 +4900 +B600 +AD80 +ENDCHAR +STARTCHAR 5AA4 +ENCODING 23204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5500 +EF00 +B500 +AF00 +A400 +DA00 +7900 +B980 +9600 +ENDCHAR +STARTCHAR 5AC1 +ENCODING 23233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F80 +FF80 +AA00 +BA80 +CF00 +D600 +6B00 +9280 +8C00 +ENDCHAR +STARTCHAR 5AC2 +ENCODING 23234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5D00 +FD00 +B500 +BF00 +A400 +5F00 +6900 +A600 +9980 +ENDCHAR +STARTCHAR 5AC4 +ENCODING 23236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +9200 +FF00 +B900 +BF00 +B900 +DF00 +5700 +AA80 +A600 +ENDCHAR +STARTCHAR 5AC9 +ENCODING 23241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8200 +9F80 +F400 +D700 +DA00 +DF80 +F200 +5600 +BD00 +A880 +ENDCHAR +STARTCHAR 5ACC +ENCODING 23244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8F00 +9C00 +FF80 +BF00 +AB00 +DF80 +DF00 +4B00 +BA80 +AA00 +ENDCHAR +STARTCHAR 5AE1 +ENCODING 23265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F80 +EA00 +BF00 +B500 +BF00 +DF00 +5F00 +BB00 +9300 +ENDCHAR +STARTCHAR 5AE6 +ENCODING 23270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +8D00 +FF80 +BF80 +A900 +CF00 +5F80 +5480 +B500 +8400 +ENDCHAR +STARTCHAR 5AE9 +ENCODING 23273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +BE00 +D380 +BB00 +F700 +FB00 +D900 +7500 +B300 +9480 +ENDCHAR +STARTCHAR 5B05 +ENCODING 23301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +FF00 +AD00 +BF80 +AD00 +DF00 +7F80 +8400 +8400 +ENDCHAR +STARTCHAR 5B09 +ENCODING 23305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F80 +FF00 +BF00 +B100 +CE00 +5F80 +7F00 +BF00 +9100 +ENDCHAR +STARTCHAR 5B0B +ENCODING 23307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5680 +FF00 +AF00 +B500 +AF00 +4F00 +7F80 +A400 +8400 +ENDCHAR +STARTCHAR 5B0C +ENCODING 23308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +9E00 +FF80 +BE80 +AE00 +DF00 +D100 +5F00 +BF00 +9100 +ENDCHAR +STARTCHAR 5B16 +ENCODING 23318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +9100 +FF80 +F200 +9F00 +7200 +FF00 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 5B2A +ENCODING 23338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +9F00 +FF00 +AD00 +BF00 +D100 +DF00 +4F00 +A200 +9980 +ENDCHAR +STARTCHAR 5B40 +ENCODING 23360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +9F +84 +DF +D5 +CF +CF +DF +57 +8F +8D +ENDCHAR +STARTCHAR 5B43 +ENCODING 23363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF80 +8000 +DB00 +BB00 +BF80 +DF00 +4A00 +7F80 +AF00 +9980 +ENDCHAR +STARTCHAR 5B50 +ENCODING 23376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +0400 +0800 +0800 +FF80 +0800 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 5B51 +ENCODING 23377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +02 +0C +09 +FE +08 +08 +08 +38 +ENDCHAR +STARTCHAR 5B54 +ENCODING 23380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F400 +1400 +2400 +3400 +C400 +2400 +2480 +2480 +C700 +ENDCHAR +STARTCHAR 5B55 +ENCODING 23381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FC00 +2700 +2100 +7D00 +8B00 +FF80 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 5B57 +ENCODING 23383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8080 +7E00 +0400 +0800 +FF80 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 5B58 +ENCODING 23384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF80 +2000 +3F00 +4200 +C400 +FF80 +4400 +4400 +4C00 +ENDCHAR +STARTCHAR 5B5A +ENCODING 23386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7E00 +8900 +8100 +7E00 +0800 +FF80 +0800 +0800 +3800 +ENDCHAR +STARTCHAR 5B5C +ENCODING 23388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F000 +1400 +2780 +4900 +7900 +CE00 +5600 +4600 +4D00 +D080 +ENDCHAR +STARTCHAR 5B5D +ENCODING 23389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7D00 +1200 +FF80 +0800 +7E00 +C800 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR 5B5F +ENCODING 23391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +0400 +FF80 +0800 +1000 +7F00 +5500 +5500 +FF80 +ENDCHAR +STARTCHAR 5B63 +ENCODING 23395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7C00 +FF00 +1C00 +7E00 +8580 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR 5B64 +ENCODING 23396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +3E00 +5500 +5500 +7500 +D500 +5500 +5700 +7900 +A080 +ENDCHAR +STARTCHAR 5B69 +ENCODING 23401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +3F80 +4400 +5A00 +6A00 +C500 +4A00 +5600 +4D00 +D080 +ENDCHAR +STARTCHAR 5B6B +ENCODING 23403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +3C00 +4500 +6A00 +C500 +5F00 +4D80 +5480 +C400 +ENDCHAR +STARTCHAR 5B70 +ENCODING 23408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +0400 +FF00 +F500 +0D00 +F500 +2700 +F900 +4980 +5180 +ENDCHAR +STARTCHAR 5B71 +ENCODING 23409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +9E00 +8400 +BF00 +8000 +F700 +FF80 +2600 +ENDCHAR +STARTCHAR 5B75 +ENCODING 23413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +EF00 +EE80 +DF00 +E900 +EA00 +DF80 +6200 +A600 +ENDCHAR +STARTCHAR 5B78 +ENCODING 23416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FB00 +7700 +9900 +FF00 +8080 +FE80 +0800 +FF80 +1800 +ENDCHAR +STARTCHAR 5B7A +ENCODING 23418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +3F80 +7F80 +5F00 +FF80 +4400 +5F00 +5B00 +9B00 +ENDCHAR +STARTCHAR 5B7C +ENCODING 23420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D200 +6F00 +BF80 +FF00 +F200 +0000 +7C00 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR 5B85 +ENCODING 23429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +8D +70 +1F +F0 +10 +11 +1F +ENDCHAR +STARTCHAR 5B87 +ENCODING 23431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8080 +FE80 +0800 +0800 +FF80 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 5B88 +ENCODING 23432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +8500 +FF80 +0400 +2400 +2400 +0400 +0C00 +ENDCHAR +STARTCHAR 5B89 +ENCODING 23433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +9100 +1000 +FF80 +2200 +2400 +1800 +3E00 +E100 +ENDCHAR +STARTCHAR 5B8B +ENCODING 23435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +8900 +FF00 +1800 +2C00 +4B00 +8880 +0800 +ENDCHAR +STARTCHAR 5B8C +ENCODING 23436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +3E00 +0000 +FF00 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 5B8F +ENCODING 23439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +91 +10 +FF +28 +2A +52 +97 +F9 +ENDCHAR +STARTCHAR 5B93 +ENCODING 23443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +9100 +0A00 +2200 +6600 +A900 +B280 +6200 +BE00 +ENDCHAR +STARTCHAR 5B95 +ENCODING 23445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +FF +20 +20 +FE +C1 +3E +41 +ENDCHAR +STARTCHAR 5B96 +ENCODING 23446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8480 +7400 +1400 +7400 +F500 +1900 +2B00 +6C80 +ENDCHAR +STARTCHAR 5B97 +ENCODING 23447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8080 +7E00 +0000 +FF00 +2A00 +4A00 +8900 +B100 +ENDCHAR +STARTCHAR 5B98 +ENCODING 23448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +7E +42 +7E +7F +41 +7F +41 +ENDCHAR +STARTCHAR 5B99 +ENCODING 23449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +89 +89 +7F +49 +7F +49 +7F +41 +ENDCHAR +STARTCHAR 5B9A +ENCODING 23450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +7E00 +0800 +4800 +4E00 +4800 +B000 +9F80 +ENDCHAR +STARTCHAR 5B9B +ENCODING 23451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +C100 +7F00 +5900 +D900 +2900 +2B00 +4880 +8F00 +ENDCHAR +STARTCHAR 5B9C +ENCODING 23452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +7E00 +4200 +7E00 +4200 +7E00 +4200 +FF80 +ENDCHAR +STARTCHAR 5BA2 +ENCODING 23458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A100 +FF00 +9800 +2600 +FF80 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 5BA3 +ENCODING 23459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8080 +FE80 +7E00 +4200 +7E00 +7E00 +0000 +FF80 +ENDCHAR +STARTCHAR 5BA4 +ENCODING 23460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +FF00 +2200 +FF00 +0800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 5BA5 +ENCODING 23461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +91 +FF +3E +42 +BE +3E +22 +26 +ENDCHAR +STARTCHAR 5BA6 +ENCODING 23462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +7F +48 +7E +42 +7E +7F +40 +ENDCHAR +STARTCHAR 5BAC +ENCODING 23468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8A80 +0800 +7F00 +7900 +9600 +9600 +BA80 +9100 +ENDCHAR +STARTCHAR 5BAE +ENCODING 23470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +FF +42 +7E +7F +41 +7F +41 +ENDCHAR +STARTCHAR 5BB0 +ENCODING 23472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +89 +7E +24 +FF +08 +7F +08 +08 +ENDCHAR +STARTCHAR 5BB3 +ENCODING 23475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +08 +7E +FF +00 +7F +7F +41 +ENDCHAR +STARTCHAR 5BB4 +ENCODING 23476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +42 +7E +7E +FF +64 +1C +F3 +ENDCHAR +STARTCHAR 5BB5 +ENCODING 23477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +AB00 +4B00 +FE80 +4200 +7E00 +7E00 +4200 +4600 +ENDCHAR +STARTCHAR 5BB6 +ENCODING 23478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8080 +7E00 +7B00 +9400 +7C00 +EB00 +8900 +3800 +ENDCHAR +STARTCHAR 5BB8 +ENCODING 23480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +FF +7E +40 +7F +55 +9A +F1 +ENDCHAR +STARTCHAR 5BB9 +ENCODING 23481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +A5 +5A +B5 +62 +FF +42 +7E +42 +ENDCHAR +STARTCHAR 5BBF +ENCODING 23487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +A1 +5F +48 +DF +D1 +5F +5F +51 +ENDCHAR +STARTCHAR 5BC0 +ENCODING 23488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +5200 +8900 +0800 +F700 +1600 +6980 +8800 +ENDCHAR +STARTCHAR 5BC2 +ENCODING 23490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +C100 +3F00 +4500 +F500 +B200 +B200 +AD00 +4880 +ENDCHAR +STARTCHAR 5BC3 +ENCODING 23491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +BD00 +2800 +7F00 +C900 +7F00 +1C00 +6A80 +CF00 +ENDCHAR +STARTCHAR 5BC4 +ENCODING 23492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +1C00 +E300 +FF80 +7A00 +4A00 +7A00 +0600 +ENDCHAR +STARTCHAR 5BC5 +ENCODING 23493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8080 +FE80 +7E00 +4900 +7E00 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 5BC6 +ENCODING 23494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +AA80 +6500 +BB00 +7C00 +8800 +8900 +FF00 +8100 +ENDCHAR +STARTCHAR 5BC7 +ENCODING 23495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8480 +6700 +0400 +FE00 +6600 +6600 +A980 +BF00 +ENDCHAR +STARTCHAR 5BCC +ENCODING 23500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +7E +7E +00 +7F +7F +7F +81 +ENDCHAR +STARTCHAR 5BD0 +ENCODING 23504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A480 +AF00 +E400 +3F80 +E600 +AD00 +B480 +A400 +ENDCHAR +STARTCHAR 5BD2 +ENCODING 23506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A500 +7E00 +7E00 +FF80 +2200 +4B00 +8680 +3800 +ENDCHAR +STARTCHAR 5BD3 +ENCODING 23507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +4A +7E +7E +FF +8D +BB +83 +ENDCHAR +STARTCHAR 5BD4 +ENCODING 23508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +7E00 +7E00 +0000 +FF00 +4E00 +6800 +9F80 +ENDCHAR +STARTCHAR 5BD7 +ENCODING 23511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +B100 +DC00 +7E00 +FF80 +C980 +7E00 +4200 +ENDCHAR +STARTCHAR 5BDE +ENCODING 23518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +7E00 +4200 +7E00 +7E00 +FF00 +2400 +C380 +ENDCHAR +STARTCHAR 5BDF +ENCODING 23519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +A600 +7E00 +C180 +FF00 +2A00 +4B00 +9900 +ENDCHAR +STARTCHAR 5BE1 +ENCODING 23521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +7E00 +4200 +7E00 +FF80 +7F00 +9280 +6C00 +ENDCHAR +STARTCHAR 5BE2 +ENCODING 23522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +AF80 +BF00 +EF00 +3F00 +F080 +AF00 +A600 +A900 +ENDCHAR +STARTCHAR 5BE4 +ENCODING 23524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +BF +A4 +EE +3F +E0 +AF +AF +A9 +ENDCHAR +STARTCHAR 5BE5 +ENCODING 23525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +3700 +DD00 +2600 +DD80 +7A00 +7C00 +6000 +ENDCHAR +STARTCHAR 5BE6 +ENCODING 23526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +FF80 +0000 +7E00 +4100 +7E00 +2600 +C100 +ENDCHAR +STARTCHAR 5BE7 +ENCODING 23527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +EA80 +7D00 +7F00 +5500 +FF80 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR 5BE8 +ENCODING 23528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E80 +7E00 +2400 +FF80 +6A00 +FF80 +2C00 +CB00 +ENDCHAR +STARTCHAR 5BE9 +ENCODING 23529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +F700 +2C00 +FF80 +2E00 +FF80 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 5BEB +ENCODING 23531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +42 +76 +7E +7F +8B +5B +93 +ENDCHAR +STARTCHAR 5BEC +ENCODING 23532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +7E00 +4200 +7E00 +4200 +7E00 +2A80 +CF00 +ENDCHAR +STARTCHAR 5BEE +ENCODING 23534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +2500 +7E00 +C380 +3E00 +3E00 +6E00 +9100 +ENDCHAR +STARTCHAR 5BEF +ENCODING 23535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +C8 +FE +7F +00 +E7 +9D +83 +ENDCHAR +STARTCHAR 5BF5 +ENCODING 23541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +6F00 +F100 +FF00 +9800 +FE00 +FF80 +BF00 +ENDCHAR +STARTCHAR 5BF6 +ENCODING 23542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +7F00 +6F00 +7E00 +4200 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 5BF8 +ENCODING 23544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +04 +04 +FF +04 +44 +24 +24 +04 +0C +ENDCHAR +STARTCHAR 5BFA +ENCODING 23546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +0800 +FF80 +0200 +0200 +FF00 +2200 +1200 +0C00 +ENDCHAR +STARTCHAR 5C01 +ENCODING 23553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4100 +FF80 +4100 +F900 +4500 +F500 +4100 +5100 +E600 +ENDCHAR +STARTCHAR 5C04 +ENCODING 23556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +F100 +9100 +FF80 +F500 +9500 +F300 +7100 +9100 +B700 +ENDCHAR +STARTCHAR 5C07 +ENCODING 23559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +AF00 +BB00 +E600 +3900 +FF80 +A900 +A500 +A100 +A200 +ENDCHAR +STARTCHAR 5C08 +ENCODING 23560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +7E00 +7E00 +FE00 +0300 +FF80 +2200 +0E00 +ENDCHAR +STARTCHAR 5C09 +ENCODING 23561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8900 +FF80 +F100 +8500 +FB00 +E900 +E900 +A300 +ENDCHAR +STARTCHAR 5C0A +ENCODING 23562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +7F00 +FF80 +6D00 +7E00 +7E00 +FF80 +4400 +2C00 +ENDCHAR +STARTCHAR 5C0B +ENCODING 23563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF80 +7E00 +FF00 +5900 +EF00 +FF80 +2200 +0C00 +ENDCHAR +STARTCHAR 5C0D +ENCODING 23565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +F100 +F900 +1780 +5100 +FD00 +F300 +2100 +3900 +C300 +ENDCHAR +STARTCHAR 5C0E +ENCODING 23566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D200 +3F80 +9F00 +1F00 +DF00 +4000 +BF80 +FF80 +2200 +1E00 +ENDCHAR +STARTCHAR 5C0F +ENCODING 23567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +4A00 +4A00 +4A00 +4900 +8900 +8880 +0800 +3000 +ENDCHAR +STARTCHAR 5C11 +ENCODING 23569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +2A00 +4A00 +4900 +4900 +8A80 +B400 +0C00 +3000 +C000 +ENDCHAR +STARTCHAR 5C16 +ENCODING 23574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +2A00 +4B00 +9900 +0000 +0800 +FF80 +1800 +2600 +C180 +ENDCHAR +STARTCHAR 5C19 +ENCODING 23577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +2C +4B +89 +7F +81 +9D +A5 +9D +A1 +83 +ENDCHAR +STARTCHAR 5C24 +ENCODING 23588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +1200 +FF00 +1000 +1800 +1800 +2800 +2800 +C880 +8F00 +ENDCHAR +STARTCHAR 5C28 +ENCODING 23592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +2400 +FF00 +3200 +3D00 +3600 +5D00 +5300 +9C80 +9F00 +ENDCHAR +STARTCHAR 5C31 +ENCODING 23601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F500 +0400 +FF80 +9200 +F600 +D600 +D600 +CA80 +5380 +ENDCHAR +STARTCHAR 5C38 +ENCODING 23608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +7F +40 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 5C39 +ENCODING 23609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +1200 +FF80 +1200 +1200 +7E00 +1000 +2000 +C000 +ENDCHAR +STARTCHAR 5C3A +ENCODING 23610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +41 +7F +48 +48 +44 +82 +81 +ENDCHAR +STARTCHAR 5C3B +ENCODING 23611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4100 +7F00 +5000 +7E00 +9200 +9280 +A280 +C300 +ENDCHAR +STARTCHAR 5C3C +ENCODING 23612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +81 +7F +90 +93 +9C +90 +91 +9F +ENDCHAR +STARTCHAR 5C3E +ENCODING 23614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +8100 +7F00 +BE00 +8F00 +B800 +FF00 +8880 +8F00 +ENDCHAR +STARTCHAR 5C3F +ENCODING 23615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +81 +FF +88 +F9 +9E +AA +A9 +59 +ENDCHAR +STARTCHAR 5C40 +ENCODING 23616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +81 +7F +7F +81 +BD +BD +A5 +83 +ENDCHAR +STARTCHAR 5C45 +ENCODING 23621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4100 +7F00 +4800 +7F80 +BF00 +A100 +A100 +BF00 +ENDCHAR +STARTCHAR 5C46 +ENCODING 23622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +7F +65 +BF +A5 +BF +BF +A1 +ENDCHAR +STARTCHAR 5C48 +ENCODING 23624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +81 +7F +A9 +A9 +BF +A9 +BF +A1 +ENDCHAR +STARTCHAR 5C4B +ENCODING 23627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +8100 +7F00 +7F00 +9200 +BF00 +BF00 +8800 +FF80 +ENDCHAR +STARTCHAR 5C4D +ENCODING 23629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8100 +FF00 +FF00 +9400 +BD00 +EA00 +9480 +E300 +ENDCHAR +STARTCHAR 5C4E +ENCODING 23630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +7F +69 +9A +BF +8A +B9 +A8 +ENDCHAR +STARTCHAR 5C51 +ENCODING 23633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +81 +FF +A9 +BF +FF +A1 +BF +A3 +ENDCHAR +STARTCHAR 5C55 +ENCODING 23637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +8100 +7F00 +BF00 +9400 +FF00 +A600 +AE00 +F180 +ENDCHAR +STARTCHAR 5C5B +ENCODING 23643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8100 +FF00 +9200 +FF00 +9200 +FF80 +A200 +A200 +ENDCHAR +STARTCHAR 5C60 +ENCODING 23648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +8900 +BE00 +FF80 +9A00 +FF00 +9F00 +9F00 +ENDCHAR +STARTCHAR 5C62 +ENCODING 23650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +A900 +FF00 +9E00 +BF00 +FF80 +B400 +7B00 +ENDCHAR +STARTCHAR 5C64 +ENCODING 23652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +8E00 +FF00 +FB80 +BF00 +BE00 +BE00 +BE00 +ENDCHAR +STARTCHAR 5C65 +ENCODING 23653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +A800 +DF00 +AF00 +CF00 +CF00 +A600 +3F80 +ENDCHAR +STARTCHAR 5C6C +ENCODING 23660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +88 +BF +BF +BF +FF +BF +BF +ENDCHAR +STARTCHAR 5C6F +ENCODING 23663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +0F00 +FC00 +4900 +4900 +7E00 +4800 +0880 +0F00 +ENDCHAR +STARTCHAR 5C71 +ENCODING 23665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +89 +89 +89 +89 +89 +FF +81 +ENDCHAR +STARTCHAR 5C79 +ENCODING 23673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +EF80 +F000 +FE00 +E200 +E400 +E880 +B080 +1F00 +ENDCHAR +STARTCHAR 5C90 +ENCODING 23696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +DF80 +E400 +EF00 +E900 +E600 +E600 +8F00 +1080 +ENDCHAR +STARTCHAR 5C91 +ENCODING 23697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +8900 +3600 +7D80 +8000 +7F00 +0200 +0200 +0400 +ENDCHAR +STARTCHAR 5CA1 +ENCODING 23713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A5 +95 +FF +AD +AD +BD +A5 +83 +ENDCHAR +STARTCHAR 5CA9 +ENCODING 23721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +7F00 +0000 +FF80 +2000 +7F00 +C100 +3F00 +4100 +ENDCHAR +STARTCHAR 5CAB +ENCODING 23723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +42 +42 +EF +EB +EB +EF +EB +EB +AF +09 +ENDCHAR +STARTCHAR 5CAC +ENCODING 23724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +4F +4B +EB +EF +EB +EB +EF +EB +A2 +02 +02 +ENDCHAR +STARTCHAR 5CB1 +ENCODING 23729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4B00 +F400 +C400 +4280 +4300 +0800 +8900 +FF00 +8100 +ENDCHAR +STARTCHAR 5CB3 +ENCODING 23731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7C00 +7F00 +4400 +4400 +FF80 +0800 +4900 +7F00 +4100 +ENDCHAR +STARTCHAR 5CB5 +ENCODING 23733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +FF80 +E200 +E200 +EF00 +E900 +E900 +8F00 +0900 +ENDCHAR +STARTCHAR 5CB7 +ENCODING 23735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +E900 +EF00 +EA00 +EF00 +EA00 +EA00 +8E80 +1900 +ENDCHAR +STARTCHAR 5CB8 +ENCODING 23736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +7F00 +FF80 +8000 +BF00 +8800 +FF00 +8800 +8800 +ENDCHAR +STARTCHAR 5CBA +ENCODING 23738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +1C00 +7E00 +8180 +FF00 +1100 +1100 +1600 +ENDCHAR +STARTCHAR 5CBE +ENCODING 23742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +E380 +E400 +E400 +EF00 +E880 +E880 +AF00 +0880 +ENDCHAR +STARTCHAR 5CC0 +ENCODING 23744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +89 +7F +08 +08 +FF +89 +FF +FF +81 +ENDCHAR +STARTCHAR 5CD9 +ENCODING 23769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +E400 +DF80 +E100 +DF80 +E900 +E900 +A500 +0700 +ENDCHAR +STARTCHAR 5CE0 +ENCODING 23776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +E400 +DF80 +E000 +DF80 +E600 +E500 +A400 +0400 +ENDCHAR +STARTCHAR 5CE8 +ENCODING 23784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +5B00 +EA00 +FF80 +EA00 +EF00 +FB00 +EA00 +AB80 +1D80 +ENDCHAR +STARTCHAR 5CEF +ENCODING 23791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +B100 +DC00 +3C00 +CB80 +7F00 +7E00 +FF00 +0800 +ENDCHAR +STARTCHAR 5CF0 +ENCODING 23792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +F500 +E600 +FB80 +EF00 +EF00 +FF80 +A200 +0200 +ENDCHAR +STARTCHAR 5CF4 +ENCODING 23796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +E900 +EF00 +E900 +EF00 +EF00 +E600 +8A80 +1300 +ENDCHAR +STARTCHAR 5CF6 +ENCODING 23798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +7E00 +4200 +7E00 +7F80 +7F00 +A500 +FD00 +8700 +ENDCHAR +STARTCHAR 5CFB +ENCODING 23803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4900 +FE80 +EA80 +FF00 +EC00 +EF00 +F600 +8600 +1980 +ENDCHAR +STARTCHAR 5CFD +ENCODING 23805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E400 +ED00 +ED00 +FE80 +E600 +EA00 +9900 +1080 +ENDCHAR +STARTCHAR 5D07 +ENCODING 23815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +FF00 +FF00 +8100 +7E00 +FF00 +4A00 +C900 +9080 +ENDCHAR +STARTCHAR 5D0D +ENCODING 23821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +ED00 +ED00 +FD00 +F680 +EA00 +FD00 +9480 +0400 +ENDCHAR +STARTCHAR 5D0E +ENCODING 23822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E600 +F900 +FF80 +E100 +EF00 +EF00 +8B00 +0300 +ENDCHAR +STARTCHAR 5D11 +ENCODING 23825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +7E00 +7E00 +7E00 +4900 +7600 +4880 +F700 +ENDCHAR +STARTCHAR 5D14 +ENCODING 23828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +FF00 +4800 +7F00 +C800 +FF00 +7F00 +7F80 +4000 +ENDCHAR +STARTCHAR 5D16 +ENCODING 23830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +FF80 +BF00 +8800 +FF00 +8800 +BF00 +FF80 +ENDCHAR +STARTCHAR 5D17 +ENCODING 23831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +89 +FF +00 +FF +A5 +FF +AB +BD +A3 +83 +ENDCHAR +STARTCHAR 5D19 +ENCODING 23833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +1800 +6600 +BD80 +0000 +7F00 +7F00 +9500 +9700 +ENDCHAR +STARTCHAR 5D27 +ENCODING 23847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +4600 +F900 +4D00 +7480 +C500 +CB00 +5C80 +ENDCHAR +STARTCHAR 5D29 +ENCODING 23849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +89 +FF +81 +F7 +95 +F7 +95 +F7 +99 +BB +ENDCHAR +STARTCHAR 5D4B +ENCODING 23883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +55 +EF +F0 +F7 +F7 +F5 +F7 +17 +15 +ENDCHAR +STARTCHAR 5D4C +ENCODING 23884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +9400 +F700 +9B00 +FB00 +9600 +F500 +9880 +ENDCHAR +STARTCHAR 5D50 +ENCODING 23888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +7E00 +7D00 +7D00 +B500 +BD00 +9380 +FF80 +ENDCHAR +STARTCHAR 5D69 +ENCODING 23913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +FF80 +0000 +7E00 +7E00 +FF00 +BD00 +BD00 +A300 +ENDCHAR +STARTCHAR 5D6C +ENCODING 23916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +FF00 +7F00 +7F00 +8900 +7F00 +2D00 +6F80 +8F00 +ENDCHAR +STARTCHAR 5D6F +ENCODING 23919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +5F80 +E400 +EF00 +E400 +DF80 +EF00 +EA00 +9200 +2F80 +ENDCHAR +STARTCHAR 5D87 +ENCODING 23943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +F700 +F700 +F000 +FD00 +FE80 +FD00 +B000 +1F80 +ENDCHAR +STARTCHAR 5D8B +ENCODING 23947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +EF00 +E900 +EF00 +EF80 +EF00 +FE80 +9B00 +1B00 +ENDCHAR +STARTCHAR 5D9D +ENCODING 23965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5D00 +4600 +E900 +EF00 +FF00 +F100 +EF00 +EA00 +1F80 +ENDCHAR +STARTCHAR 5DA0 +ENCODING 23968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5E00 +FF80 +EF00 +FE80 +FF00 +F080 +F680 +B680 +1100 +ENDCHAR +STARTCHAR 5DA2 +ENCODING 23970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +FF00 +E900 +FF00 +FB80 +FF80 +EA00 +8A80 +1380 +ENDCHAR +STARTCHAR 5DAA +ENCODING 23978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +5A00 +FF00 +2400 +FF00 +7F00 +FF00 +2E00 +C980 +ENDCHAR +STARTCHAR 5DB8 +ENCODING 23992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D80 +5B00 +E900 +F680 +FF00 +F480 +FF00 +E700 +8C80 +1400 +ENDCHAR +STARTCHAR 5DBA +ENCODING 23994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +6F80 +9200 +FF00 +0F00 +FF00 +5F00 +7500 +4880 +ENDCHAR +STARTCHAR 5DBC +ENCODING 23996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5F00 +F500 +FF00 +FF00 +F700 +FF80 +E000 +AB00 +3080 +ENDCHAR +STARTCHAR 5DBD +ENCODING 23997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +A000 +5A80 +FE00 +DF80 +5A00 +DB00 +5B00 +D480 +ENDCHAR +STARTCHAR 5DCD +ENCODING 24013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +2400 +CF00 +FF00 +DB00 +4F00 +F700 +6600 +9B80 +ENDCHAR +STARTCHAR 5DD2 +ENCODING 24018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5900 +DB00 +8200 +FF80 +BB00 +BA80 +9D80 +8900 +8900 +7F00 +ENDCHAR +STARTCHAR 5DD6 +ENCODING 24022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +7F00 +5900 +2600 +FF80 +A400 +F780 +D300 +F200 +F580 +ENDCHAR +STARTCHAR 5DDD +ENCODING 24029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +49 +49 +49 +49 +49 +49 +49 +49 +89 +81 +ENDCHAR +STARTCHAR 5DDE +ENCODING 24030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +29 +29 +2B +BB +BB +BB +49 +49 +49 +81 +ENDCHAR +STARTCHAR 5DE1 +ENCODING 24033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9500 +5500 +9500 +6A00 +1500 +D500 +5500 +4000 +BF80 +ENDCHAR +STARTCHAR 5DE2 +ENCODING 24034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4A +52 +29 +7F +7F +7F +FF +18 +6E +89 +ENDCHAR +STARTCHAR 5DE5 +ENCODING 24037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +08 +08 +08 +08 +08 +08 +FF +ENDCHAR +STARTCHAR 5DE6 +ENCODING 24038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1000 +FF80 +2000 +2000 +3F00 +4800 +8800 +8800 +7F00 +ENDCHAR +STARTCHAR 5DE7 +ENCODING 24039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F80 +E800 +4800 +4F00 +4900 +6100 +C100 +0100 +0700 +ENDCHAR +STARTCHAR 5DE8 +ENCODING 24040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +80 +80 +FE +82 +FE +80 +80 +FF +ENDCHAR +STARTCHAR 5DEB +ENCODING 24043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4A00 +4A00 +4A00 +4A00 +AE00 +AD00 +0900 +FF80 +ENDCHAR +STARTCHAR 5DEE +ENCODING 24046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7E00 +0800 +FF80 +3F00 +4800 +8800 +FF00 +ENDCHAR +STARTCHAR 5DF1 +ENCODING 24049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +0100 +0100 +7E00 +8100 +8000 +8080 +8100 +7F00 +ENDCHAR +STARTCHAR 5DF2 +ENCODING 24050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0100 +8100 +7F00 +8000 +8000 +8000 +8080 +7F00 +ENDCHAR +STARTCHAR 5DF3 +ENCODING 24051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FC +82 +82 +FC +80 +80 +80 +82 +FE +ENDCHAR +STARTCHAR 5DF4 +ENCODING 24052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8900 +8900 +8900 +FF00 +8000 +8000 +8080 +FF00 +ENDCHAR +STARTCHAR 5DF7 +ENCODING 24055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +2400 +FF80 +2200 +7F00 +A280 +3C00 +2100 +3F00 +ENDCHAR +STARTCHAR 5DFD +ENCODING 24061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +24 +FF +FF +26 +C1 +ENDCHAR +STARTCHAR 5DFE +ENCODING 24062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +10 +10 +FE +92 +92 +92 +92 +96 +10 +10 +ENDCHAR +STARTCHAR 5E02 +ENCODING 24066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +08 +7F +49 +49 +49 +4B +08 +ENDCHAR +STARTCHAR 5E03 +ENCODING 24067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF80 +2000 +4800 +7F00 +C900 +C900 +4900 +4B00 +0800 +ENDCHAR +STARTCHAR 5E06 +ENCODING 24070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +4900 +E900 +DD00 +DD00 +DA00 +E900 +C900 +5180 +5180 +ENDCHAR +STARTCHAR 5E0C +ENCODING 24076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +3C00 +F600 +1100 +FF80 +3F00 +C900 +C900 +4B00 +0800 +ENDCHAR +STARTCHAR 5E11 +ENCODING 24081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +9100 +6600 +5700 +8980 +7F00 +8900 +8B00 +0800 +ENDCHAR +STARTCHAR 5E16 +ENCODING 24086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +E380 +D200 +D200 +DF00 +D900 +E900 +4F00 +4900 +ENDCHAR +STARTCHAR 5E19 +ENCODING 24089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4C00 +EF00 +F400 +E400 +DF80 +E400 +C600 +4900 +5080 +ENDCHAR +STARTCHAR 5E1B +ENCODING 24091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +7E +42 +7E +7E +08 +FF +89 +89 +8B +ENDCHAR +STARTCHAR 5E1D +ENCODING 24093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +FF +89 +FF +49 +49 +4A +08 +ENDCHAR +STARTCHAR 5E25 +ENCODING 24101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +42 +E2 +AF +AB +EB +8B +EB +9B +EB +92 +ENDCHAR +STARTCHAR 5E2B +ENCODING 24107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF80 +A400 +AF00 +ED00 +8D00 +ED00 +AD00 +ED00 +A400 +ENDCHAR +STARTCHAR 5E2D +ENCODING 24109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9200 +FF00 +9200 +9E00 +BF00 +A900 +A900 +AB00 +ENDCHAR +STARTCHAR 5E33 +ENCODING 24115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4800 +EF00 +DF00 +D800 +DF80 +ED00 +CB00 +4D00 +5880 +ENDCHAR +STARTCHAR 5E36 +ENCODING 24118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5A00 +FF80 +5B00 +8000 +FF00 +FE80 +4A00 +4E00 +0800 +ENDCHAR +STARTCHAR 5E38 +ENCODING 24120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +2A +FF +BF +42 +3E +7F +49 +4B +08 +ENDCHAR +STARTCHAR 5E3D +ENCODING 24125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +51 +EF +EF +EF +E9 +EF +CF +4F +49 +ENDCHAR +STARTCHAR 5E3F +ENCODING 24127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +FF80 +F400 +F700 +FA00 +FF80 +D200 +5500 +5880 +ENDCHAR +STARTCHAR 5E40 +ENCODING 24128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +E400 +EF00 +EF00 +F100 +EF00 +CF00 +4B00 +5080 +ENDCHAR +STARTCHAR 5E44 +ENCODING 24132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5080 +EF00 +F000 +EF80 +F500 +FE00 +5F00 +5200 +5F80 +ENDCHAR +STARTCHAR 5E45 +ENCODING 24133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4000 +EF00 +EF00 +E000 +EF00 +F480 +EF00 +4F00 +5080 +ENDCHAR +STARTCHAR 5E47 +ENCODING 24135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +F100 +FF80 +F500 +5100 +E300 +7F00 +4900 +4900 +4B00 +ENDCHAR +STARTCHAR 5E4C +ENCODING 24140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +EF00 +EF00 +ED00 +ED00 +FF80 +C600 +4A80 +5380 +ENDCHAR +STARTCHAR 5E55 +ENCODING 24149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7E00 +7E00 +7E00 +FF80 +6A00 +FF80 +4A00 +4A00 +ENDCHAR +STARTCHAR 5E5F +ENCODING 24159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F00 +F600 +FF80 +E200 +FF00 +FF00 +DD00 +5680 +4580 +ENDCHAR +STARTCHAR 5E61 +ENCODING 24161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +ED00 +FF80 +E500 +FF80 +F500 +CF00 +4F00 +5100 +ENDCHAR +STARTCHAR 5E62 +ENCODING 24162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF80 +E000 +FF00 +FF00 +FF00 +DF00 +4400 +5F80 +ENDCHAR +STARTCHAR 5E63 +ENCODING 24163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +AF80 +FD00 +F500 +B300 +B580 +0800 +7F00 +8900 +8B00 +ENDCHAR +STARTCHAR 5E72 +ENCODING 24178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +08 +08 +08 +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 5E73 +ENCODING 24179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2A00 +4A00 +4900 +4800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 5E74 +ENCODING 24180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7F00 +C800 +8800 +7F00 +4800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 5E77 +ENCODING 24183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +2200 +FF00 +2200 +2200 +7F80 +C200 +4200 +C200 +8200 +ENDCHAR +STARTCHAR 5E78 +ENCODING 24184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +0800 +FF80 +2400 +FF00 +0800 +7F00 +0800 +0800 +ENDCHAR +STARTCHAR 5E79 +ENCODING 24185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F600 +4500 +E980 +9F00 +F200 +EF80 +F200 +4200 +4200 +ENDCHAR +STARTCHAR 5E7B +ENCODING 24187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +5F +51 +A1 +E1 +61 +51 +51 +79 +0B +ENDCHAR +STARTCHAR 5E7C +ENCODING 24188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +44 +4F +A5 +E5 +45 +45 +79 +C9 +13 +ENDCHAR +STARTCHAR 5E7D +ENCODING 24189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +28 +AD +D5 +EF +AB +CD +F7 +89 +FF +ENDCHAR +STARTCHAR 5E7E +ENCODING 24190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +AD00 +4E00 +7A00 +8F00 +FF80 +4A00 +6600 +8C80 +B300 +ENDCHAR +STARTCHAR 5E84 +ENCODING 24196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +8800 +8800 +BF00 +8800 +8800 +8800 +FF00 +ENDCHAR +STARTCHAR 5E87 +ENCODING 24199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +A400 +A400 +A500 +BE00 +A400 +A400 +BC80 +6700 +ENDCHAR +STARTCHAR 5E8A +ENCODING 24202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +8800 +BF00 +8C00 +9C00 +AB00 +C900 +8800 +ENDCHAR +STARTCHAR 5E8F +ENCODING 24207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8000 +BE00 +8C00 +FF00 +8900 +8A00 +8800 +9800 +ENDCHAR +STARTCHAR 5E95 +ENCODING 24213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8200 +BC00 +A400 +BF00 +A400 +BA00 +E380 +BC00 +ENDCHAR +STARTCHAR 5E97 +ENCODING 24215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +8F00 +8800 +8800 +BF00 +A100 +BF00 +A100 +ENDCHAR +STARTCHAR 5E9A +ENCODING 24218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +BF00 +FF80 +8900 +BF00 +9400 +B200 +C100 +ENDCHAR +STARTCHAR 5E9C +ENCODING 24220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9100 +A100 +AF80 +E900 +E900 +A500 +A100 +A600 +ENDCHAR +STARTCHAR 5EA0 +ENCODING 24224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9200 +BF00 +8800 +BF00 +8800 +BF00 +8800 +8800 +ENDCHAR +STARTCHAR 5EA6 +ENCODING 24230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9400 +FF00 +9C00 +8000 +FE00 +9400 +9C00 +E300 +ENDCHAR +STARTCHAR 5EA7 +ENCODING 24231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +AA00 +AA00 +BB00 +DD00 +BF00 +8800 +8800 +FF80 +ENDCHAR +STARTCHAR 5EAB +ENCODING 24235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +BF00 +BF00 +BF00 +BF00 +FF00 +8800 +8800 +ENDCHAR +STARTCHAR 5EAD +ENCODING 24237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +F100 +AE00 +A200 +BF80 +D200 +AF00 +B000 +DF80 +ENDCHAR +STARTCHAR 5EB5 +ENCODING 24245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +FF00 +9E00 +E980 +BE00 +AA00 +BE80 +8F00 +ENDCHAR +STARTCHAR 5EB6 +ENCODING 24246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9200 +FF00 +9200 +9E00 +8000 +B500 +B500 +D480 +ENDCHAR +STARTCHAR 5EB7 +ENCODING 24247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BF00 +FF80 +8900 +BF00 +CF00 +BB00 +C900 +1800 +ENDCHAR +STARTCHAR 5EB8 +ENCODING 24248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BF00 +FF80 +BF00 +8800 +BF00 +C900 +BF00 +4B00 +ENDCHAR +STARTCHAR 5EBE +ENCODING 24254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9800 +AB00 +BB00 +A900 +BF00 +8C00 +B200 +4100 +ENDCHAR +STARTCHAR 5EC2 +ENCODING 24258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +A700 +A500 +FD00 +B700 +B500 +E700 +E700 +A500 +ENDCHAR +STARTCHAR 5EC8 +ENCODING 24264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +A100 +BF00 +BF00 +BF00 +9E00 +FE00 +7380 +ENDCHAR +STARTCHAR 5EC9 +ENCODING 24265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BC00 +FF00 +BF00 +FF80 +9500 +BF00 +B600 +D500 +ENDCHAR +STARTCHAR 5ECA +ENCODING 24266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9780 +BD00 +BD00 +CD00 +BD00 +DC80 +D500 +EC00 +ENDCHAR +STARTCHAR 5ED0 +ENCODING 24272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +7FC0 +7B80 +6700 +7B00 +7BC0 +6900 +7100 +6740 +9CC0 +ENDCHAR +STARTCHAR 5ED3 +ENCODING 24275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FB00 +BD00 +BD00 +8500 +FD00 +BC80 +D500 +3400 +ENDCHAR +STARTCHAR 5ED6 +ENCODING 24278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +F700 +D500 +B300 +9E00 +E900 +BE00 +BC00 +3000 +ENDCHAR +STARTCHAR 5EDA +ENCODING 24282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +F900 +B900 +8780 +BD00 +BB00 +B100 +B900 +E300 +ENDCHAR +STARTCHAR 5EDB +ENCODING 24283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BF00 +A900 +9E00 +BF00 +9400 +EB00 +BF00 +FF80 +ENDCHAR +STARTCHAR 5EDF +ENCODING 24287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +A700 +FD00 +FF00 +FD00 +FF00 +FD00 +A500 +2B00 +ENDCHAR +STARTCHAR 5EE0 +ENCODING 24288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BA00 +D780 +FD00 +CB00 +D900 +D900 +FB00 +CC80 +ENDCHAR +STARTCHAR 5EE2 +ENCODING 24290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +7FC0 +5F00 +5980 +7BC0 +4D00 +5F80 +7A80 +4B00 +9E80 +ENDCHAR +STARTCHAR 5EE3 +ENCODING 24291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +9E00 +FF00 +BF00 +A900 +BF00 +B200 +C100 +ENDCHAR +STARTCHAR 5EEC +ENCODING 24300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +FF00 +CF00 +D500 +DF00 +DF00 +EB00 +FF80 +ENDCHAR +STARTCHAR 5EF3 +ENCODING 24307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +B400 +BF00 +DF00 +FF80 +F600 +FD00 +FF80 +ENDCHAR +STARTCHAR 5EF6 +ENCODING 24310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +C300 +5C00 +4400 +F700 +3400 +B400 +5F80 +6000 +BF80 +ENDCHAR +STARTCHAR 5EF7 +ENCODING 24311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +C300 +4C00 +4400 +FF00 +A400 +A400 +4F00 +E000 +BF80 +ENDCHAR +STARTCHAR 5EFA +ENCODING 24314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +7F80 +4500 +FF00 +BF00 +A400 +5F00 +4400 +BF80 +ENDCHAR +STARTCHAR 5EFB +ENCODING 24315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +5100 +5700 +FB00 +B700 +D100 +5F00 +F000 +BF80 +ENDCHAR +STARTCHAR 5F01 +ENCODING 24321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2200 +FF00 +0100 +2400 +FF80 +2400 +2400 +4400 +8400 +ENDCHAR +STARTCHAR 5F04 +ENCODING 24324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +7E00 +FF00 +2400 +FF80 +2400 +4400 +8400 +ENDCHAR +STARTCHAR 5F0A +ENCODING 24330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +AF80 +FD00 +F200 +B700 +B480 +2400 +FF80 +2400 +C400 +ENDCHAR +STARTCHAR 5F0F +ENCODING 24335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +0500 +FF00 +0400 +0400 +F400 +2400 +2200 +3A80 +E100 +ENDCHAR +STARTCHAR 5F11 +ENCODING 24337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A300 +4280 +AF80 +4200 +E200 +5E00 +6A00 +DA00 +CD80 +5900 +ENDCHAR +STARTCHAR 5F13 +ENCODING 24339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +01 +7E +40 +40 +7F +81 +01 +07 +ENDCHAR +STARTCHAR 5F14 +ENCODING 24340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +09 +7F +88 +88 +FF +89 +0B +08 +ENDCHAR +STARTCHAR 5F15 +ENCODING 24341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F1 +11 +11 +F1 +81 +F9 +89 +09 +09 +31 +ENDCHAR +STARTCHAR 5F17 +ENCODING 24343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +FF +25 +FF +A4 +A4 +FF +25 +47 +84 +ENDCHAR +STARTCHAR 5F18 +ENCODING 24344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E400 +2400 +2400 +E400 +8500 +E900 +2900 +2F00 +7C80 +ENDCHAR +STARTCHAR 5F1B +ENCODING 24347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +3400 +3500 +FF00 +B500 +9500 +F500 +3400 +3080 +CF00 +ENDCHAR +STARTCHAR 5F1F +ENCODING 24351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +24 +FF +09 +7F +88 +FF +11 +6B +88 +ENDCHAR +STARTCHAR 5F26 +ENCODING 24358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +2400 +3F80 +E400 +9900 +EA00 +2400 +2500 +4B00 +DC80 +ENDCHAR +STARTCHAR 5F27 +ENCODING 24359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0B00 +F500 +3500 +F500 +9500 +F500 +3500 +3700 +6E80 +C180 +ENDCHAR +STARTCHAR 5F29 +ENCODING 24361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F500 +9500 +6600 +DD80 +7E00 +7E00 +7F00 +8100 +0600 +ENDCHAR +STARTCHAR 5F31 +ENCODING 24369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +11 +F7 +88 +FF +57 +BB +D5 +3B +ENDCHAR +STARTCHAR 5F35 +ENCODING 24373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +2F00 +E800 +8F00 +9F80 +EC80 +2B00 +2D00 +D900 +ENDCHAR +STARTCHAR 5F3A +ENCODING 24378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +3100 +EF00 +9F00 +9500 +F500 +3F00 +2700 +DC80 +ENDCHAR +STARTCHAR 5F3C +ENCODING 24380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +DF +51 +DF +96 +96 +DF +55 +5D +D7 +ENDCHAR +STARTCHAR 5F48 +ENCODING 24392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DB00 +3B00 +C000 +9F00 +9500 +DF00 +5F80 +4400 +C400 +ENDCHAR +STARTCHAR 5F4A +ENCODING 24394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +3F00 +D500 +9F00 +9F80 +FF00 +3F00 +5F00 +FF80 +ENDCHAR +STARTCHAR 5F4C +ENCODING 24396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +5580 +DF00 +9E80 +B700 +ED00 +6E80 +5680 +E700 +ENDCHAR +STARTCHAR 5F4E +ENCODING 24398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DF00 +4200 +BB80 +B500 +0800 +3F00 +7F00 +0100 +0700 +ENDCHAR +STARTCHAR 5F56 +ENCODING 24406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3E00 +3C00 +0400 +FF80 +3500 +F600 +FA00 +6B00 +9900 +ENDCHAR +STARTCHAR 5F57 +ENCODING 24407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF80 +F700 +7F80 +C200 +7E00 +0100 +FF80 +7E00 +0100 +ENDCHAR +STARTCHAR 5F59 +ENCODING 24409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +3E +04 +FF +FF +7E +7E +FF +2E +C9 +ENDCHAR +STARTCHAR 5F5B +ENCODING 24411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF80 +7E00 +E700 +FF00 +FF00 +2400 +FF80 +C400 +ENDCHAR +STARTCHAR 5F62 +ENCODING 24418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5200 +5400 +5100 +F900 +5680 +5500 +5200 +9400 +9800 +ENDCHAR +STARTCHAR 5F66 +ENCODING 24422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +2400 +FF80 +8600 +BA00 +8E00 +B100 +8E00 +B800 +ENDCHAR +STARTCHAR 5F67 +ENCODING 24423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0900 +FF00 +E600 +9500 +9E00 +E500 +3E00 +CE80 +1100 +ENDCHAR +STARTCHAR 5F69 +ENCODING 24425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2A00 +AC00 +9080 +2100 +FA00 +6480 +B100 +AE00 +2400 +ENDCHAR +STARTCHAR 5F6A +ENCODING 24426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +3B00 +FA00 +F080 +A300 +BC80 +B100 +B200 +D480 +DF00 +ENDCHAR +STARTCHAR 5F6B +ENCODING 24427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +AB00 +FC00 +F900 +8B00 +FA80 +F900 +DA00 +9C00 +ENDCHAR +STARTCHAR 5F6C +ENCODING 24428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4900 +FE00 +5C80 +D900 +EA00 +4C80 +4900 +4A00 +4C00 +ENDCHAR +STARTCHAR 5F6D +ENCODING 24429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +F200 +F400 +0080 +F100 +F600 +0480 +A100 +7600 +C800 +ENDCHAR +STARTCHAR 5F70 +ENCODING 24432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +FA00 +FC00 +0100 +F100 +F280 +F500 +FA00 +2600 +2800 +ENDCHAR +STARTCHAR 5F71 +ENCODING 24433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F100 +F200 +F400 +F900 +0200 +F480 +F100 +B600 +EC00 +ENDCHAR +STARTCHAR 5F77 +ENCODING 24439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +C400 +BF80 +4800 +4F00 +C900 +C900 +5100 +5100 +6700 +ENDCHAR +STARTCHAR 5F79 +ENCODING 24441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +D200 +D280 +5300 +8000 +BF00 +5A00 +4400 +5A00 +6180 +ENDCHAR +STARTCHAR 5F7C +ENCODING 24444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F80 +D480 +5400 +9F00 +9900 +6600 +6600 +6B00 +7080 +ENDCHAR +STARTCHAR 5F7F +ENCODING 24447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4C +BF +CD +7F +AC +BF +8D +95 +B5 +A4 +ENDCHAR +STARTCHAR 5F80 +ENCODING 24448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +C400 +9F00 +2400 +4400 +DF00 +C400 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 5F81 +ENCODING 24449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +DF00 +A400 +5400 +5300 +D400 +D400 +5400 +5400 +7F80 +ENDCHAR +STARTCHAR 5F85 +ENCODING 24453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF00 +A400 +5F80 +4200 +FF80 +CA00 +4A00 +4200 +4600 +ENDCHAR +STARTCHAR 5F87 +ENCODING 24455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +90 +DF +7D +B5 +9D +95 +5D +41 +47 +ENDCHAR +STARTCHAR 5F8A +ENCODING 24458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +91 +B1 +5F +5B +9B +9F +51 +5F +51 +ENDCHAR +STARTCHAR 5F8B +ENCODING 24459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F00 +C500 +7F80 +9F00 +8400 +7F00 +7F80 +4400 +4400 +ENDCHAR +STARTCHAR 5F8C +ENCODING 24460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +4A +BC +CA +7F +9E +B2 +AC +8E +B1 +ENDCHAR +STARTCHAR 5F90 +ENCODING 24464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +CA00 +D100 +5E80 +4400 +BF80 +9500 +5500 +6480 +4C00 +ENDCHAR +STARTCHAR 5F91 +ENCODING 24465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +CD00 +B600 +5A00 +5500 +CD00 +DF00 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 5F92 +ENCODING 24466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF00 +A400 +4400 +7F80 +D400 +5700 +5400 +6C00 +6780 +ENDCHAR +STARTCHAR 5F97 +ENCODING 24471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +5100 +BF00 +5F00 +4000 +DF00 +FF80 +5200 +4A00 +4600 +ENDCHAR +STARTCHAR 5F98 +ENCODING 24472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +CA00 +BB80 +4A00 +7B80 +CA00 +FB80 +4A00 +5200 +5200 +ENDCHAR +STARTCHAR 5F99 +ENCODING 24473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +D400 +B700 +5400 +7F80 +D400 +D700 +5400 +5C00 +6780 +ENDCHAR +STARTCHAR 5F9E +ENCODING 24478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +9200 +BB00 +5480 +4400 +D400 +D700 +5400 +6C00 +6780 +ENDCHAR +STARTCHAR 5FA0 +ENCODING 24480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +9500 +5500 +5500 +AE80 +8E00 +5500 +6480 +4400 +ENDCHAR +STARTCHAR 5FA1 +ENCODING 24481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +50 +BF +B3 +53 +7F +AB +B3 +B3 +BF +82 +ENDCHAR +STARTCHAR 5FA8 +ENCODING 24488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF00 +B100 +5F00 +5F00 +C000 +DF80 +5F00 +4400 +7F80 +ENDCHAR +STARTCHAR 5FA9 +ENCODING 24489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +DF80 +9F00 +7100 +5F00 +9F00 +9F00 +6A00 +4E00 +7180 +ENDCHAR +STARTCHAR 5FAA +ENCODING 24490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +DE00 +9F80 +5400 +5F00 +D900 +DF00 +6F00 +6F00 +6900 +ENDCHAR +STARTCHAR 5FAE +ENCODING 24494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +BA00 +BB80 +4500 +7D00 +BB00 +AA00 +AE00 +BF00 +C480 +ENDCHAR +STARTCHAR 5FB5 +ENCODING 24501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +BA00 +FB80 +4500 +BF00 +BF00 +9300 +BB00 +BF00 +8480 +ENDCHAR +STARTCHAR 5FB7 +ENCODING 24503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +9F00 +6B00 +5F00 +8000 +BF80 +B500 +B280 +AE00 +ENDCHAR +STARTCHAR 5FB9 +ENCODING 24505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +BE00 +DB80 +5B00 +8700 +BF00 +BB00 +B900 +AB00 +AC80 +ENDCHAR +STARTCHAR 5FBD +ENCODING 24509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +B600 +BB80 +7D00 +AF00 +9B00 +9D00 +BB00 +B700 +5480 +ENDCHAR +STARTCHAR 5FC3 +ENCODING 24515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1000 +0800 +2000 +2200 +6100 +A100 +A080 +2200 +3E00 +ENDCHAR +STARTCHAR 5FC5 +ENCODING 24517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1200 +0A00 +2200 +A500 +A900 +A900 +B280 +6200 +BE00 +ENDCHAR +STARTCHAR 5FCC +ENCODING 24524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +0200 +7E00 +8100 +7F00 +0800 +A900 +A300 +BE80 +ENDCHAR +STARTCHAR 5FCD +ENCODING 24525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4900 +5100 +3100 +D600 +2900 +A900 +A280 +BE00 +ENDCHAR +STARTCHAR 5FD6 +ENCODING 24534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4100 +FF80 +E100 +C900 +4900 +4900 +4100 +4100 +4600 +ENDCHAR +STARTCHAR 5FD7 +ENCODING 24535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +08 +FF +08 +FF +28 +69 +A3 +BC +ENDCHAR +STARTCHAR 5FD8 +ENCODING 24536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +4000 +4000 +7F00 +0000 +6900 +A500 +A280 +BC00 +ENDCHAR +STARTCHAR 5FD9 +ENCODING 24537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +F000 +D000 +5000 +5000 +5000 +5000 +4F80 +ENDCHAR +STARTCHAR 5FE0 +ENCODING 24544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8900 +8900 +FF00 +0800 +0900 +A500 +A280 +BC00 +ENDCHAR +STARTCHAR 5FEB +ENCODING 24555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +E500 +C500 +7F80 +4C00 +4A00 +5100 +6080 +ENDCHAR +STARTCHAR 5FF5 +ENCODING 24565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +7F00 +8180 +7E00 +0200 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 5FFD +ENCODING 24573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7F00 +D500 +A900 +5900 +B600 +0800 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 5FFF +ENCODING 24575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +FF00 +9300 +2200 +C400 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 600F +ENCODING 24591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +F500 +D500 +FF80 +C400 +CA00 +5100 +6080 +ENDCHAR +STARTCHAR 6012 +ENCODING 24594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +9500 +6200 +5500 +8880 +3000 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6016 +ENCODING 24598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +7F80 +C800 +F400 +FF00 +7500 +5500 +5500 +5500 +4400 +ENDCHAR +STARTCHAR 601C +ENCODING 24604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +F100 +EE80 +C000 +5F00 +4900 +4900 +4B00 +4800 +ENDCHAR +STARTCHAR 601D +ENCODING 24605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +7F00 +4900 +7F00 +2900 +6500 +A280 +BC00 +ENDCHAR +STARTCHAR 6020 +ENCODING 24608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +2200 +FF00 +0000 +7E00 +7E00 +4100 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6021 +ENCODING 24609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4800 +E900 +FF00 +C080 +4000 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 6025 +ENCODING 24613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3C00 +4800 +FE00 +FF80 +7E00 +0000 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6027 +ENCODING 24615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5400 +FF00 +F400 +D400 +4400 +5F00 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 6028 +ENCODING 24616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7700 +5900 +D900 +EB80 +4700 +A800 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 602A +ENCODING 24618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +EA00 +E600 +F980 +4400 +5F00 +4400 +4400 +7F80 +ENDCHAR +STARTCHAR 602F +ENCODING 24623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +E400 +C400 +7F80 +4A00 +4900 +5700 +7880 +ENDCHAR +STARTCHAR 6041 +ENCODING 24641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +5C00 +4400 +FF80 +C400 +5F00 +1000 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 6042 +ENCODING 24642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +50 +FF +FD +F3 +5D +53 +5D +41 +43 +ENDCHAR +STARTCHAR 6043 +ENCODING 24643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +C400 +FF80 +C100 +5F80 +4900 +4900 +4100 +4600 +ENDCHAR +STARTCHAR 604D +ENCODING 24653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5500 +D500 +F500 +DF80 +4A00 +4A00 +4A00 +5280 +6380 +ENDCHAR +STARTCHAR 6050 +ENCODING 24656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +4A00 +4A00 +7680 +D300 +1000 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6052 +ENCODING 24658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +E000 +FF00 +D100 +5F00 +5F00 +5100 +4000 +5F80 +ENDCHAR +STARTCHAR 6055 +ENCODING 24661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +F700 +5900 +A900 +7700 +8900 +3100 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 6059 +ENCODING 24665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7F00 +0800 +FF00 +2800 +6900 +A280 +BC00 +ENDCHAR +STARTCHAR 605D +ENCODING 24669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +5500 +F500 +CD00 +4B00 +B100 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 6062 +ENCODING 24674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +7F80 +D000 +F200 +DB00 +5B00 +5600 +6600 +6900 +5080 +ENDCHAR +STARTCHAR 6063 +ENCODING 24675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +DF00 +2900 +4C00 +9200 +6180 +2900 +A500 +A300 +BC80 +ENDCHAR +STARTCHAR 6064 +ENCODING 24676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4800 +DF00 +FB00 +DB00 +5B00 +5B00 +5B00 +5B00 +7F80 +ENDCHAR +STARTCHAR 6065 +ENCODING 24677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A200 +A500 +E400 +AD00 +EC80 +AC80 +F400 +A480 +2700 +ENDCHAR +STARTCHAR 6068 +ENCODING 24680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +F100 +DF00 +5500 +5700 +5200 +5D00 +7080 +ENDCHAR +STARTCHAR 6069 +ENCODING 24681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +7D00 +6700 +7F00 +0800 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 606A +ENCODING 24682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +D100 +EA00 +CE00 +7180 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 606C +ENCODING 24684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +C400 +FF80 +C400 +4400 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 606D +ENCODING 24685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +FF00 +2400 +FF80 +3400 +5300 +DA80 +5600 +B500 +ENDCHAR +STARTCHAR 606F +ENCODING 24687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +7E00 +7E00 +1800 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 6070 +ENCODING 24688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +F100 +D080 +CE00 +4000 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 6085 +ENCODING 24709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +4900 +F100 +EF80 +D100 +5100 +4F00 +4A00 +4A80 +5300 +ENDCHAR +STARTCHAR 6089 +ENCODING 24713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +7A00 +FF80 +1800 +6E00 +8980 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 608C +ENCODING 24716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +4A00 +BF00 +A500 +9F00 +7F00 +4C80 +5500 +6700 +4400 +ENDCHAR +STARTCHAR 608D +ENCODING 24717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +FF00 +C000 +5F00 +4400 +7F80 +4400 +4400 +ENDCHAR +STARTCHAR 6094 +ENCODING 24724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F80 +D000 +EF00 +D500 +7F80 +5500 +5F00 +4100 +4600 +ENDCHAR +STARTCHAR 6096 +ENCODING 24726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF80 +F080 +DF00 +4200 +4400 +5F80 +4400 +4C00 +ENDCHAR +STARTCHAR 609A +ENCODING 24730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +C400 +FF00 +D500 +5F00 +4E00 +5500 +6480 +4400 +ENDCHAR +STARTCHAR 609B +ENCODING 24731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4900 +FF00 +EA80 +DB00 +4800 +5F00 +5A00 +4E00 +7180 +ENDCHAR +STARTCHAR 609F +ENCODING 24735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4800 +FE00 +E900 +FF80 +4000 +5F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 60A0 +ENCODING 24736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F80 +6900 +B600 +A200 +6500 +5880 +6900 +AB00 +BC80 +ENDCHAR +STARTCHAR 60A3 +ENCODING 24739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +7E00 +0800 +FF00 +FF00 +0800 +B100 +AB00 +BC80 +ENDCHAR +STARTCHAR 60A4 +ENCODING 24740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7F00 +5D00 +7500 +4D00 +7F00 +0000 +6900 +AB00 +BC80 +ENDCHAR +STARTCHAR 60A7 +ENCODING 24743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4D +7B +CB +DF +DB +5B +6F +6B +49 +4B +ENDCHAR +STARTCHAR 60B0 +ENCODING 24752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +D080 +EF00 +C000 +5F80 +5500 +5500 +6480 +4C00 +ENDCHAR +STARTCHAR 60B2 +ENCODING 24754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +F700 +1400 +F700 +E780 +4400 +3100 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 60B3 +ENCODING 24755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BE00 +BE00 +BE00 +BE00 +FF00 +3100 +AB00 +BC80 +ENDCHAR +STARTCHAR 60B4 +ENCODING 24756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +EA00 +DB00 +6480 +5F80 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 60B6 +ENCODING 24758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +99 +A3 +D7 +DD +83 +ENDCHAR +STARTCHAR 60B8 +ENCODING 24760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5E00 +DF00 +EC00 +D700 +7E80 +7F80 +4400 +4400 +4C00 +ENDCHAR +STARTCHAR 60BC +ENCODING 24764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +C400 +FF00 +DF00 +5100 +5F00 +7F80 +4400 +4400 +ENDCHAR +STARTCHAR 60BD +ENCODING 24765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +DF00 +E500 +FF80 +5F00 +7F80 +5200 +4E00 +7900 +ENDCHAR +STARTCHAR 60C5 +ENCODING 24773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF00 +FF80 +C000 +5F00 +5500 +5F00 +5100 +5300 +ENDCHAR +STARTCHAR 60C7 +ENCODING 24775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +4000 +DF00 +FF00 +C000 +5F00 +4600 +7F80 +4400 +4C00 +ENDCHAR +STARTCHAR 60D1 +ENCODING 24785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +FF00 +0500 +F600 +F600 +1E80 +EB00 +B100 +AB00 +BC80 +ENDCHAR +STARTCHAR 60DA +ENCODING 24794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F00 +DB00 +EB00 +D500 +4B00 +4400 +6B00 +6980 +4E00 +ENDCHAR +STARTCHAR 60DC +ENCODING 24796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F00 +EA00 +DF80 +C000 +5F00 +5100 +5F00 +5F00 +5100 +ENDCHAR +STARTCHAR 60DF +ENCODING 24799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +FF80 +F200 +DF00 +5200 +4F00 +5200 +4F80 +5000 +ENDCHAR +STARTCHAR 60E0 +ENCODING 24800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +7F00 +4900 +7F00 +FF00 +2800 +AB00 +BC80 +ENDCHAR +STARTCHAR 60E1 +ENCODING 24801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1400 +7700 +7700 +FF80 +0800 +A500 +A300 +BC80 +ENDCHAR +STARTCHAR 60F0 +ENCODING 24816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F80 +EF00 +FF80 +E000 +4F00 +4F00 +5100 +4F00 +5300 +ENDCHAR +STARTCHAR 60F1 +ENCODING 24817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4B +55 +F5 +EB +C4 +5F +5B +55 +5F +51 +ENDCHAR +STARTCHAR 60F3 +ENCODING 24819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F900 +6F00 +A900 +DF00 +4F00 +1000 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 60F6 +ENCODING 24822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F100 +FF00 +DF00 +4000 +5F80 +5F00 +4400 +7F80 +ENDCHAR +STARTCHAR 60F9 +ENCODING 24825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +FF00 +3E00 +4100 +BE00 +7100 +AB00 +BC80 +ENDCHAR +STARTCHAR 60FA +ENCODING 24826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +FF00 +D400 +5F00 +5400 +4F00 +4400 +5F80 +ENDCHAR +STARTCHAR 60FB +ENCODING 24827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +59 +67 +DB +E7 +E7 +5B +5B +41 +59 +67 +ENDCHAR +STARTCHAR 6101 +ENCODING 24833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3200 +EA80 +FB00 +6E00 +D500 +C880 +1000 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6106 +ENCODING 24838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +8000 +3780 +C900 +D100 +5200 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6108 +ENCODING 24840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7800 +3E00 +C180 +F500 +B600 +B500 +8C00 +6B00 +BC80 +ENDCHAR +STARTCHAR 6109 +ENCODING 24841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5C00 +4A00 +DF00 +E080 +DB00 +5B00 +5500 +5B00 +5700 +5980 +ENDCHAR +STARTCHAR 610D +ENCODING 24845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +9780 +F500 +AD00 +FA00 +E500 +9880 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 610E +ENCODING 24846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F80 +DF00 +F100 +DF00 +5F00 +5F00 +6A00 +4E00 +7180 +ENDCHAR +STARTCHAR 610F +ENCODING 24847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF80 +0000 +7E00 +7E00 +7E00 +B900 +AB00 +BC80 +ENDCHAR +STARTCHAR 6115 +ENCODING 24853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +DB00 +E000 +DF00 +7F80 +4800 +4F00 +5100 +4700 +ENDCHAR +STARTCHAR 611A +ENCODING 24858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0800 +FF00 +FF00 +B300 +AB00 +BC80 +ENDCHAR +STARTCHAR 611B +ENCODING 24859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0F00 +F200 +DF00 +EA80 +9D00 +7800 +9C00 +3C00 +C380 +ENDCHAR +STARTCHAR 611F +ENCODING 24863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0700 +FF00 +BD00 +8600 +BA00 +BA00 +8500 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 6127 +ENCODING 24871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F00 +D500 +FF00 +D500 +5F00 +4F00 +4F00 +5480 +6700 +ENDCHAR +STARTCHAR 6130 +ENCODING 24880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +FF00 +D500 +4D00 +5F80 +4A00 +4A80 +7380 +ENDCHAR +STARTCHAR 6134 +ENCODING 24884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5B00 +DF80 +FF00 +D100 +5F00 +5F00 +5F00 +6900 +6F00 +ENDCHAR +STARTCHAR 6137 +ENCODING 24887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +5500 +FF00 +FF80 +C000 +5F00 +5F00 +4A00 +4A00 +7F80 +ENDCHAR +STARTCHAR 613C +ENCODING 24892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5300 +5C80 +DF00 +FF00 +DF00 +5F00 +5F00 +5F80 +4A00 +7180 +ENDCHAR +STARTCHAR 613E +ENCODING 24894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F00 +BF00 +A000 +9F00 +5D00 +7F00 +5D00 +5B80 +6980 +ENDCHAR +STARTCHAR 613F +ENCODING 24895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +BF00 +BF00 +A100 +BF00 +C900 +6900 +AB00 +BC80 +ENDCHAR +STARTCHAR 6142 +ENCODING 24898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +0A00 +BF00 +7F00 +BF00 +A500 +0800 +AB00 +BC80 +ENDCHAR +STARTCHAR 6144 +ENCODING 24900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +DF00 +FB00 +DF00 +4400 +5F80 +4E00 +7580 +4400 +ENDCHAR +STARTCHAR 6147 +ENCODING 24903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +F680 +F980 +FF00 +F500 +BF00 +8800 +6B00 +BC80 +ENDCHAR +STARTCHAR 6148 +ENCODING 24904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4400 +EE00 +7600 +7500 +CE80 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 614A +ENCODING 24906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5E00 +BF00 +BF00 +8B00 +7F80 +5F00 +5B00 +6A80 +4A00 +ENDCHAR +STARTCHAR 614B +ENCODING 24907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +F680 +0700 +F000 +9900 +F680 +B700 +3000 +AB00 +BC80 +ENDCHAR +STARTCHAR 614C +ENCODING 24908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F80 +C400 +FF80 +D080 +5F00 +5600 +5600 +5680 +6580 +ENDCHAR +STARTCHAR 6153 +ENCODING 24915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4A00 +DF00 +FF00 +C000 +5F00 +5F80 +4D00 +5500 +6C80 +ENDCHAR +STARTCHAR 6155 +ENCODING 24917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7E00 +7E00 +7E00 +FF80 +4200 +9980 +5600 +B500 +ENDCHAR +STARTCHAR 6158 +ENCODING 24920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F00 +D300 +AA00 +BF00 +5600 +6B80 +5D00 +5E00 +7000 +ENDCHAR +STARTCHAR 6159 +ENCODING 24921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +F600 +B400 +F780 +F500 +F500 +3800 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 615D +ENCODING 24925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +FF00 +B000 +DE00 +FF80 +0800 +AB00 +BC80 +ENDCHAR +STARTCHAR 615F +ENCODING 24927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +8A +B2 +FF +BB +BB +B7 +BB +BB +BD +87 +ENDCHAR +STARTCHAR 6162 +ENCODING 24930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +DF00 +E000 +DF00 +5F00 +5F00 +4A00 +4E00 +7980 +ENDCHAR +STARTCHAR 6163 +ENCODING 24931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +DF80 +E000 +DF00 +5F00 +5F00 +5F00 +4A00 +7180 +ENDCHAR +STARTCHAR 6164 +ENCODING 24932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +F580 +F980 +F000 +9F00 +7200 +AD00 +9000 +AB00 +BC80 +ENDCHAR +STARTCHAR 6167 +ENCODING 24935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +FF00 +C200 +7E00 +FF80 +7E00 +1000 +AB00 +BC80 +ENDCHAR +STARTCHAR 6168 +ENCODING 24936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +7F00 +AD00 +BD00 +AD00 +7F80 +7A00 +7A00 +6680 +6900 +ENDCHAR +STARTCHAR 616B +ENCODING 24939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +9A00 +ED00 +8500 +9700 +5400 +6F80 +2800 +A300 +BC80 +ENDCHAR +STARTCHAR 616E +ENCODING 24942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0E00 +FF00 +B900 +9E00 +BF00 +BF00 +8800 +D700 +DE80 +ENDCHAR +STARTCHAR 6170 +ENCODING 24944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +FF80 +F100 +8500 +F900 +EB00 +0800 +AB00 +BC80 +ENDCHAR +STARTCHAR 6176 +ENCODING 24950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +FF00 +FF00 +A880 +DF00 +B200 +DC00 +E380 +ENDCHAR +STARTCHAR 6177 +ENCODING 24951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +DF00 +E500 +DF80 +5F00 +7300 +6D00 +7480 +6C00 +ENDCHAR +STARTCHAR 617D +ENCODING 24957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4200 +9F80 +AA00 +AE80 +7F00 +7F00 +7D00 +7B80 +5D80 +ENDCHAR +STARTCHAR 617E +ENCODING 24958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +F700 +6B00 +9300 +F600 +F500 +0900 +A900 +A280 +BC00 +ENDCHAR +STARTCHAR 6181 +ENCODING 24961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +D700 +EB00 +DF00 +5F00 +4400 +5B00 +6980 +4E00 +ENDCHAR +STARTCHAR 6182 +ENCODING 24962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +7E00 +FF00 +FF00 +5D00 +7E00 +A400 +FF80 +ENDCHAR +STARTCHAR 618A +ENCODING 24970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +7F00 +BF80 +AF00 +AF00 +AF00 +D500 +3100 +AB00 +BC80 +ENDCHAR +STARTCHAR 618E +ENCODING 24974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +5100 +BF80 +BF00 +9F00 +4000 +5F00 +5F00 +5F00 +5100 +ENDCHAR +STARTCHAR 6190 +ENCODING 24976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +4D00 +DF80 +EE00 +F580 +5D00 +5B80 +7F80 +5100 +6100 +ENDCHAR +STARTCHAR 6191 +ENCODING 24977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +BF00 +7F00 +A400 +BF00 +D500 +3000 +AB00 +BC80 +ENDCHAR +STARTCHAR 6194 +ENCODING 24980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F00 +D400 +FF00 +F700 +5C00 +5F00 +4100 +5A80 +6A80 +ENDCHAR +STARTCHAR 6198 +ENCODING 24984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +BF00 +BF00 +9100 +4E00 +7F80 +5F00 +5F00 +6100 +ENDCHAR +STARTCHAR 6199 +ENCODING 24985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +0800 +7E00 +4200 +FF80 +0000 +7E00 +7E00 +AB00 +BC80 +ENDCHAR +STARTCHAR 619A +ENCODING 24986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5680 +DB00 +FF00 +D500 +5F00 +5F00 +5F80 +4400 +4400 +ENDCHAR +STARTCHAR 61A4 +ENCODING 24996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF80 +E900 +DF00 +5F00 +5F00 +5F00 +4A00 +7180 +ENDCHAR +STARTCHAR 61A7 +ENCODING 24999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF80 +E000 +DF00 +5F00 +5F00 +5F00 +4400 +7F80 +ENDCHAR +STARTCHAR 61A9 +ENCODING 25001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3200 +E700 +F900 +F700 +9700 +F900 +0700 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 61AB +ENCODING 25003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5B +6B +DB +BB +A5 +5F +6B +65 +6B +61 +ENDCHAR +STARTCHAR 61AC +ENCODING 25004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +DF00 +FF00 +FF80 +5F00 +5100 +5F00 +5500 +6C80 +ENDCHAR +STARTCHAR 61AE +ENCODING 25006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F80 +FB00 +FB00 +DF80 +5B00 +5F80 +4000 +5B00 +6A80 +ENDCHAR +STARTCHAR 61B2 +ENCODING 25010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +7E00 +FF00 +7F00 +7F00 +1000 +AB00 +BC80 +ENDCHAR +STARTCHAR 61B6 +ENCODING 25014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +BF80 +A000 +9F00 +5F00 +5F00 +5D00 +6A80 +6E80 +ENDCHAR +STARTCHAR 61BA +ENCODING 25018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +DF80 +BB00 +9400 +5F80 +5000 +5600 +6F00 +6F00 +ENDCHAR +STARTCHAR 61BE +ENCODING 25022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5F80 +EF00 +A300 +AE00 +6E80 +6580 +6D00 +6A80 +6E00 +ENDCHAR +STARTCHAR 61C3 +ENCODING 25027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +F400 +4F00 +F500 +6500 +6500 +F700 +3800 +AB00 +BC80 +ENDCHAR +STARTCHAR 61C7 +ENCODING 25031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +E900 +7F00 +EF00 +BB00 +DF00 +6880 +A900 +A280 +BC00 +ENDCHAR +STARTCHAR 61C8 +ENCODING 25032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5B00 +EA80 +BD00 +B900 +7B80 +7500 +7F80 +6900 +6900 +ENDCHAR +STARTCHAR 61C9 +ENCODING 25033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +AF00 +F200 +EF00 +AC00 +AF00 +B500 +D300 +DE80 +ENDCHAR +STARTCHAR 61CA +ENCODING 25034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF00 +FF00 +DF00 +5F00 +4400 +7F80 +4A00 +7180 +ENDCHAR +STARTCHAR 61CB +ENCODING 25035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +FF00 +5F00 +D700 +EE80 +D600 +4200 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 61E6 +ENCODING 25062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +BF00 +BF00 +9F00 +7F80 +5F00 +6B00 +6B00 +6B00 +ENDCHAR +STARTCHAR 61F2 +ENCODING 25074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +BB80 +C500 +BF00 +BB00 +BB00 +BC80 +3000 +AB00 +BC80 +ENDCHAR +STARTCHAR 61F6 +ENCODING 25078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9700 +BA80 +D500 +B800 +BB00 +BB00 +9B00 +BB00 +B300 +9480 +ENDCHAR +STARTCHAR 61F7 +ENCODING 25079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4000 +DF00 +FF00 +C400 +5F00 +5B00 +7300 +4D00 +5880 +ENDCHAR +STARTCHAR 61F8 +ENCODING 25080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +F400 +F500 +F300 +FE80 +BB00 +B200 +6B00 +BC80 +ENDCHAR +STARTCHAR 61FA +ENCODING 25082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5600 +5700 +AE00 +BF80 +B600 +5680 +7500 +5900 +7F80 +4580 +ENDCHAR +STARTCHAR 61FC +ENCODING 25084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +DB00 +FB00 +D000 +5F80 +7F00 +7700 +5C00 +5F80 +ENDCHAR +STARTCHAR 61FF +ENCODING 25087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +FF80 +E680 +FA00 +FD00 +0880 +E200 +0F00 +AD80 +F780 +ENDCHAR +STARTCHAR 6200 +ENCODING 25088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DF00 +5A00 +E780 +DA80 +FA80 +DD00 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR 6207 +ENCODING 25095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4700 +FA00 +0F00 +FF80 +F900 +FF00 +4F00 +1D00 +AB00 +BC80 +ENDCHAR +STARTCHAR 6208 +ENCODING 25096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +12 +1F +F0 +11 +0E +0C +19 +75 +C3 +ENDCHAR +STARTCHAR 620A +ENCODING 25098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0A00 +7F80 +8900 +8A00 +8A00 +8400 +8400 +9A80 +B100 +ENDCHAR +STARTCHAR 620C +ENCODING 25100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0900 +7F80 +4400 +4600 +7600 +8400 +8C00 +9A80 +A300 +ENDCHAR +STARTCHAR 620D +ENCODING 25101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0A00 +7F00 +4800 +6A00 +BA00 +9400 +8C00 +9A80 +A300 +ENDCHAR +STARTCHAR 620E +ENCODING 25102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0A00 +FF00 +2800 +2900 +F600 +2600 +4400 +5A80 +9100 +ENDCHAR +STARTCHAR 6210 +ENCODING 25104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0900 +7F80 +4800 +7500 +5600 +9600 +B400 +8A80 +9100 +ENDCHAR +STARTCHAR 6211 +ENCODING 25105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1600 +E500 +2400 +FF00 +2500 +7600 +A400 +2A80 +7100 +ENDCHAR +STARTCHAR 6212 +ENCODING 25106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0900 +FF00 +5800 +5500 +FE00 +5600 +5400 +5A80 +B100 +ENDCHAR +STARTCHAR 6216 +ENCODING 25110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0900 +FF80 +0400 +F500 +F500 +9600 +3400 +CA80 +1100 +ENDCHAR +STARTCHAR 621A +ENCODING 25114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0500 +0400 +FF80 +9C00 +A500 +FD00 +DD00 +DA00 +DA80 +A500 +ENDCHAR +STARTCHAR 621F +ENCODING 25119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +F500 +4400 +FF80 +F500 +9500 +F200 +F200 +4E80 +4900 +ENDCHAR +STARTCHAR 6221 +ENCODING 25121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9500 +FD00 +9400 +7F80 +7500 +FD00 +DA00 +9A00 +FE80 +8900 +ENDCHAR +STARTCHAR 622A +ENCODING 25130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +F500 +2400 +FF80 +FC00 +A500 +FE00 +FA00 +FE80 +8900 +ENDCHAR +STARTCHAR 622E +ENCODING 25134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DA00 +5B00 +AA00 +FF80 +D300 +AB00 +D200 +EA00 +B580 +C900 +ENDCHAR +STARTCHAR 6230 +ENCODING 25136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FE00 +ED00 +FC00 +FF80 +AC00 +F300 +F300 +FA00 +2E80 +2900 +ENDCHAR +STARTCHAR 6231 +ENCODING 25137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +3B00 +FA00 +FF80 +B200 +B300 +FB00 +FA00 +FD80 +8900 +ENDCHAR +STARTCHAR 6234 +ENCODING 25140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +FD00 +FF80 +FC00 +FD00 +FD00 +FA00 +FA00 +5580 +8900 +ENDCHAR +STARTCHAR 6236 +ENCODING 25142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +7C +7F +41 +41 +7F +80 +80 +80 +ENDCHAR +STARTCHAR 623E +ENCODING 25150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +80 +FF +FF +8A +FF +94 +B2 +C1 +ENDCHAR +STARTCHAR 623F +ENCODING 25151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +7C00 +7F00 +8100 +7F00 +7F80 +9000 +9F00 +B100 +E700 +ENDCHAR +STARTCHAR 6240 +ENCODING 25152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1100 +E600 +F800 +9780 +9A00 +FA00 +8A00 +8A00 +9200 +ENDCHAR +STARTCHAR 6241 +ENCODING 25153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +03 +7C +7F +81 +7F +BF +B5 +BF +B5 +B5 +ENDCHAR +STARTCHAR 6247 +ENCODING 25159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +80 +7F +7F +7F +BB +DF +ED +99 +ENDCHAR +STARTCHAR 6248 +ENCODING 25160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +7C00 +7F00 +7F00 +BE00 +BE00 +BF00 +A900 +B680 +BF00 +ENDCHAR +STARTCHAR 6249 +ENCODING 25161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +8000 +7F00 +7F00 +B700 +9400 +B780 +D400 +A400 +ENDCHAR +STARTCHAR 624B +ENCODING 25163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +F800 +0800 +FF00 +0800 +FF80 +0800 +0800 +3800 +ENDCHAR +STARTCHAR 624D +ENCODING 25165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +08 +0A +0C +38 +C8 +08 +18 +ENDCHAR +STARTCHAR 6253 +ENCODING 25171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E200 +4200 +5200 +6200 +C200 +4200 +4200 +C600 +ENDCHAR +STARTCHAR 6258 +ENCODING 25176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +E400 +4400 +6780 +D800 +C400 +4400 +4480 +C700 +ENDCHAR +STARTCHAR 626E +ENCODING 25198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +4A00 +E900 +5100 +5F80 +6900 +C900 +4900 +5100 +E600 +ENDCHAR +STARTCHAR 6271 +ENCODING 25201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5E00 +EA00 +4A00 +6B00 +5500 +D600 +5600 +6D00 +F080 +ENDCHAR +STARTCHAR 6276 +ENCODING 25206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +4400 +5F80 +6400 +C600 +4A00 +5100 +D080 +ENDCHAR +STARTCHAR 6279 +ENCODING 25209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5200 +F280 +5B00 +7200 +D200 +D200 +5280 +5A80 +F300 +ENDCHAR +STARTCHAR 627C +ENCODING 25212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +F000 +5F00 +7900 +D900 +DB00 +5800 +6880 +E700 +ENDCHAR +STARTCHAR 627F +ENCODING 25215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +0400 +EA80 +3D00 +5E00 +4A00 +BD00 +8880 +1000 +ENDCHAR +STARTCHAR 6280 +ENCODING 25216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +7F00 +4900 +CA00 +4400 +4F00 +D100 +ENDCHAR +STARTCHAR 6284 +ENCODING 25220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4500 +ED00 +5480 +7480 +D500 +CD00 +4200 +4C00 +F000 +ENDCHAR +STARTCHAR 6289 +ENCODING 25225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +4500 +4500 +FF80 +CC00 +4A00 +5100 +A080 +ENDCHAR +STARTCHAR 628A +ENCODING 25226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +F500 +5500 +5F00 +F000 +D000 +5000 +5080 +DF00 +ENDCHAR +STARTCHAR 6291 +ENCODING 25233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +53 +F5 +55 +75 +D5 +DD +75 +44 +84 +ENDCHAR +STARTCHAR 6292 +ENCODING 25234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4100 +EA00 +4400 +5F80 +6500 +C500 +4400 +4400 +CC00 +ENDCHAR +STARTCHAR 6295 +ENCODING 25237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +4A00 +F280 +5300 +6000 +DF00 +CA00 +4600 +4A00 +D180 +ENDCHAR +STARTCHAR 6297 +ENCODING 25239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +C000 +4000 +5E00 +5200 +9200 +5280 +7280 +A300 +ENDCHAR +STARTCHAR 6298 +ENCODING 25240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4E00 +E800 +4800 +6F80 +EA00 +D200 +5200 +5200 +E200 +ENDCHAR +STARTCHAR 629B +ENCODING 25243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +9200 +FF00 +9B00 +9B00 +5B00 +9B00 +AF00 +A880 +AF00 +ENDCHAR +STARTCHAR 62AB +ENCODING 25259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +D480 +5400 +5F00 +5900 +AA00 +6600 +6B00 +B080 +ENDCHAR +STARTCHAR 62B1 +ENCODING 25265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F00 +F100 +5D00 +7300 +7D00 +D300 +5000 +5080 +DF00 +ENDCHAR +STARTCHAR 62B5 +ENCODING 25269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4700 +5A00 +F200 +5200 +5F00 +F200 +D200 +5E00 +7280 +DF00 +ENDCHAR +STARTCHAR 62B9 +ENCODING 25273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +5F00 +6600 +CE00 +5500 +5480 +C400 +ENDCHAR +STARTCHAR 62BC +ENCODING 25276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +5F +F5 +5F +75 +D5 +DF +44 +44 +C4 +ENDCHAR +STARTCHAR 62BD +ENCODING 25277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +FF +55 +75 +DF +D5 +55 +5F +D1 +ENDCHAR +STARTCHAR 62C2 +ENCODING 25282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4A +5F +CB +5F +6A +6A +BF +4B +53 +A2 +ENDCHAR +STARTCHAR 62C7 +ENCODING 25287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +F500 +5100 +7F80 +7900 +9500 +5F00 +6100 +8600 +ENDCHAR +STARTCHAR 62C8 +ENCODING 25288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +E780 +4400 +6400 +5F00 +D100 +5100 +5F00 +D100 +ENDCHAR +STARTCHAR 62C9 +ENCODING 25289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +4100 +7100 +4A00 +CA00 +4A00 +4200 +FF80 +ENDCHAR +STARTCHAR 62CC +ENCODING 25292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4D00 +F500 +5480 +5F00 +6400 +DF80 +4400 +4400 +C400 +ENDCHAR +STARTCHAR 62CD +ENCODING 25293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +FF +51 +51 +7F +D1 +51 +5F +D1 +ENDCHAR +STARTCHAR 62CF +ENCODING 25295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +FF00 +9600 +7500 +8880 +7E00 +FF00 +FF80 +0800 +1000 +ENDCHAR +STARTCHAR 62D0 +ENCODING 25296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +F1 +5F +44 +7F +C5 +49 +59 +D3 +ENDCHAR +STARTCHAR 62D2 +ENCODING 25298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +F000 +5F00 +7100 +D100 +DF00 +5000 +5000 +DF80 +ENDCHAR +STARTCHAR 62D3 +ENCODING 25299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +E800 +4800 +6F00 +D900 +E900 +4900 +4F00 +C900 +ENDCHAR +STARTCHAR 62D4 +ENCODING 25300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4900 +FF80 +4800 +6900 +4D00 +D200 +5600 +6D00 +C880 +ENDCHAR +STARTCHAR 62D6 +ENCODING 25302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F80 +F000 +6D00 +4F00 +FD00 +CD00 +4F00 +4880 +CF00 +ENDCHAR +STARTCHAR 62D7 +ENCODING 25303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +92 +92 +D2 +AF +AB +D3 +9D +BD +85 +8B +ENDCHAR +STARTCHAR 62D8 +ENCODING 25304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +4F +F1 +61 +5D +73 +DD +53 +41 +C7 +ENDCHAR +STARTCHAR 62D9 +ENCODING 25305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +55 +F5 +55 +7F +C4 +D5 +55 +5F +D1 +ENDCHAR +STARTCHAR 62DB +ENCODING 25307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +5F +E5 +49 +73 +C0 +DF +51 +5F +D1 +ENDCHAR +STARTCHAR 62DC +ENCODING 25308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2F00 +C200 +4F00 +E200 +4F00 +FF80 +4200 +4200 +8200 +ENDCHAR +STARTCHAR 62EC +ENCODING 25324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +E400 +5F80 +6400 +4400 +DF00 +5100 +5F00 +D100 +ENDCHAR +STARTCHAR 62ED +ENCODING 25325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4280 +FF80 +4200 +4200 +7E00 +CA00 +4A00 +4E80 +F900 +ENDCHAR +STARTCHAR 62EE +ENCODING 25326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +7F00 +4000 +DF00 +5100 +5F00 +D100 +ENDCHAR +STARTCHAR 62EF +ENCODING 25327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4200 +C400 +7D00 +6F00 +D600 +B500 +6480 +4C00 +BF00 +ENDCHAR +STARTCHAR 62F1 +ENCODING 25329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +EA00 +5F00 +6A00 +7F80 +C000 +4A00 +5100 +E080 +ENDCHAR +STARTCHAR 62F3 +ENCODING 25331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3200 +5300 +7F00 +FF80 +2200 +FF00 +FE80 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR 62F7 +ENCODING 25335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F00 +EA00 +7F80 +4500 +7E00 +EF00 +4100 +4100 +C700 +ENDCHAR +STARTCHAR 62FE +ENCODING 25342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +F100 +6080 +7F00 +4000 +DF00 +5100 +5F00 +9100 +ENDCHAR +STARTCHAR 62FF +ENCODING 25343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +7E00 +8180 +7E00 +0000 +7E00 +FF00 +FF80 +3800 +ENDCHAR +STARTCHAR 6301 +ENCODING 25345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +E400 +4400 +5F80 +FF80 +D100 +4900 +4900 +C600 +ENDCHAR +STARTCHAR 6307 +ENCODING 25351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5600 +F880 +5F00 +4000 +EF00 +D100 +4F00 +4F00 +D100 +ENDCHAR +STARTCHAR 6309 +ENCODING 25353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F480 +4800 +5F80 +E900 +DA00 +4600 +4D00 +9080 +ENDCHAR +STARTCHAR 6311 +ENCODING 25361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5A80 +FB00 +5B00 +6A00 +5B00 +EA80 +4A80 +5280 +A300 +ENDCHAR +STARTCHAR 632B +ENCODING 25387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5500 +D500 +5500 +5F00 +EE80 +9F00 +4400 +4400 +BF80 +ENDCHAR +STARTCHAR 632F +ENCODING 25391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5000 +EF00 +5000 +5F80 +EB00 +9B00 +6A00 +6F00 +B880 +ENDCHAR +STARTCHAR 633A +ENCODING 25402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +7600 +D200 +5200 +5F80 +CA00 +9200 +5700 +6800 +A780 +ENDCHAR +STARTCHAR 633B +ENCODING 25403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B100 +9600 +D200 +9600 +B700 +4E00 +B600 +9780 +B000 +AF80 +ENDCHAR +STARTCHAR 633D +ENCODING 25405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4E00 +F200 +5F00 +7500 +DF00 +C400 +4A00 +5A80 +E300 +ENDCHAR +STARTCHAR 633E +ENCODING 25406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +C400 +5500 +5500 +EE80 +8A00 +4A00 +5100 +A080 +ENDCHAR +STARTCHAR 6349 +ENCODING 25417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +F100 +5F00 +6400 +D400 +D700 +5400 +6C00 +E780 +ENDCHAR +STARTCHAR 634C +ENCODING 25420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +B9 +AB +EB +BB +93 +5B +9B +AB +A9 +BB +ENDCHAR +STARTCHAR 634F +ENCODING 25423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5100 +5F00 +6400 +DF00 +4400 +4400 +DF80 +ENDCHAR +STARTCHAR 6350 +ENCODING 25424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +51 +EF +40 +7F +5F +D1 +5F +51 +D3 +ENDCHAR +STARTCHAR 6355 +ENCODING 25429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +5F80 +E400 +5F00 +5500 +FF00 +D500 +5F00 +5500 +9700 +ENDCHAR +STARTCHAR 6367 +ENCODING 25447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +E400 +5F00 +7F00 +7500 +EE80 +5F00 +4400 +8400 +ENDCHAR +STARTCHAR 6368 +ENCODING 25448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +F100 +7F80 +4400 +7F80 +DF00 +5100 +5100 +9F00 +ENDCHAR +STARTCHAR 636E +ENCODING 25454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5080 +FF00 +5200 +7F80 +D200 +DF00 +6880 +6F00 +A880 +ENDCHAR +STARTCHAR 6372 +ENCODING 25458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5600 +5500 +EE80 +4A00 +7F00 +5F00 +F280 +5600 +5100 +8F00 +ENDCHAR +STARTCHAR 6377 +ENCODING 25463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +DF00 +4500 +7F80 +DF00 +8400 +5700 +6C00 +A780 +ENDCHAR +STARTCHAR 637A +ENCODING 25466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EA00 +5100 +5E80 +E000 +9F00 +5500 +5500 +AC80 +ENDCHAR +STARTCHAR 637B +ENCODING 25467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +4A00 +FF00 +6080 +7F00 +4100 +C600 +6B00 +6980 +AE00 +ENDCHAR +STARTCHAR 637F +ENCODING 25471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF00 +4500 +7F80 +7F00 +BF80 +5200 +4E00 +B900 +ENDCHAR +STARTCHAR 6383 +ENCODING 25475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4100 +FF80 +5F00 +5F80 +6480 +DF00 +5500 +5700 +8400 +ENDCHAR +STARTCHAR 6388 +ENCODING 25480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4500 +D500 +5F00 +6080 +5F00 +8A00 +4400 +4A00 +9180 +ENDCHAR +STARTCHAR 6389 +ENCODING 25481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +E400 +5F00 +7F00 +5100 +DF00 +7F80 +4400 +8400 +ENDCHAR +STARTCHAR 638C +ENCODING 25484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +FF00 +8100 +BF00 +0000 +7F00 +FF00 +FF80 +0800 +3800 +ENDCHAR +STARTCHAR 6392 +ENCODING 25490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +FB80 +4A00 +5B80 +6A00 +FB80 +4A00 +5200 +D200 +ENDCHAR +STARTCHAR 6396 +ENCODING 25494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EC00 +5700 +7700 +FF00 +BD00 +5200 +5500 +9880 +ENDCHAR +STARTCHAR 6398 +ENCODING 25496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +DF +54 +5D +5D +AF +75 +7F +B1 +ENDCHAR +STARTCHAR 639B +ENCODING 25499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +DE00 +7E00 +4100 +4A80 +BE00 +4A00 +4E00 +B200 +ENDCHAR +STARTCHAR 63A0 +ENCODING 25504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E000 +5F00 +7100 +DF00 +C400 +4D00 +5480 +EC00 +ENDCHAR +STARTCHAR 63A1 +ENCODING 25505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5F00 +F480 +5000 +6400 +DF00 +CE00 +5500 +6480 +C400 +ENDCHAR +STARTCHAR 63A2 +ENCODING 25506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5A80 +EA80 +5300 +6400 +5F00 +CE00 +5500 +6480 +C400 +ENDCHAR +STARTCHAR 63A5 +ENCODING 25509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +5F80 +6400 +C800 +DF80 +4A00 +4600 +D900 +ENDCHAR +STARTCHAR 63A7 +ENCODING 25511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FA80 +4A80 +4B00 +7000 +DF00 +4400 +4400 +DF80 +ENDCHAR +STARTCHAR 63A8 +ENCODING 25512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +FF80 +5200 +4F00 +F200 +CF00 +5200 +4F80 +D000 +ENDCHAR +STARTCHAR 63A9 +ENCODING 25513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +5F00 +7580 +D500 +9F00 +5F00 +4480 +8700 +ENDCHAR +STARTCHAR 63AA +ENCODING 25514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +EA00 +5F80 +6000 +4F00 +D100 +4F00 +4F00 +D100 +ENDCHAR +STARTCHAR 63C0 +ENCODING 25536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E400 +5F00 +7F00 +DF00 +4E00 +5500 +6480 +C400 +ENDCHAR +STARTCHAR 63C4 +ENCODING 25540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5C00 +4A00 +DF00 +6080 +5B00 +DB00 +AD00 +5B00 +6B00 +AA80 +ENDCHAR +STARTCHAR 63C6 +ENCODING 25542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5D00 +4A00 +FB00 +5100 +7F80 +E400 +9F00 +4400 +5A00 +B100 +ENDCHAR +STARTCHAR 63CF +ENCODING 25551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +EA00 +4A00 +5F00 +7500 +DF00 +5500 +5F00 +D100 +ENDCHAR +STARTCHAR 63D0 +ENCODING 25552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5F00 +4000 +5F80 +9400 +5700 +6C00 +A780 +ENDCHAR +STARTCHAR 63D6 +ENCODING 25558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5F80 +7100 +DF00 +DF00 +5180 +7F00 +C100 +ENDCHAR +STARTCHAR 63DA +ENCODING 25562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5F00 +5F80 +E800 +DF00 +6A80 +5500 +CB00 +ENDCHAR +STARTCHAR 63DB +ENCODING 25563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +F200 +7F00 +5B00 +D900 +BF80 +4400 +5B00 +B180 +ENDCHAR +STARTCHAR 63E1 +ENCODING 25569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5080 +FF00 +5000 +7F80 +D500 +DE00 +5F00 +6200 +FF80 +ENDCHAR +STARTCHAR 63ED +ENCODING 25581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +FF +5F +68 +DF +F5 +5B +5F +D3 +ENDCHAR +STARTCHAR 63EE +ENCODING 25582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +6480 +FF00 +5F00 +7500 +DF00 +DF00 +7F80 +4400 +C400 +ENDCHAR +STARTCHAR 63F4 +ENCODING 25588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5F00 +F480 +5F00 +4800 +DF80 +CF00 +5900 +5600 +B900 +ENDCHAR +STARTCHAR 63F6 +ENCODING 25590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +5B00 +DB00 +5B00 +5B00 +5A80 +9A80 +5B00 +6A00 +8A00 +ENDCHAR +STARTCHAR 63F7 +ENCODING 25591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5E00 +FF80 +4C00 +7700 +5F00 +D500 +5F00 +5400 +C400 +ENDCHAR +STARTCHAR 640D +ENCODING 25613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5F00 +7100 +DF00 +DF00 +5F00 +4A00 +F180 +ENDCHAR +STARTCHAR 640F +ENCODING 25615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4700 +7F80 +FF00 +5500 +5F00 +7F00 +C200 +7F80 +4A00 +8600 +ENDCHAR +STARTCHAR 6414 +ENCODING 25620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +EA00 +5600 +5D80 +7F00 +9500 +5F00 +4700 +9C80 +ENDCHAR +STARTCHAR 6416 +ENCODING 25622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +F600 +4C00 +4800 +FF00 +DF80 +4400 +5480 +9F00 +ENDCHAR +STARTCHAR 6417 +ENCODING 25623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF00 +5100 +7F00 +5F80 +9F00 +6B00 +7F00 +A300 +ENDCHAR +STARTCHAR 641C +ENCODING 25628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5F00 +FF00 +5500 +7F00 +4400 +DF00 +4A00 +4600 +D980 +ENDCHAR +STARTCHAR 6422 +ENCODING 25634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5B00 +DB00 +7080 +7F80 +C000 +9F00 +5F00 +5F00 +9100 +ENDCHAR +STARTCHAR 642C +ENCODING 25644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9300 +BD00 +FD00 +BD80 +6800 +BF00 +BB00 +BB00 +AB00 +BC80 +ENDCHAR +STARTCHAR 642D +ENCODING 25645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F80 +EE00 +4A00 +7F00 +E080 +DF00 +5100 +5F00 +9100 +ENDCHAR +STARTCHAR 643A +ENCODING 25658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +54 +5E +FF +5F +7F +C0 +DE +4B +59 +D3 +ENDCHAR +STARTCHAR 643E +ENCODING 25662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +CA00 +5B00 +6F80 +D400 +A700 +4700 +4400 +8400 +ENDCHAR +STARTCHAR 6458 +ENCODING 25688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +CA00 +5F00 +6500 +EF00 +AF00 +6F00 +6B00 +A300 +ENDCHAR +STARTCHAR 6460 +ENCODING 25696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +D700 +5B00 +5F00 +FF00 +8400 +5B00 +6980 +AE00 +ENDCHAR +STARTCHAR 6469 +ENCODING 25705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +7FC0 +7F80 +7BC0 +7380 +4100 +5F00 +7FC0 +4400 +8C00 +ENDCHAR +STARTCHAR 646F +ENCODING 25711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +FD00 +F500 +FB80 +4600 +7800 +FF80 +0800 +1000 +ENDCHAR +STARTCHAR 6478 +ENCODING 25720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +E000 +5F00 +7F00 +DF00 +8400 +7F80 +4A00 +B180 +ENDCHAR +STARTCHAR 6479 +ENCODING 25721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +2400 +7E00 +4200 +7E00 +FF80 +F980 +7E00 +FF00 +1800 +ENDCHAR +STARTCHAR 647A +ENCODING 25722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5B +49 +F5 +4B +75 +C4 +DF +51 +5F +DF +ENDCHAR +STARTCHAR 6488 +ENCODING 25736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +6E80 +DB00 +5B00 +7F80 +6480 +9F00 +4900 +4900 +B200 +ENDCHAR +STARTCHAR 6491 +ENCODING 25745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +5F00 +E080 +6E80 +4E00 +DF00 +8400 +7F80 +4400 +8C00 +ENDCHAR +STARTCHAR 6492 +ENCODING 25746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9A00 +BA00 +DB80 +BD00 +BF00 +EF00 +B900 +BB00 +AB00 +AC80 +ENDCHAR +STARTCHAR 6493 +ENCODING 25747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF80 +5200 +5B00 +F780 +BF80 +4A00 +5280 +A300 +ENDCHAR +STARTCHAR 649A +ENCODING 25754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +9B00 +D780 +AA00 +9A00 +D500 +9880 +A100 +AD00 +AA80 +ENDCHAR +STARTCHAR 649E +ENCODING 25758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF80 +4000 +5F00 +7F00 +9F00 +5F00 +4400 +BF80 +ENDCHAR +STARTCHAR 64A4 +ENCODING 25764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +BE00 +DB80 +BB00 +8300 +FB00 +BB00 +B900 +AB00 +AC80 +ENDCHAR +STARTCHAR 64A5 +ENCODING 25765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5D00 +4A00 +D100 +5F80 +6D80 +5D80 +9F00 +4D00 +4B00 +9580 +ENDCHAR +STARTCHAR 64AB +ENCODING 25771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F80 +FB00 +7B00 +7F80 +DB00 +9B00 +5F80 +5B00 +AA80 +ENDCHAR +STARTCHAR 64AD +ENCODING 25773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +ED00 +5F80 +4E00 +F580 +DF00 +5F00 +5500 +9F00 +ENDCHAR +STARTCHAR 64AE +ENCODING 25774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9F00 +9F00 +DF00 +8000 +BF80 +DF00 +AB00 +BB00 +BB00 +8A80 +ENDCHAR +STARTCHAR 64B0 +ENCODING 25776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +6B00 +DF80 +5B00 +4A00 +FF00 +8A00 +7F80 +5A00 +A180 +ENDCHAR +STARTCHAR 64B2 +ENCODING 25778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +FF80 +4A00 +5F00 +7F00 +DF80 +4400 +4B00 +F180 +ENDCHAR +STARTCHAR 64BB +ENCODING 25787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +9F00 +CF80 +A500 +8F80 +6F00 +9200 +9F80 +B200 +AF80 +ENDCHAR +STARTCHAR 64C1 +ENCODING 25793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +D500 +7F80 +6D00 +D780 +9D80 +7700 +5780 +A400 +ENDCHAR +STARTCHAR 64C4 +ENCODING 25796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +8700 +FF00 +BD00 +AF00 +7F80 +AD00 +BF00 +AD00 +D300 +ENDCHAR +STARTCHAR 64C5 +ENCODING 25797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4000 +FF00 +5B00 +5F00 +E000 +DF00 +5F00 +5F00 +BF80 +ENDCHAR +STARTCHAR 64C7 +ENCODING 25799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5A80 +DF80 +5F00 +4400 +DF80 +9F80 +5F00 +4400 +8400 +ENDCHAR +STARTCHAR 64CA +ENCODING 25802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F600 +F580 +F980 +FF00 +4600 +FD80 +7E00 +FF00 +FF80 +1800 +ENDCHAR +STARTCHAR 64CD +ENCODING 25805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +EF00 +5B00 +7B00 +C400 +DF80 +4E00 +5580 +9400 +ENDCHAR +STARTCHAR 64CE +ENCODING 25806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +FF80 +FD00 +BA00 +7D80 +0600 +7C00 +FF80 +0800 +1800 +ENDCHAR +STARTCHAR 64D2 +ENCODING 25810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +5900 +DF80 +5F00 +5B00 +5F00 +9F00 +5A80 +5E80 +9100 +ENDCHAR +STARTCHAR 64D4 +ENCODING 25812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +FF80 +5B00 +5F00 +7F80 +9000 +6600 +6F00 +AF00 +ENDCHAR +STARTCHAR 64D8 +ENCODING 25816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +9F80 +FF80 +FF00 +F200 +0200 +7C00 +FF80 +0800 +3800 +ENDCHAR +STARTCHAR 64DA +ENCODING 25818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +DF00 +5700 +5000 +DF00 +9F00 +6A00 +6F00 +B680 +ENDCHAR +STARTCHAR 64E1 +ENCODING 25825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +C000 +5F00 +4000 +9F80 +4A00 +5F00 +5F00 +BF80 +ENDCHAR +STARTCHAR 64E2 +ENCODING 25826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5500 +EB00 +5680 +4A00 +FF80 +FF00 +5300 +5C00 +9F80 +ENDCHAR +STARTCHAR 64E5 +ENCODING 25829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +AF00 +F700 +FF00 +FF00 +7E00 +0800 +FF80 +0800 +3000 +ENDCHAR +STARTCHAR 64E6 +ENCODING 25830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +BF80 +DF00 +9B00 +AA00 +DF00 +BF80 +8400 +9500 +AC80 +ENDCHAR +STARTCHAR 64E7 +ENCODING 25831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7700 +9900 +7B00 +7B00 +FF80 +6200 +FF80 +FF00 +0800 +3000 +ENDCHAR +STARTCHAR 64EC +ENCODING 25836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AF00 +B900 +FB00 +A100 +BF80 +F680 +BF80 +9600 +AE00 +A980 +ENDCHAR +STARTCHAR 64F2 +ENCODING 25842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9B80 +A680 +FF00 +BF00 +BF00 +E680 +BE80 +BF80 +9A00 +A600 +ENDCHAR +STARTCHAR 64F4 +ENCODING 25844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +BF80 +FF80 +AE00 +BF80 +EF00 +B500 +BF00 +AF00 +B980 +ENDCHAR +STARTCHAR 64FA +ENCODING 25850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +7F00 +D000 +5B00 +7B80 +FB00 +AB00 +7B00 +7A80 +AB00 +ENDCHAR +STARTCHAR 64FE +ENCODING 25854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +5F00 +DF00 +5F00 +7F00 +FF00 +9F00 +5F00 +7E00 +BF80 +ENDCHAR +STARTCHAR 6500 +ENCODING 25856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +FF00 +DB00 +EE80 +1000 +FF80 +FA00 +FF80 +0800 +1000 +ENDCHAR +STARTCHAR 6504 +ENCODING 25860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8700 +8400 +FF80 +BD00 +A700 +FD00 +AF00 +A400 +BB00 +DE80 +ENDCHAR +STARTCHAR 6518 +ENCODING 25880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +4000 +DB00 +5B00 +7F00 +DF00 +8A00 +7F80 +6E00 +9980 +ENDCHAR +STARTCHAR 651D +ENCODING 25885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF00 +9E00 +D200 +BF00 +8200 +FF80 +BF00 +BF00 +BF80 +8900 +ENDCHAR +STARTCHAR 6523 +ENCODING 25891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DF00 +4200 +FB80 +BA80 +8500 +7E00 +0800 +FF80 +3000 +ENDCHAR +STARTCHAR 652A +ENCODING 25898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5700 +5B00 +D700 +7F00 +7F00 +DF00 +9F00 +5F00 +4A80 +B380 +ENDCHAR +STARTCHAR 652B +ENCODING 25899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +D480 +5F00 +5F00 +FE00 +9F80 +7F00 +4B00 +BF80 +ENDCHAR +STARTCHAR 652C +ENCODING 25900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BA00 +BD00 +FF80 +BF80 +9F00 +9F00 +9F00 +9F00 +8A80 +B300 +ENDCHAR +STARTCHAR 652F +ENCODING 25903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +0800 +FE00 +2200 +1400 +0800 +7600 +C100 +ENDCHAR +STARTCHAR 6536 +ENCODING 25910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +A800 +AF00 +A900 +B900 +B600 +E600 +A600 +2F00 +3080 +ENDCHAR +STARTCHAR 6537 +ENCODING 25911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F400 +4F00 +8900 +F500 +2600 +2600 +2600 +2D00 +F080 +ENDCHAR +STARTCHAR 6538 +ENCODING 25912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4800 +6F00 +A900 +B900 +B600 +6600 +6600 +4D00 +5080 +ENDCHAR +STARTCHAR 6539 +ENCODING 25913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +E800 +2F80 +2900 +F900 +8600 +9600 +E600 +0900 +1080 +ENDCHAR +STARTCHAR 653B +ENCODING 25915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +F800 +4F80 +4900 +5A00 +5600 +7600 +CE00 +1900 +1080 +ENDCHAR +STARTCHAR 653E +ENCODING 25918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +F780 +4900 +7500 +5500 +9200 +9200 +9D00 +E880 +ENDCHAR +STARTCHAR 653F +ENCODING 25919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F400 +2780 +A900 +B900 +A600 +A200 +B600 +CD00 +1880 +ENDCHAR +STARTCHAR 6545 +ENCODING 25925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +F780 +4900 +4900 +F500 +9600 +9600 +FD00 +8880 +ENDCHAR +STARTCHAR 6548 +ENCODING 25928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F400 +4780 +9900 +B900 +6E00 +2600 +6600 +DD00 +9880 +ENDCHAR +STARTCHAR 654D +ENCODING 25933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +6200 +9380 +F200 +2F00 +F500 +B200 +B200 +AD00 +4880 +ENDCHAR +STARTCHAR 654E +ENCODING 25934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D400 +2400 +D780 +FD00 +4D00 +F500 +A200 +F200 +6500 +6880 +ENDCHAR +STARTCHAR 654F +ENCODING 25935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7C00 +8780 +7500 +BD00 +FD00 +D200 +FA00 +9500 +6880 +ENDCHAR +STARTCHAR 6551 +ENCODING 25937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +5400 +F780 +4900 +DD00 +6D00 +6200 +D200 +4D00 +C880 +ENDCHAR +STARTCHAR 6556 +ENCODING 25942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F400 +4780 +F500 +4D00 +FD00 +7200 +5200 +9500 +A880 +ENDCHAR +STARTCHAR 6557 +ENCODING 25943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A800 +EF80 +A900 +E900 +B600 +E600 +A600 +AD00 +9880 +ENDCHAR +STARTCHAR 655E +ENCODING 25950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B200 +B400 +AF80 +F500 +8D00 +F300 +F200 +F200 +9500 +9480 +ENDCHAR +STARTCHAR 6562 +ENCODING 25954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +4400 +F700 +9500 +FD00 +9500 +F600 +B200 +D500 +1880 +ENDCHAR +STARTCHAR 6563 +ENCODING 25955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +F400 +6780 +F500 +0D00 +FD00 +F200 +F200 +9500 +B880 +ENDCHAR +STARTCHAR 6566 +ENCODING 25958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FC00 +0400 +F780 +F500 +0D00 +FD00 +2200 +F200 +2D00 +4880 +ENDCHAR +STARTCHAR 656C +ENCODING 25964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +FC00 +5780 +4500 +FD00 +EB00 +B200 +F300 +9500 +3880 +ENDCHAR +STARTCHAR 656D +ENCODING 25965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F000 +9400 +F780 +F500 +FD00 +4300 +F200 +6A00 +B500 +7880 +ENDCHAR +STARTCHAR 6572 +ENCODING 25970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FA00 +0200 +F380 +F200 +0F00 +F500 +ED00 +EA00 +ED00 +9880 +ENDCHAR +STARTCHAR 6574 +ENCODING 25972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +F500 +FD00 +6200 +DD80 +FF00 +0800 +2E00 +FF80 +ENDCHAR +STARTCHAR 6575 +ENCODING 25973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FA00 +5780 +FD00 +AD00 +FB00 +EA00 +EA00 +DD00 +9C80 +ENDCHAR +STARTCHAR 6577 +ENCODING 25975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +FC00 +F780 +F500 +F500 +9D00 +FA00 +7200 +9500 +B880 +ENDCHAR +STARTCHAR 6578 +ENCODING 25976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FC00 +FF80 +FD00 +FD00 +FB00 +FA00 +5200 +2500 +D480 +ENDCHAR +STARTCHAR 657E +ENCODING 25982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +F400 +F780 +F500 +B500 +FD00 +0200 +F200 +F500 +9880 +ENDCHAR +STARTCHAR 6582 +ENCODING 25986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +D400 +FF80 +0500 +FD00 +EB00 +FA00 +5200 +D700 +AC80 +ENDCHAR +STARTCHAR 6583 +ENCODING 25987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B400 +AF80 +FD00 +D700 +B580 +0800 +FF80 +F700 +6880 +C700 +ENDCHAR +STARTCHAR 6585 +ENCODING 25989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FA00 +FB80 +FA00 +AA00 +FF00 +FD00 +2300 +FA00 +2500 +6880 +ENDCHAR +STARTCHAR 6587 +ENCODING 25991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +42 +24 +34 +18 +18 +66 +81 +ENDCHAR +STARTCHAR 658C +ENCODING 25996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +5F00 +E280 +DF80 +CA00 +5A00 +7600 +BA00 +9780 +B900 +ENDCHAR +STARTCHAR 6590 +ENCODING 26000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +F700 +F700 +E780 +2400 +2800 +FF80 +2400 +3C00 +C380 +ENDCHAR +STARTCHAR 6591 +ENCODING 26001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF80 +7E00 +5600 +DA00 +5F00 +4A00 +6A00 +9A00 +2780 +ENDCHAR +STARTCHAR 6597 +ENCODING 26007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0400 +3400 +0400 +6400 +0400 +1F80 +FC00 +0400 +0400 +ENDCHAR +STARTCHAR 6599 +ENCODING 26009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +DD00 +E500 +4100 +F900 +6500 +D780 +CF00 +4100 +4100 +ENDCHAR +STARTCHAR 659B +ENCODING 26011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +7500 +A300 +F900 +B500 +F500 +B380 +FF00 +9100 +B100 +ENDCHAR +STARTCHAR 659C +ENCODING 26012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6100 +6900 +9500 +F100 +2500 +F100 +B380 +BF00 +B100 +4100 +ENDCHAR +STARTCHAR 659F +ENCODING 26015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +FD00 +7300 +9500 +7500 +9180 +FB00 +D500 +F900 +8100 +ENDCHAR +STARTCHAR 65A1 +ENCODING 26017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +F600 +4900 +ED80 +E500 +9500 +E680 +F900 +4100 +4100 +ENDCHAR +STARTCHAR 65A4 +ENCODING 26020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +06 +78 +40 +7F +44 +84 +84 +84 +84 +ENDCHAR +STARTCHAR 65A5 +ENCODING 26021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +06 +7C +40 +7F +44 +54 +4E +45 +84 +84 +ENDCHAR +STARTCHAR 65A7 +ENCODING 26023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2600 +E500 +1800 +E780 +7E00 +4000 +7F00 +8800 +8800 +ENDCHAR +STARTCHAR 65AB +ENCODING 26027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +FC00 +4800 +6F80 +AA00 +AA00 +6A00 +9200 +1200 +ENDCHAR +STARTCHAR 65AC +ENCODING 26028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +F600 +4800 +F800 +F780 +D900 +F900 +F900 +4900 +5100 +ENDCHAR +STARTCHAR 65AF +ENCODING 26031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +F600 +9400 +F400 +9780 +F500 +F500 +0900 +9900 +8900 +ENDCHAR +STARTCHAR 65B0 +ENCODING 26032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +F600 +A800 +F800 +4780 +F900 +6900 +A900 +D900 +5100 +ENDCHAR +STARTCHAR 65B7 +ENCODING 26039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D100 +EE00 +DC00 +E780 +FD00 +F500 +FD00 +FD00 +8500 +ENDCHAR +STARTCHAR 65B9 +ENCODING 26041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +2000 +3E00 +2100 +2100 +4200 +C200 +8E00 +ENDCHAR +STARTCHAR 65BC +ENCODING 26044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +4600 +F700 +4900 +7680 +6200 +A000 +A400 +A600 +E100 +ENDCHAR +STARTCHAR 65BD +ENCODING 26045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +EF80 +5C00 +6F00 +7D00 +AD00 +AD00 +A880 +EF00 +ENDCHAR +STARTCHAR 65C1 +ENCODING 26049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +FF +89 +FF +20 +3E +62 +86 +ENDCHAR +STARTCHAR 65C5 +ENCODING 26053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2400 +2780 +7800 +2980 +3700 +3580 +5580 +5500 +5580 +BE40 +ENDCHAR +STARTCHAR 65CB +ENCODING 26059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F80 +F000 +9F00 +6500 +AD00 +AB00 +AC00 +B400 +F380 +ENDCHAR +STARTCHAR 65CC +ENCODING 26060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F80 +F000 +5A00 +6F00 +AA00 +AF00 +A200 +A200 +FF80 +ENDCHAR +STARTCHAR 65CF +ENCODING 26063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +F400 +5F00 +6A00 +6400 +AF80 +A600 +A900 +F080 +ENDCHAR +STARTCHAR 65D2 +ENCODING 26066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F80 +F400 +8F80 +6900 +BF80 +AD00 +AD00 +B580 +F580 +ENDCHAR +STARTCHAR 65D7 +ENCODING 26071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F80 +F900 +9F00 +6F00 +A900 +AF00 +BF80 +AB00 +F080 +ENDCHAR +STARTCHAR 65E0 +ENCODING 26080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +10 +10 +FF +18 +18 +28 +49 +8F +ENDCHAR +STARTCHAR 65E3 +ENCODING 26083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +EF00 +AA00 +EA00 +EF80 +0200 +A600 +C600 +9A80 +F300 +ENDCHAR +STARTCHAR 65E5 +ENCODING 26085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +FC +84 +84 +84 +FC +84 +84 +FC +84 +ENDCHAR +STARTCHAR 65E6 +ENCODING 26086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +4200 +7E00 +4200 +4200 +7E00 +0000 +FF80 +ENDCHAR +STARTCHAR 65E8 +ENCODING 26088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +8C +F0 +82 +FE +00 +FC +84 +FC +FC +84 +ENDCHAR +STARTCHAR 65E9 +ENCODING 26089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4100 +7E00 +4100 +7E00 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 65EC +ENCODING 26092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +40 +7F +FD +C5 +7D +45 +7D +45 +06 +ENDCHAR +STARTCHAR 65ED +ENCODING 26093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4700 +F900 +5900 +5700 +5900 +5900 +9700 +9080 +9F00 +ENDCHAR +STARTCHAR 65F1 +ENCODING 26097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +4200 +7E00 +FF00 +0800 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 65F4 +ENCODING 26100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A400 +A400 +E400 +BF80 +A400 +E400 +8400 +0C00 +ENDCHAR +STARTCHAR 65FA +ENCODING 26106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A400 +A400 +E400 +BF00 +A400 +E400 +A400 +9F80 +ENDCHAR +STARTCHAR 65FB +ENCODING 26107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0000 +FF80 +2200 +1400 +3C00 +C300 +ENDCHAR +STARTCHAR 65FC +ENCODING 26108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +BF80 +A900 +E900 +AA00 +A600 +E600 +9B00 +3080 +ENDCHAR +STARTCHAR 65FD +ENCODING 26109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E700 +BC00 +B500 +F500 +B500 +BF00 +F400 +A480 +0780 +ENDCHAR +STARTCHAR 65FF +ENCODING 26111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +E800 +BF00 +B400 +E400 +BF80 +A400 +E400 +A400 +0400 +ENDCHAR +STARTCHAR 6606 +ENCODING 26118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4100 +7F00 +7F00 +4800 +7900 +4600 +7880 +C700 +ENDCHAR +STARTCHAR 6607 +ENCODING 26119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +1000 +7400 +2400 +FF80 +2400 +C400 +ENDCHAR +STARTCHAR 6609 +ENCODING 26121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +BF80 +A800 +EF00 +A900 +A900 +F100 +B100 +2300 +ENDCHAR +STARTCHAR 660A +ENCODING 26122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0000 +FF00 +0800 +FF00 +3400 +C380 +ENDCHAR +STARTCHAR 660C +ENCODING 26124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +7E +FF +81 +FF +FF +81 +ENDCHAR +STARTCHAR 660E +ENCODING 26126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +A9 +AF +E9 +A9 +AF +E9 +11 +13 +ENDCHAR +STARTCHAR 660F +ENCODING 26127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +7800 +7F00 +4400 +7480 +8300 +7E00 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 6610 +ENCODING 26128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +AA00 +B100 +F080 +BF00 +A900 +E900 +9900 +2600 +ENDCHAR +STARTCHAR 6611 +ENCODING 26129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0400 +EA00 +A900 +FE80 +A000 +BF00 +E100 +A200 +0400 +ENDCHAR +STARTCHAR 6613 +ENCODING 26131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +42 +7E +20 +7F +B5 +49 +13 +ENDCHAR +STARTCHAR 6614 +ENCODING 26132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +2400 +FF80 +0000 +7E00 +4200 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 6615 +ENCODING 26133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +EC00 +B000 +AF80 +F200 +B200 +F200 +B200 +1200 +2200 +ENDCHAR +STARTCHAR 661E +ENCODING 26142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A400 +BF00 +F500 +B700 +B900 +F900 +B100 +1300 +ENDCHAR +STARTCHAR 661F +ENCODING 26143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +7E +00 +48 +7F +FE +08 +FF +ENDCHAR +STARTCHAR 6620 +ENCODING 26144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +BF00 +B500 +F500 +BF80 +A400 +EA00 +B900 +3080 +ENDCHAR +STARTCHAR 6625 +ENCODING 26149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +7F00 +1400 +FF80 +2200 +FF00 +FE80 +4200 +7E00 +ENDCHAR +STARTCHAR 6627 +ENCODING 26151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +C400 +BF00 +A400 +DF80 +A400 +AE00 +D500 +A480 +0400 +ENDCHAR +STARTCHAR 6628 +ENCODING 26152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +E800 +AF80 +B400 +E700 +A400 +E700 +A400 +0400 +ENDCHAR +STARTCHAR 662D +ENCODING 26157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A5 +A9 +F3 +A0 +AF +F1 +AF +11 +ENDCHAR +STARTCHAR 662F +ENCODING 26159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0000 +FF80 +4800 +4F00 +B800 +9F80 +ENDCHAR +STARTCHAR 6630 +ENCODING 26160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +7E00 +7E00 +0000 +FF00 +4F00 +4800 +FF80 +ENDCHAR +STARTCHAR 6631 +ENCODING 26161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +7E00 +7E00 +0800 +FF00 +2200 +2400 +FF80 +ENDCHAR +STARTCHAR 6634 +ENCODING 26164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +7E +30 +F7 +99 +E9 +2B +C8 +ENDCHAR +STARTCHAR 6636 +ENCODING 26166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +E500 +2D00 +EF00 +5500 +7700 +A900 +A600 +6180 +ENDCHAR +STARTCHAR 663A +ENCODING 26170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0000 +FF80 +7F00 +9900 +A700 +8300 +ENDCHAR +STARTCHAR 663B +ENCODING 26171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +7E +00 +F7 +49 +59 +EB +08 +ENDCHAR +STARTCHAR 6641 +ENCODING 26177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0000 +9900 +5A00 +EF00 +2880 +CF00 +ENDCHAR +STARTCHAR 6642 +ENCODING 26178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +A400 +BF80 +E100 +BF80 +A900 +E900 +A900 +0600 +ENDCHAR +STARTCHAR 6643 +ENCODING 26179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +4100 +7E00 +2C00 +FF80 +2400 +2480 +C700 +ENDCHAR +STARTCHAR 6644 +ENCODING 26180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +D500 +B500 +A500 +DF80 +AA00 +CA00 +AA00 +1280 +2300 +ENDCHAR +STARTCHAR 6649 +ENCODING 26185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4500 +FF00 +0000 +FF80 +7E00 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR 664B +ENCODING 26187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5500 +5600 +FF80 +0000 +7E00 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 664F +ENCODING 26191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF00 +9100 +FF80 +2200 +3C00 +E300 +ENDCHAR +STARTCHAR 6659 +ENCODING 26201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +C900 +BF00 +AA80 +DB00 +AF00 +BA00 +DA00 +8E00 +3180 +ENDCHAR +STARTCHAR 665B +ENCODING 26203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +B100 +BF00 +FF00 +B100 +FF00 +AA00 +1A80 +2380 +ENDCHAR +STARTCHAR 665D +ENCODING 26205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7E +FF +7E +08 +FF +7E +7E +7E +FF +ENDCHAR +STARTCHAR 665E +ENCODING 26206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1900 +C600 +B900 +BF80 +CC00 +BF00 +B500 +D500 +9700 +0400 +ENDCHAR +STARTCHAR 665F +ENCODING 26207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0A00 +7F00 +7600 +9400 +BA80 +9100 +ENDCHAR +STARTCHAR 6664 +ENCODING 26212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A400 +BF00 +FF80 +A000 +AF00 +F100 +B100 +0F00 +ENDCHAR +STARTCHAR 6665 +ENCODING 26213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +D080 +CF00 +C000 +DF80 +CA00 +CA00 +1280 +2300 +ENDCHAR +STARTCHAR 6666 +ENCODING 26214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DF80 +B000 +AF00 +D500 +BF80 +B500 +DF00 +9100 +0600 +ENDCHAR +STARTCHAR 6667 +ENCODING 26215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +D400 +BF00 +B400 +DF80 +A400 +BF00 +D100 +3F00 +1100 +ENDCHAR +STARTCHAR 6668 +ENCODING 26216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +7F00 +7F00 +FF00 +8000 +BE00 +FF80 +AE00 +F380 +ENDCHAR +STARTCHAR 6669 +ENCODING 26217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EE00 +B200 +BF00 +F480 +BF00 +A600 +EA00 +9A80 +3380 +ENDCHAR +STARTCHAR 666B +ENCODING 26219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +C700 +BF00 +B100 +DF00 +B100 +BF00 +DF80 +8400 +0400 +ENDCHAR +STARTCHAR 666E +ENCODING 26222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +5600 +5600 +FF80 +7E00 +4200 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 666F +ENCODING 26223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF80 +7E00 +4200 +7E00 +6A00 +B980 +ENDCHAR +STARTCHAR 6673 +ENCODING 26227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F800 +6F80 +DA00 +D200 +0000 +7E00 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 6674 +ENCODING 26228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +BF00 +BF80 +C000 +BF00 +B500 +DF00 +9100 +1300 +ENDCHAR +STARTCHAR 6676 +ENCODING 26230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +7E +00 +F7 +F7 +F7 +99 +ENDCHAR +STARTCHAR 6677 +ENCODING 26231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +7400 +D700 +7F80 +FE00 +4100 +7E00 +ENDCHAR +STARTCHAR 6678 +ENCODING 26232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +0400 +F700 +A900 +B600 +B600 +C980 +ENDCHAR +STARTCHAR 667A +ENCODING 26234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +F7 +F9 +65 +97 +00 +7E +7E +7E +42 +ENDCHAR +STARTCHAR 6684 +ENCODING 26244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +E080 +CF00 +DF00 +D100 +DF00 +DF00 +C000 +3F80 +ENDCHAR +STARTCHAR 6687 +ENCODING 26247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DB00 +D500 +D700 +D800 +DF00 +D300 +DB00 +D300 +1480 +ENDCHAR +STARTCHAR 6688 +ENCODING 26248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +3C +FF +08 +7F +7F +3E +7F +ENDCHAR +STARTCHAR 6689 +ENCODING 26249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +E480 +DF00 +DF00 +DF00 +D500 +DF80 +C400 +0400 +ENDCHAR +STARTCHAR 668E +ENCODING 26254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +DF80 +AE00 +BF00 +D500 +B500 +BF80 +C400 +AB00 +3080 +ENDCHAR +STARTCHAR 6690 +ENCODING 26256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +BF80 +A000 +DF00 +BF00 +BF00 +CA00 +9F80 +0200 +ENDCHAR +STARTCHAR 6691 +ENCODING 26257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4100 +7F00 +7E00 +FF80 +7F00 +A100 +3F00 +3F00 +ENDCHAR +STARTCHAR 6696 +ENCODING 26262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0100 +DF00 +D480 +DF00 +C800 +DF80 +CF00 +D500 +D600 +2980 +ENDCHAR +STARTCHAR 6697 +ENCODING 26263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +A900 +AA00 +FF80 +AF00 +B100 +EF00 +0F00 +1100 +ENDCHAR +STARTCHAR 6698 +ENCODING 26264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +BF00 +BF00 +C000 +BF80 +AF00 +DB00 +B500 +0B00 +ENDCHAR +STARTCHAR 669D +ENCODING 26269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +DF80 +D100 +CF00 +CF00 +DF80 +C000 +CB00 +1080 +ENDCHAR +STARTCHAR 66A0 +ENCODING 26272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +FF80 +0000 +7E00 +3C00 +FF00 +BD00 +8300 +ENDCHAR +STARTCHAR 66A2 +ENCODING 26274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +EF00 +EF00 +FF80 +E800 +FF00 +DF00 +5500 +4B00 +ENDCHAR +STARTCHAR 66AB +ENCODING 26283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +F400 +B780 +F500 +F900 +2900 +7F00 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR 66AE +ENCODING 26286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +2400 +7E00 +7E00 +7E00 +FF80 +7E00 +C380 +7E00 +4200 +ENDCHAR +STARTCHAR 66B2 +ENCODING 26290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +BF80 +A000 +DF00 +BF00 +B100 +DF80 +8400 +0400 +ENDCHAR +STARTCHAR 66B3 +ENCODING 26291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1100 +FB80 +DB00 +CB80 +F100 +C000 +DF00 +BF80 +0100 +1F00 +ENDCHAR +STARTCHAR 66B4 +ENCODING 26292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +7F00 +2400 +FF00 +ED80 +3E00 +D100 +ENDCHAR +STARTCHAR 66B9 +ENCODING 26297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5F00 +9F00 +5400 +3F00 +FC00 +5600 +5F00 +BF80 +ENDCHAR +STARTCHAR 66BB +ENCODING 26299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +DF00 +DF00 +FF80 +DF00 +D100 +DF00 +9500 +2C80 +ENDCHAR +STARTCHAR 66BE +ENCODING 26302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +FE00 +DB80 +DB00 +C300 +FF00 +CB00 +FD00 +9300 +1480 +ENDCHAR +STARTCHAR 66C4 +ENCODING 26308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +DF80 +A000 +BF00 +DF80 +B500 +BF00 +DF80 +A400 +0400 +ENDCHAR +STARTCHAR 66C6 +ENCODING 26310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F700 +FF00 +AB00 +D680 +BF00 +A100 +BF00 +A100 +ENDCHAR +STARTCHAR 66C7 +ENCODING 26311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +7F00 +3E00 +FF00 +FF00 +6E00 +7E00 +FF80 +FF00 +ENDCHAR +STARTCHAR 66C9 +ENCODING 26313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +DF80 +D100 +DB00 +B380 +BF80 +CA00 +9A80 +3380 +ENDCHAR +STARTCHAR 66D6 +ENCODING 26326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1F00 +D500 +DF80 +ED80 +D980 +DE00 +DF00 +DA00 +C400 +3B80 +ENDCHAR +STARTCHAR 66D9 +ENCODING 26329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +DF00 +C400 +DF00 +DF80 +CF00 +F100 +CF00 +0F00 +ENDCHAR +STARTCHAR 66DC +ENCODING 26332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DB00 +BA80 +B500 +CA00 +BF00 +BF00 +D300 +BC00 +1F80 +ENDCHAR +STARTCHAR 66DD +ENCODING 26333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +DF00 +DF00 +DF00 +CA00 +BD80 +F680 +8E00 +3D00 +ENDCHAR +STARTCHAR 66E0 +ENCODING 26336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +DF80 +EE00 +DF80 +EF00 +ED00 +EF00 +AF00 +3080 +ENDCHAR +STARTCHAR 66E6 +ENCODING 26342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +FF00 +DF00 +FF80 +DB00 +FF80 +FF00 +D200 +CA80 +1D00 +ENDCHAR +STARTCHAR 66F0 +ENCODING 26352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FE +02 +02 +02 +FE +02 +02 +FE +02 +ENDCHAR +STARTCHAR 66F2 +ENCODING 26354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +24 +FF +A5 +A5 +FF +A5 +A5 +FF +81 +ENDCHAR +STARTCHAR 66F3 +ENCODING 26355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +08 +7F +7F +49 +7F +0A +0C +35 +C3 +ENDCHAR +STARTCHAR 66F4 +ENCODING 26356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +7F00 +7F00 +4900 +7F00 +5000 +3C00 +C380 +ENDCHAR +STARTCHAR 66F7 +ENCODING 26359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +42 +7E +7F +D9 +67 +7F +43 +ENDCHAR +STARTCHAR 66F8 +ENCODING 26360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +FF80 +7F00 +7F00 +FF80 +7E00 +4100 +7E00 +7E00 +ENDCHAR +STARTCHAR 66F9 +ENCODING 26361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +FF00 +FF00 +0000 +7E00 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 66FA +ENCODING 26362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +FF00 +FF00 +0000 +7E00 +4200 +7E00 +7E00 +ENDCHAR +STARTCHAR 66FC +ENCODING 26364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +7E +FF +FF +00 +FE +18 +E7 +ENDCHAR +STARTCHAR 66FE +ENCODING 26366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +4300 +FF80 +6D00 +7E00 +7E00 +4200 +7E00 +7E00 +ENDCHAR +STARTCHAR 66FF +ENCODING 26367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F700 +FF80 +6600 +9900 +FE80 +4100 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 6700 +ENCODING 26368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF80 +9000 +FF00 +F500 +F200 +1D80 +ENDCHAR +STARTCHAR 6703 +ENCODING 26371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +3C00 +4200 +FF80 +AD00 +7F00 +7E00 +4200 +7E00 +7E00 +ENDCHAR +STARTCHAR 6708 +ENCODING 26376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 1 -1 +BITMAP +7E +42 +7E +42 +42 +7E +42 +42 +86 +ENDCHAR +STARTCHAR 6709 +ENCODING 26377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +FF +20 +3E +42 +FE +A2 +3E +22 +26 +ENDCHAR +STARTCHAR 670B +ENCODING 26379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +95 +F7 +95 +95 +F7 +99 +99 +BB +ENDCHAR +STARTCHAR 670D +ENCODING 26381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +A900 +EB00 +A800 +AF00 +ED00 +AA00 +AB00 +EC80 +ENDCHAR +STARTCHAR 6714 +ENCODING 26388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +97 +55 +F5 +D7 +D5 +F7 +45 +49 +8B +ENDCHAR +STARTCHAR 6715 +ENCODING 26389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +B100 +FF80 +A400 +A400 +FF00 +A600 +A900 +F080 +ENDCHAR +STARTCHAR 6717 +ENCODING 26391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +27 +F5 +95 +F7 +F5 +B7 +A5 +F9 +DB +ENDCHAR +STARTCHAR 671B +ENCODING 26395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2700 +F900 +8700 +8F00 +FB00 +0300 +FC00 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 671D +ENCODING 26397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +27 +F5 +25 +F7 +F5 +95 +F7 +F5 +29 +2B +ENDCHAR +STARTCHAR 671E +ENCODING 26398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +3E00 +3E00 +FF80 +7E00 +A380 +3E00 +7E00 +4600 +ENDCHAR +STARTCHAR 671F +ENCODING 26399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +97 +FD +95 +77 +95 +77 +F5 +45 +99 +8B +ENDCHAR +STARTCHAR 6726 +ENCODING 26406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DF80 +AA00 +BF80 +DE80 +A000 +BF80 +D700 +BF00 +BD00 +4C80 +ENDCHAR +STARTCHAR 6727 +ENCODING 26407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D200 +BB80 +DB00 +FC80 +DB00 +DB00 +DB00 +DB00 +DA80 +DB00 +ENDCHAR +STARTCHAR 6728 +ENCODING 26408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +1800 +2C00 +2A00 +C900 +8880 +0800 +0800 +ENDCHAR +STARTCHAR 672A +ENCODING 26410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +7F +08 +FF +18 +2C +4B +89 +08 +ENDCHAR +STARTCHAR 672B +ENCODING 26411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF80 +0800 +FF00 +1800 +2C00 +4B00 +8880 +0800 +ENDCHAR +STARTCHAR 672C +ENCODING 26412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +1800 +2C00 +2A00 +C900 +BE80 +0800 +0800 +ENDCHAR +STARTCHAR 672D +ENCODING 26413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +F400 +6400 +6400 +D400 +D400 +4400 +4480 +4700 +ENDCHAR +STARTCHAR 672E +ENCODING 26414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +0A00 +FF00 +2A00 +2A00 +4A00 +4A00 +4A80 +CB00 +8800 +ENDCHAR +STARTCHAR 6731 +ENCODING 26417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +48 +7E +48 +FF +18 +2C +4B +89 +08 +ENDCHAR +STARTCHAR 6734 +ENCODING 26420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +FC00 +2400 +6600 +7500 +AC80 +A400 +2400 +2400 +ENDCHAR +STARTCHAR 6736 +ENCODING 26422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7C00 +2700 +2900 +4B00 +8800 +FF00 +1C00 +6A00 +8980 +ENDCHAR +STARTCHAR 673A +ENCODING 26426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4E00 +EA00 +4A00 +6A00 +EA00 +5200 +5280 +5280 +5380 +ENDCHAR +STARTCHAR 673D +ENCODING 26429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +F400 +4800 +6F00 +E900 +D100 +C100 +4100 +4700 +ENDCHAR +STARTCHAR 6746 +ENCODING 26438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4400 +E400 +4400 +7F80 +E400 +6400 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 6749 +ENCODING 26441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4600 +F800 +6100 +A600 +D800 +C080 +4100 +4600 +5800 +ENDCHAR +STARTCHAR 674E +ENCODING 26446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1400 +6A00 +BF80 +0400 +0800 +FF00 +0800 +3800 +ENDCHAR +STARTCHAR 674F +ENCODING 26447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1800 +2C00 +4B00 +8080 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 6750 +ENCODING 26448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4100 +FF80 +4100 +6300 +E500 +D900 +5100 +4100 +4600 +ENDCHAR +STARTCHAR 6751 +ENCODING 26449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4100 +EF80 +4100 +6900 +D900 +D500 +C100 +4100 +4600 +ENDCHAR +STARTCHAR 6753 +ENCODING 26451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +48 +EF +51 +71 +EF +D1 +41 +41 +47 +ENDCHAR +STARTCHAR 6756 +ENCODING 26454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +EF80 +4200 +6A00 +EA00 +D400 +4600 +4B00 +5180 +ENDCHAR +STARTCHAR 675C +ENCODING 26460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +E200 +4F00 +6200 +E200 +C200 +4200 +4200 +5F80 +ENDCHAR +STARTCHAR 675E +ENCODING 26462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +E100 +4100 +6F00 +F000 +D000 +D000 +5080 +4F00 +ENDCHAR +STARTCHAR 675F +ENCODING 26463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +7E00 +4900 +7E00 +1400 +6A00 +8980 +0800 +ENDCHAR +STARTCHAR 676D +ENCODING 26477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +4000 +CE00 +F200 +7200 +5280 +5280 +6300 +ENDCHAR +STARTCHAR 676F +ENCODING 26479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E200 +4600 +6D00 +D480 +D400 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 6770 +ENCODING 26480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +1400 +6A00 +8980 +0800 +A900 +9500 +9480 +ENDCHAR +STARTCHAR 6771 +ENCODING 26481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0800 +7E00 +7E00 +4900 +7E00 +1C00 +6A00 +8980 +ENDCHAR +STARTCHAR 6773 +ENCODING 26483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +18 +6E +C9 +7E +42 +7E +7E +42 +ENDCHAR +STARTCHAR 6775 +ENCODING 26485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +EF00 +5200 +7200 +DF80 +C200 +4200 +4200 +4200 +ENDCHAR +STARTCHAR 6777 +ENCODING 26487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +F500 +5500 +7F00 +F000 +5000 +5000 +5080 +4F00 +ENDCHAR +STARTCHAR 677B +ENCODING 26491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4500 +E900 +4900 +DF80 +E900 +4900 +4A00 +4A00 +7F80 +ENDCHAR +STARTCHAR 677E +ENCODING 26494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +4900 +E900 +5100 +7480 +E400 +C900 +4900 +4B00 +5C80 +ENDCHAR +STARTCHAR 677F +ENCODING 26495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +F000 +5F00 +7500 +F500 +5200 +5200 +5D00 +6880 +ENDCHAR +STARTCHAR 6787 +ENCODING 26503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5200 +F280 +5B00 +F200 +F200 +5200 +5280 +5A80 +7300 +ENDCHAR +STARTCHAR 6789 +ENCODING 26505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E400 +4400 +7F00 +C400 +C400 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 678B +ENCODING 26507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4800 +4700 +E900 +E900 +C900 +5100 +6300 +ENDCHAR +STARTCHAR 678F +ENCODING 26511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +E900 +5F80 +E900 +E900 +DF80 +4900 +4900 +4B00 +ENDCHAR +STARTCHAR 6790 +ENCODING 26512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4E00 +F800 +4800 +6F80 +DA00 +CA00 +CA00 +5200 +5200 +ENDCHAR +STARTCHAR 6793 +ENCODING 26515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4900 +E500 +4100 +6900 +E500 +C780 +DF00 +4100 +4100 +ENDCHAR +STARTCHAR 6795 +ENCODING 26517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +5480 +6400 +E400 +D400 +CA00 +5A80 +5300 +ENDCHAR +STARTCHAR 6797 +ENCODING 26519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +FF00 +4600 +6600 +DB00 +DB00 +CA80 +4200 +4200 +ENDCHAR +STARTCHAR 679A +ENCODING 26522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +EF80 +4900 +5A00 +FE00 +E600 +4E00 +5900 +5080 +ENDCHAR +STARTCHAR 679C +ENCODING 26524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +7F00 +7F00 +0800 +FF80 +1400 +6A00 +8980 +ENDCHAR +STARTCHAR 679D +ENCODING 26525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +7F00 +E900 +C600 +4400 +4F00 +5080 +ENDCHAR +STARTCHAR 67AF +ENCODING 26543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +6400 +EF00 +E900 +4900 +4F00 +4900 +ENDCHAR +STARTCHAR 67B0 +ENCODING 26544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +ED00 +4D00 +5480 +E400 +FF80 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 67B3 +ENCODING 26547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4F00 +E900 +4900 +6900 +EF00 +CA00 +4900 +4900 +5080 +ENDCHAR +STARTCHAR 67B6 +ENCODING 26550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +F700 +5500 +7700 +8800 +FF00 +1400 +6A00 +8980 +0800 +ENDCHAR +STARTCHAR 67B7 +ENCODING 26551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +50 +53 +DB +57 +D7 +F7 +77 +57 +6B +7B +ENDCHAR +STARTCHAR 67B8 +ENCODING 26552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +4F +F1 +51 +DF +EB +EF +4B +41 +43 +ENDCHAR +STARTCHAR 67BE +ENCODING 26558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +5500 +F500 +FF00 +5500 +5500 +5500 +4400 +ENDCHAR +STARTCHAR 67C4 +ENCODING 26564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +E400 +5F00 +D500 +FB00 +5B00 +5100 +5100 +5300 +ENDCHAR +STARTCHAR 67CF +ENCODING 26575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +FF +51 +D1 +FF +51 +51 +5F +51 +ENDCHAR +STARTCHAR 67D0 +ENCODING 26576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF80 +3E00 +2200 +3E00 +0800 +FF80 +1400 +6A00 +8980 +ENDCHAR +STARTCHAR 67D1 +ENCODING 26577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4900 +FF80 +4900 +6900 +EF00 +C900 +4900 +4F00 +4900 +ENDCHAR +STARTCHAR 67D2 +ENCODING 26578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +0F00 +F800 +6880 +CF00 +0800 +FF00 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 67D3 +ENCODING 26579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +CA00 +7A80 +F300 +0800 +FF00 +1600 +6980 +8800 +ENDCHAR +STARTCHAR 67D4 +ENCODING 26580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +1C00 +FF00 +2900 +DA00 +0800 +FF80 +2E00 +C980 +ENDCHAR +STARTCHAR 67DA +ENCODING 26586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +FF +55 +75 +DF +D5 +55 +5F +51 +ENDCHAR +STARTCHAR 67DD +ENCODING 26589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4C00 +F000 +4F80 +7200 +F600 +D300 +5280 +5200 +6200 +ENDCHAR +STARTCHAR 67E9 +ENCODING 26601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5400 +F400 +5700 +5500 +FA00 +F200 +5500 +5F80 +5000 +ENDCHAR +STARTCHAR 67EC +ENCODING 26604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +08 +7E +6E +7E +1C +6A +89 +08 +ENDCHAR +STARTCHAR 67EF +ENCODING 26607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4100 +ED00 +4D00 +6D00 +ED00 +6D00 +4900 +4100 +4300 +ENDCHAR +STARTCHAR 67F0 +ENCODING 26608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1800 +6E00 +8180 +3E00 +FF00 +2A00 +4B00 +9100 +ENDCHAR +STARTCHAR 67F1 +ENCODING 26609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4200 +FF00 +4400 +4400 +EF00 +E400 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 67F3 +ENCODING 26611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +5B +FB +5B +DB +FB +5B +7B +4A +52 +ENDCHAR +STARTCHAR 67F4 +ENCODING 26612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +B500 +A600 +B480 +C700 +0800 +FF00 +6E00 +8980 +0800 +ENDCHAR +STARTCHAR 67F5 +ENCODING 26613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5B00 +FB00 +5B00 +DF80 +FB00 +7B00 +5B00 +5B00 +5300 +ENDCHAR +STARTCHAR 67F6 +ENCODING 26614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +5F +FB +5B +DB +FB +73 +51 +5F +51 +ENDCHAR +STARTCHAR 67FB +ENCODING 26619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1800 +6E00 +8900 +7E00 +7E00 +4200 +7E00 +FF80 +ENDCHAR +STARTCHAR 67FE +ENCODING 26622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E400 +4C00 +CB00 +EC00 +6C00 +4C00 +4C00 +7F80 +ENDCHAR +STARTCHAR 6812 +ENCODING 26642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +48 +FF +5D +75 +FD +D5 +DD +41 +47 +ENDCHAR +STARTCHAR 6813 +ENCODING 26643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +4600 +EA00 +5100 +DF80 +E400 +6F00 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 6816 +ENCODING 26646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4A00 +EA00 +5F00 +DA80 +FB00 +7B00 +5880 +5F00 +5080 +ENDCHAR +STARTCHAR 6817 +ENCODING 26647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +24 +FF +FF +08 +FF +6E +89 +08 +ENDCHAR +STARTCHAR 6821 +ENCODING 26657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +5100 +D080 +EA00 +6600 +4600 +5B00 +5080 +ENDCHAR +STARTCHAR 6822 +ENCODING 26658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E400 +5F00 +D100 +FF00 +5100 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 682A +ENCODING 26666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4C00 +FF00 +5400 +DF80 +E600 +4E00 +5500 +5480 +4400 +ENDCHAR +STARTCHAR 682F +ENCODING 26671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4800 +FF80 +4F00 +E900 +FF00 +5900 +4F00 +4900 +4B00 +ENDCHAR +STARTCHAR 6838 +ENCODING 26680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +5A00 +EB00 +6E00 +5600 +4D00 +5080 +ENDCHAR +STARTCHAR 6839 +ENCODING 26681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +EF00 +5100 +4F00 +F500 +F200 +5200 +4D00 +5880 +ENDCHAR +STARTCHAR 683C +ENCODING 26684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +F100 +4A00 +E600 +D980 +FF00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 683D +ENCODING 26685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F600 +2500 +FF80 +2400 +FD00 +6500 +B600 +AE80 +2900 +ENDCHAR +STARTCHAR 6840 +ENCODING 26688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +7F00 +9A00 +FF80 +C200 +0800 +FF00 +1400 +6A00 +8900 +ENDCHAR +STARTCHAR 6841 +ENCODING 26689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4B80 +F000 +5800 +EF80 +F100 +5100 +4900 +4900 +4B00 +ENDCHAR +STARTCHAR 6842 +ENCODING 26690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +E400 +4400 +DF00 +E400 +7F00 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 6843 +ENCODING 26691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5A80 +FB00 +5B00 +CA00 +FB00 +6A80 +4A80 +5280 +6300 +ENDCHAR +STARTCHAR 6848 +ENCODING 26696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +2400 +1E00 +E900 +0F00 +7C00 +6B80 +8800 +ENDCHAR +STARTCHAR 684E +ENCODING 26702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +E900 +4F00 +6080 +E400 +DF00 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 6850 +ENCODING 26704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +FF +51 +DF +FB +5F +5B +51 +53 +ENDCHAR +STARTCHAR 6851 +ENCODING 26705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7C +E7 +00 +EF +9D +08 +FF +2E +C9 +ENDCHAR +STARTCHAR 6853 +ENCODING 26707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +E000 +5F00 +7100 +FF00 +DF00 +5100 +4000 +5F80 +ENDCHAR +STARTCHAR 6854 +ENCODING 26708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4400 +5F00 +E000 +4F00 +5100 +4F00 +5100 +ENDCHAR +STARTCHAR 686D +ENCODING 26733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5000 +FF00 +5000 +7F80 +FA00 +DB00 +5A00 +6B00 +6C80 +ENDCHAR +STARTCHAR 6876 +ENCODING 26742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +42 +E4 +5F +F5 +FF +55 +5F +55 +55 +ENDCHAR +STARTCHAR 687F +ENCODING 26751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +EF00 +4F00 +4000 +FF00 +C400 +5F80 +4400 +4400 +ENDCHAR +STARTCHAR 6881 +ENCODING 26753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +1B00 +9A80 +5280 +E600 +8800 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 6885 +ENCODING 26757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F80 +F000 +6F00 +D500 +DF80 +5500 +5F00 +5100 +4600 +ENDCHAR +STARTCHAR 688F +ENCODING 26767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4C00 +EF00 +5400 +7F80 +E000 +4F00 +5100 +4F00 +5100 +ENDCHAR +STARTCHAR 6893 +ENCODING 26771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +4900 +7F80 +E400 +DF80 +4400 +4400 +4400 +ENDCHAR +STARTCHAR 6894 +ENCODING 26772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +FF80 +5000 +FF00 +FB00 +5F00 +5800 +5880 +6F00 +ENDCHAR +STARTCHAR 6897 +ENCODING 26775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +FF00 +5500 +FF00 +F500 +5F00 +5400 +4C00 +7380 +ENDCHAR +STARTCHAR 689D +ENCODING 26781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +6A00 +B600 +B980 +A400 +BF00 +AF00 +9480 +8400 +ENDCHAR +STARTCHAR 689F +ENCODING 26783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +7F80 +7F00 +FE80 +1B00 +6E00 +8900 +ENDCHAR +STARTCHAR 68A1 +ENCODING 26785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F080 +4F00 +C000 +FF80 +6A00 +4A00 +5A80 +5300 +ENDCHAR +STARTCHAR 68A2 +ENCODING 26786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +5500 +F500 +5F80 +D100 +FF00 +7100 +5F00 +5100 +5300 +ENDCHAR +STARTCHAR 68A7 +ENCODING 26791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +FF00 +4900 +DF80 +E000 +7F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 68A8 +ENCODING 26792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +15 +E5 +F5 +75 +AB +08 +FF +18 +6E +89 +ENDCHAR +STARTCHAR 68AD +ENCODING 26797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4900 +FE00 +4A80 +CB00 +F800 +7F00 +5600 +4E00 +7180 +ENDCHAR +STARTCHAR 68AF +ENCODING 26799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +FF00 +4500 +DF00 +F400 +FF00 +4C80 +7700 +4400 +ENDCHAR +STARTCHAR 68B0 +ENCODING 26800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4300 +FF80 +5600 +D700 +FF00 +7600 +5600 +5580 +4980 +ENDCHAR +STARTCHAR 68B1 +ENCODING 26801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +F5 +5F +F5 +FF +5D +55 +5F +51 +ENDCHAR +STARTCHAR 68B3 +ENCODING 26803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +5F00 +C100 +F600 +7600 +5600 +5680 +6580 +ENDCHAR +STARTCHAR 68B5 +ENCODING 26805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +A700 +D680 +4A00 +3C00 +2400 +5400 +4C80 +8300 +ENDCHAR +STARTCHAR 68B6 +ENCODING 26806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5100 +DE00 +F500 +7F00 +5C00 +6480 +6300 +ENDCHAR +STARTCHAR 68C4 +ENCODING 26820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE00 +4A00 +FF80 +7E00 +FF80 +1C00 +6E00 +8980 +ENDCHAR +STARTCHAR 68C5 +ENCODING 26821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +FF00 +5F00 +DF80 +E500 +5F00 +5E00 +6580 +4400 +ENDCHAR +STARTCHAR 68C9 +ENCODING 26825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +4F +F1 +4F +CF +E4 +FF +55 +55 +54 +ENDCHAR +STARTCHAR 68CB +ENCODING 26827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +5F00 +E900 +4E00 +E900 +EE00 +4900 +5F80 +4A00 +5100 +ENDCHAR +STARTCHAR 68CD +ENCODING 26829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5F00 +E000 +F280 +5B00 +5200 +5A80 +7300 +ENDCHAR +STARTCHAR 68D2 +ENCODING 26834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +E400 +5F00 +FF80 +F500 +6E80 +5F00 +4400 +4400 +ENDCHAR +STARTCHAR 68D5 +ENCODING 26837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F080 +4F00 +E000 +FF00 +5500 +5500 +5480 +4C00 +ENDCHAR +STARTCHAR 68D7 +ENCODING 26839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +7F +2E +C9 +FF +FF +99 +6E +89 +ENDCHAR +STARTCHAR 68D8 +ENCODING 26840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF80 +4200 +FF00 +DA80 +FB00 +6600 +DB00 +CA80 +4200 +ENDCHAR +STARTCHAR 68DA +ENCODING 26842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5B +5B +DB +5B +DB +DB +5B +6B +6D +6D +ENDCHAR +STARTCHAR 68DF +ENCODING 26847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E400 +5F00 +DF00 +F500 +FF00 +4600 +5D00 +5480 +ENDCHAR +STARTCHAR 68E0 +ENCODING 26848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +4A00 +FF00 +FE80 +4200 +7E00 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 68E7 +ENCODING 26855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4780 +FD00 +4680 +5900 +EA00 +FF80 +4500 +4600 +5900 +ENDCHAR +STARTCHAR 68E8 +ENCODING 26856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +E780 +FD00 +9D00 +F300 +8C80 +FF00 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 68EE +ENCODING 26862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1800 +6E00 +CB80 +FF00 +6600 +DB00 +CA80 +4200 +ENDCHAR +STARTCHAR 68F2 +ENCODING 26866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +FF00 +4500 +DF80 +FF00 +7F80 +4A00 +4600 +5900 +ENDCHAR +STARTCHAR 68F9 +ENCODING 26873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +E400 +5F00 +DF00 +F100 +7F00 +5F80 +4400 +4400 +ENDCHAR +STARTCHAR 68FA +ENCODING 26874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +F080 +4F00 +D100 +EF00 +7000 +4F00 +4F00 +5100 +ENDCHAR +STARTCHAR 6900 +ENCODING 26880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F080 +5B00 +D500 +DB00 +4B00 +4A00 +5280 +6300 +ENDCHAR +STARTCHAR 6905 +ENCODING 26885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +5100 +FF80 +E100 +5D00 +5D00 +5300 +4300 +ENDCHAR +STARTCHAR 690D +ENCODING 26893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +5F80 +E200 +4700 +F700 +F900 +5700 +5700 +5F80 +5000 +ENDCHAR +STARTCHAR 690E +ENCODING 26894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +EF80 +5200 +6F00 +EA00 +CF00 +4A00 +4F80 +4800 +ENDCHAR +STARTCHAR 6912 +ENCODING 26898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5700 +EA80 +5300 +FF00 +F700 +7500 +7700 +5300 +5480 +ENDCHAR +STARTCHAR 6927 +ENCODING 26919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4E00 +F900 +5F80 +DF00 +F680 +F680 +5F00 +5600 +4200 +ENDCHAR +STARTCHAR 6930 +ENCODING 26928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +5A80 +EB00 +5B00 +DB00 +FA80 +5A80 +5B00 +6A00 +4A00 +ENDCHAR +STARTCHAR 693D +ENCODING 26941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +EE00 +5F80 +CA00 +F700 +CD00 +5D00 +7280 +4C00 +ENDCHAR +STARTCHAR 693F +ENCODING 26943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF00 +4A00 +FF80 +F100 +6E80 +4E00 +5100 +4E00 +ENDCHAR +STARTCHAR 694A +ENCODING 26954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +EF00 +4F00 +7F80 +E800 +DF00 +5B00 +5500 +4B00 +ENDCHAR +STARTCHAR 6953 +ENCODING 26963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +EF00 +5500 +DF00 +D700 +6F00 +6700 +6780 +7B80 +ENDCHAR +STARTCHAR 6954 +ENCODING 26964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +5A80 +FA80 +5E80 +CD00 +C400 +5F80 +4400 +5B00 +7180 +ENDCHAR +STARTCHAR 6955 +ENCODING 26965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EF00 +5F80 +5000 +EF00 +EF00 +4900 +4F00 +4B00 +ENDCHAR +STARTCHAR 6957 +ENCODING 26967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +7700 +D300 +5F80 +D700 +9700 +6F00 +7200 +5A00 +6F80 +ENDCHAR +STARTCHAR 6959 +ENCODING 26969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7E00 +4A00 +FF80 +7E00 +D700 +B300 +6E80 +6E00 +4A00 +5200 +ENDCHAR +STARTCHAR 695A +ENCODING 26970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +6600 +BB00 +2200 +FF00 +4900 +4E00 +B000 +9F80 +ENDCHAR +STARTCHAR 695E +ENCODING 26974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5A80 +FF00 +4000 +E400 +FF80 +4700 +4900 +5900 +5300 +ENDCHAR +STARTCHAR 6960 +ENCODING 26976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E400 +5F00 +DA80 +EE80 +5E80 +5480 +5480 +5500 +ENDCHAR +STARTCHAR 6961 +ENCODING 26977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5C00 +4A00 +FF00 +6080 +DB00 +DB00 +5500 +5B00 +5700 +5A80 +ENDCHAR +STARTCHAR 6962 +ENCODING 26978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +5100 +FF00 +4680 +FF00 +F700 +5B00 +5F00 +5F00 +5100 +ENDCHAR +STARTCHAR 6963 +ENCODING 26979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +FF +50 +DF +FF +79 +5F +6F +69 +ENDCHAR +STARTCHAR 6968 +ENCODING 26984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +E400 +4F00 +6F00 +F100 +4F00 +4F00 +4B00 +5080 +ENDCHAR +STARTCHAR 696B +ENCODING 26987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +EF00 +5F80 +D100 +EF00 +7100 +4F00 +7F80 +4100 +ENDCHAR +STARTCHAR 696D +ENCODING 26989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5800 +5A00 +FF80 +2400 +FF00 +7F00 +FF80 +1C00 +6E00 +8980 +ENDCHAR +STARTCHAR 696E +ENCODING 26990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +E600 +5F80 +E500 +FF00 +6900 +4F00 +4F00 +4900 +ENDCHAR +STARTCHAR 696F +ENCODING 26991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5E00 +FF80 +5400 +DF00 +F900 +5F00 +5F00 +6F00 +6900 +ENDCHAR +STARTCHAR 6975 +ENCODING 26997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F00 +EC00 +4700 +DF00 +EF00 +5D00 +6500 +4A80 +7F80 +ENDCHAR +STARTCHAR 6977 +ENCODING 26999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5E80 +F380 +5F80 +D400 +FF00 +7100 +5F00 +5100 +5F00 +ENDCHAR +STARTCHAR 6978 +ENCODING 27000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +7100 +ED80 +7E80 +CE80 +DA00 +6B00 +6B00 +4C80 +4C80 +ENDCHAR +STARTCHAR 6979 +ENCODING 27001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +4A00 +F300 +5F00 +DF00 +EB00 +5F00 +5B00 +5B00 +7F80 +ENDCHAR +STARTCHAR 6995 +ENCODING 27029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FA80 +4900 +F700 +E900 +5F80 +4900 +4F00 +4900 +ENDCHAR +STARTCHAR 699B +ENCODING 27035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF00 +4A00 +5F80 +F700 +FF80 +4400 +5F00 +5500 +ENDCHAR +STARTCHAR 699C +ENCODING 27036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA00 +5F80 +D480 +FF80 +6800 +4F00 +5900 +7300 +ENDCHAR +STARTCHAR 69A5 +ENCODING 27045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +5F00 +F500 +ED00 +5F00 +4A00 +4A80 +7300 +ENDCHAR +STARTCHAR 69A7 +ENCODING 27047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5600 +D600 +5F00 +DF00 +D600 +5F00 +5A00 +5F80 +5000 +ENDCHAR +STARTCHAR 69AE +ENCODING 27054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +DB00 +6600 +9D00 +FF00 +8900 +7E00 +1400 +6A00 +8980 +ENDCHAR +STARTCHAR 69B4 +ENCODING 27060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +5F +DB +5F +F5 +DF +55 +5F +5F +51 +ENDCHAR +STARTCHAR 69BB +ENCODING 27067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +FF +5F +DB +E9 +5F +59 +57 +49 +ENDCHAR +STARTCHAR 69C1 +ENCODING 27073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EF00 +4F00 +6000 +FF00 +DE80 +5E80 +5880 +5300 +ENDCHAR +STARTCHAR 69C3 +ENCODING 27075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4680 +F500 +D800 +FF00 +D600 +B580 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 69CB +ENCODING 27083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +FF00 +5F80 +C400 +FF00 +DF80 +5580 +5F00 +5300 +ENDCHAR +STARTCHAR 69CC +ENCODING 27084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +4F00 +E500 +5700 +E400 +F700 +4D00 +4F00 +5800 +6780 +ENDCHAR +STARTCHAR 69CD +ENCODING 27085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +FF00 +5F80 +D100 +FF00 +DF00 +5F00 +7900 +6F00 +ENDCHAR +STARTCHAR 69D0 +ENCODING 27088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F500 +5F00 +D500 +FF00 +4F00 +5780 +5480 +6700 +ENDCHAR +STARTCHAR 69E8 +ENCODING 27112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B80 +7E80 +DB00 +5B00 +C300 +BE80 +4E80 +7B80 +4A00 +5200 +ENDCHAR +STARTCHAR 69EA +ENCODING 27114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F00 +ED00 +5D00 +ED00 +9F80 +5A00 +5A00 +6580 +6980 +ENDCHAR +STARTCHAR 69FB +ENCODING 27131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5700 +5500 +FF00 +5500 +FF00 +B500 +5700 +5A00 +6D80 +6980 +ENDCHAR +STARTCHAR 69FD +ENCODING 27133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +FF00 +5B00 +DF00 +E000 +7F00 +5100 +5F00 +5100 +ENDCHAR +STARTCHAR 69FF +ENCODING 27135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +EE00 +4400 +DF00 +FF00 +7F00 +5F00 +4400 +7F80 +ENDCHAR +STARTCHAR 6A02 +ENCODING 27138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +9E00 +D700 +9E00 +FF80 +0800 +7F00 +2E00 +4980 +8800 +ENDCHAR +STARTCHAR 6A0A +ENCODING 27146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +EF80 +5300 +FA80 +DE00 +4A00 +FF00 +1800 +2600 +C100 +ENDCHAR +STARTCHAR 6A11 +ENCODING 27153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +6500 +ED00 +5580 +DA00 +C400 +5F00 +4E00 +7580 +4400 +ENDCHAR +STARTCHAR 6A13 +ENCODING 27155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F500 +5F00 +DF00 +D500 +7F80 +4A00 +4600 +7900 +ENDCHAR +STARTCHAR 6A17 +ENCODING 27159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +FF00 +5E80 +C000 +FF00 +5F80 +4F00 +4100 +4300 +ENDCHAR +STARTCHAR 6A19 +ENCODING 27161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4A00 +FF00 +5F00 +C000 +FF00 +7F80 +4D00 +5500 +6C80 +ENDCHAR +STARTCHAR 6A1E +ENCODING 27166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5000 +F700 +5700 +D000 +FF00 +5F00 +5F00 +5000 +5F80 +ENDCHAR +STARTCHAR 6A1F +ENCODING 27167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF80 +4000 +FF00 +FF00 +DF00 +5F80 +4400 +4400 +ENDCHAR +STARTCHAR 6A21 +ENCODING 27169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +E000 +5F00 +DF00 +FF00 +6400 +5F80 +4A00 +5180 +ENDCHAR +STARTCHAR 6A23 +ENCODING 27171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +5F00 +FF00 +5F80 +E400 +EE00 +C500 +5F00 +5C80 +6400 +ENDCHAR +STARTCHAR 6A35 +ENCODING 27189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2500 +2780 +7900 +2F80 +6980 +7600 +B7C0 +2000 +2D80 +2B40 +ENDCHAR +STARTCHAR 6A38 +ENCODING 27192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +FF80 +4A00 +DF00 +FF00 +7F80 +4400 +4B00 +5180 +ENDCHAR +STARTCHAR 6A39 +ENCODING 27193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +7D00 +DF80 +4100 +DF00 +9700 +5F00 +5900 +5D00 +7300 +ENDCHAR +STARTCHAR 6A3A +ENCODING 27194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +FF00 +4D00 +DF80 +ED00 +7F00 +5F80 +4400 +4400 +ENDCHAR +STARTCHAR 6A3D +ENCODING 27197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +5100 +FF80 +5F00 +DB00 +DF00 +7F00 +5F80 +4A00 +4600 +ENDCHAR +STARTCHAR 6A44 +ENCODING 27204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7A00 +5200 +FF80 +5B00 +DF00 +9B00 +5900 +5900 +6B00 +4480 +ENDCHAR +STARTCHAR 6A48 +ENCODING 27208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF00 +4900 +DF00 +FF80 +DF80 +4A00 +4A80 +7300 +ENDCHAR +STARTCHAR 6A4B +ENCODING 27211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5E00 +FF80 +5E80 +CE00 +FF00 +5100 +5F00 +5F00 +5100 +ENDCHAR +STARTCHAR 6A52 +ENCODING 27218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +FF80 +5E80 +C400 +FF00 +4000 +5F80 +4B00 +5C80 +ENDCHAR +STARTCHAR 6A53 +ENCODING 27219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +F500 +5F00 +D100 +BB00 +7D00 +4F80 +5100 +6100 +ENDCHAR +STARTCHAR 6A58 +ENCODING 27224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4A00 +FF80 +4D00 +D400 +FF00 +5B00 +5E80 +5E80 +5100 +ENDCHAR +STARTCHAR 6A59 +ENCODING 27225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5D00 +4A00 +FB00 +5F00 +E080 +FF00 +5F00 +4A00 +4A00 +7F80 +ENDCHAR +STARTCHAR 6A5F +ENCODING 27231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +7E00 +D700 +5D00 +DF80 +FF80 +5300 +5A00 +5680 +6D00 +ENDCHAR +STARTCHAR 6A61 +ENCODING 27233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +DF00 +5500 +DF00 +FA00 +6F00 +5500 +5C80 +7C00 +ENDCHAR +STARTCHAR 6A6B +ENCODING 27243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F80 +EE00 +7F80 +C400 +FF00 +7F00 +5F00 +4A00 +7180 +ENDCHAR +STARTCHAR 6A80 +ENCODING 27264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4000 +FF00 +5B00 +DF00 +E000 +5F00 +5100 +5F00 +7F80 +ENDCHAR +STARTCHAR 6A84 +ENCODING 27268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5A00 +DB80 +6500 +BF00 +BF00 +DF00 +5500 +6B00 +6480 +ENDCHAR +STARTCHAR 6A89 +ENCODING 27273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5C00 +5700 +FE80 +5E80 +DF00 +E300 +5C00 +5F80 +4400 +5F00 +ENDCHAR +STARTCHAR 6A8D +ENCODING 27277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF80 +4000 +DF00 +FF00 +5F00 +5D00 +6A80 +6E80 +ENDCHAR +STARTCHAR 6A8E +ENCODING 27278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4B00 +FF80 +5B00 +DF00 +BF00 +7F00 +5A80 +5E80 +5100 +ENDCHAR +STARTCHAR 6A97 +ENCODING 27287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +9F80 +F500 +FF80 +F200 +CA00 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 6A9C +ENCODING 27292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +FF00 +5F80 +DF00 +9F00 +5F00 +5100 +5F00 +5F00 +ENDCHAR +STARTCHAR 6AA2 +ENCODING 27298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +FF00 +5080 +DB00 +FB00 +4000 +4A00 +5700 +6580 +ENDCHAR +STARTCHAR 6AA3 +ENCODING 27299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +FD00 +5E80 +DF80 +FF00 +D100 +5F00 +5500 +5F00 +ENDCHAR +STARTCHAR 6AB3 +ENCODING 27315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +FF80 +4E00 +DF00 +B100 +5F00 +4F00 +4A00 +5180 +ENDCHAR +STARTCHAR 6ABB +ENCODING 27323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +5A00 +DF80 +5C00 +DB80 +BC00 +5F00 +5B00 +5B00 +7F80 +ENDCHAR +STARTCHAR 6AC2 +ENCODING 27330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +ED00 +5A80 +CA00 +FF00 +7F00 +5700 +5C00 +5F80 +ENDCHAR +STARTCHAR 6AC3 +ENCODING 27331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5F00 +EF00 +5F80 +DF00 +DF00 +6F00 +5500 +5F80 +5000 +ENDCHAR +STARTCHAR 6AD3 +ENCODING 27347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +DF00 +5F00 +DF00 +9A80 +6000 +5F00 +5100 +5F00 +ENDCHAR +STARTCHAR 6ADA +ENCODING 27354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5B +6D +DB +5B +EF +AB +65 +6B +6F +61 +ENDCHAR +STARTCHAR 6ADB +ENCODING 27355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5F80 +ED00 +5B00 +E680 +DA80 +5A80 +6A80 +5F00 +5A00 +ENDCHAR +STARTCHAR 6AF6 +ENCODING 27382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EF80 +5F00 +DF80 +DF00 +5F00 +5C00 +5B00 +6E80 +ENDCHAR +STARTCHAR 6AFB +ENCODING 27387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5B00 +FB00 +5B00 +DB00 +E480 +7F80 +5200 +4E00 +7900 +ENDCHAR +STARTCHAR 6B04 +ENCODING 27396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5B +6D +DB +5B +DF +EF +6F +6D +57 +65 +ENDCHAR +STARTCHAR 6B0A +ENCODING 27402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4A00 +FB00 +5B00 +D200 +FF80 +5F00 +5300 +5C00 +5F80 +ENDCHAR +STARTCHAR 6B0C +ENCODING 27404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F00 +C280 +6F80 +F600 +9680 +7B00 +7D00 +7780 +7500 +ENDCHAR +STARTCHAR 6B12 +ENCODING 27410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DB00 +5A00 +FB80 +BB00 +BD80 +FF00 +1800 +6E00 +8900 +ENDCHAR +STARTCHAR 6B16 +ENCODING 27414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BA00 +BD00 +FB80 +FB80 +DF00 +9F00 +9F00 +9F00 +8A80 +B300 +ENDCHAR +STARTCHAR 6B20 +ENCODING 27424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +2000 +3F00 +4900 +8A00 +9800 +1800 +2400 +4300 +8180 +ENDCHAR +STARTCHAR 6B21 +ENCODING 27425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +F000 +1F00 +1500 +2500 +6C00 +CC00 +1200 +3100 +6080 +ENDCHAR +STARTCHAR 6B23 +ENCODING 27427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +C400 +8F80 +FC80 +AD00 +A400 +A600 +A600 +A900 +B080 +ENDCHAR +STARTCHAR 6B32 +ENCODING 27442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +9400 +F780 +6A80 +9B00 +8A00 +F600 +9500 +F900 +8880 +ENDCHAR +STARTCHAR 6B3A +ENCODING 27450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +F400 +9700 +FB00 +9B00 +F200 +FE00 +6500 +9900 +8880 +ENDCHAR +STARTCHAR 6B3D +ENCODING 27453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +6800 +AF00 +FB00 +4B00 +F200 +D600 +E500 +3900 +C880 +ENDCHAR +STARTCHAR 6B3E +ENCODING 27454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F400 +F780 +0B00 +FB00 +0600 +F600 +B500 +B900 +4880 +ENDCHAR +STARTCHAR 6B46 +ENCODING 27462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F800 +9F00 +6B00 +FB00 +F200 +9600 +F500 +F900 +8880 +ENDCHAR +STARTCHAR 6B47 +ENCODING 27463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +9400 +F780 +F500 +4B00 +F200 +F600 +D500 +F900 +3880 +ENDCHAR +STARTCHAR 6B4C +ENCODING 27468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FC00 +1400 +F780 +F680 +3700 +FA00 +F600 +B500 +F500 +3880 +ENDCHAR +STARTCHAR 6B4E +ENCODING 27470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4A00 +FE00 +3B80 +7D40 +5580 +7900 +7B00 +FA80 +2C80 +4440 +ENDCHAR +STARTCHAR 6B50 +ENCODING 27472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FC00 +8400 +F780 +FA80 +8300 +F200 +F200 +8500 +F900 +0880 +ENDCHAR +STARTCHAR 6B5F +ENCODING 27487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DA00 +AA00 +BB80 +AE80 +DF00 +EA00 +FA00 +0300 +5500 +8C80 +ENDCHAR +STARTCHAR 6B61 +ENCODING 27489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FC00 +6400 +F700 +F700 +2B00 +F200 +F600 +A500 +FD00 +8880 +ENDCHAR +STARTCHAR 6B62 +ENCODING 27490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +0800 +4800 +4F00 +4800 +4800 +4800 +4800 +FF80 +ENDCHAR +STARTCHAR 6B63 +ENCODING 27491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +0800 +4800 +4F00 +4800 +4800 +4800 +FF80 +ENDCHAR +STARTCHAR 6B64 +ENCODING 27492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +A500 +A700 +BC00 +A400 +A400 +A400 +BC80 +C700 +ENDCHAR +STARTCHAR 6B65 +ENCODING 27493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +4F00 +4800 +FF80 +0800 +2900 +4A00 +9C00 +3800 +C000 +ENDCHAR +STARTCHAR 6B66 +ENCODING 27494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7D00 +FF80 +2400 +A400 +BA00 +A200 +BA80 +E100 +ENDCHAR +STARTCHAR 6B6A +ENCODING 27498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1C00 +6B00 +8980 +0000 +FF00 +4E00 +4800 +FF00 +ENDCHAR +STARTCHAR 6B72 +ENCODING 27506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +FF80 +0700 +FF80 +FD00 +B600 +BA00 +D680 +A900 +ENDCHAR +STARTCHAR 6B77 +ENCODING 27511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F700 +FF00 +AB00 +D680 +8800 +A700 +A800 +FF80 +ENDCHAR +STARTCHAR 6B78 +ENCODING 27512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +E100 +FF80 +8F00 +FF80 +F280 +6F00 +CB00 +EB00 +C200 +ENDCHAR +STARTCHAR 6B7B +ENCODING 27515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4400 +7500 +5700 +D400 +A400 +2480 +4480 +8700 +ENDCHAR +STARTCHAR 6B7F +ENCODING 27519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F700 +4900 +6B00 +B000 +FF00 +E900 +4600 +CF00 +9180 +ENDCHAR +STARTCHAR 6B83 +ENCODING 27523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +4400 +4F00 +7500 +B500 +BF80 +C400 +4A00 +9900 +9080 +ENDCHAR +STARTCHAR 6B84 +ENCODING 27524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +4E00 +7B00 +BC80 +EA00 +6500 +5A00 +CC00 +9000 +ENDCHAR +STARTCHAR 6B86 +ENCODING 27526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F400 +4800 +6F00 +A080 +E000 +6F00 +4900 +4F00 +8900 +ENDCHAR +STARTCHAR 6B89 +ENCODING 27529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +49 +7F +AB +EF +4B +4F +81 +83 +ENDCHAR +STARTCHAR 6B8A +ENCODING 27530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +EC00 +4F00 +7400 +BF80 +E600 +CA00 +5500 +9480 +8400 +ENDCHAR +STARTCHAR 6B96 +ENCODING 27542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +EF80 +4200 +E700 +B700 +F900 +5700 +5700 +9F80 +9000 +ENDCHAR +STARTCHAR 6B98 +ENCODING 27544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +E600 +5D80 +E680 +B900 +EA00 +3F80 +4500 +8600 +9900 +ENDCHAR +STARTCHAR 6B9E +ENCODING 27550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +4F00 +6000 +BF00 +FF00 +DF00 +5F00 +8A00 +9180 +ENDCHAR +STARTCHAR 6BAE +ENCODING 27566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E600 +8900 +FE80 +BF00 +FF00 +4000 +4A00 +9B00 +9480 +ENDCHAR +STARTCHAR 6BAF +ENCODING 27567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +5F80 +EE00 +BF00 +F100 +4F00 +4F00 +8B00 +9180 +ENDCHAR +STARTCHAR 6BB2 +ENCODING 27570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1600 +EF00 +AA00 +FF80 +D600 +D680 +7500 +5900 +BF80 +8500 +ENDCHAR +STARTCHAR 6BB5 +ENCODING 27573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3E00 +EA00 +8A80 +F180 +8000 +EF00 +B900 +C600 +8F00 +9900 +ENDCHAR +STARTCHAR 6BB7 +ENCODING 27575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1600 +E600 +FA80 +F980 +FF00 +F500 +9600 +9D00 +A880 +ENDCHAR +STARTCHAR 6BBA +ENCODING 27578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A600 +6A00 +9A80 +E980 +4000 +FF00 +6500 +D600 +C700 +5980 +ENDCHAR +STARTCHAR 6BBC +ENCODING 27580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +F500 +F580 +0980 +F000 +6F00 +6500 +A200 +9500 +A880 +ENDCHAR +STARTCHAR 6BBF +ENCODING 27583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +9680 +F580 +D800 +FF00 +D500 +F600 +D700 +8D80 +ENDCHAR +STARTCHAR 6BC1 +ENCODING 27585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7600 +9500 +F980 +9980 +F000 +0F00 +F100 +3600 +C700 +1980 +ENDCHAR +STARTCHAR 6BC5 +ENCODING 27589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +FA00 +6A80 +F980 +5000 +EF00 +B500 +7600 +AD00 +6880 +ENDCHAR +STARTCHAR 6BC6 +ENCODING 27590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +F580 +F980 +8800 +D700 +AD00 +D500 +FE00 +8980 +ENDCHAR +STARTCHAR 6BCB +ENCODING 27595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +4900 +FF80 +5200 +5200 +7F00 +8200 +8600 +ENDCHAR +STARTCHAR 6BCD +ENCODING 27597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +5200 +4A00 +FF80 +5200 +4A00 +7F00 +4200 +0600 +ENDCHAR +STARTCHAR 6BCF +ENCODING 27599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +4000 +BE00 +4A00 +FF80 +5200 +7F00 +0200 +0600 +ENDCHAR +STARTCHAR 6BD2 +ENCODING 27602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +FF80 +0000 +7E00 +FF80 +4A00 +7F00 +0600 +ENDCHAR +STARTCHAR 6BD3 +ENCODING 27603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +8500 +EF00 +D080 +FD00 +ED00 +FD00 +AD80 +7580 +ENDCHAR +STARTCHAR 6BD4 +ENCODING 27604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4800 +4800 +4900 +7600 +4800 +4800 +4880 +7880 +C700 +ENDCHAR +STARTCHAR 6BD6 +ENCODING 27606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4900 +7600 +7880 +C700 +1200 +6D00 +A900 +B280 +FE00 +ENDCHAR +STARTCHAR 6BD7 +ENCODING 27607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +EA00 +EA80 +EF00 +EA00 +EA00 +EA00 +EA80 +8E80 +1300 +ENDCHAR +STARTCHAR 6BD8 +ENCODING 27608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +8900 +7F00 +7F00 +4800 +4900 +7E00 +7880 +CF00 +ENDCHAR +STARTCHAR 6BDB +ENCODING 27611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7800 +0F00 +F000 +3F00 +D000 +1000 +1080 +0F00 +ENDCHAR +STARTCHAR 6BEB +ENCODING 27627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +7E00 +FF00 +8E80 +7300 +7F00 +D080 +0F00 +ENDCHAR +STARTCHAR 6BEC +ENCODING 27628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +C500 +5F00 +7500 +CE00 +6600 +CD00 +5480 +4C80 +7F00 +ENDCHAR +STARTCHAR 6C08 +ENCODING 27656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +0600 +F200 +FF00 +F200 +0300 +FF00 +9200 +F280 +FB00 +ENDCHAR +STARTCHAR 6C0F +ENCODING 27663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +7800 +4800 +4800 +7F00 +4400 +4400 +7A80 +E300 +ENDCHAR +STARTCHAR 6C11 +ENCODING 27665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4100 +7F00 +4800 +4800 +7F00 +4400 +7C80 +C300 +ENDCHAR +STARTCHAR 6C13 +ENCODING 27667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +5100 +EF00 +9200 +9200 +8F80 +9200 +F680 +1900 +ENDCHAR +STARTCHAR 6C23 +ENCODING 27683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +BE00 +0000 +FE00 +5A00 +FE00 +3280 +5980 +9500 +ENDCHAR +STARTCHAR 6C34 +ENCODING 27700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +08 +E9 +2A +2C +4C +8B +89 +38 +ENDCHAR +STARTCHAR 6C37 +ENCODING 27703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +48 +29 +EA +2C +2C +4A +89 +89 +38 +ENDCHAR +STARTCHAR 6C38 +ENCODING 27704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1000 +0800 +7800 +0900 +EA00 +2C00 +2A00 +C980 +9800 +ENDCHAR +STARTCHAR 6C3E +ENCODING 27710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +5100 +9100 +5100 +1700 +5000 +5000 +9080 +9F00 +ENDCHAR +STARTCHAR 6C40 +ENCODING 27712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8000 +5F80 +0200 +C200 +0200 +4200 +4200 +8200 +8C00 +ENDCHAR +STARTCHAR 6C41 +ENCODING 27713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +4400 +0400 +BF80 +4400 +0400 +4400 +4400 +8400 +8400 +ENDCHAR +STARTCHAR 6C42 +ENCODING 27714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0C00 +0A00 +FF00 +4900 +4A00 +2C00 +3200 +6900 +8880 +3000 +ENDCHAR +STARTCHAR 6C4E +ENCODING 27726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DE00 +5200 +9200 +5A00 +1600 +5200 +6200 +A280 +A300 +ENDCHAR +STARTCHAR 6C50 +ENCODING 27728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +C8 +48 +0F +89 +5D +26 +42 +44 +88 +90 +ENDCHAR +STARTCHAR 6C55 +ENCODING 27733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +84 +44 +25 +A5 +25 +65 +65 +BF +A1 +ENDCHAR +STARTCHAR 6C57 +ENCODING 27735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +4400 +0400 +8400 +3F80 +4400 +4400 +8400 +8400 +ENDCHAR +STARTCHAR 6C5A +ENCODING 27738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +4800 +0800 +FF80 +1000 +5F00 +9100 +8100 +8700 +ENDCHAR +STARTCHAR 6C5D +ENCODING 27741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4800 +3F80 +9200 +5200 +1200 +4C00 +4E00 +9B00 +A100 +ENDCHAR +STARTCHAR 6C5E +ENCODING 27742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +08 +FF +09 +EA +2C +4E +CB +B9 +ENDCHAR +STARTCHAR 6C5F +ENCODING 27743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +C000 +5F00 +8400 +4400 +0400 +4400 +4400 +8400 +BF80 +ENDCHAR +STARTCHAR 6C60 +ENCODING 27744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5400 +1500 +9F00 +9500 +3500 +5700 +5400 +9080 +9F00 +ENDCHAR +STARTCHAR 6C68 +ENCODING 27752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +DF +51 +11 +D1 +1F +51 +51 +9F +91 +ENDCHAR +STARTCHAR 6C6A +ENCODING 27754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8000 +7F00 +0400 +C400 +1F00 +4400 +4400 +8400 +BF80 +ENDCHAR +STARTCHAR 6C6D +ENCODING 27757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +9C +44 +3F +A5 +2D +6B +73 +A1 +A3 +ENDCHAR +STARTCHAR 6C70 +ENCODING 27760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +0400 +BF80 +8400 +0C00 +4A00 +5A00 +B500 +A080 +ENDCHAR +STARTCHAR 6C72 +ENCODING 27762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BE00 +5200 +1200 +DB00 +1D00 +5500 +A600 +AE00 +D180 +ENDCHAR +STARTCHAR 6C76 +ENCODING 27766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F80 +9100 +4A00 +0C00 +4400 +4A00 +B100 +A080 +ENDCHAR +STARTCHAR 6C7A +ENCODING 27770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4800 +1F00 +8900 +8900 +3F80 +4C00 +9200 +B300 +A080 +ENDCHAR +STARTCHAR 6C7D +ENCODING 27773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9000 +7F00 +2000 +9F00 +3E00 +4200 +8200 +8180 +8100 +ENDCHAR +STARTCHAR 6C7E +ENCODING 27774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +C600 +4A00 +9100 +6080 +3F00 +4900 +4900 +9100 +A600 +ENDCHAR +STARTCHAR 6C81 +ENCODING 27777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8C00 +4400 +0800 +E900 +2900 +6880 +A800 +8900 +8F00 +ENDCHAR +STARTCHAR 6C82 +ENCODING 27778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +5E00 +1000 +DF80 +1200 +5200 +5200 +A200 +A200 +ENDCHAR +STARTCHAR 6C83 +ENCODING 27779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +5C00 +0400 +8400 +7F80 +0400 +4C00 +5200 +B100 +A080 +ENDCHAR +STARTCHAR 6C85 +ENCODING 27781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8000 +5F00 +0000 +FF00 +0A00 +5200 +5200 +B280 +A300 +ENDCHAR +STARTCHAR 6C86 +ENCODING 27782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0000 +8000 +9E00 +1200 +5200 +5280 +A280 +A300 +ENDCHAR +STARTCHAR 6C87 +ENCODING 27783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C800 +4A00 +1100 +BF00 +5280 +1200 +5200 +5200 +A280 +A300 +ENDCHAR +STARTCHAR 6C88 +ENCODING 27784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F00 +A500 +8400 +0C00 +4C00 +5400 +B480 +A700 +ENDCHAR +STARTCHAR 6C8C +ENCODING 27788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4700 +3E00 +A500 +6500 +2500 +7F00 +6400 +8480 +8700 +ENDCHAR +STARTCHAR 6C90 +ENCODING 27792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F00 +8400 +8E00 +1600 +6500 +A480 +8400 +8400 +ENDCHAR +STARTCHAR 6C92 +ENCODING 27794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4F00 +1100 +9600 +A000 +3F00 +5200 +4C00 +9E00 +A180 +ENDCHAR +STARTCHAR 6C93 +ENCODING 27795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +EA +2C +4A +99 +7E +41 +7E +7E +41 +ENDCHAR +STARTCHAR 6C94 +ENCODING 27796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +44 +A4 +A7 +25 +5F +61 +81 +83 +ENDCHAR +STARTCHAR 6C95 +ENCODING 27797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +D0 +50 +1F +AB +6B +15 +75 +69 +99 +97 +ENDCHAR +STARTCHAR 6C96 +ENCODING 27798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +44 +3F +A5 +65 +3F +65 +84 +84 +84 +ENDCHAR +STARTCHAR 6C99 +ENCODING 27801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +46 +15 +95 +55 +26 +4E +84 +98 +A0 +ENDCHAR +STARTCHAR 6C9A +ENCODING 27802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +1400 +9400 +9700 +1400 +5400 +5400 +9400 +FF80 +ENDCHAR +STARTCHAR 6C9B +ENCODING 27803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0400 +8400 +9F00 +1500 +5500 +5500 +9500 +8400 +ENDCHAR +STARTCHAR 6CAB +ENCODING 27819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F80 +8400 +BF00 +0C00 +4E00 +B500 +A480 +8400 +ENDCHAR +STARTCHAR 6CAE +ENCODING 27822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +5100 +9100 +5F00 +1100 +5F00 +5100 +9100 +BF80 +ENDCHAR +STARTCHAR 6CB3 +ENCODING 27827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8000 +7F80 +8100 +DD00 +1500 +5D00 +5500 +8100 +8300 +ENDCHAR +STARTCHAR 6CB8 +ENCODING 27832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +8C +7F +0D +BF +6C +2C +7F +95 +95 +A4 +ENDCHAR +STARTCHAR 6CB9 +ENCODING 27833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +44 +1F +A5 +65 +1F +65 +65 +9F +A1 +ENDCHAR +STARTCHAR 6CBB +ENCODING 27835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4A00 +1100 +9F00 +4080 +1F00 +5100 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6CBC +ENCODING 27836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +DF +49 +89 +73 +00 +5F +51 +9F +91 +ENDCHAR +STARTCHAR 6CBD +ENCODING 27837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F80 +8400 +4400 +1F00 +5100 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6CBE +ENCODING 27838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +4400 +0780 +8400 +4400 +1F00 +5100 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6CBF +ENCODING 27839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DE00 +5200 +9280 +5380 +2000 +5F00 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6CC1 +ENCODING 27841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9F00 +6100 +2100 +A100 +DF00 +0C00 +4C00 +5400 +B480 +A300 +ENDCHAR +STARTCHAR 6CC2 +ENCODING 27842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +DF +61 +2F +AB +6B +6F +6B +A1 +A3 +ENDCHAR +STARTCHAR 6CC4 +ENCODING 27844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8A00 +5A00 +1A00 +BF80 +1A00 +5A00 +5600 +9F80 +9000 +ENDCHAR +STARTCHAR 6CC9 +ENCODING 27849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +7E +41 +7E +7E +09 +EA +2C +4B +B9 +ENDCHAR +STARTCHAR 6CCA +ENCODING 27850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +1F +A1 +61 +1F +61 +61 +9F +A1 +ENDCHAR +STARTCHAR 6CCC +ENCODING 27852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +4500 +8900 +AB00 +2B00 +6C80 +A800 +9900 +AF00 +ENDCHAR +STARTCHAR 6CD3 +ENCODING 27859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BA00 +4A00 +0A00 +BA00 +A400 +3500 +4D00 +4C80 +9780 +BC80 +ENDCHAR +STARTCHAR 6CD5 +ENCODING 27861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +1F00 +8400 +4400 +3F80 +4A00 +8900 +9700 +B880 +ENDCHAR +STARTCHAR 6CD7 +ENCODING 27863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +80 +7F +2D +AD +2D +73 +B1 +BF +A1 +ENDCHAR +STARTCHAR 6CDB +ENCODING 27867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +7C00 +BF00 +4200 +0200 +4400 +A800 +B000 +CF80 +ENDCHAR +STARTCHAR 6CE1 +ENCODING 27873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5F00 +2100 +BD00 +A500 +1D00 +5300 +5000 +9080 +9F00 +ENDCHAR +STARTCHAR 6CE2 +ENCODING 27874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F80 +2480 +A400 +9F00 +2900 +6A00 +6400 +AF00 +D180 +ENDCHAR +STARTCHAR 6CE3 +ENCODING 27875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0000 +9100 +5200 +1200 +5200 +4A00 +BF80 +8000 +ENDCHAR +STARTCHAR 6CE5 +ENCODING 27877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +6100 +9F00 +A000 +2900 +6B00 +AC00 +A880 +AF00 +ENDCHAR +STARTCHAR 6CE8 +ENCODING 27880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +C800 +4400 +1F00 +C400 +0400 +5F00 +4400 +8400 +BF80 +ENDCHAR +STARTCHAR 6CEB +ENCODING 27883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F80 +8800 +AA00 +1C00 +4E00 +4900 +8B00 +BC80 +ENDCHAR +STARTCHAR 6CEE +ENCODING 27886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5600 +1500 +A480 +5F00 +0400 +7F80 +8400 +8400 +8400 +ENDCHAR +STARTCHAR 6CEF +ENCODING 27887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6100 +BF00 +6400 +2400 +7F00 +A400 +AA80 +F100 +ENDCHAR +STARTCHAR 6CF0 +ENCODING 27888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1000 +7F00 +FF80 +4A00 +AD80 +0800 +FE00 +1900 +ENDCHAR +STARTCHAR 6CF3 +ENCODING 27891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8C00 +4000 +9D00 +8500 +3600 +5600 +9500 +A480 +8C00 +ENDCHAR +STARTCHAR 6D0B +ENCODING 27915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +4A00 +3F00 +8400 +9F00 +0400 +7F80 +8400 +8400 +8400 +ENDCHAR +STARTCHAR 6D0C +ENCODING 27916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +81 +79 +13 +9B +AB +3B +4B +93 +B1 +A3 +ENDCHAR +STARTCHAR 6D11 +ENCODING 27921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +5300 +1200 +AF80 +A200 +6600 +6600 +A500 +A900 +A880 +ENDCHAR +STARTCHAR 6D17 +ENCODING 27927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5400 +1F00 +A400 +8400 +3F80 +4A00 +9200 +9280 +A300 +ENDCHAR +STARTCHAR 6D19 +ENCODING 27929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5400 +1F00 +A400 +7F80 +0C00 +4E00 +5500 +A480 +8400 +ENDCHAR +STARTCHAR 6D1B +ENCODING 27931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5F00 +1200 +AA00 +8E00 +3180 +5F00 +9100 +9F00 +9100 +ENDCHAR +STARTCHAR 6D1E +ENCODING 27934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +61 +3F +A1 +2F +6B +AF +A1 +A3 +ENDCHAR +STARTCHAR 6D25 +ENCODING 27941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +0500 +BF80 +5F00 +0400 +7F00 +BF80 +8400 +8400 +ENDCHAR +STARTCHAR 6D27 +ENCODING 27943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +7F80 +0800 +9F00 +7100 +3F00 +5100 +5F00 +9100 +9300 +ENDCHAR +STARTCHAR 6D29 +ENCODING 27945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4800 +3F00 +BF00 +A500 +3F00 +4500 +4600 +9A80 +A100 +ENDCHAR +STARTCHAR 6D2A +ENCODING 27946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +4A00 +3F00 +8A00 +4A00 +0A00 +7F80 +4A00 +B100 +A080 +ENDCHAR +STARTCHAR 6D32 +ENCODING 27954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +95 +55 +15 +BF +7F +5D +55 +95 +A5 +A1 +ENDCHAR +STARTCHAR 6D35 +ENCODING 27957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +D0 +50 +1F +BD +75 +1D +55 +5D +81 +87 +ENDCHAR +STARTCHAR 6D36 +ENCODING 27958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +90 +5F +21 +B5 +6B +2B +77 +7F +A1 +83 +ENDCHAR +STARTCHAR 6D38 +ENCODING 27960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +6500 +1500 +9600 +BF80 +0A00 +4A00 +5200 +B280 +A300 +ENDCHAR +STARTCHAR 6D39 +ENCODING 27961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +4000 +9F00 +5100 +1F00 +5100 +5F00 +8000 +BF80 +ENDCHAR +STARTCHAR 6D3B +ENCODING 27963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +7C00 +0400 +BF80 +4400 +1F00 +5100 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6D3D +ENCODING 27965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CC00 +4A00 +1100 +A080 +5E00 +0000 +5F00 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6D3E +ENCODING 27966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +7C00 +2B00 +AC00 +2A80 +6B00 +AA00 +AF00 +D880 +ENDCHAR +STARTCHAR 6D41 +ENCODING 27969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0A00 +9700 +7900 +1A00 +5A00 +5A00 +AA80 +AB00 +ENDCHAR +STARTCHAR 6D59 +ENCODING 27993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +5600 +3C00 +9400 +9780 +3D00 +5500 +9500 +9900 +A900 +ENDCHAR +STARTCHAR 6D5A +ENCODING 27994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C800 +4900 +3F00 +8C80 +7B00 +0800 +5F00 +6A00 +8E00 +B180 +ENDCHAR +STARTCHAR 6D5C +ENCODING 27996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +5C00 +1000 +9F00 +1200 +7F80 +9200 +B100 +A080 +ENDCHAR +STARTCHAR 6D63 +ENCODING 28003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2080 +9E00 +4000 +3F00 +4A00 +9200 +9280 +A300 +ENDCHAR +STARTCHAR 6D66 +ENCODING 28006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8600 +4500 +3F80 +9F00 +6500 +1F00 +6500 +5F00 +A500 +A700 +ENDCHAR +STARTCHAR 6D69 +ENCODING 28009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +5400 +1F00 +A400 +7F80 +0400 +5F00 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6D6A +ENCODING 28010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +5F +21 +9F +61 +1F +65 +A6 +AF +B1 +ENDCHAR +STARTCHAR 6D6C +ENCODING 28012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +6500 +1F00 +A500 +1F00 +4400 +7F00 +8400 +BF80 +ENDCHAR +STARTCHAR 6D6E +ENCODING 28014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +5D00 +2500 +A080 +9F00 +0400 +7F80 +4400 +8400 +8C00 +ENDCHAR +STARTCHAR 6D74 +ENCODING 28020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8A00 +5300 +2D00 +8A00 +1100 +7E80 +9100 +9E00 +9100 +ENDCHAR +STARTCHAR 6D77 +ENCODING 28023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5F80 +2000 +BF00 +9500 +3F80 +6900 +BF80 +A100 +8600 +ENDCHAR +STARTCHAR 6D78 +ENCODING 28024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +4100 +3F80 +8000 +3F00 +7F00 +4A00 +8E00 +B100 +ENDCHAR +STARTCHAR 6D79 +ENCODING 28025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0400 +9500 +D500 +2E80 +6A00 +4A00 +9100 +A080 +ENDCHAR +STARTCHAR 6D7F +ENCODING 28031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9F00 +9100 +1F00 +5100 +9F00 +9200 +A180 +ENDCHAR +STARTCHAR 6D85 +ENCODING 28037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +1F00 +DF00 +0000 +4400 +5F00 +8400 +BF80 +ENDCHAR +STARTCHAR 6D87 +ENCODING 28039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +5500 +AA00 +6A00 +1500 +4000 +BF00 +8400 +BF80 +ENDCHAR +STARTCHAR 6D88 +ENCODING 28040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5700 +2480 +BF00 +A100 +1F00 +6100 +5F00 +A100 +A300 +ENDCHAR +STARTCHAR 6D89 +ENCODING 28041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5700 +1400 +9400 +BF80 +1500 +5500 +6E00 +8C00 +B000 +ENDCHAR +STARTCHAR 6D8C +ENCODING 28044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +9F +4A +04 +DF +1F +65 +5F +A5 +A7 +ENDCHAR +STARTCHAR 6D8D +ENCODING 28045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +0600 +BF80 +8400 +1E00 +7F80 +4400 +8400 +8C00 +ENDCHAR +STARTCHAR 6D8E +ENCODING 28046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B100 +5600 +A200 +B700 +1600 +7600 +9780 +B000 +AF80 +ENDCHAR +STARTCHAR 6D91 +ENCODING 28049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0400 +9F00 +9500 +1F00 +4C00 +9700 +A480 +8400 +ENDCHAR +STARTCHAR 6D93 +ENCODING 28051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +DF +51 +9F +5F +11 +5F +5F +91 +93 +ENDCHAR +STARTCHAR 6D95 +ENCODING 28053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +4A00 +3F00 +8500 +9F00 +2400 +7F80 +4C80 +9700 +A400 +ENDCHAR +STARTCHAR 6DAF +ENCODING 28079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +6400 +AF00 +A400 +3F00 +6400 +AF00 +A400 +DF80 +ENDCHAR +STARTCHAR 6DB2 +ENCODING 28082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +1400 +9700 +A500 +2F00 +5E00 +9600 +9D00 +9880 +ENDCHAR +STARTCHAR 6DB5 +ENCODING 28085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +4800 +2D00 +B700 +2500 +6F00 +B500 +BF00 +A100 +ENDCHAR +STARTCHAR 6DC0 +ENCODING 28096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2080 +9F00 +4400 +1400 +5700 +9400 +AC00 +C780 +ENDCHAR +STARTCHAR 6DC3 +ENCODING 28099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9600 +6900 +3F00 +8C00 +BF80 +1F00 +7280 +9600 +9100 +9F00 +ENDCHAR +STARTCHAR 6DC4 +ENCODING 28100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9480 +5500 +1500 +9480 +4000 +1F00 +5500 +5F00 +9F00 +9100 +ENDCHAR +STARTCHAR 6DC5 +ENCODING 28101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +5700 +3C00 +9400 +B780 +3D00 +5D00 +9500 +9500 +9900 +ENDCHAR +STARTCHAR 6DC6 +ENCODING 28102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9B00 +4600 +3900 +BF80 +5000 +1F00 +7F00 +B100 +9F00 +9300 +ENDCHAR +STARTCHAR 6DC7 +ENCODING 28103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F00 +1200 +9E00 +5200 +1E00 +5200 +7F80 +9200 +A180 +ENDCHAR +STARTCHAR 6DCB +ENCODING 28107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +5200 +3F00 +9200 +BA00 +3F00 +5700 +9A80 +9200 +9200 +ENDCHAR +STARTCHAR 6DCF +ENCODING 28111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9F00 +4000 +3F80 +4400 +7F00 +8A00 +B180 +ENDCHAR +STARTCHAR 6DD1 +ENCODING 28113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5700 +1D00 +9500 +BB00 +3B00 +5A00 +D700 +9700 +B480 +ENDCHAR +STARTCHAR 6DD8 +ENCODING 28120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +90 +5F +31 +9D +A9 +3F +6B +BF +A1 +87 +ENDCHAR +STARTCHAR 6DD9 +ENCODING 28121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2080 +9F00 +4000 +3F00 +5500 +5500 +A480 +8C00 +ENDCHAR +STARTCHAR 6DDA +ENCODING 28122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +7E00 +3F00 +A100 +BF00 +2500 +7F80 +A400 +CA00 +F180 +ENDCHAR +STARTCHAR 6DDE +ENCODING 28126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9300 +5500 +3500 +B500 +BA80 +2C00 +9500 +9500 +9700 +9C80 +ENDCHAR +STARTCHAR 6DE1 +ENCODING 28129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +5500 +1E00 +9A00 +7100 +1500 +5600 +5C00 +9B00 +A180 +ENDCHAR +STARTCHAR 6DE8 +ENCODING 28136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8200 +5D00 +2500 +9F00 +3F80 +4500 +5F00 +8400 +9800 +ENDCHAR +STARTCHAR 6DEA +ENCODING 28138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8C00 +5300 +3E80 +8000 +BF00 +2B00 +6B00 +7F00 +AB00 +AB00 +ENDCHAR +STARTCHAR 6DEB +ENCODING 28139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8200 +5D00 +2900 +A480 +9F00 +0400 +7F80 +8400 +8400 +BF00 +ENDCHAR +STARTCHAR 6DEE +ENCODING 28142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +5400 +1F00 +B400 +BF00 +1400 +5F00 +5400 +9F80 +9000 +ENDCHAR +STARTCHAR 6DF1 +ENCODING 28145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6D00 +9500 +7300 +0400 +7B00 +8E00 +9580 +A400 +ENDCHAR +STARTCHAR 6DF3 +ENCODING 28147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +1F00 +9F00 +8000 +1F00 +4200 +7F80 +8400 +8C00 +ENDCHAR +STARTCHAR 6DF5 +ENCODING 28149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +AB +6B +1B +A1 +5F +21 +7B +6B +AB +CB +ENDCHAR +STARTCHAR 6DF7 +ENCODING 28151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6100 +3F00 +FF00 +2400 +6500 +5E00 +9C80 +B300 +ENDCHAR +STARTCHAR 6DF8 +ENCODING 28152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +1F00 +BF80 +8000 +1F00 +5500 +5F00 +9100 +9300 +ENDCHAR +STARTCHAR 6DF9 +ENCODING 28153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +7F00 +1200 +BF00 +A580 +1F00 +5500 +9F00 +8480 +8700 +ENDCHAR +STARTCHAR 6DFA +ENCODING 28154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +4F00 +3900 +8680 +BB00 +0F00 +7F00 +4600 +8E80 +B100 +ENDCHAR +STARTCHAR 6DFB +ENCODING 28155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8700 +7800 +3F80 +8A00 +9300 +2980 +4900 +AD00 +AA80 +BA00 +ENDCHAR +STARTCHAR 6E17 +ENCODING 28183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +5F00 +0200 +A300 +BF80 +1600 +6B80 +BD00 +9600 +B800 +ENDCHAR +STARTCHAR 6E19 +ENCODING 28185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5C00 +3F00 +AD00 +5B00 +1500 +7F80 +8C00 +9B00 +A180 +ENDCHAR +STARTCHAR 6E1A +ENCODING 28186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5F00 +0A00 +BF80 +4600 +1F00 +7100 +5F00 +9F00 +9100 +ENDCHAR +STARTCHAR 6E1B +ENCODING 28187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +7F80 +2200 +BF00 +A300 +3B00 +B600 +BA00 +C580 +C900 +ENDCHAR +STARTCHAR 6E1F +ENCODING 28191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +1F00 +9F00 +4000 +3F00 +7F00 +8400 +8400 +8C00 +ENDCHAR +STARTCHAR 6E20 +ENCODING 28192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5F00 +D100 +7F00 +DF00 +0800 +FF00 +1600 +6980 +8800 +ENDCHAR +STARTCHAR 6E21 +ENCODING 28193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +2A00 +BF80 +AE00 +2000 +7F00 +AA00 +CE00 +D100 +ENDCHAR +STARTCHAR 6E23 +ENCODING 28195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0C00 +9700 +A480 +1F00 +5F00 +9100 +9F00 +BF80 +ENDCHAR +STARTCHAR 6E24 +ENCODING 28196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +92 +BA +17 +BB +BB +0B +5B +F5 +95 +BB +ENDCHAR +STARTCHAR 6E25 +ENCODING 28197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6100 +BF00 +7F00 +2900 +7F00 +BF00 +A400 +DF80 +ENDCHAR +STARTCHAR 6E26 +ENCODING 28198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +9E +51 +16 +95 +3F +6F +AF +A9 +A3 +ENDCHAR +STARTCHAR 6E2B +ENCODING 28203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9500 +7F80 +1500 +9600 +5F00 +0400 +7F80 +8C00 +9700 +A480 +ENDCHAR +STARTCHAR 6E2C +ENCODING 28204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +B9 +6B +3B +AB +BB +2B +7B +81 +A9 +A7 +ENDCHAR +STARTCHAR 6E2D +ENCODING 28205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +9F +65 +9F +80 +1F +5F +5F +91 +93 +ENDCHAR +STARTCHAR 6E2F +ENCODING 28207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F00 +1200 +BF80 +9200 +3F00 +7280 +9E00 +9100 +9F00 +ENDCHAR +STARTCHAR 6E32 +ENCODING 28210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3E80 +8000 +9F00 +1100 +5F00 +5F00 +8000 +BF80 +ENDCHAR +STARTCHAR 6E34 +ENCODING 28212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +9F +5F +91 +9F +1F +65 +AB +9F +83 +ENDCHAR +STARTCHAR 6E36 +ENCODING 28214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +0E00 +9F00 +9500 +1500 +7F80 +8C00 +9300 +A180 +ENDCHAR +STARTCHAR 6E38 +ENCODING 28216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +5400 +3F80 +A700 +B900 +2A00 +6F80 +AA00 +AA00 +D600 +ENDCHAR +STARTCHAR 6E3A +ENCODING 28218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8200 +7300 +3700 +B680 +3A80 +3300 +5700 +B200 +B400 +8800 +ENDCHAR +STARTCHAR 6E3C +ENCODING 28220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F00 +0400 +9F00 +BF80 +0000 +7F00 +8C00 +9200 +E180 +ENDCHAR +STARTCHAR 6E3D +ENCODING 28221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7B00 +1200 +BF80 +8200 +3B00 +6B00 +BA00 +A680 +8D00 +ENDCHAR +STARTCHAR 6E3E +ENCODING 28222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6480 +1F00 +DF00 +1F00 +6500 +5F00 +BF80 +8400 +ENDCHAR +STARTCHAR 6E43 +ENCODING 28227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F80 +B200 +1700 +BA00 +1700 +7A00 +9F80 +A200 +C200 +ENDCHAR +STARTCHAR 6E44 +ENCODING 28228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +65 +3F +AF +29 +6F +AF +AF +C9 +ENDCHAR +STARTCHAR 6E4A +ENCODING 28234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +7F00 +0800 +BF00 +BF80 +1300 +6E80 +9F00 +9A00 +A100 +ENDCHAR +STARTCHAR 6E4D +ENCODING 28237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A500 +6500 +1F00 +8000 +7F80 +3F00 +6B00 +AB00 +AB00 +AB00 +ENDCHAR +STARTCHAR 6E56 +ENCODING 28246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +93 +55 +3D +93 +95 +3B +6D +BD +AD +87 +ENDCHAR +STARTCHAR 6E58 +ENCODING 28248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +97 +55 +3D +97 +B5 +3D +57 +95 +97 +95 +ENDCHAR +STARTCHAR 6E5B +ENCODING 28251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +7F80 +1100 +9E00 +9E00 +1100 +7F80 +AB00 +A800 +9F80 +ENDCHAR +STARTCHAR 6E5C +ENCODING 28252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9F00 +9F00 +3F80 +4400 +9700 +B400 +AF80 +ENDCHAR +STARTCHAR 6E5E +ENCODING 28254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4700 +0400 +9F00 +DF00 +2100 +5F00 +5F00 +9A00 +A180 +ENDCHAR +STARTCHAR 6E5F +ENCODING 28255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +1100 +9F00 +5F00 +0000 +7F00 +5F00 +8400 +BF80 +ENDCHAR +STARTCHAR 6E67 +ENCODING 28263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +4A +BF +BF +3F +44 +BF +89 +B3 +ENDCHAR +STARTCHAR 6E6B +ENCODING 28267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9A00 +7200 +1680 +BE80 +9700 +3A00 +7B00 +9500 +9500 +9480 +ENDCHAR +STARTCHAR 6E6E +ENCODING 28270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +4A00 +BF00 +6B00 +3F00 +4400 +5F00 +8400 +BF80 +ENDCHAR +STARTCHAR 6E6F +ENCODING 28271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9F00 +8000 +3F80 +5F00 +AB00 +B500 +8B00 +ENDCHAR +STARTCHAR 6E72 +ENCODING 28274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +83 +5D +25 +9F +3F +4F +5A +A6 +B9 +ENDCHAR +STARTCHAR 6E73 +ENCODING 28275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0400 +9F00 +AA80 +2E80 +6E80 +6480 +A480 +A500 +ENDCHAR +STARTCHAR 6E7A +ENCODING 28282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9F00 +5900 +2900 +AF00 +A200 +2F80 +6600 +6B00 +AA80 +A200 +ENDCHAR +STARTCHAR 6E90 +ENCODING 28304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +6400 +2F00 +AF00 +2900 +6F00 +6D00 +AD00 +D480 +ENDCHAR +STARTCHAR 6E96 +ENCODING 28310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +5F00 +B400 +3F00 +5F00 +9F00 +0800 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 6E9C +ENCODING 28316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +8F +7B +3D +A7 +1F +65 +5F +9F +A1 +ENDCHAR +STARTCHAR 6E9D +ENCODING 28317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F00 +3F00 +BF80 +8400 +1F00 +7F80 +A580 +9F00 +9300 +ENDCHAR +STARTCHAR 6E9F +ENCODING 28319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF00 +6080 +3F00 +9100 +9F00 +1F00 +7F80 +4000 +9300 +A180 +ENDCHAR +STARTCHAR 6EA2 +ENCODING 28322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8E00 +5300 +3F00 +8E00 +1200 +6100 +BF00 +AD00 +BF80 +ENDCHAR +STARTCHAR 6EA5 +ENCODING 28325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8500 +7F80 +1F00 +A500 +5F00 +1F00 +4200 +BF80 +8A00 +8600 +ENDCHAR +STARTCHAR 6EAA +ENCODING 28330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +6500 +AE80 +5500 +0F00 +7E00 +BF80 +9A00 +E180 +ENDCHAR +STARTCHAR 6EAB +ENCODING 28331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5500 +1D00 +9F00 +0000 +7F00 +6B00 +AB00 +BF80 +ENDCHAR +STARTCHAR 6EAF +ENCODING 28335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +AB +6B +3B +BB +3B +7B +95 +95 +A7 +ENDCHAR +STARTCHAR 6EB1 +ENCODING 28337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +1F00 +8A00 +BF80 +1F00 +7F80 +8C00 +9600 +A500 +ENDCHAR +STARTCHAR 6EB6 +ENCODING 28342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2A80 +9100 +AC00 +1300 +7F80 +5100 +9100 +9F00 +ENDCHAR +STARTCHAR 6EBA +ENCODING 28346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +49 +BF +A4 +3F +6D +BB +CD +9B +ENDCHAR +STARTCHAR 6EC2 +ENCODING 28354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +7F +12 +BF +A5 +3F +48 +8F +91 +A6 +ENDCHAR +STARTCHAR 6EC4 +ENCODING 28356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8C00 +4B00 +1F80 +BF00 +9100 +1F00 +5F00 +7F00 +B100 +BF00 +ENDCHAR +STARTCHAR 6EC5 +ENCODING 28357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +4300 +3F80 +BC00 +AB00 +2F00 +AB00 +AA00 +D680 +D580 +ENDCHAR +STARTCHAR 6EC9 +ENCODING 28361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5F00 +1100 +DF00 +1500 +7F80 +4A00 +9280 +A300 +ENDCHAR +STARTCHAR 6ECB +ENCODING 28363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F80 +1200 +9200 +AA00 +2D00 +5200 +9B00 +BB00 +E680 +ENDCHAR +STARTCHAR 6ECC +ENCODING 28364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +6780 +3D00 +B600 +FD80 +7200 +7F80 +B300 +A680 +AA00 +ENDCHAR +STARTCHAR 6ECE +ENCODING 28366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B680 +DB00 +6700 +9900 +FF00 +8900 +6A00 +2C00 +4A00 +9100 +ENDCHAR +STARTCHAR 6ED1 +ENCODING 28369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5700 +9500 +7F80 +3F80 +5F00 +5100 +9F00 +9300 +ENDCHAR +STARTCHAR 6ED3 +ENCODING 28371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +7F +25 +9F +92 +3F +44 +BF +84 +84 +ENDCHAR +STARTCHAR 6ED4 +ENCODING 28372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +5D00 +2480 +A000 +1B00 +6100 +9B00 +A100 +9F00 +ENDCHAR +STARTCHAR 6EEF +ENCODING 28399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9E00 +7F00 +2E80 +AD80 +BF00 +2480 +5F00 +A500 +A700 +8400 +ENDCHAR +STARTCHAR 6EF4 +ENCODING 28404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0A00 +BF00 +A500 +3F00 +6F00 +6F00 +AB00 +A300 +ENDCHAR +STARTCHAR 6EF8 +ENCODING 28408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BC00 +4400 +3F80 +BE00 +8200 +3F80 +7A00 +AA00 +BA00 +AA00 +ENDCHAR +STARTCHAR 6EFE +ENCODING 28414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +1200 +BF80 +9100 +1E00 +5500 +7300 +9D00 +B080 +ENDCHAR +STARTCHAR 6EFF +ENCODING 28415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F80 +1E00 +8400 +BF00 +3700 +7700 +BF00 +BD00 +A500 +ENDCHAR +STARTCHAR 6F01 +ENCODING 28417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5E00 +1400 +BF00 +A500 +1F00 +5F00 +4000 +AB00 +AA80 +ENDCHAR +STARTCHAR 6F02 +ENCODING 28418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +4A00 +1F00 +9F00 +1F00 +4000 +BF80 +9500 +AC80 +ENDCHAR +STARTCHAR 6F06 +ENCODING 28422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +1C00 +A700 +8D80 +1E00 +7580 +8E00 +B700 +8D00 +ENDCHAR +STARTCHAR 6F0F +ENCODING 28431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6080 +BF00 +BF80 +3F00 +7E80 +B480 +BE80 +D500 +ENDCHAR +STARTCHAR 6F11 +ENCODING 28433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +7700 +2D00 +B600 +AF00 +3200 +7200 +B600 +AE80 +AB00 +ENDCHAR +STARTCHAR 6F14 +ENCODING 28436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3F00 +8400 +5F00 +2500 +5F00 +5F00 +9200 +A180 +ENDCHAR +STARTCHAR 6F15 +ENCODING 28437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +3F00 +AB00 +BF00 +0000 +5F00 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 6F20 +ENCODING 28448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +1F00 +A100 +9F00 +1F00 +7F80 +8C00 +9B00 +A180 +ENDCHAR +STARTCHAR 6F22 +ENCODING 28450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F80 +1E00 +9F00 +A500 +1F00 +7F00 +BF80 +8E00 +B180 +ENDCHAR +STARTCHAR 6F23 +ENCODING 28451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +A200 +6F80 +2F00 +AB00 +0F00 +6F00 +AF80 +A200 +DF80 +ENDCHAR +STARTCHAR 6F2B +ENCODING 28459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5F00 +9F00 +BF00 +3F00 +4000 +BF00 +8C00 +B380 +ENDCHAR +STARTCHAR 6F2C +ENCODING 28460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0400 +BF80 +5F00 +1100 +5F00 +9F00 +9200 +A180 +ENDCHAR +STARTCHAR 6F31 +ENCODING 28465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7A00 +1380 +BA80 +B700 +3A00 +5200 +BB00 +D500 +9480 +ENDCHAR +STARTCHAR 6F32 +ENCODING 28466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B700 +5400 +1700 +B700 +2F00 +7600 +9700 +9700 +BC80 +ENDCHAR +STARTCHAR 6F38 +ENCODING 28472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +7A00 +1400 +BC00 +BB80 +3D00 +7D00 +FD00 +9500 +9500 +ENDCHAR +STARTCHAR 6F3F +ENCODING 28479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +BF00 +FC00 +FF80 +A900 +AA00 +E900 +2E00 +4E00 +9980 +ENDCHAR +STARTCHAR 6F41 +ENCODING 28481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +AF80 +D400 +EF00 +0F00 +5900 +AF00 +DF00 +D500 +4880 +ENDCHAR +STARTCHAR 6F51 +ENCODING 28497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BD00 +6A00 +1100 +B700 +CE80 +3500 +7700 +8D00 +9300 +B580 +ENDCHAR +STARTCHAR 6F54 +ENCODING 28500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9F00 +7280 +3A80 +B700 +8A00 +1C00 +7D00 +8700 +9500 +A480 +ENDCHAR +STARTCHAR 6F57 +ENCODING 28503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +5F00 +3F00 +A700 +9F00 +0400 +7F00 +4C00 +9700 +A480 +ENDCHAR +STARTCHAR 6F58 +ENCODING 28504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +7E00 +BF80 +8E00 +1F00 +6580 +9F00 +9500 +9F00 +ENDCHAR +STARTCHAR 6F5A +ENCODING 28506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3F80 +BF00 +6F00 +3700 +7F00 +B700 +AF00 +CF00 +ENDCHAR +STARTCHAR 6F5B +ENCODING 28507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7500 +BF80 +BA80 +5580 +5F00 +9F00 +9F00 +A100 +ENDCHAR +STARTCHAR 6F5E +ENCODING 28510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B400 +5700 +5500 +BB00 +9200 +5500 +D780 +D500 +D700 +E500 +ENDCHAR +STARTCHAR 6F5F +ENCODING 28511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +BF +61 +3F +A1 +BF +1F +63 +9D +AD +A3 +ENDCHAR +STARTCHAR 6F62 +ENCODING 28514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F80 +0E00 +BF80 +4400 +1F00 +5F00 +5F00 +9A00 +A180 +ENDCHAR +STARTCHAR 6F64 +ENCODING 28516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +6D +3F +BF +3F +65 +BF +BF +A3 +ENDCHAR +STARTCHAR 6F6D +ENCODING 28525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +7F00 +3F00 +8000 +1F00 +6100 +9F00 +BF80 +8400 +ENDCHAR +STARTCHAR 6F6E +ENCODING 28526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +93 +7B +13 +BB +BB +2B +7B +BD +95 +95 +ENDCHAR +STARTCHAR 6F70 +ENCODING 28528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +1F00 +BF80 +5F00 +1F00 +5F00 +5F00 +9200 +B180 +ENDCHAR +STARTCHAR 6F7A +ENCODING 28538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7F00 +2F00 +A200 +3F80 +6000 +A900 +CF80 +DB00 +ENDCHAR +STARTCHAR 6F7C +ENCODING 28540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3F80 +8000 +9F00 +1F00 +5F00 +BF00 +8400 +BF80 +ENDCHAR +STARTCHAR 6F7D +ENCODING 28541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F00 +1B00 +9B00 +BF80 +1F00 +5100 +9F00 +9F00 +9100 +ENDCHAR +STARTCHAR 6F7E +ENCODING 28542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9500 +5600 +3F80 +8E00 +7580 +1900 +6F80 +9F80 +9100 +A100 +ENDCHAR +STARTCHAR 6F81 +ENCODING 28545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5700 +1400 +BF80 +4000 +1100 +7D80 +B500 +BD00 +E780 +ENDCHAR +STARTCHAR 6F84 +ENCODING 28548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9D00 +6A00 +1300 +AF80 +1F00 +5F00 +4000 +9200 +BF80 +ENDCHAR +STARTCHAR 6F88 +ENCODING 28552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7A00 +2B80 +BB00 +8700 +3F00 +7B00 +B900 +AB00 +AC80 +ENDCHAR +STARTCHAR 6F8D +ENCODING 28557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +7900 +3F80 +8100 +BD00 +2B00 +7900 +A900 +A900 +B300 +ENDCHAR +STARTCHAR 6F8E +ENCODING 28558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +BF00 +3A00 +8080 +B900 +3A00 +4080 +A900 +8E00 +B400 +ENDCHAR +STARTCHAR 6F90 +ENCODING 28560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +7F80 +2480 +9F00 +0000 +5F00 +7F80 +8B00 +BC80 +ENDCHAR +STARTCHAR 6F94 +ENCODING 28564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +6600 +3700 +BA00 +BF80 +3000 +5700 +B480 +B700 +A480 +ENDCHAR +STARTCHAR 6F97 +ENCODING 28567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +7F +2D +BF +3F +5F +BF +B3 +A3 +ENDCHAR +STARTCHAR 6FA3 +ENCODING 28579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7B00 +1500 +BC80 +BF00 +2A00 +7F80 +FA00 +9200 +9200 +ENDCHAR +STARTCHAR 6FA4 +ENCODING 28580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6A80 +BF00 +5F00 +3F80 +7380 +7C00 +9F00 +8400 +ENDCHAR +STARTCHAR 6FA7 +ENCODING 28583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8C00 +7F00 +3F00 +BF00 +8000 +3F80 +7F00 +BF00 +9200 +BF80 +ENDCHAR +STARTCHAR 6FAE +ENCODING 28590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8C00 +5F00 +2080 +BF00 +AF00 +3F00 +5F00 +9100 +9F00 +9F00 +ENDCHAR +STARTCHAR 6FAF +ENCODING 28591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5F00 +3B00 +EA00 +5500 +3680 +7F80 +8C00 +9700 +A580 +ENDCHAR +STARTCHAR 6FB1 +ENCODING 28593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BB00 +4B00 +3D80 +AD80 +3F00 +AB00 +BA00 +DB00 +E480 +ENDCHAR +STARTCHAR 6FB3 +ENCODING 28595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3F00 +BF00 +6D00 +3700 +4400 +BF80 +9A00 +A180 +ENDCHAR +STARTCHAR 6FB9 +ENCODING 28601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +7E00 +3F80 +B800 +AF00 +3F80 +6F00 +A000 +AF00 +CF00 +ENDCHAR +STARTCHAR 6FBE +ENCODING 28606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +5F00 +0F80 +A500 +5F00 +2F00 +6200 +AF80 +B200 +AF80 +ENDCHAR +STARTCHAR 6FC0 +ENCODING 28608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7A00 +3B80 +BD00 +9500 +7F00 +A300 +B900 +AB00 +DC80 +ENDCHAR +STARTCHAR 6FC1 +ENCODING 28609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +6D +3F +9F +29 +7F +BF +BB +83 +ENDCHAR +STARTCHAR 6FC2 +ENCODING 28610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +3C00 +BF80 +BF00 +3F80 +BF00 +DB00 +EA80 +CA00 +ENDCHAR +STARTCHAR 6FC3 +ENCODING 28611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F00 +3F00 +BF00 +BF80 +2000 +7F00 +BF80 +AF00 +D980 +ENDCHAR +STARTCHAR 6FCA +ENCODING 28618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5700 +3F80 +8300 +BF80 +3E00 +7F00 +AE00 +AA80 +D500 +ENDCHAR +STARTCHAR 6FD5 +ENCODING 28629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +6100 +1F00 +9F00 +2700 +5B00 +BF80 +AD00 +CA80 +ENDCHAR +STARTCHAR 6FDA +ENCODING 28634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9900 +7F00 +1B00 +AC80 +BF00 +2480 +7F00 +4C00 +9700 +A480 +ENDCHAR +STARTCHAR 6FDF +ENCODING 28639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF80 +4000 +3B00 +B700 +B780 +1100 +5F00 +BF00 +A100 +A100 +ENDCHAR +STARTCHAR 6FE0 +ENCODING 28640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF80 +4000 +1F00 +9F00 +BF80 +3F80 +5B00 +6700 +9D00 +AC80 +ENDCHAR +STARTCHAR 6FE1 +ENCODING 28641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7F80 +3F80 +9F00 +0000 +7F80 +BF00 +AB00 +AB00 +ENDCHAR +STARTCHAR 6FE4 +ENCODING 28644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0000 +BF80 +BF00 +0000 +7F80 +BF80 +AD00 +BB00 +ENDCHAR +STARTCHAR 6FE9 +ENCODING 28649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +1C00 +A700 +BF00 +1F00 +4000 +BF00 +8C00 +B380 +ENDCHAR +STARTCHAR 6FEB +ENCODING 28651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BA00 +7380 +BC00 +7800 +3B80 +4000 +BF00 +AB00 +BF80 +ENDCHAR +STARTCHAR 6FEC +ENCODING 28652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2080 +BF00 +6B00 +1E00 +7180 +5F00 +9F00 +9100 +ENDCHAR +STARTCHAR 6FEF +ENCODING 28655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +5A80 +BF00 +BC80 +1F00 +6400 +BF00 +9C00 +9F80 +ENDCHAR +STARTCHAR 6FF1 +ENCODING 28657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3F00 +9700 +6E00 +3F00 +5100 +5F00 +9A00 +A180 +ENDCHAR +STARTCHAR 6FFE +ENCODING 28670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4F00 +3F80 +BD00 +AF00 +3500 +7F00 +AE00 +DD00 +EE80 +ENDCHAR +STARTCHAR 7001 +ENCODING 28673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F00 +1F00 +8400 +BF80 +1100 +7E80 +5E00 +9500 +BF00 +ENDCHAR +STARTCHAR 7005 +ENCODING 28677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BE80 +5F00 +1300 +AD00 +BF80 +3F80 +4400 +9F00 +8600 +BF00 +ENDCHAR +STARTCHAR 7006 +ENCODING 28678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0000 +BF00 +7F00 +1F00 +6100 +7F00 +9E00 +B380 +ENDCHAR +STARTCHAR 7009 +ENCODING 28681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +3F80 +9100 +9F00 +1F00 +5F00 +AE80 +AF00 +A300 +ENDCHAR +STARTCHAR 700B +ENCODING 28683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3E80 +9600 +FF00 +1600 +7F80 +9500 +9F00 +9F00 +ENDCHAR +STARTCHAR 700F +ENCODING 28687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +9D +AF +5F +FF +93 +2B +BF +FF +BD +F1 +ENDCHAR +STARTCHAR 7011 +ENCODING 28689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5F00 +1F00 +8A00 +3F00 +7F80 +B680 +9E00 +BD00 +ENDCHAR +STARTCHAR 7015 +ENCODING 28693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9780 +7A00 +3700 +BF00 +3500 +7F00 +DF00 +9500 +A480 +ENDCHAR +STARTCHAR 7018 +ENCODING 28696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4E00 +3F00 +BD80 +BF00 +3F00 +7500 +AA00 +DF00 +FF80 +ENDCHAR +STARTCHAR 701A +ENCODING 28698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +F700 +2500 +B580 +B500 +5500 +BA80 +FD00 +AA80 +A500 +ENDCHAR +STARTCHAR 701B +ENCODING 28699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +7F80 +0000 +BF00 +BF00 +2B00 +AF00 +D700 +FF80 +ED80 +ENDCHAR +STARTCHAR 701C +ENCODING 28700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BA00 +4200 +3B00 +BE80 +8680 +3E80 +DB00 +BB00 +DB80 +CE80 +ENDCHAR +STARTCHAR 701D +ENCODING 28701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6900 +BB00 +BF00 +2D80 +A900 +D400 +D700 +FF80 +ENDCHAR +STARTCHAR 701E +ENCODING 28702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +BF00 +3A80 +F800 +8700 +3F80 +DF00 +BB00 +CA00 +DE00 +ENDCHAR +STARTCHAR 701F +ENCODING 28703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7F80 +3F00 +BF80 +BF00 +3700 +7700 +BF00 +B700 +D700 +ENDCHAR +STARTCHAR 7023 +ENCODING 28707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5F00 +3B00 +D300 +A480 +0C00 +7B00 +BB00 +8C00 +BF80 +ENDCHAR +STARTCHAR 7027 +ENCODING 28711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +7B80 +2B00 +B880 +BB00 +2B00 +7B00 +BB00 +AC80 +BB00 +ENDCHAR +STARTCHAR 7028 +ENCODING 28712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9700 +BA80 +1500 +BF00 +BD00 +3F00 +5700 +BF00 +DD00 +9480 +ENDCHAR +STARTCHAR 702F +ENCODING 28719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9A80 +7F00 +1300 +AD00 +BF80 +3F80 +5F00 +7F00 +A100 +BF00 +ENDCHAR +STARTCHAR 7037 +ENCODING 28727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7B00 +AF00 +BF00 +3F00 +7F00 +BF00 +BF80 +B300 +ENDCHAR +STARTCHAR 703E +ENCODING 28734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +7F +2D +BF +3F +7B +BF +B7 +A5 +ENDCHAR +STARTCHAR 704C +ENCODING 28748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF80 +4A00 +3B00 +BB00 +9000 +1F00 +7F00 +A700 +9C00 +9F80 +ENDCHAR +STARTCHAR 7050 +ENCODING 28752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BE80 +7F00 +1B00 +AD00 +BF80 +0A00 +7F00 +BF00 +9600 +BF00 +ENDCHAR +STARTCHAR 7051 +ENCODING 28753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7F00 +3E80 +BF80 +3F00 +7F00 +BB00 +BA80 +D300 +ENDCHAR +STARTCHAR 7058 +ENCODING 28760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AB00 +FD00 +3780 +BD00 +DF00 +3D00 +BF00 +FD00 +B780 +CC00 +ENDCHAR +STARTCHAR 705D +ENCODING 28765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +7A00 +3F00 +FF00 +0500 +7F00 +BF00 +BB00 +F480 +ENDCHAR +STARTCHAR 7063 +ENCODING 28771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AD00 +6F00 +3180 +EF00 +FF80 +0000 +7F00 +BF00 +8100 +8300 +ENDCHAR +STARTCHAR 706B +ENCODING 28779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +49 +49 +5A +9A +14 +26 +43 +81 +ENDCHAR +STARTCHAR 7070 +ENCODING 28784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF80 +4800 +4800 +5900 +6E00 +6C00 +9200 +B300 +C100 +ENDCHAR +STARTCHAR 7078 +ENCODING 28792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +3C +44 +98 +66 +C9 +4A +5C +66 +C1 +ENDCHAR +STARTCHAR 707C +ENCODING 28796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +48 +EF +D1 +D1 +4F +41 +61 +A1 +87 +ENDCHAR +STARTCHAR 707D +ENCODING 28797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +5200 +5200 +2900 +4900 +5A00 +1400 +6200 +8180 +ENDCHAR +STARTCHAR 7085 +ENCODING 28805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4100 +7E00 +7E00 +4900 +4A00 +9A00 +6600 +C180 +ENDCHAR +STARTCHAR 708A +ENCODING 28810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +EF00 +ED00 +D500 +4400 +4A00 +AA00 +B100 +A080 +ENDCHAR +STARTCHAR 708E +ENCODING 28814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +4A +5A +66 +C9 +4A +5A +54 +63 +80 +ENDCHAR +STARTCHAR 7092 +ENCODING 28818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4500 +ED00 +ED00 +D480 +5500 +4D00 +A200 +AC00 +B000 +ENDCHAR +STARTCHAR 7098 +ENCODING 28824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4C00 +E800 +EF80 +CA00 +4A00 +5200 +B200 +B200 +A200 +ENDCHAR +STARTCHAR 7099 +ENCODING 28825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +3F00 +7600 +A800 +7900 +CA00 +4A00 +5400 +6200 +C180 +ENDCHAR +STARTCHAR 709A +ENCODING 28826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +B480 +B500 +F500 +A600 +AA00 +E900 +B100 +1080 +ENDCHAR +STARTCHAR 70A1 +ENCODING 28833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +E200 +EA00 +CB00 +4A00 +4A00 +6A00 +AA00 +9F80 +ENDCHAR +STARTCHAR 70A4 +ENCODING 28836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +45 +E9 +C9 +D3 +5F +51 +B1 +BF +91 +ENDCHAR +STARTCHAR 70AB +ENCODING 28843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2200 +2200 +7FC0 +6200 +AC80 +2500 +2280 +5280 +55C0 +4E40 +ENDCHAR +STARTCHAR 70AC +ENCODING 28844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +F000 +CF00 +D100 +5100 +4F00 +B000 +B000 +9F80 +ENDCHAR +STARTCHAR 70AD +ENCODING 28845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +89 +89 +FF +FF +88 +A9 +AA +B6 +B2 +C1 +ENDCHAR +STARTCHAR 70AF +ENCODING 28847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +51 +F1 +F7 +DB +5B +57 +BB +B1 +93 +ENDCHAR +STARTCHAR 70B3 +ENCODING 28851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +E400 +DF00 +D500 +5B00 +7900 +B100 +9100 +9300 +ENDCHAR +STARTCHAR 70B7 +ENCODING 28855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4200 +FF00 +C400 +C400 +5F00 +4400 +6400 +A400 +9F80 +ENDCHAR +STARTCHAR 70B8 +ENCODING 28856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +EF80 +D400 +D700 +4400 +4780 +6400 +9400 +8400 +ENDCHAR +STARTCHAR 70B9 +ENCODING 28857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +0F00 +1000 +1000 +7E00 +4100 +7E00 +8000 +A500 +A480 +ENDCHAR +STARTCHAR 70C8 +ENCODING 28872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4500 +7500 +9500 +D500 +6100 +8300 +4500 +9500 +9480 +ENDCHAR +STARTCHAR 70CB +ENCODING 28875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +4400 +FF00 +CE00 +5500 +6480 +4400 +6500 +9500 +9480 +ENDCHAR +STARTCHAR 70CF +ENCODING 28879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +4000 +7F80 +7F00 +8D00 +AB00 +A300 +ENDCHAR +STARTCHAR 70D8 +ENCODING 28888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4A00 +FF00 +CA00 +CA00 +4A00 +5F80 +AA00 +B100 +9080 +ENDCHAR +STARTCHAR 70D9 +ENCODING 28889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +FA00 +D600 +CF00 +5980 +4F00 +B100 +AF00 +9100 +ENDCHAR +STARTCHAR 70DD +ENCODING 28893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +0400 +ED00 +2E00 +4B00 +9900 +7E00 +9500 +9480 +ENDCHAR +STARTCHAR 70DF +ENCODING 28895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +F5 +DF +D5 +55 +5B +B9 +BF +91 +ENDCHAR +STARTCHAR 70F1 +ENCODING 28913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +57 +FB +DB +D1 +5F +5B +BF +99 +93 +ENDCHAR +STARTCHAR 70F9 +ENCODING 28921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +7E00 +0000 +FF00 +0800 +1900 +A500 +A480 +ENDCHAR +STARTCHAR 70FD +ENCODING 28925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F00 +F600 +CE00 +D580 +5F00 +4F00 +BF80 +A400 +8400 +ENDCHAR +STARTCHAR 7104 +ENCODING 28932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF80 +1200 +7E00 +7F00 +A100 +3F00 +A500 +9480 +ENDCHAR +STARTCHAR 7109 +ENCODING 28937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +2E +28 +FF +3F +7F +01 +AD +A3 +ENDCHAR +STARTCHAR 710C +ENCODING 28940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4900 +FE00 +CA80 +D700 +4800 +5F00 +BA00 +A600 +9980 +ENDCHAR +STARTCHAR 7119 +ENCODING 28953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +E900 +CA00 +DF80 +4000 +4F00 +B100 +AF00 +9100 +ENDCHAR +STARTCHAR 711A +ENCODING 28954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +6600 +BB00 +A280 +4900 +4A00 +9A00 +2600 +C100 +ENDCHAR +STARTCHAR 711E +ENCODING 28958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4000 +FF00 +DF00 +C000 +5F00 +4600 +BF80 +A400 +8C00 +ENDCHAR +STARTCHAR 7121 +ENCODING 28961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +D600 +D600 +FF80 +5600 +FF00 +4100 +A500 +9480 +ENDCHAR +STARTCHAR 7126 +ENCODING 28966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +7F +C8 +FF +4F +78 +7F +00 +65 +95 +ENDCHAR +STARTCHAR 7130 +ENCODING 28976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +4F +E9 +D3 +DC +5B +51 +BB +BF +91 +ENDCHAR +STARTCHAR 7136 +ENCODING 28982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +7500 +5F80 +A400 +2600 +4900 +9080 +5500 +9500 +9480 +ENDCHAR +STARTCHAR 7147 +ENCODING 28999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +6480 +FF00 +DF00 +D500 +5F00 +5F00 +BF80 +8400 +8400 +ENDCHAR +STARTCHAR 7149 +ENCODING 29001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E400 +DF00 +DE80 +5480 +5F00 +BD00 +A480 +8400 +ENDCHAR +STARTCHAR 714A +ENCODING 29002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +EF00 +C000 +DF00 +5100 +5F00 +DF00 +A000 +BF80 +ENDCHAR +STARTCHAR 714C +ENCODING 29004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F100 +FF00 +DF00 +4000 +5F00 +DF00 +A400 +BF80 +ENDCHAR +STARTCHAR 714E +ENCODING 29006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0100 +F500 +F500 +B500 +9100 +9100 +A500 +9480 +ENDCHAR +STARTCHAR 7150 +ENCODING 29008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +EE00 +DF00 +D500 +5500 +5F80 +6400 +BB00 +B080 +ENDCHAR +STARTCHAR 7156 +ENCODING 29014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5F00 +F480 +DF00 +C800 +5F80 +4F00 +B500 +9700 +A980 +ENDCHAR +STARTCHAR 7159 +ENCODING 29017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4600 +FF00 +DB00 +D900 +5F00 +5F00 +A400 +A400 +9F80 +ENDCHAR +STARTCHAR 715C +ENCODING 29020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +DF00 +C400 +5F00 +4900 +AA00 +AA00 +9F80 +ENDCHAR +STARTCHAR 715E +ENCODING 29022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F400 +AF80 +FD00 +1200 +FF00 +FD80 +6900 +9500 +9480 +ENDCHAR +STARTCHAR 7164 +ENCODING 29028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5F80 +EE00 +D200 +CE00 +5F00 +4C00 +B700 +A480 +8400 +ENDCHAR +STARTCHAR 7165 +ENCODING 29029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2400 +2F00 +7900 +7F80 +AD80 +2A80 +3FC0 +6200 +5580 +58C0 +ENDCHAR +STARTCHAR 7166 +ENCODING 29030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +B100 +EF00 +AB00 +EF00 +A300 +4900 +9500 +9480 +ENDCHAR +STARTCHAR 7167 +ENCODING 29031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +A500 +FB00 +AF00 +A900 +EF00 +0000 +A500 +9480 +ENDCHAR +STARTCHAR 7169 +ENCODING 29033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +EF00 +D100 +CF00 +5100 +4F00 +6F00 +AB00 +9180 +ENDCHAR +STARTCHAR 716C +ENCODING 29036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +DF00 +DF80 +4800 +5F00 +4B00 +B500 +8B00 +ENDCHAR +STARTCHAR 716E +ENCODING 29038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7D00 +1200 +FF00 +3E00 +C100 +7F00 +3E00 +A500 +9480 +ENDCHAR +STARTCHAR 717D +ENCODING 29053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +50 +FF +DF +D0 +5F +5D +F7 +BF +AD +ENDCHAR +STARTCHAR 7184 +ENCODING 29060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F100 +FF00 +DF00 +5F00 +4400 +DB00 +9900 +AE80 +ENDCHAR +STARTCHAR 7189 +ENCODING 29065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +EF00 +DF00 +D100 +5F00 +5F00 +7F00 +AA00 +9180 +ENDCHAR +STARTCHAR 718A +ENCODING 29066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +7600 +CC80 +F700 +F500 +9680 +F700 +2000 +9500 +9480 +ENDCHAR +STARTCHAR 718F +ENCODING 29071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF00 +7F00 +6D00 +7F00 +7F00 +FF80 +9500 +9480 +ENDCHAR +STARTCHAR 7192 +ENCODING 29074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BA80 +DB00 +6700 +9900 +FF00 +8B00 +5200 +5A00 +2600 +C180 +ENDCHAR +STARTCHAR 7194 +ENCODING 29076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +EA80 +D100 +DE00 +5100 +7F80 +D100 +B100 +9F00 +ENDCHAR +STARTCHAR 7199 +ENCODING 29081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +A900 +F700 +F800 +A880 +F700 +4900 +A500 +9480 +ENDCHAR +STARTCHAR 719F +ENCODING 29087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +0F00 +F500 +6500 +E500 +F780 +4980 +8500 +A500 +9480 +ENDCHAR +STARTCHAR 71A2 +ENCODING 29090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +5F00 +E600 +DD80 +C200 +7F00 +5700 +5F80 +B200 +AF80 +ENDCHAR +STARTCHAR 71AC +ENCODING 29100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +F900 +FD00 +7200 +9500 +B880 +4500 +9500 +9480 +ENDCHAR +STARTCHAR 71B1 +ENCODING 29105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +F500 +6500 +F500 +4580 +F980 +4100 +9500 +9480 +ENDCHAR +STARTCHAR 71B9 +ENCODING 29113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0000 +7E00 +7E00 +FF80 +7E00 +7E00 +A500 +9480 +ENDCHAR +STARTCHAR 71BA +ENCODING 29114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +FF00 +DF00 +D100 +4E00 +7F80 +BF00 +9F00 +9100 +ENDCHAR +STARTCHAR 71BE +ENCODING 29118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F00 +D600 +FF80 +C200 +5F00 +5F00 +BE00 +9780 +0580 +ENDCHAR +STARTCHAR 71C1 +ENCODING 29121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +7F80 +E000 +DF00 +FF80 +5500 +5F00 +DF80 +8400 +8400 +ENDCHAR +STARTCHAR 71C3 +ENCODING 29123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +5F00 +D780 +EA00 +DB00 +4D00 +5480 +A000 +9B00 +AA80 +ENDCHAR +STARTCHAR 71C8 +ENCODING 29128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5D00 +4A00 +FB00 +DF00 +E080 +5F00 +7F00 +AA00 +8A00 +BF80 +ENDCHAR +STARTCHAR 71C9 +ENCODING 29129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +7E00 +BB80 +E700 +BF00 +7F00 +5300 +FD00 +D300 +1480 +ENDCHAR +STARTCHAR 71CE +ENCODING 29134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +FB00 +FF00 +F180 +5F00 +5F00 +AE00 +9500 +AC80 +ENDCHAR +STARTCHAR 71D0 +ENCODING 29136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +4D00 +FF80 +CE00 +D580 +5900 +7B80 +CF80 +B100 +A100 +ENDCHAR +STARTCHAR 71D2 +ENCODING 29138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF00 +D200 +FB00 +7780 +7F80 +CA00 +B280 +A300 +ENDCHAR +STARTCHAR 71D4 +ENCODING 29140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +ED00 +DF80 +CD00 +5F80 +5500 +BF00 +BF00 +9100 +ENDCHAR +STARTCHAR 71D5 +ENCODING 29141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3C00 +4300 +DB00 +5680 +DB00 +0100 +5500 +9480 +ENDCHAR +STARTCHAR 71DF +ENCODING 29151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +D7 +EB +55 +89 +FF +FF +7E +7F +41 +7F +ENDCHAR +STARTCHAR 71E5 +ENCODING 29157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5100 +EF00 +DB00 +DB00 +4400 +5F80 +EE00 +BD80 +A400 +ENDCHAR +STARTCHAR 71E6 +ENCODING 29158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4B80 +DF00 +EB00 +9480 +6500 +4E00 +DF80 +AE00 +9580 +ENDCHAR +STARTCHAR 71E7 +ENCODING 29159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6300 +5500 +CF00 +D600 +C500 +7B00 +5700 +BA80 +9400 +2F80 +ENDCHAR +STARTCHAR 71ED +ENCODING 29165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +5B +DF +D0 +DF +7F +5B +BF +9F +03 +ENDCHAR +STARTCHAR 71EE +ENCODING 29166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5900 +FD80 +DD00 +BB00 +9A80 +9800 +7E00 +2400 +1800 +E700 +ENDCHAR +STARTCHAR 71FB +ENCODING 29179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +5C00 +FF00 +FF00 +DF00 +5F00 +4700 +BF80 +9B00 +AA80 +ENDCHAR +STARTCHAR 71FC +ENCODING 29180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +DF80 +DF00 +DF80 +5B00 +6A80 +DF00 +BB00 +BF80 +ENDCHAR +STARTCHAR 71FE +ENCODING 29182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF80 +7F00 +FF00 +FF80 +FF00 +F700 +6500 +9480 +ENDCHAR +STARTCHAR 71FF +ENCODING 29183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +5900 +EB00 +DA80 +D200 +5F00 +7F00 +D300 +BC00 +9F80 +ENDCHAR +STARTCHAR 7200 +ENCODING 29184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +BB00 +9200 +D200 +BF80 +AF00 +AF80 +D780 +EB00 +B500 +ENDCHAR +STARTCHAR 7206 +ENCODING 29190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5100 +FF00 +DF00 +DF00 +7F80 +5500 +EE80 +AE00 +BD00 +ENDCHAR +STARTCHAR 7210 +ENCODING 29200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +9F00 +DD00 +AF00 +6F00 +6D00 +AF00 +B700 +3F80 +ENDCHAR +STARTCHAR 721B +ENCODING 29211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5B +5B +ED +DB +A5 +6F +6F +97 +A5 +ENDCHAR +STARTCHAR 722A +ENCODING 29226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0F00 +7200 +4A00 +4A00 +4A00 +4900 +4900 +8900 +8880 +ENDCHAR +STARTCHAR 722C +ENCODING 29228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5800 +B700 +B700 +B700 +B400 +B480 +AF00 +A400 +A380 +ENDCHAR +STARTCHAR 722D +ENCODING 29229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7E00 +8900 +7E00 +FF80 +0A00 +7E00 +0800 +3000 +ENDCHAR +STARTCHAR 7230 +ENCODING 29232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +7E +89 +7E +FF +3E +52 +4C +F3 +ENDCHAR +STARTCHAR 7232 +ENCODING 29234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +06 +7A +FF +42 +7E +7F +47 +B7 +D3 +ENDCHAR +STARTCHAR 7235 +ENCODING 29237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7D00 +FF00 +7F00 +0100 +FF80 +9100 +E500 +E100 +8300 +ENDCHAR +STARTCHAR 7236 +ENCODING 29238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +4300 +A300 +6400 +6400 +1800 +1800 +6600 +8180 +ENDCHAR +STARTCHAR 723A +ENCODING 29242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +E500 +1C00 +E380 +0000 +F700 +F500 +F500 +F700 +1400 +ENDCHAR +STARTCHAR 723B +ENCODING 29243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C600 +3800 +7600 +E100 +6200 +6400 +1800 +1800 +7600 +C180 +ENDCHAR +STARTCHAR 723D +ENCODING 29245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +AD00 +6A00 +8D00 +8A00 +7D00 +9400 +6200 +8180 +ENDCHAR +STARTCHAR 723E +ENCODING 29246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4A00 +FF80 +D700 +EF00 +9300 +EF00 +D700 +8B00 +ENDCHAR +STARTCHAR 7240 +ENCODING 29248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +A400 +BF00 +E600 +2600 +ED00 +AD00 +B480 +A400 +A400 +ENDCHAR +STARTCHAR 7246 +ENCODING 29254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +DF80 +D500 +DE80 +5F80 +DF00 +DF00 +DB00 +DF00 +D100 +ENDCHAR +STARTCHAR 7247 +ENCODING 29255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +4800 +7F80 +4000 +7C00 +4400 +8400 +8400 +8400 +ENDCHAR +STARTCHAR 7248 +ENCODING 29256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +57C0 +5400 +5400 +7F80 +4680 +7680 +5500 +5500 +5A80 +9C40 +ENDCHAR +STARTCHAR 724C +ENCODING 29260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +AF00 +B500 +EF00 +9500 +EF00 +AA00 +BF80 +A200 +A200 +ENDCHAR +STARTCHAR 7252 +ENCODING 29266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B500 +BF80 +B500 +F700 +8F00 +E400 +BF80 +AE00 +B580 +A400 +ENDCHAR +STARTCHAR 7258 +ENCODING 29272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +DF00 +C000 +FF00 +9F00 +DF00 +DF00 +D100 +CE00 +D980 +ENDCHAR +STARTCHAR 7259 +ENCODING 29273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2400 +2400 +FF80 +0C00 +1400 +2400 +4400 +8C00 +ENDCHAR +STARTCHAR 725B +ENCODING 29275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +4800 +7F00 +8800 +8800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 725D +ENCODING 29277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +A800 +F900 +AA00 +2C00 +7800 +E800 +2880 +2880 +2700 +ENDCHAR +STARTCHAR 725F +ENCODING 29279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2200 +FF00 +4800 +7F00 +8800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 7261 +ENCODING 29281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +C400 +F400 +CF00 +5400 +6400 +C400 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 7262 +ENCODING 29282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8900 +2800 +7E00 +4800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 7267 +ENCODING 29287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +A400 +F780 +A900 +2900 +3600 +E600 +2600 +2D00 +2880 +ENDCHAR +STARTCHAR 7269 +ENCODING 29289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +C8 +EF +D7 +5B +6B +CD +55 +49 +4F +ENDCHAR +STARTCHAR 7272 +ENCODING 29298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +CA00 +EF80 +D200 +D200 +5F00 +E200 +4200 +4200 +5F80 +ENDCHAR +STARTCHAR 7279 +ENCODING 29305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF00 +E400 +DF80 +4100 +7F80 +C900 +4900 +4100 +4600 +ENDCHAR +STARTCHAR 727D +ENCODING 29309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +3400 +FF00 +FE80 +0900 +7E00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 7280 +ENCODING 29312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +88 +BF +BF +BF +FF +88 +88 +ENDCHAR +STARTCHAR 7281 +ENCODING 29313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +15 +E5 +FD +75 +A9 +48 +7F +FF +08 +08 +ENDCHAR +STARTCHAR 72A2 +ENCODING 29346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +DF00 +E000 +DF00 +5F00 +7F00 +DF00 +5100 +5F00 +5980 +ENDCHAR +STARTCHAR 72A7 +ENCODING 29351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +DF00 +FF00 +FF80 +5F00 +FF80 +DF00 +5F00 +4780 +5D00 +ENDCHAR +STARTCHAR 72AC +ENCODING 29356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0C00 +0A00 +0900 +FF00 +0800 +1800 +1400 +2200 +C300 +8080 +ENDCHAR +STARTCHAR 72AF +ENCODING 29359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A000 +6F00 +C900 +C900 +4900 +AB00 +A800 +2800 +2880 +CF00 +ENDCHAR +STARTCHAR 72C0 +ENCODING 29376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A500 +A500 +A400 +FF80 +2400 +E600 +A600 +A900 +A900 +B080 +ENDCHAR +STARTCHAR 72C2 +ENCODING 29378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A000 +5F00 +C400 +C400 +2400 +7F00 +A400 +A400 +2400 +DF80 +ENDCHAR +STARTCHAR 72C4 +ENCODING 29380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +6400 +4C80 +B500 +3500 +6600 +A600 +2900 +2900 +D080 +ENDCHAR +STARTCHAR 72CE +ENCODING 29390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +55 +D5 +DF +55 +BF +B4 +44 +C4 +ENDCHAR +STARTCHAR 72D0 +ENCODING 29392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A300 +5D00 +D500 +D500 +5500 +D500 +D500 +5700 +6E80 +E180 +ENDCHAR +STARTCHAR 72D7 +ENCODING 29399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A8 +4F +D1 +D1 +6F +D3 +AF +33 +21 +C3 +ENDCHAR +STARTCHAR 72D9 +ENCODING 29401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AF00 +4900 +C900 +CF00 +2900 +E900 +AF00 +2900 +2900 +DF80 +ENDCHAR +STARTCHAR 72E1 +ENCODING 29409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +5F00 +CA00 +D100 +3080 +EA00 +A600 +2400 +3B00 +D080 +ENDCHAR +STARTCHAR 72E9 +ENCODING 29417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A4 +5F +D1 +C2 +5F +A2 +AA +2A +42 +C6 +ENDCHAR +STARTCHAR 72F8 +ENCODING 29432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +5500 +DF00 +D500 +BF00 +A400 +3F00 +4400 +DF80 +ENDCHAR +STARTCHAR 72F9 +ENCODING 29433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +FF80 +C400 +D500 +5500 +DF00 +EA80 +4A00 +5100 +E080 +ENDCHAR +STARTCHAR 72FC +ENCODING 29436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +4F00 +D100 +CF00 +5100 +AF00 +B500 +3200 +3500 +D880 +ENDCHAR +STARTCHAR 72FD +ENCODING 29437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF00 +5100 +D100 +DF00 +5100 +BF00 +BF00 +2000 +4B00 +D080 +ENDCHAR +STARTCHAR 730A +ENCODING 29450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A800 +5300 +D100 +DB00 +5100 +DF00 +CA00 +4A00 +5280 +E300 +ENDCHAR +STARTCHAR 7316 +ENCODING 29462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +AF +51 +CF +CF +C0 +DF +3F +5F +D1 +ENDCHAR +STARTCHAR 731B +ENCODING 29467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +4200 +DF80 +C400 +4C00 +C000 +5F00 +5B00 +FF80 +ENDCHAR +STARTCHAR 731C +ENCODING 29468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +DF00 +DF00 +DF80 +4000 +DF00 +B500 +3F00 +5100 +D300 +ENDCHAR +STARTCHAR 731D +ENCODING 29469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +5F00 +C900 +CA00 +5B00 +B480 +BF80 +2400 +4400 +C400 +ENDCHAR +STARTCHAR 7325 +ENCODING 29477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +5500 +DF00 +DF00 +4000 +BF80 +3200 +3700 +D980 +ENDCHAR +STARTCHAR 7329 +ENCODING 29481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF00 +5100 +DF00 +DF00 +5400 +DF00 +D400 +4F00 +4400 +DF80 +ENDCHAR +STARTCHAR 732A +ENCODING 29482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +5F00 +C600 +FF80 +4500 +DF00 +D100 +4F00 +4F00 +D100 +ENDCHAR +STARTCHAR 732B +ENCODING 29483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AA00 +5F80 +CA00 +CA00 +5F00 +D500 +DF00 +5500 +5F00 +D100 +ENDCHAR +STARTCHAR 7336 +ENCODING 29494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AE00 +5100 +EF80 +CA00 +5F00 +DB00 +DB00 +5F00 +5F00 +D100 +ENDCHAR +STARTCHAR 7337 +ENCODING 29495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3300 +9280 +FA00 +6780 +F200 +F200 +F200 +F500 +F500 +9880 +ENDCHAR +STARTCHAR 733E +ENCODING 29502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AF00 +5100 +D700 +DF80 +6080 +DF80 +DF00 +5F00 +5100 +D300 +ENDCHAR +STARTCHAR 733F +ENCODING 29503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +5F00 +DF80 +C000 +5F00 +D500 +DB00 +3A00 +4D00 +D880 +ENDCHAR +STARTCHAR 7344 +ENCODING 29508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FA00 +C300 +BA80 +FF80 +4200 +FA00 +C300 +7B00 +7D00 +AC80 +ENDCHAR +STARTCHAR 7345 +ENCODING 29509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D780 +FA00 +AF00 +EE80 +7E80 +E680 +FE80 +6F00 +7A00 +AA00 +ENDCHAR +STARTCHAR 7350 +ENCODING 29520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +5F00 +DF80 +C000 +5F00 +BF00 +B100 +3F80 +4400 +C400 +ENDCHAR +STARTCHAR 7352 +ENCODING 29522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +FD00 +F300 +5480 +B400 +0A00 +1000 +FF00 +C380 +ENDCHAR +STARTCHAR 7357 +ENCODING 29527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +B600 +A780 +FE80 +FF00 +FE00 +7F00 +6B00 +9480 +ENDCHAR +STARTCHAR 7368 +ENCODING 29544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +EB +DF +DF +69 +DF +5F +59 +C3 +ENDCHAR +STARTCHAR 736A +ENCODING 29546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AC00 +5F00 +E080 +DF00 +5F00 +DF00 +DF00 +5100 +5F00 +DF00 +ENDCHAR +STARTCHAR 7370 +ENCODING 29552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +FF00 +FC80 +DF00 +5F00 +DB00 +FF80 +5F00 +4400 +CC00 +ENDCHAR +STARTCHAR 7372 +ENCODING 29554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AA00 +5F80 +D000 +DF00 +7F00 +DF80 +C000 +5F00 +4600 +D980 +ENDCHAR +STARTCHAR 7375 +ENCODING 29557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B500 +D500 +DF00 +EB00 +5F00 +C000 +DF00 +5F00 +5F80 +E580 +ENDCHAR +STARTCHAR 7378 +ENCODING 29560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FA00 +FB00 +0280 +FF80 +FA00 +F200 +FA00 +F500 +9500 +F880 +ENDCHAR +STARTCHAR 737A +ENCODING 29562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9700 +FA80 +9300 +B800 +7B00 +FB00 +D300 +5B00 +7B00 +9480 +ENDCHAR +STARTCHAR 737B +ENCODING 29563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3A00 +FF00 +E280 +BF80 +FA00 +CA00 +B300 +FB00 +FC80 +DC80 +ENDCHAR +STARTCHAR 7384 +ENCODING 29572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +FF00 +1000 +6200 +6400 +1A00 +1100 +2700 +F880 +ENDCHAR +STARTCHAR 7386 +ENCODING 29574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +FF80 +4400 +A500 +A600 +4200 +5500 +7700 +DC80 +ENDCHAR +STARTCHAR 7387 +ENCODING 29575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9100 +7600 +5A00 +9500 +B900 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 7389 +ENCODING 29577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +08 +08 +7F +0C +0A +08 +FF +ENDCHAR +STARTCHAR 738B +ENCODING 29579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +08 +08 +7F +08 +08 +08 +FF +ENDCHAR +STARTCHAR 738E +ENCODING 29582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +4200 +4200 +E200 +4200 +4200 +6200 +C200 +0E00 +ENDCHAR +STARTCHAR 7394 +ENCODING 29588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +F5 +55 +55 +F5 +55 +75 +95 +25 +21 +ENDCHAR +STARTCHAR 7396 +ENCODING 29590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +E800 +4E00 +5200 +F200 +4200 +6600 +C900 +1100 +2080 +ENDCHAR +STARTCHAR 7397 +ENCODING 29591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4400 +4400 +E400 +5F80 +4400 +6400 +C400 +0C00 +ENDCHAR +STARTCHAR 7398 +ENCODING 29592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4100 +4100 +E100 +4F00 +5000 +7000 +D080 +0F00 +ENDCHAR +STARTCHAR 739F +ENCODING 29599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +5F80 +5100 +EA00 +4A00 +6400 +C600 +1B00 +3180 +ENDCHAR +STARTCHAR 73A7 +ENCODING 29607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +4A00 +4900 +5F00 +E000 +4A00 +6A00 +8A00 +1280 +2300 +ENDCHAR +STARTCHAR 73A9 +ENCODING 29609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +4000 +4000 +FF00 +4A00 +6A00 +8A00 +1280 +2300 +ENDCHAR +STARTCHAR 73AD +ENCODING 29613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +F200 +5280 +5B00 +F200 +5200 +5200 +7280 +9A80 +3300 +ENDCHAR +STARTCHAR 73B2 +ENCODING 29618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +EA00 +4900 +5F00 +E080 +5F00 +6900 +8900 +0B00 +0800 +ENDCHAR +STARTCHAR 73B3 +ENCODING 29619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0C00 +ED00 +5200 +5F80 +F200 +7200 +5200 +7200 +9280 +1100 +ENDCHAR +STARTCHAR 73B9 +ENCODING 29625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +5F80 +4400 +F900 +4A00 +6500 +4500 +8B00 +1C80 +ENDCHAR +STARTCHAR 73C0 +ENCODING 29632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +E4 +5F +51 +F1 +5F +71 +D1 +1F +11 +ENDCHAR +STARTCHAR 73C2 +ENCODING 29634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +4100 +4D00 +ED00 +4D00 +4D00 +6D00 +C100 +0300 +ENDCHAR +STARTCHAR 73C9 +ENCODING 29641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5100 +5F00 +F400 +5400 +5F80 +7200 +9E80 +3100 +ENDCHAR +STARTCHAR 73CA +ENCODING 29642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +5B +5B +FB +5F +7B +5B +9B +11 +ENDCHAR +STARTCHAR 73CC +ENCODING 29644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0D00 +E500 +4900 +5900 +FA80 +5C80 +6800 +9900 +3700 +ENDCHAR +STARTCHAR 73CD +ENCODING 29645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +EA00 +5500 +6880 +F200 +4680 +4D00 +7200 +8C00 +1000 +ENDCHAR +STARTCHAR 73CF +ENCODING 29647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +4200 +4200 +4200 +EF00 +4300 +4300 +7200 +DF80 +ENDCHAR +STARTCHAR 73D6 +ENCODING 29654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F500 +5500 +4D00 +FF00 +4A00 +6A00 +8A00 +1280 +2380 +ENDCHAR +STARTCHAR 73D9 +ENCODING 29657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0A00 +EA00 +5F00 +EA00 +4A00 +7F80 +6A00 +9100 +2080 +ENDCHAR +STARTCHAR 73DD +ENCODING 29661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +45 +4D +F7 +4D +5F +75 +85 +1B +ENDCHAR +STARTCHAR 73DE +ENCODING 29662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +5A00 +5A00 +EE00 +7180 +7F00 +5100 +9F00 +1100 +ENDCHAR +STARTCHAR 73E0 +ENCODING 29664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F400 +5F00 +5400 +FF80 +4600 +6E00 +9500 +1480 +0400 +ENDCHAR +STARTCHAR 73E3 +ENCODING 29667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +F0 +5F +5D +D5 +5D +75 +5D +91 +07 +ENDCHAR +STARTCHAR 73E4 +ENCODING 29668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +5400 +5400 +FF80 +4400 +5500 +7500 +CF00 +1100 +ENDCHAR +STARTCHAR 73E5 +ENCODING 29669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +4900 +4F00 +E900 +4F00 +6900 +AF80 +0100 +0100 +ENDCHAR +STARTCHAR 73E6 +ENCODING 29670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +FF +51 +5F +FB +5B +5F +7B +91 +13 +ENDCHAR +STARTCHAR 73E9 +ENCODING 29673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +F380 +5800 +4F80 +F100 +5100 +6900 +6900 +8900 +0B00 +ENDCHAR +STARTCHAR 73EA +ENCODING 29674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +5F00 +4400 +FF80 +4400 +4400 +7F00 +8400 +1F80 +ENDCHAR +STARTCHAR 73ED +ENCODING 29677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF80 +5A00 +5A00 +EA00 +6F80 +4A00 +6A00 +9200 +1780 +ENDCHAR +STARTCHAR 73F7 +ENCODING 29687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +FF00 +4200 +7F80 +CA00 +5E00 +5A00 +7900 +9D80 +3980 +ENDCHAR +STARTCHAR 73F9 +ENCODING 29689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0500 +C500 +5F80 +5400 +DB00 +5B00 +5B00 +AA00 +2680 +2500 +ENDCHAR +STARTCHAR 73FD +ENCODING 29693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +5600 +5200 +DF80 +4A00 +5A00 +5700 +9800 +2780 +ENDCHAR +STARTCHAR 73FE +ENCODING 29694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5100 +5F00 +FF00 +5100 +7F00 +8A00 +1A80 +3300 +ENDCHAR +STARTCHAR 7401 +ENCODING 29697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF80 +5000 +6F00 +E500 +4D00 +7700 +5400 +9C00 +2780 +ENDCHAR +STARTCHAR 7403 +ENCODING 29699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +E500 +5F80 +5480 +ED00 +4E00 +4600 +7D00 +9480 +0C00 +ENDCHAR +STARTCHAR 7405 +ENCODING 29701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5100 +5F00 +F100 +5F00 +7500 +5200 +9F00 +3080 +ENDCHAR +STARTCHAR 7406 +ENCODING 29702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5500 +5F00 +F500 +5F00 +4400 +7F00 +8400 +1F80 +ENDCHAR +STARTCHAR 7407 +ENCODING 29703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4400 +5F80 +D580 +5E00 +6A00 +8B00 +1100 +2300 +ENDCHAR +STARTCHAR 7409 +ENCODING 29705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +4A00 +5F00 +E080 +5600 +7600 +9600 +1680 +2580 +ENDCHAR +STARTCHAR 7413 +ENCODING 29715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5080 +4E00 +E000 +5F00 +6A00 +8A00 +1A80 +1300 +ENDCHAR +STARTCHAR 741B +ENCODING 29723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5A80 +4B00 +F400 +5F80 +6600 +8D00 +1480 +2400 +ENDCHAR +STARTCHAR 7420 +ENCODING 29728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +EA00 +5F00 +5B00 +DF00 +5B00 +7F80 +6A00 +9100 +2080 +ENDCHAR +STARTCHAR 7421 +ENCODING 29729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +D700 +8A80 +9300 +FF00 +BB00 +B700 +F500 +1300 +1480 +ENDCHAR +STARTCHAR 7422 +ENCODING 29730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4A00 +5B00 +EA00 +5E00 +6D00 +7500 +A480 +0C00 +ENDCHAR +STARTCHAR 7425 +ENCODING 29733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E700 +5F80 +5680 +FC80 +5700 +7A00 +9A00 +2A80 +3300 +ENDCHAR +STARTCHAR 7426 +ENCODING 29734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +4E00 +5100 +FF80 +4100 +7D00 +9D00 +1500 +0300 +ENDCHAR +STARTCHAR 7428 +ENCODING 29736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5100 +5F00 +FF00 +5200 +5B00 +7300 +9C80 +3380 +ENDCHAR +STARTCHAR 742A +ENCODING 29738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0900 +FF80 +4900 +4F00 +E900 +4F00 +6900 +DF80 +0A00 +3180 +ENDCHAR +STARTCHAR 742B +ENCODING 29739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +4400 +5F00 +DF00 +5500 +6E80 +5F00 +8400 +0400 +ENDCHAR +STARTCHAR 742C +ENCODING 29740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5080 +5F00 +D500 +5B00 +4B00 +6B00 +9280 +2300 +ENDCHAR +STARTCHAR 742E +ENCODING 29742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +5080 +4F00 +E000 +5F80 +6D00 +5500 +9480 +0C00 +ENDCHAR +STARTCHAR 742F +ENCODING 29743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +FF +51 +4F +E9 +4F +68 +8F +0F +09 +ENDCHAR +STARTCHAR 7430 +ENCODING 29744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +ED00 +5700 +4B00 +F080 +4500 +7500 +C600 +0900 +1080 +ENDCHAR +STARTCHAR 7433 +ENCODING 29747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +D200 +7F80 +5200 +DB00 +7500 +7680 +5280 +9200 +1200 +ENDCHAR +STARTCHAR 7434 +ENCODING 29748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F700 +4200 +FF80 +7E00 +8180 +7E00 +0400 +0800 +ENDCHAR +STARTCHAR 7435 +ENCODING 29749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +FF00 +FF80 +4800 +4900 +7600 +7880 +C700 +ENDCHAR +STARTCHAR 7436 +ENCODING 29750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F700 +7F80 +C000 +FF00 +9100 +FF00 +8080 +7F00 +ENDCHAR +STARTCHAR 7438 +ENCODING 29752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E700 +5F00 +5100 +FF00 +5100 +7F00 +9F80 +0400 +0400 +ENDCHAR +STARTCHAR 743A +ENCODING 29754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +EA00 +4F00 +7200 +E200 +4F80 +5400 +7500 +9700 +2C80 +ENDCHAR +STARTCHAR 743F +ENCODING 29759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +5F80 +4400 +FF00 +5F00 +5500 +7F80 +8400 +0400 +ENDCHAR +STARTCHAR 7440 +ENCODING 29760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +03 +FC +5F +55 +FF +44 +7F +97 +19 +11 +ENDCHAR +STARTCHAR 7441 +ENCODING 29761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +5F +51 +DF +5F +5F +7F +91 +1F +ENDCHAR +STARTCHAR 7443 +ENCODING 29763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5F00 +4A00 +DF80 +5100 +7E80 +4E00 +9100 +0E00 +ENDCHAR +STARTCHAR 7444 +ENCODING 29764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5080 +5E80 +DF00 +5100 +5F00 +7F00 +9100 +3F80 +ENDCHAR +STARTCHAR 744B +ENCODING 29771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5F80 +4000 +FF00 +5F00 +7F00 +8A00 +1F80 +0200 +ENDCHAR +STARTCHAR 7455 +ENCODING 29781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FB00 +5500 +5B00 +D000 +5F00 +5300 +FB00 +1300 +1480 +ENDCHAR +STARTCHAR 7457 +ENCODING 29783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +FF00 +5480 +FF00 +5F80 +4F00 +6900 +9600 +2D00 +ENDCHAR +STARTCHAR 7459 +ENCODING 29785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +0D +F5 +55 +4D +E4 +5F +7B +95 +1F +11 +ENDCHAR +STARTCHAR 745A +ENCODING 29786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +13 +D5 +BD +93 +D5 +BB +6D +BD +2D +07 +ENDCHAR +STARTCHAR 745B +ENCODING 29787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +FF80 +4E00 +5F00 +D500 +5500 +7F80 +8600 +1900 +3080 +ENDCHAR +STARTCHAR 745C +ENCODING 29788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DC00 +8B00 +BE80 +FB00 +BB00 +AD00 +7B00 +AB00 +2A80 +ENDCHAR +STARTCHAR 745E +ENCODING 29790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1500 +F500 +5F00 +4000 +FF80 +5F00 +7A80 +9A80 +1A80 +1B00 +ENDCHAR +STARTCHAR 745F +ENCODING 29791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +F700 +FF80 +1200 +6D00 +A900 +B280 +FC00 +ENDCHAR +STARTCHAR 7460 +ENCODING 29792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +0F +DB +5B +FD +40 +5F +5F +9F +11 +ENDCHAR +STARTCHAR 7462 +ENCODING 29794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +5A80 +5900 +D700 +4900 +7F80 +9100 +0F00 +1100 +ENDCHAR +STARTCHAR 7464 +ENCODING 29796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +EF00 +5E00 +5C00 +F800 +4F00 +5F80 +6400 +9F00 +1080 +ENDCHAR +STARTCHAR 7465 +ENCODING 29797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5500 +5B00 +FF00 +4000 +5F00 +7B00 +9B00 +3F80 +ENDCHAR +STARTCHAR 7468 +ENCODING 29800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +5B00 +5B80 +C000 +5F80 +5F00 +7F00 +9100 +1F00 +ENDCHAR +STARTCHAR 7469 +ENCODING 29801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B700 +DB00 +6600 +9D00 +FF00 +8080 +7E00 +7E00 +0A00 +FF00 +ENDCHAR +STARTCHAR 746A +ENCODING 29802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +54 +5F +FF +54 +5F +7F +9D +23 +ENDCHAR +STARTCHAR 746F +ENCODING 29807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1300 +FB00 +AB00 +BB00 +EB00 +BA80 +7A80 +AB00 +3A00 +2200 +ENDCHAR +STARTCHAR 747E +ENCODING 29822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +FF80 +4E00 +4400 +DF00 +5F00 +5F00 +6400 +9F00 +3F80 +ENDCHAR +STARTCHAR 7482 +ENCODING 29826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1100 +DF80 +5100 +5E00 +DE00 +7F80 +4A00 +5500 +AE80 +3F80 +ENDCHAR +STARTCHAR 7483 +ENCODING 29827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +5B00 +5F00 +FF00 +4400 +7F00 +9E80 +1080 +1100 +ENDCHAR +STARTCHAR 7487 +ENCODING 29831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +D780 +BC00 +A780 +DA80 +AE00 +6D80 +AE00 +2E00 +5B80 +ENDCHAR +STARTCHAR 7489 +ENCODING 29833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +DF80 +8F00 +AB00 +CF00 +BF00 +9F80 +D200 +3200 +2F80 +ENDCHAR +STARTCHAR 748B +ENCODING 29835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5F80 +4000 +FF00 +5F00 +7100 +9F80 +0400 +0400 +ENDCHAR +STARTCHAR 7498 +ENCODING 29848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1500 +CD00 +5F80 +4E00 +D580 +5900 +7B80 +4F80 +9100 +2100 +ENDCHAR +STARTCHAR 749C +ENCODING 29852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +DF80 +4E00 +5F80 +C400 +5F00 +7F00 +9F00 +0B00 +3080 +ENDCHAR +STARTCHAR 749E +ENCODING 29854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1B00 +FB00 +5F80 +4A00 +FF00 +5F00 +7F80 +8400 +0B00 +3180 +ENDCHAR +STARTCHAR 749F +ENCODING 29855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5F00 +5F00 +FF80 +5F00 +7100 +9F00 +1D00 +2C80 +ENDCHAR +STARTCHAR 74A1 +ENCODING 29857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +D600 +8F00 +AA00 +D700 +8700 +B600 +5700 +9000 +2F80 +ENDCHAR +STARTCHAR 74A3 +ENCODING 29859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D500 +6F00 +5D00 +FF80 +4500 +7F80 +FA00 +1680 +2900 +ENDCHAR +STARTCHAR 74A5 +ENCODING 29861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1A00 +FE00 +9B80 +9B00 +E700 +B700 +6900 +B500 +2700 +1C80 +ENDCHAR +STARTCHAR 74A7 +ENCODING 29863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +9F80 +F500 +FF80 +DF80 +F200 +FF00 +7F00 +0A00 +FF80 +ENDCHAR +STARTCHAR 74A8 +ENCODING 29864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DB80 +5F00 +6B00 +D480 +6500 +4E00 +5F80 +8E00 +3580 +ENDCHAR +STARTCHAR 74AA +ENCODING 29866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0F00 +EF00 +4000 +FB00 +5B00 +5F80 +6E00 +9D80 +2400 +ENDCHAR +STARTCHAR 74B0 +ENCODING 29872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5F00 +4000 +FF80 +5F00 +7F00 +8A80 +3D00 +1880 +ENDCHAR +STARTCHAR 74B2 +ENCODING 29874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1700 +C900 +6F00 +DE00 +4500 +7F00 +5A80 +9600 +2F80 +ENDCHAR +STARTCHAR 74B5 +ENCODING 29877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1D00 +F700 +5D00 +5500 +DB00 +5500 +7F80 +CB00 +1080 +ENDCHAR +STARTCHAR 74B9 +ENCODING 29881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +8000 +BF80 +DF00 +8000 +7F80 +9F80 +2B00 +1B00 +ENDCHAR +STARTCHAR 74BD +ENCODING 29885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +7F80 +EF00 +5700 +AD00 +5300 +FF00 +7F00 +FF80 +ENDCHAR +STARTCHAR 74BF +ENCODING 29887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5080 +5F00 +F500 +4F00 +5180 +7F00 +9F00 +1F00 +ENDCHAR +STARTCHAR 74C6 +ENCODING 29894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1F00 +F200 +5F80 +5D00 +DF00 +5F00 +7F00 +9F00 +0A00 +1180 +ENDCHAR +STARTCHAR 74CA +ENCODING 29898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +F600 +7F00 +5F00 +D100 +5F00 +7F00 +9F00 +2E00 +3B80 +ENDCHAR +STARTCHAR 74CF +ENCODING 29903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +FB80 +9B00 +B880 +FB00 +AB00 +BB00 +FB00 +2A80 +2B00 +ENDCHAR +STARTCHAR 74D4 +ENCODING 29908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FB00 +5480 +5B00 +C000 +5700 +5F80 +EA00 +0600 +3980 +ENDCHAR +STARTCHAR 74D8 +ENCODING 29912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1F80 +CA00 +5B00 +5B00 +CA00 +5F80 +7F00 +D300 +1C00 +1F80 +ENDCHAR +STARTCHAR 74DA +ENCODING 29914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +DB00 +7F80 +5B00 +FF80 +5100 +7F00 +9F00 +1F00 +3100 +ENDCHAR +STARTCHAR 74DC +ENCODING 29916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0700 +7E00 +5200 +5200 +5200 +5200 +5500 +BD00 +8280 +ENDCHAR +STARTCHAR 74E0 +ENCODING 29920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2180 +7E80 +5680 +7E80 +8E80 +7E80 +4680 +7780 +5540 +3AC0 +ENDCHAR +STARTCHAR 74E2 +ENCODING 29922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F300 +6500 +FB00 +FB00 +FB00 +0B00 +FB00 +DB80 +D580 +ENDCHAR +STARTCHAR 74E3 +ENCODING 29923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D00 +D780 +F700 +F700 +F780 +B500 +F500 +B780 +AB00 +9500 +ENDCHAR +STARTCHAR 74E6 +ENCODING 29926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +2000 +3C00 +2200 +3400 +4C00 +4400 +4C80 +F700 +ENDCHAR +STARTCHAR 74EE +ENCODING 29934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +5200 +A500 +7E00 +FF00 +2000 +3E00 +4C80 +F300 +ENDCHAR +STARTCHAR 74F7 +ENCODING 29943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +DF00 +2900 +DE00 +2100 +FF00 +2000 +3E00 +4C80 +F300 +ENDCHAR +STARTCHAR 7501 +ENCODING 29953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5400 +F400 +5700 +5500 +F500 +5700 +9900 +9B80 +9D00 +ENDCHAR +STARTCHAR 7504 +ENCODING 29956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +6400 +F700 +F500 +F500 +2700 +F980 +3A80 +CD80 +ENDCHAR +STARTCHAR 7511 +ENCODING 29969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F80 +F400 +AF00 +ED00 +F700 +F700 +F580 +F780 +9D80 +ENDCHAR +STARTCHAR 7515 +ENCODING 29973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +AF00 +EA00 +6F80 +8000 +FF00 +3E00 +2C80 +F380 +ENDCHAR +STARTCHAR 7518 +ENCODING 29976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +22 +22 +FF +22 +22 +3E +22 +22 +3E +22 +ENDCHAR +STARTCHAR 751A +ENCODING 29978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +3E00 +4200 +3E00 +FF80 +5400 +6700 +7F00 +4000 +ENDCHAR +STARTCHAR 751B +ENCODING 29979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A100 +AE00 +F200 +AF80 +A200 +E200 +AF00 +A880 +EF00 +A880 +ENDCHAR +STARTCHAR 751F +ENCODING 29983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +7F00 +8800 +8800 +0800 +7E00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 7523 +ENCODING 29987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2400 +FF80 +A800 +BF00 +C800 +BF00 +8800 +FF80 +ENDCHAR +STARTCHAR 7525 +ENCODING 29989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +CD +EF +CD +EF +5F +75 +C9 +13 +ENDCHAR +STARTCHAR 7526 +ENCODING 29990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F200 +4600 +F700 +FA00 +D700 +F200 +CF80 +6000 +BF80 +ENDCHAR +STARTCHAR 7528 +ENCODING 29992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +49 +7F +49 +49 +7F +89 +89 +8B +ENDCHAR +STARTCHAR 752B +ENCODING 29995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +0E +FF +08 +7F +89 +7F +89 +7F +89 +8B +ENDCHAR +STARTCHAR 752C +ENCODING 29996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FC +30 +FE +92 +FE +92 +FE +92 +96 +ENDCHAR +STARTCHAR 7530 +ENCODING 30000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 8 2 -1 +BITMAP +FE +12 +12 +FE +12 +12 +12 +FE +ENDCHAR +STARTCHAR 7531 +ENCODING 30001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +89 +89 +FF +89 +89 +FF +81 +ENDCHAR +STARTCHAR 7532 +ENCODING 30002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FE +92 +92 +FE +92 +FE +10 +10 +10 +ENDCHAR +STARTCHAR 7533 +ENCODING 30003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +10 +10 +FE +92 +FE +92 +FE +92 +10 +10 +ENDCHAR +STARTCHAR 7537 +ENCODING 30007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +49 +7F +7F +08 +FF +11 +21 +C7 +ENDCHAR +STARTCHAR 7538 +ENCODING 30008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7F +41 +FD +D5 +7D +55 +7D +41 +07 +ENDCHAR +STARTCHAR 753A +ENCODING 30010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F000 +B780 +B200 +F200 +B200 +B200 +F200 +9200 +0600 +ENDCHAR +STARTCHAR 7547 +ENCODING 30023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +EF +E9 +F1 +EF +E1 +EF +E1 +A1 +03 +ENDCHAR +STARTCHAR 754C +ENCODING 30028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +7F00 +7F00 +6600 +A580 +2400 +6400 +C400 +ENDCHAR +STARTCHAR 754F +ENCODING 30031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +4900 +7F00 +4900 +7F00 +FF00 +4A00 +7E00 +E180 +ENDCHAR +STARTCHAR 7551 +ENCODING 30033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +55 +F5 +D5 +DF +55 +55 +B5 +BF +91 +ENDCHAR +STARTCHAR 7553 +ENCODING 30035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +09 +EA +2C +4B +99 +7E +49 +7E +7E +41 +ENDCHAR +STARTCHAR 7554 +ENCODING 30036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +ED00 +ED00 +D480 +EF00 +E400 +DF80 +E400 +A400 +0400 +ENDCHAR +STARTCHAR 7559 +ENCODING 30041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +2F +E5 +95 +FB +00 +7F +7F +7F +41 +ENDCHAR +STARTCHAR 755B +ENCODING 30043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +EE00 +FB00 +FC80 +E900 +E680 +E900 +E200 +8C00 +1000 +ENDCHAR +STARTCHAR 755C +ENCODING 30044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1400 +3A00 +FF00 +0080 +7F00 +7F00 +7F00 +8100 +ENDCHAR +STARTCHAR 755D +ENCODING 30045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F400 +0700 +F900 +DA00 +D200 +F200 +D500 +F900 +1080 +ENDCHAR +STARTCHAR 7562 +ENCODING 30050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +7F00 +8900 +7F00 +FF80 +4A00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 7565 +ENCODING 30053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E700 +E900 +D600 +E600 +D980 +EF00 +E900 +AF00 +0900 +ENDCHAR +STARTCHAR 7566 +ENCODING 30054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +EF00 +E400 +FF80 +E400 +E400 +EF00 +8400 +1F80 +ENDCHAR +STARTCHAR 756A +ENCODING 30058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7C00 +2A00 +FF00 +2C00 +FF80 +4900 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 756F +ENCODING 30063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +E900 +FF00 +EA80 +F700 +EF00 +E900 +F600 +8600 +1980 +ENDCHAR +STARTCHAR 7570 +ENCODING 30064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +7F00 +7F00 +0000 +2400 +FF00 +FF80 +2600 +C100 +ENDCHAR +STARTCHAR 7575 +ENCODING 30069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +FF80 +FF00 +FF80 +0000 +FF00 +FF00 +BF00 +FF00 +ENDCHAR +STARTCHAR 7576 +ENCODING 30070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4A +2A +FF +BF +3E +00 +7F +7F +89 +7F +ENDCHAR +STARTCHAR 7578 +ENCODING 30072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +EF80 +E600 +E980 +FF80 +E100 +EF00 +EF00 +8B00 +0300 +ENDCHAR +STARTCHAR 757A +ENCODING 30074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +7E +7E +7E +FF +7F +7F +7F +FF +ENDCHAR +STARTCHAR 757F +ENCODING 30079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +AD00 +5B00 +FF00 +0A00 +FF80 +FA00 +F600 +F480 +8B00 +ENDCHAR +STARTCHAR 7586 +ENCODING 30086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +3500 +FF00 +9F00 +FF80 +FF00 +BF00 +DF00 +DF80 +ENDCHAR +STARTCHAR 7587 +ENCODING 30087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +E000 +FF00 +EE00 +FF00 +FF80 +FF80 +B700 +1B00 +ENDCHAR +STARTCHAR 758A +ENCODING 30090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +FF +FF +FF +FF +C3 +7E +FF +ENDCHAR +STARTCHAR 758B +ENCODING 30091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0900 +0900 +4800 +4F00 +4800 +4800 +B800 +8F80 +ENDCHAR +STARTCHAR 758E +ENCODING 30094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +3F80 +4400 +CF00 +F500 +CF00 +C600 +ED00 +D480 +0400 +ENDCHAR +STARTCHAR 758F +ENCODING 30095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +3F00 +4900 +DF00 +E000 +D600 +D600 +F600 +D680 +2500 +ENDCHAR +STARTCHAR 7591 +ENCODING 30097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +AF00 +D100 +E600 +8F00 +E300 +CB00 +FA00 +6E00 +9380 +ENDCHAR +STARTCHAR 759D +ENCODING 30109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C400 +C400 +6500 +6500 +E500 +6500 +9F00 +A100 +ENDCHAR +STARTCHAR 75A5 +ENCODING 30117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C400 +CA00 +5300 +F280 +D200 +5200 +9200 +A200 +ENDCHAR +STARTCHAR 75AB +ENCODING 30123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DC00 +D280 +5300 +E000 +FE00 +5200 +8C00 +B300 +ENDCHAR +STARTCHAR 75B1 +ENCODING 30129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C000 +DF00 +7D00 +7500 +DD00 +5300 +9080 +9F00 +ENDCHAR +STARTCHAR 75B2 +ENCODING 30130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C400 +DF00 +5500 +5F00 +EA00 +6A00 +AE00 +B180 +ENDCHAR +STARTCHAR 75B3 +ENCODING 30131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D100 +FF80 +5100 +5100 +DE00 +5100 +5E00 +9100 +ENDCHAR +STARTCHAR 75B5 +ENCODING 30133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D400 +F500 +7500 +6A00 +F400 +7400 +BC80 +F300 +ENDCHAR +STARTCHAR 75B8 +ENCODING 30136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C000 +DF00 +5100 +5F00 +D100 +5F00 +8000 +BF80 +ENDCHAR +STARTCHAR 75B9 +ENCODING 30137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +CC00 +D200 +6500 +4A00 +DD00 +5200 +8C00 +B000 +ENDCHAR +STARTCHAR 75BC +ENCODING 30140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C800 +DE00 +6A00 +4E00 +F180 +4C00 +8300 +9C00 +ENDCHAR +STARTCHAR 75BD +ENCODING 30141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +7F80 +C000 +DF00 +5100 +5F00 +D100 +5F00 +9100 +BF80 +ENDCHAR +STARTCHAR 75BE +ENCODING 30142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D000 +DF00 +6400 +4400 +FF00 +4C00 +9200 +A180 +ENDCHAR +STARTCHAR 75C2 +ENCODING 30146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D000 +FB00 +5B00 +5B00 +DB00 +6B00 +AB00 +DB00 +ENDCHAR +STARTCHAR 75C5 +ENCODING 30149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C000 +FF00 +5F00 +6500 +EB00 +6B00 +A100 +A300 +ENDCHAR +STARTCHAR 75C7 +ENCODING 30151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C000 +FF00 +4400 +D400 +D700 +5400 +9400 +BF80 +ENDCHAR +STARTCHAR 75CD +ENCODING 30157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +C400 +7F00 +7F00 +FF00 +4D00 +9200 +A100 +ENDCHAR +STARTCHAR 75D2 +ENCODING 30162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D200 +FF00 +4400 +5F00 +C400 +7F80 +8400 +8400 +ENDCHAR +STARTCHAR 75D4 +ENCODING 30164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C400 +DF00 +7F80 +C200 +7F00 +5200 +8A00 +8600 +ENDCHAR +STARTCHAR 75D5 +ENCODING 30165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DE00 +D100 +DE00 +D100 +DF00 +5600 +9E00 +B100 +ENDCHAR +STARTCHAR 75D8 +ENCODING 30168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C000 +FF00 +5F00 +5100 +DF00 +5200 +8A00 +BF80 +ENDCHAR +STARTCHAR 75D9 +ENCODING 30169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +D500 +EA00 +5500 +C000 +7F00 +8400 +BF80 +ENDCHAR +STARTCHAR 75DB +ENCODING 30171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DF00 +CC00 +7F00 +6500 +FF00 +7F00 +A500 +A700 +ENDCHAR +STARTCHAR 75E2 +ENCODING 30178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C900 +F300 +7B00 +D300 +FB00 +B500 +9100 +9300 +ENDCHAR +STARTCHAR 75F0 +ENCODING 30192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D500 +D600 +4A00 +5500 +D500 +6E00 +9A00 +A100 +ENDCHAR +STARTCHAR 75F2 +ENCODING 30194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D200 +FF00 +5200 +BF00 +BF00 +BF80 +D780 +9200 +ENDCHAR +STARTCHAR 75F4 +ENCODING 30196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D000 +FB00 +7280 +7E80 +D280 +5A80 +AB00 +A600 +ENDCHAR +STARTCHAR 75FA +ENCODING 30202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C400 +FF00 +7F00 +7F00 +CC00 +7F80 +8400 +8400 +ENDCHAR +STARTCHAR 75FC +ENCODING 30204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +E500 +7F00 +6500 +EF00 +6F00 +BF00 +A100 +ENDCHAR +STARTCHAR 7600 +ENCODING 30208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D200 +FB00 +5500 +DE80 +E900 +6800 +A900 +DE00 +ENDCHAR +STARTCHAR 760D +ENCODING 30221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DF00 +DF00 +5F00 +FF80 +D000 +7F00 +B500 +8B00 +ENDCHAR +STARTCHAR 7619 +ENCODING 30233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +F600 +5E00 +F700 +FF00 +7F00 +8500 +BE80 +ENDCHAR +STARTCHAR 761F +ENCODING 30239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DF00 +D500 +5B00 +5F00 +FF00 +6D00 +AD00 +FF80 +ENDCHAR +STARTCHAR 7620 +ENCODING 30240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +F700 +CC00 +7300 +DE00 +FF00 +5100 +9F00 +9300 +ENDCHAR +STARTCHAR 7621 +ENCODING 30241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +CC00 +FE00 +5F80 +DF00 +D100 +5F00 +BF00 +BF00 +ENDCHAR +STARTCHAR 7622 +ENCODING 30242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D300 +FD00 +7D80 +6800 +BF00 +7B00 +BB00 +DC80 +ENDCHAR +STARTCHAR 7624 +ENCODING 30244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +CF00 +FB00 +7D00 +6500 +DF00 +5F00 +9F00 +A100 +ENDCHAR +STARTCHAR 7626 +ENCODING 30246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +F700 +E500 +7F00 +7F00 +FF00 +5200 +8C00 +B300 +ENDCHAR +STARTCHAR 763B +ENCODING 30267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +FF80 +7F00 +7F00 +BF00 +BF80 +9C00 +BB00 +ENDCHAR +STARTCHAR 7642 +ENCODING 30274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +EB00 +5F00 +7280 +DE00 +5E00 +9700 +AC80 +ENDCHAR +STARTCHAR 764C +ENCODING 30284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DE00 +DE00 +4000 +FF00 +FF00 +6500 +BF00 +A100 +ENDCHAR +STARTCHAR 764E +ENCODING 30286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FB00 +FB00 +7B00 +E100 +EF00 +6F00 +AF00 +A100 +ENDCHAR +STARTCHAR 7652 +ENCODING 30290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DA00 +EF80 +7B00 +FD00 +FB00 +6B00 +B700 +DE80 +ENDCHAR +STARTCHAR 7656 +ENCODING 30294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF80 +E800 +6D00 +FD00 +FF80 +6F00 +9A00 +AA00 +ENDCHAR +STARTCHAR 7661 +ENCODING 30305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +EF00 +F100 +7A00 +FF80 +FD00 +5600 +AE00 +C780 +ENDCHAR +STARTCHAR 7664 +ENCODING 30308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +DB80 +ED00 +7B00 +6D00 +FD00 +7D00 +BD00 +A400 +ENDCHAR +STARTCHAR 7669 +ENCODING 30313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D700 +FB00 +7800 +FF00 +BD00 +7700 +DB00 +9480 +ENDCHAR +STARTCHAR 766C +ENCODING 30316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C300 +F780 +7A00 +FF00 +BA00 +BF80 +AA00 +EA00 +ENDCHAR +STARTCHAR 7670 +ENCODING 30320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D300 +BF80 +7D00 +BB00 +BD00 +BB00 +A780 +BC00 +ENDCHAR +STARTCHAR 7672 +ENCODING 30322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +FF00 +5D00 +DF00 +DF00 +BF00 +AB00 +AC80 +ENDCHAR +STARTCHAR 7678 +ENCODING 30328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FA00 +1400 +6500 +3E00 +C980 +FF00 +1800 +2600 +C180 +ENDCHAR +STARTCHAR 767B +ENCODING 30331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7A00 +1500 +6200 +7F00 +FF80 +4200 +7E00 +2400 +FF80 +ENDCHAR +STARTCHAR 767C +ENCODING 30332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7A +95 +62 +EF +EA +EF +2A +26 +79 +ENDCHAR +STARTCHAR 767D +ENCODING 30333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +20 +20 +FE +82 +82 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR 767E +ENCODING 30334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +10 +7F +41 +41 +7F +41 +7F +41 +ENDCHAR +STARTCHAR 7684 +ENCODING 30340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +EF +A9 +B5 +E5 +A3 +A1 +E1 +A7 +ENDCHAR +STARTCHAR 7686 +ENCODING 30342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +7B00 +4C00 +7880 +D700 +7E00 +4100 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 7687 +ENCODING 30343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4100 +7E00 +7E00 +0000 +FF00 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR 768E +ENCODING 30350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +AA00 +B100 +F100 +AA00 +A400 +E600 +9900 +1080 +ENDCHAR +STARTCHAR 7690 +ENCODING 30352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +7E00 +7E00 +0000 +6F00 +6F00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 7693 +ENCODING 30355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4C00 +FF00 +B400 +BF80 +E400 +BF00 +F100 +BF00 +1100 +ENDCHAR +STARTCHAR 76AE +ENCODING 30382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7F +49 +49 +7F +62 +54 +8C +9E +E1 +ENDCHAR +STARTCHAR 76BA +ENCODING 30394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F780 +FA80 +FA00 +B700 +4D00 +FB00 +EB00 +FF00 +BC80 +ENDCHAR +STARTCHAR 76BF +ENCODING 30399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 8 1 -1 +BITMAP +7F00 +9500 +9500 +9500 +9500 +9500 +9500 +FF80 +ENDCHAR +STARTCHAR 76C2 +ENCODING 30402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +0800 +FF00 +0800 +1800 +0000 +7F00 +9500 +FF80 +ENDCHAR +STARTCHAR 76C3 +ENCODING 30403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +1C00 +6B00 +8880 +7F00 +5500 +5500 +FF80 +ENDCHAR +STARTCHAR 76C6 +ENCODING 30406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +4200 +FF00 +1200 +2C00 +C000 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR 76C8 +ENCODING 30408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FC00 +2700 +3D00 +5900 +9B00 +A000 +7F00 +9500 +FF80 +ENDCHAR +STARTCHAR 76CA +ENCODING 30410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4200 +BD00 +1C00 +4200 +C100 +FF00 +5600 +FF80 +ENDCHAR +STARTCHAR 76D2 +ENCODING 30418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +2400 +7F00 +8180 +7E00 +7E00 +0000 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR 76D6 +ENCODING 30422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7F00 +FF00 +0000 +7E00 +5500 +5500 +FF80 +ENDCHAR +STARTCHAR 76DB +ENCODING 30427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +7F00 +8500 +7600 +9680 +BB00 +8000 +7E00 +5500 +FF80 +ENDCHAR +STARTCHAR 76DC +ENCODING 30428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +5F00 +9900 +0A00 +4C00 +9200 +A100 +7E00 +5500 +FF80 +ENDCHAR +STARTCHAR 76DE +ENCODING 30430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1C00 +FF00 +0E00 +F700 +1700 +FC80 +F700 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR 76DF +ENCODING 30431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E700 +A700 +E900 +EF00 +AB00 +1000 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR 76E1 +ENCODING 30433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +FF80 +7E00 +FF80 +8100 +9480 +7F00 +9500 +FF80 +ENDCHAR +STARTCHAR 76E3 +ENCODING 30435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A780 +D400 +F800 +A700 +F800 +7F00 +5500 +5500 +FF80 +ENDCHAR +STARTCHAR 76E4 +ENCODING 30436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +EA80 +DB00 +FF00 +D600 +A580 +0800 +7F00 +9500 +FF80 +ENDCHAR +STARTCHAR 76E7 +ENCODING 30439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1E00 +FF00 +9500 +9D00 +8000 +BE00 +BE00 +8000 +BF00 +FF80 +ENDCHAR +STARTCHAR 76EE +ENCODING 30446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FE +82 +FE +82 +82 +FE +82 +FE +82 +ENDCHAR +STARTCHAR 76F2 +ENCODING 30450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8000 +7F00 +7E00 +4100 +7E00 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 76F4 +ENCODING 30452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +3E00 +BE00 +A100 +BE00 +BE00 +7F80 +8000 +ENDCHAR +STARTCHAR 76F8 +ENCODING 30456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +49 +F9 +4F +69 +D9 +DF +C9 +4F +49 +ENDCHAR +STARTCHAR 76FC +ENCODING 30460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +A900 +F100 +B080 +AF00 +E500 +A900 +F900 +1600 +ENDCHAR +STARTCHAR 76FE +ENCODING 30462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0300 +7C00 +7F80 +4800 +7F00 +BF00 +BF00 +BF00 +A100 +ENDCHAR +STARTCHAR 7701 +ENCODING 30465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +2A +4B +9C +30 +FE +7E +7E +7E +41 +ENDCHAR +STARTCHAR 7704 +ENCODING 30468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A4 +F7 +B5 +B5 +FF +B1 +E1 +A7 +ENDCHAR +STARTCHAR 7708 +ENCODING 30472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +BF00 +F480 +A400 +E400 +A400 +AA00 +FA80 +9300 +ENDCHAR +STARTCHAR 7709 +ENCODING 30473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +FF +BF +A1 +BF +BF +BF +A1 +ENDCHAR +STARTCHAR 770B +ENCODING 30475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7C00 +7F00 +FF80 +2000 +7E00 +BE00 +3E00 +3E00 +2100 +ENDCHAR +STARTCHAR 771E +ENCODING 30494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4700 +7F00 +0000 +BF00 +BF00 +BF00 +BF00 +FF80 +6600 +8180 +ENDCHAR +STARTCHAR 7720 +ENCODING 30496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +B100 +EF00 +B200 +B200 +EF80 +B200 +F680 +1900 +ENDCHAR +STARTCHAR 7729 +ENCODING 30505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +BF80 +E400 +B900 +AA00 +E500 +A500 +EB00 +9C80 +ENDCHAR +STARTCHAR 7737 +ENCODING 30519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +5300 +FF00 +1C00 +E380 +7E00 +BF80 +4200 +3E00 +4200 +ENDCHAR +STARTCHAR 7738 +ENCODING 30520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C900 +AB00 +BC80 +CC00 +BF00 +D400 +A400 +DF80 +A400 +0400 +ENDCHAR +STARTCHAR 773A +ENCODING 30522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +AA80 +BB00 +DB00 +AA00 +DB00 +BA80 +CA00 +9280 +2300 +ENDCHAR +STARTCHAR 773C +ENCODING 30524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +A9 +EF +A9 +AF +ED +AA +EF +19 +ENDCHAR +STARTCHAR 7740 +ENCODING 30528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +0800 +FF80 +3E00 +7E00 +A100 +BE00 +3E00 +ENDCHAR +STARTCHAR 774D +ENCODING 30541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +B100 +FF00 +BF00 +B100 +FF00 +AA00 +FA80 +3300 +ENDCHAR +STARTCHAR 775B +ENCODING 30555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +AF00 +FF80 +A000 +EF00 +B500 +EF00 +B100 +1300 +ENDCHAR +STARTCHAR 7761 +ENCODING 30561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +C300 +BC00 +BF00 +CD00 +BF80 +CD00 +BF00 +C400 +9F80 +ENDCHAR +STARTCHAR 7763 +ENCODING 30563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +2F +35 +F5 +B2 +DD +7E +41 +7E +7E +41 +ENDCHAR +STARTCHAR 7766 +ENCODING 30566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +A400 +FF80 +AA80 +F780 +A400 +BF00 +E400 +BF80 +ENDCHAR +STARTCHAR 776B +ENCODING 30571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +DF00 +DF00 +C500 +DF80 +DF00 +D400 +D700 +AC00 +2780 +ENDCHAR +STARTCHAR 7779 +ENCODING 30585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF00 +A500 +DF80 +A500 +CF00 +B900 +AF00 +CF00 +0900 +ENDCHAR +STARTCHAR 777E +ENCODING 30590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +FF00 +0800 +7E00 +FF00 +2400 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 777F +ENCODING 30591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0E00 +1000 +FF00 +7E00 +9500 +7E00 +C380 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 778B +ENCODING 30603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D300 +DF00 +C000 +DF00 +DF00 +DF00 +DF00 +DF80 +CA00 +3180 +ENDCHAR +STARTCHAR 7791 +ENCODING 30609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +BF00 +D100 +AF00 +AF00 +DF80 +C000 +AB00 +1080 +ENDCHAR +STARTCHAR 779E +ENCODING 30622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +FF80 +CA00 +CE00 +DF00 +DE80 +DE80 +DF00 +D480 +9500 +ENDCHAR +STARTCHAR 77A5 +ENCODING 30629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +AF80 +FD00 +F200 +B580 +7E00 +4200 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 77AC +ENCODING 30636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +D500 +C900 +DF00 +CB00 +DD00 +DD80 +D700 +1100 +ENDCHAR +STARTCHAR 77AD +ENCODING 30637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF80 +CA00 +DF00 +B180 +DF00 +DF00 +CE00 +D500 +2C80 +ENDCHAR +STARTCHAR 77B0 +ENCODING 30640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +FA00 +FF80 +DB00 +DF00 +DB00 +D900 +D900 +EB00 +8C80 +ENDCHAR +STARTCHAR 77B3 +ENCODING 30643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF00 +BF80 +C000 +BF00 +DF00 +B500 +BF00 +DF00 +BF80 +ENDCHAR +STARTCHAR 77BB +ENCODING 30651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +DE00 +BF80 +D400 +BA00 +BF80 +D000 +B600 +DF00 +2F00 +ENDCHAR +STARTCHAR 77BC +ENCODING 30652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +CC00 +D300 +AE80 +DB00 +DD00 +DB00 +D200 +DB00 +2580 +ENDCHAR +STARTCHAR 77BF +ENCODING 30655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +F7 +48 +FF +FF +48 +7F +ENDCHAR +STARTCHAR 77D7 +ENCODING 30679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +3E00 +6200 +7E00 +7F00 +FF80 +FF00 +DD00 +FF00 +FF80 +ENDCHAR +STARTCHAR 77DB +ENCODING 30683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +34 +08 +FF +19 +2A +48 +88 +18 +ENDCHAR +STARTCHAR 77DC +ENCODING 30684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E400 +2600 +4900 +FF80 +6000 +CF00 +C100 +4100 +C200 +ENDCHAR +STARTCHAR 77E2 +ENCODING 30690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2000 +7F00 +4800 +8800 +FF00 +1800 +1400 +6200 +8180 +ENDCHAR +STARTCHAR 77E3 +ENCODING 30691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +2200 +FF00 +2000 +7E00 +8800 +FF00 +1800 +2600 +C180 +ENDCHAR +STARTCHAR 77E5 +ENCODING 30693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +47 +75 +A5 +F5 +25 +25 +55 +97 +85 +ENDCHAR +STARTCHAR 77E9 +ENCODING 30697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8F80 +8800 +E800 +CF00 +E900 +4900 +4F00 +A800 +9F80 +8800 +ENDCHAR +STARTCHAR 77ED +ENCODING 30701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F80 +E000 +CF00 +4900 +EF00 +4000 +6900 +A600 +9F80 +ENDCHAR +STARTCHAR 77EE +ENCODING 30702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +9C00 +FF80 +CD00 +F480 +4400 +5F80 +AA00 +AE00 +9900 +ENDCHAR +STARTCHAR 77EF +ENCODING 30703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +9E00 +FF80 +CF00 +FF00 +5F00 +5100 +B700 +9700 +9100 +ENDCHAR +STARTCHAR 77F3 +ENCODING 30707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +2000 +2000 +2000 +7F00 +C100 +C100 +3F00 +4100 +ENDCHAR +STARTCHAR 7802 +ENCODING 30722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +ED00 +4D00 +4D00 +F480 +B500 +AD00 +A200 +6C00 +1000 +ENDCHAR +STARTCHAR 7812 +ENCODING 30738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F200 +5200 +9300 +9A00 +F200 +B200 +B280 +FA80 +B300 +ENDCHAR +STARTCHAR 7825 +ENCODING 30757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E700 +4A00 +4A00 +8F80 +EA00 +AA00 +AE80 +7980 +BE00 +ENDCHAR +STARTCHAR 7826 +ENCODING 30758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +B700 +A480 +B700 +C000 +FF00 +2000 +7E00 +A100 +3E00 +ENDCHAR +STARTCHAR 7827 +ENCODING 30759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +F400 +4380 +4400 +6400 +AF00 +A900 +6900 +6F00 +4900 +ENDCHAR +STARTCHAR 782C +ENCODING 30764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +5F00 +8900 +E900 +AA00 +AA00 +AA00 +E200 +9F80 +ENDCHAR +STARTCHAR 7832 +ENCODING 30770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +5080 +5E80 +EA80 +AF00 +A900 +A900 +6880 +8F00 +ENDCHAR +STARTCHAR 7834 +ENCODING 30772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +5F80 +5280 +9200 +FF00 +B900 +B600 +B200 +F500 +A880 +ENDCHAR +STARTCHAR 7845 +ENCODING 30789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +5F00 +8400 +FF80 +A400 +A400 +BF00 +E400 +BF80 +ENDCHAR +STARTCHAR 784F +ENCODING 30799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +4900 +8900 +ED00 +BB80 +A900 +A900 +F100 +1100 +ENDCHAR +STARTCHAR 785D +ENCODING 30813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0680 +7680 +2A40 +2F80 +7880 +5780 +D880 +5780 +7880 +0980 +ENDCHAR +STARTCHAR 786B +ENCODING 30827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +4A00 +9F00 +E080 +B600 +B600 +B600 +F680 +2500 +ENDCHAR +STARTCHAR 786C +ENCODING 30828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +5F00 +9500 +FF00 +B500 +BF00 +6400 +AC00 +1380 +ENDCHAR +STARTCHAR 786F +ENCODING 30831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +4900 +8F00 +EF00 +A900 +AF00 +A600 +EA80 +9300 +ENDCHAR +STARTCHAR 787C +ENCODING 30844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FB +5B +9B +DB +BB +BB +BB +DB +09 +ENDCHAR +STARTCHAR 7881 +ENCODING 30849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +3E00 +3E00 +2200 +FF80 +FF80 +7E00 +A200 +3E00 +ENDCHAR +STARTCHAR 7887 +ENCODING 30855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5080 +8F00 +E400 +AC00 +AB00 +BC00 +FC00 +2380 +ENDCHAR +STARTCHAR 788C +ENCODING 30860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +4E00 +8200 +FF80 +B300 +AB00 +AD00 +F480 +8C00 +ENDCHAR +STARTCHAR 788D +ENCODING 30861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +4F00 +4F00 +E000 +BF80 +A100 +BF80 +6500 +8200 +ENDCHAR +STARTCHAR 788E +ENCODING 30862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +4900 +4900 +EB00 +B080 +BF80 +A400 +6400 +8400 +ENDCHAR +STARTCHAR 7891 +ENCODING 30865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5500 +9F00 +F500 +BF00 +AA00 +BF80 +E200 +8200 +ENDCHAR +STARTCHAR 7897 +ENCODING 30871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +5F00 +9080 +9F00 +F500 +B500 +AB00 +AB00 +F280 +1300 +ENDCHAR +STARTCHAR 78A3 +ENCODING 30883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +5F +91 +FF +BF +B5 +BB +FF +93 +ENDCHAR +STARTCHAR 78A7 +ENCODING 30887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +FF +EF +79 +CF +FF +3E +41 +BE +21 +ENDCHAR +STARTCHAR 78A9 +ENCODING 30889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +4400 +4F00 +EF00 +A900 +AF00 +AF00 +EB00 +9080 +ENDCHAR +STARTCHAR 78BA +ENCODING 30906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +5880 +8A00 +FF00 +BF00 +AA00 +AF00 +EF80 +8800 +ENDCHAR +STARTCHAR 78BB +ENCODING 30907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1F80 +E000 +4F00 +8F00 +E000 +BF00 +B680 +F680 +B880 +1100 +ENDCHAR +STARTCHAR 78BC +ENCODING 30908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +54 +9F +FF +B4 +BF +BF +FB +A3 +ENDCHAR +STARTCHAR 78C1 +ENCODING 30913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +5F80 +8800 +9200 +DB00 +BB00 +AB00 +B100 +DB00 +3680 +ENDCHAR +STARTCHAR 78C5 +ENCODING 30917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +5F00 +8A00 +9F80 +F480 +BF80 +A800 +AF00 +F900 +1300 +ENDCHAR +STARTCHAR 78CA +ENCODING 30922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +7E00 +A200 +3E00 +FF80 +4400 +F700 +9D00 +7700 +ENDCHAR +STARTCHAR 78CB +ENCODING 30923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0900 +FF80 +4400 +8F00 +E400 +BF80 +AF00 +AA00 +F200 +2F80 +ENDCHAR +STARTCHAR 78CE +ENCODING 30926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +5500 +9400 +8A00 +E500 +BF00 +BF80 +EA00 +9180 +ENDCHAR +STARTCHAR 78D0 +ENCODING 30928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +FA80 +BB00 +FF00 +D600 +BD80 +FF80 +7F00 +C100 +3F00 +ENDCHAR +STARTCHAR 78E8 +ENCODING 30952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +F780 +F700 +8000 +FF00 +BF00 +E100 +BF00 +ENDCHAR +STARTCHAR 78EC +ENCODING 30956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +F680 +0900 +FF00 +F600 +8900 +FF00 +7E00 +FE00 +4200 +ENDCHAR +STARTCHAR 78EF +ENCODING 30959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F500 +AF00 +9D00 +FF80 +C500 +DF80 +DD00 +D280 +AD00 +ENDCHAR +STARTCHAR 78F5 +ENCODING 30965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +DB +5B +9B +DB +DF +DF +DF +DB +11 +ENDCHAR +STARTCHAR 78FB +ENCODING 30971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0100 +FF00 +9F80 +EE00 +BF00 +B580 +BF00 +F500 +9F00 +ENDCHAR +STARTCHAR 7901 +ENCODING 30977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +EF00 +5200 +9F00 +EB00 +AE00 +AF80 +A000 +F700 +9680 +ENDCHAR +STARTCHAR 790E +ENCODING 30990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0900 +FB80 +5900 +9A80 +E900 +BF80 +B480 +BF00 +FC00 +2780 +ENDCHAR +STARTCHAR 7916 +ENCODING 30998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1D00 +F700 +5D00 +9700 +FF00 +B700 +B700 +BF80 +EB00 +9080 +ENDCHAR +STARTCHAR 792A +ENCODING 31018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +5F00 +9000 +DF00 +BB00 +BF00 +BF00 +DF00 +2900 +ENDCHAR +STARTCHAR 792B +ENCODING 31019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1500 +D700 +BA80 +9700 +DB00 +CF80 +DF80 +CF00 +F480 +0400 +ENDCHAR +STARTCHAR 792C +ENCODING 31020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +FF80 +DB00 +EE80 +1800 +FF80 +7F00 +FE80 +A200 +3E00 +ENDCHAR +STARTCHAR 793A +ENCODING 31034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +00 +00 +FF +4A +4A +49 +89 +18 +ENDCHAR +STARTCHAR 793E +ENCODING 31038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E400 +0400 +F400 +4F00 +D400 +D400 +D400 +D400 +5F80 +ENDCHAR +STARTCHAR 7940 +ENCODING 31040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +0900 +F900 +EF00 +E800 +E800 +E880 +E880 +4F00 +ENDCHAR +STARTCHAR 7941 +ENCODING 31041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +05 +F5 +26 +B5 +B5 +B5 +B7 +24 +ENDCHAR +STARTCHAR 7947 +ENCODING 31047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E100 +0E00 +EA00 +4A00 +EF80 +EA00 +EA00 +EE80 +5900 +ENDCHAR +STARTCHAR 7948 +ENCODING 31048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E100 +0E00 +F800 +4F80 +DA00 +DA00 +DA00 +DA00 +5200 +ENDCHAR +STARTCHAR 7949 +ENCODING 31049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +0200 +EA00 +4A00 +EB80 +EA00 +EA00 +EA00 +CA00 +5F80 +ENDCHAR +STARTCHAR 7950 +ENCODING 31056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E400 +0F80 +E400 +E800 +EF00 +F900 +E900 +C700 +4900 +ENDCHAR +STARTCHAR 7956 +ENCODING 31062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +0900 +F900 +DF00 +D900 +DF00 +D900 +C900 +5F80 +ENDCHAR +STARTCHAR 7957 +ENCODING 31063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E700 +0A00 +EA00 +4F80 +EA00 +EA00 +EE80 +D980 +5E00 +ENDCHAR +STARTCHAR 795A +ENCODING 31066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E800 +0F80 +FC00 +D700 +D400 +D700 +D400 +C400 +4400 +ENDCHAR +STARTCHAR 795B +ENCODING 31067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +0200 +FF00 +4200 +D200 +DF80 +D400 +D500 +DB00 +5C80 +ENDCHAR +STARTCHAR 795C +ENCODING 31068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +0200 +0F80 +E200 +E200 +EF00 +E900 +E900 +CF00 +4900 +ENDCHAR +STARTCHAR 795D +ENCODING 31069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +0900 +E900 +4900 +EF00 +EA00 +EA00 +EA80 +5380 +ENDCHAR +STARTCHAR 795E +ENCODING 31070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +04 +E4 +0F +ED +4F +ED +EF +ED +E4 +44 +ENDCHAR +STARTCHAR 7960 +ENCODING 31072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +01 +EF +4F +EB +EF +EB +E1 +43 +ENDCHAR +STARTCHAR 7965 +ENCODING 31077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +0500 +EF80 +4200 +EF00 +E200 +DF80 +E200 +E200 +4200 +ENDCHAR +STARTCHAR 7968 +ENCODING 31080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +9500 +FF00 +7E00 +0000 +FF00 +4A00 +B100 +ENDCHAR +STARTCHAR 796D +ENCODING 31085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +7700 +D500 +A200 +7F80 +8000 +FF00 +2A00 +4B00 +9900 +ENDCHAR +STARTCHAR 797A +ENCODING 31098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +1F80 +0900 +EF00 +E900 +EF00 +E900 +DF80 +E900 +5080 +ENDCHAR +STARTCHAR 797F +ENCODING 31103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0F00 +0E00 +E200 +FF80 +F300 +EA00 +ED00 +DC80 +4C00 +ENDCHAR +STARTCHAR 7981 +ENCODING 31105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +6700 +DE80 +4A00 +7E00 +FF00 +2A00 +4B00 +9900 +ENDCHAR +STARTCHAR 798D +ENCODING 31117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +09 +EB +FF +F1 +F7 +F7 +F7 +51 +ENDCHAR +STARTCHAR 798E +ENCODING 31118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E780 +0400 +EF00 +EF00 +E900 +EF00 +EF00 +CB00 +5080 +ENDCHAR +STARTCHAR 798F +ENCODING 31119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +0F00 +E900 +EF00 +EF00 +F480 +EF00 +EF00 +5080 +ENDCHAR +STARTCHAR 7991 +ENCODING 31121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +15 +EF +EF +E4 +FF +FF +F1 +51 +ENDCHAR +STARTCHAR 79A6 +ENCODING 31142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5300 +BE80 +7E80 +AA80 +7F00 +0000 +7F00 +FF80 +4A00 +9900 +ENDCHAR +STARTCHAR 79A7 +ENCODING 31143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +FF00 +5F00 +F100 +EE00 +FF80 +FF00 +DF00 +5100 +ENDCHAR +STARTCHAR 79AA +ENCODING 31146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1F00 +E000 +EF00 +EF00 +EF00 +FF80 +C400 +4400 +ENDCHAR +STARTCHAR 79AE +ENCODING 31150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +1F00 +1F00 +FF00 +E000 +FF80 +EF00 +EF00 +C900 +5F80 +ENDCHAR +STARTCHAR 79B1 +ENCODING 31153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F00 +0000 +FF80 +FF00 +E000 +FF80 +FB80 +D700 +5B00 +ENDCHAR +STARTCHAR 79B3 +ENCODING 31155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1F80 +E000 +1F80 +FF00 +FF80 +FF00 +EA00 +FF80 +DB00 +5D80 +ENDCHAR +STARTCHAR 79B9 +ENCODING 31161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +16 +68 +7E +49 +7E +08 +FF +8D +B3 +83 +ENDCHAR +STARTCHAR 79BD +ENCODING 31165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +6600 +FF80 +7D00 +7500 +7F00 +FF00 +9500 +BF00 +8300 +ENDCHAR +STARTCHAR 79BE +ENCODING 31166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7800 +0800 +FF80 +1800 +2C00 +4B00 +8880 +0800 +ENDCHAR +STARTCHAR 79BF +ENCODING 31167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7C00 +FF00 +6E00 +8900 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 79C0 +ENCODING 31168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7C00 +EF00 +6A00 +8180 +7C00 +2700 +6100 +8600 +ENDCHAR +STARTCHAR 79C1 +ENCODING 31169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +C400 +4400 +F400 +6400 +6A00 +D900 +C900 +4B80 +5C00 +ENDCHAR +STARTCHAR 79C9 +ENCODING 31177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7C00 +FF00 +7F00 +FF80 +7F00 +1800 +6E00 +8900 +ENDCHAR +STARTCHAR 79CA +ENCODING 31178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7C00 +FF00 +6C00 +8F80 +7800 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 79CB +ENCODING 31179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3200 +C200 +4A80 +FB00 +6B00 +6600 +D600 +C900 +4900 +5080 +ENDCHAR +STARTCHAR 79D1 +ENCODING 31185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3100 +C900 +4500 +F100 +6900 +6500 +D780 +CE00 +4100 +4100 +ENDCHAR +STARTCHAR 79D2 +ENCODING 31186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +C500 +4D00 +EC80 +5480 +F500 +ED00 +C200 +4C00 +5000 +ENDCHAR +STARTCHAR 79D5 +ENCODING 31189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3200 +D200 +5280 +FB00 +5200 +F200 +D200 +5280 +5A80 +7300 +ENDCHAR +STARTCHAR 79D8 +ENCODING 31192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +C300 +E900 +5A00 +FB00 +FC80 +DD00 +5900 +5700 +ENDCHAR +STARTCHAR 79DF +ENCODING 31199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2F00 +C900 +4900 +EF00 +6900 +EF00 +C900 +4900 +5F80 +ENDCHAR +STARTCHAR 79E4 +ENCODING 31204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2F00 +C200 +FB00 +5280 +6200 +DF80 +C200 +4200 +4200 +ENDCHAR +STARTCHAR 79E6 +ENCODING 31206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +FF00 +7F00 +1400 +FF80 +7E00 +FF80 +1800 +6E00 +8900 +ENDCHAR +STARTCHAR 79E7 +ENCODING 31207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +C400 +5F00 +F500 +5500 +FF80 +C400 +CA00 +5900 +5080 +ENDCHAR +STARTCHAR 79E9 +ENCODING 31209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +CC00 +4F00 +F400 +4400 +7F80 +C400 +4600 +5900 +5080 +ENDCHAR +STARTCHAR 79FB +ENCODING 31227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +C700 +4900 +F600 +4E00 +FF80 +E900 +D700 +4400 +5800 +ENDCHAR +STARTCHAR 7A00 +ENCODING 31232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +CE00 +4B00 +FF80 +4C00 +7F00 +ED00 +4D00 +4D00 +4400 +ENDCHAR +STARTCHAR 7A05 +ENCODING 31237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2E00 +C900 +FF00 +5180 +F100 +EF00 +CA00 +4A80 +5300 +ENDCHAR +STARTCHAR 7A08 +ENCODING 31240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F00 +D100 +4F00 +EF00 +4000 +7F00 +D400 +5F80 +4400 +4400 +ENDCHAR +STARTCHAR 7A0B +ENCODING 31243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +CF00 +4900 +EF00 +4300 +6C00 +DF80 +4400 +4400 +5F00 +ENDCHAR +STARTCHAR 7A0D +ENCODING 31245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1280 +6680 +2A40 +7F80 +2480 +7780 +7480 +A780 +2480 +2580 +ENDCHAR +STARTCHAR 7A14 +ENCODING 31252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +CA00 +4900 +FF80 +5F00 +E100 +E600 +5B00 +6980 +6E00 +ENDCHAR +STARTCHAR 7A17 +ENCODING 31255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF00 +5500 +FF00 +5500 +FF00 +FA00 +5F80 +4200 +4200 +ENDCHAR +STARTCHAR 7A19 +ENCODING 31257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +DF80 +4400 +EF00 +5F00 +D900 +FF00 +5F00 +5F80 +5000 +ENDCHAR +STARTCHAR 7A1A +ENCODING 31258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +CA00 +4F80 +F200 +5F00 +6A00 +EF00 +CA00 +4F80 +4800 +ENDCHAR +STARTCHAR 7A1C +ENCODING 31260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF00 +4400 +FF80 +5B80 +C800 +7F00 +5A00 +4E00 +7180 +ENDCHAR +STARTCHAR 7A1F +ENCODING 31263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7F00 +A500 +7F00 +0000 +7E00 +FF80 +2E00 +C980 +ENDCHAR +STARTCHAR 7A20 +ENCODING 31264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3F +D5 +5F +FF +55 +F7 +57 +5B +51 +ENDCHAR +STARTCHAR 7A2E +ENCODING 31278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2300 +DC00 +5F80 +FF00 +5500 +FF00 +7F00 +5F00 +4400 +5F80 +ENDCHAR +STARTCHAR 7A31 +ENCODING 31281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +CF00 +5480 +E400 +4F00 +7F80 +D500 +DF80 +5100 +5300 +ENDCHAR +STARTCHAR 7A36 +ENCODING 31286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6300 +C280 +5F80 +FB00 +5600 +FB00 +FE80 +5F00 +4580 +4500 +ENDCHAR +STARTCHAR 7A37 +ENCODING 31287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F00 +D500 +5F00 +FF80 +4B00 +F800 +EF00 +5A00 +4600 +5980 +ENDCHAR +STARTCHAR 7A3B +ENCODING 31291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2300 +CF00 +F480 +5000 +FB00 +F100 +DB00 +5F00 +5100 +ENDCHAR +STARTCHAR 7A3C +ENCODING 31292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF80 +5F80 +E600 +5E80 +E700 +7D00 +5D00 +5480 +4C00 +ENDCHAR +STARTCHAR 7A3D +ENCODING 31293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +DF80 +4B00 +F400 +4700 +7F80 +DF00 +5100 +5F00 +5F00 +ENDCHAR +STARTCHAR 7A3F +ENCODING 31295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF80 +4F00 +EF00 +4000 +FF00 +FE80 +5E80 +5A80 +5100 +ENDCHAR +STARTCHAR 7A40 +ENCODING 31296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +F500 +F580 +F980 +F000 +FF00 +2500 +F200 +5700 +A880 +ENDCHAR +STARTCHAR 7A46 +ENCODING 31302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF00 +5F00 +F100 +5F00 +F480 +5D00 +4700 +5F00 +5800 +ENDCHAR +STARTCHAR 7A49 +ENCODING 31305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +D080 +FF00 +5B00 +D000 +DF00 +5F80 +6200 +6200 +ENDCHAR +STARTCHAR 7A4D +ENCODING 31309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF00 +4F00 +FF80 +4F00 +7100 +DF00 +CF00 +4A00 +5180 +ENDCHAR +STARTCHAR 7A4E +ENCODING 31310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AF80 +C200 +9F00 +E900 +2F00 +CF00 +F900 +6F00 +DD00 +4880 +ENDCHAR +STARTCHAR 7A57 +ENCODING 31319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF80 +5F00 +FF00 +5F00 +E500 +7F80 +5B00 +5980 +6E00 +ENDCHAR +STARTCHAR 7A61 +ENCODING 31329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +DF00 +5D00 +FE80 +5F80 +FF00 +7F00 +5B00 +5500 +5F00 +ENDCHAR +STARTCHAR 7A62 +ENCODING 31330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6C00 +CB00 +5F80 +E300 +5F80 +EE00 +5700 +5D00 +6780 +6D80 +ENDCHAR +STARTCHAR 7A69 +ENCODING 31337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F00 +D500 +5F80 +FF00 +4000 +DF00 +FF00 +4400 +5B00 +6E80 +ENDCHAR +STARTCHAR 7A6B +ENCODING 31339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +DF80 +4C00 +F380 +5F00 +FC00 +7F80 +5F00 +4600 +5980 +ENDCHAR +STARTCHAR 7A70 +ENCODING 31344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F80 +C000 +5F80 +FF00 +5F80 +DF00 +EA00 +5F80 +5F00 +5980 +ENDCHAR +STARTCHAR 7A74 +ENCODING 31348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8100 +BD00 +0400 +2200 +2200 +4200 +C100 +8080 +ENDCHAR +STARTCHAR 7A76 +ENCODING 31350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A900 +3E00 +D000 +FC00 +1400 +2480 +6480 +8300 +ENDCHAR +STARTCHAR 7A79 +ENCODING 31353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +2E +40 +7F +7F +80 +FF +81 +07 +ENDCHAR +STARTCHAR 7A7A +ENCODING 31354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A480 +2500 +4700 +8000 +7F00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR 7A7D +ENCODING 31357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +A9 +4E +24 +FF +24 +FF +64 +84 +ENDCHAR +STARTCHAR 7A7F +ENCODING 31359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A900 +C600 +3F00 +4400 +FF80 +1C00 +6400 +8C00 +ENDCHAR +STARTCHAR 7A81 +ENCODING 31361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A900 +2E00 +CC00 +1200 +FF80 +1800 +2600 +C180 +ENDCHAR +STARTCHAR 7A84 +ENCODING 31364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +A9 +6E +E0 +7F +DF +1F +10 +10 +ENDCHAR +STARTCHAR 7A88 +ENCODING 31368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +2E +40 +44 +5F +A5 +75 +75 +CB +ENDCHAR +STARTCHAR 7A92 +ENCODING 31378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +EE80 +0000 +FF00 +2600 +FD00 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 7A93 +ENCODING 31379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A900 +D600 +2200 +FE00 +1100 +6900 +A280 +BC00 +ENDCHAR +STARTCHAR 7A95 +ENCODING 31381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A900 +4E00 +D900 +5A00 +1400 +EB00 +2880 +C700 +ENDCHAR +STARTCHAR 7A98 +ENCODING 31384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +6600 +7E00 +1200 +FF80 +7E00 +7F00 +A100 +3F00 +ENDCHAR +STARTCHAR 7A9F +ENCODING 31391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +6E +00 +7F +7F +69 +BF +C9 +BF +ENDCHAR +STARTCHAR 7AA9 +ENCODING 31401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +EF +00 +3E +4E +FF +BD +BD +A3 +ENDCHAR +STARTCHAR 7AAA +ENCODING 31402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +A680 +4400 +5F00 +BF00 +8000 +5F00 +4400 +BF80 +ENDCHAR +STARTCHAR 7AAE +ENCODING 31406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +AE +40 +FF +F7 +FF +F9 +71 +B3 +ENDCHAR +STARTCHAR 7AAF +ENCODING 31407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +E680 +2400 +FF00 +7F00 +FF80 +0000 +5500 +9500 +ENDCHAR +STARTCHAR 7ABA +ENCODING 31418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +EE00 +4000 +EF00 +4F00 +FF00 +6F00 +AA80 +9B80 +ENDCHAR +STARTCHAR 7AC4 +ENCODING 31428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +E680 +7F00 +7F00 +7F00 +4A00 +4A00 +6E00 +D980 +ENDCHAR +STARTCHAR 7AC5 +ENCODING 31429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2E00 +4400 +F780 +9D00 +FD00 +7200 +9500 +B880 +ENDCHAR +STARTCHAR 7AC7 +ENCODING 31431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +7F +7E +95 +6A +7F +7F +7F +C3 +ENDCHAR +STARTCHAR 7ACA +ENCODING 31434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +EF +27 +CF +EF +E9 +6F +F7 +51 +ENDCHAR +STARTCHAR 7ACB +ENCODING 31435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +0000 +4200 +2200 +2400 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 7AD7 +ENCODING 31447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +E300 +0B00 +AA80 +AA80 +B300 +AD00 +3200 +CC00 +1000 +ENDCHAR +STARTCHAR 7AD9 +ENCODING 31449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +F780 +A400 +A400 +AF00 +A900 +B900 +CF00 +0900 +ENDCHAR +STARTCHAR 7ADD +ENCODING 31453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +FF80 +2100 +A900 +A900 +A600 +B600 +6600 +9F80 +ENDCHAR +STARTCHAR 7ADF +ENCODING 31455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF80 +0000 +7E00 +7E00 +4200 +7E00 +2480 +C700 +ENDCHAR +STARTCHAR 7AE0 +ENCODING 31456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF00 +0000 +7E00 +7E00 +4200 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 7AE3 +ENCODING 31459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4900 +FE00 +AA80 +B700 +CF00 +A900 +5600 +8600 +1980 +ENDCHAR +STARTCHAR 7AE5 +ENCODING 31461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FF80 +0000 +7E00 +7E00 +4900 +7E00 +FF00 +FF80 +ENDCHAR +STARTCHAR 7AEA +ENCODING 31466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F500 +9600 +F700 +F980 +FF00 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 7AED +ENCODING 31469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +FF +11 +BF +CF +B5 +FB +9F +13 +ENDCHAR +STARTCHAR 7AEF +ENCODING 31471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +F500 +1F00 +A000 +BF80 +DF00 +DA80 +7A80 +9A80 +1B00 +ENDCHAR +STARTCHAR 7AF6 +ENCODING 31478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +A500 +FF80 +F700 +9900 +F700 +7600 +BE80 +D900 +ENDCHAR +STARTCHAR 7AF9 +ENCODING 31481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +7780 +AA00 +AA00 +2200 +2200 +2200 +2200 +2600 +ENDCHAR +STARTCHAR 7AFA +ENCODING 31482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4400 +7780 +AA00 +8100 +0000 +7F00 +0000 +0000 +FF00 +ENDCHAR +STARTCHAR 7AFF +ENCODING 31487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +7F00 +0800 +0800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 7B0F +ENCODING 31503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +4000 +7F00 +9500 +A500 +4900 +9100 +2600 +ENDCHAR +STARTCHAR 7B11 +ENCODING 31505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +0300 +7C00 +0800 +FF80 +1800 +6600 +8100 +ENDCHAR +STARTCHAR 7B19 +ENCODING 31513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +4800 +4800 +7F00 +FE00 +8800 +0800 +FF80 +ENDCHAR +STARTCHAR 7B1B +ENCODING 31515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7780 +AA00 +0800 +7F00 +8900 +7F00 +8900 +7F00 +8100 +ENDCHAR +STARTCHAR 7B1E +ENCODING 31518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +BA00 +2200 +FF00 +0100 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 7B20 +ENCODING 31520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +0800 +FF00 +0000 +2200 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 7B26 +ENCODING 31526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +2200 +4200 +5F80 +D200 +CA00 +4200 +4600 +ENDCHAR +STARTCHAR 7B2C +ENCODING 31532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF00 +0900 +7F00 +FF00 +3100 +4B00 +8800 +ENDCHAR +STARTCHAR 7B2D +ENCODING 31533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +1800 +7E00 +8180 +7F00 +1100 +1600 +1000 +ENDCHAR +STARTCHAR 7B39 +ENCODING 31545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +5200 +5200 +FF80 +5200 +4E00 +7F00 +4000 +ENDCHAR +STARTCHAR 7B46 +ENCODING 31558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +7F00 +FF80 +7F00 +FF00 +0800 +FF80 +0800 +ENDCHAR +STARTCHAR 7B49 +ENCODING 31561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +7E00 +0800 +FF00 +0400 +FF00 +2400 +0C00 +ENDCHAR +STARTCHAR 7B4B +ENCODING 31563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +F400 +9F00 +F500 +9500 +F500 +9900 +AB00 +ENDCHAR +STARTCHAR 7B4C +ENCODING 31564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +3800 +1400 +6200 +FF00 +7E00 +0800 +FF00 +ENDCHAR +STARTCHAR 7B4D +ENCODING 31565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4400 +7F80 +AA00 +7F00 +8100 +FD00 +7D00 +7D00 +4300 +ENDCHAR +STARTCHAR 7B4F +ENCODING 31567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7780 +AA00 +AE00 +4F00 +F900 +C600 +4400 +5A80 +5100 +ENDCHAR +STARTCHAR 7B50 +ENCODING 31568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +FF00 +BE00 +8800 +BE00 +BF00 +FF00 +8000 +ENDCHAR +STARTCHAR 7B51 +ENCODING 31569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +0000 +EE00 +4E00 +4E00 +6E00 +D280 +1180 +ENDCHAR +STARTCHAR 7B52 +ENCODING 31570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF00 +8100 +BD00 +BD00 +A500 +BD00 +A300 +ENDCHAR +STARTCHAR 7B54 +ENCODING 31572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +1800 +6600 +BD00 +0000 +7E00 +4200 +7E00 +ENDCHAR +STARTCHAR 7B56 +ENCODING 31574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +FF00 +0800 +7F00 +9900 +AF00 +4B00 +8980 +ENDCHAR +STARTCHAR 7B60 +ENCODING 31584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7780 +AA00 +4800 +4F00 +F100 +5F00 +4F00 +6100 +C300 +ENDCHAR +STARTCHAR 7B6C +ENCODING 31596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +0A00 +7F00 +8900 +7600 +9400 +BA80 +9100 +ENDCHAR +STARTCHAR 7B6E +ENCODING 31598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +0000 +FF00 +4A00 +4A00 +6D00 +AD00 +FF80 +ENDCHAR +STARTCHAR 7B75 +ENCODING 31605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +C300 +5C00 +6B00 +2C00 +4F80 +4000 +BF80 +ENDCHAR +STARTCHAR 7B7D +ENCODING 31613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +A800 +BE00 +BE00 +8000 +7E00 +FF80 +3400 +C380 +ENDCHAR +STARTCHAR 7B87 +ENCODING 31623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF00 +8900 +BF00 +BD00 +BD00 +FF00 +8100 +ENDCHAR +STARTCHAR 7B8B +ENCODING 31627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AE00 +3F00 +CD00 +F700 +0800 +FF00 +0C80 +F300 +ENDCHAR +STARTCHAR 7B8F +ENCODING 31631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +7E00 +C900 +FE00 +FF80 +7200 +0E00 +3000 +ENDCHAR +STARTCHAR 7B94 +ENCODING 31636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +4400 +1F00 +D100 +3F00 +5100 +9F00 +9100 +ENDCHAR +STARTCHAR 7B95 +ENCODING 31637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +FF00 +2200 +3E00 +3E00 +FF80 +2600 +C100 +ENDCHAR +STARTCHAR 7B97 +ENCODING 31639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +7E00 +7E00 +7E00 +7E00 +FF80 +2400 +C400 +ENDCHAR +STARTCHAR 7B9A +ENCODING 31642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +6500 +9500 +FD00 +0500 +F500 +F100 +9300 +ENDCHAR +STARTCHAR 7B9D +ENCODING 31645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7780 +AA00 +4900 +FF80 +4900 +6F00 +C900 +4F00 +C900 +ENDCHAR +STARTCHAR 7BA1 +ENCODING 31649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF00 +FF00 +4200 +7E00 +7E00 +4200 +7E00 +ENDCHAR +STARTCHAR 7BAD +ENCODING 31661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AE00 +FF80 +0000 +F500 +B500 +D500 +B500 +B300 +ENDCHAR +STARTCHAR 7BB1 +ENCODING 31665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +4F00 +F900 +4F00 +6900 +DF00 +CF00 +4900 +ENDCHAR +STARTCHAR 7BB4 +ENCODING 31668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +0600 +FF80 +FD00 +B600 +B600 +CE80 +9100 +ENDCHAR +STARTCHAR 7BB8 +ENCODING 31672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +BA00 +7D00 +1200 +FF80 +BE00 +2200 +3E00 +3E00 +ENDCHAR +STARTCHAR 7BC0 +ENCODING 31680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +F700 +9500 +F500 +F500 +F500 +F700 +8400 +ENDCHAR +STARTCHAR 7BC1 +ENCODING 31681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +BA00 +7E00 +7E00 +7E00 +0000 +FF00 +7F00 +FF80 +ENDCHAR +STARTCHAR 7BC4 +ENCODING 31684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +F700 +F500 +B500 +F700 +F400 +F480 +2700 +ENDCHAR +STARTCHAR 7BC6 +ENCODING 31686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7780 +A800 +3E00 +3C00 +FF80 +F500 +DE00 +6B00 +D980 +ENDCHAR +STARTCHAR 7BC7 +ENCODING 31687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +A300 +7E00 +7F00 +7F00 +FF00 +D500 +FF00 +D500 +ENDCHAR +STARTCHAR 7BC9 +ENCODING 31689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +EE00 +6E80 +D100 +1000 +FF80 +2E00 +C980 +ENDCHAR +STARTCHAR 7BD2 +ENCODING 31698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +BA00 +7E00 +8180 +7E00 +4200 +7E00 +5E00 +E300 +ENDCHAR +STARTCHAR 7BE0 +ENCODING 31712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +EE00 +4F00 +B900 +BF00 +A400 +7F00 +6A00 +5580 +ENDCHAR +STARTCHAR 7BE4 +ENCODING 31716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +7F00 +7F00 +7F00 +4800 +7F00 +AD00 +AB00 +ENDCHAR +STARTCHAR 7BE9 +ENCODING 31721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +4F80 +E200 +EF00 +8A80 +EA80 +9B00 +E200 +ENDCHAR +STARTCHAR 7C07 +ENCODING 31751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +EA00 +4F00 +F400 +6F00 +AF00 +A600 +AF00 +E880 +ENDCHAR +STARTCHAR 7C12 +ENCODING 31762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +7E00 +7E00 +7E00 +7E00 +FF80 +5A00 +B300 +FD00 +ENDCHAR +STARTCHAR 7C1E +ENCODING 31774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +FF00 +F700 +0000 +7E00 +7E00 +7E00 +FF80 +0800 +ENDCHAR +STARTCHAR 7C21 +ENCODING 31777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AA00 +F700 +9900 +F700 +BD00 +BD00 +BD00 +8300 +ENDCHAR +STARTCHAR 7C27 +ENCODING 31783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +FF00 +3C00 +0000 +FF80 +7F00 +4900 +7F00 +E380 +ENDCHAR +STARTCHAR 7C2A +ENCODING 31786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +FF00 +6600 +DF00 +7680 +FF80 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR 7C2B +ENCODING 31787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +FF00 +FF80 +7F00 +AD00 +6F00 +FF00 +EF00 +AD00 +ENDCHAR +STARTCHAR 7C3D +ENCODING 31805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +BA00 +7E00 +8180 +7F00 +7F00 +2200 +6600 +9900 +ENDCHAR +STARTCHAR 7C3E +ENCODING 31806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF80 +FF00 +BF00 +FF80 +BF00 +B600 +D500 +ENDCHAR +STARTCHAR 7C3F +ENCODING 31807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +AE00 +7F80 +1F00 +A500 +1F00 +7F80 +9200 +8E00 +ENDCHAR +STARTCHAR 7C43 +ENCODING 31811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AC00 +F780 +9800 +E700 +F000 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR 7C4C +ENCODING 31820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +FF00 +7E00 +FF00 +7F00 +0000 +7F00 +FF00 +F600 +ENDCHAR +STARTCHAR 7C4D +ENCODING 31821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF80 +4500 +FF80 +FF00 +6900 +DF00 +4900 +ENDCHAR +STARTCHAR 7C60 +ENCODING 31840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +EA00 +FF00 +FF00 +0F00 +FF00 +FF00 +FF80 +BF00 +ENDCHAR +STARTCHAR 7C64 +ENCODING 31844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7780 +EC00 +BD00 +FF00 +DD00 +D300 +5A00 +5E80 +E500 +ENDCHAR +STARTCHAR 7C6C +ENCODING 31852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +F500 +F780 +FE00 +FF00 +F700 +F780 +9400 +ENDCHAR +STARTCHAR 7C73 +ENCODING 31859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +49 +2A +08 +FF +18 +2C +4B +89 +08 +ENDCHAR +STARTCHAR 7C83 +ENCODING 31875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +F200 +F280 +4F00 +F200 +5200 +F200 +5280 +4E80 +5300 +ENDCHAR +STARTCHAR 7C89 +ENCODING 31881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +D900 +E900 +5100 +FF80 +6500 +E500 +C900 +5900 +5700 +ENDCHAR +STARTCHAR 7C92 +ENCODING 31890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF80 +E000 +4900 +E900 +6900 +DA00 +CA00 +4200 +5F80 +ENDCHAR +STARTCHAR 7C95 +ENCODING 31893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +42 +E4 +EF +49 +E9 +6F +E9 +C9 +4F +49 +ENDCHAR +STARTCHAR 7C97 +ENCODING 31895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +D900 +E900 +4F00 +F900 +6900 +5F00 +C900 +4900 +5F80 +ENDCHAR +STARTCHAR 7C98 +ENCODING 31896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +D400 +D380 +4400 +F400 +6F00 +5900 +C900 +CF00 +4900 +ENDCHAR +STARTCHAR 7C9F +ENCODING 31903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +9500 +FF00 +2A00 +FF80 +1C00 +6A00 +8900 +ENDCHAR +STARTCHAR 7CA5 +ENCODING 31909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +CB +6D +55 +CB +BC +DB +55 +2D +49 +CB +ENDCHAR +STARTCHAR 7CA7 +ENCODING 31911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +DF80 +E800 +4A00 +EA00 +7700 +F200 +D200 +5200 +5F80 +ENDCHAR +STARTCHAR 7CAE +ENCODING 31918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +EF00 +E900 +4F00 +E900 +6F00 +ED00 +CA00 +4D00 +5880 +ENDCHAR +STARTCHAR 7CB1 +ENCODING 31921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +9B00 +7A80 +B600 +8800 +2C00 +FF00 +6E00 +8980 +ENDCHAR +STARTCHAR 7CB2 +ENCODING 31922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3F00 +F500 +5600 +6980 +AA00 +FF00 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 7CB3 +ENCODING 31923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +E400 +EF00 +5500 +EF00 +4F00 +EC00 +C400 +5A00 +5180 +ENDCHAR +STARTCHAR 7CB9 +ENCODING 31929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF80 +E900 +4900 +EB00 +5680 +6400 +FF80 +C400 +4400 +ENDCHAR +STARTCHAR 7CBE +ENCODING 31934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +FF00 +5F80 +E000 +4F00 +F500 +CF00 +5100 +5300 +ENDCHAR +STARTCHAR 7CCA +ENCODING 31946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4B +EB +FF +4B +EB +5B +F7 +5B +55 +45 +ENDCHAR +STARTCHAR 7CD6 +ENCODING 31958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +FF00 +5500 +FF80 +5F00 +FF00 +5900 +5900 +6F00 +ENDCHAR +STARTCHAR 7CDE +ENCODING 31966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +FF00 +2C00 +FF80 +4900 +7F00 +FF00 +FF80 +2000 +C300 +ENDCHAR +STARTCHAR 7CDF +ENCODING 31967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +FF80 +FF00 +5A80 +FF00 +4000 +EF00 +5100 +4F00 +5100 +ENDCHAR +STARTCHAR 7CE0 +ENCODING 31968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF80 +FF00 +5300 +FF80 +5F00 +FA80 +5700 +5B00 +6480 +ENDCHAR +STARTCHAR 7CE7 +ENCODING 31975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +EF00 +EF00 +4000 +FF80 +4F00 +EF00 +CF00 +5F00 +5F80 +ENDCHAR +STARTCHAR 7CFB +ENCODING 31995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +06 +78 +12 +64 +1A +FF +2C +4B +89 +ENDCHAR +STARTCHAR 7CFE +ENCODING 31998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +C900 +A900 +6900 +5900 +F980 +D700 +D900 +D100 +4100 +ENDCHAR +STARTCHAR 7D00 +ENCODING 32000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +AF00 +C100 +6100 +EF00 +5800 +E800 +D880 +C880 +4F00 +ENDCHAR +STARTCHAR 7D02 +ENCODING 32002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +6100 +AF80 +4100 +6900 +F500 +D500 +D100 +D100 +4300 +ENDCHAR +STARTCHAR 7D04 +ENCODING 32004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +C8 +AF +49 +55 +F5 +D3 +D1 +D1 +47 +ENDCHAR +STARTCHAR 7D05 +ENCODING 32005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4F00 +A200 +4200 +5200 +F200 +D200 +D200 +D200 +5F80 +ENDCHAR +STARTCHAR 7D06 +ENCODING 32006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4F00 +A200 +C200 +6F80 +F200 +E200 +E200 +D200 +4C00 +ENDCHAR +STARTCHAR 7D07 +ENCODING 32007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4800 +AF80 +5000 +7E00 +E200 +E400 +D880 +D080 +5F00 +ENDCHAR +STARTCHAR 7D08 +ENCODING 32008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +A800 +BE00 +4A00 +7A00 +EE00 +EE00 +EA00 +D280 +6300 +ENDCHAR +STARTCHAR 7D0A +ENCODING 32010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +3C00 +6380 +9400 +2A00 +1F00 +EA00 +4B00 +8900 +ENDCHAR +STARTCHAR 7D0B +ENCODING 32011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +BF80 +4900 +6A00 +F600 +E600 +DE00 +D900 +5080 +ENDCHAR +STARTCHAR 7D0D +ENCODING 32013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4C +A4 +BF +55 +B5 +F7 +F9 +F1 +D1 +53 +ENDCHAR +STARTCHAR 7D10 +ENCODING 32016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +6F00 +C500 +6500 +FF80 +4900 +E900 +E900 +C900 +5F80 +ENDCHAR +STARTCHAR 7D14 +ENCODING 32020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +BC00 +4D00 +6D00 +ED00 +EF00 +E400 +E480 +4300 +ENDCHAR +STARTCHAR 7D17 +ENCODING 32023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6D00 +AD00 +4D00 +7480 +E500 +EE00 +E200 +DC00 +5000 +ENDCHAR +STARTCHAR 7D18 +ENCODING 32024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6800 +A800 +5F80 +6800 +EA00 +4A00 +ED00 +ED00 +D500 +5E80 +ENDCHAR +STARTCHAR 7D19 +ENCODING 32025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +4A00 +AA00 +CA00 +6F80 +EA00 +EA00 +EA00 +DE80 +5900 +ENDCHAR +STARTCHAR 7D1A +ENCODING 32026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +BE00 +4A00 +6A00 +EB00 +5D00 +ED00 +F200 +D500 +6880 +ENDCHAR +STARTCHAR 7D1B +ENCODING 32027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4600 +A900 +C900 +7100 +EF80 +E500 +E500 +D900 +5700 +ENDCHAR +STARTCHAR 7D20 +ENCODING 32032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +FF80 +1400 +3A00 +FF00 +0800 +6A00 +8900 +ENDCHAR +STARTCHAR 7D21 +ENCODING 32033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +E400 +BF80 +4400 +6700 +F500 +E900 +D900 +D100 +5300 +ENDCHAR +STARTCHAR 7D22 +ENCODING 32034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +91 +A5 +1A +D3 +3C +6A +89 +ENDCHAR +STARTCHAR 7D2B +ENCODING 32043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +B600 +B480 +C700 +1400 +3800 +1B00 +FC80 +6A00 +8900 +ENDCHAR +STARTCHAR 7D2C +ENCODING 32044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +64 +AF +4D +6D +EF +ED +ED +EF +49 +ENDCHAR +STARTCHAR 7D2E +ENCODING 32046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F400 +5400 +B480 +3700 +3400 +1A00 +FF00 +6A00 +8900 +ENDCHAR +STARTCHAR 7D2F +ENCODING 32047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7F +89 +7F +54 +3A +FF +6A +89 +ENDCHAR +STARTCHAR 7D30 +ENCODING 32048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +75 +B5 +55 +6F +F5 +F5 +F5 +CF +51 +ENDCHAR +STARTCHAR 7D33 +ENCODING 32051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +A4 +AF +55 +6F +F5 +EF +E5 +C4 +44 +ENDCHAR +STARTCHAR 7D35 +ENCODING 32053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +B080 +D080 +7F80 +E400 +E400 +E400 +E400 +4C00 +ENDCHAR +STARTCHAR 7D39 +ENCODING 32057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +65 +A5 +49 +73 +EF +E9 +E9 +CF +49 +ENDCHAR +STARTCHAR 7D3A +ENCODING 32058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +A900 +5F80 +6900 +F900 +5F00 +E900 +D900 +DF00 +4900 +ENDCHAR +STARTCHAR 7D42 +ENCODING 32066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +6F00 +A900 +DA00 +6600 +EF00 +FB80 +E000 +EC00 +4300 +ENDCHAR +STARTCHAR 7D43 +ENCODING 32067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6200 +AF80 +C400 +6500 +EA00 +E700 +E500 +DB80 +5C80 +ENDCHAR +STARTCHAR 7D44 +ENCODING 32068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +A900 +6900 +6F00 +E900 +EF00 +E900 +D900 +5F80 +ENDCHAR +STARTCHAR 7D45 +ENCODING 32069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +71 +B1 +57 +77 +F7 +F7 +F5 +D1 +53 +ENDCHAR +STARTCHAR 7D46 +ENCODING 32070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6D00 +AD00 +5480 +6F00 +E400 +FF80 +E400 +D400 +4400 +ENDCHAR +STARTCHAR 7D50 +ENCODING 32080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6400 +BF80 +4400 +6F00 +E000 +EF00 +D900 +DF00 +4900 +ENDCHAR +STARTCHAR 7D5E +ENCODING 32094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +4A00 +6900 +F080 +4900 +E600 +E600 +C900 +5080 +ENDCHAR +STARTCHAR 7D61 +ENCODING 32097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +A900 +D600 +6700 +F980 +EF00 +E900 +DF00 +4900 +ENDCHAR +STARTCHAR 7D62 +ENCODING 32098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +68 +AF +DF +7B +EF +EB +EF +E1 +43 +ENDCHAR +STARTCHAR 7D66 +ENCODING 32102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +A900 +5F80 +6000 +EF00 +E900 +E900 +CF00 +4900 +ENDCHAR +STARTCHAR 7D68 +ENCODING 32104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +A280 +DF80 +4A00 +AA00 +FF00 +EB00 +EA00 +CE80 +5500 +ENDCHAR +STARTCHAR 7D6A +ENCODING 32106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +B5 +D5 +5F +75 +F5 +F7 +F9 +FF +51 +ENDCHAR +STARTCHAR 7D6E +ENCODING 32110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +F7 +99 +67 +99 +76 +1B +FC +6A +89 +ENDCHAR +STARTCHAR 7D71 +ENCODING 32113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +8F80 +A500 +4B00 +6C80 +EA00 +DA00 +EA00 +DA80 +5380 +ENDCHAR +STARTCHAR 7D72 +ENCODING 32114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4D00 +A500 +4200 +5500 +FF00 +DB00 +DB00 +DA80 +4200 +ENDCHAR +STARTCHAR 7D73 +ENCODING 32115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +B900 +4600 +BB80 +EF00 +EA00 +FF80 +E200 +4200 +ENDCHAR +STARTCHAR 7D76 +ENCODING 32118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6E00 +AA00 +DF00 +7B00 +EB00 +4F00 +E800 +E880 +EF00 +ENDCHAR +STARTCHAR 7D79 +ENCODING 32121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +69 +AF +40 +6F +EF +E9 +EF +D1 +4B +ENDCHAR +STARTCHAR 7D7F +ENCODING 32127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +A500 +DF80 +7500 +EF00 +4600 +ED00 +F500 +E480 +4C00 +ENDCHAR +STARTCHAR 7D8E +ENCODING 32142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +BE00 +CA00 +D200 +BF80 +EA00 +FA00 +FB00 +DC00 +6780 +ENDCHAR +STARTCHAR 7D8F +ENCODING 32143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +6F00 +AD00 +5280 +6400 +FF80 +E900 +EA00 +C500 +4880 +ENDCHAR +STARTCHAR 7D93 +ENCODING 32147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +6B00 +AD00 +5600 +6D00 +EB00 +EF00 +E400 +D400 +5F80 +ENDCHAR +STARTCHAR 7D9C +ENCODING 32156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +B080 +4F00 +A000 +FF80 +ED00 +F500 +D480 +4C00 +ENDCHAR +STARTCHAR 7DA0 +ENCODING 32160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +6F00 +AE00 +4200 +7F80 +F500 +EE00 +ED00 +D480 +4C00 +ENDCHAR +STARTCHAR 7DA2 +ENCODING 32162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +75 +B7 +4F +75 +F1 +F7 +D7 +D7 +53 +ENDCHAR +STARTCHAR 7DAC +ENCODING 32172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +6D00 +AD00 +5F00 +7080 +FF00 +E900 +E600 +C700 +5900 +ENDCHAR +STARTCHAR 7DAD +ENCODING 32173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +AA00 +AF80 +5A00 +7F00 +EA00 +EF00 +EA00 +EF80 +4800 +ENDCHAR +STARTCHAR 7DB1 +ENCODING 32177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +BB +B7 +53 +BF +FF +FF +FF +F9 +53 +ENDCHAR +STARTCHAR 7DB2 +ENCODING 32178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +7B +B7 +DF +75 +FF +F5 +F7 +F1 +51 +ENDCHAR +STARTCHAR 7DB4 +ENCODING 32180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +B700 +C900 +B280 +FF80 +F700 +E900 +F700 +5480 +ENDCHAR +STARTCHAR 7DB5 +ENCODING 32181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +AF00 +B480 +5000 +A400 +FF00 +E600 +ED00 +D480 +4400 +ENDCHAR +STARTCHAR 7DB8 +ENCODING 32184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +A900 +B080 +4E00 +7F00 +F680 +F680 +FF00 +D680 +5700 +ENDCHAR +STARTCHAR 7DBA +ENCODING 32186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +AF80 +C600 +6980 +FF80 +4100 +EF00 +EF00 +EB00 +C300 +ENDCHAR +STARTCHAR 7DBB +ENCODING 32187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +B080 +4F00 +6400 +EC00 +EB00 +EC00 +D400 +5380 +ENDCHAR +STARTCHAR 7DBD +ENCODING 32189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6780 +AF00 +7100 +6F00 +D100 +EF00 +FF80 +E400 +4400 +ENDCHAR +STARTCHAR 7DBE +ENCODING 32190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +C400 +5F80 +FB80 +4400 +EF00 +FA00 +CE00 +5180 +ENDCHAR +STARTCHAR 7DBF +ENCODING 32191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +AF +C9 +6F +EF +44 +FF +F5 +D5 +54 +ENDCHAR +STARTCHAR 7DC7 +ENCODING 32199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A80 +7500 +B500 +4A80 +6000 +EF00 +F480 +EF00 +CF00 +5080 +ENDCHAR +STARTCHAR 7DCA +ENCODING 32202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +F5 +F2 +FD +14 +3A +FF +6E +89 +ENDCHAR +STARTCHAR 7DCB +ENCODING 32203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +AA00 +BB80 +4A00 +7B80 +EA00 +FB80 +EA00 +CA00 +5200 +ENDCHAR +STARTCHAR 7DD6 +ENCODING 32214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F00 +A500 +5F80 +6500 +CF00 +F900 +EF00 +EF00 +4900 +ENDCHAR +STARTCHAR 7DD8 +ENCODING 32216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +A200 +DF80 +5E00 +B280 +FF00 +BD00 +BE00 +9780 +6500 +ENDCHAR +STARTCHAR 7DDA +ENCODING 32218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +AF00 +5100 +AF00 +E500 +FA00 +EA00 +CD00 +5C80 +ENDCHAR +STARTCHAR 7DDD +ENCODING 32221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +6900 +AF00 +DF80 +6900 +EF00 +EF00 +E980 +DF00 +4100 +ENDCHAR +STARTCHAR 7DDE +ENCODING 32222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +BD00 +D580 +BD80 +F000 +5F00 +D500 +FB00 +F300 +5580 +ENDCHAR +STARTCHAR 7DE0 +ENCODING 32224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +A900 +5F80 +B480 +EF00 +ED00 +ED00 +ED00 +4400 +ENDCHAR +STARTCHAR 7DE1 +ENCODING 32225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +A900 +CF00 +6F80 +FE80 +4100 +EF00 +EF00 +EF00 +4900 +ENDCHAR +STARTCHAR 7DE3 +ENCODING 32227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +6F00 +AE00 +C200 +BF80 +F680 +ED00 +F700 +DA80 +4400 +ENDCHAR +STARTCHAR 7DE8 +ENCODING 32232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +BE00 +DF00 +5100 +BF00 +FF80 +FE80 +FF80 +DE80 +6D80 +ENDCHAR +STARTCHAR 7DE9 +ENCODING 32233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +6F00 +B480 +4F00 +A400 +FF80 +EF00 +ED00 +D600 +4D80 +ENDCHAR +STARTCHAR 7DEC +ENCODING 32236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +BF80 +A400 +5F00 +BB00 +F700 +FB00 +F700 +FF00 +5100 +ENDCHAR +STARTCHAR 7DEF +ENCODING 32239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +BF80 +4000 +6F00 +EF00 +FF00 +EA00 +DF80 +4200 +ENDCHAR +STARTCHAR 7DF4 +ENCODING 32244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +A400 +DF00 +7F00 +FF00 +E600 +FD00 +D480 +4400 +ENDCHAR +STARTCHAR 7DFB +ENCODING 32251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +B200 +D780 +5F00 +BB00 +EB00 +FD00 +E900 +DF00 +4480 +ENDCHAR +STARTCHAR 7E09 +ENCODING 32265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +AA00 +BF00 +5080 +BF80 +E000 +EF00 +EF00 +F100 +4F00 +ENDCHAR +STARTCHAR 7E0A +ENCODING 32266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +6900 +B080 +CE00 +6E00 +F100 +FF80 +F700 +F700 +5F80 +ENDCHAR +STARTCHAR 7E15 +ENCODING 32277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +7500 +B500 +4B00 +AF00 +E000 +FF00 +F700 +D700 +5F80 +ENDCHAR +STARTCHAR 7E1B +ENCODING 32283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +7F80 +BF00 +5480 +7F80 +FF00 +E100 +DF80 +D900 +4200 +ENDCHAR +STARTCHAR 7E1D +ENCODING 32285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B80 +AF00 +C000 +5700 +B700 +F700 +F700 +FF80 +EA00 +5180 +ENDCHAR +STARTCHAR 7E1E +ENCODING 32286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +A000 +AF00 +4F00 +6000 +FF00 +F680 +F680 +D480 +5100 +ENDCHAR +STARTCHAR 7E1F +ENCODING 32287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +7000 +BF00 +5F80 +7B00 +FD80 +F100 +FF80 +D500 +4300 +ENDCHAR +STARTCHAR 7E21 +ENCODING 32289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +B480 +CF00 +6A00 +FF80 +E400 +EF00 +E400 +4400 +ENDCHAR +STARTCHAR 7E23 +ENCODING 32291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F80 +F200 +DD00 +F600 +8500 +FF80 +B680 +B680 +AA00 +ENDCHAR +STARTCHAR 7E2B +ENCODING 32299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +AF00 +A500 +5F80 +A200 +D700 +F700 +F780 +DA00 +5780 +ENDCHAR +STARTCHAR 7E2E +ENCODING 32302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +B880 +4F00 +B200 +F700 +EC80 +EF00 +EF00 +4C80 +ENDCHAR +STARTCHAR 7E2F +ENCODING 32303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +B080 +CF00 +6F00 +F500 +EF00 +EF00 +CB00 +5080 +ENDCHAR +STARTCHAR 7E31 +ENCODING 32305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +B500 +DF00 +CF00 +BA80 +F200 +F780 +F600 +D600 +5B80 +ENDCHAR +STARTCHAR 7E37 +ENCODING 32311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +BF80 +4F00 +BF00 +F500 +FF80 +EA00 +C600 +5900 +ENDCHAR +STARTCHAR 7E3D +ENCODING 32317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +B700 +5B00 +B700 +FF00 +E400 +FB00 +D980 +4600 +ENDCHAR +STARTCHAR 7E3E +ENCODING 32318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +AF00 +5F80 +6F00 +E900 +EF00 +EF00 +EB00 +5180 +ENDCHAR +STARTCHAR 7E41 +ENCODING 32321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +B780 +FD00 +D300 +FC80 +3400 +2A00 +FF00 +6E00 +8900 +ENDCHAR +STARTCHAR 7E43 +ENCODING 32323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +55 +B5 +DF +5F +B7 +FF +F7 +FF +D7 +5B +ENDCHAR +STARTCHAR 7E46 +ENCODING 32326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5B00 +BA80 +AB00 +5680 +7A00 +F580 +E600 +FD00 +FE00 +5800 +ENDCHAR +STARTCHAR 7E47 +ENCODING 32327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +7E00 +A500 +4600 +C300 +7F00 +F700 +2700 +BA80 +F200 +ENDCHAR +STARTCHAR 7E52 +ENCODING 32338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +B100 +BF80 +7F00 +BF00 +E000 +EF00 +EF00 +CF00 +5100 +ENDCHAR +STARTCHAR 7E54 +ENCODING 32340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +BF00 +D680 +DF80 +8200 +FF00 +FD00 +FE00 +D680 +4580 +ENDCHAR +STARTCHAR 7E55 +ENCODING 32341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +7F80 +AF00 +DF80 +6D00 +FF80 +E000 +EF00 +CF00 +4900 +ENDCHAR +STARTCHAR 7E5E +ENCODING 32350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +BF00 +C900 +7F00 +F380 +FF80 +EA00 +EA80 +5300 +ENDCHAR +STARTCHAR 7E61 +ENCODING 32353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +BF80 +5F00 +BF00 +FD00 +FF00 +F500 +DF00 +6F00 +ENDCHAR +STARTCHAR 7E69 +ENCODING 32361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +B700 +DB00 +4E00 +B700 +FB00 +F680 +FB00 +D680 +4700 +ENDCHAR +STARTCHAR 7E6A +ENCODING 32362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +D080 +5F00 +BF00 +FF00 +FF00 +F100 +FF00 +5F00 +ENDCHAR +STARTCHAR 7E6B +ENCODING 32363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F600 +F580 +F980 +FF00 +4600 +FD80 +2A00 +FF00 +2E00 +C900 +ENDCHAR +STARTCHAR 7E6D +ENCODING 32365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +EF00 +AF00 +F700 +F500 +B700 +AB00 +ENDCHAR +STARTCHAR 7E70 +ENCODING 32368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +6900 +CF00 +FF00 +7F00 +C000 +FF80 +E600 +CD80 +5400 +ENDCHAR +STARTCHAR 7E79 +ENCODING 32377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +B680 +BF00 +4F00 +6400 +DF80 +FF80 +EF00 +E400 +4400 +ENDCHAR +STARTCHAR 7E7C +ENCODING 32380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5900 +BF00 +DD00 +BF80 +FF80 +5900 +FF00 +FD00 +DF80 +5F80 +ENDCHAR +STARTCHAR 7E82 +ENCODING 32386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +6200 +5E00 +7E00 +FF80 +5200 +9980 +7C00 +6A00 +ENDCHAR +STARTCHAR 7E8C +ENCODING 32396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +A000 +5F00 +7F00 +FF00 +FF00 +FF00 +DF00 +5980 +ENDCHAR +STARTCHAR 7E8F +ENCODING 32399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +DB00 +DF00 +B600 +FF00 +B600 +AB00 +AF00 +4F80 +ENDCHAR +STARTCHAR 7E93 +ENCODING 32403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +7F00 +BF00 +DF00 +6700 +F680 +FF80 +EA00 +C600 +5900 +ENDCHAR +STARTCHAR 7E96 +ENCODING 32406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5600 +B700 +DA00 +5F80 +B600 +F680 +F500 +F500 +DB80 +4580 +ENDCHAR +STARTCHAR 7E98 +ENCODING 32408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +BB00 +DF80 +DF00 +BF80 +F100 +FF00 +FF00 +C000 +5980 +ENDCHAR +STARTCHAR 7E9B +ENCODING 32411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +7F00 +FF80 +5A00 +7F00 +7F00 +D500 +F600 +FF00 +B700 +ENDCHAR +STARTCHAR 7E9C +ENCODING 32412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9A00 +DF80 +DB80 +BB80 +FF00 +5F00 +DF00 +FF00 +CA80 +7300 +ENDCHAR +STARTCHAR 7F36 +ENCODING 32566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2000 +7F00 +8800 +0800 +FF80 +8900 +8900 +7F00 +8100 +ENDCHAR +STARTCHAR 7F38 +ENCODING 32568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +C200 +4200 +F200 +D200 +D200 +D200 +F200 +9F80 +ENDCHAR +STARTCHAR 7F3A +ENCODING 32570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +E400 +CF00 +4500 +F500 +5F80 +D400 +DA00 +F900 +1080 +ENDCHAR +STARTCHAR 7F4C +ENCODING 32588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +9900 +FF00 +6700 +B900 +7F00 +FF80 +8900 +7F00 +ENDCHAR +STARTCHAR 7F50 +ENCODING 32592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9F80 +EA00 +DF00 +5F00 +EA00 +EF80 +FF00 +EB00 +EE00 +8F80 +ENDCHAR +STARTCHAR 7F54 +ENCODING 32596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A5 +FF +89 +FF +A1 +BD +81 +83 +ENDCHAR +STARTCHAR 7F55 +ENCODING 32597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A900 +2E00 +C000 +7F00 +0800 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 7F6A +ENCODING 32618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +0000 +F700 +1400 +F700 +E780 +2400 +C400 +ENDCHAR +STARTCHAR 7F6B +ENCODING 32619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +2200 +FA00 +FA00 +0300 +FA80 +3A00 +E200 +ENDCHAR +STARTCHAR 7F6E +ENCODING 32622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +FF80 +1000 +BF00 +A100 +BF00 +A100 +FF80 +ENDCHAR +STARTCHAR 7F70 +ENCODING 32624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +F1 +FD +F5 +F5 +05 +F1 +F3 +ENDCHAR +STARTCHAR 7F72 +ENCODING 32626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +1100 +7E00 +FF80 +3400 +FE00 +3E00 +3E00 +ENDCHAR +STARTCHAR 7F75 +ENCODING 32629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +00 +7F +7F +7F +7F +AD +AB +ENDCHAR +STARTCHAR 7F77 +ENCODING 32631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +6500 +7680 +0700 +F400 +9700 +F480 +B700 +ENDCHAR +STARTCHAR 7F79 +ENCODING 32633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +4800 +EA00 +FF00 +DF00 +5F00 +5200 +4F80 +ENDCHAR +STARTCHAR 7F85 +ENCODING 32645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +4800 +AA00 +6F00 +EF00 +EB00 +DE00 +CF80 +ENDCHAR +STARTCHAR 7F88 +ENCODING 32648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +AF +FF +EA +FF +FF +FD +4F +ENDCHAR +STARTCHAR 7F8A +ENCODING 32650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +FF00 +0800 +7F00 +0800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 7F8C +ENCODING 32652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7F00 +0800 +FF00 +2400 +2400 +4480 +8700 +ENDCHAR +STARTCHAR 7F8E +ENCODING 32654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7F00 +FF80 +0800 +FF00 +1800 +2600 +C180 +ENDCHAR +STARTCHAR 7F94 +ENCODING 32660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +0800 +7E00 +FF00 +0000 +5900 +9500 +9480 +ENDCHAR +STARTCHAR 7F9A +ENCODING 32666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +A400 +AA00 +E900 +5E80 +E000 +7F00 +C500 +4700 +8400 +ENDCHAR +STARTCHAR 7F9E +ENCODING 32670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0800 +7F00 +FF80 +4000 +7E00 +4A00 +FF80 +FF00 +ENDCHAR +STARTCHAR 7FA4 +ENCODING 32676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F500 +5500 +FF80 +5200 +FF00 +7F80 +D200 +F200 +5200 +ENDCHAR +STARTCHAR 7FA8 +ENCODING 32680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +0800 +FF80 +4800 +8F00 +5400 +4A00 +B100 +ENDCHAR +STARTCHAR 7FA9 +ENCODING 32681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +FF80 +3200 +C900 +FF80 +F500 +2680 +5B00 +ENDCHAR +STARTCHAR 7FB2 +ENCODING 32690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +FF80 +E500 +FF80 +6D00 +D200 +3680 +3900 +ENDCHAR +STARTCHAR 7FB8 +ENCODING 32696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0000 +7F00 +1800 +DB00 +D300 +DD00 +BD00 +D580 +ENDCHAR +STARTCHAR 7FB9 +ENCODING 32697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +FF00 +5A00 +B500 +FF00 +FF80 +FF00 +3C00 +C380 +ENDCHAR +STARTCHAR 7FBD +ENCODING 32701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +31 +33 +D5 +99 +77 +99 +11 +33 +ENDCHAR +STARTCHAR 7FC1 +ENCODING 32705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3C +52 +A5 +7E +00 +FF +FF +9D +33 +ENDCHAR +STARTCHAR 7FC5 +ENCODING 32709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5B00 +E900 +5700 +4900 +EB00 +B700 +4500 +6900 +9F80 +ENDCHAR +STARTCHAR 7FCA +ENCODING 32714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +ED +0D +B7 +B5 +CF +77 +85 +0B +ENDCHAR +STARTCHAR 7FCC +ENCODING 32716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +7300 +BF00 +DD00 +0800 +FF00 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 7FCE +ENCODING 32718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +A5 +AD +EF +17 +E5 +6F +77 +65 +4D +ENDCHAR +STARTCHAR 7FD2 +ENCODING 32722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +7D +F7 +BB +08 +7E +7E +42 +7E +ENDCHAR +STARTCHAR 7FD4 +ENCODING 32724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +BF +A5 +ED +57 +F7 +6D +D7 +57 +85 +8F +ENDCHAR +STARTCHAR 7FD5 +ENCODING 32725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +7E00 +8180 +7E00 +0000 +FF00 +7500 +FF00 +BB00 +ENDCHAR +STARTCHAR 7FDF +ENCODING 32735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +73 +BF +DD +7F +CF +FF +48 +7F +ENDCHAR +STARTCHAR 7FE0 +ENCODING 32736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +7F00 +D500 +8800 +FF00 +6200 +DD00 +FF80 +0800 +ENDCHAR +STARTCHAR 7FE1 +ENCODING 32737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +F700 +F700 +1780 +E400 +FF00 +7700 +BB00 +5500 +BB00 +ENDCHAR +STARTCHAR 7FE9 +ENCODING 32745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +15 +E3 +F5 +FB +83 +FF +FB +AB +5D +ENDCHAR +STARTCHAR 7FEB +ENCODING 32747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +D000 +D000 +EF80 +4600 +F600 +F600 +F680 +8980 +ENDCHAR +STARTCHAR 7FF0 +ENCODING 32752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +F600 +4900 +EF80 +E500 +AE80 +F500 +EE80 +5480 +4D00 +ENDCHAR +STARTCHAR 7FF9 +ENCODING 32761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F00 +F500 +F500 +9F00 +B500 +FD00 +FB00 +6500 +A080 +BF00 +ENDCHAR +STARTCHAR 7FFC +ENCODING 32764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +BB00 +DD00 +7F00 +4900 +FF00 +3C00 +FF00 +E380 +ENDCHAR +STARTCHAR 8000 +ENCODING 32768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +ED00 +FF00 +FA00 +BF80 +AA00 +AF00 +AE00 +CF80 +ENDCHAR +STARTCHAR 8001 +ENCODING 32769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1100 +7E00 +1400 +FF80 +1800 +6200 +BC00 +2100 +3F00 +ENDCHAR +STARTCHAR 8003 +ENCODING 32771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1100 +7D00 +1200 +FF80 +1300 +7C00 +BF00 +2100 +0200 +0E00 +ENDCHAR +STARTCHAR 8005 +ENCODING 32773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1100 +7E00 +1400 +FF80 +1600 +7F00 +A100 +3F00 +3F00 +2100 +ENDCHAR +STARTCHAR 8006 +ENCODING 32774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1100 +7E00 +FF80 +3600 +FD00 +3F00 +7E00 +4200 +7E00 +7E00 +ENDCHAR +STARTCHAR 8009 +ENCODING 32777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1100 +7E00 +FF80 +1000 +7E00 +A000 +3F00 +7D00 +7D00 +0600 +ENDCHAR +STARTCHAR 800C +ENCODING 32780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +10 +FF +A5 +A5 +A5 +A5 +A5 +83 +ENDCHAR +STARTCHAR 8010 +ENCODING 32784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2100 +4780 +F900 +ED00 +ED00 +EB00 +E900 +E900 +9300 +ENDCHAR +STARTCHAR 8015 +ENCODING 32789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F500 +4F80 +E500 +4500 +FF80 +6900 +D900 +C900 +5100 +ENDCHAR +STARTCHAR 8017 +ENCODING 32791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +EC00 +4400 +EF00 +4C00 +F580 +6E00 +D400 +C480 +4700 +ENDCHAR +STARTCHAR 8018 +ENCODING 32792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +EF00 +4000 +E000 +4F80 +F400 +6500 +D900 +CF00 +5C80 +ENDCHAR +STARTCHAR 802D +ENCODING 32813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +4600 +FF00 +5D00 +FF80 +5D00 +FF80 +5500 +FA00 +D680 +6D00 +ENDCHAR +STARTCHAR 8033 +ENCODING 32819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4200 +3E00 +4200 +3E00 +4200 +FF80 +0200 +0200 +ENDCHAR +STARTCHAR 8036 +ENCODING 32822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +95 +F5 +96 +F5 +95 +B5 +D7 +14 +ENDCHAR +STARTCHAR 803D +ENCODING 32829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A400 +BF00 +F480 +A600 +E600 +A600 +EA00 +AA80 +3300 +ENDCHAR +STARTCHAR 803F +ENCODING 32831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A400 +AC80 +ED00 +AB00 +F700 +A600 +E500 +A900 +3080 +ENDCHAR +STARTCHAR 8043 +ENCODING 32835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A400 +AF00 +ED00 +AF00 +ED00 +BF80 +E900 +A900 +2B00 +ENDCHAR +STARTCHAR 8046 +ENCODING 32838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A600 +A900 +FE80 +A000 +FF00 +A500 +E500 +A700 +2400 +ENDCHAR +STARTCHAR 804A +ENCODING 32842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +E8 +BB +DB +BB +DB +BB +DB +AA +32 +ENDCHAR +STARTCHAR 8056 +ENCODING 32854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F500 +F500 +9700 +F000 +FF00 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 8058 +ENCODING 32856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +BF00 +F500 +BF00 +FF80 +A800 +EF00 +2100 +2300 +ENDCHAR +STARTCHAR 805A +ENCODING 32858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F000 +FF00 +F700 +FD80 +1600 +7800 +CE00 +2A00 +C980 +ENDCHAR +STARTCHAR 805E +ENCODING 32862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +FF +81 +BF +BD +BD +BD +87 +ENDCHAR +STARTCHAR 806F +ENCODING 32879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +B600 +BB00 +F680 +BF80 +F680 +F680 +BB00 +2A00 +3200 +ENDCHAR +STARTCHAR 8070 +ENCODING 32880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +B700 +FB00 +B700 +FF00 +A400 +FB00 +B980 +2600 +ENDCHAR +STARTCHAR 8072 +ENCODING 32882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4680 +F500 +0800 +FF00 +F200 +8D80 +7F00 +4200 +FF80 +1E00 +ENDCHAR +STARTCHAR 8073 +ENCODING 32883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +DD00 +D700 +D400 +6F80 +FF00 +7E00 +4200 +7F80 +FE00 +ENDCHAR +STARTCHAR 8077 +ENCODING 32887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +BF00 +B680 +DF80 +A200 +DF00 +BF00 +DD00 +3280 +2500 +ENDCHAR +STARTCHAR 807D +ENCODING 32893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +EF00 +F700 +AF00 +E000 +FF80 +FB00 +7980 +B600 +ENDCHAR +STARTCHAR 807E +ENCODING 32894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +6F00 +F700 +F700 +F780 +B700 +FF00 +7E00 +7E00 +FF80 +ENDCHAR +STARTCHAR 807F +ENCODING 32895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7E +09 +FF +7E +08 +FF +FF +08 +08 +ENDCHAR +STARTCHAR 8084 +ENCODING 32900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +DF00 +E500 +8F80 +EF00 +C400 +FF00 +7F80 +A400 +8400 +ENDCHAR +STARTCHAR 8085 +ENCODING 32901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +FF80 +7F00 +AD00 +EF00 +FF00 +EF00 +AD00 +AD00 +ENDCHAR +STARTCHAR 8086 +ENCODING 32902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +E500 +8F80 +EF00 +8400 +FF00 +AF80 +A400 +D400 +ENDCHAR +STARTCHAR 8087 +ENCODING 32903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +FF80 +9D00 +F200 +FF00 +FF80 +7E00 +0800 +FF80 +0800 +ENDCHAR +STARTCHAR 8089 +ENCODING 32905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +08 +FF +99 +AD +DB +BD +E3 +81 +83 +ENDCHAR +STARTCHAR 808B +ENCODING 32907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E4 +A4 +AF +E5 +A5 +E5 +A5 +A9 +A9 +F3 +ENDCHAR +STARTCHAR 808C +ENCODING 32908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +AA00 +EA00 +AA00 +AA00 +EA00 +AA00 +AA80 +F180 +ENDCHAR +STARTCHAR 8096 +ENCODING 32918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4A00 +8900 +FE80 +4200 +7E00 +4200 +7E00 +4200 +4600 +ENDCHAR +STARTCHAR 809B +ENCODING 32923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +A200 +E200 +A200 +A200 +E200 +A200 +AF80 +E000 +ENDCHAR +STARTCHAR 809D +ENCODING 32925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A400 +E400 +A400 +BF80 +E400 +A400 +A400 +E400 +ENDCHAR +STARTCHAR 80A1 +ENCODING 32929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +AA00 +EB80 +9000 +AF00 +E900 +A600 +A600 +E900 +ENDCHAR +STARTCHAR 80A2 +ENCODING 32930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +BF80 +E400 +BF00 +A900 +E600 +A600 +AF00 +F180 +ENDCHAR +STARTCHAR 80A5 +ENCODING 32933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +B500 +F500 +B500 +AF00 +F000 +B080 +B080 +EF00 +ENDCHAR +STARTCHAR 80A9 +ENCODING 32937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +03 +7F +41 +7F +7F +7F +A1 +BF +A3 +ENDCHAR +STARTCHAR 80AA +ENCODING 32938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +BF80 +E800 +AF00 +E900 +A900 +A900 +B100 +F300 +ENDCHAR +STARTCHAR 80AF +ENCODING 32943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +4E +FF +00 +7E +42 +7E +7E +42 +46 +ENDCHAR +STARTCHAR 80B1 +ENCODING 32945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +A800 +BF80 +E800 +AA00 +EA00 +AD00 +B500 +B700 +7C80 +ENDCHAR +STARTCHAR 80B2 +ENCODING 32946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +22 +FF +7E +42 +7E +7E +42 +46 +ENDCHAR +STARTCHAR 80B4 +ENCODING 32948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6600 +3C00 +3300 +FF80 +2000 +FE00 +FE00 +4200 +7E00 +4600 +ENDCHAR +STARTCHAR 80BA +ENCODING 32954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +A400 +E400 +BF00 +B500 +F500 +B500 +B500 +E400 +ENDCHAR +STARTCHAR 80C3 +ENCODING 32963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FE +FE +FE +00 +FC +FC +FC +84 +8C +ENDCHAR +STARTCHAR 80C4 +ENCODING 32964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +FF +00 +7E +7E +42 +7E +46 +ENDCHAR +STARTCHAR 80CC +ENCODING 32972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1500 +E600 +6480 +9700 +7E00 +4200 +7E00 +7E00 +4200 +4600 +ENDCHAR +STARTCHAR 80CE +ENCODING 32974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A800 +A900 +FF00 +A080 +A000 +EF00 +A900 +AF00 +E900 +ENDCHAR +STARTCHAR 80DA +ENCODING 32986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A400 +E400 +A600 +AD00 +F480 +A400 +A400 +FF80 +ENDCHAR +STARTCHAR 80DB +ENCODING 32987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +B5 +F5 +AF +B5 +EF +B4 +A4 +E4 +ENDCHAR +STARTCHAR 80DE +ENCODING 32990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +BF00 +B100 +FF00 +B300 +AF00 +F300 +B000 +B080 +EF00 +ENDCHAR +STARTCHAR 80E1 +ENCODING 32993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +47 +45 +F5 +47 +45 +F5 +97 +F9 +99 +0B +ENDCHAR +STARTCHAR 80E4 +ENCODING 32996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +AA00 +9600 +BE00 +8200 +BE00 +BE00 +BE00 +A680 +AD80 +ENDCHAR +STARTCHAR 80E5 +ENCODING 32997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0F00 +F000 +9F80 +7E00 +7E00 +4200 +7E00 +4600 +ENDCHAR +STARTCHAR 80F1 +ENCODING 33009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +B500 +B500 +ED00 +BF80 +EA00 +AA00 +AA00 +B280 +7380 +ENDCHAR +STARTCHAR 80F4 +ENCODING 33012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +B1 +FF +B7 +BB +F7 +BB +B1 +F3 +ENDCHAR +STARTCHAR 80F8 +ENCODING 33016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E8 +BF +B1 +E5 +BF +F7 +BB +BF +B1 +63 +ENDCHAR +STARTCHAR 80FD +ENCODING 33021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +9900 +F600 +1700 +F000 +9900 +FB00 +F400 +9880 +B700 +ENDCHAR +STARTCHAR 8102 +ENCODING 33026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +AE00 +A880 +EF00 +A000 +EF00 +A900 +AF00 +AF00 +6900 +ENDCHAR +STARTCHAR 8105 +ENCODING 33029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +7E +E6 +FF +75 +FF +42 +7E +7E +46 +ENDCHAR +STARTCHAR 8106 +ENCODING 33030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7400 +5700 +5900 +7FC0 +5B80 +7A80 +5A80 +5B80 +5A40 +BB80 +ENDCHAR +STARTCHAR 8107 +ENCODING 33031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF00 +A500 +C900 +B300 +D200 +BB00 +B680 +B680 +6D00 +ENDCHAR +STARTCHAR 8108 +ENCODING 33032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +BC00 +B100 +F600 +B680 +F700 +B600 +B500 +B700 +5C80 +ENDCHAR +STARTCHAR 810A +ENCODING 33034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FB00 +E700 +7E00 +C380 +7E00 +7E00 +4200 +4600 +ENDCHAR +STARTCHAR 8118 +ENCODING 33048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +B080 +EE00 +A000 +BF00 +EA00 +AA00 +AA80 +F380 +ENDCHAR +STARTCHAR 811A +ENCODING 33050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +CB +AB +BF +CB +BF +D3 +B7 +BF +B6 +C2 +ENDCHAR +STARTCHAR 811B +ENCODING 33051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +AB00 +F500 +B500 +AB00 +E000 +BF00 +A400 +FF80 +ENDCHAR +STARTCHAR 8123 +ENCODING 33059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BE +FF +A6 +FB +BF +A1 +BF +A3 +ENDCHAR +STARTCHAR 8129 +ENCODING 33065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F80 +7900 +A600 +A980 +BF00 +AF00 +A900 +AF00 +8B00 +ENDCHAR +STARTCHAR 812B +ENCODING 33067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +B100 +FF80 +A900 +A900 +EF00 +AA00 +AA80 +F300 +ENDCHAR +STARTCHAR 812F +ENCODING 33071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E500 +BF80 +A400 +FF00 +B500 +BF00 +F500 +BF00 +B500 +F500 +ENDCHAR +STARTCHAR 8139 +ENCODING 33081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +AF00 +E800 +AF00 +BF80 +ED00 +AB00 +AF00 +F880 +ENDCHAR +STARTCHAR 813E +ENCODING 33086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +B500 +FF00 +B500 +BF00 +FA00 +BF80 +A200 +E200 +ENDCHAR +STARTCHAR 814B +ENCODING 33099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF80 +AA00 +D700 +B700 +B700 +D500 +B200 +B500 +D880 +ENDCHAR +STARTCHAR 814E +ENCODING 33102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +F5 +F2 +F5 +7E +42 +7E +42 +46 +ENDCHAR +STARTCHAR 8150 +ENCODING 33104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BF00 +EA00 +A200 +BF00 +CD00 +DB00 +CD00 +5300 +ENDCHAR +STARTCHAR 8151 +ENCODING 33105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF80 +B500 +D900 +BF80 +BD00 +DB00 +BB00 +A900 +EB00 +ENDCHAR +STARTCHAR 8154 +ENCODING 33108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +B680 +EA80 +B300 +E000 +BF00 +A400 +A400 +FF80 +ENDCHAR +STARTCHAR 8155 +ENCODING 33109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF80 +B080 +CF00 +B700 +B700 +CB00 +AB00 +B280 +D300 +ENDCHAR +STARTCHAR 8165 +ENCODING 33125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +AF00 +EF00 +A000 +AA00 +EF00 +BF00 +A200 +FF80 +ENDCHAR +STARTCHAR 8166 +ENCODING 33126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +EB +B5 +B5 +EB +A4 +FF +BB +B5 +BF +71 +ENDCHAR +STARTCHAR 816B +ENCODING 33131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +BC00 +BF80 +FF00 +BF00 +F500 +BF00 +A400 +7F80 +ENDCHAR +STARTCHAR 8170 +ENCODING 33136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +AA00 +DF00 +BF00 +A400 +DF80 +AA00 +A600 +D900 +ENDCHAR +STARTCHAR 8171 +ENCODING 33137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C200 +B700 +D300 +DF80 +D700 +CF00 +B200 +BF00 +D200 +EF80 +ENDCHAR +STARTCHAR 8178 +ENCODING 33144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +BF00 +DF00 +A000 +BF80 +CF00 +BA80 +B500 +4B00 +ENDCHAR +STARTCHAR 8179 +ENCODING 33145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +AF80 +BF00 +F100 +AF00 +EF00 +AF00 +BA00 +A600 +7980 +ENDCHAR +STARTCHAR 817A +ENCODING 33146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +B100 +FF00 +BF00 +E500 +BE00 +AE00 +AD00 +7C80 +ENDCHAR +STARTCHAR 817F +ENCODING 33151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D700 +A500 +D700 +B700 +A600 +D500 +AE80 +B800 +D780 +ENDCHAR +STARTCHAR 8180 +ENCODING 33152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +AA00 +FF80 +B480 +FF80 +A800 +AF00 +B900 +F700 +ENDCHAR +STARTCHAR 8188 +ENCODING 33160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +AF00 +EF00 +A000 +BF00 +FB00 +B080 +BE80 +F500 +ENDCHAR +STARTCHAR 818A +ENCODING 33162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C500 +BF80 +BF00 +D500 +BF00 +BF00 +D500 +BF80 +A900 +C600 +ENDCHAR +STARTCHAR 818F +ENCODING 33167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FF +7E +7E +FF +BF +3E +7E +7E +7E +46 +ENDCHAR +STARTCHAR 819A +ENCODING 33178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1F +FF +FF +9E +E9 +FF +B6 +BF +BF +23 +ENDCHAR +STARTCHAR 819C +ENCODING 33180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DF80 +AA00 +A000 +DF00 +BF00 +BF00 +DF80 +A400 +AB00 +D180 +ENDCHAR +STARTCHAR 819D +ENCODING 33181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +AF00 +F480 +AB00 +B480 +ED00 +AF00 +B580 +CC00 +ENDCHAR +STARTCHAR 81A0 +ENCODING 33184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DB00 +A900 +DB00 +A600 +BD80 +DA00 +A500 +BE00 +5800 +ENDCHAR +STARTCHAR 81A3 +ENCODING 33187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF80 +AB00 +D000 +BF00 +AA00 +DF00 +BF00 +A400 +5F80 +ENDCHAR +STARTCHAR 81A8 +ENCODING 33192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C880 +BD00 +DE00 +C080 +DD00 +DE00 +C480 +D900 +CF00 +5A00 +ENDCHAR +STARTCHAR 81B3 +ENCODING 33203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +BF00 +BF00 +FF00 +AD00 +BF80 +E000 +BF00 +BF00 +F100 +ENDCHAR +STARTCHAR 81B5 +ENCODING 33205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +BF80 +A400 +FF80 +A900 +B700 +F700 +BF80 +A400 +C400 +ENDCHAR +STARTCHAR 81BA +ENCODING 33210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BF00 +B400 +EF00 +8000 +BF00 +A100 +BF00 +A300 +ENDCHAR +STARTCHAR 81BD +ENCODING 33213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C800 +DE00 +DF80 +D700 +D800 +DF80 +D000 +D600 +DF00 +6F00 +ENDCHAR +STARTCHAR 81BE +ENCODING 33214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +AB00 +BE80 +DF00 +BF00 +BF00 +DF00 +B100 +BF00 +DF00 +ENDCHAR +STARTCHAR 81BF +ENCODING 33215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +DF00 +DF00 +DF00 +C000 +DF80 +DF00 +DF80 +DF00 +7980 +ENDCHAR +STARTCHAR 81C0 +ENCODING 33216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F680 +B580 +B700 +F200 +5580 +7E00 +4100 +7E00 +4600 +ENDCHAR +STARTCHAR 81C2 +ENCODING 33218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +9F00 +FF80 +FF00 +F200 +7E00 +4100 +7E00 +7E00 +4600 +ENDCHAR +STARTCHAR 81C6 +ENCODING 33222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF00 +BF80 +C000 +BF00 +BF00 +DF00 +BD00 +B900 +EE80 +ENDCHAR +STARTCHAR 81CD +ENCODING 33229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DF80 +C800 +DF80 +DF00 +BF80 +D100 +DF00 +DF00 +D100 +E100 +ENDCHAR +STARTCHAR 81D8 +ENCODING 33240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +B500 +BF00 +DB00 +BF00 +C000 +BF00 +BF00 +BF80 +7580 +ENDCHAR +STARTCHAR 81DF +ENCODING 33247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +DF80 +C180 +EF80 +DD00 +D680 +F700 +FD00 +FB80 +7580 +ENDCHAR +STARTCHAR 81E3 +ENCODING 33251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +88 +FF +81 +81 +FF +88 +FF +80 +ENDCHAR +STARTCHAR 81E5 +ENCODING 33253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FA00 +A200 +A200 +F200 +9200 +9200 +F600 +A500 +F900 +8880 +ENDCHAR +STARTCHAR 81E7 +ENCODING 33255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +BF80 +C200 +DE80 +DF00 +D700 +DE00 +DA00 +DE80 +8900 +ENDCHAR +STARTCHAR 81E8 +ENCODING 33256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF80 +D000 +EF00 +AF00 +A000 +FF80 +D680 +FF80 +9680 +ENDCHAR +STARTCHAR 81EA +ENCODING 33258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -1 +BITMAP +10 +20 +FE +82 +FE +82 +FE +82 +FE +82 +ENDCHAR +STARTCHAR 81ED +ENCODING 33261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +7E00 +4100 +7E00 +7E00 +1200 +FF80 +2400 +C380 +ENDCHAR +STARTCHAR 81F3 +ENCODING 33267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +22 +2E +F1 +08 +08 +7F +08 +FF +ENDCHAR +STARTCHAR 81F4 +ENCODING 33268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +4400 +5780 +F900 +CD00 +4D00 +F200 +4200 +F500 +0880 +ENDCHAR +STARTCHAR 81FA +ENCODING 33274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0000 +7E00 +0000 +FF00 +2600 +7F00 +7E00 +FF80 +ENDCHAR +STARTCHAR 81FB +ENCODING 33275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +AF00 +EA00 +FF80 +5F00 +FF80 +4600 +ED00 +1480 +ENDCHAR +STARTCHAR 81FC +ENCODING 33276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +10 +EF +81 +81 +FF +81 +81 +FF +81 +ENDCHAR +STARTCHAR 81FE +ENCODING 33278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +EF +89 +EF +89 +FF +99 +14 +62 +81 +ENDCHAR +STARTCHAR 8205 +ENCODING 33285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FF +FF +FF +00 +7F +89 +7F +FF +11 +E3 +ENDCHAR +STARTCHAR 8207 +ENCODING 33287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7300 +9900 +F300 +9900 +7B00 +9900 +FF80 +6600 +8100 +ENDCHAR +STARTCHAR 8208 +ENCODING 33288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +A500 +E700 +BD00 +FF00 +A500 +FF80 +2600 +C100 +ENDCHAR +STARTCHAR 820A +ENCODING 33290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +8800 +FE00 +7F00 +1000 +EF00 +8100 +FF00 +ENDCHAR +STARTCHAR 820C +ENCODING 33292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0200 +7C00 +0800 +FF80 +0800 +7E00 +4100 +7E00 +4100 +ENDCHAR +STARTCHAR 820D +ENCODING 33293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +62 +FF +FF +08 +7E +42 +7E +42 +ENDCHAR +STARTCHAR 8212 +ENCODING 33298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6F00 +A100 +F600 +4F80 +F280 +F300 +9200 +F200 +9400 +ENDCHAR +STARTCHAR 821B +ENCODING 33307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +7F00 +9A00 +DA00 +AA00 +3F80 +4200 +C200 +8200 +ENDCHAR +STARTCHAR 821C +ENCODING 33308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +5200 +4A00 +FF00 +F200 +DF00 +BF80 +4200 +8200 +ENDCHAR +STARTCHAR 821E +ENCODING 33310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F00 +D500 +FF80 +5500 +FF80 +7F00 +EA00 +7F80 +8200 +ENDCHAR +STARTCHAR 821F +ENCODING 33311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +7E +52 +4A +42 +FF +4A +4A +4A +86 +ENDCHAR +STARTCHAR 8221 +ENCODING 33313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +EF00 +D200 +D200 +9200 +E200 +D200 +D200 +9200 +AF80 +ENDCHAR +STARTCHAR 822A +ENCODING 33322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +EF00 +E000 +E000 +9E00 +EA00 +EA00 +EA00 +AA80 +7180 +ENDCHAR +STARTCHAR 822B +ENCODING 33323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +E200 +EF80 +E400 +9700 +E500 +E900 +E900 +A900 +F300 +ENDCHAR +STARTCHAR 822C +ENCODING 33324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +F500 +D980 +B980 +B000 +DF00 +D500 +D200 +9700 +B880 +ENDCHAR +STARTCHAR 8235 +ENCODING 33333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +EF80 +E880 +E880 +9900 +EB00 +E400 +E800 +A880 +E700 +ENDCHAR +STARTCHAR 8236 +ENCODING 33334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +22 +FF +D9 +B9 +B9 +DF +D9 +D9 +9F +39 +ENDCHAR +STARTCHAR 8237 +ENCODING 33335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +E200 +DF80 +A400 +B500 +DA00 +D700 +D500 +9700 +AC80 +ENDCHAR +STARTCHAR 8239 +ENCODING 33337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +E900 +D900 +A980 +B980 +DF00 +D900 +D900 +9F00 +A900 +ENDCHAR +STARTCHAR 8240 +ENCODING 33344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +EF00 +EA80 +D000 +9F00 +E200 +EF80 +E200 +A200 +A400 +ENDCHAR +STARTCHAR 8245 +ENCODING 33349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +E600 +D900 +AF80 +9200 +EF00 +DB00 +DB00 +9280 +A600 +ENDCHAR +STARTCHAR 8247 +ENCODING 33351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +FA00 +E900 +E900 +AB80 +E500 +F900 +EB00 +A800 +F780 +ENDCHAR +STARTCHAR 8259 +ENCODING 33369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +EF00 +FF80 +EF00 +B900 +EF00 +EF00 +EF00 +B880 +F700 +ENDCHAR +STARTCHAR 8264 +ENCODING 33380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +FF80 +EF00 +FF80 +A400 +FB00 +FF80 +FF00 +AB00 +7D80 +ENDCHAR +STARTCHAR 8266 +ENCODING 33382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5D00 +FA00 +BF80 +FC00 +BB80 +FC00 +EF00 +F700 +B700 +7F80 +ENDCHAR +STARTCHAR 826E +ENCODING 33390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +42 +7E +51 +4E +5E +E1 +ENDCHAR +STARTCHAR 826F +ENCODING 33391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7E +42 +7E +42 +7F +4A +4C +7E +E1 +ENDCHAR +STARTCHAR 8271 +ENCODING 33393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A700 +F900 +4700 +F900 +D700 +6B00 +FB00 +F900 +6700 +9C80 +ENDCHAR +STARTCHAR 8272 +ENCODING 33394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +3C +48 +FF +C9 +49 +7F +40 +41 +7F +ENDCHAR +STARTCHAR 8276 +ENCODING 33398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +F700 +F900 +FF00 +0A80 +FA80 +F700 +F800 +5880 +E700 +ENDCHAR +STARTCHAR 8278 +ENCODING 33400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +42 +DB +DB +DB +DB +DB +FF +42 +42 +82 +ENDCHAR +STARTCHAR 827E +ENCODING 33406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +0200 +2400 +1400 +0800 +1C00 +6600 +8180 +ENDCHAR +STARTCHAR 828B +ENCODING 33419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +7F00 +0800 +0800 +FF80 +0800 +0800 +3800 +ENDCHAR +STARTCHAR 828D +ENCODING 33421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +4000 +7F00 +8100 +FD00 +0100 +0100 +0700 +ENDCHAR +STARTCHAR 828E +ENCODING 33422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +FF00 +0100 +7F00 +8000 +FF00 +8100 +0700 +ENDCHAR +STARTCHAR 8292 +ENCODING 33426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +FF +2C +08 +FF +40 +40 +40 +7F +ENDCHAR +STARTCHAR 8299 +ENCODING 33433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +7F00 +0800 +FF00 +1800 +1400 +6200 +8180 +ENDCHAR +STARTCHAR 829A +ENCODING 33434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +0F00 +FC00 +4900 +7E00 +4800 +0880 +0F00 +ENDCHAR +STARTCHAR 829D +ENCODING 33437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3400 +FF00 +0200 +0400 +5800 +6000 +A000 +9F80 +ENDCHAR +STARTCHAR 829F +ENCODING 33439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +3C80 +6700 +C000 +7E00 +2400 +1C00 +E300 +ENDCHAR +STARTCHAR 82A5 +ENCODING 33445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +1800 +6600 +A580 +2400 +2400 +4400 +8400 +ENDCHAR +STARTCHAR 82A6 +ENCODING 33446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0300 +7C00 +7F00 +4100 +7F00 +8100 +8000 +8000 +ENDCHAR +STARTCHAR 82A9 +ENCODING 33449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3C00 +2400 +7F00 +8180 +7F00 +0200 +0400 +0800 +ENDCHAR +STARTCHAR 82AC +ENCODING 33452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +3C00 +4200 +BF80 +9200 +2200 +6200 +8C00 +ENDCHAR +STARTCHAR 82AD +ENCODING 33453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +FF00 +8900 +8900 +FF00 +8000 +8080 +7F00 +ENDCHAR +STARTCHAR 82AE +ENCODING 33454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +3000 +FF00 +8900 +9500 +A300 +C100 +8300 +ENDCHAR +STARTCHAR 82AF +ENCODING 33455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +FF80 +2400 +0800 +2600 +6100 +A100 +A280 +3C00 +ENDCHAR +STARTCHAR 82B1 +ENCODING 33457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +2800 +4900 +CE00 +C800 +4800 +4880 +4F00 +ENDCHAR +STARTCHAR 82B3 +ENCODING 33459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +FF00 +2000 +3F00 +2100 +4100 +4200 +8600 +ENDCHAR +STARTCHAR 82B7 +ENCODING 33463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +0800 +4800 +4F00 +4800 +4800 +4800 +FF80 +ENDCHAR +STARTCHAR 82B8 +ENCODING 33464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +7E00 +0000 +FF80 +2000 +2200 +4F00 +F100 +ENDCHAR +STARTCHAR 82B9 +ENCODING 33465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +7E00 +4000 +7F00 +4400 +8400 +8400 +8400 +ENDCHAR +STARTCHAR 82BB +ENCODING 33467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +7F +D5 +7D +23 +C0 +7F +D5 +7D +E3 +ENDCHAR +STARTCHAR 82BC +ENCODING 33468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0600 +F800 +0F00 +F000 +0F00 +F000 +1080 +0F00 +ENDCHAR +STARTCHAR 82BD +ENCODING 33469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +7F00 +2400 +FF00 +0C00 +1400 +6400 +8C00 +ENDCHAR +STARTCHAR 82BF +ENCODING 33471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2000 +5E00 +4A00 +CB00 +D100 +5100 +7100 +6300 +ENDCHAR +STARTCHAR 82D1 +ENCODING 33489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +6400 +4F00 +7900 +5900 +AB00 +2800 +4880 +8700 +ENDCHAR +STARTCHAR 82D2 +ENCODING 33490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +7E00 +4900 +7E00 +C980 +7E00 +4100 +4600 +ENDCHAR +STARTCHAR 82D4 +ENCODING 33492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +2200 +FF00 +0000 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 82D5 +ENCODING 33493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +3100 +C600 +7F00 +4100 +7F00 +4100 +ENDCHAR +STARTCHAR 82D7 +ENCODING 33495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +FF80 +2400 +7F00 +8900 +7F00 +8900 +7F00 +8100 +ENDCHAR +STARTCHAR 82DB +ENCODING 33499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +FF00 +0200 +7A00 +4A00 +7A00 +4A00 +0600 +ENDCHAR +STARTCHAR 82DE +ENCODING 33502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +7F00 +8100 +F900 +7900 +4200 +4080 +7F00 +ENDCHAR +STARTCHAR 82DF +ENCODING 33503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +3F00 +4100 +BD00 +C500 +3D00 +4500 +0700 +ENDCHAR +STARTCHAR 82E1 +ENCODING 33505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2600 +6200 +5200 +4A00 +4200 +5600 +ED00 +1080 +ENDCHAR +STARTCHAR 82E5 +ENCODING 33509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +1000 +FF80 +2000 +7F00 +A100 +3F00 +2100 +ENDCHAR +STARTCHAR 82E6 +ENCODING 33510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +0800 +FF80 +0800 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 82E7 +ENCODING 33511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +FF00 +8100 +FF00 +0800 +0800 +0800 +3000 +ENDCHAR +STARTCHAR 82F1 +ENCODING 33521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +7E00 +4A00 +4A00 +FF80 +1800 +6600 +C180 +ENDCHAR +STARTCHAR 82FD +ENCODING 33533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2600 +7E00 +5200 +5200 +5200 +9500 +9F00 +F280 +ENDCHAR +STARTCHAR 82FE +ENCODING 33534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3400 +0A00 +2A00 +A500 +A900 +B080 +6200 +FE00 +ENDCHAR +STARTCHAR 8301 +ENCODING 33537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +4900 +4900 +7F00 +0800 +8900 +8900 +FF00 +ENDCHAR +STARTCHAR 8302 +ENCODING 33538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +FF80 +1100 +FF80 +8A00 +8A00 +8C00 +9480 +A300 +ENDCHAR +STARTCHAR 8303 +ENCODING 33539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +E400 +5F00 +9100 +5100 +5600 +5000 +9080 +9F00 +ENDCHAR +STARTCHAR 8304 +ENCODING 33540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +6400 +4700 +F500 +5500 +5500 +5500 +9700 +B500 +ENDCHAR +STARTCHAR 8305 +ENCODING 33541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +FF +00 +7E +14 +FF +19 +6A +88 +18 +ENDCHAR +STARTCHAR 8309 +ENCODING 33545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +0800 +FF00 +6E00 +8980 +0800 +ENDCHAR +STARTCHAR 8317 +ENCODING 33559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +7E00 +E400 +1800 +3F00 +E100 +3F00 +2100 +ENDCHAR +STARTCHAR 8328 +ENCODING 33576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3400 +DF00 +1900 +2900 +6C00 +DE00 +3300 +6100 +ENDCHAR +STARTCHAR 832B +ENCODING 33579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +FF +44 +44 +FF +10 +50 +50 +9F +ENDCHAR +STARTCHAR 832F +ENCODING 33583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2000 +2600 +4400 +DF00 +C400 +4A00 +5100 +6080 +ENDCHAR +STARTCHAR 8331 +ENCODING 33585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +4800 +7F00 +FF00 +1800 +6E00 +8980 +0800 +ENDCHAR +STARTCHAR 8334 +ENCODING 33588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +BD00 +A500 +BD00 +A500 +FF00 +8100 +ENDCHAR +STARTCHAR 8335 +ENCODING 33589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +8900 +8900 +FF00 +9900 +B500 +FF00 +8100 +ENDCHAR +STARTCHAR 8336 +ENCODING 33590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3C00 +3C00 +6A00 +8900 +7E00 +2A00 +4B00 +8900 +ENDCHAR +STARTCHAR 8338 +ENCODING 33592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +7E00 +4200 +7E00 +4380 +FE00 +0200 +ENDCHAR +STARTCHAR 8339 +ENCODING 33593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +4700 +F500 +5500 +D500 +2500 +5700 +8900 +ENDCHAR +STARTCHAR 8340 +ENCODING 33600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +6400 +7F00 +4100 +FD00 +C500 +7D00 +7D00 +4300 +ENDCHAR +STARTCHAR 8347 +ENCODING 33607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +CF00 +A000 +5F80 +C200 +4200 +4200 +4600 +ENDCHAR +STARTCHAR 8349 +ENCODING 33609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +7E00 +7E00 +4100 +7E00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 834A +ENCODING 33610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2500 +FD00 +5500 +5500 +FD00 +5500 +9100 +9300 +ENDCHAR +STARTCHAR 834F +ENCODING 33615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2000 +5F00 +4400 +C400 +FF80 +4400 +4400 +5F00 +ENDCHAR +STARTCHAR 8351 +ENCODING 33617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +0800 +FF00 +FF00 +FF00 +9900 +2700 +C180 +ENDCHAR +STARTCHAR 8352 +ENCODING 33618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +7F00 +0000 +3200 +5200 +5280 +9300 +ENDCHAR +STARTCHAR 8373 +ENCODING 33651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +7E00 +4200 +7E00 +2400 +FF80 +ENDCHAR +STARTCHAR 8377 +ENCODING 33655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +7F80 +4100 +DD00 +E500 +5D00 +4100 +4300 +ENDCHAR +STARTCHAR 837B +ENCODING 33659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +8000 +6400 +4D00 +B500 +6400 +AA00 +2900 +5080 +ENDCHAR +STARTCHAR 8389 +ENCODING 33673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1100 +E500 +2500 +FD00 +6500 +B500 +A900 +2300 +ENDCHAR +STARTCHAR 838A +ENCODING 33674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +A400 +E400 +3F80 +E400 +A400 +A400 +AF00 +ENDCHAR +STARTCHAR 838E +ENCODING 33678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +C000 +5600 +9500 +5480 +6500 +4E00 +8800 +B000 +ENDCHAR +STARTCHAR 8396 +ENCODING 33686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +5200 +5200 +2900 +FF00 +0800 +FF80 +ENDCHAR +STARTCHAR 8398 +ENCODING 33688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +2400 +FF80 +0800 +FF00 +0800 +0800 +ENDCHAR +STARTCHAR 839E +ENCODING 33694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +FF00 +0000 +FF00 +2400 +6480 +8700 +ENDCHAR +STARTCHAR 83A2 +ENCODING 33698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +4A00 +4B00 +BD00 +2400 +6200 +8180 +ENDCHAR +STARTCHAR 83A9 +ENCODING 33705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0200 +7E00 +8900 +7E00 +0800 +FF80 +0800 +3800 +ENDCHAR +STARTCHAR 83AA +ENCODING 33706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2600 +E500 +2400 +FF80 +7500 +B600 +2A80 +7100 +ENDCHAR +STARTCHAR 83AB +ENCODING 33707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2400 +FF80 +7E00 +7E00 +4200 +7E00 +FF80 +3400 +C380 +ENDCHAR +STARTCHAR 83BD +ENCODING 33725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3500 +FF00 +2600 +E500 +2400 +FF00 +2400 +C400 +ENDCHAR +STARTCHAR 83C1 +ENCODING 33729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +7F00 +FF80 +0000 +7E00 +7E00 +4100 +4600 +ENDCHAR +STARTCHAR 83C5 +ENCODING 33733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +FF00 +4200 +7E00 +7E00 +7E00 +4100 +ENDCHAR +STARTCHAR 83C9 +ENCODING 33737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3C00 +2400 +3C00 +FF00 +4800 +3600 +6A00 +9100 +ENDCHAR +STARTCHAR 83CA +ENCODING 33738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +7F00 +B500 +B500 +7F00 +3500 +D300 +1300 +ENDCHAR +STARTCHAR 83CC +ENCODING 33740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +8500 +B900 +FF00 +B500 +CB00 +FF00 +8100 +ENDCHAR +STARTCHAR 83D3 +ENCODING 33747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +4900 +7F00 +7F00 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 83D6 +ENCODING 33750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +7E00 +7E00 +0000 +FF00 +FF00 +FF00 +8100 +ENDCHAR +STARTCHAR 83DC +ENCODING 33756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FE00 +5100 +4A00 +4800 +FF00 +1400 +6A00 +8980 +ENDCHAR +STARTCHAR 83E9 +ENCODING 33769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +2400 +FF80 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR 83EB +ENCODING 33771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +0800 +7F00 +7F00 +0800 +FF00 +7F00 +FF80 +ENDCHAR +STARTCHAR 83EF +ENCODING 33775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +FF80 +2A00 +FF00 +FF00 +0800 +0800 +ENDCHAR +STARTCHAR 83F0 +ENCODING 33776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0300 +FE00 +5600 +7500 +D500 +5700 +5700 +E980 +ENDCHAR +STARTCHAR 83F1 +ENCODING 33777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +7F00 +FF80 +2700 +FE00 +5400 +1C00 +E300 +ENDCHAR +STARTCHAR 83F2 +ENCODING 33778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +F780 +1400 +F700 +6400 +A780 +6400 +4400 +ENDCHAR +STARTCHAR 83F4 +ENCODING 33780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +FF00 +2E00 +7F80 +FE00 +4A00 +7E80 +0F00 +ENDCHAR +STARTCHAR 83F9 +ENCODING 33785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +C000 +5F00 +9100 +5F00 +1100 +5F00 +5100 +BF80 +ENDCHAR +STARTCHAR 83FD +ENCODING 33789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +3F00 +4500 +F500 +B200 +B200 +B500 +4880 +ENDCHAR +STARTCHAR 8403 +ENCODING 33795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +FF00 +0000 +2400 +6600 +9900 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 8404 +ENCODING 33796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +7F00 +BD00 +5100 +7F00 +5500 +7D00 +0700 +ENDCHAR +STARTCHAR 840A +ENCODING 33802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +4A00 +4A00 +BD00 +2C00 +4A00 +8900 +ENDCHAR +STARTCHAR 840C +ENCODING 33804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +EF00 +9900 +EF00 +9900 +EF00 +9900 +1300 +ENDCHAR +STARTCHAR 840D +ENCODING 33805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +BF00 +4400 +9600 +9500 +7F80 +4400 +8400 +8400 +ENDCHAR +STARTCHAR 840E +ENCODING 33806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7E00 +FF80 +2C00 +D300 +FF80 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 8429 +ENCODING 33833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2200 +C200 +4A80 +FB00 +6600 +D500 +C900 +4880 +ENDCHAR +STARTCHAR 842C +ENCODING 33836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +4A00 +7E00 +7E00 +FF00 +8D00 +B300 +8300 +ENDCHAR +STARTCHAR 8431 +ENCODING 33841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +FE80 +7E00 +4200 +7E00 +7E00 +FF80 +ENDCHAR +STARTCHAR 8438 +ENCODING 33848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2800 +CF00 +EF00 +8900 +FF00 +1800 +2600 +C100 +ENDCHAR +STARTCHAR 843D +ENCODING 33853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +8800 +5F00 +AA00 +A400 +7B00 +9F00 +9F00 +9100 +ENDCHAR +STARTCHAR 8449 +ENCODING 33865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +5200 +FF80 +5E00 +7F00 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 8457 +ENCODING 33879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1100 +7E00 +FF80 +3200 +FE00 +2200 +3E00 +3E00 +ENDCHAR +STARTCHAR 845B +ENCODING 33883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7E00 +7E00 +7E00 +2000 +7F00 +F700 +7F00 +4300 +ENDCHAR +STARTCHAR 8461 +ENCODING 33889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +7F00 +FD00 +FD00 +5500 +7D00 +7D00 +5700 +ENDCHAR +STARTCHAR 8463 +ENCODING 33891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +FF00 +0800 +7E00 +4900 +7E00 +FF00 +FF80 +ENDCHAR +STARTCHAR 8466 +ENCODING 33894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +FF00 +0000 +7E00 +7E00 +FF00 +FF80 +0800 +ENDCHAR +STARTCHAR 846B +ENCODING 33899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +4700 +F900 +4700 +F900 +9F00 +F900 +8B00 +ENDCHAR +STARTCHAR 846C +ENCODING 33900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF80 +4900 +F680 +6700 +A400 +FF80 +2400 +C400 +ENDCHAR +STARTCHAR 846F +ENCODING 33903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4400 +6800 +AF00 +4D00 +F500 +D300 +D100 +C300 +ENDCHAR +STARTCHAR 8475 +ENCODING 33909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FA00 +6500 +6200 +FD80 +0800 +FF00 +3400 +C300 +ENDCHAR +STARTCHAR 847A +ENCODING 33914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7E00 +7E00 +0000 +FF00 +7E00 +7E00 +FF00 +0200 +ENDCHAR +STARTCHAR 8490 +ENCODING 33936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +7E00 +7E00 +4900 +7E00 +2D00 +6F80 +8F00 +ENDCHAR +STARTCHAR 8494 +ENCODING 33940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0400 +FF00 +A400 +FF80 +BF80 +A900 +E900 +8200 +ENDCHAR +STARTCHAR 8499 +ENCODING 33945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +2400 +FF00 +BF00 +0000 +FF00 +F500 +DA00 +7A00 +D980 +ENDCHAR +STARTCHAR 849C +ENCODING 33948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +E700 +0000 +FF80 +EB00 +DB00 +CA80 +4600 +ENDCHAR +STARTCHAR 84A1 +ENCODING 33953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +2400 +FF00 +8880 +7F00 +1E00 +6200 +C600 +ENDCHAR +STARTCHAR 84B2 +ENCODING 33970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +8500 +7F80 +8400 +BF00 +7F00 +7F00 +A500 +A500 +ENDCHAR +STARTCHAR 84B8 +ENCODING 33976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +0400 +ED00 +4A00 +9100 +7E00 +9500 +9480 +ENDCHAR +STARTCHAR 84BB +ENCODING 33979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0000 +FF00 +F700 +FF00 +5700 +BB00 +5500 +AB00 +ENDCHAR +STARTCHAR 84BC +ENCODING 33980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1800 +7E00 +FF80 +7E00 +7E00 +4000 +BE00 +BE00 +ENDCHAR +STARTCHAR 84BF +ENCODING 33983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF80 +0000 +7E00 +3C00 +FF00 +BD00 +BD00 +A300 +ENDCHAR +STARTCHAR 84C0 +ENCODING 33984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0300 +EC00 +4A00 +6500 +DF00 +4E00 +5500 +D480 +ENDCHAR +STARTCHAR 84C2 +ENCODING 33986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +2400 +FF00 +FF00 +4200 +7E00 +7E00 +FF80 +2600 +C100 +ENDCHAR +STARTCHAR 84C4 +ENCODING 33988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +1600 +3B00 +FC80 +7F00 +4900 +7F00 +7F00 +ENDCHAR +STARTCHAR 84C6 +ENCODING 33990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF80 +FF00 +9200 +BF00 +A900 +A900 +AB00 +ENDCHAR +STARTCHAR 84C9 +ENCODING 33993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF00 +5900 +B600 +6380 +FE00 +7E00 +4200 +ENDCHAR +STARTCHAR 84CB +ENCODING 33995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +0800 +FF00 +2200 +FD00 +7E00 +5500 +FF80 +ENDCHAR +STARTCHAR 84CD +ENCODING 33997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +FF80 +3300 +FF00 +0000 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR 84D1 +ENCODING 34001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +0000 +7E00 +FF80 +7E00 +2500 +FA00 +6180 +ENDCHAR +STARTCHAR 84DA +ENCODING 34010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4800 +4F00 +7A00 +FF00 +E600 +6B80 +6E00 +5800 +ENDCHAR +STARTCHAR 84EC +ENCODING 34028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4F00 +9A00 +8E00 +3F80 +C400 +5F00 +4400 +BF80 +ENDCHAR +STARTCHAR 84EE +ENCODING 34030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +C400 +3F00 +DF00 +1F00 +DF00 +7F80 +4400 +BF80 +ENDCHAR +STARTCHAR 84F4 +ENCODING 34036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +7F00 +7F00 +7F00 +FF00 +0200 +FF80 +2C00 +ENDCHAR +STARTCHAR 84FC +ENCODING 34044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +5700 +FF00 +A600 +D980 +6E00 +7C00 +6000 +ENDCHAR +STARTCHAR 8511 +ENCODING 34065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7F00 +9500 +7F00 +FF80 +8400 +B600 +9A80 +A100 +ENDCHAR +STARTCHAR 8513 +ENCODING 34067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7E00 +7E00 +0000 +FF00 +FF00 +FE00 +2400 +FF80 +ENDCHAR +STARTCHAR 8514 +ENCODING 34068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +4100 +BD00 +3D00 +7D00 +7D00 +7D00 +0300 +ENDCHAR +STARTCHAR 8517 +ENCODING 34071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +FF80 +9400 +BF00 +FF00 +8000 +B500 +D500 +ENDCHAR +STARTCHAR 8518 +ENCODING 34072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1400 +7A00 +EB00 +3700 +D980 +6E00 +7C00 +6000 +ENDCHAR +STARTCHAR 851A +ENCODING 34074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +F900 +8900 +FF80 +F500 +8300 +F900 +E900 +A300 +ENDCHAR +STARTCHAR 851E +ENCODING 34078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +FF80 +7E00 +7F00 +7F00 +FF80 +6400 +FB00 +ENDCHAR +STARTCHAR 8521 +ENCODING 34081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +D600 +A600 +7F00 +FF00 +2A00 +4B00 +9900 +ENDCHAR +STARTCHAR 8523 +ENCODING 34083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +AF00 +B200 +FD00 +FF80 +A900 +A500 +A200 +ENDCHAR +STARTCHAR 8525 +ENCODING 34085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +5D00 +6500 +7D00 +7F00 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR 852C +ENCODING 34092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0400 +FF00 +6900 +DF00 +ED00 +CD00 +F580 +D580 +ENDCHAR +STARTCHAR 852D +ENCODING 34093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +E400 +AF00 +D080 +C600 +BF00 +BF00 +EB00 +9F00 +ENDCHAR +STARTCHAR 852F +ENCODING 34095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0400 +FF80 +BF00 +DF00 +B500 +BF00 +FE00 +9580 +ENDCHAR +STARTCHAR 853D +ENCODING 34109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2400 +B400 +AF80 +F500 +D300 +B200 +B500 +B480 +ENDCHAR +STARTCHAR 853F +ENCODING 34111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +8200 +FF00 +4200 +7E00 +7F00 +B700 +B300 +ENDCHAR +STARTCHAR 8541 +ENCODING 34113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7F00 +FF80 +7F00 +FF00 +FF00 +FF80 +2200 +2600 +ENDCHAR +STARTCHAR 8543 +ENCODING 34115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +2A00 +FF00 +2C00 +FF80 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 8549 +ENCODING 34121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4800 +7F00 +FF00 +CF00 +7F00 +0000 +5500 +9480 +ENDCHAR +STARTCHAR 854E +ENCODING 34126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +FF00 +7E00 +BD80 +FF00 +BD00 +BD00 +A300 +ENDCHAR +STARTCHAR 8553 +ENCODING 34131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +FF00 +EE80 +6E00 +7E00 +FF80 +2200 +FD00 +ENDCHAR +STARTCHAR 8559 +ENCODING 34137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +7E00 +7E00 +4900 +FE00 +1C00 +AB00 +BC80 +ENDCHAR +STARTCHAR 8563 +ENCODING 34147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7C00 +2A00 +FF00 +C300 +7F00 +DA00 +7F80 +8200 +ENDCHAR +STARTCHAR 8568 +ENCODING 34152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF80 +AA00 +FB80 +9680 +DB00 +FA00 +A500 +C880 +ENDCHAR +STARTCHAR 8569 +ENCODING 34153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +9F00 +5F00 +9F00 +3F80 +5000 +BF00 +8B00 +9700 +ENDCHAR +STARTCHAR 856A +ENCODING 34154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4000 +FF00 +D600 +FF80 +FF00 +0000 +5500 +9480 +ENDCHAR +STARTCHAR 856D +ENCODING 34157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7F00 +FF80 +7F00 +AD00 +6F00 +FF00 +EF00 +AD00 +ENDCHAR +STARTCHAR 8584 +ENCODING 34180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF80 +1F00 +A500 +7F00 +5F00 +7F80 +9200 +8600 +ENDCHAR +STARTCHAR 8587 +ENCODING 34183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7A00 +BB80 +C300 +BF00 +BB00 +AE00 +AF00 +A480 +ENDCHAR +STARTCHAR 858F +ENCODING 34191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +FF80 +0000 +7E00 +7E00 +3C00 +AB00 +BC80 +ENDCHAR +STARTCHAR 8591 +ENCODING 34193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +FF00 +4900 +7F00 +3600 +7F00 +7F00 +7F00 +FF80 +ENDCHAR +STARTCHAR 8594 +ENCODING 34196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +4A00 +FF80 +0000 +7F00 +BD00 +BD00 +7F00 +ENDCHAR +STARTCHAR 859B +ENCODING 34203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4200 +EF00 +9100 +E500 +8F80 +FF00 +F200 +9200 +ENDCHAR +STARTCHAR 85A6 +ENCODING 34214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF80 +FF00 +9500 +FF00 +A000 +BF00 +DB00 +DB00 +ENDCHAR +STARTCHAR 85A8 +ENCODING 34216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +7F00 +7F00 +FF00 +8080 +FF00 +F600 +2880 +C700 +ENDCHAR +STARTCHAR 85A9 +ENCODING 34217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +FF00 +CA00 +CF00 +DF80 +BA00 +DF00 +9200 +AF80 +ENDCHAR +STARTCHAR 85AA +ENCODING 34218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +7F00 +2100 +F600 +5400 +F780 +F500 +6900 +B900 +2900 +ENDCHAR +STARTCHAR 85AF +ENCODING 34223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +FF00 +7E00 +FF80 +3F00 +C100 +3F00 +3F00 +ENDCHAR +STARTCHAR 85B0 +ENCODING 34224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +FF00 +7F00 +6D00 +FF00 +FF80 +A500 +9480 +ENDCHAR +STARTCHAR 85BA +ENCODING 34234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF80 +F700 +AD00 +EE80 +4100 +7E00 +7E00 +8100 +ENDCHAR +STARTCHAR 85C1 +ENCODING 34241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +0000 +7E00 +3C00 +FF00 +BD00 +FF80 +3400 +CB80 +ENDCHAR +STARTCHAR 85C9 +ENCODING 34249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +5500 +EF00 +F500 +4F80 +FF00 +A900 +DF00 +4900 +ENDCHAR +STARTCHAR 85CD +ENCODING 34253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F400 +A780 +F800 +F700 +F000 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR 85CE +ENCODING 34254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +7E00 +FF80 +7E00 +FF80 +5500 +8080 +7F00 +FF80 +ENDCHAR +STARTCHAR 85CF +ENCODING 34255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0300 +BF80 +DE00 +DF00 +D700 +DE00 +DD80 +4900 +ENDCHAR +STARTCHAR 85D5 +ENCODING 34261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +6F00 +ED00 +EF00 +4F00 +FF00 +7280 +D480 +5100 +ENDCHAR +STARTCHAR 85DC +ENCODING 34268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F400 +F700 +6B00 +DF00 +6E00 +AB80 +2E00 +D100 +ENDCHAR +STARTCHAR 85DD +ENCODING 34269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +F500 +B580 +F780 +0000 +7E00 +FF80 +FF00 +ENDCHAR +STARTCHAR 85E4 +ENCODING 34276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +E800 +B500 +FF00 +BF80 +ED80 +BC00 +AF00 +7D00 +ENDCHAR +STARTCHAR 85E5 +ENCODING 34277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +5A00 +9600 +DB00 +A580 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 85E9 +ENCODING 34281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +BF00 +5500 +BF80 +9600 +7F80 +A500 +9F00 +9F00 +ENDCHAR +STARTCHAR 85EA +ENCODING 34282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +F200 +FB80 +F500 +F500 +F300 +FA00 +9300 +F480 +ENDCHAR +STARTCHAR 85F7 +ENCODING 34295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0400 +EF00 +E500 +FF80 +FF00 +E900 +AF00 +EF00 +ENDCHAR +STARTCHAR 85FA +ENCODING 34298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F700 +F700 +F700 +A900 +FF00 +E900 +B900 +B700 +ENDCHAR +STARTCHAR 85FB +ENCODING 34299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +5E00 +1E00 +BF00 +BF00 +4400 +BF00 +9A00 +A500 +ENDCHAR +STARTCHAR 85FF +ENCODING 34303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +FF00 +FF00 +8900 +0800 +FF00 +C800 +7F00 +7F00 +ENDCHAR +STARTCHAR 8602 +ENCODING 34306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +6E00 +BD00 +3D00 +FB80 +0800 +FF80 +2E00 +C980 +ENDCHAR +STARTCHAR 8606 +ENCODING 34310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +FF00 +DF00 +BE00 +BE00 +BE00 +B500 +FF80 +ENDCHAR +STARTCHAR 8607 +ENCODING 34311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4100 +E300 +FF80 +F200 +F700 +0E80 +FA00 +E200 +ENDCHAR +STARTCHAR 860A +ENCODING 34314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4F00 +AD00 +AB00 +6F00 +DF00 +F700 +F700 +5F80 +ENDCHAR +STARTCHAR 8616 +ENCODING 34326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +F500 +9F80 +9200 +FF00 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 8617 +ENCODING 34327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +F500 +FF80 +D200 +2800 +FF00 +3400 +CB80 +ENDCHAR +STARTCHAR 861A +ENCODING 34330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +4400 +E500 +FF80 +FF00 +B200 +FF80 +F200 +F200 +ENDCHAR +STARTCHAR 862D +ENCODING 34349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F700 +9900 +F700 +FF00 +EF00 +BF00 +AF00 +8900 +ENDCHAR +STARTCHAR 863F +ENCODING 34367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +FF00 +FF00 +6A00 +CF00 +FF00 +4F00 +EA00 +CF80 +ENDCHAR +STARTCHAR 864E +ENCODING 34382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +0E +7F +91 +BF +9E +84 +94 +A5 +C7 +ENDCHAR +STARTCHAR 8650 +ENCODING 34384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +0E00 +FF80 +9700 +F900 +9E00 +BF00 +FF80 +A000 +BF00 +ENDCHAR +STARTCHAR 8654 +ENCODING 34388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0F00 +FF80 +FF00 +9F00 +8800 +FF00 +B200 +8C00 +F380 +ENDCHAR +STARTCHAR 8655 +ENCODING 34389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +0E00 +FF00 +BF00 +BE00 +B600 +D600 +F680 +9900 +EF80 +ENDCHAR +STARTCHAR 865B +ENCODING 34395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +0F00 +FF00 +BD00 +D100 +9E00 +D500 +B700 +9400 +FF80 +ENDCHAR +STARTCHAR 865C +ENCODING 34396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +0E +FF +B1 +BF +FF +BF +FF +91 +E3 +ENDCHAR +STARTCHAR 865E +ENCODING 34398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1E00 +1000 +FF00 +D100 +9F00 +D100 +CE00 +BF00 +FF80 +F300 +ENDCHAR +STARTCHAR 865F +ENCODING 34399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A700 +EF80 +1680 +EC80 +9700 +F600 +B600 +3A80 +DB00 +ENDCHAR +STARTCHAR 8667 +ENCODING 34407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2780 +3A00 +FA00 +F780 +BA00 +FB00 +F880 +F880 +F900 +4300 +ENDCHAR +STARTCHAR 8679 +ENCODING 34425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +4F00 +F200 +D200 +D200 +D200 +F200 +5200 +7200 +DF80 +ENDCHAR +STARTCHAR 868A +ENCODING 34442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF80 +E900 +E600 +E600 +6600 +7600 +8900 +1080 +ENDCHAR +STARTCHAR 868C +ENCODING 34444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4300 +EC00 +D200 +DF00 +E200 +4F80 +5200 +F200 +1200 +ENDCHAR +STARTCHAR 8693 +ENCODING 34451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +43 +E3 +EF +E9 +EF +43 +63 +63 +9D +ENDCHAR +STARTCHAR 86A3 +ENCODING 34467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +4100 +E900 +D900 +DC80 +E400 +4600 +5500 +7B00 +8C80 +ENDCHAR +STARTCHAR 86A4 +ENCODING 34468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +2C00 +5C00 +3380 +C800 +7E00 +7E00 +0900 +FF00 +ENDCHAR +STARTCHAR 86A9 +ENCODING 34473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +FF00 +1000 +FF80 +7E00 +4900 +7F00 +0B00 +FC80 +ENDCHAR +STARTCHAR 86C7 +ENCODING 34503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4F00 +F080 +F880 +E800 +EB00 +E400 +5800 +7880 +D700 +ENDCHAR +STARTCHAR 86CB +ENCODING 34507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +4900 +6E00 +BF00 +0800 +7E00 +7E00 +0900 +FE80 +ENDCHAR +STARTCHAR 86D4 +ENCODING 34516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +4F +F1 +F7 +F7 +F7 +F7 +71 +6F +91 +ENDCHAR +STARTCHAR 86D9 +ENCODING 34521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +EF00 +E400 +EF80 +E400 +E400 +5F00 +7400 +DF80 +ENDCHAR +STARTCHAR 86DB +ENCODING 34523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4A00 +EF00 +F200 +FF80 +E600 +E500 +6B00 +7280 +8200 +ENDCHAR +STARTCHAR 86DF +ENCODING 34527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EA00 +E900 +D080 +E900 +4600 +6600 +8900 +1080 +ENDCHAR +STARTCHAR 86E4 +ENCODING 34532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +4600 +E900 +DF80 +E000 +EF00 +4900 +6900 +6F00 +9900 +ENDCHAR +STARTCHAR 86ED +ENCODING 34541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4400 +E900 +FF00 +E080 +E400 +FF00 +6400 +6400 +9F80 +ENDCHAR +STARTCHAR 86FE +ENCODING 34558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +5B00 +EA00 +FF80 +EF00 +FB00 +6A00 +6B80 +9D00 +ENDCHAR +STARTCHAR 8700 +ENCODING 34560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +A5 +FF +7F +FD +55 +7D +F3 +03 +ENDCHAR +STARTCHAR 8702 +ENCODING 34562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +F600 +E600 +FB80 +EF00 +4F00 +6F80 +6200 +9200 +ENDCHAR +STARTCHAR 8703 +ENCODING 34563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BE +FF +A6 +FB +FF +49 +7F +F8 +ENDCHAR +STARTCHAR 8708 +ENCODING 34568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4700 +5500 +F700 +F000 +EF00 +E500 +7F80 +EA00 +1180 +ENDCHAR +STARTCHAR 8718 +ENCODING 34584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +53 +FF +FB +FF +EB +4B +6B +F7 +17 +ENDCHAR +STARTCHAR 871A +ENCODING 34586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +F700 +F700 +E780 +2400 +0800 +7F00 +7F00 +0F00 +F080 +ENDCHAR +STARTCHAR 871C +ENCODING 34588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FA80 +AD00 +B280 +FC00 +7F00 +4900 +7F00 +FF00 +ENDCHAR +STARTCHAR 874E +ENCODING 34638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +51 +EF +EF +E8 +FF +55 +77 +6F +83 +ENDCHAR +STARTCHAR 8755 +ENCODING 34645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6200 +E200 +9F00 +EB00 +EB00 +EB00 +8F00 +F300 +F300 +8C80 +ENDCHAR +STARTCHAR 8757 +ENCODING 34647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +E900 +EF00 +EF00 +E000 +FF80 +6F00 +6400 +9F80 +ENDCHAR +STARTCHAR 875F +ENCODING 34655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +55 +EF +E0 +EF +EF +6F +69 +9B +ENDCHAR +STARTCHAR 8766 +ENCODING 34662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +5500 +F700 +FC00 +FB00 +F300 +7B00 +7300 +B480 +ENDCHAR +STARTCHAR 8768 +ENCODING 34664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +1200 +FE80 +C100 +4200 +FF00 +FF00 +7300 +DC80 +ENDCHAR +STARTCHAR 8774 +ENCODING 34676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4B +4B +FF +EB +EB +FF +F7 +7F +75 +A7 +ENDCHAR +STARTCHAR 8776 +ENCODING 34678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D00 +5F80 +ED00 +EF00 +EF80 +E400 +7F80 +6600 +8D00 +1480 +ENDCHAR +STARTCHAR 8778 +ENCODING 34680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +49 +EF +ED +FF +F1 +57 +77 +75 +91 +ENDCHAR +STARTCHAR 8782 +ENCODING 34690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B80 +5F00 +F700 +BF00 +B700 +FE80 +5A80 +5B00 +FA00 +3200 +ENDCHAR +STARTCHAR 878D +ENCODING 34701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +0200 +F700 +F680 +0680 +F680 +F700 +EB00 +AB00 +B680 +ENDCHAR +STARTCHAR 879F +ENCODING 34719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5080 +EF00 +E900 +EF00 +EF00 +5F80 +6000 +E900 +1080 +ENDCHAR +STARTCHAR 87A2 +ENCODING 34722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B680 +DB00 +6600 +9D00 +FF00 +8880 +7E00 +7E00 +0F00 +F900 +ENDCHAR +STARTCHAR 87B3 +ENCODING 34739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +4D00 +FF80 +FF80 +E900 +E900 +EF00 +6F00 +6400 +9F80 +ENDCHAR +STARTCHAR 87BA +ENCODING 34746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5500 +EF00 +EF00 +ED00 +E700 +5F80 +6200 +6B00 +9280 +ENDCHAR +STARTCHAR 87C4 +ENCODING 34756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +F500 +F500 +FB80 +4980 +7F00 +8900 +7F00 +FF00 +ENDCHAR +STARTCHAR 87E0 +ENCODING 34784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +5E00 +ED00 +FF80 +ED00 +FF80 +5500 +6F00 +7500 +8F00 +ENDCHAR +STARTCHAR 87EC +ENCODING 34796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5680 +FF00 +EF00 +F500 +EF00 +4F00 +7F80 +6400 +8400 +ENDCHAR +STARTCHAR 87EF +ENCODING 34799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +FF80 +E900 +FF00 +FB80 +7F80 +6A00 +8A80 +1300 +ENDCHAR +STARTCHAR 87F2 +ENCODING 34802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +7F00 +0F00 +F100 +4200 +FF00 +FF00 +3300 +DC80 +ENDCHAR +STARTCHAR 87F9 +ENCODING 34809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +E480 +FD00 +B700 +FF80 +B200 +7F00 +8F00 +7B00 +FC80 +ENDCHAR +STARTCHAR 87FB +ENCODING 34811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +5F80 +EF00 +FF80 +E000 +FB00 +FF80 +7F00 +6A80 +9D80 +ENDCHAR +STARTCHAR 87FE +ENCODING 34814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4E00 +FF80 +F700 +F000 +FF00 +F700 +7000 +FF00 +3F00 +ENDCHAR +STARTCHAR 8805 +ENCODING 34821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5700 +FB00 +EA00 +F700 +FB00 +F680 +7B00 +7680 +A700 +ENDCHAR +STARTCHAR 881F +ENCODING 34847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D00 +4D00 +FF00 +FF00 +FF00 +E000 +5F00 +7F00 +FF80 +3580 +ENDCHAR +STARTCHAR 8822 +ENCODING 34850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7600 +2E00 +7B00 +DF80 +FE00 +3E00 +FF00 +7700 +FE80 +ENDCHAR +STARTCHAR 8823 +ENCODING 34851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5F80 +F500 +FF00 +FF00 +FF00 +7200 +7F00 +BF00 +2900 +ENDCHAR +STARTCHAR 8831 +ENCODING 34865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +FE00 +4200 +FF00 +FF00 +FF00 +0000 +7F00 +FF80 +ENDCHAR +STARTCHAR 8836 +ENCODING 34870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +7680 +FF80 +7F00 +7F00 +FF00 +FF00 +FF80 +ENDCHAR +STARTCHAR 883B +ENCODING 34875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9A00 +DF00 +4200 +E380 +FD00 +0800 +7F00 +7F00 +0B00 +F480 +ENDCHAR +STARTCHAR 8840 +ENCODING 34880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +1000 +7F00 +5500 +5500 +5500 +5500 +5500 +5500 +FF80 +ENDCHAR +STARTCHAR 8846 +ENCODING 34886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7F00 +9500 +FF80 +0600 +7900 +6D00 +AA00 +4A00 +8900 +ENDCHAR +STARTCHAR 884C +ENCODING 34892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +4F00 +A000 +4000 +5F80 +C200 +C200 +4200 +4200 +4600 +ENDCHAR +STARTCHAR 884D +ENCODING 34893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5000 +CF00 +C000 +5780 +C200 +CA00 +5200 +5200 +6600 +ENDCHAR +STARTCHAR 8852 +ENCODING 34898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +8B80 +BC00 +5380 +7100 +9900 +9100 +5500 +7D00 +4300 +ENDCHAR +STARTCHAR 8853 +ENCODING 34899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +9700 +BC00 +5380 +7500 +B500 +B500 +B500 +B100 +9300 +ENDCHAR +STARTCHAR 8857 +ENCODING 34903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +FF80 +8800 +4B80 +FD00 +8900 +BD00 +8900 +BD00 +8300 +ENDCHAR +STARTCHAR 8859 +ENCODING 34905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +BF80 +B800 +5780 +7D00 +8100 +BD00 +6500 +7D00 +6700 +ENDCHAR +STARTCHAR 885B +ENCODING 34907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +BF00 +FC00 +4380 +BD00 +BD00 +BD00 +A900 +BD00 +8B00 +ENDCHAR +STARTCHAR 885D +ENCODING 34909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +B380 +FC00 +7F80 +BD00 +AD00 +7D00 +7D00 +4D00 +7300 +ENDCHAR +STARTCHAR 8861 +ENCODING 34913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +9B80 +BC00 +6F80 +7D00 +BD00 +BD00 +5900 +5900 +6700 +ENDCHAR +STARTCHAR 8862 +ENCODING 34914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F80 +BC00 +FC00 +BF80 +A900 +BD00 +FD00 +A900 +BF00 +ENDCHAR +STARTCHAR 8863 +ENCODING 34915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +1800 +1900 +2600 +E600 +A200 +2900 +7080 +ENDCHAR +STARTCHAR 8868 +ENCODING 34920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +7F00 +FF80 +1900 +6600 +A200 +3900 +6080 +ENDCHAR +STARTCHAR 886B +ENCODING 34923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +4600 +E800 +2100 +5600 +E800 +D080 +4300 +4C00 +5800 +ENDCHAR +STARTCHAR 8870 +ENCODING 34928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +7E00 +2200 +FF80 +FF00 +1900 +6600 +BB00 +6180 +ENDCHAR +STARTCHAR 8872 +ENCODING 34930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4C +44 +FF +55 +75 +DB +F9 +51 +51 +53 +ENDCHAR +STARTCHAR 8877 +ENCODING 34935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +7F00 +8900 +7F00 +6900 +A600 +3A00 +E180 +ENDCHAR +STARTCHAR 887E +ENCODING 34942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +6600 +BD80 +7E00 +0200 +0C00 +FF80 +6A00 +BE00 +6180 +ENDCHAR +STARTCHAR 887F +ENCODING 34943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +E900 +3F80 +6000 +EF00 +E100 +4100 +4200 +4200 +ENDCHAR +STARTCHAR 8881 +ENCODING 34945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +FF80 +0000 +7E00 +7E00 +1900 +6600 +AA00 +7100 +ENDCHAR +STARTCHAR 8882 +ENCODING 34946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +EF00 +2500 +6500 +FF80 +E400 +4A00 +5900 +5080 +ENDCHAR +STARTCHAR 8888 +ENCODING 34952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +F700 +5500 +7700 +8800 +FF00 +2A00 +E400 +2B00 +7180 +ENDCHAR +STARTCHAR 888B +ENCODING 34955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4900 +FE00 +C480 +4B00 +FF80 +2900 +6600 +BA00 +6180 +ENDCHAR +STARTCHAR 888D +ENCODING 34957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +F080 +3E80 +6B00 +EF00 +EB00 +4800 +4880 +4F00 +ENDCHAR +STARTCHAR 8892 +ENCODING 34962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +E900 +2F00 +6900 +E900 +EF00 +4900 +4000 +5F80 +ENDCHAR +STARTCHAR 8896 +ENCODING 34966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +44 +FF +35 +75 +FF +F5 +55 +5F +51 +ENDCHAR +STARTCHAR 8897 +ENCODING 34967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +E900 +3280 +4D00 +EA00 +EC80 +4B00 +4400 +5800 +ENDCHAR +STARTCHAR 889E +ENCODING 34974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2400 +FF80 +4200 +7E00 +6900 +A600 +3B00 +6180 +ENDCHAR +STARTCHAR 88AB +ENCODING 34987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +F480 +5400 +7F00 +D900 +B600 +5200 +5F00 +6980 +ENDCHAR +STARTCHAR 88B4 +ENCODING 34996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +EA00 +3F80 +6000 +DF00 +E800 +4F00 +5100 +4600 +ENDCHAR +STARTCHAR 88C1 +ENCODING 35009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F500 +2400 +FF80 +2500 +FD00 +6E00 +D600 +7E80 +C900 +ENDCHAR +STARTCHAR 88C2 +ENCODING 35010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4500 +F500 +F500 +CB00 +0800 +FF80 +6600 +BB00 +6180 +ENDCHAR +STARTCHAR 88CF +ENCODING 35023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7F00 +4900 +7F00 +FF00 +FF80 +2900 +FE00 +6180 +ENDCHAR +STARTCHAR 88D4 +ENCODING 35028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +2900 +FE00 +6100 +FF00 +A700 +FD00 +BD00 +A500 +ENDCHAR +STARTCHAR 88D5 +ENCODING 35029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +4900 +F500 +2600 +6A00 +D900 +FF80 +4900 +4F00 +4900 +ENDCHAR +STARTCHAR 88D9 +ENCODING 35033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4500 +FF80 +4500 +6F00 +C800 +BF00 +6900 +4F00 +4900 +ENDCHAR +STARTCHAR 88DC +ENCODING 35036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +5F80 +E400 +5F00 +7500 +DF00 +F500 +5F00 +5500 +5500 +ENDCHAR +STARTCHAR 88DD +ENCODING 35037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +E200 +3F80 +E200 +AF00 +8800 +FF80 +2900 +EE00 +7180 +ENDCHAR +STARTCHAR 88DF +ENCODING 35039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5500 +9500 +6F00 +8C00 +3000 +FF80 +2500 +FA00 +6180 +ENDCHAR +STARTCHAR 88E1 +ENCODING 35041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +F500 +3F00 +7500 +FF00 +FF00 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR 88E8 +ENCODING 35048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F500 +3F00 +7500 +FF00 +FA00 +5F80 +4200 +4200 +ENDCHAR +STARTCHAR 88F3 +ENCODING 35059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +FF00 +8080 +BE80 +3E00 +0800 +FF80 +2900 +FE00 +6180 +ENDCHAR +STARTCHAR 88F4 +ENCODING 35060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +F700 +F700 +A780 +2800 +0800 +FF00 +6600 +BB00 +6100 +ENDCHAR +STARTCHAR 88F5 +ENCODING 35061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +F700 +F700 +1400 +FF80 +6A00 +A400 +3B00 +6180 +ENDCHAR +STARTCHAR 88F8 +ENCODING 35064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5500 +EF00 +3500 +6F00 +FF80 +E600 +4D00 +5480 +4400 +ENDCHAR +STARTCHAR 88FD +ENCODING 35069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A500 +FD00 +FD00 +FD00 +BB00 +2900 +F780 +2500 +FA00 +6180 +ENDCHAR +STARTCHAR 8907 +ENCODING 35079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5F80 +FF00 +3100 +5F00 +EF00 +EF00 +7A00 +4E00 +7180 +ENDCHAR +STARTCHAR 8910 +ENCODING 35088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +2F80 +2880 +7F80 +1F80 +3400 +6F80 +BA80 +2D80 +2F80 +2180 +ENDCHAR +STARTCHAR 8912 +ENCODING 35090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +5F00 +DF00 +FF80 +5E00 +6D80 +3E00 +EE00 +F180 +ENDCHAR +STARTCHAR 8913 +ENCODING 35091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5700 +D500 +5700 +7200 +DF80 +B600 +5B00 +5A80 +5200 +ENDCHAR +STARTCHAR 8918 +ENCODING 35096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4F00 +FF80 +2000 +6F00 +EF00 +FF00 +4A00 +5F80 +4200 +ENDCHAR +STARTCHAR 8919 +ENCODING 35097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5B00 +EA80 +3B00 +6F00 +F100 +AF00 +4F00 +5100 +5300 +ENDCHAR +STARTCHAR 8925 +ENCODING 35109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +5000 +FF00 +3F80 +7700 +F980 +6100 +5F80 +4900 +4300 +ENDCHAR +STARTCHAR 892A +ENCODING 35114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5700 +4D00 +E700 +5500 +6700 +D680 +AD00 +4E80 +5800 +5780 +ENDCHAR +STARTCHAR 8936 +ENCODING 35126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5F +4D +F7 +2F +55 +EF +F1 +4F +4F +51 +ENDCHAR +STARTCHAR 8938 +ENCODING 35128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +FF80 +5F00 +7F00 +D500 +BF80 +4A00 +4600 +7900 +ENDCHAR +STARTCHAR 893B +ENCODING 35131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +F400 +FF00 +ED00 +F580 +F980 +2600 +FA00 +6180 +ENDCHAR +STARTCHAR 8941 +ENCODING 35137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF00 +8D00 +CF00 +5A00 +6700 +DE80 +AE80 +8F00 +8B80 +B680 +ENDCHAR +STARTCHAR 8944 +ENCODING 35140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +F700 +F700 +FF00 +FF00 +2400 +FF80 +EE00 +7180 +ENDCHAR +STARTCHAR 895F +ENCODING 35167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +5B80 +DB00 +6D80 +6900 +DF00 +7F80 +4D00 +5500 +6C80 +ENDCHAR +STARTCHAR 8964 +ENCODING 35172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +5A00 +DF80 +5C00 +6B80 +DC00 +BF00 +5B00 +5B00 +7F80 +ENDCHAR +STARTCHAR 896A +ENCODING 35178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +5F80 +FF00 +5F00 +6500 +DF80 +FB00 +5600 +5680 +6D00 +ENDCHAR +STARTCHAR 8972 +ENCODING 35186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F700 +F100 +0700 +F700 +F880 +F700 +0800 +FF00 +EE00 +7180 +ENDCHAR +STARTCHAR 897F +ENCODING 35199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +1800 +FF00 +A900 +AB00 +C700 +8100 +FF00 +8100 +ENDCHAR +STARTCHAR 8981 +ENCODING 35201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +1400 +FF00 +FF00 +1000 +FF80 +2400 +1E00 +E100 +ENDCHAR +STARTCHAR 8983 +ENCODING 35203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +FF00 +7E00 +4100 +7E00 +7E00 +FF80 +0800 +ENDCHAR +STARTCHAR 8986 +ENCODING 35206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +FF00 +5F00 +F100 +9F00 +9F00 +6A00 +7F80 +ENDCHAR +STARTCHAR 8987 +ENCODING 35207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +FF00 +F700 +7500 +F700 +F700 +F500 +2B00 +ENDCHAR +STARTCHAR 898B +ENCODING 35211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +7E00 +4200 +7E00 +7E00 +1400 +2480 +C700 +ENDCHAR +STARTCHAR 898F +ENCODING 35215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +4900 +EF00 +4900 +EF00 +4900 +4F00 +AA00 +AA80 +9380 +ENDCHAR +STARTCHAR 8993 +ENCODING 35219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0300 +7E00 +C900 +FE00 +7E00 +4200 +7E00 +7E00 +2880 +C700 +ENDCHAR +STARTCHAR 8996 +ENCODING 35222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +0900 +FF00 +EF00 +E900 +EF00 +E600 +EA80 +5380 +ENDCHAR +STARTCHAR 89A1 +ENCODING 35233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +2500 +B700 +B700 +B500 +E700 +3E00 +CE80 +1980 +ENDCHAR +STARTCHAR 89A9 +ENCODING 35241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4700 +F900 +5700 +F900 +5700 +F700 +F600 +F680 +9980 +ENDCHAR +STARTCHAR 89AA +ENCODING 35242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F900 +AF00 +6900 +FF00 +F900 +6F00 +E600 +DA80 +5B00 +ENDCHAR +STARTCHAR 89B2 +ENCODING 35250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AF00 +F900 +6F00 +F900 +DF00 +F900 +4F00 +F600 +7680 +CB80 +ENDCHAR +STARTCHAR 89BA +ENCODING 35258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7B00 +7700 +6B00 +FF80 +FE80 +7E00 +7E00 +1880 +E700 +ENDCHAR +STARTCHAR 89BD +ENCODING 35261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F800 +FF80 +FF00 +FF00 +0000 +7E00 +4100 +7F00 +7E80 +E700 +ENDCHAR +STARTCHAR 89C0 +ENCODING 35264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6700 +F500 +F700 +F500 +2700 +F500 +F700 +F600 +F680 +8980 +ENDCHAR +STARTCHAR 89D2 +ENCODING 35282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +3C +44 +FF +7F +49 +49 +7F +81 +83 +ENDCHAR +STARTCHAR 89E3 +ENCODING 35299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +6500 +A500 +FB00 +B600 +F700 +FA00 +9F80 +9200 +B200 +ENDCHAR +STARTCHAR 89F4 +ENCODING 35316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +EF00 +BF00 +EF00 +EF00 +DF80 +EF00 +9700 +AB00 +AF00 +ENDCHAR +STARTCHAR 89F8 +ENCODING 35320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +EF +AF +E8 +EF +FF +EF +AF +AD +A3 +ENDCHAR +STARTCHAR 8A00 +ENCODING 35328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF80 +0000 +7E00 +7E00 +0000 +7E00 +7E00 +4200 +ENDCHAR +STARTCHAR 8A02 +ENCODING 35330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +F200 +0200 +E200 +E200 +0200 +E200 +E200 +A600 +ENDCHAR +STARTCHAR 8A03 +ENCODING 35331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +0400 +FC00 +F400 +0600 +F500 +F480 +9400 +F400 +9400 +ENDCHAR +STARTCHAR 8A08 +ENCODING 35336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +0200 +F200 +FF80 +0200 +E200 +E200 +A200 +E200 +A200 +ENDCHAR +STARTCHAR 8A0A +ENCODING 35338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +EA00 +0A00 +FE00 +EA00 +0A00 +EA00 +E980 +B180 +ENDCHAR +STARTCHAR 8A0C +ENCODING 35340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +F200 +0200 +E200 +E200 +0200 +E200 +A200 +FF80 +ENDCHAR +STARTCHAR 8A0E +ENCODING 35342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E100 +0100 +F100 +EF80 +0900 +E500 +E500 +A100 +E100 +A300 +ENDCHAR +STARTCHAR 8A13 +ENCODING 35347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +E9 +0B +EB +EB +EB +EB +AB +F1 +91 +ENDCHAR +STARTCHAR 8A16 +ENCODING 35350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0800 +EF80 +E800 +1E00 +E200 +E400 +A880 +F080 +BF00 +ENDCHAR +STARTCHAR 8A17 +ENCODING 35351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +1C00 +E400 +E500 +FE00 +0400 +E400 +A480 +E700 +ENDCHAR +STARTCHAR 8A18 +ENCODING 35352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +E100 +0100 +EF00 +E900 +0800 +E800 +A880 +EF00 +ENDCHAR +STARTCHAR 8A1B +ENCODING 35355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EC00 +0C00 +EC80 +F500 +1200 +EC00 +F400 +B400 +F480 +B300 +ENDCHAR +STARTCHAR 8A1D +ENCODING 35357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +E900 +0900 +FF80 +E200 +0500 +E900 +F100 +A200 +ENDCHAR +STARTCHAR 8A1F +ENCODING 35359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E600 +E900 +0900 +ED00 +F480 +0600 +E900 +EB00 +BC80 +ENDCHAR +STARTCHAR 8A23 +ENCODING 35363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0400 +FF00 +E500 +0500 +FF80 +E400 +AA00 +F900 +B080 +ENDCHAR +STARTCHAR 8A25 +ENCODING 35365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EC +E4 +1F +F5 +F7 +19 +F1 +F1 +B3 +ENDCHAR +STARTCHAR 8A2A +ENCODING 35370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0400 +FF80 +E800 +0700 +E900 +E900 +A900 +F100 +B300 +ENDCHAR +STARTCHAR 8A2D +ENCODING 35373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +FA80 +0B00 +E800 +EF00 +0900 +E600 +E700 +A900 +ENDCHAR +STARTCHAR 8A31 +ENCODING 35377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0800 +EF00 +EA00 +1200 +FF80 +E200 +A200 +E200 +A200 +ENDCHAR +STARTCHAR 8A34 +ENCODING 35380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +0C00 +E800 +EF80 +EA00 +0F00 +EA80 +F200 +B200 +ENDCHAR +STARTCHAR 8A36 +ENCODING 35382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +E100 +0D00 +F500 +F500 +0D00 +F500 +A100 +E300 +ENDCHAR +STARTCHAR 8A3A +ENCODING 35386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0E00 +EB00 +FC80 +1100 +E200 +EC80 +AB00 +E400 +B800 +ENDCHAR +STARTCHAR 8A3B +ENCODING 35387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0200 +EF00 +E400 +0400 +EF00 +E400 +A400 +E400 +BF80 +ENDCHAR +STARTCHAR 8A50 +ENCODING 35408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0800 +EF80 +EC00 +1700 +E400 +E700 +A400 +E400 +A400 +ENDCHAR +STARTCHAR 8A54 +ENCODING 35412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +E5 +09 +F3 +E0 +0F +E9 +EF +A9 +ENDCHAR +STARTCHAR 8A55 +ENCODING 35413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +ED00 +0D00 +F480 +F400 +1F80 +E400 +E400 +A400 +ENDCHAR +STARTCHAR 8A5B +ENCODING 35419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +E900 +0900 +EF00 +E900 +0F00 +E900 +E900 +BF80 +ENDCHAR +STARTCHAR 8A5E +ENCODING 35422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +E1 +1F +ED +EB +0D +EB +A1 +E3 +ENDCHAR +STARTCHAR 8A60 +ENCODING 35424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E600 +0000 +EC00 +E500 +FA00 +0E00 +F500 +B480 +EC00 +ENDCHAR +STARTCHAR 8A62 +ENCODING 35426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E8 +0F +F1 +FD +13 +ED +F3 +AD +E1 +A3 +ENDCHAR +STARTCHAR 8A63 +ENCODING 35427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +0B00 +EC80 +EF00 +0000 +EF00 +E900 +AF00 +EF00 +A900 +ENDCHAR +STARTCHAR 8A66 +ENCODING 35430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +0280 +FF80 +E200 +0200 +FE00 +EA00 +AA00 +FD80 +A100 +ENDCHAR +STARTCHAR 8A69 +ENCODING 35433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0F00 +E400 +1F80 +E100 +FF80 +E900 +A500 +E100 +A700 +ENDCHAR +STARTCHAR 8A6D +ENCODING 35437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0E00 +F200 +FF80 +1700 +F500 +1500 +F700 +F480 +9700 +ENDCHAR +STARTCHAR 8A6E +ENCODING 35438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EC00 +E600 +0900 +FF00 +E480 +0F00 +E400 +E400 +BF80 +ENDCHAR +STARTCHAR 8A70 +ENCODING 35440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0400 +EF80 +E400 +0F00 +E000 +EF00 +A900 +EF00 +A900 +ENDCHAR +STARTCHAR 8A71 +ENCODING 35441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +1C00 +E400 +FF80 +0400 +E400 +EF00 +A900 +EF00 +A900 +ENDCHAR +STARTCHAR 8A72 +ENCODING 35442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +E400 +E900 +0A00 +E500 +EB00 +B600 +ED00 +B080 +ENDCHAR +STARTCHAR 8A73 +ENCODING 35443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +0500 +EF80 +E400 +0F00 +E400 +FF80 +A400 +E400 +A400 +ENDCHAR +STARTCHAR 8A75 +ENCODING 35445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0C00 +EF00 +F400 +0400 +FF80 +EA00 +AA00 +EA80 +B300 +ENDCHAR +STARTCHAR 8A79 +ENCODING 35449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7C00 +FF80 +D700 +7F00 +7F80 +7F00 +8000 +BF00 +BF00 +ENDCHAR +STARTCHAR 8A85 +ENCODING 35461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EC00 +0C00 +EF00 +F400 +1F80 +E600 +EE00 +BD00 +F480 +A400 +ENDCHAR +STARTCHAR 8A87 +ENCODING 35463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +EA00 +FF80 +0000 +FF80 +EF00 +B100 +E100 +A600 +ENDCHAR +STARTCHAR 8A8C +ENCODING 35468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0400 +FF80 +E400 +0F00 +E400 +FB00 +B880 +F980 +A600 +ENDCHAR +STARTCHAR 8A8D +ENCODING 35469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +ED00 +1500 +EB00 +F400 +0A00 +F900 +F980 +A600 +ENDCHAR +STARTCHAR 8A93 +ENCODING 35475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +4800 +FF80 +DA00 +7E00 +FF80 +7E00 +7E00 +7E00 +7E00 +ENDCHAR +STARTCHAR 8A95 +ENCODING 35477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D180 +1600 +F100 +DD80 +CD00 +1D00 +D780 +D800 +D780 +ENDCHAR +STARTCHAR 8A98 +ENCODING 35480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +1C00 +FF00 +EF00 +F080 +1E00 +EB00 +E900 +B300 +ENDCHAR +STARTCHAR 8A9E +ENCODING 35486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +E400 +0F00 +FF80 +E000 +0F00 +E900 +A900 +EF00 +ENDCHAR +STARTCHAR 8AA0 +ENCODING 35488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +0300 +FF80 +D200 +1B00 +D700 +D700 +BA00 +D580 +AD00 +ENDCHAR +STARTCHAR 8AA1 +ENCODING 35489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C300 +0300 +FF80 +D600 +1680 +DF00 +D700 +B600 +E580 +A980 +ENDCHAR +STARTCHAR 8AA3 +ENCODING 35491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +E400 +0D00 +F500 +FF00 +1600 +E400 +A400 +FF80 +ENDCHAR +STARTCHAR 8AA4 +ENCODING 35492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E700 +F500 +1700 +F000 +FF00 +0500 +FF80 +AA00 +F180 +ENDCHAR +STARTCHAR 8AA5 +ENCODING 35493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0C00 +EF00 +F400 +1F80 +E400 +EF00 +B100 +EF00 +B100 +ENDCHAR +STARTCHAR 8AA6 +ENCODING 35494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +EA +1F +F5 +FF +15 +FF +F5 +B5 +ENDCHAR +STARTCHAR 8AA8 +ENCODING 35496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0F80 +F000 +1F00 +ED00 +FF80 +1500 +FF00 +F100 +A600 +ENDCHAR +STARTCHAR 8AAA +ENCODING 35498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +F100 +1F80 +F100 +F100 +0F00 +EA00 +EA80 +B300 +ENDCHAR +STARTCHAR 8AB0 +ENCODING 35504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +0A00 +EF80 +FA00 +1F00 +EA00 +EF00 +AA00 +EF80 +A800 +ENDCHAR +STARTCHAR 8AB2 +ENCODING 35506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F500 +1F00 +FF00 +E400 +1F80 +EF00 +F480 +A400 +ENDCHAR +STARTCHAR 8AB9 +ENCODING 35513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C600 +0600 +FB80 +C600 +1B00 +CA00 +FB80 +AA00 +EA00 +B200 +ENDCHAR +STARTCHAR 8ABC +ENCODING 35516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +F080 +EF00 +0900 +EF00 +E900 +AF00 +E900 +BF80 +ENDCHAR +STARTCHAR 8ABE +ENCODING 35518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +BD +BF +BD +81 +BD +BD +ENDCHAR +STARTCHAR 8ABF +ENCODING 35519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +F5 +17 +F7 +F5 +17 +F7 +BB +F1 +ENDCHAR +STARTCHAR 8AC2 +ENCODING 35522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E8 +0F +E9 +F3 +04 +FB +F1 +BF +FF +B1 +ENDCHAR +STARTCHAR 8AC4 +ENCODING 35524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +EF00 +EF00 +0000 +FF00 +E200 +BF80 +E400 +AC00 +ENDCHAR +STARTCHAR 8AC7 +ENCODING 35527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0C80 +EF00 +ED00 +0C80 +E500 +ED00 +B600 +E900 +B080 +ENDCHAR +STARTCHAR 8ACB +ENCODING 35531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F00 +FF00 +FF80 +0000 +FF00 +F500 +BF00 +F100 +B300 +ENDCHAR +STARTCHAR 8ACD +ENCODING 35533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +0F00 +F480 +EF00 +0500 +FF80 +ED00 +A700 +E400 +AC00 +ENDCHAR +STARTCHAR 8ACF +ENCODING 35535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DE00 +F700 +1A80 +D700 +DB00 +1700 +D900 +D700 +C680 +ENDCHAR +STARTCHAR 8AD2 +ENCODING 35538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +E000 +EF00 +1100 +EF00 +ED00 +AD00 +F480 +A400 +ENDCHAR +STARTCHAR 8AD6 +ENCODING 35542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C600 +1900 +FE80 +C000 +1F00 +DB00 +DF00 +BB00 +DB00 +9B00 +ENDCHAR +STARTCHAR 8ADB +ENCODING 35547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EC00 +1700 +F500 +FF00 +F500 +1F00 +E600 +E900 +B080 +ENDCHAR +STARTCHAR 8ADC +ENCODING 35548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +1F80 +F500 +F700 +0F00 +E400 +FF80 +A700 +EC80 +9400 +ENDCHAR +STARTCHAR 8AE1 +ENCODING 35553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E600 +0900 +FF80 +FF00 +E600 +0000 +FF00 +F700 +BF80 +ENDCHAR +STARTCHAR 8AE6 +ENCODING 35558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +E900 +FF80 +1480 +EF00 +0D00 +ED00 +ED00 +A400 +ENDCHAR +STARTCHAR 8AE7 +ENCODING 35559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +0F80 +F280 +EF80 +1400 +EF00 +F100 +AF00 +B100 +EF00 +ENDCHAR +STARTCHAR 8AEA +ENCODING 35562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +EF00 +EF00 +0000 +FF80 +1F80 +E400 +E400 +AC00 +ENDCHAR +STARTCHAR 8AEB +ENCODING 35563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +1F80 +E400 +DF00 +1F00 +DF00 +C600 +BD00 +D480 +A400 +ENDCHAR +STARTCHAR 8AED +ENCODING 35565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DC00 +0B00 +FE80 +DF00 +D700 +1D00 +DF00 +D700 +DD80 +ENDCHAR +STARTCHAR 8AEE +ENCODING 35566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1700 +ED00 +F700 +0D00 +F880 +EF00 +B100 +EF00 +B100 +ENDCHAR +STARTCHAR 8AF1 +ENCODING 35569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F00 +FF80 +E000 +1F00 +FF00 +FF00 +B400 +FF80 +A400 +ENDCHAR +STARTCHAR 8AF6 +ENCODING 35574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +1F80 +E900 +EF00 +0F00 +E900 +FF80 +B700 +FF80 +B000 +ENDCHAR +STARTCHAR 8AF7 +ENCODING 35575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +F300 +1D00 +DF00 +DF00 +1F00 +DF00 +D780 +A980 +ENDCHAR +STARTCHAR 8AF8 +ENCODING 35576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0F00 +E600 +FF80 +0500 +EF00 +F900 +AF00 +EF00 +A900 +ENDCHAR +STARTCHAR 8AFA +ENCODING 35578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +E600 +E900 +1F80 +F600 +F300 +B480 +F300 +BC00 +ENDCHAR +STARTCHAR 8AFE +ENCODING 35582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +EE00 +E400 +1F80 +E800 +FF00 +B900 +EF00 +A900 +ENDCHAR +STARTCHAR 8B00 +ENCODING 35584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +1F80 +E900 +EF00 +0F00 +FF80 +E600 +AD00 +F480 +A400 +ENDCHAR +STARTCHAR 8B01 +ENCODING 35585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +EF +11 +EF +EF +15 +FB +EF +A3 +ENDCHAR +STARTCHAR 8B02 +ENCODING 35586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +1F +E0 +EF +0F +EF +E9 +AB +ENDCHAR +STARTCHAR 8B04 +ENCODING 35588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CD00 +B500 +BE00 +D980 +BF80 +E000 +A600 +A600 +BF00 +DF00 +ENDCHAR +STARTCHAR 8B0E +ENCODING 35598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D200 +1680 +E700 +D780 +0200 +D700 +D700 +BA80 +DA00 +A780 +ENDCHAR +STARTCHAR 8B10 +ENCODING 35600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C500 +0A00 +FD00 +D980 +1E00 +C000 +DF00 +B700 +D700 +BF80 +ENDCHAR +STARTCHAR 8B14 +ENCODING 35604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +0700 +FF80 +DE80 +1700 +D000 +DF00 +BF80 +D800 +8F00 +ENDCHAR +STARTCHAR 8B16 +ENCODING 35606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +1F00 +EA80 +F700 +0F00 +FA00 +E600 +B980 +ENDCHAR +STARTCHAR 8B17 +ENCODING 35607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F00 +E900 +FF80 +1480 +FF80 +E800 +AF00 +E900 +B300 +ENDCHAR +STARTCHAR 8B19 +ENCODING 35609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CD00 +1E00 +FF00 +DF00 +0B00 +DF80 +DF00 +AB00 +DA80 +AA00 +ENDCHAR +STARTCHAR 8B1A +ENCODING 35610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +F100 +1E80 +EE00 +F100 +1F80 +F700 +F700 +BF80 +ENDCHAR +STARTCHAR 8B1B +ENCODING 35611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +FF00 +FF80 +0400 +EF00 +FF80 +BF80 +F100 +9300 +ENDCHAR +STARTCHAR 8B1D +ENCODING 35613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C900 +1900 +F500 +DB80 +1900 +D700 +3B00 +D500 +E500 +CB00 +ENDCHAR +STARTCHAR 8B20 +ENCODING 35616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +0F00 +F600 +0400 +F800 +EF00 +1F80 +E400 +EF00 +9100 +ENDCHAR +STARTCHAR 8B28 +ENCODING 35624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +E000 +FF00 +1F00 +FF00 +E400 +BF80 +EE00 +B180 +ENDCHAR +STARTCHAR 8B2B +ENCODING 35627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +E900 +DF00 +1480 +DE80 +DE80 +BE80 +D880 +B100 +ENDCHAR +STARTCHAR 8B2C +ENCODING 35628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DB00 +E900 +1B00 +EE80 +D580 +1A00 +C500 +BE00 +D800 +ENDCHAR +STARTCHAR 8B33 +ENCODING 35635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F700 +1500 +F700 +FD00 +1E80 +DD00 +B000 +DF80 +ENDCHAR +STARTCHAR 8B39 +ENCODING 35641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +EE00 +E400 +1F00 +FF00 +FF00 +BF00 +E400 +BF80 +ENDCHAR +STARTCHAR 8B41 +ENCODING 35649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +E000 +FF00 +1F80 +ED00 +FF00 +BF80 +E400 +A400 +ENDCHAR +STARTCHAR 8B49 +ENCODING 35657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +ED00 +F680 +0900 +FE80 +EF00 +0F00 +E800 +EA00 +BF80 +ENDCHAR +STARTCHAR 8B4E +ENCODING 35662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +CF00 +E600 +1F80 +F700 +FF00 +1B00 +FF00 +FF00 +B300 +ENDCHAR +STARTCHAR 8B4F +ENCODING 35663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +D600 +1F00 +F500 +DF80 +1D00 +DF80 +D300 +DA00 +D680 +AD00 +ENDCHAR +STARTCHAR 8B58 +ENCODING 35672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +1F00 +F600 +FF80 +0200 +DF00 +DF00 +DD80 +D380 +8500 +ENDCHAR +STARTCHAR 8B5A +ENCODING 35674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +1F00 +EF00 +F100 +0F00 +EF00 +FF80 +A400 +ENDCHAR +STARTCHAR 8B5C +ENCODING 35676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +FB00 +FB00 +1F80 +FF00 +F100 +BF00 +FF00 +B100 +ENDCHAR +STARTCHAR 8B66 +ENCODING 35686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +FF80 +7D00 +BE00 +4180 +FF80 +7E00 +7E00 +7E00 +7E00 +ENDCHAR +STARTCHAR 8B6C +ENCODING 35692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +FF00 +8F80 +FF00 +0000 +FF80 +7E00 +7E00 +7E00 +7E00 +ENDCHAR +STARTCHAR 8B6F +ENCODING 35695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F680 +1F00 +EF00 +FF80 +1980 +FF00 +E400 +A400 +ENDCHAR +STARTCHAR 8B70 +ENCODING 35696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +1F80 +FF00 +FF80 +0400 +EB00 +1F80 +FF00 +EA80 +BD80 +ENDCHAR +STARTCHAR 8B74 +ENCODING 35700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C200 +1700 +C700 +DF80 +0700 +F700 +D700 +D700 +D800 +A780 +ENDCHAR +STARTCHAR 8B77 +ENCODING 35703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +EF00 +F200 +1F00 +FF80 +E000 +BF00 +E600 +B980 +ENDCHAR +STARTCHAR 8B7D +ENCODING 35709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7300 +7B00 +5900 +7B00 +FF80 +7F00 +FE80 +7E00 +7E00 +7E00 +ENDCHAR +STARTCHAR 8B80 +ENCODING 35712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +FF00 +DB00 +1F00 +DF00 +DF00 +BF00 +DF00 +B980 +ENDCHAR +STARTCHAR 8B8A +ENCODING 35722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DF00 +5A00 +FB80 +DA80 +FD80 +6000 +BF00 +1C00 +E780 +ENDCHAR +STARTCHAR 8B90 +ENCODING 35728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A600 +EA00 +EE00 +E600 +7F00 +FF80 +7E00 +7E00 +7E00 +7E00 +ENDCHAR +STARTCHAR 8B92 +ENCODING 35730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C800 +1600 +F900 +DE00 +0B00 +D800 +1600 +DF00 +CD80 +BB00 +ENDCHAR +STARTCHAR 8B93 +ENCODING 35731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +FF80 +FF00 +1F80 +FF00 +0A00 +FF80 +FF00 +B980 +ENDCHAR +STARTCHAR 8B96 +ENCODING 35734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D600 +1700 +EA00 +DF80 +1600 +DA80 +D900 +DD00 +FB80 +C500 +ENDCHAR +STARTCHAR 8B9A +ENCODING 35738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DA00 +1B00 +FB80 +DF00 +1D80 +DF00 +D100 +BF00 +C000 +BB80 +ENDCHAR +STARTCHAR 8C37 +ENCODING 35895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +42 +99 +24 +42 +FF +42 +7E +42 +ENDCHAR +STARTCHAR 8C3F +ENCODING 35903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +D900 +4A80 +A600 +5500 +FF80 +6900 +E700 +9900 +ENDCHAR +STARTCHAR 8C41 +ENCODING 35905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F500 +DA80 +FE00 +F500 +F900 +4F80 +F900 +F700 +9900 +ENDCHAR +STARTCHAR 8C46 +ENCODING 35910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0000 +7E00 +4200 +7E00 +0000 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR 8C48 +ENCODING 35912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +7F00 +FF00 +0000 +7E00 +4200 +7E00 +2400 +FF80 +ENDCHAR +STARTCHAR 8C4A +ENCODING 35914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +FF00 +FF00 +FF00 +0000 +FF80 +7E00 +7E00 +2400 +FF80 +ENDCHAR +STARTCHAR 8C4C +ENCODING 35916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +F080 +AF00 +F700 +1700 +AB00 +EB00 +CA80 +1300 +ENDCHAR +STARTCHAR 8C55 +ENCODING 35925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +18 +75 +96 +6C +DA +69 +89 +18 +ENDCHAR +STARTCHAR 8C5A +ENCODING 35930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +AA00 +FB00 +AE00 +BE00 +F500 +AD00 +B480 +EC00 +ENDCHAR +STARTCHAR 8C61 +ENCODING 35937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3C00 +FF00 +8900 +7F00 +3500 +DE00 +EA00 +7B00 +D880 +ENDCHAR +STARTCHAR 8C6A +ENCODING 35946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +7E00 +FF00 +FF00 +3500 +FE00 +FA00 +9900 +ENDCHAR +STARTCHAR 8C6B +ENCODING 35947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +2E00 +DF00 +5500 +FB00 +6F00 +5F00 +5D00 +7480 +8C00 +ENDCHAR +STARTCHAR 8C79 +ENCODING 35961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +34 +C8 +BF +A9 +71 +EF +B1 +51 +91 +67 +ENDCHAR +STARTCHAR 8C7A +ENCODING 35962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3100 +C100 +BF80 +6200 +6200 +E500 +D900 +7900 +9100 +6600 +ENDCHAR +STARTCHAR 8C82 +ENCODING 35970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +2F +C5 +B5 +69 +F3 +6F +B9 +59 +9F +69 +ENDCHAR +STARTCHAR 8C8A +ENCODING 35978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +CF80 +C400 +6F00 +4900 +E900 +AF00 +5900 +AF00 +6900 +ENDCHAR +STARTCHAR 8C8C +ENCODING 35980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +CF00 +B900 +6F00 +E900 +6F00 +A600 +5600 +AA80 +7380 +ENDCHAR +STARTCHAR 8C9D +ENCODING 35997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +42 +7E +42 +7E +42 +7E +66 +81 +ENDCHAR +STARTCHAR 8C9E +ENCODING 35998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +0F +08 +7E +7E +42 +7E +7E +26 +C1 +ENDCHAR +STARTCHAR 8CA0 +ENCODING 36000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +3C +C8 +FE +7E +41 +7E +7E +26 +C1 +ENDCHAR +STARTCHAR 8CA1 +ENCODING 36001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E100 +9100 +E100 +9F80 +E200 +9500 +E900 +0900 +A100 +9600 +ENDCHAR +STARTCHAR 8CA2 +ENCODING 36002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +0000 +7E00 +7E00 +7E00 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 8CA7 +ENCODING 36007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +FF +B2 +FE +42 +7E +7E +00 +C3 +ENDCHAR +STARTCHAR 8CA8 +ENCODING 36008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2B00 +4C80 +CF00 +4000 +7E00 +7E00 +4100 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 8CA9 +ENCODING 36009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +A800 +E800 +AF00 +F500 +F300 +1200 +B500 +9880 +ENDCHAR +STARTCHAR 8CAA +ENCODING 36010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +7E00 +8180 +7E00 +7E00 +4100 +7E00 +7E00 +2000 +C300 +ENDCHAR +STARTCHAR 8CAB +ENCODING 36011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +FF80 +7E00 +7E00 +4100 +7E00 +7E00 +2600 +C100 +ENDCHAR +STARTCHAR 8CAC +ENCODING 36012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +FF80 +7E00 +7E00 +4200 +7E00 +6600 +8180 +ENDCHAR +STARTCHAR 8CAF +ENCODING 36015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +F080 +B080 +FF80 +A200 +E200 +A200 +A200 +9C00 +ENDCHAR +STARTCHAR 8CB0 +ENCODING 36016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +FF80 +5C00 +7F00 +7E00 +4100 +7E00 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 8CB3 +ENCODING 36019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0500 +FF80 +0400 +F400 +FC00 +F400 +8A00 +F200 +5280 +8900 +ENDCHAR +STARTCHAR 8CB4 +ENCODING 36020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +7E00 +FF80 +7E00 +7E00 +4100 +7E00 +6600 +8100 +ENDCHAR +STARTCHAR 8CB6 +ENCODING 36022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +BC00 +E400 +BF00 +E100 +A200 +F400 +9800 +B780 +ENDCHAR +STARTCHAR 8CB7 +ENCODING 36023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +00 +7F +7F +7F +7F +26 +C1 +ENDCHAR +STARTCHAR 8CB8 +ENCODING 36024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +4F80 +FC80 +4700 +7E00 +7E00 +4200 +7E00 +0000 +C300 +ENDCHAR +STARTCHAR 8CBB +ENCODING 36027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +FF +FF +FF +FF +42 +7E +7E +26 +C1 +ENDCHAR +STARTCHAR 8CBC +ENCODING 36028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +E780 +A400 +A400 +EF00 +F100 +1100 +AF00 +B100 +ENDCHAR +STARTCHAR 8CBD +ENCODING 36029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A800 +E900 +BF00 +E080 +AF00 +E900 +A900 +AF00 +9100 +ENDCHAR +STARTCHAR 8CBF +ENCODING 36031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1F +65 +B7 +D8 +7E +7E +7E +41 +7E +C3 +ENDCHAR +STARTCHAR 8CC0 +ENCODING 36032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +F700 +5500 +B700 +7F00 +7F00 +4100 +7F00 +6600 +8180 +ENDCHAR +STARTCHAR 8CC1 +ENCODING 36033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +22 +FF +7E +7E +41 +7E +26 +C1 +ENDCHAR +STARTCHAR 8CC2 +ENCODING 36034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +F900 +B600 +EF00 +B880 +EF00 +2900 +AF00 +9900 +ENDCHAR +STARTCHAR 8CC3 +ENCODING 36035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +DC00 +FF00 +5F00 +7E00 +4100 +7E00 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 8CC4 +ENCODING 36036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +A800 +EF00 +B900 +FF00 +A900 +EF00 +A900 +AB00 +ENDCHAR +STARTCHAR 8CC7 +ENCODING 36039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +DF +5D +B3 +7E +7E +41 +7E +7E +C3 +ENDCHAR +STARTCHAR 8CC8 +ENCODING 36040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +FF +00 +7E +7E +7E +7E +E3 +ENDCHAR +STARTCHAR 8CCA +ENCODING 36042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +A280 +FF80 +AA00 +EB00 +BF00 +EA00 +2A00 +B680 +A900 +ENDCHAR +STARTCHAR 8CD1 +ENCODING 36049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF00 +B000 +DF00 +B000 +DF80 +DA00 +1A00 +D700 +A880 +ENDCHAR +STARTCHAR 8CD3 +ENCODING 36051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +D8 +FE +7E +42 +7E +26 +C1 +ENDCHAR +STARTCHAR 8CDA +ENCODING 36058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +5A00 +AD00 +FF80 +4200 +7E00 +7E00 +2600 +C100 +ENDCHAR +STARTCHAR 8CDC +ENCODING 36060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EF +B1 +EF +AF +E8 +FF +1B +D5 +AB +ENDCHAR +STARTCHAR 8CDE +ENCODING 36062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4A +FF +BF +3E +00 +7E +42 +7E +7E +E3 +ENDCHAR +STARTCHAR 8CE0 +ENCODING 36064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +E900 +AA00 +BF80 +E000 +EF00 +2900 +AF00 +A900 +ENDCHAR +STARTCHAR 8CE2 +ENCODING 36066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +9500 +F700 +0880 +7E00 +4100 +7F00 +7E00 +E300 +ENDCHAR +STARTCHAR 8CE3 +ENCODING 36067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +00 +FF +00 +7E +42 +7E +7E +C3 +ENDCHAR +STARTCHAR 8CE4 +ENCODING 36068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +A700 +FD00 +A680 +B900 +EA00 +FF80 +0500 +C680 +BF00 +ENDCHAR +STARTCHAR 8CE6 +ENCODING 36070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +BE80 +FF80 +AA00 +BA00 +F600 +FA00 +1A00 +D580 +B900 +ENDCHAR +STARTCHAR 8CEA +ENCODING 36074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +FF +AA +88 +7E +42 +7E +7E +E3 +ENDCHAR +STARTCHAR 8CED +ENCODING 36077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +E500 +BF80 +E500 +AF00 +F900 +0F00 +AF00 +A900 +ENDCHAR +STARTCHAR 8CF4 +ENCODING 36084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F480 +4B00 +FF00 +D900 +FF00 +6F00 +BF00 +D500 +4880 +ENDCHAR +STARTCHAR 8CFB +ENCODING 36091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E500 +BF80 +BF00 +F500 +BF00 +F500 +E100 +1F80 +A900 +A200 +ENDCHAR +STARTCHAR 8CFC +ENCODING 36092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +BF80 +FF00 +AA00 +FF80 +BF00 +FF80 +D580 +BF00 +B300 +ENDCHAR +STARTCHAR 8CFD +ENCODING 36093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +3C +FF +C3 +7E +7E +7E +E3 +ENDCHAR +STARTCHAR 8D04 +ENCODING 36100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F00 +6500 +4580 +6900 +7E00 +7E00 +7E00 +7E00 +E300 +ENDCHAR +STARTCHAR 8D05 +ENCODING 36101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +F780 +FD00 +7200 +BD80 +7F00 +7F00 +7F00 +7F00 +E380 +ENDCHAR +STARTCHAR 8D07 +ENCODING 36103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +FF00 +4A00 +6E80 +9900 +7E00 +4200 +7E00 +7E00 +C300 +ENDCHAR +STARTCHAR 8D08 +ENCODING 36104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E600 +B100 +FF80 +BF00 +FF00 +EF00 +1100 +AF00 +AF00 +ENDCHAR +STARTCHAR 8D0A +ENCODING 36106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AA00 +FF00 +FF80 +7680 +AB80 +7E00 +4100 +7E00 +0000 +E380 +ENDCHAR +STARTCHAR 8D0D +ENCODING 36109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EE00 +BF80 +F600 +B900 +FF80 +B000 +FF00 +BF00 +9F00 +ENDCHAR +STARTCHAR 8D13 +ENCODING 36115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0100 +C280 +FF80 +FE00 +FE80 +FA80 +FD00 +3D00 +FF80 +D500 +ENDCHAR +STARTCHAR 8D16 +ENCODING 36118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +E000 +BF80 +BF00 +FF00 +FF00 +1F00 +BF00 +9980 +ENDCHAR +STARTCHAR 8D64 +ENCODING 36196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F00 +0800 +0800 +FF00 +5600 +5500 +A500 +A480 +4C00 +ENDCHAR +STARTCHAR 8D66 +ENCODING 36198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +F400 +2780 +2500 +FD00 +ED00 +EA00 +EA00 +6500 +A880 +ENDCHAR +STARTCHAR 8D6B +ENCODING 36203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F700 +4200 +FF80 +6500 +FD00 +FD00 +AD80 +A500 +EA00 +ENDCHAR +STARTCHAR 8D70 +ENCODING 36208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +7E00 +0800 +FF00 +2800 +4E00 +4800 +6800 +9F80 +ENDCHAR +STARTCHAR 8D73 +ENCODING 36211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +F500 +2500 +2500 +F500 +2780 +BF00 +A100 +C100 +BF80 +ENDCHAR +STARTCHAR 8D74 +ENCODING 36212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +F400 +2600 +FF00 +2500 +B400 +A400 +E400 +BF80 +ENDCHAR +STARTCHAR 8D77 +ENCODING 36215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +FF00 +2100 +2700 +F800 +A800 +B880 +A700 +E000 +1F80 +ENDCHAR +STARTCHAR 8D85 +ENCODING 36229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1780 +7A80 +1280 +7D80 +1780 +5C80 +5780 +6000 +9FC0 +ENDCHAR +STARTCHAR 8D8A +ENCODING 36234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +4300 +FF80 +4A00 +FB00 +4F00 +BA00 +C580 +C000 +BF80 +ENDCHAR +STARTCHAR 8D99 +ENCODING 36249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +4B00 +F280 +4F00 +FF00 +4900 +BF00 +CB00 +C000 +BF80 +ENDCHAR +STARTCHAR 8DA3 +ENCODING 36259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2E00 +7B80 +2B40 +2F80 +7B80 +2E80 +7A80 +6F40 +6200 +9FC0 +ENDCHAR +STARTCHAR 8DA8 +ENCODING 36264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +EF00 +5E80 +4F00 +F900 +4F00 +BE80 +CF00 +C900 +BF80 +ENDCHAR +STARTCHAR 8DB3 +ENCODING 36275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +4200 +7E00 +4800 +4F00 +4800 +B800 +9F80 +ENDCHAR +STARTCHAR 8DBA +ENCODING 36282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +AF00 +E400 +5F80 +C400 +E600 +CA00 +F900 +D080 +ENDCHAR +STARTCHAR 8DBE +ENCODING 36286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +A200 +A200 +EA00 +4B80 +CA00 +AA00 +CA00 +AA00 +DF80 +ENDCHAR +STARTCHAR 8DC6 +ENCODING 36294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +A900 +EF00 +4080 +B000 +CF00 +B900 +EF00 +8900 +ENDCHAR +STARTCHAR 8DCB +ENCODING 36299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +A500 +AF80 +E500 +4D00 +AE00 +CA00 +D200 +A500 +C880 +ENDCHAR +STARTCHAR 8DCC +ENCODING 36300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AC00 +AF00 +F400 +4400 +FF80 +C400 +E600 +C900 +9080 +ENDCHAR +STARTCHAR 8DCF +ENCODING 36303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F0 +B3 +BF +F7 +57 +F7 +D7 +D7 +E7 +3B +ENDCHAR +STARTCHAR 8DDB +ENCODING 36315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +B500 +F400 +5F00 +F900 +D600 +F600 +9D00 +2880 +ENDCHAR +STARTCHAR 8DDD +ENCODING 36317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A800 +A800 +EF00 +C900 +EF00 +C800 +E800 +DF80 +ENDCHAR +STARTCHAR 8DE1 +ENCODING 36321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +BF80 +E600 +5700 +F680 +D680 +DA80 +EA00 +9600 +ENDCHAR +STARTCHAR 8DE3 +ENCODING 36323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AC00 +AF00 +F400 +4400 +FF80 +CA00 +CA00 +EA80 +9300 +ENDCHAR +STARTCHAR 8DE8 +ENCODING 36328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +AA00 +EF00 +5080 +DF80 +E800 +CF00 +E100 +C700 +ENDCHAR +STARTCHAR 8DEF +ENCODING 36335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +A900 +F600 +4700 +B980 +CF00 +C900 +EF00 +8900 +ENDCHAR +STARTCHAR 8DF3 +ENCODING 36339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +AA80 +BB00 +EB00 +4A00 +EB00 +DA80 +CA00 +F280 +9380 +ENDCHAR +STARTCHAR 8E0A +ENCODING 36362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +AA +BF +F5 +DF +F5 +DF +F5 +D5 +ENDCHAR +STARTCHAR 8E0F +ENCODING 36367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +BB00 +AA00 +EB00 +5480 +EF00 +D100 +CF00 +EF00 +9100 +ENDCHAR +STARTCHAR 8E10 +ENCODING 36368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +A700 +BD00 +E680 +5900 +CA00 +FF80 +C500 +E680 +D900 +ENDCHAR +STARTCHAR 8E1E +ENCODING 36382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +B080 +AF00 +F200 +DF80 +FF00 +D880 +FF00 +A880 +ENDCHAR +STARTCHAR 8E2A +ENCODING 36394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +B080 +EF00 +4000 +DF80 +ED00 +CD00 +F480 +CC00 +ENDCHAR +STARTCHAR 8E30 +ENCODING 36400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DC00 +AB00 +BE80 +DE80 +D700 +FD00 +DF00 +F700 +9980 +ENDCHAR +STARTCHAR 8E35 +ENCODING 36405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +BC00 +BF80 +EF00 +5500 +CF00 +EF00 +DF00 +E400 +DF80 +ENDCHAR +STARTCHAR 8E42 +ENCODING 36418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +A600 +BF80 +FB00 +C400 +FF80 +C600 +ED00 +D480 +ENDCHAR +STARTCHAR 8E44 +ENCODING 36420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +AA00 +FF80 +5480 +EF00 +D500 +F500 +D500 +8400 +ENDCHAR +STARTCHAR 8E47 +ENCODING 36423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +7E00 +FF00 +7E00 +C380 +3E00 +6800 +9F80 +ENDCHAR +STARTCHAR 8E48 +ENCODING 36424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E100 +AF00 +B480 +F000 +DF00 +F100 +DF00 +FF00 +9100 +ENDCHAR +STARTCHAR 8E49 +ENCODING 36425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +BF80 +A400 +EF00 +4400 +FF80 +CF00 +CA00 +F200 +EF80 +ENDCHAR +STARTCHAR 8E4A +ENCODING 36426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E100 +AF00 +B480 +EA00 +C500 +FF00 +DF80 +EE00 +9180 +ENDCHAR +STARTCHAR 8E59 +ENCODING 36441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0500 +FF00 +9D00 +FA00 +DA80 +A500 +7E00 +0800 +6E00 +BF80 +ENDCHAR +STARTCHAR 8E5F +ENCODING 36447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +AF00 +FF80 +4F00 +EF00 +D100 +EF00 +CA00 +9180 +ENDCHAR +STARTCHAR 8E60 +ENCODING 36448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +B500 +FF00 +5500 +F500 +DF80 +DF00 +FE80 +9D80 +ENDCHAR +STARTCHAR 8E74 +ENCODING 36468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CB00 +BE80 +A200 +DF80 +5700 +FF00 +D700 +D700 +EB80 +9580 +ENDCHAR +STARTCHAR 8E76 +ENCODING 36470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +EE00 +E580 +DE80 +EF00 +ED00 +E900 +AB00 +3280 +ENDCHAR +STARTCHAR 8E81 +ENCODING 36481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +AF00 +A000 +FF80 +DF80 +FF80 +C600 +ED00 +9480 +ENDCHAR +STARTCHAR 8E87 +ENCODING 36487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +BF80 +A400 +EF00 +5F80 +E500 +CF00 +D900 +EF00 +CF00 +ENDCHAR +STARTCHAR 8E8A +ENCODING 36490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +BF00 +A000 +DF80 +5F00 +E000 +DF80 +DF80 +FB00 +9B00 +ENDCHAR +STARTCHAR 8E8D +ENCODING 36493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +BD00 +BE80 +EA00 +CF80 +FF00 +D300 +EC00 +CF80 +ENDCHAR +STARTCHAR 8EAA +ENCODING 36522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +BF80 +BB00 +DB00 +5B00 +E880 +DC80 +DE80 +EE80 +9100 +ENDCHAR +STARTCHAR 8EAB +ENCODING 36523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +7E80 +4300 +FE00 +0A00 +7200 +8600 +ENDCHAR +STARTCHAR 8EAC +ENCODING 36524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +FF +91 +F7 +F8 +98 +FF +59 +91 +33 +ENDCHAR +STARTCHAR 8EC0 +ENCODING 36544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +F000 +B700 +F700 +F000 +BD00 +FE80 +7D00 +B000 +7F80 +ENDCHAR +STARTCHAR 8ECA +ENCODING 36554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +7E00 +7E00 +4A00 +7E00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 8ECB +ENCODING 36555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FC00 +2400 +F400 +F400 +B400 +F400 +FC80 +2480 +2700 +ENDCHAR +STARTCHAR 8ECC +ENCODING 36556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F400 +4400 +FE00 +F500 +D500 +F500 +F900 +4980 +5180 +ENDCHAR +STARTCHAR 8ECD +ENCODING 36557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +89 +7E +7E +7E +4A +7E +FF +08 +ENDCHAR +STARTCHAR 8ED2 +ENCODING 36562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F200 +4200 +F200 +FF80 +D200 +F200 +F200 +4200 +4200 +ENDCHAR +STARTCHAR 8EDF +ENCODING 36575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F400 +4780 +FA80 +FB00 +D300 +F600 +F500 +4900 +4880 +ENDCHAR +STARTCHAR 8EEB +ENCODING 36587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +E600 +4900 +F280 +ED00 +EA00 +E480 +EB00 +4400 +5800 +ENDCHAR +STARTCHAR 8EF8 +ENCODING 36600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +42 +F2 +4F +FB +FB +DF +FB +FB +4F +49 +ENDCHAR +STARTCHAR 8EFB +ENCODING 36603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F100 +EF00 +DB00 +EB00 +DB00 +EF00 +F100 +4100 +4300 +ENDCHAR +STARTCHAR 8EFE +ENCODING 36606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +E280 +5F80 +E200 +E200 +DE00 +EA00 +FA00 +4D80 +5900 +ENDCHAR +STARTCHAR 8F03 +ENCODING 36611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +4600 +E900 +E880 +D900 +E600 +F600 +4900 +5080 +ENDCHAR +STARTCHAR 8F05 +ENCODING 36613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F700 +4900 +F600 +E700 +E880 +EF00 +F900 +4F00 +4900 +ENDCHAR +STARTCHAR 8F09 +ENCODING 36617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2600 +FD00 +FF80 +2400 +FD00 +FD00 +AA00 +FA00 +FE80 +2900 +ENDCHAR +STARTCHAR 8F12 +ENCODING 36626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +EE00 +4E00 +EE00 +EE00 +EE00 +EE00 +EE00 +5680 +4580 +ENDCHAR +STARTCHAR 8F13 +ENCODING 36627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FE00 +4A00 +FF00 +ED00 +EF00 +E600 +F600 +4A80 +5300 +ENDCHAR +STARTCHAR 8F14 +ENCODING 36628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +EF80 +4200 +EF00 +EA80 +EF00 +EA80 +FF00 +4A80 +4B00 +ENDCHAR +STARTCHAR 8F15 +ENCODING 36629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +EB00 +4D00 +F600 +EB00 +EA80 +EF00 +F200 +4200 +5F80 +ENDCHAR +STARTCHAR 8F1B +ENCODING 36635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +E400 +FF00 +F480 +FE80 +F500 +FF00 +FF00 +5480 +5500 +ENDCHAR +STARTCHAR 8F1C +ENCODING 36636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A80 +FD00 +4D00 +EA80 +E000 +DF00 +EA80 +FF00 +4F00 +4880 +ENDCHAR +STARTCHAR 8F1D +ENCODING 36637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +D480 +EF00 +EF00 +F500 +AF00 +AF00 +BF80 +C400 +8400 +ENDCHAR +STARTCHAR 8F1E +ENCODING 36638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +F7 +57 +EF +F3 +EF +F5 +F7 +51 +53 +ENDCHAR +STARTCHAR 8F1F +ENCODING 36639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +E700 +4900 +F680 +E400 +FF00 +F700 +EB00 +5700 +5480 +ENDCHAR +STARTCHAR 8F26 +ENCODING 36646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F700 +FF80 +BD00 +FF00 +7E00 +7E00 +7E00 +FF80 +0800 +ENDCHAR +STARTCHAR 8F27 +ENCODING 36647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F500 +4F80 +E500 +E500 +DF80 +E500 +F900 +4900 +5100 +ENDCHAR +STARTCHAR 8F29 +ENCODING 36649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +F700 +F780 +A800 +FF00 +7F00 +7F00 +7F00 +FF80 +0800 +ENDCHAR +STARTCHAR 8F2A +ENCODING 36650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +E600 +4900 +FE80 +EF00 +F680 +F680 +EF00 +5680 +5700 +ENDCHAR +STARTCHAR 8F2F +ENCODING 36655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +E900 +4F00 +FF80 +E900 +EF00 +EF00 +E980 +5F00 +4100 +ENDCHAR +STARTCHAR 8F33 +ENCODING 36659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +EF00 +E600 +FF80 +E900 +F680 +EF00 +4A00 +5100 +ENDCHAR +STARTCHAR 8F38 +ENCODING 36664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +E600 +4F00 +F080 +FE80 +F700 +FF00 +FF00 +5680 +5D80 +ENDCHAR +STARTCHAR 8F39 +ENCODING 36665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +FF80 +EF00 +D900 +EF00 +DF00 +E700 +FD00 +4600 +5980 +ENDCHAR +STARTCHAR 8F3B +ENCODING 36667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F000 +4F00 +EF00 +E000 +DF00 +EA80 +FF00 +4F00 +4880 +ENDCHAR +STARTCHAR 8F3E +ENCODING 36670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F880 +4F00 +ED00 +EF00 +DD00 +EF80 +FE00 +5700 +5C80 +ENDCHAR +STARTCHAR 8F3F +ENCODING 36671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CB00 +BD00 +BD00 +EF00 +FF00 +BD00 +FF80 +0000 +6600 +8100 +ENDCHAR +STARTCHAR 8F44 +ENCODING 36676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +EF80 +4A80 +EF00 +EF00 +EF80 +E000 +EF00 +4F00 +4900 +ENDCHAR +STARTCHAR 8F45 +ENCODING 36677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +4F80 +E000 +EF00 +EF00 +E680 +FB00 +4700 +4880 +ENDCHAR +STARTCHAR 8F49 +ENCODING 36681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +EF00 +4F00 +EF00 +EF00 +E500 +EE80 +EF80 +4900 +4200 +ENDCHAR +STARTCHAR 8F4D +ENCODING 36685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +FE00 +5780 +FF00 +F700 +FF00 +FD00 +FD00 +5700 +5E80 +ENDCHAR +STARTCHAR 8F4E +ENCODING 36686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +EE00 +5F80 +E900 +FE80 +E000 +FF00 +F700 +5700 +5100 +ENDCHAR +STARTCHAR 8F5D +ENCODING 36701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F300 +FB00 +FB00 +9900 +FF80 +7F00 +CA80 +7E00 +FF00 +0800 +ENDCHAR +STARTCHAR 8F5F +ENCODING 36703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +7E00 +7E00 +FF00 +FF80 +F700 +DA80 +6700 +6700 +ENDCHAR +STARTCHAR 8F62 +ENCODING 36706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F700 +6A80 +F700 +FB00 +BF80 +FF80 +EF00 +5480 +4400 +ENDCHAR +STARTCHAR 8F9B +ENCODING 36763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2200 +2400 +FF80 +0800 +FF00 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 8F9C +ENCODING 36764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +4100 +7E00 +FF00 +E780 +FF00 +0800 +0800 +ENDCHAR +STARTCHAR 8FA3 +ENCODING 36771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +EF80 +A200 +AF00 +FA80 +4F00 +F600 +4B00 +5280 +8200 +ENDCHAR +STARTCHAR 8FA6 +ENCODING 36774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +F380 +BA80 +D700 +F780 +5900 +F900 +9B80 +A900 +B900 +ENDCHAR +STARTCHAR 8FA8 +ENCODING 36776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +EF80 +9B00 +DB00 +FF80 +5A00 +FF80 +4A00 +8A00 +9200 +ENDCHAR +STARTCHAR 8FAD +ENCODING 36781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1200 +F780 +F500 +6500 +FF80 +CA00 +FF00 +EA00 +CA00 +9200 +ENDCHAR +STARTCHAR 8FAF +ENCODING 36783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5900 +E780 +DB00 +DB00 +E780 +5A00 +FB80 +9A00 +9A00 +9A00 +ENDCHAR +STARTCHAR 8FB0 +ENCODING 36784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +40 +7F +40 +7F +6E +A6 +AB +F1 +ENDCHAR +STARTCHAR 8FB1 +ENCODING 36785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +BE00 +8000 +FF80 +BE00 +E300 +FF80 +2200 +0600 +ENDCHAR +STARTCHAR 8FB2 +ENCODING 36786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +14 +7F +7F +7F +FF +80 +BE +FF +BE +E3 +ENDCHAR +STARTCHAR 8FC2 +ENCODING 36802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +4400 +8400 +7F80 +0400 +C400 +4400 +4C00 +BF80 +ENDCHAR +STARTCHAR 8FC5 +ENCODING 36805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BE00 +4200 +8A00 +7E00 +0A00 +D200 +5280 +5100 +BF80 +ENDCHAR +STARTCHAR 8FCE +ENCODING 36814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8F00 +5500 +9500 +5500 +1500 +DD00 +7500 +4400 +BF80 +ENDCHAR +STARTCHAR 8FD1 +ENCODING 36817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +5E00 +9000 +5F00 +1200 +D200 +6200 +4200 +BF80 +ENDCHAR +STARTCHAR 8FD4 +ENCODING 36820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +5E00 +9000 +5F00 +1900 +D600 +5600 +7900 +BF80 +ENDCHAR +STARTCHAR 8FE6 +ENCODING 36838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5300 +3B00 +DB00 +1B00 +DB00 +6B00 +7B00 +C000 +BF80 +ENDCHAR +STARTCHAR 8FEA +ENCODING 36842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8400 +4400 +9F00 +6500 +1F00 +E500 +5F00 +6100 +BF80 +ENDCHAR +STARTCHAR 8FEB +ENCODING 36843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +9100 +5100 +1F00 +D100 +5100 +5F00 +C000 +BF80 +ENDCHAR +STARTCHAR 8FED +ENCODING 36845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5400 +1F00 +A400 +3F80 +CC00 +4A00 +5100 +E000 +BF80 +ENDCHAR +STARTCHAR 8FF0 +ENCODING 36848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +4900 +BF00 +5A00 +1A00 +DA00 +5A80 +6B00 +C000 +BF80 +ENDCHAR +STARTCHAR 8FF2 +ENCODING 36850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +9F00 +4400 +3F80 +C800 +5100 +7F00 +E080 +BF80 +ENDCHAR +STARTCHAR 8FF7 +ENCODING 36855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9500 +5500 +9600 +7F00 +0C00 +CE00 +5700 +6500 +C400 +BF80 +ENDCHAR +STARTCHAR 8FF9 +ENCODING 36857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F80 +9B00 +1B00 +EB00 +6A80 +5200 +D600 +BF80 +ENDCHAR +STARTCHAR 8FFD +ENCODING 36861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +1100 +DF00 +1000 +DF00 +5100 +5F00 +C000 +BF80 +ENDCHAR +STARTCHAR 9000 +ENCODING 36864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9F00 +5F00 +1500 +D600 +5F00 +7100 +BF80 +ENDCHAR +STARTCHAR 9001 +ENCODING 36865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9600 +5300 +BE80 +4400 +3F00 +CC00 +5A00 +6100 +BF80 +ENDCHAR +STARTCHAR 9002 +ENCODING 36866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8300 +5C00 +BF80 +4400 +1F00 +D100 +5F00 +5100 +BF80 +ENDCHAR +STARTCHAR 9003 +ENCODING 36867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8C00 +6D00 +1D00 +CC00 +1A00 +ED00 +4D00 +5300 +E000 +BF80 +ENDCHAR +STARTCHAR 9005 +ENCODING 36869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +5C00 +1000 +9F80 +1F00 +E900 +6900 +6F00 +C000 +BF80 +ENDCHAR +STARTCHAR 9006 +ENCODING 36870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9200 +4A00 +BF80 +5500 +1500 +DF00 +4400 +4800 +BF80 +ENDCHAR +STARTCHAR 9008 +ENCODING 36872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +2100 +EF00 +2B00 +EF00 +6B00 +6300 +C000 +BF80 +ENDCHAR +STARTCHAR 900B +ENCODING 36875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8500 +7F00 +0400 +BF00 +2500 +FF00 +7F00 +6500 +E700 +BF80 +ENDCHAR +STARTCHAR 900D +ENCODING 36877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8600 +5500 +2480 +FF00 +1F00 +D100 +5F00 +5100 +D300 +BF80 +ENDCHAR +STARTCHAR 900F +ENCODING 36879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +5C00 +BF00 +5700 +2000 +DE00 +4B00 +5100 +E300 +BF80 +ENDCHAR +STARTCHAR 9010 +ENCODING 36880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +4900 +9E00 +7C00 +2600 +DB00 +6280 +4C00 +BF80 +ENDCHAR +STARTCHAR 9011 +ENCODING 36881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8600 +4600 +BF00 +5500 +1600 +CA00 +5500 +6500 +C800 +BF80 +ENDCHAR +STARTCHAR 9014 +ENCODING 36884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8400 +5A00 +A100 +5E00 +3F00 +D600 +6500 +4C00 +BF80 +ENDCHAR +STARTCHAR 9015 +ENCODING 36885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +5500 +AA00 +5500 +0000 +DF00 +7F00 +4000 +BF80 +ENDCHAR +STARTCHAR 9017 +ENCODING 36887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +4000 +9F00 +5F00 +0000 +D200 +7F80 +4000 +BF80 +ENDCHAR +STARTCHAR 9019 +ENCODING 36889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +7F00 +8000 +5F00 +1F00 +DF00 +5F00 +5100 +BF80 +ENDCHAR +STARTCHAR 901A +ENCODING 36890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +4A00 +9F00 +6500 +1F00 +DF00 +6500 +6500 +BF80 +ENDCHAR +STARTCHAR 901D +ENCODING 36893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9100 +5700 +3C00 +9780 +1D00 +F500 +5500 +7500 +C800 +BF80 +ENDCHAR +STARTCHAR 901E +ENCODING 36894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9F00 +4000 +1F00 +DF00 +7F00 +4000 +BF80 +ENDCHAR +STARTCHAR 901F +ENCODING 36895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0400 +9F00 +1500 +DF00 +5600 +6580 +C400 +BF80 +ENDCHAR +STARTCHAR 9020 +ENCODING 36896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +5F00 +2400 +BF80 +0400 +DF00 +5100 +5F00 +D100 +BF80 +ENDCHAR +STARTCHAR 9021 +ENCODING 36897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5200 +3F80 +9700 +2800 +CE00 +5A00 +6C00 +D300 +BF80 +ENDCHAR +STARTCHAR 9022 +ENCODING 36898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5F00 +0A00 +F700 +0400 +DF00 +5F00 +5F00 +C400 +BF80 +ENDCHAR +STARTCHAR 9023 +ENCODING 36899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +9F00 +5500 +1F00 +DF00 +4400 +7F80 +C400 +BF80 +ENDCHAR +STARTCHAR 902E +ENCODING 36910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +3F80 +8500 +1F00 +D500 +4A00 +7500 +C800 +BF80 +ENDCHAR +STARTCHAR 9031 +ENCODING 36913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5500 +9F00 +5500 +1F00 +DF00 +6B00 +6300 +BF80 +ENDCHAR +STARTCHAR 9032 +ENCODING 36914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +5400 +1F00 +F400 +3F00 +DF00 +5400 +5F00 +C000 +BF80 +ENDCHAR +STARTCHAR 9035 +ENCODING 36917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +8400 +7F80 +0F00 +F400 +5F00 +7F80 +C000 +BF80 +ENDCHAR +STARTCHAR 9038 +ENCODING 36920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9000 +5E00 +2400 +BF00 +2500 +DF00 +4D00 +5480 +E700 +BF80 +ENDCHAR +STARTCHAR 903C +ENCODING 36924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +5F00 +9F00 +4000 +1F00 +DF00 +5F00 +4000 +BF80 +ENDCHAR +STARTCHAR 903E +ENCODING 36926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9C00 +5200 +AF00 +BB00 +3D00 +FD00 +6B00 +6B00 +BF80 +ENDCHAR +STARTCHAR 9041 +ENCODING 36929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +5E00 +9F80 +6F00 +2F00 +E900 +6F00 +4F00 +BF80 +ENDCHAR +STARTCHAR 9042 +ENCODING 36930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9E00 +7100 +BF00 +5B00 +2A00 +FE00 +7500 +4C00 +BF80 +ENDCHAR +STARTCHAR 9047 +ENCODING 36935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5F00 +9500 +5F00 +3F00 +E680 +7900 +6300 +BF80 +ENDCHAR +STARTCHAR 904A +ENCODING 36938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9400 +5780 +3C00 +E700 +1A00 +EF80 +6A00 +6E00 +F200 +BF80 +ENDCHAR +STARTCHAR 904B +ENCODING 36939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6480 +9F00 +5F00 +1F00 +DF00 +7F80 +4400 +BF80 +ENDCHAR +STARTCHAR 904D +ENCODING 36941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8300 +7E00 +3F00 +BF00 +2000 +FF00 +7F00 +7700 +D700 +BF80 +ENDCHAR +STARTCHAR 904E +ENCODING 36942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5100 +9700 +7F00 +2F00 +EB00 +6F00 +E100 +BF80 +ENDCHAR +STARTCHAR 9050 +ENCODING 36944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BB00 +6900 +AB00 +B800 +3F00 +E500 +7B00 +6300 +E480 +BF80 +ENDCHAR +STARTCHAR 9051 +ENCODING 36945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +1F00 +9F00 +0000 +3F00 +DF00 +7F80 +4000 +BF80 +ENDCHAR +STARTCHAR 9053 +ENCODING 36947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +0400 +DF00 +1F00 +D100 +5F00 +5F00 +C000 +BF80 +ENDCHAR +STARTCHAR 9054 +ENCODING 36948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +8400 +7F00 +3F00 +DF00 +4400 +7F00 +C400 +BF80 +ENDCHAR +STARTCHAR 9055 +ENCODING 36949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5F00 +3F00 +DF00 +1100 +CE00 +5F00 +5F80 +C400 +BF80 +ENDCHAR +STARTCHAR 9059 +ENCODING 36953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5F00 +3600 +8C00 +3F00 +FF80 +4400 +5F00 +C000 +BF80 +ENDCHAR +STARTCHAR 905C +ENCODING 36956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B900 +5700 +9500 +9B00 +3F00 +D700 +6A80 +4A00 +BF80 +ENDCHAR +STARTCHAR 905D +ENCODING 36957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6B00 +BF00 +5600 +2500 +D600 +6500 +4400 +BF80 +ENDCHAR +STARTCHAR 905E +ENCODING 36958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +7F00 +AF80 +7680 +2C00 +F700 +7680 +7B00 +BF80 +ENDCHAR +STARTCHAR 9060 +ENCODING 36960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +3F80 +C000 +1F00 +DF00 +5700 +6700 +C500 +BF80 +ENDCHAR +STARTCHAR 9061 +ENCODING 36961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AB00 +6B00 +3B00 +BB00 +3B00 +FB00 +5500 +5500 +E500 +BF80 +ENDCHAR +STARTCHAR 9063 +ENCODING 36963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +9F00 +7F80 +1F00 +DF00 +5F00 +5100 +DF00 +BF80 +ENDCHAR +STARTCHAR 9069 +ENCODING 36969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +0A00 +9F00 +2F00 +EF00 +6B00 +6F00 +E300 +BF80 +ENDCHAR +STARTCHAR 906D +ENCODING 36973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +1F00 +9F00 +1F00 +0000 +DF00 +5100 +5F00 +BF80 +ENDCHAR +STARTCHAR 906E +ENCODING 36974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +2A00 +BF00 +2A00 +EE00 +7700 +7680 +D480 +BF80 +ENDCHAR +STARTCHAR 906F +ENCODING 36975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B700 +6E00 +B580 +AF00 +3700 +EF00 +6A80 +5600 +BF80 +ENDCHAR +STARTCHAR 9072 +ENCODING 36978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5F00 +9D00 +7D00 +2C00 +EF00 +7F80 +4400 +BF80 +ENDCHAR +STARTCHAR 9075 +ENCODING 36981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9E00 +5F00 +BF80 +5B00 +1500 +FF00 +4200 +5600 +BF80 +ENDCHAR +STARTCHAR 9077 +ENCODING 36983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +7F00 +AB00 +BF00 +3F80 +FF00 +5700 +5F00 +BF80 +ENDCHAR +STARTCHAR 9078 +ENCODING 36984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BB00 +7B80 +BB00 +4A00 +3F00 +FF80 +4A00 +5100 +BF80 +ENDCHAR +STARTCHAR 907A +ENCODING 36986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +0E00 +DB00 +1F00 +DF00 +5F00 +4E00 +F300 +BF80 +ENDCHAR +STARTCHAR 907C +ENCODING 36988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2B00 +9F00 +3E80 +F200 +5E00 +6500 +CC00 +BF80 +ENDCHAR +STARTCHAR 907D +ENCODING 36989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8700 +4800 +3F00 +BF00 +3F00 +F600 +7F00 +5B00 +C480 +BF80 +ENDCHAR +STARTCHAR 907F +ENCODING 36991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BA00 +6F80 +2B00 +BB00 +2780 +FA00 +6F00 +5A00 +D200 +BF80 +ENDCHAR +STARTCHAR 9080 +ENCODING 36992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +7A00 +3B80 +BD00 +3F00 +DB00 +6B00 +7B00 +C480 +BF80 +ENDCHAR +STARTCHAR 9081 +ENCODING 36993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8A00 +7F80 +9F00 +5F00 +1F00 +BF00 +6700 +7900 +E100 +BF80 +ENDCHAR +STARTCHAR 9082 +ENCODING 36994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8700 +5A80 +3E80 +B900 +3A00 +FB00 +7F80 +6900 +E900 +BF80 +ENDCHAR +STARTCHAR 9083 +ENCODING 36995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +3300 +CA00 +3F00 +FA00 +6600 +5D00 +EC00 +BF80 +ENDCHAR +STARTCHAR 9084 +ENCODING 36996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7F00 +8000 +7F00 +1F00 +DF00 +5B00 +6500 +BF80 +ENDCHAR +STARTCHAR 9087 +ENCODING 36999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +5600 +BF80 +7900 +3B00 +F900 +7B00 +6700 +BF80 +ENDCHAR +STARTCHAR 9088 +ENCODING 37000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +B700 +AD00 +B700 +1500 +EF00 +5A00 +6D80 +D580 +BF80 +ENDCHAR +STARTCHAR 908A +ENCODING 37002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +5F00 +1F00 +9F00 +3F80 +D700 +7F00 +4900 +D300 +BF80 +ENDCHAR +STARTCHAR 908F +ENCODING 37007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7F00 +9500 +B780 +1500 +BF00 +BD00 +DF80 +BF80 +ENDCHAR +STARTCHAR 9091 +ENCODING 37009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +0000 +FF00 +8900 +FF00 +8000 +8080 +7F00 +ENDCHAR +STARTCHAR 9095 +ENCODING 37013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +9200 +4900 +7E00 +7E00 +0000 +FF00 +FF00 +8080 +FF00 +ENDCHAR +STARTCHAR 9099 +ENCODING 37017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2780 +2500 +F500 +8600 +8500 +8500 +8500 +F480 +0700 +0400 +ENDCHAR +STARTCHAR 90A2 +ENCODING 37026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +55 +55 +FD +55 +55 +57 +94 +94 +ENDCHAR +STARTCHAR 90A3 +ENCODING 37027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +55 +FD +56 +55 +FD +55 +97 +B4 +ENDCHAR +STARTCHAR 90A6 +ENCODING 37030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +27 +35 +E5 +26 +F5 +25 +F5 +45 +47 +84 +ENDCHAR +STARTCHAR 90A8 +ENCODING 37032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2780 +3500 +C500 +B500 +B500 +B500 +F480 +2480 +2F00 +3C00 +ENDCHAR +STARTCHAR 90AA +ENCODING 37034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +55 +55 +F6 +25 +55 +95 +97 +24 +ENDCHAR +STARTCHAR 90AF +ENCODING 37039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9700 +9500 +FD00 +9500 +9500 +F500 +9480 +9480 +F700 +9400 +ENDCHAR +STARTCHAR 90B0 +ENCODING 37040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4780 +5500 +5500 +FD00 +0D00 +0500 +F480 +9480 +F700 +9400 +ENDCHAR +STARTCHAR 90B1 +ENCODING 37041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +17 +E5 +85 +F5 +A5 +A5 +BF +C4 +04 +ENDCHAR +STARTCHAR 90B5 +ENCODING 37045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F780 +4D00 +5500 +B600 +0500 +F480 +9480 +F700 +9400 +ENDCHAR +STARTCHAR 90B8 +ENCODING 37048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5700 +A500 +A500 +FD00 +9500 +A480 +D700 +0C00 +F400 +ENDCHAR +STARTCHAR 90C1 +ENCODING 37057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4780 +4500 +FD00 +7500 +9500 +F500 +5480 +7480 +5700 +7400 +ENDCHAR +STARTCHAR 90CA +ENCODING 37066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +27 +FD +55 +96 +9E +65 +25 +55 +97 +84 +ENDCHAR +STARTCHAR 90DE +ENCODING 37086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2780 +F500 +9500 +F500 +9500 +F500 +D480 +A480 +F700 +CC00 +ENDCHAR +STARTCHAR 90E1 +ENCODING 37089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +55 +FD +F6 +45 +F5 +D5 +77 +54 +ENDCHAR +STARTCHAR 90E8 +ENCODING 37096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2780 +F500 +9500 +5500 +FD00 +0500 +F480 +9480 +F700 +9400 +ENDCHAR +STARTCHAR 90ED +ENCODING 37101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +27 +FD +F5 +F6 +05 +F5 +25 +FD +27 +44 +ENDCHAR +STARTCHAR 90F5 +ENCODING 37109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F80 +E500 +FD00 +B600 +FD00 +B480 +FC80 +7F00 +0400 +ENDCHAR +STARTCHAR 90FD +ENCODING 37117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F80 +F500 +3500 +FD00 +3500 +F500 +9480 +7480 +7700 +9400 +ENDCHAR +STARTCHAR 9102 +ENCODING 37122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +DF80 +DD00 +0500 +F500 +FD00 +4480 +7700 +9400 +3400 +ENDCHAR +STARTCHAR 9112 +ENCODING 37138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +BD00 +7D00 +9D00 +7C80 +AC80 +FD00 +4C00 +9400 +ENDCHAR +STARTCHAR 9115 +ENCODING 37141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B80 +9B00 +D700 +DB00 +7B00 +C280 +DA80 +5B00 +9600 +9A00 +ENDCHAR +STARTCHAR 9119 +ENCODING 37145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8D00 +FD00 +FD00 +FD00 +FC80 +FC80 +8F00 +FC00 +ENDCHAR +STARTCHAR 9127 +ENCODING 37159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F780 +DD00 +FD00 +8500 +F500 +F480 +5480 +5F00 +E400 +ENDCHAR +STARTCHAR 912D +ENCODING 37165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B300 +FD00 +FD00 +9D00 +FD00 +FC80 +FA80 +5500 +8C00 +ENDCHAR +STARTCHAR 9132 +ENCODING 37170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FD00 +0500 +FE00 +FD00 +FC80 +FC80 +2700 +2400 +ENDCHAR +STARTCHAR 9149 +ENCODING 37193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +18 +7F +A9 +AF +7F +81 +7F +81 +ENDCHAR +STARTCHAR 914A +ENCODING 37194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F780 +6200 +F200 +F200 +F200 +9200 +F200 +F200 +9600 +ENDCHAR +STARTCHAR 914B +ENCODING 37195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +4300 +FD80 +FF00 +6B00 +6F00 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR 914C +ENCODING 37196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F4 +64 +F7 +F9 +FD +B5 +93 +F1 +F1 +93 +ENDCHAR +STARTCHAR 914D +ENCODING 37197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +6100 +F100 +F700 +F800 +9800 +F880 +F880 +9700 +ENDCHAR +STARTCHAR 914E +ENCODING 37198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +6100 +F780 +F100 +F500 +F500 +9300 +F100 +F100 +9300 +ENDCHAR +STARTCHAR 9152 +ENCODING 37202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +4A00 +9F00 +6B00 +2B00 +6900 +5F00 +9F00 +A100 +ENDCHAR +STARTCHAR 9162 +ENCODING 37218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +6800 +FF80 +FC00 +FB00 +B400 +9300 +F400 +F400 +9400 +ENDCHAR +STARTCHAR 9169 +ENCODING 37225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F4 +67 +F9 +FD +F2 +BC +9F +F5 +F7 +95 +ENDCHAR +STARTCHAR 916A +ENCODING 37226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +6700 +F500 +FE00 +F300 +B580 +9F00 +F900 +FF00 +9900 +ENDCHAR +STARTCHAR 916C +ENCODING 37228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FB +6B +FB +D7 +B7 +BB +9B +FB +FB +91 +ENDCHAR +STARTCHAR 9175 +ENCODING 37237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +4E80 +F500 +BF80 +B200 +BE00 +FF80 +9200 +F200 +9600 +ENDCHAR +STARTCHAR 9177 +ENCODING 37239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +6A00 +FF00 +FA00 +FF80 +B200 +9F00 +F900 +FF00 +8900 +ENDCHAR +STARTCHAR 9178 +ENCODING 37240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +6500 +FF00 +B680 +BF80 +BC00 +9F00 +F500 +F600 +8980 +ENDCHAR +STARTCHAR 9187 +ENCODING 37255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +6000 +FF00 +FF00 +F000 +BF80 +9100 +FF80 +F200 +9600 +ENDCHAR +STARTCHAR 9189 +ENCODING 37257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +6F00 +F500 +D700 +BE80 +B200 +9F80 +F200 +F200 +9200 +ENDCHAR +STARTCHAR 918B +ENCODING 37259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +6F80 +F500 +FF80 +F000 +BF00 +9900 +FF00 +FF00 +9900 +ENDCHAR +STARTCHAR 918D +ENCODING 37261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +6F00 +FF00 +D000 +FF80 +9A00 +FB00 +FE00 +9B80 +ENDCHAR +STARTCHAR 9192 +ENCODING 37266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +6F00 +FF00 +F000 +BA00 +9F80 +FF00 +F200 +9F80 +ENDCHAR +STARTCHAR 919C +ENCODING 37276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +6F00 +FB00 +DF00 +DB00 +BF00 +9700 +F780 +FA80 +9300 +ENDCHAR +STARTCHAR 91AB +ENCODING 37291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E780 +A800 +D700 +FF00 +FF80 +7F00 +A700 +7F00 +7F00 +ENDCHAR +STARTCHAR 91AC +ENCODING 37292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +AC00 +FF00 +3D00 +FF80 +AB00 +FF80 +FF00 +A700 +FF00 +FF00 +ENDCHAR +STARTCHAR 91AE +ENCODING 37294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F600 +6F80 +FA00 +DF00 +BA00 +BF00 +9A00 +FF80 +FE80 +9D80 +ENDCHAR +STARTCHAR 91AF +ENCODING 37295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +4F00 +EF00 +A100 +AD80 +AD80 +9F00 +EF00 +EF00 +8F80 +ENDCHAR +STARTCHAR 91B1 +ENCODING 37297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +ED00 +5680 +E900 +DF80 +A580 +AF80 +EB00 +E700 +AA80 +ENDCHAR +STARTCHAR 91B4 +ENCODING 37300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F600 +4F00 +EF00 +AF00 +A000 +AF80 +9F00 +EF00 +E500 +9F80 +ENDCHAR +STARTCHAR 91B5 +ENCODING 37301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E700 +4400 +EF00 +EF00 +E800 +AF00 +B200 +F700 +F680 +9E00 +ENDCHAR +STARTCHAR 91C0 +ENCODING 37312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EF80 +4000 +EF00 +AF00 +AF80 +AF00 +A500 +EF80 +FF00 +AC80 +ENDCHAR +STARTCHAR 91C7 +ENCODING 37319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7E00 +4900 +8800 +0800 +FF00 +1A00 +6980 +8800 +ENDCHAR +STARTCHAR 91C9 +ENCODING 37321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +D4 +EF +CD +ED +6F +6D +CD +4F +49 +ENDCHAR +STARTCHAR 91CB +ENCODING 37323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3F00 +D680 +FF00 +EF00 +5F80 +FF80 +E400 +DF00 +4400 +ENDCHAR +STARTCHAR 91CC +ENCODING 37324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4900 +7E00 +4900 +7E00 +0800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR 91CD +ENCODING 37325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1600 +6800 +FF00 +7F00 +4900 +7F00 +7F00 +FF00 +0800 +FF80 +ENDCHAR +STARTCHAR 91CE +ENCODING 37326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +D100 +F600 +D200 +FF80 +F280 +4300 +3200 +C600 +ENDCHAR +STARTCHAR 91CF +ENCODING 37327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF00 +7E00 +7E00 +7E00 +FF00 +FF80 +ENDCHAR +STARTCHAR 91D0 +ENCODING 37328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F780 +FE00 +DD80 +FF80 +BF00 +BF00 +BF00 +BF00 +FF80 +ENDCHAR +STARTCHAR 91D1 +ENCODING 37329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +4300 +BF80 +0800 +7F00 +4A00 +2C00 +FF80 +ENDCHAR +STARTCHAR 91D7 +ENCODING 37335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +65 +95 +FD +25 +FD +B5 +B5 +39 +C3 +ENDCHAR +STARTCHAR 91D8 +ENCODING 37336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6F80 +E200 +F200 +4200 +F200 +D200 +D200 +3200 +C600 +ENDCHAR +STARTCHAR 91DC +ENCODING 37340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2600 +E500 +1800 +6600 +FD80 +0800 +7F00 +2C00 +FF00 +ENDCHAR +STARTCHAR 91DD +ENCODING 37341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6200 +6200 +9200 +EF80 +4200 +F200 +D200 +D200 +3200 +C200 +ENDCHAR +STARTCHAR 91E3 +ENCODING 37347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +E4 +9F +E9 +55 +F5 +D3 +E1 +71 +C7 +ENDCHAR +STARTCHAR 91E7 +ENCODING 37351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +49 +6B +9B +EB +FB +4B +DB +FB +6B +91 +ENDCHAR +STARTCHAR 91EA +ENCODING 37354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6F00 +9200 +E200 +4200 +FF80 +D200 +E200 +7200 +C600 +ENDCHAR +STARTCHAR 91F5 +ENCODING 37365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6F00 +6900 +9D00 +EB00 +F500 +4600 +D600 +E600 +7D00 +D080 +ENDCHAR +STARTCHAR 920D +ENCODING 37389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6700 +BE00 +ED00 +4D00 +ED00 +EF00 +EC00 +6480 +C700 +ENDCHAR +STARTCHAR 9210 +ENCODING 37392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4600 +A600 +9900 +F680 +E000 +DF00 +E100 +7200 +C200 +ENDCHAR +STARTCHAR 9211 +ENCODING 37393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F80 +A800 +E800 +4F00 +ED00 +EB00 +F200 +7500 +D880 +ENDCHAR +STARTCHAR 9212 +ENCODING 37394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5E00 +AA00 +EA00 +4B00 +ED00 +ED00 +F200 +7500 +D880 +ENDCHAR +STARTCHAR 9217 +ENCODING 37399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AA00 +A900 +FF00 +4A00 +EA00 +EA00 +EA00 +7280 +D300 +ENDCHAR +STARTCHAR 921E +ENCODING 37406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +68 +AF +99 +E9 +4F +F1 +DF +E1 +31 +C3 +ENDCHAR +STARTCHAR 9234 +ENCODING 37428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +6600 +9900 +EF80 +4000 +FF00 +D500 +E500 +7500 +C400 +ENDCHAR +STARTCHAR 923A +ENCODING 37434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +E200 +9200 +E200 +FF00 +D300 +E300 +F200 +CF80 +ENDCHAR +STARTCHAR 923F +ENCODING 37439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +B5 +F5 +55 +EF +F5 +F5 +6F +D1 +ENDCHAR +STARTCHAR 9240 +ENCODING 37440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +AB +93 +EF +EB +EF +EA +E2 +C2 +ENDCHAR +STARTCHAR 9245 +ENCODING 37445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F80 +A800 +E800 +4F00 +E900 +EF00 +E800 +7F80 +C800 +ENDCHAR +STARTCHAR 9249 +ENCODING 37449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6200 +BF80 +E400 +4500 +FA00 +E700 +E500 +7B00 +DC80 +ENDCHAR +STARTCHAR 9257 +ENCODING 37463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +6900 +9F80 +E900 +4900 +FF00 +D900 +E900 +7F00 +C900 +ENDCHAR +STARTCHAR 925B +ENCODING 37467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4E00 +AA00 +9A80 +F180 +E000 +EF00 +E900 +6F00 +C900 +ENDCHAR +STARTCHAR 925E +ENCODING 37470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4300 +A300 +9F80 +EA00 +EB00 +EB00 +EE00 +7E80 +C500 +ENDCHAR +STARTCHAR 9262 +ENCODING 37474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +A4 +AF +E4 +46 +ED +F5 +FF +64 +C4 +ENDCHAR +STARTCHAR 9264 +ENCODING 37476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +6F +99 +F1 +4F +FB +DF +EB +71 +C3 +ENDCHAR +STARTCHAR 9265 +ENCODING 37477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +A500 +9F00 +E400 +4D00 +ED00 +ED00 +ED80 +7500 +C400 +ENDCHAR +STARTCHAR 9266 +ENCODING 37478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F80 +9200 +8200 +E200 +EB00 +EA00 +EA00 +EA00 +DF80 +ENDCHAR +STARTCHAR 9280 +ENCODING 37504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +A900 +AF00 +E900 +EF00 +ED00 +EB00 +6F00 +D980 +ENDCHAR +STARTCHAR 9283 +ENCODING 37507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +A500 +EB00 +5C80 +E000 +EA00 +EA00 +6A80 +D300 +ENDCHAR +STARTCHAR 9285 +ENCODING 37509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +B1 +F7 +51 +F7 +F7 +FB +71 +D3 +ENDCHAR +STARTCHAR 9291 +ENCODING 37521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +6A00 +AF00 +F200 +E200 +5F80 +EA00 +EA00 +6A80 +D380 +ENDCHAR +STARTCHAR 9293 +ENCODING 37523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4C00 +A600 +AA00 +E900 +FF80 +E400 +EF00 +E400 +DF80 +ENDCHAR +STARTCHAR 9296 +ENCODING 37526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6A00 +9F00 +EA00 +4F80 +E600 +EA00 +EB00 +7280 +C200 +ENDCHAR +STARTCHAR 9298 +ENCODING 37528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +A7 +A9 +F6 +42 +EC +DF +E9 +6F +C9 +ENDCHAR +STARTCHAR 929C +ENCODING 37532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +DB80 +A400 +7F80 +4900 +BD00 +AD00 +6D00 +4D00 +7300 +ENDCHAR +STARTCHAR 92B3 +ENCODING 37555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4600 +A900 +E900 +5F80 +E900 +EF00 +EA00 +6A80 +D300 +ENDCHAR +STARTCHAR 92B6 +ENCODING 37558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +A500 +AF80 +F480 +4B00 +E600 +ED00 +F500 +6480 +CC00 +ENDCHAR +STARTCHAR 92B7 +ENCODING 37559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +AD00 +B480 +EF00 +4900 +EF00 +E900 +EF00 +6900 +CB00 +ENDCHAR +STARTCHAR 92B9 +ENCODING 37561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4300 +AC00 +BF80 +F280 +E000 +EE00 +E700 +6900 +D300 +ENDCHAR +STARTCHAR 92CC +ENCODING 37580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5900 +AE00 +F100 +5F80 +E900 +F900 +EB00 +7800 +9780 +ENDCHAR +STARTCHAR 92CF +ENCODING 37583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +A400 +ED00 +4D00 +F500 +E680 +EA00 +7900 +D080 +ENDCHAR +STARTCHAR 92D2 +ENCODING 37586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +B600 +E600 +5B80 +EF00 +EF00 +FF80 +6200 +C200 +ENDCHAR +STARTCHAR 92E4 +ENCODING 37604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5A +B6 +B7 +DB +57 +FB +F7 +FF +75 +87 +ENDCHAR +STARTCHAR 92EA +ENCODING 37610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +BF80 +A400 +FF00 +5500 +FF00 +F500 +FF00 +7500 +D500 +ENDCHAR +STARTCHAR 92F8 +ENCODING 37624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +B080 +EF00 +5200 +EF80 +EF00 +F880 +7F00 +D880 +ENDCHAR +STARTCHAR 92FC +ENCODING 37628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +BB +B7 +FF +FF +FF +FF +7B +93 +ENDCHAR +STARTCHAR 9304 +ENCODING 37636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +AE00 +E200 +4F80 +EB00 +EB00 +E500 +7A80 +C400 +ENDCHAR +STARTCHAR 9310 +ENCODING 37648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +AA00 +9F80 +FA00 +5F00 +EA00 +EF00 +EA00 +6F80 +C800 +ENDCHAR +STARTCHAR 9318 +ENCODING 37656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4300 +AC00 +9F80 +EB00 +FF80 +EB00 +EF80 +E200 +DF80 +ENDCHAR +STARTCHAR 931A +ENCODING 37658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +6F00 +AA80 +FF00 +4500 +FF80 +ED00 +E700 +6400 +CC00 +ENDCHAR +STARTCHAR 931E +ENCODING 37662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +6000 +AF00 +E900 +4F00 +EF00 +E200 +FF80 +6400 +CC00 +ENDCHAR +STARTCHAR 931F +ENCODING 37663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6C80 +AF00 +ED00 +4880 +E480 +ED00 +F600 +6900 +D080 +ENDCHAR +STARTCHAR 9320 +ENCODING 37664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F00 +9080 +EF00 +4200 +EA00 +EB00 +EA00 +7400 +D380 +ENDCHAR +STARTCHAR 9321 +ENCODING 37665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6F80 +9600 +E980 +5F80 +E100 +EF00 +EF00 +6900 +C300 +ENDCHAR +STARTCHAR 9322 +ENCODING 37666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +A900 +BE00 +E680 +4B00 +EA00 +DF80 +E500 +6680 +D900 +ENDCHAR +STARTCHAR 9324 +ENCODING 37668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +6F80 +A900 +EF00 +4900 +EF00 +E900 +FF80 +6900 +D080 +ENDCHAR +STARTCHAR 9326 +ENCODING 37670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F00 +9900 +EF00 +4F00 +EF80 +EC80 +EC80 +6D80 +CC00 +ENDCHAR +STARTCHAR 9328 +ENCODING 37672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +BF80 +A900 +EF00 +F500 +F500 +EF00 +6F00 +D100 +ENDCHAR +STARTCHAR 932B +ENCODING 37675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +A9 +EF +4F +E8 +EF +F7 +6B +D7 +ENDCHAR +STARTCHAR 932E +ENCODING 37678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +B5 +EF +D5 +F7 +F7 +F7 +6F +D1 +ENDCHAR +STARTCHAR 932F +ENCODING 37679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +BF00 +A900 +FF80 +4000 +EF00 +E900 +EF00 +6F00 +C900 +ENDCHAR +STARTCHAR 9348 +ENCODING 37704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +BF80 +AD00 +EF00 +4D00 +ED00 +FF80 +E600 +6900 +D080 +ENDCHAR +STARTCHAR 934A +ENCODING 37706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +A400 +EF00 +5D00 +EF00 +E600 +ED00 +7480 +C400 +ENDCHAR +STARTCHAR 934B +ENCODING 37707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +4F +A9 +EF +4D +FF +F7 +F7 +7B +D1 +ENDCHAR +STARTCHAR 934D +ENCODING 37709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +B500 +FF80 +5700 +F000 +FF00 +F500 +7700 +A980 +ENDCHAR +STARTCHAR 9354 +ENCODING 37716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +B680 +AF00 +EF00 +E000 +DF80 +EF00 +F900 +C300 +ENDCHAR +STARTCHAR 935B +ENCODING 37723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +B500 +9580 +DD80 +5000 +FF00 +FB00 +D300 +7300 +9480 +ENDCHAR +STARTCHAR 936E +ENCODING 37742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4E00 +AB00 +FE80 +5E80 +F700 +FD00 +FF00 +7700 +9D80 +ENDCHAR +STARTCHAR 9375 +ENCODING 37749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +D700 +B300 +DF80 +5F00 +EF00 +EA00 +F700 +7A00 +EF80 +ENDCHAR +STARTCHAR 937C +ENCODING 37756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4300 +A280 +BF80 +FE00 +5280 +FF00 +FD00 +FD00 +5380 +F580 +ENDCHAR +STARTCHAR 937E +ENCODING 37758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4300 +AC00 +1F80 +EF00 +EF00 +F500 +EF00 +6F00 +DF80 +ENDCHAR +STARTCHAR 938C +ENCODING 37772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DE00 +BF80 +FF00 +5F80 +EB00 +FF00 +EB00 +DA80 +0A00 +ENDCHAR +STARTCHAR 9394 +ENCODING 37780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +B680 +E900 +5680 +E900 +FF80 +E900 +6F00 +C900 +ENDCHAR +STARTCHAR 9396 +ENCODING 37782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5480 +AD00 +9D00 +EF00 +4F00 +E900 +EF00 +EF00 +6B00 +D080 +ENDCHAR +STARTCHAR 939A +ENCODING 37786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +AF00 +A500 +F700 +4400 +FF00 +ED00 +EF00 +7800 +D780 +ENDCHAR +STARTCHAR 93A3 +ENCODING 37795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B680 +DB00 +6700 +9D00 +FF00 +9900 +7E00 +FF80 +2A00 +FF00 +ENDCHAR +STARTCHAR 93A7 +ENCODING 37799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5480 +B480 +AF00 +FF80 +4000 +EF00 +EF00 +E000 +6900 +DF80 +ENDCHAR +STARTCHAR 93AC +ENCODING 37804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +A000 +AF00 +EF00 +4000 +FF00 +F680 +F680 +7680 +D100 +ENDCHAR +STARTCHAR 93AD +ENCODING 37805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +AE80 +AF00 +F700 +5700 +F700 +F700 +FF80 +6A00 +D180 +ENDCHAR +STARTCHAR 93B0 +ENCODING 37808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4E00 +B100 +BE80 +EE00 +E900 +F100 +FF80 +EF00 +9F80 +ENDCHAR +STARTCHAR 93C3 +ENCODING 37827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5200 +D380 +BE00 +D600 +5B00 +FD00 +FF80 +DB00 +5B00 +FC80 +ENDCHAR +STARTCHAR 93D1 +ENCODING 37841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +A900 +FF00 +5480 +FE80 +F680 +F680 +7A80 +9100 +ENDCHAR +STARTCHAR 93DE +ENCODING 37854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +BF00 +FF80 +5F00 +FF00 +FA80 +FF00 +6A80 +AB00 +ENDCHAR +STARTCHAR 93E1 +ENCODING 37857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +9F80 +E000 +4F00 +EF00 +E900 +EF00 +6A80 +F380 +ENDCHAR +STARTCHAR 93E4 +ENCODING 37860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +BF80 +EF00 +5F00 +F500 +FF80 +EA00 +6600 +DD00 +ENDCHAR +STARTCHAR 93F6 +ENCODING 37878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +AF00 +BF00 +F300 +4C00 +EF00 +FF80 +E600 +6D00 +D480 +ENDCHAR +STARTCHAR 9404 +ENCODING 37892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +BF80 +AE00 +FF80 +4400 +FF00 +FF00 +FF00 +6B00 +9080 +ENDCHAR +STARTCHAR 9418 +ENCODING 37912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +BF80 +E000 +4F00 +EF00 +F500 +FF00 +6400 +DF80 +ENDCHAR +STARTCHAR 9425 +ENCODING 37925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +7F00 +9F00 +FF80 +4D00 +FF80 +E000 +EF00 +6F00 +C900 +ENDCHAR +STARTCHAR 942B +ENCODING 37931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +6F00 +BF00 +FB00 +4E00 +EF00 +ED80 +F680 +7680 +D180 +ENDCHAR +STARTCHAR 9435 +ENCODING 37941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B00 +DF00 +BF80 +C200 +5F00 +E300 +FF00 +DD00 +7E80 +8500 +ENDCHAR +STARTCHAR 9438 +ENCODING 37944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +B680 +FF00 +4F00 +FF80 +FB80 +FC00 +7F00 +C400 +ENDCHAR +STARTCHAR 9444 +ENCODING 37956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +A000 +FF80 +4400 +EA00 +FF80 +FB80 +7700 +9B00 +ENDCHAR +STARTCHAR 9451 +ENCODING 37969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5D00 +BA00 +BF80 +FE00 +5B80 +FC00 +EF00 +F700 +7700 +9F80 +ENDCHAR +STARTCHAR 9452 +ENCODING 37970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +AF00 +FF00 +FF00 +AE80 +F700 +BD00 +FF00 +2A00 +FF00 +ENDCHAR +STARTCHAR 945B +ENCODING 37979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +BF80 +D600 +5F80 +FF00 +FB00 +FF00 +6F00 +E980 +ENDCHAR +STARTCHAR 947D +ENCODING 38013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DB00 +BB80 +DF80 +5A00 +FF00 +F100 +FF00 +6000 +9980 +ENDCHAR +STARTCHAR 947F +ENCODING 38015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F680 +FD80 +F800 +F700 +B600 +B500 +6E80 +9980 +FF00 +7E00 +ENDCHAR +STARTCHAR 9577 +ENCODING 38263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7E +FF +4A +4C +5E +E1 +ENDCHAR +STARTCHAR 9580 +ENCODING 38272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +99 +FF +81 +81 +81 +81 +83 +ENDCHAR +STARTCHAR 9583 +ENCODING 38275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +89 +99 +B5 +A3 +83 +ENDCHAR +STARTCHAR 9589 +ENCODING 38281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +89 +FF +99 +F9 +8B +ENDCHAR +STARTCHAR 958B +ENCODING 38283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +BF +95 +FF +A5 +A7 +ENDCHAR +STARTCHAR 958F +ENCODING 38287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +BF +89 +BD +FF +83 +ENDCHAR +STARTCHAR 9591 +ENCODING 38289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +89 +FF +B5 +CB +8B +ENDCHAR +STARTCHAR 9592 +ENCODING 38290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +BD +BD +BD +A5 +AF +ENDCHAR +STARTCHAR 9593 +ENCODING 38291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +99 +FF +BD +A5 +BD +BD +83 +ENDCHAR +STARTCHAR 9594 +ENCODING 38292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +FF +95 +99 +A7 +83 +ENDCHAR +STARTCHAR 9598 +ENCODING 38296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +BD +BD +AB +BD +8B +ENDCHAR +STARTCHAR 95A3 +ENCODING 38307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +F7 +99 +F7 +9D +B9 +FF +BD +A7 +ENDCHAR +STARTCHAR 95A4 +ENCODING 38308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +9D +FF +BD +BD +A3 +ENDCHAR +STARTCHAR 95A5 +ENCODING 38309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +99 +F7 +AB +FD +AF +B7 +A3 +ENDCHAR +STARTCHAR 95A8 +ENCODING 38312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +89 +FF +81 +BD +FF +83 +ENDCHAR +STARTCHAR 95AD +ENCODING 38317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +81 +BD +BD +BD +BD +81 +ENDCHAR +STARTCHAR 95B1 +ENCODING 38321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +9D +A7 +FF +BF +9F +E3 +ENDCHAR +STARTCHAR 95BB +ENCODING 38331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +9D +ED +BF +A3 +BF +A3 +ENDCHAR +STARTCHAR 95BC +ENCODING 38332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +A5 +FB +BD +D3 +DF +F3 +ENDCHAR +STARTCHAR 95C7 +ENCODING 38343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +BF +FF +81 +BD +BD +A5 +ENDCHAR +STARTCHAR 95CA +ENCODING 38346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +E7 +99 +DF +BF +DF +93 +ENDCHAR +STARTCHAR 95D4 +ENCODING 38356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +BD +FF +BF +BF +FF +83 +ENDCHAR +STARTCHAR 95D5 +ENCODING 38357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +D5 +F7 +FF +F5 +AB +83 +ENDCHAR +STARTCHAR 95D6 +ENCODING 38358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +BD +BD +BD +BF +EB +C7 +ENDCHAR +STARTCHAR 95DC +ENCODING 38364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +E7 +B7 +FF +DB +F7 +AB +ENDCHAR +STARTCHAR 95E1 +ENCODING 38369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +99 +F7 +DB +A5 +BF +BD +FF +89 +ENDCHAR +STARTCHAR 95E2 +ENCODING 38370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +F5 +DF +FF +DF +B5 +83 +ENDCHAR +STARTCHAR 961C +ENCODING 38428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +7F00 +4100 +7F00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 9621 +ENCODING 38433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E300 +BC00 +C400 +C400 +BF80 +A400 +E400 +8400 +8400 +ENDCHAR +STARTCHAR 962A +ENCODING 38442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +B000 +DF00 +D900 +B500 +B600 +F600 +9D00 +A880 +ENDCHAR +STARTCHAR 962E +ENCODING 38446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A000 +C000 +DF00 +AA00 +AA00 +EA00 +9280 +A300 +ENDCHAR +STARTCHAR 9632 +ENCODING 38450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +BF80 +C800 +AF00 +A900 +9900 +E900 +9100 +9300 +ENDCHAR +STARTCHAR 963B +ENCODING 38459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +A900 +A900 +CF00 +A900 +AF00 +E900 +8900 +9F80 +ENDCHAR +STARTCHAR 963F +ENCODING 38463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A100 +CD00 +D500 +B500 +AD00 +F500 +8100 +8300 +ENDCHAR +STARTCHAR 9640 +ENCODING 38464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +B080 +D880 +AB00 +AE00 +A800 +E800 +8880 +8F00 +ENDCHAR +STARTCHAR 9642 +ENCODING 38466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +B480 +D400 +DF00 +B500 +B600 +F600 +AD00 +A880 +ENDCHAR +STARTCHAR 9644 +ENCODING 38468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +A900 +C900 +D780 +D500 +B500 +B300 +F100 +9100 +9300 +ENDCHAR +STARTCHAR 964B +ENCODING 38475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A200 +DF00 +DB00 +BF00 +B900 +D900 +9F80 +9000 +ENDCHAR +STARTCHAR 964C +ENCODING 38476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A400 +AF00 +D100 +B100 +AF00 +F100 +8F00 +9100 +ENDCHAR +STARTCHAR 964D +ENCODING 38477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +AF00 +DA00 +CE00 +D580 +BF00 +B400 +F380 +9C00 +8400 +ENDCHAR +STARTCHAR 9650 +ENCODING 38480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +B100 +DF00 +D100 +BF00 +B700 +F200 +9F00 +B880 +ENDCHAR +STARTCHAR 965B +ENCODING 38491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +B300 +DF00 +D280 +DF00 +A400 +A400 +FF00 +8400 +BF80 +ENDCHAR +STARTCHAR 965C +ENCODING 38492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +A400 +BF80 +C500 +D500 +BD00 +A680 +CA00 +9100 +A080 +ENDCHAR +STARTCHAR 965D +ENCODING 38493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +C400 +D700 +D500 +BD00 +EA80 +8A00 +9100 +A080 +ENDCHAR +STARTCHAR 965E +ENCODING 38494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +BA00 +DF80 +CA00 +B200 +B600 +C400 +9F00 +8400 +BF80 +ENDCHAR +STARTCHAR 965F +ENCODING 38495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +AA00 +CB00 +CA00 +DF80 +AA80 +B300 +F600 +8C00 +9000 +ENDCHAR +STARTCHAR 9662 +ENCODING 38498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +D080 +CE00 +C000 +BF00 +AA00 +EA00 +9280 +A300 +ENDCHAR +STARTCHAR 9663 +ENCODING 38499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +C400 +DF00 +BF00 +B500 +BF00 +FF80 +8400 +8400 +ENDCHAR +STARTCHAR 9664 +ENCODING 38500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AA00 +C900 +DE80 +C400 +BF00 +A500 +F500 +9480 +8C00 +ENDCHAR +STARTCHAR 966A +ENCODING 38506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +C900 +CA00 +BF80 +A000 +AF00 +F100 +8F00 +9100 +ENDCHAR +STARTCHAR 9670 +ENCODING 38512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E400 +AB00 +DF80 +DE00 +BF00 +A000 +FF00 +8900 +9F00 +ENDCHAR +STARTCHAR 9673 +ENCODING 38515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +C400 +DF00 +DF00 +B500 +BF00 +EE00 +9580 +8400 +ENDCHAR +STARTCHAR 9675 +ENCODING 38517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +C400 +DF80 +CB00 +B800 +DF00 +AA00 +8E00 +B180 +ENDCHAR +STARTCHAR 9676 +ENCODING 38518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E8 +BF +D9 +EF +D5 +BF +B7 +DF +93 +83 +ENDCHAR +STARTCHAR 9677 +ENCODING 38519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E8 +AF +A9 +D3 +BC +BB +B1 +FF +9F +91 +ENDCHAR +STARTCHAR 9678 +ENCODING 38520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +C400 +DF80 +AA80 +B300 +E400 +9F00 +8400 +BF80 +ENDCHAR +STARTCHAR 967D +ENCODING 38525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +BF00 +DF00 +A000 +BF80 +FF00 +AA80 +9500 +8B00 +ENDCHAR +STARTCHAR 9685 +ENCODING 38533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +B5 +DF +DF +A4 +BF +F7 +9D +91 +ENDCHAR +STARTCHAR 9686 +ENCODING 38534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +AF00 +D600 +D980 +AE00 +B400 +DF00 +BF00 +8400 +BF80 +ENDCHAR +STARTCHAR 968A +ENCODING 38538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +B100 +FF80 +DA80 +EB00 +BE00 +DD00 +A480 +8C00 +ENDCHAR +STARTCHAR 968B +ENCODING 38539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +BF80 +DF00 +EF00 +C000 +AF00 +AF00 +EF00 +9100 +9300 +ENDCHAR +STARTCHAR 968D +ENCODING 38541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +B100 +DF00 +DF00 +A000 +BF00 +FF00 +8400 +BF80 +ENDCHAR +STARTCHAR 968E +ENCODING 38542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +BB00 +D380 +DB00 +D400 +BF00 +B100 +DF00 +9100 +9F00 +ENDCHAR +STARTCHAR 9694 +ENCODING 38548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +AF00 +CF00 +C000 +BF00 +B700 +FE80 +9480 +9500 +ENDCHAR +STARTCHAR 9695 +ENCODING 38549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +AF00 +C000 +DF00 +BF00 +BF00 +FF00 +8A00 +9180 +ENDCHAR +STARTCHAR 9698 +ENCODING 38552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +B100 +EE80 +CE00 +B100 +BF80 +FB00 +9B00 +BF80 +ENDCHAR +STARTCHAR 9699 +ENCODING 38553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +BD00 +E480 +DF00 +DF00 +B100 +BF00 +D500 +A480 +8C00 +ENDCHAR +STARTCHAR 969B +ENCODING 38555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F000 +BD00 +DB00 +F900 +DF80 +A000 +BF00 +D500 +9480 +AC00 +ENDCHAR +STARTCHAR 969C +ENCODING 38556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +DF80 +C000 +DF00 +BF00 +BF00 +FF80 +8400 +8400 +ENDCHAR +STARTCHAR 96A3 +ENCODING 38563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +AD00 +DF80 +CE00 +B580 +BD00 +DB80 +8F80 +9100 +A100 +ENDCHAR +STARTCHAR 96A7 +ENCODING 38567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F700 +A900 +EF00 +D680 +CD00 +B700 +DB00 +9680 +AF80 +ENDCHAR +STARTCHAR 96A8 +ENCODING 38568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF80 +CA00 +D780 +A700 +B700 +D700 +9500 +9800 +AF80 +ENDCHAR +STARTCHAR 96AA +ENCODING 38570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EC00 +AA00 +DF00 +E080 +DB00 +BB00 +A000 +EA00 +9B00 +A580 +ENDCHAR +STARTCHAR 96B1 +ENCODING 38577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +B500 +DF00 +DF80 +BF00 +DF00 +8000 +9D00 +AE80 +ENDCHAR +STARTCHAR 96B7 +ENCODING 38583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +4300 +FF80 +EF00 +0A80 +FB00 +E500 +DB00 +4480 +ENDCHAR +STARTCHAR 96BB +ENCODING 38587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +7F +C8 +FF +78 +7F +00 +FE +18 +E7 +ENDCHAR +STARTCHAR 96C0 +ENCODING 38592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +CB00 +9480 +1800 +6800 +FF00 +7F00 +7F00 +7F00 +4000 +ENDCHAR +STARTCHAR 96C1 +ENCODING 38593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +AA00 +AF00 +BA00 +FF00 +AA00 +AF00 +AF80 +2800 +ENDCHAR +STARTCHAR 96C4 +ENCODING 38596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +4A00 +FF80 +5A00 +7F00 +AA00 +CF00 +DA00 +FA00 +1F80 +ENDCHAR +STARTCHAR 96C5 +ENCODING 38597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +AA00 +AF80 +BA00 +FF00 +2A00 +6F00 +AA00 +AF80 +6800 +ENDCHAR +STARTCHAR 96C6 +ENCODING 38598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +7F00 +FF00 +C800 +7F00 +7F00 +FF00 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR 96C7 +ENCODING 38599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +81 +FF +BF +E4 +FF +BC +BF +ENDCHAR +STARTCHAR 96C9 +ENCODING 38601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +8A00 +EF80 +DA00 +FF00 +4A00 +6F00 +6A00 +9F80 +8800 +ENDCHAR +STARTCHAR 96CB +ENCODING 38603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +7F +C8 +FE +78 +7F +00 +E7 +BD +83 +ENDCHAR +STARTCHAR 96CC +ENCODING 38604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +5500 +D780 +FE00 +DF00 +DE00 +D700 +EE00 +9F80 +0400 +ENDCHAR +STARTCHAR 96CD +ENCODING 38605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +4800 +EF00 +6A00 +5F00 +EB00 +2E00 +4F80 +8800 +ENDCHAR +STARTCHAR 96CE +ENCODING 38606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0A00 +EA00 +AF80 +FA00 +BF00 +AA00 +EF00 +AA00 +BF80 +C800 +ENDCHAR +STARTCHAR 96D5 +ENCODING 38613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +B500 +FF80 +BA00 +F700 +9600 +F700 +F600 +9780 +B400 +ENDCHAR +STARTCHAR 96D6 +ENCODING 38614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E500 +9A00 +EF80 +4A00 +FF00 +DA00 +FF00 +5A00 +7F80 +D800 +ENDCHAR +STARTCHAR 96D9 +ENCODING 38617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6500 +F780 +FF00 +B900 +E600 +F780 +FE00 +2400 +1800 +E780 +ENDCHAR +STARTCHAR 96DB +ENCODING 38619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F500 +F780 +FA00 +7700 +8600 +F700 +F600 +F780 +B400 +ENDCHAR +STARTCHAR 96DC +ENCODING 38620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F600 +AF80 +AA00 +F700 +4A00 +F700 +6A00 +D780 +4800 +ENDCHAR +STARTCHAR 96E2 +ENCODING 38626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +F500 +F780 +FA00 +F700 +4600 +F700 +F600 +9780 +B400 +ENDCHAR +STARTCHAR 96E3 +ENCODING 38627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A500 +F600 +EF80 +FA00 +DF00 +FA00 +FF00 +FA00 +6F80 +9800 +ENDCHAR +STARTCHAR 96E8 +ENCODING 38632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +FF +ED +AB +ED +AB +89 +8B +ENDCHAR +STARTCHAR 96E9 +ENCODING 38633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +6E00 +7E00 +FF80 +4000 +7E00 +4600 +ENDCHAR +STARTCHAR 96EA +ENCODING 38634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +8880 +6600 +7F00 +FF80 +0100 +7F00 +ENDCHAR +STARTCHAR 96EF +ENCODING 38639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +EE80 +0800 +FF80 +2400 +1C00 +E380 +ENDCHAR +STARTCHAR 96F0 +ENCODING 38640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +0000 +1C00 +4200 +FF00 +3200 +CC00 +ENDCHAR +STARTCHAR 96F2 +ENCODING 38642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EF00 +8900 +6600 +7E00 +FF80 +2200 +FD00 +ENDCHAR +STARTCHAR 96F6 +ENCODING 38646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +7E00 +6600 +BD80 +7E00 +1100 +1600 +ENDCHAR +STARTCHAR 96F7 +ENCODING 38647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +EF +89 +66 +7F +7F +49 +7F +ENDCHAR +STARTCHAR 96F9 +ENCODING 38649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +EE80 +3E00 +F900 +C900 +7A80 +7F00 +ENDCHAR +STARTCHAR 96FB +ENCODING 38651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EF00 +6E00 +7E00 +4900 +7E00 +7E80 +0F00 +ENDCHAR +STARTCHAR 9700 +ENCODING 38656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +6E00 +FF80 +1000 +FF00 +A500 +A700 +ENDCHAR +STARTCHAR 9706 +ENCODING 38662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +8900 +6E00 +CC00 +6F00 +AF00 +4000 +FF80 +ENDCHAR +STARTCHAR 9707 +ENCODING 38663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +0800 +FF00 +8000 +FF00 +BE00 +E300 +ENDCHAR +STARTCHAR 9711 +ENCODING 38673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +FF +EF +6E +44 +C7 +3F +5F +9F +ENDCHAR +STARTCHAR 9713 +ENCODING 38675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +8880 +0000 +7F00 +7700 +7F00 +2480 +C700 +ENDCHAR +STARTCHAR 9716 +ENCODING 38678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +6E00 +4200 +FF00 +6500 +DA80 +4200 +ENDCHAR +STARTCHAR 9719 +ENCODING 38681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +8880 +2400 +FF80 +7E00 +4900 +FF80 +C380 +ENDCHAR +STARTCHAR 971C +ENCODING 38684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +EF +EF +4F +FF +A9 +DF +49 +ENDCHAR +STARTCHAR 971E +ENCODING 38686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +8880 +0000 +FF00 +FF00 +FF00 +F600 +8D80 +ENDCHAR +STARTCHAR 9727 +ENCODING 38695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +8880 +EC00 +4700 +FD80 +6400 +CF00 +4B00 +ENDCHAR +STARTCHAR 9730 +ENCODING 38704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +8880 +6400 +F780 +0D00 +F500 +F700 +B880 +ENDCHAR +STARTCHAR 9732 +ENCODING 38706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +0C00 +EF00 +E600 +AF80 +F900 +CF00 +ENDCHAR +STARTCHAR 9739 +ENCODING 38713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +0800 +FF00 +F500 +8F80 +FF00 +F200 +ENDCHAR +STARTCHAR 973D +ENCODING 38717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +8900 +EF00 +FF80 +F700 +AF00 +7E00 +7E00 +8100 +ENDCHAR +STARTCHAR 9742 +ENCODING 38722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +89 +EF +FF +F6 +B3 +F7 +AE +FF +ENDCHAR +STARTCHAR 9744 +ENCODING 38724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +BF +EF +66 +F9 +EF +ED +AF +EB +ENDCHAR +STARTCHAR 9748 +ENCODING 38728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +6E00 +B500 +4A00 +FF00 +2900 +FF80 +ENDCHAR +STARTCHAR 9751 +ENCODING 38737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7F00 +FF80 +0000 +7E00 +4900 +7E00 +4100 +4600 +ENDCHAR +STARTCHAR 9756 +ENCODING 38742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +0F00 +BF80 +A000 +AF00 +D500 +6F00 +D100 +1300 +ENDCHAR +STARTCHAR 975C +ENCODING 38748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +FF00 +EA80 +FF00 +0300 +EF80 +DD00 +E300 +9200 +AC00 +ENDCHAR +STARTCHAR 975E +ENCODING 38750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +1400 +E780 +1400 +E700 +2400 +E780 +2400 +4400 +4400 +ENDCHAR +STARTCHAR 9761 +ENCODING 38753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +F700 +F780 +F700 +9400 +F700 +F700 +F700 +2400 +ENDCHAR +STARTCHAR 9762 +ENCODING 38754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +1000 +FF00 +A500 +9D00 +A500 +9D00 +FF00 +8100 +ENDCHAR +STARTCHAR 9769 +ENCODING 38761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +3C00 +0800 +7F00 +8900 +7F00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR 976D +ENCODING 38765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +AF +F3 +A5 +ED +ED +DD +E5 +F9 +49 +57 +ENDCHAR +STARTCHAR 9774 +ENCODING 38772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A600 +FA00 +AA80 +EB00 +FA00 +DA00 +EA00 +FA80 +4A80 +4B80 +ENDCHAR +STARTCHAR 9777 +ENCODING 38775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +AF +F3 +A3 +EF +E9 +EF +EB +F3 +43 +4D +ENDCHAR +STARTCHAR 977A +ENCODING 38778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +F200 +AF80 +E200 +FF80 +D600 +F500 +FB00 +5280 +4200 +ENDCHAR +STARTCHAR 978B +ENCODING 38795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +FF00 +A200 +EF80 +F000 +D200 +FF00 +F200 +4200 +5F80 +ENDCHAR +STARTCHAR 978D +ENCODING 38797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A200 +FF00 +AC80 +EC80 +EF80 +D500 +EA00 +F600 +4500 +4880 +ENDCHAR +STARTCHAR 978F +ENCODING 38799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +7E80 +D380 +FF00 +3C00 +7F00 +7F00 +FF80 +0800 +ENDCHAR +STARTCHAR 97A0 +ENCODING 38816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A8 +FF +B1 +FF +EF +DF +E7 +FF +45 +43 +ENDCHAR +STARTCHAR 97A8 +ENCODING 38824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +AF +F9 +EF +4F +E8 +EF +D5 +EB +4F +43 +ENDCHAR +STARTCHAR 97AB +ENCODING 38827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A8 +FF +A9 +FF +EF +DF +EF +FF +4F +43 +ENDCHAR +STARTCHAR 97AD +ENCODING 38829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A800 +EF80 +B700 +F680 +F700 +F700 +F200 +F600 +5600 +5580 +ENDCHAR +STARTCHAR 97C6 +ENCODING 38854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +BF80 +F600 +AF80 +D500 +EF80 +E500 +F780 +FC00 +5700 +5F80 +ENDCHAR +STARTCHAR 97CB +ENCODING 38859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +FF00 +0000 +7E00 +7E00 +FF00 +4800 +FF80 +0800 +ENDCHAR +STARTCHAR 97D3 +ENCODING 38867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF00 +4F80 +E000 +EF00 +AF00 +E200 +FF00 +4F80 +4200 +ENDCHAR +STARTCHAR 97DC +ENCODING 38876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +EF00 +FD00 +1280 +E400 +EF00 +E880 +CF00 +FF00 +4880 +ENDCHAR +STARTCHAR 97F3 +ENCODING 38899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +24 +FF +00 +7E +42 +7E +7E +42 +ENDCHAR +STARTCHAR 97F6 +ENCODING 38902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +4F +F5 +A5 +A5 +FB +FF +99 +F9 +FF +99 +ENDCHAR +STARTCHAR 97FB +ENCODING 38907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F900 +AF00 +FF00 +0900 +EF00 +AF00 +EF00 +E500 +A880 +ENDCHAR +STARTCHAR 97FF +ENCODING 38911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B80 +D700 +BF00 +DA80 +9F80 +7F00 +FF80 +7E00 +7E00 +7E00 +ENDCHAR +STARTCHAR 9800 +ENCODING 38912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4A00 +FF80 +AF00 +F200 +0F00 +EF80 +A000 +FF00 +E600 +B980 +ENDCHAR +STARTCHAR 9801 +ENCODING 38913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +10 +7E +7E +42 +7E +7E +26 +C1 +ENDCHAR +STARTCHAR 9802 +ENCODING 38914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +44 +5F +5F +51 +5F +5F +4B +D1 +ENDCHAR +STARTCHAR 9803 +ENCODING 38915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F80 +8400 +BF00 +DF00 +9100 +9F00 +BF00 +EA00 +3180 +ENDCHAR +STARTCHAR 9805 +ENCODING 38917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1F80 +E400 +5F00 +5F00 +5100 +7F00 +9F00 +0A00 +3180 +ENDCHAR +STARTCHAR 9806 +ENCODING 38918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F80 +D400 +DF00 +DF00 +D900 +DF00 +DF00 +DF00 +9880 +ENDCHAR +STARTCHAR 9808 +ENCODING 38920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +8400 +3F00 +DF00 +9100 +3F00 +5F00 +9A00 +A180 +ENDCHAR +STARTCHAR 980A +ENCODING 38922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +4400 +5F00 +FF00 +5100 +5F00 +7F00 +CA00 +3180 +ENDCHAR +STARTCHAR 980C +ENCODING 38924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6F80 +A400 +AF00 +DF00 +6900 +AF00 +AF00 +DB00 +1080 +ENDCHAR +STARTCHAR 9810 +ENCODING 38928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +2400 +4F00 +FF00 +5900 +6F00 +4F00 +4D00 +D080 +ENDCHAR +STARTCHAR 9811 +ENCODING 38929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +0400 +FF00 +6F00 +A900 +AF00 +AF00 +BD00 +0880 +ENDCHAR +STARTCHAR 9812 +ENCODING 38930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6F80 +A400 +9F00 +9F00 +E880 +5F00 +5F00 +A500 +E880 +ENDCHAR +STARTCHAR 9813 +ENCODING 38931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F80 +6200 +CF00 +DF00 +D900 +EF00 +5F00 +7700 +0880 +ENDCHAR +STARTCHAR 9817 +ENCODING 38935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F400 +DF00 +C900 +FF00 +9900 +EF00 +AF00 +D500 +C880 +ENDCHAR +STARTCHAR 9818 +ENCODING 38936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F80 +A400 +9F00 +6F00 +F900 +5F00 +5F00 +7F00 +4880 +ENDCHAR +STARTCHAR 982D +ENCODING 38957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +0400 +EF00 +AF00 +E900 +AF00 +AF00 +3F00 +D080 +ENDCHAR +STARTCHAR 9830 +ENCODING 38960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F200 +4F00 +D900 +DF00 +FF00 +6900 +6F00 +9500 +8880 +ENDCHAR +STARTCHAR 9838 +ENCODING 38968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +BF00 +D900 +DF00 +7900 +FF00 +4F00 +F500 +0880 +ENDCHAR +STARTCHAR 9839 +ENCODING 38969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +4400 +FF00 +6F00 +D900 +AF00 +AF00 +BD00 +F880 +ENDCHAR +STARTCHAR 983B +ENCODING 38971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +C400 +BF00 +C900 +FF00 +C900 +DF00 +EF00 +4F00 +9080 +ENDCHAR +STARTCHAR 9846 +ENCODING 38982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +D200 +F700 +F700 +4880 +F700 +E700 +D500 +4880 +ENDCHAR +STARTCHAR 984C +ENCODING 38988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +F900 +0F00 +FF00 +AF00 +B500 +C900 +BF80 +ENDCHAR +STARTCHAR 984D +ENCODING 38989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F200 +D700 +7900 +E700 +6900 +9700 +F700 +F500 +9880 +ENDCHAR +STARTCHAR 984E +ENCODING 38990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F200 +0700 +F700 +F900 +4700 +F700 +9500 +6880 +ENDCHAR +STARTCHAR 9854 +ENCODING 38996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2F80 +F200 +5700 +F700 +A900 +F700 +C700 +9500 +E880 +ENDCHAR +STARTCHAR 9858 +ENCODING 39000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F780 +A200 +F700 +F700 +CD00 +F700 +F700 +AD00 +A880 +ENDCHAR +STARTCHAR 985A +ENCODING 39002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF80 +F200 +0700 +F700 +D900 +F700 +F700 +A500 +9880 +ENDCHAR +STARTCHAR 985E +ENCODING 39006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D000 +EF80 +FF00 +6900 +DF00 +5F00 +F900 +4F00 +E500 +9880 +ENDCHAR +STARTCHAR 9865 +ENCODING 39013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F400 +FF00 +FF00 +0900 +EF00 +EF00 +D500 +C880 +ENDCHAR +STARTCHAR 9867 +ENCODING 39015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F200 +9700 +F700 +F900 +F700 +D700 +F500 +C880 +ENDCHAR +STARTCHAR 986B +ENCODING 39019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F000 +0F80 +F700 +F900 +9700 +6700 +F900 +F700 +F500 +E880 +ENDCHAR +STARTCHAR 986F +ENCODING 39023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F200 +9700 +F700 +E900 +F700 +CF00 +F500 +E880 +ENDCHAR +STARTCHAR 98A8 +ENCODING 39080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +8D00 +B100 +BD00 +B500 +BD00 +9580 +8D80 +F380 +ENDCHAR +STARTCHAR 98AF +ENCODING 39087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5F00 +F300 +1D00 +DF00 +DF00 +DF00 +5F00 +A780 +3980 +ENDCHAR +STARTCHAR 98B1 +ENCODING 39089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FA00 +9B00 +EF00 +F880 +FB00 +FC80 +F700 +BC80 +EB00 +ENDCHAR +STARTCHAR 98C4 +ENCODING 39108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +F300 +AD00 +F700 +F700 +1700 +F700 +D780 +D980 +ENDCHAR +STARTCHAR 98C7 +ENCODING 39111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F300 +B780 +D200 +ED80 +B780 +AD80 +F500 +BC80 +D300 +ENDCHAR +STARTCHAR 98DB +ENCODING 39131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FD00 +3600 +D300 +5280 +FD00 +5500 +5300 +5280 +9100 +ENDCHAR +STARTCHAR 98DC +ENCODING 39132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2E80 +ED00 +FD80 +6D80 +DF00 +FF00 +DD80 +ED00 +F580 +ENDCHAR +STARTCHAR 98DF +ENCODING 39135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1C00 +7E00 +8180 +7E00 +7E00 +7E00 +4900 +5E00 +E100 +ENDCHAR +STARTCHAR 98E1 +ENCODING 39137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8C00 +5F00 +2080 +1F00 +1F00 +5F00 +5500 +9E00 +B180 +ENDCHAR +STARTCHAR 98E2 +ENCODING 39138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6E00 +9A00 +EA00 +EA00 +EA00 +9A00 +EA00 +EA00 +F280 +9180 +ENDCHAR +STARTCHAR 98ED +ENCODING 39149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +E780 +F800 +FC00 +FF00 +9480 +F500 +F500 +F900 +8B00 +ENDCHAR +STARTCHAR 98EE +ENCODING 39150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +A400 +FF00 +ED00 +ED00 +9400 +F600 +8600 +F900 +9080 +ENDCHAR +STARTCHAR 98EF +ENCODING 39151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6F80 +E800 +9800 +EF00 +ED00 +AD00 +EA00 +EA00 +F500 +9880 +ENDCHAR +STARTCHAR 98F4 +ENCODING 39156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +A400 +F500 +EB00 +E480 +AF00 +E900 +E900 +EF00 +8900 +ENDCHAR +STARTCHAR 98FC +ENCODING 39164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +6F +91 +EF +E1 +EF +9B +EF +EB +E1 +83 +ENDCHAR +STARTCHAR 98FD +ENCODING 39165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6800 +AF00 +F080 +FF00 +FB00 +AF00 +EB00 +E800 +E880 +8F00 +ENDCHAR +STARTCHAR 98FE +ENCODING 39166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6800 +BF80 +EA00 +E200 +EF00 +AA80 +EA80 +EA80 +EB00 +8200 +ENDCHAR +STARTCHAR 9903 +ENCODING 39171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +AF80 +EA00 +E900 +F080 +A900 +E600 +E400 +EF00 +9180 +ENDCHAR +STARTCHAR 9909 +ENCODING 39177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +44 +A4 +FF +F7 +F7 +B7 +F7 +97 +F1 +91 +ENDCHAR +STARTCHAR 990A +ENCODING 39178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +7F00 +FF80 +2A00 +FF00 +FF80 +7F00 +5E00 +E380 +ENDCHAR +STARTCHAR 990C +ENCODING 39180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +6F80 +F900 +8F00 +E900 +EF00 +E900 +E980 +EF00 +8100 +ENDCHAR +STARTCHAR 9910 +ENCODING 39184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3F00 +F600 +7E00 +B580 +4A00 +FF80 +7E00 +7D00 +FB80 +ENDCHAR +STARTCHAR 9913 +ENCODING 39187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +BB00 +CA80 +FF80 +EA00 +AF00 +FB00 +EA00 +EA80 +9D00 +ENDCHAR +STARTCHAR 9918 +ENCODING 39192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6200 +F600 +8900 +EE80 +E200 +AF00 +EB00 +EB00 +F280 +8400 +ENDCHAR +STARTCHAR 991E +ENCODING 39198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6A00 +A900 +EE00 +E680 +EB00 +AA00 +FF80 +8500 +E680 +9900 +ENDCHAR +STARTCHAR 9920 +ENCODING 39200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6500 +E900 +8F80 +E900 +E900 +AF80 +E900 +8900 +E900 +9100 +ENDCHAR +STARTCHAR 9928 +ENCODING 39208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF80 +F080 +EF00 +E900 +AF00 +E800 +EF00 +EF00 +8900 +ENDCHAR +STARTCHAR 9945 +ENCODING 39237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +E900 +1F00 +E000 +AF80 +EF80 +EF00 +8900 +E600 +9980 +ENDCHAR +STARTCHAR 9949 +ENCODING 39241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +FF80 +0700 +E200 +EF00 +AF00 +EF80 +8F00 +E200 +9F80 +ENDCHAR +STARTCHAR 994B +ENCODING 39243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6200 +EF00 +0F00 +EF80 +EF00 +AF00 +EF00 +8F00 +ED00 +9080 +ENDCHAR +STARTCHAR 994C +ENCODING 39244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7F00 +D680 +1F00 +FF80 +EA00 +BF00 +EA00 +9F80 +EB00 +9080 +ENDCHAR +STARTCHAR 994D +ENCODING 39245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6900 +AF00 +EF00 +EF80 +ED00 +BF80 +E000 +EF00 +EF00 +8900 +ENDCHAR +STARTCHAR 9951 +ENCODING 39249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +BE00 +DF00 +D500 +DF80 +BF80 +D300 +DA00 +D680 +AD00 +ENDCHAR +STARTCHAR 9952 +ENCODING 39250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6400 +CF00 +1F00 +E900 +FF80 +BB80 +FF80 +8A00 +EA80 +9300 +ENDCHAR +STARTCHAR 9954 +ENCODING 39252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +CA00 +6E00 +FF00 +E400 +FF80 +7E00 +4D00 +FB00 +ENDCHAR +STARTCHAR 9957 +ENCODING 39255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4B80 +F700 +5F00 +DE80 +6300 +BC00 +FF80 +3E00 +3E00 +FF00 +ENDCHAR +STARTCHAR 9996 +ENCODING 39318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +FF +10 +7E +42 +7E +7E +7E +42 +ENDCHAR +STARTCHAR 9999 +ENCODING 39321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0600 +7800 +FF00 +1400 +6A00 +FF80 +4200 +7E00 +4200 +7E00 +ENDCHAR +STARTCHAR 999D +ENCODING 39325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2500 +C300 +F500 +D500 +4F00 +EE80 +F400 +ED00 +AF00 +ENDCHAR +STARTCHAR 99A5 +ENCODING 39333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +EF80 +FF00 +6900 +EF00 +DF00 +E700 +ED00 +E600 +9980 +ENDCHAR +STARTCHAR 99A8 +ENCODING 39336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F680 +F900 +0F00 +F600 +8F80 +FC00 +EF00 +FF00 +7E00 +7E00 +ENDCHAR +STARTCHAR 99AC +ENCODING 39340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +48 +7E +7E +48 +7F +AD +AB +A3 +ENDCHAR +STARTCHAR 99AD +ENCODING 39341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +F900 +A500 +F500 +A500 +F200 +D200 +B500 +3880 +ENDCHAR +STARTCHAR 99AE +ENCODING 39342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +64 +3F +3F +64 +7F +B7 +AD +43 +ENDCHAR +STARTCHAR 99B1 +ENCODING 39345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +A200 +F200 +AF80 +F200 +F600 +F600 +B500 +9900 +2880 +ENDCHAR +STARTCHAR 99B3 +ENCODING 39347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +CA00 +EB00 +CF00 +FB00 +FB00 +BB00 +BA00 +9880 +2F00 +ENDCHAR +STARTCHAR 99B4 +ENCODING 39348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F9 +AB +FB +FB +AB +FB +BB +9B +31 +ENDCHAR +STARTCHAR 99B9 +ENCODING 39353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +F9 +C9 +F9 +CF +F9 +99 +9F +39 +ENDCHAR +STARTCHAR 99C1 +ENCODING 39361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FD00 +A300 +FD00 +F500 +A500 +F200 +B600 +9D00 +3880 +ENDCHAR +STARTCHAR 99D0 +ENCODING 39376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A200 +FF80 +A200 +F200 +FF00 +B200 +B200 +9200 +2F80 +ENDCHAR +STARTCHAR 99D1 +ENCODING 39377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +F500 +A600 +FD80 +7F00 +7E00 +7E00 +4800 +FF00 +AB00 +ENDCHAR +STARTCHAR 99D2 +ENCODING 39378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F4 +CF +F9 +D1 +EF +FB +BF +DB +91 +23 +ENDCHAR +STARTCHAR 99D5 +ENCODING 39381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +47 +F5 +77 +00 +7F +48 +7E +7F +AD +AB +ENDCHAR +STARTCHAR 99D9 +ENCODING 39385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +C500 +E900 +CF80 +ED00 +FB00 +BB00 +B900 +9900 +2B00 +ENDCHAR +STARTCHAR 99DD +ENCODING 39389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +AF80 +E880 +A880 +E500 +F700 +F400 +B400 +9480 +2700 +ENDCHAR +STARTCHAR 99DF +ENCODING 39391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +EF +CF +EF +CF +FF +B9 +9F +29 +ENDCHAR +STARTCHAR 99ED +ENCODING 39405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +FF80 +E400 +C900 +E600 +F500 +F900 +B200 +9D00 +6880 +ENDCHAR +STARTCHAR 99F1 +ENCODING 39409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +C700 +E900 +D600 +E700 +F980 +BF00 +B900 +9F00 +6900 +ENDCHAR +STARTCHAR 99FF +ENCODING 39423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +C900 +EF00 +CA80 +EF00 +F700 +B900 +A600 +A700 +7880 +ENDCHAR +STARTCHAR 9A01 +ENCODING 39425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +CF00 +EF00 +CD00 +EF00 +EF80 +E400 +AF00 +A900 +6300 +ENDCHAR +STARTCHAR 9A08 +ENCODING 39432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +A500 +EF80 +A500 +E500 +FF80 +E500 +A900 +9900 +7100 +ENDCHAR +STARTCHAR 9A0E +ENCODING 39438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +CF00 +E600 +C900 +FF80 +F100 +EF00 +AF00 +9B00 +6300 +ENDCHAR +STARTCHAR 9A0F +ENCODING 39439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +CF80 +E900 +CF00 +E900 +EF00 +DF80 +A000 +A900 +7080 +ENDCHAR +STARTCHAR 9A19 +ENCODING 39449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E1 +CE +EF +C9 +CF +EF +EF +FF +BF +7D +ENDCHAR +STARTCHAR 9A2B +ENCODING 39467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2400 +3C00 +FF80 +7F80 +C800 +7C00 +FF00 +AF00 +ENDCHAR +STARTCHAR 9A30 +ENCODING 39472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CD00 +BF00 +AA00 +DF80 +BF00 +FF80 +BF00 +BF00 +BF00 +DF00 +ENDCHAR +STARTCHAR 9A36 +ENCODING 39478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F8 +CF +FF +CF +ED +F8 +BF +BF +9F +2B +ENDCHAR +STARTCHAR 9A37 +ENCODING 39479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +CB00 +EE00 +E980 +C200 +FF00 +AF00 +9300 +6E80 +ENDCHAR +STARTCHAR 9A40 +ENCODING 39488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +7E00 +7E00 +7E00 +FF80 +7E00 +C980 +7C00 +BF00 +AB00 +ENDCHAR +STARTCHAR 9A43 +ENCODING 39491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +CF00 +F680 +EF00 +CF00 +E000 +EF80 +AB00 +7480 +ENDCHAR +STARTCHAR 9A45 +ENCODING 39493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF80 +CF00 +ED00 +EF00 +CD00 +EA80 +ED00 +A800 +6F80 +ENDCHAR +STARTCHAR 9A4D +ENCODING 39501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +CF00 +FF80 +C900 +EF00 +EF80 +D000 +EF80 +A680 +7B00 +ENDCHAR +STARTCHAR 9A55 +ENCODING 39509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E300 +CE00 +FF80 +CF00 +FE80 +EF00 +F100 +F700 +B700 +7100 +ENDCHAR +STARTCHAR 9A57 +ENCODING 39511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +C600 +EF00 +D080 +EF00 +EF00 +E000 +A900 +AD00 +7280 +ENDCHAR +STARTCHAR 9A5A +ENCODING 39514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +FF80 +8D00 +F380 +4C00 +7F00 +4800 +7F00 +AD00 +AB00 +ENDCHAR +STARTCHAR 9A5B +ENCODING 39515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EF00 +EE80 +CF00 +EF00 +CF80 +E980 +EF00 +A200 +6200 +ENDCHAR +STARTCHAR 9A5F +ENCODING 39519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FC00 +EF00 +CD00 +FE80 +C700 +EC00 +FB00 +ED00 +7C80 +ENDCHAR +STARTCHAR 9A62 +ENCODING 39522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +C600 +EF00 +D480 +F700 +F700 +F700 +F000 +FF80 +7F80 +ENDCHAR +STARTCHAR 9A65 +ENCODING 39525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E700 +DF80 +F780 +CF00 +EF00 +EF00 +E900 +FF80 +AD00 +7080 +ENDCHAR +STARTCHAR 9A69 +ENCODING 39529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7280 +6FC0 +7780 +6B80 +7700 +77C0 +6F80 +5500 +D7C0 +3400 +ENDCHAR +STARTCHAR 9A6A +ENCODING 39530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +DF00 +F480 +EF80 +CF00 +EF00 +FA00 +F780 +7F80 +ENDCHAR +STARTCHAR 9AA8 +ENCODING 39592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +4E +52 +FF +FF +7E +42 +7E +46 +ENDCHAR +STARTCHAR 9AB8 +ENCODING 39608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E200 +9F80 +F400 +F900 +F600 +AD00 +E900 +E200 +AD00 +A880 +ENDCHAR +STARTCHAR 9AD3 +ENCODING 39635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +AF80 +EA00 +FF80 +E700 +BF00 +ED00 +EF00 +AD00 +B780 +ENDCHAR +STARTCHAR 9AD4 +ENCODING 39636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +AF00 +EF00 +FF00 +F000 +AF80 +EF00 +EF00 +A600 +FF80 +ENDCHAR +STARTCHAR 9AD8 +ENCODING 39640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7E00 +7E00 +0000 +FF00 +BD00 +BD00 +A100 +8300 +ENDCHAR +STARTCHAR 9AE5 +ENCODING 39653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7600 +8100 +E600 +FF00 +C800 +7E00 +FF80 +7E00 +4600 +ENDCHAR +STARTCHAR 9AEE +ENCODING 39662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7300 +7500 +7600 +F980 +F600 +1600 +FF80 +3200 +4C00 +F380 +ENDCHAR +STARTCHAR 9B1A +ENCODING 39706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7600 +4100 +FF80 +F600 +7F00 +EF00 +B100 +4F00 +9B80 +ENDCHAR +STARTCHAR 9B27 +ENCODING 39719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FF +A5 +FF +81 +89 +FF +BF +AB +AF +8B +ENDCHAR +STARTCHAR 9B2A +ENCODING 39722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FF +A5 +FF +81 +F3 +FF +FB +D7 +F7 +81 +ENDCHAR +STARTCHAR 9B31 +ENCODING 39729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5900 +CB00 +4900 +0000 +FF80 +6A00 +7900 +9680 +EB00 +FC00 +ENDCHAR +STARTCHAR 9B3C +ENCODING 39740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4900 +7E00 +4900 +7E00 +2A00 +2F00 +4880 +8F00 +ENDCHAR +STARTCHAR 9B41 +ENCODING 39745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +F500 +B300 +F500 +B500 +F380 +7700 +7900 +B880 +BF00 +ENDCHAR +STARTCHAR 9B42 +ENCODING 39746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +1500 +FF00 +5500 +BF00 +AC00 +EF80 +1480 +3380 +ENDCHAR +STARTCHAR 9B43 +ENCODING 39747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F500 +DF80 +F500 +D500 +FA00 +7300 +BB00 +A480 +BF00 +ENDCHAR +STARTCHAR 9B44 +ENCODING 39748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF00 +B500 +BF00 +D500 +BF00 +AE00 +CB80 +B480 +2380 +ENDCHAR +STARTCHAR 9B45 +ENCODING 39749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +D200 +FF80 +D200 +F700 +BA80 +BA00 +A080 +BF00 +ENDCHAR +STARTCHAR 9B4F +ENCODING 39759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +CF00 +FB00 +6F00 +DB00 +4F00 +F700 +AB80 +6A80 +9300 +ENDCHAR +STARTCHAR 9B54 +ENCODING 39764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +AF80 +DB00 +BF00 +BF00 +BF00 +9A80 +E700 +ENDCHAR +STARTCHAR 9B5A +ENCODING 39770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +3C00 +4800 +FE00 +C900 +7E00 +7E00 +4100 +9500 +9480 +ENDCHAR +STARTCHAR 9B6F +ENCODING 39791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7800 +FF00 +7F00 +7F00 +A500 +FE80 +4200 +7E00 +7E00 +ENDCHAR +STARTCHAR 9B8E +ENCODING 39822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6200 +A380 +F200 +D200 +FF00 +F880 +F880 +FF00 +C880 +ENDCHAR +STARTCHAR 9B91 +ENCODING 39825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F00 +A880 +FE80 +DB00 +FF00 +FB00 +B800 +F880 +EF00 +ENDCHAR +STARTCHAR 9B9F +ENCODING 39839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6F80 +AC80 +E400 +DF80 +E500 +EE00 +9200 +F500 +E880 +ENDCHAR +STARTCHAR 9BAB +ENCODING 39851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +EF80 +A600 +E900 +D080 +E900 +E600 +A600 +FD00 +D080 +ENDCHAR +STARTCHAR 9BAE +ENCODING 39854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +6500 +AF00 +F200 +DF00 +F200 +FF80 +F200 +F200 +F200 +ENDCHAR +STARTCHAR 9BC9 +ENCODING 39881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +EB00 +AB00 +EF00 +DB00 +EF00 +EF00 +E200 +F200 +CF80 +ENDCHAR +STARTCHAR 9BD6 +ENCODING 39894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +EF80 +AF00 +EF80 +E000 +EF00 +EB00 +8F00 +B900 +EB00 +ENDCHAR +STARTCHAR 9BE4 +ENCODING 39908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +6900 +AF00 +FF00 +D000 +FA00 +FE80 +EB00 +FE80 +FB80 +ENDCHAR +STARTCHAR 9BE8 +ENCODING 39912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +6F80 +A000 +FF00 +D900 +FF00 +F200 +EB00 +FA80 +CE00 +ENDCHAR +STARTCHAR 9C0D +ENCODING 39949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4E00 +DA00 +CE80 +FE80 +EF00 +FA00 +FF00 +8B00 +8C80 +8C80 +ENDCHAR +STARTCHAR 9C10 +ENCODING 39952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F00 +F680 +AF00 +EF00 +E000 +EF80 +0700 +F900 +E700 +ENDCHAR +STARTCHAR 9C12 +ENCODING 39954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +6F80 +AF00 +F900 +DF00 +FF00 +F700 +FD00 +F600 +E980 +ENDCHAR +STARTCHAR 9C15 +ENCODING 39957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2F80 +7A40 +5A40 +7F80 +7800 +7FC0 +7980 +5E80 +5980 +AA40 +ENDCHAR +STARTCHAR 9C25 +ENCODING 39973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2780 +7740 +5740 +7780 +6D80 +7540 +7300 +4580 +6D40 +B900 +ENDCHAR +STARTCHAR 9C32 +ENCODING 39986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +4780 +FD00 +7200 +BD80 +7800 +FE00 +7E00 +7E00 +9500 +ENDCHAR +STARTCHAR 9C3B +ENCODING 39995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +E900 +AF00 +E000 +EF00 +EF00 +E000 +8F00 +F600 +F980 +ENDCHAR +STARTCHAR 9C47 +ENCODING 40007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +EF80 +B700 +F300 +EF80 +F700 +F700 +1700 +BA80 +B600 +ENDCHAR +STARTCHAR 9C49 +ENCODING 40009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5400 +B780 +FD00 +AA00 +B580 +7F00 +C900 +7F00 +8100 +A480 +ENDCHAR +STARTCHAR 9C57 +ENCODING 40023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D00 +ED00 +BF80 +EA00 +F580 +ED00 +F780 +9B80 +9900 +9100 +ENDCHAR +STARTCHAR 9CE5 +ENCODING 40165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +7E00 +4200 +7E00 +7F80 +7F00 +0500 +AB00 +AB00 +ENDCHAR +STARTCHAR 9CE7 +ENCODING 40167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +7E00 +7F00 +7F00 +B500 +B700 +3C00 +4480 +8700 +ENDCHAR +STARTCHAR 9CE9 +ENCODING 40169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +8F00 +CF00 +B100 +AF00 +AF80 +AF00 +BE80 +9B00 +1B00 +ENDCHAR +STARTCHAR 9CF3 +ENCODING 40179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FE00 +BE00 +A600 +BE00 +BA00 +BD00 +8500 +FD80 +CD00 +ENDCHAR +STARTCHAR 9CF4 +ENCODING 40180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF00 +BF00 +B100 +BF00 +BF80 +DF00 +BE80 +1D00 +2B00 +ENDCHAR +STARTCHAR 9CF6 +ENCODING 40182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +FF80 +1480 +7F00 +4200 +7E00 +7F00 +7F00 +AD00 +AB00 +ENDCHAR +STARTCHAR 9D09 +ENCODING 40201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +AF00 +A900 +FF00 +2F80 +6F00 +BA80 +B700 +7300 +ENDCHAR +STARTCHAR 9D1B +ENCODING 40219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7F +AF +50 +EE +7E +7C +7F +BF +AB +ENDCHAR +STARTCHAR 9D26 +ENCODING 40230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7E00 +FF80 +3E00 +C380 +7E00 +7E00 +7F00 +AD00 +AB00 +ENDCHAR +STARTCHAR 9D28 +ENCODING 40232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +EF00 +DF00 +E900 +DE00 +DF80 +EF00 +5D00 +5500 +4300 +ENDCHAR +STARTCHAR 9D3B +ENCODING 40251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2F00 +A900 +AF00 +2F80 +7F00 +EA80 +9500 +9300 +ENDCHAR +STARTCHAR 9D51 +ENCODING 40273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +EF00 +0900 +EF00 +EF80 +AF00 +ED00 +B680 +A300 +ENDCHAR +STARTCHAR 9D5D +ENCODING 40285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +6000 +B700 +B700 +F900 +A700 +7780 +B700 +AE80 +AF00 +D300 +ENDCHAR +STARTCHAR 9D60 +ENCODING 40288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C400 +CF00 +FF00 +C900 +FF00 +0F80 +FF00 +9A80 +F700 +9300 +ENDCHAR +STARTCHAR 9D61 +ENCODING 40289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FF00 +3F00 +F900 +6F00 +EF80 +EF80 +EE80 +EF00 +9900 +ENDCHAR +STARTCHAR 9D6C +ENCODING 40300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +EF00 +EF00 +F500 +EF00 +EF80 +F700 +EB00 +EA80 +7100 +ENDCHAR +STARTCHAR 9D72 +ENCODING 40306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +EF00 +AF00 +F900 +0F00 +EF80 +AF00 +E880 +F480 +B300 +ENDCHAR +STARTCHAR 9DA9 +ENCODING 40361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +6780 +FE00 +7D80 +7E00 +7E00 +4000 +7F00 +B500 +B700 +ENDCHAR +STARTCHAR 9DAF +ENCODING 40367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B700 +EE00 +DD00 +FF00 +C300 +7E00 +7C00 +7F80 +AD00 +AB00 +ENDCHAR +STARTCHAR 9DB4 +ENCODING 40372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +DF00 +A900 +FF00 +FF80 +AF80 +FD00 +FF00 +8B00 +ENDCHAR +STARTCHAR 9DC4 +ENCODING 40388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3400 +EF00 +CF00 +6900 +AF00 +FF80 +5F00 +FF00 +6F00 +9300 +ENDCHAR +STARTCHAR 9DD7 +ENCODING 40407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +8F00 +FF00 +F900 +8F00 +DF80 +BF80 +DE80 +FF00 +8B00 +ENDCHAR +STARTCHAR 9DF2 +ENCODING 40434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +FF80 +F680 +DB00 +9000 +7E00 +7E00 +7F00 +8100 +AF00 +ENDCHAR +STARTCHAR 9DF8 +ENCODING 40440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +6700 +F700 +B700 +6400 +F780 +F700 +F700 +EE80 +9300 +ENDCHAR +STARTCHAR 9DF9 +ENCODING 40441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +AA00 +FF00 +A800 +B700 +BE00 +BF80 +BF00 +DB00 +ENDCHAR +STARTCHAR 9DFA +ENCODING 40442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +FE00 +AD80 +FF00 +D000 +7E00 +7E00 +7F00 +7F00 +AF00 +ENDCHAR +STARTCHAR 9E1A +ENCODING 40474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F200 +F700 +F700 +F900 +F700 +4780 +F780 +AF00 +6E80 +D100 +ENDCHAR +STARTCHAR 9E1E +ENCODING 40478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +4300 +FB80 +DA80 +7900 +7E00 +7E00 +7F80 +7F00 +B500 +ENDCHAR +STARTCHAR 9E75 +ENCODING 40565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +1F +10 +FF +AD +DB +BF +AB +FF +81 +ENDCHAR +STARTCHAR 9E79 +ENCODING 40569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +7100 +4F80 +FE00 +B980 +FD00 +DB00 +BD00 +F380 +9280 +ENDCHAR +STARTCHAR 9E7D +ENCODING 40573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F800 +CF00 +EB00 +9E80 +EB00 +CF00 +FF00 +7F00 +9500 +FF80 +ENDCHAR +STARTCHAR 9E7F +ENCODING 40575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9400 +FF00 +FF00 +A400 +A500 +BE00 +BC80 +E700 +ENDCHAR +STARTCHAR 9E92 +ENCODING 40594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +FF80 +E500 +F700 +F500 +E700 +F500 +DF80 +ED00 +D880 +ENDCHAR +STARTCHAR 9E93 +ENCODING 40595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +DB00 +4A00 +FF80 +FF00 +FF00 +A500 +B680 +E700 +ENDCHAR +STARTCHAR 9E97 +ENCODING 40599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +9900 +8800 +FF00 +FF00 +FF00 +A500 +BE80 +E700 +ENDCHAR +STARTCHAR 9E9D +ENCODING 40605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +B500 +7700 +2100 +7F80 +7D00 +F500 +9300 +ENDCHAR +STARTCHAR 9E9F +ENCODING 40607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2B00 +F700 +EF80 +F700 +FA80 +A500 +BB80 +E780 +B500 +F900 +ENDCHAR +STARTCHAR 9EA5 +ENCODING 40613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2A00 +6A00 +3500 +6A00 +BF80 +5400 +1C00 +E300 +ENDCHAR +STARTCHAR 9EB4 +ENCODING 40628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +F700 +DC80 +FE80 +E480 +DF00 +F700 +ED00 +6300 +9F80 +ENDCHAR +STARTCHAR 9EB5 +ENCODING 40629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F200 +DF00 +7E80 +EE80 +DE80 +FE80 +6F00 +6880 +9F80 +ENDCHAR +STARTCHAR 9EBB +ENCODING 40635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +A200 +F700 +A200 +F700 +F700 +F780 +EB80 +A200 +ENDCHAR +STARTCHAR 9EBE +ENCODING 40638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +F700 +F780 +F780 +8600 +B800 +BF00 +E880 +8F00 +ENDCHAR +STARTCHAR 9EC3 +ENCODING 40643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF00 +3C00 +FF80 +0800 +7E00 +7E00 +7E00 +2600 +C180 +ENDCHAR +STARTCHAR 9ECD +ENCODING 40653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0200 +7C00 +FF00 +6E00 +9980 +6E00 +AB80 +3C00 +4E00 +9100 +ENDCHAR +STARTCHAR 9ECE +ENCODING 40654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +E700 +FB00 +5500 +BF00 +6600 +C980 +3A00 +4C00 +9B00 +ENDCHAR +STARTCHAR 9ED1 +ENCODING 40657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +6B00 +6D00 +7F00 +7F00 +FF80 +0000 +A500 +9480 +ENDCHAR +STARTCHAR 9ED4 +ENCODING 40660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F600 +B600 +D900 +FF00 +F080 +3F00 +C100 +E900 +E200 +ENDCHAR +STARTCHAR 9ED8 +ENCODING 40664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F300 +B280 +D200 +FF80 +2200 +F200 +F500 +1500 +E880 +C880 +ENDCHAR +STARTCHAR 9EDB +ENCODING 40667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +CB80 +DC80 +4300 +7E00 +6D00 +FF00 +FF80 +4500 +9480 +ENDCHAR +STARTCHAR 9EDC +ENCODING 40668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +F2 +DB +BB +DB +FF +F2 +7B +DB +FF +E9 +ENDCHAR +STARTCHAR 9EDE +ENCODING 40670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F200 +B200 +B380 +F200 +F200 +3F00 +C880 +EF00 +E880 +ENDCHAR +STARTCHAR 9EE8 +ENCODING 40680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2A00 +FF00 +BE80 +3E00 +7F00 +6D00 +FF00 +FF80 +4500 +9480 +ENDCHAR +STARTCHAR 9EF4 +ENCODING 40692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7600 +BA00 +C380 +7B00 +BF00 +BB00 +B900 +BD00 +AB00 +D480 +ENDCHAR +STARTCHAR 9F07 +ENCODING 40711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +F700 +FD00 +7200 +AD80 +DB00 +7E00 +9F00 +F780 +1F00 +ENDCHAR +STARTCHAR 9F08 +ENCODING 40712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B400 +F780 +DA00 +B580 +7F00 +7F00 +FF00 +FF00 +FF00 +1F80 +ENDCHAR +STARTCHAR 9F0E +ENCODING 40718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +3C00 +BD00 +BD00 +BD00 +8100 +F700 +F780 +5500 +9500 +ENDCHAR +STARTCHAR 9F13 +ENCODING 40723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F200 +FF80 +0200 +FF00 +F500 +0600 +A600 +7D00 +C880 +ENDCHAR +STARTCHAR 9F20 +ENCODING 40736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +8100 +FF00 +FF00 +B600 +B600 +B600 +B580 +D900 +ENDCHAR +STARTCHAR 9F3B +ENCODING 40763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +7E00 +4200 +7E00 +0000 +7F00 +8900 +FF80 +3C00 +C400 +ENDCHAR +STARTCHAR 9F4A +ENCODING 40778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +FF00 +AD00 +EE80 +4200 +7E00 +7E00 +8200 +8200 +ENDCHAR +STARTCHAR 9F4B +ENCODING 40779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +F600 +6F00 +E880 +7E00 +4100 +7E00 +ED00 +AD00 +ENDCHAR +STARTCHAR 9F4E +ENCODING 40782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0900 +FE00 +E900 +7F00 +4100 +7D00 +BD00 +BD00 +A700 +ENDCHAR +STARTCHAR 9F52 +ENCODING 40786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2800 +2F00 +FF80 +A500 +BB00 +C900 +FF00 +A500 +DB00 +FF00 +ENDCHAR +STARTCHAR 9F5F +ENCODING 40799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +A700 +B500 +F500 +F700 +B500 +F700 +F500 +B500 +FF80 +ENDCHAR +STARTCHAR 9F61 +ENCODING 40801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +B500 +FD00 +EF80 +B000 +9700 +F480 +F480 +B500 +F400 +ENDCHAR +STARTCHAR 9F67 +ENCODING 40807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +4500 +F700 +4800 +2E00 +FF80 +AB00 +F500 +DB00 +FF00 +ENDCHAR +STARTCHAR 9F6A +ENCODING 40810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A700 +B900 +F900 +4900 +F700 +D600 +F700 +FA00 +FE00 +9B80 +ENDCHAR +STARTCHAR 9F6C +ENCODING 40812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F80 +B200 +F700 +6500 +BF80 +9000 +F700 +B500 +F700 +9500 +ENDCHAR +STARTCHAR 9F77 +ENCODING 40823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2F00 +B880 +FF00 +B800 +BF80 +DB80 +FE00 +FF00 +FA00 +9780 +ENDCHAR +STARTCHAR 9F8D +ENCODING 40845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +F700 +A700 +F100 +F700 +9700 +F700 +F700 +9880 +B700 +ENDCHAR +STARTCHAR 9F90 +ENCODING 40848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FF00 +B700 +F900 +F700 +F400 +CE00 +FE80 +5700 +ENDCHAR +STARTCHAR 9F95 +ENCODING 40853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3C00 +DF80 +7E00 +0000 +FF00 +FF00 +F800 +FF00 +FF80 +B700 +ENDCHAR +STARTCHAR 9F9C +ENCODING 40860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7C00 +FF00 +7700 +D700 +F500 +1B00 +F700 +3880 +5F00 +ENDCHAR +STARTCHAR AC00 +ENCODING 44032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1100 +1180 +2100 +4100 +8100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AC01 +ENCODING 44033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +6100 +8100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AC02 +ENCODING 44034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0900 +1180 +2100 +C100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR AC03 +ENCODING 44035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +1180 +2100 +C100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR AC04 +ENCODING 44036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +2100 +4100 +8100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR AC05 +ENCODING 44037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +1180 +2100 +C100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR AC06 +ENCODING 44038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +1180 +2100 +C000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR AC07 +ENCODING 44039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8100 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR AC08 +ENCODING 44040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR AC09 +ENCODING 44041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR AC0A +ENCODING 44042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR AC0B +ENCODING 44043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +1180 +2100 +C000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR AC0C +ENCODING 44044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +1180 +2100 +C000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR AC0D +ENCODING 44045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +1180 +2100 +C000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR AC0E +ENCODING 44046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +1180 +2100 +C000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR AC0F +ENCODING 44047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +1180 +2100 +C000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR AC10 +ENCODING 44048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +6100 +8100 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR AC11 +ENCODING 44049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8000 +4100 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR AC12 +ENCODING 44050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8000 +4A00 +4A00 +7200 +4D00 +7480 +ENDCHAR +STARTCHAR AC13 +ENCODING 44051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +2100 +4100 +8100 +0800 +0800 +3400 +4300 +ENDCHAR +STARTCHAR AC14 +ENCODING 44052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +2100 +4100 +8000 +2200 +2200 +5500 +8980 +ENDCHAR +STARTCHAR AC15 +ENCODING 44053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +6100 +8100 +3C00 +6200 +4100 +6200 +3C00 +ENDCHAR +STARTCHAR AC16 +ENCODING 44054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +6100 +8100 +0000 +3F00 +0200 +0C00 +7300 +ENDCHAR +STARTCHAR AC17 +ENCODING 44055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +3100 +6100 +9C00 +0000 +7F00 +0200 +1C00 +6380 +ENDCHAR +STARTCHAR AC18 +ENCODING 44056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0900 +1180 +2100 +C100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR AC19 +ENCODING 44057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6100 +8000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR AC1A +ENCODING 44058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +6100 +8100 +0000 +7F00 +2200 +2200 +7F00 +ENDCHAR +STARTCHAR AC1B +ENCODING 44059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +3180 +C100 +1C00 +0000 +7F00 +0000 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR AC1C +ENCODING 44060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +15 +27 +25 +45 +85 +05 +05 +05 +ENDCHAR +STARTCHAR AC1D +ENCODING 44061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +27 +45 +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AC1E +ENCODING 44062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +17 +25 +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AC1F +ENCODING 44063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1700 +2500 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AC20 +ENCODING 44064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +2700 +4500 +8500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AC21 +ENCODING 44065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1700 +2500 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AC22 +ENCODING 44066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR AC23 +ENCODING 44067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +17 +25 +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AC24 +ENCODING 44068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +17 +65 +85 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AC25 +ENCODING 44069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR AC26 +ENCODING 44070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR AC27 +ENCODING 44071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR AC28 +ENCODING 44072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AC29 +ENCODING 44073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR AC2A +ENCODING 44074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AC2B +ENCODING 44075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR AC2C +ENCODING 44076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +27 +45 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AC2D +ENCODING 44077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +27 +45 +85 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR AC2E +ENCODING 44078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1700 +2500 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AC2F +ENCODING 44079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +2700 +4500 +8500 +0500 +0900 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR AC30 +ENCODING 44080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +2700 +4500 +8500 +0000 +1200 +1200 +3500 +4C80 +ENDCHAR +STARTCHAR AC31 +ENCODING 44081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +27 +45 +85 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR AC32 +ENCODING 44082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1700 +2500 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AC33 +ENCODING 44083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1500 +2700 +4500 +8500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR AC34 +ENCODING 44084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +17 +25 +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AC35 +ENCODING 44085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR AC36 +ENCODING 44086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +17 +25 +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AC37 +ENCODING 44087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +27 +45 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR AC38 +ENCODING 44088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +1100 +2180 +4100 +8100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AC39 +ENCODING 44089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6180 +8100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AC3A +ENCODING 44090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR AC3B +ENCODING 44091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR AC3C +ENCODING 44092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +2100 +4180 +8100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR AC3D +ENCODING 44093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR AC3E +ENCODING 44094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR AC3F +ENCODING 44095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR AC40 +ENCODING 44096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0980 +1100 +1180 +6100 +8000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR AC41 +ENCODING 44097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR AC42 +ENCODING 44098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR AC43 +ENCODING 44099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR AC44 +ENCODING 44100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR AC45 +ENCODING 44101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR AC46 +ENCODING 44102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR AC47 +ENCODING 44103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR AC48 +ENCODING 44104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR AC49 +ENCODING 44105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR AC4A +ENCODING 44106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AC4B +ENCODING 44107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +2180 +4100 +8100 +0800 +0800 +3400 +4300 +ENDCHAR +STARTCHAR AC4C +ENCODING 44108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR AC4D +ENCODING 44109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +1100 +6180 +8100 +3C00 +6200 +4100 +6200 +3C00 +ENDCHAR +STARTCHAR AC4E +ENCODING 44110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR AC4F +ENCODING 44111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR AC50 +ENCODING 44112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR AC51 +ENCODING 44113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR AC52 +ENCODING 44114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +1100 +2180 +C100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR AC53 +ENCODING 44115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +1100 +2180 +C000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR AC54 +ENCODING 44116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +17 +15 +25 +27 +45 +85 +05 +05 +05 +ENDCHAR +STARTCHAR AC55 +ENCODING 44117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AC56 +ENCODING 44118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AC57 +ENCODING 44119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +1500 +2700 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AC58 +ENCODING 44120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1700 +2500 +4700 +8500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AC59 +ENCODING 44121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +1500 +2700 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AC5A +ENCODING 44122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR AC5B +ENCODING 44123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AC5C +ENCODING 44124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +17 +15 +27 +45 +80 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AC5D +ENCODING 44125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR AC5E +ENCODING 44126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR AC5F +ENCODING 44127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR AC60 +ENCODING 44128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AC61 +ENCODING 44129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR AC62 +ENCODING 44130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AC63 +ENCODING 44131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR AC64 +ENCODING 44132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR AC65 +ENCODING 44133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR AC66 +ENCODING 44134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +1500 +2700 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AC67 +ENCODING 44135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR AC68 +ENCODING 44136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +1500 +2700 +C500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR AC69 +ENCODING 44137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +15 +27 +C5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR AC6A +ENCODING 44138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +1500 +2700 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AC6B +ENCODING 44139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1700 +2500 +4700 +8500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR AC6C +ENCODING 44140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AC6D +ENCODING 44141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR AC6E +ENCODING 44142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +15 +27 +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AC6F +ENCODING 44143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +25 +47 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR AC70 +ENCODING 44144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +17 +21 +41 +81 +01 +01 +01 +ENDCHAR +STARTCHAR AC71 +ENCODING 44145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C1 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AC72 +ENCODING 44146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +17 +21 +41 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AC73 +ENCODING 44147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +1700 +2100 +4100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AC74 +ENCODING 44148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +17 +11 +61 +81 +01 +20 +20 +3F +ENDCHAR +STARTCHAR AC75 +ENCODING 44149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +17 +21 +41 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR AC76 +ENCODING 44150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR AC77 +ENCODING 44151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C1 +00 +3F +20 +20 +3F +ENDCHAR +STARTCHAR AC78 +ENCODING 44152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C0 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AC79 +ENCODING 44153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR AC7A +ENCODING 44154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C0 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AC7B +ENCODING 44155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AC7C +ENCODING 44156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AC7D +ENCODING 44157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AC7E +ENCODING 44158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AC7F +ENCODING 44159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +17 +21 +C1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR AC80 +ENCODING 44160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +61 +C1 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AC81 +ENCODING 44161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C0 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR AC82 +ENCODING 44162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +1700 +2100 +4100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AC83 +ENCODING 44163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +1700 +3100 +6100 +8100 +0800 +0C00 +1600 +6180 +ENDCHAR +STARTCHAR AC84 +ENCODING 44164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +1700 +2100 +C100 +0000 +1200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR AC85 +ENCODING 44165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C1 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR AC86 +ENCODING 44166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +1700 +2100 +C100 +0000 +3F00 +0200 +0E00 +7180 +ENDCHAR +STARTCHAR AC87 +ENCODING 44167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +1700 +2100 +C100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR AC88 +ENCODING 44168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +17 +21 +41 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AC89 +ENCODING 44169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +21 +C0 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR AC8A +ENCODING 44170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +17 +61 +C1 +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR AC8B +ENCODING 44171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +37 +C1 +1C +00 +7F +00 +1C +22 +1E +ENDCHAR +STARTCHAR AC8C +ENCODING 44172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +1D +25 +25 +45 +85 +05 +05 +05 +ENDCHAR +STARTCHAR AC8D +ENCODING 44173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +1D +25 +C5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AC8E +ENCODING 44174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +1D +25 +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AC8F +ENCODING 44175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1D00 +2500 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AC90 +ENCODING 44176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +3D00 +6500 +8500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AC91 +ENCODING 44177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1D00 +2500 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AC92 +ENCODING 44178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR AC93 +ENCODING 44179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +1D +25 +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AC94 +ENCODING 44180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +3D +65 +85 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AC95 +ENCODING 44181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR AC96 +ENCODING 44182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR AC97 +ENCODING 44183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR AC98 +ENCODING 44184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AC99 +ENCODING 44185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR AC9A +ENCODING 44186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AC9B +ENCODING 44187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR AC9C +ENCODING 44188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +3D +65 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AC9D +ENCODING 44189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +3D +65 +85 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR AC9E +ENCODING 44190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1D00 +2500 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AC9F +ENCODING 44191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +1D00 +2500 +4500 +8100 +0800 +0C00 +3600 +6180 +ENDCHAR +STARTCHAR ACA0 +ENCODING 44192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +3D00 +6500 +8500 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR ACA1 +ENCODING 44193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +3D +65 +85 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR ACA2 +ENCODING 44194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +1D00 +2500 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR ACA3 +ENCODING 44195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1500 +3D00 +4500 +8100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR ACA4 +ENCODING 44196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +1D +25 +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR ACA5 +ENCODING 44197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR ACA6 +ENCODING 44198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +1D +25 +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR ACA7 +ENCODING 44199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +3D +45 +81 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR ACA8 +ENCODING 44200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +11 +2F +41 +81 +01 +01 +01 +ENDCHAR +STARTCHAR ACA9 +ENCODING 44201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +1F +21 +C1 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR ACAA +ENCODING 44202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +1F +21 +C1 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR ACAB +ENCODING 44203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0F00 +1100 +2F00 +4100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR ACAC +ENCODING 44204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +1F +61 +81 +01 +20 +20 +3F +ENDCHAR +STARTCHAR ACAD +ENCODING 44205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +0F +11 +2F +41 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR ACAE +ENCODING 44206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR ACAF +ENCODING 44207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +1F +21 +C1 +00 +3F +20 +20 +3F +ENDCHAR +STARTCHAR ACB0 +ENCODING 44208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +1F +21 +C0 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR ACB1 +ENCODING 44209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR ACB2 +ENCODING 44210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR ACB3 +ENCODING 44211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR ACB4 +ENCODING 44212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR ACB5 +ENCODING 44213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR ACB6 +ENCODING 44214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR ACB7 +ENCODING 44215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR ACB8 +ENCODING 44216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +2F +C1 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR ACB9 +ENCODING 44217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +1F +21 +C0 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR ACBA +ENCODING 44218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0F00 +1100 +2F00 +4100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR ACBB +ENCODING 44219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0F00 +1100 +1F00 +6100 +8100 +0800 +0C00 +1600 +6180 +ENDCHAR +STARTCHAR ACBC +ENCODING 44220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0F00 +1100 +2F00 +C100 +0000 +1200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR ACBD +ENCODING 44221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +11 +1F +61 +81 +1E +21 +21 +1E +ENDCHAR +STARTCHAR ACBE +ENCODING 44222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0F00 +1100 +2F00 +4100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR ACBF +ENCODING 44223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0F00 +1100 +2F00 +C100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR ACC0 +ENCODING 44224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +0F +11 +2F +41 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR ACC1 +ENCODING 44225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +2F +C1 +00 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR ACC2 +ENCODING 44226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +0F +11 +2F +41 +00 +3F +12 +3F +ENDCHAR +STARTCHAR ACC3 +ENCODING 44227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +11 +2F +C1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR ACC4 +ENCODING 44228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +1D +15 +25 +7D +C5 +85 +05 +05 +05 +ENDCHAR +STARTCHAR ACC5 +ENCODING 44229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +15 +3D +C5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR ACC6 +ENCODING 44230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +15 +3D +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR ACC7 +ENCODING 44231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +1500 +3D00 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR ACC8 +ENCODING 44232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1D00 +2500 +3D00 +4500 +8500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR ACC9 +ENCODING 44233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +1500 +3D00 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR ACCA +ENCODING 44234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR ACCB +ENCODING 44235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +15 +3D +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR ACCC +ENCODING 44236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +1D +15 +7D +85 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR ACCD +ENCODING 44237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR ACCE +ENCODING 44238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR ACCF +ENCODING 44239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR ACD0 +ENCODING 44240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR ACD1 +ENCODING 44241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR ACD2 +ENCODING 44242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR ACD3 +ENCODING 44243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR ACD4 +ENCODING 44244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +15 +3D +C5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR ACD5 +ENCODING 44245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +1D +25 +7D +85 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR ACD6 +ENCODING 44246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +1500 +3D00 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR ACD7 +ENCODING 44247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1D00 +1500 +3D00 +4500 +8500 +0900 +0C00 +3600 +6180 +ENDCHAR +STARTCHAR ACD8 +ENCODING 44248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +1500 +3D00 +C500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR ACD9 +ENCODING 44249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +15 +3D +C5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR ACDA +ENCODING 44250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +1500 +3D00 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR ACDB +ENCODING 44251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1D00 +2500 +5D00 +8100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR ACDC +ENCODING 44252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +15 +3D +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR ACDD +ENCODING 44253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR ACDE +ENCODING 44254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +15 +3D +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR ACDF +ENCODING 44255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +25 +5D +81 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR ACE0 +ENCODING 44256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +0080 +0080 +0880 +0880 +0900 +0800 +FFC0 +ENDCHAR +STARTCHAR ACE1 +ENCODING 44257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR ACE2 +ENCODING 44258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR ACE3 +ENCODING 44259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +0000 +7900 +0B00 +0A80 +0C00 +ENDCHAR +STARTCHAR ACE4 +ENCODING 44260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR ACE5 +ENCODING 44261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +0700 +2100 +2100 +2280 +1000 +ENDCHAR +STARTCHAR ACE6 +ENCODING 44262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +06 +8F +86 +89 +76 +ENDCHAR +STARTCHAR ACE7 +ENCODING 44263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR ACE8 +ENCODING 44264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0900 +0800 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR ACE9 +ENCODING 44265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +7F +11 +71 +41 +71 +ENDCHAR +STARTCHAR ACEA +ENCODING 44266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0900 +0800 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR ACEB +ENCODING 44267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +79 +1F +79 +49 +76 +ENDCHAR +STARTCHAR ACEC +ENCODING 44268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0900 +0800 +FFC0 +0000 +7900 +0900 +3900 +4280 +3CC0 +ENDCHAR +STARTCHAR ACED +ENCODING 44269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR ACEE +ENCODING 44270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR ACEF +ENCODING 44271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0900 +0800 +FFC0 +0000 +7B00 +0800 +7F80 +4480 +3B80 +ENDCHAR +STARTCHAR ACF0 +ENCODING 44272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR ACF1 +ENCODING 44273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR ACF2 +ENCODING 44274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +0000 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR ACF3 +ENCODING 44275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR ACF4 +ENCODING 44276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +0000 +1200 +1300 +6C80 +ENDCHAR +STARTCHAR ACF5 +ENCODING 44277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +1F00 +2100 +2180 +1F00 +ENDCHAR +STARTCHAR ACF6 +ENCODING 44278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0880 +0900 +0800 +FFC0 +0000 +3F00 +0300 +0E00 +7180 +ENDCHAR +STARTCHAR ACF7 +ENCODING 44279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR ACF8 +ENCODING 44280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +3F00 +0080 +3F00 +0080 +ENDCHAR +STARTCHAR ACF9 +ENCODING 44281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +01 +12 +FF +00 +3E +40 +7E +7E +ENDCHAR +STARTCHAR ACFA +ENCODING 44282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +0800 +FFC0 +0000 +3F00 +1200 +3F00 +ENDCHAR +STARTCHAR ACFB +ENCODING 44283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +12 +FF +00 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR ACFC +ENCODING 44284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +0480 +1480 +14C0 +1480 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR ACFD +ENCODING 44285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1480 +14C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR ACFE +ENCODING 44286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +3F00 +0880 +0880 +ENDCHAR +STARTCHAR ACFF +ENCODING 44287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR AD00 +ENCODING 44288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1480 +1480 +10C0 +FE80 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AD01 +ENCODING 44289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0300 +2080 +2100 +2280 +1800 +ENDCHAR +STARTCHAR AD02 +ENCODING 44290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR AD03 +ENCODING 44291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR AD04 +ENCODING 44292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AD05 +ENCODING 44293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AD06 +ENCODING 44294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +7F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR AD07 +ENCODING 44295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR AD08 +ENCODING 44296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AD09 +ENCODING 44297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR AD0A +ENCODING 44298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR AD0B +ENCODING 44299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR AD0C +ENCODING 44300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1480 +14C0 +1080 +FE80 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR AD0D +ENCODING 44301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1480 +14C0 +1080 +FE80 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR AD0E +ENCODING 44302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +0900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR AD0F +ENCODING 44303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1480 +14C0 +1080 +FE80 +0080 +0400 +0400 +1A00 +2180 +ENDCHAR +STARTCHAR AD10 +ENCODING 44304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +1100 +1100 +2A80 +4400 +ENDCHAR +STARTCHAR AD11 +ENCODING 44305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1480 +14C0 +1080 +FE80 +0080 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR AD12 +ENCODING 44306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +1F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AD13 +ENCODING 44307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR AD14 +ENCODING 44308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +1F80 +3F00 +0080 +ENDCHAR +STARTCHAR AD15 +ENCODING 44309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR AD16 +ENCODING 44310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +0480 +14C0 +1080 +FE80 +0000 +1F00 +1100 +3F80 +ENDCHAR +STARTCHAR AD17 +ENCODING 44311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0480 +14C0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR AD18 +ENCODING 44312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +0A80 +2A80 +2B80 +2A80 +2280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR AD19 +ENCODING 44313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AD1A +ENCODING 44314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR AD1B +ENCODING 44315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR AD1C +ENCODING 44316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7A80 +0A80 +2A80 +2B80 +2A80 +FE80 +0280 +2000 +2000 +2000 +1FC0 +ENDCHAR +STARTCHAR AD1D +ENCODING 44317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR AD1E +ENCODING 44318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR AD1F +ENCODING 44319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR AD20 +ENCODING 44320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +2B80 +2280 +FE80 +0000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR AD21 +ENCODING 44321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR AD22 +ENCODING 44322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR AD23 +ENCODING 44323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR AD24 +ENCODING 44324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR AD25 +ENCODING 44325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR AD26 +ENCODING 44326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR AD27 +ENCODING 44327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR AD28 +ENCODING 44328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR AD29 +ENCODING 44329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +2A80 +2B80 +2280 +FE80 +0000 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR AD2A +ENCODING 44330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +2900 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR AD2B +ENCODING 44331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR AD2C +ENCODING 44332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7A80 +0A80 +2A80 +2B80 +2280 +FE80 +0280 +1100 +1100 +3A80 +2640 +ENDCHAR +STARTCHAR AD2D +ENCODING 44333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +2A80 +2B80 +2280 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR AD2E +ENCODING 44334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR AD2F +ENCODING 44335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR AD30 +ENCODING 44336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR AD31 +ENCODING 44337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AD32 +ENCODING 44338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +2B80 +2280 +FE80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR AD33 +ENCODING 44339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +0A80 +2B80 +2280 +FA80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR AD34 +ENCODING 44340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +29 +29 +29 +21 +FD +01 +01 +01 +ENDCHAR +STARTCHAR AD35 +ENCODING 44341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +05 +29 +29 +21 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AD36 +ENCODING 44342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AD37 +ENCODING 44343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +2900 +2100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AD38 +ENCODING 44344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +05 +09 +29 +29 +21 +FD +01 +41 +40 +7F +ENDCHAR +STARTCHAR AD39 +ENCODING 44345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR AD3A +ENCODING 44346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR AD3B +ENCODING 44347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR AD3C +ENCODING 44348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +29 +21 +FD +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR AD3D +ENCODING 44349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR AD3E +ENCODING 44350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR AD3F +ENCODING 44351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AD40 +ENCODING 44352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AD41 +ENCODING 44353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AD42 +ENCODING 44354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR AD43 +ENCODING 44355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR AD44 +ENCODING 44356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +29 +21 +FD +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR AD45 +ENCODING 44357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +05 +29 +29 +21 +FD +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR AD46 +ENCODING 44358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR AD47 +ENCODING 44359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +2900 +2900 +2100 +FD00 +0100 +0800 +0C00 +3600 +6180 +ENDCHAR +STARTCHAR AD48 +ENCODING 44360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR AD49 +ENCODING 44361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +29 +29 +21 +FD +01 +3E +41 +41 +3E +ENDCHAR +STARTCHAR AD4A +ENCODING 44362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +2900 +2100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR AD4B +ENCODING 44363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +2900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR AD4C +ENCODING 44364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR AD4D +ENCODING 44365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR AD4E +ENCODING 44366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +29 +21 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR AD4F +ENCODING 44367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +29 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR AD50 +ENCODING 44368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +0080 +0080 +1480 +1480 +1400 +1400 +FFC0 +ENDCHAR +STARTCHAR AD51 +ENCODING 44369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR AD52 +ENCODING 44370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR AD53 +ENCODING 44371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +7900 +0B00 +0A80 +0C00 +ENDCHAR +STARTCHAR AD54 +ENCODING 44372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +0080 +1480 +1500 +1400 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AD55 +ENCODING 44373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0700 +2100 +2100 +2280 +1000 +ENDCHAR +STARTCHAR AD56 +ENCODING 44374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +06 +8F +86 +89 +76 +ENDCHAR +STARTCHAR AD57 +ENCODING 44375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR AD58 +ENCODING 44376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AD59 +ENCODING 44377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +7F +11 +71 +41 +71 +ENDCHAR +STARTCHAR AD5A +ENCODING 44378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR AD5B +ENCODING 44379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +79 +1F +79 +49 +76 +ENDCHAR +STARTCHAR AD5C +ENCODING 44380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AD5D +ENCODING 44381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR AD5E +ENCODING 44382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR AD5F +ENCODING 44383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +F7 +1F +77 +89 +76 +ENDCHAR +STARTCHAR AD60 +ENCODING 44384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR AD61 +ENCODING 44385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +0080 +0080 +1500 +1400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR AD62 +ENCODING 44386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR AD63 +ENCODING 44387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +0080 +0080 +1500 +1400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR AD64 +ENCODING 44388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +1200 +1300 +6C80 +ENDCHAR +STARTCHAR AD65 +ENCODING 44389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0C00 +3300 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR AD66 +ENCODING 44390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +0600 +3B80 +ENDCHAR +STARTCHAR AD67 +ENCODING 44391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR AD68 +ENCODING 44392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +3F00 +0080 +3F00 +0080 +ENDCHAR +STARTCHAR AD69 +ENCODING 44393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +01 +2A +FF +00 +3E +40 +7E +7E +ENDCHAR +STARTCHAR AD6A +ENCODING 44394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +1500 +1400 +FFC0 +0000 +3F00 +1200 +3F00 +ENDCHAR +STARTCHAR AD6B +ENCODING 44395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +01 +2A +FF +00 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR AD6C +ENCODING 44396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +0080 +0100 +0100 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR AD6D +ENCODING 44397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AD6E +ENCODING 44398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR AD6F +ENCODING 44399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR AD70 +ENCODING 44400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +0100 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR AD71 +ENCODING 44401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR AD72 +ENCODING 44402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0300 +4780 +4300 +4480 +3B00 +ENDCHAR +STARTCHAR AD73 +ENCODING 44403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0400 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AD74 +ENCODING 44404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AD75 +ENCODING 44405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AD76 +ENCODING 44406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR AD77 +ENCODING 44407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR AD78 +ENCODING 44408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AD79 +ENCODING 44409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR AD7A +ENCODING 44410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR AD7B +ENCODING 44411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +7B00 +0800 +7F80 +4480 +3B80 +ENDCHAR +STARTCHAR AD7C +ENCODING 44412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR AD7D +ENCODING 44413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +2480 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR AD7E +ENCODING 44414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR AD7F +ENCODING 44415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0400 +0400 +0C00 +1300 +6080 +ENDCHAR +STARTCHAR AD80 +ENCODING 44416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR AD81 +ENCODING 44417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0400 +1F00 +2180 +2180 +1F00 +ENDCHAR +STARTCHAR AD82 +ENCODING 44418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0400 +3F00 +0200 +0E00 +7180 +ENDCHAR +STARTCHAR AD83 +ENCODING 44419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR AD84 +ENCODING 44420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR AD85 +ENCODING 44421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +3F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR AD86 +ENCODING 44422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +0400 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR AD87 +ENCODING 44423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0400 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR AD88 +ENCODING 44424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +0480 +0480 +0480 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR AD89 +ENCODING 44425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +FD +21 +27 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AD8A +ENCODING 44426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AD8B +ENCODING 44427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +0900 +FD00 +2700 +2100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AD8C +ENCODING 44428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +09 +FF +21 +27 +21 +41 +40 +7F +ENDCHAR +STARTCHAR AD8D +ENCODING 44429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +47 +42 +45 +30 +ENDCHAR +STARTCHAR AD8E +ENCODING 44430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR AD8F +ENCODING 44431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR AD90 +ENCODING 44432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +09 +FF +21 +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR AD91 +ENCODING 44433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR AD92 +ENCODING 44434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR AD93 +ENCODING 44435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AD94 +ENCODING 44436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AD95 +ENCODING 44437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AD96 +ENCODING 44438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR AD97 +ENCODING 44439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR AD98 +ENCODING 44440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR AD99 +ENCODING 44441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR AD9A +ENCODING 44442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +52 +72 +55 +78 +ENDCHAR +STARTCHAR AD9B +ENCODING 44443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR AD9C +ENCODING 44444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +FF00 +2100 +2700 +0100 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR AD9D +ENCODING 44445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +FF +21 +27 +01 +3E +41 +41 +3E +ENDCHAR +STARTCHAR AD9E +ENCODING 44446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +0900 +FD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR AD9F +ENCODING 44447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +0900 +FD00 +2700 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR ADA0 +ENCODING 44448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +7F +3F +01 +01 +ENDCHAR +STARTCHAR ADA1 +ENCODING 44449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR ADA2 +ENCODING 44450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +27 +21 +7F +12 +3F +ENDCHAR +STARTCHAR ADA3 +ENCODING 44451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +27 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR ADA4 +ENCODING 44452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +0A80 +0A80 +FE80 +1280 +1680 +1280 +1280 +1280 +0280 +ENDCHAR +STARTCHAR ADA5 +ENCODING 44453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +7F +01 +01 +01 +ENDCHAR +STARTCHAR ADA6 +ENCODING 44454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +3F +09 +09 +09 +ENDCHAR +STARTCHAR ADA7 +ENCODING 44455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +1300 +FB00 +2B00 +2100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR ADA8 +ENCODING 44456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +1280 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR ADA9 +ENCODING 44457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +1300 +FB00 +2B00 +2100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR ADAA +ENCODING 44458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR ADAB +ENCODING 44459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +3F +40 +7F +ENDCHAR +STARTCHAR ADAC +ENCODING 44460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +1F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR ADAD +ENCODING 44461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +1F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR ADAE +ENCODING 44462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR ADAF +ENCODING 44463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +1E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR ADB0 +ENCODING 44464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +3900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR ADB1 +ENCODING 44465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +1F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR ADB2 +ENCODING 44466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR ADB3 +ENCODING 44467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR ADB4 +ENCODING 44468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +3F +41 +7F +ENDCHAR +STARTCHAR ADB5 +ENCODING 44469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +41 +7F +7F +ENDCHAR +STARTCHAR ADB6 +ENCODING 44470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +1300 +FB00 +2B00 +2100 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR ADB7 +ENCODING 44471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7A80 +0A80 +0A80 +FE80 +1280 +1680 +1280 +0480 +0600 +1B00 +30C0 +ENDCHAR +STARTCHAR ADB8 +ENCODING 44472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +02 +22 +55 +08 +ENDCHAR +STARTCHAR ADB9 +ENCODING 44473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +3E +41 +61 +1E +ENDCHAR +STARTCHAR ADBA +ENCODING 44474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +1300 +FB00 +2B00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR ADBB +ENCODING 44475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR ADBC +ENCODING 44476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +3F +01 +3F +01 +ENDCHAR +STARTCHAR ADBD +ENCODING 44477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR ADBE +ENCODING 44478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +13 +FB +2B +21 +3F +12 +3F +ENDCHAR +STARTCHAR ADBF +ENCODING 44479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +0A80 +0A80 +FE80 +1680 +0E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR ADC0 +ENCODING 44480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +0480 +0480 +0480 +FE80 +1080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR ADC1 +ENCODING 44481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +09 +FD +21 +20 +7F +01 +01 +01 +ENDCHAR +STARTCHAR ADC2 +ENCODING 44482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR ADC3 +ENCODING 44483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +0900 +FD00 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR ADC4 +ENCODING 44484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +09 +FF +21 +21 +21 +41 +40 +7F +ENDCHAR +STARTCHAR ADC5 +ENCODING 44485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR ADC6 +ENCODING 44486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR ADC7 +ENCODING 44487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +3F +40 +7E +ENDCHAR +STARTCHAR ADC8 +ENCODING 44488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +FF +21 +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR ADC9 +ENCODING 44489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR ADCA +ENCODING 44490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR ADCB +ENCODING 44491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR ADCC +ENCODING 44492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR ADCD +ENCODING 44493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR ADCE +ENCODING 44494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR ADCF +ENCODING 44495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR ADD0 +ENCODING 44496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +09 +FF +21 +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR ADD1 +ENCODING 44497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +09 +FF +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR ADD2 +ENCODING 44498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR ADD3 +ENCODING 44499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +0900 +FF00 +2100 +2100 +2800 +0C00 +3200 +6180 +ENDCHAR +STARTCHAR ADD4 +ENCODING 44500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR ADD5 +ENCODING 44501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +3E +41 +63 +1C +ENDCHAR +STARTCHAR ADD6 +ENCODING 44502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +0900 +FD00 +2100 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR ADD7 +ENCODING 44503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +0900 +FD00 +2100 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR ADD8 +ENCODING 44504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR ADD9 +ENCODING 44505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR ADDA +ENCODING 44506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +FD +21 +00 +7F +12 +3F +ENDCHAR +STARTCHAR ADDB +ENCODING 44507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +FD +21 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR ADDC +ENCODING 44508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +0080 +0100 +0100 +FFC0 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR ADDD +ENCODING 44509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR ADDE +ENCODING 44510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR ADDF +ENCODING 44511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR ADE0 +ENCODING 44512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +0100 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR ADE1 +ENCODING 44513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +2180 +2100 +2280 +1800 +ENDCHAR +STARTCHAR ADE2 +ENCODING 44514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +06 +8F +86 +89 +76 +ENDCHAR +STARTCHAR ADE3 +ENCODING 44515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR ADE4 +ENCODING 44516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR ADE5 +ENCODING 44517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR ADE6 +ENCODING 44518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR ADE7 +ENCODING 44519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR ADE8 +ENCODING 44520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR ADE9 +ENCODING 44521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +66 +18 +7F +48 +77 +ENDCHAR +STARTCHAR ADEA +ENCODING 44522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR ADEB +ENCODING 44523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +01 +02 +FD +24 +66 +1F +76 +89 +76 +ENDCHAR +STARTCHAR ADEC +ENCODING 44524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR ADED +ENCODING 44525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR ADEE +ENCODING 44526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR ADEF +ENCODING 44527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR ADF0 +ENCODING 44528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR ADF1 +ENCODING 44529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR ADF2 +ENCODING 44530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR ADF3 +ENCODING 44531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +1100 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR ADF4 +ENCODING 44532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR ADF5 +ENCODING 44533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +01 +01 +02 +FD +24 +7E +40 +7E +7E +ENDCHAR +STARTCHAR ADF6 +ENCODING 44534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +1200 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR ADF7 +ENCODING 44535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +1100 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR ADF8 +ENCODING 44536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +0080 +0080 +0080 +0100 +0100 +0100 +FFC0 +ENDCHAR +STARTCHAR ADF9 +ENCODING 44537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR ADFA +ENCODING 44538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR ADFB +ENCODING 44539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0000 +7900 +0B00 +0A80 +0C00 +ENDCHAR +STARTCHAR ADFC +ENCODING 44540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +0100 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR ADFD +ENCODING 44541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0700 +2100 +2100 +2280 +1000 +ENDCHAR +STARTCHAR ADFE +ENCODING 44542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0300 +4780 +4300 +4480 +3B00 +ENDCHAR +STARTCHAR ADFF +ENCODING 44543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +0000 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AE00 +ENCODING 44544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AE01 +ENCODING 44545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AE02 +ENCODING 44546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR AE03 +ENCODING 44547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +3C80 +0F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR AE04 +ENCODING 44548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AE05 +ENCODING 44549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR AE06 +ENCODING 44550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR AE07 +ENCODING 44551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +7B80 +0F80 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR AE08 +ENCODING 44552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR AE09 +ENCODING 44553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +2080 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR AE0A +ENCODING 44554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0000 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR AE0B +ENCODING 44555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +0100 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR AE0C +ENCODING 44556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0000 +1200 +1300 +6C80 +ENDCHAR +STARTCHAR AE0D +ENCODING 44557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +0080 +0100 +FFC0 +0000 +0000 +1F00 +2100 +2180 +1F00 +ENDCHAR +STARTCHAR AE0E +ENCODING 44558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0000 +3F00 +0600 +3B80 +ENDCHAR +STARTCHAR AE0F +ENCODING 44559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR AE10 +ENCODING 44560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +3F00 +0080 +3F00 +0080 +ENDCHAR +STARTCHAR AE11 +ENCODING 44561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR AE12 +ENCODING 44562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0000 +3F00 +1200 +3F00 +ENDCHAR +STARTCHAR AE13 +ENCODING 44563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +0100 +FFC0 +0000 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR AE14 +ENCODING 44564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +0480 +0480 +0480 +0480 +0480 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AE15 +ENCODING 44565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AE16 +ENCODING 44566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AE17 +ENCODING 44567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +0900 +0100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AE18 +ENCODING 44568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +09 +FD +01 +01 +40 +7F +ENDCHAR +STARTCHAR AE19 +ENCODING 44569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR AE1A +ENCODING 44570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR AE1B +ENCODING 44571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR AE1C +ENCODING 44572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR AE1D +ENCODING 44573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR AE1E +ENCODING 44574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR AE1F +ENCODING 44575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AE20 +ENCODING 44576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AE21 +ENCODING 44577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AE22 +ENCODING 44578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR AE23 +ENCODING 44579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR AE24 +ENCODING 44580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR AE25 +ENCODING 44581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR AE26 +ENCODING 44582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR AE27 +ENCODING 44583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +01 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR AE28 +ENCODING 44584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR AE29 +ENCODING 44585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR AE2A +ENCODING 44586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +0900 +0100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR AE2B +ENCODING 44587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +0900 +0500 +F900 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR AE2C +ENCODING 44588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR AE2D +ENCODING 44589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR AE2E +ENCODING 44590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +09 +01 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR AE2F +ENCODING 44591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +09 +05 +F9 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR AE30 +ENCODING 44592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +11 +21 +41 +81 +01 +01 +01 +ENDCHAR +STARTCHAR AE31 +ENCODING 44593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +61 +81 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AE32 +ENCODING 44594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +11 +21 +41 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AE33 +ENCODING 44595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +1100 +2100 +4100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AE34 +ENCODING 44596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +31 +61 +81 +01 +20 +20 +3F +ENDCHAR +STARTCHAR AE35 +ENCODING 44597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +11 +21 +41 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR AE36 +ENCODING 44598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR AE37 +ENCODING 44599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +61 +81 +00 +3F +20 +20 +3F +ENDCHAR +STARTCHAR AE38 +ENCODING 44600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +61 +80 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AE39 +ENCODING 44601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR AE3A +ENCODING 44602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +21 +C0 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AE3B +ENCODING 44603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AE3C +ENCODING 44604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AE3D +ENCODING 44605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AE3E +ENCODING 44606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AE3F +ENCODING 44607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR AE40 +ENCODING 44608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +61 +81 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AE41 +ENCODING 44609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +61 +80 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR AE42 +ENCODING 44610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +1100 +2100 +4100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AE43 +ENCODING 44611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +1100 +1100 +6100 +8100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR AE44 +ENCODING 44612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +1100 +2100 +4100 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR AE45 +ENCODING 44613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +21 +C1 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR AE46 +ENCODING 44614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +1100 +6100 +8100 +0000 +3F00 +0200 +0E00 +7180 +ENDCHAR +STARTCHAR AE47 +ENCODING 44615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +1100 +2100 +C100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR AE48 +ENCODING 44616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +11 +21 +41 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AE49 +ENCODING 44617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR AE4A +ENCODING 44618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +61 +81 +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR AE4B +ENCODING 44619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +11 +21 +C1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR AE4C +ENCODING 44620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +2900 +4900 +4980 +9100 +9100 +2100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AE4D +ENCODING 44621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +4900 +9100 +2100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AE4E +ENCODING 44622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +4900 +9100 +2100 +0000 +7E00 +1100 +1100 +1100 +ENDCHAR +STARTCHAR AE4F +ENCODING 44623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2900 +4980 +9100 +2100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR AE50 +ENCODING 44624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4900 +4980 +8900 +9100 +2100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR AE51 +ENCODING 44625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2900 +4980 +9100 +2100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR AE52 +ENCODING 44626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR AE53 +ENCODING 44627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2900 +4980 +9100 +2100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR AE54 +ENCODING 44628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +D100 +A100 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR AE55 +ENCODING 44629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AE56 +ENCODING 44630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +D100 +A100 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR AE57 +ENCODING 44631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +3400 +0C80 +3F80 +4480 +3F00 +ENDCHAR +STARTCHAR AE58 +ENCODING 44632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +3900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AE59 +ENCODING 44633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR AE5A +ENCODING 44634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR AE5B +ENCODING 44635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +3B00 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR AE5C +ENCODING 44636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +4900 +9100 +2100 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR AE5D +ENCODING 44637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +4900 +9100 +2100 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR AE5E +ENCODING 44638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2900 +4980 +9100 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AE5F +ENCODING 44639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4900 +4980 +8900 +9100 +2100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR AE60 +ENCODING 44640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4900 +4980 +9100 +2100 +0000 +2200 +2200 +5600 +8980 +ENDCHAR +STARTCHAR AE61 +ENCODING 44641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4900 +5180 +A100 +0100 +3C00 +6200 +4100 +6200 +3C00 +ENDCHAR +STARTCHAR AE62 +ENCODING 44642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2900 +4980 +9100 +2100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR AE63 +ENCODING 44643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR AE64 +ENCODING 44644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +2900 +4980 +9100 +2100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR AE65 +ENCODING 44645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +5100 +A100 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR AE66 +ENCODING 44646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2900 +4980 +9100 +2100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR AE67 +ENCODING 44647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +24C0 +C880 +1000 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR AE68 +ENCODING 44648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +2680 +2680 +2A80 +2980 +4A80 +9280 +1280 +0280 +0280 +0280 +ENDCHAR +STARTCHAR AE69 +ENCODING 44649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +4D +93 +95 +25 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AE6A +ENCODING 44650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +4D +53 +95 +25 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AE6B +ENCODING 44651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4D00 +5300 +9500 +2500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AE6C +ENCODING 44652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6E80 +2680 +2680 +2980 +4A80 +8A80 +1280 +0280 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR AE6D +ENCODING 44653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4D00 +5300 +9500 +2500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AE6E +ENCODING 44654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR AE6F +ENCODING 44655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4D +53 +95 +25 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AE70 +ENCODING 44656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +53 +95 +A5 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AE71 +ENCODING 44657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR AE72 +ENCODING 44658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR AE73 +ENCODING 44659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR AE74 +ENCODING 44660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR AE75 +ENCODING 44661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR AE76 +ENCODING 44662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR AE77 +ENCODING 44663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR AE78 +ENCODING 44664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +4B +95 +95 +25 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AE79 +ENCODING 44665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +4B +95 +95 +25 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR AE7A +ENCODING 44666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4D00 +5300 +9500 +2500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AE7B +ENCODING 44667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +DD00 +4D00 +4D00 +9300 +9500 +2500 +0500 +0900 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR AE7C +ENCODING 44668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +DD00 +4D00 +4B00 +9500 +9500 +2500 +0000 +1200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR AE7D +ENCODING 44669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +53 +95 +A5 +01 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR AE7E +ENCODING 44670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4D00 +5300 +9500 +2500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AE7F +ENCODING 44671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR AE80 +ENCODING 44672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +4D +53 +95 +25 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AE81 +ENCODING 44673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AE82 +ENCODING 44674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4D +53 +95 +25 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AE83 +ENCODING 44675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2680 +2980 +CA80 +1080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR AE84 +ENCODING 44676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +2980 +4900 +4900 +9180 +9100 +2100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AE85 +ENCODING 44677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4980 +4900 +9180 +2100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR AE86 +ENCODING 44678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR AE87 +ENCODING 44679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR AE88 +ENCODING 44680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2980 +4900 +8900 +1180 +2100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR AE89 +ENCODING 44681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR AE8A +ENCODING 44682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR AE8B +ENCODING 44683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR AE8C +ENCODING 44684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2980 +4900 +5180 +A100 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR AE8D +ENCODING 44685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AE8E +ENCODING 44686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3B00 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR AE8F +ENCODING 44687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3400 +0C80 +3F80 +4480 +3F00 +ENDCHAR +STARTCHAR AE90 +ENCODING 44688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AE91 +ENCODING 44689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR AE92 +ENCODING 44690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR AE93 +ENCODING 44691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3B00 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR AE94 +ENCODING 44692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR AE95 +ENCODING 44693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR AE96 +ENCODING 44694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AE97 +ENCODING 44695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR AE98 +ENCODING 44696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR AE99 +ENCODING 44697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +1800 +2600 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR AE9A +ENCODING 44698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR AE9B +ENCODING 44699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR AE9C +ENCODING 44700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR AE9D +ENCODING 44701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +3F80 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR AE9E +ENCODING 44702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +2980 +4900 +9180 +2100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR AE9F +ENCODING 44703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +2480 +C8C0 +1000 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR AEA0 +ENCODING 44704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +4F +55 +95 +93 +25 +05 +05 +01 +ENDCHAR +STARTCHAR AEA1 +ENCODING 44705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +4B +55 +93 +25 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AEA2 +ENCODING 44706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +4B +55 +93 +25 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AEA3 +ENCODING 44707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4B00 +5500 +9300 +2500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AEA4 +ENCODING 44708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4F +4D +95 +27 +05 +01 +20 +3F +ENDCHAR +STARTCHAR AEA5 +ENCODING 44709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4B00 +5500 +9300 +2500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AEA6 +ENCODING 44710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR AEA7 +ENCODING 44711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4B +55 +93 +25 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AEA8 +ENCODING 44712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AEA9 +ENCODING 44713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR AEAA +ENCODING 44714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR AEAB +ENCODING 44715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR AEAC +ENCODING 44716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR AEAD +ENCODING 44717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR AEAE +ENCODING 44718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR AEAF +ENCODING 44719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR AEB0 +ENCODING 44720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4B +55 +93 +25 +00 +3F +41 +7F +ENDCHAR +STARTCHAR AEB1 +ENCODING 44721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4B +55 +93 +25 +00 +21 +3F +3F +ENDCHAR +STARTCHAR AEB2 +ENCODING 44722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4B00 +5500 +9300 +2500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AEB3 +ENCODING 44723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4B +55 +93 +25 +01 +08 +14 +63 +ENDCHAR +STARTCHAR AEB4 +ENCODING 44724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4B00 +5500 +9300 +2500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR AEB5 +ENCODING 44725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +4B +55 +93 +25 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR AEB6 +ENCODING 44726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DD00 +4B00 +5500 +9300 +2500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AEB7 +ENCODING 44727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR AEB8 +ENCODING 44728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +4B +55 +93 +25 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AEB9 +ENCODING 44729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AEBA +ENCODING 44730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DD +4B +55 +93 +25 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AEBB +ENCODING 44731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2580 +2A80 +C980 +1080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR AEBC +ENCODING 44732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +29 +4F +49 +91 +91 +21 +01 +01 +01 +ENDCHAR +STARTCHAR AEBD +ENCODING 44733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +27 +49 +91 +21 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AEBE +ENCODING 44734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +27 +49 +91 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AEBF +ENCODING 44735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4F00 +9100 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AEC0 +ENCODING 44736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +29 +4F +49 +91 +21 +01 +40 +40 +3F +ENDCHAR +STARTCHAR AEC1 +ENCODING 44737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +29 +4F +91 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR AEC2 +ENCODING 44738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR AEC3 +ENCODING 44739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +29 +4F +91 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR AEC4 +ENCODING 44740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +4F +59 +B1 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AEC5 +ENCODING 44741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR AEC6 +ENCODING 44742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AEC7 +ENCODING 44743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AEC8 +ENCODING 44744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AEC9 +ENCODING 44745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AECA +ENCODING 44746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AECB +ENCODING 44747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR AECC +ENCODING 44748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +29 +4F +99 +31 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AECD +ENCODING 44749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +29 +4F +99 +31 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR AECE +ENCODING 44750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4F00 +9100 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AECF +ENCODING 44751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2500 +2900 +4F00 +4900 +9100 +2100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR AED0 +ENCODING 44752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2500 +2900 +4F00 +9900 +3100 +0100 +1200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR AED1 +ENCODING 44753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +29 +4F +99 +31 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR AED2 +ENCODING 44754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4F00 +9100 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR AED3 +ENCODING 44755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +2900 +4F00 +9100 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR AED4 +ENCODING 44756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +29 +4F +91 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AED5 +ENCODING 44757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR AED6 +ENCODING 44758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +29 +4F +91 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AED7 +ENCODING 44759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +4F +91 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR AED8 +ENCODING 44760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +6E80 +2680 +2680 +2680 +2A80 +4A80 +9280 +1280 +0280 +0280 +0280 +ENDCHAR +STARTCHAR AED9 +ENCODING 44761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +4D +95 +95 +25 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AEDA +ENCODING 44762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DB +4B +57 +93 +21 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AEDB +ENCODING 44763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4B00 +5700 +9300 +2100 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AEDC +ENCODING 44764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6E80 +2680 +2680 +2680 +4A80 +8A80 +1280 +0280 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR AEDD +ENCODING 44765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4B00 +5700 +9300 +2100 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AEDE +ENCODING 44766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR AEDF +ENCODING 44767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4B +57 +93 +21 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AEE0 +ENCODING 44768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AEE1 +ENCODING 44769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR AEE2 +ENCODING 44770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR AEE3 +ENCODING 44771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR AEE4 +ENCODING 44772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR AEE5 +ENCODING 44773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR AEE6 +ENCODING 44774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR AEE7 +ENCODING 44775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR AEE8 +ENCODING 44776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +4D +9D +95 +25 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR AEE9 +ENCODING 44777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4B +57 +93 +21 +00 +21 +3F +3F +ENDCHAR +STARTCHAR AEEA +ENCODING 44778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4B00 +5700 +9300 +2100 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AEEB +ENCODING 44779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6E80 +2680 +2680 +2680 +4A80 +8A80 +1280 +0480 +0600 +1B00 +20C0 +ENDCHAR +STARTCHAR AEEC +ENCODING 44780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4B00 +5700 +9300 +2100 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR AEED +ENCODING 44781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +4D +4D +9D +95 +25 +01 +3E +21 +21 +3E +ENDCHAR +STARTCHAR AEEE +ENCODING 44782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4B00 +5700 +9300 +2100 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AEEF +ENCODING 44783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR AEF0 +ENCODING 44784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DB +4B +57 +93 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AEF1 +ENCODING 44785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AEF2 +ENCODING 44786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4B +57 +93 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AEF3 +ENCODING 44787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2580 +2B80 +C980 +1080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR AEF4 +ENCODING 44788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +27 +49 +49 +8F +91 +21 +01 +01 +01 +ENDCHAR +STARTCHAR AEF5 +ENCODING 44789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +2F +49 +93 +21 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR AEF6 +ENCODING 44790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +2F +49 +93 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AEF7 +ENCODING 44791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2F00 +4900 +9300 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AEF8 +ENCODING 44792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +27 +49 +49 +97 +21 +01 +40 +40 +3F +ENDCHAR +STARTCHAR AEF9 +ENCODING 44793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +2F +49 +93 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR AEFA +ENCODING 44794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR AEFB +ENCODING 44795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +2F +49 +93 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR AEFC +ENCODING 44796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +27 +49 +4F +B1 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR AEFD +ENCODING 44797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR AEFE +ENCODING 44798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AEFF +ENCODING 44799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AF00 +ENCODING 44800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR AF01 +ENCODING 44801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AF02 +ENCODING 44802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR AF03 +ENCODING 44803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR AF04 +ENCODING 44804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +2F +49 +93 +21 +00 +7F +41 +7F +ENDCHAR +STARTCHAR AF05 +ENCODING 44805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +2F +49 +93 +21 +01 +41 +7F +7F +ENDCHAR +STARTCHAR AF06 +ENCODING 44806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2F00 +4900 +9300 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AF07 +ENCODING 44807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2500 +2700 +4900 +4F00 +9100 +2100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR AF08 +ENCODING 44808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2500 +2700 +4900 +9F00 +3100 +0000 +1200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR AF09 +ENCODING 44809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +2F +49 +93 +21 +0C +32 +41 +23 +1C +ENDCHAR +STARTCHAR AF0A +ENCODING 44810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2F00 +4900 +9300 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR AF0B +ENCODING 44811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +2700 +4900 +9700 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR AF0C +ENCODING 44812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +2F +49 +93 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AF0D +ENCODING 44813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +27 +49 +4F +B1 +00 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR AF0E +ENCODING 44814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +2F +49 +93 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AF0F +ENCODING 44815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +27 +49 +97 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR AF10 +ENCODING 44816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +2680 +2680 +2A80 +2A80 +4E80 +9280 +1280 +0280 +0280 +0280 +ENDCHAR +STARTCHAR AF11 +ENCODING 44817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DB +4D +53 +9D +21 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AF12 +ENCODING 44818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DB +4D +53 +9D +21 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AF13 +ENCODING 44819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4D00 +5300 +9D00 +2100 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AF14 +ENCODING 44820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4D +4B +95 +23 +03 +01 +20 +3F +ENDCHAR +STARTCHAR AF15 +ENCODING 44821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4D00 +5300 +9D00 +2100 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR AF16 +ENCODING 44822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR AF17 +ENCODING 44823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4D +53 +9D +21 +00 +3F +40 +7F +ENDCHAR +STARTCHAR AF18 +ENCODING 44824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AF19 +ENCODING 44825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR AF1A +ENCODING 44826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR AF1B +ENCODING 44827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR AF1C +ENCODING 44828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR AF1D +ENCODING 44829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR AF1E +ENCODING 44830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR AF1F +ENCODING 44831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR AF20 +ENCODING 44832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4D +53 +9D +21 +00 +3F +41 +7F +ENDCHAR +STARTCHAR AF21 +ENCODING 44833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4D +53 +9D +21 +00 +21 +3F +3F +ENDCHAR +STARTCHAR AF22 +ENCODING 44834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4D00 +5300 +9D00 +2100 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR AF23 +ENCODING 44835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4D +57 +93 +23 +01 +08 +14 +63 +ENDCHAR +STARTCHAR AF24 +ENCODING 44836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4D00 +5300 +9D00 +2100 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR AF25 +ENCODING 44837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DB +4D +57 +93 +23 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR AF26 +ENCODING 44838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +DB00 +4D00 +5300 +9D00 +2100 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AF27 +ENCODING 44839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR AF28 +ENCODING 44840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DB +4D +53 +9D +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AF29 +ENCODING 44841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR AF2A +ENCODING 44842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +DB +4D +53 +9D +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR AF2B +ENCODING 44843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6D80 +2680 +2B80 +C980 +1080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR AF2C +ENCODING 44844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7F80 +0880 +0880 +0880 +1080 +1480 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR AF2D +ENCODING 44845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AF2E +ENCODING 44846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR AF2F +ENCODING 44847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0000 +7900 +0B00 +0A80 +0C00 +ENDCHAR +STARTCHAR AF30 +ENCODING 44848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AF31 +ENCODING 44849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0700 +2100 +2100 +2280 +1000 +ENDCHAR +STARTCHAR AF32 +ENCODING 44850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +1480 +0400 +FFC0 +0000 +0300 +4000 +4780 +4480 +3B80 +ENDCHAR +STARTCHAR AF33 +ENCODING 44851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR AF34 +ENCODING 44852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +1480 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AF35 +ENCODING 44853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +7F +11 +71 +41 +71 +ENDCHAR +STARTCHAR AF36 +ENCODING 44854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR AF37 +ENCODING 44855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +79 +1F +79 +49 +76 +ENDCHAR +STARTCHAR AF38 +ENCODING 44856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AF39 +ENCODING 44857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR AF3A +ENCODING 44858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR AF3B +ENCODING 44859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +F7 +1F +77 +89 +76 +ENDCHAR +STARTCHAR AF3C +ENCODING 44860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR AF3D +ENCODING 44861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR AF3E +ENCODING 44862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0000 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR AF3F +ENCODING 44863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR AF40 +ENCODING 44864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0000 +1200 +1300 +6C80 +ENDCHAR +STARTCHAR AF41 +ENCODING 44865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +1F00 +2100 +2180 +1F00 +ENDCHAR +STARTCHAR AF42 +ENCODING 44866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +1480 +0400 +FFC0 +0000 +3F00 +0200 +0E00 +7180 +ENDCHAR +STARTCHAR AF43 +ENCODING 44867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +1480 +FFC0 +0000 +0E00 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR AF44 +ENCODING 44868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +3F00 +0080 +3F00 +0080 +ENDCHAR +STARTCHAR AF45 +ENCODING 44869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +11 +28 +08 +F7 +3E +40 +7E +7E +ENDCHAR +STARTCHAR AF46 +ENCODING 44870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0880 +1480 +0400 +FFC0 +0000 +3F00 +1200 +3F00 +ENDCHAR +STARTCHAR AF47 +ENCODING 44871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +28 +08 +F7 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR AF48 +ENCODING 44872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2280 +2280 +2480 +3480 +10C0 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AF49 +ENCODING 44873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +1280 +2280 +34C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AF4A +ENCODING 44874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +3F00 +0880 +0880 +ENDCHAR +STARTCHAR AF4B +ENCODING 44875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR AF4C +ENCODING 44876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +2500 +4500 +6180 +2100 +FD00 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR AF4D +ENCODING 44877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0300 +2080 +2100 +2280 +1800 +ENDCHAR +STARTCHAR AF4E +ENCODING 44878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR AF4F +ENCODING 44879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR AF50 +ENCODING 44880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2280 +3480 +10C0 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AF51 +ENCODING 44881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AF52 +ENCODING 44882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR AF53 +ENCODING 44883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR AF54 +ENCODING 44884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AF55 +ENCODING 44885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR AF56 +ENCODING 44886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR AF57 +ENCODING 44887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR AF58 +ENCODING 44888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR AF59 +ENCODING 44889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR AF5A +ENCODING 44890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +0900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR AF5B +ENCODING 44891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR AF5C +ENCODING 44892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +1280 +2280 +34C0 +1080 +FE80 +0080 +1100 +1100 +3300 +4C80 +ENDCHAR +STARTCHAR AF5D +ENCODING 44893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +1280 +2280 +34C0 +1080 +FE80 +0080 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR AF5E +ENCODING 44894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +1F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR AF5F +ENCODING 44895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR AF60 +ENCODING 44896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +1F80 +3F00 +0080 +ENDCHAR +STARTCHAR AF61 +ENCODING 44897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR AF62 +ENCODING 44898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +6C80 +2280 +24C0 +1080 +FE80 +0000 +1F00 +1100 +3F80 +ENDCHAR +STARTCHAR AF63 +ENCODING 44899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +2280 +34C0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR AF64 +ENCODING 44900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +2680 +2680 +2680 +5980 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR AF65 +ENCODING 44901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +4D +4D +B3 +25 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AF66 +ENCODING 44902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AF67 +ENCODING 44903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +7700 +2500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AF68 +ENCODING 44904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +4D +4F +25 +25 +D5 +05 +20 +3F +ENDCHAR +STARTCHAR AF69 +ENCODING 44905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +7700 +2500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR AF6A +ENCODING 44906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR AF6B +ENCODING 44907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR AF6C +ENCODING 44908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR AF6D +ENCODING 44909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR AF6E +ENCODING 44910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR AF6F +ENCODING 44911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR AF70 +ENCODING 44912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR AF71 +ENCODING 44913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR AF72 +ENCODING 44914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR AF73 +ENCODING 44915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +2700 +2500 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR AF74 +ENCODING 44916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR AF75 +ENCODING 44917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR AF76 +ENCODING 44918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +7700 +2500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR AF77 +ENCODING 44919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR AF78 +ENCODING 44920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +7700 +2500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR AF79 +ENCODING 44921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +4D +4D +B3 +25 +FD +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR AF7A +ENCODING 44922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +7700 +2500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR AF7B +ENCODING 44923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +4D00 +2700 +2500 +F500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR AF7C +ENCODING 44924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR AF7D +ENCODING 44925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR AF7E +ENCODING 44926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +4D +77 +25 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR AF7F +ENCODING 44927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +4D +27 +25 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR AF80 +ENCODING 44928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +D9 +45 +45 +45 +65 +21 +21 +FD +01 +01 +01 +ENDCHAR +STARTCHAR AF81 +ENCODING 44929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AF82 +ENCODING 44930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AF83 +ENCODING 44931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4500 +4900 +2100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AF84 +ENCODING 44932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +D9 +25 +45 +55 +11 +FD +01 +41 +40 +40 +7F +ENDCHAR +STARTCHAR AF85 +ENCODING 44933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR AF86 +ENCODING 44934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR AF87 +ENCODING 44935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR AF88 +ENCODING 44936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +55 +11 +FD +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR AF89 +ENCODING 44937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR AF8A +ENCODING 44938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR AF8B +ENCODING 44939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AF8C +ENCODING 44940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AF8D +ENCODING 44941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AF8E +ENCODING 44942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR AF8F +ENCODING 44943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR AF90 +ENCODING 44944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +25 +45 +55 +11 +FD +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR AF91 +ENCODING 44945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +25 +45 +55 +11 +FD +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR AF92 +ENCODING 44946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR AF93 +ENCODING 44947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR AF94 +ENCODING 44948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR AF95 +ENCODING 44949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +DD +25 +45 +55 +11 +FD +01 +3E +41 +41 +3E +ENDCHAR +STARTCHAR AF96 +ENCODING 44950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4500 +4900 +2100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR AF97 +ENCODING 44951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4500 +4900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR AF98 +ENCODING 44952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR AF99 +ENCODING 44953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR AF9A +ENCODING 44954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +21 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR AF9B +ENCODING 44955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR AF9C +ENCODING 44956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7780 +0880 +1080 +1080 +1080 +2A80 +0A00 +0A00 +FFC0 +ENDCHAR +STARTCHAR AF9D +ENCODING 44957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR AF9E +ENCODING 44958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR AF9F +ENCODING 44959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +7900 +0B00 +0A80 +0C00 +ENDCHAR +STARTCHAR AFA0 +ENCODING 44960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +11 +21 +14 +FF +00 +40 +40 +7E +ENDCHAR +STARTCHAR AFA1 +ENCODING 44961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0700 +2100 +2100 +2280 +1000 +ENDCHAR +STARTCHAR AFA2 +ENCODING 44962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +06 +8F +86 +89 +76 +ENDCHAR +STARTCHAR AFA3 +ENCODING 44963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR AFA4 +ENCODING 44964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +11 +34 +FF +00 +7E +01 +7E +7E +ENDCHAR +STARTCHAR AFA5 +ENCODING 44965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +7F +11 +71 +41 +71 +ENDCHAR +STARTCHAR AFA6 +ENCODING 44966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR AFA7 +ENCODING 44967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +79 +1F +79 +49 +76 +ENDCHAR +STARTCHAR AFA8 +ENCODING 44968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AFA9 +ENCODING 44969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR AFAA +ENCODING 44970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR AFAB +ENCODING 44971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +F7 +1F +77 +89 +76 +ENDCHAR +STARTCHAR AFAC +ENCODING 44972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR AFAD +ENCODING 44973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +2000 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR AFAE +ENCODING 44974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR AFAF +ENCODING 44975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR AFB0 +ENCODING 44976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +1200 +1300 +6C80 +ENDCHAR +STARTCHAR AFB1 +ENCODING 44977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0C00 +3300 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR AFB2 +ENCODING 44978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +3F00 +0600 +3B80 +ENDCHAR +STARTCHAR AFB3 +ENCODING 44979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR AFB4 +ENCODING 44980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +3F00 +0080 +3F00 +0080 +ENDCHAR +STARTCHAR AFB5 +ENCODING 44981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +11 +34 +FF +00 +3E +40 +7E +7E +ENDCHAR +STARTCHAR AFB6 +ENCODING 44982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0880 +1280 +0A00 +FFC0 +0000 +3F00 +1200 +3F00 +ENDCHAR +STARTCHAR AFB7 +ENCODING 44983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +34 +FF +00 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR AFB8 +ENCODING 44984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7F80 +0880 +0880 +0880 +0900 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR AFB9 +ENCODING 44985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AFBA +ENCODING 44986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR AFBB +ENCODING 44987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR AFBC +ENCODING 44988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +0900 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR AFBD +ENCODING 44989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR AFBE +ENCODING 44990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +0300 +4780 +4300 +4480 +3B00 +ENDCHAR +STARTCHAR AFBF +ENCODING 44991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR AFC0 +ENCODING 44992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR AFC1 +ENCODING 44993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR AFC2 +ENCODING 44994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR AFC3 +ENCODING 44995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR AFC4 +ENCODING 44996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR AFC5 +ENCODING 44997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR AFC6 +ENCODING 44998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR AFC7 +ENCODING 44999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +7B00 +0800 +7F80 +4480 +3B80 +ENDCHAR +STARTCHAR AFC8 +ENCODING 45000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR AFC9 +ENCODING 45001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +2480 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR AFCA +ENCODING 45002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR AFCB +ENCODING 45003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +0400 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR AFCC +ENCODING 45004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR AFCD +ENCODING 45005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +0400 +1F00 +2180 +2180 +1F00 +ENDCHAR +STARTCHAR AFCE +ENCODING 45006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0400 +0400 +3F00 +0200 +0E00 +7180 +ENDCHAR +STARTCHAR AFCF +ENCODING 45007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR AFD0 +ENCODING 45008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR AFD1 +ENCODING 45009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +3F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR AFD2 +ENCODING 45010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B80 +0880 +0880 +FFC0 +0400 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR AFD3 +ENCODING 45011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +0400 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR AFD4 +ENCODING 45012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +6C80 +1280 +1280 +2480 +2480 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR AFD5 +ENCODING 45013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +7F +01 +01 +01 +ENDCHAR +STARTCHAR AFD6 +ENCODING 45014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +7F +09 +09 +09 +ENDCHAR +STARTCHAR AFD7 +ENCODING 45015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2500 +2900 +FD00 +2700 +2100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR AFD8 +ENCODING 45016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +25 +2F +F1 +27 +21 +40 +7F +ENDCHAR +STARTCHAR AFD9 +ENCODING 45017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +47 +42 +45 +30 +ENDCHAR +STARTCHAR AFDA +ENCODING 45018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR AFDB +ENCODING 45019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR AFDC +ENCODING 45020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +27 +29 +FF +21 +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR AFDD +ENCODING 45021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR AFDE +ENCODING 45022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR AFDF +ENCODING 45023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR AFE0 +ENCODING 45024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR AFE1 +ENCODING 45025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR AFE2 +ENCODING 45026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR AFE3 +ENCODING 45027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR AFE4 +ENCODING 45028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR AFE5 +ENCODING 45029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR AFE6 +ENCODING 45030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +52 +72 +55 +78 +ENDCHAR +STARTCHAR AFE7 +ENCODING 45031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR AFE8 +ENCODING 45032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2500 +2900 +FF00 +2100 +2700 +0100 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR AFE9 +ENCODING 45033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +29 +FF +21 +27 +01 +3E +41 +41 +3E +ENDCHAR +STARTCHAR AFEA +ENCODING 45034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2500 +2900 +FD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR AFEB +ENCODING 45035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2500 +2900 +FD00 +2700 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR AFEC +ENCODING 45036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +7F +3F +01 +01 +ENDCHAR +STARTCHAR AFED +ENCODING 45037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR AFEE +ENCODING 45038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +27 +21 +7F +12 +3F +ENDCHAR +STARTCHAR AFEF +ENCODING 45039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +27 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR AFF0 +ENCODING 45040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +F980 +2580 +2580 +2580 +2980 +FD80 +1180 +1680 +1180 +1180 +0180 +ENDCHAR +STARTCHAR AFF1 +ENCODING 45041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2580 +2980 +FD80 +1180 +1680 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR AFF2 +ENCODING 45042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +4B +53 +FB +2B +21 +3F +09 +09 +09 +ENDCHAR +STARTCHAR AFF3 +ENCODING 45043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +4B00 +5300 +FB00 +2B00 +2100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR AFF4 +ENCODING 45044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2580 +2580 +2980 +FD80 +1180 +1680 +1180 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR AFF5 +ENCODING 45045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +4B00 +5300 +FB00 +2B00 +2100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR AFF6 +ENCODING 45046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR AFF7 +ENCODING 45047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +4B +53 +FB +2B +21 +3F +40 +7F +ENDCHAR +STARTCHAR AFF8 +ENCODING 45048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2680 +2580 +FD80 +1180 +1000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR AFF9 +ENCODING 45049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +1F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR AFFA +ENCODING 45050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR AFFB +ENCODING 45051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +1E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR AFFC +ENCODING 45052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +3900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR AFFD +ENCODING 45053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +1F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR AFFE +ENCODING 45054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR AFFF +ENCODING 45055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR B000 +ENCODING 45056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7D80 +2580 +2580 +FD80 +1180 +1680 +1180 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR B001 +ENCODING 45057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7D80 +2580 +2580 +FD80 +1180 +1680 +1000 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR B002 +ENCODING 45058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +4B00 +5300 +FB00 +2B00 +2100 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B003 +ENCODING 45059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +4B +53 +FB +2B +21 +08 +1C +63 +ENDCHAR +STARTCHAR B004 +ENCODING 45060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7D80 +2580 +2580 +FD80 +1180 +1680 +0180 +1100 +1100 +2A80 +6440 +ENDCHAR +STARTCHAR B005 +ENCODING 45061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +4B +53 +FB +2B +21 +3E +41 +61 +1E +ENDCHAR +STARTCHAR B006 +ENCODING 45062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +4B00 +5300 +FB00 +2B00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B007 +ENCODING 45063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR B008 +ENCODING 45064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +4B +53 +FB +2B +21 +3F +01 +3F +01 +ENDCHAR +STARTCHAR B009 +ENCODING 45065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B00A +ENCODING 45066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +4B +53 +FB +2B +21 +3F +12 +3F +ENDCHAR +STARTCHAR B00B +ENCODING 45067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2A80 +FE80 +1680 +0E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR B00C +ENCODING 45068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +1280 +1280 +1280 +2480 +FE80 +1080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR B00D +ENCODING 45069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B00E +ENCODING 45070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B00F +ENCODING 45071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2500 +2900 +FD00 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B010 +ENCODING 45072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +25 +29 +FF +21 +21 +21 +41 +40 +7F +ENDCHAR +STARTCHAR B011 +ENCODING 45073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B012 +ENCODING 45074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B013 +ENCODING 45075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +3F +40 +7E +ENDCHAR +STARTCHAR B014 +ENCODING 45076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +25 +FF +21 +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B015 +ENCODING 45077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B016 +ENCODING 45078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR B017 +ENCODING 45079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B018 +ENCODING 45080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B019 +ENCODING 45081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B01A +ENCODING 45082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B01B +ENCODING 45083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR B01C +ENCODING 45084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +25 +29 +FF +21 +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR B01D +ENCODING 45085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +25 +25 +29 +FF +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR B01E +ENCODING 45086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B01F +ENCODING 45087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +08 +14 +63 +ENDCHAR +STARTCHAR B020 +ENCODING 45088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B021 +ENCODING 45089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B022 +ENCODING 45090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2500 +2900 +FD00 +2100 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B023 +ENCODING 45091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2500 +2900 +FD00 +2100 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B024 +ENCODING 45092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B025 +ENCODING 45093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR B026 +ENCODING 45094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +25 +29 +FD +21 +00 +7F +12 +3F +ENDCHAR +STARTCHAR B027 +ENCODING 45095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +25 +29 +FD +21 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B028 +ENCODING 45096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7F80 +0880 +0880 +0880 +0900 +FFC0 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR B029 +ENCODING 45097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B02A +ENCODING 45098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B02B +ENCODING 45099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B02C +ENCODING 45100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +77 +11 +11 +12 +ED +24 +64 +40 +7E +ENDCHAR +STARTCHAR B02D +ENCODING 45101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +2180 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B02E +ENCODING 45102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +06 +8F +86 +89 +76 +ENDCHAR +STARTCHAR B02F +ENCODING 45103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B030 +ENCODING 45104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +EE +11 +11 +11 +EE +24 +7E +01 +7E +7E +ENDCHAR +STARTCHAR B031 +ENCODING 45105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B032 +ENCODING 45106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR B033 +ENCODING 45107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B034 +ENCODING 45108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B035 +ENCODING 45109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +66 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B036 +ENCODING 45110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B037 +ENCODING 45111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EE +11 +11 +11 +EE +24 +66 +1F +76 +89 +76 +ENDCHAR +STARTCHAR B038 +ENCODING 45112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR B039 +ENCODING 45113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR B03A +ENCODING 45114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +4900 +7B00 +4A80 +7C00 +ENDCHAR +STARTCHAR B03B +ENCODING 45115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR B03C +ENCODING 45116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR B03D +ENCODING 45117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR B03E +ENCODING 45118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR B03F +ENCODING 45119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +1100 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR B040 +ENCODING 45120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR B041 +ENCODING 45121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +EE +11 +11 +11 +EE +24 +7E +40 +7E +7E +ENDCHAR +STARTCHAR B042 +ENCODING 45122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B80 +0880 +0880 +FFC0 +1200 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B043 +ENCODING 45123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7700 +0880 +0880 +0880 +FFC0 +1100 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR B044 +ENCODING 45124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7F80 +0880 +0880 +0880 +0880 +0880 +1080 +1100 +FFC0 +ENDCHAR +STARTCHAR B045 +ENCODING 45125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B046 +ENCODING 45126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +21 +00 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B047 +ENCODING 45127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +21 +00 +FF +00 +F2 +16 +15 +18 +ENDCHAR +STARTCHAR B048 +ENCODING 45128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +0880 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B049 +ENCODING 45129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +21 +00 +FF +0E +42 +42 +45 +20 +ENDCHAR +STARTCHAR B04A +ENCODING 45130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +4300 +4000 +4780 +4480 +3B80 +ENDCHAR +STARTCHAR B04B +ENCODING 45131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +11 +21 +00 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B04C +ENCODING 45132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B04D +ENCODING 45133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B04E +ENCODING 45134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +3F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR B04F +ENCODING 45135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +3C80 +0F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR B050 +ENCODING 45136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B051 +ENCODING 45137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR B052 +ENCODING 45138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR B053 +ENCODING 45139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +7B00 +0800 +7F80 +4480 +3B80 +ENDCHAR +STARTCHAR B054 +ENCODING 45140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B055 +ENCODING 45141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +2080 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B056 +ENCODING 45142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +11 +21 +00 +FF +00 +92 +F6 +95 +F8 +ENDCHAR +STARTCHAR B057 +ENCODING 45143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +0880 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B058 +ENCODING 45144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +11 +21 +00 +FF +00 +24 +26 +D9 +ENDCHAR +STARTCHAR B059 +ENCODING 45145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +1E00 +2100 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR B05A +ENCODING 45146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +11 +21 +00 +FF +00 +7E +0C +77 +ENDCHAR +STARTCHAR B05B +ENCODING 45147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR B05C +ENCODING 45148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +11 +21 +00 +FF +7E +01 +7E +01 +ENDCHAR +STARTCHAR B05D +ENCODING 45149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7F80 +0880 +0880 +0880 +FFC0 +0000 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B05E +ENCODING 45150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +11 +21 +00 +FF +00 +7E +24 +7E +ENDCHAR +STARTCHAR B05F +ENCODING 45151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0880 +1000 +FFC0 +0000 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR B060 +ENCODING 45152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +45 +45 +49 +89 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR B061 +ENCODING 45153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B062 +ENCODING 45154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B063 +ENCODING 45155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4500 +4900 +0100 +FF00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B064 +ENCODING 45156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +25 +45 +41 +FD +01 +01 +40 +7F +ENDCHAR +STARTCHAR B065 +ENCODING 45157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B066 +ENCODING 45158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B067 +ENCODING 45159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +3F +40 +7E +ENDCHAR +STARTCHAR B068 +ENCODING 45160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +3F00 +0080 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR B069 +ENCODING 45161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +0000 +1B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B06A +ENCODING 45162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +0000 +3F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR B06B +ENCODING 45163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +3000 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR B06C +ENCODING 45164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B06D +ENCODING 45165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +3100 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR B06E +ENCODING 45166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B06F +ENCODING 45167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +3380 +0F80 +3B00 +2480 +3B00 +ENDCHAR +STARTCHAR B070 +ENCODING 45168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +7F +41 +7F +ENDCHAR +STARTCHAR B071 +ENCODING 45169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +41 +7F +7F +ENDCHAR +STARTCHAR B072 +ENCODING 45170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B073 +ENCODING 45171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +08 +14 +63 +ENDCHAR +STARTCHAR B074 +ENCODING 45172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B075 +ENCODING 45173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B076 +ENCODING 45174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4500 +4900 +0100 +FF00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B077 +ENCODING 45175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR B078 +ENCODING 45176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B079 +ENCODING 45177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +0F00 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR B07A +ENCODING 45178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +45 +49 +01 +FF +01 +7F +12 +3F +ENDCHAR +STARTCHAR B07B +ENCODING 45179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6C80 +2280 +2480 +0080 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR B07C +ENCODING 45180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +25 +29 +49 +49 +91 +21 +01 +01 +01 +ENDCHAR +STARTCHAR B07D +ENCODING 45181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +25 +49 +89 +11 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B07E +ENCODING 45182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +29 +49 +91 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B07F +ENCODING 45183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4900 +9100 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B080 +ENCODING 45184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +25 +49 +49 +91 +11 +01 +40 +40 +3F +ENDCHAR +STARTCHAR B081 +ENCODING 45185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +29 +49 +91 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B082 +ENCODING 45186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B083 +ENCODING 45187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +29 +49 +91 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B084 +ENCODING 45188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +29 +49 +B1 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B085 +ENCODING 45189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B086 +ENCODING 45190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B087 +ENCODING 45191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B088 +ENCODING 45192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B089 +ENCODING 45193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B08A +ENCODING 45194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B08B +ENCODING 45195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B08C +ENCODING 45196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +25 +49 +91 +11 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B08D +ENCODING 45197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +25 +49 +91 +11 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B08E +ENCODING 45198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4900 +9100 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B08F +ENCODING 45199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +2500 +2500 +4900 +4900 +9100 +1100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B090 +ENCODING 45200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4900 +9100 +2100 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B091 +ENCODING 45201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +25 +25 +49 +91 +11 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B092 +ENCODING 45202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +2900 +4900 +9100 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B093 +ENCODING 45203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +2900 +4900 +9100 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B094 +ENCODING 45204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +29 +49 +91 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B095 +ENCODING 45205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B096 +ENCODING 45206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +29 +49 +91 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B097 +ENCODING 45207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +29 +49 +91 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B098 +ENCODING 45208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8100 +8180 +8100 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B099 +ENCODING 45209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +8100 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B09A +ENCODING 45210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0000 +7E00 +1100 +1100 +1100 +ENDCHAR +STARTCHAR B09B +ENCODING 45211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +8900 +7100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B09C +ENCODING 45212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B09D +ENCODING 45213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +8900 +7100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B09E +ENCODING 45214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +FD00 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B09F +ENCODING 45215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B0A0 +ENCODING 45216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +FD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B0A1 +ENCODING 45217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +FD00 +0000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B0A2 +ENCODING 45218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +FD00 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR B0A3 +ENCODING 45219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +FD00 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR B0A4 +ENCODING 45220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +FD00 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B0A5 +ENCODING 45221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +FD00 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B0A6 +ENCODING 45222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +FD00 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B0A7 +ENCODING 45223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +FD00 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B0A8 +ENCODING 45224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR B0A9 +ENCODING 45225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR B0AA +ENCODING 45226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +8180 +8900 +7100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B0AB +ENCODING 45227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR B0AC +ENCODING 45228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0100 +2200 +2200 +5700 +8980 +ENDCHAR +STARTCHAR B0AD +ENCODING 45229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0100 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B0AE +ENCODING 45230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8100 +8180 +8100 +FD00 +0000 +3E00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B0AF +ENCODING 45231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +FD00 +0100 +1C00 +0000 +7F00 +0200 +1C00 +6380 +ENDCHAR +STARTCHAR B0B0 +ENCODING 45232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +8100 +8180 +8900 +7100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B0B1 +ENCODING 45233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +FD00 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B0B2 +ENCODING 45234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8100 +8180 +8900 +7100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B0B3 +ENCODING 45235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8180 +FD00 +0100 +1C00 +0000 +7F00 +0000 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR B0B4 +ENCODING 45236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +85 +85 +87 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B0B5 +ENCODING 45237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +85 +87 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B0B6 +ENCODING 45238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +9D +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B0B7 +ENCODING 45239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +8700 +9D00 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B0B8 +ENCODING 45240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +8500 +8500 +8700 +8500 +FD00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B0B9 +ENCODING 45241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +8700 +9D00 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B0BA +ENCODING 45242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B0BB +ENCODING 45243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +87 +9D +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B0BC +ENCODING 45244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +87 +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B0BD +ENCODING 45245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B0BE +ENCODING 45246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B0BF +ENCODING 45247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B0C0 +ENCODING 45248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B0C1 +ENCODING 45249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B0C2 +ENCODING 45250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B0C3 +ENCODING 45251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B0C4 +ENCODING 45252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +85 +87 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B0C5 +ENCODING 45253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +87 +85 +FD +00 +21 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B0C6 +ENCODING 45254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +8700 +9D00 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B0C7 +ENCODING 45255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +8500 +8500 +8700 +8500 +FD00 +0100 +0800 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR B0C8 +ENCODING 45256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +8500 +8500 +8700 +8500 +FD00 +0500 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR B0C9 +ENCODING 45257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +85 +87 +85 +FD +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B0CA +ENCODING 45258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +8700 +9D00 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B0CB +ENCODING 45259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +8700 +FD00 +0500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B0CC +ENCODING 45260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +9D +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B0CD +ENCODING 45261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B0CE +ENCODING 45262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +87 +9D +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B0CF +ENCODING 45263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +87 +FD +05 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B0D0 +ENCODING 45264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +8100 +8180 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B0D1 +ENCODING 45265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +8180 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B0D2 +ENCODING 45266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B0D3 +ENCODING 45267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B0D4 +ENCODING 45268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +8100 +FD80 +0100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B0D5 +ENCODING 45269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B0D6 +ENCODING 45270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B0D7 +ENCODING 45271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR B0D8 +ENCODING 45272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8180 +8100 +8180 +FD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B0D9 +ENCODING 45273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B0DA +ENCODING 45274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR B0DB +ENCODING 45275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR B0DC +ENCODING 45276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B0DD +ENCODING 45277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B0DE +ENCODING 45278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B0DF +ENCODING 45279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B0E0 +ENCODING 45280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +8180 +FD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR B0E1 +ENCODING 45281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR B0E2 +ENCODING 45282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B0E3 +ENCODING 45283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B0E4 +ENCODING 45284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B0E5 +ENCODING 45285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8180 +8100 +8180 +FD00 +0100 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B0E6 +ENCODING 45286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR B0E7 +ENCODING 45287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B0E8 +ENCODING 45288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B0E9 +ENCODING 45289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B0EA +ENCODING 45290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8180 +8100 +8980 +7100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B0EB +ENCODING 45291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8180 +8100 +FD80 +0000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR B0EC +ENCODING 45292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +85 +85 +87 +85 +85 +8F +75 +05 +05 +ENDCHAR +STARTCHAR B0ED +ENCODING 45293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +9F +65 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B0EE +ENCODING 45294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +9F +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B0EF +ENCODING 45295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8700 +8500 +9F00 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B0F0 +ENCODING 45296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +87 +85 +FF +05 +05 +20 +3F +ENDCHAR +STARTCHAR B0F1 +ENCODING 45297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8700 +8500 +9F00 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B0F2 +ENCODING 45298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B0F3 +ENCODING 45299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +87 +85 +9F +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B0F4 +ENCODING 45300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B0F5 +ENCODING 45301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B0F6 +ENCODING 45302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B0F7 +ENCODING 45303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B0F8 +ENCODING 45304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B0F9 +ENCODING 45305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B0FA +ENCODING 45306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B0FB +ENCODING 45307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B0FC +ENCODING 45308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +87 +85 +9F +65 +00 +3F +41 +7F +ENDCHAR +STARTCHAR B0FD +ENCODING 45309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +87 +85 +9F +65 +00 +21 +3F +3F +ENDCHAR +STARTCHAR B0FE +ENCODING 45310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8700 +8500 +9F00 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B0FF +ENCODING 45311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +87 +85 +9F +65 +00 +08 +14 +63 +ENDCHAR +STARTCHAR B100 +ENCODING 45312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8700 +8500 +9F00 +6500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B101 +ENCODING 45313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +9F +65 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR B102 +ENCODING 45314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8700 +8500 +9F00 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B103 +ENCODING 45315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8700 +8500 +FF00 +0500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B104 +ENCODING 45316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +9F +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B105 +ENCODING 45317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B106 +ENCODING 45318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +87 +85 +9F +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B107 +ENCODING 45319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +87 +85 +FF +05 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B108 +ENCODING 45320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +8F +81 +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B109 +ENCODING 45321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +81 +7D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B10A +ENCODING 45322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +87 +81 +85 +79 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B10B +ENCODING 45323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8F00 +8100 +8100 +7D00 +0100 +7200 +1200 +1700 +0C80 +ENDCHAR +STARTCHAR B10C +ENCODING 45324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +81 +7D +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B10D +ENCODING 45325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +87 +81 +85 +79 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B10E +ENCODING 45326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B10F +ENCODING 45327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +87 +81 +85 +79 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B110 +ENCODING 45328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B111 +ENCODING 45329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B112 +ENCODING 45330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +FD +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B113 +ENCODING 45331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +FD +00 +75 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B114 +ENCODING 45332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B115 +ENCODING 45333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B116 +ENCODING 45334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B117 +ENCODING 45335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B118 +ENCODING 45336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +81 +7D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B119 +ENCODING 45337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +FD +00 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B11A +ENCODING 45338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8700 +8100 +8500 +7900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B11B +ENCODING 45339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +81 +7D +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR B11C +ENCODING 45340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +8F00 +8100 +8100 +7D00 +0000 +1200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR B11D +ENCODING 45341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +81 +7D +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B11E +ENCODING 45342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8700 +8100 +8500 +7900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B11F +ENCODING 45343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8F00 +8100 +FD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B120 +ENCODING 45344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +87 +81 +85 +79 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B121 +ENCODING 45345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +8F +81 +FD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B122 +ENCODING 45346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +87 +81 +85 +79 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B123 +ENCODING 45347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +FD +01 +1C +00 +7F +22 +1E +ENDCHAR +STARTCHAR B124 +ENCODING 45348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +85 +9D +85 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B125 +ENCODING 45349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +9D +85 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B126 +ENCODING 45350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +8D +85 +9D +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B127 +ENCODING 45351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +8500 +9D00 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B128 +ENCODING 45352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +8500 +9D00 +8500 +8500 +FD00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B129 +ENCODING 45353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +8500 +9D00 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B12A +ENCODING 45354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B12B +ENCODING 45355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +85 +9D +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B12C +ENCODING 45356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +9D +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B12D +ENCODING 45357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B12E +ENCODING 45358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B12F +ENCODING 45359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B130 +ENCODING 45360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B131 +ENCODING 45361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B132 +ENCODING 45362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B133 +ENCODING 45363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B134 +ENCODING 45364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +9D +85 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B135 +ENCODING 45365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +9D +85 +FD +05 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B136 +ENCODING 45366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +8500 +9D00 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B137 +ENCODING 45367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +8500 +9D00 +8500 +8500 +FD00 +0500 +0900 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B138 +ENCODING 45368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +8500 +9D00 +8500 +8500 +FD00 +0000 +2200 +2200 +3300 +4C80 +ENDCHAR +STARTCHAR B139 +ENCODING 45369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +9D +85 +85 +FD +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B13A +ENCODING 45370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +8500 +9D00 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B13B +ENCODING 45371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +9D00 +8500 +FD00 +0100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B13C +ENCODING 45372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +8D +85 +9D +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B13D +ENCODING 45373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B13E +ENCODING 45374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +85 +9D +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B13F +ENCODING 45375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +9D +85 +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B140 +ENCODING 45376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +8F +81 +8F +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B141 +ENCODING 45377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +8F +81 +8F +81 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B142 +ENCODING 45378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +87 +81 +8F +85 +79 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B143 +ENCODING 45379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8700 +8100 +8F00 +8500 +7900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B144 +ENCODING 45380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +8F +81 +8F +81 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B145 +ENCODING 45381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +87 +81 +8F +85 +79 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B146 +ENCODING 45382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B147 +ENCODING 45383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +87 +81 +8F +85 +79 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B148 +ENCODING 45384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +8F +81 +8F +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B149 +ENCODING 45385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B14A +ENCODING 45386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B14B +ENCODING 45387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B14C +ENCODING 45388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B14D +ENCODING 45389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B14E +ENCODING 45390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B14F +ENCODING 45391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B150 +ENCODING 45392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +8F +81 +8F +81 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B151 +ENCODING 45393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +8F +81 +8F +81 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B152 +ENCODING 45394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8700 +8100 +8F00 +8500 +7900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B153 +ENCODING 45395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +87 +81 +8F +85 +79 +00 +08 +14 +63 +ENDCHAR +STARTCHAR B154 +ENCODING 45396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8F00 +8100 +8F00 +8100 +FD00 +0000 +1200 +3200 +3300 +4C80 +ENDCHAR +STARTCHAR B155 +ENCODING 45397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +8F +81 +8F +81 +FD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B156 +ENCODING 45398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8700 +8100 +8F00 +8500 +7900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B157 +ENCODING 45399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8F00 +8100 +8F00 +FD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B158 +ENCODING 45400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +8F +81 +8F +81 +FD +00 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B159 +ENCODING 45401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B15A +ENCODING 45402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +87 +81 +8F +85 +79 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B15B +ENCODING 45403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8F +81 +8F +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B15C +ENCODING 45404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +85 +85 +9D +85 +9D +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B15D +ENCODING 45405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +8D +9D +9D +65 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B15E +ENCODING 45406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +8D +9D +9D +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B15F +ENCODING 45407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +9D00 +9D00 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B160 +ENCODING 45408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8500 +9D00 +8500 +9D00 +8500 +FD00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B161 +ENCODING 45409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +9D00 +9D00 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B162 +ENCODING 45410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B163 +ENCODING 45411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +9D +9D +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B164 +ENCODING 45412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B165 +ENCODING 45413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B166 +ENCODING 45414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B167 +ENCODING 45415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B168 +ENCODING 45416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B169 +ENCODING 45417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B16A +ENCODING 45418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B16B +ENCODING 45419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B16C +ENCODING 45420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +9D +9D +65 +00 +3F +41 +7F +ENDCHAR +STARTCHAR B16D +ENCODING 45421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +9D +9D +65 +00 +21 +3F +3F +ENDCHAR +STARTCHAR B16E +ENCODING 45422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +9D00 +9D00 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B16F +ENCODING 45423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +9D +9D +65 +00 +08 +14 +63 +ENDCHAR +STARTCHAR B170 +ENCODING 45424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +9D00 +9D00 +6500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B171 +ENCODING 45425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +8D +9D +9D +65 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR B172 +ENCODING 45426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8D00 +9D00 +9D00 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B173 +ENCODING 45427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8D00 +8500 +9D00 +FD00 +0100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B174 +ENCODING 45428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +8D +9D +9D +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B175 +ENCODING 45429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B176 +ENCODING 45430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +8D +9D +9D +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B177 +ENCODING 45431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +8D +85 +9D +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B178 +ENCODING 45432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2000 +2000 +2000 +2000 +3F80 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR B179 +ENCODING 45433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B17A +ENCODING 45434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B17B +ENCODING 45435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +4000 +4000 +7F00 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR B17C +ENCODING 45436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B17D +ENCODING 45437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B17E +ENCODING 45438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B17F +ENCODING 45439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +40 +40 +7F +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B180 +ENCODING 45440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B181 +ENCODING 45441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B182 +ENCODING 45442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0400 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR B183 +ENCODING 45443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B184 +ENCODING 45444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B185 +ENCODING 45445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B186 +ENCODING 45446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B187 +ENCODING 45447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B188 +ENCODING 45448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B189 +ENCODING 45449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B18A +ENCODING 45450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B18B +ENCODING 45451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B18C +ENCODING 45452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR B18D +ENCODING 45453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B18E +ENCODING 45454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +40 +40 +7F +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR B18F +ENCODING 45455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +FF +00 +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B190 +ENCODING 45456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +40 +40 +7F +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR B191 +ENCODING 45457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +40 +40 +7F +FF +00 +3E +40 +7E +7E +ENDCHAR +STARTCHAR B192 +ENCODING 45458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F80 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR B193 +ENCODING 45459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0400 +FFC0 +0000 +1E00 +0000 +3F80 +1100 +1E00 +ENDCHAR +STARTCHAR B194 +ENCODING 45460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4080 +4080 +4080 +7CC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B195 +ENCODING 45461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR B196 +ENCODING 45462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B197 +ENCODING 45463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B198 +ENCODING 45464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4080 +4080 +7C80 +10C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B199 +ENCODING 45465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B19A +ENCODING 45466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B19B +ENCODING 45467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR B19C +ENCODING 45468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4080 +7CC0 +1080 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B19D +ENCODING 45469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B19E +ENCODING 45470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B19F +ENCODING 45471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR B1A0 +ENCODING 45472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B1A1 +ENCODING 45473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR B1A2 +ENCODING 45474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B1A3 +ENCODING 45475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B1A4 +ENCODING 45476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR B1A5 +ENCODING 45477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR B1A6 +ENCODING 45478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR B1A7 +ENCODING 45479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B1A8 +ENCODING 45480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4080 +4080 +4080 +7CC0 +1080 +FE80 +0080 +1100 +1100 +2B00 +4480 +ENDCHAR +STARTCHAR B1A9 +ENCODING 45481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR B1AA +ENCODING 45482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR B1AB +ENCODING 45483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR B1AC +ENCODING 45484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR B1AD +ENCODING 45485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR B1AE +ENCODING 45486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8100 +8100 +D980 +2100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR B1AF +ENCODING 45487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4080 +4080 +3CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR B1B0 +ENCODING 45488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +05 +85 +85 +87 +F5 +25 +1D +E5 +05 +01 +ENDCHAR +STARTCHAR B1B1 +ENCODING 45489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B1B2 +ENCODING 45490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B1B3 +ENCODING 45491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B1B4 +ENCODING 45492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +85 +77 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR B1B5 +ENCODING 45493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B1B6 +ENCODING 45494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B1B7 +ENCODING 45495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B1B8 +ENCODING 45496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR B1B9 +ENCODING 45497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR B1BA +ENCODING 45498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR B1BB +ENCODING 45499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B1BC +ENCODING 45500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR B1BD +ENCODING 45501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B1BE +ENCODING 45502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B1BF +ENCODING 45503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR B1C0 +ENCODING 45504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR B1C1 +ENCODING 45505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR B1C2 +ENCODING 45506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B1C3 +ENCODING 45507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR B1C4 +ENCODING 45508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B1C5 +ENCODING 45509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR B1C6 +ENCODING 45510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B1C7 +ENCODING 45511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F700 +2500 +F500 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B1C8 +ENCODING 45512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B1C9 +ENCODING 45513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B1CA +ENCODING 45514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F7 +25 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B1CB +ENCODING 45515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F7 +25 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B1CC +ENCODING 45516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4080 +4080 +4080 +4080 +7C80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B1CD +ENCODING 45517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B1CE +ENCODING 45518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B1CF +ENCODING 45519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +D900 +2100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B1D0 +ENCODING 45520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +79 +21 +21 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR B1D1 +ENCODING 45521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B1D2 +ENCODING 45522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B1D3 +ENCODING 45523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR B1D4 +ENCODING 45524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +79 +21 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B1D5 +ENCODING 45525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B1D6 +ENCODING 45526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR B1D7 +ENCODING 45527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B1D8 +ENCODING 45528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B1D9 +ENCODING 45529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B1DA +ENCODING 45530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B1DB +ENCODING 45531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR B1DC +ENCODING 45532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +79 +21 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR B1DD +ENCODING 45533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +79 +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR B1DE +ENCODING 45534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B1DF +ENCODING 45535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +79 +21 +FF +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR B1E0 +ENCODING 45536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B1E1 +ENCODING 45537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B1E2 +ENCODING 45538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +D900 +2100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B1E3 +ENCODING 45539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +7900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B1E4 +ENCODING 45540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B1E5 +ENCODING 45541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR B1E6 +ENCODING 45542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +D9 +21 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR B1E7 +ENCODING 45543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B1E8 +ENCODING 45544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2000 +2000 +2000 +2000 +3F80 +1200 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR B1E9 +ENCODING 45545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +1200 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B1EA +ENCODING 45546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B1EB +ENCODING 45547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +4000 +4000 +7F00 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR B1EC +ENCODING 45548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +1200 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B1ED +ENCODING 45549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B1EE +ENCODING 45550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B1EF +ENCODING 45551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +40 +40 +7F +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B1F0 +ENCODING 45552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +1200 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B1F1 +ENCODING 45553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B1F2 +ENCODING 45554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR B1F3 +ENCODING 45555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B1F4 +ENCODING 45556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B1F5 +ENCODING 45557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B1F6 +ENCODING 45558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B1F7 +ENCODING 45559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B1F8 +ENCODING 45560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +40 +40 +7F +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR B1F9 +ENCODING 45561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +1200 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B1FA +ENCODING 45562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B1FB +ENCODING 45563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +1200 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B1FC +ENCODING 45564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +40 +7F +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR B1FD +ENCODING 45565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +1200 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B1FE +ENCODING 45566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +40 +40 +7F +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR B1FF +ENCODING 45567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B200 +ENCODING 45568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +40 +40 +7F +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR B201 +ENCODING 45569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +40 +40 +7F +24 +DB +3E +40 +7E +7E +ENDCHAR +STARTCHAR B202 +ENCODING 45570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +40 +40 +7F +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR B203 +ENCODING 45571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +24 +DB +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B204 +ENCODING 45572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR B205 +ENCODING 45573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B206 +ENCODING 45574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B207 +ENCODING 45575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B208 +ENCODING 45576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR B209 +ENCODING 45577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B20A +ENCODING 45578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR B20B +ENCODING 45579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B20C +ENCODING 45580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B20D +ENCODING 45581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR B20E +ENCODING 45582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR B20F +ENCODING 45583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR B210 +ENCODING 45584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR B211 +ENCODING 45585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR B212 +ENCODING 45586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR B213 +ENCODING 45587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR B214 +ENCODING 45588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B215 +ENCODING 45589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B216 +ENCODING 45590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B217 +ENCODING 45591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B218 +ENCODING 45592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR B219 +ENCODING 45593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B21A +ENCODING 45594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +40 +40 +7F +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR B21B +ENCODING 45595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR B21C +ENCODING 45596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR B21D +ENCODING 45597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +40 +40 +7F +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR B21E +ENCODING 45598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B21F +ENCODING 45599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B220 +ENCODING 45600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4080 +4080 +4080 +7C80 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR B221 +ENCODING 45601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B222 +ENCODING 45602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B223 +ENCODING 45603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B224 +ENCODING 45604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +F9 +01 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR B225 +ENCODING 45605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B226 +ENCODING 45606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B227 +ENCODING 45607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +DD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR B228 +ENCODING 45608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR B229 +ENCODING 45609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B22A +ENCODING 45610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B22B +ENCODING 45611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B22C +ENCODING 45612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B22D +ENCODING 45613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B22E +ENCODING 45614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B22F +ENCODING 45615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR B230 +ENCODING 45616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +DD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR B231 +ENCODING 45617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +DD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR B232 +ENCODING 45618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B233 +ENCODING 45619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +DD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR B234 +ENCODING 45620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8100 +8100 +7900 +0100 +FD00 +2100 +2700 +0100 +2200 +3300 +CC80 +ENDCHAR +STARTCHAR B235 +ENCODING 45621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B236 +ENCODING 45622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +7900 +DD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B237 +ENCODING 45623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +7900 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B238 +ENCODING 45624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B239 +ENCODING 45625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B23A +ENCODING 45626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +DD +27 +21 +3F +12 +3F +ENDCHAR +STARTCHAR B23B +ENCODING 45627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR B23C +ENCODING 45628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4280 +4280 +4280 +7A80 +0280 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR B23D +ENCODING 45629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B23E +ENCODING 45630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B23F +ENCODING 45631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F500 +1D00 +E500 +2900 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B240 +ENCODING 45632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4280 +4280 +7A80 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR B241 +ENCODING 45633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F500 +1D00 +E500 +2900 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B242 +ENCODING 45634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR B243 +ENCODING 45635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +3F +40 +7F +ENDCHAR +STARTCHAR B244 +ENCODING 45636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR B245 +ENCODING 45637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR B246 +ENCODING 45638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR B247 +ENCODING 45639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR B248 +ENCODING 45640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR B249 +ENCODING 45641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR B24A +ENCODING 45642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR B24B +ENCODING 45643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR B24C +ENCODING 45644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +3F +41 +7F +ENDCHAR +STARTCHAR B24D +ENCODING 45645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +41 +7F +7F +ENDCHAR +STARTCHAR B24E +ENCODING 45646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F500 +1D00 +E500 +2900 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B24F +ENCODING 45647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +08 +1C +63 +ENDCHAR +STARTCHAR B250 +ENCODING 45648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +02 +22 +55 +08 +ENDCHAR +STARTCHAR B251 +ENCODING 45649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +3E +41 +61 +1E +ENDCHAR +STARTCHAR B252 +ENCODING 45650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8500 +8500 +F500 +1D00 +E500 +2900 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B253 +ENCODING 45651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR B254 +ENCODING 45652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +3F +01 +3F +01 +ENDCHAR +STARTCHAR B255 +ENCODING 45653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B256 +ENCODING 45654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +85 +85 +F5 +1D +E5 +29 +3F +12 +3F +ENDCHAR +STARTCHAR B257 +ENCODING 45655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4280 +4280 +3A80 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR B258 +ENCODING 45656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4080 +4080 +4080 +4080 +3C80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR B259 +ENCODING 45657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B25A +ENCODING 45658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B25B +ENCODING 45659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B25C +ENCODING 45660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +79 +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR B25D +ENCODING 45661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B25E +ENCODING 45662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B25F +ENCODING 45663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR B260 +ENCODING 45664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +79 +01 +FF +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B261 +ENCODING 45665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B262 +ENCODING 45666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B263 +ENCODING 45667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B264 +ENCODING 45668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B265 +ENCODING 45669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B266 +ENCODING 45670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B267 +ENCODING 45671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR B268 +ENCODING 45672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +79 +01 +FF +21 +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR B269 +ENCODING 45673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +79 +01 +FF +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR B26A +ENCODING 45674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B26B +ENCODING 45675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR B26C +ENCODING 45676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B26D +ENCODING 45677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B26E +ENCODING 45678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +7900 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B26F +ENCODING 45679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +7900 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B270 +ENCODING 45680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B271 +ENCODING 45681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B272 +ENCODING 45682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +79 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR B273 +ENCODING 45683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B274 +ENCODING 45684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +2000 +2000 +3F80 +0000 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR B275 +ENCODING 45685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B276 +ENCODING 45686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B277 +ENCODING 45687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B278 +ENCODING 45688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3200 +2000 +3F00 +ENDCHAR +STARTCHAR B279 +ENCODING 45689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B27A +ENCODING 45690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR B27B +ENCODING 45691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B27C +ENCODING 45692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B27D +ENCODING 45693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR B27E +ENCODING 45694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR B27F +ENCODING 45695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR B280 +ENCODING 45696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR B281 +ENCODING 45697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR B282 +ENCODING 45698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR B283 +ENCODING 45699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR B284 +ENCODING 45700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B285 +ENCODING 45701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +1200 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B286 +ENCODING 45702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B287 +ENCODING 45703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR B288 +ENCODING 45704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR B289 +ENCODING 45705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B28A +ENCODING 45706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR B28B +ENCODING 45707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR B28C +ENCODING 45708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR B28D +ENCODING 45709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +40 +40 +7F +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR B28E +ENCODING 45710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B28F +ENCODING 45711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR B290 +ENCODING 45712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2000 +2000 +2000 +2000 +3F80 +0000 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR B291 +ENCODING 45713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B292 +ENCODING 45714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B293 +ENCODING 45715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B294 +ENCODING 45716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B295 +ENCODING 45717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B296 +ENCODING 45718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B297 +ENCODING 45719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B298 +ENCODING 45720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B299 +ENCODING 45721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B29A +ENCODING 45722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR B29B +ENCODING 45723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B29C +ENCODING 45724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B29D +ENCODING 45725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B29E +ENCODING 45726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B29F +ENCODING 45727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B2A0 +ENCODING 45728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B2A1 +ENCODING 45729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B2A2 +ENCODING 45730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B2A3 +ENCODING 45731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B2A4 +ENCODING 45732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR B2A5 +ENCODING 45733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +1F00 +2100 +2100 +1F00 +ENDCHAR +STARTCHAR B2A6 +ENCODING 45734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B2A7 +ENCODING 45735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B2A8 +ENCODING 45736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR B2A9 +ENCODING 45737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +40 +40 +7F +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR B2AA +ENCODING 45738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F80 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR B2AB +ENCODING 45739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +40 +40 +7F +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B2AC +ENCODING 45740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4080 +4080 +4080 +4080 +7C80 +0080 +0080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B2AD +ENCODING 45741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B2AE +ENCODING 45742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B2AF +ENCODING 45743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +F900 +0100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B2B0 +ENCODING 45744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +79 +01 +01 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR B2B1 +ENCODING 45745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B2B2 +ENCODING 45746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B2B3 +ENCODING 45747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR B2B4 +ENCODING 45748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +79 +01 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B2B5 +ENCODING 45749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B2B6 +ENCODING 45750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR B2B7 +ENCODING 45751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B2B8 +ENCODING 45752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B2B9 +ENCODING 45753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B2BA +ENCODING 45754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B2BB +ENCODING 45755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR B2BC +ENCODING 45756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR B2BD +ENCODING 45757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR B2BE +ENCODING 45758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B2BF +ENCODING 45759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +F9 +01 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR B2C0 +ENCODING 45760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B2C1 +ENCODING 45761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B2C2 +ENCODING 45762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +F900 +0100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B2C3 +ENCODING 45763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +7900 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B2C4 +ENCODING 45764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B2C5 +ENCODING 45765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR B2C6 +ENCODING 45766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +F9 +01 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR B2C7 +ENCODING 45767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +79 +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B2C8 +ENCODING 45768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +81 +81 +7D +01 +01 +01 +ENDCHAR +STARTCHAR B2C9 +ENCODING 45769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B2CA +ENCODING 45770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +85 +79 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B2CB +ENCODING 45771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +8100 +8500 +7900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B2CC +ENCODING 45772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B2CD +ENCODING 45773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +85 +79 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B2CE +ENCODING 45774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B2CF +ENCODING 45775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +81 +81 +81 +85 +79 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B2D0 +ENCODING 45776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B2D1 +ENCODING 45777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B2D2 +ENCODING 45778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +FD +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B2D3 +ENCODING 45779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B2D4 +ENCODING 45780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B2D5 +ENCODING 45781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B2D6 +ENCODING 45782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B2D7 +ENCODING 45783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B2D8 +ENCODING 45784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B2D9 +ENCODING 45785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B2DA +ENCODING 45786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +8100 +8500 +7900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B2DB +ENCODING 45787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR B2DC +ENCODING 45788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +8100 +8500 +7900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B2DD +ENCODING 45789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B2DE +ENCODING 45790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +8100 +8500 +7900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B2DF +ENCODING 45791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8100 +8100 +8100 +FD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B2E0 +ENCODING 45792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +85 +79 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B2E1 +ENCODING 45793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B2E2 +ENCODING 45794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +81 +81 +81 +81 +81 +FD +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR B2E3 +ENCODING 45795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +81 +81 +81 +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B2E4 +ENCODING 45796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8100 +8180 +8100 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B2E5 +ENCODING 45797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B2E6 +ENCODING 45798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +7E00 +1100 +1100 +1100 +ENDCHAR +STARTCHAR B2E7 +ENCODING 45799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +8180 +8100 +F900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B2E8 +ENCODING 45800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B2E9 +ENCODING 45801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +8180 +8100 +F900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B2EA +ENCODING 45802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +8180 +FD00 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B2EB +ENCODING 45803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B2EC +ENCODING 45804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +FD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B2ED +ENCODING 45805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +FD00 +0000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B2EE +ENCODING 45806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +FD00 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR B2EF +ENCODING 45807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +FD00 +0000 +7900 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR B2F0 +ENCODING 45808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +8180 +FD00 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B2F1 +ENCODING 45809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +8180 +FD00 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B2F2 +ENCODING 45810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +8180 +FD00 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B2F3 +ENCODING 45811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +FD00 +0000 +7600 +1000 +7F00 +8900 +7600 +ENDCHAR +STARTCHAR B2F4 +ENCODING 45812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR B2F5 +ENCODING 45813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR B2F6 +ENCODING 45814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +8180 +8100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B2F7 +ENCODING 45815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR B2F8 +ENCODING 45816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +8100 +FD00 +0000 +2200 +2200 +5700 +8980 +ENDCHAR +STARTCHAR B2F9 +ENCODING 45817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B2FA +ENCODING 45818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8180 +8100 +FD00 +0000 +3F00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B2FB +ENCODING 45819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +FD00 +0100 +1C00 +0000 +7F00 +0200 +0C00 +7380 +ENDCHAR +STARTCHAR B2FC +ENCODING 45820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8100 +8180 +8100 +F900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B2FD +ENCODING 45821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +8180 +FD00 +0000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B2FE +ENCODING 45822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +8180 +8100 +F900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B2FF +ENCODING 45823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +FD00 +0100 +1C00 +0000 +7F00 +2200 +1C00 +ENDCHAR +STARTCHAR B300 +ENCODING 45824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +85 +87 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B301 +ENCODING 45825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +87 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B302 +ENCODING 45826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +85 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B303 +ENCODING 45827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8700 +8500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B304 +ENCODING 45828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +8500 +8700 +8500 +FD00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B305 +ENCODING 45829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8700 +8500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B306 +ENCODING 45830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B307 +ENCODING 45831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +87 +85 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B308 +ENCODING 45832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +87 +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B309 +ENCODING 45833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B30A +ENCODING 45834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B30B +ENCODING 45835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B30C +ENCODING 45836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B30D +ENCODING 45837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B30E +ENCODING 45838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B30F +ENCODING 45839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B310 +ENCODING 45840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +87 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B311 +ENCODING 45841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +87 +85 +FD +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B312 +ENCODING 45842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8700 +8500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B313 +ENCODING 45843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +8500 +8700 +8500 +FD00 +0100 +0800 +0C00 +1600 +6180 +ENDCHAR +STARTCHAR B314 +ENCODING 45844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +8500 +8700 +8500 +FD00 +0000 +1200 +3200 +3300 +4C80 +ENDCHAR +STARTCHAR B315 +ENCODING 45845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +87 +85 +FD +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B316 +ENCODING 45846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8700 +8500 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B317 +ENCODING 45847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8700 +9D00 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B318 +ENCODING 45848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +85 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B319 +ENCODING 45849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B31A +ENCODING 45850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +87 +85 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B31B +ENCODING 45851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +87 +9D +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B31C +ENCODING 45852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +8100 +8100 +8180 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B31D +ENCODING 45853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR B31E +ENCODING 45854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B31F +ENCODING 45855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B320 +ENCODING 45856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +8100 +8100 +FD80 +0100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR B321 +ENCODING 45857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B322 +ENCODING 45858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B323 +ENCODING 45859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR B324 +ENCODING 45860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7E00 +0100 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B325 +ENCODING 45861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B326 +ENCODING 45862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR B327 +ENCODING 45863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR B328 +ENCODING 45864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B329 +ENCODING 45865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B32A +ENCODING 45866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B32B +ENCODING 45867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B32C +ENCODING 45868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR B32D +ENCODING 45869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR B32E +ENCODING 45870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B32F +ENCODING 45871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B330 +ENCODING 45872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B331 +ENCODING 45873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +1800 +2600 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR B332 +ENCODING 45874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR B333 +ENCODING 45875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B334 +ENCODING 45876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B335 +ENCODING 45877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B336 +ENCODING 45878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +8100 +8180 +F900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B337 +ENCODING 45879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +8100 +FD80 +0000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR B338 +ENCODING 45880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +F5 +85 +87 +85 +85 +87 +F5 +05 +05 +ENDCHAR +STARTCHAR B339 +ENCODING 45881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B33A +ENCODING 45882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B33B +ENCODING 45883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +8500 +8700 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B33C +ENCODING 45884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +87 +85 +FF +05 +05 +20 +3F +ENDCHAR +STARTCHAR B33D +ENCODING 45885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +8500 +8700 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B33E +ENCODING 45886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B33F +ENCODING 45887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B340 +ENCODING 45888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B341 +ENCODING 45889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B342 +ENCODING 45890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B343 +ENCODING 45891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B344 +ENCODING 45892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B345 +ENCODING 45893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B346 +ENCODING 45894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B347 +ENCODING 45895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B348 +ENCODING 45896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR B349 +ENCODING 45897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR B34A +ENCODING 45898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +8500 +8700 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B34B +ENCODING 45899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR B34C +ENCODING 45900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +8500 +8700 +F500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B34D +ENCODING 45901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +87 +F5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR B34E +ENCODING 45902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +8500 +8700 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B34F +ENCODING 45903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +8500 +9F00 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B350 +ENCODING 45904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B351 +ENCODING 45905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B352 +ENCODING 45906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +85 +87 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B353 +ENCODING 45907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +85 +9F +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B354 +ENCODING 45908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +8F +81 +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B355 +ENCODING 45909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B356 +ENCODING 45910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B357 +ENCODING 45911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +8700 +8100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B358 +ENCODING 45912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B359 +ENCODING 45913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +87 +81 +FD +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B35A +ENCODING 45914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B35B +ENCODING 45915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR B35C +ENCODING 45916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B35D +ENCODING 45917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B35E +ENCODING 45918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +FD +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B35F +ENCODING 45919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +FD +00 +75 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B360 +ENCODING 45920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B361 +ENCODING 45921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B362 +ENCODING 45922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B363 +ENCODING 45923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B364 +ENCODING 45924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B365 +ENCODING 45925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B366 +ENCODING 45926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +8700 +8100 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B367 +ENCODING 45927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR B368 +ENCODING 45928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +8700 +8100 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B369 +ENCODING 45929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B36A +ENCODING 45930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +8700 +8100 +FD00 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B36B +ENCODING 45931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8F00 +8100 +FD00 +0100 +1C00 +0000 +3F00 +0E00 +7380 +ENDCHAR +STARTCHAR B36C +ENCODING 45932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +87 +81 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B36D +ENCODING 45933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B36E +ENCODING 45934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +81 +FD +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR B36F +ENCODING 45935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +81 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B370 +ENCODING 45936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +9D +85 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B371 +ENCODING 45937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +9D +85 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B372 +ENCODING 45938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +85 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B373 +ENCODING 45939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8D00 +8500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B374 +ENCODING 45940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +9D00 +8500 +8500 +FD00 +0500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B375 +ENCODING 45941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8D00 +8500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B376 +ENCODING 45942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B377 +ENCODING 45943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +8D +85 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B378 +ENCODING 45944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +9D +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B379 +ENCODING 45945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B37A +ENCODING 45946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B37B +ENCODING 45947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B37C +ENCODING 45948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B37D +ENCODING 45949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B37E +ENCODING 45950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B37F +ENCODING 45951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B380 +ENCODING 45952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +9D +85 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B381 +ENCODING 45953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +9D +85 +85 +FD +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B382 +ENCODING 45954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8D00 +8500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B383 +ENCODING 45955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +9D00 +8500 +8500 +FD00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B384 +ENCODING 45956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +9D00 +8500 +8500 +FD00 +0000 +2200 +2200 +3500 +4C80 +ENDCHAR +STARTCHAR B385 +ENCODING 45957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +9D +85 +85 +FD +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B386 +ENCODING 45958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8D00 +8500 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B387 +ENCODING 45959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +8D00 +9D00 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B388 +ENCODING 45960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +85 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B389 +ENCODING 45961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B38A +ENCODING 45962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +8D +85 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B38B +ENCODING 45963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +8D +9D +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B38C +ENCODING 45964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +8F +81 +8F +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B38D +ENCODING 45965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR B38E +ENCODING 45966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B38F +ENCODING 45967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8100 +8700 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B390 +ENCODING 45968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +81 +8F +81 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B391 +ENCODING 45969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +81 +87 +FD +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B392 +ENCODING 45970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B393 +ENCODING 45971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +7E +40 +7E +ENDCHAR +STARTCHAR B394 +ENCODING 45972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +81 +8F +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B395 +ENCODING 45973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B396 +ENCODING 45974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B397 +ENCODING 45975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B398 +ENCODING 45976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B399 +ENCODING 45977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B39A +ENCODING 45978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B39B +ENCODING 45979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B39C +ENCODING 45980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR B39D +ENCODING 45981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +81 +87 +FD +01 +41 +7F +7F +ENDCHAR +STARTCHAR B39E +ENCODING 45982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8100 +8700 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B39F +ENCODING 45983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR B3A0 +ENCODING 45984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8F00 +8100 +8F00 +8100 +FD00 +0000 +1200 +3200 +3300 +4C80 +ENDCHAR +STARTCHAR B3A1 +ENCODING 45985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +81 +8F +81 +FD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B3A2 +ENCODING 45986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8100 +8700 +FD00 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B3A3 +ENCODING 45987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8F00 +8700 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B3A4 +ENCODING 45988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B3A5 +ENCODING 45989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B3A6 +ENCODING 45990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +81 +87 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B3A7 +ENCODING 45991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +8F +87 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B3A8 +ENCODING 45992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +9D +85 +9D +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B3A9 +ENCODING 45993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B3AA +ENCODING 45994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B3AB +ENCODING 45995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +8D00 +8500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B3AC +ENCODING 45996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +9D00 +8500 +9D00 +8500 +FD00 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B3AD +ENCODING 45997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +8D00 +8500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B3AE +ENCODING 45998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B3AF +ENCODING 45999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B3B0 +ENCODING 46000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B3B1 +ENCODING 46001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B3B2 +ENCODING 46002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B3B3 +ENCODING 46003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B3B4 +ENCODING 46004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B3B5 +ENCODING 46005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B3B6 +ENCODING 46006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B3B7 +ENCODING 46007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B3B8 +ENCODING 46008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR B3B9 +ENCODING 46009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR B3BA +ENCODING 46010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +8D00 +8500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B3BB +ENCODING 46011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR B3BC +ENCODING 46012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +8D00 +8500 +F500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B3BD +ENCODING 46013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +8D +85 +F5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR B3BE +ENCODING 46014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +8D00 +8500 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B3BF +ENCODING 46015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9D00 +9D00 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B3C0 +ENCODING 46016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B3C1 +ENCODING 46017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B3C2 +ENCODING 46018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +8D +85 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B3C3 +ENCODING 46019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +9D +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B3C4 +ENCODING 46020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2000 +2000 +2000 +3F80 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR B3C5 +ENCODING 46021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B3C6 +ENCODING 46022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +76 +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B3C7 +ENCODING 46023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7E00 +4000 +7600 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR B3C8 +ENCODING 46024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B3C9 +ENCODING 46025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +76 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B3CA +ENCODING 46026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B3CB +ENCODING 46027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B3CC +ENCODING 46028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B3CD +ENCODING 46029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B3CE +ENCODING 46030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR B3CF +ENCODING 46031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B3D0 +ENCODING 46032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0400 +FFC0 +0000 +7900 +0900 +3900 +4280 +3C40 +ENDCHAR +STARTCHAR B3D1 +ENCODING 46033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B3D2 +ENCODING 46034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B3D3 +ENCODING 46035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B3D4 +ENCODING 46036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B3D5 +ENCODING 46037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B3D6 +ENCODING 46038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +76 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B3D7 +ENCODING 46039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B3D8 +ENCODING 46040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +76 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR B3D9 +ENCODING 46041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B3DA +ENCODING 46042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +40 +76 +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR B3DB +ENCODING 46043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0400 +FFC0 +0000 +1E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR B3DC +ENCODING 46044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +40 +76 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR B3DD +ENCODING 46045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B3DE +ENCODING 46046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +40 +76 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR B3DF +ENCODING 46047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +FF +00 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B3E0 +ENCODING 46048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4080 +4080 +4080 +7CC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B3E1 +ENCODING 46049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR B3E2 +ENCODING 46050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B3E3 +ENCODING 46051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B3E4 +ENCODING 46052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4080 +4080 +7C80 +10C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B3E5 +ENCODING 46053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B3E6 +ENCODING 46054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B3E7 +ENCODING 46055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR B3E8 +ENCODING 46056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4080 +7CC0 +1080 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B3E9 +ENCODING 46057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B3EA +ENCODING 46058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B3EB +ENCODING 46059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR B3EC +ENCODING 46060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B3ED +ENCODING 46061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR B3EE +ENCODING 46062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B3EF +ENCODING 46063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B3F0 +ENCODING 46064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR B3F1 +ENCODING 46065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR B3F2 +ENCODING 46066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR B3F3 +ENCODING 46067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B3F4 +ENCODING 46068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B3F5 +ENCODING 46069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR B3F6 +ENCODING 46070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR B3F7 +ENCODING 46071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR B3F8 +ENCODING 46072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR B3F9 +ENCODING 46073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR B3FA +ENCODING 46074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +D980 +2100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR B3FB +ENCODING 46075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4080 +7CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR B3FC +ENCODING 46076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4280 +4280 +4280 +7B80 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR B3FD +ENCODING 46077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B3FE +ENCODING 46078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B3FF +ENCODING 46079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +2500 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B400 +ENCODING 46080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +85 +F7 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR B401 +ENCODING 46081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +2500 +FD00 +0100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B402 +ENCODING 46082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B403 +ENCODING 46083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +3F +40 +7F +ENDCHAR +STARTCHAR B404 +ENCODING 46084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR B405 +ENCODING 46085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR B406 +ENCODING 46086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR B407 +ENCODING 46087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B408 +ENCODING 46088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR B409 +ENCODING 46089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B40A +ENCODING 46090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B40B +ENCODING 46091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +2500 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR B40C +ENCODING 46092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +3F +41 +7F +ENDCHAR +STARTCHAR B40D +ENCODING 46093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +21 +3F +3F +ENDCHAR +STARTCHAR B40E +ENCODING 46094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +2500 +FD00 +0100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B40F +ENCODING 46095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR B410 +ENCODING 46096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7A80 +4280 +4380 +7A80 +1280 +FE80 +0000 +1100 +1100 +1980 +6640 +ENDCHAR +STARTCHAR B411 +ENCODING 46097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +FD +09 +37 +41 +23 +1C +ENDCHAR +STARTCHAR B412 +ENCODING 46098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +2500 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B413 +ENCODING 46099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +2500 +F500 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B414 +ENCODING 46100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B415 +ENCODING 46101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B416 +ENCODING 46102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +25 +FD +01 +3F +12 +3F +ENDCHAR +STARTCHAR B417 +ENCODING 46103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +25 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B418 +ENCODING 46104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +4080 +4080 +7E80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B419 +ENCODING 46105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B41A +ENCODING 46106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B41B +ENCODING 46107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +D900 +2100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B41C +ENCODING 46108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +4080 +7C80 +1080 +1080 +FF80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B41D +ENCODING 46109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B41E +ENCODING 46110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B41F +ENCODING 46111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR B420 +ENCODING 46112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +21 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B421 +ENCODING 46113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B422 +ENCODING 46114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR B423 +ENCODING 46115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B424 +ENCODING 46116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B425 +ENCODING 46117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B426 +ENCODING 46118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B427 +ENCODING 46119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR B428 +ENCODING 46120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +21 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR B429 +ENCODING 46121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR B42A +ENCODING 46122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B42B +ENCODING 46123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +21 +FF +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR B42C +ENCODING 46124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B42D +ENCODING 46125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B42E +ENCODING 46126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +D900 +2100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B42F +ENCODING 46127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +F900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B430 +ENCODING 46128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B431 +ENCODING 46129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR B432 +ENCODING 46130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +D9 +21 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR B433 +ENCODING 46131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B434 +ENCODING 46132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2000 +2000 +2000 +3F80 +1200 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR B435 +ENCODING 46133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR B436 +ENCODING 46134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B437 +ENCODING 46135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7E00 +4000 +5A00 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR B438 +ENCODING 46136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +2000 +1F00 +1200 +FFC0 +2000 +2000 +3F00 +ENDCHAR +STARTCHAR B439 +ENCODING 46137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B43A +ENCODING 46138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B43B +ENCODING 46139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +40 +5A +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B43C +ENCODING 46140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +40 +40 +7F +24 +DB +7E +01 +7E +7E +ENDCHAR +STARTCHAR B43D +ENCODING 46141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B43E +ENCODING 46142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR B43F +ENCODING 46143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B440 +ENCODING 46144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B441 +ENCODING 46145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B442 +ENCODING 46146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B443 +ENCODING 46147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B444 +ENCODING 46148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +40 +5A +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR B445 +ENCODING 46149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +40 +5A +24 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR B446 +ENCODING 46150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B447 +ENCODING 46151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR B448 +ENCODING 46152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR B449 +ENCODING 46153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR B44A +ENCODING 46154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR B44B +ENCODING 46155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B44C +ENCODING 46156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +40 +5A +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR B44D +ENCODING 46157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +40 +40 +7F +24 +DB +3E +40 +7E +7E +ENDCHAR +STARTCHAR B44E +ENCODING 46158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +40 +5A +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR B44F +ENCODING 46159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +24 +DB +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B450 +ENCODING 46160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +2000 +2000 +2000 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR B451 +ENCODING 46161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B452 +ENCODING 46162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B453 +ENCODING 46163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B454 +ENCODING 46164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR B455 +ENCODING 46165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B456 +ENCODING 46166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR B457 +ENCODING 46167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B458 +ENCODING 46168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B459 +ENCODING 46169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR B45A +ENCODING 46170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR B45B +ENCODING 46171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR B45C +ENCODING 46172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR B45D +ENCODING 46173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR B45E +ENCODING 46174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR B45F +ENCODING 46175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR B460 +ENCODING 46176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B461 +ENCODING 46177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0400 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B462 +ENCODING 46178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B463 +ENCODING 46179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0400 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B464 +ENCODING 46180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR B465 +ENCODING 46181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B466 +ENCODING 46182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +40 +7F +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR B467 +ENCODING 46183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR B468 +ENCODING 46184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR B469 +ENCODING 46185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +40 +40 +7F +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR B46A +ENCODING 46186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B46B +ENCODING 46187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B46C +ENCODING 46188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +4080 +7C80 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR B46D +ENCODING 46189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B46E +ENCODING 46190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B46F +ENCODING 46191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B470 +ENCODING 46192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +F9 +01 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR B471 +ENCODING 46193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B472 +ENCODING 46194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B473 +ENCODING 46195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR B474 +ENCODING 46196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR B475 +ENCODING 46197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B476 +ENCODING 46198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B477 +ENCODING 46199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B478 +ENCODING 46200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B479 +ENCODING 46201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B47A +ENCODING 46202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B47B +ENCODING 46203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR B47C +ENCODING 46204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR B47D +ENCODING 46205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR B47E +ENCODING 46206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B47F +ENCODING 46207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR B480 +ENCODING 46208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F900 +0100 +FD00 +2100 +2700 +0100 +2200 +3300 +CC80 +ENDCHAR +STARTCHAR B481 +ENCODING 46209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B482 +ENCODING 46210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +7900 +DD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B483 +ENCODING 46211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +7900 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B484 +ENCODING 46212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B485 +ENCODING 46213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B486 +ENCODING 46214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +DD +27 +21 +3F +12 +3F +ENDCHAR +STARTCHAR B487 +ENCODING 46215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR B488 +ENCODING 46216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4280 +4280 +7A80 +0280 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR B489 +ENCODING 46217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B48A +ENCODING 46218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B48B +ENCODING 46219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F500 +1D00 +E500 +2900 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B48C +ENCODING 46220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +4280 +7A80 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR B48D +ENCODING 46221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F500 +1D00 +E500 +2900 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B48E +ENCODING 46222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR B48F +ENCODING 46223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +3F +40 +7F +ENDCHAR +STARTCHAR B490 +ENCODING 46224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR B491 +ENCODING 46225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR B492 +ENCODING 46226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR B493 +ENCODING 46227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR B494 +ENCODING 46228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR B495 +ENCODING 46229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR B496 +ENCODING 46230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR B497 +ENCODING 46231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR B498 +ENCODING 46232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +3F +41 +7F +ENDCHAR +STARTCHAR B499 +ENCODING 46233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +41 +7F +7F +ENDCHAR +STARTCHAR B49A +ENCODING 46234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F500 +1D00 +E500 +2900 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B49B +ENCODING 46235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +08 +1C +63 +ENDCHAR +STARTCHAR B49C +ENCODING 46236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +02 +22 +55 +08 +ENDCHAR +STARTCHAR B49D +ENCODING 46237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4280 +7A80 +0280 +FE80 +1280 +1680 +0000 +1F80 +2080 +1F80 +ENDCHAR +STARTCHAR B49E +ENCODING 46238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F500 +1D00 +E500 +2900 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B49F +ENCODING 46239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR B4A0 +ENCODING 46240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +3F +01 +3F +01 +ENDCHAR +STARTCHAR B4A1 +ENCODING 46241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B4A2 +ENCODING 46242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F5 +1D +E5 +29 +3F +12 +3F +ENDCHAR +STARTCHAR B4A3 +ENCODING 46243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4280 +3A80 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR B4A4 +ENCODING 46244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +4080 +4080 +7C80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR B4A5 +ENCODING 46245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B4A6 +ENCODING 46246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B4A7 +ENCODING 46247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B4A8 +ENCODING 46248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +01 +FF +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR B4A9 +ENCODING 46249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B4AA +ENCODING 46250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B4AB +ENCODING 46251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR B4AC +ENCODING 46252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +01 +FF +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B4AD +ENCODING 46253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B4AE +ENCODING 46254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B4AF +ENCODING 46255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B4B0 +ENCODING 46256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B4B1 +ENCODING 46257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B4B2 +ENCODING 46258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B4B3 +ENCODING 46259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR B4B4 +ENCODING 46260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +7F +41 +7F +ENDCHAR +STARTCHAR B4B5 +ENCODING 46261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +01 +FF +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR B4B6 +ENCODING 46262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B4B7 +ENCODING 46263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +F900 +0100 +FF00 +2100 +2800 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B4B8 +ENCODING 46264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B4B9 +ENCODING 46265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +01 +FF +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR B4BA +ENCODING 46266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +7900 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B4BB +ENCODING 46267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +7900 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B4BC +ENCODING 46268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B4BD +ENCODING 46269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B4BE +ENCODING 46270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +79 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR B4BF +ENCODING 46271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +79 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B4C0 +ENCODING 46272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +2000 +2000 +2000 +3F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR B4C1 +ENCODING 46273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B4C2 +ENCODING 46274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B4C3 +ENCODING 46275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B4C4 +ENCODING 46276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +2000 +2000 +3F80 +0000 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR B4C5 +ENCODING 46277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B4C6 +ENCODING 46278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR B4C7 +ENCODING 46279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B4C8 +ENCODING 46280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B4C9 +ENCODING 46281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR B4CA +ENCODING 46282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR B4CB +ENCODING 46283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR B4CC +ENCODING 46284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR B4CD +ENCODING 46285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR B4CE +ENCODING 46286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR B4CF +ENCODING 46287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR B4D0 +ENCODING 46288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +2000 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B4D1 +ENCODING 46289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR B4D2 +ENCODING 46290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B4D3 +ENCODING 46291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR B4D4 +ENCODING 46292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR B4D5 +ENCODING 46293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +2000 +2000 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B4D6 +ENCODING 46294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR B4D7 +ENCODING 46295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR B4D8 +ENCODING 46296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR B4D9 +ENCODING 46297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +40 +40 +7F +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR B4DA +ENCODING 46298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B4DB +ENCODING 46299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR B4DC +ENCODING 46300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2000 +2000 +2000 +2000 +3F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR B4DD +ENCODING 46301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B4DE +ENCODING 46302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B4DF +ENCODING 46303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B4E0 +ENCODING 46304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B4E1 +ENCODING 46305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B4E2 +ENCODING 46306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B4E3 +ENCODING 46307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B4E4 +ENCODING 46308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B4E5 +ENCODING 46309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B4E6 +ENCODING 46310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR B4E7 +ENCODING 46311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B4E8 +ENCODING 46312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B4E9 +ENCODING 46313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B4EA +ENCODING 46314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B4EB +ENCODING 46315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B4EC +ENCODING 46316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B4ED +ENCODING 46317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B4EE +ENCODING 46318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B4EF +ENCODING 46319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B4F0 +ENCODING 46320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR B4F1 +ENCODING 46321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +2000 +3F80 +0000 +FFC0 +0000 +1F00 +2100 +2100 +1F00 +ENDCHAR +STARTCHAR B4F2 +ENCODING 46322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR B4F3 +ENCODING 46323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B4F4 +ENCODING 46324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR B4F5 +ENCODING 46325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +40 +40 +7F +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR B4F6 +ENCODING 46326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2000 +3F00 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B4F7 +ENCODING 46327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +40 +7F +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B4F8 +ENCODING 46328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +4080 +4080 +7E80 +0080 +0080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B4F9 +ENCODING 46329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B4FA +ENCODING 46330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B4FB +ENCODING 46331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +F900 +0100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B4FC +ENCODING 46332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +81 +79 +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR B4FD +ENCODING 46333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B4FE +ENCODING 46334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B4FF +ENCODING 46335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR B500 +ENCODING 46336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +3F00 +0080 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR B501 +ENCODING 46337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +0000 +1B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B502 +ENCODING 46338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +0000 +3F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR B503 +ENCODING 46339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +3000 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR B504 +ENCODING 46340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B505 +ENCODING 46341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +3100 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR B506 +ENCODING 46342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B507 +ENCODING 46343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +3380 +0F80 +3B00 +2480 +3B00 +ENDCHAR +STARTCHAR B508 +ENCODING 46344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR B509 +ENCODING 46345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR B50A +ENCODING 46346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B50B +ENCODING 46347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +F9 +01 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR B50C +ENCODING 46348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B50D +ENCODING 46349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B50E +ENCODING 46350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +F900 +0100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B50F +ENCODING 46351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR B510 +ENCODING 46352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B511 +ENCODING 46353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +0F00 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR B512 +ENCODING 46354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +F9 +01 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR B513 +ENCODING 46355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4080 +7C80 +0080 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR B514 +ENCODING 46356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B515 +ENCODING 46357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B516 +ENCODING 46358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +81 +81 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B517 +ENCODING 46359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +8100 +8100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B518 +ENCODING 46360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B519 +ENCODING 46361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +81 +81 +FD +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B51A +ENCODING 46362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B51B +ENCODING 46363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +FD +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR B51C +ENCODING 46364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B51D +ENCODING 46365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B51E +ENCODING 46366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B51F +ENCODING 46367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B520 +ENCODING 46368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B521 +ENCODING 46369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B522 +ENCODING 46370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B523 +ENCODING 46371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B524 +ENCODING 46372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B525 +ENCODING 46373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B526 +ENCODING 46374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8100 +8100 +8100 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B527 +ENCODING 46375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8100 +8100 +FD00 +0100 +0800 +0800 +1600 +6180 +ENDCHAR +STARTCHAR B528 +ENCODING 46376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8100 +8100 +FD00 +0100 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR B529 +ENCODING 46377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +81 +81 +FD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B52A +ENCODING 46378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +8100 +8100 +FD00 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B52B +ENCODING 46379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +8100 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B52C +ENCODING 46380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +81 +81 +81 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B52D +ENCODING 46381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B52E +ENCODING 46382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +81 +81 +81 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B52F +ENCODING 46383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +81 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B530 +ENCODING 46384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9100 +9180 +9100 +9100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B531 +ENCODING 46385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B532 +ENCODING 46386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B533 +ENCODING 46387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B534 +ENCODING 46388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B535 +ENCODING 46389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B536 +ENCODING 46390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B537 +ENCODING 46391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR B538 +ENCODING 46392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9180 +9100 +FD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B539 +ENCODING 46393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B53A +ENCODING 46394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR B53B +ENCODING 46395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR B53C +ENCODING 46396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B53D +ENCODING 46397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B53E +ENCODING 46398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B53F +ENCODING 46399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B540 +ENCODING 46400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR B541 +ENCODING 46401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR B542 +ENCODING 46402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B543 +ENCODING 46403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR B544 +ENCODING 46404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0000 +2200 +2200 +5500 +8980 +ENDCHAR +STARTCHAR B545 +ENCODING 46405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9100 +9180 +9100 +FD00 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B546 +ENCODING 46406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR B547 +ENCODING 46407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B548 +ENCODING 46408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B549 +ENCODING 46409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9100 +9180 +9D00 +4000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B54A +ENCODING 46410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9100 +9180 +9100 +4D00 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B54B +ENCODING 46411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9180 +9100 +FD00 +0100 +1C00 +0000 +7F00 +2200 +1C00 +ENDCHAR +STARTCHAR B54C +ENCODING 46412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +A3 +A3 +A3 +A3 +FB +03 +03 +03 +ENDCHAR +STARTCHAR B54D +ENCODING 46413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +A3 +A3 +FB +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B54E +ENCODING 46414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +A5 +A3 +A5 +DD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B54F +ENCODING 46415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A500 +A300 +A500 +DD00 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B550 +ENCODING 46416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FB00 +A300 +A300 +A300 +A300 +FB00 +0300 +2300 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B551 +ENCODING 46417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A500 +A300 +A500 +DD00 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B552 +ENCODING 46418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B553 +ENCODING 46419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A5 +A3 +A5 +DD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B554 +ENCODING 46420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +A3 +FB +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B555 +ENCODING 46421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B556 +ENCODING 46422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B557 +ENCODING 46423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B558 +ENCODING 46424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B559 +ENCODING 46425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B55A +ENCODING 46426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B55B +ENCODING 46427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B55C +ENCODING 46428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +A3 +A3 +FB +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B55D +ENCODING 46429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +A3 +A3 +FB +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B55E +ENCODING 46430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A500 +A300 +A500 +DD00 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B55F +ENCODING 46431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FB00 +A300 +A300 +A300 +A300 +FB00 +0300 +0900 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B560 +ENCODING 46432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FB00 +A300 +A300 +A300 +A300 +FB00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR B561 +ENCODING 46433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +A3 +A3 +FB +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B562 +ENCODING 46434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A500 +A300 +A500 +DD00 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B563 +ENCODING 46435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A500 +A300 +ED00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B564 +ENCODING 46436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +A5 +A3 +A5 +DD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B565 +ENCODING 46437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B566 +ENCODING 46438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A5 +A3 +A5 +DD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B567 +ENCODING 46439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A3 +ED +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B568 +ENCODING 46440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FD00 +9100 +9180 +9100 +9100 +9180 +5D00 +0100 +0100 +ENDCHAR +STARTCHAR B569 +ENCODING 46441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR B56A +ENCODING 46442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B56B +ENCODING 46443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B56C +ENCODING 46444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +9180 +9100 +9100 +FD80 +0100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR B56D +ENCODING 46445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B56E +ENCODING 46446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B56F +ENCODING 46447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR B570 +ENCODING 46448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7E00 +0100 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B571 +ENCODING 46449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B572 +ENCODING 46450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR B573 +ENCODING 46451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR B574 +ENCODING 46452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B575 +ENCODING 46453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B576 +ENCODING 46454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B577 +ENCODING 46455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B578 +ENCODING 46456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR B579 +ENCODING 46457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR B57A +ENCODING 46458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B57B +ENCODING 46459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B57C +ENCODING 46460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B57D +ENCODING 46461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +1800 +2600 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR B57E +ENCODING 46462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR B57F +ENCODING 46463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B580 +ENCODING 46464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B581 +ENCODING 46465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B582 +ENCODING 46466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +9180 +9100 +9180 +4D00 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B583 +ENCODING 46467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +9180 +9100 +9D80 +4000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR B584 +ENCODING 46468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +DD +A5 +A7 +A5 +A5 +A3 +DD +05 +05 +01 +ENDCHAR +STARTCHAR B585 +ENCODING 46469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B586 +ENCODING 46470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B587 +ENCODING 46471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A300 +A500 +A300 +DD00 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B588 +ENCODING 46472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A7 +A5 +A5 +FF +05 +01 +20 +3F +ENDCHAR +STARTCHAR B589 +ENCODING 46473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A300 +A500 +A300 +DD00 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B58A +ENCODING 46474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B58B +ENCODING 46475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B58C +ENCODING 46476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B58D +ENCODING 46477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B58E +ENCODING 46478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B58F +ENCODING 46479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B590 +ENCODING 46480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B591 +ENCODING 46481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B592 +ENCODING 46482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B593 +ENCODING 46483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B594 +ENCODING 46484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +3F +41 +7F +ENDCHAR +STARTCHAR B595 +ENCODING 46485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +21 +3F +3F +ENDCHAR +STARTCHAR B596 +ENCODING 46486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A300 +A500 +A300 +DD00 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B597 +ENCODING 46487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A3 +A5 +A3 +DD +01 +08 +14 +63 +ENDCHAR +STARTCHAR B598 +ENCODING 46488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A300 +A500 +A300 +DD00 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B599 +ENCODING 46489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +A3 +A5 +A3 +DD +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR B59A +ENCODING 46490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +A300 +A500 +A300 +DD00 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B59B +ENCODING 46491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A300 +A500 +EB00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B59C +ENCODING 46492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B59D +ENCODING 46493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B59E +ENCODING 46494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +A3 +A5 +A3 +DD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B59F +ENCODING 46495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A3 +A5 +EB +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B5A0 +ENCODING 46496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +97 +91 +91 +91 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B5A1 +ENCODING 46497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +91 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B5A2 +ENCODING 46498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +97 +91 +4D +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B5A3 +ENCODING 46499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9700 +9100 +4D00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B5A4 +ENCODING 46500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +91 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR B5A5 +ENCODING 46501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +97 +91 +4D +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B5A6 +ENCODING 46502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B5A7 +ENCODING 46503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +91 +97 +91 +4D +00 +7E +40 +7E +ENDCHAR +STARTCHAR B5A8 +ENCODING 46504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B5A9 +ENCODING 46505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B5AA +ENCODING 46506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +FD +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B5AB +ENCODING 46507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +FD +00 +75 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B5AC +ENCODING 46508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B5AD +ENCODING 46509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B5AE +ENCODING 46510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B5AF +ENCODING 46511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B5B0 +ENCODING 46512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +91 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B5B1 +ENCODING 46513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +91 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B5B2 +ENCODING 46514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9700 +9100 +4D00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B5B3 +ENCODING 46515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +91 +FD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR B5B4 +ENCODING 46516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9100 +9700 +9100 +9100 +FD00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR B5B5 +ENCODING 46517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +91 +FD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B5B6 +ENCODING 46518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9700 +9100 +4D00 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B5B7 +ENCODING 46519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9700 +9100 +DD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B5B8 +ENCODING 46520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +97 +91 +4D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B5B9 +ENCODING 46521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +91 +DD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B5BA +ENCODING 46522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +91 +97 +91 +4D +00 +3F +12 +3F +ENDCHAR +STARTCHAR B5BB +ENCODING 46523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +FD +01 +1C +00 +7F +22 +1E +ENDCHAR +STARTCHAR B5BC +ENCODING 46524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +A3 +AF +A3 +A3 +A3 +FB +03 +03 +03 +ENDCHAR +STARTCHAR B5BD +ENCODING 46525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +AF +A3 +A3 +FB +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B5BE +ENCODING 46526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +A7 +A3 +D9 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B5BF +ENCODING 46527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +A700 +A300 +D900 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B5C0 +ENCODING 46528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FB00 +A300 +AF00 +A300 +A300 +FB00 +0300 +2300 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B5C1 +ENCODING 46529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +A700 +A300 +D900 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B5C2 +ENCODING 46530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B5C3 +ENCODING 46531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +A7 +A3 +D9 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B5C4 +ENCODING 46532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +AF +A3 +FB +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B5C5 +ENCODING 46533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B5C6 +ENCODING 46534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B5C7 +ENCODING 46535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B5C8 +ENCODING 46536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B5C9 +ENCODING 46537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B5CA +ENCODING 46538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B5CB +ENCODING 46539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B5CC +ENCODING 46540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +AF +A3 +A3 +FB +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B5CD +ENCODING 46541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +AF +A3 +A3 +FB +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B5CE +ENCODING 46542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +A700 +A300 +D900 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B5CF +ENCODING 46543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FB00 +A300 +AF00 +A300 +A300 +FB00 +0300 +0900 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B5D0 +ENCODING 46544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FB00 +A300 +AF00 +A300 +A300 +FB00 +0000 +2200 +2200 +3500 +4C80 +ENDCHAR +STARTCHAR B5D1 +ENCODING 46545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FB +A3 +AF +A3 +A3 +FB +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B5D2 +ENCODING 46546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +A700 +A300 +D900 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B5D3 +ENCODING 46547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +A300 +A700 +EB00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B5D4 +ENCODING 46548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +A7 +A3 +D9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B5D5 +ENCODING 46549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B5D6 +ENCODING 46550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +A7 +A3 +D9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B5D7 +ENCODING 46551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +A3 +A7 +EB +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B5D8 +ENCODING 46552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +97 +91 +97 +91 +91 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B5D9 +ENCODING 46553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR B5DA +ENCODING 46554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B5DB +ENCODING 46555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9700 +9300 +9100 +4D00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B5DC +ENCODING 46556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +97 +91 +97 +FD +01 +01 +20 +3F +ENDCHAR +STARTCHAR B5DD +ENCODING 46557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +93 +91 +4D +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B5DE +ENCODING 46558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B5DF +ENCODING 46559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +7E +40 +7E +ENDCHAR +STARTCHAR B5E0 +ENCODING 46560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B5E1 +ENCODING 46561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B5E2 +ENCODING 46562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B5E3 +ENCODING 46563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B5E4 +ENCODING 46564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B5E5 +ENCODING 46565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B5E6 +ENCODING 46566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B5E7 +ENCODING 46567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B5E8 +ENCODING 46568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +7F +41 +7F +ENDCHAR +STARTCHAR B5E9 +ENCODING 46569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +97 +93 +91 +4D +01 +41 +7F +7F +ENDCHAR +STARTCHAR B5EA +ENCODING 46570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9700 +9300 +9100 +4D00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B5EB +ENCODING 46571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +08 +14 +63 +ENDCHAR +STARTCHAR B5EC +ENCODING 46572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +9700 +9100 +9700 +9100 +FD00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR B5ED +ENCODING 46573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +93 +91 +4D +0C +32 +41 +23 +1C +ENDCHAR +STARTCHAR B5EE +ENCODING 46574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9700 +9300 +9100 +4D00 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B5EF +ENCODING 46575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9700 +9700 +DD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B5F0 +ENCODING 46576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B5F1 +ENCODING 46577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B5F2 +ENCODING 46578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +97 +93 +91 +4D +00 +3F +12 +3F +ENDCHAR +STARTCHAR B5F3 +ENCODING 46579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +97 +97 +DD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B5F4 +ENCODING 46580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +DB +A3 +AD +A3 +AD +A3 +DB +03 +03 +ENDCHAR +STARTCHAR B5F5 +ENCODING 46581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B5F6 +ENCODING 46582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B5F7 +ENCODING 46583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +AD00 +A300 +AD00 +D900 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B5F8 +ENCODING 46584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A5 +A3 +A5 +FB +03 +01 +20 +3F +ENDCHAR +STARTCHAR B5F9 +ENCODING 46585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +AD00 +A300 +AD00 +D900 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B5FA +ENCODING 46586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B5FB +ENCODING 46587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B5FC +ENCODING 46588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B5FD +ENCODING 46589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B5FE +ENCODING 46590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B5FF +ENCODING 46591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B600 +ENCODING 46592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B601 +ENCODING 46593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B602 +ENCODING 46594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B603 +ENCODING 46595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B604 +ENCODING 46596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +3F +41 +7F +ENDCHAR +STARTCHAR B605 +ENCODING 46597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +21 +3F +3F +ENDCHAR +STARTCHAR B606 +ENCODING 46598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +AD00 +A300 +AD00 +D900 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B607 +ENCODING 46599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +AD +A7 +A3 +DB +01 +08 +14 +63 +ENDCHAR +STARTCHAR B608 +ENCODING 46600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +AD00 +A300 +AD00 +D900 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B609 +ENCODING 46601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +AD +A7 +A3 +DB +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR B60A +ENCODING 46602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +AD00 +A300 +AD00 +D900 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR B60B +ENCODING 46603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +AD00 +A700 +EB00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B60C +ENCODING 46604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B60D +ENCODING 46605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B60E +ENCODING 46606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +AD +A3 +AD +D9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B60F +ENCODING 46607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +AD +A7 +EB +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B610 +ENCODING 46608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7F80 +4400 +4400 +4400 +3F80 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR B611 +ENCODING 46609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B612 +ENCODING 46610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B613 +ENCODING 46611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +EE00 +8800 +7F00 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR B614 +ENCODING 46612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B615 +ENCODING 46613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B616 +ENCODING 46614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B617 +ENCODING 46615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B618 +ENCODING 46616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B619 +ENCODING 46617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B61A +ENCODING 46618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B61B +ENCODING 46619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B61C +ENCODING 46620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B61D +ENCODING 46621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR B61E +ENCODING 46622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR B61F +ENCODING 46623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR B620 +ENCODING 46624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +08 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR B621 +ENCODING 46625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +08 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR B622 +ENCODING 46626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B623 +ENCODING 46627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR B624 +ENCODING 46628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR B625 +ENCODING 46629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B626 +ENCODING 46630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR B627 +ENCODING 46631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +6F +FF +00 +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B628 +ENCODING 46632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +EE +88 +7F +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR B629 +ENCODING 46633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3B80 +4400 +4400 +3380 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR B62A +ENCODING 46634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR B62B +ENCODING 46635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +6F +FF +00 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B62C +ENCODING 46636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6E80 +4880 +4880 +4880 +6EC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B62D +ENCODING 46637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR B62E +ENCODING 46638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B62F +ENCODING 46639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B630 +ENCODING 46640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7E80 +4880 +4880 +24C0 +1080 +FE80 +0000 +2000 +3F00 +ENDCHAR +STARTCHAR B631 +ENCODING 46641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B632 +ENCODING 46642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B633 +ENCODING 46643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR B634 +ENCODING 46644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +4880 +6E80 +10C0 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B635 +ENCODING 46645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B636 +ENCODING 46646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B637 +ENCODING 46647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR B638 +ENCODING 46648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B639 +ENCODING 46649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR B63A +ENCODING 46650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B63B +ENCODING 46651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B63C +ENCODING 46652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR B63D +ENCODING 46653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR B63E +ENCODING 46654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR B63F +ENCODING 46655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B640 +ENCODING 46656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B641 +ENCODING 46657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR B642 +ENCODING 46658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR B643 +ENCODING 46659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR B644 +ENCODING 46660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR B645 +ENCODING 46661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR B646 +ENCODING 46662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +9100 +D980 +2100 +2D00 +D000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR B647 +ENCODING 46663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +6C80 +4880 +6EC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR B648 +ENCODING 46664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +9280 +9280 +9280 +7D80 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR B649 +ENCODING 46665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B64A +ENCODING 46666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B64B +ENCODING 46667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A500 +A700 +3500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B64C +ENCODING 46668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +A5 +A5 +17 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR B64D +ENCODING 46669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A500 +A700 +3500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B64E +ENCODING 46670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR B64F +ENCODING 46671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B650 +ENCODING 46672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B651 +ENCODING 46673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR B652 +ENCODING 46674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR B653 +ENCODING 46675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR B654 +ENCODING 46676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR B655 +ENCODING 46677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR B656 +ENCODING 46678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR B657 +ENCODING 46679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR B658 +ENCODING 46680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR B659 +ENCODING 46681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR B65A +ENCODING 46682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A500 +A700 +3500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B65B +ENCODING 46683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR B65C +ENCODING 46684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A500 +A700 +3500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B65D +ENCODING 46685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A7 +35 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR B65E +ENCODING 46686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +A500 +A700 +3500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B65F +ENCODING 46687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR B660 +ENCODING 46688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B661 +ENCODING 46689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B662 +ENCODING 46690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +A5 +A7 +35 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B663 +ENCODING 46691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +5280 +7B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR B664 +ENCODING 46692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +6E80 +4880 +4880 +4880 +7E80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B665 +ENCODING 46693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B666 +ENCODING 46694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B667 +ENCODING 46695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +9100 +D900 +0100 +3D00 +C100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B668 +ENCODING 46696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +4880 +7E80 +1080 +1080 +FF80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B669 +ENCODING 46697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B66A +ENCODING 46698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B66B +ENCODING 46699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +3F +40 +7E +ENDCHAR +STARTCHAR B66C +ENCODING 46700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR B66D +ENCODING 46701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B66E +ENCODING 46702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR B66F +ENCODING 46703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B670 +ENCODING 46704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B671 +ENCODING 46705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B672 +ENCODING 46706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B673 +ENCODING 46707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR B674 +ENCODING 46708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +7F +41 +7F +ENDCHAR +STARTCHAR B675 +ENCODING 46709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +41 +7F +7F +ENDCHAR +STARTCHAR B676 +ENCODING 46710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +52 +72 +55 +78 +ENDCHAR +STARTCHAR B677 +ENCODING 46711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +08 +14 +63 +ENDCHAR +STARTCHAR B678 +ENCODING 46712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B679 +ENCODING 46713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B67A +ENCODING 46714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +9100 +D900 +0100 +3D00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B67B +ENCODING 46715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +DD00 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B67C +ENCODING 46716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +7F +3F +01 +01 +ENDCHAR +STARTCHAR B67D +ENCODING 46717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR B67E +ENCODING 46718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +91 +D9 +01 +3D +C1 +7F +12 +3F +ENDCHAR +STARTCHAR B67F +ENCODING 46719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B680 +ENCODING 46720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 8 0 0 +BITMAP +3F80 +4400 +4400 +4400 +3F80 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR B681 +ENCODING 46721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR B682 +ENCODING 46722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B683 +ENCODING 46723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +EE00 +8800 +7F00 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR B684 +ENCODING 46724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +C8 +26 +24 +DB +40 +40 +7E +ENDCHAR +STARTCHAR B685 +ENCODING 46725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR B686 +ENCODING 46726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B687 +ENCODING 46727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B688 +ENCODING 46728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR B689 +ENCODING 46729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B68A +ENCODING 46730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B68B +ENCODING 46731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B68C +ENCODING 46732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B68D +ENCODING 46733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR B68E +ENCODING 46734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR B68F +ENCODING 46735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR B690 +ENCODING 46736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR B691 +ENCODING 46737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +24 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR B692 +ENCODING 46738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B693 +ENCODING 46739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR B694 +ENCODING 46740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR B695 +ENCODING 46741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR B696 +ENCODING 46742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR B697 +ENCODING 46743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +24 +DB +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B698 +ENCODING 46744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +EE +88 +7F +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR B699 +ENCODING 46745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3B80 +4400 +4400 +3380 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR B69A +ENCODING 46746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +EE +88 +7F +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR B69B +ENCODING 46747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +24 +DB +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B69C +ENCODING 46748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +4400 +4400 +4400 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR B69D +ENCODING 46749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B69E +ENCODING 46750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B69F +ENCODING 46751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B6A0 +ENCODING 46752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR B6A1 +ENCODING 46753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B6A2 +ENCODING 46754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR B6A3 +ENCODING 46755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B6A4 +ENCODING 46756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B6A5 +ENCODING 46757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR B6A6 +ENCODING 46758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR B6A7 +ENCODING 46759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR B6A8 +ENCODING 46760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR B6A9 +ENCODING 46761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR B6AA +ENCODING 46762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR B6AB +ENCODING 46763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +3F80 +0000 +FFC0 +0400 +7B00 +0800 +3F80 +4480 +3B80 +ENDCHAR +STARTCHAR B6AC +ENCODING 46764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B6AD +ENCODING 46765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +2400 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR B6AE +ENCODING 46766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B6AF +ENCODING 46767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR B6B0 +ENCODING 46768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR B6B1 +ENCODING 46769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR B6B2 +ENCODING 46770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +EE +88 +7F +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR B6B3 +ENCODING 46771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR B6B4 +ENCODING 46772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR B6B5 +ENCODING 46773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +77 +88 +88 +7F +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR B6B6 +ENCODING 46774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B6B7 +ENCODING 46775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B6B8 +ENCODING 46776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +4880 +4880 +7E80 +0080 +FE80 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR B6B9 +ENCODING 46777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B6BA +ENCODING 46778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B6BB +ENCODING 46779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B6BC +ENCODING 46780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +91 +49 +FF +27 +21 +40 +7F +ENDCHAR +STARTCHAR B6BD +ENCODING 46781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B6BE +ENCODING 46782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B6BF +ENCODING 46783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +3F +40 +7E +ENDCHAR +STARTCHAR B6C0 +ENCODING 46784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR B6C1 +ENCODING 46785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B6C2 +ENCODING 46786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B6C3 +ENCODING 46787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B6C4 +ENCODING 46788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B6C5 +ENCODING 46789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B6C6 +ENCODING 46790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B6C7 +ENCODING 46791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR B6C8 +ENCODING 46792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +7F +41 +7F +ENDCHAR +STARTCHAR B6C9 +ENCODING 46793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +41 +7F +7F +ENDCHAR +STARTCHAR B6CA +ENCODING 46794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B6CB +ENCODING 46795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +08 +14 +63 +ENDCHAR +STARTCHAR B6CC +ENCODING 46796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B6CD +ENCODING 46797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B6CE +ENCODING 46798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +9100 +FD00 +1D00 +E100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B6CF +ENCODING 46799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +FD00 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B6D0 +ENCODING 46800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B6D1 +ENCODING 46801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B6D2 +ENCODING 46802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +1D +E1 +27 +3F +12 +3F +ENDCHAR +STARTCHAR B6D3 +ENCODING 46803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR B6D4 +ENCODING 46804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7D80 +5180 +5180 +7D80 +0180 +FD80 +1180 +1680 +1180 +1180 +0180 +ENDCHAR +STARTCHAR B6D5 +ENCODING 46805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B6D6 +ENCODING 46806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B6D7 +ENCODING 46807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +FB00 +FB00 +2B00 +2100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B6D8 +ENCODING 46808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7E80 +5280 +7A80 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR B6D9 +ENCODING 46809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +FB00 +FB00 +2B00 +2100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B6DA +ENCODING 46810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR B6DB +ENCODING 46811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +3F +40 +7F +ENDCHAR +STARTCHAR B6DC +ENCODING 46812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR B6DD +ENCODING 46813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR B6DE +ENCODING 46814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR B6DF +ENCODING 46815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR B6E0 +ENCODING 46816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR B6E1 +ENCODING 46817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR B6E2 +ENCODING 46818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR B6E3 +ENCODING 46819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR B6E4 +ENCODING 46820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +3F +41 +7F +ENDCHAR +STARTCHAR B6E5 +ENCODING 46821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +41 +7F +7F +ENDCHAR +STARTCHAR B6E6 +ENCODING 46822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +FB00 +FB00 +2B00 +2100 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B6E7 +ENCODING 46823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +08 +1C +63 +ENDCHAR +STARTCHAR B6E8 +ENCODING 46824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +02 +22 +55 +08 +ENDCHAR +STARTCHAR B6E9 +ENCODING 46825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +3E +41 +61 +1E +ENDCHAR +STARTCHAR B6EA +ENCODING 46826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +A300 +FB00 +FB00 +2B00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B6EB +ENCODING 46827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR B6EC +ENCODING 46828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +3F +01 +3F +01 +ENDCHAR +STARTCHAR B6ED +ENCODING 46829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B6EE +ENCODING 46830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FB +A3 +FB +FB +2B +21 +3F +12 +3F +ENDCHAR +STARTCHAR B6EF +ENCODING 46831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5A80 +5280 +6E80 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR B6F0 +ENCODING 46832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +4880 +4880 +7E80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR B6F1 +ENCODING 46833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B6F2 +ENCODING 46834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B6F3 +ENCODING 46835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B6F4 +ENCODING 46836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +FD +01 +FF +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR B6F5 +ENCODING 46837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B6F6 +ENCODING 46838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B6F7 +ENCODING 46839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR B6F8 +ENCODING 46840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +FD +01 +FF +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B6F9 +ENCODING 46841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B6FA +ENCODING 46842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B6FB +ENCODING 46843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B6FC +ENCODING 46844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B6FD +ENCODING 46845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B6FE +ENCODING 46846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B6FF +ENCODING 46847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR B700 +ENCODING 46848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +FD +01 +FF +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR B701 +ENCODING 46849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +FD +01 +FF +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR B702 +ENCODING 46850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B703 +ENCODING 46851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR B704 +ENCODING 46852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B705 +ENCODING 46853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +FD +01 +FD +21 +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR B706 +ENCODING 46854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +9100 +FD00 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B707 +ENCODING 46855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +FD00 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B708 +ENCODING 46856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +91 +FD +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B709 +ENCODING 46857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B70A +ENCODING 46858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +91 +FD +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR B70B +ENCODING 46859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +FD +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B70C +ENCODING 46860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +4400 +3F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR B70D +ENCODING 46861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B70E +ENCODING 46862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B70F +ENCODING 46863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B710 +ENCODING 46864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +7700 +0000 +FFC0 +1200 +3200 +2000 +3F00 +ENDCHAR +STARTCHAR B711 +ENCODING 46865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B712 +ENCODING 46866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR B713 +ENCODING 46867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR B714 +ENCODING 46868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +77 +88 +88 +7F +00 +FF +24 +5B +7E +7E +ENDCHAR +STARTCHAR B715 +ENCODING 46869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR B716 +ENCODING 46870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR B717 +ENCODING 46871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR B718 +ENCODING 46872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR B719 +ENCODING 46873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR B71A +ENCODING 46874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR B71B +ENCODING 46875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR B71C +ENCODING 46876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR B71D +ENCODING 46877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR B71E +ENCODING 46878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B71F +ENCODING 46879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR B720 +ENCODING 46880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR B721 +ENCODING 46881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR B722 +ENCODING 46882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR B723 +ENCODING 46883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR B724 +ENCODING 46884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR B725 +ENCODING 46885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +77 +88 +88 +7F +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR B726 +ENCODING 46886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B727 +ENCODING 46887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +7F +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR B728 +ENCODING 46888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7F80 +4400 +4400 +4400 +4400 +3F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR B729 +ENCODING 46889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B72A +ENCODING 46890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR B72B +ENCODING 46891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR B72C +ENCODING 46892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B72D +ENCODING 46893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B72E +ENCODING 46894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B72F +ENCODING 46895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B730 +ENCODING 46896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B731 +ENCODING 46897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR B732 +ENCODING 46898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR B733 +ENCODING 46899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR B734 +ENCODING 46900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B735 +ENCODING 46901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR B736 +ENCODING 46902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR B737 +ENCODING 46903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR B738 +ENCODING 46904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR B739 +ENCODING 46905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B73A +ENCODING 46906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR B73B +ENCODING 46907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F80 +4400 +4400 +3F80 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR B73C +ENCODING 46908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR B73D +ENCODING 46909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR B73E +ENCODING 46910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR B73F +ENCODING 46911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR B740 +ENCODING 46912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR B741 +ENCODING 46913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +77 +88 +88 +67 +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR B742 +ENCODING 46914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7700 +4400 +3F80 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR B743 +ENCODING 46915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +77 +88 +88 +67 +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR B744 +ENCODING 46916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +4880 +4880 +7E80 +0080 +0080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B745 +ENCODING 46917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B746 +ENCODING 46918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +3F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR B747 +ENCODING 46919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR B748 +ENCODING 46920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +4880 +7E80 +0080 +FF80 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B749 +ENCODING 46921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR B74A +ENCODING 46922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR B74B +ENCODING 46923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +1F80 +2000 +3F00 +ENDCHAR +STARTCHAR B74C +ENCODING 46924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +7E80 +0080 +FF80 +0000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR B74D +ENCODING 46925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B74E +ENCODING 46926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR B74F +ENCODING 46927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B750 +ENCODING 46928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR B751 +ENCODING 46929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B752 +ENCODING 46930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR B753 +ENCODING 46931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR B754 +ENCODING 46932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +4880 +7E80 +0080 +FF80 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR B755 +ENCODING 46933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +4880 +4880 +7E80 +0080 +FF80 +0000 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR B756 +ENCODING 46934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +2900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR B757 +ENCODING 46935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR B758 +ENCODING 46936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +1100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR B759 +ENCODING 46937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +1F00 +2080 +3180 +0E00 +ENDCHAR +STARTCHAR B75A +ENCODING 46938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR B75B +ENCODING 46939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +DD00 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B75C +ENCODING 46940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +3F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR B75D +ENCODING 46941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR B75E +ENCODING 46942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +4880 +6C80 +0080 +FF80 +0080 +3F80 +0900 +1F80 +ENDCHAR +STARTCHAR B75F +ENCODING 46943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +DD +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B760 +ENCODING 46944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +91 +91 +91 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B761 +ENCODING 46945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +91 +4D +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR B762 +ENCODING 46946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +91 +4D +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B763 +ENCODING 46947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9100 +9100 +4D00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B764 +ENCODING 46948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +91 +FD +01 +41 +40 +40 +3F +ENDCHAR +STARTCHAR B765 +ENCODING 46949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +91 +4D +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B766 +ENCODING 46950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B767 +ENCODING 46951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +91 +91 +91 +4D +00 +7E +40 +7E +ENDCHAR +STARTCHAR B768 +ENCODING 46952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B769 +ENCODING 46953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B76A +ENCODING 46954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B76B +ENCODING 46955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B76C +ENCODING 46956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B76D +ENCODING 46957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B76E +ENCODING 46958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B76F +ENCODING 46959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B770 +ENCODING 46960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +91 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B771 +ENCODING 46961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +FD +00 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B772 +ENCODING 46962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9100 +9100 +4D00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B773 +ENCODING 46963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +91 +FD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR B774 +ENCODING 46964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9100 +9100 +4D00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B775 +ENCODING 46965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +91 +91 +91 +91 +FD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR B776 +ENCODING 46966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9100 +9100 +4D00 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B777 +ENCODING 46967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +9100 +9100 +DD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B778 +ENCODING 46968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +91 +4D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B779 +ENCODING 46969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B77A +ENCODING 46970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +91 +91 +91 +4D +00 +3F +12 +3F +ENDCHAR +STARTCHAR B77B +ENCODING 46971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +91 +91 +DD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B77C +ENCODING 46972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +F900 +8180 +8100 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B77D +ENCODING 46973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B77E +ENCODING 46974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +0900 +F180 +8100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B77F +ENCODING 46975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B780 +ENCODING 46976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +F980 +8100 +8100 +FD00 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B781 +ENCODING 46977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B782 +ENCODING 46978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B783 +ENCODING 46979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +0900 +F180 +8100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR B784 +ENCODING 46980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F980 +8100 +FD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B785 +ENCODING 46981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +6600 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B786 +ENCODING 46982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR B787 +ENCODING 46983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +6000 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR B788 +ENCODING 46984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +6200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B789 +ENCODING 46985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +6600 +1800 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR B78A +ENCODING 46986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +6000 +1700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B78B +ENCODING 46987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +6600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B78C +ENCODING 46988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR B78D +ENCODING 46989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR B78E +ENCODING 46990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR B78F +ENCODING 46991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR B790 +ENCODING 46992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +2200 +2200 +5500 +8980 +ENDCHAR +STARTCHAR B791 +ENCODING 46993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B792 +ENCODING 46994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +3F00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B793 +ENCODING 46995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B794 +ENCODING 46996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +0900 +F180 +8100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR B795 +ENCODING 46997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +8D00 +7000 +3E00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B796 +ENCODING 46998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8180 +8100 +FD00 +0000 +7F00 +2200 +2200 +7F00 +ENDCHAR +STARTCHAR B797 +ENCODING 46999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F980 +8100 +FD00 +0100 +1C00 +0000 +7F00 +2200 +1E00 +ENDCHAR +STARTCHAR B798 +ENCODING 47000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +F5 +87 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B799 +ENCODING 47001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +87 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B79A +ENCODING 47002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +F7 +85 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B79B +ENCODING 47003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +8500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B79C +ENCODING 47004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +F700 +8500 +8500 +FD00 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B79D +ENCODING 47005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +8500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B79E +ENCODING 47006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B79F +ENCODING 47007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +F7 +85 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B7A0 +ENCODING 47008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F7 +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B7A1 +ENCODING 47009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR B7A2 +ENCODING 47010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR B7A3 +ENCODING 47011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B7A4 +ENCODING 47012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR B7A5 +ENCODING 47013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B7A6 +ENCODING 47014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B7A7 +ENCODING 47015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +E700 +9500 +6500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR B7A8 +ENCODING 47016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +87 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B7A9 +ENCODING 47017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +87 +85 +FD +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B7AA +ENCODING 47018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +8500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B7AB +ENCODING 47019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +F500 +8700 +8500 +FD00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B7AC +ENCODING 47020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +F700 +8500 +8500 +FD00 +0000 +1200 +2200 +3500 +4C80 +ENDCHAR +STARTCHAR B7AD +ENCODING 47021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +87 +85 +FD +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR B7AE +ENCODING 47022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +8500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B7AF +ENCODING 47023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +E700 +9500 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B7B0 +ENCODING 47024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +F7 +85 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B7B1 +ENCODING 47025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B7B2 +ENCODING 47026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +F7 +85 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B7B3 +ENCODING 47027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E7 +95 +65 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B7B4 +ENCODING 47028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0980 +F900 +8100 +8180 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B7B5 +ENCODING 47029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F980 +8100 +8180 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B7B6 +ENCODING 47030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B7B7 +ENCODING 47031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B7B8 +ENCODING 47032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0980 +F900 +8100 +8180 +FD00 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B7B9 +ENCODING 47033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B7BA +ENCODING 47034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR B7BB +ENCODING 47035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR B7BC +ENCODING 47036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +3E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B7BD +ENCODING 47037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +6600 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B7BE +ENCODING 47038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR B7BF +ENCODING 47039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +6000 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR B7C0 +ENCODING 47040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +6200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B7C1 +ENCODING 47041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +6600 +1800 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR B7C2 +ENCODING 47042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +6000 +1700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B7C3 +ENCODING 47043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +6600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B7C4 +ENCODING 47044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR B7C5 +ENCODING 47045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR B7C6 +ENCODING 47046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR B7C7 +ENCODING 47047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F980 +8100 +8180 +FD00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR B7C8 +ENCODING 47048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B7C9 +ENCODING 47049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F980 +8100 +8180 +FD00 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B7CA +ENCODING 47050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR B7CB +ENCODING 47051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B7CC +ENCODING 47052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR B7CD +ENCODING 47053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +3E00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR B7CE +ENCODING 47054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +0980 +F100 +8180 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR B7CF +ENCODING 47055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +8D80 +7000 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR B7D0 +ENCODING 47056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +F5 +15 +17 +F5 +85 +87 +FD +05 +05 +ENDCHAR +STARTCHAR B7D1 +ENCODING 47057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B7D2 +ENCODING 47058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B7D3 +ENCODING 47059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +8700 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B7D4 +ENCODING 47060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +F7 +85 +97 +65 +05 +20 +3F +ENDCHAR +STARTCHAR B7D5 +ENCODING 47061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +8700 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B7D6 +ENCODING 47062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B7D7 +ENCODING 47063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B7D8 +ENCODING 47064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR B7D9 +ENCODING 47065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR B7DA +ENCODING 47066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR B7DB +ENCODING 47067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B7DC +ENCODING 47068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR B7DD +ENCODING 47069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B7DE +ENCODING 47070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B7DF +ENCODING 47071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +E500 +9700 +6500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR B7E0 +ENCODING 47072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR B7E1 +ENCODING 47073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR B7E2 +ENCODING 47074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +8700 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B7E3 +ENCODING 47075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR B7E4 +ENCODING 47076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +8700 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B7E5 +ENCODING 47077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +87 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR B7E6 +ENCODING 47078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +8700 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B7E7 +ENCODING 47079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +E500 +9700 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B7E8 +ENCODING 47080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B7E9 +ENCODING 47081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B7EA +ENCODING 47082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +87 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B7EB +ENCODING 47083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +E5 +97 +65 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B7EC +ENCODING 47084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +09 +09 +F1 +87 +81 +81 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR B7ED +ENCODING 47085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +F1 +87 +81 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B7EE +ENCODING 47086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +11 +F7 +81 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B7EF +ENCODING 47087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F700 +8100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B7F0 +ENCODING 47088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +11 +F7 +81 +81 +F9 +01 +20 +20 +3F +ENDCHAR +STARTCHAR B7F1 +ENCODING 47089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +11 +F7 +81 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B7F2 +ENCODING 47090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B7F3 +ENCODING 47091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +11 +F7 +81 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B7F4 +ENCODING 47092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +F7 +81 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B7F5 +ENCODING 47093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B7F6 +ENCODING 47094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B7F7 +ENCODING 47095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B7F8 +ENCODING 47096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B7F9 +ENCODING 47097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B7FA +ENCODING 47098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B7FB +ENCODING 47099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B7FC +ENCODING 47100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +F1 +87 +81 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B7FD +ENCODING 47101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +F7 +81 +81 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B7FE +ENCODING 47102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F700 +8100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B7FF +ENCODING 47103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +1100 +F100 +8700 +8100 +F900 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B800 +ENCODING 47104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +1100 +F100 +8700 +8100 +F900 +0000 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR B801 +ENCODING 47105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +F1 +87 +81 +F9 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B802 +ENCODING 47106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F700 +8100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B803 +ENCODING 47107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +1100 +E700 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B804 +ENCODING 47108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +11 +F7 +81 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B805 +ENCODING 47109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E7 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B806 +ENCODING 47110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +11 +F7 +81 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B807 +ENCODING 47111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +F7 +81 +F9 +01 +1C +00 +7F +22 +1E +ENDCHAR +STARTCHAR B808 +ENCODING 47112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +F5 +8D +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B809 +ENCODING 47113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +8D +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B80A +ENCODING 47114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +FD +85 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B80B +ENCODING 47115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +8500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B80C +ENCODING 47116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +ED00 +8500 +8500 +FD00 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B80D +ENCODING 47117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +8500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B80E +ENCODING 47118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B80F +ENCODING 47119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +FD +85 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B810 +ENCODING 47120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B811 +ENCODING 47121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR B812 +ENCODING 47122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR B813 +ENCODING 47123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B814 +ENCODING 47124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR B815 +ENCODING 47125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B816 +ENCODING 47126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B817 +ENCODING 47127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +E500 +9500 +6100 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR B818 +ENCODING 47128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +8D +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B819 +ENCODING 47129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +85 +85 +FD +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B81A +ENCODING 47130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +8500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B81B +ENCODING 47131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +F500 +8D00 +8500 +FD00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B81C +ENCODING 47132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +8500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B81D +ENCODING 47133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +8D +85 +FD +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR B81E +ENCODING 47134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +8500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B81F +ENCODING 47135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +E500 +9500 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B820 +ENCODING 47136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +FD +85 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B821 +ENCODING 47137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B822 +ENCODING 47138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +FD +85 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B823 +ENCODING 47139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +E5 +95 +61 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B824 +ENCODING 47140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +17 +F1 +81 +87 +81 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR B825 +ENCODING 47141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +17 +F1 +87 +81 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B826 +ENCODING 47142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +17 +F1 +83 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B827 +ENCODING 47143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1700 +F100 +8300 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B828 +ENCODING 47144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +11 +17 +F1 +87 +81 +F9 +01 +20 +20 +3F +ENDCHAR +STARTCHAR B829 +ENCODING 47145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +17 +F1 +83 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B82A +ENCODING 47146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B82B +ENCODING 47147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +17 +F1 +83 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B82C +ENCODING 47148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +17 +F1 +87 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B82D +ENCODING 47149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B82E +ENCODING 47150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B82F +ENCODING 47151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B830 +ENCODING 47152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B831 +ENCODING 47153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B832 +ENCODING 47154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B833 +ENCODING 47155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B834 +ENCODING 47156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +17 +F1 +87 +81 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B835 +ENCODING 47157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +17 +F1 +87 +81 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B836 +ENCODING 47158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1700 +F100 +8300 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B837 +ENCODING 47159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +1700 +F100 +8700 +8100 +F900 +0100 +0800 +0800 +3600 +4180 +ENDCHAR +STARTCHAR B838 +ENCODING 47160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +1700 +F100 +8700 +8100 +F900 +0000 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR B839 +ENCODING 47161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +17 +F1 +87 +81 +F9 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B83A +ENCODING 47162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1700 +F100 +8300 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B83B +ENCODING 47163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +1300 +E700 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B83C +ENCODING 47164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +17 +F1 +83 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B83D +ENCODING 47165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B83E +ENCODING 47166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +17 +F1 +83 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B83F +ENCODING 47167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +13 +E7 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B840 +ENCODING 47168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +1D +F5 +85 +8D +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR B841 +ENCODING 47169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B842 +ENCODING 47170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +85 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B843 +ENCODING 47171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +8500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B844 +ENCODING 47172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1D00 +E500 +8D00 +8500 +F500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B845 +ENCODING 47173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +8500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B846 +ENCODING 47174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B847 +ENCODING 47175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +85 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B848 +ENCODING 47176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR B849 +ENCODING 47177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR B84A +ENCODING 47178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR B84B +ENCODING 47179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B84C +ENCODING 47180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR B84D +ENCODING 47181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B84E +ENCODING 47182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B84F +ENCODING 47183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +E500 +9500 +6100 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR B850 +ENCODING 47184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +85 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR B851 +ENCODING 47185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +1D +F5 +8D +85 +F5 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B852 +ENCODING 47186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +8500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B853 +ENCODING 47187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1D00 +F500 +8D00 +8500 +F500 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B854 +ENCODING 47188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +8500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B855 +ENCODING 47189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +8D +FD +09 +37 +41 +23 +1C +ENDCHAR +STARTCHAR B856 +ENCODING 47190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +8500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B857 +ENCODING 47191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +E500 +9500 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B858 +ENCODING 47192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +85 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B859 +ENCODING 47193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B85A +ENCODING 47194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +85 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B85B +ENCODING 47195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +E5 +95 +61 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B85C +ENCODING 47196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +3F80 +2000 +2000 +3F80 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR B85D +ENCODING 47197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B85E +ENCODING 47198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B85F +ENCODING 47199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +F2 +16 +15 +18 +ENDCHAR +STARTCHAR B860 +ENCODING 47200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B861 +ENCODING 47201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +07 +42 +45 +20 +ENDCHAR +STARTCHAR B862 +ENCODING 47202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B863 +ENCODING 47203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +08 +F7 +7E +40 +7E +ENDCHAR +STARTCHAR B864 +ENCODING 47204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B865 +ENCODING 47205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B866 +ENCODING 47206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +3300 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B867 +ENCODING 47207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +3000 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B868 +ENCODING 47208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B869 +ENCODING 47209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR B86A +ENCODING 47210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B86B +ENCODING 47211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B86C +ENCODING 47212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B86D +ENCODING 47213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B86E +ENCODING 47214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +12 +72 +95 +78 +ENDCHAR +STARTCHAR B86F +ENCODING 47215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +0400 +0C00 +1B00 +6180 +ENDCHAR +STARTCHAR B870 +ENCODING 47216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +20 +26 +5D +80 +ENDCHAR +STARTCHAR B871 +ENCODING 47217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B872 +ENCODING 47218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +7E +02 +7F +ENDCHAR +STARTCHAR B873 +ENCODING 47219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR B874 +ENCODING 47220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +08 +F7 +7E +01 +7F +ENDCHAR +STARTCHAR B875 +ENCODING 47221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR B876 +ENCODING 47222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +08 +F7 +7F +24 +7E +ENDCHAR +STARTCHAR B877 +ENCODING 47223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3B00 +0400 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR B878 +ENCODING 47224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +4080 +7CC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B879 +ENCODING 47225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR B87A +ENCODING 47226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B87B +ENCODING 47227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B87C +ENCODING 47228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +4080 +7CC0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B87D +ENCODING 47229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B87E +ENCODING 47230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0300 +0480 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B87F +ENCODING 47231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR B880 +ENCODING 47232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3F00 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B881 +ENCODING 47233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B882 +ENCODING 47234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B883 +ENCODING 47235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3C80 +3F00 +4480 +3B00 +ENDCHAR +STARTCHAR B884 +ENCODING 47236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B885 +ENCODING 47237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3F00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR B886 +ENCODING 47238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B887 +ENCODING 47239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0300 +3880 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B888 +ENCODING 47240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR B889 +ENCODING 47241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR B88A +ENCODING 47242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +9200 +F200 +9500 +7800 +ENDCHAR +STARTCHAR B88B +ENCODING 47243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8180 +7900 +3D00 +C000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR B88C +ENCODING 47244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B88D +ENCODING 47245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +4080 +7CC0 +1080 +FE80 +0000 +1F00 +2080 +1F00 +ENDCHAR +STARTCHAR B88E +ENCODING 47246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8180 +7900 +2D00 +D000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR B88F +ENCODING 47247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR B890 +ENCODING 47248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR B891 +ENCODING 47249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0000 +3F00 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR B892 +ENCODING 47250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR B893 +ENCODING 47251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3800 +0480 +3C80 +40C0 +3C80 +FE80 +0E00 +3F80 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR B894 +ENCODING 47252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +65 +15 +75 +87 +D5 +25 +FD +05 +05 +01 +ENDCHAR +STARTCHAR B895 +ENCODING 47253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B896 +ENCODING 47254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B897 +ENCODING 47255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B898 +ENCODING 47256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +7280 +7B80 +1280 +FA80 +0280 +1000 +1F80 +ENDCHAR +STARTCHAR B899 +ENCODING 47257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR B89A +ENCODING 47258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR B89B +ENCODING 47259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR B89C +ENCODING 47260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B89D +ENCODING 47261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR B89E +ENCODING 47262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR B89F +ENCODING 47263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR B8A0 +ENCODING 47264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR B8A1 +ENCODING 47265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR B8A2 +ENCODING 47266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR B8A3 +ENCODING 47267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR B8A4 +ENCODING 47268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR B8A5 +ENCODING 47269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR B8A6 +ENCODING 47270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B8A7 +ENCODING 47271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR B8A8 +ENCODING 47272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7A80 +0A80 +7A80 +4380 +7A80 +1280 +FE80 +1100 +1100 +1A80 +2640 +ENDCHAR +STARTCHAR B8A9 +ENCODING 47273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR B8AA +ENCODING 47274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B8AB +ENCODING 47275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR B8AC +ENCODING 47276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B8AD +ENCODING 47277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR B8AE +ENCODING 47278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR B8AF +ENCODING 47279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR B8B0 +ENCODING 47280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +7C80 +4080 +7C80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B8B1 +ENCODING 47281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B8B2 +ENCODING 47282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B8B3 +ENCODING 47283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B8B4 +ENCODING 47284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +7D +21 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR B8B5 +ENCODING 47285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B8B6 +ENCODING 47286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +07 +4F +42 +45 +37 +ENDCHAR +STARTCHAR B8B7 +ENCODING 47287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR B8B8 +ENCODING 47288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +7D +20 +FF +01 +7F +40 +7F +ENDCHAR +STARTCHAR B8B9 +ENCODING 47289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B8BA +ENCODING 47290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +77 +79 +49 +76 +ENDCHAR +STARTCHAR B8BB +ENCODING 47291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B8BC +ENCODING 47292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +72 +32 +45 +70 +ENDCHAR +STARTCHAR B8BD +ENCODING 47293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B8BE +ENCODING 47294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B8BF +ENCODING 47295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR B8C0 +ENCODING 47296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +7D +21 +FF +00 +7F +41 +7F +ENDCHAR +STARTCHAR B8C1 +ENCODING 47297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +7D +21 +FE +41 +7F +41 +7F +ENDCHAR +STARTCHAR B8C2 +ENCODING 47298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +12 +72 +55 +70 +ENDCHAR +STARTCHAR B8C3 +ENCODING 47299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +7D +21 +FF +08 +08 +36 +41 +ENDCHAR +STARTCHAR B8C4 +ENCODING 47300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B8C5 +ENCODING 47301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +7D +21 +FF +00 +3E +41 +3E +ENDCHAR +STARTCHAR B8C6 +ENCODING 47302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +F900 +8100 +7900 +3D00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B8C7 +ENCODING 47303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0900 +7900 +8100 +7900 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B8C8 +ENCODING 47304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B8C9 +ENCODING 47305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B8CA +ENCODING 47306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +3F +12 +3F +ENDCHAR +STARTCHAR B8CB +ENCODING 47307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +0C +33 +0C +32 +1E +ENDCHAR +STARTCHAR B8CC +ENCODING 47308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +3F80 +2000 +2000 +3F80 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR B8CD +ENCODING 47309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +7E +01 +01 +ENDCHAR +STARTCHAR B8CE +ENCODING 47310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +7E +11 +11 +10 +ENDCHAR +STARTCHAR B8CF +ENCODING 47311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +F2 +16 +15 +18 +ENDCHAR +STARTCHAR B8D0 +ENCODING 47312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B8D1 +ENCODING 47313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +07 +42 +45 +20 +ENDCHAR +STARTCHAR B8D2 +ENCODING 47314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B8D3 +ENCODING 47315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +24 +DB +7E +40 +7E +ENDCHAR +STARTCHAR B8D4 +ENCODING 47316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +1200 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B8D5 +ENCODING 47317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B8D6 +ENCODING 47318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +3300 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B8D7 +ENCODING 47319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +3000 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B8D8 +ENCODING 47320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B8D9 +ENCODING 47321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR B8DA +ENCODING 47322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B8DB +ENCODING 47323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B8DC +ENCODING 47324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +24 +DB +7E +41 +7F +ENDCHAR +STARTCHAR B8DD +ENCODING 47325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +1200 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B8DE +ENCODING 47326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +12 +72 +95 +78 +ENDCHAR +STARTCHAR B8DF +ENCODING 47327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +1200 +FFC0 +0400 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR B8E0 +ENCODING 47328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +20 +26 +5D +80 +ENDCHAR +STARTCHAR B8E1 +ENCODING 47329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +1200 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B8E2 +ENCODING 47330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +7E +02 +7F +ENDCHAR +STARTCHAR B8E3 +ENCODING 47331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR B8E4 +ENCODING 47332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +24 +DB +7E +01 +7F +ENDCHAR +STARTCHAR B8E5 +ENCODING 47333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR B8E6 +ENCODING 47334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +24 +DB +7F +24 +7E +ENDCHAR +STARTCHAR B8E7 +ENCODING 47335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2D00 +1200 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR B8E8 +ENCODING 47336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +0080 +3F80 +2000 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR B8E9 +ENCODING 47337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B8EA +ENCODING 47338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +08 +77 +11 +10 +ENDCHAR +STARTCHAR B8EB +ENCODING 47339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +68 +12 +17 +18 +ENDCHAR +STARTCHAR B8EC +ENCODING 47340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR B8ED +ENCODING 47341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +0E +42 +45 +20 +ENDCHAR +STARTCHAR B8EE +ENCODING 47342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +0300 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR B8EF +ENCODING 47343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +F7 +08 +3E +40 +7E +ENDCHAR +STARTCHAR B8F0 +ENCODING 47344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B8F1 +ENCODING 47345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B8F2 +ENCODING 47346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B8F3 +ENCODING 47347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B8F4 +ENCODING 47348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B8F5 +ENCODING 47349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR B8F6 +ENCODING 47350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B8F7 +ENCODING 47351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +3B00 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR B8F8 +ENCODING 47352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B8F9 +ENCODING 47353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +FFC0 +0400 +2480 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B8FA +ENCODING 47354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +9A +F2 +95 +F8 +ENDCHAR +STARTCHAR B8FB +ENCODING 47355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR B8FC +ENCODING 47356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +28 +26 +5D +80 +ENDCHAR +STARTCHAR B8FD +ENCODING 47357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B8FE +ENCODING 47358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +7C +02 +3F +40 +ENDCHAR +STARTCHAR B8FF +ENCODING 47359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR B900 +ENCODING 47360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +F7 +08 +7E +01 +7E +ENDCHAR +STARTCHAR B901 +ENCODING 47361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +0400 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR B902 +ENCODING 47362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +F7 +08 +08 +76 +7E +ENDCHAR +STARTCHAR B903 +ENCODING 47363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR B904 +ENCODING 47364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +7C80 +4080 +7C80 +0080 +FE80 +1080 +1380 +1080 +1080 +ENDCHAR +STARTCHAR B905 +ENCODING 47365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +7E +01 +01 +01 +ENDCHAR +STARTCHAR B906 +ENCODING 47366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B907 +ENCODING 47367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +62 +12 +15 +18 +ENDCHAR +STARTCHAR B908 +ENCODING 47368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR B909 +ENCODING 47369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B90A +ENCODING 47370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B90B +ENCODING 47371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +27 +3E +40 +7E +ENDCHAR +STARTCHAR B90C +ENCODING 47372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR B90D +ENCODING 47373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B90E +ENCODING 47374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B90F +ENCODING 47375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B910 +ENCODING 47376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B911 +ENCODING 47377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B912 +ENCODING 47378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B913 +ENCODING 47379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR B914 +ENCODING 47380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +27 +3E +41 +7F +ENDCHAR +STARTCHAR B915 +ENCODING 47381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +41 +7F +41 +3E +ENDCHAR +STARTCHAR B916 +ENCODING 47382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B917 +ENCODING 47383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +27 +08 +14 +63 +ENDCHAR +STARTCHAR B918 +ENCODING 47384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8100 +FD00 +2100 +2700 +0100 +2200 +3700 +CC80 +ENDCHAR +STARTCHAR B919 +ENCODING 47385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B91A +ENCODING 47386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +7900 +8100 +7900 +FD00 +2700 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B91B +ENCODING 47387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0900 +7900 +F100 +0900 +F700 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B91C +ENCODING 47388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B91D +ENCODING 47389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B91E +ENCODING 47390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +27 +2D +12 +3F +ENDCHAR +STARTCHAR B91F +ENCODING 47391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F1 +09 +F7 +2C +33 +0C +32 +1E +ENDCHAR +STARTCHAR B920 +ENCODING 47392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +7A80 +4280 +7A80 +0280 +FE80 +1280 +1680 +1280 +0280 +ENDCHAR +STARTCHAR B921 +ENCODING 47393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR B922 +ENCODING 47394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1900 +0480 +0480 +0480 +ENDCHAR +STARTCHAR B923 +ENCODING 47395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR B924 +ENCODING 47396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +3A80 +4280 +7A80 +FE80 +1680 +1280 +2000 +3F80 +ENDCHAR +STARTCHAR B925 +ENCODING 47397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR B926 +ENCODING 47398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +22 +45 +42 +45 +32 +ENDCHAR +STARTCHAR B927 +ENCODING 47399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR B928 +ENCODING 47400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR B929 +ENCODING 47401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +7F +39 +41 +38 +ENDCHAR +STARTCHAR B92A +ENCODING 47402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +77 +3D +45 +37 +ENDCHAR +STARTCHAR B92B +ENCODING 47403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +75 +37 +45 +37 +ENDCHAR +STARTCHAR B92C +ENCODING 47404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +E500 +1500 +ED00 +2000 +5200 +7200 +4500 +7080 +ENDCHAR +STARTCHAR B92D +ENCODING 47405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +77 +37 +44 +37 +ENDCHAR +STARTCHAR B92E +ENCODING 47406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B92F +ENCODING 47407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +72 +37 +45 +72 +ENDCHAR +STARTCHAR B930 +ENCODING 47408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F00 +2080 +3F80 +ENDCHAR +STARTCHAR B931 +ENCODING 47409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR B932 +ENCODING 47410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +2100 +3900 +2A80 +3800 +ENDCHAR +STARTCHAR B933 +ENCODING 47411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +0400 +0600 +1900 +2080 +ENDCHAR +STARTCHAR B934 +ENCODING 47412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR B935 +ENCODING 47413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR B936 +ENCODING 47414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR B937 +ENCODING 47415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +E500 +1500 +ED00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR B938 +ENCODING 47416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR B939 +ENCODING 47417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +ED +20 +3F +3F +40 +3F +ENDCHAR +STARTCHAR B93A +ENCODING 47418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR B93B +ENCODING 47419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +E5 +15 +E5 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR B93C +ENCODING 47420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +7C80 +4080 +7C80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR B93D +ENCODING 47421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +FD +21 +20 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B93E +ENCODING 47422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B93F +ENCODING 47423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +62 +12 +15 +18 +ENDCHAR +STARTCHAR B940 +ENCODING 47424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +79 +01 +FD +11 +50 +40 +7F +ENDCHAR +STARTCHAR B941 +ENCODING 47425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B942 +ENCODING 47426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR B943 +ENCODING 47427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +21 +3E +40 +7E +ENDCHAR +STARTCHAR B944 +ENCODING 47428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR B945 +ENCODING 47429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR B946 +ENCODING 47430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR B947 +ENCODING 47431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B948 +ENCODING 47432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR B949 +ENCODING 47433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B94A +ENCODING 47434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B94B +ENCODING 47435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR B94C +ENCODING 47436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +FD +21 +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR B94D +ENCODING 47437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +41 +7F +41 +3E +ENDCHAR +STARTCHAR B94E +ENCODING 47438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR B94F +ENCODING 47439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +7900 +8100 +7900 +0100 +FF00 +2900 +2C00 +1600 +6180 +ENDCHAR +STARTCHAR B950 +ENCODING 47440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B951 +ENCODING 47441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +79 +81 +79 +01 +FD +20 +3E +41 +3E +ENDCHAR +STARTCHAR B952 +ENCODING 47442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +7900 +8100 +7900 +FD00 +2100 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR B953 +ENCODING 47443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0900 +7900 +F900 +0100 +FD00 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B954 +ENCODING 47444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +81 +79 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B955 +ENCODING 47445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B956 +ENCODING 47446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +21 +2D +12 +3F +ENDCHAR +STARTCHAR B957 +ENCODING 47447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +F9 +01 +FD +2C +33 +0C +32 +1E +ENDCHAR +STARTCHAR B958 +ENCODING 47448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +0080 +3F80 +2000 +3F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR B959 +ENCODING 47449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B95A +ENCODING 47450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +00 +77 +11 +10 +ENDCHAR +STARTCHAR B95B +ENCODING 47451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +60 +12 +17 +18 +ENDCHAR +STARTCHAR B95C +ENCODING 47452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR B95D +ENCODING 47453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +06 +42 +45 +20 +ENDCHAR +STARTCHAR B95E +ENCODING 47454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +0100 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR B95F +ENCODING 47455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +DB +24 +3E +40 +7E +ENDCHAR +STARTCHAR B960 +ENCODING 47456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B961 +ENCODING 47457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B962 +ENCODING 47458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B963 +ENCODING 47459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B964 +ENCODING 47460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B965 +ENCODING 47461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR B966 +ENCODING 47462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B967 +ENCODING 47463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +3900 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR B968 +ENCODING 47464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B969 +ENCODING 47465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +FFC0 +1200 +3280 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B96A +ENCODING 47466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR B96B +ENCODING 47467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +1500 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR B96C +ENCODING 47468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +20 +26 +5D +80 +ENDCHAR +STARTCHAR B96D +ENCODING 47469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +3F00 +ENDCHAR +STARTCHAR B96E +ENCODING 47470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +7C +02 +3F +40 +ENDCHAR +STARTCHAR B96F +ENCODING 47471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1F00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR B970 +ENCODING 47472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +DB +24 +7E +01 +7E +ENDCHAR +STARTCHAR B971 +ENCODING 47473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1200 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR B972 +ENCODING 47474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +DB +24 +00 +7E +7E +ENDCHAR +STARTCHAR B973 +ENCODING 47475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F80 +0000 +FFC0 +1F00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR B974 +ENCODING 47476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +3F80 +2000 +2000 +3F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR B975 +ENCODING 47477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR B976 +ENCODING 47478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR B977 +ENCODING 47479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +FF +00 +F2 +16 +15 +18 +ENDCHAR +STARTCHAR B978 +ENCODING 47480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B979 +ENCODING 47481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +FF +00 +07 +42 +45 +20 +ENDCHAR +STARTCHAR B97A +ENCODING 47482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR B97B +ENCODING 47483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7E +40 +7F +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR B97C +ENCODING 47484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B97D +ENCODING 47485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR B97E +ENCODING 47486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +3300 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR B97F +ENCODING 47487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +3000 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR B980 +ENCODING 47488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR B981 +ENCODING 47489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR B982 +ENCODING 47490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR B983 +ENCODING 47491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR B984 +ENCODING 47492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B985 +ENCODING 47493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B986 +ENCODING 47494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +FF +00 +12 +72 +95 +78 +ENDCHAR +STARTCHAR B987 +ENCODING 47495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR B988 +ENCODING 47496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +7E +40 +7F +FF +00 +20 +26 +5D +80 +ENDCHAR +STARTCHAR B989 +ENCODING 47497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR B98A +ENCODING 47498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR B98B +ENCODING 47499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR B98C +ENCODING 47500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +7E +40 +7F +FF +00 +7E +01 +7F +ENDCHAR +STARTCHAR B98D +ENCODING 47501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +FFC0 +0000 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR B98E +ENCODING 47502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F80 +1200 +7F80 +ENDCHAR +STARTCHAR B98F +ENCODING 47503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +3F00 +0000 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR B990 +ENCODING 47504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +79 +81 +F9 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR B991 +ENCODING 47505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +3E +01 +01 +01 +ENDCHAR +STARTCHAR B992 +ENCODING 47506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +36 +09 +09 +09 +ENDCHAR +STARTCHAR B993 +ENCODING 47507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +72 +12 +15 +10 +ENDCHAR +STARTCHAR B994 +ENCODING 47508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +81 +F9 +01 +FD +01 +40 +7F +ENDCHAR +STARTCHAR B995 +ENCODING 47509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +47 +41 +47 +30 +ENDCHAR +STARTCHAR B996 +ENCODING 47510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +07 +4F +42 +45 +37 +ENDCHAR +STARTCHAR B997 +ENCODING 47511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +3F +40 +7E +ENDCHAR +STARTCHAR B998 +ENCODING 47512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +3F +3F +40 +3F +ENDCHAR +STARTCHAR B999 +ENCODING 47513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR B99A +ENCODING 47514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +77 +79 +49 +76 +ENDCHAR +STARTCHAR B99B +ENCODING 47515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR B99C +ENCODING 47516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +72 +32 +45 +70 +ENDCHAR +STARTCHAR B99D +ENCODING 47517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR B99E +ENCODING 47518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR B99F +ENCODING 47519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR B9A0 +ENCODING 47520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +7F +41 +7F +ENDCHAR +STARTCHAR B9A1 +ENCODING 47521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +41 +7F +7F +ENDCHAR +STARTCHAR B9A2 +ENCODING 47522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +12 +72 +55 +70 +ENDCHAR +STARTCHAR B9A3 +ENCODING 47523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +7F +81 +08 +14 +63 +ENDCHAR +STARTCHAR B9A4 +ENCODING 47524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR B9A5 +ENCODING 47525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +7F +81 +3E +41 +63 +1C +ENDCHAR +STARTCHAR B9A6 +ENCODING 47526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3C80 +7C80 +4080 +3C80 +FF80 +0080 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR B9A7 +ENCODING 47527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0900 +7900 +8100 +7900 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR B9A8 +ENCODING 47528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +7F +01 +3F +01 +ENDCHAR +STARTCHAR B9A9 +ENCODING 47529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR B9AA +ENCODING 47530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +3F +12 +3F +ENDCHAR +STARTCHAR B9AB +ENCODING 47531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +09 +79 +81 +79 +FD +0C +33 +0C +32 +1E +ENDCHAR +STARTCHAR B9AC +ENCODING 47532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F9 +81 +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR B9AD +ENCODING 47533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +81 +81 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B9AE +ENCODING 47534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +11 +F1 +81 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR B9AF +ENCODING 47535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F100 +8100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR B9B0 +ENCODING 47536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F9 +81 +81 +FD +01 +20 +20 +3F +ENDCHAR +STARTCHAR B9B1 +ENCODING 47537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +11 +F1 +81 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR B9B2 +ENCODING 47538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR B9B3 +ENCODING 47539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +11 +F1 +81 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR B9B4 +ENCODING 47540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B9B5 +ENCODING 47541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR B9B6 +ENCODING 47542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B9B7 +ENCODING 47543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR B9B8 +ENCODING 47544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B9B9 +ENCODING 47545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR B9BA +ENCODING 47546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B9BB +ENCODING 47547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR B9BC +ENCODING 47548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +81 +81 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B9BD +ENCODING 47549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +81 +81 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR B9BE +ENCODING 47550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F100 +8100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B9BF +ENCODING 47551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +8100 +8100 +FD00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B9C0 +ENCODING 47552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F100 +8100 +F900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR B9C1 +ENCODING 47553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +81 +81 +FD +01 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B9C2 +ENCODING 47554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +1100 +F100 +8100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR B9C3 +ENCODING 47555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +1100 +E100 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR B9C4 +ENCODING 47556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +11 +F1 +81 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B9C5 +ENCODING 47557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR B9C6 +ENCODING 47558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +11 +F1 +81 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B9C7 +ENCODING 47559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +11 +E1 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR B9C8 +ENCODING 47560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8900 +8980 +8900 +8900 +F900 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B9C9 +ENCODING 47561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +8900 +F900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR B9CA +ENCODING 47562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR B9CB +ENCODING 47563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR B9CC +ENCODING 47564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B9CD +ENCODING 47565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +F900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR B9CE +ENCODING 47566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +0600 +4000 +4F00 +4900 +7700 +ENDCHAR +STARTCHAR B9CF +ENCODING 47567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR B9D0 +ENCODING 47568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B9D1 +ENCODING 47569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR B9D2 +ENCODING 47570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR B9D3 +ENCODING 47571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +7000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR B9D4 +ENCODING 47572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +7000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR B9D5 +ENCODING 47573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +7000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR B9D6 +ENCODING 47574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +7000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR B9D7 +ENCODING 47575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +7000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR B9D8 +ENCODING 47576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR B9D9 +ENCODING 47577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR B9DA +ENCODING 47578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR B9DB +ENCODING 47579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR B9DC +ENCODING 47580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR B9DD +ENCODING 47581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR B9DE +ENCODING 47582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8980 +8900 +F900 +0000 +3E00 +0400 +1E00 +6100 +ENDCHAR +STARTCHAR B9DF +ENCODING 47583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +8900 +7000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR B9E0 +ENCODING 47584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR B9E1 +ENCODING 47585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR B9E2 +ENCODING 47586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8900 +8980 +8900 +F900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR B9E3 +ENCODING 47587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F900 +0100 +1C00 +0000 +7F00 +2200 +1C00 +ENDCHAR +STARTCHAR B9E4 +ENCODING 47588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +95 +95 +97 +95 +95 +F5 +05 +05 +05 +ENDCHAR +STARTCHAR B9E5 +ENCODING 47589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +97 +95 +95 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR B9E6 +ENCODING 47590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR B9E7 +ENCODING 47591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR B9E8 +ENCODING 47592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9500 +9700 +9500 +F500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR B9E9 +ENCODING 47593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR B9EA +ENCODING 47594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR B9EB +ENCODING 47595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +95 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR B9EC +ENCODING 47596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +97 +95 +F5 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR B9ED +ENCODING 47597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR B9EE +ENCODING 47598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR B9EF +ENCODING 47599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR B9F0 +ENCODING 47600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR B9F1 +ENCODING 47601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR B9F2 +ENCODING 47602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR B9F3 +ENCODING 47603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR B9F4 +ENCODING 47604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +97 +95 +95 +F5 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR B9F5 +ENCODING 47605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +95 +97 +95 +F5 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR B9F6 +ENCODING 47606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR B9F7 +ENCODING 47607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9500 +9700 +9500 +F500 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR B9F8 +ENCODING 47608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9700 +9500 +9500 +F500 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR B9F9 +ENCODING 47609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +97 +95 +95 +F5 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR B9FA +ENCODING 47610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9500 +9700 +9500 +F500 +0000 +3F00 +0200 +1E00 +2180 +ENDCHAR +STARTCHAR B9FB +ENCODING 47611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR B9FC +ENCODING 47612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR B9FD +ENCODING 47613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR B9FE +ENCODING 47614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +95 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR B9FF +ENCODING 47615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BA00 +ENCODING 47616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +8900 +8980 +8900 +F900 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BA01 +ENCODING 47617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +8980 +F900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BA02 +ENCODING 47618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BA03 +ENCODING 47619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BA04 +ENCODING 47620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8980 +8900 +8900 +F980 +0100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR BA05 +ENCODING 47621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BA06 +ENCODING 47622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR BA07 +ENCODING 47623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR BA08 +ENCODING 47624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +F980 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR BA09 +ENCODING 47625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR BA0A +ENCODING 47626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR BA0B +ENCODING 47627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR BA0C +ENCODING 47628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR BA0D +ENCODING 47629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR BA0E +ENCODING 47630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR BA0F +ENCODING 47631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR BA10 +ENCODING 47632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR BA11 +ENCODING 47633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR BA12 +ENCODING 47634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BA13 +ENCODING 47635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR BA14 +ENCODING 47636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR BA15 +ENCODING 47637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8980 +8900 +8980 +F900 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR BA16 +ENCODING 47638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR BA17 +ENCODING 47639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR BA18 +ENCODING 47640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR BA19 +ENCODING 47641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR BA1A +ENCODING 47642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8980 +8900 +8980 +F900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR BA1B +ENCODING 47643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8980 +8900 +8980 +7000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR BA1C +ENCODING 47644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +F5 +95 +97 +95 +95 +97 +F5 +05 +05 +ENDCHAR +STARTCHAR BA1D +ENCODING 47645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BA1E +ENCODING 47646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BA1F +ENCODING 47647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BA20 +ENCODING 47648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +95 +F7 +05 +05 +20 +3F +ENDCHAR +STARTCHAR BA21 +ENCODING 47649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BA22 +ENCODING 47650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BA23 +ENCODING 47651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BA24 +ENCODING 47652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BA25 +ENCODING 47653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BA26 +ENCODING 47654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BA27 +ENCODING 47655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BA28 +ENCODING 47656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BA29 +ENCODING 47657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BA2A +ENCODING 47658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA2B +ENCODING 47659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BA2C +ENCODING 47660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BA2D +ENCODING 47661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BA2E +ENCODING 47662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BA2F +ENCODING 47663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR BA30 +ENCODING 47664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +F500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BA31 +ENCODING 47665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +F5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR BA32 +ENCODING 47666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BA33 +ENCODING 47667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BA34 +ENCODING 47668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BA35 +ENCODING 47669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BA36 +ENCODING 47670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BA37 +ENCODING 47671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BA38 +ENCODING 47672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +8F +89 +89 +89 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR BA39 +ENCODING 47673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +89 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BA3A +ENCODING 47674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +8F +89 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BA3B +ENCODING 47675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8F00 +8900 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BA3C +ENCODING 47676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +89 +F9 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR BA3D +ENCODING 47677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +8F +89 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BA3E +ENCODING 47678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BA3F +ENCODING 47679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +8F +89 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR BA40 +ENCODING 47680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BA41 +ENCODING 47681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BA42 +ENCODING 47682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +F9 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA43 +ENCODING 47683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BA44 +ENCODING 47684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BA45 +ENCODING 47685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BA46 +ENCODING 47686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA47 +ENCODING 47687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BA48 +ENCODING 47688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +8F +89 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BA49 +ENCODING 47689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +89 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR BA4A +ENCODING 47690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8F00 +8900 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BA4B +ENCODING 47691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +8F +89 +F9 +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR BA4C +ENCODING 47692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8F00 +8900 +F900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BA4D +ENCODING 47693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +89 +F9 +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BA4E +ENCODING 47694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8F00 +8900 +8900 +F900 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BA4F +ENCODING 47695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8900 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BA50 +ENCODING 47696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +8F +89 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BA51 +ENCODING 47697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR BA52 +ENCODING 47698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +8F +89 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BA53 +ENCODING 47699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +F9 +01 +1C +00 +7F +1C +22 +1E +ENDCHAR +STARTCHAR BA54 +ENCODING 47700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +95 +9D +95 +95 +95 +F5 +05 +05 +05 +ENDCHAR +STARTCHAR BA55 +ENCODING 47701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +9D +95 +95 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BA56 +ENCODING 47702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BA57 +ENCODING 47703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BA58 +ENCODING 47704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9D00 +9500 +9500 +F500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BA59 +ENCODING 47705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BA5A +ENCODING 47706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BA5B +ENCODING 47707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +9D +95 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BA5C +ENCODING 47708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +9D +95 +F5 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BA5D +ENCODING 47709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BA5E +ENCODING 47710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BA5F +ENCODING 47711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BA60 +ENCODING 47712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BA61 +ENCODING 47713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BA62 +ENCODING 47714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA63 +ENCODING 47715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BA64 +ENCODING 47716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +9D +95 +95 +F5 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BA65 +ENCODING 47717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +9D +95 +95 +F5 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR BA66 +ENCODING 47718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BA67 +ENCODING 47719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9500 +9D00 +9500 +F500 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR BA68 +ENCODING 47720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +9500 +9D00 +9500 +9500 +F500 +0000 +2200 +2200 +3500 +4C80 +ENDCHAR +STARTCHAR BA69 +ENCODING 47721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +9D +95 +95 +F5 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR BA6A +ENCODING 47722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BA6B +ENCODING 47723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9500 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BA6C +ENCODING 47724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BA6D +ENCODING 47725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BA6E +ENCODING 47726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +9D +95 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BA6F +ENCODING 47727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +95 +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BA70 +ENCODING 47728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +89 +8F +89 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR BA71 +ENCODING 47729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +89 +8F +89 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BA72 +ENCODING 47730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BA73 +ENCODING 47731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8900 +8F00 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BA74 +ENCODING 47732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +89 +8F +F9 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR BA75 +ENCODING 47733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BA76 +ENCODING 47734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BA77 +ENCODING 47735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +89 +8F +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR BA78 +ENCODING 47736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +89 +8F +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BA79 +ENCODING 47737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BA7A +ENCODING 47738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA7B +ENCODING 47739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BA7C +ENCODING 47740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BA7D +ENCODING 47741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BA7E +ENCODING 47742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA7F +ENCODING 47743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BA80 +ENCODING 47744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +89 +8F +F9 +00 +7F +41 +7F +ENDCHAR +STARTCHAR BA81 +ENCODING 47745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +89 +8F +F9 +01 +41 +7F +7F +ENDCHAR +STARTCHAR BA82 +ENCODING 47746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8900 +8F00 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BA83 +ENCODING 47747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +89 +8F +89 +F9 +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR BA84 +ENCODING 47748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8F00 +8900 +8F00 +F900 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR BA85 +ENCODING 47749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +89 +8F +89 +F9 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BA86 +ENCODING 47750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8F00 +8900 +8F00 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR BA87 +ENCODING 47751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8F00 +8900 +FF00 +0100 +1C00 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BA88 +ENCODING 47752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BA89 +ENCODING 47753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR BA8A +ENCODING 47754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +8F +89 +8F +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BA8B +ENCODING 47755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +8F +89 +8F +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BA8C +ENCODING 47756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +95 +9D +95 +95 +9D +95 +F5 +05 +05 +05 +ENDCHAR +STARTCHAR BA8D +ENCODING 47757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BA8E +ENCODING 47758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BA8F +ENCODING 47759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BA90 +ENCODING 47760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +F5 +05 +01 +20 +3F +ENDCHAR +STARTCHAR BA91 +ENCODING 47761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BA92 +ENCODING 47762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BA93 +ENCODING 47763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BA94 +ENCODING 47764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BA95 +ENCODING 47765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BA96 +ENCODING 47766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BA97 +ENCODING 47767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BA98 +ENCODING 47768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BA99 +ENCODING 47769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BA9A +ENCODING 47770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BA9B +ENCODING 47771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BA9C +ENCODING 47772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BA9D +ENCODING 47773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BA9E +ENCODING 47774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BA9F +ENCODING 47775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +9D +95 +F5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR BAA0 +ENCODING 47776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +F500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BAA1 +ENCODING 47777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +F5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR BAA2 +ENCODING 47778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BAA3 +ENCODING 47779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9D00 +9500 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BAA4 +ENCODING 47780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BAA5 +ENCODING 47781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BAA6 +ENCODING 47782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BAA7 +ENCODING 47783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BAA8 +ENCODING 47784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2080 +2080 +2080 +3F80 +0400 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR BAA9 +ENCODING 47785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BAAA +ENCODING 47786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +76 +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR BAAB +ENCODING 47787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BAAC +ENCODING 47788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BAAD +ENCODING 47789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +76 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BAAE +ENCODING 47790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BAAF +ENCODING 47791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +76 +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BAB0 +ENCODING 47792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BAB1 +ENCODING 47793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BAB2 +ENCODING 47794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR BAB3 +ENCODING 47795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR BAB4 +ENCODING 47796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BAB5 +ENCODING 47797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR BAB6 +ENCODING 47798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR BAB7 +ENCODING 47799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR BAB8 +ENCODING 47800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BAB9 +ENCODING 47801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BABA +ENCODING 47802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +76 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BABB +ENCODING 47803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0000 +0400 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR BABC +ENCODING 47804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +76 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BABD +ENCODING 47805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BABE +ENCODING 47806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +41 +76 +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BABF +ENCODING 47807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR BAC0 +ENCODING 47808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +41 +76 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BAC1 +ENCODING 47809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR BAC2 +ENCODING 47810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +76 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BAC3 +ENCODING 47811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR BAC4 +ENCODING 47812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4480 +4480 +4480 +7CC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BAC5 +ENCODING 47813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR BAC6 +ENCODING 47814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BAC7 +ENCODING 47815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BAC8 +ENCODING 47816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4480 +4480 +7C80 +10C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BAC9 +ENCODING 47817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BACA +ENCODING 47818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BACB +ENCODING 47819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR BACC +ENCODING 47820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +1F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BACD +ENCODING 47821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BACE +ENCODING 47822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BACF +ENCODING 47823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR BAD0 +ENCODING 47824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BAD1 +ENCODING 47825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR BAD2 +ENCODING 47826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR BAD3 +ENCODING 47827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR BAD4 +ENCODING 47828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR BAD5 +ENCODING 47829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR BAD6 +ENCODING 47830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR BAD7 +ENCODING 47831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR BAD8 +ENCODING 47832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4480 +4480 +7CC0 +1080 +FE80 +0000 +1100 +1100 +2B80 +4480 +ENDCHAR +STARTCHAR BAD9 +ENCODING 47833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4480 +4480 +7CC0 +1080 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BADA +ENCODING 47834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR BADB +ENCODING 47835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR BADC +ENCODING 47836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR BADD +ENCODING 47837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR BADE +ENCODING 47838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8900 +8980 +7100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR BADF +ENCODING 47839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +4480 +7CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR BAE0 +ENCODING 47840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +65 +95 +95 +97 +F5 +25 +1D +E5 +05 +01 +ENDCHAR +STARTCHAR BAE1 +ENCODING 47841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BAE2 +ENCODING 47842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BAE3 +ENCODING 47843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F700 +2500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BAE4 +ENCODING 47844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +95 +F7 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR BAE5 +ENCODING 47845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F700 +2500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR BAE6 +ENCODING 47846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR BAE7 +ENCODING 47847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR BAE8 +ENCODING 47848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BAE9 +ENCODING 47849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR BAEA +ENCODING 47850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR BAEB +ENCODING 47851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR BAEC +ENCODING 47852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR BAED +ENCODING 47853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR BAEE +ENCODING 47854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR BAEF +ENCODING 47855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR BAF0 +ENCODING 47856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR BAF1 +ENCODING 47857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR BAF2 +ENCODING 47858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F700 +2500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BAF3 +ENCODING 47859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR BAF4 +ENCODING 47860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F700 +2500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BAF5 +ENCODING 47861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F7 +25 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR BAF6 +ENCODING 47862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F700 +2500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BAF7 +ENCODING 47863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR BAF8 +ENCODING 47864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BAF9 +ENCODING 47865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BAFA +ENCODING 47866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F7 +25 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR BAFB +ENCODING 47867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR BAFC +ENCODING 47868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4480 +4480 +4480 +7C80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BAFD +ENCODING 47869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BAFE +ENCODING 47870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BAFF +ENCODING 47871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +7100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BB00 +ENCODING 47872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +F9 +21 +21 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR BB01 +ENCODING 47873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BB02 +ENCODING 47874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR BB03 +ENCODING 47875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR BB04 +ENCODING 47876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +F9 +21 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR BB05 +ENCODING 47877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR BB06 +ENCODING 47878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR BB07 +ENCODING 47879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BB08 +ENCODING 47880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR BB09 +ENCODING 47881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BB0A +ENCODING 47882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR BB0B +ENCODING 47883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR BB0C +ENCODING 47884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +7F +41 +7F +ENDCHAR +STARTCHAR BB0D +ENCODING 47885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +F9 +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR BB0E +ENCODING 47886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR BB0F +ENCODING 47887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +F9 +21 +FF +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR BB10 +ENCODING 47888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BB11 +ENCODING 47889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +F9 +21 +FF +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR BB12 +ENCODING 47890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +7100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BB13 +ENCODING 47891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +F900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BB14 +ENCODING 47892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR BB15 +ENCODING 47893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR BB16 +ENCODING 47894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR BB17 +ENCODING 47895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BB18 +ENCODING 47896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2080 +2080 +2080 +3F80 +1200 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR BB19 +ENCODING 47897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR BB1A +ENCODING 47898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR BB1B +ENCODING 47899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7F00 +4100 +5A00 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BB1C +ENCODING 47900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BB1D +ENCODING 47901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BB1E +ENCODING 47902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BB1F +ENCODING 47903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +5A +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BB20 +ENCODING 47904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +1200 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BB21 +ENCODING 47905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BB22 +ENCODING 47906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BB23 +ENCODING 47907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR BB24 +ENCODING 47908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BB25 +ENCODING 47909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR BB26 +ENCODING 47910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR BB27 +ENCODING 47911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR BB28 +ENCODING 47912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +5A +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR BB29 +ENCODING 47913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BB2A +ENCODING 47914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BB2B +ENCODING 47915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR BB2C +ENCODING 47916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BB2D +ENCODING 47917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR BB2E +ENCODING 47918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BB2F +ENCODING 47919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR BB30 +ENCODING 47920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +41 +5A +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BB31 +ENCODING 47921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR BB32 +ENCODING 47922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +41 +5A +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BB33 +ENCODING 47923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR BB34 +ENCODING 47924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +2080 +2080 +2080 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR BB35 +ENCODING 47925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BB36 +ENCODING 47926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0880 +ENDCHAR +STARTCHAR BB37 +ENCODING 47927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BB38 +ENCODING 47928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR BB39 +ENCODING 47929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR BB3A +ENCODING 47930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR BB3B +ENCODING 47931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BB3C +ENCODING 47932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BB3D +ENCODING 47933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BB3E +ENCODING 47934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR BB3F +ENCODING 47935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR BB40 +ENCODING 47936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR BB41 +ENCODING 47937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR BB42 +ENCODING 47938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR BB43 +ENCODING 47939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR BB44 +ENCODING 47940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BB45 +ENCODING 47941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BB46 +ENCODING 47942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR BB47 +ENCODING 47943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR BB48 +ENCODING 47944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR BB49 +ENCODING 47945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BB4A +ENCODING 47946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +41 +7E +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR BB4B +ENCODING 47947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR BB4C +ENCODING 47948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR BB4D +ENCODING 47949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BB4E +ENCODING 47950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR BB4F +ENCODING 47951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +0E00 +0000 +3F80 +1100 +1E00 +ENDCHAR +STARTCHAR BB50 +ENCODING 47952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4480 +4480 +7C80 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR BB51 +ENCODING 47953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR BB52 +ENCODING 47954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR BB53 +ENCODING 47955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR BB54 +ENCODING 47956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +F9 +01 +FD +21 +27 +41 +40 +7F +ENDCHAR +STARTCHAR BB55 +ENCODING 47957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR BB56 +ENCODING 47958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR BB57 +ENCODING 47959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR BB58 +ENCODING 47960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +8F +F9 +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR BB59 +ENCODING 47961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR BB5A +ENCODING 47962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR BB5B +ENCODING 47963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR BB5C +ENCODING 47964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR BB5D +ENCODING 47965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR BB5E +ENCODING 47966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR BB5F +ENCODING 47967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR BB60 +ENCODING 47968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR BB61 +ENCODING 47969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +F9 +01 +FD +21 +27 +41 +7F +41 +7F +ENDCHAR +STARTCHAR BB62 +ENCODING 47970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR BB63 +ENCODING 47971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +8F +F9 +01 +FD +21 +29 +08 +36 +41 +ENDCHAR +STARTCHAR BB64 +ENCODING 47972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BB65 +ENCODING 47973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BB66 +ENCODING 47974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +F900 +DD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BB67 +ENCODING 47975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +7900 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BB68 +ENCODING 47976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR BB69 +ENCODING 47977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR BB6A +ENCODING 47978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +DD +27 +21 +3F +12 +3F +ENDCHAR +STARTCHAR BB6B +ENCODING 47979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR BB6C +ENCODING 47980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4A80 +4A80 +7A80 +0280 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR BB6D +ENCODING 47981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BB6E +ENCODING 47982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BB6F +ENCODING 47983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BB70 +ENCODING 47984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +4A80 +7A80 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR BB71 +ENCODING 47985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR BB72 +ENCODING 47986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR BB73 +ENCODING 47987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +40 +7F +ENDCHAR +STARTCHAR BB74 +ENCODING 47988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR BB75 +ENCODING 47989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR BB76 +ENCODING 47990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR BB77 +ENCODING 47991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR BB78 +ENCODING 47992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR BB79 +ENCODING 47993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR BB7A +ENCODING 47994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR BB7B +ENCODING 47995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR BB7C +ENCODING 47996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +41 +7F +ENDCHAR +STARTCHAR BB7D +ENCODING 47997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +41 +7F +7F +ENDCHAR +STARTCHAR BB7E +ENCODING 47998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BB7F +ENCODING 47999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +08 +1C +63 +ENDCHAR +STARTCHAR BB80 +ENCODING 48000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +02 +22 +55 +08 +ENDCHAR +STARTCHAR BB81 +ENCODING 48001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3E +41 +61 +1E +ENDCHAR +STARTCHAR BB82 +ENCODING 48002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BB83 +ENCODING 48003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR BB84 +ENCODING 48004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +01 +3F +01 +ENDCHAR +STARTCHAR BB85 +ENCODING 48005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BB86 +ENCODING 48006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +12 +3F +ENDCHAR +STARTCHAR BB87 +ENCODING 48007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +7A80 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR BB88 +ENCODING 48008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4480 +4480 +4480 +7C80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR BB89 +ENCODING 48009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR BB8A +ENCODING 48010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR BB8B +ENCODING 48011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR BB8C +ENCODING 48012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +F9 +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR BB8D +ENCODING 48013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR BB8E +ENCODING 48014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR BB8F +ENCODING 48015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR BB90 +ENCODING 48016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +F9 +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR BB91 +ENCODING 48017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR BB92 +ENCODING 48018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR BB93 +ENCODING 48019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR BB94 +ENCODING 48020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR BB95 +ENCODING 48021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR BB96 +ENCODING 48022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR BB97 +ENCODING 48023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR BB98 +ENCODING 48024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +7F +41 +7F +ENDCHAR +STARTCHAR BB99 +ENCODING 48025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +41 +7F +7F +ENDCHAR +STARTCHAR BB9A +ENCODING 48026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR BB9B +ENCODING 48027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR BB9C +ENCODING 48028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BB9D +ENCODING 48029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BB9E +ENCODING 48030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +F900 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BB9F +ENCODING 48031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +7900 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BBA0 +ENCODING 48032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR BBA1 +ENCODING 48033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR BBA2 +ENCODING 48034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR BBA3 +ENCODING 48035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BBA4 +ENCODING 48036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +2080 +2080 +2080 +3F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR BBA5 +ENCODING 48037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR BBA6 +ENCODING 48038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR BBA7 +ENCODING 48039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BBA8 +ENCODING 48040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR BBA9 +ENCODING 48041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR BBAA +ENCODING 48042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR BBAB +ENCODING 48043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR BBAC +ENCODING 48044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BBAD +ENCODING 48045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR BBAE +ENCODING 48046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR BBAF +ENCODING 48047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR BBB0 +ENCODING 48048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR BBB1 +ENCODING 48049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR BBB2 +ENCODING 48050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR BBB3 +ENCODING 48051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR BBB4 +ENCODING 48052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BBB5 +ENCODING 48053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR BBB6 +ENCODING 48054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR BBB7 +ENCODING 48055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +1100 +1500 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR BBB8 +ENCODING 48056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR BBB9 +ENCODING 48057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR BBBA +ENCODING 48058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR BBBB +ENCODING 48059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR BBBC +ENCODING 48060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR BBBD +ENCODING 48061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +41 +41 +7E +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR BBBE +ENCODING 48062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F00 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR BBBF +ENCODING 48063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR BBC0 +ENCODING 48064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2080 +2080 +2080 +2080 +3F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR BBC1 +ENCODING 48065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR BBC2 +ENCODING 48066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR BBC3 +ENCODING 48067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BBC4 +ENCODING 48068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BBC5 +ENCODING 48069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR BBC6 +ENCODING 48070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR BBC7 +ENCODING 48071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR BBC8 +ENCODING 48072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BBC9 +ENCODING 48073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR BBCA +ENCODING 48074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR BBCB +ENCODING 48075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR BBCC +ENCODING 48076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR BBCD +ENCODING 48077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR BBCE +ENCODING 48078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR BBCF +ENCODING 48079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR BBD0 +ENCODING 48080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BBD1 +ENCODING 48081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR BBD2 +ENCODING 48082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR BBD3 +ENCODING 48083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +2080 +3F00 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR BBD4 +ENCODING 48084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR BBD5 +ENCODING 48085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR BBD6 +ENCODING 48086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR BBD7 +ENCODING 48087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR BBD8 +ENCODING 48088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR BBD9 +ENCODING 48089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +41 +41 +7E +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR BBDA +ENCODING 48090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR BBDB +ENCODING 48091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +41 +41 +7E +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR BBDC +ENCODING 48092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +F9 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR BBDD +ENCODING 48093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BBDE +ENCODING 48094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BBDF +ENCODING 48095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +7100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BBE0 +ENCODING 48096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR BBE1 +ENCODING 48097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BBE2 +ENCODING 48098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BBE3 +ENCODING 48099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR BBE4 +ENCODING 48100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +3F00 +0080 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR BBE5 +ENCODING 48101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +0000 +1B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BBE6 +ENCODING 48102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +0000 +3F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR BBE7 +ENCODING 48103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +3000 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR BBE8 +ENCODING 48104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BBE9 +ENCODING 48105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +3100 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR BBEA +ENCODING 48106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR BBEB +ENCODING 48107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +3380 +0F80 +3B00 +2480 +3B00 +ENDCHAR +STARTCHAR BBEC +ENCODING 48108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR BBED +ENCODING 48109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR BBEE +ENCODING 48110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR BBEF +ENCODING 48111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR BBF0 +ENCODING 48112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BBF1 +ENCODING 48113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BBF2 +ENCODING 48114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +7100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BBF3 +ENCODING 48115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR BBF4 +ENCODING 48116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR BBF5 +ENCODING 48117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +0F00 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR BBF6 +ENCODING 48118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +71 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR BBF7 +ENCODING 48119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +4480 +7C80 +0080 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR BBF8 +ENCODING 48120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +89 +89 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR BBF9 +ENCODING 48121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BBFA +ENCODING 48122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BBFB +ENCODING 48123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +8900 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BBFC +ENCODING 48124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR BBFD +ENCODING 48125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BBFE +ENCODING 48126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BBFF +ENCODING 48127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR BC00 +ENCODING 48128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BC01 +ENCODING 48129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BC02 +ENCODING 48130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +F9 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BC03 +ENCODING 48131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BC04 +ENCODING 48132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BC05 +ENCODING 48133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BC06 +ENCODING 48134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BC07 +ENCODING 48135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BC08 +ENCODING 48136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BC09 +ENCODING 48137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR BC0A +ENCODING 48138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +8900 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BC0B +ENCODING 48139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR BC0C +ENCODING 48140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8900 +8900 +F900 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR BC0D +ENCODING 48141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +89 +F9 +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BC0E +ENCODING 48142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +8900 +8900 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR BC0F +ENCODING 48143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8900 +8900 +8900 +F900 +0100 +1C00 +0000 +3F00 +0C00 +7380 +ENDCHAR +STARTCHAR BC10 +ENCODING 48144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BC11 +ENCODING 48145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +89 +89 +89 +F9 +00 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BC12 +ENCODING 48146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +89 +89 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BC13 +ENCODING 48147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +89 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BC14 +ENCODING 48148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +8900 +F900 +8980 +8900 +8900 +F900 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BC15 +ENCODING 48149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BC16 +ENCODING 48150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0000 +7E00 +1100 +1100 +1100 +ENDCHAR +STARTCHAR BC17 +ENCODING 48151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +8900 +F900 +0000 +7200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BC18 +ENCODING 48152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR BC19 +ENCODING 48153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +F900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BC1A +ENCODING 48154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR BC1B +ENCODING 48155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR BC1C +ENCODING 48156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +F900 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR BC1D +ENCODING 48157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +F900 +0100 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR BC1E +ENCODING 48158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +F900 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR BC1F +ENCODING 48159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +F900 +0000 +7900 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR BC20 +ENCODING 48160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR BC21 +ENCODING 48161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR BC22 +ENCODING 48162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR BC23 +ENCODING 48163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR BC24 +ENCODING 48164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR BC25 +ENCODING 48165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +8900 +F900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR BC26 +ENCODING 48166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BC27 +ENCODING 48167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR BC28 +ENCODING 48168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +F900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR BC29 +ENCODING 48169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8980 +8900 +F900 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR BC2A +ENCODING 48170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +F900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR BC2B +ENCODING 48171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR BC2C +ENCODING 48172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +F900 +8980 +8900 +F900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR BC2D +ENCODING 48173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +F900 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR BC2E +ENCODING 48174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F900 +8980 +8900 +F900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR BC2F +ENCODING 48175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +8900 +7000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR BC30 +ENCODING 48176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +95 +F5 +97 +95 +95 +F5 +05 +05 +05 +ENDCHAR +STARTCHAR BC31 +ENCODING 48177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F7 +95 +95 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BC32 +ENCODING 48178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BC33 +ENCODING 48179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +9500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BC34 +ENCODING 48180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +F500 +9700 +9500 +F500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BC35 +ENCODING 48181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +9500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BC36 +ENCODING 48182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BC37 +ENCODING 48183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +95 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BC38 +ENCODING 48184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F7 +95 +F5 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BC39 +ENCODING 48185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BC3A +ENCODING 48186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BC3B +ENCODING 48187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BC3C +ENCODING 48188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BC3D +ENCODING 48189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BC3E +ENCODING 48190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BC3F +ENCODING 48191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BC40 +ENCODING 48192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +97 +95 +F5 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BC41 +ENCODING 48193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +97 +95 +F5 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR BC42 +ENCODING 48194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +9500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BC43 +ENCODING 48195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +F500 +9700 +9500 +F500 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR BC44 +ENCODING 48196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +F700 +9500 +9500 +F500 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR BC45 +ENCODING 48197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +97 +95 +F5 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR BC46 +ENCODING 48198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +9500 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BC47 +ENCODING 48199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +9500 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BC48 +ENCODING 48200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BC49 +ENCODING 48201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F7 +95 +F5 +00 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BC4A +ENCODING 48202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +95 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BC4B +ENCODING 48203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +95 +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BC4C +ENCODING 48204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +8980 +F900 +8900 +8980 +8900 +F900 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BC4D +ENCODING 48205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +8980 +F900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BC4E +ENCODING 48206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BC4F +ENCODING 48207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BC50 +ENCODING 48208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +8900 +F980 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR BC51 +ENCODING 48209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BC52 +ENCODING 48210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR BC53 +ENCODING 48211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR BC54 +ENCODING 48212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7E00 +0100 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR BC55 +ENCODING 48213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR BC56 +ENCODING 48214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR BC57 +ENCODING 48215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR BC58 +ENCODING 48216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR BC59 +ENCODING 48217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR BC5A +ENCODING 48218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR BC5B +ENCODING 48219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR BC5C +ENCODING 48220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR BC5D +ENCODING 48221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F980 +8900 +8980 +F900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR BC5E +ENCODING 48222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BC5F +ENCODING 48223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR BC60 +ENCODING 48224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR BC61 +ENCODING 48225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +1800 +2600 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR BC62 +ENCODING 48226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR BC63 +ENCODING 48227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR BC64 +ENCODING 48228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR BC65 +ENCODING 48229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR BC66 +ENCODING 48230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F980 +8900 +8980 +F900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR BC67 +ENCODING 48231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F980 +8900 +8980 +7000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR BC68 +ENCODING 48232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +95 +95 +97 +F5 +95 +97 +F5 +05 +05 +ENDCHAR +STARTCHAR BC69 +ENCODING 48233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BC6A +ENCODING 48234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BC6B +ENCODING 48235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F700 +9500 +9700 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BC6C +ENCODING 48236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +95 +F7 +95 +F7 +05 +05 +20 +3F +ENDCHAR +STARTCHAR BC6D +ENCODING 48237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F700 +9500 +9700 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BC6E +ENCODING 48238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BC6F +ENCODING 48239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BC70 +ENCODING 48240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BC71 +ENCODING 48241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BC72 +ENCODING 48242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BC73 +ENCODING 48243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BC74 +ENCODING 48244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BC75 +ENCODING 48245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BC76 +ENCODING 48246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BC77 +ENCODING 48247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BC78 +ENCODING 48248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BC79 +ENCODING 48249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BC7A +ENCODING 48250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F700 +9500 +9700 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BC7B +ENCODING 48251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR BC7C +ENCODING 48252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F700 +9500 +9700 +F500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BC7D +ENCODING 48253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +F5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR BC7E +ENCODING 48254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F700 +9500 +9700 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BC7F +ENCODING 48255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F700 +9500 +9700 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BC80 +ENCODING 48256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BC81 +ENCODING 48257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BC82 +ENCODING 48258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F7 +95 +97 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BC83 +ENCODING 48259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F7 +95 +97 +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BC84 +ENCODING 48260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +89 +FF +89 +89 +89 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR BC85 +ENCODING 48261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +89 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BC86 +ENCODING 48262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +8F +89 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BC87 +ENCODING 48263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8F00 +8900 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BC88 +ENCODING 48264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +8F +89 +F9 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR BC89 +ENCODING 48265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +8F +89 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BC8A +ENCODING 48266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BC8B +ENCODING 48267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +89 +F9 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR BC8C +ENCODING 48268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BC8D +ENCODING 48269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BC8E +ENCODING 48270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +F9 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BC8F +ENCODING 48271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BC90 +ENCODING 48272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BC91 +ENCODING 48273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BC92 +ENCODING 48274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BC93 +ENCODING 48275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BC94 +ENCODING 48276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +8F +89 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BC95 +ENCODING 48277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +89 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR BC96 +ENCODING 48278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8F00 +8900 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BC97 +ENCODING 48279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8F00 +8900 +F900 +0100 +0800 +1800 +3600 +4180 +ENDCHAR +STARTCHAR BC98 +ENCODING 48280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8F00 +8900 +F900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BC99 +ENCODING 48281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +89 +F9 +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BC9A +ENCODING 48282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8F00 +8900 +F900 +0000 +3F00 +0200 +0C00 +7380 +ENDCHAR +STARTCHAR BC9B +ENCODING 48283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +FF00 +8900 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BC9C +ENCODING 48284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +8F +89 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BC9D +ENCODING 48285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR BC9E +ENCODING 48286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +8F +89 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BC9F +ENCODING 48287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BCA0 +ENCODING 48288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +95 +F5 +9D +95 +95 +F5 +05 +05 +05 +ENDCHAR +STARTCHAR BCA1 +ENCODING 48289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +9D +95 +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BCA2 +ENCODING 48290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BCA3 +ENCODING 48291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9D00 +9500 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BCA4 +ENCODING 48292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +F500 +9D00 +9500 +F500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BCA5 +ENCODING 48293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9D00 +9500 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BCA6 +ENCODING 48294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BCA7 +ENCODING 48295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +9D +95 +F5 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR BCA8 +ENCODING 48296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +FD +95 +F5 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BCA9 +ENCODING 48297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BCAA +ENCODING 48298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BCAB +ENCODING 48299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BCAC +ENCODING 48300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BCAD +ENCODING 48301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BCAE +ENCODING 48302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BCAF +ENCODING 48303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BCB0 +ENCODING 48304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +9D +95 +F5 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BCB1 +ENCODING 48305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +FD +95 +95 +F5 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR BCB2 +ENCODING 48306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9D00 +9500 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BCB3 +ENCODING 48307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +FD00 +9500 +9500 +F500 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR BCB4 +ENCODING 48308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +FD00 +9500 +9500 +F500 +0000 +2200 +2200 +3500 +4C80 +ENDCHAR +STARTCHAR BCB5 +ENCODING 48309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +F5 +9D +95 +F5 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR BCB6 +ENCODING 48310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9D00 +9500 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BCB7 +ENCODING 48311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9D00 +9500 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BCB8 +ENCODING 48312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BCB9 +ENCODING 48313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BCBA +ENCODING 48314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +9D +95 +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BCBB +ENCODING 48315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +9D +95 +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BCBC +ENCODING 48316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +8F +F9 +89 +8F +89 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR BCBD +ENCODING 48317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +8F +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BCBE +ENCODING 48318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BCBF +ENCODING 48319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +FF00 +8900 +8F00 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BCC0 +ENCODING 48320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +8F +F9 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR BCC1 +ENCODING 48321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BCC2 +ENCODING 48322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BCC3 +ENCODING 48323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +FF +89 +8F +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR BCC4 +ENCODING 48324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +8F +F9 +8F +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BCC5 +ENCODING 48325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BCC6 +ENCODING 48326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BCC7 +ENCODING 48327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BCC8 +ENCODING 48328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BCC9 +ENCODING 48329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BCCA +ENCODING 48330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BCCB +ENCODING 48331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BCCC +ENCODING 48332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +FF +89 +8F +F9 +00 +7F +41 +7F +ENDCHAR +STARTCHAR BCCD +ENCODING 48333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +8F +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR BCCE +ENCODING 48334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +FF00 +8900 +8F00 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BCCF +ENCODING 48335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +8F +F9 +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR BCD0 +ENCODING 48336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +FF00 +8900 +8F00 +F900 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR BCD1 +ENCODING 48337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +8F +F9 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BCD2 +ENCODING 48338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +FF00 +8900 +8F00 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR BCD3 +ENCODING 48339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +FF00 +8900 +8F00 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BCD4 +ENCODING 48340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BCD5 +ENCODING 48341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +8F +F9 +8F +F9 +00 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BCD6 +ENCODING 48342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +FF +89 +8F +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BCD7 +ENCODING 48343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +FF +89 +8F +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BCD8 +ENCODING 48344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +95 +95 +9D +F5 +95 +9D +95 +F5 +05 +05 +05 +ENDCHAR +STARTCHAR BCD9 +ENCODING 48345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BCDA +ENCODING 48346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BCDB +ENCODING 48347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +FD00 +9500 +9D00 +F500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BCDC +ENCODING 48348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +9500 +9500 +FD00 +9500 +9D00 +F500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BCDD +ENCODING 48349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +FD00 +9500 +9D00 +F500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BCDE +ENCODING 48350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BCDF +ENCODING 48351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BCE0 +ENCODING 48352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BCE1 +ENCODING 48353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BCE2 +ENCODING 48354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BCE3 +ENCODING 48355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BCE4 +ENCODING 48356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BCE5 +ENCODING 48357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BCE6 +ENCODING 48358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BCE7 +ENCODING 48359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BCE8 +ENCODING 48360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BCE9 +ENCODING 48361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BCEA +ENCODING 48362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +FD00 +9500 +9D00 +F500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BCEB +ENCODING 48363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +FD +9D +95 +F5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR BCEC +ENCODING 48364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +FD00 +9500 +9D00 +F500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BCED +ENCODING 48365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +9D +95 +F5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR BCEE +ENCODING 48366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +FD00 +9500 +9D00 +F500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BCEF +ENCODING 48367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +FD00 +9500 +9D00 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BCF0 +ENCODING 48368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BCF1 +ENCODING 48369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BCF2 +ENCODING 48370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +FD +95 +9D +F5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BCF3 +ENCODING 48371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +FD +95 +9D +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BCF4 +ENCODING 48372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2080 +2080 +3F80 +2080 +2080 +3F80 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR BCF5 +ENCODING 48373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BCF6 +ENCODING 48374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +0880 +0880 +0880 +ENDCHAR +STARTCHAR BCF7 +ENCODING 48375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +4000 +4100 +7E00 +4100 +3E00 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BCF8 +ENCODING 48376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BCF9 +ENCODING 48377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BCFA +ENCODING 48378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BCFB +ENCODING 48379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BCFC +ENCODING 48380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BCFD +ENCODING 48381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BCFE +ENCODING 48382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BCFF +ENCODING 48383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR BD00 +ENCODING 48384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BD01 +ENCODING 48385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR BD02 +ENCODING 48386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR BD03 +ENCODING 48387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR BD04 +ENCODING 48388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BD05 +ENCODING 48389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BD06 +ENCODING 48390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BD07 +ENCODING 48391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR BD08 +ENCODING 48392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BD09 +ENCODING 48393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BD0A +ENCODING 48394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BD0B +ENCODING 48395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR BD0C +ENCODING 48396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BD0D +ENCODING 48397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR BD0E +ENCODING 48398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BD0F +ENCODING 48399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR BD10 +ENCODING 48400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4480 +4480 +7C80 +4480 +7CC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BD11 +ENCODING 48401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR BD12 +ENCODING 48402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BD13 +ENCODING 48403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BD14 +ENCODING 48404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4480 +4480 +7C80 +4480 +7CC0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BD15 +ENCODING 48405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BD16 +ENCODING 48406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BD17 +ENCODING 48407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR BD18 +ENCODING 48408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +1F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BD19 +ENCODING 48409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BD1A +ENCODING 48410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BD1B +ENCODING 48411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR BD1C +ENCODING 48412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BD1D +ENCODING 48413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR BD1E +ENCODING 48414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR BD1F +ENCODING 48415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR BD20 +ENCODING 48416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR BD21 +ENCODING 48417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR BD22 +ENCODING 48418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR BD23 +ENCODING 48419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR BD24 +ENCODING 48420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4480 +7C80 +4480 +7CC0 +1080 +FE80 +0000 +1100 +1100 +2B80 +4480 +ENDCHAR +STARTCHAR BD25 +ENCODING 48421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR BD26 +ENCODING 48422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR BD27 +ENCODING 48423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR BD28 +ENCODING 48424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR BD29 +ENCODING 48425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR BD2A +ENCODING 48426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +8900 +F900 +8980 +7100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR BD2B +ENCODING 48427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4480 +7C80 +7CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR BD2C +ENCODING 48428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4A80 +4A80 +7A80 +4A80 +7B80 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR BD2D +ENCODING 48429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BD2E +ENCODING 48430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BD2F +ENCODING 48431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +6500 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BD30 +ENCODING 48432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +95 +F7 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR BD31 +ENCODING 48433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +6500 +FD00 +0100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR BD32 +ENCODING 48434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR BD33 +ENCODING 48435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +3F +40 +7F +ENDCHAR +STARTCHAR BD34 +ENCODING 48436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BD35 +ENCODING 48437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR BD36 +ENCODING 48438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR BD37 +ENCODING 48439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR BD38 +ENCODING 48440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR BD39 +ENCODING 48441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR BD3A +ENCODING 48442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR BD3B +ENCODING 48443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR BD3C +ENCODING 48444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +3F +41 +7F +ENDCHAR +STARTCHAR BD3D +ENCODING 48445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +21 +3F +3F +ENDCHAR +STARTCHAR BD3E +ENCODING 48446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +6500 +FD00 +0100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BD3F +ENCODING 48447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR BD40 +ENCODING 48448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4A80 +7A80 +4A80 +7B80 +1280 +FE80 +0000 +1100 +1100 +1A80 +2640 +ENDCHAR +STARTCHAR BD41 +ENCODING 48449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +65 +FD +09 +37 +41 +23 +1C +ENDCHAR +STARTCHAR BD42 +ENCODING 48450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +9700 +6500 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BD43 +ENCODING 48451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR BD44 +ENCODING 48452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BD45 +ENCODING 48453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BD46 +ENCODING 48454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +95 +F5 +97 +65 +FD +01 +3F +12 +3F +ENDCHAR +STARTCHAR BD47 +ENCODING 48455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +6B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR BD48 +ENCODING 48456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4480 +4480 +7C80 +4480 +7C80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BD49 +ENCODING 48457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +F9 +89 +F9 +21 +FF +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BD4A +ENCODING 48458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BD4B +ENCODING 48459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +7100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BD4C +ENCODING 48460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +F9 +21 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR BD4D +ENCODING 48461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BD4E +ENCODING 48462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR BD4F +ENCODING 48463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR BD50 +ENCODING 48464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +F9 +20 +FF +01 +7F +40 +7F +ENDCHAR +STARTCHAR BD51 +ENCODING 48465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR BD52 +ENCODING 48466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR BD53 +ENCODING 48467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BD54 +ENCODING 48468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR BD55 +ENCODING 48469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BD56 +ENCODING 48470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR BD57 +ENCODING 48471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR BD58 +ENCODING 48472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +F9 +89 +F9 +21 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR BD59 +ENCODING 48473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +F9 +89 +F9 +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR BD5A +ENCODING 48474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR BD5B +ENCODING 48475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR BD5C +ENCODING 48476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BD5D +ENCODING 48477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BD5E +ENCODING 48478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +7100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BD5F +ENCODING 48479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +F900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BD60 +ENCODING 48480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR BD61 +ENCODING 48481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR BD62 +ENCODING 48482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR BD63 +ENCODING 48483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BD64 +ENCODING 48484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2080 +2080 +3F80 +2080 +2080 +3F80 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR BD65 +ENCODING 48485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR BD66 +ENCODING 48486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR BD67 +ENCODING 48487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +4000 +4100 +7E00 +4100 +3E00 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BD68 +ENCODING 48488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +3F00 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BD69 +ENCODING 48489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BD6A +ENCODING 48490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BD6B +ENCODING 48491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BD6C +ENCODING 48492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR BD6D +ENCODING 48493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BD6E +ENCODING 48494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BD6F +ENCODING 48495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR BD70 +ENCODING 48496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BD71 +ENCODING 48497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR BD72 +ENCODING 48498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR BD73 +ENCODING 48499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR BD74 +ENCODING 48500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR BD75 +ENCODING 48501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR BD76 +ENCODING 48502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BD77 +ENCODING 48503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR BD78 +ENCODING 48504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BD79 +ENCODING 48505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR BD7A +ENCODING 48506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BD7B +ENCODING 48507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR BD7C +ENCODING 48508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BD7D +ENCODING 48509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR BD7E +ENCODING 48510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BD7F +ENCODING 48511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +3F80 +2080 +3F00 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR BD80 +ENCODING 48512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2080 +2080 +3F80 +2080 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR BD81 +ENCODING 48513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BD82 +ENCODING 48514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR BD83 +ENCODING 48515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BD84 +ENCODING 48516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR BD85 +ENCODING 48517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR BD86 +ENCODING 48518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR BD87 +ENCODING 48519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BD88 +ENCODING 48520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BD89 +ENCODING 48521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +FFC0 +0400 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BD8A +ENCODING 48522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +FFC0 +0400 +3F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR BD8B +ENCODING 48523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR BD8C +ENCODING 48524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR BD8D +ENCODING 48525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR BD8E +ENCODING 48526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR BD8F +ENCODING 48527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR BD90 +ENCODING 48528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BD91 +ENCODING 48529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BD92 +ENCODING 48530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR BD93 +ENCODING 48531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR BD94 +ENCODING 48532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR BD95 +ENCODING 48533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BD96 +ENCODING 48534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7F +7E +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR BD97 +ENCODING 48535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR BD98 +ENCODING 48536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR BD99 +ENCODING 48537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +FFC0 +0400 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BD9A +ENCODING 48538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR BD9B +ENCODING 48539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR BD9C +ENCODING 48540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4480 +7C80 +4480 +7C80 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR BD9D +ENCODING 48541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +3E +01 +01 +01 +ENDCHAR +STARTCHAR BD9E +ENCODING 48542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR BD9F +ENCODING 48543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR BDA0 +ENCODING 48544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR BDA1 +ENCODING 48545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR BDA2 +ENCODING 48546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR BDA3 +ENCODING 48547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +3F +40 +7E +ENDCHAR +STARTCHAR BDA4 +ENCODING 48548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +FF +89 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR BDA5 +ENCODING 48549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR BDA6 +ENCODING 48550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR BDA7 +ENCODING 48551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR BDA8 +ENCODING 48552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR BDA9 +ENCODING 48553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR BDAA +ENCODING 48554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR BDAB +ENCODING 48555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR BDAC +ENCODING 48556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +7F +41 +7F +ENDCHAR +STARTCHAR BDAD +ENCODING 48557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +41 +7F +7F +ENDCHAR +STARTCHAR BDAE +ENCODING 48558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR BDAF +ENCODING 48559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +08 +14 +63 +ENDCHAR +STARTCHAR BDB0 +ENCODING 48560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +F900 +8F00 +F900 +0100 +FD00 +2000 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR BDB1 +ENCODING 48561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BDB2 +ENCODING 48562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +F900 +1D00 +E100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BDB3 +ENCODING 48563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +7900 +DD00 +2300 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BDB4 +ENCODING 48564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR BDB5 +ENCODING 48565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +27 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR BDB6 +ENCODING 48566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +1D +E1 +27 +3F +12 +3F +ENDCHAR +STARTCHAR BDB7 +ENCODING 48567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +DD +23 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BDB8 +ENCODING 48568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4A80 +7A80 +4A80 +7A80 +0280 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR BDB9 +ENCODING 48569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BDBA +ENCODING 48570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR BDBB +ENCODING 48571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR BDBC +ENCODING 48572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4A80 +7A80 +4A80 +3280 +FE80 +1680 +1280 +2000 +3F80 +ENDCHAR +STARTCHAR BDBD +ENCODING 48573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR BDBE +ENCODING 48574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +F500 +DD00 +2D00 +2000 +4F80 +4700 +4500 +3200 +ENDCHAR +STARTCHAR BDBF +ENCODING 48575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR BDC0 +ENCODING 48576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +1F +7F +40 +3F +ENDCHAR +STARTCHAR BDC1 +ENCODING 48577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +1F +39 +41 +38 +ENDCHAR +STARTCHAR BDC2 +ENCODING 48578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +77 +35 +45 +37 +ENDCHAR +STARTCHAR BDC3 +ENCODING 48579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +1D +77 +45 +37 +ENDCHAR +STARTCHAR BDC4 +ENCODING 48580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +52 +72 +45 +70 +ENDCHAR +STARTCHAR BDC5 +ENCODING 48581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +1F +77 +44 +37 +ENDCHAR +STARTCHAR BDC6 +ENCODING 48582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +57 +75 +45 +77 +ENDCHAR +STARTCHAR BDC7 +ENCODING 48583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +27 +7F +77 +45 +72 +ENDCHAR +STARTCHAR BDC8 +ENCODING 48584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR BDC9 +ENCODING 48585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR BDCA +ENCODING 48586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +2100 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR BDCB +ENCODING 48587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +0400 +0E00 +3180 +ENDCHAR +STARTCHAR BDCC +ENCODING 48588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR BDCD +ENCODING 48589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR BDCE +ENCODING 48590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR BDCF +ENCODING 48591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +9500 +F500 +F500 +DD00 +2D00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR BDD0 +ENCODING 48592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR BDD1 +ENCODING 48593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +20 +3F +3F +40 +3F +ENDCHAR +STARTCHAR BDD2 +ENCODING 48594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +4A80 +7A80 +7A80 +0280 +FA80 +1680 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR BDD3 +ENCODING 48595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +95 +F5 +F5 +DD +2D +3C +33 +0C +32 +1E +ENDCHAR +STARTCHAR BDD4 +ENCODING 48596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +4480 +4480 +7C80 +4480 +7C80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR BDD5 +ENCODING 48597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +F9 +89 +F9 +01 +FD +21 +20 +7F +01 +01 +ENDCHAR +STARTCHAR BDD6 +ENCODING 48598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR BDD7 +ENCODING 48599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR BDD8 +ENCODING 48600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +F9 +89 +F9 +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR BDD9 +ENCODING 48601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR BDDA +ENCODING 48602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR BDDB +ENCODING 48603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR BDDC +ENCODING 48604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR BDDD +ENCODING 48605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR BDDE +ENCODING 48606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR BDDF +ENCODING 48607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR BDE0 +ENCODING 48608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR BDE1 +ENCODING 48609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR BDE2 +ENCODING 48610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR BDE3 +ENCODING 48611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR BDE4 +ENCODING 48612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +7F +41 +7F +ENDCHAR +STARTCHAR BDE5 +ENCODING 48613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +41 +7F +7F +ENDCHAR +STARTCHAR BDE6 +ENCODING 48614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR BDE7 +ENCODING 48615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR BDE8 +ENCODING 48616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BDE9 +ENCODING 48617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +F9 +89 +F9 +01 +FD +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR BDEA +ENCODING 48618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +F900 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BDEB +ENCODING 48619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +8900 +7900 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BDEC +ENCODING 48620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR BDED +ENCODING 48621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR BDEE +ENCODING 48622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +89 +F9 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR BDEF +ENCODING 48623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +89 +79 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BDF0 +ENCODING 48624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2080 +2080 +3F80 +2080 +3F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR BDF1 +ENCODING 48625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR BDF2 +ENCODING 48626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR BDF3 +ENCODING 48627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BDF4 +ENCODING 48628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR BDF5 +ENCODING 48629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR BDF6 +ENCODING 48630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR BDF7 +ENCODING 48631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR BDF8 +ENCODING 48632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BDF9 +ENCODING 48633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR BDFA +ENCODING 48634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR BDFB +ENCODING 48635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR BDFC +ENCODING 48636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR BDFD +ENCODING 48637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR BDFE +ENCODING 48638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR BDFF +ENCODING 48639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR BE00 +ENCODING 48640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BE01 +ENCODING 48641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR BE02 +ENCODING 48642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR BE03 +ENCODING 48643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +1100 +1500 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR BE04 +ENCODING 48644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR BE05 +ENCODING 48645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BE06 +ENCODING 48646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR BE07 +ENCODING 48647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR BE08 +ENCODING 48648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR BE09 +ENCODING 48649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7E +41 +7E +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR BE0A +ENCODING 48650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2000 +2080 +3F80 +3F00 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR BE0B +ENCODING 48651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7E +41 +7E +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR BE0C +ENCODING 48652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2080 +2080 +3F80 +2080 +2080 +3F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR BE0D +ENCODING 48653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BE0E +ENCODING 48654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR BE0F +ENCODING 48655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +4000 +4100 +7E00 +4100 +3E00 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BE10 +ENCODING 48656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BE11 +ENCODING 48657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BE12 +ENCODING 48658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR BE13 +ENCODING 48659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BE14 +ENCODING 48660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +2080 +3F00 +2080 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BE15 +ENCODING 48661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR BE16 +ENCODING 48662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR BE17 +ENCODING 48663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR BE18 +ENCODING 48664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR BE19 +ENCODING 48665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR BE1A +ENCODING 48666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR BE1B +ENCODING 48667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR BE1C +ENCODING 48668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BE1D +ENCODING 48669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BE1E +ENCODING 48670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BE1F +ENCODING 48671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2080 +3F00 +2080 +3F00 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR BE20 +ENCODING 48672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BE21 +ENCODING 48673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR BE22 +ENCODING 48674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BE23 +ENCODING 48675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR BE24 +ENCODING 48676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BE25 +ENCODING 48677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +7F +41 +7E +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR BE26 +ENCODING 48678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +40 +41 +7E +41 +3E +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BE27 +ENCODING 48679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +40 +7F +41 +7E +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR BE28 +ENCODING 48680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +89 +F9 +89 +F9 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR BE29 +ENCODING 48681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BE2A +ENCODING 48682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BE2B +ENCODING 48683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +7100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BE2C +ENCODING 48684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +F9 +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR BE2D +ENCODING 48685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BE2E +ENCODING 48686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR BE2F +ENCODING 48687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR BE30 +ENCODING 48688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR BE31 +ENCODING 48689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR BE32 +ENCODING 48690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR BE33 +ENCODING 48691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BE34 +ENCODING 48692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR BE35 +ENCODING 48693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BE36 +ENCODING 48694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR BE37 +ENCODING 48695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR BE38 +ENCODING 48696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR BE39 +ENCODING 48697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR BE3A +ENCODING 48698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR BE3B +ENCODING 48699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR BE3C +ENCODING 48700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BE3D +ENCODING 48701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BE3E +ENCODING 48702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +7100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BE3F +ENCODING 48703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +F900 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BE40 +ENCODING 48704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR BE41 +ENCODING 48705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR BE42 +ENCODING 48706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +71 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR BE43 +ENCODING 48707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +F9 +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BE44 +ENCODING 48708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +89 +F9 +89 +89 +89 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR BE45 +ENCODING 48709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +89 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BE46 +ENCODING 48710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BE47 +ENCODING 48711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +8900 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BE48 +ENCODING 48712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +89 +F9 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR BE49 +ENCODING 48713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BE4A +ENCODING 48714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BE4B +ENCODING 48715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +89 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR BE4C +ENCODING 48716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BE4D +ENCODING 48717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BE4E +ENCODING 48718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +F9 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BE4F +ENCODING 48719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BE50 +ENCODING 48720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BE51 +ENCODING 48721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BE52 +ENCODING 48722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BE53 +ENCODING 48723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BE54 +ENCODING 48724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +89 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BE55 +ENCODING 48725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +89 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR BE56 +ENCODING 48726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +8900 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BE57 +ENCODING 48727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +89 +F9 +89 +F9 +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR BE58 +ENCODING 48728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +8900 +F900 +8900 +8900 +F900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BE59 +ENCODING 48729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +89 +89 +F9 +89 +89 +F9 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BE5A +ENCODING 48730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +8900 +F900 +8900 +8900 +F900 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BE5B +ENCODING 48731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +8900 +F900 +8900 +F900 +0100 +1C00 +0000 +3F00 +0200 +0C00 +7380 +ENDCHAR +STARTCHAR BE5C +ENCODING 48732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BE5D +ENCODING 48733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR BE5E +ENCODING 48734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +89 +F9 +89 +89 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BE5F +ENCODING 48735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +89 +F9 +89 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BE60 +ENCODING 48736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +D500 +DD00 +D580 +D500 +D500 +DD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BE61 +ENCODING 48737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD00 +D580 +D500 +D900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BE62 +ENCODING 48738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BE63 +ENCODING 48739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BE64 +ENCODING 48740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD00 +D580 +D500 +D900 +0100 +4000 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR BE65 +ENCODING 48741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BE66 +ENCODING 48742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR BE67 +ENCODING 48743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR BE68 +ENCODING 48744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD80 +D500 +DD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR BE69 +ENCODING 48745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR BE6A +ENCODING 48746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD80 +D500 +DD00 +0000 +FE00 +1900 +7900 +8900 +7E00 +ENDCHAR +STARTCHAR BE6B +ENCODING 48747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR BE6C +ENCODING 48748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR BE6D +ENCODING 48749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR BE6E +ENCODING 48750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR BE6F +ENCODING 48751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR BE70 +ENCODING 48752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD00 +D580 +D500 +D900 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR BE71 +ENCODING 48753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD80 +D500 +D500 +D900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR BE72 +ENCODING 48754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BE73 +ENCODING 48755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD00 +D580 +D500 +D900 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR BE74 +ENCODING 48756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD00 +D580 +D500 +D900 +0000 +2200 +2200 +5500 +8980 +ENDCHAR +STARTCHAR BE75 +ENCODING 48757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD00 +D580 +D500 +D900 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR BE76 +ENCODING 48758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR BE77 +ENCODING 48759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR BE78 +ENCODING 48760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR BE79 +ENCODING 48761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD00 +D580 +DD00 +0000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR BE7A +ENCODING 48762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +DD00 +D580 +D500 +D900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR BE7B +ENCODING 48763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD80 +D500 +DD00 +0100 +1C00 +0000 +7F00 +2200 +1C00 +ENDCHAR +STARTCHAR BE7C +ENCODING 48764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +EB +DB +EB +EB +EB +DB +03 +03 +03 +ENDCHAR +STARTCHAR BE7D +ENCODING 48765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +DB +EB +EB +DB +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BE7E +ENCODING 48766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +EB +ED +D5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BE7F +ENCODING 48767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +EB00 +ED00 +D500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BE80 +ENCODING 48768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +EB00 +EB00 +DB00 +EB00 +EB00 +DB00 +0300 +2300 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BE81 +ENCODING 48769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +EB00 +ED00 +D500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BE82 +ENCODING 48770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BE83 +ENCODING 48771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +EB +ED +D5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BE84 +ENCODING 48772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +DB +EB +DB +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BE85 +ENCODING 48773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BE86 +ENCODING 48774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BE87 +ENCODING 48775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BE88 +ENCODING 48776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BE89 +ENCODING 48777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BE8A +ENCODING 48778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BE8B +ENCODING 48779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BE8C +ENCODING 48780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +DB +EB +EB +DB +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BE8D +ENCODING 48781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +DB +EB +EB +DB +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR BE8E +ENCODING 48782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +EB00 +ED00 +D500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BE8F +ENCODING 48783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +EB00 +EB00 +DB00 +EB00 +EB00 +DB00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR BE90 +ENCODING 48784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +EB00 +EB00 +DB00 +EB00 +EB00 +DB00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR BE91 +ENCODING 48785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +DB +EB +EB +DB +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR BE92 +ENCODING 48786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +EB00 +ED00 +D500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BE93 +ENCODING 48787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +DD00 +EB00 +ED00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BE94 +ENCODING 48788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +EB +ED +D5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BE95 +ENCODING 48789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BE96 +ENCODING 48790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +EB +ED +D5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BE97 +ENCODING 48791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DD +EB +ED +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BE98 +ENCODING 48792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +D580 +DD00 +D500 +D580 +D500 +DD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BE99 +ENCODING 48793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD80 +D500 +D580 +D900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR BE9A +ENCODING 48794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BE9B +ENCODING 48795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BE9C +ENCODING 48796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +D580 +DD00 +D500 +DD80 +0100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR BE9D +ENCODING 48797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BE9E +ENCODING 48798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR BE9F +ENCODING 48799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR BEA0 +ENCODING 48800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7E00 +0100 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR BEA1 +ENCODING 48801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR BEA2 +ENCODING 48802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR BEA3 +ENCODING 48803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR BEA4 +ENCODING 48804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR BEA5 +ENCODING 48805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR BEA6 +ENCODING 48806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR BEA7 +ENCODING 48807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR BEA8 +ENCODING 48808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +D500 +D500 +DD80 +D500 +D580 +D900 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR BEA9 +ENCODING 48809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR BEAA +ENCODING 48810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BEAB +ENCODING 48811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR BEAC +ENCODING 48812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR BEAD +ENCODING 48813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +1800 +2600 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR BEAE +ENCODING 48814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR BEAF +ENCODING 48815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR BEB0 +ENCODING 48816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR BEB1 +ENCODING 48817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR BEB2 +ENCODING 48818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D500 +DD80 +D500 +D580 +D900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR BEB3 +ENCODING 48819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +DD80 +D500 +DD80 +0000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR BEB4 +ENCODING 48820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +4D +ED +FF +ED +ED +EB +15 +05 +05 +01 +ENDCHAR +STARTCHAR BEB5 +ENCODING 48821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BEB6 +ENCODING 48822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BEB7 +ENCODING 48823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FB00 +ED00 +EB00 +D500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BEB8 +ENCODING 48824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +EF +FD +ED +DF +05 +01 +20 +3F +ENDCHAR +STARTCHAR BEB9 +ENCODING 48825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FB00 +ED00 +EB00 +D500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BEBA +ENCODING 48826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BEBB +ENCODING 48827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BEBC +ENCODING 48828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BEBD +ENCODING 48829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BEBE +ENCODING 48830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BEBF +ENCODING 48831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BEC0 +ENCODING 48832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BEC1 +ENCODING 48833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BEC2 +ENCODING 48834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BEC3 +ENCODING 48835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BEC4 +ENCODING 48836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BEC5 +ENCODING 48837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BEC6 +ENCODING 48838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FB00 +ED00 +EB00 +D500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BEC7 +ENCODING 48839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FB +ED +EB +D5 +01 +08 +14 +63 +ENDCHAR +STARTCHAR BEC8 +ENCODING 48840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FB00 +ED00 +EB00 +D500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BEC9 +ENCODING 48841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FB +ED +EB +D5 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR BECA +ENCODING 48842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FB00 +ED00 +EB00 +D500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BECB +ENCODING 48843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +DB00 +ED00 +EB00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BECC +ENCODING 48844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BECD +ENCODING 48845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BECE +ENCODING 48846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FB +ED +EB +D5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BECF +ENCODING 48847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +DB +ED +EB +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BED0 +ENCODING 48848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +B5 +DF +B5 +B5 +B5 +DD +01 +01 +01 +ENDCHAR +STARTCHAR BED1 +ENCODING 48849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B5 +DD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BED2 +ENCODING 48850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DD +D7 +D5 +D9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BED3 +ENCODING 48851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D700 +D500 +D900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BED4 +ENCODING 48852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B5 +DD +01 +41 +40 +40 +3F +ENDCHAR +STARTCHAR BED5 +ENCODING 48853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DD +D7 +D5 +D9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BED6 +ENCODING 48854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BED7 +ENCODING 48855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B5 +DD +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR BED8 +ENCODING 48856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +DD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BED9 +ENCODING 48857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BEDA +ENCODING 48858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BEDB +ENCODING 48859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BEDC +ENCODING 48860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BEDD +ENCODING 48861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BEDE +ENCODING 48862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BEDF +ENCODING 48863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BEE0 +ENCODING 48864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B5 +DD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BEE1 +ENCODING 48865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D5 +DD +D7 +D5 +D9 +01 +41 +7F +7F +ENDCHAR +STARTCHAR BEE2 +ENCODING 48866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D700 +D500 +D900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BEE3 +ENCODING 48867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DD +B7 +B5 +DD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR BEE4 +ENCODING 48868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +B500 +B500 +DF00 +B500 +B500 +DD00 +0000 +2200 +2200 +7500 +CC80 +ENDCHAR +STARTCHAR BEE5 +ENCODING 48869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B5 +DD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BEE6 +ENCODING 48870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D700 +D500 +D900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR BEE7 +ENCODING 48871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B500 +DF00 +B500 +FD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BEE8 +ENCODING 48872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DD +D7 +D5 +D9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BEE9 +ENCODING 48873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR BEEA +ENCODING 48874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D5 +DD +D7 +D5 +D9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BEEB +ENCODING 48875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B5 +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BEEC +ENCODING 48876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +EB +DB +EF +EB +EB +DB +03 +03 +03 +ENDCHAR +STARTCHAR BEED +ENCODING 48877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BEEE +ENCODING 48878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BEEF +ENCODING 48879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FB00 +EF00 +EB00 +D100 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BEF0 +ENCODING 48880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +EB +FD +EB +DB +03 +01 +20 +3F +ENDCHAR +STARTCHAR BEF1 +ENCODING 48881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FB00 +EF00 +EB00 +D100 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BEF2 +ENCODING 48882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BEF3 +ENCODING 48883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BEF4 +ENCODING 48884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BEF5 +ENCODING 48885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BEF6 +ENCODING 48886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BEF7 +ENCODING 48887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BEF8 +ENCODING 48888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BEF9 +ENCODING 48889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BEFA +ENCODING 48890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BEFB +ENCODING 48891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BEFC +ENCODING 48892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BEFD +ENCODING 48893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BEFE +ENCODING 48894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FB00 +EF00 +EB00 +D100 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BEFF +ENCODING 48895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FB +EF +EB +D3 +00 +08 +14 +63 +ENDCHAR +STARTCHAR BF00 +ENCODING 48896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FB00 +EF00 +EB00 +D100 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BF01 +ENCODING 48897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +EB +EB +DF +EB +EB +DB +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR BF02 +ENCODING 48898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FB00 +EF00 +EB00 +D100 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BF03 +ENCODING 48899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +DB00 +EF00 +EB00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BF04 +ENCODING 48900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BF05 +ENCODING 48901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BF06 +ENCODING 48902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FB +EF +EB +D1 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BF07 +ENCODING 48903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DB +EF +EB +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BF08 +ENCODING 48904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +B7 +DD +B5 +B7 +B5 +DD +01 +01 +01 +ENDCHAR +STARTCHAR BF09 +ENCODING 48905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B7 +DD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BF0A +ENCODING 48906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DF +D7 +D5 +D9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BF0B +ENCODING 48907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DF00 +D700 +D500 +D900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BF0C +ENCODING 48908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +B7 +FD +B7 +DD +01 +01 +20 +3F +ENDCHAR +STARTCHAR BF0D +ENCODING 48909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DF +D7 +D5 +D9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR BF0E +ENCODING 48910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR BF0F +ENCODING 48911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D5 +DF +D7 +D5 +D9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR BF10 +ENCODING 48912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BF11 +ENCODING 48913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR BF12 +ENCODING 48914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BF13 +ENCODING 48915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BF14 +ENCODING 48916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BF15 +ENCODING 48917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BF16 +ENCODING 48918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BF17 +ENCODING 48919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR BF18 +ENCODING 48920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B7 +DD +B7 +B5 +D9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR BF19 +ENCODING 48921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B7 +DD +B7 +B5 +D9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR BF1A +ENCODING 48922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DF00 +D700 +D500 +D900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BF1B +ENCODING 48923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B7 +DD +01 +08 +1C +36 +41 +ENDCHAR +STARTCHAR BF1C +ENCODING 48924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +B500 +B700 +DD00 +B700 +B500 +D900 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR BF1D +ENCODING 48925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +DF +B5 +B7 +DD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR BF1E +ENCODING 48926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DF00 +D700 +D500 +D900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR BF1F +ENCODING 48927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B500 +DF00 +B700 +FD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR BF20 +ENCODING 48928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DF +D7 +D5 +D9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BF21 +ENCODING 48929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR BF22 +ENCODING 48930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D5 +DF +D7 +D5 +D9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BF23 +ENCODING 48931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DF +B7 +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BF24 +ENCODING 48932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +4B +EB +FD +EB +ED +EB +13 +03 +03 +ENDCHAR +STARTCHAR BF25 +ENCODING 48933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BF26 +ENCODING 48934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BF27 +ENCODING 48935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FD00 +EB00 +ED00 +D100 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR BF28 +ENCODING 48936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +ED +FB +ED +DB +03 +01 +20 +3F +ENDCHAR +STARTCHAR BF29 +ENCODING 48937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FD00 +EB00 +ED00 +D100 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR BF2A +ENCODING 48938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR BF2B +ENCODING 48939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +3F +40 +7F +ENDCHAR +STARTCHAR BF2C +ENCODING 48940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR BF2D +ENCODING 48941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR BF2E +ENCODING 48942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR BF2F +ENCODING 48943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR BF30 +ENCODING 48944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR BF31 +ENCODING 48945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR BF32 +ENCODING 48946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR BF33 +ENCODING 48947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR BF34 +ENCODING 48948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +3F +41 +7F +ENDCHAR +STARTCHAR BF35 +ENCODING 48949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +21 +3F +3F +ENDCHAR +STARTCHAR BF36 +ENCODING 48950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FD00 +EB00 +ED00 +D100 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR BF37 +ENCODING 48951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FD +EF +EB +D3 +01 +08 +14 +63 +ENDCHAR +STARTCHAR BF38 +ENCODING 48952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FD00 +EB00 +ED00 +D100 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BF39 +ENCODING 48953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FD +EF +EB +D3 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR BF3A +ENCODING 48954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +FD00 +EB00 +ED00 +D100 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR BF3B +ENCODING 48955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +EB00 +DD00 +EF00 +EB00 +1100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR BF3C +ENCODING 48956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BF3D +ENCODING 48957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR BF3E +ENCODING 48958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +EB +FD +EB +ED +D1 +00 +3F +12 +3F +ENDCHAR +STARTCHAR BF3F +ENCODING 48959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +EB +DD +EF +EB +11 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR BF40 +ENCODING 48960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +4C80 +4C80 +7B80 +4C80 +4C80 +7B80 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR BF41 +ENCODING 48961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BF42 +ENCODING 48962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR BF43 +ENCODING 48963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +1100 +9900 +FF00 +9900 +6E00 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BF44 +ENCODING 48964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +4C80 +3F80 +4C80 +3F80 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR BF45 +ENCODING 48965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BF46 +ENCODING 48966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BF47 +ENCODING 48967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +99 +FF +99 +6E +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BF48 +ENCODING 48968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +4C80 +3F80 +4C80 +3F80 +0400 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BF49 +ENCODING 48969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BF4A +ENCODING 48970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BF4B +ENCODING 48971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR BF4C +ENCODING 48972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BF4D +ENCODING 48973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR BF4E +ENCODING 48974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR BF4F +ENCODING 48975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR BF50 +ENCODING 48976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BF51 +ENCODING 48977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR BF52 +ENCODING 48978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BF53 +ENCODING 48979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR BF54 +ENCODING 48980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BF55 +ENCODING 48981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BF56 +ENCODING 48982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BF57 +ENCODING 48983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR BF58 +ENCODING 48984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +11 +99 +FF +99 +6E +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BF59 +ENCODING 48985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR BF5A +ENCODING 48986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +99 +FF +99 +6E +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BF5B +ENCODING 48987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR BF5C +ENCODING 48988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0A80 +5A80 +7E80 +5A80 +6EC0 +1080 +1280 +EC80 +0080 +ENDCHAR +STARTCHAR BF5D +ENCODING 48989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR BF5E +ENCODING 48990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR BF5F +ENCODING 48991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR BF60 +ENCODING 48992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +5C80 +6C80 +5C80 +6CC0 +1080 +FE80 +0000 +2000 +3F00 +ENDCHAR +STARTCHAR BF61 +ENCODING 48993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR BF62 +ENCODING 48994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BF63 +ENCODING 48995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR BF64 +ENCODING 48996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +1F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BF65 +ENCODING 48997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BF66 +ENCODING 48998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BF67 +ENCODING 48999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR BF68 +ENCODING 49000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BF69 +ENCODING 49001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR BF6A +ENCODING 49002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR BF6B +ENCODING 49003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR BF6C +ENCODING 49004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR BF6D +ENCODING 49005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR BF6E +ENCODING 49006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR BF6F +ENCODING 49007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR BF70 +ENCODING 49008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR BF71 +ENCODING 49009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR BF72 +ENCODING 49010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR BF73 +ENCODING 49011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR BF74 +ENCODING 49012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR BF75 +ENCODING 49013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR BF76 +ENCODING 49014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +B900 +F900 +F980 +2100 +2D00 +D000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR BF77 +ENCODING 49015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7E80 +5A80 +6CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR BF78 +ENCODING 49016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +0280 +B680 +7E80 +B780 +7A80 +1280 +0A80 +7280 +0280 +0080 +ENDCHAR +STARTCHAR BF79 +ENCODING 49017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FF +25 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BF7A +ENCODING 49018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FF +25 +FD +01 +3F +09 +09 +09 +ENDCHAR +STARTCHAR BF7B +ENCODING 49019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FF00 +2500 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BF7C +ENCODING 49020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +6D +FD +ED +D7 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR BF7D +ENCODING 49021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FF00 +2500 +FD00 +0100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR BF7E +ENCODING 49022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR BF7F +ENCODING 49023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +FF +25 +FD +01 +3F +40 +7F +ENDCHAR +STARTCHAR BF80 +ENCODING 49024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BF81 +ENCODING 49025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR BF82 +ENCODING 49026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR BF83 +ENCODING 49027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR BF84 +ENCODING 49028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR BF85 +ENCODING 49029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR BF86 +ENCODING 49030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR BF87 +ENCODING 49031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR BF88 +ENCODING 49032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +FF +25 +FD +01 +3F +41 +7F +ENDCHAR +STARTCHAR BF89 +ENCODING 49033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +FF +25 +FD +01 +21 +3F +3F +ENDCHAR +STARTCHAR BF8A +ENCODING 49034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FF00 +2500 +FD00 +0100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR BF8B +ENCODING 49035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +FF +25 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR BF8C +ENCODING 49036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FF00 +2500 +FD00 +0100 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR BF8D +ENCODING 49037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FF +25 +FD +09 +37 +41 +23 +1C +ENDCHAR +STARTCHAR BF8E +ENCODING 49038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FF00 +2500 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BF8F +ENCODING 49039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR BF90 +ENCODING 49040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FF +25 +FD +01 +3F +3F +01 +01 +ENDCHAR +STARTCHAR BF91 +ENCODING 49041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR BF92 +ENCODING 49042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +ED +FD +FF +25 +FD +01 +3F +12 +3F +ENDCHAR +STARTCHAR BF93 +ENCODING 49043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7680 +7E80 +7F80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR BF94 +ENCODING 49044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +5A80 +5A80 +7E80 +5A80 +7E80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BF95 +ENCODING 49045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +7F +01 +01 +01 +ENDCHAR +STARTCHAR BF96 +ENCODING 49046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +7F +09 +09 +09 +ENDCHAR +STARTCHAR BF97 +ENCODING 49047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B900 +F900 +F900 +0100 +3D00 +C100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR BF98 +ENCODING 49048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +D9 +B9 +D9 +21 +FD +01 +40 +7F +ENDCHAR +STARTCHAR BF99 +ENCODING 49049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BF9A +ENCODING 49050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR BF9B +ENCODING 49051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +3F +40 +7E +ENDCHAR +STARTCHAR BF9C +ENCODING 49052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR BF9D +ENCODING 49053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR BF9E +ENCODING 49054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR BF9F +ENCODING 49055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR BFA0 +ENCODING 49056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR BFA1 +ENCODING 49057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR BFA2 +ENCODING 49058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR BFA3 +ENCODING 49059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR BFA4 +ENCODING 49060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +7F +41 +7F +ENDCHAR +STARTCHAR BFA5 +ENCODING 49061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +41 +7F +7F +ENDCHAR +STARTCHAR BFA6 +ENCODING 49062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +52 +72 +55 +78 +ENDCHAR +STARTCHAR BFA7 +ENCODING 49063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +08 +14 +63 +ENDCHAR +STARTCHAR BFA8 +ENCODING 49064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BFA9 +ENCODING 49065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BFAA +ENCODING 49066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B900 +F900 +F900 +0100 +3D00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BFAB +ENCODING 49067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +B500 +D900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR BFAC +ENCODING 49068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +7F +3F +01 +01 +ENDCHAR +STARTCHAR BFAD +ENCODING 49069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR BFAE +ENCODING 49070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +F9 +F9 +01 +3D +C1 +7F +12 +3F +ENDCHAR +STARTCHAR BFAF +ENCODING 49071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR BFB0 +ENCODING 49072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +4C80 +4C80 +7B80 +4C80 +4C80 +7B80 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR BFB1 +ENCODING 49073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR BFB2 +ENCODING 49074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR BFB3 +ENCODING 49075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +1100 +9900 +FF00 +9900 +6600 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR BFB4 +ENCODING 49076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +99 +7F +99 +77 +24 +DB +40 +40 +7E +ENDCHAR +STARTCHAR BFB5 +ENCODING 49077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR BFB6 +ENCODING 49078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR BFB7 +ENCODING 49079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR BFB8 +ENCODING 49080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR BFB9 +ENCODING 49081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR BFBA +ENCODING 49082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR BFBB +ENCODING 49083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR BFBC +ENCODING 49084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR BFBD +ENCODING 49085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR BFBE +ENCODING 49086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR BFBF +ENCODING 49087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR BFC0 +ENCODING 49088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR BFC1 +ENCODING 49089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +99 +FF +99 +66 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR BFC2 +ENCODING 49090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR BFC3 +ENCODING 49091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR BFC4 +ENCODING 49092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR BFC5 +ENCODING 49093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +1200 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BFC6 +ENCODING 49094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR BFC7 +ENCODING 49095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR BFC8 +ENCODING 49096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR BFC9 +ENCODING 49097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR BFCA +ENCODING 49098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +11 +99 +FF +99 +66 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR BFCB +ENCODING 49099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0C80 +7F80 +4C80 +3F80 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR BFCC +ENCODING 49100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4C80 +4C80 +7B80 +4C80 +7B80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR BFCD +ENCODING 49101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR BFCE +ENCODING 49102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR BFCF +ENCODING 49103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR BFD0 +ENCODING 49104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR BFD1 +ENCODING 49105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR BFD2 +ENCODING 49106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR BFD3 +ENCODING 49107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR BFD4 +ENCODING 49108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +4C80 +3F80 +4C80 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR BFD5 +ENCODING 49109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR BFD6 +ENCODING 49110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR BFD7 +ENCODING 49111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR BFD8 +ENCODING 49112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR BFD9 +ENCODING 49113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR BFDA +ENCODING 49114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR BFDB +ENCODING 49115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR BFDC +ENCODING 49116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR BFDD +ENCODING 49117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +2400 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR BFDE +ENCODING 49118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR BFDF +ENCODING 49119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0400 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR BFE0 +ENCODING 49120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR BFE1 +ENCODING 49121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR BFE2 +ENCODING 49122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +11 +99 +FF +FF +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR BFE3 +ENCODING 49123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR BFE4 +ENCODING 49124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR BFE5 +ENCODING 49125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +19 +FF +99 +7F +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR BFE6 +ENCODING 49126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR BFE7 +ENCODING 49127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR BFE8 +ENCODING 49128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7E80 +5A80 +5A80 +2480 +FE80 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR BFE9 +ENCODING 49129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +3E +01 +01 +01 +ENDCHAR +STARTCHAR BFEA +ENCODING 49130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR BFEB +ENCODING 49131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR BFEC +ENCODING 49132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B1 +F9 +B5 +D9 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR BFED +ENCODING 49133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR BFEE +ENCODING 49134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +46 +4F +49 +36 +ENDCHAR +STARTCHAR BFEF +ENCODING 49135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +3F +40 +7E +ENDCHAR +STARTCHAR BFF0 +ENCODING 49136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +7F +3F +40 +3F +ENDCHAR +STARTCHAR BFF1 +ENCODING 49137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +77 +31 +41 +71 +ENDCHAR +STARTCHAR BFF2 +ENCODING 49138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR BFF3 +ENCODING 49139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR BFF4 +ENCODING 49140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +72 +72 +85 +68 +ENDCHAR +STARTCHAR BFF5 +ENCODING 49141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR BFF6 +ENCODING 49142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR BFF7 +ENCODING 49143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +77 +37 +49 +76 +ENDCHAR +STARTCHAR BFF8 +ENCODING 49144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +7F +41 +7F +ENDCHAR +STARTCHAR BFF9 +ENCODING 49145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +41 +7F +7F +ENDCHAR +STARTCHAR BFFA +ENCODING 49146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR BFFB +ENCODING 49147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +08 +14 +63 +ENDCHAR +STARTCHAR BFFC +ENCODING 49148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +22 +22 +55 +08 +ENDCHAR +STARTCHAR BFFD +ENCODING 49149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +3E +41 +63 +1C +ENDCHAR +STARTCHAR BFFE +ENCODING 49150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B500 +FD00 +F500 +1D00 +E100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR BFFF +ENCODING 49151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +B500 +D900 +FD00 +2700 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C000 +ENCODING 49152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C001 +ENCODING 49153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C002 +ENCODING 49154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +F5 +1D +E1 +27 +3F +12 +3F +ENDCHAR +STARTCHAR C003 +ENCODING 49155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +FD +27 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C004 +ENCODING 49156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -2 +BITMAP +0080 +3680 +FE80 +B680 +B680 +4A80 +FE80 +1680 +1280 +0280 +ENDCHAR +STARTCHAR C005 +ENCODING 49157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C006 +ENCODING 49158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR C007 +ENCODING 49159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR C008 +ENCODING 49160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3680 +7E80 +7680 +6A80 +FE80 +1680 +1280 +2000 +3F80 +ENDCHAR +STARTCHAR C009 +ENCODING 49161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR C00A +ENCODING 49162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FD00 +DD00 +2D00 +2000 +4F80 +4700 +4500 +3200 +ENDCHAR +STARTCHAR C00B +ENCODING 49163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR C00C +ENCODING 49164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +1F +7F +40 +3F +ENDCHAR +STARTCHAR C00D +ENCODING 49165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +1F +39 +41 +38 +ENDCHAR +STARTCHAR C00E +ENCODING 49166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +77 +35 +45 +37 +ENDCHAR +STARTCHAR C00F +ENCODING 49167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +1D +77 +45 +37 +ENDCHAR +STARTCHAR C010 +ENCODING 49168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +52 +72 +45 +70 +ENDCHAR +STARTCHAR C011 +ENCODING 49169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +1F +77 +44 +37 +ENDCHAR +STARTCHAR C012 +ENCODING 49170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +57 +75 +45 +77 +ENDCHAR +STARTCHAR C013 +ENCODING 49171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +27 +7F +77 +45 +72 +ENDCHAR +STARTCHAR C014 +ENCODING 49172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR C015 +ENCODING 49173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C016 +ENCODING 49174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +2100 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR C017 +ENCODING 49175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +0400 +0E00 +3180 +ENDCHAR +STARTCHAR C018 +ENCODING 49176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR C019 +ENCODING 49177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR C01A +ENCODING 49178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR C01B +ENCODING 49179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +ED00 +FD00 +FD00 +DD00 +2D00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR C01C +ENCODING 49180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR C01D +ENCODING 49181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +20 +3F +3F +40 +3F +ENDCHAR +STARTCHAR C01E +ENCODING 49182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3680 +7E80 +7680 +0A80 +FA80 +1680 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR C01F +ENCODING 49183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +ED +FD +FD +DD +2D +3C +33 +0C +32 +1E +ENDCHAR +STARTCHAR C020 +ENCODING 49184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +4A80 +7E80 +5A80 +5A80 +2480 +FE80 +1080 +1080 +1080 +0080 +ENDCHAR +STARTCHAR C021 +ENCODING 49185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C022 +ENCODING 49186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C023 +ENCODING 49187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C024 +ENCODING 49188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B1 +F9 +B5 +D9 +ED +11 +01 +40 +7F +ENDCHAR +STARTCHAR C025 +ENCODING 49189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C026 +ENCODING 49190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C027 +ENCODING 49191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR C028 +ENCODING 49192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR C029 +ENCODING 49193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C02A +ENCODING 49194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C02B +ENCODING 49195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C02C +ENCODING 49196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C02D +ENCODING 49197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C02E +ENCODING 49198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C02F +ENCODING 49199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR C030 +ENCODING 49200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +7F +41 +7F +ENDCHAR +STARTCHAR C031 +ENCODING 49201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +41 +7F +7F +ENDCHAR +STARTCHAR C032 +ENCODING 49202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C033 +ENCODING 49203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR C034 +ENCODING 49204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C035 +ENCODING 49205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C036 +ENCODING 49206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B500 +FD00 +FD00 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C037 +ENCODING 49207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +B500 +D900 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C038 +ENCODING 49208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C039 +ENCODING 49209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C03A +ENCODING 49210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B5 +FD +FD +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR C03B +ENCODING 49211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C03C +ENCODING 49212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +4C80 +4C80 +7B80 +4C80 +7B80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR C03D +ENCODING 49213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR C03E +ENCODING 49214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C03F +ENCODING 49215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C040 +ENCODING 49216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +4C80 +3F80 +4C80 +3300 +FFC0 +1200 +3200 +2000 +3F00 +ENDCHAR +STARTCHAR C041 +ENCODING 49217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C042 +ENCODING 49218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR C043 +ENCODING 49219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C044 +ENCODING 49220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +19 +FF +99 +7F +00 +FF +24 +5B +7E +7E +ENDCHAR +STARTCHAR C045 +ENCODING 49221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C046 +ENCODING 49222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C047 +ENCODING 49223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C048 +ENCODING 49224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C049 +ENCODING 49225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C04A +ENCODING 49226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C04B +ENCODING 49227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR C04C +ENCODING 49228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR C04D +ENCODING 49229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C04E +ENCODING 49230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C04F +ENCODING 49231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR C050 +ENCODING 49232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C051 +ENCODING 49233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C052 +ENCODING 49234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C053 +ENCODING 49235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C054 +ENCODING 49236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C055 +ENCODING 49237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +19 +FF +99 +7F +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR C056 +ENCODING 49238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +7F80 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C057 +ENCODING 49239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR C058 +ENCODING 49240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +4C80 +4C80 +7B80 +4C80 +4C80 +7B80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C059 +ENCODING 49241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR C05A +ENCODING 49242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C05B +ENCODING 49243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C05C +ENCODING 49244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C05D +ENCODING 49245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C05E +ENCODING 49246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C05F +ENCODING 49247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C060 +ENCODING 49248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +4C80 +3F80 +4C80 +3B80 +0000 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C061 +ENCODING 49249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR C062 +ENCODING 49250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR C063 +ENCODING 49251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR C064 +ENCODING 49252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C065 +ENCODING 49253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR C066 +ENCODING 49254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR C067 +ENCODING 49255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR C068 +ENCODING 49256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C069 +ENCODING 49257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +4C80 +3F80 +4C80 +3F80 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C06A +ENCODING 49258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C06B +ENCODING 49259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR C06C +ENCODING 49260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR C06D +ENCODING 49261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR C06E +ENCODING 49262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C06F +ENCODING 49263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR C070 +ENCODING 49264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR C071 +ENCODING 49265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +19 +FF +99 +7F +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR C072 +ENCODING 49266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0880 +4C80 +7F80 +4C80 +3300 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C073 +ENCODING 49267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +19 +FF +99 +7F +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C074 +ENCODING 49268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +15 +B5 +FD +B5 +DD +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR C075 +ENCODING 49269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C076 +ENCODING 49270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +3F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR C077 +ENCODING 49271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR C078 +ENCODING 49272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +B9 +D9 +B9 +D9 +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR C079 +ENCODING 49273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C07A +ENCODING 49274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C07B +ENCODING 49275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +1F80 +2000 +3F00 +ENDCHAR +STARTCHAR C07C +ENCODING 49276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR C07D +ENCODING 49277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C07E +ENCODING 49278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C07F +ENCODING 49279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C080 +ENCODING 49280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C081 +ENCODING 49281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C082 +ENCODING 49282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C083 +ENCODING 49283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C084 +ENCODING 49284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR C085 +ENCODING 49285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C086 +ENCODING 49286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +2900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR C087 +ENCODING 49287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR C088 +ENCODING 49288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +1100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR C089 +ENCODING 49289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +1F00 +2080 +3180 +0E00 +ENDCHAR +STARTCHAR C08A +ENCODING 49290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR C08B +ENCODING 49291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +B500 +D900 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C08C +ENCODING 49292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +3F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR C08D +ENCODING 49293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C08E +ENCODING 49294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +5C80 +7C80 +7C80 +0080 +FF80 +0080 +3F80 +0900 +1F80 +ENDCHAR +STARTCHAR C08F +ENCODING 49295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +B5 +D9 +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C090 +ENCODING 49296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +B5 +DD +B5 +B5 +B5 +DD +01 +01 +01 +ENDCHAR +STARTCHAR C091 +ENCODING 49297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +B5 +DD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C092 +ENCODING 49298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DD +D5 +D5 +D9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C093 +ENCODING 49299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D500 +D500 +D900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C094 +ENCODING 49300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +B5 +DD +01 +41 +40 +40 +3F +ENDCHAR +STARTCHAR C095 +ENCODING 49301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DD +D5 +D5 +D9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C096 +ENCODING 49302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C097 +ENCODING 49303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D5 +DD +D5 +D5 +D9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C098 +ENCODING 49304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +DD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C099 +ENCODING 49305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C09A +ENCODING 49306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C09B +ENCODING 49307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C09C +ENCODING 49308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C09D +ENCODING 49309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C09E +ENCODING 49310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C09F +ENCODING 49311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C0A0 +ENCODING 49312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +B5 +DD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C0A1 +ENCODING 49313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +B5 +DD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C0A2 +ENCODING 49314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D500 +D500 +D900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C0A3 +ENCODING 49315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +B5 +DD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR C0A4 +ENCODING 49316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D500 +D500 +D900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C0A5 +ENCODING 49317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +B5 +B5 +FD +B5 +B5 +DD +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C0A6 +ENCODING 49318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D500 +DD00 +D500 +D500 +D900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C0A7 +ENCODING 49319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +B500 +DD00 +B500 +FD00 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C0A8 +ENCODING 49320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D5 +DD +D5 +D5 +D9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C0A9 +ENCODING 49321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C0AA +ENCODING 49322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D5 +DD +D5 +D5 +D9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C0AB +ENCODING 49323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +B5 +DD +B5 +FD +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C0AC +ENCODING 49324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +2100 +6180 +5100 +9900 +8900 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C0AD +ENCODING 49325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C0AE +ENCODING 49326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C0AF +ENCODING 49327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +7180 +D900 +8900 +0000 +7200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C0B0 +ENCODING 49328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C0B1 +ENCODING 49329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +2180 +5100 +8900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C0B2 +ENCODING 49330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR C0B3 +ENCODING 49331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C0B4 +ENCODING 49332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C0B5 +ENCODING 49333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR C0B6 +ENCODING 49334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR C0B7 +ENCODING 49335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR C0B8 +ENCODING 49336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR C0B9 +ENCODING 49337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR C0BA +ENCODING 49338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR C0BB +ENCODING 49339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR C0BC +ENCODING 49340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR C0BD +ENCODING 49341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR C0BE +ENCODING 49342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C0BF +ENCODING 49343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR C0C0 +ENCODING 49344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0000 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR C0C1 +ENCODING 49345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2100 +5180 +D900 +8900 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR C0C2 +ENCODING 49346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C0C3 +ENCODING 49347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR C0C4 +ENCODING 49348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C0C5 +ENCODING 49349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C0C6 +ENCODING 49350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2100 +2100 +2180 +5100 +8900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C0C7 +ENCODING 49351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2100 +5180 +8900 +0000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR C0C8 +ENCODING 49352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +25 +45 +67 +65 +95 +95 +05 +05 +05 +ENDCHAR +STARTCHAR C0C9 +ENCODING 49353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +65 +67 +95 +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C0CA +ENCODING 49354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +25 +67 +95 +85 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C0CB +ENCODING 49355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6700 +9500 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C0CC +ENCODING 49356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6500 +6700 +9500 +8D00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C0CD +ENCODING 49357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6700 +9500 +8500 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C0CE +ENCODING 49358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C0CF +ENCODING 49359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +25 +67 +95 +85 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C0D0 +ENCODING 49360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +67 +D5 +9D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C0D1 +ENCODING 49361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C0D2 +ENCODING 49362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C0D3 +ENCODING 49363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C0D4 +ENCODING 49364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C0D5 +ENCODING 49365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C0D6 +ENCODING 49366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C0D7 +ENCODING 49367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C0D8 +ENCODING 49368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +65 +67 +D5 +8D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C0D9 +ENCODING 49369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +65 +67 +D5 +9D +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C0DA +ENCODING 49370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6700 +9500 +8500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C0DB +ENCODING 49371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6500 +6700 +9500 +8D00 +0100 +0800 +0C00 +3600 +6180 +ENDCHAR +STARTCHAR C0DC +ENCODING 49372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6500 +6700 +9500 +8D00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C0DD +ENCODING 49373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +65 +67 +D5 +8D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C0DE +ENCODING 49374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6700 +9500 +8500 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C0DF +ENCODING 49375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +6700 +9500 +0500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C0E0 +ENCODING 49376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +25 +67 +95 +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C0E1 +ENCODING 49377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C0E2 +ENCODING 49378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +25 +67 +95 +85 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C0E3 +ENCODING 49379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +67 +95 +05 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C0E4 +ENCODING 49380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +2100 +6100 +5180 +9900 +8900 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C0E5 +ENCODING 49381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +D980 +8900 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C0E6 +ENCODING 49382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C0E7 +ENCODING 49383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C0E8 +ENCODING 49384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +7100 +D900 +8980 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C0E9 +ENCODING 49385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C0EA +ENCODING 49386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR C0EB +ENCODING 49387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C0EC +ENCODING 49388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C0ED +ENCODING 49389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR C0EE +ENCODING 49390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR C0EF +ENCODING 49391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR C0F0 +ENCODING 49392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR C0F1 +ENCODING 49393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR C0F2 +ENCODING 49394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR C0F3 +ENCODING 49395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR C0F4 +ENCODING 49396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +D980 +8900 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR C0F5 +ENCODING 49397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +D980 +8900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR C0F6 +ENCODING 49398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C0F7 +ENCODING 49399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +7100 +D980 +8900 +0100 +0800 +0C00 +3600 +6100 +ENDCHAR +STARTCHAR C0F8 +ENCODING 49400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR C0F9 +ENCODING 49401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2180 +5100 +D980 +8900 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR C0FA +ENCODING 49402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C0FB +ENCODING 49403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR C0FC +ENCODING 49404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C0FD +ENCODING 49405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR C0FE +ENCODING 49406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2100 +2180 +2100 +5180 +8900 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C0FF +ENCODING 49407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2100 +2180 +5100 +8980 +0000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR C100 +ENCODING 49408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +27 +45 +65 +67 +95 +95 +05 +05 +05 +ENDCHAR +STARTCHAR C101 +ENCODING 49409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +27 +65 +97 +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C102 +ENCODING 49410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +27 +65 +97 +85 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C103 +ENCODING 49411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2700 +6500 +9700 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C104 +ENCODING 49412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6700 +6500 +9500 +8F00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C105 +ENCODING 49413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2700 +6500 +9700 +8500 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C106 +ENCODING 49414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C107 +ENCODING 49415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +27 +65 +97 +85 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C108 +ENCODING 49416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +27 +65 +97 +9D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C109 +ENCODING 49417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C10A +ENCODING 49418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C10B +ENCODING 49419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C10C +ENCODING 49420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C10D +ENCODING 49421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C10E +ENCODING 49422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C10F +ENCODING 49423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C110 +ENCODING 49424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +67 +65 +97 +8D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C111 +ENCODING 49425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +27 +65 +97 +85 +00 +21 +3F +3F +ENDCHAR +STARTCHAR C112 +ENCODING 49426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2700 +6500 +9700 +8500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C113 +ENCODING 49427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +27 +65 +97 +85 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C114 +ENCODING 49428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2700 +6500 +9700 +8500 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C115 +ENCODING 49429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +67 +65 +97 +8D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C116 +ENCODING 49430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2700 +6500 +9700 +8500 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C117 +ENCODING 49431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6700 +6500 +9700 +0500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C118 +ENCODING 49432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +27 +65 +97 +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C119 +ENCODING 49433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C11A +ENCODING 49434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +27 +65 +97 +85 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C11B +ENCODING 49435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +67 +65 +97 +05 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C11C +ENCODING 49436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +27 +61 +51 +99 +89 +01 +01 +01 +ENDCHAR +STARTCHAR C11D +ENCODING 49437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +D9 +89 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C11E +ENCODING 49438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +D9 +89 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C11F +ENCODING 49439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2700 +5100 +D900 +8900 +0000 +7200 +1200 +1500 +1480 +ENDCHAR +STARTCHAR C120 +ENCODING 49440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +D9 +89 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR C121 +ENCODING 49441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +27 +51 +89 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C122 +ENCODING 49442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C123 +ENCODING 49443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +D9 +89 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR C124 +ENCODING 49444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +89 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C125 +ENCODING 49445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C126 +ENCODING 49446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +89 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C127 +ENCODING 49447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +89 +00 +75 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C128 +ENCODING 49448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C129 +ENCODING 49449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C12A +ENCODING 49450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C12B +ENCODING 49451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C12C +ENCODING 49452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +71 +D9 +89 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C12D +ENCODING 49453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +D9 +89 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C12E +ENCODING 49454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +2700 +5100 +8900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C12F +ENCODING 49455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2700 +7100 +D900 +8900 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C130 +ENCODING 49456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2700 +5100 +D900 +8900 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C131 +ENCODING 49457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +51 +D9 +89 +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C132 +ENCODING 49458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +2700 +5100 +8900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C133 +ENCODING 49459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +5700 +8900 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C134 +ENCODING 49460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +27 +51 +89 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C135 +ENCODING 49461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C136 +ENCODING 49462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +2700 +5100 +D900 +8900 +0000 +3F00 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR C137 +ENCODING 49463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +57 +89 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C138 +ENCODING 49464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +25 +4D +65 +65 +95 +95 +05 +05 +05 +ENDCHAR +STARTCHAR C139 +ENCODING 49465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +6D +65 +95 +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C13A +ENCODING 49466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +25 +6D +95 +85 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C13B +ENCODING 49467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6D00 +9500 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C13C +ENCODING 49468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6D00 +6500 +9500 +8D00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C13D +ENCODING 49469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6D00 +9500 +8500 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C13E +ENCODING 49470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C13F +ENCODING 49471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +25 +6D +95 +85 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C140 +ENCODING 49472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +6D +D5 +9D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C141 +ENCODING 49473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C142 +ENCODING 49474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C143 +ENCODING 49475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C144 +ENCODING 49476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C145 +ENCODING 49477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C146 +ENCODING 49478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C147 +ENCODING 49479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C148 +ENCODING 49480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +6D +65 +95 +8D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C149 +ENCODING 49481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +6D +65 +95 +8D +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C14A +ENCODING 49482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6D00 +9500 +8500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C14B +ENCODING 49483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6D00 +6500 +9500 +8D00 +0100 +0800 +0C00 +3600 +6180 +ENDCHAR +STARTCHAR C14C +ENCODING 49484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2500 +6D00 +6500 +9500 +8D00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C14D +ENCODING 49485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +6D +65 +95 +8D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C14E +ENCODING 49486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2500 +6D00 +9500 +8500 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C14F +ENCODING 49487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6D00 +6500 +9500 +0100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C150 +ENCODING 49488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +25 +6D +95 +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C151 +ENCODING 49489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C152 +ENCODING 49490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +25 +6D +95 +85 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C153 +ENCODING 49491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +65 +95 +01 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C154 +ENCODING 49492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +27 +21 +67 +51 +99 +89 +01 +01 +01 +ENDCHAR +STARTCHAR C155 +ENCODING 49493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +27 +21 +67 +D1 +89 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C156 +ENCODING 49494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +27 +21 +53 +89 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C157 +ENCODING 49495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2700 +2100 +5300 +8900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C158 +ENCODING 49496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +27 +21 +67 +D1 +89 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR C159 +ENCODING 49497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +27 +21 +53 +89 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C15A +ENCODING 49498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C15B +ENCODING 49499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +27 +21 +53 +89 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C15C +ENCODING 49500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +27 +21 +57 +89 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C15D +ENCODING 49501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C15E +ENCODING 49502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C15F +ENCODING 49503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C160 +ENCODING 49504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C161 +ENCODING 49505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C162 +ENCODING 49506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C163 +ENCODING 49507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C164 +ENCODING 49508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +27 +21 +57 +D1 +89 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C165 +ENCODING 49509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +27 +21 +57 +D1 +89 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C166 +ENCODING 49510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2700 +2100 +5300 +8900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C167 +ENCODING 49511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2700 +2100 +6700 +D100 +8900 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C168 +ENCODING 49512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2700 +2100 +6700 +D100 +8900 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C169 +ENCODING 49513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +27 +21 +67 +D1 +89 +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C16A +ENCODING 49514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2700 +2100 +5300 +8900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C16B +ENCODING 49515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2300 +5700 +8900 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C16C +ENCODING 49516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +27 +21 +53 +89 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C16D +ENCODING 49517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C16E +ENCODING 49518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +27 +21 +53 +89 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C16F +ENCODING 49519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +23 +57 +89 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C170 +ENCODING 49520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +25 +2D +45 +6D +65 +95 +95 +05 +05 +05 +ENDCHAR +STARTCHAR C171 +ENCODING 49521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +2D +65 +9D +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C172 +ENCODING 49522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +2D +65 +9D +85 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C173 +ENCODING 49523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2D00 +6500 +9D00 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C174 +ENCODING 49524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2500 +2D00 +4500 +6D00 +9500 +9500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C175 +ENCODING 49525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2D00 +6500 +9D00 +8500 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C176 +ENCODING 49526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C177 +ENCODING 49527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +2D +65 +9D +85 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C178 +ENCODING 49528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +2D +25 +6D +B5 +95 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C179 +ENCODING 49529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C17A +ENCODING 49530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C17B +ENCODING 49531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C17C +ENCODING 49532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C17D +ENCODING 49533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C17E +ENCODING 49534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C17F +ENCODING 49535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C180 +ENCODING 49536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +2D +65 +9D +85 +00 +3F +41 +7F +ENDCHAR +STARTCHAR C181 +ENCODING 49537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +2D +65 +9D +85 +00 +21 +3F +3F +ENDCHAR +STARTCHAR C182 +ENCODING 49538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2D00 +6500 +9D00 +8500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C183 +ENCODING 49539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +2D +6D +95 +85 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C184 +ENCODING 49540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2D00 +6500 +9D00 +8500 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C185 +ENCODING 49541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +25 +2D +45 +6D +95 +95 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C186 +ENCODING 49542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +2D00 +6500 +9D00 +8500 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C187 +ENCODING 49543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6D00 +6D00 +9500 +0100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C188 +ENCODING 49544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +2D +65 +9D +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C189 +ENCODING 49545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C18A +ENCODING 49546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +2D +65 +9D +85 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C18B +ENCODING 49547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +6D +6D +95 +01 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C18C +ENCODING 49548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0400 +0C00 +0C00 +1200 +3100 +4480 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR C18D +ENCODING 49549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6580 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C18E +ENCODING 49550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6580 +0400 +FFC0 +0000 +3F00 +0880 +0880 +0880 +ENDCHAR +STARTCHAR C18F +ENCODING 49551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +3400 +4300 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C190 +ENCODING 49552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C191 +ENCODING 49553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C192 +ENCODING 49554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C193 +ENCODING 49555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +18 +34 +43 +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR C194 +ENCODING 49556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C195 +ENCODING 49557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C196 +ENCODING 49558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0400 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR C197 +ENCODING 49559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C198 +ENCODING 49560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C199 +ENCODING 49561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C19A +ENCODING 49562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C19B +ENCODING 49563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C19C +ENCODING 49564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6580 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C19D +ENCODING 49565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6580 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C19E +ENCODING 49566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C19F +ENCODING 49567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6580 +0400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C1A0 +ENCODING 49568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C1A1 +ENCODING 49569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6580 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C1A2 +ENCODING 49570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +18 +34 +43 +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR C1A3 +ENCODING 49571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR C1A4 +ENCODING 49572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +18 +34 +43 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C1A5 +ENCODING 49573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0400 +FFC0 +0000 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C1A6 +ENCODING 49574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +18 +34 +43 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C1A7 +ENCODING 49575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0400 +FFC0 +1E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C1A8 +ENCODING 49576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +1080 +1880 +2C80 +44C0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C1A9 +ENCODING 49577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +1080 +2880 +56C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C1AA +ENCODING 49578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +3F00 +0880 +0880 +ENDCHAR +STARTCHAR C1AB +ENCODING 49579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR C1AC +ENCODING 49580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +1080 +2C80 +4680 +10C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C1AD +ENCODING 49581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C1AE +ENCODING 49582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C1AF +ENCODING 49583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +3F80 +2000 +3F00 +ENDCHAR +STARTCHAR C1B0 +ENCODING 49584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +3880 +66C0 +1080 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C1B1 +ENCODING 49585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C1B2 +ENCODING 49586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C1B3 +ENCODING 49587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR C1B4 +ENCODING 49588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C1B5 +ENCODING 49589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR C1B6 +ENCODING 49590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C1B7 +ENCODING 49591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C1B8 +ENCODING 49592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR C1B9 +ENCODING 49593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR C1BA +ENCODING 49594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +0900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR C1BB +ENCODING 49595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +2100 +3100 +CD80 +2100 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR C1BC +ENCODING 49596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +1100 +1100 +2A80 +4400 +ENDCHAR +STARTCHAR C1BD +ENCODING 49597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +1080 +2C80 +56C0 +1080 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C1BE +ENCODING 49598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +1F00 +0300 +1F80 +2000 +ENDCHAR +STARTCHAR C1BF +ENCODING 49599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +0600 +0000 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR C1C0 +ENCODING 49600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +3F00 +1F80 +0080 +ENDCHAR +STARTCHAR C1C1 +ENCODING 49601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C1C2 +ENCODING 49602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1080 +1880 +66C0 +1080 +FE80 +0000 +3F80 +1100 +3F80 +ENDCHAR +STARTCHAR C1C3 +ENCODING 49603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1080 +3880 +54C0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR C1C4 +ENCODING 49604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +2280 +3280 +4A80 +4780 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C1C5 +ENCODING 49605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +9F +25 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C1C6 +ENCODING 49606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +9F +25 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C1C7 +ENCODING 49607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9F00 +2500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C1C8 +ENCODING 49608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +3280 +6A80 +4E80 +1380 +1280 +FE80 +0280 +1000 +1000 +1F80 +ENDCHAR +STARTCHAR C1C9 +ENCODING 49609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9F00 +2500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C1CA +ENCODING 49610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C1CB +ENCODING 49611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +65 +9F +25 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR C1CC +ENCODING 49612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +3280 +4F80 +1280 +FE80 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C1CD +ENCODING 49613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C1CE +ENCODING 49614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C1CF +ENCODING 49615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C1D0 +ENCODING 49616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR C1D1 +ENCODING 49617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C1D2 +ENCODING 49618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C1D3 +ENCODING 49619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR C1D4 +ENCODING 49620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +3280 +6A80 +4F80 +1280 +FE80 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR C1D5 +ENCODING 49621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +65 +9F +25 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR C1D6 +ENCODING 49622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9F00 +2500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C1D7 +ENCODING 49623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +3280 +6A80 +5F80 +1280 +FE80 +0080 +0400 +0400 +1B00 +2080 +ENDCHAR +STARTCHAR C1D8 +ENCODING 49624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1280 +3280 +6A80 +4F80 +1280 +FE80 +0000 +1100 +1100 +1A80 +2640 +ENDCHAR +STARTCHAR C1D9 +ENCODING 49625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +9F +25 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR C1DA +ENCODING 49626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9F00 +2500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C1DB +ENCODING 49627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +0E00 +1E00 +0100 +0F00 +30C0 +ENDCHAR +STARTCHAR C1DC +ENCODING 49628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +9F +25 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C1DD +ENCODING 49629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C1DE +ENCODING 49630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +65 +9F +25 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR C1DF +ENCODING 49631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1280 +3280 +4B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR C1E0 +ENCODING 49632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1080 +1880 +2480 +4280 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C1E1 +ENCODING 49633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C1E2 +ENCODING 49634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C1E3 +ENCODING 49635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C1E4 +ENCODING 49636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +59 +8D +21 +21 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR C1E5 +ENCODING 49637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C1E6 +ENCODING 49638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C1E7 +ENCODING 49639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +21 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR C1E8 +ENCODING 49640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +31 +CD +21 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C1E9 +ENCODING 49641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C1EA +ENCODING 49642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C1EB +ENCODING 49643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C1EC +ENCODING 49644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C1ED +ENCODING 49645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C1EE +ENCODING 49646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C1EF +ENCODING 49647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C1F0 +ENCODING 49648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +31 +59 +AD +21 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C1F1 +ENCODING 49649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +59 +AD +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C1F2 +ENCODING 49650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C1F3 +ENCODING 49651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +31 +59 +AD +21 +FF +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR C1F4 +ENCODING 49652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C1F5 +ENCODING 49653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C1F6 +ENCODING 49654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +3100 +CD00 +2100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C1F7 +ENCODING 49655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +7100 +8900 +2100 +FD00 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR C1F8 +ENCODING 49656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +21 +FD +00 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C1F9 +ENCODING 49657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C1FA +ENCODING 49658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +21 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR C1FB +ENCODING 49659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +71 +89 +21 +FD +0C +33 +0C +32 +1E +ENDCHAR +STARTCHAR C1FC +ENCODING 49660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0400 +0C00 +0C00 +1A00 +3100 +4080 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR C1FD +ENCODING 49661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +7380 +1200 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C1FE +ENCODING 49662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR C1FF +ENCODING 49663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1800 +3400 +4300 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C200 +ENCODING 49664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C201 +ENCODING 49665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C202 +ENCODING 49666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C203 +ENCODING 49667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +18 +34 +43 +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR C204 +ENCODING 49668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +7380 +1200 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C205 +ENCODING 49669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C206 +ENCODING 49670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C207 +ENCODING 49671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C208 +ENCODING 49672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C209 +ENCODING 49673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C20A +ENCODING 49674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C20B +ENCODING 49675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C20C +ENCODING 49676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +7380 +1200 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C20D +ENCODING 49677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +7380 +1200 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C20E +ENCODING 49678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C20F +ENCODING 49679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +7380 +1200 +FFC0 +0000 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR C210 +ENCODING 49680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +18 +34 +43 +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C211 +ENCODING 49681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +7380 +1200 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C212 +ENCODING 49682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +18 +34 +43 +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR C213 +ENCODING 49683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR C214 +ENCODING 49684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +18 +34 +43 +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C215 +ENCODING 49685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C216 +ENCODING 49686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 0 +BITMAP +18 +34 +43 +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C217 +ENCODING 49687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +1200 +FFC0 +1E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C218 +ENCODING 49688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0C00 +0E00 +3300 +4080 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR C219 +ENCODING 49689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C21A +ENCODING 49690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C21B +ENCODING 49691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C21C +ENCODING 49692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR C21D +ENCODING 49693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C21E +ENCODING 49694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR C21F +ENCODING 49695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0400 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C220 +ENCODING 49696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C221 +ENCODING 49697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C222 +ENCODING 49698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C223 +ENCODING 49699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C224 +ENCODING 49700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C225 +ENCODING 49701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C226 +ENCODING 49702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C227 +ENCODING 49703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR C228 +ENCODING 49704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C229 +ENCODING 49705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0400 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C22A +ENCODING 49706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C22B +ENCODING 49707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0000 +FFC0 +0400 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C22C +ENCODING 49708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C22D +ENCODING 49709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C22E +ENCODING 49710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +08 +18 +34 +C3 +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR C22F +ENCODING 49711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0000 +FFC0 +0400 +1E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR C230 +ENCODING 49712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C231 +ENCODING 49713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0000 +FFC0 +0400 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C232 +ENCODING 49714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0000 +FFC0 +0400 +3F80 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR C233 +ENCODING 49715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +F7 +08 +3C +66 +18 +26 +3C +ENDCHAR +STARTCHAR C234 +ENCODING 49716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1080 +2880 +4680 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR C235 +ENCODING 49717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C236 +ENCODING 49718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C237 +ENCODING 49719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C238 +ENCODING 49720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +11 +31 +49 +81 +FD +27 +21 +40 +7E +ENDCHAR +STARTCHAR C239 +ENCODING 49721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C23A +ENCODING 49722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C23B +ENCODING 49723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +DD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR C23C +ENCODING 49724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR C23D +ENCODING 49725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C23E +ENCODING 49726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C23F +ENCODING 49727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C240 +ENCODING 49728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C241 +ENCODING 49729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C242 +ENCODING 49730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C243 +ENCODING 49731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR C244 +ENCODING 49732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +DD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR C245 +ENCODING 49733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +DD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR C246 +ENCODING 49734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C247 +ENCODING 49735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +DD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR C248 +ENCODING 49736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +3700 +4900 +8D00 +0100 +FD00 +2100 +2200 +2200 +5500 +C880 +ENDCHAR +STARTCHAR C249 +ENCODING 49737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C24A +ENCODING 49738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +3100 +CD00 +DD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C24B +ENCODING 49739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +3900 +C500 +DD00 +2300 +2D00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR C24C +ENCODING 49740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +DD +27 +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C24D +ENCODING 49741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C24E +ENCODING 49742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +DD +27 +21 +3F +12 +3F +ENDCHAR +STARTCHAR C24F +ENCODING 49743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +DD +23 +2D +33 +0C +32 +1E +ENDCHAR +STARTCHAR C250 +ENCODING 49744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +3280 +3A80 +4A80 +0280 +FE80 +1280 +1E80 +1280 +1280 +0280 +ENDCHAR +STARTCHAR C251 +ENCODING 49745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +1680 +2A80 +4A80 +0280 +FE80 +1280 +1000 +3F80 +0080 +0080 +ENDCHAR +STARTCHAR C252 +ENCODING 49746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +32 +09 +09 +09 +ENDCHAR +STARTCHAR C253 +ENCODING 49747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9500 +1D00 +E500 +2900 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C254 +ENCODING 49748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +1280 +2A80 +4A80 +0280 +FE80 +1280 +1680 +2280 +2000 +3F80 +ENDCHAR +STARTCHAR C255 +ENCODING 49749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9500 +1D00 +E500 +2900 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C256 +ENCODING 49750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1100 +2280 +2100 +2280 +1900 +ENDCHAR +STARTCHAR C257 +ENCODING 49751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +3F +40 +7F +ENDCHAR +STARTCHAR C258 +ENCODING 49752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +3680 +4A80 +0280 +FE80 +1000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR C259 +ENCODING 49753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +3F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C25A +ENCODING 49754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +3B80 +1E80 +2280 +1B80 +ENDCHAR +STARTCHAR C25B +ENCODING 49755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +3A80 +1B80 +2280 +1B80 +ENDCHAR +STARTCHAR C25C +ENCODING 49756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +2900 +3900 +2280 +3840 +ENDCHAR +STARTCHAR C25D +ENCODING 49757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +3B80 +1B80 +2200 +1B80 +ENDCHAR +STARTCHAR C25E +ENCODING 49758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C25F +ENCODING 49759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +3900 +1B80 +2280 +3900 +ENDCHAR +STARTCHAR C260 +ENCODING 49760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +1680 +2A80 +4A80 +0280 +FE80 +1000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR C261 +ENCODING 49761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +41 +7F +7F +ENDCHAR +STARTCHAR C262 +ENCODING 49762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +42 +72 +55 +70 +ENDCHAR +STARTCHAR C263 +ENCODING 49763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +08 +0C +32 +41 +ENDCHAR +STARTCHAR C264 +ENCODING 49764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +02 +22 +55 +08 +ENDCHAR +STARTCHAR C265 +ENCODING 49765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1280 +1680 +2A80 +4A80 +0280 +FE80 +1000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C266 +ENCODING 49766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2500 +6500 +9500 +1D00 +E500 +2900 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C267 +ENCODING 49767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR C268 +ENCODING 49768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +3F +01 +3F +01 +ENDCHAR +STARTCHAR C269 +ENCODING 49769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C26A +ENCODING 49770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +25 +65 +95 +1D +E5 +29 +3F +12 +3F +ENDCHAR +STARTCHAR C26B +ENCODING 49771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +1280 +2A80 +4280 +FE80 +1680 +1E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR C26C +ENCODING 49772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0880 +1080 +1880 +2480 +4280 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR C26D +ENCODING 49773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +79 +8D +01 +FD +21 +20 +7F +01 +01 +ENDCHAR +STARTCHAR C26E +ENCODING 49774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C26F +ENCODING 49775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C270 +ENCODING 49776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +59 +85 +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR C271 +ENCODING 49777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C272 +ENCODING 49778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C273 +ENCODING 49779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR C274 +ENCODING 49780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +CD +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C275 +ENCODING 49781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C276 +ENCODING 49782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C277 +ENCODING 49783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C278 +ENCODING 49784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C279 +ENCODING 49785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C27A +ENCODING 49786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C27B +ENCODING 49787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR C27C +ENCODING 49788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +49 +85 +01 +FD +21 +20 +7F +41 +7F +ENDCHAR +STARTCHAR C27D +ENCODING 49789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +CD +01 +FD +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C27E +ENCODING 49790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C27F +ENCODING 49791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +1100 +3100 +7900 +8500 +0100 +FD00 +2100 +2800 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR C280 +ENCODING 49792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C281 +ENCODING 49793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +11 +31 +49 +85 +01 +FD +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR C282 +ENCODING 49794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +3100 +CD00 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C283 +ENCODING 49795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +3900 +C500 +1D00 +E100 +2C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR C284 +ENCODING 49796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C285 +ENCODING 49797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C286 +ENCODING 49798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR C287 +ENCODING 49799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +39 +C5 +1D +E1 +2C +33 +0C +32 +1E +ENDCHAR +STARTCHAR C288 +ENCODING 49800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0C00 +0A00 +3300 +4080 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR C289 +ENCODING 49801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +1200 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C28A +ENCODING 49802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C28B +ENCODING 49803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C28C +ENCODING 49804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0400 +0A00 +3180 +0000 +FFC0 +1200 +3200 +2000 +3F00 +ENDCHAR +STARTCHAR C28D +ENCODING 49805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C28E +ENCODING 49806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR C28F +ENCODING 49807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C290 +ENCODING 49808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1E00 +6180 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C291 +ENCODING 49809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C292 +ENCODING 49810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C293 +ENCODING 49811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C294 +ENCODING 49812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C295 +ENCODING 49813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C296 +ENCODING 49814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C297 +ENCODING 49815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR C298 +ENCODING 49816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C299 +ENCODING 49817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C29A +ENCODING 49818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C29B +ENCODING 49819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0000 +FFC0 +1100 +1500 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C29C +ENCODING 49820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C29D +ENCODING 49821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C29E +ENCODING 49822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C29F +ENCODING 49823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C2A0 +ENCODING 49824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C2A1 +ENCODING 49825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +18 +26 +C1 +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR C2A2 +ENCODING 49826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0400 +0C00 +1A00 +6180 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C2A3 +ENCODING 49827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +26 +C1 +00 +FF +3E +66 +18 +26 +3C +ENDCHAR +STARTCHAR C2A4 +ENCODING 49828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0400 +0C00 +0C00 +1200 +3100 +4080 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C2A5 +ENCODING 49829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C2A6 +ENCODING 49830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C2A7 +ENCODING 49831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C2A8 +ENCODING 49832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C2A9 +ENCODING 49833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C2AA +ENCODING 49834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C2AB +ENCODING 49835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C2AC +ENCODING 49836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1A00 +6180 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C2AD +ENCODING 49837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +1A00 +6180 +0000 +FFC0 +0000 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C2AE +ENCODING 49838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR C2AF +ENCODING 49839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR C2B0 +ENCODING 49840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C2B1 +ENCODING 49841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR C2B2 +ENCODING 49842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR C2B3 +ENCODING 49843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR C2B4 +ENCODING 49844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C2B5 +ENCODING 49845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C2B6 +ENCODING 49846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C2B7 +ENCODING 49847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1200 +6180 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C2B8 +ENCODING 49848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR C2B9 +ENCODING 49849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0400 +0C00 +1300 +6180 +0000 +FFC0 +0000 +1F00 +2100 +2100 +1F00 +ENDCHAR +STARTCHAR C2BA +ENCODING 49850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C2BB +ENCODING 49851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +1C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C2BC +ENCODING 49852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR C2BD +ENCODING 49853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +18 +24 +C3 +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR C2BE +ENCODING 49854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0C00 +1A00 +2180 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C2BF +ENCODING 49855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +08 +18 +24 +C3 +00 +FF +3C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C2C0 +ENCODING 49856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +31 +49 +81 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR C2C1 +ENCODING 49857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C2C2 +ENCODING 49858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C2C3 +ENCODING 49859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C2C4 +ENCODING 49860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +49 +81 +05 +F9 +01 +40 +7E +ENDCHAR +STARTCHAR C2C5 +ENCODING 49861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C2C6 +ENCODING 49862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C2C7 +ENCODING 49863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FF +01 +3F +40 +7E +ENDCHAR +STARTCHAR C2C8 +ENCODING 49864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +3F00 +0080 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR C2C9 +ENCODING 49865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +0000 +1B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C2CA +ENCODING 49866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +0000 +3F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR C2CB +ENCODING 49867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +3000 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR C2CC +ENCODING 49868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C2CD +ENCODING 49869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +3100 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR C2CE +ENCODING 49870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C2CF +ENCODING 49871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +3380 +0F80 +3B00 +2480 +3B00 +ENDCHAR +STARTCHAR C2D0 +ENCODING 49872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FF +01 +7F +41 +7F +ENDCHAR +STARTCHAR C2D1 +ENCODING 49873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FF +01 +41 +7F +7F +ENDCHAR +STARTCHAR C2D2 +ENCODING 49874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C2D3 +ENCODING 49875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR C2D4 +ENCODING 49876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C2D5 +ENCODING 49877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C2D6 +ENCODING 49878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +3100 +CD00 +0100 +FF00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C2D7 +ENCODING 49879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +0600 +0000 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR C2D8 +ENCODING 49880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +31 +CD +01 +FF +01 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C2D9 +ENCODING 49881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +0F00 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR C2DA +ENCODING 49882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +31 +CD +01 +FF +01 +3F +12 +3F +ENDCHAR +STARTCHAR C2DB +ENCODING 49883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +1080 +3880 +4480 +0080 +FE80 +0600 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR C2DC +ENCODING 49884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +21 +21 +51 +C9 +89 +01 +01 +01 +ENDCHAR +STARTCHAR C2DD +ENCODING 49885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C2DE +ENCODING 49886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +21 +51 +89 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C2DF +ENCODING 49887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +2100 +5100 +8900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C2E0 +ENCODING 49888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR C2E1 +ENCODING 49889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +21 +51 +89 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C2E2 +ENCODING 49890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C2E3 +ENCODING 49891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR C2E4 +ENCODING 49892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +D1 +89 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C2E5 +ENCODING 49893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C2E6 +ENCODING 49894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C2E7 +ENCODING 49895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C2E8 +ENCODING 49896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C2E9 +ENCODING 49897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C2EA +ENCODING 49898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C2EB +ENCODING 49899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +2100 +5100 +D100 +8900 +0000 +7700 +1000 +7F80 +4500 +7F00 +ENDCHAR +STARTCHAR C2EC +ENCODING 49900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C2ED +ENCODING 49901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C2EE +ENCODING 49902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +2100 +5100 +8900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C2EF +ENCODING 49903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +01 +08 +14 +36 +41 +ENDCHAR +STARTCHAR C2F0 +ENCODING 49904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +2100 +5100 +8900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C2F1 +ENCODING 49905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C2F2 +ENCODING 49906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +2100 +5100 +8900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C2F3 +ENCODING 49907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +2100 +2100 +5100 +8900 +0100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C2F4 +ENCODING 49908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +21 +51 +89 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C2F5 +ENCODING 49909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C2F6 +ENCODING 49910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +21 +21 +51 +D9 +89 +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR C2F7 +ENCODING 49911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +21 +51 +89 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C2F8 +ENCODING 49912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2880 +2880 +5CC0 +5280 +9280 +1080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C2F9 +ENCODING 49913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2C80 +5CC0 +9280 +1080 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C2FA +ENCODING 49914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C2FB +ENCODING 49915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2C80 +5CC0 +9280 +1080 +0000 +3900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C2FC +ENCODING 49916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2880 +5CC0 +9280 +1080 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C2FD +ENCODING 49917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4900 +D980 +B500 +2100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C2FE +ENCODING 49918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C2FF +ENCODING 49919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C300 +ENCODING 49920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2880 +5CC0 +9A80 +1080 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C301 +ENCODING 49921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C302 +ENCODING 49922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3B00 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C303 +ENCODING 49923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3400 +0C80 +3F80 +4480 +3F00 +ENDCHAR +STARTCHAR C304 +ENCODING 49924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C305 +ENCODING 49925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C306 +ENCODING 49926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C307 +ENCODING 49927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3B00 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C308 +ENCODING 49928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2C80 +5CC0 +9280 +1080 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C309 +ENCODING 49929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2880 +5CC0 +9280 +1080 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C30A +ENCODING 49930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C30B +ENCODING 49931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR C30C +ENCODING 49932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2C80 +5EC0 +9280 +1080 +0000 +1100 +1100 +2A80 +4440 +ENDCHAR +STARTCHAR C30D +ENCODING 49933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2C80 +5EC0 +9280 +1080 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C30E +ENCODING 49934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C30F +ENCODING 49935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR C310 +ENCODING 49936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C311 +ENCODING 49937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +2880 +5CC0 +9280 +0000 +3F80 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C312 +ENCODING 49938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4900 +D980 +B500 +2100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C313 +ENCODING 49939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +5CC0 +9A80 +1080 +0080 +0E00 +0000 +3F80 +1100 +0E00 +ENDCHAR +STARTCHAR C314 +ENCODING 49940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +2980 +2980 +6980 +5580 +9580 +2180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR C315 +ENCODING 49941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +2980 +5580 +9580 +2180 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C316 +ENCODING 49942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +55 +D3 +AD +45 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C317 +ENCODING 49943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5500 +D300 +AD00 +4500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C318 +ENCODING 49944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2980 +2980 +2980 +5980 +9580 +2180 +0180 +1180 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR C319 +ENCODING 49945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5500 +D300 +AD00 +4500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C31A +ENCODING 49946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C31B +ENCODING 49947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +55 +D3 +AD +45 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C31C +ENCODING 49948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +7980 +9580 +2180 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C31D +ENCODING 49949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR C31E +ENCODING 49950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C31F +ENCODING 49951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C320 +ENCODING 49952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C321 +ENCODING 49953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C322 +ENCODING 49954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C323 +ENCODING 49955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR C324 +ENCODING 49956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +2980 +5980 +9580 +2180 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR C325 +ENCODING 49957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +2980 +6980 +9580 +2180 +0000 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR C326 +ENCODING 49958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5500 +D300 +AD00 +4500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C327 +ENCODING 49959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +55 +D3 +AD +45 +01 +08 +14 +63 +ENDCHAR +STARTCHAR C328 +ENCODING 49960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2980 +2980 +2980 +6980 +9580 +2180 +0000 +0900 +1900 +1A80 +2640 +ENDCHAR +STARTCHAR C329 +ENCODING 49961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +2980 +5580 +9580 +2180 +0000 +1F00 +1080 +1080 +1F00 +ENDCHAR +STARTCHAR C32A +ENCODING 49962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5500 +D300 +AD00 +4500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C32B +ENCODING 49963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR C32C +ENCODING 49964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +55 +D3 +AD +45 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C32D +ENCODING 49965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C32E +ENCODING 49966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +55 +D3 +AD +45 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C32F +ENCODING 49967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +6980 +9680 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C330 +ENCODING 49968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +4900 +5180 +5100 +B900 +A580 +2100 +0100 +0100 +ENDCHAR +STARTCHAR C331 +ENCODING 49969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR C332 +ENCODING 49970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C333 +ENCODING 49971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C334 +ENCODING 49972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +2480 +24C0 +2880 +5C80 +92C0 +0080 +2000 +2000 +3F00 +ENDCHAR +STARTCHAR C335 +ENCODING 49973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C336 +ENCODING 49974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C337 +ENCODING 49975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C338 +ENCODING 49976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3F00 +0080 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C339 +ENCODING 49977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C33A +ENCODING 49978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3B00 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C33B +ENCODING 49979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3400 +0C80 +3F80 +4480 +3F00 +ENDCHAR +STARTCHAR C33C +ENCODING 49980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C33D +ENCODING 49981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C33E +ENCODING 49982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C33F +ENCODING 49983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3B00 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C340 +ENCODING 49984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR C341 +ENCODING 49985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR C342 +ENCODING 49986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C343 +ENCODING 49987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR C344 +ENCODING 49988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR C345 +ENCODING 49989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +28C0 +5C80 +92C0 +1080 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C346 +ENCODING 49990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C347 +ENCODING 49991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR C348 +ENCODING 49992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C349 +ENCODING 49993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +3F80 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C34A +ENCODING 49994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +4900 +4980 +D900 +B580 +2100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C34B +ENCODING 49995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +28C0 +5C80 +92C0 +0000 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR C34C +ENCODING 49996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2A80 +2B80 +2A80 +6A80 +9580 +2280 +0280 +0280 +0080 +ENDCHAR +STARTCHAR C34D +ENCODING 49997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C34E +ENCODING 49998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C34F +ENCODING 49999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5300 +D500 +AB00 +4500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C350 +ENCODING 50000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +2B80 +2A80 +5A80 +9780 +0280 +0080 +1000 +1F80 +ENDCHAR +STARTCHAR C351 +ENCODING 50001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5300 +D500 +AB00 +4500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C352 +ENCODING 50002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C353 +ENCODING 50003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C354 +ENCODING 50004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C355 +ENCODING 50005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR C356 +ENCODING 50006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C357 +ENCODING 50007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C358 +ENCODING 50008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C359 +ENCODING 50009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C35A +ENCODING 50010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C35B +ENCODING 50011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR C35C +ENCODING 50012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +3F +41 +7F +ENDCHAR +STARTCHAR C35D +ENCODING 50013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +21 +3F +3F +ENDCHAR +STARTCHAR C35E +ENCODING 50014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5300 +D500 +AB00 +4500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C35F +ENCODING 50015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +53 +D5 +AB +45 +01 +08 +14 +63 +ENDCHAR +STARTCHAR C360 +ENCODING 50016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5300 +D500 +AB00 +4500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C361 +ENCODING 50017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +53 +D5 +AB +45 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR C362 +ENCODING 50018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +5300 +D500 +AB00 +4500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C363 +ENCODING 50019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR C364 +ENCODING 50020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C365 +ENCODING 50021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C366 +ENCODING 50022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +53 +D5 +AB +45 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C367 +ENCODING 50023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +2980 +6A80 +9580 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C368 +ENCODING 50024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +2B80 +5C80 +5A80 +9280 +1080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C369 +ENCODING 50025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2F80 +5E80 +9280 +1080 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C36A +ENCODING 50026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4F +D9 +B5 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C36B +ENCODING 50027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4F00 +D900 +B500 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C36C +ENCODING 50028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2F80 +5C80 +9280 +1080 +0080 +2080 +2000 +2000 +1F80 +ENDCHAR +STARTCHAR C36D +ENCODING 50029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4F +D9 +B5 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C36E +ENCODING 50030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +0380 +2780 +2380 +2480 +1B00 +ENDCHAR +STARTCHAR C36F +ENCODING 50031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4F +D9 +B5 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C370 +ENCODING 50032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2780 +5C80 +9A80 +1080 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C371 +ENCODING 50033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +3B80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C372 +ENCODING 50034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2780 +5C80 +DA80 +1080 +0000 +3B80 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C373 +ENCODING 50035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +3880 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR C374 +ENCODING 50036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C375 +ENCODING 50037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +3B80 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR C376 +ENCODING 50038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C377 +ENCODING 50039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +3B80 +0F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR C378 +ENCODING 50040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2780 +5E80 +9280 +1080 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR C379 +ENCODING 50041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2780 +5E80 +9280 +1080 +0000 +2080 +1F80 +2080 +1F80 +ENDCHAR +STARTCHAR C37A +ENCODING 50042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4F00 +D900 +B500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C37B +ENCODING 50043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4F +D9 +B5 +21 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C37C +ENCODING 50044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +2780 +5E80 +9280 +1080 +0000 +0900 +1900 +1A80 +2640 +ENDCHAR +STARTCHAR C37D +ENCODING 50045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2780 +5C80 +9280 +1080 +0000 +0F00 +1080 +1080 +0F00 +ENDCHAR +STARTCHAR C37E +ENCODING 50046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4F00 +D900 +B500 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C37F +ENCODING 50047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +0E00 +1E00 +0100 +0F00 +30C0 +ENDCHAR +STARTCHAR C380 +ENCODING 50048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4F +D9 +B5 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C381 +ENCODING 50049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +1F80 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR C382 +ENCODING 50050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4F +D9 +B5 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C383 +ENCODING 50051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2780 +5C80 +9280 +0080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C384 +ENCODING 50052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +2980 +2F80 +6980 +5580 +9580 +2180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR C385 +ENCODING 50053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C386 +ENCODING 50054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C387 +ENCODING 50055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5700 +D300 +AB00 +4300 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C388 +ENCODING 50056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2980 +2980 +2F80 +7980 +9580 +2180 +0180 +1180 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR C389 +ENCODING 50057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5700 +D300 +AB00 +4300 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C38A +ENCODING 50058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C38B +ENCODING 50059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C38C +ENCODING 50060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2F80 +6980 +9580 +2180 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C38D +ENCODING 50061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR C38E +ENCODING 50062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C38F +ENCODING 50063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C390 +ENCODING 50064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C391 +ENCODING 50065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C392 +ENCODING 50066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C393 +ENCODING 50067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR C394 +ENCODING 50068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +3F +41 +7F +ENDCHAR +STARTCHAR C395 +ENCODING 50069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +21 +3F +3F +ENDCHAR +STARTCHAR C396 +ENCODING 50070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5700 +D300 +AB00 +4300 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C397 +ENCODING 50071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +53 +D7 +AB +43 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C398 +ENCODING 50072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5700 +D300 +AB00 +4300 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C399 +ENCODING 50073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +53 +D7 +AB +43 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR C39A +ENCODING 50074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5700 +D300 +AB00 +4300 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C39B +ENCODING 50075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR C39C +ENCODING 50076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C39D +ENCODING 50077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C39E +ENCODING 50078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +57 +D3 +AB +43 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C39F +ENCODING 50079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2A80 +6980 +9580 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C3A0 +ENCODING 50080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4B +49 +51 +BF +A5 +21 +01 +01 +01 +ENDCHAR +STARTCHAR C3A1 +ENCODING 50081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR C3A2 +ENCODING 50082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C3A3 +ENCODING 50083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4B00 +DB00 +B500 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C3A4 +ENCODING 50084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4B +5B +B9 +25 +01 +00 +20 +3F +ENDCHAR +STARTCHAR C3A5 +ENCODING 50085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4B +DB +B5 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C3A6 +ENCODING 50086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +0380 +2780 +2380 +2480 +1B00 +ENDCHAR +STARTCHAR C3A7 +ENCODING 50087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C3A8 +ENCODING 50088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C3A9 +ENCODING 50089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3B80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C3AA +ENCODING 50090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3B80 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C3AB +ENCODING 50091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3880 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR C3AC +ENCODING 50092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C3AD +ENCODING 50093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3B80 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR C3AE +ENCODING 50094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C3AF +ENCODING 50095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +3B80 +0F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR C3B0 +ENCODING 50096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +7F +41 +7F +ENDCHAR +STARTCHAR C3B1 +ENCODING 50097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4B +DB +B5 +21 +01 +41 +7F +7F +ENDCHAR +STARTCHAR C3B2 +ENCODING 50098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4B00 +DB00 +B500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C3B3 +ENCODING 50099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C3B4 +ENCODING 50100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4B00 +DB00 +B500 +2100 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C3B5 +ENCODING 50101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4B +DB +B5 +21 +0C +32 +41 +23 +1C +ENDCHAR +STARTCHAR C3B6 +ENCODING 50102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4B00 +DB00 +B500 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C3B7 +ENCODING 50103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +0E00 +1E00 +0100 +0F00 +30C0 +ENDCHAR +STARTCHAR C3B8 +ENCODING 50104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C3B9 +ENCODING 50105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +1F80 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR C3BA +ENCODING 50106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +4B +DB +B5 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C3BB +ENCODING 50107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2580 +2480 +5F80 +9280 +0080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C3BC +ENCODING 50108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2980 +2A80 +2980 +6A80 +9580 +2180 +0180 +0180 +0080 +ENDCHAR +STARTCHAR C3BD +ENCODING 50109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +5D +DD +AB +43 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C3BE +ENCODING 50110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +5D +DD +AB +43 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C3BF +ENCODING 50111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5D00 +DD00 +AB00 +4300 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C3C0 +ENCODING 50112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2980 +2B80 +2980 +6B80 +5580 +9580 +2180 +0180 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR C3C1 +ENCODING 50113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5D00 +DD00 +AB00 +4300 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C3C2 +ENCODING 50114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C3C3 +ENCODING 50115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +5D +DD +AB +43 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C3C4 +ENCODING 50116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C3C5 +ENCODING 50117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR C3C6 +ENCODING 50118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C3C7 +ENCODING 50119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C3C8 +ENCODING 50120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C3C9 +ENCODING 50121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C3CA +ENCODING 50122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C3CB +ENCODING 50123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR C3CC +ENCODING 50124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +5D +DD +AB +43 +00 +3F +41 +7F +ENDCHAR +STARTCHAR C3CD +ENCODING 50125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +5D +DD +AB +43 +00 +21 +3F +3F +ENDCHAR +STARTCHAR C3CE +ENCODING 50126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5D00 +DD00 +AB00 +4300 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C3CF +ENCODING 50127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +5D +D7 +AB +43 +01 +08 +14 +63 +ENDCHAR +STARTCHAR C3D0 +ENCODING 50128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5D00 +DD00 +AB00 +4300 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C3D1 +ENCODING 50129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +5D +D7 +AB +43 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR C3D2 +ENCODING 50130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5300 +5D00 +DD00 +AB00 +4300 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C3D3 +ENCODING 50131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR C3D4 +ENCODING 50132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +53 +5D +DD +AB +43 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C3D5 +ENCODING 50133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C3D6 +ENCODING 50134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +53 +5D +DD +AB +43 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C3D7 +ENCODING 50135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2980 +2B80 +6A80 +9580 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C3D8 +ENCODING 50136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1100 +1200 +1300 +2B00 +6480 +4840 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR C3D9 +ENCODING 50137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D00 +4880 +0400 +0400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR C3DA +ENCODING 50138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR C3DB +ENCODING 50139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +2400 +5600 +9900 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C3DC +ENCODING 50140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +48C0 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C3DD +ENCODING 50141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C3DE +ENCODING 50142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C3DF +ENCODING 50143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +4880 +0400 +FFC0 +0000 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C3E0 +ENCODING 50144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +3300 +4C80 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C3E1 +ENCODING 50145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C3E2 +ENCODING 50146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +2B00 +4C80 +0400 +FFC0 +0000 +7B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR C3E3 +ENCODING 50147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C3E4 +ENCODING 50148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C3E5 +ENCODING 50149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C3E6 +ENCODING 50150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C3E7 +ENCODING 50151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C3E8 +ENCODING 50152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D00 +4880 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C3E9 +ENCODING 50153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D00 +4880 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C3EA +ENCODING 50154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C3EB +ENCODING 50155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR C3EC +ENCODING 50156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C3ED +ENCODING 50157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D00 +4880 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C3EE +ENCODING 50158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR C3EF +ENCODING 50159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR C3F0 +ENCODING 50160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +20 +24 +56 +99 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C3F1 +ENCODING 50161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C3F2 +ENCODING 50162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +24 +56 +99 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C3F3 +ENCODING 50163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C3F4 +ENCODING 50164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2480 +5C80 +8A80 +10C0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C3F5 +ENCODING 50165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2880 +5C80 +92C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C3F6 +ENCODING 50166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C3F7 +ENCODING 50167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C3F8 +ENCODING 50168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2880 +5C80 +9280 +10C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C3F9 +ENCODING 50169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C3FA +ENCODING 50170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C3FB +ENCODING 50171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR C3FC +ENCODING 50172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +1F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C3FD +ENCODING 50173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C3FE +ENCODING 50174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C3FF +ENCODING 50175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR C400 +ENCODING 50176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C401 +ENCODING 50177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR C402 +ENCODING 50178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C403 +ENCODING 50179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C404 +ENCODING 50180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR C405 +ENCODING 50181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR C406 +ENCODING 50182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR C407 +ENCODING 50183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR C408 +ENCODING 50184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2480 +2880 +5C80 +92C0 +1080 +FE80 +0000 +1100 +1100 +2B80 +4480 +ENDCHAR +STARTCHAR C409 +ENCODING 50185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR C40A +ENCODING 50186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR C40B +ENCODING 50187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR C40C +ENCODING 50188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR C40D +ENCODING 50189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C40E +ENCODING 50190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +5100 +5900 +A580 +2100 +2D00 +D000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR C40F +ENCODING 50191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2480 +7C80 +12C0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR C410 +ENCODING 50192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2A80 +2A80 +7A80 +9680 +2180 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C411 +ENCODING 50193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C412 +ENCODING 50194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR C413 +ENCODING 50195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR C414 +ENCODING 50196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +55 +55 +AD +07 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR C415 +ENCODING 50197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR C416 +ENCODING 50198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C417 +ENCODING 50199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR C418 +ENCODING 50200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR C419 +ENCODING 50201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR C41A +ENCODING 50202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR C41B +ENCODING 50203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C41C +ENCODING 50204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR C41D +ENCODING 50205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C41E +ENCODING 50206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C41F +ENCODING 50207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +D500 +2F00 +2500 +FD00 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR C420 +ENCODING 50208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR C421 +ENCODING 50209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1080 +1F80 +1F80 +ENDCHAR +STARTCHAR C422 +ENCODING 50210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +2900 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR C423 +ENCODING 50211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR C424 +ENCODING 50212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +2A80 +6A80 +D680 +2180 +1280 +FE80 +0000 +1100 +1100 +3A80 +6440 +ENDCHAR +STARTCHAR C425 +ENCODING 50213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0400 +1B80 +2080 +1180 +0E00 +ENDCHAR +STARTCHAR C426 +ENCODING 50214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR C427 +ENCODING 50215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5500 +D500 +2F00 +2500 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C428 +ENCODING 50216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR C429 +ENCODING 50217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C42A +ENCODING 50218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9780 +1280 +7E80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR C42B +ENCODING 50219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +55 +D5 +2F +25 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C42C +ENCODING 50220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +7680 +4B80 +1080 +0880 +0880 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C42D +ENCODING 50221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C42E +ENCODING 50222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C42F +ENCODING 50223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5100 +5900 +A500 +0100 +3D00 +C100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C430 +ENCODING 50224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +49 +79 +99 +A5 +11 +11 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR C431 +ENCODING 50225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C432 +ENCODING 50226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C433 +ENCODING 50227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +3F +40 +7E +ENDCHAR +STARTCHAR C434 +ENCODING 50228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +49 +79 +A5 +11 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C435 +ENCODING 50229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C436 +ENCODING 50230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C437 +ENCODING 50231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C438 +ENCODING 50232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C439 +ENCODING 50233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C43A +ENCODING 50234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C43B +ENCODING 50235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C43C +ENCODING 50236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +49 +49 +B9 +A5 +11 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C43D +ENCODING 50237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +49 +69 +99 +A5 +11 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C43E +ENCODING 50238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C43F +ENCODING 50239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +08 +14 +63 +ENDCHAR +STARTCHAR C440 +ENCODING 50240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C441 +ENCODING 50241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C442 +ENCODING 50242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +5100 +5900 +A500 +0100 +3D00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C443 +ENCODING 50243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +F900 +2500 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C444 +ENCODING 50244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +7F +3F +01 +01 +ENDCHAR +STARTCHAR C445 +ENCODING 50245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C446 +ENCODING 50246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +51 +59 +A5 +01 +3D +C1 +7F +12 +3F +ENDCHAR +STARTCHAR C447 +ENCODING 50247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C448 +ENCODING 50248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1200 +1200 +2B00 +2480 +4840 +0000 +1100 +1100 +FFC0 +ENDCHAR +STARTCHAR C449 +ENCODING 50249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR C44A +ENCODING 50250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR C44B +ENCODING 50251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +2400 +5600 +9900 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C44C +ENCODING 50252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +24 +66 +99 +24 +24 +DB +40 +40 +7E +ENDCHAR +STARTCHAR C44D +ENCODING 50253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C44E +ENCODING 50254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C44F +ENCODING 50255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR C450 +ENCODING 50256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR C451 +ENCODING 50257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C452 +ENCODING 50258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C453 +ENCODING 50259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C454 +ENCODING 50260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C455 +ENCODING 50261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C456 +ENCODING 50262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C457 +ENCODING 50263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C458 +ENCODING 50264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR C459 +ENCODING 50265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +24 +56 +99 +24 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR C45A +ENCODING 50266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C45B +ENCODING 50267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR C45C +ENCODING 50268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C45D +ENCODING 50269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR C45E +ENCODING 50270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR C45F +ENCODING 50271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR C460 +ENCODING 50272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C461 +ENCODING 50273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C462 +ENCODING 50274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +20 +24 +56 +99 +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C463 +ENCODING 50275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1200 +2D00 +4880 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C464 +ENCODING 50276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1200 +1200 +2B00 +2C80 +4840 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR C465 +ENCODING 50277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C466 +ENCODING 50278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C467 +ENCODING 50279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C468 +ENCODING 50280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR C469 +ENCODING 50281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C46A +ENCODING 50282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR C46B +ENCODING 50283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C46C +ENCODING 50284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +3300 +4C80 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C46D +ENCODING 50285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C46E +ENCODING 50286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C46F +ENCODING 50287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C470 +ENCODING 50288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C471 +ENCODING 50289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C472 +ENCODING 50290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C473 +ENCODING 50291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR C474 +ENCODING 50292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C475 +ENCODING 50293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D00 +4880 +0000 +FFC0 +0400 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C476 +ENCODING 50294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C477 +ENCODING 50295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR C478 +ENCODING 50296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C479 +ENCODING 50297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C47A +ENCODING 50298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +2400 +5600 +8980 +0000 +FF00 +0800 +7E00 +0400 +7F00 +ENDCHAR +STARTCHAR C47B +ENCODING 50299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C47C +ENCODING 50300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C47D +ENCODING 50301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +24 +56 +99 +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR C47E +ENCODING 50302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C47F +ENCODING 50303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C480 +ENCODING 50304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +5A80 +1080 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR C481 +ENCODING 50305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C482 +ENCODING 50306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C483 +ENCODING 50307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C484 +ENCODING 50308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +69 +95 +21 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR C485 +ENCODING 50309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C486 +ENCODING 50310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C487 +ENCODING 50311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR C488 +ENCODING 50312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR C489 +ENCODING 50313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C48A +ENCODING 50314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C48B +ENCODING 50315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C48C +ENCODING 50316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C48D +ENCODING 50317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C48E +ENCODING 50318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C48F +ENCODING 50319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR C490 +ENCODING 50320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR C491 +ENCODING 50321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR C492 +ENCODING 50322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C493 +ENCODING 50323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR C494 +ENCODING 50324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +4900 +4F00 +B500 +A500 +0100 +FD00 +2000 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR C495 +ENCODING 50325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C496 +ENCODING 50326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +7900 +A500 +DD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C497 +ENCODING 50327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +F900 +2500 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C498 +ENCODING 50328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C499 +ENCODING 50329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C49A +ENCODING 50330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +DD +27 +21 +3F +12 +3F +ENDCHAR +STARTCHAR C49B +ENCODING 50331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR C49C +ENCODING 50332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2980 +2980 +6980 +9580 +2180 +0180 +FD80 +1180 +1680 +1180 +0180 +ENDCHAR +STARTCHAR C49D +ENCODING 50333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C49E +ENCODING 50334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR C49F +ENCODING 50335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR C4A0 +ENCODING 50336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +2A80 +5680 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR C4A1 +ENCODING 50337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR C4A2 +ENCODING 50338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR C4A3 +ENCODING 50339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR C4A4 +ENCODING 50340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR C4A5 +ENCODING 50341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C4A6 +ENCODING 50342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR C4A7 +ENCODING 50343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C4A8 +ENCODING 50344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C4A9 +ENCODING 50345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C4AA +ENCODING 50346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C4AB +ENCODING 50347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR C4AC +ENCODING 50348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR C4AD +ENCODING 50349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C4AE +ENCODING 50350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +2100 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR C4AF +ENCODING 50351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +0400 +0E00 +3180 +ENDCHAR +STARTCHAR C4B0 +ENCODING 50352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR C4B1 +ENCODING 50353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR C4B2 +ENCODING 50354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR C4B3 +ENCODING 50355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR C4B4 +ENCODING 50356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR C4B5 +ENCODING 50357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C4B6 +ENCODING 50358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2A80 +6A80 +9680 +0E80 +7280 +1480 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR C4B7 +ENCODING 50359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2A80 +6A80 +9680 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR C4B8 +ENCODING 50360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +5C80 +4A80 +1080 +0080 +FE80 +0880 +0880 +0880 +0880 +ENDCHAR +STARTCHAR C4B9 +ENCODING 50361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C4BA +ENCODING 50362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C4BB +ENCODING 50363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C4BC +ENCODING 50364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +49 +69 +95 +A5 +01 +FF +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR C4BD +ENCODING 50365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C4BE +ENCODING 50366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C4BF +ENCODING 50367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR C4C0 +ENCODING 50368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR C4C1 +ENCODING 50369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C4C2 +ENCODING 50370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C4C3 +ENCODING 50371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C4C4 +ENCODING 50372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C4C5 +ENCODING 50373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C4C6 +ENCODING 50374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C4C7 +ENCODING 50375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR C4C8 +ENCODING 50376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +7F +41 +7F +ENDCHAR +STARTCHAR C4C9 +ENCODING 50377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +41 +7F +7F +ENDCHAR +STARTCHAR C4CA +ENCODING 50378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C4CB +ENCODING 50379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR C4CC +ENCODING 50380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C4CD +ENCODING 50381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C4CE +ENCODING 50382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +7900 +A500 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C4CF +ENCODING 50383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +F900 +2500 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C4D0 +ENCODING 50384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C4D1 +ENCODING 50385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C4D2 +ENCODING 50386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +79 +A5 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR C4D3 +ENCODING 50387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C4D4 +ENCODING 50388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1200 +1300 +2C80 +4800 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR C4D5 +ENCODING 50389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR C4D6 +ENCODING 50390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C4D7 +ENCODING 50391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C4D8 +ENCODING 50392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +1200 +3300 +4C80 +0800 +FFC0 +1200 +3200 +2000 +3F00 +ENDCHAR +STARTCHAR C4D9 +ENCODING 50393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C4DA +ENCODING 50394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR C4DB +ENCODING 50395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C4DC +ENCODING 50396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +24 +56 +99 +00 +FF +24 +5B +7E +7E +ENDCHAR +STARTCHAR C4DD +ENCODING 50397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C4DE +ENCODING 50398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C4DF +ENCODING 50399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C4E0 +ENCODING 50400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C4E1 +ENCODING 50401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C4E2 +ENCODING 50402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C4E3 +ENCODING 50403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR C4E4 +ENCODING 50404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR C4E5 +ENCODING 50405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C4E6 +ENCODING 50406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C4E7 +ENCODING 50407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR C4E8 +ENCODING 50408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C4E9 +ENCODING 50409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C4EA +ENCODING 50410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C4EB +ENCODING 50411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C4EC +ENCODING 50412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C4ED +ENCODING 50413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +24 +56 +99 +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR C4EE +ENCODING 50414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +44C0 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C4EF +ENCODING 50415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +56 +99 +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR C4F0 +ENCODING 50416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1200 +1200 +1300 +2B00 +4480 +4840 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C4F1 +ENCODING 50417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C4F2 +ENCODING 50418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C4F3 +ENCODING 50419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C4F4 +ENCODING 50420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2F80 +48C0 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C4F5 +ENCODING 50421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C4F6 +ENCODING 50422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C4F7 +ENCODING 50423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C4F8 +ENCODING 50424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +3300 +4C80 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C4F9 +ENCODING 50425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR C4FA +ENCODING 50426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +3300 +4C80 +0000 +FFC0 +0000 +7F80 +0C80 +7C80 +4480 +7F80 +ENDCHAR +STARTCHAR C4FB +ENCODING 50427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR C4FC +ENCODING 50428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C4FD +ENCODING 50429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR C4FE +ENCODING 50430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR C4FF +ENCODING 50431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +2B00 +4C80 +0000 +FFC0 +0000 +3B00 +0800 +7F80 +4480 +7B00 +ENDCHAR +STARTCHAR C500 +ENCODING 50432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D80 +48C0 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C501 +ENCODING 50433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1200 +1300 +2D00 +4880 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C502 +ENCODING 50434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C503 +ENCODING 50435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR C504 +ENCODING 50436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR C505 +ENCODING 50437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR C506 +ENCODING 50438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C507 +ENCODING 50439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR C508 +ENCODING 50440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR C509 +ENCODING 50441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +24 +24 +5A +91 +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR C50A +ENCODING 50442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1000 +1200 +2B00 +4C80 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C50B +ENCODING 50443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +24 +24 +5A +91 +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C50C +ENCODING 50444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +3C80 +5A80 +9280 +1080 +0080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C50D +ENCODING 50445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C50E +ENCODING 50446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +3F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR C50F +ENCODING 50447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR C510 +ENCODING 50448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +3480 +4A80 +5280 +0080 +FF80 +0080 +2080 +2000 +3F80 +ENDCHAR +STARTCHAR C511 +ENCODING 50449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C512 +ENCODING 50450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C513 +ENCODING 50451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +1F80 +2000 +3F00 +ENDCHAR +STARTCHAR C514 +ENCODING 50452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +3480 +5A80 +0080 +FF80 +0000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR C515 +ENCODING 50453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C516 +ENCODING 50454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C517 +ENCODING 50455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C518 +ENCODING 50456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C519 +ENCODING 50457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C51A +ENCODING 50458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C51B +ENCODING 50459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C51C +ENCODING 50460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +3480 +4A80 +5280 +0080 +FF80 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR C51D +ENCODING 50461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C51E +ENCODING 50462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +2900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR C51F +ENCODING 50463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR C520 +ENCODING 50464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +1100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR C521 +ENCODING 50465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +1F00 +2080 +3180 +0E00 +ENDCHAR +STARTCHAR C522 +ENCODING 50466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR C523 +ENCODING 50467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +F900 +2500 +1F00 +E100 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C524 +ENCODING 50468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +3F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR C525 +ENCODING 50469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C526 +ENCODING 50470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +2880 +2C80 +5280 +0080 +FF80 +0080 +3F80 +0900 +1F80 +ENDCHAR +STARTCHAR C527 +ENCODING 50471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +F9 +25 +1F +E1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C528 +ENCODING 50472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +2880 +5C80 +5A80 +9280 +1080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C529 +ENCODING 50473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +5C80 +9280 +1080 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C52A +ENCODING 50474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +49 +D9 +B5 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C52B +ENCODING 50475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4900 +D900 +B500 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C52C +ENCODING 50476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +5C80 +9280 +1080 +0080 +2080 +2000 +2000 +1F80 +ENDCHAR +STARTCHAR C52D +ENCODING 50477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +49 +D9 +B5 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C52E +ENCODING 50478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +0380 +2780 +2380 +2480 +1B00 +ENDCHAR +STARTCHAR C52F +ENCODING 50479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +49 +D9 +B5 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C530 +ENCODING 50480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +5C80 +8A80 +1080 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C531 +ENCODING 50481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3B80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C532 +ENCODING 50482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3B80 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C533 +ENCODING 50483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3880 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR C534 +ENCODING 50484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C535 +ENCODING 50485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3B80 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR C536 +ENCODING 50486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C537 +ENCODING 50487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +3B80 +0F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR C538 +ENCODING 50488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +5C80 +8A80 +1080 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR C539 +ENCODING 50489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +5E80 +9280 +1080 +0000 +2080 +1F80 +2080 +1F80 +ENDCHAR +STARTCHAR C53A +ENCODING 50490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4900 +D900 +B500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C53B +ENCODING 50491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2480 +5C80 +4A80 +9280 +1080 +0400 +0600 +1B00 +2080 +ENDCHAR +STARTCHAR C53C +ENCODING 50492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4900 +D900 +B500 +2100 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C53D +ENCODING 50493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +2480 +2480 +2880 +5C80 +9280 +1080 +0000 +0F00 +1080 +1080 +0F00 +ENDCHAR +STARTCHAR C53E +ENCODING 50494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +4900 +4900 +D900 +B500 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C53F +ENCODING 50495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +0E00 +1E00 +0100 +0F00 +30C0 +ENDCHAR +STARTCHAR C540 +ENCODING 50496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +49 +49 +D9 +B5 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C541 +ENCODING 50497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +1F80 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR C542 +ENCODING 50498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +49 +49 +D9 +B5 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C543 +ENCODING 50499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +2480 +2480 +5C80 +9280 +0080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR C544 +ENCODING 50500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8900 +8980 +8900 +8900 +7100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C545 +ENCODING 50501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C546 +ENCODING 50502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C547 +ENCODING 50503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C548 +ENCODING 50504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C549 +ENCODING 50505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0000 +4700 +4100 +4300 +7C80 +ENDCHAR +STARTCHAR C54A +ENCODING 50506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +0600 +4000 +4F00 +4900 +7700 +ENDCHAR +STARTCHAR C54B +ENCODING 50507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C54C +ENCODING 50508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C54D +ENCODING 50509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR C54E +ENCODING 50510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR C54F +ENCODING 50511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8900 +8980 +D900 +2000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR C550 +ENCODING 50512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8900 +8980 +D900 +2000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR C551 +ENCODING 50513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8900 +8980 +D900 +2000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR C552 +ENCODING 50514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8900 +8980 +D900 +2000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR C553 +ENCODING 50515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7600 +1000 +7F00 +8900 +7600 +ENDCHAR +STARTCHAR C554 +ENCODING 50516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR C555 +ENCODING 50517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8900 +7100 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR C556 +ENCODING 50518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C557 +ENCODING 50519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0100 +0800 +0C00 +3600 +4100 +ENDCHAR +STARTCHAR C558 +ENCODING 50520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0000 +2200 +2200 +5500 +8980 +ENDCHAR +STARTCHAR C559 +ENCODING 50521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR C55A +ENCODING 50522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C55B +ENCODING 50523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8900 +8980 +D900 +2000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR C55C +ENCODING 50524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C55D +ENCODING 50525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +7100 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C55E +ENCODING 50526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8980 +8900 +7100 +0000 +7F00 +2200 +2200 +7F00 +ENDCHAR +STARTCHAR C55F +ENCODING 50527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8900 +8980 +D900 +2000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR C560 +ENCODING 50528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +95 +97 +95 +95 +65 +05 +05 +05 +ENDCHAR +STARTCHAR C561 +ENCODING 50529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +97 +95 +65 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C562 +ENCODING 50530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C563 +ENCODING 50531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C564 +ENCODING 50532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9500 +9500 +9700 +9500 +6500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C565 +ENCODING 50533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C566 +ENCODING 50534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C567 +ENCODING 50535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +95 +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C568 +ENCODING 50536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +97 +95 +65 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C569 +ENCODING 50537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C56A +ENCODING 50538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C56B +ENCODING 50539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C56C +ENCODING 50540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C56D +ENCODING 50541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C56E +ENCODING 50542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C56F +ENCODING 50543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C570 +ENCODING 50544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +97 +95 +65 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C571 +ENCODING 50545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +97 +95 +65 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C572 +ENCODING 50546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C573 +ENCODING 50547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9500 +9500 +9700 +9500 +6500 +0100 +0800 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR C574 +ENCODING 50548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9500 +9500 +9700 +9500 +6500 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C575 +ENCODING 50549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +97 +95 +65 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C576 +ENCODING 50550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C577 +ENCODING 50551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9500 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C578 +ENCODING 50552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C579 +ENCODING 50553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C57A +ENCODING 50554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +95 +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C57B +ENCODING 50555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +95 +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C57C +ENCODING 50556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8900 +8980 +8900 +7100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C57D +ENCODING 50557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8980 +7100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C57E +ENCODING 50558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C57F +ENCODING 50559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C580 +ENCODING 50560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8900 +7180 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C581 +ENCODING 50561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C582 +ENCODING 50562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR C583 +ENCODING 50563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C584 +ENCODING 50564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C585 +ENCODING 50565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR C586 +ENCODING 50566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR C587 +ENCODING 50567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +7900 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR C588 +ENCODING 50568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR C589 +ENCODING 50569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR C58A +ENCODING 50570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR C58B +ENCODING 50571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR C58C +ENCODING 50572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8980 +7100 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR C58D +ENCODING 50573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8980 +7100 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR C58E +ENCODING 50574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C58F +ENCODING 50575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8980 +7100 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR C590 +ENCODING 50576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR C591 +ENCODING 50577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8980 +8900 +8980 +7100 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR C592 +ENCODING 50578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C593 +ENCODING 50579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8980 +8900 +D980 +2000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR C594 +ENCODING 50580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C595 +ENCODING 50581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +7F00 +4000 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C596 +ENCODING 50582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7100 +8980 +8900 +8980 +7100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C597 +ENCODING 50583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8980 +8900 +8980 +7100 +0100 +1C00 +0000 +7F00 +2200 +1C00 +ENDCHAR +STARTCHAR C598 +ENCODING 50584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +97 +95 +95 +97 +95 +65 +05 +05 +05 +ENDCHAR +STARTCHAR C599 +ENCODING 50585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C59A +ENCODING 50586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C59B +ENCODING 50587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C59C +ENCODING 50588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9500 +9700 +9500 +9500 +6700 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C59D +ENCODING 50589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C59E +ENCODING 50590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C59F +ENCODING 50591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C5A0 +ENCODING 50592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +97 +95 +97 +65 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C5A1 +ENCODING 50593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C5A2 +ENCODING 50594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C5A3 +ENCODING 50595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C5A4 +ENCODING 50596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C5A5 +ENCODING 50597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C5A6 +ENCODING 50598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C5A7 +ENCODING 50599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C5A8 +ENCODING 50600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +3F +41 +7F +ENDCHAR +STARTCHAR C5A9 +ENCODING 50601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +97 +95 +97 +65 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C5AA +ENCODING 50602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C5AB +ENCODING 50603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C5AC +ENCODING 50604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C5AD +ENCODING 50605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR C5AE +ENCODING 50606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C5AF +ENCODING 50607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9700 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C5B0 +ENCODING 50608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C5B1 +ENCODING 50609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C5B2 +ENCODING 50610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +97 +95 +97 +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C5B3 +ENCODING 50611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +97 +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C5B4 +ENCODING 50612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +8F +89 +89 +89 +71 +01 +01 +01 +ENDCHAR +STARTCHAR C5B5 +ENCODING 50613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +71 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C5B6 +ENCODING 50614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +89 +71 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C5B7 +ENCODING 50615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8900 +8F00 +8900 +7100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C5B8 +ENCODING 50616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +8F +89 +71 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR C5B9 +ENCODING 50617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8F00 +8900 +7100 +0000 +4700 +4100 +4300 +7480 +ENDCHAR +STARTCHAR C5BA +ENCODING 50618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C5BB +ENCODING 50619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +71 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR C5BC +ENCODING 50620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +71 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C5BD +ENCODING 50621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +71 +00 +77 +11 +71 +41 +79 +ENDCHAR +STARTCHAR C5BE +ENCODING 50622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +71 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C5BF +ENCODING 50623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C5C0 +ENCODING 50624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C5C1 +ENCODING 50625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C5C2 +ENCODING 50626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C5C3 +ENCODING 50627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C5C4 +ENCODING 50628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +71 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C5C5 +ENCODING 50629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +71 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C5C6 +ENCODING 50630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8F00 +8900 +8900 +7100 +0000 +4A00 +7200 +4D00 +7480 +ENDCHAR +STARTCHAR C5C7 +ENCODING 50631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8F00 +8900 +7100 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C5C8 +ENCODING 50632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8F00 +8900 +8900 +7100 +0000 +1200 +1200 +3300 +4C80 +ENDCHAR +STARTCHAR C5C9 +ENCODING 50633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +71 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C5CA +ENCODING 50634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8F00 +8900 +7100 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C5CB +ENCODING 50635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8900 +8F00 +D900 +2100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C5CC +ENCODING 50636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +71 +00 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C5CD +ENCODING 50637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C5CE +ENCODING 50638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8F00 +8900 +8900 +7100 +0000 +3F00 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR C5CF +ENCODING 50639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +8F +D9 +21 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C5D0 +ENCODING 50640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +8D +95 +95 +95 +65 +05 +05 +05 +ENDCHAR +STARTCHAR C5D1 +ENCODING 50641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +9D +95 +65 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C5D2 +ENCODING 50642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C5D3 +ENCODING 50643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C5D4 +ENCODING 50644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9500 +9500 +9D00 +9500 +6500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C5D5 +ENCODING 50645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C5D6 +ENCODING 50646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C5D7 +ENCODING 50647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +9D +95 +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C5D8 +ENCODING 50648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +9D +95 +65 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C5D9 +ENCODING 50649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C5DA +ENCODING 50650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C5DB +ENCODING 50651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C5DC +ENCODING 50652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C5DD +ENCODING 50653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C5DE +ENCODING 50654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C5DF +ENCODING 50655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C5E0 +ENCODING 50656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +9D +95 +65 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C5E1 +ENCODING 50657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +9D +95 +95 +65 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C5E2 +ENCODING 50658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C5E3 +ENCODING 50659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9500 +9500 +9D00 +9500 +6500 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C5E4 +ENCODING 50660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +6500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C5E5 +ENCODING 50661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +95 +9D +95 +65 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C5E6 +ENCODING 50662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C5E7 +ENCODING 50663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9D00 +9500 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C5E8 +ENCODING 50664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C5E9 +ENCODING 50665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C5EA +ENCODING 50666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +9D +95 +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C5EB +ENCODING 50667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +9D +95 +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C5EC +ENCODING 50668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +89 +89 +8F +89 +71 +01 +01 +01 +ENDCHAR +STARTCHAR C5ED +ENCODING 50669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +89 +8F +71 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C5EE +ENCODING 50670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +89 +8F +71 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C5EF +ENCODING 50671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8F00 +8900 +8F00 +7100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C5F0 +ENCODING 50672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +89 +8F +71 +01 +20 +20 +20 +3F +ENDCHAR +STARTCHAR C5F1 +ENCODING 50673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +8F +71 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C5F2 +ENCODING 50674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +DF +21 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C5F3 +ENCODING 50675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +71 +8F +89 +8F +71 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C5F4 +ENCODING 50676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +8F +71 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C5F5 +ENCODING 50677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +DF +21 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C5F6 +ENCODING 50678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +8F +71 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C5F7 +ENCODING 50679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +8F +71 +00 +75 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C5F8 +ENCODING 50680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +DF +21 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C5F9 +ENCODING 50681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +DF +21 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C5FA +ENCODING 50682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +DF +21 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C5FB +ENCODING 50683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +DF +21 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C5FC +ENCODING 50684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +89 +8F +71 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C5FD +ENCODING 50685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +89 +8F +71 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C5FE +ENCODING 50686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8F00 +8900 +8900 +8F00 +7100 +0000 +4A00 +7200 +4D00 +7480 +ENDCHAR +STARTCHAR C5FF +ENCODING 50687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8F00 +8900 +8900 +8F00 +7100 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C600 +ENCODING 50688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8F00 +8900 +8900 +8F00 +7100 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C601 +ENCODING 50689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +89 +8F +71 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C602 +ENCODING 50690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8F00 +8900 +8F00 +7100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C603 +ENCODING 50691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8F00 +8900 +DF00 +2100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C604 +ENCODING 50692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +8F +89 +8F +71 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C605 +ENCODING 50693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +8F +71 +00 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C606 +ENCODING 50694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8F00 +8900 +8900 +8F00 +7100 +0000 +3F00 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR C607 +ENCODING 50695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +8F +89 +8F +71 +01 +1C +00 +7F +22 +1E +ENDCHAR +STARTCHAR C608 +ENCODING 50696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +95 +9D +95 +95 +9D +95 +65 +05 +05 +05 +ENDCHAR +STARTCHAR C609 +ENCODING 50697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +65 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C60A +ENCODING 50698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +65 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C60B +ENCODING 50699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +6500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C60C +ENCODING 50700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9D00 +9500 +9500 +9D00 +6500 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C60D +ENCODING 50701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +6500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C60E +ENCODING 50702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C60F +ENCODING 50703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +65 +00 +3F +40 +7F +ENDCHAR +STARTCHAR C610 +ENCODING 50704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +9D +95 +9D +65 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C611 +ENCODING 50705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C612 +ENCODING 50706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C613 +ENCODING 50707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C614 +ENCODING 50708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C615 +ENCODING 50709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C616 +ENCODING 50710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C617 +ENCODING 50711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C618 +ENCODING 50712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +9D +95 +95 +9D +65 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C619 +ENCODING 50713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +9D +95 +95 +9D +65 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C61A +ENCODING 50714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +6500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C61B +ENCODING 50715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9D00 +9500 +9500 +9D00 +6500 +0500 +0900 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C61C +ENCODING 50716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +9D00 +9500 +9500 +9D00 +6500 +0000 +1200 +3200 +7500 +4C80 +ENDCHAR +STARTCHAR C61D +ENCODING 50717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +9D +95 +65 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR C61E +ENCODING 50718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +6500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C61F +ENCODING 50719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C620 +ENCODING 50720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +65 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C621 +ENCODING 50721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C622 +ENCODING 50722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +9D +95 +9D +65 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C623 +ENCODING 50723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C624 +ENCODING 50724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1E00 +2100 +2080 +2080 +2100 +1E00 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR C625 +ENCODING 50725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C626 +ENCODING 50726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +62 +41 +7E +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR C627 +ENCODING 50727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +1C00 +6200 +4100 +7E00 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C628 +ENCODING 50728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C629 +ENCODING 50729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +62 +41 +7E +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C62A +ENCODING 50730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C62B +ENCODING 50731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1C +62 +41 +7E +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR C62C +ENCODING 50732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C62D +ENCODING 50733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C62E +ENCODING 50734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR C62F +ENCODING 50735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C630 +ENCODING 50736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +7900 +0900 +3900 +4280 +3C40 +ENDCHAR +STARTCHAR C631 +ENCODING 50737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C632 +ENCODING 50738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C633 +ENCODING 50739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +7B00 +0800 +7F80 +4480 +3B80 +ENDCHAR +STARTCHAR C634 +ENCODING 50740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C635 +ENCODING 50741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C636 +ENCODING 50742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +62 +41 +7E +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C637 +ENCODING 50743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0400 +FFC0 +0000 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR C638 +ENCODING 50744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +62 +41 +7E +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C639 +ENCODING 50745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C63A +ENCODING 50746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +1C +62 +41 +7E +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR C63B +ENCODING 50747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0400 +FFC0 +0000 +1E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR C63C +ENCODING 50748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +1C +62 +41 +7E +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C63D +ENCODING 50749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +2100 +2080 +1F00 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C63E +ENCODING 50750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1C +62 +41 +7E +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C63F +ENCODING 50751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C640 +ENCODING 50752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +4480 +38C0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C641 +ENCODING 50753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +38C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C642 +ENCODING 50754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C643 +ENCODING 50755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C644 +ENCODING 50756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +4480 +38C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C645 +ENCODING 50757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C646 +ENCODING 50758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C647 +ENCODING 50759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR C648 +ENCODING 50760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3C80 +4480 +3C80 +10C0 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C649 +ENCODING 50761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C64A +ENCODING 50762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C64B +ENCODING 50763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR C64C +ENCODING 50764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C64D +ENCODING 50765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR C64E +ENCODING 50766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C64F +ENCODING 50767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C650 +ENCODING 50768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +38C0 +1080 +FE80 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C651 +ENCODING 50769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +38C0 +1080 +FE80 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C652 +ENCODING 50770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR C653 +ENCODING 50771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +3880 +10C0 +FE80 +0080 +0400 +0400 +1B00 +2080 +ENDCHAR +STARTCHAR C654 +ENCODING 50772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +38C0 +1080 +FE80 +0000 +1100 +1100 +2B80 +4480 +ENDCHAR +STARTCHAR C655 +ENCODING 50773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +4480 +4480 +38C0 +1080 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C656 +ENCODING 50774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR C657 +ENCODING 50775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR C658 +ENCODING 50776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR C659 +ENCODING 50777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C65A +ENCODING 50778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +8900 +C980 +3100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR C65B +ENCODING 50779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1000 +6C80 +4480 +2CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR C65C +ENCODING 50780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +4A80 +4A80 +4A80 +3380 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C65D +ENCODING 50781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4A80 +3B80 +1280 +FE80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C65E +ENCODING 50782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +65 +FD +01 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C65F +ENCODING 50783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +6500 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C660 +ENCODING 50784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3280 +4A80 +4A80 +4B80 +3A80 +1280 +FE80 +0280 +2000 +2000 +1FC0 +ENDCHAR +STARTCHAR C661 +ENCODING 50785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +6500 +FD00 +0100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C662 +ENCODING 50786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C663 +ENCODING 50787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +65 +FD +01 +3F +40 +7F +ENDCHAR +STARTCHAR C664 +ENCODING 50788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C665 +ENCODING 50789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C666 +ENCODING 50790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C667 +ENCODING 50791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C668 +ENCODING 50792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR C669 +ENCODING 50793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C66A +ENCODING 50794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C66B +ENCODING 50795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR C66C +ENCODING 50796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4A80 +3B80 +1280 +FE80 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR C66D +ENCODING 50797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +65 +FD +01 +21 +3F +3F +ENDCHAR +STARTCHAR C66E +ENCODING 50798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +6500 +FD00 +0100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C66F +ENCODING 50799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4A80 +3B80 +1280 +FE80 +0080 +0400 +0400 +1B00 +2080 +ENDCHAR +STARTCHAR C670 +ENCODING 50800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +6500 +FD00 +0100 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C671 +ENCODING 50801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4A80 +3B80 +1280 +FE80 +0280 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C672 +ENCODING 50802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +6500 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C673 +ENCODING 50803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR C674 +ENCODING 50804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +65 +FD +01 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C675 +ENCODING 50805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C676 +ENCODING 50806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +97 +65 +FD +01 +3F +12 +3F +ENDCHAR +STARTCHAR C677 +ENCODING 50807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +4A80 +6B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR C678 +ENCODING 50808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +4480 +4480 +4480 +3880 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C679 +ENCODING 50809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +21 +FF +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C67A +ENCODING 50810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C67B +ENCODING 50811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +8900 +C900 +3100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C67C +ENCODING 50812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +49 +85 +49 +71 +21 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR C67D +ENCODING 50813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C67E +ENCODING 50814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C67F +ENCODING 50815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR C680 +ENCODING 50816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +85 +79 +21 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C681 +ENCODING 50817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C682 +ENCODING 50818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C683 +ENCODING 50819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C684 +ENCODING 50820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C685 +ENCODING 50821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C686 +ENCODING 50822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C687 +ENCODING 50823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C688 +ENCODING 50824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +21 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C689 +ENCODING 50825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C68A +ENCODING 50826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C68B +ENCODING 50827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +21 +FF +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR C68C +ENCODING 50828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C68D +ENCODING 50829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +21 +FF +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR C68E +ENCODING 50830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +8900 +C900 +3100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C68F +ENCODING 50831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +D900 +8900 +5900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C690 +ENCODING 50832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR C691 +ENCODING 50833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C692 +ENCODING 50834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR C693 +ENCODING 50835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +59 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C694 +ENCODING 50836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1E00 +2100 +2080 +2100 +1E00 +0000 +1100 +1100 +FFC0 +ENDCHAR +STARTCHAR C695 +ENCODING 50837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +1200 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C696 +ENCODING 50838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C697 +ENCODING 50839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C698 +ENCODING 50840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +1200 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C699 +ENCODING 50841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C69A +ENCODING 50842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C69B +ENCODING 50843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C69C +ENCODING 50844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +1F00 +1200 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C69D +ENCODING 50845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C69E +ENCODING 50846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C69F +ENCODING 50847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C6A0 +ENCODING 50848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C6A1 +ENCODING 50849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C6A2 +ENCODING 50850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C6A3 +ENCODING 50851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C6A4 +ENCODING 50852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2100 +1E00 +1200 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C6A5 +ENCODING 50853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +1200 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C6A6 +ENCODING 50854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C6A7 +ENCODING 50855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +1200 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C6A8 +ENCODING 50856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR C6A9 +ENCODING 50857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +1200 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C6AA +ENCODING 50858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C6AB +ENCODING 50859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR C6AC +ENCODING 50860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR C6AD +ENCODING 50861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C6AE +ENCODING 50862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3100 +2080 +3F00 +1200 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C6AF +ENCODING 50863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2080 +1F00 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C6B0 +ENCODING 50864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +2100 +2080 +2100 +1E00 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR C6B1 +ENCODING 50865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C6B2 +ENCODING 50866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C6B3 +ENCODING 50867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C6B4 +ENCODING 50868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR C6B5 +ENCODING 50869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C6B6 +ENCODING 50870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR C6B7 +ENCODING 50871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C6B8 +ENCODING 50872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C6B9 +ENCODING 50873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C6BA +ENCODING 50874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0400 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR C6BB +ENCODING 50875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C6BC +ENCODING 50876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C6BD +ENCODING 50877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C6BE +ENCODING 50878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C6BF +ENCODING 50879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR C6C0 +ENCODING 50880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C6C1 +ENCODING 50881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0400 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C6C2 +ENCODING 50882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C6C3 +ENCODING 50883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0400 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C6C4 +ENCODING 50884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C6C5 +ENCODING 50885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C6C6 +ENCODING 50886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +1C +62 +41 +7E +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR C6C7 +ENCODING 50887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C6C8 +ENCODING 50888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C6C9 +ENCODING 50889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +42 +41 +3E +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR C6CA +ENCODING 50890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C6CB +ENCODING 50891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C6CC +ENCODING 50892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +4480 +4480 +3880 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR C6CD +ENCODING 50893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +71 +01 +FD +21 +20 +7F +01 +01 +ENDCHAR +STARTCHAR C6CE +ENCODING 50894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C6CF +ENCODING 50895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C6D0 +ENCODING 50896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +71 +01 +FF +21 +27 +41 +40 +7F +ENDCHAR +STARTCHAR C6D1 +ENCODING 50897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C6D2 +ENCODING 50898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C6D3 +ENCODING 50899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +3F +40 +7E +ENDCHAR +STARTCHAR C6D4 +ENCODING 50900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +87 +79 +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C6D5 +ENCODING 50901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C6D6 +ENCODING 50902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C6D7 +ENCODING 50903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C6D8 +ENCODING 50904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C6D9 +ENCODING 50905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C6DA +ENCODING 50906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C6DB +ENCODING 50907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR C6DC +ENCODING 50908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +79 +01 +FD +21 +27 +00 +7F +41 +7F +ENDCHAR +STARTCHAR C6DD +ENCODING 50909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +71 +01 +FD +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C6DE +ENCODING 50910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C6DF +ENCODING 50911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +08 +14 +63 +ENDCHAR +STARTCHAR C6E0 +ENCODING 50912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8F00 +7100 +0100 +FD00 +2100 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR C6E1 +ENCODING 50913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +8F +71 +01 +FD +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR C6E2 +ENCODING 50914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +4900 +8900 +7900 +1D00 +E100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C6E3 +ENCODING 50915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +C900 +8900 +7100 +FD00 +2300 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C6E4 +ENCODING 50916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C6E5 +ENCODING 50917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +27 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C6E6 +ENCODING 50918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +49 +89 +79 +1D +E1 +27 +3F +12 +3F +ENDCHAR +STARTCHAR C6E7 +ENCODING 50919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +FD +23 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C6E8 +ENCODING 50920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4A80 +4A80 +7A80 +0280 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR C6E9 +ENCODING 50921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4E80 +3A80 +0280 +FE80 +1000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C6EA +ENCODING 50922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C6EB +ENCODING 50923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C6EC +ENCODING 50924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4A80 +3A80 +0280 +FE80 +1280 +1680 +2280 +2000 +3F80 +ENDCHAR +STARTCHAR C6ED +ENCODING 50925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C6EE +ENCODING 50926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR C6EF +ENCODING 50927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +40 +7F +ENDCHAR +STARTCHAR C6F0 +ENCODING 50928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4680 +7A80 +0280 +FE80 +1000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR C6F1 +ENCODING 50929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C6F2 +ENCODING 50930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR C6F3 +ENCODING 50931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C6F4 +ENCODING 50932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C6F5 +ENCODING 50933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C6F6 +ENCODING 50934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C6F7 +ENCODING 50935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR C6F8 +ENCODING 50936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4E80 +3A80 +0280 +FE80 +1000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR C6F9 +ENCODING 50937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4680 +7A80 +0280 +FE80 +1280 +1000 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR C6FA +ENCODING 50938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C6FB +ENCODING 50939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +08 +1C +63 +ENDCHAR +STARTCHAR C6FC +ENCODING 50940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +02 +22 +55 +08 +ENDCHAR +STARTCHAR C6FD +ENCODING 50941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +4A80 +4E80 +3A80 +0280 +FE80 +1000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C6FE +ENCODING 50942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +F500 +1D00 +E500 +2900 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C6FF +ENCODING 50943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR C700 +ENCODING 50944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +01 +3F +01 +ENDCHAR +STARTCHAR C701 +ENCODING 50945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C702 +ENCODING 50946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +95 +F5 +1D +E5 +29 +3F +12 +3F +ENDCHAR +STARTCHAR C703 +ENCODING 50947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +6A80 +4A80 +3280 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR C704 +ENCODING 50948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +4480 +4280 +4480 +3880 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR C705 +ENCODING 50949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FD +20 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C706 +ENCODING 50950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C707 +ENCODING 50951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C708 +ENCODING 50952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR C709 +ENCODING 50953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C70A +ENCODING 50954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C70B +ENCODING 50955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +49 +89 +79 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR C70C +ENCODING 50956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +85 +79 +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C70D +ENCODING 50957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C70E +ENCODING 50958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C70F +ENCODING 50959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C710 +ENCODING 50960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +72 +72 +85 +68 +ENDCHAR +STARTCHAR C711 +ENCODING 50961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C712 +ENCODING 50962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C713 +ENCODING 50963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +77 +37 +49 +76 +ENDCHAR +STARTCHAR C714 +ENCODING 50964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FD +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C715 +ENCODING 50965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FD +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C716 +ENCODING 50966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C717 +ENCODING 50967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7900 +8900 +8900 +7900 +0100 +FD00 +2100 +2800 +0C00 +3200 +6180 +ENDCHAR +STARTCHAR C718 +ENCODING 50968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C719 +ENCODING 50969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FD +20 +3E +41 +41 +3E +ENDCHAR +STARTCHAR C71A +ENCODING 50970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +4900 +8900 +7900 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C71B +ENCODING 50971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +C900 +8900 +7100 +1D00 +E100 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C71C +ENCODING 50972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +49 +89 +79 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C71D +ENCODING 50973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C71E +ENCODING 50974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +49 +89 +79 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR C71F +ENCODING 50975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +89 +71 +1D +E1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C720 +ENCODING 50976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +2100 +2080 +2100 +1E00 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR C721 +ENCODING 50977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +1200 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C722 +ENCODING 50978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C723 +ENCODING 50979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C724 +ENCODING 50980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR C725 +ENCODING 50981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C726 +ENCODING 50982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR C727 +ENCODING 50983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C728 +ENCODING 50984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C729 +ENCODING 50985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C72A +ENCODING 50986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C72B +ENCODING 50987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C72C +ENCODING 50988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C72D +ENCODING 50989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C72E +ENCODING 50990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C72F +ENCODING 50991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR C730 +ENCODING 50992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C731 +ENCODING 50993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +1200 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C732 +ENCODING 50994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C733 +ENCODING 50995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +1100 +1500 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C734 +ENCODING 50996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C735 +ENCODING 50997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C736 +ENCODING 50998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C737 +ENCODING 50999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +1100 +0E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR C738 +ENCODING 51000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C739 +ENCODING 51001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +42 +41 +3E +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR C73A +ENCODING 51002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3100 +2080 +3F00 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C73B +ENCODING 51003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR C73C +ENCODING 51004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1E00 +2100 +2080 +2080 +2100 +1E00 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C73D +ENCODING 51005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C73E +ENCODING 51006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2080 +3300 +0C00 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C73F +ENCODING 51007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2080 +3300 +0C00 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C740 +ENCODING 51008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1F00 +2080 +2080 +1F00 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C741 +ENCODING 51009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2080 +3300 +0C00 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C742 +ENCODING 51010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C743 +ENCODING 51011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +2080 +3300 +0C00 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C744 +ENCODING 51012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C745 +ENCODING 51013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR C746 +ENCODING 51014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR C747 +ENCODING 51015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR C748 +ENCODING 51016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C749 +ENCODING 51017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR C74A +ENCODING 51018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0000 +7F80 +0A80 +7A80 +4280 +7F80 +ENDCHAR +STARTCHAR C74B +ENCODING 51019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +42 +41 +3E +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR C74C +ENCODING 51020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C74D +ENCODING 51021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C74E +ENCODING 51022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2080 +3300 +0C00 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C74F +ENCODING 51023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR C750 +ENCODING 51024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +2080 +3300 +0C00 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR C751 +ENCODING 51025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +1F00 +2100 +2100 +1F00 +ENDCHAR +STARTCHAR C752 +ENCODING 51026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C753 +ENCODING 51027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0000 +1E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR C754 +ENCODING 51028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +0080 +ENDCHAR +STARTCHAR C755 +ENCODING 51029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2080 +3F00 +0000 +FFC0 +0000 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C756 +ENCODING 51030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +2100 +2100 +1E00 +0000 +FFC0 +0000 +3F80 +1200 +1200 +7F80 +ENDCHAR +STARTCHAR C757 +ENCODING 51031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 12 0 -3 +BITMAP +1F00 +2100 +2100 +1F00 +0000 +FFC0 +0000 +1E00 +0000 +3F80 +1100 +1E00 +ENDCHAR +STARTCHAR C758 +ENCODING 51032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +4480 +4480 +4480 +3880 +0080 +0080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C759 +ENCODING 51033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C75A +ENCODING 51034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C75B +ENCODING 51035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +8900 +C900 +3100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C75C +ENCODING 51036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +49 +85 +49 +71 +01 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR C75D +ENCODING 51037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C75E +ENCODING 51038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C75F +ENCODING 51039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR C760 +ENCODING 51040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +85 +79 +01 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C761 +ENCODING 51041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C762 +ENCODING 51042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C763 +ENCODING 51043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C764 +ENCODING 51044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C765 +ENCODING 51045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C766 +ENCODING 51046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C767 +ENCODING 51047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C768 +ENCODING 51048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C769 +ENCODING 51049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR C76A +ENCODING 51050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C76B +ENCODING 51051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +89 +89 +79 +01 +FF +01 +08 +08 +36 +41 +ENDCHAR +STARTCHAR C76C +ENCODING 51052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C76D +ENCODING 51053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C76E +ENCODING 51054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +8900 +C900 +3100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C76F +ENCODING 51055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +D900 +8900 +7900 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C770 +ENCODING 51056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR C771 +ENCODING 51057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C772 +ENCODING 51058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +89 +C9 +31 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR C773 +ENCODING 51059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +D9 +89 +79 +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C774 +ENCODING 51060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +49 +89 +89 +89 +89 +49 +71 +01 +01 +01 +ENDCHAR +STARTCHAR C775 +ENCODING 51061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +89 +71 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C776 +ENCODING 51062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +89 +71 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C777 +ENCODING 51063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8900 +8900 +8900 +7100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C778 +ENCODING 51064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +89 +71 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR C779 +ENCODING 51065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +89 +71 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C77A +ENCODING 51066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C77B +ENCODING 51067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +71 +89 +89 +89 +71 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C77C +ENCODING 51068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +71 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C77D +ENCODING 51069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +71 +00 +77 +11 +71 +41 +79 +ENDCHAR +STARTCHAR C77E +ENCODING 51070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +71 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C77F +ENCODING 51071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C780 +ENCODING 51072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C781 +ENCODING 51073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C782 +ENCODING 51074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C783 +ENCODING 51075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +71 +00 +77 +10 +7F +45 +7F +ENDCHAR +STARTCHAR C784 +ENCODING 51076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +89 +71 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C785 +ENCODING 51077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +89 +71 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C786 +ENCODING 51078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8900 +8900 +8900 +7100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C787 +ENCODING 51079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8900 +8900 +7100 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C788 +ENCODING 51080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8900 +8900 +7100 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C789 +ENCODING 51081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +89 +71 +00 +1E +21 +21 +1E +ENDCHAR +STARTCHAR C78A +ENCODING 51082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +8900 +8900 +8900 +8900 +7100 +0000 +3F00 +0200 +0E00 +3180 +ENDCHAR +STARTCHAR C78B +ENCODING 51083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7100 +8900 +8900 +D900 +2100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C78C +ENCODING 51084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +89 +71 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C78D +ENCODING 51085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C78E +ENCODING 51086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +89 +89 +89 +89 +71 +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR C78F +ENCODING 51087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +71 +89 +89 +D9 +21 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C790 +ENCODING 51088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1100 +2180 +7100 +C900 +8500 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C791 +ENCODING 51089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +4900 +8500 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C792 +ENCODING 51090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +1100 +1180 +6900 +8500 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C793 +ENCODING 51091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1100 +1180 +6900 +8500 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C794 +ENCODING 51092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +6900 +8500 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C795 +ENCODING 51093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1100 +1180 +6900 +8500 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C796 +ENCODING 51094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +1100 +1180 +6D00 +8000 +0600 +0000 +4F00 +4600 +4900 +7700 +ENDCHAR +STARTCHAR C797 +ENCODING 51095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +6900 +8500 +0000 +7F00 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C798 +ENCODING 51096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +1100 +1180 +7900 +8500 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C799 +ENCODING 51097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR C79A +ENCODING 51098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +7900 +8D00 +0000 +7F00 +1900 +7900 +8900 +7F00 +ENDCHAR +STARTCHAR C79B +ENCODING 51099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR C79C +ENCODING 51100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR C79D +ENCODING 51101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR C79E +ENCODING 51102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR C79F +ENCODING 51103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR C7A0 +ENCODING 51104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +7900 +8500 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR C7A1 +ENCODING 51105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +1100 +1180 +7900 +8500 +0000 +4100 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR C7A2 +ENCODING 51106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1100 +1180 +6900 +8500 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C7A3 +ENCODING 51107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +1180 +7900 +8500 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR C7A4 +ENCODING 51108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +4900 +8500 +0000 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR C7A5 +ENCODING 51109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +7900 +8500 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR C7A6 +ENCODING 51110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3180 +6900 +8500 +0000 +3F00 +0200 +0C00 +7300 +ENDCHAR +STARTCHAR C7A7 +ENCODING 51111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR C7A8 +ENCODING 51112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +1100 +1180 +6900 +8500 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C7A9 +ENCODING 51113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR C7AA +ENCODING 51114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +1100 +1180 +6900 +8500 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C7AB +ENCODING 51115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1100 +3180 +4D00 +8000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR C7AC +ENCODING 51116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +0A80 +1280 +1380 +2A80 +6A80 +C680 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C7AD +ENCODING 51117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +25 +27 +55 +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C7AE +ENCODING 51118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +27 +55 +8D +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C7AF +ENCODING 51119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2700 +5500 +8D00 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C7B0 +ENCODING 51120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +2500 +2700 +D500 +8D00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C7B1 +ENCODING 51121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2700 +5500 +8D00 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C7B2 +ENCODING 51122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C7B3 +ENCODING 51123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +27 +55 +8D +00 +3F +40 +7F +ENDCHAR +STARTCHAR C7B4 +ENCODING 51124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +27 +55 +8D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C7B5 +ENCODING 51125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C7B6 +ENCODING 51126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C7B7 +ENCODING 51127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C7B8 +ENCODING 51128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C7B9 +ENCODING 51129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C7BA +ENCODING 51130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C7BB +ENCODING 51131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C7BC +ENCODING 51132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +25 +27 +D5 +8D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C7BD +ENCODING 51133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +25 +27 +55 +8D +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C7BE +ENCODING 51134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2700 +5500 +8D00 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C7BF +ENCODING 51135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +2500 +2700 +D500 +8D00 +0100 +0800 +0C00 +3200 +6180 +ENDCHAR +STARTCHAR C7C0 +ENCODING 51136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +2500 +2700 +D500 +8D00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR C7C1 +ENCODING 51137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +25 +27 +D5 +8D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C7C2 +ENCODING 51138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2700 +5500 +8D00 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C7C3 +ENCODING 51139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +2500 +2700 +D500 +0500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C7C4 +ENCODING 51140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +27 +55 +8D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C7C5 +ENCODING 51141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C7C6 +ENCODING 51142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +27 +55 +8D +00 +3F +12 +3F +ENDCHAR +STARTCHAR C7C7 +ENCODING 51143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +27 +D5 +05 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C7C8 +ENCODING 51144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +1100 +1180 +2100 +3100 +5180 +8900 +8500 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C7C9 +ENCODING 51145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +3100 +4980 +8500 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR C7CA +ENCODING 51146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C7CB +ENCODING 51147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C7CC +ENCODING 51148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +3100 +4900 +8580 +0100 +4100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR C7CD +ENCODING 51149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C7CE +ENCODING 51150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +1180 +1100 +7980 +8500 +0000 +0600 +4000 +4F00 +4900 +7700 +ENDCHAR +STARTCHAR C7CF +ENCODING 51151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C7D0 +ENCODING 51152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +1180 +1100 +7980 +8500 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR C7D1 +ENCODING 51153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR C7D2 +ENCODING 51154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR C7D3 +ENCODING 51155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR C7D4 +ENCODING 51156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR C7D5 +ENCODING 51157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR C7D6 +ENCODING 51158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR C7D7 +ENCODING 51159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR C7D8 +ENCODING 51160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +3100 +7980 +8500 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR C7D9 +ENCODING 51161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR C7DA +ENCODING 51162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C7DB +ENCODING 51163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR C7DC +ENCODING 51164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR C7DD +ENCODING 51165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1180 +3100 +4980 +8500 +0000 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR C7DE +ENCODING 51166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C7DF +ENCODING 51167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR C7E0 +ENCODING 51168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C7E1 +ENCODING 51169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR C7E2 +ENCODING 51170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +1180 +1100 +6980 +8500 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C7E3 +ENCODING 51171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +1180 +3100 +4D80 +8000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR C7E4 +ENCODING 51172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +0B80 +1280 +1280 +2B80 +4A80 +8680 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C7E5 +ENCODING 51173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C7E6 +ENCODING 51174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C7E7 +ENCODING 51175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +2500 +5700 +8D00 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C7E8 +ENCODING 51176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +2700 +2500 +D500 +8F00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C7E9 +ENCODING 51177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +2500 +5700 +8D00 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C7EA +ENCODING 51178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C7EB +ENCODING 51179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +3F +40 +7F +ENDCHAR +STARTCHAR C7EC +ENCODING 51180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +17 +25 +57 +8D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C7ED +ENCODING 51181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C7EE +ENCODING 51182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C7EF +ENCODING 51183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C7F0 +ENCODING 51184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C7F1 +ENCODING 51185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C7F2 +ENCODING 51186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C7F3 +ENCODING 51187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C7F4 +ENCODING 51188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +3F +41 +7F +ENDCHAR +STARTCHAR C7F5 +ENCODING 51189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +21 +3F +3F +ENDCHAR +STARTCHAR C7F6 +ENCODING 51190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +2500 +5700 +8D00 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C7F7 +ENCODING 51191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +08 +14 +63 +ENDCHAR +STARTCHAR C7F8 +ENCODING 51192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +2500 +5700 +8D00 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C7F9 +ENCODING 51193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +25 +57 +8D +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR C7FA +ENCODING 51194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +2500 +5700 +8D00 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C7FB +ENCODING 51195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +2700 +2500 +D700 +0500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C7FC +ENCODING 51196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C7FD +ENCODING 51197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C7FE +ENCODING 51198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +25 +57 +8D +00 +3F +12 +3F +ENDCHAR +STARTCHAR C7FF +ENCODING 51199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +27 +25 +D7 +05 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C800 +ENCODING 51200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +17 +31 +71 +C9 +85 +01 +01 +01 +ENDCHAR +STARTCHAR C801 +ENCODING 51201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +31 +49 +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C802 +ENCODING 51202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +11 +17 +69 +85 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C803 +ENCODING 51203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1100 +1700 +6900 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C804 +ENCODING 51204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +31 +49 +85 +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR C805 +ENCODING 51205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +11 +17 +69 +85 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C806 +ENCODING 51206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C807 +ENCODING 51207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +11 +17 +69 +85 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C808 +ENCODING 51208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +79 +85 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C809 +ENCODING 51209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C80A +ENCODING 51210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +69 +85 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C80B +ENCODING 51211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C80C +ENCODING 51212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C80D +ENCODING 51213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C80E +ENCODING 51214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C80F +ENCODING 51215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C810 +ENCODING 51216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +11 +69 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C811 +ENCODING 51217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +31 +69 +85 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C812 +ENCODING 51218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1100 +1700 +6900 +8500 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C813 +ENCODING 51219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +31 +69 +85 +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR C814 +ENCODING 51220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1100 +1700 +6900 +8500 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C815 +ENCODING 51221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +31 +49 +85 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C816 +ENCODING 51222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1700 +3100 +4900 +8500 +0000 +3F00 +0200 +0C00 +7380 +ENDCHAR +STARTCHAR C817 +ENCODING 51223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +3700 +4900 +8500 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C818 +ENCODING 51224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +11 +17 +69 +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C819 +ENCODING 51225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C81A +ENCODING 51226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +11 +17 +69 +85 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C81B +ENCODING 51227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +37 +49 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C81C +ENCODING 51228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +0A80 +1680 +1280 +2A80 +4A80 +8680 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C81D +ENCODING 51229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +2D +25 +D5 +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C81E +ENCODING 51230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +2D +55 +8D +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C81F +ENCODING 51231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2D00 +5500 +8D00 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C820 +ENCODING 51232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +2D00 +6500 +D500 +8D00 +0500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C821 +ENCODING 51233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2D00 +5500 +8D00 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C822 +ENCODING 51234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C823 +ENCODING 51235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +2D +55 +8D +00 +3F +40 +7F +ENDCHAR +STARTCHAR C824 +ENCODING 51236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +2D +55 +8D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C825 +ENCODING 51237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C826 +ENCODING 51238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C827 +ENCODING 51239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C828 +ENCODING 51240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C829 +ENCODING 51241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C82A +ENCODING 51242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C82B +ENCODING 51243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C82C +ENCODING 51244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +2D +25 +D5 +8D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C82D +ENCODING 51245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +2D +25 +D5 +8D +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR C82E +ENCODING 51246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2D00 +5500 +8D00 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C82F +ENCODING 51247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +2D00 +2500 +D500 +8D00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR C830 +ENCODING 51248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2D00 +5500 +8D00 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C831 +ENCODING 51249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +2D +25 +D5 +8D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C832 +ENCODING 51250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +2D00 +5500 +8D00 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C833 +ENCODING 51251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +2500 +2D00 +D500 +0100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C834 +ENCODING 51252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +2D +55 +8D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C835 +ENCODING 51253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C836 +ENCODING 51254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +2D +55 +8D +00 +3F +12 +3F +ENDCHAR +STARTCHAR C837 +ENCODING 51255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +25 +2D +D5 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C838 +ENCODING 51256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +17 +11 +37 +71 +C9 +85 +01 +01 +01 +ENDCHAR +STARTCHAR C839 +ENCODING 51257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +17 +11 +6B +85 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR C83A +ENCODING 51258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +17 +11 +6B +85 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C83B +ENCODING 51259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1700 +1100 +6B00 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C83C +ENCODING 51260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +37 +49 +89 +01 +41 +40 +40 +3F +ENDCHAR +STARTCHAR C83D +ENCODING 51261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +17 +11 +6B +85 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C83E +ENCODING 51262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C83F +ENCODING 51263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +17 +11 +6B +85 +00 +7E +40 +7E +ENDCHAR +STARTCHAR C840 +ENCODING 51264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +77 +8D +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C841 +ENCODING 51265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C842 +ENCODING 51266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C843 +ENCODING 51267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C844 +ENCODING 51268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C845 +ENCODING 51269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C846 +ENCODING 51270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C847 +ENCODING 51271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C848 +ENCODING 51272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +37 +49 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C849 +ENCODING 51273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +37 +49 +85 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C84A +ENCODING 51274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1700 +1100 +6B00 +8500 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C84B +ENCODING 51275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +17 +11 +6B +85 +00 +08 +14 +63 +ENDCHAR +STARTCHAR C84C +ENCODING 51276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0F00 +1100 +3700 +4900 +8500 +0100 +2200 +3200 +7500 +4C80 +ENDCHAR +STARTCHAR C84D +ENCODING 51277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +11 +37 +49 +85 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C84E +ENCODING 51278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1700 +1100 +6B00 +8500 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR C84F +ENCODING 51279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1300 +3700 +4900 +8500 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C850 +ENCODING 51280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +17 +11 +6B +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C851 +ENCODING 51281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR C852 +ENCODING 51282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +17 +11 +6B +85 +00 +3F +12 +3F +ENDCHAR +STARTCHAR C853 +ENCODING 51283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +13 +37 +49 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C854 +ENCODING 51284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +1D +25 +2D +55 +95 +8D +05 +05 +05 +ENDCHAR +STARTCHAR C855 +ENCODING 51285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C856 +ENCODING 51286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C857 +ENCODING 51287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +2500 +5D00 +8D00 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C858 +ENCODING 51288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +25 +6D +95 +05 +01 +20 +3F +ENDCHAR +STARTCHAR C859 +ENCODING 51289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +2500 +5D00 +8D00 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C85A +ENCODING 51290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR C85B +ENCODING 51291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +3F +40 +7F +ENDCHAR +STARTCHAR C85C +ENCODING 51292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C85D +ENCODING 51293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR C85E +ENCODING 51294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR C85F +ENCODING 51295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR C860 +ENCODING 51296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C861 +ENCODING 51297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR C862 +ENCODING 51298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C863 +ENCODING 51299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR C864 +ENCODING 51300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +3F +41 +7F +ENDCHAR +STARTCHAR C865 +ENCODING 51301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +21 +3F +3F +ENDCHAR +STARTCHAR C866 +ENCODING 51302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +2500 +5D00 +8D00 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR C867 +ENCODING 51303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +2D +55 +8D +00 +08 +14 +63 +ENDCHAR +STARTCHAR C868 +ENCODING 51304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +2500 +5D00 +8D00 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C869 +ENCODING 51305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +2D +55 +8D +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR C86A +ENCODING 51306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +2500 +5D00 +8D00 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR C86B +ENCODING 51307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +2D00 +2D00 +D500 +0100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR C86C +ENCODING 51308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C86D +ENCODING 51309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C86E +ENCODING 51310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +25 +5D +8D +00 +3F +12 +3F +ENDCHAR +STARTCHAR C86F +ENCODING 51311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +2D +2D +D5 +01 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C870 +ENCODING 51312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F00 +0100 +0200 +0C00 +3300 +6480 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR C871 +ENCODING 51313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0400 +0400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR C872 +ENCODING 51314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR C873 +ENCODING 51315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7E00 +0C00 +7700 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C874 +ENCODING 51316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0300 +0C00 +7380 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C875 +ENCODING 51317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C876 +ENCODING 51318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C877 +ENCODING 51319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +0C +77 +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR C878 +ENCODING 51320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0C00 +7380 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C879 +ENCODING 51321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C87A +ENCODING 51322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +0000 +3B80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR C87B +ENCODING 51323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C87C +ENCODING 51324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C87D +ENCODING 51325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C87E +ENCODING 51326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C87F +ENCODING 51327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C880 +ENCODING 51328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C881 +ENCODING 51329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C882 +ENCODING 51330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C883 +ENCODING 51331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0400 +FFC0 +0000 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR C884 +ENCODING 51332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C885 +ENCODING 51333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C886 +ENCODING 51334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0400 +FFC0 +0000 +3F00 +0100 +0E00 +7180 +ENDCHAR +STARTCHAR C887 +ENCODING 51335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +0000 +1E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR C888 +ENCODING 51336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +0C +77 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C889 +ENCODING 51337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0E00 +7180 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C88A +ENCODING 51338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +0C +77 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C88B +ENCODING 51339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0C00 +7380 +0400 +FFC0 +0000 +1E00 +0000 +3F80 +1100 +1E00 +ENDCHAR +STARTCHAR C88C +ENCODING 51340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1880 +2C80 +42C0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C88D +ENCODING 51341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0880 +3C80 +52C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C88E +ENCODING 51342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +3F00 +0880 +0880 +ENDCHAR +STARTCHAR C88F +ENCODING 51343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR C890 +ENCODING 51344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3C80 +0C80 +1C80 +62C0 +1080 +FE80 +0000 +2000 +3F00 +ENDCHAR +STARTCHAR C891 +ENCODING 51345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C892 +ENCODING 51346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C893 +ENCODING 51347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +3F80 +2000 +3F00 +ENDCHAR +STARTCHAR C894 +ENCODING 51348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +1880 +66C0 +1080 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C895 +ENCODING 51349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C896 +ENCODING 51350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C897 +ENCODING 51351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR C898 +ENCODING 51352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C899 +ENCODING 51353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR C89A +ENCODING 51354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C89B +ENCODING 51355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C89C +ENCODING 51356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR C89D +ENCODING 51357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1880 +66C0 +1080 +FE80 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C89E +ENCODING 51358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +0900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR C89F +ENCODING 51359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1880 +66C0 +1080 +FE80 +0080 +0400 +0600 +1B00 +2080 +ENDCHAR +STARTCHAR C8A0 +ENCODING 51360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +1100 +1100 +2A80 +4400 +ENDCHAR +STARTCHAR C8A1 +ENCODING 51361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +1880 +66C0 +1080 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C8A2 +ENCODING 51362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +1F00 +0300 +1F80 +2000 +ENDCHAR +STARTCHAR C8A3 +ENCODING 51363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR C8A4 +ENCODING 51364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +3F00 +1F80 +0080 +ENDCHAR +STARTCHAR C8A5 +ENCODING 51365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C8A6 +ENCODING 51366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3C80 +0880 +7EC0 +1080 +FE80 +0000 +3F80 +1100 +3F80 +ENDCHAR +STARTCHAR C8A7 +ENCODING 51367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +0880 +76C0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR C8A8 +ENCODING 51368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +1280 +6A80 +8780 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR C8A9 +ENCODING 51369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C8AA +ENCODING 51370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C8AB +ENCODING 51371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +DF00 +2500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C8AC +ENCODING 51372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +75 +8F +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR C8AD +ENCODING 51373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +DF00 +2500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C8AE +ENCODING 51374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C8AF +ENCODING 51375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR C8B0 +ENCODING 51376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C8B1 +ENCODING 51377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C8B2 +ENCODING 51378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR C8B3 +ENCODING 51379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C8B4 +ENCODING 51380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR C8B5 +ENCODING 51381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C8B6 +ENCODING 51382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C8B7 +ENCODING 51383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR C8B8 +ENCODING 51384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR C8B9 +ENCODING 51385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR C8BA +ENCODING 51386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +DF00 +2500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C8BB +ENCODING 51387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR C8BC +ENCODING 51388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7A80 +0A80 +3280 +4F80 +1280 +FE80 +0000 +1100 +1100 +3A80 +2640 +ENDCHAR +STARTCHAR C8BD +ENCODING 51389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +3280 +4F80 +1280 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C8BE +ENCODING 51390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +DF00 +2500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C8BF +ENCODING 51391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR C8C0 +ENCODING 51392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C8C1 +ENCODING 51393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C8C2 +ENCODING 51394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +DF +25 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR C8C3 +ENCODING 51395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +1280 +6F80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR C8C4 +ENCODING 51396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +1880 +2C80 +4280 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C8C5 +ENCODING 51397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +21 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C8C6 +ENCODING 51398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +21 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C8C7 +ENCODING 51399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +FD00 +2100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C8C8 +ENCODING 51400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +21 +21 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR C8C9 +ENCODING 51401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +21 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C8CA +ENCODING 51402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C8CB +ENCODING 51403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +21 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR C8CC +ENCODING 51404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +31 +CD +21 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C8CD +ENCODING 51405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C8CE +ENCODING 51406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C8CF +ENCODING 51407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C8D0 +ENCODING 51408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C8D1 +ENCODING 51409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C8D2 +ENCODING 51410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C8D3 +ENCODING 51411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C8D4 +ENCODING 51412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +21 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C8D5 +ENCODING 51413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +21 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C8D6 +ENCODING 51414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +21 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C8D7 +ENCODING 51415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +21 +FF +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR C8D8 +ENCODING 51416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +21 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C8D9 +ENCODING 51417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +21 +FF +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR C8DA +ENCODING 51418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +FD00 +2100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C8DB +ENCODING 51419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +ED00 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C8DC +ENCODING 51420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +21 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR C8DD +ENCODING 51421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C8DE +ENCODING 51422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +21 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR C8DF +ENCODING 51423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C8E0 +ENCODING 51424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F00 +0100 +0200 +0400 +1B00 +6080 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR C8E1 +ENCODING 51425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +1200 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C8E2 +ENCODING 51426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR C8E3 +ENCODING 51427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7E00 +0C00 +7700 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR C8E4 +ENCODING 51428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +1200 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C8E5 +ENCODING 51429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C8E6 +ENCODING 51430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR C8E7 +ENCODING 51431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +0C +77 +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR C8E8 +ENCODING 51432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR C8E9 +ENCODING 51433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C8EA +ENCODING 51434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C8EB +ENCODING 51435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR C8EC +ENCODING 51436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C8ED +ENCODING 51437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C8EE +ENCODING 51438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR C8EF +ENCODING 51439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR C8F0 +ENCODING 51440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +0C +77 +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR C8F1 +ENCODING 51441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +0C +77 +24 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR C8F2 +ENCODING 51442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR C8F3 +ENCODING 51443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR C8F4 +ENCODING 51444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR C8F5 +ENCODING 51445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +1200 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C8F6 +ENCODING 51446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR C8F7 +ENCODING 51447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR C8F8 +ENCODING 51448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +0C +77 +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR C8F9 +ENCODING 51449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR C8FA +ENCODING 51450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +0C +77 +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR C8FB +ENCODING 51451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0E00 +7180 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR C8FC +ENCODING 51452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0300 +0400 +1B00 +6080 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR C8FD +ENCODING 51453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C8FE +ENCODING 51454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C8FF +ENCODING 51455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C900 +ENCODING 51456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR C901 +ENCODING 51457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C902 +ENCODING 51458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR C903 +ENCODING 51459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C904 +ENCODING 51460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0C00 +7380 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C905 +ENCODING 51461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0C00 +7380 +0000 +FFC0 +0400 +3F80 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C906 +ENCODING 51462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0C00 +7380 +0000 +FFC0 +0400 +3F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR C907 +ENCODING 51463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C908 +ENCODING 51464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C909 +ENCODING 51465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C90A +ENCODING 51466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C90B +ENCODING 51467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR C90C +ENCODING 51468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C90D +ENCODING 51469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0400 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C90E +ENCODING 51470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C90F +ENCODING 51471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0400 +0400 +0C00 +1300 +6080 +ENDCHAR +STARTCHAR C910 +ENCODING 51472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C911 +ENCODING 51473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C912 +ENCODING 51474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +0C +73 +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR C913 +ENCODING 51475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C914 +ENCODING 51476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C915 +ENCODING 51477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +1C +E3 +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR C916 +ENCODING 51478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C917 +ENCODING 51479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C918 +ENCODING 51480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +1880 +6680 +0080 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR C919 +ENCODING 51481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR C91A +ENCODING 51482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C91B +ENCODING 51483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C91C +ENCODING 51484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +19 +79 +85 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR C91D +ENCODING 51485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C91E +ENCODING 51486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C91F +ENCODING 51487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +DD +27 +21 +3F +40 +7E +ENDCHAR +STARTCHAR C920 +ENCODING 51488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR C921 +ENCODING 51489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C922 +ENCODING 51490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C923 +ENCODING 51491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C924 +ENCODING 51492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C925 +ENCODING 51493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C926 +ENCODING 51494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C927 +ENCODING 51495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR C928 +ENCODING 51496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +DD +27 +21 +7F +41 +7F +ENDCHAR +STARTCHAR C929 +ENCODING 51497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +DD +27 +21 +41 +7F +7F +ENDCHAR +STARTCHAR C92A +ENCODING 51498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C92B +ENCODING 51499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +DD +27 +21 +08 +14 +63 +ENDCHAR +STARTCHAR C92C +ENCODING 51500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0F00 +3100 +CD00 +0100 +FD00 +2000 +2200 +2200 +5500 +C880 +ENDCHAR +STARTCHAR C92D +ENCODING 51501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C92E +ENCODING 51502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +ED00 +DD00 +2700 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C92F +ENCODING 51503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +ED00 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C930 +ENCODING 51504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C931 +ENCODING 51505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C932 +ENCODING 51506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +DD +27 +21 +3F +12 +3F +ENDCHAR +STARTCHAR C933 +ENCODING 51507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR C934 +ENCODING 51508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +3280 +CE80 +0280 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR C935 +ENCODING 51509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C936 +ENCODING 51510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C937 +ENCODING 51511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +D500 +1D00 +E500 +2900 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C938 +ENCODING 51512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +1280 +7A80 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR C939 +ENCODING 51513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +D500 +1D00 +E500 +2900 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR C93A +ENCODING 51514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR C93B +ENCODING 51515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +3F +40 +7F +ENDCHAR +STARTCHAR C93C +ENCODING 51516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR C93D +ENCODING 51517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR C93E +ENCODING 51518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR C93F +ENCODING 51519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR C940 +ENCODING 51520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR C941 +ENCODING 51521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR C942 +ENCODING 51522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR C943 +ENCODING 51523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR C944 +ENCODING 51524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +3F +41 +7F +ENDCHAR +STARTCHAR C945 +ENCODING 51525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +41 +7F +7F +ENDCHAR +STARTCHAR C946 +ENCODING 51526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +D500 +1D00 +E500 +2900 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C947 +ENCODING 51527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +08 +1C +63 +ENDCHAR +STARTCHAR C948 +ENCODING 51528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +02 +22 +55 +08 +ENDCHAR +STARTCHAR C949 +ENCODING 51529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +3E +41 +61 +1E +ENDCHAR +STARTCHAR C94A +ENCODING 51530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +2500 +D500 +1D00 +E500 +2900 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C94B +ENCODING 51531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR C94C +ENCODING 51532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +3F +01 +3F +01 +ENDCHAR +STARTCHAR C94D +ENCODING 51533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR C94E +ENCODING 51534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +25 +D5 +1D +E5 +29 +3F +12 +3F +ENDCHAR +STARTCHAR C94F +ENCODING 51535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3280 +4A80 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR C950 +ENCODING 51536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3C80 +0480 +0880 +1880 +6680 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR C951 +ENCODING 51537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +01 +FD +20 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C952 +ENCODING 51538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR C953 +ENCODING 51539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR C954 +ENCODING 51540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR C955 +ENCODING 51541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR C956 +ENCODING 51542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR C957 +ENCODING 51543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR C958 +ENCODING 51544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +31 +CD +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR C959 +ENCODING 51545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR C95A +ENCODING 51546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR C95B +ENCODING 51547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR C95C +ENCODING 51548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR C95D +ENCODING 51549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR C95E +ENCODING 51550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR C95F +ENCODING 51551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR C960 +ENCODING 51552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +01 +FD +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR C961 +ENCODING 51553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +09 +31 +CD +01 +FD +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR C962 +ENCODING 51554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR C963 +ENCODING 51555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7900 +0900 +3100 +CD00 +0100 +FF00 +2100 +2800 +0C00 +3600 +6180 +ENDCHAR +STARTCHAR C964 +ENCODING 51556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C965 +ENCODING 51557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C966 +ENCODING 51558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +ED00 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C967 +ENCODING 51559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +ED00 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C968 +ENCODING 51560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR C969 +ENCODING 51561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR C96A +ENCODING 51562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +ED +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR C96B +ENCODING 51563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C96C +ENCODING 51564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0300 +0400 +1B00 +6080 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR C96D +ENCODING 51565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR C96E +ENCODING 51566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C96F +ENCODING 51567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C970 +ENCODING 51568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR C971 +ENCODING 51569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C972 +ENCODING 51570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR C973 +ENCODING 51571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C974 +ENCODING 51572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0C00 +7380 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C975 +ENCODING 51573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR C976 +ENCODING 51574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR C977 +ENCODING 51575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR C978 +ENCODING 51576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR C979 +ENCODING 51577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR C97A +ENCODING 51578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR C97B +ENCODING 51579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR C97C +ENCODING 51580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0300 +0C00 +7380 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C97D +ENCODING 51581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR C97E +ENCODING 51582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C97F +ENCODING 51583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR C980 +ENCODING 51584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR C981 +ENCODING 51585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR C982 +ENCODING 51586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C983 +ENCODING 51587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR C984 +ENCODING 51588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR C985 +ENCODING 51589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +1C +E3 +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR C986 +ENCODING 51590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3980 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C987 +ENCODING 51591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR C988 +ENCODING 51592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F00 +0100 +0200 +0C00 +1300 +6080 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR C989 +ENCODING 51593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7380 +0000 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C98A +ENCODING 51594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR C98B +ENCODING 51595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR C98C +ENCODING 51596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0300 +0C00 +7380 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C98D +ENCODING 51597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR C98E +ENCODING 51598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C98F +ENCODING 51599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR C990 +ENCODING 51600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0E00 +7180 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C991 +ENCODING 51601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR C992 +ENCODING 51602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR C993 +ENCODING 51603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR C994 +ENCODING 51604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C995 +ENCODING 51605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR C996 +ENCODING 51606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR C997 +ENCODING 51607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR C998 +ENCODING 51608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C999 +ENCODING 51609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7380 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C99A +ENCODING 51610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR C99B +ENCODING 51611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0200 +0E00 +7180 +0000 +FFC0 +0000 +0400 +0C00 +1300 +6180 +ENDCHAR +STARTCHAR C99C +ENCODING 51612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR C99D +ENCODING 51613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0100 +0E00 +7180 +0000 +FFC0 +0000 +1F00 +2100 +2100 +1F00 +ENDCHAR +STARTCHAR C99E +ENCODING 51614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR C99F +ENCODING 51615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR C9A0 +ENCODING 51616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR C9A1 +ENCODING 51617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +1C +E3 +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR C9A2 +ENCODING 51618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +0600 +3B80 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR C9A3 +ENCODING 51619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +1C +E3 +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR C9A4 +ENCODING 51620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +31 +59 +85 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR C9A5 +ENCODING 51621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FF +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C9A6 +ENCODING 51622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FF +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C9A7 +ENCODING 51623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +FD00 +0100 +FF00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C9A8 +ENCODING 51624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +19 +39 +C5 +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR C9A9 +ENCODING 51625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FF +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR C9AA +ENCODING 51626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR C9AB +ENCODING 51627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +01 +FF +01 +3F +40 +7E +ENDCHAR +STARTCHAR C9AC +ENCODING 51628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR C9AD +ENCODING 51629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR C9AE +ENCODING 51630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR C9AF +ENCODING 51631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C9B0 +ENCODING 51632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR C9B1 +ENCODING 51633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C9B2 +ENCODING 51634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR C9B3 +ENCODING 51635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR C9B4 +ENCODING 51636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +01 +FF +01 +7F +41 +7F +ENDCHAR +STARTCHAR C9B5 +ENCODING 51637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +01 +FF +01 +41 +7F +7F +ENDCHAR +STARTCHAR C9B6 +ENCODING 51638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FF +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR C9B7 +ENCODING 51639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +01 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR C9B8 +ENCODING 51640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FF +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR C9B9 +ENCODING 51641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR C9BA +ENCODING 51642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +FD00 +0100 +FF00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR C9BB +ENCODING 51643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +ED00 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR C9BC +ENCODING 51644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +FD +01 +FF +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR C9BD +ENCODING 51645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR C9BE +ENCODING 51646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +11 +FD +01 +FF +01 +7F +12 +3F +ENDCHAR +STARTCHAR C9BF +ENCODING 51647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +ED +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR C9C0 +ENCODING 51648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +11 +31 +31 +C9 +85 +01 +01 +01 +ENDCHAR +STARTCHAR C9C1 +ENCODING 51649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +49 +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR C9C2 +ENCODING 51650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +11 +11 +69 +85 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR C9C3 +ENCODING 51651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1100 +1100 +6900 +8500 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR C9C4 +ENCODING 51652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +49 +85 +01 +20 +20 +20 +3F +ENDCHAR +STARTCHAR C9C5 +ENCODING 51653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +11 +11 +69 +85 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR C9C6 +ENCODING 51654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR C9C7 +ENCODING 51655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +69 +85 +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR C9C8 +ENCODING 51656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +69 +85 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR C9C9 +ENCODING 51657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR C9CA +ENCODING 51658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +69 +85 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C9CB +ENCODING 51659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR C9CC +ENCODING 51660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR C9CD +ENCODING 51661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR C9CE +ENCODING 51662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR C9CF +ENCODING 51663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR C9D0 +ENCODING 51664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +49 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR C9D1 +ENCODING 51665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +49 +85 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR C9D2 +ENCODING 51666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1100 +1100 +6900 +8500 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C9D3 +ENCODING 51667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +11 +31 +49 +85 +08 +14 +36 +41 +ENDCHAR +STARTCHAR C9D4 +ENCODING 51668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1100 +1100 +6900 +8500 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR C9D5 +ENCODING 51669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +49 +85 +01 +3E +21 +21 +3E +ENDCHAR +STARTCHAR C9D6 +ENCODING 51670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +3100 +4900 +8500 +0000 +3F00 +0200 +0C00 +7380 +ENDCHAR +STARTCHAR C9D7 +ENCODING 51671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +1100 +3100 +4900 +8500 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR C9D8 +ENCODING 51672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +11 +11 +69 +85 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR C9D9 +ENCODING 51673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +69 +85 +00 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR C9DA +ENCODING 51674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +11 +31 +49 +85 +00 +7F +12 +12 +7F +ENDCHAR +STARTCHAR C9DB +ENCODING 51675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +11 +31 +49 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR C9DC +ENCODING 51676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +2480 +2480 +5CC0 +4A80 +9280 +1080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C9DD +ENCODING 51677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +3480 +5AC0 +8A80 +1080 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C9DE +ENCODING 51678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR C9DF +ENCODING 51679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR C9E0 +ENCODING 51680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +2480 +54C0 +8A80 +1080 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR C9E1 +ENCODING 51681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4900 +6980 +9500 +2100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR C9E2 +ENCODING 51682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +5A80 +8880 +1000 +0300 +2000 +2780 +2480 +3B80 +ENDCHAR +STARTCHAR C9E3 +ENCODING 51683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR C9E4 +ENCODING 51684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +34C0 +CA80 +1080 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR C9E5 +ENCODING 51685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR C9E6 +ENCODING 51686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3B00 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR C9E7 +ENCODING 51687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +34C0 +CA80 +1080 +0000 +3C80 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR C9E8 +ENCODING 51688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR C9E9 +ENCODING 51689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR C9EA +ENCODING 51690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR C9EB +ENCODING 51691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3B00 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR C9EC +ENCODING 51692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +5A80 +8A80 +1080 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR C9ED +ENCODING 51693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +5A80 +8A80 +1080 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR C9EE +ENCODING 51694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR C9EF +ENCODING 51695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +1480 +2480 +34C0 +4A80 +8A80 +1080 +0400 +0400 +1B00 +20C0 +ENDCHAR +STARTCHAR C9F0 +ENCODING 51696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +5A80 +8A80 +1080 +0000 +1100 +1100 +2A80 +4440 +ENDCHAR +STARTCHAR C9F1 +ENCODING 51697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +2480 +5AC0 +8A80 +1080 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR C9F2 +ENCODING 51698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR C9F3 +ENCODING 51699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR C9F4 +ENCODING 51700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR C9F5 +ENCODING 51701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +3F80 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR C9F6 +ENCODING 51702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4900 +6980 +9500 +2100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR C9F7 +ENCODING 51703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +34C0 +CA80 +1000 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR C9F8 +ENCODING 51704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2980 +2980 +2980 +5580 +5580 +9580 +2180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR C9F9 +ENCODING 51705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2580 +2980 +5580 +9580 +2180 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR C9FA +ENCODING 51706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +53 +AD +25 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR C9FB +ENCODING 51707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5300 +AD00 +2500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR C9FC +ENCODING 51708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7980 +2580 +2980 +5D80 +9580 +2180 +0180 +1180 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR C9FD +ENCODING 51709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5300 +AD00 +2500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR C9FE +ENCODING 51710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR C9FF +ENCODING 51711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +53 +AD +25 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CA00 +ENCODING 51712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2980 +6980 +9580 +2180 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA01 +ENCODING 51713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR CA02 +ENCODING 51714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR CA03 +ENCODING 51715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CA04 +ENCODING 51716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR CA05 +ENCODING 51717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CA06 +ENCODING 51718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CA07 +ENCODING 51719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR CA08 +ENCODING 51720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7D80 +2580 +2980 +5980 +9580 +2180 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR CA09 +ENCODING 51721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2580 +2980 +5980 +9580 +2180 +0000 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR CA0A +ENCODING 51722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5300 +AD00 +2500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CA0B +ENCODING 51723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7980 +2580 +2980 +2980 +5580 +9580 +2080 +0400 +0600 +0B00 +30C0 +ENDCHAR +STARTCHAR CA0C +ENCODING 51724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7980 +2580 +2980 +5580 +9580 +2180 +0000 +0900 +1900 +1A80 +2640 +ENDCHAR +STARTCHAR CA0D +ENCODING 51725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2580 +2980 +5580 +9580 +2180 +0000 +1F00 +1080 +1080 +1F00 +ENDCHAR +STARTCHAR CA0E +ENCODING 51726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5300 +AD00 +2500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CA0F +ENCODING 51727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR CA10 +ENCODING 51728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +53 +AD +25 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CA11 +ENCODING 51729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA12 +ENCODING 51730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +53 +AD +25 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CA13 +ENCODING 51731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6980 +9680 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR CA14 +ENCODING 51732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +2480 +5C80 +4AC0 +9280 +1080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CA15 +ENCODING 51733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR CA16 +ENCODING 51734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR CA17 +ENCODING 51735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR CA18 +ENCODING 51736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +5C80 +8A80 +10C0 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CA19 +ENCODING 51737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CA1A +ENCODING 51738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CA1B +ENCODING 51739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR CA1C +ENCODING 51740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3F00 +0080 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR CA1D +ENCODING 51741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CA1E +ENCODING 51742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3B00 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CA1F +ENCODING 51743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3400 +0C80 +3F80 +4480 +3F00 +ENDCHAR +STARTCHAR CA20 +ENCODING 51744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CA21 +ENCODING 51745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CA22 +ENCODING 51746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CA23 +ENCODING 51747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3B00 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CA24 +ENCODING 51748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR CA25 +ENCODING 51749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR CA26 +ENCODING 51750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CA27 +ENCODING 51751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR CA28 +ENCODING 51752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR CA29 +ENCODING 51753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +6C80 +2480 +24C0 +5A80 +8AC0 +1080 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CA2A +ENCODING 51754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR CA2B +ENCODING 51755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR CA2C +ENCODING 51756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR CA2D +ENCODING 51757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +3F80 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR CA2E +ENCODING 51758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +D900 +4980 +6900 +9580 +2100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR CA2F +ENCODING 51759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +24C0 +3480 +CAC0 +1000 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR CA30 +ENCODING 51760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +2B80 +2A80 +5A80 +9580 +2280 +0280 +0280 +0080 +ENDCHAR +STARTCHAR CA31 +ENCODING 51761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CA32 +ENCODING 51762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CA33 +ENCODING 51763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5300 +5500 +AB00 +2500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CA34 +ENCODING 51764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2780 +2A80 +5E80 +9380 +2280 +0080 +1000 +1F80 +ENDCHAR +STARTCHAR CA35 +ENCODING 51765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5300 +5500 +AB00 +2500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CA36 +ENCODING 51766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR CA37 +ENCODING 51767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CA38 +ENCODING 51768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA39 +ENCODING 51769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR CA3A +ENCODING 51770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR CA3B +ENCODING 51771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CA3C +ENCODING 51772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR CA3D +ENCODING 51773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CA3E +ENCODING 51774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CA3F +ENCODING 51775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR CA40 +ENCODING 51776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +3F +41 +7F +ENDCHAR +STARTCHAR CA41 +ENCODING 51777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +21 +3F +3F +ENDCHAR +STARTCHAR CA42 +ENCODING 51778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5300 +5500 +AB00 +2500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CA43 +ENCODING 51779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +53 +55 +AB +25 +01 +08 +14 +63 +ENDCHAR +STARTCHAR CA44 +ENCODING 51780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5300 +5500 +AB00 +2500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CA45 +ENCODING 51781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +53 +55 +AB +25 +0D +33 +41 +21 +1E +ENDCHAR +STARTCHAR CA46 +ENCODING 51782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5300 +5500 +AB00 +2500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CA47 +ENCODING 51783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR CA48 +ENCODING 51784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CA49 +ENCODING 51785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA4A +ENCODING 51786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +53 +55 +AB +25 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CA4B +ENCODING 51787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2980 +6A80 +9580 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR CA4C +ENCODING 51788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +6C80 +2480 +2480 +2780 +5C80 +4A80 +9280 +2080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CA4D +ENCODING 51789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +6F +95 +95 +21 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CA4E +ENCODING 51790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4F +69 +95 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CA4F +ENCODING 51791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4F00 +6900 +9500 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CA50 +ENCODING 51792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +2480 +2780 +5480 +8A80 +1080 +0080 +2080 +2000 +2000 +1F80 +ENDCHAR +STARTCHAR CA51 +ENCODING 51793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4F +69 +95 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR CA52 +ENCODING 51794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR CA53 +ENCODING 51795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4F +69 +95 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR CA54 +ENCODING 51796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +2780 +3480 +CA80 +1080 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA55 +ENCODING 51797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR CA56 +ENCODING 51798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CA57 +ENCODING 51799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CA58 +ENCODING 51800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CA59 +ENCODING 51801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CA5A +ENCODING 51802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CA5B +ENCODING 51803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR CA5C +ENCODING 51804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +4F +B5 +95 +21 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CA5D +ENCODING 51805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +2480 +3780 +4A80 +8A80 +1080 +0000 +2080 +1F80 +2080 +1F80 +ENDCHAR +STARTCHAR CA5E +ENCODING 51806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4F00 +6900 +9500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CA5F +ENCODING 51807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +1480 +2780 +3480 +4A80 +8A80 +1080 +0400 +0600 +1B00 +20C0 +ENDCHAR +STARTCHAR CA60 +ENCODING 51808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +4900 +4F00 +B500 +9500 +2100 +0000 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR CA61 +ENCODING 51809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +4F +B5 +95 +21 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR CA62 +ENCODING 51810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4F00 +6900 +9500 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR CA63 +ENCODING 51811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4F00 +6900 +9500 +2100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR CA64 +ENCODING 51812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4F +69 +95 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CA65 +ENCODING 51813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR CA66 +ENCODING 51814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4F +69 +95 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CA67 +ENCODING 51815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +4F +69 +95 +21 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CA68 +ENCODING 51816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2980 +2980 +2F80 +5980 +5580 +9580 +2180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR CA69 +ENCODING 51817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CA6A +ENCODING 51818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CA6B +ENCODING 51819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5300 +5700 +AB00 +2300 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CA6C +ENCODING 51820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7980 +2580 +2A80 +5D80 +9180 +2180 +0080 +1000 +1F80 +ENDCHAR +STARTCHAR CA6D +ENCODING 51821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5300 +5700 +AB00 +2300 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CA6E +ENCODING 51822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR CA6F +ENCODING 51823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CA70 +ENCODING 51824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA71 +ENCODING 51825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR CA72 +ENCODING 51826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR CA73 +ENCODING 51827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CA74 +ENCODING 51828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR CA75 +ENCODING 51829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CA76 +ENCODING 51830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CA77 +ENCODING 51831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR CA78 +ENCODING 51832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +3F +41 +7F +ENDCHAR +STARTCHAR CA79 +ENCODING 51833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +21 +3F +3F +ENDCHAR +STARTCHAR CA7A +ENCODING 51834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5300 +5700 +AB00 +2300 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CA7B +ENCODING 51835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +08 +14 +63 +ENDCHAR +STARTCHAR CA7C +ENCODING 51836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5300 +5700 +AB00 +2300 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CA7D +ENCODING 51837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7980 +2580 +2B80 +6980 +9580 +2180 +0000 +1F00 +1080 +1080 +1F00 +ENDCHAR +STARTCHAR CA7E +ENCODING 51838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5300 +5700 +AB00 +2300 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CA7F +ENCODING 51839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR CA80 +ENCODING 51840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CA81 +ENCODING 51841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CA82 +ENCODING 51842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +53 +57 +AB +23 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CA83 +ENCODING 51843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2A80 +6980 +9580 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR CA84 +ENCODING 51844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +6C80 +2480 +2580 +2480 +5D80 +4A80 +9280 +2080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CA85 +ENCODING 51845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR CA86 +ENCODING 51846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CA87 +ENCODING 51847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4B00 +6B00 +9500 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CA88 +ENCODING 51848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +2580 +2580 +5E80 +8880 +1080 +0000 +1000 +1F80 +ENDCHAR +STARTCHAR CA89 +ENCODING 51849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4B +6B +95 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR CA8A +ENCODING 51850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR CA8B +ENCODING 51851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR CA8C +ENCODING 51852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CA8D +ENCODING 51853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR CA8E +ENCODING 51854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CA8F +ENCODING 51855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CA90 +ENCODING 51856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CA91 +ENCODING 51857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CA92 +ENCODING 51858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CA93 +ENCODING 51859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR CA94 +ENCODING 51860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +7F +41 +7F +ENDCHAR +STARTCHAR CA95 +ENCODING 51861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4B +6B +95 +21 +01 +41 +7F +7F +ENDCHAR +STARTCHAR CA96 +ENCODING 51862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4B00 +6B00 +9500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CA97 +ENCODING 51863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +08 +14 +63 +ENDCHAR +STARTCHAR CA98 +ENCODING 51864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2B00 +4900 +6B00 +9500 +2100 +0000 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR CA99 +ENCODING 51865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4B +6B +95 +21 +0C +32 +41 +23 +1C +ENDCHAR +STARTCHAR CA9A +ENCODING 51866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4B00 +6B00 +9500 +2100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR CA9B +ENCODING 51867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FB00 +4900 +6F00 +9500 +2100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR CA9C +ENCODING 51868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CA9D +ENCODING 51869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR CA9E +ENCODING 51870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +4B +6B +95 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CA9F +ENCODING 51871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FB +49 +6F +95 +21 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CAA0 +ENCODING 51872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2580 +2A80 +2980 +5A80 +9580 +2180 +0180 +0180 +0080 +ENDCHAR +STARTCHAR CAA1 +ENCODING 51873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CAA2 +ENCODING 51874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CAA3 +ENCODING 51875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5700 +5500 +AB00 +2300 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CAA4 +ENCODING 51876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7980 +2680 +2A80 +5D80 +9180 +2180 +0080 +1000 +1F80 +ENDCHAR +STARTCHAR CAA5 +ENCODING 51877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5700 +5500 +AB00 +2300 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CAA6 +ENCODING 51878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR CAA7 +ENCODING 51879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CAA8 +ENCODING 51880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CAA9 +ENCODING 51881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3B80 +0480 +3C80 +2080 +1C00 +ENDCHAR +STARTCHAR CAAA +ENCODING 51882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3B80 +0680 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR CAAB +ENCODING 51883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3A00 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CAAC +ENCODING 51884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3900 +0900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR CAAD +ENCODING 51885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3B80 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CAAE +ENCODING 51886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3100 +0A80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CAAF +ENCODING 51887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +3B80 +0F80 +3B80 +2280 +3B00 +ENDCHAR +STARTCHAR CAB0 +ENCODING 51888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +3F +41 +7F +ENDCHAR +STARTCHAR CAB1 +ENCODING 51889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +21 +3F +3F +ENDCHAR +STARTCHAR CAB2 +ENCODING 51890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5700 +5500 +AB00 +2300 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CAB3 +ENCODING 51891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +08 +14 +63 +ENDCHAR +STARTCHAR CAB4 +ENCODING 51892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5700 +5500 +AB00 +2300 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CAB5 +ENCODING 51893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +57 +55 +AB +23 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR CAB6 +ENCODING 51894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +5700 +5500 +AB00 +2300 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CAB7 +ENCODING 51895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR CAB8 +ENCODING 51896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CAB9 +ENCODING 51897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CABA +ENCODING 51898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +57 +55 +AB +23 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CABB +ENCODING 51899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7980 +2B80 +6A80 +9580 +2080 +0E00 +3F80 +0F00 +1100 +0F00 +ENDCHAR +STARTCHAR CABC +ENCODING 51900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7F00 +0900 +1100 +1B00 +2480 +4C80 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR CABD +ENCODING 51901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0900 +3B00 +4480 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CABE +ENCODING 51902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR CABF +ENCODING 51903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7600 +3600 +C900 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR CAC0 +ENCODING 51904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0400 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CAC1 +ENCODING 51905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR CAC2 +ENCODING 51906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CAC3 +ENCODING 51907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +36 +C9 +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR CAC4 +ENCODING 51908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1900 +6680 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CAC5 +ENCODING 51909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CAC6 +ENCODING 51910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CAC7 +ENCODING 51911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CAC8 +ENCODING 51912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CAC9 +ENCODING 51913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CACA +ENCODING 51914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR CACB +ENCODING 51915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR CACC +ENCODING 51916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR CACD +ENCODING 51917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CACE +ENCODING 51918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR CACF +ENCODING 51919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0900 +3B00 +4480 +0400 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR CAD0 +ENCODING 51920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR CAD1 +ENCODING 51921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CAD2 +ENCODING 51922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +76 +36 +C9 +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR CAD3 +ENCODING 51923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1B00 +6480 +0400 +FFC0 +0000 +1E00 +0000 +3F00 +0E00 +7180 +ENDCHAR +STARTCHAR CAD4 +ENCODING 51924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +76 +36 +C9 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR CAD5 +ENCODING 51925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR CAD6 +ENCODING 51926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +36 +C9 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR CAD7 +ENCODING 51927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR CAD8 +ENCODING 51928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2480 +2480 +DA80 +10C0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CAD9 +ENCODING 51929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +1480 +3480 +4AC0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CADA +ENCODING 51930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR CADB +ENCODING 51931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR CADC +ENCODING 51932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7E80 +2480 +5A80 +00C0 +1080 +FE80 +0000 +2000 +3F00 +ENDCHAR +STARTCHAR CADD +ENCODING 51933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CADE +ENCODING 51934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CADF +ENCODING 51935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR CAE0 +ENCODING 51936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +3480 +5AC0 +1080 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CAE1 +ENCODING 51937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CAE2 +ENCODING 51938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CAE3 +ENCODING 51939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR CAE4 +ENCODING 51940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CAE5 +ENCODING 51941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR CAE6 +ENCODING 51942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CAE7 +ENCODING 51943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CAE8 +ENCODING 51944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR CAE9 +ENCODING 51945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR CAEA +ENCODING 51946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR CAEB +ENCODING 51947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR CAEC +ENCODING 51948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +1480 +3480 +4AC0 +1080 +FE80 +0000 +1100 +1100 +2B00 +4480 +ENDCHAR +STARTCHAR CAED +ENCODING 51949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR CAEE +ENCODING 51950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR CAEF +ENCODING 51951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR CAF0 +ENCODING 51952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR CAF1 +ENCODING 51953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR CAF2 +ENCODING 51954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +B580 +2100 +2D00 +D000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR CAF3 +ENCODING 51955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7480 +3480 +5AC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR CAF4 +ENCODING 51956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +2680 +2A80 +DE80 +3180 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR CAF5 +ENCODING 51957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +55 +AF +25 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CAF6 +ENCODING 51958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +55 +AF +25 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CAF7 +ENCODING 51959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +5500 +AF00 +2500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CAF8 +ENCODING 51960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +AD +07 +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR CAF9 +ENCODING 51961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +5500 +AF00 +2500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR CAFA +ENCODING 51962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR CAFB +ENCODING 51963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +55 +AF +25 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR CAFC +ENCODING 51964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CAFD +ENCODING 51965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR CAFE +ENCODING 51966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR CAFF +ENCODING 51967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CB00 +ENCODING 51968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR CB01 +ENCODING 51969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CB02 +ENCODING 51970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CB03 +ENCODING 51971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR CB04 +ENCODING 51972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +55 +AF +25 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR CB05 +ENCODING 51973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +55 +AF +25 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR CB06 +ENCODING 51974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +5500 +AF00 +2500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CB07 +ENCODING 51975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +55 +AF +25 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR CB08 +ENCODING 51976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7E80 +2680 +2A80 +D580 +1280 +FE80 +0000 +1100 +1100 +1A80 +6440 +ENDCHAR +STARTCHAR CB09 +ENCODING 51977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +55 +AF +25 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR CB0A +ENCODING 51978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +FD00 +5500 +AF00 +2500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CB0B +ENCODING 51979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR CB0C +ENCODING 51980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +55 +AF +25 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CB0D +ENCODING 51981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CB0E +ENCODING 51982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +55 +AF +25 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR CB0F +ENCODING 51983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6E80 +2A80 +D780 +1280 +7E80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR CB10 +ENCODING 51984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +1280 +2480 +DA80 +1080 +0880 +0880 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CB11 +ENCODING 51985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CB12 +ENCODING 51986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CB13 +ENCODING 51987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +B500 +0100 +3D00 +C100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CB14 +ENCODING 51988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +29 +69 +95 +11 +11 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR CB15 +ENCODING 51989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +47 +42 +45 +30 +ENDCHAR +STARTCHAR CB16 +ENCODING 51990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR CB17 +ENCODING 51991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +3F +40 +7E +ENDCHAR +STARTCHAR CB18 +ENCODING 51992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +69 +95 +11 +FF +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR CB19 +ENCODING 51993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CB1A +ENCODING 51994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR CB1B +ENCODING 51995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CB1C +ENCODING 51996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR CB1D +ENCODING 51997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CB1E +ENCODING 51998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR CB1F +ENCODING 51999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR CB20 +ENCODING 52000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +29 +69 +95 +11 +FF +00 +7F +41 +41 +7F +ENDCHAR +STARTCHAR CB21 +ENCODING 52001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +29 +69 +95 +11 +FF +00 +41 +7F +41 +7F +ENDCHAR +STARTCHAR CB22 +ENCODING 52002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +52 +72 +55 +78 +ENDCHAR +STARTCHAR CB23 +ENCODING 52003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +08 +14 +63 +ENDCHAR +STARTCHAR CB24 +ENCODING 52004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR CB25 +ENCODING 52005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +3E +41 +63 +1C +ENDCHAR +STARTCHAR CB26 +ENCODING 52006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +B500 +0100 +3D00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CB27 +ENCODING 52007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +E900 +6900 +B500 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CB28 +ENCODING 52008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +7F +3F +01 +01 +ENDCHAR +STARTCHAR CB29 +ENCODING 52009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR CB2A +ENCODING 52010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +B5 +01 +3D +C1 +7F +12 +3F +ENDCHAR +STARTCHAR CB2B +ENCODING 52011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CB2C +ENCODING 52012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 8 0 0 +BITMAP +7F00 +0900 +1200 +2F80 +4C00 +1000 +1100 +FFC0 +ENDCHAR +STARTCHAR CB2D +ENCODING 52013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR CB2E +ENCODING 52014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR CB2F +ENCODING 52015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7600 +3600 +C900 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR CB30 +ENCODING 52016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +32 +CD +24 +24 +DB +40 +40 +7E +ENDCHAR +STARTCHAR CB31 +ENCODING 52017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR CB32 +ENCODING 52018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CB33 +ENCODING 52019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +36 +C9 +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR CB34 +ENCODING 52020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR CB35 +ENCODING 52021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CB36 +ENCODING 52022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CB37 +ENCODING 52023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CB38 +ENCODING 52024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CB39 +ENCODING 52025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CB3A +ENCODING 52026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR CB3B +ENCODING 52027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR CB3C +ENCODING 52028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +36 +C9 +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR CB3D +ENCODING 52029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +36 +C9 +24 +FF +00 +41 +7E +7F +ENDCHAR +STARTCHAR CB3E +ENCODING 52030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR CB3F +ENCODING 52031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +08 +18 +66 +81 +ENDCHAR +STARTCHAR CB40 +ENCODING 52032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR CB41 +ENCODING 52033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +1200 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CB42 +ENCODING 52034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR CB43 +ENCODING 52035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR CB44 +ENCODING 52036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +76 +36 +C9 +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR CB45 +ENCODING 52037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR CB46 +ENCODING 52038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +36 +C9 +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR CB47 +ENCODING 52039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +3B00 +4480 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR CB48 +ENCODING 52040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7F00 +0900 +3900 +46C0 +0C00 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR CB49 +ENCODING 52041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CB4A +ENCODING 52042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR CB4B +ENCODING 52043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR CB4C +ENCODING 52044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4C80 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR CB4D +ENCODING 52045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CB4E +ENCODING 52046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR CB4F +ENCODING 52047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR CB50 +ENCODING 52048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1B00 +6480 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CB51 +ENCODING 52049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR CB52 +ENCODING 52050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR CB53 +ENCODING 52051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR CB54 +ENCODING 52052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR CB55 +ENCODING 52053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR CB56 +ENCODING 52054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR CB57 +ENCODING 52055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR CB58 +ENCODING 52056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR CB59 +ENCODING 52057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4C80 +0000 +FFC0 +0400 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CB5A +ENCODING 52058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR CB5B +ENCODING 52059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR CB5C +ENCODING 52060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR CB5D +ENCODING 52061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4480 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CB5E +ENCODING 52062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +76 +36 +C9 +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR CB5F +ENCODING 52063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR CB60 +ENCODING 52064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR CB61 +ENCODING 52065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +76 +89 +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR CB62 +ENCODING 52066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR CB63 +ENCODING 52067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR CB64 +ENCODING 52068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +1480 +3480 +4A80 +1080 +0080 +FE80 +1080 +1380 +1080 +0080 +ENDCHAR +STARTCHAR CB65 +ENCODING 52069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +3E +01 +01 +01 +ENDCHAR +STARTCHAR CB66 +ENCODING 52070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR CB67 +ENCODING 52071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR CB68 +ENCODING 52072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +69 +95 +01 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR CB69 +ENCODING 52073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CB6A +ENCODING 52074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR CB6B +ENCODING 52075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +3F +40 +7E +ENDCHAR +STARTCHAR CB6C +ENCODING 52076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR CB6D +ENCODING 52077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR CB6E +ENCODING 52078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CB6F +ENCODING 52079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CB70 +ENCODING 52080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR CB71 +ENCODING 52081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CB72 +ENCODING 52082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CB73 +ENCODING 52083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR CB74 +ENCODING 52084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +7F +41 +7F +ENDCHAR +STARTCHAR CB75 +ENCODING 52085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +41 +7F +7F +ENDCHAR +STARTCHAR CB76 +ENCODING 52086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR CB77 +ENCODING 52087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +08 +14 +63 +ENDCHAR +STARTCHAR CB78 +ENCODING 52088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2F00 +6900 +9500 +0100 +FD00 +2100 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR CB79 +ENCODING 52089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +2F +69 +95 +01 +FD +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR CB7A +ENCODING 52090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +6900 +6900 +9500 +1D00 +E100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CB7B +ENCODING 52091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +6900 +6D00 +9100 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CB7C +ENCODING 52092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR CB7D +ENCODING 52093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CB7E +ENCODING 52094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +1D +E1 +27 +3F +12 +3F +ENDCHAR +STARTCHAR CB7F +ENCODING 52095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR CB80 +ENCODING 52096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2680 +6A80 +9680 +0280 +FA80 +1680 +1280 +1280 +0080 +ENDCHAR +STARTCHAR CB81 +ENCODING 52097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CB82 +ENCODING 52098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR CB83 +ENCODING 52099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR CB84 +ENCODING 52100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +5680 +0280 +FA80 +1680 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR CB85 +ENCODING 52101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR CB86 +ENCODING 52102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR CB87 +ENCODING 52103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR CB88 +ENCODING 52104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +0F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR CB89 +ENCODING 52105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +0F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR CB8A +ENCODING 52106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR CB8B +ENCODING 52107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +0E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CB8C +ENCODING 52108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +2900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR CB8D +ENCODING 52109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +0F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CB8E +ENCODING 52110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +2B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CB8F +ENCODING 52111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR CB90 +ENCODING 52112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR CB91 +ENCODING 52113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR CB92 +ENCODING 52114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +2100 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR CB93 +ENCODING 52115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +0400 +0E00 +3180 +ENDCHAR +STARTCHAR CB94 +ENCODING 52116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR CB95 +ENCODING 52117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR CB96 +ENCODING 52118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR CB97 +ENCODING 52119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR CB98 +ENCODING 52120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR CB99 +ENCODING 52121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CB9A +ENCODING 52122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +D680 +0E80 +7280 +1480 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR CB9B +ENCODING 52123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +6A80 +6A80 +1680 +FE80 +1680 +1E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR CB9C +ENCODING 52124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +1280 +2480 +5A80 +1080 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR CB9D +ENCODING 52125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR CB9E +ENCODING 52126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR CB9F +ENCODING 52127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR CBA0 +ENCODING 52128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +69 +95 +01 +FD +11 +01 +40 +7F +ENDCHAR +STARTCHAR CBA1 +ENCODING 52129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CBA2 +ENCODING 52130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR CBA3 +ENCODING 52131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR CBA4 +ENCODING 52132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR CBA5 +ENCODING 52133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR CBA6 +ENCODING 52134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CBA7 +ENCODING 52135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CBA8 +ENCODING 52136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR CBA9 +ENCODING 52137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CBAA +ENCODING 52138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CBAB +ENCODING 52139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR CBAC +ENCODING 52140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +01 +FD +21 +7F +41 +7F +ENDCHAR +STARTCHAR CBAD +ENCODING 52141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +01 +FD +21 +41 +7F +7F +ENDCHAR +STARTCHAR CBAE +ENCODING 52142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR CBAF +ENCODING 52143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +01 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR CBB0 +ENCODING 52144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR CBB1 +ENCODING 52145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR CBB2 +ENCODING 52146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +6900 +6900 +9500 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CBB3 +ENCODING 52147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +6900 +6D00 +9100 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CBB4 +ENCODING 52148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +69 +95 +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR CBB5 +ENCODING 52149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CBB6 +ENCODING 52150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +69 +69 +95 +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR CBB7 +ENCODING 52151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +69 +6D +91 +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CBB8 +ENCODING 52152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7F00 +0900 +1900 +66C0 +0C00 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR CBB9 +ENCODING 52153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CBBA +ENCODING 52154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR CBBB +ENCODING 52155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR CBBC +ENCODING 52156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1900 +6680 +0000 +FFC0 +1200 +3200 +2000 +3F00 +ENDCHAR +STARTCHAR CBBD +ENCODING 52157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CBBE +ENCODING 52158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR CBBF +ENCODING 52159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR CBC0 +ENCODING 52160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +76 +89 +00 +FF +24 +5B +7E +7E +ENDCHAR +STARTCHAR CBC1 +ENCODING 52161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR CBC2 +ENCODING 52162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR CBC3 +ENCODING 52163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR CBC4 +ENCODING 52164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR CBC5 +ENCODING 52165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR CBC6 +ENCODING 52166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR CBC7 +ENCODING 52167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR CBC8 +ENCODING 52168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR CBC9 +ENCODING 52169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR CBCA +ENCODING 52170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR CBCB +ENCODING 52171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +1400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR CBCC +ENCODING 52172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR CBCD +ENCODING 52173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR CBCE +ENCODING 52174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR CBCF +ENCODING 52175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR CBD0 +ENCODING 52176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR CBD1 +ENCODING 52177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +76 +89 +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR CBD2 +ENCODING 52178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR CBD3 +ENCODING 52179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR CBD4 +ENCODING 52180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7F00 +0900 +1100 +2B00 +44C0 +0800 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR CBD5 +ENCODING 52181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CBD6 +ENCODING 52182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR CBD7 +ENCODING 52183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR CBD8 +ENCODING 52184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +32 +CD +00 +00 +FF +40 +40 +7E +ENDCHAR +STARTCHAR CBD9 +ENCODING 52185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CBDA +ENCODING 52186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR CBDB +ENCODING 52187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR CBDC +ENCODING 52188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +76 +89 +00 +FF +7E +01 +7E +7E +ENDCHAR +STARTCHAR CBDD +ENCODING 52189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR CBDE +ENCODING 52190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR CBDF +ENCODING 52191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR CBE0 +ENCODING 52192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR CBE1 +ENCODING 52193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR CBE2 +ENCODING 52194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR CBE3 +ENCODING 52195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR CBE4 +ENCODING 52196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1100 +2B00 +4C80 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR CBE5 +ENCODING 52197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR CBE6 +ENCODING 52198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR CBE7 +ENCODING 52199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0900 +3B00 +4C80 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR CBE8 +ENCODING 52200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR CBE9 +ENCODING 52201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0900 +3B00 +4C80 +0000 +FFC0 +0000 +1F00 +2100 +2100 +1F00 +ENDCHAR +STARTCHAR CBEA +ENCODING 52202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR CBEB +ENCODING 52203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR CBEC +ENCODING 52204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR CBED +ENCODING 52205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +76 +76 +89 +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR CBEE +ENCODING 52206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3B00 +1B00 +6480 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR CBEF +ENCODING 52207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +76 +76 +89 +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR CBF0 +ENCODING 52208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +49 +69 +95 +21 +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR CBF1 +ENCODING 52209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CBF2 +ENCODING 52210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +3F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR CBF3 +ENCODING 52211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR CBF4 +ENCODING 52212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +FD +49 +B5 +01 +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR CBF5 +ENCODING 52213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CBF6 +ENCODING 52214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR CBF7 +ENCODING 52215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +1F80 +2000 +3F00 +ENDCHAR +STARTCHAR CBF8 +ENCODING 52216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR CBF9 +ENCODING 52217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CBFA +ENCODING 52218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR CBFB +ENCODING 52219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CBFC +ENCODING 52220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR CBFD +ENCODING 52221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CBFE +ENCODING 52222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR CBFF +ENCODING 52223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR CC00 +ENCODING 52224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR CC01 +ENCODING 52225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR CC02 +ENCODING 52226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +2900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR CC03 +ENCODING 52227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR CC04 +ENCODING 52228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +1100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR CC05 +ENCODING 52229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +1F00 +2080 +3180 +0E00 +ENDCHAR +STARTCHAR CC06 +ENCODING 52230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR CC07 +ENCODING 52231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +E900 +6900 +B500 +1F00 +E100 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CC08 +ENCODING 52232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +3F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR CC09 +ENCODING 52233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR CC0A +ENCODING 52234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7C80 +2480 +5A80 +0080 +FF80 +0080 +3F80 +0900 +1F80 +ENDCHAR +STARTCHAR CC0B +ENCODING 52235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E9 +69 +B5 +1F +E1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CC0C +ENCODING 52236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +6C80 +2480 +2480 +2480 +5C80 +4A80 +9280 +2080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CC0D +ENCODING 52237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +29 +49 +AD +95 +21 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CC0E +ENCODING 52238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +49 +69 +95 +21 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CC0F +ENCODING 52239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4900 +6900 +9500 +2100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CC10 +ENCODING 52240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +2480 +2480 +5480 +8A80 +1080 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CC11 +ENCODING 52241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +49 +69 +95 +21 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR CC12 +ENCODING 52242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR CC13 +ENCODING 52243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +49 +69 +95 +21 +00 +7E +40 +7E +ENDCHAR +STARTCHAR CC14 +ENCODING 52244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +69 +95 +21 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CC15 +ENCODING 52245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR CC16 +ENCODING 52246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CC17 +ENCODING 52247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CC18 +ENCODING 52248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CC19 +ENCODING 52249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CC1A +ENCODING 52250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CC1B +ENCODING 52251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR CC1C +ENCODING 52252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +29 +49 +A9 +95 +21 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CC1D +ENCODING 52253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +29 +49 +A9 +95 +21 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR CC1E +ENCODING 52254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4900 +6900 +9500 +2100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CC1F +ENCODING 52255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +49 +69 +95 +21 +00 +08 +14 +63 +ENDCHAR +STARTCHAR CC20 +ENCODING 52256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +D900 +4900 +6900 +9500 +2100 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CC21 +ENCODING 52257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +29 +49 +A9 +95 +21 +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR CC22 +ENCODING 52258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +2900 +4900 +A900 +9500 +2100 +0000 +3F00 +0200 +0C00 +3380 +ENDCHAR +STARTCHAR CC23 +ENCODING 52259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +6900 +9500 +2100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR CC24 +ENCODING 52260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +D9 +49 +69 +95 +21 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CC25 +ENCODING 52261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +69 +95 +21 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR CC26 +ENCODING 52262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +D9 +49 +69 +95 +21 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CC27 +ENCODING 52263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +29 +49 +A9 +95 +21 +1C +00 +7F +22 +1E +ENDCHAR +STARTCHAR CC28 +ENCODING 52264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1100 +1180 +3100 +4900 +8500 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CC29 +ENCODING 52265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +7100 +8D00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CC2A +ENCODING 52266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR CC2B +ENCODING 52267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR CC2C +ENCODING 52268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1100 +1180 +7100 +8900 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR CC2D +ENCODING 52269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CC2E +ENCODING 52270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +6D00 +8000 +0600 +4000 +4F00 +4900 +7700 +ENDCHAR +STARTCHAR CC2F +ENCODING 52271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR CC30 +ENCODING 52272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +3180 +CD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR CC31 +ENCODING 52273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +6600 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR CC32 +ENCODING 52274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR CC33 +ENCODING 52275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +6000 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR CC34 +ENCODING 52276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +6200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR CC35 +ENCODING 52277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +6600 +1800 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR CC36 +ENCODING 52278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +6000 +1700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR CC37 +ENCODING 52279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +6600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR CC38 +ENCODING 52280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +7100 +8D00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR CC39 +ENCODING 52281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +7100 +8D00 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR CC3A +ENCODING 52282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR CC3B +ENCODING 52283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1100 +7180 +8D00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR CC3C +ENCODING 52284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +7100 +8D00 +0000 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR CC3D +ENCODING 52285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +7100 +8D00 +0100 +3E00 +4200 +4200 +3C00 +ENDCHAR +STARTCHAR CC3E +ENCODING 52286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1180 +7100 +8D00 +0000 +3E00 +0200 +1C00 +6300 +ENDCHAR +STARTCHAR CC3F +ENCODING 52287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR CC40 +ENCODING 52288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR CC41 +ENCODING 52289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +3E00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR CC42 +ENCODING 52290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +F900 +1180 +3100 +C900 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR CC43 +ENCODING 52291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +1180 +3100 +C800 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR CC44 +ENCODING 52292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +15 +27 +25 +55 +8D +05 +05 +05 +ENDCHAR +STARTCHAR CC45 +ENCODING 52293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +17 +75 +8D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CC46 +ENCODING 52294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +35 +CD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CC47 +ENCODING 52295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1700 +3500 +CD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CC48 +ENCODING 52296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +F500 +1700 +2500 +5500 +8D00 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CC49 +ENCODING 52297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1700 +3500 +CD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR CC4A +ENCODING 52298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CC4B +ENCODING 52299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F5 +17 +35 +CD +00 +3F +40 +7F +ENDCHAR +STARTCHAR CC4C +ENCODING 52300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F7 +25 +DD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CC4D +ENCODING 52301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR CC4E +ENCODING 52302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR CC4F +ENCODING 52303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CC50 +ENCODING 52304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR CC51 +ENCODING 52305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CC52 +ENCODING 52306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CC53 +ENCODING 52307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1700 +7500 +8D00 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR CC54 +ENCODING 52308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +17 +75 +8D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CC55 +ENCODING 52309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +17 +75 +8D +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR CC56 +ENCODING 52310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1700 +3500 +CD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CC57 +ENCODING 52311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +F500 +1700 +7500 +8D00 +0100 +0800 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR CC58 +ENCODING 52312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +F500 +1700 +7500 +8D00 +0000 +1200 +3200 +7500 +4C80 +ENDCHAR +STARTCHAR CC59 +ENCODING 52313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +17 +75 +8D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR CC5A +ENCODING 52314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1700 +3500 +CD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CC5B +ENCODING 52315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1700 +7500 +8D00 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CC5C +ENCODING 52316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +35 +CD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CC5D +ENCODING 52317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CC5E +ENCODING 52318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F5 +17 +35 +CD +00 +3F +12 +3F +ENDCHAR +STARTCHAR CC5F +ENCODING 52319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +17 +75 +8D +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CC60 +ENCODING 52320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +0980 +1100 +2100 +7980 +8500 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CC61 +ENCODING 52321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR CC62 +ENCODING 52322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR CC63 +ENCODING 52323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR CC64 +ENCODING 52324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F980 +1100 +1100 +7180 +8900 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR CC65 +ENCODING 52325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CC66 +ENCODING 52326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0180 +F900 +1180 +6D00 +8000 +0600 +4000 +4F00 +4900 +7700 +ENDCHAR +STARTCHAR CC67 +ENCODING 52327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR CC68 +ENCODING 52328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0180 +F900 +3180 +CD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR CC69 +ENCODING 52329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +6600 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR CC6A +ENCODING 52330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR CC6B +ENCODING 52331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +6000 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR CC6C +ENCODING 52332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +6200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR CC6D +ENCODING 52333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +6600 +1800 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR CC6E +ENCODING 52334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +6000 +1700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR CC6F +ENCODING 52335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +6600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR CC70 +ENCODING 52336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F980 +1100 +3180 +CD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR CC71 +ENCODING 52337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR CC72 +ENCODING 52338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR CC73 +ENCODING 52339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR CC74 +ENCODING 52340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR CC75 +ENCODING 52341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F980 +1100 +3180 +CD00 +0100 +3E00 +4200 +4200 +3C00 +ENDCHAR +STARTCHAR CC76 +ENCODING 52342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR CC77 +ENCODING 52343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR CC78 +ENCODING 52344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR CC79 +ENCODING 52345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +3E00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR CC7A +ENCODING 52346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +F980 +1100 +3180 +C900 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR CC7B +ENCODING 52347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +1100 +3180 +C800 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR CC7C +ENCODING 52348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +65 +65 +17 +25 +25 +57 +8D +05 +05 +ENDCHAR +STARTCHAR CC7D +ENCODING 52349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CC7E +ENCODING 52350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CC7F +ENCODING 52351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +3700 +CD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CC80 +ENCODING 52352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +65 +F5 +17 +25 +57 +85 +05 +20 +3F +ENDCHAR +STARTCHAR CC81 +ENCODING 52353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +3700 +CD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR CC82 +ENCODING 52354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CC83 +ENCODING 52355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +3F +40 +7F +ENDCHAR +STARTCHAR CC84 +ENCODING 52356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR CC85 +ENCODING 52357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR CC86 +ENCODING 52358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR CC87 +ENCODING 52359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CC88 +ENCODING 52360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR CC89 +ENCODING 52361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CC8A +ENCODING 52362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CC8B +ENCODING 52363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +7700 +8D00 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR CC8C +ENCODING 52364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +3F +41 +7F +ENDCHAR +STARTCHAR CC8D +ENCODING 52365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +21 +3F +3F +ENDCHAR +STARTCHAR CC8E +ENCODING 52366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +3700 +CD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CC8F +ENCODING 52367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +08 +14 +63 +ENDCHAR +STARTCHAR CC90 +ENCODING 52368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +3700 +CD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CC91 +ENCODING 52369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +37 +CD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR CC92 +ENCODING 52370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +3700 +CD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CC93 +ENCODING 52371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +1500 +7700 +8D00 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CC94 +ENCODING 52372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CC95 +ENCODING 52373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CC96 +ENCODING 52374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F7 +15 +37 +CD +00 +3F +12 +3F +ENDCHAR +STARTCHAR CC97 +ENCODING 52375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +15 +77 +8D +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CC98 +ENCODING 52376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +17 +31 +49 +85 +01 +01 +01 +ENDCHAR +STARTCHAR CC99 +ENCODING 52377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +0F +31 +CD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CC9A +ENCODING 52378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +77 +09 +09 +09 +ENDCHAR +STARTCHAR CC9B +ENCODING 52379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +72 +12 +15 +10 +ENDCHAR +STARTCHAR CC9C +ENCODING 52380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +17 +79 +85 +01 +40 +40 +3F +ENDCHAR +STARTCHAR CC9D +ENCODING 52381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CC9E +ENCODING 52382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR CC9F +ENCODING 52383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +3F +40 +7E +ENDCHAR +STARTCHAR CCA0 +ENCODING 52384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +37 +CD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CCA1 +ENCODING 52385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CCA2 +ENCODING 52386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CCA3 +ENCODING 52387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CCA4 +ENCODING 52388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR CCA5 +ENCODING 52389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CCA6 +ENCODING 52390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CCA7 +ENCODING 52391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR CCA8 +ENCODING 52392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +0F +31 +CD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CCA9 +ENCODING 52393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +0F +31 +CD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR CCAA +ENCODING 52394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +12 +72 +55 +70 +ENDCHAR +STARTCHAR CCAB +ENCODING 52395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +0F00 +3100 +CD00 +0100 +0800 +0800 +3600 +4180 +ENDCHAR +STARTCHAR CCAC +ENCODING 52396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +0F00 +3100 +CD00 +0100 +2200 +3200 +7500 +4880 +ENDCHAR +STARTCHAR CCAD +ENCODING 52397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +71 +8D +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR CCAE +ENCODING 52398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +F900 +1100 +3300 +4900 +8100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CCAF +ENCODING 52399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1700 +3100 +CD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CCB0 +ENCODING 52400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +7F +3F +01 +01 +ENDCHAR +STARTCHAR CCB1 +ENCODING 52401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CCB2 +ENCODING 52402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +F9 +11 +33 +49 +81 +7F +12 +3F +ENDCHAR +STARTCHAR CCB3 +ENCODING 52403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +31 +CD +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR CCB4 +ENCODING 52404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +15 +2D +25 +D5 +8D +05 +05 +05 +ENDCHAR +STARTCHAR CCB5 +ENCODING 52405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +1D +65 +9D +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CCB6 +ENCODING 52406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +35 +CD +01 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CCB7 +ENCODING 52407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +3500 +CD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CCB8 +ENCODING 52408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +F500 +1500 +2D00 +6500 +9500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CCB9 +ENCODING 52409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +3500 +CD00 +0100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR CCBA +ENCODING 52410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CCBB +ENCODING 52411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F5 +15 +35 +CD +01 +3F +40 +7F +ENDCHAR +STARTCHAR CCBC +ENCODING 52412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +2D +DD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CCBD +ENCODING 52413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR CCBE +ENCODING 52414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR CCBF +ENCODING 52415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CCC0 +ENCODING 52416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR CCC1 +ENCODING 52417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CCC2 +ENCODING 52418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CCC3 +ENCODING 52419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1D00 +7500 +8900 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR CCC4 +ENCODING 52420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +1D +65 +9D +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CCC5 +ENCODING 52421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +1D +65 +9D +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR CCC6 +ENCODING 52422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +3500 +CD00 +0100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CCC7 +ENCODING 52423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +F500 +1D00 +6500 +9D00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR CCC8 +ENCODING 52424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +3500 +CD00 +0100 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CCC9 +ENCODING 52425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +1D +65 +9D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR CCCA +ENCODING 52426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +3500 +CD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CCCB +ENCODING 52427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1D00 +7500 +8900 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CCCC +ENCODING 52428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +35 +CD +01 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CCCD +ENCODING 52429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CCCE +ENCODING 52430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +F5 +15 +35 +CD +01 +3F +12 +3F +ENDCHAR +STARTCHAR CCCF +ENCODING 52431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +1D +75 +89 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CCD0 +ENCODING 52432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +17 +11 +37 +49 +85 +01 +01 +01 +ENDCHAR +STARTCHAR CCD1 +ENCODING 52433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CCD2 +ENCODING 52434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +77 +09 +09 +09 +ENDCHAR +STARTCHAR CCD3 +ENCODING 52435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +72 +12 +15 +10 +ENDCHAR +STARTCHAR CCD4 +ENCODING 52436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +0F +11 +37 +CD +01 +40 +40 +3F +ENDCHAR +STARTCHAR CCD5 +ENCODING 52437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CCD6 +ENCODING 52438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR CCD7 +ENCODING 52439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +FB +11 +37 +49 +81 +3F +40 +7E +ENDCHAR +STARTCHAR CCD8 +ENCODING 52440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +3F +3F +40 +3F +ENDCHAR +STARTCHAR CCD9 +ENCODING 52441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CCDA +ENCODING 52442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CCDB +ENCODING 52443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CCDC +ENCODING 52444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR CCDD +ENCODING 52445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CCDE +ENCODING 52446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CCDF +ENCODING 52447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR CCE0 +ENCODING 52448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +FB +11 +37 +49 +81 +3F +41 +7F +ENDCHAR +STARTCHAR CCE1 +ENCODING 52449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +FB +11 +37 +49 +81 +01 +3F +7F +ENDCHAR +STARTCHAR CCE2 +ENCODING 52450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +12 +72 +55 +70 +ENDCHAR +STARTCHAR CCE3 +ENCODING 52451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +FB +11 +37 +49 +81 +08 +14 +63 +ENDCHAR +STARTCHAR CCE4 +ENCODING 52452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FF00 +0900 +3700 +CD00 +0000 +2200 +3200 +7500 +4880 +ENDCHAR +STARTCHAR CCE5 +ENCODING 52453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +3E +41 +23 +1C +ENDCHAR +STARTCHAR CCE6 +ENCODING 52454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +FB00 +1100 +3700 +4900 +8100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CCE7 +ENCODING 52455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FF00 +1100 +3700 +CD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CCE8 +ENCODING 52456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +FB +11 +37 +49 +81 +7F +3F +01 +01 +ENDCHAR +STARTCHAR CCE9 +ENCODING 52457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CCEA +ENCODING 52458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +FB +11 +37 +49 +81 +7F +12 +3F +ENDCHAR +STARTCHAR CCEB +ENCODING 52459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +11 +37 +CD +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR CCEC +ENCODING 52460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +F5 +1D +25 +2D +D5 +8D +05 +05 +05 +ENDCHAR +STARTCHAR CCED +ENCODING 52461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CCEE +ENCODING 52462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CCEF +ENCODING 52463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0300 +F300 +1700 +3D00 +CB00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CCF0 +ENCODING 52464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +F500 +1D00 +2500 +6D00 +9500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CCF1 +ENCODING 52465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0300 +F300 +1700 +3D00 +CB00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR CCF2 +ENCODING 52466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CCF3 +ENCODING 52467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +3F +40 +7F +ENDCHAR +STARTCHAR CCF4 +ENCODING 52468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR CCF5 +ENCODING 52469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR CCF6 +ENCODING 52470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR CCF7 +ENCODING 52471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CCF8 +ENCODING 52472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR CCF9 +ENCODING 52473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CCFA +ENCODING 52474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CCFB +ENCODING 52475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +7D00 +8900 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR CCFC +ENCODING 52476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +3F +41 +7F +ENDCHAR +STARTCHAR CCFD +ENCODING 52477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +21 +3F +3F +ENDCHAR +STARTCHAR CCFE +ENCODING 52478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0300 +F300 +1700 +3D00 +CB00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CCFF +ENCODING 52479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +08 +14 +63 +ENDCHAR +STARTCHAR CD00 +ENCODING 52480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0300 +F300 +1700 +3D00 +CB00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CD01 +ENCODING 52481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +15 +6D +9D +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR CD02 +ENCODING 52482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0300 +F300 +1700 +3D00 +CB00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CD03 +ENCODING 52483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +1500 +7D00 +8900 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CD04 +ENCODING 52484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CD05 +ENCODING 52485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CD06 +ENCODING 52486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +03 +F3 +17 +3D +CB +00 +3F +12 +3F +ENDCHAR +STARTCHAR CD07 +ENCODING 52487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +15 +7D +89 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CD08 +ENCODING 52488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1E00 +0000 +3F00 +0200 +0E00 +7180 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR CD09 +ENCODING 52489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0E00 +7180 +0400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CD0A +ENCODING 52490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +7E +11 +11 +10 +ENDCHAR +STARTCHAR CD0B +ENCODING 52491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +E0 +14 +16 +19 +ENDCHAR +STARTCHAR CD0C +ENCODING 52492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CD0D +ENCODING 52493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +07 +42 +45 +20 +ENDCHAR +STARTCHAR CD0E +ENCODING 52494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0300 +2480 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CD0F +ENCODING 52495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +7E +40 +7E +ENDCHAR +STARTCHAR CD10 +ENCODING 52496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0E00 +7180 +0400 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CD11 +ENCODING 52497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CD12 +ENCODING 52498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CD13 +ENCODING 52499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CD14 +ENCODING 52500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CD15 +ENCODING 52501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CD16 +ENCODING 52502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CD17 +ENCODING 52503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0300 +3880 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CD18 +ENCODING 52504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CD19 +ENCODING 52505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0E00 +7180 +0400 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CD1A +ENCODING 52506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +12 +72 +95 +78 +ENDCHAR +STARTCHAR CD1B +ENCODING 52507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0400 +FFC0 +0000 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR CD1C +ENCODING 52508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +20 +26 +5D +80 +ENDCHAR +STARTCHAR CD1D +ENCODING 52509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CD1E +ENCODING 52510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +7E +02 +7F +ENDCHAR +STARTCHAR CD1F +ENCODING 52511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CD20 +ENCODING 52512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +7E +01 +7F +ENDCHAR +STARTCHAR CD21 +ENCODING 52513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR CD22 +ENCODING 52514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +08 +F7 +7F +24 +7E +ENDCHAR +STARTCHAR CD23 +ENCODING 52515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR CD24 +ENCODING 52516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7C80 +0480 +1880 +66C0 +1080 +1080 +FE80 +0080 +0080 +ENDCHAR +STARTCHAR CD25 +ENCODING 52517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR CD26 +ENCODING 52518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +6600 +1100 +1100 +ENDCHAR +STARTCHAR CD27 +ENCODING 52519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +E200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR CD28 +ENCODING 52520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7C80 +1880 +66C0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CD29 +ENCODING 52521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +0F00 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CD2A +ENCODING 52522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0600 +0900 +4600 +4900 +3600 +ENDCHAR +STARTCHAR CD2B +ENCODING 52523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +3E00 +4000 +7E00 +ENDCHAR +STARTCHAR CD2C +ENCODING 52524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7C80 +18C0 +6680 +1000 +FF00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CD2D +ENCODING 52525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7700 +7100 +4100 +7100 +ENDCHAR +STARTCHAR CD2E +ENCODING 52526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR CD2F +ENCODING 52527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7900 +7E00 +8900 +7600 +ENDCHAR +STARTCHAR CD30 +ENCODING 52528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR CD31 +ENCODING 52529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7E00 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR CD32 +ENCODING 52530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR CD33 +ENCODING 52531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0600 +7100 +7600 +8900 +7600 +ENDCHAR +STARTCHAR CD34 +ENCODING 52532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +3E00 +4100 +7F00 +ENDCHAR +STARTCHAR CD35 +ENCODING 52533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +4000 +7E00 +7F00 +ENDCHAR +STARTCHAR CD36 +ENCODING 52534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +9200 +F200 +9500 +7800 +ENDCHAR +STARTCHAR CD37 +ENCODING 52535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +7900 +3100 +ED80 +2100 +DD00 +0800 +0C00 +3200 +4100 +ENDCHAR +STARTCHAR CD38 +ENCODING 52536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR CD39 +ENCODING 52537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7C80 +1880 +66C0 +1080 +FE80 +0000 +1F00 +2080 +1F00 +ENDCHAR +STARTCHAR CD3A +ENCODING 52538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +3E00 +0200 +3F00 +4000 +ENDCHAR +STARTCHAR CD3B +ENCODING 52539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CD3C +ENCODING 52540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +7E00 +0100 +3F00 +ENDCHAR +STARTCHAR CD3D +ENCODING 52541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +0000 +7E00 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR CD3E +ENCODING 52542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +0100 +7900 +3100 +CD80 +2100 +DC00 +1C00 +2200 +7F00 +ENDCHAR +STARTCHAR CD3F +ENCODING 52543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +7100 +0900 +7900 +8580 +FD00 +1C00 +6200 +1C00 +2200 +3C00 +ENDCHAR +STARTCHAR CD40 +ENCODING 52544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +65 +F5 +15 +27 +DD +25 +FD +05 +05 +01 +ENDCHAR +STARTCHAR CD41 +ENCODING 52545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CD42 +ENCODING 52546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1900 +0480 +0480 +0480 +ENDCHAR +STARTCHAR CD43 +ENCODING 52547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR CD44 +ENCODING 52548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3280 +7A80 +1280 +6F80 +1280 +FA80 +0280 +1000 +1F80 +ENDCHAR +STARTCHAR CD45 +ENCODING 52549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR CD46 +ENCODING 52550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR CD47 +ENCODING 52551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR CD48 +ENCODING 52552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +3F +3F +40 +3F +ENDCHAR +STARTCHAR CD49 +ENCODING 52553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +3F +39 +41 +38 +ENDCHAR +STARTCHAR CD4A +ENCODING 52554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR CD4B +ENCODING 52555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +3D +77 +45 +37 +ENDCHAR +STARTCHAR CD4C +ENCODING 52556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR CD4D +ENCODING 52557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +3F +77 +44 +37 +ENDCHAR +STARTCHAR CD4E +ENCODING 52558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CD4F +ENCODING 52559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR CD50 +ENCODING 52560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1F00 +2080 +3F80 +ENDCHAR +STARTCHAR CD51 +ENCODING 52561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR CD52 +ENCODING 52562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +2100 +3900 +2A80 +3800 +ENDCHAR +STARTCHAR CD53 +ENCODING 52563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR CD54 +ENCODING 52564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR CD55 +ENCODING 52565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR CD56 +ENCODING 52566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR CD57 +ENCODING 52567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +7500 +7700 +A500 +FD00 +0000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CD58 +ENCODING 52568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR CD59 +ENCODING 52569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +00 +7F +3F +40 +3F +ENDCHAR +STARTCHAR CD5A +ENCODING 52570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +3280 +7A80 +1380 +6A80 +1280 +FE80 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR CD5B +ENCODING 52571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +77 +A5 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CD5C +ENCODING 52572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +0080 +7C80 +0480 +1880 +6680 +1080 +1080 +FF80 +0080 +0080 +ENDCHAR +STARTCHAR CD5D +ENCODING 52573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +7F +01 +01 +01 +ENDCHAR +STARTCHAR CD5E +ENCODING 52574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +77 +09 +09 +09 +ENDCHAR +STARTCHAR CD5F +ENCODING 52575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +72 +12 +15 +10 +ENDCHAR +STARTCHAR CD60 +ENCODING 52576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +11 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR CD61 +ENCODING 52577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +47 +41 +47 +30 +ENDCHAR +STARTCHAR CD62 +ENCODING 52578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR CD63 +ENCODING 52579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +79 +31 +CD +11 +ED +3F +40 +7E +ENDCHAR +STARTCHAR CD64 +ENCODING 52580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +10 +FF +01 +7F +40 +7F +ENDCHAR +STARTCHAR CD65 +ENCODING 52581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CD66 +ENCODING 52582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CD67 +ENCODING 52583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CD68 +ENCODING 52584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR CD69 +ENCODING 52585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CD6A +ENCODING 52586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CD6B +ENCODING 52587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR CD6C +ENCODING 52588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +11 +FF +00 +7F +41 +7F +ENDCHAR +STARTCHAR CD6D +ENCODING 52589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +11 +FE +41 +7F +41 +7F +ENDCHAR +STARTCHAR CD6E +ENCODING 52590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +12 +72 +55 +70 +ENDCHAR +STARTCHAR CD6F +ENCODING 52591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +11 +FF +01 +08 +14 +63 +ENDCHAR +STARTCHAR CD70 +ENCODING 52592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +22 +22 +55 +08 +ENDCHAR +STARTCHAR CD71 +ENCODING 52593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +11 +FF +00 +3E +41 +3E +ENDCHAR +STARTCHAR CD72 +ENCODING 52594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +7900 +3100 +CD00 +1100 +ED00 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CD73 +ENCODING 52595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +7100 +0900 +7900 +8500 +FD00 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CD74 +ENCODING 52596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +11 +ED +7F +3F +01 +01 +ENDCHAR +STARTCHAR CD75 +ENCODING 52597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CD76 +ENCODING 52598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +79 +31 +CD +11 +ED +7F +12 +3F +ENDCHAR +STARTCHAR CD77 +ENCODING 52599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FD +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR CD78 +ENCODING 52600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1E00 +0000 +3F00 +0200 +1E00 +6180 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR CD79 +ENCODING 52601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CD7A +ENCODING 52602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR CD7B +ENCODING 52603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +7000 +0A00 +0B00 +0C80 +ENDCHAR +STARTCHAR CD7C +ENCODING 52604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +0C00 +3F00 +0600 +3B80 +1200 +FFC0 +0000 +2000 +3F00 +ENDCHAR +STARTCHAR CD7D +ENCODING 52605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +0380 +2100 +2280 +1000 +ENDCHAR +STARTCHAR CD7E +ENCODING 52606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0300 +2480 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CD7F +ENCODING 52607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR CD80 +ENCODING 52608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3F80 +3F00 +3F00 +ENDCHAR +STARTCHAR CD81 +ENCODING 52609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CD82 +ENCODING 52610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CD83 +ENCODING 52611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CD84 +ENCODING 52612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CD85 +ENCODING 52613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3F00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CD86 +ENCODING 52614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CD87 +ENCODING 52615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0300 +3880 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CD88 +ENCODING 52616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +1200 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CD89 +ENCODING 52617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +2000 +3F00 +3F80 +ENDCHAR +STARTCHAR CD8A +ENCODING 52618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +0900 +3900 +4A80 +3C00 +ENDCHAR +STARTCHAR CD8B +ENCODING 52619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR CD8C +ENCODING 52620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR CD8D +ENCODING 52621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +1E00 +2180 +2100 +1E00 +ENDCHAR +STARTCHAR CD8E +ENCODING 52622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +3F00 +0100 +3F80 +ENDCHAR +STARTCHAR CD8F +ENCODING 52623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CD90 +ENCODING 52624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR CD91 +ENCODING 52625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +0000 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR CD92 +ENCODING 52626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +0000 +1F00 +0E00 +7380 +1200 +FFC0 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR CD93 +ENCODING 52627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +1200 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR CD94 +ENCODING 52628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR CD95 +ENCODING 52629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0400 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CD96 +ENCODING 52630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +7E +11 +11 +10 +ENDCHAR +STARTCHAR CD97 +ENCODING 52631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +E8 +14 +16 +19 +ENDCHAR +STARTCHAR CD98 +ENCODING 52632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR CD99 +ENCODING 52633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +0F +42 +45 +20 +ENDCHAR +STARTCHAR CD9A +ENCODING 52634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +0300 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR CD9B +ENCODING 52635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +7E +40 +7E +ENDCHAR +STARTCHAR CD9C +ENCODING 52636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 12 0 -3 +BITMAP +1E00 +0000 +3F00 +1A00 +2100 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CD9D +ENCODING 52637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CD9E +ENCODING 52638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CD9F +ENCODING 52639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CDA0 +ENCODING 52640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CDA1 +ENCODING 52641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR CDA2 +ENCODING 52642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CDA3 +ENCODING 52643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +3B00 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR CDA4 +ENCODING 52644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CDA5 +ENCODING 52645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CDA6 +ENCODING 52646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +9A +F2 +95 +F8 +ENDCHAR +STARTCHAR CDA7 +ENCODING 52647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0400 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR CDA8 +ENCODING 52648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +28 +26 +5D +80 +ENDCHAR +STARTCHAR CDA9 +ENCODING 52649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CDAA +ENCODING 52650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +7E +02 +7F +ENDCHAR +STARTCHAR CDAB +ENCODING 52651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CDAC +ENCODING 52652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +7E +01 +7F +ENDCHAR +STARTCHAR CDAD +ENCODING 52653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0400 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR CDAE +ENCODING 52654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +F7 +08 +7F +24 +7E +ENDCHAR +STARTCHAR CDAF +ENCODING 52655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR CDB0 +ENCODING 52656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +0080 +7C80 +1880 +6680 +0080 +FE80 +1080 +1380 +1080 +1080 +ENDCHAR +STARTCHAR CDB1 +ENCODING 52657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +7E +01 +01 +01 +ENDCHAR +STARTCHAR CDB2 +ENCODING 52658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR CDB3 +ENCODING 52659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +62 +12 +15 +18 +ENDCHAR +STARTCHAR CDB4 +ENCODING 52660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +31 +79 +31 +CD +FF +27 +21 +40 +7F +ENDCHAR +STARTCHAR CDB5 +ENCODING 52661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CDB6 +ENCODING 52662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR CDB7 +ENCODING 52663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +3E +40 +7E +ENDCHAR +STARTCHAR CDB8 +ENCODING 52664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR CDB9 +ENCODING 52665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR CDBA +ENCODING 52666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CDBB +ENCODING 52667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CDBC +ENCODING 52668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR CDBD +ENCODING 52669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CDBE +ENCODING 52670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CDBF +ENCODING 52671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR CDC0 +ENCODING 52672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +3E +41 +7F +ENDCHAR +STARTCHAR CDC1 +ENCODING 52673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +41 +7F +41 +3E +ENDCHAR +STARTCHAR CDC2 +ENCODING 52674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR CDC3 +ENCODING 52675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +08 +0C +33 +40 +ENDCHAR +STARTCHAR CDC4 +ENCODING 52676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +7900 +3700 +CD00 +0100 +FD00 +2100 +2200 +3300 +CC80 +ENDCHAR +STARTCHAR CDC5 +ENCODING 52677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +3E +41 +63 +1C +ENDCHAR +STARTCHAR CDC6 +ENCODING 52678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +7900 +3900 +C500 +FD00 +2700 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CDC7 +ENCODING 52679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +7100 +0900 +7D00 +8100 +FF00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CDC8 +ENCODING 52680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR CDC9 +ENCODING 52681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CDCA +ENCODING 52682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +79 +39 +C5 +FD +27 +2D +12 +3F +ENDCHAR +STARTCHAR CDCB +ENCODING 52683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FF +0D +33 +0C +32 +1E +ENDCHAR +STARTCHAR CDCC +ENCODING 52684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7A80 +3280 +4A80 +0280 +FE80 +1280 +1680 +1280 +0280 +ENDCHAR +STARTCHAR CDCD +ENCODING 52685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +1F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CDCE +ENCODING 52686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0000 +1D80 +0480 +0400 +ENDCHAR +STARTCHAR CDCF +ENCODING 52687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +3100 +0900 +0A80 +0840 +ENDCHAR +STARTCHAR CDD0 +ENCODING 52688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7A80 +3680 +4E80 +0280 +FE80 +1280 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CDD1 +ENCODING 52689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR CDD2 +ENCODING 52690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +42 +47 +45 +32 +ENDCHAR +STARTCHAR CDD3 +ENCODING 52691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR CDD4 +ENCODING 52692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR CDD5 +ENCODING 52693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +7F +39 +41 +38 +ENDCHAR +STARTCHAR CDD6 +ENCODING 52694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +77 +3D +45 +37 +ENDCHAR +STARTCHAR CDD7 +ENCODING 52695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +75 +3F +45 +37 +ENDCHAR +STARTCHAR CDD8 +ENCODING 52696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +7500 +FD00 +1500 +ED00 +2100 +7200 +3200 +4500 +7080 +ENDCHAR +STARTCHAR CDD9 +ENCODING 52697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +77 +3F +44 +37 +ENDCHAR +STARTCHAR CDDA +ENCODING 52698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +77 +35 +45 +77 +ENDCHAR +STARTCHAR CDDB +ENCODING 52699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +72 +37 +45 +72 +ENDCHAR +STARTCHAR CDDC +ENCODING 52700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR CDDD +ENCODING 52701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR CDDE +ENCODING 52702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0100 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR CDDF +ENCODING 52703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0400 +0600 +1900 +2080 +ENDCHAR +STARTCHAR CDE0 +ENCODING 52704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0100 +0900 +3E80 +0040 +ENDCHAR +STARTCHAR CDE1 +ENCODING 52705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0400 +3B80 +2080 +1F00 +ENDCHAR +STARTCHAR CDE2 +ENCODING 52706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0E00 +0180 +0F80 +1040 +ENDCHAR +STARTCHAR CDE3 +ENCODING 52707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +7500 +FD00 +1500 +ED00 +2100 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CDE4 +ENCODING 52708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0000 +1F80 +1F80 +0080 +ENDCHAR +STARTCHAR CDE5 +ENCODING 52709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +3F +7F +40 +3F +ENDCHAR +STARTCHAR CDE6 +ENCODING 52710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +1080 +0280 +3A80 +3A80 +4680 +FE80 +1680 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR CDE7 +ENCODING 52711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +75 +FD +15 +ED +21 +1C +7F +32 +1E +ENDCHAR +STARTCHAR CDE8 +ENCODING 52712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +0080 +7C80 +1880 +6680 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR CDE9 +ENCODING 52713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +7E +01 +01 +01 +ENDCHAR +STARTCHAR CDEA +ENCODING 52714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR CDEB +ENCODING 52715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +62 +12 +15 +18 +ENDCHAR +STARTCHAR CDEC +ENCODING 52716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +01 +FD +11 +51 +40 +7F +ENDCHAR +STARTCHAR CDED +ENCODING 52717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CDEE +ENCODING 52718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR CDEF +ENCODING 52719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +3E +40 +7E +ENDCHAR +STARTCHAR CDF0 +ENCODING 52720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 12 1 -3 +BITMAP +71 +01 +79 +31 +CD +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR CDF1 +ENCODING 52721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR CDF2 +ENCODING 52722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CDF3 +ENCODING 52723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CDF4 +ENCODING 52724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR CDF5 +ENCODING 52725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CDF6 +ENCODING 52726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CDF7 +ENCODING 52727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR CDF8 +ENCODING 52728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +01 +FD +20 +7F +41 +7F +ENDCHAR +STARTCHAR CDF9 +ENCODING 52729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +49 +FD +20 +61 +7F +41 +7F +ENDCHAR +STARTCHAR CDFA +ENCODING 52730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR CDFB +ENCODING 52731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +7900 +3100 +CD00 +0100 +FD00 +2100 +0800 +1600 +6180 +ENDCHAR +STARTCHAR CDFC +ENCODING 52732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR CDFD +ENCODING 52733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +79 +31 +CD +01 +FD +21 +3E +41 +3E +ENDCHAR +STARTCHAR CDFE +ENCODING 52734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +7900 +3900 +C500 +FD00 +2100 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CDFF +ENCODING 52735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +7100 +0900 +7D00 +8100 +FD00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CE00 +ENCODING 52736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR CE01 +ENCODING 52737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CE02 +ENCODING 52738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +79 +39 +C5 +FD +21 +2D +12 +3F +ENDCHAR +STARTCHAR CE03 +ENCODING 52739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +7D +81 +FD +0D +33 +0C +32 +1E +ENDCHAR +STARTCHAR CE04 +ENCODING 52740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1E00 +0000 +3F00 +0E00 +7180 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR CE05 +ENCODING 52741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +7E +01 +01 +ENDCHAR +STARTCHAR CE06 +ENCODING 52742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +7E +11 +11 +10 +ENDCHAR +STARTCHAR CE07 +ENCODING 52743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +E0 +14 +16 +19 +ENDCHAR +STARTCHAR CE08 +ENCODING 52744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +1200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR CE09 +ENCODING 52745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +07 +42 +45 +20 +ENDCHAR +STARTCHAR CE0A +ENCODING 52746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +0100 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR CE0B +ENCODING 52747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +7E +40 +7E +ENDCHAR +STARTCHAR CE0C +ENCODING 52748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 12 0 -3 +BITMAP +1E00 +0000 +3F00 +0C00 +3300 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CE0D +ENCODING 52749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CE0E +ENCODING 52750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CE0F +ENCODING 52751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CE10 +ENCODING 52752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CE11 +ENCODING 52753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR CE12 +ENCODING 52754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CE13 +ENCODING 52755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +3900 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR CE14 +ENCODING 52756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +1200 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CE15 +ENCODING 52757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +40 +7E +7F +ENDCHAR +STARTCHAR CE16 +ENCODING 52758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR CE17 +ENCODING 52759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +08 +18 +66 +81 +ENDCHAR +STARTCHAR CE18 +ENCODING 52760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +20 +26 +5D +80 +ENDCHAR +STARTCHAR CE19 +ENCODING 52761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +1200 +1F00 +2080 +3F00 +ENDCHAR +STARTCHAR CE1A +ENCODING 52762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +7E +02 +7F +ENDCHAR +STARTCHAR CE1B +ENCODING 52763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +0D00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CE1C +ENCODING 52764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +7E +01 +7F +ENDCHAR +STARTCHAR CE1D +ENCODING 52765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1200 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR CE1E +ENCODING 52766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +DB +24 +7F +24 +7E +ENDCHAR +STARTCHAR CE1F +ENCODING 52767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +1F00 +1F00 +2080 +FFC0 +1F00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR CE20 +ENCODING 52768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +1E00 +0000 +3F00 +0200 +0C00 +7380 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR CE21 +ENCODING 52769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CE22 +ENCODING 52770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +7E +11 +11 +10 +ENDCHAR +STARTCHAR CE23 +ENCODING 52771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +E0 +14 +16 +19 +ENDCHAR +STARTCHAR CE24 +ENCODING 52772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CE25 +ENCODING 52773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +07 +42 +45 +20 +ENDCHAR +STARTCHAR CE26 +ENCODING 52774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0300 +2480 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CE27 +ENCODING 52775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +7E +40 +7E +ENDCHAR +STARTCHAR CE28 +ENCODING 52776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0E00 +7180 +0000 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CE29 +ENCODING 52777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CE2A +ENCODING 52778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CE2B +ENCODING 52779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CE2C +ENCODING 52780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CE2D +ENCODING 52781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CE2E +ENCODING 52782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CE2F +ENCODING 52783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0300 +3880 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CE30 +ENCODING 52784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CE31 +ENCODING 52785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CE32 +ENCODING 52786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +12 +72 +95 +78 +ENDCHAR +STARTCHAR CE33 +ENCODING 52787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0000 +0400 +1E00 +6180 +ENDCHAR +STARTCHAR CE34 +ENCODING 52788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +20 +26 +5D +80 +ENDCHAR +STARTCHAR CE35 +ENCODING 52789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1E00 +0000 +3F00 +0C00 +7380 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CE36 +ENCODING 52790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +7E +02 +7F +ENDCHAR +STARTCHAR CE37 +ENCODING 52791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CE38 +ENCODING 52792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +7E +01 +7F +ENDCHAR +STARTCHAR CE39 +ENCODING 52793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +0000 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR CE3A +ENCODING 52794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +3C +00 +3E +1C +E7 +00 +FF +7F +24 +7E +ENDCHAR +STARTCHAR CE3B +ENCODING 52795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +1E00 +0100 +3F80 +0000 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR CE3C +ENCODING 52796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +21 +F9 +09 +31 +CD +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR CE3D +ENCODING 52797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CE3E +ENCODING 52798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +77 +09 +09 +09 +ENDCHAR +STARTCHAR CE3F +ENCODING 52799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +72 +12 +15 +10 +ENDCHAR +STARTCHAR CE40 +ENCODING 52800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +21 +F9 +31 +CD +01 +FD +01 +40 +7F +ENDCHAR +STARTCHAR CE41 +ENCODING 52801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +47 +41 +47 +30 +ENDCHAR +STARTCHAR CE42 +ENCODING 52802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR CE43 +ENCODING 52803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +3F +40 +7E +ENDCHAR +STARTCHAR CE44 +ENCODING 52804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +3F +3F +40 +3F +ENDCHAR +STARTCHAR CE45 +ENCODING 52805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CE46 +ENCODING 52806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CE47 +ENCODING 52807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CE48 +ENCODING 52808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR CE49 +ENCODING 52809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CE4A +ENCODING 52810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CE4B +ENCODING 52811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR CE4C +ENCODING 52812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +3F +41 +7F +ENDCHAR +STARTCHAR CE4D +ENCODING 52813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +01 +3F +7F +ENDCHAR +STARTCHAR CE4E +ENCODING 52814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +12 +72 +55 +70 +ENDCHAR +STARTCHAR CE4F +ENCODING 52815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +7F +81 +08 +0C +33 +40 +ENDCHAR +STARTCHAR CE50 +ENCODING 52816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR CE51 +ENCODING 52817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +7F +81 +3E +41 +23 +1C +ENDCHAR +STARTCHAR CE52 +ENCODING 52818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +7900 +3100 +CD00 +3F00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CE53 +ENCODING 52819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +7100 +0900 +7900 +8500 +FF00 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR CE54 +ENCODING 52820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +7F +3F +01 +01 +ENDCHAR +STARTCHAR CE55 +ENCODING 52821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CE56 +ENCODING 52822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +79 +31 +CD +3F +C1 +7F +12 +3F +ENDCHAR +STARTCHAR CE57 +ENCODING 52823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +71 +09 +79 +85 +FF +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR CE58 +ENCODING 52824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +11 +31 +49 +85 +01 +01 +01 +ENDCHAR +STARTCHAR CE59 +ENCODING 52825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +31 +CD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CE5A +ENCODING 52826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +31 +49 +80 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CE5B +ENCODING 52827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +F900 +1100 +3100 +4900 +8000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CE5C +ENCODING 52828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +11 +69 +85 +01 +20 +20 +3F +ENDCHAR +STARTCHAR CE5D +ENCODING 52829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +31 +49 +87 +41 +42 +45 +30 +ENDCHAR +STARTCHAR CE5E +ENCODING 52830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR CE5F +ENCODING 52831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +31 +CD +00 +3F +40 +40 +3F +ENDCHAR +STARTCHAR CE60 +ENCODING 52832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +31 +CD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CE61 +ENCODING 52833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +31 +CD +00 +77 +11 +71 +41 +79 +ENDCHAR +STARTCHAR CE62 +ENCODING 52834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR CE63 +ENCODING 52835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR CE64 +ENCODING 52836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR CE65 +ENCODING 52837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR CE66 +ENCODING 52838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR CE67 +ENCODING 52839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR CE68 +ENCODING 52840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +31 +CD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CE69 +ENCODING 52841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +31 +CD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR CE6A +ENCODING 52842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +31 +49 +80 +12 +72 +55 +70 +ENDCHAR +STARTCHAR CE6B +ENCODING 52843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +09 +31 +CD +01 +08 +14 +36 +41 +ENDCHAR +STARTCHAR CE6C +ENCODING 52844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +F900 +1100 +3100 +4900 +8000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CE6D +ENCODING 52845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR CE6E +ENCODING 52846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +2100 +0100 +F900 +1100 +3100 +4900 +8000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR CE6F +ENCODING 52847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +1100 +3100 +CD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CE70 +ENCODING 52848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +21 +01 +F9 +11 +31 +49 +80 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CE71 +ENCODING 52849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR CE72 +ENCODING 52850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +01 +F9 +11 +31 +49 +80 +3F +12 +3F +ENDCHAR +STARTCHAR CE73 +ENCODING 52851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +11 +31 +CD +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CE74 +ENCODING 52852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +F100 +1180 +2100 +4100 +8100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CE75 +ENCODING 52853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F100 +1180 +6100 +8100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CE76 +ENCODING 52854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR CE77 +ENCODING 52855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR CE78 +ENCODING 52856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +F180 +1100 +6100 +8100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR CE79 +ENCODING 52857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CE7A +ENCODING 52858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR CE7B +ENCODING 52859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR CE7C +ENCODING 52860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F180 +1100 +6100 +8000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR CE7D +ENCODING 52861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR CE7E +ENCODING 52862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR CE7F +ENCODING 52863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR CE80 +ENCODING 52864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR CE81 +ENCODING 52865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR CE82 +ENCODING 52866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR CE83 +ENCODING 52867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR CE84 +ENCODING 52868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F100 +1180 +6100 +8100 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR CE85 +ENCODING 52869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F180 +1100 +6100 +8000 +4100 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR CE86 +ENCODING 52870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CE87 +ENCODING 52871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +1100 +F180 +1100 +6100 +8100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR CE88 +ENCODING 52872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR CE89 +ENCODING 52873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F100 +1180 +6100 +8100 +3C00 +6200 +4100 +6200 +3C00 +ENDCHAR +STARTCHAR CE8A +ENCODING 52874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR CE8B +ENCODING 52875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR CE8C +ENCODING 52876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR CE8D +ENCODING 52877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR CE8E +ENCODING 52878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0900 +F180 +2100 +C100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR CE8F +ENCODING 52879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0900 +F180 +2100 +C000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR CE90 +ENCODING 52880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +F5 +27 +25 +45 +85 +05 +05 +05 +ENDCHAR +STARTCHAR CE91 +ENCODING 52881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +27 +65 +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CE92 +ENCODING 52882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +F7 +25 +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CE93 +ENCODING 52883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +2500 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CE94 +ENCODING 52884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +F700 +2500 +4500 +8500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CE95 +ENCODING 52885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +2500 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CE96 +ENCODING 52886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CE97 +ENCODING 52887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +F7 +25 +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CE98 +ENCODING 52888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F7 +25 +C5 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CE99 +ENCODING 52889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR CE9A +ENCODING 52890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR CE9B +ENCODING 52891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CE9C +ENCODING 52892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CE9D +ENCODING 52893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CE9E +ENCODING 52894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CE9F +ENCODING 52895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR CEA0 +ENCODING 52896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +27 +65 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CEA1 +ENCODING 52897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +27 +65 +85 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR CEA2 +ENCODING 52898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +2500 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CEA3 +ENCODING 52899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +F700 +2500 +4500 +8500 +0900 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR CEA4 +ENCODING 52900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +F500 +2700 +6500 +8500 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR CEA5 +ENCODING 52901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +F5 +27 +65 +85 +00 +3E +21 +21 +3E +ENDCHAR +STARTCHAR CEA6 +ENCODING 52902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +F700 +2500 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CEA7 +ENCODING 52903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1500 +7700 +6500 +8500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CEA8 +ENCODING 52904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +F7 +25 +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CEA9 +ENCODING 52905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CEAA +ENCODING 52906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +F7 +25 +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CEAB +ENCODING 52907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +77 +65 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CEAC +ENCODING 52908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0980 +F100 +1100 +2180 +4100 +8100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CEAD +ENCODING 52909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0980 +F100 +1180 +6100 +8100 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR CEAE +ENCODING 52910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR CEAF +ENCODING 52911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR CEB0 +ENCODING 52912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +F100 +2100 +4180 +8100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR CEB1 +ENCODING 52913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0600 +4100 +4200 +4500 +3000 +ENDCHAR +STARTCHAR CEB2 +ENCODING 52914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR CEB3 +ENCODING 52915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +7E00 +4000 +7E00 +ENDCHAR +STARTCHAR CEB4 +ENCODING 52916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7E00 +0100 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR CEB5 +ENCODING 52917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR CEB6 +ENCODING 52918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR CEB7 +ENCODING 52919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR CEB8 +ENCODING 52920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR CEB9 +ENCODING 52921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR CEBA +ENCODING 52922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR CEBB +ENCODING 52923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR CEBC +ENCODING 52924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR CEBD +ENCODING 52925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR CEBE +ENCODING 52926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CEBF +ENCODING 52927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR CEC0 +ENCODING 52928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR CEC1 +ENCODING 52929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0980 +F100 +1180 +6100 +8100 +3C00 +6200 +4100 +6200 +3C00 +ENDCHAR +STARTCHAR CEC2 +ENCODING 52930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +3E00 +0400 +3F00 +4000 +ENDCHAR +STARTCHAR CEC3 +ENCODING 52931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR CEC4 +ENCODING 52932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +3F00 +7E00 +0100 +ENDCHAR +STARTCHAR CEC5 +ENCODING 52933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR CEC6 +ENCODING 52934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +0980 +F100 +2180 +C100 +0000 +3E00 +2200 +7F00 +ENDCHAR +STARTCHAR CEC7 +ENCODING 52935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +0980 +F100 +2180 +C000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR CEC8 +ENCODING 52936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +F5 +15 +17 +F5 +25 +47 +85 +05 +05 +ENDCHAR +STARTCHAR CEC9 +ENCODING 52937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CECA +ENCODING 52938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CECB +ENCODING 52939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +2700 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CECC +ENCODING 52940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +F7 +25 +47 +85 +05 +20 +3F +ENDCHAR +STARTCHAR CECD +ENCODING 52941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +2700 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CECE +ENCODING 52942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CECF +ENCODING 52943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CED0 +ENCODING 52944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CED1 +ENCODING 52945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR CED2 +ENCODING 52946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR CED3 +ENCODING 52947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CED4 +ENCODING 52948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CED5 +ENCODING 52949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CED6 +ENCODING 52950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CED7 +ENCODING 52951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR CED8 +ENCODING 52952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR CED9 +ENCODING 52953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR CEDA +ENCODING 52954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +2700 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CEDB +ENCODING 52955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR CEDC +ENCODING 52956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +2700 +C500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CEDD +ENCODING 52957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +27 +C5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR CEDE +ENCODING 52958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1700 +F500 +2700 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CEDF +ENCODING 52959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1700 +7500 +6700 +8500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CEE0 +ENCODING 52960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CEE1 +ENCODING 52961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CEE2 +ENCODING 52962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +17 +F5 +27 +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CEE3 +ENCODING 52963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +17 +75 +67 +85 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CEE4 +ENCODING 52964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +FF +11 +21 +41 +81 +01 +01 +01 +ENDCHAR +STARTCHAR CEE5 +ENCODING 52965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F7 +11 +21 +C1 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CEE6 +ENCODING 52966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +F7 +21 +41 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CEE7 +ENCODING 52967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F700 +2100 +4100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CEE8 +ENCODING 52968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F7 +11 +61 +81 +01 +20 +20 +3F +ENDCHAR +STARTCHAR CEE9 +ENCODING 52969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +F7 +21 +41 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR CEEA +ENCODING 52970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR CEEB +ENCODING 52971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F7 +11 +21 +C1 +00 +3F +20 +20 +3F +ENDCHAR +STARTCHAR CEEC +ENCODING 52972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F7 +11 +21 +C0 +3F +01 +3F +20 +3F +ENDCHAR +STARTCHAR CEED +ENCODING 52973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR CEEE +ENCODING 52974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CEEF +ENCODING 52975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CEF0 +ENCODING 52976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CEF1 +ENCODING 52977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CEF2 +ENCODING 52978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CEF3 +ENCODING 52979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR CEF4 +ENCODING 52980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F7 +11 +21 +C1 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CEF5 +ENCODING 52981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F7 +11 +21 +C0 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR CEF6 +ENCODING 52982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F700 +2100 +4100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CEF7 +ENCODING 52983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0900 +F700 +1100 +6100 +8100 +0800 +0800 +3600 +4180 +ENDCHAR +STARTCHAR CEF8 +ENCODING 52984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F700 +1100 +2100 +C100 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR CEF9 +ENCODING 52985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F7 +11 +21 +C1 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR CEFA +ENCODING 52986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F700 +2100 +4100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR CEFB +ENCODING 52987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +7700 +2100 +C100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR CEFC +ENCODING 52988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +F7 +21 +41 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CEFD +ENCODING 52989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR CEFE +ENCODING 52990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +F7 +21 +41 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CEFF +ENCODING 52991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +77 +21 +C1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CF00 +ENCODING 52992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +15 +FD +25 +25 +45 +85 +05 +05 +05 +ENDCHAR +STARTCHAR CF01 +ENCODING 52993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +25 +45 +85 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CF02 +ENCODING 52994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +FD +25 +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CF03 +ENCODING 52995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +2500 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CF04 +ENCODING 52996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +FD00 +2500 +4500 +8500 +2500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CF05 +ENCODING 52997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +2500 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CF06 +ENCODING 52998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CF07 +ENCODING 52999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +FD +25 +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CF08 +ENCODING 53000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +25 +45 +80 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CF09 +ENCODING 53001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR CF0A +ENCODING 53002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR CF0B +ENCODING 53003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CF0C +ENCODING 53004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CF0D +ENCODING 53005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CF0E +ENCODING 53006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CF0F +ENCODING 53007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR CF10 +ENCODING 53008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +25 +45 +85 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CF11 +ENCODING 53009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +25 +45 +85 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR CF12 +ENCODING 53010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +2500 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CF13 +ENCODING 53011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +1500 +1500 +FD00 +2500 +4500 +8100 +0800 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR CF14 +ENCODING 53012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +2500 +C500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CF15 +ENCODING 53013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +FD +25 +45 +81 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR CF16 +ENCODING 53014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1500 +FD00 +2500 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CF17 +ENCODING 53015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1500 +7D00 +6500 +8100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CF18 +ENCODING 53016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +15 +FD +25 +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CF19 +ENCODING 53017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CF1A +ENCODING 53018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +15 +FD +25 +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CF1B +ENCODING 53019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +15 +7D +65 +81 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CF1C +ENCODING 53020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +F1 +11 +2F +41 +81 +01 +01 +01 +ENDCHAR +STARTCHAR CF1D +ENCODING 53021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +0F +F1 +2F +41 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR CF1E +ENCODING 53022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +0F +F1 +2F +41 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CF1F +ENCODING 53023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0F00 +F100 +2F00 +4100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CF20 +ENCODING 53024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +0F +F1 +11 +6F +81 +01 +20 +20 +3F +ENDCHAR +STARTCHAR CF21 +ENCODING 53025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +0F +F1 +2F +41 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR CF22 +ENCODING 53026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR CF23 +ENCODING 53027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +0F +F1 +2F +41 +00 +7E +40 +7E +ENDCHAR +STARTCHAR CF24 +ENCODING 53028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +F1 +1F +21 +C0 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CF25 +ENCODING 53029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR CF26 +ENCODING 53030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CF27 +ENCODING 53031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CF28 +ENCODING 53032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CF29 +ENCODING 53033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CF2A +ENCODING 53034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CF2B +ENCODING 53035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR CF2C +ENCODING 53036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +F1 +1F +61 +81 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR CF2D +ENCODING 53037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +F1 +1F +61 +80 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR CF2E +ENCODING 53038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0F00 +F100 +2F00 +4100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR CF2F +ENCODING 53039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +0F00 +F100 +1F00 +6100 +8100 +0800 +0800 +3600 +4180 +ENDCHAR +STARTCHAR CF30 +ENCODING 53040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +FF00 +1100 +6F00 +C100 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR CF31 +ENCODING 53041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +0F +F1 +1F +61 +81 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR CF32 +ENCODING 53042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0F00 +F100 +2F00 +4100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR CF33 +ENCODING 53043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0F00 +7100 +2F00 +C100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR CF34 +ENCODING 53044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +0F +F1 +2F +41 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CF35 +ENCODING 53045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR CF36 +ENCODING 53046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +0F +F1 +2F +41 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CF37 +ENCODING 53047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +0F +71 +2F +C1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CF38 +ENCODING 53048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +15 +1D +F5 +25 +3D +45 +85 +05 +05 +05 +ENDCHAR +STARTCHAR CF39 +ENCODING 53049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CF3A +ENCODING 53050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR CF3B +ENCODING 53051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +3D00 +C500 +0000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR CF3C +ENCODING 53052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +2D +45 +85 +01 +20 +3F +ENDCHAR +STARTCHAR CF3D +ENCODING 53053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +3D00 +C500 +0700 +4100 +4100 +4680 +3000 +ENDCHAR +STARTCHAR CF3E +ENCODING 53054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR CF3F +ENCODING 53055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +3F +40 +7F +ENDCHAR +STARTCHAR CF40 +ENCODING 53056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR CF41 +ENCODING 53057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR CF42 +ENCODING 53058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR CF43 +ENCODING 53059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR CF44 +ENCODING 53060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR CF45 +ENCODING 53061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR CF46 +ENCODING 53062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR CF47 +ENCODING 53063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR CF48 +ENCODING 53064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +3F +41 +7F +ENDCHAR +STARTCHAR CF49 +ENCODING 53065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +21 +3F +3F +ENDCHAR +STARTCHAR CF4A +ENCODING 53066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +3D00 +C500 +0000 +4A00 +7200 +4D00 +7080 +ENDCHAR +STARTCHAR CF4B +ENCODING 53067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +08 +14 +63 +ENDCHAR +STARTCHAR CF4C +ENCODING 53068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +3D00 +C500 +0000 +1200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR CF4D +ENCODING 53069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +3D +C5 +0C +33 +41 +21 +1E +ENDCHAR +STARTCHAR CF4E +ENCODING 53070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +1D00 +F500 +3D00 +C500 +0000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR CF4F +ENCODING 53071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7500 +1D00 +7500 +7D00 +8100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR CF50 +ENCODING 53072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR CF51 +ENCODING 53073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR CF52 +ENCODING 53074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +1D +F5 +3D +C5 +00 +3F +12 +3F +ENDCHAR +STARTCHAR CF53 +ENCODING 53075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +75 +1D +75 +7D +81 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR CF54 +ENCODING 53076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +0080 +3F80 +0080 +0880 +0900 +0800 +FFC0 +ENDCHAR +STARTCHAR CF55 +ENCODING 53077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +0800 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CF56 +ENCODING 53078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR CF57 +ENCODING 53079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR CF58 +ENCODING 53080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +0800 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CF59 +ENCODING 53081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CF5A +ENCODING 53082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CF5B +ENCODING 53083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR CF5C +ENCODING 53084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CF5D +ENCODING 53085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CF5E +ENCODING 53086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CF5F +ENCODING 53087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CF60 +ENCODING 53088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CF61 +ENCODING 53089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CF62 +ENCODING 53090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR CF63 +ENCODING 53091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR CF64 +ENCODING 53092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +0800 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR CF65 +ENCODING 53093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +0800 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CF66 +ENCODING 53094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR CF67 +ENCODING 53095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +0800 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR CF68 +ENCODING 53096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR CF69 +ENCODING 53097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0900 +0800 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CF6A +ENCODING 53098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR CF6B +ENCODING 53099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR CF6C +ENCODING 53100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR CF6D +ENCODING 53101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR CF6E +ENCODING 53102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +3E80 +0100 +0800 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR CF6F +ENCODING 53103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR CF70 +ENCODING 53104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +0480 +7C80 +0480 +14C0 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CF71 +ENCODING 53105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +04C0 +1080 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CF72 +ENCODING 53106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +3F00 +0880 +0880 +ENDCHAR +STARTCHAR CF73 +ENCODING 53107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR CF74 +ENCODING 53108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +1480 +10C0 +FE80 +0080 +2080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR CF75 +ENCODING 53109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CF76 +ENCODING 53110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CF77 +ENCODING 53111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +3F80 +2000 +3F00 +ENDCHAR +STARTCHAR CF78 +ENCODING 53112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7CC0 +1480 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CF79 +ENCODING 53113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CF7A +ENCODING 53114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CF7B +ENCODING 53115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR CF7C +ENCODING 53116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CF7D +ENCODING 53117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR CF7E +ENCODING 53118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CF7F +ENCODING 53119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CF80 +ENCODING 53120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +04C0 +1080 +FE80 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR CF81 +ENCODING 53121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR CF82 +ENCODING 53122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +0900 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR CF83 +ENCODING 53123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR CF84 +ENCODING 53124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +1100 +1100 +2A80 +4400 +ENDCHAR +STARTCHAR CF85 +ENCODING 53125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +0480 +7C80 +04C0 +1080 +FE80 +0080 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CF86 +ENCODING 53126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +1F00 +0300 +1F80 +2000 +ENDCHAR +STARTCHAR CF87 +ENCODING 53127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR CF88 +ENCODING 53128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +3F00 +1F80 +0080 +ENDCHAR +STARTCHAR CF89 +ENCODING 53129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR CF8A +ENCODING 53130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +3C80 +04C0 +1080 +FE80 +0000 +3F80 +1100 +3F80 +ENDCHAR +STARTCHAR CF8B +ENCODING 53131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3C80 +7C80 +14C0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR CF8C +ENCODING 53132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +0A80 +7A80 +0B80 +2A80 +2280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR CF8D +ENCODING 53133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CF8E +ENCODING 53134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR CF8F +ENCODING 53135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR CF90 +ENCODING 53136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +0D +FD +17 +25 +D5 +00 +20 +3F +ENDCHAR +STARTCHAR CF91 +ENCODING 53137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR CF92 +ENCODING 53138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR CF93 +ENCODING 53139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR CF94 +ENCODING 53140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CF95 +ENCODING 53141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR CF96 +ENCODING 53142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR CF97 +ENCODING 53143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR CF98 +ENCODING 53144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR CF99 +ENCODING 53145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR CF9A +ENCODING 53146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR CF9B +ENCODING 53147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR CF9C +ENCODING 53148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR CF9D +ENCODING 53149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1080 +1F80 +1F80 +ENDCHAR +STARTCHAR CF9E +ENCODING 53150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +2900 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR CF9F +ENCODING 53151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR CFA0 +ENCODING 53152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1100 +1900 +2E80 +0040 +ENDCHAR +STARTCHAR CFA1 +ENCODING 53153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +7A80 +0B80 +1280 +FE80 +0080 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR CFA2 +ENCODING 53154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR CFA3 +ENCODING 53155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +0E00 +1F80 +0100 +0F80 +3040 +ENDCHAR +STARTCHAR CFA4 +ENCODING 53156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR CFA5 +ENCODING 53157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR CFA6 +ENCODING 53158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +3A80 +0B80 +1280 +FE80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR CFA7 +ENCODING 53159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3A80 +7A80 +0B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR CFA8 +ENCODING 53160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F9 +09 +29 +21 +FD +01 +01 +01 +ENDCHAR +STARTCHAR CFA9 +ENCODING 53161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR CFAA +ENCODING 53162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR CFAB +ENCODING 53163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +7900 +0900 +2100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR CFAC +ENCODING 53164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +F9 +29 +21 +DD +01 +40 +7F +ENDCHAR +STARTCHAR CFAD +ENCODING 53165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR CFAE +ENCODING 53166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR CFAF +ENCODING 53167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR CFB0 +ENCODING 53168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +05 +79 +29 +FD +00 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR CFB1 +ENCODING 53169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR CFB2 +ENCODING 53170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR CFB3 +ENCODING 53171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR CFB4 +ENCODING 53172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR CFB5 +ENCODING 53173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR CFB6 +ENCODING 53174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR CFB7 +ENCODING 53175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR CFB8 +ENCODING 53176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +7F +41 +7F +ENDCHAR +STARTCHAR CFB9 +ENCODING 53177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +41 +7F +7F +ENDCHAR +STARTCHAR CFBA +ENCODING 53178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR CFBB +ENCODING 53179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR CFBC +ENCODING 53180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR CFBD +ENCODING 53181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR CFBE +ENCODING 53182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +7900 +0900 +2100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR CFBF +ENCODING 53183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +F900 +0900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR CFC0 +ENCODING 53184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR CFC1 +ENCODING 53185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR CFC2 +ENCODING 53186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +21 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR CFC3 +ENCODING 53187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +09 +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR CFC4 +ENCODING 53188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +0080 +3F80 +0080 +1280 +1300 +1200 +FFC0 +ENDCHAR +STARTCHAR CFC5 +ENCODING 53189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR CFC6 +ENCODING 53190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR CFC7 +ENCODING 53191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR CFC8 +ENCODING 53192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +3F00 +1300 +1200 +FFC0 +2000 +2000 +3F00 +ENDCHAR +STARTCHAR CFC9 +ENCODING 53193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR CFCA +ENCODING 53194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR CFCB +ENCODING 53195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR CFCC +ENCODING 53196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR CFCD +ENCODING 53197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CFCE +ENCODING 53198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CFCF +ENCODING 53199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CFD0 +ENCODING 53200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CFD1 +ENCODING 53201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CFD2 +ENCODING 53202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR CFD3 +ENCODING 53203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR CFD4 +ENCODING 53204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F00 +2080 +3F80 +ENDCHAR +STARTCHAR CFD5 +ENCODING 53205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +2080 +3F00 +3F80 +ENDCHAR +STARTCHAR CFD6 +ENCODING 53206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR CFD7 +ENCODING 53207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR CFD8 +ENCODING 53208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR CFD9 +ENCODING 53209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR CFDA +ENCODING 53210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR CFDB +ENCODING 53211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR CFDC +ENCODING 53212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR CFDD +ENCODING 53213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR CFDE +ENCODING 53214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +3E80 +0100 +1400 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR CFDF +ENCODING 53215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR CFE0 +ENCODING 53216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR CFE1 +ENCODING 53217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR CFE2 +ENCODING 53218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +08 +7E +11 +11 +10 +ENDCHAR +STARTCHAR CFE3 +ENCODING 53219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7F00 +0500 +7A00 +0000 +FF00 +0800 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR CFE4 +ENCODING 53220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR CFE5 +ENCODING 53221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +08 +47 +42 +45 +30 +ENDCHAR +STARTCHAR CFE6 +ENCODING 53222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +0700 +4780 +4300 +4480 +3B00 +ENDCHAR +STARTCHAR CFE7 +ENCODING 53223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +05 +7A +00 +FF +08 +7E +40 +7E +ENDCHAR +STARTCHAR CFE8 +ENCODING 53224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR CFE9 +ENCODING 53225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR CFEA +ENCODING 53226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3F80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR CFEB +ENCODING 53227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR CFEC +ENCODING 53228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3500 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR CFED +ENCODING 53229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3700 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR CFEE +ENCODING 53230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3500 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR CFEF +ENCODING 53231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3700 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR CFF0 +ENCODING 53232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR CFF1 +ENCODING 53233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +2480 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR CFF2 +ENCODING 53234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +08 +92 +F6 +95 +F8 +ENDCHAR +STARTCHAR CFF3 +ENCODING 53235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +0400 +0400 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR CFF4 +ENCODING 53236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +08 +20 +26 +5D +80 +ENDCHAR +STARTCHAR CFF5 +ENCODING 53237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +0400 +1F00 +2180 +2180 +1F00 +ENDCHAR +STARTCHAR CFF6 +ENCODING 53238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +05 +7A +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR CFF7 +ENCODING 53239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR CFF8 +ENCODING 53240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +05 +7A +00 +FF +08 +7E +01 +7F +ENDCHAR +STARTCHAR CFF9 +ENCODING 53241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +3F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR CFFA +ENCODING 53242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +05 +7A +00 +FF +08 +7F +24 +7E +ENDCHAR +STARTCHAR CFFB +ENCODING 53243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0400 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR CFFC +ENCODING 53244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +7C80 +0480 +0480 +FE80 +1080 +1380 +1080 +1080 +0080 +ENDCHAR +STARTCHAR CFFD +ENCODING 53245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +3E +01 +01 +01 +ENDCHAR +STARTCHAR CFFE +ENCODING 53246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR CFFF +ENCODING 53247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D000 +ENCODING 53248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +FF +21 +27 +21 +40 +40 +7F +ENDCHAR +STARTCHAR D001 +ENCODING 53249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D002 +ENCODING 53250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR D003 +ENCODING 53251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +3F +40 +7E +ENDCHAR +STARTCHAR D004 +ENCODING 53252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +FF +09 +FF +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR D005 +ENCODING 53253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D006 +ENCODING 53254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR D007 +ENCODING 53255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D008 +ENCODING 53256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR D009 +ENCODING 53257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D00A +ENCODING 53258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR D00B +ENCODING 53259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR D00C +ENCODING 53260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +7F +41 +7F +ENDCHAR +STARTCHAR D00D +ENCODING 53261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +41 +7F +7F +ENDCHAR +STARTCHAR D00E +ENCODING 53262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +52 +72 +55 +78 +ENDCHAR +STARTCHAR D00F +ENCODING 53263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +08 +14 +63 +ENDCHAR +STARTCHAR D010 +ENCODING 53264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D011 +ENCODING 53265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +FF +09 +FF +21 +20 +3E +41 +41 +3E +ENDCHAR +STARTCHAR D012 +ENCODING 53266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1900 +6900 +DF00 +2100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D013 +ENCODING 53267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +7900 +0900 +FD00 +2700 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D014 +ENCODING 53268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D015 +ENCODING 53269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR D016 +ENCODING 53270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DF +21 +27 +3F +12 +3F +ENDCHAR +STARTCHAR D017 +ENCODING 53271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +27 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D018 +ENCODING 53272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +7A80 +0A80 +0A80 +FE80 +1280 +1680 +1280 +1280 +0280 +ENDCHAR +STARTCHAR D019 +ENCODING 53273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D01A +ENCODING 53274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D01B +ENCODING 53275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +7300 +FB00 +2B00 +2100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR D01C +ENCODING 53276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +0A80 +3A80 +FE80 +1680 +1280 +0080 +2000 +3F80 +ENDCHAR +STARTCHAR D01D +ENCODING 53277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +7300 +FB00 +2B00 +2100 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D01E +ENCODING 53278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +27C0 +2380 +2280 +1900 +ENDCHAR +STARTCHAR D01F +ENCODING 53279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +3F +40 +7F +ENDCHAR +STARTCHAR D020 +ENCODING 53280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +1F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR D021 +ENCODING 53281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +1F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR D022 +ENCODING 53282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +3B80 +1A80 +2280 +1B80 +ENDCHAR +STARTCHAR D023 +ENCODING 53283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +1E80 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR D024 +ENCODING 53284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +3900 +3900 +2280 +3800 +ENDCHAR +STARTCHAR D025 +ENCODING 53285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +1F80 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR D026 +ENCODING 53286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR D027 +ENCODING 53287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0380 +3F80 +3B80 +2280 +3900 +ENDCHAR +STARTCHAR D028 +ENCODING 53288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +3F +41 +7F +ENDCHAR +STARTCHAR D029 +ENCODING 53289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +41 +7F +7F +ENDCHAR +STARTCHAR D02A +ENCODING 53290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +7300 +FB00 +2B00 +2100 +4200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D02B +ENCODING 53291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +08 +1C +63 +ENDCHAR +STARTCHAR D02C +ENCODING 53292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +02 +22 +55 +08 +ENDCHAR +STARTCHAR D02D +ENCODING 53293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +0A80 +7E80 +0A80 +FE80 +1280 +1080 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR D02E +ENCODING 53294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F300 +1300 +7300 +FB00 +2B00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D02F +ENCODING 53295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR D030 +ENCODING 53296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +3F +01 +3F +01 +ENDCHAR +STARTCHAR D031 +ENCODING 53297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0000 +1F80 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D032 +ENCODING 53298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F3 +13 +73 +FB +2B +21 +3F +12 +3F +ENDCHAR +STARTCHAR D033 +ENCODING 53299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +3A80 +0A80 +FE80 +1680 +0E00 +1980 +0600 +1900 +0F00 +ENDCHAR +STARTCHAR D034 +ENCODING 53300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +0480 +7C80 +0480 +0480 +FE80 +1080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR D035 +ENCODING 53301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +FF +21 +20 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D036 +ENCODING 53302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D037 +ENCODING 53303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D038 +ENCODING 53304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +09 +FF +21 +21 +41 +40 +7F +ENDCHAR +STARTCHAR D039 +ENCODING 53305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D03A +ENCODING 53306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR D03B +ENCODING 53307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +3F +40 +7E +ENDCHAR +STARTCHAR D03C +ENCODING 53308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +FF +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR D03D +ENCODING 53309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D03E +ENCODING 53310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR D03F +ENCODING 53311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D040 +ENCODING 53312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR D041 +ENCODING 53313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D042 +ENCODING 53314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR D043 +ENCODING 53315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR D044 +ENCODING 53316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +FF +21 +20 +7F +41 +41 +7F +ENDCHAR +STARTCHAR D045 +ENCODING 53317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +FF +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR D046 +ENCODING 53318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR D047 +ENCODING 53319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +0900 +F900 +0900 +FF00 +2100 +2100 +2800 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR D048 +ENCODING 53320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D049 +ENCODING 53321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +09 +FF +21 +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR D04A +ENCODING 53322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +1900 +6900 +DD00 +2100 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D04B +ENCODING 53323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +7900 +0900 +FD00 +2100 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D04C +ENCODING 53324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D04D +ENCODING 53325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR D04E +ENCODING 53326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +19 +69 +DD +21 +01 +3F +12 +3F +ENDCHAR +STARTCHAR D04F +ENCODING 53327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +79 +09 +FD +21 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D050 +ENCODING 53328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR D051 +ENCODING 53329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +7E +01 +01 +ENDCHAR +STARTCHAR D052 +ENCODING 53330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +7E +11 +11 +10 +ENDCHAR +STARTCHAR D053 +ENCODING 53331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7F00 +0500 +7A00 +0000 +FF00 +2400 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR D054 +ENCODING 53332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR D055 +ENCODING 53333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +47 +42 +45 +30 +ENDCHAR +STARTCHAR D056 +ENCODING 53334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +0300 +4780 +4300 +4480 +3B00 +ENDCHAR +STARTCHAR D057 +ENCODING 53335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +05 +7A +00 +FF +24 +7E +40 +7E +ENDCHAR +STARTCHAR D058 +ENCODING 53336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D059 +ENCODING 53337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D05A +ENCODING 53338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D05B +ENCODING 53339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D05C +ENCODING 53340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D05D +ENCODING 53341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR D05E +ENCODING 53342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D05F +ENCODING 53343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR D060 +ENCODING 53344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D061 +ENCODING 53345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +05 +7A +00 +FF +64 +41 +7F +7F +ENDCHAR +STARTCHAR D062 +ENCODING 53346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +92 +F6 +95 +F8 +ENDCHAR +STARTCHAR D063 +ENCODING 53347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +08 +18 +66 +81 +ENDCHAR +STARTCHAR D064 +ENCODING 53348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +20 +26 +5D +80 +ENDCHAR +STARTCHAR D065 +ENCODING 53349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +3E +41 +42 +3C +ENDCHAR +STARTCHAR D066 +ENCODING 53350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +7E +04 +7F +ENDCHAR +STARTCHAR D067 +ENCODING 53351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +2100 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR D068 +ENCODING 53352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7F +05 +7A +00 +FF +24 +7E +01 +7F +ENDCHAR +STARTCHAR D069 +ENCODING 53353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +1200 +3F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR D06A +ENCODING 53354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +05 +7A +00 +FF +24 +7F +24 +7E +ENDCHAR +STARTCHAR D06B +ENCODING 53355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +2100 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR D06C +ENCODING 53356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +0080 +0080 +0080 +3F00 +0080 +0100 +0100 +FFC0 +ENDCHAR +STARTCHAR D06D +ENCODING 53357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D06E +ENCODING 53358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR D06F +ENCODING 53359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR D070 +ENCODING 53360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +0100 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D071 +ENCODING 53361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D072 +ENCODING 53362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR D073 +ENCODING 53363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR D074 +ENCODING 53364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D075 +ENCODING 53365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR D076 +ENCODING 53366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR D077 +ENCODING 53367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR D078 +ENCODING 53368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR D079 +ENCODING 53369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR D07A +ENCODING 53370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR D07B +ENCODING 53371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR D07C +ENCODING 53372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0080 +0100 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D07D +ENCODING 53373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0100 +FFC0 +0000 +2080 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D07E +ENCODING 53374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D07F +ENCODING 53375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +0400 +0C00 +3300 +4080 +ENDCHAR +STARTCHAR D080 +ENCODING 53376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR D081 +ENCODING 53377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +0080 +3F00 +0080 +0100 +FFC0 +0000 +1F00 +2180 +2180 +1F00 +ENDCHAR +STARTCHAR D082 +ENCODING 53378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR D083 +ENCODING 53379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR D084 +ENCODING 53380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR D085 +ENCODING 53381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +01 +7E +02 +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR D086 +ENCODING 53382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F80 +0080 +3F00 +0100 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR D087 +ENCODING 53383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +01 +7E +02 +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR D088 +ENCODING 53384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +79 +09 +09 +1F +E1 +01 +01 +01 +ENDCHAR +STARTCHAR D089 +ENCODING 53385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D08A +ENCODING 53386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D08B +ENCODING 53387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +7900 +0900 +0100 +FF00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D08C +ENCODING 53388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +F9 +09 +FD +01 +01 +40 +7F +ENDCHAR +STARTCHAR D08D +ENCODING 53389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR D08E +ENCODING 53390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D08F +ENCODING 53391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +3F +40 +7E +ENDCHAR +STARTCHAR D090 +ENCODING 53392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +3F00 +0080 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR D091 +ENCODING 53393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +0000 +1B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D092 +ENCODING 53394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +0000 +3F80 +3C80 +2480 +3B00 +ENDCHAR +STARTCHAR D093 +ENCODING 53395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +3000 +0A80 +3B80 +2280 +3B80 +ENDCHAR +STARTCHAR D094 +ENCODING 53396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D095 +ENCODING 53397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +3100 +0A00 +3B80 +2200 +3B80 +ENDCHAR +STARTCHAR D096 +ENCODING 53398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D097 +ENCODING 53399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +3380 +0F80 +3B00 +2480 +3B00 +ENDCHAR +STARTCHAR D098 +ENCODING 53400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +7F +41 +7F +ENDCHAR +STARTCHAR D099 +ENCODING 53401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +41 +7F +7F +ENDCHAR +STARTCHAR D09A +ENCODING 53402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR D09B +ENCODING 53403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +08 +14 +63 +ENDCHAR +STARTCHAR D09C +ENCODING 53404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D09D +ENCODING 53405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR D09E +ENCODING 53406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +7900 +0900 +0100 +FF00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D09F +ENCODING 53407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR D0A0 +ENCODING 53408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR D0A1 +ENCODING 53409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +0F00 +1000 +1F80 +1000 +1F80 +ENDCHAR +STARTCHAR D0A2 +ENCODING 53410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +79 +09 +01 +FF +01 +7F +12 +3F +ENDCHAR +STARTCHAR D0A3 +ENCODING 53411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +3C80 +7C80 +0480 +0080 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR D0A4 +ENCODING 53412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F1 +11 +21 +41 +81 +01 +01 +01 +ENDCHAR +STARTCHAR D0A5 +ENCODING 53413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +11 +21 +C1 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D0A6 +ENCODING 53414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +F1 +21 +41 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D0A7 +ENCODING 53415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F100 +2100 +4100 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D0A8 +ENCODING 53416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F1 +11 +61 +81 +01 +21 +20 +3F +ENDCHAR +STARTCHAR D0A9 +ENCODING 53417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +F1 +21 +41 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D0AA +ENCODING 53418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D0AB +ENCODING 53419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +F1 +21 +41 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D0AC +ENCODING 53420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +11 +21 +C0 +3F +01 +3F +20 +3F +ENDCHAR +STARTCHAR D0AD +ENCODING 53421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D0AE +ENCODING 53422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D0AF +ENCODING 53423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D0B0 +ENCODING 53424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D0B1 +ENCODING 53425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D0B2 +ENCODING 53426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D0B3 +ENCODING 53427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D0B4 +ENCODING 53428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +11 +21 +C1 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D0B5 +ENCODING 53429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +11 +21 +C0 +41 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D0B6 +ENCODING 53430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F100 +2100 +4100 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D0B7 +ENCODING 53431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +09 +F1 +11 +61 +81 +08 +0C +36 +41 +ENDCHAR +STARTCHAR D0B8 +ENCODING 53432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F100 +2100 +4100 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D0B9 +ENCODING 53433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +09 +F9 +11 +61 +81 +1E +21 +41 +21 +1E +ENDCHAR +STARTCHAR D0BA +ENCODING 53434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +0900 +F100 +2100 +4100 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D0BB +ENCODING 53435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +0900 +7100 +2100 +C100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D0BC +ENCODING 53436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +09 +F1 +21 +41 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D0BD +ENCODING 53437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D0BE +ENCODING 53438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +09 +F1 +21 +41 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D0BF +ENCODING 53439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +09 +71 +21 +C1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D0C0 +ENCODING 53440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +F900 +8180 +8100 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR D0C1 +ENCODING 53441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F980 +8100 +8100 +FD00 +0000 +7E00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR D0C2 +ENCODING 53442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR D0C3 +ENCODING 53443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR D0C4 +ENCODING 53444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8100 +F980 +8100 +8100 +FD00 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR D0C5 +ENCODING 53445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR D0C6 +ENCODING 53446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR D0C7 +ENCODING 53447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR D0C8 +ENCODING 53448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR D0C9 +ENCODING 53449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7F00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D0CA +ENCODING 53450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR D0CB +ENCODING 53451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +6000 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR D0CC +ENCODING 53452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +6200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR D0CD +ENCODING 53453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +6600 +1800 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR D0CE +ENCODING 53454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +6000 +1700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D0CF +ENCODING 53455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +6600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR D0D0 +ENCODING 53456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F980 +8100 +8100 +FD00 +0000 +7E00 +4100 +4100 +7E00 +ENDCHAR +STARTCHAR D0D1 +ENCODING 53457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F980 +8100 +8100 +FD00 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR D0D2 +ENCODING 53458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR D0D3 +ENCODING 53459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F900 +8180 +8100 +FD00 +0100 +0800 +1800 +3600 +4100 +ENDCHAR +STARTCHAR D0D4 +ENCODING 53460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F900 +8180 +8100 +FD00 +0000 +2200 +2200 +5500 +8880 +ENDCHAR +STARTCHAR D0D5 +ENCODING 53461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F900 +8180 +8100 +FD00 +0100 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR D0D6 +ENCODING 53462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR D0D7 +ENCODING 53463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR D0D8 +ENCODING 53464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR D0D9 +ENCODING 53465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +3E00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D0DA +ENCODING 53466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8100 +F980 +8100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR D0DB +ENCODING 53467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8100 +F180 +8100 +7800 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR D0DC +ENCODING 53468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +F5 +87 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR D0DD +ENCODING 53469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +F5 +87 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D0DE +ENCODING 53470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +85 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D0DF +ENCODING 53471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +8500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D0E0 +ENCODING 53472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +8500 +F700 +8500 +8500 +FD00 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D0E1 +ENCODING 53473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +8500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D0E2 +ENCODING 53474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D0E3 +ENCODING 53475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +85 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR D0E4 +ENCODING 53476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +F7 +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D0E5 +ENCODING 53477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D0E6 +ENCODING 53478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D0E7 +ENCODING 53479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D0E8 +ENCODING 53480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D0E9 +ENCODING 53481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D0EA +ENCODING 53482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D0EB +ENCODING 53483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +E700 +8500 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D0EC +ENCODING 53484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +F5 +87 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D0ED +ENCODING 53485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +F5 +87 +85 +FD +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR D0EE +ENCODING 53486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +8500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D0EF +ENCODING 53487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +F500 +8700 +8500 +FD00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR D0F0 +ENCODING 53488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +F500 +8700 +8500 +FD00 +0000 +2200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR D0F1 +ENCODING 53489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +F5 +87 +85 +FD +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR D0F2 +ENCODING 53490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +F700 +8500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D0F3 +ENCODING 53491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +E700 +8500 +F500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D0F4 +ENCODING 53492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +F7 +85 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D0F5 +ENCODING 53493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D0F6 +ENCODING 53494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +85 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR D0F7 +ENCODING 53495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +E7 +85 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D0F8 +ENCODING 53496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +8180 +F900 +8100 +8180 +8100 +FD00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR D0F9 +ENCODING 53497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR D0FA +ENCODING 53498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR D0FB +ENCODING 53499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR D0FC +ENCODING 53500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +F100 +8100 +B980 +4100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR D0FD +ENCODING 53501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR D0FE +ENCODING 53502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR D0FF +ENCODING 53503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR D100 +ENCODING 53504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +3E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR D101 +ENCODING 53505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +6600 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D102 +ENCODING 53506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR D103 +ENCODING 53507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +6000 +1900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR D104 +ENCODING 53508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +6200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR D105 +ENCODING 53509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +6600 +1800 +7E00 +8800 +7700 +ENDCHAR +STARTCHAR D106 +ENCODING 53510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +6000 +1700 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D107 +ENCODING 53511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +6600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR D108 +ENCODING 53512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR D109 +ENCODING 53513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR D10A +ENCODING 53514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR D10B +ENCODING 53515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR D10C +ENCODING 53516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR D10D +ENCODING 53517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F980 +8100 +8180 +FD00 +0100 +3E00 +4100 +4100 +3E00 +ENDCHAR +STARTCHAR D10E +ENCODING 53518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR D10F +ENCODING 53519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR D110 +ENCODING 53520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR D111 +ENCODING 53521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +3E00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D112 +ENCODING 53522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +8180 +F900 +8180 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR D113 +ENCODING 53523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F100 +8180 +F100 +8180 +7800 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR D114 +ENCODING 53524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +F5 +85 +87 +F5 +85 +87 +F5 +05 +05 +ENDCHAR +STARTCHAR D115 +ENCODING 53525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D116 +ENCODING 53526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D117 +ENCODING 53527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +F500 +8700 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D118 +ENCODING 53528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +F7 +85 +B7 +45 +05 +20 +3F +ENDCHAR +STARTCHAR D119 +ENCODING 53529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +F500 +8700 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D11A +ENCODING 53530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D11B +ENCODING 53531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR D11C +ENCODING 53532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR D11D +ENCODING 53533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D11E +ENCODING 53534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D11F +ENCODING 53535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D120 +ENCODING 53536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D121 +ENCODING 53537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D122 +ENCODING 53538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D123 +ENCODING 53539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +E500 +8700 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D124 +ENCODING 53540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR D125 +ENCODING 53541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR D126 +ENCODING 53542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +F500 +8700 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D127 +ENCODING 53543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR D128 +ENCODING 53544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +F500 +8700 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D129 +ENCODING 53545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +F5 +87 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR D12A +ENCODING 53546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +F500 +8700 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D12B +ENCODING 53547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8700 +E500 +8700 +F500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D12C +ENCODING 53548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D12D +ENCODING 53549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D12E +ENCODING 53550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +87 +F5 +87 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR D12F +ENCODING 53551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +87 +E5 +87 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D130 +ENCODING 53552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F7 +81 +81 +81 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR D131 +ENCODING 53553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +F7 +81 +81 +F9 +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D132 +ENCODING 53554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +81 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D133 +ENCODING 53555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F700 +8100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D134 +ENCODING 53556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +81 +F7 +81 +81 +F9 +01 +20 +20 +3F +ENDCHAR +STARTCHAR D135 +ENCODING 53557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +81 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D136 +ENCODING 53558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D137 +ENCODING 53559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +81 +F7 +81 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D138 +ENCODING 53560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +F7 +81 +F9 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D139 +ENCODING 53561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D13A +ENCODING 53562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +F7 +81 +F9 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D13B +ENCODING 53563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D13C +ENCODING 53564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D13D +ENCODING 53565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D13E +ENCODING 53566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D13F +ENCODING 53567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D140 +ENCODING 53568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +F7 +81 +81 +F9 +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D141 +ENCODING 53569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +F7 +81 +81 +F9 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D142 +ENCODING 53570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F700 +8100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D143 +ENCODING 53571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +8100 +F700 +8100 +8100 +F900 +0100 +0800 +0800 +3600 +4180 +ENDCHAR +STARTCHAR D144 +ENCODING 53572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +8100 +F700 +8100 +8100 +F900 +0100 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR D145 +ENCODING 53573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +F7 +81 +81 +F9 +01 +3E +21 +21 +3E +ENDCHAR +STARTCHAR D146 +ENCODING 53574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F700 +8100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D147 +ENCODING 53575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F700 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D148 +ENCODING 53576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +81 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D149 +ENCODING 53577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D14A +ENCODING 53578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +81 +F7 +81 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D14B +ENCODING 53579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F7 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D14C +ENCODING 53580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +85 +ED +85 +85 +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR D14D +ENCODING 53581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +ED +85 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D14E +ENCODING 53582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +FD +85 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D14F +ENCODING 53583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +FD00 +8500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D150 +ENCODING 53584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +8500 +ED00 +8500 +8500 +FD00 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D151 +ENCODING 53585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +FD00 +8500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D152 +ENCODING 53586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D153 +ENCODING 53587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +FD +85 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR D154 +ENCODING 53588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +ED +85 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D155 +ENCODING 53589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D156 +ENCODING 53590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D157 +ENCODING 53591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D158 +ENCODING 53592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D159 +ENCODING 53593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D15A +ENCODING 53594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D15B +ENCODING 53595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +ED00 +8500 +F100 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D15C +ENCODING 53596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +ED +85 +85 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D15D +ENCODING 53597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +ED +85 +85 +FD +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR D15E +ENCODING 53598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +FD00 +8500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D15F +ENCODING 53599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +ED00 +8500 +8500 +FD00 +0100 +0800 +0C00 +3600 +4180 +ENDCHAR +STARTCHAR D160 +ENCODING 53600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +FD00 +8500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D161 +ENCODING 53601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +ED +85 +85 +FD +00 +3E +41 +41 +3E +ENDCHAR +STARTCHAR D162 +ENCODING 53602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +FD00 +8500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D163 +ENCODING 53603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8500 +ED00 +8500 +F100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D164 +ENCODING 53604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +FD +85 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D165 +ENCODING 53605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D166 +ENCODING 53606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +85 +FD +85 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR D167 +ENCODING 53607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +85 +ED +85 +F1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D168 +ENCODING 53608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +87 +F1 +81 +87 +81 +F9 +01 +01 +01 +ENDCHAR +STARTCHAR D169 +ENCODING 53609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR D16A +ENCODING 53610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D16B +ENCODING 53611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8700 +F300 +8100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D16C +ENCODING 53612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F1 +81 +87 +F1 +87 +81 +F9 +01 +20 +20 +3F +ENDCHAR +STARTCHAR D16D +ENCODING 53613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +F3 +81 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D16E +ENCODING 53614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D16F +ENCODING 53615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D170 +ENCODING 53616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D171 +ENCODING 53617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D172 +ENCODING 53618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D173 +ENCODING 53619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D174 +ENCODING 53620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D175 +ENCODING 53621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D176 +ENCODING 53622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D177 +ENCODING 53623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D178 +ENCODING 53624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +7F +41 +7F +ENDCHAR +STARTCHAR D179 +ENCODING 53625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +87 +F3 +81 +F9 +01 +41 +7F +7F +ENDCHAR +STARTCHAR D17A +ENCODING 53626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8700 +F300 +8100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D17B +ENCODING 53627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +08 +14 +63 +ENDCHAR +STARTCHAR D17C +ENCODING 53628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F100 +8700 +F100 +8700 +8100 +F900 +0000 +2200 +2200 +7500 +C880 +ENDCHAR +STARTCHAR D17D +ENCODING 53629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +F3 +81 +F9 +0C +32 +41 +23 +1C +ENDCHAR +STARTCHAR D17E +ENCODING 53630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8700 +F300 +8100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D17F +ENCODING 53631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8300 +F700 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D180 +ENCODING 53632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D181 +ENCODING 53633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D182 +ENCODING 53634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +87 +F3 +81 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D183 +ENCODING 53635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +83 +F7 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D184 +ENCODING 53636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F5 +85 +8D +E5 +85 +8D +85 +FD +05 +05 +05 +ENDCHAR +STARTCHAR D185 +ENCODING 53637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D186 +ENCODING 53638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D187 +ENCODING 53639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +F500 +8500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D188 +ENCODING 53640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F500 +8500 +8D00 +E500 +8D00 +8500 +FD00 +0500 +4000 +4000 +3F80 +ENDCHAR +STARTCHAR D189 +ENCODING 53641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +F500 +8500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D18A +ENCODING 53642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D18B +ENCODING 53643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR D18C +ENCODING 53644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR D18D +ENCODING 53645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D18E +ENCODING 53646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D18F +ENCODING 53647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D190 +ENCODING 53648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D191 +ENCODING 53649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D192 +ENCODING 53650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D193 +ENCODING 53651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +ED00 +8500 +F100 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D194 +ENCODING 53652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR D195 +ENCODING 53653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR D196 +ENCODING 53654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +F500 +8500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D197 +ENCODING 53655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +8D +F5 +8D +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR D198 +ENCODING 53656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +F500 +8500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D199 +ENCODING 53657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +F5 +8D +FD +09 +37 +41 +23 +1C +ENDCHAR +STARTCHAR D19A +ENCODING 53658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +F500 +8500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D19B +ENCODING 53659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +8D00 +ED00 +8500 +F100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D19C +ENCODING 53660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D19D +ENCODING 53661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D19E +ENCODING 53662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +8D +F5 +85 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR D19F +ENCODING 53663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +8D +ED +85 +F1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D1A0 +ENCODING 53664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2000 +3F00 +2000 +2000 +3F80 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR D1A1 +ENCODING 53665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D1A2 +ENCODING 53666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +7E +11 +11 +10 +ENDCHAR +STARTCHAR D1A3 +ENCODING 53667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +F2 +16 +15 +18 +ENDCHAR +STARTCHAR D1A4 +ENCODING 53668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D1A5 +ENCODING 53669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +07 +42 +45 +20 +ENDCHAR +STARTCHAR D1A6 +ENCODING 53670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D1A7 +ENCODING 53671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +08 +F7 +7E +40 +7E +ENDCHAR +STARTCHAR D1A8 +ENCODING 53672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D1A9 +ENCODING 53673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D1AA +ENCODING 53674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +3300 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D1AB +ENCODING 53675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +3000 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D1AC +ENCODING 53676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D1AD +ENCODING 53677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR D1AE +ENCODING 53678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D1AF +ENCODING 53679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR D1B0 +ENCODING 53680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D1B1 +ENCODING 53681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D1B2 +ENCODING 53682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +12 +72 +95 +78 +ENDCHAR +STARTCHAR D1B3 +ENCODING 53683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR D1B4 +ENCODING 53684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +20 +26 +5D +80 +ENDCHAR +STARTCHAR D1B5 +ENCODING 53685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D1B6 +ENCODING 53686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +7E +02 +7F +ENDCHAR +STARTCHAR D1B7 +ENCODING 53687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR D1B8 +ENCODING 53688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +08 +F7 +7E +01 +7F +ENDCHAR +STARTCHAR D1B9 +ENCODING 53689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR D1BA +ENCODING 53690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0400 +FFC0 +0000 +3F80 +1200 +7F80 +ENDCHAR +STARTCHAR D1BB +ENCODING 53691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3B00 +0400 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR D1BC +ENCODING 53692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4080 +7C80 +4080 +7CC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D1BD +ENCODING 53693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR D1BE +ENCODING 53694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR D1BF +ENCODING 53695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR D1C0 +ENCODING 53696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +4080 +7C80 +4080 +7CC0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D1C1 +ENCODING 53697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR D1C2 +ENCODING 53698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0300 +0480 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D1C3 +ENCODING 53699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR D1C4 +ENCODING 53700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3F00 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D1C5 +ENCODING 53701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D1C6 +ENCODING 53702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D1C7 +ENCODING 53703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3C80 +3F00 +4480 +3B00 +ENDCHAR +STARTCHAR D1C8 +ENCODING 53704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D1C9 +ENCODING 53705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3F00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR D1CA +ENCODING 53706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D1CB +ENCODING 53707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0300 +3880 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR D1CC +ENCODING 53708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR D1CD +ENCODING 53709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR D1CE +ENCODING 53710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +9200 +F200 +9500 +7800 +ENDCHAR +STARTCHAR D1CF +ENCODING 53711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8180 +7900 +3D00 +C000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR D1D0 +ENCODING 53712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR D1D1 +ENCODING 53713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8180 +7900 +3D00 +C000 +3E00 +4100 +4200 +3C00 +ENDCHAR +STARTCHAR D1D2 +ENCODING 53714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7900 +F900 +8180 +7900 +2D00 +D000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR D1D3 +ENCODING 53715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR D1D4 +ENCODING 53716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR D1D5 +ENCODING 53717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE80 +0000 +3F00 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR D1D6 +ENCODING 53718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7900 +F900 +8100 +7980 +3D00 +C000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR D1D7 +ENCODING 53719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +3C80 +6CC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR D1D8 +ENCODING 53720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4280 +7A80 +4280 +7B80 +1280 +1280 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR D1D9 +ENCODING 53721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D1DA +ENCODING 53722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D1DB +ENCODING 53723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D1DC +ENCODING 53724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +4280 +7280 +7B80 +1280 +FA80 +0280 +1000 +1F80 +ENDCHAR +STARTCHAR D1DD +ENCODING 53725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D1DE +ENCODING 53726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR D1DF +ENCODING 53727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR D1E0 +ENCODING 53728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D1E1 +ENCODING 53729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR D1E2 +ENCODING 53730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR D1E3 +ENCODING 53731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR D1E4 +ENCODING 53732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR D1E5 +ENCODING 53733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR D1E6 +ENCODING 53734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR D1E7 +ENCODING 53735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR D1E8 +ENCODING 53736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR D1E9 +ENCODING 53737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR D1EA +ENCODING 53738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D1EB +ENCODING 53739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR D1EC +ENCODING 53740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D1ED +ENCODING 53741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR D1EE +ENCODING 53742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +F500 +8700 +F500 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D1EF +ENCODING 53743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0000 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR D1F0 +ENCODING 53744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D1F1 +ENCODING 53745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D1F2 +ENCODING 53746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +F5 +87 +F5 +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR D1F3 +ENCODING 53747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4380 +3A80 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR D1F4 +ENCODING 53748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +7C80 +4080 +7C80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D1F5 +ENCODING 53749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +3E +01 +01 +01 +ENDCHAR +STARTCHAR D1F6 +ENCODING 53750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D1F7 +ENCODING 53751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D1F8 +ENCODING 53752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +21 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR D1F9 +ENCODING 53753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D1FA +ENCODING 53754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +07 +4F +42 +45 +37 +ENDCHAR +STARTCHAR D1FB +ENCODING 53755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR D1FC +ENCODING 53756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +3F +3F +40 +3F +ENDCHAR +STARTCHAR D1FD +ENCODING 53757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D1FE +ENCODING 53758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +77 +79 +49 +76 +ENDCHAR +STARTCHAR D1FF +ENCODING 53759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D200 +ENCODING 53760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +72 +32 +45 +70 +ENDCHAR +STARTCHAR D201 +ENCODING 53761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D202 +ENCODING 53762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D203 +ENCODING 53763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR D204 +ENCODING 53764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +7F +41 +7F +ENDCHAR +STARTCHAR D205 +ENCODING 53765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +41 +7F +7F +ENDCHAR +STARTCHAR D206 +ENCODING 53766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +12 +72 +55 +70 +ENDCHAR +STARTCHAR D207 +ENCODING 53767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +21 +FF +01 +08 +14 +63 +ENDCHAR +STARTCHAR D208 +ENCODING 53768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D209 +ENCODING 53769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +21 +FF +00 +3E +41 +3E +ENDCHAR +STARTCHAR D20A +ENCODING 53770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +F900 +8100 +7900 +3D00 +C100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D20B +ENCODING 53771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +7900 +D900 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D20C +ENCODING 53772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D20D +ENCODING 53773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D20E +ENCODING 53774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +FD +01 +3F +12 +3F +ENDCHAR +STARTCHAR D20F +ENCODING 53775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +D9 +21 +FD +0C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D210 +ENCODING 53776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2000 +3F00 +2000 +2000 +3F80 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR D211 +ENCODING 53777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +7E +01 +01 +ENDCHAR +STARTCHAR D212 +ENCODING 53778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +7E +11 +11 +10 +ENDCHAR +STARTCHAR D213 +ENCODING 53779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +F2 +16 +15 +18 +ENDCHAR +STARTCHAR D214 +ENCODING 53780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +3F00 +2000 +3F80 +1200 +FFC0 +2000 +2000 +3F00 +ENDCHAR +STARTCHAR D215 +ENCODING 53781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +07 +42 +45 +20 +ENDCHAR +STARTCHAR D216 +ENCODING 53782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D217 +ENCODING 53783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +24 +DB +7E +40 +7E +ENDCHAR +STARTCHAR D218 +ENCODING 53784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3F00 +0080 +3F00 +3F00 +ENDCHAR +STARTCHAR D219 +ENCODING 53785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D21A +ENCODING 53786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3300 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D21B +ENCODING 53787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3000 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D21C +ENCODING 53788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D21D +ENCODING 53789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR D21E +ENCODING 53790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D21F +ENCODING 53791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR D220 +ENCODING 53792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +24 +DB +7E +41 +7F +ENDCHAR +STARTCHAR D221 +ENCODING 53793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +24 +DB +41 +7E +7F +ENDCHAR +STARTCHAR D222 +ENCODING 53794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +12 +72 +95 +78 +ENDCHAR +STARTCHAR D223 +ENCODING 53795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +08 +18 +66 +81 +ENDCHAR +STARTCHAR D224 +ENCODING 53796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +20 +26 +5D +80 +ENDCHAR +STARTCHAR D225 +ENCODING 53797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +3E +41 +42 +3C +ENDCHAR +STARTCHAR D226 +ENCODING 53798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +7E +02 +7F +ENDCHAR +STARTCHAR D227 +ENCODING 53799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +0E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR D228 +ENCODING 53800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +24 +DB +7E +01 +7F +ENDCHAR +STARTCHAR D229 +ENCODING 53801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR D22A +ENCODING 53802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +24 +DB +7F +24 +7E +ENDCHAR +STARTCHAR D22B +ENCODING 53803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2D00 +1200 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR D22C +ENCODING 53804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR D22D +ENCODING 53805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D22E +ENCODING 53806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +08 +77 +11 +10 +ENDCHAR +STARTCHAR D22F +ENCODING 53807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +68 +12 +17 +18 +ENDCHAR +STARTCHAR D230 +ENCODING 53808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR D231 +ENCODING 53809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +0E +42 +45 +20 +ENDCHAR +STARTCHAR D232 +ENCODING 53810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +0300 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR D233 +ENCODING 53811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +F7 +08 +3E +40 +7E +ENDCHAR +STARTCHAR D234 +ENCODING 53812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D235 +ENCODING 53813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D236 +ENCODING 53814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D237 +ENCODING 53815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D238 +ENCODING 53816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D239 +ENCODING 53817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR D23A +ENCODING 53818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D23B +ENCODING 53819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +3B00 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR D23C +ENCODING 53820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D23D +ENCODING 53821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +2480 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D23E +ENCODING 53822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +9A +F2 +95 +F8 +ENDCHAR +STARTCHAR D23F +ENCODING 53823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR D240 +ENCODING 53824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +28 +26 +5D +80 +ENDCHAR +STARTCHAR D241 +ENCODING 53825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D242 +ENCODING 53826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +7C +02 +3F +40 +ENDCHAR +STARTCHAR D243 +ENCODING 53827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1E00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR D244 +ENCODING 53828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +F7 +08 +7E +01 +7E +ENDCHAR +STARTCHAR D245 +ENCODING 53829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0400 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR D246 +ENCODING 53830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +F7 +08 +08 +76 +7E +ENDCHAR +STARTCHAR D247 +ENCODING 53831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1E00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR D248 +ENCODING 53832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +7C80 +4080 +7C80 +0080 +FE80 +1080 +1380 +1080 +1080 +ENDCHAR +STARTCHAR D249 +ENCODING 53833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +7E +01 +01 +01 +ENDCHAR +STARTCHAR D24A +ENCODING 53834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D24B +ENCODING 53835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +62 +12 +15 +18 +ENDCHAR +STARTCHAR D24C +ENCODING 53836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +79 +81 +79 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR D24D +ENCODING 53837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D24E +ENCODING 53838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D24F +ENCODING 53839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +3E +40 +7E +ENDCHAR +STARTCHAR D250 +ENCODING 53840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR D251 +ENCODING 53841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D252 +ENCODING 53842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D253 +ENCODING 53843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D254 +ENCODING 53844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR D255 +ENCODING 53845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D256 +ENCODING 53846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D257 +ENCODING 53847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR D258 +ENCODING 53848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +3E +41 +7F +ENDCHAR +STARTCHAR D259 +ENCODING 53849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +41 +7F +41 +3E +ENDCHAR +STARTCHAR D25A +ENCODING 53850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR D25B +ENCODING 53851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +08 +14 +63 +ENDCHAR +STARTCHAR D25C +ENCODING 53852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F900 +8700 +F900 +0100 +FD00 +2100 +2200 +3700 +CC80 +ENDCHAR +STARTCHAR D25D +ENCODING 53853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +3E +41 +63 +1C +ENDCHAR +STARTCHAR D25E +ENCODING 53854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +F900 +8100 +7900 +FD00 +2700 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D25F +ENCODING 53855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7900 +8100 +7900 +F100 +0900 +F700 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D260 +ENCODING 53856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D261 +ENCODING 53857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F1 +09 +F7 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D262 +ENCODING 53858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +27 +2D +12 +3F +ENDCHAR +STARTCHAR D263 +ENCODING 53859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FF +0D +33 +0C +32 +1E +ENDCHAR +STARTCHAR D264 +ENCODING 53860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7A80 +4280 +7A80 +4280 +7A80 +0280 +FE80 +1280 +1680 +1280 +0280 +ENDCHAR +STARTCHAR D265 +ENCODING 53861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D266 +ENCODING 53862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1900 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D267 +ENCODING 53863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR D268 +ENCODING 53864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +7A80 +FE80 +1680 +1280 +2000 +3F80 +ENDCHAR +STARTCHAR D269 +ENCODING 53865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR D26A +ENCODING 53866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +22 +45 +42 +45 +32 +ENDCHAR +STARTCHAR D26B +ENCODING 53867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D26C +ENCODING 53868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +7F +3F +40 +3F +ENDCHAR +STARTCHAR D26D +ENCODING 53869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +7F +39 +41 +38 +ENDCHAR +STARTCHAR D26E +ENCODING 53870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +77 +3D +45 +37 +ENDCHAR +STARTCHAR D26F +ENCODING 53871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +75 +37 +45 +37 +ENDCHAR +STARTCHAR D270 +ENCODING 53872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +E500 +F500 +F500 +1500 +ED00 +2000 +5200 +7200 +4500 +7080 +ENDCHAR +STARTCHAR D271 +ENCODING 53873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +77 +37 +44 +37 +ENDCHAR +STARTCHAR D272 +ENCODING 53874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D273 +ENCODING 53875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +72 +37 +45 +72 +ENDCHAR +STARTCHAR D274 +ENCODING 53876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F00 +2080 +3F80 +ENDCHAR +STARTCHAR D275 +ENCODING 53877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR D276 +ENCODING 53878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +2100 +3900 +2A80 +3800 +ENDCHAR +STARTCHAR D277 +ENCODING 53879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +0400 +0600 +1900 +2080 +ENDCHAR +STARTCHAR D278 +ENCODING 53880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR D279 +ENCODING 53881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR D27A +ENCODING 53882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR D27B +ENCODING 53883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +E500 +F500 +F500 +1500 +ED00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D27C +ENCODING 53884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR D27D +ENCODING 53885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +ED +20 +3F +3F +40 +3F +ENDCHAR +STARTCHAR D27E +ENCODING 53886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +7A80 +4280 +3A80 +FA80 +1680 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D27F +ENCODING 53887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +E5 +F5 +F5 +15 +E5 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D280 +ENCODING 53888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +7C80 +4080 +7C80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR D281 +ENCODING 53889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FD +20 +7F +01 +01 +ENDCHAR +STARTCHAR D282 +ENCODING 53890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D283 +ENCODING 53891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +62 +12 +15 +18 +ENDCHAR +STARTCHAR D284 +ENCODING 53892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FD +11 +51 +40 +7F +ENDCHAR +STARTCHAR D285 +ENCODING 53893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D286 +ENCODING 53894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D287 +ENCODING 53895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +3E +40 +7E +ENDCHAR +STARTCHAR D288 +ENCODING 53896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR D289 +ENCODING 53897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D28A +ENCODING 53898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D28B +ENCODING 53899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D28C +ENCODING 53900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR D28D +ENCODING 53901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D28E +ENCODING 53902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D28F +ENCODING 53903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR D290 +ENCODING 53904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FD +20 +7F +41 +7F +ENDCHAR +STARTCHAR D291 +ENCODING 53905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +FD +21 +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR D292 +ENCODING 53906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR D293 +ENCODING 53907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +08 +14 +63 +ENDCHAR +STARTCHAR D294 +ENCODING 53908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D295 +ENCODING 53909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FD +21 +3E +41 +3E +ENDCHAR +STARTCHAR D296 +ENCODING 53910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +F900 +8100 +7900 +FD00 +2100 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D297 +ENCODING 53911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7900 +8100 +7900 +F900 +0100 +FD00 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D298 +ENCODING 53912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D299 +ENCODING 53913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D29A +ENCODING 53914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +F9 +81 +79 +FD +21 +2D +12 +3F +ENDCHAR +STARTCHAR D29B +ENCODING 53915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +F9 +01 +FD +0D +33 +0C +32 +1E +ENDCHAR +STARTCHAR D29C +ENCODING 53916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR D29D +ENCODING 53917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +7E +01 +01 +ENDCHAR +STARTCHAR D29E +ENCODING 53918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +00 +77 +11 +10 +ENDCHAR +STARTCHAR D29F +ENCODING 53919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +60 +12 +17 +18 +ENDCHAR +STARTCHAR D2A0 +ENCODING 53920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR D2A1 +ENCODING 53921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +06 +42 +45 +20 +ENDCHAR +STARTCHAR D2A2 +ENCODING 53922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +0100 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR D2A3 +ENCODING 53923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +DB +24 +3E +40 +7E +ENDCHAR +STARTCHAR D2A4 +ENCODING 53924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D2A5 +ENCODING 53925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D2A6 +ENCODING 53926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D2A7 +ENCODING 53927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D2A8 +ENCODING 53928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D2A9 +ENCODING 53929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR D2AA +ENCODING 53930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D2AB +ENCODING 53931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +3900 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR D2AC +ENCODING 53932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D2AD +ENCODING 53933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +DB +24 +40 +7E +7F +ENDCHAR +STARTCHAR D2AE +ENCODING 53934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR D2AF +ENCODING 53935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +08 +18 +66 +81 +ENDCHAR +STARTCHAR D2B0 +ENCODING 53936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +20 +26 +5D +80 +ENDCHAR +STARTCHAR D2B1 +ENCODING 53937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +3F00 +ENDCHAR +STARTCHAR D2B2 +ENCODING 53938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +7C +02 +3F +40 +ENDCHAR +STARTCHAR D2B3 +ENCODING 53939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1F00 +3E00 +0100 +1F00 +6080 +ENDCHAR +STARTCHAR D2B4 +ENCODING 53940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +DB +24 +7E +01 +7E +ENDCHAR +STARTCHAR D2B5 +ENCODING 53941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1200 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR D2B6 +ENCODING 53942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +DB +24 +00 +7E +7E +ENDCHAR +STARTCHAR D2B7 +ENCODING 53943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1F00 +3300 +0C00 +1300 +1E00 +ENDCHAR +STARTCHAR D2B8 +ENCODING 53944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +2000 +3F00 +2000 +2000 +3F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR D2B9 +ENCODING 53945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D2BA +ENCODING 53946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR D2BB +ENCODING 53947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +F2 +16 +15 +18 +ENDCHAR +STARTCHAR D2BC +ENCODING 53948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D2BD +ENCODING 53949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +07 +42 +45 +20 +ENDCHAR +STARTCHAR D2BE +ENCODING 53950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D2BF +ENCODING 53951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D2C0 +ENCODING 53952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D2C1 +ENCODING 53953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +0000 +3B80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D2C2 +ENCODING 53954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR D2C3 +ENCODING 53955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +3000 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D2C4 +ENCODING 53956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D2C5 +ENCODING 53957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +3300 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR D2C6 +ENCODING 53958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +3100 +0A80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D2C7 +ENCODING 53959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR D2C8 +ENCODING 53960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D2C9 +ENCODING 53961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D2CA +ENCODING 53962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +12 +72 +95 +78 +ENDCHAR +STARTCHAR D2CB +ENCODING 53963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +2000 +3F00 +2000 +3F80 +0000 +FFC0 +0000 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR D2CC +ENCODING 53964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +20 +26 +5D +80 +ENDCHAR +STARTCHAR D2CD +ENCODING 53965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR D2CE +ENCODING 53966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +7E +02 +7F +ENDCHAR +STARTCHAR D2CF +ENCODING 53967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +7E +7E +00 +FF +1C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR D2D0 +ENCODING 53968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +7E +40 +7F +FF +00 +7E +01 +7F +ENDCHAR +STARTCHAR D2D1 +ENCODING 53969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +2000 +3F00 +3F00 +0000 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR D2D2 +ENCODING 53970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +40 +7F +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR D2D3 +ENCODING 53971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +40 +7E +7E +00 +FF +3C +66 +18 +26 +3C +ENDCHAR +STARTCHAR D2D4 +ENCODING 53972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +4080 +7C80 +4080 +4080 +7E80 +0080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D2D5 +ENCODING 53973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +3E +01 +01 +01 +ENDCHAR +STARTCHAR D2D6 +ENCODING 53974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D2D7 +ENCODING 53975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D2D8 +ENCODING 53976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR D2D9 +ENCODING 53977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D2DA +ENCODING 53978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +07 +4F +42 +45 +37 +ENDCHAR +STARTCHAR D2DB +ENCODING 53979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +3F +40 +7E +ENDCHAR +STARTCHAR D2DC +ENCODING 53980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +00 +FF +01 +7F +40 +7F +ENDCHAR +STARTCHAR D2DD +ENCODING 53981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D2DE +ENCODING 53982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +77 +79 +49 +76 +ENDCHAR +STARTCHAR D2DF +ENCODING 53983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D2E0 +ENCODING 53984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +72 +32 +45 +70 +ENDCHAR +STARTCHAR D2E1 +ENCODING 53985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D2E2 +ENCODING 53986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D2E3 +ENCODING 53987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR D2E4 +ENCODING 53988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FF +00 +7F +41 +7F +ENDCHAR +STARTCHAR D2E5 +ENCODING 53989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +79 +81 +79 +81 +79 +01 +FE +41 +7F +41 +7F +ENDCHAR +STARTCHAR D2E6 +ENCODING 53990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +12 +72 +55 +70 +ENDCHAR +STARTCHAR D2E7 +ENCODING 53991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +7F +81 +08 +14 +63 +ENDCHAR +STARTCHAR D2E8 +ENCODING 53992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D2E9 +ENCODING 53993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +7F +81 +3E +41 +63 +1C +ENDCHAR +STARTCHAR D2EA +ENCODING 53994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +3C80 +7C80 +4080 +3C80 +FF80 +0080 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR D2EB +ENCODING 53995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +7900 +F900 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D2EC +ENCODING 53996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D2ED +ENCODING 53997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D2EE +ENCODING 53998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +F9 +81 +79 +3F +C1 +3F +12 +3F +ENDCHAR +STARTCHAR D2EF +ENCODING 53999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +79 +F9 +01 +FD +0C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D2F0 +ENCODING 54000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +81 +81 +81 +FD +01 +01 +01 +ENDCHAR +STARTCHAR D2F1 +ENCODING 54001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +81 +81 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D2F2 +ENCODING 54002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +81 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D2F3 +ENCODING 54003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F100 +8100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D2F4 +ENCODING 54004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +81 +F9 +81 +81 +FD +01 +20 +20 +3F +ENDCHAR +STARTCHAR D2F5 +ENCODING 54005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +81 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D2F6 +ENCODING 54006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D2F7 +ENCODING 54007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +81 +F1 +81 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D2F8 +ENCODING 54008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +81 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D2F9 +ENCODING 54009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D2FA +ENCODING 54010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D2FB +ENCODING 54011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D2FC +ENCODING 54012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D2FD +ENCODING 54013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D2FE +ENCODING 54014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D2FF +ENCODING 54015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D300 +ENCODING 54016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +81 +81 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D301 +ENCODING 54017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +81 +81 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D302 +ENCODING 54018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F100 +8100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D303 +ENCODING 54019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +8100 +F900 +8100 +8100 +FD00 +0100 +0800 +0800 +3600 +4180 +ENDCHAR +STARTCHAR D304 +ENCODING 54020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F100 +8100 +F900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D305 +ENCODING 54021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +81 +F9 +81 +81 +FD +01 +3E +21 +21 +3E +ENDCHAR +STARTCHAR D306 +ENCODING 54022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F100 +8100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D307 +ENCODING 54023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F100 +8100 +F100 +8900 +7100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D308 +ENCODING 54024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +81 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D309 +ENCODING 54025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D30A +ENCODING 54026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F1 +81 +F1 +81 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D30B +ENCODING 54027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F1 +81 +F1 +89 +71 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D30C +ENCODING 54028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2480 +2480 +2480 +24C0 +2480 +2480 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D30D +ENCODING 54029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D30E +ENCODING 54030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0000 +3F00 +0880 +0880 +0880 +ENDCHAR +STARTCHAR D30F +ENCODING 54031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR D310 +ENCODING 54032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0080 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D311 +ENCODING 54033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0300 +2080 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D312 +ENCODING 54034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR D313 +ENCODING 54035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR D314 +ENCODING 54036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D315 +ENCODING 54037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D316 +ENCODING 54038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +3F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR D317 +ENCODING 54039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR D318 +ENCODING 54040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR D319 +ENCODING 54041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR D31A +ENCODING 54042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D31B +ENCODING 54043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR D31C +ENCODING 54044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D31D +ENCODING 54045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +28C0 +2880 +2880 +FE80 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D31E +ENCODING 54046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +2900 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR D31F +ENCODING 54047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0080 +0400 +0C00 +1B00 +2080 +ENDCHAR +STARTCHAR D320 +ENCODING 54048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0000 +1100 +1100 +2A80 +44C0 +ENDCHAR +STARTCHAR D321 +ENCODING 54049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +2880 +28C0 +2880 +FE80 +0080 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR D322 +ENCODING 54050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +1F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR D323 +ENCODING 54051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR D324 +ENCODING 54052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +1F80 +3F00 +0080 +ENDCHAR +STARTCHAR D325 +ENCODING 54053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +3F80 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D326 +ENCODING 54054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +2880 +28C0 +2880 +FE80 +0000 +1F00 +1100 +3F80 +ENDCHAR +STARTCHAR D327 +ENCODING 54055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5100 +5180 +5D00 +A000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR D328 +ENCODING 54056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4A80 +4B80 +4A80 +4A80 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR D329 +ENCODING 54057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4B80 +4A80 +4A80 +FE80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D32A +ENCODING 54058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D32B +ENCODING 54059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR D32C +ENCODING 54060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4B80 +4A80 +FE80 +0280 +1280 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR D32D +ENCODING 54061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0380 +2080 +2080 +2340 +1800 +ENDCHAR +STARTCHAR D32E +ENCODING 54062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D32F +ENCODING 54063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D330 +ENCODING 54064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4B80 +4A80 +FE80 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D331 +ENCODING 54065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR D332 +ENCODING 54066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR D333 +ENCODING 54067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D334 +ENCODING 54068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D335 +ENCODING 54069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D336 +ENCODING 54070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D337 +ENCODING 54071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR D338 +ENCODING 54072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4B80 +4A80 +FE80 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR D339 +ENCODING 54073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4B80 +4A80 +FE80 +0000 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR D33A +ENCODING 54074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +2500 +3900 +2680 +3840 +ENDCHAR +STARTCHAR D33B +ENCODING 54075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4B80 +4A80 +FE80 +0080 +0400 +0600 +1900 +20C0 +ENDCHAR +STARTCHAR D33C +ENCODING 54076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4B80 +4A80 +FE80 +0000 +0900 +1900 +1A80 +2640 +ENDCHAR +STARTCHAR D33D +ENCODING 54077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4B80 +4A80 +FE80 +0000 +1F00 +1080 +1080 +1F00 +ENDCHAR +STARTCHAR D33E +ENCODING 54078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +1F80 +0100 +0FC0 +1000 +ENDCHAR +STARTCHAR D33F +ENCODING 54079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9700 +9D00 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D340 +ENCODING 54080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR D341 +ENCODING 54081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D342 +ENCODING 54082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FA80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D343 +ENCODING 54083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +97 +9D +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D344 +ENCODING 54084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2480 +24C0 +2480 +2480 +24C0 +2480 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D345 +ENCODING 54085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2880 +28C0 +2880 +28C0 +FE80 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D346 +ENCODING 54086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +3F00 +0880 +0880 +ENDCHAR +STARTCHAR D347 +ENCODING 54087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +3900 +0900 +0A80 +0800 +ENDCHAR +STARTCHAR D348 +ENCODING 54088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +5180 +5100 +5100 +FD80 +0100 +4000 +4000 +7E00 +ENDCHAR +STARTCHAR D349 +ENCODING 54089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0300 +2080 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D34A +ENCODING 54090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +0600 +4F00 +4600 +4900 +3600 +ENDCHAR +STARTCHAR D34B +ENCODING 54091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR D34C +ENCODING 54092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7E00 +0100 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D34D +ENCODING 54093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7E00 +1100 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D34E +ENCODING 54094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7600 +1900 +7900 +8900 +7600 +ENDCHAR +STARTCHAR D34F +ENCODING 54095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +6800 +1900 +7F00 +8900 +7E00 +ENDCHAR +STARTCHAR D350 +ENCODING 54096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7200 +1200 +7200 +8500 +6800 +ENDCHAR +STARTCHAR D351 +ENCODING 54097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR D352 +ENCODING 54098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +6200 +1500 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D353 +ENCODING 54099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7600 +1F00 +7600 +8900 +7600 +ENDCHAR +STARTCHAR D354 +ENCODING 54100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR D355 +ENCODING 54101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR D356 +ENCODING 54102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +2900 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR D357 +ENCODING 54103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR D358 +ENCODING 54104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +1100 +1100 +2A80 +4400 +ENDCHAR +STARTCHAR D359 +ENCODING 54105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0C00 +1300 +2080 +1100 +0E00 +ENDCHAR +STARTCHAR D35A +ENCODING 54106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +1F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR D35B +ENCODING 54107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR D35C +ENCODING 54108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +1F80 +3F00 +0080 +ENDCHAR +STARTCHAR D35D +ENCODING 54109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +7F00 +4000 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D35E +ENCODING 54110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +7C80 +28C0 +2880 +28C0 +FE80 +0000 +1F00 +1100 +3F80 +ENDCHAR +STARTCHAR D35F +ENCODING 54111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +5180 +5100 +5D80 +A000 +1C00 +7F00 +1C00 +2200 +1C00 +ENDCHAR +STARTCHAR D360 +ENCODING 54112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -2 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +4A80 +4B80 +F280 +0280 +0280 +ENDCHAR +STARTCHAR D361 +ENCODING 54113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D362 +ENCODING 54114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D363 +ENCODING 54115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR D364 +ENCODING 54116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4A80 +4B80 +4A80 +FF80 +0280 +0280 +1000 +1F80 +ENDCHAR +STARTCHAR D365 +ENCODING 54117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0380 +2080 +2080 +2340 +1800 +ENDCHAR +STARTCHAR D366 +ENCODING 54118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D367 +ENCODING 54119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D368 +ENCODING 54120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D369 +ENCODING 54121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR D36A +ENCODING 54122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR D36B +ENCODING 54123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D36C +ENCODING 54124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D36D +ENCODING 54125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D36E +ENCODING 54126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D36F +ENCODING 54127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR D370 +ENCODING 54128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR D371 +ENCODING 54129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1080 +1F80 +1F80 +ENDCHAR +STARTCHAR D372 +ENCODING 54130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +2500 +3900 +2680 +3840 +ENDCHAR +STARTCHAR D373 +ENCODING 54131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR D374 +ENCODING 54132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +0900 +1900 +2E80 +0040 +ENDCHAR +STARTCHAR D375 +ENCODING 54133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0600 +1980 +2080 +1080 +0F00 +ENDCHAR +STARTCHAR D376 +ENCODING 54134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1F80 +0100 +0FC0 +1000 +ENDCHAR +STARTCHAR D377 +ENCODING 54135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9700 +9500 +9F00 +6500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D378 +ENCODING 54136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR D379 +ENCODING 54137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D37A +ENCODING 54138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4B80 +4A80 +4B80 +FA80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D37B +ENCODING 54139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +97 +95 +9F +65 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D37C +ENCODING 54140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +49 +4F +49 +49 +49 +FD +01 +01 +01 +ENDCHAR +STARTCHAR D37D +ENCODING 54141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D37E +ENCODING 54142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +51 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D37F +ENCODING 54143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5700 +5100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D380 +ENCODING 54144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR D381 +ENCODING 54145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +51 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D382 +ENCODING 54146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D383 +ENCODING 54147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +51 +57 +51 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D384 +ENCODING 54148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D385 +ENCODING 54149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D386 +ENCODING 54150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D387 +ENCODING 54151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D388 +ENCODING 54152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D389 +ENCODING 54153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D38A +ENCODING 54154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D38B +ENCODING 54155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D38C +ENCODING 54156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D38D +ENCODING 54157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D38E +ENCODING 54158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5700 +5100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D38F +ENCODING 54159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +FD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR D390 +ENCODING 54160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +5100 +5700 +5100 +5100 +FD00 +0000 +2200 +2200 +3500 +4C80 +ENDCHAR +STARTCHAR D391 +ENCODING 54161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +FD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR D392 +ENCODING 54162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5700 +5100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D393 +ENCODING 54163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5700 +5D00 +A100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D394 +ENCODING 54164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +51 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D395 +ENCODING 54165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D396 +ENCODING 54166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +51 +57 +51 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D397 +ENCODING 54167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +57 +5D +A1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D398 +ENCODING 54168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4A80 +4E80 +4A80 +4A80 +4A80 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR D399 +ENCODING 54169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +FE80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D39A +ENCODING 54170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D39B +ENCODING 54171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR D39C +ENCODING 54172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +FE80 +0280 +1280 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR D39D +ENCODING 54173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0380 +2080 +2080 +2340 +1800 +ENDCHAR +STARTCHAR D39E +ENCODING 54174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D39F +ENCODING 54175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D3A0 +ENCODING 54176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +FE80 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D3A1 +ENCODING 54177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR D3A2 +ENCODING 54178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR D3A3 +ENCODING 54179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D3A4 +ENCODING 54180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D3A5 +ENCODING 54181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D3A6 +ENCODING 54182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D3A7 +ENCODING 54183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR D3A8 +ENCODING 54184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +FE80 +0000 +1F80 +2080 +2080 +1F80 +ENDCHAR +STARTCHAR D3A9 +ENCODING 54185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +FE80 +0000 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR D3AA +ENCODING 54186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +2500 +3900 +2680 +3840 +ENDCHAR +STARTCHAR D3AB +ENCODING 54187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +FE80 +0080 +0400 +0600 +1900 +20C0 +ENDCHAR +STARTCHAR D3AC +ENCODING 54188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +0900 +1900 +2E80 +0040 +ENDCHAR +STARTCHAR D3AD +ENCODING 54189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +FE80 +0000 +1F00 +1080 +1080 +1F00 +ENDCHAR +STARTCHAR D3AE +ENCODING 54190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +1F80 +0100 +0FC0 +1000 +ENDCHAR +STARTCHAR D3AF +ENCODING 54191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9500 +9500 +9D00 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D3B0 +ENCODING 54192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR D3B1 +ENCODING 54193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D3B2 +ENCODING 54194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4A80 +4E80 +4A80 +FA80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D3B3 +ENCODING 54195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +95 +95 +9D +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D3B4 +ENCODING 54196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +57 +51 +51 +57 +51 +FD +01 +01 +01 +ENDCHAR +STARTCHAR D3B5 +ENCODING 54197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +57 +53 +51 +F9 +00 +3F +01 +01 +01 +ENDCHAR +STARTCHAR D3B6 +ENCODING 54198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +57 +53 +51 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D3B7 +ENCODING 54199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5700 +5300 +5100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D3B8 +ENCODING 54200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +57 +51 +57 +51 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR D3B9 +ENCODING 54201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +57 +53 +51 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D3BA +ENCODING 54202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D3BB +ENCODING 54203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +57 +53 +51 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D3BC +ENCODING 54204 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +57 +51 +57 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D3BD +ENCODING 54205 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D3BE +ENCODING 54206 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D3BF +ENCODING 54207 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D3C0 +ENCODING 54208 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D3C1 +ENCODING 54209 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D3C2 +ENCODING 54210 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D3C3 +ENCODING 54211 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D3C4 +ENCODING 54212 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +57 +51 +57 +51 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D3C5 +ENCODING 54213 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +57 +51 +57 +51 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D3C6 +ENCODING 54214 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5700 +5300 +5100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D3C7 +ENCODING 54215 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +57 +53 +51 +F9 +00 +08 +14 +63 +ENDCHAR +STARTCHAR D3C8 +ENCODING 54216 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +F900 +5700 +5100 +5700 +5100 +FD00 +0000 +1200 +3200 +3500 +4C80 +ENDCHAR +STARTCHAR D3C9 +ENCODING 54217 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +57 +51 +57 +51 +FD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR D3CA +ENCODING 54218 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5700 +5300 +5100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D3CB +ENCODING 54219 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5300 +5700 +5D00 +A100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D3CC +ENCODING 54220 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +57 +53 +51 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D3CD +ENCODING 54221 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D3CE +ENCODING 54222 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +57 +53 +51 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D3CF +ENCODING 54223 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +53 +57 +5D +A1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D3D0 +ENCODING 54224 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4A80 +4E80 +4A80 +4A80 +4E80 +4A80 +FE80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR D3D1 +ENCODING 54225 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D3D2 +ENCODING 54226 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D3D3 +ENCODING 54227 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR D3D4 +ENCODING 54228 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FE80 +0280 +0080 +1000 +1F80 +ENDCHAR +STARTCHAR D3D5 +ENCODING 54229 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0380 +2080 +2080 +2340 +1800 +ENDCHAR +STARTCHAR D3D6 +ENCODING 54230 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D3D7 +ENCODING 54231 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D3D8 +ENCODING 54232 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4E80 +4A80 +4E80 +FE80 +0000 +1F80 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D3D9 +ENCODING 54233 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +09 +79 +41 +38 +ENDCHAR +STARTCHAR D3DA +ENCODING 54234 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +0D +75 +45 +37 +ENDCHAR +STARTCHAR D3DB +ENCODING 54235 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +74 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D3DC +ENCODING 54236 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D3DD +ENCODING 54237 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D3DE +ENCODING 54238 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D3DF +ENCODING 54239 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +77 +1F +77 +45 +76 +ENDCHAR +STARTCHAR D3E0 +ENCODING 54240 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR D3E1 +ENCODING 54241 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +FA80 +4E80 +4A80 +4E80 +4A80 +FE80 +0000 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR D3E2 +ENCODING 54242 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +2500 +3900 +2680 +3840 +ENDCHAR +STARTCHAR D3E3 +ENCODING 54243 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +FA80 +4E80 +4A80 +4E80 +4A80 +FE80 +0280 +0480 +0600 +0900 +30C0 +ENDCHAR +STARTCHAR D3E4 +ENCODING 54244 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +0900 +1900 +2E80 +0040 +ENDCHAR +STARTCHAR D3E5 +ENCODING 54245 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4E80 +FA80 +0680 +1980 +2080 +1080 +0F00 +ENDCHAR +STARTCHAR D3E6 +ENCODING 54246 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +1F80 +0100 +0FC0 +1000 +ENDCHAR +STARTCHAR D3E7 +ENCODING 54247 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +9D00 +9500 +9D00 +6100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D3E8 +ENCODING 54248 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +1F80 +1F80 +0080 +0080 +ENDCHAR +STARTCHAR D3E9 +ENCODING 54249 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D3EA +ENCODING 54250 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +FA80 +4E80 +4A80 +4A80 +FA80 +0000 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D3EB +ENCODING 54251 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +9D +95 +9D +61 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D3EC +ENCODING 54252 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +1200 +1200 +1200 +1200 +7F80 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR D3ED +ENCODING 54253 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D3EE +ENCODING 54254 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +76 +08 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR D3EF +ENCODING 54255 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7E00 +2400 +7600 +0800 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR D3F0 +ENCODING 54256 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D3F1 +ENCODING 54257 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +76 +08 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR D3F2 +ENCODING 54258 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D3F3 +ENCODING 54259 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +24 +76 +08 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR D3F4 +ENCODING 54260 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +3F80 +0400 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D3F5 +ENCODING 54261 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D3F6 +ENCODING 54262 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D3F7 +ENCODING 54263 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D3F8 +ENCODING 54264 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D3F9 +ENCODING 54265 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR D3FA +ENCODING 54266 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR D3FB +ENCODING 54267 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR D3FC +ENCODING 54268 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D3FD +ENCODING 54269 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D3FE +ENCODING 54270 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +76 +08 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR D3FF +ENCODING 54271 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0000 +0400 +0C00 +1300 +6080 +ENDCHAR +STARTCHAR D400 +ENCODING 54272 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +76 +08 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR D401 +ENCODING 54273 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR D402 +ENCODING 54274 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +24 +76 +08 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR D403 +ENCODING 54275 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR D404 +ENCODING 54276 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +24 +76 +08 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR D405 +ENCODING 54277 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR D406 +ENCODING 54278 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +24 +76 +08 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR D407 +ENCODING 54279 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0400 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR D408 +ENCODING 54280 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7E80 +2480 +2480 +2480 +7EC0 +1080 +1080 +FE80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D409 +ENCODING 54281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR D40A +ENCODING 54282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR D40B +ENCODING 54283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7200 +1200 +1500 +1000 +ENDCHAR +STARTCHAR D40C +ENCODING 54284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +4900 +FD80 +2100 +DD00 +0000 +4000 +7E00 +ENDCHAR +STARTCHAR D40D +ENCODING 54285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +4700 +4200 +4500 +3000 +ENDCHAR +STARTCHAR D40E +ENCODING 54286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D40F +ENCODING 54287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR D410 +ENCODING 54288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +1F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D411 +ENCODING 54289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +3300 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D412 +ENCODING 54290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +0000 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D413 +ENCODING 54291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +3000 +0C80 +3F00 +4480 +3F00 +ENDCHAR +STARTCHAR D414 +ENCODING 54292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +3100 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D415 +ENCODING 54293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +3300 +0C00 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR D416 +ENCODING 54294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +3000 +0B80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D417 +ENCODING 54295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +3300 +0F80 +3B00 +4480 +3B00 +ENDCHAR +STARTCHAR D418 +ENCODING 54296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR D419 +ENCODING 54297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR D41A +ENCODING 54298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +1200 +7200 +5500 +7800 +ENDCHAR +STARTCHAR D41B +ENCODING 54299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR D41C +ENCODING 54300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +2200 +2200 +5500 +8800 +ENDCHAR +STARTCHAR D41D +ENCODING 54301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +7C80 +2480 +2480 +7EC0 +1080 +FE80 +0000 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR D41E +ENCODING 54302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR D41F +ENCODING 54303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +0E00 +1E00 +0100 +0F00 +3080 +ENDCHAR +STARTCHAR D420 +ENCODING 54304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7E00 +3F00 +0100 +ENDCHAR +STARTCHAR D421 +ENCODING 54305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +1F00 +2000 +3F00 +2000 +1F80 +ENDCHAR +STARTCHAR D422 +ENCODING 54306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +F900 +4900 +4980 +B100 +FD00 +0000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR D423 +ENCODING 54307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +7C80 +2480 +7EC0 +1080 +FE00 +0E00 +3F80 +0E00 +1100 +0E00 +ENDCHAR +STARTCHAR D424 +ENCODING 54308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +0280 +7A80 +4A80 +4B80 +FE80 +1280 +0E80 +7280 +0280 +0080 +ENDCHAR +STARTCHAR D425 +ENCODING 54309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D426 +ENCODING 54310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D427 +ENCODING 54311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5700 +FD00 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D428 +ENCODING 54312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +55 +FF +25 +F5 +05 +20 +3F +ENDCHAR +STARTCHAR D429 +ENCODING 54313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5700 +FD00 +FD00 +0000 +4700 +4100 +4780 +3000 +ENDCHAR +STARTCHAR D42A +ENCODING 54314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +0380 +2780 +2380 +2280 +1B00 +ENDCHAR +STARTCHAR D42B +ENCODING 54315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +3F +40 +7F +ENDCHAR +STARTCHAR D42C +ENCODING 54316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +1F00 +0080 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D42D +ENCODING 54317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +1B00 +0480 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR D42E +ENCODING 54318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +0000 +1F80 +3A80 +2280 +1B80 +ENDCHAR +STARTCHAR D42F +ENCODING 54319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +1800 +0680 +3B80 +2280 +1B80 +ENDCHAR +STARTCHAR D430 +ENCODING 54320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +3100 +0900 +3900 +2280 +3C00 +ENDCHAR +STARTCHAR D431 +ENCODING 54321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +1980 +0600 +3B80 +2200 +1B80 +ENDCHAR +STARTCHAR D432 +ENCODING 54322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +0000 +3B80 +3A80 +2280 +3B80 +ENDCHAR +STARTCHAR D433 +ENCODING 54323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +3380 +0FC0 +3B80 +2280 +3980 +ENDCHAR +STARTCHAR D434 +ENCODING 54324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +3F +41 +7F +ENDCHAR +STARTCHAR D435 +ENCODING 54325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +21 +3F +3F +ENDCHAR +STARTCHAR D436 +ENCODING 54326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5700 +FD00 +FD00 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D437 +ENCODING 54327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +08 +14 +63 +ENDCHAR +STARTCHAR D438 +ENCODING 54328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5700 +FD00 +FD00 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D439 +ENCODING 54329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +57 +FD +FD +08 +37 +41 +23 +1C +ENDCHAR +STARTCHAR D43A +ENCODING 54330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +5700 +FD00 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D43B +ENCODING 54331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +0E00 +1E00 +0180 +0F00 +30C0 +ENDCHAR +STARTCHAR D43C +ENCODING 54332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D43D +ENCODING 54333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +1F80 +2000 +1F80 +2000 +1F80 +ENDCHAR +STARTCHAR D43E +ENCODING 54334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F5 +55 +57 +FD +FD +00 +3F +12 +3F +ENDCHAR +STARTCHAR D43F +ENCODING 54335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +6B80 +1280 +FE80 +0E00 +1180 +0E00 +1100 +0F00 +ENDCHAR +STARTCHAR D440 +ENCODING 54336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +2480 +2480 +2480 +7E80 +1080 +1080 +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D441 +ENCODING 54337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D442 +ENCODING 54338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D443 +ENCODING 54339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +4900 +B100 +FD00 +0100 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D444 +ENCODING 54340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +49 +49 +FD +21 +21 +FF +01 +41 +40 +7F +ENDCHAR +STARTCHAR D445 +ENCODING 54341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +47 +42 +45 +30 +ENDCHAR +STARTCHAR D446 +ENCODING 54342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR D447 +ENCODING 54343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +3F +40 +7E +ENDCHAR +STARTCHAR D448 +ENCODING 54344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR D449 +ENCODING 54345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D44A +ENCODING 54346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR D44B +ENCODING 54347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D44C +ENCODING 54348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR D44D +ENCODING 54349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D44E +ENCODING 54350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR D44F +ENCODING 54351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR D450 +ENCODING 54352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +7F +41 +7F +ENDCHAR +STARTCHAR D451 +ENCODING 54353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +41 +7F +7F +ENDCHAR +STARTCHAR D452 +ENCODING 54354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +52 +72 +55 +78 +ENDCHAR +STARTCHAR D453 +ENCODING 54355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR D454 +ENCODING 54356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D455 +ENCODING 54357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR D456 +ENCODING 54358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +4900 +B100 +FD00 +0100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D457 +ENCODING 54359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +FD00 +2100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D458 +ENCODING 54360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +7F +3F +01 +01 +ENDCHAR +STARTCHAR D459 +ENCODING 54361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR D45A +ENCODING 54362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +7F +12 +3F +ENDCHAR +STARTCHAR D45B +ENCODING 54363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +21 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D45C +ENCODING 54364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +1200 +1200 +1200 +7F80 +1200 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR D45D +ENCODING 54365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +7E +01 +01 +ENDCHAR +STARTCHAR D45E +ENCODING 54366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +7E +11 +11 +10 +ENDCHAR +STARTCHAR D45F +ENCODING 54367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7E00 +2400 +7E00 +2400 +FF00 +0000 +F200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR D460 +ENCODING 54368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D461 +ENCODING 54369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR D462 +ENCODING 54370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +0300 +2780 +2300 +2480 +1B00 +ENDCHAR +STARTCHAR D463 +ENCODING 54371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +24 +7E +24 +FF +00 +7E +40 +7E +ENDCHAR +STARTCHAR D464 +ENCODING 54372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +3F80 +1200 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D465 +ENCODING 54373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +3F00 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D466 +ENCODING 54374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +3B80 +0C80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D467 +ENCODING 54375 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +3C80 +0C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D468 +ENCODING 54376 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +7900 +0900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D469 +ENCODING 54377 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +3B80 +0C00 +3F80 +2400 +3B80 +ENDCHAR +STARTCHAR D46A +ENCODING 54378 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +7F80 +0A80 +7A80 +4280 +3F80 +ENDCHAR +STARTCHAR D46B +ENCODING 54379 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +7B00 +0F80 +7B00 +4480 +3B00 +ENDCHAR +STARTCHAR D46C +ENCODING 54380 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +24 +7E +24 +FF +00 +7E +41 +7F +ENDCHAR +STARTCHAR D46D +ENCODING 54381 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D46E +ENCODING 54382 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +92 +F2 +95 +F8 +ENDCHAR +STARTCHAR D46F +ENCODING 54383 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +0000 +0400 +0C00 +1300 +6080 +ENDCHAR +STARTCHAR D470 +ENCODING 54384 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +24 +26 +59 +80 +ENDCHAR +STARTCHAR D471 +ENCODING 54385 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +3E +41 +42 +3C +ENDCHAR +STARTCHAR D472 +ENCODING 54386 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +7E +04 +7F +ENDCHAR +STARTCHAR D473 +ENCODING 54387 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +0E00 +3F00 +0300 +1F00 +6080 +ENDCHAR +STARTCHAR D474 +ENCODING 54388 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +24 +7E +24 +FF +00 +7E +7F +01 +ENDCHAR +STARTCHAR D475 +ENCODING 54389 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +1F00 +2000 +3F00 +3F00 +ENDCHAR +STARTCHAR D476 +ENCODING 54390 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +24 +7E +24 +FF +00 +7F +24 +7E +ENDCHAR +STARTCHAR D477 +ENCODING 54391 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +1200 +FFC0 +0E00 +3F80 +0E00 +1100 +1E00 +ENDCHAR +STARTCHAR D478 +ENCODING 54392 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +1200 +1200 +1200 +7F80 +0000 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR D479 +ENCODING 54393 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D47A +ENCODING 54394 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR D47B +ENCODING 54395 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR D47C +ENCODING 54396 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +2400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR D47D +ENCODING 54397 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D47E +ENCODING 54398 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR D47F +ENCODING 54399 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +3F00 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D480 +ENCODING 54400 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D481 +ENCODING 54401 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR D482 +ENCODING 54402 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +3F80 +0C80 +3C80 +4480 +3F80 +ENDCHAR +STARTCHAR D483 +ENCODING 54403 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR D484 +ENCODING 54404 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR D485 +ENCODING 54405 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +7F +7E +88 +77 +ENDCHAR +STARTCHAR D486 +ENCODING 54406 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR D487 +ENCODING 54407 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR D488 +ENCODING 54408 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D489 +ENCODING 54409 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D48A +ENCODING 54410 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D48B +ENCODING 54411 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +0400 +0C00 +1300 +6080 +ENDCHAR +STARTCHAR D48C +ENCODING 54412 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D48D +ENCODING 54413 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0400 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR D48E +ENCODING 54414 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -2 +BITMAP +7E +24 +7F +00 +FF +08 +7E +04 +7F +ENDCHAR +STARTCHAR D48F +ENCODING 54415 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +F7 +08 +3C +7C +02 +3E +C1 +ENDCHAR +STARTCHAR D490 +ENCODING 54416 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR D491 +ENCODING 54417 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +24 +24 +7F +00 +FF +08 +7E +7E +7E +ENDCHAR +STARTCHAR D492 +ENCODING 54418 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0400 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR D493 +ENCODING 54419 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +F7 +08 +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR D494 +ENCODING 54420 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7C80 +2480 +2480 +2480 +7E80 +0080 +FE80 +1080 +1380 +1080 +1080 +ENDCHAR +STARTCHAR D495 +ENCODING 54421 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +3E +01 +01 +01 +ENDCHAR +STARTCHAR D496 +ENCODING 54422 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D497 +ENCODING 54423 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D498 +ENCODING 54424 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +F9 +01 +FD +27 +21 +40 +7F +ENDCHAR +STARTCHAR D499 +ENCODING 54425 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D49A +ENCODING 54426 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D49B +ENCODING 54427 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +3F +40 +7E +ENDCHAR +STARTCHAR D49C +ENCODING 54428 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +7F +3F +40 +3F +ENDCHAR +STARTCHAR D49D +ENCODING 54429 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D49E +ENCODING 54430 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D49F +ENCODING 54431 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D4A0 +ENCODING 54432 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +52 +72 +85 +68 +ENDCHAR +STARTCHAR D4A1 +ENCODING 54433 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D4A2 +ENCODING 54434 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D4A3 +ENCODING 54435 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +76 +37 +49 +76 +ENDCHAR +STARTCHAR D4A4 +ENCODING 54436 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +7F +41 +7F +ENDCHAR +STARTCHAR D4A5 +ENCODING 54437 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +41 +7F +7F +ENDCHAR +STARTCHAR D4A6 +ENCODING 54438 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR D4A7 +ENCODING 54439 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +08 +14 +63 +ENDCHAR +STARTCHAR D4A8 +ENCODING 54440 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D4A9 +ENCODING 54441 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +57 +51 +FD +01 +FD +21 +3E +41 +41 +3E +ENDCHAR +STARTCHAR D4AA +ENCODING 54442 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +5100 +FD00 +1D00 +E100 +2700 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D4AB +ENCODING 54443 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +4900 +FD00 +DD00 +2300 +3D00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D4AC +ENCODING 54444 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D4AD +ENCODING 54445 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +27 +21 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D4AE +ENCODING 54446 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +1D +E1 +27 +3F +12 +3F +ENDCHAR +STARTCHAR D4AF +ENCODING 54447 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +DD +23 +3D +23 +1C +22 +1E +ENDCHAR +STARTCHAR D4B0 +ENCODING 54448 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -2 +BITMAP +0080 +7A80 +4A80 +4A80 +7E80 +0280 +FE80 +1680 +1280 +0280 +ENDCHAR +STARTCHAR D4B1 +ENCODING 54449 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +3F80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR D4B2 +ENCODING 54450 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F80 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D4B3 +ENCODING 54451 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +3900 +0500 +0680 +0040 +ENDCHAR +STARTCHAR D4B4 +ENCODING 54452 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +2A80 +5280 +FE80 +1680 +1280 +2000 +3F80 +ENDCHAR +STARTCHAR D4B5 +ENCODING 54453 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR D4B6 +ENCODING 54454 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +F500 +1500 +ED00 +2000 +4F80 +4700 +4500 +3200 +ENDCHAR +STARTCHAR D4B7 +ENCODING 54455 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D4B8 +ENCODING 54456 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +1F +7F +40 +3F +ENDCHAR +STARTCHAR D4B9 +ENCODING 54457 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +1F +39 +41 +38 +ENDCHAR +STARTCHAR D4BA +ENCODING 54458 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +77 +35 +45 +37 +ENDCHAR +STARTCHAR D4BB +ENCODING 54459 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +1D +77 +45 +37 +ENDCHAR +STARTCHAR D4BC +ENCODING 54460 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +52 +72 +45 +70 +ENDCHAR +STARTCHAR D4BD +ENCODING 54461 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +1F +77 +44 +37 +ENDCHAR +STARTCHAR D4BE +ENCODING 54462 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +57 +75 +45 +77 +ENDCHAR +STARTCHAR D4BF +ENCODING 54463 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +27 +7F +77 +45 +72 +ENDCHAR +STARTCHAR D4C0 +ENCODING 54464 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F80 +2080 +3F80 +ENDCHAR +STARTCHAR D4C1 +ENCODING 54465 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR D4C2 +ENCODING 54466 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +2100 +3900 +2A80 +3840 +ENDCHAR +STARTCHAR D4C3 +ENCODING 54467 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +0400 +0E00 +3180 +ENDCHAR +STARTCHAR D4C4 +ENCODING 54468 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR D4C5 +ENCODING 54469 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F00 +2080 +3080 +0F00 +ENDCHAR +STARTCHAR D4C6 +ENCODING 54470 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR D4C7 +ENCODING 54471 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F500 +5500 +F500 +1500 +ED00 +2000 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D4C8 +ENCODING 54472 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR D4C9 +ENCODING 54473 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +ED +20 +3F +3F +40 +3F +ENDCHAR +STARTCHAR D4CA +ENCODING 54474 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +0080 +7A80 +2A80 +7A80 +0280 +FA80 +1680 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D4CB +ENCODING 54475 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F5 +55 +F5 +15 +E5 +3C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D4CC +ENCODING 54476 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +7E80 +2480 +2480 +2480 +7E80 +0080 +FE80 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR D4CD +ENCODING 54477 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +3E +01 +01 +01 +ENDCHAR +STARTCHAR D4CE +ENCODING 54478 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +36 +09 +09 +09 +ENDCHAR +STARTCHAR D4CF +ENCODING 54479 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D4D0 +ENCODING 54480 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +49 +FD +01 +FD +11 +11 +40 +40 +7F +ENDCHAR +STARTCHAR D4D1 +ENCODING 54481 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D4D2 +ENCODING 54482 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D4D3 +ENCODING 54483 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +01 +FD +21 +3F +40 +7E +ENDCHAR +STARTCHAR D4D4 +ENCODING 54484 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +49 +FD +01 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR D4D5 +ENCODING 54485 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D4D6 +ENCODING 54486 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D4D7 +ENCODING 54487 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D4D8 +ENCODING 54488 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +52 +72 +85 +68 +ENDCHAR +STARTCHAR D4D9 +ENCODING 54489 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D4DA +ENCODING 54490 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D4DB +ENCODING 54491 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +77 +37 +49 +76 +ENDCHAR +STARTCHAR D4DC +ENCODING 54492 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +FD +49 +49 +FD +01 +FD +21 +20 +7F +41 +7F +ENDCHAR +STARTCHAR D4DD +ENCODING 54493 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +01 +FD +21 +41 +7F +7F +ENDCHAR +STARTCHAR D4DE +ENCODING 54494 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR D4DF +ENCODING 54495 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +FD00 +4900 +4900 +FD00 +0100 +FD00 +2100 +2800 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR D4E0 +ENCODING 54496 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D4E1 +ENCODING 54497 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +3E +41 +63 +1C +ENDCHAR +STARTCHAR D4E2 +ENCODING 54498 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +5100 +FD00 +0100 +FD00 +2100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D4E3 +ENCODING 54499 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +7900 +4900 +FD00 +1D00 +E100 +3C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D4E4 +ENCODING 54500 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +51 +FD +01 +FD +21 +7F +01 +3F +01 +ENDCHAR +STARTCHAR D4E5 +ENCODING 54501 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +20 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D4E6 +ENCODING 54502 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +79 +51 +FD +01 +FD +21 +3F +12 +3F +ENDCHAR +STARTCHAR D4E7 +ENCODING 54503 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +79 +49 +FD +1D +E1 +3C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D4E8 +ENCODING 54504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +3F80 +1200 +1200 +1200 +7F80 +0000 +FFC0 +1200 +1200 +1200 +ENDCHAR +STARTCHAR D4E9 +ENCODING 54505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D4EA +ENCODING 54506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR D4EB +ENCODING 54507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR D4EC +ENCODING 54508 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +1200 +3200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR D4ED +ENCODING 54509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D4EE +ENCODING 54510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +02 +8F +89 +76 +ENDCHAR +STARTCHAR D4EF +ENCODING 54511 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR D4F0 +ENCODING 54512 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D4F1 +ENCODING 54513 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +7F +71 +41 +71 +ENDCHAR +STARTCHAR D4F2 +ENCODING 54514 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +7F +79 +89 +76 +ENDCHAR +STARTCHAR D4F3 +ENCODING 54515 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +79 +7F +49 +76 +ENDCHAR +STARTCHAR D4F4 +ENCODING 54516 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR D4F5 +ENCODING 54517 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +7F +7E +88 +77 +ENDCHAR +STARTCHAR D4F6 +ENCODING 54518 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +FF +75 +85 +7F +ENDCHAR +STARTCHAR D4F7 +ENCODING 54519 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +24 +72 +77 +89 +76 +ENDCHAR +STARTCHAR D4F8 +ENCODING 54520 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D4F9 +ENCODING 54521 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +3200 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR D4FA +ENCODING 54522 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D4FB +ENCODING 54523 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +1100 +1500 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR D4FC +ENCODING 54524 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D4FD +ENCODING 54525 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +1200 +1F00 +2080 +2080 +1F00 +ENDCHAR +STARTCHAR D4FE +ENCODING 54526 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR D4FF +ENCODING 54527 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +3E +7C +02 +3E +C1 +ENDCHAR +STARTCHAR D500 +ENCODING 54528 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F00 +0080 +3F80 +ENDCHAR +STARTCHAR D501 +ENCODING 54529 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +24 +24 +7F +00 +FF +24 +7E +7E +7E +ENDCHAR +STARTCHAR D502 +ENCODING 54530 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +1200 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR D503 +ENCODING 54531 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +1E +7F +1C +22 +3C +ENDCHAR +STARTCHAR D504 +ENCODING 54532 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +3F80 +1200 +1200 +1200 +1200 +7F80 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR D505 +ENCODING 54533 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D506 +ENCODING 54534 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +3F00 +0880 +0880 +0800 +ENDCHAR +STARTCHAR D507 +ENCODING 54535 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +7900 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR D508 +ENCODING 54536 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0000 +2000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D509 +ENCODING 54537 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +2380 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D50A +ENCODING 54538 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR D50B +ENCODING 54539 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +3F00 +2000 +3F00 +ENDCHAR +STARTCHAR D50C +ENCODING 54540 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +3F80 +0000 +FFC0 +0000 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D50D +ENCODING 54541 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +7E +11 +71 +41 +71 +ENDCHAR +STARTCHAR D50E +ENCODING 54542 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +77 +19 +79 +89 +76 +ENDCHAR +STARTCHAR D50F +ENCODING 54543 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +79 +19 +7F +49 +76 +ENDCHAR +STARTCHAR D510 +ENCODING 54544 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +F2 +12 +72 +85 +68 +ENDCHAR +STARTCHAR D511 +ENCODING 54545 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +77 +18 +7F +48 +77 +ENDCHAR +STARTCHAR D512 +ENCODING 54546 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +FF +15 +F5 +85 +7F +ENDCHAR +STARTCHAR D513 +ENCODING 54547 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +F6 +1F +F6 +89 +76 +ENDCHAR +STARTCHAR D514 +ENCODING 54548 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0000 +3F00 +2080 +2080 +3F00 +ENDCHAR +STARTCHAR D515 +ENCODING 54549 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0000 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D516 +ENCODING 54550 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D517 +ENCODING 54551 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3F00 +1200 +1200 +3F80 +0000 +FFC0 +0000 +0400 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR D518 +ENCODING 54552 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +1200 +1300 +2C80 +4000 +ENDCHAR +STARTCHAR D519 +ENCODING 54553 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +1F00 +2080 +2100 +1E00 +ENDCHAR +STARTCHAR D51A +ENCODING 54554 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +3F00 +0200 +3F80 +ENDCHAR +STARTCHAR D51B +ENCODING 54555 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +1C +7E +06 +3E +C1 +ENDCHAR +STARTCHAR D51C +ENCODING 54556 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -2 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +3F00 +3F80 +0080 +ENDCHAR +STARTCHAR D51D +ENCODING 54557 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +7E +24 +24 +7F +00 +FF +3E +40 +7E +7E +ENDCHAR +STARTCHAR D51E +ENCODING 54558 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +3F00 +1200 +3F00 +0000 +FFC0 +0000 +3F80 +1200 +3F00 +ENDCHAR +STARTCHAR D51F +ENCODING 54559 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +7E +24 +24 +7F +00 +FF +1C +7F +1C +22 +3C +ENDCHAR +STARTCHAR D520 +ENCODING 54560 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +FD +49 +49 +49 +FD +01 +FF +01 +01 +01 +ENDCHAR +STARTCHAR D521 +ENCODING 54561 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D522 +ENCODING 54562 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D523 +ENCODING 54563 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +4900 +B100 +FD00 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D524 +ENCODING 54564 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +FD +05 +F9 +01 +40 +7F +ENDCHAR +STARTCHAR D525 +ENCODING 54565 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +47 +42 +45 +30 +ENDCHAR +STARTCHAR D526 +ENCODING 54566 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +06 +4F +46 +49 +36 +ENDCHAR +STARTCHAR D527 +ENCODING 54567 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +3F +40 +7E +ENDCHAR +STARTCHAR D528 +ENCODING 54568 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +7E +01 +7F +40 +3F +ENDCHAR +STARTCHAR D529 +ENCODING 54569 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D52A +ENCODING 54570 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +00 +7F +79 +49 +76 +ENDCHAR +STARTCHAR D52B +ENCODING 54571 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +60 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D52C +ENCODING 54572 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +62 +12 +72 +85 +68 +ENDCHAR +STARTCHAR D52D +ENCODING 54573 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +62 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D52E +ENCODING 54574 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +62 +15 +75 +85 +7F +ENDCHAR +STARTCHAR D52F +ENCODING 54575 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +67 +1F +76 +49 +76 +ENDCHAR +STARTCHAR D530 +ENCODING 54576 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR D531 +ENCODING 54577 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +41 +7F +7F +ENDCHAR +STARTCHAR D532 +ENCODING 54578 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +52 +72 +55 +78 +ENDCHAR +STARTCHAR D533 +ENCODING 54579 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +08 +14 +63 +ENDCHAR +STARTCHAR D534 +ENCODING 54580 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D535 +ENCODING 54581 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +01 +3E +41 +63 +1C +ENDCHAR +STARTCHAR D536 +ENCODING 54582 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +4900 +B100 +FD00 +0000 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D537 +ENCODING 54583 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +4900 +FD00 +0100 +FD00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D538 +ENCODING 54584 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +7F +3F +01 +01 +ENDCHAR +STARTCHAR D539 +ENCODING 54585 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +1E +20 +3F +20 +3F +ENDCHAR +STARTCHAR D53A +ENCODING 54586 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +49 +49 +B1 +FD +00 +7F +12 +3F +ENDCHAR +STARTCHAR D53B +ENCODING 54587 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +49 +FD +01 +FD +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D53C +ENCODING 54588 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +49 +49 +49 +49 +49 +49 +FD +01 +01 +01 +ENDCHAR +STARTCHAR D53D +ENCODING 54589 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +51 +FD +00 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D53E +ENCODING 54590 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +51 +F9 +00 +7F +09 +09 +09 +ENDCHAR +STARTCHAR D53F +ENCODING 54591 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5100 +5100 +F900 +0000 +7200 +1200 +1500 +0080 +ENDCHAR +STARTCHAR D540 +ENCODING 54592 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +51 +FD +01 +21 +20 +20 +3F +ENDCHAR +STARTCHAR D541 +ENCODING 54593 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +51 +F9 +07 +41 +42 +45 +30 +ENDCHAR +STARTCHAR D542 +ENCODING 54594 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +07 +4F +47 +49 +36 +ENDCHAR +STARTCHAR D543 +ENCODING 54595 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +51 +51 +51 +F9 +00 +7E +40 +7E +ENDCHAR +STARTCHAR D544 +ENCODING 54596 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +FD +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D545 +ENCODING 54597 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +77 +11 +71 +41 +71 +ENDCHAR +STARTCHAR D546 +ENCODING 54598 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D547 +ENCODING 54599 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +71 +15 +77 +45 +77 +ENDCHAR +STARTCHAR D548 +ENCODING 54600 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +72 +12 +72 +45 +70 +ENDCHAR +STARTCHAR D549 +ENCODING 54601 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +77 +14 +77 +44 +77 +ENDCHAR +STARTCHAR D54A +ENCODING 54602 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +62 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D54B +ENCODING 54603 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +77 +1F +77 +45 +72 +ENDCHAR +STARTCHAR D54C +ENCODING 54604 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +51 +FD +00 +3F +41 +41 +3F +ENDCHAR +STARTCHAR D54D +ENCODING 54605 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +51 +FD +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D54E +ENCODING 54606 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5100 +5100 +F900 +0000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D54F +ENCODING 54607 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +51 +FD +01 +08 +0C +36 +41 +ENDCHAR +STARTCHAR D550 +ENCODING 54608 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5100 +5100 +F900 +0000 +2200 +3200 +5D00 +0080 +ENDCHAR +STARTCHAR D551 +ENCODING 54609 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +F9 +51 +51 +51 +51 +FD +01 +1E +21 +21 +1E +ENDCHAR +STARTCHAR D552 +ENCODING 54610 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5100 +5100 +F900 +0000 +3F00 +0600 +3B00 +0080 +ENDCHAR +STARTCHAR D553 +ENCODING 54611 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +0100 +F900 +5100 +5100 +5D00 +A100 +1C00 +3C00 +0200 +1E00 +6180 +ENDCHAR +STARTCHAR D554 +ENCODING 54612 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +51 +F9 +00 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D555 +ENCODING 54613 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +3F +20 +3F +20 +3F +ENDCHAR +STARTCHAR D556 +ENCODING 54614 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +51 +51 +51 +F9 +00 +3F +12 +3F +ENDCHAR +STARTCHAR D557 +ENCODING 54615 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +01 +F9 +51 +51 +5D +A1 +1C +7F +1E +22 +1E +ENDCHAR +STARTCHAR D558 +ENCODING 54616 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0100 +7180 +8900 +8900 +8900 +7100 +0100 +0100 +ENDCHAR +STARTCHAR D559 +ENCODING 54617 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0180 +7900 +8900 +7900 +0000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR D55A +ENCODING 54618 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR D55B +ENCODING 54619 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +7200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR D55C +ENCODING 54620 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0100 +7180 +8900 +7100 +0100 +4000 +4000 +7F00 +ENDCHAR +STARTCHAR D55D +ENCODING 54621 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +0F00 +4200 +4500 +2000 +ENDCHAR +STARTCHAR D55E +ENCODING 54622 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0600 +8900 +8600 +8900 +7600 +ENDCHAR +STARTCHAR D55F +ENCODING 54623 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR D560 +ENCODING 54624 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD80 +8900 +7900 +0000 +7E00 +0100 +7E00 +4000 +7F00 +ENDCHAR +STARTCHAR D561 +ENCODING 54625 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0000 +7700 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D562 +ENCODING 54626 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR D563 +ENCODING 54627 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0000 +7900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR D564 +ENCODING 54628 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0000 +7200 +7200 +4500 +7080 +ENDCHAR +STARTCHAR D565 +ENCODING 54629 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD80 +8900 +7900 +0000 +7700 +1800 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR D566 +ENCODING 54630 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0000 +7F00 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D567 +ENCODING 54631 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0600 +7100 +7600 +4900 +7600 +ENDCHAR +STARTCHAR D568 +ENCODING 54632 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0180 +7900 +8900 +7900 +0000 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR D569 +ENCODING 54633 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +4980 +8900 +7900 +0000 +4100 +7E00 +4100 +7E00 +ENDCHAR +STARTCHAR D56A +ENCODING 54634 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +0200 +7200 +5500 +7880 +ENDCHAR +STARTCHAR D56B +ENCODING 54635 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0100 +7980 +8900 +7900 +0100 +0800 +1400 +6300 +ENDCHAR +STARTCHAR D56C +ENCODING 54636 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +2200 +2200 +5500 +0800 +ENDCHAR +STARTCHAR D56D +ENCODING 54637 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0180 +7900 +8900 +7900 +0000 +3E00 +4100 +3E00 +ENDCHAR +STARTCHAR D56E +ENCODING 54638 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR D56F +ENCODING 54639 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +6800 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR D570 +ENCODING 54640 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +7E00 +0100 +3F00 +ENDCHAR +STARTCHAR D571 +ENCODING 54641 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +7900 +0000 +7F00 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D572 +ENCODING 54642 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD00 +7180 +8900 +8900 +7000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR D573 +ENCODING 54643 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F900 +7980 +8900 +6800 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR D574 +ENCODING 54644 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +0280 +FE80 +0280 +3B80 +4A80 +4A80 +3A80 +0280 +0280 +0280 +ENDCHAR +STARTCHAR D575 +ENCODING 54645 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +07 +75 +95 +75 +00 +7F +01 +01 +ENDCHAR +STARTCHAR D576 +ENCODING 54646 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +77 +95 +95 +61 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D577 +ENCODING 54647 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7700 +9500 +9500 +6100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR D578 +ENCODING 54648 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +FD00 +0500 +7700 +9500 +7500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D579 +ENCODING 54649 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +77 +95 +95 +61 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D57A +ENCODING 54650 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D57B +ENCODING 54651 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +77 +95 +95 +61 +3F +40 +7F +ENDCHAR +STARTCHAR D57C +ENCODING 54652 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FF +95 +75 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D57D +ENCODING 54653 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D57E +ENCODING 54654 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D57F +ENCODING 54655 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D580 +ENCODING 54656 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D581 +ENCODING 54657 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D582 +ENCODING 54658 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D583 +ENCODING 54659 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +F700 +9500 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D584 +ENCODING 54660 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +07 +75 +95 +75 +00 +3F +41 +3F +ENDCHAR +STARTCHAR D585 +ENCODING 54661 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +97 +95 +75 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR D586 +ENCODING 54662 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7700 +9500 +9500 +6100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D587 +ENCODING 54663 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +FD00 +0700 +7500 +9500 +7100 +0800 +0C00 +1200 +6180 +ENDCHAR +STARTCHAR D588 +ENCODING 54664 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +FD00 +0700 +7500 +9500 +7500 +0000 +1200 +3300 +4C80 +ENDCHAR +STARTCHAR D589 +ENCODING 54665 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +07 +75 +95 +75 +00 +3E +41 +3E +ENDCHAR +STARTCHAR D58A +ENCODING 54666 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7700 +9500 +9500 +6100 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR D58B +ENCODING 54667 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +F700 +9500 +F500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D58C +ENCODING 54668 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +77 +95 +95 +61 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D58D +ENCODING 54669 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D58E +ENCODING 54670 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +77 +95 +95 +61 +3F +12 +3F +ENDCHAR +STARTCHAR D58F +ENCODING 54671 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +F7 +95 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D590 +ENCODING 54672 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0180 +7100 +8900 +8980 +8900 +7100 +0100 +0100 +ENDCHAR +STARTCHAR D591 +ENCODING 54673 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7E00 +0100 +0100 +ENDCHAR +STARTCHAR D592 +ENCODING 54674 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7E00 +1100 +1100 +ENDCHAR +STARTCHAR D593 +ENCODING 54675 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7200 +1200 +1500 +1880 +ENDCHAR +STARTCHAR D594 +ENCODING 54676 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 0 +BITMAP +7100 +FD80 +3100 +4900 +8980 +5900 +2000 +4000 +7E00 +ENDCHAR +STARTCHAR D595 +ENCODING 54677 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +0F00 +4200 +4500 +2000 +ENDCHAR +STARTCHAR D596 +ENCODING 54678 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0600 +8900 +8600 +8900 +7600 +ENDCHAR +STARTCHAR D597 +ENCODING 54679 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7F00 +4000 +7E00 +ENDCHAR +STARTCHAR D598 +ENCODING 54680 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +3F00 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D599 +ENCODING 54681 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7700 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D59A +ENCODING 54682 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR D59B +ENCODING 54683 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7900 +7E00 +8900 +7E00 +ENDCHAR +STARTCHAR D59C +ENCODING 54684 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7200 +7200 +4500 +7080 +ENDCHAR +STARTCHAR D59D +ENCODING 54685 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7E00 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR D59E +ENCODING 54686 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7F00 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D59F +ENCODING 54687 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0600 +7100 +7600 +4900 +7600 +ENDCHAR +STARTCHAR D5A0 +ENCODING 54688 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7E00 +4100 +7F00 +ENDCHAR +STARTCHAR D5A1 +ENCODING 54689 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +4100 +7E00 +7F00 +ENDCHAR +STARTCHAR D5A2 +ENCODING 54690 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +0200 +7200 +5500 +7880 +ENDCHAR +STARTCHAR D5A3 +ENCODING 54691 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +0800 +1400 +6300 +ENDCHAR +STARTCHAR D5A4 +ENCODING 54692 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +2200 +2200 +5500 +0800 +ENDCHAR +STARTCHAR D5A5 +ENCODING 54693 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD80 +0100 +7980 +8900 +7900 +0000 +3E00 +4100 +3E00 +ENDCHAR +STARTCHAR D5A6 +ENCODING 54694 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +3E00 +0600 +3F00 +4000 +ENDCHAR +STARTCHAR D5A7 +ENCODING 54695 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +6800 +1C00 +3C00 +0200 +1E00 +6100 +ENDCHAR +STARTCHAR D5A8 +ENCODING 54696 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7E00 +0100 +3F00 +ENDCHAR +STARTCHAR D5A9 +ENCODING 54697 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +7900 +0000 +7F00 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D5AA +ENCODING 54698 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +7000 +0100 +FD80 +7100 +8980 +8900 +7000 +7F00 +2200 +7F00 +ENDCHAR +STARTCHAR D5AB +ENCODING 54699 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +0100 +F980 +7900 +8980 +6800 +1C00 +7F00 +1C00 +2200 +1E00 +ENDCHAR +STARTCHAR D5AC +ENCODING 54700 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -2 +BITMAP +01 +75 +05 +F7 +65 +95 +97 +95 +65 +05 +ENDCHAR +STARTCHAR D5AD +ENCODING 54701 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FF +75 +97 +95 +61 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D5AE +ENCODING 54702 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FF +75 +97 +95 +61 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D5AF +ENCODING 54703 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FF00 +7500 +9700 +9500 +6100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR D5B0 +ENCODING 54704 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +65 +FD +67 +95 +97 +75 +05 +40 +7F +ENDCHAR +STARTCHAR D5B1 +ENCODING 54705 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FF +75 +97 +95 +61 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D5B2 +ENCODING 54706 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D5B3 +ENCODING 54707 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FF +75 +97 +95 +61 +3F +40 +7F +ENDCHAR +STARTCHAR D5B4 +ENCODING 54708 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +3E +01 +3F +40 +3F +ENDCHAR +STARTCHAR D5B5 +ENCODING 54709 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D5B6 +ENCODING 54710 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D5B7 +ENCODING 54711 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D5B8 +ENCODING 54712 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D5B9 +ENCODING 54713 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D5BA +ENCODING 54714 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D5BB +ENCODING 54715 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +F500 +9700 +F500 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D5BC +ENCODING 54716 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FF +75 +97 +95 +61 +3F +41 +7F +ENDCHAR +STARTCHAR D5BD +ENCODING 54717 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FF +75 +97 +95 +61 +21 +3F +3F +ENDCHAR +STARTCHAR D5BE +ENCODING 54718 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FF00 +7500 +9700 +9500 +6100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D5BF +ENCODING 54719 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FF +75 +97 +95 +61 +08 +1C +63 +ENDCHAR +STARTCHAR D5C0 +ENCODING 54720 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +6100 +0500 +FF00 +7500 +9700 +9500 +6100 +1200 +3200 +6D80 +ENDCHAR +STARTCHAR D5C1 +ENCODING 54721 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FF +75 +97 +95 +61 +3E +41 +21 +1E +ENDCHAR +STARTCHAR D5C2 +ENCODING 54722 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FF00 +7500 +9700 +9500 +6100 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR D5C3 +ENCODING 54723 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F700 +F500 +9700 +F500 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D5C4 +ENCODING 54724 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FF +75 +97 +95 +61 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D5C5 +ENCODING 54725 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D5C6 +ENCODING 54726 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FF +75 +97 +95 +61 +3F +12 +3F +ENDCHAR +STARTCHAR D5C7 +ENCODING 54727 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F7 +F5 +97 +F5 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D5C8 +ENCODING 54728 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +71 +8F +89 +89 +71 +01 +01 +ENDCHAR +STARTCHAR D5C9 +ENCODING 54729 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +7F +89 +79 +00 +7F +01 +01 +ENDCHAR +STARTCHAR D5CA +ENCODING 54730 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +49 +31 +77 +09 +09 +09 +ENDCHAR +STARTCHAR D5CB +ENCODING 54731 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +49 +31 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D5CC +ENCODING 54732 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +7F +89 +79 +01 +20 +20 +3F +ENDCHAR +STARTCHAR D5CD +ENCODING 54733 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +49 +31 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D5CE +ENCODING 54734 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR D5CF +ENCODING 54735 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +FD +73 +89 +49 +31 +3F +40 +7E +ENDCHAR +STARTCHAR D5D0 +ENCODING 54736 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +8F +79 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D5D1 +ENCODING 54737 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D5D2 +ENCODING 54738 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +8F +79 +00 +77 +15 +75 +45 +77 +ENDCHAR +STARTCHAR D5D3 +ENCODING 54739 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D5D4 +ENCODING 54740 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR D5D5 +ENCODING 54741 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D5D6 +ENCODING 54742 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D5D7 +ENCODING 54743 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR D5D8 +ENCODING 54744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +7F +89 +79 +00 +3F +41 +3F +ENDCHAR +STARTCHAR D5D9 +ENCODING 54745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +4F +89 +79 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D5DA +ENCODING 54746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +49 +31 +12 +72 +55 +70 +ENDCHAR +STARTCHAR D5DB +ENCODING 54747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0100 +7F00 +8900 +7900 +0100 +0800 +1600 +6180 +ENDCHAR +STARTCHAR D5DC +ENCODING 54748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +49 +31 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D5DD +ENCODING 54749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +7F +89 +79 +00 +3E +41 +3E +ENDCHAR +STARTCHAR D5DE +ENCODING 54750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +FD00 +7300 +8900 +4900 +3100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D5DF +ENCODING 54751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +7F00 +8900 +6900 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D5E0 +ENCODING 54752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +49 +31 +7F +3F +01 +01 +ENDCHAR +STARTCHAR D5E1 +ENCODING 54753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +79 +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D5E2 +ENCODING 54754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +FD +73 +89 +49 +31 +7F +12 +3F +ENDCHAR +STARTCHAR D5E3 +ENCODING 54755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7F +89 +69 +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D5E4 +ENCODING 54756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +0280 +FE80 +0280 +3A80 +4E80 +4A80 +4A80 +3A80 +0280 +0280 +ENDCHAR +STARTCHAR D5E5 +ENCODING 54757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +05 +7D +95 +75 +00 +7F +01 +01 +ENDCHAR +STARTCHAR D5E6 +ENCODING 54758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +75 +95 +95 +60 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D5E7 +ENCODING 54759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7500 +9500 +9500 +6000 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR D5E8 +ENCODING 54760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +FD00 +0500 +7D00 +9500 +7500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D5E9 +ENCODING 54761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +75 +95 +95 +60 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D5EA +ENCODING 54762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D5EB +ENCODING 54763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +75 +95 +95 +60 +3F +40 +7F +ENDCHAR +STARTCHAR D5EC +ENCODING 54764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +8D +75 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D5ED +ENCODING 54765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D5EE +ENCODING 54766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D5EF +ENCODING 54767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D5F0 +ENCODING 54768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D5F1 +ENCODING 54769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D5F2 +ENCODING 54770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D5F3 +ENCODING 54771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +FD00 +9500 +F100 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D5F4 +ENCODING 54772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +05 +7D +95 +75 +00 +3F +41 +3F +ENDCHAR +STARTCHAR D5F5 +ENCODING 54773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +9D +95 +75 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR D5F6 +ENCODING 54774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7500 +9500 +9500 +6000 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D5F7 +ENCODING 54775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +FD00 +0500 +7D00 +9500 +7500 +0900 +0C00 +3200 +4180 +ENDCHAR +STARTCHAR D5F8 +ENCODING 54776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +6100 +0500 +FD00 +7500 +9500 +9500 +6000 +1200 +3200 +6D80 +ENDCHAR +STARTCHAR D5F9 +ENCODING 54777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +05 +7D +95 +75 +00 +3F +41 +3E +ENDCHAR +STARTCHAR D5FA +ENCODING 54778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7500 +9500 +9500 +6000 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR D5FB +ENCODING 54779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +FD00 +9500 +F100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D5FC +ENCODING 54780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +75 +95 +95 +60 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D5FD +ENCODING 54781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D5FE +ENCODING 54782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +75 +95 +95 +60 +3F +12 +3F +ENDCHAR +STARTCHAR D5FF +ENCODING 54783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D600 +ENCODING 54784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +77 +89 +8F +89 +71 +01 +01 +ENDCHAR +STARTCHAR D601 +ENCODING 54785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +03 +79 +8B +79 +00 +7F +01 +01 +ENDCHAR +STARTCHAR D602 +ENCODING 54786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +4B +31 +77 +09 +09 +09 +ENDCHAR +STARTCHAR D603 +ENCODING 54787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +4B +31 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D604 +ENCODING 54788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +7B +89 +7B +01 +20 +20 +3F +ENDCHAR +STARTCHAR D605 +ENCODING 54789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +4B +31 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D606 +ENCODING 54790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR D607 +ENCODING 54791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +FD +73 +89 +4B +31 +3F +40 +7E +ENDCHAR +STARTCHAR D608 +ENCODING 54792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FF +89 +7B +01 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D609 +ENCODING 54793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D60A +ENCODING 54794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D60B +ENCODING 54795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D60C +ENCODING 54796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR D60D +ENCODING 54797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D60E +ENCODING 54798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D60F +ENCODING 54799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR D610 +ENCODING 54800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +03 +79 +8B +79 +00 +3F +41 +3F +ENDCHAR +STARTCHAR D611 +ENCODING 54801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +4B +89 +7B +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D612 +ENCODING 54802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +4B +31 +12 +72 +55 +70 +ENDCHAR +STARTCHAR D613 +ENCODING 54803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0300 +7900 +8B00 +7900 +0100 +0800 +1600 +6180 +ENDCHAR +STARTCHAR D614 +ENCODING 54804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0300 +7900 +8B00 +7900 +0000 +1200 +3300 +4C80 +ENDCHAR +STARTCHAR D615 +ENCODING 54805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +03 +79 +8B +79 +00 +3E +41 +3E +ENDCHAR +STARTCHAR D616 +ENCODING 54806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +FD00 +7300 +8900 +4B00 +3100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D617 +ENCODING 54807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +7B00 +8900 +6B00 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D618 +ENCODING 54808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +73 +89 +4B +31 +7F +3F +01 +01 +ENDCHAR +STARTCHAR D619 +ENCODING 54809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +7B +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D61A +ENCODING 54810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +FD +73 +89 +4B +31 +7F +12 +3F +ENDCHAR +STARTCHAR D61B +ENCODING 54811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +7B +89 +6B +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D61C +ENCODING 54812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3A80 +0280 +FE80 +0280 +3680 +4A80 +4E80 +4A80 +3280 +0280 +0280 +ENDCHAR +STARTCHAR D61D +ENCODING 54813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +7D +95 +95 +61 +7F +01 +01 +01 +ENDCHAR +STARTCHAR D61E +ENCODING 54814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +7D +95 +95 +61 +3F +09 +09 +09 +ENDCHAR +STARTCHAR D61F +ENCODING 54815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7D00 +9500 +9500 +6100 +7200 +0A00 +0D00 +0080 +ENDCHAR +STARTCHAR D620 +ENCODING 54816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6500 +0500 +FD00 +0D00 +7500 +9D00 +7500 +0500 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D621 +ENCODING 54817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +7D +95 +95 +61 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D622 +ENCODING 54818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +07 +4F +47 +45 +36 +ENDCHAR +STARTCHAR D623 +ENCODING 54819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +7D +95 +95 +61 +3F +40 +7F +ENDCHAR +STARTCHAR D624 +ENCODING 54820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +95 +75 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D625 +ENCODING 54821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +36 +09 +39 +41 +38 +ENDCHAR +STARTCHAR D626 +ENCODING 54822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +00 +3F +75 +45 +37 +ENDCHAR +STARTCHAR D627 +ENCODING 54823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +30 +0D +77 +45 +37 +ENDCHAR +STARTCHAR D628 +ENCODING 54824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +62 +12 +72 +45 +78 +ENDCHAR +STARTCHAR D629 +ENCODING 54825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +33 +0C +77 +44 +37 +ENDCHAR +STARTCHAR D62A +ENCODING 54826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D62B +ENCODING 54827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +FD00 +9500 +F100 +6700 +1F80 +7700 +4500 +7300 +ENDCHAR +STARTCHAR D62C +ENCODING 54828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +7D +95 +95 +61 +3F +41 +7F +ENDCHAR +STARTCHAR D62D +ENCODING 54829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +65 +05 +FD +9D +95 +75 +00 +21 +3F +21 +3F +ENDCHAR +STARTCHAR D62E +ENCODING 54830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7D00 +9500 +9500 +6100 +5200 +7200 +5500 +7080 +ENDCHAR +STARTCHAR D62F +ENCODING 54831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +7D +95 +9D +61 +08 +1C +63 +ENDCHAR +STARTCHAR D630 +ENCODING 54832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +6100 +0500 +FD00 +7D00 +9500 +9500 +6100 +1200 +3200 +6D80 +ENDCHAR +STARTCHAR D631 +ENCODING 54833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +7D +95 +9D +61 +3E +41 +21 +1E +ENDCHAR +STARTCHAR D632 +ENCODING 54834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +FD00 +7D00 +9500 +9500 +6100 +3F00 +0200 +1F80 +2000 +ENDCHAR +STARTCHAR D633 +ENCODING 54835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +FD00 +9500 +F100 +1C00 +3F00 +0200 +1F00 +6080 +ENDCHAR +STARTCHAR D634 +ENCODING 54836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +FD +7D +95 +95 +61 +3F +3F +01 +01 +ENDCHAR +STARTCHAR D635 +ENCODING 54837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +3F +40 +3F +40 +3F +ENDCHAR +STARTCHAR D636 +ENCODING 54838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +61 +05 +FD +7D +95 +95 +61 +3F +12 +3F +ENDCHAR +STARTCHAR D637 +ENCODING 54839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +FD +95 +F1 +1C +23 +1C +22 +1E +ENDCHAR +STARTCHAR D638 +ENCODING 54840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0E00 +0000 +7F80 +0000 +1E00 +2100 +1E00 +0400 +FFC0 +ENDCHAR +STARTCHAR D639 +ENCODING 54841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1F00 +0400 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D63A +ENCODING 54842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0000 +3B80 +0880 +0800 +ENDCHAR +STARTCHAR D63B +ENCODING 54843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3000 +0900 +0B80 +0C00 +ENDCHAR +STARTCHAR D63C +ENCODING 54844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D63D +ENCODING 54845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0300 +2100 +2280 +1000 +ENDCHAR +STARTCHAR D63E +ENCODING 54846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +06 +8F +89 +76 +ENDCHAR +STARTCHAR D63F +ENCODING 54847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1F00 +2000 +3F00 +ENDCHAR +STARTCHAR D640 +ENCODING 54848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1F00 +0400 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D641 +ENCODING 54849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +7F +71 +41 +71 +ENDCHAR +STARTCHAR D642 +ENCODING 54850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +7F +79 +89 +76 +ENDCHAR +STARTCHAR D643 +ENCODING 54851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +79 +7F +49 +76 +ENDCHAR +STARTCHAR D644 +ENCODING 54852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR D645 +ENCODING 54853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +0C00 +3F80 +4400 +3F80 +ENDCHAR +STARTCHAR D646 +ENCODING 54854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +FF +75 +85 +7F +ENDCHAR +STARTCHAR D647 +ENCODING 54855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +76 +77 +89 +76 +ENDCHAR +STARTCHAR D648 +ENCODING 54856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D649 +ENCODING 54857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D64A +ENCODING 54858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D64B +ENCODING 54859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +0000 +0400 +1E00 +6180 +ENDCHAR +STARTCHAR D64C +ENCODING 54860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D64D +ENCODING 54861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D64E +ENCODING 54862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3E00 +0100 +1F80 +2000 +ENDCHAR +STARTCHAR D64F +ENCODING 54863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +FF +00 +7E +3C +C3 +ENDCHAR +STARTCHAR D650 +ENCODING 54864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3F00 +0080 +3F00 +ENDCHAR +STARTCHAR D651 +ENCODING 54865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0400 +FFC0 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D652 +ENCODING 54866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0000 +3F00 +3F00 +ENDCHAR +STARTCHAR D653 +ENCODING 54867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +08 +F7 +1C +7F +24 +3C +ENDCHAR +STARTCHAR D654 +ENCODING 54868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7E80 +0080 +3880 +44C0 +3C80 +1080 +FE80 +0080 +0080 +ENDCHAR +STARTCHAR D655 +ENCODING 54869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7E80 +4480 +3CC0 +1080 +FE80 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D656 +ENCODING 54870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +3300 +0880 +0880 +ENDCHAR +STARTCHAR D657 +ENCODING 54871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +7100 +0900 +0A80 +0C40 +ENDCHAR +STARTCHAR D658 +ENCODING 54872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7E80 +4480 +3CC0 +1080 +FE80 +0080 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D659 +ENCODING 54873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +0780 +2100 +2280 +1800 +ENDCHAR +STARTCHAR D65A +ENCODING 54874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0600 +8900 +8600 +8900 +7600 +ENDCHAR +STARTCHAR D65B +ENCODING 54875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +1F00 +2000 +3F00 +ENDCHAR +STARTCHAR D65C +ENCODING 54876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7E80 +44C0 +3C80 +1000 +FF00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D65D +ENCODING 54877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7F00 +7100 +4100 +7100 +ENDCHAR +STARTCHAR D65E +ENCODING 54878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7F00 +7900 +8900 +7600 +ENDCHAR +STARTCHAR D65F +ENCODING 54879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7900 +7E00 +8900 +7600 +ENDCHAR +STARTCHAR D660 +ENCODING 54880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7200 +7200 +8500 +7800 +ENDCHAR +STARTCHAR D661 +ENCODING 54881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7700 +7F00 +4800 +7700 +ENDCHAR +STARTCHAR D662 +ENCODING 54882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7F00 +7500 +8500 +7F00 +ENDCHAR +STARTCHAR D663 +ENCODING 54883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7700 +7600 +4900 +7600 +ENDCHAR +STARTCHAR D664 +ENCODING 54884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +1F00 +2080 +3F80 +ENDCHAR +STARTCHAR D665 +ENCODING 54885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +2000 +3F00 +3F80 +ENDCHAR +STARTCHAR D666 +ENCODING 54886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +0900 +3900 +2A80 +3C40 +ENDCHAR +STARTCHAR D667 +ENCODING 54887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7E80 +4480 +3CC0 +1080 +FE80 +0080 +0400 +0A00 +31C0 +ENDCHAR +STARTCHAR D668 +ENCODING 54888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +1100 +1100 +2A80 +4400 +ENDCHAR +STARTCHAR D669 +ENCODING 54889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3880 +0080 +7E80 +4480 +3CC0 +1080 +FE80 +0080 +1F00 +2080 +1F00 +ENDCHAR +STARTCHAR D66A +ENCODING 54890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +1F00 +0100 +1F80 +2000 +ENDCHAR +STARTCHAR D66B +ENCODING 54891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +F500 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D66C +ENCODING 54892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +3F00 +0080 +1F80 +ENDCHAR +STARTCHAR D66D +ENCODING 54893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +7E00 +7E00 +4000 +3F00 +ENDCHAR +STARTCHAR D66E +ENCODING 54894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +1800 +0080 +7C80 +3C80 +64C0 +1880 +FE80 +0E00 +1100 +3F80 +ENDCHAR +STARTCHAR D66F +ENCODING 54895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7000 +C900 +3100 +C980 +7900 +FD00 +0000 +1C00 +7F00 +3200 +1E00 +ENDCHAR +STARTCHAR D670 +ENCODING 54896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7A80 +0280 +7A80 +4B80 +7A80 +1280 +FE80 +0280 +0280 +ENDCHAR +STARTCHAR D671 +ENCODING 54897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7E80 +4B80 +3A80 +1280 +FE80 +0000 +3F80 +0080 +0080 +ENDCHAR +STARTCHAR D672 +ENCODING 54898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +1900 +0480 +0480 +0480 +ENDCHAR +STARTCHAR D673 +ENCODING 54899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +3900 +0900 +0A80 +0040 +ENDCHAR +STARTCHAR D674 +ENCODING 54900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3280 +0280 +7E80 +4A80 +3B80 +1280 +FE80 +0280 +2000 +2000 +1FC0 +ENDCHAR +STARTCHAR D675 +ENCODING 54901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +2380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR D676 +ENCODING 54902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +42 +47 +45 +32 +ENDCHAR +STARTCHAR D677 +ENCODING 54903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +1F80 +2000 +3F80 +ENDCHAR +STARTCHAR D678 +ENCODING 54904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +7F +3F +40 +3F +ENDCHAR +STARTCHAR D679 +ENCODING 54905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +7F +39 +41 +38 +ENDCHAR +STARTCHAR D67A +ENCODING 54906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +77 +3D +45 +37 +ENDCHAR +STARTCHAR D67B +ENCODING 54907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +75 +3F +45 +37 +ENDCHAR +STARTCHAR D67C +ENCODING 54908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +9700 +D500 +2500 +D100 +7200 +3200 +4500 +7080 +ENDCHAR +STARTCHAR D67D +ENCODING 54909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +77 +3F +44 +37 +ENDCHAR +STARTCHAR D67E +ENCODING 54910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +77 +35 +45 +77 +ENDCHAR +STARTCHAR D67F +ENCODING 54911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +72 +37 +45 +72 +ENDCHAR +STARTCHAR D680 +ENCODING 54912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +1F00 +2080 +3F80 +ENDCHAR +STARTCHAR D681 +ENCODING 54913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +2080 +3F80 +3F80 +ENDCHAR +STARTCHAR D682 +ENCODING 54914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +0100 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR D683 +ENCODING 54915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7E80 +4A80 +3B80 +1280 +FE80 +0080 +0400 +0A00 +3180 +ENDCHAR +STARTCHAR D684 +ENCODING 54916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +0100 +1100 +2A80 +0400 +ENDCHAR +STARTCHAR D685 +ENCODING 54917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7E80 +4B80 +3A80 +1280 +FE80 +0000 +1F80 +2080 +1F00 +ENDCHAR +STARTCHAR D686 +ENCODING 54918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +1F80 +0100 +0F80 +1040 +ENDCHAR +STARTCHAR D687 +ENCODING 54919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +6100 +0500 +F500 +9700 +D500 +2500 +D100 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D688 +ENCODING 54920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +1F80 +0080 +1F80 +0080 +ENDCHAR +STARTCHAR D689 +ENCODING 54921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +3F +7F +40 +3F +ENDCHAR +STARTCHAR D68A +ENCODING 54922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +7B80 +4A80 +3280 +FE80 +1F80 +0900 +1F80 +ENDCHAR +STARTCHAR D68B +ENCODING 54923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +61 +05 +F5 +97 +D5 +25 +D1 +1C +7F +32 +1E +ENDCHAR +STARTCHAR D68C +ENCODING 54924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +0080 +7E80 +0080 +3C80 +4480 +3C80 +1080 +FF80 +0080 +0080 +ENDCHAR +STARTCHAR D68D +ENCODING 54925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +21 +FF +00 +7F +01 +01 +ENDCHAR +STARTCHAR D68E +ENCODING 54926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +36 +09 +09 +09 +ENDCHAR +STARTCHAR D68F +ENCODING 54927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +62 +12 +15 +10 +ENDCHAR +STARTCHAR D690 +ENCODING 54928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +21 +FF +01 +40 +40 +7F +ENDCHAR +STARTCHAR D691 +ENCODING 54929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +47 +41 +47 +30 +ENDCHAR +STARTCHAR D692 +ENCODING 54930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D693 +ENCODING 54931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +3E +40 +7E +ENDCHAR +STARTCHAR D694 +ENCODING 54932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +20 +FF +01 +7F +40 +7F +ENDCHAR +STARTCHAR D695 +ENCODING 54933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D696 +ENCODING 54934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D697 +ENCODING 54935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D698 +ENCODING 54936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +72 +72 +85 +68 +ENDCHAR +STARTCHAR D699 +ENCODING 54937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D69A +ENCODING 54938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D69B +ENCODING 54939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +77 +37 +49 +76 +ENDCHAR +STARTCHAR D69C +ENCODING 54940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +00 +7F +41 +3E +ENDCHAR +STARTCHAR D69D +ENCODING 54941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +21 +FE +41 +7F +41 +7F +ENDCHAR +STARTCHAR D69E +ENCODING 54942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +12 +72 +55 +78 +ENDCHAR +STARTCHAR D69F +ENCODING 54943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +FD00 +8900 +7900 +2100 +FF00 +0100 +0800 +1600 +6180 +ENDCHAR +STARTCHAR D6A0 +ENCODING 54944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +22 +22 +55 +08 +ENDCHAR +STARTCHAR D6A1 +ENCODING 54945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +21 +FF +01 +3E +41 +3E +ENDCHAR +STARTCHAR D6A2 +ENCODING 54946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +F900 +7900 +C900 +3100 +FF00 +3C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D6A3 +ENCODING 54947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +C900 +3100 +C900 +7900 +F500 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D6A4 +ENCODING 54948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +3E +01 +3F +01 +ENDCHAR +STARTCHAR D6A5 +ENCODING 54949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +FD +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D6A6 +ENCODING 54950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +F9 +79 +C9 +31 +FF +2D +12 +3F +ENDCHAR +STARTCHAR D6A7 +ENCODING 54951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +F5 +0C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D6A8 +ENCODING 54952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0E00 +0000 +7F80 +0000 +1E00 +2100 +1E00 +1100 +FFC0 +ENDCHAR +STARTCHAR D6A9 +ENCODING 54953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D6AA +ENCODING 54954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +0000 +3B80 +0880 +0800 +ENDCHAR +STARTCHAR D6AB +ENCODING 54955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +3000 +0900 +0B80 +0C00 +ENDCHAR +STARTCHAR D6AC +ENCODING 54956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +1200 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D6AD +ENCODING 54957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +0300 +2100 +2280 +1000 +ENDCHAR +STARTCHAR D6AE +ENCODING 54958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +06 +8F +89 +76 +ENDCHAR +STARTCHAR D6AF +ENCODING 54959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +1F00 +2000 +3F00 +ENDCHAR +STARTCHAR D6B0 +ENCODING 54960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +1200 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D6B1 +ENCODING 54961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +7F +71 +41 +71 +ENDCHAR +STARTCHAR D6B2 +ENCODING 54962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +7F +79 +89 +76 +ENDCHAR +STARTCHAR D6B3 +ENCODING 54963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +79 +7F +49 +76 +ENDCHAR +STARTCHAR D6B4 +ENCODING 54964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR D6B5 +ENCODING 54965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +7F +7E +88 +77 +ENDCHAR +STARTCHAR D6B6 +ENCODING 54966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +FF +75 +85 +7F +ENDCHAR +STARTCHAR D6B7 +ENCODING 54967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +76 +77 +89 +76 +ENDCHAR +STARTCHAR D6B8 +ENCODING 54968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +1F00 +2080 +3F80 +ENDCHAR +STARTCHAR D6B9 +ENCODING 54969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +1200 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D6BA +ENCODING 54970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D6BB +ENCODING 54971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +1200 +FFC0 +0000 +0400 +1E00 +6180 +ENDCHAR +STARTCHAR D6BC +ENCODING 54972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D6BD +ENCODING 54973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +1E00 +2100 +2180 +1E00 +ENDCHAR +STARTCHAR D6BE +ENCODING 54974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +3E00 +0100 +1F80 +2000 +ENDCHAR +STARTCHAR D6BF +ENCODING 54975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +E7 +18 +00 +7E +3C +C3 +ENDCHAR +STARTCHAR D6C0 +ENCODING 54976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +3F00 +0080 +3F00 +ENDCHAR +STARTCHAR D6C1 +ENCODING 54977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1C +FF +3C +42 +3E +FF +00 +7E +7E +7E +ENDCHAR +STARTCHAR D6C2 +ENCODING 54978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +2100 +1E00 +FFC0 +0000 +3F00 +3F00 +ENDCHAR +STARTCHAR D6C3 +ENCODING 54979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +1C +7F +24 +3C +ENDCHAR +STARTCHAR D6C4 +ENCODING 54980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +0000 +7F80 +1100 +2100 +1E00 +0000 +FFC0 +0400 +0400 +ENDCHAR +STARTCHAR D6C5 +ENCODING 54981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0400 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D6C6 +ENCODING 54982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0400 +3B80 +0880 +0800 +ENDCHAR +STARTCHAR D6C7 +ENCODING 54983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3400 +0900 +0B80 +0C00 +ENDCHAR +STARTCHAR D6C8 +ENCODING 54984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0400 +2400 +2000 +3F80 +ENDCHAR +STARTCHAR D6C9 +ENCODING 54985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0700 +2100 +2280 +1000 +ENDCHAR +STARTCHAR D6CA +ENCODING 54986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +06 +8F +89 +76 +ENDCHAR +STARTCHAR D6CB +ENCODING 54987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1F00 +2000 +3F00 +ENDCHAR +STARTCHAR D6CC +ENCODING 54988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 12 0 -3 +BITMAP +0E00 +0000 +7F80 +3300 +0C00 +FFC0 +0400 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D6CD +ENCODING 54989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +7F +71 +41 +71 +ENDCHAR +STARTCHAR D6CE +ENCODING 54990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +7F +79 +89 +76 +ENDCHAR +STARTCHAR D6CF +ENCODING 54991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +79 +7F +49 +76 +ENDCHAR +STARTCHAR D6D0 +ENCODING 54992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR D6D1 +ENCODING 54993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 12 0 -3 +BITMAP +0E00 +0000 +7F80 +3300 +0C00 +FFC0 +0400 +3F80 +0C00 +3F80 +4400 +3F80 +ENDCHAR +STARTCHAR D6D2 +ENCODING 54994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +FF +75 +85 +7F +ENDCHAR +STARTCHAR D6D3 +ENCODING 54995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +76 +77 +89 +76 +ENDCHAR +STARTCHAR D6D4 +ENCODING 54996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D6D5 +ENCODING 54997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +2400 +3F00 +3F80 +ENDCHAR +STARTCHAR D6D6 +ENCODING 54998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +4D00 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D6D7 +ENCODING 54999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0400 +0C00 +1A00 +6180 +ENDCHAR +STARTCHAR D6D8 +ENCODING 55000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1400 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D6D9 +ENCODING 55001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0400 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D6DA +ENCODING 55002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3E00 +0100 +1F80 +2000 +ENDCHAR +STARTCHAR D6DB +ENCODING 55003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +0C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D6DC +ENCODING 55004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3F00 +0080 +3F00 +ENDCHAR +STARTCHAR D6DD +ENCODING 55005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +1C +63 +1C +62 +3E +F7 +08 +7E +7E +7E +ENDCHAR +STARTCHAR D6DE +ENCODING 55006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0400 +3B00 +3F00 +ENDCHAR +STARTCHAR D6DF +ENCODING 55007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +0400 +0E00 +3F80 +1200 +1E00 +ENDCHAR +STARTCHAR D6E0 +ENCODING 55008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +0080 +7E80 +4480 +3C80 +0080 +FE80 +1080 +1380 +1080 +1080 +ENDCHAR +STARTCHAR D6E1 +ENCODING 55009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +00 +3F +01 +01 +ENDCHAR +STARTCHAR D6E2 +ENCODING 55010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +00 +3F +09 +09 +ENDCHAR +STARTCHAR D6E3 +ENCODING 55011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +62 +12 +15 +18 +ENDCHAR +STARTCHAR D6E4 +ENCODING 55012 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +89 +79 +01 +FF +21 +67 +40 +7F +ENDCHAR +STARTCHAR D6E5 +ENCODING 55013 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +07 +41 +47 +30 +ENDCHAR +STARTCHAR D6E6 +ENCODING 55014 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D6E7 +ENCODING 55015 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +00 +7E +7E +ENDCHAR +STARTCHAR D6E8 +ENCODING 55016 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 12 1 -3 +BITMAP +71 +01 +FD +CF +31 +FD +21 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR D6E9 +ENCODING 55017 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D6EA +ENCODING 55018 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D6EB +ENCODING 55019 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D6EC +ENCODING 55020 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +72 +72 +85 +68 +ENDCHAR +STARTCHAR D6ED +ENCODING 55021 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D6EE +ENCODING 55022 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D6EF +ENCODING 55023 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +76 +37 +49 +76 +ENDCHAR +STARTCHAR D6F0 +ENCODING 55024 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +87 +79 +01 +FD +20 +7F +41 +7F +ENDCHAR +STARTCHAR D6F1 +ENCODING 55025 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +41 +7F +41 +3E +ENDCHAR +STARTCHAR D6F2 +ENCODING 55026 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +12 +72 +55 +78 +ENDCHAR +STARTCHAR D6F3 +ENCODING 55027 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +09 +0C +33 +40 +ENDCHAR +STARTCHAR D6F4 +ENCODING 55028 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +C900 +3100 +C900 +6900 +DD00 +2700 +0200 +2200 +5D00 +0080 +ENDCHAR +STARTCHAR D6F5 +ENCODING 55029 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +87 +79 +01 +FD +20 +3E +41 +3E +ENDCHAR +STARTCHAR D6F6 +ENCODING 55030 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +C900 +3100 +C900 +6900 +DD00 +2700 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D6F7 +ENCODING 55031 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +FD00 +7100 +8900 +7100 +FD00 +0700 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D6F8 +ENCODING 55032 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +00 +3F +3F +01 +ENDCHAR +STARTCHAR D6F9 +ENCODING 55033 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +07 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D6FA +ENCODING 55034 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +C9 +31 +C9 +69 +DD +27 +00 +3F +3F +ENDCHAR +STARTCHAR D6FB +ENCODING 55035 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +0F +33 +0C +32 +1E +ENDCHAR +STARTCHAR D6FC +ENCODING 55036 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +FE80 +4A80 +4A80 +7A80 +0280 +FE80 +1280 +1680 +1280 +ENDCHAR +STARTCHAR D6FD +ENCODING 55037 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7E80 +4E80 +3A80 +0280 +FE80 +1000 +3F80 +0080 +0080 +ENDCHAR +STARTCHAR D6FE +ENCODING 55038 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0000 +1D80 +0480 +0400 +ENDCHAR +STARTCHAR D6FF +ENCODING 55039 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +3100 +0900 +0A80 +0840 +ENDCHAR +STARTCHAR D700 +ENCODING 55040 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7E80 +4A80 +3A80 +0280 +FE80 +1280 +2680 +2000 +3F80 +ENDCHAR +STARTCHAR D701 +ENCODING 55041 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0380 +2080 +23C0 +1800 +ENDCHAR +STARTCHAR D702 +ENCODING 55042 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +2100 +2380 +2280 +1900 +ENDCHAR +STARTCHAR D703 +ENCODING 55043 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR D704 +ENCODING 55044 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 12 0 -3 +BITMAP +3280 +0280 +7E80 +4E80 +3280 +FE80 +1000 +3F80 +0080 +3F80 +2000 +3F80 +ENDCHAR +STARTCHAR D705 +ENCODING 55045 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3F80 +1C80 +2080 +1C00 +ENDCHAR +STARTCHAR D706 +ENCODING 55046 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3B80 +1E80 +2280 +1B80 +ENDCHAR +STARTCHAR D707 +ENCODING 55047 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3A80 +1F80 +2280 +1B80 +ENDCHAR +STARTCHAR D708 +ENCODING 55048 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3900 +1900 +2280 +3840 +ENDCHAR +STARTCHAR D709 +ENCODING 55049 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3B80 +1F80 +2200 +1B80 +ENDCHAR +STARTCHAR D70A +ENCODING 55050 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3B80 +1A80 +2280 +3B80 +ENDCHAR +STARTCHAR D70B +ENCODING 55051 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +3900 +1B80 +2280 +3900 +ENDCHAR +STARTCHAR D70C +ENCODING 55052 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR D70D +ENCODING 55053 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0000 +3F80 +3F80 +ENDCHAR +STARTCHAR D70E +ENCODING 55054 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0100 +3900 +2A80 +3C00 +ENDCHAR +STARTCHAR D70F +ENCODING 55055 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0400 +0600 +1900 +2080 +ENDCHAR +STARTCHAR D710 +ENCODING 55056 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0100 +0900 +3E80 +0040 +ENDCHAR +STARTCHAR D711 +ENCODING 55057 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3280 +0280 +7E80 +4E80 +3A80 +0280 +FE80 +1000 +1F80 +2080 +1F80 +ENDCHAR +STARTCHAR D712 +ENCODING 55058 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0E00 +0180 +0F80 +1040 +ENDCHAR +STARTCHAR D713 +ENCODING 55059 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +0600 +1F80 +0F00 +30C0 +ENDCHAR +STARTCHAR D714 +ENCODING 55060 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0000 +1F80 +1F80 +0080 +ENDCHAR +STARTCHAR D715 +ENCODING 55061 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +1F80 +3F80 +2000 +1F80 +ENDCHAR +STARTCHAR D716 +ENCODING 55062 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 0 -1 +BITMAP +3080 +0280 +7A80 +4A80 +3A80 +FE80 +1680 +0000 +1F80 +1F80 +ENDCHAR +STARTCHAR D717 +ENCODING 55063 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3080 +4A80 +3280 +4A80 +3280 +FA80 +1480 +0E00 +3F80 +1900 +0F00 +ENDCHAR +STARTCHAR D718 +ENCODING 55064 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3880 +0080 +7E80 +2480 +4480 +3C80 +0080 +FE80 +1080 +1080 +1080 +ENDCHAR +STARTCHAR D719 +ENCODING 55065 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FD +20 +7F +01 +01 +ENDCHAR +STARTCHAR D71A +ENCODING 55066 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +00 +3F +09 +09 +ENDCHAR +STARTCHAR D71B +ENCODING 55067 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +62 +12 +15 +18 +ENDCHAR +STARTCHAR D71C +ENCODING 55068 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FD +21 +60 +40 +7F +ENDCHAR +STARTCHAR D71D +ENCODING 55069 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +07 +41 +47 +30 +ENDCHAR +STARTCHAR D71E +ENCODING 55070 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D71F +ENCODING 55071 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +00 +7E +7E +ENDCHAR +STARTCHAR D720 +ENCODING 55072 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 12 1 -3 +BITMAP +31 +01 +FD +49 +31 +FD +20 +7F +01 +7F +40 +7F +ENDCHAR +STARTCHAR D721 +ENCODING 55073 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D722 +ENCODING 55074 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D723 +ENCODING 55075 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D724 +ENCODING 55076 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +72 +72 +85 +68 +ENDCHAR +STARTCHAR D725 +ENCODING 55077 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D726 +ENCODING 55078 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D727 +ENCODING 55079 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +76 +37 +49 +76 +ENDCHAR +STARTCHAR D728 +ENCODING 55080 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FD +20 +7F +41 +7F +ENDCHAR +STARTCHAR D729 +ENCODING 55081 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 12 1 -3 +BITMAP +31 +01 +FD +89 +79 +01 +FD +20 +41 +7F +41 +7F +ENDCHAR +STARTCHAR D72A +ENCODING 55082 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +12 +72 +55 +78 +ENDCHAR +STARTCHAR D72B +ENCODING 55083 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +FD00 +8900 +7900 +0100 +FD00 +2100 +0800 +1600 +6180 +ENDCHAR +STARTCHAR D72C +ENCODING 55084 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +C900 +3100 +C900 +6900 +DD00 +2100 +0200 +2200 +5D00 +0080 +ENDCHAR +STARTCHAR D72D +ENCODING 55085 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FD +21 +3E +41 +3E +ENDCHAR +STARTCHAR D72E +ENCODING 55086 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +C900 +3100 +C900 +6900 +DD00 +2100 +1C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D72F +ENCODING 55087 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +FD00 +7100 +8900 +7100 +FD00 +0100 +0C00 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D730 +ENCODING 55088 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +00 +3F +3F +01 +ENDCHAR +STARTCHAR D731 +ENCODING 55089 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +01 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D732 +ENCODING 55090 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +C9 +31 +C9 +69 +DD +21 +00 +3F +3F +ENDCHAR +STARTCHAR D733 +ENCODING 55091 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +FD +71 +89 +71 +FD +0D +33 +0C +32 +1E +ENDCHAR +STARTCHAR D734 +ENCODING 55092 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +0000 +7F80 +1100 +2100 +1E00 +0000 +FFC0 +1200 +1200 +ENDCHAR +STARTCHAR D735 +ENCODING 55093 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +1200 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D736 +ENCODING 55094 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1200 +2980 +0880 +0800 +ENDCHAR +STARTCHAR D737 +ENCODING 55095 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3200 +0900 +0B80 +0C00 +ENDCHAR +STARTCHAR D738 +ENCODING 55096 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +1200 +3200 +2000 +3F80 +ENDCHAR +STARTCHAR D739 +ENCODING 55097 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1300 +2100 +2280 +1000 +ENDCHAR +STARTCHAR D73A +ENCODING 55098 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +0100 +4780 +4480 +3B00 +ENDCHAR +STARTCHAR D73B +ENCODING 55099 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1F00 +2000 +3F00 +ENDCHAR +STARTCHAR D73C +ENCODING 55100 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 12 0 -3 +BITMAP +0E00 +0000 +7F80 +3300 +0C00 +FFC0 +1200 +3F00 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D73D +ENCODING 55101 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +3F80 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D73E +ENCODING 55102 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +3F80 +3C80 +4480 +3B00 +ENDCHAR +STARTCHAR D73F +ENCODING 55103 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +3C80 +3F80 +2480 +3B00 +ENDCHAR +STARTCHAR D740 +ENCODING 55104 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +7900 +3900 +4280 +3400 +ENDCHAR +STARTCHAR D741 +ENCODING 55105 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +3F80 +3F00 +4400 +3B80 +ENDCHAR +STARTCHAR D742 +ENCODING 55106 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +7F80 +3A80 +4280 +3F80 +ENDCHAR +STARTCHAR D743 +ENCODING 55107 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +3900 +3B80 +4480 +3B00 +ENDCHAR +STARTCHAR D744 +ENCODING 55108 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +1200 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D745 +ENCODING 55109 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3200 +3F00 +3F80 +ENDCHAR +STARTCHAR D746 +ENCODING 55110 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +5B00 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D747 +ENCODING 55111 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +1100 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR D748 +ENCODING 55112 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1200 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D749 +ENCODING 55113 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +1200 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D74A +ENCODING 55114 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3E00 +0100 +1F80 +2000 +ENDCHAR +STARTCHAR D74B +ENCODING 55115 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +2D00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D74C +ENCODING 55116 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3F00 +0080 +3F00 +ENDCHAR +STARTCHAR D74D +ENCODING 55117 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +1200 +3F00 +3F00 +3F00 +ENDCHAR +STARTCHAR D74E +ENCODING 55118 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1200 +3F00 +3F00 +ENDCHAR +STARTCHAR D74F +ENCODING 55119 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3180 +0E00 +3100 +1F00 +FFC0 +2100 +0E00 +3F80 +1200 +1E00 +ENDCHAR +STARTCHAR D750 +ENCODING 55120 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 0 +BITMAP +0E00 +0000 +7F80 +0000 +1E00 +2100 +1E00 +0000 +FFC0 +ENDCHAR +STARTCHAR D751 +ENCODING 55121 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +0080 +0080 +ENDCHAR +STARTCHAR D752 +ENCODING 55122 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0000 +3B80 +0880 +0800 +ENDCHAR +STARTCHAR D753 +ENCODING 55123 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3000 +0900 +0B80 +0C00 +ENDCHAR +STARTCHAR D754 +ENCODING 55124 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0000 +2000 +2000 +3F80 +ENDCHAR +STARTCHAR D755 +ENCODING 55125 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0300 +2100 +2280 +1000 +ENDCHAR +STARTCHAR D756 +ENCODING 55126 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +3300 +0C00 +FFC0 +0380 +4000 +4780 +4480 +3B80 +ENDCHAR +STARTCHAR D757 +ENCODING 55127 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D758 +ENCODING 55128 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0080 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D759 +ENCODING 55129 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0880 +3880 +2080 +3880 +ENDCHAR +STARTCHAR D75A +ENCODING 55130 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +7F +79 +89 +76 +ENDCHAR +STARTCHAR D75B +ENCODING 55131 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +79 +7F +49 +76 +ENDCHAR +STARTCHAR D75C +ENCODING 55132 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +F2 +72 +85 +68 +ENDCHAR +STARTCHAR D75D +ENCODING 55133 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +7F +7E +88 +77 +ENDCHAR +STARTCHAR D75E +ENCODING 55134 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +FF +75 +85 +7F +ENDCHAR +STARTCHAR D75F +ENCODING 55135 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +76 +77 +89 +76 +ENDCHAR +STARTCHAR D760 +ENCODING 55136 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D761 +ENCODING 55137 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +2080 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D762 +ENCODING 55138 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +4900 +7900 +4A80 +7C00 +ENDCHAR +STARTCHAR D763 +ENCODING 55139 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0000 +0400 +1A00 +6180 +ENDCHAR +STARTCHAR D764 +ENCODING 55140 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +1000 +1300 +2E80 +4000 +ENDCHAR +STARTCHAR D765 +ENCODING 55141 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +0000 +3F00 +2080 +3F00 +ENDCHAR +STARTCHAR D766 +ENCODING 55142 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3E00 +0100 +1F80 +2000 +ENDCHAR +STARTCHAR D767 +ENCODING 55143 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +E7 +18 +00 +7E +3C +C3 +ENDCHAR +STARTCHAR D768 +ENCODING 55144 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -2 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +3F00 +0080 +3F00 +ENDCHAR +STARTCHAR D769 +ENCODING 55145 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 11 0 -2 +BITMAP +0E00 +0000 +7F80 +2100 +1E00 +0000 +FFC0 +2000 +3F00 +2000 +3F80 +ENDCHAR +STARTCHAR D76A +ENCODING 55146 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +0E00 +3380 +0C00 +1300 +3100 +0E00 +FFC0 +0000 +3F00 +3F00 +ENDCHAR +STARTCHAR D76B +ENCODING 55147 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +1C +FF +3C +42 +3E +FF +00 +1C +7F +24 +3C +ENDCHAR +STARTCHAR D76C +ENCODING 55148 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 0 -2 +BITMAP +3C80 +0080 +7E80 +0080 +3C80 +4480 +3C80 +0080 +FF80 +0080 +0080 +ENDCHAR +STARTCHAR D76D +ENCODING 55149 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +3E +01 +01 +01 +ENDCHAR +STARTCHAR D76E +ENCODING 55150 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +36 +09 +09 +09 +ENDCHAR +STARTCHAR D76F +ENCODING 55151 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +62 +12 +15 +10 +ENDCHAR +STARTCHAR D770 +ENCODING 55152 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +49 +79 +01 +FD +01 +40 +40 +7F +ENDCHAR +STARTCHAR D771 +ENCODING 55153 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +47 +41 +47 +30 +ENDCHAR +STARTCHAR D772 +ENCODING 55154 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +46 +4F +49 +36 +ENDCHAR +STARTCHAR D773 +ENCODING 55155 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +3E +40 +7E +ENDCHAR +STARTCHAR D774 +ENCODING 55156 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +00 +FF +01 +7F +40 +7F +ENDCHAR +STARTCHAR D775 +ENCODING 55157 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +77 +31 +41 +71 +ENDCHAR +STARTCHAR D776 +ENCODING 55158 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D777 +ENCODING 55159 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D778 +ENCODING 55160 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +72 +72 +85 +68 +ENDCHAR +STARTCHAR D779 +ENCODING 55161 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D77A +ENCODING 55162 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D77B +ENCODING 55163 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +77 +37 +49 +76 +ENDCHAR +STARTCHAR D77C +ENCODING 55164 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FD +00 +7F +41 +7F +ENDCHAR +STARTCHAR D77D +ENCODING 55165 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FC +41 +7F +41 +7F +ENDCHAR +STARTCHAR D77E +ENCODING 55166 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +12 +72 +55 +78 +ENDCHAR +STARTCHAR D77F +ENCODING 55167 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +08 +0C +33 +40 +ENDCHAR +STARTCHAR D780 +ENCODING 55168 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +22 +22 +55 +08 +ENDCHAR +STARTCHAR D781 +ENCODING 55169 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +89 +79 +01 +FD +01 +3E +41 +3E +ENDCHAR +STARTCHAR D782 +ENCODING 55170 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +F900 +7900 +C900 +3100 +FD00 +3C00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D783 +ENCODING 55171 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +C900 +3100 +C900 +7900 +7500 +8C00 +0000 +3F00 +1E00 +6180 +ENDCHAR +STARTCHAR D784 +ENCODING 55172 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +3E +01 +3F +01 +ENDCHAR +STARTCHAR D785 +ENCODING 55173 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +7D +80 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D786 +ENCODING 55174 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +F9 +79 +C9 +31 +FD +2D +12 +3F +ENDCHAR +STARTCHAR D787 +ENCODING 55175 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +C9 +31 +C9 +79 +75 +8C +33 +0C +32 +1E +ENDCHAR +STARTCHAR D788 +ENCODING 55176 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +71 +49 +89 +49 +71 +01 +01 +ENDCHAR +STARTCHAR D789 +ENCODING 55177 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +79 +89 +79 +00 +7F +01 +01 +ENDCHAR +STARTCHAR D78A +ENCODING 55178 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +71 +89 +49 +31 +77 +09 +09 +09 +ENDCHAR +STARTCHAR D78B +ENCODING 55179 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +71 +89 +49 +31 +72 +12 +15 +10 +ENDCHAR +STARTCHAR D78C +ENCODING 55180 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +79 +89 +79 +01 +20 +20 +3F +ENDCHAR +STARTCHAR D78D +ENCODING 55181 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +71 +89 +49 +31 +47 +41 +47 +30 +ENDCHAR +STARTCHAR D78E +ENCODING 55182 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +06 +41 +46 +49 +36 +ENDCHAR +STARTCHAR D78F +ENCODING 55183 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +FD +71 +89 +49 +31 +3F +40 +7E +ENDCHAR +STARTCHAR D790 +ENCODING 55184 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +89 +79 +00 +3F +01 +3F +40 +3F +ENDCHAR +STARTCHAR D791 +ENCODING 55185 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +37 +71 +41 +71 +ENDCHAR +STARTCHAR D792 +ENCODING 55186 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +77 +79 +49 +77 +ENDCHAR +STARTCHAR D793 +ENCODING 55187 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +75 +77 +45 +77 +ENDCHAR +STARTCHAR D794 +ENCODING 55188 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +72 +72 +45 +70 +ENDCHAR +STARTCHAR D795 +ENCODING 55189 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +77 +77 +44 +77 +ENDCHAR +STARTCHAR D796 +ENCODING 55190 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +77 +75 +45 +77 +ENDCHAR +STARTCHAR D797 +ENCODING 55191 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +02 +75 +72 +45 +72 +ENDCHAR +STARTCHAR D798 +ENCODING 55192 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +79 +89 +79 +00 +3F +41 +3F +ENDCHAR +STARTCHAR D799 +ENCODING 55193 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +49 +89 +79 +00 +41 +3F +41 +3F +ENDCHAR +STARTCHAR D79A +ENCODING 55194 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +71 +89 +49 +31 +12 +72 +55 +70 +ENDCHAR +STARTCHAR D79B +ENCODING 55195 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +FD00 +0100 +7900 +8900 +7900 +0100 +0800 +1600 +6180 +ENDCHAR +STARTCHAR D79C +ENCODING 55196 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +71 +89 +49 +31 +22 +22 +55 +08 +ENDCHAR +STARTCHAR D79D +ENCODING 55197 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +FD +01 +79 +89 +79 +00 +3E +41 +3E +ENDCHAR +STARTCHAR D79E +ENCODING 55198 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +3100 +0100 +FD00 +7100 +8900 +4900 +3100 +3F00 +0200 +1F00 +2080 +ENDCHAR +STARTCHAR D79F +ENCODING 55199 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 11 1 -2 +BITMAP +7100 +0100 +F900 +7900 +8900 +6900 +1C00 +3C00 +0300 +1E00 +6180 +ENDCHAR +STARTCHAR D7A0 +ENCODING 55200 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +31 +01 +FD +71 +89 +49 +31 +7F +3F +01 +01 +ENDCHAR +STARTCHAR D7A1 +ENCODING 55201 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +79 +00 +3F +3F +20 +3F +ENDCHAR +STARTCHAR D7A2 +ENCODING 55202 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +01 +FD +71 +89 +49 +31 +7F +12 +3F +ENDCHAR +STARTCHAR D7A3 +ENCODING 55203 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 11 1 -2 +BITMAP +71 +01 +F9 +79 +89 +69 +1C +33 +0C +32 +1E +ENDCHAR +STARTCHAR F900 +ENCODING 63744 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +8900 +7F00 +FF00 +0000 +7E00 +4200 +7E00 +2400 +FF80 +ENDCHAR +STARTCHAR F901 +ENCODING 63745 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +7F00 +7F00 +4900 +7F00 +5000 +3C00 +C380 +ENDCHAR +STARTCHAR F902 +ENCODING 63746 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +0800 +7E00 +7E00 +4A00 +7E00 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR F903 +ENCODING 63747 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +FF +00 +7E +7E +7E +7E +E3 +ENDCHAR +STARTCHAR F904 +ENCODING 63748 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +5700 +9500 +7F80 +3F80 +5F00 +5100 +9F00 +9300 +ENDCHAR +STARTCHAR F905 +ENCODING 63749 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7F +49 +7F +08 +FF +89 +FF +08 +08 +ENDCHAR +STARTCHAR F906 +ENCODING 63750 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +20 +7F +41 +81 +F9 +45 +79 +45 +07 +ENDCHAR +STARTCHAR F907 +ENCODING 63751 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7C00 +FF00 +7700 +D700 +F500 +1B00 +F700 +3880 +5F00 +ENDCHAR +STARTCHAR F908 +ENCODING 63752 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7C00 +FF00 +7700 +D700 +F500 +1B00 +F700 +3880 +5F00 +ENDCHAR +STARTCHAR F909 +ENCODING 63753 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +FF00 +F500 +3500 +E900 +2B00 +FF00 +1800 +6600 +8180 +ENDCHAR +STARTCHAR F90A +ENCODING 63754 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +4300 +BF80 +0800 +7F00 +4A00 +2C00 +FF80 +ENDCHAR +STARTCHAR F90B +ENCODING 63755 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +09 +FF +CB +FF +EF +FF +DB +AD +2D +0B +ENDCHAR +STARTCHAR F90C +ENCODING 63756 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +FF +14 +62 +BD +00 +FF +2A +4B +B9 +ENDCHAR +STARTCHAR F90D +ENCODING 63757 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9700 +BA80 +D500 +B800 +BB00 +BB00 +9B00 +BB00 +B300 +9480 +ENDCHAR +STARTCHAR F90E +ENCODING 63758 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +D700 +FB00 +7800 +FF00 +BD00 +7700 +DB00 +9480 +ENDCHAR +STARTCHAR F90F +ENCODING 63759 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +4800 +AA00 +6F00 +EF00 +EB00 +DE00 +CF80 +ENDCHAR +STARTCHAR F910 +ENCODING 63760 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +FF00 +FF00 +6A00 +CF00 +FF00 +4F00 +EA00 +CF80 +ENDCHAR +STARTCHAR F911 +ENCODING 63761 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5500 +EF00 +EF00 +ED00 +E700 +5F80 +6200 +6B00 +9280 +ENDCHAR +STARTCHAR F912 +ENCODING 63762 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +5500 +EF00 +3500 +6F00 +FF80 +E600 +4D00 +5480 +4400 +ENDCHAR +STARTCHAR F913 +ENCODING 63763 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +7F00 +9500 +B780 +1500 +BF00 +BD00 +DF80 +BF80 +ENDCHAR +STARTCHAR F914 +ENCODING 63764 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +9E00 +D700 +9E00 +FF80 +0800 +7F00 +2E00 +4980 +8800 +ENDCHAR +STARTCHAR F915 +ENCODING 63765 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +5F00 +1200 +AA00 +8E00 +3180 +5F00 +9100 +9F00 +9100 +ENDCHAR +STARTCHAR F916 +ENCODING 63766 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +4F00 +FA00 +D600 +CF00 +5980 +4F00 +B100 +AF00 +9100 +ENDCHAR +STARTCHAR F917 +ENCODING 63767 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +5A00 +5A00 +EE00 +7180 +7F00 +5100 +9F00 +1100 +ENDCHAR +STARTCHAR F918 +ENCODING 63768 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +8800 +5F00 +AA00 +A400 +7B00 +9F00 +9F00 +9100 +ENDCHAR +STARTCHAR F919 +ENCODING 63769 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +6700 +F500 +FE00 +F300 +B580 +9F00 +F900 +FF00 +9900 +ENDCHAR +STARTCHAR F91A +ENCODING 63770 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +C700 +E900 +D600 +E700 +F980 +BF00 +B900 +9F00 +6900 +ENDCHAR +STARTCHAR F91B +ENCODING 63771 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FA00 +AA00 +7A00 +5200 +FA00 +FA00 +FA00 +AA80 +DB80 +ENDCHAR +STARTCHAR F91C +ENCODING 63772 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +17 +F5 +D5 +D5 +B7 +B5 +E7 +64 +C4 +ENDCHAR +STARTCHAR F91D +ENCODING 63773 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +5B +6D +DB +5B +DF +EF +6F +6D +57 +65 +ENDCHAR +STARTCHAR F91E +ENCODING 63774 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5B +5B +ED +DB +A5 +6F +6F +97 +A5 +ENDCHAR +STARTCHAR F91F +ENCODING 63775 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F700 +9900 +F700 +FF00 +EF00 +BF00 +AF00 +8900 +ENDCHAR +STARTCHAR F920 +ENCODING 63776 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +4300 +FB80 +DA80 +7900 +7E00 +7E00 +7F80 +7F00 +B500 +ENDCHAR +STARTCHAR F921 +ENCODING 63777 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +0000 +7E00 +7D00 +7D00 +B500 +BD00 +9380 +FF80 +ENDCHAR +STARTCHAR F922 +ENCODING 63778 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BA00 +7380 +BC00 +7800 +3B80 +4000 +BF00 +AB00 +BF80 +ENDCHAR +STARTCHAR F923 +ENCODING 63779 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F400 +A780 +F800 +F700 +F000 +7F00 +5500 +FF80 +ENDCHAR +STARTCHAR F924 +ENCODING 63780 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +5A00 +DF80 +5C00 +6B80 +DC00 +BF00 +5B00 +5B00 +7F80 +ENDCHAR +STARTCHAR F925 +ENCODING 63781 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4400 +FF00 +4100 +7100 +4A00 +CA00 +4A00 +4200 +FF80 +ENDCHAR +STARTCHAR F926 +ENCODING 63782 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D500 +B500 +BF00 +DB00 +BF00 +C000 +BF00 +BF00 +BF80 +7580 +ENDCHAR +STARTCHAR F927 +ENCODING 63783 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D00 +4D00 +FF00 +FF00 +FF00 +E000 +5F00 +7F00 +FF80 +3580 +ENDCHAR +STARTCHAR F928 +ENCODING 63784 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9780 +BD00 +BD00 +CD00 +BD00 +DC80 +D500 +EC00 +ENDCHAR +STARTCHAR F929 +ENCODING 63785 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +27 +F5 +95 +F7 +F5 +B7 +A5 +F9 +DB +ENDCHAR +STARTCHAR F92A +ENCODING 63786 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +84 +5F +21 +9F +61 +1F +65 +A6 +AF +B1 +ENDCHAR +STARTCHAR F92B +ENCODING 63787 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A400 +4F00 +D100 +CF00 +5100 +AF00 +B500 +3200 +3500 +D880 +ENDCHAR +STARTCHAR F92C +ENCODING 63788 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2780 +F500 +9500 +F500 +9500 +F500 +D480 +A480 +F700 +CC00 +ENDCHAR +STARTCHAR F92D +ENCODING 63789 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +2A +4A +6B +BD +2C +4B +89 +08 +ENDCHAR +STARTCHAR F92E +ENCODING 63790 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8C00 +5400 +2300 +5E80 +0000 +7F00 +8900 +8B00 +0800 +ENDCHAR +STARTCHAR F92F +ENCODING 63791 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BB +DB +77 +8C +FF +FF +12 +62 +C6 +ENDCHAR +STARTCHAR F930 +ENCODING 63792 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +8700 +FF00 +BD00 +AF00 +7F80 +AD00 +BF00 +AD00 +D300 +ENDCHAR +STARTCHAR F931 +ENCODING 63793 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +5E00 +DF00 +5F00 +DF00 +9A80 +6000 +5F00 +5100 +5F00 +ENDCHAR +STARTCHAR F932 +ENCODING 63794 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4700 +9F00 +DD00 +AF00 +6F00 +6D00 +AF00 +B700 +3F80 +ENDCHAR +STARTCHAR F933 +ENCODING 63795 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1E00 +FF00 +9500 +9D00 +8000 +BE00 +BE00 +8000 +BF00 +FF80 +ENDCHAR +STARTCHAR F934 +ENCODING 63796 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +1100 +7E00 +1400 +FF80 +1800 +6200 +BC00 +2100 +3F00 +ENDCHAR +STARTCHAR F935 +ENCODING 63797 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +1000 +FF00 +DF00 +BE00 +BE00 +BE00 +B500 +FF80 +ENDCHAR +STARTCHAR F936 +ENCODING 63798 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +0E +FF +B1 +BF +FF +BF +FF +91 +E3 +ENDCHAR +STARTCHAR F937 +ENCODING 63799 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +A900 +F600 +4700 +B980 +CF00 +C900 +EF00 +8900 +ENDCHAR +STARTCHAR F938 +ENCODING 63800 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +0C00 +EF00 +E600 +AF80 +F900 +CF00 +ENDCHAR +STARTCHAR F939 +ENCODING 63801 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7800 +FF00 +7F00 +7F00 +A500 +FE80 +4200 +7E00 +7E00 +ENDCHAR +STARTCHAR F93A +ENCODING 63802 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +FE00 +AD80 +FF00 +D000 +7E00 +7E00 +7F00 +7F00 +AF00 +ENDCHAR +STARTCHAR F93B +ENCODING 63803 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF00 +4E00 +8200 +FF80 +B300 +AB00 +AD00 +F480 +8C00 +ENDCHAR +STARTCHAR F93C +ENCODING 63804 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +0F00 +0E00 +E200 +FF80 +F300 +EA00 +ED00 +DC80 +4C00 +ENDCHAR +STARTCHAR F93D +ENCODING 63805 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +6F00 +AE00 +4200 +7F80 +F500 +EE00 +ED00 +D480 +4C00 +ENDCHAR +STARTCHAR F93E +ENCODING 63806 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3C00 +2400 +3C00 +FF00 +4800 +3600 +6A00 +9100 +ENDCHAR +STARTCHAR F93F +ENCODING 63807 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +AE00 +E200 +4F80 +EB00 +EB00 +E500 +7A80 +C400 +ENDCHAR +STARTCHAR F940 +ENCODING 63808 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9400 +FF00 +FF00 +A400 +A500 +BE00 +BC80 +E700 +ENDCHAR +STARTCHAR F941 +ENCODING 63809 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +C600 +1900 +FE80 +C000 +1F00 +DB00 +DF00 +BB00 +DB00 +9B00 +ENDCHAR +STARTCHAR F942 +ENCODING 63810 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +F700 +F700 +F800 +FE00 +FE80 +B700 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR F943 +ENCODING 63811 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +0800 +7E00 +FF00 +2400 +FF80 +2400 +4400 +8400 +ENDCHAR +STARTCHAR F944 +ENCODING 63812 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +EA00 +FF00 +FF00 +0F00 +FF00 +FF00 +FF80 +BF00 +ENDCHAR +STARTCHAR F945 +ENCODING 63813 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF00 +6F00 +F700 +F700 +F780 +B700 +FF00 +7E00 +7E00 +FF80 +ENDCHAR +STARTCHAR F946 +ENCODING 63814 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +8900 +2800 +7E00 +4800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR F947 +ENCODING 63815 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +7E00 +A200 +3E00 +FF80 +4400 +F700 +9D00 +7700 +ENDCHAR +STARTCHAR F948 +ENCODING 63816 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +AF00 +F900 +B600 +EF00 +B880 +EF00 +2900 +AF00 +9900 +ENDCHAR +STARTCHAR F949 +ENCODING 63817 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +FF +EF +89 +66 +7F +7F +49 +7F +ENDCHAR +STARTCHAR F94A +ENCODING 63818 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF00 +FF00 +FF00 +0800 +7F00 +FF80 +ENDCHAR +STARTCHAR F94B +ENCODING 63819 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +A900 +FF00 +9E00 +BF00 +FF80 +B400 +7B00 +ENDCHAR +STARTCHAR F94C +ENCODING 63820 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F00 +F500 +5F00 +DF00 +D500 +7F80 +4A00 +4600 +7900 +ENDCHAR +STARTCHAR F94D +ENCODING 63821 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8100 +7E00 +3F00 +A100 +BF00 +2500 +7F80 +A400 +CA00 +F180 +ENDCHAR +STARTCHAR F94E +ENCODING 63822 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +BF00 +6080 +BF00 +BF80 +3F00 +7E80 +B480 +BE80 +D500 +ENDCHAR +STARTCHAR F94F +ENCODING 63823 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +7F +89 +7F +54 +3A +FF +6A +89 +ENDCHAR +STARTCHAR F950 +ENCODING 63824 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +AF00 +BF80 +4F00 +BF00 +F500 +FF80 +EA00 +C600 +5900 +ENDCHAR +STARTCHAR F951 +ENCODING 63825 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +A200 +DF00 +DB00 +BF00 +B900 +D900 +9F80 +9000 +ENDCHAR +STARTCHAR F952 +ENCODING 63826 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +A4 +F4 +AF +E5 +F5 +D5 +F5 +F9 +49 +4B +ENDCHAR +STARTCHAR F953 +ENCODING 63827 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +E4 +A4 +AF +E5 +A5 +E5 +A5 +A9 +A9 +F3 +ENDCHAR +STARTCHAR F954 +ENCODING 63828 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +3F80 +8000 +7F00 +2B00 +3F00 +4300 +9C00 +BF80 +9E00 +2580 +ENDCHAR +STARTCHAR F955 +ENCODING 63829 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +BF00 +4800 +3F80 +1F00 +7800 +7E00 +B200 +8E00 +B180 +ENDCHAR +STARTCHAR F956 +ENCODING 63830 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +DF00 +4400 +FF80 +5B80 +C800 +7F00 +5A00 +4E00 +7180 +ENDCHAR +STARTCHAR F957 +ENCODING 63831 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +BF00 +C400 +5F80 +FB80 +4400 +EF00 +FA00 +CE00 +5180 +ENDCHAR +STARTCHAR F958 +ENCODING 63832 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +0800 +7F00 +FF80 +2700 +FE00 +5400 +1C00 +E300 +ENDCHAR +STARTCHAR F959 +ENCODING 63833 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +C400 +DF80 +CB00 +B800 +DF00 +AA00 +8E00 +B180 +ENDCHAR +STARTCHAR F95A +ENCODING 63834 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +DF80 +FF00 +DB00 +1F00 +DF00 +DF00 +BF00 +DF00 +B980 +ENDCHAR +STARTCHAR F95B +ENCODING 63835 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +FF00 +9600 +7500 +8880 +7E00 +FF00 +FF80 +0800 +1000 +ENDCHAR +STARTCHAR F95C +ENCODING 63836 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +9E00 +D700 +9E00 +FF80 +0800 +7F00 +2E00 +4980 +8800 +ENDCHAR +STARTCHAR F95D +ENCODING 63837 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +EA00 +1F80 +EE00 +E400 +1F80 +E800 +FF00 +B900 +EF00 +A900 +ENDCHAR +STARTCHAR F95E +ENCODING 63838 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +5200 +4A00 +4A00 +FF80 +4200 +4200 +8200 +8600 +ENDCHAR +STARTCHAR F95F +ENCODING 63839 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +EA80 +7D00 +7F00 +5500 +FF80 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR F960 +ENCODING 63840 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +FF00 +9500 +6200 +5500 +8880 +3000 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR F961 +ENCODING 63841 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9100 +7600 +5A00 +9500 +B900 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR F962 +ENCODING 63842 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +7F00 +7F00 +0000 +2400 +FF00 +FF80 +2600 +C100 +ENDCHAR +STARTCHAR F963 +ENCODING 63843 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +2400 +2500 +E700 +2400 +2400 +6400 +A400 +2480 +2700 +ENDCHAR +STARTCHAR F964 +ENCODING 63844 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0100 +FF00 +9F80 +EE00 +BF00 +B580 +BF00 +F500 +9F00 +ENDCHAR +STARTCHAR F965 +ENCODING 63845 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +7F80 +5F00 +9500 +9F00 +9F00 +5400 +4C00 +5600 +6180 +ENDCHAR +STARTCHAR F966 +ENCODING 63846 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5000 +DF80 +9F00 +7100 +5F00 +9F00 +9F00 +6A00 +4E00 +7180 +ENDCHAR +STARTCHAR F967 +ENCODING 63847 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +18 +2C +4B +89 +08 +08 +08 +ENDCHAR +STARTCHAR F968 +ENCODING 63848 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +8900 +4500 +8900 +AB00 +2B00 +6C80 +A800 +9900 +AF00 +ENDCHAR +STARTCHAR F969 +ENCODING 63849 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +FC00 +FF80 +FD00 +FD00 +FB00 +FA00 +5200 +2500 +D480 +ENDCHAR +STARTCHAR F96A +ENCODING 63850 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +FF +91 +A5 +1A +D3 +3C +6A +89 +ENDCHAR +STARTCHAR F96B +ENCODING 63851 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +7E00 +4200 +9D00 +F700 +6A00 +B580 +5B00 +6C00 +7000 +ENDCHAR +STARTCHAR F96C +ENCODING 63852 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +2400 +7F00 +FF80 +2A00 +7F00 +8880 +FF00 +ENDCHAR +STARTCHAR F96D +ENCODING 63853 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +2A +4B +9C +30 +FE +7E +7E +7E +41 +ENDCHAR +STARTCHAR F96E +ENCODING 63854 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +5200 +FF80 +5E00 +7F00 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR F96F +ENCODING 63855 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +F100 +1F80 +F100 +F100 +0F00 +EA00 +EA80 +B300 +ENDCHAR +STARTCHAR F970 +ENCODING 63856 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A600 +6A00 +9A80 +E980 +4000 +FF00 +6500 +D600 +C700 +5980 +ENDCHAR +STARTCHAR F971 +ENCODING 63857 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7F +40 +7F +40 +7F +6E +A6 +AB +F1 +ENDCHAR +STARTCHAR F972 +ENCODING 63858 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +4400 +3F00 +A500 +8400 +0C00 +4C00 +5400 +B480 +A700 +ENDCHAR +STARTCHAR F973 +ENCODING 63859 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +F100 +6080 +7F00 +4000 +DF00 +5100 +5F00 +9100 +ENDCHAR +STARTCHAR F974 +ENCODING 63860 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +2C00 +1000 +FF80 +2000 +7F00 +A100 +3F00 +2100 +ENDCHAR +STARTCHAR F975 +ENCODING 63861 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E000 +5F00 +7100 +DF00 +C400 +4D00 +5480 +EC00 +ENDCHAR +STARTCHAR F976 +ENCODING 63862 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E700 +E900 +D600 +E600 +D980 +EF00 +E900 +AF00 +0900 +ENDCHAR +STARTCHAR F977 +ENCODING 63863 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +7E00 +7E00 +0000 +FF00 +A500 +2400 +6480 +C700 +ENDCHAR +STARTCHAR F978 +ENCODING 63864 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +08 +FF +ED +AB +EF +D5 +89 +8B +ENDCHAR +STARTCHAR F979 +ENCODING 63865 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +BF80 +4000 +1F00 +2100 +5F00 +4400 +9600 +A500 +C880 +ENDCHAR +STARTCHAR F97A +ENCODING 63866 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5E00 +1B00 +9A80 +5280 +E600 +8800 +FF80 +1800 +6E00 +8980 +ENDCHAR +STARTCHAR F97B +ENCODING 63867 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F00 +EF00 +EF00 +4000 +FF80 +4F00 +EF00 +CF00 +5F00 +5F80 +ENDCHAR +STARTCHAR F97C +ENCODING 63868 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +7E +42 +7E +42 +7F +4A +4C +7E +E1 +ENDCHAR +STARTCHAR F97D +ENCODING 63869 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +1F80 +E000 +EF00 +1100 +EF00 +ED00 +AD00 +F480 +A400 +ENDCHAR +STARTCHAR F97E +ENCODING 63870 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +FF00 +7E00 +7E00 +7E00 +FF00 +FF80 +ENDCHAR +STARTCHAR F97F +ENCODING 63871 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +FA +B2 +FF +FB +FB +FB +FB +EB +FD +DF +ENDCHAR +STARTCHAR F980 +ENCODING 63872 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +FC +84 +84 +FC +20 +FE +02 +FE +02 +ENDCHAR +STARTCHAR F981 +ENCODING 63873 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +10 +FF +22 +24 +34 +0C +33 +C1 +ENDCHAR +STARTCHAR F982 +ENCODING 63874 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +8800 +FF00 +CF00 +D500 +DF00 +DF00 +EB00 +FF80 +ENDCHAR +STARTCHAR F983 +ENCODING 63875 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 10 0 -1 +BITMAP +2400 +2780 +7800 +2980 +3700 +3580 +5580 +5500 +5580 +BE40 +ENDCHAR +STARTCHAR F984 +ENCODING 63876 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8800 +4F00 +3F80 +BD00 +AF00 +3500 +7F00 +AE00 +DD00 +EE80 +ENDCHAR +STARTCHAR F985 +ENCODING 63877 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +5F00 +9000 +DF00 +BB00 +BF00 +BF00 +DF00 +2900 +ENDCHAR +STARTCHAR F986 +ENCODING 63878 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +F7 +F7 +F7 +81 +BD +BD +BD +BD +81 +ENDCHAR +STARTCHAR F987 +ENCODING 63879 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +DF00 +F480 +EF80 +CF00 +EF00 +FA00 +F780 +7F80 +ENDCHAR +STARTCHAR F988 +ENCODING 63880 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +9900 +8800 +FF00 +FF00 +FF00 +A500 +BE80 +E700 +ENDCHAR +STARTCHAR F989 +ENCODING 63881 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1400 +E700 +FB00 +5500 +BF00 +6600 +C980 +3A00 +4C00 +9B00 +ENDCHAR +STARTCHAR F98A +ENCODING 63882 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +10 +10 +FF +11 +11 +11 +21 +21 +41 +86 +ENDCHAR +STARTCHAR F98B +ENCODING 63883 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F700 +FF00 +AB00 +D680 +BF00 +A100 +BF00 +A100 +ENDCHAR +STARTCHAR F98C +ENCODING 63884 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +F700 +FF00 +AB00 +D680 +8800 +A700 +A800 +FF80 +ENDCHAR +STARTCHAR F98D +ENCODING 63885 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4500 +F700 +6A80 +F700 +FB00 +BF80 +FF80 +EF00 +5480 +4400 +ENDCHAR +STARTCHAR F98E +ENCODING 63886 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +7F00 +C800 +8800 +7F00 +4800 +FF80 +0800 +0800 +0800 +ENDCHAR +STARTCHAR F98F +ENCODING 63887 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +4D00 +DF80 +EE00 +F580 +5D00 +5B80 +7F80 +5100 +6100 +ENDCHAR +STARTCHAR F990 +ENCODING 63888 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5A00 +DF00 +5A00 +E780 +DA80 +FA80 +DD00 +A900 +A300 +BC80 +ENDCHAR +STARTCHAR F991 +ENCODING 63889 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +9B00 +D780 +AA00 +9A00 +D500 +9880 +A100 +AD00 +AA80 +ENDCHAR +STARTCHAR F992 +ENCODING 63890 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +A200 +6F80 +2F00 +AB00 +0F00 +6F00 +AF80 +A200 +DF80 +ENDCHAR +STARTCHAR F993 +ENCODING 63891 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +E400 +DF00 +DE80 +5480 +5F00 +BD00 +A480 +8400 +ENDCHAR +STARTCHAR F994 +ENCODING 63892 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2200 +DF80 +8F00 +AB00 +CF00 +BF00 +9F80 +D200 +3200 +2F80 +ENDCHAR +STARTCHAR F995 +ENCODING 63893 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0600 +7C00 +FF00 +6C00 +8F80 +7800 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR F996 +ENCODING 63894 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +A400 +DF00 +7F00 +FF00 +E600 +FD00 +D480 +4400 +ENDCHAR +STARTCHAR F997 +ENCODING 63895 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E900 +B600 +BB00 +F680 +BF80 +F680 +F680 +BB00 +2A00 +3200 +ENDCHAR +STARTCHAR F998 +ENCODING 63896 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +F700 +FF80 +BD00 +FF00 +7E00 +7E00 +7E00 +FF80 +0800 +ENDCHAR +STARTCHAR F999 +ENCODING 63897 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +C400 +3F00 +DF00 +1F00 +DF00 +7F80 +4400 +BF80 +ENDCHAR +STARTCHAR F99A +ENCODING 63898 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F80 +9F00 +5500 +1F00 +DF00 +4400 +7F80 +C400 +BF80 +ENDCHAR +STARTCHAR F99B +ENCODING 63899 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +7F80 +A400 +EF00 +5D00 +EF00 +E600 +ED00 +7480 +C400 +ENDCHAR +STARTCHAR F99C +ENCODING 63900 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +01 +F9 +45 +7D +4D +F5 +B5 +25 +41 +83 +ENDCHAR +STARTCHAR F99D +ENCODING 63901 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +2A +4B +9C +30 +C8 +FF +11 +31 +C6 +ENDCHAR +STARTCHAR F99E +ENCODING 63902 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +1F +D5 +D5 +DF +D5 +D7 +D9 +1F +11 +ENDCHAR +STARTCHAR F99F +ENCODING 63903 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4500 +7500 +9500 +D500 +6100 +8300 +4500 +9500 +9480 +ENDCHAR +STARTCHAR F9A0 +ENCODING 63904 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F900 +4500 +F500 +F500 +CB00 +0800 +FF80 +6600 +BB00 +6180 +ENDCHAR +STARTCHAR F9A1 +ENCODING 63905 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +EE00 +F100 +1F80 +F100 +F100 +0F00 +EA00 +EA80 +B300 +ENDCHAR +STARTCHAR F9A2 +ENCODING 63906 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +BC00 +FF00 +BF00 +FF80 +9500 +BF00 +B600 +D500 +ENDCHAR +STARTCHAR F9A3 +ENCODING 63907 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +7F00 +8180 +7E00 +0200 +6900 +A300 +BC80 +ENDCHAR +STARTCHAR F9A4 +ENCODING 63908 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +4A00 +FF00 +6080 +7F00 +4100 +C600 +6B00 +6980 +AE00 +ENDCHAR +STARTCHAR F9A5 +ENCODING 63909 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +E600 +8900 +FE80 +BF00 +FF00 +4000 +4A00 +9B00 +9480 +ENDCHAR +STARTCHAR F9A6 +ENCODING 63910 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +FF80 +FF00 +BF00 +FF80 +BF00 +B600 +D500 +ENDCHAR +STARTCHAR F9A7 +ENCODING 63911 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B500 +D500 +DF00 +EB00 +5F00 +C000 +DF00 +5F00 +5F80 +E580 +ENDCHAR +STARTCHAR F9A8 +ENCODING 63912 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +1800 +2400 +4300 +BD80 +0000 +7E00 +1100 +1200 +1000 +ENDCHAR +STARTCHAR F9A9 +ENCODING 63913 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +99 +A5 +FF +BF +93 +97 +FF +81 +ENDCHAR +STARTCHAR F9AA +ENCODING 63914 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +EA80 +7D00 +7F00 +5500 +FF80 +FF00 +0800 +1800 +ENDCHAR +STARTCHAR F9AB +ENCODING 63915 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +6F80 +9200 +FF00 +0F00 +FF00 +5F00 +7500 +4880 +ENDCHAR +STARTCHAR F9AC +ENCODING 63916 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +4A00 +F100 +EE80 +C000 +5F00 +4900 +4900 +4B00 +4800 +ENDCHAR +STARTCHAR F9AD +ENCODING 63917 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +EA00 +4900 +5F00 +E080 +5F00 +6900 +8900 +0B00 +0800 +ENDCHAR +STARTCHAR F9AE +ENCODING 63918 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +B700 +DB00 +6600 +9D00 +FF00 +8080 +7E00 +7E00 +0A00 +FF00 +ENDCHAR +STARTCHAR F9AF +ENCODING 63919 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +A400 +AA00 +E900 +5E80 +E000 +7F00 +C500 +4700 +8400 +ENDCHAR +STARTCHAR F9B0 +ENCODING 63920 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F400 +A600 +A900 +FE80 +A000 +FF00 +A500 +E500 +A700 +2400 +ENDCHAR +STARTCHAR F9B1 +ENCODING 63921 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4600 +6600 +9900 +EF80 +4000 +FF00 +D500 +E500 +7500 +C400 +ENDCHAR +STARTCHAR F9B2 +ENCODING 63922 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7F00 +FF00 +EE80 +7E00 +6600 +BD80 +7E00 +1100 +1600 +ENDCHAR +STARTCHAR F9B3 +ENCODING 63923 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +EE80 +6E00 +B500 +4A00 +FF00 +2900 +FF80 +ENDCHAR +STARTCHAR F9B4 +ENCODING 63924 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +4F80 +A400 +9F00 +6F00 +F900 +5F00 +5F00 +7F00 +4880 +ENDCHAR +STARTCHAR F9B5 +ENCODING 63925 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +79 +53 +9B +AB +BB +8B +93 +91 +A3 +ENDCHAR +STARTCHAR F9B6 +ENCODING 63926 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E600 +1F00 +1F00 +FF00 +E000 +FF80 +EF00 +EF00 +C900 +5F80 +ENDCHAR +STARTCHAR F9B7 +ENCODING 63927 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F600 +4F00 +EF00 +AF00 +A000 +AF80 +9F00 +EF00 +E500 +9F80 +ENDCHAR +STARTCHAR F9B8 +ENCODING 63928 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +FF00 +4300 +FF80 +EF00 +0A80 +FB00 +E500 +DB00 +4480 +ENDCHAR +STARTCHAR F9B9 +ENCODING 63929 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +1400 +7700 +7700 +FF80 +0800 +A500 +A300 +BC80 +ENDCHAR +STARTCHAR F9BA +ENCODING 63930 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +02 +04 +08 +08 +08 +08 +08 +30 +ENDCHAR +STARTCHAR F9BB +ENCODING 63931 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +7F80 +6D00 +BF00 +A180 +9E00 +9E00 +9600 +A500 +A880 +ENDCHAR +STARTCHAR F9BC +ENCODING 63932 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +FE80 +2500 +7E00 +C380 +3E00 +3E00 +6E00 +9100 +ENDCHAR +STARTCHAR F9BD +ENCODING 63933 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +81 +FF +88 +F9 +9E +AA +A9 +59 +ENDCHAR +STARTCHAR F9BE +ENCODING 63934 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +DD00 +E500 +4100 +F900 +6500 +D780 +CF00 +4100 +4100 +ENDCHAR +STARTCHAR F9BF +ENCODING 63935 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4100 +9E00 +D700 +9E00 +FF80 +0800 +7F00 +2E00 +4980 +8800 +ENDCHAR +STARTCHAR F9C0 +ENCODING 63936 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +5F80 +FB00 +FF00 +F180 +5F00 +5F00 +AE00 +9500 +AC80 +ENDCHAR +STARTCHAR F9C1 +ENCODING 63937 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +FF00 +EB00 +5F00 +7280 +DE00 +5E00 +9700 +AC80 +ENDCHAR +STARTCHAR F9C2 +ENCODING 63938 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +FF00 +5700 +FF00 +A600 +D980 +6E00 +7C00 +6000 +ENDCHAR +STARTCHAR F9C3 +ENCODING 63939 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +2B00 +9F00 +3E80 +F200 +5E00 +6500 +CC00 +BF80 +ENDCHAR +STARTCHAR F9C4 +ENCODING 63940 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4800 +F700 +A700 +F100 +F700 +9700 +F700 +F700 +9880 +B700 +ENDCHAR +STARTCHAR F9C5 +ENCODING 63941 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +3C +FF +08 +7F +7F +3E +7F +ENDCHAR +STARTCHAR F9C6 +ENCODING 63942 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +A000 +C000 +DF00 +AA00 +AA00 +EA00 +9280 +A300 +ENDCHAR +STARTCHAR F9C7 +ENCODING 63943 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +41 +DB +D7 +FB +A3 +53 +FB +23 +69 +F3 +ENDCHAR +STARTCHAR F9C8 +ENCODING 63944 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +4500 +E900 +4900 +DF80 +E900 +4900 +4A00 +4A00 +7F80 +ENDCHAR +STARTCHAR F9C9 +ENCODING 63945 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +48 +5B +FB +5B +DB +FB +5B +7B +4A +52 +ENDCHAR +STARTCHAR F9CA +ENCODING 63946 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8400 +7F00 +0A00 +9700 +7900 +1A00 +5A00 +5A00 +AA80 +AB00 +ENDCHAR +STARTCHAR F9CB +ENCODING 63947 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +8F +7B +3D +A7 +1F +65 +5F +9F +A1 +ENDCHAR +STARTCHAR F9CC +ENCODING 63948 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF80 +4A00 +5F00 +E080 +5600 +7600 +9600 +1680 +2580 +ENDCHAR +STARTCHAR F9CD +ENCODING 63949 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +2F +E5 +95 +FB +00 +7F +7F +7F +41 +ENDCHAR +STARTCHAR F9CE +ENCODING 63950 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0400 +FF00 +4A00 +9F00 +E080 +B600 +B600 +B600 +F680 +2500 +ENDCHAR +STARTCHAR F9CF +ENCODING 63951 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +6F00 +C500 +6500 +FF80 +4900 +E900 +E900 +C900 +5F80 +ENDCHAR +STARTCHAR F9D0 +ENCODING 63952 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +D000 +EF80 +FF00 +6900 +DF00 +5F00 +F900 +4F00 +E500 +9880 +ENDCHAR +STARTCHAR F9D1 +ENCODING 63953 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +0000 +0000 +2400 +2200 +4200 +C100 +8080 +ENDCHAR +STARTCHAR F9D2 +ENCODING 63954 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +DA00 +5B00 +AA00 +FF80 +D300 +AB00 +D200 +EA00 +B580 +C900 +ENDCHAR +STARTCHAR F9D3 +ENCODING 63955 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E400 +BF00 +C400 +DF80 +AA80 +B300 +E400 +9F00 +8400 +BF80 +ENDCHAR +STARTCHAR F9D4 +ENCODING 63956 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4C00 +5300 +5E80 +A000 +BF00 +6B00 +6B00 +7F00 +6B00 +6B00 +ENDCHAR +STARTCHAR F9D5 +ENCODING 63957 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8900 +FF00 +1800 +6600 +BD80 +0000 +7F00 +7F00 +9500 +9700 +ENDCHAR +STARTCHAR F9D6 +ENCODING 63958 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +8C00 +5300 +3E80 +8000 +BF00 +2B00 +6B00 +7F00 +AB00 +AB00 +ENDCHAR +STARTCHAR F9D7 +ENCODING 63959 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +E600 +4900 +FE80 +EF00 +F680 +F680 +EF00 +5680 +5700 +ENDCHAR +STARTCHAR F9D8 +ENCODING 63960 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +9F00 +C500 +7F80 +9F00 +8400 +7F00 +7F80 +4400 +4400 +ENDCHAR +STARTCHAR F9D9 +ENCODING 63961 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4000 +5F80 +DF00 +FB00 +DF00 +4400 +5F80 +4E00 +7580 +4400 +ENDCHAR +STARTCHAR F9DA +ENCODING 63962 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +FF +24 +FF +FF +08 +FF +6E +89 +08 +ENDCHAR +STARTCHAR F9DB +ENCODING 63963 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9100 +7600 +5A00 +9500 +B900 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR F9DC +ENCODING 63964 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +AF00 +D600 +D980 +AE00 +B400 +DF00 +BF00 +8400 +BF80 +ENDCHAR +STARTCHAR F9DD +ENCODING 63965 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +31 +C5 +25 +F5 +65 +55 +B5 +A5 +21 +23 +ENDCHAR +STARTCHAR F9DE +ENCODING 63966 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +0800 +7F00 +4900 +7F00 +2800 +1000 +2C00 +C380 +ENDCHAR +STARTCHAR F9DF +ENCODING 63967 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +A800 +DF00 +AF00 +CF00 +CF00 +A600 +3F80 +ENDCHAR +STARTCHAR F9E0 +ENCODING 63968 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +7E +7E +42 +7E +20 +7F +B5 +49 +13 +ENDCHAR +STARTCHAR F9E1 +ENCODING 63969 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +1400 +6A00 +BF80 +0400 +0800 +FF00 +0800 +3800 +ENDCHAR +STARTCHAR F9E2 +ENCODING 63970 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +15 +E5 +F5 +75 +AB +08 +FF +18 +6E +89 +ENDCHAR +STARTCHAR F9E3 +ENCODING 63971 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +9F00 +6100 +9F00 +A000 +2900 +6B00 +AC00 +A880 +AF00 +ENDCHAR +STARTCHAR F9E4 +ENCODING 63972 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +5500 +5F00 +F500 +5F00 +4400 +7F00 +8400 +1F80 +ENDCHAR +STARTCHAR F9E5 +ENCODING 63973 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +7F80 +C900 +F300 +7B00 +D300 +FB00 +B500 +9100 +9300 +ENDCHAR +STARTCHAR F9E6 +ENCODING 63974 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF00 +FF00 +4800 +EA00 +FF00 +DF00 +5F00 +5200 +4F80 +ENDCHAR +STARTCHAR F9E7 +ENCODING 63975 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +0000 +7F00 +4900 +7F00 +FF00 +FF80 +2900 +FE00 +6180 +ENDCHAR +STARTCHAR F9E8 +ENCODING 63976 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F00 +5500 +F500 +3F00 +7500 +FF00 +FF00 +4400 +4400 +5F80 +ENDCHAR +STARTCHAR F9E9 +ENCODING 63977 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4900 +7E00 +4900 +7E00 +0800 +7F00 +0800 +FF80 +ENDCHAR +STARTCHAR F9EA +ENCODING 63978 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2500 +F500 +F780 +FA00 +F700 +4600 +F700 +F600 +9780 +B400 +ENDCHAR +STARTCHAR F9EB +ENCODING 63979 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +FF80 +FF00 +9C00 +FF00 +B000 +DE00 +9E00 +A000 +FF80 +ENDCHAR +STARTCHAR F9EC +ENCODING 63980 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +49 +BF +A4 +3F +6D +BB +CD +9B +ENDCHAR +STARTCHAR F9ED +ENCODING 63981 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF00 +2400 +1800 +3600 +C180 +7E00 +4200 +7E00 +4200 +ENDCHAR +STARTCHAR F9EE +ENCODING 63982 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5500 +4D00 +FF80 +CE00 +D580 +5900 +7B80 +CF80 +B100 +A100 +ENDCHAR +STARTCHAR F9EF +ENCODING 63983 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1500 +CD00 +5F80 +4E00 +D580 +5900 +7B80 +4F80 +9100 +2100 +ENDCHAR +STARTCHAR F9F0 +ENCODING 63984 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +FF80 +2400 +F700 +F700 +F700 +A900 +FF00 +E900 +B900 +B700 +ENDCHAR +STARTCHAR F9F1 +ENCODING 63985 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +F500 +AD00 +DF80 +CE00 +B580 +BD00 +DB80 +8F80 +9100 +A100 +ENDCHAR +STARTCHAR F9F2 +ENCODING 63986 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4D00 +ED00 +BF80 +EA00 +F580 +ED00 +F780 +9B80 +9900 +9100 +ENDCHAR +STARTCHAR F9F3 +ENCODING 63987 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2B00 +F700 +EF80 +F700 +FA80 +A500 +BB80 +E780 +B500 +F900 +ENDCHAR +STARTCHAR F9F4 +ENCODING 63988 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4200 +4200 +FF00 +4600 +6600 +DB00 +DB00 +CA80 +4200 +4200 +ENDCHAR +STARTCHAR F9F5 +ENCODING 63989 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +9200 +5200 +3F00 +9200 +BA00 +3F00 +5700 +9A80 +9200 +9200 +ENDCHAR +STARTCHAR F9F6 +ENCODING 63990 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +EF80 +D000 +EF00 +AF00 +A000 +FF80 +D680 +FF80 +9680 +ENDCHAR +STARTCHAR F9F7 +ENCODING 63991 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +0800 +FF00 +0000 +4200 +2200 +2400 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR F9F8 +ENCODING 63992 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +AA00 +0800 +FF00 +0000 +2200 +2400 +2400 +FF80 +ENDCHAR +STARTCHAR F9F9 +ENCODING 63993 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +DF80 +E000 +4900 +E900 +6900 +DA00 +CA00 +4200 +5F80 +ENDCHAR +STARTCHAR F9FA +ENCODING 63994 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +A500 +A500 +A400 +FF80 +2400 +E600 +A600 +A900 +A900 +B080 +ENDCHAR +STARTCHAR F9FB +ENCODING 63995 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +1000 +3F00 +7600 +A800 +7900 +CA00 +4A00 +5400 +6200 +C180 +ENDCHAR +STARTCHAR F9FC +ENCODING 63996 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +CA00 +1F00 +F600 +FF80 +0200 +DF00 +DF00 +DD80 +D380 +8500 +ENDCHAR +STARTCHAR F9FD +ENCODING 63997 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +C400 +C400 +7F80 +4400 +4400 +4400 +4400 +4400 +4400 +ENDCHAR +STARTCHAR F9FE +ENCODING 63998 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2400 +FF80 +3C00 +3C00 +6A00 +8900 +7E00 +2A00 +4B00 +8900 +ENDCHAR +STARTCHAR F9FF +ENCODING 63999 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +21 +FB +23 +FB +AB +AB +FB +B3 +A9 +23 +ENDCHAR +STARTCHAR FA00 +ENCODING 64000 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +5F +45 +55 +E5 +45 +59 +69 +11 +17 +ENDCHAR +STARTCHAR FA01 +ENCODING 64001 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +9400 +FF00 +9C00 +8000 +FE00 +9400 +9C00 +E300 +ENDCHAR +STARTCHAR FA02 +ENCODING 64002 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +5F80 +4400 +E800 +4800 +6F00 +D900 +E900 +4900 +4F00 +C900 +ENDCHAR +STARTCHAR FA03 +ENCODING 64003 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4400 +FF80 +FF00 +5500 +FF80 +5F00 +FF00 +5900 +5900 +6F00 +ENDCHAR +STARTCHAR FA04 +ENCODING 64004 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 10 1 -1 +BITMAP +08 +FF +81 +8D +70 +1F +F0 +10 +11 +1F +ENDCHAR +STARTCHAR FA05 +ENCODING 64005 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +BF +61 +3F +A1 +2F +6B +AF +A1 +A3 +ENDCHAR +STARTCHAR FA06 +ENCODING 64006 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +7E00 +7E00 +7F00 +2400 +FF00 +ED80 +3E00 +D100 +ENDCHAR +STARTCHAR FA07 +ENCODING 64007 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +4F80 +F000 +4F00 +EF00 +E000 +DF00 +EA80 +FF00 +4F00 +4880 +ENDCHAR +STARTCHAR FA08 +ENCODING 64008 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +2000 +4F00 +A000 +4000 +5F80 +C200 +C200 +4200 +4200 +4600 +ENDCHAR +STARTCHAR FA09 +ENCODING 64009 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +E800 +AF00 +DA00 +CE00 +D580 +BF00 +B400 +F380 +9C00 +8400 +ENDCHAR +STARTCHAR FA0A +ENCODING 64010 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +7E00 +4200 +7E00 +4200 +7E00 +7E00 +1400 +2480 +C700 +ENDCHAR +STARTCHAR FA0B +ENCODING 64011 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -1 +BITMAP +0800 +FF80 +FB00 +BD00 +BD00 +8500 +FD00 +BC80 +D500 +3400 +ENDCHAR +STARTCHAR FF01 +ENCODING 65281 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 9 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR FF02 +ENCODING 65282 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 3 4 5 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR FF03 +ENCODING 65283 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +28 +28 +7C +28 +28 +FC +48 +50 +50 +ENDCHAR +STARTCHAR FF04 +ENCODING 65284 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +20 +70 +A0 +A0 +A0 +60 +30 +30 +30 +F0 +20 +ENDCHAR +STARTCHAR FF05 +ENCODING 65285 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 9 1 -1 +BITMAP +E200 +A400 +A400 +A800 +EB00 +1480 +1480 +2480 +2300 +ENDCHAR +STARTCHAR FF06 +ENCODING 65286 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +70 +48 +48 +50 +64 +94 +8C +88 +74 +ENDCHAR +STARTCHAR FF07 +ENCODING 65287 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 3 5 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR FF08 +ENCODING 65288 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 11 7 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR FF09 +ENCODING 65289 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 1 -2 +BITMAP +80 +80 +40 +40 +40 +40 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR FF0A +ENCODING 65290 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 4 3 2 +BITMAP +20 +D0 +60 +50 +ENDCHAR +STARTCHAR FF0B +ENCODING 65291 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 6 2 1 +BITMAP +10 +10 +FC +10 +10 +10 +ENDCHAR +STARTCHAR FF0C +ENCODING 65292 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 2 0 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR FF0D +ENCODING 65293 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 1 4 4 +BITMAP +E0 +ENDCHAR +STARTCHAR FF0E +ENCODING 65294 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 1 1 -1 +BITMAP +80 +ENDCHAR +STARTCHAR FF0F +ENCODING 65295 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR FF10 +ENCODING 65296 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +38 +48 +44 +84 +84 +84 +44 +48 +38 +ENDCHAR +STARTCHAR FF11 +ENCODING 65297 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 9 4 -1 +BITMAP +40 +C0 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FF12 +ENCODING 65298 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +70 +90 +08 +10 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR FF13 +ENCODING 65299 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F0 +18 +08 +10 +60 +10 +08 +18 +F0 +ENDCHAR +STARTCHAR FF14 +ENCODING 65300 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +08 +18 +28 +28 +48 +88 +FC +08 +08 +ENDCHAR +STARTCHAR FF15 +ENCODING 65301 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F0 +80 +80 +F0 +10 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR FF16 +ENCODING 65302 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +78 +80 +80 +F0 +88 +88 +88 +98 +70 +ENDCHAR +STARTCHAR FF17 +ENCODING 65303 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +40 +40 +ENDCHAR +STARTCHAR FF18 +ENCODING 65304 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +38 +44 +44 +48 +38 +44 +84 +44 +78 +ENDCHAR +STARTCHAR FF19 +ENCODING 65305 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F0 +88 +88 +88 +F8 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR FF1A +ENCODING 65306 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 6 5 1 +BITMAP +80 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR FF1B +ENCODING 65307 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 8 4 -1 +BITMAP +40 +00 +00 +00 +00 +00 +40 +80 +ENDCHAR +STARTCHAR FF1C +ENCODING 65308 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +10 +10 +20 +40 +80 +80 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR FF1D +ENCODING 65309 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 4 2 2 +BITMAP +FC +00 +00 +FC +ENDCHAR +STARTCHAR FF1E +ENCODING 65310 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 11 3 -2 +BITMAP +80 +80 +40 +20 +10 +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR FF1F +ENCODING 65311 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +E0 +10 +10 +10 +20 +20 +40 +00 +40 +ENDCHAR +STARTCHAR FF20 +ENCODING 65312 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +3C +43 +9B +A5 +A5 +A5 +BE +41 +3E +ENDCHAR +STARTCHAR FF21 +ENCODING 65313 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +08 +18 +14 +24 +22 +3E +42 +41 +81 +ENDCHAR +STARTCHAR FF22 +ENCODING 65314 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F0 +90 +90 +90 +E0 +90 +88 +90 +F0 +ENDCHAR +STARTCHAR FF23 +ENCODING 65315 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +3C +40 +80 +80 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR FF24 +ENCODING 65316 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR FF25 +ENCODING 65317 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +F0 +80 +80 +80 +F0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR FF26 +ENCODING 65318 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +F0 +80 +80 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF27 +ENCODING 65319 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +3C +40 +80 +80 +9E +82 +82 +42 +3E +ENDCHAR +STARTCHAR FF28 +ENCODING 65320 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +84 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR FF29 +ENCODING 65321 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 9 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF2A +ENCODING 65322 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 9 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +40 +C0 +ENDCHAR +STARTCHAR FF2B +ENCODING 65323 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +88 +88 +90 +A0 +A0 +D0 +90 +88 +84 +ENDCHAR +STARTCHAR FF2C +ENCODING 65324 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR FF2D +ENCODING 65325 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 9 1 -1 +BITMAP +81 +C3 +C3 +A3 +A5 +A5 +95 +99 +89 +ENDCHAR +STARTCHAR FF2E +ENCODING 65326 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +84 +C4 +A4 +A4 +94 +94 +8C +84 +84 +ENDCHAR +STARTCHAR FF2F +ENCODING 65327 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +78 +C4 +84 +82 +82 +82 +82 +C4 +78 +ENDCHAR +STARTCHAR FF30 +ENCODING 65328 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F0 +90 +88 +90 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF31 +ENCODING 65329 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 10 2 -2 +BITMAP +78 +C4 +82 +82 +82 +82 +84 +C4 +78 +04 +ENDCHAR +STARTCHAR FF32 +ENCODING 65330 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +F8 +88 +88 +88 +F0 +90 +88 +88 +84 +ENDCHAR +STARTCHAR FF33 +ENCODING 65331 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +70 +80 +80 +C0 +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR FF34 +ENCODING 65332 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +FC +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR FF35 +ENCODING 65333 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +84 +84 +84 +84 +84 +84 +84 +44 +78 +ENDCHAR +STARTCHAR FF36 +ENCODING 65334 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 7 9 2 -1 +BITMAP +82 +84 +84 +44 +48 +48 +28 +30 +10 +ENDCHAR +STARTCHAR FF37 +ENCODING 65335 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +8440 +8C40 +4C40 +4A40 +5280 +5280 +5280 +3100 +2100 +ENDCHAR +STARTCHAR FF38 +ENCODING 65336 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +84 +44 +48 +30 +10 +30 +48 +44 +84 +ENDCHAR +STARTCHAR FF39 +ENCODING 65337 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 9 2 -1 +BITMAP +84 +44 +48 +28 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR FF3A +ENCODING 65338 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 -1 +BITMAP +F8 +10 +10 +20 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR FF3B +ENCODING 65339 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 8 -2 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR FF3C +ENCODING 65340 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 10 1 -2 +BITMAP +8000 +8000 +4000 +2000 +1000 +0800 +0400 +0200 +0100 +0080 +ENDCHAR +STARTCHAR FF3D +ENCODING 65341 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR FF3E +ENCODING 65342 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 5 2 3 +BITMAP +10 +30 +48 +48 +84 +ENDCHAR +STARTCHAR FF3F +ENCODING 65343 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 1 2 -2 +BITMAP +FC +ENDCHAR +STARTCHAR FF40 +ENCODING 65344 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 2 4 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR FF41 +ENCODING 65345 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +F0 +10 +10 +70 +90 +90 +F0 +ENDCHAR +STARTCHAR FF42 +ENCODING 65346 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 9 3 0 +BITMAP +80 +80 +F0 +90 +88 +88 +88 +90 +F0 +ENDCHAR +STARTCHAR FF43 +ENCODING 65347 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +70 +C0 +80 +80 +80 +C0 +70 +ENDCHAR +STARTCHAR FF44 +ENCODING 65348 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 3 -1 +BITMAP +08 +08 +08 +78 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR FF45 +ENCODING 65349 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +70 +90 +88 +F8 +80 +80 +70 +ENDCHAR +STARTCHAR FF46 +ENCODING 65350 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 10 3 -1 +BITMAP +30 +20 +40 +F0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FF47 +ENCODING 65351 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 8 3 -2 +BITMAP +F8 +98 +88 +88 +98 +78 +10 +F0 +ENDCHAR +STARTCHAR FF48 +ENCODING 65352 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 10 3 -1 +BITMAP +80 +80 +80 +F0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR FF49 +ENCODING 65353 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 10 5 -1 +BITMAP +80 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF4A +ENCODING 65354 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 4 -2 +BITMAP +40 +00 +00 +40 +40 +40 +40 +40 +40 +40 +C0 +ENDCHAR +STARTCHAR FF4B +ENCODING 65355 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 10 3 -1 +BITMAP +80 +80 +80 +90 +A0 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR FF4C +ENCODING 65356 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 10 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF4D +ENCODING 65357 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 8 7 1 -1 +BITMAP +F7 +89 +89 +89 +89 +89 +89 +ENDCHAR +STARTCHAR FF4E +ENCODING 65358 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +F0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR FF4F +ENCODING 65359 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 7 2 -1 +BITMAP +38 +4C +84 +84 +84 +4C +38 +ENDCHAR +STARTCHAR FF50 +ENCODING 65360 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 8 3 -2 +BITMAP +70 +90 +88 +88 +90 +F0 +80 +80 +ENDCHAR +STARTCHAR FF51 +ENCODING 65361 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 8 3 -2 +BITMAP +78 +98 +88 +88 +98 +78 +08 +08 +ENDCHAR +STARTCHAR FF52 +ENCODING 65362 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 7 4 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF53 +ENCODING 65363 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +70 +80 +C0 +20 +10 +10 +E0 +ENDCHAR +STARTCHAR FF54 +ENCODING 65364 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 9 3 -1 +BITMAP +40 +40 +F0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR FF55 +ENCODING 65365 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +88 +88 +88 +88 +88 +98 +E8 +ENDCHAR +STARTCHAR FF56 +ENCODING 65366 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 5 7 3 -1 +BITMAP +88 +90 +90 +50 +60 +60 +20 +ENDCHAR +STARTCHAR FF57 +ENCODING 65367 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 7 1 -1 +BITMAP +8880 +9900 +9900 +5500 +6500 +6600 +6200 +ENDCHAR +STARTCHAR FF58 +ENCODING 65368 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +90 +50 +60 +20 +60 +90 +90 +ENDCHAR +STARTCHAR FF59 +ENCODING 65369 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 8 3 -2 +BITMAP +90 +90 +50 +60 +60 +20 +40 +C0 +ENDCHAR +STARTCHAR FF5A +ENCODING 65370 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 4 7 3 -1 +BITMAP +F0 +10 +20 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR FF5B +ENCODING 65371 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 3 11 7 -2 +BITMAP +60 +40 +40 +40 +40 +80 +40 +40 +40 +40 +60 +ENDCHAR +STARTCHAR FF5C +ENCODING 65372 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 1 11 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF5D +ENCODING 65373 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 2 11 1 -2 +BITMAP +80 +80 +80 +80 +40 +40 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR FF5E +ENCODING 65374 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 3 2 2 +BITMAP +60 +94 +08 +ENDCHAR +STARTCHAR FFE0 +ENCODING 65504 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 0 +BITMAP +38 +4C +90 +90 +94 +64 +38 +40 +ENDCHAR +STARTCHAR FFE1 +ENCODING 65505 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +38 +44 +40 +FC +20 +E4 +B4 +CC +ENDCHAR +STARTCHAR FFE2 +ENCODING 65506 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 9 4 1 -2 +BITMAP +FF80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR FFE3 +ENCODING 65507 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 0 0 0 8 +BITMAP +ENDCHAR +STARTCHAR FFE5 +ENCODING 65509 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 6 8 2 -1 +BITMAP +84 +48 +FC +30 +FC +10 +10 +10 +ENDCHAR +STARTCHAR FFE6 +ENCODING 65510 +SWIDTH 900 0 +DWIDTH 10 0 +BBX 10 9 0 -1 +BITMAP +4480 +4C80 +4C80 +FFC0 +2A80 +3300 +3300 +1300 +1100 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/README.md b/buildroot/share/fonts/README.md new file mode 100644 index 00000000..b80de8e2 --- /dev/null +++ b/buildroot/share/fonts/README.md @@ -0,0 +1,21 @@ +# Marlin fonts + +## Author and license +The original author of the following font files is [A. Hardtung](https://github.com/AnHardt). + +Any copyright is dedicated to the Public Domain. +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)) + - HD44780_W.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) + - ISO10646-1.fon ([be79235](https://github.com/MarlinFirmware/Marlin/commit/be79235ef255a5c42fd385820447ec351f23b9b1)) + - ISO10646_5_Cyrillic.fon ([fe2bd23](https://github.com/MarlinFirmware/Marlin/commit/fe2bd237d556439499dfdee852c1550c7a16430a)) + - ISO10646_CN.fon ([6b1b718](https://github.com/MarlinFirmware/Marlin/commit/6b1b71837c98ceab55db7433357a13cd829d1ede)) + - 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](https://www.gnu.org/licenses/gpl-3.0.txt) license. + +## Documentation +For detailed information about adding new fonts to Marlin [see this article](https://marlinfw.org/docs/development/fonts.html). diff --git a/buildroot/share/fonts/genallfont.sh b/buildroot/share/fonts/genallfont.sh new file mode 100644 index 00000000..66f8e2c8 --- /dev/null +++ b/buildroot/share/fonts/genallfont.sh @@ -0,0 +1,140 @@ +#!/usr/bin/env bash + +##################################################################### +# genallfont.sh for Marlin +# +# This script generates font data for language headers +# +# Copyright 2015-2018 Yunhui Fu +# License: GPL/BSD +##################################################################### +my_getpath() { + local PARAM_DN="$1" + shift + #readlink -f + local DN="${PARAM_DN}" + local FN= + if [ ! -d "${DN}" ]; then + FN=$(basename "${DN}") + DN=$(dirname "${DN}") + fi + cd "${DN}" > /dev/null 2>&1 + DN=$(pwd) + cd - > /dev/null 2>&1 + echo -n "${DN}" + [[ -z "$FN" ]] || echo -n "/${FN}" +} +#DN_EXEC=`echo "$0" | ${EXEC_AWK} -F/ '{b=$1; for (i=2; i < NF; i ++) {b=b "/" $(i)}; print b}'` +DN_EXEC=$(dirname $(my_getpath "$0") ) + +EXEC_WXGGEN="${DN_EXEC}/uxggenpages.sh" + +# +# Locate the bdf2u8g command +# +EXEC_BDF2U8G=`which bdf2u8g` +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${DN_EXEC}/bdf2u8g" +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${PWD}/bdf2u8g" +[ -x "${EXEC_BDF2U8G}" ] || { EOL=$'\n' ; echo "ERR: Can't find bdf2u8g!${EOL}See uxggenpages.md for bdf2u8g build instructions." >&2 ; exit 1; } + +# +# Get language arguments +# +LANG_ARG="$@" + +# +# Use 6x12 combined font data for Western languages +# +FN_FONT="${DN_EXEC}/marlin-6x12-3.bdf" + +# +# Change to working directory 'Marlin' +# +OLDWD=`pwd` +[[ $(basename "$OLDWD") != 'Marlin' && -d "Marlin" ]] && cd Marlin +[[ -f "Configuration.h" ]] || { echo -n "cd to the 'Marlin' folder to run " ; basename $0 ; exit 1; } + +# +# Compile the 'genpages' command in-place +# +(cd ${DN_EXEC}; gcc -o genpages genpages.c getline.c) + +# +# 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 ro ru sk tr uk vi zh_CN zh_TW test" + +# +# Generate data for language list MARLIN_LANGS or all if not provided +# +for LANG in ${LANG_ARG:=$LANGS_DEFAULT} ; do + echo "Generating Marlin language data for '${LANG}'" >&2 + case "$LANG" in + zh_* ) FONTFILE="wenquanyi_12pt" ;; + ko_* ) FONTFILE="${DN_EXEC}/NanumGothic.bdf" ;; + * ) FONTFILE="${DN_EXEC}/marlin-6x12-3.bdf" ;; + esac + DN_WORK=`mktemp -d` + cp Configuration.h ${DN_WORK}/ + cp src/lcd/language/language_${LANG}.h ${DN_WORK}/ + cd "${DN_WORK}" + ${EXEC_WXGGEN} "${FONTFILE}" + sed -i fontutf8-data.h -e 's|fonts//|fonts/|g' -e 's|fonts//|fonts/|g' -e 's|[/0-9a-zA-Z_\-]*buildroot/share/fonts|buildroot/share/fonts|' 2>/dev/null + cd - >/dev/null + mv ${DN_WORK}/fontutf8-data.h src/lcd/dogm/fontdata/langdata_${LANG}.h + rm -rf ${DN_WORK} +done + +# +# Generate default ASCII font (char range 0-255): +# Marlin/src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +# +#if [ "${MARLIN_LANGS}" == "${LANGS_DEFAULT}" ]; then +if [ 1 = 1 ]; then + DN_WORK=`mktemp -d` + cd ${DN_WORK} + ${EXEC_BDF2U8G} -b 1 -e 127 ${FN_FONT} ISO10646_1_5x7 tmp1.h >/dev/null + ${EXEC_BDF2U8G} -b 1 -e 255 ${FN_FONT} ISO10646_1_5x7 tmp2.h >/dev/null + TMP1=$(cat tmp1.h) + TMP2=$(cat tmp2.h) + cd - >/dev/null + rm -rf ${DN_WORK} + + cat <src/lcd/dogm/fontdata/fontdata_ISO10646_1.h +/** + * 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 + +#if defined(__AVR__) && ENABLED(NOT_EXTENDED_ISO10646_1_5X7) + // reduced font (only symbols 1 - 127) - saves about 1278 bytes of FLASH + +$TMP1 +#else + // extended (original) font (symbols 1 - 255) + +$TMP2 + +#endif +EOF + +fi + +(cd ${DN_EXEC}; rm genpages) + +cd "$OLDWD" diff --git a/buildroot/share/fonts/genpages.c b/buildroot/share/fonts/genpages.c new file mode 100644 index 00000000..2a87b19d --- /dev/null +++ b/buildroot/share/fonts/genpages.c @@ -0,0 +1,207 @@ +/** + * @file genpages.c + * @brief generate required font page files + * @author Yunhui Fu (yhfudev@gmail.com) + * @version 1.0 + * @date 2015-02-19 + * @copyright Yunhui Fu (2015) + */ + +#include +#include /* uint8_t */ +#include /* size_t */ +#include +#include +#include "getline.h" + +wchar_t get_val_utf82uni(uint8_t *pstart) { + size_t cntleft; + wchar_t retval = 0; + + if (0 == (0x80 & *pstart)) return *pstart; + + if (((*pstart & 0xE0) ^ 0xC0) == 0) { + cntleft = 1; + retval = *pstart & ~0xE0; + } + else if (((*pstart & 0xF0) ^ 0xE0) == 0) { + cntleft = 2; + retval = *pstart & ~0xF0; + } + else if (((*pstart & 0xF8) ^ 0xF0) == 0) { + cntleft = 3; + retval = *pstart & ~0xF8; + } + else if (((*pstart & 0xFC) ^ 0xF8) == 0) { + cntleft = 4; + retval = *pstart & ~0xFC; + } + else if (((*pstart & 0xFE) ^ 0xFC) == 0) { + cntleft = 5; + retval = *pstart & ~0xFE; + } + else { + /* encoding error */ + cntleft = 0; + retval = 0; + } + pstart++; + for (; cntleft > 0; cntleft --) { + retval <<= 6; + retval |= *pstart & 0x3F; + pstart++; + } + return retval; +} + +/** + * @brief 转换 UTF-8 编码的一个字符为本地的 Unicode 字符(wchar_t) + * + * @param pstart : 存储 UTF-8 字符的指针 + * @param pval : 需要返回的 Unicode 字符存放地址指针 + * + * @return 成功返回下个 UTF-8 字符的位置 + * + * 转换 UTF-8 编码的一个字符为本地的 Unicode 字符(wchar_t) + */ +uint8_t* get_utf8_value(uint8_t *pstart, wchar_t *pval) { + uint32_t val = 0; + uint8_t *p = pstart; + /*size_t maxlen = strlen(pstart);*/ + + assert(NULL != pstart); + + if (0 == (0x80 & *p)) { + val = (size_t)*p; + p++; + } + else if (0xC0 == (0xE0 & *p)) { + val = *p & 0x1F; + val <<= 6; + p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xE0 == (0xF0 & *p)) { + val = *p & 0x0F; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xF0 == (0xF8 & *p)) { + val = *p & 0x07; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xF8 == (0xFC & *p)) { + val = *p & 0x03; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0xFC == (0xFE & *p)) { + val = *p & 0x01; + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + val <<= 6; p++; + val |= (*p & 0x3F); + p++; + assert((wchar_t)val == get_val_utf82uni(pstart)); + } + else if (0x80 == (0xC0 & *p)) { + /* error? */ + for (; 0x80 == (0xC0 & *p); p++); + } + else { + /* error */ + for (; ((0xFE & *p) > 0xFC); p++); + } + /* + if (val == 0) { + p = NULL; + */ + /* + } + else if (pstart + maxlen < p) { + p = pstart; + if (pval) *pval = 0; + } + */ + + if (pval) *pval = val; + + return p; +} + +void usage(char* progname) { + fprintf(stderr, "usage: %s\n", progname); + fprintf(stderr, " read data from stdin\n"); +} + +void utf8_parse(const char* msg, unsigned int len) { + uint8_t *pend = NULL; + uint8_t *p; + uint8_t *pre; + wchar_t val; + int page; + + pend = (uint8_t *)msg + len; + for (pre = (uint8_t *)msg; pre < pend;) { + val = 0; + p = get_utf8_value(pre, &val); + if (NULL == p) break; + page = val / 128; + if (val >= 256) { + fprintf(stdout, "%d %d ", page, (val % 128)); + for (; pre < p; pre++) fprintf(stdout, "%c", *pre); + fprintf(stdout, "\n"); + } + pre = p; + } +} + +int load_file(FILE *fp) { + char * buffer = NULL; + size_t szbuf = 0; + + szbuf = 10000; + buffer = (char*)malloc(szbuf); + if (NULL == buffer) return -1; + //pos = ftell (fp); + while (getline( &buffer, &szbuf, fp ) > 0) + utf8_parse((const char*)buffer, (unsigned int)strlen ((char *)buffer)); + + free(buffer); + return 0; +} + +int main(int argc, char * argv[]) { + if (argc > 1) { + usage(argv[0]); + exit(1); + } + load_file(stdin); +} diff --git a/buildroot/share/fonts/get-bdf2u8g.sh b/buildroot/share/fonts/get-bdf2u8g.sh new file mode 100644 index 00000000..5851bf93 --- /dev/null +++ b/buildroot/share/fonts/get-bdf2u8g.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +##################################################################### +# get-bdf2u8g.sh for Marlin +# +# This script downloads, patches, and builds bdf2u8g +# License: CC-SA +# +# Execute from within buildroot/share/fonts +# +##################################################################### + +HERE=$(pwd) + +for CMD in curl unzip patch make; do + which $CMD >/dev/null || { echo "'$CMD' is required for this script." ; exit 1 ; } +done + +[[ $HERE =~ 'buildroot/share/fonts'$ ]] || { echo "Change to buildroot/share/fonts to run $(basename $0)" ; exit 1; } + +# Download u8glib +curl -LJO https://github.com/olikraus/u8glib/archive/master.zip +unzip u8glib-master.zip >/dev/null 2>&1 + +# Patch and build bdf2u8g +cd u8glib-master/tools/font/bdf2u8g +patch -p0 <../../../../u8glib-bdf2u8g.patch bdf2u8g.c >/dev/null 2>&1 +make >/dev/null 2>&1 +mv bdf2u8g ../../../../ + +# Clean up +cd - +rm -rf u8glib-master* + +cd "$HERE" diff --git a/buildroot/share/fonts/getline.c b/buildroot/share/fonts/getline.c new file mode 100644 index 00000000..4974e933 --- /dev/null +++ b/buildroot/share/fonts/getline.c @@ -0,0 +1,126 @@ +/** + * getline.c --- Based on... + * + * getdelim.c --- Implementation of replacement getdelim function. + * Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005 Free + * Software Foundation, 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 2, 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/* Ported from glibc by Simon Josefsson. */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#if !HAVE_GETLINE + +//#include "getdelim.h" +#include +#include +#include +#include + +#ifndef SIZE_MAX + #define SIZE_MAX ((size_t) -1) +#endif +#ifndef SSIZE_MAX + #define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) +#endif +#if !HAVE_FLOCKFILE + #undef flockfile + #define flockfile(x) ((void)0) +#endif +#if !HAVE_FUNLOCKFILE + #undef funlockfile + #define funlockfile(x) ((void)0) +#endif + +/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and + NUL-terminate it). *LINEPTR is a pointer returned from malloc (or + NULL), pointing to *N characters of space. It is realloc'ed as + necessary. Returns the number of characters read (not including + the null terminator), or -1 on error or EOF. */ + +ssize_t +getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) { + ssize_t result; + size_t cur_len = 0; + + if (lineptr == NULL || n == NULL || fp == NULL) { + errno = EINVAL; + return -1; + } + + flockfile (fp); + + if (*lineptr == NULL || *n == 0) { + *n = 120; + *lineptr = (char *) malloc(*n); + if (*lineptr == NULL) { + result = -1; + goto unlock_return; + } + } + + for (;;) { + int i; + + i = getc(fp); + if (i == EOF) { + result = -1; + break; + } + + /* Make enough space for len+1 (for final NUL) bytes. */ + if (cur_len + 1 >= *n) { + size_t needed_max = + SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; + size_t needed = 2 * *n + 1; /* Be generous. */ + char *new_lineptr; + + if (needed_max < needed) + needed = needed_max; + if (cur_len + 1 >= needed) { + result = -1; + goto unlock_return; + } + + new_lineptr = (char *) realloc (*lineptr, needed); + if (new_lineptr == NULL) { + result = -1; + goto unlock_return; + } + + *lineptr = new_lineptr; + *n = needed; + } + + (*lineptr)[cur_len] = i; + cur_len++; + + if (i == delimiter) break; + } + (*lineptr)[cur_len] = '\0'; + result = cur_len ? (int) cur_len : (int) result; + + unlock_return: + funlockfile(fp); + return result; +} + +#endif diff --git a/buildroot/share/fonts/getline.h b/buildroot/share/fonts/getline.h new file mode 100644 index 00000000..f21f8ce2 --- /dev/null +++ b/buildroot/share/fonts/getline.h @@ -0,0 +1,12 @@ +#ifndef MYGETLINE_H +#define MYGETLINE_H + +//#include "config.h" + +#if !HAVE_GETLINE + #include + ssize_t getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp); + #define getline(lineptr, n, stream) getdelim (lineptr, n, '\n', stream) +#endif + +#endif // MYGETLINE_H diff --git a/buildroot/share/fonts/marlin-6x12-1.bdf b/buildroot/share/fonts/marlin-6x12-1.bdf new file mode 100644 index 00000000..b40fce01 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x12-1.bdf @@ -0,0 +1,64283 @@ +STARTFONT 2.1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Marlin 6x12 Fixed, for menu display" +COMMENT "This font is base on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1', added Marlin symbols at position 1-9, some chars were tweak for display on LCD screen, such as ',;c69' etc." +STARTPROPERTIES 23 +FONTNAME_REGISTRY "" +FOUNDRY "Marlin" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "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" +CAP_HEIGHT 7 +X_HEIGHT 5 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 10 +ENDPROPERTIES +CHARS 4539 + +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +C8 +88 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A8 +B8 +88 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +E0 +8C +EA +8C +8A +0A +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +C8 +10 +20 +40 +98 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +30 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 1 -1 +BITMAP +C0 +C0 +00 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR + +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR + +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +60 +90 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +A8 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +48 +30 +E0 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +40 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +90 +A0 +90 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +50 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +30 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +20 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +20 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +98 +88 +70 +10 +60 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +40 +60 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +88 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +88 +88 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +C0 +40 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +60 +C0 +40 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +60 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +20 +40 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +80 +50 +68 +48 +48 +48 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +08 +30 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +20 +40 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +18 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +30 +40 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +40 +40 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +28 +28 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +40 +40 +70 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +C8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +48 +48 +48 +68 +58 +48 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +68 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +B0 +A8 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +F0 +88 +88 +F0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +98 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +98 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +48 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +10 +A8 +A0 +A0 +A0 +60 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +F8 +40 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +30 +08 +70 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +78 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +E0 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +10 +C0 +A0 +B8 +A8 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +20 +20 +78 +A8 +B0 +B0 +78 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +A8 +D0 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +80 +98 +88 +88 +88 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C8 +40 +58 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E8 +A8 +A8 +A8 +A8 +88 +B0 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E8 +A0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +00 +58 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +98 +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +F8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +28 +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +A4 +A4 +A8 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +A0 +AC +A4 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A4 +A8 +6C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +C8 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +10 +10 +70 +90 +98 +94 +78 +20 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +40 +40 +40 +60 +50 +60 +80 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +E0 +90 +98 +94 +98 +20 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +40 +F0 +40 +60 +50 +A0 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +70 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +74 +88 +98 +F8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +48 +90 +90 +A0 +40 +B8 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A0 +C8 +F0 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +28 +30 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +10 +60 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +90 +F0 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +70 +A8 +F0 +C0 +F0 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +68 +98 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +F0 +48 +48 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +50 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +F8 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +78 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +10 +70 +90 +90 +90 +70 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +18 +74 +90 +60 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +68 +94 +20 +90 +60 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B0 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +70 +90 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +20 +68 +B0 +20 +20 +70 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +20 +60 +A0 +70 +20 +70 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +40 +78 +48 +50 +70 +E8 +48 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +A0 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +90 +70 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +80 +80 +80 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +08 +08 +08 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +A0 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +C0 +20 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +90 +60 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +20 +18 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +50 +F8 +20 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F8 +10 +30 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +68 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +30 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +38 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +10 +70 +90 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A8 +A8 +6C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +78 +A8 +B0 +B8 +68 +08 +38 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +B0 +78 +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +50 +48 +48 +30 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +54 +50 +F0 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +40 +E8 +50 +50 +50 +28 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +80 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +58 +60 +50 +48 +F0 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +78 +48 +50 +60 +F8 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +50 +00 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +00 +F8 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +08 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +04 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 3 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +20 +20 +A0 +60 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +20 +20 +A0 +60 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +A0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 4 +BITMAP +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 4 +BITMAP +80 +40 +40 +80 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 4 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +40 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +80 +40 +40 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +40 +A0 +A0 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 7 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +00 +40 +E0 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 3 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 0 +BITMAP +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +20 +F8 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 7 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +68 +A8 +10 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +60 +C0 +20 +C0 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni02EF +ENCODING 751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni02F0 +ENCODING 752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni02F1 +ENCODING 753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +10 +60 +80 +60 +10 +ENDCHAR +STARTCHAR uni02F2 +ENCODING 754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +80 +60 +10 +60 +80 +ENDCHAR +STARTCHAR uni02F3 +ENCODING 755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni02F4 +ENCODING 756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02F5 +ENCODING 757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni02F6 +ENCODING 758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02F7 +ENCODING 759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02F8 +ENCODING 760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni02F9 +ENCODING 761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +80 +ENDCHAR +STARTCHAR uni02FA +ENCODING 762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR uni02FB +ENCODING 763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +80 +80 +C0 +ENDCHAR +STARTCHAR uni02FC +ENCODING 764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR uni02FD +ENCODING 765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni02FE +ENCODING 766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 0 0 +BITMAP +80 +F0 +ENDCHAR +STARTCHAR uni02FF +ENCODING 767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 8 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 8 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +88 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +20 +40 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +40 +20 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +C0 +80 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 -2 +BITMAP +20 +A0 +40 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +F0 +90 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +60 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +F0 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +10 +20 +D8 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +E0 +A0 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 4 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +68 +B0 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni034F +ENCODING 847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni0350 +ENCODING 848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0351 +ENCODING 849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni0352 +ENCODING 850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +70 +88 +20 +ENDCHAR +STARTCHAR uni0353 +ENCODING 851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0354 +ENCODING 852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +38 +E0 +38 +ENDCHAR +STARTCHAR uni0355 +ENCODING 853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0356 +ENCODING 854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +08 +C8 +34 +D4 +ENDCHAR +STARTCHAR uni0357 +ENCODING 855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni0358 +ENCODING 856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni0359 +ENCODING 857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +E0 +ENDCHAR +STARTCHAR uni035A +ENCODING 858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +A8 +50 +ENDCHAR +STARTCHAR uni035B +ENCODING 859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +E0 +20 +ENDCHAR +STARTCHAR uni035C +ENCODING 860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni035D +ENCODING 861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni035E +ENCODING 862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +60 +98 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni0363 +ENCODING 867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0364 +ENCODING 868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +80 +60 +ENDCHAR +STARTCHAR uni0365 +ENCODING 869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 6 +BITMAP +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni0366 +ENCODING 870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0367 +ENCODING 871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0368 +ENCODING 872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR uni0369 +ENCODING 873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni036A +ENCODING 874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +C0 +A0 +ENDCHAR +STARTCHAR uni036B +ENCODING 875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +D0 +A8 +A8 +ENDCHAR +STARTCHAR uni036C +ENCODING 876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni036D +ENCODING 877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +40 +60 +ENDCHAR +STARTCHAR uni036E +ENCODING 878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni036F +ENCODING 879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +90 +B0 +D0 +90 +90 +08 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A0 +88 +70 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +28 +88 +70 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +E0 +40 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +90 +B0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +40 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 2 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +70 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +F8 +50 +50 +54 +48 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +90 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +30 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +C8 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +3C +08 +C8 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +D8 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +80 +80 +70 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +40 +48 +58 +68 +48 +08 +04 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +48 +18 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +48 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +48 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +88 +08 +70 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +90 +68 +08 +C8 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +10 +20 +40 +88 +70 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +10 +60 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +E0 +90 +88 +F0 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +30 +40 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +48 +70 +50 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +70 +48 +48 +70 +40 +E0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +B0 +C8 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +28 +08 +88 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +F0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +A0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +70 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +30 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +90 +70 +50 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A0 +F8 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +B8 +F8 +B8 +B8 +B8 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +90 +F8 +B8 +B8 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +50 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +C4 +A8 +90 +F8 +B8 +B8 +A8 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +A8 +90 +F8 +B8 +A8 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +30 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +A0 +A0 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +58 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +20 +88 +88 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +A8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +F8 +A8 +00 +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +10 +B0 +48 +40 +A0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +04 +FC +80 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +70 +8C +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +C8 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +98 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +60 +9C +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +80 +F0 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +A8 +70 +20 +70 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +08 +10 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +10 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +B0 +A0 +C0 +A0 +B0 +A8 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +B0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +E8 +50 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +48 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +48 +50 +60 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +F0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B8 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +90 +A8 +A8 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +90 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +A8 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +10 +60 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +38 +48 +48 +48 +48 +48 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +D8 +A8 +A8 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A8 +70 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +90 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +78 +40 +40 +E0 +40 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +40 +E0 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +60 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +60 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +20 +C0 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +48 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +20 +40 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A0 +A0 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A0 +A0 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +E8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +A8 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +FC +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +D4 +54 +48 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +A8 +B0 +D0 +88 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +C8 +B0 +A0 +D0 +88 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +70 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +70 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +90 +E8 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +D0 +50 +50 +58 +54 +54 +94 +04 +08 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +D0 +50 +58 +54 +94 +04 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +F0 +88 +80 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +A0 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +60 +90 +90 +80 +80 +80 +80 +F0 +08 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +B8 +D0 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +E8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +10 +20 +40 +80 +C0 +30 +08 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +38 +08 +70 +90 +68 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +A0 +A0 +20 +20 +20 +20 +30 +08 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +50 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A8 +A0 +A0 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +30 +28 +88 +88 +70 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +80 +C0 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +F0 +40 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +10 +20 +F8 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +A8 +A8 +28 +28 +08 +08 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +50 +30 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +E0 +90 +90 +88 +80 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +28 +28 +30 +A0 +70 +28 +20 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +70 +28 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 6 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +08 +70 +80 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +70 +88 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +C0 +88 +70 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +70 +08 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +B8 +D0 +A0 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +80 +80 +80 +A0 +D0 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +E8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +20 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +58 +28 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +90 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +18 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +10 +10 +20 +40 +80 +70 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +D0 +90 +90 +98 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +A8 +A8 +A8 +68 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +B0 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F8 +40 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +A0 +A0 +70 +28 +28 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +80 +70 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +20 +88 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +80 +A0 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 0 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni059B +ENCODING 1435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +20 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 6 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 2 5 +BITMAP +40 +90 +A0 +A0 +20 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +50 +A8 +50 +50 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +50 +D0 +20 +ENDCHAR +STARTCHAR uni05A2 +ENCODING 1442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +E0 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni05A7 +ENCODING 1447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 4 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni05AE +ENCODING 1454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +10 +50 +A0 +80 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 -2 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 1 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05BA +ENCODING 1466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 4 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 0 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05C5 +ENCODING 1477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni05C6 +ENCODING 1478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni05C7 +ENCODING 1479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +40 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +10 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 2 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +48 +88 +B8 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +30 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +28 +10 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +D8 +48 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +08 +08 +08 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +28 +28 +28 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +38 +38 +38 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +08 +08 +08 +FC +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +28 +28 +28 +FC +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +38 +38 +38 +FC +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +78 +78 +78 +FC +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +F8 +F8 +F8 +FC +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +38 +38 +FC +70 +70 +70 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +3C +3C +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +7C +7C +7C +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +10 +FC +10 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +28 +FC +28 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +38 +FC +38 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +FC +F8 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +10 +FC +10 +28 +28 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +FC +40 +58 +48 +78 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +D8 +70 +D8 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 3 +BITMAP +50 +F8 +50 +F8 +50 +F8 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +78 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +40 +20 +1C +20 +40 +80 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +04 +08 +F0 +08 +04 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +90 +A0 +C0 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +80 +90 +A0 +C0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +D0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +80 +80 +80 +C0 +A0 +80 +C0 +A0 +80 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +A8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +60 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +80 +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +70 +70 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +40 +90 +48 +10 +20 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +80 +80 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +40 +80 +40 +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 4 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +40 +40 +40 +40 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +C0 +A0 +90 +A0 +C0 +A0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +A0 +C0 +80 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +60 +50 +40 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +50 +20 +50 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +70 +A8 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +68 +88 +68 +18 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +E0 +40 +50 +70 +50 +10 +38 +10 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +10 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +10 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +78 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +18 +00 +20 +50 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +88 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +10 +20 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +10 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +40 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +9C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +5C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +54 +14 +14 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +10 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +48 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +50 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +10 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +88 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +90 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +20 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +50 +20 +68 +D4 +A8 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +58 +34 +68 +D4 +A8 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +88 +50 +20 +A8 +20 +50 +88 +20 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +20 +00 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 8 +BITMAP +FC +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +10 +20 +20 +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +20 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 2 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +80 +80 +E0 +80 +80 +E0 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +E0 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +B4 +24 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +88 +90 +90 +00 +90 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +E8 +E8 +78 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F0 +B8 +B8 +F0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -2 +BITMAP +40 +E0 +40 +00 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +70 +70 +A8 +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +90 +10 +20 +20 +40 +40 +90 +80 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -1 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2057 +ENCODING 8279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +7C +7C +F8 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +88 +88 +00 +20 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +20 +F8 +20 +A8 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 4 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 4 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -1 +BITMAP +40 +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 -2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +C0 +20 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +80 +B8 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +D0 +D0 +D8 +70 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +B0 +A0 +A8 +70 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +E0 +40 +E0 +48 +B0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +10 +F0 +A8 +A8 +A8 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +C8 +FC +A8 +FC +98 +88 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +FC +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +94 +B4 +B4 +B4 +B4 +A4 +98 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +00 +78 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +48 +50 +F8 +50 +48 +48 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +50 +48 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20B0 +ENCODING 8368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +28 +10 +10 +50 +68 +A8 +08 +10 +ENDCHAR +STARTCHAR uni20B1 +ENCODING 8369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +F8 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20B2 +ENCODING 8370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +B8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20B3 +ENCODING 8371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni20B4 +ENCODING 8372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +F8 +20 +F8 +40 +30 +ENDCHAR +STARTCHAR uni20B5 +ENCODING 8373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +B8 +90 +60 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 7 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni20E4 +ENCODING 8420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni20E7 +ENCODING 8423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni20E8 +ENCODING 8424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni20E9 +ENCODING 8425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni20EA +ENCODING 8426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +24 +24 +24 +48 +48 +90 +90 +90 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +10 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +40 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20F0 +ENCODING 8432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +A8 +70 +10 +20 +40 +58 +A0 +98 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +A8 +70 +10 +20 +58 +60 +90 +88 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +50 +A8 +90 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +68 +A8 +98 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +30 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C8 +48 +48 +70 +90 +90 +90 +08 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +B8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F0 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +08 +08 +10 +10 +20 +A0 +40 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +48 +10 +10 +08 +C8 +30 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +28 +20 +20 +40 +40 +64 +98 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +50 +50 +20 +60 +90 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +F0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +A4 +B4 +B4 +AC +A4 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +90 +D8 +B4 +98 +90 +9C +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +E8 +D8 +E8 +C8 +88 +70 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +58 +64 +64 +78 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +B0 +68 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +A0 +90 +90 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +68 +30 +30 +A8 +48 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +B0 +A8 +A8 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A8 +90 +A8 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +60 +20 +F0 +A8 +A8 +F0 +A0 +B0 +A8 +20 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +54 +9C +54 +94 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +40 +40 +70 +20 +30 +20 +30 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +20 +A8 +A8 +A8 +50 +50 +50 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +28 +48 +50 +90 +A0 +F8 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +10 +20 +78 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +28 +38 +28 +88 +70 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +90 +90 +E0 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +74 +90 +90 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +70 +80 +60 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +A0 +20 +78 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +6C +54 +44 +48 +48 +84 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +90 +90 +60 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +60 +00 +E0 +60 +60 +E0 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213B +ENCODING 8507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +E0 +80 +C0 +80 +70 +50 +70 +50 +14 +08 +14 +ENDCHAR +STARTCHAR uni213C +ENCODING 8508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +68 +68 +68 +68 +ENDCHAR +STARTCHAR uni213D +ENCODING 8509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +A8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A0 +50 +50 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR uni2141 +ENCODING 8513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +C8 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2142 +ENCODING 8514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2143 +ENCODING 8515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2144 +ENCODING 8516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +54 +54 +54 +A8 +A8 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +14 +14 +68 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +54 +54 +B8 +A0 +78 +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +78 +28 +28 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni214A +ENCODING 8522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F0 +A8 +A8 +B0 +20 +38 +ENDCHAR +STARTCHAR uni214B +ENCODING 8523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +48 +E8 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni214C +ENCODING 8524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +B8 +A4 +F4 +AC +F8 +A8 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni214D +ENCODING 8525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +E8 +B0 +10 +20 +48 +50 +88 +90 +ENDCHAR +STARTCHAR uni214E +ENCODING 8526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni214F +ENCODING 8527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +70 +70 +A8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +C8 +E8 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +E0 +28 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +90 +90 +90 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +48 +48 +48 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +54 +54 +54 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +DC +DC +DC +5C +5C +5C +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +48 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +AC +AC +AC +4C +AC +AC +AC +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +A8 +90 +90 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +A8 +48 +48 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +00 +D4 +D4 +D4 +D4 +54 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +00 +DC +DC +DC +DC +5C +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +48 +A8 +A8 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +00 +AC +AC +4C +AC +AC +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +E8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +F8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +90 +10 +90 +60 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +80 +80 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni2186 +ENCODING 8582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2187 +ENCODING 8583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +FC +FC +9C +FC +FC +F8 +ENDCHAR +STARTCHAR uni2188 +ENCODING 8584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +A8 +F8 +F8 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +78 +38 +28 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +40 +40 +20 +28 +38 +78 +18 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +50 +30 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +28 +FC +48 +50 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +C0 +D8 +64 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +0C +6C +98 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +50 +FC +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +28 +FC +28 +50 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +F0 +48 +24 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +3C +48 +90 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +48 +F8 +48 +28 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +90 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +44 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +88 +7C +08 +10 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +4C +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +C8 +FC +48 +50 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +48 +DC +EC +48 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +58 +FC +68 +40 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +B0 +D0 +90 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F0 +10 +38 +10 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +48 +F8 +40 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +30 +48 +48 +E8 +48 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +90 +90 +B8 +10 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +E0 +C0 +A0 +20 +10 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F0 +50 +50 +50 +50 +78 +50 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +00 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +00 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +7C +90 +7C +20 +50 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +58 +FC +A4 +FC +68 +40 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +F8 +24 +F8 +10 +28 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +A0 +D0 +A8 +94 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +14 +2C +54 +A4 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A4 +54 +2C +14 +7C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +94 +A8 +D0 +A0 +F8 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +40 +E8 +D4 +40 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +88 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +00 +20 +88 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +88 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +88 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +F0 +88 +F0 +A0 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +B0 +A0 +90 +10 +08 +08 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +48 +28 +68 +08 +F8 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +68 +FC +68 +10 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +78 +50 +50 +50 +50 +F0 +50 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +F8 +10 +10 +F8 +10 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +48 +FC +48 +50 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +38 +58 +FC +58 +38 +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +70 +68 +FC +68 +70 +ENDCHAR +STARTCHAR uni21FC +ENCODING 8700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +60 +B8 +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +E8 +30 +20 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +B4 +78 +30 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +F8 +18 +28 +78 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +70 +98 +A8 +C8 +70 +40 +40 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +48 +48 +48 +48 +48 +48 +48 +EC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +EC +48 +48 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +08 +08 +08 +08 +10 +D0 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +C4 +24 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +A4 +E8 +28 +28 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +58 +A0 +A0 +58 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +20 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +30 +48 +88 +48 +30 +10 +08 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +50 +58 +50 +70 +50 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +B0 +68 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +48 +A4 +94 +48 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +A8 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +20 +20 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +F8 +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +68 +B0 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +68 +B0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +00 +70 +88 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +00 +D8 +20 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +F8 +00 +F8 +00 +08 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +F8 +00 +F8 +00 +80 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B8 +00 +B8 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +E8 +00 +E8 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +50 +F8 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +4C +F8 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D0 +A8 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +30 +C0 +30 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +60 +18 +60 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +18 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +90 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +60 +A0 +60 +20 +30 +28 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +18 +70 +90 +60 +38 +E0 +30 +48 +70 +C0 +40 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +D0 +30 +18 +30 +E0 +38 +60 +C0 +60 +58 +40 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E0 +10 +E8 +10 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +38 +40 +B8 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +E0 +10 +08 +00 +68 +B0 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +38 +40 +80 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +28 +30 +E0 +30 +28 +20 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A0 +60 +38 +60 +A0 +20 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F8 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +B8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +AC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +90 +F8 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +F8 +A0 +F8 +C0 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A8 +A8 +BC +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A4 +A4 +BC +A8 +BC +B0 +B0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +08 +10 +E0 +10 +08 +10 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +80 +40 +38 +40 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +68 +88 +68 +18 +00 +F8 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +B8 +50 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +E8 +50 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +E8 +10 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +C0 +A0 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +88 +50 +20 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +50 +F8 +50 +88 +20 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +B0 +68 +00 +F8 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +98 +A0 +98 +40 +38 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +C8 +28 +C8 +10 +E0 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +60 +88 +60 +18 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +30 +88 +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +54 +A8 +54 +28 +14 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +A8 +54 +A8 +50 +A0 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E8 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +B8 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A0 +A0 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +28 +28 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +38 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +E0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +10 +E0 +10 +28 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +40 +38 +40 +A0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +38 +68 +A8 +68 +38 +20 +20 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +00 +00 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni22F2 +ENCODING 8946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +38 +ENDCHAR +STARTCHAR uni22F3 +ENCODING 8947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F4 +ENCODING 8948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F5 +ENCODING 8949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F6 +ENCODING 8950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F7 +ENCODING 8951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni22F8 +ENCODING 8952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +00 +F8 +ENDCHAR +STARTCHAR uni22F9 +ENCODING 8953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +80 +F0 +40 +38 +ENDCHAR +STARTCHAR uni22FA +ENCODING 8954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +10 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni22FB +ENCODING 8955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +88 +F8 +88 +10 +E0 +ENDCHAR +STARTCHAR uni22FC +ENCODING 8956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +10 +90 +F0 +90 +10 +E0 +ENDCHAR +STARTCHAR uni22FD +ENCODING 8957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni22FE +ENCODING 8958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni22FF +ENCODING 8959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +A8 +48 +B0 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +A8 +60 +20 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +40 +80 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +80 +80 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +50 +20 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +C8 +F0 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +70 +20 +70 +A8 +50 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +50 +50 +70 +A8 +B8 +88 +70 +50 +50 +70 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +70 +20 +20 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +18 +C0 +20 +18 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F0 +D8 +A4 +D8 +F0 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +3C +6C +94 +6C +3C +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +C8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +60 +D8 +30 +20 +40 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +5C +64 +38 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +00 +F8 +00 +70 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +48 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +40 +40 +A8 +FC +A8 +40 +40 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +80 +E0 +98 +FC +98 +E0 +80 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +F8 +88 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +D8 +88 +D8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +A8 +D8 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +88 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +F8 +40 +40 +80 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +F8 +10 +10 +08 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +98 +98 +A8 +A8 +A8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +C8 +C8 +A8 +A8 +A8 +98 +98 +F8 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +A8 +C8 +A8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +A8 +98 +A8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +50 +F8 +50 +10 +10 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +50 +F8 +50 +40 +40 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +C8 +F8 +C8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +98 +F8 +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +20 +70 +70 +A8 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +88 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +F8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +88 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +A0 +00 +00 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +78 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +50 +00 +00 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +F8 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +88 +88 +7C +D8 +A0 +20 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +E8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +20 +70 +20 +00 +30 +F8 +40 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +F8 +A8 +F8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +D8 +98 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +B8 +E8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +E8 +B8 +88 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +68 +00 +F8 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +60 +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +10 +00 +F8 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +A8 +A8 +50 +00 +F8 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +04 +08 +3C +10 +90 +60 +20 +ENDCHAR +STARTCHAR uni237C +ENCODING 9084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +40 +C0 +60 +40 +C0 +60 +50 +FC +C0 +E0 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +CC +48 +78 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +F8 +50 +D8 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +10 +70 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +48 +24 +6C +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +84 +A4 +10 +B4 +50 +B4 +84 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +D4 +D4 +D4 +F8 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A8 +A8 +A8 +A8 +F8 +20 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +50 +88 +24 +F4 +24 +88 +50 +20 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +1C +28 +40 +9C +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +84 +CC +B4 +78 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +FC +CC +B4 +84 +78 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E8 +C4 +A4 +14 +84 +78 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +C8 +00 +50 +A8 +50 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +50 +50 +50 +D8 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +88 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +F8 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +A8 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +48 +84 +48 +30 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +E0 +E0 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +BC +24 +84 +24 +FC +24 +84 +24 +3C +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +D4 +80 +84 +90 +FC +90 +84 +80 +54 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +68 +48 +CC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +A4 +D4 +AC +94 +78 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +60 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23B0 +ENCODING 9136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23B1 +ENCODING 9137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni23B2 +ENCODING 9138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni23B3 +ENCODING 9139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni23B4 +ENCODING 9140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni23B5 +ENCODING 9141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni23B6 +ENCODING 9142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +88 +F8 +00 +00 +F8 +88 +ENDCHAR +STARTCHAR uni23B7 +ENCODING 9143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +A0 +A0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR uni23B8 +ENCODING 9144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23B9 +ENCODING 9145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BE +ENCODING 9150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BF +ENCODING 9151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23C0 +ENCODING 9152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C1 +ENCODING 9153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C2 +ENCODING 9154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni23C3 +ENCODING 9155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C4 +ENCODING 9156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C5 +ENCODING 9157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +F8 +ENDCHAR +STARTCHAR uni23C6 +ENCODING 9158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C7 +ENCODING 9159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C8 +ENCODING 9160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23C9 +ENCODING 9161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23CA +ENCODING 9162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23CB +ENCODING 9163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23CC +ENCODING 9164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23CD +ENCODING 9165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni23CE +ENCODING 9166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +58 +F8 +F0 +40 +ENDCHAR +STARTCHAR uni23CF +ENCODING 9167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni23D0 +ENCODING 9168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23D1 +ENCODING 9169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni23D2 +ENCODING 9170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +88 +70 +ENDCHAR +STARTCHAR uni23D3 +ENCODING 9171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni23D4 +ENCODING 9172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +00 +B4 +48 +ENDCHAR +STARTCHAR uni23D5 +ENCODING 9173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +B4 +48 +00 +FC +ENDCHAR +STARTCHAR uni23D6 +ENCODING 9174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +B4 +48 +ENDCHAR +STARTCHAR uni23D7 +ENCODING 9175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni23D8 +ENCODING 9176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +F8 +ENDCHAR +STARTCHAR uni23D9 +ENCODING 9177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni23DA +ENCODING 9178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +F8 +00 +70 +00 +20 +ENDCHAR +STARTCHAR uni23DB +ENCODING 9179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +48 +FC +48 +78 +ENDCHAR +STARTCHAR uni23DC +ENCODING 9180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23DD +ENCODING 9181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23DE +ENCODING 9182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +30 +CC +84 +ENDCHAR +STARTCHAR uni23DF +ENCODING 9183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +84 +CC +30 +ENDCHAR +STARTCHAR uni23E0 +ENCODING 9184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23E1 +ENCODING 9185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23E2 +ENCODING 9186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +E0 +90 +88 +84 +FC +ENDCHAR +STARTCHAR uni23E3 +ENCODING 9187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +30 +78 +CC +84 +CC +78 +30 +ENDCHAR +STARTCHAR uni23E4 +ENCODING 9188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23E5 +ENCODING 9189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +7C +44 +88 +F8 +ENDCHAR +STARTCHAR uni23E6 +ENCODING 9190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +A0 +FC +14 +08 +ENDCHAR +STARTCHAR uni23E7 +ENCODING 9191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A4 +A8 +B0 +30 +48 +84 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E8 +68 +58 +48 +10 +28 +28 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +A0 +C0 +A0 +C0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +E0 +A0 +B8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +E0 +00 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +A0 +40 +78 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +80 +70 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +D0 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +38 +10 +10 +38 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +30 +08 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +20 +28 +38 +08 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +38 +34 +18 +14 +18 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +60 +00 +20 +50 +70 +50 +00 +68 +58 +48 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +80 +40 +E0 +50 +50 +20 +38 +14 +18 +14 +18 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +70 +00 +18 +20 +18 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +90 +90 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +30 +28 +30 +20 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +40 +F0 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +D0 +B0 +90 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +90 +A0 +28 +48 +90 +90 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +40 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +28 +28 +20 +20 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +D8 +C0 +C0 +D8 +18 +18 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +20 +20 +80 +80 +80 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +AC +AC +AC +A0 +A0 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +50 +50 +28 +28 +14 +14 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +D4 +DC +CC +DC +84 +78 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +EC +B4 +B4 +D4 +EC +84 +78 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +E8 +98 +A8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +D4 +DC +CC +DC +84 +48 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2487 +ENCODING 9351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +EC +B4 +B4 +D4 +EC +84 +48 +ENDCHAR +STARTCHAR uni2488 +ENCODING 9352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E8 +ENDCHAR +STARTCHAR uni2489 +ENCODING 9353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +10 +10 +20 +20 +40 +F4 +ENDCHAR +STARTCHAR uni248A +ENCODING 9354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +10 +60 +10 +10 +E4 +ENDCHAR +STARTCHAR uni248B +ENCODING 9355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +40 +90 +90 +F8 +10 +14 +ENDCHAR +STARTCHAR uni248C +ENCODING 9356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F0 +80 +E0 +10 +10 +90 +64 +ENDCHAR +STARTCHAR uni248D +ENCODING 9357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +40 +80 +E0 +90 +90 +64 +ENDCHAR +STARTCHAR uni248E +ENCODING 9358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +24 +ENDCHAR +STARTCHAR uni248F +ENCODING 9359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +60 +90 +90 +64 +ENDCHAR +STARTCHAR uni2490 +ENCODING 9360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +70 +10 +10 +64 +ENDCHAR +STARTCHAR uni2491 +ENCODING 9361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +A8 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2492 +ENCODING 9362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A8 +ENDCHAR +STARTCHAR uni2493 +ENCODING 9363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +A0 +A0 +B4 +ENDCHAR +STARTCHAR uni2494 +ENCODING 9364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +88 +88 +B4 +ENDCHAR +STARTCHAR uni2495 +ENCODING 9365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +B0 +B0 +B8 +90 +94 +ENDCHAR +STARTCHAR uni2496 +ENCODING 9366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +A0 +A0 +90 +90 +90 +A4 +ENDCHAR +STARTCHAR uni2497 +ENCODING 9367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +90 +A0 +B0 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2498 +ENCODING 9368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +88 +88 +88 +90 +90 +94 +ENDCHAR +STARTCHAR uni2499 +ENCODING 9369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +90 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni249A +ENCODING 9370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +98 +88 +90 +A4 +ENDCHAR +STARTCHAR uni249B +ENCODING 9371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +68 +68 +68 +A8 +A8 +D4 +ENDCHAR +STARTCHAR uni249C +ENCODING 9372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni249D +ENCODING 9373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +B4 +84 +48 +ENDCHAR +STARTCHAR uni249E +ENCODING 9374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni249F +ENCODING 9375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A0 +ENCODING 9376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +AC +BC +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A1 +ENCODING 9377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +A4 +F4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24A2 +ENCODING 9378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +D4 +B4 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A3 +ENCODING 9379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +AC +84 +48 +ENDCHAR +STARTCHAR uni24A4 +ENCODING 9380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A5 +ENCODING 9381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A6 +ENCODING 9382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A7 +ENCODING 9383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +94 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A8 +ENCODING 9384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +EC +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24A9 +ENCODING 9385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +E4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24AA +ENCODING 9386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24AB +ENCODING 9387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +AC +B4 +A4 +48 +ENDCHAR +STARTCHAR uni24AC +ENCODING 9388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +D4 +B4 +94 +48 +ENDCHAR +STARTCHAR uni24AD +ENCODING 9389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24AE +ENCODING 9390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +A4 +94 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24AF +ENCODING 9391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +F4 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24B0 +ENCODING 9392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +D4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B1 +ENCODING 9393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24B2 +ENCODING 9394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +C4 +D4 +BC +84 +48 +ENDCHAR +STARTCHAR uni24B3 +ENCODING 9395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +94 +AC +84 +48 +ENDCHAR +STARTCHAR uni24B4 +ENCODING 9396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +A4 +48 +ENDCHAR +STARTCHAR uni24B5 +ENCODING 9397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +94 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B6 +ENCODING 9398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24B7 +ENCODING 9399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24B8 +ENCODING 9400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +A4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24B9 +ENCODING 9401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +AC +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BA +ENCODING 9402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BB +ENCODING 9403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24BC +ENCODING 9404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +C4 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BD +ENCODING 9405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24BE +ENCODING 9406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24BF +ENCODING 9407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +94 +94 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C0 +ENCODING 9408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C1 +ENCODING 9409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C2 +ENCODING 9410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +AC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C3 +ENCODING 9411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C4 +ENCODING 9412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24C5 +ENCODING 9413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C6 +ENCODING 9414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +D4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24C7 +ENCODING 9415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C8 +ENCODING 9416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +9C +A4 +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C9 +ENCODING 9417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CA +ENCODING 9418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24CB +ENCODING 9419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CC +ENCODING 9420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +C4 +D4 +D4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CD +ENCODING 9421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CE +ENCODING 9422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CF +ENCODING 9423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24D0 +ENCODING 9424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D1 +ENCODING 9425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D2 +ENCODING 9426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D3 +ENCODING 9427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D4 +ENCODING 9428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D5 +ENCODING 9429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +F4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24D6 +ENCODING 9430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +D4 +B4 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24D7 +ENCODING 9431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24D8 +ENCODING 9432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D9 +ENCODING 9433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24DA +ENCODING 9434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24DB +ENCODING 9435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24DC +ENCODING 9436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +EC +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DD +ENCODING 9437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +E4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DE +ENCODING 9438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24DF +ENCODING 9439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +AC +B4 +A4 +78 +ENDCHAR +STARTCHAR uni24E0 +ENCODING 9440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24E1 +ENCODING 9441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24E2 +ENCODING 9442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +A4 +94 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E3 +ENCODING 9443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +F4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24E4 +ENCODING 9444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E5 +ENCODING 9445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24E6 +ENCODING 9446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +C4 +D4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24E7 +ENCODING 9447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +94 +AC +84 +78 +ENDCHAR +STARTCHAR uni24E8 +ENCODING 9448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +A4 +78 +ENDCHAR +STARTCHAR uni24E9 +ENCODING 9449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +94 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24EB +ENCODING 9451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24EC +ENCODING 9452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +B4 +AC +A4 +FC +78 +ENDCHAR +STARTCHAR uni24ED +ENCODING 9453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +AC +B4 +AC +FC +78 +ENDCHAR +STARTCHAR uni24EE +ENCODING 9454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A4 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24EF +ENCODING 9455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +AC +A4 +B4 +A4 +FC +78 +ENDCHAR +STARTCHAR uni24F0 +ENCODING 9456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F1 +ENCODING 9457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +B4 +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24F2 +ENCODING 9458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F3 +ENCODING 9459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B0 +B8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F4 +ENCODING 9460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +C8 +C8 +A8 +94 +FC +78 +ENDCHAR +STARTCHAR uni24F5 +ENCODING 9461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +E8 +A8 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F6 +ENCODING 9462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +98 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F7 +ENCODING 9463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +E8 +98 +A8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F8 +ENCODING 9464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +C8 +C8 +E8 +F8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F9 +ENCODING 9465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +C8 +E8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FA +ENCODING 9466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +B8 +C8 +E8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FB +ENCODING 9467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +98 +A8 +A8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FC +ENCODING 9468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +A8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FD +ENCODING 9469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +B8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FE +ENCODING 9470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +FC +84 +D4 +EC +EC +EC +D4 +84 +FC +78 +ENDCHAR +STARTCHAR uni24FF +ENCODING 9471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +B4 +B4 +CC +FC +78 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +3C +FC +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +3C +FC +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 2 2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 1 2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 3 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 3 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +1C +FC +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +E0 +FC +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +78 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +48 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +70 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +50 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +B4 +B4 +48 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +08 +80 +04 +40 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +FC +78 +30 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +E4 +68 +30 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +9C +58 +30 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +FC +78 +30 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +84 +48 +30 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +84 +48 +30 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +38 +78 +78 +F8 +78 +78 +38 +08 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +E0 +F0 +F0 +F8 +F0 +F0 +E0 +80 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +CC +B4 +78 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 3 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 0 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 0 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +48 +84 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +84 +48 +30 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +E8 +C8 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +B8 +F8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +70 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +88 +20 +70 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +60 +F8 +FC +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +20 +40 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +50 +A8 +50 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +50 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +90 +90 +60 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +30 +20 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2616 +ENCODING 9750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2617 +ENCODING 9751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +24 +74 +F8 +E8 +F4 +74 +28 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +7C +7C +3C +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +F8 +F8 +F0 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +4C +4C +3C +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +30 +F0 +D0 +90 +90 +F0 +F0 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +C8 +C8 +F0 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +F0 +F0 +90 +90 +D0 +F0 +30 +10 +10 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +A8 +F8 +70 +50 +20 +88 +70 +88 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +FC +48 +48 +30 +48 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +F8 +70 +50 +70 +50 +70 +50 +20 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +60 +30 +20 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +28 +30 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +88 +70 +70 +A8 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +EC +A4 +FC +78 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +F8 +A8 +A8 +F8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +88 +20 +50 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +C8 +28 +28 +28 +C8 +70 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +98 +A0 +A0 +A0 +98 +70 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +0C +74 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +28 +48 +F8 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +50 +68 +48 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +A8 +F8 +A8 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A8 +FC +A8 +A8 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +48 +30 +48 +48 +30 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +A0 +48 +14 +88 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +70 +88 +48 +28 +68 +A8 +48 +04 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +AC +FC +AC +AC +AC +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +A8 +F8 +A8 +A8 +A8 +A8 +A8 +0C +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +A8 +B0 +C8 +88 +30 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +70 +D8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +68 +88 +E8 +28 +28 +44 +7C +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +F8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +D8 +88 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +58 +F8 +F8 +38 +38 +7C +7C +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +88 +50 +20 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +90 +48 +00 +50 +88 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +48 +48 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +68 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +80 +90 +B0 +D0 +90 +B0 +D0 +90 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +A8 +70 +A8 +20 +20 +50 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +20 +D8 +A8 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni2672 +ENCODING 9842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +C8 +44 +8C +80 +94 +38 +10 +ENDCHAR +STARTCHAR uni2673 +ENCODING 9843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +58 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni2674 +ENCODING 9844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2675 +ENCODING 9845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2676 +ENCODING 9846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +94 +84 +DC +ENDCHAR +STARTCHAR uni2677 +ENCODING 9847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +20 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2678 +ENCODING 9848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +68 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2679 +ENCODING 9849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni267A +ENCODING 9850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +00 +84 +84 +DC +ENDCHAR +STARTCHAR uni267B +ENCODING 9851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +28 +CC +CC +80 +94 +B8 +10 +ENDCHAR +STARTCHAR uni267C +ENCODING 9852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +FC +C4 +D4 +30 +30 +7C +68 +44 +EC +FC +78 +ENDCHAR +STARTCHAR uni267D +ENCODING 9853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +30 +28 +CC +CC +80 +94 +B8 +10 +84 +78 +ENDCHAR +STARTCHAR uni267E +ENCODING 9854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +00 +50 +A8 +50 +00 +88 +70 +ENDCHAR +STARTCHAR uni267F +ENCODING 9855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +40 +78 +40 +F0 +98 +64 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +A8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +88 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +A8 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +88 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +A8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +D8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2686 +ENCODING 9862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +98 +88 +70 +ENDCHAR +STARTCHAR uni2687 +ENCODING 9863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2688 +ENCODING 9864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +E8 +F8 +70 +ENDCHAR +STARTCHAR uni2689 +ENCODING 9865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni268A +ENCODING 9866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni268B +ENCODING 9867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni268C +ENCODING 9868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268D +ENCODING 9869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268E +ENCODING 9870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni268F +ENCODING 9871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +98 +88 +C8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +F8 +F8 +F8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2692 +ENCODING 9874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +CC +B4 +30 +48 +84 +ENDCHAR +STARTCHAR uni2693 +ENCODING 9875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +F8 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2694 +ENCODING 9876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +88 +ENDCHAR +STARTCHAR uni2695 +ENCODING 9877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A0 +70 +28 +30 +60 +30 +20 +ENDCHAR +STARTCHAR uni2696 +ENCODING 9878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +A8 +88 +88 +D8 +D8 +ENDCHAR +STARTCHAR uni2697 +ENCODING 9879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +5C +88 +00 +1C +14 +ENDCHAR +STARTCHAR uni2698 +ENCODING 9880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2699 +ENCODING 9881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +A8 +88 +F8 +20 +ENDCHAR +STARTCHAR uni269A +ENCODING 9882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +A8 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni269B +ENCODING 9883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +70 +D8 +70 +D8 +70 +A8 +ENDCHAR +STARTCHAR uni269C +ENCODING 9884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +88 +A8 +50 +50 +20 +ENDCHAR +STARTCHAR uni26A0 +ENCODING 9888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +A8 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni26A1 +ENCODING 9889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +F0 +20 +40 +80 +ENDCHAR +STARTCHAR uni26A2 +ENCODING 9890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +70 +50 +F8 +50 +ENDCHAR +STARTCHAR uni26A3 +ENCODING 9891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +20 +6C +98 +A8 +48 +30 +ENDCHAR +STARTCHAR uni26A4 +ENCODING 9892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +0C +0C +18 +64 +A4 +98 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26A5 +ENCODING 9893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +10 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A6 +ENCODING 9894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +0C +18 +18 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A7 +ENCODING 9895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +30 +48 +48 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A8 +ENCODING 9896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A9 +ENCODING 9897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +48 +ENDCHAR +STARTCHAR uni26AA +ENCODING 9898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AB +ENCODING 9899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26AC +ENCODING 9900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AD +ENCODING 9901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni26AE +ENCODING 9902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni26AF +ENCODING 9903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni26B0 +ENCODING 9904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +50 +88 +88 +88 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B1 +ENCODING 9905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +50 +70 +88 +88 +88 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B2 +ENCODING 9906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni26B3 +ENCODING 9907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +E0 +10 +10 +10 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26B4 +ENCODING 9908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +88 +50 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B5 +ENCODING 9909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B6 +ENCODING 9910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +88 +50 +20 +00 +D8 +20 +ENDCHAR +STARTCHAR uni26B7 +ENCODING 9911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +30 +20 +30 +28 +20 +70 +88 +70 +ENDCHAR +STARTCHAR uni26B8 +ENCODING 9912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +70 +C0 +C0 +C0 +C0 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B9 +ENCODING 9913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni26BA +ENCODING 9914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +ENDCHAR +STARTCHAR uni26BB +ENCODING 9915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni26BC +ENCODING 9916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +A8 +F8 +20 +30 +ENDCHAR +STARTCHAR uni26C0 +ENCODING 9920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C1 +ENCODING 9921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C2 +ENCODING 9922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26C3 +ENCODING 9923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +70 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +FC +20 +40 +60 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +C8 +30 +C8 +C4 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +40 +20 +FC +90 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +94 +E8 +30 +E8 +94 +CC +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +B4 +A4 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni2707 +ENCODING 9991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +84 +B4 +84 +CC +84 +78 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B0 +FC +B0 +20 +ENDCHAR +STARTCHAR uni2709 +ENCODING 9993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +CC +B4 +84 +FC +ENDCHAR +STARTCHAR uni270C +ENCODING 9996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +50 +70 +F0 +F0 +F0 +70 +ENDCHAR +STARTCHAR uni270D +ENCODING 9997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +04 +38 +7C +7C +40 +80 +ENDCHAR +STARTCHAR uni270E +ENCODING 9998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +50 +28 +14 +0C +ENDCHAR +STARTCHAR uni270F +ENCODING 9999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +F8 +8C +F8 +ENDCHAR +STARTCHAR uni2710 +ENCODING 10000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +14 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni2711 +ENCODING 10001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR uni2712 +ENCODING 10002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +F4 +F8 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +10 +10 +A0 +E0 +40 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +0C +1C +D8 +F8 +70 +30 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +F8 +20 +F8 +D8 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +80 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +CC +CC +78 +70 +FC +CC +C0 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +CC +A4 +F4 +A4 +CC +78 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +CC +CC +30 +30 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +50 +D8 +88 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +DC +BC +DC +58 +58 +58 +78 +78 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2721 +ENCODING 10017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +50 +50 +50 +F8 +20 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +30 +FC +FC +30 +78 +30 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +50 +20 +50 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +88 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +E8 +30 +50 +88 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +8C +58 +AC +58 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2739 +ENCODING 10041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +F8 +7C +F8 +7C +F8 +50 +ENDCHAR +STARTCHAR uni273A +ENCODING 10042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +A8 +74 +F8 +74 +A8 +50 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +D8 +50 +A8 +74 +A8 +20 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +F8 +D8 +70 +F8 +D8 +ENDCHAR +STARTCHAR uni2740 +ENCODING 10048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +D8 +A8 +50 +F8 +D8 +ENDCHAR +STARTCHAR uni2741 +ENCODING 10049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +D8 +70 +F8 +20 +ENDCHAR +STARTCHAR uni2742 +ENCODING 10050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +8C +8C +8C +78 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +38 +54 +EC +54 +38 +10 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +80 +E0 +F0 +60 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +F0 +70 +10 +60 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +90 +D8 +FC +48 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +FC +6C +24 +48 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +C8 +C8 +78 +08 +C8 +88 +70 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +F0 +F0 +78 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +B8 +20 +D8 +F8 +F0 +E4 +78 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +58 +78 +DC +98 +40 +ENDCHAR +STARTCHAR uni2768 +ENCODING 10088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2769 +ENCODING 10089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni276A +ENCODING 10090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +ENDCHAR +STARTCHAR uni276B +ENCODING 10091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni276C +ENCODING 10092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +30 +60 +60 +C0 +60 +60 +30 +30 +ENDCHAR +STARTCHAR uni276D +ENCODING 10093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +C0 +60 +60 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni276E +ENCODING 10094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR uni276F +ENCODING 10095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR uni2770 +ENCODING 10096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +38 +70 +70 +E0 +70 +70 +38 +38 +ENDCHAR +STARTCHAR uni2771 +ENCODING 10097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +E0 +70 +70 +38 +70 +70 +E0 +E0 +ENDCHAR +STARTCHAR uni2772 +ENCODING 10098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2773 +ENCODING 10099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2774 +ENCODING 10100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni2775 +ENCODING 10101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +18 +FC +18 +30 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +30 +FC +30 +40 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +38 +FC +FC +38 +30 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +FC +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +08 +BC +08 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +BC +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +F8 +FC +F8 +10 +ENDCHAR +STARTCHAR uni27A2 +ENCODING 10146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +48 +3C +78 +F0 +C0 +ENDCHAR +STARTCHAR uni27A3 +ENCODING 10147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +F0 +78 +3C +48 +B0 +C0 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +E0 +78 +3C +78 +E0 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +80 +90 +F8 +FC +78 +10 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +78 +FC +F8 +90 +80 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +F8 +FC +F8 +F0 +20 +ENDCHAR +STARTCHAR uni27A8 +ENCODING 10152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +F0 +FC +F0 +20 +ENDCHAR +STARTCHAR uni27A9 +ENCODING 10153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AA +ENCODING 10154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AB +ENCODING 10155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AC +ENCODING 10156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AD +ENCODING 10157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AE +ENCODING 10158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AF +ENCODING 10159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B1 +ENCODING 10161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +DC +0C +04 +0C +DC +78 +ENDCHAR +STARTCHAR uni27B3 +ENCODING 10163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +60 +10 +0C +0C +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +0C +10 +60 +E0 +40 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +E0 +E0 +14 +0C +1C +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +E8 +7C +E8 +C0 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +0C +14 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +E8 +FC +FC +E8 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +50 +E8 +04 +E8 +50 +ENDCHAR +STARTCHAR uni27C0 +ENCODING 10176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni27C1 +ENCODING 10177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +70 +A8 +F8 +ENDCHAR +STARTCHAR uni27C2 +ENCODING 10178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27C3 +ENCODING 10179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +90 +A8 +90 +80 +78 +ENDCHAR +STARTCHAR uni27C4 +ENCODING 10180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +48 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni27C5 +ENCODING 10181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +A0 +A0 +20 +20 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni27C6 +ENCODING 10182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +50 +50 +40 +40 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni27C7 +ENCODING 10183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni27C8 +ENCODING 10184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +80 +9C +A0 +A0 +A0 +5C +40 +40 +ENDCHAR +STARTCHAR uni27C9 +ENCODING 10185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +E4 +14 +14 +14 +E8 +08 +08 +ENDCHAR +STARTCHAR uni27CA +ENCODING 10186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni27CC +ENCODING 10188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni27D0 +ENCODING 10192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni27D1 +ENCODING 10193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +88 +ENDCHAR +STARTCHAR uni27D2 +ENCODING 10194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni27D3 +ENCODING 10195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +28 +08 +F8 +ENDCHAR +STARTCHAR uni27D4 +ENCODING 10196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +A0 +80 +80 +ENDCHAR +STARTCHAR uni27D5 +ENCODING 10197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +6C +54 +6C +C4 +ENDCHAR +STARTCHAR uni27D6 +ENCODING 10198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +8C +D8 +A8 +D8 +8C +ENDCHAR +STARTCHAR uni27D7 +ENCODING 10199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +48 +78 +CC +ENDCHAR +STARTCHAR uni27D8 +ENCODING 10200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27D9 +ENCODING 10201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni27DA +ENCODING 10202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +D8 +50 +D8 +50 +ENDCHAR +STARTCHAR uni27DB +ENCODING 10203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +50 +D8 +50 +50 +ENDCHAR +STARTCHAR uni27DC +ENCODING 10204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +40 +BC +40 +ENDCHAR +STARTCHAR uni27DD +ENCODING 10205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +80 +FC +80 +ENDCHAR +STARTCHAR uni27DE +ENCODING 10206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +04 +FC +04 +ENDCHAR +STARTCHAR uni27DF +ENCODING 10207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni27E0 +ENCODING 10208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni27E1 +ENCODING 10209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni27E2 +ENCODING 10210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +28 +C4 +28 +10 +ENDCHAR +STARTCHAR uni27E3 +ENCODING 10211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +50 +8C +50 +20 +ENDCHAR +STARTCHAR uni27E4 +ENCODING 10212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +7C +44 +C4 +44 +7C +ENDCHAR +STARTCHAR uni27E5 +ENCODING 10213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +88 +8C +88 +F8 +ENDCHAR +STARTCHAR uni27E6 +ENCODING 10214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni27E7 +ENCODING 10215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni27EA +ENCODING 10218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +ENDCHAR +STARTCHAR uni27EB +ENCODING 10219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +ENDCHAR +STARTCHAR uni27EC +ENCODING 10220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +60 +A0 +A0 +A0 +A0 +A0 +60 +20 +10 +ENDCHAR +STARTCHAR uni27ED +ENCODING 10221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 1 -2 +BITMAP +80 +40 +60 +50 +50 +50 +50 +50 +50 +60 +40 +80 +ENDCHAR +STARTCHAR uni27EE +ENCODING 10222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni27EF +ENCODING 10223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni27F0 +ENCODING 10224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni27F1 +ENCODING 10225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni27F2 +ENCODING 10226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +E4 +44 +04 +44 +38 +ENDCHAR +STARTCHAR uni27F3 +ENCODING 10227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +70 +88 +9C +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni27F4 +ENCODING 10228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni27F5 +ENCODING 10229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni27F6 +ENCODING 10230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni27F7 +ENCODING 10231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni27F8 +ENCODING 10232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +7C +80 +7C +20 +10 +ENDCHAR +STARTCHAR uni27F9 +ENCODING 10233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +F8 +04 +F8 +10 +20 +ENDCHAR +STARTCHAR uni27FA +ENCODING 10234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni27FB +ENCODING 10235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +44 +FC +44 +24 +ENDCHAR +STARTCHAR uni27FC +ENCODING 10236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +88 +FC +88 +90 +ENDCHAR +STARTCHAR uni27FD +ENCODING 10237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni27FE +ENCODING 10238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni27FF +ENCODING 10239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2900 +ENCODING 10496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +58 +FC +58 +40 +ENDCHAR +STARTCHAR uni2901 +ENCODING 10497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +68 +FC +68 +60 +ENDCHAR +STARTCHAR uni2902 +ENCODING 10498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +7C +88 +7C +28 +ENDCHAR +STARTCHAR uni2903 +ENCODING 10499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +F8 +44 +F8 +50 +ENDCHAR +STARTCHAR uni2904 +ENCODING 10500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +78 +A4 +78 +20 +ENDCHAR +STARTCHAR uni2905 +ENCODING 10501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +FC +98 +ENDCHAR +STARTCHAR uni2906 +ENCODING 10502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni2907 +ENCODING 10503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni2908 +ENCODING 10504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2909 +ENCODING 10505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni290A +ENCODING 10506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni290B +ENCODING 10507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni290C +ENCODING 10508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +EC +40 +20 +ENDCHAR +STARTCHAR uni290D +ENCODING 10509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +DC +08 +10 +ENDCHAR +STARTCHAR uni290E +ENCODING 10510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni290F +ENCODING 10511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni2910 +ENCODING 10512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +98 +6C +98 +ENDCHAR +STARTCHAR uni2911 +ENCODING 10513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni2912 +ENCODING 10514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2913 +ENCODING 10515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni2914 +ENCODING 10516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +A8 +7C +A8 +20 +ENDCHAR +STARTCHAR uni2915 +ENCODING 10517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +B8 +7C +B8 +30 +ENDCHAR +STARTCHAR uni2916 +ENCODING 10518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +7C +98 +ENDCHAR +STARTCHAR uni2917 +ENCODING 10519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B8 +7C +B8 +20 +ENDCHAR +STARTCHAR uni2918 +ENCODING 10520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +F8 +7C +F8 +60 +ENDCHAR +STARTCHAR uni2919 +ENCODING 10521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni291A +ENCODING 10522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +40 +3C +40 +80 +ENDCHAR +STARTCHAR uni291B +ENCODING 10523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +F0 +50 +28 +ENDCHAR +STARTCHAR uni291C +ENCODING 10524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +A0 +50 +3C +50 +A0 +ENDCHAR +STARTCHAR uni291D +ENCODING 10525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +10 +BC +10 +ENDCHAR +STARTCHAR uni291E +ENCODING 10526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +20 +F4 +20 +ENDCHAR +STARTCHAR uni291F +ENCODING 10527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +14 +BC +14 +ENDCHAR +STARTCHAR uni2920 +ENCODING 10528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +A0 +F4 +A0 +ENDCHAR +STARTCHAR uni2921 +ENCODING 10529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +C0 +A8 +18 +38 +ENDCHAR +STARTCHAR uni2922 +ENCODING 10530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +C0 +E0 +ENDCHAR +STARTCHAR uni2923 +ENCODING 10531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +C0 +A0 +10 +08 +18 +ENDCHAR +STARTCHAR uni2924 +ENCODING 10532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +18 +28 +40 +80 +C0 +ENDCHAR +STARTCHAR uni2925 +ENCODING 10533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2926 +ENCODING 10534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +08 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2927 +ENCODING 10535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2928 +ENCODING 10536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni2929 +ENCODING 10537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +D8 +ENDCHAR +STARTCHAR uni292A +ENCODING 10538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +D0 +20 +D0 +C8 +ENDCHAR +STARTCHAR uni292B +ENCODING 10539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292C +ENCODING 10540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292D +ENCODING 10541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292E +ENCODING 10542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292F +ENCODING 10543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +50 +88 +ENDCHAR +STARTCHAR uni2930 +ENCODING 10544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +58 +98 +ENDCHAR +STARTCHAR uni2931 +ENCODING 10545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2932 +ENCODING 10546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2933 +ENCODING 10547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +08 +ENDCHAR +STARTCHAR uni2934 +ENCODING 10548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +A8 +20 +C0 +ENDCHAR +STARTCHAR uni2935 +ENCODING 10549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2936 +ENCODING 10550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +28 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni2937 +ENCODING 10551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni2938 +ENCODING 10552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +20 +10 +10 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2939 +ENCODING 10553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +80 +80 +80 +50 +30 +70 +ENDCHAR +STARTCHAR uni293A +ENCODING 10554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni293B +ENCODING 10555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +38 +98 +68 +ENDCHAR +STARTCHAR uni293C +ENCODING 10556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +98 +38 +00 +F8 +ENDCHAR +STARTCHAR uni293D +ENCODING 10557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +B0 +C8 +E0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni293E +ENCODING 10558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +08 +E8 +C8 +B0 +ENDCHAR +STARTCHAR uni293F +ENCODING 10559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +80 +B8 +98 +68 +ENDCHAR +STARTCHAR uni2940 +ENCODING 10560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +20 +78 +A4 +94 +84 +84 +78 +ENDCHAR +STARTCHAR uni2941 +ENCODING 10561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +10 +78 +94 +A4 +84 +84 +78 +ENDCHAR +STARTCHAR uni2942 +ENCODING 10562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +FC +08 +10 +00 +40 +F0 +40 +ENDCHAR +STARTCHAR uni2943 +ENCODING 10563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +40 +FC +40 +20 +08 +3C +08 +ENDCHAR +STARTCHAR uni2944 +ENCODING 10564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni2945 +ENCODING 10565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2946 +ENCODING 10566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +10 +38 +10 +ENDCHAR +STARTCHAR uni2947 +ENCODING 10567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni2948 +ENCODING 10568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni2949 +ENCODING 10569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni294A +ENCODING 10570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +F8 +10 +ENDCHAR +STARTCHAR uni294B +ENCODING 10571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +F8 +40 +ENDCHAR +STARTCHAR uni294C +ENCODING 10572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni294D +ENCODING 10573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni294E +ENCODING 10574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +50 +F8 +ENDCHAR +STARTCHAR uni294F +ENCODING 10575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +80 +C0 +A0 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2950 +ENCODING 10576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +F8 +50 +ENDCHAR +STARTCHAR uni2951 +ENCODING 10577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2952 +ENCODING 10578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +90 +A0 +FC +80 +80 +ENDCHAR +STARTCHAR uni2953 +ENCODING 10579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +24 +14 +FC +04 +04 +ENDCHAR +STARTCHAR uni2954 +ENCODING 10580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +28 +20 +20 +20 +ENDCHAR +STARTCHAR uni2955 +ENCODING 10581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +28 +30 +20 +F8 +ENDCHAR +STARTCHAR uni2956 +ENCODING 10582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +80 +FC +A0 +90 +ENDCHAR +STARTCHAR uni2957 +ENCODING 10583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +04 +FC +14 +24 +ENDCHAR +STARTCHAR uni2958 +ENCODING 10584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2959 +ENCODING 10585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A0 +60 +20 +F8 +ENDCHAR +STARTCHAR uni295A +ENCODING 10586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +48 +F8 +08 +ENDCHAR +STARTCHAR uni295B +ENCODING 10587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +90 +F8 +80 +ENDCHAR +STARTCHAR uni295C +ENCODING 10588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni295D +ENCODING 10589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni295E +ENCODING 10590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +08 +F8 +48 +ENDCHAR +STARTCHAR uni295F +ENCODING 10591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +80 +F8 +90 +ENDCHAR +STARTCHAR uni2960 +ENCODING 10592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2961 +ENCODING 10593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2962 +ENCODING 10594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni2963 +ENCODING 10595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2964 +ENCODING 10596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2965 +ENCODING 10597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +D8 +50 +ENDCHAR +STARTCHAR uni2966 +ENCODING 10598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +F8 +00 +10 +F8 +ENDCHAR +STARTCHAR uni2967 +ENCODING 10599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2968 +ENCODING 10600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +F8 +00 +40 +F8 +ENDCHAR +STARTCHAR uni2969 +ENCODING 10601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296A +ENCODING 10602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296B +ENCODING 10603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296C +ENCODING 10604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +10 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296D +ENCODING 10605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni296E +ENCODING 10606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D0 +50 +50 +50 +58 +50 +ENDCHAR +STARTCHAR uni296F +ENCODING 10607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +58 +50 +50 +50 +D0 +50 +ENDCHAR +STARTCHAR uni2970 +ENCODING 10608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F0 +08 +F0 +ENDCHAR +STARTCHAR uni2971 +ENCODING 10609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +00 +E0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2972 +ENCODING 10610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2973 +ENCODING 10611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2974 +ENCODING 10612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2975 +ENCODING 10613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2976 +ENCODING 10614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +18 +60 +80 +60 +18 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2977 +ENCODING 10615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +50 +F8 +50 +08 +ENDCHAR +STARTCHAR uni2978 +ENCODING 10616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2979 +ENCODING 10617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni297A +ENCODING 10618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +0C +50 +F8 +50 +0C +ENDCHAR +STARTCHAR uni297B +ENCODING 10619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni297C +ENCODING 10620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +80 +78 +80 +40 +ENDCHAR +STARTCHAR uni297D +ENCODING 10621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +F0 +08 +10 +ENDCHAR +STARTCHAR uni297E +ENCODING 10622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni297F +ENCODING 10623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +20 +A8 +50 +ENDCHAR +STARTCHAR uni2980 +ENCODING 10624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2981 +ENCODING 10625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2982 +ENCODING 10626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2983 +ENCODING 10627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +50 +50 +50 +90 +50 +50 +50 +38 +ENDCHAR +STARTCHAR uni2984 +ENCODING 10628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +50 +50 +50 +48 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni2985 +ENCODING 10629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +10 +20 +60 +60 +A0 +A0 +60 +60 +20 +10 +ENDCHAR +STARTCHAR uni2986 +ENCODING 10630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +40 +60 +60 +50 +50 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2987 +ENCODING 10631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +60 +60 +A0 +A0 +A0 +A0 +60 +60 +20 +ENDCHAR +STARTCHAR uni2988 +ENCODING 10632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +C0 +C0 +A0 +A0 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni2989 +ENCODING 10633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +30 +30 +50 +50 +90 +50 +50 +30 +30 +10 +ENDCHAR +STARTCHAR uni298A +ENCODING 10634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +C0 +C0 +A0 +A0 +90 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni298B +ENCODING 10635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298C +ENCODING 10636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298D +ENCODING 10637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +C0 +A0 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni298E +ENCODING 10638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +A0 +60 +E0 +ENDCHAR +STARTCHAR uni298F +ENCODING 10639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2990 +ENCODING 10640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +60 +A0 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2991 +ENCODING 10641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +20 +40 +40 +90 +40 +40 +20 +20 +10 +ENDCHAR +STARTCHAR uni2992 +ENCODING 10642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +90 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2993 +ENCODING 10643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +38 +60 +A0 +60 +38 +20 +10 +ENDCHAR +STARTCHAR uni2994 +ENCODING 10644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +20 +E0 +30 +28 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR uni2995 +ENCODING 10645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +50 +D0 +70 +58 +70 +D0 +50 +28 +ENDCHAR +STARTCHAR uni2996 +ENCODING 10646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +50 +58 +70 +D0 +70 +58 +50 +A0 +ENDCHAR +STARTCHAR uni2997 +ENCODING 10647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2998 +ENCODING 10648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +60 +60 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2999 +ENCODING 10649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni299A +ENCODING 10650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni299B +ENCODING 10651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +28 +FC +ENDCHAR +STARTCHAR uni299C +ENCODING 10652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +E0 +A0 +F8 +ENDCHAR +STARTCHAR uni299D +ENCODING 10653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +80 +E0 +90 +A8 +88 +FC +ENDCHAR +STARTCHAR uni299E +ENCODING 10654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +20 +2C +48 +44 +8C +80 +FC +ENDCHAR +STARTCHAR uni299F +ENCODING 10655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +04 +18 +60 +FC +ENDCHAR +STARTCHAR uni29A0 +ENCODING 10656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +60 +38 +24 +38 +60 +90 +ENDCHAR +STARTCHAR uni29A1 +ENCODING 10657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +70 +D8 +20 +ENDCHAR +STARTCHAR uni29A2 +ENCODING 10658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR uni29A3 +ENCODING 10659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +08 +FC +ENDCHAR +STARTCHAR uni29A4 +ENCODING 10660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +10 +20 +40 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A5 +ENCODING 10661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +20 +10 +08 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A6 +ENCODING 10662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +40 +38 +ENDCHAR +STARTCHAR uni29A7 +ENCODING 10663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +40 +80 +ENDCHAR +STARTCHAR uni29A8 +ENCODING 10664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +18 +18 +20 +50 +FC +ENDCHAR +STARTCHAR uni29A9 +ENCODING 10665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +60 +10 +28 +FC +ENDCHAR +STARTCHAR uni29AA +ENCODING 10666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +50 +20 +18 +18 +ENDCHAR +STARTCHAR uni29AB +ENCODING 10667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +28 +10 +60 +60 +ENDCHAR +STARTCHAR uni29AC +ENCODING 10668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +98 +D8 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni29AD +ENCODING 10669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +C8 +D8 +28 +18 +08 +ENDCHAR +STARTCHAR uni29AE +ENCODING 10670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +C0 +A0 +D8 +98 +80 +ENDCHAR +STARTCHAR uni29AF +ENCODING 10671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +18 +28 +D8 +C8 +08 +ENDCHAR +STARTCHAR uni29B0 +ENCODING 10672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +70 +68 +58 +38 +04 +ENDCHAR +STARTCHAR uni29B1 +ENCODING 10673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +00 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B2 +ENCODING 10674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B3 +ENCODING 10675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +78 +10 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B4 +ENCODING 10676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +78 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B5 +ENCODING 10677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29B6 +ENCODING 10678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni29B7 +ENCODING 10679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni29B8 +ENCODING 10680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +C8 +A8 +98 +70 +ENDCHAR +STARTCHAR uni29B9 +ENCODING 10681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BA +ENCODING 10682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BB +ENCODING 10683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni29BC +ENCODING 10684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +CC +94 +A4 +CC +78 +ENDCHAR +STARTCHAR uni29BD +ENCODING 10685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29BE +ENCODING 10686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29BF +ENCODING 10687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni29C0 +ENCODING 10688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +A4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni29C1 +ENCODING 10689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29C2 +ENCODING 10690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +98 +94 +98 +60 +ENDCHAR +STARTCHAR uni29C3 +ENCODING 10691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +9C +90 +9C +60 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +F4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +D4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +FC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +90 +BC +E4 +24 +3C +ENDCHAR +STARTCHAR uni29CA +ENCODING 10698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni29CB +ENCODING 10699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29CC +ENCODING 10700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +48 +B4 +A4 +94 +B4 +84 +FC +ENDCHAR +STARTCHAR uni29CD +ENCODING 10701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +88 +88 +FC +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +B0 +88 +B0 +C0 +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +34 +54 +94 +54 +34 +14 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +B0 +A8 +A4 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni29D8 +ENCODING 10712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni29D9 +ENCODING 10713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni29DA +ENCODING 10714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +48 +90 +48 +90 +48 +90 +ENDCHAR +STARTCHAR uni29DB +ENCODING 10715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +48 +90 +48 +90 +48 +ENDCHAR +STARTCHAR uni29DC +ENCODING 10716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +40 +A8 +50 +ENDCHAR +STARTCHAR uni29DD +ENCODING 10717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +50 +A8 +50 +ENDCHAR +STARTCHAR uni29DE +ENCODING 10718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29DF +ENCODING 10719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni29E0 +ENCODING 10720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +F8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni29E1 +ENCODING 10721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +18 +28 +48 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29E2 +ENCODING 10722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni29E3 +ENCODING 10723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E4 +ENCODING 10724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E5 +ENCODING 10725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR uni29E6 +ENCODING 10726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +F8 +88 +ENDCHAR +STARTCHAR uni29E7 +ENCODING 10727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +98 +50 +20 +ENDCHAR +STARTCHAR uni29EA +ENCODING 10730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni29EB +ENCODING 10731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni29EC +ENCODING 10732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29ED +ENCODING 10733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +F8 +F8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29EE +ENCODING 10734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +A0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29EF +ENCODING 10735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +E0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29F0 +ENCODING 10736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +50 +88 +50 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F1 +ENCODING 10737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +70 +F8 +70 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F2 +ENCODING 10738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +88 +88 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F3 +ENCODING 10739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +F8 +F8 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F4 +ENCODING 10740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +10 +F8 +10 +A0 +ENDCHAR +STARTCHAR uni29F5 +ENCODING 10741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F6 +ENCODING 10742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +00 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F7 +ENCODING 10743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +F0 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F8 +ENCODING 10744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F9 +ENCODING 10745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29FA +ENCODING 10746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni29FB +ENCODING 10747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +54 +FC +54 +54 +ENDCHAR +STARTCHAR uni29FC +ENCODING 10748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni29FD +ENCODING 10749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29FE +ENCODING 10750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni29FF +ENCODING 10751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A07 +ENCODING 10759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A08 +ENCODING 10760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A0A +ENCODING 10762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +60 +50 +60 +80 +F8 +ENDCHAR +STARTCHAR uni2A0B +ENCODING 10763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +60 +20 +60 +F8 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0C +ENCODING 10764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +38 +7C +78 +78 +78 +78 +78 +78 +F8 +70 +ENDCHAR +STARTCHAR uni2A0D +ENCODING 10765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0E +ENCODING 10766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0F +ENCODING 10767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +28 +30 +60 +A0 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A10 +ENCODING 10768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A0 +A0 +A0 +60 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A11 +ENCODING 10769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +3C +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A12 +ENCODING 10770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +08 +28 +08 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A13 +ENCODING 10771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +30 +08 +28 +08 +30 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A14 +ENCODING 10772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +04 +14 +04 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A15 +ENCODING 10773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +88 +A8 +88 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A16 +ENCODING 10774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +A8 +A8 +F8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A17 +ENCODING 10775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +08 +14 +10 +10 +50 +FC +54 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2A18 +ENCODING 10776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +A8 +70 +20 +70 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A19 +ENCODING 10777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1A +ENCODING 10778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1B +ENCODING 10779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +78 +00 +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1C +ENCODING 10780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +F8 +ENDCHAR +STARTCHAR uni2A1D +ENCODING 10781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +CC +B4 +B4 +B4 +CC +84 +ENDCHAR +STARTCHAR uni2A1E +ENCODING 10782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni2A1F +ENCODING 10783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +80 +ENDCHAR +STARTCHAR uni2A20 +ENCODING 10784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR uni2A21 +ENCODING 10785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2A22 +ENCODING 10786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A23 +ENCODING 10787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A24 +ENCODING 10788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A25 +ENCODING 10789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2A26 +ENCODING 10790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A27 +ENCODING 10791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +20 +20 +F8 +20 +2C +04 +08 +1C +ENDCHAR +STARTCHAR uni2A28 +ENCODING 10792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +70 +20 +ENDCHAR +STARTCHAR uni2A29 +ENCODING 10793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +30 +10 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A2A +ENCODING 10794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A2B +ENCODING 10795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +00 +F8 +00 +10 +ENDCHAR +STARTCHAR uni2A2C +ENCODING 10796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +00 +F8 +00 +40 +ENDCHAR +STARTCHAR uni2A2D +ENCODING 10797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +90 +B8 +90 +40 +38 +ENDCHAR +STARTCHAR uni2A2E +ENCODING 10798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +48 +E8 +48 +10 +60 +ENDCHAR +STARTCHAR uni2A2F +ENCODING 10799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A30 +ENCODING 10800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A31 +ENCODING 10801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A32 +ENCODING 10802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni2A33 +ENCODING 10803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2A34 +ENCODING 10804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +A8 +90 +A8 +80 +70 +ENDCHAR +STARTCHAR uni2A35 +ENCODING 10805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +08 +A8 +48 +A8 +08 +70 +ENDCHAR +STARTCHAR uni2A36 +ENCODING 10806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A37 +ENCODING 10807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A38 +ENCODING 10808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +88 +F8 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A39 +ENCODING 10809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3A +ENCODING 10810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3B +ENCODING 10811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3C +ENCODING 10812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni2A3D +ENCODING 10813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni2A3E +ENCODING 10814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni2A3F +ENCODING 10815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +88 +88 +88 +88 +88 +FC +ENDCHAR +STARTCHAR uni2A40 +ENCODING 10816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A41 +ENCODING 10817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A42 +ENCODING 10818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A43 +ENCODING 10819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A44 +ENCODING 10820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +A8 +D8 +ENDCHAR +STARTCHAR uni2A45 +ENCODING 10821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +A8 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A46 +ENCODING 10822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +90 +90 +60 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A47 +ENCODING 10823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +90 +90 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A48 +ENCODING 10824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +90 +90 +60 +00 +F0 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A49 +ENCODING 10825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +60 +90 +90 +00 +F0 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A4A +ENCODING 10826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2A4B +ENCODING 10827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +A8 +A8 +ENDCHAR +STARTCHAR uni2A4C +ENCODING 10828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni2A4D +ENCODING 10829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR uni2A4E +ENCODING 10830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2A4F +ENCODING 10831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR uni2A50 +ENCODING 10832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A51 +ENCODING 10833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A52 +ENCODING 10834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A53 +ENCODING 10835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +20 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A54 +ENCODING 10836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +20 +50 +50 +ENDCHAR +STARTCHAR uni2A55 +ENCODING 10837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A56 +ENCODING 10838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A57 +ENCODING 10839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A58 +ENCODING 10840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR uni2A59 +ENCODING 10841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +70 +50 +70 +A8 +88 +ENDCHAR +STARTCHAR uni2A5A +ENCODING 10842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2A5B +ENCODING 10843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni2A5C +ENCODING 10844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5D +ENCODING 10845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A5E +ENCODING 10846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5F +ENCODING 10847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A60 +ENCODING 10848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A61 +ENCODING 10849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A62 +ENCODING 10850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A63 +ENCODING 10851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A64 +ENCODING 10852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +18 +28 +48 +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni2A65 +ENCODING 10853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +C0 +A0 +90 +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A66 +ENCODING 10854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A67 +ENCODING 10855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A68 +ENCODING 10856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2A69 +ENCODING 10857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +FC +A8 +FC +A8 +FC +A8 +ENDCHAR +STARTCHAR uni2A6A +ENCODING 10858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6B +ENCODING 10859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni2A6C +ENCODING 10860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6D +ENCODING 10861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6E +ENCODING 10862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6F +ENCODING 10863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A70 +ENCODING 10864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A71 +ENCODING 10865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A72 +ENCODING 10866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A73 +ENCODING 10867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A74 +ENCODING 10868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +AC +00 +AC +ENDCHAR +STARTCHAR uni2A75 +ENCODING 10869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +D8 +00 +D8 +ENDCHAR +STARTCHAR uni2A76 +ENCODING 10870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +00 +A8 +ENDCHAR +STARTCHAR uni2A77 +ENCODING 10871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +F8 +00 +F8 +00 +50 +ENDCHAR +STARTCHAR uni2A78 +ENCODING 10872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A79 +ENCODING 10873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +48 +94 +48 +20 +10 +ENDCHAR +STARTCHAR uni2A7A +ENCODING 10874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +48 +A4 +48 +10 +20 +ENDCHAR +STARTCHAR uni2A7B +ENCODING 10875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +40 +00 +40 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A7C +ENCODING 10876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +18 +04 +08 +00 +08 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A7D +ENCODING 10877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A7E +ENCODING 10878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A7F +ENCODING 10879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C4 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A80 +ENCODING 10880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +8C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A81 +ENCODING 10881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A82 +ENCODING 10882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A83 +ENCODING 10883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +00 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A84 +ENCODING 10884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +80 +00 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A85 +ENCODING 10885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A86 +ENCODING 10886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A87 +ENCODING 10887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A88 +ENCODING 10888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A89 +ENCODING 10889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8A +ENCODING 10890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8B +ENCODING 10891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A8C +ENCODING 10892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +F8 +00 +F8 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A8D +ENCODING 10893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8E +ENCODING 10894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8F +ENCODING 10895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A90 +ENCODING 10896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A91 +ENCODING 10897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A92 +ENCODING 10898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A93 +ENCODING 10899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +ENDCHAR +STARTCHAR uni2A94 +ENCODING 10900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +ENDCHAR +STARTCHAR uni2A95 +ENCODING 10901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A96 +ENCODING 10902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A97 +ENCODING 10903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni2A98 +ENCODING 10904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni2A99 +ENCODING 10905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9A +ENCODING 10906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9B +ENCODING 10907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +CC +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A9C +ENCODING 10908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +CC +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A9D +ENCODING 10909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A9E +ENCODING 10910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9F +ENCODING 10911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA0 +ENCODING 10912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA1 +ENCODING 10913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +48 +90 +48 +20 +10 +ENDCHAR +STARTCHAR uni2AA2 +ENCODING 10914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +90 +48 +90 +20 +40 +ENDCHAR +STARTCHAR uni2AA3 +ENCODING 10915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +24 +48 +90 +48 +24 +00 +FC +ENDCHAR +STARTCHAR uni2AA4 +ENCODING 10916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +48 +30 +CC +ENDCHAR +STARTCHAR uni2AA5 +ENCODING 10917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +84 +48 +30 +48 +84 +ENDCHAR +STARTCHAR uni2AA6 +ENCODING 10918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +34 +C4 +34 +08 +ENDCHAR +STARTCHAR uni2AA7 +ENCODING 10919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +B0 +8C +B0 +40 +ENDCHAR +STARTCHAR uni2AA8 +ENCODING 10920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +34 +C4 +34 +C8 +30 +0C +ENDCHAR +STARTCHAR uni2AA9 +ENCODING 10921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +B0 +8C +B0 +4C +30 +C0 +ENDCHAR +STARTCHAR uni2AAA +ENCODING 10922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +30 +FC +30 +0C +ENDCHAR +STARTCHAR uni2AAB +ENCODING 10923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +30 +FC +30 +C0 +ENDCHAR +STARTCHAR uni2AAC +ENCODING 10924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +FC +30 +0C +00 +FC +ENDCHAR +STARTCHAR uni2AAD +ENCODING 10925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +FC +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2AAE +ENCODING 10926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +D8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AAF +ENCODING 10927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +ENDCHAR +STARTCHAR uni2AB0 +ENCODING 10928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +ENDCHAR +STARTCHAR uni2AB1 +ENCODING 10929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB2 +ENCODING 10930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB3 +ENCODING 10931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB4 +ENCODING 10932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB5 +ENCODING 10933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB6 +ENCODING 10934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB7 +ENCODING 10935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AB8 +ENCODING 10936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +B0 +68 +00 +B0 +68 +ENDCHAR +STARTCHAR uni2AB9 +ENCODING 10937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +08 +30 +C0 +30 +08 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABA +ENCODING 10938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +60 +18 +60 +80 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABB +ENCODING 10939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +50 +A0 +50 +28 +28 +ENDCHAR +STARTCHAR uni2ABC +ENCODING 10940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +50 +28 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2ABD +ENCODING 10941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +A0 +80 +78 +ENDCHAR +STARTCHAR uni2ABE +ENCODING 10942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +28 +08 +F0 +ENDCHAR +STARTCHAR uni2ABF +ENCODING 10943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC0 +ENCODING 10944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC1 +ENCODING 10945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC2 +ENCODING 10946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC3 +ENCODING 10947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR uni2AC4 +ENCODING 10948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2AC5 +ENCODING 10949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC6 +ENCODING 10950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC7 +ENCODING 10951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC8 +ENCODING 10952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC9 +ENCODING 10953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACA +ENCODING 10954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACB +ENCODING 10955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACC +ENCODING 10956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACD +ENCODING 10957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +80 +80 +F0 +ENDCHAR +STARTCHAR uni2ACE +ENCODING 10958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +04 +04 +3C +ENDCHAR +STARTCHAR uni2ACF +ENCODING 10959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +88 +88 +88 +48 +38 +ENDCHAR +STARTCHAR uni2AD0 +ENCODING 10960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni2AD1 +ENCODING 10961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +48 +88 +88 +88 +48 +38 +00 +F8 +ENDCHAR +STARTCHAR uni2AD2 +ENCODING 10962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +00 +F8 +ENDCHAR +STARTCHAR uni2AD3 +ENCODING 10963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD4 +ENCODING 10964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD5 +ENCODING 10965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD6 +ENCODING 10966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD7 +ENCODING 10967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +CC +30 +30 +CC +ENDCHAR +STARTCHAR uni2AD8 +ENCODING 10968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +78 +30 +CC +ENDCHAR +STARTCHAR uni2AD9 +ENCODING 10969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADA +ENCODING 10970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADB +ENCODING 10971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR uni2ADC +ENCODING 10972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +28 +30 +A8 +E8 +F0 +ENDCHAR +STARTCHAR uni2ADD +ENCODING 10973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2ADE +ENCODING 10974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +10 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni2ADF +ENCODING 10975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE0 +ENCODING 10976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2AE1 +ENCODING 10977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +24 +28 +24 +28 +20 +FC +ENDCHAR +STARTCHAR uni2AE2 +ENCODING 10978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AE3 +ENCODING 10979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +28 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR uni2AE4 +ENCODING 10980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni2AE5 +ENCODING 10981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +E8 +28 +E8 +28 +28 +ENDCHAR +STARTCHAR uni2AE6 +ENCODING 10982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2AE7 +ENCODING 10983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE8 +ENCODING 10984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AE9 +ENCODING 10985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2AEA +ENCODING 10986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AEB +ENCODING 10987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni2AEC +ENCODING 10988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +08 +F8 +08 +ENDCHAR +STARTCHAR uni2AED +ENCODING 10989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AEE +ENCODING 10990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +C0 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni2AEF +ENCODING 10991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2AF0 +ENCODING 10992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF1 +ENCODING 10993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF2 +ENCODING 10994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF3 +ENCODING 10995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +78 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF4 +ENCODING 10996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF5 +ENCODING 10997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +FC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF6 +ENCODING 10998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2AF7 +ENCODING 10999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +54 +A8 +54 +ENDCHAR +STARTCHAR uni2AF8 +ENCODING 11000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +A8 +54 +A8 +ENDCHAR +STARTCHAR uni2AF9 +ENCODING 11001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +CC +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2AFA +ENCODING 11002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +CC +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2AFB +ENCODING 11003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +54 +54 +54 +54 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFC +ENCODING 11004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFD +ENCODING 11005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +48 +48 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2AFE +ENCODING 11006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2AFF +ENCODING 11007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +14 +2C +50 +A0 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +A0 +D0 +28 +14 +08 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A0 +50 +2C +14 +1C +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +14 +28 +D0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +48 +B4 +84 +B4 +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +60 +F8 +F8 +60 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +78 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +1C +3C +70 +E0 +40 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +E0 +F0 +38 +1C +08 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +70 +3C +1C +1C +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +1C +38 +F0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +FC +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B0E +ENCODING 11022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B0F +ENCODING 11023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2B10 +ENCODING 11024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B11 +ENCODING 11025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +38 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +68 +EC +68 +30 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +9C +58 +30 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B1F +ENCODING 11039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B20 +ENCODING 11040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +50 +70 +ENDCHAR +STARTCHAR uni2B21 +ENCODING 11041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B22 +ENCODING 11042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B23 +ENCODING 11043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +70 +F8 +70 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni2B25 +ENCODING 11045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B26 +ENCODING 11046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B27 +ENCODING 11047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B28 +ENCODING 11048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +50 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B29 +ENCODING 11049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2A +ENCODING 11050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B2B +ENCODING 11051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B30 +ENCODING 11056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B31 +ENCODING 11057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +F8 +40 +00 +40 +F8 +40 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B32 +ENCODING 11058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B33 +ENCODING 11059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +54 +E8 +40 +ENDCHAR +STARTCHAR uni2B34 +ENCODING 11060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +08 +68 +FC +68 +08 +ENDCHAR +STARTCHAR uni2B35 +ENCODING 11061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +78 +FC +78 +18 +ENDCHAR +STARTCHAR uni2B36 +ENCODING 11062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +68 +F8 +68 +08 +ENDCHAR +STARTCHAR uni2B37 +ENCODING 11063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +D8 +64 +ENDCHAR +STARTCHAR uni2B38 +ENCODING 11064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni2B39 +ENCODING 11065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +54 +F8 +54 +10 +ENDCHAR +STARTCHAR uni2B3A +ENCODING 11066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +74 +F8 +74 +30 +ENDCHAR +STARTCHAR uni2B3B +ENCODING 11067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +F8 +64 +ENDCHAR +STARTCHAR uni2B3C +ENCODING 11068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +74 +F8 +74 +10 +ENDCHAR +STARTCHAR uni2B3D +ENCODING 11069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +7C +F8 +7C +18 +ENDCHAR +STARTCHAR uni2B3E +ENCODING 11070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B3F +ENCODING 11071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +F4 +40 +ENDCHAR +STARTCHAR uni2B40 +ENCODING 11072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +00 +38 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B41 +ENCODING 11073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B42 +ENCODING 11074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B43 +ENCODING 11075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +80 +40 +28 +FC +28 +40 +80 +ENDCHAR +STARTCHAR uni2B44 +ENCODING 11076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +28 +FC +28 +C0 +ENDCHAR +STARTCHAR uni2B45 +ENCODING 11077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni2B46 +ENCODING 11078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni2B47 +ENCODING 11079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2B48 +ENCODING 11080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B49 +ENCODING 11081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B4A +ENCODING 11082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4B +ENCODING 11083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4C +ENCODING 11084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +78 +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +E8 +48 +70 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +A0 +40 +ENDCHAR +STARTCHAR uni2C65 +ENCODING 11365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +08 +70 +18 +78 +A8 +78 +40 +ENDCHAR +STARTCHAR uni2C66 +ENCODING 11366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +28 +28 +F8 +30 +20 +20 +58 +40 +ENDCHAR +STARTCHAR uni2C67 +ENCODING 11367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C68 +ENCODING 11368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C69 +ENCODING 11369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +90 +A0 +C0 +A0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6A +ENCODING 11370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +88 +90 +E0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6B +ENCODING 11371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +F8 +08 +10 +20 +40 +80 +FC +04 +ENDCHAR +STARTCHAR uni2C6C +ENCODING 11372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +F8 +10 +20 +40 +FC +04 +ENDCHAR +STARTCHAR uni2C6D +ENCODING 11373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +68 +98 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR uni2C6E +ENCODING 11374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni2C6F +ENCODING 11375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C71 +ENCODING 11377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2C72 +ENCODING 11378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C73 +ENCODING 11379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C74 +ENCODING 11380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +48 +A8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni2C75 +ENCODING 11381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2C76 +ENCODING 11382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni2C77 +ENCODING 11383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2C78 +ENCODING 11384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +70 +88 +F0 +80 +74 +18 +ENDCHAR +STARTCHAR uni2C79 +ENCODING 11385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +40 +40 +40 +C0 +ENDCHAR +STARTCHAR uni2C7A +ENCODING 11386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2C7B +ENCODING 11387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni2C7C +ENCODING 11388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2C7D +ENCODING 11389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2DE0 +ENCODING 11744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +60 +C0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2DE1 +ENCODING 11745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni2DE2 +ENCODING 11746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2DE3 +ENCODING 11747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +F0 +ENDCHAR +STARTCHAR uni2DE4 +ENCODING 11748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DE5 +ENCODING 11749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni2DE6 +ENCODING 11750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE7 +ENCODING 11751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +90 +ENDCHAR +STARTCHAR uni2DE8 +ENCODING 11752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE9 +ENCODING 11753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni2DEA +ENCODING 11754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2DEB +ENCODING 11755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DEC +ENCODING 11756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2DED +ENCODING 11757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni2DEE +ENCODING 11758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2DEF +ENCODING 11759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF0 +ENCODING 11760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 5 +BITMAP +A0 +A0 +A0 +B0 +10 +ENDCHAR +STARTCHAR uni2DF1 +ENCODING 11761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +60 +20 +20 +ENDCHAR +STARTCHAR uni2DF2 +ENCODING 11762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DF3 +ENCODING 11763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +A8 +A8 +A8 +AC +04 +ENDCHAR +STARTCHAR uni2DF4 +ENCODING 11764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +D0 +B0 +60 +ENDCHAR +STARTCHAR uni2DF5 +ENCODING 11765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +7C +88 +88 +68 +ENDCHAR +STARTCHAR uni2DF6 +ENCODING 11766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2DF7 +ENCODING 11767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2DF8 +ENCODING 11768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +40 +E0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF9 +ENCODING 11769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2DFA +ENCODING 11770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +40 +E0 +40 +60 +50 +60 +ENDCHAR +STARTCHAR uni2DFB +ENCODING 11771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +98 +A4 +E4 +A4 +98 +ENDCHAR +STARTCHAR uni2DFC +ENCODING 11772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +B0 +88 +F8 +A8 +98 +ENDCHAR +STARTCHAR uni2DFD +ENCODING 11773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +20 +50 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFE +ENCODING 11774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFF +ENCODING 11775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +FC +A8 +B8 +D4 +D4 +ENDCHAR +STARTCHAR ff +ENCODING 64256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR ffi +ENCODING 64259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR ffl +ENCODING 64260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uniFB05 +ENCODING 64261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +78 +D0 +50 +50 +48 +ENDCHAR +STARTCHAR uniFB06 +ENCODING 64262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +50 +78 +90 +50 +50 +88 +ENDCHAR +STARTCHAR uniFE20 +ENCODING 65056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +38 +C0 +ENDCHAR +STARTCHAR uniFE21 +ENCODING 65057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +E0 +18 +ENDCHAR +STARTCHAR uniFE22 +ENCODING 65058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +7C +80 +ENDCHAR +STARTCHAR uniFE23 +ENCODING 65059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +08 +F0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/marlin-6x12-2.bdf b/buildroot/share/fonts/marlin-6x12-2.bdf new file mode 100644 index 00000000..d36a6e9f --- /dev/null +++ b/buildroot/share/fonts/marlin-6x12-2.bdf @@ -0,0 +1,65510 @@ +STARTFONT 2.1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Marlin 6x12 Fixed, for menu display" +COMMENT "This font is base on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1', added Marlin symbols at position 1-9, added with jp-kana data; some chars were tweak for display on LCD screen, such as ',;c69' etc." +STARTPROPERTIES 23 +FONTNAME_REGISTRY "" +FOUNDRY "Marlin" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "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" +CAP_HEIGHT 7 +X_HEIGHT 5 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 10 +ENDPROPERTIES +CHARS 4635 + +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +C8 +88 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A8 +B8 +88 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +E0 +8C +EA +8C +8A +0A +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +C8 +10 +20 +40 +98 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +30 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 1 -1 +BITMAP +C0 +C0 +00 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 - +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +60 +90 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +A8 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +48 +30 +E0 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +40 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +90 +A0 +90 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +50 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +30 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +20 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +20 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +98 +88 +70 +10 +60 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +40 +60 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +88 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +88 +88 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +C0 +40 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +60 +C0 +40 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +60 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +20 +40 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +80 +50 +68 +48 +48 +48 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +08 +30 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +20 +40 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +18 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +30 +40 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +40 +40 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +28 +28 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +40 +40 +70 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +C8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +48 +48 +48 +68 +58 +48 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +68 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +B0 +A8 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +F0 +88 +88 +F0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +98 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +98 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +48 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +10 +A8 +A0 +A0 +A0 +60 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +F8 +40 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +30 +08 +70 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +78 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +E0 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +10 +C0 +A0 +B8 +A8 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +20 +20 +78 +A8 +B0 +B0 +78 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +A8 +D0 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +80 +98 +88 +88 +88 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C8 +40 +58 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E8 +A8 +A8 +A8 +A8 +88 +B0 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E8 +A0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +00 +58 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +98 +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +F8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +28 +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +A4 +A4 +A8 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +A0 +AC +A4 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A4 +A8 +6C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +C8 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +10 +10 +70 +90 +98 +94 +78 +20 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +40 +40 +40 +60 +50 +60 +80 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +E0 +90 +98 +94 +98 +20 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +40 +F0 +40 +60 +50 +A0 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +70 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +74 +88 +98 +F8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +48 +90 +90 +A0 +40 +B8 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A0 +C8 +F0 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +28 +30 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +10 +60 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +90 +F0 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +70 +A8 +F0 +C0 +F0 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +68 +98 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +F0 +48 +48 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +50 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +F8 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +78 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +10 +70 +90 +90 +90 +70 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +18 +74 +90 +60 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +68 +94 +20 +90 +60 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B0 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +70 +90 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +20 +68 +B0 +20 +20 +70 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +20 +60 +A0 +70 +20 +70 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +40 +78 +48 +50 +70 +E8 +48 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +A0 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +90 +70 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +80 +80 +80 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +08 +08 +08 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +A0 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +C0 +20 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +90 +60 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +20 +18 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +50 +F8 +20 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F8 +10 +30 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +68 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +30 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +38 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +10 +70 +90 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A8 +A8 +6C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +78 +A8 +B0 +B8 +68 +08 +38 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +B0 +78 +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +50 +48 +48 +30 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +54 +50 +F0 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +40 +E8 +50 +50 +50 +28 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +80 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +58 +60 +50 +48 +F0 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +78 +48 +50 +60 +F8 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +50 +00 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +00 +F8 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +08 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +04 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 3 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +20 +20 +A0 +60 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +20 +20 +A0 +60 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +A0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 4 +BITMAP +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 4 +BITMAP +80 +40 +40 +80 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 4 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +40 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +80 +40 +40 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +40 +A0 +A0 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 7 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +00 +40 +E0 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 3 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 0 +BITMAP +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +20 +F8 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 7 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +68 +A8 +10 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +60 +C0 +20 +C0 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni02EF +ENCODING 751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni02F0 +ENCODING 752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni02F1 +ENCODING 753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +10 +60 +80 +60 +10 +ENDCHAR +STARTCHAR uni02F2 +ENCODING 754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +80 +60 +10 +60 +80 +ENDCHAR +STARTCHAR uni02F3 +ENCODING 755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni02F4 +ENCODING 756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02F5 +ENCODING 757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni02F6 +ENCODING 758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02F7 +ENCODING 759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02F8 +ENCODING 760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni02F9 +ENCODING 761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +80 +ENDCHAR +STARTCHAR uni02FA +ENCODING 762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR uni02FB +ENCODING 763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +80 +80 +C0 +ENDCHAR +STARTCHAR uni02FC +ENCODING 764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR uni02FD +ENCODING 765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni02FE +ENCODING 766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 0 0 +BITMAP +80 +F0 +ENDCHAR +STARTCHAR uni02FF +ENCODING 767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 8 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 8 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +88 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +20 +40 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +40 +20 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +C0 +80 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 -2 +BITMAP +20 +A0 +40 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +F0 +90 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +60 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +F0 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +10 +20 +D8 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +E0 +A0 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 4 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +68 +B0 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni034F +ENCODING 847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni0350 +ENCODING 848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0351 +ENCODING 849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni0352 +ENCODING 850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +70 +88 +20 +ENDCHAR +STARTCHAR uni0353 +ENCODING 851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0354 +ENCODING 852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +38 +E0 +38 +ENDCHAR +STARTCHAR uni0355 +ENCODING 853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0356 +ENCODING 854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +08 +C8 +34 +D4 +ENDCHAR +STARTCHAR uni0357 +ENCODING 855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni0358 +ENCODING 856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni0359 +ENCODING 857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +E0 +ENDCHAR +STARTCHAR uni035A +ENCODING 858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +A8 +50 +ENDCHAR +STARTCHAR uni035B +ENCODING 859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +E0 +20 +ENDCHAR +STARTCHAR uni035C +ENCODING 860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni035D +ENCODING 861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni035E +ENCODING 862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +60 +98 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni0363 +ENCODING 867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0364 +ENCODING 868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +80 +60 +ENDCHAR +STARTCHAR uni0365 +ENCODING 869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 6 +BITMAP +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni0366 +ENCODING 870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0367 +ENCODING 871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0368 +ENCODING 872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR uni0369 +ENCODING 873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni036A +ENCODING 874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +C0 +A0 +ENDCHAR +STARTCHAR uni036B +ENCODING 875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +D0 +A8 +A8 +ENDCHAR +STARTCHAR uni036C +ENCODING 876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni036D +ENCODING 877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +40 +60 +ENDCHAR +STARTCHAR uni036E +ENCODING 878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni036F +ENCODING 879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +90 +B0 +D0 +90 +90 +08 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A0 +88 +70 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +28 +88 +70 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +E0 +40 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +90 +B0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 2 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +70 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +F8 +50 +50 +54 +48 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +90 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +30 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +C8 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +3C +08 +C8 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +D8 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +80 +80 +70 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +40 +48 +58 +68 +48 +08 +04 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +48 +18 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +48 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +48 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +88 +08 +70 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +90 +68 +08 +C8 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +10 +20 +40 +88 +70 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +10 +60 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +E0 +90 +88 +F0 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +30 +40 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +48 +70 +50 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +70 +48 +48 +70 +40 +E0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +B0 +C8 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +28 +08 +88 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +F0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +A0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +70 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +30 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +90 +70 +50 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A0 +F8 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +B8 +F8 +B8 +B8 +B8 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +90 +F8 +B8 +B8 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +50 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +C4 +A8 +90 +F8 +B8 +B8 +A8 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +A8 +90 +F8 +B8 +A8 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +30 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +A0 +A0 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +58 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +20 +88 +88 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +A8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +F8 +A8 +00 +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +10 +B0 +48 +40 +A0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +04 +FC +80 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +70 +8C +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +C8 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +98 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +60 +9C +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +80 +F0 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +A8 +70 +20 +70 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +08 +10 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +10 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +B0 +A0 +C0 +A0 +B0 +A8 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +B0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +E8 +50 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +48 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +48 +50 +60 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +F0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B8 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +90 +A8 +A8 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +90 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +A8 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +10 +60 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +38 +48 +48 +48 +48 +48 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +D8 +A8 +A8 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A8 +70 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +90 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +78 +40 +40 +E0 +40 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +40 +E0 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +60 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +60 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +20 +C0 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +48 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +20 +40 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A0 +A0 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A0 +A0 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +E8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +A8 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +FC +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +D4 +54 +48 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +A8 +B0 +D0 +88 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +C8 +B0 +A0 +D0 +88 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +70 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +70 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +90 +E8 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +D0 +50 +50 +58 +54 +54 +94 +04 +08 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +D0 +50 +58 +54 +94 +04 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +F0 +88 +80 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +A0 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +60 +90 +90 +80 +80 +80 +80 +F0 +08 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +B8 +D0 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +E8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +10 +20 +40 +80 +C0 +30 +08 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +38 +08 +70 +90 +68 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +A0 +A0 +20 +20 +20 +20 +30 +08 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +50 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A8 +A0 +A0 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +30 +28 +88 +88 +70 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +80 +C0 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +F0 +40 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +10 +20 +F8 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +A8 +A8 +28 +28 +08 +08 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +50 +30 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +E0 +90 +90 +88 +80 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +28 +28 +30 +A0 +70 +28 +20 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +70 +28 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 6 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +08 +70 +80 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +70 +88 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +C0 +88 +70 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +70 +08 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +B8 +D0 +A0 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +80 +80 +80 +A0 +D0 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +E8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +20 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +58 +28 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +90 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +18 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +10 +10 +20 +40 +80 +70 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +D0 +90 +90 +98 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +A8 +A8 +A8 +68 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +B0 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F8 +40 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +A0 +A0 +70 +28 +28 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +80 +70 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +20 +88 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +80 +A0 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 0 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni059B +ENCODING 1435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +20 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 6 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 2 5 +BITMAP +40 +90 +A0 +A0 +20 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +50 +A8 +50 +50 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +50 +D0 +20 +ENDCHAR +STARTCHAR uni05A2 +ENCODING 1442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +E0 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni05A7 +ENCODING 1447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 4 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni05AE +ENCODING 1454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +10 +50 +A0 +80 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 -2 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 1 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05BA +ENCODING 1466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 4 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 0 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05C5 +ENCODING 1477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni05C6 +ENCODING 1478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni05C7 +ENCODING 1479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +40 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +10 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 2 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +48 +88 +B8 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +30 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +28 +10 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +D8 +48 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +08 +08 +08 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +28 +28 +28 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +38 +38 +38 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +08 +08 +08 +FC +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +28 +28 +28 +FC +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +38 +38 +38 +FC +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +78 +78 +78 +FC +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +F8 +F8 +F8 +FC +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +38 +38 +FC +70 +70 +70 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +3C +3C +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +7C +7C +7C +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +10 +FC +10 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +28 +FC +28 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +38 +FC +38 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +FC +F8 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +10 +FC +10 +28 +28 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +FC +40 +58 +48 +78 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +D8 +70 +D8 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 3 +BITMAP +50 +F8 +50 +F8 +50 +F8 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +78 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +40 +20 +1C +20 +40 +80 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +04 +08 +F0 +08 +04 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +90 +A0 +C0 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +80 +90 +A0 +C0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +D0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +80 +80 +80 +C0 +A0 +80 +C0 +A0 +80 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +A8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +60 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +80 +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +70 +70 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +40 +90 +48 +10 +20 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +80 +80 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +40 +80 +40 +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 4 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +40 +40 +40 +40 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +C0 +A0 +90 +A0 +C0 +A0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +A0 +C0 +80 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +60 +50 +40 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +50 +20 +50 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +70 +A8 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +68 +88 +68 +18 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +E0 +40 +50 +70 +50 +10 +38 +10 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +10 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +10 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +78 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +18 +00 +20 +50 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +88 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +10 +20 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +10 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +40 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +9C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +5C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +54 +14 +14 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +10 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +48 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +50 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +10 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +88 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +90 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +20 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +50 +20 +68 +D4 +A8 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +58 +34 +68 +D4 +A8 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +88 +50 +20 +A8 +20 +50 +88 +20 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +20 +00 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 8 +BITMAP +FC +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +10 +20 +20 +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +20 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 2 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +80 +80 +E0 +80 +80 +E0 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +E0 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +B4 +24 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +88 +90 +90 +00 +90 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +E8 +E8 +78 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F0 +B8 +B8 +F0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -2 +BITMAP +40 +E0 +40 +00 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +70 +70 +A8 +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +90 +10 +20 +20 +40 +40 +90 +80 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -1 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2057 +ENCODING 8279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +7C +7C +F8 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +88 +88 +00 +20 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +20 +F8 +20 +A8 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 4 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 4 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -1 +BITMAP +40 +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 -2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +C0 +20 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +80 +B8 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +D0 +D0 +D8 +70 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +B0 +A0 +A8 +70 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +E0 +40 +E0 +48 +B0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +10 +F0 +A8 +A8 +A8 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +C8 +FC +A8 +FC +98 +88 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +FC +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +94 +B4 +B4 +B4 +B4 +A4 +98 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +00 +78 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +48 +50 +F8 +50 +48 +48 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +50 +48 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20B0 +ENCODING 8368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +28 +10 +10 +50 +68 +A8 +08 +10 +ENDCHAR +STARTCHAR uni20B1 +ENCODING 8369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +F8 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20B2 +ENCODING 8370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +B8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20B3 +ENCODING 8371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni20B4 +ENCODING 8372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +F8 +20 +F8 +40 +30 +ENDCHAR +STARTCHAR uni20B5 +ENCODING 8373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +B8 +90 +60 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 7 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni20E4 +ENCODING 8420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni20E7 +ENCODING 8423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni20E8 +ENCODING 8424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni20E9 +ENCODING 8425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni20EA +ENCODING 8426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +24 +24 +24 +48 +48 +90 +90 +90 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +10 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +40 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20F0 +ENCODING 8432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +A8 +70 +10 +20 +40 +58 +A0 +98 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +A8 +70 +10 +20 +58 +60 +90 +88 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +50 +A8 +90 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +68 +A8 +98 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +30 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C8 +48 +48 +70 +90 +90 +90 +08 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +B8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F0 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +08 +08 +10 +10 +20 +A0 +40 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +48 +10 +10 +08 +C8 +30 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +28 +20 +20 +40 +40 +64 +98 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +50 +50 +20 +60 +90 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +F0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +A4 +B4 +B4 +AC +A4 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +90 +D8 +B4 +98 +90 +9C +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +E8 +D8 +E8 +C8 +88 +70 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +58 +64 +64 +78 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +B0 +68 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +A0 +90 +90 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +68 +30 +30 +A8 +48 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +B0 +A8 +A8 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A8 +90 +A8 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +60 +20 +F0 +A8 +A8 +F0 +A0 +B0 +A8 +20 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +54 +9C +54 +94 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +40 +40 +70 +20 +30 +20 +30 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +20 +A8 +A8 +A8 +50 +50 +50 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +28 +48 +50 +90 +A0 +F8 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +10 +20 +78 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +28 +38 +28 +88 +70 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +90 +90 +E0 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +74 +90 +90 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +70 +80 +60 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +A0 +20 +78 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +6C +54 +44 +48 +48 +84 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +90 +90 +60 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +60 +00 +E0 +60 +60 +E0 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213B +ENCODING 8507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +E0 +80 +C0 +80 +70 +50 +70 +50 +14 +08 +14 +ENDCHAR +STARTCHAR uni213C +ENCODING 8508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +68 +68 +68 +68 +ENDCHAR +STARTCHAR uni213D +ENCODING 8509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +A8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A0 +50 +50 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR uni2141 +ENCODING 8513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +C8 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2142 +ENCODING 8514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2143 +ENCODING 8515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2144 +ENCODING 8516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +54 +54 +54 +A8 +A8 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +14 +14 +68 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +54 +54 +B8 +A0 +78 +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +78 +28 +28 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni214A +ENCODING 8522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F0 +A8 +A8 +B0 +20 +38 +ENDCHAR +STARTCHAR uni214B +ENCODING 8523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +48 +E8 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni214C +ENCODING 8524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +B8 +A4 +F4 +AC +F8 +A8 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni214D +ENCODING 8525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +E8 +B0 +10 +20 +48 +50 +88 +90 +ENDCHAR +STARTCHAR uni214E +ENCODING 8526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni214F +ENCODING 8527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +70 +70 +A8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +C8 +E8 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +E0 +28 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +90 +90 +90 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +48 +48 +48 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +54 +54 +54 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +DC +DC +DC +5C +5C +5C +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +48 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +AC +AC +AC +4C +AC +AC +AC +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +A8 +90 +90 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +A8 +48 +48 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +00 +D4 +D4 +D4 +D4 +54 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +00 +DC +DC +DC +DC +5C +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +48 +A8 +A8 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +00 +AC +AC +4C +AC +AC +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +E8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +F8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +90 +10 +90 +60 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +80 +80 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni2186 +ENCODING 8582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2187 +ENCODING 8583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +FC +FC +9C +FC +FC +F8 +ENDCHAR +STARTCHAR uni2188 +ENCODING 8584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +A8 +F8 +F8 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +78 +38 +28 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +40 +40 +20 +28 +38 +78 +18 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +50 +30 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +28 +FC +48 +50 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +C0 +D8 +64 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +0C +6C +98 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +50 +FC +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +28 +FC +28 +50 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +F0 +48 +24 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +3C +48 +90 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +48 +F8 +48 +28 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +90 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +44 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +88 +7C +08 +10 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +4C +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +C8 +FC +48 +50 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +48 +DC +EC +48 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +58 +FC +68 +40 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +B0 +D0 +90 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F0 +10 +38 +10 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +48 +F8 +40 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +30 +48 +48 +E8 +48 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +90 +90 +B8 +10 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +E0 +C0 +A0 +20 +10 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F0 +50 +50 +50 +50 +78 +50 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +00 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +00 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +7C +90 +7C +20 +50 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +58 +FC +A4 +FC +68 +40 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +F8 +24 +F8 +10 +28 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +A0 +D0 +A8 +94 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +14 +2C +54 +A4 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A4 +54 +2C +14 +7C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +94 +A8 +D0 +A0 +F8 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +40 +E8 +D4 +40 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +88 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +00 +20 +88 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +88 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +88 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +F0 +88 +F0 +A0 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +B0 +A0 +90 +10 +08 +08 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +48 +28 +68 +08 +F8 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +68 +FC +68 +10 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +78 +50 +50 +50 +50 +F0 +50 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +F8 +10 +10 +F8 +10 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +48 +FC +48 +50 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +38 +58 +FC +58 +38 +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +70 +68 +FC +68 +70 +ENDCHAR +STARTCHAR uni21FC +ENCODING 8700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +60 +B8 +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +E8 +30 +20 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +B4 +78 +30 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +F8 +18 +28 +78 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +70 +98 +A8 +C8 +70 +40 +40 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +48 +48 +48 +48 +48 +48 +48 +EC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +EC +48 +48 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +08 +08 +08 +08 +10 +D0 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +C4 +24 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +A4 +E8 +28 +28 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +58 +A0 +A0 +58 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +20 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +30 +48 +88 +48 +30 +10 +08 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +50 +58 +50 +70 +50 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +B0 +68 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +48 +A4 +94 +48 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +A8 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +20 +20 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +F8 +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +68 +B0 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +68 +B0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +00 +70 +88 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +00 +D8 +20 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +F8 +00 +F8 +00 +08 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +F8 +00 +F8 +00 +80 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B8 +00 +B8 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +E8 +00 +E8 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +50 +F8 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +4C +F8 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D0 +A8 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +30 +C0 +30 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +60 +18 +60 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +18 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +90 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +60 +A0 +60 +20 +30 +28 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +18 +70 +90 +60 +38 +E0 +30 +48 +70 +C0 +40 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +D0 +30 +18 +30 +E0 +38 +60 +C0 +60 +58 +40 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E0 +10 +E8 +10 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +38 +40 +B8 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +E0 +10 +08 +00 +68 +B0 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +38 +40 +80 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +28 +30 +E0 +30 +28 +20 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A0 +60 +38 +60 +A0 +20 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F8 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +B8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +AC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +90 +F8 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +F8 +A0 +F8 +C0 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A8 +A8 +BC +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A4 +A4 +BC +A8 +BC +B0 +B0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +08 +10 +E0 +10 +08 +10 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +80 +40 +38 +40 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +68 +88 +68 +18 +00 +F8 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +B8 +50 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +E8 +50 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +E8 +10 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +C0 +A0 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +88 +50 +20 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +50 +F8 +50 +88 +20 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +B0 +68 +00 +F8 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +98 +A0 +98 +40 +38 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +C8 +28 +C8 +10 +E0 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +60 +88 +60 +18 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +30 +88 +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +54 +A8 +54 +28 +14 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +A8 +54 +A8 +50 +A0 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E8 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +B8 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A0 +A0 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +28 +28 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +38 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +E0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +10 +E0 +10 +28 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +40 +38 +40 +A0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +38 +68 +A8 +68 +38 +20 +20 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +00 +00 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni22F2 +ENCODING 8946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +38 +ENDCHAR +STARTCHAR uni22F3 +ENCODING 8947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F4 +ENCODING 8948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F5 +ENCODING 8949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F6 +ENCODING 8950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F7 +ENCODING 8951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni22F8 +ENCODING 8952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +00 +F8 +ENDCHAR +STARTCHAR uni22F9 +ENCODING 8953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +80 +F0 +40 +38 +ENDCHAR +STARTCHAR uni22FA +ENCODING 8954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +10 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni22FB +ENCODING 8955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +88 +F8 +88 +10 +E0 +ENDCHAR +STARTCHAR uni22FC +ENCODING 8956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +10 +90 +F0 +90 +10 +E0 +ENDCHAR +STARTCHAR uni22FD +ENCODING 8957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni22FE +ENCODING 8958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni22FF +ENCODING 8959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +A8 +48 +B0 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +A8 +60 +20 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +40 +80 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +80 +80 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +50 +20 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +C8 +F0 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +70 +20 +70 +A8 +50 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +50 +50 +70 +A8 +B8 +88 +70 +50 +50 +70 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +70 +20 +20 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +18 +C0 +20 +18 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F0 +D8 +A4 +D8 +F0 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +3C +6C +94 +6C +3C +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +C8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +60 +D8 +30 +20 +40 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +5C +64 +38 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +00 +F8 +00 +70 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +48 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +40 +40 +A8 +FC +A8 +40 +40 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +80 +E0 +98 +FC +98 +E0 +80 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +F8 +88 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +D8 +88 +D8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +A8 +D8 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +88 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +F8 +40 +40 +80 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +F8 +10 +10 +08 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +98 +98 +A8 +A8 +A8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +C8 +C8 +A8 +A8 +A8 +98 +98 +F8 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +A8 +C8 +A8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +A8 +98 +A8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +50 +F8 +50 +10 +10 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +50 +F8 +50 +40 +40 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +C8 +F8 +C8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +98 +F8 +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +20 +70 +70 +A8 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +88 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +F8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +88 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +A0 +00 +00 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +78 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +50 +00 +00 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +F8 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +88 +88 +7C +D8 +A0 +20 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +E8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +20 +70 +20 +00 +30 +F8 +40 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +F8 +A8 +F8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +D8 +98 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +B8 +E8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +E8 +B8 +88 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +68 +00 +F8 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +60 +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +10 +00 +F8 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +A8 +A8 +50 +00 +F8 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +04 +08 +3C +10 +90 +60 +20 +ENDCHAR +STARTCHAR uni237C +ENCODING 9084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +40 +C0 +60 +40 +C0 +60 +50 +FC +C0 +E0 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +CC +48 +78 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +F8 +50 +D8 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +10 +70 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +48 +24 +6C +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +84 +A4 +10 +B4 +50 +B4 +84 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +D4 +D4 +D4 +F8 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A8 +A8 +A8 +A8 +F8 +20 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +50 +88 +24 +F4 +24 +88 +50 +20 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +1C +28 +40 +9C +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +84 +CC +B4 +78 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +FC +CC +B4 +84 +78 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E8 +C4 +A4 +14 +84 +78 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +C8 +00 +50 +A8 +50 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +50 +50 +50 +D8 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +88 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +F8 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +A8 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +48 +84 +48 +30 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +E0 +E0 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +BC +24 +84 +24 +FC +24 +84 +24 +3C +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +D4 +80 +84 +90 +FC +90 +84 +80 +54 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +68 +48 +CC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +A4 +D4 +AC +94 +78 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +60 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23B0 +ENCODING 9136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23B1 +ENCODING 9137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni23B2 +ENCODING 9138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni23B3 +ENCODING 9139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni23B4 +ENCODING 9140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni23B5 +ENCODING 9141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni23B6 +ENCODING 9142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +88 +F8 +00 +00 +F8 +88 +ENDCHAR +STARTCHAR uni23B7 +ENCODING 9143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +A0 +A0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR uni23B8 +ENCODING 9144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23B9 +ENCODING 9145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BE +ENCODING 9150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BF +ENCODING 9151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23C0 +ENCODING 9152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C1 +ENCODING 9153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C2 +ENCODING 9154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni23C3 +ENCODING 9155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C4 +ENCODING 9156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C5 +ENCODING 9157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +F8 +ENDCHAR +STARTCHAR uni23C6 +ENCODING 9158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C7 +ENCODING 9159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C8 +ENCODING 9160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23C9 +ENCODING 9161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23CA +ENCODING 9162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23CB +ENCODING 9163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23CC +ENCODING 9164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23CD +ENCODING 9165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni23CE +ENCODING 9166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +58 +F8 +F0 +40 +ENDCHAR +STARTCHAR uni23CF +ENCODING 9167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni23D0 +ENCODING 9168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23D1 +ENCODING 9169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni23D2 +ENCODING 9170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +88 +70 +ENDCHAR +STARTCHAR uni23D3 +ENCODING 9171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni23D4 +ENCODING 9172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +00 +B4 +48 +ENDCHAR +STARTCHAR uni23D5 +ENCODING 9173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +B4 +48 +00 +FC +ENDCHAR +STARTCHAR uni23D6 +ENCODING 9174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +B4 +48 +ENDCHAR +STARTCHAR uni23D7 +ENCODING 9175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni23D8 +ENCODING 9176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +F8 +ENDCHAR +STARTCHAR uni23D9 +ENCODING 9177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni23DA +ENCODING 9178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +F8 +00 +70 +00 +20 +ENDCHAR +STARTCHAR uni23DB +ENCODING 9179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +48 +FC +48 +78 +ENDCHAR +STARTCHAR uni23DC +ENCODING 9180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23DD +ENCODING 9181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23DE +ENCODING 9182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +30 +CC +84 +ENDCHAR +STARTCHAR uni23DF +ENCODING 9183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +84 +CC +30 +ENDCHAR +STARTCHAR uni23E0 +ENCODING 9184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23E1 +ENCODING 9185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23E2 +ENCODING 9186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +E0 +90 +88 +84 +FC +ENDCHAR +STARTCHAR uni23E3 +ENCODING 9187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +30 +78 +CC +84 +CC +78 +30 +ENDCHAR +STARTCHAR uni23E4 +ENCODING 9188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23E5 +ENCODING 9189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +7C +44 +88 +F8 +ENDCHAR +STARTCHAR uni23E6 +ENCODING 9190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +A0 +FC +14 +08 +ENDCHAR +STARTCHAR uni23E7 +ENCODING 9191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A4 +A8 +B0 +30 +48 +84 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E8 +68 +58 +48 +10 +28 +28 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +A0 +C0 +A0 +C0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +E0 +A0 +B8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +E0 +00 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +A0 +40 +78 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +80 +70 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +D0 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +38 +10 +10 +38 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +30 +08 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +20 +28 +38 +08 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +38 +34 +18 +14 +18 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +60 +00 +20 +50 +70 +50 +00 +68 +58 +48 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +80 +40 +E0 +50 +50 +20 +38 +14 +18 +14 +18 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +70 +00 +18 +20 +18 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +90 +90 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +30 +28 +30 +20 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +40 +F0 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +D0 +B0 +90 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +90 +A0 +28 +48 +90 +90 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +40 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +28 +28 +20 +20 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +D8 +C0 +C0 +D8 +18 +18 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +20 +20 +80 +80 +80 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +AC +AC +AC +A0 +A0 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +50 +50 +28 +28 +14 +14 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +D4 +DC +CC +DC +84 +78 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +EC +B4 +B4 +D4 +EC +84 +78 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +E8 +98 +A8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +D4 +DC +CC +DC +84 +48 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2487 +ENCODING 9351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +EC +B4 +B4 +D4 +EC +84 +48 +ENDCHAR +STARTCHAR uni2488 +ENCODING 9352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E8 +ENDCHAR +STARTCHAR uni2489 +ENCODING 9353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +10 +10 +20 +20 +40 +F4 +ENDCHAR +STARTCHAR uni248A +ENCODING 9354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +10 +60 +10 +10 +E4 +ENDCHAR +STARTCHAR uni248B +ENCODING 9355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +40 +90 +90 +F8 +10 +14 +ENDCHAR +STARTCHAR uni248C +ENCODING 9356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F0 +80 +E0 +10 +10 +90 +64 +ENDCHAR +STARTCHAR uni248D +ENCODING 9357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +40 +80 +E0 +90 +90 +64 +ENDCHAR +STARTCHAR uni248E +ENCODING 9358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +24 +ENDCHAR +STARTCHAR uni248F +ENCODING 9359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +60 +90 +90 +64 +ENDCHAR +STARTCHAR uni2490 +ENCODING 9360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +70 +10 +10 +64 +ENDCHAR +STARTCHAR uni2491 +ENCODING 9361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +A8 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2492 +ENCODING 9362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A8 +ENDCHAR +STARTCHAR uni2493 +ENCODING 9363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +A0 +A0 +B4 +ENDCHAR +STARTCHAR uni2494 +ENCODING 9364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +88 +88 +B4 +ENDCHAR +STARTCHAR uni2495 +ENCODING 9365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +B0 +B0 +B8 +90 +94 +ENDCHAR +STARTCHAR uni2496 +ENCODING 9366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +A0 +A0 +90 +90 +90 +A4 +ENDCHAR +STARTCHAR uni2497 +ENCODING 9367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +90 +A0 +B0 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2498 +ENCODING 9368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +88 +88 +88 +90 +90 +94 +ENDCHAR +STARTCHAR uni2499 +ENCODING 9369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +90 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni249A +ENCODING 9370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +98 +88 +90 +A4 +ENDCHAR +STARTCHAR uni249B +ENCODING 9371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +68 +68 +68 +A8 +A8 +D4 +ENDCHAR +STARTCHAR uni249C +ENCODING 9372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni249D +ENCODING 9373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +B4 +84 +48 +ENDCHAR +STARTCHAR uni249E +ENCODING 9374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni249F +ENCODING 9375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A0 +ENCODING 9376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +AC +BC +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A1 +ENCODING 9377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +A4 +F4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24A2 +ENCODING 9378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +D4 +B4 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A3 +ENCODING 9379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +AC +84 +48 +ENDCHAR +STARTCHAR uni24A4 +ENCODING 9380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A5 +ENCODING 9381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A6 +ENCODING 9382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A7 +ENCODING 9383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +94 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A8 +ENCODING 9384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +EC +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24A9 +ENCODING 9385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +E4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24AA +ENCODING 9386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24AB +ENCODING 9387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +AC +B4 +A4 +48 +ENDCHAR +STARTCHAR uni24AC +ENCODING 9388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +D4 +B4 +94 +48 +ENDCHAR +STARTCHAR uni24AD +ENCODING 9389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24AE +ENCODING 9390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +A4 +94 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24AF +ENCODING 9391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +F4 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24B0 +ENCODING 9392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +D4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B1 +ENCODING 9393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24B2 +ENCODING 9394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +C4 +D4 +BC +84 +48 +ENDCHAR +STARTCHAR uni24B3 +ENCODING 9395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +94 +AC +84 +48 +ENDCHAR +STARTCHAR uni24B4 +ENCODING 9396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +A4 +48 +ENDCHAR +STARTCHAR uni24B5 +ENCODING 9397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +94 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B6 +ENCODING 9398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24B7 +ENCODING 9399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24B8 +ENCODING 9400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +A4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24B9 +ENCODING 9401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +AC +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BA +ENCODING 9402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BB +ENCODING 9403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24BC +ENCODING 9404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +C4 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BD +ENCODING 9405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24BE +ENCODING 9406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24BF +ENCODING 9407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +94 +94 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C0 +ENCODING 9408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C1 +ENCODING 9409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C2 +ENCODING 9410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +AC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C3 +ENCODING 9411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C4 +ENCODING 9412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24C5 +ENCODING 9413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C6 +ENCODING 9414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +D4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24C7 +ENCODING 9415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C8 +ENCODING 9416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +9C +A4 +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C9 +ENCODING 9417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CA +ENCODING 9418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24CB +ENCODING 9419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CC +ENCODING 9420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +C4 +D4 +D4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CD +ENCODING 9421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CE +ENCODING 9422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CF +ENCODING 9423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24D0 +ENCODING 9424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D1 +ENCODING 9425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D2 +ENCODING 9426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D3 +ENCODING 9427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D4 +ENCODING 9428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D5 +ENCODING 9429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +F4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24D6 +ENCODING 9430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +D4 +B4 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24D7 +ENCODING 9431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24D8 +ENCODING 9432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D9 +ENCODING 9433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24DA +ENCODING 9434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24DB +ENCODING 9435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24DC +ENCODING 9436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +EC +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DD +ENCODING 9437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +E4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DE +ENCODING 9438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24DF +ENCODING 9439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +AC +B4 +A4 +78 +ENDCHAR +STARTCHAR uni24E0 +ENCODING 9440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24E1 +ENCODING 9441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24E2 +ENCODING 9442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +A4 +94 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E3 +ENCODING 9443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +F4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24E4 +ENCODING 9444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E5 +ENCODING 9445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24E6 +ENCODING 9446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +C4 +D4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24E7 +ENCODING 9447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +94 +AC +84 +78 +ENDCHAR +STARTCHAR uni24E8 +ENCODING 9448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +A4 +78 +ENDCHAR +STARTCHAR uni24E9 +ENCODING 9449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +94 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24EB +ENCODING 9451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24EC +ENCODING 9452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +B4 +AC +A4 +FC +78 +ENDCHAR +STARTCHAR uni24ED +ENCODING 9453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +AC +B4 +AC +FC +78 +ENDCHAR +STARTCHAR uni24EE +ENCODING 9454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A4 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24EF +ENCODING 9455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +AC +A4 +B4 +A4 +FC +78 +ENDCHAR +STARTCHAR uni24F0 +ENCODING 9456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F1 +ENCODING 9457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +B4 +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24F2 +ENCODING 9458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F3 +ENCODING 9459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B0 +B8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F4 +ENCODING 9460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +C8 +C8 +A8 +94 +FC +78 +ENDCHAR +STARTCHAR uni24F5 +ENCODING 9461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +E8 +A8 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F6 +ENCODING 9462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +98 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F7 +ENCODING 9463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +E8 +98 +A8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F8 +ENCODING 9464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +C8 +C8 +E8 +F8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F9 +ENCODING 9465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +C8 +E8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FA +ENCODING 9466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +B8 +C8 +E8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FB +ENCODING 9467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +98 +A8 +A8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FC +ENCODING 9468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +A8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FD +ENCODING 9469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +B8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FE +ENCODING 9470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +FC +84 +D4 +EC +EC +EC +D4 +84 +FC +78 +ENDCHAR +STARTCHAR uni24FF +ENCODING 9471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +B4 +B4 +CC +FC +78 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +3C +FC +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +3C +FC +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 2 2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 1 2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 3 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 3 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +1C +FC +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +E0 +FC +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +78 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +48 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +70 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +50 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +B4 +B4 +48 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +08 +80 +04 +40 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +FC +78 +30 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +E4 +68 +30 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +9C +58 +30 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +FC +78 +30 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +84 +48 +30 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +84 +48 +30 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +38 +78 +78 +F8 +78 +78 +38 +08 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +E0 +F0 +F0 +F8 +F0 +F0 +E0 +80 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +CC +B4 +78 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 3 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 0 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 0 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +48 +84 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +84 +48 +30 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +E8 +C8 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +B8 +F8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +70 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +88 +20 +70 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +60 +F8 +FC +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +20 +40 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +50 +A8 +50 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +50 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +90 +90 +60 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +30 +20 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2616 +ENCODING 9750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2617 +ENCODING 9751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +24 +74 +F8 +E8 +F4 +74 +28 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +7C +7C +3C +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +F8 +F8 +F0 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +4C +4C +3C +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +30 +F0 +D0 +90 +90 +F0 +F0 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +C8 +C8 +F0 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +F0 +F0 +90 +90 +D0 +F0 +30 +10 +10 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +A8 +F8 +70 +50 +20 +88 +70 +88 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +FC +48 +48 +30 +48 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +F8 +70 +50 +70 +50 +70 +50 +20 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +60 +30 +20 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +28 +30 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +88 +70 +70 +A8 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +EC +A4 +FC +78 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +F8 +A8 +A8 +F8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +88 +20 +50 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +C8 +28 +28 +28 +C8 +70 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +98 +A0 +A0 +A0 +98 +70 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +0C +74 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +28 +48 +F8 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +50 +68 +48 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +A8 +F8 +A8 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A8 +FC +A8 +A8 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +48 +30 +48 +48 +30 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +A0 +48 +14 +88 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +70 +88 +48 +28 +68 +A8 +48 +04 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +AC +FC +AC +AC +AC +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +A8 +F8 +A8 +A8 +A8 +A8 +A8 +0C +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +A8 +B0 +C8 +88 +30 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +70 +D8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +68 +88 +E8 +28 +28 +44 +7C +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +F8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +D8 +88 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +58 +F8 +F8 +38 +38 +7C +7C +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +88 +50 +20 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +90 +48 +00 +50 +88 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +48 +48 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +68 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +80 +90 +B0 +D0 +90 +B0 +D0 +90 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +A8 +70 +A8 +20 +20 +50 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +20 +D8 +A8 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni2672 +ENCODING 9842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +C8 +44 +8C +80 +94 +38 +10 +ENDCHAR +STARTCHAR uni2673 +ENCODING 9843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +58 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni2674 +ENCODING 9844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2675 +ENCODING 9845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2676 +ENCODING 9846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +94 +84 +DC +ENDCHAR +STARTCHAR uni2677 +ENCODING 9847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +20 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2678 +ENCODING 9848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +68 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2679 +ENCODING 9849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni267A +ENCODING 9850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +00 +84 +84 +DC +ENDCHAR +STARTCHAR uni267B +ENCODING 9851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +28 +CC +CC +80 +94 +B8 +10 +ENDCHAR +STARTCHAR uni267C +ENCODING 9852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +FC +C4 +D4 +30 +30 +7C +68 +44 +EC +FC +78 +ENDCHAR +STARTCHAR uni267D +ENCODING 9853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +30 +28 +CC +CC +80 +94 +B8 +10 +84 +78 +ENDCHAR +STARTCHAR uni267E +ENCODING 9854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +00 +50 +A8 +50 +00 +88 +70 +ENDCHAR +STARTCHAR uni267F +ENCODING 9855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +40 +78 +40 +F0 +98 +64 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +A8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +88 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +A8 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +88 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +A8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +D8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2686 +ENCODING 9862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +98 +88 +70 +ENDCHAR +STARTCHAR uni2687 +ENCODING 9863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2688 +ENCODING 9864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +E8 +F8 +70 +ENDCHAR +STARTCHAR uni2689 +ENCODING 9865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni268A +ENCODING 9866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni268B +ENCODING 9867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni268C +ENCODING 9868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268D +ENCODING 9869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268E +ENCODING 9870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni268F +ENCODING 9871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +98 +88 +C8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +F8 +F8 +F8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2692 +ENCODING 9874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +CC +B4 +30 +48 +84 +ENDCHAR +STARTCHAR uni2693 +ENCODING 9875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +F8 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2694 +ENCODING 9876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +88 +ENDCHAR +STARTCHAR uni2695 +ENCODING 9877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A0 +70 +28 +30 +60 +30 +20 +ENDCHAR +STARTCHAR uni2696 +ENCODING 9878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +A8 +88 +88 +D8 +D8 +ENDCHAR +STARTCHAR uni2697 +ENCODING 9879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +5C +88 +00 +1C +14 +ENDCHAR +STARTCHAR uni2698 +ENCODING 9880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2699 +ENCODING 9881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +A8 +88 +F8 +20 +ENDCHAR +STARTCHAR uni269A +ENCODING 9882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +A8 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni269B +ENCODING 9883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +70 +D8 +70 +D8 +70 +A8 +ENDCHAR +STARTCHAR uni269C +ENCODING 9884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +88 +A8 +50 +50 +20 +ENDCHAR +STARTCHAR uni26A0 +ENCODING 9888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +A8 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni26A1 +ENCODING 9889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +F0 +20 +40 +80 +ENDCHAR +STARTCHAR uni26A2 +ENCODING 9890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +70 +50 +F8 +50 +ENDCHAR +STARTCHAR uni26A3 +ENCODING 9891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +20 +6C +98 +A8 +48 +30 +ENDCHAR +STARTCHAR uni26A4 +ENCODING 9892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +0C +0C +18 +64 +A4 +98 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26A5 +ENCODING 9893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +10 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A6 +ENCODING 9894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +0C +18 +18 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A7 +ENCODING 9895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +30 +48 +48 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A8 +ENCODING 9896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A9 +ENCODING 9897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +48 +ENDCHAR +STARTCHAR uni26AA +ENCODING 9898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AB +ENCODING 9899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26AC +ENCODING 9900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AD +ENCODING 9901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni26AE +ENCODING 9902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni26AF +ENCODING 9903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni26B0 +ENCODING 9904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +50 +88 +88 +88 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B1 +ENCODING 9905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +50 +70 +88 +88 +88 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B2 +ENCODING 9906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni26B3 +ENCODING 9907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +E0 +10 +10 +10 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26B4 +ENCODING 9908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +88 +50 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B5 +ENCODING 9909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B6 +ENCODING 9910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +88 +50 +20 +00 +D8 +20 +ENDCHAR +STARTCHAR uni26B7 +ENCODING 9911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +30 +20 +30 +28 +20 +70 +88 +70 +ENDCHAR +STARTCHAR uni26B8 +ENCODING 9912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +70 +C0 +C0 +C0 +C0 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B9 +ENCODING 9913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni26BA +ENCODING 9914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +ENDCHAR +STARTCHAR uni26BB +ENCODING 9915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni26BC +ENCODING 9916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +A8 +F8 +20 +30 +ENDCHAR +STARTCHAR uni26C0 +ENCODING 9920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C1 +ENCODING 9921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C2 +ENCODING 9922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26C3 +ENCODING 9923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +70 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +FC +20 +40 +60 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +C8 +30 +C8 +C4 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +40 +20 +FC +90 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +94 +E8 +30 +E8 +94 +CC +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +B4 +A4 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni2707 +ENCODING 9991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +84 +B4 +84 +CC +84 +78 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B0 +FC +B0 +20 +ENDCHAR +STARTCHAR uni2709 +ENCODING 9993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +CC +B4 +84 +FC +ENDCHAR +STARTCHAR uni270C +ENCODING 9996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +50 +70 +F0 +F0 +F0 +70 +ENDCHAR +STARTCHAR uni270D +ENCODING 9997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +04 +38 +7C +7C +40 +80 +ENDCHAR +STARTCHAR uni270E +ENCODING 9998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +50 +28 +14 +0C +ENDCHAR +STARTCHAR uni270F +ENCODING 9999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +F8 +8C +F8 +ENDCHAR +STARTCHAR uni2710 +ENCODING 10000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +14 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni2711 +ENCODING 10001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR uni2712 +ENCODING 10002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +F4 +F8 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +10 +10 +A0 +E0 +40 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +0C +1C +D8 +F8 +70 +30 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +F8 +20 +F8 +D8 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +80 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +CC +CC +78 +70 +FC +CC +C0 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +CC +A4 +F4 +A4 +CC +78 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +CC +CC +30 +30 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +50 +D8 +88 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +DC +BC +DC +58 +58 +58 +78 +78 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2721 +ENCODING 10017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +50 +50 +50 +F8 +20 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +30 +FC +FC +30 +78 +30 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +50 +20 +50 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +88 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +E8 +30 +50 +88 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +8C +58 +AC +58 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2739 +ENCODING 10041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +F8 +7C +F8 +7C +F8 +50 +ENDCHAR +STARTCHAR uni273A +ENCODING 10042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +A8 +74 +F8 +74 +A8 +50 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +D8 +50 +A8 +74 +A8 +20 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +F8 +D8 +70 +F8 +D8 +ENDCHAR +STARTCHAR uni2740 +ENCODING 10048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +D8 +A8 +50 +F8 +D8 +ENDCHAR +STARTCHAR uni2741 +ENCODING 10049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +D8 +70 +F8 +20 +ENDCHAR +STARTCHAR uni2742 +ENCODING 10050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +8C +8C +8C +78 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +38 +54 +EC +54 +38 +10 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +80 +E0 +F0 +60 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +F0 +70 +10 +60 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +90 +D8 +FC +48 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +FC +6C +24 +48 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +C8 +C8 +78 +08 +C8 +88 +70 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +F0 +F0 +78 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +B8 +20 +D8 +F8 +F0 +E4 +78 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +58 +78 +DC +98 +40 +ENDCHAR +STARTCHAR uni2768 +ENCODING 10088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2769 +ENCODING 10089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni276A +ENCODING 10090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +ENDCHAR +STARTCHAR uni276B +ENCODING 10091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni276C +ENCODING 10092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +30 +60 +60 +C0 +60 +60 +30 +30 +ENDCHAR +STARTCHAR uni276D +ENCODING 10093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +C0 +60 +60 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni276E +ENCODING 10094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR uni276F +ENCODING 10095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR uni2770 +ENCODING 10096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +38 +70 +70 +E0 +70 +70 +38 +38 +ENDCHAR +STARTCHAR uni2771 +ENCODING 10097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +E0 +70 +70 +38 +70 +70 +E0 +E0 +ENDCHAR +STARTCHAR uni2772 +ENCODING 10098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2773 +ENCODING 10099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2774 +ENCODING 10100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni2775 +ENCODING 10101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +18 +FC +18 +30 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +30 +FC +30 +40 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +38 +FC +FC +38 +30 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +FC +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +08 +BC +08 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +BC +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +F8 +FC +F8 +10 +ENDCHAR +STARTCHAR uni27A2 +ENCODING 10146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +48 +3C +78 +F0 +C0 +ENDCHAR +STARTCHAR uni27A3 +ENCODING 10147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +F0 +78 +3C +48 +B0 +C0 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +E0 +78 +3C +78 +E0 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +80 +90 +F8 +FC +78 +10 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +78 +FC +F8 +90 +80 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +F8 +FC +F8 +F0 +20 +ENDCHAR +STARTCHAR uni27A8 +ENCODING 10152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +F0 +FC +F0 +20 +ENDCHAR +STARTCHAR uni27A9 +ENCODING 10153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AA +ENCODING 10154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AB +ENCODING 10155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AC +ENCODING 10156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AD +ENCODING 10157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AE +ENCODING 10158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AF +ENCODING 10159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B1 +ENCODING 10161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +DC +0C +04 +0C +DC +78 +ENDCHAR +STARTCHAR uni27B3 +ENCODING 10163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +60 +10 +0C +0C +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +0C +10 +60 +E0 +40 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +E0 +E0 +14 +0C +1C +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +E8 +7C +E8 +C0 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +0C +14 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +E8 +FC +FC +E8 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +50 +E8 +04 +E8 +50 +ENDCHAR +STARTCHAR uni27C0 +ENCODING 10176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni27C1 +ENCODING 10177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +70 +A8 +F8 +ENDCHAR +STARTCHAR uni27C2 +ENCODING 10178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27C3 +ENCODING 10179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +90 +A8 +90 +80 +78 +ENDCHAR +STARTCHAR uni27C4 +ENCODING 10180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +48 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni27C5 +ENCODING 10181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +A0 +A0 +20 +20 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni27C6 +ENCODING 10182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +50 +50 +40 +40 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni27C7 +ENCODING 10183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni27C8 +ENCODING 10184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +80 +9C +A0 +A0 +A0 +5C +40 +40 +ENDCHAR +STARTCHAR uni27C9 +ENCODING 10185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +E4 +14 +14 +14 +E8 +08 +08 +ENDCHAR +STARTCHAR uni27CA +ENCODING 10186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni27CC +ENCODING 10188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni27D0 +ENCODING 10192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni27D1 +ENCODING 10193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +88 +ENDCHAR +STARTCHAR uni27D2 +ENCODING 10194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni27D3 +ENCODING 10195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +28 +08 +F8 +ENDCHAR +STARTCHAR uni27D4 +ENCODING 10196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +A0 +80 +80 +ENDCHAR +STARTCHAR uni27D5 +ENCODING 10197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +6C +54 +6C +C4 +ENDCHAR +STARTCHAR uni27D6 +ENCODING 10198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +8C +D8 +A8 +D8 +8C +ENDCHAR +STARTCHAR uni27D7 +ENCODING 10199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +48 +78 +CC +ENDCHAR +STARTCHAR uni27D8 +ENCODING 10200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27D9 +ENCODING 10201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni27DA +ENCODING 10202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +D8 +50 +D8 +50 +ENDCHAR +STARTCHAR uni27DB +ENCODING 10203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +50 +D8 +50 +50 +ENDCHAR +STARTCHAR uni27DC +ENCODING 10204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +40 +BC +40 +ENDCHAR +STARTCHAR uni27DD +ENCODING 10205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +80 +FC +80 +ENDCHAR +STARTCHAR uni27DE +ENCODING 10206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +04 +FC +04 +ENDCHAR +STARTCHAR uni27DF +ENCODING 10207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni27E0 +ENCODING 10208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni27E1 +ENCODING 10209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni27E2 +ENCODING 10210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +28 +C4 +28 +10 +ENDCHAR +STARTCHAR uni27E3 +ENCODING 10211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +50 +8C +50 +20 +ENDCHAR +STARTCHAR uni27E4 +ENCODING 10212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +7C +44 +C4 +44 +7C +ENDCHAR +STARTCHAR uni27E5 +ENCODING 10213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +88 +8C +88 +F8 +ENDCHAR +STARTCHAR uni27E6 +ENCODING 10214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni27E7 +ENCODING 10215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni27EA +ENCODING 10218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +ENDCHAR +STARTCHAR uni27EB +ENCODING 10219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +ENDCHAR +STARTCHAR uni27EC +ENCODING 10220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +60 +A0 +A0 +A0 +A0 +A0 +60 +20 +10 +ENDCHAR +STARTCHAR uni27ED +ENCODING 10221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 1 -2 +BITMAP +80 +40 +60 +50 +50 +50 +50 +50 +50 +60 +40 +80 +ENDCHAR +STARTCHAR uni27EE +ENCODING 10222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni27EF +ENCODING 10223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni27F0 +ENCODING 10224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni27F1 +ENCODING 10225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni27F2 +ENCODING 10226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +E4 +44 +04 +44 +38 +ENDCHAR +STARTCHAR uni27F3 +ENCODING 10227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +70 +88 +9C +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni27F4 +ENCODING 10228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni27F5 +ENCODING 10229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni27F6 +ENCODING 10230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni27F7 +ENCODING 10231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni27F8 +ENCODING 10232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +7C +80 +7C +20 +10 +ENDCHAR +STARTCHAR uni27F9 +ENCODING 10233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +F8 +04 +F8 +10 +20 +ENDCHAR +STARTCHAR uni27FA +ENCODING 10234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni27FB +ENCODING 10235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +44 +FC +44 +24 +ENDCHAR +STARTCHAR uni27FC +ENCODING 10236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +88 +FC +88 +90 +ENDCHAR +STARTCHAR uni27FD +ENCODING 10237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni27FE +ENCODING 10238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni27FF +ENCODING 10239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2900 +ENCODING 10496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +58 +FC +58 +40 +ENDCHAR +STARTCHAR uni2901 +ENCODING 10497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +68 +FC +68 +60 +ENDCHAR +STARTCHAR uni2902 +ENCODING 10498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +7C +88 +7C +28 +ENDCHAR +STARTCHAR uni2903 +ENCODING 10499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +F8 +44 +F8 +50 +ENDCHAR +STARTCHAR uni2904 +ENCODING 10500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +78 +A4 +78 +20 +ENDCHAR +STARTCHAR uni2905 +ENCODING 10501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +FC +98 +ENDCHAR +STARTCHAR uni2906 +ENCODING 10502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni2907 +ENCODING 10503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni2908 +ENCODING 10504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2909 +ENCODING 10505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni290A +ENCODING 10506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni290B +ENCODING 10507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni290C +ENCODING 10508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +EC +40 +20 +ENDCHAR +STARTCHAR uni290D +ENCODING 10509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +DC +08 +10 +ENDCHAR +STARTCHAR uni290E +ENCODING 10510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni290F +ENCODING 10511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni2910 +ENCODING 10512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +98 +6C +98 +ENDCHAR +STARTCHAR uni2911 +ENCODING 10513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni2912 +ENCODING 10514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2913 +ENCODING 10515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni2914 +ENCODING 10516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +A8 +7C +A8 +20 +ENDCHAR +STARTCHAR uni2915 +ENCODING 10517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +B8 +7C +B8 +30 +ENDCHAR +STARTCHAR uni2916 +ENCODING 10518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +7C +98 +ENDCHAR +STARTCHAR uni2917 +ENCODING 10519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B8 +7C +B8 +20 +ENDCHAR +STARTCHAR uni2918 +ENCODING 10520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +F8 +7C +F8 +60 +ENDCHAR +STARTCHAR uni2919 +ENCODING 10521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni291A +ENCODING 10522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +40 +3C +40 +80 +ENDCHAR +STARTCHAR uni291B +ENCODING 10523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +F0 +50 +28 +ENDCHAR +STARTCHAR uni291C +ENCODING 10524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +A0 +50 +3C +50 +A0 +ENDCHAR +STARTCHAR uni291D +ENCODING 10525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +10 +BC +10 +ENDCHAR +STARTCHAR uni291E +ENCODING 10526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +20 +F4 +20 +ENDCHAR +STARTCHAR uni291F +ENCODING 10527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +14 +BC +14 +ENDCHAR +STARTCHAR uni2920 +ENCODING 10528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +A0 +F4 +A0 +ENDCHAR +STARTCHAR uni2921 +ENCODING 10529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +C0 +A8 +18 +38 +ENDCHAR +STARTCHAR uni2922 +ENCODING 10530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +C0 +E0 +ENDCHAR +STARTCHAR uni2923 +ENCODING 10531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +C0 +A0 +10 +08 +18 +ENDCHAR +STARTCHAR uni2924 +ENCODING 10532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +18 +28 +40 +80 +C0 +ENDCHAR +STARTCHAR uni2925 +ENCODING 10533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2926 +ENCODING 10534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +08 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2927 +ENCODING 10535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2928 +ENCODING 10536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni2929 +ENCODING 10537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +D8 +ENDCHAR +STARTCHAR uni292A +ENCODING 10538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +D0 +20 +D0 +C8 +ENDCHAR +STARTCHAR uni292B +ENCODING 10539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292C +ENCODING 10540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292D +ENCODING 10541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292E +ENCODING 10542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292F +ENCODING 10543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +50 +88 +ENDCHAR +STARTCHAR uni2930 +ENCODING 10544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +58 +98 +ENDCHAR +STARTCHAR uni2931 +ENCODING 10545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2932 +ENCODING 10546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2933 +ENCODING 10547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +08 +ENDCHAR +STARTCHAR uni2934 +ENCODING 10548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +A8 +20 +C0 +ENDCHAR +STARTCHAR uni2935 +ENCODING 10549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2936 +ENCODING 10550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +28 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni2937 +ENCODING 10551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni2938 +ENCODING 10552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +20 +10 +10 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2939 +ENCODING 10553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +80 +80 +80 +50 +30 +70 +ENDCHAR +STARTCHAR uni293A +ENCODING 10554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni293B +ENCODING 10555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +38 +98 +68 +ENDCHAR +STARTCHAR uni293C +ENCODING 10556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +98 +38 +00 +F8 +ENDCHAR +STARTCHAR uni293D +ENCODING 10557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +B0 +C8 +E0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni293E +ENCODING 10558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +08 +E8 +C8 +B0 +ENDCHAR +STARTCHAR uni293F +ENCODING 10559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +80 +B8 +98 +68 +ENDCHAR +STARTCHAR uni2940 +ENCODING 10560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +20 +78 +A4 +94 +84 +84 +78 +ENDCHAR +STARTCHAR uni2941 +ENCODING 10561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +10 +78 +94 +A4 +84 +84 +78 +ENDCHAR +STARTCHAR uni2942 +ENCODING 10562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +FC +08 +10 +00 +40 +F0 +40 +ENDCHAR +STARTCHAR uni2943 +ENCODING 10563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +40 +FC +40 +20 +08 +3C +08 +ENDCHAR +STARTCHAR uni2944 +ENCODING 10564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni2945 +ENCODING 10565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2946 +ENCODING 10566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +10 +38 +10 +ENDCHAR +STARTCHAR uni2947 +ENCODING 10567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni2948 +ENCODING 10568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni2949 +ENCODING 10569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni294A +ENCODING 10570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +F8 +10 +ENDCHAR +STARTCHAR uni294B +ENCODING 10571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +F8 +40 +ENDCHAR +STARTCHAR uni294C +ENCODING 10572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni294D +ENCODING 10573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni294E +ENCODING 10574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +50 +F8 +ENDCHAR +STARTCHAR uni294F +ENCODING 10575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +80 +C0 +A0 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2950 +ENCODING 10576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +F8 +50 +ENDCHAR +STARTCHAR uni2951 +ENCODING 10577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2952 +ENCODING 10578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +90 +A0 +FC +80 +80 +ENDCHAR +STARTCHAR uni2953 +ENCODING 10579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +24 +14 +FC +04 +04 +ENDCHAR +STARTCHAR uni2954 +ENCODING 10580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +28 +20 +20 +20 +ENDCHAR +STARTCHAR uni2955 +ENCODING 10581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +28 +30 +20 +F8 +ENDCHAR +STARTCHAR uni2956 +ENCODING 10582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +80 +FC +A0 +90 +ENDCHAR +STARTCHAR uni2957 +ENCODING 10583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +04 +FC +14 +24 +ENDCHAR +STARTCHAR uni2958 +ENCODING 10584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2959 +ENCODING 10585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A0 +60 +20 +F8 +ENDCHAR +STARTCHAR uni295A +ENCODING 10586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +48 +F8 +08 +ENDCHAR +STARTCHAR uni295B +ENCODING 10587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +90 +F8 +80 +ENDCHAR +STARTCHAR uni295C +ENCODING 10588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni295D +ENCODING 10589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni295E +ENCODING 10590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +08 +F8 +48 +ENDCHAR +STARTCHAR uni295F +ENCODING 10591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +80 +F8 +90 +ENDCHAR +STARTCHAR uni2960 +ENCODING 10592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2961 +ENCODING 10593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2962 +ENCODING 10594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni2963 +ENCODING 10595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2964 +ENCODING 10596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2965 +ENCODING 10597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +D8 +50 +ENDCHAR +STARTCHAR uni2966 +ENCODING 10598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +F8 +00 +10 +F8 +ENDCHAR +STARTCHAR uni2967 +ENCODING 10599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2968 +ENCODING 10600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +F8 +00 +40 +F8 +ENDCHAR +STARTCHAR uni2969 +ENCODING 10601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296A +ENCODING 10602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296B +ENCODING 10603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296C +ENCODING 10604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +10 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296D +ENCODING 10605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni296E +ENCODING 10606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D0 +50 +50 +50 +58 +50 +ENDCHAR +STARTCHAR uni296F +ENCODING 10607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +58 +50 +50 +50 +D0 +50 +ENDCHAR +STARTCHAR uni2970 +ENCODING 10608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F0 +08 +F0 +ENDCHAR +STARTCHAR uni2971 +ENCODING 10609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +00 +E0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2972 +ENCODING 10610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2973 +ENCODING 10611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2974 +ENCODING 10612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2975 +ENCODING 10613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2976 +ENCODING 10614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +18 +60 +80 +60 +18 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2977 +ENCODING 10615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +50 +F8 +50 +08 +ENDCHAR +STARTCHAR uni2978 +ENCODING 10616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2979 +ENCODING 10617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni297A +ENCODING 10618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +0C +50 +F8 +50 +0C +ENDCHAR +STARTCHAR uni297B +ENCODING 10619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni297C +ENCODING 10620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +80 +78 +80 +40 +ENDCHAR +STARTCHAR uni297D +ENCODING 10621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +F0 +08 +10 +ENDCHAR +STARTCHAR uni297E +ENCODING 10622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni297F +ENCODING 10623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +20 +A8 +50 +ENDCHAR +STARTCHAR uni2980 +ENCODING 10624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2981 +ENCODING 10625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2982 +ENCODING 10626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2983 +ENCODING 10627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +50 +50 +50 +90 +50 +50 +50 +38 +ENDCHAR +STARTCHAR uni2984 +ENCODING 10628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +50 +50 +50 +48 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni2985 +ENCODING 10629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +10 +20 +60 +60 +A0 +A0 +60 +60 +20 +10 +ENDCHAR +STARTCHAR uni2986 +ENCODING 10630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +40 +60 +60 +50 +50 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2987 +ENCODING 10631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +60 +60 +A0 +A0 +A0 +A0 +60 +60 +20 +ENDCHAR +STARTCHAR uni2988 +ENCODING 10632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +C0 +C0 +A0 +A0 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni2989 +ENCODING 10633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +30 +30 +50 +50 +90 +50 +50 +30 +30 +10 +ENDCHAR +STARTCHAR uni298A +ENCODING 10634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +C0 +C0 +A0 +A0 +90 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni298B +ENCODING 10635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298C +ENCODING 10636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298D +ENCODING 10637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +C0 +A0 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni298E +ENCODING 10638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +A0 +60 +E0 +ENDCHAR +STARTCHAR uni298F +ENCODING 10639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2990 +ENCODING 10640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +60 +A0 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2991 +ENCODING 10641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +20 +40 +40 +90 +40 +40 +20 +20 +10 +ENDCHAR +STARTCHAR uni2992 +ENCODING 10642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +90 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2993 +ENCODING 10643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +38 +60 +A0 +60 +38 +20 +10 +ENDCHAR +STARTCHAR uni2994 +ENCODING 10644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +20 +E0 +30 +28 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR uni2995 +ENCODING 10645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +50 +D0 +70 +58 +70 +D0 +50 +28 +ENDCHAR +STARTCHAR uni2996 +ENCODING 10646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +50 +58 +70 +D0 +70 +58 +50 +A0 +ENDCHAR +STARTCHAR uni2997 +ENCODING 10647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2998 +ENCODING 10648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +60 +60 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2999 +ENCODING 10649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni299A +ENCODING 10650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni299B +ENCODING 10651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +28 +FC +ENDCHAR +STARTCHAR uni299C +ENCODING 10652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +E0 +A0 +F8 +ENDCHAR +STARTCHAR uni299D +ENCODING 10653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +80 +E0 +90 +A8 +88 +FC +ENDCHAR +STARTCHAR uni299E +ENCODING 10654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +20 +2C +48 +44 +8C +80 +FC +ENDCHAR +STARTCHAR uni299F +ENCODING 10655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +04 +18 +60 +FC +ENDCHAR +STARTCHAR uni29A0 +ENCODING 10656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +60 +38 +24 +38 +60 +90 +ENDCHAR +STARTCHAR uni29A1 +ENCODING 10657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +70 +D8 +20 +ENDCHAR +STARTCHAR uni29A2 +ENCODING 10658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR uni29A3 +ENCODING 10659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +08 +FC +ENDCHAR +STARTCHAR uni29A4 +ENCODING 10660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +10 +20 +40 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A5 +ENCODING 10661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +20 +10 +08 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A6 +ENCODING 10662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +40 +38 +ENDCHAR +STARTCHAR uni29A7 +ENCODING 10663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +40 +80 +ENDCHAR +STARTCHAR uni29A8 +ENCODING 10664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +18 +18 +20 +50 +FC +ENDCHAR +STARTCHAR uni29A9 +ENCODING 10665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +60 +10 +28 +FC +ENDCHAR +STARTCHAR uni29AA +ENCODING 10666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +50 +20 +18 +18 +ENDCHAR +STARTCHAR uni29AB +ENCODING 10667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +28 +10 +60 +60 +ENDCHAR +STARTCHAR uni29AC +ENCODING 10668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +98 +D8 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni29AD +ENCODING 10669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +C8 +D8 +28 +18 +08 +ENDCHAR +STARTCHAR uni29AE +ENCODING 10670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +C0 +A0 +D8 +98 +80 +ENDCHAR +STARTCHAR uni29AF +ENCODING 10671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +18 +28 +D8 +C8 +08 +ENDCHAR +STARTCHAR uni29B0 +ENCODING 10672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +70 +68 +58 +38 +04 +ENDCHAR +STARTCHAR uni29B1 +ENCODING 10673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +00 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B2 +ENCODING 10674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B3 +ENCODING 10675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +78 +10 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B4 +ENCODING 10676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +78 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B5 +ENCODING 10677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29B6 +ENCODING 10678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni29B7 +ENCODING 10679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni29B8 +ENCODING 10680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +C8 +A8 +98 +70 +ENDCHAR +STARTCHAR uni29B9 +ENCODING 10681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BA +ENCODING 10682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BB +ENCODING 10683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni29BC +ENCODING 10684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +CC +94 +A4 +CC +78 +ENDCHAR +STARTCHAR uni29BD +ENCODING 10685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29BE +ENCODING 10686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29BF +ENCODING 10687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni29C0 +ENCODING 10688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +A4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni29C1 +ENCODING 10689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29C2 +ENCODING 10690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +98 +94 +98 +60 +ENDCHAR +STARTCHAR uni29C3 +ENCODING 10691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +9C +90 +9C +60 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +F4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +D4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +FC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +90 +BC +E4 +24 +3C +ENDCHAR +STARTCHAR uni29CA +ENCODING 10698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni29CB +ENCODING 10699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29CC +ENCODING 10700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +48 +B4 +A4 +94 +B4 +84 +FC +ENDCHAR +STARTCHAR uni29CD +ENCODING 10701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +88 +88 +FC +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +B0 +88 +B0 +C0 +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +34 +54 +94 +54 +34 +14 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +B0 +A8 +A4 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni29D8 +ENCODING 10712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni29D9 +ENCODING 10713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni29DA +ENCODING 10714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +48 +90 +48 +90 +48 +90 +ENDCHAR +STARTCHAR uni29DB +ENCODING 10715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +48 +90 +48 +90 +48 +ENDCHAR +STARTCHAR uni29DC +ENCODING 10716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +40 +A8 +50 +ENDCHAR +STARTCHAR uni29DD +ENCODING 10717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +50 +A8 +50 +ENDCHAR +STARTCHAR uni29DE +ENCODING 10718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29DF +ENCODING 10719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni29E0 +ENCODING 10720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +F8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni29E1 +ENCODING 10721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +18 +28 +48 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29E2 +ENCODING 10722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni29E3 +ENCODING 10723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E4 +ENCODING 10724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E5 +ENCODING 10725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR uni29E6 +ENCODING 10726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +F8 +88 +ENDCHAR +STARTCHAR uni29E7 +ENCODING 10727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +98 +50 +20 +ENDCHAR +STARTCHAR uni29EA +ENCODING 10730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni29EB +ENCODING 10731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni29EC +ENCODING 10732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29ED +ENCODING 10733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +F8 +F8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29EE +ENCODING 10734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +A0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29EF +ENCODING 10735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +E0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29F0 +ENCODING 10736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +50 +88 +50 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F1 +ENCODING 10737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +70 +F8 +70 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F2 +ENCODING 10738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +88 +88 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F3 +ENCODING 10739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +F8 +F8 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F4 +ENCODING 10740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +10 +F8 +10 +A0 +ENDCHAR +STARTCHAR uni29F5 +ENCODING 10741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F6 +ENCODING 10742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +00 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F7 +ENCODING 10743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +F0 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F8 +ENCODING 10744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F9 +ENCODING 10745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29FA +ENCODING 10746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni29FB +ENCODING 10747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +54 +FC +54 +54 +ENDCHAR +STARTCHAR uni29FC +ENCODING 10748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni29FD +ENCODING 10749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29FE +ENCODING 10750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni29FF +ENCODING 10751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A07 +ENCODING 10759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A08 +ENCODING 10760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A0A +ENCODING 10762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +60 +50 +60 +80 +F8 +ENDCHAR +STARTCHAR uni2A0B +ENCODING 10763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +60 +20 +60 +F8 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0C +ENCODING 10764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +38 +7C +78 +78 +78 +78 +78 +78 +F8 +70 +ENDCHAR +STARTCHAR uni2A0D +ENCODING 10765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0E +ENCODING 10766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0F +ENCODING 10767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +28 +30 +60 +A0 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A10 +ENCODING 10768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A0 +A0 +A0 +60 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A11 +ENCODING 10769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +3C +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A12 +ENCODING 10770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +08 +28 +08 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A13 +ENCODING 10771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +30 +08 +28 +08 +30 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A14 +ENCODING 10772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +04 +14 +04 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A15 +ENCODING 10773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +88 +A8 +88 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A16 +ENCODING 10774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +A8 +A8 +F8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A17 +ENCODING 10775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +08 +14 +10 +10 +50 +FC +54 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2A18 +ENCODING 10776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +A8 +70 +20 +70 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A19 +ENCODING 10777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1A +ENCODING 10778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1B +ENCODING 10779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +78 +00 +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1C +ENCODING 10780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +F8 +ENDCHAR +STARTCHAR uni2A1D +ENCODING 10781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +CC +B4 +B4 +B4 +CC +84 +ENDCHAR +STARTCHAR uni2A1E +ENCODING 10782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni2A1F +ENCODING 10783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +80 +ENDCHAR +STARTCHAR uni2A20 +ENCODING 10784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR uni2A21 +ENCODING 10785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2A22 +ENCODING 10786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A23 +ENCODING 10787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A24 +ENCODING 10788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A25 +ENCODING 10789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2A26 +ENCODING 10790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A27 +ENCODING 10791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +20 +20 +F8 +20 +2C +04 +08 +1C +ENDCHAR +STARTCHAR uni2A28 +ENCODING 10792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +70 +20 +ENDCHAR +STARTCHAR uni2A29 +ENCODING 10793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +30 +10 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A2A +ENCODING 10794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A2B +ENCODING 10795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +00 +F8 +00 +10 +ENDCHAR +STARTCHAR uni2A2C +ENCODING 10796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +00 +F8 +00 +40 +ENDCHAR +STARTCHAR uni2A2D +ENCODING 10797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +90 +B8 +90 +40 +38 +ENDCHAR +STARTCHAR uni2A2E +ENCODING 10798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +48 +E8 +48 +10 +60 +ENDCHAR +STARTCHAR uni2A2F +ENCODING 10799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A30 +ENCODING 10800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A31 +ENCODING 10801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A32 +ENCODING 10802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni2A33 +ENCODING 10803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2A34 +ENCODING 10804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +A8 +90 +A8 +80 +70 +ENDCHAR +STARTCHAR uni2A35 +ENCODING 10805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +08 +A8 +48 +A8 +08 +70 +ENDCHAR +STARTCHAR uni2A36 +ENCODING 10806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A37 +ENCODING 10807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A38 +ENCODING 10808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +88 +F8 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A39 +ENCODING 10809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3A +ENCODING 10810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3B +ENCODING 10811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3C +ENCODING 10812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni2A3D +ENCODING 10813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni2A3E +ENCODING 10814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni2A3F +ENCODING 10815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +88 +88 +88 +88 +88 +FC +ENDCHAR +STARTCHAR uni2A40 +ENCODING 10816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A41 +ENCODING 10817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A42 +ENCODING 10818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A43 +ENCODING 10819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A44 +ENCODING 10820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +A8 +D8 +ENDCHAR +STARTCHAR uni2A45 +ENCODING 10821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +A8 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A46 +ENCODING 10822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +90 +90 +60 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A47 +ENCODING 10823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +90 +90 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A48 +ENCODING 10824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +90 +90 +60 +00 +F0 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A49 +ENCODING 10825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +60 +90 +90 +00 +F0 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A4A +ENCODING 10826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2A4B +ENCODING 10827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +A8 +A8 +ENDCHAR +STARTCHAR uni2A4C +ENCODING 10828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni2A4D +ENCODING 10829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR uni2A4E +ENCODING 10830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2A4F +ENCODING 10831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR uni2A50 +ENCODING 10832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A51 +ENCODING 10833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A52 +ENCODING 10834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A53 +ENCODING 10835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +20 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A54 +ENCODING 10836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +20 +50 +50 +ENDCHAR +STARTCHAR uni2A55 +ENCODING 10837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A56 +ENCODING 10838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A57 +ENCODING 10839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A58 +ENCODING 10840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR uni2A59 +ENCODING 10841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +70 +50 +70 +A8 +88 +ENDCHAR +STARTCHAR uni2A5A +ENCODING 10842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2A5B +ENCODING 10843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni2A5C +ENCODING 10844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5D +ENCODING 10845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A5E +ENCODING 10846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5F +ENCODING 10847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A60 +ENCODING 10848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A61 +ENCODING 10849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A62 +ENCODING 10850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A63 +ENCODING 10851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A64 +ENCODING 10852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +18 +28 +48 +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni2A65 +ENCODING 10853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +C0 +A0 +90 +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A66 +ENCODING 10854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A67 +ENCODING 10855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A68 +ENCODING 10856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2A69 +ENCODING 10857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +FC +A8 +FC +A8 +FC +A8 +ENDCHAR +STARTCHAR uni2A6A +ENCODING 10858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6B +ENCODING 10859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni2A6C +ENCODING 10860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6D +ENCODING 10861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6E +ENCODING 10862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6F +ENCODING 10863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A70 +ENCODING 10864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A71 +ENCODING 10865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A72 +ENCODING 10866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A73 +ENCODING 10867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A74 +ENCODING 10868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +AC +00 +AC +ENDCHAR +STARTCHAR uni2A75 +ENCODING 10869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +D8 +00 +D8 +ENDCHAR +STARTCHAR uni2A76 +ENCODING 10870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +00 +A8 +ENDCHAR +STARTCHAR uni2A77 +ENCODING 10871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +F8 +00 +F8 +00 +50 +ENDCHAR +STARTCHAR uni2A78 +ENCODING 10872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A79 +ENCODING 10873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +48 +94 +48 +20 +10 +ENDCHAR +STARTCHAR uni2A7A +ENCODING 10874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +48 +A4 +48 +10 +20 +ENDCHAR +STARTCHAR uni2A7B +ENCODING 10875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +40 +00 +40 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A7C +ENCODING 10876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +18 +04 +08 +00 +08 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A7D +ENCODING 10877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A7E +ENCODING 10878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A7F +ENCODING 10879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C4 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A80 +ENCODING 10880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +8C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A81 +ENCODING 10881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A82 +ENCODING 10882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A83 +ENCODING 10883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +00 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A84 +ENCODING 10884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +80 +00 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A85 +ENCODING 10885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A86 +ENCODING 10886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A87 +ENCODING 10887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A88 +ENCODING 10888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A89 +ENCODING 10889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8A +ENCODING 10890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8B +ENCODING 10891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A8C +ENCODING 10892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +F8 +00 +F8 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A8D +ENCODING 10893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8E +ENCODING 10894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8F +ENCODING 10895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A90 +ENCODING 10896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A91 +ENCODING 10897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A92 +ENCODING 10898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A93 +ENCODING 10899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +ENDCHAR +STARTCHAR uni2A94 +ENCODING 10900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +ENDCHAR +STARTCHAR uni2A95 +ENCODING 10901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A96 +ENCODING 10902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A97 +ENCODING 10903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni2A98 +ENCODING 10904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni2A99 +ENCODING 10905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9A +ENCODING 10906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9B +ENCODING 10907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +CC +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A9C +ENCODING 10908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +CC +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A9D +ENCODING 10909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A9E +ENCODING 10910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9F +ENCODING 10911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA0 +ENCODING 10912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA1 +ENCODING 10913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +48 +90 +48 +20 +10 +ENDCHAR +STARTCHAR uni2AA2 +ENCODING 10914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +90 +48 +90 +20 +40 +ENDCHAR +STARTCHAR uni2AA3 +ENCODING 10915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +24 +48 +90 +48 +24 +00 +FC +ENDCHAR +STARTCHAR uni2AA4 +ENCODING 10916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +48 +30 +CC +ENDCHAR +STARTCHAR uni2AA5 +ENCODING 10917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +84 +48 +30 +48 +84 +ENDCHAR +STARTCHAR uni2AA6 +ENCODING 10918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +34 +C4 +34 +08 +ENDCHAR +STARTCHAR uni2AA7 +ENCODING 10919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +B0 +8C +B0 +40 +ENDCHAR +STARTCHAR uni2AA8 +ENCODING 10920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +34 +C4 +34 +C8 +30 +0C +ENDCHAR +STARTCHAR uni2AA9 +ENCODING 10921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +B0 +8C +B0 +4C +30 +C0 +ENDCHAR +STARTCHAR uni2AAA +ENCODING 10922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +30 +FC +30 +0C +ENDCHAR +STARTCHAR uni2AAB +ENCODING 10923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +30 +FC +30 +C0 +ENDCHAR +STARTCHAR uni2AAC +ENCODING 10924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +FC +30 +0C +00 +FC +ENDCHAR +STARTCHAR uni2AAD +ENCODING 10925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +FC +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2AAE +ENCODING 10926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +D8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AAF +ENCODING 10927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +ENDCHAR +STARTCHAR uni2AB0 +ENCODING 10928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +ENDCHAR +STARTCHAR uni2AB1 +ENCODING 10929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB2 +ENCODING 10930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB3 +ENCODING 10931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB4 +ENCODING 10932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB5 +ENCODING 10933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB6 +ENCODING 10934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB7 +ENCODING 10935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AB8 +ENCODING 10936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +B0 +68 +00 +B0 +68 +ENDCHAR +STARTCHAR uni2AB9 +ENCODING 10937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +08 +30 +C0 +30 +08 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABA +ENCODING 10938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +60 +18 +60 +80 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABB +ENCODING 10939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +50 +A0 +50 +28 +28 +ENDCHAR +STARTCHAR uni2ABC +ENCODING 10940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +50 +28 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2ABD +ENCODING 10941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +A0 +80 +78 +ENDCHAR +STARTCHAR uni2ABE +ENCODING 10942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +28 +08 +F0 +ENDCHAR +STARTCHAR uni2ABF +ENCODING 10943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC0 +ENCODING 10944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC1 +ENCODING 10945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC2 +ENCODING 10946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC3 +ENCODING 10947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR uni2AC4 +ENCODING 10948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2AC5 +ENCODING 10949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC6 +ENCODING 10950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC7 +ENCODING 10951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC8 +ENCODING 10952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC9 +ENCODING 10953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACA +ENCODING 10954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACB +ENCODING 10955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACC +ENCODING 10956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACD +ENCODING 10957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +80 +80 +F0 +ENDCHAR +STARTCHAR uni2ACE +ENCODING 10958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +04 +04 +3C +ENDCHAR +STARTCHAR uni2ACF +ENCODING 10959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +88 +88 +88 +48 +38 +ENDCHAR +STARTCHAR uni2AD0 +ENCODING 10960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni2AD1 +ENCODING 10961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +48 +88 +88 +88 +48 +38 +00 +F8 +ENDCHAR +STARTCHAR uni2AD2 +ENCODING 10962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +00 +F8 +ENDCHAR +STARTCHAR uni2AD3 +ENCODING 10963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD4 +ENCODING 10964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD5 +ENCODING 10965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD6 +ENCODING 10966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD7 +ENCODING 10967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +CC +30 +30 +CC +ENDCHAR +STARTCHAR uni2AD8 +ENCODING 10968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +78 +30 +CC +ENDCHAR +STARTCHAR uni2AD9 +ENCODING 10969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADA +ENCODING 10970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADB +ENCODING 10971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR uni2ADC +ENCODING 10972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +28 +30 +A8 +E8 +F0 +ENDCHAR +STARTCHAR uni2ADD +ENCODING 10973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2ADE +ENCODING 10974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +10 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni2ADF +ENCODING 10975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE0 +ENCODING 10976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2AE1 +ENCODING 10977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +24 +28 +24 +28 +20 +FC +ENDCHAR +STARTCHAR uni2AE2 +ENCODING 10978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AE3 +ENCODING 10979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +28 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR uni2AE4 +ENCODING 10980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni2AE5 +ENCODING 10981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +E8 +28 +E8 +28 +28 +ENDCHAR +STARTCHAR uni2AE6 +ENCODING 10982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2AE7 +ENCODING 10983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE8 +ENCODING 10984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AE9 +ENCODING 10985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2AEA +ENCODING 10986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AEB +ENCODING 10987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni2AEC +ENCODING 10988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +08 +F8 +08 +ENDCHAR +STARTCHAR uni2AED +ENCODING 10989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AEE +ENCODING 10990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +C0 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni2AEF +ENCODING 10991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2AF0 +ENCODING 10992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF1 +ENCODING 10993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF2 +ENCODING 10994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF3 +ENCODING 10995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +78 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF4 +ENCODING 10996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF5 +ENCODING 10997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +FC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF6 +ENCODING 10998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2AF7 +ENCODING 10999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +54 +A8 +54 +ENDCHAR +STARTCHAR uni2AF8 +ENCODING 11000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +A8 +54 +A8 +ENDCHAR +STARTCHAR uni2AF9 +ENCODING 11001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +CC +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2AFA +ENCODING 11002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +CC +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2AFB +ENCODING 11003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +54 +54 +54 +54 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFC +ENCODING 11004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFD +ENCODING 11005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +48 +48 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2AFE +ENCODING 11006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2AFF +ENCODING 11007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +14 +2C +50 +A0 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +A0 +D0 +28 +14 +08 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A0 +50 +2C +14 +1C +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +14 +28 +D0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +48 +B4 +84 +B4 +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +60 +F8 +F8 +60 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +78 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +1C +3C +70 +E0 +40 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +E0 +F0 +38 +1C +08 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +70 +3C +1C +1C +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +1C +38 +F0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +FC +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B0E +ENCODING 11022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B0F +ENCODING 11023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2B10 +ENCODING 11024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B11 +ENCODING 11025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +38 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +68 +EC +68 +30 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +9C +58 +30 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B1F +ENCODING 11039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B20 +ENCODING 11040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +50 +70 +ENDCHAR +STARTCHAR uni2B21 +ENCODING 11041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B22 +ENCODING 11042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B23 +ENCODING 11043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +70 +F8 +70 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni2B25 +ENCODING 11045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B26 +ENCODING 11046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B27 +ENCODING 11047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B28 +ENCODING 11048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +50 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B29 +ENCODING 11049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2A +ENCODING 11050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B2B +ENCODING 11051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B30 +ENCODING 11056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B31 +ENCODING 11057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +F8 +40 +00 +40 +F8 +40 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B32 +ENCODING 11058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B33 +ENCODING 11059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +54 +E8 +40 +ENDCHAR +STARTCHAR uni2B34 +ENCODING 11060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +08 +68 +FC +68 +08 +ENDCHAR +STARTCHAR uni2B35 +ENCODING 11061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +78 +FC +78 +18 +ENDCHAR +STARTCHAR uni2B36 +ENCODING 11062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +68 +F8 +68 +08 +ENDCHAR +STARTCHAR uni2B37 +ENCODING 11063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +D8 +64 +ENDCHAR +STARTCHAR uni2B38 +ENCODING 11064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni2B39 +ENCODING 11065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +54 +F8 +54 +10 +ENDCHAR +STARTCHAR uni2B3A +ENCODING 11066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +74 +F8 +74 +30 +ENDCHAR +STARTCHAR uni2B3B +ENCODING 11067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +F8 +64 +ENDCHAR +STARTCHAR uni2B3C +ENCODING 11068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +74 +F8 +74 +10 +ENDCHAR +STARTCHAR uni2B3D +ENCODING 11069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +7C +F8 +7C +18 +ENDCHAR +STARTCHAR uni2B3E +ENCODING 11070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B3F +ENCODING 11071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +F4 +40 +ENDCHAR +STARTCHAR uni2B40 +ENCODING 11072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +00 +38 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B41 +ENCODING 11073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B42 +ENCODING 11074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B43 +ENCODING 11075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +80 +40 +28 +FC +28 +40 +80 +ENDCHAR +STARTCHAR uni2B44 +ENCODING 11076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +28 +FC +28 +C0 +ENDCHAR +STARTCHAR uni2B45 +ENCODING 11077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni2B46 +ENCODING 11078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni2B47 +ENCODING 11079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2B48 +ENCODING 11080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B49 +ENCODING 11081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B4A +ENCODING 11082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4B +ENCODING 11083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4C +ENCODING 11084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +78 +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +E8 +48 +70 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +A0 +40 +ENDCHAR +STARTCHAR uni2C65 +ENCODING 11365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +08 +70 +18 +78 +A8 +78 +40 +ENDCHAR +STARTCHAR uni2C66 +ENCODING 11366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +28 +28 +F8 +30 +20 +20 +58 +40 +ENDCHAR +STARTCHAR uni2C67 +ENCODING 11367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C68 +ENCODING 11368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C69 +ENCODING 11369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +90 +A0 +C0 +A0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6A +ENCODING 11370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +88 +90 +E0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6B +ENCODING 11371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +F8 +08 +10 +20 +40 +80 +FC +04 +ENDCHAR +STARTCHAR uni2C6C +ENCODING 11372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +F8 +10 +20 +40 +FC +04 +ENDCHAR +STARTCHAR uni2C6D +ENCODING 11373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +68 +98 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR uni2C6E +ENCODING 11374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni2C6F +ENCODING 11375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C71 +ENCODING 11377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2C72 +ENCODING 11378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C73 +ENCODING 11379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C74 +ENCODING 11380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +48 +A8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni2C75 +ENCODING 11381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2C76 +ENCODING 11382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni2C77 +ENCODING 11383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2C78 +ENCODING 11384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +70 +88 +F0 +80 +74 +18 +ENDCHAR +STARTCHAR uni2C79 +ENCODING 11385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +40 +40 +40 +C0 +ENDCHAR +STARTCHAR uni2C7A +ENCODING 11386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2C7B +ENCODING 11387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni2C7C +ENCODING 11388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2C7D +ENCODING 11389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2DE0 +ENCODING 11744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +60 +C0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2DE1 +ENCODING 11745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni2DE2 +ENCODING 11746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2DE3 +ENCODING 11747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +F0 +ENDCHAR +STARTCHAR uni2DE4 +ENCODING 11748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DE5 +ENCODING 11749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni2DE6 +ENCODING 11750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE7 +ENCODING 11751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +90 +ENDCHAR +STARTCHAR uni2DE8 +ENCODING 11752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE9 +ENCODING 11753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni2DEA +ENCODING 11754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2DEB +ENCODING 11755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DEC +ENCODING 11756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2DED +ENCODING 11757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni2DEE +ENCODING 11758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2DEF +ENCODING 11759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF0 +ENCODING 11760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 5 +BITMAP +A0 +A0 +A0 +B0 +10 +ENDCHAR +STARTCHAR uni2DF1 +ENCODING 11761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +60 +20 +20 +ENDCHAR +STARTCHAR uni2DF2 +ENCODING 11762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DF3 +ENCODING 11763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +A8 +A8 +A8 +AC +04 +ENDCHAR +STARTCHAR uni2DF4 +ENCODING 11764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +D0 +B0 +60 +ENDCHAR +STARTCHAR uni2DF5 +ENCODING 11765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +7C +88 +88 +68 +ENDCHAR +STARTCHAR uni2DF6 +ENCODING 11766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2DF7 +ENCODING 11767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2DF8 +ENCODING 11768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +40 +E0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF9 +ENCODING 11769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2DFA +ENCODING 11770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +40 +E0 +40 +60 +50 +60 +ENDCHAR +STARTCHAR uni2DFB +ENCODING 11771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +98 +A4 +E4 +A4 +98 +ENDCHAR +STARTCHAR uni2DFC +ENCODING 11772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +B0 +88 +F8 +A8 +98 +ENDCHAR +STARTCHAR uni2DFD +ENCODING 11773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +20 +50 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFE +ENCODING 11774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFF +ENCODING 11775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +FC +A8 +B8 +D4 +D4 +ENDCHAR + + + +STARTCHAR u30A0 +ENCODING 12448 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR u30A1 +ENCODING 12449 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +F0 +10 +60 +40 +ENDCHAR +STARTCHAR u30A2 +ENCODING 12450 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +28 +30 +20 +40 +ENDCHAR +STARTCHAR u30A3 +ENCODING 12451 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +20 +40 +C0 +40 +ENDCHAR +STARTCHAR u30A4 +ENCODING 12452 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR u30A5 +ENCODING 12453 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +20 +F0 +90 +20 +ENDCHAR +STARTCHAR u30A6 +ENCODING 12454 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30A7 +ENCODING 12455 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR u30A8 +ENCODING 12456 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR u30A9 +ENCODING 12457 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +20 +F0 +60 +A0 +ENDCHAR +STARTCHAR u30AA +ENCODING 12458 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +30 +50 +90 +10 +ENDCHAR +STARTCHAR u30AB +ENCODING 12459 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +48 +48 +90 +ENDCHAR +STARTCHAR u30AC +ENCODING 12460 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +F8 +48 +48 +48 +90 +ENDCHAR +STARTCHAR u30AD +ENCODING 12461 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR u30AE +ENCODING 12462 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR u30AF +ENCODING 12463 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +70 +90 +10 +20 +C0 +ENDCHAR +STARTCHAR u30B0 +ENCODING 12464 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +70 +90 +10 +20 +C0 +ENDCHAR +STARTCHAR u30B1 +ENCODING 12465 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +78 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30B2 +ENCODING 12466 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +78 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30BB3 +ENCODING 12467 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30B4 +ENCODING 12468 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30BB5 +ENCODING 12469 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +10 +20 +40 +ENDCHAR +STARTCHAR u30B6 +ENCODING 12470 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +50 +F8 +50 +10 +20 +40 +ENDCHAR +STARTCHAR u30B7 +ENCODING 12471 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +08 +C8 +10 +E0 +ENDCHAR +STARTCHAR u30B8 +ENCODING 12472 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +C0 +08 +C8 +10 +E0 +ENDCHAR +STARTCHAR u30B9 +ENCODING 12473 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BA +ENCODING 12474 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BB +ENCODING 12475 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BC +ENCODING 12476 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BD +ENCODING 12477 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +48 +10 +60 +ENDCHAR +STARTCHAR u30BE +ENCODING 12478 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +88 +88 +48 +10 +60 +ENDCHAR +STARTCHAR u30BF +ENCODING 12479 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +48 +A8 +10 +60 +ENDCHAR +STARTCHAR u30C0 +ENCODING 12480 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +78 +48 +A8 +10 +60 +ENDCHAR +STARTCHAR u30C1 +ENCODING 12481 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +E0 +20 +F8 +20 +40 +ENDCHAR +STARTCHAR u30C2 +ENCODING 12482 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +10 +E0 +20 +F8 +20 +40 +ENDCHAR +STARTCHAR u30C3 +ENCODING 12483 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR u30C4 +ENCODING 12484 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +08 +10 +20 +ENDCHAR +STARTCHAR u30C5 +ENCODING 12485 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +A8 +A8 +08 +10 +20 +ENDCHAR +STARTCHAR u30C6 +ENCODING 12486 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C7 +ENCODING 12487 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +70 +00 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C8 +ENCODING 12488 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +80 +80 +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR u30C9 +ENCODING 12489 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +50 +00 +80 +80 +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR u30CA +ENCODING 12490 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CB +ENCODING 12491 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR u30CC +ENCODING 12492 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +50 +20 +D0 +ENDCHAR +STARTCHAR u30CD +ENCODING 12493 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +10 +20 +70 +A8 +ENDCHAR +STARTCHAR u30CE +ENCODING 12494 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CF +ENCODING 12495 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D0 +ENCODING 12496 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D1 +ENCODING 12497 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +00 +10 +88 +88 +88 +88 +ENDCHAR +STARTCHAR u30D2 +ENCODING 12498 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D3 +ENCODING 12499 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D4 +ENCODING 12500 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +98 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR u30D5 +ENCODING 12501 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D6 +ENCODING 12502 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D7 +ENCODING 12503 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D8 +ENCODING 12504 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30D9 +ENCODING 12505 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +00 +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30DA +ENCODING 12506 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +18 +18 +40 +A0 +10 +08 +ENDCHAR +STARTCHAR u30DB +ENCODING 12507 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DC +ENCODING 12508 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DD +ENCODING 12509 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +20 +F8 +20 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DE +ENCODING 12510 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +50 +20 +10 +ENDCHAR +STARTCHAR u30DF +ENCODING 12511 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +00 +E0 +00 +F0 +ENDCHAR +STARTCHAR u30E0 +ENCODING 12512 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +88 +F8 +08 +ENDCHAR +STARTCHAR u30E1 +ENCODING 12513 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +28 +10 +28 +C0 +ENDCHAR +STARTCHAR u30E2 +ENCODING 12514 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +F8 +40 +38 +ENDCHAR +STARTCHAR u30E3 +ENCODING 12515 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +40 +F8 +50 +40 +ENDCHAR +STARTCHAR u30E4 +ENCODING 12516 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +48 +50 +40 +40 +ENDCHAR +STARTCHAR u30E5 +ENCODING 12517 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +60 +20 +20 +F0 +ENDCHAR +STARTCHAR u30E6 +ENCODING 12518 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR u30E7 +ENCODING 12519 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR u30E8 +ENCODING 12520 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +F8 +08 +F8 +ENDCHAR +STARTCHAR u30E9 +ENCODING 12521 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +F8 +08 +10 +20 +ENDCHAR +STARTCHAR u30EA +ENCODING 12522 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +90 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR u30EB +ENCODING 12523 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +A0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR u30EC +ENCODING 12524 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +80 +80 +90 +A0 +C0 +ENDCHAR +STARTCHAR u30ED +ENCODING 12525 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR u30EE +ENCODING 12526 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +F0 +90 +10 +20 +ENDCHAR +STARTCHAR u30EF +ENCODING 12527 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30F0 +ENCODING 12528 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +50 +50 +F8 +10 +ENDCHAR +STARTCHAR u30F1 +ENCODING 12529 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +30 +20 +F8 +ENDCHAR +STARTCHAR u30F2 +ENCODING 12530 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +F8 +08 +30 +ENDCHAR +STARTCHAR u30F3 +ENCODING 12531 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR u30F4 +ENCODING 12532 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +20 +F8 +88 +08 +10 +20 +ENDCHAR +STARTCHAR u30F5 +ENCODING 12533 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +40 +F0 +50 +A0 +ENDCHAR +STARTCHAR u30F6 +ENCODING 12534 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +40 +F0 +20 +40 +ENDCHAR +STARTCHAR u30F7 +ENCODING 12535 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30F8 +ENCODING 12536 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +00 +10 +F8 +50 +50 +F8 +10 +ENDCHAR +STARTCHAR u30F9 +ENCODING 12537 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +30 +20 +F8 +ENDCHAR +STARTCHAR u30FA +ENCODING 12538 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +00 +F8 +08 +F8 +08 +30 +ENDCHAR +STARTCHAR u30FB +ENCODING 12539 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR u30FC +ENCODING 12540 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR u30FD +ENCODING 12541 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FE +ENCODING 12542 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FF +ENCODING 12543 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR + + +STARTCHAR ff +ENCODING 64256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR ffi +ENCODING 64259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR ffl +ENCODING 64260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uniFB05 +ENCODING 64261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +78 +D0 +50 +50 +48 +ENDCHAR +STARTCHAR uniFB06 +ENCODING 64262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +50 +78 +90 +50 +50 +88 +ENDCHAR +STARTCHAR uniFE20 +ENCODING 65056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +38 +C0 +ENDCHAR +STARTCHAR uniFE21 +ENCODING 65057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +E0 +18 +ENDCHAR +STARTCHAR uniFE22 +ENCODING 65058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +7C +80 +ENDCHAR +STARTCHAR uniFE23 +ENCODING 65059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +08 +F0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/marlin-6x12-3.bdf b/buildroot/share/fonts/marlin-6x12-3.bdf new file mode 100644 index 00000000..bc7a8827 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x12-3.bdf @@ -0,0 +1,588241 @@ +STARTFONT 2.1 +FONT -Marlin6x12-Fixed-Medium-R-SemiCondensed--12-90-100-100-C-111-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 12 15 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Marlin 6x12 Fixed, for menu display" +COMMENT "This font is based on the X Windows' 6x12 '-Misc-Fixed-Medium-R-SemiCondensed--12-110-75-75-C-60-ISO10646-1'. Marlin symbols added at position 1-9. Added jp-kana data. Other missing char data from wqy-bitmapsong-bdf-1.0.0-RC1. Some chars tweaked for LCD display, such as ',;c69' etc." +STARTPROPERTIES 23 +FONTNAME_REGISTRY "" +FOUNDRY "Marlin" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "SemiCondensed" +ADD_STYLE_NAME "" +PIXEL_SIZE 12 +POINT_SIZE 90 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "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" +CAP_HEIGHT 7 +X_HEIGHT 5 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 10 +ENDPROPERTIES +CHARS 33809 +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +C8 +88 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A8 +B8 +88 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 504 0 +DWIDTH 7 0 +BBX 8 5 0 1 +BITMAP +D8 +6C +36 +6C +D8 +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +C8 +10 +20 +40 +98 +98 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +40 +A8 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 5 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +30 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +F0 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 1 -1 +BITMAP +C0 +C0 +00 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +20 +20 +00 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +B8 +A8 +B8 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 5 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +E0 +40 +48 +B0 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +60 +90 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +08 +08 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 7 +BITMAP +F8 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +C0 +48 +50 +60 +50 +A8 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +48 +30 +E0 +50 +B0 +50 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +40 +88 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +90 +A0 +90 +88 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +10 +60 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +50 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +30 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +20 +30 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +20 +30 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +98 +88 +70 +10 +60 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +40 +60 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +50 +A0 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +40 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +88 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +88 +88 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +10 +60 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +10 +60 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +C0 +40 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +60 +C0 +40 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +60 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +20 +40 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +20 +40 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +80 +50 +68 +48 +48 +48 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +08 +30 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +20 +40 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +20 +40 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +60 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +60 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +18 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +20 +30 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +30 +40 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +28 +28 +30 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +40 +40 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +E8 +48 +48 +F0 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +28 +28 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +40 +40 +70 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +0C +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +C8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +48 +48 +48 +68 +58 +48 +48 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +68 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +B0 +A8 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +48 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +F0 +88 +88 +F0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +A0 +70 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +08 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +98 +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +98 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +48 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +10 +A8 +A0 +A0 +A0 +60 +40 +80 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +F8 +40 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +40 +20 +70 +80 +88 +70 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +30 +08 +70 +88 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +78 +20 +40 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +E0 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +D8 +A8 +A8 +B0 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +10 +C0 +A0 +B8 +A8 +B0 +B0 +D8 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +10 +00 +20 +20 +78 +A8 +B0 +B0 +78 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +A8 +D0 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +80 +98 +88 +88 +88 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C8 +40 +58 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E8 +A8 +A8 +A8 +A8 +88 +B0 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E8 +A0 +A8 +A8 +A8 +A8 +88 +28 +10 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +00 +58 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +98 +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +F8 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +70 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +28 +10 +00 +30 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +A4 +A4 +A8 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +A0 +AC +A4 +A8 +A8 +CC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A4 +A8 +6C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +70 +88 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +C8 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +20 +50 +20 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +28 +70 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +B0 +C8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +10 +20 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +10 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +10 +10 +70 +90 +98 +94 +78 +20 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +40 +40 +40 +60 +50 +60 +80 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +E0 +90 +98 +94 +98 +20 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +40 +F0 +40 +60 +50 +A0 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +70 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +74 +88 +98 +F8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +48 +90 +90 +A0 +40 +B8 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A0 +C8 +F0 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +28 +30 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +10 +60 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +90 +F0 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +70 +A8 +F0 +C0 +F0 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +68 +98 +88 +98 +68 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +48 +F0 +48 +48 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +50 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +F8 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +78 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +10 +70 +90 +90 +90 +70 +08 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +18 +74 +90 +60 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +68 +94 +20 +90 +60 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B0 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +38 +10 +90 +60 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +70 +90 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +50 +20 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +F0 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +C0 +40 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +20 +68 +B0 +20 +20 +70 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +20 +60 +A0 +70 +20 +70 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +40 +78 +48 +50 +70 +E8 +48 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +A0 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +98 +68 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +10 +10 +90 +70 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +80 +80 +80 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +08 +08 +08 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +A0 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +28 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +C0 +20 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +98 +68 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +90 +60 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +40 +F8 +20 +18 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +50 +F8 +20 +40 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F8 +10 +30 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +68 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +30 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +38 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +10 +70 +90 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +20 +6C +A4 +A8 +A8 +6C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +78 +A8 +B0 +B8 +68 +08 +38 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +78 +A8 +B0 +B0 +78 +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +50 +48 +48 +30 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +54 +50 +F0 +50 +50 +50 +30 +50 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +40 +E8 +50 +50 +50 +28 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +80 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +58 +60 +50 +48 +F0 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +78 +48 +50 +60 +F8 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +50 +00 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +00 +F8 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +08 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +48 +48 +48 +48 +48 +48 +38 +08 +04 +ENDCHAR +STARTCHAR uni02B0 +ENCODING 688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B1 +ENCODING 689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +80 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni02B2 +ENCODING 690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 3 +BITMAP +20 +00 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni02B3 +ENCODING 691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni02B4 +ENCODING 692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +20 +20 +A0 +60 +ENDCHAR +STARTCHAR uni02B5 +ENCODING 693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 3 +BITMAP +20 +20 +A0 +60 +10 +ENDCHAR +STARTCHAR uni02B6 +ENCODING 694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +A0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni02B7 +ENCODING 695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 4 +BITMAP +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02B8 +ENCODING 696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni02B9 +ENCODING 697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni02BA +ENCODING 698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 5 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni02BE +ENCODING 702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 4 +BITMAP +80 +40 +40 +80 +ENDCHAR +STARTCHAR uni02BF +ENCODING 703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 4 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni02C0 +ENCODING 704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +20 +40 +40 +ENDCHAR +STARTCHAR uni02C1 +ENCODING 705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +80 +40 +40 +ENDCHAR +STARTCHAR uni02C2 +ENCODING 706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni02C3 +ENCODING 707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni02C4 +ENCODING 708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +40 +A0 +A0 +ENDCHAR +STARTCHAR uni02C5 +ENCODING 709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +A0 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 6 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 7 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02C8 +ENCODING 712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CA +ENCODING 714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CB +ENCODING 715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02CC +ENCODING 716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni02CD +ENCODING 717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni02CE +ENCODING 718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02CF +ENCODING 719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -1 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni02D0 +ENCODING 720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +E0 +40 +00 +40 +E0 +ENDCHAR +STARTCHAR uni02D1 +ENCODING 721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 3 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni02D2 +ENCODING 722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 0 +BITMAP +C0 +20 +20 +C0 +ENDCHAR +STARTCHAR uni02D3 +ENCODING 723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni02D4 +ENCODING 724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +20 +F8 +ENDCHAR +STARTCHAR uni02D5 +ENCODING 725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D6 +ENCODING 726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni02D7 +ENCODING 727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 7 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni02DE +ENCODING 734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +68 +A8 +10 +ENDCHAR +STARTCHAR uni02DF +ENCODING 735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E0 +ENCODING 736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 3 +BITMAP +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni02E1 +ENCODING 737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni02E2 +ENCODING 738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +60 +C0 +20 +C0 +ENDCHAR +STARTCHAR uni02E3 +ENCODING 739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 5 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni02E4 +ENCODING 740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni02E5 +ENCODING 741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E6 +ENCODING 742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E7 +ENCODING 743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni02E8 +ENCODING 744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +ENDCHAR +STARTCHAR uni02E9 +ENCODING 745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni02EA +ENCODING 746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni02EB +ENCODING 747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni02EC +ENCODING 748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni02ED +ENCODING 749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni02EE +ENCODING 750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni02EF +ENCODING 751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni02F0 +ENCODING 752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni02F1 +ENCODING 753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +10 +60 +80 +60 +10 +ENDCHAR +STARTCHAR uni02F2 +ENCODING 754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +80 +60 +10 +60 +80 +ENDCHAR +STARTCHAR uni02F3 +ENCODING 755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni02F4 +ENCODING 756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni02F5 +ENCODING 757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni02F6 +ENCODING 758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni02F7 +ENCODING 759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni02F8 +ENCODING 760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni02F9 +ENCODING 761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +80 +ENDCHAR +STARTCHAR uni02FA +ENCODING 762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR uni02FB +ENCODING 763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +80 +80 +C0 +ENDCHAR +STARTCHAR uni02FC +ENCODING 764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 0 +BITMAP +40 +40 +C0 +ENDCHAR +STARTCHAR uni02FD +ENCODING 765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni02FE +ENCODING 766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 0 0 +BITMAP +80 +F0 +ENDCHAR +STARTCHAR uni02FF +ENCODING 767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 8 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 8 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 8 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +88 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +20 +40 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +C0 +40 +20 +ENDCHAR +STARTCHAR uni0315 +ENCODING 789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +60 +40 +80 +ENDCHAR +STARTCHAR uni0316 +ENCODING 790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0317 +ENCODING 791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0318 +ENCODING 792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +C0 +40 +ENDCHAR +STARTCHAR uni0319 +ENCODING 793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +C0 +80 +ENDCHAR +STARTCHAR uni031A +ENCODING 794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 7 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni031B +ENCODING 795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni031C +ENCODING 796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni031D +ENCODING 797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni031E +ENCODING 798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR uni031F +ENCODING 799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0320 +ENCODING 800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0321 +ENCODING 801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 -2 +BITMAP +20 +A0 +40 +ENDCHAR +STARTCHAR uni0322 +ENCODING 802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0325 +ENCODING 805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni0326 +ENCODING 806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0327 +ENCODING 807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0328 +ENCODING 808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni032A +ENCODING 810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +F0 +90 +ENDCHAR +STARTCHAR uni032B +ENCODING 811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +A8 +50 +ENDCHAR +STARTCHAR uni032C +ENCODING 812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +60 +ENDCHAR +STARTCHAR uni032D +ENCODING 813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +60 +90 +ENDCHAR +STARTCHAR uni032E +ENCODING 814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni032F +ENCODING 815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0330 +ENCODING 816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0331 +ENCODING 817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0332 +ENCODING 818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni0333 +ENCODING 819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0334 +ENCODING 820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 2 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0335 +ENCODING 821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0336 +ENCODING 822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0337 +ENCODING 823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni0338 +ENCODING 824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni0339 +ENCODING 825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni033A +ENCODING 826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +F0 +ENDCHAR +STARTCHAR uni033B +ENCODING 827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni033C +ENCODING 828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +50 +A8 +ENDCHAR +STARTCHAR uni033D +ENCODING 829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni033E +ENCODING 830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni033F +ENCODING 831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR uni0340 +ENCODING 832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0341 +ENCODING 833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0342 +ENCODING 834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni0343 +ENCODING 835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0344 +ENCODING 836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +10 +20 +D8 +ENDCHAR +STARTCHAR uni0345 +ENCODING 837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0346 +ENCODING 838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +E0 +A0 +ENDCHAR +STARTCHAR uni0347 +ENCODING 839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR uni0348 +ENCODING 840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni0349 +ENCODING 841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni034A +ENCODING 842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni034B +ENCODING 843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 4 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni034C +ENCODING 844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +68 +B0 +ENDCHAR +STARTCHAR uni034D +ENCODING 845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni034E +ENCODING 846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +E0 +ENDCHAR +STARTCHAR uni034F +ENCODING 847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni0350 +ENCODING 848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0351 +ENCODING 849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni0352 +ENCODING 850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +70 +88 +20 +ENDCHAR +STARTCHAR uni0353 +ENCODING 851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0354 +ENCODING 852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +38 +E0 +38 +ENDCHAR +STARTCHAR uni0355 +ENCODING 853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +E0 +38 +E0 +ENDCHAR +STARTCHAR uni0356 +ENCODING 854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +08 +C8 +34 +D4 +ENDCHAR +STARTCHAR uni0357 +ENCODING 855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +40 +80 +ENDCHAR +STARTCHAR uni0358 +ENCODING 856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni0359 +ENCODING 857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +E0 +ENDCHAR +STARTCHAR uni035A +ENCODING 858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +50 +A8 +50 +ENDCHAR +STARTCHAR uni035B +ENCODING 859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +E0 +20 +ENDCHAR +STARTCHAR uni035C +ENCODING 860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni035D +ENCODING 861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni035E +ENCODING 862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 1 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0360 +ENCODING 864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +60 +98 +ENDCHAR +STARTCHAR uni0361 +ENCODING 865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0362 +ENCODING 866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 1 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni0363 +ENCODING 867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0364 +ENCODING 868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +80 +60 +ENDCHAR +STARTCHAR uni0365 +ENCODING 869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 6 +BITMAP +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni0366 +ENCODING 870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni0367 +ENCODING 871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +A0 +60 +ENDCHAR +STARTCHAR uni0368 +ENCODING 872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +80 +60 +ENDCHAR +STARTCHAR uni0369 +ENCODING 873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni036A +ENCODING 874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +80 +C0 +A0 +ENDCHAR +STARTCHAR uni036B +ENCODING 875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +D0 +A8 +A8 +ENDCHAR +STARTCHAR uni036C +ENCODING 876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni036D +ENCODING 877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +40 +E0 +40 +60 +ENDCHAR +STARTCHAR uni036E +ENCODING 878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +A0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni036F +ENCODING 879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +90 +B0 +D0 +90 +90 +08 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A0 +88 +70 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +28 +88 +70 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +E0 +40 +00 +60 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +90 +90 +B0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +20 +40 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 2 0 +BITMAP +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +70 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +F8 +50 +50 +54 +48 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +90 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +10 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +30 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +90 +90 +B0 +C8 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +3C +08 +C8 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +D8 +00 +88 +54 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +70 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +80 +80 +70 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +40 +48 +58 +68 +48 +08 +04 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +48 +18 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +A8 +A8 +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +A8 +A8 +A8 +58 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +48 +88 +88 +88 +88 +98 +68 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +48 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +88 +08 +70 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +90 +68 +08 +C8 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +10 +20 +40 +88 +70 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +10 +60 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +E0 +90 +88 +F0 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +30 +40 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +48 +70 +50 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +70 +48 +48 +70 +40 +E0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +B0 +C8 +88 +88 +C8 +B0 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +28 +08 +88 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +F0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +A0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +30 +50 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +70 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +70 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +90 +90 +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +40 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +30 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +90 +90 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +08 +08 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +90 +70 +50 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A0 +F8 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +88 +F8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +90 +B8 +F8 +B8 +B8 +B8 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +90 +F8 +B8 +B8 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +50 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +C4 +A8 +90 +F8 +B8 +B8 +A8 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +A8 +90 +F8 +B8 +A8 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +00 +70 +88 +08 +30 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +00 +70 +88 +30 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +48 +00 +88 +90 +90 +50 +50 +50 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +00 +88 +90 +50 +50 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +40 +A0 +A0 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +58 +B8 +B8 +B8 +58 +08 +10 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +00 +20 +20 +88 +88 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +A8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +F8 +A8 +00 +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +80 +80 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +80 +80 +70 +10 +10 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +10 +B0 +48 +40 +A0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 7 +BITMAP +04 +FC +80 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +70 +8C +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +C8 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +98 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +60 +9C +ENDCHAR +STARTCHAR uni0488 +ENCODING 1160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +08 +14 +00 +00 +00 +00 +40 +A0 +08 +14 +ENDCHAR +STARTCHAR uni0489 +ENCODING 1161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +84 +C8 +0C +00 +00 +00 +00 +40 +84 +C8 +0C +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +98 +A8 +C8 +88 +10 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +80 +F0 +88 +88 +88 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +A8 +70 +20 +70 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +08 +10 +08 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +10 +08 +88 +70 +20 +40 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +B0 +A0 +C0 +A0 +B0 +A8 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +B0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +E8 +50 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +48 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +48 +50 +60 +60 +50 +48 +48 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +50 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +F0 +90 +90 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +90 +F0 +90 +98 +08 +08 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A0 +A0 +E0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B8 +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +90 +A8 +A8 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +80 +90 +A8 +70 +20 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +80 +80 +80 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +80 +88 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +A8 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +78 +08 +08 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +90 +90 +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +70 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +F8 +40 +48 +30 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +48 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +F8 +40 +48 +30 +20 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +90 +A0 +C0 +A0 +90 +10 +60 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +38 +48 +48 +48 +48 +48 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +88 +10 +10 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +F8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +D8 +A8 +A8 +88 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +10 +10 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +28 +70 +A8 +70 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +70 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +08 +30 +08 +88 +70 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +30 +88 +70 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +A8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +50 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +90 +00 +88 +88 +98 +68 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +90 +00 +88 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +F0 +80 +80 +80 +C0 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +78 +40 +40 +E0 +40 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +40 +E0 +40 +60 +20 +40 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +50 +20 +50 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +10 +70 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +60 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +60 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +20 +20 +C0 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +48 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +20 +40 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A0 +A0 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A0 +A0 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +A0 +E8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +A8 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +FC +48 +48 +48 +88 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +D4 +54 +48 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C8 +A8 +B0 +D0 +88 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +C8 +B0 +A0 +D0 +88 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A0 +A0 +70 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +70 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +90 +E8 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +D0 +50 +50 +58 +54 +54 +94 +04 +08 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +D0 +50 +58 +54 +94 +04 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0531 +ENCODING 1329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B0 +48 +ENDCHAR +STARTCHAR uni0532 +ENCODING 1330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +F0 +88 +80 +ENDCHAR +STARTCHAR uni0533 +ENCODING 1331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +A0 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni0534 +ENCODING 1332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni0535 +ENCODING 1333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni0536 +ENCODING 1334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni0537 +ENCODING 1335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni0538 +ENCODING 1336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +60 +90 +90 +80 +80 +80 +80 +F0 +08 +ENDCHAR +STARTCHAR uni0539 +ENCODING 1337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +B8 +D0 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni053A +ENCODING 1338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni053B +ENCODING 1339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni053C +ENCODING 1340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni053D +ENCODING 1341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +E8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni053E +ENCODING 1342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni053F +ENCODING 1343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0540 +ENCODING 1344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +10 +20 +40 +80 +C0 +30 +08 +ENDCHAR +STARTCHAR uni0541 +ENCODING 1345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +48 +38 +08 +70 +90 +68 +ENDCHAR +STARTCHAR uni0542 +ENCODING 1346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +A0 +A0 +20 +20 +20 +20 +30 +08 +ENDCHAR +STARTCHAR uni0543 +ENCODING 1347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +50 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0544 +ENCODING 1348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B8 +A8 +A0 +A0 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0545 +ENCODING 1349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +30 +28 +88 +88 +70 +ENDCHAR +STARTCHAR uni0546 +ENCODING 1350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +80 +C0 +40 +40 +40 +48 +30 +ENDCHAR +STARTCHAR uni0547 +ENCODING 1351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +F0 +40 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0548 +ENCODING 1352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0549 +ENCODING 1353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +10 +20 +F8 +ENDCHAR +STARTCHAR uni054A +ENCODING 1354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +A8 +A8 +28 +28 +08 +08 +ENDCHAR +STARTCHAR uni054B +ENCODING 1355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +50 +30 +A0 +F0 +88 +ENDCHAR +STARTCHAR uni054C +ENCODING 1356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +B0 +A8 +A8 +A0 +A0 +ENDCHAR +STARTCHAR uni054D +ENCODING 1357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni054E +ENCODING 1358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +A0 +A0 +A0 +60 +20 +30 +08 +ENDCHAR +STARTCHAR uni054F +ENCODING 1359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni0550 +ENCODING 1360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0551 +ENCODING 1361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +08 +88 +70 +ENDCHAR +STARTCHAR uni0552 +ENCODING 1362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +E0 +90 +90 +88 +80 +ENDCHAR +STARTCHAR uni0553 +ENCODING 1363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0554 +ENCODING 1364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +28 +28 +30 +A0 +70 +28 +20 +ENDCHAR +STARTCHAR uni0555 +ENCODING 1365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0556 +ENCODING 1366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +A0 +A0 +70 +28 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0559 +ENCODING 1369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 1 6 +BITMAP +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni055A +ENCODING 1370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni055B +ENCODING 1371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni055C +ENCODING 1372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +08 +70 +80 +ENDCHAR +STARTCHAR uni055D +ENCODING 1373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 7 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni055E +ENCODING 1374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +70 +88 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni055F +ENCODING 1375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +C0 +88 +70 +ENDCHAR +STARTCHAR uni0561 +ENCODING 1377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0562 +ENCODING 1378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F0 +88 +88 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni0563 +ENCODING 1379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni0564 +ENCODING 1380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +98 +10 +10 +ENDCHAR +STARTCHAR uni0565 +ENCODING 1381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0566 +ENCODING 1382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni0567 +ENCODING 1383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +70 +08 +ENDCHAR +STARTCHAR uni0568 +ENCODING 1384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +F8 +ENDCHAR +STARTCHAR uni0569 +ENCODING 1385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +B8 +D0 +A0 +80 +ENDCHAR +STARTCHAR uni056A +ENCODING 1386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056B +ENCODING 1387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +80 +80 +80 +A0 +D0 +90 +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni056C +ENCODING 1388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni056D +ENCODING 1389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +E8 +A8 +A8 +A8 +90 +80 +80 +ENDCHAR +STARTCHAR uni056E +ENCODING 1390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +20 +78 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni056F +ENCODING 1391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0570 +ENCODING 1392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0571 +ENCODING 1393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0572 +ENCODING 1394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +A0 +D0 +90 +90 +90 +10 +18 +ENDCHAR +STARTCHAR uni0573 +ENCODING 1395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +58 +28 +ENDCHAR +STARTCHAR uni0574 +ENCODING 1396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +10 +90 +90 +90 +B0 +50 +ENDCHAR +STARTCHAR uni0575 +ENCODING 1397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +18 +08 +08 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uni0576 +ENCODING 1398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0577 +ENCODING 1399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +10 +10 +20 +40 +80 +70 +ENDCHAR +STARTCHAR uni0578 +ENCODING 1400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +C8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0579 +ENCODING 1401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +20 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni057A +ENCODING 1402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni057B +ENCODING 1403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +50 +20 +40 +38 +ENDCHAR +STARTCHAR uni057C +ENCODING 1404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +D0 +90 +90 +98 +ENDCHAR +STARTCHAR uni057D +ENCODING 1405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni057E +ENCODING 1406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +10 +90 +90 +90 +90 +70 +10 +18 +ENDCHAR +STARTCHAR uni057F +ENCODING 1407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +B0 +A8 +A8 +A8 +68 +ENDCHAR +STARTCHAR uni0580 +ENCODING 1408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni0581 +ENCODING 1409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni0582 +ENCODING 1410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0583 +ENCODING 1411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +B0 +A8 +A8 +A8 +68 +20 +20 +ENDCHAR +STARTCHAR uni0584 +ENCODING 1412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +30 +48 +48 +70 +40 +F8 +40 +ENDCHAR +STARTCHAR uni0585 +ENCODING 1413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0586 +ENCODING 1414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +A0 +A0 +70 +28 +28 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0587 +ENCODING 1415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +90 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni0589 +ENCODING 1417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni058A +ENCODING 1418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +80 +70 +ENDCHAR +STARTCHAR uni0591 +ENCODING 1425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR uni0592 +ENCODING 1426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +20 +88 +ENDCHAR +STARTCHAR uni0593 +ENCODING 1427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 6 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni0594 +ENCODING 1428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni0595 +ENCODING 1429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +80 +A0 +ENDCHAR +STARTCHAR uni0596 +ENCODING 1430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni0597 +ENCODING 1431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni0598 +ENCODING 1432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0599 +ENCODING 1433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 0 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni059A +ENCODING 1434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni059B +ENCODING 1435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 2 1 -2 +BITMAP +90 +20 +ENDCHAR +STARTCHAR uni059C +ENCODING 1436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 6 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni059D +ENCODING 1437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 4 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR uni059E +ENCODING 1438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 2 5 +BITMAP +40 +90 +A0 +A0 +20 +ENDCHAR +STARTCHAR uni059F +ENCODING 1439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +50 +A8 +50 +50 +ENDCHAR +STARTCHAR uni05A0 +ENCODING 1440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 2 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05A1 +ENCODING 1441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +50 +D0 +20 +ENDCHAR +STARTCHAR uni05A2 +ENCODING 1442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05A3 +ENCODING 1443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +20 +E0 +ENDCHAR +STARTCHAR uni05A4 +ENCODING 1444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05A5 +ENCODING 1445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05A6 +ENCODING 1446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni05A7 +ENCODING 1447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni05A8 +ENCODING 1448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +80 +40 +40 +ENDCHAR +STARTCHAR uni05A9 +ENCODING 1449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 5 +BITMAP +40 +A0 +40 +40 +ENDCHAR +STARTCHAR uni05AA +ENCODING 1450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni05AB +ENCODING 1451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +80 +40 +ENDCHAR +STARTCHAR uni05AC +ENCODING 1452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR uni05AD +ENCODING 1453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 4 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni05AE +ENCODING 1454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +10 +50 +A0 +80 +ENDCHAR +STARTCHAR uni05AF +ENCODING 1455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR afii57799 +ENCODING 1456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 3 2 -2 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR afii57801 +ENCODING 1457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +A8 +00 +48 +ENDCHAR +STARTCHAR afii57800 +ENCODING 1458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +08 +ENDCHAR +STARTCHAR afii57802 +ENCODING 1459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +08 +E0 +48 +ENDCHAR +STARTCHAR afii57793 +ENCODING 1460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR afii57794 +ENCODING 1461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR afii57795 +ENCODING 1462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +20 +ENDCHAR +STARTCHAR afii57798 +ENCODING 1463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57797 +ENCODING 1464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 -2 +BITMAP +E0 +40 +ENDCHAR +STARTCHAR afii57806 +ENCODING 1465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 1 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05BA +ENCODING 1466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57796 +ENCODING 1467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +80 +20 +08 +ENDCHAR +STARTCHAR afii57807 +ENCODING 1468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR afii57839 +ENCODING 1469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57645 +ENCODING 1470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 1 1 4 +BITMAP +F0 +ENDCHAR +STARTCHAR afii57841 +ENCODING 1471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR afii57842 +ENCODING 1472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57804 +ENCODING 1473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 4 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57803 +ENCODING 1474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 0 6 +BITMAP +80 +ENDCHAR +STARTCHAR afii57658 +ENCODING 1475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni05C4 +ENCODING 1476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni05C5 +ENCODING 1477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni05C6 +ENCODING 1478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni05C7 +ENCODING 1479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +40 +40 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +20 +10 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 2 +BITMAP +C0 +40 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +A8 +48 +88 +B8 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +30 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +90 +48 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +28 +10 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +F8 +08 +88 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +48 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +48 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +D8 +48 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +48 +90 +ENDCHAR +STARTCHAR U_1100 +ENCODING 4352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_1101 +ENCODING 4353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +FBE0 +0820 +0820 +0820 +0820 +ENDCHAR +STARTCHAR U_1102 +ENCODING 4354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +8000 +8000 +8000 +8000 +FF80 +ENDCHAR +STARTCHAR U_1103 +ENCODING 4355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 4 0 6 +BITMAP +FFC0 +4000 +4000 +7FC0 +ENDCHAR +STARTCHAR U_1104 +ENCODING 4356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +FBE0 +4200 +4200 +5A00 +63E0 +ENDCHAR +STARTCHAR U_1105 +ENCODING 4357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +0080 +FF80 +4000 +7F80 +ENDCHAR +STARTCHAR U_1106 +ENCODING 4358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +FFE0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_1107 +ENCODING 4359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +8080 +FF80 +8080 +FF80 +ENDCHAR +STARTCHAR U_1108 +ENCODING 4360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +8A20 +FBE0 +8A20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_1109 +ENCODING 4361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +0400 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_110A +ENCODING 4362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 5 +BITMAP +1100 +1100 +2A80 +4440 +8840 +ENDCHAR +STARTCHAR U_110B +ENCODING 4363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +7F00 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR U_110C +ENCODING 4364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 1 5 +BITMAP +FF80 +0100 +0600 +1980 +E040 +ENDCHAR +STARTCHAR U_110D +ENCODING 4365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 5 +BITMAP +7FC0 +1100 +2A80 +4440 +8800 +ENDCHAR +STARTCHAR U_110E +ENCODING 4366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +3F80 +0000 +FFE0 +0200 +0D80 +F040 +ENDCHAR +STARTCHAR U_110F +ENCODING 4367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +0080 +0080 +FF80 +0080 +ENDCHAR +STARTCHAR U_1110 +ENCODING 4368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 5 +BITMAP +FFC0 +4000 +7F80 +4000 +7FC0 +ENDCHAR +STARTCHAR U_1111 +ENCODING 4369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +FF80 +2200 +2200 +FF80 +ENDCHAR +STARTCHAR U_1112 +ENCODING 4370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 0 2 +BITMAP +3F00 +0000 +FFC0 +0000 +3F00 +4080 +4080 +3F00 +ENDCHAR +STARTCHAR U_1113 +ENCODING 4371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +8F80 +8080 +8080 +F080 +ENDCHAR +STARTCHAR U_1114 +ENCODING 4372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +8400 +8400 +B400 +C780 +ENDCHAR +STARTCHAR U_112C +ENCODING 4396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 0 -1 +BITMAP +9480 +9480 +F780 +9480 +F780 +0000 +3E00 +6300 +4100 +6300 +3E00 +ENDCHAR +STARTCHAR U_112D +ENCODING 4397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 2 +BITMAP +13E0 +1020 +1020 +1020 +2820 +4420 +8220 +ENDCHAR +STARTCHAR U_1133 +ENCODING 4403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +4AE0 +4A20 +4E20 +AA20 +AA20 +AE20 +ENDCHAR +STARTCHAR U_1134 +ENCODING 4404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 2 +BITMAP +4440 +4440 +4440 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_1135 +ENCODING 4405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +21C0 +2220 +2220 +5220 +5220 +89C0 +ENDCHAR +STARTCHAR U_113B +ENCODING 4411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +21C0 +2000 +23E0 +5140 +5220 +89C0 +ENDCHAR +STARTCHAR uni1680 +ENCODING 5760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni1681 +ENCODING 5761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +08 +08 +08 +ENDCHAR +STARTCHAR uni1682 +ENCODING 5762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +28 +28 +28 +ENDCHAR +STARTCHAR uni1683 +ENCODING 5763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +38 +38 +38 +ENDCHAR +STARTCHAR uni1684 +ENCODING 5764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni1685 +ENCODING 5765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1686 +ENCODING 5766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +08 +08 +08 +FC +ENDCHAR +STARTCHAR uni1687 +ENCODING 5767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +28 +28 +28 +FC +ENDCHAR +STARTCHAR uni1688 +ENCODING 5768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +38 +38 +38 +FC +ENDCHAR +STARTCHAR uni1689 +ENCODING 5769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +78 +78 +78 +FC +ENDCHAR +STARTCHAR uni168A +ENCODING 5770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +F8 +F8 +F8 +FC +ENDCHAR +STARTCHAR uni168B +ENCODING 5771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +10 +10 +FC +20 +20 +20 +ENDCHAR +STARTCHAR uni168C +ENCODING 5772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +28 +FC +50 +50 +50 +ENDCHAR +STARTCHAR uni168D +ENCODING 5773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +38 +38 +FC +70 +70 +70 +ENDCHAR +STARTCHAR uni168E +ENCODING 5774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +3C +3C +3C +FC +78 +78 +78 +ENDCHAR +STARTCHAR uni168F +ENCODING 5775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +7C +7C +7C +FC +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni1690 +ENCODING 5776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +10 +FC +10 +ENDCHAR +STARTCHAR uni1691 +ENCODING 5777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +28 +FC +28 +ENDCHAR +STARTCHAR uni1692 +ENCODING 5778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +38 +FC +38 +ENDCHAR +STARTCHAR uni1693 +ENCODING 5779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni1694 +ENCODING 5780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +FC +F8 +ENDCHAR +STARTCHAR uni1695 +ENCODING 5781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +28 +28 +10 +FC +10 +28 +28 +ENDCHAR +STARTCHAR uni1696 +ENCODING 5782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni1697 +ENCODING 5783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +FC +40 +58 +48 +78 +ENDCHAR +STARTCHAR uni1698 +ENCODING 5784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +FC +D8 +70 +D8 +ENDCHAR +STARTCHAR uni1699 +ENCODING 5785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 3 +BITMAP +50 +F8 +50 +F8 +50 +F8 +ENDCHAR +STARTCHAR uni169A +ENCODING 5786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +78 +ENDCHAR +STARTCHAR uni169B +ENCODING 5787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +40 +20 +1C +20 +40 +80 +ENDCHAR +STARTCHAR uni169C +ENCODING 5788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +04 +08 +F0 +08 +04 +ENDCHAR +STARTCHAR uni16A0 +ENCODING 5792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +90 +A0 +C0 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16A1 +ENCODING 5793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +80 +90 +A0 +C0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A2 +ENCODING 5794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A3 +ENCODING 5795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A4 +ENCODING 5796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +88 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni16A5 +ENCODING 5797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +C0 +A0 +90 +C8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni16A6 +ENCODING 5798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A7 +ENCODING 5799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +80 +C0 +A0 +D0 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16A8 +ENCODING 5800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16A9 +ENCODING 5801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C8 +B0 +80 +C8 +B0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AA +ENCODING 5802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +C0 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16AB +ENCODING 5803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +C0 +A0 +90 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR uni16AC +ENCODING 5804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A0 +60 +30 +A8 +60 +30 +28 +20 +ENDCHAR +STARTCHAR uni16AD +ENCODING 5805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +80 +80 +80 +C0 +A0 +80 +C0 +A0 +80 +ENDCHAR +STARTCHAR uni16AE +ENCODING 5806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16AF +ENCODING 5807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A8 +30 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B0 +ENCODING 5808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +28 +30 +60 +A0 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni16B1 +ENCODING 5809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +A0 +90 +88 +80 +ENDCHAR +STARTCHAR uni16B2 +ENCODING 5810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR uni16B3 +ENCODING 5811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +80 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16B4 +ENCODING 5812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B5 +ENCODING 5813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +88 +90 +A0 +C0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16B6 +ENCODING 5814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +E0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16B7 +ENCODING 5815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B8 +ENCODING 5816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +A8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni16B9 +ENCODING 5817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16BA +ENCODING 5818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR uni16BB +ENCODING 5819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR uni16BC +ENCODING 5820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16BD +ENCODING 5821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16BE +ENCODING 5822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +60 +20 +30 +28 +20 +20 +ENDCHAR +STARTCHAR uni16BF +ENCODING 5823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +80 +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C0 +ENCODING 5824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A0 +70 +70 +70 +28 +20 +20 +ENDCHAR +STARTCHAR uni16C1 +ENCODING 5825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16C2 +ENCODING 5826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +40 +40 +E0 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16C3 +ENCODING 5827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +40 +90 +48 +10 +20 +ENDCHAR +STARTCHAR uni16C4 +ENCODING 5828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +A8 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni16C5 +ENCODING 5829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C6 +ENCODING 5830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 0 0 +BITMAP +20 +20 +20 +20 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni16C7 +ENCODING 5831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni16C8 +ENCODING 5832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D0 +A0 +80 +80 +80 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni16C9 +ENCODING 5833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16CA +ENCODING 5834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +40 +80 +40 +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR uni16CB +ENCODING 5835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +88 +98 +A8 +C8 +88 +08 +08 +ENDCHAR +STARTCHAR uni16CC +ENCODING 5836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 4 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16CD +ENCODING 5837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +40 +40 +40 +40 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni16CE +ENCODING 5838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16CF +ENCODING 5839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D0 +ENCODING 5840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D1 +ENCODING 5841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni16D2 +ENCODING 5842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +C0 +A0 +90 +A0 +C0 +A0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni16D3 +ENCODING 5843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +80 +A0 +C0 +80 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni16D4 +ENCODING 5844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +88 +A8 +88 +F0 +88 +A8 +88 +F0 +ENDCHAR +STARTCHAR uni16D5 +ENCODING 5845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni16D6 +ENCODING 5846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D7 +ENCODING 5847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni16D8 +ENCODING 5848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16D9 +ENCODING 5849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DA +ENCODING 5850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16DB +ENCODING 5851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +60 +50 +40 +E0 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni16DC +ENCODING 5852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni16DD +ENCODING 5853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +50 +20 +50 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni16DE +ENCODING 5854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +D8 +A8 +A8 +A8 +D8 +D8 +88 +ENDCHAR +STARTCHAR uni16DF +ENCODING 5855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni16E0 +ENCODING 5856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +70 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni16E1 +ENCODING 5857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +A8 +70 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni16E2 +ENCODING 5858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +20 +20 +20 +20 +60 +A0 +ENDCHAR +STARTCHAR uni16E3 +ENCODING 5859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +70 +A8 +ENDCHAR +STARTCHAR uni16E4 +ENCODING 5860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E5 +ENCODING 5861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +D8 +A8 +D8 +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni16E6 +ENCODING 5862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16E7 +ENCODING 5863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 0 +BITMAP +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni16E8 +ENCODING 5864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni16E9 +ENCODING 5865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +68 +88 +68 +18 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni16EA +ENCODING 5866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +E0 +40 +50 +70 +50 +10 +38 +10 +ENDCHAR +STARTCHAR uni16EB +ENCODING 5867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni16EC +ENCODING 5868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 2 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni16ED +ENCODING 5869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni16EE +ENCODING 5870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +30 +28 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni16EF +ENCODING 5871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +20 +20 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni16F0 +ENCODING 5872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +70 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +70 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +20 +40 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +20 +40 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +30 +48 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +80 +80 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +80 +80 +88 +90 +E0 +90 +88 +00 +F8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +D8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +10 +00 +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +10 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +78 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +50 +20 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +70 +88 +80 +70 +08 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +20 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +20 +18 +00 +F8 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +20 +F8 +20 +20 +18 +00 +20 +50 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +A8 +A8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +20 +50 +88 +88 +F8 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +18 +08 +10 +20 +50 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +30 +10 +20 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +04 +28 +50 +20 +50 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +04 +08 +30 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +08 +24 +50 +20 +50 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +10 +08 +30 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +0C +04 +28 +50 +20 +50 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +0C +04 +08 +30 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +28 +50 +20 +50 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +28 +50 +00 +30 +48 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 -1 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +00 +70 +08 +78 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +10 +20 +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +08 +10 +48 +30 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +40 +20 +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +40 +20 +48 +30 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +30 +10 +A8 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +18 +08 +10 +48 +30 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 0 +BITMAP +28 +50 +88 +70 +00 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +14 +28 +00 +48 +30 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 -1 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 -2 +BITMAP +48 +30 +00 +70 +08 +78 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +80 +80 +F0 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +F0 +80 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +30 +10 +20 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +30 +10 +20 +00 +70 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +28 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +28 +50 +00 +70 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +02 +24 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +04 +08 +20 +50 +00 +70 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +24 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +10 +08 +20 +50 +00 +70 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +0C +24 +58 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +18 +08 +10 +60 +90 +00 +60 +90 +F0 +80 +70 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +0A +14 +20 +50 +00 +F8 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +28 +50 +00 +20 +50 +00 +70 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +F0 +80 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +30 +10 +20 +00 +F8 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +60 +20 +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 3 9 2 -2 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +00 +40 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +30 +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +30 +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +22 +54 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +04 +08 +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +24 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +10 +08 +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +0C +24 +58 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +18 +08 +30 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +28 +50 +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +28 +50 +00 +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +20 +40 +10 +08 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +40 +10 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +80 +50 +08 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +80 +40 +10 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +60 +20 +50 +08 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +60 +20 +40 +10 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +50 +A0 +10 +08 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +50 +A0 +10 +08 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +10 +08 +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 5 9 0 -2 +BITMAP +10 +08 +70 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +30 +10 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +30 +10 +20 +00 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +10 +2C +04 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +20 +0C +04 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +40 +2C +04 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +20 +0C +04 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +2C +04 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +10 +20 +0C +04 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +28 +50 +0C +04 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +28 +50 +0C +04 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +04 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +0C +04 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +88 +88 +50 +20 +40 +88 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +10 +20 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +10 +20 +20 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +88 +88 +88 +50 +20 +40 +80 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +68 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +10 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +30 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +40 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +C0 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +C0 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +9C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +5C +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +C0 +54 +14 +14 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +10 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +30 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +60 +88 +70 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +10 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +68 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +30 +48 +78 +48 +48 +20 +10 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +B0 +C8 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +28 +28 +38 +28 +28 +20 +10 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +60 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +48 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D0 +88 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +50 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C8 +90 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +10 +20 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +68 +B0 +20 +10 +00 +50 +88 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +48 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +D0 +88 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +50 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C8 +90 +00 +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +40 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +68 +B0 +00 +C0 +80 +38 +44 +44 +28 +6C +10 +08 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +68 +90 +90 +90 +68 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +68 +B0 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +B0 +C8 +88 +88 +88 +08 +88 +40 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +20 +10 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +48 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +50 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +10 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +50 +20 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +20 +20 +20 +28 +10 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +00 +70 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +D0 +88 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 6 +BITMAP +C8 +90 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +68 +B0 +00 +30 +20 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +60 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +20 +00 +70 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +50 +00 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +80 +00 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 1 6 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +B0 +00 +50 +88 +A8 +A8 +50 +00 +20 +10 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +00 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +20 +10 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 6 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +E0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 -1 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -1 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +50 +20 +68 +D4 +A8 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +A8 +58 +34 +68 +D4 +A8 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 3 1 4 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +88 +50 +20 +A8 +20 +50 +88 +20 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +28 +30 +20 +00 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 8 +BITMAP +FC +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2041 +ENCODING 8257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 -2 +BITMAP +10 +20 +20 +40 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2042 +ENCODING 8258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +20 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 1 2 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2045 +ENCODING 8261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +80 +80 +E0 +80 +80 +E0 +ENDCHAR +STARTCHAR uni2046 +ENCODING 8262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +20 +20 +E0 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +48 +B4 +24 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +48 +48 +00 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +A8 +88 +90 +90 +00 +90 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +E8 +E8 +78 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F0 +B8 +B8 +F0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 -2 +BITMAP +40 +E0 +40 +00 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +88 +00 +00 +00 +00 +00 +00 +88 +70 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +70 +70 +A8 +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +90 +10 +20 +20 +40 +40 +90 +80 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -1 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2057 +ENCODING 8279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +7C +7C +F8 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +00 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +88 +88 +00 +20 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +20 +F8 +20 +A8 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 4 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 4 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 4 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 1 4 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +80 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +80 +80 +A0 +E0 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +C0 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -1 +BITMAP +40 +20 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +40 +A0 +E0 +80 +60 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 -2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +C0 +20 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +80 +B8 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +D0 +D0 +D8 +70 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +B0 +A0 +A8 +70 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +E0 +40 +E0 +48 +B0 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +10 +F0 +A8 +A8 +A8 +40 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +C8 +FC +A8 +FC +98 +88 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +D8 +A0 +B0 +A8 +B0 +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +88 +FC +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +94 +B4 +B4 +B4 +B4 +A4 +98 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +00 +78 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +48 +50 +F8 +50 +48 +48 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +50 +48 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20B0 +ENCODING 8368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +28 +28 +10 +10 +50 +68 +A8 +08 +10 +ENDCHAR +STARTCHAR uni20B1 +ENCODING 8369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +F8 +F8 +50 +60 +40 +40 +ENDCHAR +STARTCHAR uni20B2 +ENCODING 8370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +B8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20B3 +ENCODING 8371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni20B4 +ENCODING 8372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +F8 +20 +F8 +40 +30 +ENDCHAR +STARTCHAR uni20B5 +ENCODING 8373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A8 +A0 +A0 +A0 +A8 +70 +20 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 8 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +30 +48 +E8 +48 +30 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +B8 +90 +60 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 7 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni20DD +ENCODING 8413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20DE +ENCODING 8414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni20DF +ENCODING 8415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +48 +84 +84 +84 +84 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni20E0 +ENCODING 8416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +C4 +A4 +A4 +A4 +A4 +94 +94 +94 +94 +8C +78 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR uni20E2 +ENCODING 8418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni20E3 +ENCODING 8419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +84 +84 +84 +84 +84 +84 +84 +84 +FC +FC +ENDCHAR +STARTCHAR uni20E4 +ENCODING 8420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +20 +50 +50 +50 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni20E7 +ENCODING 8423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +04 +04 +04 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni20E8 +ENCODING 8424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni20E9 +ENCODING 8425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni20EA +ENCODING 8426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +24 +24 +24 +48 +48 +90 +90 +90 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +10 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +F8 +40 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni20F0 +ENCODING 8432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 7 +BITMAP +A0 +40 +A0 +ENDCHAR +STARTCHAR uni2100 +ENCODING 8448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +68 +A8 +70 +10 +20 +40 +58 +A0 +98 +ENDCHAR +STARTCHAR uni2101 +ENCODING 8449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +A8 +70 +10 +20 +58 +60 +90 +88 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2104 +ENCODING 8452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A0 +A0 +A0 +70 +20 +38 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +50 +A8 +90 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +48 +88 +50 +10 +20 +40 +68 +A8 +98 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2108 +ENCODING 8456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +78 +08 +88 +70 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210A +ENCODING 8458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +38 +48 +48 +48 +30 +90 +60 +ENDCHAR +STARTCHAR uni210B +ENCODING 8459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C8 +48 +48 +70 +90 +90 +90 +08 +ENDCHAR +STARTCHAR uni210C +ENCODING 8460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +68 +90 +80 +B0 +C8 +48 +28 +A8 +48 +10 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +B8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F0 +40 +70 +48 +48 +90 +90 +ENDCHAR +STARTCHAR uni2110 +ENCODING 8464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +08 +08 +10 +10 +20 +A0 +40 +ENDCHAR +STARTCHAR Ifraktur +ENCODING 8465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +48 +10 +10 +08 +C8 +30 +ENDCHAR +STARTCHAR uni2112 +ENCODING 8466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +28 +20 +20 +40 +40 +64 +98 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +50 +50 +20 +60 +90 +ENDCHAR +STARTCHAR uni2114 +ENCODING 8468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +F0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +A4 +B4 +B4 +AC +A4 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +90 +D8 +B4 +98 +90 +9C +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +E8 +D8 +E8 +C8 +88 +70 +ENDCHAR +STARTCHAR weierstrass +ENCODING 8472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +58 +64 +64 +78 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +B0 +68 +ENDCHAR +STARTCHAR uni211B +ENCODING 8475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +A0 +90 +90 +ENDCHAR +STARTCHAR Rfraktur +ENCODING 8476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +68 +30 +30 +A8 +48 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +A8 +A8 +B0 +B0 +A8 +A8 +ENDCHAR +STARTCHAR prescription +ENCODING 8478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +88 +F0 +A8 +90 +A8 +ENDCHAR +STARTCHAR uni211F +ENCODING 8479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +60 +20 +F0 +A8 +A8 +F0 +A0 +B0 +A8 +20 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +54 +9C +54 +94 +ENDCHAR +STARTCHAR uni2121 +ENCODING 8481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +40 +40 +70 +20 +30 +20 +30 +10 +10 +10 +18 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2123 +ENCODING 8483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +20 +A8 +A8 +A8 +50 +50 +50 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +28 +48 +50 +90 +A0 +F8 +ENDCHAR +STARTCHAR uni2125 +ENCODING 8485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +10 +20 +78 +10 +20 +70 +08 +88 +70 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2128 +ENCODING 8488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +28 +38 +28 +88 +70 +ENDCHAR +STARTCHAR uni2129 +ENCODING 8489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +C0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni212C +ENCODING 8492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +70 +90 +90 +E0 +ENDCHAR +STARTCHAR uni212D +ENCODING 8493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +74 +90 +90 +A0 +80 +88 +70 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni212F +ENCODING 8495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +48 +70 +80 +60 +ENDCHAR +STARTCHAR uni2130 +ENCODING 8496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +60 +80 +88 +70 +ENDCHAR +STARTCHAR uni2131 +ENCODING 8497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +A0 +20 +78 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2132 +ENCODING 8498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2133 +ENCODING 8499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C4 +6C +54 +44 +48 +48 +84 +ENDCHAR +STARTCHAR uni2134 +ENCODING 8500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +48 +48 +90 +90 +60 +ENDCHAR +STARTCHAR aleph +ENCODING 8501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +90 +48 +68 +90 +C8 +ENDCHAR +STARTCHAR uni2136 +ENCODING 8502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR uni2137 +ENCODING 8503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +80 +40 +20 +50 +90 +ENDCHAR +STARTCHAR uni2138 +ENCODING 8504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2139 +ENCODING 8505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +60 +00 +E0 +60 +60 +E0 +ENDCHAR +STARTCHAR uni213A +ENCODING 8506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +7C +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213B +ENCODING 8507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +E0 +80 +C0 +80 +70 +50 +70 +50 +14 +08 +14 +ENDCHAR +STARTCHAR uni213C +ENCODING 8508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +68 +68 +68 +68 +ENDCHAR +STARTCHAR uni213D +ENCODING 8509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +88 +48 +A8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A0 +50 +50 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR uni2141 +ENCODING 8513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +C8 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2142 +ENCODING 8514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2143 +ENCODING 8515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2144 +ENCODING 8516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +54 +54 +54 +A8 +A8 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +14 +14 +68 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +54 +54 +B8 +A0 +78 +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +00 +78 +28 +28 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni214A +ENCODING 8522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F0 +A8 +A8 +B0 +20 +38 +ENDCHAR +STARTCHAR uni214B +ENCODING 8523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +B0 +48 +E8 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni214C +ENCODING 8524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +B8 +A4 +F4 +AC +F8 +A8 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni214D +ENCODING 8525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +E8 +B0 +10 +20 +48 +50 +88 +90 +ENDCHAR +STARTCHAR uni214E +ENCODING 8526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni214F +ENCODING 8527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +70 +70 +A8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +38 +44 +48 +84 +98 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A8 +48 +F0 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +C8 +E8 +50 +10 +20 +58 +50 +88 +90 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +50 +58 +94 +88 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +48 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +28 +48 +30 +D0 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +88 +48 +90 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +E0 +28 +48 +50 +10 +28 +54 +48 +94 +88 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +48 +50 +10 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +90 +90 +90 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +48 +48 +48 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +54 +54 +54 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +DC +DC +DC +5C +5C +5C +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +48 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +AC +AC +AC +4C +AC +AC +AC +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +48 +48 +48 +48 +48 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +A8 +90 +90 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +A8 +48 +48 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +00 +D4 +D4 +D4 +D4 +54 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +00 +DC +DC +DC +DC +5C +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +A8 +A8 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +A8 +A8 +48 +A8 +A8 +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +00 +AC +AC +4C +AC +AC +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D0 +A8 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +88 +E8 +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +F8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +90 +10 +90 +60 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +80 +80 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni2186 +ENCODING 8582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2187 +ENCODING 8583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +FC +FC +9C +FC +FC +F8 +ENDCHAR +STARTCHAR uni2188 +ENCODING 8584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +A8 +F8 +F8 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +F8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +F0 +E0 +A0 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +78 +38 +28 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +40 +40 +20 +28 +38 +78 +18 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +08 +10 +10 +20 +A0 +E0 +F0 +C0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +50 +30 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +28 +FC +48 +50 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +C0 +D8 +64 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +0C +6C +98 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +50 +FC +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +28 +FC +28 +50 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +48 +F0 +48 +24 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +3C +48 +90 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +48 +F8 +48 +28 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +90 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +44 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +88 +7C +08 +10 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +4C +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +C8 +FC +48 +50 +ENDCHAR +STARTCHAR uni21AD +ENCODING 8621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +48 +DC +EC +48 +ENDCHAR +STARTCHAR uni21AE +ENCODING 8622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +58 +FC +68 +40 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +B0 +D0 +90 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F0 +10 +38 +10 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +48 +F8 +40 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +30 +48 +48 +E8 +48 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +90 +90 +B8 +10 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +E0 +C0 +A0 +20 +10 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +C0 +F8 +C0 +A8 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 0 +BITMAP +20 +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F0 +50 +50 +50 +50 +78 +50 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +40 +F8 +40 +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +10 +F8 +10 +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +00 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +00 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +7C +90 +7C +20 +50 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +58 +FC +A4 +FC +68 +40 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +F8 +24 +F8 +10 +28 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +A0 +D0 +A8 +94 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +14 +2C +54 +A4 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A4 +54 +2C +14 +7C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +94 +A8 +D0 +A0 +F8 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +40 +E8 +D4 +40 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +88 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +00 +20 +88 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +78 +88 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +88 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +F8 +88 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21ED +ENCODING 8685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +D8 +50 +D8 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +F0 +88 +F0 +A0 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +B0 +A0 +90 +10 +08 +08 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +40 +48 +28 +68 +08 +F8 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +68 +FC +68 +10 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +78 +50 +50 +50 +50 +F0 +50 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +F8 +10 +10 +F8 +10 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +48 +FC +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +48 +FC +48 +50 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +38 +58 +FC +58 +38 +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +70 +68 +FC +68 +70 +ENDCHAR +STARTCHAR uni21FC +ENCODING 8700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +60 +B8 +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +E8 +30 +20 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +78 +B4 +78 +30 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +F8 +18 +28 +78 +28 +48 +F8 +40 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +70 +98 +A8 +C8 +70 +40 +40 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +38 +60 +A0 +F0 +A0 +60 +38 +20 +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +E0 +30 +28 +78 +28 +30 +E0 +20 +20 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 1 +BITMAP +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +48 +48 +48 +48 +48 +48 +48 +EC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +EC +48 +48 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +20 +10 +10 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +08 +08 +08 +08 +10 +D0 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +C4 +24 +48 +28 +C8 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +A4 +E8 +28 +28 +10 +90 +90 +60 +60 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +58 +A0 +A0 +58 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +50 +20 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +30 +48 +88 +48 +30 +10 +08 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +28 +30 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +50 +50 +58 +50 +70 +50 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +48 +48 +48 +48 +48 +48 +48 +90 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +28 +20 +70 +A8 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +24 +48 +48 +78 +CC +CC +CC +78 +48 +48 +90 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +54 +A8 +A8 +F8 +AC +AC +AC +F8 +A8 +A8 +D0 +ENDCHAR +STARTCHAR uni2231 +ENCODING 8753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +3C +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2232 +ENCODING 8754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +74 +AC +BC +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2233 +ENCODING 8755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +BC +AC +74 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +68 +B0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +B0 +68 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +48 +A4 +94 +48 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +A0 +A0 +A8 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +20 +20 +20 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +F8 +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +68 +B0 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +68 +B0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni224D +ENCODING 8781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +00 +70 +88 +ENDCHAR +STARTCHAR uni224E +ENCODING 8782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +00 +D8 +20 +ENDCHAR +STARTCHAR uni224F +ENCODING 8783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni2250 +ENCODING 8784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2251 +ENCODING 8785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2252 +ENCODING 8786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +F8 +00 +F8 +00 +08 +ENDCHAR +STARTCHAR uni2253 +ENCODING 8787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +F8 +00 +F8 +00 +80 +ENDCHAR +STARTCHAR uni2254 +ENCODING 8788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B8 +00 +B8 +ENDCHAR +STARTCHAR uni2255 +ENCODING 8789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +E8 +00 +E8 +ENDCHAR +STARTCHAR uni2256 +ENCODING 8790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +50 +F8 +ENDCHAR +STARTCHAR uni2257 +ENCODING 8791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2258 +ENCODING 8792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225A +ENCODING 8794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +50 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225B +ENCODING 8795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225C +ENCODING 8796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225D +ENCODING 8797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +4C +F8 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225E +ENCODING 8798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D0 +A8 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +10 +20 +00 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +30 +C0 +30 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +60 +18 +60 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +18 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +90 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni226C +ENCODING 8812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +40 +A0 +A0 +A0 +A0 +40 +A0 +ENDCHAR +STARTCHAR uni226D +ENCODING 8813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +30 +20 +60 +A0 +60 +20 +30 +28 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +60 +20 +30 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +38 +60 +A0 +60 +38 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +E0 +30 +28 +30 +E0 +20 +68 +B0 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni2278 +ENCODING 8824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +18 +70 +90 +60 +38 +E0 +30 +48 +70 +C0 +40 +ENDCHAR +STARTCHAR uni2279 +ENCODING 8825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +D0 +30 +18 +30 +E0 +38 +60 +C0 +60 +58 +40 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E0 +10 +E8 +10 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +38 +40 +B8 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +E0 +10 +08 +00 +68 +B0 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +40 +38 +40 +80 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +28 +30 +E0 +30 +28 +20 +ENDCHAR +STARTCHAR uni2281 +ENCODING 8833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A0 +60 +38 +60 +A0 +20 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +78 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F0 +28 +28 +28 +F0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +10 +F8 +40 +ENDCHAR +STARTCHAR uni228C +ENCODING 8844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +A8 +E8 +F8 +E8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228D +ENCODING 8845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni228E +ENCODING 8846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni229B +ENCODING 8859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +F8 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +B8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +AC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +90 +F8 +A0 +A0 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +F8 +A0 +F8 +C0 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A8 +A8 +BC +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A4 +A4 +BC +A8 +BC +B0 +B0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +08 +10 +E0 +10 +08 +10 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +80 +40 +38 +40 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +68 +88 +68 +18 +00 +F8 +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +B8 +50 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +E8 +50 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +E8 +10 +ENDCHAR +STARTCHAR uni22B9 +ENCODING 8889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni22BA +ENCODING 8890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +C0 +A0 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +88 +50 +20 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 2 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +50 +F8 +50 +88 +20 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +B0 +68 +00 +F8 +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +50 +50 +88 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +98 +A0 +98 +40 +38 +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +C8 +28 +C8 +10 +E0 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22D4 +ENCODING 8916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22D5 +ENCODING 8917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +60 +88 +60 +18 +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +30 +88 +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +28 +54 +A8 +54 +28 +14 +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +50 +A8 +54 +A8 +50 +A0 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +E8 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +B8 +40 +38 +40 +80 +ENDCHAR +STARTCHAR uni22E0 +ENCODING 8928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +28 +30 +E0 +30 +E8 +30 +28 +20 +ENDCHAR +STARTCHAR uni22E1 +ENCODING 8929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +A0 +60 +38 +60 +B8 +60 +A0 +20 +ENDCHAR +STARTCHAR uni22E2 +ENCODING 8930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A0 +A0 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E3 +ENCODING 8931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +28 +28 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22E4 +ENCODING 8932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E5 +ENCODING 8933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +10 +F8 +40 +ENDCHAR +STARTCHAR uni22E6 +ENCODING 8934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +38 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E7 +ENCODING 8935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +E0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E8 +ENCODING 8936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +10 +E0 +10 +28 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22E9 +ENCODING 8937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +40 +38 +40 +A0 +20 +68 +B0 +20 +20 +ENDCHAR +STARTCHAR uni22EA +ENCODING 8938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +38 +68 +A8 +68 +38 +20 +20 +ENDCHAR +STARTCHAR uni22EB +ENCODING 8939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +E0 +B0 +A8 +B0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni22EC +ENCODING 8940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +38 +68 +A8 +68 +38 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22ED +ENCODING 8941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +E0 +B0 +A8 +B0 +E0 +20 +F8 +20 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 9 2 -1 +BITMAP +80 +00 +00 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni22F2 +ENCODING 8946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +38 +ENDCHAR +STARTCHAR uni22F3 +ENCODING 8947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F4 +ENCODING 8948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +88 +F8 +88 +40 +38 +ENDCHAR +STARTCHAR uni22F5 +ENCODING 8949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F6 +ENCODING 8950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +38 +40 +80 +F0 +80 +40 +38 +ENDCHAR +STARTCHAR uni22F7 +ENCODING 8951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +70 +80 +E0 +80 +70 +ENDCHAR +STARTCHAR uni22F8 +ENCODING 8952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +38 +40 +80 +F0 +80 +40 +38 +00 +F8 +ENDCHAR +STARTCHAR uni22F9 +ENCODING 8953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +80 +F0 +40 +38 +ENDCHAR +STARTCHAR uni22FA +ENCODING 8954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +10 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni22FB +ENCODING 8955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +88 +F8 +88 +10 +E0 +ENDCHAR +STARTCHAR uni22FC +ENCODING 8956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +10 +90 +F0 +90 +10 +E0 +ENDCHAR +STARTCHAR uni22FD +ENCODING 8957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +E0 +10 +08 +78 +08 +10 +E0 +ENDCHAR +STARTCHAR uni22FE +ENCODING 8958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +00 +E0 +10 +70 +10 +E0 +ENDCHAR +STARTCHAR uni22FF +ENCODING 8959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +A8 +48 +B0 +ENDCHAR +STARTCHAR uni2301 +ENCODING 8961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +A8 +60 +20 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2303 +ENCODING 8963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR uni2304 +ENCODING 8964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2305 +ENCODING 8965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2306 +ENCODING 8966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +20 +50 +88 +ENDCHAR +STARTCHAR uni2307 +ENCODING 8967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +40 +80 +80 +40 +40 +80 +80 +40 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni230C +ENCODING 8972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni230D +ENCODING 8973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni230E +ENCODING 8974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni230F +ENCODING 8975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +80 +80 +ENDCHAR +STARTCHAR uni2311 +ENCODING 8977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +70 +50 +70 +88 +ENDCHAR +STARTCHAR uni2312 +ENCODING 8978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR uni2313 +ENCODING 8979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2314 +ENCODING 8980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +50 +20 +ENDCHAR +STARTCHAR uni2315 +ENCODING 8981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +C8 +F0 +ENDCHAR +STARTCHAR uni2316 +ENCODING 8982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +F8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2317 +ENCODING 8983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni2318 +ENCODING 8984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +70 +20 +70 +A8 +50 +ENDCHAR +STARTCHAR uni2319 +ENCODING 8985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +50 +50 +70 +A8 +B8 +88 +70 +50 +50 +70 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +70 +20 +20 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2322 +ENCODING 8994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni2323 +ENCODING 8995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni2324 +ENCODING 8996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2325 +ENCODING 8997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +18 +C0 +20 +18 +ENDCHAR +STARTCHAR uni2326 +ENCODING 8998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F0 +D8 +A4 +D8 +F0 +ENDCHAR +STARTCHAR uni2327 +ENCODING 8999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR uni2328 +ENCODING 9000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +FC +84 +AC +84 +AC +84 +AC +84 +AC +84 +FC +ENDCHAR +STARTCHAR uni232B +ENCODING 9003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +3C +6C +94 +6C +3C +ENDCHAR +STARTCHAR uni232C +ENCODING 9004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +C8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni232D +ENCODING 9005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +60 +D8 +30 +20 +40 +ENDCHAR +STARTCHAR uni232E +ENCODING 9006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +44 +5C +64 +38 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni232F +ENCODING 9007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +00 +F8 +00 +70 +ENDCHAR +STARTCHAR uni2330 +ENCODING 9008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +48 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2331 +ENCODING 9009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +40 +40 +A8 +FC +A8 +40 +40 +ENDCHAR +STARTCHAR uni2332 +ENCODING 9010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +80 +E0 +98 +FC +98 +E0 +80 +ENDCHAR +STARTCHAR uni2333 +ENCODING 9011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni2334 +ENCODING 9012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2335 +ENCODING 9013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +88 +50 +20 +ENDCHAR +STARTCHAR uni2336 +ENCODING 9014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2337 +ENCODING 9015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni2338 +ENCODING 9016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +F8 +88 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2339 +ENCODING 9017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233A +ENCODING 9018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +D8 +88 +D8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni233B +ENCODING 9019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +A8 +D8 +A8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni233C +ENCODING 9020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +88 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni233D +ENCODING 9021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni233E +ENCODING 9022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni233F +ENCODING 9023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +10 +F8 +40 +40 +80 +ENDCHAR +STARTCHAR uni2340 +ENCODING 9024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +40 +40 +F8 +10 +10 +08 +ENDCHAR +STARTCHAR uni2341 +ENCODING 9025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +98 +98 +A8 +A8 +A8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni2342 +ENCODING 9026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +C8 +C8 +A8 +A8 +A8 +98 +98 +F8 +ENDCHAR +STARTCHAR uni2343 +ENCODING 9027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +A8 +C8 +A8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2344 +ENCODING 9028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +A8 +98 +A8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2345 +ENCODING 9029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +10 +50 +F8 +50 +10 +10 +ENDCHAR +STARTCHAR uni2346 +ENCODING 9030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +50 +F8 +50 +40 +40 +ENDCHAR +STARTCHAR uni2347 +ENCODING 9031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +C8 +F8 +C8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2348 +ENCODING 9032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +98 +F8 +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2349 +ENCODING 9033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +70 +C8 +A8 +98 +70 +08 +08 +ENDCHAR +STARTCHAR uni234A +ENCODING 9034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni234B +ENCODING 9035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +20 +70 +70 +A8 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni234C +ENCODING 9036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni234D +ENCODING 9037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni234E +ENCODING 9038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni234F +ENCODING 9039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2350 +ENCODING 9040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +F8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2351 +ENCODING 9041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2352 +ENCODING 9042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +F8 +A8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2353 +ENCODING 9043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +A8 +D8 +D8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2354 +ENCODING 9044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +F8 +D8 +D8 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2355 +ENCODING 9045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2356 +ENCODING 9046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2357 +ENCODING 9047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2358 +ENCODING 9048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +00 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni2359 +ENCODING 9049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni235A +ENCODING 9050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +88 +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni235B +ENCODING 9051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +20 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235C +ENCODING 9052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +70 +00 +00 +F8 +ENDCHAR +STARTCHAR uni235D +ENCODING 9053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni235E +ENCODING 9054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni235F +ENCODING 9055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +A8 +F8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2360 +ENCODING 9056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +A8 +88 +88 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2361 +ENCODING 9057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2362 +ENCODING 9058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +00 +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2363 +ENCODING 9059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2364 +ENCODING 9060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 2 +BITMAP +A0 +00 +00 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2365 +ENCODING 9061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2366 +ENCODING 9062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2367 +ENCODING 9063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +78 +90 +90 +90 +78 +10 +10 +ENDCHAR +STARTCHAR uni2368 +ENCODING 9064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 3 +BITMAP +50 +00 +00 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2369 +ENCODING 9065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +50 +00 +00 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni236A +ENCODING 9066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +F8 +00 +00 +30 +20 +40 +ENDCHAR +STARTCHAR uni236B +ENCODING 9067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +88 +88 +7C +D8 +A0 +20 +ENDCHAR +STARTCHAR uni236C +ENCODING 9068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +E8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni236D +ENCODING 9069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni236E +ENCODING 9070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +20 +70 +20 +00 +30 +F8 +40 +ENDCHAR +STARTCHAR uni236F +ENCODING 9071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +98 +F8 +A8 +F8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni2370 +ENCODING 9072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +A8 +D8 +98 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni2371 +ENCODING 9073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +B8 +E8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2372 +ENCODING 9074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +E8 +B8 +88 +ENDCHAR +STARTCHAR uni2373 +ENCODING 9075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2374 +ENCODING 9076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +70 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2375 +ENCODING 9077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2376 +ENCODING 9078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +68 +90 +90 +90 +68 +00 +F8 +ENDCHAR +STARTCHAR uni2377 +ENCODING 9079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +60 +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni2378 +ENCODING 9080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +20 +20 +20 +10 +00 +F8 +ENDCHAR +STARTCHAR uni2379 +ENCODING 9081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +88 +A8 +A8 +50 +00 +F8 +ENDCHAR +STARTCHAR uni237A +ENCODING 9082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR uni237B +ENCODING 9083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +04 +08 +3C +10 +90 +60 +20 +ENDCHAR +STARTCHAR uni237C +ENCODING 9084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +40 +C0 +60 +40 +C0 +60 +50 +FC +C0 +E0 +ENDCHAR +STARTCHAR uni237D +ENCODING 9085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +CC +48 +78 +ENDCHAR +STARTCHAR uni237E +ENCODING 9086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +F8 +50 +D8 +ENDCHAR +STARTCHAR uni237F +ENCODING 9087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2380 +ENCODING 9088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +08 +78 +88 +78 +00 +88 +50 +20 +ENDCHAR +STARTCHAR uni2381 +ENCODING 9089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +10 +70 +90 +74 +00 +FC +ENDCHAR +STARTCHAR uni2382 +ENCODING 9090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +48 +24 +6C +B4 +6C +00 +6C +ENDCHAR +STARTCHAR uni2383 +ENCODING 9091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +84 +A4 +10 +B4 +50 +B4 +84 +ENDCHAR +STARTCHAR uni2384 +ENCODING 9092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +D4 +D4 +D4 +F8 +ENDCHAR +STARTCHAR uni2385 +ENCODING 9093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +A8 +A8 +A8 +A8 +F8 +20 +ENDCHAR +STARTCHAR uni2386 +ENCODING 9094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +50 +88 +24 +F4 +24 +88 +50 +20 +ENDCHAR +STARTCHAR uni2387 +ENCODING 9095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +1C +28 +40 +9C +ENDCHAR +STARTCHAR uni2388 +ENCODING 9096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2389 +ENCODING 9097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +84 +CC +B4 +78 +ENDCHAR +STARTCHAR uni238A +ENCODING 9098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +FC +CC +B4 +84 +78 +ENDCHAR +STARTCHAR uni238B +ENCODING 9099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E8 +C4 +A4 +14 +84 +78 +ENDCHAR +STARTCHAR uni238C +ENCODING 9100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +C8 +00 +50 +A8 +50 +ENDCHAR +STARTCHAR uni238D +ENCODING 9101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +50 +50 +50 +D8 +ENDCHAR +STARTCHAR uni238E +ENCODING 9102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR uni238F +ENCODING 9103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2390 +ENCODING 9104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +88 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2391 +ENCODING 9105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2392 +ENCODING 9106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +F8 +50 +20 +F8 +ENDCHAR +STARTCHAR uni2393 +ENCODING 9107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +00 +A8 +ENDCHAR +STARTCHAR uni2394 +ENCODING 9108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +48 +84 +48 +30 +ENDCHAR +STARTCHAR uni2395 +ENCODING 9109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2396 +ENCODING 9110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 1 +BITMAP +F0 +E0 +E0 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni2397 +ENCODING 9111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +BC +24 +84 +24 +FC +24 +84 +24 +3C +ENDCHAR +STARTCHAR uni2398 +ENCODING 9112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +D4 +80 +84 +90 +FC +90 +84 +80 +54 +ENDCHAR +STARTCHAR uni2399 +ENCODING 9113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +38 +68 +48 +CC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni239A +ENCODING 9114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +A4 +D4 +AC +94 +78 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +60 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 0 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23B0 +ENCODING 9136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni23B1 +ENCODING 9137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni23B2 +ENCODING 9138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +80 +80 +40 +40 +40 +20 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni23B3 +ENCODING 9139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +20 +20 +20 +40 +40 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni23B4 +ENCODING 9140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +F8 +88 +ENDCHAR +STARTCHAR uni23B5 +ENCODING 9141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni23B6 +ENCODING 9142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +88 +F8 +00 +00 +F8 +88 +ENDCHAR +STARTCHAR uni23B7 +ENCODING 9143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +A0 +A0 +60 +60 +20 +20 +ENDCHAR +STARTCHAR uni23B8 +ENCODING 9144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23B9 +ENCODING 9145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BE +ENCODING 9150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BF +ENCODING 9151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23C0 +ENCODING 9152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C1 +ENCODING 9153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni23C2 +ENCODING 9154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni23C3 +ENCODING 9155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C4 +ENCODING 9156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +20 +20 +70 +70 +A8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni23C5 +ENCODING 9157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +70 +70 +A8 +F8 +20 +F8 +ENDCHAR +STARTCHAR uni23C6 +ENCODING 9158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C7 +ENCODING 9159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +68 +B0 +20 +20 +20 +ENDCHAR +STARTCHAR uni23C8 +ENCODING 9160 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23C9 +ENCODING 9161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni23CA +ENCODING 9162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni23CB +ENCODING 9163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23CC +ENCODING 9164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23CD +ENCODING 9165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +A8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni23CE +ENCODING 9166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +58 +F8 +F0 +40 +ENDCHAR +STARTCHAR uni23CF +ENCODING 9167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni23D0 +ENCODING 9168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23D1 +ENCODING 9169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni23D2 +ENCODING 9170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +88 +70 +ENDCHAR +STARTCHAR uni23D3 +ENCODING 9171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +70 +00 +F8 +ENDCHAR +STARTCHAR uni23D4 +ENCODING 9172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +00 +B4 +48 +ENDCHAR +STARTCHAR uni23D5 +ENCODING 9173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +B4 +48 +00 +FC +ENDCHAR +STARTCHAR uni23D6 +ENCODING 9174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +B4 +48 +ENDCHAR +STARTCHAR uni23D7 +ENCODING 9175 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni23D8 +ENCODING 9176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +F8 +ENDCHAR +STARTCHAR uni23D9 +ENCODING 9177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni23DA +ENCODING 9178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +20 +F8 +00 +70 +00 +20 +ENDCHAR +STARTCHAR uni23DB +ENCODING 9179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +48 +FC +48 +78 +ENDCHAR +STARTCHAR uni23DC +ENCODING 9180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23DD +ENCODING 9181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23DE +ENCODING 9182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +30 +CC +84 +ENDCHAR +STARTCHAR uni23DF +ENCODING 9183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 4 +BITMAP +84 +CC +30 +ENDCHAR +STARTCHAR uni23E0 +ENCODING 9184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 0 +BITMAP +78 +84 +ENDCHAR +STARTCHAR uni23E1 +ENCODING 9185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 5 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni23E2 +ENCODING 9186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +E0 +90 +88 +84 +FC +ENDCHAR +STARTCHAR uni23E3 +ENCODING 9187 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +30 +78 +CC +84 +CC +78 +30 +ENDCHAR +STARTCHAR uni23E4 +ENCODING 9188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni23E5 +ENCODING 9189 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +7C +44 +88 +F8 +ENDCHAR +STARTCHAR uni23E6 +ENCODING 9190 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +A0 +FC +14 +08 +ENDCHAR +STARTCHAR uni23E7 +ENCODING 9191 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A4 +A8 +B0 +30 +48 +84 +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +90 +D0 +B0 +90 +50 +50 +70 +20 +20 +20 +38 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +E0 +50 +50 +20 +28 +38 +28 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +60 +80 +40 +20 +C0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +20 +28 +10 +28 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +50 +50 +20 +38 +10 +10 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E8 +68 +58 +48 +10 +28 +28 +18 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +A0 +E0 +A0 +30 +40 +30 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +C0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +A0 +C0 +A0 +C0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +E0 +A0 +B8 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +80 +80 +E0 +00 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +A0 +A0 +40 +78 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +80 +C0 +B8 +A0 +30 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +80 +70 +28 +30 +28 +28 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +D0 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +38 +10 +10 +38 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +40 +40 +70 +38 +20 +30 +20 +38 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +10 +30 +10 +38 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +30 +08 +10 +38 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +30 +08 +10 +08 +30 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +C0 +A0 +A0 +C0 +30 +40 +30 +00 +20 +28 +38 +08 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +90 +D0 +B0 +00 +20 +50 +70 +50 +00 +28 +30 +28 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +40 +20 +C0 +50 +50 +20 +20 +48 +68 +58 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +80 +E0 +70 +20 +38 +34 +18 +14 +18 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +80 +60 +00 +20 +50 +70 +50 +00 +68 +58 +48 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +E0 +80 +C0 +80 +E0 +00 +50 +70 +50 +50 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +80 +40 +E0 +50 +50 +20 +38 +14 +18 +14 +18 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +E0 +80 +C0 +80 +F0 +40 +20 +70 +00 +18 +20 +18 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +80 +C0 +80 +98 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +80 +B0 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +A0 +C0 +A0 +A0 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +90 +90 +90 +60 +18 +20 +10 +08 +30 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +80 +40 +20 +C0 +30 +28 +30 +20 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +C0 +A0 +A0 +F0 +40 +60 +40 +70 +20 +20 +38 +ENDCHAR +STARTCHAR uni2422 +ENCODING 9250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +40 +F0 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni2423 +ENCODING 9251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +88 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +D0 +B0 +90 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2425 +ENCODING 9253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +90 +A0 +28 +48 +90 +90 +ENDCHAR +STARTCHAR uni2426 +ENCODING 9254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +80 +40 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2440 +ENCODING 9280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +28 +28 +20 +20 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2441 +ENCODING 9281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni2442 +ENCODING 9282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2443 +ENCODING 9283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2444 +ENCODING 9284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni2445 +ENCODING 9285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni2446 +ENCODING 9286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +D8 +C0 +C0 +D8 +18 +18 +ENDCHAR +STARTCHAR uni2447 +ENCODING 9287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +20 +20 +80 +80 +80 +ENDCHAR +STARTCHAR uni2448 +ENCODING 9288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +AC +AC +AC +A0 +A0 +ENDCHAR +STARTCHAR uni2449 +ENCODING 9289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni244A +ENCODING 9290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +50 +50 +28 +28 +14 +14 +ENDCHAR +STARTCHAR uni2460 +ENCODING 9312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2461 +ENCODING 9313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2462 +ENCODING 9314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2463 +ENCODING 9315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2464 +ENCODING 9316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2465 +ENCODING 9317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2466 +ENCODING 9318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2467 +ENCODING 9319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2468 +ENCODING 9320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2469 +ENCODING 9321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246A +ENCODING 9322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni246B +ENCODING 9323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +CC +D4 +DC +84 +78 +ENDCHAR +STARTCHAR uni246C +ENCODING 9324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +CC +D4 +CC +D4 +84 +78 +ENDCHAR +STARTCHAR uni246D +ENCODING 9325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +DC +CC +84 +78 +ENDCHAR +STARTCHAR uni246E +ENCODING 9326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +D4 +DC +CC +DC +84 +78 +ENDCHAR +STARTCHAR uni246F +ENCODING 9327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +D4 +DC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2470 +ENCODING 9328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +DC +CC +D4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni2471 +ENCODING 9329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni2472 +ENCODING 9330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +CC +C4 +DC +84 +78 +ENDCHAR +STARTCHAR uni2473 +ENCODING 9331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +EC +B4 +B4 +D4 +EC +84 +78 +ENDCHAR +STARTCHAR uni2474 +ENCODING 9332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +E8 +A8 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2475 +ENCODING 9333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +98 +A8 +F8 +88 +50 +ENDCHAR +STARTCHAR uni2476 +ENCODING 9334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +E8 +98 +A8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2477 +ENCODING 9335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +C8 +C8 +E8 +F8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni2478 +ENCODING 9336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +C8 +E8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni2479 +ENCODING 9337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +B8 +C8 +E8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247A +ENCODING 9338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +F8 +98 +A8 +A8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247B +ENCODING 9339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +A8 +D8 +A8 +88 +50 +ENDCHAR +STARTCHAR uni247C +ENCODING 9340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +88 +A8 +D8 +B8 +98 +E8 +88 +50 +ENDCHAR +STARTCHAR uni247D +ENCODING 9341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +EC +EC +EC +D4 +84 +48 +ENDCHAR +STARTCHAR uni247E +ENCODING 9342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni247F +ENCODING 9343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +CC +D4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2480 +ENCODING 9344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +CC +D4 +CC +D4 +84 +48 +ENDCHAR +STARTCHAR uni2481 +ENCODING 9345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +DC +CC +84 +48 +ENDCHAR +STARTCHAR uni2482 +ENCODING 9346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +D4 +DC +CC +DC +84 +48 +ENDCHAR +STARTCHAR uni2483 +ENCODING 9347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +D4 +D4 +DC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2484 +ENCODING 9348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +DC +CC +D4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni2485 +ENCODING 9349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +D4 +CC +84 +48 +ENDCHAR +STARTCHAR uni2486 +ENCODING 9350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +CC +D4 +CC +C4 +DC +84 +48 +ENDCHAR +STARTCHAR uni2487 +ENCODING 9351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +EC +B4 +B4 +D4 +EC +84 +48 +ENDCHAR +STARTCHAR uni2488 +ENCODING 9352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +C0 +40 +40 +40 +40 +E8 +ENDCHAR +STARTCHAR uni2489 +ENCODING 9353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +10 +10 +20 +20 +40 +F4 +ENDCHAR +STARTCHAR uni248A +ENCODING 9354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +10 +60 +10 +10 +E4 +ENDCHAR +STARTCHAR uni248B +ENCODING 9355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +40 +90 +90 +F8 +10 +14 +ENDCHAR +STARTCHAR uni248C +ENCODING 9356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F0 +80 +E0 +10 +10 +90 +64 +ENDCHAR +STARTCHAR uni248D +ENCODING 9357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +40 +80 +E0 +90 +90 +64 +ENDCHAR +STARTCHAR uni248E +ENCODING 9358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +24 +ENDCHAR +STARTCHAR uni248F +ENCODING 9359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +60 +90 +90 +64 +ENDCHAR +STARTCHAR uni2490 +ENCODING 9360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +60 +90 +90 +70 +10 +10 +64 +ENDCHAR +STARTCHAR uni2491 +ENCODING 9361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +A8 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2492 +ENCODING 9362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A8 +ENDCHAR +STARTCHAR uni2493 +ENCODING 9363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +A0 +A0 +B4 +ENDCHAR +STARTCHAR uni2494 +ENCODING 9364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B0 +88 +88 +90 +88 +88 +B4 +ENDCHAR +STARTCHAR uni2495 +ENCODING 9365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +A0 +B0 +B0 +B8 +90 +94 +ENDCHAR +STARTCHAR uni2496 +ENCODING 9366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +A0 +A0 +90 +90 +90 +A4 +ENDCHAR +STARTCHAR uni2497 +ENCODING 9367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +88 +90 +A0 +B0 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni2498 +ENCODING 9368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +B8 +88 +88 +88 +90 +90 +94 +ENDCHAR +STARTCHAR uni2499 +ENCODING 9369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +90 +A8 +A8 +94 +ENDCHAR +STARTCHAR uni249A +ENCODING 9370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +A8 +A8 +98 +88 +90 +A4 +ENDCHAR +STARTCHAR uni249B +ENCODING 9371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +68 +68 +68 +A8 +A8 +D4 +ENDCHAR +STARTCHAR uni249C +ENCODING 9372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni249D +ENCODING 9373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +B4 +84 +48 +ENDCHAR +STARTCHAR uni249E +ENCODING 9374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni249F +ENCODING 9375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +B4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A0 +ENCODING 9376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +AC +BC +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A1 +ENCODING 9377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +A4 +F4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24A2 +ENCODING 9378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +D4 +B4 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A3 +ENCODING 9379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +AC +AC +84 +48 +ENDCHAR +STARTCHAR uni24A4 +ENCODING 9380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A5 +ENCODING 9381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +94 +84 +94 +94 +A4 +48 +ENDCHAR +STARTCHAR uni24A6 +ENCODING 9382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +B4 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24A7 +ENCODING 9383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +94 +94 +94 +94 +94 +84 +48 +ENDCHAR +STARTCHAR uni24A8 +ENCODING 9384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +EC +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24A9 +ENCODING 9385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +E4 +D4 +D4 +84 +48 +ENDCHAR +STARTCHAR uni24AA +ENCODING 9386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +94 +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24AB +ENCODING 9387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +AC +B4 +A4 +48 +ENDCHAR +STARTCHAR uni24AC +ENCODING 9388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +D4 +B4 +94 +48 +ENDCHAR +STARTCHAR uni24AD +ENCODING 9389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +B4 +A4 +A4 +84 +48 +ENDCHAR +STARTCHAR uni24AE +ENCODING 9390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +A4 +94 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24AF +ENCODING 9391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +A4 +A4 +F4 +A4 +94 +84 +48 +ENDCHAR +STARTCHAR uni24B0 +ENCODING 9392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +D4 +D4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B1 +ENCODING 9393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +84 +48 +ENDCHAR +STARTCHAR uni24B2 +ENCODING 9394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +C4 +D4 +BC +84 +48 +ENDCHAR +STARTCHAR uni24B3 +ENCODING 9395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +94 +AC +84 +48 +ENDCHAR +STARTCHAR uni24B4 +ENCODING 9396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +84 +AC +AC +94 +A4 +48 +ENDCHAR +STARTCHAR uni24B5 +ENCODING 9397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +48 +84 +84 +B4 +94 +A4 +B4 +84 +48 +ENDCHAR +STARTCHAR uni24B6 +ENCODING 9398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24B7 +ENCODING 9399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24B8 +ENCODING 9400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +A4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24B9 +ENCODING 9401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +AC +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BA +ENCODING 9402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BB +ENCODING 9403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +A4 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24BC +ENCODING 9404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +C4 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24BD +ENCODING 9405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24BE +ENCODING 9406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24BF +ENCODING 9407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +94 +94 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C0 +ENCODING 9408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C1 +ENCODING 9409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C2 +ENCODING 9410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +AC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C3 +ENCODING 9411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +BC +BC +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C4 +ENCODING 9412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24C5 +ENCODING 9413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24C6 +ENCODING 9414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +D4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24C7 +ENCODING 9415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24C8 +ENCODING 9416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +9C +A4 +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni24C9 +ENCODING 9417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CA +ENCODING 9418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24CB +ENCODING 9419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +AC +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CC +ENCODING 9420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +C4 +D4 +D4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CD +ENCODING 9421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24CE +ENCODING 9422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +AC +AC +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24CF +ENCODING 9423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24D0 +ENCODING 9424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D1 +ENCODING 9425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D2 +ENCODING 9426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D3 +ENCODING 9427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +B4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24D4 +ENCODING 9428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +BC +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D5 +ENCODING 9429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +F4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24D6 +ENCODING 9430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +D4 +B4 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24D7 +ENCODING 9431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +AC +AC +84 +78 +ENDCHAR +STARTCHAR uni24D8 +ENCODING 9432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24D9 +ENCODING 9433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +94 +84 +94 +94 +A4 +78 +ENDCHAR +STARTCHAR uni24DA +ENCODING 9434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +B4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24DB +ENCODING 9435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +94 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni24DC +ENCODING 9436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +EC +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DD +ENCODING 9437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +E4 +D4 +D4 +84 +78 +ENDCHAR +STARTCHAR uni24DE +ENCODING 9438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24DF +ENCODING 9439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +AC +B4 +A4 +78 +ENDCHAR +STARTCHAR uni24E0 +ENCODING 9440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +D4 +B4 +94 +78 +ENDCHAR +STARTCHAR uni24E1 +ENCODING 9441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni24E2 +ENCODING 9442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +A4 +94 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E3 +ENCODING 9443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +A4 +F4 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni24E4 +ENCODING 9444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +D4 +D4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24E5 +ENCODING 9445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24E6 +ENCODING 9446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +C4 +D4 +BC +84 +78 +ENDCHAR +STARTCHAR uni24E7 +ENCODING 9447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +94 +AC +84 +78 +ENDCHAR +STARTCHAR uni24E8 +ENCODING 9448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +84 +AC +AC +94 +A4 +78 +ENDCHAR +STARTCHAR uni24E9 +ENCODING 9449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +84 +B4 +94 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni24EA +ENCODING 9450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +AC +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni24EB +ENCODING 9451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24EC +ENCODING 9452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +B4 +AC +A4 +FC +78 +ENDCHAR +STARTCHAR uni24ED +ENCODING 9453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +B4 +AC +B4 +AC +FC +78 +ENDCHAR +STARTCHAR uni24EE +ENCODING 9454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A4 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24EF +ENCODING 9455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +AC +A4 +B4 +A4 +FC +78 +ENDCHAR +STARTCHAR uni24F0 +ENCODING 9456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +AC +A4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F1 +ENCODING 9457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +A4 +B4 +AC +AC +AC +FC +78 +ENDCHAR +STARTCHAR uni24F2 +ENCODING 9458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B4 +A8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F3 +ENCODING 9459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +A8 +B0 +B8 +B4 +FC +78 +ENDCHAR +STARTCHAR uni24F4 +ENCODING 9460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +C8 +C8 +A8 +94 +FC +78 +ENDCHAR +STARTCHAR uni24F5 +ENCODING 9461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +E8 +A8 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F6 +ENCODING 9462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +98 +A8 +F8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F7 +ENCODING 9463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +E8 +98 +A8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F8 +ENCODING 9464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +C8 +C8 +E8 +F8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24F9 +ENCODING 9465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +C8 +E8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FA +ENCODING 9466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +B8 +C8 +E8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FB +ENCODING 9467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +F8 +98 +A8 +A8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FC +ENCODING 9468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +A8 +D8 +A8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FD +ENCODING 9469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +70 +F8 +88 +A8 +D8 +B8 +98 +E8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni24FE +ENCODING 9470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +FC +84 +D4 +EC +EC +EC +D4 +84 +FC +78 +ENDCHAR +STARTCHAR uni24FF +ENCODING 9471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +B4 +B4 +CC +FC +78 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +3C +FC +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +3C +FC +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +3C +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 2 2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 1 2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 0 2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +20 +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 0 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 1 3 3 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 2 3 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +1C +FC +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +E0 +FC +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +00 +54 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +54 +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +A8 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 12 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +D8 +A8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 2 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +90 +90 +90 +90 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +78 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +3C +48 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +70 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +50 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +E0 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +C0 +A0 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +70 +F0 +70 +30 +10 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +B4 +B4 +48 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +08 +80 +04 +40 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +FC +78 +30 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +E4 +68 +30 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +9C +58 +30 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +48 +84 +FC +78 +30 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +78 +FC +84 +48 +30 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +9C +84 +48 +30 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +68 +E4 +84 +48 +30 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +08 +38 +78 +78 +F8 +78 +78 +38 +08 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +80 +E0 +F0 +F0 +F8 +F0 +F0 +E0 +80 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +CC +B4 +78 +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DA +ENCODING 9690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +CC +B4 +78 +ENDCHAR +STARTCHAR uni25DB +ENCODING 9691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +78 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 3 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 3 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 3 0 +BITMAP +20 +40 +80 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 0 0 +BITMAP +80 +40 +20 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +48 +84 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 0 +BITMAP +84 +48 +30 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +E8 +C8 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +B8 +F8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +70 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +70 +70 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +88 +20 +70 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni2601 +ENCODING 9729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +60 +F8 +FC +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +F8 +F8 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni2603 +ENCODING 9731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +74 +50 +A8 +50 +54 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2604 +ENCODING 9732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +08 +48 +50 +54 +44 +08 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni2607 +ENCODING 9735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +10 +20 +40 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2608 +ENCODING 9736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +90 +90 +A0 +A0 +98 +98 +B8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +50 +A8 +50 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +50 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +90 +90 +60 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +30 +20 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +70 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +70 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +84 +8C +8C +94 +94 +D4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +B4 +B4 +B4 +CC +CC +FC +ENDCHAR +STARTCHAR uni2613 +ENCODING 9747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2616 +ENCODING 9750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2617 +ENCODING 9751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2619 +ENCODING 9753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +24 +74 +F8 +E8 +F4 +74 +28 +ENDCHAR +STARTCHAR uni261A +ENCODING 9754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +7C +7C +3C +ENDCHAR +STARTCHAR uni261B +ENCODING 9755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +F8 +F8 +F0 +ENDCHAR +STARTCHAR uni261C +ENCODING 9756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +4C +4C +3C +ENDCHAR +STARTCHAR uni261D +ENCODING 9757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +30 +F0 +D0 +90 +90 +F0 +F0 +ENDCHAR +STARTCHAR uni261E +ENCODING 9758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +C8 +C8 +F0 +ENDCHAR +STARTCHAR uni261F +ENCODING 9759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +F0 +F0 +90 +90 +D0 +F0 +30 +10 +10 +ENDCHAR +STARTCHAR uni2620 +ENCODING 9760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +A8 +F8 +70 +50 +20 +88 +70 +88 +ENDCHAR +STARTCHAR uni2621 +ENCODING 9761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR uni2622 +ENCODING 9762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2623 +ENCODING 9763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +FC +48 +48 +30 +48 +ENDCHAR +STARTCHAR uni2624 +ENCODING 9764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +F8 +70 +50 +70 +50 +70 +50 +20 +ENDCHAR +STARTCHAR uni2625 +ENCODING 9765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2626 +ENCODING 9766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +60 +30 +20 +ENDCHAR +STARTCHAR uni2627 +ENCODING 9767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +28 +30 +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR uni2628 +ENCODING 9768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2629 +ENCODING 9769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +E4 +C8 +DC +C8 +D4 +C0 +E4 +78 +ENDCHAR +STARTCHAR uni262B +ENCODING 9771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +50 +00 +20 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni262C +ENCODING 9772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +70 +88 +70 +70 +A8 +ENDCHAR +STARTCHAR uni262D +ENCODING 9773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +70 +88 +28 +68 +C8 +A8 +18 +48 +B4 +ENDCHAR +STARTCHAR uni262E +ENCODING 9774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +EC +A4 +FC +78 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2638 +ENCODING 9784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +D8 +D8 +88 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +F8 +A8 +A8 +F8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +88 +20 +50 +20 +88 +20 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +C8 +28 +28 +28 +C8 +70 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +98 +A0 +A0 +A0 +98 +70 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +70 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +1C +0C +74 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +A8 +28 +28 +48 +F8 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +50 +68 +48 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +A8 +F8 +A8 +A8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A8 +FC +A8 +A8 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +48 +30 +48 +48 +30 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +A0 +48 +14 +88 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +70 +88 +48 +28 +68 +A8 +48 +04 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +AC +FC +AC +AC +AC +A8 +A8 +18 +28 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +A8 +F8 +A8 +A8 +A8 +A8 +A8 +0C +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +90 +A8 +B0 +C8 +88 +30 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +70 +D8 +88 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +68 +88 +E8 +28 +28 +44 +7C +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +50 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A8 +F8 +F8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +D8 +88 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +38 +58 +F8 +F8 +38 +38 +7C +7C +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +A8 +A8 +88 +50 +20 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +70 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +90 +48 +90 +48 +00 +50 +88 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 0 0 +BITMAP +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +48 +48 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +58 +68 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +80 +90 +B0 +D0 +90 +B0 +D0 +90 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2670 +ENCODING 9840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +20 +A8 +70 +A8 +20 +20 +50 +ENDCHAR +STARTCHAR uni2671 +ENCODING 9841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +50 +20 +D8 +A8 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni2672 +ENCODING 9842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +C8 +44 +8C +80 +94 +38 +10 +ENDCHAR +STARTCHAR uni2673 +ENCODING 9843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +58 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni2674 +ENCODING 9844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2675 +ENCODING 9845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2676 +ENCODING 9846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +30 +94 +84 +DC +ENDCHAR +STARTCHAR uni2677 +ENCODING 9847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +20 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2678 +ENCODING 9848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +68 +30 +B4 +84 +DC +ENDCHAR +STARTCHAR uni2679 +ENCODING 9849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +78 +10 +94 +84 +DC +ENDCHAR +STARTCHAR uni267A +ENCODING 9850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +00 +84 +84 +DC +ENDCHAR +STARTCHAR uni267B +ENCODING 9851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +28 +CC +CC +80 +94 +B8 +10 +ENDCHAR +STARTCHAR uni267C +ENCODING 9852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +FC +C4 +D4 +30 +30 +7C +68 +44 +EC +FC +78 +ENDCHAR +STARTCHAR uni267D +ENCODING 9853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +78 +84 +30 +28 +CC +CC +80 +94 +B8 +10 +84 +78 +ENDCHAR +STARTCHAR uni267E +ENCODING 9854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +00 +50 +A8 +50 +00 +88 +70 +ENDCHAR +STARTCHAR uni267F +ENCODING 9855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +40 +78 +40 +F0 +98 +64 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +A8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +88 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +C8 +88 +A8 +88 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +88 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +A8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +D8 +88 +D8 +88 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni2686 +ENCODING 9862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +98 +88 +70 +ENDCHAR +STARTCHAR uni2687 +ENCODING 9863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2688 +ENCODING 9864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +E8 +F8 +70 +ENDCHAR +STARTCHAR uni2689 +ENCODING 9865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +F8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni268A +ENCODING 9866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR uni268B +ENCODING 9867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni268C +ENCODING 9868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268D +ENCODING 9869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +F8 +F8 +ENDCHAR +STARTCHAR uni268E +ENCODING 9870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +F8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni268F +ENCODING 9871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +98 +88 +C8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +F8 +F8 +F8 +B8 +80 +80 +ENDCHAR +STARTCHAR uni2692 +ENCODING 9874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +CC +B4 +30 +48 +84 +ENDCHAR +STARTCHAR uni2693 +ENCODING 9875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +F8 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2694 +ENCODING 9876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +88 +ENDCHAR +STARTCHAR uni2695 +ENCODING 9877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +A0 +70 +28 +30 +60 +30 +20 +ENDCHAR +STARTCHAR uni2696 +ENCODING 9878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +A8 +88 +88 +D8 +D8 +ENDCHAR +STARTCHAR uni2697 +ENCODING 9879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +38 +5C +88 +00 +1C +14 +ENDCHAR +STARTCHAR uni2698 +ENCODING 9880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +20 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2699 +ENCODING 9881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +A8 +88 +F8 +20 +ENDCHAR +STARTCHAR uni269A +ENCODING 9882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +A8 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni269B +ENCODING 9883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +70 +D8 +70 +D8 +70 +A8 +ENDCHAR +STARTCHAR uni269C +ENCODING 9884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +88 +A8 +50 +50 +20 +ENDCHAR +STARTCHAR uni26A0 +ENCODING 9888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +88 +A8 +A8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR uni26A1 +ENCODING 9889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +F0 +20 +40 +80 +ENDCHAR +STARTCHAR uni26A2 +ENCODING 9890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +70 +50 +F8 +50 +ENDCHAR +STARTCHAR uni26A3 +ENCODING 9891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +20 +6C +98 +A8 +48 +30 +ENDCHAR +STARTCHAR uni26A4 +ENCODING 9892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +0C +0C +18 +64 +A4 +98 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26A5 +ENCODING 9893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +10 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A6 +ENCODING 9894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +0C +18 +18 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A7 +ENCODING 9895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +30 +48 +48 +30 +20 +70 +20 +ENDCHAR +STARTCHAR uni26A8 +ENCODING 9896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +A8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26A9 +ENCODING 9897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +48 +ENDCHAR +STARTCHAR uni26AA +ENCODING 9898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AB +ENCODING 9899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26AC +ENCODING 9900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni26AD +ENCODING 9901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni26AE +ENCODING 9902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni26AF +ENCODING 9903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni26B0 +ENCODING 9904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +50 +88 +88 +88 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B1 +ENCODING 9905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +50 +70 +88 +88 +88 +50 +50 +70 +ENDCHAR +STARTCHAR uni26B2 +ENCODING 9906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni26B3 +ENCODING 9907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +E0 +10 +10 +10 +60 +40 +E0 +40 +ENDCHAR +STARTCHAR uni26B4 +ENCODING 9908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +88 +50 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B5 +ENCODING 9909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B6 +ENCODING 9910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +20 +88 +50 +20 +00 +D8 +20 +ENDCHAR +STARTCHAR uni26B7 +ENCODING 9911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +30 +20 +30 +28 +20 +70 +88 +70 +ENDCHAR +STARTCHAR uni26B8 +ENCODING 9912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +70 +C0 +C0 +C0 +C0 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni26B9 +ENCODING 9913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR uni26BA +ENCODING 9914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +ENDCHAR +STARTCHAR uni26BB +ENCODING 9915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni26BC +ENCODING 9916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +A8 +F8 +20 +30 +ENDCHAR +STARTCHAR uni26C0 +ENCODING 9920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C1 +ENCODING 9921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +F8 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni26C2 +ENCODING 9922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni26C3 +ENCODING 9923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +70 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2701 +ENCODING 9985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +FC +20 +40 +60 +ENDCHAR +STARTCHAR uni2702 +ENCODING 9986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +C8 +30 +C8 +C4 +ENDCHAR +STARTCHAR uni2703 +ENCODING 9987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +40 +20 +FC +90 +ENDCHAR +STARTCHAR uni2704 +ENCODING 9988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +94 +E8 +30 +E8 +94 +CC +ENDCHAR +STARTCHAR uni2706 +ENCODING 9990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +B4 +A4 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni2707 +ENCODING 9991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +84 +B4 +84 +B4 +84 +CC +84 +78 +ENDCHAR +STARTCHAR uni2708 +ENCODING 9992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B0 +FC +B0 +20 +ENDCHAR +STARTCHAR uni2709 +ENCODING 9993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +CC +B4 +84 +FC +ENDCHAR +STARTCHAR uni270C +ENCODING 9996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +50 +70 +F0 +F0 +F0 +70 +ENDCHAR +STARTCHAR uni270D +ENCODING 9997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +04 +38 +7C +7C +40 +80 +ENDCHAR +STARTCHAR uni270E +ENCODING 9998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +50 +28 +14 +0C +ENDCHAR +STARTCHAR uni270F +ENCODING 9999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +F8 +8C +F8 +ENDCHAR +STARTCHAR uni2710 +ENCODING 10000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +14 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni2711 +ENCODING 10001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +F8 +84 +84 +F8 +ENDCHAR +STARTCHAR uni2712 +ENCODING 10002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +F8 +F4 +F8 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +10 +10 +A0 +E0 +40 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +0C +1C +D8 +F8 +70 +30 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +F8 +20 +F8 +D8 +ENDCHAR +STARTCHAR uni2717 +ENCODING 10007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +80 +ENDCHAR +STARTCHAR uni2718 +ENCODING 10008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +CC +CC +78 +70 +FC +CC +C0 +ENDCHAR +STARTCHAR uni2719 +ENCODING 10009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +CC +A4 +F4 +A4 +CC +78 +ENDCHAR +STARTCHAR uni271A +ENCODING 10010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni271B +ENCODING 10011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +D8 +20 +20 +ENDCHAR +STARTCHAR uni271C +ENCODING 10012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +CC +CC +30 +30 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni271E +ENCODING 10014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +70 +50 +D8 +88 +D8 +50 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni271F +ENCODING 10015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +DC +BC +DC +58 +58 +58 +78 +78 +ENDCHAR +STARTCHAR uni2720 +ENCODING 10016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +20 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2721 +ENCODING 10017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +50 +50 +50 +F8 +20 +ENDCHAR +STARTCHAR uni2722 +ENCODING 10018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2723 +ENCODING 10019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +FC +FC +30 +30 +ENDCHAR +STARTCHAR uni2724 +ENCODING 10020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +30 +FC +FC +30 +78 +30 +ENDCHAR +STARTCHAR uni2725 +ENCODING 10021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2726 +ENCODING 10022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2727 +ENCODING 10023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2729 +ENCODING 10025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +D8 +50 +20 +50 +ENDCHAR +STARTCHAR uni272A +ENCODING 10026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +88 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni272B +ENCODING 10027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +50 +70 +88 +ENDCHAR +STARTCHAR uni272C +ENCODING 10028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni272D +ENCODING 10029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272E +ENCODING 10030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni272F +ENCODING 10031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +E8 +30 +50 +88 +ENDCHAR +STARTCHAR uni2730 +ENCODING 10032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +58 +8C +58 +AC +58 +ENDCHAR +STARTCHAR uni2731 +ENCODING 10033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2732 +ENCODING 10034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2733 +ENCODING 10035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2734 +ENCODING 10036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2735 +ENCODING 10037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2736 +ENCODING 10038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2737 +ENCODING 10039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2738 +ENCODING 10040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +20 +A8 +70 +70 +A8 +20 +50 +ENDCHAR +STARTCHAR uni2739 +ENCODING 10041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +F8 +7C +F8 +7C +F8 +50 +ENDCHAR +STARTCHAR uni273A +ENCODING 10042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +A8 +74 +F8 +74 +A8 +50 +ENDCHAR +STARTCHAR uni273B +ENCODING 10043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273C +ENCODING 10044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +50 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273D +ENCODING 10045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni273E +ENCODING 10046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +D8 +50 +A8 +74 +A8 +20 +ENDCHAR +STARTCHAR uni273F +ENCODING 10047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +F8 +D8 +70 +F8 +D8 +ENDCHAR +STARTCHAR uni2740 +ENCODING 10048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +70 +D8 +A8 +50 +F8 +D8 +ENDCHAR +STARTCHAR uni2741 +ENCODING 10049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +70 +D8 +70 +F8 +20 +ENDCHAR +STARTCHAR uni2742 +ENCODING 10050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +A8 +D8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni2743 +ENCODING 10051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2744 +ENCODING 10052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2745 +ENCODING 10053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2746 +ENCODING 10054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +A8 +70 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2747 +ENCODING 10055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2748 +ENCODING 10056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2749 +ENCODING 10057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274A +ENCODING 10058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274B +ENCODING 10059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni274D +ENCODING 10061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +78 +8C +8C +8C +78 +ENDCHAR +STARTCHAR uni274F +ENCODING 10063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2750 +ENCODING 10064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2751 +ENCODING 10065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F8 +8C +8C +8C +FC +7C +ENDCHAR +STARTCHAR uni2752 +ENCODING 10066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +FC +8C +8C +8C +F8 +ENDCHAR +STARTCHAR uni2756 +ENCODING 10070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +38 +54 +EC +54 +38 +10 +ENDCHAR +STARTCHAR uni2758 +ENCODING 10072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2759 +ENCODING 10073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni275A +ENCODING 10074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni275B +ENCODING 10075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +80 +E0 +F0 +60 +ENDCHAR +STARTCHAR uni275C +ENCODING 10076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 4 +BITMAP +60 +F0 +70 +10 +60 +ENDCHAR +STARTCHAR uni275D +ENCODING 10077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +90 +D8 +FC +48 +ENDCHAR +STARTCHAR uni275E +ENCODING 10078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 4 +BITMAP +48 +FC +6C +24 +48 +ENDCHAR +STARTCHAR uni2761 +ENCODING 10081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +C8 +C8 +78 +08 +C8 +88 +70 +ENDCHAR +STARTCHAR uni2762 +ENCODING 10082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2763 +ENCODING 10083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +F8 +70 +20 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2764 +ENCODING 10084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2765 +ENCODING 10085 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +F0 +F0 +78 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2766 +ENCODING 10086 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +B8 +20 +D8 +F8 +F0 +E4 +78 +ENDCHAR +STARTCHAR uni2767 +ENCODING 10087 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +58 +78 +DC +98 +40 +ENDCHAR +STARTCHAR uni2768 +ENCODING 10088 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2769 +ENCODING 10089 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +40 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni276A +ENCODING 10090 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +ENDCHAR +STARTCHAR uni276B +ENCODING 10091 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +C0 +C0 +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni276C +ENCODING 10092 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +30 +60 +60 +C0 +60 +60 +30 +30 +ENDCHAR +STARTCHAR uni276D +ENCODING 10093 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +C0 +60 +60 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni276E +ENCODING 10094 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR uni276F +ENCODING 10095 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR uni2770 +ENCODING 10096 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +38 +70 +70 +E0 +70 +70 +38 +38 +ENDCHAR +STARTCHAR uni2771 +ENCODING 10097 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +E0 +70 +70 +38 +70 +70 +E0 +E0 +ENDCHAR +STARTCHAR uni2772 +ENCODING 10098 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2773 +ENCODING 10099 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2774 +ENCODING 10100 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +30 +60 +60 +60 +C0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni2775 +ENCODING 10101 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 -1 +BITMAP +C0 +60 +60 +60 +30 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +E8 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +98 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +E8 +98 +A8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +C8 +C8 +E8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +C8 +E8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +B8 +C8 +E8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +F8 +98 +A8 +A8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +A8 +D8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +D8 +B8 +98 +E8 +88 +70 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +D4 +EC +EC +EC +D4 +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +98 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +E8 +D8 +88 +F8 +70 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +98 +E8 +D8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +B8 +B8 +98 +88 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +B8 +98 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +C8 +B8 +98 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +88 +E8 +D8 +D8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +D8 +A8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +F8 +D8 +A8 +C8 +E8 +98 +F8 +70 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +AC +94 +94 +94 +AC +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +18 +FC +18 +30 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +30 +FC +30 +40 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +38 +FC +FC +38 +30 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +08 +FC +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +FC +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +08 +BC +08 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +18 +BC +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +F8 +FC +F8 +10 +ENDCHAR +STARTCHAR uni27A2 +ENCODING 10146 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +48 +3C +78 +F0 +C0 +ENDCHAR +STARTCHAR uni27A3 +ENCODING 10147 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +F0 +78 +3C +48 +B0 +C0 +ENDCHAR +STARTCHAR uni27A4 +ENCODING 10148 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +E0 +78 +3C +78 +E0 +ENDCHAR +STARTCHAR uni27A5 +ENCODING 10149 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +80 +90 +F8 +FC +78 +10 +ENDCHAR +STARTCHAR uni27A6 +ENCODING 10150 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +78 +FC +F8 +90 +80 +ENDCHAR +STARTCHAR uni27A7 +ENCODING 10151 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +F8 +FC +F8 +F0 +20 +ENDCHAR +STARTCHAR uni27A8 +ENCODING 10152 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +F0 +FC +F0 +20 +ENDCHAR +STARTCHAR uni27A9 +ENCODING 10153 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AA +ENCODING 10154 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AB +ENCODING 10155 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AC +ENCODING 10156 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AD +ENCODING 10157 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AE +ENCODING 10158 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +E8 +84 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27AF +ENCODING 10159 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B1 +ENCODING 10161 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +E8 +84 +E8 +10 +ENDCHAR +STARTCHAR uni27B2 +ENCODING 10162 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +DC +0C +04 +0C +DC +78 +ENDCHAR +STARTCHAR uni27B3 +ENCODING 10163 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B4 +ENCODING 10164 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +60 +10 +0C +0C +ENDCHAR +STARTCHAR uni27B5 +ENCODING 10165 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27B6 +ENCODING 10166 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +0C +0C +10 +60 +E0 +40 +ENDCHAR +STARTCHAR uni27B7 +ENCODING 10167 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +E0 +E0 +14 +0C +1C +ENDCHAR +STARTCHAR uni27B8 +ENCODING 10168 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +E8 +7C +E8 +C0 +ENDCHAR +STARTCHAR uni27B9 +ENCODING 10169 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +0C +14 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni27BA +ENCODING 10170 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BB +ENCODING 10171 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +C8 +FC +C8 +10 +ENDCHAR +STARTCHAR uni27BC +ENCODING 10172 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +E8 +7C +E8 +ENDCHAR +STARTCHAR uni27BD +ENCODING 10173 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +E8 +FC +FC +E8 +ENDCHAR +STARTCHAR uni27BE +ENCODING 10174 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +50 +E8 +04 +E8 +50 +ENDCHAR +STARTCHAR uni27C0 +ENCODING 10176 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +90 +A0 +C0 +F8 +ENDCHAR +STARTCHAR uni27C1 +ENCODING 10177 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +70 +A8 +F8 +ENDCHAR +STARTCHAR uni27C2 +ENCODING 10178 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27C3 +ENCODING 10179 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +90 +A8 +90 +80 +78 +ENDCHAR +STARTCHAR uni27C4 +ENCODING 10180 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +48 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni27C5 +ENCODING 10181 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +40 +A0 +A0 +20 +20 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni27C6 +ENCODING 10182 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +50 +50 +40 +40 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni27C7 +ENCODING 10183 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni27C8 +ENCODING 10184 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +80 +9C +A0 +A0 +A0 +5C +40 +40 +ENDCHAR +STARTCHAR uni27C9 +ENCODING 10185 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +E4 +14 +14 +14 +E8 +08 +08 +ENDCHAR +STARTCHAR uni27CA +ENCODING 10186 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni27CC +ENCODING 10188 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +40 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni27D0 +ENCODING 10192 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR uni27D1 +ENCODING 10193 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +88 +ENDCHAR +STARTCHAR uni27D2 +ENCODING 10194 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni27D3 +ENCODING 10195 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +08 +08 +28 +08 +F8 +ENDCHAR +STARTCHAR uni27D4 +ENCODING 10196 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +80 +A0 +80 +80 +ENDCHAR +STARTCHAR uni27D5 +ENCODING 10197 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C4 +6C +54 +6C +C4 +ENDCHAR +STARTCHAR uni27D6 +ENCODING 10198 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +8C +D8 +A8 +D8 +8C +ENDCHAR +STARTCHAR uni27D7 +ENCODING 10199 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +48 +78 +CC +ENDCHAR +STARTCHAR uni27D8 +ENCODING 10200 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni27D9 +ENCODING 10201 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni27DA +ENCODING 10202 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +D8 +50 +D8 +50 +ENDCHAR +STARTCHAR uni27DB +ENCODING 10203 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +50 +D8 +50 +50 +ENDCHAR +STARTCHAR uni27DC +ENCODING 10204 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +40 +BC +40 +ENDCHAR +STARTCHAR uni27DD +ENCODING 10205 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +80 +FC +80 +ENDCHAR +STARTCHAR uni27DE +ENCODING 10206 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +04 +FC +04 +ENDCHAR +STARTCHAR uni27DF +ENCODING 10207 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni27E0 +ENCODING 10208 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +F8 +50 +20 +ENDCHAR +STARTCHAR uni27E1 +ENCODING 10209 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni27E2 +ENCODING 10210 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +28 +C4 +28 +10 +ENDCHAR +STARTCHAR uni27E3 +ENCODING 10211 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +50 +8C +50 +20 +ENDCHAR +STARTCHAR uni27E4 +ENCODING 10212 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +7C +44 +C4 +44 +7C +ENDCHAR +STARTCHAR uni27E5 +ENCODING 10213 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +F8 +88 +8C +88 +F8 +ENDCHAR +STARTCHAR uni27E6 +ENCODING 10214 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni27E7 +ENCODING 10215 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni27EA +ENCODING 10218 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +14 +28 +28 +50 +50 +A0 +50 +50 +28 +28 +14 +ENDCHAR +STARTCHAR uni27EB +ENCODING 10219 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +A0 +50 +50 +28 +28 +14 +28 +28 +50 +50 +A0 +ENDCHAR +STARTCHAR uni27EC +ENCODING 10220 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +60 +A0 +A0 +A0 +A0 +A0 +60 +20 +10 +ENDCHAR +STARTCHAR uni27ED +ENCODING 10221 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 12 1 -2 +BITMAP +80 +40 +60 +50 +50 +50 +50 +50 +50 +60 +40 +80 +ENDCHAR +STARTCHAR uni27EE +ENCODING 10222 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni27EF +ENCODING 10223 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 9 1 -1 +BITMAP +40 +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni27F0 +ENCODING 10224 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni27F1 +ENCODING 10225 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni27F2 +ENCODING 10226 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +38 +44 +E4 +44 +04 +44 +38 +ENDCHAR +STARTCHAR uni27F3 +ENCODING 10227 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +70 +88 +9C +88 +80 +88 +70 +ENDCHAR +STARTCHAR uni27F4 +ENCODING 10228 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni27F5 +ENCODING 10229 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni27F6 +ENCODING 10230 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni27F7 +ENCODING 10231 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni27F8 +ENCODING 10232 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +7C +80 +7C +20 +10 +ENDCHAR +STARTCHAR uni27F9 +ENCODING 10233 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +F8 +04 +F8 +10 +20 +ENDCHAR +STARTCHAR uni27FA +ENCODING 10234 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni27FB +ENCODING 10235 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +44 +FC +44 +24 +ENDCHAR +STARTCHAR uni27FC +ENCODING 10236 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +88 +FC +88 +90 +ENDCHAR +STARTCHAR uni27FD +ENCODING 10237 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni27FE +ENCODING 10238 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni27FF +ENCODING 10239 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +08 +5C +AC +08 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 7 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 4 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 4 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 0 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 3 -2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 5 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 11 3 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +18 +18 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 -2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +00 +00 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +00 +00 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +C0 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +18 +18 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +18 +18 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +18 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2900 +ENCODING 10496 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +58 +FC +58 +40 +ENDCHAR +STARTCHAR uni2901 +ENCODING 10497 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +68 +FC +68 +60 +ENDCHAR +STARTCHAR uni2902 +ENCODING 10498 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +28 +7C +88 +7C +28 +ENDCHAR +STARTCHAR uni2903 +ENCODING 10499 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +50 +F8 +44 +F8 +50 +ENDCHAR +STARTCHAR uni2904 +ENCODING 10500 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +78 +A4 +78 +20 +ENDCHAR +STARTCHAR uni2905 +ENCODING 10501 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +FC +98 +ENDCHAR +STARTCHAR uni2906 +ENCODING 10502 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +24 +7C +84 +7C +24 +14 +ENDCHAR +STARTCHAR uni2907 +ENCODING 10503 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +90 +F8 +84 +F8 +90 +A0 +ENDCHAR +STARTCHAR uni2908 +ENCODING 10504 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2909 +ENCODING 10505 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni290A +ENCODING 10506 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni290B +ENCODING 10507 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni290C +ENCODING 10508 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +EC +40 +20 +ENDCHAR +STARTCHAR uni290D +ENCODING 10509 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +DC +08 +10 +ENDCHAR +STARTCHAR uni290E +ENCODING 10510 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +40 +D4 +40 +20 +ENDCHAR +STARTCHAR uni290F +ENCODING 10511 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +10 +08 +AC +08 +10 +ENDCHAR +STARTCHAR uni2910 +ENCODING 10512 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +98 +6C +98 +ENDCHAR +STARTCHAR uni2911 +ENCODING 10513 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni2912 +ENCODING 10514 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2913 +ENCODING 10515 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni2914 +ENCODING 10516 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +A8 +7C +A8 +20 +ENDCHAR +STARTCHAR uni2915 +ENCODING 10517 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +B8 +7C +B8 +30 +ENDCHAR +STARTCHAR uni2916 +ENCODING 10518 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +98 +7C +98 +ENDCHAR +STARTCHAR uni2917 +ENCODING 10519 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +20 +B8 +7C +B8 +20 +ENDCHAR +STARTCHAR uni2918 +ENCODING 10520 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +F8 +7C +F8 +60 +ENDCHAR +STARTCHAR uni2919 +ENCODING 10521 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +10 +E0 +10 +08 +ENDCHAR +STARTCHAR uni291A +ENCODING 10522 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +40 +3C +40 +80 +ENDCHAR +STARTCHAR uni291B +ENCODING 10523 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +F0 +50 +28 +ENDCHAR +STARTCHAR uni291C +ENCODING 10524 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +A0 +50 +3C +50 +A0 +ENDCHAR +STARTCHAR uni291D +ENCODING 10525 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +10 +BC +10 +ENDCHAR +STARTCHAR uni291E +ENCODING 10526 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +20 +F4 +20 +ENDCHAR +STARTCHAR uni291F +ENCODING 10527 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +14 +BC +14 +ENDCHAR +STARTCHAR uni2920 +ENCODING 10528 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +A0 +F4 +A0 +ENDCHAR +STARTCHAR uni2921 +ENCODING 10529 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +E0 +C0 +A8 +18 +38 +ENDCHAR +STARTCHAR uni2922 +ENCODING 10530 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +38 +18 +A8 +C0 +E0 +ENDCHAR +STARTCHAR uni2923 +ENCODING 10531 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +C0 +A0 +10 +08 +18 +ENDCHAR +STARTCHAR uni2924 +ENCODING 10532 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +18 +28 +40 +80 +C0 +ENDCHAR +STARTCHAR uni2925 +ENCODING 10533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2926 +ENCODING 10534 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +08 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2927 +ENCODING 10535 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2928 +ENCODING 10536 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni2929 +ENCODING 10537 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +D8 +D8 +ENDCHAR +STARTCHAR uni292A +ENCODING 10538 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C8 +D0 +20 +D0 +C8 +ENDCHAR +STARTCHAR uni292B +ENCODING 10539 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292C +ENCODING 10540 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni292D +ENCODING 10541 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292E +ENCODING 10542 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +58 +98 +ENDCHAR +STARTCHAR uni292F +ENCODING 10543 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +98 +58 +20 +50 +88 +ENDCHAR +STARTCHAR uni2930 +ENCODING 10544 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +58 +98 +ENDCHAR +STARTCHAR uni2931 +ENCODING 10545 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2932 +ENCODING 10546 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +D8 +20 +50 +88 +ENDCHAR +STARTCHAR uni2933 +ENCODING 10547 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +BC +08 +ENDCHAR +STARTCHAR uni2934 +ENCODING 10548 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +A8 +20 +C0 +ENDCHAR +STARTCHAR uni2935 +ENCODING 10549 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2936 +ENCODING 10550 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +28 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni2937 +ENCODING 10551 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +80 +A0 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni2938 +ENCODING 10552 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +20 +10 +10 +10 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2939 +ENCODING 10553 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +20 +40 +80 +80 +80 +50 +30 +70 +ENDCHAR +STARTCHAR uni293A +ENCODING 10554 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni293B +ENCODING 10555 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +38 +98 +68 +ENDCHAR +STARTCHAR uni293C +ENCODING 10556 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +98 +38 +00 +F8 +ENDCHAR +STARTCHAR uni293D +ENCODING 10557 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +B0 +C8 +E0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni293E +ENCODING 10558 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +08 +E8 +C8 +B0 +ENDCHAR +STARTCHAR uni293F +ENCODING 10559 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +80 +B8 +98 +68 +ENDCHAR +STARTCHAR uni2940 +ENCODING 10560 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +20 +78 +A4 +94 +84 +84 +78 +ENDCHAR +STARTCHAR uni2941 +ENCODING 10561 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +10 +78 +94 +A4 +84 +84 +78 +ENDCHAR +STARTCHAR uni2942 +ENCODING 10562 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +08 +FC +08 +10 +00 +40 +F0 +40 +ENDCHAR +STARTCHAR uni2943 +ENCODING 10563 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +40 +FC +40 +20 +08 +3C +08 +ENDCHAR +STARTCHAR uni2944 +ENCODING 10564 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +20 +40 +FC +40 +20 +ENDCHAR +STARTCHAR uni2945 +ENCODING 10565 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2946 +ENCODING 10566 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +10 +38 +10 +ENDCHAR +STARTCHAR uni2947 +ENCODING 10567 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +68 +FC +68 +ENDCHAR +STARTCHAR uni2948 +ENCODING 10568 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +78 +FC +78 +ENDCHAR +STARTCHAR uni2949 +ENCODING 10569 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +20 +50 +20 +ENDCHAR +STARTCHAR uni294A +ENCODING 10570 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +40 +F8 +10 +ENDCHAR +STARTCHAR uni294B +ENCODING 10571 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +10 +F8 +40 +ENDCHAR +STARTCHAR uni294C +ENCODING 10572 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +30 +28 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni294D +ENCODING 10573 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni294E +ENCODING 10574 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +50 +F8 +ENDCHAR +STARTCHAR uni294F +ENCODING 10575 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 2 -1 +BITMAP +80 +C0 +A0 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2950 +ENCODING 10576 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 1 +BITMAP +F8 +50 +ENDCHAR +STARTCHAR uni2951 +ENCODING 10577 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +60 +A0 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2952 +ENCODING 10578 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +90 +A0 +FC +80 +80 +ENDCHAR +STARTCHAR uni2953 +ENCODING 10579 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +24 +14 +FC +04 +04 +ENDCHAR +STARTCHAR uni2954 +ENCODING 10580 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +30 +28 +20 +20 +20 +ENDCHAR +STARTCHAR uni2955 +ENCODING 10581 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +28 +30 +20 +F8 +ENDCHAR +STARTCHAR uni2956 +ENCODING 10582 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +80 +80 +FC +A0 +90 +ENDCHAR +STARTCHAR uni2957 +ENCODING 10583 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +04 +FC +14 +24 +ENDCHAR +STARTCHAR uni2958 +ENCODING 10584 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2959 +ENCODING 10585 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +A0 +60 +20 +F8 +ENDCHAR +STARTCHAR uni295A +ENCODING 10586 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +48 +F8 +08 +ENDCHAR +STARTCHAR uni295B +ENCODING 10587 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +90 +F8 +80 +ENDCHAR +STARTCHAR uni295C +ENCODING 10588 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +28 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni295D +ENCODING 10589 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR uni295E +ENCODING 10590 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +08 +F8 +48 +ENDCHAR +STARTCHAR uni295F +ENCODING 10591 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +80 +F8 +90 +ENDCHAR +STARTCHAR uni2960 +ENCODING 10592 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +A0 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2961 +ENCODING 10593 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni2962 +ENCODING 10594 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni2963 +ENCODING 10595 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2964 +ENCODING 10596 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2965 +ENCODING 10597 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +D8 +50 +ENDCHAR +STARTCHAR uni2966 +ENCODING 10598 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +F8 +00 +10 +F8 +ENDCHAR +STARTCHAR uni2967 +ENCODING 10599 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +40 +00 +F8 +10 +ENDCHAR +STARTCHAR uni2968 +ENCODING 10600 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +F8 +00 +40 +F8 +ENDCHAR +STARTCHAR uni2969 +ENCODING 10601 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +10 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296A +ENCODING 10602 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +40 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296B +ENCODING 10603 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR uni296C +ENCODING 10604 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +10 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni296D +ENCODING 10605 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni296E +ENCODING 10606 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +D0 +50 +50 +50 +58 +50 +ENDCHAR +STARTCHAR uni296F +ENCODING 10607 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +58 +50 +50 +50 +D0 +50 +ENDCHAR +STARTCHAR uni2970 +ENCODING 10608 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F0 +08 +F0 +ENDCHAR +STARTCHAR uni2971 +ENCODING 10609 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +00 +E0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2972 +ENCODING 10610 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2973 +ENCODING 10611 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2974 +ENCODING 10612 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2975 +ENCODING 10613 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2976 +ENCODING 10614 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +18 +60 +80 +60 +18 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2977 +ENCODING 10615 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +50 +F8 +50 +08 +ENDCHAR +STARTCHAR uni2978 +ENCODING 10616 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2979 +ENCODING 10617 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni297A +ENCODING 10618 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +0C +50 +F8 +50 +0C +ENDCHAR +STARTCHAR uni297B +ENCODING 10619 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni297C +ENCODING 10620 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +80 +78 +80 +40 +ENDCHAR +STARTCHAR uni297D +ENCODING 10621 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +08 +F0 +08 +10 +ENDCHAR +STARTCHAR uni297E +ENCODING 10622 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni297F +ENCODING 10623 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +20 +A8 +50 +ENDCHAR +STARTCHAR uni2980 +ENCODING 10624 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2981 +ENCODING 10625 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2982 +ENCODING 10626 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2983 +ENCODING 10627 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +50 +50 +50 +90 +50 +50 +50 +38 +ENDCHAR +STARTCHAR uni2984 +ENCODING 10628 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +50 +50 +50 +48 +50 +50 +50 +E0 +ENDCHAR +STARTCHAR uni2985 +ENCODING 10629 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +10 +20 +60 +60 +A0 +A0 +60 +60 +20 +10 +ENDCHAR +STARTCHAR uni2986 +ENCODING 10630 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +80 +40 +60 +60 +50 +50 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2987 +ENCODING 10631 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +60 +60 +A0 +A0 +A0 +A0 +60 +60 +20 +ENDCHAR +STARTCHAR uni2988 +ENCODING 10632 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +C0 +C0 +A0 +A0 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni2989 +ENCODING 10633 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +30 +30 +50 +50 +90 +50 +50 +30 +30 +10 +ENDCHAR +STARTCHAR uni298A +ENCODING 10634 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +C0 +C0 +A0 +A0 +90 +A0 +A0 +C0 +C0 +80 +ENDCHAR +STARTCHAR uni298B +ENCODING 10635 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298C +ENCODING 10636 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +E0 +00 +E0 +ENDCHAR +STARTCHAR uni298D +ENCODING 10637 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +C0 +A0 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni298E +ENCODING 10638 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +A0 +60 +E0 +ENDCHAR +STARTCHAR uni298F +ENCODING 10639 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2990 +ENCODING 10640 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +60 +A0 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2991 +ENCODING 10641 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +10 +20 +20 +40 +40 +90 +40 +40 +20 +20 +10 +ENDCHAR +STARTCHAR uni2992 +ENCODING 10642 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +80 +40 +40 +20 +20 +90 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2993 +ENCODING 10643 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +20 +38 +60 +A0 +60 +38 +20 +10 +ENDCHAR +STARTCHAR uni2994 +ENCODING 10644 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +20 +E0 +30 +28 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR uni2995 +ENCODING 10645 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +28 +50 +D0 +70 +58 +70 +D0 +50 +28 +ENDCHAR +STARTCHAR uni2996 +ENCODING 10646 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +50 +58 +70 +D0 +70 +58 +50 +A0 +ENDCHAR +STARTCHAR uni2997 +ENCODING 10647 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +20 +ENDCHAR +STARTCHAR uni2998 +ENCODING 10648 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +60 +60 +60 +60 +60 +60 +40 +80 +ENDCHAR +STARTCHAR uni2999 +ENCODING 10649 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 7 2 0 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni299A +ENCODING 10650 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 8 1 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni299B +ENCODING 10651 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +28 +FC +ENDCHAR +STARTCHAR uni299C +ENCODING 10652 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +E0 +A0 +F8 +ENDCHAR +STARTCHAR uni299D +ENCODING 10653 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +80 +80 +E0 +90 +A8 +88 +FC +ENDCHAR +STARTCHAR uni299E +ENCODING 10654 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +10 +20 +2C +48 +44 +8C +80 +FC +ENDCHAR +STARTCHAR uni299F +ENCODING 10655 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +04 +18 +60 +FC +ENDCHAR +STARTCHAR uni29A0 +ENCODING 10656 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +90 +60 +38 +24 +38 +60 +90 +ENDCHAR +STARTCHAR uni29A1 +ENCODING 10657 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +88 +70 +D8 +20 +ENDCHAR +STARTCHAR uni29A2 +ENCODING 10658 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +FC +08 +10 +20 +40 +ENDCHAR +STARTCHAR uni29A3 +ENCODING 10659 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +20 +10 +08 +FC +ENDCHAR +STARTCHAR uni29A4 +ENCODING 10660 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +10 +20 +40 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A5 +ENCODING 10661 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +20 +10 +08 +FC +00 +FC +ENDCHAR +STARTCHAR uni29A6 +ENCODING 10662 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +40 +38 +ENDCHAR +STARTCHAR uni29A7 +ENCODING 10663 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +40 +80 +ENDCHAR +STARTCHAR uni29A8 +ENCODING 10664 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +18 +18 +20 +50 +FC +ENDCHAR +STARTCHAR uni29A9 +ENCODING 10665 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +60 +60 +10 +28 +FC +ENDCHAR +STARTCHAR uni29AA +ENCODING 10666 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +50 +20 +18 +18 +ENDCHAR +STARTCHAR uni29AB +ENCODING 10667 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +28 +10 +60 +60 +ENDCHAR +STARTCHAR uni29AC +ENCODING 10668 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +98 +D8 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni29AD +ENCODING 10669 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +C8 +D8 +28 +18 +08 +ENDCHAR +STARTCHAR uni29AE +ENCODING 10670 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +C0 +A0 +D8 +98 +80 +ENDCHAR +STARTCHAR uni29AF +ENCODING 10671 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +18 +28 +D8 +C8 +08 +ENDCHAR +STARTCHAR uni29B0 +ENCODING 10672 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +80 +70 +68 +58 +38 +04 +ENDCHAR +STARTCHAR uni29B1 +ENCODING 10673 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +00 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B2 +ENCODING 10674 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +50 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B3 +ENCODING 10675 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +78 +10 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B4 +ENCODING 10676 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +78 +20 +04 +38 +58 +68 +70 +80 +ENDCHAR +STARTCHAR uni29B5 +ENCODING 10677 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29B6 +ENCODING 10678 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni29B7 +ENCODING 10679 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni29B8 +ENCODING 10680 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +C8 +A8 +98 +70 +ENDCHAR +STARTCHAR uni29B9 +ENCODING 10681 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BA +ENCODING 10682 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni29BB +ENCODING 10683 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni29BC +ENCODING 10684 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +CC +94 +A4 +CC +78 +ENDCHAR +STARTCHAR uni29BD +ENCODING 10685 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +70 +20 +70 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29BE +ENCODING 10686 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29BF +ENCODING 10687 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +84 +B4 +B4 +84 +78 +ENDCHAR +STARTCHAR uni29C0 +ENCODING 10688 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +A4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni29C1 +ENCODING 10689 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR uni29C2 +ENCODING 10690 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +98 +94 +98 +60 +ENDCHAR +STARTCHAR uni29C3 +ENCODING 10691 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +60 +9C +90 +9C +60 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +98 +A8 +C8 +F8 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +C8 +A8 +98 +F8 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +F4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +84 +A4 +D4 +A4 +84 +FC +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +FC +CC +CC +FC +FC +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +90 +BC +E4 +24 +3C +ENDCHAR +STARTCHAR uni29CA +ENCODING 10698 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni29CB +ENCODING 10699 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29CC +ENCODING 10700 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +48 +B4 +A4 +94 +B4 +84 +FC +ENDCHAR +STARTCHAR uni29CD +ENCODING 10701 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +88 +88 +FC +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +B0 +88 +B0 +C0 +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +14 +34 +54 +94 +54 +34 +14 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A0 +B0 +A8 +A4 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni29D8 +ENCODING 10712 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +80 +40 +80 +40 +80 +40 +80 +ENDCHAR +STARTCHAR uni29D9 +ENCODING 10713 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 7 2 0 +BITMAP +40 +80 +40 +80 +40 +80 +40 +ENDCHAR +STARTCHAR uni29DA +ENCODING 10714 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +48 +90 +48 +90 +48 +90 +ENDCHAR +STARTCHAR uni29DB +ENCODING 10715 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +48 +90 +48 +90 +48 +ENDCHAR +STARTCHAR uni29DC +ENCODING 10716 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +40 +A8 +50 +ENDCHAR +STARTCHAR uni29DD +ENCODING 10717 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +50 +A8 +50 +ENDCHAR +STARTCHAR uni29DE +ENCODING 10718 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29DF +ENCODING 10719 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +B4 +48 +ENDCHAR +STARTCHAR uni29E0 +ENCODING 10720 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F0 +F8 +C8 +C8 +F8 +ENDCHAR +STARTCHAR uni29E1 +ENCODING 10721 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +18 +28 +48 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni29E2 +ENCODING 10722 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni29E3 +ENCODING 10723 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E4 +ENCODING 10724 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni29E5 +ENCODING 10725 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +10 +F8 +20 +F8 +20 +F8 +40 +40 +ENDCHAR +STARTCHAR uni29E6 +ENCODING 10726 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +F8 +88 +F8 +88 +ENDCHAR +STARTCHAR uni29E7 +ENCODING 10727 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +98 +50 +20 +ENDCHAR +STARTCHAR uni29EA +ENCODING 10730 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni29EB +ENCODING 10731 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +70 +70 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni29EC +ENCODING 10732 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29ED +ENCODING 10733 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +F8 +F8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni29EE +ENCODING 10734 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +A0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29EF +ENCODING 10735 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +E0 +E0 +E0 +40 +E0 +ENDCHAR +STARTCHAR uni29F0 +ENCODING 10736 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +50 +88 +50 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F1 +ENCODING 10737 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +20 +20 +70 +F8 +70 +20 +20 +70 +ENDCHAR +STARTCHAR uni29F2 +ENCODING 10738 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +88 +88 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F3 +ENCODING 10739 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +F8 +F8 +70 +20 +70 +ENDCHAR +STARTCHAR uni29F4 +ENCODING 10740 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +10 +F8 +10 +A0 +ENDCHAR +STARTCHAR uni29F5 +ENCODING 10741 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F6 +ENCODING 10742 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +00 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F7 +ENCODING 10743 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +F0 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29F8 +ENCODING 10744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29F9 +ENCODING 10745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR uni29FA +ENCODING 10746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR uni29FB +ENCODING 10747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +54 +54 +FC +54 +54 +ENDCHAR +STARTCHAR uni29FC +ENCODING 10748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +20 +20 +40 +40 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR uni29FD +ENCODING 10749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +80 +80 +40 +40 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni29FE +ENCODING 10750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni29FF +ENCODING 10751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +F8 +88 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A07 +ENCODING 10759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A08 +ENCODING 10760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A0A +ENCODING 10762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +80 +60 +50 +60 +80 +F8 +ENDCHAR +STARTCHAR uni2A0B +ENCODING 10763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +60 +20 +60 +F8 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0C +ENCODING 10764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +38 +7C +78 +78 +78 +78 +78 +78 +F8 +70 +ENDCHAR +STARTCHAR uni2A0D +ENCODING 10765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0E +ENCODING 10766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +70 +20 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A0F +ENCODING 10767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +28 +30 +60 +A0 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A10 +ENCODING 10768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A0 +A0 +A0 +60 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A11 +ENCODING 10769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +3C +AC +74 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A12 +ENCODING 10770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +08 +28 +08 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A13 +ENCODING 10771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +30 +08 +28 +08 +30 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A14 +ENCODING 10772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +10 +28 +20 +20 +38 +04 +14 +04 +38 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A15 +ENCODING 10773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +88 +A8 +88 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A16 +ENCODING 10774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +F8 +A8 +A8 +F8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A17 +ENCODING 10775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +08 +14 +10 +10 +50 +FC +54 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2A18 +ENCODING 10776 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +A8 +70 +20 +70 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A19 +ENCODING 10777 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +70 +A8 +A8 +A8 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1A +ENCODING 10778 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +A8 +A8 +A8 +70 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1B +ENCODING 10779 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +78 +00 +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2A1C +ENCODING 10780 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +20 +A0 +40 +00 +F8 +ENDCHAR +STARTCHAR uni2A1D +ENCODING 10781 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +CC +B4 +B4 +B4 +CC +84 +ENDCHAR +STARTCHAR uni2A1E +ENCODING 10782 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +30 +50 +90 +50 +30 +10 +ENDCHAR +STARTCHAR uni2A1F +ENCODING 10783 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +40 +80 +ENDCHAR +STARTCHAR uni2A20 +ENCODING 10784 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR uni2A21 +ENCODING 10785 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2A22 +ENCODING 10786 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A23 +ENCODING 10787 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A24 +ENCODING 10788 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +68 +B0 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A25 +ENCODING 10789 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni2A26 +ENCODING 10790 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A27 +ENCODING 10791 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +20 +20 +F8 +20 +2C +04 +08 +1C +ENDCHAR +STARTCHAR uni2A28 +ENCODING 10792 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +F8 +20 +70 +20 +ENDCHAR +STARTCHAR uni2A29 +ENCODING 10793 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +30 +10 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A2A +ENCODING 10794 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A2B +ENCODING 10795 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +40 +00 +F8 +00 +10 +ENDCHAR +STARTCHAR uni2A2C +ENCODING 10796 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +10 +00 +F8 +00 +40 +ENDCHAR +STARTCHAR uni2A2D +ENCODING 10797 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +90 +B8 +90 +40 +38 +ENDCHAR +STARTCHAR uni2A2E +ENCODING 10798 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +48 +E8 +48 +10 +60 +ENDCHAR +STARTCHAR uni2A2F +ENCODING 10799 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A30 +ENCODING 10800 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2A31 +ENCODING 10801 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +50 +20 +50 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A32 +ENCODING 10802 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni2A33 +ENCODING 10803 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2A34 +ENCODING 10804 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +80 +A8 +90 +A8 +80 +70 +ENDCHAR +STARTCHAR uni2A35 +ENCODING 10805 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +08 +A8 +48 +A8 +08 +70 +ENDCHAR +STARTCHAR uni2A36 +ENCODING 10806 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +00 +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A37 +ENCODING 10807 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A38 +ENCODING 10808 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +A8 +88 +F8 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A39 +ENCODING 10809 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3A +ENCODING 10810 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3B +ENCODING 10811 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +78 +B4 +84 +FC +ENDCHAR +STARTCHAR uni2A3C +ENCODING 10812 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +08 +08 +F8 +ENDCHAR +STARTCHAR uni2A3D +ENCODING 10813 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +80 +80 +F8 +ENDCHAR +STARTCHAR uni2A3E +ENCODING 10814 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 -1 +BITMAP +40 +A0 +40 +00 +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni2A3F +ENCODING 10815 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +DC +88 +88 +88 +88 +88 +FC +ENDCHAR +STARTCHAR uni2A40 +ENCODING 10816 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A41 +ENCODING 10817 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A42 +ENCODING 10818 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A43 +ENCODING 10819 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A44 +ENCODING 10820 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +A8 +D8 +ENDCHAR +STARTCHAR uni2A45 +ENCODING 10821 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +A8 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2A46 +ENCODING 10822 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +90 +90 +60 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A47 +ENCODING 10823 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +60 +90 +90 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A48 +ENCODING 10824 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +90 +90 +60 +00 +F0 +00 +60 +90 +90 +ENDCHAR +STARTCHAR uni2A49 +ENCODING 10825 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 9 0 -1 +BITMAP +60 +90 +90 +00 +F0 +00 +90 +90 +60 +ENDCHAR +STARTCHAR uni2A4A +ENCODING 10826 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2A4B +ENCODING 10827 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +50 +A8 +A8 +ENDCHAR +STARTCHAR uni2A4C +ENCODING 10828 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +48 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni2A4D +ENCODING 10829 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +48 +48 +48 +48 +48 +FC +ENDCHAR +STARTCHAR uni2A4E +ENCODING 10830 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2A4F +ENCODING 10831 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +F8 +ENDCHAR +STARTCHAR uni2A50 +ENCODING 10832 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +88 +D8 +A8 +D8 +88 +70 +ENDCHAR +STARTCHAR uni2A51 +ENCODING 10833 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A52 +ENCODING 10834 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A53 +ENCODING 10835 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +50 +20 +A8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A54 +ENCODING 10836 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +50 +50 +88 +A8 +20 +50 +50 +ENDCHAR +STARTCHAR uni2A55 +ENCODING 10837 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni2A56 +ENCODING 10838 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni2A57 +ENCODING 10839 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A58 +ENCODING 10840 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +04 +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR uni2A59 +ENCODING 10841 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +A8 +70 +50 +70 +A8 +88 +ENDCHAR +STARTCHAR uni2A5A +ENCODING 10842 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2A5B +ENCODING 10843 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni2A5C +ENCODING 10844 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5D +ENCODING 10845 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +50 +F8 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A5E +ENCODING 10846 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni2A5F +ENCODING 10847 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +ENDCHAR +STARTCHAR uni2A60 +ENCODING 10848 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +20 +50 +50 +88 +88 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A61 +ENCODING 10849 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +20 +00 +F8 +ENDCHAR +STARTCHAR uni2A62 +ENCODING 10850 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F8 +00 +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2A63 +ENCODING 10851 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A64 +ENCODING 10852 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +18 +28 +48 +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni2A65 +ENCODING 10853 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +C0 +A0 +90 +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2A66 +ENCODING 10854 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2A67 +ENCODING 10855 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A68 +ENCODING 10856 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +F8 +50 +F8 +50 +ENDCHAR +STARTCHAR uni2A69 +ENCODING 10857 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +FC +A8 +FC +A8 +FC +A8 +ENDCHAR +STARTCHAR uni2A6A +ENCODING 10858 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +20 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6B +ENCODING 10859 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +00 +68 +B0 +00 +40 +ENDCHAR +STARTCHAR uni2A6C +ENCODING 10860 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +68 +B0 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A6D +ENCODING 10861 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6E +ENCODING 10862 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A8 +70 +F8 +70 +A8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A6F +ENCODING 10863 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A70 +ENCODING 10864 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +68 +B0 +00 +68 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A71 +ENCODING 10865 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +00 +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2A72 +ENCODING 10866 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A73 +ENCODING 10867 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A74 +ENCODING 10868 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +AC +00 +AC +ENDCHAR +STARTCHAR uni2A75 +ENCODING 10869 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +D8 +00 +D8 +ENDCHAR +STARTCHAR uni2A76 +ENCODING 10870 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +A8 +00 +A8 +ENDCHAR +STARTCHAR uni2A77 +ENCODING 10871 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +F8 +00 +F8 +00 +50 +ENDCHAR +STARTCHAR uni2A78 +ENCODING 10872 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A79 +ENCODING 10873 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +20 +48 +94 +48 +20 +10 +ENDCHAR +STARTCHAR uni2A7A +ENCODING 10874 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +10 +48 +A4 +48 +10 +20 +ENDCHAR +STARTCHAR uni2A7B +ENCODING 10875 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +40 +00 +40 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A7C +ENCODING 10876 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +18 +04 +08 +00 +08 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A7D +ENCODING 10877 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A7E +ENCODING 10878 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A7F +ENCODING 10879 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +C4 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A80 +ENCODING 10880 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +8C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A81 +ENCODING 10881 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A82 +ENCODING 10882 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A83 +ENCODING 10883 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +00 +0C +30 +C0 +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2A84 +ENCODING 10884 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +80 +00 +C0 +30 +0C +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2A85 +ENCODING 10885 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A86 +ENCODING 10886 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2A87 +ENCODING 10887 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +0C +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A88 +ENCODING 10888 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +C0 +00 +10 +FC +40 +ENDCHAR +STARTCHAR uni2A89 +ENCODING 10889 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8A +ENCODING 10890 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2A8B +ENCODING 10891 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +38 +C0 +38 +00 +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A8C +ENCODING 10892 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +E0 +18 +E0 +00 +F8 +00 +F8 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A8D +ENCODING 10893 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8E +ENCODING 10894 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +F8 +ENDCHAR +STARTCHAR uni2A8F +ENCODING 10895 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +00 +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A90 +ENCODING 10896 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +00 +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A91 +ENCODING 10897 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +C0 +38 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A92 +ENCODING 10898 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +18 +E0 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2A93 +ENCODING 10899 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +ENDCHAR +STARTCHAR uni2A94 +ENCODING 10900 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +E0 +1C +E0 +1C +E0 +1C +E0 +1C +E0 +1C +ENDCHAR +STARTCHAR uni2A95 +ENCODING 10901 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A96 +ENCODING 10902 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A97 +ENCODING 10903 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +CC +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni2A98 +ENCODING 10904 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +CC +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni2A99 +ENCODING 10905 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9A +ENCODING 10906 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9B +ENCODING 10907 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +CC +30 +CC +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni2A9C +ENCODING 10908 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +CC +30 +CC +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2A9D +ENCODING 10909 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +38 +C0 +38 +ENDCHAR +STARTCHAR uni2A9E +ENCODING 10910 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +B0 +00 +E0 +18 +E0 +ENDCHAR +STARTCHAR uni2A9F +ENCODING 10911 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +38 +C0 +38 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA0 +ENCODING 10912 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +68 +B0 +00 +E0 +18 +E0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AA1 +ENCODING 10913 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +48 +90 +48 +20 +10 +ENDCHAR +STARTCHAR uni2AA2 +ENCODING 10914 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +90 +48 +90 +20 +40 +ENDCHAR +STARTCHAR uni2AA3 +ENCODING 10915 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +24 +48 +90 +48 +24 +00 +FC +ENDCHAR +STARTCHAR uni2AA4 +ENCODING 10916 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +48 +30 +CC +ENDCHAR +STARTCHAR uni2AA5 +ENCODING 10917 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +84 +48 +30 +48 +84 +ENDCHAR +STARTCHAR uni2AA6 +ENCODING 10918 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +08 +34 +C4 +34 +08 +ENDCHAR +STARTCHAR uni2AA7 +ENCODING 10919 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +40 +B0 +8C +B0 +40 +ENDCHAR +STARTCHAR uni2AA8 +ENCODING 10920 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +08 +34 +C4 +34 +C8 +30 +0C +ENDCHAR +STARTCHAR uni2AA9 +ENCODING 10921 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +40 +B0 +8C +B0 +4C +30 +C0 +ENDCHAR +STARTCHAR uni2AAA +ENCODING 10922 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +0C +30 +FC +30 +0C +ENDCHAR +STARTCHAR uni2AAB +ENCODING 10923 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +C0 +30 +FC +30 +C0 +ENDCHAR +STARTCHAR uni2AAC +ENCODING 10924 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +30 +FC +30 +0C +00 +FC +ENDCHAR +STARTCHAR uni2AAD +ENCODING 10925 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +30 +FC +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2AAE +ENCODING 10926 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +D8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AAF +ENCODING 10927 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +ENDCHAR +STARTCHAR uni2AB0 +ENCODING 10928 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +ENDCHAR +STARTCHAR uni2AB1 +ENCODING 10929 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB2 +ENCODING 10930 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +40 +ENDCHAR +STARTCHAR uni2AB3 +ENCODING 10931 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB4 +ENCODING 10932 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AB5 +ENCODING 10933 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +30 +C0 +30 +08 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB6 +ENCODING 10934 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +60 +18 +60 +80 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2AB7 +ENCODING 10935 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +08 +30 +C0 +30 +08 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AB8 +ENCODING 10936 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +80 +60 +18 +60 +80 +00 +B0 +68 +00 +B0 +68 +ENDCHAR +STARTCHAR uni2AB9 +ENCODING 10937 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +08 +30 +C0 +30 +08 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABA +ENCODING 10938 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +60 +18 +60 +80 +10 +78 +B0 +20 +68 +F0 +40 +ENDCHAR +STARTCHAR uni2ABB +ENCODING 10939 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +50 +A0 +50 +28 +28 +ENDCHAR +STARTCHAR uni2ABC +ENCODING 10940 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +50 +28 +50 +A0 +A0 +ENDCHAR +STARTCHAR uni2ABD +ENCODING 10941 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +A0 +80 +78 +ENDCHAR +STARTCHAR uni2ABE +ENCODING 10942 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +28 +08 +F0 +ENDCHAR +STARTCHAR uni2ABF +ENCODING 10943 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC0 +ENCODING 10944 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +20 +70 +20 +ENDCHAR +STARTCHAR uni2AC1 +ENCODING 10945 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC2 +ENCODING 10946 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +50 +20 +50 +ENDCHAR +STARTCHAR uni2AC3 +ENCODING 10947 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR uni2AC4 +ENCODING 10948 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2AC5 +ENCODING 10949 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +78 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC6 +ENCODING 10950 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +F0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AC7 +ENCODING 10951 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC8 +ENCODING 10952 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2AC9 +ENCODING 10953 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACA +ENCODING 10954 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2ACB +ENCODING 10955 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +78 +80 +80 +78 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACC +ENCODING 10956 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2ACD +ENCODING 10957 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +80 +80 +F0 +ENDCHAR +STARTCHAR uni2ACE +ENCODING 10958 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +FC +04 +04 +3C +ENDCHAR +STARTCHAR uni2ACF +ENCODING 10959 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +88 +88 +88 +48 +38 +ENDCHAR +STARTCHAR uni2AD0 +ENCODING 10960 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni2AD1 +ENCODING 10961 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +38 +48 +88 +88 +88 +48 +38 +00 +F8 +ENDCHAR +STARTCHAR uni2AD2 +ENCODING 10962 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +E0 +90 +88 +88 +88 +90 +E0 +00 +F8 +ENDCHAR +STARTCHAR uni2AD3 +ENCODING 10963 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD4 +ENCODING 10964 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD5 +ENCODING 10965 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +80 +80 +78 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni2AD6 +ENCODING 10966 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F0 +08 +08 +F0 +00 +F0 +08 +08 +F0 +ENDCHAR +STARTCHAR uni2AD7 +ENCODING 10967 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 1 +BITMAP +CC +30 +30 +CC +ENDCHAR +STARTCHAR uni2AD8 +ENCODING 10968 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +CC +30 +78 +30 +CC +ENDCHAR +STARTCHAR uni2AD9 +ENCODING 10969 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADA +ENCODING 10970 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2ADB +ENCODING 10971 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR uni2ADC +ENCODING 10972 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +28 +30 +A8 +E8 +F0 +ENDCHAR +STARTCHAR uni2ADD +ENCODING 10973 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2ADE +ENCODING 10974 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +10 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni2ADF +ENCODING 10975 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE0 +ENCODING 10976 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni2AE1 +ENCODING 10977 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +24 +28 +24 +28 +20 +FC +ENDCHAR +STARTCHAR uni2AE2 +ENCODING 10978 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AE3 +ENCODING 10979 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +28 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR uni2AE4 +ENCODING 10980 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +08 +F8 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni2AE5 +ENCODING 10981 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +28 +E8 +28 +E8 +28 +28 +ENDCHAR +STARTCHAR uni2AE6 +ENCODING 10982 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +A0 +A0 +F8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2AE7 +ENCODING 10983 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni2AE8 +ENCODING 10984 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2AE9 +ENCODING 10985 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +00 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2AEA +ENCODING 10986 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AEB +ENCODING 10987 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR uni2AEC +ENCODING 10988 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +F8 +08 +F8 +08 +ENDCHAR +STARTCHAR uni2AED +ENCODING 10989 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 1 1 +BITMAP +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni2AEE +ENCODING 10990 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +C0 +40 +60 +40 +40 +ENDCHAR +STARTCHAR uni2AEF +ENCODING 10991 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2AF0 +ENCODING 10992 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF1 +ENCODING 10993 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +40 +40 +40 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2AF2 +ENCODING 10994 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF3 +ENCODING 10995 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +50 +78 +F0 +50 +50 +50 +ENDCHAR +STARTCHAR uni2AF4 +ENCODING 10996 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF5 +ENCODING 10997 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +A8 +A8 +A8 +FC +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AF6 +ENCODING 10998 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 1 5 2 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2AF7 +ENCODING 10999 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +54 +A8 +54 +ENDCHAR +STARTCHAR uni2AF8 +ENCODING 11000 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 2 +BITMAP +A8 +54 +A8 +ENDCHAR +STARTCHAR uni2AF9 +ENCODING 11001 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +0C +30 +C0 +30 +CC +30 +CC +30 +0C +ENDCHAR +STARTCHAR uni2AFA +ENCODING 11002 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +30 +0C +30 +CC +30 +CC +30 +C0 +ENDCHAR +STARTCHAR uni2AFB +ENCODING 11003 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +54 +54 +54 +54 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFC +ENCODING 11004 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2AFD +ENCODING 11005 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +48 +48 +48 +48 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2AFE +ENCODING 11006 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2AFF +ENCODING 11007 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +14 +2C +50 +A0 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +A0 +D0 +28 +14 +08 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +A0 +50 +2C +14 +1C +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +14 +28 +D0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +48 +B4 +84 +B4 +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +60 +F8 +F8 +60 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +78 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +1C +3C +70 +E0 +40 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +E0 +F0 +38 +1C +08 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +40 +E0 +70 +3C +1C +1C +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +08 +1C +38 +F0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +FC +30 +30 +30 +FC +78 +30 +ENDCHAR +STARTCHAR uni2B0E +ENCODING 11022 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B0F +ENCODING 11023 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2B10 +ENCODING 11024 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2B11 +ENCODING 11025 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +38 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +F8 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +B8 +98 +88 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +68 +EC +68 +30 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +9C +58 +30 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B1F +ENCODING 11039 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B20 +ENCODING 11040 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +50 +70 +ENDCHAR +STARTCHAR uni2B21 +ENCODING 11041 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B22 +ENCODING 11042 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B23 +ENCODING 11043 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +70 +F8 +70 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni2B25 +ENCODING 11045 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B26 +ENCODING 11046 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B27 +ENCODING 11047 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B28 +ENCODING 11048 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +50 +50 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B29 +ENCODING 11049 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2A +ENCODING 11050 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR uni2B2B +ENCODING 11051 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2B30 +ENCODING 11056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B31 +ENCODING 11057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +40 +F8 +40 +00 +40 +F8 +40 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B32 +ENCODING 11058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B33 +ENCODING 11059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +54 +E8 +40 +ENDCHAR +STARTCHAR uni2B34 +ENCODING 11060 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +08 +68 +FC +68 +08 +ENDCHAR +STARTCHAR uni2B35 +ENCODING 11061 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +78 +FC +78 +18 +ENDCHAR +STARTCHAR uni2B36 +ENCODING 11062 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +68 +F8 +68 +08 +ENDCHAR +STARTCHAR uni2B37 +ENCODING 11063 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +D8 +64 +ENDCHAR +STARTCHAR uni2B38 +ENCODING 11064 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni2B39 +ENCODING 11065 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +54 +F8 +54 +10 +ENDCHAR +STARTCHAR uni2B3A +ENCODING 11066 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +74 +F8 +74 +30 +ENDCHAR +STARTCHAR uni2B3B +ENCODING 11067 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +64 +F8 +64 +ENDCHAR +STARTCHAR uni2B3C +ENCODING 11068 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +10 +74 +F8 +74 +10 +ENDCHAR +STARTCHAR uni2B3D +ENCODING 11069 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +18 +7C +F8 +7C +18 +ENDCHAR +STARTCHAR uni2B3E +ENCODING 11070 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +58 +FC +58 +ENDCHAR +STARTCHAR uni2B3F +ENCODING 11071 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +F4 +40 +ENDCHAR +STARTCHAR uni2B40 +ENCODING 11072 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +00 +38 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B41 +ENCODING 11073 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B42 +ENCODING 11074 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B43 +ENCODING 11075 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +80 +40 +28 +FC +28 +40 +80 +ENDCHAR +STARTCHAR uni2B44 +ENCODING 11076 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +C0 +28 +FC +28 +C0 +ENDCHAR +STARTCHAR uni2B45 +ENCODING 11077 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +10 +3C +40 +FC +40 +3C +10 +ENDCHAR +STARTCHAR uni2B46 +ENCODING 11078 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +F0 +08 +FC +08 +F0 +20 +ENDCHAR +STARTCHAR uni2B47 +ENCODING 11079 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +10 +F8 +10 +ENDCHAR +STARTCHAR uni2B48 +ENCODING 11080 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +10 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B49 +ENCODING 11081 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +68 +B0 +00 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2B4A +ENCODING 11082 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +F8 +40 +00 +68 +B0 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4B +ENCODING 11083 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +F8 +40 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2B4C +ENCODING 11084 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +F8 +10 +00 +68 +B0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +E0 +40 +E0 +40 +78 +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +C0 +40 +E0 +40 +E0 +40 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +68 +B0 +20 +20 +38 +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +48 +E8 +48 +70 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +A0 +40 +ENDCHAR +STARTCHAR uni2C65 +ENCODING 11365 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +08 +70 +18 +78 +A8 +78 +40 +ENDCHAR +STARTCHAR uni2C66 +ENCODING 11366 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +28 +28 +F8 +30 +20 +20 +58 +40 +ENDCHAR +STARTCHAR uni2C67 +ENCODING 11367 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C68 +ENCODING 11368 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +ENDCHAR +STARTCHAR uni2C69 +ENCODING 11369 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +88 +90 +A0 +C0 +A0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6A +ENCODING 11370 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +80 +80 +88 +90 +E0 +90 +8C +04 +ENDCHAR +STARTCHAR uni2C6B +ENCODING 11371 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +F8 +08 +10 +20 +40 +80 +FC +04 +ENDCHAR +STARTCHAR uni2C6C +ENCODING 11372 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +F8 +10 +20 +40 +FC +04 +ENDCHAR +STARTCHAR uni2C6D +ENCODING 11373 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +68 +98 +88 +88 +88 +88 +74 +ENDCHAR +STARTCHAR uni2C6E +ENCODING 11374 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR uni2C6F +ENCODING 11375 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C71 +ENCODING 11377 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2C72 +ENCODING 11378 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +84 +88 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C73 +ENCODING 11379 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +84 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni2C74 +ENCODING 11380 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +48 +A8 +C8 +50 +20 +ENDCHAR +STARTCHAR uni2C75 +ENCODING 11381 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2C76 +ENCODING 11382 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni2C77 +ENCODING 11383 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni2C78 +ENCODING 11384 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +70 +88 +F0 +80 +74 +18 +ENDCHAR +STARTCHAR uni2C79 +ENCODING 11385 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +40 +40 +40 +C0 +ENDCHAR +STARTCHAR uni2C7A +ENCODING 11386 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2C7B +ENCODING 11387 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +F0 +10 +70 +10 +F0 +ENDCHAR +STARTCHAR uni2C7C +ENCODING 11388 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni2C7D +ENCODING 11389 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 4 +BITMAP +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2DE0 +ENCODING 11744 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +60 +C0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2DE1 +ENCODING 11745 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +A0 +C0 +A0 +C0 +ENDCHAR +STARTCHAR uni2DE2 +ENCODING 11746 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni2DE3 +ENCODING 11747 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +F0 +ENDCHAR +STARTCHAR uni2DE4 +ENCODING 11748 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DE5 +ENCODING 11749 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR uni2DE6 +ENCODING 11750 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +C0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE7 +ENCODING 11751 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +70 +50 +50 +90 +ENDCHAR +STARTCHAR uni2DE8 +ENCODING 11752 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +E0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DE9 +ENCODING 11753 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +90 +F0 +90 +90 +ENDCHAR +STARTCHAR uni2DEA +ENCODING 11754 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2DEB +ENCODING 11755 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2DEC +ENCODING 11756 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni2DED +ENCODING 11757 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +80 +80 +60 +ENDCHAR +STARTCHAR uni2DEE +ENCODING 11758 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2DEF +ENCODING 11759 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF0 +ENCODING 11760 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 5 0 5 +BITMAP +A0 +A0 +A0 +B0 +10 +ENDCHAR +STARTCHAR uni2DF1 +ENCODING 11761 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +A0 +60 +20 +20 +ENDCHAR +STARTCHAR uni2DF2 +ENCODING 11762 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DF3 +ENCODING 11763 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +A8 +A8 +A8 +AC +04 +ENDCHAR +STARTCHAR uni2DF4 +ENCODING 11764 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 4 0 6 +BITMAP +60 +D0 +B0 +60 +ENDCHAR +STARTCHAR uni2DF5 +ENCODING 11765 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 4 0 6 +BITMAP +7C +88 +88 +68 +ENDCHAR +STARTCHAR uni2DF6 +ENCODING 11766 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +C0 +60 +A0 +60 +ENDCHAR +STARTCHAR uni2DF7 +ENCODING 11767 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 4 0 6 +BITMAP +60 +A0 +C0 +E0 +ENDCHAR +STARTCHAR uni2DF8 +ENCODING 11768 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 5 0 5 +BITMAP +40 +E0 +40 +A0 +A0 +ENDCHAR +STARTCHAR uni2DF9 +ENCODING 11769 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +A0 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR uni2DFA +ENCODING 11770 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +40 +E0 +40 +60 +50 +60 +ENDCHAR +STARTCHAR uni2DFB +ENCODING 11771 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +98 +A4 +E4 +A4 +98 +ENDCHAR +STARTCHAR uni2DFC +ENCODING 11772 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +B0 +88 +F8 +A8 +98 +ENDCHAR +STARTCHAR uni2DFD +ENCODING 11773 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +20 +50 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFE +ENCODING 11774 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +50 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni2DFF +ENCODING 11775 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 5 0 5 +BITMAP +FC +A8 +B8 +D4 +D4 +ENDCHAR +STARTCHAR U_2E80 +ENCODING 11904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 7 2 1 +BITMAP +60 +18 +04 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR U_2E81 +ENCODING 11905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +3E00 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_2E82 +ENCODING 11906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 2 +BITMAP +FF80 +0080 +0080 +0100 +0100 +ENDCHAR +STARTCHAR U_2E83 +ENCODING 11907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +82 +82 +7E +ENDCHAR +STARTCHAR U_2E84 +ENCODING 11908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FF00 +0100 +0100 +0100 +0100 +0100 +0120 +00A0 +00A0 +0060 +ENDCHAR +STARTCHAR U_2E85 +ENCODING 11909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +10 +10 +10 +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_2E86 +ENCODING 11910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +3F +21 +21 +21 +21 +21 +21 +41 +41 +87 +ENDCHAR +STARTCHAR U_2E87 +ENCODING 11911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2080 +2080 +2080 +2080 +2080 +20A0 +40A0 +4060 +8020 +ENDCHAR +STARTCHAR U_2E88 +ENCODING 11912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 6 1 4 +BITMAP +10 +10 +3F +22 +44 +80 +ENDCHAR +STARTCHAR U_2E89 +ENCODING 11913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 4 -1 +BITMAP +10 +10 +90 +90 +90 +90 +90 +90 +90 +10 +30 +ENDCHAR +STARTCHAR U_2E8A +ENCODING 11914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 4 -1 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_2E8B +ENCODING 11915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 2 -1 +BITMAP +FE00 +8200 +8200 +8E00 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_2E8C +ENCODING 11916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +0800 +8880 +4900 +0800 +ENDCHAR +STARTCHAR U_2E8D +ENCODING 11917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +0080 +9080 +4900 +4A00 +ENDCHAR +STARTCHAR U_2E8E +ENCODING 11918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 -1 +BITMAP +FFE0 +1200 +1200 +1200 +1200 +2200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_2E8F +ENCODING 11919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +40C0 +8040 +1200 +1200 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_2E90 +ENCODING 11920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +0800 +FFE0 +0A00 +0A00 +0A00 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_2E91 +ENCODING 11921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +4040 +8040 +1E00 +1200 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_2E92 +ENCODING 11922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 -1 +BITMAP +FE00 +8200 +8200 +FE00 +8000 +8000 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_2E93 +ENCODING 11923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1000 +2100 +4200 +FC00 +0800 +1000 +2200 +4100 +FF80 +0080 +ENDCHAR +STARTCHAR U_2E94 +ENCODING 11924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +1000 +1000 +1F00 +2100 +2100 +2100 +7E00 +0200 +0200 +FF80 +ENDCHAR +STARTCHAR U_2E95 +ENCODING 11925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +FFC0 +0040 +0040 +0040 +7FC0 +0040 +0040 +0040 +FFC0 +0040 +ENDCHAR +STARTCHAR U_2E96 +ENCODING 11926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +10 +10 +10 +58 +54 +90 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_2E97 +ENCODING 11927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 6 1 -1 +BITMAP +0800 +4A80 +4940 +8940 +0800 +1800 +ENDCHAR +STARTCHAR U_2E98 +ENCODING 11928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +20 +20 +F8 +20 +20 +38 +E0 +20 +20 +20 +60 +ENDCHAR +STARTCHAR U_2E99 +ENCODING 11929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +3FC0 +2100 +6100 +9200 +1200 +0C00 +0C00 +1200 +E1C0 +ENDCHAR +STARTCHAR U_2E9C +ENCODING 11932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +FF80 +8080 +BE80 +8080 +BE80 +ENDCHAR +STARTCHAR U_2E9D +ENCODING 11933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 2 -1 +BITMAP +FC +84 +84 +FC +84 +84 +FC +84 +84 +84 +8C +ENDCHAR +STARTCHAR U_2E9F +ENCODING 11935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +2080 +FFE0 +2880 +2480 +2080 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_2EA0 +ENCODING 11936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF00 +8100 +8100 +FF00 +8400 +FF80 +8400 +8200 +A140 +C080 +ENDCHAR +STARTCHAR U_2EA4 +ENCODING 11940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 4 1 6 +BITMAP +03C0 +FC80 +4880 +2500 +ENDCHAR +STARTCHAR U_2EA5 +ENCODING 11941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 6 1 4 +BITMAP +0780 +7900 +4900 +4900 +8880 +8040 +ENDCHAR +STARTCHAR U_2EA7 +ENCODING 11943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +2400 +7FC0 +8400 +7FE0 +ENDCHAR +STARTCHAR U_2EAA +ENCODING 11946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 9 0 0 +BITMAP +F8 +10 +20 +A0 +B0 +A0 +A0 +B0 +C0 +ENDCHAR +STARTCHAR U_2EAC +ENCODING 11948 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 11 0 0 +BITMAP +7C +00 +FC +10 +54 +54 +54 +54 +54 +94 +10 +ENDCHAR +STARTCHAR U_2EAE +ENCODING 11950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +4100 +4100 +7DE0 +5140 +4940 +8A20 +ENDCHAR +STARTCHAR U_2EB0 +ENCODING 11952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 5 +BITMAP +FFE0 +B1A0 +8E20 +B1A0 +ENDCHAR +STARTCHAR U_2EB5 +ENCODING 11957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +9480 +9480 +9480 +9480 +9480 +9480 +9480 +8080 +ENDCHAR +STARTCHAR U_2EB6 +ENCODING 11958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +1080 +FFE0 +0400 +7FC0 +0400 +FFE0 +0800 +1000 +2000 +C000 +ENDCHAR +STARTCHAR U_2EB7 +ENCODING 11959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 1 1 +BITMAP +2200 +1400 +1400 +7F00 +0800 +3E00 +0800 +FF80 +ENDCHAR +STARTCHAR U_2EB8 +ENCODING 11960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +F1E0 +1100 +1100 +FFF0 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2EBB +ENCODING 11963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 2 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_2EBC +ENCODING 11964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +3F +21 +29 +25 +21 +23 +25 +59 +41 +83 +ENDCHAR +STARTCHAR U_2EBD +ENCODING 11965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +2780 +C080 +8080 +8080 +F780 +8080 +8080 +8080 +F780 +8080 +ENDCHAR +STARTCHAR U_2EBF +ENCODING 11967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +2080 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_2EC4 +ENCODING 11972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +5240 +52C0 +6340 +4040 +7FC0 +ENDCHAR +STARTCHAR U_2EC7 +ENCODING 11975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +3F00 +4100 +7F80 +C880 +5480 +6A80 +4880 +5480 +6280 +4180 +ENDCHAR +STARTCHAR U_2ECA +ENCODING 11978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +7C +44 +44 +7C +10 +5C +50 +50 +50 +5C +E0 +ENDCHAR +STARTCHAR U_2ECD +ENCODING 11981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +8000 +4000 +0000 +E000 +2000 +2000 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_2ECE +ENCODING 11982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +0000 +E000 +2000 +4000 +E000 +2000 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_2ECF +ENCODING 11983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 7 -1 +BITMAP +F0 +90 +A0 +C0 +A0 +90 +90 +D0 +A0 +80 +80 +ENDCHAR +STARTCHAR U_2ED6 +ENCODING 11990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +F0 +90 +A0 +C0 +A0 +90 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR U_2ED7 +ENCODING 11991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9520 +64C0 +ENDCHAR +STARTCHAR U_2ED8 +ENCODING 11992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_2ED9 +ENCODING 11993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +7F80 +0800 +0800 +FFC0 +0840 +0840 +0980 +0800 +ENDCHAR +STARTCHAR U_2EE3 +ENCODING 12003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2480 +FFE0 +A0A0 +BFA0 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_2EF1 +ENCODING 12017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F80 +4080 +7BC0 +2AC0 +FB40 +2AC0 +FB40 +2BC0 +EA20 +07C0 +ENDCHAR +STARTCHAR U_2F00 +ENCODING 12032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 2 0 4 +BITMAP +0040 +FFE0 +ENDCHAR +STARTCHAR U_2F01 +ENCODING 12033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 11 6 -1 +BITMAP +80 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_2F02 +ENCODING 12034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 4 4 3 +BITMAP +80 +40 +20 +20 +ENDCHAR +STARTCHAR U_2F03 +ENCODING 12035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR U_2F04 +ENCODING 12036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FE00 +0200 +0400 +0800 +1000 +2000 +4000 +8080 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_2F05 +ENCODING 12037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 10 4 0 +BITMAP +10 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR U_2F06 +ENCODING 12038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0100 +7F80 +0000 +0000 +0000 +0000 +0000 +0080 +FFC0 +ENDCHAR +STARTCHAR U_2F07 +ENCODING 12039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 4 1 4 +BITMAP +0800 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR U_2F08 +ENCODING 12040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0A00 +1100 +2080 +4060 +8020 +ENDCHAR +STARTCHAR U_2F09 +ENCODING 12041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_2F0A +ENCODING 12042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0400 +0400 +0400 +0400 +0A00 +1100 +2080 +4060 +8020 +ENDCHAR +STARTCHAR U_2F0B +ENCODING 12043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0300 +0100 +1100 +1100 +1100 +1100 +1100 +2080 +4060 +8020 +ENDCHAR +STARTCHAR U_2F0C +ENCODING 12044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8240 +8180 +ENDCHAR +STARTCHAR U_2F0D +ENCODING 12045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 3 +BITMAP +4020 +7FE0 +8040 +8040 +ENDCHAR +STARTCHAR U_2F0E +ENCODING 12046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +40 +20 +08 +10 +10 +20 +20 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR U_2F0F +ENCODING 12047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_2F10 +ENCODING 12048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_2F11 +ENCODING 12049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0840 +0840 +0840 +0840 +1040 +1040 +2040 +4240 +8180 +ENDCHAR +STARTCHAR U_2F12 +ENCODING 12050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0880 +0880 +1080 +1080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_2F13 +ENCODING 12051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +0040 +0040 +0040 +0040 +0040 +0240 +0180 +ENDCHAR +STARTCHAR U_2F14 +ENCODING 12052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +10C0 +1080 +1100 +1200 +1400 +1800 +F020 +1020 +1020 +0FE0 +ENDCHAR +STARTCHAR U_2F15 +ENCODING 12053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8100 +FF80 +8000 +8000 +8000 +8000 +8000 +8000 +8080 +FFC0 +8000 +ENDCHAR +STARTCHAR U_2F16 +ENCODING 12054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 12 0 -1 +BITMAP +0040 +FFE0 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4040 +7FE0 +ENDCHAR +STARTCHAR U_2F17 +ENCODING 12055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2F18 +ENCODING 12056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 4 -1 +BITMAP +80 +80 +80 +C0 +A0 +98 +8C +84 +80 +80 +80 +ENDCHAR +STARTCHAR U_2F19 +ENCODING 12057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 4 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +A8 +90 +80 +80 +80 +ENDCHAR +STARTCHAR U_2F1A +ENCODING 12058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_2F1B +ENCODING 12059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0400 +0400 +0800 +0800 +1000 +1080 +2040 +4FE0 +F020 +4000 +ENDCHAR +STARTCHAR U_2F1C +ENCODING 12060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0100 +7F80 +2100 +2100 +1200 +1200 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_2F1D +ENCODING 12061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +FF +81 +81 +81 +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_2F1E +ENCODING 12062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_2F1F +ENCODING 12063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0480 +7FC0 +0400 +0400 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_2F20 +ENCODING 12064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0400 +0480 +7FC0 +ENDCHAR +STARTCHAR U_2F21 +ENCODING 12065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +0800 +1F80 +3080 +4900 +0600 +0900 +F0E0 +ENDCHAR +STARTCHAR U_2F22 +ENCODING 12066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +2800 +1F80 +1080 +1100 +2900 +4600 +0200 +0500 +18E0 +E040 +ENDCHAR +STARTCHAR U_2F23 +ENCODING 12067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0840 +0FE0 +1040 +2880 +4480 +0500 +0100 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_2F24 +ENCODING 12068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_2F25 +ENCODING 12069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1000 +FFC0 +1200 +2200 +2200 +1400 +0E00 +1100 +6080 +ENDCHAR +STARTCHAR U_2F26 +ENCODING 12070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0100 +0200 +0400 +0400 +FFC0 +0400 +0400 +2400 +1C00 +0800 +ENDCHAR +STARTCHAR U_2F27 +ENCODING 12071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 3 +BITMAP +0400 +0200 +7FE0 +4020 +8040 +ENDCHAR +STARTCHAR U_2F28 +ENCODING 12072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +0200 +0200 +FFC0 +0200 +2200 +1200 +0200 +1200 +0E00 +0400 +ENDCHAR +STARTCHAR U_2F29 +ENCODING 12073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +2480 +2480 +4440 +4440 +8420 +A420 +1C00 +0800 +ENDCHAR +STARTCHAR U_2F2A +ENCODING 12074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +0800 +0A00 +0A00 +0A00 +0A00 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_2F2B +ENCODING 12075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +2020 +2020 +3FE0 +2020 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F2C +ENCODING 12076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +4440 +4440 +4440 +7FC0 +4440 +0400 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_2F2D +ENCODING 12077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +0800 +0800 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_2F2E +ENCODING 12078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2220 +2220 +4440 +4440 +8880 +8880 +4440 +4440 +2220 +2220 +ENDCHAR +STARTCHAR U_2F2F +ENCODING 12079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0080 +7FC0 +0400 +0400 +0400 +0400 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_2F30 +ENCODING 12080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0080 +0080 +0080 +7F80 +4080 +4000 +4000 +4040 +4040 +3FC0 +ENDCHAR +STARTCHAR U_2F31 +ENCODING 12081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +8880 +8880 +8880 +8B80 +0800 +0800 +ENDCHAR +STARTCHAR U_2F32 +ENCODING 12082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2F33 +ENCODING 12083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +1300 +2200 +7E00 +4400 +0800 +1100 +2180 +FE80 +4080 +ENDCHAR +STARTCHAR U_2F34 +ENCODING 12084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +2200 +3FE0 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F35 +ENCODING 12085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +1000 +2000 +2000 +7800 +0800 +8800 +5000 +3000 +2800 +C7E0 +ENDCHAR +STARTCHAR U_2F36 +ENCODING 12086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +1080 +FFE0 +1080 +1080 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_2F37 +ENCODING 12087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +04E0 +1F00 +E400 +0400 +0220 +0120 +00A0 +0060 +ENDCHAR +STARTCHAR U_2F38 +ENCODING 12088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +FE +02 +02 +7E +40 +80 +FF +01 +01 +12 +0C +ENDCHAR +STARTCHAR U_2F39 +ENCODING 12089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +0080 +0080 +0080 +7F80 +0080 +0080 +0080 +FF80 +0080 +ENDCHAR +STARTCHAR U_2F3A +ENCODING 12090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 3 -1 +BITMAP +30 +20 +40 +98 +10 +20 +4C +88 +10 +20 +C0 +ENDCHAR +STARTCHAR U_2F3B +ENCODING 12091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +10 +10 +20 +48 +88 +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR U_2F3C +ENCODING 12092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +0900 +0800 +0840 +4820 +4820 +4880 +8880 +08C0 +0780 +ENDCHAR +STARTCHAR U_2F3D +ENCODING 12093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0900 +0840 +0FE0 +F800 +0880 +0900 +0620 +0A20 +31A0 +C060 +ENDCHAR +STARTCHAR U_2F3E +ENCODING 12094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +00C0 +3F00 +2000 +3FC0 +2040 +2040 +3FC0 +2040 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F3F +ENCODING 12095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +0400 +3FC0 +0400 +0400 +FFE0 +0400 +2400 +1C00 +0800 +ENDCHAR +STARTCHAR U_2F40 +ENCODING 12096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0440 +FFE0 +0400 +3F80 +1100 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_2F41 +ENCODING 12097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0880 +0FC0 +0800 +7F80 +2100 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_2F42 +ENCODING 12098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +FFE0 +2080 +2080 +1100 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_2F43 +ENCODING 12099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +1A00 +0A00 +4200 +3200 +1200 +03C0 +FE00 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_2F44 +ENCODING 12100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3E00 +2000 +2040 +3FE0 +2100 +2100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_2F45 +ENCODING 12101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +FFE0 +0800 +0840 +0FE0 +0840 +1040 +2440 +4380 +8100 +ENDCHAR +STARTCHAR U_2F46 +ENCODING 12102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0A00 +0A00 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_2F47 +ENCODING 12103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8100 +FF80 +8100 +8100 +8100 +FF00 +8100 +8100 +8100 +FF00 +8100 +ENDCHAR +STARTCHAR U_2F48 +ENCODING 12104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0080 +FFC0 +8080 +8080 +8080 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_2F49 +ENCODING 12105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3FC0 +2040 +2040 +3FC0 +2040 +2040 +3FC0 +2040 +2240 +41C0 +8080 +ENDCHAR +STARTCHAR U_2F4A +ENCODING 12106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0440 +FFE0 +0400 +0400 +1500 +1500 +2480 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_2F4B +ENCODING 12107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3FC0 +4040 +8880 +0800 +0800 +0C00 +1200 +2100 +C0C0 +ENDCHAR +STARTCHAR U_2F4C +ENCODING 12108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +2480 +27C0 +2400 +2400 +2400 +2400 +2440 +FFE0 +ENDCHAR +STARTCHAR U_2F4D +ENCODING 12109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0880 +0FC0 +1080 +1080 +2900 +C500 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_2F4E +ENCODING 12110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3E00 +2200 +2200 +23C0 +C000 +3F80 +1100 +0A00 +0400 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_2F4F +ENCODING 12111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +2480 +FFE0 +2480 +2480 +7FE0 +0880 +1080 +2300 +ENDCHAR +STARTCHAR U_2F50 +ENCODING 12112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +2240 +2280 +3B00 +2200 +2200 +2200 +3A20 +E220 +41E0 +ENDCHAR +STARTCHAR U_2F51 +ENCODING 12113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +0580 +7E00 +0400 +04E0 +FF00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_2F52 +ENCODING 12114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +4200 +4200 +7FE0 +4200 +4200 +4200 +5920 +E0A0 +4060 +ENDCHAR +STARTCHAR U_2F53 +ENCODING 12115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +5F80 +8000 +7F80 +0080 +00A0 +00A0 +0060 +0020 +ENDCHAR +STARTCHAR U_2F54 +ENCODING 12116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +04C0 +FC80 +1700 +1600 +1500 +2500 +5480 +8C60 +0820 +ENDCHAR +STARTCHAR U_2F55 +ENCODING 12117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2460 +2440 +2480 +4500 +0A00 +0900 +1080 +2060 +C020 +ENDCHAR +STARTCHAR U_2F56 +ENCODING 12118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +3F80 +2480 +2480 +2480 +2480 +2480 +2480 +2480 +4440 +8020 +ENDCHAR +STARTCHAR U_2F57 +ENCODING 12119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2040 +4020 +80A0 +1080 +1100 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_2F58 +ENCODING 12120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +6100 +1A00 +0600 +1900 +E280 +2200 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_2F59 +ENCODING 12121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +11 +11 +11 +1F +01 +FF +11 +11 +11 +21 +C1 +ENDCHAR +STARTCHAR U_2F5A +ENCODING 12122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +3FE0 +2000 +2000 +3F00 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_2F5B +ENCODING 12123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0200 +2200 +4200 +FFC0 +0600 +0A00 +1200 +2200 +5E00 +8400 +ENDCHAR +STARTCHAR U_2F5C +ENCODING 12124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4480 +7FC0 +8400 +0400 +0440 +FFE0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2F5D +ENCODING 12125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +0400 +0400 +0600 +0900 +1080 +2040 +C020 +ENDCHAR +STARTCHAR U_2F5E +ENCODING 12126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0400 +0880 +1100 +3E00 +0400 +0880 +1340 +7C40 +ENDCHAR +STARTCHAR U_2F5F +ENCODING 12127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +0400 +3F80 +0400 +0500 +0480 +0400 +FFE0 +ENDCHAR +STARTCHAR U_2F60 +ENCODING 12128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3F00 +2500 +2500 +2500 +2480 +2480 +2440 +2540 +47A0 +8CA0 +ENDCHAR +STARTCHAR U_2F61 +ENCODING 12129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +1000 +1F00 +1100 +2900 +2500 +2500 +2120 +FD20 +40E0 +ENDCHAR +STARTCHAR U_2F62 +ENCODING 12130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +2100 +FFC0 +2100 +2100 +2100 +3F00 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_2F63 +ENCODING 12131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +2200 +3FE0 +4200 +8200 +1FC0 +0200 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_2F64 +ENCODING 12132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +2220 +3FE0 +2220 +2220 +3FE0 +2220 +2220 +42E0 +8040 +ENDCHAR +STARTCHAR U_2F65 +ENCODING 12133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 2 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_2F66 +ENCODING 12134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0220 +0240 +0200 +1200 +13E0 +1200 +1200 +2A00 +4600 +83E0 +ENDCHAR +STARTCHAR U_2F67 +ENCODING 12135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5000 +3000 +5000 +9000 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_2F68 +ENCODING 12136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +FC80 +4B20 +3140 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_2F69 +ENCODING 12137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +30 +20 +FF +81 +81 +FF +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_2F6A +ENCODING 12138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +3FE0 +2240 +2200 +3F80 +2880 +2880 +2500 +4300 +9CE0 +ENDCHAR +STARTCHAR U_2F6B +ENCODING 12139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0080 +7FC0 +5280 +5280 +5280 +5280 +5280 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_2F6C +ENCODING 12140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +FF +81 +81 +FF +81 +81 +FF +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_2F6D +ENCODING 12141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0100 +1A00 +0400 +FFC0 +0C80 +1500 +2400 +4400 +9C00 +0800 +ENDCHAR +STARTCHAR U_2F6E +ENCODING 12142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3F80 +4400 +0400 +FFC0 +0400 +0C00 +1200 +21C0 +C080 +ENDCHAR +STARTCHAR U_2F6F +ENCODING 12143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0400 +0800 +1000 +3FC0 +5040 +9040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_2F70 +ENCODING 12144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +3FC0 +0000 +0000 +7FE0 +0200 +1280 +2240 +4220 +8E20 +0400 +ENDCHAR +STARTCHAR U_2F71 +ENCODING 12145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +1800 +1000 +FF80 +9080 +9080 +A480 +AE80 +F280 +8080 +8080 +8380 +ENDCHAR +STARTCHAR U_2F72 +ENCODING 12146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +0400 +0400 +FFE0 +0400 +0E00 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_2F73 +ENCODING 12147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +8040 +9240 +1200 +1200 +2100 +2100 +40C0 +8040 +ENDCHAR +STARTCHAR U_2F74 +ENCODING 12148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +7FC0 +0000 +2080 +2080 +1100 +1100 +1200 +0200 +FFE0 +ENDCHAR +STARTCHAR U_2F75 +ENCODING 12149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2200 +3BE0 +5480 +9080 +1080 +1080 +1080 +1380 +1100 +ENDCHAR +STARTCHAR U_2F76 +ENCODING 12150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +44C0 +3480 +1500 +FFE0 +0400 +0E00 +1500 +24C0 +4460 +8420 +ENDCHAR +STARTCHAR U_2F77 +ENCODING 12151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +2200 +7C00 +1100 +FE80 +4480 +2500 +2480 +4440 +8440 +ENDCHAR +STARTCHAR U_2F78 +ENCODING 12152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2400 +4400 +0400 +FFE0 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_2F79 +ENCODING 12153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9140 +D540 +A240 +9240 +AD40 +C540 +8840 +8040 +81C0 +ENDCHAR +STARTCHAR U_2F7A +ENCODING 12154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_2F7B +ENCODING 12155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +4920 +28A0 +0860 +18A0 +EB20 +4920 +0820 +79E0 +1040 +ENDCHAR +STARTCHAR U_2F7C +ENCODING 12156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0880 +7E80 +0900 +FFC0 +0800 +1180 +3600 +D840 +1040 +0FC0 +ENDCHAR +STARTCHAR U_2F7D +ENCODING 12157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0800 +7FE0 +4920 +4920 +4920 +4920 +4920 +4920 +40E0 +ENDCHAR +STARTCHAR U_2F7E +ENCODING 12158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +1500 +1500 +2480 +4460 +8420 +ENDCHAR +STARTCHAR U_2F7F +ENCODING 12159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +2100 +2100 +3F00 +2100 +3F00 +2100 +21C0 +FF00 +0100 +0100 +ENDCHAR +STARTCHAR U_2F80 +ENCODING 12160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0480 +3F80 +0400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2F81 +ENCODING 12161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8840 +8C40 +9340 +E840 +8C40 +9240 +E140 +8040 +80C0 +ENDCHAR +STARTCHAR U_2F82 +ENCODING 12162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +8200 +FF00 +8800 +8800 +FF00 +8100 +8100 +FF00 +8800 +8900 +FF80 +ENDCHAR +STARTCHAR U_2F83 +ENCODING 12163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +30 +20 +FF +81 +FF +81 +81 +FF +81 +FF +81 +ENDCHAR +STARTCHAR U_2F84 +ENCODING 12164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0800 +1080 +7F60 +2420 +0400 +3FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_2F85 +ENCODING 12165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E3C0 +8040 +8040 +8040 +FBC0 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_2F86 +ENCODING 12166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0180 +7E00 +0400 +FFC0 +0400 +0400 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_2F87 +ENCODING 12167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +3BE0 +4880 +4A80 +BA80 +0FE0 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_2F88 +ENCODING 12168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1080 +1480 +1280 +FFE0 +1480 +1280 +2280 +4080 +8380 +ENDCHAR +STARTCHAR U_2F89 +ENCODING 12169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +4820 +4440 +4280 +4100 +5880 +E060 +ENDCHAR +STARTCHAR U_2F8A +ENCODING 12170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +2200 +7FC0 +A440 +2440 +3FC0 +2040 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_2F8B +ENCODING 12171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AAA0 +AAA0 +AAA0 +AAA0 +FBE0 +AAA0 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_2F8C +ENCODING 12172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +7FE0 +4040 +4400 +44C0 +7F00 +4420 +4420 +83E0 +ENDCHAR +STARTCHAR U_2F8D +ENCODING 12173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +4440 +7FC0 +4440 +0480 +07C0 +FC20 +6020 +ENDCHAR +STARTCHAR U_2F8E +ENCODING 12174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0C00 +0800 +3F80 +2A80 +2A80 +2A80 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_2F8F +ENCODING 12175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4000 +8000 +1000 +2FE0 +6080 +A080 +2080 +2480 +2380 +2100 +ENDCHAR +STARTCHAR U_2F90 +ENCODING 12176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0240 +FFE0 +0400 +0A40 +1280 +3100 +5100 +94C0 +1860 +3020 +ENDCHAR +STARTCHAR U_2F91 +ENCODING 12177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +1200 +1200 +FFC0 +9240 +9240 +9E40 +9240 +8040 +8040 +8040 +ENDCHAR +STARTCHAR U_2F92 +ENCODING 12178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2A80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_2F93 +ENCODING 12179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FE0 +A220 +3FE0 +2220 +3FE0 +2220 +42E0 +8040 +ENDCHAR +STARTCHAR U_2F94 +ENCODING 12180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0000 +3F00 +0000 +3F00 +0000 +3F00 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_2F95 +ENCODING 12181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +2100 +4880 +8C40 +1200 +2100 +FFC0 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_2F96 +ENCODING 12182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7FC0 +0000 +3F80 +2080 +3F80 +2080 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_2F97 +ENCODING 12183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0840 +1880 +6500 +0A00 +1300 +6680 +0A40 +7220 +0C00 +ENDCHAR +STARTCHAR U_2F98 +ENCODING 12184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +0E +30 +CB +2C +36 +CA +36 +CA +32 +C2 +0C +ENDCHAR +STARTCHAR U_2F99 +ENCODING 12185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_2F9A +ENCODING 12186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3FC0 +0400 +FFE0 +0900 +2940 +2940 +4920 +1720 +6200 +ENDCHAR +STARTCHAR U_2F9B +ENCODING 12187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +0400 +2400 +27C0 +2400 +5400 +8FE0 +ENDCHAR +STARTCHAR U_2F9C +ENCODING 12188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1040 +1040 +1FC0 +0200 +1200 +13E0 +1200 +2A00 +4600 +81E0 +ENDCHAR +STARTCHAR U_2F9D +ENCODING 12189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +3F00 +2100 +3F00 +2140 +3F80 +2100 +FF00 +0900 +3100 +C700 +ENDCHAR +STARTCHAR U_2F9E +ENCODING 12190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2F9F +ENCODING 12191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +1900 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_2FA0 +ENCODING 12192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2000 +3FE0 +2A20 +2A40 +2980 +4880 +4A40 +8C20 +ENDCHAR +STARTCHAR U_2FA1 +ENCODING 12193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +3980 +0600 +3980 +0600 +3A00 +1200 +13C0 +2A00 +4600 +81E0 +ENDCHAR +STARTCHAR U_2FA2 +ENCODING 12194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +0000 +FF80 +8880 +8880 +FF80 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_2FA3 +ENCODING 12195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +0A00 +7FC0 +4A40 +53C0 +6040 +7FC0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_2FA4 +ENCODING 12196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C40 +2480 +1500 +7FE0 +0400 +0E00 +1500 +24C0 +4460 +8420 +ENDCHAR +STARTCHAR U_2FA5 +ENCODING 12197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4480 +4480 +7F80 +4480 +7F80 +4480 +0400 +7F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_2FA6 +ENCODING 12198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +20E0 +DF40 +0400 +7FC0 +2480 +1480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_2FA7 +ENCODING 12199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2000 +3F00 +2000 +3F00 +2000 +FFC0 +2440 +2280 +2900 +30C0 +ENDCHAR +STARTCHAR U_2FA8 +ENCODING 12200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_2FA9 +ENCODING 12201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7F80 +4000 +7FC0 +4040 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2FAA +ENCODING 12202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +7FE0 +0480 +7F80 +2640 +1D80 +1480 +E460 +4C20 +ENDCHAR +STARTCHAR U_2FAB +ENCODING 12203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +3FE0 +2200 +7FC0 +A200 +2200 +3FC0 +2200 +3FE0 +2000 +ENDCHAR +STARTCHAR U_2FAC +ENCODING 12204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +5540 +4CC0 +6640 +5540 +4440 +44C0 +ENDCHAR +STARTCHAR U_2FAD +ENCODING 12205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +3F80 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_2FAE +ENCODING 12206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +F1E0 +1100 +1100 +71C0 +1100 +1100 +F1E0 +1100 +1100 +ENDCHAR +STARTCHAR U_2FAF +ENCODING 12207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0800 +FFE0 +9120 +9F20 +9120 +9F20 +9120 +FFE0 +8020 +ENDCHAR +STARTCHAR U_2FB0 +ENCODING 12208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0400 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_2FB1 +ENCODING 12209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F00 +1100 +FFC0 +2080 +3F80 +0400 +FF80 +2400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_2FB2 +ENCODING 12210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1100 +1100 +71C0 +1100 +1100 +F1E0 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_2FB3 +ENCODING 12211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_2FB4 +ENCODING 12212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4040 +7FC0 +4040 +7FC0 +4040 +7FC0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_2FB5 +ENCODING 12213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2140 +2E40 +2440 +3F40 +3540 +3F40 +2540 +2760 +5CA0 +8820 +ENDCHAR +STARTCHAR U_2FB6 +ENCODING 12214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +0140 +1580 +6540 +24A0 +FF60 +2540 +2580 +2540 +44A0 +8460 +ENDCHAR +STARTCHAR U_2FB7 +ENCODING 12215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2480 +FFE0 +2080 +3F80 +2080 +3FC0 +2480 +2300 +38E0 +ENDCHAR +STARTCHAR U_2FB8 +ENCODING 12216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0400 +7FC0 +4040 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_2FB9 +ENCODING 12217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +1500 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_2FBA +ENCODING 12218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2400 +3F80 +2400 +3F80 +2400 +3FE0 +0020 +5520 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_2FBB +ENCODING 12219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2780 +2480 +FFE0 +A0A0 +BFA0 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_2FBC +ENCODING 12220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +1F80 +0000 +7FE0 +4020 +4F20 +4920 +4F20 +40E0 +ENDCHAR +STARTCHAR U_2FBD +ENCODING 12221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4080 +7D00 +4020 +7C40 +4080 +FF00 +2820 +4840 +F480 +0300 +ENDCHAR +STARTCHAR U_2FBE +ENCODING 12222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8020 +8020 +8020 +8020 +80E0 +8040 +ENDCHAR +STARTCHAR U_2FBF +ENCODING 12223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +AA80 +D480 +AD80 +BA80 +C480 +FF80 +4000 +4E00 +7080 +4080 +3F80 +ENDCHAR +STARTCHAR U_2FC0 +ENCODING 12224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0000 +3F00 +2100 +3F00 +0000 +FF80 +9480 +BE80 +8880 +8980 +ENDCHAR +STARTCHAR U_2FC1 +ENCODING 12225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3FC0 +2440 +3FC0 +2440 +3FC0 +0480 +0D40 +17C0 +2420 +C3E0 +ENDCHAR +STARTCHAR U_2FC2 +ENCODING 12226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_2FC3 +ENCODING 12227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +3FE0 +5520 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_2FC4 +ENCODING 12228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0FC0 +0800 +FFC0 +A8C0 +9540 +AA40 +94C0 +8A40 +9540 +A2C0 +FFC0 +ENDCHAR +STARTCHAR U_2FC5 +ENCODING 12229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4920 +7FE0 +5120 +5D40 +51A0 +9D20 +90E0 +ENDCHAR +STARTCHAR U_2FC6 +ENCODING 12230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5F40 +9520 +2880 +CF60 +3100 +4E00 +0500 +78C0 +ENDCHAR +STARTCHAR U_2FC7 +ENCODING 12231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5100 +5100 +7FE0 +5100 +5B40 +7540 +5540 +5560 +9100 +ENDCHAR +STARTCHAR U_2FC8 +ENCODING 12232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0000 +FFE0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_2FC9 +ENCODING 12233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +1500 +2480 +CE60 +1500 +74E0 +0F00 +3480 +CC60 +ENDCHAR +STARTCHAR U_2FCA +ENCODING 12234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +64C0 +5540 +7FC0 +0400 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_2FCB +ENCODING 12235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +2440 +7FE0 +A440 +2640 +2D40 +34C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_2FCC +ENCODING 12236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +F3C0 +1200 +F3C0 +9240 +F3C0 +9240 +F3C0 +1220 +0FE0 +ENDCHAR +STARTCHAR U_2FCD +ENCODING 12237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +5140 +5F40 +5140 +5F40 +5140 +7FC0 +0A00 +FBE0 +4A40 +8A40 +ENDCHAR +STARTCHAR U_2FCE +ENCODING 12238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +23E0 +F880 +07E0 +FA40 +8A40 +F980 +5180 +2240 +FC20 +ENDCHAR +STARTCHAR U_2FCF +ENCODING 12239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +8080 +F780 +8080 +FF80 +0000 +CD00 +AB00 +CD40 +AAC0 +EE40 +ENDCHAR +STARTCHAR U_2FD0 +ENCODING 12240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +7FC0 +4440 +4440 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_2FD1 +ENCODING 12241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A40 +F580 +5540 +95A0 +3F80 +2080 +3F80 +2080 +C080 +ENDCHAR +STARTCHAR U_2FD2 +ENCODING 12242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +5140 +6AC0 +4440 +7FC0 +5140 +6AC0 +7FC0 +ENDCHAR +STARTCHAR U_2FD3 +ENCODING 12243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +45E0 +2820 +FFE0 +4500 +7DE0 +4500 +7DE0 +4520 +4DE0 +ENDCHAR +STARTCHAR U_2FD4 +ENCODING 12244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2100 +FFC0 +4A40 +7BC0 +FAC0 +2B40 +FAC0 +2BE0 +FA20 +07E0 +ENDCHAR +STARTCHAR U_2FD5 +ENCODING 12245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +CE60 +0000 +EEE0 +AAA0 +FFE0 +9120 +FFE0 +9120 +9160 +ENDCHAR +STARTCHAR U_2FF0 +ENCODING 12272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8420 +0000 +8420 +0000 +8420 +0000 +8420 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF1 +ENCODING 12273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +0000 +8020 +2A80 +8020 +0000 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF2 +ENCODING 12274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +9120 +0000 +9120 +9120 +0000 +9120 +9120 +0000 +9120 +DB60 +ENDCHAR +STARTCHAR U_2FF3 +ENCODING 12275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +2A80 +8020 +0000 +8020 +2A80 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF4 +ENCODING 12276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1500 +8020 +1100 +8020 +1500 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF5 +ENCODING 12277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1500 +8020 +1100 +8020 +1100 +8020 +1100 +AAA0 +ENDCHAR +STARTCHAR U_2FF6 +ENCODING 12278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +9120 +0000 +9120 +9120 +0000 +9120 +9B20 +0000 +8020 +DB60 +ENDCHAR +STARTCHAR U_2FF7 +ENCODING 12279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1A80 +8020 +1000 +8020 +1A80 +8020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_2FF8 +ENCODING 12280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +8020 +1540 +8020 +1000 +8020 +1000 +8020 +1000 +AAA0 +ENDCHAR +STARTCHAR U_2FF9 +ENCODING 12281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +8020 +0000 +DB20 +8120 +0000 +8120 +8120 +0000 +8120 +DB60 +ENDCHAR +STARTCHAR U_2FFA +ENCODING 12282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB60 +9020 +0000 +9020 +9020 +0000 +9020 +9B60 +0000 +8020 +DB60 +ENDCHAR +STARTCHAR U_2FFB +ENCODING 12283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DB00 +8100 +0000 +9B60 +9120 +0000 +9120 +DB20 +0000 +1020 +1B60 +ENDCHAR +STARTCHAR U_3000 +ENCODING 12288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 1 10 -1 +BITMAP +00 +ENDCHAR +STARTCHAR U_3001 +ENCODING 12289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 3 0 0 +BITMAP +80 +60 +20 +ENDCHAR +STARTCHAR U_3002 +ENCODING 12290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 4 3 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR U_3003 +ENCODING 12291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 4 4 3 +BITMAP +50 +50 +A0 +A0 +ENDCHAR +STARTCHAR U_3004 +ENCODING 12292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +1800 +2100 +4580 +8740 +8540 +9C40 +A440 +5080 +2900 +1200 +ENDCHAR +STARTCHAR U_3005 +ENCODING 12293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +1000 +1000 +1F80 +2080 +4080 +8100 +1200 +0C00 +0400 +0400 +ENDCHAR +STARTCHAR U_3006 +ENCODING 12294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 0 1 +BITMAP +0100 +0080 +3100 +4A00 +8400 +8A00 +9000 +A000 +C000 +ENDCHAR +STARTCHAR U_3007 +ENCODING 12295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +1E00 +2100 +4080 +8040 +8040 +8040 +8040 +4080 +2100 +1E00 +ENDCHAR +STARTCHAR U_3008 +ENCODING 12296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 8 -1 +BITMAP +20 +20 +40 +40 +80 +80 +80 +80 +40 +40 +20 +20 +ENDCHAR +STARTCHAR U_3009 +ENCODING 12297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 2 -1 +BITMAP +80 +80 +40 +40 +20 +20 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U_300A +ENCODING 12298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 10 5 -1 +BITMAP +24 +24 +48 +48 +90 +90 +48 +48 +24 +24 +ENDCHAR +STARTCHAR U_300B +ENCODING 12299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 10 0 -1 +BITMAP +90 +90 +48 +48 +24 +24 +48 +48 +90 +90 +ENDCHAR +STARTCHAR U_300C +ENCODING 12300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 8 7 2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_300D +ENCODING 12301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 8 1 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR U_300E +ENCODING 12302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 9 6 1 +BITMAP +F8 +88 +B8 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR U_300F +ENCODING 12303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 9 1 -1 +BITMAP +38 +28 +28 +28 +28 +28 +E8 +88 +F8 +ENDCHAR +STARTCHAR U_3010 +ENCODING 12304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 2 -1 +BITMAP +F0 +E0 +C0 +C0 +80 +80 +80 +C0 +C0 +E0 +F0 +ENDCHAR +STARTCHAR U_3011 +ENCODING 12305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 2 -1 +BITMAP +F0 +70 +30 +30 +10 +10 +10 +30 +30 +70 +F0 +ENDCHAR +STARTCHAR U_3012 +ENCODING 12306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +FFC0 +0000 +0000 +FFC0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3013 +ENCODING 12307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +0000 +0000 +0000 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR U_3014 +ENCODING 12308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 7 -1 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR U_3015 +ENCODING 12309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 2 -1 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR U_3016 +ENCODING 12310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 6 -1 +BITMAP +F8 +90 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +90 +F8 +ENDCHAR +STARTCHAR U_3017 +ENCODING 12311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 1 -1 +BITMAP +F8 +48 +28 +28 +28 +28 +28 +28 +28 +48 +F8 +ENDCHAR +STARTCHAR U_3018 +ENCODING 12312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +30 +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +30 +ENDCHAR +STARTCHAR U_3019 +ENCODING 12313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +C0 +70 +50 +50 +50 +50 +50 +50 +50 +70 +C0 +ENDCHAR +STARTCHAR U_301A +ENCODING 12314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +F0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F0 +ENDCHAR +STARTCHAR U_301B +ENCODING 12315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +F0 +50 +50 +50 +50 +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR U_301C +ENCODING 12316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 3 +BITMAP +03C0 +8420 +7800 +ENDCHAR +STARTCHAR U_301D +ENCODING 12317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 2 8 8 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR U_301E +ENCODING 12318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 2 1 8 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR U_301F +ENCODING 12319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 3 0 -1 +BITMAP +48 +90 +90 +ENDCHAR +STARTCHAR U_3020 +ENCODING 12320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +7FC0 +0400 +D560 +AEA0 +9120 +4E40 +2080 +1F00 +ENDCHAR +STARTCHAR U_3021 +ENCODING 12321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 11 0 -1 +BITMAP +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_3022 +ENCODING 12322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 12 3 -1 +BITMAP +0C +08 +88 +88 +88 +88 +88 +88 +88 +08 +08 +08 +ENDCHAR +STARTCHAR U_3023 +ENCODING 12323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 12 2 -1 +BITMAP +0080 +8080 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +8080 +0080 +ENDCHAR +STARTCHAR U_3024 +ENCODING 12324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +01 +41 +22 +12 +0C +04 +0A +11 +21 +C0 +ENDCHAR +STARTCHAR U_3025 +ENCODING 12325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 12 3 -1 +BITMAP +22 +42 +C4 +28 +38 +44 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_3026 +ENCODING 12326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 3 1 5 +BITMAP +0800 +0400 +FFC0 +ENDCHAR +STARTCHAR U_3027 +ENCODING 12327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 0 2 +BITMAP +0800 +0800 +0800 +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR U_3028 +ENCODING 12328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0800 +0800 +FFC0 +0000 +0000 +7F80 +0000 +0000 +0000 +FFC0 +ENDCHAR +STARTCHAR U_3029 +ENCODING 12329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +20 +20 +7F +42 +A2 +14 +0C +0C +12 +22 +C0 +ENDCHAR +STARTCHAR U_3030 +ENCODING 12336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 3 +BITMAP +6180 +9240 +0C20 +ENDCHAR +STARTCHAR U_3031 +ENCODING 12337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +18 +20 +40 +80 +80 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR U_3032 +ENCODING 12338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 0 -1 +BITMAP +10 +18 +22 +41 +84 +82 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR U_3033 +ENCODING 12339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +18 +10 +20 +20 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U_3034 +ENCODING 12340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 0 -1 +BITMAP +10 +1A +11 +24 +22 +20 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR U_3035 +ENCODING 12341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +80 +40 +20 +20 +10 +10 +08 +08 +04 +04 +04 +ENDCHAR +STARTCHAR U_3036 +ENCODING 12342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +7FC0 +BFA0 +8020 +BFA0 +BFA0 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_3037 +ENCODING 12343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A20 +8A20 +5140 +5140 +2080 +2080 +2080 +5140 +5140 +8A20 +8A20 +ENDCHAR +STARTCHAR U_3038 +ENCODING 12344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3039 +ENCODING 12345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +FFE0 +1100 +1100 +1100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_303A +ENCODING 12346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2480 +2480 +FFE0 +2480 +2480 +2480 +4480 +4480 +8480 +ENDCHAR +STARTCHAR U_303E +ENCODING 12350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +0000 +99A0 +2600 +8120 +3F80 +8420 +3F80 +9020 +0000 +AAA0 +ENDCHAR +STARTCHAR U_3041 +ENCODING 12353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +20 +10 +54 +38 +12 +3C +56 +92 +AA +44 +ENDCHAR +STARTCHAR U_3042 +ENCODING 12354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +1600 +F800 +2400 +3E00 +2500 +6880 +A880 +9080 +A100 +4600 +ENDCHAR +STARTCHAR U_3043 +ENCODING 12355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 5 2 0 +BITMAP +40 +48 +84 +A4 +40 +ENDCHAR +STARTCHAR U_3044 +ENCODING 12356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 0 0 +BITMAP +8000 +4300 +4080 +4040 +4840 +50C0 +3040 +1000 +ENDCHAR +STARTCHAR U_3045 +ENCODING 12357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 7 2 -1 +BITMAP +40 +30 +70 +88 +08 +10 +20 +ENDCHAR +STARTCHAR U_3046 +ENCODING 12358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 12 2 -1 +BITMAP +20 +18 +00 +3C +C2 +02 +02 +02 +04 +04 +08 +10 +ENDCHAR +STARTCHAR U_3047 +ENCODING 12359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 1 -1 +BITMAP +20 +10 +7C +08 +30 +48 +8E +ENDCHAR +STARTCHAR U_3048 +ENCODING 12360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0C00 +0000 +4E00 +3200 +0400 +0800 +1800 +2400 +4400 +8380 +ENDCHAR +STARTCHAR U_3049 +ENCODING 12361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +20 +34 +E2 +38 +64 +A4 +48 +ENDCHAR +STARTCHAR U_304A +ENCODING 12362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1500 +78C0 +1040 +1700 +1880 +7040 +D240 +3180 +1000 +ENDCHAR +STARTCHAR U_304B +ENCODING 12363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +2000 +1100 +9C80 +7240 +1240 +12C0 +2200 +2200 +4A00 +4400 +ENDCHAR +STARTCHAR U_304C +ENCODING 12364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00A0 +20A0 +1100 +9C80 +7240 +1240 +12C0 +2200 +2200 +4A00 +4400 +ENDCHAR +STARTCHAR U_304D +ENCODING 12365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +10 +1C +F0 +0E +F8 +04 +3A +46 +80 +40 +3C +ENDCHAR +STARTCHAR U_304E +ENCODING 12366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +15 +1D +F0 +0E +F8 +04 +3A +46 +80 +40 +3C +ENDCHAR +STARTCHAR U_304F +ENCODING 12367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 2 -1 +BITMAP +10 +08 +10 +20 +40 +80 +40 +20 +10 +08 +08 +ENDCHAR +STARTCHAR U_3050 +ENCODING 12368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +10 +08 +15 +25 +40 +80 +40 +20 +10 +08 +08 +ENDCHAR +STARTCHAR U_3051 +ENCODING 12369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +8100 +41C0 +5F00 +8100 +8100 +8100 +8100 +6200 +4200 +0400 +ENDCHAR +STARTCHAR U_3052 +ENCODING 12370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +04A0 +82A0 +41C0 +5F00 +8100 +8100 +8100 +8100 +6200 +4200 +0400 +ENDCHAR +STARTCHAR U_3053 +ENCODING 12371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +40 +3E +04 +00 +00 +80 +80 +41 +3E +ENDCHAR +STARTCHAR U_3054 +ENCODING 12372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +4280 +3E80 +0400 +0000 +0000 +8000 +8000 +4100 +3E00 +ENDCHAR +STARTCHAR U_3055 +ENCODING 12373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +20 +10 +8E +78 +04 +04 +7A +86 +80 +60 +1C +ENDCHAR +STARTCHAR U_3056 +ENCODING 12374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2280 +1280 +8E00 +7800 +0400 +0400 +7A00 +8600 +8000 +6000 +1C00 +ENDCHAR +STARTCHAR U_3057 +ENCODING 12375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +80 +40 +40 +40 +40 +40 +40 +41 +26 +18 +ENDCHAR +STARTCHAR U_3058 +ENCODING 12376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +80 +45 +45 +40 +40 +40 +40 +41 +26 +18 +ENDCHAR +STARTCHAR U_3059 +ENCODING 12377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 12 0 -1 +BITMAP +0400 +0200 +83C0 +7E00 +0A00 +1600 +1200 +0E00 +0200 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_305A +ENCODING 12378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 12 0 -1 +BITMAP +04A0 +02A0 +83C0 +7E00 +0A00 +1600 +1200 +0E00 +0200 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_305B +ENCODING 12379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0200 +2100 +11E0 +9700 +7900 +1100 +1300 +1000 +0800 +0780 +ENDCHAR +STARTCHAR U_305C +ENCODING 12380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0250 +2150 +11E0 +9700 +7900 +1100 +1300 +1000 +0800 +0780 +ENDCHAR +STARTCHAR U_305D +ENCODING 12381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +4E00 +3400 +0800 +1380 +FC00 +0800 +1000 +1000 +0800 +0600 +ENDCHAR +STARTCHAR U_305E +ENCODING 12382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +4D40 +3540 +0800 +1380 +FC00 +0800 +1000 +1000 +0800 +0600 +ENDCHAR +STARTCHAR U_305F +ENCODING 12383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +1000 +1C00 +E000 +2700 +2180 +4200 +4000 +4800 +8800 +8780 +ENDCHAR +STARTCHAR U_3060 +ENCODING 12384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +1140 +1D40 +E000 +2700 +2180 +4200 +4000 +4800 +8800 +8780 +ENDCHAR +STARTCHAR U_3061 +ENCODING 12385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +8A00 +7C00 +1000 +1700 +1880 +2080 +0080 +0300 +1C00 +ENDCHAR +STARTCHAR U_3062 +ENCODING 12386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +1140 +8A80 +5400 +3800 +1700 +3880 +2080 +0080 +0300 +1C00 +ENDCHAR +STARTCHAR U_3063 +ENCODING 12387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 5 2 -1 +BITMAP +38 +C4 +04 +08 +30 +ENDCHAR +STARTCHAR U_3064 +ENCODING 12388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 7 0 1 +BITMAP +0F00 +B080 +4040 +0040 +0080 +0300 +0C00 +ENDCHAR +STARTCHAR U_3065 +ENCODING 12389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +00A0 +0FA0 +B080 +4040 +0040 +0080 +0300 +0C00 +ENDCHAR +STARTCHAR U_3066 +ENCODING 12390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +8380 +7C00 +0400 +0800 +1000 +1000 +1000 +0800 +0700 +ENDCHAR +STARTCHAR U_3067 +ENCODING 12391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +8380 +7C00 +0540 +0940 +1000 +1000 +1000 +0800 +0700 +ENDCHAR +STARTCHAR U_3068 +ENCODING 12392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +40 +20 +26 +28 +30 +40 +80 +40 +3E +ENDCHAR +STARTCHAR U_3069 +ENCODING 12393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +4280 +2280 +2600 +2800 +3000 +4000 +8000 +4000 +3E00 +ENDCHAR +STARTCHAR U_306A +ENCODING 12394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +1400 +FB00 +2180 +2200 +4200 +4200 +9E00 +2300 +2280 +1C00 +ENDCHAR +STARTCHAR U_306B +ENCODING 12395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +8000 +4700 +5980 +8200 +8000 +8000 +8800 +A800 +C780 +4000 +ENDCHAR +STARTCHAR U_306C +ENCODING 12396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +0400 +4F00 +5480 +6440 +6840 +A840 +9340 +A480 +4380 +ENDCHAR +STARTCHAR U_306D +ENCODING 12397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1000 +1000 +9B80 +7440 +1840 +3040 +3040 +51C0 +B260 +1180 +ENDCHAR +STARTCHAR U_306E +ENCODING 12398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +1C00 +2A00 +4900 +8880 +9080 +9080 +A100 +4200 +0C00 +ENDCHAR +STARTCHAR U_306F +ENCODING 12399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +8100 +51C0 +4F00 +8100 +8100 +8100 +8F00 +B180 +D140 +4E00 +ENDCHAR +STARTCHAR U_3070 +ENCODING 12400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +02A0 +81A0 +51C0 +4F00 +8100 +8100 +8100 +8F00 +B180 +D140 +4E00 +ENDCHAR +STARTCHAR U_3071 +ENCODING 12401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +02C0 +8120 +51C0 +4F00 +8100 +8100 +8100 +8F00 +B180 +D140 +4E00 +ENDCHAR +STARTCHAR U_3072 +ENCODING 12402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0200 +1200 +F100 +2100 +2180 +4140 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_3073 +ENCODING 12403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +02A0 +12A0 +F100 +2100 +2180 +4140 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_3074 +ENCODING 12404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00C0 +0320 +12C0 +F100 +2100 +2180 +4140 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_3075 +ENCODING 12405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +1000 +0E00 +0400 +0800 +0800 +0580 +A440 +C2E0 +9200 +0C00 +ENDCHAR +STARTCHAR U_3076 +ENCODING 12406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +1140 +0F40 +0400 +0800 +0800 +0580 +A440 +C2E0 +9200 +0C00 +ENDCHAR +STARTCHAR U_3077 +ENCODING 12407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 -1 +BITMAP +10C0 +0F20 +04C0 +0800 +0800 +0580 +A440 +C2E0 +9200 +0C00 +ENDCHAR +STARTCHAR U_3078 +ENCODING 12408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +1800 +2400 +C200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_3079 +ENCODING 12409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +0140 +0140 +1800 +2400 +C200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_307A +ENCODING 12410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +00C0 +0120 +18C0 +2400 +C200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_307B +ENCODING 12411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +91C0 +4F00 +4140 +8F80 +8100 +8100 +8F00 +B180 +5140 +4E00 +ENDCHAR +STARTCHAR U_307C +ENCODING 12412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00A0 +91A0 +4F00 +4140 +8F80 +8100 +8100 +8F00 +B180 +5140 +4E00 +ENDCHAR +STARTCHAR U_307D +ENCODING 12413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +00C0 +9120 +4FC0 +4100 +8FC0 +8100 +8100 +8F00 +B180 +5140 +4E00 +ENDCHAR +STARTCHAR U_307E +ENCODING 12414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +10 +8F +78 +08 +8E +78 +08 +78 +8E +89 +70 +ENDCHAR +STARTCHAR U_307F +ENCODING 12415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4400 +3C00 +0800 +0800 +0900 +3E80 +5180 +9140 +A100 +4200 +0400 +ENDCHAR +STARTCHAR U_3080 +ENCODING 12416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +9C00 +7180 +1040 +7000 +9000 +9000 +A100 +6080 +2080 +1F00 +ENDCHAR +STARTCHAR U_3081 +ENCODING 12417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +4E00 +5500 +6480 +4840 +A840 +9040 +9080 +6100 +0600 +ENDCHAR +STARTCHAR U_3082 +ENCODING 12418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +20 +10 +70 +1C +28 +E2 +39 +21 +21 +12 +0C +ENDCHAR +STARTCHAR U_3083 +ENCODING 12419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 2 -1 +BITMAP +28 +2E +F5 +21 +16 +10 +10 +ENDCHAR +STARTCHAR U_3084 +ENCODING 12420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3700 +2000 +13C0 +9C20 +7020 +09C0 +0800 +0800 +0400 +0400 +ENDCHAR +STARTCHAR U_3085 +ENCODING 12421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 3 -1 +BITMAP +10 +9C +B2 +D2 +9C +10 +20 +ENDCHAR +STARTCHAR U_3086 +ENCODING 12422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8200 +4780 +4A40 +5220 +6220 +6A40 +4780 +4200 +0400 +0800 +ENDCHAR +STARTCHAR U_3087 +ENCODING 12423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +10 +1C +10 +10 +78 +96 +60 +ENDCHAR +STARTCHAR U_3088 +ENCODING 12424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +0980 +0E00 +0800 +0800 +0800 +7800 +8E00 +8980 +7000 +ENDCHAR +STARTCHAR U_3089 +ENCODING 12425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +20 +18 +40 +80 +80 +BC +C2 +82 +02 +0C +70 +ENDCHAR +STARTCHAR U_308A +ENCODING 12426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +88 +54 +52 +62 +62 +42 +42 +04 +04 +08 +10 +ENDCHAR +STARTCHAR U_308B +ENCODING 12427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +4E +34 +08 +10 +3E +61 +81 +19 +26 +1C +ENDCHAR +STARTCHAR U_308C +ENCODING 12428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1000 +1300 +3480 +D880 +1080 +1080 +3080 +5080 +B060 +1000 +ENDCHAR +STARTCHAR U_308D +ENCODING 12429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +4E +34 +08 +10 +3E +61 +81 +01 +06 +18 +ENDCHAR +STARTCHAR U_308E +ENCODING 12430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 2 -1 +BITMAP +40 +30 +EE +31 +61 +A2 +24 +ENDCHAR +STARTCHAR U_308F +ENCODING 12431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1000 +1000 +9B80 +7C40 +1020 +1020 +3020 +5040 +B180 +1000 +ENDCHAR +STARTCHAR U_3090 +ENCODING 12432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +4E00 +3400 +0400 +1F00 +2880 +4840 +9040 +9640 +6980 +4700 +ENDCHAR +STARTCHAR U_3091 +ENCODING 12433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +1F00 +0400 +1F00 +2080 +4C80 +1300 +0C00 +0000 +5980 +8640 +ENDCHAR +STARTCHAR U_3092 +ENCODING 12434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +9E00 +7000 +2180 +7200 +8C00 +1400 +2400 +2000 +1F00 +ENDCHAR +STARTCHAR U_3093 +ENCODING 12435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +1000 +0800 +0800 +1000 +1000 +3800 +2400 +4440 +4480 +8300 +ENDCHAR +STARTCHAR U_3094 +ENCODING 12436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +0C80 +0040 +1D00 +E280 +0200 +0200 +0400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_3099 +ENCODING 12441 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 3 0 5 +BITMAP +20 +90 +40 +ENDCHAR +STARTCHAR U_309B +ENCODING 12443 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 3 0 5 +BITMAP +20 +90 +40 +ENDCHAR +STARTCHAR U_309C +ENCODING 12444 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 3 0 5 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR u30A0 +ENCODING 12448 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR u30A1 +ENCODING 12449 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +10 +60 +40 +80 +ENDCHAR +STARTCHAR u30A2 +ENCODING 12450 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +28 +30 +20 +20 +40 +ENDCHAR +STARTCHAR u30A3 +ENCODING 12451 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +10 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR u30A4 +ENCODING 12452 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR u30A5 +ENCODING 12453 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +20 +F0 +90 +10 +20 +ENDCHAR +STARTCHAR u30A6 +ENCODING 12454 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +88 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30A7 +ENCODING 12455 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 4 0 0 +BITMAP +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR u30A8 +ENCODING 12456 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR u30A9 +ENCODING 12457 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +20 +F0 +20 +60 +A0 +ENDCHAR +STARTCHAR u30AA +ENCODING 12458 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +10 +30 +50 +90 +10 +ENDCHAR +STARTCHAR u30AB +ENCODING 12459 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +F8 +48 +48 +48 +48 +98 +ENDCHAR +STARTCHAR u30AC +ENCODING 12460 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +40 +F8 +48 +48 +48 +48 +98 +ENDCHAR +STARTCHAR u30AD +ENCODING 12461 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +20 +F8 +10 +10 +ENDCHAR +STARTCHAR u30AE +ENCODING 12462 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +20 +F8 +20 +20 +F8 +10 +10 +ENDCHAR +STARTCHAR u30AF +ENCODING 12463 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +78 +48 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30B0 +ENCODING 12464 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +40 +78 +48 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30B1 +ENCODING 12465 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +F8 +90 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30B2 +ENCODING 12466 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +80 +F8 +90 +90 +10 +10 +20 +ENDCHAR +STARTCHAR u30BB3 +ENCODING 12467 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30B4 +ENCODING 12468 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +F8 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR u30BB5 +ENCODING 12469 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +F8 +50 +50 +50 +10 +20 +ENDCHAR +STARTCHAR u30B6 +ENCODING 12470 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +50 +F8 +50 +50 +50 +10 +20 +ENDCHAR +STARTCHAR u30B7 +ENCODING 12471 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +08 +C8 +08 +10 +E0 +ENDCHAR +STARTCHAR u30B8 +ENCODING 12472 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 7 13 0 0 +BITMAP +02 +00 +00 +00 +28 +28 +00 +C0 +08 +C8 +08 +10 +E0 +ENDCHAR +STARTCHAR u30B9 +ENCODING 12473 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +10 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BA +ENCODING 12474 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +70 +10 +10 +20 +50 +88 +ENDCHAR +STARTCHAR u30BB +ENCODING 12475 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BC +ENCODING 12476 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +40 +40 +F8 +48 +50 +40 +38 +ENDCHAR +STARTCHAR u30BD +ENCODING 12477 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +48 +48 +10 +10 +20 +ENDCHAR +STARTCHAR u30BE +ENCODING 12478 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +88 +48 +48 +10 +10 +20 +ENDCHAR +STARTCHAR u30BF +ENCODING 12479 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +78 +48 +A8 +18 +10 +60 +ENDCHAR +STARTCHAR u30C0 +ENCODING 12480 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +40 +78 +48 +A8 +18 +10 +60 +ENDCHAR +STARTCHAR u30C1 +ENCODING 12481 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +60 +20 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C2 +ENCODING 12482 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +10 +60 +20 +F8 +20 +20 +40 +ENDCHAR +STARTCHAR u30C3 +ENCODING 12483 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR u30C4 +ENCODING 12484 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +08 +10 +60 +ENDCHAR +STARTCHAR u30C5 +ENCODING 12485 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +A8 +A8 +A8 +08 +10 +60 +ENDCHAR +STARTCHAR u30C6 +ENCODING 12486 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +F8 +20 +20 +20 +40 +ENDCHAR +STARTCHAR u30C7 +ENCODING 12487 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +70 +00 +F8 +20 +20 +20 +40 +ENDCHAR +STARTCHAR u30C8 +ENCODING 12488 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +80 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR u30C9 +ENCODING 12489 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +50 +10 +80 +80 +C0 +A0 +90 +80 +80 +ENDCHAR +STARTCHAR u30CA +ENCODING 12490 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +40 +80 +ENDCHAR +STARTCHAR u30CB +ENCODING 12491 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +00 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR u30CC +ENCODING 12492 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +08 +28 +10 +28 +C0 +ENDCHAR +STARTCHAR u30CD +ENCODING 12493 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +10 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR u30CE +ENCODING 12494 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR u30CF +ENCODING 12495 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +50 +50 +48 +88 +88 +ENDCHAR +STARTCHAR u30D0 +ENCODING 12496 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +10 +50 +50 +48 +88 +88 +ENDCHAR +STARTCHAR u30D1 +ENCODING 12497 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +18 +00 +10 +50 +50 +48 +88 +88 +ENDCHAR +STARTCHAR u30D2 +ENCODING 12498 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +80 +90 +E0 +80 +80 +70 +ENDCHAR +STARTCHAR u30D3 +ENCODING 12499 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +80 +90 +E0 +80 +80 +70 +ENDCHAR +STARTCHAR u30D4 +ENCODING 12500 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +18 +00 +80 +90 +E0 +80 +80 +70 +ENDCHAR +STARTCHAR u30D5 +ENCODING 12501 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D6 +ENCODING 12502 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +F8 +08 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D7 +ENCODING 12503 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +18 +00 +F8 +08 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30D8 +ENCODING 12504 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +60 +A0 +10 +10 +08 +ENDCHAR +STARTCHAR u30D9 +ENCODING 12505 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +28 +28 +00 +60 +A0 +10 +10 +08 +ENDCHAR +STARTCHAR u30DA +ENCODING 12506 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +18 +18 +00 +60 +A0 +10 +10 +08 +ENDCHAR +STARTCHAR u30DB +ENCODING 12507 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +F8 +20 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DC +ENCODING 12508 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +20 +F8 +20 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DD +ENCODING 12509 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +18 +20 +F8 +20 +A8 +A8 +A8 +20 +ENDCHAR +STARTCHAR u30DE +ENCODING 12510 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +50 +20 +10 +ENDCHAR +STARTCHAR u30DF +ENCODING 12511 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +00 +E0 +00 +C0 +30 +ENDCHAR +STARTCHAR u30E0 +ENCODING 12512 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +20 +40 +48 +F8 +08 +ENDCHAR +STARTCHAR u30E1 +ENCODING 12513 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +48 +30 +10 +28 +C0 +ENDCHAR +STARTCHAR u30E2 +ENCODING 12514 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +40 +F8 +40 +40 +38 +ENDCHAR +STARTCHAR u30E3 +ENCODING 12515 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +F8 +48 +50 +40 +ENDCHAR +STARTCHAR u30E4 +ENCODING 12516 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +F8 +48 +50 +40 +40 +ENDCHAR +STARTCHAR u30E5 +ENCODING 12517 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +60 +20 +20 +20 +F0 +ENDCHAR +STARTCHAR u30E6 +ENCODING 12518 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +10 +10 +10 +10 +F8 +ENDCHAR +STARTCHAR u30E7 +ENCODING 12519 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR u30E8 +ENCODING 12520 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +F8 +08 +08 +F8 +ENDCHAR +STARTCHAR u30E9 +ENCODING 12521 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +F8 +08 +08 +10 +60 +ENDCHAR +STARTCHAR u30EA +ENCODING 12522 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +90 +90 +90 +90 +10 +60 +ENDCHAR +STARTCHAR u30EB +ENCODING 12523 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +A0 +A0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR u30EC +ENCODING 12524 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +88 +B0 +C0 +ENDCHAR +STARTCHAR u30ED +ENCODING 12525 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR u30EE +ENCODING 12526 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +90 +10 +10 +60 +ENDCHAR +STARTCHAR u30EF +ENCODING 12527 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30F0 +ENCODING 12528 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +50 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR u30F1 +ENCODING 12529 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +10 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR u30F2 +ENCODING 12530 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +F8 +08 +10 +60 +ENDCHAR +STARTCHAR u30F3 +ENCODING 12531 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR u30F4 +ENCODING 12532 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +20 +F8 +88 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30F5 +ENCODING 12533 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +40 +F0 +50 +50 +B0 +ENDCHAR +STARTCHAR u30F6 +ENCODING 12534 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +80 +F0 +A0 +20 +40 +ENDCHAR +STARTCHAR u30F7 +ENCODING 12535 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +F8 +88 +88 +08 +10 +60 +ENDCHAR +STARTCHAR u30F8 +ENCODING 12536 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +08 +10 +F8 +50 +50 +F8 +10 +10 +ENDCHAR +STARTCHAR u30F9 +ENCODING 12537 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +70 +10 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR u30FA +ENCODING 12538 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +28 +00 +F8 +08 +F8 +08 +10 +60 +ENDCHAR +STARTCHAR u30FB +ENCODING 12539 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR u30FC +ENCODING 12540 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +80 +78 +ENDCHAR +STARTCHAR u30FD +ENCODING 12541 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FE +ENCODING 12542 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 7 0 2 +BITMAP +28 +28 +00 +80 +60 +10 +08 +ENDCHAR +STARTCHAR u30FF +ENCODING 12543 +SWIDTH 545 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR U_3105 +ENCODING 12549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +20 +20 +4F +F1 +01 +02 +02 +24 +1C +18 +ENDCHAR +STARTCHAR U_3106 +ENCODING 12550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0800 +1380 +3D00 +0200 +1400 +0E00 +1100 +20C0 +C040 +ENDCHAR +STARTCHAR U_3107 +ENCODING 12551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0300 +FF80 +4100 +4100 +4100 +4100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3108 +ENCODING 12552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 2 1 +BITMAP +FF +80 +80 +80 +80 +80 +7F +ENDCHAR +STARTCHAR U_3109 +ENCODING 12553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2000 +2000 +4000 +7F80 +9080 +1080 +2080 +2100 +4100 +8A00 +0400 +ENDCHAR +STARTCHAR U_310A +ENCODING 12554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0400 +0400 +0400 +FFC0 +0800 +1000 +1200 +2100 +7E80 +2080 +ENDCHAR +STARTCHAR U_310B +ENCODING 12555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +FC +08 +08 +1E +02 +04 +04 +28 +10 +ENDCHAR +STARTCHAR U_310C +ENCODING 12556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +08 +48 +48 +7F +11 +11 +21 +22 +4A +84 +ENDCHAR +STARTCHAR U_310D +ENCODING 12557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +11 +22 +22 +44 +88 +88 +44 +22 +11 +ENDCHAR +STARTCHAR U_310E +ENCODING 12558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +FFC0 +0800 +1000 +1F80 +0100 +0100 +0100 +0A00 +0600 +ENDCHAR +STARTCHAR U_310F +ENCODING 12559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +01C0 +1E00 +1000 +1000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_3110 +ENCODING 12560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 3 -1 +BITMAP +0C +04 +C4 +44 +44 +4C +74 +C4 +04 +04 +04 +ENDCHAR +STARTCHAR U_3111 +ENCODING 12561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +06 +0C +10 +60 +C0 +60 +10 +0C +06 +02 +ENDCHAR +STARTCHAR U_3112 +ENCODING 12562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3113 +ENCODING 12563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0800 +0800 +4900 +4900 +4900 +7F00 +0800 +0800 +FFC0 +ENDCHAR +STARTCHAR U_3114 +ENCODING 12564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +02 +04 +0A +32 +04 +0C +34 +C4 +04 +04 +ENDCHAR +STARTCHAR U_3115 +ENCODING 12565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0100 +7F80 +0100 +0300 +3C00 +2000 +4000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_3116 +ENCODING 12566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +FE +82 +82 +B2 +8A +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_3117 +ENCODING 12567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +03 +FD +11 +11 +11 +11 +12 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_3118 +ENCODING 12568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0800 +FFC0 +0800 +0800 +1700 +0900 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_3119 +ENCODING 12569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0400 +0400 +0800 +1000 +1000 +2000 +4100 +FF80 +0080 +ENDCHAR +STARTCHAR U_311A +ENCODING 12570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +82 +44 +28 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_311B +ENCODING 12571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +1F +E8 +08 +08 +78 +80 +81 +7E +ENDCHAR +STARTCHAR U_311C +ENCODING 12572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0400 +0400 +07C0 +FC00 +0400 +3C00 +4000 +4000 +2080 +1F00 +ENDCHAR +STARTCHAR U_311D +ENCODING 12573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 1 0 +BITMAP +2000 +1100 +1100 +13E0 +FE00 +1200 +1200 +1000 +0F00 +ENDCHAR +STARTCHAR U_311E +ENCODING 12574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +FF +48 +48 +FF +11 +22 +42 +44 +84 +ENDCHAR +STARTCHAR U_311F +ENCODING 12575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 2 0 +BITMAP +1800 +E800 +0800 +0800 +0400 +0400 +0200 +0180 +ENDCHAR +STARTCHAR U_3120 +ENCODING 12576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +08 +10 +11 +22 +44 +F8 +14 +22 +FD +01 +ENDCHAR +STARTCHAR U_3121 +ENCODING 12577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0200 +7F00 +0200 +2400 +1C00 +0C00 +1200 +6100 +8080 +ENDCHAR +STARTCHAR U_3122 +ENCODING 12578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +7E +42 +44 +BF +C1 +02 +02 +04 +ENDCHAR +STARTCHAR U_3123 +ENCODING 12579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +2000 +2000 +4000 +4000 +7F80 +8080 +0100 +0100 +0200 +ENDCHAR +STARTCHAR U_3124 +ENCODING 12580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0400 +0400 +0800 +7F80 +0C00 +1400 +1400 +2400 +4400 +83C0 +ENDCHAR +STARTCHAR U_3125 +ENCODING 12581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 1 1 +BITMAP +0400 +0400 +0800 +0800 +1000 +2000 +4000 +FFC0 +ENDCHAR +STARTCHAR U_3126 +ENCODING 12582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0400 +2600 +2400 +2400 +2400 +2400 +2400 +2400 +4400 +83C0 +ENDCHAR +STARTCHAR U_3127 +ENCODING 12583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_3128 +ENCODING 12584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +02 +03 +42 +24 +14 +08 +14 +22 +41 +81 +ENDCHAR +STARTCHAR U_3129 +ENCODING 12585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +C3 +41 +41 +41 +41 +81 +81 +FF +41 +ENDCHAR +STARTCHAR U_312A +ENCODING 12586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0800 +0800 +0F80 +0880 +1080 +1080 +1080 +2080 +4700 +ENDCHAR +STARTCHAR U_312B +ENCODING 12587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +1200 +1200 +1200 +1200 +1200 +1200 +2200 +4200 +81E0 +ENDCHAR +STARTCHAR U_312C +ENCODING 12588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2000 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_312D +ENCODING 12589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4440 +4440 +4440 +0400 +0400 +ENDCHAR +STARTCHAR U_3131 +ENCODING 12593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 0 0 +BITMAP +FF80 +0080 +0080 +0080 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_3132 +ENCODING 12594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 0 0 +BITMAP +F780 +1080 +1080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U_3133 +ENCODING 12595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 0 +BITMAP +F100 +1100 +1100 +1280 +1280 +1440 +1820 +ENDCHAR +STARTCHAR U_3134 +ENCODING 12596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 6 0 1 +BITMAP +80 +80 +80 +80 +80 +FF +ENDCHAR +STARTCHAR U_3135 +ENCODING 12597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +8100 +8100 +8100 +8100 +8380 +8280 +86C0 +8440 +9440 +E820 +ENDCHAR +STARTCHAR U_3137 +ENCODING 12599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 5 0 2 +BITMAP +FE +80 +80 +80 +FE +ENDCHAR +STARTCHAR U_3139 +ENCODING 12601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 1 +BITMAP +FE +02 +02 +FE +80 +80 +FE +ENDCHAR +STARTCHAR U_313A +ENCODING 12602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 -1 +BITMAP +FBE0 +0820 +0820 +7820 +4020 +4020 +4020 +7E20 +0020 +ENDCHAR +STARTCHAR U_313B +ENCODING 12603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 1 +BITMAP +F1C0 +0A20 +0A20 +7220 +8220 +8220 +79C0 +ENDCHAR +STARTCHAR U_313C +ENCODING 12604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +0A20 +0A20 +0A20 +FBE0 +8220 +8220 +8220 +8220 +9A20 +E3E0 +ENDCHAR +STARTCHAR U_313D +ENCODING 12605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +0880 +0880 +0880 +0880 +F880 +8140 +8140 +8140 +9A20 +E420 +ENDCHAR +STARTCHAR U_3141 +ENCODING 12609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 1 +BITMAP +FE +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR U_3142 +ENCODING 12610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 1 +BITMAP +82 +82 +82 +FE +82 +82 +FE +ENDCHAR +STARTCHAR U_3143 +ENCODING 12611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 -1 +BITMAP +8A20 +8A20 +8A20 +FBE0 +8A20 +8A20 +8A20 +71C0 +ENDCHAR +STARTCHAR U_3144 +ENCODING 12612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +8880 +8880 +F880 +8880 +8940 +7220 +ENDCHAR +STARTCHAR U_3145 +ENCODING 12613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +0400 +0400 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_3147 +ENCODING 12615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 1 +BITMAP +3F80 +4040 +8020 +8020 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_3148 +ENCODING 12616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 1 +BITMAP +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_314C +ENCODING 12620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 8 0 1 +BITMAP +FFC0 +8000 +8000 +FFC0 +8000 +8000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_3151 +ENCODING 12625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 9 0 0 +BITMAP +80 +80 +E0 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_3152 +ENCODING 12626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 9 0 0 +BITMAP +90 +90 +F0 +90 +F0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR U_3154 +ENCODING 12628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 0 0 +BITMAP +22 +22 +22 +E2 +22 +22 +22 +22 +22 +ENDCHAR +STARTCHAR U_3155 +ENCODING 12629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 9 0 0 +BITMAP +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_3158 +ENCODING 12632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 9 0 0 +BITMAP +02 +02 +03 +02 +02 +22 +22 +FE +02 +ENDCHAR +STARTCHAR U_315B +ENCODING 12635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 3 0 0 +BITMAP +1400 +1400 +FF80 +ENDCHAR +STARTCHAR U_3162 +ENCODING 12642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 0 0 +BITMAP +0080 +0080 +0080 +0080 +0080 +0080 +0080 +FF80 +0080 +ENDCHAR +STARTCHAR U_3179 +ENCODING 12665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +9480 +F780 +9480 +6300 +0800 +7F00 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR U_317A +ENCODING 12666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 1 +BITMAP +13E0 +1020 +1020 +1020 +2820 +4420 +8220 +ENDCHAR +STARTCHAR U_317D +ENCODING 12669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 7 1 1 +BITMAP +2440 +2440 +27C0 +2440 +2440 +5440 +8B80 +ENDCHAR +STARTCHAR U_317F +ENCODING 12671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 0 0 +BITMAP +0800 +1400 +2200 +2200 +4100 +8080 +FF80 +ENDCHAR +STARTCHAR U_3180 +ENCODING 12672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 0 +BITMAP +2080 +2080 +71C0 +8A20 +8A20 +8A20 +8A20 +71C0 +ENDCHAR +STARTCHAR U_3181 +ENCODING 12673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 8 1 1 +BITMAP +0800 +0800 +1C00 +6300 +8080 +8080 +6300 +1C00 +ENDCHAR +STARTCHAR U_318C +ENCODING 12684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 0 0 +BITMAP +0080 +0080 +0080 +0280 +FC80 +4880 +4880 +4880 +8880 +ENDCHAR +STARTCHAR U_318D +ENCODING 12685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 2 0 2 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR U_318E +ENCODING 12686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 9 0 0 +BITMAP +04 +04 +04 +C4 +C4 +04 +04 +04 +04 +ENDCHAR +STARTCHAR U_3192 +ENCODING 12690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 1 0 7 +BITMAP +FF80 +ENDCHAR +STARTCHAR U_3193 +ENCODING 12691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 4 0 5 +BITMAP +7E +00 +00 +FF +ENDCHAR +STARTCHAR U_3194 +ENCODING 12692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 5 0 4 +BITMAP +7E +00 +3C +00 +FF +ENDCHAR +STARTCHAR U_3195 +ENCODING 12693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 5 0 4 +BITMAP +FE +AA +CE +82 +FE +ENDCHAR +STARTCHAR U_3196 +ENCODING 12694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +10 +10 +1C +10 +10 +FE +ENDCHAR +STARTCHAR U_3197 +ENCODING 12695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 7 0 3 +BITMAP +20 +20 +FC +A4 +FC +20 +20 +ENDCHAR +STARTCHAR U_3198 +ENCODING 12696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +FE +10 +18 +14 +10 +10 +ENDCHAR +STARTCHAR U_3199 +ENCODING 12697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 3 +BITMAP +FE +92 +FE +92 +FE +10 +10 +ENDCHAR +STARTCHAR U_319A +ENCODING 12698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +FC +18 +20 +40 +82 +7E +ENDCHAR +STARTCHAR U_319B +ENCODING 12699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +7C +10 +FE +92 +AA +86 +ENDCHAR +STARTCHAR U_319C +ENCODING 12700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +FE +10 +10 +10 +10 +30 +ENDCHAR +STARTCHAR U_319D +ENCODING 12701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 6 0 4 +BITMAP +7C +10 +FE +10 +28 +C6 +ENDCHAR +STARTCHAR U_319E +ENCODING 12702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 0 3 +BITMAP +44 +54 +FF +55 +56 +71 +9F +ENDCHAR +STARTCHAR U_319F +ENCODING 12703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 6 0 4 +BITMAP +10 +10 +10 +28 +44 +83 +ENDCHAR +STARTCHAR U_31C0 +ENCODING 12736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 3 1 3 +BITMAP +03 +1C +E0 +ENDCHAR +STARTCHAR U_31C1 +ENCODING 12737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR U_31C2 +ENCODING 12738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +05 +02 +ENDCHAR +STARTCHAR U_31C3 +ENCODING 12739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 0 2 +BITMAP +8000 +4000 +2040 +1840 +07C0 +ENDCHAR +STARTCHAR U_31C4 +ENCODING 12740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR U_31C5 +ENCODING 12741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +1E +ENDCHAR +STARTCHAR U_31C6 +ENCODING 12742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +05 +02 +ENDCHAR +STARTCHAR U_31C7 +ENCODING 12743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +02 +02 +02 +04 +04 +08 +08 +10 +20 +ENDCHAR +STARTCHAR U_31C8 +ENCODING 12744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 0 -1 +BITMAP +F800 +0800 +0800 +0800 +0800 +0800 +0800 +0880 +0880 +0780 +ENDCHAR +STARTCHAR U_31C9 +ENCODING 12745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8000 +8000 +8000 +8000 +8000 +FF80 +0080 +0080 +0100 +0500 +0200 +ENDCHAR +STARTCHAR U_31CA +ENCODING 12746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 8 1 0 +BITMAP +F0 +10 +10 +10 +10 +14 +18 +10 +ENDCHAR +STARTCHAR U_31CB +ENCODING 12747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +FE +04 +08 +0F +01 +01 +02 +02 +04 +18 +ENDCHAR +STARTCHAR U_31CC +ENCODING 12748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 10 3 -1 +BITMAP +F8 +08 +10 +20 +10 +08 +08 +08 +08 +30 +ENDCHAR +STARTCHAR U_31CD +ENCODING 12749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 6 1 2 +BITMAP +F800 +0800 +0800 +0800 +0800 +0780 +ENDCHAR +STARTCHAR U_31CE +ENCODING 12750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 1 -1 +BITMAP +F8 +08 +08 +08 +0F +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR U_31CF +ENCODING 12751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +07 +02 +ENDCHAR +STARTCHAR U_31D0 +ENCODING 12752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 1 1 5 +BITMAP +FF80 +ENDCHAR +STARTCHAR U_31D1 +ENCODING 12753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_31D2 +ENCODING 12754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 7 1 2 +BITMAP +01 +01 +02 +04 +08 +10 +E0 +ENDCHAR +STARTCHAR U_31D3 +ENCODING 12755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 2 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_31D4 +ENCODING 12756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 5 3 3 +BITMAP +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR U_31D5 +ENCODING 12757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 2 1 +BITMAP +FE +02 +02 +02 +02 +02 +02 +ENDCHAR +STARTCHAR U_31D6 +ENCODING 12758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 4 +BITMAP +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR U_31D7 +ENCODING 12759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 8 2 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR U_31D8 +ENCODING 12760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 8 1 1 +BITMAP +01 +01 +01 +01 +01 +01 +01 +FF +ENDCHAR +STARTCHAR U_31D9 +ENCODING 12761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 10 4 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR U_31DA +ENCODING 12762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR U_31DB +ENCODING 12763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 9 3 0 +BITMAP +10 +10 +20 +40 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR U_31DC +ENCODING 12764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 1 2 +BITMAP +0800 +0800 +1000 +1000 +2000 +4000 +FF80 +ENDCHAR +STARTCHAR U_31DD +ENCODING 12765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +2000 +2000 +5000 +9000 +0800 +0400 +0200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_31DE +ENCODING 12766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +80 +80 +80 +80 +FE +02 +02 +02 +02 +ENDCHAR +STARTCHAR U_31DF +ENCODING 12767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 3 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +84 +84 +7C +ENDCHAR +STARTCHAR U_31E0 +ENCODING 12768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FF80 +0100 +0200 +0400 +0800 +1000 +2000 +4020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_31E1 +ENCODING 12769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +0100 +0200 +07C0 +0040 +0040 +0040 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_31E2 +ENCODING 12770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0080 +0080 +0100 +0100 +0200 +0400 +8800 +5000 +2000 +ENDCHAR +STARTCHAR U_31E3 +ENCODING 12771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 7 1 1 +BITMAP +7F00 +8080 +8080 +8080 +8080 +8080 +7F00 +ENDCHAR +STARTCHAR U_3200 +ENCODING 12800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +8020 +BFA0 +80A0 +80A0 +80A0 +80A0 +8020 +4040 +2080 +ENDCHAR +STARTCHAR U_3202 +ENCODING 12802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +4100 +8080 +BE80 +A080 +A080 +BE80 +8080 +8080 +4100 +ENDCHAR +STARTCHAR U_3214 +ENCODING 12820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4940 +8920 +8920 +99A0 +9520 +A520 +A520 +C320 +8140 +4080 +ENDCHAR +STARTCHAR U_3216 +ENCODING 12822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +4120 +BD20 +91A0 +9120 +A920 +A920 +C520 +8120 +4140 +2080 +ENDCHAR +STARTCHAR U_321A +ENCODING 12826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +40C0 +BEA0 +94A0 +94E0 +94A0 +94A0 +94A0 +BEC0 +4040 +4040 +ENDCHAR +STARTCHAR U_321B +ENCODING 12827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +9920 +8120 +BD20 +81A0 +9920 +A520 +9920 +4040 +2080 +ENDCHAR +STARTCHAR U_3220 +ENCODING 12832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +8020 +8020 +8020 +BFA0 +8020 +8020 +8020 +4040 +2080 +ENDCHAR +STARTCHAR U_3221 +ENCODING 12833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +8020 +9F20 +8020 +8020 +8020 +BFA0 +8020 +4040 +2080 +ENDCHAR +STARTCHAR U_3222 +ENCODING 12834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +BFA0 +8020 +8020 +9F20 +8020 +8020 +BFA0 +4040 +2080 +ENDCHAR +STARTCHAR U_3223 +ENCODING 12835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +BFA0 +AAA0 +AAA0 +AAA0 +B3A0 +A0A0 +BFA0 +4040 +2080 +ENDCHAR +STARTCHAR U_3224 +ENCODING 12836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4040 +9F20 +8420 +8420 +9F20 +8520 +8920 +BFA0 +4040 +2080 +ENDCHAR +STARTCHAR U_3225 +ENCODING 12837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4440 +8420 +BFA0 +8020 +8A20 +8A20 +9120 +A0A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3226 +ENCODING 12838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4840 +8820 +89A0 +BE20 +8820 +8820 +88A0 +87A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3227 +ENCODING 12839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +8220 +8220 +9220 +9220 +9120 +9120 +A0A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3228 +ENCODING 12840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4840 +8820 +BE20 +8A20 +8A20 +8A20 +92A0 +A3A0 +4040 +2080 +ENDCHAR +STARTCHAR U_3229 +ENCODING 12841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4440 +8420 +8420 +8420 +BFA0 +8420 +8420 +8420 +4440 +2080 +ENDCHAR +STARTCHAR U_322D +ENCODING 12845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +8420 +BFA0 +8E20 +9520 +A4A0 +C460 +8420 +4440 +4040 +ENDCHAR +STARTCHAR U_322E +ENCODING 12846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4A40 +9120 +A0A0 +DF60 +8420 +BFA0 +A4A0 +9520 +7FC0 +2080 +ENDCHAR +STARTCHAR U_3243 +ENCODING 12867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +5FC0 +8420 +8920 +9FA0 +8420 +9FA0 +8420 +8420 +5FC0 +4040 +ENDCHAR +STARTCHAR U_32A3 +ENCODING 12963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +7FC0 +8420 +8420 +97A0 +9420 +9420 +7FC0 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A4 +ENCODING 12964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4440 +8420 +8720 +8420 +8420 +BFA0 +4040 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A5 +ENCODING 12965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2480 +4440 +BFA0 +A4A0 +A4A0 +BFA0 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A6 +ENCODING 12966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4040 +BFA0 +8420 +8620 +8520 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A7 +ENCODING 12967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4840 +BF20 +9020 +9F20 +A420 +C420 +5F40 +2080 +1F00 +ENDCHAR +STARTCHAR U_32A8 +ENCODING 12968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4840 +BF20 +9020 +9F20 +B120 +D120 +5F40 +2080 +1F00 +ENDCHAR +STARTCHAR U_32D0 +ENCODING 13008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +BFA0 +80A0 +84A0 +8720 +8420 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32D1 +ENCODING 13009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +81A0 +8620 +8C20 +B420 +8420 +8420 +8420 +4440 +3F80 +ENDCHAR +STARTCHAR U_32D2 +ENCODING 13010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +BFA0 +A0A0 +A0A0 +8120 +8120 +8220 +4440 +3F80 +ENDCHAR +STARTCHAR U_32D3 +ENCODING 13011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +8420 +8420 +8420 +8420 +BFA0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32D4 +ENCODING 13012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8120 +BFE0 +8320 +8D20 +9120 +A120 +8520 +4340 +3F80 +ENDCHAR +STARTCHAR U_32D5 +ENCODING 13013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8820 +BFA0 +88A0 +88A0 +90A0 +90A0 +A520 +4240 +3F80 +ENDCHAR +STARTCHAR U_32D6 +ENCODING 13014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8B20 +9C20 +8420 +87A0 +BC20 +8220 +8220 +4240 +3F80 +ENDCHAR +STARTCHAR U_32D7 +ENCODING 13015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8F20 +9120 +9120 +A220 +8220 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32D8 +ENCODING 13016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8820 +9FA0 +9220 +A220 +8420 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32D9 +ENCODING 13017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +8120 +8120 +8120 +8120 +9F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DA +ENCODING 13018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9120 +9120 +BFA0 +9120 +8120 +8220 +8C20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DB +ENCODING 13019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9820 +8020 +B820 +80A0 +8120 +8620 +9820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DC +ENCODING 13020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8120 +8220 +8420 +8A20 +9120 +A0A0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DD +ENCODING 13021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9020 +97A0 +F920 +9120 +9020 +9020 +8F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DE +ENCODING 13022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +A0A0 +90A0 +9120 +8120 +8220 +8420 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32DF +ENCODING 13023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4840 +8F20 +8920 +9920 +AA20 +8620 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32E0 +ENCODING 13024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8320 +9E20 +8420 +BFA0 +8420 +8420 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32E1 +ENCODING 13025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +A4A0 +94A0 +90A0 +8120 +8120 +8220 +8420 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E2 +ENCODING 13026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8020 +BFA0 +8220 +8220 +8420 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E3 +ENCODING 13027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8820 +8820 +8C20 +8B20 +8820 +8820 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E4 +ENCODING 13028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +8420 +BFA0 +8420 +8420 +8820 +8820 +5040 +3F80 +ENDCHAR +STARTCHAR U_32E5 +ENCODING 13029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +8020 +8020 +8020 +BFA0 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E6 +ENCODING 13030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8120 +8120 +9A20 +8620 +8920 +9020 +6040 +3F80 +ENDCHAR +STARTCHAR U_32E7 +ENCODING 13031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +9F20 +8120 +8220 +8620 +9D20 +A4A0 +4440 +3F80 +ENDCHAR +STARTCHAR U_32E8 +ENCODING 13032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8220 +8220 +8220 +8420 +8420 +8820 +9020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32E9 +ENCODING 13033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +8920 +8920 +9920 +90A0 +A0A0 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EA +ENCODING 13034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9020 +9320 +9C20 +9020 +9020 +9020 +8F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EB +ENCODING 13035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +BFA0 +80A0 +80A0 +8120 +8220 +8420 +4840 +3F80 +ENDCHAR +STARTCHAR U_32EC +ENCODING 13036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +8020 +8C20 +9220 +A120 +80E0 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32ED +ENCODING 13037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +BFA0 +8420 +9520 +9520 +A4A0 +8420 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EE +ENCODING 13038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +BFA0 +8120 +9220 +8C20 +8420 +8220 +4040 +3F80 +ENDCHAR +STARTCHAR U_32EF +ENCODING 13039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9C20 +8320 +9820 +8620 +8020 +9820 +8720 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F0 +ENCODING 13040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +8420 +8820 +8A20 +9120 +A720 +B8A0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F1 +ENCODING 13041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8220 +8220 +9420 +8C20 +8A20 +9020 +A020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F2 +ENCODING 13042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8420 +8420 +BFA0 +8420 +8420 +83A0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F3 +ENCODING 13043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9020 +93A0 +9CA0 +F120 +8A20 +8820 +8420 +4440 +3F80 +ENDCHAR +STARTCHAR U_32F4 +ENCODING 13044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9E20 +8220 +8220 +8220 +8220 +BFA0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F5 +ENCODING 13045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8120 +8120 +9F20 +8120 +8120 +9F20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F6 +ENCODING 13046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9F20 +8020 +BFA0 +80A0 +80A0 +8120 +8620 +4840 +3F80 +ENDCHAR +STARTCHAR U_32F7 +ENCODING 13047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +9120 +9120 +9120 +8120 +8220 +8420 +8820 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F8 +ENCODING 13048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8420 +8420 +9420 +94A0 +9520 +A620 +8420 +4040 +3F80 +ENDCHAR +STARTCHAR U_32F9 +ENCODING 13049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8820 +8820 +8820 +88A0 +8920 +8A20 +8C20 +4040 +3F80 +ENDCHAR +STARTCHAR U_32FA +ENCODING 13050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9F20 +9120 +9120 +9120 +9F20 +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_32FB +ENCODING 13051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +BFA0 +A0A0 +A120 +8120 +8220 +8420 +4840 +3F80 +ENDCHAR +STARTCHAR U_32FC +ENCODING 13052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8220 +8220 +9F20 +9220 +9220 +BFA0 +8220 +4240 +3F80 +ENDCHAR +STARTCHAR U_32FD +ENCODING 13053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +8020 +9FA0 +80A0 +8720 +8420 +8420 +BFA0 +4040 +3F80 +ENDCHAR +STARTCHAR U_32FE +ENCODING 13054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +4040 +BFA0 +80A0 +9FA0 +8120 +8220 +8420 +9820 +4040 +3F80 +ENDCHAR +STARTCHAR U_3300 +ENCODING 13056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +2A80 +3440 +2440 +4820 +8000 +0100 +0180 +F940 +0120 +0100 +ENDCHAR +STARTCHAR U_3322 +ENCODING 13090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F920 +4820 +4040 +3B80 +0000 +7800 +1000 +FC00 +1000 +6000 +ENDCHAR +STARTCHAR U_337B +ENCODING 13179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +2080 +AFE0 +7480 +2780 +FD80 +25A0 +2560 +2A40 +28C0 +3320 +ENDCHAR +STARTCHAR U_337C +ENCODING 13180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2E00 +EAE0 +AAA0 +A7A0 +FAA0 +ABA0 +AEA0 +EAE0 +3AA0 +2A00 +ENDCHAR +STARTCHAR U_337D +ENCODING 13181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +FA80 +2280 +22E0 +2280 +2280 +5280 +5280 +8FE0 +ENDCHAR +STARTCHAR U_337E +ENCODING 13182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3A40 +E940 +AC40 +BAA0 +E9E0 +B800 +A9E0 +EAA0 +AAA0 +4AE0 +ENDCHAR +STARTCHAR U_337F +ENCODING 13183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +FFE0 +6940 +D940 +6DC0 +4B20 +2240 +5740 +AAE0 +5740 +7AE0 +ENDCHAR +STARTCHAR U_338E +ENCODING 13198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 8 0 -1 +BITMAP +28D0 +D520 +5520 +5520 +54C0 +5520 +5520 +00C0 +ENDCHAR +STARTCHAR U_338F +ENCODING 13199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +C000 +4000 +4000 +59A0 +5240 +6240 +6240 +5180 +5240 +DA40 +03C0 +ENDCHAR +STARTCHAR U_339C +ENCODING 13212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 8 0 0 +BITMAP +AAA0 +5550 +5550 +5550 +5550 +5550 +5550 +5550 +ENDCHAR +STARTCHAR U_339D +ENCODING 13213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 1 0 +BITMAP +3540 +4AA0 +8AA0 +82A0 +82A0 +82A0 +4AA0 +32A0 +ENDCHAR +STARTCHAR U_339E +ENCODING 13214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +C000 +4000 +4540 +5AA0 +52A0 +62A0 +62A0 +52A0 +52A0 +DAA0 +ENDCHAR +STARTCHAR U_33A1 +ENCODING 13217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +0020 +0040 +B6E0 +4900 +4900 +4900 +4900 +4900 +4900 +ENDCHAR +STARTCHAR U_33C4 +ENCODING 13252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 1 0 +BITMAP +30C0 +4920 +8200 +8200 +8200 +4920 +30C0 +ENDCHAR +STARTCHAR U_33CE +ENCODING 13262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 10 0 0 +BITMAP +8C10 +9630 +9550 +A550 +C550 +A490 +A490 +9490 +9490 +8C90 +ENDCHAR +STARTCHAR U_33D1 +ENCODING 13265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +C000 +4000 +4000 +4B00 +4480 +4480 +4480 +4480 +4480 +ECC0 +ENDCHAR +STARTCHAR U_33D2 +ENCODING 13266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 12 11 0 -1 +BITMAP +C000 +4000 +4000 +48D0 +5520 +5520 +5520 +54C0 +5520 +E920 +00C0 +ENDCHAR +STARTCHAR U_33D5 +ENCODING 13269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0060 +0120 +0020 +A920 +5520 +5520 +5520 +5520 +5520 +5520 +ENDCHAR +STARTCHAR U_33E0 +ENCODING 13280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +47C0 +C440 +4440 +4440 +47C0 +4440 +4440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_33E1 +ENCODING 13281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +0A20 +0BE0 +3220 +4220 +8220 +83E0 +FA20 +ENDCHAR +STARTCHAR U_33E2 +ENCODING 13282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +0A20 +33E0 +0A20 +0A20 +8A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E3 +ENCODING 13283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +13E0 +1220 +3220 +3220 +53E0 +5220 +9220 +FA20 +13E0 +1220 +ENDCHAR +STARTCHAR U_33E4 +ENCODING 13284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBE0 +8220 +8220 +8220 +F3E0 +8A20 +0A20 +0A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E5 +ENCODING 13285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +8220 +F3E0 +8A20 +8A20 +8A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E6 +ENCODING 13286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBE0 +8A20 +0A20 +1220 +13E0 +1220 +2220 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_33E7 +ENCODING 13287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +8A20 +73E0 +8A20 +8A20 +8A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E8 +ENCODING 13288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +8A20 +8A20 +8A20 +8BE0 +7A20 +0A20 +0A20 +8BE0 +7220 +ENDCHAR +STARTCHAR U_33E9 +ENCODING 13289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4CE0 +D2A0 +52A0 +52A0 +52E0 +52A0 +52A0 +52A0 +52E0 +4CA0 +ENDCHAR +STARTCHAR U_33EA +ENCODING 13290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D920 +4920 +4920 +49E0 +4920 +4920 +4920 +49E0 +4920 +ENDCHAR +STARTCHAR U_33EB +ENCODING 13291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +4520 +45E0 +4920 +4920 +5120 +51E0 +5D20 +ENDCHAR +STARTCHAR U_33EC +ENCODING 13292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +4520 +49E0 +4520 +4520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33ED +ENCODING 13293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +C4A0 +4CA0 +4CA0 +54E0 +54A0 +54A0 +5EA0 +44E0 +44A0 +ENDCHAR +STARTCHAR U_33EE +ENCODING 13294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +5DE0 +D120 +5120 +5920 +55E0 +4520 +4520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33EF +ENCODING 13295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +5120 +59E0 +5520 +5520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33F0 +ENCODING 13296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +5EE0 +D2A0 +42A0 +44A0 +44E0 +44A0 +44A0 +48A0 +48E0 +48A0 +ENDCHAR +STARTCHAR U_33F1 +ENCODING 13297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +5520 +49E0 +5520 +5520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33F2 +ENCODING 13298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +49E0 +D520 +5520 +5520 +55E0 +4D20 +4520 +5520 +55E0 +4920 +ENDCHAR +STARTCHAR U_33F3 +ENCODING 13299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +2AE0 +4AA0 +4AA0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33F4 +ENCODING 13300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +45E0 +AD20 +A520 +2520 +45E0 +4520 +4520 +8520 +85E0 +E520 +ENDCHAR +STARTCHAR U_33F5 +ENCODING 13301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +22A0 +22E0 +44A0 +44A0 +88A0 +88E0 +EEA0 +ENDCHAR +STARTCHAR U_33F6 +ENCODING 13302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +22A0 +24E0 +42A0 +42A0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33F7 +ENCODING 13303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +42E0 +A2A0 +A6A0 +26A0 +2AE0 +4AA0 +4AA0 +8EA0 +82E0 +E2A0 +ENDCHAR +STARTCHAR U_33F8 +ENCODING 13304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4EE0 +A8A0 +A8A0 +2CA0 +2AE0 +42A0 +42A0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33F9 +ENCODING 13305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +28A0 +2CE0 +4AA0 +4AA0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33FA +ENCODING 13306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4EE0 +AAA0 +A2A0 +22A0 +24E0 +44A0 +44A0 +84A0 +84E0 +E4A0 +ENDCHAR +STARTCHAR U_33FB +ENCODING 13307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +24E0 +4AA0 +4AA0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33FC +ENCODING 13308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +2AE0 +46A0 +42A0 +8AA0 +8AE0 +E4A0 +ENDCHAR +STARTCHAR U_33FD +ENCODING 13309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +44E0 +AAA0 +AAA0 +2AA0 +4AE0 +2AA0 +2AA0 +AAA0 +AAE0 +44A0 +ENDCHAR +STARTCHAR U_33FE +ENCODING 13310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +62E0 +96A0 +92A0 +12A0 +22E0 +12A0 +12A0 +92A0 +92E0 +62A0 +ENDCHAR +STARTCHAR U_3400 +ENCODING 13312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +1100 +1100 +1100 +1100 +F1E0 +1100 +1100 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_3401 +ENCODING 13313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4A40 +5140 +6140 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_3402 +ENCODING 13314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +7C00 +0420 +23E0 +2100 +FBE0 +2100 +2920 +3120 +20E0 +ENDCHAR +STARTCHAR U_3403 +ENCODING 13315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +4040 +FFE0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3404 +ENCODING 13316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +4400 +4400 +FFE0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_3405 +ENCODING 13317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +0100 +4100 +2200 +1200 +0C00 +0400 +0A00 +1100 +2080 +C080 +ENDCHAR +STARTCHAR U_3406 +ENCODING 13318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 0 -1 +BITMAP +3F00 +2000 +3F00 +2100 +3F00 +2100 +3F00 +2000 +3F80 +4080 +8300 +ENDCHAR +STARTCHAR U_3407 +ENCODING 13319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7F00 +1120 +2120 +C0E0 +7F00 +0200 +3C40 +4040 +3FC0 +ENDCHAR +STARTCHAR U_3408 +ENCODING 13320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0A00 +3180 +C060 +7F80 +0100 +0E00 +3040 +4040 +3FC0 +ENDCHAR +STARTCHAR U_3409 +ENCODING 13321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0200 +0200 +0A00 +0400 +7FC0 +0300 +1C20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340A +ENCODING 13322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +3F80 +0000 +7FC0 +0180 +1E20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340B +ENCODING 13323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3FC0 +0400 +FFE0 +0000 +7FC0 +0180 +1E20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340C +ENCODING 13324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FC0 +4400 +8400 +27C0 +3C40 +E440 +2580 +2420 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340D +ENCODING 13325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +1C00 +E880 +4480 +2500 +FF80 +0100 +0E00 +7040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_340E +ENCODING 13326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +C060 +3F80 +0300 +1C20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_340F +ENCODING 13327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +FFE0 +0000 +7FC0 +0100 +1E20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3410 +ENCODING 13328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +4A40 +3180 +CA60 +0000 +7F80 +0600 +1800 +2040 +1FC0 +ENDCHAR +STARTCHAR U_3411 +ENCODING 13329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +5100 +0E00 +F5E0 +0A00 +0400 +7FC0 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3412 +ENCODING 13330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1040 +2080 +FFC0 +2040 +3FC0 +0000 +7FC0 +0C00 +3020 +1FE0 +ENDCHAR +STARTCHAR U_3413 +ENCODING 13331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0080 +3C80 +2480 +3C80 +0080 +FFE0 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3414 +ENCODING 13332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +0000 +3E00 +2200 +3E00 +0000 +FE00 +0800 +1080 +1F80 +ENDCHAR +STARTCHAR U_3415 +ENCODING 13333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +FF80 +0600 +0840 +1FC0 +ENDCHAR +STARTCHAR U_3416 +ENCODING 13334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FD00 +1100 +7D00 +0100 +7D00 +4500 +4520 +4520 +7CE0 +ENDCHAR +STARTCHAR U_3417 +ENCODING 13335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +1F80 +0500 +FFE0 +1900 +6A40 +8FC0 +0000 +3FA0 +0C20 +7FE0 +ENDCHAR +STARTCHAR U_3418 +ENCODING 13336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +0D00 +1480 +6440 +1F00 +0200 +0C00 +3020 +3FE0 +ENDCHAR +STARTCHAR U_3419 +ENCODING 13337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2080 +3F80 +1100 +FFE0 +0000 +3FC0 +0180 +0E00 +7020 +3FE0 +ENDCHAR +STARTCHAR U_341A +ENCODING 13338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +FFE0 +1100 +7FC0 +0200 +1C20 +6020 +3FE0 +ENDCHAR +STARTCHAR U_341B +ENCODING 13339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2FE0 +E400 +2BC0 +2240 +23C0 +7FC0 +0300 +0C00 +3040 +3FC0 +ENDCHAR +STARTCHAR U_341C +ENCODING 13340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2100 +FBC0 +2140 +A940 +7140 +2140 +7140 +AA40 +2240 +6460 +ENDCHAR +STARTCHAR U_341D +ENCODING 13341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +F7E0 +2820 +F720 +2520 +6760 +3F80 +0300 +1C00 +6040 +7FC0 +ENDCHAR +STARTCHAR U_341E +ENCODING 13342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1F00 +1100 +FFE0 +2080 +5F40 +8220 +0C40 +1FC0 +ENDCHAR +STARTCHAR U_341F +ENCODING 13343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +F3C0 +1200 +7380 +1200 +F3C0 +0000 +7F80 +0C20 +3020 +1FE0 +ENDCHAR +STARTCHAR U_3420 +ENCODING 13344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +5480 +FC80 +0880 +7C80 +10A0 +10E0 +3F00 +0600 +1840 +3FC0 +ENDCHAR +STARTCHAR U_3421 +ENCODING 13345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +FFE0 +5AA0 +5AA0 +5100 +57C0 +5100 +5280 +5460 +8FE0 +ENDCHAR +STARTCHAR U_3422 +ENCODING 13346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +8FC0 +4080 +2FE0 +C100 +4200 +7F80 +0C20 +3020 +7FE0 +ENDCHAR +STARTCHAR U_3423 +ENCODING 13347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +5FC0 +5240 +7FE0 +4780 +4820 +9FE0 +ENDCHAR +STARTCHAR U_3424 +ENCODING 13348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5440 +57C0 +5440 +5FE0 +5280 +5440 +9FE0 +ENDCHAR +STARTCHAR U_3425 +ENCODING 13349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +AE80 +5BE0 +EEA0 +4AA0 +FF40 +0000 +7F80 +0C20 +1020 +3FE0 +ENDCHAR +STARTCHAR U_3426 +ENCODING 13350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +6EC0 +4A40 +FFE0 +2480 +C460 +3F80 +0600 +1820 +3FE0 +ENDCHAR +STARTCHAR U_3427 +ENCODING 13351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1A00 +0A00 +0200 +FFE0 +0640 +0A00 +1200 +2200 +CA00 +0400 +ENDCHAR +STARTCHAR U_3428 +ENCODING 13352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1040 +5140 +6180 +FBE0 +28A0 +2080 +2080 +2080 +2080 +6180 +ENDCHAR +STARTCHAR U_3429 +ENCODING 13353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +5140 +FBE0 +5140 +5140 +5140 +FBE0 +5140 +5140 +5140 +9640 +ENDCHAR +STARTCHAR U_342A +ENCODING 13354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +4440 +4440 +7FC0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_342B +ENCODING 13355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0000 +5140 +4A40 +4440 +4A40 +5140 +4040 +7FC0 +ENDCHAR +STARTCHAR U_342C +ENCODING 13356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1000 +2080 +7FC0 +0020 +2480 +2480 +2480 +44A0 +84E0 +ENDCHAR +STARTCHAR U_342D +ENCODING 13357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +7FC0 +4040 +5F40 +5140 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_342E +ENCODING 13358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +BFA0 +0A00 +3F80 +0A00 +7FC0 +3480 +D300 +19E0 +ENDCHAR +STARTCHAR U_342F +ENCODING 13359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3F80 +4040 +7FC0 +0400 +7FC0 +1500 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3430 +ENCODING 13360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2420 +2420 +6420 +A420 +2420 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_3431 +ENCODING 13361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1400 +2300 +48E0 +9200 +2480 +0900 +3200 +0400 +7800 +ENDCHAR +STARTCHAR U_3432 +ENCODING 13362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6FE0 +A100 +2100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3433 +ENCODING 13363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2280 +2280 +6280 +A280 +2480 +24A0 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_3434 +ENCODING 13364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +27E0 +2420 +6420 +AA40 +2140 +2080 +2080 +2100 +2600 +ENDCHAR +STARTCHAR U_3435 +ENCODING 13365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +17C0 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2300 +0100 +ENDCHAR +STARTCHAR U_3436 +ENCODING 13366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +6440 +A7C0 +2400 +2400 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_3437 +ENCODING 13367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1040 +2440 +6440 +A440 +27E0 +2020 +2FA0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_3438 +ENCODING 13368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +6920 +A940 +2100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3439 +ENCODING 13369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +17E0 +2400 +6BC0 +A000 +2F80 +2080 +2080 +2080 +20A0 +2060 +ENDCHAR +STARTCHAR U_343A +ENCODING 13370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4880 +D880 +4880 +4880 +4880 +4940 +4940 +4A20 +4A20 +ENDCHAR +STARTCHAR U_343B +ENCODING 13371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6FE0 +A920 +2920 +2920 +2AA0 +2C60 +2820 +2860 +ENDCHAR +STARTCHAR U_343C +ENCODING 13372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1640 +2240 +6240 +AFE0 +2240 +2240 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_343D +ENCODING 13373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +66C0 +A540 +2540 +26C0 +2440 +2440 +2840 +3020 +ENDCHAR +STARTCHAR U_343E +ENCODING 13374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1000 +2000 +6FE0 +A280 +2280 +2280 +2280 +24A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_343F +ENCODING 13375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +6100 +A7C0 +2100 +2100 +2FE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_3440 +ENCODING 13376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4200 +5FE0 +C200 +4500 +4500 +4480 +4880 +4A40 +5120 +ENDCHAR +STARTCHAR U_3441 +ENCODING 13377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1920 +2920 +6920 +AFE0 +2100 +2100 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3442 +ENCODING 13378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +6100 +AFE0 +2920 +2920 +2AA0 +2C60 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_3443 +ENCODING 13379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +29E0 +6AA0 +AEA0 +22A0 +24A0 +28A0 +2BA0 +2D20 +2260 +ENDCHAR +STARTCHAR U_3444 +ENCODING 13380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +4A40 +C940 +5FE0 +4840 +4A40 +5140 +5FE0 +4040 +40C0 +ENDCHAR +STARTCHAR U_3445 +ENCODING 13381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +6900 +B100 +2100 +21C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3446 +ENCODING 13382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +2440 +67C0 +A280 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_3447 +ENCODING 13383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2440 +6080 +AFE0 +2020 +2020 +27E0 +2020 +2020 +2FE0 +ENDCHAR +STARTCHAR U_3448 +ENCODING 13384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +6200 +A400 +2500 +2FE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_3449 +ENCODING 13385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +6FC0 +AA40 +2BC0 +2CC0 +2AC0 +2940 +2940 +2A40 +3420 +ENDCHAR +STARTCHAR U_344A +ENCODING 13386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +6280 +A280 +2AC0 +2AA0 +32A0 +2280 +2480 +2480 +2980 +ENDCHAR +STARTCHAR U_344B +ENCODING 13387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1280 +2280 +6FE0 +AAA0 +2AA0 +2FE0 +2AA0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_344C +ENCODING 13388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +6BE0 +A880 +2880 +2BE0 +2880 +2880 +2BE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_344D +ENCODING 13389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +6FC0 +A100 +3FE0 +2380 +2540 +2520 +2920 +2100 +ENDCHAR +STARTCHAR U_344E +ENCODING 13390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +1540 +2A80 +6540 +A540 +2000 +2100 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_344F +ENCODING 13391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2820 +6080 +AFE0 +2080 +2480 +2280 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_3450 +ENCODING 13392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +21C0 +6100 +A100 +2FE0 +2100 +2540 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_3451 +ENCODING 13393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1400 +2FE0 +6820 +AFE0 +2820 +2820 +2FE0 +2820 +2820 +2FE0 +ENDCHAR +STARTCHAR U_3452 +ENCODING 13394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0400 +3F80 +2480 +3F80 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_3453 +ENCODING 13395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +6440 +AFA0 +2200 +2FE0 +2200 +25C0 +2540 +2880 +3360 +ENDCHAR +STARTCHAR U_3454 +ENCODING 13396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2200 +6FE0 +A820 +2920 +2920 +2920 +2920 +2240 +2C20 +ENDCHAR +STARTCHAR U_3455 +ENCODING 13397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1100 +1540 +2540 +67C0 +A200 +27C0 +2840 +2240 +2180 +2100 +2E00 +ENDCHAR +STARTCHAR U_3456 +ENCODING 13398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +2880 +7BE0 +AAA0 +2AA0 +2AA0 +2BE0 +2880 +2880 +2880 +ENDCHAR +STARTCHAR U_3457 +ENCODING 13399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2440 +67C0 +A440 +27C0 +2440 +27E0 +2CC0 +2340 +2CC0 +ENDCHAR +STARTCHAR U_3458 +ENCODING 13400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10A0 +1080 +2FE0 +6080 +AAA0 +2AA0 +3FC0 +2A80 +2AC0 +3160 +2220 +ENDCHAR +STARTCHAR U_3459 +ENCODING 13401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2A00 +6E80 +AA80 +2E80 +2A80 +2A80 +2E80 +3A80 +22A0 +22E0 +ENDCHAR +STARTCHAR U_345A +ENCODING 13402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +CAA0 +5EA0 +4AC0 +4AA0 +5EA0 +4AA0 +4AE0 +5280 +6680 +ENDCHAR +STARTCHAR U_345B +ENCODING 13403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +6FE0 +A920 +2920 +2FE0 +2380 +2540 +2540 +2920 +ENDCHAR +STARTCHAR U_345C +ENCODING 13404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1460 +1580 +2F00 +65E0 +A540 +2740 +2D40 +2540 +2540 +2540 +2E40 +ENDCHAR +STARTCHAR U_345D +ENCODING 13405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1100 +27E0 +2100 +6FE0 +A000 +2240 +2FE0 +2240 +2240 +2C40 +ENDCHAR +STARTCHAR U_345E +ENCODING 13406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +2100 +2280 +6C60 +A240 +2FE0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_345F +ENCODING 13407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1600 +2400 +67C0 +A480 +2480 +2480 +2FE0 +2000 +2440 +2820 +ENDCHAR +STARTCHAR U_3460 +ENCODING 13408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1BE0 +2AA0 +6A40 +AAA0 +2320 +2000 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3461 +ENCODING 13409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +6AA0 +AEA0 +2AA0 +2EA0 +28E0 +2CA0 +2A80 +2E80 +2880 +ENDCHAR +STARTCHAR U_3462 +ENCODING 13410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14E0 +24A0 +7FA0 +A4A0 +24A0 +3FA0 +24E0 +28A0 +2A80 +2B80 +2C80 +ENDCHAR +STARTCHAR U_3463 +ENCODING 13411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2480 +7FE0 +A480 +2D80 +2FC0 +2DA0 +36A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_3464 +ENCODING 13412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1FE0 +2240 +6000 +AFE0 +2920 +2920 +2FE0 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3465 +ENCODING 13413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +27C0 +6440 +A7C0 +2800 +2FE0 +34A0 +24A0 +2920 +2260 +ENDCHAR +STARTCHAR U_3466 +ENCODING 13414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2E00 +6800 +AFE0 +2820 +2FE0 +2940 +2FE0 +2900 +2A80 +3460 +ENDCHAR +STARTCHAR U_3467 +ENCODING 13415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +4380 +CD60 +4100 +47C0 +4080 +4FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_3468 +ENCODING 13416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +67C0 +A400 +27C0 +2900 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_3469 +ENCODING 13417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2AA0 +4FE0 +4200 +C7C0 +4440 +4A40 +4180 +4300 +5C00 +ENDCHAR +STARTCHAR U_346A +ENCODING 13418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +6380 +A440 +3C60 +27C0 +2440 +27C0 +2440 +2840 +ENDCHAR +STARTCHAR U_346B +ENCODING 13419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1300 +1480 +2A60 +6100 +A780 +2080 +2360 +2900 +2A20 +21C0 +ENDCHAR +STARTCHAR U_346C +ENCODING 13420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4BE0 +FC80 +5480 +55E0 +5520 +4920 +5520 +5520 +61E0 +ENDCHAR +STARTCHAR U_346D +ENCODING 13421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1540 +27C0 +6540 +A7C0 +2000 +2FE0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_346E +ENCODING 13422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2100 +6FE0 +A100 +27C0 +2540 +27C0 +2540 +2FE0 +2100 +ENDCHAR +STARTCHAR U_346F +ENCODING 13423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1200 +27C0 +6440 +A7C0 +2440 +27C0 +2440 +27C0 +2240 +2420 +ENDCHAR +STARTCHAR U_3470 +ENCODING 13424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4440 +4F80 +C080 +5FE0 +4440 +5B80 +4540 +5940 +4320 +ENDCHAR +STARTCHAR U_3471 +ENCODING 13425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +2100 +5FE0 +4540 +DB00 +4100 +5FE0 +4380 +4540 +4920 +ENDCHAR +STARTCHAR U_3472 +ENCODING 13426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +6FE0 +AAA0 +2FE0 +2920 +2FE0 +2920 +2920 +2960 +ENDCHAR +STARTCHAR U_3473 +ENCODING 13427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +5AA0 +CFA0 +4260 +4400 +4FE0 +5AA0 +4FA0 +4220 +4C60 +ENDCHAR +STARTCHAR U_3474 +ENCODING 13428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2FC0 +4080 +DFE0 +5220 +4FC0 +4A40 +5FC0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_3475 +ENCODING 13429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17E0 +2400 +3500 +6DE0 +A680 +2C80 +37E0 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_3476 +ENCODING 13430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +5000 +CFC0 +4000 +7FC0 +5540 +4440 +5FC0 +4440 +5560 +ENDCHAR +STARTCHAR U_3477 +ENCODING 13431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +3280 +5EE0 +C080 +5EE0 +5200 +5E80 +52E0 +5E80 +52A0 +56E0 +ENDCHAR +STARTCHAR U_3478 +ENCODING 13432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +67C0 +A440 +3FE0 +2040 +2F40 +2940 +2F40 +20C0 +ENDCHAR +STARTCHAR U_3479 +ENCODING 13433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +E0E0 +3F80 +4440 +7FC0 +4440 +7FC0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_347A +ENCODING 13434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +5880 +CFE0 +4880 +4FE0 +5FC0 +4880 +49E0 +5020 +60C0 +ENDCHAR +STARTCHAR U_347B +ENCODING 13435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A20 +4480 +D560 +43C0 +4C00 +4100 +4920 +4920 +4FE0 +ENDCHAR +STARTCHAR U_347C +ENCODING 13436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2360 +5FA0 +D540 +55A0 +5F00 +55E0 +55A0 +5FA0 +40A0 +40E0 +ENDCHAR +STARTCHAR U_347D +ENCODING 13437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +6820 +A7C0 +2440 +27C0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_347E +ENCODING 13438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2DE0 +5240 +C980 +5E00 +4100 +5FE0 +4000 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_347F +ENCODING 13439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +2540 +4FE0 +C920 +4FE0 +4920 +4FE0 +4100 +4FE0 +4540 +ENDCHAR +STARTCHAR U_3480 +ENCODING 13440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +6FE0 +A920 +2FE0 +2920 +2BA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_3481 +ENCODING 13441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +6FE0 +A920 +2FE0 +2AA0 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3482 +ENCODING 13442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1EE0 +2440 +6120 +AFE0 +2140 +2FE0 +2640 +2BC0 +2240 +23C0 +ENDCHAR +STARTCHAR U_3483 +ENCODING 13443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +4100 +DE80 +4080 +5E80 +5280 +5E80 +5280 +5EA0 +7340 +ENDCHAR +STARTCHAR U_3484 +ENCODING 13444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +28A0 +4E80 +CBE0 +5680 +6D40 +4A20 +5420 +4000 +4D40 +52A0 +ENDCHAR +STARTCHAR U_3485 +ENCODING 13445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2200 +6DC0 +A340 +2E40 +2180 +2E00 +22A0 +2640 +2B20 +ENDCHAR +STARTCHAR U_3486 +ENCODING 13446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +3CE0 +4FC0 +C840 +4FC0 +5EE0 +4220 +5BA0 +4220 +4AA0 +5760 +ENDCHAR +STARTCHAR U_3487 +ENCODING 13447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +5540 +D540 +7FE0 +5540 +5540 +7FE0 +4000 +5540 +62A0 +ENDCHAR +STARTCHAR U_3488 +ENCODING 13448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E80 +2480 +7FE0 +D540 +5F40 +5540 +5D40 +5480 +7F40 +4540 +4620 +ENDCHAR +STARTCHAR U_3489 +ENCODING 13449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +5FE0 +D020 +47C0 +4440 +47C0 +4100 +5FE0 +4100 +4940 +ENDCHAR +STARTCHAR U_348A +ENCODING 13450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2AA0 +5BA0 +CAA0 +4AA0 +5560 +4440 +5660 +5540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_348B +ENCODING 13451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A60 +3F80 +4A80 +CEE0 +4AA0 +4EA0 +4AA0 +5FA0 +40A0 +4AA0 +5120 +ENDCHAR +STARTCHAR U_348C +ENCODING 13452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3540 +4EE0 +C440 +4AA0 +5FE0 +5020 +4780 +4480 +44A0 +58E0 +ENDCHAR +STARTCHAR U_348D +ENCODING 13453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4FC0 +C880 +5320 +5FE0 +4480 +4D00 +4240 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_348E +ENCODING 13454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2200 +5FC0 +C500 +4880 +5DE0 +4500 +5DC0 +4500 +5DC0 +4500 +ENDCHAR +STARTCHAR U_348F +ENCODING 13455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +54A0 +CFC0 +4480 +5FE0 +4480 +5FE0 +4B40 +5020 +4780 +ENDCHAR +STARTCHAR U_3490 +ENCODING 13456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EE0 +5540 +C800 +4FE0 +5020 +4F20 +4920 +4F20 +4920 +4F60 +ENDCHAR +STARTCHAR U_3491 +ENCODING 13457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +3140 +5A40 +D7E0 +5A40 +57E0 +5240 +57E0 +5A40 +5BE0 +5FE0 +ENDCHAR +STARTCHAR U_3492 +ENCODING 13458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AA0 +46C0 +DFE0 +4440 +4FE0 +4100 +47C0 +4100 +5FE0 +4940 +ENDCHAR +STARTCHAR U_3493 +ENCODING 13459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BE0 +4080 +DBE0 +4940 +4BE0 +5080 +4BE0 +4880 +4880 +57E0 +ENDCHAR +STARTCHAR U_3494 +ENCODING 13460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4FE0 +C400 +4FE0 +5220 +4FA0 +4AA0 +4FA0 +4260 +5FE0 +ENDCHAR +STARTCHAR U_3495 +ENCODING 13461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4940 +CBE0 +5540 +49E0 +4940 +55E0 +4D40 +45E0 +5900 +ENDCHAR +STARTCHAR U_3496 +ENCODING 13462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +CFC0 +4A40 +4FC0 +4A40 +5FE0 +52A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_3497 +ENCODING 13463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4480 +C780 +4480 +5FE0 +57A0 +4200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_3498 +ENCODING 13464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +34A0 +5EA0 +D240 +5E40 +54A0 +5F20 +4100 +4FE0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_3499 +ENCODING 13465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2BE0 +5220 +D7E0 +4A20 +4BE0 +5480 +4BE0 +42A0 +56A0 +5080 +ENDCHAR +STARTCHAR U_349A +ENCODING 13466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +5FE0 +C100 +5FE0 +4040 +5FE0 +4040 +4FC0 +5520 +67A0 +ENDCHAR +STARTCHAR U_349B +ENCODING 13467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +4AA0 +C660 +4AA0 +4900 +5FE0 +4900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_349C +ENCODING 13468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E60 +2BA0 +4E60 +CBA0 +4CE0 +4AA0 +4AA0 +5FE0 +4000 +4840 +5020 +ENDCHAR +STARTCHAR U_349D +ENCODING 13469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3DC0 +4500 +DFC0 +5540 +5FC0 +4280 +5FE0 +5940 +55A0 +62C0 +ENDCHAR +STARTCHAR U_349E +ENCODING 13470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +4500 +DFE0 +4900 +4FE0 +4900 +5FE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_349F +ENCODING 13471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4900 +CFC0 +4900 +4FE0 +5520 +5560 +4E40 +5980 +4C60 +ENDCHAR +STARTCHAR U_34A0 +ENCODING 13472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +16E0 +24A0 +2F40 +7AA0 +A6C0 +2A80 +3EE0 +2280 +2EE0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_34A1 +ENCODING 13473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2C80 +22E0 +6E40 +6080 +AEE0 +3440 +2EC0 +2560 +2A40 +2EC0 +ENDCHAR +STARTCHAR U_34A2 +ENCODING 13474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2700 +2A80 +5FC0 +7560 +DFC0 +4000 +5FC0 +5540 +5FC0 +5540 +50C0 +ENDCHAR +STARTCHAR U_34A3 +ENCODING 13475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +5540 +D7E0 +5D40 +55E0 +5540 +55E0 +5280 +5620 +6BC0 +ENDCHAR +STARTCHAR U_34A4 +ENCODING 13476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2880 +4F80 +7FE0 +C080 +7FE0 +5540 +5DC0 +5540 +7FE0 +4440 +ENDCHAR +STARTCHAR U_34A5 +ENCODING 13477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AA0 +7FE0 +6AA0 +FFE0 +6AA0 +7FE0 +5FC0 +5040 +5FC0 +4880 +7FE0 +ENDCHAR +STARTCHAR U_34A6 +ENCODING 13478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +4A80 +4F80 +CA80 +7FE0 +6AA0 +7FE0 +6AA0 +5FC0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_34A7 +ENCODING 13479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5D40 +4B00 +D5E0 +5D40 +49E0 +5D40 +55E0 +5540 +5DE0 +5500 +ENDCHAR +STARTCHAR U_34A8 +ENCODING 13480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A60 +57A0 +5DE0 +D6A0 +5DE0 +4680 +5FE0 +4D40 +5720 +4440 +47C0 +ENDCHAR +STARTCHAR U_34A9 +ENCODING 13481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +5FE0 +4540 +DA80 +4540 +5FE0 +5540 +5FE0 +4440 +5EE0 +ENDCHAR +STARTCHAR U_34AA +ENCODING 13482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +1980 +6060 +FBC0 +4200 +7BC0 +2000 +B7E0 +A140 +BAA0 +C580 +ENDCHAR +STARTCHAR U_34AB +ENCODING 13483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3FC0 +2000 +3F80 +2000 +FFE0 +1200 +1200 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_34AC +ENCODING 13484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +73E0 +0080 +0080 +FBE0 +5080 +5080 +53E0 +5000 +8820 +87E0 +ENDCHAR +STARTCHAR U_34AD +ENCODING 13485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBE0 +8A20 +8A20 +FBE0 +5140 +5140 +5140 +5A40 +9240 +8460 +ENDCHAR +STARTCHAR U_34AE +ENCODING 13486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +03C0 +7100 +06A0 +F9C0 +5280 +55E0 +52A0 +5180 +8820 +87E0 +ENDCHAR +STARTCHAR U_34AF +ENCODING 13487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +B440 +6FE0 +2540 +FFE0 +5540 +5FE0 +5900 +57C0 +8100 +ENDCHAR +STARTCHAR U_34B0 +ENCODING 13488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +0400 +0A00 +1100 +2080 +C060 +3F80 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_34B1 +ENCODING 13489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0A00 +1100 +2480 +CF60 +1100 +6D00 +0200 +0C00 +7000 +ENDCHAR +STARTCHAR U_34B2 +ENCODING 13490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0A00 +3180 +C060 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_34B3 +ENCODING 13491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8420 +C620 +A520 +A520 +D6A0 +CE60 +8420 +84A0 +8040 +ENDCHAR +STARTCHAR U_34B4 +ENCODING 13492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0600 +1900 +60C0 +8420 +2480 +2480 +3F80 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_34B5 +ENCODING 13493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +1000 +7F80 +4080 +7F80 +4080 +7F80 +0000 +2100 +40C0 +8040 +ENDCHAR +STARTCHAR U_34B6 +ENCODING 13494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1100 +1100 +2080 +C860 +1000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_34B7 +ENCODING 13495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2480 +2480 +2A80 +3280 +2080 +FFE0 +0000 +1100 +60C0 +ENDCHAR +STARTCHAR U_34B8 +ENCODING 13496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0400 +0840 +7480 +0B00 +7280 +0640 +FA20 +0600 +ENDCHAR +STARTCHAR U_34B9 +ENCODING 13497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +8A20 +AAA0 +AAA0 +AAA0 +FFE0 +5140 +8A20 +ENDCHAR +STARTCHAR U_34BA +ENCODING 13498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +8A20 +FFE0 +8420 +A420 +AA20 +B120 +A020 +BFA0 +8060 +ENDCHAR +STARTCHAR U_34BB +ENCODING 13499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8080 +BE80 +8080 +7F00 +4100 +7F00 +4100 +7F00 +2240 +C3C0 +ENDCHAR +STARTCHAR U_34BC +ENCODING 13500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0400 +7FC0 +6640 +5540 +6EC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_34BD +ENCODING 13501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +1500 +3F80 +0800 +7FC0 +2080 +DF60 +1140 +1FC0 +ENDCHAR +STARTCHAR U_34BE +ENCODING 13502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +2400 +F7E0 +4A80 +77E0 +52A0 +52A0 +5200 +B1E0 +ENDCHAR +STARTCHAR U_34BF +ENCODING 13503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +2180 +FBE0 +DE80 +ABE0 +FA80 +ABE0 +FA80 +8BE0 +ENDCHAR +STARTCHAR U_34C0 +ENCODING 13504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +8440 +0400 +0600 +0500 +0480 +0480 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_34C1 +ENCODING 13505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 3 +BITMAP +7FE0 +4040 +9100 +1080 +2040 +4040 +ENDCHAR +STARTCHAR U_34C2 +ENCODING 13506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +B920 +07E0 +F940 +5240 +5440 +5280 +5100 +56E0 +8FE0 +ENDCHAR +STARTCHAR U_34C3 +ENCODING 13507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9020 +78C0 +0700 +7900 +0100 +79C0 +0700 +7900 +4920 +78E0 +ENDCHAR +STARTCHAR U_34C4 +ENCODING 13508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4BE0 +FAA0 +4AA0 +9480 +FC80 +20C0 +DCC0 +3140 +4940 +F660 +ENDCHAR +STARTCHAR U_34C5 +ENCODING 13509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4FE0 +2100 +2100 +0100 +0100 +2100 +C100 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_34C6 +ENCODING 13510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2500 +0880 +3060 +0480 +4500 +4600 +C400 +4420 +47E0 +ENDCHAR +STARTCHAR U_34C7 +ENCODING 13511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +8F00 +4200 +0200 +1FE0 +0200 +2200 +4500 +4480 +8840 +1020 +ENDCHAR +STARTCHAR U_34C8 +ENCODING 13512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9FE0 +4200 +0200 +0400 +0FC0 +1440 +4440 +4440 +87C0 +0400 +ENDCHAR +STARTCHAR U_34C9 +ENCODING 13513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +8F00 +4200 +0200 +1FE0 +0200 +2FC0 +4840 +4840 +8FC0 +0800 +ENDCHAR +STARTCHAR U_34CA +ENCODING 13514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2BA0 +0820 +0BA0 +0AA0 +2AA0 +CAA0 +4BA0 +4820 +4860 +ENDCHAR +STARTCHAR U_34CB +ENCODING 13515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4480 +2FC0 +2480 +0480 +0480 +3FE0 +C000 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_34CC +ENCODING 13516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4200 +2500 +0880 +3060 +0F80 +2200 +CF80 +4200 +4200 +5FE0 +ENDCHAR +STARTCHAR U_34CD +ENCODING 13517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +2400 +2480 +08C0 +0F40 +2500 +C500 +4500 +4920 +50E0 +ENDCHAR +STARTCHAR U_34CE +ENCODING 13518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4040 +2FE0 +2040 +1FE0 +1020 +2FC0 +C440 +4280 +4100 +4EE0 +ENDCHAR +STARTCHAR U_34CF +ENCODING 13519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5020 +54A0 +1860 +1020 +57A0 +54A0 +D4A0 +57A0 +5020 +5060 +ENDCHAR +STARTCHAR U_34D0 +ENCODING 13520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +2100 +2FE0 +0440 +0440 +2960 +C100 +47C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_34D1 +ENCODING 13521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +2100 +2FE0 +0440 +0FE0 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_34D2 +ENCODING 13522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +22E0 +1F00 +E220 +41E0 +0400 +1B00 +E4E0 +2480 +4540 +0C80 +ENDCHAR +STARTCHAR U_34D3 +ENCODING 13523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +2100 +2FE0 +0AA0 +0FE0 +2920 +CFE0 +4920 +4920 +4960 +ENDCHAR +STARTCHAR U_34D4 +ENCODING 13524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4E40 +2BE0 +2E40 +0A40 +0F40 +2AC0 +DE40 +4640 +4A40 +56C0 +ENDCHAR +STARTCHAR U_34D5 +ENCODING 13525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4FE0 +2880 +2F80 +0AA0 +0FA0 +2A40 +CA40 +4D40 +50E0 +5320 +ENDCHAR +STARTCHAR U_34D6 +ENCODING 13526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5240 +5FC0 +1240 +1FC0 +0A80 +3FE0 +CA80 +5FC0 +4200 +5FC0 +ENDCHAR +STARTCHAR U_34D7 +ENCODING 13527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +5EA0 +44A0 +1EA0 +0520 +1E60 +44A0 +CF00 +4240 +5FA0 +4A80 +ENDCHAR +STARTCHAR U_34D8 +ENCODING 13528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5F40 +4840 +77C0 +5540 +7E40 +5F40 +4440 +5F40 +8460 +BFA0 +ENDCHAR +STARTCHAR U_34D9 +ENCODING 13529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +8420 +BFA0 +9120 +8A20 +8A20 +8420 +8A20 +9120 +A0A0 +FFE0 +ENDCHAR +STARTCHAR U_34DA +ENCODING 13530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +7C20 +1120 +1120 +1120 +1120 +1520 +1920 +F020 +40A0 +0040 +ENDCHAR +STARTCHAR U_34DB +ENCODING 13531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +03E0 +7D20 +1120 +1120 +1120 +1520 +F920 +4220 +04A0 +1840 +ENDCHAR +STARTCHAR U_34DC +ENCODING 13532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4920 +9120 +E120 +2120 +4120 +8920 +F620 +04A0 +1840 +ENDCHAR +STARTCHAR U_34DD +ENCODING 13533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2920 +7D20 +2920 +2920 +2920 +7D20 +2920 +2820 +48A0 +8840 +ENDCHAR +STARTCHAR U_34DE +ENCODING 13534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3920 +E120 +2120 +3920 +E120 +2120 +3920 +E220 +24A0 +2840 +ENDCHAR +STARTCHAR U_34DF +ENCODING 13535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +7E20 +4AA0 +48A0 +7EA0 +62A0 +54A0 +48A0 +5420 +A220 +8060 +ENDCHAR +STARTCHAR U_34E0 +ENCODING 13536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2020 +3D20 +2120 +2120 +2120 +FD20 +8520 +8420 +FCE0 +8440 +ENDCHAR +STARTCHAR U_34E1 +ENCODING 13537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6020 +4020 +7EA0 +90A0 +10A0 +FEA0 +10A0 +92A0 +9220 +92E0 +FE40 +ENDCHAR +STARTCHAR U_34E2 +ENCODING 13538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +4020 +7EA0 +C4A0 +24A0 +18A0 +66A0 +82A0 +7C20 +44E0 +7C40 +ENDCHAR +STARTCHAR U_34E3 +ENCODING 13539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +2920 +4520 +8320 +7D20 +0120 +7D20 +4420 +44E0 +7C20 +ENDCHAR +STARTCHAR U_34E4 +ENCODING 13540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +10A0 +FEA0 +10A0 +7CA0 +00A0 +7CA0 +4420 +44E0 +7C20 +ENDCHAR +STARTCHAR U_34E5 +ENCODING 13541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2420 +AD20 +7120 +2120 +FD20 +0520 +FD20 +0420 +FDE0 +0040 +ENDCHAR +STARTCHAR U_34E6 +ENCODING 13542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +1020 +2120 +4120 +FD20 +8520 +8520 +FD20 +8420 +85E0 +FC40 +ENDCHAR +STARTCHAR U_34E7 +ENCODING 13543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1820 +24A0 +52A0 +88A0 +7CA0 +08A0 +10A0 +7C20 +44A0 +7C40 +ENDCHAR +STARTCHAR U_34E8 +ENCODING 13544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +FEA0 +10A0 +54A0 +54A0 +BAA0 +92A0 +2820 +44E0 +8440 +ENDCHAR +STARTCHAR U_34E9 +ENCODING 13545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3C20 +48A0 +90A0 +7EA0 +52A0 +7EA0 +52A0 +7EA0 +5220 +9660 +ENDCHAR +STARTCHAR U_34EA +ENCODING 13546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +8920 +F920 +8920 +F920 +8120 +A120 +9120 +EA20 +8C60 +ENDCHAR +STARTCHAR U_34EB +ENCODING 13547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +28A0 +44A0 +82A0 +7CA0 +28A0 +FEA0 +28A0 +2820 +4860 +ENDCHAR +STARTCHAR U_34EC +ENCODING 13548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +5420 +FEA0 +10A0 +FEA0 +28A0 +44A0 +FEA0 +24A0 +2420 +CC60 +ENDCHAR +STARTCHAR U_34ED +ENCODING 13549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +44A0 +7CA0 +44A0 +7CA0 +20A0 +7EA0 +D2A0 +6AA0 +7A20 +0660 +ENDCHAR +STARTCHAR U_34EE +ENCODING 13550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +9220 +BAA0 +92A0 +FEA0 +82A0 +BAA0 +AAA0 +BA20 +8220 +8660 +ENDCHAR +STARTCHAR U_34EF +ENCODING 13551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2A20 +5420 +A8A0 +54A0 +2AA0 +FEA0 +92A0 +FEA0 +9220 +FE60 +ENDCHAR +STARTCHAR U_34F0 +ENCODING 13552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF20 +1020 +7CA0 +54A0 +D6A0 +FEA0 +D6A0 +D6A0 +FE20 +8220 +FE60 +ENDCHAR +STARTCHAR U_34F1 +ENCODING 13553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +C6A0 +78A0 +02A0 +E2A0 +AAA0 +EAA0 +AA20 +E220 +A660 +ENDCHAR +STARTCHAR U_34F2 +ENCODING 13554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +7020 +40A0 +7EA0 +42A0 +7EA0 +40A0 +7EA0 +6A20 +7E20 +AA60 +ENDCHAR +STARTCHAR U_34F3 +ENCODING 13555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +7CA0 +44A0 +7CA0 +00A0 +FEA0 +10A0 +5C20 +5020 +BE60 +ENDCHAR +STARTCHAR U_34F4 +ENCODING 13556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +2020 +FEA0 +AAA0 +AAA0 +AAA0 +10A0 +FEA0 +1020 +28A0 +C640 +ENDCHAR +STARTCHAR U_34F5 +ENCODING 13557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AA20 +EEA0 +00A0 +7CA0 +00A0 +FEA0 +20A0 +3C20 +0420 +3860 +ENDCHAR +STARTCHAR U_34F6 +ENCODING 13558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E20 +EA20 +4AA0 +EAA0 +4AA0 +F6A0 +50A0 +FEA0 +2820 +4420 +8260 +ENDCHAR +STARTCHAR U_34F7 +ENCODING 13559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7C20 +44A0 +7CA0 +44A0 +7CA0 +10A0 +FEA0 +1020 +5420 +9260 +ENDCHAR +STARTCHAR U_34F8 +ENCODING 13560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AA20 +AAA0 +EEA0 +28A0 +EEA0 +82A0 +EEA0 +2820 +2820 +FE60 +ENDCHAR +STARTCHAR U_34F9 +ENCODING 13561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F20 +4820 +6AA0 +5CA0 +48A0 +76A0 +48A0 +6AA0 +5C20 +4820 +B660 +ENDCHAR +STARTCHAR U_34FA +ENCODING 13562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +0820 +7EA0 +4AA0 +7CA0 +48A0 +7EA0 +54A0 +5420 +4820 +B660 +ENDCHAR +STARTCHAR U_34FB +ENCODING 13563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +AA20 +AAA0 +FEA0 +00A0 +FEA0 +10A0 +5CA0 +5020 +5E20 +F060 +ENDCHAR +STARTCHAR U_34FC +ENCODING 13564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FF20 +38A0 +54A0 +92A0 +28A0 +C6A0 +92A0 +5420 +9220 +3060 +ENDCHAR +STARTCHAR U_34FD +ENCODING 13565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +FE20 +10A0 +FEA0 +82A0 +7CA0 +00A0 +FEA0 +1020 +5420 +9260 +ENDCHAR +STARTCHAR U_34FE +ENCODING 13566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +6AA0 +5CA0 +6AA0 +48A0 +5CA0 +6820 +BEA0 +8840 +ENDCHAR +STARTCHAR U_34FF +ENCODING 13567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +0820 +FFA0 +1CA0 +2AA0 +D5A0 +2AA0 +6BA0 +9C20 +2AA0 +1860 +ENDCHAR +STARTCHAR U_3500 +ENCODING 13568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E20 +2220 +3EA0 +08A0 +FFA0 +3EA0 +22A0 +3EA0 +0820 +2AA0 +5960 +ENDCHAR +STARTCHAR U_3501 +ENCODING 13569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A6A0 +4320 +BD20 +00A0 +7EA0 +42A0 +7EA0 +4220 +24A0 +FF40 +ENDCHAR +STARTCHAR U_3502 +ENCODING 13570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +5420 +FEA0 +54A0 +92A0 +54A0 +64A0 +BEA0 +54A0 +5F20 +8460 +ENDCHAR +STARTCHAR U_3503 +ENCODING 13571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +9120 +F7E0 +4520 +97E0 +F400 +AFE0 +0000 +FFE0 +0820 +7060 +ENDCHAR +STARTCHAR U_3504 +ENCODING 13572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2820 +FEA0 +AAA0 +FEA0 +10A0 +54A0 +FEA0 +10A0 +5420 +9260 +ENDCHAR +STARTCHAR U_3505 +ENCODING 13573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7C20 +1420 +FEA0 +14A0 +7EA0 +52A0 +7EA0 +5220 +7620 +B260 +ENDCHAR +STARTCHAR U_3506 +ENCODING 13574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +EE20 +AAA0 +EEA0 +55A0 +AAA0 +7CA0 +44A0 +7C20 +44A0 +7C40 +ENDCHAR +STARTCHAR U_3507 +ENCODING 13575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA20 +2CA0 +ABA0 +44A0 +EEA0 +2AA0 +F1A0 +8EA0 +EA20 +24A0 +6B40 +ENDCHAR +STARTCHAR U_3508 +ENCODING 13576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +FE20 +28A0 +00A0 +28A0 +EEA0 +28A0 +EEA0 +2820 +EE20 +2860 +ENDCHAR +STARTCHAR U_3509 +ENCODING 13577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +5CA0 +6AA0 +7EA0 +48A0 +7E20 +AA20 +BEA0 +A240 +ENDCHAR +STARTCHAR U_350A +ENCODING 13578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +00A0 +FEA0 +BAA0 +82A0 +FEA0 +44A0 +7C20 +4420 +FE60 +ENDCHAR +STARTCHAR U_350B +ENCODING 13579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F420 +A720 +F420 +98A0 +F0A0 +A7A0 +F0A0 +00A0 +7F20 +5520 +FFE0 +ENDCHAR +STARTCHAR U_350C +ENCODING 13580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +A220 +EAA0 +A4A0 +EAA0 +30A0 +06A0 +F820 +5420 +BAA0 +1060 +ENDCHAR +STARTCHAR U_350D +ENCODING 13581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7720 +AAA0 +7EA0 +5AA0 +5AA0 +7EA0 +2420 +FE20 +24A0 +4440 +ENDCHAR +STARTCHAR U_350E +ENCODING 13582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +FBE0 +4140 +FBE0 +8880 +FBE0 +8880 +F880 +7FE0 +0820 +7060 +ENDCHAR +STARTCHAR U_350F +ENCODING 13583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF20 +2020 +7EA0 +A2A0 +3EA0 +00A0 +FFA0 +44A0 +FF20 +5520 +7760 +ENDCHAR +STARTCHAR U_3510 +ENCODING 13584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7BA0 +A520 +FEA0 +28A0 +EEA0 +28A0 +EEA0 +2820 +EE20 +FE60 +ENDCHAR +STARTCHAR U_3511 +ENCODING 13585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +5100 +8080 +FBE0 +8940 +FBE0 +8880 +FFE0 +1020 +E060 +ENDCHAR +STARTCHAR U_3512 +ENCODING 13586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +FE20 +48A0 +FEA0 +48A0 +7EA0 +48A0 +FEA0 +BA20 +EE20 +BA60 +ENDCHAR +STARTCHAR U_3513 +ENCODING 13587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +F080 +13E0 +10A0 +FCA0 +10A0 +10A0 +10A0 +10A0 +1120 +1660 +ENDCHAR +STARTCHAR U_3514 +ENCODING 13588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +4520 +8DE0 +0000 +3F80 +4040 +4040 +3F80 +ENDCHAR +STARTCHAR U_3515 +ENCODING 13589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +83E0 +7D20 +0120 +F920 +0920 +0920 +0A20 +0A20 +0460 +ENDCHAR +STARTCHAR U_3516 +ENCODING 13590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +2520 +CDE0 +0000 +7FC0 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U_3517 +ENCODING 13591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +FE80 +2BE0 +FEA0 +A8A0 +FEA0 +2AA0 +2AA0 +2EA0 +4960 +ENDCHAR +STARTCHAR U_3518 +ENCODING 13592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +A900 +AFE0 +F920 +2120 +A920 +A920 +AA20 +FAA0 +8C40 +ENDCHAR +STARTCHAR U_3519 +ENCODING 13593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4880 +FC80 +4BE0 +48A0 +48A0 +FCA0 +4920 +4920 +4920 +8A60 +ENDCHAR +STARTCHAR U_351A +ENCODING 13594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0840 +3040 +5080 +1480 +FBE0 +1120 +7920 +4A40 +3A40 +24C0 +ENDCHAR +STARTCHAR U_351B +ENCODING 13595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2080 +3F80 +0400 +FFE0 +0420 +0820 +F0C0 +ENDCHAR +STARTCHAR U_351C +ENCODING 13596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +E500 +5500 +2BE0 +7D20 +0920 +1120 +1D20 +F220 +1220 +34C0 +ENDCHAR +STARTCHAR U_351D +ENCODING 13597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +1080 +11E0 +FEA0 +92A0 +DAA0 +B6A0 +DAA0 +92A0 +9320 +9640 +ENDCHAR +STARTCHAR U_351E +ENCODING 13598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +E080 +11E0 +FEA0 +10A0 +54A0 +D6A0 +54A0 +D6A0 +1120 +1140 +ENDCHAR +STARTCHAR U_351F +ENCODING 13599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7FC0 +9140 +7FC0 +1140 +FE60 +0400 +FFE0 +0420 +1820 +E060 +ENDCHAR +STARTCHAR U_3520 +ENCODING 13600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +FC80 +87E0 +FCA0 +40A0 +7CA0 +9520 +AD20 +F520 +0A40 +ENDCHAR +STARTCHAR U_3521 +ENCODING 13601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FE80 +ABE0 +92A0 +FEA0 +00A0 +88A0 +ED20 +8920 +A920 +CE60 +ENDCHAR +STARTCHAR U_3522 +ENCODING 13602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +9440 +63E0 +62A0 +F3E0 +0A00 +ABE0 +0400 +FFE0 +1020 +60C0 +ENDCHAR +STARTCHAR U_3523 +ENCODING 13603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5480 +7DE0 +54A0 +7CA0 +00A0 +FEA0 +AAA0 +FEA0 +AAA0 +FF60 +ENDCHAR +STARTCHAR U_3524 +ENCODING 13604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +8280 +7DE0 +54A0 +FEA0 +54A0 +D6A0 +7CA0 +5520 +7E60 +ENDCHAR +STARTCHAR U_3525 +ENCODING 13605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FE80 +49E0 +AEA0 +E8A0 +A6A0 +E8A0 +AEA0 +E8A0 +A760 +ENDCHAR +STARTCHAR U_3526 +ENCODING 13606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +2080 +FBE0 +20A0 +FCA0 +50A0 +FD20 +6920 +5120 +6A60 +ENDCHAR +STARTCHAR U_3527 +ENCODING 13607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +2080 +FE80 +A5E0 +F8A0 +A0A0 +BCA0 +A4A0 +BCA0 +A520 +7E60 +ENDCHAR +STARTCHAR U_3528 +ENCODING 13608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A20 +3BA0 +0A20 +7BE0 +0020 +1F20 +1120 +1F20 +1120 +2360 +ENDCHAR +STARTCHAR U_3529 +ENCODING 13609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4420 +BFA0 +0420 +7FA0 +1220 +7FA0 +54A0 +FFA0 +0060 +ENDCHAR +STARTCHAR U_352A +ENCODING 13610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +8F20 +0820 +7FA0 +55A0 +4AA0 +6DA0 +52A0 +7FE0 +ENDCHAR +STARTCHAR U_352B +ENCODING 13611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +0800 +0800 +1420 +14C0 +2700 +2400 +4420 +83E0 +ENDCHAR +STARTCHAR U_352C +ENCODING 13612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7E00 +4020 +3FE0 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_352D +ENCODING 13613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +8440 +87C0 +F440 +87C0 +8000 +9FE0 +8100 +A5C0 +C500 +1BE0 +ENDCHAR +STARTCHAR U_352E +ENCODING 13614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FA60 +5540 +FF40 +A860 +FF00 +2540 +FF60 +2540 +5740 +8560 +ENDCHAR +STARTCHAR U_352F +ENCODING 13615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +9F80 +9080 +A060 +DF80 +9080 +9080 +9F80 +8000 +FFE0 +ENDCHAR +STARTCHAR U_3530 +ENCODING 13616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +9100 +9D00 +A580 +D540 +8920 +9100 +A100 +C100 +FFE0 +ENDCHAR +STARTCHAR U_3531 +ENCODING 13617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A00 +B2C0 +A240 +BAC0 +A240 +BFC0 +8200 +8D80 +B040 +FFE0 +ENDCHAR +STARTCHAR U_3532 +ENCODING 13618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +A900 +D3C0 +B940 +A940 +B940 +A140 +A960 +B200 +FFE0 +ENDCHAR +STARTCHAR U_3533 +ENCODING 13619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9000 +AB80 +D280 +BA80 +AA80 +BA80 +A2A0 +AAA0 +B460 +FFE0 +ENDCHAR +STARTCHAR U_3534 +ENCODING 13620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +BF80 +A480 +BF80 +8A00 +BF80 +8A00 +BFC0 +9080 +FFE0 +ENDCHAR +STARTCHAR U_3535 +ENCODING 13621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A540 +BDC0 +A100 +BDC0 +8900 +9F80 +8900 +BFC0 +9080 +FFE0 +ENDCHAR +STARTCHAR U_3536 +ENCODING 13622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +FDC0 +AB40 +FC80 +AB60 +B9C0 +9140 +FDC0 +9220 +FFE0 +ENDCHAR +STARTCHAR U_3537 +ENCODING 13623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BFC0 +8400 +BFC0 +A440 +AA40 +B140 +A0C0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_3538 +ENCODING 13624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8040 +BF80 +A200 +AFC0 +AA40 +AF80 +AA00 +ABA0 +D4A0 +FFE0 +ENDCHAR +STARTCHAR U_3539 +ENCODING 13625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F120 +2120 +2120 +2120 +2220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_353A +ENCODING 13626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2480 +2080 +FBE0 +2080 +2080 +2020 +1FE0 +ENDCHAR +STARTCHAR U_353B +ENCODING 13627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +0400 +1D80 +E460 +0400 +0000 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_353C +ENCODING 13628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +F7E0 +2C80 +37E0 +E480 +27E0 +2480 +67E0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_353D +ENCODING 13629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0F80 +0800 +0800 +FFE0 +8020 +9F20 +9120 +9F20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_353E +ENCODING 13630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF00 +8100 +8100 +8100 +8100 +8500 +8200 +8000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_353F +ENCODING 13631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +2080 +2080 +2080 +2080 +2080 +2780 +3880 +0080 +0080 +ENDCHAR +STARTCHAR U_3540 +ENCODING 13632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +8880 +FF80 +8880 +FF80 +0000 +FF00 +8100 +8240 +7FC0 +ENDCHAR +STARTCHAR U_3541 +ENCODING 13633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +4920 +3120 +CD20 +2120 +FD20 +2120 +5120 +5160 +A500 +7D00 +ENDCHAR +STARTCHAR U_3542 +ENCODING 13634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +58C0 +6020 +4400 +4200 +5FC0 +4080 +4100 +8200 +ENDCHAR +STARTCHAR U_3543 +ENCODING 13635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4480 +4480 +5FE0 +4480 +4480 +4480 +4880 +9080 +ENDCHAR +STARTCHAR U_3544 +ENCODING 13636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4400 +4880 +5F00 +4200 +4400 +4840 +93E0 +9C20 +ENDCHAR +STARTCHAR U_3545 +ENCODING 13637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +5240 +5240 +5FC0 +5240 +5FC0 +4200 +4200 +8200 +ENDCHAR +STARTCHAR U_3546 +ENCODING 13638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4200 +7FE0 +4200 +4200 +5FC0 +5040 +5040 +5040 +9FC0 +ENDCHAR +STARTCHAR U_3547 +ENCODING 13639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +4200 +5FC0 +4000 +4880 +4880 +4880 +4500 +4500 +BFE0 +ENDCHAR +STARTCHAR U_3548 +ENCODING 13640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +4200 +7FE0 +4400 +4A40 +7A80 +4900 +4900 +4880 +8C60 +ENDCHAR +STARTCHAR U_3549 +ENCODING 13641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +4880 +7060 +4F80 +4000 +5FC0 +5040 +9040 +9FC0 +ENDCHAR +STARTCHAR U_354A +ENCODING 13642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4240 +7FE0 +4200 +5FE0 +5220 +5FE0 +5220 +5FE0 +5220 +9260 +ENDCHAR +STARTCHAR U_354B +ENCODING 13643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +4880 +7060 +4F80 +4200 +5FC0 +4200 +8A80 +BFE0 +ENDCHAR +STARTCHAR U_354C +ENCODING 13644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5FC0 +4080 +7FE0 +4880 +8180 +ENDCHAR +STARTCHAR U_354D +ENCODING 13645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4000 +4A00 +5100 +77C0 +5100 +57C0 +5100 +57C0 +5100 +97C0 +ENDCHAR +STARTCHAR U_354E +ENCODING 13646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4F80 +4200 +5FC0 +4480 +4FC0 +4000 +5FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_354F +ENCODING 13647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5C40 +4140 +5C40 +5540 +5C40 +41E0 +5440 +4840 +9C40 +ENDCHAR +STARTCHAR U_3550 +ENCODING 13648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +59C0 +5040 +5DC0 +5000 +5FE0 +4020 +5520 +6AA0 +8060 +ENDCHAR +STARTCHAR U_3551 +ENCODING 13649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4840 +5C40 +49E0 +5C40 +5540 +5C40 +5440 +48C0 +9C40 +ENDCHAR +STARTCHAR U_3552 +ENCODING 13650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +5FC0 +4200 +5FC0 +4920 +5FC0 +4940 +5C80 +48A0 +9940 +ENDCHAR +STARTCHAR U_3553 +ENCODING 13651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5240 +5540 +5FC0 +4200 +7FE0 +5540 +6220 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_3554 +ENCODING 13652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54C0 +5FE0 +56A0 +5FE0 +5400 +5FE0 +7620 +5D40 +55A0 +A640 +ENDCHAR +STARTCHAR U_3555 +ENCODING 13653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1000 +2200 +4100 +FF80 +0840 +1000 +2200 +4100 +FF80 +0040 +ENDCHAR +STARTCHAR U_3556 +ENCODING 13654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1200 +3F00 +1080 +2940 +7BE0 +0400 +FFE0 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_3557 +ENCODING 13655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +FE00 +1080 +7C80 +1100 +FD40 +1240 +3FE0 +4420 +9800 +27E0 +ENDCHAR +STARTCHAR U_3558 +ENCODING 13656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +2080 +5140 +FBE0 +0400 +1B00 +2480 +CE60 +1500 +2C80 +ENDCHAR +STARTCHAR U_3559 +ENCODING 13657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +51C0 +FA40 +5080 +9BE0 +22A0 +7BE0 +D080 +21C0 +52A0 +8CE0 +ENDCHAR +STARTCHAR U_355A +ENCODING 13658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +2840 +2480 +9480 +4900 +4600 +0600 +0900 +3080 +C060 +ENDCHAR +STARTCHAR U_355B +ENCODING 13659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0080 +3100 +0E00 +3180 +C040 +7F80 +2080 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_355C +ENCODING 13660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +8880 +FF80 +0800 +FF80 +4100 +2200 +1C00 +E380 +ENDCHAR +STARTCHAR U_355D +ENCODING 13661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4040 +7FC0 +0000 +7F80 +2080 +1F00 +E0E0 +ENDCHAR +STARTCHAR U_355E +ENCODING 13662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E00 +42E0 +7EA0 +48A0 +48A0 +7EA0 +6AA0 +AA40 +2A40 +2EA0 +0920 +ENDCHAR +STARTCHAR U_355F +ENCODING 13663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1E00 +11E0 +FEA0 +AAA0 +AAA0 +FEA0 +AA40 +AA40 +AAA0 +8720 +ENDCHAR +STARTCHAR U_3560 +ENCODING 13664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +4FE0 +3900 +0FE0 +0900 +2FE0 +4900 +BFE0 +2080 +1F00 +E0E0 +ENDCHAR +STARTCHAR U_3561 +ENCODING 13665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +23E0 +FD20 +8520 +7920 +30C0 +48C0 +78C0 +B540 +4920 +7A20 +ENDCHAR +STARTCHAR U_3562 +ENCODING 13666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2020 +FD20 +8520 +7940 +4940 +7880 +4880 +7880 +4940 +8620 +ENDCHAR +STARTCHAR U_3563 +ENCODING 13667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +0900 +1080 +2080 +4040 +BFA0 +2080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_3564 +ENCODING 13668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F200 +9F80 +9280 +9280 +9280 +9280 +F280 +04A0 +18E0 +ENDCHAR +STARTCHAR U_3565 +ENCODING 13669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9100 +9100 +9100 +9100 +9280 +F280 +0440 +1820 +ENDCHAR +STARTCHAR U_3566 +ENCODING 13670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0400 +0400 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_3567 +ENCODING 13671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9420 +97E0 +9400 +9400 +9400 +F400 +0400 +0800 +3000 +ENDCHAR +STARTCHAR U_3568 +ENCODING 13672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0480 +F480 +9480 +9680 +9580 +9480 +9480 +F480 +08A0 +1060 +ENDCHAR +STARTCHAR U_3569 +ENCODING 13673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FFE0 +9100 +9100 +97C0 +9100 +9100 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_356A +ENCODING 13674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +EFE0 +A920 +A920 +A100 +A280 +E280 +02A0 +0CA0 +3060 +ENDCHAR +STARTCHAR U_356B +ENCODING 13675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +F400 +9400 +97C0 +9440 +9440 +F440 +0440 +0940 +1080 +ENDCHAR +STARTCHAR U_356C +ENCODING 13676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0280 +F240 +9440 +9420 +9920 +9100 +9280 +F240 +04A0 +0720 +ENDCHAR +STARTCHAR U_356D +ENCODING 13677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0300 +ED00 +A100 +A100 +AFE0 +A100 +A280 +E480 +0840 +1020 +ENDCHAR +STARTCHAR U_356E +ENCODING 13678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0440 +E820 +A440 +A440 +A280 +A280 +A100 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_356F +ENCODING 13679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +FF80 +9480 +A280 +FF80 +A280 +A280 +BE80 +8280 +8180 +ENDCHAR +STARTCHAR U_3570 +ENCODING 13680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +1E00 +E200 +A380 +BE00 +A200 +A3C0 +FE00 +A220 +0220 +01E0 +ENDCHAR +STARTCHAR U_3571 +ENCODING 13681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F240 +9FE0 +9200 +9200 +9280 +9280 +9280 +F280 +04A0 +1860 +ENDCHAR +STARTCHAR U_3572 +ENCODING 13682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9FE0 +9100 +9380 +9380 +9540 +F540 +0920 +1120 +ENDCHAR +STARTCHAR U_3573 +ENCODING 13683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +08A0 +EAA0 +AAA0 +AAA0 +A920 +A920 +EAA0 +0C60 +0FE0 +0020 +ENDCHAR +STARTCHAR U_3574 +ENCODING 13684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1020 +E780 +A480 +A480 +A480 +A480 +A480 +E480 +08A0 +1060 +ENDCHAR +STARTCHAR U_3575 +ENCODING 13685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0100 +F100 +9100 +9100 +97C0 +9100 +F100 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_3576 +ENCODING 13686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E200 +A200 +A200 +AFC0 +A240 +A240 +E440 +8440 +0440 +1FE0 +ENDCHAR +STARTCHAR U_3577 +ENCODING 13687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0200 +F7E0 +9420 +9420 +97E0 +9420 +9420 +F420 +07E0 +0420 +ENDCHAR +STARTCHAR U_3578 +ENCODING 13688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +E000 +BFE0 +A000 +A840 +A840 +E480 +A480 +0000 +3FE0 +ENDCHAR +STARTCHAR U_3579 +ENCODING 13689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F240 +9FE0 +9200 +9240 +9240 +9540 +9480 +F480 +0940 +1220 +ENDCHAR +STARTCHAR U_357A +ENCODING 13690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0000 +FFE0 +1000 +2000 +3F80 +0080 +0300 +ENDCHAR +STARTCHAR U_357B +ENCODING 13691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0400 +1D80 +E440 +0400 +7FC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_357C +ENCODING 13692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A820 +B2A0 +A120 +A920 +AAA0 +E820 +AFA0 +0020 +0060 +ENDCHAR +STARTCHAR U_357D +ENCODING 13693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +0840 +EC40 +AA40 +AA40 +A840 +AA40 +EC80 +0940 +0220 +0C20 +ENDCHAR +STARTCHAR U_357E +ENCODING 13694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +C460 +0400 +0000 +7A20 +4BC0 +4A00 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_357F +ENCODING 13695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +0E00 +3580 +C460 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_3580 +ENCODING 13696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +F140 +9FE0 +9140 +97C0 +9100 +F7C0 +9100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_3581 +ENCODING 13697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0640 +0180 +E240 +A420 +A100 +AFE0 +A200 +E480 +8900 +1240 +07E0 +ENDCHAR +STARTCHAR U_3582 +ENCODING 13698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +AFE0 +A920 +AFE0 +A140 +E080 +A1A0 +0260 +0C20 +ENDCHAR +STARTCHAR U_3583 +ENCODING 13699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A800 +A800 +AFE0 +A800 +ABE0 +EA20 +AA20 +0A20 +13E0 +ENDCHAR +STARTCHAR U_3584 +ENCODING 13700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +E920 +A920 +A920 +BDA0 +AB60 +A920 +E920 +A920 +1120 +2020 +ENDCHAR +STARTCHAR U_3585 +ENCODING 13701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +0080 +EFE0 +A880 +A8A0 +AEA0 +A8C0 +E880 +90A0 +1160 +2220 +ENDCHAR +STARTCHAR U_3586 +ENCODING 13702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0280 +EFE0 +AAA0 +AAA0 +AAA0 +AFE0 +AAA0 +EAA0 +0AA0 +0FE0 +ENDCHAR +STARTCHAR U_3587 +ENCODING 13703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0200 +E400 +AFE0 +AAA0 +AAA0 +AAA0 +AAA0 +EAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_3588 +ENCODING 13704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3E80 +0500 +FFE0 +1900 +2E20 +C7E0 +0000 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3589 +ENCODING 13705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A280 +A440 +A920 +A100 +A500 +E5C0 +A500 +0500 +1FE0 +ENDCHAR +STARTCHAR U_358A +ENCODING 13706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E040 +A7C0 +A040 +AFC0 +A080 +AFE0 +E480 +A280 +0080 +0180 +ENDCHAR +STARTCHAR U_358B +ENCODING 13707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +D160 +1100 +2100 +4100 +7A60 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_358C +ENCODING 13708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +6F80 +A280 +24A0 +28E0 +0000 +7A40 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_358D +ENCODING 13709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +4900 +21E0 +FF00 +0100 +0100 +7A40 +4B80 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_358E +ENCODING 13710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4B80 +4A20 +79E0 +0400 +0A00 +3180 +D160 +1100 +1100 +2100 +ENDCHAR +STARTCHAR U_358F +ENCODING 13711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0440 +F7C0 +9440 +97C0 +9000 +9100 +97C0 +F100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_3590 +ENCODING 13712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +3F80 +0480 +FFE0 +0480 +3F80 +0800 +3000 +ENDCHAR +STARTCHAR U_3591 +ENCODING 13713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +00A0 +EFE0 +A080 +AAA0 +AAA0 +BFC0 +EAC0 +0AA0 +1160 +0620 +ENDCHAR +STARTCHAR U_3592 +ENCODING 13714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A120 +AFE0 +A900 +AFE0 +E320 +0520 +09A0 +1140 +ENDCHAR +STARTCHAR U_3593 +ENCODING 13715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +0680 +E900 +A280 +A540 +AFE0 +B100 +E380 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_3594 +ENCODING 13716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E200 +AFC0 +A480 +A840 +B7E0 +A480 +E480 +A480 +0780 +0480 +ENDCHAR +STARTCHAR U_3595 +ENCODING 13717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A440 +A280 +AFE0 +A100 +E100 +A7C0 +0100 +0100 +ENDCHAR +STARTCHAR U_3596 +ENCODING 13718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3597 +ENCODING 13719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E920 +AFE0 +A100 +A280 +A440 +BBA0 +E000 +A7C0 +0040 +0180 +ENDCHAR +STARTCHAR U_3598 +ENCODING 13720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0800 +EFC0 +A800 +AFE0 +AA80 +AAA0 +EAC0 +AA80 +0B40 +1220 +ENDCHAR +STARTCHAR U_3599 +ENCODING 13721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +1000 +7DE0 +1520 +2520 +4DE0 +8000 +7A40 +4A80 +4B20 +7BE0 +ENDCHAR +STARTCHAR U_359A +ENCODING 13722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +27E0 +6480 +A280 +2080 +2180 +7A40 +4A80 +4B00 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_359B +ENCODING 13723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +1000 +7F00 +4100 +7F00 +0000 +F480 +9700 +9440 +F7C0 +ENDCHAR +STARTCHAR U_359C +ENCODING 13724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +0000 +7F00 +4100 +7F00 +0000 +F480 +9700 +9440 +F7C0 +ENDCHAR +STARTCHAR U_359D +ENCODING 13725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +FFE0 +0E00 +3580 +C460 +7A00 +4A80 +4B20 +7BE0 +ENDCHAR +STARTCHAR U_359E +ENCODING 13726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0780 +0480 +E480 +A780 +A200 +AFC0 +AA40 +EB40 +8CC0 +0840 +08C0 +ENDCHAR +STARTCHAR U_359F +ENCODING 13727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0300 +EC20 +A920 +A4C0 +AFE0 +B020 +E7C0 +A480 +0300 +0CE0 +ENDCHAR +STARTCHAR U_35A0 +ENCODING 13728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +A440 +ABA0 +A000 +AFE0 +E100 +8540 +0920 +1320 +ENDCHAR +STARTCHAR U_35A1 +ENCODING 13729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +E480 +A8E0 +B920 +A9A0 +AA40 +ED40 +A880 +0940 +0A20 +ENDCHAR +STARTCHAR U_35A2 +ENCODING 13730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA80 +AA80 +AB80 +AAA0 +AEC0 +EA80 +AB80 +0EA0 +14E0 +ENDCHAR +STARTCHAR U_35A3 +ENCODING 13731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +A440 +A280 +AFE0 +A000 +E7C0 +A440 +0440 +07C0 +ENDCHAR +STARTCHAR U_35A4 +ENCODING 13732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +07C0 +E080 +A920 +AD60 +ABA0 +A920 +EBA0 +AD60 +0920 +0FE0 +ENDCHAR +STARTCHAR U_35A5 +ENCODING 13733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0FE0 +E8A0 +AF20 +A920 +AFE0 +A920 +EBA0 +AD60 +0920 +0FE0 +ENDCHAR +STARTCHAR U_35A6 +ENCODING 13734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A540 +A7C0 +A540 +E7C0 +A100 +0540 +0920 +ENDCHAR +STARTCHAR U_35A7 +ENCODING 13735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0900 +EFE0 +A880 +AC60 +A000 +AFC0 +E840 +AFC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_35A8 +ENCODING 13736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E040 +A7C0 +A040 +AFE0 +A100 +AD60 +E180 +A540 +0920 +0300 +ENDCHAR +STARTCHAR U_35A9 +ENCODING 13737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +EAE0 +AAA0 +AEA0 +AAA0 +AEA0 +EAA0 +AA40 +0E40 +12A0 +0320 +ENDCHAR +STARTCHAR U_35AA +ENCODING 13738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +E0A0 +BFE0 +A080 +AEA0 +AAA0 +AEC0 +E080 +A6A0 +1960 +0220 +ENDCHAR +STARTCHAR U_35AB +ENCODING 13739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +E100 +AFE0 +A440 +A920 +A3C0 +E640 +A980 +0340 +0C20 +ENDCHAR +STARTCHAR U_35AC +ENCODING 13740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E820 +AEE0 +A820 +AFE0 +A000 +EFE0 +A440 +0280 +0380 +0C60 +ENDCHAR +STARTCHAR U_35AD +ENCODING 13741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0FC0 +E200 +A200 +BFE0 +A500 +AAC0 +F220 +8B40 +12A0 +0600 +ENDCHAR +STARTCHAR U_35AE +ENCODING 13742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0300 +E480 +A840 +B7A0 +A000 +AFE0 +EAA0 +AFE0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_35AF +ENCODING 13743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8080 +FF80 +A280 +BE80 +8180 +0400 +F580 +9600 +9480 +F780 +ENDCHAR +STARTCHAR U_35B0 +ENCODING 13744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FA40 +8A80 +8B00 +FA40 +8BC0 +0000 +FFC0 +8040 +BF40 +9240 +9EC0 +ENDCHAR +STARTCHAR U_35B1 +ENCODING 13745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1200 +27C0 +EA40 +2580 +2300 +2CE0 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_35B2 +ENCODING 13746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +4920 +C920 +31E0 +CC00 +0160 +FD80 +8500 +8520 +FCE0 +ENDCHAR +STARTCHAR U_35B3 +ENCODING 13747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +8240 +4440 +2280 +4180 +8E40 +7D60 +4580 +4520 +7CE0 +ENDCHAR +STARTCHAR U_35B4 +ENCODING 13748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A800 +AFE0 +B2A0 +A2A0 +E4A0 +1920 +0220 +0C60 +ENDCHAR +STARTCHAR U_35B5 +ENCODING 13749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +A840 +AFC0 +E840 +1FE0 +0480 +0840 +ENDCHAR +STARTCHAR U_35B6 +ENCODING 13750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0280 +EFE0 +AAA0 +AEE0 +A820 +AFE0 +E100 +87C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_35B7 +ENCODING 13751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9000 +9FE0 +F100 +95C0 +0500 +0BE0 +ENDCHAR +STARTCHAR U_35B8 +ENCODING 13752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +E100 +AFE0 +A920 +AFC0 +A900 +ABC0 +AA00 +EFE0 +0A00 +13C0 +ENDCHAR +STARTCHAR U_35B9 +ENCODING 13753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E880 +B040 +AFA0 +A480 +A480 +A980 +FFC0 +1540 +1540 +3FE0 +ENDCHAR +STARTCHAR U_35BA +ENCODING 13754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +A7C0 +EC60 +17E0 +0440 +07C0 +ENDCHAR +STARTCHAR U_35BB +ENCODING 13755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E480 +BFE0 +A320 +A500 +AB00 +A100 +FFE0 +0380 +0540 +1920 +ENDCHAR +STARTCHAR U_35BC +ENCODING 13756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +A7C0 +A440 +A7C0 +A100 +AFE0 +E380 +0540 +1920 +ENDCHAR +STARTCHAR U_35BD +ENCODING 13757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +97E0 +9420 +97E0 +9420 +97E0 +9420 +F7E0 +0240 +0420 +ENDCHAR +STARTCHAR U_35BE +ENCODING 13758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +1100 +FFE0 +0400 +4440 +4440 +7FC0 +0800 +3000 +ENDCHAR +STARTCHAR U_35BF +ENCODING 13759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EAA0 +AAA0 +AEA0 +AAC0 +AEA0 +AAA0 +ABA0 +EEE0 +1280 +0280 +ENDCHAR +STARTCHAR U_35C0 +ENCODING 13760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0920 +EDA0 +AB60 +AFA0 +AB60 +ADA0 +EFE0 +A920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_35C1 +ENCODING 13761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +A000 +A7C0 +A000 +AFE0 +A200 +E7C0 +0040 +01C0 +ENDCHAR +STARTCHAR U_35C2 +ENCODING 13762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0540 +E5A0 +A920 +A3C0 +A640 +BBC0 +E240 +A3C0 +0240 +03C0 +ENDCHAR +STARTCHAR U_35C3 +ENCODING 13763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0840 +EFC0 +A900 +AFE0 +A880 +AFC0 +A840 +EFC0 +A840 +0FC0 +ENDCHAR +STARTCHAR U_35C4 +ENCODING 13764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +A200 +A100 +AFE0 +A200 +E3C0 +A440 +0440 +0980 +ENDCHAR +STARTCHAR U_35C5 +ENCODING 13765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +E4A0 +AEA0 +A4A0 +A4E0 +AEA0 +AAA0 +AAE0 +EEA0 +0120 +0260 +ENDCHAR +STARTCHAR U_35C6 +ENCODING 13766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +A7C0 +A100 +AFE0 +A920 +EFE0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_35C7 +ENCODING 13767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EA20 +AA20 +AEE0 +A800 +AEE0 +A8A0 +AE40 +E840 +08A0 +0920 +ENDCHAR +STARTCHAR U_35C8 +ENCODING 13768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0280 +EFE0 +A920 +AFE0 +A920 +AFE0 +E920 +AFE0 +0220 +0C40 +ENDCHAR +STARTCHAR U_35C9 +ENCODING 13769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F8A0 +20A0 +F920 +2F20 +F960 +2600 +1980 +FFE0 +1080 +1F80 +ENDCHAR +STARTCHAR U_35CA +ENCODING 13770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +F780 +9480 +9480 +F780 +0000 +F780 +9480 +9480 +F780 +9480 +ENDCHAR +STARTCHAR U_35CB +ENCODING 13771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E480 +AFE0 +AA00 +ABE0 +AA80 +AC80 +EBE0 +0880 +1140 +2620 +ENDCHAR +STARTCHAR U_35CC +ENCODING 13772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A7C0 +A280 +A440 +A7E0 +A100 +E7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_35CD +ENCODING 13773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A100 +AFE0 +A380 +A540 +BFE0 +A440 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_35CE +ENCODING 13774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1EE0 +EAA0 +AAA0 +B6E0 +A100 +BFE0 +A380 +E540 +1920 +0100 +ENDCHAR +STARTCHAR U_35CF +ENCODING 13775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A300 +A540 +A920 +A100 +AFE0 +A100 +E5C0 +0500 +1FE0 +ENDCHAR +STARTCHAR U_35D0 +ENCODING 13776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFE0 +A480 +AA40 +B120 +E000 +AFC0 +0A40 +0940 +1FE0 +ENDCHAR +STARTCHAR U_35D1 +ENCODING 13777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1BE0 +E880 +A9C0 +BC80 +A9C0 +EC80 +9BE0 +0880 +0880 +1080 +ENDCHAR +STARTCHAR U_35D2 +ENCODING 13778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E000 +AFC0 +A840 +AFC0 +E220 +A540 +0C80 +1540 +0620 +ENDCHAR +STARTCHAR U_35D3 +ENCODING 13779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +0900 +EBC0 +A240 +BBC0 +AA00 +ABE0 +EA20 +ABE0 +0C00 +13E0 +ENDCHAR +STARTCHAR U_35D4 +ENCODING 13780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +F100 +97E0 +9520 +97C0 +9520 +97E0 +F540 +9540 +0480 +0B60 +ENDCHAR +STARTCHAR U_35D5 +ENCODING 13781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +A7C0 +A280 +AFE0 +A540 +E7C0 +A540 +0FE0 +0440 +ENDCHAR +STARTCHAR U_35D6 +ENCODING 13782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0300 +EC20 +A540 +A000 +ACE0 +A820 +AEE0 +E820 +AFE0 +0820 +ENDCHAR +STARTCHAR U_35D7 +ENCODING 13783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9540 +97C0 +F540 +47C0 +F200 +5500 +5FE0 +5100 +B100 +ENDCHAR +STARTCHAR U_35D8 +ENCODING 13784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0120 +EFE0 +A540 +A7C0 +A540 +A7C0 +E540 +BFE0 +0440 +0240 +00C0 +ENDCHAR +STARTCHAR U_35D9 +ENCODING 13785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +EAA0 +A3E0 +A120 +A400 +E7E0 +AAA0 +13E0 +0120 +0640 +ENDCHAR +STARTCHAR U_35DA +ENCODING 13786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A100 +EFE0 +A300 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_35DB +ENCODING 13787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +07E0 +EA40 +B000 +A1C0 +A700 +E100 +AFE0 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_35DC +ENCODING 13788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E240 +A680 +A140 +A640 +AFE0 +E920 +AFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_35DD +ENCODING 13789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A100 +A7C0 +A100 +E100 +AFE0 +0000 +0AA0 +0AA0 +ENDCHAR +STARTCHAR U_35DE +ENCODING 13790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +3E40 +11E0 +F140 +BDE0 +B5A0 +F5A0 +BDA0 +1140 +2240 +04A0 +ENDCHAR +STARTCHAR U_35DF +ENCODING 13791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8200 +5FC0 +0200 +CF80 +2200 +DFC0 +4480 +F500 +9600 +F440 +97C0 +ENDCHAR +STARTCHAR U_35E0 +ENCODING 13792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4BE0 +9220 +D3E0 +3220 +C800 +0260 +FA80 +8B20 +FBE0 +ENDCHAR +STARTCHAR U_35E1 +ENCODING 13793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1100 +FFC0 +1200 +2F00 +6500 +A580 +2880 +3180 +7A40 +4A80 +7BC0 +ENDCHAR +STARTCHAR U_35E2 +ENCODING 13794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +0880 +FE80 +A9E0 +BEA0 +AAA0 +BEA0 +EAA0 +BEA0 +0920 +3E60 +ENDCHAR +STARTCHAR U_35E3 +ENCODING 13795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +EFE0 +A540 +AB60 +A000 +AFE0 +A920 +E7C0 +A540 +05C0 +0100 +ENDCHAR +STARTCHAR U_35E4 +ENCODING 13796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4900 +4D40 +4940 +7E80 +ACA0 +5B60 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_35E5 +ENCODING 13797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0EE0 +E0A0 +AEA0 +AAC0 +AEC0 +A0A0 +EEA0 +02E0 +1F80 +0480 +ENDCHAR +STARTCHAR U_35E6 +ENCODING 13798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +2AE0 +EAA0 +BAA0 +AAA0 +BAA0 +ABA0 +EEE0 +3980 +0980 +0A80 +ENDCHAR +STARTCHAR U_35E7 +ENCODING 13799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AAA0 +A440 +A7C0 +A240 +A7E0 +A100 +E7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_35E8 +ENCODING 13800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A140 +BE60 +D1C0 +FD40 +A880 +FD60 +0000 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_35E9 +ENCODING 13801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E220 +AAA0 +A660 +AAA0 +A100 +AFE0 +E820 +AFE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_35EA +ENCODING 13802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EBC0 +AA80 +BFA0 +A460 +AF80 +A240 +EFE0 +A100 +0940 +1320 +ENDCHAR +STARTCHAR U_35EB +ENCODING 13803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EEE0 +AAA0 +B640 +AC40 +ABA0 +B000 +AFE0 +E100 +0940 +1320 +ENDCHAR +STARTCHAR U_35EC +ENCODING 13804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +A0A0 +3F80 +0800 +1F00 +6600 +1900 +67C0 +1900 +3E00 +ENDCHAR +STARTCHAR U_35ED +ENCODING 13805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +EF00 +A540 +A380 +AFE0 +A540 +A920 +A000 +E540 +1560 +17C0 +ENDCHAR +STARTCHAR U_35EE +ENCODING 13806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +77E0 +9500 +77C0 +2540 +77E0 +D540 +57C0 +5500 +7A80 +0C60 +ENDCHAR +STARTCHAR U_35EF +ENCODING 13807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7F80 +0500 +FFE0 +3080 +DF80 +1080 +1FA0 +7DC0 +4520 +7CE0 +ENDCHAR +STARTCHAR U_35F0 +ENCODING 13808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +0940 +F6A0 +A800 +B880 +AA80 +AAE0 +AA80 +EA80 +0B80 +0C60 +ENDCHAR +STARTCHAR U_35F1 +ENCODING 13809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0BE0 +F900 +ABC0 +A900 +ABC0 +A100 +AFE0 +E380 +0540 +0920 +ENDCHAR +STARTCHAR U_35F2 +ENCODING 13810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +E140 +AFE0 +A140 +AFE0 +A540 +A7C0 +E540 +A7C0 +0FE0 +ENDCHAR +STARTCHAR U_35F3 +ENCODING 13811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0EE0 +F540 +A100 +A280 +A440 +BBA0 +E000 +A7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_35F4 +ENCODING 13812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +AAA0 +AEE0 +ABA0 +AAA0 +EBA0 +AAA0 +0BA0 +0EE0 +ENDCHAR +STARTCHAR U_35F5 +ENCODING 13813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +1D00 +EBE0 +A8A0 +B480 +A080 +A880 +BD40 +E940 +A920 +1620 +ENDCHAR +STARTCHAR U_35F6 +ENCODING 13814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EC0 +0B60 +E4C0 +A820 +BEE0 +A2A0 +AF20 +E8E0 +AEA0 +0240 +06A0 +ENDCHAR +STARTCHAR U_35F7 +ENCODING 13815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FE0 +EAA0 +A7C0 +A280 +A7C0 +A280 +FFE0 +A540 +0540 +0EE0 +ENDCHAR +STARTCHAR U_35F8 +ENCODING 13816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EAE0 +B700 +AAE0 +AA40 +BF40 +AA40 +AB40 +EF40 +A840 +08C0 +ENDCHAR +STARTCHAR U_35F9 +ENCODING 13817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0BE0 +F880 +ABE0 +A880 +ABE0 +A880 +EBE0 +AA40 +1560 +13C0 +ENDCHAR +STARTCHAR U_35FA +ENCODING 13818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +AFE0 +A280 +A440 +BAA0 +AEE0 +E280 +AEE0 +0280 +0EE0 +ENDCHAR +STARTCHAR U_35FB +ENCODING 13819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +0920 +E1E0 +BDA0 +ABE0 +AAA0 +AAA0 +EAE0 +BA20 +0C20 +03E0 +ENDCHAR +STARTCHAR U_35FC +ENCODING 13820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +06C0 +EFE0 +A280 +AFE0 +A100 +A7C0 +E100 +AFE0 +0380 +0D60 +ENDCHAR +STARTCHAR U_35FD +ENCODING 13821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5EE0 +F2A0 +5EC0 +F2A0 +3EE0 +5480 +9A80 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_35FE +ENCODING 13822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15C0 +FF40 +B540 +BD40 +A960 +BFC0 +AB40 +FF40 +A940 +1D40 +0960 +ENDCHAR +STARTCHAR U_35FF +ENCODING 13823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +AAA0 +AFE0 +A8A0 +ABA0 +EAA0 +ABA0 +08A0 +09E0 +ENDCHAR +STARTCHAR U_3600 +ENCODING 13824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0EE0 +E820 +AEE0 +A820 +AEE0 +A540 +EFE0 +0540 +0540 +0920 +ENDCHAR +STARTCHAR U_3601 +ENCODING 13825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +A100 +A7C0 +A100 +AFE0 +E280 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_3602 +ENCODING 13826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E440 +AAA0 +A440 +A9A0 +AEC0 +E100 +1420 +24A0 +0780 +ENDCHAR +STARTCHAR U_3603 +ENCODING 13827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E200 +BFE0 +A200 +A7C0 +AC40 +F7C0 +A520 +0CA0 +0BC0 +ENDCHAR +STARTCHAR U_3604 +ENCODING 13828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +EAA0 +BEA0 +ABE0 +AC80 +BBE0 +A900 +E9E0 +0920 +0A20 +0CC0 +ENDCHAR +STARTCHAR U_3605 +ENCODING 13829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +6AE0 +1100 +EEE0 +A440 +BF40 +A440 +EE40 +2440 +2640 +38C0 +ENDCHAR +STARTCHAR U_3606 +ENCODING 13830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E100 +A7C0 +A440 +AFE0 +AAA0 +A440 +E7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_3607 +ENCODING 13831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +1DC0 +0880 +F540 +BFE0 +A220 +AFC0 +E200 +0A80 +0A40 +1240 +ENDCHAR +STARTCHAR U_3608 +ENCODING 13832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +EE40 +A880 +A7E0 +A8A0 +AE80 +B4E0 +EE80 +0580 +0A80 +1460 +ENDCHAR +STARTCHAR U_3609 +ENCODING 13833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +1EE0 +E540 +BDE0 +A520 +BD20 +A520 +FD20 +2160 +2920 +3500 +ENDCHAR +STARTCHAR U_360A +ENCODING 13834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0200 +FFE0 +AAA0 +AFC0 +A000 +AFC0 +E000 +0FC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_360B +ENCODING 13835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFA0 +A940 +AFA0 +AAA0 +AFE0 +E540 +0540 +07C0 +0820 +ENDCHAR +STARTCHAR U_360C +ENCODING 13836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +0820 +FF20 +AAA0 +BEA0 +A0A0 +BFA0 +ECA0 +3520 +2E20 +5560 +ENDCHAR +STARTCHAR U_360D +ENCODING 13837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0E60 +F540 +A7E0 +AA40 +BF40 +AA60 +EF40 +0AC0 +0F40 +0820 +ENDCHAR +STARTCHAR U_360E +ENCODING 13838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +1020 +EEA0 +A2E0 +BF20 +AAA0 +AE60 +EA60 +3EA0 +2320 +2260 +ENDCHAR +STARTCHAR U_360F +ENCODING 13839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +C480 +1FE0 +C400 +4FC0 +4940 +4FC0 +7000 +8FE0 +3A40 +2AA0 +3BE0 +ENDCHAR +STARTCHAR U_3610 +ENCODING 13840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +0AE0 +EFA0 +AA00 +AFA0 +AAA0 +AF40 +E140 +0D40 +32A0 +04A0 +ENDCHAR +STARTCHAR U_3611 +ENCODING 13841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +1DE0 +E8A0 +BDE0 +AAA0 +A1E0 +BC80 +EAA0 +1DC0 +2AA0 +1980 +ENDCHAR +STARTCHAR U_3612 +ENCODING 13842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +E380 +2080 +FFE0 +72A0 +ABE0 +2080 +FFE0 +8A40 +8AA0 +FBE0 +ENDCHAR +STARTCHAR U_3613 +ENCODING 13843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +A920 +AFE0 +AD60 +AFE0 +E920 +0BA0 +0D20 +0960 +ENDCHAR +STARTCHAR U_3614 +ENCODING 13844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +0AA0 +E7C0 +A280 +A7C0 +AD60 +B6C0 +E540 +0280 +0C60 +ENDCHAR +STARTCHAR U_3615 +ENCODING 13845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +AE80 +AAE0 +AE80 +EAE0 +0E80 +0FC0 +0A40 +1FE0 +ENDCHAR +STARTCHAR U_3616 +ENCODING 13846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1FE0 +F280 +ADE0 +BF60 +B5A0 +BB60 +B5A0 +FBE0 +14C0 +2920 +ENDCHAR +STARTCHAR U_3617 +ENCODING 13847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +0AA0 +EEE0 +AAA0 +AEE0 +AAA0 +A7E0 +EC80 +17E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_3618 +ENCODING 13848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4E80 +F1E0 +2E40 +50A0 +FFE0 +4A40 +AAA0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3619 +ENCODING 13849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DC0 +1540 +FFE0 +A480 +BEE0 +AB20 +AEA0 +EAA0 +2E40 +5A40 +42A0 +ENDCHAR +STARTCHAR U_361A +ENCODING 13850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +2520 +FDE0 +A520 +BEA0 +ABE0 +AE60 +EB60 +3EA0 +2360 +2020 +ENDCHAR +STARTCHAR U_361B +ENCODING 13851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +1860 +EFC0 +A840 +AFE0 +AAA0 +BFE0 +AA80 +EEE0 +0A80 +16E0 +ENDCHAR +STARTCHAR U_361C +ENCODING 13852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +A540 +FFE0 +A140 +FFE0 +AB40 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_361D +ENCODING 13853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BF20 +8120 +9120 +8A20 +8420 +8B20 +B120 +8020 +FFE0 +ENDCHAR +STARTCHAR U_361E +ENCODING 13854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8420 +BFA0 +84A0 +88A0 +88A0 +92A0 +A120 +8020 +FFE0 +ENDCHAR +STARTCHAR U_361F +ENCODING 13855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +8920 +8920 +BFE0 +8920 +8920 +8920 +9120 +A120 +FFE0 +ENDCHAR +STARTCHAR U_3620 +ENCODING 13856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8820 +8520 +9120 +B220 +D4A0 +9960 +9160 +EF20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_3621 +ENCODING 13857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +A4A0 +BFA0 +A4A0 +BFA0 +8420 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_3622 +ENCODING 13858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +A4A0 +9520 +BFA0 +8A20 +8A20 +8A20 +92A0 +A1A0 +FFE0 +ENDCHAR +STARTCHAR U_3623 +ENCODING 13859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +9F20 +8020 +9F20 +9120 +9F20 +9120 +9F20 +9320 +FFE0 +ENDCHAR +STARTCHAR U_3624 +ENCODING 13860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +D560 +BDE0 +D060 +BFE0 +9060 +BDE0 +D560 +E560 +FFE0 +ENDCHAR +STARTCHAR U_3625 +ENCODING 13861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +BDA0 +EAA0 +D120 +A2A0 +FD60 +93A0 +FDA0 +9360 +D520 +FFE0 +ENDCHAR +STARTCHAR U_3626 +ENCODING 13862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2100 +27E0 +F920 +2120 +2120 +2920 +3220 +C220 +04A0 +0840 +ENDCHAR +STARTCHAR U_3627 +ENCODING 13863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +2280 +F100 +2FE0 +2120 +2100 +2100 +3100 +C500 +0300 +ENDCHAR +STARTCHAR U_3628 +ENCODING 13864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4100 +4FE0 +E920 +4920 +4AA0 +6A60 +4C60 +8820 +0820 +0860 +ENDCHAR +STARTCHAR U_3629 +ENCODING 13865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4880 +4880 +E880 +4EE0 +4880 +4880 +6880 +CA80 +0CA0 +08E0 +ENDCHAR +STARTCHAR U_362A +ENCODING 13866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +21C0 +F700 +2100 +21E0 +2700 +3100 +C120 +00E0 +ENDCHAR +STARTCHAR U_362B +ENCODING 13867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2FE0 +F280 +2280 +2FE0 +2280 +3280 +E280 +0480 +0880 +ENDCHAR +STARTCHAR U_362C +ENCODING 13868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4400 +4FE0 +E820 +5220 +4220 +44A0 +4FA0 +6020 +80A0 +0040 +ENDCHAR +STARTCHAR U_362D +ENCODING 13869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +2420 +F920 +2E20 +2220 +2420 +3420 +E920 +0F20 +0060 +ENDCHAR +STARTCHAR U_362E +ENCODING 13870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +F440 +27C0 +2500 +2500 +2480 +3480 +C840 +1020 +ENDCHAR +STARTCHAR U_362F +ENCODING 13871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +F500 +2900 +27E0 +2120 +3220 +E220 +04A0 +1840 +ENDCHAR +STARTCHAR U_3630 +ENCODING 13872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +2280 +F080 +2480 +2280 +20E0 +2780 +3080 +C080 +0080 +ENDCHAR +STARTCHAR U_3631 +ENCODING 13873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F540 +2540 +27C0 +2540 +3540 +CFE0 +0440 +04C0 +ENDCHAR +STARTCHAR U_3632 +ENCODING 13874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +4840 +EFC0 +4A00 +4F80 +4A80 +4A80 +6AA0 +D4A0 +2860 +ENDCHAR +STARTCHAR U_3633 +ENCODING 13875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A60 +FB80 +0A00 +0A20 +3A20 +C9E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3634 +ENCODING 13876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7480 +5480 +5480 +7540 +5620 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3635 +ENCODING 13877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +5FE0 +E500 +4900 +5FE0 +6920 +4920 +6920 +C960 +0100 +ENDCHAR +STARTCHAR U_3636 +ENCODING 13878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3BE0 +4880 +AA80 +13E0 +2080 +C480 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3637 +ENCODING 13879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +F000 +2440 +2440 +2280 +2280 +3100 +C280 +0C60 +ENDCHAR +STARTCHAR U_3638 +ENCODING 13880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2200 +7A40 +8B80 +5220 +2220 +C1E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3639 +ENCODING 13881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1120 +5D40 +5180 +5120 +5D20 +E0E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_363A +ENCODING 13882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +4280 +44E0 +E580 +4CA0 +54A0 +44C0 +44C0 +64A0 +C560 +0620 +ENDCHAR +STARTCHAR U_363B +ENCODING 13883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +F920 +2FE0 +2920 +2920 +2AA0 +3AA0 +CC60 +0FE0 +ENDCHAR +STARTCHAR U_363C +ENCODING 13884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27A0 +F140 +2FE0 +2100 +23E0 +2600 +2BE0 +3020 +C020 +00C0 +ENDCHAR +STARTCHAR U_363D +ENCODING 13885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +1100 +1120 +7CA0 +10C0 +14A0 +F960 +4220 +ENDCHAR +STARTCHAR U_363E +ENCODING 13886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +F7C0 +2100 +2100 +2FE0 +2100 +3100 +C100 +0300 +ENDCHAR +STARTCHAR U_363F +ENCODING 13887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2440 +27C0 +2100 +27C0 +3100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_3640 +ENCODING 13888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +4AA0 +E280 +4C60 +4200 +47C0 +4240 +6240 +8440 +0860 +ENDCHAR +STARTCHAR U_3641 +ENCODING 13889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47E0 +4800 +F7C0 +4540 +5FE0 +4640 +4940 +6FE0 +C140 +0080 +ENDCHAR +STARTCHAR U_3642 +ENCODING 13890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +4440 +4820 +F7C0 +4440 +4440 +57C0 +6280 +C480 +84A0 +18E0 +ENDCHAR +STARTCHAR U_3643 +ENCODING 13891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +4700 +4400 +E7C0 +4480 +4480 +4480 +6FE0 +C280 +8440 +0820 +ENDCHAR +STARTCHAR U_3644 +ENCODING 13892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4EE0 +4880 +EA80 +4CE0 +4100 +4100 +47C0 +6100 +8100 +0FE0 +ENDCHAR +STARTCHAR U_3645 +ENCODING 13893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4F80 +4880 +4880 +EF80 +4200 +5FC0 +4200 +6A80 +4A40 +9240 +0200 +ENDCHAR +STARTCHAR U_3646 +ENCODING 13894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2820 +F100 +2FE0 +2100 +2200 +3280 +C480 +0920 +13E0 +ENDCHAR +STARTCHAR U_3647 +ENCODING 13895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FB20 +24C0 +2380 +2B80 +34C0 +C1C0 +02A0 +0C80 +0100 +ENDCHAR +STARTCHAR U_3648 +ENCODING 13896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +41C0 +4100 +4FE0 +E920 +4F80 +4900 +48C0 +6A80 +92A0 +1460 +ENDCHAR +STARTCHAR U_3649 +ENCODING 13897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +4500 +5FC0 +5540 +5FC0 +F540 +5540 +7FE0 +4880 +6840 +D040 +ENDCHAR +STARTCHAR U_364A +ENCODING 13898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4400 +4780 +E400 +4780 +4400 +5FE0 +4A40 +6980 +8A80 +0C60 +ENDCHAR +STARTCHAR U_364B +ENCODING 13899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +4480 +4FC0 +E480 +4780 +4480 +4780 +6480 +DFE0 +0480 +0840 +ENDCHAR +STARTCHAR U_364C +ENCODING 13900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +47C0 +4140 +EFE0 +4140 +47C0 +4540 +4540 +67C0 +8540 +0940 +ENDCHAR +STARTCHAR U_364D +ENCODING 13901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +4220 +4B40 +E480 +5B60 +4000 +5FE0 +5320 +6AA0 +8440 +1BA0 +ENDCHAR +STARTCHAR U_364E +ENCODING 13902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +5FE0 +F080 +5E80 +5480 +5FA0 +55A0 +5AC0 +7480 +DB60 +2220 +ENDCHAR +STARTCHAR U_364F +ENCODING 13903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47E0 +5800 +E7C0 +4440 +47C0 +4440 +47C0 +6E40 +8180 +0E60 +ENDCHAR +STARTCHAR U_3650 +ENCODING 13904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4920 +4FE0 +E000 +4FE0 +4200 +4FE0 +6AA0 +8AA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_3651 +ENCODING 13905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +3F80 +2480 +7FC0 +4440 +5B40 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3652 +ENCODING 13906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A940 +A880 +FFE0 +A8A0 +AAC0 +F980 +0480 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3653 +ENCODING 13907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +2080 +FBC0 +3080 +E5E0 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3654 +ENCODING 13908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4780 +4280 +EFC0 +4480 +4780 +4100 +6780 +8500 +1FE0 +0100 +ENDCHAR +STARTCHAR U_3655 +ENCODING 13909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +4920 +4FE0 +E920 +4FE0 +4000 +47C0 +6640 +85C0 +0740 +08C0 +ENDCHAR +STARTCHAR U_3656 +ENCODING 13910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +4E00 +4200 +EFC0 +4A40 +4FC0 +4200 +7FE0 +9220 +13A0 +1460 +ENDCHAR +STARTCHAR U_3657 +ENCODING 13911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4540 +47C0 +E540 +47C0 +4000 +4FE0 +6500 +8540 +0480 +0660 +ENDCHAR +STARTCHAR U_3658 +ENCODING 13912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4280 +4FE0 +EAA0 +4FE0 +4200 +4FE0 +6280 +8480 +0300 +0CE0 +ENDCHAR +STARTCHAR U_3659 +ENCODING 13913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8240 +5FE0 +0480 +C540 +0A80 +2A40 +D1E0 +8400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_365A +ENCODING 13914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +4FE0 +4100 +E7C0 +4100 +4FE0 +4100 +67C0 +8900 +1FE0 +0100 +ENDCHAR +STARTCHAR U_365B +ENCODING 13915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +4FE0 +4100 +EFE0 +4920 +4FE0 +4920 +6040 +8FE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_365C +ENCODING 13916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +FF80 +2200 +3E00 +0000 +FFC0 +A440 +88C0 +3E00 +0800 +FFC0 +ENDCHAR +STARTCHAR U_365D +ENCODING 13917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FC0 +4440 +FFE0 +4AA0 +57E0 +4440 +67C0 +8440 +07C0 +0440 +ENDCHAR +STARTCHAR U_365E +ENCODING 13918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0200 +4F80 +4880 +EF80 +4880 +4F80 +4200 +6FC0 +8200 +0A80 +1240 +ENDCHAR +STARTCHAR U_365F +ENCODING 13919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4EE0 +4AA0 +EEA0 +4AE0 +4EA0 +48E0 +6AA0 +8AA0 +0CA0 +0960 +ENDCHAR +STARTCHAR U_3660 +ENCODING 13920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A140 +BA20 +D1C0 +FD40 +A880 +FF60 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3661 +ENCODING 13921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4940 +F540 +49C0 +5AA0 +4800 +4A80 +6AE0 +4A80 +8B80 +0C60 +ENDCHAR +STARTCHAR U_3662 +ENCODING 13922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0500 +0F80 +4500 +E200 +5FC0 +7240 +9740 +1AC0 +12C0 +0200 +ENDCHAR +STARTCHAR U_3663 +ENCODING 13923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +4500 +45C0 +ED00 +51C0 +5100 +5FE0 +6520 +C5C0 +1540 +0DA0 +ENDCHAR +STARTCHAR U_3664 +ENCODING 13924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +4100 +4FE0 +E940 +4BE0 +48C0 +4BA0 +4AC0 +6FE0 +8880 +1380 +ENDCHAR +STARTCHAR U_3665 +ENCODING 13925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +EFE0 +4440 +47C0 +4300 +4520 +6CC0 +9640 +0420 +ENDCHAR +STARTCHAR U_3666 +ENCODING 13926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5180 +FA80 +2180 +FFE0 +7080 +AC80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3667 +ENCODING 13927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2280 +2EE0 +FAA0 +2EE0 +2280 +27C0 +3540 +C7C0 +0540 +07C0 +ENDCHAR +STARTCHAR U_3668 +ENCODING 13928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +4940 +5DE0 +EB40 +5FE0 +4140 +5FE0 +4900 +6940 +CCA0 +1360 +ENDCHAR +STARTCHAR U_3669 +ENCODING 13929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4AA0 +E440 +4FE0 +4440 +47C0 +4440 +67C0 +8540 +0B20 +ENDCHAR +STARTCHAR U_366A +ENCODING 13930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4100 +EFE0 +4820 +47C0 +4440 +47C0 +6440 +8280 +0FE0 +ENDCHAR +STARTCHAR U_366B +ENCODING 13931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +5FE0 +4900 +EFE0 +4900 +4FE0 +4900 +5FE0 +6380 +8540 +0920 +ENDCHAR +STARTCHAR U_366C +ENCODING 13932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10A0 +FFE0 +5480 +BA80 +1080 +3940 +D620 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_366D +ENCODING 13933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +5540 +52E0 +FFA0 +5240 +5AC0 +5FC0 +5240 +7440 +94A0 +2920 +ENDCHAR +STARTCHAR U_366E +ENCODING 13934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4EE0 +5540 +E100 +4280 +4440 +5BA0 +4000 +67C0 +8440 +07C0 +ENDCHAR +STARTCHAR U_366F +ENCODING 13935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +23C0 +DB40 +7140 +22E0 +7FC0 +0000 +FFE0 +1100 +3F80 +ENDCHAR +STARTCHAR U_3670 +ENCODING 13936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73E0 +9120 +FA60 +AA80 +FBC0 +AC80 +FBE0 +8C80 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3671 +ENCODING 13937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +5100 +FFE0 +4580 +77E0 +1540 +6B60 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3672 +ENCODING 13938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +5FE0 +4480 +EB40 +5DE0 +4540 +4BE0 +5D40 +65E0 +8940 +11E0 +ENDCHAR +STARTCHAR U_3673 +ENCODING 13939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +5FE0 +5080 +F7A0 +50A0 +5740 +55A0 +6740 +5440 +9AA0 +27A0 +ENDCHAR +STARTCHAR U_3674 +ENCODING 13940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4480 +EFE0 +4A40 +4FE0 +4800 +4BC0 +4800 +6BC0 +8A40 +13C0 +ENDCHAR +STARTCHAR U_3675 +ENCODING 13941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +4280 +EFE0 +4AA0 +4BA0 +4860 +4920 +67C0 +C100 +1FE0 +ENDCHAR +STARTCHAR U_3676 +ENCODING 13942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +2480 +1500 +FFE0 +9120 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3677 +ENCODING 13943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +EFE0 +4820 +4FE0 +4440 +4EE0 +4440 +6EE0 +8540 +0AA0 +ENDCHAR +STARTCHAR U_3678 +ENCODING 13944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +4B60 +5940 +EBE0 +4940 +4BE0 +4880 +69C0 +8880 +0BE0 +0940 +ENDCHAR +STARTCHAR U_3679 +ENCODING 13945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5CE0 +4480 +EFE0 +4AA0 +5FE0 +5220 +65C0 +4A80 +8100 +0E00 +ENDCHAR +STARTCHAR U_367A +ENCODING 13946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +5100 +57C0 +F540 +5FE0 +5440 +57C0 +7440 +57C0 +9280 +1FE0 +ENDCHAR +STARTCHAR U_367B +ENCODING 13947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F540 +57C0 +5540 +57C0 +5540 +7BA0 +57C0 +9100 +2FE0 +ENDCHAR +STARTCHAR U_367C +ENCODING 13948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4540 +47C0 +E540 +47C0 +4000 +4FE0 +6AA0 +4FE0 +8AA0 +0FE0 +ENDCHAR +STARTCHAR U_367D +ENCODING 13949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4200 +5FE0 +4A40 +FEE0 +56A0 +5EE0 +56A0 +7FE0 +C280 +1C60 +ENDCHAR +STARTCHAR U_367E +ENCODING 13950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +4540 +46C0 +E540 +46C0 +4FE0 +5120 +6FC0 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_367F +ENCODING 13951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +5FE0 +4100 +EFC0 +4100 +5FE0 +4540 +7FE0 +4EA0 +9540 +0EA0 +ENDCHAR +STARTCHAR U_3680 +ENCODING 13952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0640 +4460 +5FE0 +F640 +5F40 +5040 +5FC0 +5560 +7740 +95C0 +2F20 +ENDCHAR +STARTCHAR U_3681 +ENCODING 13953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +71C0 +2080 +FBE0 +5140 +FBE0 +5140 +FFE0 +5140 +5940 +9260 +ENDCHAR +STARTCHAR U_3682 +ENCODING 13954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +4540 +EFE0 +4D60 +47C0 +4540 +6FE0 +8540 +0C80 +0660 +ENDCHAR +STARTCHAR U_3683 +ENCODING 13955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +1F00 +0000 +FFE0 +AAA0 +2E80 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_3684 +ENCODING 13956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +A4A0 +3F80 +2480 +7FC0 +2740 +3400 +CFE0 +ENDCHAR +STARTCHAR U_3685 +ENCODING 13957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +7100 +0E00 +1100 +EEE0 +1400 +3F80 +4400 +1F00 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3686 +ENCODING 13958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +6900 +0600 +FDE0 +ENDCHAR +STARTCHAR U_3687 +ENCODING 13959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +4640 +5940 +7FC0 +1080 +2840 +DFA0 +3080 +4900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_3688 +ENCODING 13960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3C80 +4480 +C880 +2BE0 +1080 +1080 +2080 +4080 +8080 +0080 +ENDCHAR +STARTCHAR U_3689 +ENCODING 13961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +10E0 +2820 +DF60 +2A00 +0400 +0A00 +3780 +0C80 +0300 +3E00 +ENDCHAR +STARTCHAR U_368A +ENCODING 13962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +C880 +3100 +2240 +5180 +B920 +4A40 +B480 +2140 +C620 +ENDCHAR +STARTCHAR U_368B +ENCODING 13963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +9BA0 +6920 +4FE0 +C820 +7BA0 +9AA0 +6BA0 +4820 +9060 +ENDCHAR +STARTCHAR U_368C +ENCODING 13964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F540 +57C0 +2540 +47C0 +A100 +7FE0 +D300 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_368D +ENCODING 13965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +D540 +2FE0 +4440 +C7C0 +7440 +D7C0 +2440 +47C0 +8820 +ENDCHAR +STARTCHAR U_368E +ENCODING 13966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0840 +FFE0 +1200 +2100 +4080 +8060 +2080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_368F +ENCODING 13967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1100 +2080 +4040 +9120 +1100 +FFE0 +1100 +1100 +2100 +ENDCHAR +STARTCHAR U_3690 +ENCODING 13968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +3180 +C460 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_3691 +ENCODING 13969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +3F80 +0400 +0800 +FFE0 +1200 +2180 +C060 +ENDCHAR +STARTCHAR U_3692 +ENCODING 13970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +4500 +2480 +5540 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_3693 +ENCODING 13971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +3180 +C460 +0400 +FFE0 +0E00 +3580 +C460 +ENDCHAR +STARTCHAR U_3694 +ENCODING 13972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +3180 +CA60 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3695 +ENCODING 13973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +6AC0 +BFA0 +0A80 +3F80 +2A00 +3FC0 +1240 +2280 +ENDCHAR +STARTCHAR U_3696 +ENCODING 13974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4040 +7FC0 +4040 +7FC0 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_3697 +ENCODING 13975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +3180 +5F40 +9120 +1F00 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_3698 +ENCODING 13976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +FBE0 +2080 +FBE0 +2080 +2140 +5140 +4A20 +8420 +ENDCHAR +STARTCHAR U_3699 +ENCODING 13977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +2A20 +4A20 +9BE0 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_369A +ENCODING 13978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +2480 +CF60 +3200 +0C00 +3000 +DF80 +1080 +1F80 +ENDCHAR +STARTCHAR U_369B +ENCODING 13979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +20E0 +DE00 +1080 +1F80 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_369C +ENCODING 13980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2280 +C360 +FFE0 +4A80 +7A80 +0100 +3AA0 +C460 +ENDCHAR +STARTCHAR U_369D +ENCODING 13981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2280 +D760 +2200 +6FC0 +A200 +2780 +2200 +2FC0 +ENDCHAR +STARTCHAR U_369E +ENCODING 13982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +D160 +7BC0 +1100 +3B80 +3540 +5140 +1100 +ENDCHAR +STARTCHAR U_369F +ENCODING 13983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7F80 +A080 +3F80 +2220 +31E0 +0400 +FFE0 +1100 +60E0 +ENDCHAR +STARTCHAR U_36A0 +ENCODING 13984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +60C0 +9120 +7FC0 +0400 +3F80 +0400 +FFE0 +8920 +ENDCHAR +STARTCHAR U_36A1 +ENCODING 13985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +5140 +8A20 +FFE0 +0820 +EBA0 +AAA0 +EBA0 +0820 +1860 +ENDCHAR +STARTCHAR U_36A2 +ENCODING 13986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +2100 +6FE0 +A240 +2480 +2280 +2100 +22C0 +2C20 +ENDCHAR +STARTCHAR U_36A3 +ENCODING 13987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +7180 +0400 +FFE0 +0900 +1A00 +0700 +78E0 +ENDCHAR +STARTCHAR U_36A4 +ENCODING 13988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2100 +F9E0 +4B00 +5100 +9100 +5080 +20A0 +5060 +8820 +ENDCHAR +STARTCHAR U_36A5 +ENCODING 13989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2080 +F880 +4880 +57E0 +9080 +5080 +2080 +5080 +8980 +ENDCHAR +STARTCHAR U_36A6 +ENCODING 13990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2140 +F940 +4940 +5140 +9140 +5140 +2240 +5240 +8440 +ENDCHAR +STARTCHAR U_36A7 +ENCODING 13991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +23E0 +FA00 +4A00 +5200 +9200 +5200 +2200 +5400 +8400 +ENDCHAR +STARTCHAR U_36A8 +ENCODING 13992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +2280 +FA80 +4A80 +5780 +9280 +52A0 +22A0 +5260 +8A20 +ENDCHAR +STARTCHAR U_36A9 +ENCODING 13993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +4FE0 +5240 +9240 +57E0 +2240 +5240 +8AC0 +ENDCHAR +STARTCHAR U_36AA +ENCODING 13994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2100 +F9E0 +4F00 +5100 +91E0 +5700 +2120 +5120 +89E0 +ENDCHAR +STARTCHAR U_36AB +ENCODING 13995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FC0 +2440 +F480 +55E0 +5420 +9640 +5540 +2480 +5940 +8A20 +ENDCHAR +STARTCHAR U_36AC +ENCODING 13996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FA20 +4D20 +50A0 +9020 +50A0 +2320 +5020 +88E0 +ENDCHAR +STARTCHAR U_36AD +ENCODING 13997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2100 +FFE0 +4900 +5180 +9280 +5280 +2280 +54A0 +88E0 +ENDCHAR +STARTCHAR U_36AE +ENCODING 13998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2420 +F800 +4BC0 +5240 +9240 +5240 +2240 +5440 +8860 +ENDCHAR +STARTCHAR U_36AF +ENCODING 13999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +24C0 +FEC0 +4D40 +5540 +96C0 +5440 +2460 +5420 +8820 +ENDCHAR +STARTCHAR U_36B0 +ENCODING 14000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +F900 +4B40 +5320 +9520 +5900 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_36B1 +ENCODING 14001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2300 +2200 +FA00 +4BE0 +5280 +9280 +5280 +2280 +5280 +87E0 +ENDCHAR +STARTCHAR U_36B2 +ENCODING 14002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +F9E0 +4900 +5100 +97E0 +5420 +2420 +5420 +87E0 +ENDCHAR +STARTCHAR U_36B3 +ENCODING 14003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2780 +FAE0 +4AA0 +52A0 +92A0 +52A0 +24E0 +5480 +8980 +ENDCHAR +STARTCHAR U_36B4 +ENCODING 14004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F900 +4A80 +57E0 +9AA0 +52A0 +22E0 +5080 +8880 +ENDCHAR +STARTCHAR U_36B5 +ENCODING 14005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +23E0 +FE40 +4980 +5240 +9420 +5180 +2040 +5300 +8880 +ENDCHAR +STARTCHAR U_36B6 +ENCODING 14006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FBC0 +4A00 +5200 +93E0 +5220 +2220 +53E0 +8A20 +ENDCHAR +STARTCHAR U_36B7 +ENCODING 14007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC40 +4920 +5100 +9540 +5920 +2120 +5100 +8B00 +ENDCHAR +STARTCHAR U_36B8 +ENCODING 14008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2020 +FBA0 +4820 +53A0 +92A0 +52A0 +23A0 +5020 +8860 +ENDCHAR +STARTCHAR U_36B9 +ENCODING 14009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +2AA0 +FAA0 +4AA0 +52A0 +96A0 +5AE0 +2280 +5480 +8880 +ENDCHAR +STARTCHAR U_36BA +ENCODING 14010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +2280 +FAE0 +4C20 +57A0 +9140 +5100 +27C0 +5100 +8B00 +ENDCHAR +STARTCHAR U_36BB +ENCODING 14011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4900 +7F00 +4900 +7F00 +0800 +FF80 +1200 +3C00 +0E00 +F180 +ENDCHAR +STARTCHAR U_36BC +ENCODING 14012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +22A0 +FAA0 +4AA0 +53E0 +92A0 +52A0 +22A0 +53E0 +8A20 +ENDCHAR +STARTCHAR U_36BD +ENCODING 14013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +23E0 +3820 +E1A0 +0440 +FFE0 +0900 +1E00 +0700 +78E0 +ENDCHAR +STARTCHAR U_36BE +ENCODING 14014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +FC40 +4C40 +57C0 +9280 +5280 +2280 +54A0 +88E0 +ENDCHAR +STARTCHAR U_36BF +ENCODING 14015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +F420 +5BA0 +52A0 +93A0 +5220 +22C0 +5220 +8BE0 +ENDCHAR +STARTCHAR U_36C0 +ENCODING 14016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2120 +FA20 +4C40 +53E0 +9020 +53E0 +2020 +5020 +8BE0 +ENDCHAR +STARTCHAR U_36C1 +ENCODING 14017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +FD40 +4B80 +5100 +9FE0 +5100 +2100 +5100 +8100 +ENDCHAR +STARTCHAR U_36C2 +ENCODING 14018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2400 +FDE0 +4D20 +55A0 +9520 +55E0 +2500 +5520 +89E0 +ENDCHAR +STARTCHAR U_36C3 +ENCODING 14019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +10A0 +7CA0 +1120 +7E60 +1400 +FFE0 +1900 +0700 +78E0 +ENDCHAR +STARTCHAR U_36C4 +ENCODING 14020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F900 +4920 +52C0 +9680 +5A40 +2240 +5320 +8A20 +ENDCHAR +STARTCHAR U_36C5 +ENCODING 14021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +2240 +FBC0 +4A40 +53C0 +9240 +5260 +27C0 +5040 +8040 +ENDCHAR +STARTCHAR U_36C6 +ENCODING 14022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +22E0 +FA20 +4C20 +5540 +9100 +5FE0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_36C7 +ENCODING 14023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC00 +4C80 +5480 +97E0 +5480 +2480 +5480 +8BE0 +ENDCHAR +STARTCHAR U_36C8 +ENCODING 14024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2120 +F940 +4FE0 +5100 +97C0 +5A00 +23E0 +5020 +89C0 +ENDCHAR +STARTCHAR U_36C9 +ENCODING 14025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +4280 +F280 +AFE0 +AAA0 +AAA0 +6CE0 +4820 +6820 +8FE0 +ENDCHAR +STARTCHAR U_36CA +ENCODING 14026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +4A40 +5520 +9100 +57C0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_36CB +ENCODING 14027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC40 +4920 +5100 +9540 +55A0 +2940 +5100 +8B00 +ENDCHAR +STARTCHAR U_36CC +ENCODING 14028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +2240 +FBE0 +48A0 +5280 +93E0 +5480 +27E0 +5080 +8880 +ENDCHAR +STARTCHAR U_36CD +ENCODING 14029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F900 +4D40 +5540 +93A0 +5100 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_36CE +ENCODING 14030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +4BC0 +5000 +97E0 +5420 +2420 +57E0 +8420 +ENDCHAR +STARTCHAR U_36CF +ENCODING 14031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2FE0 +F900 +4D40 +5380 +9380 +5540 +2120 +5100 +8B00 +ENDCHAR +STARTCHAR U_36D0 +ENCODING 14032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +47C0 +F540 +57C0 +5540 +97C0 +6500 +2200 +5580 +8860 +ENDCHAR +STARTCHAR U_36D1 +ENCODING 14033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1DE0 +5120 +FCC0 +2540 +F920 +0400 +FFE0 +1100 +0F00 +78E0 +ENDCHAR +STARTCHAR U_36D2 +ENCODING 14034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +F000 +57C0 +5440 +5440 +97C0 +6000 +2440 +5280 +8FE0 +ENDCHAR +STARTCHAR U_36D3 +ENCODING 14035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4660 +4180 +4660 +F100 +57E0 +5280 +97E0 +6AA0 +22E0 +5080 +8080 +ENDCHAR +STARTCHAR U_36D4 +ENCODING 14036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47C0 +4C40 +F380 +5D60 +5380 +9100 +67C0 +2100 +57E0 +8100 +ENDCHAR +STARTCHAR U_36D5 +ENCODING 14037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +4440 +F7C0 +5000 +57C0 +9540 +67C0 +2400 +5420 +83E0 +ENDCHAR +STARTCHAR U_36D6 +ENCODING 14038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4240 +47C0 +F2A0 +5440 +5A20 +93C0 +6640 +2240 +5180 +8660 +ENDCHAR +STARTCHAR U_36D7 +ENCODING 14039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +4540 +F540 +5BA0 +5BA0 +9100 +67C0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_36D8 +ENCODING 14040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4100 +F7E0 +5820 +53C0 +9080 +67E0 +2100 +5100 +8300 +ENDCHAR +STARTCHAR U_36D9 +ENCODING 14041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +4FE0 +F440 +5280 +5FE0 +9100 +67C0 +2100 +5100 +8100 +ENDCHAR +STARTCHAR U_36DA +ENCODING 14042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4040 +4380 +F080 +57E0 +5520 +97E0 +5520 +27E0 +5520 +8560 +ENDCHAR +STARTCHAR U_36DB +ENCODING 14043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +4240 +FBC0 +5240 +53C0 +9260 +57C0 +20C0 +5140 +86C0 +ENDCHAR +STARTCHAR U_36DC +ENCODING 14044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +43E0 +D640 +5140 +5080 +4760 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_36DD +ENCODING 14045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FBC0 +4A40 +53C0 +9240 +53C0 +2000 +5240 +8420 +ENDCHAR +STARTCHAR U_36DE +ENCODING 14046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +47C0 +F100 +57E0 +5000 +9240 +67E0 +2240 +5240 +8440 +ENDCHAR +STARTCHAR U_36DF +ENCODING 14047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +F900 +4FC0 +5540 +9540 +57E0 +2100 +5280 +8460 +ENDCHAR +STARTCHAR U_36E0 +ENCODING 14048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +45E0 +E820 +4BA0 +AAA0 +ABA0 +AAA0 +AAA0 +4BA0 +4820 +A860 +ENDCHAR +STARTCHAR U_36E1 +ENCODING 14049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +4FE0 +F820 +5780 +9000 +9FC0 +6500 +2520 +5520 +89E0 +ENDCHAR +STARTCHAR U_36E2 +ENCODING 14050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +27E0 +FB80 +4D40 +5120 +97C0 +5240 +2260 +5420 +88C0 +ENDCHAR +STARTCHAR U_36E3 +ENCODING 14051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +F000 +57C0 +5440 +9540 +6540 +2540 +5280 +8460 +ENDCHAR +STARTCHAR U_36E4 +ENCODING 14052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +FEE0 +AAA0 +AAA0 +AAA0 +AEE0 +AAA0 +4AA0 +6AA0 +9AA0 +ENDCHAR +STARTCHAR U_36E5 +ENCODING 14053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4120 +4FC0 +F340 +5520 +5900 +97E0 +6420 +27E0 +5420 +8FE0 +ENDCHAR +STARTCHAR U_36E6 +ENCODING 14054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +4FE0 +F480 +55C0 +55A0 +96A0 +66A0 +2480 +5480 +8480 +ENDCHAR +STARTCHAR U_36E7 +ENCODING 14055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +4540 +F7C0 +5000 +57E0 +9200 +67C0 +2A40 +5240 +83C0 +ENDCHAR +STARTCHAR U_36E8 +ENCODING 14056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +47C0 +F100 +57C0 +5100 +9FE0 +6280 +22A0 +54A0 +88E0 +ENDCHAR +STARTCHAR U_36E9 +ENCODING 14057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4240 +F7C0 +5020 +57C0 +9440 +67C0 +2440 +57C0 +8440 +ENDCHAR +STARTCHAR U_36EA +ENCODING 14058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4280 +F560 +5FC0 +5540 +97C0 +6540 +27C0 +5120 +81E0 +ENDCHAR +STARTCHAR U_36EB +ENCODING 14059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +F440 +57C0 +5200 +97E0 +5AA0 +24A0 +5120 +8240 +ENDCHAR +STARTCHAR U_36EC +ENCODING 14060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +F7E0 +4A80 +5440 +9920 +5100 +27C0 +5100 +87E0 +ENDCHAR +STARTCHAR U_36ED +ENCODING 14061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +47C0 +F280 +5FE0 +5000 +97C0 +5440 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_36EE +ENCODING 14062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4920 +F7C0 +5100 +56C0 +9820 +67C0 +3440 +4380 +8C60 +ENDCHAR +STARTCHAR U_36EF +ENCODING 14063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +E4E0 +7EA0 +AAA0 +AAA0 +BEA0 +54A0 +5500 +5420 +A3E0 +ENDCHAR +STARTCHAR U_36F0 +ENCODING 14064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +F480 +57E0 +5440 +97E0 +6440 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_36F1 +ENCODING 14065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +4FC0 +5000 +97E0 +5520 +2540 +5480 +8660 +ENDCHAR +STARTCHAR U_36F2 +ENCODING 14066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +47C0 +FC40 +57C0 +5440 +97C0 +5440 +27C0 +5440 +8820 +ENDCHAR +STARTCHAR U_36F3 +ENCODING 14067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +FFE0 +8420 +7FC0 +4440 +FFE0 +3100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_36F4 +ENCODING 14068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +4540 +4280 +FD40 +52A0 +57E0 +96A0 +6520 +26A0 +5460 +8FE0 +ENDCHAR +STARTCHAR U_36F5 +ENCODING 14069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4F80 +4A20 +F540 +5100 +57C0 +9540 +67C0 +2540 +5FE0 +8540 +ENDCHAR +STARTCHAR U_36F6 +ENCODING 14070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4120 +47E0 +FC00 +57E0 +5480 +96A0 +65C0 +2480 +5140 +8E20 +ENDCHAR +STARTCHAR U_36F7 +ENCODING 14071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +3980 +56A0 +94E0 +0800 +FFE0 +1900 +0600 +79C0 +ENDCHAR +STARTCHAR U_36F8 +ENCODING 14072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +47E0 +F900 +4FC0 +5000 +97C0 +6440 +27C0 +5280 +8FE0 +ENDCHAR +STARTCHAR U_36F9 +ENCODING 14073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4BE0 +4880 +EBE0 +5AA0 +ABE0 +AAA0 +ABE0 +4A80 +4900 +AAE0 +ENDCHAR +STARTCHAR U_36FA +ENCODING 14074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +5FE0 +5000 +97C0 +6440 +27C0 +5440 +8FC0 +ENDCHAR +STARTCHAR U_36FB +ENCODING 14075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +F280 +5540 +5BA0 +9100 +A7E0 +6100 +23C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_36FC +ENCODING 14076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +4100 +F7E0 +5100 +5360 +9520 +6560 +2720 +5520 +87E0 +ENDCHAR +STARTCHAR U_36FD +ENCODING 14077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +5540 +9380 +A100 +AFE0 +6380 +2540 +5920 +8100 +ENDCHAR +STARTCHAR U_36FE +ENCODING 14078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4080 +4FE0 +E880 +AF80 +A880 +AEA0 +AA40 +4EC0 +A940 +9620 +ENDCHAR +STARTCHAR U_36FF +ENCODING 14079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4540 +4FE0 +F540 +5FE0 +5920 +97C0 +5540 +2540 +5100 +8900 +ENDCHAR +STARTCHAR U_3700 +ENCODING 14080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +44E0 +5FA0 +E4A0 +AEE0 +ADA0 +B5A0 +A4E0 +44A0 +64A0 +84E0 +ENDCHAR +STARTCHAR U_3701 +ENCODING 14081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2380 +F540 +5FE0 +5440 +97C0 +6440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_3702 +ENCODING 14082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +73E0 +2040 +FA40 +2140 +7140 +2440 +FFE0 +1100 +0F00 +7C80 +ENDCHAR +STARTCHAR U_3703 +ENCODING 14083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +5480 +FFE0 +5400 +55C0 +9400 +95C0 +6400 +25C0 +5540 +85C0 +ENDCHAR +STARTCHAR U_3704 +ENCODING 14084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +44C0 +5740 +F540 +57C0 +5540 +97C0 +E540 +25C0 +5740 +8820 +ENDCHAR +STARTCHAR U_3705 +ENCODING 14085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F100 +5680 +5300 +9640 +97C0 +5540 +27C0 +5540 +87C0 +ENDCHAR +STARTCHAR U_3706 +ENCODING 14086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +51C0 +EBE0 +7C80 +A9C0 +A9C0 +AAA0 +6CA0 +2880 +5680 +81E0 +ENDCHAR +STARTCHAR U_3707 +ENCODING 14087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +57C0 +F100 +5FE0 +5100 +57C0 +9100 +5FE0 +2240 +5D60 +87C0 +ENDCHAR +STARTCHAR U_3708 +ENCODING 14088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +1240 +F9C0 +3EA0 +53C0 +9140 +3640 +FFE0 +0900 +0F00 +7880 +ENDCHAR +STARTCHAR U_3709 +ENCODING 14089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +4540 +52A0 +F7E0 +5420 +57E0 +9520 +67E0 +2400 +5420 +87E0 +ENDCHAR +STARTCHAR U_370A +ENCODING 14090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +57E0 +F540 +57E0 +5540 +97E0 +5540 +2560 +5540 +89A0 +ENDCHAR +STARTCHAR U_370B +ENCODING 14091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +5FE0 +E280 +A440 +A820 +B020 +6FE0 +2AA0 +5AA0 +9FE0 +ENDCHAR +STARTCHAR U_370C +ENCODING 14092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +0400 +FBC0 +AA40 +FA40 +5140 +3180 +DE60 +ENDCHAR +STARTCHAR U_370D +ENCODING 14093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E900 +6FC0 +A940 +AFE0 +A940 +AFC0 +6A40 +6A40 +93C0 +ENDCHAR +STARTCHAR U_370E +ENCODING 14094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +5520 +F2C0 +5100 +5780 +5240 +97E0 +5100 +27E0 +5240 +8420 +ENDCHAR +STARTCHAR U_370F +ENCODING 14095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +5240 +F7E0 +5420 +57E0 +5420 +97E0 +5420 +27E0 +5240 +8420 +ENDCHAR +STARTCHAR U_3710 +ENCODING 14096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +57C0 +F000 +57C0 +5000 +57C0 +5440 +27C0 +5280 +8FE0 +ENDCHAR +STARTCHAR U_3711 +ENCODING 14097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +8540 +57C0 +2540 +C7C0 +4D40 +FFE0 +1100 +1F00 +70C0 +ENDCHAR +STARTCHAR U_3712 +ENCODING 14098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +4420 +5660 +F420 +5660 +5240 +97E0 +5240 +2240 +5240 +8440 +ENDCHAR +STARTCHAR U_3713 +ENCODING 14099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5EE0 +F540 +5100 +5280 +5440 +9BA0 +5000 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_3714 +ENCODING 14100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +5280 +FFE0 +5000 +57C0 +9440 +57C0 +2280 +52A0 +8C60 +ENDCHAR +STARTCHAR U_3715 +ENCODING 14101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +F2A0 +6BE0 +BEA0 +ABE0 +A880 +6BE0 +2880 +5680 +81E0 +ENDCHAR +STARTCHAR U_3716 +ENCODING 14102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +5FE0 +4AA0 +FFE0 +AAA0 +AFE0 +A440 +67C0 +2440 +57C0 +8440 +ENDCHAR +STARTCHAR U_3717 +ENCODING 14103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4AA0 +FFE0 +A200 +A500 +AAE0 +7D00 +26C0 +5300 +8C00 +ENDCHAR +STARTCHAR U_3718 +ENCODING 14104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +6AA0 +AFC0 +AA40 +ABC0 +6A40 +2BC0 +5A40 +97E0 +ENDCHAR +STARTCHAR U_3719 +ENCODING 14105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +EA80 +6FE0 +AAA0 +AFE0 +AA40 +AB60 +6A40 +5AC0 +9360 +ENDCHAR +STARTCHAR U_371A +ENCODING 14106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E820 +65E0 +A480 +ADE0 +A520 +65E0 +2520 +55E0 +8520 +ENDCHAR +STARTCHAR U_371B +ENCODING 14107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +4440 +FF40 +5540 +5F40 +9540 +5F40 +24A0 +5FA0 +8520 +ENDCHAR +STARTCHAR U_371C +ENCODING 14108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +E5A0 +6EA0 +A8A0 +BE40 +A840 +6E40 +2AA0 +5AA0 +9520 +ENDCHAR +STARTCHAR U_371D +ENCODING 14109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +5D60 +F7C0 +5080 +5FE0 +9280 +6FE0 +2AA0 +5D60 +8FE0 +ENDCHAR +STARTCHAR U_371E +ENCODING 14110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2200 +FBE0 +AA80 +FA80 +AC80 +FFE0 +2900 +1E00 +7180 +ENDCHAR +STARTCHAR U_371F +ENCODING 14111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D00 +4500 +FFE0 +5540 +5D40 +5540 +9C80 +5480 +3D40 +5540 +8620 +ENDCHAR +STARTCHAR U_3720 +ENCODING 14112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +FFE0 +5480 +57E0 +5C80 +97E0 +6480 +27E0 +5480 +87E0 +ENDCHAR +STARTCHAR U_3721 +ENCODING 14113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4940 +F6A0 +A800 +B880 +A880 +AAE0 +4A80 +6B80 +5A80 +8C60 +ENDCHAR +STARTCHAR U_3722 +ENCODING 14114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +6FE0 +A540 +A7C0 +A540 +6FE0 +2240 +5180 +8E40 +ENDCHAR +STARTCHAR U_3723 +ENCODING 14115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EC0 +F2A0 +ABE0 +B480 +AC80 +A940 +5220 +6000 +5540 +92A0 +ENDCHAR +STARTCHAR U_3724 +ENCODING 14116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +EFE0 +AAA0 +AFE0 +A440 +A7C0 +6540 +2FE0 +5100 +8100 +ENDCHAR +STARTCHAR U_3725 +ENCODING 14117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FFE0 +5440 +57C0 +5440 +97C0 +6440 +27C0 +5440 +8820 +ENDCHAR +STARTCHAR U_3726 +ENCODING 14118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +EFE0 +6040 +AFE0 +A4A0 +AEE0 +6080 +5FE0 +4480 +8180 +ENDCHAR +STARTCHAR U_3727 +ENCODING 14119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4D40 +FA60 +6FC0 +AA40 +AAC0 +AFC0 +6A40 +2A40 +5AA0 +9520 +ENDCHAR +STARTCHAR U_3728 +ENCODING 14120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +EFE0 +6AA0 +A9C0 +AEA0 +AA80 +4FE0 +6880 +5FE0 +9080 +ENDCHAR +STARTCHAR U_3729 +ENCODING 14121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +EB60 +6DA0 +AB20 +AFE0 +ABA0 +6540 +2FE0 +5300 +8CE0 +ENDCHAR +STARTCHAR U_372A +ENCODING 14122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FD80 +4900 +FDE0 +1140 +FE40 +5440 +FFE0 +0900 +1200 +7F80 +ENDCHAR +STARTCHAR U_372B +ENCODING 14123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +5A80 +EFE0 +B8A0 +AFA0 +B040 +D540 +5540 +7540 +95A0 +98A0 +ENDCHAR +STARTCHAR U_372C +ENCODING 14124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +EFE0 +AAA0 +AFE0 +A800 +ABE0 +6800 +2BE0 +5A20 +93E0 +ENDCHAR +STARTCHAR U_372D +ENCODING 14125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +FFE0 +B020 +A7C0 +A440 +AFE0 +6920 +2FE0 +5920 +8FE0 +ENDCHAR +STARTCHAR U_372E +ENCODING 14126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +4A40 +FFE0 +6900 +AF00 +AAE0 +AF00 +6000 +3FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_372F +ENCODING 14127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +EFA0 +68E0 +AF80 +AA80 +AAA0 +4FE0 +6000 +5D40 +92A0 +ENDCHAR +STARTCHAR U_3730 +ENCODING 14128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +4BC0 +FEE0 +67A0 +AAC0 +BFE0 +A100 +7FE0 +2380 +5540 +9920 +ENDCHAR +STARTCHAR U_3731 +ENCODING 14129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4880 +EFE0 +6AA0 +B7E0 +A440 +A7C0 +6440 +27C0 +5440 +8820 +ENDCHAR +STARTCHAR U_3732 +ENCODING 14130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +5400 +F7C0 +5440 +5FE0 +AAA0 +6FA0 +2AE0 +5FA0 +92A0 +ENDCHAR +STARTCHAR U_3733 +ENCODING 14131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +EAA0 +6FE0 +A920 +A7C0 +A920 +6240 +2D80 +5480 +8E60 +ENDCHAR +STARTCHAR U_3734 +ENCODING 14132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4EE0 +E280 +6FE0 +AAA0 +AFE0 +A820 +67C0 +2540 +56C0 +87C0 +ENDCHAR +STARTCHAR U_3735 +ENCODING 14133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +E480 +67C0 +A480 +A7C0 +A480 +77E0 +2AA0 +5DC0 +8660 +ENDCHAR +STARTCHAR U_3736 +ENCODING 14134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +45E0 +EC20 +77E0 +A5A0 +A6E0 +A500 +6FE0 +3520 +57C0 +8CE0 +ENDCHAR +STARTCHAR U_3737 +ENCODING 14135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +2540 +EFE0 +8B60 +EDA0 +2B60 +6DA0 +0880 +FFE0 +1100 +7FC0 +ENDCHAR +STARTCHAR U_3738 +ENCODING 14136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +4080 +FBE0 +8940 +F3E0 +8880 +FFE0 +1080 +1F00 +E0C0 +ENDCHAR +STARTCHAR U_3739 +ENCODING 14137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +EEE0 +6AA0 +AEE0 +A480 +AFE0 +7480 +27E0 +5480 +87E0 +ENDCHAR +STARTCHAR U_373A +ENCODING 14138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5FE0 +4440 +FFE0 +6CC0 +B7E0 +A440 +67C0 +2440 +57C0 +8820 +ENDCHAR +STARTCHAR U_373B +ENCODING 14139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +53C0 +ECA0 +6BC0 +BC40 +ABE0 +B6A0 +6BC0 +2540 +54A0 +8BE0 +ENDCHAR +STARTCHAR U_373C +ENCODING 14140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +E7C0 +A540 +AFE0 +AAA0 +AFE0 +6AA0 +2380 +5280 +8FE0 +ENDCHAR +STARTCHAR U_373D +ENCODING 14141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +4480 +2240 +3F80 +0200 +0440 +FFE0 +0400 +0400 +1C00 +0400 +ENDCHAR +STARTCHAR U_373E +ENCODING 14142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1300 +2480 +2840 +34A0 +6480 +A480 +2480 +2480 +A480 +4880 +ENDCHAR +STARTCHAR U_373F +ENCODING 14143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2080 +4300 +4100 +6FE0 +C140 +4100 +4100 +4100 +C500 +4300 +ENDCHAR +STARTCHAR U_3740 +ENCODING 14144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +6840 +5880 +4880 +FFE0 +6880 +5880 +4880 +FC80 +0980 +1880 +ENDCHAR +STARTCHAR U_3741 +ENCODING 14145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +5120 +9F20 +1120 +1F20 +00C0 +3F00 +0240 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_3742 +ENCODING 14146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F460 +2580 +5F00 +45E0 +7540 +C740 +4D40 +5540 +4540 +4540 +CA40 +ENDCHAR +STARTCHAR U_3743 +ENCODING 14147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +23C0 +2480 +2FE0 +3520 +E520 +27E0 +2180 +2280 +A2A0 +6CE0 +ENDCHAR +STARTCHAR U_3744 +ENCODING 14148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +4BE0 +7880 +02A0 +FAA0 +13E0 +38A0 +E080 +20A0 +60E0 +ENDCHAR +STARTCHAR U_3745 +ENCODING 14149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA20 +8C00 +73C0 +0040 +7280 +3900 +E280 +2460 +ENDCHAR +STARTCHAR U_3746 +ENCODING 14150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +27C0 +3440 +E7C0 +2440 +2280 +2FE0 +A440 +67C0 +ENDCHAR +STARTCHAR U_3747 +ENCODING 14151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +0000 +7BC0 +4A40 +7BC0 +0000 +7BC0 +1880 +F3E0 +3180 +ENDCHAR +STARTCHAR U_3748 +ENCODING 14152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5EA0 +E1C0 +5EA0 +F1E0 +4E80 +FBE0 +2E40 +FBE0 +2040 +60C0 +ENDCHAR +STARTCHAR U_3749 +ENCODING 14153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +0800 +0400 +FFE0 +8020 +8020 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR U_374A +ENCODING 14154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8040 +3F80 +1100 +1100 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_374B +ENCODING 14155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +4040 +BF00 +0200 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_374C +ENCODING 14156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8840 +0F80 +1100 +2200 +0600 +0900 +3080 +C060 +ENDCHAR +STARTCHAR U_374D +ENCODING 14157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9040 +1F00 +1000 +3F80 +0080 +FFE0 +0080 +0680 +0100 +ENDCHAR +STARTCHAR U_374E +ENCODING 14158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4220 +7FE0 +8840 +0400 +3F80 +0100 +0600 +1800 +6C00 +03E0 +ENDCHAR +STARTCHAR U_374F +ENCODING 14159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FE0 +4040 +8480 +0A00 +1100 +2980 +C960 +0900 +1100 +2100 +ENDCHAR +STARTCHAR U_3750 +ENCODING 14160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8A40 +1100 +2480 +C460 +0800 +1080 +27C0 +7840 +ENDCHAR +STARTCHAR U_3751 +ENCODING 14161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8820 +0400 +FFE0 +0800 +0FC0 +0840 +1040 +2040 +C180 +ENDCHAR +STARTCHAR U_3752 +ENCODING 14162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8020 +0400 +7FC0 +0400 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_3753 +ENCODING 14163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0E00 +3180 +C060 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3754 +ENCODING 14164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +0400 +FFC0 +8840 +0400 +FFC0 +1200 +6180 +1E00 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_3755 +ENCODING 14165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +FFC0 +9040 +0800 +6280 +9E40 +0000 +7F80 +2100 +1E00 +E1C0 +ENDCHAR +STARTCHAR U_3756 +ENCODING 14166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +0F80 +3900 +0600 +7C00 +0780 +3880 +0500 +7E00 +ENDCHAR +STARTCHAR U_3757 +ENCODING 14167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +2080 +3F80 +2080 +3F80 +2480 +2700 +38C0 +ENDCHAR +STARTCHAR U_3758 +ENCODING 14168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3759 +ENCODING 14169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8040 +3FC0 +0400 +3F80 +0400 +7FC0 +0000 +FFE0 +2080 +ENDCHAR +STARTCHAR U_375A +ENCODING 14170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8040 +7080 +1700 +2500 +35C0 +5500 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_375B +ENCODING 14171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +9040 +2FC0 +4200 +9FC0 +5240 +5540 +58C0 +5040 +5FC0 +ENDCHAR +STARTCHAR U_375C +ENCODING 14172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A140 +7FC0 +2100 +FFE0 +0000 +7FC0 +4640 +5840 +7FC0 +ENDCHAR +STARTCHAR U_375D +ENCODING 14173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +2080 +FBE0 +2080 +71C0 +AAC0 +24A0 +2080 +2080 +ENDCHAR +STARTCHAR U_375E +ENCODING 14174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7FC0 +0A00 +7BC0 +4040 +4040 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_375F +ENCODING 14175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +BFA0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +0A20 +F3E0 +ENDCHAR +STARTCHAR U_3760 +ENCODING 14176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +3F80 +0400 +7FC0 +1100 +ENDCHAR +STARTCHAR U_3761 +ENCODING 14177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7E00 +25E0 +3D20 +2520 +3D40 +2480 +7D40 +0620 +ENDCHAR +STARTCHAR U_3762 +ENCODING 14178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +80A0 +3F80 +0400 +3F80 +2480 +3F80 +4540 +4F40 +4040 +ENDCHAR +STARTCHAR U_3763 +ENCODING 14179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A020 +7BC0 +2140 +FA40 +24C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3764 +ENCODING 14180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5120 +FFE0 +1100 +7FC0 +2480 +3F80 +2480 +FFE0 +2080 +ENDCHAR +STARTCHAR U_3765 +ENCODING 14181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +8020 +5920 +5540 +7FE0 +1100 +F380 +5540 +5920 +9100 +ENDCHAR +STARTCHAR U_3766 +ENCODING 14182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +9220 +1FC0 +7200 +1F80 +1200 +7FE0 +0980 +1040 +60C0 +ENDCHAR +STARTCHAR U_3767 +ENCODING 14183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +0E00 +3580 +5540 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3768 +ENCODING 14184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +0400 +FFE0 +2080 +3F80 +2240 +E980 +30E0 +ENDCHAR +STARTCHAR U_3769 +ENCODING 14185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +7FC0 +4480 +7FE0 +4480 +7F80 +5480 +4D00 +B4C0 +ENDCHAR +STARTCHAR U_376A +ENCODING 14186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +7900 +27C0 +F940 +5340 +F9C0 +2140 +FA60 +2C20 +ENDCHAR +STARTCHAR U_376B +ENCODING 14187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +77C0 +5A40 +7580 +57E0 +5900 +67C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_376C +ENCODING 14188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +A5E0 +7880 +2080 +7BE0 +2080 +FC80 +4940 +4A40 +7C20 +ENDCHAR +STARTCHAR U_376D +ENCODING 14189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +27C0 +24C0 +B540 +A7C0 +B900 +27C0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_376E +ENCODING 14190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +A800 +FFC0 +AA40 +FA40 +0180 +F980 +7240 +AC20 +ENDCHAR +STARTCHAR U_376F +ENCODING 14191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0400 +FFE0 +5140 +BFA0 +2A80 +2E80 +2180 +ENDCHAR +STARTCHAR U_3770 +ENCODING 14192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +3F80 +2480 +FFE0 +A4A0 +5F40 +0400 +0F80 +3180 +ENDCHAR +STARTCHAR U_3771 +ENCODING 14193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +82A0 +5FC0 +5280 +7FE0 +1AA0 +7FE0 +5340 +5080 +9F00 +ENDCHAR +STARTCHAR U_3772 +ENCODING 14194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +82A0 +57C0 +5540 +77E0 +19A0 +F280 +5FE0 +9540 +1100 +ENDCHAR +STARTCHAR U_3773 +ENCODING 14195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +0400 +2540 +24A0 +44A0 +8400 +1400 +0800 +ENDCHAR +STARTCHAR U_3774 +ENCODING 14196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7040 +07E0 +0040 +FA40 +5140 +5040 +5140 +5080 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3775 +ENCODING 14197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2880 +3F80 +0000 +3F80 +0100 +FFE0 +2100 +1100 +0300 +ENDCHAR +STARTCHAR U_3776 +ENCODING 14198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +0A20 +1220 +E1E0 +0100 +FFE0 +2100 +1100 +0300 +ENDCHAR +STARTCHAR U_3777 +ENCODING 14199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +7FC0 +2540 +FA60 +0520 +FFE0 +2100 +1300 +ENDCHAR +STARTCHAR U_3778 +ENCODING 14200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2580 +D460 +3F80 +2080 +3F80 +2080 +3F80 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_3779 +ENCODING 14201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +C740 +0E20 +F200 +1F80 +6480 +3F80 +0B00 +12A0 +E1E0 +ENDCHAR +STARTCHAR U_377A +ENCODING 14202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +5080 +FDC0 +55A0 +FEA0 +54A0 +FCC0 +5880 +D500 +5600 +ENDCHAR +STARTCHAR U_377B +ENCODING 14203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +5080 +F9C0 +AAA0 +FCA0 +2080 +F8C0 +2080 +3900 +E600 +ENDCHAR +STARTCHAR U_377C +ENCODING 14204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43C0 +F880 +5080 +57E0 +5080 +5080 +5280 +5100 +9020 +8FE0 +ENDCHAR +STARTCHAR U_377D +ENCODING 14205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +F880 +57A0 +51C0 +52C0 +5CA0 +5080 +5180 +9020 +8FE0 +ENDCHAR +STARTCHAR U_377E +ENCODING 14206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +FBE0 +5100 +51E0 +5240 +5240 +55E0 +5000 +9020 +8FE0 +ENDCHAR +STARTCHAR U_377F +ENCODING 14207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +FD40 +5500 +57C0 +5640 +5580 +5A80 +5460 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3780 +ENCODING 14208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +4FE0 +FA80 +52A0 +55C0 +5480 +5940 +5620 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3781 +ENCODING 14209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +47C0 +FC40 +57C0 +5400 +57C0 +5440 +53C0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3782 +ENCODING 14210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4640 +FD40 +5280 +57E0 +5240 +5240 +5180 +5660 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3783 +ENCODING 14211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +4920 +8500 +27E0 +3140 +4940 +8540 +7940 +4A40 +4A40 +7C60 +ENDCHAR +STARTCHAR U_3784 +ENCODING 14212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4540 +FFE0 +5540 +57C0 +5540 +57C0 +5100 +90E0 +8FC0 +ENDCHAR +STARTCHAR U_3785 +ENCODING 14213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +FFC0 +5540 +57C0 +5100 +5FE0 +5540 +5920 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3786 +ENCODING 14214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +4280 +FC40 +57E0 +5040 +5740 +5540 +5740 +90A0 +8FE0 +ENDCHAR +STARTCHAR U_3787 +ENCODING 14215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +FFC0 +5540 +5FE0 +5540 +5580 +5480 +5660 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3788 +ENCODING 14216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +FC20 +57E0 +5400 +57E0 +5AA0 +5FE0 +52A0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_3789 +ENCODING 14217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +F900 +53C0 +5100 +57E0 +5280 +5480 +5BE0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_378A +ENCODING 14218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +F900 +AFE0 +F940 +0140 +7140 +0140 +F940 +7240 +AA40 +2460 +ENDCHAR +STARTCHAR U_378B +ENCODING 14219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +7FC0 +5040 +4880 +4500 +4200 +8D80 +F060 +ENDCHAR +STARTCHAR U_378C +ENCODING 14220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +4F80 +4100 +7FE0 +4200 +4200 +8200 +8600 +ENDCHAR +STARTCHAR U_378D +ENCODING 14221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4400 +4400 +5F80 +4480 +4C80 +4480 +8AA0 +B060 +ENDCHAR +STARTCHAR U_378E +ENCODING 14222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FC0 +5240 +5FC0 +5000 +5020 +9020 +8FE0 +ENDCHAR +STARTCHAR U_378F +ENCODING 14223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FC0 +4200 +5F80 +4080 +4300 +8C00 +B3E0 +ENDCHAR +STARTCHAR U_3790 +ENCODING 14224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4800 +4400 +7FC0 +4000 +5080 +4880 +4900 +BFE0 +ENDCHAR +STARTCHAR U_3791 +ENCODING 14225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +4200 +5AE0 +4200 +5AE0 +4200 +8220 +81E0 +ENDCHAR +STARTCHAR U_3792 +ENCODING 14226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4400 +5FC0 +5040 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_3793 +ENCODING 14227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5000 +5FC0 +5020 +4FE0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_3794 +ENCODING 14228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4400 +4F80 +5500 +46E0 +5B20 +4540 +8180 +9E00 +ENDCHAR +STARTCHAR U_3795 +ENCODING 14229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4880 +5FC0 +68A0 +4F80 +4880 +4F80 +8880 +8980 +ENDCHAR +STARTCHAR U_3796 +ENCODING 14230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4200 +7FE0 +4200 +5FC0 +5240 +57C0 +8A80 +B260 +ENDCHAR +STARTCHAR U_3797 +ENCODING 14231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4280 +4240 +7FE0 +5220 +4B40 +4A80 +B260 +8600 +ENDCHAR +STARTCHAR U_3798 +ENCODING 14232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FE0 +4600 +5B20 +4DC0 +5B40 +8520 +9A00 +ENDCHAR +STARTCHAR U_3799 +ENCODING 14233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4200 +4F80 +4200 +5FC0 +4220 +5BE0 +8A80 +B640 +ENDCHAR +STARTCHAR U_379A +ENCODING 14234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +4F80 +4200 +7FE0 +5240 +5AC0 +5240 +9FC0 +ENDCHAR +STARTCHAR U_379B +ENCODING 14235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4A00 +73C0 +4A20 +71E0 +5240 +53C0 +5240 +93C0 +ENDCHAR +STARTCHAR U_379C +ENCODING 14236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4B80 +5100 +6FE0 +5540 +7FE0 +5240 +9180 +9660 +ENDCHAR +STARTCHAR U_379D +ENCODING 14237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4D00 +48A0 +7E40 +AAA0 +BFC0 +2040 +3FC0 +2000 +4000 +ENDCHAR +STARTCHAR U_379E +ENCODING 14238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4A80 +72C0 +4D20 +7100 +55C0 +5500 +9700 +98E0 +ENDCHAR +STARTCHAR U_379F +ENCODING 14239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4880 +7FE0 +4500 +5FC0 +5540 +7FE0 +4880 +B060 +ENDCHAR +STARTCHAR U_37A0 +ENCODING 14240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4200 +7FE0 +54A0 +4FC0 +7960 +4FC0 +8A80 +B260 +ENDCHAR +STARTCHAR U_37A1 +ENCODING 14241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4880 +7DE0 +4880 +7DE0 +4A20 +5D40 +A880 +8C60 +ENDCHAR +STARTCHAR U_37A2 +ENCODING 14242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +4440 +4440 +4440 +4440 +7FC0 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_37A3 +ENCODING 14243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +1800 +E000 +1900 +60C0 +9FA0 +0880 +3080 +C300 +ENDCHAR +STARTCHAR U_37A4 +ENCODING 14244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +0400 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_37A5 +ENCODING 14245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +0800 +0400 +0A00 +1200 +2180 +C060 +ENDCHAR +STARTCHAR U_37A6 +ENCODING 14246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2280 +2280 +AA80 +AA80 +AA80 +AA80 +BAA0 +EAA0 +04A0 +1860 +ENDCHAR +STARTCHAR U_37A7 +ENCODING 14247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +7FC0 +0880 +11E0 +1020 +2020 +C0C0 +ENDCHAR +STARTCHAR U_37A8 +ENCODING 14248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +2080 +A900 +A900 +AFE0 +A900 +B900 +E900 +0100 +0300 +ENDCHAR +STARTCHAR U_37A9 +ENCODING 14249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +1F00 +1100 +1D00 +1320 +2120 +C0E0 +ENDCHAR +STARTCHAR U_37AA +ENCODING 14250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +FFE0 +0000 +0400 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37AB +ENCODING 14251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0800 +0400 +7FC0 +0300 +0C00 +7000 +9FE0 +ENDCHAR +STARTCHAR U_37AC +ENCODING 14252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +4440 +7FC0 +0000 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_37AD +ENCODING 14253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +1100 +2080 +C060 +0400 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37AE +ENCODING 14254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0800 +0800 +17C0 +2080 +CD00 +0200 +0180 +ENDCHAR +STARTCHAR U_37AF +ENCODING 14255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +0040 +FFC0 +8000 +8020 +7FE0 +0000 +0400 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_37B0 +ENCODING 14256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +21E0 +AA80 +AC80 +A880 +ABE0 +B880 +E880 +0080 +0080 +ENDCHAR +STARTCHAR U_37B1 +ENCODING 14257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8420 +8420 +FFE0 +0000 +7FC0 +4040 +7FC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_37B2 +ENCODING 14258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +ABE0 +AAA0 +AAA0 +AAA0 +BBE0 +E880 +0080 +0080 +ENDCHAR +STARTCHAR U_37B3 +ENCODING 14259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +2280 +A880 +AC80 +AA80 +A8E0 +BF80 +E880 +0080 +0080 +ENDCHAR +STARTCHAR U_37B4 +ENCODING 14260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +AA80 +AA80 +ABE0 +AA80 +AA80 +AA80 +FAA0 +0360 +0220 +ENDCHAR +STARTCHAR U_37B5 +ENCODING 14261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8420 +8420 +FFE0 +0800 +0400 +FFE0 +1100 +0E00 +1300 +E0E0 +ENDCHAR +STARTCHAR U_37B6 +ENCODING 14262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +AA40 +AA40 +AA80 +AA80 +B900 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_37B7 +ENCODING 14263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +1800 +6000 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_37B8 +ENCODING 14264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +FFE0 +0C00 +3700 +C4C0 +0420 +0400 +ENDCHAR +STARTCHAR U_37B9 +ENCODING 14265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +2040 +AF40 +A940 +A940 +AF40 +B840 +E840 +0040 +00C0 +ENDCHAR +STARTCHAR U_37BA +ENCODING 14266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +2000 +3FC0 +4400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_37BB +ENCODING 14267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +3F80 +2080 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_37BC +ENCODING 14268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0200 +0420 +F640 +0D80 +3480 +C460 +0C00 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37BD +ENCODING 14269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2FE0 +A900 +A920 +A960 +A940 +B940 +E880 +8CA0 +0960 +ENDCHAR +STARTCHAR U_37BE +ENCODING 14270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +2220 +ABE0 +AA00 +AA80 +AAA0 +BAC0 +EC80 +04A0 +08E0 +ENDCHAR +STARTCHAR U_37BF +ENCODING 14271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +0400 +7FC0 +0400 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_37C0 +ENCODING 14272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +1500 +E4E0 +0000 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37C1 +ENCODING 14273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +2200 +AAE0 +AA40 +AA40 +ABE0 +BA40 +EA40 +0440 +0440 +ENDCHAR +STARTCHAR U_37C2 +ENCODING 14274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +22C0 +AA40 +AFE0 +AA40 +AAC0 +BA40 +EBE0 +0040 +00C0 +ENDCHAR +STARTCHAR U_37C3 +ENCODING 14275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +23A0 +A820 +ABA0 +AAA0 +AAA0 +AAA0 +FBA0 +0020 +00E0 +ENDCHAR +STARTCHAR U_37C4 +ENCODING 14276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +A100 +AFC0 +A900 +A900 +AFE0 +F900 +0100 +0100 +ENDCHAR +STARTCHAR U_37C5 +ENCODING 14277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +A920 +AAA0 +A820 +AFE0 +AA80 +BA80 +EAA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_37C6 +ENCODING 14278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22A0 +26C0 +AB80 +AAA0 +AA60 +A900 +AFE0 +F900 +0100 +0100 +ENDCHAR +STARTCHAR U_37C7 +ENCODING 14279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2540 +AD40 +ABA0 +ABA0 +A900 +AFC0 +F900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_37C8 +ENCODING 14280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +A7E0 +A900 +AD40 +AB80 +A980 +BB40 +E520 +0920 +0300 +ENDCHAR +STARTCHAR U_37C9 +ENCODING 14281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +AA20 +A880 +AA80 +ABE0 +AC80 +BBE0 +C880 +0080 +0080 +ENDCHAR +STARTCHAR U_37CA +ENCODING 14282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +24A0 +AA40 +A800 +ABC0 +A880 +AFE0 +F900 +0100 +0300 +ENDCHAR +STARTCHAR U_37CB +ENCODING 14283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27C0 +A440 +A440 +AFC0 +AA80 +BA80 +EAA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_37CC +ENCODING 14284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +AA00 +AFA0 +AA40 +AAA0 +AA40 +BAA0 +ED40 +05A0 +08E0 +ENDCHAR +STARTCHAR U_37CD +ENCODING 14285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +23E0 +AA20 +ABE0 +AA20 +ABE0 +BA80 +EAA0 +0240 +0320 +ENDCHAR +STARTCHAR U_37CE +ENCODING 14286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +2920 +A4A0 +AA40 +A900 +AFE0 +B940 +EA40 +0180 +0660 +ENDCHAR +STARTCHAR U_37CF +ENCODING 14287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +AD20 +A880 +ABE0 +A840 +BBE0 +EA20 +0220 +03E0 +ENDCHAR +STARTCHAR U_37D0 +ENCODING 14288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +A900 +A880 +AFE0 +AA00 +BA00 +EA00 +0200 +03E0 +ENDCHAR +STARTCHAR U_37D1 +ENCODING 14289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A100 +A7E0 +AC20 +ABC0 +A840 +BFE0 +E880 +0080 +0180 +ENDCHAR +STARTCHAR U_37D2 +ENCODING 14290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +3F80 +1480 +1280 +FFE0 +2000 +5F80 +9080 +1F80 +ENDCHAR +STARTCHAR U_37D3 +ENCODING 14291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +A660 +A100 +AFE0 +AA80 +AFE0 +BAA0 +EAA0 +02A0 +0080 +ENDCHAR +STARTCHAR U_37D4 +ENCODING 14292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +0A00 +3180 +4440 +9F20 +0200 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_37D5 +ENCODING 14293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0280 +F980 +8C80 +8A80 +88E0 +8F80 +F880 +0080 +ENDCHAR +STARTCHAR U_37D6 +ENCODING 14294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +0400 +3F80 +0400 +FFE0 +0900 +3F80 +1100 +ENDCHAR +STARTCHAR U_37D7 +ENCODING 14295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2500 +B5A0 +CE60 +FFE0 +94A0 +D6A0 +A520 +8420 +FFE0 +8020 +ENDCHAR +STARTCHAR U_37D8 +ENCODING 14296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0820 +2920 +2BA0 +A920 +ABA0 +A820 +ABA0 +AAA0 +FBA0 +1060 +ENDCHAR +STARTCHAR U_37D9 +ENCODING 14297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +A240 +AFE0 +A800 +AFE0 +BC20 +EFE0 +0420 +07E0 +ENDCHAR +STARTCHAR U_37DA +ENCODING 14298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +73E0 +6940 +A880 +2360 +0400 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_37DB +ENCODING 14299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +3F80 +0000 +2240 +F7E0 +3240 +63C0 +A240 +2240 +63C0 +ENDCHAR +STARTCHAR U_37DC +ENCODING 14300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +8880 +FF80 +0400 +EFC0 +2880 +F200 +8A80 +EA40 +3240 +C600 +ENDCHAR +STARTCHAR U_37DD +ENCODING 14301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2220 +AA40 +A940 +AFE0 +A800 +BBE0 +EA20 +0220 +03E0 +ENDCHAR +STARTCHAR U_37DE +ENCODING 14302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +AA40 +A980 +AEE0 +A800 +AA80 +BFE0 +EA40 +0180 +06E0 +ENDCHAR +STARTCHAR U_37DF +ENCODING 14303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7FC0 +1100 +FFE0 +3180 +5F40 +9520 +1200 +1FC0 +ENDCHAR +STARTCHAR U_37E0 +ENCODING 14304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +AC60 +AFE0 +A920 +AD60 +AD60 +AFE0 +F820 +0860 +0820 +ENDCHAR +STARTCHAR U_37E1 +ENCODING 14305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +1500 +3F80 +0400 +7FC0 +0A00 +1F80 +6A40 +88A0 +0F80 +ENDCHAR +STARTCHAR U_37E2 +ENCODING 14306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0400 +3F80 +0A00 +FFE0 +0080 +1E80 +1280 +1E80 +0100 +ENDCHAR +STARTCHAR U_37E3 +ENCODING 14307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2540 +2F40 +A540 +AF20 +AEA0 +A480 +AD00 +FD40 +07A0 +0400 +ENDCHAR +STARTCHAR U_37E4 +ENCODING 14308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0100 +1F00 +0100 +FFE0 +0400 +4480 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_37E5 +ENCODING 14309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0A00 +3F80 +0400 +FFE0 +0A00 +3580 +DE60 +0B20 +3C00 +ENDCHAR +STARTCHAR U_37E6 +ENCODING 14310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +7FE0 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_37E7 +ENCODING 14311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7BC0 +4A40 +4A40 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_37E8 +ENCODING 14312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +AFE0 +A000 +AFE0 +A900 +AFE0 +BAA0 +EAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_37E9 +ENCODING 14313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +8BE0 +FA40 +9680 +F900 +9680 +C860 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37EA +ENCODING 14314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +AAA0 +ABE0 +A800 +AFE0 +BB00 +CAA0 +0240 +0320 +ENDCHAR +STARTCHAR U_37EB +ENCODING 14315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +A7E0 +AC20 +AFE0 +A900 +BD20 +EBC0 +0540 +0920 +ENDCHAR +STARTCHAR U_37EC +ENCODING 14316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +FF80 +0000 +EB80 +8880 +EB80 +8880 +FF80 +6300 +3C00 +E780 +ENDCHAR +STARTCHAR U_37ED +ENCODING 14317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +0220 +23E0 +2240 +ABE0 +AA40 +ABE0 +AA20 +FBE0 +0220 +03E0 +ENDCHAR +STARTCHAR U_37EE +ENCODING 14318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +A7E0 +A5A0 +AA40 +A940 +AFE0 +B900 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_37EF +ENCODING 14319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0400 +7FE0 +88A0 +3300 +4E00 +1100 +3F80 +5140 +1F00 +ENDCHAR +STARTCHAR U_37F0 +ENCODING 14320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +A7C0 +AC40 +AFC0 +AC40 +AFC0 +A900 +FFE0 +0440 +0820 +ENDCHAR +STARTCHAR U_37F1 +ENCODING 14321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +A7E0 +A900 +AFE0 +A900 +A900 +AFE0 +F800 +0540 +0AA0 +ENDCHAR +STARTCHAR U_37F2 +ENCODING 14322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +ABE0 +AA20 +ABE0 +AA20 +ABE0 +A880 +FAC0 +14A0 +2180 +ENDCHAR +STARTCHAR U_37F3 +ENCODING 14323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +AAA0 +AAA0 +AFE0 +A900 +AFE0 +FB80 +0540 +0920 +ENDCHAR +STARTCHAR U_37F4 +ENCODING 14324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +A520 +AFE0 +AD20 +AFE0 +AA80 +BAE0 +E280 +04A0 +1860 +ENDCHAR +STARTCHAR U_37F5 +ENCODING 14325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +4A40 +7FC0 +0000 +7FC0 +1700 +1400 +FFE0 +ENDCHAR +STARTCHAR U_37F6 +ENCODING 14326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +4400 +5FC0 +5FC0 +5040 +5FC0 +8A80 +B660 +ENDCHAR +STARTCHAR U_37F7 +ENCODING 14327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +A440 +A900 +AA80 +AC40 +ABA0 +B800 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_37F8 +ENCODING 14328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +AFC0 +AC40 +AFC0 +A900 +BFE0 +E140 +0FE0 +0100 +ENDCHAR +STARTCHAR U_37F9 +ENCODING 14329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E80 +2B60 +2AA0 +AEA0 +AAA0 +AEA0 +AAA0 +BAA0 +CFE0 +1A80 +0280 +ENDCHAR +STARTCHAR U_37FA +ENCODING 14330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2480 +FFE0 +2480 +3F80 +7FC0 +5540 +FFE0 +0E00 +3B80 +ENDCHAR +STARTCHAR U_37FB +ENCODING 14331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FD80 +1100 +FDE0 +9540 +FD40 +1240 +FE40 +1400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_37FC +ENCODING 14332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2100 +F900 +21E0 +7240 +2540 +F980 +3880 +4940 +9620 +ENDCHAR +STARTCHAR U_37FD +ENCODING 14333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +AAA0 +AFE0 +A800 +ABC0 +B800 +E7E0 +0540 +0B20 +ENDCHAR +STARTCHAR U_37FE +ENCODING 14334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +A940 +AFE0 +A940 +AFC0 +AD40 +AFC0 +FD40 +17C0 +1540 +ENDCHAR +STARTCHAR U_37FF +ENCODING 14335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +A440 +A920 +AFE0 +AA80 +AC60 +BA40 +EFE0 +0240 +0440 +ENDCHAR +STARTCHAR U_3800 +ENCODING 14336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +3FE0 +AA20 +4440 +7FC0 +ENDCHAR +STARTCHAR U_3801 +ENCODING 14337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +D780 +D440 +DEE0 +D7A0 +DB60 +D580 +F660 +0180 +0E00 +ENDCHAR +STARTCHAR U_3802 +ENCODING 14338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +A500 +AFE0 +A520 +BF40 +A940 +AF40 +FA80 +0B40 +1620 +ENDCHAR +STARTCHAR U_3803 +ENCODING 14339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +AA80 +AFE0 +A920 +ABA0 +A920 +FBA0 +0AA0 +0BA0 +ENDCHAR +STARTCHAR U_3804 +ENCODING 14340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +FBE0 +28A0 +FBE0 +1540 +3F80 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3805 +ENCODING 14341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2400 +27E0 +4FC0 +B7C0 +6440 +A7E0 +2C80 +2300 +2EE0 +ENDCHAR +STARTCHAR U_3806 +ENCODING 14342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +DEE0 +D7C0 +D540 +D7C0 +D540 +D7C0 +F100 +9FE0 +0100 +ENDCHAR +STARTCHAR U_3807 +ENCODING 14343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2000 +FD20 +0100 +FFE0 +8900 +F980 +2280 +7280 +ACE0 +ENDCHAR +STARTCHAR U_3808 +ENCODING 14344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +AAA0 +AEE0 +ABA0 +A920 +ABA0 +F920 +0BA0 +0860 +ENDCHAR +STARTCHAR U_3809 +ENCODING 14345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +BFE0 +AFE0 +A920 +AFE0 +A900 +FFC0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_380A +ENCODING 14346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +A900 +AFE0 +A900 +A8E0 +A940 +FB60 +1140 +17E0 +ENDCHAR +STARTCHAR U_380B +ENCODING 14347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7FC0 +4A40 +7FC0 +0000 +FFE0 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_380C +ENCODING 14348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +4900 +FD00 +4BE0 +7CA0 +7880 +4880 +FD40 +4940 +8620 +ENDCHAR +STARTCHAR U_380D +ENCODING 14349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1200 +3FC0 +6200 +BFC0 +3FC0 +2600 +FFE0 +1580 +E460 +ENDCHAR +STARTCHAR U_380E +ENCODING 14350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2880 +AFE0 +A880 +AFE0 +A900 +BFE0 +E100 +0540 +0920 +ENDCHAR +STARTCHAR U_380F +ENCODING 14351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +A440 +AFE0 +A540 +AFE0 +A540 +AFE0 +F900 +07C0 +0100 +ENDCHAR +STARTCHAR U_3810 +ENCODING 14352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0180 +3E00 +0440 +FFE0 +2A80 +7FC0 +AAA0 +2E80 +2180 +ENDCHAR +STARTCHAR U_3811 +ENCODING 14353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +7FC0 +4A40 +FFE0 +0A00 +7BC0 +0A00 +FBE0 +1200 +ENDCHAR +STARTCHAR U_3812 +ENCODING 14354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2520 +2FA0 +AAA0 +ADA0 +AFA0 +A8A0 +BFA0 +E720 +8AA0 +1260 +ENDCHAR +STARTCHAR U_3813 +ENCODING 14355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2A40 +AFE0 +A820 +ABC0 +A920 +BAC0 +EDA0 +82A0 +0580 +ENDCHAR +STARTCHAR U_3814 +ENCODING 14356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +3F80 +0100 +3BC0 +2A80 +5FE0 +9100 +2BC0 +3900 +0100 +ENDCHAR +STARTCHAR U_3815 +ENCODING 14357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +FF80 +0400 +EF80 +AA80 +AF80 +AA80 +AF80 +E540 +8980 +91C0 +ENDCHAR +STARTCHAR U_3816 +ENCODING 14358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7FC0 +0400 +3F80 +1240 +FFE0 +1940 +71A0 +3660 +ENDCHAR +STARTCHAR U_3817 +ENCODING 14359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2B60 +ADA0 +AFE0 +ABA0 +AD60 +B100 +EFE0 +8240 +0C20 +ENDCHAR +STARTCHAR U_3818 +ENCODING 14360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +4860 +8E20 +E8E0 +8E20 +E6E0 +8A20 +FFE0 +3180 +C060 +ENDCHAR +STARTCHAR U_3819 +ENCODING 14361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2A40 +AFE0 +A820 +ABC0 +A920 +BB40 +EDC0 +82A0 +0580 +ENDCHAR +STARTCHAR U_381A +ENCODING 14362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +3B40 +2A40 +BFE0 +AA40 +BF40 +A4C0 +BE40 +E440 +8640 +18C0 +ENDCHAR +STARTCHAR U_381B +ENCODING 14363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +2A80 +AFE0 +AA80 +ABE0 +AA80 +BBE0 +EA40 +8180 +0E60 +ENDCHAR +STARTCHAR U_381C +ENCODING 14364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2C40 +2880 +AFE0 +A8A0 +AC80 +A8E0 +FF80 +8880 +0D80 +1260 +ENDCHAR +STARTCHAR U_381D +ENCODING 14365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2A40 +AFE0 +AA40 +ADA0 +AA40 +BBC0 +EA40 +83C0 +0420 +ENDCHAR +STARTCHAR U_381E +ENCODING 14366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +55E0 +BFA0 +5540 +CE40 +44A0 +5F20 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_381F +ENCODING 14367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +22E0 +2720 +2A60 +AFA0 +AAE0 +A900 +BA80 +ED60 +8380 +0540 +ENDCHAR +STARTCHAR U_3820 +ENCODING 14368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +2100 +2FE0 +A940 +AFE0 +AAA0 +ABE0 +AAA0 +FFE0 +8AA0 +1FE0 +ENDCHAR +STARTCHAR U_3821 +ENCODING 14369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2280 +ABC0 +AA80 +ABE0 +AAA0 +FF40 +8640 +0A80 +0360 +ENDCHAR +STARTCHAR U_3822 +ENCODING 14370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2480 +3F80 +2480 +3F80 +1540 +FFE0 +2240 +E980 +3060 +ENDCHAR +STARTCHAR U_3823 +ENCODING 14371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2920 +2A40 +AFE0 +AAC0 +AF60 +AA40 +A900 +F5C0 +9500 +2FE0 +ENDCHAR +STARTCHAR U_3824 +ENCODING 14372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2AA0 +AEE0 +AA80 +AFE0 +AA80 +FFE0 +8540 +0C80 +0660 +ENDCHAR +STARTCHAR U_3825 +ENCODING 14373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2540 +27C0 +A540 +AFE0 +AAA0 +AFE0 +A900 +FBC0 +8900 +07E0 +ENDCHAR +STARTCHAR U_3826 +ENCODING 14374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +2FE0 +2AA0 +2FE0 +A800 +AFE0 +AA40 +ABC0 +FA40 +8180 +07E0 +ENDCHAR +STARTCHAR U_3827 +ENCODING 14375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA40 +AFE0 +AB40 +AEE0 +AA80 +FEE0 +8A80 +0EE0 +1280 +ENDCHAR +STARTCHAR U_3828 +ENCODING 14376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +2EE0 +2540 +AFE0 +AAA0 +AFE0 +AD20 +ABE0 +FEA0 +8A20 +0D60 +ENDCHAR +STARTCHAR U_3829 +ENCODING 14377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4400 +4A00 +7180 +4000 +7FC0 +2480 +2480 +2480 +4480 +8460 +ENDCHAR +STARTCHAR U_382A +ENCODING 14378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +0400 +0400 +0400 +0780 +0400 +0400 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_382B +ENCODING 14379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2340 +2AC0 +3240 +C460 +3F80 +0400 +FFE0 +0A00 +71C0 +ENDCHAR +STARTCHAR U_382C +ENCODING 14380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +3A20 +E3E0 +0400 +3F80 +0400 +FFE0 +0900 +1080 +6060 +ENDCHAR +STARTCHAR U_382D +ENCODING 14381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +2080 +3880 +E3E0 +0000 +FBE0 +2080 +2080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_382E +ENCODING 14382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +29E0 +FE80 +2880 +AA80 +6C80 +FE80 +4480 +7C80 +4480 +7FE0 +ENDCHAR +STARTCHAR U_382F +ENCODING 14383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF00 +0100 +8100 +FF00 +8000 +8000 +FF80 +8080 +8080 +FF80 +8000 +ENDCHAR +STARTCHAR U_3830 +ENCODING 14384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +FBC0 +2A40 +4A40 +9BC0 +0000 +7F00 +0100 +7F00 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3831 +ENCODING 14385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +3F80 +2040 +7FE0 +1100 +1F00 +1100 +FFE0 +1100 +2080 +ENDCHAR +STARTCHAR U_3832 +ENCODING 14386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA60 +AA80 +AB00 +AA00 +AA00 +AA20 +BA20 +2220 +21E0 +ENDCHAR +STARTCHAR U_3833 +ENCODING 14387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +1B00 +E0E0 +0400 +3FC0 +2440 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_3834 +ENCODING 14388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +A920 +AB20 +AD20 +A920 +A920 +BA20 +22A0 +2440 +ENDCHAR +STARTCHAR U_3835 +ENCODING 14389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0400 +7FC0 +4440 +4440 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_3836 +ENCODING 14390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +FB80 +AA80 +AA80 +AA80 +AA80 +AAA0 +BAA0 +24A0 +2860 +ENDCHAR +STARTCHAR U_3837 +ENCODING 14391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA80 +AAE0 +AA20 +AA20 +AA40 +AB40 +BA80 +2540 +2A20 +ENDCHAR +STARTCHAR U_3838 +ENCODING 14392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +A900 +A900 +AFE0 +A900 +A900 +BA80 +2440 +2820 +ENDCHAR +STARTCHAR U_3839 +ENCODING 14393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +AC40 +A820 +AA80 +AA80 +AA80 +BA80 +2280 +2480 +ENDCHAR +STARTCHAR U_383A +ENCODING 14394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F8C0 +AAA0 +AAA0 +AC80 +A8A0 +A840 +B880 +2300 +2C00 +ENDCHAR +STARTCHAR U_383B +ENCODING 14395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +3FC0 +0500 +FFE0 +1400 +3FC0 +E440 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_383C +ENCODING 14396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2300 +FA00 +AA00 +ABE0 +AA40 +AA40 +AA40 +BA40 +2440 +2840 +ENDCHAR +STARTCHAR U_383D +ENCODING 14397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC40 +AA80 +A900 +AA80 +AC60 +A900 +B880 +2300 +2080 +ENDCHAR +STARTCHAR U_383E +ENCODING 14398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3A40 +4AC0 +B220 +15E0 +2400 +FFC0 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_383F +ENCODING 14399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5AC0 +5300 +5A20 +E5E0 +0400 +3FC0 +2440 +2440 +25C0 +0400 +ENDCHAR +STARTCHAR U_3840 +ENCODING 14400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1480 +1500 +FFE0 +8420 +9520 +94A0 +A460 +C420 +8420 +8060 +ENDCHAR +STARTCHAR U_3841 +ENCODING 14401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F980 +AA40 +ADA0 +A800 +ABC0 +B900 +ABC0 +2040 +20C0 +ENDCHAR +STARTCHAR U_3842 +ENCODING 14402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +4120 +7D20 +C920 +3120 +2420 +C460 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_3843 +ENCODING 14403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FAA0 +AB00 +ABE0 +A800 +AAA0 +AAA0 +BAA0 +22A0 +2420 +ENDCHAR +STARTCHAR U_3844 +ENCODING 14404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +A820 +ABA0 +AAA0 +ABA0 +AAA0 +BBA0 +20A0 +2040 +ENDCHAR +STARTCHAR U_3845 +ENCODING 14405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +21E0 +FB20 +A8C0 +A880 +AB40 +A8E0 +BB20 +A8C0 +2080 +2700 +ENDCHAR +STARTCHAR U_3846 +ENCODING 14406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +AA00 +ABE0 +A800 +AAA0 +BAA0 +AAA0 +22A0 +2420 +ENDCHAR +STARTCHAR U_3847 +ENCODING 14407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A80 +FA80 +AE80 +AA80 +AE80 +AA80 +BA80 +AEA0 +32A0 +2260 +ENDCHAR +STARTCHAR U_3848 +ENCODING 14408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2240 +FC80 +ABE0 +AAA0 +AAA0 +ABE0 +B940 +A940 +2240 +2460 +ENDCHAR +STARTCHAR U_3849 +ENCODING 14409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2240 +FBE0 +AE40 +A8A0 +A920 +AEC0 +BA40 +AAA0 +23E0 +2D20 +ENDCHAR +STARTCHAR U_384A +ENCODING 14410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +FA40 +AC80 +A800 +AB40 +ACE0 +B420 +26E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_384B +ENCODING 14411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +F940 +AAA0 +AFE0 +AAA0 +ABE0 +BAA0 +ABE0 +2080 +20E0 +ENDCHAR +STARTCHAR U_384C +ENCODING 14412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +A7E0 +FC20 +ABE0 +AA20 +BBE0 +AA20 +23E0 +2220 +2260 +ENDCHAR +STARTCHAR U_384D +ENCODING 14413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3F80 +2680 +3880 +3F80 +0400 +FFE0 +2480 +DF60 +1500 +1500 +ENDCHAR +STARTCHAR U_384E +ENCODING 14414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +F900 +AFE0 +AA80 +AAC0 +AD20 +BA80 +AB40 +2080 +2700 +ENDCHAR +STARTCHAR U_384F +ENCODING 14415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +ABA0 +A800 +AE20 +AAA0 +BEA0 +AAA0 +2E20 +3260 +ENDCHAR +STARTCHAR U_3850 +ENCODING 14416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +A800 +AE20 +AAA0 +AEA0 +BAA0 +2EA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_3851 +ENCODING 14417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +E4A0 +22A0 +FAC0 +3080 +6940 +A620 +0400 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_3852 +ENCODING 14418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F880 +AFE0 +A900 +ABC0 +AAC0 +AB40 +BAC0 +2B40 +33C0 +ENDCHAR +STARTCHAR U_3853 +ENCODING 14419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +A900 +AFC0 +A940 +AFC0 +A940 +BFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_3854 +ENCODING 14420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +11E0 +FF20 +1540 +3080 +D360 +0400 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_3855 +ENCODING 14421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +A540 +F900 +AFC0 +A940 +A940 +BFE0 +A900 +2280 +2C60 +ENDCHAR +STARTCHAR U_3856 +ENCODING 14422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FFE0 +A880 +ABE0 +AAA0 +ABE0 +BAA0 +ABE0 +2080 +27E0 +ENDCHAR +STARTCHAR U_3857 +ENCODING 14423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2F00 +F9C0 +A900 +AFE0 +A940 +AFE0 +AA80 +2A80 +32A0 +2460 +ENDCHAR +STARTCHAR U_3858 +ENCODING 14424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +FA80 +AFE0 +AAA0 +AFE0 +AAA0 +AFE0 +BA80 +26C0 +2AA0 +ENDCHAR +STARTCHAR U_3859 +ENCODING 14425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +A920 +AAA0 +AFE0 +A880 +AEE0 +B880 +2AA0 +2CE0 +ENDCHAR +STARTCHAR U_385A +ENCODING 14426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +F940 +ABE0 +A940 +AFE0 +AAA0 +ABE0 +BAA0 +27E0 +2220 +ENDCHAR +STARTCHAR U_385B +ENCODING 14427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +A880 +AB40 +AA20 +ABE0 +A800 +BD40 +2540 +2D60 +ENDCHAR +STARTCHAR U_385C +ENCODING 14428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2760 +FDA0 +AAC0 +AE40 +ABA0 +A800 +AFE0 +BA80 +22C0 +25A0 +ENDCHAR +STARTCHAR U_385D +ENCODING 14429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +25A0 +FA40 +A8A0 +AFE0 +AA40 +AAE0 +AA40 +BAE0 +2240 +25E0 +ENDCHAR +STARTCHAR U_385E +ENCODING 14430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +FAA0 +AFE0 +AAA0 +ABE0 +AAA0 +BFE0 +A920 +21C0 +2620 +ENDCHAR +STARTCHAR U_385F +ENCODING 14431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +AAA0 +AFE0 +AAA0 +BFE0 +24C0 +2740 +27C0 +ENDCHAR +STARTCHAR U_3860 +ENCODING 14432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +25A0 +FAC0 +AA40 +AFE0 +A800 +ABC0 +AA40 +BBC0 +2240 +27E0 +ENDCHAR +STARTCHAR U_3861 +ENCODING 14433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FF20 +A820 +AFE0 +A920 +AFA0 +B960 +2E20 +3320 +2C60 +ENDCHAR +STARTCHAR U_3862 +ENCODING 14434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +AFE0 +AAA0 +AFE0 +B900 +A9C0 +2240 +24C0 +ENDCHAR +STARTCHAR U_3863 +ENCODING 14435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FD00 +49E0 +FC20 +85E0 +2100 +FDE0 +A500 +A5E0 +AD00 +21E0 +ENDCHAR +STARTCHAR U_3864 +ENCODING 14436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +AA80 +AFE0 +A900 +AFC0 +A900 +BFE0 +2540 +2920 +ENDCHAR +STARTCHAR U_3865 +ENCODING 14437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FBE0 +A880 +ABE0 +A840 +AFE0 +A840 +BBC0 +2540 +2BA0 +ENDCHAR +STARTCHAR U_3866 +ENCODING 14438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +AFC0 +AB20 +ADC0 +AB40 +AEC0 +BB40 +23C0 +2420 +ENDCHAR +STARTCHAR U_3867 +ENCODING 14439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AC40 +AB80 +AD60 +ABC0 +AE60 +BBC0 +2240 +27E0 +ENDCHAR +STARTCHAR U_3868 +ENCODING 14440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2560 +FAC0 +AFE0 +AA80 +AAC0 +AE80 +AAC0 +BEA0 +22C0 +2720 +ENDCHAR +STARTCHAR U_3869 +ENCODING 14441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +EEE0 +4040 +AEA0 +E0E0 +5F40 +AAA0 +FFE0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_386A +ENCODING 14442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FFE0 +A820 +AFE0 +AAA0 +AEA0 +BBC0 +AE60 +2980 +3660 +ENDCHAR +STARTCHAR U_386B +ENCODING 14443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2440 +27C0 +4440 +D7E0 +5520 +2920 +26A0 +5460 +F7A0 +4060 +ENDCHAR +STARTCHAR U_386C +ENCODING 14444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +54A0 +E5C0 +54A0 +F5E0 +0480 +FFE0 +4240 +7A80 +49A0 +9E60 +ENDCHAR +STARTCHAR U_386D +ENCODING 14445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +A940 +B9C0 +9080 +A940 +FFE0 +9080 +A940 +9080 +A940 +FFE0 +ENDCHAR +STARTCHAR U_386E +ENCODING 14446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +FEE0 +5500 +FEE0 +1400 +7EE0 +4820 +6840 +5A80 +4D20 +B4E0 +ENDCHAR +STARTCHAR U_386F +ENCODING 14447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4080 +4F00 +4200 +4200 +5FC0 +4200 +4200 +4220 +83E0 +ENDCHAR +STARTCHAR U_3870 +ENCODING 14448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4200 +4200 +7FE0 +4200 +4200 +4200 +8600 +ENDCHAR +STARTCHAR U_3871 +ENCODING 14449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4400 +4780 +4880 +4900 +5100 +4280 +4480 +9860 +ENDCHAR +STARTCHAR U_3872 +ENCODING 14450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4280 +4240 +5FE0 +4200 +4240 +4280 +4100 +42A0 +8C60 +ENDCHAR +STARTCHAR U_3873 +ENCODING 14451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +5200 +5200 +5FC0 +5100 +5120 +54A0 +9860 +ENDCHAR +STARTCHAR U_3874 +ENCODING 14452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +4200 +5FC0 +4000 +4880 +4480 +4500 +4000 +BFE0 +ENDCHAR +STARTCHAR U_3875 +ENCODING 14453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4500 +4880 +7760 +4000 +4FC0 +4080 +4300 +8100 +ENDCHAR +STARTCHAR U_3876 +ENCODING 14454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4FC0 +4840 +4840 +4FC0 +4000 +4480 +4440 +8840 +ENDCHAR +STARTCHAR U_3877 +ENCODING 14455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4200 +5FC0 +4200 +4700 +4A80 +5240 +6FA0 +8200 +ENDCHAR +STARTCHAR U_3878 +ENCODING 14456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +4400 +4FE0 +5200 +43C0 +4200 +43C0 +4200 +8200 +ENDCHAR +STARTCHAR U_3879 +ENCODING 14457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4F80 +4880 +4F80 +4880 +4F80 +4880 +4880 +BFE0 +ENDCHAR +STARTCHAR U_387A +ENCODING 14458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5040 +5FC0 +4000 +BFE0 +ENDCHAR +STARTCHAR U_387B +ENCODING 14459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +59E0 +5520 +5520 +5520 +5DA0 +5560 +4500 +8900 +ENDCHAR +STARTCHAR U_387C +ENCODING 14460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FC0 +5240 +5FC0 +5240 +5FC0 +4280 +4320 +9DE0 +ENDCHAR +STARTCHAR U_387D +ENCODING 14461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FC0 +4240 +7FE0 +4240 +5FC0 +4200 +BFE0 +8200 +ENDCHAR +STARTCHAR U_387E +ENCODING 14462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5FC0 +5240 +9580 +98E0 +ENDCHAR +STARTCHAR U_387F +ENCODING 14463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5040 +4880 +7FE0 +4200 +5240 +5FC0 +4200 +4400 +9800 +ENDCHAR +STARTCHAR U_3880 +ENCODING 14464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +7FE0 +4200 +5FC0 +5240 +52C0 +4700 +4A80 +B260 +ENDCHAR +STARTCHAR U_3881 +ENCODING 14465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +27C0 +2C40 +2380 +2E00 +21E0 +4E20 +41C0 +8F00 +ENDCHAR +STARTCHAR U_3882 +ENCODING 14466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +2400 +2FC0 +2840 +2FC0 +2800 +4FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3883 +ENCODING 14467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2400 +2FC0 +2840 +2FC0 +2840 +2FC0 +4A40 +4980 +8CE0 +ENDCHAR +STARTCHAR U_3884 +ENCODING 14468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4000 +4F80 +4880 +4F80 +4880 +4500 +BFE0 +ENDCHAR +STARTCHAR U_3885 +ENCODING 14469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4200 +5FC0 +4200 +5FC0 +4880 +7FE0 +9080 +ENDCHAR +STARTCHAR U_3886 +ENCODING 14470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +5FC0 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_3887 +ENCODING 14471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +2FE0 +2000 +27C0 +2000 +27C0 +4440 +4440 +87C0 +ENDCHAR +STARTCHAR U_3888 +ENCODING 14472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +4880 +5BE0 +6880 +4BE0 +4880 +4BE0 +4880 +8BE0 +ENDCHAR +STARTCHAR U_3889 +ENCODING 14473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +5860 +4B80 +7C80 +4BE0 +5C80 +6A80 +48A0 +88E0 +ENDCHAR +STARTCHAR U_388A +ENCODING 14474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +2FE0 +2280 +2440 +2FE0 +2540 +4740 +4040 +80C0 +ENDCHAR +STARTCHAR U_388B +ENCODING 14475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +25E0 +2A40 +3980 +2B40 +28E0 +4B20 +48C0 +8B00 +ENDCHAR +STARTCHAR U_388C +ENCODING 14476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FE0 +5440 +59C0 +5540 +55C0 +5C40 +50C0 +9040 +ENDCHAR +STARTCHAR U_388D +ENCODING 14477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +5DC0 +4A80 +4200 +4F80 +4A80 +7FE0 +4480 +9840 +ENDCHAR +STARTCHAR U_388E +ENCODING 14478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2FE0 +2100 +2FE0 +2500 +2920 +4D60 +4920 +8FE0 +ENDCHAR +STARTCHAR U_388F +ENCODING 14479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4500 +58C0 +6760 +5C40 +5540 +5D40 +5440 +ACC0 +ENDCHAR +STARTCHAR U_3890 +ENCODING 14480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +4F80 +4880 +4B80 +4A80 +5FE0 +54A0 +97A0 +9060 +ENDCHAR +STARTCHAR U_3891 +ENCODING 14481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FE0 +5100 +5FC0 +5100 +5FE0 +4100 +BFE0 +8100 +ENDCHAR +STARTCHAR U_3892 +ENCODING 14482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +5FE0 +52A0 +5FC0 +5580 +5680 +5580 +9680 +AFE0 +ENDCHAR +STARTCHAR U_3893 +ENCODING 14483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FC0 +4500 +7FE0 +4880 +4F80 +4880 +BFE0 +8200 +ENDCHAR +STARTCHAR U_3894 +ENCODING 14484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A40 +5240 +6340 +4CA0 +5000 +7280 +52E0 +5380 +94E0 +ENDCHAR +STARTCHAR U_3895 +ENCODING 14485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4940 +52E0 +7E40 +4AE0 +5240 +7EE0 +4A40 +5240 +A2E0 +ENDCHAR +STARTCHAR U_3896 +ENCODING 14486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5FC0 +4A80 +7FE0 +4700 +5AC0 +6FA0 +8A80 +8F80 +ENDCHAR +STARTCHAR U_3897 +ENCODING 14487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4400 +7FE0 +5540 +7FE0 +5540 +9740 +90C0 +ENDCHAR +STARTCHAR U_3898 +ENCODING 14488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4500 +5FC0 +4540 +7FE0 +4540 +9FC0 +92A0 +ENDCHAR +STARTCHAR U_3899 +ENCODING 14489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5480 +7E80 +55E0 +7EA0 +6AA0 +7EA0 +48A0 +4D20 +BA60 +ENDCHAR +STARTCHAR U_389A +ENCODING 14490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +5FE0 +5220 +5FC0 +5540 +57C0 +5540 +AFC0 +A440 +ENDCHAR +STARTCHAR U_389B +ENCODING 14491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +4500 +4880 +7760 +5DC0 +5540 +5DC0 +8880 +B560 +ENDCHAR +STARTCHAR U_389C +ENCODING 14492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4880 +5FC0 +5240 +5FC0 +4A40 +A8A0 +A7A0 +ENDCHAR +STARTCHAR U_389D +ENCODING 14493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9C40 +A580 +BE80 +EBE0 +BE80 +AA80 +BFC0 +AAA0 +D580 +ENDCHAR +STARTCHAR U_389E +ENCODING 14494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +6940 +58C0 +6940 +5FC0 +5240 +7FE0 +4880 +BFE0 +9040 +ENDCHAR +STARTCHAR U_389F +ENCODING 14495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2100 +4100 +F5C0 +1500 +1500 +9500 +6FE0 +2000 +DFE0 +ENDCHAR +STARTCHAR U_38A0 +ENCODING 14496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +2BA0 +4AA0 +8AA0 +EBA0 +2AA0 +A820 +4860 +6000 +9FE0 +ENDCHAR +STARTCHAR U_38A1 +ENCODING 14497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7AA0 +09C0 +7E40 +4BE0 +8940 +10C0 +1080 +FFE0 +1080 +6080 +ENDCHAR +STARTCHAR U_38A2 +ENCODING 14498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5500 +FFE0 +8240 +BB40 +AA80 +BB60 +2100 +FFE0 +2100 +4100 +ENDCHAR +STARTCHAR U_38A3 +ENCODING 14499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF00 +29E0 +7F40 +8540 +7480 +5540 +7E20 +1080 +FFE0 +1080 +2080 +ENDCHAR +STARTCHAR U_38A4 +ENCODING 14500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +7D20 +1100 +FFE0 +2100 +3D00 +2500 +2480 +44A0 +8C60 +ENDCHAR +STARTCHAR U_38A5 +ENCODING 14501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +82A0 +FE80 +83E0 +BA80 +AA80 +AA80 +AA80 +BA80 +8260 +8620 +ENDCHAR +STARTCHAR U_38A6 +ENCODING 14502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +0920 +E900 +ABE0 +FD00 +0900 +E900 +A880 +E8A0 +0860 +1820 +ENDCHAR +STARTCHAR U_38A7 +ENCODING 14503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0080 +0080 +3F80 +2000 +4000 +7FC0 +0040 +FE40 +0040 +0780 +ENDCHAR +STARTCHAR U_38A8 +ENCODING 14504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +1100 +F100 +8FE0 +8100 +F100 +1100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_38A9 +ENCODING 14505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1200 +13E0 +F420 +8020 +8220 +F120 +1120 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U_38AA +ENCODING 14506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1000 +1000 +F7E0 +8200 +8200 +F3C0 +1040 +1040 +5140 +2080 +ENDCHAR +STARTCHAR U_38AB +ENCODING 14507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +1080 +1080 +F080 +84A0 +84A0 +F4A0 +14A0 +14A0 +54A0 +27E0 +ENDCHAR +STARTCHAR U_38AC +ENCODING 14508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +1FE0 +7100 +8100 +8240 +F240 +1280 +1480 +1920 +63E0 +ENDCHAR +STARTCHAR U_38AD +ENCODING 14509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +11C0 +F100 +8100 +87C0 +F440 +1440 +1280 +5100 +26E0 +ENDCHAR +STARTCHAR U_38AE +ENCODING 14510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +1400 +1FE0 +F500 +8500 +8FE0 +F520 +1540 +1400 +5420 +23E0 +ENDCHAR +STARTCHAR U_38AF +ENCODING 14511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1420 +1420 +77E0 +8480 +8480 +F7E0 +1480 +14A0 +5660 +2420 +ENDCHAR +STARTCHAR U_38B0 +ENCODING 14512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +2FE0 +2920 +E900 +8FC0 +EC40 +2A80 +2900 +AA80 +5460 +ENDCHAR +STARTCHAR U_38B1 +ENCODING 14513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +1200 +F440 +8FE0 +8120 +F100 +1540 +1520 +5B20 +2100 +ENDCHAR +STARTCHAR U_38B2 +ENCODING 14514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +0840 +7BC0 +4200 +7BC0 +0840 +18C0 +FFE0 +0000 +1100 +2080 +ENDCHAR +STARTCHAR U_38B3 +ENCODING 14515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +17E0 +7400 +48C0 +7700 +1520 +14C0 +1480 +5440 +2620 +ENDCHAR +STARTCHAR U_38B4 +ENCODING 14516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0080 +7F80 +8000 +FFC0 +4640 +6A40 +5640 +6A40 +7E40 +0180 +ENDCHAR +STARTCHAR U_38B5 +ENCODING 14517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +1280 +F440 +8BA0 +8000 +F7C0 +1440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_38B6 +ENCODING 14518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +1200 +F7C0 +8440 +8440 +F7C0 +1440 +1440 +97C0 +6440 +ENDCHAR +STARTCHAR U_38B7 +ENCODING 14519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +14A0 +14A0 +F7E0 +8100 +81E0 +F220 +1520 +10C0 +5080 +2700 +ENDCHAR +STARTCHAR U_38B8 +ENCODING 14520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D900 +4900 +D9E0 +9240 +D840 +4940 +4940 +4940 +4880 +6940 +9620 +ENDCHAR +STARTCHAR U_38B9 +ENCODING 14521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +1440 +7280 +4FE0 +7100 +1FE0 +1100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_38BA +ENCODING 14522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +F440 +8FE0 +F200 +1FE0 +1240 +1740 +1080 +A140 +4620 +ENDCHAR +STARTCHAR U_38BB +ENCODING 14523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +1700 +7100 +4FE0 +7340 +1D20 +1280 +1FE0 +1280 +5180 +2660 +ENDCHAR +STARTCHAR U_38BC +ENCODING 14524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +1340 +F7E0 +8520 +F520 +17A0 +1560 +1520 +5520 +2540 +ENDCHAR +STARTCHAR U_38BD +ENCODING 14525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0E0 +3F20 +2A20 +EEE0 +8A80 +8E80 +EAE0 +2E20 +3A20 +A2A0 +4240 +ENDCHAR +STARTCHAR U_38BE +ENCODING 14526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2280 +2FE0 +EAA0 +8AA0 +8FE0 +E100 +27C0 +2100 +2100 +6FE0 +ENDCHAR +STARTCHAR U_38BF +ENCODING 14527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EB80 +2880 +2FE0 +EA00 +9BC0 +8D00 +E900 +2FE0 +2900 +2A80 +CC60 +ENDCHAR +STARTCHAR U_38C0 +ENCODING 14528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +1100 +F7C0 +8540 +86C0 +F540 +1640 +1FE0 +1440 +6820 +ENDCHAR +STARTCHAR U_38C1 +ENCODING 14529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7C0 +1280 +7FE0 +4400 +77C0 +1D40 +17C0 +1540 +57C0 +2540 +ENDCHAR +STARTCHAR U_38C2 +ENCODING 14530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +27C0 +E440 +87C0 +E000 +2FE0 +2C60 +2AA0 +2FE0 +A920 +4920 +ENDCHAR +STARTCHAR U_38C3 +ENCODING 14531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +3F20 +EAE0 +9F80 +E1E0 +2E20 +2A20 +2E20 +2A20 +AEA0 +5240 +ENDCHAR +STARTCHAR U_38C4 +ENCODING 14532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E9E0 +25C0 +E920 +83E0 +ED00 +25E0 +2100 +2FE0 +2380 +A540 +4920 +ENDCHAR +STARTCHAR U_38C5 +ENCODING 14533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +3540 +3FE0 +E440 +8D40 +92A0 +EFC0 +2840 +2FC0 +2840 +CFC0 +ENDCHAR +STARTCHAR U_38C6 +ENCODING 14534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +2FE0 +ED60 +8BA0 +8000 +EFE0 +2100 +27C0 +2100 +CFE0 +ENDCHAR +STARTCHAR U_38C7 +ENCODING 14535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +1080 +FFE0 +2A00 +D200 +3FC0 +D240 +1240 +12C0 +0200 +ENDCHAR +STARTCHAR U_38C8 +ENCODING 14536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +4A40 +FFE0 +5140 +A680 +4100 +A280 +FBE0 +AAA0 +BAE0 +2080 +ENDCHAR +STARTCHAR U_38C9 +ENCODING 14537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FC40 +1080 +1120 +1040 +1080 +1100 +1420 +3840 +C080 +0300 +ENDCHAR +STARTCHAR U_38CA +ENCODING 14538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0F80 +1900 +2600 +0900 +32E0 +CD00 +0200 +1C80 +0300 +1C00 +ENDCHAR +STARTCHAR U_38CB +ENCODING 14539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FE40 +4480 +5500 +4440 +FE80 +4520 +4420 +4440 +4480 +8300 +ENDCHAR +STARTCHAR U_38CC +ENCODING 14540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2080 +3900 +2240 +2040 +2080 +F920 +8A20 +8840 +8880 +FB00 +ENDCHAR +STARTCHAR U_38CD +ENCODING 14541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2040 +4080 +8520 +FC40 +0080 +FD20 +8420 +8440 +8480 +FD00 +ENDCHAR +STARTCHAR U_38CE +ENCODING 14542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +6080 +3F80 +2080 +3F80 +2580 +DC40 +0320 +3C80 +0300 +7C00 +ENDCHAR +STARTCHAR U_38CF +ENCODING 14543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +2480 +FE00 +4420 +7CC0 +4500 +7C20 +1040 +FC80 +1300 +ENDCHAR +STARTCHAR U_38D0 +ENCODING 14544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FC80 +8500 +FC00 +8440 +FC80 +1100 +D420 +5840 +5480 +B100 +ENDCHAR +STARTCHAR U_38D1 +ENCODING 14545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +8880 +BE00 +8A20 +FF40 +AA80 +BE00 +AA20 +BE40 +AB80 +ENDCHAR +STARTCHAR U_38D2 +ENCODING 14546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +FE20 +D640 +BB80 +FE20 +0040 +7D80 +4420 +7C40 +4580 +7E00 +ENDCHAR +STARTCHAR U_38D3 +ENCODING 14547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3820 +2740 +7D80 +CA00 +3120 +CB40 +2C80 +FF00 +2C20 +4A40 +8980 +ENDCHAR +STARTCHAR U_38D4 +ENCODING 14548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2FE0 +4080 +9080 +2080 +6080 +A080 +2080 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_38D5 +ENCODING 14549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +9200 +2FE0 +6200 +A200 +2200 +2500 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_38D6 +ENCODING 14550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +C100 +1FE0 +2100 +E100 +2280 +2280 +2640 +2940 +3020 +ENDCHAR +STARTCHAR U_38D7 +ENCODING 14551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +47E0 +9420 +2420 +67E0 +A400 +2400 +2400 +2800 +3000 +ENDCHAR +STARTCHAR U_38D8 +ENCODING 14552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +43E0 +9420 +2820 +67A0 +A4A0 +24A0 +27A0 +2020 +20E0 +ENDCHAR +STARTCHAR U_38D9 +ENCODING 14553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +9920 +2920 +6920 +AFE0 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_38DA +ENCODING 14554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +9BA0 +2820 +6BA0 +AAA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_38DB +ENCODING 14555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4280 +9440 +2820 +67C0 +A000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_38DC +ENCODING 14556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +5F20 +8A20 +2AA0 +4AA0 +DFA0 +4AA0 +4AA0 +4A20 +4A20 +5260 +ENDCHAR +STARTCHAR U_38DD +ENCODING 14557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +4120 +9FE0 +2100 +6500 +BF40 +2540 +2480 +24A0 +2960 +3220 +ENDCHAR +STARTCHAR U_38DE +ENCODING 14558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +4440 +9A20 +2440 +6FE0 +A000 +2480 +2480 +2480 +24A0 +28E0 +ENDCHAR +STARTCHAR U_38DF +ENCODING 14559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9FE0 +2100 +6100 +A7C0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_38E0 +ENCODING 14560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +43C0 +9440 +2280 +5100 +D280 +5C60 +5100 +5280 +4100 +4080 +ENDCHAR +STARTCHAR U_38E1 +ENCODING 14561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4880 +9880 +2BE0 +4AA0 +CAA0 +4BE0 +4880 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_38E2 +ENCODING 14562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +47E0 +9120 +27E0 +6500 +A7E0 +2120 +2320 +2560 +2900 +ENDCHAR +STARTCHAR U_38E3 +ENCODING 14563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +9540 +2540 +6BA0 +A100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_38E4 +ENCODING 14564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +4140 +90A0 +2760 +6000 +A140 +27E0 +2140 +20A0 +2760 +ENDCHAR +STARTCHAR U_38E5 +ENCODING 14565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4880 +9FE0 +2880 +4BC0 +C840 +4FE0 +4A40 +4940 +4840 +48C0 +ENDCHAR +STARTCHAR U_38E6 +ENCODING 14566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +9380 +2540 +6920 +A200 +2FE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_38E7 +ENCODING 14567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +4A80 +9C80 +2A80 +5E80 +D280 +5E80 +5280 +5E80 +52A0 +56E0 +ENDCHAR +STARTCHAR U_38E8 +ENCODING 14568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +4840 +8BE0 +3E40 +4A40 +D240 +53E0 +4D20 +4520 +4BE0 +5120 +ENDCHAR +STARTCHAR U_38E9 +ENCODING 14569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4480 +9FE0 +2480 +6E80 +ADC0 +36A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_38EA +ENCODING 14570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +4E20 +9540 +27C0 +6200 +AFE0 +2200 +23C0 +2640 +2980 +3660 +ENDCHAR +STARTCHAR U_38EB +ENCODING 14571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4100 +9FE0 +2100 +67C0 +A540 +27C0 +2540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_38EC +ENCODING 14572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +43C0 +9000 +27E0 +6240 +A3C0 +2260 +23C0 +2640 +2040 +ENDCHAR +STARTCHAR U_38ED +ENCODING 14573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +4920 +8AA0 +2FE0 +4480 +C880 +5460 +47C0 +4C80 +4300 +5CE0 +ENDCHAR +STARTCHAR U_38EE +ENCODING 14574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +4FE0 +1200 +2FE0 +6AA0 +ABA0 +2920 +2FE0 +2920 +2960 +ENDCHAR +STARTCHAR U_38EF +ENCODING 14575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4840 +9FC0 +2920 +4D40 +CBC0 +4A40 +4BC0 +4A40 +53C0 +6440 +ENDCHAR +STARTCHAR U_38F0 +ENCODING 14576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2920 +4540 +8FE0 +2380 +4540 +C920 +4200 +5540 +54A0 +57A0 +ENDCHAR +STARTCHAR U_38F1 +ENCODING 14577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +8FE0 +2440 +47C0 +C440 +47C0 +4440 +47C0 +4820 +ENDCHAR +STARTCHAR U_38F2 +ENCODING 14578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5680 +9EE0 +2140 +5D40 +C140 +5C80 +5480 +5D40 +4220 +ENDCHAR +STARTCHAR U_38F3 +ENCODING 14579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +4FC0 +9A80 +2A80 +5FC0 +CA80 +7FE0 +4000 +5540 +5520 +ENDCHAR +STARTCHAR U_38F4 +ENCODING 14580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4480 +9FE0 +2100 +4FC0 +C940 +4FC0 +4940 +4FC0 +5020 +ENDCHAR +STARTCHAR U_38F5 +ENCODING 14581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4880 +83E0 +3D40 +4BE0 +C880 +4BE0 +4880 +5480 +63E0 +ENDCHAR +STARTCHAR U_38F6 +ENCODING 14582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4440 +8540 +2440 +47C0 +C000 +47C0 +47C0 +4440 +5FE0 +ENDCHAR +STARTCHAR U_38F7 +ENCODING 14583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +8280 +2BA0 +4000 +C7C0 +4540 +5FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_38F8 +ENCODING 14584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C40 +2D40 +5EC0 +8CE0 +3F40 +5840 +CEE0 +5440 +6EE0 +5500 +6CE0 +ENDCHAR +STARTCHAR U_38F9 +ENCODING 14585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5540 +9FE0 +3540 +55E0 +D540 +55E0 +5280 +5660 +6BA0 +ENDCHAR +STARTCHAR U_38FA +ENCODING 14586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1000 +1000 +5480 +9240 +9240 +1000 +1000 +1000 +1000 +1000 +ENDCHAR +STARTCHAR U_38FB +ENCODING 14587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +1900 +0600 +0700 +0880 +3060 +4420 +1300 +5040 +5120 +8F20 +ENDCHAR +STARTCHAR U_38FC +ENCODING 14588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2220 +2220 +7220 +A620 +2320 +22A0 +2220 +2220 +24A0 +2860 +ENDCHAR +STARTCHAR U_38FD +ENCODING 14589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0880 +FFE0 +1100 +3600 +1B00 +60C0 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_38FE +ENCODING 14590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +A540 +B540 +A440 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_38FF +ENCODING 14591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +A3E0 +B420 +A420 +AA20 +2120 +2120 +2020 +2240 +2180 +ENDCHAR +STARTCHAR U_3900 +ENCODING 14592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C00 +4200 +4500 +58C0 +4000 +7FE0 +0000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3901 +ENCODING 14593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0A00 +1100 +E0E0 +0000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3902 +ENCODING 14594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13C0 +1840 +1580 +2200 +4DE0 +0000 +56A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3903 +ENCODING 14595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +A200 +B200 +ABE0 +A220 +2220 +2420 +24A0 +2840 +ENDCHAR +STARTCHAR U_3904 +ENCODING 14596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AFE0 +A920 +2920 +2920 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_3905 +ENCODING 14597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +4400 +7FC0 +0A00 +3220 +C3E0 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3906 +ENCODING 14598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +A400 +B7E0 +AE20 +A620 +2540 +2540 +2480 +2540 +2A20 +ENDCHAR +STARTCHAR U_3907 +ENCODING 14599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +2100 +A100 +B100 +AFE0 +A100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3908 +ENCODING 14600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2100 +A080 +B280 +A280 +AA20 +2A20 +2A20 +2A00 +2240 +21C0 +ENDCHAR +STARTCHAR U_3909 +ENCODING 14601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +A080 +B480 +A480 +AFE0 +2280 +2280 +2480 +2A80 +2100 +ENDCHAR +STARTCHAR U_390A +ENCODING 14602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +A180 +B240 +A420 +A000 +2420 +2240 +2180 +2240 +2420 +ENDCHAR +STARTCHAR U_390B +ENCODING 14603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +A280 +B440 +A820 +A7C0 +2240 +2240 +2240 +2540 +2880 +ENDCHAR +STARTCHAR U_390C +ENCODING 14604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +A7E0 +B240 +AA40 +A240 +23C0 +2240 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_390D +ENCODING 14605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F900 +23E0 +2020 +3820 +C0E0 +0000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_390E +ENCODING 14606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +2520 +49E0 +9000 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_390F +ENCODING 14607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +A420 +BA40 +A980 +A240 +2C20 +2180 +2040 +2180 +2040 +ENDCHAR +STARTCHAR U_3910 +ENCODING 14608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +3F80 +2080 +3F80 +0000 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3911 +ENCODING 14609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AA00 +A400 +2FC0 +3440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3912 +ENCODING 14610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AA80 +A540 +2920 +37C0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_3913 +ENCODING 14611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +A100 +B380 +A540 +2920 +3100 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_3914 +ENCODING 14612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +A240 +B5E0 +AC40 +B540 +2540 +2540 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_3915 +ENCODING 14613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2920 +B920 +AFE0 +A100 +2100 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3916 +ENCODING 14614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B820 +A000 +A7C0 +2100 +2100 +2100 +2500 +2300 +ENDCHAR +STARTCHAR U_3917 +ENCODING 14615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +1F00 +0400 +7FC0 +1100 +E4E0 +0400 +2540 +0C00 +ENDCHAR +STARTCHAR U_3918 +ENCODING 14616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +B240 +A480 +AFE0 +A020 +2020 +27E0 +2020 +2020 +2FE0 +ENDCHAR +STARTCHAR U_3919 +ENCODING 14617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7E40 +4240 +7E40 +4040 +7FC0 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_391A +ENCODING 14618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25C0 +A800 +B400 +A7E0 +A880 +3880 +2880 +2880 +2880 +2980 +ENDCHAR +STARTCHAR U_391B +ENCODING 14619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2240 +B380 +A480 +AC80 +B480 +27E0 +2480 +2480 +2480 +25C0 +ENDCHAR +STARTCHAR U_391C +ENCODING 14620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +B880 +ACA0 +AAA0 +2AC0 +2880 +2980 +2AA0 +3460 +ENDCHAR +STARTCHAR U_391D +ENCODING 14621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B200 +A440 +AFE0 +22A0 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_391E +ENCODING 14622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +BFE0 +A820 +A8E0 +A700 +2100 +2FE0 +2100 +2120 +20E0 +ENDCHAR +STARTCHAR U_391F +ENCODING 14623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A00 +7FC0 +4A40 +7FC0 +4A40 +7FC0 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3920 +ENCODING 14624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2020 +3920 +4920 +A920 +1120 +6060 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_3921 +ENCODING 14625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2420 +A4A0 +BEA0 +AAA0 +AAA0 +36A0 +22A0 +2420 +3820 +2060 +ENDCHAR +STARTCHAR U_3922 +ENCODING 14626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B200 +A3C0 +A640 +2BC0 +2240 +23C0 +2240 +22C0 +ENDCHAR +STARTCHAR U_3923 +ENCODING 14627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +1100 +FFE0 +1100 +6100 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3924 +ENCODING 14628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +BFE0 +A920 +AFE0 +A920 +2FE0 +2900 +2500 +2200 +2DE0 +ENDCHAR +STARTCHAR U_3925 +ENCODING 14629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +A200 +A440 +A780 +2120 +2640 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_3926 +ENCODING 14630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +AFE0 +A920 +2FE0 +2900 +2500 +2200 +2DE0 +ENDCHAR +STARTCHAR U_3927 +ENCODING 14631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +B400 +AFE0 +AC00 +A400 +25E0 +2520 +2520 +2520 +29E0 +ENDCHAR +STARTCHAR U_3928 +ENCODING 14632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +B240 +AFE0 +AA40 +A240 +27E0 +2000 +2240 +2240 +2420 +ENDCHAR +STARTCHAR U_3929 +ENCODING 14633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +A080 +1F00 +60C0 +BFA0 +2080 +3F80 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_392A +ENCODING 14634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2000 +7BC0 +8A40 +52C0 +2220 +C3E0 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_392B +ENCODING 14635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1000 +3F80 +E080 +3C80 +2780 +2080 +0420 +52A0 +8F80 +ENDCHAR +STARTCHAR U_392C +ENCODING 14636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B7C0 +A100 +A100 +AFE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_392D +ENCODING 14637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +B100 +A100 +AFE0 +A280 +2440 +2AA0 +2280 +2280 +2480 +ENDCHAR +STARTCHAR U_392E +ENCODING 14638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +3100 +E100 +27C0 +E100 +2FE0 +C000 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_392F +ENCODING 14639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +BAA0 +AC60 +A820 +ABA0 +2AA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_3930 +ENCODING 14640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +23E0 +6600 +ABC0 +2200 +23C0 +2200 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3931 +ENCODING 14641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +B7C0 +AC40 +AC40 +A7C0 +2000 +2440 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_3932 +ENCODING 14642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5540 +8A20 +1100 +E0E0 +0440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3933 +ENCODING 14643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2380 +7540 +A920 +2100 +27C0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3934 +ENCODING 14644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A500 +B540 +A740 +A540 +2740 +2540 +2760 +2D60 +2100 +ENDCHAR +STARTCHAR U_3935 +ENCODING 14645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +11E0 +2240 +3540 +E080 +2140 +6620 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_3936 +ENCODING 14646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +A220 +B240 +A2A0 +A340 +25A0 +2540 +2980 +2B20 +30E0 +ENDCHAR +STARTCHAR U_3937 +ENCODING 14647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +ABA0 +A000 +A7C0 +2080 +2100 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3938 +ENCODING 14648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +A100 +AFE0 +A280 +2AC0 +2AA0 +32A0 +2480 +2980 +ENDCHAR +STARTCHAR U_3939 +ENCODING 14649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +B100 +AFE0 +A100 +A920 +2540 +2540 +2920 +2100 +2300 +ENDCHAR +STARTCHAR U_393A +ENCODING 14650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B400 +A400 +A7E0 +2000 +2540 +2540 +2540 +2960 +ENDCHAR +STARTCHAR U_393B +ENCODING 14651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +C220 +AAA0 +9A20 +BAE0 +CA00 +1200 +E440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_393C +ENCODING 14652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +AE80 +B5E0 +A4A0 +AEA0 +24A0 +28A0 +2AA0 +3EA0 +2160 +ENDCHAR +STARTCHAR U_393D +ENCODING 14653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +B7C0 +A100 +AFE0 +2240 +27E0 +2840 +3240 +20C0 +ENDCHAR +STARTCHAR U_393E +ENCODING 14654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +A280 +B440 +A100 +A100 +2FE0 +2380 +2540 +2540 +2920 +ENDCHAR +STARTCHAR U_393F +ENCODING 14655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A280 +B540 +AFE0 +A540 +27C0 +2540 +27C0 +2120 +21E0 +ENDCHAR +STARTCHAR U_3940 +ENCODING 14656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +B7C0 +AC40 +A440 +27C0 +2440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_3941 +ENCODING 14657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +BFC0 +AA40 +BFC0 +8000 +FFE0 +4840 +A4A0 +9FA0 +ENDCHAR +STARTCHAR U_3942 +ENCODING 14658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +7440 +A7C0 +2000 +2FE0 +2040 +2FE0 +2440 +20C0 +ENDCHAR +STARTCHAR U_3943 +ENCODING 14659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +7AA0 +AEE0 +2820 +2820 +2820 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_3944 +ENCODING 14660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +7FE0 +6440 +AA20 +27C0 +2A40 +2180 +2280 +2C60 +ENDCHAR +STARTCHAR U_3945 +ENCODING 14661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2540 +7FE0 +A820 +27C0 +2240 +2240 +2180 +2280 +2C60 +ENDCHAR +STARTCHAR U_3946 +ENCODING 14662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +3140 +6FE0 +A140 +27C0 +2920 +25C0 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_3947 +ENCODING 14663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +71A0 +A660 +2240 +2FE0 +2240 +2280 +2320 +2CE0 +ENDCHAR +STARTCHAR U_3948 +ENCODING 14664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8E0 +A880 +ABE0 +AA20 +BA20 +ABE0 +2620 +5240 +50A0 +9FA0 +ENDCHAR +STARTCHAR U_3949 +ENCODING 14665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +7240 +AFE0 +2000 +27E0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_394A +ENCODING 14666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +7EE0 +AAA0 +2AA0 +2EE0 +2AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_394B +ENCODING 14667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +C200 +4540 +5C80 +4540 +4620 +0800 +5540 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_394C +ENCODING 14668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2A20 +7AA0 +A720 +2FE0 +2220 +2720 +2AA0 +3260 +20C0 +ENDCHAR +STARTCHAR U_394D +ENCODING 14669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +2FE0 +7440 +A7C0 +2440 +27C0 +2440 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_394E +ENCODING 14670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FD20 +2120 +7120 +6A20 +AC40 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_394F +ENCODING 14671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2FE0 +7AA0 +AFE0 +2AA0 +2AA0 +3FE0 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_3950 +ENCODING 14672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +CE60 +0000 +7BC0 +4A40 +7AC0 +0600 +5240 +50A0 +9FA0 +ENDCHAR +STARTCHAR U_3951 +ENCODING 14673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +3F80 +2480 +2980 +3280 +FFE0 +8820 +6440 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_3952 +ENCODING 14674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2F20 +2540 +7000 +A100 +2FE0 +2100 +2380 +2540 +3920 +2100 +ENDCHAR +STARTCHAR U_3953 +ENCODING 14675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +7440 +AFE0 +2040 +2740 +2540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_3954 +ENCODING 14676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +7FE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +2840 +ENDCHAR +STARTCHAR U_3955 +ENCODING 14677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +0A00 +71C0 +4440 +2A80 +1100 +E4E0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_3956 +ENCODING 14678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4A40 +6A20 +5D20 +4940 +FE20 +4BE0 +4940 +4AA0 +8E60 +99C0 +ENDCHAR +STARTCHAR U_3957 +ENCODING 14679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +7440 +A7C0 +2100 +2FE0 +2280 +2280 +2100 +2EE0 +ENDCHAR +STARTCHAR U_3958 +ENCODING 14680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +2EA0 +74A0 +A4A0 +2EA0 +25A0 +28A0 +2AA0 +2EA0 +2160 +ENDCHAR +STARTCHAR U_3959 +ENCODING 14681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +7920 +AFE0 +2920 +2100 +2240 +2920 +2C60 +33C0 +ENDCHAR +STARTCHAR U_395A +ENCODING 14682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2960 +2920 +6D60 +B920 +2FE0 +2920 +2100 +2280 +2440 +3820 +ENDCHAR +STARTCHAR U_395B +ENCODING 14683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +2700 +71E0 +AF20 +29A0 +2F40 +2940 +21A0 +2200 +2FE0 +ENDCHAR +STARTCHAR U_395C +ENCODING 14684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +27E0 +74A0 +A7E0 +2000 +27E0 +2520 +24E0 +2720 +2860 +ENDCHAR +STARTCHAR U_395D +ENCODING 14685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +22A0 +22A0 +7EE0 +A8A0 +28E0 +2EA0 +22A0 +23E0 +2220 +2C20 +ENDCHAR +STARTCHAR U_395E +ENCODING 14686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +7100 +A320 +2DC0 +2280 +2DC0 +22A0 +2C80 +2300 +ENDCHAR +STARTCHAR U_395F +ENCODING 14687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2440 +2780 +7100 +AFE0 +2200 +2340 +2D80 +22C0 +2CA0 +2300 +ENDCHAR +STARTCHAR U_3960 +ENCODING 14688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +35C0 +A700 +A9E0 +A000 +27C0 +2440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_3961 +ENCODING 14689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +37E0 +AE00 +A7C0 +AA00 +33E0 +2100 +2FE0 +2340 +2D20 +ENDCHAR +STARTCHAR U_3962 +ENCODING 14690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +3280 +AFE0 +AAA0 +AAA0 +2C60 +2820 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_3963 +ENCODING 14691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2480 +5F40 +8420 +7FC0 +0400 +7FC0 +0800 +5540 +9F20 +ENDCHAR +STARTCHAR U_3964 +ENCODING 14692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2940 +FEA0 +35C0 +5040 +B080 +1100 +0440 +5220 +90A0 +8F80 +ENDCHAR +STARTCHAR U_3965 +ENCODING 14693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +7540 +6FC0 +A100 +2FE0 +2920 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_3966 +ENCODING 14694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4400 +7FC0 +5480 +5680 +6940 +7FC0 +0400 +5240 +90A0 +8F80 +ENDCHAR +STARTCHAR U_3967 +ENCODING 14695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +3FE0 +A820 +AFE0 +A820 +2FE0 +2820 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_3968 +ENCODING 14696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFC0 +5100 +9FE0 +5100 +27C0 +5100 +8FE0 +5440 +92A0 +1F80 +ENDCHAR +STARTCHAR U_3969 +ENCODING 14697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FA0 +3240 +AA80 +BFE0 +A200 +27C0 +2C40 +37C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_396A +ENCODING 14698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2380 +2FE0 +7300 +AD80 +A960 +2200 +2FE0 +2480 +2300 +2DC0 +ENDCHAR +STARTCHAR U_396B +ENCODING 14699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2000 +B7C0 +AC40 +A7C0 +2FE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_396C +ENCODING 14700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +7280 +6FE0 +B120 +2FE0 +2200 +23C0 +2440 +28C0 +ENDCHAR +STARTCHAR U_396D +ENCODING 14701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3100 +6FC0 +A200 +BFE0 +2540 +2D60 +3380 +2540 +2300 +ENDCHAR +STARTCHAR U_396E +ENCODING 14702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +2920 +B7E0 +A120 +AA20 +2FE0 +2920 +37E0 +2120 +2660 +ENDCHAR +STARTCHAR U_396F +ENCODING 14703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4880 +2500 +7FC0 +0040 +7FE0 +0040 +7FC0 +0440 +52A0 +9F80 +ENDCHAR +STARTCHAR U_3970 +ENCODING 14704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2560 +2920 +2D60 +7920 +AFE0 +2100 +2FC0 +2440 +2280 +2300 +3CE0 +ENDCHAR +STARTCHAR U_3971 +ENCODING 14705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +2F60 +7940 +AF60 +2940 +2F60 +2940 +2940 +2A40 +2FE0 +ENDCHAR +STARTCHAR U_3972 +ENCODING 14706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +3F80 +2480 +FFE0 +2080 +C460 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_3973 +ENCODING 14707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2BC0 +7A40 +ABC0 +2A40 +2BC0 +2880 +2AC0 +2CA0 +3180 +ENDCHAR +STARTCHAR U_3974 +ENCODING 14708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +5D40 +57E0 +F500 +D540 +57E0 +5400 +5540 +5540 +5540 +6A60 +ENDCHAR +STARTCHAR U_3975 +ENCODING 14709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +7920 +AB60 +2DA0 +2AE0 +2CA0 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_3976 +ENCODING 14710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +7FC0 +1100 +FFE0 +5440 +B2A0 +4F20 +ENDCHAR +STARTCHAR U_3977 +ENCODING 14711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +4200 +7FE0 +5240 +6DA0 +4880 +7460 +4A40 +98A0 +A7A0 +ENDCHAR +STARTCHAR U_3978 +ENCODING 14712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +9540 +F7C0 +A540 +A7C0 +F200 +A540 +A520 +AA60 +DBC0 +ENDCHAR +STARTCHAR U_3979 +ENCODING 14713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +7240 +2420 +FBC0 +2140 +7140 +AA40 +24C0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_397A +ENCODING 14714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +7FE0 +A240 +2460 +27A0 +2000 +2FE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_397B +ENCODING 14715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7FE0 +4100 +5D20 +4940 +7E80 +AD60 +CA20 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_397C +ENCODING 14716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +25C0 +7500 +AFE0 +2400 +27C0 +2400 +27E0 +2AA0 +2840 +ENDCHAR +STARTCHAR U_397D +ENCODING 14717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +77C0 +A100 +2FE0 +2440 +27C0 +2440 +27C0 +2820 +ENDCHAR +STARTCHAR U_397E +ENCODING 14718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +2FE0 +7A40 +AFE0 +2A00 +2FC0 +2A40 +2BC0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_397F +ENCODING 14719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +7540 +2140 +FC80 +4940 +9A20 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_3980 +ENCODING 14720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +57C0 +4A80 +6380 +DA80 +CD60 +53C0 +4900 +4BC0 +4D00 +53E0 +ENDCHAR +STARTCHAR U_3981 +ENCODING 14721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +D240 +5FC0 +5240 +7FE0 +4200 +BFE0 +1440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_3982 +ENCODING 14722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +A0A0 +3F80 +4440 +44C0 +0400 +5440 +9220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_3983 +ENCODING 14723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +3140 +6AA0 +AFE0 +AA80 +2BE0 +2C80 +2BE0 +2880 +37E0 +ENDCHAR +STARTCHAR U_3984 +ENCODING 14724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5980 +6EE0 +4880 +4200 +5940 +A8A0 +AFA0 +ENDCHAR +STARTCHAR U_3985 +ENCODING 14725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +3280 +6B80 +AD60 +A920 +27C0 +2540 +2540 +2540 +2100 +ENDCHAR +STARTCHAR U_3986 +ENCODING 14726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +6200 +DFE0 +D200 +5FE0 +5200 +5FE0 +5540 +6FE0 +6300 +ENDCHAR +STARTCHAR U_3987 +ENCODING 14727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3A80 +6FE0 +AAA0 +AFE0 +2A80 +2FE0 +2A80 +2BA0 +32E0 +ENDCHAR +STARTCHAR U_3988 +ENCODING 14728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +A100 +B7C0 +A100 +2FE0 +2000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3989 +ENCODING 14729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3100 +AFE0 +A820 +A7C0 +2440 +27C0 +2440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_398A +ENCODING 14730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +3440 +AFE0 +A540 +AFE0 +2540 +2FE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_398B +ENCODING 14731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +3440 +A920 +A7C0 +A100 +2FE0 +2640 +2BC0 +3240 +23C0 +ENDCHAR +STARTCHAR U_398C +ENCODING 14732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFC0 +4500 +FFE0 +4100 +5140 +75C0 +1240 +D0A0 +1F80 +ENDCHAR +STARTCHAR U_398D +ENCODING 14733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +B440 +A280 +AFE0 +2100 +2920 +2FE0 +2100 +2E00 +ENDCHAR +STARTCHAR U_398E +ENCODING 14734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +3240 +AFE0 +A240 +BFE0 +2FC0 +2A40 +2FC0 +2A40 +3FE0 +ENDCHAR +STARTCHAR U_398F +ENCODING 14735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +3EE0 +A880 +A660 +A480 +3FE0 +2480 +3FE0 +2480 +2840 +ENDCHAR +STARTCHAR U_3990 +ENCODING 14736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2FE0 +7080 +AE80 +2080 +2E80 +2A80 +2E80 +2A80 +2E60 +3120 +ENDCHAR +STARTCHAR U_3991 +ENCODING 14737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2280 +22E0 +BFA0 +AAA0 +AEA0 +2AA0 +2E40 +2A40 +3EA0 +2320 +ENDCHAR +STARTCHAR U_3992 +ENCODING 14738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +B100 +AFE0 +A000 +27C0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3993 +ENCODING 14739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EA0 +2BE0 +B680 +AA80 +2480 +2940 +3220 +2000 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_3994 +ENCODING 14740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A8A0 +FBE0 +8880 +F880 +8940 +FA20 +8C20 +6540 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_3995 +ENCODING 14741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2B20 +AAC0 +BD20 +AAC0 +2B40 +2DE0 +2A40 +28E0 +2840 +29E0 +ENDCHAR +STARTCHAR U_3996 +ENCODING 14742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +6AA0 +BEE0 +2820 +2920 +2E60 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_3997 +ENCODING 14743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +77C0 +AAA0 +27C0 +2000 +2FE0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3998 +ENCODING 14744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F9E0 +AB40 +FD40 +4140 +FC80 +4940 +9A20 +5440 +9120 +8FA0 +ENDCHAR +STARTCHAR U_3999 +ENCODING 14745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +7540 +AFE0 +2920 +2BA0 +2A60 +2540 +2CA0 +37A0 +ENDCHAR +STARTCHAR U_399A +ENCODING 14746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +F1E0 +A8A0 +A4A0 +5540 +F9E0 +4940 +FAE0 +4640 +4040 +8040 +ENDCHAR +STARTCHAR U_399B +ENCODING 14747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +69C0 +4E40 +68C0 +4E40 +6AC0 +5240 +FFE0 +4440 +B220 +50A0 +4F80 +ENDCHAR +STARTCHAR U_399C +ENCODING 14748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2280 +B480 +AFE0 +A480 +27C0 +2480 +2FE0 +2440 +2380 +3C60 +ENDCHAR +STARTCHAR U_399D +ENCODING 14749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EBE0 +5220 +F3E0 +1A20 +EBE0 +0940 +7660 +5240 +90A0 +8FA0 +ENDCHAR +STARTCHAR U_399E +ENCODING 14750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0440 +7FE0 +5280 +7580 +5240 +90A0 +8FA0 +ENDCHAR +STARTCHAR U_399F +ENCODING 14751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +D540 +37C0 +D540 +37C0 +D100 +17E0 +6840 +A420 +A0A0 +9F80 +ENDCHAR +STARTCHAR U_39A0 +ENCODING 14752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2520 +2DA0 +A520 +BFE0 +A520 +2FA0 +2260 +2720 +2260 +2FA0 +ENDCHAR +STARTCHAR U_39A1 +ENCODING 14753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +4BC0 +46A0 +6BC0 +EAA0 +EFE0 +C100 +4FE0 +4380 +4D60 +4100 +ENDCHAR +STARTCHAR U_39A2 +ENCODING 14754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +3540 +6000 +BEE0 +2AA0 +2EA0 +2AA0 +2EE0 +2A80 +2D80 +ENDCHAR +STARTCHAR U_39A3 +ENCODING 14755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +9F60 +4900 +9E60 +4B40 +54C0 +5F40 +4400 +1440 +52A0 +4F00 +ENDCHAR +STARTCHAR U_39A4 +ENCODING 14756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2540 +F900 +8A80 +FA40 +5460 +F900 +54A0 +2660 +E9A0 +ENDCHAR +STARTCHAR U_39A5 +ENCODING 14757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A920 +B7C0 +A100 +AFE0 +2540 +27C0 +2200 +2D60 +2BC0 +ENDCHAR +STARTCHAR U_39A6 +ENCODING 14758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2AA0 +2BA0 +2AA0 +2CE0 +2820 +ENDCHAR +STARTCHAR U_39A7 +ENCODING 14759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +2A40 +B7E0 +A540 +A9A0 +2000 +27C0 +2540 +2640 +27C0 +ENDCHAR +STARTCHAR U_39A8 +ENCODING 14760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AAA0 +BEE0 +A920 +2FE0 +2D60 +2FA0 +2BA0 +2D60 +2820 +ENDCHAR +STARTCHAR U_39A9 +ENCODING 14761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFC0 +BA80 +ABE0 +AA20 +2DE0 +2820 +2BC0 +2AA0 +2DC0 +ENDCHAR +STARTCHAR U_39AA +ENCODING 14762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A440 +BBC0 +AAA0 +2BA0 +2000 +2FC0 +2440 +2380 +2C60 +ENDCHAR +STARTCHAR U_39AB +ENCODING 14763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2FE0 +2280 +AFE0 +B540 +AFE0 +2440 +27C0 +2440 +27C0 +2820 +ENDCHAR +STARTCHAR U_39AC +ENCODING 14764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +B540 +ABE0 +AD40 +2BE0 +2F40 +25E0 +2B40 +29E0 +ENDCHAR +STARTCHAR U_39AD +ENCODING 14765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +BBA0 +A540 +AFE0 +AAA0 +2FE0 +2540 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_39AE +ENCODING 14766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +7FC0 +0400 +7FC0 +0400 +FFE0 +0240 +0380 +06A0 +7860 +ENDCHAR +STARTCHAR U_39AF +ENCODING 14767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +FFE0 +2200 +4200 +9220 +F940 +0180 +F9A0 +0660 +3820 +ENDCHAR +STARTCHAR U_39B0 +ENCODING 14768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +2920 +5500 +FFE0 +0100 +0140 +0140 +00A0 +01A0 +0260 +0420 +ENDCHAR +STARTCHAR U_39B1 +ENCODING 14769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7120 +0100 +FFE0 +0100 +2140 +2140 +7180 +2320 +34A0 +4060 +ENDCHAR +STARTCHAR U_39B2 +ENCODING 14770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +7D20 +1100 +FFE0 +2100 +3D40 +2480 +44A0 +5960 +8620 +ENDCHAR +STARTCHAR U_39B3 +ENCODING 14771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +0100 +1140 +7D40 +1140 +1CA0 +7160 +0220 +ENDCHAR +STARTCHAR U_39B4 +ENCODING 14772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +2100 +3920 +C920 +3140 +CD80 +79A0 +4A60 +7C20 +ENDCHAR +STARTCHAR U_39B5 +ENCODING 14773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +5120 +7D00 +93E0 +1100 +FD20 +3940 +5480 +54A0 +9160 +9620 +ENDCHAR +STARTCHAR U_39B6 +ENCODING 14774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +0100 +F920 +5140 +B940 +2180 +F8A0 +2160 +FA20 +ENDCHAR +STARTCHAR U_39B7 +ENCODING 14775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +1140 +6120 +FFE0 +A900 +F920 +A940 +F880 +A8A0 +A960 +9A20 +ENDCHAR +STARTCHAR U_39B8 +ENCODING 14776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3940 +2120 +FFE0 +8900 +F920 +8940 +F940 +20A0 +F960 +2220 +ENDCHAR +STARTCHAR U_39B9 +ENCODING 14777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4940 +7920 +4BE0 +FD00 +2100 +7D20 +9540 +6C80 +15A0 +6E60 +ENDCHAR +STARTCHAR U_39BA +ENCODING 14778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8140 +FD20 +B7E0 +A900 +B520 +AB20 +FD40 +08A0 +4960 +1A20 +ENDCHAR +STARTCHAR U_39BB +ENCODING 14779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2540 +B520 +27E0 +6D00 +2120 +FD20 +8540 +FCA0 +8560 +FE20 +ENDCHAR +STARTCHAR U_39BC +ENCODING 14780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +2900 +5520 +DF20 +4540 +6CA0 +4560 +7E20 +ENDCHAR +STARTCHAR U_39BD +ENCODING 14781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8A0 +27E0 +4080 +FB80 +4AA0 +7BA0 +49C0 +7EA0 +4960 +5A20 +ENDCHAR +STARTCHAR U_39BE +ENCODING 14782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +4040 +7FC0 +5200 +53C0 +5E40 +7280 +5020 +9FE0 +ENDCHAR +STARTCHAR U_39BF +ENCODING 14783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7FC0 +4040 +7FC0 +4200 +5FC0 +4200 +4A40 +5220 +A220 +ENDCHAR +STARTCHAR U_39C0 +ENCODING 14784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2000 +2F80 +2480 +26E0 +4940 +4880 +9360 +ENDCHAR +STARTCHAR U_39C1 +ENCODING 14785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2100 +27C0 +2100 +2FE0 +4200 +4440 +8FE0 +ENDCHAR +STARTCHAR U_39C2 +ENCODING 14786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2020 +3FE0 +2000 +2FE0 +2920 +4FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_39C3 +ENCODING 14787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2420 +2420 +F420 +2420 +3420 +65E0 +A620 +2020 +A020 +4020 +ENDCHAR +STARTCHAR U_39C4 +ENCODING 14788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2420 +2420 +F420 +2420 +3420 +6420 +A420 +2420 +A420 +47E0 +ENDCHAR +STARTCHAR U_39C5 +ENCODING 14789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +F120 +2120 +3120 +6120 +A220 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_39C6 +ENCODING 14790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +EFE0 +4920 +4920 +6920 +4920 +C9A0 +4960 +4100 +C100 +ENDCHAR +STARTCHAR U_39C7 +ENCODING 14791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +E820 +4820 +4820 +6BA0 +4820 +C820 +4820 +48A0 +C840 +ENDCHAR +STARTCHAR U_39C8 +ENCODING 14792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F020 +27E0 +2400 +3400 +67E0 +A020 +2020 +A0A0 +4040 +ENDCHAR +STARTCHAR U_39C9 +ENCODING 14793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FC0 +E800 +5780 +4000 +6F80 +4080 +C080 +40A0 +40A0 +C060 +ENDCHAR +STARTCHAR U_39CA +ENCODING 14794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +EFE0 +4100 +4FE0 +6920 +4920 +C920 +4960 +4920 +C100 +ENDCHAR +STARTCHAR U_39CB +ENCODING 14795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4120 +E100 +4FE0 +4100 +6100 +4280 +C280 +4440 +4820 +D020 +ENDCHAR +STARTCHAR U_39CC +ENCODING 14796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +21E0 +2F00 +3100 +61E0 +AF00 +2120 +A120 +41E0 +ENDCHAR +STARTCHAR U_39CD +ENCODING 14797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4200 +4200 +63E0 +4220 +C420 +4420 +48A0 +D040 +ENDCHAR +STARTCHAR U_39CE +ENCODING 14798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +E080 +4880 +4FE0 +6280 +4280 +C480 +4880 +5280 +C100 +ENDCHAR +STARTCHAR U_39CF +ENCODING 14799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +E820 +4C60 +4AA0 +6920 +4AA0 +CCA0 +4820 +48A0 +C840 +ENDCHAR +STARTCHAR U_39D0 +ENCODING 14800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4EE0 +E2A0 +4AA0 +4AA0 +6AA0 +44A0 +C440 +4AA0 +4920 +D220 +ENDCHAR +STARTCHAR U_39D1 +ENCODING 14801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +F100 +2FE0 +2120 +31A0 +6160 +A220 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_39D2 +ENCODING 14802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +2000 +3280 +6280 +A280 +2440 +A440 +4820 +ENDCHAR +STARTCHAR U_39D3 +ENCODING 14803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4F00 +EA80 +4A80 +4A80 +6A80 +4A80 +CA40 +4AA0 +4BA0 +D2A0 +ENDCHAR +STARTCHAR U_39D4 +ENCODING 14804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4120 +EFE0 +4900 +4940 +6940 +4940 +C880 +48A0 +4960 +D220 +ENDCHAR +STARTCHAR U_39D5 +ENCODING 14805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +44E0 +EAA0 +4AA0 +4AA0 +6AA0 +4EA0 +CAE0 +4280 +4480 +C880 +ENDCHAR +STARTCHAR U_39D6 +ENCODING 14806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E820 +4FE0 +4800 +6BC0 +4840 +C880 +4920 +4A20 +D1E0 +ENDCHAR +STARTCHAR U_39D7 +ENCODING 14807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +E280 +4AA0 +4BA0 +6AC0 +4A80 +CA80 +4AA0 +4BA0 +DC60 +ENDCHAR +STARTCHAR U_39D8 +ENCODING 14808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5DE0 +5100 +5D20 +E0E0 +1F00 +0400 +3F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39D9 +ENCODING 14809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +40A0 +E220 +4240 +4A40 +6A80 +5340 +C220 +4600 +4A40 +D1C0 +ENDCHAR +STARTCHAR U_39DA +ENCODING 14810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5FE0 +E400 +4400 +4780 +6480 +4680 +C580 +44A0 +47A0 +C860 +ENDCHAR +STARTCHAR U_39DB +ENCODING 14811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53E0 +5480 +5840 +1F00 +0400 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_39DC +ENCODING 14812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +F880 +2BE0 +2AA0 +3AA0 +6AE0 +AAA0 +2880 +A880 +4FE0 +ENDCHAR +STARTCHAR U_39DD +ENCODING 14813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7DE0 +2520 +49E0 +1F00 +0400 +3F80 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_39DE +ENCODING 14814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E00 +E200 +5FE0 +4200 +63E0 +4220 +C540 +4480 +4940 +D220 +ENDCHAR +STARTCHAR U_39DF +ENCODING 14815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4500 +E100 +4900 +4500 +6100 +4500 +C900 +5900 +4900 +C9E0 +ENDCHAR +STARTCHAR U_39E0 +ENCODING 14816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +F440 +2FE0 +2020 +3100 +6540 +A520 +2920 +A100 +4300 +ENDCHAR +STARTCHAR U_39E1 +ENCODING 14817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4100 +4240 +6C80 +4720 +C240 +4C80 +4140 +CE20 +ENDCHAR +STARTCHAR U_39E2 +ENCODING 14818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +F920 +2920 +2FE0 +3920 +6920 +AAA0 +2C60 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39E3 +ENCODING 14819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4900 +EFE0 +5100 +4100 +5FE0 +6380 +C540 +4920 +5120 +C100 +ENDCHAR +STARTCHAR U_39E4 +ENCODING 14820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F200 +2440 +3FE0 +6280 +A280 +2280 +A4A0 +4860 +ENDCHAR +STARTCHAR U_39E5 +ENCODING 14821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +2100 +3FE0 +6280 +A280 +22A0 +A4A0 +4860 +ENDCHAR +STARTCHAR U_39E6 +ENCODING 14822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +F7E0 +2820 +27A0 +34A0 +67A0 +A4A0 +27A0 +A0A0 +4040 +ENDCHAR +STARTCHAR U_39E7 +ENCODING 14823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4200 +4440 +6FE0 +4000 +C540 +4540 +4540 +C960 +ENDCHAR +STARTCHAR U_39E8 +ENCODING 14824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +E800 +4800 +4FE0 +6800 +4BC0 +CA40 +4A40 +4A40 +D3C0 +ENDCHAR +STARTCHAR U_39E9 +ENCODING 14825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5040 +FFC0 +5240 +5FC0 +7AC0 +5AC0 +DAC0 +5240 +5260 +E220 +ENDCHAR +STARTCHAR U_39EA +ENCODING 14826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +E480 +4FE0 +4800 +6BC0 +4A40 +CAC0 +4A00 +4A20 +D1E0 +ENDCHAR +STARTCHAR U_39EB +ENCODING 14827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +2FE0 +2AA0 +3AA0 +6AA0 +AAA0 +2AA0 +A820 +4860 +ENDCHAR +STARTCHAR U_39EC +ENCODING 14828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +4440 +4540 +7540 +C860 +1F00 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39ED +ENCODING 14829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +2120 +2140 +3920 +E1E0 +1F00 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39EE +ENCODING 14830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2400 +F8E0 +2820 +2820 +3820 +6EE0 +A820 +2820 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39EF +ENCODING 14831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F120 +2140 +2FE0 +3100 +6240 +AE80 +2320 +A220 +41E0 +ENDCHAR +STARTCHAR U_39F0 +ENCODING 14832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +E800 +4900 +4900 +6FE0 +4100 +C540 +4920 +5520 +C200 +ENDCHAR +STARTCHAR U_39F1 +ENCODING 14833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +5080 +8BE0 +0080 +FBE0 +0080 +F880 +8880 +8880 +F980 +ENDCHAR +STARTCHAR U_39F2 +ENCODING 14834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +4820 +4100 +6FE0 +4380 +C540 +4920 +5120 +C100 +ENDCHAR +STARTCHAR U_39F3 +ENCODING 14835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +EC60 +47C0 +E240 +44C0 +DF00 +0400 +3F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_39F4 +ENCODING 14836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42C0 +4CA0 +E480 +4FE0 +4480 +64A0 +46A0 +CCC0 +5480 +45A0 +CC60 +ENDCHAR +STARTCHAR U_39F5 +ENCODING 14837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +F100 +2340 +3520 +2920 +6100 +AFE0 +2820 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39F6 +ENCODING 14838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +27C0 +2440 +37C0 +6460 +AFC0 +20C0 +A340 +4CC0 +ENDCHAR +STARTCHAR U_39F7 +ENCODING 14839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F100 +2FE0 +2280 +3440 +6FE0 +A440 +2440 +A440 +47C0 +ENDCHAR +STARTCHAR U_39F8 +ENCODING 14840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +27C0 +2440 +37C0 +6000 +A7C0 +2080 +A100 +4300 +ENDCHAR +STARTCHAR U_39F9 +ENCODING 14841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +EFC0 +4840 +4FC0 +6000 +5FE0 +C080 +5FE0 +4880 +C580 +ENDCHAR +STARTCHAR U_39FA +ENCODING 14842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5D20 +E5C0 +4940 +5520 +4200 +6FC0 +C840 +4FC0 +4840 +CFC0 +ENDCHAR +STARTCHAR U_39FB +ENCODING 14843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +2D20 +21C0 +3680 +6EC0 +A3A0 +2FA0 +A080 +4300 +ENDCHAR +STARTCHAR U_39FC +ENCODING 14844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +3100 +2FE0 +6180 +A2A0 +26C0 +AA40 +4320 +ENDCHAR +STARTCHAR U_39FD +ENCODING 14845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3BA0 +6AA0 +AAA0 +2BA0 +A820 +4FE0 +ENDCHAR +STARTCHAR U_39FE +ENCODING 14846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +EAA0 +42A0 +4520 +6560 +4000 +C240 +5520 +5440 +C3C0 +ENDCHAR +STARTCHAR U_39FF +ENCODING 14847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +EAA0 +5120 +4000 +6100 +4500 +C5E0 +4500 +4B00 +D1E0 +ENDCHAR +STARTCHAR U_3A00 +ENCODING 14848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2100 +F7E0 +2100 +27C0 +3140 +6FE0 +A140 +27C0 +A380 +4540 +ENDCHAR +STARTCHAR U_3A01 +ENCODING 14849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +37C0 +6440 +A7C0 +2440 +A440 +4FE0 +ENDCHAR +STARTCHAR U_3A02 +ENCODING 14850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2540 +37C0 +6540 +A7C0 +2380 +A540 +4920 +ENDCHAR +STARTCHAR U_3A03 +ENCODING 14851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +27C0 +2000 +37C0 +6040 +AFE0 +2080 +A280 +4100 +ENDCHAR +STARTCHAR U_3A04 +ENCODING 14852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FBA0 +2920 +2FE0 +3820 +6BA0 +AAA0 +2BA0 +A820 +5060 +ENDCHAR +STARTCHAR U_3A05 +ENCODING 14853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +2100 +2FE0 +3920 +6AA0 +AA60 +2C60 +A820 +4860 +ENDCHAR +STARTCHAR U_3A06 +ENCODING 14854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +EEE0 +4440 +4440 +6CC0 +CEE0 +5560 +5540 +4440 +C440 +ENDCHAR +STARTCHAR U_3A07 +ENCODING 14855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4F80 +AA80 +4D00 +0A00 +D500 +3E00 +0800 +3E00 +FF80 +0800 +1800 +ENDCHAR +STARTCHAR U_3A08 +ENCODING 14856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2100 +2EE0 +3000 +6440 +A7C0 +2440 +A7C0 +4840 +ENDCHAR +STARTCHAR U_3A09 +ENCODING 14857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2480 +27E0 +3640 +67E0 +A420 +27E0 +A420 +47E0 +ENDCHAR +STARTCHAR U_3A0A +ENCODING 14858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F200 +23E0 +2480 +33E0 +6000 +A3E0 +22A0 +A260 +42A0 +ENDCHAR +STARTCHAR U_3A0B +ENCODING 14859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27E0 +F140 +2FE0 +2100 +3200 +67E0 +AA20 +23E0 +A220 +43E0 +ENDCHAR +STARTCHAR U_3A0C +ENCODING 14860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F9C0 +7140 +F940 +8A60 +7000 +23E0 +7220 +2140 +F880 +6360 +ENDCHAR +STARTCHAR U_3A0D +ENCODING 14861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +77E0 +2040 +FA40 +20C0 +F700 +0200 +1F80 +0200 +3FC0 +0600 +ENDCHAR +STARTCHAR U_3A0E +ENCODING 14862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +2AA0 +3860 +6100 +AFE0 +2100 +A280 +4C60 +ENDCHAR +STARTCHAR U_3A0F +ENCODING 14863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +F7E0 +2200 +2FE0 +3280 +62A0 +A5C0 +2480 +A540 +4A20 +ENDCHAR +STARTCHAR U_3A10 +ENCODING 14864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4A20 +EA20 +53E0 +5080 +73E0 +5080 +D1C0 +52A0 +56A0 +D080 +ENDCHAR +STARTCHAR U_3A11 +ENCODING 14865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +4920 +EAA0 +4FE0 +4440 +6A20 +43C0 +C440 +4A80 +4100 +CEE0 +ENDCHAR +STARTCHAR U_3A12 +ENCODING 14866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E440 +4920 +47C0 +6100 +4FE0 +C100 +47C0 +4100 +CFE0 +ENDCHAR +STARTCHAR U_3A13 +ENCODING 14867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EAA0 +4440 +4940 +6500 +47C0 +C900 +4FE0 +4100 +C100 +ENDCHAR +STARTCHAR U_3A14 +ENCODING 14868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4080 +EFE0 +4880 +4E80 +68A0 +4EA0 +CAC0 +4E80 +51A0 +D260 +ENDCHAR +STARTCHAR U_3A15 +ENCODING 14869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +4840 +E860 +4FA0 +4AA0 +6920 +52A0 +C400 +5FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_3A16 +ENCODING 14870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +4900 +E9E0 +5120 +5EA0 +6AA0 +48A0 +DC40 +48A0 +4D20 +D220 +ENDCHAR +STARTCHAR U_3A17 +ENCODING 14871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +E7C0 +4040 +4FE0 +6040 +47C0 +C100 +49E0 +4900 +D7E0 +ENDCHAR +STARTCHAR U_3A18 +ENCODING 14872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +E540 +4BA0 +47C0 +6C40 +57C0 +C440 +47C0 +4440 +C7C0 +ENDCHAR +STARTCHAR U_3A19 +ENCODING 14873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F300 +2640 +2380 +3220 +67E0 +A100 +2FE0 +A100 +4EE0 +ENDCHAR +STARTCHAR U_3A1A +ENCODING 14874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F240 +27E0 +3820 +27A0 +64A0 +A7A0 +24A0 +A7A0 +4040 +ENDCHAR +STARTCHAR U_3A1B +ENCODING 14875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +EEE0 +4AA0 +4EE0 +6820 +4920 +C920 +4AA0 +4CA0 +C860 +ENDCHAR +STARTCHAR U_3A1C +ENCODING 14876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +4A20 +4FC0 +6A00 +4BE0 +C900 +4EE0 +4900 +D6E0 +ENDCHAR +STARTCHAR U_3A1D +ENCODING 14877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +EFE0 +4AA0 +49C0 +6BE0 +4A20 +CBE0 +4A20 +4BE0 +D260 +ENDCHAR +STARTCHAR U_3A1E +ENCODING 14878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E7C0 +4FE0 +4200 +64C0 +4300 +C440 +4FE0 +4540 +C920 +ENDCHAR +STARTCHAR U_3A1F +ENCODING 14879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +EFE0 +4000 +4FE0 +6000 +47C0 +C440 +47C0 +4280 +CFE0 +ENDCHAR +STARTCHAR U_3A20 +ENCODING 14880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +F7C0 +2440 +27C0 +3440 +67C0 +A100 +2FE0 +A440 +4820 +ENDCHAR +STARTCHAR U_3A21 +ENCODING 14881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2920 +2E20 +3960 +6EA0 +A9E0 +2EA0 +A920 +4FE0 +ENDCHAR +STARTCHAR U_3A22 +ENCODING 14882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +52C0 +FF80 +40A0 +5EE0 +7200 +5EA0 +D2C0 +5E80 +52A0 +D2E0 +ENDCHAR +STARTCHAR U_3A23 +ENCODING 14883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2540 +FA20 +27C0 +3040 +6EE0 +AAA0 +2660 +AAA0 +4440 +ENDCHAR +STARTCHAR U_3A24 +ENCODING 14884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4940 +E9E0 +4A40 +4EE0 +6A40 +4AE0 +CA40 +4AE0 +4800 +CFE0 +ENDCHAR +STARTCHAR U_3A25 +ENCODING 14885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4880 +EBE0 +56A0 +4AA0 +6AA0 +56A0 +DB60 +4220 +4620 +DA60 +ENDCHAR +STARTCHAR U_3A26 +ENCODING 14886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4BE0 +F880 +4BE0 +4880 +6BE0 +4000 +C7C0 +4440 +4380 +CC60 +ENDCHAR +STARTCHAR U_3A27 +ENCODING 14887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +F7E0 +2100 +2FE0 +3280 +67C0 +BD60 +27C0 +A540 +47C0 +ENDCHAR +STARTCHAR U_3A28 +ENCODING 14888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4DE0 +E8A0 +4AA0 +4D60 +6000 +4FE0 +C920 +4FE0 +4920 +CFE0 +ENDCHAR +STARTCHAR U_3A29 +ENCODING 14889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E800 +4F20 +49C0 +6A40 +4AE0 +CB40 +4DE0 +4A00 +D5E0 +ENDCHAR +STARTCHAR U_3A2A +ENCODING 14890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +E7C0 +4440 +47C0 +6920 +4540 +CFE0 +4280 +42A0 +CC60 +ENDCHAR +STARTCHAR U_3A2B +ENCODING 14891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +5500 +F5E0 +5680 +5440 +4400 +6000 +DFC0 +5540 +5540 +BFE0 +ENDCHAR +STARTCHAR U_3A2C +ENCODING 14892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2440 +27C0 +3120 +62C0 +A680 +2A60 +4300 +ENDCHAR +STARTCHAR U_3A2D +ENCODING 14893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E820 +4FE0 +4A40 +6BC0 +4BE0 +CAA0 +4BE0 +4A00 +D3E0 +ENDCHAR +STARTCHAR U_3A2E +ENCODING 14894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4560 +4BA0 +EAA0 +4BA0 +4AA0 +6BA0 +4C60 +C280 +4280 +42A0 +CC60 +ENDCHAR +STARTCHAR U_3A2F +ENCODING 14895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5FA0 +EEA0 +4AC0 +4EA0 +60A0 +4EA0 +C2C0 +5F80 +4480 +CC80 +ENDCHAR +STARTCHAR U_3A30 +ENCODING 14896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2640 +2CA0 +37C0 +6300 +A540 +2CC0 +B580 +4660 +ENDCHAR +STARTCHAR U_3A31 +ENCODING 14897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +E940 +4580 +4E00 +6100 +CFE0 +4000 +4FE0 +C440 +47C0 +ENDCHAR +STARTCHAR U_3A32 +ENCODING 14898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +2100 +2FE0 +2920 +37C0 +6100 +A380 +2540 +6920 +ENDCHAR +STARTCHAR U_3A33 +ENCODING 14899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +2280 +3FE0 +6040 +A740 +2540 +2740 +60C0 +ENDCHAR +STARTCHAR U_3A34 +ENCODING 14900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +5E80 +E9E0 +5E00 +52E0 +7E40 +D280 +5E80 +4900 +DF20 +48C0 +ENDCHAR +STARTCHAR U_3A35 +ENCODING 14901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +EA00 +4EA0 +4AA0 +6EA0 +D260 +4000 +4FE0 +C220 +5CC0 +ENDCHAR +STARTCHAR U_3A36 +ENCODING 14902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +2400 +37C0 +6400 +A7E0 +2020 +2AA0 +6060 +ENDCHAR +STARTCHAR U_3A37 +ENCODING 14903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F240 +27E0 +3D20 +67E0 +A100 +2FE0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_3A38 +ENCODING 14904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EA20 +4480 +5520 +C640 +5BC0 +4100 +4920 +4920 +CFE0 +ENDCHAR +STARTCHAR U_3A39 +ENCODING 14905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4EE0 +F440 +4EE0 +4440 +6EE0 +CFC0 +4040 +5FE0 +4040 +CFC0 +ENDCHAR +STARTCHAR U_3A3A +ENCODING 14906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +3100 +6FE0 +A920 +2BA0 +2D60 +A920 +6860 +ENDCHAR +STARTCHAR U_3A3B +ENCODING 14907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +AA00 +FBE0 +AA80 +FC80 +2F80 +0400 +7FE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_3A3C +ENCODING 14908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0780 +FC80 +AB00 +FCC0 +AA80 +FB80 +1E00 +0400 +FFC0 +0400 +1C00 +ENDCHAR +STARTCHAR U_3A3D +ENCODING 14909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +4020 +EE20 +4AA0 +4EA0 +60A0 +DFA0 +5520 +5F20 +5520 +DF60 +ENDCHAR +STARTCHAR U_3A3E +ENCODING 14910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4BA0 +E7C0 +4100 +4FE0 +6200 +CF20 +4140 +4F80 +4340 +CD20 +ENDCHAR +STARTCHAR U_3A3F +ENCODING 14911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2080 +F7E0 +24A0 +37C0 +6480 +A5E0 +26A0 +25A0 +A500 +6AE0 +ENDCHAR +STARTCHAR U_3A40 +ENCODING 14912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +4900 +4FC0 +6900 +CBE0 +4D60 +4AA0 +4920 +D2C0 +ENDCHAR +STARTCHAR U_3A41 +ENCODING 14913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F440 +2A20 +2480 +3FE0 +E480 +27E0 +2480 +E7E0 +ENDCHAR +STARTCHAR U_3A42 +ENCODING 14914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +4E40 +52C0 +E440 +5FC0 +5540 +7F60 +D5C0 +5F40 +5540 +E340 +ENDCHAR +STARTCHAR U_3A43 +ENCODING 14915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F7C0 +2280 +2FE0 +3280 +E540 +28A0 +2300 +6080 +ENDCHAR +STARTCHAR U_3A44 +ENCODING 14916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +27C0 +F000 +27C0 +2540 +37C0 +6540 +A7C0 +2000 +AD40 +57A0 +ENDCHAR +STARTCHAR U_3A45 +ENCODING 14917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2EE0 +FAA0 +2EE0 +2280 +3FE0 +E920 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_3A46 +ENCODING 14918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +48A0 +FE80 +41E0 +5C80 +5480 +7C80 +C880 +5D40 +CA40 +5C60 +ENDCHAR +STARTCHAR U_3A47 +ENCODING 14919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +3140 +2FE0 +6540 +A7C0 +2540 +A540 +4FE0 +ENDCHAR +STARTCHAR U_3A48 +ENCODING 14920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2440 +27C0 +3140 +67E0 +A240 +27C0 +AA40 +53C0 +ENDCHAR +STARTCHAR U_3A49 +ENCODING 14921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F7C0 +2820 +27C0 +3440 +6FE0 +AAA0 +2660 +BBA0 +4660 +ENDCHAR +STARTCHAR U_3A4A +ENCODING 14922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2F80 +F540 +2FE0 +2AA0 +2FE0 +3040 +EFE0 +2040 +2240 +60C0 +ENDCHAR +STARTCHAR U_3A4B +ENCODING 14923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +2140 +37C0 +6BA0 +AD60 +2BA0 +AD60 +53A0 +ENDCHAR +STARTCHAR U_3A4C +ENCODING 14924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +F2A0 +2FE0 +2A80 +3FE0 +6460 +A7C0 +2440 +A7C0 +4C60 +ENDCHAR +STARTCHAR U_3A4D +ENCODING 14925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FA40 +2100 +2FE0 +3100 +67C0 +A540 +2380 +A540 +4920 +ENDCHAR +STARTCHAR U_3A4E +ENCODING 14926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EC0 +2AA0 +FE80 +2BE0 +2E80 +3080 +6E80 +AA80 +2EC0 +AB20 +4A20 +ENDCHAR +STARTCHAR U_3A4F +ENCODING 14927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27C0 +2100 +37C0 +E100 +2FE0 +2540 +6AA0 +ENDCHAR +STARTCHAR U_3A50 +ENCODING 14928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +F540 +2100 +2FE0 +3100 +67C0 +A080 +2FE0 +A480 +4180 +ENDCHAR +STARTCHAR U_3A51 +ENCODING 14929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2280 +2440 +3EE0 +6280 +AEE0 +2280 +AEE0 +4280 +ENDCHAR +STARTCHAR U_3A52 +ENCODING 14930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +2AA0 +37C0 +6000 +AFE0 +2540 +A520 +4920 +ENDCHAR +STARTCHAR U_3A53 +ENCODING 14931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BC0 +8A40 +DDE0 +AA80 +77E0 +2200 +DFC0 +0200 +FFE0 +0200 +0C00 +ENDCHAR +STARTCHAR U_3A54 +ENCODING 14932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5140 +FF40 +5520 +5FE0 +5540 +7540 +DFC0 +5540 +54A0 +E920 +ENDCHAR +STARTCHAR U_3A55 +ENCODING 14933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2920 +27C0 +3100 +66C0 +A920 +27C0 +A280 +4100 +ENDCHAR +STARTCHAR U_3A56 +ENCODING 14934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F7C0 +2540 +2FE0 +3100 +67C0 +A540 +27C0 +A540 +4FE0 +ENDCHAR +STARTCHAR U_3A57 +ENCODING 14935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +F480 +2FE0 +2480 +37E0 +E480 +2FC0 +2240 +A420 +58E0 +ENDCHAR +STARTCHAR U_3A58 +ENCODING 14936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F100 +27C0 +3100 +2FE0 +6540 +BFE0 +24A0 +2E40 +64A0 +ENDCHAR +STARTCHAR U_3A59 +ENCODING 14937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F7C0 +2280 +2FE0 +3440 +E920 +27C0 +2100 +6FE0 +ENDCHAR +STARTCHAR U_3A5A +ENCODING 14938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2820 +37C0 +6220 +AD40 +2280 +AD60 +4200 +ENDCHAR +STARTCHAR U_3A5B +ENCODING 14939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5120 +FFE0 +5560 +57A0 +7560 +DFA0 +54A0 +52A0 +5120 +DFE0 +ENDCHAR +STARTCHAR U_3A5C +ENCODING 14940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +5480 +FEE0 +5300 +5E00 +54E0 +7F00 +C000 +5FC0 +5540 +FFE0 +ENDCHAR +STARTCHAR U_3A5D +ENCODING 14941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2820 +37C0 +6240 +AD80 +2340 +ACA0 +4300 +ENDCHAR +STARTCHAR U_3A5E +ENCODING 14942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +27E0 +F240 +2DA0 +2000 +3FE0 +6920 +A7C0 +2100 +A540 +4920 +ENDCHAR +STARTCHAR U_3A5F +ENCODING 14943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F7C0 +2280 +2FE0 +3540 +EFE0 +2100 +2540 +6B20 +ENDCHAR +STARTCHAR U_3A60 +ENCODING 14944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +FA80 +2FE0 +2AA0 +3FE0 +6A40 +AB60 +2A40 +A920 +5540 +ENDCHAR +STARTCHAR U_3A61 +ENCODING 14945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F200 +27C0 +2240 +33C0 +6EE0 +A880 +2EE0 +AAA0 +4EE0 +ENDCHAR +STARTCHAR U_3A62 +ENCODING 14946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F280 +2FE0 +2AA0 +3FE0 +6120 +AFE0 +2940 +ACA0 +5360 +ENDCHAR +STARTCHAR U_3A63 +ENCODING 14947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2660 +FAA0 +2FE0 +2920 +37C0 +6540 +A7C0 +2540 +AFE0 +4100 +ENDCHAR +STARTCHAR U_3A64 +ENCODING 14948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +E480 +5FE0 +5540 +5F40 +7540 +DE80 +4A80 +5340 +EF40 +ENDCHAR +STARTCHAR U_3A65 +ENCODING 14949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4EA0 +E480 +5FE0 +4A80 +6BA0 +DAA0 +4B40 +5A40 +4FA0 +D920 +ENDCHAR +STARTCHAR U_3A66 +ENCODING 14950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +47E0 +E900 +5FC0 +4900 +6FE0 +4900 +DFE0 +54A0 +5AE0 +D320 +ENDCHAR +STARTCHAR U_3A67 +ENCODING 14951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +EFC0 +4480 +5FE0 +6480 +DFE0 +4D40 +53A0 +5540 +CB20 +ENDCHAR +STARTCHAR U_3A68 +ENCODING 14952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4EE0 +E440 +4EE0 +4440 +6FC0 +D040 +4FC0 +4500 +5460 +D7C0 +ENDCHAR +STARTCHAR U_3A69 +ENCODING 14953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +4E40 +E8E0 +4EA0 +40E0 +64A0 +D5E0 +4EA0 +55E0 +4440 +CCA0 +ENDCHAR +STARTCHAR U_3A6A +ENCODING 14954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4480 +E9E0 +4B20 +5DE0 +4520 +69E0 +DF20 +41E0 +54C0 +EB20 +ENDCHAR +STARTCHAR U_3A6B +ENCODING 14955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4660 +4880 +EFE0 +4AA0 +47C0 +6440 +C7C0 +4440 +47C0 +4280 +CC40 +ENDCHAR +STARTCHAR U_3A6C +ENCODING 14956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4640 +4440 +FFE0 +5440 +5F40 +5460 +77C0 +D540 +5DC0 +5560 +EFC0 +ENDCHAR +STARTCHAR U_3A6D +ENCODING 14957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D60 +4AA0 +ED60 +4AA0 +5FE0 +5020 +67C0 +C080 +4FE0 +4100 +C700 +ENDCHAR +STARTCHAR U_3A6E +ENCODING 14958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5B60 +5220 +FB60 +5520 +7FE0 +4540 +6BA0 +D100 +4FC0 +4100 +C300 +ENDCHAR +STARTCHAR U_3A6F +ENCODING 14959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +51E0 +FF40 +5480 +5F60 +4200 +6700 +C240 +4FC0 +4A80 +D640 +ENDCHAR +STARTCHAR U_3A70 +ENCODING 14960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F380 +2280 +2FE0 +2AA0 +6EE0 +A100 +2FE0 +A540 +4920 +ENDCHAR +STARTCHAR U_3A71 +ENCODING 14961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +2AA0 +2FE0 +3A20 +6EE0 +AA20 +2EA0 +AA20 +4D60 +ENDCHAR +STARTCHAR U_3A72 +ENCODING 14962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F6C0 +2AA0 +2EE0 +3480 +6FE0 +B480 +27E0 +A480 +47E0 +ENDCHAR +STARTCHAR U_3A73 +ENCODING 14963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +5FE0 +EA80 +4FE0 +4A80 +5FE0 +6000 +CFC0 +4440 +4380 +DC60 +ENDCHAR +STARTCHAR U_3A74 +ENCODING 14964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3500 +6FE0 +B900 +2FE0 +A900 +4FE0 +ENDCHAR +STARTCHAR U_3A75 +ENCODING 14965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +4460 +FF40 +54E0 +5D40 +5740 +7540 +D7A0 +5AA0 +DFA0 +6AA0 +ENDCHAR +STARTCHAR U_3A76 +ENCODING 14966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EE0 +F540 +5FE0 +4A40 +7220 +DFE0 +5B60 +56A0 +DB60 +56A0 +ENDCHAR +STARTCHAR U_3A77 +ENCODING 14967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F4A0 +4FC0 +4480 +7FE0 +CD40 +57A0 +4500 +C7E0 +4AA0 +ENDCHAR +STARTCHAR U_3A78 +ENCODING 14968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +2FE0 +3DA0 +6B60 +AFE0 +2AA0 +A500 +4FE0 +ENDCHAR +STARTCHAR U_3A79 +ENCODING 14969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4F80 +4A80 +EF80 +4A80 +5FC0 +7540 +DFC0 +5540 +4700 +C500 +5FC0 +ENDCHAR +STARTCHAR U_3A7A +ENCODING 14970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +93E0 +9080 +FC80 +93E0 +9220 +9140 +9140 +9480 +D940 +9620 +ENDCHAR +STARTCHAR U_3A7B +ENCODING 14971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7080 +A7E0 +7880 +8080 +BBE0 +AA20 +B940 +A080 +A940 +B220 +ENDCHAR +STARTCHAR U_3A7C +ENCODING 14972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +6100 +47C0 +A240 +7A40 +8A80 +5100 +2280 +CC60 +ENDCHAR +STARTCHAR U_3A7D +ENCODING 14973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +FA40 +AE40 +FA80 +2280 +7180 +6900 +A280 +2C60 +ENDCHAR +STARTCHAR U_3A7E +ENCODING 14974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E080 +2080 +FDE0 +A880 +FC80 +ABE0 +2220 +F940 +2080 +FB60 +ENDCHAR +STARTCHAR U_3A7F +ENCODING 14975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7A00 +83E0 +0240 +FA40 +1540 +2140 +4080 +8940 +FA20 +ENDCHAR +STARTCHAR U_3A80 +ENCODING 14976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +23E0 +2240 +FA40 +2540 +2140 +2080 +2080 +A140 +4620 +ENDCHAR +STARTCHAR U_3A81 +ENCODING 14977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +28E0 +4480 +A3E0 +1220 +F940 +0940 +1080 +1140 +2620 +ENDCHAR +STARTCHAR U_3A82 +ENCODING 14978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +80E0 +7880 +0080 +F3E0 +1220 +1140 +1480 +1540 +0E20 +ENDCHAR +STARTCHAR U_3A83 +ENCODING 14979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +08E0 +E880 +A880 +ABE0 +AA20 +E940 +0880 +0940 +1A20 +ENDCHAR +STARTCHAR U_3A84 +ENCODING 14980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FD00 +55E0 +FD40 +D340 +FD40 +5540 +5480 +5C80 +5140 +9220 +ENDCHAR +STARTCHAR U_3A85 +ENCODING 14981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +7FE0 +4520 +58A0 +4720 +0400 +3F80 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_3A86 +ENCODING 14982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F080 +90E0 +9080 +FBE0 +9220 +9140 +9140 +B480 +CD40 +B620 +ENDCHAR +STARTCHAR U_3A87 +ENCODING 14983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +7DE0 +9240 +1140 +FD40 +2940 +2880 +2A80 +4D40 +8A20 +ENDCHAR +STARTCHAR U_3A88 +ENCODING 14984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +70E0 +2080 +F880 +23E0 +2220 +F940 +2080 +3940 +C220 +ENDCHAR +STARTCHAR U_3A89 +ENCODING 14985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +53E0 +8A40 +0540 +F940 +0140 +F880 +8880 +8940 +FA20 +ENDCHAR +STARTCHAR U_3A8A +ENCODING 14986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2880 +FCE0 +2880 +F880 +23E0 +7A20 +C940 +4880 +4940 +7A20 +ENDCHAR +STARTCHAR U_3A8B +ENCODING 14987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +F8E0 +8880 +F880 +03E0 +FA20 +2140 +F880 +2140 +2220 +ENDCHAR +STARTCHAR U_3A8C +ENCODING 14988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +20E0 +F880 +A880 +FBE0 +AA20 +F940 +A880 +A940 +BA20 +ENDCHAR +STARTCHAR U_3A8D +ENCODING 14989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +21E0 +FE40 +8540 +7940 +0940 +1C80 +7080 +1140 +3220 +ENDCHAR +STARTCHAR U_3A8E +ENCODING 14990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +11E0 +5640 +5540 +BB40 +1140 +2880 +2880 +4540 +8620 +ENDCHAR +STARTCHAR U_3A8F +ENCODING 14991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F880 +A8E0 +F880 +A880 +FBE0 +4220 +A140 +F880 +2140 +2220 +ENDCHAR +STARTCHAR U_3A90 +ENCODING 14992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +84E0 +FC80 +9880 +97E0 +FE20 +9140 +9080 +A940 +C620 +ENDCHAR +STARTCHAR U_3A91 +ENCODING 14993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +50E0 +AC80 +F880 +ABE0 +FA20 +A940 +F880 +2140 +3A20 +ENDCHAR +STARTCHAR U_3A92 +ENCODING 14994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +9C80 +84E0 +CC80 +8480 +FFE0 +5220 +5140 +5080 +5540 +9A20 +ENDCHAR +STARTCHAR U_3A93 +ENCODING 14995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +E080 +20E0 +FC80 +2080 +6BE0 +EA20 +6D40 +E880 +6D40 +2220 +ENDCHAR +STARTCHAR U_3A94 +ENCODING 14996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +FCE0 +4880 +6C80 +DBE0 +6A20 +4940 +4880 +4940 +4A20 +ENDCHAR +STARTCHAR U_3A95 +ENCODING 14997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +20E0 +F880 +8880 +FBE0 +8A20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_3A96 +ENCODING 14998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +48E0 +7880 +0880 +FFE0 +1220 +5540 +3880 +5540 +3220 +ENDCHAR +STARTCHAR U_3A97 +ENCODING 14999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FCE0 +4880 +3080 +FFE0 +0220 +7940 +4880 +4940 +7A20 +ENDCHAR +STARTCHAR U_3A98 +ENCODING 15000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +29E0 +4640 +B940 +1140 +7D40 +5540 +7C80 +2940 +4620 +ENDCHAR +STARTCHAR U_3A99 +ENCODING 15001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +F9E0 +AA40 +F940 +2140 +F940 +2140 +7140 +A880 +2360 +ENDCHAR +STARTCHAR U_3A9A +ENCODING 15002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +51E0 +5240 +F940 +0140 +F940 +8940 +F940 +8880 +FB60 +ENDCHAR +STARTCHAR U_3A9B +ENCODING 15003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +48E0 +7880 +4880 +7BE0 +4A20 +FD40 +5080 +6940 +7E20 +ENDCHAR +STARTCHAR U_3A9C +ENCODING 15004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +9280 +92E0 +FE80 +0080 +FFE0 +2220 +FF20 +AAC0 +AAC0 +83A0 +ENDCHAR +STARTCHAR U_3A9D +ENCODING 15005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +FE80 +D680 +BBE0 +9220 +FF40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_3A9E +ENCODING 15006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +A4E0 +9480 +0080 +FFE0 +8620 +E540 +9C80 +8540 +FE20 +ENDCHAR +STARTCHAR U_3A9F +ENCODING 15007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +01E0 +FA40 +8D40 +F940 +0140 +F940 +C880 +B940 +FE20 +ENDCHAR +STARTCHAR U_3AA0 +ENCODING 15008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +50E0 +FC80 +5480 +FFE0 +5520 +FD40 +5880 +D540 +5220 +ENDCHAR +STARTCHAR U_3AA1 +ENCODING 15009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +92E0 +7C80 +1080 +7FE0 +1220 +7D40 +4480 +4540 +7E20 +ENDCHAR +STARTCHAR U_3AA2 +ENCODING 15010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +9280 +D6E0 +9280 +D680 +11E0 +7E20 +4540 +2880 +1140 +EE20 +ENDCHAR +STARTCHAR U_3AA3 +ENCODING 15011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +44E0 +7D20 +0320 +FF20 +8340 +BAC0 +AA80 +BB40 +8220 +ENDCHAR +STARTCHAR U_3AA4 +ENCODING 15012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +9280 +FE80 +92E0 +FEA0 +5520 +FEA0 +54A0 +FEC0 +10C0 +1320 +ENDCHAR +STARTCHAR U_3AA5 +ENCODING 15013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +20E0 +FC80 +A480 +9BE0 +BE20 +A540 +BC80 +A540 +FE20 +ENDCHAR +STARTCHAR U_3AA6 +ENCODING 15014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +85E0 +7A40 +F940 +A940 +F940 +A880 +F880 +5140 +8A20 +ENDCHAR +STARTCHAR U_3AA7 +ENCODING 15015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2880 +7CE0 +8280 +7FE0 +4520 +FD20 +B540 +6C80 +B540 +6E20 +ENDCHAR +STARTCHAR U_3AA8 +ENCODING 15016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3080 +FEE0 +1080 +7C80 +57E0 +FE20 +0220 +7940 +4880 +7B60 +ENDCHAR +STARTCHAR U_3AA9 +ENCODING 15017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +28E0 +FC80 +2880 +FBE0 +FA20 +AA20 +F940 +E880 +BB60 +ENDCHAR +STARTCHAR U_3AAA +ENCODING 15018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +2080 +F8E0 +5080 +8880 +DBE0 +5220 +DA20 +5140 +D880 +5360 +ENDCHAR +STARTCHAR U_3AAB +ENCODING 15019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +2080 +FCE0 +8480 +7880 +4BE0 +B620 +7A20 +ED40 +5880 +7B60 +ENDCHAR +STARTCHAR U_3AAC +ENCODING 15020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +B480 +6CE0 +B480 +2080 +53E0 +7E20 +D220 +7D40 +5080 +7F60 +ENDCHAR +STARTCHAR U_3AAD +ENCODING 15021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +2080 +FCE0 +A480 +B880 +BBE0 +AA20 +BA20 +FD40 +D480 +FF60 +ENDCHAR +STARTCHAR U_3AAE +ENCODING 15022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +1080 +FCE0 +D480 +B880 +57E0 +0220 +AA20 +A940 +A880 +AB60 +ENDCHAR +STARTCHAR U_3AAF +ENCODING 15023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +1100 +0E00 +F1E0 +0400 +3F80 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_3AB0 +ENCODING 15024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0A00 +1F00 +E0E0 +2480 +1500 +FFE0 +2480 +4440 +ENDCHAR +STARTCHAR U_3AB1 +ENCODING 15025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F480 +1D00 +57C0 +6540 +2540 +57E0 +5100 +8280 +0440 +ENDCHAR +STARTCHAR U_3AB2 +ENCODING 15026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +4200 +2200 +07E0 +FA00 +0200 +7FC0 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U_3AB3 +ENCODING 15027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +4A00 +2200 +03E0 +FE00 +0200 +3FC0 +4020 +4020 +3FC0 +ENDCHAR +STARTCHAR U_3AB4 +ENCODING 15028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7280 +0180 +0480 +FA80 +5080 +57E0 +5080 +5480 +5880 +9080 +ENDCHAR +STARTCHAR U_3AB5 +ENCODING 15029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AA80 +7180 +2480 +FA80 +2080 +27E0 +F880 +2080 +2080 +4080 +ENDCHAR +STARTCHAR U_3AB6 +ENCODING 15030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +2180 +4480 +FA80 +8880 +8FE0 +F880 +8880 +8880 +F880 +ENDCHAR +STARTCHAR U_3AB7 +ENCODING 15031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +0240 +F940 +8840 +8A40 +F940 +00E0 +8B40 +5040 +3840 +C040 +ENDCHAR +STARTCHAR U_3AB8 +ENCODING 15032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +FD40 +48C0 +7A40 +4940 +7840 +4BE0 +FC40 +0040 +4840 +8440 +ENDCHAR +STARTCHAR U_3AB9 +ENCODING 15033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7D40 +D6C0 +7D40 +54C0 +7C40 +13E0 +FC40 +2440 +3840 +CC40 +ENDCHAR +STARTCHAR U_3ABA +ENCODING 15034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FD40 +20C0 +FC40 +B540 +FCC0 +B460 +FFC0 +2040 +5040 +8840 +ENDCHAR +STARTCHAR U_3ABB +ENCODING 15035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +8E80 +6A60 +8480 +6E60 +4A40 +AEA0 +4900 +2500 +FFE0 +0100 +ENDCHAR +STARTCHAR U_3ABC +ENCODING 15036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +0B80 +0A00 +EBE0 +AA40 +AA40 +AA40 +EA40 +0A40 +0A40 +3440 +ENDCHAR +STARTCHAR U_3ABD +ENCODING 15037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +F0E0 +9300 +9200 +F3E0 +9240 +9240 +F240 +0440 +0840 +ENDCHAR +STARTCHAR U_3ABE +ENCODING 15038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3B80 +4A00 +AA00 +13E0 +2A40 +C240 +7A40 +4A40 +4A40 +7C40 +ENDCHAR +STARTCHAR U_3ABF +ENCODING 15039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +AB80 +AA00 +FA00 +23E0 +4240 +AA40 +AA40 +FA40 +2240 +C440 +ENDCHAR +STARTCHAR U_3AC0 +ENCODING 15040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4980 +7900 +49E0 +7940 +0140 +FD40 +8540 +FD40 +8540 +FE40 +ENDCHAR +STARTCHAR U_3AC1 +ENCODING 15041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A460 +C980 +A500 +C900 +FDE0 +8140 +FD40 +A940 +AD40 +C140 +FA40 +ENDCHAR +STARTCHAR U_3AC2 +ENCODING 15042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FD80 +8100 +A900 +FDE0 +A940 +A940 +B940 +8140 +5540 +9640 +ENDCHAR +STARTCHAR U_3AC3 +ENCODING 15043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +2080 +2080 +3880 +2940 +2940 +4A40 +5A20 +8420 +ENDCHAR +STARTCHAR U_3AC4 +ENCODING 15044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFE0 +2000 +3FC0 +4840 +BF40 +1040 +1E40 +2240 +46C0 +ENDCHAR +STARTCHAR U_3AC5 +ENCODING 15045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4220 +45E0 +7800 +4BE0 +4940 +4940 +4940 +5940 +8240 +ENDCHAR +STARTCHAR U_3AC6 +ENCODING 15046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +4140 +4220 +7C80 +4880 +49C0 +4AA0 +4AA0 +4880 +9980 +ENDCHAR +STARTCHAR U_3AC7 +ENCODING 15047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4220 +7C80 +4840 +4980 +9840 +0000 +7FC0 +0040 +0040 +ENDCHAR +STARTCHAR U_3AC8 +ENCODING 15048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +4220 +7880 +4840 +9880 +0040 +3F80 +4040 +4040 +3F80 +ENDCHAR +STARTCHAR U_3AC9 +ENCODING 15049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +F480 +47E0 +7400 +55C0 +5540 +5540 +55C0 +9520 +B9E0 +ENDCHAR +STARTCHAR U_3ACA +ENCODING 15050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +F400 +4800 +4FE0 +7040 +5740 +5540 +5540 +5740 +B0C0 +ENDCHAR +STARTCHAR U_3ACB +ENCODING 15051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F400 +4900 +47C0 +7540 +57C0 +5540 +5FE0 +9440 +B4C0 +ENDCHAR +STARTCHAR U_3ACC +ENCODING 15052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +4400 +77E0 +5080 +5080 +52E0 +5280 +9280 +B7E0 +ENDCHAR +STARTCHAR U_3ACD +ENCODING 15053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +F7E0 +4940 +4280 +75E0 +5D20 +55A0 +5540 +9440 +B5A0 +ENDCHAR +STARTCHAR U_3ACE +ENCODING 15054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +F400 +4FE0 +4920 +77C0 +5540 +57C0 +5540 +9FE0 +B100 +ENDCHAR +STARTCHAR U_3ACF +ENCODING 15055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F800 +4FE0 +4280 +7FE0 +5AA0 +5FE0 +5240 +9180 +B760 +ENDCHAR +STARTCHAR U_3AD0 +ENCODING 15056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF00 +8100 +FF00 +8100 +FF00 +0000 +8E00 +F080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR U_3AD1 +ENCODING 15057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +8BE0 +8920 +F920 +8920 +8920 +8920 +F920 +8AA0 +0440 +ENDCHAR +STARTCHAR U_3AD2 +ENCODING 15058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +1080 +FFE0 +1080 +1080 +6080 +ENDCHAR +STARTCHAR U_3AD3 +ENCODING 15059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F900 +8BE0 +8C00 +8BC0 +F880 +8900 +8A00 +8C00 +FC20 +03C0 +ENDCHAR +STARTCHAR U_3AD4 +ENCODING 15060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +2040 +0400 +07C0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3AD5 +ENCODING 15061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +FFE0 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_3AD6 +ENCODING 15062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0780 +0400 +0400 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AD7 +ENCODING 15063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4040 +7FC0 +0000 +7F80 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_3AD8 +ENCODING 15064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0C00 +1400 +2500 +4480 +8440 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AD9 +ENCODING 15065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +F100 +9FE0 +9100 +9100 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_3ADA +ENCODING 15066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +8920 +1120 +22A0 +C460 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3ADB +ENCODING 15067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +F280 +9280 +9280 +9480 +F4A0 +08E0 +ENDCHAR +STARTCHAR U_3ADC +ENCODING 15068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +F440 +9440 +9440 +97C0 +F000 +0FE0 +ENDCHAR +STARTCHAR U_3ADD +ENCODING 15069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A900 +A900 +AFE0 +E900 +A900 +A900 +A880 +EEA0 +0960 +ENDCHAR +STARTCHAR U_3ADE +ENCODING 15070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +9540 +97C0 +9100 +F7C0 +9440 +9280 +9100 +F280 +0C60 +ENDCHAR +STARTCHAR U_3ADF +ENCODING 15071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +9440 +F860 +9000 +97C0 +9440 +F440 +07C0 +ENDCHAR +STARTCHAR U_3AE0 +ENCODING 15072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9100 +97C0 +F100 +9FE0 +9100 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_3AE1 +ENCODING 15073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +5C40 +4740 +7FC0 +1000 +3F00 +5300 +0C00 +1A00 +E5C0 +0C00 +ENDCHAR +STARTCHAR U_3AE2 +ENCODING 15074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9100 +FFE0 +9100 +9200 +9440 +FFE0 +0420 +ENDCHAR +STARTCHAR U_3AE3 +ENCODING 15075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +FF80 +8880 +FF80 +8880 +FF80 +0840 +0FC0 +ENDCHAR +STARTCHAR U_3AE4 +ENCODING 15076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5C40 +4740 +7FC0 +0C00 +1E20 +0240 +7B80 +0A80 +1240 +E620 +ENDCHAR +STARTCHAR U_3AE5 +ENCODING 15077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +91E0 +9220 +9540 +F080 +9100 +93E0 +9620 +FA20 +03E0 +ENDCHAR +STARTCHAR U_3AE6 +ENCODING 15078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27C0 +4C40 +D280 +5100 +5EE0 +57C0 +5440 +57C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_3AE7 +ENCODING 15079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +3C80 +2780 +3F80 +0400 +1500 +7FC0 +0400 +1500 +2480 +C440 +ENDCHAR +STARTCHAR U_3AE8 +ENCODING 15080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9920 +9100 +FFE0 +9240 +9240 +9140 +F180 +0660 +ENDCHAR +STARTCHAR U_3AE9 +ENCODING 15081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +2480 +FBE0 +2080 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3AEA +ENCODING 15082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +0800 +3F80 +1000 +FFE0 +48C0 +AEA0 +2B80 +2880 +2F80 +ENDCHAR +STARTCHAR U_3AEB +ENCODING 15083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2C80 +2680 +3F80 +0000 +7FC0 +0A00 +4A40 +2A80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_3AEC +ENCODING 15084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9820 +97A0 +F4A0 +97A0 +94A0 +97A0 +F4A0 +0060 +ENDCHAR +STARTCHAR U_3AED +ENCODING 15085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4900 +7F00 +0800 +FF80 +0200 +7F80 +2200 +1600 +ENDCHAR +STARTCHAR U_3AEE +ENCODING 15086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +5DE0 +5100 +5D20 +F1E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AEF +ENCODING 15087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +4040 +7FC0 +4040 +FFE0 +1100 +61E0 +ENDCHAR +STARTCHAR U_3AF0 +ENCODING 15088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +9420 +97E0 +9420 +F7E0 +9500 +9520 +94C0 +F480 +0660 +ENDCHAR +STARTCHAR U_3AF1 +ENCODING 15089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2C80 +2680 +3F80 +0400 +7FC0 +0400 +FFE0 +0900 +5140 +A320 +ENDCHAR +STARTCHAR U_3AF2 +ENCODING 15090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +97E0 +9820 +F7C0 +9080 +9FE0 +9100 +F100 +0300 +ENDCHAR +STARTCHAR U_3AF3 +ENCODING 15091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5C00 +4380 +7FC0 +4A40 +4980 +4CC0 +5FC0 +5640 +9340 +9FC0 +ENDCHAR +STARTCHAR U_3AF4 +ENCODING 15092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9140 +9FE0 +9100 +F3C0 +9440 +9BE0 +9080 +F080 +0180 +ENDCHAR +STARTCHAR U_3AF5 +ENCODING 15093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9EE0 +9280 +9EE0 +F280 +96E0 +9A80 +9280 +F480 +0880 +ENDCHAR +STARTCHAR U_3AF6 +ENCODING 15094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +9FE0 +9040 +97E0 +F920 +97C0 +9540 +9540 +F540 +0100 +ENDCHAR +STARTCHAR U_3AF7 +ENCODING 15095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1500 +1500 +FFE0 +1100 +3F80 +DD60 +1700 +1F00 +ENDCHAR +STARTCHAR U_3AF8 +ENCODING 15096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9140 +9FE0 +9140 +F7C0 +9100 +95C0 +9500 +F700 +09E0 +ENDCHAR +STARTCHAR U_3AF9 +ENCODING 15097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +3040 +4380 +7A00 +4BE0 +7A40 +4240 +4240 +8440 +ENDCHAR +STARTCHAR U_3AFA +ENCODING 15098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +6180 +9A60 +2080 +6180 +9A60 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3AFB +ENCODING 15099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9820 +97C0 +F000 +9FE0 +9AA0 +9FE0 +FAA0 +0AA0 +ENDCHAR +STARTCHAR U_3AFC +ENCODING 15100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A20 +EFA0 +B220 +A760 +A260 +EFA0 +AAA0 +AAA0 +AAA0 +EBA0 +0260 +ENDCHAR +STARTCHAR U_3AFD +ENCODING 15101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +9480 +9700 +9100 +FFE0 +9940 +9780 +9580 +F940 +0320 +ENDCHAR +STARTCHAR U_3AFE +ENCODING 15102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9540 +9FE0 +F820 +9BA0 +9AA0 +9BA0 +FAA0 +0860 +ENDCHAR +STARTCHAR U_3AFF +ENCODING 15103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F280 +9440 +9FE0 +9480 +F7E0 +9480 +97E0 +9480 +F7E0 +0400 +ENDCHAR +STARTCHAR U_3B00 +ENCODING 15104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +9FE0 +9240 +F3C0 +9000 +93C0 +9080 +F7E0 +9080 +0180 +ENDCHAR +STARTCHAR U_3B01 +ENCODING 15105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4040 +7FC0 +8500 +4F80 +B040 +2FA0 +C880 +4F80 +ENDCHAR +STARTCHAR U_3B02 +ENCODING 15106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +AFE0 +E100 +BFE0 +B120 +F160 +11E0 +1E20 +1060 +ENDCHAR +STARTCHAR U_3B03 +ENCODING 15107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FF80 +FF80 +4100 +FF80 +0000 +FF80 +FF80 +4900 +3600 +6300 +8080 +ENDCHAR +STARTCHAR U_3B04 +ENCODING 15108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0000 +7FE0 +4200 +5F80 +4200 +7FE0 +A940 +9320 +ENDCHAR +STARTCHAR U_3B05 +ENCODING 15109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +4940 +7FC0 +0400 +FFE0 +0800 +0F80 +1080 +6380 +ENDCHAR +STARTCHAR U_3B06 +ENCODING 15110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A900 +EFC0 +A880 +AC40 +EFC0 +A840 +0FC0 +0840 +ENDCHAR +STARTCHAR U_3B07 +ENCODING 15111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +9480 +97C0 +F540 +9540 +9FE0 +9100 +F280 +0440 +0820 +ENDCHAR +STARTCHAR U_3B08 +ENCODING 15112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +E880 +AF80 +A880 +EF80 +A000 +BFC0 +B540 +F540 +1540 +3FE0 +ENDCHAR +STARTCHAR U_3B09 +ENCODING 15113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +AAA0 +EAA0 +AAA0 +A100 +AFE0 +E100 +0280 +0C60 +ENDCHAR +STARTCHAR U_3B0A +ENCODING 15114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +7FC0 +1500 +7FC0 +0800 +FFE0 +1480 +2300 +5CE0 +ENDCHAR +STARTCHAR U_3B0B +ENCODING 15115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5C0 +A840 +AFE0 +B900 +EBE0 +AC80 +ABE0 +E940 +0A40 +0C20 +ENDCHAR +STARTCHAR U_3B0C +ENCODING 15116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +1500 +6CC0 +ENDCHAR +STARTCHAR U_3B0D +ENCODING 15117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0FE0 +E100 +AFE0 +A920 +EFE0 +A920 +A040 +EFE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_3B0E +ENCODING 15118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2100 +5280 +AD40 +7BC0 +6B40 +9120 +ENDCHAR +STARTCHAR U_3B0F +ENCODING 15119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +EFE0 +A000 +A7C0 +E440 +A7C0 +A000 +AFE0 +EAA0 +AFE0 +0920 +ENDCHAR +STARTCHAR U_3B10 +ENCODING 15120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AAA0 +A6C0 +AFE0 +E000 +A7C0 +A440 +E7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_3B11 +ENCODING 15121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1FE0 +EAA0 +AEA0 +A0C0 +EEA0 +A2A0 +A4A0 +BEE0 +E480 +0C80 +ENDCHAR +STARTCHAR U_3B12 +ENCODING 15122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A400 +A140 +EFA0 +A280 +A440 +AAA0 +E280 +AFE0 +0480 +ENDCHAR +STARTCHAR U_3B13 +ENCODING 15123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +EFE0 +A000 +A380 +A000 +EFE0 +A540 +0920 +ENDCHAR +STARTCHAR U_3B14 +ENCODING 15124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +A660 +AAA0 +E100 +A680 +A960 +A280 +E140 +A080 +0300 +ENDCHAR +STARTCHAR U_3B15 +ENCODING 15125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08A0 +E5E0 +BE40 +A440 +E4E0 +AE40 +AC40 +B5E0 +E440 +A440 +0440 +ENDCHAR +STARTCHAR U_3B16 +ENCODING 15126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EEE0 +AAA0 +AEA0 +E940 +A840 +B1A0 +A220 +EFC0 +A840 +0FC0 +ENDCHAR +STARTCHAR U_3B17 +ENCODING 15127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08C0 +0EA0 +EA80 +BBE0 +B680 +EC80 +A940 +B140 +E220 +1540 +22A0 +ENDCHAR +STARTCHAR U_3B18 +ENCODING 15128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A140 +AFE0 +E140 +AFC0 +A520 +AFE0 +E920 +AD60 +15A0 +ENDCHAR +STARTCHAR U_3B19 +ENCODING 15129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +EFC0 +AAC0 +A780 +E480 +A7C0 +A440 +A7E0 +E960 +AAA0 +1460 +ENDCHAR +STARTCHAR U_3B1A +ENCODING 15130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +A940 +BF40 +A140 +EF40 +AA80 +AE80 +AA80 +EF40 +1220 +ENDCHAR +STARTCHAR U_3B1B +ENCODING 15131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E6C0 +ABA0 +A000 +E7C0 +A440 +A380 +AEE0 +E220 +AAA0 +0660 +ENDCHAR +STARTCHAR U_3B1C +ENCODING 15132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5140 +FBE0 +2080 +7BC0 +2080 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3B1D +ENCODING 15133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E280 +AFE0 +A920 +EBA0 +A920 +AFE0 +A440 +E7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_3B1E +ENCODING 15134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +EFE0 +A440 +A7C0 +E440 +A7E0 +AD20 +B6A0 +E420 +A7A0 +0040 +ENDCHAR +STARTCHAR U_3B1F +ENCODING 15135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +7FE0 +A920 +2BA0 +4920 +9FE0 +2A40 +CBC0 +0A40 +33C0 +ENDCHAR +STARTCHAR U_3B20 +ENCODING 15136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EEE0 +B5A0 +AEA0 +E240 +BF40 +A2A0 +AF20 +E000 +AAA0 +12A0 +ENDCHAR +STARTCHAR U_3B21 +ENCODING 15137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +AFE0 +B120 +E7C0 +A100 +A6C0 +B920 +E7C0 +0080 +0300 +ENDCHAR +STARTCHAR U_3B22 +ENCODING 15138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A100 +A7C0 +E100 +BFE0 +A540 +AFE0 +E4A0 +AE40 +04A0 +ENDCHAR +STARTCHAR U_3B23 +ENCODING 15139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +FB40 +AA40 +BFE0 +EA40 +BF40 +A4C0 +AE40 +E440 +A740 +18C0 +ENDCHAR +STARTCHAR U_3B24 +ENCODING 15140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E940 +AA40 +AFC0 +E480 +AFC0 +A920 +BFE0 +E000 +1540 +2520 +ENDCHAR +STARTCHAR U_3B25 +ENCODING 15141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +4440 +7FC0 +4440 +FFE0 +5540 +BFA0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3B26 +ENCODING 15142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EEE0 +A280 +A7E0 +EC80 +A7C0 +A480 +AFE0 +E480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_3B27 +ENCODING 15143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +4440 +7FC0 +4440 +FFE0 +4A40 +BF20 +2480 +CC60 +ENDCHAR +STARTCHAR U_3B28 +ENCODING 15144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EEE0 +A440 +A440 +FFE0 +AAA0 +AAA0 +BBA0 +EAA0 +0AA0 +1760 +ENDCHAR +STARTCHAR U_3B29 +ENCODING 15145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +AFE0 +A440 +EFC0 +A040 +AFE0 +A040 +EFC0 +1520 +13C0 +ENDCHAR +STARTCHAR U_3B2A +ENCODING 15146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +5540 +7FC0 +0400 +FFE0 +9120 +3E00 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3B2B +ENCODING 15147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A80 +EEE0 +2A80 +EEE0 +5140 +BFA0 +2480 +2880 +3F80 +ENDCHAR +STARTCHAR U_3B2C +ENCODING 15148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +AAA0 +EEE0 +A480 +AFE0 +B480 +E7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_3B2D +ENCODING 15149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +AFE0 +AAA0 +EFE0 +AA20 +AFE0 +AA20 +EEA0 +0A20 +0D60 +ENDCHAR +STARTCHAR U_3B2E +ENCODING 15150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +5280 +FBE0 +5640 +FBE0 +AA40 +FBE0 +2240 +DBE0 +ENDCHAR +STARTCHAR U_3B2F +ENCODING 15151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A400 +A7E0 +E440 +AFE0 +AAA0 +AFA0 +EAE0 +0FA0 +1520 +ENDCHAR +STARTCHAR U_3B30 +ENCODING 15152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_3B31 +ENCODING 15153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A280 +FBE0 +2480 +FBE0 +5140 +9A60 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_3B32 +ENCODING 15154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +2140 +FBE0 +A940 +FA20 +AC00 +FBE0 +22A0 +A7E0 +6000 +9FE0 +ENDCHAR +STARTCHAR U_3B33 +ENCODING 15155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57C0 +5500 +7900 +5100 +5FE0 +7100 +5100 +5100 +5100 +B100 +ENDCHAR +STARTCHAR U_3B34 +ENCODING 15156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5280 +77E0 +5280 +5280 +7FE0 +5280 +5240 +5460 +B820 +ENDCHAR +STARTCHAR U_3B35 +ENCODING 15157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5100 +5FE0 +7280 +5440 +5CA0 +7280 +5100 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_3B36 +ENCODING 15158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +53E0 +7480 +5880 +57E0 +7000 +53E0 +5220 +5220 +B3E0 +ENDCHAR +STARTCHAR U_3B37 +ENCODING 15159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +5520 +77E0 +5520 +55A0 +7760 +5520 +5520 +57E0 +B420 +ENDCHAR +STARTCHAR U_3B38 +ENCODING 15160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +57E0 +5240 +7000 +52C0 +5380 +76E0 +5A80 +5280 +52A0 +B260 +ENDCHAR +STARTCHAR U_3B39 +ENCODING 15161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +5740 +5280 +77C0 +5140 +57E0 +7140 +57C0 +5100 +5500 +B300 +ENDCHAR +STARTCHAR U_3B3A +ENCODING 15162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5380 +57C0 +7100 +5FE0 +5280 +7540 +5FE0 +5540 +5540 +B100 +ENDCHAR +STARTCHAR U_3B3B +ENCODING 15163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +57E0 +5240 +7100 +57E0 +5200 +73E0 +5080 +52C0 +52C0 +B4A0 +ENDCHAR +STARTCHAR U_3B3C +ENCODING 15164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +4200 +F7E0 +5AA0 +73E0 +5200 +77E0 +5A40 +5180 +B660 +ENDCHAR +STARTCHAR U_3B3D +ENCODING 15165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +57E0 +7520 +57E0 +5000 +7FE0 +5200 +57C0 +5040 +B180 +ENDCHAR +STARTCHAR U_3B3E +ENCODING 15166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +9140 +FA60 +91C0 +A940 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_3B3F +ENCODING 15167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BF80 +AAE0 +EFA0 +A0A0 +AEA0 +E240 +A440 +BF40 +A4A0 +AD20 +ENDCHAR +STARTCHAR U_3B40 +ENCODING 15168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +57E0 +5D40 +7220 +57C0 +5100 +7540 +5540 +5BA0 +5100 +BFE0 +ENDCHAR +STARTCHAR U_3B41 +ENCODING 15169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FA40 +2280 +62E0 +7220 +A220 +2220 +2420 +2940 +2080 +ENDCHAR +STARTCHAR U_3B42 +ENCODING 15170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +F900 +2100 +7580 +6560 +A920 +2100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_3B43 +ENCODING 15171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2100 +FA00 +2460 +6240 +7180 +A100 +A200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_3B44 +ENCODING 15172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2F80 +F280 +2280 +6280 +7780 +A280 +2280 +2280 +22A0 +2240 +ENDCHAR +STARTCHAR U_3B45 +ENCODING 15173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +F7C0 +2000 +6000 +7000 +A7C0 +2000 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_3B46 +ENCODING 15174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0900 +13C0 +2020 +4440 +FFE0 +0400 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3B47 +ENCODING 15175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +2240 +64E0 +7720 +A280 +2280 +22A0 +24A0 +2840 +ENDCHAR +STARTCHAR U_3B48 +ENCODING 15176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2140 +6140 +77E0 +A100 +2180 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_3B49 +ENCODING 15177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +0400 +FFE0 +0E00 +1500 +2480 +4460 +0400 +ENDCHAR +STARTCHAR U_3B4A +ENCODING 15178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2220 +FA20 +23E0 +6200 +7200 +A3E0 +2220 +2220 +2420 +2820 +ENDCHAR +STARTCHAR U_3B4B +ENCODING 15179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +20E0 +FB80 +2080 +63E0 +7080 +A080 +27E0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_3B4C +ENCODING 15180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +F480 +27E0 +6480 +7880 +A7E0 +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_3B4D +ENCODING 15181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3100 +01E0 +1700 +6100 +44E0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3B4E +ENCODING 15182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FE60 +25A0 +64A0 +75A0 +A660 +2420 +2420 +24A0 +2440 +ENDCHAR +STARTCHAR U_3B4F +ENCODING 15183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +F900 +23C0 +6100 +77E0 +A120 +2120 +2120 +2140 +2100 +ENDCHAR +STARTCHAR U_3B50 +ENCODING 15184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +1500 +3FC0 +C420 +1F00 +0E00 +1500 +2480 +4460 +ENDCHAR +STARTCHAR U_3B51 +ENCODING 15185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +2100 +6100 +77E0 +A100 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_3B52 +ENCODING 15186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2440 +67C0 +7400 +AFE0 +A420 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_3B53 +ENCODING 15187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FA40 +27E0 +6020 +7240 +A7E0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_3B54 +ENCODING 15188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +FCA0 +22C0 +7180 +6FE0 +A080 +A080 +2080 +2280 +2180 +ENDCHAR +STARTCHAR U_3B55 +ENCODING 15189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7E0 +2100 +6100 +7FE0 +A100 +2200 +2240 +25E0 +2620 +ENDCHAR +STARTCHAR U_3B56 +ENCODING 15190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +F4A0 +2C80 +67E0 +7480 +A480 +2480 +24A0 +2440 +2440 +ENDCHAR +STARTCHAR U_3B57 +ENCODING 15191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0E00 +1500 +2480 +C460 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_3B58 +ENCODING 15192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F280 +2440 +6820 +77C0 +A000 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_3B59 +ENCODING 15193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +6FE0 +7080 +AFE0 +2080 +2680 +2080 +2180 +ENDCHAR +STARTCHAR U_3B5A +ENCODING 15194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2840 +6780 +7520 +A540 +2580 +2480 +2480 +2660 +ENDCHAR +STARTCHAR U_3B5B +ENCODING 15195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +F8E0 +2B00 +6A80 +7AA0 +AAC0 +2A80 +2A40 +2A40 +3320 +ENDCHAR +STARTCHAR U_3B5C +ENCODING 15196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +7500 +7520 +AEA0 +24C0 +2480 +29A0 +2260 +ENDCHAR +STARTCHAR U_3B5D +ENCODING 15197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +3180 +6B40 +AD20 +0800 +7F00 +0900 +1100 +2120 +C1E0 +ENDCHAR +STARTCHAR U_3B5E +ENCODING 15198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +F560 +2980 +6200 +7500 +AFE0 +A120 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_3B5F +ENCODING 15199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +1100 +64C0 +FFE0 +0400 +1580 +E460 +0400 +ENDCHAR +STARTCHAR U_3B60 +ENCODING 15200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +6100 +77E0 +A280 +2280 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_3B61 +ENCODING 15201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +F7E0 +2420 +6660 +75A0 +A5A0 +2660 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_3B62 +ENCODING 15202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +5F20 +EA20 +4AA0 +6AA0 +DFA0 +CAA0 +4A20 +5A20 +5260 +5220 +ENDCHAR +STARTCHAR U_3B63 +ENCODING 15203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +22E0 +F820 +2BA0 +6AA0 +7AA0 +AAA0 +2BA0 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_3B64 +ENCODING 15204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +F7C0 +2540 +6540 +7480 +A7E0 +2020 +2FA0 +2020 +2060 +ENDCHAR +STARTCHAR U_3B65 +ENCODING 15205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F440 +2880 +67E0 +7420 +A520 +2520 +2180 +2240 +2420 +ENDCHAR +STARTCHAR U_3B66 +ENCODING 15206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2420 +60C0 +7300 +A100 +2FE0 +2100 +2120 +21E0 +ENDCHAR +STARTCHAR U_3B67 +ENCODING 15207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2480 +FFE0 +2480 +4180 +0400 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3B68 +ENCODING 15208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2AC0 +6FA0 +72A0 +A6A0 +26E0 +2A80 +3280 +2680 +ENDCHAR +STARTCHAR U_3B69 +ENCODING 15209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +F540 +2280 +6040 +77E0 +A040 +2240 +2140 +2040 +20C0 +ENDCHAR +STARTCHAR U_3B6A +ENCODING 15210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2100 +2FE0 +F100 +2FE0 +7920 +6FE0 +A920 +AFE0 +2920 +2960 +ENDCHAR +STARTCHAR U_3B6B +ENCODING 15211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F540 +2540 +6BA0 +7100 +A100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3B6C +ENCODING 15212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FA20 +2540 +6980 +7280 +ACC0 +29A0 +22A0 +2C80 +2300 +ENDCHAR +STARTCHAR U_3B6D +ENCODING 15213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2A20 +FAA0 +2EA0 +78A0 +7EA0 +AAA0 +2AA0 +2AA0 +2A20 +3660 +ENDCHAR +STARTCHAR U_3B6E +ENCODING 15214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +2000 +67E0 +7200 +A3E0 +2620 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_3B6F +ENCODING 15215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4A80 +FA80 +4E80 +4A80 +EE80 +CA80 +4AA0 +4EA0 +5AA0 +42E0 +ENDCHAR +STARTCHAR U_3B70 +ENCODING 15216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5DE0 +5100 +FDE0 +0400 +FFE0 +0400 +7FC0 +4E40 +1500 +E4E0 +ENDCHAR +STARTCHAR U_3B71 +ENCODING 15217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +F7E0 +26A0 +67E0 +76A0 +A7E0 +2480 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_3B72 +ENCODING 15218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +F440 +2920 +6180 +7240 +A420 +2BC0 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_3B73 +ENCODING 15219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23A0 +F940 +27E0 +6100 +7200 +A7E0 +2880 +27E0 +2080 +2180 +ENDCHAR +STARTCHAR U_3B74 +ENCODING 15220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2160 +25A0 +F540 +25A0 +6100 +7080 +A080 +23E0 +2080 +2080 +27E0 +ENDCHAR +STARTCHAR U_3B75 +ENCODING 15221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2100 +FA00 +27E0 +6820 +7FA0 +AAA0 +2FA0 +2AA0 +2FA0 +2060 +ENDCHAR +STARTCHAR U_3B76 +ENCODING 15222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2100 +6FE0 +7100 +A3E0 +2220 +2440 +2840 +3180 +ENDCHAR +STARTCHAR U_3B77 +ENCODING 15223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +67C0 +7100 +A7E0 +2120 +2220 +2440 +28C0 +ENDCHAR +STARTCHAR U_3B78 +ENCODING 15224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FA40 +2480 +6FE0 +7920 +A920 +2FE0 +2280 +2480 +28E0 +ENDCHAR +STARTCHAR U_3B79 +ENCODING 15225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2680 +FBE0 +2240 +7E80 +6900 +AFC0 +2240 +2280 +2520 +39E0 +ENDCHAR +STARTCHAR U_3B7A +ENCODING 15226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2540 +6FE0 +7540 +A7C0 +2540 +27C0 +2120 +21E0 +ENDCHAR +STARTCHAR U_3B7B +ENCODING 15227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FB80 +2100 +6FE0 +7820 +ABA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_3B7C +ENCODING 15228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2120 +FD40 +2380 +6540 +7920 +AFE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_3B7D +ENCODING 15229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2840 +6B80 +7A40 +ABE0 +2A40 +2BE0 +2820 +33E0 +ENDCHAR +STARTCHAR U_3B7E +ENCODING 15230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2800 +6AA0 +7AA0 +ABE0 +2880 +2AA0 +2AA0 +33E0 +ENDCHAR +STARTCHAR U_3B7F +ENCODING 15231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2240 +63C0 +7100 +A6E0 +24A0 +24A0 +26E0 +2080 +ENDCHAR +STARTCHAR U_3B80 +ENCODING 15232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2080 +F900 +2540 +6BA0 +B920 +ABA0 +AD60 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3B81 +ENCODING 15233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2380 +FD40 +27E0 +6200 +77E0 +AA20 +33A0 +2220 +23A0 +2660 +ENDCHAR +STARTCHAR U_3B82 +ENCODING 15234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +1100 +2480 +7FC0 +8420 +1480 +6460 +ENDCHAR +STARTCHAR U_3B83 +ENCODING 15235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2700 +F100 +2FE0 +6540 +7920 +A200 +3FE0 +2440 +2380 +2C40 +ENDCHAR +STARTCHAR U_3B84 +ENCODING 15236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +FFE0 +2200 +6FE0 +7220 +AFA0 +2220 +23A0 +24A0 +2960 +ENDCHAR +STARTCHAR U_3B85 +ENCODING 15237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1480 +E660 +3FE0 +2200 +7FE0 +A200 +3FE0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_3B86 +ENCODING 15238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2C60 +6280 +77C0 +A100 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_3B87 +ENCODING 15239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2100 +6280 +7460 +A900 +23A0 +25A0 +2100 +2300 +ENDCHAR +STARTCHAR U_3B88 +ENCODING 15240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7E0 +2100 +6280 +77C0 +A820 +27C0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3B89 +ENCODING 15241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2480 +F7E0 +2C80 +66A0 +75C0 +A7E0 +2480 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_3B8A +ENCODING 15242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2280 +F5E0 +2E80 +6580 +75C0 +A6A0 +2480 +2480 +2480 +2C80 +ENDCHAR +STARTCHAR U_3B8B +ENCODING 15243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2F60 +F4A0 +2EA0 +6AE0 +7EA0 +AAA0 +AEA0 +2AC0 +2A80 +2A80 +ENDCHAR +STARTCHAR U_3B8C +ENCODING 15244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FA00 +2400 +6FE0 +7AA0 +ABA0 +2AA0 +2BA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_3B8D +ENCODING 15245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4840 +7940 +4940 +7840 +4440 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3B8E +ENCODING 15246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F180 +2340 +7520 +6900 +A100 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3B8F +ENCODING 15247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F380 +2540 +6920 +77E0 +A000 +2FE0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3B90 +ENCODING 15248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2340 +F560 +2180 +63E0 +7620 +ABE0 +2220 +23E0 +2220 +23E0 +ENDCHAR +STARTCHAR U_3B91 +ENCODING 15249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F100 +2FE0 +2100 +7500 +6960 +A920 +2D60 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3B92 +ENCODING 15250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6AA0 +7FE0 +A100 +2FE0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3B93 +ENCODING 15251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +F480 +2CE0 +66A0 +74E0 +A520 +25C0 +2540 +2480 +25E0 +ENDCHAR +STARTCHAR U_3B94 +ENCODING 15252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +F8E0 +2380 +63E0 +72A0 +A3E0 +2080 +23E0 +2080 +27E0 +ENDCHAR +STARTCHAR U_3B95 +ENCODING 15253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +6AA0 +7AE0 +A100 +2FE0 +2280 +2460 +2820 +ENDCHAR +STARTCHAR U_3B96 +ENCODING 15254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +F9C0 +2080 +63E0 +72A0 +A3E0 +2080 +27E0 +2080 +2080 +ENDCHAR +STARTCHAR U_3B97 +ENCODING 15255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +2940 +12A0 +FDC0 +5440 +B080 +1500 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3B98 +ENCODING 15256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +22E0 +F500 +2EA0 +76A0 +6CA0 +ACA0 +B440 +24A0 +24A0 +2920 +ENDCHAR +STARTCHAR U_3B99 +ENCODING 15257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +F7E0 +2000 +73C0 +6000 +AFE0 +A100 +23E0 +2020 +20C0 +ENDCHAR +STARTCHAR U_3B9A +ENCODING 15258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0780 +0400 +3F80 +2480 +2A80 +3F80 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3B9B +ENCODING 15259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F540 +27C0 +7000 +6FE0 +A100 +A5E0 +2500 +2700 +29E0 +ENDCHAR +STARTCHAR U_3B9C +ENCODING 15260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +F940 +2D40 +6FE0 +7940 +AF40 +ADE0 +2900 +2800 +2FE0 +ENDCHAR +STARTCHAR U_3B9D +ENCODING 15261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +4AA0 +E9A0 +54C0 +64C0 +CAA0 +D1A0 +6EE0 +4AA0 +4A80 +4E80 +ENDCHAR +STARTCHAR U_3B9E +ENCODING 15262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2DE0 +F220 +2080 +6D80 +7240 +A420 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3B9F +ENCODING 15263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5E80 +E9E0 +4880 +E9C0 +CEC0 +5AA0 +4AA0 +4A80 +4E80 +4880 +ENDCHAR +STARTCHAR U_3BA0 +ENCODING 15264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +6920 +7100 +AFE0 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_3BA1 +ENCODING 15265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA00 +73C0 +23C0 +5200 +8BE0 +0400 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3BA2 +ENCODING 15266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +2440 +F7E0 +2D00 +65E0 +7680 +A480 +27E0 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_3BA3 +ENCODING 15267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8A40 +FA80 +8BE0 +F980 +92A0 +ECE0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BA4 +ENCODING 15268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A4A0 +4A40 +3F80 +60C0 +BFA0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BA5 +ENCODING 15269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7E0 +2200 +6FE0 +7440 +AFE0 +3540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_3BA6 +ENCODING 15270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +6920 +7280 +A140 +27A0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_3BA7 +ENCODING 15271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +6240 +73E0 +A200 +23E0 +2020 +2560 +22A0 +ENDCHAR +STARTCHAR U_3BA8 +ENCODING 15272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +67C0 +7440 +AA20 +27C0 +2A80 +2100 +2EE0 +ENDCHAR +STARTCHAR U_3BA9 +ENCODING 15273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +6240 +73C0 +A240 +23C0 +2940 +2AA0 +33C0 +ENDCHAR +STARTCHAR U_3BAA +ENCODING 15274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +4940 +E9C0 +5D40 +6240 +C460 +C200 +5FE0 +4700 +4A80 +5240 +ENDCHAR +STARTCHAR U_3BAB +ENCODING 15275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +67C0 +7100 +A7C0 +2100 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3BAC +ENCODING 15276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2540 +FAA0 +27C0 +6000 +76E0 +AAA0 +2660 +2660 +3BA0 +2660 +ENDCHAR +STARTCHAR U_3BAD +ENCODING 15277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +F100 +2FE0 +6AA0 +7920 +AFE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_3BAE +ENCODING 15278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +F7A0 +22A0 +6760 +7100 +A7C0 +2100 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_3BAF +ENCODING 15279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2A20 +6F60 +7AA0 +ADA0 +2AE0 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_3BB0 +ENCODING 15280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +FFC0 +2540 +6540 +77C0 +A000 +2480 +26C0 +24A0 +2640 +ENDCHAR +STARTCHAR U_3BB1 +ENCODING 15281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2500 +67C0 +7900 +AFE0 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_3BB2 +ENCODING 15282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +FD20 +27A0 +6260 +7400 +A7E0 +2D20 +27A0 +2120 +2260 +ENDCHAR +STARTCHAR U_3BB3 +ENCODING 15283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EA0 +FAE0 +2A40 +6E40 +7A40 +AAE0 +2E40 +2A40 +2AA0 +22A0 +ENDCHAR +STARTCHAR U_3BB4 +ENCODING 15284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +2520 +FF60 +2520 +67E0 +7100 +A7E0 +2220 +2140 +2080 +2760 +ENDCHAR +STARTCHAR U_3BB5 +ENCODING 15285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +FE00 +24E0 +64A0 +76E0 +AAA0 +2AE0 +2AA0 +2AA0 +36A0 +ENDCHAR +STARTCHAR U_3BB6 +ENCODING 15286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +22E0 +FFA0 +22A0 +6AE0 +7AA0 +AFE0 +22A0 +22A0 +2520 +2960 +ENDCHAR +STARTCHAR U_3BB7 +ENCODING 15287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +F900 +22A0 +64E0 +7200 +A7E0 +2420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_3BB8 +ENCODING 15288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2940 +F7E0 +2080 +6C80 +77E0 +A480 +2540 +2520 +2A00 +31E0 +ENDCHAR +STARTCHAR U_3BB9 +ENCODING 15289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2240 +F560 +2FA0 +6220 +72A0 +A720 +2240 +2340 +2CA0 +2920 +ENDCHAR +STARTCHAR U_3BBA +ENCODING 15290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0E00 +1500 +3F80 +C460 +0000 +EEE0 +AAA0 +EEE0 +ENDCHAR +STARTCHAR U_3BBB +ENCODING 15291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FA80 +2100 +6280 +7540 +A7E0 +2540 +27C0 +2140 +2FE0 +ENDCHAR +STARTCHAR U_3BBC +ENCODING 15292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +6400 +7760 +A5A0 +2760 +29A0 +2B60 +2920 +ENDCHAR +STARTCHAR U_3BBD +ENCODING 15293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FD40 +2740 +6540 +7FA0 +A500 +27E0 +2520 +2B40 +29A0 +ENDCHAR +STARTCHAR U_3BBE +ENCODING 15294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4BC0 +7A40 +43C0 +5240 +6CC0 +0400 +7FC0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_3BBF +ENCODING 15295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +67C0 +7100 +A540 +2FE0 +2100 +27C0 +2100 +ENDCHAR +STARTCHAR U_3BC0 +ENCODING 15296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +F1E0 +2E00 +69E0 +7EA0 +AA80 +2AE0 +2A80 +2B80 +3460 +ENDCHAR +STARTCHAR U_3BC1 +ENCODING 15297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +5480 +F7E0 +5400 +5940 +F7E0 +5400 +55C0 +5D40 +5140 +51C0 +ENDCHAR +STARTCHAR U_3BC2 +ENCODING 15298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +2FE0 +F6C0 +2BA0 +7000 +6FE0 +A920 +27C0 +2540 +2540 +2100 +ENDCHAR +STARTCHAR U_3BC3 +ENCODING 15299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FB80 +2540 +6920 +7280 +AD60 +2540 +2380 +2540 +2B20 +ENDCHAR +STARTCHAR U_3BC4 +ENCODING 15300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +01C0 +7E00 +7FC0 +5280 +5F80 +5020 +9FE0 +ENDCHAR +STARTCHAR U_3BC5 +ENCODING 15301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +F900 +2BE0 +6AA0 +7BE0 +AAA0 +2BE0 +2A80 +2FE0 +3080 +ENDCHAR +STARTCHAR U_3BC6 +ENCODING 15302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FA40 +2180 +67E0 +7540 +A5E0 +2540 +27E0 +2440 +2BE0 +ENDCHAR +STARTCHAR U_3BC7 +ENCODING 15303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +F280 +2EE0 +6280 +76E0 +AA80 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3BC8 +ENCODING 15304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4880 +E3E0 +5880 +CBE0 +EAA0 +5BE0 +4980 +4AC0 +5480 +4FE0 +ENDCHAR +STARTCHAR U_3BC9 +ENCODING 15305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2940 +6BE0 +7840 +AB80 +2AA0 +2FE0 +2880 +3180 +ENDCHAR +STARTCHAR U_3BCA +ENCODING 15306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F5C0 +2500 +2FE0 +7200 +A3C0 +2400 +27E0 +2AA0 +2840 +ENDCHAR +STARTCHAR U_3BCB +ENCODING 15307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +F100 +87C0 +7C40 +07C0 +F440 +27C0 +FC40 +27C0 +7440 +A820 +ENDCHAR +STARTCHAR U_3BCC +ENCODING 15308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2880 +F4C0 +2160 +2EC0 +6540 +76E0 +A540 +24C0 +3E00 +21E0 +ENDCHAR +STARTCHAR U_3BCD +ENCODING 15309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +FB20 +2EA0 +2340 +62A0 +7FE0 +AA20 +2AA0 +32A0 +2240 +ENDCHAR +STARTCHAR U_3BCE +ENCODING 15310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +FFE0 +2080 +6E80 +71C0 +AFA0 +2080 +2E80 +2A80 +2E80 +ENDCHAR +STARTCHAR U_3BCF +ENCODING 15311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1260 +FDC0 +5540 +7C80 +8360 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BD0 +ENCODING 15312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +C7E0 +AB40 +E2C0 +82C0 +0400 +FFE0 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_3BD1 +ENCODING 15313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +4500 +E5E0 +5D00 +51E0 +7100 +DFE0 +4540 +4540 +4520 +59A0 +ENDCHAR +STARTCHAR U_3BD2 +ENCODING 15314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F540 +27C0 +6440 +77C0 +A440 +27C0 +27C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_3BD3 +ENCODING 15315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F560 +2BC0 +6240 +73C0 +A000 +2EE0 +2660 +2AA0 +2660 +ENDCHAR +STARTCHAR U_3BD4 +ENCODING 15316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +7FC0 +2480 +7FC0 +2480 +FBC0 +24A0 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3BD5 +ENCODING 15317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A60 +2F80 +FA80 +2EE0 +6AA0 +7EA0 +AAA0 +3FA0 +2AA0 +3120 +2220 +ENDCHAR +STARTCHAR U_3BD6 +ENCODING 15318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +2FE0 +7AA0 +6FE0 +A000 +3FE0 +2440 +2D60 +27C0 +ENDCHAR +STARTCHAR U_3BD7 +ENCODING 15319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +FAA0 +2EE0 +6820 +7920 +AFE0 +2920 +2BA0 +2D60 +2920 +ENDCHAR +STARTCHAR U_3BD8 +ENCODING 15320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5D00 +E9E0 +5D20 +E280 +DC80 +4080 +5D80 +4940 +5D20 +4A00 +ENDCHAR +STARTCHAR U_3BD9 +ENCODING 15321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2F80 +F4E0 +2F20 +60A0 +7EA0 +AAA0 +2E40 +2A40 +2EA0 +2B20 +ENDCHAR +STARTCHAR U_3BDA +ENCODING 15322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EE0 +F540 +2300 +6480 +7860 +A780 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3BDB +ENCODING 15323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +6000 +7FE0 +AAA0 +2440 +26C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_3BDC +ENCODING 15324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2100 +6FE0 +7440 +AAA0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_3BDD +ENCODING 15325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +52E0 +F3A0 +5EA0 +4440 +E4A0 +D700 +54E0 +54A0 +5EA0 +50E0 +ENDCHAR +STARTCHAR U_3BDE +ENCODING 15326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +FAE0 +2E00 +64E0 +7AA0 +AEE0 +20A0 +2AE0 +2AA0 +28A0 +ENDCHAR +STARTCHAR U_3BDF +ENCODING 15327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +3F80 +0500 +0900 +FFE0 +2480 +1500 +6CC0 +ENDCHAR +STARTCHAR U_3BE0 +ENCODING 15328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F940 +2280 +6FE0 +7AA0 +A140 +26E0 +2900 +2FE0 +2100 +ENDCHAR +STARTCHAR U_3BE1 +ENCODING 15329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +E400 +4BE0 +F020 +47A0 +A4A0 +47A0 +E460 +4400 +E420 +47E0 +ENDCHAR +STARTCHAR U_3BE2 +ENCODING 15330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +F7E0 +2480 +67E0 +7280 +A7C0 +2280 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_3BE3 +ENCODING 15331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +F240 +2280 +77E0 +6A40 +A4C0 +2900 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_3BE4 +ENCODING 15332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2080 +AAA0 +FBE0 +AAA0 +2080 +71C0 +AAA0 +2480 +ENDCHAR +STARTCHAR U_3BE5 +ENCODING 15333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +2080 +71C0 +AAA0 +ENDCHAR +STARTCHAR U_3BE6 +ENCODING 15334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +67C0 +7440 +AFE0 +2540 +2BA0 +2540 +2920 +ENDCHAR +STARTCHAR U_3BE7 +ENCODING 15335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2EA0 +F4A0 +2F20 +6440 +77E0 +AD20 +2D20 +29E0 +2C00 +33E0 +ENDCHAR +STARTCHAR U_3BE8 +ENCODING 15336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6AA0 +7FE0 +A540 +2380 +2FE0 +2380 +2D60 +ENDCHAR +STARTCHAR U_3BE9 +ENCODING 15337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +53E0 +2080 +DBE0 +A8A0 +53E0 +AA80 +23E0 +F8A0 +7140 +AA20 +ENDCHAR +STARTCHAR U_3BEA +ENCODING 15338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2D60 +67C0 +7340 +A520 +2BC0 +2040 +2180 +2080 +ENDCHAR +STARTCHAR U_3BEB +ENCODING 15339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2A20 +6FC0 +7A00 +AFE0 +2900 +2EA0 +29C0 +36A0 +ENDCHAR +STARTCHAR U_3BEC +ENCODING 15340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +0200 +EFC0 +26A0 +4B40 +9FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_3BED +ENCODING 15341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2940 +6FE0 +7AA0 +AFE0 +2AA0 +2BE0 +2920 +3640 +ENDCHAR +STARTCHAR U_3BEE +ENCODING 15342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2400 +6BE0 +7220 +AFA0 +2AA0 +2FA0 +23A0 +2CC0 +ENDCHAR +STARTCHAR U_3BEF +ENCODING 15343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2C40 +F380 +2D60 +67C0 +7500 +A7C0 +2540 +2540 +27C0 +2820 +ENDCHAR +STARTCHAR U_3BF0 +ENCODING 15344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2100 +6FE0 +7440 +A7C0 +2440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_3BF1 +ENCODING 15345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +FFE0 +A420 +7FE0 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_3BF2 +ENCODING 15346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +6AA0 +77C0 +A000 +2FE0 +2100 +2540 +2B20 +ENDCHAR +STARTCHAR U_3BF3 +ENCODING 15347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +EAE0 +2BA0 +6EA0 +72A0 +AE40 +2A40 +2E40 +22A0 +2D20 +ENDCHAR +STARTCHAR U_3BF4 +ENCODING 15348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +6AA0 +7540 +A280 +2FE0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_3BF5 +ENCODING 15349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2280 +F7C0 +2100 +7FE0 +6540 +A7C0 +2540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_3BF6 +ENCODING 15350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2D60 +FAA0 +2FE0 +6440 +7A20 +A7C0 +2C40 +2280 +2380 +2C60 +ENDCHAR +STARTCHAR U_3BF7 +ENCODING 15351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2940 +FFE0 +2940 +6BE0 +7880 +A9C0 +A880 +2BE0 +2940 +2A20 +ENDCHAR +STARTCHAR U_3BF8 +ENCODING 15352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +FFE0 +2140 +67C0 +7100 +AFE0 +3540 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3BF9 +ENCODING 15353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +4A20 +FFE0 +5520 +5F20 +E0A0 +CE60 +4020 +5F20 +4E20 +5560 +ENDCHAR +STARTCHAR U_3BFA +ENCODING 15354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +FD00 +8880 +FBE0 +A2A0 +FBE0 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_3BFB +ENCODING 15355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +FFE0 +94A0 +6B00 +3280 +0C40 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_3BFC +ENCODING 15356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +F440 +2100 +27C0 +7100 +6FE0 +A440 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_3BFD +ENCODING 15357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F020 +4FC0 +4940 +EFC0 +CA40 +4BC0 +4A40 +4BC0 +5420 +ENDCHAR +STARTCHAR U_3BFE +ENCODING 15358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +23E0 +F140 +2BE0 +7EA0 +6BE0 +AAA0 +2BE0 +2940 +3D40 +23E0 +ENDCHAR +STARTCHAR U_3BFF +ENCODING 15359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +27E0 +6520 +77E0 +AD40 +A7C0 +2540 +27E0 +2520 +ENDCHAR +STARTCHAR U_3C00 +ENCODING 15360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +F560 +3EA0 +2560 +6280 +B540 +2960 +2580 +2940 +3320 +ENDCHAR +STARTCHAR U_3C01 +ENCODING 15361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +2640 +63C0 +7000 +AFE0 +2440 +2EE0 +3BA0 +2EE0 +ENDCHAR +STARTCHAR U_3C02 +ENCODING 15362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FBA0 +2540 +6FE0 +7380 +AFE0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_3C03 +ENCODING 15363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +4FC0 +FAA0 +4FE0 +4A40 +64A0 +DFE0 +5540 +55E0 +5760 +44C0 +ENDCHAR +STARTCHAR U_3C04 +ENCODING 15364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2AE0 +FB80 +2EC0 +6AA0 +7F60 +AAA0 +2BE0 +2EA0 +2460 +2BA0 +ENDCHAR +STARTCHAR U_3C05 +ENCODING 15365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +57E0 +E940 +43E0 +7AA0 +EBE0 +CAA0 +4BE0 +4B60 +5AA0 +67E0 +ENDCHAR +STARTCHAR U_3C06 +ENCODING 15366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +FFE0 +8A20 +7BC0 +0A00 +7BC0 +0E00 +FFE0 +3580 +ENDCHAR +STARTCHAR U_3C07 +ENCODING 15367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4FA0 +F4E0 +5F80 +6A80 +5BA0 +CAC0 +5B80 +4AA0 +4FA0 +5860 +ENDCHAR +STARTCHAR U_3C08 +ENCODING 15368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +BFE0 +1240 +DFC0 +5240 +7FE0 +C200 +BFE0 +ENDCHAR +STARTCHAR U_3C09 +ENCODING 15369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5FE0 +E880 +53E0 +5C80 +EBE0 +DD40 +4AA0 +4FE0 +59C0 +42A0 +ENDCHAR +STARTCHAR U_3C0A +ENCODING 15370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5DA0 +EAC0 +5E80 +4D40 +F6A0 +C9A0 +5EC0 +4880 +4D40 +5220 +ENDCHAR +STARTCHAR U_3C0B +ENCODING 15371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4480 +F7E0 +5520 +5FE0 +E520 +D5E0 +5720 +65E0 +48C0 +7120 +ENDCHAR +STARTCHAR U_3C0C +ENCODING 15372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4200 +FFE0 +5AA0 +4700 +EAC0 +C500 +4FC0 +5500 +47C0 +47E0 +ENDCHAR +STARTCHAR U_3C0D +ENCODING 15373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +53C0 +FC40 +5380 +7240 +53C0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_3C0E +ENCODING 15374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +F480 +2FE0 +6480 +77E0 +A480 +27E0 +2EE0 +2BA0 +2820 +ENDCHAR +STARTCHAR U_3C0F +ENCODING 15375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +F920 +27E0 +6240 +73C0 +A7E0 +2420 +25A0 +25A0 +2460 +ENDCHAR +STARTCHAR U_3C10 +ENCODING 15376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +5DE0 +F480 +5AE0 +7540 +D5E0 +D6A0 +5AE0 +52A0 +5200 +55E0 +ENDCHAR +STARTCHAR U_3C11 +ENCODING 15377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +54A0 +E380 +4A40 +6920 +D6C0 +4100 +4FE0 +4380 +4540 +4920 +ENDCHAR +STARTCHAR U_3C12 +ENCODING 15378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C60 +4AA0 +4D60 +FAA0 +4FE0 +6820 +D7C0 +4080 +4FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_3C13 +ENCODING 15379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +54E0 +5A80 +F540 +5E20 +6FC0 +CA40 +C940 +4FC0 +4480 +4840 +ENDCHAR +STARTCHAR U_3C14 +ENCODING 15380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +7760 +58C0 +F740 +5040 +DF40 +E5A0 +4F00 +4500 +4200 +5DC0 +ENDCHAR +STARTCHAR U_3C15 +ENCODING 15381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4F80 +4200 +EF80 +4540 +DFC0 +E500 +5D40 +4880 +4540 +5E20 +ENDCHAR +STARTCHAR U_3C16 +ENCODING 15382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +54E0 +5A80 +F560 +5E00 +E000 +CF80 +4880 +4A80 +4520 +59E0 +ENDCHAR +STARTCHAR U_3C17 +ENCODING 15383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +FAA0 +2F40 +6AA0 +77C0 +A440 +27C0 +2540 +2780 +28E0 +ENDCHAR +STARTCHAR U_3C18 +ENCODING 15384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2240 +FFE0 +2AA0 +6FC0 +77A0 +AAE0 +2340 +2FE0 +2240 +2440 +ENDCHAR +STARTCHAR U_3C19 +ENCODING 15385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +5540 +FFE0 +5540 +5F40 +EBE0 +DF40 +49E0 +7F40 +5540 +63E0 +ENDCHAR +STARTCHAR U_3C1A +ENCODING 15386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F40 +EBE0 +5540 +DF40 +E5E0 +DF40 +55E0 +5740 +5D40 +53E0 +ENDCHAR +STARTCHAR U_3C1B +ENCODING 15387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2AA0 +7FC0 +6AA0 +AFE0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_3C1C +ENCODING 15388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2E40 +F4E0 +2EA0 +6AE0 +7EA0 +AAE0 +2AA0 +3FE0 +2AA0 +3120 +ENDCHAR +STARTCHAR U_3C1D +ENCODING 15389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +8BE0 +8D20 +F900 +8100 +8100 +8900 +B280 +C440 +1820 +ENDCHAR +STARTCHAR U_3C1E +ENCODING 15390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +AD20 +A940 +A900 +A900 +A900 +FA80 +8440 +1820 +ENDCHAR +STARTCHAR U_3C1F +ENCODING 15391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +41E0 +BAA0 +0280 +F880 +0880 +0880 +0940 +0D40 +0620 +ENDCHAR +STARTCHAR U_3C20 +ENCODING 15392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2A00 +FBE0 +02A0 +7480 +5080 +5080 +5480 +5940 +5220 +8420 +ENDCHAR +STARTCHAR U_3C21 +ENCODING 15393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +53E0 +8D20 +5100 +5100 +5100 +5100 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_3C22 +ENCODING 15394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +5200 +53E0 +5520 +F900 +5100 +5100 +5100 +5180 +5240 +9C20 +ENDCHAR +STARTCHAR U_3C23 +ENCODING 15395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +2A00 +ABE0 +AAA0 +BE80 +A880 +A880 +BA80 +EC80 +8940 +0220 +ENDCHAR +STARTCHAR U_3C24 +ENCODING 15396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FE00 +0BE0 +ED20 +A900 +A900 +A900 +E900 +0980 +0A40 +1C20 +ENDCHAR +STARTCHAR U_3C25 +ENCODING 15397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +AA00 +ABE0 +FD20 +A900 +A900 +A900 +B900 +8180 +FA40 +0420 +ENDCHAR +STARTCHAR U_3C26 +ENCODING 15398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2520 +2140 +F900 +2100 +5100 +8980 +FA40 +0420 +ENDCHAR +STARTCHAR U_3C27 +ENCODING 15399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +53E0 +8D20 +F900 +0100 +F900 +8900 +8980 +FA40 +8C20 +ENDCHAR +STARTCHAR U_3C28 +ENCODING 15400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8A00 +8BE0 +8D20 +F900 +8900 +0100 +5100 +4980 +8A40 +8420 +ENDCHAR +STARTCHAR U_3C29 +ENCODING 15401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AD20 +A900 +F900 +A100 +3100 +3980 +CA40 +0420 +ENDCHAR +STARTCHAR U_3C2A +ENCODING 15402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2520 +F900 +2100 +F900 +2100 +3A80 +C440 +0820 +ENDCHAR +STARTCHAR U_3C2B +ENCODING 15403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +79E0 +92A0 +1080 +FC80 +2880 +2880 +2940 +4A20 +8C20 +ENDCHAR +STARTCHAR U_3C2C +ENCODING 15404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7DE0 +86A0 +7480 +5480 +7480 +5480 +7540 +0220 +1C20 +ENDCHAR +STARTCHAR U_3C2D +ENCODING 15405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +51E0 +8AA0 +7480 +0080 +F880 +4080 +7940 +0940 +3620 +ENDCHAR +STARTCHAR U_3C2E +ENCODING 15406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4100 +7DE0 +42A0 +7E80 +5480 +5680 +5480 +5480 +9340 +1A20 +ENDCHAR +STARTCHAR U_3C2F +ENCODING 15407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0100 +7BE0 +4AA0 +4C80 +7880 +8480 +4880 +1D40 +E140 +0620 +ENDCHAR +STARTCHAR U_3C30 +ENCODING 15408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FDE0 +12A0 +5480 +5480 +BA80 +1080 +2940 +4540 +8220 +ENDCHAR +STARTCHAR U_3C31 +ENCODING 15409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +2200 +FBE0 +2520 +F900 +A900 +F900 +A900 +F980 +2240 +2C20 +ENDCHAR +STARTCHAR U_3C32 +ENCODING 15410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +0900 +FDE0 +0AA0 +EC80 +A880 +A880 +EC80 +2880 +D940 +2620 +ENDCHAR +STARTCHAR U_3C33 +ENCODING 15411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +53E0 +DAA0 +8C80 +8880 +D880 +5080 +5C80 +E140 +0620 +ENDCHAR +STARTCHAR U_3C34 +ENCODING 15412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +8D20 +5100 +F900 +0100 +F900 +8980 +FA40 +8C20 +ENDCHAR +STARTCHAR U_3C35 +ENCODING 15413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +53E0 +5520 +A900 +2100 +2100 +F900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_3C36 +ENCODING 15414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +7500 +95E0 +6AA0 +6080 +9E80 +0080 +7C80 +4480 +4540 +7E20 +ENDCHAR +STARTCHAR U_3C37 +ENCODING 15415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +4BE0 +4CA0 +6880 +A880 +EC80 +2880 +2940 +4940 +8E20 +ENDCHAR +STARTCHAR U_3C38 +ENCODING 15416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +7520 +2140 +F900 +A900 +F900 +2180 +5240 +8C20 +ENDCHAR +STARTCHAR U_3C39 +ENCODING 15417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +0900 +FDE0 +8AA0 +E880 +8880 +E880 +AD40 +E940 +9620 +E420 +ENDCHAR +STARTCHAR U_3C3A +ENCODING 15418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +A500 +A5E0 +EEA0 +8080 +FC80 +9480 +F480 +8940 +9540 +9620 +ENDCHAR +STARTCHAR U_3C3B +ENCODING 15419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FAA0 +0480 +F880 +8880 +F880 +9140 +7940 +C620 +ENDCHAR +STARTCHAR U_3C3C +ENCODING 15420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +9100 +FDE0 +92A0 +D480 +BA80 +9080 +A880 +C540 +FE20 +0420 +ENDCHAR +STARTCHAR U_3C3D +ENCODING 15421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +A900 +BBE0 +ACA0 +B880 +A880 +FC80 +A880 +9080 +A940 +FE20 +ENDCHAR +STARTCHAR U_3C3E +ENCODING 15422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F900 +89E0 +FAA0 +8C80 +F880 +2080 +FC80 +5140 +4A20 +9C20 +ENDCHAR +STARTCHAR U_3C3F +ENCODING 15423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +53E0 +F4A0 +2080 +4880 +F880 +2080 +F940 +5220 +8C20 +ENDCHAR +STARTCHAR U_3C40 +ENCODING 15424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F900 +A9E0 +EA20 +5A80 +8080 +F880 +A940 +E940 +4A40 +9C20 +ENDCHAR +STARTCHAR U_3C41 +ENCODING 15425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +ABE0 +AAA0 +FC80 +2080 +A880 +A880 +A940 +FA40 +8C20 +ENDCHAR +STARTCHAR U_3C42 +ENCODING 15426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +5100 +7DE0 +56A0 +7C80 +5480 +7C80 +5540 +B940 +B620 +ENDCHAR +STARTCHAR U_3C43 +ENCODING 15427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +6900 +9500 +79E0 +12A0 +FC80 +4880 +FC80 +CD40 +B540 +FE20 +ENDCHAR +STARTCHAR U_3C44 +ENCODING 15428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5500 +7DE0 +56A0 +7C80 +1080 +7C80 +1080 +FD40 +5520 +AA20 +ENDCHAR +STARTCHAR U_3C45 +ENCODING 15429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +FEA0 +8480 +FC80 +4880 +7880 +4940 +3140 +FE20 +ENDCHAR +STARTCHAR U_3C46 +ENCODING 15430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +7FE0 +5520 +7E80 +4080 +7E80 +5480 +5D40 +9540 +BE20 +ENDCHAR +STARTCHAR U_3C47 +ENCODING 15431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +55E0 +BB20 +FE80 +4480 +7480 +5480 +7540 +4540 +7E20 +ENDCHAR +STARTCHAR U_3C48 +ENCODING 15432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FD00 +29E0 +7D20 +AA80 +7C80 +0080 +FE80 +5540 +9340 +3220 +ENDCHAR +STARTCHAR U_3C49 +ENCODING 15433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +2900 +FDE0 +2A20 +FE80 +1080 +7C80 +1080 +FD40 +5540 +9220 +ENDCHAR +STARTCHAR U_3C4A +ENCODING 15434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2100 +F9E0 +AAA0 +FC80 +A880 +5480 +7880 +C940 +3240 +CC20 +ENDCHAR +STARTCHAR U_3C4B +ENCODING 15435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +1100 +FDE0 +D6A0 +3880 +5480 +FC80 +4880 +7D40 +4940 +7E20 +ENDCHAR +STARTCHAR U_3C4C +ENCODING 15436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4900 +79E0 +4AA0 +FC80 +0880 +FC80 +5480 +5540 +FD40 +2A20 +ENDCHAR +STARTCHAR U_3C4D +ENCODING 15437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +4A80 +9CE0 +E720 +5D40 +4240 +BC40 +E740 +1C40 +B5A0 +9D20 +ENDCHAR +STARTCHAR U_3C4E +ENCODING 15438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FFE0 +5520 +F280 +5C80 +D480 +7C80 +5540 +7D40 +AA20 +ENDCHAR +STARTCHAR U_3C4F +ENCODING 15439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0000 +FFE0 +0400 +0400 +2780 +2400 +2400 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_3C50 +ENCODING 15440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7C40 +0040 +FFE0 +0000 +1000 +5E00 +5000 +5E00 +F000 +4000 +ENDCHAR +STARTCHAR U_3C51 +ENCODING 15441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2780 +2400 +FFE0 +0800 +1F80 +6880 +0500 +0600 +1800 +E000 +ENDCHAR +STARTCHAR U_3C52 +ENCODING 15442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47C0 +4400 +FFE0 +0000 +7FC0 +0080 +3C80 +2480 +3C80 +0180 +ENDCHAR +STARTCHAR U_3C53 +ENCODING 15443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1100 +1280 +5440 +5920 +5080 +57C0 +5040 +FA80 +4100 +0100 +ENDCHAR +STARTCHAR U_3C54 +ENCODING 15444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +5FE0 +5200 +FDE0 +1000 +1F80 +6900 +0600 +0C00 +F000 +ENDCHAR +STARTCHAR U_3C55 +ENCODING 15445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +23C0 +B040 +AFE0 +A920 +A7C0 +B540 +E540 +85C0 +0100 +ENDCHAR +STARTCHAR U_3C56 +ENCODING 15446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +2FE0 +2440 +A440 +BAA0 +A100 +AFE0 +B100 +C100 +0100 +ENDCHAR +STARTCHAR U_3C57 +ENCODING 15447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27C0 +2540 +BEC0 +A540 +A640 +A7C0 +B940 +EFE0 +8280 +0C60 +ENDCHAR +STARTCHAR U_3C58 +ENCODING 15448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52C0 +5EA0 +53E0 +5E80 +5340 +5E20 +6200 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_3C59 +ENCODING 15449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +4100 +7A00 +CBE0 +B020 +1020 +2020 +4020 +83C0 +0080 +ENDCHAR +STARTCHAR U_3C5A +ENCODING 15450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2220 +2220 +3BE0 +4A20 +CA20 +33E0 +1220 +2220 +C420 +0860 +ENDCHAR +STARTCHAR U_3C5B +ENCODING 15451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2200 +2200 +7BC0 +4A40 +CE40 +3180 +2080 +4100 +8200 +0400 +ENDCHAR +STARTCHAR U_3C5C +ENCODING 15452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +4080 +7880 +4A80 +CAE0 +3280 +1280 +2280 +C780 +08E0 +ENDCHAR +STARTCHAR U_3C5D +ENCODING 15453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +4880 +6BE0 +A8A0 +ACA0 +68A0 +28A0 +4920 +4D20 +8AC0 +ENDCHAR +STARTCHAR U_3C5E +ENCODING 15454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +4FE0 +7000 +9440 +5440 +2240 +2280 +4280 +8000 +0FE0 +ENDCHAR +STARTCHAR U_3C5F +ENCODING 15455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +22A0 +3A80 +4A80 +6BE0 +92A0 +12A0 +2240 +C4A0 +0520 +ENDCHAR +STARTCHAR U_3C60 +ENCODING 15456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +2080 +7BE0 +4880 +4880 +ABE0 +1220 +2220 +4220 +83E0 +ENDCHAR +STARTCHAR U_3C61 +ENCODING 15457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +25C0 +3900 +4900 +AFE0 +1180 +2280 +4480 +88A0 +00E0 +ENDCHAR +STARTCHAR U_3C62 +ENCODING 15458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +47C0 +7440 +57C0 +D440 +37C0 +2520 +44C0 +8440 +0620 +ENDCHAR +STARTCHAR U_3C63 +ENCODING 15459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +FFA0 +42A0 +7A40 +4A40 +CFE0 +3240 +1640 +2180 +4140 +8620 +ENDCHAR +STARTCHAR U_3C64 +ENCODING 15460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F460 +4580 +4F00 +7500 +55E0 +D740 +3D40 +2540 +2540 +4540 +8640 +ENDCHAR +STARTCHAR U_3C65 +ENCODING 15461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4100 +47C0 +7240 +9520 +D3C0 +2640 +2180 +4180 +8660 +ENDCHAR +STARTCHAR U_3C66 +ENCODING 15462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4100 +4280 +7440 +9FE0 +D040 +2740 +2540 +4740 +80C0 +ENDCHAR +STARTCHAR U_3C67 +ENCODING 15463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4820 +4000 +76E0 +9AA0 +DAE0 +2680 +2280 +44A0 +88E0 +ENDCHAR +STARTCHAR U_3C68 +ENCODING 15464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +4FE0 +4820 +77C0 +9100 +D5C0 +2500 +2500 +4700 +88E0 +ENDCHAR +STARTCHAR U_3C69 +ENCODING 15465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4100 +4FE0 +7520 +9B40 +D500 +2FE0 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_3C6A +ENCODING 15466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +47C0 +4480 +77E0 +9440 +D7E0 +2440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_3C6B +ENCODING 15467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4100 +47E0 +7560 +97A0 +D7E0 +3100 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_3C6C +ENCODING 15468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FD40 +47C0 +4540 +77C0 +9000 +DFE0 +2540 +2480 +4540 +8620 +ENDCHAR +STARTCHAR U_3C6D +ENCODING 15469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F4A0 +44A0 +4700 +74E0 +9720 +D4A0 +2740 +2C40 +44A0 +8520 +ENDCHAR +STARTCHAR U_3C6E +ENCODING 15470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4540 +47C0 +7100 +97E0 +D540 +2540 +2540 +4280 +8C60 +ENDCHAR +STARTCHAR U_3C6F +ENCODING 15471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +47C0 +4000 +7FE0 +9000 +D7C0 +2440 +27C0 +4280 +8FE0 +ENDCHAR +STARTCHAR U_3C70 +ENCODING 15472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4920 +47C0 +7440 +9280 +DFE0 +2100 +27C0 +4100 +8100 +ENDCHAR +STARTCHAR U_3C71 +ENCODING 15473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FC00 +47C0 +4540 +77C0 +9540 +D7C0 +22A0 +22E0 +4480 +8860 +ENDCHAR +STARTCHAR U_3C72 +ENCODING 15474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2280 +7C40 +4820 +D7C0 +3540 +2540 +4540 +8FE0 +ENDCHAR +STARTCHAR U_3C73 +ENCODING 15475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1100 +3F80 +2480 +FFE0 +2080 +DF60 +0800 +3F00 +0500 +7E00 +ENDCHAR +STARTCHAR U_3C74 +ENCODING 15476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4100 +43C0 +7100 +9FE0 +D240 +23C0 +2240 +43C0 +8C20 +ENDCHAR +STARTCHAR U_3C75 +ENCODING 15477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4540 +4FE0 +7440 +97C0 +D440 +27C0 +2440 +47C0 +8820 +ENDCHAR +STARTCHAR U_3C76 +ENCODING 15478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FF20 +4240 +4780 +7000 +9720 +55C0 +2700 +2880 +4520 +8FC0 +ENDCHAR +STARTCHAR U_3C77 +ENCODING 15479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4480 +47E0 +7480 +97E0 +D480 +27E0 +2180 +42C0 +8CA0 +ENDCHAR +STARTCHAR U_3C78 +ENCODING 15480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F740 +45E0 +45A0 +7740 +94E0 +D740 +2540 +25E0 +4740 +8840 +ENDCHAR +STARTCHAR U_3C79 +ENCODING 15481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4480 +4760 +7540 +97E0 +D540 +37E0 +2480 +26E0 +4A80 +8BE0 +ENDCHAR +STARTCHAR U_3C7A +ENCODING 15482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +F900 +47E0 +7540 +57E0 +D540 +B7C0 +2540 +27C0 +4D40 +8FE0 +ENDCHAR +STARTCHAR U_3C7B +ENCODING 15483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4400 +43E0 +7440 +97C0 +D540 +27C0 +2540 +47C0 +8960 +ENDCHAR +STARTCHAR U_3C7C +ENCODING 15484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +9480 +9480 +9860 +F780 +8480 +9480 +A300 +C480 +1860 +ENDCHAR +STARTCHAR U_3C7D +ENCODING 15485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +AA40 +AC60 +2BC0 +5240 +5240 +5580 +9A40 +9420 +ENDCHAR +STARTCHAR U_3C7E +ENCODING 15486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +2240 +4C20 +F3C0 +2A40 +5240 +B180 +4980 +8660 +ENDCHAR +STARTCHAR U_3C7F +ENCODING 15487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +7240 +0240 +FDE0 +8A40 +FA40 +8980 +8980 +9E60 +ENDCHAR +STARTCHAR U_3C80 +ENCODING 15488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +4140 +7940 +4260 +7C00 +53E0 +5D40 +5880 +5540 +5A40 +9420 +ENDCHAR +STARTCHAR U_3C81 +ENCODING 15489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +1140 +7D40 +8660 +4800 +87E0 +FA20 +2140 +2080 +3940 +C220 +ENDCHAR +STARTCHAR U_3C82 +ENCODING 15490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +7240 +FA40 +8C20 +EBC0 +AA40 +AA40 +E980 +8A40 +9C20 +ENDCHAR +STARTCHAR U_3C83 +ENCODING 15491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +2240 +FA40 +AA40 +CC20 +FBC0 +4240 +7180 +4240 +7C20 +ENDCHAR +STARTCHAR U_3C84 +ENCODING 15492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +FA40 +8C20 +FBC0 +2240 +FA40 +2180 +3A40 +C420 +ENDCHAR +STARTCHAR U_3C85 +ENCODING 15493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +A540 +F940 +2620 +F9C0 +2140 +F940 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_3C86 +ENCODING 15494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +57E0 +7D40 +4180 +8E60 +3580 +C260 +1F80 +0900 +0600 +ENDCHAR +STARTCHAR U_3C87 +ENCODING 15495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +57E0 +7D40 +4E80 +B160 +0E00 +1900 +E6E0 +0800 +0600 +ENDCHAR +STARTCHAR U_3C88 +ENCODING 15496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +57E0 +7D40 +4080 +8360 +7F80 +1080 +7F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3C89 +ENCODING 15497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDC0 +2140 +FD40 +8660 +FFC0 +D540 +BD40 +F480 +5D40 +9220 +ENDCHAR +STARTCHAR U_3C8A +ENCODING 15498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +2140 +FD40 +8540 +7A20 +B5C0 +4940 +FD40 +5880 +6940 +7E20 +ENDCHAR +STARTCHAR U_3C8B +ENCODING 15499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A040 +3FC0 +2200 +3E60 +2380 +2E20 +31E0 +ENDCHAR +STARTCHAR U_3C8C +ENCODING 15500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E780 +2280 +3A80 +E2C0 +2240 +3C40 +E440 +29A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C8D +ENCODING 15501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +21C0 +2700 +F9E0 +4F00 +4920 +30E0 +4C00 +83E0 +ENDCHAR +STARTCHAR U_3C8E +ENCODING 15502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E700 +2100 +39C0 +E700 +2100 +39E0 +E700 +2900 +3120 +20E0 +ENDCHAR +STARTCHAR U_3C8F +ENCODING 15503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +5700 +5100 +51C0 +7F00 +4100 +79E0 +4F00 +4900 +8920 +88E0 +ENDCHAR +STARTCHAR U_3C90 +ENCODING 15504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +A280 +3440 +6920 +A7C0 +3040 +6080 +A100 +2020 +3FE0 +ENDCHAR +STARTCHAR U_3C91 +ENCODING 15505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +A740 +3380 +6580 +A540 +3920 +6100 +A300 +2020 +3FE0 +ENDCHAR +STARTCHAR U_3C92 +ENCODING 15506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +7900 +4900 +8FC0 +6900 +5900 +5FC0 +6900 +0920 +39E0 +ENDCHAR +STARTCHAR U_3C93 +ENCODING 15507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E0A0 +27E0 +3C80 +E6A0 +25A0 +3CC0 +E540 +2A20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C94 +ENCODING 15508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +8900 +51E0 +0700 +F900 +21E0 +FF00 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_3C95 +ENCODING 15509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C60 +E780 +A480 +58E0 +0B80 +FC80 +88E0 +4B80 +0880 +08A0 +18E0 +ENDCHAR +STARTCHAR U_3C96 +ENCODING 15510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8E0 +7380 +2080 +F8E0 +8B80 +F880 +88E0 +FB80 +8880 +88A0 +98E0 +ENDCHAR +STARTCHAR U_3C97 +ENCODING 15511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1CE0 +E780 +A880 +F8E0 +1780 +2080 +38E0 +E780 +2080 +20A0 +60E0 +ENDCHAR +STARTCHAR U_3C98 +ENCODING 15512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +4B80 +4880 +78E0 +4B80 +7880 +48E0 +4B80 +7880 +48A0 +84E0 +ENDCHAR +STARTCHAR U_3C99 +ENCODING 15513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +EFE0 +2200 +3440 +EFE0 +2540 +3540 +E540 +2960 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C9A +ENCODING 15514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +4B40 +1520 +E180 +5E00 +0400 +7F80 +0400 +FFC0 +0420 +07E0 +ENDCHAR +STARTCHAR U_3C9B +ENCODING 15515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9120 +7DE0 +2800 +5F80 +0400 +7FC0 +0400 +FFE0 +0420 +07E0 +ENDCHAR +STARTCHAR U_3C9C +ENCODING 15516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AB00 +7100 +21E0 +5700 +A900 +A9E0 +7700 +2100 +5120 +88E0 +ENDCHAR +STARTCHAR U_3C9D +ENCODING 15517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E500 +27C0 +3D00 +E7C0 +2500 +37C0 +E500 +27E0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3C9E +ENCODING 15518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +1380 +FC80 +4BE0 +4880 +B480 +13E0 +FC80 +1080 +10A0 +10E0 +ENDCHAR +STARTCHAR U_3C9F +ENCODING 15519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +FF80 +2880 +10E0 +7F80 +5480 +54E0 +FF80 +2880 +44A0 +80E0 +ENDCHAR +STARTCHAR U_3CA0 +ENCODING 15520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +5760 +3C00 +07C0 +7C00 +07C0 +7C20 +07E0 +ENDCHAR +STARTCHAR U_3CA1 +ENCODING 15521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FF80 +3880 +D4E0 +7B80 +0080 +FCE0 +1380 +5880 +94A0 +30E0 +ENDCHAR +STARTCHAR U_3CA2 +ENCODING 15522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7F80 +4280 +7EE0 +4180 +4080 +7EE0 +6B80 +FE80 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_3CA3 +ENCODING 15523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +60C0 +BB80 +A880 +F8E0 +AB80 +F880 +20E0 +FB80 +4880 +30A0 +CCE0 +ENDCHAR +STARTCHAR U_3CA4 +ENCODING 15524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +1380 +FC80 +48E0 +FF80 +4880 +78E0 +5780 +D880 +48A0 +64E0 +ENDCHAR +STARTCHAR U_3CA5 +ENCODING 15525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7F80 +5480 +7EE0 +5580 +7C80 +50E0 +7F80 +6480 +BCA0 +A4E0 +ENDCHAR +STARTCHAR U_3CA6 +ENCODING 15526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +4CE0 +F700 +9100 +F1C0 +9700 +F1C0 +4700 +F120 +41E0 +ENDCHAR +STARTCHAR U_3CA7 +ENCODING 15527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +C540 +4280 +7380 +CD60 +4540 +77C0 +C120 +4FE0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_3CA8 +ENCODING 15528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +FF80 +4880 +FCE0 +4B80 +7880 +48E0 +7B80 +4880 +FCA0 +08E0 +ENDCHAR +STARTCHAR U_3CA9 +ENCODING 15529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +3440 +EFE0 +2AA0 +3660 +EBA0 +2660 +2020 +1FE0 +ENDCHAR +STARTCHAR U_3CAA +ENCODING 15530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E8C0 +B780 +5880 +48E0 +B780 +0080 +78E0 +4B80 +7880 +48A0 +FCE0 +ENDCHAR +STARTCHAR U_3CAB +ENCODING 15531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CCC0 +4B80 +FC80 +48E0 +FF80 +2080 +78E0 +2380 +FC80 +48A0 +84E0 +ENDCHAR +STARTCHAR U_3CAC +ENCODING 15532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +7F80 +D080 +7CE0 +5380 +7C80 +50E0 +7F80 +4080 +A4A0 +A4E0 +ENDCHAR +STARTCHAR U_3CAD +ENCODING 15533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9460 +5580 +5880 +28E0 +4580 +8280 +54E0 +EF80 +4480 +AEA0 +92E0 +ENDCHAR +STARTCHAR U_3CAE +ENCODING 15534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6FE0 +CAA0 +4380 +7C60 +C7C0 +4000 +77C0 +C440 +47C0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_3CAF +ENCODING 15535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +A980 +EC80 +B0E0 +E180 +AC80 +F0E0 +0180 +FE80 +AAA0 +FEE0 +ENDCHAR +STARTCHAR U_3CB0 +ENCODING 15536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FE80 +9280 +4CE0 +FB80 +AA80 +FEE0 +0180 +FE80 +10A0 +3060 +ENDCHAR +STARTCHAR U_3CB1 +ENCODING 15537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +EA80 +2540 +2FC0 +F940 +2A40 +2FC0 +FA80 +2FA0 +2A60 +1FC0 +ENDCHAR +STARTCHAR U_3CB2 +ENCODING 15538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5480 +FE80 +ABE0 +FE80 +8280 +7DE0 +4480 +7C80 +44A0 +FEE0 +ENDCHAR +STARTCHAR U_3CB3 +ENCODING 15539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +F280 +93E0 +9280 +FC80 +97E0 +9080 +9080 +F140 +8A20 +6C20 +ENDCHAR +STARTCHAR U_3CB4 +ENCODING 15540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +0000 +7F80 +0880 +7E80 +4A80 +7E60 +0820 +ENDCHAR +STARTCHAR U_3CB5 +ENCODING 15541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4000 +BF80 +0000 +7F80 +2A80 +1C80 +3E80 +22A0 +3EA0 +2660 +ENDCHAR +STARTCHAR U_3CB6 +ENCODING 15542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4000 +FF80 +2080 +3C80 +2080 +FE80 +AA80 +D6A0 +AA60 +FE20 +ENDCHAR +STARTCHAR U_3CB7 +ENCODING 15543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +BFC0 +5540 +7F40 +2A40 +3E40 +2A40 +FFC0 +0860 +0820 +ENDCHAR +STARTCHAR U_3CB8 +ENCODING 15544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +0040 +8080 +4100 +1200 +2400 +C800 +4800 +4820 +47E0 +ENDCHAR +STARTCHAR U_3CB9 +ENCODING 15545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0480 +8480 +4480 +1480 +2480 +C480 +4480 +48A0 +1060 +ENDCHAR +STARTCHAR U_3CBA +ENCODING 15546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +0200 +8200 +43E0 +0E00 +1200 +2200 +C200 +4220 +41E0 +ENDCHAR +STARTCHAR U_3CBB +ENCODING 15547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2240 +7A40 +CB80 +4B00 +4A80 +5280 +5240 +6220 +4600 +ENDCHAR +STARTCHAR U_3CBC +ENCODING 15548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2440 +0440 +8440 +4280 +1280 +2100 +C100 +4280 +4440 +1820 +ENDCHAR +STARTCHAR U_3CBD +ENCODING 15549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +0220 +8220 +4220 +1A20 +2620 +C220 +4420 +4820 +10C0 +ENDCHAR +STARTCHAR U_3CBE +ENCODING 15550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +0440 +F480 +1700 +2500 +4480 +8460 +1C00 +ENDCHAR +STARTCHAR U_3CBF +ENCODING 15551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0800 +8800 +4800 +1800 +2800 +C800 +4800 +4800 +1000 +ENDCHAR +STARTCHAR U_3CC0 +ENCODING 15552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2280 +0240 +8FE0 +4200 +1240 +2280 +C100 +4320 +44A0 +4840 +ENDCHAR +STARTCHAR U_3CC1 +ENCODING 15553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0900 +8900 +4900 +0900 +2980 +CA80 +5240 +5440 +6820 +ENDCHAR +STARTCHAR U_3CC2 +ENCODING 15554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +0280 +8240 +4440 +0920 +2100 +C200 +4240 +44C0 +4720 +ENDCHAR +STARTCHAR U_3CC3 +ENCODING 15555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0FC0 +8280 +44A0 +0940 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3CC4 +ENCODING 15556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2440 +07C0 +8A40 +5280 +0200 +2500 +C480 +4880 +4840 +5020 +ENDCHAR +STARTCHAR U_3CC5 +ENCODING 15557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0100 +8200 +4340 +1520 +2920 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3CC6 +ENCODING 15558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2480 +0280 +8080 +4480 +1280 +20E0 +CF80 +4080 +4080 +4080 +ENDCHAR +STARTCHAR U_3CC7 +ENCODING 15559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2480 +0440 +8820 +5480 +0480 +2300 +C100 +4280 +4480 +5860 +ENDCHAR +STARTCHAR U_3CC8 +ENCODING 15560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +1FE0 +8200 +4A80 +0A80 +2A80 +AA80 +4AA0 +52E0 +4200 +ENDCHAR +STARTCHAR U_3CC9 +ENCODING 15561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +0420 +87E0 +4420 +1420 +27E0 +A420 +4420 +48A0 +5060 +ENDCHAR +STARTCHAR U_3CCA +ENCODING 15562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07E0 +8880 +5480 +1480 +2300 +A100 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_3CCB +ENCODING 15563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +0800 +8800 +4FE0 +0880 +2880 +A880 +4880 +4880 +7FE0 +ENDCHAR +STARTCHAR U_3CCC +ENCODING 15564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0920 +8FE0 +4920 +1920 +2FE0 +A100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_3CCD +ENCODING 15565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +1FE0 +8500 +4FC0 +1940 +2940 +A940 +49C0 +4100 +4100 +ENDCHAR +STARTCHAR U_3CCE +ENCODING 15566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2400 +0840 +9FE0 +4480 +1480 +3FE0 +A480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_3CCF +ENCODING 15567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +8920 +4920 +0FE0 +2900 +A500 +4300 +4680 +5860 +ENDCHAR +STARTCHAR U_3CD0 +ENCODING 15568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0480 +9F80 +4480 +1480 +2E80 +CD80 +5480 +44A0 +04E0 +ENDCHAR +STARTCHAR U_3CD1 +ENCODING 15569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4000 +2FC0 +1540 +9540 +5540 +1540 +3540 +D540 +5540 +5FE0 +ENDCHAR +STARTCHAR U_3CD2 +ENCODING 15570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +8280 +4280 +1440 +2920 +C100 +4200 +4440 +07A0 +ENDCHAR +STARTCHAR U_3CD3 +ENCODING 15571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +8FE0 +4200 +1400 +27C0 +CC40 +5440 +4440 +07C0 +ENDCHAR +STARTCHAR U_3CD4 +ENCODING 15572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +0E40 +83E0 +4A40 +1B40 +26C0 +C440 +4A40 +5040 +00C0 +ENDCHAR +STARTCHAR U_3CD5 +ENCODING 15573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0280 +8FE0 +4000 +1000 +27C0 +C000 +4000 +4000 +0FE0 +ENDCHAR +STARTCHAR U_3CD6 +ENCODING 15574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8100 +4200 +0520 +3D40 +2480 +C480 +4540 +4620 +ENDCHAR +STARTCHAR U_3CD7 +ENCODING 15575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2520 +04C0 +8280 +4100 +0280 +2D60 +2100 +C7C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_3CD8 +ENCODING 15576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8100 +4240 +17A0 +2200 +C280 +4280 +44A0 +08E0 +ENDCHAR +STARTCHAR U_3CD9 +ENCODING 15577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +0440 +8FA0 +4000 +17C0 +2440 +C7C0 +4440 +47C0 +0840 +ENDCHAR +STARTCHAR U_3CDA +ENCODING 15578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +8880 +4880 +1AA0 +29A0 +C8C0 +4880 +5160 +2620 +ENDCHAR +STARTCHAR U_3CDB +ENCODING 15579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +0960 +8920 +4D60 +1920 +2FE0 +C100 +4280 +4440 +1820 +ENDCHAR +STARTCHAR U_3CDC +ENCODING 15580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +0480 +8FE0 +5480 +0480 +25C0 +26A0 +C480 +4480 +4480 +ENDCHAR +STARTCHAR U_3CDD +ENCODING 15581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +25E0 +0880 +B880 +4880 +0FE0 +2880 +C880 +4880 +4880 +0BE0 +ENDCHAR +STARTCHAR U_3CDE +ENCODING 15582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0880 +9BE0 +4AA0 +0AA0 +2BE0 +2880 +C880 +4880 +4880 +ENDCHAR +STARTCHAR U_3CDF +ENCODING 15583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1100 +FFE0 +1100 +2480 +D560 +0E00 +3500 +4CC0 +ENDCHAR +STARTCHAR U_3CE0 +ENCODING 15584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +03E0 +9C80 +4480 +1480 +2480 +C540 +4620 +4A00 +11E0 +ENDCHAR +STARTCHAR U_3CE1 +ENCODING 15585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2840 +0440 +81E0 +5C40 +1540 +24C0 +C440 +44C0 +4A00 +11E0 +ENDCHAR +STARTCHAR U_3CE2 +ENCODING 15586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +8FE0 +4100 +1280 +2C60 +C280 +4280 +4480 +0880 +ENDCHAR +STARTCHAR U_3CE3 +ENCODING 15587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07C0 +8120 +4140 +1FE0 +2100 +C640 +4B80 +4220 +01C0 +ENDCHAR +STARTCHAR U_3CE4 +ENCODING 15588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2A80 +0680 +8280 +4FE0 +1280 +22C0 +CBA0 +5280 +4280 +0280 +ENDCHAR +STARTCHAR U_3CE5 +ENCODING 15589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +07C0 +8100 +47C0 +1000 +2280 +CFE0 +4280 +4280 +0480 +ENDCHAR +STARTCHAR U_3CE6 +ENCODING 15590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +1FE0 +8A80 +4A80 +1FA0 +2AA0 +2AC0 +D2C0 +4160 +4620 +ENDCHAR +STARTCHAR U_3CE7 +ENCODING 15591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2A80 +0A80 +8E80 +4A80 +0A80 +2E80 +2A80 +CEA0 +5AA0 +4260 +ENDCHAR +STARTCHAR U_3CE8 +ENCODING 15592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +2A40 +0520 +8000 +4FE0 +1200 +23C0 +C640 +4980 +4100 +0E00 +ENDCHAR +STARTCHAR U_3CE9 +ENCODING 15593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +3E40 +0B40 +8AC0 +4A40 +0BE0 +2E40 +3A40 +C240 +4440 +44C0 +ENDCHAR +STARTCHAR U_3CEA +ENCODING 15594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0300 +8580 +5940 +0120 +2100 +27C0 +C440 +4440 +47C0 +ENDCHAR +STARTCHAR U_3CEB +ENCODING 15595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7640 +1580 +2480 +CC60 +1000 +2380 +2080 +3B80 +2080 +3F80 +ENDCHAR +STARTCHAR U_3CEC +ENCODING 15596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0800 +87E0 +4120 +0140 +2500 +25E0 +C500 +4B00 +50E0 +ENDCHAR +STARTCHAR U_3CED +ENCODING 15597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0440 +87C0 +4100 +1FE0 +2100 +C380 +4540 +5920 +0100 +ENDCHAR +STARTCHAR U_3CEE +ENCODING 15598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3020 +1020 +9FE0 +5000 +1100 +3F20 +D3C0 +5540 +5920 +2300 +ENDCHAR +STARTCHAR U_3CEF +ENCODING 15599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8280 +4FE0 +1100 +2100 +CFE0 +4100 +4100 +0100 +ENDCHAR +STARTCHAR U_3CF0 +ENCODING 15600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0200 +8440 +47E0 +0240 +2240 +AFE0 +4240 +4240 +4440 +ENDCHAR +STARTCHAR U_3CF1 +ENCODING 15601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0AA0 +8CA0 +4AE0 +0AA0 +2AA0 +AAA0 +4CE0 +48A0 +4800 +ENDCHAR +STARTCHAR U_3CF2 +ENCODING 15602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2900 +0100 +A7E0 +5100 +0100 +2980 +2A80 +D240 +5540 +5820 +ENDCHAR +STARTCHAR U_3CF3 +ENCODING 15603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +8100 +47C0 +1440 +27C0 +A280 +4280 +44A0 +48E0 +ENDCHAR +STARTCHAR U_3CF4 +ENCODING 15604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2540 +14A0 +9520 +4640 +1BC0 +2100 +A7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_3CF5 +ENCODING 15605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2700 +0100 +9FE0 +4540 +0920 +2780 +A080 +4FE0 +4100 +4300 +ENDCHAR +STARTCHAR U_3CF6 +ENCODING 15606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +3980 +1680 +8880 +5E80 +0280 +2780 +BC80 +44A0 +44A0 +4CE0 +ENDCHAR +STARTCHAR U_3CF7 +ENCODING 15607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +0AA0 +92A0 +4D20 +0240 +2FE0 +A820 +4FE0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_3CF8 +ENCODING 15608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0FE0 +8480 +4280 +14A0 +2CC0 +2780 +C480 +44A0 +44E0 +ENDCHAR +STARTCHAR U_3CF9 +ENCODING 15609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +25E0 +0440 +9F40 +4440 +0DE0 +2E40 +3540 +C440 +4440 +45E0 +ENDCHAR +STARTCHAR U_3CFA +ENCODING 15610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +1EE0 +8500 +44E0 +0720 +3C40 +25E0 +C440 +4440 +4CC0 +ENDCHAR +STARTCHAR U_3CFB +ENCODING 15611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +27C0 +0280 +8280 +4FE0 +0000 +27C0 +A440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_3CFC +ENCODING 15612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +4A40 +7980 +01A0 +FA60 +0440 +7680 +1580 +E460 +0C00 +ENDCHAR +STARTCHAR U_3CFD +ENCODING 15613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +2500 +05E0 +9E80 +5080 +1080 +3DC0 +A6A0 +44A0 +4480 +5980 +ENDCHAR +STARTCHAR U_3CFE +ENCODING 15614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8100 +47C0 +0100 +2FE0 +A280 +4280 +44A0 +4860 +ENDCHAR +STARTCHAR U_3CFF +ENCODING 15615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0200 +8440 +47C0 +1100 +2FE0 +2380 +C540 +4920 +4100 +ENDCHAR +STARTCHAR U_3D00 +ENCODING 15616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4440 +2EE0 +0000 +87C0 +4100 +17C0 +2080 +C100 +4600 +49E0 +ENDCHAR +STARTCHAR U_3D01 +ENCODING 15617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +1FE0 +8480 +4840 +14A0 +2FC0 +C480 +4FC0 +4480 +0880 +ENDCHAR +STARTCHAR U_3D02 +ENCODING 15618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +1BE0 +8AA0 +4AA0 +0BE0 +2AA0 +CFE0 +5A20 +4220 +0260 +ENDCHAR +STARTCHAR U_3D03 +ENCODING 15619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2800 +0FE0 +8820 +4FE0 +1880 +2FA0 +CAC0 +4AA0 +54A0 +2980 +ENDCHAR +STARTCHAR U_3D04 +ENCODING 15620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0AA0 +8CE0 +4820 +1BA0 +2AA0 +CBA0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_3D05 +ENCODING 15621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7700 +1500 +2480 +C860 +7FC0 +4A40 +71C0 +5F40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_3D06 +ENCODING 15622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +1FE0 +8040 +4FE0 +0920 +27C0 +C540 +4540 +4540 +0100 +ENDCHAR +STARTCHAR U_3D07 +ENCODING 15623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +24A0 +F6C0 +6D80 +76C0 +ADA0 +B6A0 +24A0 +2480 +6D80 +ENDCHAR +STARTCHAR U_3D08 +ENCODING 15624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2400 +07C0 +8480 +4480 +1FE0 +2100 +C920 +4920 +4920 +0FE0 +ENDCHAR +STARTCHAR U_3D09 +ENCODING 15625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2480 +0BC0 +8440 +4280 +1520 +2AE0 +C000 +4FC0 +4000 +1FE0 +ENDCHAR +STARTCHAR U_3D0A +ENCODING 15626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5120 +2AA0 +1FA0 +84A0 +55A0 +15A0 +3FA0 +C4A0 +4820 +4820 +1060 +ENDCHAR +STARTCHAR U_3D0B +ENCODING 15627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2F80 +0280 +9FE0 +4280 +0F80 +2A40 +CB40 +4EC0 +4A40 +1240 +ENDCHAR +STARTCHAR U_3D0C +ENCODING 15628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +4880 +2880 +09C0 +BE80 +5480 +15C0 +2940 +C940 +5540 +22C0 +ENDCHAR +STARTCHAR U_3D0D +ENCODING 15629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2080 +0120 +9BA0 +4540 +0BC0 +2920 +D3A0 +6120 +4500 +0200 +ENDCHAR +STARTCHAR U_3D0E +ENCODING 15630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4100 +2FE0 +0280 +8440 +4BA0 +0000 +27C0 +C100 +4540 +4920 +ENDCHAR +STARTCHAR U_3D0F +ENCODING 15631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8AA0 +44C0 +1000 +27C0 +C100 +47C0 +4100 +0FE0 +ENDCHAR +STARTCHAR U_3D10 +ENCODING 15632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +1C80 +94E0 +5EA0 +16A0 +3FE0 +D420 +5C20 +4020 +40C0 +ENDCHAR +STARTCHAR U_3D11 +ENCODING 15633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0800 +8A40 +4FE0 +1AA0 +2AA0 +CBE0 +4880 +5100 +2200 +ENDCHAR +STARTCHAR U_3D12 +ENCODING 15634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +86C0 +4AA0 +1280 +2480 +CFE0 +4480 +4480 +0880 +ENDCHAR +STARTCHAR U_3D13 +ENCODING 15635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0920 +8FE0 +4920 +1920 +2FE0 +C000 +4A40 +58A0 +2700 +ENDCHAR +STARTCHAR U_3D14 +ENCODING 15636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2780 +0880 +87C0 +4040 +1FE0 +2040 +C7C0 +4000 +4D40 +17A0 +ENDCHAR +STARTCHAR U_3D15 +ENCODING 15637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +81C0 +4E00 +1100 +2FE0 +C100 +4380 +4540 +0920 +ENDCHAR +STARTCHAR U_3D16 +ENCODING 15638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +87C0 +4000 +17C0 +2440 +C7C0 +4100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_3D17 +ENCODING 15639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +8AA0 +4FE0 +1440 +2FE0 +C440 +4280 +4100 +06C0 +ENDCHAR +STARTCHAR U_3D18 +ENCODING 15640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8820 +4FE0 +17C0 +2440 +C7C0 +47C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_3D19 +ENCODING 15641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0FE0 +8100 +4500 +1960 +2920 +C920 +4D60 +4920 +0FE0 +ENDCHAR +STARTCHAR U_3D1A +ENCODING 15642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8100 +43A0 +14A0 +21C0 +C6A0 +41A0 +4680 +0300 +ENDCHAR +STARTCHAR U_3D1B +ENCODING 15643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +2480 +0AE0 +9FA0 +44A0 +15A0 +2EA0 +C4A0 +4440 +46A0 +0920 +ENDCHAR +STARTCHAR U_3D1C +ENCODING 15644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +9FC0 +5000 +1FC0 +9040 +5FC0 +1000 +3FC0 +DB40 +5FC0 +6B40 +2B40 +ENDCHAR +STARTCHAR U_3D1D +ENCODING 15645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +10A0 +FEA0 +3820 +5660 +9980 +3460 +C580 +3F00 +1480 +6460 +ENDCHAR +STARTCHAR U_3D1E +ENCODING 15646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2620 +1940 +8480 +4BE0 +1A20 +2A20 +CBE0 +4A20 +4A20 +0BE0 +ENDCHAR +STARTCHAR U_3D1F +ENCODING 15647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BE0 +8AA0 +4BE0 +1800 +2BC0 +C840 +57E0 +5080 +2180 +ENDCHAR +STARTCHAR U_3D20 +ENCODING 15648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +4080 +2100 +9120 +5DE0 +1560 +35A0 +5D60 +D320 +5120 +1FE0 +ENDCHAR +STARTCHAR U_3D21 +ENCODING 15649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +8FE0 +4380 +1560 +2FC0 +C440 +47C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_3D22 +ENCODING 15650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A480 +5480 +0880 +ABE0 +5AA0 +0AA0 +4BE0 +5880 +A880 +A880 +A880 +ENDCHAR +STARTCHAR U_3D23 +ENCODING 15651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +2BE0 +2880 +83E0 +50A0 +53E0 +2A80 +ABE0 +50A0 +5140 +5620 +ENDCHAR +STARTCHAR U_3D24 +ENCODING 15652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2440 +0400 +9FE0 +4440 +0E40 +2DE0 +3440 +C440 +4440 +47E0 +ENDCHAR +STARTCHAR U_3D25 +ENCODING 15653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +25C0 +2480 +85E0 +5520 +55E0 +1520 +B5E0 +5720 +5D20 +4160 +ENDCHAR +STARTCHAR U_3D26 +ENCODING 15654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +1FE0 +9020 +4780 +1480 +2780 +A000 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_3D27 +ENCODING 15655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +17C0 +8440 +47C0 +0440 +17C0 +2440 +A7C0 +42A0 +4A60 +49C0 +ENDCHAR +STARTCHAR U_3D28 +ENCODING 15656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +2AC0 +2A00 +8FE0 +4A80 +0BE0 +2E80 +AA80 +4AC0 +5320 +5620 +ENDCHAR +STARTCHAR U_3D29 +ENCODING 15657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +2A40 +0520 +87C0 +4440 +1FE0 +2920 +AFE0 +4800 +4820 +47E0 +ENDCHAR +STARTCHAR U_3D2A +ENCODING 15658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0540 +86C0 +4540 +1640 +27C0 +2100 +CFE0 +4540 +5920 +ENDCHAR +STARTCHAR U_3D2B +ENCODING 15659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2AA0 +1FA0 +8AC0 +5EA0 +08A0 +2EA0 +2AA0 +DAE0 +4E80 +4A80 +ENDCHAR +STARTCHAR U_3D2C +ENCODING 15660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2E40 +0A40 +8FE0 +4A40 +0F40 +2AC0 +BE40 +4A40 +5240 +46C0 +ENDCHAR +STARTCHAR U_3D2D +ENCODING 15661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2AA0 +8440 +4FE0 +1440 +27C0 +2440 +C7C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_3D2E +ENCODING 15662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8AA0 +4BE0 +1A20 +2BE0 +2A20 +CBE0 +5220 +5260 +ENDCHAR +STARTCHAR U_3D2F +ENCODING 15663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2A80 +0AE0 +8E80 +4A60 +0A00 +2EE0 +2AA0 +CAE0 +52A0 +56E0 +ENDCHAR +STARTCHAR U_3D30 +ENCODING 15664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3280 +1EE0 +8080 +5EA0 +12E0 +3E80 +32E0 +DE80 +52A0 +56E0 +ENDCHAR +STARTCHAR U_3D31 +ENCODING 15665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +14A0 +8840 +5120 +5FE0 +2920 +2540 +C280 +4440 +5820 +ENDCHAR +STARTCHAR U_3D32 +ENCODING 15666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +3D00 +17E0 +9520 +57C0 +1500 +34C0 +3400 +D5C0 +5540 +6A60 +ENDCHAR +STARTCHAR U_3D33 +ENCODING 15667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2920 +0BE0 +9D40 +4960 +0940 +2960 +2940 +CD60 +52C0 +4D60 +ENDCHAR +STARTCHAR U_3D34 +ENCODING 15668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2AA0 +0CC0 +8940 +4A20 +1FE0 +2880 +4AA0 +CD40 +4A20 +4FE0 +ENDCHAR +STARTCHAR U_3D35 +ENCODING 15669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2540 +14A0 +9520 +4640 +1BC0 +2000 +2FE0 +CAA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_3D36 +ENCODING 15670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0A20 +8480 +4FE0 +1480 +27C0 +A480 +47C0 +4480 +47E0 +ENDCHAR +STARTCHAR U_3D37 +ENCODING 15671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +3E80 +1480 +9FE0 +54A0 +1C80 +3540 +3540 +DD40 +4540 +4660 +ENDCHAR +STARTCHAR U_3D38 +ENCODING 15672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +1920 +2920 +2AA0 +CC60 +4820 +4860 +ENDCHAR +STARTCHAR U_3D39 +ENCODING 15673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +22A0 +09C0 +8480 +43E0 +1C80 +25C0 +26A0 +C480 +4680 +59E0 +ENDCHAR +STARTCHAR U_3D3A +ENCODING 15674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2900 +0FE0 +A100 +5540 +0540 +2BA0 +A900 +5280 +5440 +5820 +ENDCHAR +STARTCHAR U_3D3B +ENCODING 15675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +3E40 +0040 +9FE0 +5240 +1340 +3EC0 +3240 +CC40 +5E40 +40C0 +ENDCHAR +STARTCHAR U_3D3C +ENCODING 15676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +1020 +87C0 +4900 +1BC0 +2A40 +2BC0 +CA40 +4A40 +4BC0 +ENDCHAR +STARTCHAR U_3D3D +ENCODING 15677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2F40 +0580 +9FE0 +4540 +1920 +2200 +2540 +CC20 +5440 +53C0 +ENDCHAR +STARTCHAR U_3D3E +ENCODING 15678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2E80 +0480 +9FE0 +5120 +0EA0 +24A0 +2740 +DC40 +44A0 +4D20 +ENDCHAR +STARTCHAR U_3D3F +ENCODING 15679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +3D00 +0BC0 +8A40 +4BC0 +0A40 +2BC0 +2A40 +CBC0 +5A40 +4420 +ENDCHAR +STARTCHAR U_3D40 +ENCODING 15680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +00E0 +9F00 +48E0 +0F40 +2A40 +2BE0 +CA40 +52C0 +5720 +ENDCHAR +STARTCHAR U_3D41 +ENCODING 15681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +2480 +8100 +4FE0 +0440 +2FE0 +2540 +C540 +4540 +4960 +ENDCHAR +STARTCHAR U_3D42 +ENCODING 15682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2A40 +8A40 +4FE0 +0A40 +2A40 +2BC0 +C800 +5540 +5AA0 +ENDCHAR +STARTCHAR U_3D43 +ENCODING 15683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2880 +0BE0 +BE20 +6A80 +2AA0 +3EC0 +2880 +CA80 +4EA0 +7AE0 +ENDCHAR +STARTCHAR U_3D44 +ENCODING 15684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +3FE0 +8A80 +4E80 +00A0 +2EA0 +A440 +5F40 +4AE0 +5320 +ENDCHAR +STARTCHAR U_3D45 +ENCODING 15685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2640 +1920 +87C0 +4080 +17C0 +2440 +27C0 +C440 +47C0 +4820 +ENDCHAR +STARTCHAR U_3D46 +ENCODING 15686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +3D40 +15E0 +9640 +5440 +1FE0 +3400 +35E0 +D520 +5D20 +41E0 +ENDCHAR +STARTCHAR U_3D47 +ENCODING 15687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46A0 +2CA0 +04A0 +8FE0 +44A0 +04A0 +2EE0 +2AA0 +CAA0 +4EA0 +4AE0 +ENDCHAR +STARTCHAR U_3D48 +ENCODING 15688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +2A40 +0240 +AFE0 +5540 +0540 +2DE0 +AAA0 +52A0 +55A0 +58E0 +ENDCHAR +STARTCHAR U_3D49 +ENCODING 15689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +2A80 +0280 +A7E0 +5280 +06C0 +2BC0 +2AA0 +D280 +5280 +5280 +ENDCHAR +STARTCHAR U_3D4A +ENCODING 15690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8440 +5FE0 +0A00 +2FE0 +2AA0 +CEA0 +5A40 +43A0 +ENDCHAR +STARTCHAR U_3D4B +ENCODING 15691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +8440 +47C0 +5440 +27C0 +2440 +C7C0 +4440 +4820 +ENDCHAR +STARTCHAR U_3D4C +ENCODING 15692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2A40 +13E0 +8640 +5AE0 +0AA0 +2AE0 +AAA0 +4AE0 +4AA0 +4CE0 +ENDCHAR +STARTCHAR U_3D4D +ENCODING 15693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +8AA0 +4EE0 +1920 +2920 +2A60 +CEA0 +49A0 +4860 +ENDCHAR +STARTCHAR U_3D4E +ENCODING 15694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +8AA0 +4EE0 +4BA0 +2AA0 +2BA0 +CAA0 +4BA0 +4CE0 +ENDCHAR +STARTCHAR U_3D4F +ENCODING 15695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +2480 +8100 +4FE0 +1440 +2AA0 +2100 +CFE0 +4100 +4100 +ENDCHAR +STARTCHAR U_3D50 +ENCODING 15696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3A00 +1480 +9FE0 +5560 +1540 +3F40 +3440 +D440 +54A0 +6920 +ENDCHAR +STARTCHAR U_3D51 +ENCODING 15697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +3EE0 +0AA0 +8AE0 +5200 +07C0 +2440 +A7C0 +4440 +47C0 +5820 +ENDCHAR +STARTCHAR U_3D52 +ENCODING 15698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +22A0 +8FE0 +4A80 +4FE0 +24A0 +2FC0 +C540 +47C0 +5820 +ENDCHAR +STARTCHAR U_3D53 +ENCODING 15699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1020 +8780 +4580 +0680 +3FE0 +A200 +4BC0 +4E00 +51E0 +ENDCHAR +STARTCHAR U_3D54 +ENCODING 15700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8D60 +47C0 +0140 +2FE0 +2640 +DBC0 +4240 +43C0 +ENDCHAR +STARTCHAR U_3D55 +ENCODING 15701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FC0 +0900 +9240 +5FE0 +0300 +2480 +3A60 +CB40 +52A0 +4600 +ENDCHAR +STARTCHAR U_3D56 +ENCODING 15702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +3EE0 +0AA0 +92E0 +4480 +0FC0 +2440 +3FE0 +C540 +5920 +4300 +ENDCHAR +STARTCHAR U_3D57 +ENCODING 15703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +67E0 +1480 +07C0 +1480 +E7E0 +4AA0 +0AE0 +0440 +F680 +2580 +CC60 +ENDCHAR +STARTCHAR U_3D58 +ENCODING 15704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +EF20 +73C0 +AD40 +6320 +0000 +2120 +EFC0 +7340 +AD20 +6300 +ENDCHAR +STARTCHAR U_3D59 +ENCODING 15705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4440 +17C0 +2280 +2FE0 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_3D5A +ENCODING 15706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2AA0 +0380 +8C60 +4380 +0440 +2BA0 +A100 +47C0 +4540 +4FE0 +ENDCHAR +STARTCHAR U_3D5B +ENCODING 15707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0100 +87C0 +4100 +1FE0 +2540 +2FE0 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_3D5C +ENCODING 15708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2FE0 +0200 +A7E0 +5420 +0560 +25E0 +2CA0 +D7E0 +54A0 +5460 +ENDCHAR +STARTCHAR U_3D5D +ENCODING 15709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +0520 +8CC0 +5640 +1420 +2FE0 +AAA0 +4EE0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_3D5E +ENCODING 15710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2480 +1EA0 +85C0 +4E80 +1540 +2620 +A140 +4520 +5440 +53C0 +ENDCHAR +STARTCHAR U_3D5F +ENCODING 15711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +7580 +5FE0 +10A0 +AEA0 +61A0 +2E40 +6A40 +AA40 +B3A0 +A120 +ENDCHAR +STARTCHAR U_3D60 +ENCODING 15712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +14A0 +8840 +4FC0 +1840 +2FC0 +CD40 +57C0 +5920 +2FE0 +ENDCHAR +STARTCHAR U_3D61 +ENCODING 15713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2200 +1FE0 +9AA0 +4780 +0A40 +27C0 +AD40 +5740 +44A0 +43E0 +ENDCHAR +STARTCHAR U_3D62 +ENCODING 15714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0FE0 +9560 +4380 +0540 +27C0 +2540 +C7C0 +4540 +47C0 +ENDCHAR +STARTCHAR U_3D63 +ENCODING 15715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +3280 +1E80 +93E0 +5EA0 +1080 +3E80 +2A80 +F680 +5B40 +4420 +ENDCHAR +STARTCHAR U_3D64 +ENCODING 15716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0660 +8AA0 +4100 +1FE0 +2540 +2BA0 +C100 +4280 +4C60 +ENDCHAR +STARTCHAR U_3D65 +ENCODING 15717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +14A0 +86C0 +5520 +1640 +3BC0 +2000 +CFE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_3D66 +ENCODING 15718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +37E0 +0940 +8BE0 +4520 +1DE0 +2920 +A9E0 +4920 +4E00 +51E0 +ENDCHAR +STARTCHAR U_3D67 +ENCODING 15719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +87C0 +4540 +0640 +27E0 +2CA0 +D560 +47A0 +40C0 +ENDCHAR +STARTCHAR U_3D68 +ENCODING 15720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4FE0 +7A40 +47E0 +7880 +CFE0 +7880 +04C0 +7700 +1580 +EC60 +ENDCHAR +STARTCHAR U_3D69 +ENCODING 15721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +8A80 +5FE0 +0A80 +2FC0 +2100 +DFE0 +4540 +5920 +ENDCHAR +STARTCHAR U_3D6A +ENCODING 15722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0100 +87C0 +4100 +0FE0 +2100 +2DE0 +C2A0 +4CC0 +4320 +ENDCHAR +STARTCHAR U_3D6B +ENCODING 15723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2080 +0FE0 +8140 +4FE0 +0240 +26C0 +27C0 +C540 +4640 +47C0 +ENDCHAR +STARTCHAR U_3D6C +ENCODING 15724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3540 +1560 +9DA0 +56A0 +5520 +1EE0 +3400 +D5E0 +56A0 +6BE0 +ENDCHAR +STARTCHAR U_3D6D +ENCODING 15725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0140 +8FE0 +4640 +0BC0 +2240 +23C0 +C040 +4AA0 +4AA0 +ENDCHAR +STARTCHAR U_3D6E +ENCODING 15726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0480 +8FC0 +54A0 +0780 +2100 +2FC0 +C940 +5FE0 +4100 +ENDCHAR +STARTCHAR U_3D6F +ENCODING 15727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8A40 +4F40 +0940 +2F40 +2940 +CFC0 +5AA0 +6920 +ENDCHAR +STARTCHAR U_3D70 +ENCODING 15728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4CC0 +3440 +1FC0 +9440 +5FC0 +1140 +1540 +3FE0 +C880 +5040 +6020 +ENDCHAR +STARTCHAR U_3D71 +ENCODING 15729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +2A40 +1F40 +95E0 +5F40 +0140 +2EC0 +2040 +DF40 +4E40 +55C0 +ENDCHAR +STARTCHAR U_3D72 +ENCODING 15730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +3FE0 +0AA0 +9FE0 +4AA0 +1FE0 +2840 +2FE0 +D540 +47E0 +5840 +ENDCHAR +STARTCHAR U_3D73 +ENCODING 15731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2B60 +86C0 +4B40 +5DE0 +2680 +A100 +4640 +4180 +4E00 +ENDCHAR +STARTCHAR U_3D74 +ENCODING 15732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +2FE0 +8880 +7F80 +4AA0 +3FA0 +2940 +AF40 +5AE0 +5720 +ENDCHAR +STARTCHAR U_3D75 +ENCODING 15733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +2AE0 +0EA0 +8A40 +5EA0 +03A0 +2D00 +A360 +4D80 +4340 +4D20 +ENDCHAR +STARTCHAR U_3D76 +ENCODING 15734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +2EA0 +0480 +9FE0 +4A80 +1F80 +2AA0 +AFA0 +4AC0 +4FE0 +4320 +ENDCHAR +STARTCHAR U_3D77 +ENCODING 15735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2440 +F3E0 +9120 +68C0 +F5E0 +2240 +F3E0 +2C40 +4440 +8440 +ENDCHAR +STARTCHAR U_3D78 +ENCODING 15736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +9BA0 +4000 +07C0 +2540 +AFE0 +4AA0 +4FE0 +4AA0 +ENDCHAR +STARTCHAR U_3D79 +ENCODING 15737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2BE0 +0940 +8BE0 +6A60 +2AA0 +2BE0 +BE80 +63E0 +4140 +4620 +ENDCHAR +STARTCHAR U_3D7A +ENCODING 15738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +3540 +2200 +8FC0 +4940 +4FC0 +2940 +AFC0 +4500 +5FE0 +4100 +ENDCHAR +STARTCHAR U_3D7B +ENCODING 15739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +B980 +6AE0 +2AA0 +3BE0 +AAA0 +6BE0 +3880 +6BE0 +A920 +A8C0 +DF20 +ENDCHAR +STARTCHAR U_3D7C +ENCODING 15740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0440 +86C0 +4440 +07C0 +2400 +2FE0 +D2A0 +4AA0 +4840 +ENDCHAR +STARTCHAR U_3D7D +ENCODING 15741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +07C0 +8540 +47C0 +0000 +2FE0 +2AA0 +CFE0 +4AA0 +4FE0 +ENDCHAR +STARTCHAR U_3D7E +ENCODING 15742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3EA0 +04E0 +8EA0 +44E0 +1FA0 +2AA0 +2EE0 +CA40 +4EC0 +4B60 +ENDCHAR +STARTCHAR U_3D7F +ENCODING 15743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0540 +8640 +47C0 +0440 +2EE0 +2AA0 +CEE0 +4AA0 +4EE0 +ENDCHAR +STARTCHAR U_3D80 +ENCODING 15744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +35A0 +1760 +95A0 +5E60 +1480 +1F40 +34A0 +D740 +5480 +6F00 +ENDCHAR +STARTCHAR U_3D81 +ENCODING 15745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46E0 +3880 +2BE0 +9D40 +45E0 +1F40 +2560 +B500 +4DE0 +46A0 +4D20 +ENDCHAR +STARTCHAR U_3D82 +ENCODING 15746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +2FE0 +0140 +A7E0 +5080 +03E0 +2AA0 +ABE0 +52A0 +53E0 +5420 +ENDCHAR +STARTCHAR U_3D83 +ENCODING 15747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +2C00 +07E0 +AD40 +5540 +0FE0 +2540 +AFE0 +5000 +56A0 +5AA0 +ENDCHAR +STARTCHAR U_3D84 +ENCODING 15748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +3520 +1DE0 +9520 +5FE0 +12A0 +1DA0 +36A0 +D4A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_3D85 +ENCODING 15749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4CC0 +2AC0 +0D40 +8AC0 +5FE0 +1020 +2780 +2100 +CFC0 +4100 +4300 +ENDCHAR +STARTCHAR U_3D86 +ENCODING 15750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3DE0 +00A0 +9CC0 +43E0 +1C80 +21E0 +3F20 +D5E0 +5520 +5DE0 +ENDCHAR +STARTCHAR U_3D87 +ENCODING 15751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2BE0 +0940 +BFE0 +4880 +1BE0 +1EA0 +2BE0 +CAA0 +4BE0 +4C20 +ENDCHAR +STARTCHAR U_3D88 +ENCODING 15752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2BA0 +06C0 +8540 +4FE0 +0920 +27C0 +2540 +C7C0 +4120 +4FE0 +ENDCHAR +STARTCHAR U_3D89 +ENCODING 15753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +3BC0 +1540 +8BC0 +5D40 +0BC0 +3F00 +29E0 +DE20 +4DA0 +5240 +ENDCHAR +STARTCHAR U_3D8A +ENCODING 15754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +3E40 +14E0 +94A0 +5EE0 +12A0 +1EE0 +34A0 +D4E0 +5EA0 +4120 +ENDCHAR +STARTCHAR U_3D8B +ENCODING 15755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +3B40 +0AC0 +BFE0 +4A40 +36E0 +0D40 +B540 +4DE0 +5480 +4860 +ENDCHAR +STARTCHAR U_3D8C +ENCODING 15756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +3680 +17E0 +9D40 +56A0 +1FE0 +1540 +3560 +DF60 +4540 +4640 +ENDCHAR +STARTCHAR U_3D8D +ENCODING 15757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +2EA0 +0A40 +9FE0 +5540 +5FE0 +1540 +3FE0 +C040 +5540 +5540 +ENDCHAR +STARTCHAR U_3D8E +ENCODING 15758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +32A0 +0BE0 +8800 +47E0 +3A20 +0BE0 +2AA0 +CF40 +5A20 +67E0 +ENDCHAR +STARTCHAR U_3D8F +ENCODING 15759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +36A0 +17E0 +9880 +55E0 +1420 +17E0 +3820 +D3E0 +56A0 +59E0 +ENDCHAR +STARTCHAR U_3D90 +ENCODING 15760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +9FE0 +5540 +15E0 +9F40 +55E0 +1540 +55E0 +9200 +AD40 +2BA0 +ENDCHAR +STARTCHAR U_3D91 +ENCODING 15761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2A80 +31E0 +8F20 +4040 +5F40 +1540 +BF40 +4A40 +4AA0 +5520 +ENDCHAR +STARTCHAR U_3D92 +ENCODING 15762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +32A0 +1EE0 +92A0 +5FE0 +1520 +37A0 +B520 +57A0 +52A0 +5560 +ENDCHAR +STARTCHAR U_3D93 +ENCODING 15763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +04A0 +AFE0 +6A80 +3FA0 +0960 +BF40 +6A40 +57A0 +5120 +ENDCHAR +STARTCHAR U_3D94 +ENCODING 15764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3540 +1FC0 +8000 +7FE0 +2AA0 +3FE0 +A200 +5FE0 +4480 +7860 +ENDCHAR +STARTCHAR U_3D95 +ENCODING 15765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +1540 +9EE0 +52A0 +1FE0 +34A0 +B7A0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_3D96 +ENCODING 15766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +29E0 +1320 +B4C0 +5520 +17E0 +12A0 +B3E0 +5080 +57E0 +52A0 +ENDCHAR +STARTCHAR U_3D97 +ENCODING 15767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +A7E0 +7D40 +57E0 +7DC0 +0AA0 +3F80 +2480 +7FC0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_3D98 +ENCODING 15768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +1540 +8FE0 +4280 +0FE0 +2AA0 +AFE0 +4540 +4FE0 +4100 +ENDCHAR +STARTCHAR U_3D99 +ENCODING 15769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA00 +5B40 +0AC0 +1FE0 +A440 +5BE0 +0640 +BBE0 +5600 +5B00 +54E0 +ENDCHAR +STARTCHAR U_3D9A +ENCODING 15770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2500 +1FE0 +9520 +5FE0 +0AA0 +3FE0 +AAA0 +55E0 +5EA0 +4560 +ENDCHAR +STARTCHAR U_3D9B +ENCODING 15771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +4BE0 +3C00 +9360 +55A0 +1F60 +14A0 +B7E0 +5540 +5A20 +6420 +ENDCHAR +STARTCHAR U_3D9C +ENCODING 15772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFA0 +64A0 +3FA0 +B2A0 +7FA0 +2AA0 +2AA0 +BFA0 +6AA0 +4A20 +5460 +ENDCHAR +STARTCHAR U_3D9D +ENCODING 15773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2FE0 +0A80 +AFE0 +5A80 +0BE0 +0A80 +AFE0 +5520 +5460 +5BC0 +ENDCHAR +STARTCHAR U_3D9E +ENCODING 15774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +1FE0 +8AA0 +4EE0 +4480 +2FC0 +A480 +5FE0 +4C80 +5660 +ENDCHAR +STARTCHAR U_3D9F +ENCODING 15775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +0FE0 +8AA0 +4FE0 +1AA0 +2FE0 +A280 +47C0 +4920 +4300 +ENDCHAR +STARTCHAR U_3DA0 +ENCODING 15776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3560 +1FE0 +9440 +5EE0 +1440 +3FE0 +D6A0 +6BE0 +4240 +0C40 +ENDCHAR +STARTCHAR U_3DA1 +ENCODING 15777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2480 +2480 +2D80 +3680 +2480 +2A80 +51A0 +4060 +8020 +ENDCHAR +STARTCHAR U_3DA2 +ENCODING 15778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +0A00 +1100 +E8E0 +0800 +7F00 +0900 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_3DA3 +ENCODING 15779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +0400 +FFE0 +0400 +0400 +2480 +1500 +0A00 +1180 +E060 +ENDCHAR +STARTCHAR U_3DA4 +ENCODING 15780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +A9E0 +AA20 +B320 +24C0 +2040 +5080 +4900 +8200 +0C00 +ENDCHAR +STARTCHAR U_3DA5 +ENCODING 15781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +A900 +B100 +2FE0 +2100 +5100 +4900 +8100 +0100 +ENDCHAR +STARTCHAR U_3DA6 +ENCODING 15782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +A980 +A880 +B7E0 +20A0 +2080 +3080 +4880 +8080 +0180 +ENDCHAR +STARTCHAR U_3DA7 +ENCODING 15783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +AD20 +B520 +A520 +26A0 +5460 +4C20 +8420 +0460 +ENDCHAR +STARTCHAR U_3DA8 +ENCODING 15784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7FC0 +0400 +0D00 +1480 +E460 +0400 +0400 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_3DA9 +ENCODING 15785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +AD20 +B100 +2100 +2100 +5280 +4A80 +84A0 +18E0 +ENDCHAR +STARTCHAR U_3DAA +ENCODING 15786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0C00 +3580 +C460 +0400 +0400 +2480 +2500 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DAB +ENCODING 15787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4480 +2F00 +30C0 +C020 +2480 +2480 +2B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DAC +ENCODING 15788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +A900 +A900 +37C0 +2100 +5380 +4D40 +8920 +0100 +ENDCHAR +STARTCHAR U_3DAD +ENCODING 15789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +2480 +A9E0 +BAA0 +26A0 +28A0 +5AA0 +4EA0 +8120 +0660 +ENDCHAR +STARTCHAR U_3DAE +ENCODING 15790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4440 +4A40 +5140 +0400 +2440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DAF +ENCODING 15791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2600 +28E0 +2AA0 +AAA0 +BAA0 +AAA0 +2AA0 +2EE0 +5A80 +8A80 +0480 +ENDCHAR +STARTCHAR U_3DB0 +ENCODING 15792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1240 +1240 +57E0 +5A40 +9240 +13C0 +2A40 +2A40 +4240 +83C0 +ENDCHAR +STARTCHAR U_3DB1 +ENCODING 15793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2900 +2900 +B7E0 +A100 +2100 +2380 +3540 +4BA0 +4100 +8100 +ENDCHAR +STARTCHAR U_3DB2 +ENCODING 15794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +2D20 +B7E0 +A520 +A7E0 +2520 +2520 +5520 +8D20 +8460 +ENDCHAR +STARTCHAR U_3DB3 +ENCODING 15795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0480 +3F80 +0400 +FFE0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DB4 +ENCODING 15796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +21E0 +AF20 +A8C0 +B180 +2600 +21E0 +5320 +48C0 +8180 +0E00 +ENDCHAR +STARTCHAR U_3DB5 +ENCODING 15797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +2700 +6100 +A100 +2FE0 +2100 +2100 +27C0 +0000 +4920 +8920 +ENDCHAR +STARTCHAR U_3DB6 +ENCODING 15798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +AA20 +B200 +A520 +2D40 +2480 +5480 +8D40 +0620 +ENDCHAR +STARTCHAR U_3DB7 +ENCODING 15799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +A820 +B7A0 +A4A0 +27A0 +54A0 +4FA0 +8020 +00C0 +ENDCHAR +STARTCHAR U_3DB8 +ENCODING 15800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2240 +AA40 +B240 +24C0 +2880 +5FE0 +4AA0 +8AA0 +1760 +ENDCHAR +STARTCHAR U_3DB9 +ENCODING 15801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +6900 +BFE0 +2100 +2F20 +23C0 +5540 +9920 +0300 +ENDCHAR +STARTCHAR U_3DBA +ENCODING 15802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +AFE0 +AA40 +A420 +2BE0 +5240 +4A40 +83C0 +0240 +ENDCHAR +STARTCHAR U_3DBB +ENCODING 15803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +3100 +1F00 +E4E0 +3F80 +0400 +1F00 +0400 +7FC0 +9520 +9120 +ENDCHAR +STARTCHAR U_3DBC +ENCODING 15804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +AFC0 +B400 +A7C0 +2900 +2100 +5FE0 +4A80 +8440 +0820 +ENDCHAR +STARTCHAR U_3DBD +ENCODING 15805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AC40 +B7C0 +A100 +2FE0 +2920 +5AA0 +4C60 +8820 +0860 +ENDCHAR +STARTCHAR U_3DBE +ENCODING 15806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +FFE0 +2480 +1500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DBF +ENCODING 15807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +AFE0 +B820 +A7C0 +2080 +57E0 +4900 +8100 +0300 +ENDCHAR +STARTCHAR U_3DC0 +ENCODING 15808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5540 +3B80 +2A80 +4440 +7F80 +0880 +FF80 +0880 +08A0 +0860 +ENDCHAR +STARTCHAR U_3DC1 +ENCODING 15809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +2180 +AFE0 +B520 +A7E0 +2520 +57E0 +4D20 +8520 +0560 +ENDCHAR +STARTCHAR U_3DC2 +ENCODING 15810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +A3E0 +F920 +8940 +F880 +A140 +FE20 +2480 +1500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DC3 +ENCODING 15811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +1B00 +E0E0 +1F80 +1000 +1F80 +1000 +FFE0 +1280 +19C0 +ENDCHAR +STARTCHAR U_3DC4 +ENCODING 15812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +A7C0 +AD40 +B7C0 +2100 +2FE0 +5380 +4D40 +8920 +0100 +ENDCHAR +STARTCHAR U_3DC5 +ENCODING 15813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +5BC0 +6A40 +5980 +6980 +FE60 +0800 +2480 +1B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DC6 +ENCODING 15814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +AFC0 +B400 +A7E0 +2420 +57E0 +4100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DC7 +ENCODING 15815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7A00 +CFE0 +3200 +2280 +E2A0 +3BC0 +CA80 +3480 +2540 +CA20 +ENDCHAR +STARTCHAR U_3DC8 +ENCODING 15816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +A920 +B7C0 +A540 +27C0 +5540 +4FC0 +8120 +00E0 +ENDCHAR +STARTCHAR U_3DC9 +ENCODING 15817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7C40 +43E0 +5C40 +4140 +7EC0 +6A40 +5C40 +9440 +E2C0 +ENDCHAR +STARTCHAR U_3DCA +ENCODING 15818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FFE0 +1100 +3B80 +5540 +9920 +1100 +1240 +8920 +8920 +ENDCHAR +STARTCHAR U_3DCB +ENCODING 15819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +21C0 +A940 +AA20 +B480 +2480 +52A0 +49C0 +8240 +0C20 +ENDCHAR +STARTCHAR U_3DCC +ENCODING 15820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +ABC0 +B040 +2FE0 +2920 +27C0 +5540 +4D40 +85C0 +0100 +ENDCHAR +STARTCHAR U_3DCD +ENCODING 15821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +AFE0 +B000 +AFE0 +2AA0 +2FE0 +5AA0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_3DCE +ENCODING 15822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +AC40 +B7C0 +A200 +27E0 +5920 +4AA0 +87E0 +0040 +ENDCHAR +STARTCHAR U_3DCF +ENCODING 15823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +13C0 +FC80 +37E0 +5880 +9480 +0000 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DD0 +ENCODING 15824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2C60 +2820 +BEE0 +6820 +2FE0 +2100 +2FE0 +5100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3DD1 +ENCODING 15825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4A80 +3F80 +CA60 +7FC0 +4A40 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3DD2 +ENCODING 15826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +AD40 +B7C0 +A100 +2FE0 +5960 +49E0 +8F20 +0860 +ENDCHAR +STARTCHAR U_3DD3 +ENCODING 15827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +AAA0 +AFA0 +B2E0 +2540 +5120 +4AA0 +8A20 +09E0 +ENDCHAR +STARTCHAR U_3DD4 +ENCODING 15828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +AD20 +AAC0 +B000 +25E0 +2520 +55E0 +4D20 +8520 +05E0 +ENDCHAR +STARTCHAR U_3DD5 +ENCODING 15829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2880 +FEA0 +29C0 +FE80 +AA80 +CE80 +8280 +FF40 +8340 +FE20 +ENDCHAR +STARTCHAR U_3DD6 +ENCODING 15830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8920 +F920 +8A20 +FC40 +2000 +ABE0 +B220 +5220 +4BE0 +8220 +ENDCHAR +STARTCHAR U_3DD7 +ENCODING 15831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5D20 +51E0 +5D00 +5520 +9DE0 +2440 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DD8 +ENCODING 15832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2000 +AFE0 +B420 +A7E0 +2100 +57E0 +4B80 +8540 +0920 +ENDCHAR +STARTCHAR U_3DD9 +ENCODING 15833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +B000 +AE20 +2AA0 +2EA0 +5AA0 +4EA0 +8A20 +0A60 +ENDCHAR +STARTCHAR U_3DDA +ENCODING 15834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2000 +ABC0 +B240 +A7E0 +2420 +53C0 +4880 +8080 +0180 +ENDCHAR +STARTCHAR U_3DDB +ENCODING 15835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +27C0 +6100 +AFE0 +2380 +2540 +2920 +0000 +4A40 +8920 +ENDCHAR +STARTCHAR U_3DDC +ENCODING 15836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AAC0 +B2A0 +A580 +2100 +57E0 +4980 +8240 +0C20 +ENDCHAR +STARTCHAR U_3DDD +ENCODING 15837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +B440 +6920 +2140 +2120 +2FE0 +5280 +4440 +9820 +ENDCHAR +STARTCHAR U_3DDE +ENCODING 15838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +25C0 +AD40 +B5C0 +A540 +25C0 +5440 +4FE0 +8480 +0980 +ENDCHAR +STARTCHAR U_3DDF +ENCODING 15839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2900 +25E0 +B120 +6DE0 +2500 +29E0 +2520 +25E0 +5600 +89E0 +ENDCHAR +STARTCHAR U_3DE0 +ENCODING 15840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1F00 +1100 +64C0 +1F00 +F0E0 +2080 +3BC0 +EA80 +13E0 +E080 +ENDCHAR +STARTCHAR U_3DE1 +ENCODING 15841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F7C0 +9440 +F7C0 +9400 +F7E0 +4440 +2E80 +3180 +C060 +ENDCHAR +STARTCHAR U_3DE2 +ENCODING 15842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +0800 +3F80 +1000 +FFE0 +4400 +BFC0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DE3 +ENCODING 15843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +A100 +B7C0 +A100 +2FE0 +2500 +5FC0 +5100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DE4 +ENCODING 15844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FC20 +8BC0 +7240 +2240 +A980 +7180 +5240 +8C20 +ENDCHAR +STARTCHAR U_3DE5 +ENCODING 15845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +A840 +7080 +50A0 +8FC0 +0180 +AAC0 +AAA0 +74A0 +5880 +8FE0 +ENDCHAR +STARTCHAR U_3DE6 +ENCODING 15846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +4CA0 +7AA0 +4AC0 +7880 +4940 +FA20 +0C20 +5240 +4920 +C920 +ENDCHAR +STARTCHAR U_3DE7 +ENCODING 15847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +ABE0 +BA20 +ABE0 +2A20 +2BE0 +5880 +4AC0 +8CA0 +1180 +ENDCHAR +STARTCHAR U_3DE8 +ENCODING 15848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +2440 +A380 +BD60 +A7C0 +2100 +27C0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_3DE9 +ENCODING 15849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +5420 +5EE0 +5280 +5E80 +54A0 +9EE0 +4440 +2E80 +3180 +C060 +ENDCHAR +STARTCHAR U_3DEA +ENCODING 15850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +AC80 +B7E0 +A480 +27E0 +2480 +27C0 +5260 +4A20 +8C60 +ENDCHAR +STARTCHAR U_3DEB +ENCODING 15851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2460 +FBC0 +AA40 +F980 +8660 +2480 +1500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_3DEC +ENCODING 15852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +AFC0 +B4C0 +A540 +27C0 +2100 +5FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_3DED +ENCODING 15853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2C40 +F380 +2D60 +27C0 +F100 +0FE0 +2480 +1B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DEE +ENCODING 15854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +AFE0 +BAA0 +AFE0 +2AA0 +2FE0 +5540 +4E40 +87C0 +ENDCHAR +STARTCHAR U_3DEF +ENCODING 15855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +57E0 +8A00 +27E0 +2540 +FBA0 +2100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_3DF0 +ENCODING 15856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAC0 +B940 +AFC0 +2100 +2FE0 +2A20 +5AA0 +4FA0 +88A0 +ENDCHAR +STARTCHAR U_3DF1 +ENCODING 15857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4880 +FBE0 +4880 +7FE0 +4900 +7A20 +4BE0 +0000 +4920 +8920 +ENDCHAR +STARTCHAR U_3DF2 +ENCODING 15858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2280 +AF80 +B2E0 +AFA0 +2AA0 +2FA0 +2AA0 +5FA0 +42A0 +8F60 +ENDCHAR +STARTCHAR U_3DF3 +ENCODING 15859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A80 +57E0 +7C80 +57C0 +5480 +57E0 +5240 +4A80 +8500 +38E0 +ENDCHAR +STARTCHAR U_3DF4 +ENCODING 15860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4CC0 +7B80 +4880 +7FE0 +5DC0 +6AA0 +4200 +9240 +8D80 +38E0 +ENDCHAR +STARTCHAR U_3DF5 +ENCODING 15861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +AD40 +B7C0 +A100 +27C0 +5100 +4FE0 +8AA0 +0AA0 +ENDCHAR +STARTCHAR U_3DF6 +ENCODING 15862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2FE0 +6480 +BFE0 +2540 +2FC0 +3540 +27C0 +2540 +4920 +8920 +ENDCHAR +STARTCHAR U_3DF7 +ENCODING 15863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +A880 +BEE0 +A240 +2FE0 +3240 +4FE0 +8240 +0C20 +ENDCHAR +STARTCHAR U_3DF8 +ENCODING 15864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2640 +AFE0 +B540 +AFE0 +2540 +5FE0 +5100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DF9 +ENCODING 15865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +A9C0 +B100 +A7C0 +2440 +57C0 +5440 +8FE0 +0100 +ENDCHAR +STARTCHAR U_3DFA +ENCODING 15866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +99E0 +8B40 +DD40 +8880 +FB60 +0400 +4440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DFB +ENCODING 15867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +AD40 +B540 +AFE0 +2540 +5FE0 +5000 +8AA0 +0AA0 +ENDCHAR +STARTCHAR U_3DFC +ENCODING 15868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +2E80 +EAE0 +2A80 +EEE0 +4440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3DFD +ENCODING 15869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2100 +AFC0 +B100 +AFE0 +2540 +5FE0 +5440 +87C0 +0440 +ENDCHAR +STARTCHAR U_3DFE +ENCODING 15870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +27E0 +AD40 +B580 +A760 +2580 +56A0 +4DC0 +8AA0 +0980 +ENDCHAR +STARTCHAR U_3DFF +ENCODING 15871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AC40 +BBA0 +A000 +2EE0 +2AA0 +5EE0 +5440 +8AC0 +1120 +ENDCHAR +STARTCHAR U_3E00 +ENCODING 15872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFE0 +BAA0 +ABA0 +2860 +5100 +4FC0 +8100 +0FE0 +ENDCHAR +STARTCHAR U_3E01 +ENCODING 15873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +2280 +2FE0 +AA80 +B7E0 +A100 +27C0 +5100 +4FE0 +8540 +0920 +ENDCHAR +STARTCHAR U_3E02 +ENCODING 15874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0240 +ED80 +2360 +3D00 +C7E0 +4440 +2A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3E03 +ENCODING 15875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5480 +7CE0 +5480 +7C80 +11E0 +7D20 +1120 +FDE0 +5240 +8920 +ENDCHAR +STARTCHAR U_3E04 +ENCODING 15876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFE0 +B540 +A920 +2440 +57C0 +4C40 +87C0 +0840 +ENDCHAR +STARTCHAR U_3E05 +ENCODING 15877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +AA40 +BEE0 +AAA0 +2EA0 +2AA0 +5EA0 +48E0 +8A80 +0E80 +ENDCHAR +STARTCHAR U_3E06 +ENCODING 15878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +27C0 +A900 +BFE0 +A440 +27C0 +2280 +5EE0 +5280 +8EE0 +0280 +ENDCHAR +STARTCHAR U_3E07 +ENCODING 15879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +2440 +AFE0 +B440 +AAA0 +27C0 +5540 +4D40 +87C0 +0820 +ENDCHAR +STARTCHAR U_3E08 +ENCODING 15880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +7FE0 +5280 +7FE0 +4400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3E09 +ENCODING 15881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +BFA0 +6AC0 +3F80 +2480 +5F40 +8420 +2480 +1B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3E0A +ENCODING 15882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22E0 +2F40 +AAE0 +BFA0 +AAE0 +2FA0 +52E0 +57A0 +8AE0 +0320 +ENDCHAR +STARTCHAR U_3E0B +ENCODING 15883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3FA0 +EAC0 +57E0 +21C0 +C6A0 +23E0 +AAA0 +73E0 +52A0 +8BE0 +ENDCHAR +STARTCHAR U_3E0C +ENCODING 15884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +AD60 +B380 +A500 +27E0 +5480 +4FC0 +8480 +07E0 +ENDCHAR +STARTCHAR U_3E0D +ENCODING 15885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +2260 +2F40 +BAE0 +AF40 +AA40 +2F60 +5940 +4F40 +95A0 +1F20 +ENDCHAR +STARTCHAR U_3E0E +ENCODING 15886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +ABC0 +B240 +AFE0 +2540 +27C0 +5540 +4FE0 +8140 +0140 +ENDCHAR +STARTCHAR U_3E0F +ENCODING 15887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5AC0 +6DA0 +4500 +7DE0 +5240 +8F80 +B8E0 +ENDCHAR +STARTCHAR U_3E10 +ENCODING 15888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FD40 +2BE0 +7D40 +55E0 +7D40 +11E0 +FD40 +49E0 +5240 +8920 +ENDCHAR +STARTCHAR U_3E11 +ENCODING 15889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +5140 +7FC0 +5540 +FFE0 +9120 +7FC0 +3B80 +5540 +3B80 +E0E0 +ENDCHAR +STARTCHAR U_3E12 +ENCODING 15890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +7880 +2480 +1500 +03C0 +3C00 +0400 +FFE0 +0400 +0400 +3FC0 +ENDCHAR +STARTCHAR U_3E13 +ENCODING 15891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0F80 +F100 +8900 +4A00 +0000 +FF80 +8080 +FF80 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_3E14 +ENCODING 15892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +2500 +FFE0 +0800 +1F80 +3480 +D980 +1280 +1480 +1F80 +ENDCHAR +STARTCHAR U_3E15 +ENCODING 15893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D40 +77E0 +5540 +55E0 +5540 +57E0 +5540 +5480 +5760 +9200 +91E0 +ENDCHAR +STARTCHAR U_3E16 +ENCODING 15894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +4BC0 +4640 +8640 +4BC0 +4A40 +33C0 +3240 +3240 +4A40 +87E0 +ENDCHAR +STARTCHAR U_3E17 +ENCODING 15895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B00 +71C0 +0E00 +1B00 +E0E0 +3F80 +2080 +3F80 +2A80 +2E80 +2180 +ENDCHAR +STARTCHAR U_3E18 +ENCODING 15896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B00 +71C0 +0E00 +1100 +E0E0 +3F80 +2A80 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_3E19 +ENCODING 15897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B00 +71C0 +0E00 +1100 +E4E0 +1F80 +0500 +FFE0 +1980 +6A80 +0F80 +ENDCHAR +STARTCHAR U_3E1A +ENCODING 15898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CB20 +30C0 +30C0 +4920 +8A20 +0000 +CA20 +3140 +3080 +4940 +8E20 +ENDCHAR +STARTCHAR U_3E1B +ENCODING 15899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +4BE0 +4920 +7920 +0A20 +FC40 +4BE0 +4A20 +4A20 +8BE0 +0A20 +ENDCHAR +STARTCHAR U_3E1C +ENCODING 15900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5080 +57E0 +55A0 +7240 +1420 +F3C0 +5080 +5080 +9080 +97E0 +ENDCHAR +STARTCHAR U_3E1D +ENCODING 15901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +5100 +53E0 +7CA0 +4080 +7880 +4880 +4940 +8A20 +8C20 +ENDCHAR +STARTCHAR U_3E1E +ENCODING 15902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5280 +5280 +5280 +7FE0 +4200 +7BC0 +4A40 +4A40 +8A40 +8C40 +ENDCHAR +STARTCHAR U_3E1F +ENCODING 15903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5260 +5380 +5220 +7DE0 +4000 +7BE0 +4A20 +4BE0 +8A20 +8BE0 +ENDCHAR +STARTCHAR U_3E20 +ENCODING 15904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5280 +5AA0 +76C0 +4280 +46C0 +7AA0 +5280 +5280 +54A0 +9860 +ENDCHAR +STARTCHAR U_3E21 +ENCODING 15905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5500 +57C0 +5500 +7900 +47E0 +7100 +5380 +5540 +9920 +9100 +ENDCHAR +STARTCHAR U_3E22 +ENCODING 15906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +53E0 +5140 +7BE0 +4100 +43E0 +7EA0 +4BE0 +4AA0 +8BE0 +82A0 +ENDCHAR +STARTCHAR U_3E23 +ENCODING 15907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1360 +5140 +57E0 +5140 +7BE0 +4080 +7BC0 +4880 +4FE0 +49C0 +86A0 +ENDCHAR +STARTCHAR U_3E24 +ENCODING 15908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4A40 +EAE0 +AAA0 +4F40 +E8E0 +4E40 +EAE0 +4A40 +4A40 +9240 +ENDCHAR +STARTCHAR U_3E25 +ENCODING 15909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +5280 +57E0 +5220 +7BE0 +4280 +73E0 +56A0 +53E0 +5140 +96E0 +ENDCHAR +STARTCHAR U_3E26 +ENCODING 15910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2400 +4400 +FFE0 +0400 +4400 +3400 +0E00 +05E0 +0400 +1C00 +ENDCHAR +STARTCHAR U_3E27 +ENCODING 15911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1440 +57C0 +9440 +FC40 +37C0 +3520 +54C0 +9480 +1440 +3620 +ENDCHAR +STARTCHAR U_3E28 +ENCODING 15912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +5220 +5220 +7E20 +9220 +12E0 +1F20 +F020 +1020 +1020 +1020 +ENDCHAR +STARTCHAR U_3E29 +ENCODING 15913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +53E0 +5080 +7880 +9080 +1FE0 +F080 +1080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U_3E2A +ENCODING 15914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1220 +5220 +52A0 +7AA0 +92A0 +12A0 +3AA0 +D2A0 +12A0 +1420 +1820 +ENDCHAR +STARTCHAR U_3E2B +ENCODING 15915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A400 +FC00 +A7E0 +2480 +3C80 +E480 +2480 +2880 +2880 +ENDCHAR +STARTCHAR U_3E2C +ENCODING 15916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +F100 +A7C0 +2540 +3540 +E540 +25C0 +2100 +2100 +ENDCHAR +STARTCHAR U_3E2D +ENCODING 15917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +A540 +FD40 +A540 +27C0 +3C00 +E400 +2400 +2420 +23E0 +ENDCHAR +STARTCHAR U_3E2E +ENCODING 15918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +A240 +FC40 +A420 +23C0 +3940 +E140 +2140 +2240 +24C0 +ENDCHAR +STARTCHAR U_3E2F +ENCODING 15919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +A280 +FC80 +A280 +20E0 +3F80 +E080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_3E30 +ENCODING 15920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5080 +7BE0 +9420 +1200 +1A20 +7240 +9380 +1200 +1220 +13E0 +ENDCHAR +STARTCHAR U_3E31 +ENCODING 15921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +53E0 +7E80 +92E0 +1FA0 +F2A0 +12E0 +1280 +1220 +11E0 +ENDCHAR +STARTCHAR U_3E32 +ENCODING 15922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +A7E0 +F900 +A1C0 +2100 +3900 +E1E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_3E33 +ENCODING 15923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +A440 +FA20 +A100 +2000 +3FC0 +E040 +2280 +2100 +2100 +ENDCHAR +STARTCHAR U_3E34 +ENCODING 15924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1000 +3F80 +D080 +1F80 +2400 +3F80 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3E35 +ENCODING 15925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +A7E0 +F880 +A080 +23E0 +3800 +E3E0 +2220 +2220 +23E0 +ENDCHAR +STARTCHAR U_3E36 +ENCODING 15926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +A420 +FD20 +A7E0 +2520 +3DA0 +E660 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_3E37 +ENCODING 15927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2120 +7120 +2120 +FA40 +2400 +7FC0 +8400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E38 +ENCODING 15928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A400 +FC00 +A7E0 +2400 +3DE0 +E520 +2520 +2520 +29E0 +ENDCHAR +STARTCHAR U_3E39 +ENCODING 15929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +A720 +FD20 +A2C0 +2040 +3FE0 +E240 +2140 +2140 +2040 +20C0 +ENDCHAR +STARTCHAR U_3E3A +ENCODING 15930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +9540 +4960 +2180 +CE00 +4400 +7FC0 +8400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3E3B +ENCODING 15931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +A3E0 +FA00 +A3C0 +2480 +3880 +E7E0 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_3E3C +ENCODING 15932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2640 +A180 +FE60 +A080 +27E0 +3880 +E3C0 +2080 +27E0 +2080 +ENDCHAR +STARTCHAR U_3E3D +ENCODING 15933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +A440 +FFC0 +A440 +27C0 +3C40 +E440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_3E3E +ENCODING 15934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A120 +FB20 +A520 +2220 +3CC0 +E200 +2140 +2520 +2C40 +2BC0 +ENDCHAR +STARTCHAR U_3E3F +ENCODING 15935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A080 +FBC0 +A000 +3FE0 +E420 +23C0 +2240 +2240 +2460 +ENDCHAR +STARTCHAR U_3E40 +ENCODING 15936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +53E0 +7880 +93E0 +1420 +13C0 +1880 +37E0 +5080 +1280 +1180 +ENDCHAR +STARTCHAR U_3E41 +ENCODING 15937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +57E0 +7800 +D3C0 +1240 +1BC0 +3080 +51C0 +12A0 +1480 +1180 +ENDCHAR +STARTCHAR U_3E42 +ENCODING 15938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +E980 +9240 +FC20 +2400 +3F80 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3E43 +ENCODING 15939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7BC0 +0A00 +7BC0 +0A00 +7BC0 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E44 +ENCODING 15940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +A7C0 +FD40 +A7C0 +2820 +37C0 +E440 +2B80 +2280 +2C60 +ENDCHAR +STARTCHAR U_3E45 +ENCODING 15941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +A7E0 +FAA0 +AEA0 +23A0 +3D60 +E240 +2120 +2AA0 +2A40 +29C0 +ENDCHAR +STARTCHAR U_3E46 +ENCODING 15942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A920 +FFC0 +A100 +27C0 +3D40 +E7C0 +2540 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_3E47 +ENCODING 15943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +FC40 +A7C0 +3C00 +E7E0 +2D20 +26A0 +27A0 +20C0 +ENDCHAR +STARTCHAR U_3E48 +ENCODING 15944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +79E0 +1340 +FD40 +5880 +9760 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E49 +ENCODING 15945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +A5E0 +FD20 +A5E0 +2520 +3DE0 +E480 +25C0 +2AA0 +2980 +ENDCHAR +STARTCHAR U_3E4A +ENCODING 15946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +F920 +AA80 +27E0 +3C80 +E7C0 +2480 +27C0 +2480 +27E0 +ENDCHAR +STARTCHAR U_3E4B +ENCODING 15947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +25E0 +A920 +FAC0 +AB20 +3A40 +EBA0 +2A40 +29A0 +2840 +2980 +ENDCHAR +STARTCHAR U_3E4C +ENCODING 15948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A240 +FFE0 +A400 +3D40 +E7E0 +2440 +25E0 +2440 +2BE0 +ENDCHAR +STARTCHAR U_3E4D +ENCODING 15949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +FFE0 +A920 +2FE0 +3920 +EBA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_3E4E +ENCODING 15950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A540 +FFC0 +A540 +27C0 +3A80 +E7C0 +2480 +2FC0 +2940 +3320 +ENDCHAR +STARTCHAR U_3E4F +ENCODING 15951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +A7E0 +FA40 +A3C0 +24A0 +3CA0 +E7E0 +2080 +27C0 +2080 +27E0 +ENDCHAR +STARTCHAR U_3E50 +ENCODING 15952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3480 +CB60 +3100 +E5C0 +2700 +24E0 +4400 +7FC0 +8400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E51 +ENCODING 15953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +AFE0 +F080 +AE80 +2080 +3F80 +EA80 +2E40 +2A40 +2E60 +3120 +ENDCHAR +STARTCHAR U_3E52 +ENCODING 15954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +A280 +FFE0 +A280 +27C0 +3900 +E7C0 +2100 +2FE0 +2240 +2C20 +ENDCHAR +STARTCHAR U_3E53 +ENCODING 15955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A100 +FFE0 +A240 +3FE0 +E240 +2FE0 +2280 +22A0 +2C60 +ENDCHAR +STARTCHAR U_3E54 +ENCODING 15956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A540 +F7C0 +A540 +2FE0 +3000 +E7C0 +2540 +27C0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_3E55 +ENCODING 15957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +0200 +FFC0 +5540 +57C0 +9820 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_3E56 +ENCODING 15958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A100 +FFE0 +A440 +3FA0 +E320 +2CC0 +23C0 +2CA0 +2300 +ENDCHAR +STARTCHAR U_3E57 +ENCODING 15959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +F7E0 +A120 +3FE0 +E040 +2FE0 +2A40 +2F40 +20C0 +ENDCHAR +STARTCHAR U_3E58 +ENCODING 15960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +AFE0 +FBA0 +A540 +3FE0 +E200 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_3E59 +ENCODING 15961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +A7C0 +F540 +A920 +2FE0 +3820 +E7C0 +2540 +26C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_3E5A +ENCODING 15962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +27C0 +A540 +F920 +AFE0 +3820 +E380 +2280 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_3E5B +ENCODING 15963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +FBE0 +AAA0 +2FE0 +3A80 +EFE0 +2A40 +3660 +2180 +2660 +ENDCHAR +STARTCHAR U_3E5C +ENCODING 15964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2940 +2520 +FFE0 +2100 +2100 +2100 +5280 +4A80 +8440 +9820 +ENDCHAR +STARTCHAR U_3E5D +ENCODING 15965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5680 +2480 +6480 +9480 +37E0 +5480 +9480 +1480 +6560 +2620 +ENDCHAR +STARTCHAR U_3E5E +ENCODING 15966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5600 +2400 +6400 +97E0 +3480 +5480 +9480 +1480 +6880 +2880 +ENDCHAR +STARTCHAR U_3E5F +ENCODING 15967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +6140 +9140 +3140 +5FE0 +9100 +1280 +6440 +3820 +ENDCHAR +STARTCHAR U_3E60 +ENCODING 15968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +2FE0 +2100 +5540 +9540 +37C0 +5540 +9100 +5120 +20E0 +ENDCHAR +STARTCHAR U_3E61 +ENCODING 15969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5100 +2FE0 +2100 +5200 +9440 +3280 +5100 +9240 +5420 +27E0 +ENDCHAR +STARTCHAR U_3E62 +ENCODING 15970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A800 +4800 +7EE0 +AAA0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +CAE0 +5600 +ENDCHAR +STARTCHAR U_3E63 +ENCODING 15971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +57C0 +2440 +2A80 +5100 +9280 +3D60 +5080 +9200 +5100 +2080 +ENDCHAR +STARTCHAR U_3E64 +ENCODING 15972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +2100 +5100 +9FE0 +3100 +5200 +9280 +6440 +27C0 +ENDCHAR +STARTCHAR U_3E65 +ENCODING 15973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5100 +2FE0 +2100 +5100 +9100 +37C0 +5100 +9100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_3E66 +ENCODING 15974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +57E0 +2120 +5120 +9220 +3460 +5000 +97E0 +1420 +5420 +27E0 +ENDCHAR +STARTCHAR U_3E67 +ENCODING 15975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +6540 +9540 +3540 +5FE0 +9100 +1280 +6440 +3820 +ENDCHAR +STARTCHAR U_3E68 +ENCODING 15976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +2100 +67E0 +9520 +3520 +57E0 +9520 +1520 +67E0 +2420 +ENDCHAR +STARTCHAR U_3E69 +ENCODING 15977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5440 +2280 +6380 +9C60 +3100 +5100 +97C0 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_3E6A +ENCODING 15978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AEE0 +6AA0 +4AA0 +AAA0 +2AA0 +7FE0 +6AA0 +AAA0 +2AA0 +AAA0 +5760 +ENDCHAR +STARTCHAR U_3E6B +ENCODING 15979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2100 +67C0 +9140 +37C0 +5500 +97E0 +1120 +62C0 +2C60 +ENDCHAR +STARTCHAR U_3E6C +ENCODING 15980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +5080 +27E0 +5080 +97E0 +34A0 +57E0 +9280 +1100 +A280 +4C60 +ENDCHAR +STARTCHAR U_3E6D +ENCODING 15981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27C0 +5540 +97C0 +3540 +57C0 +9140 +1180 +52A0 +2C60 +ENDCHAR +STARTCHAR U_3E6E +ENCODING 15982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +2200 +57C0 +9440 +3440 +57C0 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_3E6F +ENCODING 15983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5280 +2480 +5DE0 +9480 +3480 +55C0 +96A0 +1480 +6480 +2480 +ENDCHAR +STARTCHAR U_3E70 +ENCODING 15984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5540 +2540 +6100 +9FE0 +3280 +5280 +9280 +1280 +64A0 +4860 +ENDCHAR +STARTCHAR U_3E71 +ENCODING 15985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5440 +2440 +67C0 +9100 +3500 +55C0 +9500 +1500 +6F00 +30E0 +ENDCHAR +STARTCHAR U_3E72 +ENCODING 15986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +57C0 +2240 +6FE0 +9100 +37C0 +5880 +97E0 +1080 +6080 +2180 +ENDCHAR +STARTCHAR U_3E73 +ENCODING 15987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5100 +27C0 +6140 +9240 +37E0 +5000 +97C0 +1440 +67C0 +2440 +ENDCHAR +STARTCHAR U_3E74 +ENCODING 15988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5100 +27C0 +6540 +97C0 +3540 +57C0 +9500 +1300 +6280 +4C60 +ENDCHAR +STARTCHAR U_3E75 +ENCODING 15989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +52A0 +2540 +6540 +92A0 +3000 +57E0 +9080 +1080 +6080 +47E0 +ENDCHAR +STARTCHAR U_3E76 +ENCODING 15990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A000 +6060 +3DC0 +6440 +A840 +3DE0 +6440 +A440 +37E0 +AC00 +53E0 +ENDCHAR +STARTCHAR U_3E77 +ENCODING 15991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CC80 +30C0 +CCA0 +23E0 +FC80 +5080 +FC80 +5480 +5540 +5940 +1620 +ENDCHAR +STARTCHAR U_3E78 +ENCODING 15992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +57C0 +2440 +67C0 +9440 +37C0 +5280 +9280 +1280 +64A0 +2860 +ENDCHAR +STARTCHAR U_3E79 +ENCODING 15993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2500 +67C0 +9540 +37E0 +5540 +97C0 +1500 +5A80 +3460 +ENDCHAR +STARTCHAR U_3E7A +ENCODING 15994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5120 +2F40 +6380 +9540 +1920 +37C0 +5440 +97C0 +5440 +27C0 +ENDCHAR +STARTCHAR U_3E7B +ENCODING 15995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5700 +2100 +2FE0 +5540 +9920 +3240 +57E0 +9240 +5180 +2660 +ENDCHAR +STARTCHAR U_3E7C +ENCODING 15996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +5400 +27E0 +6920 +9560 +37E0 +5320 +95A0 +1960 +5120 +20C0 +ENDCHAR +STARTCHAR U_3E7D +ENCODING 15997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9140 +57E0 +2140 +61A0 +9660 +3100 +5140 +97E0 +1140 +51A0 +2660 +ENDCHAR +STARTCHAR U_3E7E +ENCODING 15998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5740 +2560 +6D40 +9240 +35C0 +5860 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_3E7F +ENCODING 15999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +53C0 +2200 +67C0 +9440 +37C0 +5440 +97C0 +1100 +5FE0 +2100 +ENDCHAR +STARTCHAR U_3E80 +ENCODING 16000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +57E0 +2AA0 +6AA0 +92A0 +3540 +5200 +9120 +1520 +6C40 +2BC0 +ENDCHAR +STARTCHAR U_3E81 +ENCODING 16001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92A0 +5540 +2540 +62A0 +92A0 +3400 +57E0 +9560 +14A0 +5560 +27E0 +ENDCHAR +STARTCHAR U_3E82 +ENCODING 16002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90C0 +50A0 +27E0 +6480 +9780 +34A0 +57A0 +94C0 +1780 +68E0 +4B20 +ENDCHAR +STARTCHAR U_3E83 +ENCODING 16003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5FE0 +2280 +6400 +97E0 +3820 +57A0 +94A0 +17A0 +5020 +20C0 +ENDCHAR +STARTCHAR U_3E84 +ENCODING 16004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A300 +6480 +2840 +77A0 +A000 +2E20 +6AA0 +AEA0 +2AA0 +AE20 +4A60 +ENDCHAR +STARTCHAR U_3E85 +ENCODING 16005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5380 +2480 +6FE0 +9500 +35C0 +5680 +97E0 +1480 +6940 +2E20 +ENDCHAR +STARTCHAR U_3E86 +ENCODING 16006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5240 +2EE0 +6440 +96A0 +3520 +57C0 +9540 +1540 +6280 +2C60 +ENDCHAR +STARTCHAR U_3E87 +ENCODING 16007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +5EC0 +34A0 +5480 +9FE0 +3280 +5E80 +9480 +1540 +7F40 +2220 +ENDCHAR +STARTCHAR U_3E88 +ENCODING 16008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5540 +27C0 +6100 +9FE0 +3100 +57C0 +9540 +17C0 +6120 +4FE0 +ENDCHAR +STARTCHAR U_3E89 +ENCODING 16009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +FA40 +8C20 +73C0 +2A40 +FA40 +2180 +5180 +8E60 +ENDCHAR +STARTCHAR U_3E8A +ENCODING 16010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5280 +2FE0 +6100 +97C0 +3100 +5FE0 +9240 +1520 +6C40 +4BC0 +ENDCHAR +STARTCHAR U_3E8B +ENCODING 16011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5440 +29A0 +6240 +97C0 +1000 +3FE0 +55A0 +9360 +5DA0 +2360 +ENDCHAR +STARTCHAR U_3E8C +ENCODING 16012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +57E0 +2280 +67E0 +92A0 +3FE0 +52A0 +97E0 +16C0 +5AA0 +2280 +ENDCHAR +STARTCHAR U_3E8D +ENCODING 16013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5FE0 +2820 +6780 +9400 +37C0 +5480 +9480 +1FE0 +6440 +2820 +ENDCHAR +STARTCHAR U_3E8E +ENCODING 16014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2540 +67E0 +9540 +37C0 +5540 +97C0 +1540 +AFC0 +4940 +ENDCHAR +STARTCHAR U_3E8F +ENCODING 16015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57C0 +2540 +6FE0 +9540 +37C0 +5540 +9FE0 +1440 +6380 +2C60 +ENDCHAR +STARTCHAR U_3E90 +ENCODING 16016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A540 +6A80 +4540 +A7C0 +2540 +67C0 +A540 +27C0 +A100 +CFE0 +8540 +ENDCHAR +STARTCHAR U_3E91 +ENCODING 16017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +57E0 +2520 +5EE0 +9380 +34C0 +5B20 +9080 +1340 +6080 +2700 +ENDCHAR +STARTCHAR U_3E92 +ENCODING 16018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +55A0 +2360 +6DA0 +9100 +3280 +5D60 +9280 +1340 +A080 +4700 +ENDCHAR +STARTCHAR U_3E93 +ENCODING 16019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +57E0 +2100 +67C0 +9100 +3FE0 +5440 +97C0 +1440 +A7C0 +4820 +ENDCHAR +STARTCHAR U_3E94 +ENCODING 16020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +5540 +2380 +6480 +97C0 +3440 +57E0 +94A0 +16A0 +6A20 +4840 +ENDCHAR +STARTCHAR U_3E95 +ENCODING 16021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90E0 +5F40 +2540 +6FE0 +9540 +3920 +57C0 +9540 +17C0 +6540 +27C0 +ENDCHAR +STARTCHAR U_3E96 +ENCODING 16022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A680 +6280 +5FE0 +AAA0 +2EA0 +6AA0 +AE40 +2A40 +3FA0 +A2A0 +4320 +ENDCHAR +STARTCHAR U_3E97 +ENCODING 16023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5AA0 +2FE0 +6540 +97C0 +3540 +57C0 +9100 +1FE0 +5100 +2100 +ENDCHAR +STARTCHAR U_3E98 +ENCODING 16024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +57E0 +2C80 +27C0 +5480 +97C0 +3480 +57E0 +9000 +5AA0 +2AA0 +ENDCHAR +STARTCHAR U_3E99 +ENCODING 16025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5FE0 +2820 +67C0 +9540 +3FE0 +5540 +97C0 +1540 +66C0 +4C60 +ENDCHAR +STARTCHAR U_3E9A +ENCODING 16026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +53E0 +2880 +63E0 +BD40 +2BE0 +6880 +ABE0 +2880 +AC80 +53E0 +ENDCHAR +STARTCHAR U_3E9B +ENCODING 16027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5480 +27C0 +6480 +97E0 +3AA0 +50C0 +9240 +1FE0 +5240 +2440 +ENDCHAR +STARTCHAR U_3E9C +ENCODING 16028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +5FE0 +2AA0 +6FE0 +AAA0 +2FC0 +6800 +AFE0 +2AA0 +AA40 +5320 +ENDCHAR +STARTCHAR U_3E9D +ENCODING 16029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F40 +5A40 +2F60 +6940 +AFA0 +2A20 +6F00 +A000 +2FE0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_3E9E +ENCODING 16030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5660 +2BA0 +6E60 +ABA0 +2CE0 +6AA0 +BFE0 +2440 +A820 +5020 +ENDCHAR +STARTCHAR U_3E9F +ENCODING 16031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +55A0 +2360 +65A0 +9520 +3C80 +57E0 +9480 +17E0 +5480 +27E0 +ENDCHAR +STARTCHAR U_3EA0 +ENCODING 16032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +34A0 +6860 +A600 +3CE0 +6BC0 +AAA0 +2AA0 +AEE0 +42A0 +ENDCHAR +STARTCHAR U_3EA1 +ENCODING 16033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +54A0 +27C0 +6540 +97E0 +3540 +57E0 +9440 +1560 +6940 +2BE0 +ENDCHAR +STARTCHAR U_3EA2 +ENCODING 16034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5100 +2FE0 +6D60 +9780 +3540 +5FE0 +9480 +17C0 +5480 +27E0 +ENDCHAR +STARTCHAR U_3EA3 +ENCODING 16035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +96C0 +54A0 +3E80 +55E0 +9E80 +30A0 +5EA0 +92C0 +1E80 +6B60 +3E20 +ENDCHAR +STARTCHAR U_3EA4 +ENCODING 16036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +55A0 +3FE0 +6A80 +BB80 +2AA0 +7BA0 +AAA0 +3BC0 +AA60 +5FA0 +ENDCHAR +STARTCHAR U_3EA5 +ENCODING 16037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9380 +5480 +27C0 +6440 +97C0 +34A0 +5FE0 +9540 +17C0 +62A0 +4CE0 +ENDCHAR +STARTCHAR U_3EA6 +ENCODING 16038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9D40 +5540 +36A0 +7FE0 +9540 +3EA0 +57E0 +9540 +1F60 +B540 +4640 +ENDCHAR +STARTCHAR U_3EA7 +ENCODING 16039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5AA0 +2FE0 +5200 +97C0 +3540 +5FE0 +9440 +1EE0 +6AA0 +4EE0 +ENDCHAR +STARTCHAR U_3EA8 +ENCODING 16040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2100 +2100 +2200 +F200 +2200 +2400 +3C40 +E4E0 +0720 +ENDCHAR +STARTCHAR U_3EA9 +ENCODING 16041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +1220 +1220 +1220 +7A20 +1260 +12A0 +1320 +1C20 +E020 +0020 +ENDCHAR +STARTCHAR U_3EAA +ENCODING 16042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2100 +2100 +2180 +F940 +2120 +2100 +3900 +E100 +0100 +ENDCHAR +STARTCHAR U_3EAB +ENCODING 16043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FC20 +1020 +1120 +1120 +7D20 +1120 +1120 +1C20 +E020 +0060 +ENDCHAR +STARTCHAR U_3EAC +ENCODING 16044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +4480 +4480 +4680 +F580 +4480 +44A0 +74A0 +C8A0 +10E0 +ENDCHAR +STARTCHAR U_3EAD +ENCODING 16045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2040 +2080 +2080 +F880 +27E0 +2080 +2080 +3880 +E080 +0180 +ENDCHAR +STARTCHAR U_3EAE +ENCODING 16046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2000 +2000 +27E0 +F100 +2200 +23C0 +2040 +3840 +E040 +0180 +ENDCHAR +STARTCHAR U_3EAF +ENCODING 16047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +0400 +FFE0 +0400 +7FC0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3EB0 +ENCODING 16048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F880 +2080 +23E0 +22A0 +72A0 +22A0 +2AA0 +32A0 +C080 +0080 +ENDCHAR +STARTCHAR U_3EB1 +ENCODING 16049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4480 +C5C0 +4840 +4B40 +5080 +7FC0 +0400 +3F80 +0480 +FFE0 +ENDCHAR +STARTCHAR U_3EB2 +ENCODING 16050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F240 +4240 +4240 +F240 +4FC0 +4240 +5240 +6240 +8240 +0FE0 +ENDCHAR +STARTCHAR U_3EB3 +ENCODING 16051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +41E0 +4100 +F100 +47C0 +4440 +5280 +6100 +82C0 +0C20 +ENDCHAR +STARTCHAR U_3EB4 +ENCODING 16052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0140 +F900 +27E0 +2100 +F900 +2100 +2280 +3A80 +C440 +0820 +ENDCHAR +STARTCHAR U_3EB5 +ENCODING 16053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F7E0 +4420 +4940 +F100 +4100 +4280 +7280 +C440 +1820 +ENDCHAR +STARTCHAR U_3EB6 +ENCODING 16054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0280 +F180 +4480 +4280 +F080 +47E0 +4080 +7080 +C080 +0080 +ENDCHAR +STARTCHAR U_3EB7 +ENCODING 16055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +F7E0 +4100 +4100 +F380 +4540 +4920 +7100 +C100 +0100 +ENDCHAR +STARTCHAR U_3EB8 +ENCODING 16056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +2480 +E680 +2580 +24A0 +2860 +7FC0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_3EB9 +ENCODING 16057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA40 +2420 +27E0 +FA40 +2240 +27E0 +2240 +3A40 +C240 +0440 +ENDCHAR +STARTCHAR U_3EBA +ENCODING 16058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +4420 +47E0 +F420 +4420 +47E0 +4420 +7420 +C7E0 +0420 +ENDCHAR +STARTCHAR U_3EBB +ENCODING 16059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +4FE0 +4100 +47E0 +F520 +4520 +4520 +7520 +C560 +0100 +ENDCHAR +STARTCHAR U_3EBC +ENCODING 16060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F120 +4140 +4100 +4500 +F5C0 +4500 +4500 +7700 +C980 +1060 +ENDCHAR +STARTCHAR U_3EBD +ENCODING 16061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +4100 +4300 +4580 +F940 +4120 +4100 +7100 +C000 +0FE0 +ENDCHAR +STARTCHAR U_3EBE +ENCODING 16062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +4820 +4BA0 +4AA0 +FAA0 +4BA0 +4820 +7820 +C820 +0860 +ENDCHAR +STARTCHAR U_3EBF +ENCODING 16063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F900 +4900 +4BC0 +4A40 +FA40 +4A40 +4BC0 +7900 +C900 +0FE0 +ENDCHAR +STARTCHAR U_3EC0 +ENCODING 16064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F7C0 +4540 +47C0 +F540 +47C0 +4100 +7500 +C200 +0DE0 +ENDCHAR +STARTCHAR U_3EC1 +ENCODING 16065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2820 +2BA0 +FAA0 +2AA0 +2AA0 +2BA0 +3820 +C820 +0FE0 +ENDCHAR +STARTCHAR U_3EC2 +ENCODING 16066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +F240 +27E0 +2240 +F240 +2FE0 +2240 +2240 +3240 +C440 +0840 +ENDCHAR +STARTCHAR U_3EC3 +ENCODING 16067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7FC0 +7FC0 +4A40 +7FC0 +0000 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3EC4 +ENCODING 16068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +F700 +2000 +27E0 +F080 +2280 +22E0 +2280 +3680 +C580 +0860 +ENDCHAR +STARTCHAR U_3EC5 +ENCODING 16069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F300 +4480 +4860 +F780 +4000 +4FC0 +7200 +C480 +0F40 +ENDCHAR +STARTCHAR U_3EC6 +ENCODING 16070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0240 +F420 +27E0 +2000 +F7E0 +2420 +27E0 +3420 +C7E0 +0460 +ENDCHAR +STARTCHAR U_3EC7 +ENCODING 16071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2280 +2C60 +F7C0 +2100 +2100 +27C0 +3100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_3EC8 +ENCODING 16072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +F700 +2400 +27E0 +2400 +F400 +25E0 +2520 +3520 +C520 +09E0 +ENDCHAR +STARTCHAR U_3EC9 +ENCODING 16073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +25C0 +2500 +2FE0 +F100 +2520 +2540 +3180 +C100 +0E00 +ENDCHAR +STARTCHAR U_3ECA +ENCODING 16074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +2480 +2FE0 +2920 +F920 +2FE0 +2300 +3300 +C520 +19E0 +ENDCHAR +STARTCHAR U_3ECB +ENCODING 16075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2100 +2FE0 +F920 +2FE0 +2300 +3580 +C940 +1120 +ENDCHAR +STARTCHAR U_3ECC +ENCODING 16076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +2440 +2FE0 +F100 +2100 +2FE0 +2100 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_3ECD +ENCODING 16077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2000 +F7C0 +2100 +2FE0 +2100 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_3ECE +ENCODING 16078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +75C0 +2480 +75C0 +2480 +35C0 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_3ECF +ENCODING 16079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +27C0 +2040 +F7C0 +2100 +2520 +2940 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_3ED0 +ENCODING 16080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +27E0 +2280 +F440 +2A20 +23C0 +2440 +3280 +C100 +0EE0 +ENDCHAR +STARTCHAR U_3ED1 +ENCODING 16081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2380 +F540 +2920 +27C0 +2080 +3FE0 +C100 +0300 +ENDCHAR +STARTCHAR U_3ED2 +ENCODING 16082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F8A0 +2B20 +2920 +FFE0 +2920 +2BA0 +2D60 +3920 +CFE0 +0820 +ENDCHAR +STARTCHAR U_3ED3 +ENCODING 16083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +EAE0 +4AA0 +4EA0 +EAA0 +4E40 +4A40 +4A40 +6E40 +D2A0 +0320 +ENDCHAR +STARTCHAR U_3ED4 +ENCODING 16084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2100 +F540 +2FE0 +2540 +2100 +3FE0 +C100 +07C0 +ENDCHAR +STARTCHAR U_3ED5 +ENCODING 16085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +27E0 +2480 +F6A0 +26A0 +27E0 +2480 +36A0 +C6A0 +0BE0 +ENDCHAR +STARTCHAR U_3ED6 +ENCODING 16086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2140 +2FE0 +F140 +27C0 +2100 +2540 +3380 +C540 +0B20 +ENDCHAR +STARTCHAR U_3ED7 +ENCODING 16087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1100 +71C0 +F1E0 +1100 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3ED8 +ENCODING 16088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2100 +FFE0 +2920 +2FE0 +2920 +3FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_3ED9 +ENCODING 16089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +27E0 +F000 +27C0 +2440 +27C0 +3440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_3EDA +ENCODING 16090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2AA0 +2EE0 +FAA0 +2AA0 +2EE0 +2AA0 +3AA0 +CAA0 +1320 +ENDCHAR +STARTCHAR U_3EDB +ENCODING 16091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +F7C0 +2400 +27E0 +2AA0 +34A0 +C920 +02C0 +ENDCHAR +STARTCHAR U_3EDC +ENCODING 16092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F240 +24C0 +2B20 +F100 +2100 +25C0 +2500 +3500 +CB00 +10E0 +ENDCHAR +STARTCHAR U_3EDD +ENCODING 16093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FFA0 +2260 +2FE0 +FAE0 +2AE0 +2FE0 +2260 +3760 +CAA0 +1260 +ENDCHAR +STARTCHAR U_3EDE +ENCODING 16094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2420 +27E0 +F400 +27E0 +25A0 +25A0 +37E0 +CDA0 +1420 +ENDCHAR +STARTCHAR U_3EDF +ENCODING 16095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2200 +25C0 +F880 +27E0 +2240 +23C0 +3240 +C3C0 +0240 +ENDCHAR +STARTCHAR U_3EE0 +ENCODING 16096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +03E0 +FA20 +2140 +22A0 +F8C0 +23E0 +2080 +F940 +0220 +0420 +ENDCHAR +STARTCHAR U_3EE1 +ENCODING 16097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +0FE0 +E540 +45C0 +4400 +E7E0 +4100 +4FE0 +6100 +8540 +0920 +ENDCHAR +STARTCHAR U_3EE2 +ENCODING 16098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0EE0 +E500 +4500 +4680 +EBE0 +4AA0 +4AA0 +EA80 +12A0 +06E0 +ENDCHAR +STARTCHAR U_3EE3 +ENCODING 16099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +23C0 +F240 +23C0 +2240 +2FE0 +3540 +C620 +07E0 +ENDCHAR +STARTCHAR U_3EE4 +ENCODING 16100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +2100 +F3E0 +2420 +2BA0 +22A0 +33A0 +C0A0 +0040 +ENDCHAR +STARTCHAR U_3EE5 +ENCODING 16101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2280 +FFE0 +2AA0 +2CE0 +2820 +3FE0 +C820 +0FE0 +ENDCHAR +STARTCHAR U_3EE6 +ENCODING 16102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2FE0 +2920 +FFE0 +2100 +2FE0 +29A0 +39E0 +CF20 +0860 +ENDCHAR +STARTCHAR U_3EE7 +ENCODING 16103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F740 +25E0 +2D40 +F3E0 +2640 +2140 +2FE0 +3380 +C540 +0920 +ENDCHAR +STARTCHAR U_3EE8 +ENCODING 16104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +FD40 +8A80 +F940 +A220 +FFC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3EE9 +ENCODING 16105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E500 +5FE0 +4500 +EFC0 +4540 +5FE0 +4540 +6FC0 +8D80 +1560 +ENDCHAR +STARTCHAR U_3EEA +ENCODING 16106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F7E0 +2C80 +27E0 +F7E0 +2480 +2FE0 +2280 +32E0 +C420 +0860 +ENDCHAR +STARTCHAR U_3EEB +ENCODING 16107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +4FE0 +4920 +EFE0 +4540 +5FE0 +4540 +6FE0 +87C0 +0100 +ENDCHAR +STARTCHAR U_3EEC +ENCODING 16108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2BA0 +F540 +27C0 +2FE0 +2200 +37C0 +C040 +01C0 +ENDCHAR +STARTCHAR U_3EED +ENCODING 16109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4100 +4AA0 +E540 +4AA0 +47C0 +4100 +6FE0 +8100 +0100 +ENDCHAR +STARTCHAR U_3EEE +ENCODING 16110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFE0 +4920 +56C0 +EA40 +47A0 +5800 +4FE0 +6500 +8940 +1120 +ENDCHAR +STARTCHAR U_3EEF +ENCODING 16111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +E100 +5FE0 +5420 +FFC0 +5400 +53C0 +5540 +7FE0 +9100 +2300 +ENDCHAR +STARTCHAR U_3EF0 +ENCODING 16112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EEE0 +4440 +4EE0 +E440 +4CE0 +4780 +4040 +6FE0 +C040 +07C0 +ENDCHAR +STARTCHAR U_3EF1 +ENCODING 16113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E9C0 +4340 +5CC0 +E920 +4A80 +4BE0 +4880 +6BE0 +8C80 +13E0 +ENDCHAR +STARTCHAR U_3EF2 +ENCODING 16114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +4D60 +47C0 +E100 +47C0 +4540 +4FE0 +6480 +8380 +0E40 +ENDCHAR +STARTCHAR U_3EF3 +ENCODING 16115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFE0 +4480 +4E20 +E4A0 +5EA0 +44A0 +4EA0 +6D20 +9420 +0460 +ENDCHAR +STARTCHAR U_3EF4 +ENCODING 16116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +47C0 +4440 +4FE0 +EAA0 +4FE0 +47C0 +6440 +8380 +0C60 +ENDCHAR +STARTCHAR U_3EF5 +ENCODING 16117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +4FE0 +4840 +EFE0 +4880 +4FE0 +4A40 +6FE0 +8A40 +16C0 +ENDCHAR +STARTCHAR U_3EF6 +ENCODING 16118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0FE0 +F540 +4FE0 +4240 +FFE0 +4240 +4FC0 +7200 +CFE0 +0200 +ENDCHAR +STARTCHAR U_3EF7 +ENCODING 16119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +5FE0 +56A0 +F6A0 +56A0 +45C0 +6EA0 +95A0 +0480 +ENDCHAR +STARTCHAR U_3EF8 +ENCODING 16120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +1540 +F540 +5FE0 +4CC0 +F560 +4FC0 +4840 +7FC0 +C840 +0FC0 +ENDCHAR +STARTCHAR U_3EF9 +ENCODING 16121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2140 +3A80 +6DC0 +BAA0 +0100 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3EFA +ENCODING 16122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5DC0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +4200 +5FC0 +4280 +BFE0 +ENDCHAR +STARTCHAR U_3EFB +ENCODING 16123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1F80 +E080 +4EE0 +4BA0 +EEA0 +42A0 +4440 +7F40 +C4A0 +0D20 +ENDCHAR +STARTCHAR U_3EFC +ENCODING 16124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0280 +EFE0 +4AA0 +4FE0 +E440 +47C0 +4440 +6FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_3EFD +ENCODING 16125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0FE0 +E900 +5FC0 +4900 +EFE0 +4000 +4EE0 +EBA0 +0820 +0860 +ENDCHAR +STARTCHAR U_3EFE +ENCODING 16126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1280 +7FE0 +2BC0 +1280 +FFE0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_3EFF +ENCODING 16127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +4400 +4FE0 +F220 +4FA0 +4AA0 +EFA0 +02A0 +0FE0 +ENDCHAR +STARTCHAR U_3F00 +ENCODING 16128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0BC0 +E100 +47E0 +5A80 +EFE0 +4900 +4FC0 +6900 +D500 +23E0 +ENDCHAR +STARTCHAR U_3F01 +ENCODING 16129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2100 +27C0 +2100 +F7E0 +22A0 +2FE0 +32A0 +CF40 +04A0 +ENDCHAR +STARTCHAR U_3F02 +ENCODING 16130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +36C0 +4440 +77C0 +4540 +FFE0 +8020 +3F80 +0400 +1F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_3F03 +ENCODING 16131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +22A0 +27E0 +26A0 +F520 +27E0 +2540 +37C0 +E560 +07A0 +ENDCHAR +STARTCHAR U_3F04 +ENCODING 16132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2540 +2FE0 +2140 +FFE0 +2A80 +2FA0 +3AC0 +CFE0 +0120 +ENDCHAR +STARTCHAR U_3F05 +ENCODING 16133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A40 +2FE0 +2A40 +FFE0 +2AA0 +2BE0 +3AA0 +CBE0 +1420 +ENDCHAR +STARTCHAR U_3F06 +ENCODING 16134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F7C0 +2540 +2920 +2FE0 +F820 +27C0 +2100 +37C0 +C140 +0FE0 +ENDCHAR +STARTCHAR U_3F07 +ENCODING 16135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04A0 +F7E0 +2280 +2FE0 +2480 +F7E0 +2480 +27E0 +3660 +C5A0 +0420 +ENDCHAR +STARTCHAR U_3F08 +ENCODING 16136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FE0 +2540 +29E0 +FF40 +25E0 +2940 +3FE0 +D540 +15E0 +ENDCHAR +STARTCHAR U_3F09 +ENCODING 16137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +7880 +5BE0 +56A0 +5480 +5480 +55A0 +56E0 +6A00 +B900 +80E0 +ENDCHAR +STARTCHAR U_3F0A +ENCODING 16138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2540 +AD40 +AD40 +FD40 +A540 +2EC0 +3BA0 +1020 +ENDCHAR +STARTCHAR U_3F0B +ENCODING 16139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4740 +FD40 +4540 +4540 +F540 +9540 +9540 +96C0 +F7A0 +9820 +ENDCHAR +STARTCHAR U_3F0C +ENCODING 16140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +A740 +B540 +B540 +B540 +AD40 +AD40 +A540 +D6A0 +FBA0 +8820 +ENDCHAR +STARTCHAR U_3F0D +ENCODING 16141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +FF40 +2540 +7540 +2540 +FD40 +2540 +7540 +6EA0 +ABA0 +2820 +ENDCHAR +STARTCHAR U_3F0E +ENCODING 16142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +7480 +57E0 +5540 +5760 +5540 +5480 +5540 +6E20 +BB00 +80E0 +ENDCHAR +STARTCHAR U_3F0F +ENCODING 16143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38E0 +CF40 +B540 +5540 +5540 +FD40 +5540 +D540 +36A0 +4BA0 +8820 +ENDCHAR +STARTCHAR U_3F10 +ENCODING 16144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +8D40 +FD40 +8540 +8540 +FD40 +A940 +FAA0 +ABA0 +A820 +ENDCHAR +STARTCHAR U_3F11 +ENCODING 16145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FF40 +1540 +FD40 +D540 +BD40 +FD40 +3540 +5EA0 +97A0 +1820 +ENDCHAR +STARTCHAR U_3F12 +ENCODING 16146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DC0 +7540 +55C0 +5540 +57E0 +5500 +55E0 +56A0 +6D20 +BB40 +80E0 +ENDCHAR +STARTCHAR U_3F13 +ENCODING 16147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +AFE0 +AA80 +AFE0 +AAA0 +AFE0 +AAA0 +A7E0 +D6C0 +FAA0 +8280 +ENDCHAR +STARTCHAR U_3F14 +ENCODING 16148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9740 +F540 +9540 +F540 +0540 +FD40 +A940 +AAA0 +FBA0 +0820 +ENDCHAR +STARTCHAR U_3F15 +ENCODING 16149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +A7C0 +FD40 +8D40 +7540 +5540 +FD40 +AA40 +FAA0 +ABA0 +F820 +ENDCHAR +STARTCHAR U_3F16 +ENCODING 16150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3B80 +F480 +AFE0 +AB40 +ADA0 +AA80 +AFE0 +AAA0 +DFE0 +F2A0 +8FE0 +ENDCHAR +STARTCHAR U_3F17 +ENCODING 16151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FA00 +2200 +23C0 +2240 +2340 +24C0 +2440 +2440 +2540 +6660 +ENDCHAR +STARTCHAR U_3F18 +ENCODING 16152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +2100 +A9C0 +A940 +A940 +AB40 +AAC0 +FA40 +8A40 +0360 +ENDCHAR +STARTCHAR U_3F19 +ENCODING 16153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2100 +F900 +A9C0 +A940 +A940 +AAC0 +BA40 +2240 +2360 +ENDCHAR +STARTCHAR U_3F1A +ENCODING 16154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +2100 +F900 +01C0 +7140 +5140 +52C0 +5240 +9A40 +9360 +ENDCHAR +STARTCHAR U_3F1B +ENCODING 16155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4900 +4900 +49C0 +4940 +FD40 +4940 +4AC0 +4A40 +8A40 +8B60 +ENDCHAR +STARTCHAR U_3F1C +ENCODING 16156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +FFE0 +1100 +3F80 +D060 +1E00 +2A00 +2640 +31C0 +ENDCHAR +STARTCHAR U_3F1D +ENCODING 16157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +CA40 +32A0 +E3E0 +0000 +FFE0 +1000 +1F00 +1500 +2340 +30C0 +ENDCHAR +STARTCHAR U_3F1E +ENCODING 16158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +A900 +7100 +21C0 +FA40 +2340 +22C0 +2240 +2240 +2360 +ENDCHAR +STARTCHAR U_3F1F +ENCODING 16159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +4FE0 +F200 +9200 +93C0 +F240 +9340 +94C0 +9440 +F540 +0660 +ENDCHAR +STARTCHAR U_3F20 +ENCODING 16160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F900 +8900 +41C0 +7940 +4340 +42C0 +5A40 +6240 +0360 +ENDCHAR +STARTCHAR U_3F21 +ENCODING 16161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +57E0 +7900 +9100 +11C0 +FD40 +3340 +3AC0 +5640 +9240 +1360 +ENDCHAR +STARTCHAR U_3F22 +ENCODING 16162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +9100 +91C0 +B940 +A940 +BAC0 +9240 +9240 +FA40 +0360 +ENDCHAR +STARTCHAR U_3F23 +ENCODING 16163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +F9C0 +8940 +8940 +FAC0 +8A40 +8A40 +FAC0 +0360 +ENDCHAR +STARTCHAR U_3F24 +ENCODING 16164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +1120 +7920 +1240 +FFE0 +0800 +1F00 +1500 +2320 +38E0 +ENDCHAR +STARTCHAR U_3F25 +ENCODING 16165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +7900 +2900 +FDC0 +4140 +FB40 +22C0 +7A40 +0A40 +3360 +ENDCHAR +STARTCHAR U_3F26 +ENCODING 16166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2340 +3AC0 +E460 +0800 +FFE0 +0800 +1F00 +1500 +2320 +30E0 +ENDCHAR +STARTCHAR U_3F27 +ENCODING 16167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5100 +2100 +F9C0 +A940 +F940 +AB40 +FAC0 +AA40 +AA40 +9B60 +ENDCHAR +STARTCHAR U_3F28 +ENCODING 16168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57C0 +AA00 +F200 +1380 +2280 +F680 +9580 +9480 +F4A0 +9660 +ENDCHAR +STARTCHAR U_3F29 +ENCODING 16169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +17E0 +1100 +FD00 +91C0 +9540 +EEC0 +AA40 +AA40 +D740 +A260 +ENDCHAR +STARTCHAR U_3F2A +ENCODING 16170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +69C0 +6940 +B740 +22C0 +3240 +4AC0 +8360 +ENDCHAR +STARTCHAR U_3F2B +ENCODING 16171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +F900 +A9C0 +F940 +2140 +FAC0 +7240 +6A40 +A2C0 +2360 +ENDCHAR +STARTCHAR U_3F2C +ENCODING 16172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +2100 +F900 +51C0 +7140 +2340 +FAC0 +2240 +22C0 +2360 +ENDCHAR +STARTCHAR U_3F2D +ENCODING 16173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +F900 +23E0 +3A20 +E3E0 +0000 +FFE0 +1000 +1F00 +2520 +32E0 +ENDCHAR +STARTCHAR U_3F2E +ENCODING 16174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +F900 +29C0 +FD40 +2B40 +FAC0 +5240 +72C0 +CB60 +ENDCHAR +STARTCHAR U_3F2F +ENCODING 16175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +F900 +A9C0 +F940 +AB40 +FAC0 +7240 +AA40 +2360 +ENDCHAR +STARTCHAR U_3F30 +ENCODING 16176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +FA00 +AA00 +FBC0 +AA40 +FB40 +62C0 +A240 +FA40 +2360 +2620 +ENDCHAR +STARTCHAR U_3F31 +ENCODING 16177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +0A20 +FBE0 +0000 +FFE0 +A0A0 +5F40 +1000 +1F00 +2520 +32E0 +ENDCHAR +STARTCHAR U_3F32 +ENCODING 16178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2200 +FE00 +AB80 +AA80 +AA80 +2580 +FC80 +24A0 +55A0 +8E60 +ENDCHAR +STARTCHAR U_3F33 +ENCODING 16179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +6BE0 +B500 +2100 +F9C0 +4940 +7B40 +4AC0 +7A40 +4AC0 +7B60 +ENDCHAR +STARTCHAR U_3F34 +ENCODING 16180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A900 +F900 +A9C0 +F940 +2340 +FAC0 +AA40 +BA40 +EAC0 +8B60 +ENDCHAR +STARTCHAR U_3F35 +ENCODING 16181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BE0 +7900 +4900 +FDC0 +1340 +5AC0 +5240 +7360 +9C00 +83E0 +ENDCHAR +STARTCHAR U_3F36 +ENCODING 16182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BC0 +4500 +BB00 +01C0 +EB40 +AAC0 +EA40 +AA40 +E2C0 +A760 +ENDCHAR +STARTCHAR U_3F37 +ENCODING 16183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABE0 +A900 +F900 +01C0 +FD40 +4140 +FEC0 +AA40 +AAC0 +8360 +ENDCHAR +STARTCHAR U_3F38 +ENCODING 16184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +8500 +4900 +B5C0 +4940 +86C0 +7A40 +4A40 +4AC0 +7B60 +ENDCHAR +STARTCHAR U_3F39 +ENCODING 16185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +4900 +1100 +FDC0 +4140 +7DC0 +5540 +5540 +5540 +9760 +ENDCHAR +STARTCHAR U_3F3A +ENCODING 16186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +5100 +7D00 +55C0 +7F40 +55C0 +7D40 +6540 +BD40 +A760 +ENDCHAR +STARTCHAR U_3F3B +ENCODING 16187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3280 +CD60 +3500 +E5E0 +2700 +28E0 +FFC0 +1000 +1F00 +2520 +30E0 +ENDCHAR +STARTCHAR U_3F3C +ENCODING 16188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +F900 +A9C0 +FA40 +0340 +72C0 +0240 +FA40 +72C0 +AB60 +ENDCHAR +STARTCHAR U_3F3D +ENCODING 16189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +FD00 +B500 +59C0 +B540 +5AC0 +B640 +2A40 +46C0 +8360 +ENDCHAR +STARTCHAR U_3F3E +ENCODING 16190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +5500 +7D00 +55C0 +7D40 +4940 +6AC0 +BE40 +AA40 +BF60 +ENDCHAR +STARTCHAR U_3F3F +ENCODING 16191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +8900 +5100 +FDC0 +A940 +FAC0 +AA40 +FA40 +22C0 +FB60 +ENDCHAR +STARTCHAR U_3F40 +ENCODING 16192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +2900 +FD00 +ADC0 +D540 +FEC0 +1240 +FE40 +2A40 +C760 +ENDCHAR +STARTCHAR U_3F41 +ENCODING 16193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4CC0 +4880 +7FE0 +5DC0 +6AA0 +7FE0 +4800 +4F80 +94A0 +9AE0 +ENDCHAR +STARTCHAR U_3F42 +ENCODING 16194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +4BE0 +B500 +01C0 +7940 +4940 +FDC0 +B540 +6D40 +B520 +6DA0 +ENDCHAR +STARTCHAR U_3F43 +ENCODING 16195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +ABE0 +F900 +7100 +A9C0 +AB40 +FAC0 +AA40 +FA40 +AAE0 +FB20 +ENDCHAR +STARTCHAR U_3F44 +ENCODING 16196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +FD00 +59E0 +6940 +FD40 +4A40 +FFE0 +2000 +3F00 +4940 +64C0 +ENDCHAR +STARTCHAR U_3F45 +ENCODING 16197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EBE0 +B500 +5900 +85C0 +FD40 +0140 +7AC0 +4A40 +7A40 +4AC0 +FF60 +ENDCHAR +STARTCHAR U_3F46 +ENCODING 16198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A400 +6BE0 +F900 +89C0 +7140 +5140 +FAC0 +AA40 +FA40 +AAE0 +FB20 +ENDCHAR +STARTCHAR U_3F47 +ENCODING 16199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +2480 +3B80 +2480 +FFE0 +8020 +7F80 +1000 +1F00 +2540 +32C0 +ENDCHAR +STARTCHAR U_3F48 +ENCODING 16200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +59E0 +6040 +7BE0 +9140 +FD60 +4AC0 +FFE0 +1000 +3F80 +24A0 +72E0 +ENDCHAR +STARTCHAR U_3F49 +ENCODING 16201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9480 +EBE0 +92A0 +FBE0 +0000 +FFE0 +1000 +1F80 +24A0 +32E0 +ENDCHAR +STARTCHAR U_3F4A +ENCODING 16202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +FFE0 +5500 +7DC0 +AB40 +B940 +01C0 +7D40 +2540 +1960 +E7A0 +ENDCHAR +STARTCHAR U_3F4B +ENCODING 16203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +4480 +FFE0 +4440 +FFE0 +AAA0 +7FC0 +1000 +1F00 +2940 +35C0 +ENDCHAR +STARTCHAR U_3F4C +ENCODING 16204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +1100 +FF00 +D5C0 +7F40 +AB40 +FDC0 +5540 +7D40 +5560 +7DA0 +ENDCHAR +STARTCHAR U_3F4D +ENCODING 16205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +4900 +FD00 +49C0 +4940 +7AC0 +4A40 +4A40 +7AA0 +4B20 +ENDCHAR +STARTCHAR U_3F4E +ENCODING 16206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +4BE0 +7AA0 +4A80 +7880 +4940 +FD40 +B140 +C940 +FE60 +ENDCHAR +STARTCHAR U_3F4F +ENCODING 16207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +9280 +47C0 +1820 +E7C0 +4440 +47C0 +1100 +FFE0 +1500 +1F00 +ENDCHAR +STARTCHAR U_3F50 +ENCODING 16208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +57E0 +FA80 +57E0 +52A0 +7FE0 +52A0 +57E0 +5280 +76C0 +5AA0 +ENDCHAR +STARTCHAR U_3F51 +ENCODING 16209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +5280 +FFC0 +5540 +57C0 +5280 +7380 +5280 +5FE0 +5100 +7100 +ENDCHAR +STARTCHAR U_3F52 +ENCODING 16210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +AA80 +FFE0 +AC80 +F880 +23E0 +F880 +2880 +2880 +4880 +93E0 +ENDCHAR +STARTCHAR U_3F53 +ENCODING 16211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3F80 +4400 +BF80 +0400 +FFE0 +5280 +7BE0 +9480 +1080 +FBE0 +ENDCHAR +STARTCHAR U_3F54 +ENCODING 16212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +D880 +5280 +FBE0 +2280 +65C0 +9080 +5880 +B3E0 +5800 +27E0 +ENDCHAR +STARTCHAR U_3F55 +ENCODING 16213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +2480 +3F80 +0000 +FF80 +2080 +3FE0 +0020 +00E0 +ENDCHAR +STARTCHAR U_3F56 +ENCODING 16214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F900 +ABE0 +A920 +F920 +AA20 +AA20 +FA20 +0540 +0880 +ENDCHAR +STARTCHAR U_3F57 +ENCODING 16215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F900 +A900 +A900 +F900 +A900 +AA80 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_3F58 +ENCODING 16216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +FFE0 +A800 +AB80 +FA80 +AA80 +AA80 +FA80 +04A0 +18C0 +ENDCHAR +STARTCHAR U_3F59 +ENCODING 16217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FA40 +AC20 +AFE0 +FA80 +AA80 +AA80 +FA80 +04A0 +18E0 +ENDCHAR +STARTCHAR U_3F5A +ENCODING 16218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +2400 +7FC0 +8400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_3F5B +ENCODING 16219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FBE0 +AC20 +A820 +FBA0 +AAA0 +ABA0 +F820 +0020 +00C0 +ENDCHAR +STARTCHAR U_3F5C +ENCODING 16220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +8A40 +52A0 +23E0 +C000 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_3F5D +ENCODING 16221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FC40 +2140 +3940 +4940 +B140 +20C0 +FF80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_3F5E +ENCODING 16222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +F780 +9480 +9480 +F780 +0000 +7F00 +4900 +7F00 +4900 +7F00 +ENDCHAR +STARTCHAR U_3F5F +ENCODING 16223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +0700 +FAA0 +AAA0 +A940 +F840 +AFE0 +A840 +F940 +0040 +00C0 +ENDCHAR +STARTCHAR U_3F60 +ENCODING 16224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FFE0 +A940 +AD40 +FBA0 +A900 +A900 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_3F61 +ENCODING 16225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +03E0 +FAA0 +ABE0 +AAA0 +FBE0 +A940 +AA40 +FBE0 +0040 +0040 +ENDCHAR +STARTCHAR U_3F62 +ENCODING 16226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +07E0 +F940 +AAA0 +AFE0 +FAA0 +ABE0 +AAA0 +FBE0 +0080 +00E0 +ENDCHAR +STARTCHAR U_3F63 +ENCODING 16227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +00A0 +FFE0 +A880 +AE80 +FAA0 +AAA0 +AEC0 +F8A0 +0F60 +0220 +ENDCHAR +STARTCHAR U_3F64 +ENCODING 16228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +F920 +AD60 +ABA0 +FFE0 +A920 +ABA0 +FD60 +0120 +00C0 +ENDCHAR +STARTCHAR U_3F65 +ENCODING 16229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F880 +AFE0 +A9A0 +FA80 +AD80 +A880 +ABE0 +F880 +02C0 +04A0 +ENDCHAR +STARTCHAR U_3F66 +ENCODING 16230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3B80 +2A80 +C440 +7FE0 +8020 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_3F67 +ENCODING 16231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +07E0 +FA40 +AA40 +AC80 +FDA0 +AAE0 +AA40 +FE80 +05A0 +06E0 +ENDCHAR +STARTCHAR U_3F68 +ENCODING 16232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +07E0 +F900 +AFC0 +A900 +FFE0 +AA00 +ABE0 +FC80 +0480 +0BE0 +ENDCHAR +STARTCHAR U_3F69 +ENCODING 16233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0240 +FBC0 +AA40 +ADA0 +FF60 +A940 +AEA0 +FB40 +0080 +0700 +ENDCHAR +STARTCHAR U_3F6A +ENCODING 16234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0FE0 +F920 +ABA0 +A920 +FFE0 +AA40 +ABC0 +FA40 +0240 +03C0 +ENDCHAR +STARTCHAR U_3F6B +ENCODING 16235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5280 +F7E0 +5A80 +62E0 +BF80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_3F6C +ENCODING 16236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0000 +F3C0 +9240 +F3C0 +0000 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_3F6D +ENCODING 16237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +AFE0 +A920 +FBC0 +A900 +AFE0 +F100 +8FE0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_3F6E +ENCODING 16238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +A4A0 +FFE0 +A4A0 +7FC0 +4400 +BF80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_3F6F +ENCODING 16239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +07E0 +FA80 +AFE0 +AA80 +FBE0 +AA80 +AFE0 +FAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_3F70 +ENCODING 16240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7DE0 +5460 +5440 +7D40 +5560 +5540 +7D40 +5540 +55C0 +BE60 +ENDCHAR +STARTCHAR U_3F71 +ENCODING 16241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6440 +2440 +2440 +6440 +A5C0 +2640 +4040 +8040 +ENDCHAR +STARTCHAR U_3F72 +ENCODING 16242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2200 +2400 +6FE0 +A020 +2020 +4140 +8080 +ENDCHAR +STARTCHAR U_3F73 +ENCODING 16243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2100 +2100 +6FE0 +A100 +2100 +4500 +8300 +ENDCHAR +STARTCHAR U_3F74 +ENCODING 16244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A080 +6080 +3FE0 +2080 +6480 +A500 +2200 +4500 +98E0 +ENDCHAR +STARTCHAR U_3F75 +ENCODING 16245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6200 +2200 +2200 +6FC0 +A200 +2200 +4200 +9FE0 +ENDCHAR +STARTCHAR U_3F76 +ENCODING 16246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2040 +2040 +6FC0 +A800 +2820 +4820 +87E0 +ENDCHAR +STARTCHAR U_3F77 +ENCODING 16247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +3D20 +25A0 +65C0 +A940 +3140 +4520 +8300 +ENDCHAR +STARTCHAR U_3F78 +ENCODING 16248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2A20 +6200 +A300 +2520 +4920 +90E0 +ENDCHAR +STARTCHAR U_3F79 +ENCODING 16249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +61C0 +2E00 +2800 +6FC0 +AC40 +2A80 +5100 +A6C0 +ENDCHAR +STARTCHAR U_3F7A +ENCODING 16250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2480 +24E0 +6620 +A540 +2880 +5140 +A620 +ENDCHAR +STARTCHAR U_3F7B +ENCODING 16251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2100 +6FE0 +A440 +2280 +4100 +8EE0 +ENDCHAR +STARTCHAR U_3F7C +ENCODING 16252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F40 +2140 +2F40 +6840 +AF40 +2140 +4540 +8240 +ENDCHAR +STARTCHAR U_3F7D +ENCODING 16253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2100 +6100 +A7C0 +2440 +4440 +87C0 +ENDCHAR +STARTCHAR U_3F7E +ENCODING 16254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +2920 +2920 +6FE0 +A100 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_3F7F +ENCODING 16255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +61C0 +2E80 +2A80 +6A80 +AA40 +2B40 +52A0 +A320 +ENDCHAR +STARTCHAR U_3F80 +ENCODING 16256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +27C0 +2100 +6FE0 +A100 +2240 +44E0 +8F20 +ENDCHAR +STARTCHAR U_3F81 +ENCODING 16257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +6120 +2100 +2FE0 +6100 +A380 +2540 +4920 +9120 +ENDCHAR +STARTCHAR U_3F82 +ENCODING 16258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A200 +6400 +2840 +2FE0 +6020 +AFC0 +2840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3F83 +ENCODING 16259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6100 +2FE0 +2820 +6480 +A500 +2600 +4440 +83C0 +ENDCHAR +STARTCHAR U_3F84 +ENCODING 16260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FE0 +2920 +6920 +AFE0 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_3F85 +ENCODING 16261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +61C0 +2F00 +2900 +6FE0 +A320 +2520 +4960 +9100 +ENDCHAR +STARTCHAR U_3F86 +ENCODING 16262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +27C0 +2540 +67C0 +A540 +2FE0 +4440 +84C0 +ENDCHAR +STARTCHAR U_3F87 +ENCODING 16263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +2FC0 +6840 +AFC0 +2840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3F88 +ENCODING 16264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6440 +2440 +2BE0 +7840 +AA40 +2940 +4840 +88C0 +ENDCHAR +STARTCHAR U_3F89 +ENCODING 16265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2C60 +2380 +6000 +A7C0 +2040 +4380 +8080 +ENDCHAR +STARTCHAR U_3F8A +ENCODING 16266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +2FE0 +6920 +A960 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_3F8B +ENCODING 16267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6480 +2480 +2BE0 +7880 +A9C0 +2AA0 +4AA0 +8880 +ENDCHAR +STARTCHAR U_3F8C +ENCODING 16268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +67C0 +2900 +2100 +6FE0 +A280 +2280 +44A0 +9860 +ENDCHAR +STARTCHAR U_3F8D +ENCODING 16269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2100 +2200 +6FE0 +AAA0 +2AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_3F8E +ENCODING 16270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6EE0 +2AA0 +2AA0 +6AA0 +ABA0 +2820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_3F8F +ENCODING 16271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +67C0 +2100 +2FE0 +6000 +A100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3F90 +ENCODING 16272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7E20 +28A0 +2EA0 +72A0 +AAA0 +24A0 +4820 +9060 +ENDCHAR +STARTCHAR U_3F91 +ENCODING 16273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +6480 +2840 +77A0 +A000 +2FC0 +4840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3F92 +ENCODING 16274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +6AE0 +3FA0 +6AA0 +AAA0 +3AA0 +44A0 +4AE0 +9200 +ENDCHAR +STARTCHAR U_3F93 +ENCODING 16275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AFC0 +6840 +2FC0 +2000 +6FC0 +A840 +2E40 +49C0 +8840 +ENDCHAR +STARTCHAR U_3F94 +ENCODING 16276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2440 +67C0 +A000 +2FE0 +4820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_3F95 +ENCODING 16277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2440 +6280 +AFE0 +2100 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_3F96 +ENCODING 16278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AFE0 +6920 +2FE0 +2920 +6FE0 +A100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3F97 +ENCODING 16279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FC0 +2840 +6FC0 +A840 +2FC0 +4A40 +4980 +8CE0 +ENDCHAR +STARTCHAR U_3F98 +ENCODING 16280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2920 +6FE0 +A920 +2FE0 +4500 +4200 +8DE0 +ENDCHAR +STARTCHAR U_3F99 +ENCODING 16281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AC40 +6380 +2C40 +6200 +AFE0 +2500 +4FC0 +5540 +8100 +ENDCHAR +STARTCHAR U_3F9A +ENCODING 16282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +66E0 +3480 +36A0 +78E0 +A000 +27C0 +4000 +8FE0 +ENDCHAR +STARTCHAR U_3F9B +ENCODING 16283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A040 +67C0 +2040 +27C0 +6FE0 +ABA0 +2280 +4100 +8EE0 +ENDCHAR +STARTCHAR U_3F9C +ENCODING 16284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +2540 +6540 +ABA0 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_3F9D +ENCODING 16285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +27C0 +2540 +67C0 +A540 +27C0 +4FE0 +8100 +ENDCHAR +STARTCHAR U_3F9E +ENCODING 16286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2280 +2FE0 +6AA0 +AC60 +2BA0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_3F9F +ENCODING 16287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +65C0 +2500 +2FE0 +6100 +A520 +2940 +4180 +8E00 +ENDCHAR +STARTCHAR U_3FA0 +ENCODING 16288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6BC0 +2480 +2C80 +65C0 +AC80 +2480 +4480 +89C0 +ENDCHAR +STARTCHAR U_3FA1 +ENCODING 16289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +64E0 +2EA0 +64A0 +BFA0 +24A0 +4AE0 +5F80 +8080 +ENDCHAR +STARTCHAR U_3FA2 +ENCODING 16290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2520 +6940 +B5A0 +2300 +4580 +4940 +9120 +ENDCHAR +STARTCHAR U_3FA3 +ENCODING 16291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7DC0 +2000 +2F80 +6200 +BFC0 +3240 +4A80 +9FC0 +ENDCHAR +STARTCHAR U_3FA4 +ENCODING 16292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2820 +2280 +6C60 +A7C0 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3FA5 +ENCODING 16293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6700 +24E0 +7FA0 +A4A0 +2EA0 +55A0 +4440 +8CA0 +ENDCHAR +STARTCHAR U_3FA6 +ENCODING 16294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2440 +2280 +6FE0 +A000 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_3FA7 +ENCODING 16295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AFE0 +6920 +2FE0 +2920 +6FE0 +A100 +2FE0 +4380 +8D60 +ENDCHAR +STARTCHAR U_3FA8 +ENCODING 16296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +2EE0 +6000 +AFE0 +2540 +4740 +80C0 +ENDCHAR +STARTCHAR U_3FA9 +ENCODING 16297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A0C0 +6F00 +2200 +7FE0 +AA80 +3AE0 +4A80 +5A80 +8A60 +ENDCHAR +STARTCHAR U_3FAA +ENCODING 16298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6AC0 +3320 +2FC0 +7840 +AF40 +2BC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_3FAB +ENCODING 16299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2820 +2FE0 +6800 +AFE0 +2AA0 +5FE0 +AAA0 +ENDCHAR +STARTCHAR U_3FAC +ENCODING 16300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6EE0 +2880 +2EE0 +6400 +AFE0 +2B20 +49A0 +8FE0 +ENDCHAR +STARTCHAR U_3FAD +ENCODING 16301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7C80 +2AA0 +3EA0 +69C0 +BC80 +3B40 +4940 +8A20 +ENDCHAR +STARTCHAR U_3FAE +ENCODING 16302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A7C0 +6440 +27C0 +2440 +6FE0 +A100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_3FAF +ENCODING 16303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F80 +2A80 +2F80 +6A80 +BFE0 +2A40 +4980 +8CE0 +ENDCHAR +STARTCHAR U_3FB0 +ENCODING 16304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +64E0 +3FA0 +64E0 +A4A0 +3EE0 +52A0 +52A0 +9F60 +ENDCHAR +STARTCHAR U_3FB1 +ENCODING 16305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7EA0 +2AC0 +6440 +BFE0 +2480 +2FC0 +44A0 +98E0 +ENDCHAR +STARTCHAR U_3FB2 +ENCODING 16306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +A500 +7FE0 +2540 +3F40 +6540 +BE80 +2880 +4F40 +B220 +ENDCHAR +STARTCHAR U_3FB3 +ENCODING 16307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7BE0 +24A0 +2880 +7360 +A480 +3FE0 +4480 +9F40 +ENDCHAR +STARTCHAR U_3FB4 +ENCODING 16308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A80 +7240 +AFA0 +2880 +4F80 +4880 +BFE0 +ENDCHAR +STARTCHAR U_3FB5 +ENCODING 16309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +3FE0 +A440 +7E40 +21E0 +6E40 +A040 +2E40 +4A40 +8E40 +ENDCHAR +STARTCHAR U_3FB6 +ENCODING 16310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6B80 +2A80 +3FE0 +68A0 +AF80 +2880 +4F80 +8880 +ENDCHAR +STARTCHAR U_3FB7 +ENCODING 16311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +DFC0 +5100 +57E0 +D540 +57E0 +5540 +5540 +AA60 +ENDCHAR +STARTCHAR U_3FB8 +ENCODING 16312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +AFE0 +6000 +27C0 +6440 +AFE0 +2AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_3FB9 +ENCODING 16313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +2280 +ABE0 +6A80 +3F60 +6100 +BFE0 +2580 +4940 +9120 +ENDCHAR +STARTCHAR U_3FBA +ENCODING 16314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2900 +AFC0 +6900 +2FC0 +6900 +AFE0 +2520 +5520 +90C0 +ENDCHAR +STARTCHAR U_3FBB +ENCODING 16315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4080 +5D40 +D620 +59C0 +5480 +D7E0 +5C80 +52C0 +95A0 +ENDCHAR +STARTCHAR U_3FBC +ENCODING 16316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2240 +ABC0 +7E40 +2BC0 +6AA0 +AA40 +2B20 +5C00 +83E0 +ENDCHAR +STARTCHAR U_3FBD +ENCODING 16317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2080 +B100 +6BC0 +3E40 +6BE0 +AA20 +2BE0 +5C00 +A3E0 +ENDCHAR +STARTCHAR U_3FBE +ENCODING 16318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +BFE0 +6540 +3FE0 +6540 +AFC0 +2500 +4D40 +9520 +ENDCHAR +STARTCHAR U_3FBF +ENCODING 16319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6EE0 +2AA0 +6EC0 +AAA0 +2EA0 +28A0 +4AE0 +8D80 +ENDCHAR +STARTCHAR U_3FC0 +ENCODING 16320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4100 +F9E0 +5540 +5540 +7DE0 +D540 +5140 +5A40 +B5E0 +ENDCHAR +STARTCHAR U_3FC1 +ENCODING 16321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FC0 +2940 +2A40 +7FE0 +A940 +37A0 +4100 +8100 +ENDCHAR +STARTCHAR U_3FC2 +ENCODING 16322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +55E0 +DF40 +4140 +5F40 +C940 +5C80 +4940 +9E20 +ENDCHAR +STARTCHAR U_3FC3 +ENCODING 16323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +D540 +7FE0 +5540 +6FA0 +D240 +5FC0 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_3FC4 +ENCODING 16324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +D540 +5E20 +55C0 +DF40 +5540 +5A80 +9F60 +ENDCHAR +STARTCHAR U_3FC5 +ENCODING 16325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +AAE0 +7680 +2BE0 +7880 +AAE0 +2A80 +4B80 +8C60 +ENDCHAR +STARTCHAR U_3FC6 +ENCODING 16326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2100 +7FE0 +A940 +3FE0 +2540 +5880 +8C60 +ENDCHAR +STARTCHAR U_3FC7 +ENCODING 16327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6660 +3AA0 +2220 +67C0 +A440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_3FC8 +ENCODING 16328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7140 +2FE0 +2940 +73E0 +AD40 +25E0 +4940 +91E0 +ENDCHAR +STARTCHAR U_3FC9 +ENCODING 16329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6F80 +2A80 +7FE0 +A880 +2F80 +2880 +4F80 +9040 +ENDCHAR +STARTCHAR U_3FCA +ENCODING 16330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +DFE0 +5540 +6660 +4000 +CFC0 +4940 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_3FCB +ENCODING 16331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6FE0 +2920 +6FE0 +A100 +3FE0 +2100 +4540 +9920 +ENDCHAR +STARTCHAR U_3FCC +ENCODING 16332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2C60 +6380 +AEE0 +2AA0 +2EE0 +4440 +9BA0 +ENDCHAR +STARTCHAR U_3FCD +ENCODING 16333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7FE0 +24A0 +3F20 +6A40 +BFE0 +2A40 +7FE0 +AA40 +ENDCHAR +STARTCHAR U_3FCE +ENCODING 16334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2540 +3FE0 +6440 +A7C0 +2440 +47C0 +9820 +ENDCHAR +STARTCHAR U_3FCF +ENCODING 16335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2480 +3F80 +6900 +B7C0 +2100 +4FC0 +8100 +ENDCHAR +STARTCHAR U_3FD0 +ENCODING 16336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +5EE0 +C5A0 +7E40 +44A0 +D7A0 +5440 +5C80 +A3E0 +ENDCHAR +STARTCHAR U_3FD1 +ENCODING 16337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6660 +3BA0 +2480 +6BE0 +B880 +2BE0 +4880 +8BE0 +ENDCHAR +STARTCHAR U_3FD2 +ENCODING 16338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2100 +2FE0 +6240 +BFE0 +2A40 +4F40 +80C0 +ENDCHAR +STARTCHAR U_3FD3 +ENCODING 16339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A40 +37A0 +6CC0 +B7A0 +2AC0 +4F00 +91E0 +ENDCHAR +STARTCHAR U_3FD4 +ENCODING 16340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A540 +67C0 +2540 +6FE0 +AAA0 +2FE0 +2AA0 +4FE0 +8820 +ENDCHAR +STARTCHAR U_3FD5 +ENCODING 16341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6EE0 +2B20 +6DA0 +A8A0 +2DA0 +28A0 +4FA0 +8860 +ENDCHAR +STARTCHAR U_3FD6 +ENCODING 16342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2940 +6E80 +ABE0 +2AA0 +2FE0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_3FD7 +ENCODING 16343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6EE0 +2440 +7FE0 +A4A0 +2EE0 +35A0 +4AE0 +9B20 +ENDCHAR +STARTCHAR U_3FD8 +ENCODING 16344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +6AA0 +DDC0 +5540 +6220 +7FE0 +C8A0 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_3FD9 +ENCODING 16345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A540 +7FE0 +2AA0 +3FE0 +6200 +BFE0 +2480 +4840 +B020 +ENDCHAR +STARTCHAR U_3FDA +ENCODING 16346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +DFC0 +5100 +7E80 +53E0 +FE80 +53E0 +6A80 +ABE0 +ENDCHAR +STARTCHAR U_3FDB +ENCODING 16347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6EE0 +2AA0 +6FE0 +AAA0 +2FE0 +2AA0 +4AC0 +9360 +ENDCHAR +STARTCHAR U_3FDC +ENCODING 16348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6FC0 +2A40 +6FC0 +AA80 +3FE0 +5540 +5FC0 +9540 +ENDCHAR +STARTCHAR U_3FDD +ENCODING 16349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +2000 +7F80 +4080 +7F80 +4080 +7F80 +2000 +4080 +80C0 +7F40 +ENDCHAR +STARTCHAR U_3FDE +ENCODING 16350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +4700 +F100 +91E0 +9700 +F100 +91E0 +9F00 +F100 +9120 +00E0 +ENDCHAR +STARTCHAR U_3FDF +ENCODING 16351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4100 +F7E0 +9420 +9420 +F7E0 +9420 +9420 +9420 +F7E0 +9420 +ENDCHAR +STARTCHAR U_3FE0 +ENCODING 16352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4920 +F540 +9380 +9FE0 +F280 +9280 +9280 +F2A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_3FE1 +ENCODING 16353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +4A40 +2B80 +4A40 +1220 +E1E0 +ENDCHAR +STARTCHAR U_3FE2 +ENCODING 16354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +F780 +9480 +F780 +9480 +F780 +0C80 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_3FE3 +ENCODING 16355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4440 +F7C0 +9440 +97C0 +F400 +97E0 +9D20 +F6A0 +07A0 +0060 +ENDCHAR +STARTCHAR U_3FE4 +ENCODING 16356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +F100 +97C0 +9200 +FFE0 +9640 +9BE0 +F240 +03C0 +0240 +ENDCHAR +STARTCHAR U_3FE5 +ENCODING 16357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +F920 +9280 +97E0 +FC80 +97E0 +9480 +F7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_3FE6 +ENCODING 16358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2260 +FDC0 +AA40 +F980 +9260 +BF80 +2480 +2880 +3F80 +ENDCHAR +STARTCHAR U_3FE7 +ENCODING 16359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +8100 +FFE0 +A120 +AFC0 +E040 +BFE0 +AA40 +EF40 +00C0 +ENDCHAR +STARTCHAR U_3FE8 +ENCODING 16360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +8920 +EEC0 +AA40 +AFE0 +EA40 +AFE0 +AA40 +EAE0 +1280 +17E0 +ENDCHAR +STARTCHAR U_3FE9 +ENCODING 16361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +4FE0 +8AA0 +F7C0 +9540 +97C0 +F100 +97C0 +9100 +FFE0 +0AA0 +ENDCHAR +STARTCHAR U_3FEA +ENCODING 16362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +A940 +A140 +FB40 +89C0 +B140 +9240 +AA40 +C460 +ENDCHAR +STARTCHAR U_3FEB +ENCODING 16363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +4220 +79E0 +0400 +7FC0 +4440 +5F80 +4880 +4700 +B8E0 +ENDCHAR +STARTCHAR U_3FEC +ENCODING 16364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +AAA0 +A2A0 +FBE0 +8A00 +D200 +A200 +B200 +CA20 +81E0 +ENDCHAR +STARTCHAR U_3FED +ENCODING 16365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +43E0 +7EA0 +5280 +53E0 +5AA0 +56A0 +5240 +92A0 +1520 +ENDCHAR +STARTCHAR U_3FEE +ENCODING 16366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AA80 +ABE0 +FEA0 +22A0 +5240 +4AA0 +8520 +ENDCHAR +STARTCHAR U_3FEF +ENCODING 16367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +E0E0 +3F80 +2080 +3F80 +0400 +7FC0 +4440 +5F80 +4900 +BFE0 +ENDCHAR +STARTCHAR U_3FF0 +ENCODING 16368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +52A0 +8A80 +53E0 +2220 +2240 +5340 +4A80 +8AC0 +0520 +ENDCHAR +STARTCHAR U_3FF1 +ENCODING 16369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FB00 +23E0 +7280 +2480 +1FC0 +1440 +1F00 +1500 +1200 +2D80 +ENDCHAR +STARTCHAR U_3FF2 +ENCODING 16370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +52A0 +8A80 +FBE0 +0B20 +EAA0 +AA40 +EAA0 +1D00 +ENDCHAR +STARTCHAR U_3FF3 +ENCODING 16371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22A0 +FD40 +AAA0 +A2A0 +F800 +8BE0 +D2A0 +A3E0 +B2A0 +CBE0 +ENDCHAR +STARTCHAR U_3FF4 +ENCODING 16372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +52A0 +FA80 +53E0 +7220 +52A0 +7240 +FAA0 +1500 +ENDCHAR +STARTCHAR U_3FF5 +ENCODING 16373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +A5A0 +F5A0 +95A0 +D100 +A7E0 +B100 +CA80 +8460 +ENDCHAR +STARTCHAR U_3FF6 +ENCODING 16374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +53E0 +FEA0 +A680 +FBE0 +2220 +7B40 +4A80 +8B40 +1C20 +ENDCHAR +STARTCHAR U_3FF7 +ENCODING 16375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +23E0 +FAA0 +2280 +FBE0 +2220 +7B40 +9280 +1540 +7A20 +ENDCHAR +STARTCHAR U_3FF8 +ENCODING 16376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FB40 +AA40 +A7E0 +A520 +FFE0 +8800 +ABC0 +9140 +A880 +CB60 +ENDCHAR +STARTCHAR U_3FF9 +ENCODING 16377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +A880 +A3E0 +FD40 +97E0 +D480 +A7E0 +A480 +D480 +8BE0 +ENDCHAR +STARTCHAR U_3FFA +ENCODING 16378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +FBE0 +8AA0 +FA80 +5280 +FBE0 +5220 +AAA0 +7240 +72A0 +AD20 +ENDCHAR +STARTCHAR U_3FFB +ENCODING 16379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0000 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFC +ENCODING 16380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +1100 +FFE0 +1100 +1100 +2100 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFD +ENCODING 16381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F40 +8820 +1F80 +0080 +0500 +0200 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFE +ENCODING 16382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0400 +0400 +0C00 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_3FFF +ENCODING 16383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0440 +2700 +3400 +4FE0 +8000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4000 +ENCODING 16384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8540 +5480 +2420 +C3E0 +4000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4001 +ENCODING 16385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +1F00 +3100 +DF00 +1100 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4002 +ENCODING 16386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4420 +BFC0 +1100 +0E00 +1100 +FFE0 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4003 +ENCODING 16387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +7580 +0E00 +7500 +0CE0 +7400 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4004 +ENCODING 16388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4A40 +1680 +5540 +8F40 +1000 +7F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4005 +ENCODING 16389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F100 +17C0 +2900 +6100 +AFE0 +2000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4006 +ENCODING 16390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0480 +FFE0 +1480 +6B00 +1080 +FFE0 +2A80 +2A80 +FFC0 +ENDCHAR +STARTCHAR U_4007 +ENCODING 16391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +F7C0 +2900 +F7C0 +9100 +9540 +F7C0 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4008 +ENCODING 16392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8880 +FA80 +8BE0 +F980 +92A0 +F460 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4009 +ENCODING 16393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +FFE0 +2A80 +DF60 +1100 +1D00 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_400A +ENCODING 16394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +8660 +5AA0 +2500 +DAE0 +4500 +5FC0 +1540 +1540 +7FE0 +ENDCHAR +STARTCHAR U_400B +ENCODING 16395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2500 +F9E0 +2100 +27E0 +3EA0 +C560 +3FE0 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_400C +ENCODING 16396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0400 +7FC0 +2480 +5540 +3F80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_400D +ENCODING 16397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFC0 +5480 +FB00 +74E0 +5780 +FF80 +28C0 +3F80 +2A80 +FFC0 +ENDCHAR +STARTCHAR U_400E +ENCODING 16398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F200 +9200 +F400 +9400 +F7C0 +9040 +9040 +F040 +9280 +0100 +ENDCHAR +STARTCHAR U_400F +ENCODING 16399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +2020 +5E20 +9220 +1E20 +1220 +1E20 +1220 +1EA0 +0040 +ENDCHAR +STARTCHAR U_4010 +ENCODING 16400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +F840 +8B80 +8800 +F820 +8840 +FB80 +8800 +8820 +F840 +0380 +ENDCHAR +STARTCHAR U_4011 +ENCODING 16401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +EFC0 +A240 +E940 +A480 +A280 +E100 +A280 +A480 +E840 +1020 +ENDCHAR +STARTCHAR U_4012 +ENCODING 16402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +9100 +F100 +9FE0 +F100 +9100 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_4013 +ENCODING 16403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +9200 +9F80 +F280 +9A80 +F680 +92A0 +95A0 +F4A0 +0860 +ENDCHAR +STARTCHAR U_4014 +ENCODING 16404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F120 +9120 +9520 +F520 +9920 +F120 +9220 +9220 +F4A0 +0840 +ENDCHAR +STARTCHAR U_4015 +ENCODING 16405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0720 +F120 +9720 +9420 +F420 +9720 +F120 +9120 +9120 +F520 +0220 +ENDCHAR +STARTCHAR U_4016 +ENCODING 16406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +FFE0 +9100 +F280 +9280 +9440 +F440 +0820 +ENDCHAR +STARTCHAR U_4017 +ENCODING 16407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97C0 +F240 +9240 +9FE0 +F200 +9500 +F500 +0880 +1060 +ENDCHAR +STARTCHAR U_4018 +ENCODING 16408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F280 +9280 +9280 +FFE0 +9280 +F280 +9280 +9280 +F480 +0880 +ENDCHAR +STARTCHAR U_4019 +ENCODING 16409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +F4A0 +94A0 +9EA0 +F4A0 +94A0 +F4A0 +96A0 +94A0 +F120 +0260 +ENDCHAR +STARTCHAR U_401A +ENCODING 16410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +6900 +5500 +7F00 +2000 +C780 +9480 +9480 +D580 +2400 +C400 +ENDCHAR +STARTCHAR U_401B +ENCODING 16411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +9AA0 +F2A0 +94A0 +F920 +9120 +9220 +F4A0 +0040 +ENDCHAR +STARTCHAR U_401C +ENCODING 16412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 0 -1 +BITMAP +2000 +3F80 +4A80 +9280 +2480 +4900 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_401D +ENCODING 16413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +9520 +95C0 +F700 +9500 +F500 +9500 +9520 +F720 +04E0 +ENDCHAR +STARTCHAR U_401E +ENCODING 16414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F480 +9280 +9880 +F480 +9480 +F0E0 +9380 +9C80 +F080 +0080 +ENDCHAR +STARTCHAR U_401F +ENCODING 16415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +97E0 +92A0 +F7E0 +9680 +F7E0 +92A0 +94E0 +F480 +0880 +ENDCHAR +STARTCHAR U_4020 +ENCODING 16416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9420 +F7E0 +9420 +9420 +F7E0 +9420 +9420 +F7E0 +0420 +ENDCHAR +STARTCHAR U_4021 +ENCODING 16417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +91E0 +F100 +9100 +97E0 +F420 +9420 +9420 +F7E0 +0420 +ENDCHAR +STARTCHAR U_4022 +ENCODING 16418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97C0 +9A00 +F200 +9FC0 +F200 +9200 +9500 +F480 +0860 +ENDCHAR +STARTCHAR U_4023 +ENCODING 16419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F140 +9240 +F280 +9680 +F6C0 +9B20 +9260 +F240 +05C0 +1800 +ENDCHAR +STARTCHAR U_4024 +ENCODING 16420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3D00 +2540 +D520 +0920 +3100 +DF80 +1280 +1980 +1480 +1F80 +ENDCHAR +STARTCHAR U_4025 +ENCODING 16421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0700 +F400 +9500 +F500 +97E0 +F140 +9540 +F520 +0920 +0300 +ENDCHAR +STARTCHAR U_4026 +ENCODING 16422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9100 +FFE0 +9100 +9100 +F7C0 +9440 +F440 +97C0 +0440 +ENDCHAR +STARTCHAR U_4027 +ENCODING 16423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +97C0 +F280 +9280 +FFE0 +9000 +9280 +F280 +9240 +0440 +ENDCHAR +STARTCHAR U_4028 +ENCODING 16424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +F100 +9FE0 +9100 +F100 +97C0 +9440 +F440 +07C0 +ENDCHAR +STARTCHAR U_4029 +ENCODING 16425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9840 +F480 +9300 +9CE0 +F000 +97C0 +9440 +F440 +07C0 +ENDCHAR +STARTCHAR U_402A +ENCODING 16426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5C0 +A800 +F400 +A7E0 +E880 +B880 +A880 +E880 +0A80 +0900 +ENDCHAR +STARTCHAR U_402B +ENCODING 16427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +F280 +9440 +FBA0 +9000 +97C0 +F440 +0440 +07C0 +ENDCHAR +STARTCHAR U_402C +ENCODING 16428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F280 +9440 +F820 +97C0 +F100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_402D +ENCODING 16429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9200 +F480 +9740 +F240 +9480 +F900 +1280 +0460 +ENDCHAR +STARTCHAR U_402E +ENCODING 16430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +A800 +E800 +AFC0 +E000 +AA80 +EAA0 +0AA0 +1260 +ENDCHAR +STARTCHAR U_402F +ENCODING 16431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +F140 +9FE0 +F100 +97C0 +F540 +97C0 +9540 +F7C0 +0540 +04C0 +ENDCHAR +STARTCHAR U_4030 +ENCODING 16432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +9920 +F280 +9440 +F820 +97C0 +9440 +F440 +97C0 +ENDCHAR +STARTCHAR U_4031 +ENCODING 16433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7C0 +AC40 +E380 +AD60 +A7C0 +E100 +A7C0 +A100 +EFE0 +0100 +ENDCHAR +STARTCHAR U_4032 +ENCODING 16434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A800 +E7C0 +A540 +BFE0 +EA40 +A940 +AFE0 +E040 +00C0 +ENDCHAR +STARTCHAR U_4033 +ENCODING 16435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +E540 +A7C0 +E100 +A380 +A540 +E920 +0100 +ENDCHAR +STARTCHAR U_4034 +ENCODING 16436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +AA80 +AA80 +E540 +A000 +A7C0 +E100 +A100 +A100 +EFE0 +ENDCHAR +STARTCHAR U_4035 +ENCODING 16437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E480 +AFC0 +A840 +E400 +AFE0 +A100 +EFE0 +A100 +A280 +EC60 +ENDCHAR +STARTCHAR U_4036 +ENCODING 16438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +E100 +AFC0 +A840 +EFC0 +A840 +AFC0 +EA00 +AAC0 +A900 +E900 +0CC0 +ENDCHAR +STARTCHAR U_4037 +ENCODING 16439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +AE80 +A5E0 +E4A0 +BFA0 +A4A0 +EAA0 +BFA0 +A120 +E260 +ENDCHAR +STARTCHAR U_4038 +ENCODING 16440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +7240 +A240 +6440 +3F80 +3480 +2A80 +2580 +3F80 +ENDCHAR +STARTCHAR U_4039 +ENCODING 16441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +AA80 +EA80 +B740 +A200 +E200 +A500 +A880 +F060 +ENDCHAR +STARTCHAR U_403A +ENCODING 16442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11E0 +2B40 +6880 +A940 +2220 +3FC0 +3240 +2940 +24C0 +3FC0 +ENDCHAR +STARTCHAR U_403B +ENCODING 16443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +A7C0 +E540 +BFE0 +A400 +EFE0 +A040 +A280 +E100 +ENDCHAR +STARTCHAR U_403C +ENCODING 16444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +AF80 +E800 +AFE0 +AA80 +EAA0 +AAC0 +AA80 +EA40 +1320 +ENDCHAR +STARTCHAR U_403D +ENCODING 16445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +EDC0 +A440 +E440 +A860 +A540 +E540 +B540 +A9E0 +E800 +17E0 +ENDCHAR +STARTCHAR U_403E +ENCODING 16446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2140 +7880 +A940 +3A20 +0000 +3FC0 +3240 +2940 +24C0 +3FC0 +ENDCHAR +STARTCHAR U_403F +ENCODING 16447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E460 +AF80 +E500 +A5E0 +A540 +E740 +BD40 +A540 +E540 +0E40 +ENDCHAR +STARTCHAR U_4040 +ENCODING 16448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +10C0 +7B00 +1200 +3BE0 +D280 +3480 +ENDCHAR +STARTCHAR U_4041 +ENCODING 16449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A000 +A7C0 +E440 +A7C0 +E100 +A380 +A540 +E920 +0300 +ENDCHAR +STARTCHAR U_4042 +ENCODING 16450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A240 +F280 +9100 +F280 +A460 +FF80 +4080 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_4043 +ENCODING 16451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +EFC0 +A200 +BFE0 +E200 +A540 +AC80 +F540 +0620 +ENDCHAR +STARTCHAR U_4044 +ENCODING 16452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF80 +A200 +BFC0 +E500 +A200 +FFC0 +A200 +BFE0 +E200 +0200 +ENDCHAR +STARTCHAR U_4045 +ENCODING 16453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A080 +A100 +EFE0 +A100 +A300 +EFE0 +AAA0 +AAA0 +EAA0 +1FE0 +ENDCHAR +STARTCHAR U_4046 +ENCODING 16454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +BFC0 +A500 +FAC0 +AF80 +AA80 +EF80 +AA80 +AF80 +E220 +03E0 +ENDCHAR +STARTCHAR U_4047 +ENCODING 16455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +94A0 +5340 +3CA0 +5F80 +0000 +7FC0 +5240 +4940 +7FC0 +ENDCHAR +STARTCHAR U_4048 +ENCODING 16456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +4540 +7C80 +4160 +BF80 +2480 +3280 +2980 +2480 +3F80 +ENDCHAR +STARTCHAR U_4049 +ENCODING 16457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7FE0 +4940 +79A0 +42C0 +BF80 +2480 +3280 +2980 +2480 +3F80 +ENDCHAR +STARTCHAR U_404A +ENCODING 16458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A280 +A100 +E280 +AC60 +A7C0 +E7C0 +A440 +A7C0 +E440 +07C0 +ENDCHAR +STARTCHAR U_404B +ENCODING 16459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +BFE0 +AA80 +EB80 +AFE0 +A100 +EFE0 +A380 +A540 +E920 +0100 +ENDCHAR +STARTCHAR U_404C +ENCODING 16460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +AFE0 +E920 +AFE0 +A440 +E7C0 +A440 +A7C0 +E440 +04C0 +ENDCHAR +STARTCHAR U_404D +ENCODING 16461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +EFE0 +A880 +EF80 +A8A0 +AEA0 +EAC0 +AE80 +A980 +EAA0 +1060 +ENDCHAR +STARTCHAR U_404E +ENCODING 16462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A000 +E7C0 +A440 +AFE0 +E820 +A7C0 +A100 +E100 +0300 +ENDCHAR +STARTCHAR U_404F +ENCODING 16463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A280 +AFE0 +EAA0 +AFE0 +A200 +EFE0 +A280 +A480 +E300 +0CC0 +ENDCHAR +STARTCHAR U_4050 +ENCODING 16464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFC0 +A480 +E200 +AFC0 +AA40 +EA40 +BFE0 +A200 +E500 +18C0 +ENDCHAR +STARTCHAR U_4051 +ENCODING 16465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +AA40 +A940 +EFC0 +A000 +BFE0 +E400 +AFC0 +B540 +EA40 +0580 +ENDCHAR +STARTCHAR U_4052 +ENCODING 16466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +EFE0 +A440 +A7C0 +E440 +A7C0 +A440 +EFE0 +0040 +ENDCHAR +STARTCHAR U_4053 +ENCODING 16467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +A920 +AAA0 +EFE0 +A440 +AA20 +E3C0 +A640 +AA80 +E100 +06C0 +ENDCHAR +STARTCHAR U_4054 +ENCODING 16468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1E0 +AEA0 +A540 +EFE0 +A200 +AFE0 +E200 +A3C0 +A540 +E480 +0B60 +ENDCHAR +STARTCHAR U_4055 +ENCODING 16469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A840 +AFC0 +E900 +AFC0 +A8A0 +EFE0 +A840 +AFC0 +E840 +0FC0 +ENDCHAR +STARTCHAR U_4056 +ENCODING 16470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +AFE0 +E540 +A920 +A200 +EFE0 +A440 +A280 +E100 +06C0 +ENDCHAR +STARTCHAR U_4057 +ENCODING 16471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +AF80 +A000 +FFE0 +A000 +AF80 +E880 +AF80 +A500 +E200 +1FC0 +ENDCHAR +STARTCHAR U_4058 +ENCODING 16472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +BF20 +A540 +E280 +A800 +AFC0 +F100 +AFE0 +A100 +E920 +0FE0 +ENDCHAR +STARTCHAR U_4059 +ENCODING 16473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A540 +A4C0 +E7C0 +A100 +AFE0 +E920 +AFC0 +A280 +E100 +06C0 +ENDCHAR +STARTCHAR U_405A +ENCODING 16474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9240 +97E0 +F420 +97E0 +9420 +F7E0 +9420 +97E0 +F240 +0C20 +ENDCHAR +STARTCHAR U_405B +ENCODING 16475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AF80 +AA80 +EF80 +AA80 +AF80 +E200 +A280 +A5C0 +E920 +11E0 +ENDCHAR +STARTCHAR U_405C +ENCODING 16476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E440 +A7C0 +A920 +E540 +AFE0 +A280 +E4A0 +08E0 +ENDCHAR +STARTCHAR U_405D +ENCODING 16477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +71C0 +2080 +DB60 +0000 +FFE0 +90A0 +1F80 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_405E +ENCODING 16478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2940 +1080 +2940 +FFE0 +2880 +2F80 +2880 +2F80 +4880 +8F80 +ENDCHAR +STARTCHAR U_405F +ENCODING 16479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +A280 +AFC0 +E200 +AFC0 +A200 +EFC0 +A400 +AB80 +E900 +17E0 +ENDCHAR +STARTCHAR U_4060 +ENCODING 16480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +EFC0 +A500 +AFC0 +E540 +BFE0 +A540 +EFC0 +A500 +AD80 +F560 +ENDCHAR +STARTCHAR U_4061 +ENCODING 16481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +A920 +E920 +AAA0 +AC60 +E820 +0860 +ENDCHAR +STARTCHAR U_4062 +ENCODING 16482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E880 +BEE0 +A900 +EEE0 +AA40 +AB60 +EB40 +AB40 +B3C0 +EE60 +ENDCHAR +STARTCHAR U_4063 +ENCODING 16483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A540 +E7C0 +A540 +A540 +EFE0 +A080 +AFE0 +E280 +0180 +ENDCHAR +STARTCHAR U_4064 +ENCODING 16484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +EFE0 +A920 +ABA0 +E920 +ABA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_4065 +ENCODING 16485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AA80 +AFC0 +EA80 +AFC0 +AA00 +EFC0 +AA40 +ABC0 +E800 +0FE0 +ENDCHAR +STARTCHAR U_4066 +ENCODING 16486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E180 +A100 +AFE0 +E900 +ABA0 +A920 +EBE0 +AA40 +ABC0 +EA40 +17E0 +ENDCHAR +STARTCHAR U_4067 +ENCODING 16487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0500 +EF80 +A200 +AF80 +EA80 +AF80 +EFC0 +A200 +BFC0 +E500 +0880 +ENDCHAR +STARTCHAR U_4068 +ENCODING 16488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EEE0 +A0A0 +EEA0 +AAC0 +AEA0 +EAA0 +A4A0 +AEA0 +E4E0 +0C80 +ENDCHAR +STARTCHAR U_4069 +ENCODING 16489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E780 +A900 +BFC0 +EA40 +AFC0 +EA40 +AFC0 +A000 +ED40 +12A0 +ENDCHAR +STARTCHAR U_406A +ENCODING 16490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +EEC0 +A480 +EE80 +AAE0 +AEA0 +EAA0 +AEA0 +A4A0 +EEA0 +0520 +ENDCHAR +STARTCHAR U_406B +ENCODING 16491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +AAC0 +AF40 +EFC0 +A200 +EFC0 +A200 +BFE0 +A000 +ED40 +12A0 +ENDCHAR +STARTCHAR U_406C +ENCODING 16492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +AD60 +ABA0 +EFE0 +A000 +E7C0 +A440 +A7C0 +E440 +07C0 +ENDCHAR +STARTCHAR U_406D +ENCODING 16493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFC0 +A200 +A500 +E880 +A660 +E440 +AEE0 +A440 +EAA0 +1120 +ENDCHAR +STARTCHAR U_406E +ENCODING 16494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +F540 +AEE0 +E440 +AEE0 +B100 +EFC0 +A840 +AFC0 +E840 +0FC0 +ENDCHAR +STARTCHAR U_406F +ENCODING 16495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A7C0 +E820 +A7C0 +A440 +EFE0 +AAA0 +A660 +EAA0 +0660 +ENDCHAR +STARTCHAR U_4070 +ENCODING 16496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1E0 +BC80 +ABE0 +EA20 +ABE0 +AA20 +EFE0 +AA20 +B3E0 +E140 +0220 +ENDCHAR +STARTCHAR U_4071 +ENCODING 16497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A540 +EFE0 +A440 +BFE0 +E000 +BFE0 +A480 +E4A0 +18E0 +ENDCHAR +STARTCHAR U_4072 +ENCODING 16498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E440 +A7C0 +A440 +E7C0 +A440 +A7C0 +E280 +0C60 +ENDCHAR +STARTCHAR U_4073 +ENCODING 16499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFE0 +A480 +A200 +EFC0 +A480 +B860 +E480 +BFE0 +A480 +E880 +ENDCHAR +STARTCHAR U_4074 +ENCODING 16500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +E540 +A7C0 +A000 +E7C0 +A440 +A7C0 +E440 +1FE0 +ENDCHAR +STARTCHAR U_4075 +ENCODING 16501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +E000 +BFE0 +A840 +EFC0 +A500 +A540 +EC80 +1640 +ENDCHAR +STARTCHAR U_4076 +ENCODING 16502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +AAE0 +AF20 +EAA0 +AEA0 +E4A0 +BE40 +AA40 +EAA0 +1720 +ENDCHAR +STARTCHAR U_4077 +ENCODING 16503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +4440 +6AC0 +4A40 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4078 +ENCODING 16504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +AAA0 +EFE0 +A800 +AFC0 +E800 +AFE0 +AA80 +EAC0 +1360 +ENDCHAR +STARTCHAR U_4079 +ENCODING 16505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +AFE0 +AAA0 +EE40 +A9E0 +A840 +EE40 +ABE0 +AA40 +EE40 +1040 +ENDCHAR +STARTCHAR U_407A +ENCODING 16506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E280 +AFC0 +A280 +EFE0 +A100 +BFE0 +E100 +0100 +ENDCHAR +STARTCHAR U_407B +ENCODING 16507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA40 +AF40 +B580 +EF40 +B5A0 +BFE0 +E200 +BFC0 +A700 +EA80 +1240 +ENDCHAR +STARTCHAR U_407C +ENCODING 16508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +ED60 +ABA0 +AFE0 +E100 +A7C0 +E100 +AFE0 +A7C0 +E100 +0FE0 +ENDCHAR +STARTCHAR U_407D +ENCODING 16509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +EA80 +A540 +AFE0 +EAA0 +AFE0 +AA40 +EB40 +AEC0 +AA40 +EF60 +ENDCHAR +STARTCHAR U_407E +ENCODING 16510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AFE0 +A480 +EFE0 +AAA0 +AFE0 +E140 +AFE0 +AD80 +EB20 +14E0 +ENDCHAR +STARTCHAR U_407F +ENCODING 16511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +54C0 +7CA0 +13E0 +7880 +1140 +FFA0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_4080 +ENCODING 16512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFC0 +A200 +EFC0 +A4A0 +AE80 +E5E0 +BE80 +A4A0 +E2C0 +0D20 +ENDCHAR +STARTCHAR U_4081 +ENCODING 16513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9C40 +F7A0 +94E0 +97C0 +FD40 +97C0 +9340 +F520 +09E0 +ENDCHAR +STARTCHAR U_4082 +ENCODING 16514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +AAA0 +EFE0 +A480 +EFE0 +B480 +A7E0 +E480 +07E0 +ENDCHAR +STARTCHAR U_4083 +ENCODING 16515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +A540 +AFE0 +EAA0 +AFE0 +EE40 +AAE0 +AF40 +EAC0 +0F40 +ENDCHAR +STARTCHAR U_4084 +ENCODING 16516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +EBA0 +AEE0 +A5C0 +EC80 +A7E0 +A440 +E380 +0C60 +ENDCHAR +STARTCHAR U_4085 +ENCODING 16517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +EF80 +B4A0 +BFE0 +F540 +BA60 +EF80 +AA80 +AF80 +E240 +1FC0 +ENDCHAR +STARTCHAR U_4086 +ENCODING 16518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F200 +1200 +53C0 +2440 +F840 +2A40 +6140 +A040 +2040 +2140 +6080 +ENDCHAR +STARTCHAR U_4087 +ENCODING 16519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1140 +5140 +2140 +F940 +2BC0 +6140 +A140 +2240 +2240 +67E0 +ENDCHAR +STARTCHAR U_4088 +ENCODING 16520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +5100 +27E0 +FD20 +2D20 +67E0 +A100 +2140 +21E0 +6620 +ENDCHAR +STARTCHAR U_4089 +ENCODING 16521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +13C0 +5440 +27E0 +FD00 +2DC0 +6680 +A7E0 +2480 +2540 +6620 +ENDCHAR +STARTCHAR U_408A +ENCODING 16522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +13C0 +5240 +27E0 +FAA0 +2BE0 +6140 +A680 +21C0 +26A0 +6180 +ENDCHAR +STARTCHAR U_408B +ENCODING 16523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F140 +2080 +F7E0 +92A0 +F580 +2080 +F7E0 +A1C0 +F2A0 +24A0 +ENDCHAR +STARTCHAR U_408C +ENCODING 16524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +17E0 +5240 +27E0 +FAA0 +2BE0 +62A0 +A3E0 +21C0 +2080 +67E0 +ENDCHAR +STARTCHAR U_408D +ENCODING 16525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1640 +5540 +27C0 +FA80 +2FE0 +6580 +AB60 +2380 +2D60 +6300 +ENDCHAR +STARTCHAR U_408E +ENCODING 16526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +1FE0 +5540 +2EE0 +F440 +6FE0 +6A40 +A940 +AFC0 +2480 +6840 +ENDCHAR +STARTCHAR U_408F +ENCODING 16527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7920 +A120 +2220 +FA60 +2400 +33E0 +4A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_4090 +ENCODING 16528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7520 +A520 +2520 +F7E0 +2100 +2520 +5520 +5520 +87E0 +ENDCHAR +STARTCHAR U_4091 +ENCODING 16529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +7C80 +A480 +27A0 +FCC0 +2480 +3480 +4D80 +46A0 +84E0 +ENDCHAR +STARTCHAR U_4092 +ENCODING 16530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7BE0 +A080 +2080 +FBE0 +2000 +33E0 +4A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_4093 +ENCODING 16531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7FC0 +A440 +27C0 +FC40 +27C0 +3280 +4A80 +44A0 +88E0 +ENDCHAR +STARTCHAR U_4094 +ENCODING 16532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7900 +A7E0 +2280 +FFC0 +2100 +37E0 +4900 +4900 +8100 +ENDCHAR +STARTCHAR U_4095 +ENCODING 16533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +7A40 +A7C0 +2080 +FFE0 +22C0 +35A0 +4AA0 +4D40 +82C0 +ENDCHAR +STARTCHAR U_4096 +ENCODING 16534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0900 +1080 +2040 +7F80 +A080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_4097 +ENCODING 16535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FE00 +2200 +2220 +4240 +7380 +5E00 +D220 +5220 +7220 +01E0 +ENDCHAR +STARTCHAR U_4098 +ENCODING 16536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFC0 +2440 +2540 +4280 +7280 +5100 +D100 +5280 +7440 +0820 +ENDCHAR +STARTCHAR U_4099 +ENCODING 16537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA20 +2240 +2280 +4240 +7220 +5220 +D3A0 +5240 +7200 +0200 +ENDCHAR +STARTCHAR U_409A +ENCODING 16538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA40 +2180 +2180 +4640 +7440 +5240 +D180 +5180 +7640 +0420 +ENDCHAR +STARTCHAR U_409B +ENCODING 16539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +2280 +2100 +4FE0 +7140 +5100 +D100 +5100 +7100 +0300 +ENDCHAR +STARTCHAR U_409C +ENCODING 16540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2100 +4100 +77C0 +5100 +DFE0 +5100 +7100 +0100 +ENDCHAR +STARTCHAR U_409D +ENCODING 16541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0180 +FD40 +21E0 +2700 +7940 +6940 +A880 +28A0 +39A0 +0660 +ENDCHAR +STARTCHAR U_409E +ENCODING 16542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +5F80 +0400 +FFE0 +0E00 +1500 +64C0 +0400 +ENDCHAR +STARTCHAR U_409F +ENCODING 16543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +7BC0 +2A40 +2A40 +4BC0 +9000 +7FC0 +0800 +1F80 +2880 +4F80 +ENDCHAR +STARTCHAR U_40A0 +ENCODING 16544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23C0 +2500 +4100 +7FE0 +5100 +D100 +5280 +7440 +0820 +ENDCHAR +STARTCHAR U_40A1 +ENCODING 16545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FB00 +2200 +2200 +43C0 +7280 +5280 +D280 +5280 +7280 +0FE0 +ENDCHAR +STARTCHAR U_40A2 +ENCODING 16546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2440 +2A80 +4100 +7280 +5C40 +D320 +5080 +7600 +0180 +ENDCHAR +STARTCHAR U_40A3 +ENCODING 16547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F940 +2140 +2540 +45E0 +7540 +5540 +D540 +55C0 +7760 +0C60 +ENDCHAR +STARTCHAR U_40A4 +ENCODING 16548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F940 +2240 +23E0 +4640 +7A40 +5340 +D2C0 +5240 +7240 +02C0 +ENDCHAR +STARTCHAR U_40A5 +ENCODING 16549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +27C0 +2500 +4500 +77C0 +5500 +D500 +54A0 +76A0 +0460 +ENDCHAR +STARTCHAR U_40A6 +ENCODING 16550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +4920 +7600 +5180 +D600 +5040 +7180 +0E00 +ENDCHAR +STARTCHAR U_40A7 +ENCODING 16551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FC00 +27E0 +2820 +4100 +7540 +5540 +D920 +5120 +7100 +0300 +ENDCHAR +STARTCHAR U_40A8 +ENCODING 16552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +2400 +2400 +47E0 +7480 +5480 +D580 +54C0 +74A0 +0880 +ENDCHAR +STARTCHAR U_40A9 +ENCODING 16553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2520 +2520 +47E0 +7520 +55A0 +D660 +5420 +7420 +07E0 +ENDCHAR +STARTCHAR U_40AA +ENCODING 16554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +2280 +2AA0 +46C0 +7280 +56C0 +DAA0 +5280 +74A0 +08E0 +ENDCHAR +STARTCHAR U_40AB +ENCODING 16555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +03E0 +FE20 +1540 +2080 +7940 +6EA0 +ABC0 +3A80 +07E0 +0080 +ENDCHAR +STARTCHAR U_40AC +ENCODING 16556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +2480 +2680 +35A0 +C8E0 +1000 +FFE0 +0800 +1F80 +3080 +5F80 +ENDCHAR +STARTCHAR U_40AD +ENCODING 16557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +FFE0 +2280 +2440 +78A0 +6A80 +A900 +2900 +3A80 +0460 +ENDCHAR +STARTCHAR U_40AE +ENCODING 16558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2120 +F920 +22A0 +FA40 +7FE0 +1000 +3FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_40AF +ENCODING 16559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2480 +4480 +77E0 +5480 +D480 +5480 +77E0 +0800 +ENDCHAR +STARTCHAR U_40B0 +ENCODING 16560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01A0 +0E20 +F2A0 +2FA0 +42A0 +72A0 +D7A0 +5AA0 +7220 +02A0 +0240 +ENDCHAR +STARTCHAR U_40B1 +ENCODING 16561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +2000 +27C0 +4440 +7440 +57C0 +D280 +52A0 +74A0 +08E0 +ENDCHAR +STARTCHAR U_40B2 +ENCODING 16562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7080 +23E0 +F8A0 +5120 +EA40 +7FE0 +0800 +1F80 +3080 +5F80 +ENDCHAR +STARTCHAR U_40B3 +ENCODING 16563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FD40 +2540 +2540 +7BA0 +5100 +D7C0 +5100 +7100 +0FE0 +ENDCHAR +STARTCHAR U_40B4 +ENCODING 16564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +2FE0 +2000 +47C0 +7000 +57C0 +D000 +57C0 +7440 +07C0 +ENDCHAR +STARTCHAR U_40B5 +ENCODING 16565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2100 +2FE0 +4000 +77C0 +5440 +D540 +5100 +7280 +0460 +ENDCHAR +STARTCHAR U_40B6 +ENCODING 16566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0480 +FF80 +25E0 +24A0 +7FA0 +54A0 +DAA0 +5EA0 +7120 +0260 +ENDCHAR +STARTCHAR U_40B7 +ENCODING 16567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +0700 +F100 +2FE0 +4100 +F540 +5D60 +5540 +7D60 +0500 +0100 +ENDCHAR +STARTCHAR U_40B8 +ENCODING 16568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +F100 +2FE0 +2100 +7EA0 +5AC0 +DE80 +70A0 +0DA0 +0260 +ENDCHAR +STARTCHAR U_40B9 +ENCODING 16569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +23E0 +2540 +4280 +7300 +5D20 +D540 +5980 +7280 +0C60 +ENDCHAR +STARTCHAR U_40BA +ENCODING 16570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0540 +FFC0 +2540 +27C0 +7900 +6FE0 +AB80 +2D40 +3920 +0100 +ENDCHAR +STARTCHAR U_40BB +ENCODING 16571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC00 +27C0 +2400 +47C0 +7400 +5FE0 +D480 +54A0 +7540 +0620 +ENDCHAR +STARTCHAR U_40BC +ENCODING 16572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2540 +48A0 +77C0 +5080 +D240 +56A0 +7A40 +01C0 +ENDCHAR +STARTCHAR U_40BD +ENCODING 16573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +01E0 +F900 +27C0 +2440 +77C0 +5440 +D7C0 +5100 +7FE0 +0100 +ENDCHAR +STARTCHAR U_40BE +ENCODING 16574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +FFE0 +2540 +2540 +7BA0 +6900 +AB80 +2D40 +3920 +0100 +ENDCHAR +STARTCHAR U_40BF +ENCODING 16575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +2740 +2380 +4540 +7120 +57C0 +D440 +57C0 +7440 +07C0 +ENDCHAR +STARTCHAR U_40C0 +ENCODING 16576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +27C0 +4140 +FFE0 +5140 +5FE0 +7440 +0380 +0440 +ENDCHAR +STARTCHAR U_40C1 +ENCODING 16577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2280 +2EE0 +4820 +F820 +5EE0 +5280 +7280 +0280 +0FE0 +ENDCHAR +STARTCHAR U_40C2 +ENCODING 16578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +27E0 +2420 +47E0 +F000 +5480 +57E0 +7480 +06A0 +0440 +ENDCHAR +STARTCHAR U_40C3 +ENCODING 16579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2920 +2FE0 +4920 +FFE0 +5A20 +5A20 +7BE0 +0820 +0860 +ENDCHAR +STARTCHAR U_40C4 +ENCODING 16580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +F000 +27C0 +4440 +F7C0 +5100 +5540 +7920 +0100 +0300 +ENDCHAR +STARTCHAR U_40C5 +ENCODING 16581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F180 +27E0 +4520 +F7E0 +5520 +57E0 +5100 +77E0 +0100 +0100 +ENDCHAR +STARTCHAR U_40C6 +ENCODING 16582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +07E0 +F240 +23C0 +4240 +F3C0 +5240 +5240 +7FE0 +0240 +0420 +ENDCHAR +STARTCHAR U_40C7 +ENCODING 16583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +07C0 +F440 +27C0 +4440 +F7C0 +5100 +5FE0 +7920 +0960 +0100 +ENDCHAR +STARTCHAR U_40C8 +ENCODING 16584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +07E0 +F480 +26A0 +4440 +F200 +57C0 +5440 +77C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_40C9 +ENCODING 16585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0440 +F7C0 +2480 +47E0 +F440 +57E0 +5440 +77C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_40CA +ENCODING 16586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +F440 +2000 +47C0 +F440 +57C0 +5440 +77C0 +0440 +0FE0 +ENDCHAR +STARTCHAR U_40CB +ENCODING 16587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0280 +F440 +2BA0 +4000 +F720 +5560 +5760 +7560 +0720 +0560 +ENDCHAR +STARTCHAR U_40CC +ENCODING 16588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2FE0 +4AA0 +FCE0 +5820 +5FE0 +7100 +07C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_40CD +ENCODING 16589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0300 +FFE0 +2200 +4520 +FAC0 +55C0 +5AA0 +74A0 +0A80 +0100 +ENDCHAR +STARTCHAR U_40CE +ENCODING 16590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F7E0 +2280 +4540 +FBA0 +5500 +5280 +7D40 +0280 +0300 +ENDCHAR +STARTCHAR U_40CF +ENCODING 16591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2FE0 +4820 +FFE0 +5500 +57E0 +7900 +0FE0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_40D0 +ENCODING 16592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +FFE0 +2AA0 +2540 +7140 +5FE0 +D100 +5280 +7440 +0820 +ENDCHAR +STARTCHAR U_40D1 +ENCODING 16593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +08A0 +FEA0 +4AA0 +4EA0 +EB00 +BEE0 +AAA0 +AEA0 +EA40 +16A0 +ENDCHAR +STARTCHAR U_40D2 +ENCODING 16594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F800 +23C0 +2240 +43C0 +7000 +57E0 +D6A0 +57E0 +7520 +0460 +ENDCHAR +STARTCHAR U_40D3 +ENCODING 16595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFC0 +2280 +27C0 +4100 +77C0 +5540 +D7C0 +5540 +7FE0 +0440 +ENDCHAR +STARTCHAR U_40D4 +ENCODING 16596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2420 +23C0 +4240 +73C0 +5000 +D7E0 +5420 +7420 +07E0 +ENDCHAR +STARTCHAR U_40D5 +ENCODING 16597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +39C0 +5280 +2940 +FFE0 +8020 +7FC0 +0800 +1F80 +3080 +5F80 +ENDCHAR +STARTCHAR U_40D6 +ENCODING 16598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +27C0 +4440 +77E0 +5400 +D7E0 +5520 +7AA0 +00C0 +ENDCHAR +STARTCHAR U_40D7 +ENCODING 16599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +F220 +2E20 +22A0 +5FA0 +74A0 +5EA0 +D4A0 +5E20 +7520 +0C60 +ENDCHAR +STARTCHAR U_40D8 +ENCODING 16600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FA0 +2940 +4F40 +7AA0 +5F20 +D100 +57C0 +7100 +0FE0 +ENDCHAR +STARTCHAR U_40D9 +ENCODING 16601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +27E0 +4560 +77E0 +5480 +D7E0 +5680 +7BA0 +0AE0 +ENDCHAR +STARTCHAR U_40DA +ENCODING 16602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F280 +2FE0 +2480 +4740 +75E0 +5540 +D5E0 +5540 +7540 +0AA0 +ENDCHAR +STARTCHAR U_40DB +ENCODING 16603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +2480 +23E0 +4EA0 +77E0 +57E0 +D480 +57E0 +7480 +0BE0 +ENDCHAR +STARTCHAR U_40DC +ENCODING 16604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +A140 +B940 +D220 +FDC0 +A940 +FC80 +0140 +FFC0 +3100 +5F00 +ENDCHAR +STARTCHAR U_40DD +ENCODING 16605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0780 +F2E0 +2FA0 +22A0 +73A0 +5D40 +D240 +5FA0 +72A0 +0720 +ENDCHAR +STARTCHAR U_40DE +ENCODING 16606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4940 +7B40 +21C0 +7260 +7FE0 +0800 +1F80 +6880 +0F80 +ENDCHAR +STARTCHAR U_40DF +ENCODING 16607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +1F80 +EAE0 +5FA0 +40A0 +EEA0 +AAA0 +AE40 +EA40 +0EA0 +0B20 +ENDCHAR +STARTCHAR U_40E0 +ENCODING 16608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F4E0 +4E80 +4500 +44E0 +7740 +D540 +5560 +5540 +75C0 +0A60 +ENDCHAR +STARTCHAR U_40E1 +ENCODING 16609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FA40 +4FE0 +4240 +46C0 +7B60 +D7C0 +5440 +57C0 +7440 +07C0 +ENDCHAR +STARTCHAR U_40E2 +ENCODING 16610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FA80 +51E0 +4EA0 +4540 +7F40 +D540 +5E40 +5440 +76A0 +0D20 +ENDCHAR +STARTCHAR U_40E3 +ENCODING 16611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F300 +4F80 +4280 +43C0 +7440 +D7E0 +58A0 +52A0 +7A20 +08C0 +ENDCHAR +STARTCHAR U_40E4 +ENCODING 16612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4140 +4FE0 +4140 +F7C0 +5540 +57C0 +7540 +47C0 +0B40 +ENDCHAR +STARTCHAR U_40E5 +ENCODING 16613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4440 +4280 +4FE0 +F540 +57C0 +5540 +77C0 +4100 +0FE0 +ENDCHAR +STARTCHAR U_40E6 +ENCODING 16614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +4A40 +7D80 +D180 +3660 +FFE0 +1000 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_40E7 +ENCODING 16615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +ABA0 +D500 +B7E0 +8000 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_40E8 +ENCODING 16616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +E520 +45E0 +5C80 +53E0 +F2A0 +5FE0 +5480 +54A0 +64E0 +1BA0 +ENDCHAR +STARTCHAR U_40E9 +ENCODING 16617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4AA0 +4FE0 +4AA0 +7FE0 +D400 +57E0 +56A0 +7A40 +0B20 +ENDCHAR +STARTCHAR U_40EA +ENCODING 16618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4440 +4740 +4540 +7540 +D7C0 +5240 +53C0 +7240 +0FE0 +ENDCHAR +STARTCHAR U_40EB +ENCODING 16619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +47E0 +4D40 +4720 +7480 +D7E0 +5400 +57E0 +7A20 +0BE0 +ENDCHAR +STARTCHAR U_40EC +ENCODING 16620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F7E0 +4200 +47E0 +4520 +77E0 +D520 +57E0 +5140 +72A0 +0CE0 +ENDCHAR +STARTCHAR U_40ED +ENCODING 16621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +F7E0 +4480 +47A0 +7560 +D740 +54A0 +5940 +7520 +4C60 +0BC0 +ENDCHAR +STARTCHAR U_40EE +ENCODING 16622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F3E0 +4880 +47E0 +4140 +FFE0 +5480 +57E0 +7480 +4700 +18E0 +ENDCHAR +STARTCHAR U_40EF +ENCODING 16623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBA0 +46C0 +4380 +76C0 +5BA0 +D100 +5FE0 +7380 +4540 +0920 +ENDCHAR +STARTCHAR U_40F0 +ENCODING 16624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4820 +46E0 +4AA0 +7440 +DBA0 +5000 +5FE0 +7540 +0B20 +ENDCHAR +STARTCHAR U_40F1 +ENCODING 16625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FF60 +4240 +4FE0 +4540 +7DC0 +D560 +5DC0 +5740 +7CA0 +0720 +ENDCHAR +STARTCHAR U_40F2 +ENCODING 16626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FEE0 +4AA0 +4F20 +4AE0 +7EA0 +D2C0 +5520 +5FE0 +72A0 +0FE0 +ENDCHAR +STARTCHAR U_40F3 +ENCODING 16627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +42A0 +47E0 +44A0 +F560 +57E0 +5540 +57C0 +7560 +07A0 +ENDCHAR +STARTCHAR U_40F4 +ENCODING 16628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0480 +FFE0 +40A0 +4FE0 +7080 +DFE0 +50A0 +5EE0 +7AA0 +0EE0 +ENDCHAR +STARTCHAR U_40F5 +ENCODING 16629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4280 +43C0 +4280 +F7E0 +5AA0 +5520 +5CC0 +7540 +0620 +ENDCHAR +STARTCHAR U_40F6 +ENCODING 16630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4000 +4FE0 +4AA0 +7FE0 +D540 +52A0 +5CC0 +7580 +0660 +ENDCHAR +STARTCHAR U_40F7 +ENCODING 16631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4400 +47C0 +7440 +D7C0 +52E0 +5FA0 +7AE0 +4FA0 +12A0 +ENDCHAR +STARTCHAR U_40F8 +ENCODING 16632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +F560 +4AC0 +4FE0 +4540 +7DC0 +D560 +5DC0 +5740 +7CA0 +0720 +ENDCHAR +STARTCHAR U_40F9 +ENCODING 16633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +4AA0 +4EE0 +4920 +FFE0 +5D60 +5FE0 +7BA0 +4D60 +0920 +ENDCHAR +STARTCHAR U_40FA +ENCODING 16634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +4540 +47E0 +4540 +77E0 +D540 +5760 +7540 +4760 +0940 +ENDCHAR +STARTCHAR U_40FB +ENCODING 16635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +4FE0 +4BA0 +4540 +7FE0 +D2A0 +5FE0 +7AA0 +4FE0 +02A0 +ENDCHAR +STARTCHAR U_40FC +ENCODING 16636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +F900 +0900 +1180 +3940 +D520 +1100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_40FD +ENCODING 16637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F100 +17E0 +2100 +77C0 +AC40 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_40FE +ENCODING 16638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +F480 +1480 +24E0 +7780 +AC80 +2480 +24A0 +25A0 +2660 +ENDCHAR +STARTCHAR U_40FF +ENCODING 16639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F100 +17C0 +2100 +7100 +AFE0 +2100 +2280 +2440 +3820 +ENDCHAR +STARTCHAR U_4100 +ENCODING 16640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +FFE0 +1200 +2240 +7240 +AA80 +2100 +2100 +22A0 +2C40 +ENDCHAR +STARTCHAR U_4101 +ENCODING 16641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2540 +F540 +1540 +2FE0 +7540 +AD40 +25C0 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_4102 +ENCODING 16642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1920 +2920 +7920 +AFE0 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_4103 +ENCODING 16643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7C0 +1540 +2540 +7540 +AFE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4104 +ENCODING 16644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +F920 +1FE0 +2920 +7920 +A920 +2AA0 +2A60 +2C20 +2FE0 +ENDCHAR +STARTCHAR U_4105 +ENCODING 16645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +3F80 +0800 +FFE0 +1080 +2F40 +C020 +3FC0 +1500 +2480 +4C40 +ENDCHAR +STARTCHAR U_4106 +ENCODING 16646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F100 +1100 +2FE0 +7100 +AFC0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4107 +ENCODING 16647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +17C0 +2000 +77C0 +A900 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4108 +ENCODING 16648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +F7C0 +1440 +2440 +77C0 +A800 +2440 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_4109 +ENCODING 16649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +24A0 +F480 +1FE0 +2480 +74A0 +A6C0 +2C80 +34A0 +2560 +2C20 +ENDCHAR +STARTCHAR U_410A +ENCODING 16650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2100 +77C0 +AA00 +2520 +2C40 +2440 +23C0 +ENDCHAR +STARTCHAR U_410B +ENCODING 16651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F280 +1540 +2920 +77E0 +AD40 +27C0 +2540 +27C0 +20E0 +ENDCHAR +STARTCHAR U_410C +ENCODING 16652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +25A0 +F240 +13A0 +2520 +77E0 +ADA0 +25A0 +2240 +22A0 +2520 +ENDCHAR +STARTCHAR U_410D +ENCODING 16653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +F7C0 +1280 +2FE0 +7000 +AFC0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_410E +ENCODING 16654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +1280 +2FE0 +7040 +AF40 +2540 +2740 +2040 +2080 +ENDCHAR +STARTCHAR U_410F +ENCODING 16655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +F440 +10C0 +2700 +7100 +AFE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4110 +ENCODING 16656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABC0 +FA40 +AA40 +FBC0 +0240 +FA00 +2220 +7220 +A9E0 +2000 +ENDCHAR +STARTCHAR U_4111 +ENCODING 16657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +1500 +27C0 +74A0 +6A60 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4112 +ENCODING 16658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +1540 +28A0 +77C0 +A280 +2140 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_4113 +ENCODING 16659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +F7E0 +1420 +27E0 +7420 +AFE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4114 +ENCODING 16660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F100 +17C0 +2540 +7540 +AFE0 +2920 +29E0 +2B20 +2860 +ENDCHAR +STARTCHAR U_4115 +ENCODING 16661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2120 +F540 +1380 +2540 +7120 +AFC0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_4116 +ENCODING 16662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +1440 +2BA0 +5000 +AE20 +2AA0 +2EA0 +2AA0 +2E20 +2AE0 +ENDCHAR +STARTCHAR U_4117 +ENCODING 16663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4540 +2540 +F540 +17C0 +2440 +77C0 +A440 +27C0 +2540 +2540 +2940 +ENDCHAR +STARTCHAR U_4118 +ENCODING 16664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F7C0 +1280 +2FE0 +7220 +B7C0 +2200 +2380 +2480 +2980 +ENDCHAR +STARTCHAR U_4119 +ENCODING 16665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F820 +17E0 +2440 +47C0 +E440 +57C0 +4100 +4FE0 +4280 +4440 +ENDCHAR +STARTCHAR U_411A +ENCODING 16666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +1FE0 +2AA0 +7AA0 +AFE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_411B +ENCODING 16667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +FD60 +27C0 +7100 +A7C0 +2540 +2FE0 +2280 +2100 +26C0 +ENDCHAR +STARTCHAR U_411C +ENCODING 16668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +F540 +16C0 +27C0 +7100 +AFE0 +2920 +29A0 +2EA0 +2860 +ENDCHAR +STARTCHAR U_411D +ENCODING 16669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +13C0 +2100 +77E0 +A280 +2C60 +26C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_411E +ENCODING 16670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2360 +F5A0 +1640 +2A40 +77A0 +A800 +27C0 +2100 +2540 +2B20 +ENDCHAR +STARTCHAR U_411F +ENCODING 16671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +3C00 +17C0 +F4A0 +1FE0 +0000 +3F80 +0000 +FFE0 +1480 +6C60 +ENDCHAR +STARTCHAR U_4120 +ENCODING 16672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2540 +2740 +7440 +A7C0 +2480 +2780 +2480 +2FE0 +ENDCHAR +STARTCHAR U_4121 +ENCODING 16673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2480 +FFE0 +2A40 +6FE0 +7800 +ABC0 +2800 +2BC0 +2A40 +33C0 +ENDCHAR +STARTCHAR U_4122 +ENCODING 16674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F480 +2360 +2EC0 +76A0 +AA80 +27C0 +2440 +27C0 +2840 +ENDCHAR +STARTCHAR U_4123 +ENCODING 16675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +2FE0 +6AA0 +7FE0 +A440 +27C0 +2440 +27C0 +2820 +ENDCHAR +STARTCHAR U_4124 +ENCODING 16676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +2F60 +F2A0 +2FE0 +6AA0 +7FE0 +A2A0 +27E0 +26C0 +2AA0 +2320 +ENDCHAR +STARTCHAR U_4125 +ENCODING 16677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +2BA0 +2540 +7FE0 +AAA0 +2FE0 +2540 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_4126 +ENCODING 16678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7E0 +2040 +F880 +2080 +7080 +6880 +A080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4127 +ENCODING 16679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E240 +2240 +FA80 +22E0 +7220 +6A20 +A220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_4128 +ENCODING 16680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +E3E0 +2080 +F880 +27E0 +7080 +6880 +A080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4129 +ENCODING 16681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E280 +2240 +F200 +2FE0 +7200 +6A00 +A100 +2100 +2080 +2060 +ENDCHAR +STARTCHAR U_412A +ENCODING 16682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +23E0 +FA20 +2420 +7220 +6920 +A120 +2020 +2020 +20C0 +ENDCHAR +STARTCHAR U_412B +ENCODING 16683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +E7C0 +2040 +F840 +27C0 +7440 +6C00 +A400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_412C +ENCODING 16684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E500 +2500 +F5C0 +2F40 +7540 +6540 +A5C0 +2500 +2420 +27E0 +ENDCHAR +STARTCHAR U_412D +ENCODING 16685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +E700 +2100 +F900 +27E0 +7100 +6900 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_412E +ENCODING 16686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E100 +27C0 +F900 +2100 +77E0 +6900 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_412F +ENCODING 16687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +E7E0 +2240 +FA40 +2240 +7FE0 +6A40 +A240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_4130 +ENCODING 16688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63E0 +2040 +FA40 +2240 +73E0 +68C0 +A140 +2140 +2240 +24C0 +ENDCHAR +STARTCHAR U_4131 +ENCODING 16689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6080 +27E0 +F900 +2100 +71E0 +6920 +A220 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_4132 +ENCODING 16690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +6100 +2100 +FFE0 +2520 +75A0 +6D60 +A620 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_4133 +ENCODING 16691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +2080 +FA80 +22E0 +7280 +6A80 +AA80 +2280 +2280 +27E0 +ENDCHAR +STARTCHAR U_4134 +ENCODING 16692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63E0 +2220 +FA20 +23E0 +7220 +6A20 +A3E0 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_4135 +ENCODING 16693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +3C00 +0400 +FFE0 +0D00 +3480 +C460 +3F80 +2400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4136 +ENCODING 16694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +67E0 +22A0 +FFE0 +2A80 +7FE0 +6AA0 +A2A0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_4137 +ENCODING 16695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +67E0 +2100 +FA00 +23C0 +7640 +6A40 +B240 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_4138 +ENCODING 16696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6100 +27E0 +FC20 +2420 +77E0 +6C20 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_4139 +ENCODING 16697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +3C00 +0400 +FFE0 +2480 +CA60 +3180 +DF60 +0400 +3F80 +0400 +ENDCHAR +STARTCHAR U_413A +ENCODING 16698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +67E0 +2100 +F7E0 +2120 +77E0 +6D00 +A7E0 +2120 +2280 +2C60 +ENDCHAR +STARTCHAR U_413B +ENCODING 16699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +6280 +2AA0 +F6C0 +2280 +7280 +6EC0 +AAA0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_413C +ENCODING 16700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +6080 +2080 +FBE0 +22A0 +72A0 +6AA0 +A360 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_413D +ENCODING 16701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6280 +2FE0 +FAA0 +2AA0 +7AA0 +6AE0 +AC20 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_413E +ENCODING 16702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18A0 +67E0 +2080 +FA80 +22A0 +77A0 +6AC0 +A280 +24A0 +2560 +2A20 +ENDCHAR +STARTCHAR U_413F +ENCODING 16703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +67E0 +2520 +FFE0 +2520 +77E0 +6900 +A140 +20A0 +2360 +2C20 +ENDCHAR +STARTCHAR U_4140 +ENCODING 16704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3020 +EF20 +2420 +F4A0 +26A0 +7AA0 +6AA0 +A6A0 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_4141 +ENCODING 16705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +3F80 +1200 +6DC0 +0F00 +3400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4142 +ENCODING 16706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E200 +27C0 +FA40 +2180 +7240 +6C20 +A3C0 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_4143 +ENCODING 16707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2340 +3AC0 +C460 +0300 +3C00 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4144 +ENCODING 16708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E200 +27C0 +FA40 +2240 +74C0 +6880 +BFE0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_4145 +ENCODING 16709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +27C0 +F900 +2100 +77E0 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4146 +ENCODING 16710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E100 +29E0 +F620 +2080 +7280 +6C80 +A480 +2540 +2220 +2420 +ENDCHAR +STARTCHAR U_4147 +ENCODING 16711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_4148 +ENCODING 16712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7F80 +0400 +FFE0 +2080 +DF60 +0400 +7FC0 +0D00 +1480 +6440 +ENDCHAR +STARTCHAR U_4149 +ENCODING 16713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7E0 +2280 +FA80 +2280 +7AA0 +6EC0 +A280 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_414A +ENCODING 16714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7E0 +2400 +FCC0 +2780 +7480 +6FE0 +A480 +2480 +28A0 +28E0 +ENDCHAR +STARTCHAR U_414B +ENCODING 16715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +E380 +2480 +FFC0 +2540 +7540 +6FC0 +A280 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_414C +ENCODING 16716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +E240 +23C0 +F800 +27E0 +7420 +6FE0 +A420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_414D +ENCODING 16717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +EE60 +22C0 +F240 +2440 +77E0 +6A40 +AA40 +26E0 +2500 +28E0 +ENDCHAR +STARTCHAR U_414E +ENCODING 16718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +E700 +2100 +FFE0 +2540 +7920 +6FC0 +A240 +2260 +2420 +28C0 +ENDCHAR +STARTCHAR U_414F +ENCODING 16719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +FC00 +25C0 +6700 +75C0 +AF00 +25C0 +2B20 +28E0 +ENDCHAR +STARTCHAR U_4150 +ENCODING 16720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +FC40 +27C0 +6440 +77C0 +AA80 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4151 +ENCODING 16721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18E0 +E720 +24A0 +FAC0 +2200 +77E0 +6A40 +A240 +2680 +21C0 +2E20 +ENDCHAR +STARTCHAR U_4152 +ENCODING 16722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A40 +E240 +27E0 +FA40 +2100 +67E0 +7200 +AA00 +2200 +2200 +23E0 +ENDCHAR +STARTCHAR U_4153 +ENCODING 16723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3400 +E5E0 +2EA0 +F2A0 +2EA0 +7AA0 +6A40 +AE40 +22A0 +22A0 +2720 +ENDCHAR +STARTCHAR U_4154 +ENCODING 16724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3AA0 +E2A0 +2540 +FD40 +22A0 +77E0 +ACA0 +A7E0 +24A0 +24A0 +27E0 +ENDCHAR +STARTCHAR U_4155 +ENCODING 16725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E420 +27E0 +FC80 +6480 +77E0 +AC80 +27E0 +2620 +2A20 +2BE0 +ENDCHAR +STARTCHAR U_4156 +ENCODING 16726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2280 +F540 +2FE0 +7540 +BFC0 +A540 +27C0 +2120 +20E0 +ENDCHAR +STARTCHAR U_4157 +ENCODING 16727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +19C0 +E700 +2100 +FFE0 +2540 +7920 +6FE0 +A240 +2640 +2180 +2660 +ENDCHAR +STARTCHAR U_4158 +ENCODING 16728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +27E0 +FD40 +2540 +7BA0 +6900 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_4159 +ENCODING 16729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E440 +27C0 +FC40 +27C0 +7480 +6CE0 +A780 +2480 +25A0 +26E0 +ENDCHAR +STARTCHAR U_415A +ENCODING 16730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3920 +E540 +27E0 +F900 +2FE0 +7440 +6BE0 +A240 +22C0 +2220 +21E0 +ENDCHAR +STARTCHAR U_415B +ENCODING 16731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +E440 +27C0 +FC40 +27C0 +7000 +6FE0 +A820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_415C +ENCODING 16732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +E700 +2100 +FFE0 +2540 +7FE0 +A540 +2540 +2FE0 +2100 +27C0 +ENDCHAR +STARTCHAR U_415D +ENCODING 16733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E100 +2FE0 +FAA0 +2440 +6820 +77C0 +A900 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_415E +ENCODING 16734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E540 +2640 +F7C0 +2000 +67C0 +7080 +AFE0 +2880 +2480 +2180 +ENDCHAR +STARTCHAR U_415F +ENCODING 16735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +E440 +27C0 +F100 +2FE0 +7280 +6D40 +AAA0 +2340 +2080 +2700 +ENDCHAR +STARTCHAR U_4160 +ENCODING 16736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E240 +23C0 +FA40 +23C0 +7000 +AFE0 +2100 +25C0 +2700 +29E0 +ENDCHAR +STARTCHAR U_4161 +ENCODING 16737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E100 +27C0 +FC40 +27C0 +7440 +6FC0 +A440 +27C0 +2280 +2460 +ENDCHAR +STARTCHAR U_4162 +ENCODING 16738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2920 +FFE0 +2920 +6FE0 +B440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4163 +ENCODING 16739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +24C0 +F740 +27C0 +7000 +6FC0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4164 +ENCODING 16740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E100 +2140 +FFE0 +2100 +6D60 +7920 +AD60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4165 +ENCODING 16741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E440 +27C0 +F440 +27C0 +6200 +77E0 +AD20 +26A0 +27E0 +2040 +ENDCHAR +STARTCHAR U_4166 +ENCODING 16742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +E7E0 +2240 +F240 +2000 +77E0 +6D20 +A7E0 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_4167 +ENCODING 16743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2440 +F280 +2FE0 +7000 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4168 +ENCODING 16744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31C0 +E700 +2100 +FFE0 +2540 +6920 +77C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4169 +ENCODING 16745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2100 +F7C0 +2240 +7180 +6FE0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_416A +ENCODING 16746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +2540 +F7C0 +2100 +6FE0 +7440 +A540 +2540 +26C0 +2C60 +ENDCHAR +STARTCHAR U_416B +ENCODING 16747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2000 +F7C0 +2440 +67C0 +7440 +A7C0 +2540 +2520 +2B20 +ENDCHAR +STARTCHAR U_416C +ENCODING 16748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +E280 +2FE0 +F280 +2240 +7420 +6820 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_416D +ENCODING 16749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2440 +F280 +2FE0 +6920 +77C0 +A200 +23C0 +2440 +2980 +ENDCHAR +STARTCHAR U_416E +ENCODING 16750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E280 +27C0 +F820 +27C0 +6440 +77C0 +A440 +27C0 +2A40 +33C0 +ENDCHAR +STARTCHAR U_416F +ENCODING 16751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2940 +FFE0 +2940 +6BC0 +7900 +ABC0 +2A40 +2BC0 +3240 +ENDCHAR +STARTCHAR U_4170 +ENCODING 16752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E520 +27E0 +F5A0 +6660 +77E0 +6000 +A540 +2AA0 +2A40 +21C0 +ENDCHAR +STARTCHAR U_4171 +ENCODING 16753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E540 +27C0 +F000 +2FE0 +7000 +67C0 +A440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_4172 +ENCODING 16754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +2140 +F7E0 +2340 +7580 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4173 +ENCODING 16755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +64A0 +22A0 +F3E0 +2120 +77E0 +64A0 +AAA0 +23E0 +2120 +2660 +ENDCHAR +STARTCHAR U_4174 +ENCODING 16756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2100 +FFE0 +2AA0 +6700 +7280 +AFC0 +2580 +2540 +2B40 +ENDCHAR +STARTCHAR U_4175 +ENCODING 16757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +E280 +2FE0 +F100 +67C0 +7100 +6140 +AFE0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_4176 +ENCODING 16758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E800 +2FC0 +F800 +2FE0 +7AA0 +AAC0 +2A40 +2FE0 +3240 +20C0 +ENDCHAR +STARTCHAR U_4177 +ENCODING 16759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +EEE0 +2540 +F280 +2440 +6BA0 +7100 +AFE0 +2540 +2520 +2B20 +ENDCHAR +STARTCHAR U_4178 +ENCODING 16760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +EEE0 +2440 +F100 +2FE0 +6440 +7280 +AFE0 +2100 +27C0 +2100 +ENDCHAR +STARTCHAR U_4179 +ENCODING 16761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +E7C0 +2540 +FFE0 +2540 +77C0 +6540 +AFE0 +2480 +2380 +2C60 +ENDCHAR +STARTCHAR U_417A +ENCODING 16762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E280 +2FE0 +FAA0 +2FE0 +6000 +77C0 +A000 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_417B +ENCODING 16763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2280 +F920 +2AA0 +6FE0 +7100 +AFE0 +2960 +2FA0 +2860 +ENDCHAR +STARTCHAR U_417C +ENCODING 16764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E4C0 +2740 +FFE0 +2AA0 +6FE0 +7000 +A7C0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_417D +ENCODING 16765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1220 +7DC0 +5540 +7C80 +4F60 +8400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_417E +ENCODING 16766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E540 +2FE0 +F6C0 +2B60 +6240 +77C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_417F +ENCODING 16767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +EEE0 +2440 +FFE0 +2540 +6FE0 +7540 +AFE0 +2100 +27C0 +2100 +ENDCHAR +STARTCHAR U_4180 +ENCODING 16768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +ED60 +2BA0 +FFE0 +6100 +77C0 +A100 +2FE0 +2D40 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_4181 +ENCODING 16769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +EAA0 +2D60 +F7C0 +2100 +6FE0 +7440 +AFE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4182 +ENCODING 16770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2A40 +FFE0 +2A80 +7FE0 +6AA0 +AFE0 +2AC0 +2EA0 +3AA0 +ENDCHAR +STARTCHAR U_4183 +ENCODING 16771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +5FC0 +EA80 +2D80 +2A80 +FFE0 +0F00 +3400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4184 +ENCODING 16772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3140 +EFE0 +2440 +F5C0 +2540 +65C0 +7440 +A7C0 +2580 +2680 +2FE0 +ENDCHAR +STARTCHAR U_4185 +ENCODING 16773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EDE0 +2280 +FD40 +2220 +77C0 +6540 +A6C0 +2540 +27C0 +2820 +ENDCHAR +STARTCHAR U_4186 +ENCODING 16774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3380 +E280 +2380 +FEE0 +2AA0 +6EE0 +7100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_4187 +ENCODING 16775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +EA40 +2F40 +F940 +2F40 +7940 +6FC0 +A840 +2FC0 +2AA0 +3520 +ENDCHAR +STARTCHAR U_4188 +ENCODING 16776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +C420 +57E0 +FEA0 +55C0 +F6A0 +D5E0 +5680 +5BE0 +6480 +43E0 +ENDCHAR +STARTCHAR U_4189 +ENCODING 16777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +EAA0 +2FE0 +F480 +2AE0 +7E80 +6A60 +AE80 +2AE0 +2E80 +3260 +ENDCHAR +STARTCHAR U_418A +ENCODING 16778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EEE0 +2280 +FFE0 +2540 +77C0 +A540 +27C0 +2280 +2FE0 +2440 +ENDCHAR +STARTCHAR U_418B +ENCODING 16779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3780 +E900 +2EE0 +FAA0 +2FE0 +72A0 +AAE0 +26A0 +2BE0 +2600 +29E0 +ENDCHAR +STARTCHAR U_418C +ENCODING 16780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EA0 +E5E0 +2E80 +F5A0 +2E60 +7500 +AFE0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_418D +ENCODING 16781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +34E0 +EF80 +2AE0 +FF20 +20E0 +6E80 +7AE0 +AE80 +2AE0 +2E80 +3260 +ENDCHAR +STARTCHAR U_418E +ENCODING 16782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +CAA0 +5580 +EFE0 +5A80 +EBA0 +DAA0 +4BC0 +5A40 +4FE0 +5920 +ENDCHAR +STARTCHAR U_418F +ENCODING 16783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +EFE0 +2540 +FBA0 +2540 +77C0 +A540 +27C0 +2280 +2FE0 +2440 +ENDCHAR +STARTCHAR U_4190 +ENCODING 16784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2E80 +D560 +7FC0 +D560 +6DA0 +FBE0 +AAA0 +ENDCHAR +STARTCHAR U_4191 +ENCODING 16785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +8020 +7FE0 +0400 +0400 +0400 +1400 +0C00 +ENDCHAR +STARTCHAR U_4192 +ENCODING 16786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9140 +2900 +C8C0 +7F00 +0900 +2900 +1100 +2920 +C8E0 +ENDCHAR +STARTCHAR U_4193 +ENCODING 16787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2900 +C8C0 +1100 +3F80 +1280 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_4194 +ENCODING 16788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2500 +C4C0 +3F80 +2480 +3F80 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4195 +ENCODING 16789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +9140 +2900 +C8E0 +3F80 +0880 +FFE0 +1100 +2080 +C040 +ENDCHAR +STARTCHAR U_4196 +ENCODING 16790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2860 +C800 +3FC0 +1000 +1200 +2400 +4880 +9FC0 +ENDCHAR +STARTCHAR U_4197 +ENCODING 16791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20C0 +C000 +7A40 +4A40 +4A40 +7BC0 +4840 +0040 +ENDCHAR +STARTCHAR U_4198 +ENCODING 16792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9120 +20E0 +FF80 +2480 +3F80 +2480 +3F80 +0400 +0400 +ENDCHAR +STARTCHAR U_4199 +ENCODING 16793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20E0 +C080 +7FC0 +0400 +2700 +2400 +2440 +FFE0 +ENDCHAR +STARTCHAR U_419A +ENCODING 16794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +40E0 +BF80 +2080 +2E80 +2080 +2E80 +2A80 +2E80 +ENDCHAR +STARTCHAR U_419B +ENCODING 16795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +A0A0 +4060 +8180 +F700 +9100 +9FE0 +F100 +9120 +01E0 +ENDCHAR +STARTCHAR U_419C +ENCODING 16796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +24E0 +C400 +3FC0 +1880 +6F80 +0880 +0F80 +1080 +ENDCHAR +STARTCHAR U_419D +ENCODING 16797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20E0 +C800 +1080 +7FC0 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_419E +ENCODING 16798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +7FE0 +A680 +3880 +3F80 +2000 +3F80 +2040 +1FC0 +ENDCHAR +STARTCHAR U_419F +ENCODING 16799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +64C0 +0A00 +3180 +DF60 +0000 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_41A0 +ENCODING 16800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +20E0 +FF80 +2400 +3F00 +2100 +3F00 +2480 +3FC0 +ENDCHAR +STARTCHAR U_41A1 +ENCODING 16801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4460 +BF80 +2680 +3880 +3FC0 +2480 +2B00 +30C0 +ENDCHAR +STARTCHAR U_41A2 +ENCODING 16802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6060 +2100 +F3C0 +2140 +37E0 +E140 +2220 +6420 +ENDCHAR +STARTCHAR U_41A3 +ENCODING 16803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +E040 +3F80 +2000 +3FC0 +2940 +4C80 +9860 +ENDCHAR +STARTCHAR U_41A4 +ENCODING 16804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +A4A0 +5F60 +9500 +1B00 +1500 +1B40 +7D80 +0700 +3900 +ENDCHAR +STARTCHAR U_41A5 +ENCODING 16805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +40C0 +FFC0 +0840 +7480 +0F00 +7500 +0C80 +7460 +ENDCHAR +STARTCHAR U_41A6 +ENCODING 16806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +A120 +44C0 +A480 +1B00 +E0E0 +0400 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_41A7 +ENCODING 16807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +CF60 +1400 +7FC0 +1500 +2480 +FFE0 +0900 +7FC0 +ENDCHAR +STARTCHAR U_41A8 +ENCODING 16808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +B2A0 +54C0 +9FA0 +0000 +3F80 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_41A9 +ENCODING 16809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +B5A0 +5940 +9320 +1500 +1F00 +0400 +FFE0 +1900 +E0C0 +ENDCHAR +STARTCHAR U_41AA +ENCODING 16810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +2260 +FC00 +53C0 +5100 +5100 +57E0 +5020 +9FE0 +ENDCHAR +STARTCHAR U_41AB +ENCODING 16811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +5060 +BF80 +4A80 +1A80 +6E80 +29C0 +A4A0 +9FA0 +ENDCHAR +STARTCHAR U_41AC +ENCODING 16812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6EC0 +0A00 +1F00 +1500 +1B00 +1500 +1F00 +2080 +ENDCHAR +STARTCHAR U_41AD +ENCODING 16813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6040 +1000 +FFC0 +5480 +7FE0 +5480 +FE80 +1080 +ENDCHAR +STARTCHAR U_41AE +ENCODING 16814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +67E0 +4080 +2380 +C080 +2FE0 +2AA0 +C100 +4EC0 +ENDCHAR +STARTCHAR U_41AF +ENCODING 16815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +FFE0 +5140 +FBE0 +5140 +FFE0 +1100 +7EC0 +ENDCHAR +STARTCHAR U_41B0 +ENCODING 16816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6080 +7FE0 +4900 +4F00 +4000 +5DC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_41B1 +ENCODING 16817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +E0E0 +4100 +2540 +8280 +5560 +2540 +C280 +4C60 +ENDCHAR +STARTCHAR U_41B2 +ENCODING 16818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +C460 +3FC0 +2480 +3FC0 +2480 +3F80 +4D00 +B4C0 +ENDCHAR +STARTCHAR U_41B3 +ENCODING 16819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +4780 +2100 +F340 +2DC0 +22A0 +FD00 +03E0 +ENDCHAR +STARTCHAR U_41B4 +ENCODING 16820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AB20 +52C0 +9F00 +1500 +3F80 +2480 +3F80 +24A0 +1FE0 +ENDCHAR +STARTCHAR U_41B5 +ENCODING 16821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +CA60 +7FC0 +5540 +7FC0 +1100 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_41B6 +ENCODING 16822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +D4C0 +2200 +FFC0 +2200 +3FC0 +2200 +7FC0 +8920 +ENDCHAR +STARTCHAR U_41B7 +ENCODING 16823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6F60 +0200 +7F80 +1500 +7FE0 +59A0 +6F60 +4020 +ENDCHAR +STARTCHAR U_41B8 +ENCODING 16824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +5E80 +5140 +3F80 +D160 +1F00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_41B9 +ENCODING 16825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9920 +64C0 +1F00 +0A00 +7FC0 +1500 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_41BA +ENCODING 16826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +7FE0 +90A0 +6F60 +3480 +1500 +7FC0 +3580 +DF60 +1500 +1F00 +ENDCHAR +STARTCHAR U_41BB +ENCODING 16827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +70C0 +1100 +FDE0 +6B40 +5940 +6880 +F940 +0A20 +ENDCHAR +STARTCHAR U_41BC +ENCODING 16828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +67C0 +2440 +F5C0 +2540 +2FE0 +2AA0 +FAA0 +0FE0 +ENDCHAR +STARTCHAR U_41BD +ENCODING 16829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6EC0 +0800 +7FC0 +4900 +7FC0 +4C80 +7700 +9AC0 +ENDCHAR +STARTCHAR U_41BE +ENCODING 16830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +E260 +7BC0 +5400 +79C0 +4800 +7F80 +5280 +FFE0 +ENDCHAR +STARTCHAR U_41BF +ENCODING 16831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6260 +57C0 +7540 +16C0 +7540 +5FE0 +5540 +9920 +ENDCHAR +STARTCHAR U_41C0 +ENCODING 16832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9120 +6080 +2BE0 +FD40 +29C0 +7D40 +55E0 +FF40 +1040 +ENDCHAR +STARTCHAR U_41C1 +ENCODING 16833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +70C0 +5140 +FFE0 +5480 +7DC0 +5480 +7FE0 +AA80 +ENDCHAR +STARTCHAR U_41C2 +ENCODING 16834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +2080 +1100 +FFE0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_41C3 +ENCODING 16835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +43C0 +2240 +FA40 +0240 +8BC0 +4A40 +5200 +3A00 +C220 +01E0 +ENDCHAR +STARTCHAR U_41C4 +ENCODING 16836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2240 +FBE0 +0400 +9000 +53C0 +6080 +0100 +3A00 +C420 +03E0 +ENDCHAR +STARTCHAR U_41C5 +ENCODING 16837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2140 +F920 +07E0 +8900 +4900 +5140 +4180 +3900 +C2A0 +0C60 +ENDCHAR +STARTCHAR U_41C6 +ENCODING 16838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +4280 +2180 +FC80 +0280 +8A80 +57E0 +5080 +3880 +C080 +0080 +ENDCHAR +STARTCHAR U_41C7 +ENCODING 16839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +47E0 +2420 +FFE0 +0480 +9480 +57E0 +6480 +3C80 +C6A0 +0460 +ENDCHAR +STARTCHAR U_41C8 +ENCODING 16840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +4240 +2280 +F900 +0280 +8960 +5100 +57C0 +3900 +C100 +0FE0 +ENDCHAR +STARTCHAR U_41C9 +ENCODING 16841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +47E0 +2100 +F900 +9200 +57C0 +6A40 +3240 +C240 +03C0 +0240 +ENDCHAR +STARTCHAR U_41CA +ENCODING 16842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4480 +27E0 +FC00 +0480 +9480 +5500 +6500 +3640 +CBE0 +1020 +ENDCHAR +STARTCHAR U_41CB +ENCODING 16843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +41C0 +2640 +F980 +0100 +96E0 +5120 +66C0 +3840 +C180 +0E00 +ENDCHAR +STARTCHAR U_41CC +ENCODING 16844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +44A0 +22A0 +FAC0 +07E0 +9420 +57E0 +6C20 +37E0 +C420 +0860 +ENDCHAR +STARTCHAR U_41CD +ENCODING 16845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +4220 +2220 +FBE0 +0080 +8A80 +4AE0 +5280 +3A80 +C380 +0CE0 +ENDCHAR +STARTCHAR U_41CE +ENCODING 16846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +43E0 +2140 +F940 +03E0 +9000 +53E0 +6220 +3BE0 +C220 +03E0 +ENDCHAR +STARTCHAR U_41CF +ENCODING 16847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +2000 +FFC0 +9440 +57C0 +6000 +37C0 +C080 +0FE0 +0180 +ENDCHAR +STARTCHAR U_41D0 +ENCODING 16848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0140 +FFE0 +0140 +97C0 +5120 +63C0 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_41D1 +ENCODING 16849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +04A0 +FFE0 +04A0 +97E0 +5280 +6480 +3FE0 +C080 +0080 +ENDCHAR +STARTCHAR U_41D2 +ENCODING 16850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +B280 +D480 +FFE0 +A180 +F6E0 +0400 +7FC0 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_41D3 +ENCODING 16851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +C100 +37C0 +C540 +3540 +CFC0 +0420 +7FC0 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_41D4 +ENCODING 16852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3F80 +2080 +3F80 +E5C0 +BF40 +EBC0 +A540 +BE60 +ENDCHAR +STARTCHAR U_41D5 +ENCODING 16853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +FD60 +9380 +9540 +5FE0 +6200 +3FE0 +CAA0 +0AE0 +ENDCHAR +STARTCHAR U_41D6 +ENCODING 16854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5280 +8C40 +2000 +3FC0 +C840 +0840 +1040 +6280 +0100 +ENDCHAR +STARTCHAR U_41D7 +ENCODING 16855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5280 +8C40 +0200 +1100 +2480 +C860 +1100 +2380 +3C80 +ENDCHAR +STARTCHAR U_41D8 +ENCODING 16856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9480 +FFE0 +1000 +1F00 +2100 +2100 +3E00 +0200 +FFE0 +ENDCHAR +STARTCHAR U_41D9 +ENCODING 16857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A280 +1440 +7C40 +0540 +7D40 +4140 +7D40 +0440 +38C0 +ENDCHAR +STARTCHAR U_41DA +ENCODING 16858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +1100 +2100 +E180 +2140 +2120 +2100 +2100 +ENDCHAR +STARTCHAR U_41DB +ENCODING 16859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +0400 +2400 +27C0 +2400 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_41DC +ENCODING 16860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1440 +2000 +3FC0 +2440 +4480 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_41DD +ENCODING 16861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0900 +0880 +0BE0 +FC40 +0280 +0300 +0CA0 +F060 +ENDCHAR +STARTCHAR U_41DE +ENCODING 16862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +1100 +FFE0 +1100 +1F00 +1100 +1100 +1F00 +ENDCHAR +STARTCHAR U_41DF +ENCODING 16863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +2100 +3FE0 +4520 +A920 +1120 +22A0 +C440 +ENDCHAR +STARTCHAR U_41E0 +ENCODING 16864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +0800 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_41E1 +ENCODING 16865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9280 +0C40 +0400 +FFE0 +8020 +7FC0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_41E2 +ENCODING 16866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A280 +1440 +0400 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_41E3 +ENCODING 16867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1440 +0A00 +3580 +C460 +1500 +2480 +4440 +0C00 +ENDCHAR +STARTCHAR U_41E4 +ENCODING 16868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +FFE0 +0400 +7FC0 +4440 +4A40 +7140 +40C0 +ENDCHAR +STARTCHAR U_41E5 +ENCODING 16869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +7FC0 +0400 +0400 +2780 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_41E6 +ENCODING 16870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9280 +0400 +3F80 +2480 +2480 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_41E7 +ENCODING 16871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +FFE0 +0400 +7FC0 +4440 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_41E8 +ENCODING 16872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1F80 +7080 +1F00 +E4E0 +1F80 +2400 +3F80 +0400 +ENDCHAR +STARTCHAR U_41E9 +ENCODING 16873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +2480 +3F80 +2480 +3F80 +0480 +0720 +7CE0 +ENDCHAR +STARTCHAR U_41EA +ENCODING 16874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +FFE0 +1100 +2080 +3F80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_41EB +ENCODING 16875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A280 +1440 +7FC0 +4400 +5F80 +5080 +5F80 +4400 +7FE0 +ENDCHAR +STARTCHAR U_41EC +ENCODING 16876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +2400 +3F80 +4400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_41ED +ENCODING 16877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +3F80 +0500 +FFE0 +1800 +EF80 +0840 +07C0 +ENDCHAR +STARTCHAR U_41EE +ENCODING 16878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5280 +8C40 +11C0 +2700 +E100 +2FE0 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_41EF +ENCODING 16879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +1080 +1F80 +1080 +1F80 +1080 +FFE0 +0080 +ENDCHAR +STARTCHAR U_41F0 +ENCODING 16880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +1F80 +0100 +7640 +1580 +2480 +CC60 +0000 +FFE0 +ENDCHAR +STARTCHAR U_41F1 +ENCODING 16881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9480 +7FC0 +4440 +4740 +5940 +4640 +4440 +5840 +7FC0 +ENDCHAR +STARTCHAR U_41F2 +ENCODING 16882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8440 +7FC0 +2480 +1500 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_41F3 +ENCODING 16883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9680 +FFE0 +0400 +7FC0 +0400 +FFE0 +0580 +0E20 +F1E0 +ENDCHAR +STARTCHAR U_41F4 +ENCODING 16884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +3F80 +0A00 +7FC0 +4A40 +4A40 +73C0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_41F5 +ENCODING 16885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21C0 +9600 +4400 +47E0 +1480 +E480 +4480 +4880 +ENDCHAR +STARTCHAR U_41F6 +ENCODING 16886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +1F00 +2100 +FFC0 +4440 +7FC0 +4440 +7FC0 +8440 +ENDCHAR +STARTCHAR U_41F7 +ENCODING 16887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21C0 +9600 +4400 +47E0 +1480 +E480 +4480 +4880 +ENDCHAR +STARTCHAR U_41F8 +ENCODING 16888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9240 +3F80 +2080 +3F80 +0000 +3F80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_41F9 +ENCODING 16889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +D240 +3F80 +0880 +FFE0 +0880 +3F80 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_41FA +ENCODING 16890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +7FC0 +0000 +3F80 +2080 +3F80 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_41FB +ENCODING 16891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +9280 +7FC0 +4040 +7FC0 +4400 +7FC0 +4400 +7FC0 +4420 +87E0 +ENDCHAR +STARTCHAR U_41FC +ENCODING 16892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +5140 +8A20 +3F80 +2080 +7FC0 +4440 +7FC0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_41FD +ENCODING 16893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +2000 +27C0 +F400 +27E0 +3480 +E480 +2480 +E880 +ENDCHAR +STARTCHAR U_41FE +ENCODING 16894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_41FF +ENCODING 16895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FC0 +0400 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4200 +ENCODING 16896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +FE20 +AAA0 +AAA0 +FFA0 +AAA0 +AAA0 +AA20 +8260 +ENDCHAR +STARTCHAR U_4201 +ENCODING 16897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +0400 +0A00 +3F80 +C060 +3F80 +2A80 +3F80 +2A80 +ENDCHAR +STARTCHAR U_4202 +ENCODING 16898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +2080 +1100 +7FC0 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_4203 +ENCODING 16899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +27C0 +9240 +4240 +5480 +2FC0 +E440 +4440 +47C0 +ENDCHAR +STARTCHAR U_4204 +ENCODING 16900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +3F80 +0100 +A660 +94A0 +8D20 +94A0 +A460 +FFE0 +ENDCHAR +STARTCHAR U_4205 +ENCODING 16901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +0240 +FFE0 +0200 +7920 +4940 +7980 +02A0 +FC60 +ENDCHAR +STARTCHAR U_4206 +ENCODING 16902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +3FC0 +2000 +3FC0 +2040 +3FC0 +2280 +3FE0 +4480 +B860 +ENDCHAR +STARTCHAR U_4207 +ENCODING 16903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +0F00 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4208 +ENCODING 16904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +7BE0 +4AA0 +7AA0 +4BE0 +7A00 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_4209 +ENCODING 16905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +3F80 +1100 +7FC0 +0900 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_420A +ENCODING 16906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +3F80 +0400 +FFE0 +2880 +DF60 +2900 +0600 +79C0 +ENDCHAR +STARTCHAR U_420B +ENCODING 16907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +A680 +75C0 +1600 +2580 +DF60 +1100 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_420C +ENCODING 16908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +2000 +17C0 +9440 +47C0 +5440 +27C0 +C440 +4FE0 +ENDCHAR +STARTCHAR U_420D +ENCODING 16909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +FFE0 +2000 +3FC0 +1680 +1880 +1580 +1680 +1F80 +ENDCHAR +STARTCHAR U_420E +ENCODING 16910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +2900 +7FC0 +2900 +3FC0 +0400 +FFE0 +2480 +4440 +ENDCHAR +STARTCHAR U_420F +ENCODING 16911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8400 +7FC0 +1100 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_4210 +ENCODING 16912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2400 +2FE0 +7480 +A6A0 +25C0 +2480 +2940 +2620 +ENDCHAR +STARTCHAR U_4211 +ENCODING 16913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +1F00 +1100 +1700 +1500 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_4212 +ENCODING 16914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +FFE0 +0400 +7FC0 +4A40 +5F40 +4440 +5F40 +44C0 +ENDCHAR +STARTCHAR U_4213 +ENCODING 16915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +3F00 +2500 +2900 +3FC0 +6440 +AB40 +3FC0 +0080 +ENDCHAR +STARTCHAR U_4214 +ENCODING 16916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7BC0 +4840 +7BC0 +4000 +7FC0 +4240 +7980 +4660 +ENDCHAR +STARTCHAR U_4215 +ENCODING 16917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +3F00 +2500 +2900 +FFE0 +2400 +3780 +4C00 +87E0 +ENDCHAR +STARTCHAR U_4216 +ENCODING 16918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +7C40 +1140 +FCC0 +1240 +3840 +57E0 +9040 +1040 +ENDCHAR +STARTCHAR U_4217 +ENCODING 16919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +1440 +2FE0 +6440 +AA20 +23C0 +2C40 +2380 +2C60 +ENDCHAR +STARTCHAR U_4218 +ENCODING 16920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +2080 +1100 +FFE0 +2080 +4920 +30C0 +4920 +79E0 +ENDCHAR +STARTCHAR U_4219 +ENCODING 16921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +2040 +4840 +F3E0 +2240 +4940 +F940 +A840 +A8C0 +ENDCHAR +STARTCHAR U_421A +ENCODING 16922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9500 +2080 +7FC0 +0000 +3F80 +2080 +7FC0 +A4A0 +9FA0 +ENDCHAR +STARTCHAR U_421B +ENCODING 16923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2040 +3DE0 +2120 +FEA0 +AA40 +FE40 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_421C +ENCODING 16924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2780 +4080 +DFE0 +4080 +5FE0 +54A0 +4300 +5CE0 +ENDCHAR +STARTCHAR U_421D +ENCODING 16925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +2500 +DFE0 +1100 +1F00 +1100 +1F00 +1100 +ENDCHAR +STARTCHAR U_421E +ENCODING 16926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +FFE0 +2080 +3F80 +0000 +3F80 +2280 +2C80 +3F80 +ENDCHAR +STARTCHAR U_421F +ENCODING 16927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7C40 +4540 +7D40 +4540 +7D40 +4540 +7C40 +82C0 +ENDCHAR +STARTCHAR U_4220 +ENCODING 16928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +3FC0 +1480 +7FC0 +0800 +FFE0 +1480 +2300 +DCE0 +ENDCHAR +STARTCHAR U_4221 +ENCODING 16929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +3FC0 +4940 +BA40 +2740 +0980 +A440 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_4222 +ENCODING 16930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +2080 +7FC0 +2080 +3F80 +0400 +FFE0 +2480 +C440 +ENDCHAR +STARTCHAR U_4223 +ENCODING 16931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +0100 +FBE0 +5240 +5E40 +5180 +5D80 +E240 +0C20 +ENDCHAR +STARTCHAR U_4224 +ENCODING 16932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +2240 +FA40 +27E0 +7240 +6BC0 +A240 +2240 +23C0 +ENDCHAR +STARTCHAR U_4225 +ENCODING 16933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +3C80 +C880 +7FE0 +54A0 +7CA0 +5520 +7D20 +9660 +ENDCHAR +STARTCHAR U_4226 +ENCODING 16934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +AA80 +2480 +2A80 +3F80 +2880 +CF60 +1900 +0600 +79C0 +ENDCHAR +STARTCHAR U_4227 +ENCODING 16935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +2440 +7F80 +0880 +1FC0 +2040 +7FE0 +9520 +22C0 +ENDCHAR +STARTCHAR U_4228 +ENCODING 16936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +F7C0 +9440 +E7C0 +9440 +D7C0 +A540 +8480 +8660 +ENDCHAR +STARTCHAR U_4229 +ENCODING 16937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +A680 +1040 +2C20 +C2A0 +7CA0 +A2A0 +54A0 +5E20 +E060 +ENDCHAR +STARTCHAR U_422A +ENCODING 16938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9480 +7FC0 +1100 +1F00 +0000 +7FC0 +4A40 +5F40 +44C0 +ENDCHAR +STARTCHAR U_422B +ENCODING 16939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9280 +2540 +4880 +F3E0 +22A0 +4AA0 +FB60 +AA20 +AA60 +ENDCHAR +STARTCHAR U_422C +ENCODING 16940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +4280 +2240 +9FE0 +4A40 +1FC0 +2A40 +CFC0 +4A40 +ENDCHAR +STARTCHAR U_422D +ENCODING 16941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +CA80 +1000 +3F80 +2480 +3F80 +2480 +3F80 +1540 +E3E0 +ENDCHAR +STARTCHAR U_422E +ENCODING 16942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2200 +FBE0 +0420 +8BA0 +4AA0 +52A0 +3BA0 +C060 +ENDCHAR +STARTCHAR U_422F +ENCODING 16943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D480 +FFE0 +0800 +3F80 +2980 +3280 +FFE0 +2080 +4040 +ENDCHAR +STARTCHAR U_4230 +ENCODING 16944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AB40 +77C0 +2440 +37C0 +6440 +A7C0 +2440 +64C0 +ENDCHAR +STARTCHAR U_4231 +ENCODING 16945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8B40 +7C80 +1500 +3B80 +2080 +3B80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4232 +ENCODING 16946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A840 +FB80 +6A80 +4C60 +FB80 +6A80 +4900 +96E0 +ENDCHAR +STARTCHAR U_4233 +ENCODING 16947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2480 +3F80 +0000 +7BC0 +4A40 +2940 +5AC0 +ENDCHAR +STARTCHAR U_4234 +ENCODING 16948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +8A80 +7FC0 +0A80 +7FE0 +0A80 +3F80 +1B00 +6AC0 +ENDCHAR +STARTCHAR U_4235 +ENCODING 16949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9540 +2A80 +5F40 +0000 +7FC0 +2A40 +1940 +6AC0 +ENDCHAR +STARTCHAR U_4236 +ENCODING 16950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +5140 +6EC0 +1100 +3F80 +5140 +1100 +1F00 +ENDCHAR +STARTCHAR U_4237 +ENCODING 16951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +2780 +FC80 +2300 +7480 +AFE0 +2480 +2780 +ENDCHAR +STARTCHAR U_4238 +ENCODING 16952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BC40 +4940 +FCC0 +5640 +7D40 +5440 +7FE0 +9440 +ENDCHAR +STARTCHAR U_4239 +ENCODING 16953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BFE0 +2020 +4FC0 +1200 +37C0 +5540 +1540 +17C0 +ENDCHAR +STARTCHAR U_423A +ENCODING 16954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +A440 +4380 +7480 +2B00 +5480 +6960 +0200 +A980 +ENDCHAR +STARTCHAR U_423B +ENCODING 16955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4AA0 +FFE0 +4880 +7BE0 +4AA0 +7BE0 +4AA0 +4BE0 +9AA0 +ENDCHAR +STARTCHAR U_423C +ENCODING 16956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFE0 +4A20 +92C0 +54A0 +8FA0 +1240 +7240 +1FC0 +ENDCHAR +STARTCHAR U_423D +ENCODING 16957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFE0 +0900 +3F80 +2480 +3F80 +1F00 +0400 +7FC0 +ENDCHAR +STARTCHAR U_423E +ENCODING 16958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AB40 +77C0 +2440 +37C0 +6C40 +A7C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_423F +ENCODING 16959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFE0 +54A0 +1280 +1F80 +0400 +FFE0 +1100 +60C0 +ENDCHAR +STARTCHAR U_4240 +ENCODING 16960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BFC0 +2900 +3FC0 +2900 +2F00 +4000 +5540 +A2A0 +ENDCHAR +STARTCHAR U_4241 +ENCODING 16961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FD60 +4A80 +7D60 +4900 +7BC0 +4C80 +FB00 +0880 +ENDCHAR +STARTCHAR U_4242 +ENCODING 16962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BFC0 +2480 +3F80 +3F80 +0900 +3F80 +1500 +6CC0 +ENDCHAR +STARTCHAR U_4243 +ENCODING 16963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +95E0 +56A0 +52C0 +7740 +1040 +F7E0 +5240 +90C0 +ENDCHAR +STARTCHAR U_4244 +ENCODING 16964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +F7E0 +5100 +6FE0 +5640 +5BA0 +7480 +4300 +4CE0 +ENDCHAR +STARTCHAR U_4245 +ENCODING 16965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A40 +BC20 +1200 +7F80 +2A80 +7E80 +13A0 +FE60 +1420 +ENDCHAR +STARTCHAR U_4246 +ENCODING 16966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BF40 +2900 +2500 +3FC0 +2000 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_4247 +ENCODING 16967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +A440 +7D40 +2540 +3D40 +2540 +FF40 +5440 +7EC0 +ENDCHAR +STARTCHAR U_4248 +ENCODING 16968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FD40 +2900 +FDE0 +4A40 +7D40 +4880 +7940 +4E20 +ENDCHAR +STARTCHAR U_4249 +ENCODING 16969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +B460 +49C0 +FF40 +5540 +7D40 +5540 +7D20 +95A0 +ENDCHAR +STARTCHAR U_424A +ENCODING 16970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +9F40 +0400 +FFE0 +2480 +7FC0 +A4A0 +7FC0 +0400 +ENDCHAR +STARTCHAR U_424B +ENCODING 16971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +AFC0 +2540 +F7C0 +55C0 +5640 +2BC0 +5A40 +93C0 +ENDCHAR +STARTCHAR U_424C +ENCODING 16972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FC40 +4A80 +57E0 +4900 +4EC0 +69A0 +52A0 +4580 +ENDCHAR +STARTCHAR U_424D +ENCODING 16973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +FFC0 +4A40 +7BC0 +4440 +4B40 +5AC0 +6640 +40C0 +ENDCHAR +STARTCHAR U_424E +ENCODING 16974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6480 +9540 +FFE0 +9120 +1F00 +0400 +7FE0 +1480 +6460 +ENDCHAR +STARTCHAR U_424F +ENCODING 16975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +B460 +4BC0 +FD40 +5680 +7DE0 +5480 +7FE0 +9480 +ENDCHAR +STARTCHAR U_4250 +ENCODING 16976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +FC80 +13E0 +7C80 +55E0 +7D20 +5520 +FF20 +11E0 +ENDCHAR +STARTCHAR U_4251 +ENCODING 16977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2000 +7FC0 +AA80 +3FC0 +2A80 +FFE0 +4A40 +8520 +ENDCHAR +STARTCHAR U_4252 +ENCODING 16978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +A480 +13C0 +7C80 +2500 +FFE0 +2480 +7FC0 +A4A0 +3F80 +ENDCHAR +STARTCHAR U_4253 +ENCODING 16979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +27C0 +FD40 +27C0 +7540 +6FE0 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_4254 +ENCODING 16980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +F940 +27E0 +3940 +4880 +A940 +17E0 +2140 +C7E0 +ENDCHAR +STARTCHAR U_4255 +ENCODING 16981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FC0 +5540 +4E40 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4256 +ENCODING 16982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +1140 +FE20 +5480 +7C40 +55E0 +FE20 +11C0 +1040 +ENDCHAR +STARTCHAR U_4257 +ENCODING 16983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +27C0 +F440 +2FE0 +2540 +36C0 +E540 +2FE0 +6040 +ENDCHAR +STARTCHAR U_4258 +ENCODING 16984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2100 +FFE0 +2820 +67C0 +7000 +AFE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_4259 +ENCODING 16985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +A480 +FFE0 +A4A0 +1500 +7FC0 +0000 +FFE0 +1100 +3F80 +ENDCHAR +STARTCHAR U_425A +ENCODING 16986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +3F80 +2A80 +FFE0 +9020 +1F00 +1900 +2540 +30C0 +ENDCHAR +STARTCHAR U_425B +ENCODING 16987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FC0 +5540 +4E40 +7FC0 +5540 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_425C +ENCODING 16988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +4280 +77E0 +AC80 +27C0 +FC80 +27C0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_425D +ENCODING 16989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FC0 +0400 +3F80 +4480 +FFE0 +2280 +F900 +46E0 +ENDCHAR +STARTCHAR U_425E +ENCODING 16990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FE0 +4100 +7F40 +5480 +9D60 +5240 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_425F +ENCODING 16991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2FE0 +F480 +27E0 +3C80 +E7E0 +2240 +2180 +6660 +ENDCHAR +STARTCHAR U_4260 +ENCODING 16992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +A480 +3500 +5FE0 +A140 +5F40 +C080 +4A80 +4B40 +5220 +ENDCHAR +STARTCHAR U_4261 +ENCODING 16993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +FFE0 +2A80 +2E80 +2080 +3F80 +1300 +1500 +FFE0 +ENDCHAR +STARTCHAR U_4262 +ENCODING 16994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7FC0 +2480 +5540 +FFE0 +2080 +2E80 +2A80 +3F80 +ENDCHAR +STARTCHAR U_4263 +ENCODING 16995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +39C0 +2040 +39C0 +2040 +3FE0 +5020 +9560 +2540 +ENDCHAR +STARTCHAR U_4264 +ENCODING 16996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +5500 +FDE0 +5740 +2940 +FF40 +4880 +3940 +C620 +ENDCHAR +STARTCHAR U_4265 +ENCODING 16997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +A480 +5FE0 +52A0 +FFE0 +5520 +7FE0 +CA40 +5AA0 +E7A0 +ENDCHAR +STARTCHAR U_4266 +ENCODING 16998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +5FE0 +2AA0 +FFE0 +2480 +2FE0 +3480 +27C0 +F000 +0FE0 +ENDCHAR +STARTCHAR U_4267 +ENCODING 16999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +A480 +EE20 +AAA0 +D2A0 +7EA0 +10A0 +FEA0 +5420 +FE60 +ENDCHAR +STARTCHAR U_4268 +ENCODING 17000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7DC0 +2940 +FE20 +25C0 +D940 +3540 +D480 +2360 +ENDCHAR +STARTCHAR U_4269 +ENCODING 17001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2FE0 +FA80 +2B80 +7EE0 +AAA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_426A +ENCODING 17002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_426B +ENCODING 17003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7DE0 +12A0 +FCA0 +5560 +3B80 +E4E0 +1500 +64C0 +ENDCHAR +STARTCHAR U_426C +ENCODING 17004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +6940 +55E0 +7D40 +53E0 +5D40 +4480 +BB60 +ENDCHAR +STARTCHAR U_426D +ENCODING 17005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +2900 +7FC0 +4440 +4A40 +7FC0 +4480 +7780 +4460 +7720 +ENDCHAR +STARTCHAR U_426E +ENCODING 17006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +FBE0 +AA60 +CAA0 +FFE0 +9220 +BFA0 +9220 +9FA0 +ENDCHAR +STARTCHAR U_426F +ENCODING 17007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +5140 +7880 +4EC0 +75A0 +1A80 +1F80 +6040 +ENDCHAR +STARTCHAR U_4270 +ENCODING 17008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +5540 +FE20 +A540 +3D40 +2480 +3D40 +C620 +ENDCHAR +STARTCHAR U_4271 +ENCODING 17009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9680 +2040 +EFE0 +3A40 +6BC0 +B800 +2EE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_4272 +ENCODING 17010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +EFE0 +2540 +EFE0 +8D60 +EBA0 +2D60 +2BA0 +CD60 +ENDCHAR +STARTCHAR U_4273 +ENCODING 17011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +7220 +9140 +FBE0 +A880 +FBE0 +A880 +FBE0 +A880 +ENDCHAR +STARTCHAR U_4274 +ENCODING 17012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +FFE0 +4A40 +7FC0 +1100 +7FC0 +2480 +EB00 +30E0 +ENDCHAR +STARTCHAR U_4275 +ENCODING 17013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +3F80 +2480 +FFE0 +4A40 +9F20 +3580 +5F40 +1280 +39C0 +ENDCHAR +STARTCHAR U_4276 +ENCODING 17014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9480 +7FE0 +D280 +7FC0 +5280 +7FE0 +5100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_4277 +ENCODING 17015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +D680 +39C0 +2940 +7FE0 +4900 +7FE0 +5540 +5D40 +5680 +BD60 +ENDCHAR +STARTCHAR U_4278 +ENCODING 17016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +4440 +EEE0 +A0A0 +EEE0 +4040 +EEE0 +4A40 +8E40 +ENDCHAR +STARTCHAR U_4279 +ENCODING 17017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +9520 +EEE0 +AAA0 +FFE0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_427A +ENCODING 17018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A800 +77C0 +2100 +F900 +2100 +7100 +6900 +A100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_427B +ENCODING 17019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AF80 +7480 +2480 +FC80 +27E0 +7480 +6C80 +A4A0 +2660 +2420 +ENDCHAR +STARTCHAR U_427C +ENCODING 17020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AF00 +7400 +2400 +FFE0 +2480 +7480 +6C80 +A480 +2480 +2880 +ENDCHAR +STARTCHAR U_427D +ENCODING 17021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AAA0 +71C0 +2080 +FBE0 +6080 +7080 +ABE0 +A080 +2080 +2080 +ENDCHAR +STARTCHAR U_427E +ENCODING 17022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7BC0 +0A00 +FA20 +09E0 +2480 +1500 +FFE0 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_427F +ENCODING 17023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AB80 +72A0 +21C0 +F880 +27E0 +7080 +6880 +A080 +2280 +2100 +ENDCHAR +STARTCHAR U_4280 +ENCODING 17024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7100 +27E0 +F900 +2100 +77C0 +6C40 +A440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4281 +ENCODING 17025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AD00 +77C0 +2500 +F900 +2FE0 +7280 +6A80 +A280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4282 +ENCODING 17026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +77E0 +2100 +FFC0 +2540 +7540 +6D40 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_4283 +ENCODING 17027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFC0 +7440 +27C0 +FD40 +27C0 +7540 +6D40 +A540 +25C0 +2920 +ENDCHAR +STARTCHAR U_4284 +ENCODING 17028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2340 +3AC0 +E240 +24E0 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4285 +ENCODING 17029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +73C0 +2440 +FA80 +2100 +73E0 +AE20 +2A20 +23E0 +2220 +ENDCHAR +STARTCHAR U_4286 +ENCODING 17030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63C0 +4040 +7BC0 +4040 +7FC0 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4287 +ENCODING 17031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +A920 +77E0 +2100 +FFE0 +2520 +77E0 +6D20 +A7E0 +2520 +2560 +ENDCHAR +STARTCHAR U_4288 +ENCODING 17032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +AFE0 +7000 +27C0 +F540 +2FE0 +7540 +6D40 +A7E0 +2040 +2180 +ENDCHAR +STARTCHAR U_4289 +ENCODING 17033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2420 +F900 +27E0 +7100 +6B80 +A540 +2920 +2100 +ENDCHAR +STARTCHAR U_428A +ENCODING 17034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC20 +77E0 +2400 +FDE0 +2480 +77E0 +6C80 +A7E0 +2480 +28E0 +ENDCHAR +STARTCHAR U_428B +ENCODING 17035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AD40 +7540 +2740 +F9E0 +2740 +7540 +6D40 +A540 +29E0 +2100 +ENDCHAR +STARTCHAR U_428C +ENCODING 17036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7800 +2A80 +FA80 +2BE0 +6A80 +7A80 +AA80 +2BA0 +32E0 +ENDCHAR +STARTCHAR U_428D +ENCODING 17037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +13E0 +FD20 +1120 +3A20 +D4C0 +1480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_428E +ENCODING 17038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +AB40 +77E0 +2100 +FFE0 +2240 +77E0 +6A40 +A2C0 +2220 +23E0 +ENDCHAR +STARTCHAR U_428F +ENCODING 17039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AAA0 +71C0 +2080 +F940 +2620 +7080 +6AA0 +A1C0 +2140 +2620 +ENDCHAR +STARTCHAR U_4290 +ENCODING 17040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FFC0 +2480 +7480 +6FE0 +A480 +25A0 +2660 +ENDCHAR +STARTCHAR U_4291 +ENCODING 17041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A920 +7540 +2100 +FFE0 +2820 +6BA0 +7AA0 +ABA0 +2820 +2860 +ENDCHAR +STARTCHAR U_4292 +ENCODING 17042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA80 +77E0 +2C80 +F480 +27C0 +7480 +6FC0 +A480 +2480 +27E0 +ENDCHAR +STARTCHAR U_4293 +ENCODING 17043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +73C0 +2240 +FBC0 +2000 +77E0 +6900 +A5C0 +2700 +29E0 +ENDCHAR +STARTCHAR U_4294 +ENCODING 17044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +2100 +FFC0 +2540 +7540 +6FE0 +A280 +2440 +2820 +ENDCHAR +STARTCHAR U_4295 +ENCODING 17045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A9E0 +7EA0 +23E0 +FCA0 +25E0 +7280 +6BE0 +AA80 +2480 +3BE0 +ENDCHAR +STARTCHAR U_4296 +ENCODING 17046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7FE0 +2200 +FFE0 +2AA0 +7FE0 +6920 +AFE0 +2920 +2960 +ENDCHAR +STARTCHAR U_4297 +ENCODING 17047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFC0 +7540 +2640 +FFC0 +2000 +77C0 +6900 +A7C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4298 +ENCODING 17048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7520 +27E0 +FD20 +27E0 +7240 +6BC0 +A240 +23C0 +2240 +ENDCHAR +STARTCHAR U_4299 +ENCODING 17049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2240 +47E0 +FA40 +4A40 +7E40 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_429A +ENCODING 17050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A900 +75E0 +2120 +FFE0 +2500 +75E0 +6D20 +A5E0 +3C00 +23E0 +ENDCHAR +STARTCHAR U_429B +ENCODING 17051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +AD40 +7540 +2B60 +FE00 +25C0 +7F40 +6540 +AE80 +3540 +2620 +ENDCHAR +STARTCHAR U_429C +ENCODING 17052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +27C0 +F540 +2FE0 +7040 +6FE0 +A440 +2240 +20C0 +ENDCHAR +STARTCHAR U_429D +ENCODING 17053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +AF20 +7540 +2FE0 +F540 +2520 +7920 +6AC0 +A2A0 +2A20 +29C0 +ENDCHAR +STARTCHAR U_429E +ENCODING 17054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7440 +2280 +FFE0 +2920 +7FE0 +6920 +ABA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_429F +ENCODING 17055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AFE0 +7440 +27C0 +F900 +2FE0 +7920 +6D60 +ABA0 +2D60 +2820 +ENDCHAR +STARTCHAR U_42A0 +ENCODING 17056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FA80 +93E0 +B940 +CA60 +2480 +1500 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_42A1 +ENCODING 17057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +ACC0 +7540 +2FE0 +FAA0 +2FE0 +7000 +6FC0 +A240 +2380 +2C60 +ENDCHAR +STARTCHAR U_42A2 +ENCODING 17058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +73C0 +1540 +F280 +5FE0 +9240 +24C0 +1500 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_42A3 +ENCODING 17059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +2FE0 +F800 +27C0 +7540 +6FC0 +A540 +27C0 +2820 +ENDCHAR +STARTCHAR U_42A4 +ENCODING 17060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AA80 +7FE0 +2AA0 +FFE0 +2440 +77C0 +A440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_42A5 +ENCODING 17061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFC0 +7140 +2FE0 +F140 +27C0 +7540 +6FC0 +A540 +27C0 +2940 +ENDCHAR +STARTCHAR U_42A6 +ENCODING 17062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +2FE0 +F820 +27C0 +7440 +67C0 +A440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_42A7 +ENCODING 17063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +72A0 +2FE0 +FA80 +2FE0 +74A0 +6FC0 +A540 +27C0 +2820 +ENDCHAR +STARTCHAR U_42A8 +ENCODING 17064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4000 +3FC0 +2080 +7FC0 +5540 +7F40 +5540 +7F40 +9560 +ENDCHAR +STARTCHAR U_42A9 +ENCODING 17065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +AF20 +7540 +2FE0 +F540 +2920 +77C0 +6D40 +A7C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_42AA +ENCODING 17066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +27C0 +FD40 +27C0 +7540 +6FE0 +A920 +2FE0 +2A20 +ENDCHAR +STARTCHAR U_42AB +ENCODING 17067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +7FE0 +2280 +FEE0 +2280 +7EE0 +6280 +AEE0 +2280 +2480 +ENDCHAR +STARTCHAR U_42AC +ENCODING 17068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2540 +FFC0 +2540 +7FE0 +A540 +2920 +2480 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_42AD +ENCODING 17069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +27E0 +F820 +27C0 +7100 +6FE0 +AA40 +2F40 +20C0 +ENDCHAR +STARTCHAR U_42AE +ENCODING 17070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +ADA0 +7360 +25A0 +FB20 +2480 +77E0 +6C80 +A7E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_42AF +ENCODING 17071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7A80 +2FE0 +FA80 +2FE0 +7540 +6FC0 +A540 +27C0 +2820 +ENDCHAR +STARTCHAR U_42B0 +ENCODING 17072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A8A0 +75E0 +2EA0 +F1E0 +2E80 +71E0 +AEA0 +2AE0 +2EA0 +20E0 +ENDCHAR +STARTCHAR U_42B1 +ENCODING 17073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AD60 +7AC0 +2FE0 +F540 +2DC0 +7560 +6DC0 +A540 +2FE0 +2120 +ENDCHAR +STARTCHAR U_42B2 +ENCODING 17074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2BE0 +FF40 +AA80 +FFE0 +9680 +5BE0 +FE80 +33E0 +5E80 +95E0 +ENDCHAR +STARTCHAR U_42B3 +ENCODING 17075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AFE0 +7540 +27E0 +FD40 +27E0 +7540 +6F60 +A540 +2760 +2940 +ENDCHAR +STARTCHAR U_42B4 +ENCODING 17076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFE0 +7540 +2100 +F280 +2FE0 +7540 +6D40 +A7C0 +2280 +2D60 +ENDCHAR +STARTCHAR U_42B5 +ENCODING 17077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +9F80 +F280 +2280 +4280 +9280 +FA80 +AA80 +A4A0 +9860 +ENDCHAR +STARTCHAR U_42B6 +ENCODING 17078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9500 +F5E0 +2F20 +4520 +9540 +F500 +AC20 +A420 +83E0 +ENDCHAR +STARTCHAR U_42B7 +ENCODING 17079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +4040 +9040 +FFE0 +2040 +40C0 +9140 +FA40 +AC40 +A840 +80C0 +ENDCHAR +STARTCHAR U_42B8 +ENCODING 17080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +4000 +9000 +FFE0 +2200 +4200 +97C0 +F840 +A840 +A080 +8300 +ENDCHAR +STARTCHAR U_42B9 +ENCODING 17081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +4700 +9100 +F100 +2FE0 +4100 +9100 +F900 +A900 +A100 +8100 +ENDCHAR +STARTCHAR U_42BA +ENCODING 17082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +9100 +F200 +23C0 +4440 +9440 +FB80 +A880 +A100 +8FE0 +ENDCHAR +STARTCHAR U_42BB +ENCODING 17083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +4400 +97E0 +F520 +2940 +4100 +9100 +F900 +AA80 +A440 +9820 +ENDCHAR +STARTCHAR U_42BC +ENCODING 17084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4080 +9080 +F080 +2480 +44E0 +9480 +F480 +AC80 +A480 +8FE0 +ENDCHAR +STARTCHAR U_42BD +ENCODING 17085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +97C0 +F140 +2140 +4FE0 +9100 +F180 +0A40 +AA20 +A420 +ENDCHAR +STARTCHAR U_42BE +ENCODING 17086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9100 +F7E0 +2100 +4380 +9380 +F540 +A920 +A900 +8100 +ENDCHAR +STARTCHAR U_42BF +ENCODING 17087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +97E0 +F100 +2100 +47E0 +9100 +F900 +0A80 +A440 +A820 +ENDCHAR +STARTCHAR U_42C0 +ENCODING 17088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4480 +4900 +4640 +5FE0 +4200 +9AC0 +A620 +ENDCHAR +STARTCHAR U_42C1 +ENCODING 17089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +9000 +6380 +2A80 +7A80 +8280 +2A80 +AAA0 +84E0 +ENDCHAR +STARTCHAR U_42C2 +ENCODING 17090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2640 +4180 +9340 +F420 +2000 +4240 +FA40 +0980 +A980 +A240 +8C20 +ENDCHAR +STARTCHAR U_42C3 +ENCODING 17091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4700 +9100 +F1E0 +4700 +9100 +F1E0 +0F00 +A900 +A120 +80E0 +ENDCHAR +STARTCHAR U_42C4 +ENCODING 17092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4420 +9420 +E660 +45A0 +95A0 +F660 +0C20 +AC20 +A420 +8460 +ENDCHAR +STARTCHAR U_42C5 +ENCODING 17093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +9500 +F7C0 +4900 +9100 +FFE0 +0100 +A900 +A900 +8100 +ENDCHAR +STARTCHAR U_42C6 +ENCODING 17094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +97E0 +E420 +4420 +97E0 +F400 +0C00 +A400 +A400 +8800 +ENDCHAR +STARTCHAR U_42C7 +ENCODING 17095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47C0 +9440 +F440 +47C0 +9500 +F500 +0C80 +A480 +A840 +8820 +ENDCHAR +STARTCHAR U_42C8 +ENCODING 17096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BC0 +FE40 +4980 +3640 +C920 +3F00 +1100 +3F80 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_42C9 +ENCODING 17097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +9FE0 +E820 +4000 +9280 +F280 +0A80 +A440 +A440 +8820 +ENDCHAR +STARTCHAR U_42CA +ENCODING 17098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +4FE0 +9100 +E100 +4100 +95E0 +F500 +0D00 +A500 +A500 +9FE0 +ENDCHAR +STARTCHAR U_42CB +ENCODING 17099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4420 +97E0 +E480 +4480 +97E0 +F480 +0C80 +A4A0 +A660 +8420 +ENDCHAR +STARTCHAR U_42CC +ENCODING 17100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4400 +9400 +E7C0 +4440 +9440 +F7C0 +0C00 +A400 +A400 +87E0 +ENDCHAR +STARTCHAR U_42CD +ENCODING 17101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +4FE0 +9040 +F040 +4740 +9540 +F540 +0F40 +A840 +A040 +80C0 +ENDCHAR +STARTCHAR U_42CE +ENCODING 17102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47C0 +9440 +E440 +47C0 +9440 +F440 +0FC0 +A800 +A000 +8FE0 +ENDCHAR +STARTCHAR U_42CF +ENCODING 17103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +93E0 +F500 +4100 +91C0 +F900 +09E0 +A900 +A100 +8100 +ENDCHAR +STARTCHAR U_42D0 +ENCODING 17104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +4100 +57E0 +E500 +2520 +44C0 +F480 +04A0 +ADA0 +A660 +ENDCHAR +STARTCHAR U_42D1 +ENCODING 17105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4100 +5FE0 +E920 +2920 +4AA0 +FC60 +0820 +A820 +A8E0 +ENDCHAR +STARTCHAR U_42D2 +ENCODING 17106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +4180 +5080 +EFE0 +20A0 +4180 +F280 +0480 +A880 +A380 +ENDCHAR +STARTCHAR U_42D3 +ENCODING 17107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +43E0 +5440 +E880 +27E0 +4020 +F7E0 +0020 +A820 +A7E0 +ENDCHAR +STARTCHAR U_42D4 +ENCODING 17108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4080 +5100 +E380 +2540 +4920 +F100 +0100 +A000 +AFE0 +ENDCHAR +STARTCHAR U_42D5 +ENCODING 17109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2100 +6FE0 +A100 +27C0 +0A00 +1480 +3FC0 +0400 +1500 +6CC0 +ENDCHAR +STARTCHAR U_42D6 +ENCODING 17110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4140 +57E0 +E140 +27C0 +4100 +F7C0 +0100 +AFE0 +A100 +ENDCHAR +STARTCHAR U_42D7 +ENCODING 17111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4480 +5480 +E7E0 +2420 +4420 +F7E0 +0480 +AC80 +A7E0 +ENDCHAR +STARTCHAR U_42D8 +ENCODING 17112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2780 +4100 +57C0 +E100 +2FE0 +4100 +F380 +0540 +A920 +A100 +ENDCHAR +STARTCHAR U_42D9 +ENCODING 17113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +4440 +57C0 +E440 +27C0 +4440 +F460 +0FC0 +A040 +A040 +ENDCHAR +STARTCHAR U_42DA +ENCODING 17114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +4AA0 +5660 +E220 +2660 +4AA0 +F220 +0220 +A220 +AEE0 +ENDCHAR +STARTCHAR U_42DB +ENCODING 17115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +4380 +5100 +EFE0 +2100 +4380 +F540 +0120 +A900 +A100 +ENDCHAR +STARTCHAR U_42DC +ENCODING 17116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +8220 +F140 +9080 +F540 +8A20 +FE00 +0480 +3FC0 +1280 +2640 +ENDCHAR +STARTCHAR U_42DD +ENCODING 17117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2920 +4540 +5000 +E100 +2FE0 +4280 +F280 +0100 +AA80 +A440 +ENDCHAR +STARTCHAR U_42DE +ENCODING 17118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +5D60 +EAA0 +2AA0 +4D60 +F820 +0820 +A8A0 +A840 +ENDCHAR +STARTCHAR U_42DF +ENCODING 17119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +47C0 +5400 +E7E0 +2000 +4100 +FAA0 +06A0 +AA40 +A3C0 +ENDCHAR +STARTCHAR U_42E0 +ENCODING 17120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +4100 +5FE0 +E920 +2FE0 +4920 +FFE0 +0920 +A920 +A960 +ENDCHAR +STARTCHAR U_42E1 +ENCODING 17121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4440 +5BA0 +E100 +27C0 +4100 +F380 +0540 +A920 +A300 +ENDCHAR +STARTCHAR U_42E2 +ENCODING 17122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +23E0 +FA40 +2440 +6E00 +1080 +7FC0 +0420 +1500 +2480 +ENDCHAR +STARTCHAR U_42E3 +ENCODING 17123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7900 +8240 +7B80 +4900 +6FE0 +F880 +49C0 +6AA0 +7C80 +1180 +ENDCHAR +STARTCHAR U_42E4 +ENCODING 17124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +FA20 +2520 +54A0 +20A0 +F820 +7020 +A940 +6080 +ENDCHAR +STARTCHAR U_42E5 +ENCODING 17125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +5540 +E540 +27C0 +4100 +F7C0 +0100 +A100 +AFE0 +ENDCHAR +STARTCHAR U_42E6 +ENCODING 17126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +4800 +57C0 +E540 +2FE0 +4440 +F540 +07E0 +A840 +A080 +ENDCHAR +STARTCHAR U_42E7 +ENCODING 17127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +4420 +57E0 +E480 +27E0 +4480 +F7E0 +0620 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_42E8 +ENCODING 17128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5440 +E280 +2FE0 +4000 +F7C0 +0440 +A440 +A7C0 +ENDCHAR +STARTCHAR U_42E9 +ENCODING 17129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26C0 +4440 +56C0 +E440 +2440 +47C0 +F280 +02A0 +A4A0 +A8E0 +ENDCHAR +STARTCHAR U_42EA +ENCODING 17130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E00 +2BE0 +4A40 +5A40 +EDC0 +2B40 +4B40 +FBC0 +0E40 +A840 +A8C0 +ENDCHAR +STARTCHAR U_42EB +ENCODING 17131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +4880 +57C0 +E140 +2FE0 +4140 +F140 +07C0 +A100 +A300 +ENDCHAR +STARTCHAR U_42EC +ENCODING 17132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4100 +5FE0 +E280 +2440 +4920 +F540 +09A0 +A140 +A300 +ENDCHAR +STARTCHAR U_42ED +ENCODING 17133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +57C0 +E000 +27C0 +4440 +F7C0 +0440 +A7C0 +A440 +ENDCHAR +STARTCHAR U_42EE +ENCODING 17134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4440 +5820 +E7C0 +2100 +47C0 +F100 +0540 +A380 +AFE0 +ENDCHAR +STARTCHAR U_42EF +ENCODING 17135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3140 +47E0 +7100 +57C0 +7480 +8E60 +9080 +3FC0 +0420 +2480 +4C40 +ENDCHAR +STARTCHAR U_42F0 +ENCODING 17136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +3580 +CE60 +0880 +3FC0 +1500 +2480 +ENDCHAR +STARTCHAR U_42F1 +ENCODING 17137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5540 +E540 +2BA0 +4100 +F380 +0540 +A920 +A100 +ENDCHAR +STARTCHAR U_42F2 +ENCODING 17138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5100 +EFE0 +2920 +4FE0 +F920 +0FE0 +A100 +A1E0 +ENDCHAR +STARTCHAR U_42F3 +ENCODING 17139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +4280 +56A0 +EAE0 +27C0 +4440 +F7C0 +0440 +A7C0 +A440 +ENDCHAR +STARTCHAR U_42F4 +ENCODING 17140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2140 +4080 +57E0 +E280 +2480 +4100 +F7E0 +0380 +A540 +A920 +ENDCHAR +STARTCHAR U_42F5 +ENCODING 17141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2200 +47E0 +FCA0 +0560 +A7A0 +A060 +ENDCHAR +STARTCHAR U_42F6 +ENCODING 17142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2FC0 +2200 +4FC0 +5840 +EFC0 +2840 +4FC0 +F840 +0FC0 +A480 +A840 +ENDCHAR +STARTCHAR U_42F7 +ENCODING 17143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13E0 +FD40 +5080 +9560 +0E00 +1080 +7FC0 +0420 +1500 +2480 +ENDCHAR +STARTCHAR U_42F8 +ENCODING 17144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +47E0 +5480 +E5E0 +2520 +45E0 +F520 +05E0 +A520 +A9E0 +ENDCHAR +STARTCHAR U_42F9 +ENCODING 17145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +43C0 +5240 +E3C0 +2000 +47E0 +F520 +07E0 +A520 +A7E0 +ENDCHAR +STARTCHAR U_42FA +ENCODING 17146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +2C40 +4440 +4560 +FF40 +2C40 +5640 +F540 +0440 +A4A0 +A520 +ENDCHAR +STARTCHAR U_42FB +ENCODING 17147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5FE0 +EC60 +2AA0 +4FE0 +F920 +0FE0 +A920 +A860 +ENDCHAR +STARTCHAR U_42FC +ENCODING 17148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2480 +45E0 +5420 +E7A0 +2920 +4AA0 +FFE0 +0AA0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_42FD +ENCODING 17149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2E40 +45E0 +5440 +EE40 +2540 +44C0 +FE40 +0440 +A640 +A8C0 +ENDCHAR +STARTCHAR U_42FE +ENCODING 17150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4440 +5BA0 +E480 +2D40 +42E0 +F520 +02C0 +A080 +A700 +ENDCHAR +STARTCHAR U_42FF +ENCODING 17151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +5540 +EFE0 +2500 +4520 +F4C0 +0480 +A540 +A620 +ENDCHAR +STARTCHAR U_4300 +ENCODING 17152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2C40 +4540 +54C0 +EE40 +2540 +4EC0 +F460 +05C0 +A440 +A440 +ENDCHAR +STARTCHAR U_4301 +ENCODING 17153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +5AA0 +EBA0 +2820 +4100 +F7E0 +0240 +A180 +A640 +ENDCHAR +STARTCHAR U_4302 +ENCODING 17154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +47E0 +5400 +E7E0 +2500 +47E0 +F480 +07E0 +A880 +ABE0 +ENDCHAR +STARTCHAR U_4303 +ENCODING 17155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +3520 +4EA0 +54A0 +EEA0 +2AA0 +4EA0 +FAA0 +0E20 +AA20 +AAE0 +ENDCHAR +STARTCHAR U_4304 +ENCODING 17156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +5AA0 +ED20 +29E0 +4100 +FFE0 +0440 +A380 +AC60 +ENDCHAR +STARTCHAR U_4305 +ENCODING 17157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +5BC0 +E940 +2FE0 +4940 +FBC0 +0A40 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_4306 +ENCODING 17158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4A40 +5FC0 +EA40 +2FC0 +4540 +F5A0 +05E0 +A920 +B0E0 +ENDCHAR +STARTCHAR U_4307 +ENCODING 17159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +57E0 +E920 +2280 +4700 +E240 +0FE0 +A540 +AB20 +ENDCHAR +STARTCHAR U_4308 +ENCODING 17160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2EE0 +4220 +EAA0 +0660 +AAA0 +A440 +ENDCHAR +STARTCHAR U_4309 +ENCODING 17161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4AA0 +5FE0 +E000 +2FE0 +4100 +F5E0 +0500 +A500 +AFE0 +ENDCHAR +STARTCHAR U_430A +ENCODING 17162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +4A80 +5500 +E200 +2FC0 +4100 +EFE0 +0100 +A920 +AFE0 +ENDCHAR +STARTCHAR U_430B +ENCODING 17163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5100 +E280 +2440 +4BA0 +F000 +07C0 +A440 +A7C0 +ENDCHAR +STARTCHAR U_430C +ENCODING 17164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4660 +4AA0 +E220 +2440 +47E0 +F420 +07E0 +A420 +A7E0 +ENDCHAR +STARTCHAR U_430D +ENCODING 17165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +4440 +57C0 +EFE0 +2920 +4FE0 +F100 +0FE0 +A100 +AFE0 +ENDCHAR +STARTCHAR U_430E +ENCODING 17166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7E0 +9A40 +9180 +F660 +0BC0 +1E40 +0BC0 +7FE0 +2480 +4440 +ENDCHAR +STARTCHAR U_430F +ENCODING 17167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +5480 +ED20 +27C0 +4800 +F100 +0920 +A920 +AFE0 +ENDCHAR +STARTCHAR U_4310 +ENCODING 17168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +4540 +5280 +E7C0 +2440 +47C0 +F440 +07C0 +A280 +ACE0 +ENDCHAR +STARTCHAR U_4311 +ENCODING 17169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4FA0 +5940 +EF40 +2AE0 +4FA0 +F100 +07C0 +A100 +AFE0 +ENDCHAR +STARTCHAR U_4312 +ENCODING 17170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4540 +57E0 +E540 +27E0 +4400 +F6A0 +07C0 +AA80 +ABE0 +ENDCHAR +STARTCHAR U_4313 +ENCODING 17171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +D540 +7E20 +57E0 +7D40 +0880 +1F60 +0800 +3F80 +1500 +2C80 +ENDCHAR +STARTCHAR U_4314 +ENCODING 17172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +5A40 +EBC0 +2800 +4FE0 +FDA0 +0FE0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_4315 +ENCODING 17173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5A40 +EA40 +2FE0 +4A40 +FAC0 +0F60 +AA40 +AA40 +ENDCHAR +STARTCHAR U_4316 +ENCODING 17174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +4FE0 +5480 +E7E0 +2480 +47E0 +F480 +0FE0 +A2C0 +A4A0 +ENDCHAR +STARTCHAR U_4317 +ENCODING 17175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +4FE0 +5540 +E540 +2FE0 +4540 +F540 +0FE0 +A000 +8AA0 +ENDCHAR +STARTCHAR U_4318 +ENCODING 17176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FD40 +A880 +FD40 +AE00 +1080 +3FC0 +0420 +2480 +4C40 +ENDCHAR +STARTCHAR U_4319 +ENCODING 17177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5380 +EFE0 +2540 +47C0 +F540 +07C0 +A280 +AC60 +ENDCHAR +STARTCHAR U_431A +ENCODING 17178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +5AA0 +EFE0 +2920 +4540 +FFE0 +0380 +A540 +A920 +ENDCHAR +STARTCHAR U_431B +ENCODING 17179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7900 +5240 +A380 +4100 +A7E0 +F880 +02C0 +F2A0 +94A0 +F180 +ENDCHAR +STARTCHAR U_431C +ENCODING 17180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AA0 +46C0 +5FE0 +E440 +2280 +4FE0 +F100 +0FE0 +A540 +A920 +ENDCHAR +STARTCHAR U_431D +ENCODING 17181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +57C0 +EAA0 +2280 +47C0 +F000 +0FE0 +A540 +A920 +ENDCHAR +STARTCHAR U_431E +ENCODING 17182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4440 +5BA0 +E000 +2EE0 +4AA0 +FEE0 +0440 +A440 +AAA0 +ENDCHAR +STARTCHAR U_431F +ENCODING 17183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2E40 +4BE0 +5AA0 +EE40 +29E0 +4E40 +FA40 +0BE0 +AE40 +A840 +ENDCHAR +STARTCHAR U_4320 +ENCODING 17184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7DE0 +52A0 +4A80 +B540 +BA20 +0C80 +3FC0 +0420 +2480 +4C40 +ENDCHAR +STARTCHAR U_4321 +ENCODING 17185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4AA0 +5FE0 +EAA0 +2FE0 +4440 +F7C0 +0440 +A280 +AFE0 +ENDCHAR +STARTCHAR U_4322 +ENCODING 17186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +5DA0 +EB60 +2280 +4540 +FBA0 +0080 +A300 +A080 +ENDCHAR +STARTCHAR U_4323 +ENCODING 17187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26E0 +4D40 +5320 +EFE0 +2820 +57C0 +F480 +07C0 +A440 +A7C0 +ENDCHAR +STARTCHAR U_4324 +ENCODING 17188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +4920 +5FE0 +ED60 +2BA0 +4D60 +F920 +0D60 +ABA0 +AD60 +ENDCHAR +STARTCHAR U_4325 +ENCODING 17189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +4FE0 +5100 +EFE0 +2040 +47C0 +F040 +07C0 +AA40 +ABA0 +ENDCHAR +STARTCHAR U_4326 +ENCODING 17190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +4360 +55A0 +EB20 +2480 +4FE0 +F480 +07E0 +A480 +A7E0 +ENDCHAR +STARTCHAR U_4327 +ENCODING 17191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5FE0 +E020 +27C0 +4100 +FFE0 +0E40 +ABE0 +AE40 +ENDCHAR +STARTCHAR U_4328 +ENCODING 17192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +4440 +55E0 +EAA0 +3440 +4BA0 +F000 +0FE0 +A540 +AB20 +ENDCHAR +STARTCHAR U_4329 +ENCODING 17193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5FE0 +EAA0 +2FE0 +4140 +FFE0 +08A0 +AA40 +A8A0 +ENDCHAR +STARTCHAR U_432A +ENCODING 17194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +5AA0 +EEE0 +2BA0 +4AA0 +FB20 +0AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_432B +ENCODING 17195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2A40 +4F60 +5A40 +EFA0 +2000 +47C0 +F540 +07C0 +A280 +ACE0 +ENDCHAR +STARTCHAR U_432C +ENCODING 17196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +4A80 +54E0 +EE20 +2AE0 +4E80 +FAE0 +0E80 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_432D +ENCODING 17197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5500 +EFE0 +2480 +47E0 +F480 +07E0 +A540 +AAA0 +ENDCHAR +STARTCHAR U_432E +ENCODING 17198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +4FE0 +5920 +EBA0 +2100 +42E0 +FFA0 +06E0 +ABA0 +AAE0 +ENDCHAR +STARTCHAR U_432F +ENCODING 17199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +57C0 +E540 +2280 +47E0 +FC80 +07E0 +A480 +A7E0 +ENDCHAR +STARTCHAR U_4330 +ENCODING 17200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4440 +57C0 +E440 +2FE0 +4540 +F7C0 +0540 +AFE0 +A140 +ENDCHAR +STARTCHAR U_4331 +ENCODING 17201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +4400 +57C0 +E440 +2FE0 +4AA0 +FEA0 +0BE0 +AEA0 +ABA0 +ENDCHAR +STARTCHAR U_4332 +ENCODING 17202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +5FE0 +E100 +2FE0 +4AA0 +FFE0 +0100 +AFE0 +AAA0 +ENDCHAR +STARTCHAR U_4333 +ENCODING 17203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +5D60 +EBA0 +2D60 +4BA0 +F100 +07C0 +A140 +AFE0 +ENDCHAR +STARTCHAR U_4334 +ENCODING 17204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +4400 +57C0 +E440 +2FE0 +4AA0 +FFA0 +0AE0 +AFA0 +AAA0 +ENDCHAR +STARTCHAR U_4335 +ENCODING 17205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +47E0 +5540 +E7E0 +26A0 +47E0 +F4A0 +07E0 +A8A0 +ABE0 +ENDCHAR +STARTCHAR U_4336 +ENCODING 17206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +4080 +57E0 +E180 +2180 +4280 +F280 +0480 +3480 +C980 +ENDCHAR +STARTCHAR U_4337 +ENCODING 17207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5920 +E920 +2920 +4FE0 +F920 +0920 +3920 +CFE0 +ENDCHAR +STARTCHAR U_4338 +ENCODING 17208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +47C0 +5200 +E200 +2FE0 +4400 +F7C0 +0080 +3300 +C080 +ENDCHAR +STARTCHAR U_4339 +ENCODING 17209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +5BA0 +EAA0 +2AA0 +4BA0 +FAA0 +0820 +38A0 +C840 +ENDCHAR +STARTCHAR U_433A +ENCODING 17210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +4440 +57C0 +E440 +2440 +47C0 +F440 +04E0 +3F40 +C040 +ENDCHAR +STARTCHAR U_433B +ENCODING 17211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2220 +4220 +5320 +EAA0 +2660 +4AA0 +F320 +0220 +3220 +C660 +ENDCHAR +STARTCHAR U_433C +ENCODING 17212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +47C0 +5440 +E440 +27C0 +4280 +F280 +02A0 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_433D +ENCODING 17213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +4A40 +5540 +E100 +2FE0 +4380 +F540 +0540 +A920 +A920 +ENDCHAR +STARTCHAR U_433E +ENCODING 17214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +5FE0 +E820 +2AA0 +4FE0 +F920 +0FE0 +3920 +C960 +ENDCHAR +STARTCHAR U_433F +ENCODING 17215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +43C0 +5240 +E3C0 +2000 +47E0 +F4A0 +07E0 +34A0 +C7E0 +ENDCHAR +STARTCHAR U_4340 +ENCODING 17216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2A80 +4AE0 +5A80 +EAC0 +2B20 +4200 +FFE0 +0AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_4341 +ENCODING 17217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2940 +47E0 +5080 +ED00 +26A0 +45C0 +F680 +05C0 +36A0 +CBE0 +ENDCHAR +STARTCHAR U_4342 +ENCODING 17218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +7900 +A100 +2100 +FFE0 +2100 +A900 +B900 +C900 +0700 +ENDCHAR +STARTCHAR U_4343 +ENCODING 17219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FC40 +4880 +2500 +7FC0 +8400 +0400 +FFE0 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4344 +ENCODING 17220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +78E0 +A080 +2080 +F880 +23E0 +AA20 +BA20 +CBE0 +0220 +ENDCHAR +STARTCHAR U_4345 +ENCODING 17221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7A80 +A240 +2520 +F880 +27E0 +A840 +BA80 +C900 +0080 +ENDCHAR +STARTCHAR U_4346 +ENCODING 17222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +A420 +2000 +FBC0 +2080 +A880 +B880 +C880 +0380 +ENDCHAR +STARTCHAR U_4347 +ENCODING 17223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4700 +7900 +A080 +27C0 +F840 +2080 +A880 +B900 +CB00 +04E0 +ENDCHAR +STARTCHAR U_4348 +ENCODING 17224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +7900 +A540 +2380 +F900 +27E0 +A900 +B900 +C900 +0100 +ENDCHAR +STARTCHAR U_4349 +ENCODING 17225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43E0 +7A20 +A220 +2220 +FBE0 +2000 +A940 +B940 +CA20 +0420 +ENDCHAR +STARTCHAR U_434A +ENCODING 17226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +A280 +2440 +FAA0 +2280 +A900 +B900 +CA80 +0440 +ENDCHAR +STARTCHAR U_434B +ENCODING 17227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +A7E0 +2540 +FD40 +27E0 +AD40 +BFE0 +C900 +03C0 +ENDCHAR +STARTCHAR U_434C +ENCODING 17228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +A240 +2180 +FFE0 +2000 +ABC0 +BA40 +CA40 +03C0 +ENDCHAR +STARTCHAR U_434D +ENCODING 17229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +8C00 +77E0 +2240 +F980 +2180 +AA40 +FC20 +ENDCHAR +STARTCHAR U_434E +ENCODING 17230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +A7E0 +2540 +FFE0 +2560 +A7E0 +BD00 +C5E0 +0AA0 +ENDCHAR +STARTCHAR U_434F +ENCODING 17231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +9240 +9240 +9240 +9240 +FFC0 +8040 +8040 +8040 +8140 +8080 +ENDCHAR +STARTCHAR U_4350 +ENCODING 17232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7FC0 +0000 +3F80 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4351 +ENCODING 17233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +AAA0 +9120 +AAA0 +8020 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4352 +ENCODING 17234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +0800 +FFC0 +1C00 +2A00 +4900 +88C0 +0800 +ENDCHAR +STARTCHAR U_4353 +ENCODING 17235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +7FC0 +0000 +7FC0 +1100 +2100 +7FE0 +0900 +3100 +C300 +ENDCHAR +STARTCHAR U_4354 +ENCODING 17236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +0800 +FFE0 +1000 +1200 +2400 +4980 +9E40 +ENDCHAR +STARTCHAR U_4355 +ENCODING 17237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +A480 +FF80 +0000 +FF80 +8800 +8800 +FFC0 +8400 +AA40 +C5C0 +ENDCHAR +STARTCHAR U_4356 +ENCODING 17238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +4000 +7F80 +8080 +3E80 +2280 +3EA0 +2020 +3FE0 +ENDCHAR +STARTCHAR U_4357 +ENCODING 17239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +FFE0 +1000 +2100 +7E00 +0C00 +3080 +FFC0 +ENDCHAR +STARTCHAR U_4358 +ENCODING 17240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +5240 +7FC0 +2480 +1500 +FFE0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4359 +ENCODING 17241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +4000 +7FC0 +A480 +2280 +FFE0 +4900 +7FC0 +0100 +ENDCHAR +STARTCHAR U_435A +ENCODING 17242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0800 +7F80 +4080 +7F80 +4080 +7F80 +4A00 +67E0 +ENDCHAR +STARTCHAR U_435B +ENCODING 17243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8920 +FFE0 +0000 +FFE0 +8420 +BFA0 +8420 +9F20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_435C +ENCODING 17244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +2000 +7FC0 +C400 +7FC0 +4400 +7FC0 +4400 +7FE0 +ENDCHAR +STARTCHAR U_435D +ENCODING 17245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +FFE0 +0420 +F640 +2580 +5480 +8860 +FFE0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_435E +ENCODING 17246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +9120 +AAA0 +0280 +FFE0 +7A00 +4A40 +7980 +01A0 +FA60 +ENDCHAR +STARTCHAR U_435F +ENCODING 17247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +0C00 +9240 +FFC0 +5080 +BF40 +4A20 +0E00 +3180 +ENDCHAR +STARTCHAR U_4360 +ENCODING 17248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +2A80 +2480 +7FC0 +4A40 +5F40 +4080 +ENDCHAR +STARTCHAR U_4361 +ENCODING 17249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +7FC0 +4900 +7FC0 +4940 +7FC0 +5120 +9DE0 +ENDCHAR +STARTCHAR U_4362 +ENCODING 17250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2000 +7FC0 +AA80 +7FC0 +2A80 +FFE0 +5240 +C920 +ENDCHAR +STARTCHAR U_4363 +ENCODING 17251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +9520 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4364 +ENCODING 17252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +5B40 +5540 +9520 +2080 +3F80 +4080 +ENDCHAR +STARTCHAR U_4365 +ENCODING 17253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +7FC0 +4880 +5DC0 +6AA0 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_4366 +ENCODING 17254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +1080 +FDE0 +5740 +7DE0 +1140 +FDE0 +9540 +BDE0 +ENDCHAR +STARTCHAR U_4367 +ENCODING 17255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +F100 +A100 +A7C0 +3100 +6100 +AFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4368 +ENCODING 17256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6100 +F7E0 +2100 +F7E0 +2520 +F520 +2520 +25A0 +4540 +8100 +ENDCHAR +STARTCHAR U_4369 +ENCODING 17257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5200 +FBE0 +2440 +7240 +2240 +FA40 +2180 +2180 +4240 +8420 +ENDCHAR +STARTCHAR U_436A +ENCODING 17258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6100 +FFE0 +2100 +F100 +27C0 +F100 +2380 +2540 +4920 +9100 +ENDCHAR +STARTCHAR U_436B +ENCODING 17259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6080 +F7E0 +2420 +F200 +2240 +F280 +2300 +2220 +4220 +83E0 +ENDCHAR +STARTCHAR U_436C +ENCODING 17260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +67C0 +F100 +2540 +F380 +2100 +FFE0 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_436D +ENCODING 17261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +67C0 +F440 +2540 +F540 +2FE0 +F440 +2540 +27E0 +4040 +8080 +ENDCHAR +STARTCHAR U_436E +ENCODING 17262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +6280 +FAA0 +26C0 +F280 +2280 +F6C0 +2AA0 +2280 +44A0 +88E0 +ENDCHAR +STARTCHAR U_436F +ENCODING 17263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +63C0 +F480 +2FE0 +F400 +25C0 +F540 +25C0 +2500 +4520 +89E0 +ENDCHAR +STARTCHAR U_4370 +ENCODING 17264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +67E0 +F4A0 +24A0 +F7E0 +24A0 +F4A0 +2560 +2620 +47E0 +8420 +ENDCHAR +STARTCHAR U_4371 +ENCODING 17265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6100 +F280 +2440 +FBA0 +2100 +FFE0 +2100 +2540 +4920 +8300 +ENDCHAR +STARTCHAR U_4372 +ENCODING 17266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +64C0 +F440 +26C0 +F440 +27C0 +F280 +2280 +22A0 +44A0 +88E0 +ENDCHAR +STARTCHAR U_4373 +ENCODING 17267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +6EE0 +FAA0 +2440 +FAA0 +2000 +FEE0 +2AA0 +2440 +4440 +8AA0 +ENDCHAR +STARTCHAR U_4374 +ENCODING 17268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90C0 +6700 +F100 +2FE0 +F380 +2D60 +F100 +2FE0 +2240 +4180 +8660 +ENDCHAR +STARTCHAR U_4375 +ENCODING 17269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +63C0 +F480 +2FC0 +F140 +2FE0 +F140 +27C0 +2100 +4500 +8200 +ENDCHAR +STARTCHAR U_4376 +ENCODING 17270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6FE0 +F100 +27C0 +F540 +27C0 +F540 +27C0 +2380 +4540 +8920 +ENDCHAR +STARTCHAR U_4377 +ENCODING 17271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +67C0 +F240 +2FE0 +F440 +27C0 +F100 +2FE0 +2500 +4FE0 +8100 +ENDCHAR +STARTCHAR U_4378 +ENCODING 17272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9140 +6FE0 +F100 +27C0 +F540 +27C0 +F540 +2080 +2FE0 +4280 +8080 +ENDCHAR +STARTCHAR U_4379 +ENCODING 17273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +67C0 +F440 +27C0 +F440 +27C0 +F440 +2140 +2FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_437A +ENCODING 17274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +67C0 +F540 +27C0 +F100 +27C0 +F540 +27C0 +2100 +4AA0 +8BC0 +ENDCHAR +STARTCHAR U_437B +ENCODING 17275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +65A0 +F7E0 +2480 +F7E0 +2240 +F7E0 +2240 +2FE0 +4240 +8C20 +ENDCHAR +STARTCHAR U_437C +ENCODING 17276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9000 +6FE0 +FA40 +2FE0 +F6C0 +2B60 +F7C0 +2440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_437D +ENCODING 17277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +6400 +F7E0 +2540 +F7E0 +2540 +F7E0 +2540 +24E0 +4680 +8BE0 +ENDCHAR +STARTCHAR U_437E +ENCODING 17278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5120 +5120 +55A0 +5360 +F920 +5360 +55A0 +5120 +55A0 +9240 +ENDCHAR +STARTCHAR U_437F +ENCODING 17279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +28A0 +1860 +69A0 +8A20 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4380 +ENCODING 17280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +28A0 +ABE0 +7A80 +2A80 +2AA0 +7AA0 +ABC0 +2AA0 +A960 +5A20 +ENDCHAR +STARTCHAR U_4381 +ENCODING 17281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +25A0 +2360 +2120 +FB60 +8DA0 +8920 +8DA0 +FA40 +ENDCHAR +STARTCHAR U_4382 +ENCODING 17282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2BE0 +AA20 +7FA0 +2AA0 +6BA0 +BA60 +2A00 +2A20 +AA20 +59E0 +ENDCHAR +STARTCHAR U_4383 +ENCODING 17283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7CA0 +56A0 +55E0 +7CA0 +55E0 +54A0 +FEA0 +44A0 +4DE0 +ENDCHAR +STARTCHAR U_4384 +ENCODING 17284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +5120 +55A0 +5360 +B120 +0360 +F5A0 +9120 +95A0 +F240 +ENDCHAR +STARTCHAR U_4385 +ENCODING 17285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +F120 +95A0 +9360 +9120 +F360 +95A0 +9120 +95A0 +F240 +ENDCHAR +STARTCHAR U_4386 +ENCODING 17286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +28A0 +D760 +0A00 +1980 +E460 +1F80 +0100 +0E00 +0100 +ENDCHAR +STARTCHAR U_4387 +ENCODING 17287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +2120 +7920 +4DA0 +6B60 +5920 +EB60 +6DA0 +5920 +8DA0 +9A40 +ENDCHAR +STARTCHAR U_4388 +ENCODING 17288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2880 +2BE0 +BAA0 +6BE0 +2AA0 +6BE0 +B8A0 +28C0 +A8A0 +5B60 +ENDCHAR +STARTCHAR U_4389 +ENCODING 17289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +28A0 +ABE0 +7A80 +2AA0 +2BA0 +7AC0 +AA80 +2AA0 +AD60 +5620 +ENDCHAR +STARTCHAR U_438A +ENCODING 17290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +8920 +55A0 +2360 +5120 +8920 +7B60 +4DA0 +4920 +7B60 +ENDCHAR +STARTCHAR U_438B +ENCODING 17291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A7E0 +F920 +A5A0 +2360 +F920 +0120 +FB60 +8DA0 +8920 +FB60 +ENDCHAR +STARTCHAR U_438C +ENCODING 17292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2520 +B5E0 +6C40 +2440 +6D60 +B540 +25C0 +B540 +4A20 +ENDCHAR +STARTCHAR U_438D +ENCODING 17293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +2BE0 +2880 +BBE0 +6AA0 +2BE0 +6AA0 +BBE0 +2AA0 +AAA0 +5A40 +ENDCHAR +STARTCHAR U_438E +ENCODING 17294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5540 +5540 +7740 +D540 +5740 +7540 +D5C0 +5740 +5D40 +A160 +ENDCHAR +STARTCHAR U_438F +ENCODING 17295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +68A0 +86A0 +79E0 +10A0 +21A0 +7AE0 +48A0 +4AA0 +7960 +ENDCHAR +STARTCHAR U_4390 +ENCODING 17296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F7E0 +2120 +F5A0 +9360 +F120 +9360 +F5A0 +2120 +F5A0 +2240 +ENDCHAR +STARTCHAR U_4391 +ENCODING 17297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2840 +ABC0 +7840 +2FE0 +2880 +7AA0 +A9C0 +2AC0 +ACA0 +5980 +ENDCHAR +STARTCHAR U_4392 +ENCODING 17298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2FE0 +A900 +79C0 +2EA0 +2860 +7940 +AFE0 +2940 +A9A0 +5E60 +ENDCHAR +STARTCHAR U_4393 +ENCODING 17299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2BA0 +A9C0 +7AC0 +2CA0 +2980 +7BE0 +AA20 +2BE0 +AA20 +5BE0 +ENDCHAR +STARTCHAR U_4394 +ENCODING 17300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +2FE0 +A880 +7BE0 +2AA0 +2BE0 +7AA0 +A840 +2FE0 +A940 +5840 +ENDCHAR +STARTCHAR U_4395 +ENCODING 17301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5500 +2A80 +4440 +7FE0 +8020 +7BC0 +2940 +18C0 +6B40 +1840 +ENDCHAR +STARTCHAR U_4396 +ENCODING 17302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57E0 +F920 +ADA0 +FB60 +0120 +7B60 +4DA0 +7920 +4DA0 +7A40 +ENDCHAR +STARTCHAR U_4397 +ENCODING 17303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +23E0 +FCA0 +4AA0 +F5E0 +50A0 +FDA0 +86E0 +BCA0 +AEA0 +BD60 +ENDCHAR +STARTCHAR U_4398 +ENCODING 17304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2920 +FDA0 +2B60 +F920 +2360 +ADA0 +F920 +ADA0 +AA40 +ENDCHAR +STARTCHAR U_4399 +ENCODING 17305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +84A0 +7AA0 +29E0 +B0A0 +7DA0 +D6E0 +7CA0 +4AA0 +8560 +ENDCHAR +STARTCHAR U_439A +ENCODING 17306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +2FE0 +2A40 +AFE0 +7A40 +2FE0 +6920 +BFE0 +2A80 +AE20 +5BC0 +ENDCHAR +STARTCHAR U_439B +ENCODING 17307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3E80 +0900 +FFE0 +0C00 +3040 +DFC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_439C +ENCODING 17308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7BC0 +14A0 +FFE0 +1080 +6100 +BB60 +2180 +2D20 +31E0 +ENDCHAR +STARTCHAR U_439D +ENCODING 17309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3E80 +0900 +FFE0 +0800 +3040 +DFC0 +0000 +FBE0 +28A0 +DB60 +ENDCHAR +STARTCHAR U_439E +ENCODING 17310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3E80 +0500 +FFE0 +0900 +3F80 +D4C0 +1280 +7FC0 +0040 +0180 +ENDCHAR +STARTCHAR U_439F +ENCODING 17311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +F900 +5FE0 +5AA0 +9AA0 +AAA0 +6AA0 +5A20 +9AA0 +0840 +ENDCHAR +STARTCHAR U_43A0 +ENCODING 17312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +4200 +FFE0 +5AA0 +5AA0 +DAA0 +7A20 +5840 +5020 +9FE0 +ENDCHAR +STARTCHAR U_43A1 +ENCODING 17313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +7FC0 +5240 +5240 +52C0 +4400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_43A2 +ENCODING 17314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2400 +7000 +27E0 +F840 +2080 +7100 +6A20 +A420 +23E0 +ENDCHAR +STARTCHAR U_43A3 +ENCODING 17315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FA40 +2540 +7540 +2440 +FC40 +2540 +7640 +6CA0 +A120 +2600 +ENDCHAR +STARTCHAR U_43A4 +ENCODING 17316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +7400 +27E0 +FC20 +27A0 +76A0 +6FA0 +A420 +2840 +ENDCHAR +STARTCHAR U_43A5 +ENCODING 17317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA40 +2420 +7180 +2240 +FC20 +23C0 +7240 +6A40 +A3C0 +2240 +ENDCHAR +STARTCHAR U_43A6 +ENCODING 17318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FAA0 +22A0 +74C0 +2120 +FA20 +2080 +72A0 +6AC0 +A120 +2620 +ENDCHAR +STARTCHAR U_43A7 +ENCODING 17319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +7240 +2180 +FFE0 +2000 +73C0 +6A40 +A240 +23C0 +ENDCHAR +STARTCHAR U_43A8 +ENCODING 17320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2280 +7540 +27E0 +FD40 +27C0 +7540 +6FC0 +A120 +21E0 +ENDCHAR +STARTCHAR U_43A9 +ENCODING 17321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FD40 +2A80 +7540 +22A0 +FFE0 +24A0 +77E0 +6CA0 +A7E0 +2420 +ENDCHAR +STARTCHAR U_43AA +ENCODING 17322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +7440 +27C0 +F880 +2FE0 +7480 +6A80 +A080 +2180 +ENDCHAR +STARTCHAR U_43AB +ENCODING 17323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FCA0 +2560 +77E0 +2240 +FD20 +23C0 +7240 +6D80 +A180 +2660 +ENDCHAR +STARTCHAR U_43AC +ENCODING 17324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +26A0 +F7E0 +2100 +FBC0 +2100 +77E0 +6900 +A240 +27A0 +ENDCHAR +STARTCHAR U_43AD +ENCODING 17325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F5E0 +2340 +7040 +27E0 +FA00 +22E0 +72A0 +6AE0 +A500 +28E0 +ENDCHAR +STARTCHAR U_43AE +ENCODING 17326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2140 +77E0 +24A0 +FFE0 +24A0 +75E0 +6D60 +A5E0 +2420 +ENDCHAR +STARTCHAR U_43AF +ENCODING 17327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +77E0 +2520 +FFE0 +2100 +77E0 +6900 +A240 +2420 +ENDCHAR +STARTCHAR U_43B0 +ENCODING 17328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +FFC0 +2A80 +7F80 +20E0 +FEA0 +2AA0 +7EA0 +6AA0 +AEA0 +2120 +ENDCHAR +STARTCHAR U_43B1 +ENCODING 17329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FAA0 +2FE0 +7480 +2AE0 +FE80 +20E0 +7E80 +6AE0 +AE80 +2AE0 +ENDCHAR +STARTCHAR U_43B2 +ENCODING 17330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +5040 +5080 +7080 +5100 +7100 +5200 +5A20 +7420 +D420 +13E0 +ENDCHAR +STARTCHAR U_43B3 +ENCODING 17331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +4920 +4920 +79E0 +4920 +7920 +49E0 +4D20 +7920 +C920 +0A60 +ENDCHAR +STARTCHAR U_43B4 +ENCODING 17332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +5240 +77E0 +5240 +7240 +57E0 +7A40 +D240 +1240 +1440 +ENDCHAR +STARTCHAR U_43B5 +ENCODING 17333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F940 +5040 +7240 +5280 +76C0 +5AA0 +5320 +7A00 +D640 +19C0 +ENDCHAR +STARTCHAR U_43B6 +ENCODING 17334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +57E0 +74A0 +54A0 +77E0 +54A0 +5CA0 +77E0 +D080 +1080 +ENDCHAR +STARTCHAR U_43B7 +ENCODING 17335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +57C0 +7500 +5100 +7FE0 +5100 +5B80 +7540 +D920 +1100 +ENDCHAR +STARTCHAR U_43B8 +ENCODING 17336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5100 +57C0 +7240 +5240 +77E0 +5000 +7BC0 +D240 +1240 +13C0 +ENDCHAR +STARTCHAR U_43B9 +ENCODING 17337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1500 +FFC0 +1500 +2480 +FFE0 +1100 +1F00 +11E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_43BA +ENCODING 17338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FA20 +5FA0 +72A0 +5FA0 +72A0 +5FA0 +5AA0 +7AA0 +D220 +1260 +ENDCHAR +STARTCHAR U_43BB +ENCODING 17339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +52A0 +53E0 +72A0 +53E0 +7220 +5BE0 +7360 +D3E0 +1220 +1460 +ENDCHAR +STARTCHAR U_43BC +ENCODING 17340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5040 +53C0 +7040 +5FE0 +7100 +5D40 +7380 +D540 +1920 +1300 +ENDCHAR +STARTCHAR U_43BD +ENCODING 17341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5280 +53E0 +7240 +5320 +7000 +53E0 +5A20 +73E0 +D220 +13E0 +ENDCHAR +STARTCHAR U_43BE +ENCODING 17342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +5440 +7BA0 +5000 +77E0 +56A0 +5FE0 +76A0 +D6A0 +1460 +ENDCHAR +STARTCHAR U_43BF +ENCODING 17343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FC80 +5480 +75A0 +5FA0 +74C0 +5680 +5D80 +74C0 +D520 +1520 +ENDCHAR +STARTCHAR U_43C0 +ENCODING 17344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FA20 +5FA0 +72A0 +5FA0 +7AA0 +5FA0 +52A0 +7F20 +DAA0 +1260 +ENDCHAR +STARTCHAR U_43C1 +ENCODING 17345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +5FE0 +7920 +57C0 +7280 +5FE0 +5100 +7FC0 +D100 +1100 +ENDCHAR +STARTCHAR U_43C2 +ENCODING 17346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +FD60 +5520 +7760 +5520 +77E0 +5100 +57E0 +7A40 +D180 +1660 +ENDCHAR +STARTCHAR U_43C3 +ENCODING 17347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5420 +53C0 +7240 +53C0 +7240 +5BC0 +7080 +D7E0 +1240 +1420 +ENDCHAR +STARTCHAR U_43C4 +ENCODING 17348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5AA0 +7440 +5BA0 +7200 +57C0 +5900 +77C0 +D100 +17E0 +ENDCHAR +STARTCHAR U_43C5 +ENCODING 17349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +57E0 +55A0 +7A40 +5420 +7BC0 +5000 +5FE0 +7540 +D920 +1100 +ENDCHAR +STARTCHAR U_43C6 +ENCODING 17350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +5280 +7FE0 +5AA0 +7FE0 +5AA0 +5FE0 +7540 +D4C0 +17C0 +ENDCHAR +STARTCHAR U_43C7 +ENCODING 17351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5280 +5FE0 +7AA0 +5FE0 +7000 +57C0 +5000 +7FE0 +D540 +1920 +ENDCHAR +STARTCHAR U_43C8 +ENCODING 17352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +5480 +77E0 +5240 +7480 +57E0 +5A40 +76C0 +DB60 +1240 +ENDCHAR +STARTCHAR U_43C9 +ENCODING 17353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5520 +57E0 +7240 +5480 +77E0 +5240 +57E0 +7000 +D540 +1AA0 +ENDCHAR +STARTCHAR U_43CA +ENCODING 17354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FAE0 +5F80 +75E0 +5F20 +70E0 +5780 +5DE0 +7780 +D5A0 +15E0 +ENDCHAR +STARTCHAR U_43CB +ENCODING 17355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +3F80 +2480 +E5E0 +4540 +CDC0 +5520 +75E0 +ENDCHAR +STARTCHAR U_43CC +ENCODING 17356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1200 +2100 +4080 +BFE0 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_43CD +ENCODING 17357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1200 +2100 +FF80 +0080 +7F00 +4100 +5900 +4700 +5900 +4300 +ENDCHAR +STARTCHAR U_43CE +ENCODING 17358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +9480 +9480 +F480 +9680 +9580 +F580 +9480 +94A0 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_43CF +ENCODING 17359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4880 +4880 +7880 +4FE0 +4880 +7880 +4880 +4880 +AA80 +9100 +ENDCHAR +STARTCHAR U_43D0 +ENCODING 17360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4BC0 +7940 +4940 +4FE0 +7900 +4900 +4A80 +AA40 +9420 +ENDCHAR +STARTCHAR U_43D1 +ENCODING 17361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1F80 +2900 +E600 +1800 +3FC0 +C440 +5B40 +4440 +5B40 +4040 +ENDCHAR +STARTCHAR U_43D2 +ENCODING 17362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +4A80 +4A80 +7BE0 +4A00 +4A00 +7BC0 +4A40 +4A40 +AA40 +9440 +ENDCHAR +STARTCHAR U_43D3 +ENCODING 17363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BC0 +6800 +5800 +4FE0 +5A80 +6A80 +4A80 +4AA0 +AAA0 +94E0 +ENDCHAR +STARTCHAR U_43D4 +ENCODING 17364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4940 +4940 +7940 +4940 +4BC0 +7940 +4940 +4940 +A940 +97E0 +ENDCHAR +STARTCHAR U_43D5 +ENCODING 17365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4880 +7880 +4880 +4BE0 +7880 +4880 +4880 +A880 +93E0 +ENDCHAR +STARTCHAR U_43D6 +ENCODING 17366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BA0 +48A0 +48A0 +7BA0 +4A20 +4A20 +7BA0 +48A0 +48A0 +AAA0 +9120 +ENDCHAR +STARTCHAR U_43D7 +ENCODING 17367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BC0 +4C00 +7BC0 +4800 +4F80 +7880 +4880 +48A0 +A860 +9020 +ENDCHAR +STARTCHAR U_43D8 +ENCODING 17368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9540 +9540 +F540 +9540 +9540 +F540 +9560 +9600 +9400 +B7E0 +ENDCHAR +STARTCHAR U_43D9 +ENCODING 17369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FE0 +7D20 +4D20 +4900 +7980 +4A80 +4AA0 +AAA0 +94E0 +ENDCHAR +STARTCHAR U_43DA +ENCODING 17370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7B40 +4D20 +4D00 +7920 +4840 +4880 +A900 +9600 +ENDCHAR +STARTCHAR U_43DB +ENCODING 17371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BE0 +6A20 +5C20 +49A0 +5820 +6BE0 +4820 +4820 +A940 +9080 +ENDCHAR +STARTCHAR U_43DC +ENCODING 17372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +6A40 +5A80 +4AE0 +5A20 +6B20 +4AC0 +4A40 +AAA0 +9520 +ENDCHAR +STARTCHAR U_43DD +ENCODING 17373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +4900 +7900 +4FE0 +4A00 +7BC0 +4840 +4A80 +A900 +9080 +ENDCHAR +STARTCHAR U_43DE +ENCODING 17374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +6BC0 +5880 +4880 +5FE0 +6880 +49C0 +4AA0 +AAA0 +9480 +ENDCHAR +STARTCHAR U_43DF +ENCODING 17375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9080 +92A0 +F220 +9640 +9AA0 +FB20 +9200 +9620 +9A20 +B1E0 +ENDCHAR +STARTCHAR U_43E0 +ENCODING 17376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7000 +5440 +5440 +7240 +5280 +5080 +9100 +B7E0 +ENDCHAR +STARTCHAR U_43E1 +ENCODING 17377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4800 +4800 +7800 +4FE0 +4880 +7980 +4AC0 +4CA0 +8880 +9980 +ENDCHAR +STARTCHAR U_43E2 +ENCODING 17378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5080 +57E0 +74A0 +5480 +57C0 +7540 +5540 +5480 +9540 +BA20 +ENDCHAR +STARTCHAR U_43E3 +ENCODING 17379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +4A40 +4A40 +7BC0 +4A40 +4A40 +8A40 +9FE0 +ENDCHAR +STARTCHAR U_43E4 +ENCODING 17380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4820 +4820 +7FE0 +4820 +4BA0 +7AA0 +4AA0 +4BA0 +8820 +9860 +ENDCHAR +STARTCHAR U_43E5 +ENCODING 17381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7100 +57C0 +5540 +77C0 +5540 +7FE0 +5440 +5440 +9440 +B4C0 +ENDCHAR +STARTCHAR U_43E6 +ENCODING 17382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5700 +5100 +7FE0 +5100 +5100 +77C0 +5440 +5440 +97C0 +B440 +ENDCHAR +STARTCHAR U_43E7 +ENCODING 17383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +49C0 +4A40 +7D80 +4900 +7E80 +49E0 +4F20 +48C0 +8980 +9E00 +ENDCHAR +STARTCHAR U_43E8 +ENCODING 17384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4A20 +7A20 +4BE0 +4A00 +7BE0 +4A20 +4A20 +8BE0 +9A20 +ENDCHAR +STARTCHAR U_43E9 +ENCODING 17385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4980 +4A40 +7C20 +4BC0 +4800 +7BC0 +4A40 +4A40 +8BC0 +9A40 +ENDCHAR +STARTCHAR U_43EA +ENCODING 17386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A40 +4A40 +7BC0 +4A40 +4BC0 +7A40 +4A40 +4FE0 +4840 +9840 +ENDCHAR +STARTCHAR U_43EB +ENCODING 17387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5480 +7FE0 +5480 +5580 +76C0 +54A0 +5480 +9480 +B480 +ENDCHAR +STARTCHAR U_43EC +ENCODING 17388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5280 +5440 +77C0 +5500 +57C0 +7900 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_43ED +ENCODING 17389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5500 +57C0 +7900 +5100 +5FE0 +7100 +5380 +5540 +9920 +B100 +ENDCHAR +STARTCHAR U_43EE +ENCODING 17390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5FE0 +7120 +5220 +54C0 +7820 +56C0 +5000 +9280 +BC60 +ENDCHAR +STARTCHAR U_43EF +ENCODING 17391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5FE0 +7100 +5100 +57C0 +7100 +52A0 +5620 +5A40 +A9C0 +ENDCHAR +STARTCHAR U_43F0 +ENCODING 17392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5120 +5520 +7920 +52A0 +5C40 +7100 +52A0 +5620 +9A40 +A9C0 +ENDCHAR +STARTCHAR U_43F1 +ENCODING 17393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7400 +57E0 +5420 +77A0 +54A0 +57A0 +9420 +B8C0 +ENDCHAR +STARTCHAR U_43F2 +ENCODING 17394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5280 +57C0 +7140 +57C0 +5500 +7FE0 +5320 +5520 +99C0 +B100 +ENDCHAR +STARTCHAR U_43F3 +ENCODING 17395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7420 +55C0 +5F00 +7500 +55E0 +5740 +7D40 +5540 +5540 +9540 +BA40 +ENDCHAR +STARTCHAR U_43F4 +ENCODING 17396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +54A0 +52C0 +77E0 +5420 +57E0 +7420 +57E0 +5420 +9420 +B460 +ENDCHAR +STARTCHAR U_43F5 +ENCODING 17397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5240 +5FE0 +72A0 +52C0 +52A0 +72C0 +52A0 +54C0 +97A0 +B8E0 +ENDCHAR +STARTCHAR U_43F6 +ENCODING 17398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +5480 +57E0 +7480 +55A0 +56E0 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_43F7 +ENCODING 17399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +57C0 +5000 +77C0 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_43F8 +ENCODING 17400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +57C0 +7240 +5240 +5FE0 +7000 +53C0 +5240 +9240 +B3C0 +ENDCHAR +STARTCHAR U_43F9 +ENCODING 17401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +57C0 +5440 +77C0 +5280 +5280 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_43FA +ENCODING 17402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5C40 +5380 +7C60 +5100 +57C0 +7100 +57C0 +5100 +9FE0 +B100 +ENDCHAR +STARTCHAR U_43FB +ENCODING 17403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57C0 +7100 +5100 +5FE0 +7100 +5200 +5240 +94E0 +B720 +ENDCHAR +STARTCHAR U_43FC +ENCODING 17404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +4A40 +4FE0 +7940 +49A0 +4E60 +7A40 +4FE0 +4940 +89A0 +9E60 +ENDCHAR +STARTCHAR U_43FD +ENCODING 17405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7440 +5280 +5FE0 +7000 +57C0 +5440 +9440 +B7C0 +ENDCHAR +STARTCHAR U_43FE +ENCODING 17406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5100 +7FC0 +5200 +5FE0 +7540 +5BA0 +5100 +9FC0 +B100 +ENDCHAR +STARTCHAR U_43FF +ENCODING 17407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7BE0 +4E40 +7980 +4260 +BF80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_4400 +ENCODING 17408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7440 +5FE0 +5040 +7740 +5540 +5740 +5040 +B0C0 +ENDCHAR +STARTCHAR U_4401 +ENCODING 17409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5100 +72A0 +5DC0 +5280 +7FC0 +52A0 +5DA0 +5280 +9100 +ENDCHAR +STARTCHAR U_4402 +ENCODING 17410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5440 +7780 +5100 +5FE0 +7520 +53C0 +5540 +5920 +B300 +ENDCHAR +STARTCHAR U_4403 +ENCODING 17411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +54E0 +77A0 +54A0 +57E0 +74A0 +55A0 +56E0 +54A0 +97E0 +ENDCHAR +STARTCHAR U_4404 +ENCODING 17412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5240 +7480 +5300 +5460 +7420 +56E0 +5420 +5420 +B7E0 +ENDCHAR +STARTCHAR U_4405 +ENCODING 17413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7500 +55E0 +5680 +7480 +57E0 +5480 +5540 +9A20 +ENDCHAR +STARTCHAR U_4406 +ENCODING 17414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70E0 +5720 +5920 +7540 +5100 +5FE0 +7100 +5380 +5540 +5920 +9100 +ENDCHAR +STARTCHAR U_4407 +ENCODING 17415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5AA0 +72A0 +52A0 +5540 +77E0 +5420 +57E0 +5420 +B7E0 +ENDCHAR +STARTCHAR U_4408 +ENCODING 17416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5200 +77C0 +5440 +77C0 +5440 +57C0 +5440 +5440 +BFE0 +ENDCHAR +STARTCHAR U_4409 +ENCODING 17417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72A0 +5540 +5540 +72A0 +5000 +57E0 +7520 +57E0 +5520 +57E0 +9420 +ENDCHAR +STARTCHAR U_440A +ENCODING 17418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7420 +57E0 +5480 +7480 +57E0 +5480 +55A0 +B6E0 +ENDCHAR +STARTCHAR U_440B +ENCODING 17419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5240 +5420 +7900 +5240 +57E0 +7200 +5140 +5520 +5C40 +93C0 +ENDCHAR +STARTCHAR U_440C +ENCODING 17420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +3F80 +2A80 +3F80 +2A80 +FFE0 +5140 +9F20 +1100 +1F00 +2100 +ENDCHAR +STARTCHAR U_440D +ENCODING 17421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5000 +57C0 +7440 +57C0 +5440 +5280 +9FE0 +ENDCHAR +STARTCHAR U_440E +ENCODING 17422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +57C0 +5000 +7FE0 +5500 +55C0 +5700 +98E0 +ENDCHAR +STARTCHAR U_440F +ENCODING 17423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5200 +5FE0 +7440 +5FE0 +5540 +5640 +97C0 +ENDCHAR +STARTCHAR U_4410 +ENCODING 17424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7340 +5E40 +5340 +72E0 +5F40 +5240 +7740 +5AC0 +5240 +52A0 +9320 +ENDCHAR +STARTCHAR U_4411 +ENCODING 17425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5540 +75C0 +5400 +57E0 +7100 +5FE0 +5380 +5540 +B920 +ENDCHAR +STARTCHAR U_4412 +ENCODING 17426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7920 +53C0 +5E80 +7100 +5FC0 +5240 +5180 +9E00 +ENDCHAR +STARTCHAR U_4413 +ENCODING 17427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5200 +57C0 +7440 +57C0 +5440 +77C0 +5440 +57C0 +9440 +9820 +ENDCHAR +STARTCHAR U_4414 +ENCODING 17428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +AFE0 +E820 +AFE0 +A800 +EFE0 +AAA0 +AFE0 +AAA0 +B2A0 +ENDCHAR +STARTCHAR U_4415 +ENCODING 17429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5FE0 +7440 +57C0 +5440 +77C0 +5440 +5FE0 +5040 +B040 +ENDCHAR +STARTCHAR U_4416 +ENCODING 17430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7480 +56A0 +55C0 +77E0 +5480 +55C0 +56A0 +9880 +ENDCHAR +STARTCHAR U_4417 +ENCODING 17431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57C0 +5240 +7280 +5FE0 +5240 +77E0 +5C40 +57C0 +5440 +97C0 +ENDCHAR +STARTCHAR U_4418 +ENCODING 17432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +5280 +57E0 +7200 +5FE0 +7200 +53E0 +5520 +54C0 +9B20 +ENDCHAR +STARTCHAR U_4419 +ENCODING 17433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +5440 +77C0 +5100 +57C0 +7540 +57C0 +5100 +5FE0 +9100 +ENDCHAR +STARTCHAR U_441A +ENCODING 17434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AAA0 +EEA0 +AAA0 +AEA0 +E8A0 +AAA0 +AEE0 +A980 +A080 +ENDCHAR +STARTCHAR U_441B +ENCODING 17435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5240 +77E0 +5A40 +53C0 +7240 +53C0 +5240 +5FE0 +9040 +ENDCHAR +STARTCHAR U_441C +ENCODING 17436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5200 +77C0 +5440 +57C0 +7440 +57C0 +5440 +5FE0 +9440 +ENDCHAR +STARTCHAR U_441D +ENCODING 17437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +57C0 +7440 +57C0 +5440 +77C0 +5440 +57C0 +5440 +B820 +ENDCHAR +STARTCHAR U_441E +ENCODING 17438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +5220 +56E0 +7880 +56E0 +5220 +7BA0 +5660 +5BA0 +5220 +BCC0 +ENDCHAR +STARTCHAR U_441F +ENCODING 17439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +77C0 +5280 +5FE0 +7540 +57C0 +5540 +5FE0 +B440 +ENDCHAR +STARTCHAR U_4420 +ENCODING 17440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +5440 +7100 +5FE0 +5400 +77C0 +5540 +5540 +5540 +B960 +ENDCHAR +STARTCHAR U_4421 +ENCODING 17441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A40 +F580 +5540 +9520 +7FC0 +4A40 +75C0 +4A40 +71C0 +ENDCHAR +STARTCHAR U_4422 +ENCODING 17442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5AA0 +77A0 +5220 +5440 +77E0 +5AA0 +57A0 +5220 +BCC0 +ENDCHAR +STARTCHAR U_4423 +ENCODING 17443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7000 +57C0 +5540 +76C0 +5540 +5640 +57C0 +B820 +ENDCHAR +STARTCHAR U_4424 +ENCODING 17444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5FE0 +5100 +77C0 +5100 +5FE0 +7400 +57E0 +5480 +5880 +B7E0 +ENDCHAR +STARTCHAR U_4425 +ENCODING 17445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5440 +5A20 +7480 +57C0 +5000 +7EE0 +5AA0 +5660 +5AA0 +9660 +ENDCHAR +STARTCHAR U_4426 +ENCODING 17446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFC0 +A100 +FFE0 +A480 +AFC0 +E000 +AFE0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_4427 +ENCODING 17447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5000 +73C0 +5240 +57E0 +7420 +57A0 +54A0 +57A0 +B460 +ENDCHAR +STARTCHAR U_4428 +ENCODING 17448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE40 +1240 +7C60 +0000 +FFC0 +AA40 +3A40 +2980 +3A40 +4C20 +ENDCHAR +STARTCHAR U_4429 +ENCODING 17449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5540 +57C0 +7000 +5FE0 +5000 +77C0 +5440 +57C0 +5280 +9FE0 +ENDCHAR +STARTCHAR U_442A +ENCODING 17450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +57E0 +5C80 +77C0 +5480 +57E0 +7480 +57C0 +5260 +5420 +B8C0 +ENDCHAR +STARTCHAR U_442B +ENCODING 17451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +A940 +B2A0 +E6A0 +A800 +B880 +EAE0 +AA80 +AA80 +AB80 +AC60 +ENDCHAR +STARTCHAR U_442C +ENCODING 17452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +A280 +EFE0 +AAA0 +AFE0 +EAA0 +AFE0 +A540 +A640 +A7C0 +ENDCHAR +STARTCHAR U_442D +ENCODING 17453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +BFE0 +AAA0 +FBA0 +A000 +BFE0 +E220 +AFC0 +AA40 +AAC0 +A200 +ENDCHAR +STARTCHAR U_442E +ENCODING 17454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +E280 +AFE0 +AA80 +EBC0 +AC80 +ABC0 +A880 +B7E0 +ENDCHAR +STARTCHAR U_442F +ENCODING 17455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5540 +57C0 +7540 +57C0 +5280 +77C0 +5440 +5FE0 +5540 +B920 +ENDCHAR +STARTCHAR U_4430 +ENCODING 17456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +A4E0 +A9A0 +EA40 +BAA0 +ABE0 +EAA0 +AAE0 +AAA0 +A8E0 +A8A0 +ENDCHAR +STARTCHAR U_4431 +ENCODING 17457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +EFE0 +A920 +AFE0 +E920 +ABA0 +AAA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_4432 +ENCODING 17458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5220 +5BA0 +7660 +5BA0 +5220 +77C0 +5440 +57C0 +5440 +97C0 +ENDCHAR +STARTCHAR U_4433 +ENCODING 17459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5480 +7FE0 +5520 +57E0 +7520 +57E0 +5000 +5AA0 +92A0 +ENDCHAR +STARTCHAR U_4434 +ENCODING 17460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA80 +FFE0 +9180 +AAA0 +CC60 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_4435 +ENCODING 17461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7380 +5000 +5FE0 +7540 +57C0 +5540 +57C0 +B820 +ENDCHAR +STARTCHAR U_4436 +ENCODING 17462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +BFE0 +EAA0 +B320 +A000 +EFC0 +A840 +AFC0 +A840 +AFC0 +ENDCHAR +STARTCHAR U_4437 +ENCODING 17463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5540 +57C0 +7000 +57C0 +5540 +77C0 +5540 +5FE0 +5100 +B100 +ENDCHAR +STARTCHAR U_4438 +ENCODING 17464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5140 +5FE0 +7140 +57C0 +7540 +5FE0 +5540 +57C0 +5000 +BFE0 +ENDCHAR +STARTCHAR U_4439 +ENCODING 17465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFC0 +A240 +FFE0 +A240 +AFC0 +EAA0 +AFE0 +AA20 +AEE0 +B2A0 +ENDCHAR +STARTCHAR U_443A +ENCODING 17466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A440 +E7C0 +A440 +BFE0 +A100 +A100 +ENDCHAR +STARTCHAR U_443B +ENCODING 17467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5440 +57C0 +7100 +57C0 +5280 +5FE0 +9100 +ENDCHAR +STARTCHAR U_443C +ENCODING 17468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54A0 +5EA0 +74A0 +5F60 +5480 +77C0 +5480 +5FE0 +5540 +9920 +ENDCHAR +STARTCHAR U_443D +ENCODING 17469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +A440 +E7C0 +A000 +AFE0 +E920 +AD60 +ABA0 +AD60 +A920 +ENDCHAR +STARTCHAR U_443E +ENCODING 17470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E100 +AFE0 +A100 +EFE0 +A440 +AFE0 +A100 +A100 +ENDCHAR +STARTCHAR U_443F +ENCODING 17471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFE0 +AB60 +EDA0 +AFE0 +AB20 +ED60 +A100 +AFE0 +A440 +B820 +ENDCHAR +STARTCHAR U_4440 +ENCODING 17472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7740 +55E0 +7720 +54A0 +7740 +55E0 +5D40 +57E0 +B040 +9040 +ENDCHAR +STARTCHAR U_4441 +ENCODING 17473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +75C0 +4A40 +75C0 +4A40 +FFE0 +A0A0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_4442 +ENCODING 17474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E600 +AAC0 +AB40 +EEC0 +AB40 +AFC0 +EB40 +AD40 +BFE0 +A480 +A840 +ENDCHAR +STARTCHAR U_4443 +ENCODING 17475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +77C0 +5280 +5FE0 +7BA0 +56C0 +7580 +5340 +5580 +5AC0 +9120 +ENDCHAR +STARTCHAR U_4444 +ENCODING 17476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7780 +5480 +5780 +7480 +5FC0 +7540 +5FE0 +5280 +5280 +9480 +ENDCHAR +STARTCHAR U_4445 +ENCODING 17477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +57C0 +5280 +77C0 +5540 +5FE0 +7920 +53C0 +5680 +5180 +9600 +ENDCHAR +STARTCHAR U_4446 +ENCODING 17478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +77C0 +5100 +57C0 +7FE0 +5280 +77C0 +5AA0 +53C0 +5280 +9760 +ENDCHAR +STARTCHAR U_4447 +ENCODING 17479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +7480 +57E0 +56C0 +7A40 +57C0 +7440 +57C0 +5440 +57C0 +9C60 +ENDCHAR +STARTCHAR U_4448 +ENCODING 17480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +77A0 +5AC0 +57A0 +7AC0 +5FE0 +7100 +5FE0 +5380 +5560 +9920 +ENDCHAR +STARTCHAR U_4449 +ENCODING 17481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +5400 +57C0 +76C0 +5380 +76C0 +57C0 +57C0 +5540 +9AE0 +ENDCHAR +STARTCHAR U_444A +ENCODING 17482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +73C0 +5AC0 +57E0 +7140 +5DC0 +7540 +55C0 +57E0 +5540 +9BE0 +ENDCHAR +STARTCHAR U_444B +ENCODING 17483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +56C0 +56C0 +7280 +57C0 +7280 +5FE0 +5340 +5680 +9B60 +ENDCHAR +STARTCHAR U_444C +ENCODING 17484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +E920 +AFE0 +A920 +EBA0 +AAA0 +A920 +ABA0 +AD60 +ENDCHAR +STARTCHAR U_444D +ENCODING 17485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +AAA0 +E200 +BFE0 +A480 +A300 +ACC0 +ENDCHAR +STARTCHAR U_444E +ENCODING 17486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +B580 +BFE0 +EA80 +BB80 +AA80 +FBA0 +AAA0 +BBA0 +AF40 +B0A0 +ENDCHAR +STARTCHAR U_444F +ENCODING 17487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5EE0 +56C0 +76C0 +5300 +57C0 +7D00 +57C0 +57C0 +5500 +97E0 +ENDCHAR +STARTCHAR U_4450 +ENCODING 17488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +A3E0 +A480 +F880 +8880 +89C0 +FAA0 +A4A0 +A080 +F980 +ENDCHAR +STARTCHAR U_4451 +ENCODING 17489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +F280 +AFE0 +A280 +F7C0 +9100 +97C0 +F100 +AFE0 +A280 +FC60 +ENDCHAR +STARTCHAR U_4452 +ENCODING 17490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +27E0 +4120 +9120 +FB20 +2520 +F920 +2120 +2A20 +3420 +C8C0 +ENDCHAR +STARTCHAR U_4453 +ENCODING 17491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1500 +FFE0 +9120 +3F80 +0400 +3F80 +0400 +7FC0 +ENDCHAR +STARTCHAR U_4454 +ENCODING 17492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4080 +9FE0 +8880 +8BE0 +DAA0 +8AA0 +8AA0 +FAE0 +8880 +0080 +ENDCHAR +STARTCHAR U_4455 +ENCODING 17493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4040 +7BC0 +4040 +7FC0 +4440 +7FC0 +4440 +7FC0 +4460 +8420 +ENDCHAR +STARTCHAR U_4456 +ENCODING 17494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47E0 +9940 +8FE0 +8940 +DBC0 +8900 +8DC0 +8D00 +F780 +8860 +ENDCHAR +STARTCHAR U_4457 +ENCODING 17495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +4240 +9BC0 +8A40 +8FE0 +DA00 +8BE0 +8D60 +FAA0 +8520 +02C0 +ENDCHAR +STARTCHAR U_4458 +ENCODING 17496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +47E0 +9900 +8BC0 +8900 +DFE0 +8A00 +8BC0 +FC80 +8880 +07E0 +ENDCHAR +STARTCHAR U_4459 +ENCODING 17497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +E240 +2240 +27E0 +FA40 +2240 +27E0 +7A40 +4A40 +4A40 +7AC0 +ENDCHAR +STARTCHAR U_445A +ENCODING 17498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +E220 +2220 +FBE0 +2220 +23E0 +7A20 +4A20 +4A20 +7A20 +4C60 +ENDCHAR +STARTCHAR U_445B +ENCODING 17499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +E3C0 +2240 +2240 +FA40 +23E0 +2240 +7A40 +4B40 +4A20 +79A0 +ENDCHAR +STARTCHAR U_445C +ENCODING 17500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +EFE0 +2540 +25C0 +FC00 +27E0 +7880 +4FE0 +4980 +7AC0 +4CA0 +ENDCHAR +STARTCHAR U_445D +ENCODING 17501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +FFE0 +A0A0 +7BE0 +CA80 +37E0 +2080 +C080 +ENDCHAR +STARTCHAR U_445E +ENCODING 17502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5500 +4E00 +5580 +4A00 +7FC0 +2080 +7BE0 +AA80 +17E0 +E080 +ENDCHAR +STARTCHAR U_445F +ENCODING 17503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +E5E0 +A960 +FDA0 +85E0 +6800 +BDE0 +E840 +3DE0 +4840 +8BE0 +ENDCHAR +STARTCHAR U_4460 +ENCODING 17504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4820 +7840 +4880 +FC80 +4880 +6880 +5880 +4880 +9B80 +ENDCHAR +STARTCHAR U_4461 +ENCODING 17505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FC0 +5440 +7540 +54C0 +F280 +5280 +7100 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_4462 +ENCODING 17506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +5280 +7280 +5280 +FA80 +5280 +7280 +52A0 +54A0 +98E0 +ENDCHAR +STARTCHAR U_4463 +ENCODING 17507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +7880 +4B00 +7800 +4840 +FC80 +4B00 +6820 +5840 +4880 +9B00 +ENDCHAR +STARTCHAR U_4464 +ENCODING 17508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4A80 +7C40 +4BA0 +F800 +4FC0 +6840 +5840 +4880 +9900 +ENDCHAR +STARTCHAR U_4465 +ENCODING 17509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +5440 +7480 +57E0 +FD20 +5520 +7540 +5480 +5940 +9620 +ENDCHAR +STARTCHAR U_4466 +ENCODING 17510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +7400 +57E0 +7820 +57A0 +F4A0 +54A0 +77A0 +5020 +5020 +B0C0 +ENDCHAR +STARTCHAR U_4467 +ENCODING 17511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7440 +5C40 +77E0 +5440 +FD40 +54C0 +7440 +5440 +5440 +94C0 +ENDCHAR +STARTCHAR U_4468 +ENCODING 17512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +7400 +57E0 +7880 +5480 +FCE0 +57A0 +74A0 +5400 +5420 +93E0 +ENDCHAR +STARTCHAR U_4469 +ENCODING 17513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5100 +7FE0 +5100 +F100 +57C0 +7440 +5440 +5440 +97C0 +ENDCHAR +STARTCHAR U_446A +ENCODING 17514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5280 +7440 +5820 +F7C0 +5000 +77C0 +5440 +5440 +97C0 +ENDCHAR +STARTCHAR U_446B +ENCODING 17515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +7240 +57E0 +7240 +5240 +FA40 +57E0 +7240 +5240 +5240 +9440 +ENDCHAR +STARTCHAR U_446C +ENCODING 17516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7280 +5280 +7AA0 +56C0 +F280 +56C0 +7AA0 +5280 +54A0 +98E0 +ENDCHAR +STARTCHAR U_446D +ENCODING 17517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +72E0 +5040 +7840 +5440 +F040 +5240 +7240 +5C40 +5440 +95E0 +ENDCHAR +STARTCHAR U_446E +ENCODING 17518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7240 +5240 +7420 +5900 +F7E0 +5100 +7380 +5540 +5920 +9100 +ENDCHAR +STARTCHAR U_446F +ENCODING 17519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +7280 +57C0 +7140 +57C0 +FD00 +57E0 +5120 +7320 +5D20 +B140 +ENDCHAR +STARTCHAR U_4470 +ENCODING 17520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7500 +55C0 +7500 +5FE0 +F100 +5500 +7540 +5980 +5300 +9C00 +ENDCHAR +STARTCHAR U_4471 +ENCODING 17521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +7000 +57E0 +F4A0 +54E0 +7AA0 +5180 +52A0 +9CE0 +ENDCHAR +STARTCHAR U_4472 +ENCODING 17522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +71C0 +5100 +77C0 +5440 +F7C0 +5440 +77C0 +5100 +5FE0 +9100 +ENDCHAR +STARTCHAR U_4473 +ENCODING 17523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7A80 +4C40 +7BA0 +4800 +FFE0 +4AA0 +6FE0 +5AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_4474 +ENCODING 17524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7240 +57E0 +7240 +53C0 +F240 +53C0 +7240 +5FE0 +5240 +9420 +ENDCHAR +STARTCHAR U_4475 +ENCODING 17525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7220 +52E0 +7220 +53E0 +FA20 +53E0 +7220 +53E0 +5220 +B460 +ENDCHAR +STARTCHAR U_4476 +ENCODING 17526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5100 +77C0 +5100 +FFE0 +5440 +77C0 +5440 +57C0 +9440 +ENDCHAR +STARTCHAR U_4477 +ENCODING 17527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +77E0 +5400 +FDE0 +5520 +75E0 +5520 +55E0 +9920 +ENDCHAR +STARTCHAR U_4478 +ENCODING 17528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +73C0 +5000 +F7E0 +5100 +7540 +5520 +5920 +9100 +ENDCHAR +STARTCHAR U_4479 +ENCODING 17529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5920 +7540 +5280 +F440 +5820 +77C0 +5240 +5180 +9E60 +ENDCHAR +STARTCHAR U_447A +ENCODING 17530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7440 +57C0 +7540 +57C0 +F540 +57C0 +7540 +55C0 +5660 +9820 +ENDCHAR +STARTCHAR U_447B +ENCODING 17531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7280 +50E0 +7F00 +54E0 +F740 +5540 +75E0 +5540 +5940 +93C0 +ENDCHAR +STARTCHAR U_447C +ENCODING 17532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +77E0 +5AA0 +77A0 +5220 +F440 +57E0 +7AA0 +57A0 +5220 +94C0 +ENDCHAR +STARTCHAR U_447D +ENCODING 17533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7440 +57C0 +7440 +57C0 +F000 +5FE0 +7120 +5DA0 +5360 +9DA0 +ENDCHAR +STARTCHAR U_447E +ENCODING 17534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +77E0 +5C80 +77C0 +5480 +F7C0 +5480 +77E0 +5440 +5380 +9C60 +ENDCHAR +STARTCHAR U_447F +ENCODING 17535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5420 +73E0 +5480 +FDE0 +5520 +55E0 +7520 +5520 +95E0 +ENDCHAR +STARTCHAR U_4480 +ENCODING 17536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +77E0 +5540 +7A40 +57E0 +FC40 +5440 +7540 +54C0 +5440 +B4C0 +ENDCHAR +STARTCHAR U_4481 +ENCODING 17537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +7AA0 +5660 +7AA0 +5220 +F400 +57C0 +7440 +57C0 +5440 +B7C0 +ENDCHAR +STARTCHAR U_4482 +ENCODING 17538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7560 +55A0 +7560 +5740 +F1E0 +5720 +75A0 +5560 +9520 +9960 +ENDCHAR +STARTCHAR U_4483 +ENCODING 17539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7940 +55E0 +7240 +5FE0 +F400 +55E0 +7520 +55E0 +5C00 +93E0 +ENDCHAR +STARTCHAR U_4484 +ENCODING 17540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +5020 +77C0 +5280 +F280 +57C0 +7540 +57C0 +5540 +97C0 +ENDCHAR +STARTCHAR U_4485 +ENCODING 17541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +7FE0 +5100 +7FE0 +5240 +F7E0 +5AC0 +7340 +52C0 +5340 +93C0 +ENDCHAR +STARTCHAR U_4486 +ENCODING 17542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7280 +5FE0 +74A0 +5FA0 +F4A0 +5740 +7540 +5740 +55A0 +9B20 +ENDCHAR +STARTCHAR U_4487 +ENCODING 17543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5020 +77E0 +5280 +FA80 +57C0 +7540 +57C0 +5540 +97C0 +ENDCHAR +STARTCHAR U_4488 +ENCODING 17544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5540 +7FE0 +5440 +F7C0 +5440 +77C0 +5440 +57C0 +9820 +ENDCHAR +STARTCHAR U_4489 +ENCODING 17545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +7FE0 +5540 +7FE0 +5540 +FFE0 +5440 +7FE0 +5540 +53E0 +9C40 +ENDCHAR +STARTCHAR U_448A +ENCODING 17546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +49E0 +8640 +FBE0 +22A0 +42A0 +7BE0 +0A00 +0A00 +5220 +21E0 +ENDCHAR +STARTCHAR U_448B +ENCODING 17547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +FA40 +ABE0 +AAA0 +FEA0 +23E0 +3200 +4A20 +4220 +81E0 +ENDCHAR +STARTCHAR U_448C +ENCODING 17548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +85E0 +7A40 +4BE0 +7AA0 +4AA0 +7BE0 +2200 +FE20 +4A20 +85E0 +ENDCHAR +STARTCHAR U_448D +ENCODING 17549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9C0 +5640 +2080 +FFE0 +A2A0 +7BE0 +2200 +3A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_448E +ENCODING 17550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FDC0 +5240 +2880 +FFE0 +52A0 +8BE0 +5200 +FA20 +5220 +91E0 +ENDCHAR +STARTCHAR U_448F +ENCODING 17551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +51C0 +FA40 +AC80 +FBE0 +AAA0 +FBE0 +5200 +7220 +5220 +71E0 +ENDCHAR +STARTCHAR U_4490 +ENCODING 17552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +29E0 +FE40 +ABE0 +FEA0 +02A0 +FFE0 +AA00 +3A20 +2A20 +39E0 +ENDCHAR +STARTCHAR U_4491 +ENCODING 17553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 0 +BITMAP +4040 +2040 +2080 +1080 +1100 +0000 +0040 +FFE0 +ENDCHAR +STARTCHAR U_4492 +ENCODING 17554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0040 +0240 +0C40 +3040 +C040 +0140 +0080 +ENDCHAR +STARTCHAR U_4493 +ENCODING 17555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FE0 +1000 +3F80 +0080 +0080 +0900 +0600 +ENDCHAR +STARTCHAR U_4494 +ENCODING 17556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1200 +1200 +1100 +2100 +2080 +4040 +8060 +ENDCHAR +STARTCHAR U_4495 +ENCODING 17557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0400 +2480 +2440 +4420 +8420 +0400 +1C00 +ENDCHAR +STARTCHAR U_4496 +ENCODING 17558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0880 +0880 +7E80 +0880 +0880 +08A0 +0860 +ENDCHAR +STARTCHAR U_4497 +ENCODING 17559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +7FC0 +8000 +3F00 +0400 +1840 +2040 +3FC0 +ENDCHAR +STARTCHAR U_4498 +ENCODING 17560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3F80 +6100 +9100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_4499 +ENCODING 17561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +2480 +0400 +0400 +0780 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_449A +ENCODING 17562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +0400 +2500 +2480 +4440 +8520 +0200 +1C00 +E000 +ENDCHAR +STARTCHAR U_449B +ENCODING 17563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +4000 +57C0 +F040 +2040 +4040 +5040 +F980 +ENDCHAR +STARTCHAR U_449C +ENCODING 17564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +3FC0 +4400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_449D +ENCODING 17565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3180 +0E00 +71C0 +1100 +1100 +0A00 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_449E +ENCODING 17566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FE0 +4440 +8400 +0A00 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_449F +ENCODING 17567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F80 +1480 +1280 +FFE0 +1080 +1080 +2080 +4380 +ENDCHAR +STARTCHAR U_44A0 +ENCODING 17568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0780 +7C00 +0400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44A1 +ENCODING 17569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7C40 +0440 +7C40 +4040 +FC40 +0440 +3840 +ENDCHAR +STARTCHAR U_44A2 +ENCODING 17570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1BC0 +6240 +4240 +4A40 +72C0 +0200 +0200 +ENDCHAR +STARTCHAR U_44A3 +ENCODING 17571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +2080 +7FC0 +2080 +FFE0 +2080 +2180 +ENDCHAR +STARTCHAR U_44A4 +ENCODING 17572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_44A5 +ENCODING 17573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +3F80 +2480 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_44A6 +ENCODING 17574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +0200 +3F80 +0100 +0600 +1800 +67E0 +ENDCHAR +STARTCHAR U_44A7 +ENCODING 17575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0400 +FFE0 +0800 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_44A8 +ENCODING 17576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3F80 +4400 +0400 +FFE0 +0900 +1080 +E060 +ENDCHAR +STARTCHAR U_44A9 +ENCODING 17577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FBE0 +1080 +0380 +7C00 +0400 +FFE0 +1480 +2440 +C420 +0400 +ENDCHAR +STARTCHAR U_44AA +ENCODING 17578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_44AB +ENCODING 17579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1280 +2240 +63E0 +AE00 +2100 +2120 +20A0 +2060 +ENDCHAR +STARTCHAR U_44AC +ENCODING 17580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0000 +FFE0 +0400 +1480 +2440 +C420 +0C00 +ENDCHAR +STARTCHAR U_44AD +ENCODING 17581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0080 +FFE0 +0100 +FFE0 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_44AE +ENCODING 17582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +1F00 +1100 +1D00 +1320 +2120 +C0E0 +ENDCHAR +STARTCHAR U_44AF +ENCODING 17583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8820 +7F00 +0900 +3900 +1520 +2120 +C0E0 +ENDCHAR +STARTCHAR U_44B0 +ENCODING 17584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1100 +7FC0 +4000 +5FC0 +4200 +4F80 +4200 +5FC0 +4000 +7FC0 +ENDCHAR +STARTCHAR U_44B1 +ENCODING 17585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +3F00 +0200 +F440 +1680 +2500 +4CE0 +8400 +7FC0 +ENDCHAR +STARTCHAR U_44B2 +ENCODING 17586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +20C0 +F700 +5100 +5100 +5FE0 +2100 +5120 +81E0 +ENDCHAR +STARTCHAR U_44B3 +ENCODING 17587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +1080 +11C0 +2440 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_44B4 +ENCODING 17588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +FFE0 +1000 +3F80 +D080 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_44B5 +ENCODING 17589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FBC0 +5040 +5080 +57E0 +2080 +5080 +8180 +ENDCHAR +STARTCHAR U_44B6 +ENCODING 17590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +7FC0 +4440 +7FC0 +4440 +7FC0 +0480 +0720 +F8E0 +ENDCHAR +STARTCHAR U_44B7 +ENCODING 17591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0380 +7C00 +0400 +FFE0 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44B8 +ENCODING 17592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0800 +3F80 +2A80 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_44B9 +ENCODING 17593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +07C0 +7C00 +0400 +7F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_44BA +ENCODING 17594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0800 +3300 +0C00 +1080 +7FC0 +2500 +2480 +4C40 +ENDCHAR +STARTCHAR U_44BB +ENCODING 17595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23E0 +2220 +AA20 +ABE0 +AA00 +AA20 +FA20 +01E0 +ENDCHAR +STARTCHAR U_44BC +ENCODING 17596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +0A00 +7FC0 +4A40 +7FC0 +4A40 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_44BD +ENCODING 17597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +6AC0 +5140 +5140 +6AC0 +4040 +40C0 +ENDCHAR +STARTCHAR U_44BE +ENCODING 17598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +1000 +2480 +E300 +2200 +2980 +3060 +ENDCHAR +STARTCHAR U_44BF +ENCODING 17599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_44C0 +ENCODING 17600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0400 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44C1 +ENCODING 17601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3F80 +0100 +FFE0 +2100 +1100 +0600 +ENDCHAR +STARTCHAR U_44C2 +ENCODING 17602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44C3 +ENCODING 17603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +7FC0 +4440 +7FC0 +4000 +4020 +3FE0 +ENDCHAR +STARTCHAR U_44C4 +ENCODING 17604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +D0C0 +2700 +5400 +B7E0 +5480 +9480 +1480 +6880 +ENDCHAR +STARTCHAR U_44C5 +ENCODING 17605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +61C0 +1600 +C400 +27E0 +1480 +E480 +4880 +5080 +ENDCHAR +STARTCHAR U_44C6 +ENCODING 17606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +20C0 +F700 +2400 +37E0 +E480 +2480 +2480 +E880 +ENDCHAR +STARTCHAR U_44C7 +ENCODING 17607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0400 +FFE0 +1100 +5140 +9120 +2300 +ENDCHAR +STARTCHAR U_44C8 +ENCODING 17608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2780 +5480 +A860 +6780 +A480 +2280 +2300 +2CE0 +ENDCHAR +STARTCHAR U_44C9 +ENCODING 17609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +2A40 +4AC0 +FE20 +2A20 +4B20 +8AC0 +1A00 +ENDCHAR +STARTCHAR U_44CA +ENCODING 17610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0800 +7F80 +0880 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_44CB +ENCODING 17611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +67C0 +1480 +C480 +27E0 +1480 +E480 +46A0 +4460 +ENDCHAR +STARTCHAR U_44CC +ENCODING 17612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0400 +3F80 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_44CD +ENCODING 17613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +0000 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44CE +ENCODING 17614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +27C0 +6840 +B240 +2140 +3140 +4840 +8180 +ENDCHAR +STARTCHAR U_44CF +ENCODING 17615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0D00 +3480 +C460 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44D0 +ENCODING 17616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +2480 +FFE0 +2480 +3F80 +24A0 +07E0 +ENDCHAR +STARTCHAR U_44D1 +ENCODING 17617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2480 +8480 +5FE0 +1480 +A480 +4480 +4880 +ENDCHAR +STARTCHAR U_44D2 +ENCODING 17618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4040 +BF40 +2940 +3F40 +2940 +3F40 +0180 +ENDCHAR +STARTCHAR U_44D3 +ENCODING 17619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +3F80 +1100 +FFE0 +4900 +8900 +0300 +ENDCHAR +STARTCHAR U_44D4 +ENCODING 17620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0500 +FFE0 +0400 +1F80 +2100 +DFE0 +0200 +ENDCHAR +STARTCHAR U_44D5 +ENCODING 17621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2000 +FFE0 +2280 +22A0 +24E0 +5800 +8FE0 +ENDCHAR +STARTCHAR U_44D6 +ENCODING 17622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FE0 +90A0 +6440 +3F80 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_44D7 +ENCODING 17623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2880 +D160 +3F80 +1080 +0440 +52A0 +52A0 +8F80 +ENDCHAR +STARTCHAR U_44D8 +ENCODING 17624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +1100 +3900 +CA80 +3440 +CFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44D9 +ENCODING 17625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0400 +FFE0 +1500 +75C0 +1500 +F4E0 +0400 +ENDCHAR +STARTCHAR U_44DA +ENCODING 17626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +5440 +A7C0 +6440 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_44DB +ENCODING 17627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +7FC0 +4200 +5240 +5FC0 +9240 +9FC0 +ENDCHAR +STARTCHAR U_44DC +ENCODING 17628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2900 +8900 +4FE0 +1900 +2AA0 +CEA0 +4960 +ENDCHAR +STARTCHAR U_44DD +ENCODING 17629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F00 +0200 +7FC0 +0400 +0400 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_44DE +ENCODING 17630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +4000 +7F80 +4080 +7FC0 +4500 +DF00 +B0C0 +ENDCHAR +STARTCHAR U_44DF +ENCODING 17631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +7FC0 +4440 +5F40 +4440 +7FC0 +5140 +5F40 +80C0 +ENDCHAR +STARTCHAR U_44E0 +ENCODING 17632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +1500 +7CC0 +1700 +E4E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_44E1 +ENCODING 17633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +7DE0 +9120 +FD20 +1120 +2920 +45E0 +8000 +ENDCHAR +STARTCHAR U_44E2 +ENCODING 17634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +5F40 +5140 +5140 +7FC0 +ENDCHAR +STARTCHAR U_44E3 +ENCODING 17635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +5540 +5540 +6EC0 +4440 +41C0 +ENDCHAR +STARTCHAR U_44E4 +ENCODING 17636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4A40 +1240 +2480 +0A00 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_44E5 +ENCODING 17637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +F1E0 +1100 +7FC0 +1100 +3F80 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44E6 +ENCODING 17638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +3F80 +2A80 +3F80 +2A80 +FFE0 +2080 +4040 +ENDCHAR +STARTCHAR U_44E7 +ENCODING 17639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0200 +77C0 +5540 +7480 +5F40 +0000 +FFE0 +ENDCHAR +STARTCHAR U_44E8 +ENCODING 17640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A020 +7F80 +0400 +7FC0 +0400 +2480 +3F80 +ENDCHAR +STARTCHAR U_44E9 +ENCODING 17641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFE0 +2100 +77C0 +6A40 +A280 +2180 +2E60 +ENDCHAR +STARTCHAR U_44EA +ENCODING 17642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3FC0 +CA40 +1440 +6980 +ENDCHAR +STARTCHAR U_44EB +ENCODING 17643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +1100 +FFE0 +2480 +2480 +3C80 +0180 +ENDCHAR +STARTCHAR U_44EC +ENCODING 17644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0780 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_44ED +ENCODING 17645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4620 +38A0 +D4A0 +12A0 +FEA0 +38A0 +5420 +9260 +ENDCHAR +STARTCHAR U_44EE +ENCODING 17646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +2BE0 +1140 +FD40 +3540 +5080 +9140 +3620 +ENDCHAR +STARTCHAR U_44EF +ENCODING 17647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +7F80 +2480 +FFE0 +2480 +3FC0 +1100 +ENDCHAR +STARTCHAR U_44F0 +ENCODING 17648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0A00 +3F80 +2A80 +2A80 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_44F1 +ENCODING 17649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5DC0 +5100 +FCE0 +0400 +FFE0 +1480 +2440 +C420 +ENDCHAR +STARTCHAR U_44F2 +ENCODING 17650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +C860 +5780 +4480 +4480 +4780 +44A0 +5860 +ENDCHAR +STARTCHAR U_44F3 +ENCODING 17651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +D440 +27C0 +E440 +27C0 +2520 +24C0 +2660 +ENDCHAR +STARTCHAR U_44F4 +ENCODING 17652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0800 +7FC0 +5240 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_44F5 +ENCODING 17653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0000 +FBE0 +8A20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_44F6 +ENCODING 17654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FE20 +1120 +7D20 +5520 +7D20 +3920 +5420 +9260 +ENDCHAR +STARTCHAR U_44F7 +ENCODING 17655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6400 +19E0 +C400 +3BE0 +2840 +C840 +4840 +49C0 +ENDCHAR +STARTCHAR U_44F8 +ENCODING 17656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5000 +FBE0 +5080 +A880 +57E0 +F880 +5080 +A880 +ENDCHAR +STARTCHAR U_44F9 +ENCODING 17657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3980 +C460 +3F80 +2480 +3F80 +2500 +33C0 +ENDCHAR +STARTCHAR U_44FA +ENCODING 17658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_44FB +ENCODING 17659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +7240 +07E0 +FA40 +5180 +5240 +8FE0 +ENDCHAR +STARTCHAR U_44FC +ENCODING 17660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4480 +5FE0 +E440 +A4A0 +A640 +6AA0 +4A40 +91E0 +ENDCHAR +STARTCHAR U_44FD +ENCODING 17661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FFC0 +0040 +F040 +07C0 +F400 +9420 +F3E0 +ENDCHAR +STARTCHAR U_44FE +ENCODING 17662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +E540 +09A0 +E100 +1200 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_44FF +ENCODING 17663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0A00 +7FC0 +5140 +4A40 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4500 +ENCODING 17664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +17C0 +2100 +6FE0 +A540 +2B20 +2EE0 +2380 +2C60 +ENDCHAR +STARTCHAR U_4501 +ENCODING 17665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FFE0 +1100 +6AC0 +7FC0 +0400 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4502 +ENCODING 17666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +FFE0 +8420 +3F80 +1100 +FFE0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_4503 +ENCODING 17667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +4000 +23C0 +FA40 +13C0 +3240 +6BC0 +A240 +27E0 +ENDCHAR +STARTCHAR U_4504 +ENCODING 17668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2880 +3FC0 +D100 +2E00 +FBC0 +4400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_4505 +ENCODING 17669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +7FC0 +3E80 +2280 +FFE0 +3E80 +2280 +3E80 +0180 +ENDCHAR +STARTCHAR U_4506 +ENCODING 17670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +D7C0 +2540 +D540 +37C0 +D100 +17C0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_4507 +ENCODING 17671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +4440 +7FC0 +0000 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4508 +ENCODING 17672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +1F00 +0400 +FFE0 +1100 +1F00 +1100 +1F00 +3180 +ENDCHAR +STARTCHAR U_4509 +ENCODING 17673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +1860 +E380 +2080 +FBE0 +30C0 +69A0 +AAA0 +2080 +ENDCHAR +STARTCHAR U_450A +ENCODING 17674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FA40 +27E0 +2240 +FA40 +27E0 +2A40 +3240 +C440 +ENDCHAR +STARTCHAR U_450B +ENCODING 17675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +4540 +F520 +4520 +9140 +F180 +5300 +AC00 +ENDCHAR +STARTCHAR U_450C +ENCODING 17676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0900 +3F80 +2480 +3F80 +1000 +FFE0 +4480 +BF60 +0400 +ENDCHAR +STARTCHAR U_450D +ENCODING 17677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2400 +3F80 +2400 +3FE0 +0020 +5520 +5540 +ENDCHAR +STARTCHAR U_450E +ENCODING 17678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +2100 +F7C0 +2540 +27C0 +2540 +7920 +87E0 +ENDCHAR +STARTCHAR U_450F +ENCODING 17679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4500 +27C0 +F900 +2FE0 +2440 +27C0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_4510 +ENCODING 17680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +1FE0 +8320 +5DE0 +1240 +AFE0 +4320 +5CE0 +ENDCHAR +STARTCHAR U_4511 +ENCODING 17681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +3040 +CD40 +78C0 +1240 +FD60 +5BC0 +9440 +3040 +ENDCHAR +STARTCHAR U_4512 +ENCODING 17682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +E100 +AFE0 +C440 +BFE0 +A000 +E7C0 +8440 +87C0 +ENDCHAR +STARTCHAR U_4513 +ENCODING 17683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +0480 +7880 +07E0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_4514 +ENCODING 17684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3FC0 +1100 +FFE0 +2480 +3F80 +1120 +E0E0 +ENDCHAR +STARTCHAR U_4515 +ENCODING 17685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +5100 +77C0 +5540 +77C0 +5540 +57C0 +9540 +ENDCHAR +STARTCHAR U_4516 +ENCODING 17686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9100 +AFC0 +9460 +DFC0 +A440 +8B80 +8C60 +ENDCHAR +STARTCHAR U_4517 +ENCODING 17687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4440 +2280 +F7C0 +2100 +77C0 +A100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4518 +ENCODING 17688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +7BC0 +A240 +FBC0 +2240 +ABC0 +AA40 +FFE0 +ENDCHAR +STARTCHAR U_4519 +ENCODING 17689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3200 +4BE0 +FC20 +1220 +7D20 +5420 +3820 +60C0 +ENDCHAR +STARTCHAR U_451A +ENCODING 17690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +4000 +7FC0 +5280 +5FC0 +5280 +9F80 +9080 +ENDCHAR +STARTCHAR U_451B +ENCODING 17691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47E0 +4100 +7BC0 +4240 +43C0 +5A40 +63C0 +0420 +ENDCHAR +STARTCHAR U_451C +ENCODING 17692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F900 +57C0 +7540 +57C0 +7540 +5FE0 +F440 +14C0 +ENDCHAR +STARTCHAR U_451D +ENCODING 17693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +5FC0 +5220 +F9E0 +0F00 +0900 +3F80 +1500 +64C0 +ENDCHAR +STARTCHAR U_451E +ENCODING 17694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0A00 +5F40 +2A80 +5F40 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_451F +ENCODING 17695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +39C0 +E240 +2180 +FEE0 +2120 +72C0 +A880 +2700 +ENDCHAR +STARTCHAR U_4520 +ENCODING 17696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2540 +F380 +27C0 +7440 +6FC0 +A440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4521 +ENCODING 17697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +2200 +FF80 +2480 +3F80 +2480 +7FC0 +8920 +ENDCHAR +STARTCHAR U_4522 +ENCODING 17698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6EC0 +1100 +7FC0 +0000 +FFE0 +1000 +3FC0 +0080 +ENDCHAR +STARTCHAR U_4523 +ENCODING 17699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +1140 +FD40 +5440 +3F80 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4524 +ENCODING 17700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47E0 +8200 +F7E0 +9420 +F7E0 +9420 +9420 +F7E0 +ENDCHAR +STARTCHAR U_4525 +ENCODING 17701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0440 +FFE0 +0440 +7FC0 +5540 +7FC0 +A540 +ENDCHAR +STARTCHAR U_4526 +ENCODING 17702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2400 +FFE0 +2540 +7540 +AFE0 +2540 +2FE0 +2080 +ENDCHAR +STARTCHAR U_4527 +ENCODING 17703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +1140 +FF40 +5440 +9480 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_4528 +ENCODING 17704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +4FE0 +7480 +27C0 +4C80 +77C0 +2480 +C7E0 +ENDCHAR +STARTCHAR U_4529 +ENCODING 17705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +FE00 +23E0 +FE40 +AA40 +F980 +7180 +AA40 +2420 +ENDCHAR +STARTCHAR U_452A +ENCODING 17706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +5540 +2480 +5740 +2480 +DB60 +1100 +E0E0 +ENDCHAR +STARTCHAR U_452B +ENCODING 17707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1500 +57E0 +5D20 +5560 +5380 +5D40 +E920 +ENDCHAR +STARTCHAR U_452C +ENCODING 17708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +7FC0 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_452D +ENCODING 17709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A4A0 +5160 +BF80 +2480 +3F80 +2480 +5E80 +ENDCHAR +STARTCHAR U_452E +ENCODING 17710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4900 +FFE0 +4A00 +7BE0 +4A40 +7A40 +4A40 +FE40 +4840 +ENDCHAR +STARTCHAR U_452F +ENCODING 17711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FC80 +2880 +FFE0 +AC80 +C5E0 +BD20 +8520 +FDE0 +ENDCHAR +STARTCHAR U_4530 +ENCODING 17712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +2480 +FFE0 +8020 +7FC0 +1100 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_4531 +ENCODING 17713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +27C0 +F440 +2FE0 +3440 +E7C0 +2440 +2FE0 +6040 +ENDCHAR +STARTCHAR U_4532 +ENCODING 17714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7940 +4E80 +3180 +DF60 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4533 +ENCODING 17715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3140 +4920 +AFE0 +5180 +2240 +CC20 +4920 +8920 +ENDCHAR +STARTCHAR U_4534 +ENCODING 17716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +A7C0 +FD40 +A540 +FD40 +0080 +FC80 +5540 +9220 +ENDCHAR +STARTCHAR U_4535 +ENCODING 17717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +AAA0 +FBE0 +8420 +BFA0 +8E20 +B5A0 +8460 +ENDCHAR +STARTCHAR U_4536 +ENCODING 17718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +F440 +27C0 +3440 +EFE0 +2540 +2780 +68E0 +ENDCHAR +STARTCHAR U_4537 +ENCODING 17719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1100 +7FC0 +1100 +E4E0 +1F00 +0200 +0C00 +ENDCHAR +STARTCHAR U_4538 +ENCODING 17720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0480 +FFE0 +1100 +60C0 +2920 +FFE0 +4A40 +8420 +ENDCHAR +STARTCHAR U_4539 +ENCODING 17721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7240 +57E0 +6120 +56C0 +5180 +76C0 +40A0 +4300 +ENDCHAR +STARTCHAR U_453A +ENCODING 17722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +5280 +67E0 +5A40 +53C0 +7240 +43C0 +4240 +ENDCHAR +STARTCHAR U_453B +ENCODING 17723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +1100 +FDE0 +4B40 +7D40 +1140 +FC80 +1140 +3620 +ENDCHAR +STARTCHAR U_453C +ENCODING 17724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +28A0 +6AA0 +5D60 +9280 +5AE0 +5280 +FFE0 +ENDCHAR +STARTCHAR U_453D +ENCODING 17725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2940 +8A40 +4FE0 +1920 +2AA0 +CFE0 +4040 +ENDCHAR +STARTCHAR U_453E +ENCODING 17726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +F940 +4A40 +6FE0 +D920 +4AA0 +4FE0 +C040 +ENDCHAR +STARTCHAR U_453F +ENCODING 17727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0A00 +3F80 +2A80 +3580 +FFE0 +1100 +0B00 +ENDCHAR +STARTCHAR U_4540 +ENCODING 17728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FE00 +13E0 +7AA0 +0080 +FC80 +5880 +5540 +9220 +ENDCHAR +STARTCHAR U_4541 +ENCODING 17729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F1E0 +1100 +71C0 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4542 +ENCODING 17730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4440 +2FE0 +F440 +27C0 +2CA0 +2540 +7620 +8FE0 +ENDCHAR +STARTCHAR U_4543 +ENCODING 17731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F380 +9C60 +A7C0 +9500 +9480 +EFE0 +8480 +8FC0 +ENDCHAR +STARTCHAR U_4544 +ENCODING 17732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F00 +0440 +F580 +2480 +C460 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_4545 +ENCODING 17733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +42C0 +5540 +F7C0 +5540 +97C0 +6440 +3380 +CC60 +ENDCHAR +STARTCHAR U_4546 +ENCODING 17734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2280 +2440 +FFA0 +2A20 +7EA0 +AAA0 +2EA0 +2A60 +ENDCHAR +STARTCHAR U_4547 +ENCODING 17735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +7FE0 +4800 +5F80 +5280 +5F80 +5280 +5F80 +8940 +B1E0 +ENDCHAR +STARTCHAR U_4548 +ENCODING 17736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +5540 +5FE0 +7540 +47E0 +7100 +5FE0 +5540 +9920 +ENDCHAR +STARTCHAR U_4549 +ENCODING 17737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2A80 +7FC0 +0400 +FFE0 +1100 +7FC0 +0400 +ENDCHAR +STARTCHAR U_454A +ENCODING 17738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2A80 +2A80 +3F80 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_454B +ENCODING 17739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2940 +FFE0 +2940 +2FC0 +3A40 +CA40 +13C0 +ENDCHAR +STARTCHAR U_454C +ENCODING 17740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7480 +27E0 +FC80 +27C0 +7480 +6FC0 +A480 +27E0 +ENDCHAR +STARTCHAR U_454D +ENCODING 17741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +3480 +D300 +11C0 +7FC0 +5140 +7FC0 +4040 +ENDCHAR +STARTCHAR U_454E +ENCODING 17742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0FE0 +F280 +9280 +F7C0 +9540 +F7C0 +9540 +07C0 +ENDCHAR +STARTCHAR U_454F +ENCODING 17743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +0400 +7F80 +1540 +FFE0 +1140 +7980 +2660 +ENDCHAR +STARTCHAR U_4550 +ENCODING 17744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27E0 +FA40 +2240 +77E0 +AD20 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_4551 +ENCODING 17745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47E0 +44A0 +A240 +47E0 +9240 +F240 +A980 +A660 +ENDCHAR +STARTCHAR U_4552 +ENCODING 17746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3FC0 +1100 +FFE0 +1540 +25C0 +4D40 +ENDCHAR +STARTCHAR U_4553 +ENCODING 17747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1480 +FFE0 +AAA0 +5100 +2EC0 +4000 +3F80 +1500 +2480 +ENDCHAR +STARTCHAR U_4554 +ENCODING 17748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2EE0 +D100 +2EE0 +C440 +5F40 +5540 +4E40 +5FC0 +ENDCHAR +STARTCHAR U_4555 +ENCODING 17749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2540 +8FE0 +4AA0 +1FE0 +A440 +4380 +4C60 +ENDCHAR +STARTCHAR U_4556 +ENCODING 17750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9FE0 +4480 +0BC0 +FD20 +4BE0 +4A80 +74A0 +8FE0 +ENDCHAR +STARTCHAR U_4557 +ENCODING 17751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2480 +1F00 +1500 +1500 +3F80 +2480 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_4558 +ENCODING 17752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +37E0 +4900 +B7C0 +0240 +7BC0 +4A40 +33C0 +2420 +ENDCHAR +STARTCHAR U_4559 +ENCODING 17753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FD40 +2120 +FFE0 +5100 +FCA0 +50C0 +7F20 +ENDCHAR +STARTCHAR U_455A +ENCODING 17754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1100 +7FC0 +4200 +5FC0 +5240 +7FE0 +4A80 +4F80 +5040 +7FE0 +ENDCHAR +STARTCHAR U_455B +ENCODING 17755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFE0 +0540 +7540 +0BA0 +7100 +5280 +7C60 +ENDCHAR +STARTCHAR U_455C +ENCODING 17756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2540 +14C0 +7FC0 +2080 +5540 +FFE0 +0400 +ENDCHAR +STARTCHAR U_455D +ENCODING 17757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1040 +FFA0 +2940 +F7C0 +2540 +77C0 +A540 +2FE0 +2440 +ENDCHAR +STARTCHAR U_455E +ENCODING 17758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +AAA0 +F5E0 +9F20 +9520 +9FA0 +9520 +9BA0 +ENDCHAR +STARTCHAR U_455F +ENCODING 17759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +5FC0 +5140 +7FC0 +5540 +7DC0 +5140 +FFE0 +2080 +C060 +ENDCHAR +STARTCHAR U_4560 +ENCODING 17760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +7FE0 +6940 +5DC0 +6560 +5E00 +51C0 +5D40 +8480 +9B60 +ENDCHAR +STARTCHAR U_4561 +ENCODING 17761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +FBE0 +9F20 +9120 +BFA0 +A0A0 +BFA0 +ENDCHAR +STARTCHAR U_4562 +ENCODING 17762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0240 +FFE0 +2100 +23C0 +7900 +CBE0 +7C80 +4BE0 +ENDCHAR +STARTCHAR U_4563 +ENCODING 17763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +F540 +2540 +77E0 +A920 +3AA0 +2FE0 +2040 +ENDCHAR +STARTCHAR U_4564 +ENCODING 17764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EEE0 +AAA0 +FEC0 +54A0 +7CA0 +54A0 +FEC0 +1080 +ENDCHAR +STARTCHAR U_4565 +ENCODING 17765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5140 +9520 +2480 +FFE0 +6EC0 +5540 +6EC0 +5540 +6EC0 +ENDCHAR +STARTCHAR U_4566 +ENCODING 17766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +FFE0 +4000 +7FE0 +4040 +3F80 +EAE0 +BFA0 +EAE0 +BD20 +ENDCHAR +STARTCHAR U_4567 +ENCODING 17767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C80 +57E0 +FD40 +8220 +7D40 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_4568 +ENCODING 17768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7540 +57C0 +5100 +7FE0 +5540 +7AA0 +57C0 +9920 +ENDCHAR +STARTCHAR U_4569 +ENCODING 17769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +FAA0 +2C60 +67C0 +7540 +AFC0 +2540 +2920 +ENDCHAR +STARTCHAR U_456A +ENCODING 17770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +2AA0 +8FE0 +4440 +0FE0 +2100 +CFE0 +4100 +ENDCHAR +STARTCHAR U_456B +ENCODING 17771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +24E0 +BFA0 +AAE0 +FF80 +28E0 +D900 +0600 +79E0 +ENDCHAR +STARTCHAR U_456C +ENCODING 17772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1540 +7540 +4FE0 +7540 +17C0 +1540 +6FE0 +ENDCHAR +STARTCHAR U_456D +ENCODING 17773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +72A0 +21C0 +F940 +5220 +AAA0 +F9C0 +2140 +F620 +ENDCHAR +STARTCHAR U_456E +ENCODING 17774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +7400 +27E0 +FD20 +57E0 +FBA0 +2560 +F920 +20C0 +ENDCHAR +STARTCHAR U_456F +ENCODING 17775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FCE0 +5380 +FAC0 +AAC0 +FAA0 +02A0 +FD20 +ABE0 +ENDCHAR +STARTCHAR U_4570 +ENCODING 17776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +AD40 +77E0 +2380 +2D60 +57C0 +4D40 +87C0 +ENDCHAR +STARTCHAR U_4571 +ENCODING 17777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0100 +FBC0 +8A40 +FBC0 +8A40 +53C0 +FC20 +ENDCHAR +STARTCHAR U_4572 +ENCODING 17778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +5540 +5540 +5FC0 +4000 +7FE0 +8A80 +B240 +ENDCHAR +STARTCHAR U_4573 +ENCODING 17779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +2540 +EFE0 +8D60 +EBA0 +2D60 +2BA0 +C960 +ENDCHAR +STARTCHAR U_4574 +ENCODING 17780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A80 +27E0 +FC80 +27E0 +7480 +A7E0 +2540 +2AA0 +ENDCHAR +STARTCHAR U_4575 +ENCODING 17781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +F7C0 +4540 +F7E0 +0400 +F7E0 +9520 +F540 +ENDCHAR +STARTCHAR U_4576 +ENCODING 17782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4280 +F7E0 +0A80 +F3E0 +0280 +F7E0 +9240 +F180 +9E60 +ENDCHAR +STARTCHAR U_4577 +ENCODING 17783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2480 +7FE0 +4880 +7FE0 +5AC0 +6FA0 +4480 +5FC0 +9280 +A640 +ENDCHAR +STARTCHAR U_4578 +ENCODING 17784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F880 +ABE0 +F880 +23E0 +F800 +23E0 +FA20 +ABE0 +ENDCHAR +STARTCHAR U_4579 +ENCODING 17785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2280 +FBE0 +5640 +ABE0 +2240 +FBE0 +7240 +ABE0 +ENDCHAR +STARTCHAR U_457A +ENCODING 17786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5140 +FFE0 +0400 +7F80 +0400 +FFE0 +4940 +F880 +0B60 +ENDCHAR +STARTCHAR U_457B +ENCODING 17787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +6B40 +5AC0 +7FE0 +4A40 +7FC0 +5520 +9CE0 +ENDCHAR +STARTCHAR U_457C +ENCODING 17788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +57E0 +FA40 +ABE0 +FA40 +23E0 +FA40 +53E0 +ENDCHAR +STARTCHAR U_457D +ENCODING 17789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7C0 +9540 +F7E0 +2AA0 +BFA0 +A220 +FFE0 +8040 +ENDCHAR +STARTCHAR U_457E +ENCODING 17790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3B80 +2A80 +7FE0 +4900 +7DE0 +5740 +BC80 +8760 +ENDCHAR +STARTCHAR U_457F +ENCODING 17791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +52C0 +FB40 +ABE0 +FA00 +23E0 +F520 +5560 +ENDCHAR +STARTCHAR U_4580 +ENCODING 17792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +7BC0 +4A40 +FFE0 +2480 +2880 +7FC0 +AAA0 +3B80 +ENDCHAR +STARTCHAR U_4581 +ENCODING 17793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FFE0 +4940 +7FE0 +5540 +7DC0 +5540 +FDC0 +9520 +FEA0 +85C0 +ENDCHAR +STARTCHAR U_4582 +ENCODING 17794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +FFE0 +4A40 +EEE0 +A4A0 +3F80 +0400 +7FC0 +0C00 +ENDCHAR +STARTCHAR U_4583 +ENCODING 17795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1500 +FFE0 +1480 +6780 +5140 +FBE0 +2080 +FBE0 +69A0 +BAE0 +ENDCHAR +STARTCHAR U_4584 +ENCODING 17796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +FA80 +57E0 +FA80 +ABE0 +FA80 +4BE0 +9240 +8920 +ENDCHAR +STARTCHAR U_4585 +ENCODING 17797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +7FC0 +0400 +FFE0 +AAA0 +7FC0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_4586 +ENCODING 17798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +FFE0 +52A0 +FBE0 +A940 +DFE0 +89A0 +AB40 +F9A0 +ENDCHAR +STARTCHAR U_4587 +ENCODING 17799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2480 +FFE0 +75C0 +AEA0 +FFE0 +A8A0 +7B00 +48C0 +7300 +ENDCHAR +STARTCHAR U_4588 +ENCODING 17800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +44A0 +4500 +5FC0 +4000 +4980 +4E00 +8840 +87C0 +ENDCHAR +STARTCHAR U_4589 +ENCODING 17801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0700 +0400 +7FE0 +44A0 +5FC0 +4000 +4FC0 +4100 +5FE0 +4100 +8300 +ENDCHAR +STARTCHAR U_458A +ENCODING 17802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +1100 +97E0 +5540 +5580 +26E0 +2400 +55C0 +9540 +1940 +0A60 +ENDCHAR +STARTCHAR U_458B +ENCODING 17803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +1080 +7C80 +5480 +7C80 +4080 +5C80 +5540 +5540 +A620 +A420 +ENDCHAR +STARTCHAR U_458C +ENCODING 17804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C20 +1020 +7E20 +52A0 +7CA0 +50A0 +5CA0 +54A0 +5420 +A620 +A460 +ENDCHAR +STARTCHAR U_458D +ENCODING 17805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0F80 +0800 +7FE0 +4920 +7FC0 +4800 +4F80 +5880 +8700 +B8E0 +ENDCHAR +STARTCHAR U_458E +ENCODING 17806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +E100 +AFE0 +AA20 +CFC0 +AA00 +ABC0 +AA80 +EA80 +92A0 +94E0 +ENDCHAR +STARTCHAR U_458F +ENCODING 17807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4920 +7FC0 +5000 +5FC0 +6A40 +5F40 +8AE0 +9480 +ENDCHAR +STARTCHAR U_4590 +ENCODING 17808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +61C0 +4100 +47E0 +7D40 +57E0 +5400 +5540 +5540 +9540 +9A60 +ENDCHAR +STARTCHAR U_4591 +ENCODING 17809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1DE0 +1120 +7F20 +51E0 +7D20 +5120 +5DE0 +5400 +5420 +A7E0 +ENDCHAR +STARTCHAR U_4592 +ENCODING 17810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +0800 +7FE0 +4920 +7F80 +4000 +7FC0 +5080 +5F80 +8900 +BFE0 +ENDCHAR +STARTCHAR U_4593 +ENCODING 17811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2080 +ABE0 +AAA0 +FBE0 +2280 +AAE0 +AA00 +AAA0 +FAA0 +8D20 +ENDCHAR +STARTCHAR U_4594 +ENCODING 17812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +27E0 +F520 +27E0 +F500 +24E0 +5540 +8D40 +F540 +0A60 +ENDCHAR +STARTCHAR U_4595 +ENCODING 17813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +11C0 +7D40 +55C0 +7D40 +5140 +5DC0 +4540 +57E0 +9420 +A3E0 +ENDCHAR +STARTCHAR U_4596 +ENCODING 17814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +13E0 +7EA0 +53E0 +7EA0 +53E0 +5C80 +4080 +54A0 +9420 +A7E0 +ENDCHAR +STARTCHAR U_4597 +ENCODING 17815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0700 +0400 +7FE0 +4920 +7F80 +40A0 +5FE0 +5080 +5FA0 +5540 +A7A0 +ENDCHAR +STARTCHAR U_4598 +ENCODING 17816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +11C0 +7E40 +5480 +7FE0 +52A0 +5BE0 +4140 +5560 +9540 +A660 +ENDCHAR +STARTCHAR U_4599 +ENCODING 17817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +9080 +ED40 +9220 +FF80 +4400 +5FC0 +5540 +5F80 +5540 +A9C0 +ENDCHAR +STARTCHAR U_459A +ENCODING 17818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +13C0 +7E40 +53C0 +7E00 +53C0 +4E00 +5BE0 +54A0 +56A0 +A460 +ENDCHAR +STARTCHAR U_459B +ENCODING 17819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +27E0 +F900 +A7E0 +FD20 +A3C0 +9940 +ABC0 +AAA0 +ACA0 +47E0 +ENDCHAR +STARTCHAR U_459C +ENCODING 17820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +2100 +7FE0 +52A0 +7FE0 +AA80 +5FE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_459D +ENCODING 17821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +7C00 +0400 +7FC0 +4440 +4440 +7FC0 +4400 +0440 +07E0 +FC20 +ENDCHAR +STARTCHAR U_459E +ENCODING 17822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +F840 +AFE0 +A840 +FA40 +2140 +2940 +3840 +E840 +01C0 +ENDCHAR +STARTCHAR U_459F +ENCODING 17823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +1FC0 +0400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45A0 +ENCODING 17824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FA40 +AB40 +AAC0 +FA40 +2240 +2A40 +3A40 +CC60 +ENDCHAR +STARTCHAR U_45A1 +ENCODING 17825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +2140 +F940 +A940 +AFC0 +FA40 +2240 +2240 +3A40 +CFE0 +ENDCHAR +STARTCHAR U_45A2 +ENCODING 17826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +FAC0 +AAA0 +AC80 +F8A0 +2040 +2080 +3900 +CE00 +ENDCHAR +STARTCHAR U_45A3 +ENCODING 17827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +AD40 +AD40 +FD40 +2540 +2540 +3D40 +E920 +0820 +ENDCHAR +STARTCHAR U_45A4 +ENCODING 17828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +B2C0 +2220 +C1E0 +0400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45A5 +ENCODING 17829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0900 +0600 +FFE0 +1440 +6400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45A6 +ENCODING 17830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +22A0 +FAA0 +ABE0 +A880 +FAA0 +22A0 +3AA0 +EBE0 +0220 +ENDCHAR +STARTCHAR U_45A7 +ENCODING 17831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FBC0 +AA40 +AA40 +FBC0 +2000 +3800 +C800 +07E0 +ENDCHAR +STARTCHAR U_45A8 +ENCODING 17832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +A900 +A900 +FA00 +27E0 +2A20 +3A20 +EBE0 +0220 +ENDCHAR +STARTCHAR U_45A9 +ENCODING 17833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +20C0 +FA40 +AE40 +AAA0 +FAA0 +22A0 +2B00 +FA40 +0DC0 +ENDCHAR +STARTCHAR U_45AA +ENCODING 17834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5E60 +5380 +5E20 +E1E0 +0400 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45AB +ENCODING 17835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FC40 +A820 +ABC0 +F900 +2100 +2FE0 +3900 +E900 +0100 +ENDCHAR +STARTCHAR U_45AC +ENCODING 17836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FAA0 +ABE0 +AAA0 +FAA0 +23E0 +2880 +3880 +C880 +0080 +ENDCHAR +STARTCHAR U_45AD +ENCODING 17837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7F80 +0800 +FFE0 +2480 +FFE0 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45AE +ENCODING 17838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +AA20 +AA20 +FBA0 +22A0 +22A0 +3BA0 +CA20 +0260 +ENDCHAR +STARTCHAR U_45AF +ENCODING 17839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0400 +7FC0 +2480 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45B0 +ENCODING 17840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +2860 +FB80 +AA80 +AAA0 +FAC0 +2A80 +3A80 +CA40 +1320 +ENDCHAR +STARTCHAR U_45B1 +ENCODING 17841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2200 +FBE0 +AA80 +ABE0 +FA80 +2280 +3BE0 +CA00 +03E0 +ENDCHAR +STARTCHAR U_45B2 +ENCODING 17842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +ABA0 +AAA0 +FBA0 +22A0 +3BA0 +C820 +00C0 +ENDCHAR +STARTCHAR U_45B3 +ENCODING 17843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +AC20 +A8C0 +FB00 +2100 +2FE0 +3900 +C920 +00E0 +ENDCHAR +STARTCHAR U_45B4 +ENCODING 17844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +AEC0 +AA80 +FAC0 +26A0 +2A80 +3AA0 +ECA0 +0460 +ENDCHAR +STARTCHAR U_45B5 +ENCODING 17845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +FBE0 +AAA0 +AAA0 +FBE0 +2080 +28A0 +38E0 +CB20 +ENDCHAR +STARTCHAR U_45B6 +ENCODING 17846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +AB00 +ACA0 +F9C0 +2680 +29C0 +3EA0 +E880 +0300 +ENDCHAR +STARTCHAR U_45B7 +ENCODING 17847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2180 +F980 +AE60 +A900 +FFE0 +2280 +2FE0 +3AA0 +CAE0 +0080 +ENDCHAR +STARTCHAR U_45B8 +ENCODING 17848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +1240 +FFE0 +1540 +F980 +2660 +7F80 +4480 +7F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45B9 +ENCODING 17849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +26E0 +FA80 +A800 +AFC0 +F900 +2100 +2FE0 +3900 +C900 +0100 +ENDCHAR +STARTCHAR U_45BA +ENCODING 17850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4440 +D380 +5C60 +5100 +57C0 +5540 +57C0 +4140 +4FE0 +ENDCHAR +STARTCHAR U_45BB +ENCODING 17851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AA00 +AC40 +FFE0 +2540 +2D40 +3D40 +C540 +0960 +ENDCHAR +STARTCHAR U_45BC +ENCODING 17852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +22E0 +FAA0 +AFA0 +AAA0 +FFA0 +22A0 +2CA0 +3DE0 +C780 +0080 +ENDCHAR +STARTCHAR U_45BD +ENCODING 17853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +FD20 +3920 +D520 +0C60 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45BE +ENCODING 17854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FC20 +ABC0 +A800 +FFE0 +2280 +3A80 +CAA0 +0460 +ENDCHAR +STARTCHAR U_45BF +ENCODING 17855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +23E0 +FCA0 +70A0 +AB20 +2440 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45C0 +ENCODING 17856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +AA40 +AE20 +FBC0 +2640 +3980 +C980 +0660 +ENDCHAR +STARTCHAR U_45C1 +ENCODING 17857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2280 +FC40 +AFE0 +A840 +FF40 +2540 +3F40 +C840 +00C0 +ENDCHAR +STARTCHAR U_45C2 +ENCODING 17858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2080 +FBE0 +AAA0 +AAC0 +FB60 +2200 +2AC0 +3B40 +CD40 +0660 +ENDCHAR +STARTCHAR U_45C3 +ENCODING 17859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +27E0 +F940 +A880 +AF60 +F940 +27E0 +3940 +C8A0 +0760 +ENDCHAR +STARTCHAR U_45C4 +ENCODING 17860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C60 +2280 +FB80 +AC60 +ABC0 +FC00 +27E0 +3C80 +C480 +0880 +ENDCHAR +STARTCHAR U_45C5 +ENCODING 17861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FBC0 +AA00 +ABC0 +FA00 +27E0 +2AA0 +3AC0 +CA40 +0320 +ENDCHAR +STARTCHAR U_45C6 +ENCODING 17862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FC20 +ABC0 +AA40 +FBC0 +2200 +3BE0 +CA20 +03E0 +ENDCHAR +STARTCHAR U_45C7 +ENCODING 17863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AD60 +ABA0 +FFE0 +2120 +2BA0 +3D60 +C920 +00C0 +ENDCHAR +STARTCHAR U_45C8 +ENCODING 17864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FA00 +A9C0 +AA40 +FBC0 +2240 +3BC0 +EA40 +03C0 +ENDCHAR +STARTCHAR U_45C9 +ENCODING 17865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +F800 +27E0 +2C20 +3FE0 +C420 +07E0 +ENDCHAR +STARTCHAR U_45CA +ENCODING 17866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +FAC0 +A880 +A940 +FE20 +2080 +2AA0 +3AC0 +E940 +0620 +ENDCHAR +STARTCHAR U_45CB +ENCODING 17867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +ABC0 +AA40 +FBC0 +2080 +2FE0 +39C0 +CEA0 +0080 +ENDCHAR +STARTCHAR U_45CC +ENCODING 17868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +FA80 +27E0 +2880 +3BC0 +C880 +07E0 +ENDCHAR +STARTCHAR U_45CD +ENCODING 17869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1200 +FFE0 +1480 +6F00 +14C0 +7F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45CE +ENCODING 17870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2280 +FFE0 +AAA0 +AFE0 +F900 +27C0 +3900 +C900 +0FE0 +ENDCHAR +STARTCHAR U_45CF +ENCODING 17871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +AD40 +AB80 +FA40 +2420 +2BC0 +3A40 +E980 +0660 +ENDCHAR +STARTCHAR U_45D0 +ENCODING 17872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +43E0 +7AA0 +89E0 +0400 +3F80 +2480 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_45D1 +ENCODING 17873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +F900 +A080 +27E0 +3A40 +E940 +07E0 +ENDCHAR +STARTCHAR U_45D2 +ENCODING 17874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27E0 +FA80 +AA80 +AAA0 +FEC0 +2280 +3A80 +EA80 +07E0 +ENDCHAR +STARTCHAR U_45D3 +ENCODING 17875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +AAA0 +AD20 +FAC0 +2100 +28A0 +3AA0 +EA40 +01C0 +ENDCHAR +STARTCHAR U_45D4 +ENCODING 17876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +2240 +FFE0 +AA80 +AAE0 +FB40 +2240 +2BE0 +3A40 +EAC0 +0320 +ENDCHAR +STARTCHAR U_45D5 +ENCODING 17877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A020 +7BC0 +CA40 +35E0 +FF80 +2480 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_45D6 +ENCODING 17878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2540 +F940 +AFE0 +A920 +FFC0 +2540 +3D40 +E5C0 +0100 +ENDCHAR +STARTCHAR U_45D7 +ENCODING 17879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +2540 +F800 +AFE0 +A940 +F940 +2FE0 +3940 +EA40 +0240 +ENDCHAR +STARTCHAR U_45D8 +ENCODING 17880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFE0 +A900 +AA40 +FBC0 +2000 +3FC0 +E540 +0FE0 +ENDCHAR +STARTCHAR U_45D9 +ENCODING 17881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9120 +7FC0 +1100 +F5E0 +3F80 +64C0 +BFA0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45DA +ENCODING 17882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +27E0 +FAA0 +ABE0 +AAA0 +FBE0 +22A0 +27E0 +3940 +C840 +00C0 +ENDCHAR +STARTCHAR U_45DB +ENCODING 17883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +25E0 +28A0 +FA40 +ABA0 +AAE0 +FAA0 +2AE0 +3AA0 +E8E0 +08A0 +ENDCHAR +STARTCHAR U_45DC +ENCODING 17884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2260 +2360 +FAA0 +AB60 +A800 +FBE0 +2AA0 +3BE0 +EAA0 +03E0 +ENDCHAR +STARTCHAR U_45DD +ENCODING 17885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +03E0 +FEA0 +33E0 +5AA0 +95E0 +3F80 +2480 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_45DE +ENCODING 17886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1100 +E0E0 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_45DF +ENCODING 17887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A240 +FDE0 +9240 +FD80 +A660 +FF80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45E0 +ENCODING 17888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +44A0 +7AC0 +4B80 +94E0 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_45E1 +ENCODING 17889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +22C0 +FA80 +AFE0 +AA00 +FBE0 +2200 +2BE0 +FAA0 +0860 +ENDCHAR +STARTCHAR U_45E2 +ENCODING 17890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2140 +25E0 +FA40 +AFE0 +AA00 +FAE0 +22A0 +3AE0 +EF00 +00E0 +ENDCHAR +STARTCHAR U_45E3 +ENCODING 17891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1900 +1F00 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_45E4 +ENCODING 17892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2940 +FFE0 +A940 +AFC0 +F940 +2FC0 +2D40 +F7C0 +1540 +ENDCHAR +STARTCHAR U_45E5 +ENCODING 17893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +3940 +2540 +FAA0 +A880 +AA80 +FAE0 +2A80 +3A80 +EB80 +0C60 +ENDCHAR +STARTCHAR U_45E6 +ENCODING 17894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +24A0 +FA40 +A8A0 +AFE0 +FA40 +22E0 +2A40 +3AE0 +EE40 +01E0 +ENDCHAR +STARTCHAR U_45E7 +ENCODING 17895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2280 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +3AA0 +EDC0 +06A0 +ENDCHAR +STARTCHAR U_45E8 +ENCODING 17896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +FA40 +AFE0 +AAA0 +FBE0 +22A0 +2BE0 +3800 +EAA0 +02A0 +ENDCHAR +STARTCHAR U_45E9 +ENCODING 17897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +FA80 +AB80 +AAA0 +FFA0 +2AC0 +3F40 +CAA0 +1320 +ENDCHAR +STARTCHAR U_45EA +ENCODING 17898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4880 +4F80 +5540 +AAA0 +3F80 +24C0 +7FE0 +ENDCHAR +STARTCHAR U_45EB +ENCODING 17899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +FA80 +AA80 +AFE0 +FA80 +2BC0 +3EA0 +EA80 +1280 +ENDCHAR +STARTCHAR U_45EC +ENCODING 17900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FA80 +2D60 +3100 +CFE0 +0400 +3F80 +2480 +3F80 +0440 +7FE0 +ENDCHAR +STARTCHAR U_45ED +ENCODING 17901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2AC0 +24A0 +FC40 +ABA0 +A800 +FFC0 +2440 +2FC0 +FA80 +0FE0 +ENDCHAR +STARTCHAR U_45EE +ENCODING 17902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FBA0 +AD40 +ABA0 +FD40 +23A0 +3900 +EA80 +0C60 +ENDCHAR +STARTCHAR U_45EF +ENCODING 17903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2140 +25E0 +FB40 +A9E0 +AF40 +F5E0 +2540 +3DE0 +E600 +09E0 +ENDCHAR +STARTCHAR U_45F0 +ENCODING 17904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +27E0 +FAA0 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3D40 +CA20 +ENDCHAR +STARTCHAR U_45F1 +ENCODING 17905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +FFE0 +A900 +ABC0 +F900 +27E0 +2280 +3440 +C820 +ENDCHAR +STARTCHAR U_45F2 +ENCODING 17906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2380 +27E0 +FB80 +AD40 +AAE0 +FD40 +2740 +29E0 +3A40 +CC40 +ENDCHAR +STARTCHAR U_45F3 +ENCODING 17907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2520 +FFE0 +A900 +AFE0 +FD20 +27E0 +2940 +3E60 +CBC0 +ENDCHAR +STARTCHAR U_45F4 +ENCODING 17908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2940 +FFE0 +AA80 +ABE0 +FC80 +2280 +2BE0 +3A00 +CDE0 +ENDCHAR +STARTCHAR U_45F5 +ENCODING 17909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +23E0 +FAA0 +ABE0 +AAA0 +FFE0 +22A0 +2BE0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_45F6 +ENCODING 17910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +FBC0 +AA40 +ABE0 +FAA0 +2560 +2A20 +3BA0 +C840 +ENDCHAR +STARTCHAR U_45F7 +ENCODING 17911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2140 +FFE0 +AA20 +ABE0 +FA20 +23E0 +2CA0 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_45F8 +ENCODING 17912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +57E0 +F480 +2760 +7FC0 +A440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_45F9 +ENCODING 17913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27E0 +FA40 +AD80 +AEE0 +FA40 +26E0 +2920 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_45FA +ENCODING 17914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71E0 +1700 +61C0 +1500 +67E0 +5080 +FFE0 +AAA0 +FBE0 +2480 +FFE0 +ENDCHAR +STARTCHAR U_45FB +ENCODING 17915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2940 +FEE0 +AAA0 +AEA0 +FAA0 +2EA0 +28E0 +3E80 +CA80 +ENDCHAR +STARTCHAR U_45FC +ENCODING 17916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +2100 +FFE0 +AD60 +ABA0 +FFE0 +2100 +2FE0 +3540 +CAA0 +ENDCHAR +STARTCHAR U_45FD +ENCODING 17917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +5480 +EFE0 +5480 +EFE0 +2480 +7FE0 +2440 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_45FE +ENCODING 17918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +27E0 +FA40 +ACA0 +AA40 +FCA0 +26E0 +2800 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_45FF +ENCODING 17919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2520 +FA40 +ABC0 +A800 +FBE0 +22A0 +2FE0 +3880 +CB80 +ENDCHAR +STARTCHAR U_4600 +ENCODING 17920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F00 +2100 +3F80 +2080 +3F80 +2900 +7FE0 +4920 +7FE0 +C920 +ENDCHAR +STARTCHAR U_4601 +ENCODING 17921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +2920 +7F40 +C920 +7FC0 +4840 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_4602 +ENCODING 17922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +22A0 +FFE0 +AA80 +AFA0 +FAA0 +2740 +2A40 +3AA0 +CF20 +ENDCHAR +STARTCHAR U_4603 +ENCODING 17923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2D60 +FBA0 +AFE0 +A900 +FFE0 +2540 +2FE0 +3100 +CFE0 +ENDCHAR +STARTCHAR U_4604 +ENCODING 17924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1900 +2900 +FFE0 +54A0 +7FE0 +14A0 +FBC0 +ENDCHAR +STARTCHAR U_4605 +ENCODING 17925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +4B00 +FBE0 +4A40 +7B80 +4A20 +7BE0 +5540 +7BC0 +1520 +FBC0 +ENDCHAR +STARTCHAR U_4606 +ENCODING 17926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2920 +FFC0 +A900 +AFC0 +F900 +27C0 +2940 +3520 +D7A0 +ENDCHAR +STARTCHAR U_4607 +ENCODING 17927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +1500 +3580 +FBE0 +AAA0 +FBE0 +24C0 +FBA0 +ENDCHAR +STARTCHAR U_4608 +ENCODING 17928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A80 +2FC0 +FAE0 +AFA0 +AAA0 +FFA0 +2AA0 +2BA0 +38A0 +D160 +ENDCHAR +STARTCHAR U_4609 +ENCODING 17929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +7F80 +9560 +7FC0 +5540 +7FC0 +1100 +FFE0 +ENDCHAR +STARTCHAR U_460A +ENCODING 17930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +2AA0 +FFE0 +AD40 +FFE0 +2680 +2DA0 +34A0 +C8C0 +1320 +ENDCHAR +STARTCHAR U_460B +ENCODING 17931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2580 +2AA0 +2FE0 +FA80 +AF80 +AAA0 +FFA0 +2240 +3F40 +32C0 +CF20 +ENDCHAR +STARTCHAR U_460C +ENCODING 17932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +BFC0 +9100 +BFC0 +A880 +FFE0 +AAA0 +FBE0 +2480 +FBA0 +ENDCHAR +STARTCHAR U_460D +ENCODING 17933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2080 +3F80 +2480 +FFE0 +9120 +7FC0 +5540 +7FC0 +D560 +ENDCHAR +STARTCHAR U_460E +ENCODING 17934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2BA0 +2D40 +FAA0 +AFC0 +A840 +FFC0 +2400 +2FE0 +3820 +C8E0 +ENDCHAR +STARTCHAR U_460F +ENCODING 17935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +20A0 +FEA0 +AAC0 +AAA0 +AAA0 +AAA0 +AFC0 +F080 +0080 +0080 +ENDCHAR +STARTCHAR U_4610 +ENCODING 17936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2140 +4140 +FD40 +AD40 +D760 +A540 +FF40 +0140 +0240 +04C0 +ENDCHAR +STARTCHAR U_4611 +ENCODING 17937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2080 +2380 +4080 +FCA0 +AFC0 +D5C0 +A6A0 +FCA0 +0080 +0180 +ENDCHAR +STARTCHAR U_4612 +ENCODING 17938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2140 +4220 +FFE0 +AD40 +D620 +A5C0 +FF40 +0080 +0140 +0620 +ENDCHAR +STARTCHAR U_4613 +ENCODING 17939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +21C0 +4240 +FC80 +AB60 +AA20 +AB60 +BE20 +C220 +03E0 +0220 +ENDCHAR +STARTCHAR U_4614 +ENCODING 17940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +23E0 +4220 +FDC0 +AF40 +D480 +AF60 +F1C0 +0140 +0140 +01C0 +ENDCHAR +STARTCHAR U_4615 +ENCODING 17941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +44E0 +9E00 +2000 +5DE0 +D440 +5440 +5540 +5640 +6440 +40C0 +ENDCHAR +STARTCHAR U_4616 +ENCODING 17942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +5EE0 +9400 +24E0 +5F40 +C440 +5540 +5540 +5F40 +4140 +40C0 +ENDCHAR +STARTCHAR U_4617 +ENCODING 17943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +55E0 +9F00 +2000 +5FE0 +CA40 +5E40 +4A40 +5F40 +5540 +64C0 +ENDCHAR +STARTCHAR U_4618 +ENCODING 17944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5EE0 +A400 +5E00 +C5E0 +5E40 +4A40 +5E40 +4A40 +5F40 +65C0 +ENDCHAR +STARTCHAR U_4619 +ENCODING 17945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +5EE0 +8A00 +7FE0 +5240 +DE40 +4440 +7F40 +4440 +5F40 +55C0 +ENDCHAR +STARTCHAR U_461A +ENCODING 17946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1440 +3280 +D180 +1860 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_461B +ENCODING 17947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2780 +F480 +1480 +2C80 +7480 +AC80 +2480 +2480 +24A0 +2860 +ENDCHAR +STARTCHAR U_461C +ENCODING 17948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +F7E0 +14A0 +2CA0 +74A0 +ACA0 +24E0 +24A0 +2080 +2080 +ENDCHAR +STARTCHAR U_461D +ENCODING 17949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2140 +F120 +17E0 +2900 +7100 +A900 +2080 +20A0 +2060 +2020 +ENDCHAR +STARTCHAR U_461E +ENCODING 17950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +F240 +1240 +2A40 +73E0 +A820 +2020 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_461F +ENCODING 17951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F140 +1140 +2FC0 +7500 +AFE0 +2120 +2120 +21C0 +2100 +ENDCHAR +STARTCHAR U_4620 +ENCODING 17952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +FFE0 +1400 +2540 +6D40 +B540 +2C80 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_4621 +ENCODING 17953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +FBC0 +8200 +9A20 +69E0 +0400 +FFE0 +1440 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_4622 +ENCODING 17954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +1420 +2800 +77E0 +A880 +2080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4623 +ENCODING 17955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +F280 +1280 +2BE0 +7280 +AA80 +2A80 +2A80 +2BA0 +2C60 +ENDCHAR +STARTCHAR U_4624 +ENCODING 17956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +F7E0 +1100 +2B80 +7380 +AD40 +2540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_4625 +ENCODING 17957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +22A0 +F3E0 +12A0 +2AA0 +73E0 +A880 +2080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_4626 +ENCODING 17958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F420 +17E0 +2C00 +7500 +ADE0 +2500 +2500 +2520 +28E0 +ENDCHAR +STARTCHAR U_4627 +ENCODING 17959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F100 +27C0 +3540 +6540 +BFE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4628 +ENCODING 17960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +1240 +2420 +7240 +A240 +3180 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_4629 +ENCODING 17961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +F7E0 +1820 +27A0 +74A0 +A7A0 +34A0 +27A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_462A +ENCODING 17962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +1200 +2440 +77C0 +A280 +3280 +2280 +24A0 +2460 +ENDCHAR +STARTCHAR U_462B +ENCODING 17963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FDE0 +4920 +49E0 +3120 +4800 +FFE0 +1240 +E180 +2880 +3060 +ENDCHAR +STARTCHAR U_462C +ENCODING 17964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +F080 +1FE0 +2480 +7FA0 +A4A0 +34C0 +28A0 +2160 +2620 +ENDCHAR +STARTCHAR U_462D +ENCODING 17965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F100 +1240 +27E0 +7080 +A080 +33E0 +2080 +2080 +27E0 +ENDCHAR +STARTCHAR U_462E +ENCODING 17966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +2480 +2480 +5540 +FFE0 +2480 +2300 +2900 +30E0 +ENDCHAR +STARTCHAR U_462F +ENCODING 17967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +22A0 +F1C0 +13E0 +2A20 +73E0 +AA20 +23E0 +2220 +2220 +2260 +ENDCHAR +STARTCHAR U_4630 +ENCODING 17968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8060 +41C0 +FC40 +4440 +6960 +C940 +6540 +4540 +55E0 +4800 +57E0 +ENDCHAR +STARTCHAR U_4631 +ENCODING 17969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +4E40 +3180 +DF60 +1100 +1F00 +3240 +D180 +1860 +ENDCHAR +STARTCHAR U_4632 +ENCODING 17970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2040 +F3C0 +1040 +27E0 +7420 +A3C0 +3240 +2180 +2180 +2660 +ENDCHAR +STARTCHAR U_4633 +ENCODING 17971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F440 +2820 +37C0 +6100 +B100 +27C0 +2920 +2540 +2FE0 +ENDCHAR +STARTCHAR U_4634 +ENCODING 17972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +E540 +2520 +5E20 +64A0 +C480 +6E80 +5480 +4540 +4520 +45E0 +ENDCHAR +STARTCHAR U_4635 +ENCODING 17973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2040 +F3C0 +1040 +27E0 +7080 +A6A0 +31C0 +26A0 +2080 +2180 +ENDCHAR +STARTCHAR U_4636 +ENCODING 17974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F080 +2100 +2D60 +7BA0 +A920 +3BA0 +2D60 +2920 +2FE0 +ENDCHAR +STARTCHAR U_4637 +ENCODING 17975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +24A0 +F2A0 +12C0 +27E0 +74A0 +A5A0 +36E0 +24A0 +24A0 +24E0 +ENDCHAR +STARTCHAR U_4638 +ENCODING 17976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F7E0 +1280 +2CE0 +75A0 +A760 +3520 +24C0 +24C0 +2720 +ENDCHAR +STARTCHAR U_4639 +ENCODING 17977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +2240 +3240 +65A0 +B100 +27E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_463A +ENCODING 17978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +2420 +33C0 +6080 +B280 +22C0 +2280 +2780 +28E0 +ENDCHAR +STARTCHAR U_463B +ENCODING 17979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F240 +27E0 +3000 +63C0 +B240 +23C0 +2240 +23C0 +2440 +ENDCHAR +STARTCHAR U_463C +ENCODING 17980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2820 +35C0 +6740 +B540 +2BC0 +2100 +2320 +2CE0 +ENDCHAR +STARTCHAR U_463D +ENCODING 17981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2460 +F420 +2760 +3420 +67E0 +B280 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_463E +ENCODING 17982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +2420 +2BC0 +7240 +ABC0 +2200 +23E0 +2220 +23E0 +ENDCHAR +STARTCHAR U_463F +ENCODING 17983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F820 +2FE0 +3880 +6AA0 +BBE0 +2880 +2AA0 +2AA0 +33E0 +ENDCHAR +STARTCHAR U_4640 +ENCODING 17984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +FAA0 +2AA0 +2EE0 +7AA0 +AEE0 +3AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_4641 +ENCODING 17985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +F7E0 +1140 +20A0 +7760 +A140 +37E0 +2140 +2180 +2660 +ENDCHAR +STARTCHAR U_4642 +ENCODING 17986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2440 +FA20 +2280 +3440 +67C0 +B100 +20A0 +2A20 +2A40 +29C0 +ENDCHAR +STARTCHAR U_4643 +ENCODING 17987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +F200 +27C0 +3880 +67E0 +B240 +23C0 +2240 +23C0 +2440 +ENDCHAR +STARTCHAR U_4644 +ENCODING 17988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2100 +F7E0 +2100 +3300 +6560 +B520 +2760 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_4645 +ENCODING 17989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F280 +2FE0 +3AA0 +6FE0 +B240 +2FE0 +2440 +2380 +2C60 +ENDCHAR +STARTCHAR U_4646 +ENCODING 17990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EA0 +2AC0 +F6A0 +1440 +2840 +77A0 +A100 +3FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4647 +ENCODING 17991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F200 +2FE0 +3AA0 +6AA0 +B100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4648 +ENCODING 17992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F440 +2FE0 +3500 +65E0 +B680 +27E0 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_4649 +ENCODING 17993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2480 +F7E0 +2480 +35E0 +6520 +B5E0 +2520 +25E0 +2520 +29E0 +ENDCHAR +STARTCHAR U_464A +ENCODING 17994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +F540 +2FE0 +3920 +67E0 +B540 +2540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_464B +ENCODING 17995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +27C0 +3000 +67C0 +B540 +2640 +27C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_464C +ENCODING 17996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F540 +2FE0 +3000 +67C0 +B440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_464D +ENCODING 17997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2060 +F640 +2D60 +3520 +6FC0 +B560 +2540 +2560 +2940 +3120 +ENDCHAR +STARTCHAR U_464E +ENCODING 17998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2520 +F100 +2240 +3780 +6240 +B7E0 +2100 +2FE0 +2240 +2C20 +ENDCHAR +STARTCHAR U_464F +ENCODING 17999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +F540 +27C0 +3540 +67C0 +B540 +2FE0 +2440 +2240 +20C0 +ENDCHAR +STARTCHAR U_4650 +ENCODING 18000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +F7C0 +1440 +2FC0 +7000 +AFE0 +2AA0 +2FE0 +2920 +2960 +ENDCHAR +STARTCHAR U_4651 +ENCODING 18001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F000 +13C0 +2A40 +77E0 +AA40 +23C0 +26A0 +2A40 +2320 +ENDCHAR +STARTCHAR U_4652 +ENCODING 18002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +1240 +2F80 +7440 +AFC0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_4653 +ENCODING 18003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +FAA0 +2FE0 +3100 +67C0 +B100 +2FE0 +2200 +2440 +27E0 +ENDCHAR +STARTCHAR U_4654 +ENCODING 18004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +F5C0 +1540 +2DC0 +7400 +AFE0 +24A0 +27E0 +2400 +27E0 +ENDCHAR +STARTCHAR U_4655 +ENCODING 18005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2940 +F2A0 +14A0 +2800 +7880 +AAE0 +3A80 +2A80 +2B80 +2C60 +ENDCHAR +STARTCHAR U_4656 +ENCODING 18006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +FFE0 +2000 +3EE0 +6AA0 +BEE0 +2AA0 +2EE0 +2AA0 +3360 +ENDCHAR +STARTCHAR U_4657 +ENCODING 18007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F440 +2FE0 +7920 +AFE0 +3920 +2BA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_4658 +ENCODING 18008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80A0 +40A0 +EFE0 +2A80 +5B80 +EAA0 +DFA0 +4A40 +4F40 +4AA0 +5120 +ENDCHAR +STARTCHAR U_4659 +ENCODING 18009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F7C0 +3EA0 +35C0 +6FA0 +A5C0 +2680 +2BE0 +2880 +3080 +ENDCHAR +STARTCHAR U_465A +ENCODING 18010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F00 +2500 +3F80 +2000 +3FC0 +5440 +FFE0 +2240 +E980 +30E0 +ENDCHAR +STARTCHAR U_465B +ENCODING 18011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2440 +3FE0 +6440 +B7C0 +2320 +2CC0 +2440 +2620 +ENDCHAR +STARTCHAR U_465C +ENCODING 18012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2340 +F9C0 +26A0 +31C0 +6E80 +B5C0 +2480 +25E0 +2680 +39E0 +ENDCHAR +STARTCHAR U_465D +ENCODING 18013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2100 +FBC0 +2140 +FB40 +54E0 +FA40 +2180 +EC80 +3060 +ENDCHAR +STARTCHAR U_465E +ENCODING 18014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +25A0 +F240 +2420 +3FE0 +6000 +B7C0 +2440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_465F +ENCODING 18015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +FFA0 +2AA0 +3FE0 +6AA0 +BBA0 +2D20 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_4660 +ENCODING 18016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5080 +FA80 +34E0 +5F20 +F540 +D540 +7F40 +54A0 +54A0 +6920 +ENDCHAR +STARTCHAR U_4661 +ENCODING 18017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F540 +27C0 +5100 +6FE0 +B440 +2540 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_4662 +ENCODING 18018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +FFE0 +2920 +5D60 +6BA0 +DFE0 +4440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_4663 +ENCODING 18019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +1280 +2C60 +7280 +6EE0 +B280 +2EE0 +2280 +2480 +ENDCHAR +STARTCHAR U_4664 +ENCODING 18020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5440 +F5C0 +2540 +5FE0 +6820 +CBA0 +6AA0 +4BA0 +4820 +5FE0 +ENDCHAR +STARTCHAR U_4665 +ENCODING 18021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +EFE0 +2D60 +5BA0 +7280 +DD60 +4780 +4080 +4300 +4080 +ENDCHAR +STARTCHAR U_4666 +ENCODING 18022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +2FE0 +5AA0 +6FE0 +D220 +47E0 +5C80 +4300 +5C00 +ENDCHAR +STARTCHAR U_4667 +ENCODING 18023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +2540 +57C0 +67C0 +B100 +27C0 +2100 +2FE0 +2AA0 +ENDCHAR +STARTCHAR U_4668 +ENCODING 18024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +2540 +5FE0 +6380 +BD60 +2320 +2D40 +2480 +2660 +ENDCHAR +STARTCHAR U_4669 +ENCODING 18025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +F440 +2FE0 +5820 +E7C0 +D240 +4D80 +4340 +4D20 +4300 +ENDCHAR +STARTCHAR U_466A +ENCODING 18026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2480 +FDE0 +76C0 +ADA0 +FFE0 +2480 +FFE0 +1280 +3500 +D8C0 +ENDCHAR +STARTCHAR U_466B +ENCODING 18027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +2EC0 +F2A0 +2FE0 +2540 +57C0 +6540 +D7C0 +4280 +4FE0 +4440 +ENDCHAR +STARTCHAR U_466C +ENCODING 18028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FEE0 +2AA0 +2EE0 +5440 +62A0 +DFE0 +4480 +4300 +4CE0 +ENDCHAR +STARTCHAR U_466D +ENCODING 18029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +2FC0 +2280 +5FE0 +6480 +DB40 +45A0 +4500 +4BC0 +ENDCHAR +STARTCHAR U_466E +ENCODING 18030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +F480 +2EE0 +2AA0 +5EE0 +67E0 +D880 +4BE0 +4880 +4BE0 +ENDCHAR +STARTCHAR U_466F +ENCODING 18031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +FA80 +2EC0 +2B20 +57E0 +6480 +D780 +45C0 +4700 +49E0 +ENDCHAR +STARTCHAR U_4670 +ENCODING 18032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FF20 +25E0 +5B40 +7540 +DFE0 +6540 +5FE0 +5540 +5F40 +51E0 +ENDCHAR +STARTCHAR U_4671 +ENCODING 18033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +FFE0 +2940 +3FE0 +6AA0 +BFE0 +2AA0 +2FA0 +2AA0 +3F40 +ENDCHAR +STARTCHAR U_4672 +ENCODING 18034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +7FC0 +0400 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4673 +ENCODING 18035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +7FC0 +4440 +2480 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_4674 +ENCODING 18036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +5140 +7FC0 +0400 +FFE0 +2040 +DFA0 +1080 +1FE0 +ENDCHAR +STARTCHAR U_4675 +ENCODING 18037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0400 +FFE0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4676 +ENCODING 18038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +2FE0 +2920 +FE00 +AAA0 +AEA0 +C2C0 +8240 +FE40 +8320 +ENDCHAR +STARTCHAR U_4677 +ENCODING 18039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2580 +2A80 +3480 +3F80 +20A0 +C160 +7F80 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_4678 +ENCODING 18040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9080 +FFE0 +9080 +F480 +9280 +F280 +5080 +51A0 +9020 +9FE0 +ENDCHAR +STARTCHAR U_4679 +ENCODING 18041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +53C0 +5240 +FBC0 +5240 +53C0 +5280 +5280 +94A0 +9860 +ENDCHAR +STARTCHAR U_467A +ENCODING 18042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +AC40 +7440 +27C0 +2440 +37C0 +4A80 +44A0 +9860 +ENDCHAR +STARTCHAR U_467B +ENCODING 18043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3A40 +E3C0 +A240 +A3C0 +FA40 +2BC0 +6A80 +BA80 +24A0 +2860 +ENDCHAR +STARTCHAR U_467C +ENCODING 18044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2BC0 +2A40 +4A40 +93C0 +7A40 +4BC0 +4A80 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_467D +ENCODING 18045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +3180 +DF60 +1500 +1B00 +1500 +1900 +1F40 +61C0 +ENDCHAR +STARTCHAR U_467E +ENCODING 18046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +8BC0 +4240 +7BC0 +4240 +43C0 +4A80 +3AA0 +0C60 +ENDCHAR +STARTCHAR U_467F +ENCODING 18047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +2440 +27C0 +FC40 +27C0 +6440 +77C0 +AA80 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4680 +ENCODING 18048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A40 +6BC0 +5E40 +EBC0 +6A40 +5BC0 +4980 +5AA0 +8CE0 +ENDCHAR +STARTCHAR U_4681 +ENCODING 18049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +43C0 +FA40 +8BC0 +EA40 +ABC0 +AA40 +EBC0 +8980 +9AA0 +8CE0 +ENDCHAR +STARTCHAR U_4682 +ENCODING 18050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +7440 +27C0 +FC40 +57C0 +5440 +DFC0 +5280 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_4683 +ENCODING 18051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7780 +4480 +F780 +9480 +D780 +D480 +9780 +9300 +F520 +09E0 +ENDCHAR +STARTCHAR U_4684 +ENCODING 18052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +0A40 +7BC0 +0A40 +FFC0 +1240 +57C0 +3980 +56A0 +92A0 +3460 +ENDCHAR +STARTCHAR U_4685 +ENCODING 18053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +27C0 +7440 +FFC0 +2440 +77C0 +AA80 +24A0 +28E0 +ENDCHAR +STARTCHAR U_4686 +ENCODING 18054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FF80 +5480 +2780 +7480 +5780 +5480 +FF80 +2300 +5520 +89E0 +ENDCHAR +STARTCHAR U_4687 +ENCODING 18055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +AC40 +37C0 +4440 +F7C0 +5440 +77C0 +5280 +74A0 +08E0 +ENDCHAR +STARTCHAR U_4688 +ENCODING 18056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +23C0 +FA40 +ABC0 +DA40 +FBC0 +2240 +73C0 +2180 +3AA0 +E4E0 +ENDCHAR +STARTCHAR U_4689 +ENCODING 18057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FDC0 +5540 +F5C0 +5540 +EDC0 +4140 +FDC0 +3180 +4AA0 +84E0 +ENDCHAR +STARTCHAR U_468A +ENCODING 18058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +FBC0 +5240 +8BC0 +FA40 +ABC0 +A980 +AD80 +FAA0 +84E0 +ENDCHAR +STARTCHAR U_468B +ENCODING 18059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +FBC0 +8A40 +FBC0 +8A40 +FA40 +8BC0 +F980 +52A0 +8CE0 +ENDCHAR +STARTCHAR U_468C +ENCODING 18060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A40 +7BC0 +4A40 +FFC0 +2240 +73C0 +A980 +72A0 +24E0 +ENDCHAR +STARTCHAR U_468D +ENCODING 18061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +73C0 +2240 +73C0 +2240 +FBC0 +5240 +73C0 +5180 +72A0 +8CE0 +ENDCHAR +STARTCHAR U_468E +ENCODING 18062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DC0 +1140 +7DC0 +1140 +FFC0 +2940 +C7C0 +6C80 +45A0 +7EE0 +ENDCHAR +STARTCHAR U_468F +ENCODING 18063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABC0 +FA40 +73C0 +AA40 +4BC0 +FE40 +ABC0 +FD80 +4AA0 +8CE0 +ENDCHAR +STARTCHAR U_4690 +ENCODING 18064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +FDC0 +5540 +F5C0 +5D40 +A1C0 +7940 +49C0 +7880 +49A0 +7AE0 +ENDCHAR +STARTCHAR U_4691 +ENCODING 18065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBC0 +AA40 +FBC0 +5240 +73C0 +5240 +73C0 +5180 +72A0 +8CE0 +ENDCHAR +STARTCHAR U_4692 +ENCODING 18066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +5240 +FBC0 +AA40 +FBC0 +AA40 +FBC0 +2180 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_4693 +ENCODING 18067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +23C0 +FA40 +ABC0 +7240 +53C0 +7240 +53C0 +F980 +22A0 +24E0 +ENDCHAR +STARTCHAR U_4694 +ENCODING 18068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +8A40 +73C0 +AA40 +73C0 +D240 +73C0 +5180 +72A0 +8CE0 +ENDCHAR +STARTCHAR U_4695 +ENCODING 18069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D800 +03C0 +FA40 +ABC0 +AA40 +23C0 +FA40 +93C0 +D980 +92A0 +DCE0 +ENDCHAR +STARTCHAR U_4696 +ENCODING 18070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +23C0 +FA40 +ABC0 +7240 +ABC0 +FA40 +73C0 +A980 +72A0 +FCE0 +ENDCHAR +STARTCHAR U_4697 +ENCODING 18071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9280 +FA40 +AA40 +FC20 +A900 +F900 +AA40 +ABA0 +9A20 +ENDCHAR +STARTCHAR U_4698 +ENCODING 18072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +4EE0 +9400 +3FE0 +5540 +DF40 +5540 +5F40 +5540 +5140 +63C0 +ENDCHAR +STARTCHAR U_4699 +ENCODING 18073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9000 +FBC0 +AA40 +FBC0 +AA40 +FBC0 +A800 +8800 +9BE0 +ENDCHAR +STARTCHAR U_469A +ENCODING 18074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FA80 +A880 +FFE0 +A940 +F940 +A940 +AA40 +9C60 +ENDCHAR +STARTCHAR U_469B +ENCODING 18075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FC80 +A880 +FFE0 +A800 +FBE0 +AA20 +AA20 +9BE0 +ENDCHAR +STARTCHAR U_469C +ENCODING 18076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +92A0 +FBE0 +AAA0 +FBE0 +AA40 +FFE0 +A840 +A840 +9840 +ENDCHAR +STARTCHAR U_469D +ENCODING 18077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9000 +F940 +A940 +FAA0 +A880 +FBE0 +A880 +A880 +9880 +ENDCHAR +STARTCHAR U_469E +ENCODING 18078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9100 +FD40 +AD40 +FBA0 +A900 +FB80 +AD40 +A920 +9900 +ENDCHAR +STARTCHAR U_469F +ENCODING 18079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9220 +FBE0 +AA20 +FBE0 +A800 +FFE0 +AA40 +A840 +98C0 +ENDCHAR +STARTCHAR U_46A0 +ENCODING 18080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7000 +53E0 +9220 +FBE0 +AA20 +ABE0 +FA80 +ABE0 +FA80 +AAA0 +9BE0 +ENDCHAR +STARTCHAR U_46A1 +ENCODING 18081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FBE0 +A840 +FAA0 +AE80 +AA20 +99E0 +ENDCHAR +STARTCHAR U_46A2 +ENCODING 18082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72A0 +57E0 +92A0 +FAE0 +AA00 +FBE0 +A880 +FFE0 +AAC0 +ACA0 +9880 +ENDCHAR +STARTCHAR U_46A3 +ENCODING 18083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +93C0 +FA40 +AFE0 +F880 +AA80 +FAE0 +AA80 +AB80 +9CE0 +ENDCHAR +STARTCHAR U_46A4 +ENCODING 18084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +72A0 +93E0 +FAA0 +ABE0 +F880 +ABE0 +FAA0 +AAE0 +ABA0 +9A60 +ENDCHAR +STARTCHAR U_46A5 +ENCODING 18085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7120 +AF60 +F880 +AFE0 +F920 +ADA0 +FB60 +ADA0 +A920 +9EC0 +ENDCHAR +STARTCHAR U_46A6 +ENCODING 18086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +5F00 +A9C0 +F900 +ABE0 +FAA0 +ABE0 +FA80 +AAE0 +AB40 +9D60 +ENDCHAR +STARTCHAR U_46A7 +ENCODING 18087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +75A0 +9360 +FCA0 +A980 +FE60 +AB80 +F8C0 +AB20 +A8C0 +9F00 +ENDCHAR +STARTCHAR U_46A8 +ENCODING 18088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +75A0 +9240 +FC20 +A6E0 +FAA0 +AF00 +F8E0 +AEA0 +AA40 +8DA0 +ENDCHAR +STARTCHAR U_46A9 +ENCODING 18089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7100 +97E0 +FA40 +AFA0 +FA80 +ABE0 +FA20 +ABA0 +AAA0 +9BA0 +ENDCHAR +STARTCHAR U_46AA +ENCODING 18090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +AFE0 +F800 +AFE0 +FA40 +ABC0 +FAA0 +AEC0 +AA40 +9B20 +ENDCHAR +STARTCHAR U_46AB +ENCODING 18091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +AD40 +F940 +4F80 +9160 +3F80 +2480 +3E80 +2480 +5E80 +ENDCHAR +STARTCHAR U_46AC +ENCODING 18092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +AFE0 +FB40 +AD20 +FA40 +ABE0 +FD40 +ABE0 +A940 +BE40 +ENDCHAR +STARTCHAR U_46AD +ENCODING 18093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4760 +7140 +93E0 +FAA0 +ABE0 +FA40 +AFE0 +FA40 +ABE0 +AA40 +9BE0 +ENDCHAR +STARTCHAR U_46AE +ENCODING 18094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2F80 +F480 +0480 +F500 +05E0 +F420 +0420 +F420 +95E0 +F840 +ENDCHAR +STARTCHAR U_46AF +ENCODING 18095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FE20 +0120 +7D20 +0120 +7D20 +0120 +7C20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_46B0 +ENCODING 18096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +FE00 +0260 +7B80 +0600 +7A00 +0200 +7A20 +4A20 +79E0 +ENDCHAR +STARTCHAR U_46B1 +ENCODING 18097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +0080 +7AC0 +02A0 +7CA0 +0080 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_46B2 +ENCODING 18098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1020 +FCC0 +0300 +7820 +00C0 +7B00 +0000 +7820 +48C0 +7F00 +ENDCHAR +STARTCHAR U_46B3 +ENCODING 18099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0100 +F100 +07C0 +F440 +0280 +F100 +9280 +FC60 +ENDCHAR +STARTCHAR U_46B4 +ENCODING 18100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +13E0 +FE20 +03E0 +7A20 +03E0 +7A20 +0220 +7A20 +4A20 +7CE0 +ENDCHAR +STARTCHAR U_46B5 +ENCODING 18101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2280 +F880 +0480 +F280 +0080 +FFE0 +0080 +F080 +9080 +F080 +ENDCHAR +STARTCHAR U_46B6 +ENCODING 18102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F900 +0100 +F100 +0FE0 +F100 +0280 +F280 +9440 +F820 +ENDCHAR +STARTCHAR U_46B7 +ENCODING 18103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2240 +FC20 +0000 +F7E0 +0200 +F7E0 +0020 +F020 +9140 +F080 +ENDCHAR +STARTCHAR U_46B8 +ENCODING 18104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0440 +F820 +0240 +F240 +0240 +F240 +9240 +F440 +ENDCHAR +STARTCHAR U_46B9 +ENCODING 18105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +FC80 +0480 +F7E0 +0480 +F480 +0480 +F480 +95A0 +F6E0 +ENDCHAR +STARTCHAR U_46BA +ENCODING 18106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0640 +FA40 +0240 +F240 +0180 +F180 +9240 +FC20 +ENDCHAR +STARTCHAR U_46BB +ENCODING 18107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0F80 +1500 +6A00 +0400 +FFC0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46BC +ENCODING 18108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FA40 +0240 +F240 +07E0 +F240 +0240 +F240 +9240 +FFE0 +ENDCHAR +STARTCHAR U_46BD +ENCODING 18109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +01C0 +F700 +0100 +F1E0 +0F00 +F100 +9120 +F0E0 +ENDCHAR +STARTCHAR U_46BE +ENCODING 18110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2780 +F880 +0080 +F080 +0FE0 +F080 +0080 +F080 +9080 +F7E0 +ENDCHAR +STARTCHAR U_46BF +ENCODING 18111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F7E0 +0520 +F540 +0900 +F100 +0280 +F280 +9440 +F820 +ENDCHAR +STARTCHAR U_46C0 +ENCODING 18112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FC00 +07E0 +F620 +0520 +F540 +0480 +F480 +9540 +FA20 +ENDCHAR +STARTCHAR U_46C1 +ENCODING 18113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23C0 +F240 +0240 +F7E0 +0240 +F7E0 +0240 +F240 +9240 +F4C0 +ENDCHAR +STARTCHAR U_46C2 +ENCODING 18114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2340 +FD40 +0140 +FBE0 +0140 +F940 +0140 +F940 +9A40 +FC40 +ENDCHAR +STARTCHAR U_46C3 +ENCODING 18115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F000 +0000 +F7E0 +0280 +F280 +02A0 +F4A0 +94A0 +F860 +ENDCHAR +STARTCHAR U_46C4 +ENCODING 18116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4400 +EFE0 +0AA0 +EAA0 +16E0 +E280 +0280 +E4A0 +A4A0 +E8E0 +ENDCHAR +STARTCHAR U_46C5 +ENCODING 18117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +24A0 +F4A0 +07E0 +F4A0 +04A0 +F7E0 +04A0 +F080 +9080 +F080 +ENDCHAR +STARTCHAR U_46C6 +ENCODING 18118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +0080 +7BE0 +02A0 +7AA0 +03E0 +7AA0 +4AA0 +4AA0 +7BE0 +ENDCHAR +STARTCHAR U_46C7 +ENCODING 18119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA40 +0240 +F240 +0420 +F800 +03E0 +F220 +9220 +F220 +93E0 +ENDCHAR +STARTCHAR U_46C8 +ENCODING 18120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F500 +0900 +F100 +07E0 +F100 +0100 +F280 +9240 +F420 +ENDCHAR +STARTCHAR U_46C9 +ENCODING 18121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +07C0 +F500 +07C0 +F500 +0500 +F4A0 +9660 +F420 +ENDCHAR +STARTCHAR U_46CA +ENCODING 18122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FE20 +0220 +7A20 +03E0 +7800 +0000 +7940 +4A20 +7C20 +ENDCHAR +STARTCHAR U_46CB +ENCODING 18123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +20A0 +F080 +07E0 +F480 +0480 +F4A0 +04C0 +F4A0 +96A0 +F160 +ENDCHAR +STARTCHAR U_46CC +ENCODING 18124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F3E0 +0420 +F3A0 +02A0 +F3A0 +0260 +F200 +9220 +F1E0 +ENDCHAR +STARTCHAR U_46CD +ENCODING 18125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FFE0 +02A0 +FFE0 +0A80 +FFE0 +02A0 +F2A0 +94E0 +F880 +ENDCHAR +STARTCHAR U_46CE +ENCODING 18126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F420 +0840 +F280 +0280 +F280 +0280 +F2A0 +94A0 +F8E0 +ENDCHAR +STARTCHAR U_46CF +ENCODING 18127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +F220 +03E0 +F280 +02A0 +F2C0 +0280 +F2A0 +94A0 +F4E0 +ENDCHAR +STARTCHAR U_46D0 +ENCODING 18128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0040 +3FC0 +1140 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46D1 +ENCODING 18129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F540 +0440 +F480 +0C80 +F540 +0620 +F420 +9C40 +F3C0 +ENDCHAR +STARTCHAR U_46D2 +ENCODING 18130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +FBE0 +0420 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46D3 +ENCODING 18131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +93E0 +9480 +1440 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46D4 +ENCODING 18132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +0100 +E200 +0FE0 +EAA0 +0AA0 +EAA0 +AAA0 +AAA0 +E860 +ENDCHAR +STARTCHAR U_46D5 +ENCODING 18133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +F7E0 +04A0 +F7E0 +04A0 +F7E0 +0480 +F280 +9180 +FE60 +ENDCHAR +STARTCHAR U_46D6 +ENCODING 18134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0520 +F7E0 +0520 +F7E0 +0140 +F080 +9160 +FE20 +ENDCHAR +STARTCHAR U_46D7 +ENCODING 18135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +A7E0 +A000 +FBC0 +8800 +8BC0 +F800 +A3C0 +A240 +FBC0 +ENDCHAR +STARTCHAR U_46D8 +ENCODING 18136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +24E0 +FF80 +0480 +F480 +0480 +F7E0 +0480 +F480 +9480 +F5E0 +ENDCHAR +STARTCHAR U_46D9 +ENCODING 18137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2480 +FC80 +07E0 +F480 +0580 +F5C0 +06A0 +F480 +9480 +F480 +ENDCHAR +STARTCHAR U_46DA +ENCODING 18138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1120 +7920 +1240 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_46DB +ENCODING 18139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +0820 +EBA0 +0AA0 +EAA0 +0AA0 +EBA0 +A820 +AFE0 +E820 +ENDCHAR +STARTCHAR U_46DC +ENCODING 18140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F200 +0FE0 +E820 +0C60 +EAA0 +0920 +EAA0 +AC60 +A820 +EFE0 +ENDCHAR +STARTCHAR U_46DD +ENCODING 18141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F240 +0240 +F7C0 +0240 +FFE0 +0100 +F520 +9520 +97E0 +F420 +ENDCHAR +STARTCHAR U_46DE +ENCODING 18142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F000 +07C0 +F100 +9FE0 +9100 +F100 +ENDCHAR +STARTCHAR U_46DF +ENCODING 18143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0540 +F540 +0BA0 +F100 +0280 +F280 +9440 +F820 +ENDCHAR +STARTCHAR U_46E0 +ENCODING 18144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +F7C0 +0440 +F440 +07C0 +F000 +0440 +F240 +9280 +FFE0 +ENDCHAR +STARTCHAR U_46E1 +ENCODING 18145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2780 +F480 +07E0 +F480 +0660 +F420 +07E0 +F420 +9420 +F7E0 +ENDCHAR +STARTCHAR U_46E2 +ENCODING 18146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2780 +F100 +0FE0 +F380 +0540 +F920 +0280 +F280 +94A0 +F860 +ENDCHAR +STARTCHAR U_46E3 +ENCODING 18147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +07C0 +F540 +0FE0 +F200 +07C0 +F040 +9240 +F180 +ENDCHAR +STARTCHAR U_46E4 +ENCODING 18148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F440 +0440 +F7C0 +0100 +F1E0 +0500 +F500 +9700 +F9E0 +ENDCHAR +STARTCHAR U_46E5 +ENCODING 18149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4300 +E480 +0200 +FFE0 +0500 +EFC0 +1540 +E540 +A540 +E100 +ENDCHAR +STARTCHAR U_46E6 +ENCODING 18150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +F440 +0900 +F180 +0240 +F420 +0BC0 +F240 +9240 +F3C0 +ENDCHAR +STARTCHAR U_46E7 +ENCODING 18151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4D40 +EB80 +0900 +EFC0 +0900 +EB80 +0B40 +ED40 +A900 +EFE0 +ENDCHAR +STARTCHAR U_46E8 +ENCODING 18152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F440 +0280 +FFE0 +0100 +F100 +07C0 +F100 +9100 +F100 +ENDCHAR +STARTCHAR U_46E9 +ENCODING 18153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +F280 +0EE0 +F820 +0820 +FEE0 +0280 +F280 +9280 +FFE0 +ENDCHAR +STARTCHAR U_46EA +ENCODING 18154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +0480 +FFE0 +0040 +F7C0 +0400 +F7C0 +9040 +F180 +ENDCHAR +STARTCHAR U_46EB +ENCODING 18155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4400 +F7C0 +0400 +F7C0 +0400 +FFE0 +0500 +F540 +9480 +F660 +ENDCHAR +STARTCHAR U_46EC +ENCODING 18156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +F420 +0FA0 +F220 +1FE0 +E220 +0AA0 +EAA0 +AFA0 +E0C0 +ENDCHAR +STARTCHAR U_46ED +ENCODING 18157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +0FE0 +F440 +0280 +F7C0 +0100 +FFE0 +9100 +F100 +ENDCHAR +STARTCHAR U_46EE +ENCODING 18158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4EC0 +FAA0 +0480 +F480 +0BE0 +F000 +07C0 +F440 +9440 +F7C0 +ENDCHAR +STARTCHAR U_46EF +ENCODING 18159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +E820 +0FE0 +E880 +0FE0 +E880 +0BE0 +EA20 +AA20 +F3E0 +ENDCHAR +STARTCHAR U_46F0 +ENCODING 18160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F7E0 +0420 +F7E0 +0000 +F4A0 +07C0 +F480 +95A0 +F660 +ENDCHAR +STARTCHAR U_46F1 +ENCODING 18161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F540 +0540 +F7C0 +0100 +F000 +0540 +FCA0 +9440 +F3C0 +ENDCHAR +STARTCHAR U_46F2 +ENCODING 18162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +E440 +07C0 +E440 +07C0 +E100 +0FE0 +E920 +A960 +E100 +ENDCHAR +STARTCHAR U_46F3 +ENCODING 18163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +E280 +0540 +EFE0 +1540 +E7C0 +0540 +E7C0 +A120 +E0E0 +ENDCHAR +STARTCHAR U_46F4 +ENCODING 18164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +E280 +0440 +EFE0 +0040 +E740 +0540 +E740 +A040 +E1C0 +ENDCHAR +STARTCHAR U_46F5 +ENCODING 18165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E40 +EA40 +0580 +FFE0 +1020 +F7A0 +0480 +E300 +A280 +EC60 +ENDCHAR +STARTCHAR U_46F6 +ENCODING 18166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +F7C0 +0100 +F7C0 +0100 +FFE0 +9380 +9540 +F920 +ENDCHAR +STARTCHAR U_46F7 +ENCODING 18167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +FFE0 +1420 +E6E0 +0AA0 +FAA0 +06C0 +E480 +A8A0 +F0E0 +ENDCHAR +STARTCHAR U_46F8 +ENCODING 18168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +EFE0 +0900 +E900 +09E0 +E900 +0BC0 +EA40 +AA40 +F3C0 +ENDCHAR +STARTCHAR U_46F9 +ENCODING 18169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +E440 +0780 +E080 +1FE0 +E540 +1B80 +E5C0 +BAA0 +E580 +ENDCHAR +STARTCHAR U_46FA +ENCODING 18170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +EFE0 +0920 +EFE0 +0480 +E860 +1440 +E440 +A440 +E840 +ENDCHAR +STARTCHAR U_46FB +ENCODING 18171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4900 +EFE0 +0900 +EBC0 +0A40 +EBC0 +0A40 +EBC0 +AA40 +F3C0 +ENDCHAR +STARTCHAR U_46FC +ENCODING 18172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4CE0 +E820 +0EE0 +E820 +0FE0 +E000 +07C0 +E100 +A100 +EFE0 +ENDCHAR +STARTCHAR U_46FD +ENCODING 18173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +E100 +0FE0 +E100 +0500 +E960 +0920 +ED60 +A920 +EFE0 +ENDCHAR +STARTCHAR U_46FE +ENCODING 18174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +E7C0 +0100 +EFE0 +0200 +E680 +0300 +EFE0 +A540 +E920 +ENDCHAR +STARTCHAR U_46FF +ENCODING 18175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +E7C0 +0440 +E7C0 +0000 +EFE0 +0AA0 +EFE0 +A920 +E920 +ENDCHAR +STARTCHAR U_4700 +ENCODING 18176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4AA0 +FBA0 +0EE0 +EAA0 +1760 +F100 +05C0 +F500 +9500 +FFE0 +ENDCHAR +STARTCHAR U_4701 +ENCODING 18177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45C0 +4480 +F7E0 +0480 +F7E0 +0480 +F7E0 +0080 +F7E0 +9140 +F620 +ENDCHAR +STARTCHAR U_4702 +ENCODING 18178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +07C0 +F440 +07C0 +F200 +0FE0 +F540 +9BA0 +F100 +ENDCHAR +STARTCHAR U_4703 +ENCODING 18179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F7E0 +0C80 +F7E0 +0480 +F7E0 +9480 +F7E0 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4704 +ENCODING 18180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +F7E0 +06A0 +F5C0 +06A0 +F580 +05E0 +F680 +9BE0 +F880 +ENDCHAR +STARTCHAR U_4705 +ENCODING 18181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +FFE0 +0480 +F7E0 +0C80 +F7E0 +0480 +F7E0 +9480 +F7E0 +ENDCHAR +STARTCHAR U_4706 +ENCODING 18182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +7FE0 +4000 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_4707 +ENCODING 18183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F280 +0480 +FFE0 +0440 +F7C0 +0D20 +F4C0 +9440 +F620 +ENDCHAR +STARTCHAR U_4708 +ENCODING 18184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +2A40 +FFE0 +0920 +FFE0 +0920 +FFE0 +0100 +FFE0 +9540 +F920 +ENDCHAR +STARTCHAR U_4709 +ENCODING 18185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F380 +0D60 +F100 +0380 +FD60 +0540 +F380 +9540 +F720 +ENDCHAR +STARTCHAR U_470A +ENCODING 18186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +FFE0 +0AA0 +FFE0 +0AA0 +FFE0 +0440 +F7C0 +9440 +F7C0 +ENDCHAR +STARTCHAR U_470B +ENCODING 18187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +07C0 +F100 +0FE0 +F440 +0540 +F540 +97C0 +FC60 +ENDCHAR +STARTCHAR U_470C +ENCODING 18188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4E40 +5080 +FFE0 +2040 +5EA0 +F1E0 +0E00 +AAA0 +AEA0 +8B00 +ENDCHAR +STARTCHAR U_470D +ENCODING 18189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +0440 +F7C0 +0C60 +F7C0 +0440 +F7C0 +9540 +FB20 +ENDCHAR +STARTCHAR U_470E +ENCODING 18190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4AE0 +F740 +0240 +FDA0 +0FE0 +F920 +07C0 +F140 +9240 +F4C0 +ENDCHAR +STARTCHAR U_470F +ENCODING 18191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4FE0 +EA80 +0DE0 +EB40 +0AE0 +EAA0 +0CE0 +E8A0 +A8E0 +E8A0 +ENDCHAR +STARTCHAR U_4710 +ENCODING 18192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +6280 +57E0 +7AC0 +4240 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_4711 +ENCODING 18193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +EEE0 +0820 +EEE0 +0280 +EFE0 +0240 +ED20 +B440 +E7C0 +ENDCHAR +STARTCHAR U_4712 +ENCODING 18194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +ED60 +0BA0 +E920 +0FE0 +EBA0 +0D60 +FFE0 +A280 +EC60 +ENDCHAR +STARTCHAR U_4713 +ENCODING 18195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4EE0 +F440 +0540 +FFE0 +0540 +F7E0 +0100 +FFE0 +9340 +FD20 +ENDCHAR +STARTCHAR U_4714 +ENCODING 18196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +4900 +E7E0 +1E80 +E9E0 +0920 +E9E0 +0920 +E9E0 +AA20 +F7E0 +ENDCHAR +STARTCHAR U_4715 +ENCODING 18197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +0FC0 +EA40 +0FC0 +EA40 +0FE0 +EAA0 +AFA0 +E860 +ENDCHAR +STARTCHAR U_4716 +ENCODING 18198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +EFE0 +0AA0 +EFE0 +0440 +E5C0 +0740 +E440 +A7C0 +EC60 +ENDCHAR +STARTCHAR U_4717 +ENCODING 18199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80A0 +5FE0 +F080 +17A0 +F0A0 +17A0 +F540 +17C0 +F540 +BCA0 +F7C0 +ENDCHAR +STARTCHAR U_4718 +ENCODING 18200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +FB80 +0AE0 +EFA0 +11A0 +FFA0 +0B40 +EF40 +A1A0 +A5A0 +E2A0 +ENDCHAR +STARTCHAR U_4719 +ENCODING 18201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F840 +0FC0 +F840 +0FC0 +F480 +0FE0 +F440 +9AA0 +9FE0 +FAA0 +ENDCHAR +STARTCHAR U_471A +ENCODING 18202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +5AA0 +EFE0 +0100 +FBC0 +0D20 +E900 +0BC0 +ED20 +A900 +F7E0 +ENDCHAR +STARTCHAR U_471B +ENCODING 18203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4500 +F7C0 +0540 +F7C0 +02A0 +F7E0 +0560 +F7C0 +92A0 +FCE0 +ENDCHAR +STARTCHAR U_471C +ENCODING 18204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +EFE0 +0800 +EFE0 +0A40 +EDA0 +0A40 +EFE0 +AA40 +F3C0 +ENDCHAR +STARTCHAR U_471D +ENCODING 18205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4A40 +EDA0 +0A40 +EDA0 +0FE0 +EA40 +0DA0 +EA40 +ADA0 +EFE0 +ENDCHAR +STARTCHAR U_471E +ENCODING 18206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F280 +1D60 +F540 +1560 +FD40 +07C0 +F440 +97C0 +F840 +ENDCHAR +STARTCHAR U_471F +ENCODING 18207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +4EA0 +E480 +1FE0 +EA80 +1B80 +EAA0 +1BA0 +EA40 +BFC0 +E120 +ENDCHAR +STARTCHAR U_4720 +ENCODING 18208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +F880 +0FE0 +FAA0 +0AA0 +F7C0 +0440 +F540 +9540 +97C0 +FC60 +ENDCHAR +STARTCHAR U_4721 +ENCODING 18209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +07C0 +F440 +0FE0 +F920 +0460 +F3C0 +9640 +9980 +F660 +ENDCHAR +STARTCHAR U_4722 +ENCODING 18210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +07C0 +F100 +0FE0 +FAA0 +0FE0 +F100 +9540 +9C60 +F7C0 +ENDCHAR +STARTCHAR U_4723 +ENCODING 18211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +4700 +2400 +0400 +E7E0 +2480 +2480 +2480 +3C80 +2880 +1080 +ENDCHAR +STARTCHAR U_4724 +ENCODING 18212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +4480 +2480 +0FC0 +E480 +2480 +3FE0 +2000 +3480 +2440 +0840 +ENDCHAR +STARTCHAR U_4725 +ENCODING 18213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9DE0 +4520 +09E0 +DD20 +4520 +55E0 +4800 +69E0 +5400 +23E0 +ENDCHAR +STARTCHAR U_4726 +ENCODING 18214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +5FE0 +2480 +0FE0 +F020 +27A0 +24A0 +2FA0 +34A0 +27A0 +0040 +ENDCHAR +STARTCHAR U_4727 +ENCODING 18215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9FE0 +4AA0 +1BA0 +CAA0 +5320 +4100 +45C0 +5500 +6500 +5FE0 +ENDCHAR +STARTCHAR U_4728 +ENCODING 18216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +87C0 +4540 +0FE0 +C920 +4FE0 +4100 +4A40 +4920 +7460 +57C0 +ENDCHAR +STARTCHAR U_4729 +ENCODING 18217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +9FE0 +4480 +0F80 +38E0 +CF80 +4D80 +7FE0 +5000 +6D40 +52A0 +ENDCHAR +STARTCHAR U_472A +ENCODING 18218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5100 +4BC0 +A940 +2140 +5140 +8940 +7140 +5240 +5260 +7460 +ENDCHAR +STARTCHAR U_472B +ENCODING 18219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4800 +4FC0 +A900 +2100 +5100 +8900 +7100 +5100 +5100 +7FE0 +ENDCHAR +STARTCHAR U_472C +ENCODING 18220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +5080 +4BE0 +AAA0 +22A0 +52A0 +8BE0 +72A0 +52A0 +52A0 +73E0 +ENDCHAR +STARTCHAR U_472D +ENCODING 18221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +FFE0 +8020 +7FC0 +2E80 +D160 +3F80 +E160 +2100 +3F00 +ENDCHAR +STARTCHAR U_472E +ENCODING 18222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +57E0 +4C20 +A880 +2280 +53E0 +8C80 +7080 +57E0 +5080 +7080 +ENDCHAR +STARTCHAR U_472F +ENCODING 18223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +53E0 +4C20 +AD60 +23A0 +57E0 +8920 +73A0 +5360 +5520 +7140 +ENDCHAR +STARTCHAR U_4730 +ENCODING 18224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +5240 +4BC0 +AA40 +23C0 +5100 +8FE0 +7280 +5540 +5BA0 +7100 +ENDCHAR +STARTCHAR U_4731 +ENCODING 18225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +4A40 +4BC0 +A240 +2FE0 +5AA0 +8FE0 +7440 +5280 +5380 +7C60 +ENDCHAR +STARTCHAR U_4732 +ENCODING 18226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +4D40 +4AA0 +A7E0 +2520 +56A0 +8FE0 +7540 +57C0 +5540 +77A0 +ENDCHAR +STARTCHAR U_4733 +ENCODING 18227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0000 +3FC0 +2040 +3FC0 +1080 +0900 +FFE0 +2000 +2000 +3FC0 +ENDCHAR +STARTCHAR U_4734 +ENCODING 18228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +01C0 +7100 +5100 +57C0 +7440 +0240 +5280 +5100 +3280 +CC60 +ENDCHAR +STARTCHAR U_4735 +ENCODING 18229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +07E0 +74A0 +5480 +57E0 +7620 +0520 +5540 +5480 +3540 +CA20 +ENDCHAR +STARTCHAR U_4736 +ENCODING 18230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +03C0 +7640 +5180 +5240 +7CA0 +0080 +53C0 +5280 +3BC0 +C080 +ENDCHAR +STARTCHAR U_4737 +ENCODING 18231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +0040 +77E0 +5040 +5FE0 +7820 +03C0 +5240 +5180 +3A40 +C420 +ENDCHAR +STARTCHAR U_4738 +ENCODING 18232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +0220 +73E0 +5200 +53C0 +7280 +03C0 +5280 +53E0 +3C80 +C460 +ENDCHAR +STARTCHAR U_4739 +ENCODING 18233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +0FE0 +7100 +57C0 +5540 +7540 +07C0 +5100 +5380 +3540 +C920 +ENDCHAR +STARTCHAR U_473A +ENCODING 18234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +07E0 +7240 +5240 +5FE0 +7000 +03C0 +5240 +53C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_473B +ENCODING 18235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +0240 +73C0 +5240 +53C0 +7000 +0FE0 +5100 +55C0 +3500 +CBE0 +ENDCHAR +STARTCHAR U_473C +ENCODING 18236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +29E0 +FD20 +36A0 +D840 +31A0 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_473D +ENCODING 18237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +0280 +E440 +ABA0 +BE20 +EAA0 +0EA0 +AAA0 +AEA0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_473E +ENCODING 18238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +07C0 +7280 +5280 +5FE0 +7000 +07C0 +5440 +57C0 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_473F +ENCODING 18239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +51E0 +7D00 +4580 +7E40 +5240 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4740 +ENCODING 18240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +F4E0 +06A0 +F5A0 +9760 +F000 +97E0 +6520 +37E0 +C520 +07E0 +ENDCHAR +STARTCHAR U_4741 +ENCODING 18241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +71C0 +8A20 +FFE0 +8020 +7FC0 +2080 +3F80 +2080 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4742 +ENCODING 18242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +B240 +CDE0 +B240 +9180 +9240 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4743 +ENCODING 18243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +04A0 +F520 +97E0 +9240 +F5A0 +97E0 +6240 +37E0 +CAA0 +0AA0 +ENDCHAR +STARTCHAR U_4744 +ENCODING 18244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +0D40 +F7E0 +9540 +F7E0 +0540 +97E0 +7240 +C180 +0E60 +ENDCHAR +STARTCHAR U_4745 +ENCODING 18245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +2080 +D080 +37E0 +D880 +1080 +3880 +D480 +1080 +67E0 +ENDCHAR +STARTCHAR U_4746 +ENCODING 18246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FC0 +4A40 +3240 +0480 +FFE0 +0880 +7700 +0B80 +7260 +0C00 +ENDCHAR +STARTCHAR U_4747 +ENCODING 18247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4FE0 +8900 +56A0 +51C0 +5680 +51C0 +56A0 +5280 +9120 +8FE0 +ENDCHAR +STARTCHAR U_4748 +ENCODING 18248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +2400 +37E0 +DC00 +35C0 +D540 +3DC0 +D500 +1520 +68E0 +ENDCHAR +STARTCHAR U_4749 +ENCODING 18249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +8020 +7FC0 +0880 +7500 +0E00 +7500 +04C0 +1800 +ENDCHAR +STARTCHAR U_474A +ENCODING 18250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2140 +D7E0 +3140 +D7C0 +3100 +D5C0 +5700 +38E0 +ENDCHAR +STARTCHAR U_474B +ENCODING 18251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2420 +23C0 +D000 +3FE0 +D080 +3AC0 +D2A0 +54A0 +2180 +ENDCHAR +STARTCHAR U_474C +ENCODING 18252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FAA0 +22A0 +2940 +D6A0 +33E0 +DAA0 +36A0 +D140 +52A0 +2CA0 +ENDCHAR +STARTCHAR U_474D +ENCODING 18253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +27C0 +2100 +DFC0 +3540 +D7C0 +3540 +DFE0 +5100 +2100 +ENDCHAR +STARTCHAR U_474E +ENCODING 18254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +23E0 +2000 +D7E0 +3900 +D3E0 +3AA0 +D6A0 +52A0 +2260 +ENDCHAR +STARTCHAR U_474F +ENCODING 18255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2540 +2FE0 +D540 +37C0 +D540 +3FE0 +D440 +5380 +2C60 +ENDCHAR +STARTCHAR U_4750 +ENCODING 18256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +4A80 +4AE0 +BD40 +6AE0 +AAA0 +7AE0 +AEA0 +28E0 +48A0 +ENDCHAR +STARTCHAR U_4751 +ENCODING 18257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +2280 +DFE0 +3540 +D7C0 +3540 +DFC0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_4752 +ENCODING 18258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +FAE0 +2EA0 +4A40 +BF40 +62A0 +AFE0 +7540 +A540 +2BA0 +4100 +ENDCHAR +STARTCHAR U_4753 +ENCODING 18259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +FD40 +22A0 +27E0 +DD20 +36A0 +D7E0 +3D40 +D7C0 +5560 +27A0 +ENDCHAR +STARTCHAR U_4754 +ENCODING 18260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4280 +4EE0 +BAA0 +6EE0 +A7C0 +6C80 +B7C0 +2480 +47E0 +ENDCHAR +STARTCHAR U_4755 +ENCODING 18261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FAC0 +2340 +27E0 +D840 +37E0 +D2A0 +3BE0 +D2A0 +57E0 +20A0 +ENDCHAR +STARTCHAR U_4756 +ENCODING 18262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +2740 +DD40 +3540 +E540 +3540 +D540 +3540 +D540 +5520 +2920 +ENDCHAR +STARTCHAR U_4757 +ENCODING 18263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +6900 +D100 +27E0 +E100 +3380 +D380 +3540 +D920 +5100 +2100 +ENDCHAR +STARTCHAR U_4758 +ENCODING 18264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2240 +D240 +6240 +D420 +33C0 +D240 +3240 +D180 +1240 +2C20 +ENDCHAR +STARTCHAR U_4759 +ENCODING 18265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +27E0 +DC00 +5440 +E640 +3580 +D480 +3540 +D620 +5400 +27E0 +ENDCHAR +STARTCHAR U_475A +ENCODING 18266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +DC40 +57C0 +E500 +3520 +D5C0 +3500 +D520 +5920 +28E0 +ENDCHAR +STARTCHAR U_475B +ENCODING 18267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2080 +DFE0 +54A0 +E480 +37C0 +D540 +3540 +D480 +5940 +2A20 +ENDCHAR +STARTCHAR U_475C +ENCODING 18268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2240 +D7E0 +5240 +E420 +33C0 +D240 +3640 +D180 +5240 +2C20 +ENDCHAR +STARTCHAR U_475D +ENCODING 18269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +27E0 +DA80 +5440 +EFE0 +3040 +D740 +3540 +D740 +5040 +20C0 +ENDCHAR +STARTCHAR U_475E +ENCODING 18270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +2100 +DFE0 +5540 +E780 +34E0 +D400 +35C0 +D540 +5940 +2A60 +ENDCHAR +STARTCHAR U_475F +ENCODING 18271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +27E0 +DAA0 +57A0 +E2A0 +3760 +D100 +37E0 +D180 +5240 +2C20 +ENDCHAR +STARTCHAR U_4760 +ENCODING 18272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5C80 +D5E0 +2520 +E5E0 +3520 +D5E0 +3480 +D6A0 +14A0 +6980 +ENDCHAR +STARTCHAR U_4761 +ENCODING 18273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +6FE0 +D240 +23C0 +E100 +37E0 +D520 +3760 +D5A0 +1760 +6420 +ENDCHAR +STARTCHAR U_4762 +ENCODING 18274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +EC40 +57C0 +2440 +DFE0 +2AA0 +DFE0 +2800 +CFE0 +3240 +2FE0 +ENDCHAR +STARTCHAR U_4763 +ENCODING 18275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +6980 +D6E0 +21A0 +E6E0 +3280 +D7E0 +3180 +D2C0 +1CA0 +3080 +ENDCHAR +STARTCHAR U_4764 +ENCODING 18276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +6FE0 +9540 +6AA0 +C440 +2FE0 +D540 +37C0 +D100 +1540 +6B20 +ENDCHAR +STARTCHAR U_4765 +ENCODING 18277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +B4A0 +67E0 +C080 +26A0 +D080 +36A0 +D080 +17E0 +6080 +ENDCHAR +STARTCHAR U_4766 +ENCODING 18278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +6AA0 +9FE0 +6000 +C1E0 +2F00 +D100 +3540 +D540 +1BA0 +6120 +ENDCHAR +STARTCHAR U_4767 +ENCODING 18279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +F420 +9820 +F7A0 +9020 +F1A0 +4620 +9020 +90C0 +ENDCHAR +STARTCHAR U_4768 +ENCODING 18280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +9240 +9180 +9260 +3F80 +2480 +3280 +2980 +2480 +3F80 +60C0 +ENDCHAR +STARTCHAR U_4769 +ENCODING 18281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +F440 +9920 +F280 +9500 +F240 +4480 +9100 +9600 +ENDCHAR +STARTCHAR U_476A +ENCODING 18282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +F140 +9100 +9500 +F5E0 +9500 +F500 +4500 +9700 +98E0 +ENDCHAR +STARTCHAR U_476B +ENCODING 18283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +F7E0 +9500 +99E0 +F100 +9100 +F1E0 +4100 +9100 +9100 +ENDCHAR +STARTCHAR U_476C +ENCODING 18284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F100 +9100 +F100 +97C0 +F100 +4100 +9100 +9FE0 +ENDCHAR +STARTCHAR U_476D +ENCODING 18285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +F820 +97A0 +F4A0 +94A0 +F7A0 +4020 +9020 +90C0 +ENDCHAR +STARTCHAR U_476E +ENCODING 18286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F100 +9200 +F440 +9780 +F200 +4440 +9FE0 +9420 +ENDCHAR +STARTCHAR U_476F +ENCODING 18287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +F800 +9500 +FFE0 +9520 +F540 +4500 +9420 +93E0 +ENDCHAR +STARTCHAR U_4770 +ENCODING 18288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +F100 +97C0 +F080 +9FE0 +F480 +2280 +5080 +9180 +ENDCHAR +STARTCHAR U_4771 +ENCODING 18289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +2480 +FFE0 +2920 +DFE0 +2080 +3F80 +2080 +3F80 +4040 +ENDCHAR +STARTCHAR U_4772 +ENCODING 18290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +F7C0 +9480 +9440 +F520 +94A0 +F400 +4900 +9080 +9080 +ENDCHAR +STARTCHAR U_4773 +ENCODING 18291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +5120 +7D40 +A480 +1140 +FFA0 +1080 +1F80 +1080 +1F80 +2040 +ENDCHAR +STARTCHAR U_4774 +ENCODING 18292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +0400 +FFE0 +9120 +1F00 +1100 +1F00 +60C0 +ENDCHAR +STARTCHAR U_4775 +ENCODING 18293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F120 +97E0 +F100 +97E0 +F520 +97E0 +F520 +47E0 +9520 +9560 +ENDCHAR +STARTCHAR U_4776 +ENCODING 18294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F000 +97C0 +F440 +97C0 +F100 +4540 +9920 +9300 +ENDCHAR +STARTCHAR U_4777 +ENCODING 18295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +9120 +FFE0 +2420 +5F80 +1080 +1F80 +1080 +1F80 +2040 +ENDCHAR +STARTCHAR U_4778 +ENCODING 18296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +9480 +F100 +9FE0 +F100 +97C0 +F440 +4280 +9100 +9EE0 +ENDCHAR +STARTCHAR U_4779 +ENCODING 18297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +E820 +A400 +AEE0 +EAA0 +AAA0 +F6E0 +0280 +A4A0 +A8E0 +ENDCHAR +STARTCHAR U_477A +ENCODING 18298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4A40 +3180 +DF60 +1100 +1F00 +1100 +1F00 +1100 +2080 +ENDCHAR +STARTCHAR U_477B +ENCODING 18299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +9420 +F7E0 +9480 +F7E0 +9480 +F7E0 +4A20 +9A20 +93E0 +ENDCHAR +STARTCHAR U_477C +ENCODING 18300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +F7C0 +9100 +FFE0 +9440 +F7C0 +4440 +97C0 +9440 +ENDCHAR +STARTCHAR U_477D +ENCODING 18301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9480 +F5E0 +9480 +9480 +F7E0 +9480 +F5E0 +4880 +9880 +97E0 +ENDCHAR +STARTCHAR U_477E +ENCODING 18302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +0240 +FFE0 +5100 +5CA0 +F760 +1100 +1F00 +1100 +1F00 +6080 +ENDCHAR +STARTCHAR U_477F +ENCODING 18303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +35C0 +4440 +75C0 +4440 +75C0 +1B00 +F1E0 +1F00 +1100 +1F80 +6040 +ENDCHAR +STARTCHAR U_4780 +ENCODING 18304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F440 +9FE0 +F480 +9500 +F7E0 +9480 +F7E0 +4480 +9540 +9620 +ENDCHAR +STARTCHAR U_4781 +ENCODING 18305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F5C0 +9540 +95C0 +F540 +97E0 +F540 +45C0 +9520 +97E0 +ENDCHAR +STARTCHAR U_4782 +ENCODING 18306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A200 +EFE0 +AAA0 +AAA0 +EAA0 +A100 +EFE0 +4280 +A440 +A820 +ENDCHAR +STARTCHAR U_4783 +ENCODING 18307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FF80 +A4E0 +EAA0 +BFA0 +E4A0 +BF40 +E440 +4740 +BCA0 +A120 +ENDCHAR +STARTCHAR U_4784 +ENCODING 18308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +4280 +7FE0 +4AA0 +BFC0 +2080 +3F80 +2080 +3F80 +C040 +ENDCHAR +STARTCHAR U_4785 +ENCODING 18309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +95C0 +F400 +97E0 +F540 +95A0 +F800 +47C0 +5440 +97C0 +ENDCHAR +STARTCHAR U_4786 +ENCODING 18310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +F100 +97C0 +9440 +F7C0 +9440 +F7C0 +4440 +57C0 +9820 +ENDCHAR +STARTCHAR U_4787 +ENCODING 18311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1140 +FF40 +55C0 +BF60 +1100 +1F00 +1100 +1F00 +60C0 +ENDCHAR +STARTCHAR U_4788 +ENCODING 18312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9540 +F7C0 +9480 +97C0 +F440 +97E0 +F420 +0560 +AAA0 +9060 +ENDCHAR +STARTCHAR U_4789 +ENCODING 18313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +F100 +9FE0 +9440 +FFE0 +9440 +F7C0 +4440 +57C0 +9820 +ENDCHAR +STARTCHAR U_478A +ENCODING 18314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +A100 +EFE0 +A940 +AFE0 +EA80 +AFE0 +EA40 +6BC0 +9240 +93C0 +ENDCHAR +STARTCHAR U_478B +ENCODING 18315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BFA0 +AAE0 +EAA0 +BFA0 +E4E0 +BFA0 +E4A0 +4EE0 +B4A0 +A520 +ENDCHAR +STARTCHAR U_478C +ENCODING 18316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +8B80 +A880 +A880 +AFE0 +A880 +A880 +23E0 +5220 +4A20 +83E0 +ENDCHAR +STARTCHAR U_478D +ENCODING 18317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +A900 +ABC0 +A900 +AFE0 +A440 +27C0 +5440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_478E +ENCODING 18318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +ABC0 +AA40 +ABC0 +A800 +A7E0 +2420 +57E0 +4C20 +87E0 +ENDCHAR +STARTCHAR U_478F +ENCODING 18319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +AAA0 +ABE0 +AAA0 +ABE0 +A840 +A2A0 +2680 +5A20 +89E0 +ENDCHAR +STARTCHAR U_4790 +ENCODING 18320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +8900 +AFE0 +A900 +AFE0 +AA40 +AF60 +22C0 +5240 +83C0 +ENDCHAR +STARTCHAR U_4791 +ENCODING 18321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7C80 +1080 +FE80 +2880 +6C80 +AA80 +2880 +4880 +9BE0 +ENDCHAR +STARTCHAR U_4792 +ENCODING 18322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7BE0 +1220 +FFA0 +2AA0 +6AA0 +AFA0 +2A20 +4A20 +9A60 +ENDCHAR +STARTCHAR U_4793 +ENCODING 18323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +10A0 +7D40 +1140 +FEA0 +2800 +6DE0 +AA80 +2880 +4880 +9BE0 +ENDCHAR +STARTCHAR U_4794 +ENCODING 18324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7BE0 +1200 +FFE0 +2A80 +6BE0 +AE80 +2BE0 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_4795 +ENCODING 18325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7FE0 +12A0 +FDC0 +2AA0 +6BE0 +AC80 +2BE0 +4AA0 +9AA0 +ENDCHAR +STARTCHAR U_4796 +ENCODING 18326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +7D20 +17E0 +FD00 +1100 +5C80 +50A0 +5060 +B020 +8FE0 +ENDCHAR +STARTCHAR U_4797 +ENCODING 18327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1040 +7BE0 +10C0 +FCC0 +1140 +5940 +5240 +5540 +7080 +8FE0 +ENDCHAR +STARTCHAR U_4798 +ENCODING 18328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +7C00 +13E0 +FC40 +1080 +5D00 +5220 +51E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_4799 +ENCODING 18329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7BE0 +12A0 +FEA0 +12A0 +5EA0 +52E0 +5080 +B080 +8FE0 +ENDCHAR +STARTCHAR U_479A +ENCODING 18330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7FE0 +1080 +FC80 +13E0 +5D40 +5080 +5140 +B220 +8FE0 +ENDCHAR +STARTCHAR U_479B +ENCODING 18331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7EE0 +12A0 +FEA0 +13E0 +5C20 +5020 +50A0 +B040 +8FE0 +ENDCHAR +STARTCHAR U_479C +ENCODING 18332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7C80 +1180 +FD40 +12A0 +5CA0 +5080 +5080 +B080 +8FE0 +ENDCHAR +STARTCHAR U_479D +ENCODING 18333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7C80 +1080 +FFE0 +1080 +5CC0 +50A0 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_479E +ENCODING 18334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +17E0 +7AA0 +17E0 +FA80 +17E0 +5AA0 +52A0 +52C0 +B480 +8FE0 +ENDCHAR +STARTCHAR U_479F +ENCODING 18335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1100 +7BE0 +1220 +FE20 +13E0 +5E20 +5220 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A0 +ENCODING 18336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7C80 +1080 +FD00 +13E0 +5D20 +5120 +51E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A1 +ENCODING 18337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7E40 +13C0 +FE40 +1240 +5BC0 +5000 +57E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A2 +ENCODING 18338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7BE0 +1500 +FDE0 +1100 +5DE0 +5100 +5100 +B100 +8FE0 +ENDCHAR +STARTCHAR U_47A3 +ENCODING 18339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1380 +7E00 +13E0 +FE40 +12C0 +5E60 +5240 +5440 +B840 +8FE0 +ENDCHAR +STARTCHAR U_47A4 +ENCODING 18340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +7C20 +13A0 +FEA0 +12A0 +5BA0 +5020 +50A0 +B040 +8FE0 +ENDCHAR +STARTCHAR U_47A5 +ENCODING 18341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7FE0 +1100 +FBE0 +1520 +5DE0 +5120 +51E0 +B120 +8FE0 +ENDCHAR +STARTCHAR U_47A6 +ENCODING 18342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13E0 +7D40 +1080 +FD40 +1220 +5DC0 +5140 +51C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A7 +ENCODING 18343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +10E0 +7F00 +1200 +FFE0 +1200 +5FE0 +5320 +55E0 +B800 +8FE0 +ENDCHAR +STARTCHAR U_47A8 +ENCODING 18344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7DE0 +1080 +FFE0 +1080 +5DE0 +5080 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47A9 +ENCODING 18345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1180 +7A40 +1420 +FBC0 +1000 +5BC0 +5240 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47AA +ENCODING 18346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1400 +7DE0 +1500 +FDE0 +1540 +5D40 +5640 +57E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47AB +ENCODING 18347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1140 +7FE0 +1140 +FFC0 +1200 +57C0 +5A40 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47AC +ENCODING 18348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1380 +7C80 +13E0 +FDC0 +12A0 +5BE0 +5140 +5160 +B220 +8FE0 +ENDCHAR +STARTCHAR U_47AD +ENCODING 18349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1240 +7FE0 +1240 +FE20 +13C0 +5A40 +5580 +5180 +B240 +8FE0 +ENDCHAR +STARTCHAR U_47AE +ENCODING 18350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1140 +7A20 +17E0 +FC80 +13E0 +5C80 +52C0 +54A0 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47AF +ENCODING 18351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1320 +7AA0 +1140 +FDE0 +1040 +5C80 +53E0 +5080 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47B0 +ENCODING 18352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +FFE0 +1280 +56C0 +5AA0 +5480 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B1 +ENCODING 18353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1240 +7C20 +1180 +FE40 +1420 +5BC0 +5240 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B2 +ENCODING 18354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +16A0 +7A80 +17E0 +FA80 +13A0 +5EA0 +5240 +52C0 +B520 +8FE0 +ENDCHAR +STARTCHAR U_47B3 +ENCODING 18355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17E0 +7A40 +1180 +FFE0 +5000 +5BC0 +5240 +53C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B4 +ENCODING 18356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +12A0 +7BE0 +12A0 +FFE0 +1220 +5BA0 +52A0 +53A0 +B440 +8FE0 +ENDCHAR +STARTCHAR U_47B5 +ENCODING 18357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +7EA0 +1140 +FEA0 +1000 +5FE0 +52A0 +5140 +B2A0 +8FE0 +ENDCHAR +STARTCHAR U_47B6 +ENCODING 18358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +12C0 +7B40 +13C0 +FE00 +13E0 +5560 +5AA0 +5520 +B240 +8FE0 +ENDCHAR +STARTCHAR U_47B7 +ENCODING 18359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7FE0 +1280 +FEA0 +13E0 +5E80 +52A0 +55E0 +B800 +8FE0 +ENDCHAR +STARTCHAR U_47B8 +ENCODING 18360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1000 +7BE0 +1080 +FAA0 +1480 +5BE0 +5220 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47B9 +ENCODING 18361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +11C0 +7D40 +1140 +FFE0 +1080 +5DC0 +5080 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47BA +ENCODING 18362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1480 +7FE0 +1480 +FDE0 +15A0 +5D60 +55A0 +55E0 +B800 +8FE0 +ENDCHAR +STARTCHAR U_47BB +ENCODING 18363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1140 +7FE0 +12A0 +FFE0 +12A0 +5EA0 +53E0 +5120 +B220 +8FE0 +ENDCHAR +STARTCHAR U_47BC +ENCODING 18364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1140 +7B80 +1080 +FFE0 +1220 +5D40 +52C0 +55A0 +B280 +8FE0 +ENDCHAR +STARTCHAR U_47BD +ENCODING 18365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +13E0 +7C80 +17E0 +FAA0 +1140 +5FE0 +5080 +52A0 +B480 +8FE0 +ENDCHAR +STARTCHAR U_47BE +ENCODING 18366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1780 +7CE0 +1480 +FFE0 +14A0 +5FC0 +5480 +5560 +BA40 +8FE0 +ENDCHAR +STARTCHAR U_47BF +ENCODING 18367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +2480 +DF60 +1480 +1D00 +67E0 +ENDCHAR +STARTCHAR U_47C0 +ENCODING 18368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +17E0 +7880 +17E0 +F900 +17E0 +5280 +5C80 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_47C1 +ENCODING 18369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +1540 +7AA0 +13E0 +FEA0 +13E0 +5AA0 +57E0 +51C0 +B2A0 +8FE0 +ENDCHAR +STARTCHAR U_47C2 +ENCODING 18370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7FC0 +1240 +FFE0 +5520 +5FE0 +5240 +5180 +B660 +8FE0 +ENDCHAR +STARTCHAR U_47C3 +ENCODING 18371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +13E0 +7D20 +17E0 +F880 +17E0 +5940 +56A0 +5140 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47C4 +ENCODING 18372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17E0 +7900 +17E0 +FB40 +12C0 +5B40 +52C0 +53C0 +B420 +8FE0 +ENDCHAR +STARTCHAR U_47C5 +ENCODING 18373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5500 +7DE0 +5540 +FE40 +1440 +3F80 +0400 +7FC0 +1400 +EFE0 +ENDCHAR +STARTCHAR U_47C6 +ENCODING 18374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +12A0 +7FE0 +12A0 +FFE0 +12A0 +5FE0 +52A0 +57E0 +B080 +8FE0 +ENDCHAR +STARTCHAR U_47C7 +ENCODING 18375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +15C0 +7AA0 +17E0 +FAA0 +17E0 +5A80 +52A0 +5540 +B8A0 +87E0 +ENDCHAR +STARTCHAR U_47C8 +ENCODING 18376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12C0 +17A0 +7A80 +17E0 +FD80 +17A0 +5AA0 +5740 +5240 +B4A0 +8FE0 +ENDCHAR +STARTCHAR U_47C9 +ENCODING 18377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +12A0 +7FE0 +1200 +FFE0 +1520 +5BA0 +5120 +53A0 +B040 +8FE0 +ENDCHAR +STARTCHAR U_47CA +ENCODING 18378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1080 +7FE0 +12A0 +FFC0 +12A0 +5FE0 +5340 +55C0 +BAA0 +87E0 +ENDCHAR +STARTCHAR U_47CB +ENCODING 18379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +7FE0 +1540 +FFE0 +1400 +5DC0 +5400 +57E0 +B940 +8FE0 +ENDCHAR +STARTCHAR U_47CC +ENCODING 18380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +17E0 +7A40 +17E0 +FD40 +17C0 +5D60 +57C0 +5540 +B5A0 +8FE0 +ENDCHAR +STARTCHAR U_47CD +ENCODING 18381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +7A40 +17E0 +FAA0 +1540 +5FE0 +5100 +53C0 +B440 +8FE0 +ENDCHAR +STARTCHAR U_47CE +ENCODING 18382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +17E0 +7A40 +17E0 +FD20 +13C0 +5B40 +52C0 +53C0 +B420 +8FE0 +ENDCHAR +STARTCHAR U_47CF +ENCODING 18383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2BA0 +FEE0 +27C0 +FAA0 +2FE0 +B900 +A7E0 +E380 +B540 +8FE0 +ENDCHAR +STARTCHAR U_47D0 +ENCODING 18384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +F7E0 +2540 +F760 +2440 +2560 +B540 +ABE0 +F000 +8FE0 +ENDCHAR +STARTCHAR U_47D1 +ENCODING 18385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +F540 +27C0 +2540 +B7C0 +A540 +E000 +9FE0 +ENDCHAR +STARTCHAR U_47D2 +ENCODING 18386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEE0 +2280 +F5E0 +2C80 +25E0 +B480 +A5E0 +E000 +9FE0 +ENDCHAR +STARTCHAR U_47D3 +ENCODING 18387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8880 +8880 +F880 +2080 +2080 +B880 +A080 +A080 +B880 +C380 +ENDCHAR +STARTCHAR U_47D4 +ENCODING 18388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FA00 +8A00 +8A00 +FA00 +2300 +2280 +BA40 +A240 +A200 +BA00 +C200 +ENDCHAR +STARTCHAR U_47D5 +ENCODING 18389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +8FE0 +8A20 +FD20 +2440 +2280 +BA80 +A100 +A280 +B440 +C820 +ENDCHAR +STARTCHAR U_47D6 +ENCODING 18390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8900 +FD20 +2520 +2520 +BD20 +A520 +A520 +BFE0 +C420 +ENDCHAR +STARTCHAR U_47D7 +ENCODING 18391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9780 +9480 +F480 +27E0 +2480 +B480 +A480 +A4A0 +B660 +C420 +ENDCHAR +STARTCHAR U_47D8 +ENCODING 18392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8900 +8FE0 +F800 +2380 +2280 +BAA0 +A2A0 +A2A0 +BAA0 +C460 +ENDCHAR +STARTCHAR U_47D9 +ENCODING 18393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F5E0 +94A0 +9EA0 +F4A0 +24A0 +B4A0 +A4A0 +A6A0 +B520 +C260 +ENDCHAR +STARTCHAR U_47DA +ENCODING 18394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8800 +8800 +FFE0 +2240 +2240 +BA40 +A240 +A240 +BA40 +C440 +ENDCHAR +STARTCHAR U_47DB +ENCODING 18395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +FFE0 +2920 +B920 +A920 +A920 +B940 +C100 +ENDCHAR +STARTCHAR U_47DC +ENCODING 18396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8FE0 +FD20 +2520 +2520 +BEA0 +A460 +A420 +BC20 +C460 +ENDCHAR +STARTCHAR U_47DD +ENCODING 18397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F240 +9240 +9240 +F460 +2BC0 +B240 +A180 +A180 +B240 +C420 +ENDCHAR +STARTCHAR U_47DE +ENCODING 18398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8900 +F940 +2520 +2520 +B900 +A120 +A040 +B980 +C600 +ENDCHAR +STARTCHAR U_47DF +ENCODING 18399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +6220 +4220 +7A20 +53E0 +5080 +5080 +5AE0 +5280 +5780 +9860 +ENDCHAR +STARTCHAR U_47E0 +ENCODING 18400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +88A0 +8880 +FFE0 +2480 +24A0 +BCC0 +A480 +A4A0 +BD60 +C620 +ENDCHAR +STARTCHAR U_47E1 +ENCODING 18401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +9780 +9480 +F480 +27E0 +2480 +B480 +A4A0 +A560 +B6A0 +C4A0 +ENDCHAR +STARTCHAR U_47E2 +ENCODING 18402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +93E0 +F500 +2100 +2540 +B540 +A920 +A120 +B100 +C300 +ENDCHAR +STARTCHAR U_47E3 +ENCODING 18403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8900 +8FE0 +F900 +2180 +2380 +BB40 +A540 +A520 +B920 +C100 +ENDCHAR +STARTCHAR U_47E4 +ENCODING 18404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +88A0 +8A20 +FA40 +2240 +2680 +BB20 +A220 +A600 +BA20 +C1C0 +ENDCHAR +STARTCHAR U_47E5 +ENCODING 18405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +8880 +8A80 +F900 +27E0 +2120 +BB40 +A300 +A500 +B900 +C300 +ENDCHAR +STARTCHAR U_47E6 +ENCODING 18406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +F700 +9100 +9FE0 +F100 +2100 +B3E0 +A2A0 +A2A0 +B440 +C9A0 +ENDCHAR +STARTCHAR U_47E7 +ENCODING 18407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +97E0 +9520 +F520 +2520 +27E0 +B520 +A520 +A520 +B7E0 +C420 +ENDCHAR +STARTCHAR U_47E8 +ENCODING 18408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +9420 +F7E0 +2480 +27E0 +B480 +A4A0 +A4A0 +B660 +C420 +ENDCHAR +STARTCHAR U_47E9 +ENCODING 18409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +8FC0 +F900 +2100 +27E0 +B900 +A200 +A440 +BFA0 +C420 +ENDCHAR +STARTCHAR U_47EA +ENCODING 18410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +8F00 +8900 +F880 +27E0 +2040 +B880 +A100 +A200 +B600 +C9E0 +ENDCHAR +STARTCHAR U_47EB +ENCODING 18411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FE0 +8020 +3F80 +2080 +3F80 +0400 +27C0 +3C00 +C7E0 +ENDCHAR +STARTCHAR U_47EC +ENCODING 18412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +91C0 +9600 +F400 +27C0 +2480 +B480 +A480 +A480 +B480 +CFE0 +ENDCHAR +STARTCHAR U_47ED +ENCODING 18413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8A00 +8BE0 +FD00 +2100 +21E0 +B900 +A100 +A1E0 +B900 +C100 +ENDCHAR +STARTCHAR U_47EE +ENCODING 18414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F2C0 +92A0 +9480 +F7E0 +2C80 +B480 +A540 +A540 +B640 +C620 +ENDCHAR +STARTCHAR U_47EF +ENCODING 18415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +8F00 +8900 +F900 +27E0 +2100 +B900 +A7C0 +A440 +BC40 +C7C0 +ENDCHAR +STARTCHAR U_47F0 +ENCODING 18416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +92E0 +9500 +F200 +27E0 +2A40 +B240 +A240 +A240 +B240 +C2C0 +ENDCHAR +STARTCHAR U_47F1 +ENCODING 18417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9100 +F7E0 +2520 +2560 +B100 +A380 +A540 +B920 +C100 +ENDCHAR +STARTCHAR U_47F2 +ENCODING 18418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +9100 +F240 +27E0 +22A0 +B280 +A280 +A2A0 +B2A0 +C4E0 +ENDCHAR +STARTCHAR U_47F3 +ENCODING 18419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4DA0 +7B60 +1360 +5DA0 +5120 +55A0 +7240 +9000 +8FE0 +ENDCHAR +STARTCHAR U_47F4 +ENCODING 18420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +95C0 +F400 +27E0 +2540 +B560 +A540 +A540 +B5A0 +C520 +ENDCHAR +STARTCHAR U_47F5 +ENCODING 18421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9120 +9FE0 +F100 +2920 +2540 +B380 +A540 +A920 +B100 +C300 +ENDCHAR +STARTCHAR U_47F6 +ENCODING 18422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9540 +9540 +F540 +2BA0 +2100 +B7C0 +A100 +A100 +B900 +C7E0 +ENDCHAR +STARTCHAR U_47F7 +ENCODING 18423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F460 +9580 +9F00 +F5E0 +2540 +2740 +B540 +AD40 +A540 +B640 +CA40 +ENDCHAR +STARTCHAR U_47F8 +ENCODING 18424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93E0 +9540 +FA80 +2300 +2C80 +B280 +A7E0 +A280 +B280 +C480 +ENDCHAR +STARTCHAR U_47F9 +ENCODING 18425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9700 +9020 +F540 +2280 +27E0 +B080 +A480 +A280 +B080 +C180 +ENDCHAR +STARTCHAR U_47FA +ENCODING 18426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +8BE0 +FA20 +23E0 +2220 +BBE0 +A000 +A140 +B940 +C220 +ENDCHAR +STARTCHAR U_47FB +ENCODING 18427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +FBA0 +2100 +27C0 +B100 +A540 +A920 +B100 +C300 +ENDCHAR +STARTCHAR U_47FC +ENCODING 18428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +9760 +9040 +F7E0 +2040 +2140 +B5C0 +A540 +A540 +B5E0 +CE20 +ENDCHAR +STARTCHAR U_47FD +ENCODING 18429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F200 +2440 +2FE0 +B560 +A540 +A540 +B540 +C960 +ENDCHAR +STARTCHAR U_47FE +ENCODING 18430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9120 +95A0 +F240 +25A0 +2000 +B7E0 +A120 +A5A0 +B240 +C5A0 +ENDCHAR +STARTCHAR U_47FF +ENCODING 18431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +97C0 +F040 +2FE0 +2100 +B540 +A380 +A540 +B120 +C600 +ENDCHAR +STARTCHAR U_4800 +ENCODING 18432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +9380 +9100 +FFE0 +2820 +3BA0 +AAA0 +ABA0 +B820 +C860 +ENDCHAR +STARTCHAR U_4801 +ENCODING 18433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +F240 +97E0 +9240 +F5A0 +2FE0 +3800 +A7C0 +A000 +B000 +CFE0 +ENDCHAR +STARTCHAR U_4802 +ENCODING 18434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +A480 +1F00 +1100 +5F00 +4400 +6700 +9FE0 +ENDCHAR +STARTCHAR U_4803 +ENCODING 18435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9100 +9FE0 +F920 +2DA0 +2B60 +BB60 +ADA0 +B920 +C960 +ENDCHAR +STARTCHAR U_4804 +ENCODING 18436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +97C0 +9540 +F7C0 +2540 +3FE0 +A000 +A480 +F440 +8840 +ENDCHAR +STARTCHAR U_4805 +ENCODING 18437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +94A0 +9720 +F520 +27E0 +A520 +BDA0 +A760 +A520 +FD20 +87E0 +ENDCHAR +STARTCHAR U_4806 +ENCODING 18438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +97C0 +F400 +2FE0 +A500 +BD20 +A540 +AC80 +F440 +0620 +ENDCHAR +STARTCHAR U_4807 +ENCODING 18439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F480 +26A0 +A6A0 +B7E0 +A480 +A6A0 +FAA0 +8BE0 +ENDCHAR +STARTCHAR U_4808 +ENCODING 18440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9140 +FFE0 +2140 +A7C0 +B920 +A540 +AB80 +B540 +C920 +ENDCHAR +STARTCHAR U_4809 +ENCODING 18441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +F7E0 +9820 +97C0 +F440 +27C0 +3400 +A7C0 +B440 +C7C0 +ENDCHAR +STARTCHAR U_480A +ENCODING 18442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9EE0 +9280 +F280 +2EE0 +B280 +A280 +AEE0 +F280 +8480 +ENDCHAR +STARTCHAR U_480B +ENCODING 18443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +97C0 +F540 +27C0 +B200 +A500 +AFE0 +B100 +C100 +ENDCHAR +STARTCHAR U_480C +ENCODING 18444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9380 +9540 +FB20 +27C0 +2440 +B7C0 +A440 +A7C0 +BC40 +C4C0 +ENDCHAR +STARTCHAR U_480D +ENCODING 18445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9520 +9520 +F7E0 +2400 +27E0 +B4A0 +A740 +A440 +F7A0 +8520 +ENDCHAR +STARTCHAR U_480E +ENCODING 18446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F400 +27E0 +2540 +B7E0 +A480 +A5C0 +F480 +8BE0 +ENDCHAR +STARTCHAR U_480F +ENCODING 18447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +92C0 +96A0 +92C0 +F440 +2BA0 +B100 +AFE0 +A280 +B440 +C820 +ENDCHAR +STARTCHAR U_4810 +ENCODING 18448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +27C0 +2440 +B7C0 +A120 +A7E0 +B280 +E440 +ENDCHAR +STARTCHAR U_4811 +ENCODING 18449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +A540 +EFE0 +2100 +2FE0 +B100 +A7C0 +B100 +CFE0 +ENDCHAR +STARTCHAR U_4812 +ENCODING 18450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +A4E0 +A4A0 +FFA0 +24E0 +2EA0 +BAA0 +AAE0 +AEA0 +B0A0 +C120 +ENDCHAR +STARTCHAR U_4813 +ENCODING 18451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9280 +FFE0 +2AA0 +2EE0 +B820 +ABA0 +B820 +CFE0 +ENDCHAR +STARTCHAR U_4814 +ENCODING 18452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +9FE0 +F100 +2320 +25C0 +B280 +A580 +A2C0 +B4A0 +CB20 +ENDCHAR +STARTCHAR U_4815 +ENCODING 18453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +E240 +AB60 +AA40 +EF60 +2100 +B7C0 +A100 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_4816 +ENCODING 18454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EBE0 +A220 +E480 +2880 +2B60 +B000 +A7E0 +A420 +B420 +C7E0 +ENDCHAR +STARTCHAR U_4817 +ENCODING 18455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9540 +96C0 +F540 +27C0 +B120 +AFE0 +A280 +B440 +C820 +ENDCHAR +STARTCHAR U_4818 +ENCODING 18456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9660 +95A0 +F5A0 +2660 +B7E0 +A480 +A6E0 +B480 +C6E0 +ENDCHAR +STARTCHAR U_4819 +ENCODING 18457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A280 +EFE0 +2920 +B7C0 +A200 +A3C0 +BA40 +C440 +ENDCHAR +STARTCHAR U_481A +ENCODING 18458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A280 +EC60 +2380 +B540 +A540 +A540 +B520 +CBA0 +ENDCHAR +STARTCHAR U_481B +ENCODING 18459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0200 +E7C0 +AA80 +A100 +EA00 +27C0 +B900 +A7C0 +A100 +B540 +C7C0 +ENDCHAR +STARTCHAR U_481C +ENCODING 18460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FEE0 +9440 +9FE0 +F240 +23C0 +B240 +A3C0 +A240 +B7E0 +C040 +ENDCHAR +STARTCHAR U_481D +ENCODING 18461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9240 +97E0 +F420 +27E0 +2420 +B7E0 +A420 +A7E0 +B240 +C420 +ENDCHAR +STARTCHAR U_481E +ENCODING 18462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +E080 +AFE0 +AA80 +EB80 +2AA0 +BFA0 +AA40 +AF40 +BA40 +D0A0 +ENDCHAR +STARTCHAR U_481F +ENCODING 18463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +23C0 +F940 +5340 +F9C0 +2260 +7F80 +2080 +3F80 +4900 +BFE0 +ENDCHAR +STARTCHAR U_4820 +ENCODING 18464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FFE0 +4A40 +FFE0 +8420 +3F80 +3580 +2A80 +3FC0 +4400 +BFE0 +ENDCHAR +STARTCHAR U_4821 +ENCODING 18465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +E080 +AFE0 +A900 +EBC0 +29C0 +B800 +ABC0 +AAC0 +BB40 +D7E0 +ENDCHAR +STARTCHAR U_4822 +ENCODING 18466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +5140 +7FC0 +0000 +FFE0 +8020 +3F80 +2080 +3FC0 +4400 +BFE0 +ENDCHAR +STARTCHAR U_4823 +ENCODING 18467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +E880 +2EE0 +2280 +BFE0 +A280 +AFE0 +B240 +C420 +ENDCHAR +STARTCHAR U_4824 +ENCODING 18468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +E000 +27C0 +26C0 +B540 +A7C0 +A100 +BFE0 +C100 +ENDCHAR +STARTCHAR U_4825 +ENCODING 18469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +B540 +AE80 +E4E0 +5F20 +55A0 +F5A0 +DF40 +D540 +F540 +95A0 +ENDCHAR +STARTCHAR U_4826 +ENCODING 18470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +B2A0 +AFA0 +E2E0 +2500 +B7C0 +A440 +A7C0 +B440 +C7C0 +ENDCHAR +STARTCHAR U_4827 +ENCODING 18471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F480 +25C0 +24A0 +B7E0 +A520 +A7E0 +B520 +C9E0 +ENDCHAR +STARTCHAR U_4828 +ENCODING 18472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E3C0 +A480 +AFE0 +E540 +27E0 +2400 +B5E0 +A400 +A5E0 +B520 +C9E0 +ENDCHAR +STARTCHAR U_4829 +ENCODING 18473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AFE0 +A080 +EFE0 +2880 +2FA0 +BAA0 +AE40 +AB40 +AA40 +D4A0 +ENDCHAR +STARTCHAR U_482A +ENCODING 18474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EA40 +ADA0 +AA40 +EDA0 +2FE0 +BA40 +ADA0 +AA40 +BDA0 +CFE0 +ENDCHAR +STARTCHAR U_482B +ENCODING 18475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF00 +A5E0 +A7A0 +E540 +2740 +2DA0 +B000 +AFE0 +A520 +A940 +D5A0 +ENDCHAR +STARTCHAR U_482C +ENCODING 18476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DD60 +AAA0 +BBA0 +EAC0 +31A0 +2EA0 +B0A0 +AEA0 +AAC0 +B580 +CE80 +ENDCHAR +STARTCHAR U_482D +ENCODING 18477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +AF20 +A4E0 +EEA0 +2AE0 +2EA0 +B4E0 +AEA0 +B5E0 +A4A0 +C520 +ENDCHAR +STARTCHAR U_482E +ENCODING 18478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AFE0 +A200 +EFE0 +2480 +AFE0 +BD40 +AA80 +AFE0 +D020 +AAA0 +ENDCHAR +STARTCHAR U_482F +ENCODING 18479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +AB40 +E000 +2FE0 +2AA0 +B540 +AFE0 +AAA0 +BFE0 +CAA0 +ENDCHAR +STARTCHAR U_4830 +ENCODING 18480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +97C0 +F540 +26C0 +23E0 +BC80 +A7E0 +B480 +C7E0 +ENDCHAR +STARTCHAR U_4831 +ENCODING 18481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F540 +27E0 +24A0 +B7E0 +A520 +B7E0 +E520 +8BC0 +ENDCHAR +STARTCHAR U_4832 +ENCODING 18482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7280 +5440 +7820 +5380 +7000 +57C0 +F040 +5280 +9100 +3100 +ENDCHAR +STARTCHAR U_4833 +ENCODING 18483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7520 +5520 +7520 +57E0 +7100 +5520 +F520 +5520 +97E0 +3420 +ENDCHAR +STARTCHAR U_4834 +ENCODING 18484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7080 +57E0 +7000 +5420 +7420 +5220 +F240 +5240 +9000 +37E0 +ENDCHAR +STARTCHAR U_4835 +ENCODING 18485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7240 +5440 +77E0 +5440 +7E40 +5540 +F440 +5440 +9440 +34C0 +ENDCHAR +STARTCHAR U_4836 +ENCODING 18486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7200 +53E0 +7480 +5880 +77E0 +5880 +F140 +3140 +5220 +B420 +ENDCHAR +STARTCHAR U_4837 +ENCODING 18487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7280 +5AA0 +76C0 +5280 +72C0 +56A0 +FA80 +32A0 +52A0 +B4E0 +ENDCHAR +STARTCHAR U_4838 +ENCODING 18488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5280 +7440 +5BA0 +7000 +57C0 +F200 +57C0 +9040 +3180 +ENDCHAR +STARTCHAR U_4839 +ENCODING 18489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FE0 +4900 +7A00 +4A40 +7980 +4920 +FE40 +2880 +4940 +9E20 +ENDCHAR +STARTCHAR U_483A +ENCODING 18490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +E3E0 +A820 +E820 +ABA0 +EAA0 +BAA0 +EBA0 +6AA0 +A820 +6860 +ENDCHAR +STARTCHAR U_483B +ENCODING 18491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5AA0 +7440 +57C0 +7040 +53C0 +F400 +57E0 +9020 +33C0 +ENDCHAR +STARTCHAR U_483C +ENCODING 18492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E280 +A440 +FBA0 +AE20 +EAA0 +BEA0 +EAA0 +6EA0 +AA20 +6A60 +ENDCHAR +STARTCHAR U_483D +ENCODING 18493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7540 +57C0 +7000 +5FE0 +7000 +57C0 +D440 +37C0 +5280 +9FE0 +ENDCHAR +STARTCHAR U_483E +ENCODING 18494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +EAA0 +AEE0 +EAA0 +AEE0 +E920 +B920 +EAA0 +6C60 +A820 +6860 +ENDCHAR +STARTCHAR U_483F +ENCODING 18495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77C0 +5540 +77C0 +5100 +7FE0 +5440 +F7C0 +5440 +97C0 +3820 +ENDCHAR +STARTCHAR U_4840 +ENCODING 18496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +A000 +EFE0 +A920 +EAA0 +AFE0 +F440 +27C0 +6440 +AFE0 +ENDCHAR +STARTCHAR U_4841 +ENCODING 18497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +DF80 +AAE0 +FF20 +A0E0 +EE80 +AAE0 +EE80 +3AE0 +6E80 +AAE0 +ENDCHAR +STARTCHAR U_4842 +ENCODING 18498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +FA40 +2240 +FA40 +AA40 +FA40 +AA40 +FBC0 +2040 +F840 +2040 +ENDCHAR +STARTCHAR U_4843 +ENCODING 18499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F900 +2100 +FBE0 +A920 +F920 +A920 +F920 +2220 +FA20 +24C0 +ENDCHAR +STARTCHAR U_4844 +ENCODING 18500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FB80 +2280 +FA80 +AA80 +FA80 +AA80 +FA80 +22A0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4845 +ENCODING 18501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +FA20 +22A0 +FAA0 +AAA0 +FAA0 +AAA0 +FAA0 +22A0 +FA20 +2420 +ENDCHAR +STARTCHAR U_4846 +ENCODING 18502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F940 +2140 +F940 +AA20 +FAA0 +AC80 +F900 +2240 +FBE0 +2020 +ENDCHAR +STARTCHAR U_4847 +ENCODING 18503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2000 +F800 +AFE0 +FA80 +AA80 +FA80 +2280 +FC80 +2460 +ENDCHAR +STARTCHAR U_4848 +ENCODING 18504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +F940 +2080 +F940 +AA20 +F800 +AA20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_4849 +ENCODING 18505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +F800 +ABC0 +FA40 +AA40 +FA40 +2240 +FA40 +2420 +ENDCHAR +STARTCHAR U_484A +ENCODING 18506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2200 +FA00 +ABE0 +FAA0 +AAA0 +FAA0 +2240 +FCA0 +2920 +ENDCHAR +STARTCHAR U_484B +ENCODING 18507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +A880 +FBE0 +AA20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_484C +ENCODING 18508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +27E0 +F900 +A940 +FA40 +AA80 +FC80 +2120 +FBE0 +2020 +ENDCHAR +STARTCHAR U_484D +ENCODING 18509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +A880 +FBE0 +A880 +F940 +2140 +FA20 +2220 +ENDCHAR +STARTCHAR U_484E +ENCODING 18510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2200 +FBE0 +AA20 +FA20 +ABE0 +FA00 +2200 +FC00 +2400 +ENDCHAR +STARTCHAR U_484F +ENCODING 18511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +F940 +2140 +FB40 +AC40 +F840 +AE40 +FAA0 +22A0 +FBE0 +2620 +ENDCHAR +STARTCHAR U_4850 +ENCODING 18512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +23E0 +FA20 +A800 +F900 +A920 +F9C0 +2100 +F920 +20E0 +ENDCHAR +STARTCHAR U_4851 +ENCODING 18513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2220 +FA20 +ABE0 +FA80 +AA80 +FBE0 +2280 +FA40 +2320 +ENDCHAR +STARTCHAR U_4852 +ENCODING 18514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +22A0 +FAA0 +AAA0 +FBE0 +AAA0 +FAA0 +22A0 +FBE0 +2000 +ENDCHAR +STARTCHAR U_4853 +ENCODING 18515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3F60 +4400 +9F00 +35E0 +5F40 +D540 +5F40 +4440 +5F40 +44C0 +ENDCHAR +STARTCHAR U_4854 +ENCODING 18516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBC0 +2440 +FA80 +A900 +FA80 +A9E0 +FA20 +2140 +F880 +2300 +ENDCHAR +STARTCHAR U_4855 +ENCODING 18517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F840 +2080 +F8A0 +AEC0 +FAA0 +AAA0 +FAA0 +2480 +F800 +23E0 +ENDCHAR +STARTCHAR U_4856 +ENCODING 18518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F800 +2140 +FA20 +AC80 +F880 +ABE0 +F880 +2080 +F880 +23E0 +ENDCHAR +STARTCHAR U_4857 +ENCODING 18519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2240 +3740 +C260 +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4858 +ENCODING 18520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2420 +F820 +AFA0 +FAA0 +AFA0 +FAA0 +27A0 +F820 +2040 +ENDCHAR +STARTCHAR U_4859 +ENCODING 18521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2220 +FBE0 +AA20 +FBE0 +AA80 +FAA0 +2240 +FA40 +2320 +ENDCHAR +STARTCHAR U_485A +ENCODING 18522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F900 +23E0 +FA20 +ABE0 +FA20 +ABE0 +F940 +2140 +FA40 +2460 +ENDCHAR +STARTCHAR U_485B +ENCODING 18523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_485C +ENCODING 18524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +A940 +FA40 +AC60 +F880 +23E0 +F880 +23E0 +ENDCHAR +STARTCHAR U_485D +ENCODING 18525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2420 +FA00 +ABE0 +FAA0 +A8A0 +FAA0 +2140 +FA40 +2460 +ENDCHAR +STARTCHAR U_485E +ENCODING 18526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +FFE0 +2480 +7FC0 +9520 +1F00 +1500 +7FC0 +0400 +ENDCHAR +STARTCHAR U_485F +ENCODING 18527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F900 +23E0 +FAA0 +ABE0 +FAA0 +ABE0 +F940 +2240 +FBE0 +2040 +ENDCHAR +STARTCHAR U_4860 +ENCODING 18528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +F880 +23E0 +FA20 +ABE0 +FA20 +ABE0 +FA20 +23E0 +F940 +2220 +ENDCHAR +STARTCHAR U_4861 +ENCODING 18529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FBE0 +2280 +FBA0 +AA60 +F900 +ABE0 +FA20 +23E0 +FA20 +23E0 +ENDCHAR +STARTCHAR U_4862 +ENCODING 18530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FA00 +23E0 +FA20 +ABE0 +FA00 +ABE0 +FAA0 +23E0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_4863 +ENCODING 18531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_4864 +ENCODING 18532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +3F40 +0480 +FFE0 +3480 +5280 +FFE0 +4E40 +5540 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4865 +ENCODING 18533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2440 +FA80 +AC40 +F980 +AA40 +FFE0 +2240 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4866 +ENCODING 18534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F940 +2080 +FFE0 +AAA0 +FB40 +ACA0 +F880 +27E0 +FAC0 +24A0 +ENDCHAR +STARTCHAR U_4867 +ENCODING 18535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2220 +FBE0 +AA00 +FBE0 +AA00 +FBE0 +2020 +FAA0 +2060 +ENDCHAR +STARTCHAR U_4868 +ENCODING 18536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +0400 +7FC0 +2200 +5FC0 +8400 +FFE0 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4869 +ENCODING 18537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AA20 +FBA0 +AAE0 +FA20 +27E0 +F940 +2220 +ENDCHAR +STARTCHAR U_486A +ENCODING 18538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FA00 +23E0 +FA20 +ABE0 +FA00 +ABE0 +FAA0 +23E0 +FAA0 +25E0 +ENDCHAR +STARTCHAR U_486B +ENCODING 18539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FD20 +22A0 +FE40 +AAA0 +FB40 +AAE0 +FA40 +22E0 +FA40 +25E0 +ENDCHAR +STARTCHAR U_486C +ENCODING 18540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +AFE0 +FAA0 +AFE0 +FBC0 +2240 +F980 +2660 +ENDCHAR +STARTCHAR U_486D +ENCODING 18541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FFE0 +2080 +FBE0 +A880 +FFE0 +ABC0 +FD40 +27C0 +F940 +27E0 +ENDCHAR +STARTCHAR U_486E +ENCODING 18542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +24A0 +F940 +AA00 +FA40 +AEC0 +FAE0 +22C0 +FAC0 +2360 +ENDCHAR +STARTCHAR U_486F +ENCODING 18543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +26A0 +FD60 +ACA0 +FFE0 +A900 +FAA0 +2620 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4870 +ENCODING 18544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1220 +7DC0 +5540 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4871 +ENCODING 18545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +22E0 +FAA0 +AAE0 +FA00 +ABE0 +FAA0 +23E0 +FE00 +23E0 +ENDCHAR +STARTCHAR U_4872 +ENCODING 18546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +23E0 +F800 +ABE0 +FAA0 +ABE0 +FAA0 +27E0 +F880 +2080 +ENDCHAR +STARTCHAR U_4873 +ENCODING 18547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FAA0 +27C0 +FA80 +ABE0 +FAA0 +ABA0 +FAA0 +27A0 +FAA0 +24A0 +ENDCHAR +STARTCHAR U_4874 +ENCODING 18548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2140 +FFE0 +A800 +FBE0 +AAE0 +FBA0 +27E0 +F880 +27E0 +ENDCHAR +STARTCHAR U_4875 +ENCODING 18549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +FBE0 +2680 +FAC0 +AB60 +FEC0 +AB60 +FAC0 +2340 +FAC0 +25E0 +ENDCHAR +STARTCHAR U_4876 +ENCODING 18550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +FDE0 +2500 +FDA0 +AF40 +FCE0 +AF40 +FDE0 +2540 +FD40 +2F40 +ENDCHAR +STARTCHAR U_4877 +ENCODING 18551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +F880 +ABE0 +F880 +AFE0 +FA00 +27E0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_4878 +ENCODING 18552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +2140 +FBE0 +AAA0 +FBE0 +A880 +FBE0 +22A0 +FA40 +23A0 +ENDCHAR +STARTCHAR U_4879 +ENCODING 18553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FFE0 +ABE0 +FAA0 +ABE0 +F880 +22C0 +FA80 +25E0 +ENDCHAR +STARTCHAR U_487A +ENCODING 18554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FBC0 +A840 +FFE0 +A840 +FBC0 +2080 +FB60 +25C0 +ENDCHAR +STARTCHAR U_487B +ENCODING 18555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FBC0 +AA40 +FFE0 +AD40 +FA20 +27C0 +FA40 +24C0 +ENDCHAR +STARTCHAR U_487C +ENCODING 18556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +27E0 +FCA0 +AAA0 +F940 +AA20 +FFE0 +25A0 +FDA0 +27E0 +ENDCHAR +STARTCHAR U_487D +ENCODING 18557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +AA40 +FDA0 +ABC0 +FA40 +23C0 +FA40 +2660 +ENDCHAR +STARTCHAR U_487E +ENCODING 18558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFC0 +2A60 +FF40 +AAE0 +FF40 +A940 +FF40 +2B60 +FDA0 +2B20 +ENDCHAR +STARTCHAR U_487F +ENCODING 18559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F100 +2FE0 +F920 +AFE0 +FAA0 +AFE0 +FD40 +2BA0 +F100 +2FE0 +ENDCHAR +STARTCHAR U_4880 +ENCODING 18560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F200 +47E0 +A800 +A7C0 +F040 +2080 +3100 +6200 +A420 +27E0 +ENDCHAR +STARTCHAR U_4881 +ENCODING 18561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +F7C0 +4440 +A440 +A740 +F440 +2740 +3440 +6440 +A9C0 +3080 +ENDCHAR +STARTCHAR U_4882 +ENCODING 18562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F100 +4FE0 +8000 +A440 +F440 +2280 +3280 +6100 +AFE0 +2000 +ENDCHAR +STARTCHAR U_4883 +ENCODING 18563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +7A80 +47E0 +B900 +AFE0 +3940 +0080 +0900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_4884 +ENCODING 18564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F7E0 +0280 +F7E0 +9100 +F7E0 +2100 +FFE0 +2100 +7380 +AD60 +ENDCHAR +STARTCHAR U_4885 +ENCODING 18565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4040 +7BC0 +4040 +7FE0 +4000 +5FC0 +4000 +7FE0 +5240 +99E0 +ENDCHAR +STARTCHAR U_4886 +ENCODING 18566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +8DC0 +7400 +57E0 +5540 +55A0 +5440 +5FE0 +9540 +88C0 +ENDCHAR +STARTCHAR U_4887 +ENCODING 18567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +FDC0 +8400 +7FE0 +55A0 +5540 +5520 +57E0 +9940 +88C0 +ENDCHAR +STARTCHAR U_4888 +ENCODING 18568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7FC0 +5280 +91C0 +1F00 +F5E0 +2E80 +3F80 +1500 +1F00 +ENDCHAR +STARTCHAR U_4889 +ENCODING 18569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +5F40 +7BC0 +5540 +7FC0 +4000 +7FC0 +4000 +7FE0 +5280 +99C0 +ENDCHAR +STARTCHAR U_488A +ENCODING 18570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2040 +2080 +07E0 +F080 +2080 +2080 +2280 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_488B +ENCODING 18571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +2FE0 +0240 +F240 +2240 +2240 +2440 +2840 +5000 +8FE0 +ENDCHAR +STARTCHAR U_488C +ENCODING 18572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0100 +F7C0 +2540 +2540 +2540 +25C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_488D +ENCODING 18573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0200 +F3C0 +2240 +2440 +2840 +2180 +5800 +87E0 +ENDCHAR +STARTCHAR U_488E +ENCODING 18574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +2280 +0280 +F7E0 +2280 +2280 +2480 +2880 +5C00 +83E0 +ENDCHAR +STARTCHAR U_488F +ENCODING 18575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +2280 +0180 +F480 +22E0 +2F80 +2080 +2080 +3080 +CFE0 +ENDCHAR +STARTCHAR U_4890 +ENCODING 18576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +8880 +4880 +0F80 +C880 +4F80 +4880 +4880 +5FE0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_4891 +ENCODING 18577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2680 +2480 +07E0 +F480 +2480 +24A0 +2560 +26A0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_4892 +ENCODING 18578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0440 +EC60 +2280 +2100 +2280 +2460 +5000 +8FE0 +ENDCHAR +STARTCHAR U_4893 +ENCODING 18579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2820 +07C0 +F100 +2FE0 +2100 +2100 +2300 +5800 +87E0 +ENDCHAR +STARTCHAR U_4894 +ENCODING 18580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +2440 +0BA0 +E000 +27C0 +2440 +2440 +27C0 +5800 +87E0 +ENDCHAR +STARTCHAR U_4895 +ENCODING 18581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +27E0 +0480 +F780 +24A0 +24C0 +24E0 +2B20 +5800 +87E0 +ENDCHAR +STARTCHAR U_4896 +ENCODING 18582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2140 +0FE0 +F140 +27C0 +2100 +2FE0 +2100 +5900 +87E0 +ENDCHAR +STARTCHAR U_4897 +ENCODING 18583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +2FE0 +0AA0 +FAA0 +2FE0 +2AA0 +2AA0 +2FE0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_4898 +ENCODING 18584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +28A0 +0080 +F7C0 +2880 +2480 +2080 +2180 +5800 +87E0 +ENDCHAR +STARTCHAR U_4899 +ENCODING 18585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +2440 +07C0 +F440 +27C0 +2440 +27C0 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_489A +ENCODING 18586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +27C0 +0540 +F7C0 +2540 +27C0 +2500 +2380 +5C60 +87E0 +ENDCHAR +STARTCHAR U_489B +ENCODING 18587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +2AA0 +0C60 +FBA0 +2AA0 +2AA0 +2BA0 +2860 +7800 +87E0 +ENDCHAR +STARTCHAR U_489C +ENCODING 18588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +27C0 +0040 +FFE0 +2920 +27C0 +2540 +25C0 +3900 +C7E0 +ENDCHAR +STARTCHAR U_489D +ENCODING 18589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +2280 +0EE0 +E820 +2EE0 +2280 +2280 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_489E +ENCODING 18590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +3FE0 +0480 +F480 +2DC0 +36A0 +2480 +2480 +5800 +87E0 +ENDCHAR +STARTCHAR U_489F +ENCODING 18591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +3EE0 +09A0 +EEA0 +2AA0 +2A40 +2AA0 +3520 +5000 +8FE0 +ENDCHAR +STARTCHAR U_48A0 +ENCODING 18592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +2940 +0280 +EC60 +2240 +2FE0 +2240 +2440 +5840 +8FE0 +ENDCHAR +STARTCHAR U_48A1 +ENCODING 18593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +2540 +07E0 +F100 +2FE0 +2380 +2540 +2920 +3800 +C7E0 +ENDCHAR +STARTCHAR U_48A2 +ENCODING 18594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2540 +2FE0 +0440 +F7C0 +2440 +2FE0 +3420 +27E0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_48A3 +ENCODING 18595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +27C0 +2240 +0F80 +F100 +2FE0 +2500 +2280 +27C0 +7440 +8FE0 +ENDCHAR +STARTCHAR U_48A4 +ENCODING 18596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +2CA0 +2480 +1FE0 +E480 +2DC0 +36A0 +2480 +2480 +3C80 +C7E0 +ENDCHAR +STARTCHAR U_48A5 +ENCODING 18597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +25C0 +0500 +FFE0 +2540 +26C0 +2540 +27C0 +3800 +C7E0 +ENDCHAR +STARTCHAR U_48A6 +ENCODING 18598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2AA0 +07C0 +EAA0 +2FE0 +2100 +2FE0 +2100 +3900 +C7E0 +ENDCHAR +STARTCHAR U_48A7 +ENCODING 18599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2660 +0BA0 +F540 +2A20 +2180 +2640 +2180 +3A00 +C7E0 +ENDCHAR +STARTCHAR U_48A8 +ENCODING 18600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2940 +36A0 +0800 +FA80 +2AE0 +2A80 +2B80 +2CE0 +7800 +87E0 +ENDCHAR +STARTCHAR U_48A9 +ENCODING 18601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2880 +3EE0 +0BA0 +EAA0 +3FA0 +2A40 +2AA0 +2F20 +7800 +87E0 +ENDCHAR +STARTCHAR U_48AA +ENCODING 18602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2200 +2FE0 +0480 +FFC0 +24A0 +2FC0 +2940 +2F40 +7840 +87E0 +ENDCHAR +STARTCHAR U_48AB +ENCODING 18603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2BE0 +2C80 +0BE0 +FA40 +2BE0 +2D20 +29E0 +2920 +7800 +87E0 +ENDCHAR +STARTCHAR U_48AC +ENCODING 18604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E40 +2A80 +0FE0 +F4A0 +2FC0 +3A80 +27E0 +2480 +3880 +C7E0 +ENDCHAR +STARTCHAR U_48AD +ENCODING 18605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +2100 +07C0 +F100 +2FE0 +24A0 +22C0 +2D20 +F800 +07E0 +ENDCHAR +STARTCHAR U_48AE +ENCODING 18606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +27E0 +0D60 +F380 +2540 +27C0 +2540 +27C0 +7800 +87E0 +ENDCHAR +STARTCHAR U_48AF +ENCODING 18607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2380 +2D60 +0380 +FC60 +27C0 +2A80 +27E0 +2480 +7880 +87E0 +ENDCHAR +STARTCHAR U_48B0 +ENCODING 18608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +94A0 +4C60 +14A0 +FFE0 +4900 +4FC0 +4900 +4FC0 +6900 +9FE0 +ENDCHAR +STARTCHAR U_48B1 +ENCODING 18609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4FE0 +2100 +0FE0 +FAA0 +2FE0 +2540 +2540 +27C0 +7820 +8FE0 +ENDCHAR +STARTCHAR U_48B2 +ENCODING 18610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +4AA0 +2EE0 +FAA0 +2FE0 +2480 +27E0 +2480 +2FE0 +7240 +8FE0 +ENDCHAR +STARTCHAR U_48B3 +ENCODING 18611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +4940 +4980 +4940 +4920 +4920 +4B20 +4DC0 +4900 +8100 +ENDCHAR +STARTCHAR U_48B4 +ENCODING 18612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +1BC0 +E240 +2280 +2280 +FA40 +2240 +2340 +2280 +4200 +8200 +ENDCHAR +STARTCHAR U_48B5 +ENCODING 18613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +F920 +0140 +0140 +FD20 +2120 +4120 +4920 +8DC0 +F500 +0100 +ENDCHAR +STARTCHAR U_48B6 +ENCODING 18614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +FD40 +1180 +3140 +3920 +5520 +9120 +11C0 +1100 +1100 +ENDCHAR +STARTCHAR U_48B7 +ENCODING 18615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +6540 +5540 +4520 +FF20 +4520 +4520 +45A0 +8540 +8D00 +ENDCHAR +STARTCHAR U_48B8 +ENCODING 18616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +4540 +7D40 +4520 +4520 +7D20 +4520 +47A0 +F940 +0100 +ENDCHAR +STARTCHAR U_48B9 +ENCODING 18617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +8120 +8120 +F940 +8940 +8920 +F920 +8120 +81A0 +FD40 +0100 +ENDCHAR +STARTCHAR U_48BA +ENCODING 18618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +9520 +9520 +FD40 +1140 +1120 +9520 +9520 +95A0 +FD40 +0100 +ENDCHAR +STARTCHAR U_48BB +ENCODING 18619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +9120 +9140 +F940 +8920 +8920 +F920 +91A0 +9140 +FD00 +0100 +ENDCHAR +STARTCHAR U_48BC +ENCODING 18620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4920 +FD40 +4940 +4920 +4920 +FD20 +0120 +49C0 +4500 +8500 +ENDCHAR +STARTCHAR U_48BD +ENCODING 18621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FC0 +2080 +FFE0 +5140 +BFA0 +2480 +3F80 +2000 +2040 +1FC0 +ENDCHAR +STARTCHAR U_48BE +ENCODING 18622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5120 +7D40 +9140 +1120 +FF20 +2920 +2920 +4BC0 +8D00 +0100 +ENDCHAR +STARTCHAR U_48BF +ENCODING 18623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FD20 +8540 +4140 +4920 +FD20 +4920 +4920 +39C0 +C500 +0100 +ENDCHAR +STARTCHAR U_48C0 +ENCODING 18624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +3EA0 +44A0 +FEC0 +40A0 +5EA0 +52A0 +56C0 +5080 +9C80 +9080 +ENDCHAR +STARTCHAR U_48C1 +ENCODING 18625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +22A0 +AAA0 +66C0 +22A0 +66A0 +AAA0 +22A0 +22E0 +AA80 +4480 +ENDCHAR +STARTCHAR U_48C2 +ENCODING 18626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +7920 +1120 +7D40 +1140 +FF20 +3120 +39A0 +5540 +5500 +9100 +ENDCHAR +STARTCHAR U_48C3 +ENCODING 18627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +7CA0 +90A0 +10C0 +FEA0 +10A0 +5EA0 +50C0 +5080 +5E80 +F080 +ENDCHAR +STARTCHAR U_48C4 +ENCODING 18628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +28A0 +44A0 +B8C0 +10A0 +7CA0 +10A0 +58C0 +5480 +B480 +1080 +ENDCHAR +STARTCHAR U_48C5 +ENCODING 18629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +40A0 +7CA0 +40C0 +7EA0 +50A0 +5AA0 +54C0 +5480 +9280 +9880 +ENDCHAR +STARTCHAR U_48C6 +ENCODING 18630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +0120 +5520 +A940 +5540 +0120 +FD20 +2120 +3DC0 +E100 +0100 +ENDCHAR +STARTCHAR U_48C7 +ENCODING 18631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14E0 +12A0 +FEA0 +10C0 +92A0 +54A0 +10A0 +54C0 +9280 +9280 +3080 +ENDCHAR +STARTCHAR U_48C8 +ENCODING 18632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +FBC0 +0000 +FBE0 +AAA0 +AAA0 +FBE0 +8200 +BA20 +C3E0 +ENDCHAR +STARTCHAR U_48C9 +ENCODING 18633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +AA80 +5340 +8400 +7F80 +2080 +7FC0 +4440 +7FC0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_48CA +ENCODING 18634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92E0 +54A0 +10A0 +FEC0 +82A0 +BAA0 +AAA0 +AAC0 +BA80 +8280 +8680 +ENDCHAR +STARTCHAR U_48CB +ENCODING 18635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +54A0 +48A0 +12C0 +FEA0 +10A0 +38A0 +54C0 +9080 +1080 +1080 +ENDCHAR +STARTCHAR U_48CC +ENCODING 18636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +7FA0 +40A0 +5EC0 +54A0 +54A0 +5EA0 +54C0 +5280 +9980 +9680 +ENDCHAR +STARTCHAR U_48CD +ENCODING 18637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FEA0 +34A0 +52C0 +FFA0 +52A0 +7EA0 +52C0 +7E80 +1080 +1C80 +ENDCHAR +STARTCHAR U_48CE +ENCODING 18638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +5520 +A920 +5540 +0140 +7D20 +5520 +7DA0 +5540 +5500 +7D00 +ENDCHAR +STARTCHAR U_48CF +ENCODING 18639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +2AA0 +2AA0 +5FC0 +4AA0 +CAA0 +7FA0 +40A0 +4AE0 +4980 +5080 +ENDCHAR +STARTCHAR U_48D0 +ENCODING 18640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +FFE0 +2920 +1140 +7D40 +5520 +5520 +FF20 +29C0 +4500 +8300 +ENDCHAR +STARTCHAR U_48D1 +ENCODING 18641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4120 +7D40 +55C0 +7D20 +5520 +7D20 +51A0 +7D40 +9100 +BF00 +ENDCHAR +STARTCHAR U_48D2 +ENCODING 18642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +5520 +FF40 +0140 +7D20 +5520 +55A0 +5540 +2900 +C500 +ENDCHAR +STARTCHAR U_48D3 +ENCODING 18643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FCE0 +00A0 +7CA0 +44C0 +7CA0 +00A0 +FEA0 +AAA0 +FEE0 +9280 +9680 +ENDCHAR +STARTCHAR U_48D4 +ENCODING 18644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +59E0 +FD20 +8540 +FD40 +8520 +FD20 +8520 +FDC0 +4900 +8500 +ENDCHAR +STARTCHAR U_48D5 +ENCODING 18645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5120 +7D40 +5140 +7D20 +5120 +7D20 +05A0 +AD40 +A500 +1900 +ENDCHAR +STARTCHAR U_48D6 +ENCODING 18646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7A40 +53C0 +7800 +53E0 +7AA0 +0BE0 +AA00 +AA20 +19E0 +ENDCHAR +STARTCHAR U_48D7 +ENCODING 18647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +4520 +7D40 +4540 +7D20 +2120 +FFA0 +5540 +FF00 +1100 +ENDCHAR +STARTCHAR U_48D8 +ENCODING 18648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +95E0 +5920 +FD40 +8540 +7920 +4920 +7920 +21A0 +7940 +2100 +FD00 +ENDCHAR +STARTCHAR U_48D9 +ENCODING 18649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +92E0 +FEA0 +00A0 +EEC0 +AAA0 +EEA0 +AAA0 +EEE0 +AA80 +B280 +ENDCHAR +STARTCHAR U_48DA +ENCODING 18650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +5520 +FF40 +5540 +7D20 +5520 +FDA0 +4940 +3900 +C700 +ENDCHAR +STARTCHAR U_48DB +ENCODING 18651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +3920 +5540 +9140 +2920 +D720 +55A0 +3940 +D500 +3100 +ENDCHAR +STARTCHAR U_48DC +ENCODING 18652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +10E0 +7EA0 +54A0 +7CC0 +54A0 +5CA0 +54A0 +5CE0 +9480 +BE80 +ENDCHAR +STARTCHAR U_48DD +ENCODING 18653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +42A0 +7EA0 +48C0 +7EA0 +4AA0 +7FA0 +52A0 +7EE0 +9280 +9E80 +ENDCHAR +STARTCHAR U_48DE +ENCODING 18654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEA0 +44C0 +FEA0 +10A0 +54A0 +54A0 +7CE0 +2080 +C080 +ENDCHAR +STARTCHAR U_48DF +ENCODING 18655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +A520 +FF40 +2540 +7F20 +A520 +7D20 +45A0 +7D40 +4500 +7D00 +ENDCHAR +STARTCHAR U_48E0 +ENCODING 18656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +EF20 +4520 +EF40 +4540 +AB20 +7D20 +45A0 +7D40 +4500 +7D00 +ENDCHAR +STARTCHAR U_48E1 +ENCODING 18657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FD20 +2140 +7940 +2120 +FD20 +5520 +FDA0 +5540 +E900 +5500 +ENDCHAR +STARTCHAR U_48E2 +ENCODING 18658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +FFA0 +4AC0 +EAA0 +5FA0 +E0A0 +4EA0 +6AA0 +DEC0 +4A80 +4E80 +ENDCHAR +STARTCHAR U_48E3 +ENCODING 18659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54E0 +FEA0 +AAA0 +7CC0 +54A0 +7CA0 +10A0 +7CA0 +10E0 +FE80 +5480 +ENDCHAR +STARTCHAR U_48E4 +ENCODING 18660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEA0 +AAC0 +7EA0 +C8A0 +7CA0 +48A0 +FEC0 +4880 +FC80 +ENDCHAR +STARTCHAR U_48E5 +ENCODING 18661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +2200 +FA00 +AA20 +AAC0 +DB00 +8A00 +FA00 +8A00 +FA20 +89C0 +ENDCHAR +STARTCHAR U_48E6 +ENCODING 18662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +27E0 +F920 +A920 +D920 +8920 +F920 +8A20 +FAA0 +8C40 +ENDCHAR +STARTCHAR U_48E7 +ENCODING 18663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2120 +2100 +FFE0 +A900 +D900 +8900 +F880 +8880 +F860 +8820 +ENDCHAR +STARTCHAR U_48E8 +ENCODING 18664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +F9C0 +AF00 +A900 +D900 +8FE0 +F900 +8900 +F920 +88C0 +ENDCHAR +STARTCHAR U_48E9 +ENCODING 18665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2080 +27E0 +F880 +AAA0 +AAA0 +DBE0 +8880 +F880 +8880 +F860 +ENDCHAR +STARTCHAR U_48EA +ENCODING 18666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +23E0 +F880 +ABE0 +AAA0 +DAA0 +8AA0 +FAA0 +8AA0 +F880 +8880 +ENDCHAR +STARTCHAR U_48EB +ENCODING 18667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2080 +FBE0 +A880 +A880 +DBE0 +8A20 +F940 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_48EC +ENCODING 18668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2120 +27E0 +F900 +A920 +D920 +8940 +F880 +8980 +FA60 +8C20 +ENDCHAR +STARTCHAR U_48ED +ENCODING 18669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +20A0 +F880 +ABE0 +A880 +D880 +8880 +F940 +8940 +FA20 +8A20 +ENDCHAR +STARTCHAR U_48EE +ENCODING 18670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +2120 +27E0 +F900 +A920 +D920 +89A0 +FA40 +8AC0 +FD20 +8A20 +ENDCHAR +STARTCHAR U_48EF +ENCODING 18671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2240 +FBC0 +AA40 +AA40 +DBC0 +8A40 +FA40 +8A40 +FFE0 +ENDCHAR +STARTCHAR U_48F0 +ENCODING 18672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2200 +FA00 +ABE0 +AA20 +DA20 +8BE0 +FA00 +8A00 +FBE0 +8A00 +ENDCHAR +STARTCHAR U_48F1 +ENCODING 18673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +2200 +27E0 +F820 +ABA0 +AAA0 +DAA0 +8BA0 +FAA0 +8820 +F8C0 +ENDCHAR +STARTCHAR U_48F2 +ENCODING 18674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2240 +27E0 +F800 +AA40 +DA40 +8FE0 +FA40 +8A40 +FA40 +8C40 +ENDCHAR +STARTCHAR U_48F3 +ENCODING 18675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2020 +2020 +FBE0 +A820 +DBA0 +8AA0 +FBA0 +8820 +F8A0 +8840 +ENDCHAR +STARTCHAR U_48F4 +ENCODING 18676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +2360 +22A0 +FB60 +AA20 +DBE0 +8940 +F940 +8940 +FA40 +8C60 +ENDCHAR +STARTCHAR U_48F5 +ENCODING 18677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2240 +FA40 +ABC0 +AA40 +DBC0 +8A40 +FA40 +8FE0 +F840 +8840 +ENDCHAR +STARTCHAR U_48F6 +ENCODING 18678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +F880 +ABE0 +A880 +D880 +8BE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_48F7 +ENCODING 18679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +23C0 +FC80 +A880 +DFE0 +8880 +F9C0 +8AA0 +FC80 +8880 +ENDCHAR +STARTCHAR U_48F8 +ENCODING 18680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +E100 +3FE0 +2100 +FFE0 +1100 +7FC0 +5140 +6EC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_48F9 +ENCODING 18681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +22A0 +2680 +FBE0 +AA80 +DAA0 +8AA0 +FA40 +8A40 +FAE0 +8B20 +ENDCHAR +STARTCHAR U_48FA +ENCODING 18682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +FBE0 +A800 +ABE0 +DA20 +8BE0 +FA20 +8BE0 +FA20 +8C60 +ENDCHAR +STARTCHAR U_48FB +ENCODING 18683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2280 +27C0 +F820 +ABC0 +D880 +8900 +FBC0 +8A40 +FA40 +8BC0 +ENDCHAR +STARTCHAR U_48FC +ENCODING 18684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +23E0 +F800 +ABE0 +AA20 +DBE0 +8880 +FAA0 +8CA0 +F8A0 +8980 +ENDCHAR +STARTCHAR U_48FD +ENCODING 18685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +A3C0 +FA40 +53C0 +8800 +FFE0 +1100 +7FC0 +5140 +6EC0 +7FC0 +ENDCHAR +STARTCHAR U_48FE +ENCODING 18686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2080 +FBE0 +AC20 +ABC0 +DA40 +8BC0 +FA40 +8BC0 +FA40 +8FE0 +ENDCHAR +STARTCHAR U_48FF +ENCODING 18687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2080 +27E0 +F880 +A880 +D980 +8800 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_4900 +ENCODING 18688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +F900 +AFE0 +D900 +8A00 +FFC0 +8A40 +FA40 +8BC0 +ENDCHAR +STARTCHAR U_4901 +ENCODING 18689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFE0 +2140 +F9C0 +A940 +D9C0 +8940 +FFE0 +8AC0 +FB20 +8BE0 +ENDCHAR +STARTCHAR U_4902 +ENCODING 18690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +23E0 +F940 +A9C0 +A940 +D880 +8BE0 +F880 +89C0 +FAA0 +8880 +ENDCHAR +STARTCHAR U_4903 +ENCODING 18691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +FA40 +A980 +AFE0 +D800 +8BC0 +FA40 +8BC0 +FA40 +8BC0 +ENDCHAR +STARTCHAR U_4904 +ENCODING 18692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2200 +2400 +FFE0 +AAA0 +DBA0 +8AA0 +FBA0 +8AA0 +FFE0 +8820 +ENDCHAR +STARTCHAR U_4905 +ENCODING 18693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +FBA0 +A800 +DE20 +8AA0 +FEA0 +8AA0 +FE20 +8A60 +ENDCHAR +STARTCHAR U_4906 +ENCODING 18694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +2AC0 +26A0 +FA40 +AC20 +FBC0 +8900 +FFE0 +8980 +FA40 +8C20 +ENDCHAR +STARTCHAR U_4907 +ENCODING 18695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +24A0 +FAC0 +A980 +D940 +8E20 +FBC0 +8A40 +F980 +8E60 +ENDCHAR +STARTCHAR U_4908 +ENCODING 18696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA40 +2420 +FFE0 +A900 +FBC0 +8840 +F880 +8FE0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_4909 +ENCODING 18697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F940 +24A0 +FB20 +AA40 +DDC0 +8800 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_490A +ENCODING 18698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +27E0 +FA40 +AFE0 +AA40 +DBC0 +8A40 +FBC0 +8A40 +FFE0 +8840 +ENDCHAR +STARTCHAR U_490B +ENCODING 18699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2080 +FB80 +AA80 +DBA0 +88A0 +FF40 +88C0 +FB20 +ENDCHAR +STARTCHAR U_490C +ENCODING 18700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FA40 +25A0 +F800 +ABC0 +FA40 +8BC0 +FA40 +8BE0 +FE20 +8BE0 +ENDCHAR +STARTCHAR U_490D +ENCODING 18701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +27E0 +FA40 +ABC0 +A900 +DFE0 +8DA0 +FB60 +8DA0 +F920 +8860 +ENDCHAR +STARTCHAR U_490E +ENCODING 18702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2140 +FFE0 +A9A0 +AA80 +DC80 +8FE0 +FAA0 +8FE0 +FAA0 +8BA0 +ENDCHAR +STARTCHAR U_490F +ENCODING 18703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +2140 +2760 +F940 +ABE0 +D880 +8BE0 +F880 +8FE0 +F880 +8980 +ENDCHAR +STARTCHAR U_4910 +ENCODING 18704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2540 +27E0 +FB40 +ADE0 +A800 +DBC0 +8A40 +FBC0 +8A40 +FBC0 +ENDCHAR +STARTCHAR U_4911 +ENCODING 18705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +23E0 +2140 +FFE0 +A880 +DBE0 +8AA0 +FBE0 +8AA0 +FBE0 +8C20 +ENDCHAR +STARTCHAR U_4912 +ENCODING 18706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2540 +FFE0 +A940 +FBE0 +8A80 +FAA0 +8B40 +FCC0 +8B20 +ENDCHAR +STARTCHAR U_4913 +ENCODING 18707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +FFE0 +AC20 +DBC0 +8920 +FEC0 +89C0 +FEA0 +8980 +ENDCHAR +STARTCHAR U_4914 +ENCODING 18708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +BF80 +6AE0 +3FA0 +C920 +FFE0 +1100 +7FC0 +5140 +6EC0 +7FC0 +ENDCHAR +STARTCHAR U_4915 +ENCODING 18709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FDC0 +2AA0 +FFC0 +AAA0 +FFE0 +8900 +FFE0 +8B40 +FD20 +8900 +ENDCHAR +STARTCHAR U_4916 +ENCODING 18710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +22A0 +FBE0 +A940 +ABE0 +D940 +8FE0 +FAA0 +8EA0 +F9C0 +8EA0 +ENDCHAR +STARTCHAR U_4917 +ENCODING 18711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDC0 +4740 +FDE0 +5680 +FFE0 +1100 +7FC0 +5140 +6EC0 +7FC0 +ENDCHAR +STARTCHAR U_4918 +ENCODING 18712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AC0 +FAA0 +2580 +FFE0 +AA80 +DB80 +8AA0 +FBC0 +8E80 +F960 +8E20 +ENDCHAR +STARTCHAR U_4919 +ENCODING 18713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FA80 +27E0 +FB40 +ADC0 +FAA0 +8FE0 +FAA0 +8FE0 +F2A0 +8FE0 +ENDCHAR +STARTCHAR U_491A +ENCODING 18714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +97C0 +F540 +97C0 +9540 +F100 +97C0 +9100 +B100 +9FE0 +ENDCHAR +STARTCHAR U_491B +ENCODING 18715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +5240 +8A40 +7240 +2240 +FA40 +2A40 +B3C0 +6040 +3840 +C040 +ENDCHAR +STARTCHAR U_491C +ENCODING 18716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +88E0 +7780 +2080 +F880 +27E0 +A880 +B080 +38A0 +C060 +ENDCHAR +STARTCHAR U_491D +ENCODING 18717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +34E0 +4CA0 +F4A0 +24A0 +FCA0 +2CA0 +B5A0 +66E0 +3C80 +E080 +ENDCHAR +STARTCHAR U_491E +ENCODING 18718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +30C0 +48A0 +FFE0 +2080 +FC80 +2940 +B140 +6140 +3A40 +E460 +ENDCHAR +STARTCHAR U_491F +ENCODING 18719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8C40 +7380 +2280 +FA80 +2280 +AA80 +7280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_4920 +ENCODING 18720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +F080 +2280 +FAE0 +2A80 +B280 +6280 +3A80 +C7E0 +ENDCHAR +STARTCHAR U_4921 +ENCODING 18721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +F2A0 +23E0 +FAA0 +2FE0 +B220 +6220 +3A60 +C220 +ENDCHAR +STARTCHAR U_4922 +ENCODING 18722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +4A20 +F3E0 +2000 +F900 +2BE0 +B120 +6120 +3A20 +C460 +ENDCHAR +STARTCHAR U_4923 +ENCODING 18723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4880 +F2A0 +21C0 +F880 +2FE0 +B080 +6080 +3980 +C080 +ENDCHAR +STARTCHAR U_4924 +ENCODING 18724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4880 +F120 +2240 +F980 +2920 +B240 +6080 +3940 +C620 +ENDCHAR +STARTCHAR U_4925 +ENCODING 18725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31E0 +4A40 +F3E0 +2200 +FAE0 +2AA0 +B2E0 +6280 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_4926 +ENCODING 18726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +32C0 +4AA0 +F280 +27E0 +FA80 +2AA0 +B2C0 +62A0 +3B60 +C220 +ENDCHAR +STARTCHAR U_4927 +ENCODING 18727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4A20 +F220 +22E0 +FAA0 +2AA0 +B2E0 +6220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_4928 +ENCODING 18728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4C60 +F580 +2540 +FD40 +2D60 +B540 +6540 +3D40 +C9A0 +ENDCHAR +STARTCHAR U_4929 +ENCODING 18729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F0C0 +2700 +F900 +2FE0 +B100 +6100 +3920 +C1E0 +ENDCHAR +STARTCHAR U_492A +ENCODING 18730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3240 +4A40 +F260 +2480 +FBE0 +2880 +B2C0 +62A0 +3AA0 +C480 +ENDCHAR +STARTCHAR U_492B +ENCODING 18731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3540 +4D40 +F7C0 +2100 +FA80 +2D40 +B820 +67C0 +3840 +C080 +ENDCHAR +STARTCHAR U_492C +ENCODING 18732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3280 +4880 +F9C0 +26A0 +FA80 +2980 +B6A0 +62C0 +3A80 +C300 +ENDCHAR +STARTCHAR U_492D +ENCODING 18733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2640 +31C0 +4E20 +F100 +27E0 +FA80 +2FE0 +B2A0 +62A0 +3AE0 +C080 +ENDCHAR +STARTCHAR U_492E +ENCODING 18734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32E0 +4A80 +F7E0 +2080 +FA80 +2A80 +B4A0 +60C0 +3980 +C600 +ENDCHAR +STARTCHAR U_492F +ENCODING 18735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +32A0 +4AC0 +F280 +27A0 +FAA0 +2AC0 +B280 +62A0 +3AA0 +C4C0 +ENDCHAR +STARTCHAR U_4930 +ENCODING 18736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +24A0 +3940 +C620 +1B00 +6EC0 +8420 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_4931 +ENCODING 18737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +4BE0 +F020 +23C0 +FA00 +2BE0 +B240 +6240 +3A40 +C440 +ENDCHAR +STARTCHAR U_4932 +ENCODING 18738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +F080 +27E0 +F940 +2940 +B360 +6540 +3940 +C240 +ENDCHAR +STARTCHAR U_4933 +ENCODING 18739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4940 +F240 +2660 +FAA0 +2BE0 +B2A0 +6240 +3A40 +C2A0 +ENDCHAR +STARTCHAR U_4934 +ENCODING 18740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4880 +F080 +24A0 +FEE0 +2DA0 +B6E0 +65A0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_4935 +ENCODING 18741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3140 +4B60 +F140 +2360 +F940 +2B60 +B540 +6140 +3A40 +C240 +ENDCHAR +STARTCHAR U_4936 +ENCODING 18742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33C0 +4900 +F2C0 +2520 +FBC0 +2D40 +B540 +63C0 +3900 +C0E0 +ENDCHAR +STARTCHAR U_4937 +ENCODING 18743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +4DE0 +F520 +25E0 +FC80 +2FE0 +B540 +64C0 +3D20 +C7E0 +ENDCHAR +STARTCHAR U_4938 +ENCODING 18744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31C0 +4940 +FFE0 +2080 +F9A0 +2AC0 +B540 +62E0 +3940 +C2C0 +ENDCHAR +STARTCHAR U_4939 +ENCODING 18745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4AA0 +F1C0 +2080 +F940 +2A20 +B3E0 +6140 +3880 +C360 +ENDCHAR +STARTCHAR U_493A +ENCODING 18746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +37C0 +4A80 +F280 +24E0 +FBA0 +2AA0 +B2A0 +63A0 +38A0 +C120 +ENDCHAR +STARTCHAR U_493B +ENCODING 18747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4A80 +F5E0 +2000 +FBE0 +2A20 +B3E0 +6220 +3BE0 +C420 +ENDCHAR +STARTCHAR U_493C +ENCODING 18748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33E0 +4A20 +F3E0 +2220 +FBE0 +2880 +B7A0 +61C0 +3AA0 +C5A0 +ENDCHAR +STARTCHAR U_493D +ENCODING 18749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +47E0 +F080 +22A0 +F9C0 +2880 +B1C0 +62A0 +3880 +C080 +ENDCHAR +STARTCHAR U_493E +ENCODING 18750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4AA0 +F140 +2000 +FA00 +2CE0 +B420 +6760 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_493F +ENCODING 18751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +37A0 +4AA0 +F7A0 +2260 +FBC0 +2880 +B080 +63E0 +3880 +C180 +ENDCHAR +STARTCHAR U_4940 +ENCODING 18752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +4BE0 +F000 +23E0 +F880 +2BE0 +B2A0 +63E0 +3880 +C3E0 +ENDCHAR +STARTCHAR U_4941 +ENCODING 18753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3040 +4880 +F3E0 +2220 +FB60 +2AA0 +B3E0 +62A0 +3AA0 +C3E0 +ENDCHAR +STARTCHAR U_4942 +ENCODING 18754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3420 +4BC0 +F000 +27E0 +F900 +2EA0 +B140 +66E0 +3940 +C680 +ENDCHAR +STARTCHAR U_4943 +ENCODING 18755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D20 +F240 +27E0 +FA40 +2BE0 +B240 +63E0 +3A40 +C3E0 +ENDCHAR +STARTCHAR U_4944 +ENCODING 18756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3540 +4FE0 +F540 +27E0 +FC00 +2DE0 +B520 +65E0 +3D20 +C9E0 +ENDCHAR +STARTCHAR U_4945 +ENCODING 18757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +75C0 +2480 +75C0 +1B00 +64C0 +BFA0 +1500 +7FC0 +ENDCHAR +STARTCHAR U_4946 +ENCODING 18758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +71C0 +1100 +75C0 +1B00 +64C0 +BFA0 +1500 +7FC0 +ENDCHAR +STARTCHAR U_4947 +ENCODING 18759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F7E0 +2400 +FF60 +2D20 +B760 +6520 +3F60 +C920 +ENDCHAR +STARTCHAR U_4948 +ENCODING 18760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +37E0 +4A40 +F120 +27E0 +FA80 +2C60 +B140 +67E0 +3940 +C240 +ENDCHAR +STARTCHAR U_4949 +ENCODING 18761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F1C0 +2240 +FFE0 +2AA0 +B3E0 +6140 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_494A +ENCODING 18762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4880 +F3E0 +2080 +FFE0 +2A20 +B3E0 +6220 +3BE0 +C620 +ENDCHAR +STARTCHAR U_494B +ENCODING 18763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4A40 +F3C0 +2000 +FBE0 +2840 +B080 +6180 +3880 +C560 +ENDCHAR +STARTCHAR U_494C +ENCODING 18764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AAA0 +3B80 +2A80 +3B80 +0400 +1B00 +EEE0 +1500 +7FC0 +ENDCHAR +STARTCHAR U_494D +ENCODING 18765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +73C0 +2140 +FB40 +5140 +FA60 +2400 +1B00 +EEE0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_494E +ENCODING 18766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3400 +4FE0 +F540 +2540 +FDA0 +2BE0 +B220 +63A0 +3A60 +C220 +ENDCHAR +STARTCHAR U_494F +ENCODING 18767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +6BE0 +96A0 +E2A0 +4FA0 +EAA0 +5AE0 +EBA0 +4A80 +6B80 +8C80 +ENDCHAR +STARTCHAR U_4950 +ENCODING 18768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +5340 +FC80 +2940 +67E0 +A140 +2EC0 +3580 +DF60 +1500 +3F80 +ENDCHAR +STARTCHAR U_4951 +ENCODING 18769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D40 +F540 +2BA0 +F960 +2BC0 +B340 +6480 +3940 +C640 +ENDCHAR +STARTCHAR U_4952 +ENCODING 18770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +F7E0 +84A0 +F3E0 +1EA0 +E5E0 +1500 +3F80 +1500 +7FE0 +ENDCHAR +STARTCHAR U_4953 +ENCODING 18771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8AC0 +7340 +22C0 +FB40 +2FE0 +B540 +6BA0 +3100 +C7E0 +ENDCHAR +STARTCHAR U_4954 +ENCODING 18772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8FE0 +7AA0 +2AA0 +FFE0 +2540 +AFE0 +7380 +3D40 +E920 +ENDCHAR +STARTCHAR U_4955 +ENCODING 18773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8BE0 +7620 +2FA0 +FAA0 +2BA0 +BEC0 +6AC0 +3AA0 +EBA0 +ENDCHAR +STARTCHAR U_4956 +ENCODING 18774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FE0 +8280 +7FE0 +2AA0 +FC60 +2FE0 +B100 +6FE0 +3280 +CC60 +ENDCHAR +STARTCHAR U_4957 +ENCODING 18775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5F80 +84E0 +7F20 +2040 +F740 +2040 +BFC0 +6E40 +35A0 +C520 +ENDCHAR +STARTCHAR U_4958 +ENCODING 18776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5140 +8AA0 +F140 +2140 +FAA0 +2BE0 +B220 +63E0 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_4959 +ENCODING 18777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +5EC0 +8A00 +7DE0 +2A80 +FB60 +2AC0 +BF40 +68E0 +3B40 +C880 +ENDCHAR +STARTCHAR U_495A +ENCODING 18778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +5DC0 +5540 +5DC0 +5540 +5F40 +64C0 +5F40 +9560 +FFA0 +ENDCHAR +STARTCHAR U_495B +ENCODING 18779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +52A0 +8FA0 +72A0 +2F20 +F2C0 +2B80 +B440 +67C0 +3540 +CB20 +ENDCHAR +STARTCHAR U_495C +ENCODING 18780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +7AA0 +2EE0 +F920 +2FE0 +BBA0 +6D60 +3920 +C860 +ENDCHAR +STARTCHAR U_495D +ENCODING 18781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +7FE0 +2AA0 +FAC0 +2B60 +BA00 +6BC0 +3A00 +D1E0 +ENDCHAR +STARTCHAR U_495E +ENCODING 18782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +5A80 +8EE0 +7BA0 +2EA0 +F4A0 +2E40 +BA40 +6AA0 +F520 +ENDCHAR +STARTCHAR U_495F +ENCODING 18783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +3540 +4FC0 +F540 +25C0 +F700 +25E0 +BEA0 +6560 +35A0 +CCC0 +ENDCHAR +STARTCHAR U_4960 +ENCODING 18784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8A80 +70A0 +27E0 +F480 +2FA0 +B460 +6740 +3DA0 +D720 +ENDCHAR +STARTCHAR U_4961 +ENCODING 18785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +5BE0 +8AA0 +7AE0 +2E00 +F9E0 +2E40 +BBE0 +6A40 +3AE0 +D140 +ENDCHAR +STARTCHAR U_4962 +ENCODING 18786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +4880 +7BC0 +5140 +FC80 +0F60 +3580 +DF60 +1500 +3F80 +ENDCHAR +STARTCHAR U_4963 +ENCODING 18787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BC0 +8A40 +DFE0 +8A40 +F980 +2260 +FF00 +3580 +DF60 +1500 +3F80 +ENDCHAR +STARTCHAR U_4964 +ENCODING 18788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5100 +8FE0 +7560 +2380 +F440 +2FC0 +B540 +6740 +34A0 +E3E0 +ENDCHAR +STARTCHAR U_4965 +ENCODING 18789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8A40 +7FE0 +2A80 +FFE0 +2AA0 +BFE0 +6AC0 +3EA0 +D280 +ENDCHAR +STARTCHAR U_4966 +ENCODING 18790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53E0 +8940 +75E0 +2F40 +F5C0 +2540 +B5C0 +6540 +3E00 +D1E0 +ENDCHAR +STARTCHAR U_4967 +ENCODING 18791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +7420 +23C0 +FDA0 +2A40 +B7E0 +62C0 +3340 +C3C0 +ENDCHAR +STARTCHAR U_4968 +ENCODING 18792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +7AA0 +2FE0 +FAA0 +2BA0 +B820 +6BA0 +3AA0 +CBE0 +ENDCHAR +STARTCHAR U_4969 +ENCODING 18793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +5A80 +AAE0 +1FA0 +F0A0 +57A0 +F040 +5740 +F540 +75A0 +D4A0 +ENDCHAR +STARTCHAR U_496A +ENCODING 18794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +54C0 +8D40 +77C0 +2240 +FFE0 +2A40 +B7E0 +6000 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_496B +ENCODING 18795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5FC0 +84A0 +7FE0 +2480 +FFA0 +2AA0 +BF40 +6AC0 +3F20 +C220 +ENDCHAR +STARTCHAR U_496C +ENCODING 18796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FE0 +8540 +77E0 +2540 +FFC0 +2D40 +B7E0 +6240 +3A40 +E0C0 +ENDCHAR +STARTCHAR U_496D +ENCODING 18797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28A0 +FFE0 +AAA0 +71C0 +AEA0 +3180 +EEE0 +0400 +3F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_496E +ENCODING 18798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5280 +8FE0 +7AA0 +2FE0 +F800 +2FE0 +BAA0 +6FA0 +3AE0 +CF80 +ENDCHAR +STARTCHAR U_496F +ENCODING 18799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +7480 +2AE0 +FE80 +2A60 +BE80 +6AE0 +3E80 +CA60 +ENDCHAR +STARTCHAR U_4970 +ENCODING 18800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7200 +21C0 +FA80 +2FE0 +BAA0 +6FE0 +32A0 +C7E0 +ENDCHAR +STARTCHAR U_4971 +ENCODING 18801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +72C0 +2440 +FEC0 +2440 +B7E0 +6820 +3560 +C540 +ENDCHAR +STARTCHAR U_4972 +ENCODING 18802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F80 +8AE0 +7F20 +2880 +FF80 +2A80 +BF80 +6880 +3F40 +C220 +ENDCHAR +STARTCHAR U_4973 +ENCODING 18803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5200 +8FC0 +7540 +2FE0 +FA40 +2560 +BBC0 +6C40 +3380 +CC60 +ENDCHAR +STARTCHAR U_4974 +ENCODING 18804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +57E0 +8280 +7FE0 +2480 +FFE0 +2480 +B760 +65A0 +3420 +C460 +ENDCHAR +STARTCHAR U_4975 +ENCODING 18805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +BFE0 +1480 +F7E0 +5D40 +F7E0 +5540 +77E0 +DD40 +4140 +E260 +ENDCHAR +STARTCHAR U_4976 +ENCODING 18806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5400 +8FE0 +7540 +27E0 +FD40 +2FE0 +B440 +6560 +3940 +CFE0 +ENDCHAR +STARTCHAR U_4977 +ENCODING 18807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +6F20 +9A20 +70A0 +2EA0 +FAA0 +2EA0 +BA20 +6F20 +3A20 +D260 +ENDCHAR +STARTCHAR U_4978 +ENCODING 18808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +CFE0 +8D60 +EBA0 +2D60 +5F00 +E4E0 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_4979 +ENCODING 18809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +52A0 +8FA0 +72A0 +2740 +FAE0 +2A80 +B7E0 +6520 +3EE0 +C7E0 +ENDCHAR +STARTCHAR U_497A +ENCODING 18810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +7840 +8240 +7440 +27E0 +F8C0 +2140 +2640 +3040 +20C0 +ENDCHAR +STARTCHAR U_497B +ENCODING 18811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +7900 +8100 +7100 +27E0 +F900 +2180 +2280 +2AA0 +34E0 +ENDCHAR +STARTCHAR U_497C +ENCODING 18812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +7FE0 +8AA0 +72A0 +22A0 +F2A0 +24A0 +2920 +3220 +20C0 +ENDCHAR +STARTCHAR U_497D +ENCODING 18813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7520 +8FE0 +7100 +2200 +FBC0 +2640 +2580 +2980 +3660 +ENDCHAR +STARTCHAR U_497E +ENCODING 18814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7200 +83E0 +F200 +23E0 +FA20 +2020 +2FE0 +3020 +20C0 +ENDCHAR +STARTCHAR U_497F +ENCODING 18815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7800 +8FE0 +F900 +49C0 +F940 +4940 +4A40 +6A40 +54C0 +ENDCHAR +STARTCHAR U_4980 +ENCODING 18816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7920 +85A0 +7360 +2120 +FB60 +25A0 +2120 +2920 +3360 +ENDCHAR +STARTCHAR U_4981 +ENCODING 18817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +42E0 +7FA0 +82A0 +77C0 +22A0 +FFA0 +22A0 +22E0 +2A80 +3480 +ENDCHAR +STARTCHAR U_4982 +ENCODING 18818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +8FE0 +F800 +4FE0 +FDA0 +4B60 +4DA0 +5920 +6360 +ENDCHAR +STARTCHAR U_4983 +ENCODING 18819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +8100 +F7E0 +4140 +F7E0 +4240 +4FC0 +5240 +63C0 +ENDCHAR +STARTCHAR U_4984 +ENCODING 18820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7540 +87C0 +F540 +47C0 +F120 +4FE0 +4540 +5C80 +6660 +ENDCHAR +STARTCHAR U_4985 +ENCODING 18821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +7FC0 +8100 +77C0 +2100 +FFE0 +2540 +2FE0 +3440 +27C0 +ENDCHAR +STARTCHAR U_4986 +ENCODING 18822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +7EE0 +8AA0 +FFE0 +4480 +FFE0 +4480 +4FE0 +6240 +4FE0 +ENDCHAR +STARTCHAR U_4987 +ENCODING 18823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4240 +7A40 +4520 +7D20 +4200 +FBC0 +5040 +8840 +F840 +0180 +ENDCHAR +STARTCHAR U_4988 +ENCODING 18824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4100 +7FE0 +4100 +7900 +43E0 +FA80 +2280 +4A80 +FC80 +0BE0 +ENDCHAR +STARTCHAR U_4989 +ENCODING 18825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +8AA0 +EAA0 +8AA0 +EAA0 +8AA0 +FCE0 +4820 +9820 +FFE0 +8820 +ENDCHAR +STARTCHAR U_498A +ENCODING 18826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4100 +79C0 +4100 +7900 +47E0 +F900 +5340 +8D20 +F920 +0300 +ENDCHAR +STARTCHAR U_498B +ENCODING 18827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +9E80 +E5E0 +9EA0 +E4A0 +9EA0 +E8A0 +4E40 +8A40 +AAA0 +F720 +ENDCHAR +STARTCHAR U_498C +ENCODING 18828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +8420 +9F20 +8420 +BFA0 +8060 +ENDCHAR +STARTCHAR U_498D +ENCODING 18829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +9F20 +A020 +9C20 +8820 +9120 +9F60 +ENDCHAR +STARTCHAR U_498E +ENCODING 18830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F3E0 +9E20 +8020 +BF20 +8A20 +92A0 +A3A0 +ENDCHAR +STARTCHAR U_498F +ENCODING 18831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +9B20 +EAE0 +8A20 +9220 +A260 +ENDCHAR +STARTCHAR U_4990 +ENCODING 18832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +9F20 +8420 +BFA0 +8420 +9C60 +ENDCHAR +STARTCHAR U_4991 +ENCODING 18833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +9F20 +8520 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_4992 +ENCODING 18834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BFA0 +8820 +9FA0 +E8A0 +8FE0 +ENDCHAR +STARTCHAR U_4993 +ENCODING 18835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8820 +8F20 +8820 +BF20 +A120 +BF60 +ENDCHAR +STARTCHAR U_4994 +ENCODING 18836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA60 +CAA0 +FBE0 +8020 +9F20 +9320 +9520 +9F20 +8020 +BFE0 +ENDCHAR +STARTCHAR U_4995 +ENCODING 18837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AB20 +CAA0 +FBE0 +9120 +8A20 +9F20 +8A20 +BFA0 +8A20 +92E0 +ENDCHAR +STARTCHAR U_4996 +ENCODING 18838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +BFA0 +8420 +9F20 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_4997 +ENCODING 18839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9020 +BFA0 +AAA0 +AAA0 +FFA0 +8060 +ENDCHAR +STARTCHAR U_4998 +ENCODING 18840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FFE0 +9120 +9F20 +9120 +9F20 +92A0 +9520 +98E0 +ENDCHAR +STARTCHAR U_4999 +ENCODING 18841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +9F20 +8420 +BFA0 +8220 +9F20 +8A20 +8660 +ENDCHAR +STARTCHAR U_499A +ENCODING 18842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA60 +CAA0 +F3E0 +9C20 +8420 +BFA0 +8420 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_499B +ENCODING 18843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +8A20 +9F20 +8520 +BFA0 +8520 +9F20 +8420 +8C60 +ENDCHAR +STARTCHAR U_499C +ENCODING 18844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +9F20 +8920 +BFA0 +9120 +9F60 +ENDCHAR +STARTCHAR U_499D +ENCODING 18845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FBE0 +8420 +9F20 +8420 +BFA0 +9B20 +AAA0 +9660 +ENDCHAR +STARTCHAR U_499E +ENCODING 18846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FBE0 +9020 +8FA0 +B120 +87A0 +8920 +B7A0 +8060 +ENDCHAR +STARTCHAR U_499F +ENCODING 18847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9520 +AEA0 +8420 +9F20 +8420 +BFE0 +ENDCHAR +STARTCHAR U_49A0 +ENCODING 18848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +BE40 +9540 +AE40 +95C0 +AC40 +80C0 +ENDCHAR +STARTCHAR U_49A1 +ENCODING 18849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +9A40 +FFC0 +A140 +9E40 +9240 +9F40 +9140 +9FC0 +ENDCHAR +STARTCHAR U_49A2 +ENCODING 18850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +A740 +D240 +AFC0 +E540 +AF40 +A0C0 +ENDCHAR +STARTCHAR U_49A3 +ENCODING 18851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +9F20 +8A20 +BFA0 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_49A4 +ENCODING 18852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8E20 +FBE0 +9120 +EEA0 +BBA0 +AAA0 +9120 +EAE0 +ENDCHAR +STARTCHAR U_49A5 +ENCODING 18853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +FFE0 +9120 +BBA0 +D560 +9160 +ENDCHAR +STARTCHAR U_49A6 +ENCODING 18854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FBE0 +8E20 +9120 +AEA0 +8420 +BFA0 +9520 +BFE0 +ENDCHAR +STARTCHAR U_49A7 +ENCODING 18855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +F3E0 +9120 +9B20 +9120 +9F20 +8A20 +92A0 +A1E0 +ENDCHAR +STARTCHAR U_49A8 +ENCODING 18856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8420 +BFA0 +9520 +9F20 +9520 +9F20 +9520 +ACE0 +ENDCHAR +STARTCHAR U_49A9 +ENCODING 18857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9520 +9520 +9F20 +B120 +8E20 +F360 +ENDCHAR +STARTCHAR U_49AA +ENCODING 18858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +9120 +9F20 +9120 +9FA0 +B4A0 +DAA0 +9FA0 +8160 +ENDCHAR +STARTCHAR U_49AB +ENCODING 18859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +9120 +FFE0 +9520 +BFA0 +A4A0 +FFE0 +9220 +E1A0 +ENDCHAR +STARTCHAR U_49AC +ENCODING 18860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +92A0 +BAA0 +92A0 +FCA0 +9520 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_49AD +ENCODING 18861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +F3E0 +9C20 +8420 +BFA0 +9520 +E4E0 +9F20 +9520 +9F60 +ENDCHAR +STARTCHAR U_49AE +ENCODING 18862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +8420 +9F20 +8820 +BFA0 +99A0 +EF60 +8920 +8F60 +ENDCHAR +STARTCHAR U_49AF +ENCODING 18863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8020 +FE20 +ABE0 +FEA0 +92A0 +B920 +92A0 +FC60 +ENDCHAR +STARTCHAR U_49B0 +ENCODING 18864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +9220 +BF20 +9520 +9F20 +9520 +9F20 +9560 +8FE0 +ENDCHAR +STARTCHAR U_49B1 +ENCODING 18865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +9520 +9E20 +9220 +9F20 +9120 +BFA0 +AAA0 +CB60 +ENDCHAR +STARTCHAR U_49B2 +ENCODING 18866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FFE0 +8A20 +9FE0 +B4A0 +9FE0 +9020 +97A0 +A4A0 +A7A0 +ENDCHAR +STARTCHAR U_49B3 +ENCODING 18867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8220 +9FE0 +A960 +BFA0 +A960 +BF60 +9BA0 +AD20 +ENDCHAR +STARTCHAR U_49B4 +ENCODING 18868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +CB20 +FFE0 +AAA0 +BFA0 +8420 +FFE0 +9120 +BFA0 +8460 +ENDCHAR +STARTCHAR U_49B5 +ENCODING 18869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +8020 +BFA0 +9520 +BFA0 +EDE0 +B6A0 +ADA0 +B6A0 +ENDCHAR +STARTCHAR U_49B6 +ENCODING 18870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2420 +8F20 +9220 +9F20 +8520 +BFA0 +8520 +9F20 +8420 +8C60 +ENDCHAR +STARTCHAR U_49B7 +ENCODING 18871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8020 +9520 +9520 +AEA0 +8420 +9F20 +8420 +BFA0 +8060 +ENDCHAR +STARTCHAR U_49B8 +ENCODING 18872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +5FE0 +4020 +9F20 +9520 +9F20 +9520 +BFA0 +A6A0 +BFA0 +A0E0 +ENDCHAR +STARTCHAR U_49B9 +ENCODING 18873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A100 +AFE0 +9100 +9100 +9100 +E100 +8100 +8100 +8100 +ENDCHAR +STARTCHAR U_49BA +ENCODING 18874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +97E0 +A080 +A080 +9080 +9080 +D080 +A080 +8080 +8280 +8100 +ENDCHAR +STARTCHAR U_49BB +ENCODING 18875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +A080 +A100 +9100 +9FE0 +D100 +A100 +8100 +8100 +8700 +ENDCHAR +STARTCHAR U_49BC +ENCODING 18876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +AFC0 +A240 +9240 +9240 +DFE0 +A300 +8480 +8840 +B020 +ENDCHAR +STARTCHAR U_49BD +ENCODING 18877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +A280 +A100 +9FE0 +9120 +9100 +E100 +8100 +8100 +8300 +ENDCHAR +STARTCHAR U_49BE +ENCODING 18878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4280 +F440 +9FE0 +F480 +8480 +F480 +9480 +F4A0 +88A0 +10E0 +ENDCHAR +STARTCHAR U_49BF +ENCODING 18879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7E0 +A520 +9520 +97E0 +9100 +D100 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_49C0 +ENCODING 18880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +AFE0 +A200 +9400 +9500 +9500 +EA00 +8A80 +9440 +87C0 +ENDCHAR +STARTCHAR U_49C1 +ENCODING 18881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +9400 +A7E0 +A820 +97A0 +94A0 +94A0 +E7A0 +84A0 +8020 +80C0 +ENDCHAR +STARTCHAR U_49C2 +ENCODING 18882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9220 +A220 +A220 +94A0 +9840 +D7E0 +A420 +8420 +87E0 +8420 +ENDCHAR +STARTCHAR U_49C3 +ENCODING 18883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +97E0 +A4A0 +A4A0 +97E0 +94A0 +94A0 +D4A0 +A7E0 +8420 +8000 +ENDCHAR +STARTCHAR U_49C4 +ENCODING 18884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +A440 +AA80 +9380 +9C60 +9000 +D7C0 +A440 +8440 +87C0 +ENDCHAR +STARTCHAR U_49C5 +ENCODING 18885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +A7C0 +9140 +97C0 +9500 +D7E0 +A120 +82C0 +8C60 +ENDCHAR +STARTCHAR U_49C6 +ENCODING 18886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +A280 +AFE0 +9280 +9280 +DFE0 +A000 +8280 +8440 +8820 +ENDCHAR +STARTCHAR U_49C7 +ENCODING 18887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +A100 +9320 +9540 +9C80 +D480 +A440 +8540 +8620 +ENDCHAR +STARTCHAR U_49C8 +ENCODING 18888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +A280 +CFE0 +AAA0 +AAA0 +AAA0 +ACE0 +C820 +8FE0 +8820 +ENDCHAR +STARTCHAR U_49C9 +ENCODING 18889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +A7C0 +A540 +9540 +97C0 +9100 +D7C0 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_49CA +ENCODING 18890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9500 +A7C0 +A900 +9100 +9FE0 +9000 +D7C0 +A440 +8440 +87C0 +ENDCHAR +STARTCHAR U_49CB +ENCODING 18891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +A440 +97C0 +9440 +97C0 +D280 +A280 +84A0 +98E0 +ENDCHAR +STARTCHAR U_49CC +ENCODING 18892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9F20 +A520 +A4C0 +9200 +9240 +9FE0 +D440 +A480 +8380 +9C60 +ENDCHAR +STARTCHAR U_49CD +ENCODING 18893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9440 +A920 +A100 +9280 +9440 +9820 +D7C0 +A440 +8440 +87C0 +ENDCHAR +STARTCHAR U_49CE +ENCODING 18894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A7E0 +A000 +97E0 +9420 +97E0 +D420 +A7E0 +8420 +8460 +ENDCHAR +STARTCHAR U_49CF +ENCODING 18895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +A780 +A880 +D700 +AA80 +BFE0 +A200 +CF80 +8200 +9FC0 +8200 +ENDCHAR +STARTCHAR U_49D0 +ENCODING 18896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +C440 +A7C0 +A000 +A7C0 +C080 +8FE0 +8080 +8380 +ENDCHAR +STARTCHAR U_49D1 +ENCODING 18897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A820 +C7C0 +A100 +A100 +A5C0 +C500 +8B00 +8900 +90E0 +ENDCHAR +STARTCHAR U_49D2 +ENCODING 18898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A100 +C540 +A540 +ABA0 +A100 +C380 +8540 +8920 +8100 +ENDCHAR +STARTCHAR U_49D3 +ENCODING 18899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +ABA0 +C920 +ABA0 +A820 +ABA0 +CAA0 +8BA0 +8820 +9060 +ENDCHAR +STARTCHAR U_49D4 +ENCODING 18900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A500 +A880 +D240 +AFA0 +A080 +A100 +C200 +8940 +94A0 +97A0 +ENDCHAR +STARTCHAR U_49D5 +ENCODING 18901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +A0A0 +BFE0 +C080 +AE80 +AAA0 +AEA0 +C0C0 +8680 +9940 +8220 +ENDCHAR +STARTCHAR U_49D6 +ENCODING 18902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +AFC0 +A480 +C300 +A4C0 +A500 +AFC0 +C400 +8280 +8320 +8CE0 +ENDCHAR +STARTCHAR U_49D7 +ENCODING 18903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFE0 +B840 +CFC0 +A840 +AFC0 +A400 +CFC0 +9480 +8300 +9CE0 +ENDCHAR +STARTCHAR U_49D8 +ENCODING 18904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A3C0 +A480 +CFE0 +A200 +AD20 +A2C0 +CD80 +82C0 +8CA0 +8300 +ENDCHAR +STARTCHAR U_49D9 +ENCODING 18905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AA40 +AFC0 +C200 +A700 +A880 +B260 +C200 +8B40 +92A0 +8600 +ENDCHAR +STARTCHAR U_49DA +ENCODING 18906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +C380 +A000 +AFE0 +A820 +CBA0 +8AA0 +8BA0 +8860 +ENDCHAR +STARTCHAR U_49DB +ENCODING 18907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +CFE0 +A920 +A7C0 +A200 +C3C0 +8240 +8440 +8980 +ENDCHAR +STARTCHAR U_49DC +ENCODING 18908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A940 +CFE0 +A940 +AFC0 +A900 +CFC0 +9440 +9440 +A7C0 +ENDCHAR +STARTCHAR U_49DD +ENCODING 18909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +A7C0 +A100 +CFE0 +A100 +A7C0 +A540 +C7C0 +8100 +8140 +8FE0 +ENDCHAR +STARTCHAR U_49DE +ENCODING 18910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A900 +AFC0 +C900 +AFC0 +A900 +AFE0 +C020 +8AA0 +9520 +80C0 +ENDCHAR +STARTCHAR U_49DF +ENCODING 18911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +AE00 +A920 +C540 +A000 +A200 +ACE0 +C820 +8EE0 +8820 +8FE0 +ENDCHAR +STARTCHAR U_49E0 +ENCODING 18912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A540 +C7C0 +A540 +AFE0 +A080 +CFE0 +8480 +8080 +8180 +ENDCHAR +STARTCHAR U_49E1 +ENCODING 18913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A940 +CFE0 +A940 +AFE0 +AD20 +AFE0 +D520 +97E0 +A520 +ENDCHAR +STARTCHAR U_49E2 +ENCODING 18914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +AB80 +CA80 +AB80 +A800 +AFC0 +AD40 +CFC0 +8800 +8FE0 +ENDCHAR +STARTCHAR U_49E3 +ENCODING 18915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +CAA0 +AFE0 +A000 +A7C0 +A000 +CFE0 +8540 +8920 +ENDCHAR +STARTCHAR U_49E4 +ENCODING 18916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +AFE0 +A440 +C280 +AFE0 +A100 +A7C0 +A100 +CFE0 +8280 +8C60 +ENDCHAR +STARTCHAR U_49E5 +ENCODING 18917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +BFC0 +AA80 +CF80 +AA80 +AF80 +A240 +DFA0 +8400 +9AC0 +AFA0 +ENDCHAR +STARTCHAR U_49E6 +ENCODING 18918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +AE00 +A540 +CFC0 +A480 +A7C0 +A840 +CFE0 +9020 +8AA0 +9540 +ENDCHAR +STARTCHAR U_49E7 +ENCODING 18919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +BFC0 +A200 +CF80 +A200 +BFC0 +A940 +DFE0 +8940 +BCA0 +8960 +ENDCHAR +STARTCHAR U_49E8 +ENCODING 18920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +A280 +AFE0 +C440 +AFE0 +A100 +A7C0 +A100 +CFE0 +8540 +8920 +ENDCHAR +STARTCHAR U_49E9 +ENCODING 18921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +A280 +BEE0 +CB40 +AE40 +AB40 +AE80 +CA80 +8F40 +9A60 +8220 +ENDCHAR +STARTCHAR U_49EA +ENCODING 18922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFC0 +A900 +CFC0 +AA80 +AD40 +AA80 +AFE0 +CA80 +9380 +8440 +ENDCHAR +STARTCHAR U_49EB +ENCODING 18923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +CFE0 +A820 +A7C0 +A500 +CAC0 +8580 +8AC0 +8520 +ENDCHAR +STARTCHAR U_49EC +ENCODING 18924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A920 +C540 +A180 +A7C0 +AC40 +B7C0 +C440 +87C0 +8820 +ENDCHAR +STARTCHAR U_49ED +ENCODING 18925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFC0 +AA40 +CD40 +AAC0 +A940 +AFC0 +C400 +9B40 +A8A0 +8780 +ENDCHAR +STARTCHAR U_49EE +ENCODING 18926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A920 +C7C0 +A100 +AFE0 +A540 +A7C0 +C240 +9920 +97C0 +ENDCHAR +STARTCHAR U_49EF +ENCODING 18927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A900 +BFC0 +C900 +AFC0 +A500 +AF80 +DA80 +8F80 +8540 +99E0 +ENDCHAR +STARTCHAR U_49F0 +ENCODING 18928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E880 +BC80 +A540 +DFC0 +AA80 +BF40 +ABE0 +DE80 +95C0 +AAA0 +8080 +ENDCHAR +STARTCHAR U_49F1 +ENCODING 18929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +F7E0 +5C80 +57C0 +5480 +5480 +57C0 +5C80 +9480 +87E0 +ENDCHAR +STARTCHAR U_49F2 +ENCODING 18930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7240 +27E0 +2C80 +F480 +27E0 +2480 +27E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_49F3 +ENCODING 18931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2200 +A3E0 +BA40 +A640 +A3E0 +A240 +ABE0 +B240 +C240 +03E0 +ENDCHAR +STARTCHAR U_49F4 +ENCODING 18932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2100 +FBE0 +2240 +2640 +FBE0 +0A40 +53E0 +2240 +5240 +8BE0 +ENDCHAR +STARTCHAR U_49F5 +ENCODING 18933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2200 +FBE0 +AE40 +2240 +33E0 +3240 +33E0 +5240 +5A40 +83E0 +ENDCHAR +STARTCHAR U_49F6 +ENCODING 18934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6100 +7FE0 +A100 +3FE0 +0400 +FFE0 +0000 +1080 +6040 +ENDCHAR +STARTCHAR U_49F7 +ENCODING 18935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4280 +F440 +9FE0 +6480 +67E0 +9480 +47E0 +2480 +4480 +27E0 +ENDCHAR +STARTCHAR U_49F8 +ENCODING 18936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +2440 +F7E0 +2C80 +27E0 +F480 +97E0 +9480 +9480 +F7E0 +ENDCHAR +STARTCHAR U_49F9 +ENCODING 18937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A80 +4A40 +57E0 +7C80 +57E0 +5480 +57E0 +5480 +97E0 +ENDCHAR +STARTCHAR U_49FA +ENCODING 18938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +F7E0 +2C80 +4480 +47E0 +F480 +57E0 +5480 +5480 +77E0 +ENDCHAR +STARTCHAR U_49FB +ENCODING 18939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2120 +53E0 +8A40 +77E0 +0240 +73E0 +5240 +5240 +73E0 +ENDCHAR +STARTCHAR U_49FC +ENCODING 18940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A140 +FA20 +A3E0 +2640 +FBE0 +0240 +F3E0 +9240 +9240 +F3E0 +ENDCHAR +STARTCHAR U_49FD +ENCODING 18941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1940 +E120 +ABE0 +7640 +2240 +FBE0 +2240 +73E0 +6A40 +A240 +23E0 +ENDCHAR +STARTCHAR U_49FE +ENCODING 18942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +53E0 +8A40 +7640 +23E0 +FA40 +23E0 +7240 +5240 +73E0 +ENDCHAR +STARTCHAR U_49FF +ENCODING 18943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +4920 +FDE0 +4B40 +FD40 +01E0 +7940 +49E0 +7940 +4940 +79E0 +ENDCHAR +STARTCHAR U_4A00 +ENCODING 18944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2180 +5240 +8BE0 +2640 +ABE0 +2240 +FBE0 +7240 +ABE0 +2200 +ENDCHAR +STARTCHAR U_4A01 +ENCODING 18945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13E0 +FD40 +3480 +5360 +9200 +3FC0 +2200 +7FC0 +A200 +3FE0 +ENDCHAR +STARTCHAR U_4A02 +ENCODING 18946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +22A0 +FDC0 +3080 +6940 +A220 +7FE0 +A200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_4A03 +ENCODING 18947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4940 +79E0 +4B40 +FD40 +A5E0 +2140 +FDE0 +4940 +3140 +CDE0 +ENDCHAR +STARTCHAR U_4A04 +ENCODING 18948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +5540 +B9E0 +0B40 +FDE0 +2940 +DDE0 +B540 +CDE0 +B500 +ENDCHAR +STARTCHAR U_4A05 +ENCODING 18949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F940 +ABE0 +5640 +FA40 +53E0 +7240 +53E0 +7240 +AA40 +63E0 +ENDCHAR +STARTCHAR U_4A06 +ENCODING 18950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FA40 +AD40 +F880 +AB40 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_4A07 +ENCODING 18951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +7BC0 +5280 +7FE0 +0000 +FBE0 +4920 +30C0 +CB20 +ENDCHAR +STARTCHAR U_4A08 +ENCODING 18952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA40 +8FE0 +7280 +6A80 +B3E0 +5280 +F3E0 +5280 +7280 +8BE0 +ENDCHAR +STARTCHAR U_4A09 +ENCODING 18953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +B540 +DDE0 +B740 +4940 +B5E0 +4940 +FDE0 +4940 +3140 +CDE0 +ENDCHAR +STARTCHAR U_4A0A +ENCODING 18954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3FC0 +5100 +FFE0 +5140 +7FE0 +5140 +7DE0 +4920 +7FE0 +8920 +ENDCHAR +STARTCHAR U_4A0B +ENCODING 18955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1500 +2080 +3F80 +0400 +7FC0 +0420 +07E0 +ENDCHAR +STARTCHAR U_4A0C +ENCODING 18956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1500 +2480 +7FC0 +0000 +FFC0 +1220 +E3E0 +ENDCHAR +STARTCHAR U_4A0D +ENCODING 18957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +2E80 +1100 +7FC0 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_4A0E +ENCODING 18958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +7A80 +0900 +7900 +4100 +7A00 +0A40 +33A0 +ENDCHAR +STARTCHAR U_4A0F +ENCODING 18959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +9540 +2480 +E7E0 +0920 +2180 +C240 +0420 +ENDCHAR +STARTCHAR U_4A10 +ENCODING 18960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +5B40 +2080 +DF60 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_4A11 +ENCODING 18961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +7FC0 +0480 +7FC0 +4400 +FFE0 +0A20 +7160 +ENDCHAR +STARTCHAR U_4A12 +ENCODING 18962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2480 +FBE0 +0820 +4920 +28A0 +DB60 +ENDCHAR +STARTCHAR U_4A13 +ENCODING 18963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +9520 +2480 +7FC0 +4040 +5F40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_4A14 +ENCODING 18964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9120 +2480 +1500 +7FC0 +0A00 +1220 +E3E0 +ENDCHAR +STARTCHAR U_4A15 +ENCODING 18965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +1480 +6000 +03C0 +C080 +07E0 +2080 +4180 +ENDCHAR +STARTCHAR U_4A16 +ENCODING 18966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +94A0 +0900 +7FE0 +1000 +2F80 +4880 +8F80 +0880 +ENDCHAR +STARTCHAR U_4A17 +ENCODING 18967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7F80 +2900 +7F80 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_4A18 +ENCODING 18968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +1F00 +1100 +1500 +1F00 +0A20 +73C0 +ENDCHAR +STARTCHAR U_4A19 +ENCODING 18969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A520 +1480 +2520 +43C0 +A880 +57E0 +3080 +E7E0 +ENDCHAR +STARTCHAR U_4A1A +ENCODING 18970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +94A0 +A520 +1FC0 +2540 +4A80 +1500 +52A0 +8F80 +ENDCHAR +STARTCHAR U_4A1B +ENCODING 18971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +A4A0 +1500 +2040 +F7E0 +2400 +77E0 +A480 +2480 +ENDCHAR +STARTCHAR U_4A1C +ENCODING 18972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +8C40 +ENDCHAR +STARTCHAR U_4A1D +ENCODING 18973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +3F80 +0400 +FFE0 +2080 +3C80 +2780 +2080 +ENDCHAR +STARTCHAR U_4A1E +ENCODING 18974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +FFE0 +A4A0 +1500 +2080 +1F00 +3F80 +2480 +FFE0 +8520 +9F20 +ENDCHAR +STARTCHAR U_4A1F +ENCODING 18975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +8420 +37C0 +9100 +47E0 +9100 +57C0 +2100 +CFE0 +ENDCHAR +STARTCHAR U_4A20 +ENCODING 18976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +7FE0 +94A0 +3F00 +2900 +3FC0 +6440 +AA40 +3F40 +0080 +ENDCHAR +STARTCHAR U_4A21 +ENCODING 18977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9540 +3F80 +0200 +3580 +8E20 +B520 +8CA0 +FFE0 +ENDCHAR +STARTCHAR U_4A22 +ENCODING 18978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1100 +7FC0 +1500 +FFE0 +2500 +2880 +3FC0 +ENDCHAR +STARTCHAR U_4A23 +ENCODING 18979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1140 +7FC0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4A24 +ENCODING 18980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +4480 +0200 +CF80 +4A80 +4F80 +6A80 +9FE0 +ENDCHAR +STARTCHAR U_4A25 +ENCODING 18981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +1200 +3FC0 +5200 +1FC0 +7100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_4A26 +ENCODING 18982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +FFE0 +A4A0 +7FC0 +1100 +FFE0 +8420 +7FC0 +1100 +2300 +ENDCHAR +STARTCHAR U_4A27 +ENCODING 18983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A4A0 +1500 +2180 +FE60 +5080 +57E0 +3A40 +C180 +ENDCHAR +STARTCHAR U_4A28 +ENCODING 18984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A520 +CFA0 +2880 +EF80 +2800 +2FC0 +6840 +9FE0 +ENDCHAR +STARTCHAR U_4A29 +ENCODING 18985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +8420 +7480 +27E0 +FAA0 +13E0 +6AA0 +ABE0 +2080 +ENDCHAR +STARTCHAR U_4A2A +ENCODING 18986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +27C0 +2540 +F7C0 +2100 +37C0 +E100 +0FE0 +ENDCHAR +STARTCHAR U_4A2B +ENCODING 18987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +FFE0 +5540 +2480 +DF60 +2900 +0600 +7900 +ENDCHAR +STARTCHAR U_4A2C +ENCODING 18988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +4880 +1DE0 +C880 +1DC0 +6AA0 +8880 +8880 +ENDCHAR +STARTCHAR U_4A2D +ENCODING 18989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +22A0 +FAA0 +A880 +FBE0 +AA20 +73E0 +0220 +FBE0 +5220 +FA60 +ENDCHAR +STARTCHAR U_4A2E +ENCODING 18990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7BC0 +1100 +7BC0 +1140 +7FE0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_4A2F +ENCODING 18991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +EFE0 +A540 +C7C0 +A540 +A7C0 +C540 +9920 +ENDCHAR +STARTCHAR U_4A30 +ENCODING 18992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +0280 +6FC0 +0280 +C7C0 +1540 +EFE0 +4100 +ENDCHAR +STARTCHAR U_4A31 +ENCODING 18993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2800 +CFE0 +3540 +C7C0 +5A40 +4180 +4E60 +ENDCHAR +STARTCHAR U_4A32 +ENCODING 18994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +2140 +FA40 +ABE0 +FAA0 +22A0 +FBE0 +4080 +F960 +A940 +AA60 +ENDCHAR +STARTCHAR U_4A33 +ENCODING 18995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +52A0 +9CE0 +ENDCHAR +STARTCHAR U_4A34 +ENCODING 18996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +D440 +5BE0 +FC40 +4A40 +FD40 +1040 +FCC0 +ENDCHAR +STARTCHAR U_4A35 +ENCODING 18997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +92A0 +4FE0 +2AA0 +8FE0 +6540 +1540 +EFE0 +4100 +ENDCHAR +STARTCHAR U_4A36 +ENCODING 18998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +2980 +5F40 +5540 +7FC0 +0A00 +FBC0 +4A40 +ENDCHAR +STARTCHAR U_4A37 +ENCODING 18999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +4880 +FDC0 +4900 +FFC0 +4A40 +7980 +8E60 +ENDCHAR +STARTCHAR U_4A38 +ENCODING 19000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +EFE0 +5540 +6FE0 +5040 +57C0 +6540 +4BA0 +ENDCHAR +STARTCHAR U_4A39 +ENCODING 19001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +9520 +2280 +5FE0 +D540 +57C0 +5100 +57C0 +4AA0 +ENDCHAR +STARTCHAR U_4A3A +ENCODING 19002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +A520 +7FE0 +1100 +FFE0 +AAA0 +7BE0 +5140 +FBA0 +ENDCHAR +STARTCHAR U_4A3B +ENCODING 19003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +2080 +FBE0 +AAA0 +71C0 +5140 +FBE0 +AAA0 +71C0 +5140 +71C0 +ENDCHAR +STARTCHAR U_4A3C +ENCODING 19004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FB60 +2140 +7BE0 +2280 +FFE0 +4A80 +7BE0 +4940 +7880 +8B60 +ENDCHAR +STARTCHAR U_4A3D +ENCODING 19005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1400 +F780 +1400 +F780 +1400 +FF80 +0100 +FF00 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_4A3E +ENCODING 19006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4500 +5DC0 +4500 +5DC0 +4500 +5DC0 +4500 +8900 +ENDCHAR +STARTCHAR U_4A3F +ENCODING 19007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0A00 +71C0 +9120 +71C0 +1100 +71C0 +1100 +61C0 +ENDCHAR +STARTCHAR U_4A40 +ENCODING 19008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +7BC0 +0A00 +FFE0 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_4A41 +ENCODING 19009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +73C0 +1D00 +77C0 +1D00 +6600 +3DC0 +E700 +31C0 +E720 +3DE0 +ENDCHAR +STARTCHAR U_4A42 +ENCODING 19010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2140 +4220 +FE20 +ABC0 +BA00 +ABE0 +BA20 +AA40 +FE40 +8280 +ENDCHAR +STARTCHAR U_4A43 +ENCODING 19011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +2280 +4280 +FEA0 +ABC0 +BA80 +AA80 +BA80 +AA80 +FFA0 +82E0 +ENDCHAR +STARTCHAR U_4A44 +ENCODING 19012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2220 +42A0 +FEA0 +AAA0 +BAA0 +AAA0 +BAA0 +AB40 +FD40 +8260 +ENDCHAR +STARTCHAR U_4A45 +ENCODING 19013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +42A0 +FE80 +AA80 +BBE0 +AAA0 +BAA0 +AA40 +FEA0 +8520 +ENDCHAR +STARTCHAR U_4A46 +ENCODING 19014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FE80 +11E0 +2280 +FE80 +AAE0 +BA80 +AA80 +BAE0 +AA80 +FE80 +ENDCHAR +STARTCHAR U_4A47 +ENCODING 19015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FE80 +20E0 +FE80 +AA80 +BBE0 +AA20 +BA20 +AA20 +FFE0 +8220 +ENDCHAR +STARTCHAR U_4A48 +ENCODING 19016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +4400 +FFC0 +AB40 +BAC0 +AFE0 +BA40 +ABE0 +FC40 +8180 +ENDCHAR +STARTCHAR U_4A49 +ENCODING 19017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FCC0 +20A0 +43E0 +FE80 +ABE0 +BAA0 +ABE0 +BAA0 +ABE0 +FEA0 +82A0 +ENDCHAR +STARTCHAR U_4A4A +ENCODING 19018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +4220 +FE00 +ABE0 +BAA0 +ABA0 +BAE0 +AA80 +FFA0 +8260 +ENDCHAR +STARTCHAR U_4A4B +ENCODING 19019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +2FE0 +4A80 +FFE0 +AA80 +BA80 +AB80 +BEC0 +AAA0 +FE80 +9280 +ENDCHAR +STARTCHAR U_4A4C +ENCODING 19020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +43E0 +FE80 +ABC0 +BA80 +ABC0 +BA80 +ABE0 +FC00 +85A0 +ENDCHAR +STARTCHAR U_4A4D +ENCODING 19021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2A40 +4420 +FFC0 +AA40 +BBC0 +AA40 +BBC0 +AAA0 +FCA0 +ENDCHAR +STARTCHAR U_4A4E +ENCODING 19022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +4FE0 +F800 +AFE0 +D920 +AFE0 +AA40 +FA40 +05A0 +ENDCHAR +STARTCHAR U_4A4F +ENCODING 19023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +27E0 +4140 +FBE0 +AAA0 +BBE0 +A840 +BBE0 +AA40 +ABE0 +FCA0 +ENDCHAR +STARTCHAR U_4A50 +ENCODING 19024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F9E0 +5200 +2400 +FBE0 +A820 +F840 +2080 +F900 +2220 +23E0 +ENDCHAR +STARTCHAR U_4A51 +ENCODING 19025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5020 +FBE0 +5020 +73E0 +2200 +FA00 +ABE0 +F820 +2020 +FA20 +21C0 +ENDCHAR +STARTCHAR U_4A52 +ENCODING 19026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBE0 +5080 +7080 +2080 +FFE0 +A880 +F880 +2080 +F880 +2180 +ENDCHAR +STARTCHAR U_4A53 +ENCODING 19027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +53E0 +7420 +2120 +F920 +AA20 +FAA0 +27A0 +F820 +20C0 +ENDCHAR +STARTCHAR U_4A54 +ENCODING 19028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29C0 +FD40 +2940 +3960 +1200 +7FE0 +5540 +7D40 +1080 +FD40 +1220 +ENDCHAR +STARTCHAR U_4A55 +ENCODING 19029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F900 +72E0 +22A0 +FAA0 +AAA0 +FAA0 +23A0 +FAE0 +20A0 +2080 +ENDCHAR +STARTCHAR U_4A56 +ENCODING 19030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +52A0 +72A0 +22A0 +FA80 +ACA0 +F840 +2080 +F900 +2600 +ENDCHAR +STARTCHAR U_4A57 +ENCODING 19031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +F9E0 +5120 +7120 +21E0 +F920 +A920 +F9E0 +2120 +FA20 +2460 +ENDCHAR +STARTCHAR U_4A58 +ENCODING 19032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBE0 +5080 +7100 +2240 +FE80 +AB00 +F940 +2240 +FEE0 +2720 +ENDCHAR +STARTCHAR U_4A59 +ENCODING 19033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F880 +57E0 +7080 +2100 +FA40 +AC80 +FB40 +2240 +FDE0 +2620 +ENDCHAR +STARTCHAR U_4A5A +ENCODING 19034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +FB80 +5280 +7280 +2280 +FBE0 +AA80 +FA80 +22A0 +FB60 +22A0 +ENDCHAR +STARTCHAR U_4A5B +ENCODING 19035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F8A0 +5020 +7140 +2140 +FB40 +ADC0 +F9A0 +2100 +FB20 +25E0 +ENDCHAR +STARTCHAR U_4A5C +ENCODING 19036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5080 +73E0 +22A0 +FAA0 +ABE0 +FAA0 +22A0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_4A5D +ENCODING 19037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5060 +FFC0 +5540 +7540 +2540 +FD40 +A940 +F940 +2AA0 +FBA0 +2820 +ENDCHAR +STARTCHAR U_4A5E +ENCODING 19038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5080 +70E0 +2080 +F880 +ABE0 +FA20 +2220 +FA20 +23E0 +ENDCHAR +STARTCHAR U_4A5F +ENCODING 19039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5080 +73E0 +20A0 +FBE0 +AA80 +FBE0 +20A0 +F940 +2620 +ENDCHAR +STARTCHAR U_4A60 +ENCODING 19040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +F820 +5740 +71C0 +2240 +FBE0 +A940 +FEE0 +2300 +FC80 +2460 +ENDCHAR +STARTCHAR U_4A61 +ENCODING 19041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +F920 +57E0 +7100 +2540 +FB40 +A9A0 +F900 +2280 +FA40 +2420 +ENDCHAR +STARTCHAR U_4A62 +ENCODING 19042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FA60 +5280 +7F80 +22E0 +FAA0 +ABA0 +FEA0 +22A0 +FAA0 +24A0 +ENDCHAR +STARTCHAR U_4A63 +ENCODING 19043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5140 +2220 +FDC0 +A880 +FBE0 +2080 +FAC0 +24A0 +2180 +ENDCHAR +STARTCHAR U_4A64 +ENCODING 19044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5240 +73C0 +2240 +FBC0 +AA40 +FBC0 +2180 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4A65 +ENCODING 19045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +F8E0 +5740 +2140 +FA60 +AF40 +F940 +2540 +F3E0 +2500 +28E0 +ENDCHAR +STARTCHAR U_4A66 +ENCODING 19046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +D680 +5180 +4740 +5100 +7FC0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4A67 +ENCODING 19047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F880 +57E0 +7000 +23C0 +F800 +ABC0 +F800 +23C0 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4A68 +ENCODING 19048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA00 +53C0 +7200 +23C0 +FA00 +AFE0 +FAA0 +22C0 +FB40 +2220 +ENDCHAR +STARTCHAR U_4A69 +ENCODING 19049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +7200 +23E0 +FDA0 +ABA0 +F9E0 +2280 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4A6A +ENCODING 19050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +73C0 +2240 +FBC0 +AA00 +FBC0 +2240 +FA40 +23C0 +ENDCHAR +STARTCHAR U_4A6B +ENCODING 19051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +F880 +53E0 +72A0 +FAA0 +ABE0 +FBE0 +22A0 +FAA0 +22A0 +2220 +ENDCHAR +STARTCHAR U_4A6C +ENCODING 19052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5080 +73C0 +F900 +AFE0 +FAA0 +25C0 +F880 +23E0 +2080 +ENDCHAR +STARTCHAR U_4A6D +ENCODING 19053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F7E0 +5180 +7240 +27E0 +F840 +ABC0 +FAC0 +23C0 +F840 +20C0 +ENDCHAR +STARTCHAR U_4A6E +ENCODING 19054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FFC0 +5440 +7780 +2080 +FFE0 +B520 +F3C0 +2540 +F920 +2300 +ENDCHAR +STARTCHAR U_4A6F +ENCODING 19055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +57E0 +F900 +5200 +FAE0 +A9A0 +FB40 +21A0 +FAA0 +2000 +27E0 +ENDCHAR +STARTCHAR U_4A70 +ENCODING 19056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +53C0 +7000 +27E0 +FAC0 +AB40 +FAC0 +2340 +FFE0 +2040 +ENDCHAR +STARTCHAR U_4A71 +ENCODING 19057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FA80 +5440 +7BA0 +2000 +FF20 +ADA0 +FFA0 +25A0 +FF20 +2560 +ENDCHAR +STARTCHAR U_4A72 +ENCODING 19058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5540 +77E0 +FD40 +ADC0 +FC00 +27C0 +FD40 +2480 +2B60 +ENDCHAR +STARTCHAR U_4A73 +ENCODING 19059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +52A0 +7480 +23C0 +F940 +AA20 +F9C0 +2140 +F880 +2140 +ENDCHAR +STARTCHAR U_4A74 +ENCODING 19060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FAE0 +57A0 +72A0 +22E0 +FFA0 +ADA0 +FDE0 +27A0 +F920 +2260 +ENDCHAR +STARTCHAR U_4A75 +ENCODING 19061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FAA0 +5080 +73E0 +22A0 +FBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_4A76 +ENCODING 19062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FAA0 +53E0 +7080 +27E0 +F880 +ABE0 +FAA0 +23E0 +F8A0 +23E0 +ENDCHAR +STARTCHAR U_4A77 +ENCODING 19063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5240 +77E0 +24A0 +FFE0 +A900 +F9E0 +2220 +FA20 +24C0 +ENDCHAR +STARTCHAR U_4A78 +ENCODING 19064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5240 +77E0 +2240 +FBC0 +AA40 +FBC0 +2240 +FFE0 +2040 +ENDCHAR +STARTCHAR U_4A79 +ENCODING 19065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F800 +53C0 +7240 +23C0 +F800 +AFE0 +FD60 +27E0 +FCA0 +24A0 +ENDCHAR +STARTCHAR U_4A7A +ENCODING 19066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FA40 +5520 +7A80 +27C0 +F800 +AFE0 +FDA0 +2360 +FDA0 +2360 +ENDCHAR +STARTCHAR U_4A7B +ENCODING 19067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FE80 +53C0 +7280 +23C0 +FA80 +ABE0 +F820 +22A0 +FD20 +20C0 +ENDCHAR +STARTCHAR U_4A7C +ENCODING 19068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +FAC0 +5120 +76C0 +23A0 +FC40 +AAE0 +FA40 +22E0 +FE40 +21E0 +ENDCHAR +STARTCHAR U_4A7D +ENCODING 19069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FC00 +55C0 +7540 +25C0 +FC00 +AFE0 +FEA0 +27E0 +FC00 +27E0 +ENDCHAR +STARTCHAR U_4A7E +ENCODING 19070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5400 +7540 +27E0 +FD40 +AD40 +FDC0 +2400 +F940 +2AA0 +ENDCHAR +STARTCHAR U_4A7F +ENCODING 19071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5540 +7FE0 +2440 +FFC0 +AC40 +FFC0 +2440 +FFC0 +2C60 +ENDCHAR +STARTCHAR U_4A80 +ENCODING 19072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +73C0 +2240 +FBE0 +AA20 +FBE0 +2520 +F440 +2BC0 +ENDCHAR +STARTCHAR U_4A81 +ENCODING 19073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FAC0 +57E0 +7280 +27E0 +F900 +ABC0 +F900 +27E0 +FA80 +2460 +ENDCHAR +STARTCHAR U_4A82 +ENCODING 19074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +7280 +2FE0 +FAA0 +AAA0 +FBA0 +26C0 +FAA0 +2280 +ENDCHAR +STARTCHAR U_4A83 +ENCODING 19075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFC0 +5040 +7760 +2580 +FF20 +A8A0 +FFA0 +2240 +FDA0 +2320 +ENDCHAR +STARTCHAR U_4A84 +ENCODING 19076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FBE0 +5140 +77E0 +2080 +FBE0 +AAA0 +FBE0 +22A0 +FBE0 +2620 +ENDCHAR +STARTCHAR U_4A85 +ENCODING 19077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FD20 +57E0 +7200 +23E0 +FD20 +ABA0 +FAA0 +23A0 +F920 +2360 +ENDCHAR +STARTCHAR U_4A86 +ENCODING 19078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +52A0 +7FE0 +2AA0 +FFE0 +AA40 +FA40 +23C0 +F940 +27E0 +ENDCHAR +STARTCHAR U_4A87 +ENCODING 19079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5240 +2120 +FFE0 +A540 +FFC0 +2540 +FFE0 +2240 +20C0 +ENDCHAR +STARTCHAR U_4A88 +ENCODING 19080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +FAE0 +56A0 +72E0 +2440 +FAE0 +AAA0 +FAA0 +26E0 +FA00 +21E0 +ENDCHAR +STARTCHAR U_4A89 +ENCODING 19081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FD40 +52A0 +7FE0 +2920 +FAA0 +AFE0 +F940 +2DC0 +FB40 +2DA0 +ENDCHAR +STARTCHAR U_4A8A +ENCODING 19082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54E0 +FF80 +52E0 +7F20 +2AE0 +FA80 +AEE0 +FA80 +2EE0 +FA80 +2AE0 +ENDCHAR +STARTCHAR U_4A8B +ENCODING 19083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +56A0 +73E0 +2080 +FFE0 +AAC0 +FB40 +2BC0 +FE20 +21E0 +ENDCHAR +STARTCHAR U_4A8C +ENCODING 19084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FC80 +57E0 +7420 +27E0 +FA40 +ABE0 +FD20 +27C0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_4A8D +ENCODING 19085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +4EE0 +7AA0 +2FE0 +F920 +AFE0 +FAA0 +2BA0 +FD60 +2920 +ENDCHAR +STARTCHAR U_4A8E +ENCODING 19086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54A0 +FFE0 +5240 +77E0 +2240 +FBE0 +AA40 +FFE0 +25A0 +FE60 +25A0 +ENDCHAR +STARTCHAR U_4A8F +ENCODING 19087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +2BE0 +FEA0 +8AA0 +FAA0 +22A0 +FB60 +A220 +FA20 +2260 +ENDCHAR +STARTCHAR U_4A90 +ENCODING 19088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F0A0 +5220 +FA40 +5240 +7660 +2AA0 +7280 +A2A0 +F920 +26C0 +ENDCHAR +STARTCHAR U_4A91 +ENCODING 19089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +2BE0 +FC20 +3000 +4A40 +3240 +7A80 +5320 +FE20 +13C0 +ENDCHAR +STARTCHAR U_4A92 +ENCODING 19090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +2BE0 +FC80 +0080 +7BE0 +4880 +7880 +5080 +FC80 +13E0 +ENDCHAR +STARTCHAR U_4A93 +ENCODING 19091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +48E0 +FC80 +0080 +7880 +4BE0 +FA20 +A220 +FA20 +23E0 +ENDCHAR +STARTCHAR U_4A94 +ENCODING 19092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +78A0 +4BE0 +F880 +03E0 +7AA0 +4BE0 +FAA0 +A3E0 +FAA0 +22A0 +ENDCHAR +STARTCHAR U_4A95 +ENCODING 19093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7A00 +4BE0 +FD20 +03A0 +7920 +4BE0 +F920 +A3A0 +F920 +2060 +ENDCHAR +STARTCHAR U_4A96 +ENCODING 19094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +2B20 +FDE0 +0120 +79E0 +4900 +7BE0 +5140 +FC80 +1360 +ENDCHAR +STARTCHAR U_4A97 +ENCODING 19095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +F760 +5520 +FF60 +5400 +76E0 +24A0 +F6A0 +A440 +F4A0 +2520 +ENDCHAR +STARTCHAR U_4A98 +ENCODING 19096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2BE0 +FE20 +4BE0 +7800 +23E0 +F880 +A2E0 +FA80 +25E0 +ENDCHAR +STARTCHAR U_4A99 +ENCODING 19097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +2880 +FFE0 +02A0 +7BE0 +4AA0 +7840 +13E0 +FD40 +10C0 +ENDCHAR +STARTCHAR U_4A9A +ENCODING 19098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2BC0 +FA40 +4BC0 +7800 +27E0 +FDA0 +A360 +FDA0 +2360 +ENDCHAR +STARTCHAR U_4A9B +ENCODING 19099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2AA0 +FFE0 +49C0 +7AA0 +23E0 +FAA0 +A3E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_4A9C +ENCODING 19100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +7BE0 +2EA0 +FB40 +4BE0 +7A00 +13E0 +FA00 +55E0 +F920 +11E0 +ENDCHAR +STARTCHAR U_4A9D +ENCODING 19101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +F7E0 +5240 +FBE0 +5680 +73E0 +2280 +77E0 +A240 +F180 +2660 +ENDCHAR +STARTCHAR U_4A9E +ENCODING 19102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +0400 +7FC0 +0A00 +3180 +CA60 +3B80 +0A00 +3B80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4A9F +ENCODING 19103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FA80 +2100 +FEE0 +AA80 +AEC0 +AA80 +BEC0 +2280 +27E0 +ENDCHAR +STARTCHAR U_4AA0 +ENCODING 19104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +92A0 +FC80 +5560 +9200 +7BC0 +0A00 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4AA1 +ENCODING 19105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F5E0 +A2A0 +FC80 +6B60 +A000 +79C0 +0900 +79C0 +0900 +FFE0 +ENDCHAR +STARTCHAR U_4AA2 +ENCODING 19106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +35E0 +E0A0 +A540 +A220 +F940 +2B60 +2940 +6B60 +A140 +23E0 +ENDCHAR +STARTCHAR U_4AA3 +ENCODING 19107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +22A0 +FC80 +A940 +A940 +BF60 +2140 +6760 +A140 +27E0 +ENDCHAR +STARTCHAR U_4AA4 +ENCODING 19108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5060 +5F80 +D540 +5FE0 +D380 +5540 +5FE0 +D540 +5FC0 +7540 +C7C0 +ENDCHAR +STARTCHAR U_4AA5 +ENCODING 19109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3A20 +2140 +F880 +8B60 +7140 +5360 +7140 +5360 +7140 +8BE0 +ENDCHAR +STARTCHAR U_4AA6 +ENCODING 19110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +4880 +3080 +FC80 +0080 +7880 +4880 +7880 +4880 +7BE0 +ENDCHAR +STARTCHAR U_4AA7 +ENCODING 19111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +4A80 +32E0 +FFA0 +02A0 +7AE0 +4A80 +7A20 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_4AA8 +ENCODING 19112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +4BE0 +3220 +FC20 +0120 +78A0 +48A0 +7820 +4820 +78C0 +ENDCHAR +STARTCHAR U_4AA9 +ENCODING 19113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +5140 +5220 +FD00 +0080 +FBE0 +8820 +F840 +8840 +F880 +ENDCHAR +STARTCHAR U_4AAA +ENCODING 19114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FDE0 +2520 +C9E0 +0400 +3FC0 +0900 +FFE0 +1280 +1480 +1F80 +ENDCHAR +STARTCHAR U_4AAB +ENCODING 19115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F940 +52A0 +2140 +FBE0 +0000 +FBE0 +8880 +F880 +8880 +FBE0 +ENDCHAR +STARTCHAR U_4AAC +ENCODING 19116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +5080 +57E0 +FC20 +03C0 +7040 +5080 +77E0 +5080 +7180 +ENDCHAR +STARTCHAR U_4AAD +ENCODING 19117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +5240 +2180 +FFE0 +0000 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_4AAE +ENCODING 19118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +9520 +63A0 +F960 +0200 +F3E0 +9520 +F7E0 +9120 +F260 +ENDCHAR +STARTCHAR U_4AAF +ENCODING 19119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +71C0 +5140 +7FE0 +8420 +7FC0 +1100 +FFE0 +1280 +1480 +1F80 +ENDCHAR +STARTCHAR U_4AB0 +ENCODING 19120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +9440 +6280 +FFE0 +0440 +F7C0 +9440 +F7C0 +9D60 +F3C0 +ENDCHAR +STARTCHAR U_4AB1 +ENCODING 19121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0900 +0BE0 +0A20 +FBE0 +8220 +8BE0 +9220 +A3E0 +C140 +8220 +ENDCHAR +STARTCHAR U_4AB2 +ENCODING 19122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FD00 +53E0 +5220 +53E0 +5220 +53E0 +5620 +5BE0 +9140 +8220 +ENDCHAR +STARTCHAR U_4AB3 +ENCODING 19123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2900 +FFE0 +2A20 +2BE0 +7A20 +23E0 +2220 +43E0 +4140 +8220 +ENDCHAR +STARTCHAR U_4AB4 +ENCODING 19124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +ABC0 +AA40 +23C0 +3240 +33C0 +5240 +57C0 +5A40 +9420 +ENDCHAR +STARTCHAR U_4AB5 +ENCODING 19125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5100 +53E0 +9220 +FBE0 +3220 +53E0 +5220 +53E0 +9140 +3220 +ENDCHAR +STARTCHAR U_4AB6 +ENCODING 19126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +7880 +4BE0 +7A20 +4BE0 +4A20 +7BE0 +4A20 +5FE0 +E140 +0220 +ENDCHAR +STARTCHAR U_4AB7 +ENCODING 19127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7C80 +45E0 +F520 +55E0 +5520 +55E0 +7520 +05E0 +04C0 +1920 +ENDCHAR +STARTCHAR U_4AB8 +ENCODING 19128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8880 +8BE0 +FA20 +A3E0 +A220 +FBE0 +A220 +93E0 +D540 +8A20 +ENDCHAR +STARTCHAR U_4AB9 +ENCODING 19129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FBE0 +2080 +73E0 +AA20 +ABE0 +A220 +23E0 +0140 +F940 +0220 +ENDCHAR +STARTCHAR U_4ABA +ENCODING 19130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2100 +FBE0 +2220 +23E0 +FA20 +23E0 +4A20 +9BE0 +E940 +0220 +ENDCHAR +STARTCHAR U_4ABB +ENCODING 19131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +47C0 +5200 +EFC0 +0440 +5740 +FC40 +5740 +5540 +9280 +1440 +ENDCHAR +STARTCHAR U_4ABC +ENCODING 19132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +A900 +ABC0 +FA40 +23C0 +AA40 +ABC0 +AA40 +FBC0 +0420 +ENDCHAR +STARTCHAR U_4ABD +ENCODING 19133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +0220 +FFE0 +2220 +7BE0 +0A20 +0BE0 +0940 +3220 +ENDCHAR +STARTCHAR U_4ABE +ENCODING 19134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +FAC0 +8C20 +F880 +8B00 +F840 +8980 +FA20 +50C0 +8B00 +ENDCHAR +STARTCHAR U_4ABF +ENCODING 19135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2080 +FBE0 +8A20 +DBE0 +AA20 +ABE0 +DA20 +8BE0 +F940 +0220 +ENDCHAR +STARTCHAR U_4AC0 +ENCODING 19136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8880 +8BE0 +FA20 +8BE0 +8A20 +FBE0 +8220 +ABE0 +9140 +CA20 +ENDCHAR +STARTCHAR U_4AC1 +ENCODING 19137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +4080 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8940 +0220 +ENDCHAR +STARTCHAR U_4AC2 +ENCODING 19138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7880 +93E0 +6220 +53E0 +9A20 +27E0 +5A20 +13E0 +6140 +8220 +ENDCHAR +STARTCHAR U_4AC3 +ENCODING 19139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8080 +F3E0 +8220 +F3E0 +A220 +ABE0 +B220 +ABE0 +A540 +B220 +ENDCHAR +STARTCHAR U_4AC4 +ENCODING 19140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5080 +0100 +FBE0 +8A20 +8BA0 +FAE0 +5220 +53E0 +5940 +9220 +ENDCHAR +STARTCHAR U_4AC5 +ENCODING 19141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +8BE0 +2220 +FBE0 +2220 +73E0 +6A20 +ABE0 +2140 +2220 +ENDCHAR +STARTCHAR U_4AC6 +ENCODING 19142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +0A80 +7DE0 +4920 +4BE0 +7520 +55E0 +5520 +75E0 +8AC0 +8320 +ENDCHAR +STARTCHAR U_4AC7 +ENCODING 19143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0900 +F3E0 +0A20 +F3E0 +6220 +93E0 +FA20 +93E0 +F940 +9220 +ENDCHAR +STARTCHAR U_4AC8 +ENCODING 19144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +FBE0 +5220 +8BE0 +7220 +03E0 +FA20 +13E0 +1140 +2220 +ENDCHAR +STARTCHAR U_4AC9 +ENCODING 19145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +A880 +53E0 +2220 +D3E0 +2A20 +5BE0 +2A20 +CBE0 +3140 +1220 +ENDCHAR +STARTCHAR U_4ACA +ENCODING 19146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1080 +23E0 +7220 +ABE0 +2220 +FBE0 +8A20 +8BE0 +F940 +8A20 +ENDCHAR +STARTCHAR U_4ACB +ENCODING 19147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +2100 +FBC0 +7240 +ABC0 +2240 +FBC0 +5240 +93C0 +7240 +8C20 +ENDCHAR +STARTCHAR U_4ACC +ENCODING 19148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F900 +ABE0 +FA20 +ABE0 +FA20 +43E0 +A220 +FBE0 +2140 +2220 +ENDCHAR +STARTCHAR U_4ACD +ENCODING 19149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2900 +EFE0 +2A20 +6FE0 +2A20 +6FE0 +AA20 +2BE0 +4940 +8A20 +ENDCHAR +STARTCHAR U_4ACE +ENCODING 19150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +B480 +49E0 +4920 +B5E0 +0120 +FDE0 +B520 +49E0 +48C0 +B520 +ENDCHAR +STARTCHAR U_4ACF +ENCODING 19151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +FD00 +4BE0 +7A20 +4BE0 +7A20 +4BE0 +FE20 +4BE0 +4940 +8620 +ENDCHAR +STARTCHAR U_4AD0 +ENCODING 19152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4900 +FFE0 +4A20 +7BE0 +DE20 +DBE0 +6A20 +6BE0 +4940 +4A20 +ENDCHAR +STARTCHAR U_4AD1 +ENCODING 19153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +23E0 +5220 +FFE0 +0A20 +EBE0 +AA20 +EBE0 +0940 +1A20 +ENDCHAR +STARTCHAR U_4AD2 +ENCODING 19154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A100 +FBE0 +A220 +97E0 +CA20 +FBE0 +8A20 +FBE0 +8940 +FA20 +ENDCHAR +STARTCHAR U_4AD3 +ENCODING 19155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2100 +FBE0 +4A20 +53E0 +FA20 +03E0 +FA20 +8BE0 +8940 +FA20 +ENDCHAR +STARTCHAR U_4AD4 +ENCODING 19156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +FC80 +55E0 +F620 +47E0 +EA20 +53E0 +FE20 +11E0 +2940 +C620 +ENDCHAR +STARTCHAR U_4AD5 +ENCODING 19157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F900 +53E0 +5220 +FFE0 +A620 +7BE0 +AA20 +ABE0 +B940 +2220 +ENDCHAR +STARTCHAR U_4AD6 +ENCODING 19158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FC80 +49E0 +7920 +49E0 +7920 +49E0 +FD20 +A9E0 +C4C0 +FD20 +ENDCHAR +STARTCHAR U_4AD7 +ENCODING 19159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EDE0 +A480 +A7E0 +EA20 +83E0 +EE20 +8BE0 +EA20 +8BE0 +8540 +9A20 +ENDCHAR +STARTCHAR U_4AD8 +ENCODING 19160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +79E0 +4920 +79E0 +4120 +BDE0 +5520 +6DE0 +74C0 +0920 +ENDCHAR +STARTCHAR U_4AD9 +ENCODING 19161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +23E0 +5220 +FBE0 +5220 +23E0 +FA20 +73E0 +B140 +AA20 +ENDCHAR +STARTCHAR U_4ADA +ENCODING 19162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4480 +75E0 +5520 +55E0 +FD20 +85E0 +BD20 +ADE0 +BCC0 +8520 +ENDCHAR +STARTCHAR U_4ADB +ENCODING 19163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +3C80 +45E0 +7F20 +D1E0 +5D20 +69E0 +7F20 +49E0 +54C0 +6320 +ENDCHAR +STARTCHAR U_4ADC +ENCODING 19164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +A880 +BBE0 +EA20 +BBE0 +AA20 +EBE0 +BA20 +ABE0 +F940 +8A20 +ENDCHAR +STARTCHAR U_4ADD +ENCODING 19165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E100 +23E0 +FA20 +73E0 +AA20 +FBE0 +8A20 +FBE0 +8940 +FA20 +ENDCHAR +STARTCHAR U_4ADE +ENCODING 19166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5080 +FBE0 +2220 +FBE0 +2220 +23E0 +FA20 +03E0 +A940 +AA20 +ENDCHAR +STARTCHAR U_4ADF +ENCODING 19167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4900 +7BE0 +0220 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +5140 +8A20 +ENDCHAR +STARTCHAR U_4AE0 +ENCODING 19168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +5080 +ABE0 +5220 +FFE0 +2220 +7BE0 +A620 +7BE0 +4940 +7A20 +ENDCHAR +STARTCHAR U_4AE1 +ENCODING 19169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51E0 +FC80 +51E0 +FD20 +55E0 +FF20 +55E0 +FD20 +51E0 +D8C0 +D520 +ENDCHAR +STARTCHAR U_4AE2 +ENCODING 19170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9080 +BFE0 +AA20 +BDE0 +A920 +ADE0 +A120 +ADE0 +5480 +A720 +ENDCHAR +STARTCHAR U_4AE3 +ENCODING 19171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +C900 +ABE0 +5220 +9BE0 +7220 +8BE0 +7620 +23E0 +FD40 +4A20 +ENDCHAR +STARTCHAR U_4AE4 +ENCODING 19172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4240 +BDE0 +3520 +2DA0 +3D60 +1120 +7DE0 +1040 +28C0 +4520 +ENDCHAR +STARTCHAR U_4AE5 +ENCODING 19173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F900 +ABC0 +FA40 +ABC0 +FA40 +2BC0 +7640 +6BC0 +A420 +9FE0 +ENDCHAR +STARTCHAR U_4AE6 +ENCODING 19174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F900 +23E0 +FE20 +23E0 +4A20 +FFE0 +0220 +FFE0 +AB40 +FE20 +ENDCHAR +STARTCHAR U_4AE7 +ENCODING 19175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F900 +8BE0 +FA20 +8BE0 +FA20 +23E0 +DA20 +ABE0 +F940 +2220 +ENDCHAR +STARTCHAR U_4AE8 +ENCODING 19176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +F440 +27E0 +F5A0 +29E0 +F5A0 +42E0 +72A0 +55E0 +94A0 +B920 +ENDCHAR +STARTCHAR U_4AE9 +ENCODING 19177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7880 +49E0 +9520 +FFE0 +5520 +A9E0 +1520 +61E0 +08C0 +7120 +ENDCHAR +STARTCHAR U_4AEA +ENCODING 19178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FE80 +11E0 +BB20 +55E0 +BB20 +55E0 +BB20 +11E0 +2880 +C520 +ENDCHAR +STARTCHAR U_4AEB +ENCODING 19179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +ABC0 +FE40 +ABC0 +FA40 +ABC0 +FA40 +53C0 +7140 +CA20 +ENDCHAR +STARTCHAR U_4AEC +ENCODING 19180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +A880 +FFE0 +5520 +B7E0 +2520 +79E0 +4920 +79E0 +4880 +7920 +ENDCHAR +STARTCHAR U_4AED +ENCODING 19181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7C80 +55E0 +FF20 +01E0 +7D20 +45E0 +5520 +55E0 +2880 +4520 +ENDCHAR +STARTCHAR U_4AEE +ENCODING 19182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +0880 +FFE0 +0920 +F5E0 +5520 +EDE0 +0920 +FFE0 +4880 +1920 +ENDCHAR +STARTCHAR U_4AEF +ENCODING 19183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +2F40 +F4E0 +4AA0 +7FE0 +52A0 +5EE0 +5AA0 +5EE0 +9240 +B6A0 +ENDCHAR +STARTCHAR U_4AF0 +ENCODING 19184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +4540 +FFE0 +9540 +F920 +9540 +F7E0 +9940 +F5E0 +5240 +9440 +ENDCHAR +STARTCHAR U_4AF1 +ENCODING 19185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +2040 +FEE0 +AAA0 +AAE0 +00A0 +FEE0 +20A0 +FEE0 +AA40 +AAA0 +ENDCHAR +STARTCHAR U_4AF2 +ENCODING 19186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +7E80 +51E0 +7920 +4BE0 +7520 +D5E0 +7B20 +29E0 +A2A0 +9F20 +ENDCHAR +STARTCHAR U_4AF3 +ENCODING 19187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA80 +FFE0 +4120 +7FE0 +9120 +7DE0 +5520 +7DE0 +14C0 +7B20 +ENDCHAR +STARTCHAR U_4AF4 +ENCODING 19188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +FE80 +75E0 +AF20 +25E0 +7D20 +01E0 +FF20 +39E0 +5540 +9220 +ENDCHAR +STARTCHAR U_4AF5 +ENCODING 19189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +A5E0 +FD20 +11E0 +FD20 +ABE0 +4520 +FDE0 +48A0 +9920 +ENDCHAR +STARTCHAR U_4AF6 +ENCODING 19190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +EF40 +52E0 +6BA0 +CEE0 +52A0 +6AE0 +10A0 +FEE0 +2840 +C5A0 +ENDCHAR +STARTCHAR U_4AF7 +ENCODING 19191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2080 +F9E0 +A920 +FDE0 +2120 +F9E0 +A920 +F9E0 +2120 +FE20 +ENDCHAR +STARTCHAR U_4AF8 +ENCODING 19192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +42A0 +7EA0 +4AA0 +7EA0 +4AA0 +7F20 +4A60 +4F20 +B0E0 +ENDCHAR +STARTCHAR U_4AF9 +ENCODING 19193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +47E0 +7C80 +5480 +7C80 +5480 +7C80 +57E0 +5C00 +6620 +81E0 +ENDCHAR +STARTCHAR U_4AFA +ENCODING 19194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2540 +27C0 +4540 +57C0 +9540 +AD40 +7BA0 +08A0 +ENDCHAR +STARTCHAR U_4AFB +ENCODING 19195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +45C0 +7D40 +5540 +7DC0 +5540 +7D40 +55C0 +5A00 +BD20 +80E0 +ENDCHAR +STARTCHAR U_4AFC +ENCODING 19196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4D00 +77C0 +5540 +7D40 +57E0 +7D40 +5520 +5E20 +7400 +83E0 +ENDCHAR +STARTCHAR U_4AFD +ENCODING 19197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +45E0 +7C80 +57E0 +7C80 +57E0 +7C80 +54E0 +5C00 +7220 +81E0 +ENDCHAR +STARTCHAR U_4AFE +ENCODING 19198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4440 +7D20 +5740 +7DA0 +5700 +7D20 +54E0 +5C00 +B220 +81E0 +ENDCHAR +STARTCHAR U_4AFF +ENCODING 19199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +47E0 +7CA0 +5520 +7E60 +5400 +7DE0 +5520 +5DE0 +7300 +80E0 +ENDCHAR +STARTCHAR U_4B00 +ENCODING 19200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +8AE0 +FDA0 +ADA0 +FAA0 +ADA0 +FDA0 +AAA0 +B960 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B01 +ENCODING 19201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4440 +7DE0 +5620 +7D00 +55C0 +7D00 +5520 +55E0 +7A00 +81E0 +ENDCHAR +STARTCHAR U_4B02 +ENCODING 19202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8BE0 +FA80 +AAA0 +FAA0 +AA40 +FAC0 +AB20 +BA20 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B03 +ENCODING 19203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +4480 +7FE0 +5440 +7D40 +5540 +7C80 +57E0 +5C00 +6220 +81E0 +ENDCHAR +STARTCHAR U_4B04 +ENCODING 19204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8BE0 +FA80 +AA80 +FBA0 +AAC0 +FA40 +ACA0 +BB00 +E420 +83E0 +ENDCHAR +STARTCHAR U_4B05 +ENCODING 19205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FC0 +F940 +A940 +FA40 +AFE0 +FB60 +ADA0 +B960 +E400 +83E0 +ENDCHAR +STARTCHAR U_4B06 +ENCODING 19206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +8E20 +FAA0 +AFA0 +FAA0 +AEA0 +FBA0 +AA20 +AA60 +B400 +83E0 +ENDCHAR +STARTCHAR U_4B07 +ENCODING 19207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +6440 +F7C0 +9540 +97C0 +F540 +47C0 +6540 +65C0 +B660 +A820 +ENDCHAR +STARTCHAR U_4B08 +ENCODING 19208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8A20 +FFE0 +AA20 +FBE0 +A940 +F940 +A940 +BA60 +C420 +83E0 +ENDCHAR +STARTCHAR U_4B09 +ENCODING 19209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +89C0 +F880 +ABE0 +F940 +AB60 +FD40 +A940 +BA40 +E420 +83E0 +ENDCHAR +STARTCHAR U_4B0A +ENCODING 19210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F880 +AAA0 +FAA0 +ADC0 +F940 +AA20 +B400 +EA20 +81E0 +ENDCHAR +STARTCHAR U_4B0B +ENCODING 19211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +45C0 +7C80 +57E0 +7D40 +56A0 +7DC0 +5740 +5C80 +7340 +81E0 +ENDCHAR +STARTCHAR U_4B0C +ENCODING 19212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7E20 +53E0 +7E20 +53E0 +5EA0 +43E0 +7AA0 +AAE0 +AB20 +4C20 +ENDCHAR +STARTCHAR U_4B0D +ENCODING 19213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8FE0 +FAA0 +AAA0 +FD20 +A940 +FAA0 +AE40 +B9C0 +C420 +83E0 +ENDCHAR +STARTCHAR U_4B0E +ENCODING 19214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8FE0 +F880 +AFA0 +FD40 +AF40 +F840 +AFA0 +B8A0 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B0F +ENCODING 19215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +5480 +7FE0 +5400 +7DC0 +5540 +5DC0 +7220 +81E0 +ENDCHAR +STARTCHAR U_4B10 +ENCODING 19216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4480 +7FE0 +55C0 +7EA0 +57E0 +7D40 +5480 +5F60 +6400 +83E0 +ENDCHAR +STARTCHAR U_4B11 +ENCODING 19217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +FBE0 +AAA0 +FBE0 +A940 +F9C0 +A940 +A9C0 +F540 +93E0 +ENDCHAR +STARTCHAR U_4B12 +ENCODING 19218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +FAA0 +AD40 +F980 +AE60 +FBC0 +AA40 +B980 +E640 +83E0 +ENDCHAR +STARTCHAR U_4B13 +ENCODING 19219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +8880 +FBE0 +A940 +FBE0 +A940 +F9C0 +A940 +B9C0 +C420 +83E0 +ENDCHAR +STARTCHAR U_4B14 +ENCODING 19220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8940 +FBE0 +AC00 +FBA0 +AAA0 +FBA0 +AAA0 +BAA0 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B15 +ENCODING 19221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +BAE0 +CB20 +8C20 +ENDCHAR +STARTCHAR U_4B16 +ENCODING 19222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BE0 +FAA0 +AB20 +FBE0 +A880 +FBE0 +A880 +BBE0 +C400 +83E0 +ENDCHAR +STARTCHAR U_4B17 +ENCODING 19223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +7BE0 +4AA0 +FFE0 +42A0 +FBE0 +5AA0 +AAA0 +4BE0 +3420 +ENDCHAR +STARTCHAR U_4B18 +ENCODING 19224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F940 +A940 +FBE0 +AA20 +FBA0 +AAA0 +BBA0 +EA20 +87E0 +ENDCHAR +STARTCHAR U_4B19 +ENCODING 19225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +8E40 +FB80 +AE80 +FBE0 +A880 +FFE0 +AAA0 +ABE0 +FC00 +83E0 +ENDCHAR +STARTCHAR U_4B1A +ENCODING 19226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9A80 +EBC0 +AA80 +FBC0 +AA80 +FBE0 +AAA0 +BD60 +EEA0 +83E0 +ENDCHAR +STARTCHAR U_4B1B +ENCODING 19227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +FBE0 +AAA0 +F9C0 +AAA0 +FFE0 +AAA0 +BFE0 +E880 +87E0 +ENDCHAR +STARTCHAR U_4B1C +ENCODING 19228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +F940 +AAA0 +FBE0 +A880 +FBE0 +AAA0 +ABE0 +F620 +81E0 +ENDCHAR +STARTCHAR U_4B1D +ENCODING 19229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8BE0 +F940 +AFE0 +FAA0 +ABE0 +FAA0 +ABE0 +B940 +E620 +83E0 +ENDCHAR +STARTCHAR U_4B1E +ENCODING 19230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F880 +ABE0 +F920 +AFE0 +F920 +AFA0 +B860 +E420 +83E0 +ENDCHAR +STARTCHAR U_4B1F +ENCODING 19231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDA0 +89A0 +FEA0 +A9A0 +FF20 +AAA0 +FFA0 +AAA0 +BF60 +E400 +83E0 +ENDCHAR +STARTCHAR U_4B20 +ENCODING 19232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +A4A0 +3F40 +6580 +2540 +FEE0 +2580 +2540 +44E0 +ENDCHAR +STARTCHAR U_4B21 +ENCODING 19233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0500 +FFE0 +3280 +D480 +7FA0 +24C0 +FFE0 +2480 +4460 +ENDCHAR +STARTCHAR U_4B22 +ENCODING 19234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4920 +B120 +4920 +7920 +4920 +7920 +4220 +5A20 +6CC0 +ENDCHAR +STARTCHAR U_4B23 +ENCODING 19235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +EC00 +0000 +FBC0 +A840 +A880 +F900 +8200 +B220 +C9E0 +ENDCHAR +STARTCHAR U_4B24 +ENCODING 19236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4600 +4D00 +72C0 +5F80 +5480 +5F40 +5580 +98C0 +ENDCHAR +STARTCHAR U_4B25 +ENCODING 19237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +0100 +08A0 +1660 +2980 +FF60 +2900 +3F80 +2500 +3BC0 +ENDCHAR +STARTCHAR U_4B26 +ENCODING 19238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +4A40 +A640 +7A20 +4C00 +7BC0 +4A40 +7A40 +4180 +5240 +6C20 +ENDCHAR +STARTCHAR U_4B27 +ENCODING 19239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4800 +B000 +4FE0 +7A80 +4A80 +7A80 +4280 +5AA0 +6C60 +ENDCHAR +STARTCHAR U_4B28 +ENCODING 19240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4FE0 +B220 +4FA0 +7AA0 +4AA0 +7AA0 +54E0 +5820 +68C0 +ENDCHAR +STARTCHAR U_4B29 +ENCODING 19241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0C00 +3580 +C460 +1F00 +E4E0 +3F80 +2480 +3FC0 +2A80 +31E0 +ENDCHAR +STARTCHAR U_4B2A +ENCODING 19242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4880 +B080 +4980 +7AC0 +4CA0 +7880 +5080 +5880 +6880 +ENDCHAR +STARTCHAR U_4B2B +ENCODING 19243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4A80 +B280 +4BE0 +7A80 +4A80 +7A80 +5240 +5B60 +6AA0 +ENDCHAR +STARTCHAR U_4B2C +ENCODING 19244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +AFC0 +F540 +9540 +F540 +9FE0 +F100 +8280 +B440 +D820 +ENDCHAR +STARTCHAR U_4B2D +ENCODING 19245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4920 +7920 +4260 +1F00 +E4E0 +3F80 +2480 +3FC0 +2A80 +31E0 +ENDCHAR +STARTCHAR U_4B2E +ENCODING 19246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5440 +AC40 +F440 +9640 +F540 +95C0 +F640 +A440 +B0A0 +D320 +ENDCHAR +STARTCHAR U_4B2F +ENCODING 19247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +48E0 +B080 +4880 +7BE0 +4A20 +7A20 +4220 +5BE0 +6A20 +ENDCHAR +STARTCHAR U_4B30 +ENCODING 19248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +48A0 +A4A0 +78A0 +4920 +7960 +4A20 +79E0 +4120 +5920 +69E0 +ENDCHAR +STARTCHAR U_4B31 +ENCODING 19249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5100 +AFE0 +7100 +5380 +7540 +5920 +77C0 +5100 +6900 +ENDCHAR +STARTCHAR U_4B32 +ENCODING 19250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3200 +4FE0 +A420 +FBA0 +4AA0 +7AA0 +4BA0 +7820 +5020 +68E0 +ENDCHAR +STARTCHAR U_4B33 +ENCODING 19251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +49C0 +F880 +4BE0 +7880 +4880 +7BE0 +5080 +5880 +6880 +ENDCHAR +STARTCHAR U_4B34 +ENCODING 19252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +8000 +47E0 +3100 +1100 +8100 +6680 +1100 +0100 +F100 +06E0 +ENDCHAR +STARTCHAR U_4B35 +ENCODING 19253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +6FE0 +8100 +7220 +57C0 +7080 +5320 +74C0 +5140 +6A20 +ENDCHAR +STARTCHAR U_4B36 +ENCODING 19254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +AFC0 +F440 +97C0 +F500 +9520 +F4C0 +8480 +B540 +D620 +ENDCHAR +STARTCHAR U_4B37 +ENCODING 19255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +31E0 +6A40 +9580 +7900 +4A80 +7D60 +4A20 +7940 +5080 +6F00 +ENDCHAR +STARTCHAR U_4B38 +ENCODING 19256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2140 +5180 +D640 +2A20 +D500 +2E80 +D160 +1E00 +1500 +3BC0 +ENDCHAR +STARTCHAR U_4B39 +ENCODING 19257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BE0 +6480 +9140 +7BE0 +4880 +7880 +49C0 +7880 +5080 +6BE0 +ENDCHAR +STARTCHAR U_4B3A +ENCODING 19258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +F100 +97C0 +F100 +9100 +FFE0 +A100 +B100 +D100 +ENDCHAR +STARTCHAR U_4B3B +ENCODING 19259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3120 +4FE0 +7900 +CFE0 +7900 +4FE0 +7920 +4140 +51A0 +6E60 +ENDCHAR +STARTCHAR U_4B3C +ENCODING 19260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2A20 +57E0 +F800 +4BE0 +7A20 +4BE0 +7A20 +43E0 +5A20 +6A60 +ENDCHAR +STARTCHAR U_4B3D +ENCODING 19261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5440 +E820 +07C0 +7440 +5440 +77C0 +5280 +6280 +54A0 +68E0 +ENDCHAR +STARTCHAR U_4B3E +ENCODING 19262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +F120 +97E0 +F500 +97E0 +F120 +8320 +B560 +D900 +ENDCHAR +STARTCHAR U_4B3F +ENCODING 19263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +6BE0 +BE40 +4B80 +7AE0 +4B80 +7AE0 +4580 +54A0 +68E0 +ENDCHAR +STARTCHAR U_4B40 +ENCODING 19264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53C0 +A940 +F540 +9F40 +F5C0 +9540 +F540 +A660 +BC40 +D3E0 +ENDCHAR +STARTCHAR U_4B41 +ENCODING 19265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +F240 +2E40 +3580 +FF60 +2900 +3F80 +2500 +33C0 +ENDCHAR +STARTCHAR U_4B42 +ENCODING 19266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2A40 +67C0 +9000 +7BE0 +4AA0 +7AA0 +4BE0 +7A00 +5220 +6BE0 +ENDCHAR +STARTCHAR U_4B43 +ENCODING 19267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +AE60 +F100 +97C0 +F040 +9180 +F240 +A520 +B440 +CBC0 +ENDCHAR +STARTCHAR U_4B44 +ENCODING 19268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +A540 +F7C0 +9100 +F7C0 +9140 +FFE0 +A140 +B7C0 +D100 +ENDCHAR +STARTCHAR U_4B45 +ENCODING 19269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7520 +AFE0 +7520 +5520 +77A0 +54A0 +77A0 +4C20 +57E0 +7420 +ENDCHAR +STARTCHAR U_4B46 +ENCODING 19270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +9080 +E940 +9220 +EE00 +3580 +DF60 +2900 +3F80 +2500 +33C0 +ENDCHAR +STARTCHAR U_4B47 +ENCODING 19271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +57E0 +AC20 +F120 +97E0 +F120 +93A0 +F2A0 +83A0 +9020 +E9C0 +ENDCHAR +STARTCHAR U_4B48 +ENCODING 19272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +51E0 +AEA0 +F3E0 +94A0 +F5E0 +9280 +F280 +8DE0 +A480 +DBE0 +ENDCHAR +STARTCHAR U_4B49 +ENCODING 19273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +57E0 +AA00 +F3C0 +9480 +FFE0 +9240 +F3C0 +A240 +B3C0 +D440 +ENDCHAR +STARTCHAR U_4B4A +ENCODING 19274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6280 +5FE0 +AA80 +F100 +97C0 +F540 +9540 +FFE0 +A100 +B240 +DC20 +ENDCHAR +STARTCHAR U_4B4B +ENCODING 19275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +55E0 +AD20 +F5E0 +9480 +F7E0 +9480 +F5C0 +A5A0 +B6A0 +D480 +ENDCHAR +STARTCHAR U_4B4C +ENCODING 19276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +8AC0 +7F40 +A4E0 +3F00 +2940 +3F80 +20C0 +ENDCHAR +STARTCHAR U_4B4D +ENCODING 19277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +A900 +F3C0 +9100 +FFE0 +9000 +F7C0 +A540 +B540 +CFE0 +ENDCHAR +STARTCHAR U_4B4E +ENCODING 19278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +57E0 +AD40 +F5C0 +9400 +F7C0 +9100 +FFE0 +A100 +B540 +D920 +ENDCHAR +STARTCHAR U_4B4F +ENCODING 19279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +6FE0 +9820 +EFE0 +A800 +EFE0 +AAA0 +EFE0 +8AA0 +AAA0 +D060 +ENDCHAR +STARTCHAR U_4B50 +ENCODING 19280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +7100 +57C0 +7100 +5FE0 +7200 +5540 +7C60 +4B80 +ENDCHAR +STARTCHAR U_4B51 +ENCODING 19281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FE0 +B280 +07E0 +72A0 +57E0 +72A0 +47E0 +5280 +6AA0 +ENDCHAR +STARTCHAR U_4B52 +ENCODING 19282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5200 +EBE0 +82A0 +7360 +52A0 +73E0 +5100 +66A0 +5A00 +69E0 +ENDCHAR +STARTCHAR U_4B53 +ENCODING 19283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +77C0 +E800 +77C0 +5000 +7380 +5280 +7380 +5440 +5A80 +6FE0 +ENDCHAR +STARTCHAR U_4B54 +ENCODING 19284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +6900 +D5C0 +F140 +9DC0 +F500 +95C0 +F940 +A5C0 +B400 +CBE0 +ENDCHAR +STARTCHAR U_4B55 +ENCODING 19285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA00 +FBE0 +AA40 +F440 +2E40 +3580 +DF60 +1100 +1F00 +1080 +ENDCHAR +STARTCHAR U_4B56 +ENCODING 19286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4A40 +EA40 +AFE0 +EA40 +ABC0 +E800 +8A40 +ADA0 +D4A0 +ENDCHAR +STARTCHAR U_4B57 +ENCODING 19287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +33E0 +4940 +FBE0 +4A20 +7BE0 +4A20 +7BE0 +5140 +5A40 +6C60 +ENDCHAR +STARTCHAR U_4B58 +ENCODING 19288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5340 +BAC0 +03C0 +7880 +6FE0 +5BC0 +7A40 +63C0 +52C0 +6DA0 +ENDCHAR +STARTCHAR U_4B59 +ENCODING 19289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +56C0 +AB40 +7FE0 +56C0 +7B60 +57C0 +7440 +67C0 +5440 +77C0 +ENDCHAR +STARTCHAR U_4B5A +ENCODING 19290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +EA80 +7FE0 +5540 +77C0 +5540 +77C0 +6100 +77C0 +5FE0 +ENDCHAR +STARTCHAR U_4B5B +ENCODING 19291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +57C0 +8A60 +F7A0 +55A0 +75A0 +5760 +7540 +57E0 +6D40 +41A0 +ENDCHAR +STARTCHAR U_4B5C +ENCODING 19292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +BFE0 +D540 +EF80 +B8C0 +EFA0 +A880 +EF80 +8A80 +F240 +A220 +ENDCHAR +STARTCHAR U_4B5D +ENCODING 19293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2880 +5540 +FAA0 +4FE0 +7AA0 +4BE0 +7A20 +43E0 +5220 +6BE0 +ENDCHAR +STARTCHAR U_4B5E +ENCODING 19294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6AA0 +9FE0 +4100 +F7C0 +9FE0 +F280 +97C0 +F100 +AFE0 +F100 +ENDCHAR +STARTCHAR U_4B5F +ENCODING 19295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3140 +2B60 +7EA0 +83E0 +7AA0 +4AE0 +7A00 +4BE0 +7880 +53E0 +6AA0 +ENDCHAR +STARTCHAR U_4B60 +ENCODING 19296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4A80 +EFE0 +AAA0 +EFE0 +AAA0 +EFE0 +8A80 +EEC0 +B2A0 +ENDCHAR +STARTCHAR U_4B61 +ENCODING 19297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +52A0 +AFE0 +F080 +97E0 +F020 +97E0 +F020 +87E0 +A540 +DBA0 +ENDCHAR +STARTCHAR U_4B62 +ENCODING 19298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +A920 +F6A0 +9BC0 +F540 +9FE0 +F000 +9FE0 +A100 +D300 +ENDCHAR +STARTCHAR U_4B63 +ENCODING 19299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A940 +7EC0 +56A0 +7AC0 +5240 +73C0 +4240 +53C0 +7440 +ENDCHAR +STARTCHAR U_4B64 +ENCODING 19300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +AAA0 +77E0 +5140 +7F40 +55E0 +7520 +45E0 +5E00 +71E0 +ENDCHAR +STARTCHAR U_4B65 +ENCODING 19301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +A900 +77C0 +5100 +77E0 +5540 +7FE0 +4540 +57C0 +7460 +ENDCHAR +STARTCHAR U_4B66 +ENCODING 19302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +AAC0 +77E0 +52A0 +7BE0 +56A0 +7440 +47E0 +5940 +68C0 +ENDCHAR +STARTCHAR U_4B67 +ENCODING 19303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +5A40 +EFE0 +AA40 +EEE0 +AB40 +E980 +8A40 +AFE0 +F540 +ENDCHAR +STARTCHAR U_4B68 +ENCODING 19304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +AFE0 +5280 +E7E0 +AC80 +E7E0 +A480 +EFE0 +8AA0 +AFE0 +E820 +ENDCHAR +STARTCHAR U_4B69 +ENCODING 19305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4A40 +EFE0 +AAC0 +EF60 +AA40 +EF60 +8940 +AF60 +F140 +ENDCHAR +STARTCHAR U_4B6A +ENCODING 19306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +4240 +7BC0 +AA40 +2FE0 +2540 +27C0 +2540 +37C0 +6100 +0FE0 +ENDCHAR +STARTCHAR U_4B6B +ENCODING 19307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +F280 +8FE0 +9200 +F7C0 +0440 +F7C0 +9440 +F7C0 +9440 +F7C0 +ENDCHAR +STARTCHAR U_4B6C +ENCODING 19308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8540 +8A80 +F540 +8FC0 +F200 +07C0 +F540 +96C0 +F540 +9640 +F7C0 +ENDCHAR +STARTCHAR U_4B6D +ENCODING 19309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +FD00 +23E0 +7A20 +4BE0 +7A20 +4BE0 +7A20 +4BE0 +7940 +0220 +ENDCHAR +STARTCHAR U_4B6E +ENCODING 19310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +49A0 +5040 +FDA0 +4940 +FFE0 +0800 +1F80 +1280 +1280 +1F80 +ENDCHAR +STARTCHAR U_4B6F +ENCODING 19311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +2080 +FAA0 +72A0 +AAA0 +ABE0 +7080 +52A0 +72A0 +52A0 +73E0 +ENDCHAR +STARTCHAR U_4B70 +ENCODING 19312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27E0 +F900 +77C0 +AA00 +2FE0 +7540 +5BA0 +7100 +57C0 +7100 +ENDCHAR +STARTCHAR U_4B71 +ENCODING 19313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +74A0 +22A0 +FAC0 +27E0 +74A0 +ADA0 +75E0 +56A0 +74A0 +54A0 +74E0 +ENDCHAR +STARTCHAR U_4B72 +ENCODING 19314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27E0 +F980 +2240 +7420 +AFE0 +7040 +5740 +7540 +5740 +70C0 +ENDCHAR +STARTCHAR U_4B73 +ENCODING 19315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23E0 +FAA0 +23E0 +DD80 +5660 +FFE0 +2480 +DFE0 +1280 +1F80 +ENDCHAR +STARTCHAR U_4B74 +ENCODING 19316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4400 +7FC0 +4400 +7FE0 +92A0 +9240 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4B75 +ENCODING 19317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +A240 +F240 +A240 +F340 +A2C0 +FA40 +2A40 +AA40 +8C40 +3860 +ENDCHAR +STARTCHAR U_4B76 +ENCODING 19318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +A7E0 +F140 +A140 +F140 +A140 +F940 +0A40 +AA40 +8A40 +3440 +ENDCHAR +STARTCHAR U_4B77 +ENCODING 19319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1C0 +A700 +F100 +A7C0 +F100 +A100 +FFE0 +0900 +5900 +A920 +10E0 +ENDCHAR +STARTCHAR U_4B78 +ENCODING 19320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A220 +F420 +A240 +F240 +A240 +FA40 +0980 +A980 +8A40 +3420 +ENDCHAR +STARTCHAR U_4B79 +ENCODING 19321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A6E0 +F4A0 +A4A0 +F4A0 +A4A0 +F5A0 +0EA0 +A8E0 +8880 +3080 +ENDCHAR +STARTCHAR U_4B7A +ENCODING 19322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +A100 +F7E0 +A000 +F380 +A280 +FA80 +0AA0 +AAA0 +8AA0 +3460 +ENDCHAR +STARTCHAR U_4B7B +ENCODING 19323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +A240 +F240 +A420 +F3C0 +A940 +F940 +0A40 +AA40 +8D40 +3080 +ENDCHAR +STARTCHAR U_4B7C +ENCODING 19324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +5000 +7800 +53E0 +7940 +5140 +7D40 +0540 +F540 +8A40 +3440 +ENDCHAR +STARTCHAR U_4B7D +ENCODING 19325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5280 +7BE0 +5280 +7C80 +5080 +7FE0 +0880 +A880 +8880 +1080 +ENDCHAR +STARTCHAR U_4B7E +ENCODING 19326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5140 +7920 +57E0 +7900 +5100 +7900 +0A80 +AA80 +9440 +2820 +ENDCHAR +STARTCHAR U_4B7F +ENCODING 19327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A280 +FBE0 +A480 +F880 +A7E0 +F880 +0940 +A940 +8A20 +3420 +ENDCHAR +STARTCHAR U_4B80 +ENCODING 19328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A3E0 +FA20 +A7A0 +FAA0 +A2A0 +FBA0 +0A60 +AA00 +8A20 +33E0 +ENDCHAR +STARTCHAR U_4B81 +ENCODING 19329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A240 +F7E0 +A000 +F240 +A240 +FFE0 +0A40 +AA40 +8A40 +3640 +ENDCHAR +STARTCHAR U_4B82 +ENCODING 19330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A120 +F7E0 +A100 +F900 +A1E0 +FA20 +0B40 +AC80 +8940 +3620 +ENDCHAR +STARTCHAR U_4B83 +ENCODING 19331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +F7C0 +A100 +F100 +AFE0 +F900 +0A00 +AA80 +8C40 +37C0 +ENDCHAR +STARTCHAR U_4B84 +ENCODING 19332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A080 +F7E0 +A080 +F100 +A200 +F940 +0880 +A900 +8A40 +33E0 +ENDCHAR +STARTCHAR U_4B85 +ENCODING 19333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +A080 +F3E0 +A280 +F280 +A2A0 +FAA0 +0AA0 +AB40 +8AA0 +3120 +ENDCHAR +STARTCHAR U_4B86 +ENCODING 19334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A080 +F9C0 +A2A0 +F8A0 +A000 +F880 +0BE0 +A880 +8880 +3080 +ENDCHAR +STARTCHAR U_4B87 +ENCODING 19335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F8A0 +A3E0 +F8A0 +A3E0 +F880 +0BE0 +A880 +8FE0 +3080 +ENDCHAR +STARTCHAR U_4B88 +ENCODING 19336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A0E0 +F920 +A2C0 +F880 +A300 +F8E0 +0920 +AAC0 +8880 +3700 +ENDCHAR +STARTCHAR U_4B89 +ENCODING 19337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F440 +AB80 +F220 +A340 +FA80 +0A40 +AA40 +8AA0 +3320 +ENDCHAR +STARTCHAR U_4B8A +ENCODING 19338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7880 +53E0 +78A0 +53C0 +7A80 +07E0 +54A0 +A540 +9A20 +ENDCHAR +STARTCHAR U_4B8B +ENCODING 19339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +7BA0 +5120 +7920 +53A0 +52E0 +7AA0 +0D20 +5920 +AA20 +1440 +ENDCHAR +STARTCHAR U_4B8C +ENCODING 19340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +A480 +F7E0 +AC80 +F480 +A5C0 +F6A0 +16A0 +B480 +9480 +6480 +ENDCHAR +STARTCHAR U_4B8D +ENCODING 19341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +2400 +3F00 +2400 +3FC0 +5540 +8A80 +7FC0 +3500 +D200 +19C0 +ENDCHAR +STARTCHAR U_4B8E +ENCODING 19342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F6C0 +A380 +F6C0 +A200 +F7C0 +A300 +F7C0 +9D40 +7540 +D5C0 +B100 +ENDCHAR +STARTCHAR U_4B8F +ENCODING 19343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5100 +7900 +53C0 +7940 +5140 +7BE0 +0800 +6BC0 +8A40 +33C0 +ENDCHAR +STARTCHAR U_4B90 +ENCODING 19344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +F360 +A220 +F3A0 +A2A0 +FAA0 +0BA0 +AA20 +8A20 +3240 +ENDCHAR +STARTCHAR U_4B91 +ENCODING 19345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +F140 +A000 +F040 +A7E0 +F840 +0A40 +A940 +8840 +3080 +ENDCHAR +STARTCHAR U_4B92 +ENCODING 19346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78A0 +53E0 +7880 +53E0 +7AA0 +53E0 +7AA0 +0BE0 +AAA0 +AAA0 +1A60 +ENDCHAR +STARTCHAR U_4B93 +ENCODING 19347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F100 +A1C0 +F100 +A7C0 +F4C0 +2740 +F7C0 +1100 +F7C0 +1100 +6100 +ENDCHAR +STARTCHAR U_4B94 +ENCODING 19348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +A780 +F080 +A7E0 +F2A0 +A7E0 +FAA0 +0AA0 +AFE0 +8880 +37E0 +ENDCHAR +STARTCHAR U_4B95 +ENCODING 19349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A120 +F5A0 +A240 +F5A0 +A000 +FFE0 +0920 +ADA0 +8A40 +35A0 +ENDCHAR +STARTCHAR U_4B96 +ENCODING 19350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +A240 +F3C0 +A240 +F3C0 +A000 +F7E0 +3420 +57E0 +9420 +27E0 +ENDCHAR +STARTCHAR U_4B97 +ENCODING 19351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A2A0 +F3E0 +A000 +F3E0 +A200 +FBE0 +0A40 +ABE0 +8A40 +3440 +ENDCHAR +STARTCHAR U_4B98 +ENCODING 19352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A6C0 +F440 +A6C0 +F440 +A7C0 +FA80 +0A80 +AA80 +8AA0 +3460 +ENDCHAR +STARTCHAR U_4B99 +ENCODING 19353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +A080 +F7E0 +A080 +F780 +A5A0 +FDA0 +0FA0 +AA40 +8CC0 +3320 +ENDCHAR +STARTCHAR U_4B9A +ENCODING 19354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A3C0 +F100 +A7E0 +F280 +A4E0 +FBC0 +0A40 +AD40 +8880 +3360 +ENDCHAR +STARTCHAR U_4B9B +ENCODING 19355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +AAA0 +FAA0 +AAE0 +FDA0 +AAA0 +FAE0 +0AA0 +AEA0 +88A0 +38E0 +ENDCHAR +STARTCHAR U_4B9C +ENCODING 19356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +AFE0 +F540 +A5C0 +F400 +A7E0 +F100 +5FE0 +B100 +5540 +B920 +ENDCHAR +STARTCHAR U_4B9D +ENCODING 19357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A920 +F7C0 +A540 +F7C0 +A540 +FFC0 +0900 +6FC0 +8900 +1900 +ENDCHAR +STARTCHAR U_4B9E +ENCODING 19358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7C0 +F280 +AFE0 +F440 +AFE0 +FC60 +17C0 +5440 +97C0 +2440 +ENDCHAR +STARTCHAR U_4B9F +ENCODING 19359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +FDA0 +A240 +FDA0 +A240 +FC20 +2BC0 +DA80 +A900 +16E0 +ENDCHAR +STARTCHAR U_4BA0 +ENCODING 19360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A000 +FBE0 +A220 +FBE0 +A000 +FBE0 +0AA0 +FBE0 +8AA0 +33E0 +ENDCHAR +STARTCHAR U_4BA1 +ENCODING 19361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F640 +A3C0 +F240 +A3C0 +FA00 +0FC0 +AA40 +8980 +3660 +ENDCHAR +STARTCHAR U_4BA2 +ENCODING 19362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +5380 +7880 +57E0 +7980 +52E0 +7AA0 +2BE0 +7AA0 +CBE0 +1A20 +ENDCHAR +STARTCHAR U_4BA3 +ENCODING 19363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +A140 +F080 +A140 +F7E0 +A5A0 +F240 +15A0 +FFE0 +9380 +3540 +ENDCHAR +STARTCHAR U_4BA4 +ENCODING 19364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F520 +A240 +F2E0 +A440 +FAE0 +0A40 +AAE0 +8A40 +32E0 +ENDCHAR +STARTCHAR U_4BA5 +ENCODING 19365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A000 +F3C0 +A240 +F3C0 +A000 +FBE0 +0B60 +AAA0 +8BE0 +32A0 +ENDCHAR +STARTCHAR U_4BA6 +ENCODING 19366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F940 +A1C0 +F800 +A3E0 +FA20 +2AA0 +5B60 +AAA0 +1A60 +ENDCHAR +STARTCHAR U_4BA7 +ENCODING 19367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F280 +2C60 +F7C0 +9480 +F7C0 +9480 +F7E0 +2520 +FAA0 +20C0 +ENDCHAR +STARTCHAR U_4BA8 +ENCODING 19368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F920 +A7C0 +FA80 +A100 +FFE0 +0900 +5FC0 +A900 +1900 +ENDCHAR +STARTCHAR U_4BA9 +ENCODING 19369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +F2C0 +A2C0 +F7E0 +A420 +FBC0 +0B40 +AAC0 +8B40 +3440 +ENDCHAR +STARTCHAR U_4BAA +ENCODING 19370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +53E0 +7D40 +5740 +79E0 +56C0 +7FE0 +0880 +A9C0 +9AA0 +0CA0 +ENDCHAR +STARTCHAR U_4BAB +ENCODING 19371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F6A0 +A3E0 +F080 +A3E0 +FAA0 +0940 +ABE0 +8940 +33A0 +ENDCHAR +STARTCHAR U_4BAC +ENCODING 19372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A7E0 +F240 +A3C0 +F240 +A3C0 +F880 +0FE0 +A900 +8A40 +3420 +ENDCHAR +STARTCHAR U_4BAD +ENCODING 19373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +A6A0 +F2C0 +A3C0 +F240 +ABC0 +FA40 +0BC0 +A900 +8AA0 +34E0 +ENDCHAR +STARTCHAR U_4BAE +ENCODING 19374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +FD40 +A540 +FBA0 +A540 +FAA0 +09C0 +AF40 +8880 +3740 +ENDCHAR +STARTCHAR U_4BAF +ENCODING 19375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A7E0 +F2A0 +A7A0 +F2A0 +A7A0 +FAA0 +0B40 +AD40 +8D40 +35A0 +ENDCHAR +STARTCHAR U_4BB0 +ENCODING 19376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A3E0 +F140 +A140 +F3E0 +A2A0 +FBE0 +0AA0 +AB60 +8BE0 +3220 +ENDCHAR +STARTCHAR U_4BB1 +ENCODING 19377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +ABE0 +F480 +A140 +F2E0 +AD40 +F6C0 +9560 +5640 +9480 +6BE0 +ENDCHAR +STARTCHAR U_4BB2 +ENCODING 19378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A7E0 +F140 +A7E0 +F1C0 +A2A0 +FBE0 +0AA0 +ABE0 +8940 +3220 +ENDCHAR +STARTCHAR U_4BB3 +ENCODING 19379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1E0 +AF00 +E540 +BFE0 +E540 +A920 +F7C0 +5540 +B7C0 +5540 +B7C0 +ENDCHAR +STARTCHAR U_4BB4 +ENCODING 19380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F740 +A2A0 +F640 +A440 +F7E0 +A820 +FBC0 +0A40 +ABC0 +AA40 +17E0 +ENDCHAR +STARTCHAR U_4BB5 +ENCODING 19381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A7E0 +F220 +A140 +F7E0 +A2A0 +FBE0 +0AA0 +ABE0 +8880 +37E0 +ENDCHAR +STARTCHAR U_4BB6 +ENCODING 19382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +A3E0 +F480 +ABE0 +F280 +A3E0 +FA80 +0BE0 +A880 +8AA0 +3080 +ENDCHAR +STARTCHAR U_4BB7 +ENCODING 19383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A6A0 +F7E0 +A400 +F7E0 +8920 +FBA0 +0BA0 +A920 +8BA0 +30C0 +ENDCHAR +STARTCHAR U_4BB8 +ENCODING 19384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4040 +FFE0 +A420 +3F00 +2400 +3FC0 +5440 +AAC0 +ENDCHAR +STARTCHAR U_4BB9 +ENCODING 19385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2C0 +A280 +F7E0 +A040 +F7E0 +A440 +F7C0 +1540 +57E0 +9540 +2AA0 +ENDCHAR +STARTCHAR U_4BBA +ENCODING 19386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7C0 +F2A0 +AD40 +F7A0 +ABE0 +FA40 +1BC0 +2A40 +CBC0 +3E40 +ENDCHAR +STARTCHAR U_4BBB +ENCODING 19387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A000 +AFE0 +A020 +F380 +1040 +3FE0 +5040 +9240 +3080 +ENDCHAR +STARTCHAR U_4BBC +ENCODING 19388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +A540 +F100 +A2C0 +F520 +A540 +FA80 +0CE0 +AB40 +8DE0 +3240 +ENDCHAR +STARTCHAR U_4BBD +ENCODING 19389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +A7E0 +F540 +A7E0 +F560 +A7E0 +F540 +15E0 +B540 +95E0 +2EA0 +ENDCHAR +STARTCHAR U_4BBE +ENCODING 19390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +DFE0 +EA80 +DFE0 +E060 +CE80 +EAE0 +2E80 +EAE0 +AE80 +6AE0 +ENDCHAR +STARTCHAR U_4BBF +ENCODING 19391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +FAA0 +A7C0 +F280 +AFE0 +F240 +17E0 +B2C0 +9680 +39E0 +ENDCHAR +STARTCHAR U_4BC0 +ENCODING 19392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A2C0 +F340 +A2C0 +F7E0 +A040 +FFE0 +0AA0 +AAE0 +8FA0 +3220 +ENDCHAR +STARTCHAR U_4BC1 +ENCODING 19393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +F400 +A7C0 +F240 +AFC0 +F540 +37C0 +5D40 +97C0 +6D60 +ENDCHAR +STARTCHAR U_4BC2 +ENCODING 19394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2A00 +1F80 +2A80 +FFE0 +AA80 +7DE0 +AAA0 +7FC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4BC3 +ENCODING 19395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +57E0 +5420 +5100 +7FE0 +0A40 +3A40 +C980 +0980 +3660 +ENDCHAR +STARTCHAR U_4BC4 +ENCODING 19396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +5240 +53C0 +5080 +7BE0 +0AA0 +3AA0 +CB60 +0A20 +3260 +ENDCHAR +STARTCHAR U_4BC5 +ENCODING 19397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +5240 +53C0 +5240 +53C0 +7A40 +0FE0 +3840 +CFE0 +0A40 +35A0 +ENDCHAR +STARTCHAR U_4BC6 +ENCODING 19398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +6900 +FD00 +8500 +7900 +4900 +7900 +4920 +7920 +49E0 +ENDCHAR +STARTCHAR U_4BC7 +ENCODING 19399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +5900 +FFE0 +8520 +7920 +4920 +7920 +4920 +7A20 +9C40 +ENDCHAR +STARTCHAR U_4BC8 +ENCODING 19400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4800 +6BE0 +FD40 +CD40 +6940 +5940 +6940 +5940 +4A40 +9A60 +ENDCHAR +STARTCHAR U_4BC9 +ENCODING 19401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +59E0 +FD20 +86C0 +7880 +4880 +7880 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_4BCA +ENCODING 19402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +6BE0 +5840 +FC40 +87C0 +7AC0 +4AC0 +7BC0 +4840 +7940 +4880 +ENDCHAR +STARTCHAR U_4BCB +ENCODING 19403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4920 +6BE0 +FD00 +85E0 +7A20 +4A40 +7B40 +4C80 +7940 +4A20 +ENDCHAR +STARTCHAR U_4BCC +ENCODING 19404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +FD00 +8D00 +77C0 +5540 +7540 +5540 +7540 +5A60 +ENDCHAR +STARTCHAR U_4BCD +ENCODING 19405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +FA80 +8A80 +7440 +5BA0 +7000 +57E0 +7040 +9180 +B080 +ENDCHAR +STARTCHAR U_4BCE +ENCODING 19406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +4940 +4940 +7A20 +85C0 +7880 +4880 +6BE0 +4880 +6880 +9880 +ENDCHAR +STARTCHAR U_4BCF +ENCODING 19407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +7840 +4880 +6980 +5A80 +FFC0 +8480 +7880 +6BC0 +4A40 +5BC0 +ENDCHAR +STARTCHAR U_4BD0 +ENCODING 19408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +5BE0 +FEA0 +8760 +7AA0 +4AA0 +7B60 +4A20 +7A20 +4A60 +ENDCHAR +STARTCHAR U_4BD1 +ENCODING 19409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +68A0 +5AA0 +FDC0 +8480 +7BE0 +4940 +7940 +4940 +7A40 +4C60 +ENDCHAR +STARTCHAR U_4BD2 +ENCODING 19410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +6AE0 +5A00 +FD00 +85E0 +7A40 +4E40 +7A40 +4A40 +7A40 +4AC0 +ENDCHAR +STARTCHAR U_4BD3 +ENCODING 19411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +5BE0 +FC80 +87E0 +7C80 +4880 +7BE0 +4880 +7880 +4FE0 +ENDCHAR +STARTCHAR U_4BD4 +ENCODING 19412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +6BE0 +FE20 +85C0 +7B00 +4900 +69E0 +5F00 +4920 +59E0 +ENDCHAR +STARTCHAR U_4BD5 +ENCODING 19413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7820 +6B40 +59C0 +FD40 +8640 +7BE0 +4940 +7E40 +4AE0 +7B00 +4CE0 +ENDCHAR +STARTCHAR U_4BD6 +ENCODING 19414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +5BC0 +FE40 +83C0 +7A20 +4B40 +7A80 +4A40 +5B20 +ENDCHAR +STARTCHAR U_4BD7 +ENCODING 19415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4B60 +6A40 +5A40 +FF60 +8480 +7880 +49C0 +5880 +6880 +5BE0 +ENDCHAR +STARTCHAR U_4BD8 +ENCODING 19416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5220 +75C0 +2400 +FFE0 +A940 +F940 +2140 +FA40 +2460 +ENDCHAR +STARTCHAR U_4BD9 +ENCODING 19417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +48A0 +6BE0 +5880 +FFE0 +82A0 +7BE0 +4AA0 +7BE0 +4AA0 +5A60 +ENDCHAR +STARTCHAR U_4BDA +ENCODING 19418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6920 +5BC0 +FD20 +87E0 +7C00 +49E0 +7920 +49E0 +7920 +4960 +ENDCHAR +STARTCHAR U_4BDB +ENCODING 19419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5A20 +FD00 +87E0 +7EA0 +4AA0 +7DE0 +4980 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_4BDC +ENCODING 19420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +6BC0 +5A40 +FDC0 +8600 +7BE0 +4D60 +5AA0 +6920 +5A40 +ENDCHAR +STARTCHAR U_4BDD +ENCODING 19421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6880 +FDE0 +8640 +7BE0 +4920 +79E0 +4920 +79E0 +4920 +ENDCHAR +STARTCHAR U_4BDE +ENCODING 19422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +7340 +FB40 +8FE0 +7420 +55E0 +7560 +55E0 +7420 +5460 +ENDCHAR +STARTCHAR U_4BDF +ENCODING 19423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +6FE0 +5900 +FE80 +85A0 +7AC0 +4D80 +7AC0 +4CA0 +7A80 +4900 +ENDCHAR +STARTCHAR U_4BE0 +ENCODING 19424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7380 +5280 +7380 +5280 +FB80 +5000 +77C0 +5540 +7540 +5540 +9FE0 +ENDCHAR +STARTCHAR U_4BE1 +ENCODING 19425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +7280 +FFE0 +8AA0 +7FE0 +52A0 +77E0 +5280 +76C0 +5AA0 +ENDCHAR +STARTCHAR U_4BE2 +ENCODING 19426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7DE0 +6AA0 +4F80 +4880 +5FE0 +68A0 +8F80 +9080 +ENDCHAR +STARTCHAR U_4BE3 +ENCODING 19427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5540 +FFE0 +8800 +77C0 +5440 +77C0 +5440 +77C0 +5820 +ENDCHAR +STARTCHAR U_4BE4 +ENCODING 19428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6980 +5A40 +FFE0 +86A0 +7D20 +4FE0 +6A40 +5BC0 +4A40 +5BC0 +ENDCHAR +STARTCHAR U_4BE5 +ENCODING 19429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +6A20 +5BE0 +FE20 +87E0 +7A40 +4B60 +7A40 +4FE0 +7800 +4DA0 +ENDCHAR +STARTCHAR U_4BE6 +ENCODING 19430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +6B60 +5940 +FBE0 +82A0 +7BE0 +4880 +7BE0 +4AA0 +7A40 +4CA0 +ENDCHAR +STARTCHAR U_4BE7 +ENCODING 19431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +FF80 +2200 +FF80 +8080 +7F00 +5500 +5D00 +4100 +4300 +ENDCHAR +STARTCHAR U_4BE8 +ENCODING 19432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +7FC0 +5140 +5F40 +40C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_4BE9 +ENCODING 19433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +0400 +7FC0 +0A00 +7FC0 +4A40 +BF40 +25C0 +3F00 +2080 +3FC0 +ENDCHAR +STARTCHAR U_4BEA +ENCODING 19434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +53E0 +7220 +FBE0 +8A20 +FBE0 +DA20 +FBE0 +8940 +9A20 +ENDCHAR +STARTCHAR U_4BEB +ENCODING 19435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +57E0 +7240 +53C0 +F800 +57E0 +7420 +27A0 +76A0 +AFA0 +6460 +ENDCHAR +STARTCHAR U_4BEC +ENCODING 19436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +52A0 +FBE0 +AAA0 +DBE0 +AAA0 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_4BED +ENCODING 19437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +4380 +7860 +4380 +FC60 +4B80 +F400 +3F80 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_4BEE +ENCODING 19438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7860 +4380 +FC60 +4380 +FF80 +1080 +11E0 +2020 +40C0 +ENDCHAR +STARTCHAR U_4BEF +ENCODING 19439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7900 +4280 +7140 +4280 +F900 +2200 +7000 +0400 +2680 +0400 +3800 +ENDCHAR +STARTCHAR U_4BF0 +ENCODING 19440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7C60 +4380 +FC60 +4980 +7600 +1B00 +71C0 +9120 +2100 +ENDCHAR +STARTCHAR U_4BF1 +ENCODING 19441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +4300 +F860 +5180 +E860 +8D80 +FFE0 +0C00 +3500 +44C0 +0400 +ENDCHAR +STARTCHAR U_4BF2 +ENCODING 19442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4040 +FD80 +4840 +FD80 +0000 +7FC0 +4440 +7FC0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_4BF3 +ENCODING 19443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7900 +4200 +7100 +4280 +F900 +5200 +F800 +2200 +C980 +1400 +3E00 +ENDCHAR +STARTCHAR U_4BF4 +ENCODING 19444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +4980 +F060 +1F80 +1100 +EEE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_4BF5 +ENCODING 19445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +4980 +FC60 +0580 +7FC0 +2480 +FFE0 +2080 +C080 +ENDCHAR +STARTCHAR U_4BF6 +ENCODING 19446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +4980 +FC60 +0180 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_4BF7 +ENCODING 19447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4380 +F860 +5380 +F800 +0440 +FFE0 +2240 +F980 +22A0 +C460 +ENDCHAR +STARTCHAR U_4BF8 +ENCODING 19448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +5180 +6040 +FD80 +4860 +FA80 +43C0 +2540 +1100 +2280 +4C60 +ENDCHAR +STARTCHAR U_4BF9 +ENCODING 19449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +5020 +FBC0 +5020 +FFC0 +0100 +7FC0 +0100 +FFE0 +8E20 +3B80 +ENDCHAR +STARTCHAR U_4BFA +ENCODING 19450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +00C0 +7F00 +4220 +79E0 +2080 +3F80 +ENDCHAR +STARTCHAR U_4BFB +ENCODING 19451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +51A0 +6040 +FDA0 +5040 +F580 +1F00 +2400 +7FC0 +1100 +1F00 +ENDCHAR +STARTCHAR U_4BFC +ENCODING 19452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5140 +4AA0 +FCC0 +5300 +E880 +2AA0 +F2E0 +1880 +E940 +1A20 +ENDCHAR +STARTCHAR U_4BFD +ENCODING 19453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +ENDCHAR +STARTCHAR U_4BFE +ENCODING 19454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +5180 +6860 +FD80 +5860 +E580 +3FC0 +2E40 +35C0 +4A40 +8EC0 +ENDCHAR +STARTCHAR U_4BFF +ENCODING 19455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7C60 +4380 +FC60 +5580 +FFE0 +2080 +5540 +FFE0 +0400 +ENDCHAR +STARTCHAR U_4C00 +ENCODING 19456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5140 +FE80 +4940 +BF80 +0400 +7FC0 +1500 +FFE0 +1200 +7FC0 +ENDCHAR +STARTCHAR U_4C01 +ENCODING 19457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +F980 +0F00 +1200 +FFE0 +2480 +1500 +6CC0 +ENDCHAR +STARTCHAR U_4C02 +ENCODING 19458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FC80 +07C0 +3A80 +1500 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4C03 +ENCODING 19459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +2080 +1100 +FFE0 +4A40 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_4C04 +ENCODING 19460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4040 +FD80 +4860 +FF80 +1280 +1F80 +1280 +1F40 +50A0 +9F80 +ENDCHAR +STARTCHAR U_4C05 +ENCODING 19461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4840 +FFE0 +0400 +3F80 +2280 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_4C06 +ENCODING 19462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FF80 +0900 +FFE0 +1440 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_4C07 +ENCODING 19463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +F980 +5460 +FF80 +0500 +7FE0 +0880 +1F80 +E880 +0F80 +ENDCHAR +STARTCHAR U_4C08 +ENCODING 19464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +20C0 +3B20 +2AC0 +FF20 +24C0 +7F80 +1000 +7F80 +8400 +7FC0 +ENDCHAR +STARTCHAR U_4C09 +ENCODING 19465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FC80 +23C0 +7A40 +4FE0 +FA40 +4980 +9E40 +ENDCHAR +STARTCHAR U_4C0A +ENCODING 19466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FF80 +2480 +3F80 +2480 +FFC0 +2100 +1300 +ENDCHAR +STARTCHAR U_4C0B +ENCODING 19467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +1080 +FFE0 +8420 +7FC0 +0A00 +77C0 +ENDCHAR +STARTCHAR U_4C0C +ENCODING 19468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +2280 +5540 +2100 +65C0 +A500 +2BE0 +ENDCHAR +STARTCHAR U_4C0D +ENCODING 19469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +42A0 +F940 +5280 +0400 +FFE0 +1500 +6AC0 +9520 +6EC0 +1500 +ENDCHAR +STARTCHAR U_4C0E +ENCODING 19470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5320 +FC40 +53A0 +F440 +3F80 +2480 +FFE0 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_4C0F +ENCODING 19471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +4060 +FD80 +4860 +FD80 +2240 +FFE0 +5200 +FD40 +50A0 +7D60 +ENDCHAR +STARTCHAR U_4C10 +ENCODING 19472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +F8C0 +5300 +F8C0 +4B00 +79E0 +5240 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_4C11 +ENCODING 19473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5360 +FDA0 +4840 +FFC0 +0400 +7FC0 +5540 +FFE0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_4C12 +ENCODING 19474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5180 +FC60 +4980 +FBE0 +2080 +FFE0 +8CA0 +7680 +0B00 +74C0 +ENDCHAR +STARTCHAR U_4C13 +ENCODING 19475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5180 +FC60 +4980 +7F60 +1500 +FFE0 +A4A0 +7FC0 +0900 +3300 +ENDCHAR +STARTCHAR U_4C14 +ENCODING 19476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5180 +FC60 +29C0 +7D20 +57E0 +FD20 +54C0 +7FA0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_4C15 +ENCODING 19477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +51A0 +FC40 +49A0 +7EC0 +0400 +7FE0 +4AA0 +5FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_4C16 +ENCODING 19478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CE0 +5100 +FEE0 +4900 +F9E0 +2240 +FFE0 +5540 +9560 +1F00 +2080 +ENDCHAR +STARTCHAR U_4C17 +ENCODING 19479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A0A0 +FFE0 +9220 +BF20 +9120 +BFA0 +AAA0 +BFA0 +8420 +87A0 +ENDCHAR +STARTCHAR U_4C18 +ENCODING 19480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A0A0 +FBE0 +AAA0 +99A0 +AEA0 +9520 +FAE0 +8D20 +8220 +9C60 +ENDCHAR +STARTCHAR U_4C19 +ENCODING 19481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +0040 +7DE0 +4440 +7C40 +01E0 +FEA0 +AAA0 +92A0 +FE40 +93A0 +ENDCHAR +STARTCHAR U_4C1A +ENCODING 19482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0080 +7BE0 +4940 +7940 +0140 +FD40 +D480 +A480 +FD40 +A620 +ENDCHAR +STARTCHAR U_4C1B +ENCODING 19483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0100 +7900 +49C0 +7940 +0140 +FDC0 +D540 +A540 +FD60 +A5A0 +ENDCHAR +STARTCHAR U_4C1C +ENCODING 19484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DF60 +4020 +5F20 +D160 +9F40 +8040 +DF60 +5120 +5B20 +5520 +D560 +ENDCHAR +STARTCHAR U_4C1D +ENCODING 19485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +0140 +7BE0 +4AA0 +7BE0 +02A0 +FFE0 +AD40 +95C0 +FD40 +95C0 +ENDCHAR +STARTCHAR U_4C1E +ENCODING 19486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2520 +FFE0 +8A80 +FEE0 +2A20 +7FE0 +1100 +7FC0 +5540 +4440 +ENDCHAR +STARTCHAR U_4C1F +ENCODING 19487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFE0 +2080 +7FC0 +2440 +3FC0 +2440 +3FC0 +12A0 +E3E0 +ENDCHAR +STARTCHAR U_4C20 +ENCODING 19488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +53E0 +5880 +5480 +98A0 +8FE0 +ENDCHAR +STARTCHAR U_4C21 +ENCODING 19489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FA80 +ABE0 +FC80 +A880 +FFE0 +5080 +5940 +5620 +9820 +8FE0 +ENDCHAR +STARTCHAR U_4C22 +ENCODING 19490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FAE0 +AD00 +FAE0 +AE40 +FA40 +5240 +5AC0 +5640 +9820 +8FE0 +ENDCHAR +STARTCHAR U_4C23 +ENCODING 19491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +FA20 +AB60 +FAA0 +AB60 +FA20 +5360 +5AA0 +5760 +9A20 +8FC0 +ENDCHAR +STARTCHAR U_4C24 +ENCODING 19492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +22A0 +FBE0 +AAA0 +FBE0 +A940 +F940 +7160 +AA40 +2460 +ENDCHAR +STARTCHAR U_4C25 +ENCODING 19493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +4A40 +F1C0 +3F20 +2480 +3F80 +2480 +3F80 +12A0 +E3E0 +ENDCHAR +STARTCHAR U_4C26 +ENCODING 19494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +5180 +5A80 +57E0 +9880 +8FE0 +ENDCHAR +STARTCHAR U_4C27 +ENCODING 19495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4080 +FBE0 +AAA0 +FBC0 +AA80 +FAE0 +5540 +5540 +5220 +9FE0 +ENDCHAR +STARTCHAR U_4C28 +ENCODING 19496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +FAA0 +ABE0 +FA00 +AAE0 +FAA0 +52E0 +5AA0 +54E0 +98A0 +8FE0 +ENDCHAR +STARTCHAR U_4C29 +ENCODING 19497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2AA0 +33E0 +FAA0 +23E0 +7940 +C9A0 +7AE0 +4A80 +7CE0 +ENDCHAR +STARTCHAR U_4C2A +ENCODING 19498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +77C0 +AD40 +57C0 +8D40 +77C0 +5280 +72A0 +52E0 +7280 +94E0 +ENDCHAR +STARTCHAR U_4C2B +ENCODING 19499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FBC0 +A880 +FFE0 +AA40 +FFE0 +5240 +57E0 +5940 +9620 +8FE0 +ENDCHAR +STARTCHAR U_4C2C +ENCODING 19500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F840 +AFE0 +FAA0 +AC80 +FBE0 +52A0 +5B60 +56A0 +9800 +8FE0 +ENDCHAR +STARTCHAR U_4C2D +ENCODING 19501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +23E0 +FAA0 +ABE0 +AAA0 +03E0 +FC80 +20C0 +F9E0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_4C2E +ENCODING 19502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +FBE0 +A880 +FBE0 +A880 +FBE0 +5140 +5BE0 +5540 +9B20 +8FE0 +ENDCHAR +STARTCHAR U_4C2F +ENCODING 19503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +4420 +FF40 +A8E0 +FF40 +AA60 +FF40 +55C0 +5960 +9000 +8FE0 +ENDCHAR +STARTCHAR U_4C30 +ENCODING 19504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +13E0 +FEA0 +BBE0 +D6A0 +2BE0 +FCA0 +4140 +FD60 +A540 +AE60 +ENDCHAR +STARTCHAR U_4C31 +ENCODING 19505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +FD40 +AFC0 +7540 +AFC0 +F940 +21A0 +ABC0 +7520 +F9E0 +ENDCHAR +STARTCHAR U_4C32 +ENCODING 19506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +9200 +FA00 +AA00 +FA00 +AA00 +FA20 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_4C33 +ENCODING 19507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9080 +F880 +A880 +F880 +A880 +F880 +0080 +AA80 +A900 +ENDCHAR +STARTCHAR U_4C34 +ENCODING 19508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +FC00 +ABC0 +F820 +A840 +F880 +0100 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C35 +ENCODING 19509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7BE0 +9020 +F8C0 +A880 +FFE0 +A880 +F880 +0080 +AA80 +A980 +ENDCHAR +STARTCHAR U_4C36 +ENCODING 19510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7900 +9080 +FFE0 +AA00 +FA00 +AA00 +FA00 +0200 +ABE0 +A800 +ENDCHAR +STARTCHAR U_4C37 +ENCODING 19511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +3C80 +CBE0 +7C80 +5480 +7FE0 +5480 +7C80 +03E0 +5480 +AA80 +ENDCHAR +STARTCHAR U_4C38 +ENCODING 19512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7940 +9140 +F940 +AA40 +FA20 +ACA0 +F900 +0100 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C39 +ENCODING 19513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +78A0 +9080 +FBE0 +A880 +F880 +A8A0 +F840 +00C0 +A940 +D420 +ENDCHAR +STARTCHAR U_4C3A +ENCODING 19514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +7B80 +9200 +FA00 +ABE0 +FA40 +AA40 +FA40 +0240 +5440 +A840 +ENDCHAR +STARTCHAR U_4C3B +ENCODING 19515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +91E0 +FA00 +A840 +FA40 +A940 +F940 +0080 +A940 +AA20 +ENDCHAR +STARTCHAR U_4C3C +ENCODING 19516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9280 +FC40 +ABA0 +F800 +AFE0 +F840 +0280 +A900 +A880 +ENDCHAR +STARTCHAR U_4C3D +ENCODING 19517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +ABE0 +FAA0 +AAA0 +FAA0 +02A0 +A880 +A880 +ENDCHAR +STARTCHAR U_4C3E +ENCODING 19518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +92A0 +FAA0 +AAA0 +FBE0 +AA00 +FA00 +0200 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_4C3F +ENCODING 19519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +FC00 +AA80 +FAE0 +AFA0 +FAA0 +0200 +AA20 +A9C0 +ENDCHAR +STARTCHAR U_4C40 +ENCODING 19520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +97C0 +2540 +FD40 +AD40 +FFE0 +A900 +FA80 +0440 +A820 +ENDCHAR +STARTCHAR U_4C41 +ENCODING 19521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +8BE0 +7C80 +55C0 +7DC0 +56A0 +7CA0 +03E0 +5A80 +A480 +ENDCHAR +STARTCHAR U_4C42 +ENCODING 19522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +9280 +FDE0 +AEA0 +FAA0 +AAA0 +FDA0 +07A0 +ACA0 +A940 +ENDCHAR +STARTCHAR U_4C43 +ENCODING 19523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +9280 +FBE0 +AC80 +F880 +AFE0 +F880 +0140 +A940 +AA20 +ENDCHAR +STARTCHAR U_4C44 +ENCODING 19524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +96A0 +FAA0 +AAA0 +FAA0 +AAA0 +FAA0 +02E0 +AA20 +AC20 +ENDCHAR +STARTCHAR U_4C45 +ENCODING 19525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +A880 +FBE0 +A880 +F9C0 +02A0 +ACA0 +A880 +ENDCHAR +STARTCHAR U_4C46 +ENCODING 19526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A80 +9260 +FA20 +ADE0 +F840 +A880 +FFE0 +0080 +A880 +A980 +ENDCHAR +STARTCHAR U_4C47 +ENCODING 19527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +53C0 +2240 +FA40 +ABC0 +FA40 +AA40 +ABC0 +FA40 +0800 +A7E0 +ENDCHAR +STARTCHAR U_4C48 +ENCODING 19528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +79C0 +9000 +F800 +ABE0 +F880 +A9C0 +FAA0 +04A0 +A880 +A880 +ENDCHAR +STARTCHAR U_4C49 +ENCODING 19529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9240 +FA40 +ABC0 +FA40 +AA40 +FBC0 +0240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_4C4A +ENCODING 19530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7AA0 +49C0 +9080 +7FE0 +5480 +7DC0 +55C0 +7EA0 +54A0 +AA80 +ENDCHAR +STARTCHAR U_4C4B +ENCODING 19531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7940 +4940 +FFE0 +5540 +7D40 +57E0 +7C00 +0140 +A920 +AA20 +ENDCHAR +STARTCHAR U_4C4C +ENCODING 19532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A40 +9240 +FAE0 +AAA0 +FAA0 +AAA0 +FAE0 +0240 +AA40 +ABE0 +ENDCHAR +STARTCHAR U_4C4D +ENCODING 19533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7900 +9100 +F9E0 +AA20 +FB20 +AAA0 +FD40 +00C0 +A840 +ABE0 +ENDCHAR +STARTCHAR U_4C4E +ENCODING 19534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9000 +FBC0 +AA40 +FBC0 +AA40 +FA40 +03C0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_4C4F +ENCODING 19535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7800 +93C0 +FA40 +ABC0 +F800 +AA40 +FA40 +0180 +A980 +AFE0 +ENDCHAR +STARTCHAR U_4C50 +ENCODING 19536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7B00 +92A0 +F940 +ABE0 +F840 +A880 +FBE0 +0080 +3880 +C180 +ENDCHAR +STARTCHAR U_4C51 +ENCODING 19537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7AC0 +9780 +FA80 +AAE0 +FBA0 +AEA0 +FAA0 +02A0 +AAA0 +AF20 +ENDCHAR +STARTCHAR U_4C52 +ENCODING 19538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +F800 +ABE0 +FAA0 +AAA0 +FBE0 +0200 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C53 +ENCODING 19539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +77C0 +9140 +FA40 +AFE0 +F940 +A940 +FD40 +02E0 +AB00 +ACE0 +ENDCHAR +STARTCHAR U_4C54 +ENCODING 19540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7940 +92E0 +FBA0 +AEA0 +FAA0 +AAA0 +FA40 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_4C55 +ENCODING 19541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +73E0 +9400 +FBE0 +AAA0 +FFE0 +AAA0 +FAA0 +03E0 +3820 +C0C0 +ENDCHAR +STARTCHAR U_4C56 +ENCODING 19542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +9280 +FA80 +AEE0 +FAA0 +AAA0 +FEE0 +0280 +A480 +A880 +ENDCHAR +STARTCHAR U_4C57 +ENCODING 19543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +2140 +7940 +AE80 +1140 +FFA0 +2480 +3F80 +2480 +3F80 +5240 +ENDCHAR +STARTCHAR U_4C58 +ENCODING 19544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7040 +2140 +F940 +7640 +AAC0 +3F80 +2480 +3F80 +2480 +3F80 +6AC0 +ENDCHAR +STARTCHAR U_4C59 +ENCODING 19545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7B00 +92E0 +FFA0 +AAA0 +FAA0 +AFA0 +FAA0 +0240 +AA40 +AAA0 +ENDCHAR +STARTCHAR U_4C5A +ENCODING 19546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79C0 +9240 +FB80 +A880 +FBE0 +A880 +FAA0 +01C0 +AAA0 +A980 +ENDCHAR +STARTCHAR U_4C5B +ENCODING 19547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +78A0 +97E0 +F880 +AE80 +FAA0 +AEA0 +F840 +06C0 +A940 +AA20 +ENDCHAR +STARTCHAR U_4C5C +ENCODING 19548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7BE0 +9140 +F940 +ABE0 +F800 +ABE0 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C5D +ENCODING 19549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +73E0 +92A0 +FBE0 +AAA0 +FBE0 +A940 +FA40 +07E0 +A840 +A040 +ENDCHAR +STARTCHAR U_4C5E +ENCODING 19550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +77E0 +9140 +FA20 +AFE0 +F800 +AFE0 +F880 +02C0 +AAA0 +A5A0 +ENDCHAR +STARTCHAR U_4C5F +ENCODING 19551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +73E0 +A220 +FBE0 +AA80 +FBE0 +AA80 +FBE0 +5320 +AD20 +A9E0 +ENDCHAR +STARTCHAR U_4C60 +ENCODING 19552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7240 +97E0 +F940 +A8A0 +FB60 +AA40 +FFE0 +0140 +A8A0 +AB60 +ENDCHAR +STARTCHAR U_4C61 +ENCODING 19553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +73E0 +A520 +FD60 +ABA0 +FFE0 +A920 +FBA0 +2D60 +D520 +A0C0 +ENDCHAR +STARTCHAR U_4C62 +ENCODING 19554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +9480 +FBC0 +A940 +FFE0 +A940 +FBC0 +0100 +A900 +AB00 +ENDCHAR +STARTCHAR U_4C63 +ENCODING 19555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9000 +F940 +AAA0 +F800 +A880 +FBE0 +0080 +A880 +A880 +ENDCHAR +STARTCHAR U_4C64 +ENCODING 19556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9120 +FA20 +A840 +F900 +AA60 +FA20 +0360 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C65 +ENCODING 19557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +7EA0 +88A0 +7E20 +4A60 +3F80 +2480 +3F80 +2480 +3F80 +4940 +ENDCHAR +STARTCHAR U_4C66 +ENCODING 19558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3A80 +5280 +A5E0 +7E80 +ABC0 +FA80 +AA80 +FBC0 +0280 +ABE0 +ENDCHAR +STARTCHAR U_4C67 +ENCODING 19559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7880 +93E0 +F880 +ABE0 +F940 +AA20 +FDC0 +0140 +A920 +A9E0 +ENDCHAR +STARTCHAR U_4C68 +ENCODING 19560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +6FA0 +9220 +FFA0 +AAA0 +FAA0 +ABA0 +FA20 +0720 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_4C69 +ENCODING 19561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +73E0 +9360 +FAA0 +ABE0 +FAA0 +ABE0 +FAA0 +02E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_4C6A +ENCODING 19562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +73C0 +9100 +FFC0 +A900 +FFC0 +A920 +FAC0 +0680 +AA40 +AB20 +ENDCHAR +STARTCHAR U_4C6B +ENCODING 19563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FE40 +1140 +7D40 +5540 +7C40 +D4C0 +7FC0 +4440 +7FC0 +EAE0 +ENDCHAR +STARTCHAR U_4C6C +ENCODING 19564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +78A0 +92C0 +FA80 +ADE0 +F800 +ABE0 +FA20 +03E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_4C6D +ENCODING 19565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9240 +FB40 +AEA0 +FAA0 +AAE0 +FAA0 +0340 +AA40 +ABE0 +ENDCHAR +STARTCHAR U_4C6E +ENCODING 19566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +77E0 +92A0 +FFA0 +AAA0 +FF60 +AA80 +FFE0 +0080 +A940 +AE20 +ENDCHAR +STARTCHAR U_4C6F +ENCODING 19567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +13E0 +FD40 +5480 +9360 +3F80 +6480 +3F80 +2480 +3F80 +4A40 +ENDCHAR +STARTCHAR U_4C70 +ENCODING 19568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +97E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +03E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_4C71 +ENCODING 19569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +93E0 +F940 +ABE0 +FCA0 +ABC0 +FAA0 +02A0 +AAA0 +A880 +ENDCHAR +STARTCHAR U_4C72 +ENCODING 19570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7A40 +9380 +F880 +AFE0 +F900 +AEA0 +F9C0 +06A0 +A8A0 +AB00 +ENDCHAR +STARTCHAR U_4C73 +ENCODING 19571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7800 +8BE0 +FAA0 +ABE0 +FAA0 +ABE0 +F880 +0BE0 +A880 +B3E0 +ENDCHAR +STARTCHAR U_4C74 +ENCODING 19572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +7A00 +92E0 +FEA0 +ABA0 +FAE0 +AAA0 +FAA0 +02E0 +AA00 +AAE0 +ENDCHAR +STARTCHAR U_4C75 +ENCODING 19573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A40 +9520 +FA40 +ABC0 +F800 +AFE0 +F5A0 +0360 +ADA0 +AA60 +ENDCHAR +STARTCHAR U_4C76 +ENCODING 19574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +64E0 +AEA0 +FAC0 +AEA0 +FAA0 +AEA0 +F8A0 +2AE0 +AE80 +8080 +ENDCHAR +STARTCHAR U_4C77 +ENCODING 19575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +1100 +7F00 +59E0 +6B40 +7D40 +5540 +7D40 +5480 +7D40 +AA20 +ENDCHAR +STARTCHAR U_4C78 +ENCODING 19576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +7AA0 +93E0 +FAA0 +ABE0 +F880 +ABE0 +F920 +00C0 +A8C0 +AB20 +ENDCHAR +STARTCHAR U_4C79 +ENCODING 19577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +9080 +FBE0 +A880 +FFE0 +AA00 +FBE0 +0680 +A880 +AFE0 +ENDCHAR +STARTCHAR U_4C7A +ENCODING 19578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AA0 +93E0 +F800 +ABE0 +F800 +ABE0 +FA20 +03E0 +A940 +ABE0 +ENDCHAR +STARTCHAR U_4C7B +ENCODING 19579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7B40 +92C0 +FFE0 +AC20 +FBC0 +AA40 +FBC0 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_4C7C +ENCODING 19580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7820 +AFE0 +FA40 +AFE0 +FA40 +AFE0 +FA80 +0AA0 +AA40 +B320 +ENDCHAR +STARTCHAR U_4C7D +ENCODING 19581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7140 +A3E0 +FC00 +ABE0 +FAA0 +ABE0 +FA00 +0BE0 +A520 +A9E0 +ENDCHAR +STARTCHAR U_4C7E +ENCODING 19582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +92A0 +FFE0 +AAA0 +FBE0 +AAA0 +F9E0 +0220 +A9C0 +AE20 +ENDCHAR +STARTCHAR U_4C7F +ENCODING 19583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7760 +9280 +FF80 +AAE0 +FFA0 +AAA0 +FFA0 +02A0 +AF20 +AA20 +ENDCHAR +STARTCHAR U_4C80 +ENCODING 19584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27C0 +F940 +57C0 +FA60 +2F80 +6480 +3F80 +2480 +3F80 +4A40 +ENDCHAR +STARTCHAR U_4C81 +ENCODING 19585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +7920 +8F20 +F8E0 +AF20 +F8A0 +AF60 +FA20 +0F20 +AAA0 +B260 +ENDCHAR +STARTCHAR U_4C82 +ENCODING 19586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +75E0 +AE00 +F9E0 +A8A0 +FE80 +AAC0 +FA80 +0A80 +AB80 +B460 +ENDCHAR +STARTCHAR U_4C83 +ENCODING 19587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7D40 +92A0 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +0880 +AFE0 +A2A0 +ENDCHAR +STARTCHAR U_4C84 +ENCODING 19588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7680 +98E0 +FF20 +AAA0 +FAA0 +AEA0 +FA40 +0F40 +A2A0 +A520 +ENDCHAR +STARTCHAR U_4C85 +ENCODING 19589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7AE0 +97A0 +FAE0 +AAA0 +FFE0 +AAA0 +FAE0 +0240 +ADC0 +A960 +ENDCHAR +STARTCHAR U_4C86 +ENCODING 19590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +0000 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_4C87 +ENCODING 19591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +73E0 +9480 +FBE0 +AAA0 +FBE0 +AA80 +FBC0 +02A0 +AA80 +ADE0 +ENDCHAR +STARTCHAR U_4C88 +ENCODING 19592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +9000 +FFE0 +AA40 +FFE0 +AA40 +FB40 +0EE0 +AA40 +B240 +ENDCHAR +STARTCHAR U_4C89 +ENCODING 19593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A20 +6AC0 +AF80 +FAE0 +AEA0 +FAA0 +AEA0 +FAA0 +0FA0 +AAA0 +B120 +ENDCHAR +STARTCHAR U_4C8A +ENCODING 19594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +6BE0 +AA80 +FCE0 +AB40 +FAE0 +AEA0 +F8E0 +08A0 +A8E0 +A920 +ENDCHAR +STARTCHAR U_4C8B +ENCODING 19595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +9240 +FFE0 +AA40 +FDA0 +ABE0 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C8C +ENCODING 19596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7780 +92E0 +FF40 +A840 +FF40 +A840 +FF40 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_4C8D +ENCODING 19597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +77E0 +5100 +7FE0 +5480 +FFE0 +5540 +77C0 +5540 +57C0 +AAA0 +ENDCHAR +STARTCHAR U_4C8E +ENCODING 19598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +7480 +AEE0 +FBA0 +AEA0 +FAA0 +AEA0 +FA40 +0E40 +A2A0 +A320 +ENDCHAR +STARTCHAR U_4C8F +ENCODING 19599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +9240 +FDA0 +A800 +FFE0 +A920 +FBC0 +0140 +AA40 +ACC0 +ENDCHAR +STARTCHAR U_4C90 +ENCODING 19600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7880 +93E0 +FA80 +AAA0 +FBE0 +AAA0 +FBE0 +0280 +ABE0 +AD20 +ENDCHAR +STARTCHAR U_4C91 +ENCODING 19601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +A100 +FBC0 +A900 +FFE0 +AAA0 +FFE0 +02A0 +AB40 +ACA0 +ENDCHAR +STARTCHAR U_4C92 +ENCODING 19602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7EA0 +92A0 +FF60 +B540 +FFE0 +B540 +FFE0 +1540 +A540 +A340 +ENDCHAR +STARTCHAR U_4C93 +ENCODING 19603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A80 +9440 +FBA0 +A800 +FEE0 +AAA0 +FEE0 +0440 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_4C94 +ENCODING 19604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +AFE0 +FAA0 +03E0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_4C95 +ENCODING 19605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +93E0 +F940 +AB60 +F940 +ABE0 +F940 +01C0 +A940 +A9C0 +ENDCHAR +STARTCHAR U_4C96 +ENCODING 19606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +77E0 +9080 +FFE0 +A8A0 +FBC0 +A840 +FFE0 +0540 +AFC0 +A840 +ENDCHAR +STARTCHAR U_4C97 +ENCODING 19607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +7760 +A880 +FFE0 +AA20 +FFA0 +AA20 +FEA0 +0B20 +AFA0 +A860 +ENDCHAR +STARTCHAR U_4C98 +ENCODING 19608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7BE0 +9540 +F880 +AFE0 +F820 +ABC0 +FA40 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4C99 +ENCODING 19609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +6EE0 +B540 +FEE0 +AAA0 +FEA0 +AAA0 +FEA0 +08A0 +AAE0 +AE80 +ENDCHAR +STARTCHAR U_4C9A +ENCODING 19610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +7FA0 +9220 +FFE0 +AAA0 +FAE0 +AFA0 +FAE0 +0740 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_4C9B +ENCODING 19611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7FE0 +A280 +FFE0 +AAA0 +FFE0 +A820 +F7C0 +0D40 +A540 +A7C0 +ENDCHAR +STARTCHAR U_4C9C +ENCODING 19612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3B80 +7FC0 +D540 +7FC0 +5540 +AAA0 +5540 +7FC0 +5540 +7FC0 +AAA0 +ENDCHAR +STARTCHAR U_4C9D +ENCODING 19613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7980 +9240 +FC20 +ABC0 +FA40 +AA40 +FAC0 +0A40 +3220 +C3E0 +ENDCHAR +STARTCHAR U_4C9E +ENCODING 19614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +9080 +FFE0 +A800 +FA20 +AA20 +F940 +0940 +3000 +C7E0 +ENDCHAR +STARTCHAR U_4C9F +ENCODING 19615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +72E0 +92A0 +22A0 +FBA0 +AAA0 +FAA0 +ABE0 +FAA0 +0080 +F880 +ENDCHAR +STARTCHAR U_4CA0 +ENCODING 19616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7900 +93C0 +F900 +AFE0 +FA40 +AFE0 +FA40 +03C0 +1A40 +E3C0 +ENDCHAR +STARTCHAR U_4CA1 +ENCODING 19617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +97E0 +2140 +FBE0 +AB60 +FB60 +AA20 +FBE0 +0220 +FBE0 +ENDCHAR +STARTCHAR U_4CA2 +ENCODING 19618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5180 +57C0 +7200 +5FE0 +5440 +7BA0 +5540 +57C0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_4CA3 +ENCODING 19619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +2100 +FDE0 +A640 +F940 +A540 +F940 +A880 +F880 +A940 +FE20 +ENDCHAR +STARTCHAR U_4CA4 +ENCODING 19620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +7540 +9140 +FBE0 +AAA0 +FEA0 +AAA0 +FB60 +06A0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_4CA5 +ENCODING 19621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FF00 +1120 +29E0 +FF00 +2500 +3F00 +2000 +3FE0 +4A20 +9560 +ENDCHAR +STARTCHAR U_4CA6 +ENCODING 19622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +9100 +F7C0 +9100 +F100 +8100 +FA80 +2A80 +8A40 +3420 +ENDCHAR +STARTCHAR U_4CA7 +ENCODING 19623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +27C0 +2440 +27C0 +FC40 +27E0 +2400 +27E0 +3820 +C520 +0AE0 +ENDCHAR +STARTCHAR U_4CA8 +ENCODING 19624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +FC40 +27C0 +2440 +27E0 +2400 +27E0 +3AA0 +C520 +00C0 +ENDCHAR +STARTCHAR U_4CA9 +ENCODING 19625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2400 +2FE0 +2820 +2FE0 +2820 +4FE0 +5520 +9560 +ENDCHAR +STARTCHAR U_4CAA +ENCODING 19626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +2240 +FBC0 +2240 +23E0 +3200 +53E0 +4820 +4D60 +82A0 +ENDCHAR +STARTCHAR U_4CAB +ENCODING 19627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +53C0 +5240 +53C0 +5240 +53E0 +5200 +53E0 +5520 +9440 +8FE0 +ENDCHAR +STARTCHAR U_4CAC +ENCODING 19628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +7B80 +4A80 +7A80 +4A80 +7BE0 +4280 +7A80 +AAA0 +8A60 +3320 +ENDCHAR +STARTCHAR U_4CAD +ENCODING 19629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +D3C0 +9240 +93C0 +FA40 +93E0 +9200 +93E0 +9020 +D560 +8AA0 +ENDCHAR +STARTCHAR U_4CAE +ENCODING 19630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FC0 +0440 +FFC0 +5440 +57C0 +5400 +57E0 +52A0 +5D20 +8560 +ENDCHAR +STARTCHAR U_4CAF +ENCODING 19631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4BC0 +4A40 +53C0 +5240 +7BE0 +4A00 +6BE0 +9020 +AAA0 +C960 +ENDCHAR +STARTCHAR U_4CB0 +ENCODING 19632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +73C0 +0240 +03C0 +FA40 +23E0 +2200 +43E0 +4D20 +FAA0 +0840 +ENDCHAR +STARTCHAR U_4CB1 +ENCODING 19633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +97E0 +F200 +93C0 +F240 +8240 +FA40 +0A40 +DA40 +AC80 +ENDCHAR +STARTCHAR U_4CB2 +ENCODING 19634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +2960 +49A0 +4920 +A5C0 +2100 +21E0 +4820 +75E0 +8420 +00C0 +ENDCHAR +STARTCHAR U_4CB3 +ENCODING 19635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +03C0 +7240 +53E0 +5200 +53E0 +5820 +5560 +82A0 +ENDCHAR +STARTCHAR U_4CB4 +ENCODING 19636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +2A40 +B3C0 +A240 +A3E0 +2200 +23E0 +5020 +5560 +82A0 +ENDCHAR +STARTCHAR U_4CB5 +ENCODING 19637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +2B00 +4C80 +8800 +1400 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +ENDCHAR +STARTCHAR U_4CB6 +ENCODING 19638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0000 +FFE0 +2900 +5F20 +95E0 +1F00 +1000 +1FC0 +2A40 +54C0 +ENDCHAR +STARTCHAR U_4CB7 +ENCODING 19639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +0800 +FF80 +4900 +8880 +ENDCHAR +STARTCHAR U_4CB8 +ENCODING 19640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +8BC0 +5240 +53E0 +5200 +53E0 +5020 +5560 +92A0 +ENDCHAR +STARTCHAR U_4CB9 +ENCODING 19641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +23C0 +7240 +ABE0 +2200 +23E0 +2020 +1D60 +E2A0 +ENDCHAR +STARTCHAR U_4CBA +ENCODING 19642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4BC0 +FE40 +4BC0 +4A40 +7BE0 +4A00 +4BE0 +4820 +7D60 +02A0 +ENDCHAR +STARTCHAR U_4CBB +ENCODING 19643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +23C0 +4A40 +53E0 +2200 +4BE0 +8420 +FD60 +02A0 +ENDCHAR +STARTCHAR U_4CBC +ENCODING 19644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53C0 +5240 +7FC0 +9240 +13E0 +7E00 +13E0 +1020 +1D60 +E2A0 +ENDCHAR +STARTCHAR U_4CBD +ENCODING 19645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +23C0 +4240 +7BE0 +AA00 +2BE0 +2920 +3EE0 +0040 +ENDCHAR +STARTCHAR U_4CBE +ENCODING 19646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2200 +27E0 +3020 +C9C0 +3F80 +2080 +3F80 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CBF +ENCODING 19647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4A40 +4BC0 +7A40 +53E0 +5E00 +53E0 +5420 +9960 +92A0 +ENDCHAR +STARTCHAR U_4CC0 +ENCODING 19648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +97C0 +F900 +9100 +FFE0 +8100 +F900 +0A80 +DA40 +AC20 +ENDCHAR +STARTCHAR U_4CC1 +ENCODING 19649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F220 +9200 +F7E0 +9200 +F2A0 +82A0 +FAA0 +0A40 +DAA0 +AD20 +ENDCHAR +STARTCHAR U_4CC2 +ENCODING 19650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2A40 +2BC0 +4A40 +9BE0 +0200 +7BE0 +4820 +4D60 +7AA0 +ENDCHAR +STARTCHAR U_4CC3 +ENCODING 19651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F00 +2900 +3F80 +2000 +3FC0 +D240 +3B80 +6A80 +1220 +63E0 +ENDCHAR +STARTCHAR U_4CC4 +ENCODING 19652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2BC0 +2A40 +ABC0 +BE40 +ABE0 +AA00 +ABE0 +BCA0 +E2A0 +8260 +ENDCHAR +STARTCHAR U_4CC5 +ENCODING 19653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F3E0 +9220 +F220 +9220 +F3E0 +8000 +F940 +0940 +DA20 +A420 +ENDCHAR +STARTCHAR U_4CC6 +ENCODING 19654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +47C0 +F440 +97C0 +9440 +F7E0 +9400 +97E0 +F2A0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_4CC7 +ENCODING 19655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +AAA0 +8BE0 +FE00 +8BE0 +AA00 +8BE0 +FC20 +09A0 +1A60 +ENDCHAR +STARTCHAR U_4CC8 +ENCODING 19656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FBE0 +8A20 +FC20 +83A0 +FAA0 +83A0 +FA60 +0A00 +6A20 +9BE0 +ENDCHAR +STARTCHAR U_4CC9 +ENCODING 19657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +D3C0 +2240 +53C0 +8A00 +27E0 +52A0 +2560 +1060 +ENDCHAR +STARTCHAR U_4CCA +ENCODING 19658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +43E0 +FA20 +43E0 +4A20 +6BE0 +5300 +AAE0 +ABE0 +4120 +86E0 +ENDCHAR +STARTCHAR U_4CCB +ENCODING 19659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +FA20 +ABE0 +AA20 +FBE0 +2200 +2BE0 +3420 +C2A0 +0560 +ENDCHAR +STARTCHAR U_4CCC +ENCODING 19660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +FE40 +03C0 +7A40 +4BE0 +7A00 +4BE0 +7820 +4D60 +9AA0 +ENDCHAR +STARTCHAR U_4CCD +ENCODING 19661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +53C0 +5240 +53E0 +FA40 +03E0 +5020 +52A0 +8560 +ENDCHAR +STARTCHAR U_4CCE +ENCODING 19662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +9BC0 +8A40 +8BC0 +8A40 +DBE0 +8A00 +8BE0 +8820 +8AA0 +F960 +ENDCHAR +STARTCHAR U_4CCF +ENCODING 19663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F7C0 +4440 +F7C0 +4440 +47E0 +F400 +47E0 +42A0 +7AA0 +C860 +ENDCHAR +STARTCHAR U_4CD0 +ENCODING 19664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +1940 +E280 +4C60 +3F00 +2900 +2500 +3FE0 +5520 +AAC0 +ENDCHAR +STARTCHAR U_4CD1 +ENCODING 19665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +4240 +FBC0 +CA40 +7BE0 +4A00 +7BE0 +4820 +4D60 +92A0 +ENDCHAR +STARTCHAR U_4CD2 +ENCODING 19666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7480 +2480 +FFE0 +4200 +FA20 +8940 +FC80 +0580 +F640 +0C20 +ENDCHAR +STARTCHAR U_4CD3 +ENCODING 19667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +73C0 +2A40 +FBC0 +2240 +43E0 +AA00 +33E0 +2820 +2D60 +3AA0 +ENDCHAR +STARTCHAR U_4CD4 +ENCODING 19668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +E780 +8080 +F780 +1000 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +ENDCHAR +STARTCHAR U_4CD5 +ENCODING 19669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +39E0 +C520 +55E0 +2920 +7DE0 +0900 +15E0 +7820 +92A0 +3560 +ENDCHAR +STARTCHAR U_4CD6 +ENCODING 19670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +9540 +F740 +9540 +F740 +8540 +FD40 +0F40 +D960 +A940 +ENDCHAR +STARTCHAR U_4CD7 +ENCODING 19671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7F00 +4900 +7FC0 +4000 +7F80 +AA80 +6480 +FFC0 +3200 +6500 +ENDCHAR +STARTCHAR U_4CD8 +ENCODING 19672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F660 +9240 +F7E0 +9240 +FA40 +8340 +FE60 +0AC0 +AA40 +B660 +ENDCHAR +STARTCHAR U_4CD9 +ENCODING 19673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FA20 +ABE0 +AA00 +FBA0 +0200 +FBE0 +40A0 +BB20 +1220 +71E0 +ENDCHAR +STARTCHAR U_4CDA +ENCODING 19674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8BC0 +FA40 +03E0 +FA00 +23E0 +FAA0 +2560 +2040 +ENDCHAR +STARTCHAR U_4CDB +ENCODING 19675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BE0 +FA20 +8BE0 +FA00 +43E0 +FA00 +53E0 +9020 +6520 +9560 +ENDCHAR +STARTCHAR U_4CDC +ENCODING 19676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33C0 +4B40 +F640 +23C0 +FA00 +23E0 +7020 +AAA0 +2520 +6060 +ENDCHAR +STARTCHAR U_4CDD +ENCODING 19677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4A40 +33C0 +FE40 +03E0 +7A00 +4BE0 +4AA0 +7D20 +4860 +ENDCHAR +STARTCHAR U_4CDE +ENCODING 19678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1100 +7D00 +12C0 +3A40 +12C0 +FD40 +20C0 +7B40 +9040 +3D80 +1100 +ENDCHAR +STARTCHAR U_4CDF +ENCODING 19679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +EBC0 +AA40 +BBC0 +EA40 +BBC0 +AA00 +EBE0 +2AA0 +4D20 +98C0 +ENDCHAR +STARTCHAR U_4CE0 +ENCODING 19680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E3C0 +2240 +FBC0 +2240 +ABE0 +FA00 +ABE0 +7520 +2AA0 +F060 +ENDCHAR +STARTCHAR U_4CE1 +ENCODING 19681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +43C0 +D240 +7BC0 +5240 +7BE0 +5200 +7BE0 +52A0 +7D60 +4420 +ENDCHAR +STARTCHAR U_4CE2 +ENCODING 19682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +53C0 +7240 +53E0 +7200 +53E0 +FAA0 +5520 +8860 +ENDCHAR +STARTCHAR U_4CE3 +ENCODING 19683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +2120 +FFE0 +4940 +5F80 +B160 +1F00 +1100 +1FC0 +1540 +6A40 +ENDCHAR +STARTCHAR U_4CE4 +ENCODING 19684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +ABC0 +7240 +23C0 +FA40 +ABE0 +BA00 +EBE0 +A820 +AAA0 +8D60 +ENDCHAR +STARTCHAR U_4CE5 +ENCODING 19685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A5E0 +A520 +FDE0 +2120 +51E0 +AD00 +11E0 +F8A0 +4D20 +3560 +ENDCHAR +STARTCHAR U_4CE6 +ENCODING 19686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +8240 +7BC0 +0240 +7BE0 +4A00 +7BE0 +48A0 +7EA0 +C260 +ENDCHAR +STARTCHAR U_4CE7 +ENCODING 19687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F2E0 +9220 +F7E0 +9680 +FAE0 +8240 +FBE0 +0A40 +DAA0 +AB20 +ENDCHAR +STARTCHAR U_4CE8 +ENCODING 19688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +FBC0 +2200 +FBE0 +22A0 +3D20 +C560 +ENDCHAR +STARTCHAR U_4CE9 +ENCODING 19689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2BC0 +FE40 +ABC0 +AA40 +FFE0 +4A00 +FFE0 +4820 +32A0 +CD40 +ENDCHAR +STARTCHAR U_4CEA +ENCODING 19690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +ABE0 +AAA0 +FBE0 +0200 +FBE0 +2200 +FBE0 +A820 +ABA0 +8860 +ENDCHAR +STARTCHAR U_4CEB +ENCODING 19691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E900 +B7C0 +5A40 +53C0 +8A40 +7FE0 +2200 +FFE0 +20A0 +5AA0 +8A60 +ENDCHAR +STARTCHAR U_4CEC +ENCODING 19692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +73C0 +2240 +FBE0 +AA00 +FBE0 +2120 +FD60 +2440 +ENDCHAR +STARTCHAR U_4CED +ENCODING 19693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +AA40 +EBC0 +AA40 +ABE0 +EA00 +8BE0 +AEA0 +EAA0 +0860 +ENDCHAR +STARTCHAR U_4CEE +ENCODING 19694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4B80 +78A0 +4BC0 +4AA0 +BF80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CEF +ENCODING 19695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +23C0 +FA40 +23C0 +FA40 +ABE0 +FA00 +ABE0 +F820 +2560 +FAA0 +ENDCHAR +STARTCHAR U_4CF0 +ENCODING 19696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DC0 +5540 +55C0 +DD40 +49E0 +7F00 +49E0 +5C20 +6BA0 +4A60 +ENDCHAR +STARTCHAR U_4CF1 +ENCODING 19697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +5540 +FBE0 +20A0 +6360 +3F80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CF2 +ENCODING 19698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +E400 +57E0 +E540 +55A0 +3F80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CF3 +ENCODING 19699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FBC0 +2240 +ABC0 +FA40 +03E0 +7200 +03E0 +F820 +7560 +AAA0 +ENDCHAR +STARTCHAR U_4CF4 +ENCODING 19700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +AA40 +FBC0 +2240 +ABE0 +7200 +23E0 +7020 +A960 +22A0 +ENDCHAR +STARTCHAR U_4CF5 +ENCODING 19701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +51E0 +DD20 +75E0 +D520 +55E0 +F500 +55E0 +D420 +6560 +48A0 +ENDCHAR +STARTCHAR U_4CF6 +ENCODING 19702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F2A0 +9000 +F340 +9280 +F100 +81E0 +F8A0 +0BC0 +D940 +AA20 +ENDCHAR +STARTCHAR U_4CF7 +ENCODING 19703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AB60 +4580 +CB00 +52E0 +3F80 +2480 +3FE0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_4CF8 +ENCODING 19704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +56C0 +5B40 +5FE0 +4020 +A560 +ENDCHAR +STARTCHAR U_4CF9 +ENCODING 19705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +9020 +F760 +9040 +FFE0 +85A0 +F540 +15A0 +D920 +31E0 +ENDCHAR +STARTCHAR U_4CFA +ENCODING 19706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +AA40 +73C0 +1240 +FBE0 +5200 +FBE0 +A820 +DD60 +FAA0 +ENDCHAR +STARTCHAR U_4CFB +ENCODING 19707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD00 +79E0 +7940 +FD40 +2A40 +7F00 +7F00 +7FE0 +AA20 +A960 +ENDCHAR +STARTCHAR U_4CFC +ENCODING 19708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +95C0 +F540 +95C0 +FC00 +87E0 +F6A0 +17E0 +F400 +17E0 +ENDCHAR +STARTCHAR U_4CFD +ENCODING 19709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +ABC0 +FA40 +53C0 +7A40 +D3E0 +7A00 +53E0 +7AA0 +5520 +7860 +ENDCHAR +STARTCHAR U_4CFE +ENCODING 19710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D080 +BBE0 +52A0 +ABE0 +7200 +53E0 +7200 +03E0 +5060 +3BA0 +E060 +ENDCHAR +STARTCHAR U_4CFF +ENCODING 19711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +6BE0 +BF20 +69E0 +A920 +49E0 +5500 +A1E0 +0020 +AAA0 +A860 +ENDCHAR +STARTCHAR U_4D00 +ENCODING 19712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +5240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +2020 +3D60 +E540 +ENDCHAR +STARTCHAR U_4D01 +ENCODING 19713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +8320 +7DE0 +5520 +7DE0 +5500 +FFE0 +92A0 +9BA0 +A660 +ENDCHAR +STARTCHAR U_4D02 +ENCODING 19714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +93C0 +FA40 +ABC0 +AA40 +FBE0 +4A00 +B3E0 +7520 +AD60 +6040 +ENDCHAR +STARTCHAR U_4D03 +ENCODING 19715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7DE0 +1120 +FFE0 +4520 +EFE0 +4500 +FDE0 +4820 +4D60 +8AA0 +ENDCHAR +STARTCHAR U_4D04 +ENCODING 19716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E3C0 +AA40 +FFC0 +8640 +4BE0 +FE00 +ABE0 +7C20 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_4D05 +ENCODING 19717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +5520 +FFE0 +4520 +79E0 +4900 +79E0 +4820 +7AA0 +86E0 +ENDCHAR +STARTCHAR U_4D06 +ENCODING 19718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D900 +53C0 +FA40 +53C0 +FA40 +23E0 +7200 +23E0 +F820 +52A0 +8AC0 +ENDCHAR +STARTCHAR U_4D07 +ENCODING 19719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +11C0 +FF40 +D5C0 +3940 +65E0 +9300 +79E0 +0AA0 +32A0 +1060 +ENDCHAR +STARTCHAR U_4D08 +ENCODING 19720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FBC0 +BA40 +EBC0 +BA40 +EBE0 +2200 +FBE0 +2020 +5160 +8AA0 +ENDCHAR +STARTCHAR U_4D09 +ENCODING 19721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +FE40 +03C0 +FE40 +4BE0 +7A00 +57E0 +D820 +4D60 +6540 +ENDCHAR +STARTCHAR U_4D0A +ENCODING 19722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +2240 +FBC0 +2240 +FBE0 +5200 +FBE0 +5020 +FBA0 +4C60 +ENDCHAR +STARTCHAR U_4D0B +ENCODING 19723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F2A0 +93E0 +F000 +97E0 +FA20 +83E0 +F920 +2EC0 +AA40 +9320 +ENDCHAR +STARTCHAR U_4D0C +ENCODING 19724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +9240 +F7E0 +9420 +FBC0 +8100 +FEA0 +09C0 +AEA0 +B100 +ENDCHAR +STARTCHAR U_4D0D +ENCODING 19725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE40 +AAE0 +EEA0 +AAE0 +AAA0 +EEE0 +AA80 +EEE0 +4420 +ABA0 +AA60 +ENDCHAR +STARTCHAR U_4D0E +ENCODING 19726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1500 +FFE0 +AAA0 +FBE0 +1000 +3F80 +2480 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_4D0F +ENCODING 19727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FDE0 +4920 +79E0 +4520 +F7E0 +5500 +F7E0 +4020 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_4D10 +ENCODING 19728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FDC0 +9540 +69C0 +DD40 +69E0 +9D00 +71E0 +4820 +7AA0 +CE60 +ENDCHAR +STARTCHAR U_4D11 +ENCODING 19729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +49C0 +FD40 +A5C0 +FD40 +85E0 +7900 +49E0 +7AA0 +4AA0 +FC60 +ENDCHAR +STARTCHAR U_4D12 +ENCODING 19730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +10E0 +FEA0 +BAE0 +54A0 +FEE0 +AA80 +FEE0 +5420 +BBA0 +FE60 +ENDCHAR +STARTCHAR U_4D13 +ENCODING 19731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E3C0 +2340 +FAC0 +AA40 +AAC0 +AA00 +ABE0 +A820 +B7E0 +2040 +ENDCHAR +STARTCHAR U_4D14 +ENCODING 19732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FB40 +52C0 +8A40 +5280 +53E0 +5020 +27E0 +5020 +88C0 +ENDCHAR +STARTCHAR U_4D15 +ENCODING 19733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2120 +F920 +4920 +3460 +DF80 +1480 +1FC0 +0040 +7E40 +0180 +ENDCHAR +STARTCHAR U_4D16 +ENCODING 19734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +7B40 +22C0 +FE00 +4BE0 +7820 +4FE0 +7820 +48C0 +ENDCHAR +STARTCHAR U_4D17 +ENCODING 19735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7B40 +4AC0 +7A40 +4A80 +7BE0 +2820 +FFA0 +4820 +84C0 +ENDCHAR +STARTCHAR U_4D18 +ENCODING 19736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +53C0 +5A40 +5340 +7EC0 +5200 +7BE0 +4020 +7BA0 +A820 +CCC0 +ENDCHAR +STARTCHAR U_4D19 +ENCODING 19737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7FC0 +5140 +7BC0 +4540 +4FC0 +7500 +5FE0 +7420 +95A0 +0440 +ENDCHAR +STARTCHAR U_4D1A +ENCODING 19738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3880 +27E0 +F800 +8BC0 +DA40 +AA40 +DA40 +AA40 +8A40 +FC60 +ENDCHAR +STARTCHAR U_4D1B +ENCODING 19739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +3AA0 +21C0 +FBE0 +8A20 +DBE0 +AA20 +ABE0 +DA20 +AA20 +FC60 +ENDCHAR +STARTCHAR U_4D1C +ENCODING 19740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +22A0 +FBE0 +8AA0 +DBE0 +A940 +A940 +D960 +AA40 +FA60 +ENDCHAR +STARTCHAR U_4D1D +ENCODING 19741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39C0 +2140 +F9C0 +A940 +DFE0 +AA80 +FBE0 +AAA0 +DBC0 +AEA0 +F880 +ENDCHAR +STARTCHAR U_4D1E +ENCODING 19742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2360 +3DA0 +2360 +FDA0 +AAA0 +DA40 +AFE0 +FA40 +ABE0 +DA40 +FBE0 +ENDCHAR +STARTCHAR U_4D1F +ENCODING 19743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5100 +5DC0 +5120 +5FE0 +9900 +9520 +20E0 +ENDCHAR +STARTCHAR U_4D20 +ENCODING 19744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4940 +7FC0 +5520 +58E0 +4F00 +4200 +5FE0 +8880 +B060 +ENDCHAR +STARTCHAR U_4D21 +ENCODING 19745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4920 +2940 +7FE0 +4A00 +7FC0 +4A40 +7FC0 +5A80 +9320 +9BE0 +ENDCHAR +STARTCHAR U_4D22 +ENCODING 19746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5120 +5CE0 +4200 +7FC0 +4A80 +9240 +A220 +ENDCHAR +STARTCHAR U_4D23 +ENCODING 19747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FFC0 +AAA0 +FDC0 +9480 +FFE0 +A880 +BC80 +A880 +B880 +AD80 +ENDCHAR +STARTCHAR U_4D24 +ENCODING 19748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5080 +5EE0 +4B80 +5200 +4F80 +8200 +9FC0 +ENDCHAR +STARTCHAR U_4D25 +ENCODING 19749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9240 +FFC0 +A100 +AD20 +B0E0 +9000 +BDE0 +9520 +ADE0 +ENDCHAR +STARTCHAR U_4D26 +ENCODING 19750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5080 +5AC0 +7FE0 +4000 +4F80 +8880 +0F80 +ENDCHAR +STARTCHAR U_4D27 +ENCODING 19751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FC80 +ABE0 +FC80 +ADC0 +FEA0 +8080 +ABE0 +BD40 +A880 +B760 +ENDCHAR +STARTCHAR U_4D28 +ENCODING 19752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE80 +ABE0 +FE20 +ABE0 +FE20 +ABE0 +BE80 +ABC0 +BAA0 +AD80 +ENDCHAR +STARTCHAR U_4D29 +ENCODING 19753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5100 +7FE0 +5540 +5FC0 +4000 +9FC0 +B260 +ENDCHAR +STARTCHAR U_4D2A +ENCODING 19754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +7FC0 +5100 +79C0 +4A40 +57E0 +7AA0 +91C0 +92A0 +ENDCHAR +STARTCHAR U_4D2B +ENCODING 19755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +ABE0 +FEA0 +ADC0 +FC80 +A940 +BEA0 +A9C0 +A840 +BCC0 +ENDCHAR +STARTCHAR U_4D2C +ENCODING 19756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FEA0 +55E0 +BA80 +3880 +5480 +A280 +3C80 +6440 +1860 +E620 +ENDCHAR +STARTCHAR U_4D2D +ENCODING 19757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +F840 +A840 +57E0 +A8C0 +5140 +A940 +7240 +D440 +2940 +D080 +ENDCHAR +STARTCHAR U_4D2E +ENCODING 19758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +A880 +52A0 +AAA0 +52A0 +AAA0 +72A0 +D2A0 +22A0 +D3E0 +ENDCHAR +STARTCHAR U_4D2F +ENCODING 19759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +55E0 +56A0 +B8A0 +5520 +A660 +78A0 +4B20 +3020 +CC40 +ENDCHAR +STARTCHAR U_4D30 +ENCODING 19760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +10A0 +FC80 +55E0 +BA80 +2880 +C4A0 +38A0 +E8C0 +3160 +CA20 +ENDCHAR +STARTCHAR U_4D31 +ENCODING 19761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FC80 +ABE0 +6A20 +B500 +4940 +A580 +7920 +C920 +3120 +C9E0 +ENDCHAR +STARTCHAR U_4D32 +ENCODING 19762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +AFE0 +5100 +ABC0 +5100 +AB80 +7540 +D920 +2100 +D100 +ENDCHAR +STARTCHAR U_4D33 +ENCODING 19763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +AFE0 +5420 +A800 +5140 +A940 +7140 +D240 +2220 +D420 +ENDCHAR +STARTCHAR U_4D34 +ENCODING 19764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +A9E0 +5100 +A900 +5100 +AFE0 +7420 +D420 +2420 +D7E0 +ENDCHAR +STARTCHAR U_4D35 +ENCODING 19765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +F940 +ABE0 +5140 +A940 +57E0 +A940 +7140 +D140 +2240 +D440 +ENDCHAR +STARTCHAR U_4D36 +ENCODING 19766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FB40 +A9C0 +52A0 +ADE0 +5080 +A3E0 +7080 +D3E0 +2080 +DFE0 +ENDCHAR +STARTCHAR U_4D37 +ENCODING 19767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +A820 +5380 +A800 +57E0 +AA80 +72A0 +D2A0 +24A0 +D860 +ENDCHAR +STARTCHAR U_4D38 +ENCODING 19768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FBA0 +AAA0 +5140 +ABE0 +7040 +97E0 +5080 +2080 +5280 +9100 +ENDCHAR +STARTCHAR U_4D39 +ENCODING 19769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +ABE0 +52A0 +8BE0 +2080 +77E0 +91C0 +52A0 +24A0 +D080 +ENDCHAR +STARTCHAR U_4D3A +ENCODING 19770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +AC40 +5280 +AFE0 +5000 +AFC0 +7440 +D440 +2440 +D7C0 +ENDCHAR +STARTCHAR U_4D3B +ENCODING 19771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +21E0 +FAA0 +2520 +FFE0 +2480 +5B40 +2E80 +D160 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_4D3C +ENCODING 19772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA80 +5120 +AEE0 +5280 +A240 +7FE0 +D140 +20A0 +D760 +ENDCHAR +STARTCHAR U_4D3D +ENCODING 19773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +AAA0 +53E0 +AAA0 +53E0 +A980 +7280 +D7E0 +2080 +D080 +ENDCHAR +STARTCHAR U_4D3E +ENCODING 19774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +A880 +53E0 +A880 +53E0 +A900 +71E0 +D280 +2480 +DBE0 +ENDCHAR +STARTCHAR U_4D3F +ENCODING 19775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +ABC0 +5000 +AFE0 +5200 +ADA0 +72C0 +D5A0 +2280 +D580 +ENDCHAR +STARTCHAR U_4D40 +ENCODING 19776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FAA0 +A9C0 +53E0 +AA20 +53A0 +AAE0 +7220 +D3E0 +2140 +D220 +ENDCHAR +STARTCHAR U_4D41 +ENCODING 19777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FAE0 +2F20 +72C0 +AA80 +7340 +AE40 +7BE0 +DA40 +2B40 +DAC0 +ENDCHAR +STARTCHAR U_4D42 +ENCODING 19778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2240 +77E0 +AD20 +77E0 +AD20 +7FA0 +D4A0 +27A0 +D460 +ENDCHAR +STARTCHAR U_4D43 +ENCODING 19779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FFE0 +5540 +BBE0 +26A0 +5BE0 +CAA0 +2BE0 +1140 +2A20 +C420 +ENDCHAR +STARTCHAR U_4D44 +ENCODING 19780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +AAA0 +73E0 +AAA0 +57E0 +8A20 +73E0 +D220 +3140 +4BE0 +ENDCHAR +STARTCHAR U_4D45 +ENCODING 19781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +1340 +FCC0 +4920 +FFE0 +4A40 +B7A0 +4940 +0F00 +70C0 +ENDCHAR +STARTCHAR U_4D46 +ENCODING 19782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA40 +57E0 +AC20 +53C0 +A920 +76C0 +D180 +26C0 +D120 +ENDCHAR +STARTCHAR U_4D47 +ENCODING 19783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +41E0 +5440 +7F40 +5540 +5D40 +7680 +5C80 +5540 +9220 +ENDCHAR +STARTCHAR U_4D48 +ENCODING 19784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5600 +AFE0 +6220 +AFC0 +2A80 +15C0 +7FE0 +4880 +7DE0 +5DC0 +AAA0 +ENDCHAR +STARTCHAR U_4D49 +ENCODING 19785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5580 +7F60 +5540 +9D40 +94C0 +ENDCHAR +STARTCHAR U_4D4A +ENCODING 19786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +57C0 +5280 +7FE0 +5540 +FFC0 +5540 +57C0 +5000 +9280 +B440 +ENDCHAR +STARTCHAR U_4D4B +ENCODING 19787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +57E0 +FA00 +03C0 +FE40 +ABC0 +FA40 +ABC0 +5240 +8AC0 +ENDCHAR +STARTCHAR U_4D4C +ENCODING 19788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +57C0 +FD40 +AB40 +FBA0 +AD00 +F900 +5280 +5440 +8820 +ENDCHAR +STARTCHAR U_4D4D +ENCODING 19789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5000 +F9C0 +0140 +F9C0 +A800 +A9C0 +F880 +53E0 +8880 +ENDCHAR +STARTCHAR U_4D4E +ENCODING 19790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FAA0 +53E0 +F800 +23E0 +F900 +ABE0 +FAA0 +AAA0 +52A0 +8A60 +ENDCHAR +STARTCHAR U_4D4F +ENCODING 19791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F920 +55A0 +FB60 +05A0 +FB60 +A880 +FB40 +A8A0 +5040 +8B80 +ENDCHAR +STARTCHAR U_4D50 +ENCODING 19792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FAA0 +53E0 +FD40 +02A0 +FBE0 +AAA0 +FBE0 +A880 +57E0 +8880 +ENDCHAR +STARTCHAR U_4D51 +ENCODING 19793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +F3E0 +2120 +F920 +7320 +A920 +51A0 +A920 +7120 +AA20 +64C0 +ENDCHAR +STARTCHAR U_4D52 +ENCODING 19794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1800 +E3C0 +2240 +FE40 +7240 +ABC0 +2240 +5240 +AA40 +73C0 +AA40 +ENDCHAR +STARTCHAR U_4D53 +ENCODING 19795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +2280 +FBE0 +7480 +A880 +5080 +AFE0 +A880 +7080 +A880 +6080 +ENDCHAR +STARTCHAR U_4D54 +ENCODING 19796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +23E0 +FC80 +73E0 +AAA0 +23E0 +DAA0 +ABE0 +71C0 +AAA0 +64A0 +ENDCHAR +STARTCHAR U_4D55 +ENCODING 19797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E3E0 +2220 +FBE0 +7280 +ABE0 +5280 +AA80 +73E0 +AB20 +65E0 +ENDCHAR +STARTCHAR U_4D56 +ENCODING 19798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A140 +F880 +9140 +FFA0 +0400 +FFE0 +2A80 +D560 +2E80 +5540 +ENDCHAR +STARTCHAR U_4D57 +ENCODING 19799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2000 +FDC0 +6940 +A5C0 +5000 +ABE0 +AAA0 +73E0 +AEA0 +63E0 +ENDCHAR +STARTCHAR U_4D58 +ENCODING 19800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +2240 +FBC0 +7240 +AFE0 +5200 +ABE0 +AEA0 +72A0 +AD20 +6240 +ENDCHAR +STARTCHAR U_4D59 +ENCODING 19801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +27E0 +FA40 +75E0 +AB40 +2080 +5300 +A9E0 +72A0 +A8C0 +6700 +ENDCHAR +STARTCHAR U_4D5A +ENCODING 19802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +2720 +FD20 +72C0 +A900 +2660 +5420 +AF60 +7420 +AFE0 +6420 +ENDCHAR +STARTCHAR U_4D5B +ENCODING 19803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F760 +4AA0 +FFA0 +6940 +DF40 +4AA0 +AFA0 +5100 +E7C0 +5100 +DFE0 +ENDCHAR +STARTCHAR U_4D5C +ENCODING 19804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +23E0 +FAA0 +73E0 +AAA0 +73E0 +AA00 +ABE0 +76A0 +AA40 +6B20 +ENDCHAR +STARTCHAR U_4D5D +ENCODING 19805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +D680 +BA80 +FE80 +1080 +7C80 +1080 +FE80 +0080 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_4D5E +ENCODING 19806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +D420 +BD20 +9520 +FD20 +1120 +7D20 +1120 +FC20 +AA20 +AA60 +ENDCHAR +STARTCHAR U_4D5F +ENCODING 19807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +DC80 +B480 +FC80 +1080 +7BE0 +1080 +FC80 +0080 +A480 +A480 +ENDCHAR +STARTCHAR U_4D60 +ENCODING 19808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5500 +7DE0 +5520 +7E20 +1020 +7D20 +10A0 +FE20 +AAA0 +AA40 +ENDCHAR +STARTCHAR U_4D61 +ENCODING 19809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFC0 +3580 +6EC0 +BFA0 +0400 +3F80 +0400 +FFE0 +5240 +ENDCHAR +STARTCHAR U_4D62 +ENCODING 19810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +F9C0 +2080 +7080 +23E0 +F880 +01C0 +51C0 +AAA0 +0080 +ENDCHAR +STARTCHAR U_4D63 +ENCODING 19811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7DE0 +6D20 +5520 +7DE0 +1120 +7D20 +11E0 +FE00 +0000 +ABE0 +ENDCHAR +STARTCHAR U_4D64 +ENCODING 19812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +FFE0 +2100 +7FC0 +5540 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_4D65 +ENCODING 19813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AC80 +FFE0 +2AA0 +72A0 +23E0 +FA00 +6A20 +D620 +A3E0 +ENDCHAR +STARTCHAR U_4D66 +ENCODING 19814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +AA40 +F840 +ADE0 +FA40 +2040 +7140 +2140 +FA40 +5240 +AEC0 +ENDCHAR +STARTCHAR U_4D67 +ENCODING 19815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F920 +2100 +FFE0 +A900 +F940 +2140 +F880 +2180 +FEA0 +AA60 +ENDCHAR +STARTCHAR U_4D68 +ENCODING 19816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +5540 +7FE0 +5500 +7D40 +1180 +7AE0 +1280 +FAE0 +5580 +54E0 +ENDCHAR +STARTCHAR U_4D69 +ENCODING 19817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +FD20 +3920 +F460 +3F80 +2E80 +3F80 +1500 +FFE0 +6AC0 +ENDCHAR +STARTCHAR U_4D6A +ENCODING 19818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5520 +7DE0 +5520 +7DE0 +1000 +7D40 +11E0 +FF40 +AB40 +ABE0 +ENDCHAR +STARTCHAR U_4D6B +ENCODING 19819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A3A0 +5480 +AC40 +1780 +7FC0 +5540 +0400 +7FC0 +9120 +ENDCHAR +STARTCHAR U_4D6C +ENCODING 19820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CA0 +57C0 +7D80 +56C0 +7CA0 +1080 +7DE0 +1120 +FFE0 +AB20 +ABE0 +ENDCHAR +STARTCHAR U_4D6D +ENCODING 19821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +55C0 +7CA0 +54A0 +7FE0 +1080 +7FE0 +1320 +FDE0 +AB20 +ABE0 +ENDCHAR +STARTCHAR U_4D6E +ENCODING 19822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA20 +ABE0 +FA20 +23E0 +F800 +27E0 +3A00 +E7E0 +1520 +AAE0 +ENDCHAR +STARTCHAR U_4D6F +ENCODING 19823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +AB80 +FFE0 +FAA0 +23E0 +72A0 +23E0 +F080 +55C0 +AA80 +83E0 +ENDCHAR +STARTCHAR U_4D70 +ENCODING 19824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +ABE0 +FE40 +ABC0 +FA40 +27E0 +7200 +27E0 +FAA0 +0520 +AAC0 +ENDCHAR +STARTCHAR U_4D71 +ENCODING 19825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +F880 +AFE0 +FA40 +23C0 +F940 +27E0 +3A40 +EBC0 +AA40 +ENDCHAR +STARTCHAR U_4D72 +ENCODING 19826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA40 +FA40 +AFE0 +FDA0 +27E0 +7080 +27E0 +F9C0 +52A0 +ACA0 +ENDCHAR +STARTCHAR U_4D73 +ENCODING 19827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +AA40 +FDA0 +A800 +FFE0 +24A0 +FFE0 +2240 +FBC0 +AA40 +A3C0 +ENDCHAR +STARTCHAR U_4D74 +ENCODING 19828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FAA0 +ABE0 +F880 +23E0 +72A0 +23E0 +7AA0 +D7A0 +A8E0 +ENDCHAR +STARTCHAR U_4D75 +ENCODING 19829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +9240 +3F80 +2880 +2480 +FFE0 +2480 +DF60 +0400 +6B40 +ENDCHAR +STARTCHAR U_4D76 +ENCODING 19830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +8EE0 +0A80 +EEE0 +AAA0 +AEE0 +EAA0 +0EE0 +0A80 +33E0 +ENDCHAR +STARTCHAR U_4D77 +ENCODING 19831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +EEE0 +4280 +EEE0 +0AA0 +4EE0 +EAA0 +4EE0 +6A00 +83E0 +ENDCHAR +STARTCHAR U_4D78 +ENCODING 19832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +22A0 +FC80 +7140 +AA20 +2420 +7FC0 +4A40 +7BC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_4D79 +ENCODING 19833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7E40 +ABE0 +7A40 +2E40 +D0C0 +7FC0 +4A40 +7BC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_4D7A +ENCODING 19834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +4AA0 +4BA0 +4AA0 +EBA0 +4820 +4EE0 +4280 +6EE0 +8AA0 +12A0 +ENDCHAR +STARTCHAR U_4D7B +ENCODING 19835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3940 +2BE0 +B940 +ABE0 +B940 +A940 +FFE0 +2840 +EFE0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_4D7C +ENCODING 19836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7A40 +0FE0 +7A40 +8940 +5FA0 +54A0 +72E0 +1F80 +70E0 +90A0 +ENDCHAR +STARTCHAR U_4D7D +ENCODING 19837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +73E0 +5220 +7740 +5E80 +F560 +3F00 +1080 +3FC0 +ENDCHAR +STARTCHAR U_4D7E +ENCODING 19838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +6FE0 +A480 +2280 +F880 +23E0 +F880 +53E0 +7140 +5080 +FB60 +ENDCHAR +STARTCHAR U_4D7F +ENCODING 19839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +9120 +F4C0 +5720 +E400 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_4D80 +ENCODING 19840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +4880 +7BC0 +5140 +FAE0 +0E00 +3180 +CE60 +1100 +1F00 +ENDCHAR +STARTCHAR U_4D81 +ENCODING 19841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +5640 +3D80 +D660 +2D80 +3FC0 +2240 +3FC0 +ENDCHAR +STARTCHAR U_4D82 +ENCODING 19842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8900 +DBE0 +8A20 +DC20 +A920 +F8A0 +A820 +F820 +AA20 +F6C0 +ENDCHAR +STARTCHAR U_4D83 +ENCODING 19843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8880 +D940 +8940 +FA20 +ACA0 +73C0 +A840 +F840 +AC80 +F880 +ENDCHAR +STARTCHAR U_4D84 +ENCODING 19844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8880 +DAA0 +89C0 +F880 +AFE0 +F880 +A880 +F880 +AC80 +E880 +ENDCHAR +STARTCHAR U_4D85 +ENCODING 19845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D900 +89E0 +DB40 +8C80 +F940 +0620 +ABC0 +FA40 +ABC0 +F820 +A7C0 +ENDCHAR +STARTCHAR U_4D86 +ENCODING 19846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +9A40 +8BE0 +DE40 +8BE0 +FA40 +AA40 +FBE0 +AA40 +FA40 +A7E0 +ENDCHAR +STARTCHAR U_4D87 +ENCODING 19847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D880 +8BE0 +DAA0 +8BE0 +FAA0 +03E0 +A940 +F9C0 +A940 +F9C0 +A540 +ENDCHAR +STARTCHAR U_4D88 +ENCODING 19848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D880 +8BE0 +D880 +8BE0 +FAA0 +03E0 +AAA0 +F840 +ABE0 +F940 +A4C0 +ENDCHAR +STARTCHAR U_4D89 +ENCODING 19849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +8AE0 +DAA0 +8B60 +F940 +0240 +ABE0 +FAA0 +ABE0 +FAA0 +ABE0 +ENDCHAR +STARTCHAR U_4D8A +ENCODING 19850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4920 +7920 +4920 +FFE0 +A520 +FD20 +4920 +4920 +8BE0 +ENDCHAR +STARTCHAR U_4D8B +ENCODING 19851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7240 +5280 +7AE0 +5220 +FB20 +AB40 +FAC0 +5480 +5540 +9A20 +ENDCHAR +STARTCHAR U_4D8C +ENCODING 19852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +5C20 +6BA0 +FAA0 +ABA0 +FA20 +AA60 +FA00 +5220 +93E0 +ENDCHAR +STARTCHAR U_4D8D +ENCODING 19853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F9E0 +2160 +49A0 +FBE0 +26A0 +FBE0 +22A0 +23E0 +3940 +C240 +ENDCHAR +STARTCHAR U_4D8E +ENCODING 19854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +5940 +6A20 +7FE0 +5400 +7DC0 +5540 +FF40 +29C0 +C940 +ENDCHAR +STARTCHAR U_4D8F +ENCODING 19855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +11E0 +F960 +29A0 +FBE0 +A2A0 +FBE0 +6AA0 +6BE0 +B940 +2240 +ENDCHAR +STARTCHAR U_4D90 +ENCODING 19856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +7A40 +5DA0 +6800 +FBE0 +AAA0 +FBE0 +0120 +F9E0 +5120 +91E0 +ENDCHAR +STARTCHAR U_4D91 +ENCODING 19857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +5880 +6BE0 +FEA0 +ABE0 +F940 +ABE0 +F8C0 +5280 +95E0 +ENDCHAR +STARTCHAR U_4D92 +ENCODING 19858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +F5E0 +5540 +A0A0 +5F40 +4840 +5B40 +4C40 +9B20 +ENDCHAR +STARTCHAR U_4D93 +ENCODING 19859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F940 +AEA0 +AAC0 +AEA0 +AA40 +ABC0 +BA40 +23C0 +2440 +ENDCHAR +STARTCHAR U_4D94 +ENCODING 19860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B880 +A2A0 +FBE0 +06A0 +AAA0 +DAA0 +FAC0 +AA80 +DA20 +F9E0 +ENDCHAR +STARTCHAR U_4D95 +ENCODING 19861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +B3E0 +A2A0 +FAA0 +02A0 +ABE0 +DA00 +AA00 +DA20 +8A20 +F9C0 +ENDCHAR +STARTCHAR U_4D96 +ENCODING 19862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B140 +A140 +FA20 +05E0 +A800 +DBE0 +A820 +D840 +8880 +F900 +ENDCHAR +STARTCHAR U_4D97 +ENCODING 19863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +B7E0 +A040 +F840 +03C0 +AAC0 +DAC0 +ABC0 +D840 +8840 +F8C0 +ENDCHAR +STARTCHAR U_4D98 +ENCODING 19864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5880 +53E0 +F800 +0220 +DA20 +A920 +F940 +D940 +A800 +FBE0 +ENDCHAR +STARTCHAR U_4D99 +ENCODING 19865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +B3E0 +A200 +FBC0 +0240 +AA40 +DA40 +ABC0 +DA00 +8A00 +FBE0 +ENDCHAR +STARTCHAR U_4D9A +ENCODING 19866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B080 +A080 +FBE0 +02A0 +AAA0 +DBE0 +A880 +D8A0 +89E0 +FA20 +ENDCHAR +STARTCHAR U_4D9B +ENCODING 19867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +2120 +7D20 +AA20 +1360 +6A00 +FFE0 +4940 +76C0 +4940 +7FC0 +ENDCHAR +STARTCHAR U_4D9C +ENCODING 19868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1280 +5BE0 +5280 +FFE0 +0000 +ADE0 +D520 +AD20 +D520 +FDE0 +ENDCHAR +STARTCHAR U_4D9D +ENCODING 19869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +5C80 +53E0 +FC80 +A6A0 +B5C0 +CEA0 +FC80 +A540 +D540 +FE20 +ENDCHAR +STARTCHAR U_4D9E +ENCODING 19870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +5D40 +53E0 +FF40 +ADC0 +D540 +FDC0 +AD40 +B7E0 +CD40 +FE20 +ENDCHAR +STARTCHAR U_4D9F +ENCODING 19871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +B9E0 +A220 +FA40 +0500 +AA60 +DA20 +AB60 +DA20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_4DA0 +ENCODING 19872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4080 +7FA0 +5540 +9DC0 +2120 +FFE0 +5240 +6DC0 +5240 +7FC0 +ENDCHAR +STARTCHAR U_4DA1 +ENCODING 19873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E20 +AA20 +FAA0 +2EA0 +5AA0 +8EA0 +FAA0 +AEA0 +D8A0 +8A20 +FA60 +ENDCHAR +STARTCHAR U_4DA2 +ENCODING 19874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +B8A0 +AFE0 +F880 +2F80 +D880 +AEA0 +FAA0 +AE40 +D8C0 +F320 +ENDCHAR +STARTCHAR U_4DA3 +ENCODING 19875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5AA0 +53E0 +FC00 +01E0 +AD20 +D520 +FDE0 +AD20 +D4C0 +FFE0 +ENDCHAR +STARTCHAR U_4DA4 +ENCODING 19876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +BC40 +A5C0 +F540 +2FE0 +DA40 +ABC0 +FA40 +ABC0 +DA40 +FCC0 +ENDCHAR +STARTCHAR U_4DA5 +ENCODING 19877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +B880 +A3E0 +FAA0 +23E0 +DAA0 +AAE0 +FAA0 +AAE0 +DAA0 +FDE0 +ENDCHAR +STARTCHAR U_4DA6 +ENCODING 19878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +B7E0 +A100 +FBC0 +2100 +DFE0 +AA40 +FBC0 +AA40 +DBC0 +FC20 +ENDCHAR +STARTCHAR U_4DA7 +ENCODING 19879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +53E0 +FC80 +2BE0 +B540 +DFE0 +F540 +AFE0 +D540 +FD40 +8260 +ENDCHAR +STARTCHAR U_4DA8 +ENCODING 19880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +B940 +A220 +FDC0 +0000 +ABE0 +AAA0 +FBE0 +A940 +AAA0 +FCA0 +ENDCHAR +STARTCHAR U_4DA9 +ENCODING 19881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +BFE0 +A280 +FD60 +2540 +DD60 +AA40 +FBC0 +AA40 +DBC0 +FC40 +ENDCHAR +STARTCHAR U_4DAA +ENCODING 19882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +BF60 +A240 +FFE0 +2A40 +D940 +AFC0 +F960 +AFC0 +D920 +FFA0 +ENDCHAR +STARTCHAR U_4DAB +ENCODING 19883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +B360 +A2A0 +F800 +23E0 +DA80 +8BE0 +FAA0 +ABA0 +DAA0 +8BC0 +FCA0 +ENDCHAR +STARTCHAR U_4DAC +ENCODING 19884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +2080 +FBC0 +5200 +FBC0 +5040 +73C0 +5220 +B3E0 +ENDCHAR +STARTCHAR U_4DAD +ENCODING 19885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +4BE0 +F880 +4080 +53E0 +5080 +5480 +57E0 +5800 +4820 +97E0 +ENDCHAR +STARTCHAR U_4DAE +ENCODING 19886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7FC0 +0A80 +3320 +E1E0 +3F80 +0400 +7FC0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4DAF +ENCODING 19887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +53C0 +F480 +57E0 +5AA0 +56E0 +9AC0 +6AA0 +27C0 +5A20 +85C0 +ENDCHAR +STARTCHAR U_4DB0 +ENCODING 19888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38C0 +4980 +FE80 +AA80 +EFE0 +2880 +FFE0 +2A80 +FE80 +20A0 +DEE0 +ENDCHAR +STARTCHAR U_4DB1 +ENCODING 19889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5A40 +D7E0 +22A0 +57E0 +4A80 +A7E0 +12A0 +47E0 +2220 +11E0 +ENDCHAR +STARTCHAR U_4DB2 +ENCODING 19890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +AAE0 +FE80 +AAE0 +FFA0 +8AE0 +8F80 +8AA0 +9EE0 +ENDCHAR +STARTCHAR U_4DB3 +ENCODING 19891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +3840 +45E0 +FE00 +AAE0 +FEA0 +00A0 +FEA0 +AAA0 +FEA0 +AB20 +ENDCHAR +STARTCHAR U_4DB4 +ENCODING 19892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +74A0 +5140 +8F20 +F0E0 +3F80 +2A80 +7FC0 +4A40 +7FC0 +4A40 +ENDCHAR +STARTCHAR U_4DB5 +ENCODING 19893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39E0 +4540 +BA60 +0240 +FFE0 +AAA0 +FEC0 +AB60 +FEA0 +AAA0 +8520 +ENDCHAR +STARTCHAR U_4E00 +ENCODING 19968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 2 0 4 +BITMAP +0040 +FFE0 +ENDCHAR +STARTCHAR U_4E01 +ENCODING 19969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FFC0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E02 +ENCODING 19970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +1000 +3FC0 +0040 +0040 +0040 +0080 +0080 +0700 +ENDCHAR +STARTCHAR U_4E03 +ENCODING 19971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +0800 +08C0 +0F00 +F800 +0800 +0800 +0840 +0840 +07C0 +ENDCHAR +STARTCHAR U_4E04 +ENCODING 19972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E05 +ENCODING 19973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4E06 +ENCODING 19974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 2 +BITMAP +FFE0 +0400 +0400 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_4E07 +ENCODING 19975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0800 +0800 +0F80 +0880 +0880 +1080 +1080 +2080 +4300 +ENDCHAR +STARTCHAR U_4E08 +ENCODING 19976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2400 +2400 +1400 +0800 +1400 +2200 +C1E0 +ENDCHAR +STARTCHAR U_4E09 +ENCODING 19977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +0000 +0000 +3F80 +0000 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E0A +ENCODING 19978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +07C0 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E0B +ENCODING 19979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +0600 +0500 +0480 +0480 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4E0C +ENCODING 19980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +1100 +1100 +1100 +1100 +1100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_4E0D +ENCODING 19981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +0200 +0400 +0D00 +1480 +2440 +4420 +8400 +0400 +0400 +ENDCHAR +STARTCHAR U_4E0E +ENCODING 19982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +1000 +1000 +1FC0 +0040 +FE40 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_4E0F +ENCODING 19983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +4FC0 +4840 +4840 +7FC0 +0040 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_4E10 +ENCODING 19984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +4400 +47C0 +4400 +7FC0 +0040 +0040 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_4E11 +ENCODING 19985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7F80 +0880 +0880 +0880 +7F80 +1080 +1080 +1080 +1080 +FFE0 +ENDCHAR +STARTCHAR U_4E12 +ENCODING 19986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0840 +2840 +1840 +0C40 +0A40 +1040 +2040 +4380 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E13 +ENCODING 19987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +0400 +0400 +FFE0 +0800 +1FC0 +0080 +0D00 +0200 +0100 +ENDCHAR +STARTCHAR U_4E14 +ENCODING 19988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2100 +3F00 +2100 +2100 +2100 +3F00 +2100 +2100 +FFC0 +ENDCHAR +STARTCHAR U_4E15 +ENCODING 19989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0200 +0400 +0C00 +1480 +2440 +4420 +8420 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E16 +ENCODING 19990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +2480 +2480 +FFE0 +2480 +2480 +2480 +2780 +2000 +2000 +3FE0 +ENDCHAR +STARTCHAR U_4E17 +ENCODING 19991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2480 +FFE0 +2480 +2480 +2480 +2480 +2480 +3F80 +2080 +ENDCHAR +STARTCHAR U_4E18 +ENCODING 19992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +1E00 +1000 +1000 +1FC0 +1100 +1100 +1100 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4E19 +ENCODING 19993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4640 +4940 +5040 +4040 +4040 +41C0 +ENDCHAR +STARTCHAR U_4E1A +ENCODING 19994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +0920 +8920 +4940 +2940 +2980 +0900 +0900 +0900 +FFE0 +ENDCHAR +STARTCHAR U_4E1B +ENCODING 19995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +1080 +1080 +2880 +2540 +4240 +8C20 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E1C +ENCODING 19996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +1400 +2400 +7F80 +0400 +2500 +4480 +8440 +1C00 +ENDCHAR +STARTCHAR U_4E1D +ENCODING 19997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2940 +4A40 +F780 +1080 +2100 +4200 +F7C0 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E1E +ENCODING 19998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0220 +74C0 +1700 +2500 +4480 +8460 +0C00 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E1F +ENCODING 19999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0400 +7FC0 +0400 +0400 +FFE0 +0800 +1100 +2080 +7FC0 +ENDCHAR +STARTCHAR U_4E20 +ENCODING 20000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1240 +F280 +1300 +1200 +3240 +D240 +11C0 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E21 +ENCODING 20001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4440 +5540 +5540 +5540 +5F40 +4040 +40C0 +ENDCHAR +STARTCHAR U_4E22 +ENCODING 20002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +0400 +7FC0 +0400 +0400 +FFE0 +0800 +1080 +3FC0 +1040 +ENDCHAR +STARTCHAR U_4E23 +ENCODING 20003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +0A00 +7BC0 +4A40 +4A40 +7BC0 +0A00 +1200 +1200 +2200 +ENDCHAR +STARTCHAR U_4E24 +ENCODING 20004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1200 +1200 +7FC0 +5240 +5240 +5B40 +64C0 +4840 +4040 +40C0 +ENDCHAR +STARTCHAR U_4E25 +ENCODING 20005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +0A00 +4A40 +2A80 +0A00 +7FC0 +4000 +4000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_4E26 +ENCODING 20006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0A00 +4A40 +4A40 +2A40 +2A80 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4E27 +ENCODING 20007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +1500 +FFE0 +2440 +2280 +2100 +2C80 +3060 +ENDCHAR +STARTCHAR U_4E28 +ENCODING 20008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 6 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_4E29 +ENCODING 20009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +08 +88 +88 +88 +88 +98 +E8 +88 +08 +08 +08 +ENDCHAR +STARTCHAR U_4E2A +ENCODING 20010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +1400 +2200 +4900 +88C0 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_4E2B +ENCODING 20011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8080 +4100 +2200 +2400 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_4E2C +ENCODING 20012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 1 -1 +BITMAP +04 +44 +24 +24 +04 +14 +24 +C4 +44 +04 +04 +ENDCHAR +STARTCHAR U_4E2D +ENCODING 20013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_4E2E +ENCODING 20014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +0880 +0880 +7E80 +0880 +0880 +FF80 +08A0 +08A0 +0860 +0820 +ENDCHAR +STARTCHAR U_4E2F +ENCODING 20015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0580 +0E00 +7440 +0580 +0E00 +7460 +0580 +1E00 +E400 +0400 +ENDCHAR +STARTCHAR U_4E30 +ENCODING 20016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E31 +ENCODING 20017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +9240 +9240 +9240 +9240 +B3C0 +D240 +1200 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_4E32 +ENCODING 20018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +7F00 +4900 +7F00 +0800 +FF80 +8880 +8880 +FF80 +0800 +0800 +ENDCHAR +STARTCHAR U_4E33 +ENCODING 20019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +7F80 +5280 +7F80 +1200 +FFC0 +9240 +FFC0 +1200 +2200 +C200 +ENDCHAR +STARTCHAR U_4E34 +ENCODING 20020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +A7E0 +A800 +B100 +A080 +AFE0 +A920 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4E35 +ENCODING 20021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +4A40 +2A80 +FFE0 +1100 +0A00 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E36 +ENCODING 20022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 4 4 3 +BITMAP +80 +40 +20 +20 +ENDCHAR +STARTCHAR U_4E37 +ENCODING 20023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 5 1 3 +BITMAP +80C0 +4080 +3100 +1200 +0400 +ENDCHAR +STARTCHAR U_4E38 +ENCODING 20024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7F00 +0900 +0900 +2900 +1900 +1500 +2520 +4120 +80E0 +ENDCHAR +STARTCHAR U_4E39 +ENCODING 20025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1480 +1280 +1080 +FFE0 +1080 +1080 +1080 +2080 +4380 +ENDCHAR +STARTCHAR U_4E3A +ENCODING 20026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4800 +2800 +0800 +FF80 +0880 +0C80 +1280 +1280 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_4E3B +ENCODING 20027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0400 +0400 +0400 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4E3C +ENCODING 20028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FE0 +1100 +1900 +1500 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_4E3D +ENCODING 20029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +7BC0 +4A40 +4A40 +6B40 +5AC0 +4A40 +4A40 +4A40 +5AC0 +ENDCHAR +STARTCHAR U_4E3E +ENCODING 20030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +FFE0 +1100 +2480 +5F40 +8420 +0400 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E3F +ENCODING 20031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 3 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_4E40 +ENCODING 20032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +2000 +2000 +5000 +8800 +0400 +0200 +0100 +00E0 +0040 +ENDCHAR +STARTCHAR U_4E41 +ENCODING 20033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FC00 +0400 +0400 +0400 +0400 +0200 +0200 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_4E42 +ENCODING 20034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +2080 +2080 +1100 +1100 +1200 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_4E43 +ENCODING 20035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0880 +0880 +0900 +13E0 +1020 +1020 +2020 +2020 +4240 +8180 +ENDCHAR +STARTCHAR U_4E44 +ENCODING 20036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 0 +BITMAP +0040 +0040 +0080 +0880 +0500 +0300 +0280 +8440 +9840 +E000 +ENDCHAR +STARTCHAR U_4E45 +ENCODING 20037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1F00 +2100 +4200 +0200 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4E46 +ENCODING 20038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1100 +1100 +2100 +3E00 +0200 +0500 +0900 +1080 +2040 +C020 +ENDCHAR +STARTCHAR U_4E47 +ENCODING 20039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0600 +F800 +0800 +0800 +0FC0 +F800 +0800 +0820 +0820 +07E0 +ENDCHAR +STARTCHAR U_4E48 +ENCODING 20040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0800 +1100 +2100 +4200 +8400 +0880 +1040 +7FE0 +2020 +ENDCHAR +STARTCHAR U_4E49 +ENCODING 20041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +2480 +2480 +2100 +1100 +1200 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_4E4A +ENCODING 20042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 1 +BITMAP +01E0 +FE00 +0000 +0040 +4040 +2080 +1080 +1100 +ENDCHAR +STARTCHAR U_4E4B +ENCODING 20043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FC0 +0080 +0100 +0200 +0400 +0800 +3000 +4800 +87E0 +ENDCHAR +STARTCHAR U_4E4C +ENCODING 20044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1080 +1080 +1180 +1000 +1FE0 +0020 +FF20 +0020 +00C0 +ENDCHAR +STARTCHAR U_4E4D +ENCODING 20045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +2400 +4400 +87C0 +0400 +0400 +07C0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E4E +ENCODING 20046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +2440 +1480 +1500 +FFE0 +0400 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_4E4F +ENCODING 20047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0300 +FC00 +0800 +0400 +7F00 +0200 +0400 +0800 +3000 +4800 +87C0 +ENDCHAR +STARTCHAR U_4E50 +ENCODING 20048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +7C00 +4000 +4400 +4400 +7FC0 +0400 +2500 +4480 +8440 +0C00 +ENDCHAR +STARTCHAR U_4E51 +ENCODING 20049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FC00 +0440 +1480 +2500 +4600 +1600 +2500 +4480 +8460 +0440 +ENDCHAR +STARTCHAR U_4E52 +ENCODING 20050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +1E00 +1000 +1FC0 +1100 +1100 +FFE0 +0000 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_4E53 +ENCODING 20051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +1E00 +1000 +1FC0 +1100 +1100 +FFE0 +0000 +0100 +0080 +0060 +ENDCHAR +STARTCHAR U_4E54 +ENCODING 20052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0800 +FFE0 +1100 +2080 +D160 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_4E55 +ENCODING 20053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +7E00 +4200 +5FC0 +4200 +7FE0 +4200 +5FC0 +5240 +92C0 +8200 +ENDCHAR +STARTCHAR U_4E56 +ENCODING 20054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +1500 +7540 +1580 +3520 +D4E0 +0400 +0400 +ENDCHAR +STARTCHAR U_4E57 +ENCODING 20055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +7FC0 +1500 +FFE0 +1500 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4E58 +ENCODING 20056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +1540 +75A0 +1520 +FEE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_4E59 +ENCODING 20057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_4E5A +ENCODING 20058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +82 +82 +82 +7E +ENDCHAR +STARTCHAR U_4E5B +ENCODING 20059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +FFE0 +0040 +0080 +ENDCHAR +STARTCHAR U_4E5C +ENCODING 20060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1040 +13C0 +1C40 +F040 +1040 +1280 +1100 +1020 +1020 +0FE0 +ENDCHAR +STARTCHAR U_4E5D +ENCODING 20061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1000 +FE00 +1200 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_4E5E +ENCODING 20062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3F80 +4000 +BE00 +0400 +0800 +1000 +2040 +2040 +1FC0 +ENDCHAR +STARTCHAR U_4E5F +ENCODING 20063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +24C0 +2740 +3C40 +E440 +2540 +2480 +2420 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E60 +ENCODING 20064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0080 +2080 +1080 +1080 +0280 +0C80 +3080 +C080 +0480 +0300 +ENDCHAR +STARTCHAR U_4E61 +ENCODING 20065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1000 +2200 +7C00 +0880 +1100 +7F00 +0200 +0400 +1800 +E000 +ENDCHAR +STARTCHAR U_4E62 +ENCODING 20066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +2200 +2200 +AA00 +AA00 +AA00 +AA00 +AA00 +BA40 +EA40 +81C0 +ENDCHAR +STARTCHAR U_4E63 +ENCODING 20067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +2200 +4200 +8A00 +F200 +1200 +2200 +4200 +9240 +FA40 +09C0 +ENDCHAR +STARTCHAR U_4E64 +ENCODING 20068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0480 +0460 +0420 +FF80 +0100 +0600 +3820 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E65 +ENCODING 20069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FC40 +2080 +1100 +0000 +FFC0 +0300 +0C00 +3020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E66 +ENCODING 20070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0860 +7FA0 +0880 +0880 +FFE0 +0820 +0820 +0940 +0880 +0800 +ENDCHAR +STARTCHAR U_4E67 +ENCODING 20071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +4A00 +2200 +0FE0 +F200 +0200 +FF80 +0C00 +3000 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E68 +ENCODING 20072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +4900 +FD00 +0500 +7900 +4900 +4920 +4920 +78E0 +ENDCHAR +STARTCHAR U_4E69 +ENCODING 20073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3D00 +2100 +2100 +FD00 +8500 +8500 +8520 +FD20 +84E0 +ENDCHAR +STARTCHAR U_4E6A +ENCODING 20074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +17C0 +1540 +2540 +27C0 +4540 +4540 +47C0 +8020 +8020 +7FE0 +ENDCHAR +STARTCHAR U_4E6B +ENCODING 20075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +2520 +55E0 +8800 +FFC0 +0700 +3820 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E6C +ENCODING 20076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7F80 +4080 +7F80 +4000 +FFE0 +0700 +3800 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E6D +ENCODING 20077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1000 +3FC0 +5040 +9FC0 +0000 +7F80 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E6E +ENCODING 20078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3800 +43C0 +4A40 +7A40 +4AC0 +1200 +FF80 +0C00 +3020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_4E6F +ENCODING 20079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +1500 +FFE0 +0400 +0400 +7F80 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E70 +ENCODING 20080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0040 +2480 +1400 +4400 +2400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_4E71 +ENCODING 20081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +7100 +1100 +FF00 +1100 +1100 +7D00 +4500 +4520 +7D20 +44E0 +ENDCHAR +STARTCHAR U_4E72 +ENCODING 20082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0940 +2300 +C480 +4860 +3F80 +0600 +1800 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E73 +ENCODING 20083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +F500 +5500 +2900 +FD00 +0900 +1100 +1D00 +F120 +1120 +30E0 +ENDCHAR +STARTCHAR U_4E74 +ENCODING 20084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FB80 +1200 +FBE0 +1240 +2440 +FFC0 +0300 +3C00 +4040 +3FC0 +ENDCHAR +STARTCHAR U_4E75 +ENCODING 20085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FF00 +4500 +2900 +FD00 +1100 +7D00 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_4E76 +ENCODING 20086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +2480 +3F80 +2480 +3F80 +2480 +FF80 +1C20 +2020 +3FE0 +ENDCHAR +STARTCHAR U_4E77 +ENCODING 20087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +8520 +4940 +2180 +CE00 +0000 +FF80 +1800 +2020 +3FE0 +ENDCHAR +STARTCHAR U_4E78 +ENCODING 20088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +A2A0 +BAA0 +EFE0 +AAA0 +AAA0 +ABE0 +9840 +8020 +7FE0 +ENDCHAR +STARTCHAR U_4E79 +ENCODING 20089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +2200 +FA00 +8A00 +FA00 +8A00 +FA20 +2220 +FA20 +21E0 +ENDCHAR +STARTCHAR U_4E7A +ENCODING 20090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38C0 +4300 +7A00 +4BE0 +7A40 +4240 +8440 +7F00 +1820 +2020 +1FE0 +ENDCHAR +STARTCHAR U_4E7B +ENCODING 20091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +2140 +3A20 +4C80 +4940 +9080 +7FC0 +0C00 +1020 +1FE0 +ENDCHAR +STARTCHAR U_4E7C +ENCODING 20092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +47C0 +2100 +4FE0 +8000 +7FC0 +0C00 +1020 +1FE0 +ENDCHAR +STARTCHAR U_4E7D +ENCODING 20093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1880 +EF80 +0880 +7F80 +0620 +1820 +0FE0 +ENDCHAR +STARTCHAR U_4E7E +ENCODING 20094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +21E0 +FA00 +8BC0 +F840 +8880 +F900 +2220 +FA20 +21E0 +ENDCHAR +STARTCHAR U_4E7F +ENCODING 20095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +EA80 +5480 +2480 +7880 +2480 +7E80 +0880 +2CA0 +4AA0 +9960 +ENDCHAR +STARTCHAR U_4E80 +ENCODING 20096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3E00 +4200 +FF00 +4900 +7F00 +4900 +FF80 +8880 +FF80 +0840 +0FC0 +ENDCHAR +STARTCHAR U_4E81 +ENCODING 20097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +7D00 +4600 +7DE0 +4440 +FC80 +1120 +FE20 +11E0 +ENDCHAR +STARTCHAR U_4E82 +ENCODING 20098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5500 +FD00 +2900 +FD00 +A500 +FD00 +AD00 +9520 +AD20 +84E0 +ENDCHAR +STARTCHAR U_4E83 +ENCODING 20099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5480 +FE80 +5480 +9280 +4480 +7E80 +D480 +3FA0 +44A0 +8460 +ENDCHAR +STARTCHAR U_4E84 +ENCODING 20100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +1080 +FE80 +8280 +BA80 +0080 +7C80 +4480 +7CA0 +28A0 +FE60 +ENDCHAR +STARTCHAR U_4E85 +ENCODING 20101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR U_4E86 +ENCODING 20102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0100 +0200 +0C00 +0800 +0800 +0800 +0800 +0800 +2800 +1000 +ENDCHAR +STARTCHAR U_4E87 +ENCODING 20103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +2240 +4280 +8200 +0200 +0200 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_4E88 +ENCODING 20104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0100 +0A00 +0400 +FFE0 +0440 +0480 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E89 +ENCODING 20105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E8A +ENCODING 20106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +1500 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +0C00 +ENDCHAR +STARTCHAR U_4E8B +ENCODING 20107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +2480 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E8C +ENCODING 20108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 0 +BITMAP +7FC0 +0000 +0000 +0000 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E8D +ENCODING 20109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0200 +0200 +0200 +0200 +0200 +0A00 +0400 +ENDCHAR +STARTCHAR U_4E8E +ENCODING 20110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4E8F +ENCODING 20111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0800 +1000 +3FC0 +0040 +0040 +0480 +0300 +ENDCHAR +STARTCHAR U_4E90 +ENCODING 20112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +0800 +FFE0 +1000 +3F80 +0080 +0080 +0080 +0500 +0200 +ENDCHAR +STARTCHAR U_4E91 +ENCODING 20113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +0000 +FFE0 +0800 +1000 +1100 +2080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_4E92 +ENCODING 20114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +0F80 +1080 +1080 +1080 +3F00 +0100 +0100 +FFE0 +ENDCHAR +STARTCHAR U_4E93 +ENCODING 20115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +0000 +0000 +FFE0 +1100 +1100 +1100 +2100 +2100 +4100 +ENDCHAR +STARTCHAR U_4E94 +ENCODING 20116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +3F80 +0880 +0880 +0880 +0880 +FFE0 +ENDCHAR +STARTCHAR U_4E95 +ENCODING 20117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +FFC0 +1200 +1200 +1200 +FFC0 +2200 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_4E96 +ENCODING 20118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0000 +0000 +3F80 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E97 +ENCODING 20119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2480 +2480 +3F80 +0000 +0000 +3F80 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E98 +ENCODING 20120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E99 +ENCODING 20121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +1000 +1000 +1F00 +2900 +2500 +5200 +4A00 +0400 +0400 +FFC0 +ENDCHAR +STARTCHAR U_4E9A +ENCODING 20122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0A00 +0A00 +4A40 +2A40 +2A80 +2A80 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4E9B +ENCODING 20123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +5A80 +5320 +5220 +5A20 +E1E0 +0000 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E9C +ENCODING 20124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +4A40 +7FC0 +0A00 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_4E9D +ENCODING 20125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F00 +0000 +2100 +4A40 +FBE0 +0020 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4E9E +ENCODING 20126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +1100 +1100 +71C0 +4040 +4040 +71C0 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_4E9F +ENCODING 20127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0200 +0400 +75C0 +5540 +5480 +7540 +0640 +1400 +0800 +FFE0 +ENDCHAR +STARTCHAR U_4EA0 +ENCODING 20128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +0800 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4EA1 +ENCODING 20129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0600 +0200 +FFE0 +2000 +2000 +2000 +2000 +2000 +2000 +3FC0 +ENDCHAR +STARTCHAR U_4EA2 +ENCODING 20130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0000 +1F00 +1100 +1100 +1100 +1120 +2120 +40E0 +ENDCHAR +STARTCHAR U_4EA3 +ENCODING 20131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1100 +1100 +1100 +1100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_4EA4 +ENCODING 20132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +1100 +2080 +5140 +1100 +0A00 +0400 +1B00 +60E0 +ENDCHAR +STARTCHAR U_4EA5 +ENCODING 20133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +1000 +2200 +7C80 +0900 +3200 +C600 +1900 +E0C0 +ENDCHAR +STARTCHAR U_4EA6 +ENCODING 20134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0900 +2940 +2920 +4920 +0900 +1100 +2100 +4700 +ENDCHAR +STARTCHAR U_4EA7 +ENCODING 20135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +1080 +0900 +3FE0 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_4EA8 +ENCODING 20136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +7FC0 +0100 +0600 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4EA9 +ENCODING 20137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0000 +3F80 +2480 +3F80 +2480 +2480 +3F80 +2080 +ENDCHAR +STARTCHAR U_4EAA +ENCODING 20138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +5140 +9120 +6300 +0000 +7F80 +0080 +0080 +0060 +ENDCHAR +STARTCHAR U_4EAB +ENCODING 20139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2080 +3F80 +0000 +3F80 +0100 +7FE0 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_4EAC +ENCODING 20140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_4EAD +ENCODING 20141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +FFE0 +8020 +BFA0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_4EAE +ENCODING 20142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +1F00 +0000 +FFE0 +8020 +1F00 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_4EAF +ENCODING 20143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +2080 +3F80 +0000 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_4EB0 +ENCODING 20144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_4EB1 +ENCODING 20145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1000 +27C0 +6440 +A7C0 +2440 +27C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4EB2 +ENCODING 20146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_4EB3 +ENCODING 20147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +FFE0 +8320 +3C00 +07C0 +7C20 +03E0 +ENDCHAR +STARTCHAR U_4EB4 +ENCODING 20148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +8420 +7FC0 +0800 +7F00 +0920 +1120 +E1E0 +ENDCHAR +STARTCHAR U_4EB5 +ENCODING 20149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2200 +FF80 +2A80 +76A0 +A960 +3480 +E300 +2900 +70E0 +ENDCHAR +STARTCHAR U_4EB6 +ENCODING 20150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5140 +5F40 +4040 +7FC0 +2080 +3E80 +2780 +2080 +FFE0 +ENDCHAR +STARTCHAR U_4EB7 +ENCODING 20151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FE0 +4A80 +7FE0 +4A80 +7F80 +5B00 +AA80 +CA60 +ENDCHAR +STARTCHAR U_4EB8 +ENCODING 20152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FA80 +57C0 +7540 +07C0 +F540 +17C0 +2100 +FFE0 +2100 +6100 +ENDCHAR +STARTCHAR U_4EB9 +ENCODING 20153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +60C0 +4E40 +6AC0 +4A40 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_4EBA +ENCODING 20154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +0400 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4EBB +ENCODING 20155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +10 +10 +20 +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_4EBC +ENCODING 20156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0A00 +0A00 +1100 +1080 +2060 +4040 +0000 +FFE0 +ENDCHAR +STARTCHAR U_4EBD +ENCODING 20157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0400 +0400 +0A00 +1100 +2080 +C060 +0800 +0400 +0200 +0200 +ENDCHAR +STARTCHAR U_4EBE +ENCODING 20158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8400 +8400 +8400 +8400 +8A00 +8A00 +9100 +A0C0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_4EBF +ENCODING 20159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2080 +2100 +6200 +A200 +2400 +2400 +2820 +2820 +27E0 +ENDCHAR +STARTCHAR U_4EC0 +ENCODING 20160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EC1 +ENCODING 20161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +27C0 +2000 +6000 +A000 +2000 +2000 +2000 +2FE0 +2000 +ENDCHAR +STARTCHAR U_4EC2 +ENCODING 20162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2200 +2FE0 +6220 +A220 +2220 +2220 +2420 +2820 +30C0 +ENDCHAR +STARTCHAR U_4EC3 +ENCODING 20163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2080 +2080 +6080 +A080 +2080 +2080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_4EC4 +ENCODING 20164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4200 +4200 +4200 +4200 +4200 +4500 +4880 +5060 +A040 +ENDCHAR +STARTCHAR U_4EC5 +ENCODING 20165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2440 +2440 +6440 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4EC6 +ENCODING 20166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1200 +2300 +2280 +6260 +A220 +2200 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_4EC7 +ENCODING 20167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2200 +2F80 +6280 +A280 +2280 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4EC8 +ENCODING 20168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1480 +2480 +2480 +6480 +A480 +2480 +2840 +2840 +2820 +3020 +ENDCHAR +STARTCHAR U_4EC9 +ENCODING 20169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1480 +1480 +2480 +6480 +A480 +2480 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4ECA +ENCODING 20170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2480 +C260 +0000 +3F80 +0100 +0200 +0200 +0400 +ENDCHAR +STARTCHAR U_4ECB +ENCODING 20171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +D160 +1100 +1100 +1100 +2100 +2100 +4100 +ENDCHAR +STARTCHAR U_4ECC +ENCODING 20172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2480 +4440 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_4ECD +ENCODING 20173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2440 +2480 +4480 +45E0 +C420 +4420 +4420 +4820 +48A0 +5040 +ENDCHAR +STARTCHAR U_4ECE +ENCODING 20174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +1100 +1100 +2A80 +2A80 +4440 +8840 +1020 +ENDCHAR +STARTCHAR U_4ECF +ENCODING 20175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6200 +A200 +2200 +2400 +2480 +2840 +2FE0 +2020 +ENDCHAR +STARTCHAR U_4ED0 +ENCODING 20176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2080 +C460 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_4ED1 +ENCODING 20177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +D060 +1100 +1200 +1C00 +1040 +1040 +0FC0 +ENDCHAR +STARTCHAR U_4ED2 +ENCODING 20178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +0800 +1400 +1200 +2100 +48C0 +8400 +0200 +1800 +0400 +0200 +ENDCHAR +STARTCHAR U_4ED3 +ENCODING 20179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0600 +0900 +1080 +3F40 +D120 +1500 +1200 +1040 +1040 +0FC0 +ENDCHAR +STARTCHAR U_4ED4 +ENCODING 20180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2080 +2100 +6100 +AFE0 +2100 +2100 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4ED5 +ENCODING 20181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_4ED6 +ENCODING 20182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2540 +25C0 +6F40 +A540 +2540 +2580 +2520 +2420 +23E0 +ENDCHAR +STARTCHAR U_4ED7 +ENCODING 20183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +2FE0 +2080 +6480 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4ED8 +ENCODING 20184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +2080 +2FE0 +6080 +A480 +2280 +2280 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_4ED9 +ENCODING 20185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2920 +6920 +A920 +2920 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4EDA +ENCODING 20186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2480 +C460 +0400 +4440 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_4EDB +ENCODING 20187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +11C0 +2E00 +6200 +A200 +23E0 +3E00 +2200 +2200 +2220 +21E0 +ENDCHAR +STARTCHAR U_4EDC +ENCODING 20188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2100 +2100 +6100 +A100 +2100 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_4EDD +ENCODING 20189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +C060 +3F80 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_4EDE +ENCODING 20190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2120 +2120 +6520 +A520 +2920 +2220 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_4EDF +ENCODING 20191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2100 +6100 +AFE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EE0 +ENCODING 20192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2100 +6100 +A100 +2FE0 +2100 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EE1 +ENCODING 20193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +27E0 +2800 +67C0 +A040 +2180 +2200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4EE2 +ENCODING 20194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2400 +2400 +4FC0 +C840 +5040 +4440 +4340 +4140 +4040 +4040 +41C0 +ENDCHAR +STARTCHAR U_4EE3 +ENCODING 20195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +2200 +23E0 +6E00 +A200 +2200 +2100 +2120 +20A0 +2060 +ENDCHAR +STARTCHAR U_4EE4 +ENCODING 20196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2480 +C260 +3F80 +0100 +0A00 +0400 +0200 +ENDCHAR +STARTCHAR U_4EE5 +ENCODING 20197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0100 +8100 +9100 +8900 +8900 +8100 +9100 +A100 +C280 +8440 +1840 +ENDCHAR +STARTCHAR U_4EE6 +ENCODING 20198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +6540 +A540 +2520 +2920 +2920 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4EE7 +ENCODING 20199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0780 +0400 +0400 +FFE0 +0400 +0600 +0900 +1080 +6060 +ENDCHAR +STARTCHAR U_4EE8 +ENCODING 20200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +2FE0 +2000 +6000 +A000 +27C0 +2000 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4EE9 +ENCODING 20201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2200 +2200 +63C0 +A200 +2200 +2200 +2200 +2200 +3FE0 +ENDCHAR +STARTCHAR U_4EEA +ENCODING 20202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1140 +2940 +2840 +6440 +A480 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4EEB +ENCODING 20203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2200 +2280 +6480 +A900 +2100 +2240 +2420 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4EEC +ENCODING 20204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +22E0 +4A20 +4820 +C820 +4820 +4820 +4820 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_4EED +ENCODING 20205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2240 +6240 +B240 +2E40 +2340 +24E0 +2440 +2840 +31C0 +ENDCHAR +STARTCHAR U_4EEE +ENCODING 20206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1780 +2400 +2400 +67E0 +A620 +2520 +2540 +2880 +2940 +3220 +ENDCHAR +STARTCHAR U_4EEF +ENCODING 20207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2280 +2A40 +6A20 +AA20 +3240 +2240 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_4EF0 +ENCODING 20208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1DE0 +2920 +2920 +6920 +A920 +2B20 +2D20 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF1 +ENCODING 20209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2500 +2880 +7260 +A100 +2FC0 +2080 +2080 +2100 +2200 +ENDCHAR +STARTCHAR U_4EF2 +ENCODING 20210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2FE0 +6920 +A920 +2FE0 +2920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF3 +ENCODING 20211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +2480 +24A0 +67C0 +A480 +2480 +2480 +25A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_4EF4 +ENCODING 20212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +27E0 +6420 +A420 +27E0 +2420 +2420 +2820 +30E0 +ENDCHAR +STARTCHAR U_4EF5 +ENCODING 20213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27C0 +2900 +6100 +A100 +3FE0 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF6 +ENCODING 20214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +2500 +2FC0 +7100 +A100 +2FE0 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4EF7 +ENCODING 20215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1300 +2480 +3860 +6480 +A480 +2480 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4EF8 +ENCODING 20216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1780 +1100 +2100 +2FE0 +6100 +A300 +2280 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_4EF9 +ENCODING 20217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +A7C0 +2100 +2100 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4EFA +ENCODING 20218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2080 +DF60 +1000 +1F00 +1000 +1000 +1F80 +ENDCHAR +STARTCHAR U_4EFB +ENCODING 20219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2100 +6100 +AFE0 +2100 +2100 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_4EFC +ENCODING 20220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +2FE0 +2100 +2100 +67C0 +A100 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4EFD +ENCODING 20221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1280 +2240 +2440 +6820 +A7C0 +2240 +2240 +2240 +2440 +28C0 +ENDCHAR +STARTCHAR U_4EFE +ENCODING 20222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2200 +2200 +63E0 +A440 +2440 +2FC0 +2080 +2080 +3FE0 +ENDCHAR +STARTCHAR U_4EFF +ENCODING 20223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2200 +6200 +A3C0 +2240 +2240 +2440 +2440 +2980 +ENDCHAR +STARTCHAR U_4F00 +ENCODING 20224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1480 +2480 +2440 +6940 +A920 +3200 +2200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F01 +ENCODING 20225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0600 +0900 +1080 +2260 +C200 +1380 +1200 +1200 +1200 +7FE0 +ENDCHAR +STARTCHAR U_4F02 +ENCODING 20226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6FE0 +A920 +2920 +2920 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_4F03 +ENCODING 20227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2080 +2300 +6100 +AFE0 +2140 +2100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_4F04 +ENCODING 20228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1140 +2140 +2FC0 +6900 +A900 +2FE0 +2120 +21A0 +2140 +2100 +ENDCHAR +STARTCHAR U_4F05 +ENCODING 20229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6920 +A920 +2FE0 +2100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_4F06 +ENCODING 20230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2AA0 +62A0 +A520 +2520 +2920 +2220 +2420 +20C0 +ENDCHAR +STARTCHAR U_4F07 +ENCODING 20231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1780 +2480 +2480 +6860 +B780 +2480 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F08 +ENCODING 20232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1080 +2080 +2200 +6200 +AA40 +2A20 +3220 +2240 +2240 +21C0 +ENDCHAR +STARTCHAR U_4F09 +ENCODING 20233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2000 +6780 +A480 +2480 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4F0A +ENCODING 20234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2240 +2240 +6FE0 +A240 +2240 +2FC0 +2200 +2400 +2800 +ENDCHAR +STARTCHAR U_4F0B +ENCODING 20235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2240 +2280 +62E0 +A220 +2220 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_4F0C +ENCODING 20236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2400 +25C0 +6540 +A540 +25C0 +2500 +2920 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F0D +ENCODING 20237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2200 +2200 +6200 +AFC0 +2240 +2440 +2440 +2440 +3FE0 +ENDCHAR +STARTCHAR U_4F0E +ENCODING 20238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +AFE0 +2440 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F0F +ENCODING 20239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +2120 +2100 +6FE0 +A100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F10 +ENCODING 20240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +2200 +23E0 +7E20 +A240 +2280 +2100 +22A0 +2C60 +2020 +ENDCHAR +STARTCHAR U_4F11 +ENCODING 20241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +3FE0 +6100 +A380 +2380 +2540 +2920 +3100 +2100 +ENDCHAR +STARTCHAR U_4F12 +ENCODING 20242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2400 +2400 +67E0 +A480 +2480 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4F13 +ENCODING 20243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2080 +2100 +6100 +A340 +2520 +2920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F14 +ENCODING 20244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2820 +2820 +6780 +A480 +2480 +2480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4F15 +ENCODING 20245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +27C0 +2100 +6100 +AFE0 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F16 +ENCODING 20246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2200 +6200 +A3C0 +2640 +2540 +2880 +3340 +2C20 +ENDCHAR +STARTCHAR U_4F17 +ENCODING 20247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +1100 +2080 +D160 +1100 +1100 +2A80 +4440 +8820 +ENDCHAR +STARTCHAR U_4F18 +ENCODING 20248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1220 +2200 +3FE0 +6200 +A300 +2300 +2500 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F19 +ENCODING 20249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2120 +2540 +6580 +A900 +2100 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F1A +ENCODING 20250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +0000 +7FC0 +0800 +1080 +3FC0 +ENDCHAR +STARTCHAR U_4F1B +ENCODING 20251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +2840 +2A40 +6980 +A880 +2940 +2A20 +2800 +2800 +2FE0 +ENDCHAR +STARTCHAR U_4F1C +ENCODING 20252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2F80 +6280 +A4A0 +38E0 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F1D +ENCODING 20253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2000 +2000 +6FE0 +A100 +2200 +2200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F1E +ENCODING 20254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0A00 +3180 +C460 +2480 +1500 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_4F1F +ENCODING 20255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +67C0 +A100 +2FE0 +2120 +2120 +2160 +2100 +ENDCHAR +STARTCHAR U_4F20 +ENCODING 20256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +27E0 +2100 +6FE0 +A200 +27E0 +2040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_4F21 +ENCODING 20257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2400 +6500 +A900 +2FE0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4F22 +ENCODING 20258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2480 +2880 +6FE0 +A080 +2180 +2280 +2480 +3880 +2180 +ENDCHAR +STARTCHAR U_4F23 +ENCODING 20259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2840 +2A40 +6A40 +AA40 +2300 +2500 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F24 +ENCODING 20260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2900 +6100 +A7E0 +2120 +2120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_4F25 +ENCODING 20261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1480 +2500 +2600 +6400 +BFC0 +2500 +2500 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_4F26 +ENCODING 20262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +6820 +A240 +2280 +2300 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_4F27 +ENCODING 20263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +6FE0 +B440 +2440 +25C0 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4F28 +ENCODING 20264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +27E0 +2820 +7220 +A120 +20A0 +2320 +2C20 +2020 +20C0 +ENDCHAR +STARTCHAR U_4F29 +ENCODING 20265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2000 +2FE0 +2440 +6440 +A280 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F2A +ENCODING 20266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +1500 +2100 +2FE0 +6220 +A320 +22A0 +24A0 +2420 +2820 +30C0 +ENDCHAR +STARTCHAR U_4F2B +ENCODING 20267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +7040 +A000 +2000 +2000 +2000 +2FE0 +2000 +ENDCHAR +STARTCHAR U_4F2C +ENCODING 20268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +2420 +67E0 +A480 +2480 +2480 +2840 +2840 +3020 +ENDCHAR +STARTCHAR U_4F2D +ENCODING 20269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2200 +6440 +AF80 +2100 +2200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F2E +ENCODING 20270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +29E0 +48A0 +FEA0 +4AA0 +52A0 +52A0 +4A40 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_4F2F +ENCODING 20271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1200 +27E0 +2420 +6420 +A7E0 +2420 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_4F30 +ENCODING 20272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2FE0 +6100 +A100 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F31 +ENCODING 20273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2500 +6880 +B240 +2220 +2A80 +2A40 +3240 +2200 +2600 +ENDCHAR +STARTCHAR U_4F32 +ENCODING 20274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +27E0 +6400 +A520 +2540 +2580 +2920 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F33 +ENCODING 20275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1540 +2540 +2FE0 +6540 +A540 +2540 +25C0 +2540 +2400 +27E0 +ENDCHAR +STARTCHAR U_4F34 +ENCODING 20276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1920 +2540 +2100 +67C0 +A100 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F35 +ENCODING 20277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4AA0 +CAA0 +4AA0 +4AA0 +4AA0 +4CE0 +4820 +4820 +4FE0 +ENDCHAR +STARTCHAR U_4F36 +ENCODING 20278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +7920 +A080 +2FE0 +2040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_4F37 +ENCODING 20279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4100 +CFE0 +4920 +4920 +4FE0 +4920 +4920 +4920 +4FE0 +ENDCHAR +STARTCHAR U_4F38 +ENCODING 20280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2920 +6FE0 +A920 +2920 +2FE0 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_4F39 +ENCODING 20281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +6440 +A7C0 +2440 +2440 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_4F3A +ENCODING 20282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +2020 +2FA0 +6020 +A720 +2520 +2520 +2720 +2020 +20E0 +ENDCHAR +STARTCHAR U_4F3B +ENCODING 20283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2100 +2920 +6520 +A540 +2FE0 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_4F3C +ENCODING 20284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2A40 +2940 +2940 +6840 +A840 +2840 +2A80 +2CC0 +3120 +2620 +ENDCHAR +STARTCHAR U_4F3D +ENCODING 20285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +3EE0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +2AA0 +32E0 +26A0 +ENDCHAR +STARTCHAR U_4F3E +ENCODING 20286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2080 +2100 +6300 +A540 +2920 +2120 +2100 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4F3F +ENCODING 20287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +6440 +A7C0 +2000 +2280 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_4F40 +ENCODING 20288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FC0 +4840 +C840 +4FC0 +4800 +4FE0 +4820 +4820 +4820 +4FE0 +ENDCHAR +STARTCHAR U_4F41 +ENCODING 20289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2200 +2440 +6FE0 +A020 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F42 +ENCODING 20290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4100 +C100 +4100 +49C0 +4900 +4900 +4900 +4900 +5FE0 +ENDCHAR +STARTCHAR U_4F43 +ENCODING 20291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2920 +2920 +6920 +AFE0 +2920 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4F44 +ENCODING 20292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4880 +FFE0 +4880 +4880 +4F80 +4880 +4880 +4880 +4F80 +ENDCHAR +STARTCHAR U_4F45 +ENCODING 20293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FC0 +2200 +6200 +BFE0 +2700 +2A80 +3240 +2220 +2200 +ENDCHAR +STARTCHAR U_4F46 +ENCODING 20294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +67C0 +A440 +2440 +27C0 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_4F47 +ENCODING 20295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1080 +2FE0 +2820 +6000 +AFE0 +2100 +2100 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4F48 +ENCODING 20296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +3FE0 +2500 +6900 +AFE0 +3920 +2920 +2960 +2100 +2100 +ENDCHAR +STARTCHAR U_4F49 +ENCODING 20297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +BFE0 +2200 +2280 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_4F4A +ENCODING 20298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +C920 +4920 +4FC0 +4A40 +4A80 +5100 +5280 +6C60 +ENDCHAR +STARTCHAR U_4F4B +ENCODING 20299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4220 +C220 +4540 +4880 +57E0 +4420 +4420 +4420 +47E0 +ENDCHAR +STARTCHAR U_4F4C +ENCODING 20300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4480 +54A0 +D7C0 +5480 +5480 +5480 +56A0 +54A0 +5860 +ENDCHAR +STARTCHAR U_4F4D +ENCODING 20301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2000 +2FE0 +6000 +A440 +2240 +2280 +2080 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F4E +ENCODING 20302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F00 +2900 +2900 +6900 +AFE0 +2900 +2920 +2AA0 +2D60 +28A0 +ENDCHAR +STARTCHAR U_4F4F +ENCODING 20303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2100 +6100 +A100 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F50 +ENCODING 20304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2400 +6400 +A7C0 +2900 +2900 +3100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F51 +ENCODING 20305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FE0 +2200 +6400 +A7C0 +2C40 +3440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F52 +ENCODING 20306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +27C0 +2540 +6540 +A540 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F53 +ENCODING 20307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +5FC0 +4200 +C700 +4A80 +5240 +6220 +4F80 +4200 +4200 +ENDCHAR +STARTCHAR U_4F54 +ENCODING 20308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +21E0 +2100 +6100 +A7C0 +2440 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F55 +ENCODING 20309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2040 +6F40 +A940 +2940 +2F40 +2940 +2040 +2040 +20C0 +ENDCHAR +STARTCHAR U_4F56 +ENCODING 20310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +2480 +2480 +6C80 +B540 +3520 +2620 +2440 +2C40 +33C0 +ENDCHAR +STARTCHAR U_4F57 +ENCODING 20311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +6400 +A480 +2500 +2600 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4F58 +ENCODING 20312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +3FC0 +0400 +1500 +2480 +4C40 +ENDCHAR +STARTCHAR U_4F59 +ENCODING 20313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0400 +7FC0 +0400 +1500 +2480 +4C40 +ENDCHAR +STARTCHAR U_4F5A +ENCODING 20314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +2500 +2FC0 +6900 +A100 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4F5B +ENCODING 20315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +5FC0 +C540 +5FC0 +5500 +5FE0 +4520 +45A0 +4940 +5100 +ENDCHAR +STARTCHAR U_4F5C +ENCODING 20316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2A00 +7200 +A3C0 +2200 +2200 +23E0 +2200 +2200 +ENDCHAR +STARTCHAR U_4F5D +ENCODING 20317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2820 +7720 +A520 +2520 +2720 +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U_4F5E +ENCODING 20318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2000 +2FE0 +6100 +A100 +2FE0 +2240 +2480 +2380 +2E60 +ENDCHAR +STARTCHAR U_4F5F +ENCODING 20319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2440 +2A80 +6100 +A680 +3860 +2300 +2080 +2600 +2180 +ENDCHAR +STARTCHAR U_4F60 +ENCODING 20320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2820 +6100 +A540 +2540 +2920 +3120 +2120 +2300 +ENDCHAR +STARTCHAR U_4F61 +ENCODING 20321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2280 +2440 +6920 +A100 +2920 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4F62 +ENCODING 20322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1400 +2400 +27C0 +6440 +A440 +27C0 +2400 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_4F63 +ENCODING 20323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +2FE0 +6920 +A920 +2FE0 +2920 +2920 +2920 +3060 +ENDCHAR +STARTCHAR U_4F64 +ENCODING 20324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1400 +2400 +2780 +6480 +A680 +2580 +2880 +2AA0 +2CA0 +2860 +ENDCHAR +STARTCHAR U_4F65 +ENCODING 20325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0C00 +1200 +2100 +DEC0 +0000 +0880 +4480 +2500 +2100 +FFC0 +ENDCHAR +STARTCHAR U_4F66 +ENCODING 20326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4200 +C200 +4400 +47E0 +4C20 +5420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_4F67 +ENCODING 20327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +23C0 +2200 +6200 +AFE0 +2200 +2300 +2280 +2240 +2200 +ENDCHAR +STARTCHAR U_4F68 +ENCODING 20328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +4FC0 +D040 +6F40 +4940 +4F40 +48C0 +4800 +4820 +47E0 +ENDCHAR +STARTCHAR U_4F69 +ENCODING 20329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5040 +57C0 +5140 +D7C0 +5540 +5540 +5540 +55C0 +5540 +6120 +ENDCHAR +STARTCHAR U_4F6A +ENCODING 20330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2820 +2BA0 +6AA0 +AAA0 +2BA0 +2AA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4F6B +ENCODING 20331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +17C0 +2440 +2680 +6900 +A280 +2460 +3FC0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4F6C +ENCODING 20332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FA0 +2240 +2280 +7FE0 +A200 +24C0 +2F00 +3420 +2420 +23E0 +ENDCHAR +STARTCHAR U_4F6D +ENCODING 20333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4C40 +D280 +4100 +4680 +5960 +47C0 +4900 +4FE0 +4100 +ENDCHAR +STARTCHAR U_4F6E +ENCODING 20334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2500 +2880 +7040 +AFA0 +2000 +2FC0 +2840 +2840 +2FC0 +ENDCHAR +STARTCHAR U_4F6F +ENCODING 20335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2100 +6100 +A7C0 +2100 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4F70 +ENCODING 20336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2200 +27C0 +6440 +A440 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4F71 +ENCODING 20337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +7FC0 +0400 +1780 +1400 +FFE0 +ENDCHAR +STARTCHAR U_4F72 +ENCODING 20338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +23C0 +4440 +CA80 +5100 +4200 +47C0 +4C40 +5440 +4440 +47C0 +ENDCHAR +STARTCHAR U_4F73 +ENCODING 20339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +2100 +6FE0 +A100 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F74 +ENCODING 20340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1440 +2440 +27C0 +6440 +A440 +27C0 +2440 +24E0 +3F40 +2040 +ENDCHAR +STARTCHAR U_4F75 +ENCODING 20341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2480 +2FE0 +2480 +6480 +A480 +3FE0 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4F76 +ENCODING 20342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6100 +A7C0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4F77 +ENCODING 20343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A500 +2520 +24C0 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_4F78 +ENCODING 20344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2100 +6FE0 +A100 +2100 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4F79 +ENCODING 20345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2480 +27E0 +6C00 +A5C0 +2540 +2540 +2580 +2920 +31E0 +ENDCHAR +STARTCHAR U_4F7A +ENCODING 20346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +2820 +67C0 +A100 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F7B +ENCODING 20347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1280 +2AA0 +26C0 +6280 +A2C0 +26A0 +2A80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4F7C +ENCODING 20348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2280 +6440 +AAA0 +3280 +2280 +2100 +2280 +3C60 +ENDCHAR +STARTCHAR U_4F7D +ENCODING 20349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +29E0 +2620 +60A0 +A480 +3880 +2880 +2940 +2220 +2420 +ENDCHAR +STARTCHAR U_4F7E +ENCODING 20350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1440 +2820 +27C0 +6440 +A7C0 +2440 +27C0 +2440 +2440 +25C0 +ENDCHAR +STARTCHAR U_4F7F +ENCODING 20351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +2FE0 +6920 +AFE0 +2900 +2500 +2200 +2580 +3860 +ENDCHAR +STARTCHAR U_4F80 +ENCODING 20352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2AA0 +2AA0 +6AA0 +BFA0 +2AA0 +2AA0 +2AA0 +2A20 +3220 +22E0 +ENDCHAR +STARTCHAR U_4F81 +ENCODING 20353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +1500 +27C0 +2900 +6100 +AFE0 +2280 +2280 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_4F82 +ENCODING 20354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2800 +28C0 +6B00 +A900 +29E0 +2F00 +2920 +2920 +30E0 +ENDCHAR +STARTCHAR U_4F83 +ENCODING 20355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2880 +2880 +4F80 +4000 +CA80 +4A80 +4A80 +4AA0 +52A0 +62E0 +ENDCHAR +STARTCHAR U_4F84 +ENCODING 20356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2200 +2440 +6FE0 +A120 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4F85 +ENCODING 20357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2200 +2440 +6F80 +A120 +2240 +2C80 +2140 +2220 +2C20 +ENDCHAR +STARTCHAR U_4F86 +ENCODING 20358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +2480 +5540 +8E20 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_4F87 +ENCODING 20359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27E0 +6120 +AFE0 +2900 +2FE0 +2120 +2280 +2C60 +ENDCHAR +STARTCHAR U_4F88 +ENCODING 20360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13C0 +2440 +2A80 +6300 +AD00 +23E0 +2620 +2940 +2180 +2E00 +ENDCHAR +STARTCHAR U_4F89 +ENCODING 20361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2BA0 +7000 +AFE0 +2200 +27C0 +2040 +2040 +2180 +ENDCHAR +STARTCHAR U_4F8A +ENCODING 20362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2920 +6540 +A100 +2FE0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4F8B +ENCODING 20363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2420 +24A0 +6BA0 +69A0 +BAA0 +26A0 +22A0 +2420 +2820 +3060 +ENDCHAR +STARTCHAR U_4F8C +ENCODING 20364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1500 +2280 +DF60 +0200 +3FC0 +0000 +FFE0 +1080 +3FC0 +ENDCHAR +STARTCHAR U_4F8D +ENCODING 20365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +2100 +6FE0 +A040 +2FE0 +2440 +2240 +2040 +21C0 +ENDCHAR +STARTCHAR U_4F8E +ENCODING 20366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3240 +4A80 +C200 +5FE0 +4200 +4700 +4A80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_4F8F +ENCODING 20367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +27C0 +2900 +6100 +AFE0 +2380 +2540 +2940 +3120 +2100 +ENDCHAR +STARTCHAR U_4F90 +ENCODING 20368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1200 +2FE0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_4F91 +ENCODING 20369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2200 +27C0 +6440 +AFC0 +3440 +27C0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_4F92 +ENCODING 20370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2920 +2100 +6FE0 +A240 +2440 +2280 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_4F93 +ENCODING 20371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2140 +2FE0 +6140 +A7C0 +2100 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4F94 +ENCODING 20372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1440 +2FE0 +2100 +6900 +AFE0 +3100 +2100 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_4F95 +ENCODING 20373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2200 +2FE0 +6AA0 +AAA0 +2AA0 +2AA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_4F96 +ENCODING 20374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0E00 +1100 +2E80 +4060 +BFC0 +2A40 +2A40 +3FC0 +2A40 +2AC0 +ENDCHAR +STARTCHAR U_4F97 +ENCODING 20375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +6820 +ABA0 +2AA0 +2AA0 +2BA0 +2820 +2820 +28E0 +ENDCHAR +STARTCHAR U_4F98 +ENCODING 20376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +2180 +6600 +A2C0 +2F00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_4F99 +ENCODING 20377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1140 +2120 +2FE0 +6100 +AF00 +2500 +2480 +26A0 +3860 +2020 +ENDCHAR +STARTCHAR U_4F9A +ENCODING 20378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1400 +27E0 +2820 +77A0 +A4A0 +27A0 +24A0 +27A0 +2020 +2060 +ENDCHAR +STARTCHAR U_4F9B +ENCODING 20379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1480 +2480 +2FE0 +6480 +A480 +3FE0 +2000 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_4F9C +ENCODING 20380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +17C0 +2440 +2640 +6540 +BFE0 +2440 +2640 +2540 +2840 +30C0 +ENDCHAR +STARTCHAR U_4F9D +ENCODING 20381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2100 +6320 +A540 +2C80 +3480 +2440 +2520 +2620 +ENDCHAR +STARTCHAR U_4F9E +ENCODING 20382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +3EA0 +6AA0 +AAA0 +2AA0 +2AA0 +24A0 +24E0 +2AA0 +3000 +ENDCHAR +STARTCHAR U_4F9F +ENCODING 20383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2200 +65E0 +AC40 +37E0 +2440 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_4FA0 +ENCODING 20384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2920 +6540 +A100 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FA1 +ENCODING 20385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +2FE0 +6280 +A280 +2FE0 +2AA0 +2AA0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_4FA2 +ENCODING 20386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2100 +67C0 +A540 +27C0 +2540 +3FE0 +2440 +2540 +24C0 +ENDCHAR +STARTCHAR U_4FA3 +ENCODING 20387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +67C0 +A000 +2FE0 +2820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4FA4 +ENCODING 20388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1740 +2280 +7FE0 +A100 +23C0 +2500 +2BC0 +2040 +2040 +2180 +ENDCHAR +STARTCHAR U_4FA5 +ENCODING 20389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2240 +22A0 +6120 +AEE0 +2000 +3FE0 +2480 +28A0 +3060 +ENDCHAR +STARTCHAR U_4FA6 +ENCODING 20390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11E0 +2100 +27E0 +6420 +A520 +2520 +2520 +2280 +2240 +2C20 +ENDCHAR +STARTCHAR U_4FA7 +ENCODING 20391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3F20 +5120 +55A0 +D5A0 +55A0 +55A0 +5520 +4620 +4920 +5060 +ENDCHAR +STARTCHAR U_4FA8 +ENCODING 20392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +4200 +5FE0 +C480 +4840 +54A0 +4480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_4FA9 +ENCODING 20393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +2820 +67C0 +A000 +2FE0 +2100 +2200 +2440 +2FA0 +ENDCHAR +STARTCHAR U_4FAA +ENCODING 20394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2280 +6100 +A680 +3860 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_4FAB +ENCODING 20395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +6400 +A7C0 +2200 +2FE0 +2480 +2300 +22C0 +2C40 +ENDCHAR +STARTCHAR U_4FAC +ENCODING 20396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2920 +6200 +A340 +2480 +2C80 +3440 +2540 +2620 +ENDCHAR +STARTCHAR U_4FAD +ENCODING 20397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +67C0 +A500 +2880 +2B40 +3120 +2400 +2300 +2100 +ENDCHAR +STARTCHAR U_4FAE +ENCODING 20398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1800 +27E0 +2520 +64A0 +AFE0 +2520 +24A0 +2FE0 +2020 +20C0 +ENDCHAR +STARTCHAR U_4FAF +ENCODING 20399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1080 +2FE0 +2400 +67C0 +A900 +2100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FB0 +ENCODING 20400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2240 +7FE0 +A240 +2FC0 +2400 +2FC0 +3440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FB1 +ENCODING 20401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +67C0 +A000 +2FE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4FB2 +ENCODING 20402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +4800 +CFE0 +4A80 +4AA0 +4A40 +4A40 +53A0 +6220 +ENDCHAR +STARTCHAR U_4FB3 +ENCODING 20403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +2540 +2540 +6BA0 +A100 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4FB4 +ENCODING 20404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0600 +0900 +1080 +2F60 +C040 +7D40 +1540 +7D40 +2640 +F8C0 +ENDCHAR +STARTCHAR U_4FB5 +ENCODING 20405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2040 +4FC0 +4040 +DFE0 +5020 +4FC0 +4480 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_4FB6 +ENCODING 20406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6100 +A200 +2FE0 +2820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_4FB7 +ENCODING 20407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2800 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +2820 +30C0 +ENDCHAR +STARTCHAR U_4FB8 +ENCODING 20408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +67C0 +A440 +27C0 +2000 +2440 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_4FB9 +ENCODING 20409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2D80 +2480 +6480 +ABE0 +2C80 +2480 +3480 +2DC0 +2C00 +33E0 +ENDCHAR +STARTCHAR U_4FBA +ENCODING 20410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +6100 +A280 +2540 +38A0 +27C0 +2040 +2080 +2100 +ENDCHAR +STARTCHAR U_4FBB +ENCODING 20411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FC0 +2840 +6840 +AFC0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FBC +ENCODING 20412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +6FE0 +A820 +27C0 +2080 +2FE0 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4FBD +ENCODING 20413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1540 +27C0 +6540 +A7C0 +2100 +2FE0 +2220 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_4FBE +ENCODING 20414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1740 +2280 +7FE0 +A200 +27C0 +2900 +37E0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_4FBF +ENCODING 20415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +2920 +6FE0 +A920 +2FE0 +2500 +2200 +2500 +38E0 +ENDCHAR +STARTCHAR U_4FC0 +ENCODING 20416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F20 +2A20 +2540 +6100 +AFE0 +2240 +2440 +2380 +2140 +2E20 +ENDCHAR +STARTCHAR U_4FC1 +ENCODING 20417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +2A40 +2BC0 +6800 +AFC0 +2140 +3FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4FC2 +ENCODING 20418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F00 +2200 +6480 +AF00 +2240 +2FE0 +2100 +2940 +3120 +2300 +ENDCHAR +STARTCHAR U_4FC3 +ENCODING 20419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6100 +A100 +25C0 +2500 +2500 +2B00 +30E0 +ENDCHAR +STARTCHAR U_4FC4 +ENCODING 20420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1340 +1D20 +2500 +3FE0 +6500 +A720 +2D40 +3480 +25A0 +26A0 +2C60 +ENDCHAR +STARTCHAR U_4FC5 +ENCODING 20421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +1140 +2FE0 +2100 +6920 +A540 +2380 +2540 +3920 +2120 +2700 +ENDCHAR +STARTCHAR U_4FC6 +ENCODING 20422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +6820 +B7E0 +2100 +2FE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_4FC7 +ENCODING 20423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3BE0 +4880 +5480 +C480 +4FE0 +5480 +6480 +4480 +5480 +4BE0 +ENDCHAR +STARTCHAR U_4FC8 +ENCODING 20424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1500 +27C0 +6900 +B100 +2FE0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FC9 +ENCODING 20425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2FC0 +2240 +6240 +BFE0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FCA +ENCODING 20426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1440 +2FE0 +22A0 +6640 +ABE0 +2440 +2A80 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_4FCB +ENCODING 20427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1480 +2780 +2000 +6FC0 +A940 +2940 +2FC0 +2800 +2820 +27E0 +ENDCHAR +STARTCHAR U_4FCC +ENCODING 20428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +2FE0 +6200 +AFC0 +2A40 +2FC0 +2A40 +2FC0 +2A40 +2AC0 +ENDCHAR +STARTCHAR U_4FCD +ENCODING 20429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FC0 +2840 +6FC0 +A840 +2FC0 +2920 +28C0 +2A40 +2C20 +ENDCHAR +STARTCHAR U_4FCE +ENCODING 20430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +53C0 +8A40 +2240 +23C0 +2240 +5240 +8A40 +0FE0 +ENDCHAR +STARTCHAR U_4FCF +ENCODING 20431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +14A0 +22C0 +27E0 +6420 +A7E0 +2420 +2420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_4FD0 +ENCODING 20432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2320 +3C20 +24A0 +24A0 +7FA0 +A4A0 +2EA0 +35A0 +24A0 +2420 +2460 +ENDCHAR +STARTCHAR U_4FD1 +ENCODING 20433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +2100 +2FE0 +6920 +AFE0 +2920 +2FE0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_4FD2 +ENCODING 20434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +6380 +A000 +2FE0 +2280 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FD3 +ENCODING 20435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1540 +2540 +2A80 +6540 +A540 +2FE0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_4FD4 +ENCODING 20436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A440 +27C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FD5 +ENCODING 20437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +6820 +A100 +2FE0 +2300 +2580 +2540 +3920 +2100 +ENDCHAR +STARTCHAR U_4FD6 +ENCODING 20438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2380 +2540 +6920 +A100 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4FD7 +ENCODING 20439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1440 +2920 +2180 +6240 +A420 +3FC0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4FD8 +ENCODING 20440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1F20 +2A20 +2540 +6FE0 +A080 +2100 +3FE0 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_4FD9 +ENCODING 20441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1660 +1180 +2660 +2100 +6FE0 +A500 +2FE0 +3520 +2520 +2560 +2100 +ENDCHAR +STARTCHAR U_4FDA +ENCODING 20442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2920 +2FE0 +6920 +AFE0 +2100 +2FE0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_4FDB +ENCODING 20443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +17C0 +2880 +3FE0 +6920 +A920 +2FE0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_4FDC +ENCODING 20444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2540 +27C0 +6540 +BFE0 +2200 +27C0 +2040 +2040 +2180 +ENDCHAR +STARTCHAR U_4FDD +ENCODING 20445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6100 +AFE0 +2100 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_4FDE +ENCODING 20446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +CF60 +3C40 +2540 +3D40 +2540 +3D40 +2440 +2CC0 +ENDCHAR +STARTCHAR U_4FDF +ENCODING 20447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1440 +2FE0 +2420 +67C0 +A900 +2100 +3FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FE0 +ENCODING 20448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2100 +6540 +A540 +2BA0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FE1 +ENCODING 20449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2000 +67C0 +A000 +27C0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_4FE2 +ENCODING 20450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2640 +6980 +A240 +2520 +2A80 +2520 +2240 +2080 +2700 +ENDCHAR +STARTCHAR U_4FE3 +ENCODING 20451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +2440 +27C0 +6000 +A7C0 +2100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_4FE4 +ENCODING 20452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +6120 +AFE0 +2900 +2FE0 +2320 +2520 +2960 +2100 +ENDCHAR +STARTCHAR U_4FE5 +ENCODING 20453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2200 +6FC0 +AA40 +2FC0 +2A40 +2FC0 +2200 +3FE0 +2200 +ENDCHAR +STARTCHAR U_4FE6 +ENCODING 20454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2200 +2FE0 +6200 +AFE0 +2440 +2FE0 +3440 +2240 +20C0 +ENDCHAR +STARTCHAR U_4FE7 +ENCODING 20455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +6100 +A100 +27C0 +2200 +2940 +2AA0 +3240 +23C0 +ENDCHAR +STARTCHAR U_4FE8 +ENCODING 20456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1280 +2AA0 +26C0 +6FE0 +A800 +2800 +2800 +2800 +2800 +3000 +ENDCHAR +STARTCHAR U_4FE9 +ENCODING 20457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2480 +4480 +5FE0 +D4A0 +54A0 +56A0 +5960 +5220 +5020 +50E0 +ENDCHAR +STARTCHAR U_4FEA +ENCODING 20458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +5DE0 +5520 +D520 +5DA0 +5560 +5520 +5520 +5520 +5560 +ENDCHAR +STARTCHAR U_4FEB +ENCODING 20459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +6540 +A380 +3FE0 +2300 +2580 +2940 +3120 +2100 +ENDCHAR +STARTCHAR U_4FEC +ENCODING 20460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +3C40 +4440 +4440 +DF40 +4480 +4E80 +55A0 +6520 +45E0 +4520 +ENDCHAR +STARTCHAR U_4FED +ENCODING 20461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1300 +2480 +2840 +77A0 +A000 +2A40 +2540 +2540 +2080 +3FE0 +ENDCHAR +STARTCHAR U_4FEE +ENCODING 20462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2D40 +2880 +6B40 +ACA0 +2940 +2A80 +2920 +20C0 +2700 +ENDCHAR +STARTCHAR U_4FEF +ENCODING 20463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2A40 +2A40 +6BE0 +AE40 +2B40 +2AC0 +2A40 +2A40 +32C0 +ENDCHAR +STARTCHAR U_4FF0 +ENCODING 20464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1300 +1C00 +24E0 +64A0 +BFA0 +24A0 +2EA0 +2DA0 +34E0 +24A0 +2400 +ENDCHAR +STARTCHAR U_4FF1 +ENCODING 20465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +6440 +A7C0 +2440 +27C0 +2440 +3FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_4FF2 +ENCODING 20466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2280 +3F80 +69E0 +AAA0 +31A0 +2AA0 +24A0 +2B20 +31A0 +2240 +ENDCHAR +STARTCHAR U_4FF3 +ENCODING 20467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1280 +2EE0 +2280 +6280 +AEE0 +2280 +2280 +2EE0 +2280 +2280 +ENDCHAR +STARTCHAR U_4FF4 +ENCODING 20468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1FE0 +2140 +23A0 +6C60 +A280 +2240 +2FE0 +2140 +21A0 +2E60 +ENDCHAR +STARTCHAR U_4FF5 +ENCODING 20469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2520 +2CC0 +3480 +2540 +2620 +ENDCHAR +STARTCHAR U_4FF6 +ENCODING 20470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +29E0 +2EA0 +48A0 +FEA0 +48A0 +5CA0 +6A40 +4840 +48A0 +5920 +ENDCHAR +STARTCHAR U_4FF7 +ENCODING 20471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +52A0 +D2A0 +5EA0 +53E0 +5E00 +5200 +5220 +5220 +67E0 +ENDCHAR +STARTCHAR U_4FF8 +ENCODING 20472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27E0 +6200 +AFE0 +2540 +2BA0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_4FF9 +ENCODING 20473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4500 +C500 +5DC0 +5040 +5040 +5DC0 +4500 +4500 +7FE0 +ENDCHAR +STARTCHAR U_4FFA +ENCODING 20474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FC0 +2500 +2A80 +6FC0 +BAA0 +2F80 +2A80 +2FA0 +2220 +23E0 +ENDCHAR +STARTCHAR U_4FFB +ENCODING 20475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +17C0 +2C80 +3300 +6480 +B860 +2FC0 +2A40 +2FC0 +2A40 +2FC0 +ENDCHAR +STARTCHAR U_4FFC +ENCODING 20476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2FE0 +6000 +A7C0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_4FFD +ENCODING 20477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2680 +3900 +51E0 +DE20 +5480 +5480 +5480 +5480 +5540 +5520 +6620 +ENDCHAR +STARTCHAR U_4FFE +ENCODING 20478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2920 +2FE0 +6920 +AFE0 +2280 +2480 +3FE0 +2080 +2080 +ENDCHAR +STARTCHAR U_4FFF +ENCODING 20479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1200 +2FE0 +2A40 +6F80 +AA40 +29C0 +2800 +2B80 +2AA0 +34E0 +ENDCHAR +STARTCHAR U_5000 +ENCODING 20480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1400 +2780 +2400 +6780 +A400 +3FE0 +2540 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_5001 +ENCODING 20481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +4EE0 +D4A0 +64A0 +5EA0 +44A0 +44A0 +4AA0 +49E0 +5100 +ENDCHAR +STARTCHAR U_5002 +ENCODING 20482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1240 +2480 +2EE0 +6440 +A440 +2EE0 +2440 +2440 +2840 +3040 +ENDCHAR +STARTCHAR U_5003 +ENCODING 20483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EC0 +52A0 +EAA0 +4480 +4B00 +70E0 +4FC0 +4840 +4840 +4FC0 +ENDCHAR +STARTCHAR U_5004 +ENCODING 20484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14C0 +1300 +2480 +2FE0 +6400 +AFC0 +3440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_5005 +ENCODING 20485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2440 +6440 +AAA0 +2100 +3FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5006 +ENCODING 20486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2100 +2FE0 +6920 +ADA0 +2B60 +2DA0 +2B60 +2920 +2960 +ENDCHAR +STARTCHAR U_5007 +ENCODING 20487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2820 +2400 +6EE0 +AAA0 +2AA0 +36E0 +2480 +28A0 +3060 +ENDCHAR +STARTCHAR U_5008 +ENCODING 20488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2FE0 +2540 +6540 +ABA0 +3100 +2380 +2540 +2920 +3100 +ENDCHAR +STARTCHAR U_5009 +ENCODING 20489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3580 +C260 +1F80 +1280 +1F80 +1000 +2FC0 +2840 +4FC0 +ENDCHAR +STARTCHAR U_500A +ENCODING 20490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +4A40 +D220 +4480 +4F40 +4200 +4140 +5420 +5480 +4380 +ENDCHAR +STARTCHAR U_500B +ENCODING 20491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +2FE0 +6920 +ABA0 +2AA0 +2BA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_500C +ENCODING 20492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +67C0 +A440 +27C0 +2400 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_500D +ENCODING 20493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2440 +6280 +AFE0 +2000 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_500E +ENCODING 20494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2AA0 +2AA0 +6FE0 +AAA0 +2AA0 +3FE0 +2480 +2860 +3020 +ENDCHAR +STARTCHAR U_500F +ENCODING 20495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2640 +2980 +6E60 +A980 +2940 +2FE0 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_5010 +ENCODING 20496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5680 +D900 +5280 +5C60 +5100 +5540 +5900 +4280 +4C60 +ENDCHAR +STARTCHAR U_5011 +ENCODING 20497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +2AA0 +6EE0 +A820 +2820 +2820 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_5012 +ENCODING 20498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3F20 +48A0 +52A0 +DFA0 +44A0 +44A0 +5FA0 +44A0 +4720 +5860 +ENDCHAR +STARTCHAR U_5013 +ENCODING 20499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1580 +2900 +2280 +6440 +B920 +2540 +2580 +2A80 +2440 +3820 +ENDCHAR +STARTCHAR U_5014 +ENCODING 20500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +6880 +AAA0 +2AA0 +2BE0 +2880 +2AA0 +2AA0 +33E0 +ENDCHAR +STARTCHAR U_5015 +ENCODING 20501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +2FE0 +6540 +BFE0 +2540 +2540 +2FE0 +2100 +27C0 +ENDCHAR +STARTCHAR U_5016 +ENCODING 20502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +6FE0 +A440 +2280 +2FE0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_5017 +ENCODING 20503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +6EE0 +AAA0 +2AA0 +2EE0 +2AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_5018 +ENCODING 20504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1920 +2540 +2FE0 +6820 +ABA0 +2AA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_5019 +ENCODING 20505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2080 +5FE0 +5400 +D7C0 +5900 +5FE0 +5100 +5280 +4440 +4820 +ENDCHAR +STARTCHAR U_501A +ENCODING 20506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2280 +2440 +7FE0 +A040 +2F40 +2940 +2F40 +2040 +21C0 +ENDCHAR +STARTCHAR U_501B +ENCODING 20507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1FE0 +2440 +27C0 +6440 +A7C0 +2440 +3FE0 +2000 +2440 +2820 +ENDCHAR +STARTCHAR U_501C +ENCODING 20508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2FA0 +2920 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +2820 +30E0 +ENDCHAR +STARTCHAR U_501D +ENCODING 20509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +1080 +7C80 +4480 +7D40 +4540 +7D40 +1240 +FE20 +1420 +ENDCHAR +STARTCHAR U_501E +ENCODING 20510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2000 +67C0 +A440 +27C0 +2100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_501F +ENCODING 20511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1FE0 +2480 +2480 +7FE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5020 +ENCODING 20512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1240 +27E0 +6C80 +B480 +27E0 +2480 +27E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_5021 +ENCODING 20513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A000 +2FE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5022 +ENCODING 20514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1100 +2FC0 +2140 +7FE0 +A140 +2FC0 +2500 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_5023 +ENCODING 20515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +3FE0 +68A0 +AFA0 +2AA0 +2AA0 +2AA0 +2A40 +2AA0 +3720 +ENDCHAR +STARTCHAR U_5024 +ENCODING 20516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +C7C0 +5440 +57C0 +5440 +57C0 +5440 +57C0 +5FE0 +ENDCHAR +STARTCHAR U_5025 +ENCODING 20517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2AA0 +6440 +A820 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5026 +ENCODING 20518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2680 +3FE0 +6400 +BFE0 +2840 +37A0 +2480 +2580 +2420 +23E0 +ENDCHAR +STARTCHAR U_5027 +ENCODING 20519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +2FE0 +2820 +67C0 +A000 +2FE0 +2100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_5028 +ENCODING 20520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1420 +2420 +27E0 +6480 +A7E0 +2480 +2BE0 +2A20 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5029 +ENCODING 20521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_502A +ENCODING 20522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +2820 +2EE0 +6820 +AFE0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_502B +ENCODING 20523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +2440 +3BA0 +6000 +AFE0 +2AA0 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_502C +ENCODING 20524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +2200 +6FC0 +A840 +2FC0 +2840 +2FC0 +2200 +3FE0 +2200 +ENDCHAR +STARTCHAR U_502D +ENCODING 20525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1780 +2100 +3FE0 +6540 +A920 +2200 +3FE0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_502E +ENCODING 20526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +2FC0 +2940 +6FC0 +A100 +3FE0 +2300 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_502F +ENCODING 20527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2940 +4940 +7D40 +C920 +5AA0 +5C80 +6880 +4940 +4920 +4BE0 +ENDCHAR +STARTCHAR U_5030 +ENCODING 20528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +2FE0 +6440 +AA20 +33C0 +2440 +2A80 +2180 +2E60 +ENDCHAR +STARTCHAR U_5031 +ENCODING 20529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +2840 +6FC0 +A020 +2940 +2F80 +2920 +2B20 +2CE0 +ENDCHAR +STARTCHAR U_5032 +ENCODING 20530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4200 +CFC0 +4A40 +4FC0 +4A40 +4FC0 +4700 +4A80 +7260 +ENDCHAR +STARTCHAR U_5033 +ENCODING 20531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5FC0 +D240 +5FC0 +4240 +7FE0 +4240 +5FC0 +4200 +4600 +ENDCHAR +STARTCHAR U_5034 +ENCODING 20532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4500 +CA80 +7760 +4200 +4880 +7FE0 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_5035 +ENCODING 20533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2EA0 +40A0 +5FE0 +C480 +5480 +5780 +54A0 +54A0 +5EA0 +6060 +ENDCHAR +STARTCHAR U_5036 +ENCODING 20534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2880 +4F80 +C880 +4F80 +4880 +4F80 +4000 +7FE0 +4480 +4840 +ENDCHAR +STARTCHAR U_5037 +ENCODING 20535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1FE0 +2480 +2840 +77A0 +A000 +2FC0 +2100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_5038 +ENCODING 20536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +5220 +C940 +4200 +5FE0 +4200 +4700 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_5039 +ENCODING 20537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2500 +4880 +D740 +6220 +4FC0 +4A40 +4FC0 +4200 +4500 +58C0 +ENDCHAR +STARTCHAR U_503A +ENCODING 20538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_503B +ENCODING 20539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5520 +DD40 +5580 +5D40 +5520 +5FA0 +7540 +4500 +4500 +ENDCHAR +STARTCHAR U_503C +ENCODING 20540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2200 +27C0 +6440 +A7C0 +2440 +2740 +25C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_503D +ENCODING 20541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4500 +C880 +5740 +6220 +5FC0 +4200 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_503E +ENCODING 20542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1900 +2BE0 +2E20 +6AA0 +AAA0 +2AA0 +2EA0 +2AA0 +2140 +2620 +ENDCHAR +STARTCHAR U_503F +ENCODING 20543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4880 +C500 +5FC0 +4200 +5FE0 +4480 +4980 +4600 +5DC0 +ENDCHAR +STARTCHAR U_5040 +ENCODING 20544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1FE0 +2480 +2100 +6FC0 +A940 +2940 +3FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_5041 +ENCODING 20545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2A20 +2540 +2100 +6FC0 +A940 +2FC0 +2940 +3FE0 +2840 +29C0 +ENDCHAR +STARTCHAR U_5042 +ENCODING 20546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2480 +5FE0 +C000 +5E20 +52A0 +5EA0 +52A0 +5EA0 +5220 +5660 +ENDCHAR +STARTCHAR U_5043 +ENCODING 20547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +2BC0 +2A40 +6BC0 +A900 +2FE0 +2A40 +2980 +2A40 +2FE0 +ENDCHAR +STARTCHAR U_5044 +ENCODING 20548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +5FC0 +D540 +5540 +52C0 +4200 +5FE0 +4500 +4880 +7060 +ENDCHAR +STARTCHAR U_5045 +ENCODING 20549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +3FE0 +2940 +6FC0 +A940 +2FC0 +2100 +2FC0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_5046 +ENCODING 20550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +2FE0 +6280 +A440 +2FE0 +3440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5047 +ENCODING 20551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A20 +2A20 +2EE0 +6800 +AEE0 +28A0 +2EA0 +2840 +28C0 +2920 +ENDCHAR +STARTCHAR U_5048 +ENCODING 20552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +2840 +6FC0 +A400 +2FE0 +3920 +2AA0 +2FA0 +2040 +ENDCHAR +STARTCHAR U_5049 +ENCODING 20553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +17C0 +2240 +2FE0 +6440 +A7C0 +2100 +27E0 +2500 +2FE0 +2100 +ENDCHAR +STARTCHAR U_504A +ENCODING 20554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1100 +27C0 +2540 +67C0 +A100 +2FE0 +2920 +2FA0 +28A0 +2860 +ENDCHAR +STARTCHAR U_504B +ENCODING 20555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2A20 +6940 +AFE0 +2940 +2FE0 +2940 +3240 +2440 +ENDCHAR +STARTCHAR U_504C +ENCODING 20556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +1FE0 +2480 +2100 +6FE0 +A200 +27C0 +2C40 +3440 +27C0 +2440 +ENDCHAR +STARTCHAR U_504D +ENCODING 20557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +67C0 +A000 +2FE0 +2500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_504E +ENCODING 20558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +2FC0 +2940 +6FC0 +A000 +3FE0 +2540 +2480 +2640 +2C20 +ENDCHAR +STARTCHAR U_504F +ENCODING 20559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +2FE0 +6800 +AFE0 +2AA0 +2FE0 +2AA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_5050 +ENCODING 20560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2FE0 +6440 +A280 +2FE0 +2840 +2B80 +2860 +2B80 +2860 +3380 +ENDCHAR +STARTCHAR U_5051 +ENCODING 20561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +5140 +5E40 +D440 +5F40 +5540 +5F40 +5440 +5520 +6F20 +ENDCHAR +STARTCHAR U_5052 +ENCODING 20562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +1480 +2780 +2480 +7FE0 +A800 +2FE0 +32A0 +24A0 +2920 +2260 +ENDCHAR +STARTCHAR U_5053 +ENCODING 20563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2800 +6FE0 +AA40 +2FE0 +2880 +2BE0 +3080 +27E0 +ENDCHAR +STARTCHAR U_5054 +ENCODING 20564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +C000 +4FC0 +4000 +5FE0 +4400 +47C0 +4080 +4300 +ENDCHAR +STARTCHAR U_5055 +ENCODING 20565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EA0 +28C0 +2AA0 +6C60 +A100 +27E0 +2420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_5056 +ENCODING 20566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +2FC0 +2280 +7FE0 +A100 +27C0 +3C40 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5057 +ENCODING 20567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1520 +2940 +3080 +67E0 +BC20 +27E0 +2420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_5058 +ENCODING 20568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +2440 +67C0 +A000 +2EE0 +2AA0 +2AA0 +2AA0 +2EE0 +ENDCHAR +STARTCHAR U_5059 +ENCODING 20569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4880 +C500 +5FE0 +5220 +4FC0 +4A40 +4A40 +4AC0 +4200 +ENDCHAR +STARTCHAR U_505A +ENCODING 20570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4880 +7FE0 +C940 +4B40 +5D40 +5540 +5480 +5D40 +4220 +ENDCHAR +STARTCHAR U_505B +ENCODING 20571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +1700 +2100 +3FE0 +6100 +AD60 +2920 +2D60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_505C +ENCODING 20572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2000 +4FC0 +4840 +DFE0 +5020 +4FC0 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_505D +ENCODING 20573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2EC0 +22A0 +2E60 +67C0 +A440 +27C0 +2440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_505E +ENCODING 20574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1FE0 +2540 +25C0 +6400 +A7E0 +2100 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_505F +ENCODING 20575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1200 +27C0 +2440 +67C0 +A440 +2FE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5060 +ENCODING 20576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +6AA0 +AFE0 +2200 +2FE0 +2240 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_5061 +ENCODING 20577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +27C0 +6440 +A7C0 +2440 +3FE0 +2540 +2620 +27E0 +ENDCHAR +STARTCHAR U_5062 +ENCODING 20578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2C40 +2540 +3F60 +6540 +A640 +2D40 +3440 +2440 +24A0 +2520 +ENDCHAR +STARTCHAR U_5063 +ENCODING 20579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2280 +6FE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5064 +ENCODING 20580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2280 +6FE0 +AAA0 +2CE0 +2820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5065 +ENCODING 20581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +4940 +CFE0 +5140 +5FE0 +4500 +57E0 +4900 +5500 +63E0 +ENDCHAR +STARTCHAR U_5066 +ENCODING 20582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2240 +2B80 +4E00 +F1E0 +4F80 +4880 +4F80 +4880 +4F80 +4880 +ENDCHAR +STARTCHAR U_5067 +ENCODING 20583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4500 +CA80 +7560 +4200 +4D80 +4240 +4580 +4100 +4E00 +ENDCHAR +STARTCHAR U_5068 +ENCODING 20584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +56C0 +5480 +D6A0 +5960 +4100 +5FE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_5069 +ENCODING 20585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +2FE0 +2420 +67E0 +A420 +27E0 +2420 +27E0 +2280 +2C60 +ENDCHAR +STARTCHAR U_506A +ENCODING 20586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1000 +27C0 +2440 +67C0 +A000 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_506B +ENCODING 20587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +4880 +5480 +CBE0 +5840 +4FE0 +4A40 +4940 +4840 +48C0 +ENDCHAR +STARTCHAR U_506C +ENCODING 20588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +4AA0 +54A0 +CF20 +52A0 +4440 +4240 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_506D +ENCODING 20589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4200 +5FE0 +D4A0 +57A0 +54A0 +57A0 +54A0 +5FE0 +5020 +ENDCHAR +STARTCHAR U_506E +ENCODING 20590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17C0 +2440 +27C0 +6000 +AFE0 +2440 +27C0 +2440 +2FE0 +2040 +ENDCHAR +STARTCHAR U_506F +ENCODING 20591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2000 +27C0 +6440 +A7C0 +2320 +2540 +2C80 +2540 +2620 +ENDCHAR +STARTCHAR U_5070 +ENCODING 20592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +3FE0 +48A0 +DEA0 +48A0 +5F60 +4A00 +7FE0 +4500 +4880 +7060 +ENDCHAR +STARTCHAR U_5071 +ENCODING 20593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1880 +2BE0 +2880 +6BE0 +AA20 +2BE0 +2A20 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5072 +ENCODING 20594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2FE0 +6920 +AFE0 +2820 +2200 +2540 +2C20 +3440 +23C0 +ENDCHAR +STARTCHAR U_5073 +ENCODING 20595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +27C0 +2000 +6FE0 +A100 +2FE0 +2AA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_5074 +ENCODING 20596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3E20 +52A0 +5EA0 +D2A0 +5EA0 +52A0 +5EA0 +4420 +4A20 +5160 +ENDCHAR +STARTCHAR U_5075 +ENCODING 20597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2200 +2FC0 +6840 +AFC0 +2840 +2FC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_5076 +ENCODING 20598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1540 +27C0 +2540 +67C0 +A100 +2FE0 +2920 +29A0 +2F20 +2860 +ENDCHAR +STARTCHAR U_5077 +ENCODING 20599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +5B60 +4000 +5E20 +D2A0 +5EA0 +52A0 +5EA0 +5220 +56E0 +ENDCHAR +STARTCHAR U_5078 +ENCODING 20600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2500 +2880 +7760 +A000 +2EA0 +2AA0 +2F40 +2B40 +2EA0 +2AA0 +ENDCHAR +STARTCHAR U_5079 +ENCODING 20601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +5440 +DC80 +5380 +5C60 +57C0 +5540 +57C0 +4540 +47C0 +ENDCHAR +STARTCHAR U_507A +ENCODING 20602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EC0 +2AA0 +76A0 +A580 +2860 +37C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_507B +ENCODING 20603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +2100 +6540 +A920 +2FE0 +2240 +2680 +2140 +2E20 +ENDCHAR +STARTCHAR U_507C +ENCODING 20604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4200 +CFC0 +4040 +4FC0 +4040 +4FC0 +5200 +5A00 +67E0 +ENDCHAR +STARTCHAR U_507D +ENCODING 20605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +2600 +2F80 +2480 +67C0 +A440 +27E0 +2820 +3520 +2AA0 +2060 +ENDCHAR +STARTCHAR U_507E +ENCODING 20606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2540 +2FE0 +6440 +AFE0 +2820 +2920 +2920 +2280 +2C60 +ENDCHAR +STARTCHAR U_507F +ENCODING 20607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4100 +5FE0 +D020 +4FC0 +4000 +5FE0 +4200 +4440 +4FE0 +ENDCHAR +STARTCHAR U_5080 +ENCODING 20608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5240 +5FC0 +D240 +5FC0 +4240 +46A0 +46E0 +4A20 +51E0 +ENDCHAR +STARTCHAR U_5081 +ENCODING 20609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2EC0 +4A40 +4EC0 +CA40 +4FC0 +4200 +4FC0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_5082 +ENCODING 20610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +5F00 +51C0 +5100 +D7E0 +5520 +57E0 +5500 +65C0 +4940 +5260 +ENDCHAR +STARTCHAR U_5083 +ENCODING 20611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +27C0 +2100 +6FE0 +A280 +2700 +2240 +27A0 +2940 +3320 +ENDCHAR +STARTCHAR U_5084 +ENCODING 20612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2540 +5480 +4FC0 +D860 +4FC0 +4840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_5085 +ENCODING 20613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3FE0 +4200 +4FC0 +CA40 +4FC0 +4A40 +7FE0 +4880 +4480 +4180 +ENDCHAR +STARTCHAR U_5086 +ENCODING 20614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +3100 +57C0 +5440 +D7C0 +5440 +57C0 +5100 +5540 +5520 +6B20 +ENDCHAR +STARTCHAR U_5087 +ENCODING 20615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +1FE0 +2240 +2FE0 +6440 +A7C0 +2440 +27C0 +2460 +2FC0 +2040 +ENDCHAR +STARTCHAR U_5088 +ENCODING 20616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6AA0 +AFE0 +2100 +2FE0 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_5089 +ENCODING 20617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +2BC0 +4800 +4FE0 +CA80 +4B60 +4840 +4FE0 +5240 +51C0 +ENDCHAR +STARTCHAR U_508A +ENCODING 20618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +4000 +4FE0 +C820 +4FE0 +4820 +4FE0 +4440 +4820 +ENDCHAR +STARTCHAR U_508B +ENCODING 20619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +2480 +2FC0 +6480 +BFE0 +2A40 +2FC0 +2A40 +3FE0 +2840 +ENDCHAR +STARTCHAR U_508C +ENCODING 20620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2FC0 +2900 +6FC0 +A900 +2FE0 +2020 +2D20 +2AA0 +32E0 +ENDCHAR +STARTCHAR U_508D +ENCODING 20621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +6FE0 +A920 +2FE0 +2200 +23E0 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_508E +ENCODING 20622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +27C0 +6440 +A740 +25C0 +2440 +3FE0 +2480 +3860 +ENDCHAR +STARTCHAR U_508F +ENCODING 20623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +4FC0 +C940 +4FE0 +4940 +4FC0 +5440 +5440 +67C0 +ENDCHAR +STARTCHAR U_5090 +ENCODING 20624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4000 +4780 +C480 +5FE0 +5020 +57A0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_5091 +ENCODING 20625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2DE0 +5540 +5D40 +C7E0 +4840 +5240 +7FE0 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_5092 +ENCODING 20626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3F20 +2940 +2480 +6700 +A240 +2FA0 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_5093 +ENCODING 20627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +4FE0 +C800 +4EE0 +4A20 +4AA0 +4E60 +52A0 +6660 +ENDCHAR +STARTCHAR U_5094 +ENCODING 20628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FE0 +4500 +5FC0 +C540 +7FE0 +4540 +5FC0 +4D80 +5540 +6520 +ENDCHAR +STARTCHAR U_5095 +ENCODING 20629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +23E0 +6480 +AFE0 +3480 +27E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_5096 +ENCODING 20630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2500 +4A80 +5160 +EFC0 +4940 +4FC0 +4800 +4FC0 +5440 +67C0 +ENDCHAR +STARTCHAR U_5097 +ENCODING 20631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4480 +4F00 +C480 +5FC0 +5240 +5FC0 +5240 +5FC0 +5040 +ENDCHAR +STARTCHAR U_5098 +ENCODING 20632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +E4E0 +2480 +5540 +2480 +5540 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5099 +ENCODING 20633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +2480 +3FE0 +6400 +AFE0 +2920 +3FE0 +2920 +2FE0 +2920 +ENDCHAR +STARTCHAR U_509A +ENCODING 20634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +3FE0 +6AA0 +B1A0 +2AA0 +24A0 +24A0 +2A40 +30A0 +2320 +ENDCHAR +STARTCHAR U_509B +ENCODING 20635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +4440 +C920 +4280 +4440 +4FE0 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_509C +ENCODING 20636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +1E20 +2A20 +2540 +6400 +AFC0 +3100 +2FE0 +2100 +2920 +2FE0 +ENDCHAR +STARTCHAR U_509D +ENCODING 20637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +4FC0 +4840 +CFC0 +4000 +5EE0 +4AA0 +4660 +5BA0 +4660 +ENDCHAR +STARTCHAR U_509E +ENCODING 20638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2100 +67C0 +A100 +3FE0 +2400 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_509F +ENCODING 20639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2A40 +54A0 +4F80 +C000 +5DC0 +5540 +4CC0 +5540 +4CC0 +ENDCHAR +STARTCHAR U_50A0 +ENCODING 20640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2440 +3E40 +41E0 +5E40 +C140 +5EC0 +4040 +5E40 +5240 +5EC0 +ENDCHAR +STARTCHAR U_50A1 +ENCODING 20641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +4000 +5DE0 +C000 +5540 +5540 +5540 +4840 +4C80 +73E0 +ENDCHAR +STARTCHAR U_50A2 +ENCODING 20642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +3020 +2FC0 +6440 +AA80 +3500 +2B80 +2540 +2920 +2600 +ENDCHAR +STARTCHAR U_50A3 +ENCODING 20643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2200 +2FC0 +6400 +BFE0 +2940 +3560 +2380 +2540 +2B20 +ENDCHAR +STARTCHAR U_50A4 +ENCODING 20644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2580 +3F40 +4540 +5FE0 +C900 +5F40 +5540 +5E80 +44A0 +5F60 +4520 +ENDCHAR +STARTCHAR U_50A5 +ENCODING 20645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +2820 +67C0 +A440 +27C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_50A6 +ENCODING 20646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2E40 +4A40 +5FE0 +D020 +4FC0 +4840 +4FC0 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_50A7 +ENCODING 20647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +28A0 +2700 +6400 +A7C0 +2480 +2480 +3FE0 +2480 +3860 +ENDCHAR +STARTCHAR U_50A8 +ENCODING 20648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6120 +57C0 +4140 +77E0 +D100 +53C0 +5640 +53C0 +5A40 +5240 +43C0 +ENDCHAR +STARTCHAR U_50A9 +ENCODING 20649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3D40 +47E0 +5640 +D7E0 +4A40 +4BE0 +5640 +6240 +43E0 +4200 +ENDCHAR +STARTCHAR U_50AA +ENCODING 20650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4000 +48A0 +DDE0 +4200 +4D80 +5260 +4480 +4100 +4E00 +ENDCHAR +STARTCHAR U_50AB +ENCODING 20651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +4FC0 +4940 +CFC0 +4480 +4340 +5FE0 +4100 +4940 +5720 +ENDCHAR +STARTCHAR U_50AC +ENCODING 20652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +2500 +6FE0 +A900 +3FC0 +2900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_50AD +ENCODING 20653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2940 +2BE0 +6940 +AFE0 +2AA0 +2BE0 +2AA0 +2BE0 +32A0 +ENDCHAR +STARTCHAR U_50AE +ENCODING 20654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6FE0 +AAA0 +2FE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_50AF +ENCODING 20655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +2940 +2B40 +6EC0 +A940 +2FC0 +2540 +2CA0 +3460 +23C0 +ENDCHAR +STARTCHAR U_50B0 +ENCODING 20656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +2000 +2EE0 +6AA0 +AEE0 +2AA0 +2EE0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_50B1 +ENCODING 20657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +2940 +32A0 +64A0 +A800 +3A80 +2AE0 +2A80 +2A80 +2D80 +28E0 +ENDCHAR +STARTCHAR U_50B2 +ENCODING 20658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +3F00 +4900 +5FE0 +C940 +7F40 +4940 +5D40 +5480 +6540 +4A20 +ENDCHAR +STARTCHAR U_50B3 +ENCODING 20659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2A40 +2FC0 +6A40 +BFC0 +2280 +3FE0 +2880 +2480 +2180 +ENDCHAR +STARTCHAR U_50B4 +ENCODING 20660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2BC0 +2A40 +2BC0 +6800 +AEE0 +2AA0 +2AA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_50B5 +ENCODING 20661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2100 +27C0 +6100 +AFE0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_50B6 +ENCODING 20662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3FE0 +5500 +5700 +D520 +5F20 +5540 +5E80 +55A0 +54E0 +6D20 +ENDCHAR +STARTCHAR U_50B7 +ENCODING 20663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C40 +37C0 +6440 +BFE0 +2400 +2FE0 +3520 +2A20 +24C0 +ENDCHAR +STARTCHAR U_50B8 +ENCODING 20664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +2200 +3740 +6A80 +B740 +2A80 +3740 +2200 +2580 +3860 +ENDCHAR +STARTCHAR U_50B9 +ENCODING 20665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4480 +5FE0 +C840 +4FC0 +4840 +4FC0 +4480 +44A0 +58E0 +ENDCHAR +STARTCHAR U_50BA +ENCODING 20666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +52A0 +5AC0 +6440 +5BA0 +D000 +6FE0 +4100 +4940 +5120 +6720 +ENDCHAR +STARTCHAR U_50BB +ENCODING 20667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2AA0 +2920 +6AA0 +AFE0 +2A40 +37E0 +2C80 +2300 +2CE0 +ENDCHAR +STARTCHAR U_50BC +ENCODING 20668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +4780 +CFC0 +4A40 +4FC0 +4200 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_50BD +ENCODING 20669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +2FE0 +6440 +A7C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_50BE +ENCODING 20670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +2BE0 +2A20 +6FE0 +AA20 +2BE0 +2E20 +2BE0 +3140 +2620 +ENDCHAR +STARTCHAR U_50BF +ENCODING 20671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +25C0 +2500 +6FE0 +A400 +2FC0 +2800 +2FE0 +2AA0 +3560 +ENDCHAR +STARTCHAR U_50C0 +ENCODING 20672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FE0 +5540 +D760 +6000 +5FE0 +5220 +4FC0 +4A40 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_50C1 +ENCODING 20673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5240 +4A80 +5FE0 +CA80 +7260 +4000 +4640 +5520 +54A0 +6380 +ENDCHAR +STARTCHAR U_50C2 +ENCODING 20674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2540 +2FE0 +6540 +AFC0 +2940 +3FE0 +2440 +2380 +3E60 +ENDCHAR +STARTCHAR U_50C3 +ENCODING 20675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FE0 +5500 +DFE0 +6020 +4FA0 +4AA0 +4FA0 +4AA0 +4FA0 +4AE0 +ENDCHAR +STARTCHAR U_50C4 +ENCODING 20676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4480 +5FE0 +54A0 +DFE0 +4000 +4FC0 +4000 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_50C5 +ENCODING 20677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1FE0 +2280 +27C0 +6540 +A540 +2FE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_50C6 +ENCODING 20678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +2AA0 +23E0 +7AA0 +ABE0 +2880 +2BE0 +2880 +3480 +23E0 +ENDCHAR +STARTCHAR U_50C7 +ENCODING 20679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +2AA0 +4660 +4AA0 +57A0 +C940 +5620 +4080 +4720 +4040 +4F80 +ENDCHAR +STARTCHAR U_50C8 +ENCODING 20680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +6FE0 +AAA0 +2AA0 +2FE0 +2480 +2300 +3CE0 +ENDCHAR +STARTCHAR U_50C9 +ENCODING 20681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0000 +7BC0 +4A40 +7BC0 +1080 +2940 +C620 +ENDCHAR +STARTCHAR U_50CA +ENCODING 20682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1280 +2FE0 +2AA0 +6FE0 +A200 +3FE0 +2CC0 +35A0 +2440 +23C0 +ENDCHAR +STARTCHAR U_50CB +ENCODING 20683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +4A40 +57A0 +C100 +4FC0 +4840 +4FC0 +4840 +4FC0 +5860 +ENDCHAR +STARTCHAR U_50CC +ENCODING 20684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3F40 +44E0 +5FA0 +D5A0 +5FA0 +5540 +5F40 +4440 +5EA0 +4520 +ENDCHAR +STARTCHAR U_50CD +ENCODING 20685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +4480 +7FE0 +D5A0 +5FA0 +55A0 +5FA0 +44A0 +5FA0 +44A0 +5F40 +ENDCHAR +STARTCHAR U_50CE +ENCODING 20686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +4880 +CEE0 +4480 +4FC0 +4480 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_50CF +ENCODING 20687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +2FE0 +3520 +67E0 +A220 +2D40 +2280 +2DC0 +22A0 +2D80 +ENDCHAR +STARTCHAR U_50D0 +ENCODING 20688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FE0 +2200 +5FC0 +C200 +5FC0 +4A80 +7FE0 +4880 +4880 +4F80 +ENDCHAR +STARTCHAR U_50D1 +ENCODING 20689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +5FE0 +4840 +D7A0 +6480 +5FE0 +5020 +57A0 +54A0 +57E0 +ENDCHAR +STARTCHAR U_50D2 +ENCODING 20690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +28A0 +5FC0 +C480 +7FE0 +5F80 +4800 +5FC0 +6840 +4FC0 +ENDCHAR +STARTCHAR U_50D3 +ENCODING 20691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2540 +67C0 +A000 +3FE0 +2640 +2540 +27C0 +2280 +2C60 +ENDCHAR +STARTCHAR U_50D4 +ENCODING 20692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1FE0 +2280 +2FE0 +6AA0 +AC60 +2FE0 +2080 +3FE0 +2880 +2580 +ENDCHAR +STARTCHAR U_50D5 +ENCODING 20693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +2FE0 +2280 +6FE0 +A100 +27E0 +2100 +3FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_50D6 +ENCODING 20694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2200 +3FE0 +6840 +AFC0 +2480 +3FE0 +2840 +2840 +2FC0 +ENDCHAR +STARTCHAR U_50D7 +ENCODING 20695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +5DC0 +6A80 +D540 +6220 +5FE0 +5220 +4FC0 +4240 +4440 +5980 +ENDCHAR +STARTCHAR U_50D8 +ENCODING 20696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5580 +4EE0 +DF20 +51A0 +5DA0 +5540 +5D40 +51A0 +5320 +ENDCHAR +STARTCHAR U_50D9 +ENCODING 20697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +2480 +5FE0 +4100 +CFC0 +4940 +4FC0 +4940 +4FC0 +5860 +ENDCHAR +STARTCHAR U_50DA +ENCODING 20698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +4F80 +D8C0 +6F80 +4880 +4F80 +4A80 +5240 +6620 +ENDCHAR +STARTCHAR U_50DB +ENCODING 20699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +7F80 +52E0 +DF20 +5280 +5E80 +5280 +7F80 +4880 +5540 +6220 +ENDCHAR +STARTCHAR U_50DC +ENCODING 20700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2D40 +2580 +54A0 +4FC0 +D020 +4FC0 +4840 +4FC0 +4840 +4480 +5FE0 +ENDCHAR +STARTCHAR U_50DD +ENCODING 20701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +6880 +AFE0 +2880 +2FE0 +2A40 +2FE0 +3240 +26C0 +ENDCHAR +STARTCHAR U_50DE +ENCODING 20702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1F20 +2540 +6F80 +A880 +2FC0 +2840 +2FE0 +2AA0 +2AA0 +3060 +ENDCHAR +STARTCHAR U_50DF +ENCODING 20703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +29A0 +4FE0 +4540 +CBA0 +5FE0 +4900 +5FE0 +4940 +4CA0 +5160 +ENDCHAR +STARTCHAR U_50E0 +ENCODING 20704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1FA0 +2540 +2FE0 +6540 +A920 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_50E1 +ENCODING 20705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2A40 +4FC0 +4A40 +CFC0 +4240 +5FE0 +4520 +5440 +57C0 +ENDCHAR +STARTCHAR U_50E2 +ENCODING 20706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F40 +4A80 +5FE0 +D020 +4E40 +52E0 +5D40 +45E0 +4840 +5040 +ENDCHAR +STARTCHAR U_50E3 +ENCODING 20707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +3DE0 +4880 +7DE0 +C880 +5540 +6FE0 +4840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_50E4 +ENCODING 20708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2FE0 +2920 +6FE0 +A920 +2FE0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_50E5 +ENCODING 20709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +2100 +6FE0 +A440 +2EE0 +2440 +3FE0 +2480 +24A0 +3860 +ENDCHAR +STARTCHAR U_50E6 +ENCODING 20710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7EC0 +40A0 +5FE0 +D280 +5E80 +4880 +5C80 +6AA0 +49A0 +5A60 +ENDCHAR +STARTCHAR U_50E7 +ENCODING 20711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2D60 +6BA0 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_50E8 +ENCODING 20712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2540 +3FE0 +6440 +AFC0 +2840 +2FC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_50E9 +ENCODING 20713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +2AA0 +6EE0 +ABA0 +2AA0 +2BA0 +2AA0 +2BA0 +2CE0 +ENDCHAR +STARTCHAR U_50EA +ENCODING 20714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +5FE0 +4540 +C900 +5FE0 +54A0 +5FE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_50EB +ENCODING 20715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2500 +5DC0 +5040 +5DC0 +C500 +5FE0 +4240 +5520 +5440 +47C0 +ENDCHAR +STARTCHAR U_50EC +ENCODING 20716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +1480 +27E0 +2C80 +67E0 +A480 +27E0 +2480 +27E0 +2540 +2AA0 +ENDCHAR +STARTCHAR U_50ED +ENCODING 20717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4540 +5540 +7FE0 +CCC0 +5560 +6FC0 +4840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_50EE +ENCODING 20718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1FE0 +2440 +2280 +6FE0 +A540 +27C0 +2540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_50EF +ENCODING 20719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +2540 +6920 +B540 +2EE0 +2B40 +35E0 +2840 +3040 +ENDCHAR +STARTCHAR U_50F0 +ENCODING 20720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +AAA0 +7180 +AAC0 +24A0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_50F1 +ENCODING 20721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5020 +5FE0 +D500 +5480 +5FE0 +5480 +57E0 +5480 +67E0 +ENDCHAR +STARTCHAR U_50F2 +ENCODING 20722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +4AA0 +CFE0 +4840 +4DE0 +5540 +6DE0 +4840 +5040 +ENDCHAR +STARTCHAR U_50F3 +ENCODING 20723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6FE0 +A920 +2540 +3FE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_50F4 +ENCODING 20724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5DE0 +5520 +DFE0 +54A0 +57A0 +54A0 +57A0 +5020 +5060 +ENDCHAR +STARTCHAR U_50F5 +ENCODING 20725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +2540 +67C0 +A540 +2FE0 +2540 +27C0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_50F6 +ENCODING 20726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2EE0 +6280 +AEE0 +2AA0 +2EE0 +2AA0 +2EE0 +2280 +21E0 +ENDCHAR +STARTCHAR U_50F7 +ENCODING 20727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1FE0 +1280 +2540 +7FE0 +A540 +27E0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_50F8 +ENCODING 20728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +2440 +6EE0 +B540 +2FC0 +2000 +2FE0 +2580 +2940 +3320 +ENDCHAR +STARTCHAR U_50F9 +ENCODING 20729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +2AA0 +6FE0 +A440 +2740 +25C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_50FA +ENCODING 20730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +6000 +AEE0 +2AA0 +2EE0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_50FB +ENCODING 20731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3FE0 +52A0 +5E40 +D1E0 +5040 +5E40 +5BE0 +6A40 +4E40 +4040 +ENDCHAR +STARTCHAR U_50FC +ENCODING 20732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +3FC0 +5540 +5FC0 +D540 +7FE0 +5040 +5FC0 +4880 +4500 +5FC0 +ENDCHAR +STARTCHAR U_50FD +ENCODING 20733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E40 +2940 +5F60 +4940 +DC40 +6AA0 +4920 +4240 +5520 +54A0 +6380 +ENDCHAR +STARTCHAR U_50FE +ENCODING 20734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +2FE0 +2920 +6640 +ABE0 +2200 +27E0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_50FF +ENCODING 20735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +34A0 +2FC0 +6480 +BFE0 +2480 +2A40 +37A0 +2200 +2FE0 +ENDCHAR +STARTCHAR U_5100 +ENCODING 20736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +4200 +4FC0 +C200 +5FE0 +4940 +5FE0 +6D40 +5AA0 +4860 +ENDCHAR +STARTCHAR U_5101 +ENCODING 20737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2FC0 +2900 +5FC0 +4900 +CFE0 +4800 +4EE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_5102 +ENCODING 20738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4AA0 +4FE0 +CAA0 +5FE0 +5000 +5FE0 +54A0 +5540 +6620 +ENDCHAR +STARTCHAR U_5103 +ENCODING 20739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +5740 +5040 +DFC0 +4F80 +4880 +4F80 +4880 +7FE0 +ENDCHAR +STARTCHAR U_5104 +ENCODING 20740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4480 +5FE0 +C840 +4FC0 +4840 +4FC0 +4540 +54A0 +63A0 +ENDCHAR +STARTCHAR U_5105 +ENCODING 20741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +2A80 +5FE0 +5020 +C780 +4480 +5FE0 +5120 +5FE0 +5120 +5FE0 +ENDCHAR +STARTCHAR U_5106 +ENCODING 20742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +4AE0 +4AA0 +DFA0 +62A0 +5EA0 +56A0 +5E40 +42A0 +4D20 +ENDCHAR +STARTCHAR U_5107 +ENCODING 20743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2AA0 +3FE0 +6000 +AFC0 +2840 +2FC0 +2540 +2C80 +3660 +ENDCHAR +STARTCHAR U_5108 +ENCODING 20744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +27C0 +3820 +6FE0 +AAA0 +2FE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5109 +ENCODING 20745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +27C0 +3820 +6EE0 +AAA0 +2AA0 +2EE0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_510A +ENCODING 20746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1FE0 +2440 +2EE0 +7540 +A000 +3FE0 +2520 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_510B +ENCODING 20747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1480 +2FE0 +3AA0 +6FE0 +A800 +2BE0 +2800 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_510C +ENCODING 20748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +5280 +5EE0 +5320 +DEA0 +48A0 +7FA0 +50A0 +5E40 +52A0 +6D20 +ENDCHAR +STARTCHAR U_510D +ENCODING 20749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2D40 +2AC0 +4D40 +CFC0 +4480 +4A40 +77A0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_510E +ENCODING 20750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FC0 +24A0 +5FE0 +C480 +5FA0 +54A0 +5FC0 +54C0 +7FA0 +4520 +ENDCHAR +STARTCHAR U_510F +ENCODING 20751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +26E0 +24A0 +4E40 +DAA0 +4440 +5A80 +5FE0 +4700 +4A80 +5260 +ENDCHAR +STARTCHAR U_5110 +ENCODING 20752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +27E0 +6940 +A7C0 +3C40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_5111 +ENCODING 20753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +2820 +6FE0 +A440 +2AA0 +2440 +2EE0 +2440 +2AA0 +ENDCHAR +STARTCHAR U_5112 +ENCODING 20754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +2920 +67C0 +A100 +2FE0 +2100 +2FE0 +2AA0 +2AE0 +ENDCHAR +STARTCHAR U_5113 +ENCODING 20755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +4200 +4F80 +4880 +FFE0 +64A0 +5FC0 +4200 +5FC0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_5114 +ENCODING 20756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4200 +5FE0 +4220 +DFC0 +4000 +5FE0 +4040 +5FE0 +5540 +5CC0 +ENDCHAR +STARTCHAR U_5115 +ENCODING 20757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +4A80 +DAC0 +6AA0 +4840 +4FC0 +4840 +4FC0 +5040 +ENDCHAR +STARTCHAR U_5116 +ENCODING 20758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E80 +34E0 +5E80 +5EC0 +D520 +5E20 +4000 +5FC0 +5540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_5117 +ENCODING 20759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +2C20 +4AC0 +4E40 +D1E0 +5E40 +6940 +5F60 +4940 +55C0 +6260 +ENDCHAR +STARTCHAR U_5118 +ENCODING 20760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +3FE0 +4240 +4FC0 +C200 +5FE0 +4AA0 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_5119 +ENCODING 20761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +67C0 +5540 +5FE0 +C480 +7780 +57C0 +5440 +57C0 +5000 +6FE0 +ENDCHAR +STARTCHAR U_511A +ENCODING 20762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +5FC0 +D540 +5FE0 +5420 +4F80 +5480 +4300 +5C00 +ENDCHAR +STARTCHAR U_511B +ENCODING 20763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +3540 +4FE0 +C540 +7FE0 +4840 +5FE0 +6B40 +45E0 +5840 +ENDCHAR +STARTCHAR U_511C +ENCODING 20764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +2540 +6FE0 +AAA0 +3FE0 +2000 +3FE0 +2100 +2700 +ENDCHAR +STARTCHAR U_511D +ENCODING 20765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +36C0 +2D80 +4480 +CB40 +5FE0 +5220 +4FC0 +4680 +4A40 +5220 +ENDCHAR +STARTCHAR U_511E +ENCODING 20766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +2A40 +5FE0 +D220 +5B60 +56A0 +5B60 +5B60 +56A0 +5B60 +ENDCHAR +STARTCHAR U_511F +ENCODING 20767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +3FE0 +34A0 +2480 +6FC0 +A840 +2F40 +2BC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_5120 +ENCODING 20768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3500 +4A80 +5FC0 +D540 +5FC0 +56C0 +5B40 +56C0 +5240 +5B20 +ENDCHAR +STARTCHAR U_5121 +ENCODING 20769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5240 +5FC0 +5240 +DFC0 +4000 +7FE0 +6AA0 +7FE0 +6AA0 +7FE0 +ENDCHAR +STARTCHAR U_5122 +ENCODING 20770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +5FE0 +5220 +D7E0 +5540 +57C0 +5540 +57C0 +6AA0 +53C0 +ENDCHAR +STARTCHAR U_5123 +ENCODING 20771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +3280 +57C0 +D280 +5FE0 +5540 +57C0 +5540 +57C0 +6C60 +ENDCHAR +STARTCHAR U_5124 +ENCODING 20772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1440 +27C0 +2440 +6FE0 +A280 +3FE0 +2540 +3BA0 +2540 +3B20 +ENDCHAR +STARTCHAR U_5125 +ENCODING 20773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +2FE0 +6AA0 +AFE0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_5126 +ENCODING 20774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +5540 +DFC0 +54A0 +56C0 +54A0 +56E0 +5540 +5AA0 +ENDCHAR +STARTCHAR U_5127 +ENCODING 20775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1EE0 +2440 +2EE0 +6AA0 +A7C0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_5128 +ENCODING 20776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2880 +2EE0 +68C0 +B540 +2FC0 +2840 +2FC0 +2840 +2FC0 +3860 +ENDCHAR +STARTCHAR U_5129 +ENCODING 20777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +55E0 +5D20 +D5E0 +5D00 +57E0 +5D60 +4AA0 +5520 +62C0 +ENDCHAR +STARTCHAR U_512A +ENCODING 20778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +27C0 +2440 +6FE0 +B220 +2D40 +37A0 +2480 +2300 +3CE0 +ENDCHAR +STARTCHAR U_512B +ENCODING 20779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4480 +DFE0 +5020 +4FC0 +4200 +4D40 +5380 +4540 +4B20 +ENDCHAR +STARTCHAR U_512C +ENCODING 20780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +3E20 +4BE0 +DE20 +4BE0 +7E20 +57E0 +5D40 +5540 +5D40 +5660 +ENDCHAR +STARTCHAR U_512D +ENCODING 20781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +7F20 +55E0 +4920 +FF20 +49E0 +5D20 +49E0 +5C80 +69A0 +5AE0 +ENDCHAR +STARTCHAR U_512E +ENCODING 20782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2A40 +2FE0 +6940 +ABE0 +2D40 +2900 +35E0 +2500 +2FE0 +ENDCHAR +STARTCHAR U_512F +ENCODING 20783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1FE0 +2100 +2FE0 +6280 +AFC0 +3920 +2900 +2FE0 +2520 +2AE0 +ENDCHAR +STARTCHAR U_5130 +ENCODING 20784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +5480 +4A00 +DF80 +4480 +47C0 +4840 +5FE0 +6AA0 +5560 +ENDCHAR +STARTCHAR U_5131 +ENCODING 20785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +3E80 +2BE0 +3E20 +6AE0 +AE80 +2AE0 +2E80 +2AE0 +2AA0 +36E0 +ENDCHAR +STARTCHAR U_5132 +ENCODING 20786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +3DE0 +40A0 +5DE0 +C080 +5DE0 +4320 +5DE0 +5520 +5DE0 +5520 +ENDCHAR +STARTCHAR U_5133 +ENCODING 20787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +5FC0 +4AA0 +CFE0 +4480 +4FC0 +5940 +4FC0 +4520 +59E0 +ENDCHAR +STARTCHAR U_5134 +ENCODING 20788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +DDC0 +4500 +5FC0 +4500 +5FE0 +4D40 +5480 +4660 +ENDCHAR +STARTCHAR U_5135 +ENCODING 20789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2640 +5980 +5240 +DFE0 +5AA0 +5FE0 +5100 +5FE0 +4540 +4AA0 +ENDCHAR +STARTCHAR U_5136 +ENCODING 20790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +4900 +DFE0 +6900 +4FE0 +4900 +5FE0 +54A0 +57A0 +5020 +ENDCHAR +STARTCHAR U_5137 +ENCODING 20791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2000 +2FE0 +2AA0 +6FE0 +AAA0 +2FE0 +2C80 +37E0 +2480 +26E0 +ENDCHAR +STARTCHAR U_5138 +ENCODING 20792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +2940 +75E0 +A940 +37E0 +3D40 +21E0 +2B40 +35E0 +ENDCHAR +STARTCHAR U_5139 +ENCODING 20793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +3540 +2FE0 +6A40 +B7E0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_513A +ENCODING 20794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7F40 +55E0 +4940 +FFE0 +4940 +7FE0 +4940 +7FE0 +5540 +63E0 +ENDCHAR +STARTCHAR U_513B +ENCODING 20795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +7FE0 +68A0 +5FC0 +D540 +5FC0 +4200 +4FC0 +4200 +5FE0 +52A0 +ENDCHAR +STARTCHAR U_513C +ENCODING 20796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5FE0 +5280 +DE80 +53E0 +5EA0 +53A0 +5E40 +52A0 +6320 +ENDCHAR +STARTCHAR U_513D +ENCODING 20797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +5240 +5FC0 +7240 +DFE0 +6AA0 +5FE0 +4440 +5FA0 +4A80 +7660 +ENDCHAR +STARTCHAR U_513E +ENCODING 20798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4A40 +DFE0 +5540 +4FC0 +4480 +5FE0 +4500 +4D80 +5660 +ENDCHAR +STARTCHAR U_513F +ENCODING 20799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_5140 +ENCODING 20800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +1200 +1200 +1200 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5141 +ENCODING 20801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1000 +2100 +7F80 +1280 +1200 +1200 +1200 +2240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5142 +ENCODING 20802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +4400 +4400 +FFE0 +0A00 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5143 +ENCODING 20803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +7F80 +0000 +0000 +FFC0 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5144 +ENCODING 20804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +4100 +4100 +7F00 +5500 +1400 +1400 +2440 +4440 +83C0 +ENDCHAR +STARTCHAR U_5145 +ENCODING 20805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +0800 +1100 +7F80 +1280 +1200 +1200 +2240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5146 +ENCODING 20806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +9240 +5280 +5300 +1200 +3380 +5240 +9200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5147 +ENCODING 20807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +4A80 +4480 +4A80 +5080 +7F80 +1200 +1200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_5148 +ENCODING 20808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2400 +3FC0 +4400 +8400 +FFE0 +1200 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5149 +ENCODING 20809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +2480 +0400 +FFE0 +1200 +1200 +1220 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_514A +ENCODING 20810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1100 +2480 +4840 +9120 +3F80 +0840 +0A00 +1200 +2220 +43E0 +ENDCHAR +STARTCHAR U_514B +ENCODING 20811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_514C +ENCODING 20812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4080 +BF40 +2100 +2100 +3F00 +0A00 +1220 +2220 +41E0 +ENDCHAR +STARTCHAR U_514D +ENCODING 20813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3E00 +4400 +FF80 +4880 +4880 +7F80 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_514E +ENCODING 20814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +0400 +3F80 +2480 +2480 +3FC0 +0A00 +1280 +2220 +C1E0 +ENDCHAR +STARTCHAR U_514F +ENCODING 20815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +43C0 +4200 +4200 +7FE0 +4500 +4500 +4900 +9120 +A0E0 +ENDCHAR +STARTCHAR U_5150 +ENCODING 20816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +2440 +27C0 +2000 +0900 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_5151 +ENCODING 20817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +1200 +3F00 +2100 +2100 +2100 +3F00 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5152 +ENCODING 20818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +6780 +4080 +7380 +4080 +7F80 +5280 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5153 +ENCODING 20819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +A280 +A280 +FFE0 +5080 +5180 +5280 +5AA0 +94A0 +8860 +ENDCHAR +STARTCHAR U_5154 +ENCODING 20820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A440 +3FC0 +0400 +0A80 +0AA0 +1220 +61E0 +ENDCHAR +STARTCHAR U_5155 +ENCODING 20821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +9480 +9480 +9C80 +8080 +FF80 +9280 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5156 +ENCODING 20822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +2100 +4880 +9240 +2100 +3E80 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5157 +ENCODING 20823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +2100 +4080 +BF40 +2100 +3F00 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_5158 +ENCODING 20824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FA00 +0280 +FA40 +57C0 +5000 +57C0 +5440 +57C0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5159 +ENCODING 20825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +1080 +7FE0 +4480 +4480 +7C80 +2880 +28A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_515A +ENCODING 20826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4900 +2A00 +FFC0 +8040 +BF40 +2100 +3F00 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_515B +ENCODING 20827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7F80 +1080 +7C80 +47E0 +4480 +7C80 +2880 +28A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_515C +ENCODING 20828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2800 +DEC0 +9240 +9E40 +9240 +FEC0 +8040 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_515D +ENCODING 20829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FD40 +1220 +7C20 +47C0 +4540 +7D40 +2A40 +2CC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_515E +ENCODING 20830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FB00 +2100 +FFC0 +8900 +8FC0 +F900 +5120 +50C0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_515F +ENCODING 20831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A280 +A280 +FBE0 +2480 +2480 +FBE0 +5280 +5680 +9AA0 +A4A0 +08E0 +ENDCHAR +STARTCHAR U_5160 +ENCODING 20832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +EEA0 +2AC0 +2E80 +6A80 +AEA0 +2060 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5161 +ENCODING 20833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +2100 +FBE0 +8A20 +8BE0 +FA20 +53E0 +5000 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5162 +ENCODING 20834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +8A20 +FBE0 +5080 +5580 +5AA0 +A2A0 +8C60 +ENDCHAR +STARTCHAR U_5163 +ENCODING 20835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC00 +27E0 +F4A0 +97E0 +94A0 +F7E0 +5480 +5BE0 +9020 +0FE0 +ENDCHAR +STARTCHAR U_5164 +ENCODING 20836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7E0 +AD40 +67E0 +FC80 +57E0 +56A0 +57E0 +5540 +5A20 +8FE0 +ENDCHAR +STARTCHAR U_5165 +ENCODING 20837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +0400 +0400 +0400 +0A00 +0A00 +1100 +1100 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_5166 +ENCODING 20838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8200 +8200 +8200 +8500 +8500 +8880 +9040 +A020 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5167 +ENCODING 20839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +0800 +FF80 +8880 +8880 +8880 +9480 +A280 +C280 +8080 +8180 +ENDCHAR +STARTCHAR U_5168 +ENCODING 20840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0400 +0400 +1F00 +0400 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5169 +ENCODING 20841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0800 +FFC0 +8840 +CC40 +AA40 +AA40 +DD40 +8840 +8840 +88C0 +ENDCHAR +STARTCHAR U_516A +ENCODING 20842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0000 +7940 +4940 +7A80 +4A80 +7940 +4940 +ENDCHAR +STARTCHAR U_516B +ENCODING 20843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0200 +1200 +1200 +1200 +1100 +1100 +2080 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_516C +ENCODING 20844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1100 +1080 +2080 +2440 +4420 +8800 +0900 +1080 +3FC0 +1040 +ENDCHAR +STARTCHAR U_516D +ENCODING 20845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +0000 +FFE0 +0000 +0000 +1100 +1080 +2040 +4020 +8020 +ENDCHAR +STARTCHAR U_516E +ENCODING 20846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2080 +5F40 +8820 +0800 +1F80 +0080 +0080 +0080 +0700 +ENDCHAR +STARTCHAR U_516F +ENCODING 20847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4040 +2080 +1100 +1200 +FFC0 +0840 +0840 +0840 +0840 +0980 +0800 +ENDCHAR +STARTCHAR U_5170 +ENCODING 20848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0000 +0000 +0000 +3F80 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_5171 +ENCODING 20849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +1100 +1100 +FFE0 +0000 +1100 +2080 +4040 +ENDCHAR +STARTCHAR U_5172 +ENCODING 20850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F00 +0400 +0400 +FFC0 +0000 +1200 +2100 +4080 +8060 +ENDCHAR +STARTCHAR U_5173 +ENCODING 20851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0400 +0400 +FFC0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5174 +ENCODING 20852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +4440 +2480 +2080 +0100 +FFE0 +0000 +1100 +1080 +2040 +4040 +ENDCHAR +STARTCHAR U_5175 +ENCODING 20853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +3FE0 +2100 +2100 +2100 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5176 +ENCODING 20854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1F00 +1100 +1F00 +1100 +FFE0 +1100 +2080 +C040 +ENDCHAR +STARTCHAR U_5177 +ENCODING 20855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5178 +ENCODING 20856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A00 +3FC0 +2A40 +3FC0 +2A40 +2A40 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5179 +ENCODING 20857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1200 +FFE0 +2100 +2100 +4A40 +FBC0 +2100 +2100 +4A40 +FBE0 +ENDCHAR +STARTCHAR U_517A +ENCODING 20858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1100 +20C0 +DFA0 +0880 +3280 +C100 +7A40 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_517B +ENCODING 20859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +7FC0 +0800 +FFE0 +1100 +3180 +D160 +1100 +2100 +ENDCHAR +STARTCHAR U_517C +ENCODING 20860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +1200 +7F80 +1280 +FFE0 +1280 +7F80 +3300 +5280 +9260 +ENDCHAR +STARTCHAR U_517D +ENCODING 20861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +4440 +7FC0 +4440 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_517E +ENCODING 20862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +2480 +3F80 +2480 +3F80 +1100 +7FC0 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_517F +ENCODING 20863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FC0 +1100 +7BC0 +1140 +7A40 +1F60 +0000 +FFE0 +0900 +3F80 +ENDCHAR +STARTCHAR U_5180 +ENCODING 20864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +0A20 +7FE0 +2480 +3F80 +2480 +7FC0 +0900 +FFE0 +0900 +70E0 +ENDCHAR +STARTCHAR U_5181 +ENCODING 20865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +5420 +27E0 +FD40 +A7E0 +FD40 +A7E0 +FDA0 +2540 +F920 +29A0 +ENDCHAR +STARTCHAR U_5182 +ENCODING 20866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_5183 +ENCODING 20867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8080 +8080 +BE80 +8080 +8080 +BE80 +8080 +8080 +8380 +ENDCHAR +STARTCHAR U_5184 +ENCODING 20868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2080 +2080 +FFE0 +2080 +2080 +FFE0 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_5185 +ENCODING 20869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +8840 +8840 +8C40 +9240 +A140 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_5186 +ENCODING 20870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8080 +8080 +8080 +8080 +8380 +ENDCHAR +STARTCHAR U_5187 +ENCODING 20871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +1000 +1F80 +3080 +5080 +1080 +1080 +1080 +1180 +ENDCHAR +STARTCHAR U_5188 +ENCODING 20872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8140 +9140 +8A40 +8440 +8A40 +9140 +A140 +8040 +81C0 +ENDCHAR +STARTCHAR U_5189 +ENCODING 20873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +7FC0 +4440 +4440 +FFE0 +4040 +4040 +41C0 +ENDCHAR +STARTCHAR U_518A +ENCODING 20874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +4A40 +FFE0 +4A40 +4A40 +4A40 +4A40 +4A40 +40C0 +ENDCHAR +STARTCHAR U_518B +ENCODING 20875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +FFC0 +8040 +8040 +9E40 +9240 +9240 +9E40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_518C +ENCODING 20876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +4A40 +FFE0 +4A40 +4A40 +4A40 +4A40 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_518D +ENCODING 20877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2480 +3F80 +2480 +2480 +FFE0 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_518E +ENCODING 20878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3E80 +2280 +2280 +FFE0 +8020 +8020 +8020 +8020 +80E0 +ENDCHAR +STARTCHAR U_518F +ENCODING 20879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9240 +A140 +DEC0 +9240 +9240 +9240 +9E40 +8040 +80C0 +ENDCHAR +STARTCHAR U_5190 +ENCODING 20880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8080 +BE80 +8080 +7F00 +4100 +7F00 +4100 +7F00 +4100 +4300 +ENDCHAR +STARTCHAR U_5191 +ENCODING 20881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +FF80 +8880 +FF80 +4100 +5D00 +4100 +5D00 +4300 +ENDCHAR +STARTCHAR U_5192 +ENCODING 20882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8020 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_5193 +ENCODING 20883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +7FC0 +1100 +FFE0 +2480 +3F80 +2480 +FFE0 +2080 +ENDCHAR +STARTCHAR U_5194 +ENCODING 20884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +4040 +5F40 +0000 +F7C0 +9100 +9FE0 +F100 +0300 +ENDCHAR +STARTCHAR U_5195 +ENCODING 20885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +5F40 +4040 +5F40 +2200 +7F80 +A480 +3FA0 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_5196 +ENCODING 20886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_5197 +ENCODING 20887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4020 +9F40 +1100 +1100 +1100 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_5198 +ENCODING 20888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +7FC0 +8880 +0800 +0C00 +0C00 +1400 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_5199 +ENCODING 20889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +9040 +1F80 +1000 +1FC0 +0040 +7F40 +0040 +0280 +0100 +ENDCHAR +STARTCHAR U_519A +ENCODING 20890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4020 +8400 +0400 +4440 +4440 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_519B +ENCODING 20891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +0800 +7F80 +1000 +2400 +7F80 +0400 +FFC0 +0400 +0400 +ENDCHAR +STARTCHAR U_519C +ENCODING 20892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4420 +8C40 +1200 +1240 +3280 +5100 +9480 +1860 +1020 +ENDCHAR +STARTCHAR U_519D +ENCODING 20893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4040 +9F00 +1100 +1F00 +1100 +1F00 +1100 +1100 +FFE0 +ENDCHAR +STARTCHAR U_519E +ENCODING 20894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +0400 +2480 +1500 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_519F +ENCODING 20895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +8820 +3F80 +2080 +3F80 +2080 +3F80 +4000 +7F80 +4020 +3FE0 +ENDCHAR +STARTCHAR U_51A0 +ENCODING 20896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +80A0 +7880 +03E0 +FC80 +5280 +5080 +51A0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_51A1 +ENCODING 20897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +9F80 +0000 +7FE0 +0880 +1500 +6A00 +1700 +6AE0 +1600 +ENDCHAR +STARTCHAR U_51A2 +ENCODING 20898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +7F00 +1000 +2C80 +D500 +2E00 +D500 +2480 +C440 +1800 +ENDCHAR +STARTCHAR U_51A3 +ENCODING 20899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +8020 +7F80 +2400 +3DC0 +2540 +3C80 +2480 +7D40 +0620 +ENDCHAR +STARTCHAR U_51A4 +ENCODING 20900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8820 +1F00 +2200 +7FC0 +A240 +3FC0 +0A00 +0AA0 +3220 +C1E0 +ENDCHAR +STARTCHAR U_51A5 +ENCODING 20901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_51A6 +ENCODING 20902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +8020 +3900 +01C0 +FD00 +2BC0 +2A40 +2980 +2920 +4AA0 +87E0 +ENDCHAR +STARTCHAR U_51A7 +ENCODING 20903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FE0 +4040 +9100 +1100 +7BC0 +1100 +3B80 +5540 +9120 +1100 +ENDCHAR +STARTCHAR U_51A8 +ENCODING 20904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +BFC0 +0000 +1F80 +1080 +3FC0 +2240 +3FC0 +2240 +3FC0 +ENDCHAR +STARTCHAR U_51A9 +ENCODING 20905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +3B80 +2080 +3B80 +2080 +3FE0 +4120 +94A0 +2A20 +4A60 +ENDCHAR +STARTCHAR U_51AA +ENCODING 20906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A20 +BFA0 +2080 +3F80 +2080 +FFE0 +1500 +7FC0 +A4A0 +2580 +ENDCHAR +STARTCHAR U_51AB +ENCODING 20907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +80 +40 +20 +00 +10 +20 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR U_51AC +ENCODING 20908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +3100 +4A00 +0400 +1B00 +E4E0 +0200 +1800 +0400 +0200 +ENDCHAR +STARTCHAR U_51AD +ENCODING 20909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +1100 +2080 +CC60 +0300 +1900 +0400 +0200 +ENDCHAR +STARTCHAR U_51AE +ENCODING 20910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +8F80 +4200 +4200 +0200 +2200 +4200 +C200 +4200 +4200 +5FC0 +ENDCHAR +STARTCHAR U_51AF +ENCODING 20911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4080 +4480 +1480 +2480 +27E0 +C020 +5FA0 +4020 +4020 +00C0 +ENDCHAR +STARTCHAR U_51B0 +ENCODING 20912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0120 +2D40 +2580 +4580 +C940 +4940 +5120 +4100 +0700 +ENDCHAR +STARTCHAR U_51B1 +ENCODING 20913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +0200 +13C0 +2440 +2440 +4840 +CF80 +4080 +4080 +5FE0 +ENDCHAR +STARTCHAR U_51B2 +ENCODING 20914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0920 +2920 +2920 +CFE0 +4920 +4100 +4100 +0100 +ENDCHAR +STARTCHAR U_51B3 +ENCODING 20915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2FC0 +0240 +2240 +2240 +5FE0 +C200 +4500 +4880 +5060 +ENDCHAR +STARTCHAR U_51B4 +ENCODING 20916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +8FE0 +4080 +4480 +1480 +2FE0 +4180 +C280 +4480 +5880 +0100 +ENDCHAR +STARTCHAR U_51B5 +ENCODING 20917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4840 +4840 +0840 +2FC0 +2500 +C500 +4500 +4520 +4920 +51E0 +ENDCHAR +STARTCHAR U_51B6 +ENCODING 20918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4200 +0440 +2FE0 +2020 +47C0 +C440 +4440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_51B7 +ENCODING 20919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4200 +0500 +2880 +3260 +4100 +4FC0 +8080 +8700 +8100 +0080 +ENDCHAR +STARTCHAR U_51B8 +ENCODING 20920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4920 +2520 +2540 +0FE0 +1100 +2100 +DFE0 +4100 +4100 +0100 +ENDCHAR +STARTCHAR U_51B9 +ENCODING 20921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4240 +4FE0 +0200 +23C0 +2540 +4540 +C880 +4880 +5340 +2420 +ENDCHAR +STARTCHAR U_51BA +ENCODING 20922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +2FC0 +0900 +0900 +1FE0 +2900 +C880 +4AA0 +4C60 +4820 +ENDCHAR +STARTCHAR U_51BB +ENCODING 20923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +2400 +2500 +0900 +5FE0 +C100 +4540 +4920 +5120 +0300 +ENDCHAR +STARTCHAR U_51BC +ENCODING 20924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4500 +27E0 +2900 +0100 +2FE0 +C280 +4280 +42A0 +44A0 +1860 +ENDCHAR +STARTCHAR U_51BD +ENCODING 20925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9F20 +4420 +46A0 +0AA0 +2AA0 +2AA0 +56A0 +C2A0 +4420 +4820 +50E0 +ENDCHAR +STARTCHAR U_51BE +ENCODING 20926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4500 +4880 +1040 +0FA0 +2000 +2FC0 +4840 +C840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_51BF +ENCODING 20927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +47C0 +2140 +2FE0 +0140 +17C0 +2100 +C7C0 +4100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_51C0 +ENCODING 20928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4F80 +4900 +1FC0 +2240 +3FE0 +2240 +CFC0 +4200 +4200 +4E00 +ENDCHAR +STARTCHAR U_51C1 +ENCODING 20929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FE0 +4200 +4FC0 +1A40 +2A40 +2FC0 +C200 +4700 +4A80 +3260 +ENDCHAR +STARTCHAR U_51C2 +ENCODING 20930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +47C0 +2880 +2FE0 +1920 +2920 +2FE0 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_51C3 +ENCODING 20931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4200 +4500 +0880 +3760 +2200 +4F80 +C200 +4A80 +5240 +2620 +ENDCHAR +STARTCHAR U_51C4 +ENCODING 20932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FE0 +4240 +0FE0 +0240 +2FC0 +2240 +DFE0 +4480 +4340 +5C20 +ENDCHAR +STARTCHAR U_51C5 +ENCODING 20933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5220 +5220 +1FE0 +1220 +37A0 +54A0 +D4A0 +57A0 +5020 +5FE0 +ENDCHAR +STARTCHAR U_51C6 +ENCODING 20934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +8900 +4FE0 +5900 +0900 +2FC0 +2900 +CFC0 +4900 +4900 +4FE0 +ENDCHAR +STARTCHAR U_51C7 +ENCODING 20935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +4940 +5D40 +0A20 +1AA0 +2C80 +6900 +C900 +4940 +4BE0 +4A20 +ENDCHAR +STARTCHAR U_51C8 +ENCODING 20936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5220 +4940 +0FC0 +2140 +3FE0 +C140 +4FC0 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_51C9 +ENCODING 20937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4000 +07C0 +2440 +2440 +27C0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_51CA +ENCODING 20938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4100 +07C0 +0100 +2FE0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_51CB +ENCODING 20939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4920 +4FE0 +0920 +2FE0 +2820 +CBA0 +4AA0 +4BA0 +5020 +20E0 +ENDCHAR +STARTCHAR U_51CC +ENCODING 20940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +4200 +3FE0 +2880 +5460 +C780 +4C80 +5300 +4480 +1860 +ENDCHAR +STARTCHAR U_51CD +ENCODING 20941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4100 +0FE0 +2920 +2FE0 +4920 +CFE0 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_51CE +ENCODING 20942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0700 +8880 +5040 +4FA0 +2200 +2200 +DFE0 +5240 +4A80 +4200 +5FE0 +ENDCHAR +STARTCHAR U_51CF +ENCODING 20943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +80A0 +5FE0 +5080 +1780 +30A0 +57A0 +D5C0 +56A0 +5160 +6220 +ENDCHAR +STARTCHAR U_51D0 +ENCODING 20944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +4FE0 +2AA0 +2AA0 +2FE0 +4100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_51D1 +ENCODING 20945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4100 +4FC0 +0200 +2FE0 +2840 +37A0 +C100 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_51D2 +ENCODING 20946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4540 +2540 +27C0 +1000 +2FE0 +C440 +47C0 +4280 +4100 +0FE0 +ENDCHAR +STARTCHAR U_51D3 +ENCODING 20947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +4280 +2FE0 +2AA0 +0FE0 +1100 +2FE0 +C100 +4380 +4540 +1920 +ENDCHAR +STARTCHAR U_51D4 +ENCODING 20948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4280 +2540 +2920 +07C0 +2440 +27C0 +C440 +4BE0 +4A20 +53E0 +ENDCHAR +STARTCHAR U_51D5 +ENCODING 20949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +4820 +27C0 +2440 +17C0 +2440 +C7C0 +4100 +5FE0 +4280 +0C60 +ENDCHAR +STARTCHAR U_51D6 +ENCODING 20950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2BE0 +0880 +5BE0 +C880 +4BE0 +4880 +0BE0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_51D7 +ENCODING 20951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +2FE0 +0900 +2FE0 +2900 +DFC0 +4900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_51D8 +ENCODING 20952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AE0 +5F80 +4A80 +0EE0 +2AA0 +2EA0 +4AA0 +DFA0 +4AA0 +5120 +6220 +ENDCHAR +STARTCHAR U_51D9 +ENCODING 20953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +2FE0 +2100 +0FE0 +2100 +5FE0 +C440 +4FE0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_51DA +ENCODING 20954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +9FE0 +4480 +4EC0 +15A0 +2FC0 +2000 +DFE0 +4580 +4940 +3320 +ENDCHAR +STARTCHAR U_51DB +ENCODING 20955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +5540 +1740 +1040 +3FC0 +C000 +7FE0 +4A80 +5240 +6620 +ENDCHAR +STARTCHAR U_51DC +ENCODING 20956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +5540 +5740 +1040 +3FC0 +4200 +DFE0 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_51DD +ENCODING 20957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +89E0 +4CA0 +4840 +0E40 +29E0 +2E40 +5440 +DF60 +4540 +4B40 +52E0 +ENDCHAR +STARTCHAR U_51DE +ENCODING 20958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEE0 +64A0 +24A0 +6EA0 +AAE0 +AE80 +A480 +A4A0 +BEE0 +4A40 +9120 +ENDCHAR +STARTCHAR U_51DF +ENCODING 20959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +9FE0 +4100 +4FE0 +1AA0 +2FE0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_51E0 +ENCODING 20960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +1100 +1100 +1100 +1100 +1100 +2120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51E1 +ENCODING 20961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +1100 +1900 +1500 +1500 +1100 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_51E2 +ENCODING 20962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0800 +1F00 +1100 +1100 +1100 +1100 +1120 +2120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51E3 +ENCODING 20963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +1F00 +1100 +1100 +1100 +1100 +1120 +2120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51E4 +ENCODING 20964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4280 +5280 +4A80 +4480 +44A0 +4AA0 +5260 +8020 +ENDCHAR +STARTCHAR U_51E5 +ENCODING 20965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +4F00 +4900 +4900 +4900 +4920 +5120 +A0E0 +ENDCHAR +STARTCHAR U_51E6 +ENCODING 20966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2380 +3A80 +4A80 +AA80 +2AA0 +12A0 +14A0 +2860 +4600 +81E0 +ENDCHAR +STARTCHAR U_51E7 +ENCODING 20967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +4440 +5F40 +5540 +5540 +5540 +5540 +5740 +4460 +8420 +ENDCHAR +STARTCHAR U_51E8 +ENCODING 20968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4080 +7F80 +4880 +4880 +5280 +5EA0 +4060 +8020 +ENDCHAR +STARTCHAR U_51E9 +ENCODING 20969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +4440 +4440 +5F40 +4440 +4E40 +5540 +6540 +4460 +8020 +ENDCHAR +STARTCHAR U_51EA +ENCODING 20970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +4480 +4480 +5480 +5680 +5480 +5480 +54A0 +BF60 +8020 +ENDCHAR +STARTCHAR U_51EB +ENCODING 20971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +5100 +4B00 +4000 +7FC0 +0040 +3E40 +22A0 +4220 +81E0 +ENDCHAR +STARTCHAR U_51EC +ENCODING 20972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4080 +5E80 +5280 +5E80 +5280 +5EA0 +4060 +8020 +ENDCHAR +STARTCHAR U_51ED +ENCODING 20973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3F00 +6200 +BFE0 +2200 +2FC0 +0000 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_51EE +ENCODING 20974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +5E80 +4880 +5E80 +5280 +5E80 +5280 +5EA0 +40A0 +8060 +ENDCHAR +STARTCHAR U_51EF +ENCODING 20975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABC0 +AA40 +FA40 +0240 +FA40 +0A40 +FA40 +8240 +9240 +A440 +C860 +ENDCHAR +STARTCHAR U_51F0 +ENCODING 20976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4880 +5E80 +5280 +5E80 +5280 +7F80 +4480 +5FA0 +8460 +BFA0 +ENDCHAR +STARTCHAR U_51F1 +ENCODING 20977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +FA40 +0240 +FA40 +0240 +FA40 +8A40 +FA40 +5440 +F860 +ENDCHAR +STARTCHAR U_51F2 +ENCODING 20978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +7F40 +5440 +7F40 +5540 +7FC0 +5540 +7F40 +9640 +9560 +ENDCHAR +STARTCHAR U_51F3 +ENCODING 20979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +5140 +2E80 +C060 +1F00 +1100 +FFE0 +0000 +1F20 +1120 +E0E0 +ENDCHAR +STARTCHAR U_51F4 +ENCODING 20980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4900 +2FC0 +2900 +CFE0 +5520 +5560 +1F00 +1100 +1120 +E1E0 +ENDCHAR +STARTCHAR U_51F5 +ENCODING 20981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4020 +4020 +4020 +4020 +4020 +4020 +4020 +4020 +FFE0 +4020 +ENDCHAR +STARTCHAR U_51F6 +ENCODING 20982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +9120 +8A20 +8420 +8620 +8A20 +9120 +A120 +8020 +FFE0 +8020 +ENDCHAR +STARTCHAR U_51F7 +ENCODING 20983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +8420 +8420 +9F20 +8420 +8420 +BFA0 +8020 +8020 +FFE0 +ENDCHAR +STARTCHAR U_51F8 +ENCODING 20984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1E00 +1200 +1200 +1200 +F3C0 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_51F9 +ENCODING 20985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +F3C0 +9240 +9240 +9240 +9E40 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_51FA +ENCODING 20986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +4440 +7FC0 +0400 +8420 +8420 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_51FB +ENCODING 20987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_51FC +ENCODING 20988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +8420 +B4A0 +9520 +9620 +A520 +C4A0 +9420 +8820 +FFE0 +8020 +ENDCHAR +STARTCHAR U_51FD +ENCODING 20989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0200 +2480 +9520 +8E20 +9520 +A4A0 +CCA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_51FE +ENCODING 20990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0200 +3BC0 +AB60 +AAA0 +BB60 +8260 +8A20 +8420 +FFE0 +ENDCHAR +STARTCHAR U_51FF +ENCODING 20991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +1100 +4A40 +5F40 +4440 +5F40 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5200 +ENCODING 20992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +1080 +1080 +1080 +1080 +1080 +2080 +2080 +4080 +8300 +ENDCHAR +STARTCHAR U_5201 +ENCODING 20993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7FE0 +0040 +0040 +0240 +0C40 +3040 +C040 +0040 +0040 +0180 +ENDCHAR +STARTCHAR U_5202 +ENCODING 20994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 7 -1 +BITMAP +10 +10 +90 +90 +90 +90 +90 +10 +10 +10 +70 +ENDCHAR +STARTCHAR U_5203 +ENCODING 20995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +0880 +0880 +4880 +4880 +8880 +1080 +2080 +4080 +8700 +ENDCHAR +STARTCHAR U_5204 +ENCODING 20996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +1080 +9080 +5080 +3080 +1080 +1880 +1680 +21C0 +4280 +8100 +ENDCHAR +STARTCHAR U_5205 +ENCODING 20997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7F00 +1100 +1100 +5140 +9120 +9120 +1120 +2100 +4500 +8200 +ENDCHAR +STARTCHAR U_5206 +ENCODING 20998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2080 +2080 +4040 +BFA0 +0880 +0880 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_5207 +ENCODING 20999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +3920 +E120 +2120 +2920 +3220 +2220 +0420 +08C0 +ENDCHAR +STARTCHAR U_5208 +ENCODING 21000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +8920 +4920 +2920 +1120 +1120 +2920 +2520 +4420 +8020 +00E0 +ENDCHAR +STARTCHAR U_5209 +ENCODING 21001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3EA0 +40A0 +80A0 +3CA0 +08A0 +10A0 +20A0 +4220 +4220 +3EE0 +ENDCHAR +STARTCHAR U_520A +ENCODING 21002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +1120 +1120 +FF20 +1120 +1120 +1120 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U_520B +ENCODING 21003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +0C20 +7020 +1120 +1120 +FD20 +1120 +1120 +1020 +2020 +C0E0 +ENDCHAR +STARTCHAR U_520C +ENCODING 21004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +0820 +08A0 +FEA0 +08A0 +48A0 +28A0 +28A0 +0820 +2820 +10E0 +ENDCHAR +STARTCHAR U_520D +ENCODING 21005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1F00 +2200 +4400 +BF80 +0080 +0080 +3F80 +0080 +0080 +7F80 +ENDCHAR +STARTCHAR U_520E +ENCODING 21006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7E20 +AAA0 +2AA0 +2AA0 +4AA0 +92A0 +12A0 +2220 +4A20 +04E0 +ENDCHAR +STARTCHAR U_520F +ENCODING 21007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7C20 +80A0 +78A0 +00A0 +F8A0 +08A0 +08A0 +0A20 +0A20 +06E0 +ENDCHAR +STARTCHAR U_5210 +ENCODING 21008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +64A0 +54A0 +44A0 +FEA0 +44A0 +44A0 +4420 +5420 +88E0 +ENDCHAR +STARTCHAR U_5211 +ENCODING 21009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +2420 +24A0 +24A0 +FEA0 +24A0 +24A0 +24A0 +4420 +4420 +84E0 +ENDCHAR +STARTCHAR U_5212 +ENCODING 21010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2420 +20A0 +FEA0 +20A0 +24A0 +28A0 +10A0 +3220 +4A20 +86E0 +ENDCHAR +STARTCHAR U_5213 +ENCODING 21011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +00A0 +00A0 +FEA0 +28A0 +28A0 +28A0 +28A0 +4A20 +4C20 +88E0 +ENDCHAR +STARTCHAR U_5214 +ENCODING 21012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +F820 +2920 +2920 +2920 +FD20 +2120 +2120 +5020 +4820 +84E0 +ENDCHAR +STARTCHAR U_5215 +ENCODING 21013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0840 +0840 +1240 +E180 +0000 +FBE0 +4920 +4920 +4A20 +B4C0 +ENDCHAR +STARTCHAR U_5216 +ENCODING 21014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E20 +22A0 +22A0 +3EA0 +22A0 +22A0 +3EA0 +22A0 +2220 +4A20 +84E0 +ENDCHAR +STARTCHAR U_5217 +ENCODING 21015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +1020 +1120 +3D20 +2520 +6520 +9920 +0920 +1020 +2020 +C0E0 +ENDCHAR +STARTCHAR U_5218 +ENCODING 21016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FEA0 +04A0 +24A0 +18A0 +08A0 +14A0 +2220 +42A0 +8040 +ENDCHAR +STARTCHAR U_5219 +ENCODING 21017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7C40 +4540 +4540 +5540 +5540 +5540 +5540 +1140 +2840 +4440 +81C0 +ENDCHAR +STARTCHAR U_521A +ENCODING 21018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +82A0 +8AA0 +CAA0 +B2A0 +92A0 +AAA0 +CAA0 +8220 +8A20 +84E0 +ENDCHAR +STARTCHAR U_521B +ENCODING 21019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1820 +24A0 +42A0 +BCA0 +24A0 +24A0 +38A0 +2220 +2220 +1E60 +ENDCHAR +STARTCHAR U_521C +ENCODING 21020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +FEA0 +2AA0 +2AA0 +FEA0 +A8A0 +FEA0 +2AA0 +2E20 +4820 +88E0 +ENDCHAR +STARTCHAR U_521D +ENCODING 21021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F920 +1120 +2120 +6920 +B120 +2920 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_521E +ENCODING 21022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +44A0 +44A0 +7CA0 +44A0 +44A0 +7CA0 +44A0 +4420 +5E20 +E0E0 +ENDCHAR +STARTCHAR U_521F +ENCODING 21023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +2220 +22A0 +22A0 +4CA0 +80A0 +7EA0 +42A0 +4220 +7E20 +42E0 +ENDCHAR +STARTCHAR U_5220 +ENCODING 21024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AAA0 +AAA0 +AAA0 +FFA0 +AAA0 +AAA0 +AAA0 +AA20 +AA20 +B6E0 +ENDCHAR +STARTCHAR U_5221 +ENCODING 21025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +8420 +84A0 +FCA0 +90A0 +FEA0 +90A0 +92A0 +8A20 +A620 +C2E0 +ENDCHAR +STARTCHAR U_5222 +ENCODING 21026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1820 +24A0 +54A0 +90A0 +00A0 +7CA0 +04A0 +2820 +1020 +08E0 +ENDCHAR +STARTCHAR U_5223 +ENCODING 21027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +20A0 +44A0 +FEA0 +02A0 +7CA0 +44A0 +4420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5224 +ENCODING 21028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +52A0 +54A0 +10A0 +7CA0 +10A0 +FEA0 +10A0 +1020 +2020 +C0E0 +ENDCHAR +STARTCHAR U_5225 +ENCODING 21029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +4520 +7D20 +2120 +3D20 +2520 +2520 +2420 +4420 +98E0 +ENDCHAR +STARTCHAR U_5226 +ENCODING 21030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1020 +7CA0 +10A0 +10A0 +FCA0 +10A0 +20A0 +4420 +FE20 +02E0 +ENDCHAR +STARTCHAR U_5227 +ENCODING 21031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7920 +1120 +1120 +FD20 +1120 +1120 +2120 +4920 +FD20 +0660 +ENDCHAR +STARTCHAR U_5228 +ENCODING 21032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3EA0 +42A0 +FAA0 +4AA0 +4AA0 +7AA0 +4CA0 +4020 +4220 +3EE0 +ENDCHAR +STARTCHAR U_5229 +ENCODING 21033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +70A0 +10A0 +FEA0 +10A0 +38A0 +34A0 +52A0 +9020 +1020 +10E0 +ENDCHAR +STARTCHAR U_522A +ENCODING 21034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +AAA0 +AAA0 +AAA0 +FFA0 +AAA0 +AAA0 +AAA0 +AA20 +A220 +8EE0 +ENDCHAR +STARTCHAR U_522B +ENCODING 21035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +44A0 +7CA0 +10A0 +FEA0 +12A0 +22A0 +2220 +4220 +8CE0 +ENDCHAR +STARTCHAR U_522C +ENCODING 21036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2820 +FD20 +2120 +2120 +FD20 +1120 +1D20 +3020 +CA20 +04E0 +ENDCHAR +STARTCHAR U_522D +ENCODING 21037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +08A0 +10A0 +28A0 +44A0 +FCA0 +10A0 +10A0 +1020 +1C20 +E0E0 +ENDCHAR +STARTCHAR U_522E +ENCODING 21038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +F020 +1120 +1120 +FD20 +1120 +7D20 +4520 +4420 +7C20 +44E0 +ENDCHAR +STARTCHAR U_522F +ENCODING 21039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +0020 +7CA0 +44A0 +44A0 +7CA0 +44A0 +7CA0 +0020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5230 +ENCODING 21040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +1020 +20A0 +44A0 +FEA0 +10A0 +7CA0 +10A0 +1020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5231 +ENCODING 21041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +5140 +5140 +FB40 +5560 +5140 +FD40 +5140 +5240 +5240 +94C0 +ENDCHAR +STARTCHAR U_5232 +ENCODING 21042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1120 +7D20 +1120 +1120 +FD20 +1120 +7D20 +1020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5233 +ENCODING 21043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +24A0 +42A0 +BDA0 +00A0 +FEA0 +20A0 +7C20 +04A0 +1840 +ENDCHAR +STARTCHAR U_5234 +ENCODING 21044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2820 +2EA0 +42A0 +4AA0 +94A0 +10A0 +FEA0 +3820 +5420 +92E0 +ENDCHAR +STARTCHAR U_5235 +ENCODING 21045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2420 +24A0 +3CA0 +24A0 +3CA0 +24A0 +26A0 +FCA0 +0420 +04E0 +ENDCHAR +STARTCHAR U_5236 +ENCODING 21046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +50A0 +7EA0 +90A0 +FEA0 +10A0 +7EA0 +52A0 +5220 +5620 +10E0 +ENDCHAR +STARTCHAR U_5237 +ENCODING 21047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +48A0 +48A0 +7EA0 +6AA0 +AAA0 +AAA0 +2E20 +08E0 +ENDCHAR +STARTCHAR U_5238 +ENCODING 21048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +7FC0 +0800 +FFE0 +2080 +5FC0 +8920 +0900 +1100 +2600 +ENDCHAR +STARTCHAR U_5239 +ENCODING 21049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6C20 +1020 +28A0 +54A0 +10A0 +FEA0 +10A0 +54A0 +5220 +9220 +30E0 +ENDCHAR +STARTCHAR U_523A +ENCODING 21050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +10A0 +7EA0 +52A0 +52A0 +56A0 +38A0 +5420 +9220 +1060 +ENDCHAR +STARTCHAR U_523B +ENCODING 21051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FEA0 +24A0 +48A0 +F4A0 +24A0 +48A0 +9820 +2420 +C4E0 +ENDCHAR +STARTCHAR U_523C +ENCODING 21052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +10A0 +7CA0 +12A0 +FEA0 +12A0 +2120 +2920 +4520 +9EA0 +6440 +ENDCHAR +STARTCHAR U_523D +ENCODING 21053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1820 +2420 +42A0 +B8A0 +00A0 +00A0 +FEA0 +20A0 +4820 +8C20 +F4E0 +ENDCHAR +STARTCHAR U_523E +ENCODING 21054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7C20 +10A0 +54A0 +54A0 +10A0 +FEA0 +10A0 +2820 +2420 +C2E0 +ENDCHAR +STARTCHAR U_523F +ENCODING 21055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +9220 +92A0 +FEA0 +20A0 +3CA0 +44A0 +C4A0 +2820 +10A0 +E040 +ENDCHAR +STARTCHAR U_5240 +ENCODING 21056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +9220 +FEA0 +02A0 +7CA0 +04A0 +7CA0 +40A0 +4020 +4C20 +70E0 +ENDCHAR +STARTCHAR U_5241 +ENCODING 21057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +44A0 +44A0 +96A0 +10A0 +FEA0 +10A0 +3820 +5420 +92E0 +ENDCHAR +STARTCHAR U_5242 +ENCODING 21058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1020 +FEA0 +44A0 +38A0 +C6A0 +24A0 +24A0 +2420 +4420 +84E0 +ENDCHAR +STARTCHAR U_5243 +ENCODING 21059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +28A0 +FEA0 +12A0 +FEA0 +90A0 +FEA0 +12A0 +3220 +5620 +90E0 +ENDCHAR +STARTCHAR U_5244 +ENCODING 21060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +54A0 +A8A0 +A8A0 +54A0 +00A0 +FEA0 +10A0 +1020 +1E20 +E0E0 +ENDCHAR +STARTCHAR U_5245 +ENCODING 21061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +0020 +7CA0 +44A0 +44A0 +7CA0 +00A0 +44A0 +2820 +1C20 +E0E0 +ENDCHAR +STARTCHAR U_5246 +ENCODING 21062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +1120 +FD20 +8520 +FD20 +8520 +FD20 +9120 +8820 +B420 +C4E0 +ENDCHAR +STARTCHAR U_5247 +ENCODING 21063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4520 +4520 +7D20 +4520 +7D20 +4520 +4520 +7C20 +2820 +C6E0 +ENDCHAR +STARTCHAR U_5248 +ENCODING 21064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7820 +4820 +7920 +0120 +FD20 +8520 +FD20 +8520 +FC20 +8420 +8CE0 +ENDCHAR +STARTCHAR U_5249 +ENCODING 21065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +54A0 +54A0 +54A0 +BAA0 +10A0 +10A0 +7EA0 +1020 +1020 +FEE0 +ENDCHAR +STARTCHAR U_524A +ENCODING 21066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +5420 +10A0 +7CA0 +44A0 +7CA0 +44A0 +7CA0 +4420 +4420 +4CE0 +ENDCHAR +STARTCHAR U_524B +ENCODING 21067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +FD40 +1140 +7D40 +4540 +4540 +7D40 +2840 +28C0 +4820 +87E0 +ENDCHAR +STARTCHAR U_524C +ENCODING 21068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +10A0 +FEA0 +92A0 +FEA0 +92A0 +18A0 +34A0 +5220 +90E0 +ENDCHAR +STARTCHAR U_524D +ENCODING 21069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +1200 +FFC0 +0000 +7A80 +4A80 +7A80 +4A80 +7A80 +4880 +5B80 +ENDCHAR +STARTCHAR U_524E +ENCODING 21070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6C20 +10A0 +28A0 +54A0 +14A0 +FEA0 +10A0 +38A0 +5420 +9220 +10E0 +ENDCHAR +STARTCHAR U_524F +ENCODING 21071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +24A0 +08A0 +FCA0 +2AA0 +2AA0 +FEA0 +28A0 +2920 +4AA0 +8A40 +ENDCHAR +STARTCHAR U_5250 +ENCODING 21072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +44A0 +7CA0 +10A0 +FEA0 +92A0 +9AA0 +A620 +C220 +86E0 +ENDCHAR +STARTCHAR U_5251 +ENCODING 21073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1820 +2420 +42A0 +BCA0 +00A0 +24A0 +94A0 +54A0 +4820 +1E20 +E060 +ENDCHAR +STARTCHAR U_5252 +ENCODING 21074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2820 +FEA0 +28A0 +FEA0 +00A0 +7CA0 +44A0 +7CA0 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5253 +ENCODING 21075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +11E0 +FEA0 +32A0 +5920 +92C0 +0000 +7FE0 +0420 +0820 +70C0 +ENDCHAR +STARTCHAR U_5254 +ENCODING 21076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +42A0 +7EA0 +42A0 +7EA0 +20A0 +7EA0 +AAA0 +5220 +2220 +CCE0 +ENDCHAR +STARTCHAR U_5255 +ENCODING 21077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2820 +EEA0 +28A0 +28A0 +EEA0 +28A0 +28A0 +EEA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_5256 +ENCODING 21078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +10A0 +FEA0 +44A0 +28A0 +FEA0 +00A0 +7CA0 +4420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5257 +ENCODING 21079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +2420 +FD20 +2920 +1520 +ED20 +2920 +FD20 +2920 +1420 +EC60 +ENDCHAR +STARTCHAR U_5258 +ENCODING 21080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +FE20 +44A0 +7CA0 +44A0 +7CA0 +44A0 +FEA0 +2820 +4420 +8460 +ENDCHAR +STARTCHAR U_5259 +ENCODING 21081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57C0 +F940 +5140 +5360 +5540 +FD40 +5140 +5140 +5240 +94C0 +ENDCHAR +STARTCHAR U_525A +ENCODING 21082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +54A0 +54A0 +FEA0 +12A0 +FFA0 +12A0 +FEA0 +1020 +30E0 +ENDCHAR +STARTCHAR U_525B +ENCODING 21083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +CAA0 +AAA0 +92A0 +FEA0 +92A0 +92A0 +D6A0 +FE20 +8220 +86E0 +ENDCHAR +STARTCHAR U_525C +ENCODING 21084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +0820 +FEA0 +82A0 +7EA0 +5AA0 +DAA0 +2EA0 +2820 +4A20 +8CE0 +ENDCHAR +STARTCHAR U_525D +ENCODING 21085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C20 +44A0 +78A0 +08A0 +FEA0 +92A0 +54A0 +38A0 +5420 +9220 +30E0 +ENDCHAR +STARTCHAR U_525E +ENCODING 21086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +28A0 +44A0 +FEA0 +04A0 +74A0 +54A0 +7420 +0420 +1CE0 +ENDCHAR +STARTCHAR U_525F +ENCODING 21087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +AAA0 +44A0 +AAA0 +91A0 +00A0 +EEA0 +AAA0 +44A0 +AA20 +91E0 +ENDCHAR +STARTCHAR U_5260 +ENCODING 21088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +1040 +FE40 +0040 +7D40 +4540 +7D40 +1140 +5840 +9440 +31C0 +ENDCHAR +STARTCHAR U_5261 +ENCODING 21089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5220 +5220 +94A0 +28A0 +C6A0 +10A0 +52A0 +94A0 +1020 +28A0 +C640 +ENDCHAR +STARTCHAR U_5262 +ENCODING 21090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2020 +72A0 +94A0 +28A0 +68A0 +BCA0 +2AA0 +CA20 +2820 +10E0 +ENDCHAR +STARTCHAR U_5263 +ENCODING 21091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +44A0 +BAA0 +10A0 +7CA0 +54A0 +7CA0 +1020 +2820 +C460 +ENDCHAR +STARTCHAR U_5264 +ENCODING 21092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +7E20 +2420 +18A0 +24A0 +42A0 +BFA0 +22A0 +3E20 +4220 +8260 +ENDCHAR +STARTCHAR U_5265 +ENCODING 21093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +0420 +7CA0 +04A0 +FEA0 +10A0 +54A0 +38A0 +5420 +9220 +30E0 +ENDCHAR +STARTCHAR U_5266 +ENCODING 21094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +4420 +92A0 +7DA0 +54A0 +7CA0 +54A0 +7C20 +1020 +1C60 +ENDCHAR +STARTCHAR U_5267 +ENCODING 21095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +4220 +7EA0 +48A0 +48A0 +7EA0 +48A0 +7EA0 +6220 +A220 +BEE0 +ENDCHAR +STARTCHAR U_5268 +ENCODING 21096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +10A0 +7CA0 +10A0 +7CA0 +10A0 +FEA0 +6420 +A420 +3CE0 +ENDCHAR +STARTCHAR U_5269 +ENCODING 21097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0620 +7820 +10A0 +FEA0 +54A0 +D6A0 +54A0 +D6A0 +3820 +5420 +92E0 +ENDCHAR +STARTCHAR U_526A +ENCODING 21098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4840 +7A40 +4A40 +7A40 +48C0 +0000 +7FC0 +0840 +7180 +ENDCHAR +STARTCHAR U_526B +ENCODING 21099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +A4A0 +FEA0 +A4A0 +BCA0 +80A0 +FEA0 +A420 +9820 +E6E0 +ENDCHAR +STARTCHAR U_526C +ENCODING 21100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +92A0 +FEA0 +00A0 +FEA0 +10A0 +FEA0 +AAA0 +AA20 +AA20 +86E0 +ENDCHAR +STARTCHAR U_526D +ENCODING 21101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +82A0 +FEA0 +80A0 +FEA0 +A4A0 +FEA0 +88A0 +BE20 +8820 +FF60 +ENDCHAR +STARTCHAR U_526E +ENCODING 21102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +44A0 +74A0 +54A0 +FEA0 +82A0 +BAA0 +AAA0 +AA20 +BA20 +86E0 +ENDCHAR +STARTCHAR U_526F +ENCODING 21103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +00A0 +7CA0 +44A0 +7CA0 +00A0 +FEA0 +92A0 +FE20 +9220 +FEE0 +ENDCHAR +STARTCHAR U_5270 +ENCODING 21104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +7020 +10A0 +FEA0 +54A0 +FEA0 +54A0 +FEA0 +3820 +5420 +9260 +ENDCHAR +STARTCHAR U_5271 +ENCODING 21105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +53C0 +8940 +7140 +2340 +FD40 +A940 +FA40 +2240 +5440 +88C0 +ENDCHAR +STARTCHAR U_5272 +ENCODING 21106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE20 +92A0 +7CA0 +10A0 +7CA0 +10A0 +FEA0 +4420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5273 +ENCODING 21107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +FE20 +44A0 +54A0 +28A0 +44A0 +BAA0 +00A0 +7C20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5274 +ENCODING 21108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +92A0 +FEA0 +00A0 +FEA0 +00A0 +7CA0 +44A0 +7C20 +2820 +FEE0 +ENDCHAR +STARTCHAR U_5275 +ENCODING 21109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +54A0 +FEA0 +44A0 +7CA0 +44A0 +7CA0 +C420 +4420 +7CE0 +ENDCHAR +STARTCHAR U_5276 +ENCODING 21110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7E20 +4420 +FCA0 +08A0 +FEA0 +52A0 +A8A0 +5C20 +AA20 +58E0 +ENDCHAR +STARTCHAR U_5277 +ENCODING 21111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +44A0 +28A0 +7FA0 +68A0 +7EA0 +48A0 +7E20 +8820 +3EE0 +ENDCHAR +STARTCHAR U_5278 +ENCODING 21112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +54A0 +7CA0 +54A0 +7CA0 +54A0 +0AA0 +FE20 +4820 +18E0 +ENDCHAR +STARTCHAR U_5279 +ENCODING 21113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE20 +2220 +AAA0 +36A0 +48A0 +94A0 +6AA0 +12A0 +6420 +0820 +F0E0 +ENDCHAR +STARTCHAR U_527A +ENCODING 21114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FD40 +5480 +9340 +3FE0 +2000 +2FE0 +4420 +98C0 +ENDCHAR +STARTCHAR U_527B +ENCODING 21115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +9220 +FEA0 +00A0 +EEA0 +AAA0 +EEA0 +AAA0 +EEA0 +AA20 +B6E0 +ENDCHAR +STARTCHAR U_527C +ENCODING 21116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7CA0 +24A0 +FEA0 +10A0 +28A0 +D6A0 +28A0 +5420 +0820 +70E0 +ENDCHAR +STARTCHAR U_527D +ENCODING 21117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +28A0 +FEA0 +AAA0 +FEA0 +00A0 +7CA0 +00A0 +FEA0 +5420 +B360 +ENDCHAR +STARTCHAR U_527E +ENCODING 21118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +8020 +BCA0 +A4A0 +BCA0 +80A0 +FEA0 +DAA0 +FE20 +8020 +FEE0 +ENDCHAR +STARTCHAR U_527F +ENCODING 21119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5420 +A8A0 +54A0 +7CA0 +54A0 +7CA0 +54A0 +FEA0 +2820 +5420 +92E0 +ENDCHAR +STARTCHAR U_5280 +ENCODING 21120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2820 +FEA0 +2AA0 +48A0 +FEA0 +AAA0 +FEA0 +AA20 +BA20 +86E0 +ENDCHAR +STARTCHAR U_5281 +ENCODING 21121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +7EA0 +48A0 +FEA0 +48A0 +7EA0 +48A0 +7EA0 +0020 +5220 +A960 +ENDCHAR +STARTCHAR U_5282 +ENCODING 21122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF20 +D420 +A4A0 +FFA0 +A0A0 +AAA0 +AAA0 +FAA0 +A620 +A920 +50E0 +ENDCHAR +STARTCHAR U_5283 +ENCODING 21123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7EA0 +12A0 +FFA0 +12A0 +FFA0 +54A0 +7CA0 +5420 +5420 +FEE0 +ENDCHAR +STARTCHAR U_5284 +ENCODING 21124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +7F20 +AAA0 +10A0 +38A0 +44A0 +BAA0 +00A0 +7EA0 +4220 +7E60 +ENDCHAR +STARTCHAR U_5285 +ENCODING 21125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +AA20 +FEA0 +40A0 +7EA0 +92A0 +7EA0 +56A0 +7E20 +1220 +FA60 +ENDCHAR +STARTCHAR U_5286 +ENCODING 21126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +7E20 +54A0 +7EA0 +54A0 +7BA0 +54A0 +7EA0 +5420 +B620 +D5E0 +ENDCHAR +STARTCHAR U_5287 +ENCODING 21127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E20 +1020 +FEA0 +92A0 +BCA0 +92A0 +FEA0 +ADA0 +D620 +A520 +D9E0 +ENDCHAR +STARTCHAR U_5288 +ENCODING 21128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +43E0 +7C80 +A7E0 +3C80 +0080 +7FC0 +0840 +7180 +ENDCHAR +STARTCHAR U_5289 +ENCODING 21129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DE20 +8A20 +AAA0 +D6A0 +28A0 +FEA0 +10A0 +FEA0 +9220 +5420 +FEE0 +ENDCHAR +STARTCHAR U_528A +ENCODING 21130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3820 +4420 +BAA0 +00A0 +FEA0 +AAA0 +FEA0 +44A0 +7C20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_528B +ENCODING 21131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4420 +7CA0 +00A0 +EEA0 +AAA0 +EEA0 +10A0 +FF20 +5420 +9360 +ENDCHAR +STARTCHAR U_528C +ENCODING 21132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2820 +7F20 +0AA0 +7FA0 +44A0 +7DA0 +56A0 +7520 +AB20 +9160 +ENDCHAR +STARTCHAR U_528D +ENCODING 21133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +44A0 +BAA0 +00A0 +EEA0 +AAA0 +EEA0 +4420 +AA20 +9160 +ENDCHAR +STARTCHAR U_528E +ENCODING 21134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +29E0 +44A0 +BAA0 +00A0 +EEA0 +AAA0 +EEA0 +4520 +4520 +AA60 +ENDCHAR +STARTCHAR U_528F +ENCODING 21135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +5420 +FEA0 +82A0 +7CA0 +44A0 +FEA0 +92A0 +FE20 +9220 +FEE0 +ENDCHAR +STARTCHAR U_5290 +ENCODING 21136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +FF20 +24A0 +7EA0 +C8A0 +7EA0 +48A0 +7EA0 +2420 +1820 +66E0 +ENDCHAR +STARTCHAR U_5291 +ENCODING 21137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FF20 +2AA0 +54A0 +56A0 +95A0 +42A0 +7EA0 +4220 +7E20 +82E0 +ENDCHAR +STARTCHAR U_5292 +ENCODING 21138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +29E0 +46A0 +BAA0 +01A0 +EEA0 +AAA0 +EEA0 +0120 +4520 +AA60 +ENDCHAR +STARTCHAR U_5293 +ENCODING 21139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +7C20 +54A0 +54A0 +FEA0 +92A0 +FEA0 +92A0 +FF20 +2420 +C4E0 +ENDCHAR +STARTCHAR U_5294 +ENCODING 21140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53C0 +8940 +7540 +0140 +FB40 +A9C0 +F960 +5240 +5240 +AC80 +ENDCHAR +STARTCHAR U_5295 +ENCODING 21141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7620 +44A0 +7FA0 +AAA0 +7EA0 +4AA0 +66A0 +52A0 +7E20 +2420 +4260 +ENDCHAR +STARTCHAR U_5296 +ENCODING 21142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7820 +FE20 +42A0 +FFA0 +ADA0 +EAA0 +7EA0 +52A0 +7E20 +2A20 +C7E0 +ENDCHAR +STARTCHAR U_5297 +ENCODING 21143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A420 +FF20 +24A0 +FFA0 +55A0 +FEA0 +42A0 +7EA0 +4220 +7E20 +C3E0 +ENDCHAR +STARTCHAR U_5298 +ENCODING 21144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +7F20 +54A0 +7EA0 +56A0 +5DA0 +76A0 +54A0 +7620 +9420 +F760 +ENDCHAR +STARTCHAR U_5299 +ENCODING 21145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7C20 +24A0 +FFA0 +66A0 +D5A0 +EEA0 +AAA0 +EE20 +4420 +EEE0 +ENDCHAR +STARTCHAR U_529A +ENCODING 21146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +42A0 +7EA0 +54A0 +48A0 +7EA0 +56A0 +7EA0 +4A20 +CA20 +34E0 +ENDCHAR +STARTCHAR U_529B +ENCODING 21147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0880 +0880 +1080 +1080 +2080 +4080 +8700 +ENDCHAR +STARTCHAR U_529C +ENCODING 21148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +FD00 +2500 +2500 +2500 +2520 +4520 +4520 +99E0 +ENDCHAR +STARTCHAR U_529D +ENCODING 21149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +0BE0 +8920 +4920 +3120 +1120 +2920 +4A20 +8420 +08C0 +ENDCHAR +STARTCHAR U_529E +ENCODING 21150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +FF00 +1100 +1100 +5180 +5140 +A140 +2100 +4500 +8200 +ENDCHAR +STARTCHAR U_529F +ENCODING 21151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F900 +27E0 +2120 +2120 +2120 +3A20 +C220 +0420 +18C0 +ENDCHAR +STARTCHAR U_52A0 +ENCODING 21152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +FDE0 +2520 +2520 +2520 +2520 +2520 +4520 +55E0 +8920 +ENDCHAR +STARTCHAR U_52A1 +ENCODING 21153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +3100 +4A00 +0400 +1B00 +E4E0 +3F80 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_52A2 +ENCODING 21154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +2080 +3BE0 +28A0 +28A0 +28A0 +4920 +4920 +8A20 +9460 +ENDCHAR +STARTCHAR U_52A3 +ENCODING 21155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +2500 +4480 +8140 +1E00 +E400 +3FC0 +0440 +0840 +1040 +E180 +ENDCHAR +STARTCHAR U_52A4 +ENCODING 21156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +43E0 +40A0 +7CA0 +48A0 +48A0 +48A0 +4920 +8920 +8A60 +ENDCHAR +STARTCHAR U_52A5 +ENCODING 21157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +03E0 +7120 +5120 +5120 +5520 +5A20 +5420 +88C0 +ENDCHAR +STARTCHAR U_52A6 +ENCODING 21158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +0440 +0980 +7080 +1080 +7FE0 +14A0 +24A0 +4520 +9AC0 +ENDCHAR +STARTCHAR U_52A7 +ENCODING 21159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7C80 +1080 +13E0 +7CA0 +10A0 +FCA0 +1120 +1120 +5220 +2460 +ENDCHAR +STARTCHAR U_52A8 +ENCODING 21160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +0100 +03E0 +FD20 +2120 +2120 +4920 +FA20 +0A20 +04C0 +ENDCHAR +STARTCHAR U_52A9 +ENCODING 21161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +4900 +4BE0 +7920 +4920 +7920 +4920 +5E20 +E2A0 +0440 +ENDCHAR +STARTCHAR U_52AA +ENCODING 21162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +FFC0 +5480 +9300 +6280 +DC40 +0800 +FF80 +0880 +1080 +E300 +ENDCHAR +STARTCHAR U_52AB +ENCODING 21163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +13E0 +1120 +FD20 +2120 +2920 +4A20 +7A20 +04C0 +ENDCHAR +STARTCHAR U_52AC +ENCODING 21164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7C80 +87E0 +74A0 +54A0 +54A0 +54A0 +7520 +0520 +1A60 +ENDCHAR +STARTCHAR U_52AD +ENCODING 21165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4900 +4BE0 +4920 +4920 +9920 +0120 +F920 +8920 +8B20 +FCE0 +ENDCHAR +STARTCHAR U_52AE +ENCODING 21166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +7C80 +93E0 +10A0 +FEA0 +10A0 +18A0 +2520 +4220 +8460 +ENDCHAR +STARTCHAR U_52AF +ENCODING 21167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +27E0 +2120 +4120 +7920 +C920 +4920 +4920 +7A20 +0460 +ENDCHAR +STARTCHAR U_52B0 +ENCODING 21168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4100 +FBE0 +8920 +8920 +F920 +8920 +8A20 +FA20 +04C0 +ENDCHAR +STARTCHAR U_52B1 +ENCODING 21169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4080 +4080 +7DE0 +50A0 +5CA0 +54A0 +54A0 +5520 +AA20 +4460 +ENDCHAR +STARTCHAR U_52B2 +ENCODING 21170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0900 +17E0 +2920 +4520 +8120 +7920 +1120 +1220 +3A20 +C460 +ENDCHAR +STARTCHAR U_52B3 +ENCODING 21171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +8080 +0800 +7F80 +0880 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_52B4 +ENCODING 21172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2440 +2480 +7FE0 +4420 +8400 +7FC0 +0440 +0840 +1040 +6180 +ENDCHAR +STARTCHAR U_52B5 +ENCODING 21173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +7F80 +0800 +FFE0 +2080 +4440 +BFA0 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_52B6 +ENCODING 21174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +7080 +4080 +7DE0 +40A0 +5CA0 +54A0 +54A0 +5D20 +8220 +04C0 +ENDCHAR +STARTCHAR U_52B7 +ENCODING 21175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2880 +FC80 +13E0 +7CA0 +10A0 +FCA0 +1120 +1120 +2220 +C4C0 +ENDCHAR +STARTCHAR U_52B8 +ENCODING 21176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +1080 +13E0 +FCA0 +10A0 +7CA0 +1120 +1120 +1E20 +E4C0 +ENDCHAR +STARTCHAR U_52B9 +ENCODING 21177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +4BE0 +44A0 +8AA0 +28A0 +1120 +2920 +4520 +8660 +ENDCHAR +STARTCHAR U_52BA +ENCODING 21178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4880 +7C80 +17E0 +50A0 +7CA0 +90A0 +10A0 +FD20 +1120 +1260 +ENDCHAR +STARTCHAR U_52BB +ENCODING 21179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +83E0 +FCA0 +90A0 +B8A0 +90A0 +FD20 +8120 +FE20 +04C0 +ENDCHAR +STARTCHAR U_52BC +ENCODING 21180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +13E0 +10A0 +7CA0 +00A0 +7CA0 +44A0 +4520 +7E20 +44C0 +ENDCHAR +STARTCHAR U_52BD +ENCODING 21181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +2140 +7940 +8940 +5140 +2840 +C8C0 +7F80 +0880 +1080 +6300 +ENDCHAR +STARTCHAR U_52BE +ENCODING 21182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FE80 +23E0 +48A0 +F0A0 +14A0 +28A0 +5920 +2620 +C4C0 +ENDCHAR +STARTCHAR U_52BF +ENCODING 21183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +FD40 +2240 +ED60 +0800 +7FC0 +0840 +1040 +E1C0 +ENDCHAR +STARTCHAR U_52C0 +ENCODING 21184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F8A0 +88A0 +88A0 +F8A0 +50A0 +5520 +5A20 +94C0 +ENDCHAR +STARTCHAR U_52C1 +ENCODING 21185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5500 +A900 +ABE0 +5520 +0120 +FD20 +2120 +2220 +3A20 +CCC0 +ENDCHAR +STARTCHAR U_52C2 +ENCODING 21186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5100 +7FE0 +9120 +FD20 +0120 +7D20 +4520 +4520 +7E20 +44C0 +ENDCHAR +STARTCHAR U_52C3 +ENCODING 21187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +11E0 +7EA0 +84A0 +78A0 +08A0 +10A0 +7D20 +1220 +3460 +ENDCHAR +STARTCHAR U_52C4 +ENCODING 21188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7E80 +8080 +7DE0 +54A0 +54A0 +FEA0 +54A0 +7D20 +0520 +1A60 +ENDCHAR +STARTCHAR U_52C5 +ENCODING 21189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +FE80 +13E0 +7CA0 +54A0 +7CA0 +10A0 +3920 +5520 +1260 +ENDCHAR +STARTCHAR U_52C6 +ENCODING 21190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +8BE0 +F920 +8920 +F920 +A120 +B220 +CA20 +84C0 +ENDCHAR +STARTCHAR U_52C7 +ENCODING 21191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +1200 +7F80 +4880 +7F80 +4880 +7F80 +4880 +FFC0 +1040 +E380 +ENDCHAR +STARTCHAR U_52C8 +ENCODING 21192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +2100 +FBE0 +A920 +F920 +A920 +FA20 +AA20 +AA20 +BCC0 +ENDCHAR +STARTCHAR U_52C9 +ENCODING 21193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +4BE0 +7CA0 +D4A0 +54A0 +7D20 +2A20 +2CC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_52CA +ENCODING 21194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23C0 +F940 +8940 +8940 +F940 +5240 +5480 +5060 +8FC0 +ENDCHAR +STARTCHAR U_52CB +ENCODING 21195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +F900 +03E0 +F920 +8920 +A920 +A920 +A120 +5220 +8CC0 +ENDCHAR +STARTCHAR U_52CC +ENCODING 21196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +1100 +7D00 +13E0 +FD20 +2920 +4520 +B920 +2920 +2220 +3CC0 +ENDCHAR +STARTCHAR U_52CD +ENCODING 21197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FDE0 +00A0 +7CA0 +44A0 +7CA0 +10A0 +5920 +9520 +3260 +ENDCHAR +STARTCHAR U_52CE +ENCODING 21198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7080 +23E0 +FCA0 +48A0 +A4A0 +20A0 +F920 +2120 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_52CF +ENCODING 21199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +4BE0 +50A0 +FCA0 +00A0 +78A0 +4920 +4920 +7A60 +ENDCHAR +STARTCHAR U_52D0 +ENCODING 21200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +0880 +1080 +FFE0 +10A0 +50A0 +20A0 +7CA0 +5520 +5520 +FE60 +ENDCHAR +STARTCHAR U_52D1 +ENCODING 21201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +5480 +55E0 +BAA0 +10A0 +3920 +3520 +5520 +9220 +1460 +ENDCHAR +STARTCHAR U_52D2 +ENCODING 21202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5100 +77E0 +2120 +F920 +A920 +F920 +2220 +FA20 +2460 +ENDCHAR +STARTCHAR U_52D3 +ENCODING 21203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +F880 +95E0 +DCA0 +20A0 +FCA0 +84A0 +FCA0 +8520 +FD20 +8660 +ENDCHAR +STARTCHAR U_52D4 +ENCODING 21204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +2080 +FBE0 +A8A0 +B8A0 +A8A0 +B920 +A920 +FA20 +0460 +ENDCHAR +STARTCHAR U_52D5 +ENCODING 21205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +1080 +FE80 +55E0 +7CA0 +54A0 +7CA0 +10A0 +7D20 +1120 +FE60 +ENDCHAR +STARTCHAR U_52D6 +ENCODING 21206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +8280 +BBE0 +82A0 +BAA0 +44A0 +7CA0 +44A0 +7CA0 +4520 +7E60 +ENDCHAR +STARTCHAR U_52D7 +ENCODING 21207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +7FC0 +4900 +7BE0 +4920 +7920 +4A20 +FC60 +ENDCHAR +STARTCHAR U_52D8 +ENCODING 21208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FE80 +2480 +3DE0 +24A0 +3CA0 +24A0 +FEA0 +54A0 +6320 +7E60 +ENDCHAR +STARTCHAR U_52D9 +ENCODING 21209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +2640 +F980 +2A40 +3520 +6FE0 +A120 +2120 +A2A0 +6C40 +ENDCHAR +STARTCHAR U_52DA +ENCODING 21210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +FE80 +5480 +5DE0 +40A0 +7CA0 +44A0 +54A0 +1120 +2920 +C660 +ENDCHAR +STARTCHAR U_52DB +ENCODING 21211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +FDE0 +84A0 +FCA0 +84A0 +FCA0 +84A0 +FD20 +4A20 +8460 +ENDCHAR +STARTCHAR U_52DC +ENCODING 21212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5480 +AA80 +7DE0 +00A0 +EEA0 +22A0 +AAA0 +66A0 +AAA0 +4560 +ENDCHAR +STARTCHAR U_52DD +ENCODING 21213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +F200 +9FE0 +9240 +F520 +9FC0 +9240 +9440 +B9C0 +ENDCHAR +STARTCHAR U_52DE +ENCODING 21214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +B580 +A500 +5280 +8C40 +FFC0 +8840 +7F80 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_52DF +ENCODING 21215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2880 +FFE0 +4840 +BFA0 +1080 +6300 +ENDCHAR +STARTCHAR U_52E0 +ENCODING 21216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +AA80 +6680 +ABE0 +18A0 +E6A0 +38A0 +04A0 +78A0 +0520 +7A60 +ENDCHAR +STARTCHAR U_52E1 +ENCODING 21217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2880 +FE80 +ABE0 +FEA0 +00A0 +FEA0 +54A0 +5520 +9520 +2260 +ENDCHAR +STARTCHAR U_52E2 +ENCODING 21218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1140 +FF40 +5540 +BAA0 +1420 +7FC0 +0440 +0840 +7180 +ENDCHAR +STARTCHAR U_52E3 +ENCODING 21219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +11E0 +FCA0 +10A0 +FEA0 +44A0 +7CA0 +4520 +7D20 +C660 +ENDCHAR +STARTCHAR U_52E4 +ENCODING 21220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +2880 +7FE0 +54A0 +54A0 +7CA0 +10A0 +7D20 +1120 +FE60 +ENDCHAR +STARTCHAR U_52E5 +ENCODING 21221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1440 +FFE0 +8920 +FFE0 +1140 +77E0 +0820 +7FC0 +0840 +F0C0 +ENDCHAR +STARTCHAR U_52E6 +ENCODING 21222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +A880 +5480 +7DE0 +54A0 +7CA0 +54A0 +FEA0 +1920 +5520 +9260 +ENDCHAR +STARTCHAR U_52E7 +ENCODING 21223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7C80 +93E0 +20A0 +7CA0 +D0A0 +7CA0 +50A0 +7D20 +5120 +7E60 +ENDCHAR +STARTCHAR U_52E8 +ENCODING 21224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +9080 +7C80 +55E0 +7CA0 +20A0 +D4A0 +38A0 +5520 +A920 +5A60 +ENDCHAR +STARTCHAR U_52E9 +ENCODING 21225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +4BE0 +78A0 +40A0 +7CA0 +44A0 +7CA0 +4520 +7D20 +C660 +ENDCHAR +STARTCHAR U_52EA +ENCODING 21226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FE80 +45E0 +BAA0 +28A0 +FEA0 +82A0 +BB20 +AB20 +BA60 +ENDCHAR +STARTCHAR U_52EB +ENCODING 21227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F480 +ABE0 +FCA0 +68A0 +A4A0 +FCA0 +A4A0 +FD20 +A520 +FE60 +ENDCHAR +STARTCHAR U_52EC +ENCODING 21228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +FE80 +1080 +FFE0 +54A0 +BAA0 +54A0 +FF20 +5520 +9320 +3660 +ENDCHAR +STARTCHAR U_52ED +ENCODING 21229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +2880 +FFE0 +54A0 +7CA0 +54A0 +7CA0 +1120 +1D20 +E260 +ENDCHAR +STARTCHAR U_52EE +ENCODING 21230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +1080 +7FE0 +52A0 +7CA0 +50A0 +7EA0 +6AA0 +5CA0 +6AA0 +9160 +ENDCHAR +STARTCHAR U_52EF +ENCODING 21231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +8480 +B5E0 +84A0 +FCA0 +48A0 +78A0 +4920 +4920 +FE60 +ENDCHAR +STARTCHAR U_52F0 +ENCODING 21232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +2BE0 +4AA0 +9BE0 +5220 +FCC0 +55A0 +5680 +54A0 +ACE0 +ENDCHAR +STARTCHAR U_52F1 +ENCODING 21233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +29E0 +7CA0 +54A0 +7CA0 +54A0 +FEA0 +96A0 +FB20 +8660 +ENDCHAR +STARTCHAR U_52F2 +ENCODING 21234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FFE0 +54A0 +7CA0 +54A0 +7D20 +1260 +FC00 +5540 +AAA0 +ENDCHAR +STARTCHAR U_52F3 +ENCODING 21235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +1080 +FE80 +ABE0 +FEA0 +10A0 +FCA0 +10A0 +FD20 +5520 +AA60 +ENDCHAR +STARTCHAR U_52F4 +ENCODING 21236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +2080 +FE80 +8BE0 +FCA0 +94A0 +FCA0 +9520 +FD20 +AA20 +9E40 +ENDCHAR +STARTCHAR U_52F5 +ENCODING 21237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +9480 +BE80 +ABE0 +BEA0 +AAA0 +FEA0 +8AA0 +BEA0 +8320 +8660 +ENDCHAR +STARTCHAR U_52F6 +ENCODING 21238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5EE0 +AB20 +5EA0 +CA40 +4EC0 +4B20 +0400 +7FC0 +0840 +71C0 +ENDCHAR +STARTCHAR U_52F7 +ENCODING 21239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +AA80 +EFE0 +28A0 +FCA0 +28A0 +FEA0 +2AA0 +E520 +3A60 +ENDCHAR +STARTCHAR U_52F8 +ENCODING 21240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2880 +EE80 +ABE0 +EEA0 +48A0 +FEA0 +48A0 +7D20 +4920 +7E60 +ENDCHAR +STARTCHAR U_52F9 +ENCODING 21241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +0040 +0040 +0040 +0040 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_52FA +ENCODING 21242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +3FC0 +2040 +4040 +8840 +0440 +0440 +0040 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_52FB +ENCODING 21243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +2000 +3FC0 +4040 +9E40 +0040 +0040 +3F40 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_52FC +ENCODING 21244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +2020 +4820 +BE20 +0A20 +0AA0 +12A0 +21A0 +4020 +00C0 +ENDCHAR +STARTCHAR U_52FD +ENCODING 21245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4020 +8820 +0820 +0820 +1420 +2220 +4020 +0020 +01C0 +ENDCHAR +STARTCHAR U_52FE +ENCODING 21246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3FC0 +4040 +9040 +1040 +2440 +7E40 +0240 +0040 +0380 +ENDCHAR +STARTCHAR U_52FF +ENCODING 21247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FE0 +2920 +4920 +8920 +1120 +2220 +4420 +0920 +30C0 +ENDCHAR +STARTCHAR U_5300 +ENCODING 21248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +2020 +5820 +8620 +0020 +0320 +0C20 +3020 +0020 +01C0 +ENDCHAR +STARTCHAR U_5301 +ENCODING 21249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1F80 +2280 +5280 +8C80 +0480 +0A80 +1180 +60E0 +0300 +ENDCHAR +STARTCHAR U_5302 +ENCODING 21250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +50A0 +9320 +1C20 +10A0 +0FA0 +0020 +0020 +01C0 +ENDCHAR +STARTCHAR U_5303 +ENCODING 21251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +1220 +2220 +4220 +A520 +28A0 +2060 +3FA0 +0020 +01C0 +ENDCHAR +STARTCHAR U_5304 +ENCODING 21252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +8420 +7FA0 +2020 +2020 +2020 +3F20 +0020 +01C0 +ENDCHAR +STARTCHAR U_5305 +ENCODING 21253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4040 +7E40 +A240 +2240 +3E40 +2040 +21A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_5306 +ENCODING 21254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +2000 +3F80 +4A80 +B280 +1A80 +2680 +4580 +8880 +1080 +2300 +ENDCHAR +STARTCHAR U_5307 +ENCODING 21255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +4820 +8FA0 +08A0 +1520 +0220 +0420 +1820 +01C0 +ENDCHAR +STARTCHAR U_5308 +ENCODING 21256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +4020 +9220 +2D20 +2520 +2B20 +2120 +3F20 +0020 +00C0 +ENDCHAR +STARTCHAR U_5309 +ENCODING 21257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +7FC0 +8040 +3E40 +4940 +2A40 +FF40 +0840 +0840 +0840 +0180 +ENDCHAR +STARTCHAR U_530A +ENCODING 21258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4840 +C940 +2A40 +FF40 +1840 +2C40 +4B40 +0840 +0180 +ENDCHAR +STARTCHAR U_530B +ENCODING 21259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +7FC0 +A040 +3E40 +4840 +FF40 +0840 +4A40 +7E40 +0040 +0180 +ENDCHAR +STARTCHAR U_530C +ENCODING 21260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4420 +4A20 +9120 +2EA0 +4060 +1F20 +1120 +1F20 +00C0 +ENDCHAR +STARTCHAR U_530D +ENCODING 21261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +7FC0 +8A40 +7F40 +4940 +7F40 +4940 +7F40 +4940 +4A40 +0180 +ENDCHAR +STARTCHAR U_530E +ENCODING 21262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +BFA0 +1520 +3FA0 +5560 +1F20 +04A0 +07A0 +00C0 +ENDCHAR +STARTCHAR U_530F +ENCODING 21263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +4A20 +87A0 +7AA0 +03A0 +FEA0 +4220 +7A40 +0A20 +73E0 +ENDCHAR +STARTCHAR U_5310 +ENCODING 21264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4020 +BFA0 +1120 +3FA0 +24A0 +3FA0 +24A0 +3FA0 +00C0 +ENDCHAR +STARTCHAR U_5311 +ENCODING 21265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5020 +BBA0 +28A0 +3BA0 +2A20 +7BA0 +28A0 +4B20 +98C0 +ENDCHAR +STARTCHAR U_5312 +ENCODING 21266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5120 +BFA0 +1120 +1F20 +60E0 +1F20 +1120 +1F20 +00C0 +ENDCHAR +STARTCHAR U_5313 +ENCODING 21267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +7BA0 +AAA0 +3AE0 +2C20 +3BA0 +22A0 +3940 +2AC0 +ENDCHAR +STARTCHAR U_5314 +ENCODING 21268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5020 +BBA0 +2AA0 +3BA0 +2820 +7BA0 +2AA0 +4BA0 +10C0 +ENDCHAR +STARTCHAR U_5315 +ENCODING 21269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 3 -1 +BITMAP +80 +80 +86 +98 +E0 +80 +80 +81 +81 +7F +ENDCHAR +STARTCHAR U_5316 +ENCODING 21270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2240 +2280 +6300 +A200 +2600 +2A00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_5317 +ENCODING 21271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1200 +F260 +1380 +1200 +1200 +3200 +5220 +9220 +11E0 +ENDCHAR +STARTCHAR U_5318 +ENCODING 21272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +82A0 +8540 +8A80 +A540 +CFE0 +8820 +8AA0 +8920 +8AA0 +A820 +6FE0 +ENDCHAR +STARTCHAR U_5319 +ENCODING 21273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4500 +7D20 +4540 +7D80 +0100 +FF20 +5120 +5CE0 +B000 +9FE0 +ENDCHAR +STARTCHAR U_531A +ENCODING 21274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +FFC0 +8000 +ENDCHAR +STARTCHAR U_531B +ENCODING 21275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +8800 +8F80 +9080 +A100 +8200 +8500 +8880 +B040 +FFE0 +ENDCHAR +STARTCHAR U_531C +ENCODING 21276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8400 +9400 +9700 +9D00 +F500 +9500 +9080 +8F80 +8000 +FFC0 +ENDCHAR +STARTCHAR U_531D +ENCODING 21277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8000 +8400 +BF80 +A480 +A480 +A480 +A580 +8400 +8400 +FFC0 +ENDCHAR +STARTCHAR U_531E +ENCODING 21278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +9F80 +8200 +8200 +8200 +8200 +BFC0 +8000 +8000 +FFE0 +ENDCHAR +STARTCHAR U_531F +ENCODING 21279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8800 +8400 +FF80 +8000 +9E00 +9280 +9280 +A180 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5320 +ENCODING 21280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8100 +9E00 +9000 +9FC0 +9200 +9200 +9200 +A200 +C200 +FFC0 +ENDCHAR +STARTCHAR U_5321 +ENCODING 21281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BF80 +8400 +8400 +9F00 +8400 +8400 +BF80 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5322 +ENCODING 21282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9000 +BF80 +CA80 +8A80 +9280 +A480 +8880 +9300 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5323 +ENCODING 21283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8000 +BF80 +A480 +BF80 +A480 +BF80 +8400 +8400 +8400 +FFC0 +ENDCHAR +STARTCHAR U_5324 +ENCODING 21284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BFC0 +8400 +8400 +9F80 +8500 +8480 +BFC0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5325 +ENCODING 21285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +9100 +BF80 +8080 +9100 +FFC0 +9100 +9100 +A100 +FFE0 +ENDCHAR +STARTCHAR U_5326 +ENCODING 21286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +F900 +93C0 +A940 +FD40 +8940 +FD40 +8960 +8A40 +FFE0 +ENDCHAR +STARTCHAR U_5327 +ENCODING 21287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BFC0 +9480 +9480 +AD40 +C520 +8A00 +9100 +A0C0 +FFE0 +ENDCHAR +STARTCHAR U_5328 +ENCODING 21288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A880 +A880 +B880 +8BE0 +F880 +A880 +A880 +CBE0 +8800 +FFE0 +ENDCHAR +STARTCHAR U_5329 +ENCODING 21289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8200 +9240 +9FC0 +8200 +BFE0 +8000 +8200 +9FC0 +8200 +FFE0 +ENDCHAR +STARTCHAR U_532A +ENCODING 21290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8000 +8A00 +FBC0 +8A00 +BB80 +8A00 +FBC0 +8A00 +8A00 +FFC0 +ENDCHAR +STARTCHAR U_532B +ENCODING 21291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +9FC0 +A940 +9240 +A540 +BFC0 +A040 +BFC0 +A040 +FFE0 +ENDCHAR +STARTCHAR U_532C +ENCODING 21292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +8A00 +9180 +EF60 +BC40 +A540 +BD40 +A540 +A4C0 +FFE0 +ENDCHAR +STARTCHAR U_532D +ENCODING 21293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A200 +FA00 +A780 +FA80 +AA80 +FAA0 +AAA0 +FE60 +A400 +FFE0 +ENDCHAR +STARTCHAR U_532E +ENCODING 21294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8400 +9F00 +9500 +FFC0 +8000 +BF80 +A480 +AA80 +9100 +FFC0 +ENDCHAR +STARTCHAR U_532F +ENCODING 21295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A500 +97C0 +C500 +AFC0 +9500 +E7C0 +A500 +A7E0 +A400 +FFE0 +ENDCHAR +STARTCHAR U_5330 +ENCODING 21296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +AA80 +BB80 +8000 +BF80 +A480 +BF80 +A480 +FFC0 +8400 +FFC0 +ENDCHAR +STARTCHAR U_5331 +ENCODING 21297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +9F00 +9500 +FFE0 +9080 +9F80 +9080 +9F80 +B0C0 +FFE0 +ENDCHAR +STARTCHAR U_5332 +ENCODING 21298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BFC0 +8900 +9F80 +E960 +8F00 +BDC0 +A540 +BDC0 +FFE0 +ENDCHAR +STARTCHAR U_5333 +ENCODING 21299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +8A00 +9180 +EE60 +BB80 +AA80 +BB80 +9100 +AA80 +FFE0 +ENDCHAR +STARTCHAR U_5334 +ENCODING 21300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A100 +BDE0 +CA40 +9FC0 +9040 +9FC0 +8480 +BFE0 +8880 +FFE0 +ENDCHAR +STARTCHAR U_5335 +ENCODING 21301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BFC0 +8400 +BF80 +AA80 +BF80 +9500 +9F00 +A080 +FFE0 +ENDCHAR +STARTCHAR U_5336 +ENCODING 21302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +FFC0 +9500 +BF80 +D400 +9F80 +A080 +BB80 +A080 +FFE0 +ENDCHAR +STARTCHAR U_5337 +ENCODING 21303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA40 +BBC0 +AA40 +BBC0 +9400 +BFC0 +E200 +BFC0 +A200 +FFE0 +ENDCHAR +STARTCHAR U_5338 +ENCODING 21304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +2000 +3FE0 +ENDCHAR +STARTCHAR U_5339 +ENCODING 21305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9200 +9200 +9200 +9200 +9240 +A240 +A1C0 +C000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_533A +ENCODING 21306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8000 +A100 +9100 +8A00 +8400 +8A00 +9100 +A100 +8000 +FFC0 +ENDCHAR +STARTCHAR U_533B +ENCODING 21307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9000 +9000 +9F80 +A400 +FFC0 +8400 +8A00 +9100 +A080 +FFC0 +ENDCHAR +STARTCHAR U_533C +ENCODING 21308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8400 +8A00 +9100 +EEC0 +8000 +9F00 +9100 +9F00 +8000 +FFC0 +ENDCHAR +STARTCHAR U_533D +ENCODING 21309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9100 +9F00 +9100 +9F00 +8400 +FF80 +9200 +8E00 +9900 +FFC0 +ENDCHAR +STARTCHAR U_533E +ENCODING 21310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8400 +BF80 +A080 +BF80 +A000 +BFC0 +B540 +DFC0 +9540 +FFE0 +ENDCHAR +STARTCHAR U_533F +ENCODING 21311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9200 +FF80 +9200 +FFC0 +8800 +9F00 +B100 +DF00 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5340 +ENCODING 21312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8880 +8880 +8F80 +8000 +BDE0 +A520 +A520 +BDE0 +8000 +FFE0 +ENDCHAR +STARTCHAR U_5341 +ENCODING 21313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5342 +ENCODING 21314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +1100 +1100 +1100 +FF00 +1100 +1100 +10A0 +10A0 +1060 +1020 +ENDCHAR +STARTCHAR U_5343 +ENCODING 21315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5344 +ENCODING 21316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +1100 +FFE0 +1100 +1100 +1100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_5345 +ENCODING 21317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2440 +2440 +2440 +FFE0 +2440 +2440 +2440 +2440 +4440 +8040 +ENDCHAR +STARTCHAR U_5346 +ENCODING 21318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F00 +1120 +2120 +44E0 +8400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5347 +ENCODING 21319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0D00 +7100 +1100 +1100 +1100 +FFC0 +1100 +1100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_5348 +ENCODING 21320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3F80 +4400 +8400 +0400 +FFC0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5349 +ENCODING 21321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +0200 +1280 +1280 +1080 +FFE0 +1080 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_534A +ENCODING 21322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +2480 +1500 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_534B +ENCODING 21323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +2480 +2080 +FFE0 +2080 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_534C +ENCODING 21324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2A80 +2A80 +2A80 +FFE0 +2A80 +2A80 +2A80 +2A80 +2A80 +2080 +ENDCHAR +STARTCHAR U_534D +ENCODING 21325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F880 +0880 +0880 +0880 +0880 +FF80 +8800 +8800 +8800 +8800 +8FC0 +ENDCHAR +STARTCHAR U_534E +ENCODING 21326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2280 +6300 +AE20 +2220 +21E0 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_534F +ENCODING 21327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +4F80 +E280 +4280 +4AC0 +52A0 +4480 +4480 +4A80 +5100 +ENDCHAR +STARTCHAR U_5350 +ENCODING 21328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4200 +4200 +4200 +4200 +7FE0 +0220 +0220 +0220 +0220 +FE20 +ENDCHAR +STARTCHAR U_5351 +ENCODING 21329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F80 +4480 +7F80 +4480 +7F80 +1400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5352 +ENCODING 21330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +1100 +2A80 +4440 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5353 +ENCODING 21331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_5354 +ENCODING 21332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2240 +FA40 +2480 +2480 +3FE0 +2AA0 +2AA0 +3320 +2440 +ENDCHAR +STARTCHAR U_5355 +ENCODING 21333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5356 +ENCODING 21334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1040 +2A80 +1200 +FFE0 +0200 +0D80 +7040 +ENDCHAR +STARTCHAR U_5357 +ENCODING 21335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +5140 +4A40 +7FC0 +4440 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5358 +ENCODING 21336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5359 +ENCODING 21337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FE80 +2480 +3C80 +27E0 +3C80 +2480 +FE80 +5480 +6280 +7E80 +ENDCHAR +STARTCHAR U_535A +ENCODING 21338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +5FE0 +4200 +EFC0 +4A40 +4FC0 +4A40 +7FE0 +4880 +4480 +4180 +ENDCHAR +STARTCHAR U_535B +ENCODING 21339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4EA0 +F1E0 +4E80 +F1E0 +0E00 +AAA0 +AEA0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_535C +ENCODING 21340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 4 -1 +BITMAP +80 +80 +80 +C0 +A0 +90 +8C +84 +80 +80 +80 +ENDCHAR +STARTCHAR U_535D +ENCODING 21341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1200 +1200 +1200 +F3E0 +1200 +1200 +1200 +1200 +1200 +ENDCHAR +STARTCHAR U_535E +ENCODING 21342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +0800 +0800 +0E00 +0980 +0880 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_535F +ENCODING 21343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +0200 +F200 +9200 +9300 +92C0 +9240 +F200 +9200 +0200 +0200 +ENDCHAR +STARTCHAR U_5360 +ENCODING 21344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1000 +1F80 +1000 +1000 +FF00 +8100 +8100 +8100 +FF00 +8100 +ENDCHAR +STARTCHAR U_5361 +ENCODING 21345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0F80 +0800 +0800 +FFE0 +0800 +0A00 +0900 +0880 +0800 +0800 +ENDCHAR +STARTCHAR U_5362 +ENCODING 21346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +3FC0 +2040 +2040 +3FC0 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5363 +ENCODING 21347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0FC0 +0800 +FF80 +8080 +FC80 +8480 +FC80 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_5364 +ENCODING 21348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0F80 +0800 +FF80 +A280 +9480 +8880 +9480 +A280 +FF80 +8080 +ENDCHAR +STARTCHAR U_5365 +ENCODING 21349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1F80 +1000 +FFC0 +A940 +9140 +AA40 +C440 +8A40 +9040 +FFC0 +ENDCHAR +STARTCHAR U_5366 +ENCODING 21350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +1100 +FD80 +1140 +1120 +7D20 +1100 +1D00 +E100 +ENDCHAR +STARTCHAR U_5367 +ENCODING 21351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +9100 +9100 +FD80 +8560 +8520 +FD00 +9100 +9100 +FD00 +0100 +ENDCHAR +STARTCHAR U_5368 +ENCODING 21352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +3F80 +2080 +3E80 +2280 +FFE0 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_5369 +ENCODING 21353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 5 -1 +BITMAP +F8 +88 +88 +88 +88 +88 +A8 +90 +80 +80 +80 +ENDCHAR +STARTCHAR U_536A +ENCODING 21354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +FE +82 +A2 +92 +92 +82 +92 +8C +80 +80 +80 +ENDCHAR +STARTCHAR U_536B +ENCODING 21355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +0880 +0880 +0880 +0A80 +0900 +0800 +0800 +0800 +FFC0 +ENDCHAR +STARTCHAR U_536C +ENCODING 21356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +8440 +8440 +8440 +8440 +9440 +A540 +C480 +0400 +0400 +ENDCHAR +STARTCHAR U_536D +ENCODING 21357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +2220 +2220 +2220 +2220 +2220 +3AA0 +C240 +0200 +0200 +ENDCHAR +STARTCHAR U_536E +ENCODING 21358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +3FE0 +2000 +2F80 +2880 +2880 +2B20 +4820 +87E0 +ENDCHAR +STARTCHAR U_536F +ENCODING 21359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E7C0 +8440 +9440 +9440 +9440 +B440 +D540 +1480 +2400 +C400 +ENDCHAR +STARTCHAR U_5370 +ENCODING 21360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E7C0 +8440 +8440 +F440 +8440 +8440 +9440 +E580 +8400 +0400 +ENDCHAR +STARTCHAR U_5371 +ENCODING 21361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2100 +7FE0 +2000 +2F80 +2880 +2880 +2B20 +4820 +87E0 +ENDCHAR +STARTCHAR U_5372 +ENCODING 21362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2520 +2520 +5920 +8120 +7D20 +45A0 +4540 +7D00 +4500 +ENDCHAR +STARTCHAR U_5373 +ENCODING 21363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FBC0 +8A40 +FA40 +8A40 +FA40 +8A40 +A240 +9340 +AA80 +CA00 +0200 +ENDCHAR +STARTCHAR U_5374 +ENCODING 21364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +11E0 +7D20 +1120 +1120 +FF20 +1120 +2120 +4D60 +7500 +0100 +ENDCHAR +STARTCHAR U_5375 +ENCODING 21365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +9440 +D440 +B540 +94C0 +9440 +F440 +15C0 +2400 +C400 +ENDCHAR +STARTCHAR U_5376 +ENCODING 21366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1D20 +2520 +6920 +1120 +2920 +DF20 +2320 +55E0 +0900 +7100 +ENDCHAR +STARTCHAR U_5377 +ENCODING 21367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +7FE0 +0800 +FFE0 +1080 +3F40 +D120 +1300 +1040 +1FC0 +ENDCHAR +STARTCHAR U_5378 +ENCODING 21368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +9120 +1120 +FF20 +1120 +5D20 +5120 +51A0 +5D40 +E100 +ENDCHAR +STARTCHAR U_5379 +ENCODING 21369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +20A0 +FEA0 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +AFE0 +F080 +0080 +ENDCHAR +STARTCHAR U_537A +ENCODING 21370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0100 +F640 +2580 +5480 +8860 +7FC0 +2100 +2640 +2040 +1FC0 +ENDCHAR +STARTCHAR U_537B +ENCODING 21371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +25E0 +5320 +9920 +2520 +4320 +BD20 +25A0 +2540 +3D00 +2500 +ENDCHAR +STARTCHAR U_537C +ENCODING 21372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +57E0 +5400 +55C0 +5540 +55C0 +5520 +59E0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_537D +ENCODING 21373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4000 +FBC0 +8A40 +FA40 +8A40 +FA40 +8240 +F240 +82C0 +B200 +C200 +ENDCHAR +STARTCHAR U_537E +ENCODING 21374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +B520 +FD20 +0120 +7920 +0120 +FDA0 +4140 +7900 +0900 +3100 +ENDCHAR +STARTCHAR U_537F +ENCODING 21375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +CAA0 +AEA0 +AAA0 +AEA0 +AAA0 +E8A0 +AAE0 +2D80 +4880 +8080 +ENDCHAR +STARTCHAR U_5380 +ENCODING 21376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +3920 +5520 +9120 +2920 +D720 +55A0 +3940 +5500 +B200 +ENDCHAR +STARTCHAR U_5381 +ENCODING 21377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +28C0 +5540 +B8C0 +5040 +5BE0 +B440 +7FC0 +0440 +05C0 +0400 +ENDCHAR +STARTCHAR U_5382 +ENCODING 21378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3FE0 +2000 +2000 +2000 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_5383 +ENCODING 21379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2080 +4100 +BFE0 +2000 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5384 +ENCODING 21380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2000 +2F80 +2880 +2880 +2880 +2B00 +4820 +4820 +87E0 +ENDCHAR +STARTCHAR U_5385 +ENCODING 21381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2000 +3FE0 +2100 +2100 +2100 +2100 +4100 +4100 +8700 +ENDCHAR +STARTCHAR U_5386 +ENCODING 21382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2200 +2200 +2FE0 +2220 +2220 +2420 +4420 +4820 +90C0 +ENDCHAR +STARTCHAR U_5387 +ENCODING 21383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +23C0 +2E00 +2200 +2200 +3FE0 +2200 +4220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5388 +ENCODING 21384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2100 +2100 +3FE0 +2100 +2100 +4100 +4100 +8100 +ENDCHAR +STARTCHAR U_5389 +ENCODING 21385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +3FE0 +2400 +2400 +27C0 +2440 +2440 +4840 +4840 +9180 +ENDCHAR +STARTCHAR U_538A +ENCODING 21386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4480 +4880 +5FE0 +4280 +4480 +4880 +9080 +A380 +ENDCHAR +STARTCHAR U_538B +ENCODING 21387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2200 +2200 +2200 +3FC0 +2200 +2280 +4240 +4200 +BFE0 +ENDCHAR +STARTCHAR U_538C +ENCODING 21388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4280 +4240 +5FE0 +4200 +4200 +4500 +4500 +8880 +B060 +ENDCHAR +STARTCHAR U_538D +ENCODING 21389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4400 +5FE0 +4800 +4A00 +5FC0 +4200 +7FE0 +8200 +8200 +ENDCHAR +STARTCHAR U_538E +ENCODING 21390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +5100 +5100 +5FE0 +5100 +5100 +5520 +9AA0 +9160 +ENDCHAR +STARTCHAR U_538F +ENCODING 21391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4800 +4800 +4FE0 +5400 +67C0 +4400 +4400 +47E0 +8400 +8400 +ENDCHAR +STARTCHAR U_5390 +ENCODING 21392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2480 +2440 +3FE0 +2400 +2540 +2540 +2580 +4B20 +5520 +A0E0 +ENDCHAR +STARTCHAR U_5391 +ENCODING 21393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4100 +4100 +5D60 +5580 +5500 +5500 +5520 +5D20 +8120 +80E0 +ENDCHAR +STARTCHAR U_5392 +ENCODING 21394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4800 +4FC0 +5200 +7FE0 +4200 +5240 +5240 +9FC0 +9040 +ENDCHAR +STARTCHAR U_5393 +ENCODING 21395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +5FC0 +4200 +7FE0 +4000 +4200 +5FC0 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5394 +ENCODING 21396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4400 +4880 +5FC0 +4240 +4F80 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5395 +ENCODING 21397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8000 +BE20 +A2A0 +AAA0 +AAA0 +AAA0 +AAA0 +AA20 +9420 +A2E0 +ENDCHAR +STARTCHAR U_5396 +ENCODING 21398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +4840 +7FE0 +4900 +4A80 +4940 +5680 +5520 +A620 +DBE0 +ENDCHAR +STARTCHAR U_5397 +ENCODING 21399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +4200 +7FE0 +4500 +4200 +7FE0 +4200 +5FC0 +8200 +8200 +ENDCHAR +STARTCHAR U_5398 +ENCODING 21400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FE0 +2920 +2FE0 +2920 +2FE0 +2100 +2FE0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_5399 +ENCODING 21401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +7FE0 +8200 +8200 +ENDCHAR +STARTCHAR U_539A +ENCODING 21402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2840 +2FC0 +2840 +2FC0 +2080 +3FE0 +4100 +8700 +ENDCHAR +STARTCHAR U_539B +ENCODING 21403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +41C0 +5D00 +5500 +55E0 +5540 +5D40 +4140 +8240 +8440 +ENDCHAR +STARTCHAR U_539C +ENCODING 21404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4080 +5F00 +4200 +5FC0 +4A80 +7FE0 +4A80 +5FE0 +8200 +9FC0 +ENDCHAR +STARTCHAR U_539D +ENCODING 21405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4480 +5FC0 +4480 +5FE0 +4000 +4FC0 +4840 +4FC0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_539E +ENCODING 21406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4500 +4500 +7DE0 +4500 +5DC0 +4500 +7DE0 +4500 +8500 +8500 +ENDCHAR +STARTCHAR U_539F +ENCODING 21407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FC0 +2200 +2A80 +5260 +A620 +ENDCHAR +STARTCHAR U_53A0 +ENCODING 21408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5E20 +52A0 +5EA0 +52A0 +5EA0 +52A0 +5E20 +5420 +A2E0 +ENDCHAR +STARTCHAR U_53A1 +ENCODING 21409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FC0 +2120 +5DC0 +4540 +9B20 +ENDCHAR +STARTCHAR U_53A2 +ENCODING 21410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +4800 +49E0 +7F20 +49E0 +4D20 +5BE0 +6920 +89E0 +8920 +ENDCHAR +STARTCHAR U_53A3 +ENCODING 21411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4280 +7FE0 +4880 +7FE0 +5240 +5FC0 +5240 +5FC0 +8200 +8200 +ENDCHAR +STARTCHAR U_53A4 +ENCODING 21412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5980 +4880 +7FE0 +4880 +4D80 +5AC0 +6AA0 +8880 +8880 +ENDCHAR +STARTCHAR U_53A5 +ENCODING 21413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5480 +4880 +7EE0 +4920 +6A80 +6A80 +7E80 +4880 +9140 +A220 +ENDCHAR +STARTCHAR U_53A6 +ENCODING 21414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FE0 +4840 +4F40 +4BC0 +4840 +4FC0 +4C80 +5300 +ACE0 +ENDCHAR +STARTCHAR U_53A7 +ENCODING 21415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +7FE0 +4880 +4F80 +4880 +4F80 +4880 +7FE0 +8880 +B060 +ENDCHAR +STARTCHAR U_53A8 +ENCODING 21416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4040 +5E40 +4040 +5DE0 +5440 +5540 +5CC0 +5440 +8E40 +B8C0 +ENDCHAR +STARTCHAR U_53A9 +ENCODING 21417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5DE0 +5440 +5D40 +5540 +5FE0 +5080 +5580 +9AA0 +8460 +ENDCHAR +STARTCHAR U_53AA +ENCODING 21418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2480 +2FE0 +2480 +2FE0 +2920 +2FE0 +2100 +4FE0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_53AB +ENCODING 21419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7C80 +49E0 +7E40 +4940 +7EC0 +5040 +5EA0 +52A0 +A720 +ENDCHAR +STARTCHAR U_53AC +ENCODING 21420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5040 +5FC0 +5040 +5FC0 +5280 +6CC0 +52A0 +6FE0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_53AD +ENCODING 21421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5EC0 +52A0 +5E80 +41E0 +5E80 +5280 +5E80 +9340 +9620 +ENDCHAR +STARTCHAR U_53AE +ENCODING 21422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5220 +7FC0 +5280 +5E80 +52E0 +5EA0 +52A0 +5FA0 +92A0 +A120 +ENDCHAR +STARTCHAR U_53AF +ENCODING 21423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7DE0 +4880 +5DC0 +6AA0 +4000 +5240 +6920 +A8A0 +8F80 +ENDCHAR +STARTCHAR U_53B0 +ENCODING 21424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +5A80 +4CE0 +5F20 +52A0 +5EA0 +5640 +5E40 +52A0 +9520 +ENDCHAR +STARTCHAR U_53B1 +ENCODING 21425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +4500 +4880 +7760 +4000 +5DC0 +5540 +5DC0 +8880 +9540 +ENDCHAR +STARTCHAR U_53B2 +ENCODING 21426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4480 +5FE0 +4480 +4FC0 +4A40 +4FC0 +4A40 +5FE0 +92A0 +9760 +ENDCHAR +STARTCHAR U_53B3 +ENCODING 21427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +7FE0 +4100 +5D00 +45E0 +7E40 +5540 +5D40 +5680 +7C80 +8560 +ENDCHAR +STARTCHAR U_53B4 +ENCODING 21428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54A0 +5FE0 +5480 +5FC0 +5260 +5FC0 +5240 +5FC0 +8200 +8200 +ENDCHAR +STARTCHAR U_53B5 +ENCODING 21429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4400 +5FC0 +5240 +5FC0 +8A80 +7FE0 +5240 +7FE0 +4AA0 +B5C0 +ENDCHAR +STARTCHAR U_53B6 +ENCODING 21430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0400 +0400 +0800 +0800 +1000 +1080 +2040 +41C0 +FE20 +4020 +ENDCHAR +STARTCHAR U_53B7 +ENCODING 21431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0800 +0900 +1100 +1200 +2280 +2440 +4FC0 +8840 +ENDCHAR +STARTCHAR U_53B8 +ENCODING 21432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2080 +2080 +2080 +4100 +5140 +5140 +4920 +FBE0 +4920 +ENDCHAR +STARTCHAR U_53B9 +ENCODING 21433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +FF00 +1100 +1140 +2140 +48C0 +8800 +1000 +2100 +FF80 +4080 +ENDCHAR +STARTCHAR U_53BA +ENCODING 21434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0A00 +1100 +2480 +C460 +0900 +1080 +23C0 +7C40 +ENDCHAR +STARTCHAR U_53BB +ENCODING 21435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0900 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_53BC +ENCODING 21436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +2080 +7FC0 +0040 +0400 +2480 +2440 +4420 +8420 +1C00 +ENDCHAR +STARTCHAR U_53BD +ENCODING 21437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1100 +2080 +7FC0 +0040 +2080 +2080 +4920 +FBE0 +0820 +ENDCHAR +STARTCHAR U_53BE +ENCODING 21438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +1080 +1080 +7C80 +1080 +1080 +FE80 +20A0 +44A0 +FE60 +4220 +ENDCHAR +STARTCHAR U_53BF +ENCODING 21439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +0800 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_53C0 +ENCODING 21440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +7F80 +4880 +7F80 +4880 +7F80 +1200 +2100 +7F80 +ENDCHAR +STARTCHAR U_53C1 +ENCODING 21441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0440 +FFE0 +2080 +DF60 +0000 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_53C2 +ENCODING 21442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0800 +FFE0 +2480 +D860 +0600 +1880 +0300 +3C00 +ENDCHAR +STARTCHAR U_53C3 +ENCODING 21443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3E80 +5140 +FFC0 +2080 +CC60 +3300 +0C80 +0300 +7C00 +ENDCHAR +STARTCHAR U_53C4 +ENCODING 21444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1200 +3F00 +2100 +4A40 +FFE0 +1120 +3F80 +C460 +0200 +7FC0 +ENDCHAR +STARTCHAR U_53C5 +ENCODING 21445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1F00 +1100 +2A80 +7FC0 +0A00 +3180 +C460 +2680 +4540 +0C00 +ENDCHAR +STARTCHAR U_53C6 +ENCODING 21446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +7700 +02A0 +07E0 +F520 +27E0 +2100 +51E0 +52A0 +FAC0 +0D20 +ENDCHAR +STARTCHAR U_53C7 +ENCODING 21447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +75E0 +04A0 +03E0 +F0A0 +4DE0 +46A0 +95C0 +F6A0 +1480 +0BE0 +ENDCHAR +STARTCHAR U_53C8 +ENCODING 21448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +1040 +1080 +0880 +0900 +0500 +0200 +0600 +1980 +E060 +ENDCHAR +STARTCHAR U_53C9 +ENCODING 21449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +7F00 +2900 +2500 +2200 +1200 +1400 +0800 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_53CA +ENCODING 21450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F00 +1100 +1200 +1200 +17C0 +1040 +2880 +2500 +4200 +4580 +9860 +ENDCHAR +STARTCHAR U_53CB +ENCODING 21451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +0800 +1F80 +1880 +2880 +2500 +4200 +8D80 +3060 +ENDCHAR +STARTCHAR U_53CC +ENCODING 21452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0A40 +4A40 +2A40 +1140 +1140 +2880 +4580 +8240 +0420 +ENDCHAR +STARTCHAR U_53CD +ENCODING 21453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3E00 +2000 +2000 +3FC0 +2880 +2500 +2200 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_53CE +ENCODING 21454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +9FC0 +9440 +9440 +9280 +9280 +B100 +D100 +1280 +1440 +1820 +ENDCHAR +STARTCHAR U_53CF +ENCODING 21455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +0880 +FFE0 +0800 +7F80 +2080 +1300 +0C00 +3300 +C0E0 +ENDCHAR +STARTCHAR U_53D0 +ENCODING 21456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0800 +FFE0 +0800 +1F80 +1880 +2500 +2200 +4D00 +B0E0 +ENDCHAR +STARTCHAR U_53D1 +ENCODING 21457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2440 +4400 +7FE0 +0800 +0F80 +0880 +1500 +2200 +4580 +9860 +ENDCHAR +STARTCHAR U_53D2 +ENCODING 21458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +2080 +1100 +0E00 +F1C0 +0000 +FBC0 +4940 +4940 +3080 +CB60 +ENDCHAR +STARTCHAR U_53D3 +ENCODING 21459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +0400 +7FC0 +1100 +0E00 +71E0 +ENDCHAR +STARTCHAR U_53D4 +ENCODING 21460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13C0 +1C40 +1140 +FF40 +1140 +5540 +5280 +9280 +9140 +3220 +ENDCHAR +STARTCHAR U_53D5 +ENCODING 21461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A20 +5140 +2080 +5360 +8C20 +F7C0 +5240 +2180 +5240 +8C20 +ENDCHAR +STARTCHAR U_53D6 +ENCODING 21462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +4A20 +7A20 +4940 +7940 +4880 +4C80 +F940 +0A40 +0C20 +ENDCHAR +STARTCHAR U_53D7 +ENCODING 21463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +7C80 +2900 +1500 +FFC0 +8040 +3F00 +1200 +0C00 +1300 +E0C0 +ENDCHAR +STARTCHAR U_53D8 +ENCODING 21464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +1200 +5280 +9240 +0000 +7F80 +1200 +0C00 +1200 +E1C0 +ENDCHAR +STARTCHAR U_53D9 +ENCODING 21465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BE0 +4520 +BB20 +1120 +7D40 +1140 +5880 +5540 +9240 +3420 +ENDCHAR +STARTCHAR U_53DA +ENCODING 21466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8820 +8820 +FBE0 +8000 +FBE0 +8220 +8140 +F880 +8140 +8620 +ENDCHAR +STARTCHAR U_53DB +ENCODING 21467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AB00 +7200 +2200 +FBE0 +2240 +FA40 +2540 +2480 +4940 +9620 +ENDCHAR +STARTCHAR U_53DC +ENCODING 21468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9420 +1580 +2600 +1980 +E060 +1F80 +0900 +0600 +79C0 +ENDCHAR +STARTCHAR U_53DD +ENCODING 21469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FAA0 +2240 +2200 +FBE0 +22A0 +42A0 +4A40 +FAA0 +0320 +ENDCHAR +STARTCHAR U_53DE +ENCODING 21470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +47C0 +7D40 +4140 +7D40 +4140 +7F40 +4880 +AC80 +AB40 +5A20 +ENDCHAR +STARTCHAR U_53DF +ENCODING 21471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +65C0 +4440 +75C0 +4440 +7FC0 +0400 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_53E0 +ENCODING 21472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0A00 +1500 +FFE0 +5280 +AD40 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_53E1 +ENCODING 21473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C00 +21E0 +FD20 +4920 +B520 +4940 +FD40 +4880 +7980 +4A40 +7C20 +ENDCHAR +STARTCHAR U_53E2 +ENCODING 21474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FFE0 +1200 +7FC0 +0400 +FFE0 +4540 +7D40 +4480 +FD40 +0620 +ENDCHAR +STARTCHAR U_53E3 +ENCODING 21475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_53E4 +ENCODING 21476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +0400 +3F80 +2080 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_53E5 +ENCODING 21477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +2020 +4020 +BE20 +2220 +2220 +3E20 +2220 +0020 +00C0 +ENDCHAR +STARTCHAR U_53E6 +ENCODING 21478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2480 +0400 +7FC0 +0840 +1040 +2040 +C380 +ENDCHAR +STARTCHAR U_53E7 +ENCODING 21479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F80 +4080 +4080 +7F80 +0000 +FF80 +0880 +0880 +1080 +2080 +C700 +ENDCHAR +STARTCHAR U_53E8 +ENCODING 21480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F220 +9220 +9220 +9220 +9220 +F220 +9420 +0420 +0820 +30C0 +ENDCHAR +STARTCHAR U_53E9 +ENCODING 21481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +07C0 +F440 +9440 +9440 +9440 +9440 +F440 +9440 +05C0 +0400 +0400 +ENDCHAR +STARTCHAR U_53EA +ENCODING 21482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2080 +2080 +2080 +2080 +3F80 +2080 +1100 +2080 +4040 +8040 +ENDCHAR +STARTCHAR U_53EB +ENCODING 21483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0040 +0440 +F440 +9440 +9440 +9440 +95C0 +F640 +0040 +0040 +0040 +ENDCHAR +STARTCHAR U_53EC +ENCODING 21484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +1080 +1080 +1080 +2280 +4100 +FF80 +4080 +4080 +4080 +7F80 +ENDCHAR +STARTCHAR U_53ED +ENCODING 21485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F280 +9280 +9280 +9280 +9280 +F240 +0440 +0440 +0820 +1020 +ENDCHAR +STARTCHAR U_53EE +ENCODING 21486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F080 +9080 +9080 +9080 +9080 +F080 +9080 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U_53EF +ENCODING 21487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0080 +3C80 +2480 +2480 +3C80 +2480 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U_53F0 +ENCODING 21488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1000 +2200 +4100 +FF80 +0080 +7F00 +4100 +4100 +4100 +7F00 +ENDCHAR +STARTCHAR U_53F1 +ENCODING 21489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +9220 +9240 +9280 +9300 +9600 +F200 +9220 +0220 +01E0 +ENDCHAR +STARTCHAR U_53F2 +ENCODING 21490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +4440 +7FC0 +2400 +1400 +0800 +1600 +E1E0 +ENDCHAR +STARTCHAR U_53F3 +ENCODING 21491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0800 +1000 +1F80 +3080 +5080 +9080 +1F80 +1080 +ENDCHAR +STARTCHAR U_53F4 +ENCODING 21492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +0900 +0900 +1120 +20E0 +C000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_53F5 +ENCODING 21493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +8000 +8000 +9F00 +9100 +9100 +9F00 +9100 +8000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_53F6 +ENCODING 21494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9100 +9100 +9FE0 +9100 +F100 +9100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_53F7 +ENCODING 21495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +FFE0 +0800 +1F80 +0080 +0080 +0480 +0300 +ENDCHAR +STARTCHAR U_53F8 +ENCODING 21496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +0040 +FF40 +0040 +7E40 +4240 +4240 +7E40 +0040 +0040 +0380 +ENDCHAR +STARTCHAR U_53F9 +ENCODING 21497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F440 +9440 +9240 +9280 +9280 +F100 +9100 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_53FA +ENCODING 21498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +F200 +9200 +9200 +9200 +F500 +8500 +0880 +1040 +2020 +ENDCHAR +STARTCHAR U_53FB +ENCODING 21499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97E0 +9120 +9120 +9120 +F120 +9220 +0220 +0420 +08C0 +ENDCHAR +STARTCHAR U_53FC +ENCODING 21500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F020 +9020 +90A0 +9120 +9220 +F420 +9820 +0020 +0020 +00C0 +ENDCHAR +STARTCHAR U_53FD +ENCODING 21501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +9480 +9480 +9480 +9480 +F480 +9480 +04A0 +08A0 +10E0 +ENDCHAR +STARTCHAR U_53FE +ENCODING 21502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0200 +0400 +0400 +1400 +0800 +0000 +FF80 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR U_53FF +ENCODING 21503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +1FC0 +E200 +A200 +A200 +A200 +A200 +E200 +0200 +0200 +3FE0 +ENDCHAR +STARTCHAR U_5400 +ENCODING 21504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0F00 +0100 +F100 +9100 +9FE0 +9100 +9100 +F100 +0100 +0100 +ENDCHAR +STARTCHAR U_5401 +ENCODING 21505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +9FE0 +9100 +F100 +9100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_5402 +ENCODING 21506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +2000 +2000 +3FC0 +0000 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5403 +ENCODING 21507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9800 +97C0 +9080 +9100 +F200 +9420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5404 +ENCODING 21508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +3080 +4900 +0600 +0900 +3080 +DFE0 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_5405 +ENCODING 21509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +F780 +9480 +9480 +9480 +9480 +9480 +9480 +9480 +F780 +9480 +ENDCHAR +STARTCHAR U_5406 +ENCODING 21510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9240 +9240 +9480 +9F80 +9100 +F240 +9420 +0FE0 +0420 +ENDCHAR +STARTCHAR U_5407 +ENCODING 21511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F040 +9080 +9100 +9FE0 +9100 +9100 +F100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_5408 +ENCODING 21512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0000 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5409 +ENCODING 21513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +7FC0 +0000 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_540A +ENCODING 21514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +0800 +FF80 +8880 +8880 +8880 +8980 +0800 +ENDCHAR +STARTCHAR U_540B +ENCODING 21515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +9FE0 +9080 +9480 +9280 +9280 +F080 +0080 +0080 +0380 +ENDCHAR +STARTCHAR U_540C +ENCODING 21516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +8040 +BF40 +8040 +9E40 +9240 +9240 +9E40 +9240 +8040 +80C0 +ENDCHAR +STARTCHAR U_540D +ENCODING 21517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1FC0 +1080 +2900 +4600 +0400 +1FC0 +F040 +1040 +1040 +1FC0 +ENDCHAR +STARTCHAR U_540E +ENCODING 21518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3E00 +2000 +3FE0 +2000 +2000 +2FC0 +2840 +4840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_540F +ENCODING 21519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +2400 +1400 +0800 +1600 +E1E0 +ENDCHAR +STARTCHAR U_5410 +ENCODING 21520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9100 +97C0 +9100 +9100 +F100 +9100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5411 +ENCODING 21521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +1000 +FFC0 +8040 +9E40 +9240 +9240 +9E40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_5412 +ENCODING 21522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0700 +F100 +9100 +91E0 +9F00 +9100 +F100 +9120 +0120 +00E0 +ENDCHAR +STARTCHAR U_5413 +ENCODING 21523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9100 +9100 +9180 +9140 +F120 +9120 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5414 +ENCODING 21524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0A00 +EAC0 +AB40 +AE40 +BA40 +AA40 +EAC0 +0A20 +0820 +07E0 +ENDCHAR +STARTCHAR U_5415 +ENCODING 21525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +4100 +0000 +FF80 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR U_5416 +ENCODING 21526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +0440 +F280 +9100 +9100 +9100 +9100 +F100 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_5417 +ENCODING 21527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F040 +9240 +9240 +9440 +97E0 +9020 +9FA0 +F020 +0020 +01C0 +ENDCHAR +STARTCHAR U_5418 +ENCODING 21528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7C0 +A900 +B100 +A100 +BFE0 +A100 +E100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5419 +ENCODING 21529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +E240 +AA40 +AA80 +B200 +A300 +E480 +0480 +0840 +1060 +ENDCHAR +STARTCHAR U_541A +ENCODING 21530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E240 +A240 +BFE0 +A240 +A240 +EFC0 +0400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_541B +ENCODING 21531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0440 +FFE0 +0840 +3FC0 +1000 +2000 +5FC0 +9040 +1040 +1FC0 +ENDCHAR +STARTCHAR U_541C +ENCODING 21532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F240 +9240 +9240 +9240 +97C0 +9240 +F240 +0240 +0240 +1FE0 +ENDCHAR +STARTCHAR U_541D +ENCODING 21533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFC0 +2100 +1200 +0C00 +1200 +6180 +BF60 +2100 +2100 +3F00 +ENDCHAR +STARTCHAR U_541E +ENCODING 21534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +1100 +2080 +7FC0 +A0A0 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_541F +ENCODING 21535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +9A20 +9100 +97C0 +F040 +9080 +0100 +0200 +ENDCHAR +STARTCHAR U_5420 +ENCODING 21536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F140 +9120 +9FE0 +9100 +9100 +F280 +9280 +0440 +0840 +1020 +ENDCHAR +STARTCHAR U_5421 +ENCODING 21537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +E900 +A900 +A920 +AFC0 +A900 +A900 +E900 +AB20 +0D20 +08E0 +ENDCHAR +STARTCHAR U_5422 +ENCODING 21538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +5220 +52A0 +9080 +0F80 +0000 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5423 +ENCODING 21539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0080 +E080 +A200 +A240 +AA20 +AA20 +B200 +E220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5424 +ENCODING 21540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +9CA0 +9480 +F480 +9480 +0480 +0880 +1080 +ENDCHAR +STARTCHAR U_5425 +ENCODING 21541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F080 +9080 +9100 +9380 +9540 +9920 +F100 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_5426 +ENCODING 21542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0D80 +3440 +C420 +0400 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5427 +ENCODING 21543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E940 +A940 +A940 +A940 +AFC0 +E800 +A800 +0820 +0820 +07E0 +ENDCHAR +STARTCHAR U_5428 +ENCODING 21544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +BFE0 +A200 +AA40 +AA40 +EFC0 +0200 +0220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5429 +ENCODING 21545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +9440 +9820 +97C0 +F240 +9240 +0440 +0840 +1180 +ENDCHAR +STARTCHAR U_542A +ENCODING 21546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +A920 +A940 +B980 +A900 +AB00 +ED00 +A920 +0920 +08E0 +ENDCHAR +STARTCHAR U_542B +ENCODING 21547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1900 +2480 +FFE0 +0100 +0200 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_542C +ENCODING 21548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +9400 +97E0 +9480 +F480 +0480 +0880 +1080 +2080 +ENDCHAR +STARTCHAR U_542D +ENCODING 21549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9000 +9780 +9480 +9480 +F480 +04A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_542E +ENCODING 21550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +9440 +9FE0 +9020 +9480 +F480 +9480 +04A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_542F +ENCODING 21551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +3FC0 +2040 +2040 +3FC0 +2000 +3FC0 +3040 +5040 +5FC0 +9040 +ENDCHAR +STARTCHAR U_5430 +ENCODING 21552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFE0 +A200 +A280 +A480 +A480 +E900 +0A40 +17E0 +2220 +ENDCHAR +STARTCHAR U_5431 +ENCODING 21553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +97C0 +9440 +F280 +9100 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_5432 +ENCODING 21554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F20 +E120 +A120 +AF20 +A820 +AF20 +A120 +E120 +0120 +0920 +0620 +ENDCHAR +STARTCHAR U_5433 +ENCODING 21555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +2880 +2880 +2F80 +2000 +3FC0 +0440 +7FE0 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_5434 +ENCODING 21556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0000 +3FC0 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5435 +ENCODING 21557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A540 +A520 +A900 +B120 +A140 +E080 +0100 +0600 +1800 +ENDCHAR +STARTCHAR U_5436 +ENCODING 21558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A920 +A920 +A920 +AAA0 +EC60 +0820 +08A0 +0840 +ENDCHAR +STARTCHAR U_5437 +ENCODING 21559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFC0 +A240 +A240 +BFE0 +A200 +E200 +0500 +0880 +3060 +ENDCHAR +STARTCHAR U_5438 +ENCODING 21560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E480 +A480 +A480 +A5E0 +A440 +EA40 +0A80 +1100 +2280 +4C60 +ENDCHAR +STARTCHAR U_5439 +ENCODING 21561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9420 +9940 +9100 +9100 +F280 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_543A +ENCODING 21562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A480 +A4E0 +A800 +B7C0 +E440 +A280 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_543B +ENCODING 21563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +F7E0 +9AA0 +92A0 +94A0 +9520 +F920 +0220 +04A0 +1840 +ENDCHAR +STARTCHAR U_543C +ENCODING 21564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E80 +E280 +A480 +A480 +A480 +A680 +BC80 +E480 +04A0 +14A0 +0860 +ENDCHAR +STARTCHAR U_543D +ENCODING 21565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +9500 +97C0 +9900 +9100 +9FE0 +F100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_543E +ENCODING 21566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +0880 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_543F +ENCODING 21567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5440 +ENCODING 21568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E480 +A480 +A880 +AFE0 +A180 +E280 +A480 +0880 +3080 +0180 +ENDCHAR +STARTCHAR U_5441 +ENCODING 21569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9420 +9820 +9220 +90A0 +9120 +F220 +0C20 +0020 +00E0 +ENDCHAR +STARTCHAR U_5442 +ENCODING 21570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +0800 +1000 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_5443 +ENCODING 21571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A800 +ABC0 +AA40 +AA40 +AA40 +EA40 +AAC0 +0A20 +1220 +21E0 +ENDCHAR +STARTCHAR U_5444 +ENCODING 21572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13C0 +2040 +4480 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5445 +ENCODING 21573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9440 +9440 +9280 +9280 +F100 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_5446 +ENCODING 21574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_5447 +ENCODING 21575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0480 +F500 +1600 +2500 +54C0 +8800 +7F00 +4100 +4100 +7F00 +4100 +ENDCHAR +STARTCHAR U_5448 +ENCODING 21576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0000 +7FC0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5449 +ENCODING 21577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +5080 +5080 +5F80 +4000 +7F80 +0080 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_544A +ENCODING 21578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_544B +ENCODING 21579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9100 +9FE0 +F100 +9100 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_544C +ENCODING 21580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +E480 +A280 +A880 +A480 +A0E0 +E380 +AC80 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_544D +ENCODING 21581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F000 +9000 +9000 +9FE0 +9100 +9200 +F280 +8440 +09E0 +0E20 +ENDCHAR +STARTCHAR U_544E +ENCODING 21582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +9500 +F500 +9480 +0880 +1040 +2020 +ENDCHAR +STARTCHAR U_544F +ENCODING 21583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EC80 +A480 +A480 +BFE0 +A480 +E480 +A880 +0880 +1080 +2080 +ENDCHAR +STARTCHAR U_5450 +ENCODING 21584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +EFE0 +A920 +A920 +A9A0 +AA60 +EC20 +A820 +0820 +0860 +ENDCHAR +STARTCHAR U_5451 +ENCODING 21585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +0A00 +3180 +C060 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5452 +ENCODING 21586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +9FE0 +9280 +F280 +9480 +04A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_5453 +ENCODING 21587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9000 +9FC0 +9080 +9100 +F200 +9420 +0820 +07E0 +ENDCHAR +STARTCHAR U_5454 +ENCODING 21588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A100 +AFE0 +A100 +A100 +A280 +E280 +A640 +0940 +1020 +ENDCHAR +STARTCHAR U_5455 +ENCODING 21589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +A840 +AA40 +A980 +A880 +A980 +EA40 +AC40 +0800 +0FE0 +ENDCHAR +STARTCHAR U_5456 +ENCODING 21590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E900 +A900 +ABE0 +A920 +A920 +E920 +A920 +0920 +1220 +24C0 +ENDCHAR +STARTCHAR U_5457 +ENCODING 21591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9520 +9520 +9520 +9520 +F520 +9520 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_5458 +ENCODING 21592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +0000 +7FC0 +4040 +4440 +4440 +4A40 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5459 +ENCODING 21593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +0800 +FF80 +8880 +9480 +A280 +8080 +8180 +ENDCHAR +STARTCHAR U_545A +ENCODING 21594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F200 +97E0 +9480 +9A80 +9280 +F100 +8100 +0280 +1C60 +ENDCHAR +STARTCHAR U_545B +ENCODING 21595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9820 +97C0 +9440 +9440 +F580 +9420 +0420 +03E0 +ENDCHAR +STARTCHAR U_545C +ENCODING 21596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +9440 +9580 +9400 +F7E0 +9020 +0FA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_545D +ENCODING 21597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0200 +EF80 +A880 +AF80 +A800 +EB80 +9100 +1200 +2440 +47C0 +ENDCHAR +STARTCHAR U_545E +ENCODING 21598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +1FC0 +0040 +EF40 +A040 +AF40 +A940 +EF40 +A040 +0040 +01C0 +ENDCHAR +STARTCHAR U_545F +ENCODING 21599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0200 +EFC0 +A200 +A480 +A880 +EF00 +A200 +8480 +0FC0 +0040 +ENDCHAR +STARTCHAR U_5460 +ENCODING 21600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +9380 +9540 +F920 +97C0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5461 +ENCODING 21601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +A840 +AFC0 +A900 +AFE0 +E900 +A900 +0AA0 +0C60 +0820 +ENDCHAR +STARTCHAR U_5462 +ENCODING 21602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +A840 +AFC0 +A800 +AA20 +EAC0 +AB00 +0A20 +1220 +61E0 +ENDCHAR +STARTCHAR U_5463 +ENCODING 21603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AA40 +A940 +BFE0 +A840 +AA40 +E940 +AFE0 +0040 +0180 +ENDCHAR +STARTCHAR U_5464 +ENCODING 21604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +A840 +B220 +A100 +AFC0 +E040 +A480 +0300 +0100 +0080 +ENDCHAR +STARTCHAR U_5465 +ENCODING 21605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +9540 +97C0 +9540 +FFE0 +9440 +0440 +0440 +04C0 +ENDCHAR +STARTCHAR U_5466 +ENCODING 21606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A5E0 +AAA0 +AEA0 +A2A0 +A4A0 +EAA0 +1D20 +02A0 +0440 +ENDCHAR +STARTCHAR U_5467 +ENCODING 21607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +F780 +9480 +9480 +97E0 +9480 +F480 +9480 +05A0 +0760 +04A0 +ENDCHAR +STARTCHAR U_5468 +ENCODING 21608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +2FA0 +2220 +3FE0 +2020 +2FA0 +28A0 +4FA0 +4020 +8060 +ENDCHAR +STARTCHAR U_5469 +ENCODING 21609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +0F80 +E000 +BFC0 +A200 +AA80 +EA40 +AA40 +1240 +0200 +0600 +ENDCHAR +STARTCHAR U_546A +ENCODING 21610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +97C0 +9280 +9280 +F280 +92A0 +04A0 +08E0 +ENDCHAR +STARTCHAR U_546B +ENCODING 21611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F1E0 +9100 +9100 +97C0 +9440 +F440 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_546C +ENCODING 21612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AAA0 +AAA0 +AAA0 +AAA0 +ECE0 +A820 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_546D +ENCODING 21613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EA80 +AA80 +AA80 +BFE0 +AA80 +AA80 +EA80 +AB80 +0800 +0FE0 +ENDCHAR +STARTCHAR U_546E +ENCODING 21614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +07E0 +F420 +9420 +9420 +97E0 +9000 +F240 +0240 +0420 +0820 +ENDCHAR +STARTCHAR U_546F +ENCODING 21615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +A920 +A540 +A540 +AFE0 +E100 +A100 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5470 +ENCODING 21616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5160 +5D80 +5120 +5D20 +E0E0 +1F80 +1080 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5471 +ENCODING 21617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +AA80 +AA80 +AA80 +AA80 +EA40 +AA40 +0AA0 +13A0 +26A0 +ENDCHAR +STARTCHAR U_5472 +ENCODING 21618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +A280 +ABA0 +AAC0 +AA80 +EA80 +AA80 +0BA0 +0CA0 +1060 +ENDCHAR +STARTCHAR U_5473 +ENCODING 21619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9FE0 +9100 +F380 +9540 +0920 +1120 +0100 +ENDCHAR +STARTCHAR U_5474 +ENCODING 21620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9820 +9020 +97A0 +94A0 +F4A0 +97A0 +0020 +0020 +00C0 +ENDCHAR +STARTCHAR U_5475 +ENCODING 21621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F040 +9040 +9740 +9540 +9540 +F740 +9540 +0040 +0040 +01C0 +ENDCHAR +STARTCHAR U_5476 +ENCODING 21622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5E0 +BEA0 +AAA0 +AAA0 +AAA0 +EAA0 +A440 +0AC0 +1120 +2220 +ENDCHAR +STARTCHAR U_5477 +ENCODING 21623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +A920 +AFE0 +A920 +A920 +EFE0 +A920 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5478 +ENCODING 21624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +0FE0 +F080 +9100 +9340 +9520 +9920 +9100 +F100 +0000 +1FE0 +ENDCHAR +STARTCHAR U_5479 +ENCODING 21625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0A00 +EFC0 +B200 +A200 +BFE0 +E200 +0500 +0480 +0840 +3020 +ENDCHAR +STARTCHAR U_547A +ENCODING 21626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +9000 +9FE0 +F200 +97C0 +0040 +0040 +0180 +ENDCHAR +STARTCHAR U_547B +ENCODING 21627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +AFE0 +A920 +AFE0 +A920 +A920 +EFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_547C +ENCODING 21628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A120 +A920 +A540 +BFE0 +E100 +A100 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_547D +ENCODING 21629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +EEE0 +0000 +7BC0 +4A40 +4A40 +7A40 +4AC0 +0200 +ENDCHAR +STARTCHAR U_547E +ENCODING 21630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +A840 +A840 +AFC0 +A840 +A840 +EFC0 +A840 +0000 +1FE0 +ENDCHAR +STARTCHAR U_547F +ENCODING 21631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9100 +9FE0 +F100 +9200 +0440 +0FE0 +0420 +ENDCHAR +STARTCHAR U_5480 +ENCODING 21632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +9440 +9440 +F7C0 +9440 +0440 +0440 +1FE0 +ENDCHAR +STARTCHAR U_5481 +ENCODING 21633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F440 +9FE0 +9440 +9440 +97C0 +F440 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5482 +ENCODING 21634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E880 +A880 +ABE0 +AAA0 +AAA0 +EAA0 +AAE0 +0880 +0880 +0FE0 +ENDCHAR +STARTCHAR U_5483 +ENCODING 21635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A4A0 +AAE0 +BBA0 +AEA0 +AAA0 +EAE0 +AA80 +0A20 +0BE0 +ENDCHAR +STARTCHAR U_5484 +ENCODING 21636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E540 +A540 +A540 +A7C0 +A100 +A920 +E920 +0920 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5485 +ENCODING 21637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +1080 +0900 +FFE0 +0000 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5486 +ENCODING 21638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +E820 +B7A0 +A4A0 +A4A0 +A7A0 +E440 +A400 +0420 +03E0 +ENDCHAR +STARTCHAR U_5487 +ENCODING 21639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +0140 +E440 +A480 +A480 +AD40 +B520 +E620 +0440 +0C40 +33C0 +ENDCHAR +STARTCHAR U_5488 +ENCODING 21640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A2A0 +AFE0 +AA80 +AA80 +EFE0 +A2A0 +04E0 +0880 +1080 +ENDCHAR +STARTCHAR U_5489 +ENCODING 21641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +AFE0 +A920 +A920 +A920 +BFE0 +E100 +A280 +0440 +0820 +ENDCHAR +STARTCHAR U_548A +ENCODING 21642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +F780 +9100 +9100 +9FE0 +9100 +9380 +F340 +9520 +0920 +0100 +ENDCHAR +STARTCHAR U_548B +ENCODING 21643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E400 +A7E0 +AA00 +B3C0 +A200 +E200 +A3C0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_548C +ENCODING 21644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +7000 +11E0 +FD20 +1120 +3920 +3520 +5520 +9120 +11E0 +1000 +ENDCHAR +STARTCHAR U_548D +ENCODING 21645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +9440 +9FE0 +9420 +9000 +97C0 +F440 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_548E +ENCODING 21646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D80 +4540 +A520 +1900 +27E0 +C000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_548F +ENCODING 21647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +F000 +9700 +9120 +9F40 +9580 +F580 +9540 +0920 +1120 +0700 +ENDCHAR +STARTCHAR U_5490 +ENCODING 21648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F240 +9440 +97E0 +9C40 +9540 +F4C0 +9440 +0440 +0440 +05C0 +ENDCHAR +STARTCHAR U_5491 +ENCODING 21649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E5E0 +BE40 +A440 +A440 +A640 +EC40 +B440 +0440 +0440 +0CC0 +ENDCHAR +STARTCHAR U_5492 +ENCODING 21650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +9240 +F3C0 +0000 +1E00 +1200 +1200 +1240 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5493 +ENCODING 21651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F200 +9200 +9380 +9280 +9480 +9680 +F580 +94A0 +05A0 +0EE0 +ENDCHAR +STARTCHAR U_5494 +ENCODING 21652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E3C0 +A200 +A200 +BFE0 +A200 +E300 +A280 +0240 +0200 +0200 +ENDCHAR +STARTCHAR U_5495 +ENCODING 21653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +9100 +97C0 +F440 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5496 +ENCODING 21654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FEE0 +AAA0 +AAA0 +AAA0 +AAA0 +EAA0 +AAA0 +12E0 +2600 +ENDCHAR +STARTCHAR U_5497 +ENCODING 21655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9200 +9200 +9200 +97C0 +F480 +9480 +0880 +17E0 +ENDCHAR +STARTCHAR U_5498 +ENCODING 21656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +BFE0 +A500 +A500 +AFC0 +B540 +E540 +A540 +05C0 +0100 +ENDCHAR +STARTCHAR U_5499 +ENCODING 21657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E440 +A400 +BFE0 +A500 +A540 +E580 +A900 +0B20 +1520 +21E0 +ENDCHAR +STARTCHAR U_549A +ENCODING 21658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E3C0 +A440 +AA80 +A100 +A280 +EC60 +B300 +0080 +0600 +0180 +ENDCHAR +STARTCHAR U_549B +ENCODING 21659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A000 +AFE0 +A100 +A100 +E100 +A100 +0100 +0700 +ENDCHAR +STARTCHAR U_549C +ENCODING 21660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +97E0 +9820 +9200 +9240 +9380 +F200 +9200 +0220 +01E0 +ENDCHAR +STARTCHAR U_549D +ENCODING 21661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E440 +A880 +A880 +B320 +BDC0 +A440 +E880 +1EE0 +0000 +1FE0 +ENDCHAR +STARTCHAR U_549E +ENCODING 21662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +9240 +9240 +9240 +9FE0 +9240 +F240 +9240 +0240 +0440 +ENDCHAR +STARTCHAR U_549F +ENCODING 21663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +9080 +9100 +97E0 +9420 +9420 +F7E0 +9420 +0420 +07E0 +ENDCHAR +STARTCHAR U_54A0 +ENCODING 21664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2100 +FFC0 +2100 +3F00 +2100 +3F00 +21C0 +FF00 +0100 +ENDCHAR +STARTCHAR U_54A1 +ENCODING 21665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F440 +97C0 +9440 +9440 +97C0 +F440 +9460 +07C0 +0C40 +0040 +ENDCHAR +STARTCHAR U_54A2 +ENCODING 21666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +3F80 +0000 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_54A3 +ENCODING 21667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F520 +9540 +9100 +9FE0 +9280 +F280 +9280 +04A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_54A4 +ENCODING 21668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9820 +90C0 +9700 +9120 +F1C0 +9700 +0120 +0120 +00E0 +ENDCHAR +STARTCHAR U_54A5 +ENCODING 21669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9200 +9440 +9FE0 +9020 +F100 +97C0 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_54A6 +ENCODING 21670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +A120 +AFE0 +E900 +AFE0 +0120 +0680 +1860 +ENDCHAR +STARTCHAR U_54A7 +ENCODING 21671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F20 +E420 +A6A0 +AAA0 +B2A0 +AAA0 +EAA0 +A4A0 +0420 +0820 +10E0 +ENDCHAR +STARTCHAR U_54A8 +ENCODING 21672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +1540 +2900 +C280 +4460 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_54A9 +ENCODING 21673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9100 +9100 +97C0 +F100 +9100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_54AA +ENCODING 21674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9540 +9FE0 +9100 +F380 +9540 +0920 +1120 +0100 +ENDCHAR +STARTCHAR U_54AB +ENCODING 21675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +4A20 +7BE0 +5000 +5140 +4A20 +4420 +8300 +80E0 +ENDCHAR +STARTCHAR U_54AC +ENCODING 21676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9440 +9AA0 +9280 +F280 +9100 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_54AD +ENCODING 21677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +9100 +97C0 +9000 +F7C0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54AE +ENCODING 21678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +A7C0 +A900 +A100 +AFE0 +E100 +A380 +0540 +0920 +1120 +ENDCHAR +STARTCHAR U_54AF +ENCODING 21679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9440 +9A80 +9100 +9280 +FFE0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54B0 +ENCODING 21680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A820 +A7A0 +A4A0 +A7A0 +E4A0 +A7A0 +04A0 +0020 +00C0 +ENDCHAR +STARTCHAR U_54B1 +ENCODING 21681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0100 +0200 +EFC0 +A840 +AFC0 +A840 +AFC0 +A840 +E840 +0FC0 +0840 +ENDCHAR +STARTCHAR U_54B2 +ENCODING 21682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0240 +E280 +AFE0 +A100 +A100 +BFE0 +E100 +8280 +0440 +0820 +ENDCHAR +STARTCHAR U_54B3 +ENCODING 21683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +A200 +A480 +AF00 +E240 +A480 +1980 +0240 +1C20 +ENDCHAR +STARTCHAR U_54B4 +ENCODING 21684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A200 +A280 +A4A0 +A5A0 +EAC0 +A880 +1180 +2240 +0C20 +ENDCHAR +STARTCHAR U_54B5 +ENCODING 21685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E500 +A880 +B740 +A020 +BFC0 +E400 +8780 +0080 +0300 +ENDCHAR +STARTCHAR U_54B6 +ENCODING 21686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +9FE0 +9100 +9100 +F7C0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54B7 +ENCODING 21687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +02A0 +EAC0 +A680 +A280 +A6C0 +AAA0 +E280 +A4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_54B8 +ENCODING 21688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +7FE0 +4100 +5D40 +4140 +5D80 +5480 +5DA0 +4260 +8C20 +ENDCHAR +STARTCHAR U_54B9 +ENCODING 21689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A820 +A200 +AFE0 +A280 +E680 +A180 +0240 +0C20 +ENDCHAR +STARTCHAR U_54BA +ENCODING 21690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F000 +97C0 +9440 +9440 +97C0 +9440 +F7C0 +0440 +0000 +1FE0 +ENDCHAR +STARTCHAR U_54BB +ENCODING 21691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A880 +AFE0 +A880 +B880 +A9C0 +EAA0 +ACA0 +0880 +0880 +ENDCHAR +STARTCHAR U_54BC +ENCODING 21692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2480 +2480 +FFE0 +8020 +9F20 +9120 +9F20 +8060 +ENDCHAR +STARTCHAR U_54BD +ENCODING 21693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A920 +AFE0 +A920 +A920 +A9A0 +EA60 +AC20 +0FE0 +0820 +ENDCHAR +STARTCHAR U_54BE +ENCODING 21694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E120 +A7C0 +A140 +A180 +AFE0 +E240 +A680 +0B20 +1220 +01E0 +ENDCHAR +STARTCHAR U_54BF +ENCODING 21695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BC0 +E940 +A940 +AFE0 +B940 +A940 +ABC0 +E900 +A900 +0A00 +0C00 +ENDCHAR +STARTCHAR U_54C0 +ENCODING 21696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3F80 +2080 +3F80 +1440 +3280 +D100 +1480 +3860 +ENDCHAR +STARTCHAR U_54C1 +ENCODING 21697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2100 +3F00 +0000 +F3C0 +9240 +9240 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_54C2 +ENCODING 21698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AFE0 +AAA0 +AAA0 +EAE0 +AC20 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_54C3 +ENCODING 21699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +ABA0 +A820 +ABA0 +AAA0 +AAA0 +EBA0 +A820 +0820 +0860 +ENDCHAR +STARTCHAR U_54C4 +ENCODING 21700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +AFE0 +A280 +A280 +A280 +AFE0 +E000 +A480 +0840 +1020 +ENDCHAR +STARTCHAR U_54C5 +ENCODING 21701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A820 +B520 +AAA0 +AAA0 +ADA0 +E8A0 +AFA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_54C6 +ENCODING 21702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E3C0 +AC40 +A280 +A300 +AD00 +E3E0 +AC40 +0280 +0300 +1C00 +ENDCHAR +STARTCHAR U_54C7 +ENCODING 21703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9100 +9FE0 +9000 +F100 +97C0 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_54C8 +ENCODING 21704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F280 +9440 +9FE0 +9000 +97C0 +F440 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54C9 +ENCODING 21705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +2280 +FA40 +2200 +FFC0 +0200 +7A80 +4B00 +4A40 +7D40 +48C0 +ENDCHAR +STARTCHAR U_54CA +ENCODING 21706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E400 +AFC0 +B440 +A7C0 +A440 +E7C0 +A440 +0440 +04C0 +ENDCHAR +STARTCHAR U_54CB +ENCODING 21707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +0A80 +EAA0 +BEE0 +ABA0 +AEA0 +AAA0 +AAA0 +EE00 +3A20 +03E0 +ENDCHAR +STARTCHAR U_54CC +ENCODING 21708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A800 +ABC0 +AA80 +AAA0 +EAC0 +AA80 +0A40 +1320 +2620 +ENDCHAR +STARTCHAR U_54CD +ENCODING 21709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0200 +EFE0 +A820 +ABA0 +AAA0 +AAA0 +EBA0 +0820 +0820 +0860 +ENDCHAR +STARTCHAR U_54CE +ENCODING 21710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +A000 +A480 +A480 +A280 +E300 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_54CF +ENCODING 21711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +AA40 +EA20 +A940 +0880 +0A40 +0C20 +ENDCHAR +STARTCHAR U_54D0 +ENCODING 21712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABE0 +A880 +A880 +ABE0 +E880 +A880 +0BE0 +0800 +0FE0 +ENDCHAR +STARTCHAR U_54D1 +ENCODING 21713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E280 +A280 +A280 +AAA0 +AAA0 +E6C0 +A280 +0280 +0280 +1FE0 +ENDCHAR +STARTCHAR U_54D2 +ENCODING 21714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F480 +93E0 +9080 +9C80 +9480 +F540 +9620 +0400 +0A00 +11E0 +ENDCHAR +STARTCHAR U_54D3 +ENCODING 21715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A240 +A280 +A120 +AEE0 +E000 +AFE0 +0280 +04A0 +1860 +ENDCHAR +STARTCHAR U_54D4 +ENCODING 21716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E8A0 +AEC0 +A8A0 +AAA0 +AD60 +E100 +AFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_54D5 +ENCODING 21717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E920 +A920 +AFE0 +A200 +A3E0 +E620 +A940 +0080 +0300 +1C00 +ENDCHAR +STARTCHAR U_54D6 +ENCODING 21718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E7E0 +A880 +A080 +A7E0 +A480 +E480 +AFE0 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_54D7 +ENCODING 21719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E520 +AD40 +B580 +A520 +A6E0 +E100 +BFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_54D8 +ENCODING 21720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +05E0 +E800 +B200 +A5E0 +AC40 +B440 +E440 +A440 +0440 +05C0 +ENDCHAR +STARTCHAR U_54D9 +ENCODING 21721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +A840 +B020 +A780 +A000 +BFE0 +E200 +A480 +09C0 +1E40 +ENDCHAR +STARTCHAR U_54DA +ENCODING 21722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A480 +A860 +B100 +AFE0 +E100 +A380 +0540 +0920 +0100 +ENDCHAR +STARTCHAR U_54DB +ENCODING 21723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F5C0 +9600 +F420 +93C0 +0900 +1080 +2F40 +4920 +9500 +2200 +ENDCHAR +STARTCHAR U_54DC +ENCODING 21724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9480 +9300 +9280 +9C60 +F480 +9480 +0480 +0880 +1080 +ENDCHAR +STARTCHAR U_54DD +ENCODING 21725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +AFE0 +AA20 +A200 +A520 +E540 +AC80 +1440 +0540 +0620 +ENDCHAR +STARTCHAR U_54DE +ENCODING 21726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E480 +A840 +BFA0 +A500 +A7C0 +E900 +A100 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_54DF +ENCODING 21727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A8E0 +AB20 +BD20 +A4A0 +AAA0 +FC20 +A020 +0620 +18C0 +ENDCHAR +STARTCHAR U_54E0 +ENCODING 21728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +A7C0 +A900 +AFE0 +A000 +E7C0 +A440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_54E1 +ENCODING 21729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +7F80 +4080 +7F80 +4080 +7F80 +4080 +7F80 +2100 +C0C0 +ENDCHAR +STARTCHAR U_54E2 +ENCODING 21730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A7C0 +A100 +AFE0 +A480 +EFE0 +A480 +0480 +0880 +1080 +ENDCHAR +STARTCHAR U_54E3 +ENCODING 21731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0000 +F7C0 +9440 +9440 +97C0 +F000 +8440 +0240 +0280 +1FE0 +ENDCHAR +STARTCHAR U_54E4 +ENCODING 21732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C40 +EA80 +BF20 +A840 +AA80 +AB20 +EA40 +AA80 +1320 +2220 +41E0 +ENDCHAR +STARTCHAR U_54E5 +ENCODING 21733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0100 +7900 +4900 +7900 +FFC0 +0100 +7900 +4900 +7900 +0700 +ENDCHAR +STARTCHAR U_54E6 +ENCODING 21734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +FCA0 +A480 +BFE0 +A480 +A6A0 +ACC0 +B480 +E5A0 +1660 +0820 +ENDCHAR +STARTCHAR U_54E7 +ENCODING 21735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A100 +A100 +AFE0 +A280 +AAC0 +EAA0 +12A0 +0480 +1980 +ENDCHAR +STARTCHAR U_54E8 +ENCODING 21736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +9100 +97E0 +9420 +97E0 +F420 +97E0 +0420 +0420 +04E0 +ENDCHAR +STARTCHAR U_54E9 +ENCODING 21737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +A920 +AFE0 +A100 +A100 +E7C0 +0100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_54EA +ENCODING 21738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +EAA0 +AAA0 +BEC0 +AAA0 +BEA0 +EAA0 +AAA0 +0AE0 +1280 +2680 +ENDCHAR +STARTCHAR U_54EB +ENCODING 21739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +9100 +9100 +F5C0 +9500 +0500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_54EC +ENCODING 21740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0FE0 +E820 +BBA0 +AAA0 +AAA0 +EAA0 +ABA0 +0820 +0820 +08E0 +ENDCHAR +STARTCHAR U_54ED +ENCODING 21741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0500 +0480 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_54EE +ENCODING 21742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +EFC0 +A280 +BFE0 +A200 +A7C0 +E880 +B7E0 +2080 +0080 +0380 +ENDCHAR +STARTCHAR U_54EF +ENCODING 21743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9440 +F7C0 +9280 +02A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_54F0 +ENCODING 21744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +B220 +AA00 +AFC0 +B200 +E200 +9FE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_54F1 +ENCODING 21745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +A820 +A7C0 +E080 +AFE0 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_54F2 +ENCODING 21746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +FC00 +27E0 +F480 +2480 +6880 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_54F3 +ENCODING 21747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +E500 +BF00 +A5E0 +A540 +A740 +ED40 +B540 +0540 +0540 +1E40 +ENDCHAR +STARTCHAR U_54F4 +ENCODING 21748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FC0 +E840 +AFC0 +A840 +AFC0 +AA00 +E940 +0980 +0A80 +0C60 +ENDCHAR +STARTCHAR U_54F5 +ENCODING 21749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E20 +1220 +FEA0 +A8A0 +A8A0 +BEA0 +EAA0 +8AA0 +0A20 +1220 +26E0 +ENDCHAR +STARTCHAR U_54F6 +ENCODING 21750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +ECE0 +A480 +A480 +AFC0 +A200 +A200 +FFE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_54F7 +ENCODING 21751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +0FA0 +EA20 +A540 +A040 +AFE0 +A040 +E240 +A140 +0040 +01C0 +ENDCHAR +STARTCHAR U_54F8 +ENCODING 21752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +A220 +A940 +A400 +A200 +BFE0 +E480 +0300 +0280 +1C60 +ENDCHAR +STARTCHAR U_54F9 +ENCODING 21753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +0F00 +EA20 +A540 +AFC0 +A080 +E100 +BFE0 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_54FA +ENCODING 21754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +E140 +BFE0 +A100 +AFE0 +A920 +EFE0 +A920 +0FE0 +0920 +0960 +ENDCHAR +STARTCHAR U_54FB +ENCODING 21755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A440 +A7C0 +A000 +E7C0 +A100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_54FC +ENCODING 21756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +F000 +97C0 +9440 +97C0 +F000 +97C0 +0080 +0100 +0300 +ENDCHAR +STARTCHAR U_54FD +ENCODING 21757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFE0 +A920 +AFE0 +A920 +EFE0 +A500 +0200 +0500 +18E0 +ENDCHAR +STARTCHAR U_54FE +ENCODING 21758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0500 +EFC0 +A840 +A840 +AFC0 +E500 +A500 +0500 +0920 +10E0 +ENDCHAR +STARTCHAR U_54FF +ENCODING 21759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1520 +25E0 +4800 +FFE0 +0040 +1E40 +1240 +1E40 +01C0 +ENDCHAR +STARTCHAR U_5500 +ENCODING 21760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0E00 +E200 +BFE0 +A700 +AA80 +F760 +A500 +05C0 +0840 +1180 +ENDCHAR +STARTCHAR U_5501 +ENCODING 21761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A000 +A7C0 +A000 +A7C0 +E000 +A7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5502 +ENCODING 21762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +EA40 +B240 +A500 +A880 +BFE0 +E880 +0880 +0F80 +0880 +ENDCHAR +STARTCHAR U_5503 +ENCODING 21763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +03C0 +E480 +AFE0 +A920 +AFE0 +E920 +AFE0 +0920 +0920 +1060 +ENDCHAR +STARTCHAR U_5504 +ENCODING 21764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9420 +97E0 +9420 +97E0 +F420 +97E0 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_5505 +ENCODING 21765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A440 +A920 +B7C0 +A040 +E080 +A7C0 +0440 +0440 +07C0 +ENDCHAR +STARTCHAR U_5506 +ENCODING 21766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E440 +AFE0 +A440 +AA20 +B3C0 +E640 +AA80 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_5507 +ENCODING 21767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +5FC0 +4000 +7FE0 +5240 +5980 +5060 +9FC0 +9040 +1FC0 +ENDCHAR +STARTCHAR U_5508 +ENCODING 21768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A000 +AFE0 +A920 +E920 +AFE0 +0800 +0820 +07E0 +ENDCHAR +STARTCHAR U_5509 +ENCODING 21769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0440 +F7A0 +9400 +97C0 +9900 +9100 +FFE0 +8280 +0440 +1820 +ENDCHAR +STARTCHAR U_550A +ENCODING 21770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A540 +A540 +ABA0 +E920 +A300 +0480 +0840 +1020 +ENDCHAR +STARTCHAR U_550B +ENCODING 21771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +A840 +B7A0 +A100 +A100 +AFE0 +E100 +0940 +0920 +1320 +ENDCHAR +STARTCHAR U_550C +ENCODING 21772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FDC0 +A440 +A840 +BD60 +A540 +E540 +B540 +09E0 +1400 +23E0 +ENDCHAR +STARTCHAR U_550D +ENCODING 21773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A820 +A380 +A000 +EFE0 +A280 +0280 +04A0 +0860 +ENDCHAR +STARTCHAR U_550E +ENCODING 21774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FCA0 +A4A0 +BFA0 +A4A0 +A6A0 +E5A0 +ACA0 +1420 +0420 +04E0 +ENDCHAR +STARTCHAR U_550F +ENCODING 21775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0CC0 +E300 +ACC0 +A200 +BFE0 +A500 +EFE0 +B520 +0520 +0560 +0100 +ENDCHAR +STARTCHAR U_5510 +ENCODING 21776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4240 +7FE0 +4240 +5FC0 +4200 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_5511 +ENCODING 21777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E540 +A540 +A540 +ABA0 +B100 +A100 +E7C0 +0100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_5512 +ENCODING 21778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AFE0 +AAA0 +AAA0 +ACE0 +E820 +AFE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5513 +ENCODING 21779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E100 +AFE0 +A920 +AFE0 +A920 +EFE0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5514 +ENCODING 21780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9240 +9FE0 +9000 +F7C0 +9440 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5515 +ENCODING 21781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0200 +F7C0 +9440 +97C0 +9440 +97C0 +F100 +9FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5516 +ENCODING 21782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0280 +EFE0 +AAA0 +AAA0 +AAA0 +AAA0 +EFE0 +A280 +0280 +0FE0 +ENDCHAR +STARTCHAR U_5517 +ENCODING 21783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +9FE0 +9100 +F500 +95C0 +0500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_5518 +ENCODING 21784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +2220 +3D40 +6480 +BD60 +0220 +1FC0 +1040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_5519 +ENCODING 21785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EA80 +A4A0 +AEA0 +B5C0 +A480 +AC80 +F540 +8540 +1620 +0A20 +ENDCHAR +STARTCHAR U_551A +ENCODING 21786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E040 +AFC0 +A040 +BFE0 +B020 +AFC0 +E480 +0300 +0480 +1860 +ENDCHAR +STARTCHAR U_551B +ENCODING 21787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +A200 +E7C0 +AA40 +0180 +0E60 +ENDCHAR +STARTCHAR U_551C +ENCODING 21788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +1500 +E4E0 +0200 +7A40 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_551D +ENCODING 21789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0100 +F100 +9FE0 +9000 +97C0 +F540 +9540 +0100 +0280 +0C40 +ENDCHAR +STARTCHAR U_551E +ENCODING 21790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0540 +E4C0 +BE40 +A540 +A6C0 +AC60 +F7C0 +8440 +1440 +0840 +ENDCHAR +STARTCHAR U_551F +ENCODING 21791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1080 +7FC0 +0000 +7A60 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_5520 +ENCODING 21792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +AFE0 +A820 +A200 +AFC0 +E240 +0240 +0440 +0980 +ENDCHAR +STARTCHAR U_5521 +ENCODING 21793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AAA0 +AAA0 +EDA0 +A960 +8A20 +0820 +08E0 +ENDCHAR +STARTCHAR U_5522 +ENCODING 21794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +9100 +97E0 +9420 +9520 +F520 +9520 +0520 +0240 +0C20 +ENDCHAR +STARTCHAR U_5523 +ENCODING 21795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A840 +AFC0 +A220 +E3C0 +1E00 +0220 +01E0 +ENDCHAR +STARTCHAR U_5524 +ENCODING 21796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +03C0 +F480 +9FC0 +9540 +9540 +F540 +9FE0 +0100 +0280 +0C60 +ENDCHAR +STARTCHAR U_5525 +ENCODING 21797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1100 +EA80 +A440 +A120 +A7C0 +A840 +F280 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_5526 +ENCODING 21798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E900 +A140 +B520 +AD20 +A540 +A940 +F880 +A900 +0200 +0C00 +ENDCHAR +STARTCHAR U_5527 +ENCODING 21799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEA0 +AAA0 +AAA0 +AEA0 +A8A0 +EAE0 +0E80 +0A80 +0080 +ENDCHAR +STARTCHAR U_5528 +ENCODING 21800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +EAE0 +AAA0 +ACA0 +ACE0 +AAA0 +AAA0 +EEE0 +08A0 +09E0 +0800 +ENDCHAR +STARTCHAR U_5529 +ENCODING 21801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0F00 +E100 +BFE0 +A380 +BD60 +A200 +BFE0 +E480 +0300 +0CE0 +ENDCHAR +STARTCHAR U_552A +ENCODING 21802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +AFC0 +A400 +BFE0 +EA80 +1740 +2220 +0F80 +0200 +ENDCHAR +STARTCHAR U_552B +ENCODING 21803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0500 +E880 +B060 +AF80 +A200 +AF80 +E200 +0A80 +0700 +1FC0 +ENDCHAR +STARTCHAR U_552C +ENCODING 21804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +ABC0 +AE20 +E9E0 +AB80 +0A80 +12A0 +2CE0 +ENDCHAR +STARTCHAR U_552D +ENCODING 21805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A440 +A7C0 +A440 +A7C0 +E440 +BFE0 +0000 +0440 +1820 +ENDCHAR +STARTCHAR U_552E +ENCODING 21806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2200 +7FC0 +A200 +3FC0 +2200 +3FE0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_552F +ENCODING 21807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F480 +97E0 +9C80 +97E0 +9480 +F7E0 +9480 +0480 +07E0 +0400 +ENDCHAR +STARTCHAR U_5530 +ENCODING 21808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FA0 +08A0 +EFA0 +AA20 +AA20 +AFA0 +EAA0 +0AA0 +1BA0 +1220 +2260 +ENDCHAR +STARTCHAR U_5531 +ENCODING 21809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9000 +FFE0 +0820 +0FE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5532 +ENCODING 21810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F6E0 +9420 +96E0 +9420 +9420 +F7E0 +9280 +02A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_5533 +ENCODING 21811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +AFE0 +A940 +A920 +EFE0 +0900 +1280 +2440 +4820 +ENDCHAR +STARTCHAR U_5534 +ENCODING 21812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9100 +97C0 +9100 +FFE0 +9280 +02A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_5535 +ENCODING 21813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A500 +AA80 +BFC0 +AAA0 +EF80 +AA80 +0FA0 +0220 +01E0 +ENDCHAR +STARTCHAR U_5536 +ENCODING 21814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9280 +9FE0 +9000 +97C0 +F440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5537 +ENCODING 21815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9FE0 +9000 +97C0 +F440 +97C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5538 +ENCODING 21816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E500 +AA80 +B160 +AF80 +A100 +E600 +A240 +1520 +1460 +23C0 +ENDCHAR +STARTCHAR U_5539 +ENCODING 21817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E480 +BE80 +A940 +AE20 +AA80 +EA40 +AA00 +0A80 +1240 +2420 +ENDCHAR +STARTCHAR U_553A +ENCODING 21818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0280 +EFE0 +AAA0 +AFE0 +AAA0 +AAA0 +FFE0 +0280 +0440 +0820 +ENDCHAR +STARTCHAR U_553B +ENCODING 21819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +9540 +9540 +9BA0 +9100 +F380 +0540 +0920 +1120 +ENDCHAR +STARTCHAR U_553C +ENCODING 21820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A280 +AFE0 +A200 +FFE0 +A240 +0480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_553D +ENCODING 21821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0460 +E580 +BF00 +A5E0 +AF40 +AD40 +ED40 +1540 +2540 +0640 +ENDCHAR +STARTCHAR U_553E +ENCODING 21822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +9FE0 +9540 +9FE0 +F540 +9540 +0FE0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_553F +ENCODING 21823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9AA0 +92A0 +9520 +92C0 +F400 +9340 +0AA0 +0A60 +11C0 +ENDCHAR +STARTCHAR U_5540 +ENCODING 21824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E880 +A880 +ABE0 +A880 +ABE0 +E880 +ABE0 +0880 +1080 +27E0 +ENDCHAR +STARTCHAR U_5541 +ENCODING 21825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +ABA0 +A920 +AFE0 +A820 +EBA0 +0AA0 +0BA0 +1020 +2060 +ENDCHAR +STARTCHAR U_5542 +ENCODING 21826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0680 +F880 +AA80 +B480 +A080 +AE80 +A480 +E680 +BCA0 +04A0 +0C60 +ENDCHAR +STARTCHAR U_5543 +ENCODING 21827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F5E0 +9500 +9FE0 +9000 +97C0 +F440 +97C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5544 +ENCODING 21828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9200 +9520 +9B40 +9580 +FD40 +9340 +0520 +0920 +1300 +ENDCHAR +STARTCHAR U_5545 +ENCODING 21829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +F100 +97C0 +9440 +97C0 +9440 +F7C0 +9100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5546 +ENCODING 21830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +4A40 +5140 +7FC0 +5140 +5F40 +5140 +40C0 +ENDCHAR +STARTCHAR U_5547 +ENCODING 21831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1100 +7FC0 +4840 +7F40 +4840 +5E40 +5240 +5EC0 +ENDCHAR +STARTCHAR U_5548 +ENCODING 21832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9FE0 +9440 +9280 +97C0 +F100 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5549 +ENCODING 21833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +BFE0 +A480 +A480 +AEC0 +ADA0 +F6A0 +0480 +0480 +0480 +ENDCHAR +STARTCHAR U_554A +ENCODING 21834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +E820 +A820 +B3A0 +AAA0 +AAA0 +EBA0 +B820 +2020 +2020 +20E0 +ENDCHAR +STARTCHAR U_554B +ENCODING 21835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF20 +A920 +A4C0 +A100 +AFE0 +A100 +E380 +0540 +1920 +0100 +ENDCHAR +STARTCHAR U_554C +ENCODING 21836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0100 +EFE0 +A820 +B280 +A440 +A820 +E7C0 +8100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_554D +ENCODING 21837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A7C0 +A000 +AFC0 +E080 +AFE0 +0100 +0100 +0700 +ENDCHAR +STARTCHAR U_554E +ENCODING 21838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7100 +A7C0 +2140 +2140 +FFE0 +2000 +27E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_554F +ENCODING 21839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +9F20 +9120 +9120 +9F20 +8060 +ENDCHAR +STARTCHAR U_5550 +ENCODING 21840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9440 +9440 +9AA0 +9100 +FFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5551 +ENCODING 21841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFC0 +A140 +BFE0 +A140 +AFC0 +E900 +09E0 +1500 +23E0 +ENDCHAR +STARTCHAR U_5552 +ENCODING 21842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A880 +AAA0 +AAA0 +ABE0 +E880 +0CA0 +14A0 +27E0 +ENDCHAR +STARTCHAR U_5553 +ENCODING 21843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4A40 +7D40 +4080 +4140 +4220 +BFC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5554 +ENCODING 21844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D00 +47E0 +7D20 +41C0 +4720 +80E0 +3FA0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5555 +ENCODING 21845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +B420 +A7A0 +AA20 +BFE0 +E220 +AAA0 +0FA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5556 +ENCODING 21846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0120 +F540 +9580 +9A80 +9540 +9920 +F540 +0580 +0A80 +0440 +1820 +ENDCHAR +STARTCHAR U_5557 +ENCODING 21847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E3C0 +A440 +AA80 +BCE0 +A820 +E820 +AEE0 +0820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_5558 +ENCODING 21848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A5C0 +AF40 +AB40 +B740 +E5C0 +8500 +0920 +10E0 +ENDCHAR +STARTCHAR U_5559 +ENCODING 21849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +5B80 +5200 +5220 +F9E0 +0000 +7BC0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_555A +ENCODING 21850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +0400 +FFE0 +0400 +7FC0 +4040 +5F40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_555B +ENCODING 21851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A200 +AFC0 +A240 +BFE0 +E240 +9FE0 +0480 +0300 +0CC0 +ENDCHAR +STARTCHAR U_555C +ENCODING 21852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +E220 +ACC0 +A440 +AAA0 +B100 +BEE0 +AAA0 +E440 +0AA0 +1120 +ENDCHAR +STARTCHAR U_555D +ENCODING 21853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E00 +E5E0 +A520 +BF20 +A520 +AF20 +AD20 +F520 +15E0 +2400 +0400 +ENDCHAR +STARTCHAR U_555E +ENCODING 21854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AEE0 +A820 +A820 +AEE0 +E280 +0280 +0280 +1FE0 +ENDCHAR +STARTCHAR U_555F +ENCODING 21855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +45E0 +7D40 +4340 +5D40 +5540 +5480 +9480 +9D40 +8220 +ENDCHAR +STARTCHAR U_5560 +ENCODING 21856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18E0 +6300 +4200 +7BE0 +5240 +5240 +9440 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5561 +ENCODING 21857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9EE0 +9280 +9280 +9EE0 +9280 +F280 +8EE0 +0280 +0280 +ENDCHAR +STARTCHAR U_5562 +ENCODING 21858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A100 +AFE0 +A920 +ADA0 +AB60 +EDA0 +A920 +0920 +0960 +ENDCHAR +STARTCHAR U_5563 +ENCODING 21859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EEE0 +B4A0 +A4A0 +BEA0 +A4A0 +E6A0 +14A0 +16E0 +1880 +0080 +ENDCHAR +STARTCHAR U_5564 +ENCODING 21860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A920 +AFE0 +A920 +AFE0 +E280 +A480 +1FE0 +0080 +0080 +ENDCHAR +STARTCHAR U_5565 +ENCODING 21861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9BA0 +9100 +9FE0 +9100 +F7C0 +0440 +0440 +07C0 +ENDCHAR +STARTCHAR U_5566 +ENCODING 21862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E480 +BFE0 +A400 +A640 +A540 +ED40 +B540 +0480 +07E0 +1C00 +ENDCHAR +STARTCHAR U_5567 +ENCODING 21863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +E440 +A540 +0540 +0280 +1C60 +ENDCHAR +STARTCHAR U_5568 +ENCODING 21864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF80 +A200 +AF80 +A200 +BFE0 +A880 +EF80 +0880 +0F80 +0880 +ENDCHAR +STARTCHAR U_5569 +ENCODING 21865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +A480 +BE80 +A0C0 +A4A0 +AE80 +E480 +0680 +1880 +0080 +ENDCHAR +STARTCHAR U_556A +ENCODING 21866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E480 +BFE0 +A520 +A520 +A720 +EDE0 +B520 +0520 +0520 +1DE0 +ENDCHAR +STARTCHAR U_556B +ENCODING 21867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFA0 +A240 +BFE0 +A200 +A7C0 +EC40 +9440 +27C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_556C +ENCODING 21868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FF80 +4900 +2A00 +FFC0 +0000 +7F80 +5280 +5E80 +4080 +7F80 +ENDCHAR +STARTCHAR U_556D +ENCODING 21869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +E440 +BFE0 +A840 +B5E0 +BE80 +E4E0 +A620 +1D40 +0480 +0440 +ENDCHAR +STARTCHAR U_556E +ENCODING 21870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E5E0 +A500 +BFE0 +A100 +A920 +A920 +EAA0 +0C60 +0820 +0FE0 +ENDCHAR +STARTCHAR U_556F +ENCODING 21871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A920 +AFE0 +A9A0 +A960 +EFE0 +0820 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5570 +ENCODING 21872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AAA0 +AFE0 +A200 +A7C0 +E440 +8B40 +1080 +0100 +0E00 +ENDCHAR +STARTCHAR U_5571 +ENCODING 21873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0920 +E920 +AFE0 +A000 +BFE0 +A200 +E7E0 +AC20 +1420 +27E0 +ENDCHAR +STARTCHAR U_5572 +ENCODING 21874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0440 +E880 +AEE0 +AB20 +AA20 +AEA0 +AA60 +EA20 +AA20 +0E60 +ENDCHAR +STARTCHAR U_5573 +ENCODING 21875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +0540 +EFE0 +A100 +AFE0 +A280 +A7C0 +ECA0 +9580 +2420 +03E0 +ENDCHAR +STARTCHAR U_5574 +ENCODING 21876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A920 +AFE0 +A920 +AFE0 +A100 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5575 +ENCODING 21877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E7E0 +A2A0 +B280 +ABE0 +A220 +A720 +BAC0 +EA80 +0D40 +0A20 +ENDCHAR +STARTCHAR U_5576 +ENCODING 21878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9820 +97C0 +9100 +9100 +F5C0 +0500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_5577 +ENCODING 21879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +EEA0 +AAA0 +AEA0 +AAC0 +AEA0 +E8A0 +AAA0 +0DE0 +0880 +0080 +ENDCHAR +STARTCHAR U_5578 +ENCODING 21880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFC0 +A140 +BFE0 +A140 +AFC0 +E920 +ABA0 +0D60 +1120 +2120 +ENDCHAR +STARTCHAR U_5579 +ENCODING 21881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A900 +A900 +AFE0 +E900 +AFC0 +1440 +1440 +27C0 +ENDCHAR +STARTCHAR U_557A +ENCODING 21882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A780 +A480 +BFE0 +A400 +EFC0 +1540 +0A40 +1540 +0880 +ENDCHAR +STARTCHAR U_557B +ENCODING 21883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +8420 +3F80 +2480 +0400 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_557C +ENCODING 21884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A280 +AFE0 +A920 +A7C0 +E540 +0540 +05C0 +0100 +ENDCHAR +STARTCHAR U_557D +ENCODING 21885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +97C0 +9820 +97C0 +9440 +F7C0 +9280 +1FE0 +0280 +0C80 +ENDCHAR +STARTCHAR U_557E +ENCODING 21886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F880 +AAA0 +BEC0 +AA80 +AC80 +EA80 +1880 +2940 +0A20 +0C20 +ENDCHAR +STARTCHAR U_557F +ENCODING 21887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +9440 +97C0 +9440 +97C0 +F440 +9FE0 +0A80 +0C40 +0FE0 +ENDCHAR +STARTCHAR U_5580 +ENCODING 21888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A7C0 +AC40 +A380 +A440 +EFE0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5581 +ENCODING 21889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +97C0 +9540 +97C0 +9100 +FFE0 +9960 +0FA0 +0820 +0860 +ENDCHAR +STARTCHAR U_5582 +ENCODING 21890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +97C0 +9540 +97C0 +9000 +FFE0 +9540 +0480 +0540 +0E20 +ENDCHAR +STARTCHAR U_5583 +ENCODING 21891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +AAA0 +A920 +AFE0 +E920 +0FE0 +0920 +0860 +ENDCHAR +STARTCHAR U_5584 +ENCODING 21892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +1100 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5585 +ENCODING 21893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9100 +9FE0 +F440 +9240 +0280 +1FE0 +ENDCHAR +STARTCHAR U_5586 +ENCODING 21894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2080 +2080 +FBE0 +0000 +FBE0 +8A20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_5587 +ENCODING 21895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FF20 +A4A0 +BFA0 +B5A0 +B5A0 +FFA0 +A4A0 +0E20 +1520 +2460 +ENDCHAR +STARTCHAR U_5588 +ENCODING 21896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E8A0 +AEC0 +A8A0 +AEE0 +BA00 +E7C0 +A440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5589 +ENCODING 21897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BC0 +E840 +AFE0 +BA00 +ABE0 +AC80 +E880 +AFE0 +0880 +0940 +0A20 +ENDCHAR +STARTCHAR U_558A +ENCODING 21898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +E0A0 +AFE0 +A880 +AEA0 +A8A0 +EEC0 +AA80 +0EA0 +1160 +2220 +ENDCHAR +STARTCHAR U_558B +ENCODING 21899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +9540 +95C0 +9400 +97E0 +F100 +9FE0 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_558C +ENCODING 21900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7BE0 +0000 +1220 +5B20 +56A0 +9220 +2220 +4220 +ENDCHAR +STARTCHAR U_558D +ENCODING 21901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EAC0 +AB80 +AAA0 +ABA0 +BC60 +E100 +AFE0 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_558E +ENCODING 21902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A740 +A540 +AFE0 +A820 +EBA0 +AAA0 +0BA0 +0820 +0860 +ENDCHAR +STARTCHAR U_558F +ENCODING 21903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A200 +BFE0 +A400 +E7C0 +AC40 +1440 +27C0 +0440 +ENDCHAR +STARTCHAR U_5590 +ENCODING 21904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E4E0 +BFA0 +A8A0 +AEC0 +BAA0 +EEA0 +8AA0 +0EC0 +0A80 +0A80 +ENDCHAR +STARTCHAR U_5591 +ENCODING 21905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9280 +9FE0 +9000 +F7C0 +9440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5592 +ENCODING 21906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EF80 +AAC0 +BAA0 +A500 +A8E0 +F7C0 +A440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5593 +ENCODING 21907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A200 +EFE0 +A440 +0380 +0140 +0E20 +ENDCHAR +STARTCHAR U_5594 +ENCODING 21908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A800 +AFE0 +AA40 +EFE0 +A900 +0FC0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_5595 +ENCODING 21909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A200 +AFE0 +AAA0 +ABA0 +AAA0 +EBA0 +AAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_5596 +ENCODING 21910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +BE80 +A5E0 +AC80 +AE80 +F5E0 +A520 +0520 +05E0 +0520 +ENDCHAR +STARTCHAR U_5597 +ENCODING 21911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +B7C0 +A100 +A7C0 +E7C0 +8540 +07C0 +0100 +1FE0 +0100 +ENDCHAR +STARTCHAR U_5598 +ENCODING 21912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E920 +AFE0 +A000 +AFE0 +A200 +EFE0 +AAA0 +0AA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_5599 +ENCODING 21913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +E880 +BFE0 +A200 +AD20 +A340 +ED80 +0340 +1D20 +0300 +ENDCHAR +STARTCHAR U_559A +ENCODING 21914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A900 +BFC0 +AB40 +ACC0 +EA40 +1FE0 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_559B +ENCODING 21915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +1E40 +EA80 +BFC0 +A400 +BFE0 +A400 +E7C0 +8A80 +1100 +26E0 +ENDCHAR +STARTCHAR U_559C +ENCODING 21916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2080 +3F80 +1100 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_559D +ENCODING 21917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +A400 +EFE0 +1920 +0AA0 +0F20 +00C0 +ENDCHAR +STARTCHAR U_559E +ENCODING 21918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EEE0 +AAA0 +AEA0 +AAA0 +AEA0 +E8A0 +AEA0 +08C0 +0A80 +0680 +ENDCHAR +STARTCHAR U_559F +ENCODING 21919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +A920 +AFE0 +A440 +E7C0 +A440 +07C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_55A0 +ENCODING 21920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E200 +BFE0 +AA40 +AFC0 +AA40 +EFC0 +8200 +0FC0 +0200 +1FE0 +ENDCHAR +STARTCHAR U_55A1 +ENCODING 21921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +9240 +9FE0 +9440 +97C0 +F080 +9FE0 +9480 +0FE0 +0080 +ENDCHAR +STARTCHAR U_55A2 +ENCODING 21922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +E700 +A100 +AFE0 +A100 +ADE0 +A920 +ED60 +0920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_55A3 +ENCODING 21923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +9420 +9BA0 +92A0 +93A0 +F020 +00C0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_55A4 +ENCODING 21924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +97C0 +9440 +9FE0 +F100 +97C0 +0100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_55A5 +ENCODING 21925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +AFE0 +AA40 +ABC0 +E800 +AFE0 +0A40 +1180 +2660 +ENDCHAR +STARTCHAR U_55A6 +ENCODING 21926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +0000 +F1E0 +9520 +F5E0 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_55A7 +ENCODING 21927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +AFE0 +A000 +A7C0 +A440 +E7C0 +A440 +0440 +0FE0 +ENDCHAR +STARTCHAR U_55A8 +ENCODING 21928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +97C0 +9000 +9FE0 +F820 +9380 +02A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_55A9 +ENCODING 21929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E500 +A880 +B760 +A000 +BD40 +F540 +9E80 +1680 +1D40 +1540 +ENDCHAR +STARTCHAR U_55AA +ENCODING 21930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +75C0 +5540 +75C0 +0400 +FFE0 +2140 +2880 +3060 +ENDCHAR +STARTCHAR U_55AB +ENCODING 21931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +FEA0 +A4A0 +BEA0 +A520 +BEC0 +E200 +BFE0 +0200 +0D80 +3060 +ENDCHAR +STARTCHAR U_55AC +ENCODING 21932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0800 +FFE0 +2080 +DF60 +1100 +7FC0 +4040 +4F40 +4940 +4FC0 +ENDCHAR +STARTCHAR U_55AD +ENCODING 21933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +AFE0 +A880 +A900 +EE40 +A980 +0E60 +1080 +2F00 +ENDCHAR +STARTCHAR U_55AE +ENCODING 21934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +9240 +FFC0 +4480 +7F80 +4480 +7F80 +0400 +FFC0 +0400 +ENDCHAR +STARTCHAR U_55AF +ENCODING 21935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FC0 +E480 +BA60 +AFC0 +A200 +EA80 +BFE0 +0880 +0880 +3080 +ENDCHAR +STARTCHAR U_55B0 +ENCODING 21936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0280 +F540 +9FE0 +9440 +97C0 +F440 +87C0 +0560 +0480 +0660 +ENDCHAR +STARTCHAR U_55B1 +ENCODING 21937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABE0 +AAA0 +ABE0 +AAA0 +EBE0 +A880 +0BE0 +1080 +27E0 +ENDCHAR +STARTCHAR U_55B2 +ENCODING 21938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A8E0 +BB20 +A420 +AB20 +BEA0 +E0A0 +0A20 +1520 +15C0 +ENDCHAR +STARTCHAR U_55B3 +ENCODING 21939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9540 +9920 +97C0 +9440 +F7C0 +9440 +07C0 +0000 +1FE0 +ENDCHAR +STARTCHAR U_55B4 +ENCODING 21940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EAC0 +AB80 +AAA0 +BFE0 +A100 +E100 +AFE0 +0580 +0940 +1120 +ENDCHAR +STARTCHAR U_55B5 +ENCODING 21941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9FE0 +9280 +97E0 +9520 +F520 +97E0 +0520 +07E0 +0420 +ENDCHAR +STARTCHAR U_55B6 +ENCODING 21942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4880 +2500 +FFC0 +8040 +BF40 +2100 +3F00 +0000 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_55B7 +ENCODING 21943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A540 +AFE0 +A440 +AFE0 +E820 +A920 +0920 +0280 +0C60 +ENDCHAR +STARTCHAR U_55B8 +ENCODING 21944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4440 +7FC0 +4440 +7FC0 +4440 +0280 +7B00 +4A40 +79C0 +ENDCHAR +STARTCHAR U_55B9 +ENCODING 21945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9540 +9FE0 +9100 +FFE0 +9100 +07C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_55BA +ENCODING 21946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04C0 +E700 +A900 +AA40 +BBC0 +A920 +EBC0 +A880 +0AC0 +0CA0 +0920 +ENDCHAR +STARTCHAR U_55BB +ENCODING 21947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +BB60 +A000 +AE20 +AAA0 +EEA0 +AAA0 +0EA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_55BC +ENCODING 21948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0900 +F7C0 +9040 +97C0 +9040 +F7C0 +8200 +0D40 +1460 +03C0 +ENDCHAR +STARTCHAR U_55BD +ENCODING 21949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +9FE0 +9380 +9540 +9920 +FFE0 +9240 +0680 +0140 +0E20 +ENDCHAR +STARTCHAR U_55BE +ENCODING 21950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4880 +2500 +FFC0 +A440 +3F00 +4400 +FFC0 +0000 +3F00 +2100 +3F00 +ENDCHAR +STARTCHAR U_55BF +ENCODING 21951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +FFE0 +8A20 +FBE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_55C0 +ENCODING 21952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FE60 +8400 +7BC0 +0140 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_55C1 +ENCODING 21953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E900 +A9C0 +A900 +ABE0 +AAA0 +EBC0 +AA80 +15C0 +1540 +2A60 +ENDCHAR +STARTCHAR U_55C2 +ENCODING 21954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +0C40 +EA40 +A580 +A200 +A7C0 +A900 +EFE0 +A100 +0920 +0FE0 +ENDCHAR +STARTCHAR U_55C3 +ENCODING 21955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A440 +A7C0 +A000 +AFE0 +E820 +ABA0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_55C4 +ENCODING 21956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E200 +A7C0 +A440 +A740 +A5C0 +E440 +AFE0 +1480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_55C5 +ENCODING 21957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +07C0 +F440 +9740 +95C0 +9440 +97C0 +F140 +9FE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_55C6 +ENCODING 21958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E680 +A940 +BFA0 +A880 +AF80 +E880 +AFC0 +0C40 +17C0 +2440 +ENDCHAR +STARTCHAR U_55C7 +ENCODING 21959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5540 +FFE0 +0000 +3FC0 +2940 +2F40 +2040 +3FC0 +ENDCHAR +STARTCHAR U_55C8 +ENCODING 21960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FA80 +9540 +97C0 +9440 +9FC0 +FA40 +9A40 +0FC0 +0820 +07E0 +ENDCHAR +STARTCHAR U_55C9 +ENCODING 21961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9100 +9FE0 +9240 +FF80 +9440 +0FA0 +0540 +1B20 +ENDCHAR +STARTCHAR U_55CA +ENCODING 21962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9FE0 +9440 +97C0 +9440 +F7C0 +9440 +07C0 +0280 +0C60 +ENDCHAR +STARTCHAR U_55CB +ENCODING 21963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +A440 +BFE0 +AAA0 +BFC0 +E840 +AFC0 +0840 +0FC0 +0840 +ENDCHAR +STARTCHAR U_55CC +ENCODING 21964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +E480 +BFE0 +A280 +A440 +A820 +BFE0 +EAA0 +AAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_55CD +ENCODING 21965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +E520 +BF20 +A520 +B5E0 +B520 +FF20 +A5E0 +0520 +0A20 +14E0 +ENDCHAR +STARTCHAR U_55CE +ENCODING 21966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E900 +AFC0 +A900 +AFC0 +A900 +EFE0 +A020 +0D20 +0AA0 +12C0 +ENDCHAR +STARTCHAR U_55CF +ENCODING 21967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +9480 +9300 +9480 +9960 +F100 +9FE0 +0580 +0940 +1320 +ENDCHAR +STARTCHAR U_55D0 +ENCODING 21968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +A7C0 +A100 +A7C0 +E100 +1FE0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_55D1 +ENCODING 21969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A100 +AFE0 +A440 +AFA0 +A000 +EFE0 +AAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_55D2 +ENCODING 21970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +9480 +9380 +9440 +9BA0 +F000 +97C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_55D3 +ENCODING 21971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E480 +A300 +BFE0 +AAA0 +A440 +EBA0 +0100 +1FE0 +0540 +0920 +ENDCHAR +STARTCHAR U_55D4 +ENCODING 21972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +97C0 +9440 +9740 +F5C0 +9440 +0FE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_55D5 +ENCODING 21973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABC0 +A800 +AFE0 +AAA0 +EB40 +AA60 +0FE0 +1440 +22C0 +ENDCHAR +STARTCHAR U_55D6 +ENCODING 21974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +ED60 +A920 +AF60 +A920 +AFE0 +E100 +AFE0 +0440 +0380 +1C60 +ENDCHAR +STARTCHAR U_55D7 +ENCODING 21975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A740 +A540 +AFE0 +F460 +87C0 +0440 +07C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_55D8 +ENCODING 21976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +0F00 +F520 +92C0 +97C0 +9280 +F7C0 +9100 +8FE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_55D9 +ENCODING 21977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9280 +9FE0 +9920 +FFE0 +9200 +03C0 +0440 +1980 +ENDCHAR +STARTCHAR U_55DA +ENCODING 21978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A800 +AFE0 +E800 +AFE0 +0020 +0AA0 +1540 +ENDCHAR +STARTCHAR U_55DB +ENCODING 21979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +A500 +AFC0 +A540 +BFE0 +E540 +AFC0 +0500 +0D40 +1520 +ENDCHAR +STARTCHAR U_55DC +ENCODING 21980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9140 +9FE0 +9380 +9D20 +F7E0 +9440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_55DD +ENCODING 21981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A7C0 +A000 +AFE0 +AAA0 +E920 +AFE0 +0920 +0920 +0860 +ENDCHAR +STARTCHAR U_55DE +ENCODING 21982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0280 +EFE0 +A240 +A440 +A480 +A9A0 +E640 +A240 +05A0 +0EE0 +ENDCHAR +STARTCHAR U_55DF +ENCODING 21983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +9100 +97C0 +9100 +FFE0 +9400 +0FC0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_55E0 +ENCODING 21984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E7C0 +AA40 +5440 +7A80 +0900 +1280 +FFE0 +1440 +5440 +27C0 +ENDCHAR +STARTCHAR U_55E1 +ENCODING 21985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EA40 +B4A0 +AFC0 +A000 +AEE0 +F320 +AAA0 +0EE0 +1320 +0660 +ENDCHAR +STARTCHAR U_55E2 +ENCODING 21986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +97C0 +9000 +FFE0 +9AA0 +0AA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_55E3 +ENCODING 21987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4820 +7BA0 +0020 +FBA0 +AAA0 +AAA0 +FBA0 +A820 +A820 +98E0 +ENDCHAR +STARTCHAR U_55E4 +ENCODING 21988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +0920 +EFE0 +A100 +BFE0 +A100 +AFE0 +E920 +0FE0 +0120 +1FE0 +ENDCHAR +STARTCHAR U_55E5 +ENCODING 21989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +07C0 +E440 +A7C0 +A440 +BFE0 +A540 +E920 +17C0 +0100 +0100 +ENDCHAR +STARTCHAR U_55E6 +ENCODING 21990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +BFE0 +B2A0 +AF00 +E240 +AFA0 +0540 +0920 +1320 +ENDCHAR +STARTCHAR U_55E7 +ENCODING 21991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +5FE0 +8900 +3F80 +C060 +7FC0 +4A40 +7FC0 +4A40 +ENDCHAR +STARTCHAR U_55E8 +ENCODING 21992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +0BE0 +E400 +B3E0 +AAA0 +A2A0 +A7E0 +FAA0 +0BE0 +0820 +08C0 +ENDCHAR +STARTCHAR U_55E9 +ENCODING 21993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +0540 +EFE0 +A820 +AFE0 +A820 +AFE0 +E820 +0FE0 +0440 +0820 +ENDCHAR +STARTCHAR U_55EA +ENCODING 21994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFC0 +A200 +BFE0 +E540 +0920 +1FE0 +0540 +1920 +ENDCHAR +STARTCHAR U_55EB +ENCODING 21995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A7C0 +A440 +A7C0 +A440 +FFE0 +0AA0 +0440 +0AA0 +1120 +ENDCHAR +STARTCHAR U_55EC +ENCODING 21996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +A800 +AFE0 +B040 +B740 +F540 +1740 +1040 +10C0 +ENDCHAR +STARTCHAR U_55ED +ENCODING 21997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2880 +2480 +FFE0 +0240 +7B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_55EE +ENCODING 21998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +E940 +A940 +ABE0 +BAA0 +AAA0 +AAA0 +EB60 +3A20 +2BE0 +0220 +ENDCHAR +STARTCHAR U_55EF +ENCODING 21999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +A920 +AAA0 +AFE0 +E000 +0540 +1520 +1460 +03C0 +ENDCHAR +STARTCHAR U_55F0 +ENCODING 22000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2FE0 +E920 +AFE0 +A920 +ABA0 +AAA0 +EAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_55F1 +ENCODING 22001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +0480 +FB40 +A7A0 +A480 +A780 +A100 +E7C0 +0100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_55F2 +ENCODING 22002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EAA0 +A100 +AEE0 +A380 +A480 +EBE0 +A240 +0D80 +0100 +0E00 +ENDCHAR +STARTCHAR U_55F3 +ENCODING 22003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +EF20 +A540 +AFE0 +B220 +AFC0 +E400 +07C0 +0A80 +1100 +0EE0 +ENDCHAR +STARTCHAR U_55F4 +ENCODING 22004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0FE0 +E100 +A7C0 +A100 +BFE0 +A340 +E3A0 +05E0 +0520 +18E0 +ENDCHAR +STARTCHAR U_55F5 +ENCODING 22005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +0940 +E3E0 +A2A0 +BBE0 +AAA0 +ABE0 +EAA0 +0AE0 +1400 +23E0 +ENDCHAR +STARTCHAR U_55F6 +ENCODING 22006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +97C0 +9540 +9FE0 +9540 +FFE0 +9540 +0FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_55F7 +ENCODING 22007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1E80 +E480 +BEE0 +A520 +BF20 +A8A0 +EE40 +0A40 +12A0 +2520 +ENDCHAR +STARTCHAR U_55F8 +ENCODING 22008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23E0 +FD40 +2140 +3880 +4940 +9220 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_55F9 +ENCODING 22009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +17E0 +E880 +A3E0 +BAA0 +ABE0 +AAA0 +EFE0 +0880 +1480 +23E0 +ENDCHAR +STARTCHAR U_55FA +ENCODING 22010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0920 +EFE0 +A500 +AFE0 +B900 +AFC0 +E900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_55FB +ENCODING 22011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A800 +AA40 +AFE0 +AA40 +ABC0 +E800 +1540 +16A0 +2AA0 +ENDCHAR +STARTCHAR U_55FC +ENCODING 22012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +AFC0 +AA40 +A940 +AFC0 +E200 +1FE0 +0480 +1860 +ENDCHAR +STARTCHAR U_55FD +ENCODING 22013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +3E80 +E8E0 +BF20 +AAC0 +AA80 +BE80 +EC80 +1A80 +2940 +0A20 +ENDCHAR +STARTCHAR U_55FE +ENCODING 22014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0480 +FFE0 +A900 +AFE0 +AA80 +ABE0 +EA80 +0B40 +1540 +2A20 +ENDCHAR +STARTCHAR U_55FF +ENCODING 22015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +0480 +EA40 +B7A0 +A100 +AFC0 +A840 +EFC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_5600 +ENCODING 22016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +E480 +AFE0 +A920 +AFE0 +A920 +EBA0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5601 +ENCODING 22017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +E0A0 +AFE0 +AA80 +ABA0 +AAA0 +AFA0 +EAC0 +0EA0 +1360 +2620 +ENDCHAR +STARTCHAR U_5602 +ENCODING 22018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E2E0 +AAA0 +AAA0 +AAA0 +EAE0 +0A00 +EAE0 +AEA0 +A2A0 +A2A0 +E2E0 +ENDCHAR +STARTCHAR U_5603 +ENCODING 22019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A940 +AFE0 +A940 +AFC0 +E900 +0FC0 +0D40 +17C0 +2540 +ENDCHAR +STARTCHAR U_5604 +ENCODING 22020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A840 +AFE0 +E220 +1FA0 +0760 +0A80 +3260 +ENDCHAR +STARTCHAR U_5605 +ENCODING 22021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +EA80 +AE80 +AA80 +AFE0 +A880 +EC80 +0B80 +0DA0 +0AA0 +0460 +ENDCHAR +STARTCHAR U_5606 +ENCODING 22022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E500 +AFC0 +AA40 +AFC0 +A200 +EFC0 +0200 +1FE0 +0480 +1860 +ENDCHAR +STARTCHAR U_5607 +ENCODING 22023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E480 +AFC0 +A480 +AFC0 +A500 +EA80 +1560 +0A80 +0100 +1E00 +ENDCHAR +STARTCHAR U_5608 +ENCODING 22024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +AAA0 +AFE0 +AAA0 +AFE0 +E440 +07C0 +0440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5609 +ENCODING 22025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2080 +3F80 +1100 +FFE0 +2A40 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_560A +ENCODING 22026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0940 +EFC0 +A000 +AFE0 +A900 +AFC0 +E900 +17C0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_560B +ENCODING 22027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EF40 +A560 +BFA0 +A4A0 +AFA0 +F240 +0440 +1E40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_560C +ENCODING 22028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A000 +A7C0 +E000 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_560D +ENCODING 22029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +AFE0 +A540 +AFE0 +E920 +1FE0 +0280 +0380 +1C60 +ENDCHAR +STARTCHAR U_560E +ENCODING 22030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +0200 +EFC0 +AA40 +A940 +AFC0 +A240 +FFE0 +0280 +0320 +1CE0 +ENDCHAR +STARTCHAR U_560F +ENCODING 22031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4A20 +FA20 +4EE0 +4800 +EEE0 +A8A0 +A8A0 +EE40 +A8A0 +0B20 +ENDCHAR +STARTCHAR U_5610 +ENCODING 22032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +EAA0 +A660 +AAA0 +A300 +A480 +FA60 +0500 +0A80 +0100 +0E00 +ENDCHAR +STARTCHAR U_5611 +ENCODING 22033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AF80 +AA40 +EFC0 +1540 +1FE0 +1100 +2300 +ENDCHAR +STARTCHAR U_5612 +ENCODING 22034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E440 +AEE0 +A440 +AEE0 +A440 +EFE0 +0020 +0FE0 +0020 +0FE0 +ENDCHAR +STARTCHAR U_5613 +ENCODING 22035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E160 +BFE0 +A120 +BD20 +B560 +FDA0 +2120 +3AA0 +2460 +3FE0 +ENDCHAR +STARTCHAR U_5614 +ENCODING 22036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E800 +ABC0 +AA40 +ABC0 +A800 +EEE0 +0AA0 +0EE0 +0800 +0FE0 +ENDCHAR +STARTCHAR U_5615 +ENCODING 22037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +A9C0 +A900 +BFE0 +A800 +EFC0 +0800 +0FE0 +1AA0 +2560 +ENDCHAR +STARTCHAR U_5616 +ENCODING 22038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +A100 +AFE0 +E440 +07C0 +0440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_5617 +ENCODING 22039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +9120 +1F00 +2200 +2C40 +3FC0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_5618 +ENCODING 22040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AFC0 +AA20 +E9E0 +AA80 +1AA0 +26C0 +5FE0 +ENDCHAR +STARTCHAR U_5619 +ENCODING 22041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +EBE0 +A2A0 +BBC0 +A740 +AA80 +F540 +1FE0 +0480 +0300 +0CC0 +ENDCHAR +STARTCHAR U_561A +ENCODING 22042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +EA20 +B3E0 +AA20 +ABE0 +B800 +EBE0 +0840 +0BE0 +0A40 +09C0 +ENDCHAR +STARTCHAR U_561B +ENCODING 22043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +F480 +9480 +9FE0 +9480 +F6C0 +1DA0 +14A0 +2480 +4480 +ENDCHAR +STARTCHAR U_561C +ENCODING 22044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A940 +A940 +B6A0 +A440 +FBA0 +0480 +0B00 +0280 +1C40 +ENDCHAR +STARTCHAR U_561D +ENCODING 22045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0720 +EA60 +BFA0 +AAA0 +AFE0 +AAA0 +EFA0 +0AE0 +0AA0 +12A0 +21A0 +ENDCHAR +STARTCHAR U_561E +ENCODING 22046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FE80 +ABE0 +AEA0 +A4A0 +BFA0 +F5A0 +1FA0 +04A0 +1F20 +0560 +ENDCHAR +STARTCHAR U_561F +ENCODING 22047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +FDA0 +AAA0 +BFC0 +A4A0 +AEA0 +EAA0 +1EA0 +2AE0 +0E80 +0A80 +ENDCHAR +STARTCHAR U_5620 +ENCODING 22048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E200 +A7C0 +A540 +A540 +BFE0 +F2A0 +0FC0 +0240 +01A0 +1E60 +ENDCHAR +STARTCHAR U_5621 +ENCODING 22049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0540 +EFE0 +A820 +A7C0 +A440 +A7C0 +E100 +07C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5622 +ENCODING 22050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +EA20 +AAA0 +BE40 +ABE0 +BE40 +E840 +1E40 +0840 +0E40 +30C0 +ENDCHAR +STARTCHAR U_5623 +ENCODING 22051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +E920 +AFE0 +A000 +AEE0 +AAA0 +EEE0 +AAA0 +0EE0 +12A0 +2760 +ENDCHAR +STARTCHAR U_5624 +ENCODING 22052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +EAA0 +AAA0 +AAA0 +B540 +A220 +FFE0 +0480 +0300 +3CE0 +ENDCHAR +STARTCHAR U_5625 +ENCODING 22053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EA80 +B2E0 +AA80 +BFE0 +A880 +EA80 +0AE0 +0A80 +0D80 +08E0 +ENDCHAR +STARTCHAR U_5626 +ENCODING 22054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +4040 +BFA0 +0A00 +3F80 +2A80 +FFE0 +0A00 +3580 +ENDCHAR +STARTCHAR U_5627 +ENCODING 22055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +B220 +A980 +B520 +A6A0 +FB80 +0100 +0920 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5628 +ENCODING 22056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A240 +BFE0 +A240 +AFC0 +F6C0 +1FC0 +1240 +2740 +4AC0 +ENDCHAR +STARTCHAR U_5629 +ENCODING 22057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9FE0 +9540 +9FE0 +9540 +FFE0 +0100 +07C0 +0100 +ENDCHAR +STARTCHAR U_562A +ENCODING 22058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +F4A0 +B4A0 +BFE0 +A840 +AFC0 +E840 +0FC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_562B +ENCODING 22059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E6C0 +AAA0 +B7E0 +AA80 +A480 +E940 +1220 +0000 +14A0 +14A0 +ENDCHAR +STARTCHAR U_562C +ENCODING 22060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +9FE0 +9A00 +FFE0 +0A20 +0F40 +0AC0 +1F20 +ENDCHAR +STARTCHAR U_562D +ENCODING 22061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF20 +A240 +AF80 +A020 +AF40 +E980 +0F20 +0940 +0680 +1F00 +ENDCHAR +STARTCHAR U_562E +ENCODING 22062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15A0 +EEC0 +A480 +AB40 +B220 +BFE0 +F220 +0FC0 +0240 +0440 +09C0 +ENDCHAR +STARTCHAR U_562F +ENCODING 22063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A120 +BFE0 +A120 +AFE0 +A920 +EFE0 +0920 +1DE0 +25A0 +ENDCHAR +STARTCHAR U_5630 +ENCODING 22064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +EBA0 +BDC0 +AB40 +BFE0 +A940 +FFE0 +A940 +0CA0 +1160 +2620 +ENDCHAR +STARTCHAR U_5631 +ENCODING 22065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +AFE0 +A900 +AFC0 +AD40 +EFC0 +1100 +1FE0 +2920 +4FE0 +ENDCHAR +STARTCHAR U_5632 +ENCODING 22066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +1FA0 +E4A0 +AEE0 +AAA0 +AEA0 +EAE0 +AEA0 +04A0 +1F20 +0560 +ENDCHAR +STARTCHAR U_5633 +ENCODING 22067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +AA40 +BFE0 +A840 +AFC0 +E840 +0FC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_5634 +ENCODING 22068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +EBC0 +AAA0 +BFE0 +A480 +AFE0 +F920 +0FE0 +0920 +0FE0 +1120 +ENDCHAR +STARTCHAR U_5635 +ENCODING 22069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A100 +AFE0 +A480 +AFE0 +E480 +1FE0 +0280 +04A0 +1860 +ENDCHAR +STARTCHAR U_5636 +ENCODING 22070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AE0 +FF80 +AA80 +AEE0 +AAA0 +AEA0 +EAA0 +1FA0 +0AA0 +1120 +2220 +ENDCHAR +STARTCHAR U_5637 +ENCODING 22071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +A840 +AFC0 +EA40 +0680 +0A40 +1FE0 +0200 +ENDCHAR +STARTCHAR U_5638 +ENCODING 22072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +B540 +A540 +AFE0 +A540 +A540 +EFE0 +0D40 +0AA0 +12A0 +ENDCHAR +STARTCHAR U_5639 +ENCODING 22073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +B4A0 +AFC0 +B8A0 +AF80 +E880 +0F80 +0A80 +1240 +2620 +ENDCHAR +STARTCHAR U_563A +ENCODING 22074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E200 +BFE0 +A440 +BFA0 +A480 +FFE0 +1020 +17A0 +14A0 +17A0 +ENDCHAR +STARTCHAR U_563B +ENCODING 22075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +BFE0 +A440 +A7C0 +E280 +0FE0 +0440 +0440 +07C0 +ENDCHAR +STARTCHAR U_563C +ENCODING 22076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7FC0 +2480 +3F80 +2480 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_563D +ENCODING 22077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +A000 +A7C0 +A540 +E7C0 +0540 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_563E +ENCODING 22078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AFE0 +AAA0 +AFE0 +A440 +E7C0 +0440 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_563F +ENCODING 22079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +A920 +AFE0 +A100 +A7C0 +E100 +BFE0 +0000 +0AA0 +12A0 +ENDCHAR +STARTCHAR U_5640 +ENCODING 22080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +F2A0 +BEE0 +B2A0 +AE60 +A480 +BFE0 +E480 +1FE0 +0480 +1860 +ENDCHAR +STARTCHAR U_5641 +ENCODING 22081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +AEE0 +A820 +AEE0 +A280 +EFE0 +0140 +1520 +1440 +23C0 +ENDCHAR +STARTCHAR U_5642 +ENCODING 22082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E280 +AFE0 +AAA0 +AC60 +ABA0 +E820 +1FE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_5643 +ENCODING 22083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +A380 +AFE0 +A540 +A920 +FFE0 +0920 +0FE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5644 +ENCODING 22084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +EEA0 +A4A0 +AEA0 +A540 +A280 +AFE0 +E540 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_5645 +ENCODING 22085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +EF40 +A540 +AFC0 +A840 +AFC0 +E840 +0FE0 +0820 +1AA0 +2560 +ENDCHAR +STARTCHAR U_5646 +ENCODING 22086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EA80 +BFE0 +A880 +BDA0 +AA60 +EFC0 +0840 +0FC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_5647 +ENCODING 22087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FC0 +E500 +BFE0 +AA80 +AF80 +AA80 +EA80 +1FC0 +0200 +3FE0 +ENDCHAR +STARTCHAR U_5648 +ENCODING 22088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E4C0 +BEA0 +A1E0 +BE80 +A280 +BEC0 +E8C0 +1CC0 +2B40 +5A60 +ENDCHAR +STARTCHAR U_5649 +ENCODING 22089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +E900 +BFE0 +A540 +BD40 +A540 +BD40 +E540 +3E80 +0540 +0620 +ENDCHAR +STARTCHAR U_564A +ENCODING 22090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E280 +AFE0 +A540 +A900 +AFE0 +EAA0 +0FE0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_564B +ENCODING 22091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +1F40 +EA80 +AEE0 +A120 +AEA0 +A2A0 +E440 +1E40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_564C +ENCODING 22092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A920 +AAA0 +AFE0 +A000 +E7C0 +0440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_564D +ENCODING 22093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E480 +AFE0 +A900 +BFE0 +A900 +EFE0 +0900 +0FE0 +0D40 +12A0 +ENDCHAR +STARTCHAR U_564E +ENCODING 22094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +A820 +A7C0 +E440 +07C0 +0440 +0280 +1FE0 +ENDCHAR +STARTCHAR U_564F +ENCODING 22095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E480 +BB60 +A000 +A7C0 +A440 +BFE0 +EAA0 +0660 +0AA0 +1760 +ENDCHAR +STARTCHAR U_5650 +ENCODING 22096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +7FC0 +0400 +FFE0 +0000 +7FC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_5651 +ENCODING 22097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FC0 +E840 +AFC0 +A840 +AFC0 +AA80 +E700 +0A80 +3FE0 +0200 +ENDCHAR +STARTCHAR U_5652 +ENCODING 22098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +E540 +AFE0 +A540 +A920 +A440 +AEE0 +F340 +0AE0 +0440 +1840 +ENDCHAR +STARTCHAR U_5653 +ENCODING 22099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AB80 +AE20 +E9E0 +0AA0 +0EE0 +1280 +2FE0 +ENDCHAR +STARTCHAR U_5654 +ENCODING 22100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +E280 +ACE0 +A440 +ABA0 +B000 +E7C0 +0440 +07C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_5655 +ENCODING 22101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +7C80 +1500 +3FC0 +2080 +3FE0 +5520 +A960 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5656 +ENCODING 22102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E440 +AEE0 +A440 +AFE0 +A280 +E640 +1920 +07C0 +0080 +0100 +ENDCHAR +STARTCHAR U_5657 +ENCODING 22103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +E6C0 +BFE0 +A280 +AFE0 +A100 +E7C0 +0100 +0FE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_5658 +ENCODING 22104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +ED00 +AA80 +AFE0 +AA20 +AA80 +EF80 +0A80 +1280 +2540 +4A20 +ENDCHAR +STARTCHAR U_5659 +ENCODING 22105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A640 +B920 +A7C0 +A540 +E6C0 +0FE0 +0AA0 +0FA0 +0860 +ENDCHAR +STARTCHAR U_565A +ENCODING 22106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E040 +A7C0 +A040 +AFE0 +A4A0 +FEE0 +0040 +1FE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_565B +ENCODING 22107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +05C0 +E500 +BFE0 +AAC0 +AB40 +AFC0 +EA40 +0F40 +0AC0 +0FC0 +ENDCHAR +STARTCHAR U_565C +ENCODING 22108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +AFE0 +B920 +AFE0 +A920 +BFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_565D +ENCODING 22109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +E880 +B520 +BDC0 +A880 +B520 +BDE0 +E080 +15C0 +2AA0 +01A0 +ENDCHAR +STARTCHAR U_565E +ENCODING 22110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E440 +ABA0 +B000 +AEE0 +AAA0 +EAA0 +0EE0 +0440 +0AA0 +1120 +ENDCHAR +STARTCHAR U_565F +ENCODING 22111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4B00 +5480 +5FC0 +7480 +57C0 +5480 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_5660 +ENCODING 22112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +E880 +A3E0 +A140 +BBE0 +A880 +EBE0 +0880 +0BE0 +1480 +23E0 +ENDCHAR +STARTCHAR U_5661 +ENCODING 22113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E880 +BFE0 +AA40 +AFE0 +A800 +EBC0 +0800 +0BC0 +1240 +23C0 +ENDCHAR +STARTCHAR U_5662 +ENCODING 22114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +AD60 +ABA0 +AFE0 +ABA0 +ED60 +1FE0 +0280 +0440 +1820 +ENDCHAR +STARTCHAR U_5663 +ENCODING 22115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0AA0 +EFE0 +A400 +A7E0 +AA20 +BFA0 +EAA0 +0FA0 +02A0 +1FE0 +ENDCHAR +STARTCHAR U_5664 +ENCODING 22116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +AEC0 +B5A0 +A480 +EFC0 +0000 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_5665 +ENCODING 22117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +AAA0 +AFE0 +AAA0 +AFE0 +E800 +0FE0 +0AA0 +1340 +2220 +ENDCHAR +STARTCHAR U_5666 +ENCODING 22118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05C0 +E500 +BFE0 +A0A0 +BFE0 +A080 +FFA0 +24C0 +2EA0 +3560 +4A20 +ENDCHAR +STARTCHAR U_5667 +ENCODING 22119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +A440 +A7C0 +A540 +A7C0 +E540 +0FE0 +0AA0 +0FA0 +0860 +ENDCHAR +STARTCHAR U_5668 +ENCODING 22120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0480 +FFE0 +1100 +FBE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_5669 +ENCODING 22121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +75C0 +5540 +FFE0 +0400 +75C0 +5540 +75C0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_566A +ENCODING 22122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E480 +A780 +BDE0 +A520 +BDE0 +E200 +1FE0 +0A80 +1240 +2220 +ENDCHAR +STARTCHAR U_566B +ENCODING 22123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +BFE0 +A440 +A7C0 +E440 +07C0 +0120 +0A60 +09C0 +ENDCHAR +STARTCHAR U_566C +ENCODING 22124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +EEE0 +AD40 +B220 +AFE0 +A100 +E540 +0540 +0BA0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_566D +ENCODING 22125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +AAE0 +AFA0 +AAA0 +AEA0 +A4A0 +FF40 +0A40 +12A0 +2720 +ENDCHAR +STARTCHAR U_566E +ENCODING 22126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A000 +BFE0 +A840 +AFC0 +E520 +0CC0 +1540 +2620 +ENDCHAR +STARTCHAR U_566F +ENCODING 22127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +0F20 +E540 +AFE0 +A920 +AA60 +F3C0 +0400 +0FC0 +1380 +0C60 +ENDCHAR +STARTCHAR U_5670 +ENCODING 22128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A940 +B7E0 +BA40 +ABE0 +F640 +1FE0 +0A40 +13E0 +2200 +ENDCHAR +STARTCHAR U_5671 +ENCODING 22129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +AFC0 +AA20 +EFE0 +0AA0 +15C0 +22A0 +4DA0 +ENDCHAR +STARTCHAR U_5672 +ENCODING 22130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E440 +ABA0 +B000 +AFE0 +AAA0 +AFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5673 +ENCODING 22131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +0200 +EFE0 +AA20 +AFC0 +AA20 +EBE0 +0A40 +1FE0 +1280 +2C60 +ENDCHAR +STARTCHAR U_5674 +ENCODING 22132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A540 +AFE0 +A440 +A7C0 +E440 +07C0 +0440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_5675 +ENCODING 22133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +5FE0 +0200 +CFC0 +4940 +4CC0 +6A40 +9FE0 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_5676 +ENCODING 22134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +0480 +EFC0 +A840 +AFC0 +A840 +AFE0 +F920 +2AA0 +0FA0 +0040 +ENDCHAR +STARTCHAR U_5677 +ENCODING 22135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AAE0 +A420 +BEC0 +A080 +AE80 +EA80 +0F40 +0B40 +0E20 +ENDCHAR +STARTCHAR U_5678 +ENCODING 22136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +0880 +FFE0 +A920 +ABE0 +AB20 +BFE0 +E920 +0BE0 +0D40 +0A20 +ENDCHAR +STARTCHAR U_5679 +ENCODING 22137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +B020 +A780 +A480 +AFE0 +E920 +0FE0 +0920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_567A +ENCODING 22138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0860 +FF80 +B500 +ADE0 +BF40 +A940 +BF40 +E940 +1D40 +2A40 +1C40 +ENDCHAR +STARTCHAR U_567B +ENCODING 22139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +B520 +AFE0 +A500 +BFE0 +E480 +0A40 +17A0 +0200 +1FE0 +ENDCHAR +STARTCHAR U_567C +ENCODING 22140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E40 +EBE0 +AAA0 +AEA0 +A840 +AFE0 +EA40 +1AE0 +1A40 +2E40 +0040 +ENDCHAR +STARTCHAR U_567D +ENCODING 22141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +1080 +7C80 +45C0 +7EA0 +28A0 +FE80 +4480 +4400 +7FE0 +ENDCHAR +STARTCHAR U_567E +ENCODING 22142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0FE0 +EAA0 +A540 +AFE0 +A280 +AFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_567F +ENCODING 22143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EAA0 +A660 +AAA0 +BFE0 +A440 +EAA0 +0100 +1FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5680 +ENCODING 22144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +B520 +AD40 +BFE0 +AAA0 +AFE0 +E000 +0FE0 +0100 +0300 +ENDCHAR +STARTCHAR U_5681 +ENCODING 22145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +EAA0 +A660 +AAA0 +AFE0 +B900 +EFC0 +0900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_5682 +ENCODING 22146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +EA40 +AF60 +A980 +AF40 +AA20 +EF00 +0000 +0FE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_5683 +ENCODING 22147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +B100 +AB40 +BD20 +EB40 +0D20 +0900 +0C00 +13E0 +ENDCHAR +STARTCHAR U_5684 +ENCODING 22148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +AFE0 +A900 +BFE0 +A900 +EFE0 +0480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_5685 +ENCODING 22149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +BFE0 +B560 +A380 +A540 +EFE0 +0100 +0FE0 +0AA0 +0AE0 +ENDCHAR +STARTCHAR U_5686 +ENCODING 22150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +A540 +AFE0 +A280 +A380 +E000 +AFE0 +0AA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5687 +ENCODING 22151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +1FE0 +E480 +BFE0 +AD40 +AD40 +BF60 +ED60 +0D40 +1540 +2EC0 +ENDCHAR +STARTCHAR U_5688 +ENCODING 22152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2E40 +EA60 +AE40 +A1E0 +AE40 +AA40 +EE40 +2A40 +2EA0 +4B20 +ENDCHAR +STARTCHAR U_5689 +ENCODING 22153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +1B40 +EA40 +BFE0 +AA40 +BF40 +A4C0 +FF40 +0440 +0740 +18C0 +ENDCHAR +STARTCHAR U_568A +ENCODING 22154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E7C0 +A540 +A6C0 +AFE0 +A920 +AFE0 +E920 +1FE0 +0440 +0840 +ENDCHAR +STARTCHAR U_568B +ENCODING 22155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +BFE0 +A000 +AFE0 +A200 +BFE0 +EA40 +0F40 +00C0 +ENDCHAR +STARTCHAR U_568C +ENCODING 22156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +E520 +BAC0 +AAA0 +B2A0 +AFC0 +E840 +0FC0 +0840 +1040 +ENDCHAR +STARTCHAR U_568D +ENCODING 22157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E140 +BFE0 +A140 +AFE0 +A100 +FFE0 +0AA0 +0FE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_568E +ENCODING 22158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A480 +BFE0 +B020 +AFC0 +EA20 +1540 +0B80 +0540 +1B20 +ENDCHAR +STARTCHAR U_568F +ENCODING 22159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E100 +BFE0 +B540 +A7C0 +A540 +EFE0 +0120 +09C0 +0D00 +13E0 +ENDCHAR +STARTCHAR U_5690 +ENCODING 22160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0940 +0580 +FFE0 +B4A0 +A780 +A920 +AFE0 +E440 +07C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5691 +ENCODING 22161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E200 +BFE0 +AAC0 +AB40 +AFC0 +A200 +EFC0 +0200 +1FE0 +12A0 +ENDCHAR +STARTCHAR U_5692 +ENCODING 22162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +AFE0 +AB40 +AEE0 +A940 +EA40 +1180 +1240 +27E0 +ENDCHAR +STARTCHAR U_5693 +ENCODING 22163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +F820 +AFE0 +AAA0 +B440 +ABA0 +F000 +1FE0 +0940 +1320 +ENDCHAR +STARTCHAR U_5694 +ENCODING 22164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF80 +A200 +BFE0 +AAA0 +AF80 +A500 +FFC0 +0340 +0A00 +17E0 +ENDCHAR +STARTCHAR U_5695 +ENCODING 22165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E880 +BFE0 +A920 +AFE0 +A920 +EFE0 +0AA0 +17E0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5696 +ENCODING 22166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +BFE0 +A480 +AFC0 +E040 +0FC0 +0A20 +2940 +47C0 +ENDCHAR +STARTCHAR U_5697 +ENCODING 22167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A480 +BFE0 +A480 +BFE0 +EA40 +1AA0 +2700 +1AC0 +ENDCHAR +STARTCHAR U_5698 +ENCODING 22168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A740 +A5C0 +A440 +BFE0 +B520 +EFE0 +0A40 +0180 +0E60 +ENDCHAR +STARTCHAR U_5699 +ENCODING 22169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E5E0 +A500 +BFE0 +AAA0 +AD60 +EFE0 +0AA0 +0D60 +0820 +0FE0 +ENDCHAR +STARTCHAR U_569A +ENCODING 22170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FFE0 +4400 +7FC0 +4040 +7FC0 +4400 +FFE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_569B +ENCODING 22171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +0B40 +F5A0 +AB40 +B5A0 +BFE0 +A200 +FFE0 +0700 +0A80 +3260 +ENDCHAR +STARTCHAR U_569C +ENCODING 22172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +A920 +AFE0 +A100 +BFE0 +AAA0 +E100 +0FC0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_569D +ENCODING 22173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +F280 +9FE0 +9280 +9FE0 +9540 +F7C0 +1540 +17C0 +2C60 +ENDCHAR +STARTCHAR U_569E +ENCODING 22174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +1100 +FFE0 +1100 +FFE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_569F +ENCODING 22175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F9E0 +A8A0 +BEA0 +AD20 +BA40 +ED80 +3260 +0A80 +0700 +1AC0 +ENDCHAR +STARTCHAR U_56A0 +ENCODING 22176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1620 +EA20 +AAA0 +B6A0 +A8A0 +B6A0 +BEA0 +E8A0 +3E20 +2AA0 +3E40 +ENDCHAR +STARTCHAR U_56A1 +ENCODING 22177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +FF40 +AAE0 +AE40 +A4E0 +BF40 +B5E0 +FF40 +0440 +3E40 +05E0 +ENDCHAR +STARTCHAR U_56A2 +ENCODING 22178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +7FC0 +5140 +EAE0 +3FC0 +0A00 +7FC0 +2A80 +CDC0 +ENDCHAR +STARTCHAR U_56A3 +ENCODING 22179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +FFE0 +0400 +7FC0 +4440 +5B40 +2080 +FBE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_56A4 +ENCODING 22180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1FE0 +F480 +9FE0 +95C0 +9EA0 +97C0 +F080 +1FE0 +2100 +4300 +ENDCHAR +STARTCHAR U_56A5 +ENCODING 22181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A780 +A840 +BF60 +AD40 +ED40 +3F20 +0D40 +12A0 +ENDCHAR +STARTCHAR U_56A6 +ENCODING 22182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E240 +AC80 +BFC0 +A480 +AFC0 +B4A0 +E100 +25C0 +4500 +9FE0 +ENDCHAR +STARTCHAR U_56A7 +ENCODING 22183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +BFE0 +A420 +AFE0 +AA80 +EF80 +2A80 +3FC0 +5540 +BFE0 +ENDCHAR +STARTCHAR U_56A8 +ENCODING 22184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FF80 +AAE0 +A420 +BFE0 +AA80 +AEE0 +EA80 +0EE0 +0A80 +0AE0 +ENDCHAR +STARTCHAR U_56A9 +ENCODING 22185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08A0 +F3E0 +BC80 +ABE0 +B6A0 +BBE0 +A2A0 +F440 +17E0 +2140 +00C0 +ENDCHAR +STARTCHAR U_56AA +ENCODING 22186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +E520 +BDE0 +A520 +BFE0 +A920 +B5A0 +E8A0 +2DA0 +28A0 +2FE0 +ENDCHAR +STARTCHAR U_56AB +ENCODING 22187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FFA0 +AAE0 +A4A0 +BFA0 +A4E0 +AEA0 +E4E0 +0E40 +15C0 +2D60 +ENDCHAR +STARTCHAR U_56AC +ENCODING 22188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02E0 +EB40 +AAE0 +BFA0 +A2E0 +AAA0 +AAE0 +F3A0 +02E0 +04A0 +1920 +ENDCHAR +STARTCHAR U_56AD +ENCODING 22189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2080 +FDC0 +4AA0 +7C80 +5080 +FFE0 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_56AE +ENCODING 22190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +BEA0 +D2C0 +BEC0 +D4A0 +5EE0 +8980 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_56AF +ENCODING 22191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +BFE0 +B5A0 +A940 +A500 +EFE0 +B900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_56B0 +ENCODING 22192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0FE0 +EA40 +AFE0 +AF60 +AAC0 +AFE0 +E900 +ABC0 +1640 +23C0 +ENDCHAR +STARTCHAR U_56B1 +ENCODING 22193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +08C0 +FEA0 +ABE0 +BC80 +AAA0 +BEC0 +EA80 +2F40 +2A60 +5F20 +ENDCHAR +STARTCHAR U_56B2 +ENCODING 22194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FEA0 +4BE0 +7AA0 +03E0 +FAA0 +13E0 +3880 +E7E0 +2080 +6080 +ENDCHAR +STARTCHAR U_56B3 +ENCODING 22195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +9420 +3FC0 +4400 +FFE0 +2080 +3F80 +ENDCHAR +STARTCHAR U_56B4 +ENCODING 22196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7FE0 +4500 +7F00 +55E0 +5D20 +56A0 +5C40 +56A0 +BD20 +ENDCHAR +STARTCHAR U_56B5 +ENCODING 22197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +E880 +BFE0 +A920 +AFE0 +A520 +AFE0 +F540 +07C0 +02A0 +1CE0 +ENDCHAR +STARTCHAR U_56B6 +ENCODING 22198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +AAA0 +AEE0 +A440 +EAA0 +BFE0 +0480 +0380 +1C60 +ENDCHAR +STARTCHAR U_56B7 +ENCODING 22199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +AAA0 +AEE0 +A280 +AFE0 +A280 +EFE0 +0540 +0C80 +1660 +ENDCHAR +STARTCHAR U_56B8 +ENCODING 22200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F40 +F540 +BF60 +B540 +BF40 +A440 +FFE0 +A520 +1F20 +1520 +2BE0 +ENDCHAR +STARTCHAR U_56B9 +ENCODING 22201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +F080 +BFE0 +AA80 +ABC0 +BEA0 +ABE0 +EAC0 +0BE0 +2A40 +3EC0 +ENDCHAR +STARTCHAR U_56BA +ENCODING 22202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +BAA0 +AFE0 +A200 +BB40 +ED80 +AB60 +0D20 +0B00 +17E0 +ENDCHAR +STARTCHAR U_56BB +ENCODING 22203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +E4E0 +AEA0 +EAE0 +0E00 +EAE0 +AEA0 +AAA0 +AEA0 +EAE0 +1100 +ENDCHAR +STARTCHAR U_56BC +ENCODING 22204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E540 +AFE0 +AAA0 +AFE0 +AA20 +EFE0 +AB20 +0EA0 +0820 +0EE0 +ENDCHAR +STARTCHAR U_56BD +ENCODING 22205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A4A0 +BF40 +B2A0 +AFC0 +E840 +AFC0 +0840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_56BE +ENCODING 22206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E480 +AEE0 +AAA0 +AFE0 +A900 +AFC0 +F900 +0FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_56BF +ENCODING 22207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +FFE0 +A900 +AFC0 +BFC0 +A900 +EFE0 +A440 +0EC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_56C0 +ENCODING 22208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +3FE0 +E8A0 +BFE0 +AAA0 +BFE0 +AA40 +FFE0 +8940 +3F40 +08C0 +ENDCHAR +STARTCHAR U_56C1 +ENCODING 22209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E440 +A7C0 +A440 +AFE0 +A040 +FFE0 +AAA0 +0EE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_56C2 +ENCODING 22210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_56C3 +ENCODING 22211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FF40 +ABE0 +B540 +ABE0 +A940 +FFE0 +A940 +1D40 +2BE0 +0900 +ENDCHAR +STARTCHAR U_56C4 +ENCODING 22212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FF40 +B5E0 +AB40 +BFE0 +A540 +BFE0 +B540 +FF40 +93E0 +1100 +ENDCHAR +STARTCHAR U_56C5 +ENCODING 22213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AC20 +FFE0 +2D40 +FFE0 +AD40 +FFE0 +25A0 +FD40 +2540 +2BA0 +ENDCHAR +STARTCHAR U_56C6 +ENCODING 22214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E480 +AFC0 +AA40 +BFE0 +B2A0 +BFE0 +EA40 +0FC0 +0240 +1FA0 +ENDCHAR +STARTCHAR U_56C7 +ENCODING 22215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E000 +AEE0 +ABA0 +AFE0 +AA80 +AFE0 +EAA0 +AFE0 +1280 +2760 +ENDCHAR +STARTCHAR U_56C8 +ENCODING 22216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E480 +BFE0 +A4A0 +BFA0 +A4E0 +FFA0 +A000 +1FE0 +0440 +0FA0 +ENDCHAR +STARTCHAR U_56C9 +ENCODING 22217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A540 +A9E0 +BF40 +A9E0 +F540 +1BE0 +1540 +2BE0 +ENDCHAR +STARTCHAR U_56CA +ENCODING 22218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +FFE0 +AAA0 +7FC0 +1100 +FFE0 +1240 +3180 +D8E0 +ENDCHAR +STARTCHAR U_56CB +ENCODING 22219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +FFE0 +A440 +BFE0 +AAA0 +B7C0 +E440 +A7C0 +0440 +07C0 +0820 +ENDCHAR +STARTCHAR U_56CC +ENCODING 22220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +AC80 +B5E0 +BE40 +ABE0 +BE40 +EAE0 +1F40 +1440 +2A40 +ENDCHAR +STARTCHAR U_56CD +ENCODING 22221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +8A20 +FBE0 +5140 +FFE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_56CE +ENCODING 22222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0E80 +EBE0 +AEA0 +ABE0 +AEA0 +ABE0 +EF20 +A5E0 +0B20 +11E0 +ENDCHAR +STARTCHAR U_56CF +ENCODING 22223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFE0 +2900 +7FC0 +5440 +7FC0 +1280 +FFE0 +2A40 +47C0 +8240 +ENDCHAR +STARTCHAR U_56D0 +ENCODING 22224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +0F60 +0A40 +EFE0 +AD40 +AA40 +AF40 +E940 +0F40 +15A0 +1520 +ENDCHAR +STARTCHAR U_56D1 +ENCODING 22225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E020 +BFE0 +A540 +AFE0 +AAA0 +EFE0 +2AA0 +2FA0 +22A0 +5F60 +ENDCHAR +STARTCHAR U_56D2 +ENCODING 22226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +0FE0 +E440 +AEE0 +AAA0 +AEE0 +A920 +EFE0 +0BA0 +0D60 +0920 +ENDCHAR +STARTCHAR U_56D3 +ENCODING 22227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E8A0 +BF20 +AA20 +BFC0 +AA00 +BFE0 +F520 +BFE0 +12A0 +1FE0 +ENDCHAR +STARTCHAR U_56D4 +ENCODING 22228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +AA40 +BFE0 +B2A0 +BFE0 +E480 +BFE0 +0D40 +1480 +2760 +ENDCHAR +STARTCHAR U_56D5 +ENCODING 22229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +0AE0 +EF40 +AAA0 +AFC0 +A440 +A7C0 +E440 +07C0 +02A0 +0CE0 +ENDCHAR +STARTCHAR U_56D6 +ENCODING 22230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0EE0 +F540 +AFE0 +AAA0 +AFE0 +A480 +EB40 +05E0 +0F40 +05E0 +ENDCHAR +STARTCHAR U_56D7 +ENCODING 22231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56D8 +ENCODING 22232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +9120 +9120 +9F20 +9020 +90A0 +8FA0 +8020 +8060 +ENDCHAR +STARTCHAR U_56D9 +ENCODING 22233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +FE40 +8240 +8240 +8240 +FE40 +8040 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56DA +ENCODING 22234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8840 +8840 +8840 +8C40 +9240 +A140 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56DB +ENCODING 22235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +9480 +9480 +9480 +9480 +A780 +C080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_56DC +ENCODING 22236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8840 +8840 +9040 +9240 +A740 +B940 +8040 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56DD +ENCODING 22237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +8220 +8420 +BFA0 +8420 +9420 +8820 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56DE +ENCODING 22238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +8040 +9E40 +9240 +9240 +9E40 +9240 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56DF +ENCODING 22239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8080 +A280 +9280 +8C80 +8C80 +9280 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR U_56E0 +ENCODING 22240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8420 +BFA0 +8420 +8420 +8A20 +9120 +A0A0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56E1 +ENCODING 22241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +8840 +FFC0 +9240 +A440 +9C40 +9240 +A140 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56E2 +ENCODING 22242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8440 +8440 +FF40 +8440 +8C40 +9440 +A440 +8C40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56E3 +ENCODING 22243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8240 +8240 +BF40 +8240 +9240 +8A40 +8240 +8640 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56E4 +ENCODING 22244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +FF40 +8840 +AA40 +BE40 +8940 +8F40 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56E5 +ENCODING 22245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BF40 +8040 +9C40 +9440 +9540 +A740 +C040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56E6 +ENCODING 22246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +84A0 +B520 +9620 +9520 +A520 +C4A0 +8C20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56E7 +ENCODING 22247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9240 +A140 +C0C0 +9E40 +9240 +9240 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56E8 +ENCODING 22248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8220 +8C20 +9520 +A4A0 +8420 +8420 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56E9 +ENCODING 22249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +8020 +BFA0 +8420 +8920 +93A0 +BCA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56EA +ENCODING 22250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +1000 +FFC0 +8040 +9540 +8A40 +B440 +8640 +9940 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56EB +ENCODING 22251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A040 +BF40 +D540 +9540 +A540 +C940 +9540 +A240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56EC +ENCODING 22252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +9120 +9F20 +9120 +9120 +9F20 +9120 +9120 +9120 +FFE0 +ENDCHAR +STARTCHAR U_56ED +ENCODING 22253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BE40 +8040 +FF40 +9440 +9540 +A540 +C340 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56EE +ENCODING 22254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9440 +9540 +B640 +DC40 +9540 +9340 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56EF +ENCODING 22255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8420 +8420 +9F20 +8420 +8420 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F0 +ENCODING 22256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8440 +8440 +BF40 +8440 +8E40 +9540 +A540 +8440 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F1 +ENCODING 22257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +FFC0 +8840 +8840 +9F40 +B240 +CC40 +9240 +A140 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F2 +ENCODING 22258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +8920 +BFA0 +8920 +8920 +BFA0 +8920 +9120 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F3 +ENCODING 22259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +94A0 +AAA0 +9120 +8A20 +8420 +8A20 +B1A0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F4 +ENCODING 22260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +FF40 +8840 +BE40 +8840 +FF40 +8940 +8A40 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F5 +ENCODING 22261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +9440 +A240 +D540 +9840 +9140 +8F40 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F6 +ENCODING 22262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +8A20 +9120 +A4A0 +8420 +9F20 +8420 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F7 +ENCODING 22263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8240 +BC40 +8840 +FF40 +8C40 +9A40 +A940 +C840 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56F8 +ENCODING 22264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +8420 +8420 +9720 +9420 +9420 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56F9 +ENCODING 22265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +9440 +AA40 +C940 +BF40 +9240 +8C40 +8440 +FFC0 +8040 +ENDCHAR +STARTCHAR U_56FA +ENCODING 22266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +8840 +FF40 +8840 +BE40 +A240 +A240 +BE40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56FB +ENCODING 22267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +9120 +9F20 +9420 +9F20 +9220 +B9A0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56FC +ENCODING 22268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8820 +9120 +BFA0 +8020 +9F20 +9120 +9F20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_56FD +ENCODING 22269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BF40 +8840 +8840 +BF40 +8A40 +8940 +FFC0 +8040 +FFC0 +ENDCHAR +STARTCHAR U_56FE +ENCODING 22270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9040 +9F40 +B240 +CC40 +9240 +E9C0 +8440 +8840 +8440 +FFC0 +ENDCHAR +STARTCHAR U_56FF +ENCODING 22271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +FFC0 +9140 +BF40 +D140 +9F40 +9140 +9740 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5700 +ENCODING 22272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A20 +9120 +A4A0 +DF60 +8820 +8F20 +9120 +9120 +A620 +FFE0 +ENDCHAR +STARTCHAR U_5701 +ENCODING 22273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BF40 +8040 +BF40 +8040 +BF40 +9240 +9E40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5702 +ENCODING 22274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BF40 +8840 +9D40 +A540 +8E40 +B540 +8CC0 +9440 +FFC0 +ENDCHAR +STARTCHAR U_5703 +ENCODING 22275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8A40 +FFC0 +A940 +BF40 +A940 +BF40 +A940 +AB40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5704 +ENCODING 22276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +BF40 +8840 +BE40 +9240 +FF40 +9240 +9E40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5705 +ENCODING 22277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +1200 +0C00 +FF80 +A280 +9480 +BE80 +8880 +BE80 +8880 +FF80 +ENDCHAR +STARTCHAR U_5706 +ENCODING 22278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9F20 +9120 +BFA0 +A0A0 +A4A0 +A4A0 +8A20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_5707 +ENCODING 22279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8A20 +9120 +AEA0 +8020 +BFA0 +AAA0 +BFA0 +AAA0 +FFE0 +ENDCHAR +STARTCHAR U_5708 +ENCODING 22280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9520 +BFA0 +8820 +BFA0 +9120 +BEE0 +D2A0 +9FA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5709 +ENCODING 22281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +9F20 +8420 +BFA0 +8A20 +9F20 +8420 +BFA0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_570A +ENCODING 22282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +BFA0 +8420 +9F20 +8420 +BFA0 +9120 +9F20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_570B +ENCODING 22283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8540 +FFC0 +8440 +F540 +D540 +F640 +8540 +FB40 +8140 +FFC0 +ENDCHAR +STARTCHAR U_570C +ENCODING 22284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +A4A0 +BFA0 +8020 +BFA0 +8420 +BFA0 +AAA0 +ABA0 +FFE0 +ENDCHAR +STARTCHAR U_570D +ENCODING 22285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BE40 +9240 +BF40 +9240 +BF40 +A440 +FF40 +8440 +FFC0 +ENDCHAR +STARTCHAR U_570E +ENCODING 22286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +BFA0 +8020 +9F20 +9120 +9F20 +9120 +9F20 +A0A0 +FFE0 +ENDCHAR +STARTCHAR U_570F +ENCODING 22287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9520 +BFA0 +8820 +BFA0 +9120 +AEA0 +C960 +8F20 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5710 +ENCODING 22288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +BFA0 +8420 +BFA0 +8820 +8F20 +9120 +A320 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5711 +ENCODING 22289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8520 +FFE0 +A4A0 +BFA0 +A4A0 +8120 +FFE0 +9120 +8320 +FFE0 +ENDCHAR +STARTCHAR U_5712 +ENCODING 22290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8840 +BE40 +8840 +FF40 +A240 +BEC0 +9540 +F240 +9140 +FFC0 +ENDCHAR +STARTCHAR U_5713 +ENCODING 22291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +BFA0 +A0A0 +BFA0 +A0A0 +BFA0 +A0A0 +BFA0 +E0E0 +FFE0 +ENDCHAR +STARTCHAR U_5714 +ENCODING 22292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +9F20 +8420 +BFA0 +8920 +9EA0 +8020 +BFA0 +AAA0 +FFE0 +ENDCHAR +STARTCHAR U_5715 +ENCODING 22293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +BFA0 +84A0 +FFE0 +84A0 +BFA0 +9120 +9F20 +9120 +FFE0 +ENDCHAR +STARTCHAR U_5716 +ENCODING 22294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +9F20 +8420 +FFE0 +AAA0 +AEA0 +A0A0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5717 +ENCODING 22295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +BFA0 +8420 +FFE0 +AAA0 +AEA0 +AAA0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_5718 +ENCODING 22296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +FFE0 +A4A0 +BFA0 +A4A0 +BFA0 +8260 +FFA0 +9220 +FFE0 +ENDCHAR +STARTCHAR U_5719 +ENCODING 22297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +A0A0 +DF60 +8820 +BFA0 +AAA0 +AEA0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_571A +ENCODING 22298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +BFA0 +A4A0 +FFE0 +9120 +9F20 +9120 +9F20 +B1A0 +FFE0 +ENDCHAR +STARTCHAR U_571B +ENCODING 22299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +BFA0 +8420 +9F20 +8420 +BFA0 +8A20 +BFA0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_571C +ENCODING 22300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +BFA0 +AAA0 +FFE0 +9120 +9F20 +8AA0 +9920 +ACA0 +FFE0 +ENDCHAR +STARTCHAR U_571D +ENCODING 22301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4A0 +DF60 +A1E0 +DEA0 +D160 +FFE0 +AAA0 +DF60 +8020 +FFE0 +ENDCHAR +STARTCHAR U_571E +ENCODING 22302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4A0 +DF60 +A0A0 +FFE0 +AAA0 +D560 +FFE0 +9520 +A4A0 +FFE0 +ENDCHAR +STARTCHAR U_571F +ENCODING 22303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +7FC0 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5720 +ENCODING 22304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2200 +FA00 +2200 +2200 +2200 +3A00 +C220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5721 +ENCODING 22305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0400 +0400 +0400 +7FC0 +0400 +0600 +0580 +0480 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5722 +ENCODING 22306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +F880 +2080 +2080 +2080 +3880 +E080 +0280 +0100 +ENDCHAR +STARTCHAR U_5723 +ENCODING 22307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1080 +0900 +0600 +1980 +E460 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5724 +ENCODING 22308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +2200 +2200 +FB00 +2280 +2240 +2240 +2200 +3A00 +C200 +0200 +ENDCHAR +STARTCHAR U_5725 +ENCODING 22309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +FFE0 +1100 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_5726 +ENCODING 22310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +2200 +2200 +FA00 +2200 +2200 +2500 +3500 +C880 +1060 +2040 +ENDCHAR +STARTCHAR U_5727 +ENCODING 22311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2200 +2200 +2200 +2FC0 +2200 +2200 +2200 +4200 +5FE0 +8000 +ENDCHAR +STARTCHAR U_5728 +ENCODING 22312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FFC0 +1000 +2200 +6200 +AF80 +2200 +2200 +2200 +3FC0 +ENDCHAR +STARTCHAR U_5729 +ENCODING 22313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +F100 +2FE0 +2100 +2100 +3100 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_572A +ENCODING 22314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2400 +F800 +27C0 +2080 +2100 +3A00 +E420 +0420 +03E0 +ENDCHAR +STARTCHAR U_572B +ENCODING 22315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +2E00 +2200 +2200 +FBE0 +2E00 +2200 +2A00 +3200 +E220 +01E0 +ENDCHAR +STARTCHAR U_572C +ENCODING 22316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +2000 +FFE0 +2200 +2200 +27E0 +3820 +C020 +0140 +0080 +ENDCHAR +STARTCHAR U_572D +ENCODING 22317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +7F80 +0800 +FFC0 +0000 +0800 +7F80 +0800 +0800 +FFC0 +ENDCHAR +STARTCHAR U_572E +ENCODING 22318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +2020 +F820 +27E0 +2420 +2400 +2400 +3C20 +E420 +03E0 +ENDCHAR +STARTCHAR U_572F +ENCODING 22319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2420 +FC20 +27E0 +2420 +2400 +3C00 +E420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5730 +ENCODING 22320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +2540 +F5C0 +2740 +2D40 +2540 +25C0 +3520 +C420 +03E0 +ENDCHAR +STARTCHAR U_5731 +ENCODING 22321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +2100 +2100 +F900 +27C0 +2100 +2100 +4100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_5732 +ENCODING 22322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +F900 +2100 +2FE0 +2100 +3900 +E100 +0100 +0100 +ENDCHAR +STARTCHAR U_5733 +ENCODING 22323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2520 +2520 +FD20 +2520 +2520 +2520 +3D20 +C920 +1020 +2020 +ENDCHAR +STARTCHAR U_5734 +ENCODING 22324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2220 +FC20 +2220 +2120 +2120 +3820 +C020 +0120 +00C0 +ENDCHAR +STARTCHAR U_5735 +ENCODING 22325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2200 +2200 +FBC0 +2200 +2200 +2200 +3A00 +E200 +0FE0 +ENDCHAR +STARTCHAR U_5736 +ENCODING 22326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0A00 +1100 +E4E0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5737 +ENCODING 22327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +2100 +F900 +2180 +2140 +2140 +3900 +C100 +0100 +ENDCHAR +STARTCHAR U_5738 +ENCODING 22328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +2520 +FD20 +2520 +2520 +2520 +3D20 +C7E0 +0420 +ENDCHAR +STARTCHAR U_5739 +ENCODING 22329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC00 +2400 +2400 +2400 +3C00 +C400 +0800 +1000 +ENDCHAR +STARTCHAR U_573A +ENCODING 22330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2080 +2100 +F200 +2FE0 +22A0 +24A0 +3920 +C220 +0C20 +00C0 +ENDCHAR +STARTCHAR U_573B +ENCODING 22331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +FA00 +23E0 +2240 +2240 +3C40 +E440 +0840 +1040 +ENDCHAR +STARTCHAR U_573C +ENCODING 22332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +2080 +3F80 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_573D +ENCODING 22333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2520 +2960 +2260 +24A0 +2120 +3220 +C4A0 +0040 +ENDCHAR +STARTCHAR U_573E +ENCODING 22334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +2240 +FA80 +22E0 +2220 +2420 +3540 +C880 +1140 +2620 +ENDCHAR +STARTCHAR U_573F +ENCODING 22335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC40 +2AA0 +2280 +2280 +3A80 +C280 +0480 +0880 +ENDCHAR +STARTCHAR U_5740 +ENCODING 22336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +FD00 +25E0 +2500 +2500 +2500 +3D00 +C500 +1FE0 +ENDCHAR +STARTCHAR U_5741 +ENCODING 22337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2480 +FC80 +27E0 +2480 +2480 +3C80 +E5A0 +0660 +0C20 +ENDCHAR +STARTCHAR U_5742 +ENCODING 22338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +2400 +FC00 +27E0 +2520 +2540 +3D40 +C480 +0940 +1620 +ENDCHAR +STARTCHAR U_5743 +ENCODING 22339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2000 +2000 +FFE0 +2280 +2280 +2A80 +3480 +C4A0 +08E0 +1000 +ENDCHAR +STARTCHAR U_5744 +ENCODING 22340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +2480 +F4E0 +2800 +2780 +2480 +3280 +C100 +0280 +1C60 +ENDCHAR +STARTCHAR U_5745 +ENCODING 22341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +F440 +2920 +2080 +27E0 +3840 +C080 +0080 +0100 +ENDCHAR +STARTCHAR U_5746 +ENCODING 22342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2440 +2A40 +2280 +2280 +2100 +3A80 +C460 +1840 +ENDCHAR +STARTCHAR U_5747 +ENCODING 22343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +27E0 +F020 +2420 +2220 +28A0 +3120 +C620 +0020 +00C0 +ENDCHAR +STARTCHAR U_5748 +ENCODING 22344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2820 +F000 +2780 +2480 +2480 +3480 +C4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_5749 +ENCODING 22345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F100 +2540 +2540 +27C0 +3900 +C120 +0120 +00E0 +ENDCHAR +STARTCHAR U_574A +ENCODING 22346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FA00 +23C0 +2240 +2240 +3A40 +C240 +0440 +1980 +ENDCHAR +STARTCHAR U_574B +ENCODING 22347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2240 +FC20 +2800 +27E0 +2220 +3A20 +C220 +0420 +18C0 +ENDCHAR +STARTCHAR U_574C +ENCODING 22348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +5FC0 +88A0 +0880 +1280 +6500 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_574D +ENCODING 22349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2640 +FD40 +2440 +2FE0 +2440 +3C40 +C440 +0940 +1080 +ENDCHAR +STARTCHAR U_574E +ENCODING 22350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +2140 +2100 +2100 +3A80 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_574F +ENCODING 22351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2080 +F880 +2100 +2180 +2340 +3520 +C920 +0100 +0100 +ENDCHAR +STARTCHAR U_5750 +ENCODING 22352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2480 +2480 +5540 +8E20 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5751 +ENCODING 22353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F000 +2780 +2480 +2480 +3C80 +E4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_5752 +ENCODING 22354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4240 +7A80 +4320 +5A20 +E1E0 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5753 +ENCODING 22355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +7FC0 +0900 +FFE0 +1100 +2500 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5754 +ENCODING 22356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0460 +F580 +1600 +2580 +D460 +0800 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5755 +ENCODING 22357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2900 +2900 +2880 +4460 +8400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5756 +ENCODING 22358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFE0 +1200 +1220 +21E0 +C400 +3FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5757 +ENCODING 22359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F940 +2140 +2140 +2FE0 +3100 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_5758 +ENCODING 22360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2200 +FA00 +23C0 +2440 +2440 +2780 +3880 +C080 +0FE0 +ENDCHAR +STARTCHAR U_5759 +ENCODING 22361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2480 +4480 +4900 +2480 +2480 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_575A +ENCODING 22362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +5440 +5280 +5100 +5280 +1460 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_575B +ENCODING 22363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2000 +F000 +2FE0 +2100 +2200 +3200 +C440 +1FE0 +0820 +ENDCHAR +STARTCHAR U_575C +ENCODING 22364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2480 +FC80 +27E0 +24A0 +24A0 +3CA0 +C520 +0AA0 +1440 +ENDCHAR +STARTCHAR U_575D +ENCODING 22365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2520 +FD20 +2520 +2520 +2520 +3D20 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_575E +ENCODING 22366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FC40 +2580 +2400 +27E0 +3820 +E7A0 +0020 +00C0 +ENDCHAR +STARTCHAR U_575F +ENCODING 22367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F440 +2440 +2280 +2280 +3900 +E280 +0440 +0820 +ENDCHAR +STARTCHAR U_5760 +ENCODING 22368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +9100 +A100 +9280 +D440 +A820 +8400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5761 +ENCODING 22369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +FCA0 +2480 +27C0 +2D40 +3540 +E480 +0940 +1620 +ENDCHAR +STARTCHAR U_5762 +ENCODING 22370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +F900 +27C0 +2100 +3900 +EFE0 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_5763 +ENCODING 22371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +1480 +7FE0 +4020 +8440 +3F80 +0400 +0400 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5764 +ENCODING 22372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F920 +2FE0 +2920 +2FE0 +3920 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_5765 +ENCODING 22373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +FFC0 +2440 +2440 +27C0 +2440 +3C40 +C440 +1FE0 +ENDCHAR +STARTCHAR U_5766 +ENCODING 22374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +2440 +FFC0 +2440 +2440 +27C0 +3800 +C000 +0FE0 +ENDCHAR +STARTCHAR U_5767 +ENCODING 22375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2200 +F200 +2400 +27C0 +2C40 +2440 +3440 +E7C0 +0440 +ENDCHAR +STARTCHAR U_5768 +ENCODING 22376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC20 +2200 +2240 +2280 +3B00 +C220 +0220 +01E0 +ENDCHAR +STARTCHAR U_5769 +ENCODING 22377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +2FE0 +F440 +2440 +27C0 +2440 +3C40 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_576A +ENCODING 22378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2920 +F520 +2540 +2100 +2FE0 +3100 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_576B +ENCODING 22379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +21E0 +F900 +2100 +27E0 +2420 +3C20 +E420 +07E0 +0420 +ENDCHAR +STARTCHAR U_576C +ENCODING 22380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +2F80 +2A80 +FA80 +2A80 +2A80 +2A40 +3A40 +CAC0 +13A0 +24A0 +ENDCHAR +STARTCHAR U_576D +ENCODING 22381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2420 +FFE0 +2500 +2520 +2540 +3D80 +C520 +0920 +10E0 +ENDCHAR +STARTCHAR U_576E +ENCODING 22382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2200 +F440 +27E0 +2000 +27C0 +3C40 +E440 +07C0 +0440 +ENDCHAR +STARTCHAR U_576F +ENCODING 22383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +F900 +2380 +2540 +2920 +3920 +E100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_5770 +ENCODING 22384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +FAA0 +2AA0 +2AA0 +2BA0 +3AA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_5771 +ENCODING 22385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F540 +2540 +2540 +2FE0 +3900 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_5772 +ENCODING 22386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2FE0 +F2A0 +2FE0 +2A80 +2FE0 +32A0 +C4E0 +0880 +1080 +ENDCHAR +STARTCHAR U_5773 +ENCODING 22387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +25E0 +FAA0 +2EA0 +24A0 +24A0 +3BA0 +CCA0 +0120 +0260 +ENDCHAR +STARTCHAR U_5774 +ENCODING 22388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +2080 +C460 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5775 +ENCODING 22389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +FA00 +23E0 +2240 +2240 +2240 +3A40 +C240 +07E0 +ENDCHAR +STARTCHAR U_5776 +ENCODING 22390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2640 +2540 +F440 +2FE0 +2640 +2540 +3C40 +C7E0 +0040 +0180 +ENDCHAR +STARTCHAR U_5777 +ENCODING 22391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2040 +2040 +F740 +2540 +2540 +2740 +3540 +C040 +0040 +01C0 +ENDCHAR +STARTCHAR U_5778 +ENCODING 22392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +2200 +27C0 +F840 +2F40 +2940 +2940 +2F40 +3040 +C140 +0080 +ENDCHAR +STARTCHAR U_5779 +ENCODING 22393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +2FE0 +2820 +FAA0 +2280 +2280 +3280 +C440 +0440 +0820 +ENDCHAR +STARTCHAR U_577A +ENCODING 22394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +2240 +2FE0 +2200 +F3C0 +2240 +2240 +2540 +3480 +C940 +1260 +ENDCHAR +STARTCHAR U_577B +ENCODING 22395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2480 +FC80 +27E0 +2480 +2480 +3C80 +E540 +06A0 +00A0 +ENDCHAR +STARTCHAR U_577C +ENCODING 22396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2400 +2400 +FFE0 +2480 +2580 +24C0 +3CA0 +C4A0 +0880 +1080 +ENDCHAR +STARTCHAR U_577D +ENCODING 22397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F920 +2080 +27E0 +2040 +3A80 +C100 +0080 +0080 +ENDCHAR +STARTCHAR U_577E +ENCODING 22398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +7420 +2000 +23C0 +2880 +3080 +C080 +4280 +0100 +ENDCHAR +STARTCHAR U_577F +ENCODING 22399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +4440 +EBE0 +5840 +4A40 +4940 +6940 +4840 +8940 +0880 +ENDCHAR +STARTCHAR U_5780 +ENCODING 22400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2520 +FB40 +2100 +2FE0 +2100 +3900 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_5781 +ENCODING 22401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23C0 +F500 +2900 +2FE0 +2100 +2100 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_5782 +ENCODING 22402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +2480 +FFE0 +2480 +2480 +FFE0 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5783 +ENCODING 22403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +F800 +2440 +2440 +2240 +3A40 +C280 +0080 +0FE0 +ENDCHAR +STARTCHAR U_5784 +ENCODING 22404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0900 +FFE0 +1480 +1520 +2620 +5BE0 +8400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5785 +ENCODING 22405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FA00 +2FE0 +2500 +2540 +2540 +3D80 +C520 +0920 +12E0 +ENDCHAR +STARTCHAR U_5786 +ENCODING 22406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2100 +FFE0 +2420 +2420 +27E0 +3C20 +C400 +0800 +1000 +ENDCHAR +STARTCHAR U_5787 +ENCODING 22407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5CE0 +54A0 +54A0 +F4A0 +57A0 +54A0 +5020 +7020 +9FE0 +1020 +ENDCHAR +STARTCHAR U_5788 +ENCODING 22408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2240 +6FE0 +A200 +21A0 +2460 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5789 +ENCODING 22409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FC0 +5040 +EF40 +4940 +4940 +4F40 +5940 +6880 +C820 +07E0 +ENDCHAR +STARTCHAR U_578A +ENCODING 22410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +4FC0 +E900 +4900 +4FE0 +4900 +6900 +4AA0 +8CA0 +0860 +ENDCHAR +STARTCHAR U_578B +ENCODING 22411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +2940 +2940 +FF40 +2940 +2840 +4CC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_578C +ENCODING 22412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +F820 +2BA0 +2AA0 +2BA0 +3AA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_578D +ENCODING 22413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +27E0 +FC20 +2420 +27E0 +2420 +3FE0 +C420 +0420 +07E0 +ENDCHAR +STARTCHAR U_578E +ENCODING 22414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2440 +FA80 +2100 +2280 +2C60 +37C0 +C440 +0440 +07C0 +ENDCHAR +STARTCHAR U_578F +ENCODING 22415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2140 +FFE0 +2140 +27C0 +2100 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5790 +ENCODING 22416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +87C0 +5440 +2A80 +D300 +4480 +5860 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5791 +ENCODING 22417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +23C0 +2440 +FA80 +2300 +2D00 +23E0 +3C40 +C280 +0100 +0E00 +ENDCHAR +STARTCHAR U_5792 +ENCODING 22418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7F40 +2080 +5140 +EBA0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5793 +ENCODING 22419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +FA40 +2480 +2320 +2240 +3C80 +C140 +0220 +0C20 +ENDCHAR +STARTCHAR U_5794 +ENCODING 22420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +7FC0 +4440 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5795 +ENCODING 22421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4000 +7FC0 +4000 +5F80 +5080 +9F80 +0400 +3F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_5796 +ENCODING 22422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +23E0 +FA20 +2220 +23E0 +2200 +3BE0 +C220 +0220 +03E0 +ENDCHAR +STARTCHAR U_5797 +ENCODING 22423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2AA0 +F6C0 +2280 +26C0 +2AA0 +3280 +C4A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_5798 +ENCODING 22424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +24A0 +F7E0 +2C80 +2480 +2480 +3540 +C540 +0520 +0620 +ENDCHAR +STARTCHAR U_5799 +ENCODING 22425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +F100 +2FE0 +2280 +2280 +3A80 +C2A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_579A +ENCODING 22426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +0400 +FFE0 +0000 +2080 +FBE0 +2080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_579B +ENCODING 22427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2280 +2280 +FCE0 +2100 +2100 +2FE0 +3100 +C580 +0940 +1120 +ENDCHAR +STARTCHAR U_579C +ENCODING 22428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2280 +22E0 +FA20 +24A0 +2940 +2FE0 +3380 +C540 +1920 +0100 +ENDCHAR +STARTCHAR U_579D +ENCODING 22429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFE0 +2400 +25E0 +2520 +3D60 +C500 +0920 +10E0 +ENDCHAR +STARTCHAR U_579E +ENCODING 22430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F820 +20C0 +2700 +2100 +39E0 +C700 +0120 +00E0 +ENDCHAR +STARTCHAR U_579F +ENCODING 22431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +F100 +2100 +27C0 +2100 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_57A0 +ENCODING 22432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2520 +2540 +3C80 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_57A1 +ENCODING 22433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +7FE0 +A440 +2280 +2320 +3CE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57A2 +ENCODING 22434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2400 +F400 +27E0 +2400 +27E0 +3620 +CA20 +0BE0 +1220 +ENDCHAR +STARTCHAR U_57A3 +ENCODING 22435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +F440 +2440 +27C0 +2440 +37C0 +C440 +0000 +0FE0 +ENDCHAR +STARTCHAR U_57A4 +ENCODING 22436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2200 +F440 +27A0 +2100 +2100 +37C0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_57A5 +ENCODING 22437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F820 +27C0 +2000 +27C0 +3C40 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_57A6 +ENCODING 22438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7FA0 +4940 +F080 +0460 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57A7 +ENCODING 22439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2400 +2FE0 +F820 +2BA0 +2AA0 +2AA0 +3BA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_57A8 +ENCODING 22440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +2FE0 +F820 +2080 +27E0 +2080 +3480 +C280 +0080 +0180 +ENDCHAR +STARTCHAR U_57A9 +ENCODING 22441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +4940 +2980 +0900 +FFE0 +0400 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57AA +ENCODING 22442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27C0 +FA80 +2280 +2FE0 +2280 +3280 +C480 +0480 +0880 +ENDCHAR +STARTCHAR U_57AB +ENCODING 22443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FF80 +2280 +36A0 +E3A0 +2CE0 +6400 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57AC +ENCODING 22444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +27E0 +FA40 +2240 +2240 +2FE0 +3000 +C240 +0420 +0820 +ENDCHAR +STARTCHAR U_57AD +ENCODING 22445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2280 +F2A0 +2AA0 +26C0 +2280 +3280 +C280 +0280 +0FE0 +ENDCHAR +STARTCHAR U_57AE +ENCODING 22446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +FBA0 +2000 +2FE0 +2200 +3BC0 +E040 +0240 +0180 +ENDCHAR +STARTCHAR U_57AF +ENCODING 22447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2880 +2480 +23E0 +FC80 +2480 +2540 +2620 +3420 +CA00 +11E0 +ENDCHAR +STARTCHAR U_57B0 +ENCODING 22448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +21C0 +F900 +27E0 +2000 +27E0 +3100 +C140 +0120 +0100 +ENDCHAR +STARTCHAR U_57B1 +ENCODING 22449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2920 +2540 +F100 +27E0 +2020 +2020 +23E0 +3020 +C020 +07E0 +ENDCHAR +STARTCHAR U_57B2 +ENCODING 22450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +2FE0 +F000 +2FE0 +2020 +2FE0 +3800 +C800 +0820 +07E0 +ENDCHAR +STARTCHAR U_57B3 +ENCODING 22451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +24E0 +2800 +F200 +25E0 +2C40 +2440 +2440 +3440 +C440 +04C0 +ENDCHAR +STARTCHAR U_57B4 +ENCODING 22452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F000 +2280 +2AA0 +2920 +3AA0 +CAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_57B5 +ENCODING 22453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +F520 +2100 +2FE0 +2240 +3A40 +E180 +0140 +0E20 +ENDCHAR +STARTCHAR U_57B6 +ENCODING 22454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F440 +2280 +2FE0 +2100 +37C0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_57B7 +ENCODING 22455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2440 +27C0 +3280 +C280 +04A0 +0860 +ENDCHAR +STARTCHAR U_57B8 +ENCODING 22456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +F7C0 +2000 +2FE0 +2280 +3280 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_57B9 +ENCODING 22457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +44A0 +5FA0 +E4A0 +4EC0 +44A0 +5FA0 +64A0 +84E0 +0880 +1080 +ENDCHAR +STARTCHAR U_57BA +ENCODING 22458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2540 +F280 +27E0 +2040 +2080 +37E0 +C080 +0080 +0380 +ENDCHAR +STARTCHAR U_57BB +ENCODING 22459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +FC20 +2420 +27E0 +2420 +37E0 +C240 +0420 +0820 +ENDCHAR +STARTCHAR U_57BC +ENCODING 22460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +44E0 +9800 +2FC0 +6480 +A300 +2CE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57BD +ENCODING 22461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +A400 +57E0 +1480 +2480 +C880 +5080 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57BE +ENCODING 22462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2000 +27C0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_57BF +ENCODING 22463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2800 +FFE0 +2940 +2880 +2FE0 +38A0 +C880 +1280 +2100 +ENDCHAR +STARTCHAR U_57C0 +ENCODING 22464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +75C0 +1520 +F5E0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57C1 +ENCODING 22465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +2FE0 +F100 +2280 +2540 +2920 +37C0 +C080 +0100 +0200 +ENDCHAR +STARTCHAR U_57C2 +ENCODING 22466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +F920 +2FE0 +2920 +2FE0 +3500 +C200 +0500 +18E0 +ENDCHAR +STARTCHAR U_57C3 +ENCODING 22467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +2FA0 +F400 +27C0 +2900 +2100 +3FE0 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_57C4 +ENCODING 22468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2A80 +F100 +2EE0 +2100 +27C0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_57C5 +ENCODING 22469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +6200 +53C0 +5240 +6540 +4880 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57C6 +ENCODING 22470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2880 +FFE0 +2920 +2FE0 +2920 +3FE0 +C920 +0920 +1060 +ENDCHAR +STARTCHAR U_57C7 +ENCODING 22471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2100 +FFE0 +2920 +2FE0 +2920 +3FE0 +C920 +0920 +0860 +ENDCHAR +STARTCHAR U_57C8 +ENCODING 22472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2240 +27E0 +FA40 +2520 +23E0 +3640 +C980 +0240 +0C20 +ENDCHAR +STARTCHAR U_57C9 +ENCODING 22473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +5FE0 +E200 +4A40 +4A40 +56A0 +6200 +C500 +0880 +1060 +ENDCHAR +STARTCHAR U_57CA +ENCODING 22474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +74C0 +2500 +C8E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57CB +ENCODING 22475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2540 +FFC0 +2540 +27C0 +2100 +3FC0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_57CC +ENCODING 22476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +2440 +27C0 +2520 +3D40 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_57CD +ENCODING 22477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +F800 +27E0 +2420 +3FE0 +E420 +47E0 +0420 +0460 +ENDCHAR +STARTCHAR U_57CE +ENCODING 22478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +4FE0 +F880 +4EA0 +4AA0 +5AC0 +6A80 +D6A0 +1160 +2220 +ENDCHAR +STARTCHAR U_57CF +ENCODING 22479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C20 +45C0 +4440 +E960 +4D40 +4540 +4540 +75E0 +CC00 +1200 +21E0 +ENDCHAR +STARTCHAR U_57D0 +ENCODING 22480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4040 +47C0 +E040 +5FE0 +5020 +4FC0 +6480 +8300 +0CC0 +3020 +ENDCHAR +STARTCHAR U_57D1 +ENCODING 22481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE00 +13E0 +1E80 +F280 +1480 +3880 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57D2 +ENCODING 22482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +2520 +FAC0 +2040 +2FE0 +2440 +3A40 +C240 +0040 +00C0 +ENDCHAR +STARTCHAR U_57D3 +ENCODING 22483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +24A0 +F2C0 +2340 +2C40 +27E0 +3040 +C440 +0240 +00C0 +ENDCHAR +STARTCHAR U_57D4 +ENCODING 22484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +2FE0 +F100 +2FE0 +2920 +2FE0 +3920 +CFE0 +0920 +0860 +ENDCHAR +STARTCHAR U_57D5 +ENCODING 22485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +F7C0 +2000 +2FE0 +2100 +37C0 +E100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_57D6 +ENCODING 22486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +2480 +2200 +FA80 +24A0 +2CC0 +2580 +3680 +C4A0 +0460 +ENDCHAR +STARTCHAR U_57D7 +ENCODING 22487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +25C0 +F500 +2FE0 +2100 +2520 +3540 +C980 +0100 +0E00 +ENDCHAR +STARTCHAR U_57D8 +ENCODING 22488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2E40 +2A40 +FBE0 +2A40 +2F40 +2AC0 +2A40 +3A40 +CE40 +00C0 +ENDCHAR +STARTCHAR U_57D9 +ENCODING 22489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F000 +2FE0 +2820 +2920 +3920 +C920 +0280 +0C60 +ENDCHAR +STARTCHAR U_57DA +ENCODING 22490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +F7C0 +2100 +2FE0 +2920 +3AA0 +CC60 +0820 +0860 +ENDCHAR +STARTCHAR U_57DB +ENCODING 22491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2820 +2AA0 +FC60 +2BA0 +2AA0 +2BA0 +3820 +C8A0 +0840 +ENDCHAR +STARTCHAR U_57DC +ENCODING 22492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +3080 +69C0 +A2A0 +2480 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57DD +ENCODING 22493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +2A40 +F120 +2FC0 +2080 +2100 +32C0 +CA20 +0A60 +11C0 +ENDCHAR +STARTCHAR U_57DE +ENCODING 22494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2820 +F000 +2FC0 +2200 +2BC0 +3A00 +CA00 +0E00 +11E0 +ENDCHAR +STARTCHAR U_57DF +ENCODING 22495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +F080 +2EA0 +2AA0 +2EC0 +3080 +C6A0 +1960 +0220 +ENDCHAR +STARTCHAR U_57E0 +ENCODING 22496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2440 +F7C0 +2400 +27C0 +2440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_57E1 +ENCODING 22497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2280 +FEE0 +2820 +2820 +2820 +3EE0 +E280 +0280 +1FE0 +ENDCHAR +STARTCHAR U_57E2 +ENCODING 22498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +2FE0 +F100 +2FE0 +2440 +2FA0 +3C80 +E5A0 +0420 +03E0 +ENDCHAR +STARTCHAR U_57E3 +ENCODING 22499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F440 +2AA0 +2920 +2100 +3FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_57E4 +ENCODING 22500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2920 +FFE0 +2920 +2FE0 +2AA0 +3480 +CFE0 +0080 +0080 +ENDCHAR +STARTCHAR U_57E5 +ENCODING 22501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2100 +2FE0 +2440 +3FC0 +C440 +07C0 +04C0 +ENDCHAR +STARTCHAR U_57E6 +ENCODING 22502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +FA40 +27E0 +29A0 +36A0 +22E0 +3A80 +C4A0 +1860 +ENDCHAR +STARTCHAR U_57E7 +ENCODING 22503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +F840 +2FC0 +2840 +2FC0 +3840 +CFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_57E8 +ENCODING 22504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4300 +4480 +F840 +5720 +4000 +4FE0 +4AA0 +7FE0 +CAA0 +0AA0 +ENDCHAR +STARTCHAR U_57E9 +ENCODING 22505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFC0 +2140 +2FE0 +2140 +37C0 +C100 +0100 +0300 +ENDCHAR +STARTCHAR U_57EA +ENCODING 22506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4100 +4FE0 +4820 +F280 +4440 +4000 +47C0 +7100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_57EB +ENCODING 22507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +FFE0 +2820 +2BA0 +2AA0 +3AA0 +EBA0 +0820 +0840 +ENDCHAR +STARTCHAR U_57EC +ENCODING 22508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +2920 +2FE0 +2920 +3FE0 +E580 +0940 +1120 +ENDCHAR +STARTCHAR U_57ED +ENCODING 22509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +2140 +FFE0 +2140 +2FE0 +2540 +3380 +C540 +1920 +0300 +ENDCHAR +STARTCHAR U_57EE +ENCODING 22510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2540 +2900 +F280 +2D60 +2120 +2540 +3580 +C900 +0280 +0C60 +ENDCHAR +STARTCHAR U_57EF +ENCODING 22511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +F540 +2FE0 +2540 +27C0 +3D40 +E7C0 +0120 +00E0 +ENDCHAR +STARTCHAR U_57F0 +ENCODING 22512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2A20 +F540 +2100 +2FE0 +2100 +3380 +C540 +0920 +1120 +ENDCHAR +STARTCHAR U_57F1 +ENCODING 22513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +45E0 +46A0 +E4A0 +5FA0 +44A0 +46A0 +6DA0 +D440 +24A0 +0D20 +ENDCHAR +STARTCHAR U_57F2 +ENCODING 22514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2200 +2FE0 +3540 +CBA0 +0100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_57F3 +ENCODING 22515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2440 +F880 +22E0 +2C20 +2820 +3EE0 +C820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_57F4 +ENCODING 22516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2440 +27C0 +2440 +3F40 +C5C0 +0440 +1FE0 +ENDCHAR +STARTCHAR U_57F5 +ENCODING 22517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +FFE0 +2540 +2FE0 +2540 +3540 +CFE0 +0100 +07C0 +ENDCHAR +STARTCHAR U_57F6 +ENCODING 22518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +13C0 +FD40 +2940 +5740 +9140 +79C0 +1240 +FC60 +0420 +ENDCHAR +STARTCHAR U_57F7 +ENCODING 22519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +27C0 +F940 +5540 +FB40 +2140 +F9C0 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_57F8 +ENCODING 22520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2200 +27E0 +3AA0 +C2A0 +0D20 +02C0 +ENDCHAR +STARTCHAR U_57F9 +ENCODING 22521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F440 +2280 +2FE0 +2000 +37C0 +C440 +0440 +07C0 +ENDCHAR +STARTCHAR U_57FA +ENCODING 22522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1D00 +1700 +1100 +FFE0 +2480 +DF60 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57FB +ENCODING 22523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F7C0 +2000 +27E0 +2080 +3FE0 +E100 +0500 +0200 +ENDCHAR +STARTCHAR U_57FC +ENCODING 22524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +F440 +2FE0 +2040 +2740 +3D40 +C740 +0040 +01C0 +ENDCHAR +STARTCHAR U_57FD +ENCODING 22525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2040 +27C0 +F040 +2FE0 +2920 +27C0 +3540 +C540 +05C0 +0100 +ENDCHAR +STARTCHAR U_57FE +ENCODING 22526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2620 +3D40 +2480 +3C80 +2560 +FE20 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_57FF +ENCODING 22527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5A00 +2BC0 +CA20 +55E0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5800 +ENCODING 22528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2820 +FFE0 +2880 +2AA0 +2BE0 +2880 +3AA0 +CAA0 +13E0 +ENDCHAR +STARTCHAR U_5801 +ENCODING 22529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +27C0 +2100 +27E0 +3900 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_5802 +ENCODING 22530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +8020 +BFA0 +2080 +3F80 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5803 +ENCODING 22531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4200 +7BC0 +4A40 +6A40 +9CC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5804 +ENCODING 22532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +2820 +FEE0 +2820 +2820 +2FE0 +3A80 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_5805 +ENCODING 22533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A480 +FC80 +8A80 +F900 +A280 +F440 +0800 +7F80 +0800 +FFC0 +ENDCHAR +STARTCHAR U_5806 +ENCODING 22534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +27E0 +FC80 +27E0 +2480 +2480 +3FE0 +C480 +07E0 +0400 +ENDCHAR +STARTCHAR U_5807 +ENCODING 22535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +1200 +7F80 +4480 +FFC0 +0400 +7F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_5808 +ENCODING 22536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2920 +FFE0 +2920 +2D60 +2D60 +3FE0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_5809 +ENCODING 22537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2240 +FFA0 +2000 +27C0 +2440 +3FC0 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_580A +ENCODING 22538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0900 +79E0 +4020 +79E0 +0900 +7FE0 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_580B +ENCODING 22539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +FEE0 +2AA0 +2AA0 +2EE0 +2AA0 +D2A0 +12A0 +2760 +ENDCHAR +STARTCHAR U_580C +ENCODING 22540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2920 +FFE0 +2920 +2BA0 +2AA0 +3BA0 +CAA0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_580D +ENCODING 22541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFC0 +2540 +2540 +27C0 +3300 +C5A0 +0920 +10E0 +ENDCHAR +STARTCHAR U_580E +ENCODING 22542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +2440 +2A20 +23C0 +3E40 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_580F +ENCODING 22543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FBE0 +1100 +39E0 +5520 +92A0 +1440 +3FC0 +0400 +0400 +7FE0 +ENDCHAR +STARTCHAR U_5810 +ENCODING 22544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2900 +FFC0 +2900 +2FE0 +2900 +3FC0 +C900 +1100 +2FE0 +ENDCHAR +STARTCHAR U_5811 +ENCODING 22545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +FDC0 +5100 +FDE0 +1140 +7A40 +1440 +0200 +3FC0 +0200 +7FE0 +ENDCHAR +STARTCHAR U_5812 +ENCODING 22546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +F840 +2FC0 +2900 +2960 +3F80 +E920 +0B20 +0CE0 +ENDCHAR +STARTCHAR U_5813 +ENCODING 22547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +27E0 +F000 +27E0 +2400 +35C0 +C480 +07E0 +0880 +1080 +ENDCHAR +STARTCHAR U_5814 +ENCODING 22548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2440 +F920 +2100 +2FE0 +2100 +3380 +C540 +0920 +1120 +ENDCHAR +STARTCHAR U_5815 +ENCODING 22549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFE0 +A440 +CFC0 +A440 +A7C0 +E440 +84C0 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5816 +ENCODING 22550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +2A80 +FA80 +2540 +2FE0 +2AA0 +3920 +CAA0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5817 +ENCODING 22551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2FE0 +2820 +2240 +F5A0 +2140 +2FE0 +3100 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_5818 +ENCODING 22552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2680 +2FC0 +F200 +3FE0 +2500 +2880 +3260 +EF80 +0200 +1FE0 +ENDCHAR +STARTCHAR U_5819 +ENCODING 22553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +FAA0 +2AA0 +2FE0 +2100 +37C0 +C100 +0100 +1FE0 +ENDCHAR +STARTCHAR U_581A +ENCODING 22554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5220 +EFC0 +4200 +4FC0 +4EC0 +4B40 +6FC0 +C200 +1FE0 +0200 +ENDCHAR +STARTCHAR U_581B +ENCODING 22555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +F440 +27C0 +2000 +2FE0 +3920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_581C +ENCODING 22556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +2AA0 +2920 +2FE0 +3100 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_581D +ENCODING 22557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2740 +F540 +2FE0 +2820 +2BA0 +3AA0 +CBA0 +0820 +0860 +ENDCHAR +STARTCHAR U_581E +ENCODING 22558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2540 +F5C0 +2400 +27E0 +2100 +3FE0 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_581F +ENCODING 22559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +4440 +4780 +E080 +5FE0 +4340 +4580 +7AC0 +C5A0 +02A0 +0D80 +ENDCHAR +STARTCHAR U_5820 +ENCODING 22560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27E0 +F500 +2DE0 +2680 +2480 +37E0 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_5821 +ENCODING 22561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +6200 +BFE0 +2A80 +3260 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5822 +ENCODING 22562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +4A20 +FBE0 +4880 +4FE0 +4880 +79C0 +CAA0 +0CA0 +0880 +ENDCHAR +STARTCHAR U_5823 +ENCODING 22563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +27C0 +2100 +2FE0 +3920 +C960 +0FA0 +0860 +ENDCHAR +STARTCHAR U_5824 +ENCODING 22564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2000 +2FE0 +3500 +C5C0 +0B00 +10E0 +ENDCHAR +STARTCHAR U_5825 +ENCODING 22565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +29E0 +1140 +7F40 +1480 +3140 +5220 +B200 +1FC0 +0200 +7FE0 +ENDCHAR +STARTCHAR U_5826 +ENCODING 22566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2960 +2F80 +F920 +2EE0 +2000 +27C0 +3440 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5827 +ENCODING 22567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +FAA0 +2AA0 +2860 +2100 +3FE0 +C100 +0280 +0C60 +ENDCHAR +STARTCHAR U_5828 +ENCODING 22568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +27C0 +2200 +27E0 +3CA0 +C560 +07A0 +00C0 +ENDCHAR +STARTCHAR U_5829 +ENCODING 22569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4BE0 +4800 +EBE0 +4E20 +5BE0 +4A20 +7BE0 +8800 +0800 +0BE0 +ENDCHAR +STARTCHAR U_582A +ENCODING 22570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +FBC0 +2240 +23C0 +2240 +3FE0 +C540 +0620 +07E0 +ENDCHAR +STARTCHAR U_582B +ENCODING 22571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2920 +2AA0 +FFE0 +2480 +2A40 +33A0 +2480 +3A80 +C100 +1EE0 +ENDCHAR +STARTCHAR U_582C +ENCODING 22572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +4BA0 +F000 +4EA0 +4AA0 +4EA0 +7AA0 +8EA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_582D +ENCODING 22573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +F7C0 +2440 +2FE0 +2100 +3100 +C7C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_582E +ENCODING 22574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +F000 +27C0 +2000 +2FE0 +3200 +E7C0 +0040 +0180 +ENDCHAR +STARTCHAR U_582F +ENCODING 22575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +7FC0 +2100 +FBC0 +2100 +FFE0 +0A00 +1220 +E1E0 +ENDCHAR +STARTCHAR U_5830 +ENCODING 22576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A40 +4BC0 +FA40 +4BC0 +4900 +4FE0 +7A40 +C980 +0A40 +0FE0 +ENDCHAR +STARTCHAR U_5831 +ENCODING 22577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7E20 +1220 +FEC0 +4600 +2BE0 +7E20 +1320 +FEC0 +12A0 +1320 +ENDCHAR +STARTCHAR U_5832 +ENCODING 22578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D20 +4520 +7D20 +4960 +7500 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5833 +ENCODING 22579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +4FE0 +F800 +4BE0 +4A20 +4BE0 +7A20 +CBE0 +1220 +23E0 +ENDCHAR +STARTCHAR U_5834 +ENCODING 22580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2FE0 +2200 +37E0 +CAA0 +14A0 +0920 +02C0 +ENDCHAR +STARTCHAR U_5835 +ENCODING 22581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2120 +27A0 +F940 +27E0 +2100 +3BE0 +E620 +0BE0 +1220 +03E0 +ENDCHAR +STARTCHAR U_5836 +ENCODING 22582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2200 +F7C0 +2880 +27E0 +2420 +3FE0 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_5837 +ENCODING 22583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +4FE0 +4000 +47C0 +7440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5838 +ENCODING 22584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +48A0 +4F20 +FA20 +4FA0 +4AA0 +4AA0 +7FA0 +CA20 +12A0 +2F60 +ENDCHAR +STARTCHAR U_5839 +ENCODING 22585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +FD40 +27C0 +2540 +27C0 +3900 +C7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_583A +ENCODING 22586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4A40 +FFC0 +4A40 +4FC0 +4480 +4840 +74A0 +C480 +0480 +0880 +ENDCHAR +STARTCHAR U_583B +ENCODING 22587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +8FE0 +6240 +3FE0 +C200 +5FE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_583C +ENCODING 22588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +13E0 +FE40 +1140 +7C40 +1940 +E480 +3FC0 +0400 +7FE0 +ENDCHAR +STARTCHAR U_583D +ENCODING 22589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +4AA0 +FFE0 +4000 +4FE0 +4100 +75C0 +C500 +0500 +1FE0 +ENDCHAR +STARTCHAR U_583E +ENCODING 22590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +2200 +F780 +2200 +2FE0 +2480 +2FC0 +F7A0 +2480 +0780 +ENDCHAR +STARTCHAR U_583F +ENCODING 22591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +4FE0 +F880 +4F80 +48A0 +7EA0 +CAC0 +0EA0 +1160 +2220 +ENDCHAR +STARTCHAR U_5840 +ENCODING 22592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +FC40 +2A80 +2FE0 +2A80 +3FE0 +CA80 +1280 +2480 +ENDCHAR +STARTCHAR U_5841 +ENCODING 22593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +2100 +1600 +2500 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5842 +ENCODING 22594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +4FC0 +E480 +5FE0 +4480 +4FC0 +74A0 +C780 +0420 +07E0 +ENDCHAR +STARTCHAR U_5843 +ENCODING 22595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +4100 +5FE0 +4400 +47C0 +4000 +6540 +C540 +0960 +ENDCHAR +STARTCHAR U_5844 +ENCODING 22596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2AA0 +FFE0 +2100 +2FE0 +2200 +33C0 +C440 +0940 +1080 +ENDCHAR +STARTCHAR U_5845 +ENCODING 22597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45C0 +5940 +5160 +FE00 +51C0 +5D40 +5140 +5480 +7880 +D140 +1220 +ENDCHAR +STARTCHAR U_5846 +ENCODING 22598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +4D80 +5540 +EFC0 +4040 +4FC0 +4800 +6FC0 +C040 +01C0 +ENDCHAR +STARTCHAR U_5847 +ENCODING 22599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F820 +27C0 +2000 +27C0 +3C40 +C7C0 +0440 +0FE0 +ENDCHAR +STARTCHAR U_5848 +ENCODING 22600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +9500 +FFC0 +9100 +F340 +A540 +D8C0 +0800 +7F80 +0800 +FFC0 +ENDCHAR +STARTCHAR U_5849 +ENCODING 22601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2D60 +2380 +2D60 +F280 +2FE0 +2440 +27C0 +3C40 +C7C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_584A +ENCODING 22602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2920 +FFE0 +2920 +2FE0 +2140 +33A0 +E5E0 +0920 +10E0 +ENDCHAR +STARTCHAR U_584B +ENCODING 22603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +55A0 +5AC0 +9080 +2940 +4620 +FFE0 +8420 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_584C +ENCODING 22604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +27C0 +3000 +2EE0 +3AA0 +C660 +0BA0 +0660 +ENDCHAR +STARTCHAR U_584D +ENCODING 22605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +57E0 +7200 +5FE0 +5540 +7920 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_584E +ENCODING 22606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F440 +2920 +2280 +2440 +3FE0 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_584F +ENCODING 22607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +F000 +2FE0 +2000 +27C0 +3440 +C7C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_5850 +ENCODING 22608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4100 +EFE0 +4480 +4F00 +4240 +6FE0 +C100 +0940 +1320 +ENDCHAR +STARTCHAR U_5851 +ENCODING 22609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +11E0 +5520 +7DE0 +1220 +2C60 +4400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5852 +ENCODING 22610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2FE0 +2A40 +FBE0 +2E40 +2BE0 +2A40 +3F40 +CAC0 +0040 +00C0 +ENDCHAR +STARTCHAR U_5853 +ENCODING 22611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +F440 +27C0 +2440 +27C0 +3900 +EFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_5854 +ENCODING 22612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2540 +FA80 +2440 +2BA0 +2000 +3FC0 +E440 +07C0 +0440 +ENDCHAR +STARTCHAR U_5855 +ENCODING 22613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4A40 +54A0 +FF40 +4000 +5EE0 +42A0 +6A60 +C6A0 +1B20 +0660 +ENDCHAR +STARTCHAR U_5856 +ENCODING 22614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4100 +5FE0 +E540 +5D60 +4540 +5D60 +6100 +C380 +0540 +1920 +ENDCHAR +STARTCHAR U_5857 +ENCODING 22615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +A840 +57A0 +2200 +5FC0 +CA80 +5240 +6620 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5858 +ENCODING 22616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4900 +FFC0 +4940 +4FE0 +7940 +CFC0 +0C40 +17C0 +2440 +ENDCHAR +STARTCHAR U_5859 +ENCODING 22617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F7C0 +2000 +2FE0 +2820 +3BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_585A +ENCODING 22618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +F200 +2520 +2EC0 +3480 +CBC0 +06A0 +1880 +0300 +ENDCHAR +STARTCHAR U_585B +ENCODING 22619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +4FE0 +FAA0 +4FE0 +4100 +4FE0 +7100 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_585C +ENCODING 22620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +47C0 +E000 +4FE0 +4640 +4B80 +6540 +CB40 +0520 +1B00 +ENDCHAR +STARTCHAR U_585D +ENCODING 22621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2920 +2FE0 +2200 +3BC0 +C240 +0540 +0880 +ENDCHAR +STARTCHAR U_585E +ENCODING 22622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +1100 +2480 +5F40 +0400 +FFE0 +ENDCHAR +STARTCHAR U_585F +ENCODING 22623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1A00 +6B80 +1220 +E5E0 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5860 +ENCODING 22624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +4A00 +4BC0 +E240 +5BC0 +4A00 +4BC0 +4A40 +6BC0 +8800 +17E0 +ENDCHAR +STARTCHAR U_5861 +ENCODING 22625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +4400 +47E0 +F000 +4BC0 +4A40 +4BC0 +5A40 +6FE0 +C440 +0820 +ENDCHAR +STARTCHAR U_5862 +ENCODING 22626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +2400 +27E0 +2400 +3FE0 +C020 +0AA0 +1540 +ENDCHAR +STARTCHAR U_5863 +ENCODING 22627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A840 +5FC0 +2200 +CFC0 +4200 +5FE0 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5864 +ENCODING 22628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FE0 +F820 +2FE0 +2820 +2FE0 +3820 +CFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_5865 +ENCODING 22629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +F440 +27C0 +2000 +2FE0 +3AA0 +CFE0 +0920 +0960 +ENDCHAR +STARTCHAR U_5866 +ENCODING 22630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +5540 +67C0 +5540 +7FE0 +4100 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5867 +ENCODING 22631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +4FE0 +F000 +4440 +4820 +47C0 +4540 +7540 +C540 +0FE0 +ENDCHAR +STARTCHAR U_5868 +ENCODING 22632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4480 +F480 +4FE0 +4A40 +5220 +6340 +CAA0 +12A0 +0600 +ENDCHAR +STARTCHAR U_5869 +ENCODING 22633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FC0 +5000 +EF80 +4880 +4F80 +4000 +5FC0 +7540 +D540 +3FE0 +ENDCHAR +STARTCHAR U_586A +ENCODING 22634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4F00 +4920 +F540 +4000 +4EE0 +4820 +4EE0 +6820 +C820 +0FE0 +ENDCHAR +STARTCHAR U_586B +ENCODING 22635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +F7C0 +2440 +2740 +25C0 +3440 +EFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_586C +ENCODING 22636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4880 +4BE0 +FA20 +4BE0 +4A20 +4BE0 +7880 +CAC0 +14A0 +29A0 +ENDCHAR +STARTCHAR U_586D +ENCODING 22637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +27C0 +2000 +2FE0 +3AA0 +CAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_586E +ENCODING 22638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4E40 +4A40 +EFE0 +4A40 +4F40 +4AC0 +5E40 +6640 +CA40 +16C0 +ENDCHAR +STARTCHAR U_586F +ENCODING 22639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4DE0 +48A0 +FAA0 +4F20 +4240 +4FE0 +7920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5870 +ENCODING 22640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +9540 +2FC0 +4A80 +CFC0 +4080 +0580 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5871 +ENCODING 22641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +8BE0 +FA20 +8BE0 +FA20 +94E0 +E400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5872 +ENCODING 22642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +4C40 +F7C0 +4440 +4FE0 +4400 +6FE0 +D2A0 +0D20 +06C0 +ENDCHAR +STARTCHAR U_5873 +ENCODING 22643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +57C0 +4A40 +E180 +5F60 +4900 +4BC0 +6900 +CFE0 +0900 +17E0 +ENDCHAR +STARTCHAR U_5874 +ENCODING 22644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +4000 +FEE0 +4AA0 +4EE0 +4AA0 +7EE0 +CAA0 +12A0 +2760 +ENDCHAR +STARTCHAR U_5875 +ENCODING 22645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +4940 +7FC0 +5240 +5FA0 +5220 +5FE0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_5876 +ENCODING 22646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +5280 +FFE0 +52A0 +5FE0 +54A0 +77C0 +D480 +15A0 +2660 +ENDCHAR +STARTCHAR U_5877 +ENCODING 22647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +41E0 +4100 +EFE0 +4920 +4AA0 +4D60 +6AA0 +CD60 +0920 +0FE0 +ENDCHAR +STARTCHAR U_5878 +ENCODING 22648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5000 +5380 +F280 +5380 +5000 +57C0 +7540 +D7C0 +1000 +1FE0 +ENDCHAR +STARTCHAR U_5879 +ENCODING 22649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +55E0 +7D40 +5540 +5540 +FE40 +1200 +3FC0 +0200 +FFE0 +ENDCHAR +STARTCHAR U_587A +ENCODING 22650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +5DC0 +6AA0 +4200 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_587B +ENCODING 22651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +FFC0 +2440 +27C0 +2440 +3FE0 +C100 +0280 +1C60 +ENDCHAR +STARTCHAR U_587C +ENCODING 22652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +F7C0 +2D40 +27C0 +20A0 +3FE0 +C480 +0280 +0100 +ENDCHAR +STARTCHAR U_587D +ENCODING 22653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FBA0 +2540 +2BA0 +2540 +3BA0 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_587E +ENCODING 22654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BC0 +7940 +0740 +F940 +26C0 +FC20 +2420 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_587F +ENCODING 22655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FC0 +4940 +FFE0 +4940 +4FC0 +4940 +7FE0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_5880 +ENCODING 22656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +4FE0 +ED20 +5B40 +4D20 +4A80 +6BE0 +CC80 +17E0 +2080 +ENDCHAR +STARTCHAR U_5881 +ENCODING 22657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2FE0 +2AA0 +2AA0 +3FE0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_5882 +ENCODING 22658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +4FE0 +FAA0 +4FE0 +4000 +47C0 +7000 +CFE0 +0540 +1B20 +ENDCHAR +STARTCHAR U_5883 +ENCODING 22659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2440 +27C0 +2440 +37C0 +C280 +04A0 +1860 +ENDCHAR +STARTCHAR U_5884 +ENCODING 22660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4080 +5FE0 +F480 +57A0 +54A0 +5FA0 +7440 +DF40 +14A0 +2D20 +ENDCHAR +STARTCHAR U_5885 +ENCODING 22661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A940 +F880 +ABE0 +FCA0 +2080 +F980 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5886 +ENCODING 22662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5FE0 +4A80 +FBE0 +4000 +5FE0 +5120 +7FC0 +8940 +09C0 +0100 +ENDCHAR +STARTCHAR U_5887 +ENCODING 22663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2440 +27C0 +2440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5888 +ENCODING 22664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +4A80 +EFE0 +4AA0 +4EA0 +4AA0 +7FA0 +D4A0 +1B20 +1E60 +ENDCHAR +STARTCHAR U_5889 +ENCODING 22665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4940 +EFE0 +4940 +4FE0 +7920 +CFE0 +1920 +2FE0 +4920 +ENDCHAR +STARTCHAR U_588A +ENCODING 22666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +23C0 +F940 +5140 +FB40 +22C0 +FC20 +2420 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_588B +ENCODING 22667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +27E0 +FAA0 +27E0 +2280 +2540 +3AA0 +C540 +0280 +0100 +ENDCHAR +STARTCHAR U_588C +ENCODING 22668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4800 +EA80 +4FE0 +4A80 +4A80 +6B80 +D000 +1AA0 +2AA0 +ENDCHAR +STARTCHAR U_588D +ENCODING 22669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A80 +7BE0 +4880 +7980 +52A0 +7460 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_588E +ENCODING 22670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5FA0 +4AA0 +EEC0 +40A0 +4EA0 +42A0 +64A0 +DEE0 +0480 +0C80 +ENDCHAR +STARTCHAR U_588F +ENCODING 22671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +5240 +7580 +1D40 +F7E0 +5240 +94C0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5890 +ENCODING 22672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4440 +FFE0 +4920 +4920 +4FE0 +7100 +C7C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_5891 +ENCODING 22673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2920 +2FE0 +2920 +3BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5892 +ENCODING 22674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +FFE0 +2AA0 +2C60 +2BA0 +3AA0 +CBA0 +0820 +0860 +ENDCHAR +STARTCHAR U_5893 +ENCODING 22675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +3F80 +2080 +3F80 +2080 +FFE0 +2480 +DF60 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5894 +ENCODING 22676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +4500 +F900 +4FE0 +5900 +4FC0 +7900 +CFC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_5895 +ENCODING 22677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4200 +EBC0 +4A00 +5FE0 +4800 +4FC0 +4800 +6FE0 +C020 +1560 +ENDCHAR +STARTCHAR U_5896 +ENCODING 22678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4D80 +5740 +F040 +4FA0 +4880 +5FC0 +5240 +7FC0 +D240 +1FC0 +ENDCHAR +STARTCHAR U_5897 +ENCODING 22679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +4920 +EFE0 +4920 +4FE0 +47C0 +4440 +67C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_5898 +ENCODING 22680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +44E0 +FF00 +53E0 +5E40 +5280 +7E80 +C520 +1F20 +04E0 +ENDCHAR +STARTCHAR U_5899 +ENCODING 22681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4920 +F540 +4FE0 +4000 +4FE0 +7820 +CBA0 +0AA0 +0FE0 +ENDCHAR +STARTCHAR U_589A +ENCODING 22682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BC0 +5540 +4B60 +E540 +5940 +4AC0 +4900 +7FE0 +C580 +0940 +1120 +ENDCHAR +STARTCHAR U_589B +ENCODING 22683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E40 +5240 +5240 +FEE0 +5040 +56C0 +50C0 +7F40 +D540 +1540 +2CC0 +ENDCHAR +STARTCHAR U_589C +ENCODING 22684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BFE0 +C220 +AD40 +A380 +ED40 +8320 +8400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_589D +ENCODING 22685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +2440 +2EE0 +2440 +3FE0 +C280 +04A0 +1860 +ENDCHAR +STARTCHAR U_589E +ENCODING 22686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +F920 +2BA0 +2920 +2FE0 +2440 +37C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_589F +ENCODING 22687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +2FE0 +FAA0 +2F00 +2BE0 +2A80 +3AA0 +CEC0 +1280 +2FE0 +ENDCHAR +STARTCHAR U_58A0 +ENCODING 22688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2FE0 +F540 +27C0 +2540 +2FC0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_58A1 +ENCODING 22689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2100 +F7C0 +2100 +2FE0 +2280 +3FE0 +E440 +07C0 +0440 +ENDCHAR +STARTCHAR U_58A2 +ENCODING 22690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EC0 +4AA0 +4440 +F860 +45C0 +5D40 +5220 +7DC0 +C540 +0480 +1B60 +ENDCHAR +STARTCHAR U_58A3 +ENCODING 22691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +2FE0 +F280 +2FE0 +2100 +27C0 +3100 +CFE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_58A4 +ENCODING 22692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4540 +EFE0 +4000 +47C0 +4440 +77C0 +C440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_58A5 +ENCODING 22693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +F100 +2FE0 +2540 +27C0 +3540 +CFE0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_58A6 +ENCODING 22694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +2540 +FFE0 +2540 +2920 +27C0 +3540 +C7C0 +0540 +07C0 +ENDCHAR +STARTCHAR U_58A7 +ENCODING 22695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4200 +5FE0 +E480 +5FE0 +4480 +4FE0 +6BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_58A8 +ENCODING 22696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +7FC0 +0400 +3F80 +0400 +FFE0 +5540 +BFA0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58A9 +ENCODING 22697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +4AE0 +EFA0 +40A0 +5FA0 +42A0 +64A0 +DE40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_58AA +ENCODING 22698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +49E0 +7A40 +0940 +7D80 +1260 +3400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58AB +ENCODING 22699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3FE0 +2B40 +FDC0 +2A40 +2FC0 +2840 +3FE0 +C880 +0480 +0180 +ENDCHAR +STARTCHAR U_58AC +ENCODING 22700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A480 +BFE0 +C220 +AD40 +A380 +ED40 +8520 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58AD +ENCODING 22701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4FE0 +4900 +EF40 +4AA0 +4F60 +5220 +6FC0 +CB40 +0B40 +1FE0 +ENDCHAR +STARTCHAR U_58AE +ENCODING 22702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A500 +A7E0 +CC40 +B7C0 +A440 +E7C0 +8440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58AF +ENCODING 22703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2500 +77E0 +AC40 +B7C0 +2440 +27C0 +2440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58B0 +ENCODING 22704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +4FE0 +EAA0 +4FE0 +4640 +4540 +67C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_58B1 +ENCODING 22705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2B40 +2480 +F440 +2BA0 +2000 +27C0 +3C40 +C7C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_58B2 +ENCODING 22706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +5B40 +EB40 +5FE0 +4B40 +4B40 +7FE0 +C000 +12A0 +12A0 +ENDCHAR +STARTCHAR U_58B3 +ENCODING 22707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +FFE0 +2440 +27C0 +2440 +3FC0 +E440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_58B4 +ENCODING 22708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4480 +FFE0 +4100 +4FC0 +4940 +6FC0 +C940 +0FC0 +1860 +ENDCHAR +STARTCHAR U_58B5 +ENCODING 22709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +4FE0 +4920 +F540 +4000 +47C0 +6000 +CFE0 +0440 +0FE0 +ENDCHAR +STARTCHAR U_58B6 +ENCODING 22710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +53C0 +4900 +E7E0 +4280 +5FE0 +4900 +6BC0 +C900 +1900 +27E0 +ENDCHAR +STARTCHAR U_58B7 +ENCODING 22711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +4480 +FFE0 +4940 +5FE0 +4940 +5FE0 +6100 +CFC0 +0100 +ENDCHAR +STARTCHAR U_58B8 +ENCODING 22712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +4480 +E240 +4FC0 +4280 +5FE0 +6440 +DFC0 +0440 +07C0 +ENDCHAR +STARTCHAR U_58B9 +ENCODING 22713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +4EE0 +EAA0 +4EE0 +4BA0 +4AA0 +6BA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_58BA +ENCODING 22714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2D60 +FBA0 +2FE0 +2BA0 +2D60 +3920 +CFE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_58BB +ENCODING 22715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4540 +FBA0 +4FE0 +4000 +4FE0 +7820 +CBA0 +0AA0 +0FE0 +ENDCHAR +STARTCHAR U_58BC +ENCODING 22716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +F960 +AA00 +FFE0 +A940 +F8C0 +0520 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58BD +ENCODING 22717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +52E0 +FFA0 +52A0 +5EA0 +48A0 +7EA0 +CA40 +12A0 +2720 +ENDCHAR +STARTCHAR U_58BE +ENCODING 22718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +DA40 +53C0 +E240 +5BC0 +AAA0 +5340 +2420 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58BF +ENCODING 22719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +F100 +2FE0 +2280 +27C0 +3100 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_58C0 +ENCODING 22720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +4A40 +4BE0 +EE00 +48A0 +49E0 +4E40 +6AE0 +DA40 +2E40 +0840 +ENDCHAR +STARTCHAR U_58C1 +ENCODING 22721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +43E0 +7C80 +67E0 +BC80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C2 +ENCODING 22722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8540 +FD60 +AA00 +FFE0 +A940 +FCC0 +AB20 +7FC0 +0200 +FFE0 +ENDCHAR +STARTCHAR U_58C3 +ENCODING 22723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4000 +4FC0 +E940 +5FE0 +4000 +4FE0 +6940 +CFC0 +0940 +1FE0 +ENDCHAR +STARTCHAR U_58C4 +ENCODING 22724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2A80 +F5E0 +2E80 +75C0 +A4A0 +2C80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C5 +ENCODING 22725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2500 +5480 +E7E0 +2C80 +F7E0 +2480 +7FE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C6 +ENCODING 22726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4440 +7BC0 +4A40 +75C0 +4A40 +FFE0 +8420 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58C7 +ENCODING 22727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4AA0 +FBA0 +4820 +4FE0 +4440 +7740 +C5C0 +0440 +1FE0 +ENDCHAR +STARTCHAR U_58C8 +ENCODING 22728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4AA0 +FBA0 +4820 +4FE0 +4180 +7100 +CFE0 +0540 +1920 +ENDCHAR +STARTCHAR U_58C9 +ENCODING 22729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +2FE0 +F920 +2FC0 +2A80 +2D20 +3AC0 +CD80 +12C0 +25A0 +ENDCHAR +STARTCHAR U_58CA +ENCODING 22730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4100 +4FE0 +EAA0 +4FE0 +4100 +5FE0 +6540 +9C80 +0660 +ENDCHAR +STARTCHAR U_58CB +ENCODING 22731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +4FE0 +E820 +47C0 +4440 +4FE0 +6920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_58CC +ENCODING 22732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +EAA0 +4FC0 +4280 +4FE0 +6300 +C4A0 +1C40 +0720 +ENDCHAR +STARTCHAR U_58CD +ENCODING 22733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +4900 +9DE0 +5D40 +C940 +7F40 +4940 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58CE +ENCODING 22734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4100 +4FE0 +FAA0 +4920 +4FE0 +4100 +7FE0 +C100 +0FE0 +12A0 +ENDCHAR +STARTCHAR U_58CF +ENCODING 22735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +5480 +5EE0 +F280 +5F40 +5420 +5F20 +6000 +DFC0 +1540 +3FE0 +ENDCHAR +STARTCHAR U_58D0 +ENCODING 22736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +7FC0 +EEE0 +5540 +6EC0 +5140 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58D1 +ENCODING 22737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +10A0 +FEA0 +AAA0 +5440 +28A0 +7F20 +2400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58D2 +ENCODING 22738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +2480 +F7C0 +2100 +2FE0 +2280 +3440 +EFE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_58D3 +ENCODING 22739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54C0 +5CA0 +55E0 +7E80 +6280 +7F40 +6220 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_58D4 +ENCODING 22740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +2120 +2FC0 +2040 +3FE0 +CA40 +0F40 +00C0 +ENDCHAR +STARTCHAR U_58D5 +ENCODING 22741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +FFE0 +5020 +4FC0 +4440 +6B80 +D540 +0AA0 +1520 +ENDCHAR +STARTCHAR U_58D6 +ENCODING 22742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +4FE0 +F920 +4540 +4920 +4FE0 +7100 +CFE0 +0AA0 +0AA0 +ENDCHAR +STARTCHAR U_58D7 +ENCODING 22743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4140 +4FE0 +F140 +4FE0 +4540 +7AA0 +CFE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_58D8 +ENCODING 22744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58D9 +ENCODING 22745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A80 +FFE0 +2A80 +2FE0 +2D40 +3FC0 +ED40 +17C0 +2C60 +ENDCHAR +STARTCHAR U_58DA +ENCODING 22746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4200 +5FE0 +F220 +5FE0 +5540 +57C0 +7540 +DFE0 +2AA0 +5FE0 +ENDCHAR +STARTCHAR U_58DB +ENCODING 22747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5520 +5DE0 +F520 +5FE0 +52A0 +54A0 +77A0 +D4A0 +17A0 +1060 +ENDCHAR +STARTCHAR U_58DC +ENCODING 22748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +4FC0 +F100 +4FE0 +4920 +4540 +7000 +CFE0 +0480 +0FE0 +ENDCHAR +STARTCHAR U_58DD +ENCODING 22749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +53E0 +4AA0 +E7E0 +7A20 +4BE0 +4A20 +6BE0 +C940 +1A20 +27E0 +ENDCHAR +STARTCHAR U_58DE +ENCODING 22750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4AA0 +EFE0 +4940 +4580 +4940 +7720 +CCC0 +1540 +0620 +ENDCHAR +STARTCHAR U_58DF +ENCODING 22751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +53E0 +FC20 +8BE0 +EA00 +BBE0 +8A20 +7FE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58E0 +ENCODING 22752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +4A80 +FFE0 +4020 +4EE0 +4A80 +4EE0 +6A80 +CEA0 +0AE0 +ENDCHAR +STARTCHAR U_58E1 +ENCODING 22753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +2140 +FD40 +8480 +6940 +B2A0 +4C80 +FBC0 +4880 +7880 +4FE0 +ENDCHAR +STARTCHAR U_58E2 +ENCODING 22754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5360 +5240 +FFE0 +5240 +57E0 +5A40 +7100 +D5E0 +1500 +2FE0 +ENDCHAR +STARTCHAR U_58E3 +ENCODING 22755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +56A0 +5540 +FEA0 +57E0 +5C00 +5540 +7560 +DF60 +3540 +0640 +ENDCHAR +STARTCHAR U_58E4 +ENCODING 22756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +5DC0 +E500 +5FC0 +4500 +5FE0 +6D40 +9480 +0660 +ENDCHAR +STARTCHAR U_58E5 +ENCODING 22757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4800 +4FC0 +ED40 +4FC0 +4900 +4FE0 +6AA0 +D7C0 +1100 +2FE0 +ENDCHAR +STARTCHAR U_58E6 +ENCODING 22758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4440 +4AA0 +FEE0 +4480 +4FE0 +7480 +C7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_58E7 +ENCODING 22759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +5FE0 +F000 +5E80 +54E0 +5FA0 +7AA0 +D640 +1EC0 +2320 +ENDCHAR +STARTCHAR U_58E8 +ENCODING 22760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +FFE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_58E9 +ENCODING 22761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +4FE0 +EBA0 +4540 +5FE0 +6AA0 +DFE0 +14A0 +3FE0 +0520 +ENDCHAR +STARTCHAR U_58EA +ENCODING 22762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +6FA0 +5540 +EDA0 +5FC0 +4040 +5FC0 +7000 +5FC0 +8040 +00C0 +ENDCHAR +STARTCHAR U_58EB +ENCODING 22763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +7FC0 +ENDCHAR +STARTCHAR U_58EC +ENCODING 22764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0380 +7C00 +0400 +0440 +FFE0 +0400 +0400 +0400 +0480 +7FC0 +ENDCHAR +STARTCHAR U_58ED +ENCODING 22765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +7FC0 +0440 +0440 +0540 +0480 +0400 +ENDCHAR +STARTCHAR U_58EE +ENCODING 22766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9100 +5100 +5100 +1FE0 +1100 +3100 +5100 +9100 +1100 +17C0 +ENDCHAR +STARTCHAR U_58EF +ENCODING 22767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +5100 +5100 +7FE0 +1100 +F100 +5100 +5100 +5100 +97C0 +ENDCHAR +STARTCHAR U_58F0 +ENCODING 22768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3FC0 +0000 +3FC0 +2440 +3FC0 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_58F1 +ENCODING 22769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0000 +FFE0 +8020 +1100 +1E00 +1080 +0F80 +ENDCHAR +STARTCHAR U_58F2 +ENCODING 22770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0000 +FFE0 +8020 +1200 +1200 +2240 +41C0 +ENDCHAR +STARTCHAR U_58F3 +ENCODING 22771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3FC0 +0000 +FFE0 +8020 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_58F4 +ENCODING 22772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +3F80 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58F5 +ENCODING 22773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0400 +7FC0 +0000 +2080 +FBE0 +2080 +2080 +FBE0 +ENDCHAR +STARTCHAR U_58F6 +ENCODING 22774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +FFE0 +8920 +2940 +1980 +0900 +FFE0 +ENDCHAR +STARTCHAR U_58F7 +ENCODING 22775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +8A20 +BFA0 +2A80 +2A80 +3F80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58F8 +ENCODING 22776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0000 +7FE0 +8020 +BF80 +4A40 +2A80 +7FE0 +ENDCHAR +STARTCHAR U_58F9 +ENCODING 22777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0000 +FFE0 +A0A0 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58FA +ENCODING 22778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +8A20 +0A00 +3B80 +2080 +3B80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_58FB +ENCODING 22779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2BC0 +2E00 +F3E0 +2000 +27C0 +2440 +37C0 +C440 +04C0 +ENDCHAR +STARTCHAR U_58FC +ENCODING 22780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +8020 +7FC0 +0A00 +3B80 +2080 +1B00 +FFE0 +ENDCHAR +STARTCHAR U_58FD +ENCODING 22781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0440 +7FC0 +0040 +FFE0 +4A40 +4940 +78C0 +ENDCHAR +STARTCHAR U_58FE +ENCODING 22782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +2200 +FBC0 +0240 +FA40 +8BC0 +FA40 +5200 +2200 +FBE0 +ENDCHAR +STARTCHAR U_58FF +ENCODING 22783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4280 +FFE0 +4AA0 +4C60 +4FE0 +7040 +CFE0 +0440 +02C0 +ENDCHAR +STARTCHAR U_5900 +ENCODING 22784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +24A0 +3F80 +0400 +FFE0 +5440 +7240 +00C0 +ENDCHAR +STARTCHAR U_5901 +ENCODING 22785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +5140 +7FC0 +2480 +2E80 +2A80 +2A80 +3F80 +ENDCHAR +STARTCHAR U_5902 +ENCODING 22786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 2 +BITMAP +1000 +1F00 +3100 +4A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5903 +ENCODING 22787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1080 +1100 +13E0 +1020 +1F20 +1120 +2A20 +2620 +4920 +B0C0 +ENDCHAR +STARTCHAR U_5904 +ENCODING 22788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3D00 +2580 +4540 +A920 +2900 +1100 +2900 +4600 +81E0 +ENDCHAR +STARTCHAR U_5905 +ENCODING 22789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +3080 +C900 +0E00 +3580 +C460 +3F80 +2400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_5906 +ENCODING 22790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +3100 +4E00 +FBE0 +0400 +7FC0 +0400 +3FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_5907 +ENCODING 22791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +3100 +4E00 +0B00 +30E0 +FF80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_5908 +ENCODING 22792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2080 +5900 +8600 +1980 +6460 +1500 +7FC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_5909 +ENCODING 22793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +D320 +2800 +1F80 +2900 +4600 +0900 +F0E0 +ENDCHAR +STARTCHAR U_590A +ENCODING 22794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1F80 +5080 +2080 +5100 +8A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_590B +ENCODING 22795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +7F80 +2100 +4880 +9F40 +1100 +2A00 +4400 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_590C +ENCODING 22796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +FFE0 +1100 +2480 +4F40 +1900 +2600 +1900 +E0E0 +ENDCHAR +STARTCHAR U_590D +ENCODING 22797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +6080 +BF80 +2080 +3F80 +1000 +3F80 +C900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_590E +ENCODING 22798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5540 +7FC0 +0400 +FFE0 +1000 +3F80 +4900 +0600 +79E0 +ENDCHAR +STARTCHAR U_590F +ENCODING 22799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +1F80 +1080 +1C80 +1780 +1080 +3F80 +4900 +8600 +39E0 +ENDCHAR +STARTCHAR U_5910 +ENCODING 22800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +FFC0 +2A40 +1F80 +1480 +1280 +1F80 +6900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_5911 +ENCODING 22801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F60 +E0C0 +4F40 +6AA0 +9F20 +1000 +3F80 +5100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5912 +ENCODING 22802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +2FE0 +B920 +AFE0 +A900 +FFE0 +5240 +8C20 +1300 +E0E0 +ENDCHAR +STARTCHAR U_5913 +ENCODING 22803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EC0 +4440 +6EC0 +4A40 +6A40 +4EC0 +6860 +8FA0 +7100 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_5914 +ENCODING 22804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A00 +BAE0 +AEA0 +AA80 +FFE0 +4940 +8920 +0600 +79E0 +ENDCHAR +STARTCHAR U_5915 +ENCODING 22805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0840 +0FE0 +1040 +2880 +4480 +0500 +0100 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_5916 +ENCODING 22806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3D00 +2500 +4580 +A540 +1920 +0900 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5917 +ENCODING 22807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +3E40 +4A40 +4A40 +AA40 +12C0 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5918 +ENCODING 22808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3DE0 +2520 +4520 +A520 +1520 +09A0 +1140 +2100 +C100 +0100 +ENDCHAR +STARTCHAR U_5919 +ENCODING 22809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7F80 +4880 +4F80 +5280 +6A80 +4AA0 +44A0 +8860 +B020 +ENDCHAR +STARTCHAR U_591A +ENCODING 22810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +1F00 +2100 +5200 +0C00 +3400 +CF80 +1080 +6900 +0600 +F800 +ENDCHAR +STARTCHAR U_591B +ENCODING 22811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +1F80 +0080 +FFE0 +1000 +1F80 +6080 +1900 +0600 +7800 +ENDCHAR +STARTCHAR U_591C +ENCODING 22812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1200 +13C0 +2640 +6940 +B480 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_591D +ENCODING 22813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +7500 +57E0 +9900 +5100 +57E0 +2100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_591E +ENCODING 22814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +7D80 +A540 +1920 +3100 +C100 +7A60 +4B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_591F +ENCODING 22815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +4620 +8540 +7480 +57E0 +5520 +76A0 +0440 +0480 +1B00 +ENDCHAR +STARTCHAR U_5920 +ENCODING 22816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +8A20 +5020 +23A0 +FAA0 +2AA0 +CBA0 +2820 +1120 +E0C0 +ENDCHAR +STARTCHAR U_5921 +ENCODING 22817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3900 +4FE0 +B100 +23C0 +4000 +BBC0 +4A40 +B240 +2240 +C3C0 +ENDCHAR +STARTCHAR U_5922 +ENCODING 22818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +FFE0 +8820 +1F80 +2900 +0600 +7800 +ENDCHAR +STARTCHAR U_5923 +ENCODING 22819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3F80 +2A80 +FFE0 +8820 +1F80 +6900 +0600 +7800 +ENDCHAR +STARTCHAR U_5924 +ENCODING 22820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +7100 +0A00 +FFE0 +8020 +7FC0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5925 +ENCODING 22821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A9E0 +FA20 +A940 +F880 +23E0 +F920 +22A0 +7040 +A880 +2300 +ENDCHAR +STARTCHAR U_5926 +ENCODING 22822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FEE0 +2520 +3CA0 +2440 +3D80 +24E0 +FF20 +54A0 +6240 +7D80 +ENDCHAR +STARTCHAR U_5927 +ENCODING 22823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +FFE0 +0400 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5928 +ENCODING 22824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +3C00 +0400 +0400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5929 +ENCODING 22825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592A +ENCODING 22826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +FFE0 +0400 +0A00 +0A00 +1100 +1900 +2480 +C460 +ENDCHAR +STARTCHAR U_592B +ENCODING 22827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592C +ENCODING 22828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3F80 +0480 +0480 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592D +ENCODING 22829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +0400 +FFE0 +0400 +0400 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_592E +ENCODING 22830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3F80 +2480 +2480 +2480 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_592F +ENCODING 22831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1200 +2100 +4880 +8860 +7F80 +0880 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_5930 +ENCODING 22832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +1100 +2080 +D160 +1100 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5931 +ENCODING 22833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5932 +ENCODING 22834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +1100 +2480 +C460 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5933 +ENCODING 22835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0A00 +1100 +E0E0 +1F40 +0000 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR U_5934 +ENCODING 22836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +0A00 +2200 +1200 +0200 +FFE0 +0200 +0500 +0880 +1040 +6020 +ENDCHAR +STARTCHAR U_5935 +ENCODING 22837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +1100 +2480 +C460 +1500 +2480 +C440 +0440 +1C00 +ENDCHAR +STARTCHAR U_5936 +ENCODING 22838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +FFE0 +1100 +1100 +2A80 +2A80 +4440 +4440 +8820 +ENDCHAR +STARTCHAR U_5937 +ENCODING 22839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0440 +7FC0 +4400 +7FE0 +0A20 +3180 +C060 +ENDCHAR +STARTCHAR U_5938 +ENCODING 22840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2E80 +4040 +BFA0 +0800 +1F80 +0080 +0900 +0600 +ENDCHAR +STARTCHAR U_5939 +ENCODING 22841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +2480 +1500 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_593A +ENCODING 22842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0900 +1080 +2040 +C120 +3FC0 +1100 +0900 +0100 +0700 +ENDCHAR +STARTCHAR U_593B +ENCODING 22843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +1100 +2080 +C060 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_593C +ENCODING 22844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +3180 +C060 +2480 +2480 +2480 +2480 +4480 +8080 +ENDCHAR +STARTCHAR U_593D +ENCODING 22845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0A00 +1100 +2080 +DF60 +0000 +7FC0 +0900 +1080 +3FC0 +ENDCHAR +STARTCHAR U_593E +ENCODING 22846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +2480 +5540 +8E20 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_593F +ENCODING 22847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0900 +3080 +C060 +3F80 +2480 +3F80 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_5940 +ENCODING 22848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0D00 +34C0 +C440 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5941 +ENCODING 22849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FFE0 +2880 +2500 +2200 +2500 +2880 +3FC0 +ENDCHAR +STARTCHAR U_5942 +ENCODING 22850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2100 +7FC0 +A440 +2440 +2440 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5943 +ENCODING 22851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +1080 +3F60 +D200 +1FC0 +1200 +1120 +14A0 +1A60 +ENDCHAR +STARTCHAR U_5944 +ENCODING 22852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2480 +7FC0 +A4A0 +3F80 +2480 +3FA0 +0420 +07E0 +ENDCHAR +STARTCHAR U_5945 +ENCODING 22853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2880 +F3E0 +4A40 +4A40 +5A40 +6AC0 +1200 +6200 +ENDCHAR +STARTCHAR U_5946 +ENCODING 22854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FF60 +2000 +3F80 +2080 +3F80 +2000 +3FC0 +ENDCHAR +STARTCHAR U_5947 +ENCODING 22855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +1100 +FFE0 +0080 +3E80 +2280 +3E80 +0080 +0180 +ENDCHAR +STARTCHAR U_5948 +ENCODING 22856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +DF60 +0000 +7FC0 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_5949 +ENCODING 22857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +3F80 +1000 +FFE0 +2480 +5F40 +8420 +7FC0 +0400 +ENDCHAR +STARTCHAR U_594A +ENCODING 22858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2200 +3FC0 +2200 +2F80 +2200 +3FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_594B +ENCODING 22859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +1100 +2080 +FFE0 +2480 +3F80 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_594C +ENCODING 22860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +3F80 +2080 +3F80 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_594D +ENCODING 22861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +3FC0 +0400 +7FE0 +1080 +2940 +C920 +1100 +1100 +2100 +ENDCHAR +STARTCHAR U_594E +ENCODING 22862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +1100 +2480 +DF60 +0400 +7FC0 +0400 +3F80 +0400 +7FC0 +ENDCHAR +STARTCHAR U_594F +ENCODING 22863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +FFE0 +1100 +3F80 +C460 +3F80 +0A00 +1100 +60C0 +ENDCHAR +STARTCHAR U_5950 +ENCODING 22864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +AA40 +3140 +2440 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5951 +ENCODING 22865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +1120 +7D20 +1220 +7CC0 +1400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5952 +ENCODING 22866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2480 +7FC0 +8920 +1A00 +0480 +3900 +0680 +7840 +ENDCHAR +STARTCHAR U_5953 +ENCODING 22867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2F80 +D960 +0600 +3BC0 +0480 +1D00 +0200 +7C00 +ENDCHAR +STARTCHAR U_5954 +ENCODING 22868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2480 +DF60 +0400 +1080 +FFE0 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_5955 +ENCODING 22869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +2A80 +4A40 +1600 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5956 +ENCODING 22870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +53E0 +1640 +3180 +D100 +1600 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5957 +ENCODING 22871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1080 +3F40 +D020 +1F00 +1000 +FFE0 +0800 +1080 +3FC0 +ENDCHAR +STARTCHAR U_5958 +ENCODING 22872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7FE0 +0880 +F880 +2BE0 +4C00 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5959 +ENCODING 22873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +0400 +FFE0 +1100 +2480 +FFE0 +2480 +3FA0 +0420 +03E0 +ENDCHAR +STARTCHAR U_595A +ENCODING 22874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +2480 +0900 +1E00 +0880 +3F40 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_595B +ENCODING 22875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FBE0 +4A40 +7BC0 +4A40 +7BC0 +0440 +08C0 +ENDCHAR +STARTCHAR U_595C +ENCODING 22876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_595D +ENCODING 22877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +3FC0 +E460 +2F40 +2440 +3FC0 +2940 +2F40 +40C0 +ENDCHAR +STARTCHAR U_595E +ENCODING 22878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0900 +3480 +DF60 +2200 +7F80 +A200 +3F80 +2200 +3FC0 +ENDCHAR +STARTCHAR U_595F +ENCODING 22879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FBE0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +94C0 +ENDCHAR +STARTCHAR U_5960 +ENCODING 22880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +3F80 +2A80 +3380 +2E80 +2080 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5961 +ENCODING 22881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2080 +3C80 +2780 +2080 +FFE0 +5140 +9120 +2100 +ENDCHAR +STARTCHAR U_5962 +ENCODING 22882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2880 +5D40 +8A20 +7FE0 +1080 +3F80 +D080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5963 +ENCODING 22883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +2080 +FBE0 +4A40 +7BC0 +4A40 +7BC0 +0440 +ENDCHAR +STARTCHAR U_5964 +ENCODING 22884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3F80 +C460 +7FC0 +4A40 +4E40 +4A40 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_5965 +ENCODING 22885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +5540 +4E40 +7FC0 +4E40 +5540 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5966 +ENCODING 22886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +5640 +2380 +F560 +6BC0 +A140 +66C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5967 +ENCODING 22887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4340 +7D40 +5640 +7FC0 +5540 +64C0 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5968 +ENCODING 22888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5620 +3540 +1FE0 +3240 +D140 +1480 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5969 +ENCODING 22889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +2100 +4080 +FFE0 +5200 +5E00 +4000 +7B80 +4A80 +7FC0 +ENDCHAR +STARTCHAR U_596A +ENCODING 22890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2880 +5240 +BFA0 +6200 +BFC0 +2200 +FFE0 +2100 +1700 +ENDCHAR +STARTCHAR U_596B +ENCODING 22891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +D560 +5DC0 +B040 +5FC0 +3040 +DDC0 +5540 +6540 +ENDCHAR +STARTCHAR U_596C +ENCODING 22892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +5640 +7980 +1640 +FFE0 +5240 +91C0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_596D +ENCODING 22893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +75C0 +2480 +75C0 +5540 +75C0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_596E +ENCODING 22894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +3280 +5FE0 +A200 +7F80 +A200 +3FE0 +2440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_596F +ENCODING 22895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1480 +2740 +D420 +7FE0 +4A40 +5940 +6AA0 +4D60 +B220 +ENDCHAR +STARTCHAR U_5970 +ENCODING 22896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2A80 +3F80 +0000 +FBE0 +AAA0 +FBE0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5971 +ENCODING 22897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +E0E0 +4E40 +E0E0 +5F40 +ABA0 +AEA0 +0400 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_5972 +ENCODING 22898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +4BE0 +F6A0 +2AA0 +FBE0 +4AA0 +FBE0 +4880 +7BE0 +4880 +ENDCHAR +STARTCHAR U_5973 +ENCODING 22899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +0800 +FFE0 +1100 +1100 +2100 +3A00 +0600 +0980 +7040 +ENDCHAR +STARTCHAR U_5974 +ENCODING 22900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA20 +2A20 +2A40 +4940 +5140 +3080 +2880 +4940 +8620 +ENDCHAR +STARTCHAR U_5975 +ENCODING 22901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2080 +F880 +2880 +2880 +4880 +3080 +2880 +4880 +8380 +ENDCHAR +STARTCHAR U_5976 +ENCODING 22902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA40 +2A80 +2AE0 +4A20 +5220 +3420 +2C20 +4520 +88C0 +ENDCHAR +STARTCHAR U_5977 +ENCODING 22903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +F880 +2880 +2FE0 +4880 +5080 +3080 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_5978 +ENCODING 22904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +2880 +2880 +4FE0 +4880 +3080 +3080 +4880 +8080 +ENDCHAR +STARTCHAR U_5979 +ENCODING 22905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F5C0 +5740 +5D40 +5540 +55C0 +2500 +3420 +5420 +83E0 +ENDCHAR +STARTCHAR U_597A +ENCODING 22906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23C0 +FA40 +2C80 +2880 +4900 +5100 +2280 +5240 +8C20 +ENDCHAR +STARTCHAR U_597B +ENCODING 22907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2940 +2940 +4A40 +5240 +3180 +2880 +4540 +8220 +ENDCHAR +STARTCHAR U_597C +ENCODING 22908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2900 +29E0 +4F00 +5100 +3100 +2920 +4920 +84E0 +ENDCHAR +STARTCHAR U_597D +ENCODING 22909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F840 +2880 +2880 +4FE0 +5080 +3080 +2880 +4880 +8380 +ENDCHAR +STARTCHAR U_597E +ENCODING 22910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +2AA0 +2AA0 +4AA0 +52A0 +32A0 +2AA0 +4BE0 +8220 +ENDCHAR +STARTCHAR U_597F +ENCODING 22911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +2940 +2940 +2A40 +6940 +3880 +4940 +4A20 +87E0 +ENDCHAR +STARTCHAR U_5980 +ENCODING 22912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +1100 +1FE0 +F240 +8440 +8440 +9280 +A180 +C240 +9C20 +ENDCHAR +STARTCHAR U_5981 +ENCODING 22913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2C20 +2820 +4A20 +5120 +3120 +2820 +48A0 +8040 +ENDCHAR +STARTCHAR U_5982 +ENCODING 22914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +FBE0 +2A20 +2A20 +4A20 +4A20 +3220 +33E0 +4A20 +8000 +ENDCHAR +STARTCHAR U_5983 +ENCODING 22915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +F820 +2820 +2BE0 +4A00 +5200 +3200 +2A20 +4E20 +81E0 +ENDCHAR +STARTCHAR U_5984 +ENCODING 22916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +3FC0 +0800 +FFE0 +1100 +1A00 +0600 +F9E0 +ENDCHAR +STARTCHAR U_5985 +ENCODING 22917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2880 +2880 +4880 +5080 +3080 +2880 +4FE0 +8000 +ENDCHAR +STARTCHAR U_5986 +ENCODING 22918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +9100 +5FE0 +5240 +1440 +3480 +5280 +9100 +1280 +1C60 +ENDCHAR +STARTCHAR U_5987 +ENCODING 22919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F820 +2820 +2820 +4BE0 +5020 +3020 +2820 +4BE0 +8020 +ENDCHAR +STARTCHAR U_5988 +ENCODING 22920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA40 +2A40 +2A40 +4BE0 +5020 +37A0 +2820 +4820 +81C0 +ENDCHAR +STARTCHAR U_5989 +ENCODING 22921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +FD20 +2900 +2900 +4980 +5280 +22A0 +54A0 +8860 +ENDCHAR +STARTCHAR U_598A +ENCODING 22922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +F880 +2880 +2880 +4FE0 +5080 +3080 +2880 +4880 +83E0 +ENDCHAR +STARTCHAR U_598B +ENCODING 22923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F900 +2900 +4FE0 +4900 +5280 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_598C +ENCODING 22924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4240 +FFE0 +5240 +5240 +97E0 +5240 +2240 +5440 +8440 +0840 +ENDCHAR +STARTCHAR U_598D +ENCODING 22925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2240 +FA40 +2A40 +4FE0 +5240 +3240 +2240 +5440 +8840 +ENDCHAR +STARTCHAR U_598E +ENCODING 22926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +F420 +5A40 +5240 +9240 +5240 +2240 +5440 +8840 +ENDCHAR +STARTCHAR U_598F +ENCODING 22927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +5240 +5240 +5140 +9140 +6080 +2080 +5140 +9620 +ENDCHAR +STARTCHAR U_5990 +ENCODING 22928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA40 +5440 +5520 +5920 +5200 +2200 +2440 +5FE0 +8420 +ENDCHAR +STARTCHAR U_5991 +ENCODING 22929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F540 +5540 +5540 +97C0 +9400 +6400 +2420 +5420 +93E0 +ENDCHAR +STARTCHAR U_5992 +ENCODING 22930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FBE0 +2A20 +2A20 +4BE0 +5200 +3200 +2A00 +4A00 +8400 +ENDCHAR +STARTCHAR U_5993 +ENCODING 22931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2900 +2FC0 +4C40 +5280 +3280 +2900 +4A80 +8460 +ENDCHAR +STARTCHAR U_5994 +ENCODING 22932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F800 +2B80 +2A80 +4A80 +5280 +22A0 +52A0 +8C60 +ENDCHAR +STARTCHAR U_5995 +ENCODING 22933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2AA0 +4AA0 +2BE0 +1080 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_5996 +ENCODING 22934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2900 +2FE0 +4900 +5100 +3100 +2A80 +4A40 +8420 +ENDCHAR +STARTCHAR U_5997 +ENCODING 22935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2C40 +2920 +4880 +57E0 +3040 +2840 +4880 +8080 +ENDCHAR +STARTCHAR U_5998 +ENCODING 22936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +2800 +2FE0 +4900 +5100 +3240 +2A40 +4FA0 +8020 +ENDCHAR +STARTCHAR U_5999 +ENCODING 22937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FB40 +2D20 +2920 +4900 +3120 +1040 +2880 +4100 +8600 +ENDCHAR +STARTCHAR U_599A +ENCODING 22938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2880 +49C0 +49A0 +2AA0 +1480 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_599B +ENCODING 22939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0800 +FFE0 +0900 +1200 +0D00 +70C0 +ENDCHAR +STARTCHAR U_599C +ENCODING 22940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +2940 +2940 +4FE0 +5100 +3100 +2A80 +4440 +8820 +ENDCHAR +STARTCHAR U_599D +ENCODING 22941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4900 +4900 +7FE0 +4940 +0A40 +FA40 +4940 +4880 +4940 +8E20 +ENDCHAR +STARTCHAR U_599E +ENCODING 22942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +F940 +2940 +2940 +4FC0 +5240 +3240 +2A40 +4A40 +87E0 +ENDCHAR +STARTCHAR U_599F +ENCODING 22943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0800 +FFE0 +0900 +1200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59A0 +ENCODING 22944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2AA0 +4AA0 +5360 +3220 +2A20 +4A20 +8260 +ENDCHAR +STARTCHAR U_59A1 +ENCODING 22945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +FA00 +2BE0 +2A40 +4A40 +5240 +3240 +2A40 +4440 +8840 +ENDCHAR +STARTCHAR U_59A2 +ENCODING 22946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FC40 +2820 +2FC0 +4A40 +5240 +3240 +2A40 +4440 +88C0 +ENDCHAR +STARTCHAR U_59A3 +ENCODING 22947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +54A0 +57C0 +5480 +5480 +3480 +24A0 +55A0 +8E60 +ENDCHAR +STARTCHAR U_59A4 +ENCODING 22948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F940 +2880 +2FE0 +48A0 +5080 +3080 +2880 +4A80 +8100 +ENDCHAR +STARTCHAR U_59A5 +ENCODING 22949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0840 +4480 +2100 +0800 +FFE0 +1100 +3200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59A6 +ENCODING 22950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2880 +2880 +4BE0 +5080 +3080 +2FE0 +4880 +8080 +ENDCHAR +STARTCHAR U_59A7 +ENCODING 22951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +2FE0 +2A80 +4A80 +5280 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_59A8 +ENCODING 22952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2900 +29E0 +4920 +5120 +3120 +2920 +4AA0 +8440 +ENDCHAR +STARTCHAR U_59A9 +ENCODING 22953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2900 +2FE0 +4900 +5180 +3280 +2AA0 +44A0 +88E0 +ENDCHAR +STARTCHAR U_59AA +ENCODING 22954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +FB20 +2AA0 +2A40 +4A40 +52A0 +3320 +2A00 +4A00 +83E0 +ENDCHAR +STARTCHAR U_59AB +ENCODING 22955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2300 +F900 +2FE0 +2920 +4920 +51A0 +3260 +2A20 +44A0 +8840 +ENDCHAR +STARTCHAR U_59AC +ENCODING 22956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2900 +2A00 +4BC0 +5640 +3240 +2A40 +4A40 +83C0 +ENDCHAR +STARTCHAR U_59AD +ENCODING 22957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2A00 +2BC0 +4A40 +4A40 +3340 +3480 +4940 +9220 +ENDCHAR +STARTCHAR U_59AE +ENCODING 22958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +FC20 +57E0 +5400 +5520 +9540 +6580 +3520 +4920 +90E0 +ENDCHAR +STARTCHAR U_59AF +ENCODING 22959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2AA0 +4BE0 +52A0 +32A0 +2AA0 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59B0 +ENCODING 22960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +2D00 +2900 +49E0 +5100 +3100 +29E0 +4900 +8100 +ENDCHAR +STARTCHAR U_59B1 +ENCODING 22961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +2920 +2AA0 +4C40 +53E0 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59B2 +ENCODING 22962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2A20 +2BE0 +4A20 +5220 +33E0 +2800 +4800 +87E0 +ENDCHAR +STARTCHAR U_59B3 +ENCODING 22963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2CA0 +2880 +4AC0 +52A0 +34A0 +2880 +4880 +8180 +ENDCHAR +STARTCHAR U_59B4 +ENCODING 22964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +4A40 +D2C0 +2220 +C9E0 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59B5 +ENCODING 22965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2880 +2880 +4880 +53E0 +3080 +2880 +4880 +87E0 +ENDCHAR +STARTCHAR U_59B6 +ENCODING 22966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2900 +2940 +4A40 +5780 +3080 +2900 +4A40 +87A0 +ENDCHAR +STARTCHAR U_59B7 +ENCODING 22967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +F7C0 +5900 +5100 +5FE0 +9100 +5100 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_59B8 +ENCODING 22968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F040 +5740 +5540 +5540 +9740 +6040 +3040 +4840 +81C0 +ENDCHAR +STARTCHAR U_59B9 +ENCODING 22969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2900 +2900 +4FE0 +5100 +2380 +3540 +4920 +8100 +ENDCHAR +STARTCHAR U_59BA +ENCODING 22970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2900 +2900 +4FC0 +5100 +3380 +2D40 +4920 +8100 +ENDCHAR +STARTCHAR U_59BB +ENCODING 22971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +0480 +7FE0 +0480 +FFE0 +0900 +0700 +78E0 +ENDCHAR +STARTCHAR U_59BC +ENCODING 22972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +FA40 +2A40 +2A80 +4EC0 +52A0 +3300 +2240 +5240 +8DC0 +ENDCHAR +STARTCHAR U_59BD +ENCODING 22973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +2AA0 +2BE0 +4AA0 +52A0 +33E0 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_59BE +ENCODING 22974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0800 +FFE0 +1100 +3200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_59BF +ENCODING 22975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BC0 +2A40 +2A40 +5BC0 +0400 +FFE0 +0900 +1200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59C0 +ENCODING 22976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2900 +2FE0 +4900 +5380 +3540 +2920 +4900 +8100 +ENDCHAR +STARTCHAR U_59C1 +ENCODING 22977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2C20 +2BA0 +4AA0 +52A0 +33A0 +2820 +4820 +80C0 +ENDCHAR +STARTCHAR U_59C2 +ENCODING 22978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +4100 +F080 +57C0 +5040 +9080 +5100 +2200 +5700 +88E0 +ENDCHAR +STARTCHAR U_59C3 +ENCODING 22979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2880 +2880 +4AE0 +4A80 +3280 +3280 +4A80 +87E0 +ENDCHAR +STARTCHAR U_59C4 +ENCODING 22980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +FC20 +57E0 +5480 +9480 +97E0 +6480 +34A0 +4D60 +8620 +ENDCHAR +STARTCHAR U_59C5 +ENCODING 22981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +FAC0 +2880 +2FE0 +4880 +5080 +37E0 +2880 +4880 +8080 +ENDCHAR +STARTCHAR U_59C6 +ENCODING 22982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4640 +F540 +5440 +5FE0 +9640 +9540 +6440 +37C0 +4840 +80C0 +ENDCHAR +STARTCHAR U_59C7 +ENCODING 22983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +6FE0 +A480 +2280 +2180 +0800 +FFE0 +1100 +3200 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59C8 +ENCODING 22984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2C40 +2920 +4880 +57E0 +3040 +2A80 +4900 +8080 +ENDCHAR +STARTCHAR U_59C9 +ENCODING 22985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5540 +5540 +5540 +2540 +25C0 +5100 +8100 +ENDCHAR +STARTCHAR U_59CA +ENCODING 22986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4160 +F780 +5500 +5500 +57E0 +5120 +2320 +35C0 +4900 +8100 +ENDCHAR +STARTCHAR U_59CB +ENCODING 22987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA40 +2A20 +2FE0 +4800 +53E0 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59CC +ENCODING 22988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +5540 +57C0 +5540 +5540 +2FE0 +3440 +4C40 +84C0 +ENDCHAR +STARTCHAR U_59CD +ENCODING 22989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FAA0 +AAA0 +AAA0 +BFE0 +AAA0 +4AA0 +6AA0 +5AA0 +8860 +ENDCHAR +STARTCHAR U_59CE +ENCODING 22990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +F7C0 +5540 +5540 +5540 +9FE0 +6100 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_59CF +ENCODING 22991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +F7E0 +5240 +5240 +93C0 +5240 +2240 +5240 +53C0 +8240 +ENDCHAR +STARTCHAR U_59D0 +ENCODING 22992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +FA40 +2A40 +2BC0 +4A40 +5240 +33C0 +2A40 +4A40 +87E0 +ENDCHAR +STARTCHAR U_59D1 +ENCODING 22993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2880 +2880 +4BE0 +5220 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59D2 +ENCODING 22994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2440 +F640 +5540 +5540 +5440 +5440 +3540 +2E40 +44A0 +8120 +ENDCHAR +STARTCHAR U_59D3 +ENCODING 22995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA80 +2BE0 +2C80 +4880 +53E0 +3080 +2880 +4880 +87E0 +ENDCHAR +STARTCHAR U_59D4 +ENCODING 22996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +1500 +E4E0 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_59D5 +ENCODING 22997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5A60 +5380 +5A20 +E1E0 +0800 +FFE0 +0900 +1200 +0C00 +73C0 +ENDCHAR +STARTCHAR U_59D6 +ENCODING 22998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4400 +FC00 +57C0 +5440 +5440 +97C0 +6400 +3400 +4C00 +87E0 +ENDCHAR +STARTCHAR U_59D7 +ENCODING 22999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +EAA0 +AAA0 +BFE0 +AAA0 +AAA0 +4AA0 +6AA0 +5AA0 +9360 +ENDCHAR +STARTCHAR U_59D8 +ENCODING 23000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2A40 +2A40 +4FE0 +5240 +3240 +2A40 +4A40 +8440 +ENDCHAR +STARTCHAR U_59D9 +ENCODING 23001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +4780 +F480 +5480 +5C80 +97E0 +9480 +6480 +2480 +5480 +87E0 +ENDCHAR +STARTCHAR U_59DA +ENCODING 23002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +56C0 +5280 +52C0 +96A0 +6A80 +22A0 +54A0 +8860 +ENDCHAR +STARTCHAR U_59DB +ENCODING 23003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +FBA0 +A820 +ABA0 +AAA0 +AAA0 +4BA0 +6820 +9820 +8860 +ENDCHAR +STARTCHAR U_59DC +ENCODING 23004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_59DD +ENCODING 23005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +5900 +5100 +9FE0 +5100 +2380 +3540 +4920 +8100 +ENDCHAR +STARTCHAR U_59DE +ENCODING 23006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2880 +2BE0 +4800 +53E0 +3220 +2A20 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59DF +ENCODING 23007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2900 +2A40 +4FA0 +5140 +3280 +2D40 +4A20 +8420 +ENDCHAR +STARTCHAR U_59E0 +ENCODING 23008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4200 +FFE0 +A820 +ABA0 +AAA0 +AAA0 +4BA0 +6820 +9820 +88E0 +ENDCHAR +STARTCHAR U_59E1 +ENCODING 23009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +5100 +5FE0 +5100 +97C0 +6440 +3440 +4C40 +87C0 +ENDCHAR +STARTCHAR U_59E2 +ENCODING 23010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4440 +FFE0 +5000 +57C0 +5440 +97C0 +6440 +37C0 +4C40 +84C0 +ENDCHAR +STARTCHAR U_59E3 +ENCODING 23011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2A40 +2C20 +4A40 +5240 +3180 +2980 +4A40 +8420 +ENDCHAR +STARTCHAR U_59E4 +ENCODING 23012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +F400 +57E0 +5400 +55E0 +5520 +3520 +2D20 +45E0 +8920 +ENDCHAR +STARTCHAR U_59E5 +ENCODING 23013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2120 +F7C0 +5140 +5FE0 +5200 +5240 +3680 +2B20 +4A20 +81E0 +ENDCHAR +STARTCHAR U_59E6 +ENCODING 23014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +71C0 +2080 +FFE0 +4A40 +4A40 +3180 +CE60 +ENDCHAR +STARTCHAR U_59E7 +ENCODING 23015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FC80 +4880 +3080 +CBE0 +2080 +FC80 +4880 +3080 +C880 +ENDCHAR +STARTCHAR U_59E8 +ENCODING 23016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +57E0 +5120 +57E0 +5500 +37E0 +2920 +4280 +8C60 +ENDCHAR +STARTCHAR U_59E9 +ENCODING 23017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +FA80 +5480 +53E0 +5280 +5280 +2FE0 +3080 +4880 +8080 +ENDCHAR +STARTCHAR U_59EA +ENCODING 23018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +5440 +57A0 +5100 +5100 +27C0 +3100 +4900 +87E0 +ENDCHAR +STARTCHAR U_59EB +ENCODING 23019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4480 +FC80 +57E0 +5420 +5420 +97E0 +6480 +3480 +4C80 +87E0 +ENDCHAR +STARTCHAR U_59EC +ENCODING 23020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FC80 +55C0 +5540 +5540 +5540 +25C0 +3480 +4C80 +87E0 +ENDCHAR +STARTCHAR U_59ED +ENCODING 23021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +1100 +FBE0 +2920 +DA60 +0400 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_59EE +ENCODING 23022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +FBC0 +2A40 +2A40 +4BC0 +5240 +23C0 +3240 +4800 +87E0 +ENDCHAR +STARTCHAR U_59EF +ENCODING 23023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +F540 +5100 +5FE0 +5280 +9280 +6280 +22A0 +54A0 +8860 +ENDCHAR +STARTCHAR U_59F0 +ENCODING 23024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2C20 +2BA0 +4AA0 +53A0 +32A0 +2BA0 +4820 +80E0 +ENDCHAR +STARTCHAR U_59F1 +ENCODING 23025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +5440 +5BA0 +5000 +5FE0 +2200 +33C0 +4840 +8180 +ENDCHAR +STARTCHAR U_59F2 +ENCODING 23026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +5520 +5100 +57E0 +5240 +2240 +3180 +4940 +8620 +ENDCHAR +STARTCHAR U_59F3 +ENCODING 23027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F220 +5540 +5080 +5100 +57E0 +2220 +3220 +4BE0 +8220 +ENDCHAR +STARTCHAR U_59F4 +ENCODING 23028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +2240 +7A40 +8A40 +50C0 +2800 +FFC0 +1200 +2400 +1A00 +F1C0 +ENDCHAR +STARTCHAR U_59F5 +ENCODING 23029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +FFC0 +5540 +57C0 +5540 +9540 +6540 +35C0 +4920 +9120 +ENDCHAR +STARTCHAR U_59F6 +ENCODING 23030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +5820 +57C0 +5000 +57C0 +2440 +3440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_59F7 +ENCODING 23031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +53E0 +5620 +5BE0 +5220 +23E0 +3220 +4A20 +8260 +ENDCHAR +STARTCHAR U_59F8 +ENCODING 23032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4EE0 +F440 +5440 +5440 +5EE0 +9440 +6440 +3440 +4840 +9040 +ENDCHAR +STARTCHAR U_59F9 +ENCODING 23033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2C20 +2BC0 +4900 +51E0 +3700 +2920 +4920 +80E0 +ENDCHAR +STARTCHAR U_59FA +ENCODING 23034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +5900 +5100 +5FE0 +5280 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_59FB +ENCODING 23035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +F520 +57E0 +5520 +5520 +55A0 +2660 +3420 +4FE0 +8420 +ENDCHAR +STARTCHAR U_59FC +ENCODING 23036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +FA20 +5540 +5080 +5100 +56E0 +2120 +32A0 +4840 +8780 +ENDCHAR +STARTCHAR U_59FD +ENCODING 23037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +57E0 +5400 +55C0 +9540 +65C0 +3500 +4920 +90E0 +ENDCHAR +STARTCHAR U_59FE +ENCODING 23038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2820 +2FC0 +4900 +5100 +37C0 +2900 +4900 +87E0 +ENDCHAR +STARTCHAR U_59FF +ENCODING 23039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2A40 +C200 +4500 +48E0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5A00 +ENCODING 23040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +20C0 +F0A0 +5FE0 +5480 +54A0 +5FA0 +24C0 +3480 +4960 +8220 +ENDCHAR +STARTCHAR U_5A01 +ENCODING 23041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +7FE0 +4100 +5D20 +4920 +7F40 +5540 +4CA0 +9360 +A420 +ENDCHAR +STARTCHAR U_5A02 +ENCODING 23042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +5280 +5280 +9280 +5FE0 +2000 +3280 +4460 +8840 +ENDCHAR +STARTCHAR U_5A03 +ENCODING 23043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +5100 +5FE0 +9100 +5100 +27C0 +3100 +4900 +87E0 +ENDCHAR +STARTCHAR U_5A04 +ENCODING 23044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +2480 +C460 +0800 +FFE0 +1100 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5A05 +ENCODING 23045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F280 +5280 +5AA0 +56C0 +9280 +6280 +2280 +5280 +8FE0 +ENDCHAR +STARTCHAR U_5A06 +ENCODING 23046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2F00 +F2A0 +5120 +56E0 +5000 +5FE0 +2280 +32A0 +4CA0 +8860 +ENDCHAR +STARTCHAR U_5A07 +ENCODING 23047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +5FE0 +5240 +5420 +9240 +6240 +2240 +5440 +8840 +ENDCHAR +STARTCHAR U_5A08 +ENCODING 23048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0900 +2940 +4920 +0400 +FFE0 +0900 +1200 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5A09 +ENCODING 23049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +57C0 +5540 +9FE0 +5200 +27C0 +3040 +4840 +8180 +ENDCHAR +STARTCHAR U_5A0A +ENCODING 23050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +FFC0 +5440 +57C0 +9440 +57C0 +2280 +32A0 +44A0 +8860 +ENDCHAR +STARTCHAR U_5A0B +ENCODING 23051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +F340 +57E0 +5420 +97E0 +5420 +27E0 +3420 +4C20 +8460 +ENDCHAR +STARTCHAR U_5A0C +ENCODING 23052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FD40 +57C0 +5540 +57C0 +9100 +67C0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_5A0D +ENCODING 23053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +40A0 +F7E0 +5480 +5480 +57A0 +95A0 +6540 +3560 +4AA0 +9120 +ENDCHAR +STARTCHAR U_5A0E +ENCODING 23054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FE00 +1BE0 +3280 +D480 +0400 +FFE0 +0880 +1900 +0600 +79C0 +ENDCHAR +STARTCHAR U_5A0F +ENCODING 23055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +4FE0 +F500 +55C0 +9500 +55C0 +2500 +55C0 +4B20 +94E0 +ENDCHAR +STARTCHAR U_5A10 +ENCODING 23056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +F540 +5280 +57E0 +9040 +5080 +27E0 +3080 +4880 +8180 +ENDCHAR +STARTCHAR U_5A11 +ENCODING 23057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +C920 +2940 +4080 +C700 +4800 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5A12 +ENCODING 23058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +F800 +57C0 +5540 +5540 +9FE0 +6540 +27E0 +5040 +80C0 +ENDCHAR +STARTCHAR U_5A13 +ENCODING 23059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +5440 +5780 +94E0 +5780 +24E0 +3780 +48A0 +9060 +ENDCHAR +STARTCHAR U_5A14 +ENCODING 23060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57C0 +5440 +9440 +57C0 +2280 +3280 +4AA0 +8460 +ENDCHAR +STARTCHAR U_5A15 +ENCODING 23061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57E0 +5520 +97E0 +5100 +2380 +3540 +4920 +8100 +ENDCHAR +STARTCHAR U_5A16 +ENCODING 23062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +2BE0 +2880 +4A80 +52E0 +3280 +2A80 +4580 +88E0 +ENDCHAR +STARTCHAR U_5A17 +ENCODING 23063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E60 +4380 +F480 +5480 +5FE0 +5280 +9280 +6A80 +25E0 +5600 +89E0 +ENDCHAR +STARTCHAR U_5A18 +ENCODING 23064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +57C0 +5440 +57C0 +9520 +6540 +3480 +4E40 +8420 +ENDCHAR +STARTCHAR U_5A19 +ENCODING 23065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +FAA0 +5540 +52A0 +92A0 +5000 +27C0 +3100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_5A1A +ENCODING 23066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +5540 +57C0 +9100 +5FE0 +2220 +3220 +44A0 +8840 +ENDCHAR +STARTCHAR U_5A1B +ENCODING 23067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FE40 +57C0 +5400 +57C0 +7140 +17E0 +2900 +4280 +8C60 +ENDCHAR +STARTCHAR U_5A1C +ENCODING 23068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +FAA0 +AEA0 +AAC0 +BEA0 +AAA0 +4AA0 +6AE0 +5280 +9480 +ENDCHAR +STARTCHAR U_5A1D +ENCODING 23069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +F980 +52C0 +54A0 +9080 +53E0 +2220 +3220 +4BE0 +8220 +ENDCHAR +STARTCHAR U_5A1E +ENCODING 23070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F540 +5280 +5100 +9FE0 +5240 +2640 +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_5A1F +ENCODING 23071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +2800 +2BE0 +4A20 +53E0 +3220 +2BE0 +4A20 +8260 +ENDCHAR +STARTCHAR U_5A20 +ENCODING 23072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4800 +FBC0 +A800 +AFE0 +AA80 +AAA0 +6AC0 +5A80 +8B40 +1620 +ENDCHAR +STARTCHAR U_5A21 +ENCODING 23073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +5100 +57C0 +9000 +5140 +26A0 +3A20 +4A40 +81C0 +ENDCHAR +STARTCHAR U_5A22 +ENCODING 23074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +5540 +5920 +97C0 +5080 +2100 +27C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_5A23 +ENCODING 23075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +5140 +57C0 +5500 +57E0 +2320 +3520 +49C0 +8100 +ENDCHAR +STARTCHAR U_5A24 +ENCODING 23076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +4880 +7FE0 +0880 +F880 +2BE0 +4400 +FFE0 +0880 +0700 +38C0 +ENDCHAR +STARTCHAR U_5A25 +ENCODING 23077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +26C0 +FAA0 +57E0 +5280 +52A0 +53C0 +36A0 +2AA0 +4360 +8620 +ENDCHAR +STARTCHAR U_5A26 +ENCODING 23078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F400 +5400 +57E0 +9480 +5480 +2FE0 +3000 +4440 +8820 +ENDCHAR +STARTCHAR U_5A27 +ENCODING 23079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +F7C0 +5440 +5440 +97C0 +5280 +2280 +3280 +44A0 +8860 +ENDCHAR +STARTCHAR U_5A28 +ENCODING 23080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +2A20 +2BE0 +4800 +53E0 +3080 +2BE0 +4880 +8080 +ENDCHAR +STARTCHAR U_5A29 +ENCODING 23081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +5FE0 +5520 +5520 +97E0 +6280 +2280 +54A0 +88E0 +ENDCHAR +STARTCHAR U_5A2A +ENCODING 23082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +2940 +2940 +4FE0 +5000 +33E0 +2A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_5A2B +ENCODING 23083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4DC0 +F440 +5560 +5940 +5540 +9540 +6FE0 +3400 +4A00 +91E0 +ENDCHAR +STARTCHAR U_5A2C +ENCODING 23084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27E0 +F040 +5FE0 +5140 +5540 +55C0 +5540 +2540 +57C0 +8820 +ENDCHAR +STARTCHAR U_5A2D +ENCODING 23085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7A0 +5200 +57C0 +5900 +9100 +6FE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_5A2E +ENCODING 23086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F800 +2BE0 +2800 +4BE0 +5000 +33E0 +2A20 +4A20 +83E0 +ENDCHAR +STARTCHAR U_5A2F +ENCODING 23087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2140 +F540 +55C0 +5400 +57C0 +9040 +6FE0 +2000 +5440 +8820 +ENDCHAR +STARTCHAR U_5A30 +ENCODING 23088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4520 +4D20 +F520 +55A0 +5560 +5520 +55A0 +2540 +5460 +84A0 +ENDCHAR +STARTCHAR U_5A31 +ENCODING 23089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +57C0 +5000 +97C0 +5100 +2FE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_5A32 +ENCODING 23090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F440 +A7C0 +A100 +AFE0 +A920 +CAA0 +2C60 +5820 +8860 +ENDCHAR +STARTCHAR U_5A33 +ENCODING 23091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +4E20 +F4A0 +AFA0 +A4A0 +A6A0 +ADA0 +54A0 +24A0 +5420 +84E0 +ENDCHAR +STARTCHAR U_5A34 +ENCODING 23092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4220 +F920 +AFE0 +A920 +A920 +CBA0 +6D60 +5920 +8920 +08E0 +ENDCHAR +STARTCHAR U_5A35 +ENCODING 23093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +4AE0 +FEA0 +AAA0 +AAA0 +AEA0 +AAA0 +CB40 +3E40 +52A0 +8320 +ENDCHAR +STARTCHAR U_5A36 +ENCODING 23094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +6940 +5880 +4940 +FA20 +0800 +FFE0 +1900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_5A37 +ENCODING 23095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4780 +F100 +AFE0 +A540 +A540 +AFE0 +C540 +2FE0 +5100 +8FC0 +ENDCHAR +STARTCHAR U_5A38 +ENCODING 23096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2BC0 +2A40 +4BC0 +5240 +37E0 +2A80 +4C40 +8020 +ENDCHAR +STARTCHAR U_5A39 +ENCODING 23097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +4240 +F3E0 +AE80 +A8A0 +AF20 +A3C0 +4240 +22A0 +5B60 +85A0 +ENDCHAR +STARTCHAR U_5A3A +ENCODING 23098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +6AA0 +4440 +FAA0 +5000 +5EE0 +9AA0 +5AA0 +6440 +5AA0 +9AA0 +ENDCHAR +STARTCHAR U_5A3B +ENCODING 23099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +6FE0 +4100 +F7C0 +5540 +57C0 +5540 +57C0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_5A3C +ENCODING 23100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +5240 +53C0 +5000 +57E0 +3420 +2FE0 +4420 +87E0 +ENDCHAR +STARTCHAR U_5A3D +ENCODING 23101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +F7C0 +5040 +5FE0 +5100 +5D60 +5380 +2540 +5920 +8300 +ENDCHAR +STARTCHAR U_5A3E +ENCODING 23102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC80 +57E0 +5480 +57E0 +5480 +27E0 +3480 +4880 +8BE0 +ENDCHAR +STARTCHAR U_5A3F +ENCODING 23103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5040 +6740 +5540 +7740 +4840 +FFE0 +1100 +1900 +0600 +3980 +ENDCHAR +STARTCHAR U_5A40 +ENCODING 23104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A20 +FA20 +ACE0 +AAA0 +AAA0 +AAA0 +4EE0 +2820 +5820 +88E0 +ENDCHAR +STARTCHAR U_5A41 +ENCODING 23105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +FFE0 +2480 +7FC0 +4440 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5A42 +ENCODING 23106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +57C0 +5440 +57C0 +5100 +3FE0 +2920 +4960 +8100 +ENDCHAR +STARTCHAR U_5A43 +ENCODING 23107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +2BC0 +4800 +57E0 +3100 +2D40 +4920 +8320 +ENDCHAR +STARTCHAR U_5A44 +ENCODING 23108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2C40 +2A80 +4FE0 +5000 +37C0 +2C40 +4C40 +87C0 +ENDCHAR +STARTCHAR U_5A45 +ENCODING 23109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +F920 +5560 +55A0 +5FE0 +5320 +55E0 +2920 +5120 +8160 +ENDCHAR +STARTCHAR U_5A46 +ENCODING 23110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +4920 +2FC0 +CA40 +5180 +4640 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5A47 +ENCODING 23111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +FD20 +2AC0 +2900 +4FE0 +5100 +3380 +2D40 +4920 +8100 +ENDCHAR +STARTCHAR U_5A48 +ENCODING 23112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2FE0 +2A40 +4D20 +53C0 +3640 +2980 +4A40 +8420 +ENDCHAR +STARTCHAR U_5A49 +ENCODING 23113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +5400 +57E0 +5AA0 +56E0 +3280 +2AA0 +44A0 +88E0 +ENDCHAR +STARTCHAR U_5A4A +ENCODING 23114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +53C0 +5100 +57E0 +52A0 +36C0 +2A80 +4B40 +8220 +ENDCHAR +STARTCHAR U_5A4B +ENCODING 23115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +4080 +F7E0 +5500 +57C0 +5520 +95E0 +5400 +25C0 +6540 +9A60 +ENDCHAR +STARTCHAR U_5A4C +ENCODING 23116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +46E0 +E4A0 +A4A0 +BFA0 +A4A0 +AEA0 +75A0 +2440 +54A0 +8920 +ENDCHAR +STARTCHAR U_5A4D +ENCODING 23117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +5440 +5FE0 +5040 +5740 +2540 +3740 +4840 +81C0 +ENDCHAR +STARTCHAR U_5A4E +ENCODING 23118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4480 +4FE0 +F480 +57E0 +5480 +9480 +57E0 +2480 +5480 +8FE0 +ENDCHAR +STARTCHAR U_5A4F +ENCODING 23119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFE0 +5520 +5520 +57E0 +2280 +52A0 +9480 +8860 +ENDCHAR +STARTCHAR U_5A50 +ENCODING 23120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +5540 +57C0 +5100 +5FE0 +3100 +2B80 +4540 +8920 +ENDCHAR +STARTCHAR U_5A51 +ENCODING 23121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +5340 +5D20 +5100 +5FE0 +2240 +3280 +4980 +8660 +ENDCHAR +STARTCHAR U_5A52 +ENCODING 23122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2540 +F580 +5A80 +5460 +5100 +5520 +2540 +3A80 +4A40 +8420 +ENDCHAR +STARTCHAR U_5A53 +ENCODING 23123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +0900 +0600 +79C0 +ENDCHAR +STARTCHAR U_5A54 +ENCODING 23124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +FEE0 +5280 +5280 +5EE0 +5280 +5280 +2EE0 +5280 +8280 +ENDCHAR +STARTCHAR U_5A55 +ENCODING 23125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F7C0 +5140 +57E0 +5140 +57C0 +3500 +25C0 +5B00 +91E0 +ENDCHAR +STARTCHAR U_5A56 +ENCODING 23126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +5280 +5540 +5920 +5140 +25A0 +3560 +4940 +8700 +ENDCHAR +STARTCHAR U_5A57 +ENCODING 23127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +2420 +FC20 +56E0 +5420 +57E0 +5280 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_5A58 +ENCODING 23128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +FFE0 +A200 +AFE0 +A440 +AFA0 +6480 +35A0 +4420 +83E0 +ENDCHAR +STARTCHAR U_5A59 +ENCODING 23129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +F880 +57C0 +5140 +9FE0 +5140 +57C0 +2100 +5100 +8300 +ENDCHAR +STARTCHAR U_5A5A +ENCODING 23130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +5480 +5660 +5020 +57C0 +2440 +37C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_5A5B +ENCODING 23131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +57C0 +5440 +57C0 +5100 +2380 +3540 +4920 +9320 +ENDCHAR +STARTCHAR U_5A5C +ENCODING 23132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A140 +F940 +8880 +F940 +A420 +FFE0 +1100 +1A00 +0580 +F860 +ENDCHAR +STARTCHAR U_5A5D +ENCODING 23133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +5000 +57E0 +5080 +5280 +32E0 +2A80 +4580 +88E0 +ENDCHAR +STARTCHAR U_5A5E +ENCODING 23134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +5FE0 +5440 +5280 +57C0 +2100 +37E0 +4900 +8100 +ENDCHAR +STARTCHAR U_5A5F +ENCODING 23135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +F920 +AFE0 +A920 +ABA0 +AAA0 +6BA0 +5820 +8FE0 +0820 +ENDCHAR +STARTCHAR U_5A60 +ENCODING 23136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +5820 +57C0 +5440 +57C0 +3400 +2FE0 +4420 +87E0 +ENDCHAR +STARTCHAR U_5A61 +ENCODING 23137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +5540 +5540 +5BA0 +9100 +6380 +2540 +5920 +8100 +ENDCHAR +STARTCHAR U_5A62 +ENCODING 23138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FCA0 +57E0 +54A0 +57E0 +5180 +2280 +37E0 +4880 +8080 +ENDCHAR +STARTCHAR U_5A63 +ENCODING 23139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +4AA0 +4EE0 +F820 +5FE0 +9820 +9EE0 +6AA0 +52A0 +92A0 +A020 +ENDCHAR +STARTCHAR U_5A64 +ENCODING 23140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +FBA0 +A920 +AFE0 +A820 +ABA0 +6AA0 +3BA0 +4820 +90E0 +ENDCHAR +STARTCHAR U_5A65 +ENCODING 23141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFC0 +5440 +57C0 +5440 +57C0 +5100 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_5A66 +ENCODING 23142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +F7C0 +A040 +AFE0 +A920 +A7C0 +4540 +2540 +5540 +8100 +ENDCHAR +STARTCHAR U_5A67 +ENCODING 23143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +5100 +5FE0 +5440 +57C0 +3440 +2FC0 +4440 +84C0 +ENDCHAR +STARTCHAR U_5A68 +ENCODING 23144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2280 +FC60 +57C0 +9000 +AFE0 +6AA0 +5FE0 +8AA0 +8AA0 +ENDCHAR +STARTCHAR U_5A69 +ENCODING 23145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +27E0 +F800 +57E0 +5400 +55C0 +5480 +27E0 +3480 +4880 +9080 +ENDCHAR +STARTCHAR U_5A6A +ENCODING 23146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +3100 +6B80 +A540 +2500 +FFE0 +0900 +1200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5A6B +ENCODING 23147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +57C0 +5480 +94A0 +56C0 +2480 +56A0 +84E0 +ENDCHAR +STARTCHAR U_5A6C +ENCODING 23148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F20 +FA20 +A540 +A040 +A780 +A100 +6FE0 +2100 +5100 +87C0 +ENDCHAR +STARTCHAR U_5A6D +ENCODING 23149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +F940 +5760 +5420 +5420 +5760 +2140 +3140 +4940 +8FE0 +ENDCHAR +STARTCHAR U_5A6E +ENCODING 23150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +F420 +57E0 +5480 +57E0 +5480 +27E0 +2620 +5A20 +93E0 +ENDCHAR +STARTCHAR U_5A6F +ENCODING 23151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0000 +7BC0 +4A40 +6B40 +4A40 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_5A70 +ENCODING 23152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +FAA0 +AAA0 +AFE0 +AAA0 +AAA0 +5FE0 +6480 +9840 +1020 +ENDCHAR +STARTCHAR U_5A71 +ENCODING 23153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +1FE0 +7240 +4780 +7140 +17E0 +2400 +FFE0 +0900 +0E00 +31C0 +ENDCHAR +STARTCHAR U_5A72 +ENCODING 23154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +FFE0 +5280 +5480 +5CA0 +54C0 +5580 +2480 +54A0 +84E0 +ENDCHAR +STARTCHAR U_5A73 +ENCODING 23155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F000 +57C0 +5D60 +5FE0 +5D60 +7D60 +2FE0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_5A74 +ENCODING 23156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +5540 +5540 +5540 +2A80 +4440 +FFE0 +1100 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_5A75 +ENCODING 23157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +FFE0 +A920 +AFE0 +A920 +AFE0 +6100 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_5A76 +ENCODING 23158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +A100 +AFE0 +A920 +AFE0 +4920 +6FE0 +9100 +0100 +ENDCHAR +STARTCHAR U_5A77 +ENCODING 23159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F440 +A7C0 +A000 +AFE0 +A820 +67C0 +3080 +4A80 +8100 +ENDCHAR +STARTCHAR U_5A78 +ENCODING 23160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +5440 +5FE0 +5200 +57E0 +2AA0 +32A0 +4D20 +8260 +ENDCHAR +STARTCHAR U_5A79 +ENCODING 23161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +F280 +5FE0 +5AA0 +5FE0 +5100 +7FE0 +2440 +5380 +8C60 +ENDCHAR +STARTCHAR U_5A7A +ENCODING 23162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +1140 +FD40 +3480 +5140 +9420 +FFE0 +1100 +0F80 +F060 +ENDCHAR +STARTCHAR U_5A7B +ENCODING 23163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +AFE0 +AAA0 +A920 +AFE0 +4920 +6FE0 +9920 +0860 +ENDCHAR +STARTCHAR U_5A7C +ENCODING 23164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +5100 +5100 +9FE0 +5200 +27E0 +2A20 +5220 +83E0 +ENDCHAR +STARTCHAR U_5A7D +ENCODING 23165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2520 +FD20 +5760 +5400 +57E0 +54A0 +27A0 +3440 +44A0 +8520 +ENDCHAR +STARTCHAR U_5A7E +ENCODING 23166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +F440 +5BA0 +9000 +AEA0 +AAA0 +4F40 +4AA0 +AEA0 +AAA0 +ENDCHAR +STARTCHAR U_5A7F +ENCODING 23167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +F5C0 +5500 +5FE0 +5440 +57C0 +2440 +37C0 +4C40 +84C0 +ENDCHAR +STARTCHAR U_5A80 +ENCODING 23168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +47C0 +FD40 +57C0 +9100 +AFE0 +6920 +59E0 +8E20 +8860 +ENDCHAR +STARTCHAR U_5A81 +ENCODING 23169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +4240 +FFE0 +5000 +57C0 +9440 +9FE0 +6500 +5FE0 +8100 +ENDCHAR +STARTCHAR U_5A82 +ENCODING 23170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F440 +5FE0 +5920 +5FE0 +5540 +2540 +5540 +8100 +0100 +ENDCHAR +STARTCHAR U_5A83 +ENCODING 23171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +F100 +5FE0 +5520 +5940 +5100 +2FE0 +3380 +4540 +8920 +ENDCHAR +STARTCHAR U_5A84 +ENCODING 23172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +5100 +57C0 +5100 +5FE0 +2100 +3FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_5A85 +ENCODING 23173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +FA40 +53C0 +5240 +53C0 +9240 +6FE0 +2540 +5620 +87E0 +ENDCHAR +STARTCHAR U_5A86 +ENCODING 23174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4200 +F7E0 +5520 +5520 +5460 +9100 +6FE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_5A87 +ENCODING 23175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +5FE0 +9100 +9FE0 +6380 +2340 +5520 +8920 +ENDCHAR +STARTCHAR U_5A88 +ENCODING 23176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +47C0 +F900 +57C0 +9540 +97C0 +6540 +2FE0 +5100 +8100 +ENDCHAR +STARTCHAR U_5A89 +ENCODING 23177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +47E0 +F400 +57E0 +9540 +97E0 +6480 +27E0 +5480 +8BE0 +ENDCHAR +STARTCHAR U_5A8A +ENCODING 23178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +FFE0 +A000 +AE20 +AAA0 +AEA0 +4AA0 +6EA0 +5A20 +8A60 +ENDCHAR +STARTCHAR U_5A8B +ENCODING 23179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFC0 +5200 +57E0 +5240 +57E0 +2A40 +33C0 +4A40 +83C0 +ENDCHAR +STARTCHAR U_5A8C +ENCODING 23180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +5240 +5000 +57E0 +9520 +67E0 +2520 +57E0 +8420 +ENDCHAR +STARTCHAR U_5A8D +ENCODING 23181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2240 +FFE0 +5220 +53E0 +9220 +53E0 +2220 +51C0 +8A20 +ENDCHAR +STARTCHAR U_5A8E +ENCODING 23182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27E0 +F140 +5180 +5FE0 +5200 +97C0 +6A40 +23C0 +5240 +83C0 +ENDCHAR +STARTCHAR U_5A8F +ENCODING 23183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4920 +FFE0 +A000 +AFE0 +A200 +AFE0 +4AA0 +2AA0 +5AA0 +8860 +ENDCHAR +STARTCHAR U_5A90 +ENCODING 23184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +BBC0 +AA00 +9220 +FDE0 +0800 +FFE0 +1100 +0E00 +F1C0 +ENDCHAR +STARTCHAR U_5A91 +ENCODING 23185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +6100 +4FE0 +F100 +57C0 +5540 +57C0 +5100 +27C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_5A92 +ENCODING 23186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +F7C0 +5440 +57C0 +5100 +2FE0 +3380 +4D40 +8920 +ENDCHAR +STARTCHAR U_5A93 +ENCODING 23187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +57C0 +5440 +5FE0 +5100 +2100 +37C0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_5A94 +ENCODING 23188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +F200 +AFE0 +AAA0 +ABA0 +AAA0 +CBA0 +2AA0 +5FE0 +8820 +ENDCHAR +STARTCHAR U_5A95 +ENCODING 23189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +FBA0 +5000 +57C0 +5440 +57C0 +2280 +3FE0 +4A80 +8480 +ENDCHAR +STARTCHAR U_5A96 +ENCODING 23190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +F440 +5100 +57C0 +9540 +5540 +2FE0 +3280 +4440 +8820 +ENDCHAR +STARTCHAR U_5A97 +ENCODING 23191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +5000 +5FE0 +5440 +57C0 +2440 +37C0 +4000 +8FE0 +ENDCHAR +STARTCHAR U_5A98 +ENCODING 23192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +66E0 +4480 +F6A0 +54E0 +9100 +97E0 +5420 +27E0 +5420 +87E0 +ENDCHAR +STARTCHAR U_5A99 +ENCODING 23193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4FE0 +4880 +FF80 +AAA0 +AAA0 +AFC0 +6940 +2D40 +52A0 +9520 +ENDCHAR +STARTCHAR U_5A9A +ENCODING 23194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +F7E0 +5400 +55E0 +5520 +55E0 +3520 +2DE0 +4920 +91E0 +ENDCHAR +STARTCHAR U_5A9B +ENCODING 23195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F540 +57E0 +5100 +5FE0 +5200 +33E0 +2D40 +4880 +9760 +ENDCHAR +STARTCHAR U_5A9C +ENCODING 23196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFC0 +5440 +57C0 +5440 +57C0 +2440 +37C0 +4280 +8C60 +ENDCHAR +STARTCHAR U_5A9D +ENCODING 23197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7120 +2540 +FD80 +3100 +6A80 +A440 +FFE0 +0880 +1900 +0700 +F8E0 +ENDCHAR +STARTCHAR U_5A9E +ENCODING 23198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +5440 +57C0 +5000 +5FE0 +2500 +35E0 +4B00 +91E0 +ENDCHAR +STARTCHAR U_5A9F +ENCODING 23199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F540 +55C0 +5400 +57E0 +5100 +2FE0 +3380 +4D40 +8920 +ENDCHAR +STARTCHAR U_5AA0 +ENCODING 23200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +F200 +57E0 +5C80 +57E0 +5420 +57E0 +2420 +57E0 +8420 +ENDCHAR +STARTCHAR U_5AA1 +ENCODING 23201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5540 +57C0 +5540 +57C0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_5AA2 +ENCODING 23202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FBA0 +5820 +5FE0 +5440 +57C0 +2440 +37C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_5AA3 +ENCODING 23203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +43C0 +4940 +F540 +5940 +9A60 +9100 +6FE0 +2380 +5540 +8920 +ENDCHAR +STARTCHAR U_5AA4 +ENCODING 23204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +47C0 +FD40 +57C0 +9000 +9540 +64A0 +2AA0 +5240 +81C0 +ENDCHAR +STARTCHAR U_5AA5 +ENCODING 23205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +AFE0 +A800 +AFE0 +AAA0 +4FE0 +2AA0 +5AA0 +A860 +ENDCHAR +STARTCHAR U_5AA6 +ENCODING 23206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +FFE0 +A920 +AFE0 +A440 +A7C0 +A440 +67C0 +5440 +8CC0 +ENDCHAR +STARTCHAR U_5AA7 +ENCODING 23207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F740 +A540 +AFE0 +A820 +ABA0 +6AA0 +3AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_5AA8 +ENCODING 23208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4280 +FFE0 +5AA0 +9AA0 +9CE0 +6820 +2FE0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_5AA9 +ENCODING 23209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +FFA0 +54E0 +54A0 +5EA0 +5AE0 +2AA0 +3EA0 +4920 +8260 +ENDCHAR +STARTCHAR U_5AAA +ENCODING 23210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +5440 +57C0 +5440 +5000 +6FE0 +3AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_5AAB +ENCODING 23211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +41C0 +4100 +F7C0 +5040 +5FE0 +9100 +E5C0 +2500 +5B00 +91E0 +ENDCHAR +STARTCHAR U_5AAC +ENCODING 23212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +F520 +5DE0 +5480 +57E0 +5480 +25C0 +36A0 +4CA0 +8480 +ENDCHAR +STARTCHAR U_5AAD +ENCODING 23213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +C200 +37E0 +C520 +3520 +C280 +0440 +FFE0 +0900 +0E00 +31C0 +ENDCHAR +STARTCHAR U_5AAE +ENCODING 23214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +FBA0 +A000 +AE20 +AAA0 +AEA0 +6AA0 +2EA0 +5A20 +8A60 +ENDCHAR +STARTCHAR U_5AAF +ENCODING 23215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4500 +EF80 +A480 +A7C0 +A440 +A7E0 +A820 +6560 +5AA0 +8060 +ENDCHAR +STARTCHAR U_5AB0 +ENCODING 23216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +26A0 +FBE0 +5120 +5240 +53E0 +56A0 +5AA0 +23E0 +5120 +8EC0 +ENDCHAR +STARTCHAR U_5AB1 +ENCODING 23217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2A80 +2A00 +4BE0 +5480 +33E0 +2880 +4AA0 +83E0 +ENDCHAR +STARTCHAR U_5AB2 +ENCODING 23218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +FAA0 +A920 +AAA0 +AFE0 +A880 +AEA0 +68C0 +5AA0 +8CE0 +ENDCHAR +STARTCHAR U_5AB3 +ENCODING 23219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +57C0 +5440 +57C0 +5440 +27C0 +3540 +4AA0 +83C0 +ENDCHAR +STARTCHAR U_5AB4 +ENCODING 23220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +5FE0 +5440 +57C0 +5120 +2340 +3C80 +4D40 +8620 +ENDCHAR +STARTCHAR U_5AB5 +ENCODING 23221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +AFE0 +E200 +AFE0 +A540 +EA20 +AFE0 +A480 +A380 +6C60 +ENDCHAR +STARTCHAR U_5AB6 +ENCODING 23222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA80 +57E0 +5240 +53C0 +5240 +53C0 +2240 +57E0 +8840 +ENDCHAR +STARTCHAR U_5AB7 +ENCODING 23223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4BC0 +E800 +AFE0 +AAA0 +AAC0 +AB20 +A840 +6FE0 +5440 +A2C0 +ENDCHAR +STARTCHAR U_5AB8 +ENCODING 23224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +F100 +AFE0 +A100 +AFE0 +A920 +6FE0 +3100 +4140 +8FE0 +ENDCHAR +STARTCHAR U_5AB9 +ENCODING 23225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FCA0 +5720 +5560 +5000 +57E0 +2520 +37E0 +4D20 +87E0 +ENDCHAR +STARTCHAR U_5ABA +ENCODING 23226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5540 +FFE0 +A0A0 +AEA0 +A0A0 +AEC0 +4A40 +6B40 +8AA0 +1120 +ENDCHAR +STARTCHAR U_5ABB +ENCODING 23227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA60 +AC00 +FBC0 +AA40 +9980 +0A40 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5ABC +ENCODING 23228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +5440 +57C0 +5000 +57C0 +2540 +3540 +4D40 +9FE0 +ENDCHAR +STARTCHAR U_5ABD +ENCODING 23229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FFC0 +5480 +57C0 +5480 +57E0 +3020 +2AA0 +4560 +8960 +ENDCHAR +STARTCHAR U_5ABE +ENCODING 23230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +57E0 +5280 +5FE0 +5540 +27C0 +3540 +4FE0 +84C0 +ENDCHAR +STARTCHAR U_5ABF +ENCODING 23231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FD40 +5540 +57C0 +5540 +57C0 +3140 +2BA0 +4520 +88E0 +ENDCHAR +STARTCHAR U_5AC0 +ENCODING 23232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +57C0 +5200 +5FE0 +5540 +2FE0 +3380 +4540 +8920 +ENDCHAR +STARTCHAR U_5AC1 +ENCODING 23233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +57C0 +5220 +5D40 +5280 +35C0 +2AA0 +44A0 +8300 +ENDCHAR +STARTCHAR U_5AC2 +ENCODING 23234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4DE0 +F920 +AF60 +A920 +AFE0 +A100 +6FC0 +3480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_5AC3 +ENCODING 23235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +57C0 +5440 +57C0 +9440 +67C0 +2440 +5FE0 +8440 +ENDCHAR +STARTCHAR U_5AC4 +ENCODING 23236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4880 +FBE0 +AA20 +ABE0 +AA20 +ABE0 +6880 +39C0 +4AA0 +95A0 +ENDCHAR +STARTCHAR U_5AC5 +ENCODING 23237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +4080 +F3C0 +5100 +97E0 +9200 +63E0 +2480 +5480 +8BE0 +ENDCHAR +STARTCHAR U_5AC6 +ENCODING 23238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +A440 +AAA0 +A440 +AFE0 +6440 +3440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_5AC7 +ENCODING 23239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +F7C0 +A440 +A7C0 +A440 +A7C0 +4100 +6FE0 +9280 +0C60 +ENDCHAR +STARTCHAR U_5AC8 +ENCODING 23240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2980 +4640 +FFE0 +8420 +7FC0 +1900 +0F00 +70E0 +ENDCHAR +STARTCHAR U_5AC9 +ENCODING 23241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +F500 +ADE0 +A680 +AC80 +B7E0 +6480 +3540 +4A20 +9420 +ENDCHAR +STARTCHAR U_5ACA +ENCODING 23242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +57C0 +5100 +5FE0 +9280 +6540 +3FE0 +4940 +9320 +ENDCHAR +STARTCHAR U_5ACB +ENCODING 23243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4220 +FEE0 +A880 +AEE0 +A220 +AAA0 +4660 +6BA0 +9220 +0CC0 +ENDCHAR +STARTCHAR U_5ACC +ENCODING 23244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4FE0 +F500 +AFC0 +A540 +BFE0 +A540 +4FC0 +3500 +4D40 +9520 +ENDCHAR +STARTCHAR U_5ACD +ENCODING 23245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2520 +FAA0 +5140 +5260 +5420 +5760 +2420 +3420 +4FE0 +8420 +ENDCHAR +STARTCHAR U_5ACE +ENCODING 23246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4440 +F280 +5FE0 +9920 +9FE0 +6180 +2240 +5440 +8880 +ENDCHAR +STARTCHAR U_5ACF +ENCODING 23247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4EE0 +4AA0 +FEA0 +AAA0 +AEC0 +A8A0 +AAA0 +6BE0 +5C80 +8880 +ENDCHAR +STARTCHAR U_5AD0 +ENCODING 23248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +5540 +5F40 +5540 +FFE0 +A4A0 +BFA0 +4540 +6960 +ADA0 +B2A0 +ENDCHAR +STARTCHAR U_5AD1 +ENCODING 23249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1500 +2480 +7FC0 +1200 +7FC0 +5240 +FFE0 +2100 +1E00 +61C0 +ENDCHAR +STARTCHAR U_5AD2 +ENCODING 23250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +FFE0 +AA20 +AFE0 +A200 +A3C0 +6640 +2980 +5240 +8C20 +ENDCHAR +STARTCHAR U_5AD3 +ENCODING 23251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +4480 +FFE0 +5AA0 +9920 +9AA0 +68A0 +2EC0 +5880 +8EE0 +ENDCHAR +STARTCHAR U_5AD4 +ENCODING 23252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F8A0 +5700 +5400 +57E0 +5480 +2480 +3FE0 +4440 +8820 +ENDCHAR +STARTCHAR U_5AD5 +ENCODING 23253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2500 +FDE0 +5680 +57E0 +5540 +57E0 +2140 +36A0 +4A40 +81C0 +ENDCHAR +STARTCHAR U_5AD6 +ENCODING 23254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +FFE0 +AAA0 +AFE0 +A000 +A7C0 +6000 +2FE0 +5540 +8B20 +ENDCHAR +STARTCHAR U_5AD7 +ENCODING 23255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4800 +F9C0 +A940 +A9C0 +A800 +ABE0 +4AA0 +2BE0 +5800 +8FE0 +ENDCHAR +STARTCHAR U_5AD8 +ENCODING 23256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +FFE0 +A920 +AFE0 +A280 +A700 +6240 +37E0 +4540 +8B20 +ENDCHAR +STARTCHAR U_5AD9 +ENCODING 23257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +45E0 +FF00 +A9E0 +AEA0 +AA80 +AAE0 +4A80 +7380 +9280 +2660 +ENDCHAR +STARTCHAR U_5ADA +ENCODING 23258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F7C0 +A440 +AFE0 +AAA0 +AAA0 +6FE0 +5440 +8B80 +0C60 +ENDCHAR +STARTCHAR U_5ADB +ENCODING 23259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9160 +FFC0 +9140 +A880 +FD60 +0A00 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5ADC +ENCODING 23260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +5100 +5FE0 +5440 +57C0 +2440 +3FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_5ADD +ENCODING 23261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E940 +AFE0 +A940 +AFC0 +A920 +4D40 +3380 +5540 +8B20 +ENDCHAR +STARTCHAR U_5ADE +ENCODING 23262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F940 +AFE0 +A940 +AFE0 +A920 +4FE0 +2D20 +57E0 +A560 +ENDCHAR +STARTCHAR U_5ADF +ENCODING 23263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FFE0 +5540 +57E0 +5500 +55E0 +2720 +35E0 +4C00 +87E0 +ENDCHAR +STARTCHAR U_5AE0 +ENCODING 23264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +2240 +FD80 +7260 +A800 +7FE0 +4400 +7FE0 +4900 +8700 +3CE0 +ENDCHAR +STARTCHAR U_5AE1 +ENCODING 23265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F280 +AFE0 +A920 +AFE0 +A920 +4BA0 +2AA0 +5BA0 +8860 +ENDCHAR +STARTCHAR U_5AE2 +ENCODING 23266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +FC40 +27C0 +52A0 +84E0 +FFE0 +1100 +0E00 +F9C0 +ENDCHAR +STARTCHAR U_5AE3 +ENCODING 23267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FDE0 +5500 +57E0 +5200 +53E0 +2200 +37E0 +4AA0 +9560 +ENDCHAR +STARTCHAR U_5AE4 +ENCODING 23268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4FE0 +4440 +F7C0 +5100 +97C0 +9540 +6540 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_5AE5 +ENCODING 23269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +57C0 +5540 +57C0 +50A0 +27E0 +3480 +4A80 +8100 +ENDCHAR +STARTCHAR U_5AE6 +ENCODING 23270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F820 +57C0 +5440 +57C0 +5100 +6FE0 +2920 +5960 +8100 +ENDCHAR +STARTCHAR U_5AE7 +ENCODING 23271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F100 +57C0 +5100 +5FE0 +9440 +67C0 +2440 +57C0 +8820 +ENDCHAR +STARTCHAR U_5AE8 +ENCODING 23272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFC0 +5540 +5FE0 +5100 +57E0 +3100 +2FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_5AE9 +ENCODING 23273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +E4E0 +5FA0 +B5A0 +BFA0 +A4A0 +6E40 +5540 +64A0 +8520 +ENDCHAR +STARTCHAR U_5AEA +ENCODING 23274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +F660 +AAA0 +A700 +BAE0 +A480 +6120 +3640 +4980 +8600 +ENDCHAR +STARTCHAR U_5AEB +ENCODING 23275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +57C0 +5440 +57C0 +5440 +2FE0 +3100 +4A80 +8C60 +ENDCHAR +STARTCHAR U_5AEC +ENCODING 23276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F800 +AA40 +AFE0 +AA40 +ABC0 +6800 +2540 +5AA0 +8820 +ENDCHAR +STARTCHAR U_5AED +ENCODING 23277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +FFE0 +AA40 +AFE0 +A840 +AFC0 +4AA0 +2FE0 +5880 +9180 +ENDCHAR +STARTCHAR U_5AEE +ENCODING 23278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +FFE0 +A920 +ABA0 +A540 +AFE0 +6200 +27C0 +5040 +8B80 +ENDCHAR +STARTCHAR U_5AEF +ENCODING 23279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +11E0 +7F40 +2480 +DD60 +0800 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_5AF0 +ENCODING 23280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2F40 +2440 +FF60 +55A0 +5F40 +5440 +5640 +2DA0 +54A0 +8520 +ENDCHAR +STARTCHAR U_5AF1 +ENCODING 23281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +5540 +5FE0 +5000 +5FE0 +6AA0 +3BA0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_5AF2 +ENCODING 23282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2800 +FA40 +5FE0 +5A40 +5B40 +6EC0 +3B60 +4A40 +9240 +ENDCHAR +STARTCHAR U_5AF3 +ENCODING 23283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FDE0 +A740 +F480 +AD40 +A620 +0800 +FFE0 +1200 +0D00 +F0E0 +ENDCHAR +STARTCHAR U_5AF4 +ENCODING 23284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57C0 +5440 +5FE0 +5280 +2FE0 +3100 +57C0 +8100 +ENDCHAR +STARTCHAR U_5AF5 +ENCODING 23285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +FD40 +A540 +AFE0 +A540 +A540 +6FE0 +3540 +4AA0 +8AA0 +ENDCHAR +STARTCHAR U_5AF6 +ENCODING 23286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +47E0 +F480 +AFE0 +A480 +A7E0 +A480 +67E0 +3540 +4AA0 +8AA0 +ENDCHAR +STARTCHAR U_5AF7 +ENCODING 23287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A80 +FBE0 +AD40 +ABE0 +A920 +ABE0 +CD20 +29E0 +5920 +8960 +ENDCHAR +STARTCHAR U_5AF8 +ENCODING 23288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +57C0 +5100 +5FE0 +5280 +2FE0 +3440 +47C0 +8440 +ENDCHAR +STARTCHAR U_5AF9 +ENCODING 23289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47C0 +F280 +5FE0 +5100 +97C0 +5540 +27C0 +3540 +47C0 +8820 +ENDCHAR +STARTCHAR U_5AFA +ENCODING 23290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FEE0 +AAA0 +AEE0 +ABA0 +AAA0 +4BA0 +2AA0 +5BA0 +8AE0 +ENDCHAR +STARTCHAR U_5AFB +ENCODING 23291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FEE0 +AAA0 +AEE0 +A920 +AFE0 +4920 +2BA0 +5D60 +8920 +ENDCHAR +STARTCHAR U_5AFC +ENCODING 23292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2D60 +FBA0 +5FE0 +5100 +67C0 +2100 +57E0 +4D40 +92A0 +ENDCHAR +STARTCHAR U_5AFD +ENCODING 23293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +A440 +AFE0 +A440 +A7C0 +6440 +57C0 +8D40 +0B20 +ENDCHAR +STARTCHAR U_5AFE +ENCODING 23294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFE0 +5380 +5D60 +5440 +56E0 +2B40 +35E0 +4C40 +8040 +ENDCHAR +STARTCHAR U_5AFF +ENCODING 23295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +FFE0 +5140 +57C0 +5100 +5FE0 +5540 +27C0 +5540 +8FE0 +ENDCHAR +STARTCHAR U_5B00 +ENCODING 23296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2E40 +2540 +F780 +5480 +57C0 +5440 +57E0 +2820 +5AA0 +9060 +ENDCHAR +STARTCHAR U_5B01 +ENCODING 23297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2B40 +F480 +5BC0 +5020 +57C0 +5440 +27C0 +3440 +4A80 +8FE0 +ENDCHAR +STARTCHAR U_5B02 +ENCODING 23298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +EAA0 +BFE0 +A080 +AE80 +AAA0 +6EC0 +2AA0 +5F60 +8220 +ENDCHAR +STARTCHAR U_5B03 +ENCODING 23299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +D440 +27C0 +D440 +27C0 +C280 +0C40 +FFE0 +1100 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5B04 +ENCODING 23300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +57C0 +5000 +5FE0 +5820 +27C0 +3440 +4A80 +87E0 +ENDCHAR +STARTCHAR U_5B05 +ENCODING 23301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +F280 +AFE0 +A540 +AFE0 +A540 +6FE0 +2100 +5FE0 +8100 +ENDCHAR +STARTCHAR U_5B06 +ENCODING 23302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C60 +F7C0 +5440 +57C0 +5000 +3FE0 +2AA0 +4660 +8AA0 +ENDCHAR +STARTCHAR U_5B07 +ENCODING 23303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +5FE0 +5440 +57C0 +5440 +27C0 +3440 +4FC0 +8C60 +ENDCHAR +STARTCHAR U_5B08 +ENCODING 23304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +5FE0 +5440 +5EE0 +5440 +2FE0 +3280 +4CA0 +8860 +ENDCHAR +STARTCHAR U_5B09 +ENCODING 23305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +5FE0 +5440 +57C0 +5280 +6FE0 +3440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_5B0A +ENCODING 23306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6EC0 +2AA0 +EEE0 +0400 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5B0B +ENCODING 23307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FFE0 +A920 +AFE0 +A920 +AFE0 +6100 +37E0 +4900 +8100 +ENDCHAR +STARTCHAR U_5B0C +ENCODING 23308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +5440 +5BA0 +5280 +5FE0 +2AA0 +3BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_5B0D +ENCODING 23309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5540 +5F40 +F0E0 +5FA0 +54A0 +9EA0 +6440 +2440 +5EA0 +8120 +ENDCHAR +STARTCHAR U_5B0E +ENCODING 23310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +4EC0 +4540 +FFE0 +AA40 +ABE0 +AE40 +E440 +55E0 +4A00 +93E0 +ENDCHAR +STARTCHAR U_5B0F +ENCODING 23311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4920 +F540 +AFE0 +A540 +A920 +AFE0 +E920 +2FE0 +5920 +8FE0 +ENDCHAR +STARTCHAR U_5B10 +ENCODING 23312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +FBA0 +A000 +AEE0 +AAA0 +AEE0 +6000 +3440 +4AA0 +9120 +ENDCHAR +STARTCHAR U_5B11 +ENCODING 23313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +FFE0 +5000 +57C0 +9440 +67C0 +2920 +5440 +87C0 +ENDCHAR +STARTCHAR U_5B12 +ENCODING 23314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +4440 +FFE0 +AD60 +ABA0 +AFE0 +A440 +67C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_5B13 +ENCODING 23315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4E80 +FAE0 +AEA0 +ABA0 +AEA0 +A4A0 +5FA0 +6A40 +92A0 +2520 +ENDCHAR +STARTCHAR U_5B14 +ENCODING 23316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +4B40 +FFE0 +5540 +5540 +55E0 +9F40 +5440 +2DE0 +5520 +A3E0 +ENDCHAR +STARTCHAR U_5B15 +ENCODING 23317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +F100 +57C0 +5100 +9FE0 +E280 +2FE0 +5100 +8100 +ENDCHAR +STARTCHAR U_5B16 +ENCODING 23318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +4940 +7FE0 +A480 +3FE0 +0480 +FFE0 +0900 +0700 +78E0 +ENDCHAR +STARTCHAR U_5B17 +ENCODING 23319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +ABA0 +AAA0 +AAA0 +AFE0 +6440 +27C0 +5440 +8FE0 +ENDCHAR +STARTCHAR U_5B18 +ENCODING 23320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4940 +4BE0 +F100 +52A0 +5D40 +96E0 +E540 +34C0 +4C00 +93E0 +ENDCHAR +STARTCHAR U_5B19 +ENCODING 23321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F540 +ABA0 +A100 +AFE0 +AAA0 +6BA0 +2820 +5FE0 +8820 +ENDCHAR +STARTCHAR U_5B1A +ENCODING 23322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FA80 +AFE0 +AAA0 +AFE0 +AAA0 +4FE0 +3280 +56C0 +AAA0 +ENDCHAR +STARTCHAR U_5B1B +ENCODING 23323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +5000 +5FE0 +5440 +57C0 +6280 +36A0 +4A40 +8320 +ENDCHAR +STARTCHAR U_5B1C +ENCODING 23324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +29E0 +FEA0 +4880 +7940 +4A20 +FFE0 +1100 +0F00 +70C0 +ENDCHAR +STARTCHAR U_5B1D +ENCODING 23325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FC0 +F840 +AFC0 +A840 +AFE0 +A220 +BFA0 +6AC0 +5900 +8CE0 +ENDCHAR +STARTCHAR U_5B1E +ENCODING 23326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFC0 +5100 +5FE0 +5540 +57C0 +5540 +2FE0 +5100 +9FE0 +ENDCHAR +STARTCHAR U_5B1F +ENCODING 23327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2100 +F7C0 +5100 +5FE0 +9540 +6280 +2FE0 +5240 +96A0 +ENDCHAR +STARTCHAR U_5B20 +ENCODING 23328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4280 +F380 +AEE0 +AAA0 +AEE0 +A100 +AFE0 +6380 +5540 +8920 +ENDCHAR +STARTCHAR U_5B21 +ENCODING 23329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FFE0 +5520 +52C0 +5620 +53E0 +2240 +3580 +4A40 +8420 +ENDCHAR +STARTCHAR U_5B22 +ENCODING 23330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +F2A0 +57C0 +5280 +9FE0 +E300 +36A0 +5A40 +8320 +ENDCHAR +STARTCHAR U_5B23 +ENCODING 23331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F2A0 +AA40 +AFE0 +AAA0 +BFE0 +C000 +2FE0 +5100 +8300 +ENDCHAR +STARTCHAR U_5B24 +ENCODING 23332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EA40 +AFE0 +AB40 +AEE0 +AA40 +4D40 +6B80 +9440 +27A0 +ENDCHAR +STARTCHAR U_5B25 +ENCODING 23333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +E660 +AAA0 +A220 +A900 +BFE0 +C900 +2FC0 +5900 +8FE0 +ENDCHAR +STARTCHAR U_5B26 +ENCODING 23334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F100 +AFE0 +A120 +AFC0 +A020 +DFE0 +2AA0 +5EA0 +8060 +ENDCHAR +STARTCHAR U_5B27 +ENCODING 23335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FC0 +F240 +AFE0 +A240 +AFE0 +A540 +CAA0 +3FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_5B28 +ENCODING 23336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +E440 +A9A0 +BEC0 +AAA0 +AEE0 +E240 +2D20 +5460 +83C0 +ENDCHAR +STARTCHAR U_5B29 +ENCODING 23337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4F40 +4A40 +FFC0 +4940 +5DC0 +9940 +EFE0 +2000 +5440 +8820 +ENDCHAR +STARTCHAR U_5B2A +ENCODING 23338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F820 +A7C0 +A980 +AFC0 +B440 +C7C0 +2440 +57C0 +8C60 +ENDCHAR +STARTCHAR U_5B2B +ENCODING 23339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2B60 +2A40 +F5A0 +5000 +5FE0 +9920 +57C0 +2380 +5540 +9920 +ENDCHAR +STARTCHAR U_5B2C +ENCODING 23340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +EFE0 +AAA0 +A440 +AFE0 +A100 +CFE0 +2AA0 +5AA0 +8860 +ENDCHAR +STARTCHAR U_5B2D +ENCODING 23341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +F920 +AFE0 +A920 +ADA0 +AB60 +CDA0 +6B60 +5DA0 +8860 +ENDCHAR +STARTCHAR U_5B2E +ENCODING 23342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54C0 +5CA0 +57E0 +5C80 +5540 +5620 +7FE0 +4480 +8700 +98C0 +ENDCHAR +STARTCHAR U_5B2F +ENCODING 23343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E100 +AFE0 +B440 +BFE0 +A2A0 +A440 +5FE0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_5B30 +ENCODING 23344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +2A80 +4440 +FFE0 +1100 +0F00 +F8E0 +ENDCHAR +STARTCHAR U_5B31 +ENCODING 23345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3F00 +95E0 +5F40 +3540 +DF40 +4440 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_5B32 +ENCODING 23346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +FBE0 +AEA0 +FBE0 +4A80 +FBE0 +54A0 +54A0 +9B20 +6260 +ENDCHAR +STARTCHAR U_5B33 +ENCODING 23347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +57E0 +5C80 +57E0 +9480 +57E0 +2240 +5180 +8E60 +ENDCHAR +STARTCHAR U_5B34 +ENCODING 23348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4000 +7FC0 +4080 +FFC0 +A540 +FFC0 +AB40 +E540 +BA60 +ENDCHAR +STARTCHAR U_5B35 +ENCODING 23349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +6500 +4BE0 +FD20 +55E0 +5480 +53E0 +2EA0 +2AA0 +54E0 +9480 +ENDCHAR +STARTCHAR U_5B36 +ENCODING 23350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +F340 +52C0 +57E0 +5520 +97E0 +5520 +27E0 +5240 +8440 +ENDCHAR +STARTCHAR U_5B37 +ENCODING 23351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FA40 +AFE0 +AA40 +AFE0 +A940 +EA80 +2D40 +5240 +A3A0 +ENDCHAR +STARTCHAR U_5B38 +ENCODING 23352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FB20 +5540 +5FE0 +5540 +5FE0 +2540 +37C0 +4D40 +87C0 +ENDCHAR +STARTCHAR U_5B39 +ENCODING 23353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4BA0 +4AA0 +EEE0 +ABA0 +AEE0 +AAA0 +BFE0 +A000 +4440 +A820 +ENDCHAR +STARTCHAR U_5B3A +ENCODING 23354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +2FE0 +F900 +5FC0 +5940 +5FE0 +2140 +5520 +8A40 +0BC0 +ENDCHAR +STARTCHAR U_5B3B +ENCODING 23355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +5AA0 +5FE0 +9440 +E7C0 +2440 +57C0 +8820 +ENDCHAR +STARTCHAR U_5B3C +ENCODING 23356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +56A0 +FCA0 +A5A0 +AAA0 +BFA0 +A4A0 +BFA0 +7520 +4E20 +9F60 +ENDCHAR +STARTCHAR U_5B3D +ENCODING 23357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4A80 +EFA0 +B020 +BFE0 +B540 +AFE0 +E100 +3FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_5B3E +ENCODING 23358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EE0 +F540 +5FE0 +5520 +55E0 +5F20 +55E0 +2F20 +55E0 +8720 +ENDCHAR +STARTCHAR U_5B3F +ENCODING 23359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +A780 +A8A0 +BBC0 +AA80 +DBE0 +2000 +6D40 +92A0 +ENDCHAR +STARTCHAR U_5B40 +ENCODING 23360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +5AA0 +55E0 +5F20 +55E0 +2720 +2DE0 +5520 +85E0 +ENDCHAR +STARTCHAR U_5B41 +ENCODING 23361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +77C0 +5540 +77C0 +0800 +FFE0 +0A00 +75C0 +ENDCHAR +STARTCHAR U_5B42 +ENCODING 23362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FAA0 +57C0 +5440 +57C0 +9540 +6480 +27C0 +5540 +8FE0 +ENDCHAR +STARTCHAR U_5B43 +ENCODING 23363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +AEE0 +A280 +AFE0 +A280 +AFE0 +76A0 +4A40 +8320 +ENDCHAR +STARTCHAR U_5B44 +ENCODING 23364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +4EE0 +FAA0 +5EE0 +5BA0 +9D60 +EFE0 +2920 +5BA0 +8D60 +ENDCHAR +STARTCHAR U_5B45 +ENCODING 23365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +4AA0 +F580 +BFE0 +AA80 +BBA0 +AAA0 +9B40 +6A40 +5FA0 +8120 +ENDCHAR +STARTCHAR U_5B46 +ENCODING 23366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +4EE0 +FAA0 +5EE0 +5440 +9AA0 +EFE0 +2480 +5380 +8C60 +ENDCHAR +STARTCHAR U_5B47 +ENCODING 23367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5FE0 +F540 +BFE0 +A540 +BFE0 +A540 +DFE0 +2440 +5380 +8C60 +ENDCHAR +STARTCHAR U_5B48 +ENCODING 23368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4920 +FFE0 +A900 +AFE0 +A900 +AFE0 +CAA0 +2FE0 +5AA0 +8BA0 +ENDCHAR +STARTCHAR U_5B49 +ENCODING 23369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +5FE0 +4280 +FEE0 +5AA0 +5AE0 +97E0 +DC80 +27E0 +5480 +87E0 +ENDCHAR +STARTCHAR U_5B4A +ENCODING 23370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4A40 +FFE0 +5A40 +5BA0 +9EE0 +EA80 +2EE0 +5280 +96E0 +ENDCHAR +STARTCHAR U_5B4B +ENCODING 23371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +EDA0 +AB60 +AFE0 +AAA0 +AFE0 +ECA0 +2FC0 +54A0 +A6E0 +ENDCHAR +STARTCHAR U_5B4C +ENCODING 23372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +9080 +EEE0 +4040 +BEE0 +AAA0 +5B40 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_5B4D +ENCODING 23373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FFE0 +AE00 +AA80 +AEE0 +ABA0 +6EA0 +2AA0 +5E40 +A2A0 +ENDCHAR +STARTCHAR U_5B4E +ENCODING 23374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +FFE0 +AD40 +AB80 +AD40 +AFE0 +CAA0 +37A0 +52A0 +8760 +ENDCHAR +STARTCHAR U_5B4F +ENCODING 23375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +4280 +FEE0 +5AA0 +5FE0 +9920 +EFE0 +2D60 +5BA0 +8D60 +ENDCHAR +STARTCHAR U_5B50 +ENCODING 23376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0100 +0200 +0400 +0400 +FFE0 +0400 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B51 +ENCODING 23377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0100 +0600 +0420 +04C0 +0F00 +F400 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B52 +ENCODING 23378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF00 +0200 +0400 +1800 +1000 +1F80 +1000 +1000 +1000 +5000 +2000 +ENDCHAR +STARTCHAR U_5B53 +ENCODING 23379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0100 +8200 +4C00 +2800 +1800 +0C00 +0B00 +08E0 +2800 +1000 +ENDCHAR +STARTCHAR U_5B54 +ENCODING 23380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +0500 +0900 +1100 +1100 +1D00 +F100 +1120 +1120 +1120 +70E0 +ENDCHAR +STARTCHAR U_5B55 +ENCODING 23381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13E0 +2020 +5F20 +82C0 +0400 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B56 +ENCODING 23382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +1040 +2080 +2080 +3BE0 +E080 +2080 +2080 +2080 +6180 +ENDCHAR +STARTCHAR U_5B57 +ENCODING 23383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9F40 +0200 +0400 +FFE0 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B58 +ENCODING 23384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1000 +2FC0 +2080 +6100 +BFE0 +2100 +2100 +2100 +2700 +ENDCHAR +STARTCHAR U_5B59 +ENCODING 23385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +2100 +2540 +3540 +E520 +2920 +2920 +2100 +2100 +E700 +ENDCHAR +STARTCHAR U_5B5A +ENCODING 23386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E40 +4840 +2480 +7FC0 +0200 +0400 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B5B +ENCODING 23387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +8020 +3F80 +0200 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B5C +ENCODING 23388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +0BE0 +3240 +2640 +3A40 +E140 +2080 +2180 +A240 +4420 +ENDCHAR +STARTCHAR U_5B5D +ENCODING 23389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +3FC0 +0500 +FFE0 +0400 +1F80 +6100 +8200 +7FE0 +0200 +0600 +ENDCHAR +STARTCHAR U_5B5E +ENCODING 23390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0200 +0400 +FFE0 +0400 +1400 +0800 +4440 +A520 +A120 +1F00 +ENDCHAR +STARTCHAR U_5B5F +ENCODING 23391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0200 +0400 +FFC0 +0400 +1400 +0800 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_5B60 +ENCODING 23392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0020 +7FA0 +2120 +3F20 +0060 +3F00 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B61 +ENCODING 23393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +0900 +1200 +2440 +37A0 +6000 +A7E0 +2420 +2420 +2420 +E7E0 +ENDCHAR +STARTCHAR U_5B62 +ENCODING 23394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +0BE0 +1420 +23A0 +2AA0 +33A0 +E220 +22C0 +2200 +A220 +61E0 +ENDCHAR +STARTCHAR U_5B63 +ENCODING 23395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +1500 +E4E0 +3F80 +0200 +FFE0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B64 +ENCODING 23396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +1740 +2540 +2D40 +3540 +E540 +2540 +2520 +25A0 +AB60 +5020 +ENDCHAR +STARTCHAR U_5B65 +ENCODING 23397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA40 +4980 +3640 +C820 +1F80 +0100 +FFE0 +0200 +0A00 +0400 +ENDCHAR +STARTCHAR U_5B66 +ENCODING 23398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4880 +2500 +FFC0 +8040 +3F00 +0200 +0400 +FFC0 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B67 +ENCODING 23399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47E0 +F120 +2220 +52A0 +E440 +3F00 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B68 +ENCODING 23400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0200 +FFE0 +0400 +1400 +0C00 +7BC0 +0840 +3BE0 +D080 +3180 +ENDCHAR +STARTCHAR U_5B69 +ENCODING 23401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +17E0 +2100 +2240 +3780 +E120 +2240 +2480 +2140 +A220 +4C20 +ENDCHAR +STARTCHAR U_5B6A +ENCODING 23402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +4A40 +8020 +3F80 +0200 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B6B +ENCODING 23403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FB00 +1100 +2240 +2780 +3140 +E7A0 +2080 +22C0 +A4A0 +4180 +ENDCHAR +STARTCHAR U_5B6C +ENCODING 23404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0200 +0EC0 +7220 +23C0 +F840 +2880 +4FE0 +5080 +2A80 +C580 +ENDCHAR +STARTCHAR U_5B6D +ENCODING 23405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7BE0 +0A20 +13E0 +1220 +3BE0 +D220 +13E0 +1000 +1240 +3420 +ENDCHAR +STARTCHAR U_5B6E +ENCODING 23406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +2820 +27C0 +3000 +6FE0 +A100 +2540 +2920 +B120 +4300 +ENDCHAR +STARTCHAR U_5B6F +ENCODING 23407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7940 +4880 +7B60 +0000 +7F80 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B70 +ENCODING 23408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +4BC0 +7940 +0140 +7F40 +09C0 +1140 +7A40 +1420 +7820 +ENDCHAR +STARTCHAR U_5B71 +ENCODING 23409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +3FE0 +2100 +3EE0 +2440 +5FE0 +4440 +9CC0 +ENDCHAR +STARTCHAR U_5B72 +ENCODING 23410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1280 +2280 +2EE0 +2820 +3820 +E820 +2EE0 +2280 +A280 +6FE0 +ENDCHAR +STARTCHAR U_5B73 +ENCODING 23411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2940 +F780 +4A40 +FFA0 +0100 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5B74 +ENCODING 23412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0200 +FFE0 +1040 +FBE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_5B75 +ENCODING 23413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +CD00 +8A80 +AB20 +EEA0 +ABE0 +EA40 +AEE0 +2840 +4840 +88C0 +ENDCHAR +STARTCHAR U_5B76 +ENCODING 23414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A80 +1140 +7FC0 +0000 +3F80 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B77 +ENCODING 23415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2540 +FC80 +7140 +AA20 +7FE0 +4200 +5FC0 +4200 +8600 +ENDCHAR +STARTCHAR U_5B78 +ENCODING 23416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +8020 +3F00 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B79 +ENCODING 23417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +7A80 +47C0 +7900 +A900 +3F80 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5B7A +ENCODING 23418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +2FE0 +2920 +3AA0 +6FE0 +A100 +2FE0 +2AA0 +AAA0 +6860 +ENDCHAR +STARTCHAR U_5B7B +ENCODING 23419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17C0 +2140 +27E0 +3140 +6FE0 +A540 +2AA0 +2FE0 +AAA0 +7FE0 +ENDCHAR +STARTCHAR U_5B7C +ENCODING 23420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FBC0 +5280 +FFE0 +4900 +7900 +1F80 +0200 +FFC0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B7D +ENCODING 23421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +2080 +7BE0 +4940 +7BE0 +4880 +7FC0 +0100 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_5B7E +ENCODING 23422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2EE0 +4AA0 +4EE0 +6440 +CAA0 +5FE0 +4480 +4380 +CC60 +ENDCHAR +STARTCHAR U_5B7F +ENCODING 23423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +A0C0 +4E40 +E0E0 +4F40 +AAA0 +3F80 +0200 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B80 +ENCODING 23424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +0400 +0200 +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_5B81 +ENCODING 23425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8040 +0000 +FFC0 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_5B82 +ENCODING 23426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +7FE0 +4040 +9E80 +1200 +1200 +2200 +2200 +4240 +81C0 +ENDCHAR +STARTCHAR U_5B83 +ENCODING 23427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9040 +1000 +1380 +1C00 +1000 +1020 +1020 +0FE0 +ENDCHAR +STARTCHAR U_5B84 +ENCODING 23428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0800 +7F00 +0900 +0900 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_5B85 +ENCODING 23429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8340 +3C00 +0400 +07C0 +7C00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5B86 +ENCODING 23430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +4040 +BF80 +0080 +3F80 +2000 +3FC0 +0040 +02C0 +0100 +ENDCHAR +STARTCHAR U_5B87 +ENCODING 23431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9F80 +0200 +0200 +7FE0 +0200 +0200 +0A00 +0400 +ENDCHAR +STARTCHAR U_5B88 +ENCODING 23432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4040 +8200 +7FC0 +0200 +2200 +1200 +0200 +0E00 +ENDCHAR +STARTCHAR U_5B89 +ENCODING 23433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8840 +0800 +FFE0 +1100 +3100 +0E00 +0980 +7060 +ENDCHAR +STARTCHAR U_5B8A +ENCODING 23434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8540 +0480 +7FC0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_5B8B +ENCODING 23435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8440 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_5B8C +ENCODING 23436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9F40 +0000 +7FE0 +0A00 +1200 +1220 +2220 +41E0 +ENDCHAR +STARTCHAR U_5B8D +ENCODING 23437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8840 +0400 +FFE0 +0000 +0900 +1080 +2040 +C040 +ENDCHAR +STARTCHAR U_5B8E +ENCODING 23438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8340 +3C00 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5B8F +ENCODING 23439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4420 +8440 +7FE0 +0800 +0A00 +1200 +2480 +4860 +1FA0 +ENDCHAR +STARTCHAR U_5B90 +ENCODING 23440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +8820 +0F80 +1080 +2900 +2500 +0100 +0200 +FFE0 +ENDCHAR +STARTCHAR U_5B91 +ENCODING 23441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +1100 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5B92 +ENCODING 23442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +87A0 +3C00 +0780 +7C00 +07C0 +FC20 +0420 +03E0 +ENDCHAR +STARTCHAR U_5B93 +ENCODING 23443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +84A0 +1480 +5100 +5240 +5420 +98A0 +3080 +CF80 +ENDCHAR +STARTCHAR U_5B94 +ENCODING 23444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +7FC0 +0400 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5B95 +ENCODING 23445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8040 +7FE0 +0800 +1FC0 +3040 +5040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_5B96 +ENCODING 23446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7880 +0880 +7880 +4100 +7900 +0A40 +0FE0 +3020 +ENDCHAR +STARTCHAR U_5B97 +ENCODING 23447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +9F80 +0000 +7FE0 +0200 +2280 +2240 +4A40 +0400 +ENDCHAR +STARTCHAR U_5B98 +ENCODING 23448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9FC0 +1080 +1F80 +1000 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_5B99 +ENCODING 23449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4440 +8400 +3FC0 +2440 +3FC0 +2440 +2440 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5B9A +ENCODING 23450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8040 +3FC0 +0400 +2400 +2780 +2400 +5400 +8FE0 +ENDCHAR +STARTCHAR U_5B9B +ENCODING 23451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +A040 +3FC0 +2A40 +6A40 +1AC0 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5B9C +ENCODING 23452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +9FC0 +1080 +1F80 +1080 +1F80 +1080 +1080 +7FE0 +ENDCHAR +STARTCHAR U_5B9D +ENCODING 23453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +8020 +3F80 +0400 +0400 +3F80 +0500 +0480 +FFE0 +ENDCHAR +STARTCHAR U_5B9E +ENCODING 23454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5020 +8A40 +2200 +1200 +7FE0 +0200 +0500 +0880 +7060 +ENDCHAR +STARTCHAR U_5B9F +ENCODING 23455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +0400 +3F80 +0400 +7FC0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5BA0 +ENCODING 23456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +0900 +FFE0 +0A00 +1240 +1280 +2320 +4620 +99E0 +ENDCHAR +STARTCHAR U_5BA1 +ENCODING 23457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +0400 +0400 +ENDCHAR +STARTCHAR U_5BA2 +ENCODING 23458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +9040 +3F00 +5200 +8C00 +3300 +FFC0 +2100 +2100 +3F00 +ENDCHAR +STARTCHAR U_5BA3 +ENCODING 23459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0000 +3F80 +2080 +3F80 +2080 +3F80 +FFE0 +ENDCHAR +STARTCHAR U_5BA4 +ENCODING 23460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +0800 +1100 +3E80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5BA5 +ENCODING 23461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +7FC0 +1000 +3F80 +5080 +9F80 +1080 +1F80 +1180 +ENDCHAR +STARTCHAR U_5BA6 +ENCODING 23462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4040 +BF80 +2200 +3F80 +2080 +3F80 +2200 +2200 +3FC0 +ENDCHAR +STARTCHAR U_5BA7 +ENCODING 23463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +2200 +2F80 +2880 +2F80 +2200 +2200 +3FC0 +ENDCHAR +STARTCHAR U_5BA8 +ENCODING 23464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +2A40 +1A80 +0A00 +1B00 +6AC0 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5BA9 +ENCODING 23465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +A520 +1600 +FFE0 +0E00 +1500 +6480 +8460 +0400 +ENDCHAR +STARTCHAR U_5BAA +ENCODING 23466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8040 +2400 +3F00 +4400 +FFC0 +1200 +1200 +2240 +C1C0 +ENDCHAR +STARTCHAR U_5BAB +ENCODING 23467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8040 +3F00 +2100 +3F00 +0000 +7F80 +4080 +7F80 +4080 +ENDCHAR +STARTCHAR U_5BAC +ENCODING 23468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +42A0 +3FE0 +2200 +3A40 +2A40 +2A80 +2920 +52A0 +8460 +ENDCHAR +STARTCHAR U_5BAD +ENCODING 23469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0880 +7FE0 +0880 +7FC0 +3040 +5FC0 +9040 +ENDCHAR +STARTCHAR U_5BAE +ENCODING 23470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4040 +9F80 +1080 +1F80 +0400 +3FC0 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_5BAF +ENCODING 23471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +1F40 +0480 +FFE0 +0900 +3200 +CFC0 +0200 +0E00 +ENDCHAR +STARTCHAR U_5BB0 +ENCODING 23472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +1100 +0A00 +FFE0 +0400 +3FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_5BB1 +ENCODING 23473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2200 +67C0 +AA00 +23C0 +2200 +23C0 +2200 +2200 +ENDCHAR +STARTCHAR U_5BB2 +ENCODING 23474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +1F00 +1100 +1F00 +0400 +FFE0 +0E00 +1500 +64C0 +ENDCHAR +STARTCHAR U_5BB3 +ENCODING 23475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +BFA0 +0400 +3F80 +0400 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_5BB4 +ENCODING 23476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +A140 +BF40 +2100 +3F00 +0800 +FFC0 +2200 +1E00 +F1C0 +ENDCHAR +STARTCHAR U_5BB5 +ENCODING 23477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +1500 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_5BB6 +ENCODING 23478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +1440 +2A80 +1300 +6E80 +1240 +6220 +0C00 +ENDCHAR +STARTCHAR U_5BB7 +ENCODING 23479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +81A0 +3E00 +2480 +1500 +FFE0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_5BB8 +ENCODING 23480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +2000 +2F80 +2000 +3FE0 +2940 +4880 +8C60 +ENDCHAR +STARTCHAR U_5BB9 +ENCODING 23481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +4A40 +1100 +2080 +DF60 +1100 +1100 +1F00 +ENDCHAR +STARTCHAR U_5BBA +ENCODING 23482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2080 +3F80 +0000 +FFE0 +1500 +2520 +45E0 +ENDCHAR +STARTCHAR U_5BBB +ENCODING 23483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +4A40 +2480 +1B00 +E0E0 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5BBC +ENCODING 23484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7200 +07C0 +FA80 +5480 +5280 +5120 +52A0 +8FE0 +ENDCHAR +STARTCHAR U_5BBD +ENCODING 23485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +3F80 +2480 +2480 +2AA0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_5BBE +ENCODING 23486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +80A0 +9F20 +1000 +1FC0 +1100 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5BBF +ENCODING 23487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9020 +1FC0 +2100 +67C0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_5BC0 +ENCODING 23488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +80A0 +FF20 +2480 +1500 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_5BC1 +ENCODING 23489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8440 +7F80 +0500 +FFC0 +0500 +3F80 +2400 +5400 +8FC0 +ENDCHAR +STARTCHAR U_5BC2 +ENCODING 23490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9020 +1DC0 +1140 +FF40 +1140 +3940 +5480 +9140 +3620 +ENDCHAR +STARTCHAR U_5BC3 +ENCODING 23491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5020 +9E40 +2200 +7F80 +2480 +3F80 +0A80 +1220 +E3E0 +ENDCHAR +STARTCHAR U_5BC4 +ENCODING 23492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +BFA0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +0380 +ENDCHAR +STARTCHAR U_5BC5 +ENCODING 23493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5BC6 +ENCODING 23494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +88A0 +5500 +9240 +14A0 +EFA0 +0400 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_5BC7 +ENCODING 23495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8120 +39C0 +0100 +7FC0 +2940 +2880 +2960 +4A20 +87E0 +ENDCHAR +STARTCHAR U_5BC8 +ENCODING 23496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +3F80 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5BC9 +ENCODING 23497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +9220 +BFC0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +2000 +ENDCHAR +STARTCHAR U_5BCA +ENCODING 23498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +07C0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_5BCB +ENCODING 23499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +BFA0 +0900 +7FE0 +1880 +2F40 +4B20 +0840 +07C0 +ENDCHAR +STARTCHAR U_5BCC +ENCODING 23500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +1F00 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5BCD +ENCODING 23501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +94A0 +5240 +9040 +0F80 +0000 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_5BCE +ENCODING 23502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8020 +ABE0 +2880 +7BE0 +0AA0 +FAA0 +2B60 +4A20 +8A60 +ENDCHAR +STARTCHAR U_5BCF +ENCODING 23503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +1F00 +2200 +FFC0 +5140 +64C0 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5BD0 +ENCODING 23504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +D120 +57C0 +7100 +1FE0 +F100 +5380 +5540 +9920 +ENDCHAR +STARTCHAR U_5BD1 +ENCODING 23505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8020 +97A0 +2080 +2780 +6080 +AFE0 +2AA0 +2100 +2EE0 +ENDCHAR +STARTCHAR U_5BD2 +ENCODING 23506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +BFA0 +0900 +FFE0 +0900 +1480 +E360 +0C00 +0300 +ENDCHAR +STARTCHAR U_5BD3 +ENCODING 23507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +BFA0 +2480 +3F80 +2480 +7FC0 +4540 +5F40 +40C0 +ENDCHAR +STARTCHAR U_5BD4 +ENCODING 23508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +90A0 +1F80 +1080 +FFE0 +1200 +13C0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_5BD5 +ENCODING 23509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7FC0 +0800 +7FC0 +4A40 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_5BD6 +ENCODING 23510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +80A0 +2780 +1080 +9F80 +6080 +3FE0 +D4A0 +4300 +4C60 +ENDCHAR +STARTCHAR U_5BD7 +ENCODING 23511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +54C0 +3FA0 +E480 +3F80 +2480 +FFE0 +2080 +2180 +ENDCHAR +STARTCHAR U_5BD8 +ENCODING 23512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8840 +7F80 +2100 +3D00 +2F00 +2100 +FFC0 +1200 +E1C0 +ENDCHAR +STARTCHAR U_5BD9 +ENCODING 23513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +89E0 +7700 +5540 +5540 +5540 +5520 +9DE0 +A240 +ENDCHAR +STARTCHAR U_5BDA +ENCODING 23514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0400 +7FC0 +2000 +3FC0 +C400 +2440 +7FC0 +ENDCHAR +STARTCHAR U_5BDB +ENCODING 23515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +BF80 +1200 +3F80 +2080 +3F80 +2A80 +0A20 +71E0 +ENDCHAR +STARTCHAR U_5BDC +ENCODING 23516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4440 +9100 +5F40 +0000 +3F80 +2A80 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5BDD +ENCODING 23517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +97A0 +5080 +3780 +1080 +3FE0 +DAA0 +1100 +1EE0 +ENDCHAR +STARTCHAR U_5BDE +ENCODING 23518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +FFE0 +2080 +3F80 +2080 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5BDF +ENCODING 23519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A220 +BDE0 +6940 +5080 +2F40 +C020 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_5BE0 +ENCODING 23520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +FFE0 +2480 +7FC0 +4440 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_5BE1 +ENCODING 23521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +8840 +3F00 +2100 +3F00 +2100 +FFC0 +4A80 +9240 +6600 +ENDCHAR +STARTCHAR U_5BE2 +ENCODING 23522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +5780 +5080 +7780 +1000 +FFE0 +5AA0 +5100 +9EE0 +ENDCHAR +STARTCHAR U_5BE3 +ENCODING 23523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +5FE0 +5000 +77C0 +1000 +F7C0 +5440 +57C0 +9440 +ENDCHAR +STARTCHAR U_5BE4 +ENCODING 23524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +57C0 +5100 +77C0 +1240 +FFE0 +5440 +5440 +97C0 +ENDCHAR +STARTCHAR U_5BE5 +ENCODING 23525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AAA0 +99A0 +2A80 +0E00 +F5E0 +1900 +0600 +0180 +1E00 +ENDCHAR +STARTCHAR U_5BE6 +ENCODING 23526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9520 +7FC0 +2A00 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5BE7 +ENCODING 23527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8420 +32C0 +5FA0 +0000 +3F80 +2A80 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_5BE8 +ENCODING 23528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +1100 +FFE0 +2480 +5F40 +8420 +2480 +4C40 +ENDCHAR +STARTCHAR U_5BE9 +ENCODING 23529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +1500 +FFE0 +1500 +7FC0 +A4A0 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_5BEA +ENCODING 23530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +1500 +3F80 +2080 +3FC0 +2040 +3FE0 +5520 +AA60 +ENDCHAR +STARTCHAR U_5BEB +ENCODING 23531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +B3A0 +2080 +3B80 +2080 +3FE0 +D520 +2AA0 +4AC0 +ENDCHAR +STARTCHAR U_5BEC +ENCODING 23532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +3F80 +2080 +3F80 +20E0 +3FA0 +E0E0 +ENDCHAR +STARTCHAR U_5BED +ENCODING 23533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4440 +BF80 +0400 +3F80 +24A0 +FFE0 +0400 +5140 +8F20 +ENDCHAR +STARTCHAR U_5BEE +ENCODING 23534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +FFE0 +5240 +3F80 +E0E0 +3F80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_5BEF +ENCODING 23535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A220 +3FC0 +6200 +BFE0 +2200 +7BC0 +4A40 +4E40 +40C0 +ENDCHAR +STARTCHAR U_5BF0 +ENCODING 23536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2A80 +FFE0 +2080 +3F80 +1280 +F100 +18E0 +ENDCHAR +STARTCHAR U_5BF1 +ENCODING 23537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8120 +57C0 +5440 +77C0 +1440 +FFE0 +5380 +5540 +9920 +ENDCHAR +STARTCHAR U_5BF2 +ENCODING 23538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A820 +B7E0 +3D40 +03E0 +7CA0 +1280 +7EE0 +2A80 +C5E0 +ENDCHAR +STARTCHAR U_5BF3 +ENCODING 23539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8220 +7BC0 +1540 +7B80 +1540 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_5BF4 +ENCODING 23540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +9020 +7DE0 +2920 +7FE0 +1120 +7DE0 +10C0 +5540 +B260 +ENDCHAR +STARTCHAR U_5BF5 +ENCODING 23541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +93A0 +7A00 +2BC0 +FC40 +4BC0 +7A00 +4BC0 +7A20 +59E0 +ENDCHAR +STARTCHAR U_5BF6 +ENCODING 23542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A520 +77C0 +2540 +FFC0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_5BF7 +ENCODING 23543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9520 +5540 +7FC0 +5540 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_5BF8 +ENCODING 23544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0200 +0200 +0200 +FFC0 +0200 +2200 +1200 +0200 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_5BF9 +ENCODING 23545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +1FE0 +9080 +5080 +2480 +2280 +5080 +5080 +8280 +0100 +ENDCHAR +STARTCHAR U_5BFA +ENCODING 23546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +0100 +FFE0 +2100 +1100 +0500 +0200 +ENDCHAR +STARTCHAR U_5BFB +ENCODING 23547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +3F80 +0080 +7F80 +0100 +FFE0 +2100 +1100 +0500 +0200 +ENDCHAR +STARTCHAR U_5BFC +ENCODING 23548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3FA0 +2020 +1FE0 +0100 +FFE0 +1100 +0900 +0900 +0300 +ENDCHAR +STARTCHAR U_5BFD +ENCODING 23549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +4840 +2480 +1500 +0080 +FFE0 +2080 +1080 +1280 +0100 +ENDCHAR +STARTCHAR U_5BFE +ENCODING 23550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +FBE0 +1040 +9240 +5140 +2140 +2040 +5040 +4940 +8880 +ENDCHAR +STARTCHAR U_5BFF +ENCODING 23551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0800 +FFE0 +1080 +3FE0 +4880 +0480 +0180 +ENDCHAR +STARTCHAR U_5C00 +ENCODING 23552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FC40 +83E0 +B840 +AA40 +A940 +B940 +A840 +8040 +FD40 +0080 +ENDCHAR +STARTCHAR U_5C01 +ENCODING 23553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +1040 +13E0 +FC40 +1240 +7D40 +1040 +1040 +1C40 +E1C0 +ENDCHAR +STARTCHAR U_5C02 +ENCODING 23554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +3F80 +0100 +FFE0 +2100 +1100 +1300 +ENDCHAR +STARTCHAR U_5C03 +ENCODING 23555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0900 +FFC0 +4880 +7F80 +4880 +7F80 +4880 +4100 +FFC0 +4100 +2700 +ENDCHAR +STARTCHAR U_5C04 +ENCODING 23556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +7C40 +4440 +7FE0 +4440 +7E40 +4540 +FC40 +2440 +4440 +8CC0 +ENDCHAR +STARTCHAR U_5C05 +ENCODING 23557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +13E0 +7C40 +4540 +7D40 +2840 +2940 +2880 +4820 +87C0 +ENDCHAR +STARTCHAR U_5C06 +ENCODING 23558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +A480 +6B00 +2280 +2480 +6FE0 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_5C07 +ENCODING 23559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53E0 +5540 +5280 +F140 +1240 +FFE0 +5240 +5140 +5040 +91C0 +ENDCHAR +STARTCHAR U_5C08 +ENCODING 23560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +3F80 +2480 +7F80 +0540 +FFE0 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_5C09 +ENCODING 23561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4240 +7E40 +41E0 +5C40 +4140 +7EC0 +4840 +5C40 +EA40 +99C0 +ENDCHAR +STARTCHAR U_5C0A +ENCODING 23562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +3FC0 +2A40 +35C0 +3FC0 +0100 +FFE0 +1100 +0700 +ENDCHAR +STARTCHAR U_5C0B +ENCODING 23563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +3F80 +0080 +FFC0 +2240 +FBC0 +0100 +FFE0 +2100 +1700 +ENDCHAR +STARTCHAR U_5C0C +ENCODING 23564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FC40 +2040 +FBE0 +0040 +FA40 +8940 +F940 +8840 +5140 +FC80 +ENDCHAR +STARTCHAR U_5C0D +ENCODING 23565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +AA40 +6C40 +FFE0 +2840 +7D40 +10C0 +7C40 +1040 +1D40 +E080 +ENDCHAR +STARTCHAR U_5C0E +ENCODING 23566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0840 +CF40 +4BC0 +4840 +BFE0 +0080 +FFE0 +1080 +0980 +ENDCHAR +STARTCHAR U_5C0F +ENCODING 23567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +2480 +2440 +4440 +4420 +8420 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_5C10 +ENCODING 23568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2480 +4440 +8420 +0400 +2400 +5000 +0800 +0600 +01E0 +ENDCHAR +STARTCHAR U_5C11 +ENCODING 23569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +1480 +1440 +2420 +4480 +0500 +0200 +0400 +1800 +E000 +ENDCHAR +STARTCHAR U_5C12 +ENCODING 23570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2480 +C460 +0500 +2480 +2480 +4440 +9440 +0800 +ENDCHAR +STARTCHAR U_5C13 +ENCODING 23571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +3FE0 +4400 +8400 +1500 +2480 +4440 +8440 +1400 +0800 +ENDCHAR +STARTCHAR U_5C14 +ENCODING 23572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8480 +0400 +2500 +2480 +4480 +4440 +8440 +1C00 +ENDCHAR +STARTCHAR U_5C15 +ENCODING 23573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +1100 +13E0 +2020 +44C0 +8400 +2480 +2440 +4420 +9420 +0800 +ENDCHAR +STARTCHAR U_5C16 +ENCODING 23574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +4440 +8020 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_5C17 +ENCODING 23575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0780 +0400 +0400 +FFE0 +0400 +2500 +2480 +4440 +9440 +0800 +ENDCHAR +STARTCHAR U_5C18 +ENCODING 23576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2480 +2440 +4420 +8000 +0400 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5C19 +ENCODING 23577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +4440 +8420 +7FC0 +4040 +5F40 +5140 +5F40 +4040 +40C0 +ENDCHAR +STARTCHAR U_5C1A +ENCODING 23578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2480 +1500 +FFE0 +8020 +9F20 +9120 +9120 +9F20 +8020 +80E0 +ENDCHAR +STARTCHAR U_5C1B +ENCODING 23579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +4440 +0400 +1080 +1080 +5AC0 +94A0 +1080 +3180 +ENDCHAR +STARTCHAR U_5C1C +ENCODING 23580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +4440 +8020 +0400 +FFE0 +1500 +E4E0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_5C1D +ENCODING 23581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2480 +0400 +FFE0 +8020 +3F80 +0000 +FFE0 +1000 +2080 +7FC0 +ENDCHAR +STARTCHAR U_5C1E +ENCODING 23582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +1F00 +3180 +DF60 +1100 +1F00 +0400 +2480 +4C40 +ENDCHAR +STARTCHAR U_5C1F +ENCODING 23583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4480 +7DC0 +46A0 +7CA0 +0080 +FCA0 +5040 +5D80 +B000 +8FE0 +ENDCHAR +STARTCHAR U_5C20 +ENCODING 23584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +FC80 +4880 +79C0 +49A0 +7A80 +48A0 +FCA0 +5840 +6480 +7F00 +ENDCHAR +STARTCHAR U_5C21 +ENCODING 23585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA20 +73E0 +2220 +FBE0 +5280 +53A0 +52C0 +5280 +9AA0 +9360 +ENDCHAR +STARTCHAR U_5C22 +ENCODING 23586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +0800 +FFE0 +0A00 +0A00 +0A00 +1200 +1220 +2220 +41E0 +ENDCHAR +STARTCHAR U_5C23 +ENCODING 23587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1200 +2100 +4080 +9240 +1200 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5C24 +ENCODING 23588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0880 +0800 +FFE0 +0A00 +0A00 +1200 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_5C25 +ENCODING 23589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC40 +2040 +2A40 +2940 +2940 +2840 +28E0 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C26 +ENCODING 23590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +43C0 +AC40 +2A40 +2940 +2840 +2940 +48A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C27 +ENCODING 23591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FD00 +0A40 +0C40 +73C0 +0000 +FFE0 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5C28 +ENCODING 23592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0840 +FFE0 +0A00 +0B40 +16A0 +1340 +1680 +2320 +4620 +81E0 +ENDCHAR +STARTCHAR U_5C29 +ENCODING 23593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +27C0 +4500 +A900 +2BC0 +2900 +2900 +2FC0 +2800 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C2A +ENCODING 23594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +F900 +57C0 +5100 +5100 +5100 +5FE0 +5020 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C2B +ENCODING 23595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +57C0 +5100 +5100 +57C0 +5100 +5100 +57E0 +5000 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C2C +ENCODING 23596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +4240 +FC20 +5280 +5280 +5280 +5280 +5280 +54A0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C2D +ENCODING 23597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +2080 +FFE0 +2080 +7FC0 +1200 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5C2E +ENCODING 23598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4480 +FCC0 +5440 +58C0 +5100 +5FE0 +5540 +5920 +5120 +8FE0 +ENDCHAR +STARTCHAR U_5C2F +ENCODING 23599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +FFE0 +5400 +55C0 +5540 +55C0 +5520 +59E0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5C30 +ENCODING 23600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +FFE0 +5540 +57C0 +5540 +57C0 +5100 +57C0 +9120 +8FE0 +ENDCHAR +STARTCHAR U_5C31 +ENCODING 23601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD40 +0120 +7FE0 +4A80 +7A80 +1280 +5AA0 +56A0 +92A0 +3460 +ENDCHAR +STARTCHAR U_5C32 +ENCODING 23602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5FC0 +4500 +FFC0 +5540 +5FE0 +5540 +5FC0 +55A0 +5D60 +8FE0 +ENDCHAR +STARTCHAR U_5C33 +ENCODING 23603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2640 +F540 +5FE0 +5A20 +53C0 +5240 +53C0 +5240 +9260 +8FE0 +ENDCHAR +STARTCHAR U_5C34 +ENCODING 23604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4AE0 +FB80 +4A40 +A200 +A000 +AFE0 +AAA0 +BFE0 +A020 +9FE0 +ENDCHAR +STARTCHAR U_5C35 +ENCODING 23605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F540 +5FE0 +5000 +57C0 +5540 +57C0 +5280 +5440 +8FE0 +ENDCHAR +STARTCHAR U_5C36 +ENCODING 23606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +5560 +57C0 +54A0 +57A0 +5520 +57E0 +5540 +5FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5C37 +ENCODING 23607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +4AE0 +FF00 +4940 +4F20 +4A00 +4FE0 +AAA0 +BFE0 +A020 +9FE0 +ENDCHAR +STARTCHAR U_5C38 +ENCODING 23608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +2020 +2020 +3FE0 +2020 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5C39 +ENCODING 23609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0880 +0880 +FFC0 +0880 +0880 +7F80 +1080 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_5C3A +ENCODING 23610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +2040 +2040 +3FC0 +2400 +2400 +2200 +2100 +4080 +8060 +ENDCHAR +STARTCHAR U_5C3B +ENCODING 23611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +2040 +3FC0 +2400 +3F80 +2480 +2480 +44A0 +48A0 +90E0 +ENDCHAR +STARTCHAR U_5C3C +ENCODING 23612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +2040 +3FC0 +2000 +2840 +2980 +2E00 +4820 +4820 +87E0 +ENDCHAR +STARTCHAR U_5C3D +ENCODING 23613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2200 +2100 +4C80 +4240 +9820 +0400 +0200 +ENDCHAR +STARTCHAR U_5C3E +ENCODING 23614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2180 +3E00 +23C0 +3E00 +23C0 +3E20 +4220 +83E0 +ENDCHAR +STARTCHAR U_5C3F +ENCODING 23615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2200 +2240 +3E80 +2700 +2A80 +5240 +AA20 +0400 +ENDCHAR +STARTCHAR U_5C40 +ENCODING 23616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2000 +3FE0 +2020 +2F20 +2920 +4F20 +4920 +80C0 +ENDCHAR +STARTCHAR U_5C41 +ENCODING 23617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2900 +2900 +2F40 +2980 +2900 +2B20 +4D20 +89E0 +ENDCHAR +STARTCHAR U_5C42 +ENCODING 23618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2000 +2FC0 +2000 +3FE0 +2200 +2480 +4840 +8FE0 +ENDCHAR +STARTCHAR U_5C43 +ENCODING 23619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4000 +5FC0 +5040 +5240 +5240 +5200 +44C0 +9820 +ENDCHAR +STARTCHAR U_5C44 +ENCODING 23620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +2FE0 +2820 +2AA0 +2480 +2440 +4820 +9020 +ENDCHAR +STARTCHAR U_5C45 +ENCODING 23621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2200 +3FE0 +2200 +2FC0 +2840 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_5C46 +ENCODING 23622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +2920 +2FE0 +2920 +2FE0 +2820 +4FE0 +8820 +ENDCHAR +STARTCHAR U_5C47 +ENCODING 23623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +2FE0 +2920 +2920 +2FE0 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_5C48 +ENCODING 23624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +2920 +2920 +2FE0 +2100 +2920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_5C49 +ENCODING 23625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2A80 +2A80 +3FE0 +2A80 +2A80 +4B80 +4800 +8FE0 +ENDCHAR +STARTCHAR U_5C4A +ENCODING 23626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2100 +2100 +2FE0 +2920 +2FE0 +4920 +4FE0 +8820 +ENDCHAR +STARTCHAR U_5C4B +ENCODING 23627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2000 +3FE0 +2480 +2FC0 +2100 +2FC0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_5C4C +ENCODING 23628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +2FC0 +2840 +2FC0 +2100 +2FE0 +4920 +8960 +ENDCHAR +STARTCHAR U_5C4D +ENCODING 23629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2000 +3FE0 +2900 +2F20 +3340 +2DA0 +4920 +90E0 +ENDCHAR +STARTCHAR U_5C4E +ENCODING 23630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2200 +2A40 +2680 +3FE0 +2300 +2680 +4A40 +9220 +ENDCHAR +STARTCHAR U_5C4F +ENCODING 23631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2840 +2480 +3FE0 +2480 +3FE0 +2480 +4880 +9080 +ENDCHAR +STARTCHAR U_5C50 +ENCODING 23632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2480 +2BE0 +3480 +2BE0 +3940 +2880 +4940 +8A20 +ENDCHAR +STARTCHAR U_5C51 +ENCODING 23633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2920 +2540 +2FC0 +2840 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_5C52 +ENCODING 23634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +5FC0 +5000 +5FC0 +5000 +5FE0 +A940 +CCE0 +ENDCHAR +STARTCHAR U_5C53 +ENCODING 23635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +5FC0 +5040 +5FC0 +5040 +5FC0 +4480 +9840 +ENDCHAR +STARTCHAR U_5C54 +ENCODING 23636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +7420 +4420 +7FE0 +5500 +5520 +5540 +5580 +5D20 +F520 +08E0 +ENDCHAR +STARTCHAR U_5C55 +ENCODING 23637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4900 +7FC0 +4900 +7FE0 +5240 +5180 +9480 +9860 +ENDCHAR +STARTCHAR U_5C56 +ENCODING 23638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2200 +3FE0 +2500 +3FE0 +2200 +3FE0 +4200 +8200 +ENDCHAR +STARTCHAR U_5C57 +ENCODING 23639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7FE0 +4A40 +7140 +5D40 +7040 +5D40 +70A0 +9020 +8FE0 +ENDCHAR +STARTCHAR U_5C58 +ENCODING 23640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +7C80 +4880 +73E0 +5080 +7C80 +5080 +7DA0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5C59 +ENCODING 23641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +5FE0 +5440 +59C0 +5540 +55C0 +5C40 +90C0 +ENDCHAR +STARTCHAR U_5C5A +ENCODING 23642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4000 +7FE0 +4200 +7FE0 +6AA0 +6220 +AAA0 +A260 +ENDCHAR +STARTCHAR U_5C5B +ENCODING 23643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4440 +4880 +5DE0 +4880 +5DE0 +4880 +8880 +9080 +ENDCHAR +STARTCHAR U_5C5C +ENCODING 23644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4AA0 +52A0 +6FE0 +52A0 +72A0 +52E0 +9200 +93E0 +ENDCHAR +STARTCHAR U_5C5D +ENCODING 23645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2500 +3DE0 +2500 +3DC0 +2500 +5DE0 +4500 +8500 +ENDCHAR +STARTCHAR U_5C5E +ENCODING 23646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4040 +5F80 +4200 +5FC0 +5240 +BFE0 +A220 +AF60 +ENDCHAR +STARTCHAR U_5C5F +ENCODING 23647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +5280 +7FE0 +5280 +5F80 +4400 +7FE0 +5480 +A440 +ENDCHAR +STARTCHAR U_5C60 +ENCODING 23648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2240 +2F40 +2280 +3FE0 +2440 +2FC0 +5440 +87C0 +ENDCHAR +STARTCHAR U_5C61 +ENCODING 23649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2940 +3FE0 +2940 +3220 +3FE0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_5C62 +ENCODING 23650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4A80 +7FE0 +4A40 +7FE0 +4480 +4880 +8700 +BCE0 +ENDCHAR +STARTCHAR U_5C63 +ENCODING 23651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2480 +2AE0 +3680 +2BE0 +2A80 +2AE0 +4D80 +88E0 +ENDCHAR +STARTCHAR U_5C64 +ENCODING 23652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4480 +5FE0 +5520 +5FE0 +4840 +4FC0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_5C65 +ENCODING 23653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4A40 +53C0 +6A40 +53C0 +7640 +5A80 +9180 +9660 +ENDCHAR +STARTCHAR U_5C66 +ENCODING 23654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5540 +67E0 +4B40 +5520 +77E0 +5240 +9180 +9660 +ENDCHAR +STARTCHAR U_5C67 +ENCODING 23655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5540 +6FE0 +4D40 +57E0 +7100 +5FE0 +9540 +9920 +ENDCHAR +STARTCHAR U_5C68 +ENCODING 23656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2AA0 +37E0 +26A0 +2AA0 +3FE0 +4A40 +4980 +8E60 +ENDCHAR +STARTCHAR U_5C69 +ENCODING 23657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +FFE0 +9100 +AFE0 +D480 +AFE0 +E480 +AFE0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_5C6A +ENCODING 23658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4200 +7FE0 +68A0 +5FC0 +68A0 +4F80 +8A80 +B260 +ENDCHAR +STARTCHAR U_5C6B +ENCODING 23659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +4900 +6FE0 +6A40 +7DA0 +4BE0 +BAA0 +ABA0 +CA60 +ENDCHAR +STARTCHAR U_5C6C +ENCODING 23660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2A80 +3FC0 +2540 +3FE0 +3AA0 +2FA0 +42A0 +9F60 +ENDCHAR +STARTCHAR U_5C6D +ENCODING 23661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +5040 +5FC0 +5040 +5FC0 +5540 +5540 +5DC0 +A220 +ENDCHAR +STARTCHAR U_5C6E +ENCODING 23662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +8880 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_5C6F +ENCODING 23663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2480 +2480 +2480 +3F80 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_5C70 +ENCODING 23664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1200 +FFE0 +0400 +4440 +4440 +7FC0 +4440 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_5C71 +ENCODING 23665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_5C72 +ENCODING 23666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +03E0 +FC00 +0400 +0400 +4440 +4440 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5C73 +ENCODING 23667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +0400 +0A00 +3180 +C460 +0400 +4440 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5C74 +ENCODING 23668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0400 +FF80 +0880 +0880 +1080 +2480 +C300 +ENDCHAR +STARTCHAR U_5C75 +ENCODING 23669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +7FC0 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_5C76 +ENCODING 23670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +7FC0 +1040 +1040 +1040 +2140 +C080 +ENDCHAR +STARTCHAR U_5C77 +ENCODING 23671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +AA80 +AB00 +ABE0 +AA20 +AA20 +AA20 +FA20 +84A0 +0860 +ENDCHAR +STARTCHAR U_5C78 +ENCODING 23672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +A900 +A900 +A900 +A900 +A900 +A900 +F900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5C79 +ENCODING 23673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AA00 +AC00 +ABE0 +A840 +A880 +A900 +F920 +8A20 +01E0 +ENDCHAR +STARTCHAR U_5C7A +ENCODING 23674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +A820 +A820 +ABE0 +AA20 +AA00 +AA00 +FA20 +8A20 +01E0 +ENDCHAR +STARTCHAR U_5C7B +ENCODING 23675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +A920 +AB20 +AD20 +A920 +A920 +AA20 +FA20 +04A0 +0840 +ENDCHAR +STARTCHAR U_5C7C +ENCODING 23676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AA80 +AA80 +AA80 +AA80 +AA80 +BA80 +C4A0 +04A0 +08E0 +ENDCHAR +STARTCHAR U_5C7D +ENCODING 23677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +A900 +A900 +AFE0 +A900 +A900 +A900 +F900 +8100 +ENDCHAR +STARTCHAR U_5C7E +ENCODING 23678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +BAA0 +CBE0 +0220 +ENDCHAR +STARTCHAR U_5C7F +ENCODING 23679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +23E0 +AA00 +AA00 +ABE0 +A820 +AFA0 +B820 +C020 +00C0 +ENDCHAR +STARTCHAR U_5C80 +ENCODING 23680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +4040 +0400 +8420 +8420 +8420 +FFE0 +8020 +ENDCHAR +STARTCHAR U_5C81 +ENCODING 23681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +0FC0 +1040 +6880 +0500 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_5C82 +ENCODING 23682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +8880 +FF80 +0000 +FF00 +0100 +FF00 +8000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5C83 +ENCODING 23683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +4440 +7FC0 +0000 +FFC0 +0440 +2440 +C840 +1040 +61C0 +ENDCHAR +STARTCHAR U_5C84 +ENCODING 23684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +AA20 +ABE0 +AA20 +AA20 +ABE0 +AA20 +FA20 +8420 +0860 +ENDCHAR +STARTCHAR U_5C85 +ENCODING 23685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +ABC0 +AA40 +AA40 +AB40 +BC80 +C480 +0940 +1220 +ENDCHAR +STARTCHAR U_5C86 +ENCODING 23686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2380 +A880 +A880 +AFE0 +A880 +A880 +A940 +FA40 +8C20 +0820 +ENDCHAR +STARTCHAR U_5C87 +ENCODING 23687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +8880 +FF80 +0000 +3780 +C480 +8480 +A680 +C500 +0400 +0400 +ENDCHAR +STARTCHAR U_5C88 +ENCODING 23688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2280 +AA80 +AA80 +AFE0 +A880 +A980 +AA80 +FC80 +8A80 +0100 +ENDCHAR +STARTCHAR U_5C89 +ENCODING 23689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +AFE0 +AAA0 +AAA0 +AAA0 +ACA0 +A920 +FA20 +8C20 +00C0 +ENDCHAR +STARTCHAR U_5C8A +ENCODING 23690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8040 +8040 +7FC0 +0800 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_5C8B +ENCODING 23691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +AA40 +AA80 +AAE0 +AA20 +AA40 +FD40 +8480 +0940 +1220 +ENDCHAR +STARTCHAR U_5C8C +ENCODING 23692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8840 +8840 +FFC0 +0000 +FF80 +1100 +1380 +1900 +2600 +4900 +B0C0 +ENDCHAR +STARTCHAR U_5C8D +ENCODING 23693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +AA40 +AA40 +AFE0 +AA40 +AA40 +AA40 +FA40 +8C40 +0840 +ENDCHAR +STARTCHAR U_5C8E +ENCODING 23694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +AA80 +AC40 +A820 +AFC0 +AA40 +BA40 +C240 +0540 +0880 +ENDCHAR +STARTCHAR U_5C8F +ENCODING 23695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +A800 +AFE0 +AA80 +AA80 +AA80 +FA80 +8AA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_5C90 +ENCODING 23696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A900 +A900 +AFC0 +AC40 +AC40 +FA80 +8900 +0280 +0C60 +ENDCHAR +STARTCHAR U_5C91 +ENCODING 23697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0400 +0A00 +3580 +C260 +1F80 +0100 +0200 +0400 +ENDCHAR +STARTCHAR U_5C92 +ENCODING 23698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AC60 +A920 +A880 +A800 +AFE0 +F840 +8840 +0080 +0100 +ENDCHAR +STARTCHAR U_5C93 +ENCODING 23699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +AA00 +AA00 +ABE0 +AA40 +AA40 +FA40 +8A40 +0440 +0840 +ENDCHAR +STARTCHAR U_5C94 +ENCODING 23700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4080 +BF60 +0900 +1100 +6600 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5C95 +ENCODING 23701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0400 +0A00 +3180 +C060 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5C96 +ENCODING 23702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +AB20 +AAA0 +AA40 +AA40 +AAA0 +FB20 +8A00 +0200 +03E0 +ENDCHAR +STARTCHAR U_5C97 +ENCODING 23703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +8880 +FF80 +0000 +FF80 +A280 +9480 +8C80 +9280 +A080 +8180 +ENDCHAR +STARTCHAR U_5C98 +ENCODING 23704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +AAA0 +AAA0 +AAA0 +AAA0 +AAA0 +A880 +F9A0 +8AA0 +0460 +ENDCHAR +STARTCHAR U_5C99 +ENCODING 23705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +0A00 +3580 +C460 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5C9A +ENCODING 23706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +7FC0 +4040 +5140 +4A40 +4440 +4A40 +9120 +ENDCHAR +STARTCHAR U_5C9B +ENCODING 23707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0800 +7F00 +5100 +4900 +4200 +7FC0 +1040 +9240 +9240 +FE40 +0180 +ENDCHAR +STARTCHAR U_5C9C +ENCODING 23708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +8880 +8880 +FF80 +0000 +FF00 +8900 +FF00 +8100 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_5C9D +ENCODING 23709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4440 +4440 +7FC0 +1000 +3FC0 +4800 +8F80 +0800 +0FC0 +0800 +0800 +ENDCHAR +STARTCHAR U_5C9E +ENCODING 23710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2100 +23E0 +AD00 +A900 +A9E0 +A900 +A9E0 +B900 +C900 +0100 +ENDCHAR +STARTCHAR U_5C9F +ENCODING 23711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFC0 +AD40 +AD40 +AD40 +AFE0 +F900 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_5CA0 +ENCODING 23712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +AA00 +ABC0 +AA40 +AA40 +ABC0 +FA40 +8A00 +0200 +03E0 +ENDCHAR +STARTCHAR U_5CA1 +ENCODING 23713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +9120 +8A20 +FFE0 +8420 +A4A0 +A4A0 +BFA0 +8020 +80E0 +ENDCHAR +STARTCHAR U_5CA2 +ENCODING 23714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4220 +7FE0 +0000 +FFE0 +0080 +3C80 +2480 +3C80 +0080 +0180 +ENDCHAR +STARTCHAR U_5CA3 +ENCODING 23715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +ABE0 +AC20 +ABA0 +AAA0 +AAA0 +ABA0 +F820 +8820 +00C0 +ENDCHAR +STARTCHAR U_5CA4 +ENCODING 23716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +AFE0 +A820 +AA80 +AA80 +AA80 +AA40 +FC40 +8420 +0820 +ENDCHAR +STARTCHAR U_5CA5 +ENCODING 23717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +AAA0 +AA80 +ABE0 +AA40 +AA40 +FB40 +8A80 +0540 +0A20 +ENDCHAR +STARTCHAR U_5CA6 +ENCODING 23718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +0400 +7FC0 +0000 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_5CA7 +ENCODING 23719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4440 +7FC0 +0000 +FFC0 +0840 +3280 +C100 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5CA8 +ENCODING 23720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +AA40 +ABC0 +AA40 +AA40 +ABC0 +FA40 +8A40 +0240 +0FE0 +ENDCHAR +STARTCHAR U_5CA9 +ENCODING 23721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8840 +8840 +FFC0 +0000 +FFC0 +1000 +3F80 +6080 +A080 +3F80 +2080 +ENDCHAR +STARTCHAR U_5CAA +ENCODING 23722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +FFC0 +1200 +FFC0 +1240 +FFC0 +9200 +FFC0 +1240 +2240 +C280 +ENDCHAR +STARTCHAR U_5CAB +ENCODING 23723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +ABE0 +AAA0 +AAA0 +ABE0 +AAA0 +AAA0 +FAA0 +8BE0 +0220 +ENDCHAR +STARTCHAR U_5CAC +ENCODING 23724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +AAA0 +ABE0 +AAA0 +AAA0 +ABE0 +FAA0 +8880 +0080 +0080 +ENDCHAR +STARTCHAR U_5CAD +ENCODING 23725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +AA40 +AD20 +A880 +A800 +AFE0 +B840 +EB80 +0080 +0040 +ENDCHAR +STARTCHAR U_5CAE +ENCODING 23726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +AFE0 +AC20 +A900 +A920 +A940 +A980 +F920 +8920 +00E0 +ENDCHAR +STARTCHAR U_5CAF +ENCODING 23727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +A900 +A900 +AB40 +AD20 +A920 +F900 +8900 +0000 +0FE0 +ENDCHAR +STARTCHAR U_5CB0 +ENCODING 23728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +ADE0 +AAA0 +AEA0 +AAA0 +ACA0 +FAA0 +8FA0 +0120 +0240 +ENDCHAR +STARTCHAR U_5CB1 +ENCODING 23729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2440 +3FE0 +6200 +A120 +24E0 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5CB2 +ENCODING 23730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +2220 +2220 +AA20 +ABE0 +A940 +A940 +A940 +B940 +CA40 +0460 +ENDCHAR +STARTCHAR U_5CB3 +ENCODING 23731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +3FC0 +2200 +2200 +FFE0 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5CB4 +ENCODING 23732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +2200 +2200 +AA00 +ABE0 +AA40 +AA40 +AA40 +BA40 +CA40 +07E0 +ENDCHAR +STARTCHAR U_5CB5 +ENCODING 23733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +ABE0 +A880 +A880 +ABE0 +AA20 +AA20 +FA20 +8BE0 +0220 +ENDCHAR +STARTCHAR U_5CB6 +ENCODING 23734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2100 +ABE0 +AA20 +AA20 +ABE0 +AA20 +AA20 +FA20 +8BE0 +0220 +ENDCHAR +STARTCHAR U_5CB7 +ENCODING 23735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +AA20 +ABE0 +AA80 +AA80 +ABE0 +AA80 +FAA0 +8B60 +0620 +ENDCHAR +STARTCHAR U_5CB8 +ENCODING 23736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +7FE0 +4000 +5FC0 +4200 +7FE0 +4200 +8200 +ENDCHAR +STARTCHAR U_5CB9 +ENCODING 23737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +2120 +2120 +A920 +AA60 +A800 +ABE0 +AA20 +BA20 +CBE0 +0220 +ENDCHAR +STARTCHAR U_5CBA +ENCODING 23738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +0A00 +3580 +C460 +1F00 +0100 +0A00 +0400 +ENDCHAR +STARTCHAR U_5CBB +ENCODING 23739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +2380 +2280 +AA80 +ABE0 +AA80 +AA80 +AA80 +AA40 +FB40 +02A0 +ENDCHAR +STARTCHAR U_5CBC +ENCODING 23740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +2100 +2120 +AD40 +AB80 +AFE0 +A900 +A900 +B900 +C900 +0100 +ENDCHAR +STARTCHAR U_5CBD +ENCODING 23741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +7FE0 +1200 +7FC0 +0200 +1280 +2A40 +C420 +ENDCHAR +STARTCHAR U_5CBE +ENCODING 23742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +2080 +2080 +A8E0 +A880 +A880 +ABE0 +AA20 +BA20 +CA20 +03E0 +ENDCHAR +STARTCHAR U_5CBF +ENCODING 23743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +4FE0 +4820 +4820 +4BE0 +4820 +3020 +C7E0 +ENDCHAR +STARTCHAR U_5CC0 +ENCODING 23744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +8880 +FF80 +0800 +FF80 +8880 +8880 +FF80 +8880 +8880 +FF80 +ENDCHAR +STARTCHAR U_5CC1 +ENCODING 23745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +8440 +FFC0 +0800 +73C0 +4240 +4A40 +5A40 +EAC0 +1200 +E200 +ENDCHAR +STARTCHAR U_5CC2 +ENCODING 23746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +23C0 +2440 +AA80 +A900 +AA80 +AC60 +AB00 +B880 +CA00 +0180 +ENDCHAR +STARTCHAR U_5CC3 +ENCODING 23747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +24C0 +1500 +FFE0 +8020 +0400 +4440 +4440 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5CC4 +ENCODING 23748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +AA80 +A900 +AEE0 +A900 +AFC0 +F900 +8FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_5CC5 +ENCODING 23749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2100 +2240 +AFE0 +AA40 +AA40 +AFE0 +AA40 +BA40 +CC40 +0840 +ENDCHAR +STARTCHAR U_5CC6 +ENCODING 23750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AC40 +A820 +ABC0 +A800 +ABC0 +FA40 +8A40 +03C0 +0240 +ENDCHAR +STARTCHAR U_5CC7 +ENCODING 23751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +0A00 +1100 +2080 +5F40 +8020 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5CC8 +ENCODING 23752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AE40 +A980 +AA40 +AC20 +ABE0 +FA20 +8A20 +03E0 +0220 +ENDCHAR +STARTCHAR U_5CC9 +ENCODING 23753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1000 +3F80 +5100 +8E00 +3180 +DF60 +1100 +1100 +1F00 +ENDCHAR +STARTCHAR U_5CCA +ENCODING 23754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4000 +7F80 +4080 +7F80 +8440 +8440 +FFC0 +ENDCHAR +STARTCHAR U_5CCB +ENCODING 23755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AC20 +ABA0 +AAA0 +ABA0 +AAA0 +FBA0 +8AA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5CCC +ENCODING 23756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A900 +AA40 +AFA0 +A900 +A900 +FFC0 +8900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5CCD +ENCODING 23757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27C0 +2140 +AFE0 +A940 +AFC0 +A900 +AFC0 +B900 +CFE0 +0100 +ENDCHAR +STARTCHAR U_5CCE +ENCODING 23758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +FFC0 +0000 +7F80 +4080 +7F80 +4080 +7FC0 +4480 +5B00 +61C0 +ENDCHAR +STARTCHAR U_5CCF +ENCODING 23759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +AA00 +AFE0 +AAA0 +AAA0 +AAA0 +FAA0 +8AA0 +0A20 +0860 +ENDCHAR +STARTCHAR U_5CD0 +ENCODING 23760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A880 +A920 +ABC0 +A880 +A920 +FA40 +8880 +0140 +0620 +ENDCHAR +STARTCHAR U_5CD1 +ENCODING 23761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +1B00 +E0E0 +1F00 +0400 +3F80 +0400 +7FC0 +ENDCHAR +STARTCHAR U_5CD2 +ENCODING 23762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +ABA0 +A820 +ABA0 +AAA0 +AAA0 +FBA0 +8AA0 +0820 +0860 +ENDCHAR +STARTCHAR U_5CD3 +ENCODING 23763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A900 +AFC0 +A940 +AFC0 +A900 +FFE0 +8AA0 +0440 +0820 +ENDCHAR +STARTCHAR U_5CD4 +ENCODING 23764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2120 +AFA0 +A940 +AFE0 +A900 +AA40 +FE80 +8B20 +0220 +01E0 +ENDCHAR +STARTCHAR U_5CD5 +ENCODING 23765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0000 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_5CD6 +ENCODING 23766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +AD20 +A900 +AFE0 +A940 +AA40 +FA40 +8980 +0340 +0C20 +ENDCHAR +STARTCHAR U_5CD7 +ENCODING 23767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +AC80 +AFE0 +AC00 +ADE0 +AD20 +FD60 +8500 +0920 +10E0 +ENDCHAR +STARTCHAR U_5CD8 +ENCODING 23768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +ABC0 +AA40 +AA40 +ABC0 +AA40 +FBC0 +8A40 +0000 +07E0 +ENDCHAR +STARTCHAR U_5CD9 +ENCODING 23769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +A900 +AFE0 +A840 +AFE0 +AA40 +F940 +8840 +01C0 +ENDCHAR +STARTCHAR U_5CDA +ENCODING 23770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +0400 +FFE0 +1100 +2480 +DF60 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5CDB +ENCODING 23771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8840 +FFC0 +0000 +FC40 +2140 +3D40 +4940 +A940 +1140 +2040 +C0C0 +ENDCHAR +STARTCHAR U_5CDC +ENCODING 23772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +0A00 +3580 +C460 +1700 +1400 +1400 +FFE0 +ENDCHAR +STARTCHAR U_5CDD +ENCODING 23773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +FF80 +0000 +FF80 +8080 +BE80 +8080 +BE80 +A280 +BE80 +8180 +ENDCHAR +STARTCHAR U_5CDE +ENCODING 23774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1000 +1F00 +2200 +7FE0 +2000 +2F80 +48A0 +4920 +87E0 +ENDCHAR +STARTCHAR U_5CDF +ENCODING 23775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +FFE0 +1000 +3F80 +5080 +9F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5CE0 +ENCODING 23776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +21C0 +2100 +AFE0 +A800 +AFE0 +A900 +A980 +B940 +C920 +0100 +ENDCHAR +STARTCHAR U_5CE1 +ENCODING 23777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +AD20 +AB40 +A900 +AFE0 +F900 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_5CE2 +ENCODING 23778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07A0 +2220 +23A0 +AAA0 +ACE0 +AB60 +A960 +A920 +BA20 +CAA0 +0440 +ENDCHAR +STARTCHAR U_5CE3 +ENCODING 23779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27C0 +2120 +A8C0 +A980 +AA60 +AFE0 +AA80 +BA80 +CAA0 +04E0 +ENDCHAR +STARTCHAR U_5CE4 +ENCODING 23780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +A900 +AFE0 +AA80 +AC60 +AA40 +FA40 +8A40 +0440 +0840 +ENDCHAR +STARTCHAR U_5CE5 +ENCODING 23781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +AC80 +AFC0 +A960 +AFC0 +A940 +FFC0 +9100 +0500 +0200 +ENDCHAR +STARTCHAR U_5CE6 +ENCODING 23782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +4920 +8920 +0400 +2480 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_5CE7 +ENCODING 23783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2100 +27E0 +AA40 +AC20 +AA40 +AA40 +AA40 +B980 +C980 +0660 +ENDCHAR +STARTCHAR U_5CE8 +ENCODING 23784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +26A0 +AA80 +AFE0 +AA80 +AB80 +AEA0 +FAC0 +8AA0 +0360 +0620 +ENDCHAR +STARTCHAR U_5CE9 +ENCODING 23785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0200 +7A40 +1240 +FFE0 +1280 +3900 +D2A0 +3460 +ENDCHAR +STARTCHAR U_5CEA +ENCODING 23786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2420 +A980 +AA40 +AC20 +A800 +ABC0 +FA40 +8A40 +03C0 +0240 +ENDCHAR +STARTCHAR U_5CEB +ENCODING 23787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +22A0 +2AA0 +BEA0 +B2C0 +B2C0 +B6A0 +B6A0 +BAE0 +CA80 +1680 +ENDCHAR +STARTCHAR U_5CEC +ENCODING 23788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +A880 +ABE0 +AAA0 +ABE0 +AAA0 +FBE0 +8AA0 +0260 +ENDCHAR +STARTCHAR U_5CED +ENCODING 23789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +21C0 +A880 +ABE0 +AA20 +ABE0 +AA20 +AA20 +FBE0 +8A20 +0260 +ENDCHAR +STARTCHAR U_5CEE +ENCODING 23790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +AFE0 +A940 +AFC0 +AA00 +ABC0 +FA40 +8E40 +0BC0 +0240 +ENDCHAR +STARTCHAR U_5CEF +ENCODING 23791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +1F80 +7100 +0E00 +F5E0 +0E00 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_5CF0 +ENCODING 23792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AE40 +A980 +AA40 +AFE0 +A900 +BFC0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_5CF1 +ENCODING 23793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2240 +6240 +97C0 +3240 +5FE0 +9000 +1100 +1520 +5520 +27E0 +ENDCHAR +STARTCHAR U_5CF2 +ENCODING 23794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0800 +7140 +1140 +FD40 +3940 +5540 +9240 +10C0 +ENDCHAR +STARTCHAR U_5CF3 +ENCODING 23795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +8880 +FF80 +2200 +27C0 +5480 +DA80 +5280 +5100 +4280 +4C40 +ENDCHAR +STARTCHAR U_5CF4 +ENCODING 23796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +AC40 +AFC0 +AC40 +AFC0 +FA80 +92A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_5CF5 +ENCODING 23797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +27E0 +2520 +A900 +AFE0 +A900 +AA40 +AA80 +BD40 +CA20 +03E0 +ENDCHAR +STARTCHAR U_5CF6 +ENCODING 23798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7FC0 +4000 +7FC0 +9240 +FE40 +8380 +ENDCHAR +STARTCHAR U_5CF7 +ENCODING 23799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +7FC0 +2100 +1200 +FFE0 +0400 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_5CF8 +ENCODING 23800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +A880 +A880 +AEA0 +AAA0 +FAC0 +8EA0 +0960 +1220 +ENDCHAR +STARTCHAR U_5CF9 +ENCODING 23801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3180 +DF60 +0400 +FFE0 +2480 +CC60 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_5CFA +ENCODING 23802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +2080 +23E0 +AAA0 +ABE0 +AAA0 +ABE0 +AC80 +BA80 +C900 +0EE0 +ENDCHAR +STARTCHAR U_5CFB +ENCODING 23803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +AFA0 +AA40 +AC20 +ABE0 +AE40 +FA40 +8980 +0240 +0C20 +ENDCHAR +STARTCHAR U_5CFC +ENCODING 23804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +23E0 +2480 +A880 +AFE0 +A800 +ABE0 +AA20 +BA20 +CBE0 +0220 +ENDCHAR +STARTCHAR U_5CFD +ENCODING 23805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +A900 +AD40 +AD40 +ABA0 +B900 +CA80 +0440 +1820 +ENDCHAR +STARTCHAR U_5CFE +ENCODING 23806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8800 +5FE0 +2880 +C880 +5080 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5CFF +ENCODING 23807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +AFC0 +A940 +A940 +AFE0 +A800 +FBE0 +8A20 +03E0 +0220 +ENDCHAR +STARTCHAR U_5D00 +ENCODING 23808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +8880 +FF80 +0800 +7F00 +4100 +7F00 +4100 +7F00 +4500 +73C0 +ENDCHAR +STARTCHAR U_5D01 +ENCODING 23809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0040 +2400 +27E0 +F520 +2940 +2100 +3A80 +E440 +0820 +ENDCHAR +STARTCHAR U_5D02 +ENCODING 23810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +AFE0 +AD20 +A900 +AFE0 +A920 +F920 +8A20 +04C0 +ENDCHAR +STARTCHAR U_5D03 +ENCODING 23811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AD40 +AB80 +A900 +AFE0 +A900 +FB80 +8540 +0920 +0100 +ENDCHAR +STARTCHAR U_5D04 +ENCODING 23812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +22C0 +AC20 +ABC0 +A800 +A920 +ACA0 +FA40 +0080 +0FE0 +ENDCHAR +STARTCHAR U_5D05 +ENCODING 23813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +21E0 +AA40 +AFE0 +AAA0 +ABE0 +AAA0 +BBE0 +C2A0 +02A0 +0460 +ENDCHAR +STARTCHAR U_5D06 +ENCODING 23814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +AA80 +AC40 +A820 +AFC0 +A900 +F900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_5D07 +ENCODING 23815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +FFE0 +8020 +3F80 +0000 +FFE0 +2480 +5440 +8820 +ENDCHAR +STARTCHAR U_5D08 +ENCODING 23816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +0000 +FFE0 +2480 +4C40 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D09 +ENCODING 23817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AFA0 +A9C0 +AAA0 +AC80 +ABE0 +BA20 +C3E0 +0220 +03E0 +ENDCHAR +STARTCHAR U_5D0A +ENCODING 23818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +2FE0 +AA40 +AA40 +AB40 +AEC0 +BB60 +CA40 +0240 +0240 +ENDCHAR +STARTCHAR U_5D0B +ENCODING 23819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FC0 +2480 +FFE0 +2480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_5D0C +ENCODING 23820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +ABE0 +AA80 +ABE0 +AA80 +AA80 +FBE0 +8620 +0BE0 +0220 +ENDCHAR +STARTCHAR U_5D0D +ENCODING 23821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A900 +AB40 +AB40 +ADA0 +A900 +FB80 +8D40 +0920 +0100 +ENDCHAR +STARTCHAR U_5D0E +ENCODING 23822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AA80 +AC40 +AFE0 +A840 +AF40 +FD40 +8F40 +0040 +00C0 +ENDCHAR +STARTCHAR U_5D0F +ENCODING 23823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2280 +ABE0 +AA80 +AB60 +A800 +ABE0 +BA20 +C3E0 +0220 +03E0 +ENDCHAR +STARTCHAR U_5D10 +ENCODING 23824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +ABE0 +AA20 +ABE0 +A800 +AAA0 +BBC0 +C280 +02A0 +0360 +ENDCHAR +STARTCHAR U_5D11 +ENCODING 23825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +FF80 +4100 +7F00 +4100 +7F00 +8400 +F780 +8400 +B440 +C3C0 +ENDCHAR +STARTCHAR U_5D12 +ENCODING 23826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +8880 +FF80 +0800 +FFC0 +2200 +5500 +8880 +FFC0 +0800 +0800 +ENDCHAR +STARTCHAR U_5D13 +ENCODING 23827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A920 +AFE0 +A920 +ABA0 +AAA0 +ABA0 +B820 +CFE0 +0820 +ENDCHAR +STARTCHAR U_5D14 +ENCODING 23828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +1200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_5D15 +ENCODING 23829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2280 +ABE0 +AA80 +ABE0 +AA00 +AA80 +BBE0 +CA80 +0480 +0BE0 +ENDCHAR +STARTCHAR U_5D16 +ENCODING 23830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2220 +3FE0 +2200 +2F80 +2200 +3FE0 +2200 +2FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_5D17 +ENCODING 23831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +8440 +FFC0 +0000 +FFC0 +9240 +FFC0 +A540 +A540 +BF40 +80C0 +ENDCHAR +STARTCHAR U_5D18 +ENCODING 23832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2460 +AB80 +A800 +AFE0 +AAA0 +AAA0 +FFE0 +8AA0 +0A60 +ENDCHAR +STARTCHAR U_5D19 +ENCODING 23833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +1B00 +EEE0 +0000 +7FC0 +4A40 +7FC0 +4A40 +40C0 +ENDCHAR +STARTCHAR U_5D1A +ENCODING 23834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +AFE0 +AA40 +AB20 +ADC0 +FB40 +8C80 +0140 +0620 +ENDCHAR +STARTCHAR U_5D1B +ENCODING 23835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +AFE0 +A880 +AAA0 +AAA0 +ABE0 +F880 +8AA0 +0AA0 +13E0 +ENDCHAR +STARTCHAR U_5D1C +ENCODING 23836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2080 +AFE0 +AAA0 +AAA0 +AFE0 +BAA0 +CFE0 +0080 +07E0 +ENDCHAR +STARTCHAR U_5D1D +ENCODING 23837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A880 +ABC0 +A880 +AFE0 +AA20 +BBE0 +CA20 +03E0 +0220 +ENDCHAR +STARTCHAR U_5D1E +ENCODING 23838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AA40 +ABC0 +A800 +AFE0 +A880 +FFE0 +8900 +0100 +0300 +ENDCHAR +STARTCHAR U_5D1F +ENCODING 23839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +0A00 +3180 +DF60 +0400 +7FC0 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_5D20 +ENCODING 23840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A880 +ABE0 +AAA0 +ABE0 +AAA0 +FBE0 +89C0 +02A0 +04A0 +ENDCHAR +STARTCHAR U_5D21 +ENCODING 23841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2080 +A920 +AD60 +ABA0 +AD60 +A920 +FB20 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5D22 +ENCODING 23842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2520 +AA40 +AFC0 +A940 +AFE0 +A940 +FFC0 +8900 +0100 +0300 +ENDCHAR +STARTCHAR U_5D23 +ENCODING 23843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0300 +1C00 +FFE0 +2480 +4840 +FFE0 +1100 +0E00 +79E0 +ENDCHAR +STARTCHAR U_5D24 +ENCODING 23844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +AE60 +A900 +AFE0 +AA20 +AFE0 +FA20 +8BE0 +0220 +0260 +ENDCHAR +STARTCHAR U_5D25 +ENCODING 23845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AAA0 +ABE0 +AAA0 +ABE0 +A9A0 +FA80 +8FE0 +0080 +0080 +ENDCHAR +STARTCHAR U_5D26 +ENCODING 23846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +AD40 +AFE0 +AD40 +AFC0 +FD40 +8FC0 +0120 +00E0 +ENDCHAR +STARTCHAR U_5D27 +ENCODING 23847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1000 +1280 +FA80 +1440 +3920 +5500 +9240 +17E0 +1020 +ENDCHAR +STARTCHAR U_5D28 +ENCODING 23848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A940 +AFE0 +A940 +AFC0 +A900 +FDE0 +8500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_5D29 +ENCODING 23849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3FE0 +0000 +3DE0 +2520 +3DE0 +2520 +3DE0 +2520 +4520 +8E60 +ENDCHAR +STARTCHAR U_5D2A +ENCODING 23850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2240 +AA40 +ADA0 +A880 +A880 +AFE0 +F880 +0080 +0080 +ENDCHAR +STARTCHAR U_5D2B +ENCODING 23851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +7FC0 +4040 +7FC0 +5280 +5F80 +A220 +BFE0 +ENDCHAR +STARTCHAR U_5D2C +ENCODING 23852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +FFE0 +2480 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_5D2D +ENCODING 23853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2020 +FDC0 +2100 +51E0 +FD40 +1140 +1D40 +F240 +1440 +ENDCHAR +STARTCHAR U_5D2E +ENCODING 23854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +8440 +FFC0 +0000 +FFC0 +8840 +FF40 +A240 +BE40 +8040 +FFC0 +ENDCHAR +STARTCHAR U_5D2F +ENCODING 23855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +ABA0 +A900 +A900 +AFE0 +A900 +FD20 +0340 +0FE0 +ENDCHAR +STARTCHAR U_5D30 +ENCODING 23856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +AAA0 +A940 +ABE0 +AAA0 +AAA0 +FBE0 +8AA0 +03E0 +0220 +ENDCHAR +STARTCHAR U_5D31 +ENCODING 23857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +0000 +7C20 +4520 +7D20 +4520 +7D20 +4520 +7C20 +C6E0 +ENDCHAR +STARTCHAR U_5D32 +ENCODING 23858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AA20 +ABE0 +AA20 +AFE0 +A880 +ABE0 +F880 +0080 +07E0 +ENDCHAR +STARTCHAR U_5D33 +ENCODING 23859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +ABA0 +A800 +AE20 +AAA0 +AEA0 +FAA0 +8EA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_5D34 +ENCODING 23860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +0140 +7FE0 +4100 +7F40 +4940 +7F40 +54A0 +4960 +B620 +ENDCHAR +STARTCHAR U_5D35 +ENCODING 23861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +ABC0 +AA40 +AFE0 +AA00 +AFE0 +FAA0 +8CA0 +0120 +06C0 +ENDCHAR +STARTCHAR U_5D36 +ENCODING 23862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +FFC0 +1040 +7C40 +13E0 +FC40 +1240 +7D40 +1040 +1D40 +F080 +ENDCHAR +STARTCHAR U_5D37 +ENCODING 23863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +AA80 +AFE0 +AAA0 +ACE0 +F820 +8FE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_5D38 +ENCODING 23864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +ABE0 +AA20 +ABE0 +AA20 +ABE0 +FA20 +8BE0 +0140 +0620 +ENDCHAR +STARTCHAR U_5D39 +ENCODING 23865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +AFE0 +A920 +AFC0 +AD40 +FD40 +8540 +05C0 +0100 +ENDCHAR +STARTCHAR U_5D3A +ENCODING 23866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2200 +FBE0 +2480 +3AE0 +2BA0 +2EA0 +2A80 +4A20 +B1E0 +ENDCHAR +STARTCHAR U_5D3B +ENCODING 23867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +25E0 +AA80 +ADE0 +AA40 +ABE0 +AA40 +FBC0 +0240 +02C0 +ENDCHAR +STARTCHAR U_5D3C +ENCODING 23868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +ABC0 +AA40 +ABC0 +A800 +AFE0 +FA80 +8AE0 +0580 +08E0 +ENDCHAR +STARTCHAR U_5D3D +ENCODING 23869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +3F80 +2480 +3F80 +2480 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_5D3E +ENCODING 23870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2280 +AFE0 +AAA0 +AFE0 +A900 +AFE0 +FA40 +8380 +0140 +0620 +ENDCHAR +STARTCHAR U_5D3F +ENCODING 23871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +A800 +ABE0 +A800 +AFE0 +F900 +8BE0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5D40 +ENCODING 23872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2100 +2100 +FFE0 +2100 +7100 +AFC0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5D41 +ENCODING 23873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +AA40 +ABC0 +AA40 +ABC0 +AA40 +FFE0 +8940 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_5D42 +ENCODING 23874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0200 +2FC0 +4260 +9FC0 +2240 +6FE0 +A200 +3FE0 +2200 +ENDCHAR +STARTCHAR U_5D43 +ENCODING 23875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A280 +AFE0 +A880 +A900 +AE40 +F8A0 +8B40 +1080 +2700 +ENDCHAR +STARTCHAR U_5D44 +ENCODING 23876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2100 +AFC0 +A900 +AFC0 +A900 +BFE0 +E900 +0280 +0C60 +ENDCHAR +STARTCHAR U_5D45 +ENCODING 23877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0140 +7FE0 +4100 +5D20 +4140 +5D80 +54A0 +9D60 +8220 +ENDCHAR +STARTCHAR U_5D46 +ENCODING 23878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +2140 +F7E0 +2100 +7280 +A4A0 +A8E0 +2400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D47 +ENCODING 23879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +E120 +2FE0 +F280 +22A0 +34E0 +6900 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_5D48 +ENCODING 23880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +A240 +AFE0 +A900 +AFE0 +AA00 +FBE0 +0520 +18C0 +0320 +ENDCHAR +STARTCHAR U_5D49 +ENCODING 23881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A800 +ABC0 +AA40 +AFE0 +AC20 +FBC0 +8880 +0280 +0100 +ENDCHAR +STARTCHAR U_5D4A +ENCODING 23882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A900 +AFE0 +A940 +AF60 +A940 +FF60 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5D4B +ENCODING 23883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +AA00 +ABE0 +AB20 +ABE0 +FD20 +85E0 +0920 +11E0 +ENDCHAR +STARTCHAR U_5D4C +ENCODING 23884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0100 +4900 +FFE0 +4AA0 +7880 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_5D4D +ENCODING 23885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +29E0 +1140 +FE40 +3540 +5080 +9140 +3620 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D4E +ENCODING 23886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +ABE0 +AAA0 +ABE0 +A880 +ABE0 +FAA0 +8BE0 +0220 +0260 +ENDCHAR +STARTCHAR U_5D4F +ENCODING 23887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0A00 +2480 +2A80 +3F80 +5040 +9FA0 +2900 +4600 +1980 +ENDCHAR +STARTCHAR U_5D50 +ENCODING 23888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +4140 +5E40 +4440 +5F40 +5540 +5F40 +4560 +BEA0 +ENDCHAR +STARTCHAR U_5D51 +ENCODING 23889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +ABC0 +AA40 +ABC0 +A900 +ABE0 +FEA0 +8B60 +03A0 +0040 +ENDCHAR +STARTCHAR U_5D52 +ENCODING 23890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +3F00 +0000 +F3C0 +9240 +F3C0 +0400 +8440 +8440 +FFC0 +ENDCHAR +STARTCHAR U_5D53 +ENCODING 23891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +3F80 +2080 +3F80 +0000 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_5D54 +ENCODING 23892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +3F80 +2480 +2E80 +2480 +FFE0 +4480 +5300 +60E0 +ENDCHAR +STARTCHAR U_5D55 +ENCODING 23893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +25A0 +AE60 +AC20 +ABE0 +AD40 +AA20 +FFE0 +8A40 +0180 +0660 +ENDCHAR +STARTCHAR U_5D56 +ENCODING 23894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A980 +AAC0 +ACA0 +ABC0 +AA40 +BBC0 +EA40 +03C0 +0FE0 +ENDCHAR +STARTCHAR U_5D57 +ENCODING 23895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0100 +7FE0 +4100 +7F00 +4920 +5D40 +6880 +CD40 +3020 +ENDCHAR +STARTCHAR U_5D58 +ENCODING 23896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +A940 +AFE0 +AC20 +A880 +AFE0 +F880 +89C0 +02A0 +04A0 +ENDCHAR +STARTCHAR U_5D59 +ENCODING 23897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +0800 +7240 +1140 +FE40 +1140 +3860 +57C0 +9040 +1040 +ENDCHAR +STARTCHAR U_5D5A +ENCODING 23898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +4200 +7BE0 +8520 +7900 +2100 +7900 +2280 +2A40 +3420 +ENDCHAR +STARTCHAR U_5D5B +ENCODING 23899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0C00 +3300 +CEE0 +7C40 +4540 +7D40 +4540 +7C40 +44C0 +ENDCHAR +STARTCHAR U_5D5C +ENCODING 23900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0400 +7FC0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +0180 +ENDCHAR +STARTCHAR U_5D5D +ENCODING 23901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +AFE0 +A980 +AB40 +AD20 +AFE0 +FA40 +8A80 +0140 +0620 +ENDCHAR +STARTCHAR U_5D5E +ENCODING 23902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +0400 +FFC0 +2480 +4C40 +2080 +AAA0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_5D5F +ENCODING 23903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +7FE0 +4A00 +57C0 +7100 +57C0 +5100 +9100 +9FE0 +ENDCHAR +STARTCHAR U_5D60 +ENCODING 23904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +A940 +AA40 +AF80 +A920 +AFE0 +F900 +07E0 +0140 +0620 +ENDCHAR +STARTCHAR U_5D61 +ENCODING 23905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +2880 +DF60 +0100 +7BC0 +8C40 +5AC0 +2940 +4A40 +ENDCHAR +STARTCHAR U_5D62 +ENCODING 23906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +ACA0 +ABC0 +AA40 +ABC0 +AA40 +FBE0 +8620 +0BE0 +1220 +ENDCHAR +STARTCHAR U_5D63 +ENCODING 23907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +A8A0 +AFE0 +A8A0 +AFE0 +A880 +FBE0 +8A20 +0BE0 +1220 +ENDCHAR +STARTCHAR U_5D64 +ENCODING 23908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AAA0 +71C0 +2080 +5140 +8A20 +FFE0 +8420 +2480 +2480 +3F80 +ENDCHAR +STARTCHAR U_5D65 +ENCODING 23909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +25E0 +AB40 +A9E0 +AA40 +AC40 +AFE0 +F900 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5D66 +ENCODING 23910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +A7E0 +A800 +AFE0 +A800 +ABE0 +AA20 +FBE0 +0140 +07E0 +ENDCHAR +STARTCHAR U_5D67 +ENCODING 23911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +28A0 +AAA0 +AEA0 +A920 +AFE0 +A920 +FFE0 +8920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_5D68 +ENCODING 23912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +AA20 +ABE0 +AA00 +ABE0 +AA00 +FBE0 +0520 +0AA0 +0AE0 +ENDCHAR +STARTCHAR U_5D69 +ENCODING 23913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8440 +FFC0 +0400 +FFC0 +2100 +3F00 +0000 +FFC0 +9240 +9E40 +80C0 +ENDCHAR +STARTCHAR U_5D6A +ENCODING 23914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2000 +ABC0 +AA40 +AFE0 +A820 +BBA0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_5D6B +ENCODING 23915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +AA40 +AC80 +AFE0 +AA40 +FA40 +8C80 +05A0 +07E0 +ENDCHAR +STARTCHAR U_5D6C +ENCODING 23916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +7FC0 +4440 +7FC0 +4440 +7FC0 +1480 +2540 +C3E0 +ENDCHAR +STARTCHAR U_5D6D +ENCODING 23917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +A980 +AFE0 +AD40 +BBE0 +E900 +89C0 +0240 +0480 +ENDCHAR +STARTCHAR U_5D6E +ENCODING 23918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +ABC0 +AA40 +ABC0 +AA40 +FBC0 +0A40 +07E0 +0240 +ENDCHAR +STARTCHAR U_5D6F +ENCODING 23919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +A900 +ABC0 +A900 +AFE0 +AA00 +FBC0 +8C80 +0880 +17E0 +ENDCHAR +STARTCHAR U_5D70 +ENCODING 23920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2280 +A7E0 +AAA0 +AFE0 +AAA0 +BFE0 +EA80 +86C0 +0AA0 +ENDCHAR +STARTCHAR U_5D71 +ENCODING 23921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +AC20 +AA40 +ADA0 +AA40 +AC20 +FBC0 +8A40 +0240 +03C0 +ENDCHAR +STARTCHAR U_5D72 +ENCODING 23922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AA20 +ABE0 +AA20 +ABE0 +A900 +FFE0 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5D73 +ENCODING 23923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +1080 +7FC0 +0400 +FFE0 +0800 +1780 +2200 +CFE0 +ENDCHAR +STARTCHAR U_5D74 +ENCODING 23924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2380 +A940 +AE80 +AA40 +AFE0 +AA40 +ABC0 +FA40 +03C0 +0240 +ENDCHAR +STARTCHAR U_5D75 +ENCODING 23925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0100 +F7E0 +9100 +FFE0 +9080 +9FE0 +F480 +9280 +0180 +ENDCHAR +STARTCHAR U_5D76 +ENCODING 23926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2120 +2360 +AA40 +AB60 +ADA0 +AB60 +A920 +FB60 +05A0 +0360 +ENDCHAR +STARTCHAR U_5D77 +ENCODING 23927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2940 +A2A0 +AAA0 +AC80 +A880 +AAE0 +FA80 +8A80 +0B80 +0CE0 +ENDCHAR +STARTCHAR U_5D78 +ENCODING 23928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +2480 +4480 +AB40 +4220 +D200 +5BC0 +5600 +61E0 +ENDCHAR +STARTCHAR U_5D79 +ENCODING 23929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0440 +F7C0 +1100 +F7C0 +8540 +F540 +17C0 +1140 +6FA0 +ENDCHAR +STARTCHAR U_5D7A +ENCODING 23930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +AB60 +ADA0 +A880 +AB40 +ACA0 +FB40 +89A0 +0040 +0780 +ENDCHAR +STARTCHAR U_5D7B +ENCODING 23931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +AA80 +ABE0 +AAA0 +ABE0 +AAA0 +F5E0 +06A0 +0880 +02A0 +ENDCHAR +STARTCHAR U_5D7C +ENCODING 23932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +A940 +AFE0 +A880 +AA80 +ABE0 +FC80 +89E0 +0880 +13E0 +ENDCHAR +STARTCHAR U_5D7D +ENCODING 23933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A540 +A760 +A800 +AFE0 +A920 +AFC0 +F940 +89C0 +0100 +ENDCHAR +STARTCHAR U_5D7E +ENCODING 23934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1100 +7F80 +1080 +7DE0 +1B00 +ECE0 +3680 +0900 +7E00 +ENDCHAR +STARTCHAR U_5D7F +ENCODING 23935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0100 +F7C0 +2440 +27C0 +2440 +27C0 +2440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_5D80 +ENCODING 23936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27E0 +AD20 +ABA0 +AD40 +AFE0 +FA00 +8FE0 +0020 +00C0 +ENDCHAR +STARTCHAR U_5D81 +ENCODING 23937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A540 +AFE0 +AD40 +AFE0 +A920 +F7E0 +8480 +0380 +1C60 +ENDCHAR +STARTCHAR U_5D82 +ENCODING 23938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2280 +AFE0 +AA40 +ABC0 +AA40 +ABC0 +F900 +8FE0 +0100 +ENDCHAR +STARTCHAR U_5D83 +ENCODING 23939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2F80 +AA80 +AFE0 +AAA0 +AFA0 +AAA0 +F7A0 +02A0 +0FA0 +0220 +ENDCHAR +STARTCHAR U_5D84 +ENCODING 23940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1020 +FFC0 +5500 +7DE0 +5540 +7D40 +1140 +FE40 +1440 +ENDCHAR +STARTCHAR U_5D85 +ENCODING 23941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FA40 +2540 +3880 +4B40 +9420 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D86 +ENCODING 23942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2A80 +AFE0 +AAA0 +AFE0 +AAA0 +AFE0 +FC40 +87C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_5D87 +ENCODING 23943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +ABC0 +AA40 +ABC0 +A800 +AEE0 +FAA0 +8EE0 +0800 +0FE0 +ENDCHAR +STARTCHAR U_5D88 +ENCODING 23944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +5100 +57E0 +7A80 +1540 +FFE0 +5440 +5240 +5040 +90C0 +ENDCHAR +STARTCHAR U_5D89 +ENCODING 23945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0500 +E500 +AFE0 +B900 +AFC0 +A900 +EFC0 +A900 +0FE0 +ENDCHAR +STARTCHAR U_5D8A +ENCODING 23946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2280 +2480 +FFE0 +2480 +37E0 +E480 +27E0 +2480 +67E0 +ENDCHAR +STARTCHAR U_5D8B +ENCODING 23947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23C0 +AA40 +ABC0 +AA40 +ABE0 +AA00 +FBE0 +0020 +0AA0 +0060 +ENDCHAR +STARTCHAR U_5D8C +ENCODING 23948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8880 +FF80 +1000 +7F00 +5100 +4900 +7FC0 +4000 +7FC0 +5440 +AAC0 +ENDCHAR +STARTCHAR U_5D8D +ENCODING 23949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +ADA0 +AB60 +ACA0 +A900 +ABE0 +FA20 +8BE0 +0220 +03E0 +ENDCHAR +STARTCHAR U_5D8E +ENCODING 23950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +7C40 +47E0 +7C40 +4140 +7C40 +4A40 +98C0 +ENDCHAR +STARTCHAR U_5D8F +ENCODING 23951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +7FE0 +4000 +5EE0 +4C20 +5EE0 +9280 +9EE0 +ENDCHAR +STARTCHAR U_5D90 +ENCODING 23952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7F80 +0400 +EFE0 +B440 +C380 +AD60 +C900 +8FE0 +8100 +8FE0 +ENDCHAR +STARTCHAR U_5D91 +ENCODING 23953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +AFE0 +AAA0 +ABE0 +AA80 +ADA0 +F2C0 +0580 +02C0 +0DA0 +ENDCHAR +STARTCHAR U_5D92 +ENCODING 23954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +AFE0 +AAA0 +A920 +AFE0 +AA40 +ABC0 +FA40 +83C0 +0240 +ENDCHAR +STARTCHAR U_5D93 +ENCODING 23955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +AD40 +AFE0 +AB40 +AD20 +ABE0 +AAA0 +FBE0 +82A0 +03E0 +ENDCHAR +STARTCHAR U_5D94 +ENCODING 23956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2200 +53E0 +FC20 +2140 +F900 +2900 +B180 +6240 +FC20 +ENDCHAR +STARTCHAR U_5D95 +ENCODING 23957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +AE80 +ABE0 +AA80 +ABE0 +AA80 +ABE0 +FD40 +8AA0 +0AA0 +ENDCHAR +STARTCHAR U_5D96 +ENCODING 23958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +A7E0 +AA40 +ABC0 +A800 +AF60 +F9A0 +0560 +03A0 +0D60 +ENDCHAR +STARTCHAR U_5D97 +ENCODING 23959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2760 +AAC0 +AD40 +A8A0 +AFE0 +AA20 +FFC0 +8A40 +0440 +08C0 +ENDCHAR +STARTCHAR U_5D98 +ENCODING 23960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7F80 +2240 +2FE0 +F240 +2180 +7560 +6FC0 +A480 +2320 +2CE0 +ENDCHAR +STARTCHAR U_5D99 +ENCODING 23961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +AFE0 +A940 +AB20 +AC40 +AFE0 +F940 +8DE0 +0240 +0C40 +ENDCHAR +STARTCHAR U_5D9A +ENCODING 23962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +FFE0 +5140 +3F80 +D160 +1F00 +0400 +3580 +CC60 +ENDCHAR +STARTCHAR U_5D9B +ENCODING 23963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AAA0 +AC40 +ABE0 +AA40 +ABC0 +AA40 +FBC0 +04A0 +09A0 +ENDCHAR +STARTCHAR U_5D9C +ENCODING 23964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +A280 +FFE0 +3180 +52A0 +BEE0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_5D9D +ENCODING 23965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +25A0 +AA40 +AC20 +ABC0 +A800 +ABC0 +AA40 +FBC0 +0280 +0FE0 +ENDCHAR +STARTCHAR U_5D9E +ENCODING 23966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A500 +AFE0 +C440 +A7C0 +A440 +E7C0 +8440 +44C0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5D9F +ENCODING 23967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +AA80 +AFE0 +AAA0 +AD60 +A820 +AFE0 +FA40 +0140 +00C0 +ENDCHAR +STARTCHAR U_5DA0 +ENCODING 23968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +AFE0 +AA80 +AFC0 +AAA0 +AFE0 +AAA0 +FBA0 +8820 +0860 +ENDCHAR +STARTCHAR U_5DA1 +ENCODING 23969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0000 +7FE0 +5480 +7EE0 +49A0 +6A80 +7E80 +8940 +9220 +ENDCHAR +STARTCHAR U_5DA2 +ENCODING 23970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +AFE0 +AA40 +AFE0 +AA40 +FFE0 +8A80 +02A0 +0CE0 +ENDCHAR +STARTCHAR U_5DA3 +ENCODING 23971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +C920 +ENDCHAR +STARTCHAR U_5DA4 +ENCODING 23972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +7FC0 +0400 +FFE0 +2040 +FFE0 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_5DA5 +ENCODING 23973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +2DC0 +AA80 +AFE0 +AA40 +AA40 +FFC0 +8A40 +14A0 +2920 +ENDCHAR +STARTCHAR U_5DA6 +ENCODING 23974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2440 +2FE0 +AA40 +AFE0 +A800 +ABC0 +F800 +8BC0 +1240 +23C0 +ENDCHAR +STARTCHAR U_5DA7 +ENCODING 23975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +A900 +AFE0 +AA80 +AFE0 +A900 +FFE0 +8100 +0100 +ENDCHAR +STARTCHAR U_5DA8 +ENCODING 23976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +4440 +7BC0 +4A40 +75C0 +4A40 +FFE0 +8020 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5DA9 +ENCODING 23977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AAA0 +AFE0 +AAA0 +AFE0 +A800 +FFE0 +9AA0 +0A40 +1720 +ENDCHAR +STARTCHAR U_5DAA +ENCODING 23978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2A80 +FFE0 +1100 +7FC0 +0400 +FFE0 +0400 +3580 +C460 +ENDCHAR +STARTCHAR U_5DAB +ENCODING 23979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +2280 +AFE0 +AA80 +AFE0 +A900 +AFE0 +F900 +0FE0 +0540 +0920 +ENDCHAR +STARTCHAR U_5DAC +ENCODING 23980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +A900 +AFE0 +AB40 +AAA0 +AFE0 +FAA0 +8F40 +02E0 +0720 +ENDCHAR +STARTCHAR U_5DAD +ENCODING 23981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +4100 +F7E0 +9280 +F100 +8FE0 +F100 +97C0 +F100 +9100 +ENDCHAR +STARTCHAR U_5DAE +ENCODING 23982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +AC20 +ABC0 +A800 +AFE0 +A920 +FFE0 +8240 +04A0 +0920 +ENDCHAR +STARTCHAR U_5DAF +ENCODING 23983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +4900 +FD40 +4D20 +7BE0 +4920 +7940 +4CA0 +F960 +0A20 +ENDCHAR +STARTCHAR U_5DB0 +ENCODING 23984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AEA0 +AB60 +AE40 +AAE0 +AB40 +FFE0 +8A40 +0A40 +1240 +ENDCHAR +STARTCHAR U_5DB1 +ENCODING 23985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +ABC0 +AA40 +ABC0 +AA40 +ABE0 +ACA0 +F960 +8FA0 +0060 +ENDCHAR +STARTCHAR U_5DB2 +ENCODING 23986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +1200 +3FC0 +6200 +BFC0 +2200 +79E0 +4920 +4F20 +4060 +ENDCHAR +STARTCHAR U_5DB3 +ENCODING 23987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3F80 +0000 +FFE0 +2C80 +D700 +2AE0 +2680 +7BC0 +2080 +FBE0 +ENDCHAR +STARTCHAR U_5DB4 +ENCODING 23988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +64C0 +5540 +7FC0 +5540 +FFE0 +1500 +E4E0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5DB5 +ENCODING 23989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +AA80 +AEE0 +AA80 +AEE0 +AA80 +FEE0 +8A80 +0280 +ENDCHAR +STARTCHAR U_5DB6 +ENCODING 23990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3FC0 +5540 +9F40 +20E0 +5F20 +C0A0 +5CA0 +5440 +56A0 +6520 +ENDCHAR +STARTCHAR U_5DB7 +ENCODING 23991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7FE0 +4800 +53E0 +7D40 +43E0 +F8A0 +2280 +FEE0 +5580 +88E0 +ENDCHAR +STARTCHAR U_5DB8 +ENCODING 23992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +AA40 +ADA0 +AFE0 +A920 +AFE0 +F900 +8B80 +0540 +0920 +ENDCHAR +STARTCHAR U_5DB9 +ENCODING 23993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +AFC0 +A800 +AFE0 +A920 +FFE0 +0E40 +0B40 +0EC0 +ENDCHAR +STARTCHAR U_5DBA +ENCODING 23994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2100 +57C0 +AC40 +27C0 +FC40 +17C0 +A440 +47C0 +2820 +ENDCHAR +STARTCHAR U_5DBB +ENCODING 23995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FC0 +7980 +2140 +FFE0 +5140 +7D40 +D080 +7CA0 +5160 +7E20 +ENDCHAR +STARTCHAR U_5DBC +ENCODING 23996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E60 +2B20 +AE60 +ABA0 +A8A0 +AEE0 +AAA0 +FFE0 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_5DBD +ENCODING 23997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3FC0 +4480 +2EC0 +60A0 +BFE0 +2080 +6E80 +AA80 +2F40 +CA20 +ENDCHAR +STARTCHAR U_5DBE +ENCODING 23998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +23C0 +A880 +AFE0 +A940 +A840 +FBC0 +0520 +0AA0 +03C0 +ENDCHAR +STARTCHAR U_5DBF +ENCODING 23999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +A920 +ADA0 +A920 +ABC0 +F080 +0FE0 +0AA0 +0A60 +ENDCHAR +STARTCHAR U_5DC0 +ENCODING 24000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +1180 +5540 +9520 +1BC0 +FD20 +4940 +7CA0 +4960 +7C20 +ENDCHAR +STARTCHAR U_5DC1 +ENCODING 24001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AFE0 +AA40 +ABE0 +AAA0 +ABE0 +F880 +17E0 +14A0 +25A0 +ENDCHAR +STARTCHAR U_5DC2 +ENCODING 24002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2440 +7FC0 +C400 +7FC0 +4400 +FFE0 +AAA0 +CA60 +8EE0 +ENDCHAR +STARTCHAR U_5DC3 +ENCODING 24003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1100 +7DE0 +2900 +FFE0 +4420 +7DE0 +45C0 +7D20 +4DE0 +ENDCHAR +STARTCHAR U_5DC4 +ENCODING 24004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +AA80 +AFE0 +A820 +AEE0 +AA80 +AEE0 +FA80 +0EA0 +12E0 +ENDCHAR +STARTCHAR U_5DC5 +ENCODING 24005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2000 +FFE0 +4900 +6BE0 +5A20 +4AA0 +FEA0 +4940 +8620 +ENDCHAR +STARTCHAR U_5DC6 +ENCODING 24006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +AA40 +ACA0 +AFE0 +AA60 +ABC0 +F800 +87E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_5DC7 +ENCODING 24007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2440 +AF60 +A9C0 +AF40 +A860 +AF40 +F940 +8F60 +15A0 +2F20 +ENDCHAR +STARTCHAR U_5DC8 +ENCODING 24008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +5200 +FBE0 +5520 +FB60 +A920 +FFE0 +2120 +FBA0 +2560 +ENDCHAR +STARTCHAR U_5DC9 +ENCODING 24009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +A880 +AFC0 +AAA0 +AFE0 +F940 +8FC0 +02A0 +0CE0 +ENDCHAR +STARTCHAR U_5DCA +ENCODING 24010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +AAA0 +AA40 +ADA0 +AA00 +AFE0 +FA40 +0180 +0E60 +ENDCHAR +STARTCHAR U_5DCB +ENCODING 24011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +4840 +7FC0 +4440 +7FE0 +16A0 +53E0 +5AA0 +52E0 +FC80 +ENDCHAR +STARTCHAR U_5DCC +ENCODING 24012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +1080 +7FE0 +4900 +7FC0 +5480 +5580 +5CC0 +8520 +ENDCHAR +STARTCHAR U_5DCD +ENCODING 24013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0900 +F7E0 +2520 +FFE0 +AD20 +FFE0 +52C0 +32A0 +CC60 +ENDCHAR +STARTCHAR U_5DCE +ENCODING 24014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +ABE0 +AAA0 +AFE0 +AAC0 +BFA0 +CA80 +1300 +06C0 +1820 +ENDCHAR +STARTCHAR U_5DCF +ENCODING 24015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +AEE0 +AAA0 +AFE0 +A900 +AFE0 +F900 +8FC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_5DD0 +ENCODING 24016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +FFC0 +2000 +F7C0 +5640 +7540 +97C0 +F340 +BE40 +93E0 +9C40 +ENDCHAR +STARTCHAR U_5DD1 +ENCODING 24017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +2FE0 +A240 +AFE0 +A540 +BFE0 +A840 +FFC0 +8840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_5DD2 +ENCODING 24018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +8E80 +E1C0 +4E80 +F0E0 +5F40 +AAA0 +0E00 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_5DD3 +ENCODING 24019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2800 +B3E0 +A480 +BDC0 +A940 +B9C0 +FD40 +29C0 +CA20 +ENDCHAR +STARTCHAR U_5DD4 +ENCODING 24020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +2000 +FFE0 +4A40 +6BC0 +5A40 +4BC0 +FE40 +53C0 +8E60 +ENDCHAR +STARTCHAR U_5DD5 +ENCODING 24021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +AEA0 +ABE0 +AE40 +ABE0 +AC80 +FFE0 +8100 +0FE0 +0300 +ENDCHAR +STARTCHAR U_5DD6 +ENCODING 24022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +4A40 +FFE0 +8900 +BDE0 +A520 +BF40 +A480 +FD40 +8620 +ENDCHAR +STARTCHAR U_5DD7 +ENCODING 24023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2FE0 +2880 +AFE0 +AAA0 +AEA0 +FAA0 +8F40 +12A0 +12A0 +ENDCHAR +STARTCHAR U_5DD8 +ENCODING 24024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +AA40 +AFE0 +AA40 +AFC0 +AA40 +FF40 +8940 +1FA0 +2AA0 +ENDCHAR +STARTCHAR U_5DD9 +ENCODING 24025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2100 +ABE0 +AAA0 +AFE0 +AA80 +BBE0 +C640 +0180 +0E60 +ENDCHAR +STARTCHAR U_5DDA +ENCODING 24026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FC0 +1080 +7CA0 +57E0 +7C80 +5080 +7D40 +7540 +AD20 +B620 +ENDCHAR +STARTCHAR U_5DDB +ENCODING 24027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2220 +2220 +4440 +4440 +8880 +8880 +4440 +4440 +2220 +2220 +ENDCHAR +STARTCHAR U_5DDC +ENCODING 24028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1100 +1100 +2200 +4400 +8800 +4400 +2200 +2200 +1100 +1980 +1100 +ENDCHAR +STARTCHAR U_5DDD +ENCODING 24029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2220 +2220 +2220 +2220 +2220 +2220 +2220 +2220 +4020 +8020 +ENDCHAR +STARTCHAR U_5DDE +ENCODING 24030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1220 +1220 +5B20 +56A0 +92A0 +1220 +1220 +1220 +2220 +4020 +ENDCHAR +STARTCHAR U_5DDF +ENCODING 24031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +3FC0 +0000 +2480 +2480 +44A0 +44A0 +8460 +ENDCHAR +STARTCHAR U_5DE0 +ENCODING 24032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +4900 +4900 +2480 +2480 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5DE1 +ENCODING 24033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +22A0 +2540 +0540 +EA80 +2540 +2540 +22A0 +22A0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5DE2 +ENCODING 24034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2480 +1240 +3FC0 +2440 +3FC0 +2440 +7FE0 +0400 +3580 +C460 +ENDCHAR +STARTCHAR U_5DE3 +ENCODING 24035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +7FC0 +4440 +7FC0 +4440 +7FC0 +0400 +FFE0 +2480 +4460 +ENDCHAR +STARTCHAR U_5DE4 +ENCODING 24036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4900 +9200 +4900 +FF00 +A900 +9500 +FF00 +9500 +D900 +9540 +D880 +ENDCHAR +STARTCHAR U_5DE5 +ENCODING 24037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 0 +BITMAP +7FC0 +0400 +0400 +0400 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5DE6 +ENCODING 24038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +0800 +1000 +1FC0 +2200 +2200 +4200 +8200 +3FE0 +ENDCHAR +STARTCHAR U_5DE7 +ENCODING 24039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2200 +23E0 +2020 +3820 +C020 +0020 +0240 +0180 +ENDCHAR +STARTCHAR U_5DE8 +ENCODING 24040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8000 +8000 +FF00 +8100 +8100 +FF00 +8000 +8000 +8000 +FFC0 +ENDCHAR +STARTCHAR U_5DE9 +ENCODING 24041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2480 +2480 +2680 +2580 +2480 +3480 +C4A0 +08A0 +3060 +ENDCHAR +STARTCHAR U_5DEA +ENCODING 24042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4000 +7F80 +4080 +7F80 +4000 +7FC0 +0000 +FFC0 +0040 +0040 +ENDCHAR +STARTCHAR U_5DEB +ENCODING 24043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +2480 +2480 +4500 +6580 +9640 +9640 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_5DEC +ENCODING 24044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +2480 +24A0 +3860 +C400 +1F00 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_5DED +ENCODING 24045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2120 +3A20 +C460 +0400 +7FC0 +0400 +FFE0 +1200 +E1E0 +ENDCHAR +STARTCHAR U_5DEE +ENCODING 24046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +0900 +FFE0 +0400 +7FC0 +0800 +FFE0 +1000 +2F80 +4200 +BFE0 +ENDCHAR +STARTCHAR U_5DEF +ENCODING 24047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +2100 +5240 +8FA0 +F020 +2540 +2540 +3D40 +C940 +1160 +ENDCHAR +STARTCHAR U_5DF0 +ENCODING 24048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +57E0 +5500 +AA40 +ABA0 +4400 +FD40 +2540 +2540 +3D40 +C960 +ENDCHAR +STARTCHAR U_5DF1 +ENCODING 24049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FF80 +0080 +0080 +7F80 +4000 +4000 +4000 +4020 +4020 +3FE0 +ENDCHAR +STARTCHAR U_5DF2 +ENCODING 24050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF00 +0100 +0100 +8100 +FF00 +8000 +8040 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5DF3 +ENCODING 24051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF00 +8100 +8100 +8100 +FF00 +8000 +8000 +8040 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5DF4 +ENCODING 24052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 1 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8000 +8000 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_5DF5 +ENCODING 24053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +4000 +7FE0 +4000 +5FC0 +5240 +5240 +5FC0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_5DF6 +ENCODING 24054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +4A40 +4A40 +9BC0 +0240 +FA00 +8A00 +8A20 +8A20 +F9E0 +ENDCHAR +STARTCHAR U_5DF7 +ENCODING 24055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +1100 +3F80 +D160 +1F00 +1040 +1040 +1FC0 +ENDCHAR +STARTCHAR U_5DF8 +ENCODING 24056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +9240 +BA40 +ABC0 +AA40 +BA00 +9200 +9200 +9220 +F9E0 +ENDCHAR +STARTCHAR U_5DF9 +ENCODING 24057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0240 +7580 +2480 +DFC0 +0000 +3F80 +0080 +3FA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_5DFA +ENCODING 24058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4200 +3DC0 +0000 +FFE0 +0000 +1100 +20C0 +C040 +ENDCHAR +STARTCHAR U_5DFB +ENCODING 24059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +0D00 +3F80 +0400 +7FE0 +1080 +3F40 +C120 +1F00 +1080 +1F80 +ENDCHAR +STARTCHAR U_5DFC +ENCODING 24060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8040 +FFC0 +0000 +F440 +9780 +9400 +F440 +03C0 +ENDCHAR +STARTCHAR U_5DFD +ENCODING 24061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9240 +F3C0 +8A20 +FBE0 +1100 +7FC0 +1100 +FFE0 +0900 +F0E0 +ENDCHAR +STARTCHAR U_5DFE +ENCODING 24062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +8880 +8880 +8A80 +8900 +0800 +0800 +ENDCHAR +STARTCHAR U_5DFF +ENCODING 24063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0400 +7FC0 +4440 +4440 +4440 +45C0 +0400 +0400 +ENDCHAR +STARTCHAR U_5E00 +ENCODING 24064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +4440 +4540 +4480 +0400 +0400 +ENDCHAR +STARTCHAR U_5E01 +ENCODING 24065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +01C0 +FE00 +0400 +7FC0 +4440 +4440 +4440 +4540 +4480 +0400 +0400 +ENDCHAR +STARTCHAR U_5E02 +ENCODING 24066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +3FC0 +2440 +2440 +2440 +2540 +2480 +0400 +ENDCHAR +STARTCHAR U_5E03 +ENCODING 24067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +FFE0 +1200 +1200 +3FC0 +5240 +9240 +1240 +12C0 +0200 +ENDCHAR +STARTCHAR U_5E04 +ENCODING 24068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +A880 +A880 +A880 +A880 +A880 +B880 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_5E05 +ENCODING 24069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +97E0 +9520 +9520 +9520 +9520 +9520 +2560 +4100 +8100 +ENDCHAR +STARTCHAR U_5E06 +ENCODING 24070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +AA40 +AB40 +AAC0 +AA40 +AA40 +2240 +2440 +2860 +ENDCHAR +STARTCHAR U_5E07 +ENCODING 24071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E08 +ENCODING 24072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +A100 +AFE0 +A920 +A920 +A920 +2920 +2960 +4100 +8100 +ENDCHAR +STARTCHAR U_5E09 +ENCODING 24073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +AA40 +AC20 +ABC0 +A940 +A940 +BA40 +2240 +2CC0 +ENDCHAR +STARTCHAR U_5E0A +ENCODING 24074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +FAA0 +AAA0 +AAA0 +ABE0 +AA20 +BA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_5E0B +ENCODING 24075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8800 +FFC0 +A400 +D240 +09C0 +FF80 +8880 +8880 +8B80 +0800 +ENDCHAR +STARTCHAR U_5E0C +ENCODING 24076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3380 +0C00 +7380 +0800 +FFC0 +1400 +3F80 +E480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E0D +ENCODING 24077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4200 +5FC0 +5240 +5240 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_5E0E +ENCODING 24078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AAA0 +A880 +A880 +B980 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_5E0F +ENCODING 24079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AFE0 +A900 +AFE0 +A920 +A920 +2160 +2100 +2100 +ENDCHAR +STARTCHAR U_5E10 +ENCODING 24080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FA80 +AB00 +AA00 +AFE0 +AA80 +BA80 +2240 +22C0 +2320 +ENDCHAR +STARTCHAR U_5E11 +ENCODING 24081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +5240 +5180 +3080 +6D40 +8620 +7FC0 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E12 +ENCODING 24082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +2480 +7FE0 +A200 +25A0 +2460 +7FC0 +4440 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E13 +ENCODING 24083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +A900 +AFC0 +A900 +AB80 +BB40 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_5E14 +ENCODING 24084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AA80 +ABE0 +AA20 +BB40 +2280 +2540 +2A20 +ENDCHAR +STARTCHAR U_5E15 +ENCODING 24085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +AA20 +AA20 +ABE0 +AA20 +BA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E16 +ENCODING 24086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F8E0 +A880 +A880 +ABE0 +AA20 +BA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E17 +ENCODING 24087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +A900 +A9E0 +A920 +A9A0 +BA40 +22C0 +2520 +2A20 +ENDCHAR +STARTCHAR U_5E18 +ENCODING 24088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +4440 +BFA0 +2480 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E19 +ENCODING 24089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FBC0 +AC80 +A880 +AFE0 +A880 +B940 +2140 +2220 +2420 +ENDCHAR +STARTCHAR U_5E1A +ENCODING 24090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +1F80 +0080 +FFE0 +8420 +3F80 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E1B +ENCODING 24091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F00 +0800 +FF80 +8880 +8B80 +0800 +ENDCHAR +STARTCHAR U_5E1C +ENCODING 24092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +AA20 +AA20 +ABE0 +AA20 +B800 +2140 +2220 +2420 +ENDCHAR +STARTCHAR U_5E1D +ENCODING 24093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0A00 +FFE0 +8420 +BFA0 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E1E +ENCODING 24094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBE0 +AA20 +AA20 +ABE0 +AA20 +BA20 +2220 +2220 +23E0 +ENDCHAR +STARTCHAR U_5E1F +ENCODING 24095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +4A40 +9620 +2400 +7FC0 +4440 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E20 +ENCODING 24096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +7700 +4100 +7700 +4100 +7F00 +0800 +FF80 +8880 +8880 +8980 +0800 +ENDCHAR +STARTCHAR U_5E21 +ENCODING 24097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +F800 +AFE0 +AA40 +AA40 +AFE0 +BA40 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_5E22 +ENCODING 24098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2180 +FA40 +AC20 +ABC0 +A800 +ABE0 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E23 +ENCODING 24099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2900 +FFC0 +1000 +FFE0 +2480 +4440 +FFE0 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E24 +ENCODING 24100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +4A20 +D220 +2BE0 +4220 +8400 +7FC0 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_5E25 +ENCODING 24101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +97E0 +9520 +F520 +8520 +F520 +9520 +9560 +F100 +9100 +ENDCHAR +STARTCHAR U_5E26 +ENCODING 24102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +2480 +2480 +FFE0 +8420 +BFA0 +2480 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E27 +ENCODING 24103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +20E0 +F880 +ABE0 +AA20 +AAA0 +AAA0 +AAA0 +B880 +2140 +2620 +ENDCHAR +STARTCHAR U_5E28 +ENCODING 24104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +2000 +FBE0 +AA20 +AA20 +ABE0 +BA80 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_5E29 +ENCODING 24105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +21C0 +F880 +ABE0 +AA20 +ABE0 +AA20 +ABE0 +2220 +2220 +22E0 +ENDCHAR +STARTCHAR U_5E2A +ENCODING 24106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2400 +FDC0 +AC00 +AFE0 +AD40 +BD60 +A540 +2920 +31A0 +ENDCHAR +STARTCHAR U_5E2B +ENCODING 24107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F100 +9100 +97E0 +F520 +8520 +F520 +9520 +9560 +F100 +9100 +ENDCHAR +STARTCHAR U_5E2C +ENCODING 24108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1080 +FFE0 +2080 +7FC0 +A040 +3FC0 +0400 +3FC0 +2440 +24C0 +ENDCHAR +STARTCHAR U_5E2D +ENCODING 24109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4F80 +4200 +5FC0 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_5E2E +ENCODING 24110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +1120 +7D40 +1120 +FDE0 +2500 +7FC0 +2440 +24C0 +0400 +ENDCHAR +STARTCHAR U_5E2F +ENCODING 24111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +2480 +3F80 +0000 +FFE0 +8420 +BFC0 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E30 +ENCODING 24112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +27C0 +A040 +AFE0 +A920 +37C0 +2540 +2540 +45C0 +8100 +ENDCHAR +STARTCHAR U_5E31 +ENCODING 24113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBE0 +A900 +AFE0 +AA40 +AFE0 +BA40 +2540 +2840 +20C0 +ENDCHAR +STARTCHAR U_5E32 +ENCODING 24114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2240 +FF60 +AA40 +AA40 +AA40 +AF60 +AA40 +BA40 +2440 +2840 +ENDCHAR +STARTCHAR U_5E33 +ENCODING 24115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +FBC0 +AA00 +ABC0 +AA00 +AFE0 +BAA0 +2240 +23A0 +2620 +ENDCHAR +STARTCHAR U_5E34 +ENCODING 24116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA40 +A9A0 +AEE0 +AA40 +AFE0 +BA40 +21A0 +2160 +2620 +ENDCHAR +STARTCHAR U_5E35 +ENCODING 24117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +A820 +AEE0 +AAA0 +AEA0 +AAE0 +BA80 +24A0 +28E0 +ENDCHAR +STARTCHAR U_5E36 +ENCODING 24118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +DEE0 +0000 +FFE0 +8420 +BFA0 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_5E37 +ENCODING 24119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +FA80 +AE80 +ABE0 +AA80 +AA80 +BBE0 +2280 +2280 +23E0 +ENDCHAR +STARTCHAR U_5E38 +ENCODING 24120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FE0 +4020 +9FA0 +1080 +1F80 +0400 +3FC0 +2440 +24C0 +0400 +ENDCHAR +STARTCHAR U_5E39 +ENCODING 24121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FA80 +AFE0 +A900 +AFE0 +AA80 +AA80 +BA80 +2100 +26C0 +ENDCHAR +STARTCHAR U_5E3A +ENCODING 24122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +AA40 +ABC0 +AA40 +ABC0 +AA40 +BFE0 +2240 +2420 +ENDCHAR +STARTCHAR U_5E3B +ENCODING 24123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F880 +ABE0 +A880 +AFE0 +AA20 +BAA0 +22A0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E3C +ENCODING 24124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +AD20 +AD20 +AFE0 +ADA0 +BD60 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_5E3D +ENCODING 24125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FDA0 +AC20 +ABC0 +AA40 +ABC0 +BA40 +23C0 +2240 +23C0 +ENDCHAR +STARTCHAR U_5E3E +ENCODING 24126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +AFE0 +A900 +ABE0 +AE20 +BBE0 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_5E3F +ENCODING 24127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25C0 +F840 +AFE0 +A900 +ABE0 +AC80 +ABE0 +B880 +2940 +2A20 +ENDCHAR +STARTCHAR U_5E40 +ENCODING 24128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FBE0 +AA20 +ABE0 +AA20 +ABE0 +BA20 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E41 +ENCODING 24129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBE0 +AA20 +ABE0 +AA20 +ABE0 +BA20 +23E0 +2240 +2420 +ENDCHAR +STARTCHAR U_5E42 +ENCODING 24130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A140 +BF40 +2100 +3F00 +1000 +FFC0 +2900 +7F80 +A940 +2B00 +ENDCHAR +STARTCHAR U_5E43 +ENCODING 24131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +F940 +AFE0 +AA40 +ABC0 +A880 +BFE0 +2280 +27E0 +2080 +ENDCHAR +STARTCHAR U_5E44 +ENCODING 24132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +AA00 +ABE0 +AAA0 +ABE0 +BC80 +25E0 +2880 +27E0 +ENDCHAR +STARTCHAR U_5E45 +ENCODING 24133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +FBC0 +AA40 +ABC0 +A800 +AFE0 +BD20 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_5E46 +ENCODING 24134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +A900 +ABE0 +AEA0 +BB60 +23A0 +2040 +ENDCHAR +STARTCHAR U_5E47 +ENCODING 24135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +7C40 +13E0 +FC40 +1140 +3CC0 +4400 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E48 +ENCODING 24136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +AA40 +AFE0 +AA40 +AFE0 +AA40 +BA40 +2A40 +3440 +ENDCHAR +STARTCHAR U_5E49 +ENCODING 24137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2FE0 +FA80 +AB80 +A800 +AFE0 +A900 +AFE0 +B900 +27C0 +2920 +ENDCHAR +STARTCHAR U_5E4A +ENCODING 24138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FFE0 +AA20 +ABE0 +AA20 +ABE0 +BA20 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E4B +ENCODING 24139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA40 +AA60 +FFE0 +AA40 +A980 +1E60 +0400 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5E4C +ENCODING 24140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FBE0 +AA20 +ABE0 +ACA0 +AAC0 +BFE0 +2180 +22A0 +24E0 +ENDCHAR +STARTCHAR U_5E4D +ENCODING 24141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +FD20 +AAC0 +AA00 +ACE0 +A820 +BEE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_5E4E +ENCODING 24142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +AA40 +ABC0 +AA40 +ABC0 +B900 +27E0 +2240 +2420 +ENDCHAR +STARTCHAR U_5E4F +ENCODING 24143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +AFE0 +AA00 +AD40 +AA80 +BDC0 +22A0 +24A0 +2300 +ENDCHAR +STARTCHAR U_5E50 +ENCODING 24144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5100 +7FE0 +5280 +5540 +7FE0 +5540 +5540 +95C0 +B100 +ENDCHAR +STARTCHAR U_5E51 +ENCODING 24145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +5540 +9FE0 +20A0 +5FA0 +C4A0 +5FC0 +5540 +5540 +57A0 +44A0 +ENDCHAR +STARTCHAR U_5E52 +ENCODING 24146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F940 +AA40 +A940 +AFC0 +A800 +AA40 +BD20 +2440 +27C0 +ENDCHAR +STARTCHAR U_5E53 +ENCODING 24147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27A0 +FA40 +AFE0 +A900 +AA80 +AD60 +BA80 +2120 +2240 +2180 +ENDCHAR +STARTCHAR U_5E54 +ENCODING 24148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +AFE0 +AAA0 +AFE0 +AC40 +BA80 +2100 +2EE0 +ENDCHAR +STARTCHAR U_5E55 +ENCODING 24149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +2080 +3F80 +2880 +FFE0 +1480 +FFE0 +2480 +2580 +ENDCHAR +STARTCHAR U_5E56 +ENCODING 24150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +AAA0 +AFE0 +A800 +AFC0 +A800 +BFE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_5E57 +ENCODING 24151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2960 +FFE0 +A920 +AF20 +A960 +AFA0 +B920 +2EE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5E58 +ENCODING 24152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AFE0 +AA40 +ABC0 +AA40 +BBC0 +2240 +23C0 +2420 +ENDCHAR +STARTCHAR U_5E59 +ENCODING 24153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +ABC0 +AA40 +ABC0 +AA40 +BFE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_5E5A +ENCODING 24154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +1140 +FD20 +21E0 +C100 +3F80 +2480 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5E5B +ENCODING 24155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +AFE0 +AA40 +ABC0 +AA40 +BBC0 +2100 +27E0 +2100 +ENDCHAR +STARTCHAR U_5E5C +ENCODING 24156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +AC40 +AFC0 +A900 +AFE0 +BC40 +27C0 +2540 +2B20 +ENDCHAR +STARTCHAR U_5E5D +ENCODING 24157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +AAA0 +ABE0 +AAA0 +ABE0 +B880 +27E0 +2080 +2080 +ENDCHAR +STARTCHAR U_5E5E +ENCODING 24158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2360 +FFE0 +A940 +ABE0 +A880 +ABE0 +B880 +27E0 +2140 +2620 +ENDCHAR +STARTCHAR U_5E5F +ENCODING 24159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2FA0 +FA80 +AFE0 +A880 +AEA0 +AAC0 +BE80 +2AA0 +2F60 +2220 +ENDCHAR +STARTCHAR U_5E60 +ENCODING 24160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +AAA0 +AFE0 +AAA0 +AAA0 +BFE0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_5E61 +ENCODING 24161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +AB40 +AD20 +A900 +AFE0 +B920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_5E62 +ENCODING 24162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +A900 +AFE0 +AD40 +AFC0 +BD40 +A7E0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5E63 +ENCODING 24163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9300 +55E0 +FE20 +9B20 +B6C0 +D320 +0200 +3FC0 +2240 +22C0 +0200 +ENDCHAR +STARTCHAR U_5E64 +ENCODING 24164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FDE0 +AD40 +BF40 +8480 +8D40 +0520 +7FC0 +4440 +44C0 +0400 +ENDCHAR +STARTCHAR U_5E65 +ENCODING 24165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +AAA0 +AB80 +A900 +AFC0 +A900 +BFE0 +2100 +2300 +ENDCHAR +STARTCHAR U_5E66 +ENCODING 24166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +47E0 +7880 +ABE0 +3C80 +0480 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_5E67 +ENCODING 24167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +AFE0 +AAA0 +AEE0 +A900 +BFE0 +2540 +2920 +2920 +ENDCHAR +STARTCHAR U_5E68 +ENCODING 24168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2280 +FFE0 +AA40 +AFE0 +A800 +ABE0 +B800 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5E69 +ENCODING 24169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FAA0 +AFE0 +AA20 +ABE0 +AA20 +BBE0 +2220 +23E0 +2620 +ENDCHAR +STARTCHAR U_5E6A +ENCODING 24170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +AFE0 +A820 +AFE0 +AA40 +BD80 +2340 +2520 +2300 +ENDCHAR +STARTCHAR U_5E6B +ENCODING 24171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FBE0 +2240 +F940 +2440 +FF80 +2080 +3F80 +2480 +7FC0 +44C0 +ENDCHAR +STARTCHAR U_5E6C +ENCODING 24172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AFE0 +A920 +AFC0 +A820 +B9E0 +2F20 +2AA0 +2E60 +ENDCHAR +STARTCHAR U_5E6D +ENCODING 24173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +AAA0 +AFE0 +A940 +AFE0 +B940 +2E80 +29A0 +3660 +ENDCHAR +STARTCHAR U_5E6E +ENCODING 24174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +AFA0 +A920 +AFE0 +AAA0 +BBA0 +2D60 +2A20 +3760 +ENDCHAR +STARTCHAR U_5E6F +ENCODING 24175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FA40 +AEE0 +AAA0 +AEA0 +AAA0 +BEA0 +2AE0 +2A80 +2D80 +ENDCHAR +STARTCHAR U_5E70 +ENCODING 24176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFC0 +A900 +AFE0 +AAA0 +AFE0 +B800 +2540 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_5E71 +ENCODING 24177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +AEE0 +A920 +AFE0 +AAA0 +ABA0 +B920 +2BA0 +2D60 +ENDCHAR +STARTCHAR U_5E72 +ENCODING 24178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5E73 +ENCODING 24179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +2480 +1500 +0400 +FFE0 +0400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_5E74 +ENCODING 24180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4200 +8200 +3FC0 +2200 +2200 +FFE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_5E75 +ENCODING 24181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +1080 +1080 +1080 +FBE0 +1080 +1080 +1080 +2080 +2080 +4080 +ENDCHAR +STARTCHAR U_5E76 +ENCODING 24182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +1100 +1100 +1100 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5E77 +ENCODING 24183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +1080 +7DE0 +1080 +1080 +FDE0 +1080 +1080 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_5E78 +ENCODING 24184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1100 +0A00 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_5E79 +ENCODING 24185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +2220 +FDC0 +8880 +F880 +8BE0 +F880 +2080 +F880 +2080 +ENDCHAR +STARTCHAR U_5E7A +ENCODING 24186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +0800 +1100 +2100 +7E00 +0400 +0800 +1080 +27C0 +F840 +ENDCHAR +STARTCHAR U_5E7B +ENCODING 24187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2020 +4820 +4820 +F020 +2020 +2820 +4420 +FD40 +0080 +ENDCHAR +STARTCHAR U_5E7C +ENCODING 24188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +4FE0 +F920 +1120 +2120 +4920 +F520 +42A0 +0440 +ENDCHAR +STARTCHAR U_5E7D +ENCODING 24189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +94A0 +A520 +AD60 +F7A0 +94A0 +AD60 +FFE0 +8420 +8420 +FFE0 +ENDCHAR +STARTCHAR U_5E7E +ENCODING 24190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4500 +F7C0 +2CA0 +FFE0 +2480 +FFE0 +2280 +3120 +49A0 +8E60 +ENDCHAR +STARTCHAR U_5E7F +ENCODING 24191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4000 +4000 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_5E80 +ENCODING 24192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2400 +2440 +2480 +2700 +2400 +2420 +4420 +83E0 +ENDCHAR +STARTCHAR U_5E81 +ENCODING 24193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2000 +2FE0 +2100 +2100 +2100 +4100 +4500 +8200 +ENDCHAR +STARTCHAR U_5E82 +ENCODING 24194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2200 +2200 +2200 +2200 +2500 +2880 +5060 +A020 +ENDCHAR +STARTCHAR U_5E83 +ENCODING 24195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2000 +2200 +2200 +2200 +2400 +4840 +5FE0 +8020 +ENDCHAR +STARTCHAR U_5E84 +ENCODING 24196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2200 +2200 +2FC0 +2200 +2200 +2200 +4200 +9FE0 +ENDCHAR +STARTCHAR U_5E85 +ENCODING 24197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2200 +2280 +2480 +2900 +2200 +4440 +4FE0 +8020 +ENDCHAR +STARTCHAR U_5E86 +ENCODING 24198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +2200 +2200 +3FE0 +2200 +2200 +2500 +4480 +4840 +9020 +ENDCHAR +STARTCHAR U_5E87 +ENCODING 24199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5100 +5120 +5D40 +5180 +5100 +5520 +9920 +90E0 +ENDCHAR +STARTCHAR U_5E88 +ENCODING 24200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4500 +4880 +5260 +6220 +5FC0 +4080 +8100 +8200 +ENDCHAR +STARTCHAR U_5E89 +ENCODING 24201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +5240 +5240 +5FC0 +4200 +8220 +81E0 +ENDCHAR +STARTCHAR U_5E8A +ENCODING 24202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +4200 +7FE0 +4200 +4700 +4A80 +5240 +A220 +8200 +ENDCHAR +STARTCHAR U_5E8B +ENCODING 24203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +4200 +5FC0 +4880 +4500 +4200 +8D80 +B060 +ENDCHAR +STARTCHAR U_5E8C +ENCODING 24204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +3FE0 +2500 +2900 +2FE0 +2300 +2500 +4900 +9300 +ENDCHAR +STARTCHAR U_5E8D +ENCODING 24205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2040 +2F80 +2800 +2FE0 +2880 +2880 +2880 +4880 +9080 +ENDCHAR +STARTCHAR U_5E8E +ENCODING 24206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +2200 +2580 +2840 +34A0 +2480 +4480 +4480 +8880 +ENDCHAR +STARTCHAR U_5E8F +ENCODING 24207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5F80 +4500 +4200 +7FE0 +4240 +4200 +8200 +8E00 +ENDCHAR +STARTCHAR U_5E90 +ENCODING 24208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2100 +2FC0 +2840 +2840 +2FC0 +2800 +4800 +5000 +A000 +ENDCHAR +STARTCHAR U_5E91 +ENCODING 24209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +4200 +5FE0 +4500 +4500 +4920 +9120 +A0E0 +ENDCHAR +STARTCHAR U_5E92 +ENCODING 24210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4200 +4200 +5FC0 +4200 +4280 +4240 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5E93 +ENCODING 24211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +3FE0 +2400 +2900 +2FC0 +2100 +3FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_5E94 +ENCODING 24212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4440 +5240 +4A40 +4880 +4080 +8100 +9FE0 +ENDCHAR +STARTCHAR U_5E95 +ENCODING 24213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2FC0 +2900 +2FE0 +2900 +2880 +2AA0 +4D60 +8920 +ENDCHAR +STARTCHAR U_5E96 +ENCODING 24214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +4FC0 +5040 +6F40 +4940 +4F40 +48A0 +4820 +87E0 +ENDCHAR +STARTCHAR U_5E97 +ENCODING 24215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +2200 +23C0 +2200 +2FC0 +2840 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_5E98 +ENCODING 24216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FC0 +5240 +5FC0 +5240 +5FC0 +4200 +4200 +8200 +ENDCHAR +STARTCHAR U_5E99 +ENCODING 24217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4200 +5FC0 +5240 +5FC0 +5240 +5240 +9FC0 +9040 +ENDCHAR +STARTCHAR U_5E9A +ENCODING 24218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +2FC0 +2240 +3FE0 +2240 +2FC0 +2500 +4880 +B060 +ENDCHAR +STARTCHAR U_5E9B +ENCODING 24219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +4480 +54A0 +57C0 +5480 +5480 +54A0 +96A0 +B8E0 +ENDCHAR +STARTCHAR U_5E9C +ENCODING 24220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4440 +4840 +4BE0 +5840 +6A40 +4940 +4840 +8940 +8880 +ENDCHAR +STARTCHAR U_5E9D +ENCODING 24221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4400 +4F80 +4880 +5500 +4200 +4D00 +72C0 +4C00 +8300 +ENDCHAR +STARTCHAR U_5E9E +ENCODING 24222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2280 +2240 +3FE0 +2220 +2540 +2580 +2520 +4B20 +B4E0 +ENDCHAR +STARTCHAR U_5E9F +ENCODING 24223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2A80 +2A40 +3FE0 +2400 +27C0 +2A40 +3180 +4240 +8C20 +ENDCHAR +STARTCHAR U_5EA0 +ENCODING 24224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2880 +2500 +3FE0 +2200 +3FC0 +2200 +3FE0 +4200 +8200 +ENDCHAR +STARTCHAR U_5EA1 +ENCODING 24225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4400 +7FC0 +4400 +4A40 +5A80 +6900 +4880 +4C60 +8800 +ENDCHAR +STARTCHAR U_5EA2 +ENCODING 24226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FE0 +4480 +4840 +4FE0 +4200 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5EA3 +ENCODING 24227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +3540 +2D80 +2500 +2D80 +3540 +2520 +4920 +90E0 +ENDCHAR +STARTCHAR U_5EA4 +ENCODING 24228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +7FE0 +4080 +5FE0 +4880 +8480 +8380 +ENDCHAR +STARTCHAR U_5EA5 +ENCODING 24229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +4880 +4FE0 +5880 +6980 +4AC0 +4CA0 +8880 +8880 +ENDCHAR +STARTCHAR U_5EA6 +ENCODING 24230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FC0 +4900 +4F00 +4000 +5F80 +4900 +8600 +B9C0 +ENDCHAR +STARTCHAR U_5EA7 +ENCODING 24231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4A80 +4A80 +5740 +6220 +5FC0 +4200 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5EA8 +ENCODING 24232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4240 +5FC0 +4280 +7FE0 +4400 +4F80 +5100 +AFC0 +8200 +ENDCHAR +STARTCHAR U_5EA9 +ENCODING 24233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +4880 +5740 +6220 +5FC0 +4700 +4A80 +5240 +8600 +ENDCHAR +STARTCHAR U_5EAA +ENCODING 24234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4BE0 +4D40 +7940 +4880 +A940 +9220 +ENDCHAR +STARTCHAR U_5EAB +ENCODING 24235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +BFE0 +8200 +ENDCHAR +STARTCHAR U_5EAC +ENCODING 24236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +4880 +7FE0 +5480 +5700 +54C0 +5720 +5420 +A3E0 +ENDCHAR +STARTCHAR U_5EAD +ENCODING 24237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +7BE0 +5080 +7BE0 +4880 +6880 +53E0 +9000 +AFE0 +ENDCHAR +STARTCHAR U_5EAE +ENCODING 24238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +7FE0 +4500 +5FC0 +5540 +59C0 +5740 +9040 +9FC0 +ENDCHAR +STARTCHAR U_5EAF +ENCODING 24239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4280 +7FE0 +4200 +5FC0 +5240 +5FC0 +5240 +5FC0 +9240 +ENDCHAR +STARTCHAR U_5EB0 +ENCODING 24240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5080 +4900 +7FC0 +4900 +7FE0 +4900 +4900 +9100 +A100 +ENDCHAR +STARTCHAR U_5EB1 +ENCODING 24241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +7FE0 +5440 +6FA0 +5480 +8300 +9CE0 +ENDCHAR +STARTCHAR U_5EB2 +ENCODING 24242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +4A40 +4A40 +56A0 +6700 +4A80 +9240 +A220 +ENDCHAR +STARTCHAR U_5EB3 +ENCODING 24243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +5FC0 +5240 +5FC0 +5240 +5FC0 +4900 +BFE0 +8100 +ENDCHAR +STARTCHAR U_5EB4 +ENCODING 24244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +5FE0 +4480 +7FE0 +4000 +4FC0 +4940 +8A40 +8FC0 +ENDCHAR +STARTCHAR U_5EB5 +ENCODING 24245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +7FE0 +5280 +5FC0 +72A0 +5F80 +52A0 +8220 +81E0 +ENDCHAR +STARTCHAR U_5EB6 +ENCODING 24246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +4480 +5FE0 +4480 +4780 +4000 +5540 +92A0 +A2A0 +ENDCHAR +STARTCHAR U_5EB7 +ENCODING 24247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4240 +7FE0 +4240 +5FC0 +5240 +8A80 +B660 +ENDCHAR +STARTCHAR U_5EB8 +ENCODING 24248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4FC0 +4240 +5FE0 +4240 +5FC0 +5240 +5FC0 +9240 +92C0 +ENDCHAR +STARTCHAR U_5EB9 +ENCODING 24249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4FC0 +4840 +4FC0 +4900 +9080 +A060 +ENDCHAR +STARTCHAR U_5EBA +ENCODING 24250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +5540 +68A0 +5FC0 +4200 +7FE0 +4700 +4A80 +B260 +ENDCHAR +STARTCHAR U_5EBB +ENCODING 24251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4900 +4F00 +4000 +4880 +4880 +5540 +A220 +ENDCHAR +STARTCHAR U_5EBC +ENCODING 24252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +53E0 +5080 +5BE0 +52A0 +52A0 +5AA0 +6140 +8220 +ENDCHAR +STARTCHAR U_5EBD +ENCODING 24253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A80 +4F80 +4A80 +4F80 +4200 +5FC0 +5240 +53C0 +9C40 +ENDCHAR +STARTCHAR U_5EBE +ENCODING 24254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5AC0 +5240 +5AC0 +5240 +5FC0 +4500 +8880 +B060 +ENDCHAR +STARTCHAR U_5EBF +ENCODING 24255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +5FC0 +5240 +5FC0 +5240 +5240 +9FC0 +ENDCHAR +STARTCHAR U_5EC0 +ENCODING 24256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +5240 +4D80 +5040 +67A0 +4480 +4300 +8CC0 +ENDCHAR +STARTCHAR U_5EC1 +ENCODING 24257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5EA0 +52A0 +5AA0 +56A0 +52A0 +5E20 +9420 +A2E0 +ENDCHAR +STARTCHAR U_5EC2 +ENCODING 24258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +49E0 +7F20 +49E0 +4D20 +5BE0 +6920 +89E0 +8920 +ENDCHAR +STARTCHAR U_5EC3 +ENCODING 24259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4140 +5D80 +54A0 +4840 +77A0 +4500 +5FE0 +8500 +19E0 +ENDCHAR +STARTCHAR U_5EC4 +ENCODING 24260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5D40 +5540 +5D60 +5400 +5FE0 +5540 +5A80 +B140 +8220 +ENDCHAR +STARTCHAR U_5EC5 +ENCODING 24261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FC0 +4200 +7FE0 +4880 +5FC0 +5540 +9540 +BFE0 +ENDCHAR +STARTCHAR U_5EC6 +ENCODING 24262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +5FC0 +5240 +5FC0 +5240 +5FC0 +4740 +8AA0 +B1E0 +ENDCHAR +STARTCHAR U_5EC7 +ENCODING 24263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4400 +59E0 +54A0 +5560 +5FC0 +5240 +5FC0 +9240 +9FC0 +ENDCHAR +STARTCHAR U_5EC8 +ENCODING 24264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +5FE0 +4840 +4FC0 +4840 +4FC0 +5480 +A300 +9CE0 +ENDCHAR +STARTCHAR U_5EC9 +ENCODING 24265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +5FE0 +4540 +7FE0 +4540 +5FC0 +4D80 +9540 +A520 +ENDCHAR +STARTCHAR U_5ECA +ENCODING 24266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +5EE0 +52A0 +5EA0 +52C0 +5EA0 +54A0 +96E0 +9A80 +ENDCHAR +STARTCHAR U_5ECB +ENCODING 24267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5BC0 +5240 +5FC0 +4200 +5FC0 +4880 +8700 +B8E0 +ENDCHAR +STARTCHAR U_5ECC +ENCODING 24268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FC0 +4940 +7FE0 +4800 +5FE0 +5520 +AAA0 +AAC0 +ENDCHAR +STARTCHAR U_5ECD +ENCODING 24269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4800 +7FE0 +52A0 +7FA0 +40C0 +5EA0 +52A0 +52E0 +9E80 +ENDCHAR +STARTCHAR U_5ECE +ENCODING 24270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +57E0 +5240 +5FC0 +5240 +53C0 +5640 +5BC0 +8660 +ENDCHAR +STARTCHAR U_5ECF +ENCODING 24271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4800 +5DC0 +5540 +5D60 +5600 +5DE0 +5140 +9480 +9D60 +ENDCHAR +STARTCHAR U_5ED0 +ENCODING 24272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4800 +5DE0 +5440 +5D40 +57E0 +5CC0 +58C0 +9540 +9A60 +ENDCHAR +STARTCHAR U_5ED1 +ENCODING 24273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5240 +5240 +7FE0 +4200 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_5ED2 +ENCODING 24274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7EE0 +48A0 +7FA0 +48A0 +7EA0 +5240 +A2A0 +A520 +ENDCHAR +STARTCHAR U_5ED3 +ENCODING 24275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +7FE0 +52A0 +52C0 +7EA0 +48A0 +7EA0 +88E0 +9880 +ENDCHAR +STARTCHAR U_5ED4 +ENCODING 24276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +7FE0 +5240 +5FC0 +5240 +7FE0 +4480 +8700 +B8E0 +ENDCHAR +STARTCHAR U_5ED5 +ENCODING 24277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4140 +5EA0 +57C0 +5840 +55E0 +5400 +5BE0 +9140 +93A0 +ENDCHAR +STARTCHAR U_5ED6 +ENCODING 24278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +4CC0 +5540 +4700 +78E0 +4300 +5C40 +8380 +9C00 +ENDCHAR +STARTCHAR U_5ED7 +ENCODING 24279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +7FE0 +5540 +7760 +4000 +7FE0 +6220 +5FC0 +9240 +ENDCHAR +STARTCHAR U_5ED8 +ENCODING 24280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FE0 +5280 +5FE0 +52A0 +5FE0 +5B40 +ADA0 +AEE0 +ENDCHAR +STARTCHAR U_5ED9 +ENCODING 24281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5FC0 +5240 +7FE0 +4480 +7FE0 +4000 +8D80 +B060 +ENDCHAR +STARTCHAR U_5EDA +ENCODING 24282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4840 +7E40 +49E0 +4840 +7F40 +52C0 +5E40 +9440 +BEC0 +ENDCHAR +STARTCHAR U_5EDB +ENCODING 24283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5240 +5FC0 +5240 +7FE0 +4A80 +5240 +6FA0 +8200 +9FE0 +ENDCHAR +STARTCHAR U_5EDC +ENCODING 24284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5040 +5FC0 +5200 +5FE0 +5440 +5FC0 +5440 +57C0 +A440 +ENDCHAR +STARTCHAR U_5EDD +ENCODING 24285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5420 +7FC0 +5500 +5DE0 +5540 +5540 +BF40 +9540 +2240 +ENDCHAR +STARTCHAR U_5EDE +ENCODING 24286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +55E0 +7E20 +4880 +7C80 +4A80 +AD40 +9A20 +3E20 +ENDCHAR +STARTCHAR U_5EDF +ENCODING 24287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +7FE0 +52A0 +5EE0 +52A0 +5EE0 +48A0 +7F20 +8960 +ENDCHAR +STARTCHAR U_5EE0 +ENCODING 24288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8880 +AA80 +9CE0 +BFA0 +A2A0 +AEA0 +AA40 +AEA0 +A720 +ENDCHAR +STARTCHAR U_5EE1 +ENCODING 24289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +5FE0 +7540 +5540 +7FE0 +5540 +7FE0 +9540 +AAA0 +ENDCHAR +STARTCHAR U_5EE2 +ENCODING 24290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5540 +48A0 +7DC0 +4520 +5E00 +51C0 +5D40 +8480 +9B60 +ENDCHAR +STARTCHAR U_5EE3 +ENCODING 24291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4480 +5FC0 +4480 +7FE0 +5240 +5FC0 +5240 +5FC0 +B060 +ENDCHAR +STARTCHAR U_5EE4 +ENCODING 24292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +5FC0 +4200 +5D20 +55C0 +5500 +9DE0 +ENDCHAR +STARTCHAR U_5EE5 +ENCODING 24293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4D80 +5040 +7FE0 +5540 +5FC0 +4880 +4F80 +8880 +8F80 +ENDCHAR +STARTCHAR U_5EE6 +ENCODING 24294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8080 +BFE0 +A540 +BC80 +A3E0 +BC80 +D7E0 +9480 +9C80 +ENDCHAR +STARTCHAR U_5EE7 +ENCODING 24295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5240 +6AA0 +7FE0 +5540 +5740 +9040 +9FC0 +ENDCHAR +STARTCHAR U_5EE8 +ENCODING 24296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +52A0 +5FA0 +55A0 +5F40 +55E0 +5F40 +55E0 +9540 +A340 +ENDCHAR +STARTCHAR U_5EE9 +ENCODING 24297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +7FE0 +5540 +5240 +5FC0 +4200 +5FE0 +8A80 +B260 +ENDCHAR +STARTCHAR U_5EEA +ENCODING 24298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +7FE0 +5740 +5040 +5FC0 +4000 +7FE0 +8A80 +B660 +ENDCHAR +STARTCHAR U_5EEB +ENCODING 24299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +5F60 +5520 +5F60 +5520 +56A0 +5D40 +56A0 +A540 +ENDCHAR +STARTCHAR U_5EEC +ENCODING 24300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FE0 +5240 +52A0 +57E0 +5540 +6FE0 +AAA0 +9FE0 +ENDCHAR +STARTCHAR U_5EED +ENCODING 24301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4480 +5BE0 +4880 +7FE0 +4A20 +5FE0 +6A20 +4BE0 +8A20 +ENDCHAR +STARTCHAR U_5EEE +ENCODING 24302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +5DC0 +5540 +5DC0 +5540 +7FE0 +4480 +8300 +9CE0 +ENDCHAR +STARTCHAR U_5EEF +ENCODING 24303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +7E80 +6BE0 +7E80 +6BE0 +7E80 +55E0 +AA80 +AA80 +ENDCHAR +STARTCHAR U_5EF0 +ENCODING 24304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4080 +7FE0 +5540 +5EA0 +57E0 +5C00 +5540 +5F20 +A5E0 +ENDCHAR +STARTCHAR U_5EF1 +ENCODING 24305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +6B40 +7DE0 +4540 +7DE0 +5540 +7DE0 +A140 +BDE0 +ENDCHAR +STARTCHAR U_5EF2 +ENCODING 24306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +9540 +9DC0 +9540 +BFE0 +A540 +BFC0 +AB40 +ADA0 +5DE0 +ENDCHAR +STARTCHAR U_5EF3 +ENCODING 24307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A880 +BBE0 +AAA0 +FAA0 +AFE0 +A940 +FAA0 +AD40 +F9C0 +ENDCHAR +STARTCHAR U_5EF4 +ENCODING 24308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +1000 +2000 +2000 +7800 +0800 +8800 +5000 +2000 +3000 +CFE0 +ENDCHAR +STARTCHAR U_5EF5 +ENCODING 24309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F2A0 +12A0 +22A0 +7540 +1540 +92A0 +62A0 +22A0 +5800 +87E0 +ENDCHAR +STARTCHAR U_5EF6 +ENCODING 24310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +1780 +2080 +4080 +F4E0 +1480 +9480 +5480 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5EF7 +ENCODING 24311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +1780 +2100 +4100 +FFE0 +1100 +9100 +57C0 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5EF8 +ENCODING 24312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7100 +27C0 +4540 +77C0 +1540 +9540 +57C0 +3440 +4800 +87E0 +ENDCHAR +STARTCHAR U_5EF9 +ENCODING 24313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +77C0 +1440 +2440 +47C0 +7440 +1440 +57C0 +2440 +5800 +87E0 +ENDCHAR +STARTCHAR U_5EFA +ENCODING 24314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +2240 +5FE0 +E240 +2FC0 +A200 +6FE0 +2200 +5200 +8FE0 +ENDCHAR +STARTCHAR U_5EFB +ENCODING 24315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +EFE0 +2820 +4BA0 +EAA0 +2AA0 +ABA0 +A820 +4FE0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_5EFC +ENCODING 24316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2280 +4280 +EFE0 +2AA0 +2AA0 +ACE0 +A820 +4FE0 +A000 +1FE0 +ENDCHAR +STARTCHAR U_5EFD +ENCODING 24317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E000 +2FE0 +2AA0 +4BA0 +EAA0 +2BA0 +AAA0 +6AA0 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_5EFE +ENCODING 24318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +1080 +FFE0 +1080 +1080 +2080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_5EFF +ENCODING 24319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +1080 +FFE0 +1080 +1080 +1080 +1080 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_5F00 +ENCODING 24320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +1100 +1100 +1100 +FFE0 +1100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_5F01 +ENCODING 24321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +2080 +7FC0 +1140 +1100 +FFE0 +1100 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_5F02 +ENCODING 24322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2020 +3FE0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F03 +ENCODING 24323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0800 +1080 +3FC0 +1100 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F04 +ENCODING 24324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +FFE0 +0000 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_5F05 +ENCODING 24325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +DFE0 +0480 +0880 +7700 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_5F06 +ENCODING 24326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +1100 +7FC0 +2080 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F07 +ENCODING 24327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +3F80 +C060 +3F80 +2080 +3F80 +1100 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_5F08 +ENCODING 24328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4940 +8920 +1120 +6B00 +0900 +FFE0 +0900 +1100 +6100 +ENDCHAR +STARTCHAR U_5F09 +ENCODING 24329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +7FE0 +0900 +7900 +4FC0 +8800 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_5F0A +ENCODING 24330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9300 +5500 +FDE0 +9720 +BCC0 +D720 +1100 +0900 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_5F0B +ENCODING 24331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +07E0 +FC00 +0400 +0200 +0200 +0120 +00A0 +0060 +ENDCHAR +STARTCHAR U_5F0C +ENCODING 24332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +04C0 +0400 +FFE0 +0200 +0200 +0100 +0100 +FCA0 +0060 +0020 +ENDCHAR +STARTCHAR U_5F0D +ENCODING 24333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0280 +0240 +FFE0 +0200 +7A00 +0100 +0100 +1CA0 +E060 +0020 +ENDCHAR +STARTCHAR U_5F0E +ENCODING 24334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +0400 +FA00 +0200 +7100 +0120 +FCA0 +0040 +ENDCHAR +STARTCHAR U_5F0F +ENCODING 24335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +0200 +FFE0 +0200 +7A00 +1200 +1100 +1120 +18A0 +E060 +ENDCHAR +STARTCHAR U_5F10 +ENCODING 24336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7C80 +0440 +FFE0 +0400 +0400 +7A00 +0200 +1D00 +E0A0 +0040 +ENDCHAR +STARTCHAR U_5F11 +ENCODING 24337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +27E0 +5080 +AF80 +FA80 +2280 +7240 +AB40 +2C20 +6020 +ENDCHAR +STARTCHAR U_5F12 +ENCODING 24338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +90C0 +60A0 +9FE0 +2880 +F880 +2780 +3280 +6A40 +A340 +2E20 +2020 +ENDCHAR +STARTCHAR U_5F13 +ENCODING 24339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0080 +3F80 +2000 +4000 +7F80 +0080 +0080 +0080 +0500 +0200 +ENDCHAR +STARTCHAR U_5F14 +ENCODING 24340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +0880 +0880 +7F80 +4800 +FFC0 +0840 +0840 +0940 +0880 +0800 +ENDCHAR +STARTCHAR U_5F15 +ENCODING 24341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +0440 +0440 +7C40 +4040 +FC40 +0440 +0440 +0440 +2840 +1040 +ENDCHAR +STARTCHAR U_5F16 +ENCODING 24342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +1F80 +2000 +2000 +3F80 +0080 +0080 +0500 +0200 +FFE0 +ENDCHAR +STARTCHAR U_5F17 +ENCODING 24343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +FF80 +1280 +7F80 +5200 +FFC0 +1240 +1240 +2380 +C200 +ENDCHAR +STARTCHAR U_5F18 +ENCODING 24344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +1080 +1080 +F100 +8100 +8100 +F240 +1240 +1240 +A7E0 +4020 +ENDCHAR +STARTCHAR U_5F19 +ENCODING 24345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +1100 +F100 +8FE0 +8100 +F100 +1100 +1100 +A500 +4200 +ENDCHAR +STARTCHAR U_5F1A +ENCODING 24346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4200 +2400 +FF00 +0900 +FF00 +8800 +FF80 +0880 +0880 +0B00 +0800 +ENDCHAR +STARTCHAR U_5F1B +ENCODING 24347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1500 +1540 +F5E0 +8F40 +8540 +F540 +15C0 +1520 +A420 +43E0 +ENDCHAR +STARTCHAR U_5F1C +ENCODING 24348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +0820 +0820 +79E0 +4100 +79E0 +0820 +0820 +0820 +5140 +2080 +ENDCHAR +STARTCHAR U_5F1D +ENCODING 24349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1540 +1540 +7540 +47C0 +F440 +1400 +1400 +1420 +9420 +63E0 +ENDCHAR +STARTCHAR U_5F1E +ENCODING 24350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +0A00 +0BE0 +7D40 +4100 +7900 +0900 +0A80 +0A80 +5460 +2840 +ENDCHAR +STARTCHAR U_5F1F +ENCODING 24351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +0440 +3FC0 +4400 +7FE0 +1420 +24A0 +C440 +0400 +ENDCHAR +STARTCHAR U_5F20 +ENCODING 24352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +2440 +2480 +E700 +8400 +9FE0 +E500 +2500 +2480 +A640 +4420 +ENDCHAR +STARTCHAR U_5F21 +ENCODING 24353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +1400 +1400 +F780 +8480 +F480 +1780 +1400 +1400 +A7C0 +4000 +ENDCHAR +STARTCHAR U_5F22 +ENCODING 24354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1520 +1520 +F7E0 +8100 +8FE0 +F440 +1280 +1100 +9280 +6C60 +ENDCHAR +STARTCHAR U_5F23 +ENCODING 24355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +1240 +1440 +F5E0 +8C40 +F640 +1540 +1440 +1440 +5540 +2480 +ENDCHAR +STARTCHAR U_5F24 +ENCODING 24356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +1780 +1480 +F480 +87E0 +8480 +F480 +1480 +1540 +A720 +4CA0 +ENDCHAR +STARTCHAR U_5F25 +ENCODING 24357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +1400 +17E0 +F820 +8100 +8100 +F540 +1520 +1920 +A100 +4300 +ENDCHAR +STARTCHAR U_5F26 +ENCODING 24358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1100 +1FE0 +F100 +8240 +8780 +F080 +1100 +1240 +AFA0 +4420 +ENDCHAR +STARTCHAR U_5F27 +ENCODING 24359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +1740 +1540 +F540 +8540 +8540 +F540 +1520 +15A0 +A960 +4A20 +ENDCHAR +STARTCHAR U_5F28 +ENCODING 24360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1120 +1120 +F220 +84A0 +8840 +F7E0 +1420 +1420 +A7E0 +4420 +ENDCHAR +STARTCHAR U_5F29 +ENCODING 24361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +5180 +2A40 +7FA0 +0080 +3F80 +2000 +7FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F2A +ENCODING 24362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1040 +1080 +F180 +8260 +8420 +F7E0 +1100 +1100 +A100 +4FE0 +ENDCHAR +STARTCHAR U_5F2B +ENCODING 24363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1500 +7500 +47C0 +4440 +7440 +17C0 +1500 +1500 +A7E0 +4000 +ENDCHAR +STARTCHAR U_5F2C +ENCODING 24364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2880 +E880 +8AC0 +8A40 +EA40 +2AC0 +2880 +2880 +AFE0 +4000 +ENDCHAR +STARTCHAR U_5F2D +ENCODING 24365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1240 +1240 +F3C0 +8240 +8240 +F3C0 +1240 +1260 +A7C0 +4040 +ENDCHAR +STARTCHAR U_5F2E +ENCODING 24366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FC0 +0800 +FFE0 +2180 +DF60 +1000 +3F80 +0080 +0480 +0300 +ENDCHAR +STARTCHAR U_5F2F +ENCODING 24367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2940 +4920 +BFC0 +0040 +7F80 +4000 +7FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F30 +ENCODING 24368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F4A0 +12C0 +1080 +F7E0 +8420 +87E0 +F420 +17E0 +1420 +A420 +44E0 +ENDCHAR +STARTCHAR U_5F31 +ENCODING 24369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +FBE0 +8200 +FBE0 +8A20 +4920 +38E0 +CB20 +0820 +71C0 +ENDCHAR +STARTCHAR U_5F32 +ENCODING 24370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +13C0 +F000 +87E0 +8420 +F7E0 +1420 +17E0 +A420 +4460 +ENDCHAR +STARTCHAR U_5F33 +ENCODING 24371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1540 +1540 +FA80 +8540 +8540 +F000 +17C0 +1100 +A100 +4FE0 +ENDCHAR +STARTCHAR U_5F34 +ENCODING 24372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +2440 +E7C0 +8000 +EFC0 +2080 +3FE0 +2100 +A500 +4200 +ENDCHAR +STARTCHAR U_5F35 +ENCODING 24373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1400 +17C0 +F400 +87C0 +8400 +FFE0 +14A0 +1440 +A520 +4620 +ENDCHAR +STARTCHAR U_5F36 +ENCODING 24374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +1FE0 +F000 +87C0 +8440 +F7C0 +1100 +1540 +A920 +4B20 +ENDCHAR +STARTCHAR U_5F37 +ENCODING 24375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1240 +1420 +F7E0 +8100 +87C0 +F540 +17C0 +1120 +51E0 +2E20 +ENDCHAR +STARTCHAR U_5F38 +ENCODING 24376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2AA0 +EEE0 +8AA0 +8AA0 +EEE0 +2AA0 +2AA0 +B320 +4660 +ENDCHAR +STARTCHAR U_5F39 +ENCODING 24377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +2280 +2FE0 +E920 +8FE0 +8920 +EFE0 +2100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_5F3A +ENCODING 24378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +2440 +27C0 +E100 +8FE0 +8920 +E920 +2FC0 +2120 +21E0 +CF20 +ENDCHAR +STARTCHAR U_5F3B +ENCODING 24379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2420 +3F20 +F560 +9540 +9B40 +FB60 +3120 +3120 +BFA0 +4040 +ENDCHAR +STARTCHAR U_5F3C +ENCODING 24380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2420 +2E20 +EAE0 +8A80 +8E80 +EAE0 +2A20 +2E20 +AAA0 +4040 +ENDCHAR +STARTCHAR U_5F3D +ENCODING 24381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +1FE0 +1540 +F5C0 +8400 +F7E0 +1100 +1FE0 +1380 +A540 +4920 +ENDCHAR +STARTCHAR U_5F3E +ENCODING 24382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A20 +E540 +2FC0 +EA40 +8FC0 +EA40 +2FC0 +2200 +3FE0 +A200 +4200 +ENDCHAR +STARTCHAR U_5F3F +ENCODING 24383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7F80 +1100 +FFE0 +2F80 +D060 +1F00 +0100 +0600 +ENDCHAR +STARTCHAR U_5F40 +ENCODING 24384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +2140 +FD60 +8E00 +7BE0 +4240 +7940 +0880 +4940 +3620 +ENDCHAR +STARTCHAR U_5F41 +ENCODING 24385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1740 +1540 +7740 +4040 +4FE0 +7540 +1740 +1040 +A140 +4080 +ENDCHAR +STARTCHAR U_5F42 +ENCODING 24386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A40 +2A80 +FFE0 +1500 +77E0 +4900 +77E0 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_5F43 +ENCODING 24387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2920 +2FE0 +E920 +8FE0 +8540 +EFE0 +2100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_5F44 +ENCODING 24388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2800 +2BC0 +EA40 +8BC0 +8800 +EBE0 +2AA0 +2BE0 +A800 +4FE0 +ENDCHAR +STARTCHAR U_5F45 +ENCODING 24389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E240 +2FE0 +2000 +EEA0 +8AA0 +EEA0 +2A40 +2FE0 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_5F46 +ENCODING 24390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +B540 +EC80 +BFC0 +00A0 +3F80 +2000 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F47 +ENCODING 24391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +27C0 +2140 +EFE0 +8140 +8BA0 +ED60 +2FE0 +2920 +AD60 +53A0 +ENDCHAR +STARTCHAR U_5F48 +ENCODING 24392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2FE0 +E920 +8FE0 +8920 +EFE0 +2100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_5F49 +ENCODING 24393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7C0 +1280 +1FE0 +F100 +87C0 +F540 +17C0 +1540 +97C0 +6C60 +ENDCHAR +STARTCHAR U_5F4A +ENCODING 24394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1540 +17C0 +F540 +8FE0 +8000 +F7C0 +1540 +17C0 +A540 +4FE0 +ENDCHAR +STARTCHAR U_5F4B +ENCODING 24395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2AA0 +2FE0 +E000 +9FE0 +8840 +EFE0 +2540 +2C80 +B540 +4E20 +ENDCHAR +STARTCHAR U_5F4C +ENCODING 24396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +2920 +FFE0 +8920 +8DA0 +EB60 +2DA0 +2B60 +ADA0 +4960 +ENDCHAR +STARTCHAR U_5F4D +ENCODING 24397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +2A40 +EFE0 +8A40 +EFE0 +2940 +2FC0 +2940 +AFC0 +5660 +ENDCHAR +STARTCHAR U_5F4E +ENCODING 24398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +A1C0 +CEA0 +51C0 +FEA0 +AB40 +3F80 +2000 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_5F4F +ENCODING 24399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +2AA0 +2EE0 +EAA0 +8FE0 +8900 +EFC0 +2900 +2FE0 +A300 +5CE0 +ENDCHAR +STARTCHAR U_5F50 +ENCODING 24400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +FF80 +0080 +0080 +0080 +7F80 +0080 +0080 +0080 +FF80 +ENDCHAR +STARTCHAR U_5F51 +ENCODING 24401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +1000 +1F00 +1100 +1100 +2100 +7E00 +0200 +0200 +FFE0 +ENDCHAR +STARTCHAR U_5F52 +ENCODING 24402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +17C0 +9040 +9040 +9040 +97C0 +9040 +9040 +2040 +4FC0 +8040 +ENDCHAR +STARTCHAR U_5F53 +ENCODING 24403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +8880 +4900 +2A00 +FF80 +0080 +0080 +7F80 +0080 +0080 +FF80 +ENDCHAR +STARTCHAR U_5F54 +ENCODING 24404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1100 +3F00 +0200 +FFE0 +4440 +2680 +1D00 +2480 +D460 +0800 +ENDCHAR +STARTCHAR U_5F55 +ENCODING 24405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +FFE0 +2440 +1680 +0D00 +3480 +C460 +0C00 +ENDCHAR +STARTCHAR U_5F56 +ENCODING 24406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +3F00 +0100 +FFE0 +1440 +6A80 +1700 +6A80 +1240 +6C20 +ENDCHAR +STARTCHAR U_5F57 +ENCODING 24407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +FBC0 +2100 +FBE0 +2100 +7FC0 +0040 +3FC0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_5F58 +ENCODING 24408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +3F00 +0100 +FFE0 +8880 +EFA0 +94C0 +9F80 +CAA0 +9160 +ENDCHAR +STARTCHAR U_5F59 +ENCODING 24409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2100 +FFE0 +8020 +BFA0 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_5F5A +ENCODING 24410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +FFE0 +A4A0 +3F80 +2480 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_5F5B +ENCODING 24411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +7FC0 +1280 +5440 +FFA0 +3A80 +5580 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_5F5C +ENCODING 24412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +1100 +FFE0 +5580 +FE40 +5BE0 +9540 +2280 +FFE0 +2100 +4100 +ENDCHAR +STARTCHAR U_5F5D +ENCODING 24413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +FFE0 +5480 +3940 +FFA0 +39C0 +56A0 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_5F5E +ENCODING 24414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +FFE0 +5680 +3940 +FFE0 +39C0 +56A0 +FFE0 +1080 +2080 +ENDCHAR +STARTCHAR U_5F5F +ENCODING 24415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +0BE0 +7E80 +0BC0 +FA80 +13C0 +FA80 +97C0 +5280 +1100 +36E0 +ENDCHAR +STARTCHAR U_5F60 +ENCODING 24416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +0FE0 +7A80 +07C0 +FA80 +2FC0 +FA80 +17C0 +FA80 +5100 +36E0 +ENDCHAR +STARTCHAR U_5F61 +ENCODING 24417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +02 +04 +08 +32 +C4 +08 +31 +C2 +04 +18 +E0 +ENDCHAR +STARTCHAR U_5F62 +ENCODING 24418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +2440 +2480 +2420 +FE40 +2480 +2500 +2420 +2440 +4480 +8700 +ENDCHAR +STARTCHAR U_5F63 +ENCODING 24419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2080 +FB00 +5040 +5080 +5300 +5040 +2080 +3300 +4C00 +83E0 +ENDCHAR +STARTCHAR U_5F64 +ENCODING 24420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3E00 +2220 +3240 +2A80 +2220 +FF40 +2280 +2220 +2240 +4A80 +8500 +ENDCHAR +STARTCHAR U_5F65 +ENCODING 24421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FC0 +0A80 +0500 +7FE0 +4300 +5CC0 +4300 +5CC0 +4300 +9C00 +ENDCHAR +STARTCHAR U_5F66 +ENCODING 24422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FC0 +1080 +0900 +7FE0 +4300 +5CC0 +4300 +5CC0 +4300 +9C00 +ENDCHAR +STARTCHAR U_5F67 +ENCODING 24423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0500 +7680 +5520 +7A40 +0680 +3920 +C2A0 +0C60 +ENDCHAR +STARTCHAR U_5F68 +ENCODING 24424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FE20 +0040 +EEA0 +AA20 +EE40 +AA80 +AA20 +AA20 +AA40 +AA80 +ENDCHAR +STARTCHAR U_5F69 +ENCODING 24425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C40 +F280 +5500 +2820 +1040 +FE80 +3900 +5420 +9240 +1080 +1300 +ENDCHAR +STARTCHAR U_5F6A +ENCODING 24426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E20 +1040 +7EA0 +5240 +7C80 +5220 +5E40 +4080 +5D20 +9420 +A3E0 +ENDCHAR +STARTCHAR U_5F6B +ENCODING 24427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +9280 +BB00 +9220 +FE40 +8280 +BB00 +AA20 +BA40 +8280 +8700 +ENDCHAR +STARTCHAR U_5F6C +ENCODING 24428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2220 +FF40 +2280 +7620 +6B40 +AA80 +A220 +2240 +2280 +2300 +ENDCHAR +STARTCHAR U_5F6D +ENCODING 24429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +1080 +7D20 +0040 +7C80 +4500 +7C20 +2840 +2C80 +F300 +ENDCHAR +STARTCHAR U_5F6E +ENCODING 24430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +AA80 +4520 +9240 +2880 +4500 +FE20 +4440 +4480 +7F00 +ENDCHAR +STARTCHAR U_5F6F +ENCODING 24431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2840 +FE80 +AB20 +FE40 +0080 +7D00 +0020 +FE40 +5480 +B300 +ENDCHAR +STARTCHAR U_5F70 +ENCODING 24432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FE40 +2880 +FF20 +4440 +7C80 +4500 +7C20 +1040 +FE80 +1100 +ENDCHAR +STARTCHAR U_5F71 +ENCODING 24433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4440 +7C80 +4520 +7C40 +1080 +FF00 +4420 +7C40 +5480 +B300 +ENDCHAR +STARTCHAR U_5F72 +ENCODING 24434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7720 +0020 +7740 +5580 +3F20 +5440 +7F80 +5520 +7F40 +5480 +9F00 +ENDCHAR +STARTCHAR U_5F73 +ENCODING 24435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +20 +40 +88 +10 +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR U_5F74 +ENCODING 24436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +43E0 +9420 +2820 +6220 +A120 +2020 +2020 +2140 +2080 +ENDCHAR +STARTCHAR U_5F75 +ENCODING 24437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2500 +4560 +97A0 +2D20 +6520 +A520 +2560 +2500 +2420 +23E0 +ENDCHAR +STARTCHAR U_5F76 +ENCODING 24438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +2440 +4440 +9480 +25E0 +6420 +A620 +2540 +2880 +2940 +3620 +ENDCHAR +STARTCHAR U_5F77 +ENCODING 24439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4FE0 +9200 +2200 +63C0 +A240 +2240 +2240 +2540 +2880 +ENDCHAR +STARTCHAR U_5F78 +ENCODING 24440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4500 +8480 +2480 +4840 +CA40 +5220 +4400 +4480 +5FC0 +4840 +ENDCHAR +STARTCHAR U_5F79 +ENCODING 24441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +4480 +8480 +08E0 +3000 +4780 +C480 +4300 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_5F7A +ENCODING 24442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +27C0 +4100 +8100 +1100 +2100 +67C0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F7B +ENCODING 24443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +4BE0 +88A0 +2CA0 +58A0 +C8A0 +4D20 +4920 +4220 +44A0 +4840 +ENDCHAR +STARTCHAR U_5F7C +ENCODING 24444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +8920 +2900 +4900 +CFC0 +4C40 +4A80 +5100 +5280 +6C60 +ENDCHAR +STARTCHAR U_5F7D +ENCODING 24445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4F00 +8900 +2900 +4FE0 +C900 +4900 +4880 +4AA0 +4D60 +4920 +ENDCHAR +STARTCHAR U_5F7E +ENCODING 24446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4500 +8880 +3440 +4220 +DFC0 +4080 +4100 +4600 +4200 +4100 +ENDCHAR +STARTCHAR U_5F7F +ENCODING 24447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2280 +57E0 +A2A0 +6FE0 +AA80 +2FE0 +22A0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_5F80 +ENCODING 24448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4FE0 +9100 +2100 +6100 +A7C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F81 +ENCODING 24449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4100 +9100 +2100 +65E0 +A500 +2500 +2500 +2500 +3FE0 +ENDCHAR +STARTCHAR U_5F82 +ENCODING 24450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +4440 +9440 +27C0 +6440 +A440 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_5F83 +ENCODING 24451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2500 +4500 +97C0 +2900 +6100 +A7C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F84 +ENCODING 24452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2080 +4900 +9280 +2440 +6820 +A7C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F85 +ENCODING 24453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +47C0 +9100 +1FE0 +2080 +6FE0 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_5F86 +ENCODING 24454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4280 +8280 +1FE0 +2AA0 +6AA0 +AAA0 +2C60 +2820 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5F87 +ENCODING 24455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27E0 +4820 +97A0 +24A0 +67A0 +A4A0 +27A0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_5F88 +ENCODING 24456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +47C0 +9440 +27C0 +6520 +A540 +2480 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_5F89 +ENCODING 24457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +2280 +4FE0 +9100 +2100 +67C0 +A100 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_5F8A +ENCODING 24458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +5020 +9020 +37A0 +54A0 +D4A0 +57A0 +5020 +5020 +5FE0 +5020 +ENDCHAR +STARTCHAR U_5F8B +ENCODING 24459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5FC0 +8240 +3FE0 +4240 +DFC0 +4200 +5FC0 +4200 +7FE0 +4200 +ENDCHAR +STARTCHAR U_5F8C +ENCODING 24460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2480 +4700 +9240 +2FE0 +6420 +A7C0 +2C40 +3280 +2380 +2C60 +ENDCHAR +STARTCHAR U_5F8D +ENCODING 24461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +9100 +2FE0 +6100 +A100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F8E +ENCODING 24462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +4440 +97C0 +2000 +6FE0 +A100 +27C0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_5F8F +ENCODING 24463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +45C0 +9500 +2FE0 +4100 +C520 +4540 +4980 +4300 +5C00 +ENDCHAR +STARTCHAR U_5F90 +ENCODING 24464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4280 +9440 +2820 +67C0 +A100 +2FE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_5F91 +ENCODING 24465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +2540 +4540 +9A80 +2540 +6540 +A000 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5F92 +ENCODING 24466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +47C0 +9100 +2FE0 +6100 +A500 +25E0 +2500 +2B00 +30E0 +ENDCHAR +STARTCHAR U_5F93 +ENCODING 24467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +8100 +2100 +4500 +C5C0 +4500 +4500 +4B00 +50E0 +ENDCHAR +STARTCHAR U_5F94 +ENCODING 24468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2480 +4FE0 +9480 +2200 +6FC0 +A080 +2100 +2600 +2C00 +33E0 +ENDCHAR +STARTCHAR U_5F95 +ENCODING 24469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +9FC0 +3240 +4A80 +FFE0 +4700 +4A80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_5F96 +ENCODING 24470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2100 +4FE0 +9820 +27C0 +6000 +AFE0 +2100 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_5F97 +ENCODING 24471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +9440 +27C0 +6000 +A7E0 +2080 +2FE0 +2480 +2180 +ENDCHAR +STARTCHAR U_5F98 +ENCODING 24472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2280 +4EE0 +9280 +2280 +6EE0 +A280 +2280 +2EE0 +2280 +2280 +ENDCHAR +STARTCHAR U_5F99 +ENCODING 24473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2500 +45E0 +9500 +2FE0 +6100 +A500 +25E0 +2500 +2B00 +30E0 +ENDCHAR +STARTCHAR U_5F9A +ENCODING 24474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4200 +9FC0 +3AC0 +5740 +DFC0 +4700 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_5F9B +ENCODING 24475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2FE0 +4280 +9440 +2FE0 +6040 +A740 +2540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_5F9C +ENCODING 24476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2920 +4540 +9100 +2FE0 +6820 +ABA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_5F9D +ENCODING 24477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +97C0 +2440 +67C0 +A440 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_5F9E +ENCODING 24478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2240 +45A0 +9920 +2000 +6500 +A500 +25E0 +2500 +2B00 +31E0 +ENDCHAR +STARTCHAR U_5F9F +ENCODING 24479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +2920 +4920 +9BA0 +2920 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +3060 +ENDCHAR +STARTCHAR U_5FA0 +ENCODING 24480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +4FE0 +9540 +2540 +6BA0 +A120 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_5FA1 +ENCODING 24481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +24E0 +47A0 +9AA0 +2FA0 +62A0 +ABA0 +2AA0 +2BE0 +3C80 +2080 +ENDCHAR +STARTCHAR U_5FA2 +ENCODING 24482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +4280 +9FE0 +2280 +4F80 +C200 +4B80 +4A00 +5600 +63C0 +ENDCHAR +STARTCHAR U_5FA3 +ENCODING 24483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2280 +4FE0 +9280 +2FE0 +6000 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5FA4 +ENCODING 24484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +4940 +8FE0 +3140 +5BC0 +C900 +6FE0 +5100 +5900 +67E0 +ENDCHAR +STARTCHAR U_5FA5 +ENCODING 24485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4440 +87C0 +1440 +27C0 +6000 +AFE0 +2100 +25C0 +2B00 +30E0 +ENDCHAR +STARTCHAR U_5FA6 +ENCODING 24486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +4A20 +8A20 +2EE0 +4800 +CEE0 +48A0 +4EA0 +4840 +48A0 +4920 +ENDCHAR +STARTCHAR U_5FA7 +ENCODING 24487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4840 +9FC0 +2800 +4FE0 +CAA0 +5FE0 +5AA0 +6AA0 +4860 +ENDCHAR +STARTCHAR U_5FA8 +ENCODING 24488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +27C0 +4440 +97C0 +2440 +6FE0 +A100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_5FA9 +ENCODING 24489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27E0 +4C40 +97C0 +2440 +67C0 +A400 +27C0 +2C80 +3300 +2CE0 +ENDCHAR +STARTCHAR U_5FAA +ENCODING 24490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +2880 +4FE0 +9880 +2BE0 +6A20 +ABE0 +2A20 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_5FAB +ENCODING 24491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +27C0 +4240 +9FE0 +2440 +67C0 +A080 +27E0 +2480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_5FAC +ENCODING 24492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8480 +3FE0 +5120 +DFE0 +4200 +43C0 +4240 +4440 +48C0 +ENDCHAR +STARTCHAR U_5FAD +ENCODING 24493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +4E40 +8A40 +1580 +2900 +6FC0 +B100 +2FE0 +2100 +2920 +2FE0 +ENDCHAR +STARTCHAR U_5FAE +ENCODING 24494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +6A80 +BE80 +01E0 +5D40 +C340 +5D40 +5480 +5680 +5540 +6220 +ENDCHAR +STARTCHAR U_5FAF +ENCODING 24495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FA0 +2A40 +4580 +9240 +2F80 +6240 +AFA0 +2100 +2FE0 +2280 +3C60 +ENDCHAR +STARTCHAR U_5FB0 +ENCODING 24496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +45C0 +9500 +1FE0 +2000 +67E0 +A100 +25C0 +2500 +2FE0 +ENDCHAR +STARTCHAR U_5FB1 +ENCODING 24497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2500 +5FC0 +9540 +3FC0 +4000 +CF80 +4000 +5FE0 +4A80 +5640 +ENDCHAR +STARTCHAR U_5FB2 +ENCODING 24498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4820 +8FE0 +1AA0 +29C0 +6AA0 +ABE0 +2C80 +2FE0 +2880 +3080 +ENDCHAR +STARTCHAR U_5FB3 +ENCODING 24499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +9FE0 +2AA0 +4FE0 +C400 +4A40 +5AA0 +68A0 +4780 +ENDCHAR +STARTCHAR U_5FB4 +ENCODING 24500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5680 +9FE0 +2140 +5F40 +C540 +5E80 +4480 +4540 +5A20 +ENDCHAR +STARTCHAR U_5FB5 +ENCODING 24501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +5540 +9F60 +10A0 +2EA0 +60A0 +BEA0 +24A0 +2E40 +24A0 +3F20 +ENDCHAR +STARTCHAR U_5FB6 +ENCODING 24502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +4E80 +84E0 +3F20 +5520 +D520 +5FA0 +5540 +5540 +55A0 +5320 +ENDCHAR +STARTCHAR U_5FB7 +ENCODING 24503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5FE0 +8200 +3FC0 +5540 +DFC0 +4000 +7FE0 +4A40 +58A0 +6F80 +ENDCHAR +STARTCHAR U_5FB8 +ENCODING 24504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4480 +9FE0 +2A40 +4A40 +CFC0 +4200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_5FB9 +ENCODING 24505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5F80 +8AE0 +3FA0 +40A0 +DEA0 +52A0 +5E40 +5240 +5EA0 +5320 +ENDCHAR +STARTCHAR U_5FBA +ENCODING 24506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +4200 +9FE0 +2480 +4FC0 +C480 +5FE0 +4500 +4520 +58E0 +ENDCHAR +STARTCHAR U_5FBB +ENCODING 24507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +4440 +8BA0 +1000 +2FE0 +6AA0 +AFE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_5FBC +ENCODING 24508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5E80 +92E0 +3FA0 +52A0 +FFA0 +48A0 +4EA0 +4A40 +52A0 +6720 +ENDCHAR +STARTCHAR U_5FBD +ENCODING 24509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +7E80 +80E0 +3FA0 +48A0 +DCA0 +4AA0 +7F40 +5C40 +6AA0 +5920 +ENDCHAR +STARTCHAR U_5FBE +ENCODING 24510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3540 +5540 +9F60 +25A0 +5EA0 +C0A0 +5EA0 +40A0 +5E40 +52A0 +5F20 +ENDCHAR +STARTCHAR U_5FBF +ENCODING 24511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5F80 +8AE0 +2420 +5FE0 +D280 +5EE0 +5280 +5EE0 +5280 +56E0 +ENDCHAR +STARTCHAR U_5FC0 +ENCODING 24512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +2EE0 +4280 +CFE0 +4280 +5FE0 +4D40 +5480 +4660 +ENDCHAR +STARTCHAR U_5FC1 +ENCODING 24513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4820 +8FE0 +2940 +4FC0 +D120 +5FE0 +4D40 +53A0 +4540 +4B20 +ENDCHAR +STARTCHAR U_5FC2 +ENCODING 24514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +BAA0 +6EE0 +A900 +2FE0 +3900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_5FC3 +ENCODING 24515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +1200 +1200 +1040 +5020 +5020 +50A0 +9080 +1080 +0F80 +ENDCHAR +STARTCHAR U_5FC4 +ENCODING 24516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +20 +20 +30 +A8 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U_5FC5 +ENCODING 24517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +0480 +0500 +1100 +5240 +5220 +9420 +1880 +1080 +3080 +CF80 +ENDCHAR +STARTCHAR U_5FC6 +ENCODING 24518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +3040 +A880 +A880 +A100 +2200 +2200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FC7 +ENCODING 24519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +B7E0 +A920 +2120 +2120 +2220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_5FC8 +ENCODING 24520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +0000 +0000 +FFE0 +0000 +0440 +5220 +50A0 +9080 +0F80 +ENDCHAR +STARTCHAR U_5FC9 +ENCODING 24521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2120 +B120 +A920 +2120 +2120 +2220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_5FCA +ENCODING 24522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +B100 +A900 +2100 +2100 +2100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_5FCB +ENCODING 24523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2040 +B040 +A840 +27C0 +2400 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FCC +ENCODING 24524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +2020 +2020 +1FE0 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FCD +ENCODING 24525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0440 +2440 +2440 +4840 +1180 +6400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FCE +ENCODING 24526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +0400 +0400 +0440 +5220 +52A0 +9080 +0F80 +ENDCHAR +STARTCHAR U_5FCF +ENCODING 24527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +A100 +B100 +A900 +2FE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FD0 +ENCODING 24528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +07C0 +0400 +0400 +FFE0 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD1 +ENCODING 24529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0700 +0480 +0400 +0000 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD2 +ENCODING 24530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +1100 +0900 +0100 +1500 +52A0 +52A0 +9460 +0C20 +ENDCHAR +STARTCHAR U_5FD3 +ENCODING 24531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2100 +B100 +A900 +AFE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FD4 +ENCODING 24532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +A3E0 +B400 +ABC0 +A080 +2100 +2200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FD5 +ENCODING 24533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B100 +AFE0 +A100 +A100 +2280 +2280 +2440 +2440 +2820 +ENDCHAR +STARTCHAR U_5FD6 +ENCODING 24534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +A040 +B7E0 +A840 +2240 +2140 +2040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_5FD7 +ENCODING 24535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +0400 +7FC0 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD8 +ENCODING 24536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +2000 +2000 +3FC0 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FD9 +ENCODING 24537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2000 +AFE0 +B400 +AC00 +A400 +2400 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_5FDA +ENCODING 24538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2500 +B5C0 +A740 +2D40 +2540 +25C0 +2520 +2420 +23E0 +ENDCHAR +STARTCHAR U_5FDB +ENCODING 24539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +2480 +B480 +B680 +A580 +2480 +2480 +2480 +28A0 +3060 +ENDCHAR +STARTCHAR U_5FDC +ENCODING 24540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4400 +4200 +4A40 +5820 +68A0 +4880 +8F80 +ENDCHAR +STARTCHAR U_5FDD +ENCODING 24541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +1100 +2480 +4440 +A6A0 +2540 +4540 +0C00 +ENDCHAR +STARTCHAR U_5FDE +ENCODING 24542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +C060 +0400 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FDF +ENCODING 24543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B440 +B440 +A280 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_5FE0 +ENCODING 24544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +4440 +7FC0 +0400 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FE1 +ENCODING 24545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B920 +A920 +2FE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FE2 +ENCODING 24546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0880 +0880 +FFE0 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FE3 +ENCODING 24547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +2280 +B3E0 +A220 +A220 +2240 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_5FE4 +ENCODING 24548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +B7C0 +A900 +B100 +3FE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FE5 +ENCODING 24549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +9F80 +0000 +3F80 +0880 +2580 +A0A0 +A260 +9E20 +ENDCHAR +STARTCHAR U_5FE6 +ENCODING 24550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +6300 +D480 +C840 +54A0 +4480 +4480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_5FE7 +ENCODING 24551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2120 +B7E0 +AA80 +2280 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_5FE8 +ENCODING 24552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +B000 +A800 +AFE0 +2280 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_5FE9 +ENCODING 24553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0900 +1080 +2440 +4920 +1F80 +0000 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FEA +ENCODING 24554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +3280 +B440 +A440 +A920 +2120 +2200 +2240 +2440 +27E0 +ENDCHAR +STARTCHAR U_5FEB +ENCODING 24555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +37C0 +AA40 +A240 +BFE0 +2200 +2300 +2480 +2840 +3020 +ENDCHAR +STARTCHAR U_5FEC +ENCODING 24556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2040 +B280 +A100 +AFE0 +2120 +2100 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_5FED +ENCODING 24557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B100 +A900 +A1C0 +2120 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FEE +ENCODING 24558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B100 +A900 +A7C0 +2440 +2280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_5FEF +ENCODING 24559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2480 +B480 +AFE0 +A480 +2480 +2480 +24A0 +2660 +2420 +ENDCHAR +STARTCHAR U_5FF0 +ENCODING 24560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2F80 +2280 +B2A0 +ACA0 +A960 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_5FF1 +ENCODING 24561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +B520 +AD40 +A100 +2300 +2300 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_5FF2 +ENCODING 24562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +6200 +DFE0 +C200 +4500 +4500 +4480 +4A80 +4A40 +5020 +ENDCHAR +STARTCHAR U_5FF3 +ENCODING 24563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B100 +AD40 +A540 +27C0 +2100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_5FF4 +ENCODING 24564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B280 +AC40 +A920 +B080 +27E0 +2040 +2080 +2080 +2100 +ENDCHAR +STARTCHAR U_5FF5 +ENCODING 24565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1500 +22E0 +DF80 +0100 +0200 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FF6 +ENCODING 24566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2000 +B000 +A800 +AFE0 +2100 +2100 +2240 +2420 +2FE0 +ENDCHAR +STARTCHAR U_5FF7 +ENCODING 24567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +28A0 +ACA0 +BB20 +A920 +2920 +2AA0 +2AA0 +2CA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_5FF8 +ENCODING 24568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +2240 +B240 +AA40 +AFC0 +2440 +2440 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_5FF9 +ENCODING 24569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FC0 +4200 +E200 +D200 +4F80 +4200 +4200 +4200 +4200 +5FE0 +ENDCHAR +STARTCHAR U_5FFA +ENCODING 24570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +B520 +A940 +B100 +2100 +2280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_5FFB +ENCODING 24571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2400 +B400 +AFE0 +A480 +2480 +2480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_5FFC +ENCODING 24572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4200 +5FE0 +E000 +D780 +4480 +4480 +4480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_5FFD +ENCODING 24573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +2A40 +4A40 +1440 +2840 +0580 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_5FFE +ENCODING 24574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +3800 +AFC0 +B000 +AF80 +2080 +2080 +20A0 +2060 +2020 +ENDCHAR +STARTCHAR U_5FFF +ENCODING 24575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +2040 +FFA0 +0880 +1080 +6700 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6000 +ENCODING 24576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +A100 +B180 +AB40 +A520 +2920 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6001 +ENCODING 24577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0A00 +3980 +C460 +0000 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6002 +ENCODING 24578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1100 +2A80 +4440 +8820 +0400 +1240 +5020 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6003 +ENCODING 24579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2100 +B100 +AFE0 +A180 +2180 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6004 +ENCODING 24580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +2820 +BA20 +A940 +A880 +2940 +2E20 +2820 +2800 +2FE0 +ENDCHAR +STARTCHAR U_6005 +ENCODING 24581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2440 +2480 +B500 +A600 +BFE0 +2500 +2500 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_6006 +ENCODING 24582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +A820 +AF80 +A480 +2480 +2580 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6007 +ENCODING 24583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2400 +B7C0 +AC40 +2440 +2440 +27C0 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_6008 +ENCODING 24584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4A40 +6A40 +DFE0 +CA40 +4A40 +4A40 +4BC0 +4800 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6009 +ENCODING 24585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +A840 +B740 +A540 +2540 +2740 +24C0 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_600A +ENCODING 24586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +B120 +AA20 +A4A0 +A840 +27E0 +2420 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_600B +ENCODING 24587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +A840 +BFC0 +A900 +2FE0 +2900 +2920 +28A0 +2A60 +2C20 +ENDCHAR +STARTCHAR U_600C +ENCODING 24588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +B100 +AB80 +A540 +A920 +3120 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_600D +ENCODING 24589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +B3E0 +AE00 +ABC0 +2200 +2200 +23E0 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_600E +ENCODING 24590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2800 +4F80 +0800 +0FC0 +0800 +5440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_600F +ENCODING 24591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B7C0 +AD40 +A540 +2540 +2FE0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6010 +ENCODING 24592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +37E0 +A820 +B7A0 +24A0 +24A0 +27A0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_6011 +ENCODING 24593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2540 +B100 +AFE0 +2100 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6012 +ENCODING 24594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FA40 +4A40 +4A80 +3180 +2E60 +C000 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6013 +ENCODING 24595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +BFA0 +AAA0 +AAA0 +AAA0 +2AA0 +24A0 +2640 +29A0 +3120 +ENDCHAR +STARTCHAR U_6014 +ENCODING 24596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A100 +B100 +AD00 +25E0 +2500 +2500 +2500 +2500 +2FE0 +ENDCHAR +STARTCHAR U_6015 +ENCODING 24597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +27E0 +B420 +AC20 +A420 +27E0 +2420 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_6016 +ENCODING 24598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B200 +AD00 +A7E0 +AD20 +3520 +2520 +2520 +2560 +2100 +ENDCHAR +STARTCHAR U_6017 +ENCODING 24599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B1E0 +A900 +A100 +27E0 +2420 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_6018 +ENCODING 24600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +3F80 +0400 +1240 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_6019 +ENCODING 24601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B100 +A900 +27C0 +2440 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_601A +ENCODING 24602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B440 +AC40 +A7C0 +A440 +2440 +27C0 +2440 +2440 +3FE0 +ENDCHAR +STARTCHAR U_601B +ENCODING 24603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A440 +B440 +AFC0 +A440 +2440 +27C0 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_601C +ENCODING 24604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2500 +2880 +B240 +A120 +AFC0 +2080 +2080 +2500 +2200 +2100 +ENDCHAR +STARTCHAR U_601D +ENCODING 24605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +3F80 +2480 +2480 +3F80 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_601E +ENCODING 24606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B100 +AFE0 +A920 +2920 +2FE0 +2920 +2920 +2920 +2FE0 +ENDCHAR +STARTCHAR U_601F +ENCODING 24607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4F00 +4900 +E900 +DFE0 +4900 +4900 +48A0 +4AA0 +4D60 +4920 +ENDCHAR +STARTCHAR U_6020 +ENCODING 24608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +0440 +5220 +90A0 +0F80 +ENDCHAR +STARTCHAR U_6021 +ENCODING 24609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B240 +AC20 +AFE0 +2000 +27C0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6022 +ENCODING 24610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +A7C0 +B500 +A900 +BFE0 +2100 +2100 +2280 +2440 +3820 +ENDCHAR +STARTCHAR U_6023 +ENCODING 24611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2400 +3FC0 +4400 +FFC0 +0A00 +F1E0 +0440 +5220 +9080 +0F80 +ENDCHAR +STARTCHAR U_6024 +ENCODING 24612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2080 +6FE0 +A880 +2480 +2080 +2580 +1240 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6025 +ENCODING 24613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +1100 +3FC0 +4040 +1FC0 +0040 +3FC0 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6026 +ENCODING 24614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A520 +B340 +A900 +AFE0 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6027 +ENCODING 24615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +B500 +AFE0 +A900 +B100 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6028 +ENCODING 24616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +4A40 +AA40 +13A0 +2220 +41E0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6029 +ENCODING 24617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +A7E0 +B400 +AC00 +A520 +2540 +2580 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_602A +ENCODING 24618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2440 +B280 +A900 +A280 +AD60 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_602B +ENCODING 24619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B2A0 +AFE0 +AA80 +2FE0 +22A0 +22A0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_602C +ENCODING 24620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +BAA0 +AAA0 +AAA0 +AAA0 +2CE0 +2820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_602D +ENCODING 24621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +B240 +AA40 +A280 +AAA0 +2AA0 +3300 +2240 +2640 +29C0 +ENDCHAR +STARTCHAR U_602E +ENCODING 24622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +B9E0 +AAA0 +ACA0 +A4A0 +24A0 +2AA0 +3D20 +22A0 +2440 +ENDCHAR +STARTCHAR U_602F +ENCODING 24623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +B7C0 +A900 +A100 +AFE0 +2100 +2240 +2440 +2FA0 +2420 +ENDCHAR +STARTCHAR U_6030 +ENCODING 24624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +A200 +B440 +AF80 +2100 +2200 +2440 +2FE0 +2020 +ENDCHAR +STARTCHAR U_6031 +ENCODING 24625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2540 +D540 +0A40 +3540 +0A80 +0000 +54C0 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6032 +ENCODING 24626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A100 +BFE0 +A920 +A920 +2AA0 +2C60 +2820 +2820 +28E0 +ENDCHAR +STARTCHAR U_6033 +ENCODING 24627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A440 +B440 +AC40 +A7C0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6034 +ENCODING 24628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +AFE0 +B900 +A920 +A920 +2940 +2B40 +2CA0 +2960 +2220 +ENDCHAR +STARTCHAR U_6035 +ENCODING 24629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +A100 +B7E0 +A900 +A380 +2340 +2540 +2520 +2920 +3100 +ENDCHAR +STARTCHAR U_6036 +ENCODING 24630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B940 +A900 +2FC0 +2A40 +2A40 +2980 +2A40 +3420 +ENDCHAR +STARTCHAR U_6037 +ENCODING 24631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +0400 +2500 +2500 +C4E0 +0400 +1240 +5020 +5080 +8F80 +ENDCHAR +STARTCHAR U_6038 +ENCODING 24632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +1500 +2480 +C460 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6039 +ENCODING 24633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +25C0 +2740 +6D40 +A580 +2420 +23E0 +1400 +5240 +90A0 +8FA0 +ENDCHAR +STARTCHAR U_603A +ENCODING 24634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2720 +3120 +A140 +AD80 +2540 +2920 +3120 +2500 +2200 +ENDCHAR +STARTCHAR U_603B +ENCODING 24635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +3F80 +2080 +2080 +3F80 +2080 +0440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_603C +ENCODING 24636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +5080 +2480 +3280 +4880 +8180 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_603D +ENCODING 24637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +37C0 +A900 +A100 +2FE0 +2100 +2380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_603E +ENCODING 24638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +B440 +A440 +A7C0 +2000 +2280 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_603F +ENCODING 24639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +B180 +AA40 +A520 +A100 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6040 +ENCODING 24640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +A480 +BB00 +A280 +ADE0 +2220 +2540 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_6041 +ENCODING 24641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3F00 +4200 +5FE0 +C200 +4FC0 +4000 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6042 +ENCODING 24642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +B7E0 +A820 +A3A0 +A2A0 +23A0 +22A0 +23A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6043 +ENCODING 24643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +A900 +AFE0 +A080 +2FE0 +2480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_6044 +ENCODING 24644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +B100 +A7C0 +A000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6045 +ENCODING 24645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +B140 +A940 +AFE0 +A100 +2240 +2680 +2B20 +2220 +21E0 +ENDCHAR +STARTCHAR U_6046 +ENCODING 24646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +B3C0 +AC40 +A540 +A4C0 +2A40 +2940 +2040 +2040 +3FE0 +ENDCHAR +STARTCHAR U_6047 +ENCODING 24647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +B7E0 +AC80 +A480 +A7E0 +2480 +2480 +27E0 +2400 +27E0 +ENDCHAR +STARTCHAR U_6048 +ENCODING 24648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +2440 +B7E0 +A900 +2FC0 +3100 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6049 +ENCODING 24649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2700 +B420 +AFE0 +A000 +A7E0 +2420 +27E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_604A +ENCODING 24650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +B240 +A340 +2480 +3FE0 +2AA0 +2AA0 +2AA0 +3540 +ENDCHAR +STARTCHAR U_604B +ENCODING 24651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +2A80 +2A40 +4A40 +0000 +5440 +52A0 +90A0 +0F80 +ENDCHAR +STARTCHAR U_604C +ENCODING 24652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +AAA0 +B6C0 +AA80 +A280 +26C0 +2AA0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_604D +ENCODING 24653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +B540 +AB80 +A100 +AFE0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_604E +ENCODING 24654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2200 +B440 +AFE0 +2100 +27C0 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_604F +ENCODING 24655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +FC40 +2480 +6BE0 +1080 +E980 +0440 +54A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6050 +ENCODING 24656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2680 +25A0 +3CA0 +C860 +0400 +1240 +50A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6051 +ENCODING 24657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +A480 +BFE0 +A800 +2BC0 +2A40 +2AC0 +2A20 +2A20 +31E0 +ENDCHAR +STARTCHAR U_6052 +ENCODING 24658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +B7C0 +AC40 +A440 +27C0 +2440 +27C0 +2440 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6053 +ENCODING 24659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +A280 +BFE0 +AAA0 +AAA0 +2AA0 +2CE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6054 +ENCODING 24660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B480 +A840 +B4A0 +2480 +2300 +2300 +2480 +3860 +ENDCHAR +STARTCHAR U_6055 +ENCODING 24661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2A40 +4A40 +3240 +2BC0 +C400 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6056 +ENCODING 24662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +2A80 +2480 +2A80 +3F80 +0440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6057 +ENCODING 24663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2300 +B480 +AFC0 +B020 +27C0 +2200 +2380 +2080 +2180 +ENDCHAR +STARTCHAR U_6058 +ENCODING 24664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +B480 +AFE0 +B480 +A5C0 +26A0 +26A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_6059 +ENCODING 24665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FE0 +0400 +3FC0 +0400 +FFE0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_605A +ENCODING 24666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_605B +ENCODING 24667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +B820 +ABA0 +AAA0 +AAA0 +2BA0 +2AA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_605C +ENCODING 24668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +AFE0 +A100 +BF00 +A500 +2500 +24A0 +26A0 +3860 +2020 +ENDCHAR +STARTCHAR U_605D +ENCODING 24669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2120 +F920 +2120 +FA20 +24C0 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_605E +ENCODING 24670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +B7C0 +A940 +A7C0 +2500 +2FE0 +2120 +2280 +2C60 +ENDCHAR +STARTCHAR U_605F +ENCODING 24671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +A820 +B520 +AAA0 +ADA0 +28A0 +2FA0 +28A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6060 +ENCODING 24672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2FE0 +B280 +A480 +AFC0 +3480 +2480 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_6061 +ENCODING 24673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2280 +2300 +B480 +A200 +AFE0 +2200 +2500 +2900 +2240 +27E0 +ENDCHAR +STARTCHAR U_6062 +ENCODING 24674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +B200 +AA80 +A480 +A5A0 +2AC0 +3080 +2140 +2240 +2420 +ENDCHAR +STARTCHAR U_6063 +ENCODING 24675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2A20 +C240 +4500 +4880 +7060 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6064 +ENCODING 24676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2200 +AFE0 +BAA0 +AAA0 +AAA0 +2AA0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6065 +ENCODING 24677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5080 +5280 +7200 +5240 +7620 +5A20 +5240 +7A40 +D240 +13C0 +ENDCHAR +STARTCHAR U_6066 +ENCODING 24678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2400 +AFE0 +B820 +ABA0 +AAA0 +2AA0 +2BA0 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_6067 +ENCODING 24679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +7FC0 +4A40 +4A40 +4A40 +40C0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6068 +ENCODING 24680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +A520 +2540 +2480 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_6069 +ENCODING 24681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +4A40 +5140 +7FC0 +0400 +6240 +A0A0 +9FA0 +ENDCHAR +STARTCHAR U_606A +ENCODING 24682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +A440 +BA80 +A100 +2280 +2FE0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_606B +ENCODING 24683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +ABA0 +B820 +ABA0 +AAA0 +2AA0 +2BA0 +2820 +2820 +28E0 +ENDCHAR +STARTCHAR U_606C +ENCODING 24684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +B100 +AFE0 +A100 +A100 +27E0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_606D +ENCODING 24685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +1200 +2900 +48C0 +AA20 +2940 +4940 +1800 +ENDCHAR +STARTCHAR U_606E +ENCODING 24686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +BC40 +A820 +A7C0 +A100 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_606F +ENCODING 24687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6070 +ENCODING 24688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +A820 +A7C0 +2000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6071 +ENCODING 24689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +B540 +AA20 +A480 +2FC0 +2000 +2280 +22A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_6072 +ENCODING 24690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +B7E0 +AA40 +A240 +AFE0 +2240 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_6073 +ENCODING 24691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3FA0 +2440 +2B80 +34E0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6074 +ENCODING 24692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +5440 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6075 +ENCODING 24693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6076 +ENCODING 24694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0A00 +4A40 +2A80 +0A00 +FFE0 +0000 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6077 +ENCODING 24695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +2FC0 +6200 +A700 +2A80 +2260 +0800 +54C0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6078 +ENCODING 24696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2080 +B1E0 +A8A0 +BFA0 +24A0 +24A0 +2AA0 +3DA0 +2120 +22C0 +ENDCHAR +STARTCHAR U_6079 +ENCODING 24697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +B4C0 +ACA0 +A7E0 +A480 +2480 +2480 +2940 +2A20 +3420 +ENDCHAR +STARTCHAR U_607A +ENCODING 24698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +A520 +B7E0 +A800 +A7E0 +2020 +27E0 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_607B +ENCODING 24699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +5120 +F5A0 +D5A0 +D5A0 +55A0 +55A0 +5520 +5520 +4A20 +5160 +ENDCHAR +STARTCHAR U_607C +ENCODING 24700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +AFE0 +B480 +AAA0 +A920 +2AA0 +2CA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_607D +ENCODING 24701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +A100 +B7E0 +AC80 +A7C0 +2080 +2FE0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_607E +ENCODING 24702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2FE0 +B480 +A200 +BFE0 +2400 +2400 +2400 +27C0 +2000 +ENDCHAR +STARTCHAR U_607F +ENCODING 24703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +12C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6080 +ENCODING 24704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +B280 +AFE0 +A920 +AFE0 +2920 +2FE0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_6081 +ENCODING 24705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +B3C0 +A800 +A7E0 +A420 +27E0 +2420 +27E0 +2420 +24E0 +ENDCHAR +STARTCHAR U_6082 +ENCODING 24706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +2EE0 +B880 +ACA0 +A960 +2100 +2FC0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_6083 +ENCODING 24707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +A920 +BFE0 +A920 +ABA0 +2D60 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6084 +ENCODING 24708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +A100 +B7E0 +A420 +A7E0 +2420 +27E0 +2420 +2420 +24E0 +ENDCHAR +STARTCHAR U_6085 +ENCODING 24709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +B7E0 +AC40 +A440 +A7C0 +2280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6086 +ENCODING 24710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +0400 +7FC0 +1500 +ECE0 +0200 +5140 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6087 +ENCODING 24711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A280 +B440 +A820 +A7C0 +2100 +2FE0 +2540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_6088 +ENCODING 24712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +B080 +AAA0 +AAA0 +3FC0 +2A80 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_6089 +ENCODING 24713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +2480 +1500 +FFE0 +1600 +6580 +8460 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_608A +ENCODING 24714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +3A80 +E280 +2480 +6880 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_608B +ENCODING 24715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3280 +A900 +AA80 +A440 +2FE0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_608C +ENCODING 24716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +B7E0 +A920 +A7E0 +2500 +27E0 +2120 +2320 +25C0 +2900 +ENDCHAR +STARTCHAR U_608D +ENCODING 24717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +BC40 +A7C0 +A000 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_608E +ENCODING 24718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +A7C0 +B500 +A900 +AFE0 +2000 +27C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_608F +ENCODING 24719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +37E0 +A900 +A540 +A540 +2BA0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6090 +ENCODING 24720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5120 +2540 +5580 +3900 +5280 +9440 +6820 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6091 +ENCODING 24721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2100 +37E0 +A900 +AFE0 +A520 +27E0 +2520 +27E0 +2520 +2560 +ENDCHAR +STARTCHAR U_6092 +ENCODING 24722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +A000 +AFE0 +A920 +2FE0 +2800 +2820 +2820 +27E0 +ENDCHAR +STARTCHAR U_6093 +ENCODING 24723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +B440 +A7C0 +2440 +27C0 +2280 +2280 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6094 +ENCODING 24724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +B000 +AFC0 +A540 +A540 +3FE0 +2940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_6095 +ENCODING 24725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +B660 +A900 +AFE0 +A280 +27E0 +2AA0 +22A0 +22E0 +2080 +ENDCHAR +STARTCHAR U_6096 +ENCODING 24726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +B100 +AFE0 +A820 +A7C0 +2080 +2FE0 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_6097 +ENCODING 24727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +B480 +AFE0 +A520 +A520 +27E0 +2180 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6098 +ENCODING 24728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4800 +4F80 +5200 +7FC0 +4880 +7FC0 +0000 +5440 +92A0 +0F80 +ENDCHAR +STARTCHAR U_6099 +ENCODING 24729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B000 +B7C0 +2440 +27C0 +2080 +2100 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_609A +ENCODING 24730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A100 +BFE0 +A920 +AFE0 +2920 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_609B +ENCODING 24731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2440 +B7A0 +AA40 +A420 +ABC0 +2440 +2A80 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_609C +ENCODING 24732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B440 +AFC0 +A000 +AFE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_609D +ENCODING 24733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +B7C0 +AD40 +A7C0 +A540 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_609E +ENCODING 24734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2A40 +ABC0 +B800 +2FC0 +2240 +3FE0 +2200 +2500 +2880 +3060 +ENDCHAR +STARTCHAR U_609F +ENCODING 24735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +B7C0 +A240 +A240 +AFE0 +2000 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_60A0 +ENCODING 24736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +D640 +5240 +5180 +5660 +4000 +1400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60A1 +ENCODING 24737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +1140 +FD40 +1140 +3940 +D440 +10C0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60A2 +ENCODING 24738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B440 +AFC0 +A440 +A7C0 +2520 +2540 +2480 +2640 +2C20 +ENDCHAR +STARTCHAR U_60A3 +ENCODING 24739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +3F80 +0400 +7FC0 +4440 +7FC0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60A4 +ENCODING 24740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FC0 +4840 +4F40 +5540 +4A40 +7FC0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60A5 +ENCODING 24741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0000 +1F80 +0000 +1F80 +1080 +1F80 +5040 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60A6 +ENCODING 24742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2000 +B7C0 +AC40 +A440 +27C0 +2280 +22A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_60A7 +ENCODING 24743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +4E20 +44A0 +E4A0 +DEA0 +44A0 +4EA0 +4CA0 +5420 +44A0 +4440 +ENDCHAR +STARTCHAR U_60A8 +ENCODING 24744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +4920 +D540 +4520 +4920 +4300 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60A9 +ENCODING 24745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2220 +2920 +A540 +B400 +A080 +2AA0 +2920 +2AA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_60AA +ENCODING 24746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0A00 +FFE0 +0400 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60AB +ENCODING 24747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +FFE0 +8020 +1E40 +F3C0 +0400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60AC +ENCODING 24748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2780 +2080 +FFE0 +1080 +7F40 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60AD +ENCODING 24749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2AA0 +AAA0 +BA40 +AAA0 +AB20 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60AE +ENCODING 24750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +3440 +B7C0 +B000 +A7C0 +2100 +2FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_60AF +ENCODING 24751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2420 +A920 +BFE0 +AAA0 +AAA0 +2920 +2AA0 +2C60 +2820 +28E0 +ENDCHAR +STARTCHAR U_60B0 +ENCODING 24752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +B7C0 +A000 +AFE0 +2100 +2540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_60B1 +ENCODING 24753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2EE0 +A280 +B280 +AEE0 +A280 +2280 +2EE0 +2280 +2280 +2280 +ENDCHAR +STARTCHAR U_60B2 +ENCODING 24754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60B3 +ENCODING 24755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +5F80 +5280 +5F80 +4000 +7FE0 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60B4 +ENCODING 24756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A440 +B440 +AAA0 +A920 +2100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_60B5 +ENCODING 24757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +B7C0 +AC00 +A7C0 +A400 +2FE0 +2540 +2480 +2640 +2C20 +ENDCHAR +STARTCHAR U_60B6 +ENCODING 24758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +8A20 +A8A0 +A960 +C720 +8060 +ENDCHAR +STARTCHAR U_60B7 +ENCODING 24759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B820 +AFE0 +A940 +A920 +2FE0 +2900 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_60B8 +ENCODING 24760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +BFE0 +A540 +A920 +B7C0 +2080 +3FE0 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_60B9 +ENCODING 24761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F00 +2100 +3F80 +2080 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60BA +ENCODING 24762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +B820 +A7C0 +A440 +27C0 +2400 +27E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_60BB +ENCODING 24763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +AFE0 +A440 +2280 +2FC0 +2100 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_60BC +ENCODING 24764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +A100 +B7C0 +AC40 +A7C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_60BD +ENCODING 24765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B140 +AFE0 +A140 +A7C0 +2200 +3FE0 +2480 +2380 +2E60 +ENDCHAR +STARTCHAR U_60BE +ENCODING 24766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +B280 +A440 +A820 +27C0 +2100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60BF +ENCODING 24767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +BFE0 +A280 +A440 +BA20 +2340 +2AA0 +2AA0 +3200 +2600 +ENDCHAR +STARTCHAR U_60C0 +ENCODING 24768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +A840 +B7A0 +A000 +AFE0 +2AA0 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_60C1 +ENCODING 24769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2400 +37E0 +6C80 +A480 +2880 +1400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60C2 +ENCODING 24770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +B240 +AC80 +AA00 +24E0 +2420 +26E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_60C3 +ENCODING 24771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +A880 +2EA0 +28C0 +2880 +2EA0 +2860 +ENDCHAR +STARTCHAR U_60C4 +ENCODING 24772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1D40 +1140 +FC80 +5540 +9220 +2400 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60C5 +ENCODING 24773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A100 +B7C0 +A100 +AFE0 +2440 +2740 +25C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_60C6 +ENCODING 24774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +BBA0 +A920 +AFE0 +A820 +2BA0 +2AA0 +2BA0 +2820 +3060 +ENDCHAR +STARTCHAR U_60C7 +ENCODING 24775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B440 +AFC0 +A000 +A7C0 +2080 +2FE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_60C8 +ENCODING 24776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +B7C0 +AD40 +A7C0 +A100 +2FE0 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_60C9 +ENCODING 24777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +93C0 +6200 +2FC0 +C840 +4FC0 +4840 +1400 +52C0 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60CA +ENCODING 24778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B000 +AFC0 +A440 +A7C0 +2100 +2540 +2920 +3520 +2200 +ENDCHAR +STARTCHAR U_60CB +ENCODING 24779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B820 +A400 +A7E0 +A5A0 +29A0 +36E0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_60CC +ENCODING 24780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A020 +3BC0 +4A40 +B2C0 +1220 +E7E0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60CD +ENCODING 24781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +A840 +B020 +A7C0 +A100 +2FE0 +2100 +2920 +2540 +2FE0 +ENDCHAR +STARTCHAR U_60CE +ENCODING 24782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1D00 +1700 +1100 +FFE0 +4440 +92A0 +3140 +4F40 +ENDCHAR +STARTCHAR U_60CF +ENCODING 24783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +AFE0 +B480 +AC80 +AEC0 +35A0 +26A0 +2480 +2480 +2480 +ENDCHAR +STARTCHAR U_60D0 +ENCODING 24784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2140 +AFE0 +B100 +AF20 +2AA0 +2EC0 +22A0 +2D60 +2220 +ENDCHAR +STARTCHAR U_60D1 +ENCODING 24785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +0200 +7A40 +4A80 +7920 +02A0 +FC60 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60D2 +ENCODING 24786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E3C0 +2240 +FA40 +7240 +ABC0 +0000 +1440 +54A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60D3 +ENCODING 24787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +B7E0 +AA00 +AFE0 +A440 +2FA0 +3480 +25A0 +2420 +23E0 +ENDCHAR +STARTCHAR U_60D4 +ENCODING 24788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +B540 +A980 +A240 +AD20 +2520 +2540 +2980 +2280 +2C60 +ENDCHAR +STARTCHAR U_60D5 +ENCODING 24789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +A440 +AFC0 +A400 +27E0 +2AA0 +2520 +2A20 +24C0 +ENDCHAR +STARTCHAR U_60D6 +ENCODING 24790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +1000 +3FC0 +C940 +32C0 +0400 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60D7 +ENCODING 24791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2300 +2480 +AA60 +B100 +A780 +2080 +2140 +2CA0 +34A0 +2380 +ENDCHAR +STARTCHAR U_60D8 +ENCODING 24792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +A920 +BFE0 +A920 +AFE0 +2A20 +2A20 +2BA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_60D9 +ENCODING 24793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +24A0 +BAC0 +A520 +A000 +AFE0 +2AA0 +24A0 +2240 +24A0 +2920 +ENDCHAR +STARTCHAR U_60DA +ENCODING 24794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +AAA0 +B4A0 +A920 +A220 +24C0 +2500 +2D40 +34A0 +2380 +ENDCHAR +STARTCHAR U_60DB +ENCODING 24795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +B7E0 +AC80 +A760 +A420 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_60DC +ENCODING 24796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +B280 +AA80 +AFE0 +2000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_60DD +ENCODING 24797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +B100 +AFE0 +A820 +ABA0 +2AA0 +2BA0 +2AA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_60DE +ENCODING 24798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +5880 +71E0 +DF20 +D480 +5480 +5480 +5480 +5540 +5540 +6620 +ENDCHAR +STARTCHAR U_60DF +ENCODING 24799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +B7E0 +AC80 +B7E0 +A480 +2480 +27E0 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_60E0 +ENCODING 24800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2440 +3FC0 +2440 +3FC0 +0440 +7FA0 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60E1 +ENCODING 24801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60E2 +ENCODING 24802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +5280 +5040 +9140 +0F00 +1080 +2940 +2B20 +6560 +A940 +38C0 +ENDCHAR +STARTCHAR U_60E3 +ENCODING 24803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53E0 +7D60 +52A0 +98A0 +7320 +1060 +0440 +2AA0 +48A0 +0780 +ENDCHAR +STARTCHAR U_60E4 +ENCODING 24804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2240 +B3E0 +AE40 +A880 +BF20 +22C0 +2240 +2280 +2AA0 +25E0 +ENDCHAR +STARTCHAR U_60E5 +ENCODING 24805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +65C0 +4440 +75C0 +4440 +7FC0 +1100 +E4E0 +1280 +50C0 +8FA0 +ENDCHAR +STARTCHAR U_60E6 +ENCODING 24806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +B7E0 +AC80 +A4E0 +A480 +27E0 +2620 +2A20 +2BE0 +3220 +ENDCHAR +STARTCHAR U_60E7 +ENCODING 24807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +A440 +27C0 +2440 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_60E8 +ENCODING 24808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +A200 +BFE0 +A480 +B960 +2680 +2100 +2640 +2180 +2E00 +ENDCHAR +STARTCHAR U_60E9 +ENCODING 24809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4100 +A100 +49C0 +C900 +4900 +5FE0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60EA +ENCODING 24810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +FFE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_60EB +ENCODING 24811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +6900 +0600 +3F80 +E4E0 +3F80 +2480 +3F80 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_60EC +ENCODING 24812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +AFE0 +BAA0 +A9C0 +A880 +2FE0 +2880 +2940 +2A20 +2FE0 +ENDCHAR +STARTCHAR U_60ED +ENCODING 24813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +3F00 +A900 +B5E0 +BF40 +A540 +2740 +3D40 +2540 +2540 +2640 +ENDCHAR +STARTCHAR U_60EE +ENCODING 24814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +B7C0 +AD40 +A7C0 +A540 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_60EF +ENCODING 24815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +BFE0 +A540 +A7C0 +2000 +2FE0 +2920 +2920 +2280 +2C60 +ENDCHAR +STARTCHAR U_60F0 +ENCODING 24816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +A200 +B7C0 +A900 +37E0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_60F1 +ENCODING 24817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +A540 +B2A0 +A000 +2FE0 +28A0 +2AA0 +2920 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_60F2 +ENCODING 24818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +B100 +AFE0 +A540 +27C0 +2540 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_60F3 +ENCODING 24819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +AC40 +27C0 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_60F4 +ENCODING 24820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +AFE0 +B000 +AFE0 +2200 +2FE0 +2AA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_60F5 +ENCODING 24821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +B540 +ADC0 +A400 +27E0 +2100 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_60F6 +ENCODING 24822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B440 +AFC0 +A440 +2FE0 +2100 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60F7 +ENCODING 24823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +FFE0 +3180 +5F40 +9120 +1F00 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_60F8 +ENCODING 24824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2CA0 +B7A0 +ACA0 +A7A0 +2060 +27C0 +2080 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_60F9 +ENCODING 24825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1000 +3F80 +D080 +1F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_60FA +ENCODING 24826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +2500 +27E0 +2900 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_60FB +ENCODING 24827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2AA0 +AAA0 +BEA0 +AAA0 +AEA0 +2AA0 +2EA0 +2020 +2A20 +3160 +ENDCHAR +STARTCHAR U_60FC +ENCODING 24828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +BFE0 +A800 +2FE0 +2AA0 +2FE0 +3AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_60FD +ENCODING 24829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +2FC0 +B900 +AFC0 +A8A0 +2FE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_60FE +ENCODING 24830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2920 +BAA0 +AFE0 +A280 +2440 +2A20 +27C0 +2A80 +2100 +2EE0 +ENDCHAR +STARTCHAR U_60FF +ENCODING 24831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +2000 +2FE0 +2500 +25E0 +2B00 +30E0 +ENDCHAR +STARTCHAR U_6100 +ENCODING 24832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C80 +2480 +BEA0 +A5C0 +AE80 +2D80 +3480 +2540 +2540 +2620 +ENDCHAR +STARTCHAR U_6101 +ENCODING 24833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +1120 +FD40 +3B80 +5580 +9240 +1C20 +0440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6102 +ENCODING 24834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +13E0 +FEA0 +8AA0 +7CA0 +1160 +3600 +0440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6103 +ENCODING 24835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B000 +AFE0 +A000 +27C0 +2440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_6104 +ENCODING 24836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +37C0 +AD40 +A7C0 +A000 +3FE0 +2540 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_6105 +ENCODING 24837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A280 +B380 +A900 +A7C0 +2540 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6106 +ENCODING 24838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +45E0 +A800 +45E0 +C440 +5840 +49C0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6107 +ENCODING 24839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +3240 +AFE0 +A440 +A7C0 +2100 +2FE0 +2900 +3FE0 +2100 +ENDCHAR +STARTCHAR U_6108 +ENCODING 24840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +7EE0 +A440 +3D40 +2540 +3C40 +24C0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6109 +ENCODING 24841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +2B60 +B000 +AE20 +AAA0 +2EA0 +2AA0 +2EA0 +2A20 +2AE0 +ENDCHAR +STARTCHAR U_610A +ENCODING 24842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +27C0 +B440 +AFC0 +A000 +2FE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_610B +ENCODING 24843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2520 +32C0 +AFE0 +A100 +AFE0 +2200 +27C0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_610C +ENCODING 24844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +3100 +AFE0 +AAA0 +AC60 +2920 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_610D +ENCODING 24845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8BE0 +FA40 +A240 +F980 +A180 +9260 +CC00 +1240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_610E +ENCODING 24846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C40 +B7C0 +A440 +A7C0 +2200 +27E0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_610F +ENCODING 24847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +5440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6110 +ENCODING 24848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A200 +AFE0 +BAA0 +ABA0 +2AA0 +2BA0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_6111 +ENCODING 24849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +27E0 +B520 +AFE0 +A520 +27E0 +2520 +2FE0 +2220 +2460 +ENDCHAR +STARTCHAR U_6112 +ENCODING 24850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +37C0 +AC40 +A7C0 +A400 +2FE0 +3920 +2AA0 +2FA0 +2040 +ENDCHAR +STARTCHAR U_6113 +ENCODING 24851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +B440 +AFE0 +A200 +27E0 +2AA0 +32A0 +2520 +2AC0 +ENDCHAR +STARTCHAR U_6114 +ENCODING 24852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2440 +B280 +AFE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6115 +ENCODING 24853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +B000 +AFC0 +A000 +3FE0 +2200 +27C0 +2040 +2380 +ENDCHAR +STARTCHAR U_6116 +ENCODING 24854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +B440 +AFC0 +A440 +A7C0 +2440 +3FE0 +2A80 +2C40 +2FE0 +ENDCHAR +STARTCHAR U_6117 +ENCODING 24855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +0900 +13E0 +FD40 +3540 +5080 +9140 +3620 +4440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6118 +ENCODING 24856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A20 +B7C0 +AA40 +A180 +2E60 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6119 +ENCODING 24857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +1F00 +2A00 +0E00 +F1E0 +1F00 +4440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_611A +ENCODING 24858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +7FC0 +4540 +5F40 +44C0 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_611B +ENCODING 24859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +FFE0 +9220 +50C0 +4FA0 +1000 +1FC0 +2880 +4700 +38E0 +ENDCHAR +STARTCHAR U_611C +ENCODING 24860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2900 +2900 +AFE0 +BB40 +AB40 +2D20 +2980 +2A40 +2C20 +2FE0 +ENDCHAR +STARTCHAR U_611D +ENCODING 24861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +ABC0 +BA40 +ABC0 +A900 +2FE0 +2A40 +2980 +2A40 +2FE0 +ENDCHAR +STARTCHAR U_611E +ENCODING 24862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4100 +4FE0 +EAA0 +DAA0 +4860 +4100 +5FE0 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_611F +ENCODING 24863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4100 +7F40 +5D40 +5280 +9DA0 +8260 +2440 +A2A0 +9F80 +ENDCHAR +STARTCHAR U_6120 +ENCODING 24864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +B440 +AFC0 +A000 +2FE0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6121 +ENCODING 24865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +52A0 +EAA0 +E6A0 +49A0 +5260 +4040 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_6122 +ENCODING 24866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +4FE0 +E920 +C920 +4FE0 +4000 +4240 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_6123 +ENCODING 24867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +BAA0 +AFE0 +A100 +2FE0 +2200 +23C0 +2440 +2840 +3180 +ENDCHAR +STARTCHAR U_6124 +ENCODING 24868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +BFE0 +A440 +A7C0 +2440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_6125 +ENCODING 24869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +B100 +AFC0 +A540 +2540 +3FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6126 +ENCODING 24870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B540 +AFE0 +A000 +27C0 +2440 +2540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_6127 +ENCODING 24871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +A920 +BFE0 +A920 +2FE0 +2340 +25A0 +25E0 +2920 +30E0 +ENDCHAR +STARTCHAR U_6128 +ENCODING 24872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +2260 +F800 +03C0 +FE40 +8580 +7A60 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6129 +ENCODING 24873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +B440 +AFC0 +A440 +27C0 +2440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_612A +ENCODING 24874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +B7E0 +A800 +A7E0 +2420 +27E0 +2420 +27E0 +2240 +2420 +ENDCHAR +STARTCHAR U_612B +ENCODING 24875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B100 +AFE0 +A240 +2780 +2240 +2FE0 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_612C +ENCODING 24876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +55E0 +5520 +7DE0 +2220 +4460 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_612D +ENCODING 24877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B140 +AFE0 +A280 +2720 +3BE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_612E +ENCODING 24878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +B520 +A940 +A400 +27C0 +2900 +3FE0 +2100 +2920 +2FE0 +ENDCHAR +STARTCHAR U_612F +ENCODING 24879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +B480 +AFE0 +A480 +27E0 +2480 +2FE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_6130 +ENCODING 24880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +AC40 +A7C0 +2940 +2580 +2FE0 +2280 +24A0 +28E0 +ENDCHAR +STARTCHAR U_6131 +ENCODING 24881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +B500 +ADE0 +B680 +2C80 +2FE0 +3480 +2540 +2A40 +3420 +ENDCHAR +STARTCHAR U_6132 +ENCODING 24882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B740 +AFE0 +A820 +27C0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6133 +ENCODING 24883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_6134 +ENCODING 24884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +A920 +BFC0 +2840 +2FC0 +2840 +2FE0 +2820 +37E0 +ENDCHAR +STARTCHAR U_6135 +ENCODING 24885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +2220 +AEE0 +B880 +AEE0 +2220 +2AA0 +2660 +3BA0 +2660 +ENDCHAR +STARTCHAR U_6136 +ENCODING 24886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4240 +E480 +DFE0 +CAA0 +5540 +4FC0 +4840 +4FC0 +4840 +48C0 +ENDCHAR +STARTCHAR U_6137 +ENCODING 24887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +B000 +AFE0 +A000 +27C0 +2440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6138 +ENCODING 24888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +55E0 +BAA0 +10A0 +38A0 +D560 +0000 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6139 +ENCODING 24889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +3820 +AA80 +A540 +A280 +2C60 +27C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_613A +ENCODING 24890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +B7C0 +A440 +A7C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_613B +ENCODING 24891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +1140 +2380 +F940 +27E0 +2540 +6920 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_613C +ENCODING 24892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4700 +5400 +F3E0 +D440 +57C0 +5440 +57C0 +5440 +5FE0 +4440 +ENDCHAR +STARTCHAR U_613D +ENCODING 24893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2200 +BFC0 +AA40 +AFC0 +2A40 +2080 +3FE0 +2480 +2180 +ENDCHAR +STARTCHAR U_613E +ENCODING 24894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +A800 +B7C0 +A040 +2AC0 +2740 +3FC0 +2740 +2AA0 +3220 +ENDCHAR +STARTCHAR U_613F +ENCODING 24895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4400 +5FC0 +5240 +5FC0 +4A80 +5640 +4400 +4A40 +A8A0 +AF80 +ENDCHAR +STARTCHAR U_6140 +ENCODING 24896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2A20 +2540 +B280 +AF00 +A240 +2FC0 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6141 +ENCODING 24897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +5140 +6E40 +5540 +6CC0 +7FC0 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6142 +ENCODING 24898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2480 +8FC0 +5A40 +2FC0 +CA40 +4AC0 +0400 +5240 +90A0 +0F80 +ENDCHAR +STARTCHAR U_6143 +ENCODING 24899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2540 +2AA0 +B7C0 +A000 +2EE0 +2220 +2AA0 +2660 +3AA0 +2760 +ENDCHAR +STARTCHAR U_6144 +ENCODING 24900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +BAA0 +AFE0 +2100 +2FE0 +2380 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_6145 +ENCODING 24901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +B280 +AB00 +ACE0 +2100 +2FE0 +2920 +2FE0 +2140 +2FE0 +ENDCHAR +STARTCHAR U_6146 +ENCODING 24902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +AA20 +B540 +A200 +ACE0 +2820 +2EE0 +2820 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6147 +ENCODING 24903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4240 +7860 +4BC0 +7A40 +4980 +9E60 +0000 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6148 +ENCODING 24904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2940 +7B80 +1080 +2940 +7FE0 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6149 +ENCODING 24905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2500 +B240 +AFE0 +A000 +27C0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_614A +ENCODING 24906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5FE0 +4500 +EFC0 +C540 +5FE0 +4540 +5FC0 +4D80 +5540 +6520 +ENDCHAR +STARTCHAR U_614B +ENCODING 24907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4BC0 +FE20 +4BE0 +7A00 +4BC0 +7A20 +4BE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_614C +ENCODING 24908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +B100 +AFE0 +A400 +27E0 +2540 +2540 +2540 +2960 +ENDCHAR +STARTCHAR U_614D +ENCODING 24909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2540 +B6C0 +AFC0 +A000 +2FE0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_614E +ENCODING 24910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +B7C0 +AC40 +A7C0 +2440 +27C0 +2440 +2FE0 +2440 +ENDCHAR +STARTCHAR U_614F +ENCODING 24911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +B440 +AFC0 +A440 +27C0 +2100 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_6150 +ENCODING 24912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2A80 +2580 +3F80 +1100 +2480 +1220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6151 +ENCODING 24913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +A3C0 +B240 +AFE0 +A040 +2FE0 +2920 +26A0 +2640 +29A0 +ENDCHAR +STARTCHAR U_6152 +ENCODING 24914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3FE0 +2AA0 +AFE0 +BAA0 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6153 +ENCODING 24915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +BAA0 +AFE0 +A000 +27C0 +2000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6154 +ENCODING 24916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B280 +AFC0 +A640 +2540 +27C0 +2100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6155 +ENCODING 24917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2280 +FFE0 +2480 +C460 +2680 +4D40 +ENDCHAR +STARTCHAR U_6156 +ENCODING 24918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28A0 +AFE0 +B8A0 +AEA0 +AAA0 +2EE0 +28A0 +2EA0 +2960 +2FE0 +ENDCHAR +STARTCHAR U_6157 +ENCODING 24919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +5640 +7D40 +3880 +5540 +9220 +0000 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6158 +ENCODING 24920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +B7E0 +AAA0 +AFE0 +2280 +2540 +2AA0 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_6159 +ENCODING 24921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEC0 +5500 +7DE0 +5540 +FF40 +1240 +0400 +A240 +A0A0 +1F80 +ENDCHAR +STARTCHAR U_615A +ENCODING 24922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FC0 +B280 +AF80 +AAE0 +2FA0 +2AA0 +2FA0 +22A0 +3FA0 +22A0 +ENDCHAR +STARTCHAR U_615B +ENCODING 24923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +2FE0 +B500 +AFE0 +3900 +2FC0 +2900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_615C +ENCODING 24924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7E80 +C5E0 +5620 +FD40 +5480 +7D40 +0420 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_615D +ENCODING 24925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +7FC0 +4900 +7FE0 +5880 +6880 +7FE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_615E +ENCODING 24926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B280 +AFE0 +A440 +27C0 +2440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_615F +ENCODING 24927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2280 +AF80 +BAE0 +AFA0 +2AA0 +2FA0 +22A0 +2FA0 +22A0 +2F40 +ENDCHAR +STARTCHAR U_6160 +ENCODING 24928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4E80 +C480 +EEE0 +C4A0 +5EA0 +49A0 +4E40 +4A40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6161 +ENCODING 24929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +ABA0 +B540 +ABA0 +2540 +2BA0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6162 +ENCODING 24930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +B440 +AFE0 +AAA0 +2FE0 +2000 +27C0 +2380 +2C60 +ENDCHAR +STARTCHAR U_6163 +ENCODING 24931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +2FE0 +B540 +AFC0 +A440 +27C0 +2440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6164 +ENCODING 24932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2260 +FC00 +87C0 +7240 +5980 +9660 +0440 +52A0 +9F80 +ENDCHAR +STARTCHAR U_6165 +ENCODING 24933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2A80 +ABE0 +B480 +A3E0 +3800 +2BE0 +2A20 +2BE0 +2C00 +33E0 +ENDCHAR +STARTCHAR U_6166 +ENCODING 24934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +FFE0 +5540 +3940 +5480 +9340 +3220 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6167 +ENCODING 24935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +2080 +3FC0 +0040 +3FC0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6168 +ENCODING 24936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A80 +AA80 +BE80 +ABE0 +AE80 +2C80 +2A80 +2DA0 +2AA0 +2460 +ENDCHAR +STARTCHAR U_6169 +ENCODING 24937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +57C0 +7100 +C7C0 +F540 +57C0 +5540 +5FE0 +5100 +5100 +6FE0 +ENDCHAR +STARTCHAR U_616A +ENCODING 24938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +ABC0 +BA40 +ABC0 +2800 +2EE0 +2AA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_616B +ENCODING 24939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4480 +AB40 +5120 +C9C0 +4D00 +53E0 +0400 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_616C +ENCODING 24940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +B100 +AFC0 +A540 +27C0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_616D +ENCODING 24941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FEA0 +55E0 +FE80 +3880 +5540 +9220 +0000 +5540 +5120 +8F00 +ENDCHAR +STARTCHAR U_616E +ENCODING 24942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4420 +7FE0 +5240 +5FC0 +5240 +9FC0 +AAA0 +4FA0 +ENDCHAR +STARTCHAR U_616F +ENCODING 24943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +AC40 +B7C0 +A440 +2FE0 +2400 +2FE0 +32A0 +2520 +2A60 +ENDCHAR +STARTCHAR U_6170 +ENCODING 24944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7FE0 +4040 +7D40 +50C0 +D440 +B2C0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6171 +ENCODING 24945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A540 +B7C0 +A540 +2FE0 +2080 +3FE0 +2480 +2280 +2100 +ENDCHAR +STARTCHAR U_6172 +ENCODING 24946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +B3C0 +A900 +AFE0 +2920 +2DA0 +2B60 +2DA0 +2960 +ENDCHAR +STARTCHAR U_6173 +ENCODING 24947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFA0 +B940 +AF40 +2AA0 +2F20 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6174 +ENCODING 24948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +AAA0 +B660 +AAA0 +2200 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6175 +ENCODING 24949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +D140 +FFE0 +D140 +57C0 +5540 +57C0 +5540 +57C0 +6540 +ENDCHAR +STARTCHAR U_6176 +ENCODING 24950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FC0 +4940 +7FE0 +4AA0 +6FC0 +5880 +A700 +98E0 +ENDCHAR +STARTCHAR U_6177 +ENCODING 24951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E940 +DFE0 +C940 +4FC0 +4900 +4D40 +4B80 +5540 +6B20 +ENDCHAR +STARTCHAR U_6178 +ENCODING 24952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +FFE0 +2A80 +4E60 +FFE0 +8420 +7FC0 +4440 +0400 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6179 +ENCODING 24953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +F940 +5340 +F940 +22C0 +2420 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_617A +ENCODING 24954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B540 +AFE0 +A540 +27C0 +2540 +2FE0 +2240 +2380 +2C60 +ENDCHAR +STARTCHAR U_617B +ENCODING 24955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5FC0 +4200 +DFE0 +E500 +C880 +5FC0 +68A0 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_617C +ENCODING 24956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +4900 +4920 +7F40 +48A0 +AB60 +DA20 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_617D +ENCODING 24957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +5FE0 +F480 +D6A0 +D4A0 +5FA0 +54C0 +5EA0 +6560 +4E20 +ENDCHAR +STARTCHAR U_617E +ENCODING 24958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +55E0 +AA20 +4480 +F880 +4940 +7A20 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_617F +ENCODING 24959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2900 +0FC0 +1900 +2FE0 +C4A0 +5FE0 +44A0 +0800 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_6180 +ENCODING 24960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +B360 +ACA0 +A100 +2280 +2D60 +2280 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_6181 +ENCODING 24961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +4920 +EBE0 +DEA0 +4920 +4FE0 +4240 +4920 +5840 +67C0 +ENDCHAR +STARTCHAR U_6182 +ENCODING 24962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +3F80 +2480 +FFE0 +9520 +5F40 +1000 +2F80 +0600 +79E0 +ENDCHAR +STARTCHAR U_6183 +ENCODING 24963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0800 +FFE0 +2080 +7BC0 +A0A0 +3F80 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6184 +ENCODING 24964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +A100 +67C0 +A440 +27C0 +2440 +2FE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6185 +ENCODING 24965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FFE0 +54A0 +7CA0 +54A0 +7CA0 +1120 +FE60 +52C0 +8FA0 +ENDCHAR +STARTCHAR U_6186 +ENCODING 24966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2FE0 +A820 +B7C0 +AC40 +27C0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6187 +ENCODING 24967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +1240 +FFE0 +1240 +7BC0 +4A40 +7BC0 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6188 +ENCODING 24968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4200 +6FE0 +D920 +C9C0 +4F20 +49E0 +4A80 +4AA0 +56C0 +6FE0 +ENDCHAR +STARTCHAR U_6189 +ENCODING 24969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +3F40 +A480 +AF00 +B020 +2F40 +2980 +2F00 +2A20 +2740 +3880 +ENDCHAR +STARTCHAR U_618A +ENCODING 24970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3FE0 +4480 +FFE0 +4D40 +57C0 +6540 +45C0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_618B +ENCODING 24971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +39E0 +7F40 +5540 +7480 +5D40 +5620 +1040 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_618C +ENCODING 24972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +45E0 +FE20 +1120 +FCA0 +9120 +5E20 +E0C0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_618D +ENCODING 24973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +AFE0 +B440 +ABA0 +3280 +2FE0 +2820 +2BA0 +2AA0 +2BA0 +ENDCHAR +STARTCHAR U_618E +ENCODING 24974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AAA0 +B920 +AFE0 +2000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_618F +ENCODING 24975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4EE0 +5320 +ECC0 +C740 +D820 +4FC0 +4100 +4540 +4920 +4300 +ENDCHAR +STARTCHAR U_6190 +ENCODING 24976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4680 +DFE0 +EA80 +D260 +4840 +4FE0 +5540 +4DE0 +4840 +5040 +ENDCHAR +STARTCHAR U_6191 +ENCODING 24977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2900 +9FC0 +2900 +CFE0 +4020 +6AA0 +0460 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6192 +ENCODING 24978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B540 +AFE0 +A440 +27C0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6193 +ENCODING 24979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +B7C0 +A540 +A7C0 +2120 +2FE0 +2540 +2C60 +33C0 +ENDCHAR +STARTCHAR U_6194 +ENCODING 24980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +27E0 +B900 +AFC0 +B900 +2FC0 +2900 +2FE0 +2000 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6195 +ENCODING 24981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2F40 +2AA0 +B440 +AFC0 +B020 +2FC0 +2840 +2FC0 +2480 +3FE0 +ENDCHAR +STARTCHAR U_6196 +ENCODING 24982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FEA0 +55E0 +BA80 +3880 +5540 +9220 +0400 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6197 +ENCODING 24983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +5640 +B940 +1480 +3940 +D620 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6198 +ENCODING 24984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +B7C0 +B440 +A7C0 +2280 +2FE0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6199 +ENCODING 24985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +3F80 +0A00 +FFE0 +2080 +3F80 +0400 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_619A +ENCODING 24986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +B000 +AFC0 +A940 +2FC0 +2940 +3FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_619B +ENCODING 24987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +2440 +27C0 +2440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_619C +ENCODING 24988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +57E0 +D500 +FBE0 +D480 +57E0 +5A40 +53C0 +5240 +53C0 +5240 +ENDCHAR +STARTCHAR U_619D +ENCODING 24989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2540 +7D40 +0880 +7D40 +1220 +3000 +1220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_619E +ENCODING 24990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5E80 +40E0 +EEA0 +CB20 +4EA0 +4040 +5E40 +44A0 +5EA0 +4520 +ENDCHAR +STARTCHAR U_619F +ENCODING 24991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +2920 +2540 +3FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_61A0 +ENCODING 24992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5500 +7FE0 +6AA0 +7E80 +4940 +5220 +8400 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61A1 +ENCODING 24993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EE0 +B540 +AFE0 +A100 +2FE0 +2920 +2960 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_61A2 +ENCODING 24994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +B100 +AFE0 +A440 +2EE0 +2440 +3FE0 +2480 +24A0 +38E0 +ENDCHAR +STARTCHAR U_61A3 +ENCODING 24995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +B380 +AFE0 +A380 +2540 +2FE0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_61A4 +ENCODING 24996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B540 +AFE0 +A440 +27C0 +2440 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_61A5 +ENCODING 24997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AD40 +7380 +3280 +4C40 +FFE0 +8840 +7F80 +1080 +2540 +52A0 +9F80 +ENDCHAR +STARTCHAR U_61A6 +ENCODING 24998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +55A0 +CEC0 +E480 +CB40 +5FE0 +5220 +4FC0 +4240 +4440 +58C0 +ENDCHAR +STARTCHAR U_61A7 +ENCODING 24999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B280 +A900 +AFE0 +2540 +27C0 +2540 +27C0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_61A8 +ENCODING 25000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +11E0 +FE40 +4A40 +7980 +4980 +FE60 +0800 +1240 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61A9 +ENCODING 25001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E3E0 +2220 +FFE0 +2220 +7BE0 +4A20 +7BE0 +1440 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_61AA +ENCODING 25002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AFE0 +2AA0 +2BA0 +2AA0 +2BA0 +2AA0 +2DE0 +ENDCHAR +STARTCHAR U_61AB +ENCODING 25003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +2920 +2FE0 +2AA0 +2920 +2AA0 +2C60 +ENDCHAR +STARTCHAR U_61AC +ENCODING 25004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +B440 +A7C0 +2100 +2FE0 +2440 +27C0 +2940 +3320 +ENDCHAR +STARTCHAR U_61AD +ENCODING 25005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +B7C0 +AC60 +27C0 +2440 +27C0 +2100 +2940 +3320 +ENDCHAR +STARTCHAR U_61AE +ENCODING 25006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +2FE0 +B540 +A540 +AFE0 +2540 +2FE0 +2000 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_61AF +ENCODING 25007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AFE0 +B6C0 +AB60 +3240 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_61B0 +ENCODING 25008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +AFE0 +B2A0 +A480 +2FE0 +2AA0 +2FE0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_61B1 +ENCODING 25009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2460 +2F40 +B0E0 +AF40 +2940 +2F40 +24C0 +2EC0 +3540 +2E60 +ENDCHAR +STARTCHAR U_61B2 +ENCODING 25010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +BFA0 +0400 +FFE0 +2A80 +3F80 +0400 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_61B3 +ENCODING 25011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +27C0 +B040 +AFE0 +24A0 +2EE0 +2040 +2FE0 +2440 +22C0 +ENDCHAR +STARTCHAR U_61B4 +ENCODING 25012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AEE0 +B280 +AEE0 +AAA0 +2EE0 +2AA0 +2EE0 +2280 +23E0 +ENDCHAR +STARTCHAR U_61B5 +ENCODING 25013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +4080 +7BE0 +A880 +BBE0 +1480 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61B6 +ENCODING 25014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +B280 +AFE0 +A440 +27C0 +2440 +27C0 +2540 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_61B7 +ENCODING 25015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +B6C0 +AB60 +A240 +2FE0 +2120 +2500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_61B8 +ENCODING 25016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +B440 +AFE0 +B000 +2EE0 +2AA0 +2EE0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_61B9 +ENCODING 25017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +5FC0 +5540 +FFC0 +D540 +5FE0 +5000 +5FE0 +5540 +5480 +6660 +ENDCHAR +STARTCHAR U_61BA +ENCODING 25018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +AFE0 +BAA0 +AFE0 +2800 +2BE0 +2800 +2BE0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_61BB +ENCODING 25019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +F740 +D040 +5FC0 +4C80 +4A80 +4F80 +4000 +7FE0 +ENDCHAR +STARTCHAR U_61BC +ENCODING 25020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7FE0 +2940 +7F40 +D480 +7540 +0E20 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61BD +ENCODING 25021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +6480 +DFC0 +D540 +6B40 +44C0 +4200 +5940 +68A0 +4780 +ENDCHAR +STARTCHAR U_61BE +ENCODING 25022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +A900 +BF20 +A940 +2EA0 +3AA0 +2F60 +2500 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_61BF +ENCODING 25023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +ABE0 +BEA0 +AAA0 +3FA0 +28A0 +2EA0 +2A40 +2AA0 +3720 +ENDCHAR +STARTCHAR U_61C0 +ENCODING 25024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4480 +6B40 +D020 +CFC0 +4A40 +4FC0 +4480 +4780 +4480 +4780 +ENDCHAR +STARTCHAR U_61C1 +ENCODING 25025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B000 +AFE0 +2440 +27E0 +2320 +26C0 +2A40 +2320 +ENDCHAR +STARTCHAR U_61C2 +ENCODING 25026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +A7C0 +B100 +AFE0 +2540 +27C0 +2540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_61C3 +ENCODING 25027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +29E0 +FCA0 +94A0 +FD20 +12C0 +FC00 +1240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61C4 +ENCODING 25028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +4A80 +DFE0 +F5A0 +DFA0 +44A0 +5EA0 +4520 +47A0 +5840 +ENDCHAR +STARTCHAR U_61C5 +ENCODING 25029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +B920 +AFC0 +A920 +2FE0 +2A40 +2D80 +32C0 +25A0 +ENDCHAR +STARTCHAR U_61C6 +ENCODING 25030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +B000 +AEE0 +2AA0 +2EE0 +2100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_61C7 +ENCODING 25031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +EA40 +53C0 +3240 +DBC0 +2AA0 +5340 +0420 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_61C8 +ENCODING 25032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2EA0 +B4A0 +AF60 +AB40 +3FE0 +2A40 +3FE0 +2A40 +2A40 +2E40 +ENDCHAR +STARTCHAR U_61C9 +ENCODING 25033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A80 +57E0 +7C80 +57C0 +5480 +57E0 +4A40 +A8A0 +4FA0 +ENDCHAR +STARTCHAR U_61CA +ENCODING 25034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +5FC0 +5AC0 +F740 +DFC0 +5740 +5AC0 +7FE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_61CB +ENCODING 25035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +F5E0 +3F80 +2480 +6DC0 +B6A0 +2C80 +1400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_61CC +ENCODING 25036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B100 +AFE0 +2280 +27C0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_61CD +ENCODING 25037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +AAA0 +BBA0 +A820 +2FE0 +2100 +3FE0 +2380 +2540 +3920 +ENDCHAR +STARTCHAR U_61CE +ENCODING 25038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FC0 +6A80 +D740 +FFE0 +5040 +5740 +5540 +5740 +5040 +5FC0 +ENDCHAR +STARTCHAR U_61CF +ENCODING 25039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +5880 +EFC0 +D880 +4FE0 +4000 +4EE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_61D0 +ENCODING 25040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +4AA0 +EFE0 +D100 +5FE0 +4200 +4540 +4C80 +7660 +4440 +ENDCHAR +STARTCHAR U_61D1 +ENCODING 25041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +BFE0 +4480 +3FE0 +C480 +5FE0 +5520 +1AA0 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61D2 +ENCODING 25042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +28E0 +3D40 +ABE0 +BE20 +AAA0 +3EA0 +2AA0 +3CA0 +2B40 +2A20 +ENDCHAR +STARTCHAR U_61D3 +ENCODING 25043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E40 +6580 +DFE0 +C920 +4A60 +53C0 +4400 +4FC0 +5380 +4C60 +ENDCHAR +STARTCHAR U_61D4 +ENCODING 25044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +ABA0 +B820 +AFE0 +2000 +27C0 +2000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_61D5 +ENCODING 25045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52C0 +5EA0 +41E0 +5E80 +5280 +5F60 +5240 +4920 +6840 +A7C0 +ENDCHAR +STARTCHAR U_61D6 +ENCODING 25046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5380 +F880 +27E0 +F880 +ABE0 +7220 +FBE0 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61D7 +ENCODING 25047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +5FE0 +C880 +FFE0 +5540 +7760 +5540 +5540 +5540 +6EC0 +ENDCHAR +STARTCHAR U_61D8 +ENCODING 25048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +BFE0 +5540 +2520 +DFE0 +5220 +4FC0 +0A40 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61D9 +ENCODING 25049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4F60 +4A20 +EFE0 +DAA0 +4EE0 +4AA0 +5FE0 +4440 +4820 +5020 +ENDCHAR +STARTCHAR U_61DA +ENCODING 25050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4A80 +4FC0 +E200 +DFE0 +C040 +4FC0 +4040 +4FC0 +5560 +57C0 +ENDCHAR +STARTCHAR U_61DB +ENCODING 25051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +4200 +CFC0 +E480 +5FE0 +5220 +4480 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_61DC +ENCODING 25052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +6480 +DFE0 +CAA0 +5FE0 +5420 +4780 +4C80 +4300 +4E00 +ENDCHAR +STARTCHAR U_61DD +ENCODING 25053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +5BE0 +5140 +EC80 +D3E0 +5C80 +6AE0 +7E80 +4A80 +5780 +64E0 +ENDCHAR +STARTCHAR U_61DE +ENCODING 25054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A280 +BFE0 +A820 +A7C0 +2940 +2280 +2DC0 +22A0 +2D20 +ENDCHAR +STARTCHAR U_61DF +ENCODING 25055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA40 +6C40 +FFE0 +2840 +FF40 +10C0 +7C40 +10C0 +FF00 +52A0 +9FA0 +ENDCHAR +STARTCHAR U_61E0 +ENCODING 25056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A160 +BEC0 +AAA0 +36C0 +2440 +27C0 +2440 +27C0 +2840 +ENDCHAR +STARTCHAR U_61E1 +ENCODING 25057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +5240 +FFE0 +D6C0 +DB60 +5240 +5280 +5500 +6A40 +47E0 +ENDCHAR +STARTCHAR U_61E2 +ENCODING 25058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E00 +5480 +5EE0 +F280 +DEC0 +D520 +5E00 +4000 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_61E3 +ENCODING 25059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +5FE0 +3B20 +D6A0 +5B60 +4000 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61E4 +ENCODING 25060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B100 +AFE0 +A120 +2FC0 +2040 +3FE0 +2A40 +2F40 +20C0 +ENDCHAR +STARTCHAR U_61E5 +ENCODING 25061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +BFE0 +A540 +A7C0 +2540 +2FE0 +2120 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_61E6 +ENCODING 25062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +BFE0 +ABA0 +A540 +AFE0 +2100 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_61E7 +ENCODING 25063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A920 +B660 +ABC0 +A000 +2FE0 +2AA0 +3FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_61E8 +ENCODING 25064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +AF60 +B940 +AFE0 +A940 +2F40 +2940 +2F40 +39A0 +2B20 +ENDCHAR +STARTCHAR U_61E9 +ENCODING 25065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +A100 +BFE0 +A200 +3FE0 +2D40 +37E0 +2540 +2480 +2660 +ENDCHAR +STARTCHAR U_61EA +ENCODING 25066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +A7C0 +B440 +AFC0 +2280 +3FE0 +2D40 +33A0 +2540 +3B20 +ENDCHAR +STARTCHAR U_61EB +ENCODING 25067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DC0 +2900 +AFE0 +A940 +B7C0 +2440 +2740 +25C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_61EC +ENCODING 25068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FE0 +4A80 +4F80 +4A80 +4F80 +5040 +AAA0 +AFA0 +ENDCHAR +STARTCHAR U_61ED +ENCODING 25069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +A940 +BFE0 +A940 +2FE0 +2AA0 +2BE0 +2AA0 +2BE0 +3620 +ENDCHAR +STARTCHAR U_61EE +ENCODING 25070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +A7C0 +B440 +AFE0 +2AA0 +2640 +2BC0 +2640 +2980 +2E60 +ENDCHAR +STARTCHAR U_61EF +ENCODING 25071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +FF00 +55E0 +7E20 +5540 +1080 +FD40 +4A20 +9C40 +52A0 +4F80 +ENDCHAR +STARTCHAR U_61F0 +ENCODING 25072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2AA0 +AEA0 +BAA0 +A520 +AFA0 +3220 +2FA0 +2AA0 +2720 +3FE0 +ENDCHAR +STARTCHAR U_61F1 +ENCODING 25073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +BAA0 +AFE0 +A140 +2FE0 +2920 +2D40 +28C0 +3320 +ENDCHAR +STARTCHAR U_61F2 +ENCODING 25074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +5FE0 +A0A0 +5FA0 +C440 +5E40 +44A0 +5F20 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_61F3 +ENCODING 25075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +4480 +EFC0 +C480 +4FC0 +4040 +4FC0 +4220 +5940 +67C0 +ENDCHAR +STARTCHAR U_61F4 +ENCODING 25076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4EC0 +64A0 +DFE0 +CA80 +5BA0 +4AA0 +5BC0 +4AA0 +4F60 +5A20 +ENDCHAR +STARTCHAR U_61F5 +ENCODING 25077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A820 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_61F6 +ENCODING 25078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5F40 +C4E0 +FFA0 +D5E0 +55A0 +5FE0 +44A0 +4EE0 +5540 +64A0 +ENDCHAR +STARTCHAR U_61F7 +ENCODING 25079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BFE0 +A940 +A580 +2B60 +2520 +2CC0 +2640 +2420 +ENDCHAR +STARTCHAR U_61F8 +ENCODING 25080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4940 +6B80 +5920 +4BE0 +FC80 +AAA0 +A5A0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_61F9 +ENCODING 25081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B5A0 +AFE0 +A240 +2FE0 +2240 +3FE0 +24A0 +3D40 +2620 +ENDCHAR +STARTCHAR U_61FA +ENCODING 25082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +35A0 +BFE0 +AA80 +BBA0 +2AA0 +3BC0 +2A40 +3B60 +2AA0 +3F20 +ENDCHAR +STARTCHAR U_61FB +ENCODING 25083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2EC0 +22A0 +AFE0 +B540 +A7C0 +2240 +2FE0 +2240 +2FE0 +2420 +ENDCHAR +STARTCHAR U_61FC +ENCODING 25084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +BEE0 +AAA0 +AFE0 +A480 +2FE0 +3480 +27C0 +2480 +27E0 +ENDCHAR +STARTCHAR U_61FD +ENCODING 25085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AEE0 +BAA0 +AEE0 +A480 +2FE0 +3480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_61FE +ENCODING 25086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +A3C0 +B240 +AFE0 +2040 +3FE0 +2AA0 +2EE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_61FF +ENCODING 25087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +13E0 +FD20 +8680 +7A80 +0540 +7A20 +4800 +7AA0 +5660 +F9C0 +ENDCHAR +STARTCHAR U_6200 +ENCODING 25088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4E80 +E1E0 +4E40 +A0A0 +EFE0 +5B40 +AEA0 +0440 +52A0 +4F80 +ENDCHAR +STARTCHAR U_6201 +ENCODING 25089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +FFE0 +2940 +57E0 +7D40 +11E0 +7D40 +29E0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_6202 +ENCODING 25090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +4A40 +EFE0 +DAE0 +4F40 +4A80 +4EE0 +5280 +5EE0 +6280 +ENDCHAR +STARTCHAR U_6203 +ENCODING 25091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +A820 +B7C0 +A440 +2FE0 +2AA0 +2FE0 +2100 +3FE0 +2AA0 +ENDCHAR +STARTCHAR U_6204 +ENCODING 25092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +AAA0 +BAA0 +AFE0 +A900 +3FE0 +2900 +2FE0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6205 +ENCODING 25093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +57E0 +FA40 +53C0 +7240 +23C0 +FA40 +2420 +52A0 +9F80 +ENDCHAR +STARTCHAR U_6206 +ENCODING 25094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +51C0 +FE20 +8BE0 +F880 +23E0 +FEA0 +2140 +5620 +50A0 +8F80 +ENDCHAR +STARTCHAR U_6207 +ENCODING 25095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +5140 +FFE0 +8880 +FFE0 +AA40 +FBC0 +2240 +5420 +52A0 +8F80 +ENDCHAR +STARTCHAR U_6208 +ENCODING 25096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0900 +0800 +FFE0 +0880 +0880 +0900 +0600 +0A20 +31A0 +C060 +ENDCHAR +STARTCHAR U_6209 +ENCODING 25097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0A00 +0900 +FFC0 +8800 +8880 +8880 +8900 +8600 +A640 +C940 +90C0 +ENDCHAR +STARTCHAR U_620A +ENCODING 25098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +3FE0 +2200 +2240 +2240 +2180 +2120 +42A0 +4460 +9820 +ENDCHAR +STARTCHAR U_620B +ENCODING 25099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +07E0 +7C00 +0440 +0280 +0320 +0CA0 +7060 +ENDCHAR +STARTCHAR U_620C +ENCODING 25100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +3FE0 +2200 +2240 +3E40 +2280 +2100 +2320 +44A0 +9860 +ENDCHAR +STARTCHAR U_620D +ENCODING 25101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +7FE0 +4200 +4240 +6240 +5280 +5100 +4320 +84A0 +9860 +ENDCHAR +STARTCHAR U_620E +ENCODING 25102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +FFE0 +2200 +2240 +2240 +FA80 +2100 +2320 +44A0 +9860 +ENDCHAR +STARTCHAR U_620F +ENCODING 25103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7A40 +0A00 +4FE0 +2A00 +1240 +1280 +2900 +4120 +86A0 +0060 +ENDCHAR +STARTCHAR U_6210 +ENCODING 25104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +7FE0 +4200 +4200 +7A40 +4A40 +4A80 +4920 +52A0 +8460 +ENDCHAR +STARTCHAR U_6211 +ENCODING 25105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +7240 +1200 +FFE0 +1200 +1A40 +3280 +D100 +1320 +54A0 +2060 +ENDCHAR +STARTCHAR U_6212 +ENCODING 25106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +0220 +FFE0 +0200 +2A40 +2A40 +FE80 +2980 +4920 +4AA0 +8460 +ENDCHAR +STARTCHAR U_6213 +ENCODING 25107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +F440 +9480 +9500 +F200 +0520 +18A0 +6060 +ENDCHAR +STARTCHAR U_6214 +ENCODING 25108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0FE0 +F880 +0500 +0620 +79E0 +1100 +FFE0 +0900 +0E20 +71E0 +ENDCHAR +STARTCHAR U_6215 +ENCODING 25109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +4920 +49E0 +7F00 +0920 +0920 +F940 +4880 +49A0 +4A60 +8C20 +ENDCHAR +STARTCHAR U_6216 +ENCODING 25110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +FFE0 +0200 +7A40 +4A40 +7940 +0180 +1CA0 +E160 +0620 +ENDCHAR +STARTCHAR U_6217 +ENCODING 25111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +2920 +45E0 +8700 +7920 +4920 +4940 +5880 +44A0 +4560 +3E20 +ENDCHAR +STARTCHAR U_6218 +ENCODING 25112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +3D00 +2160 +2780 +F920 +8940 +8980 +8920 +FEA0 +8860 +ENDCHAR +STARTCHAR U_6219 +ENCODING 25113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +82A0 +BA80 +83E0 +BA80 +AAA0 +AAA0 +BAC0 +82A0 +82E0 +8720 +ENDCHAR +STARTCHAR U_621A +ENCODING 25114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +7FE0 +4900 +4D20 +4920 +7F40 +4880 +5CA0 +AB60 +5A20 +ENDCHAR +STARTCHAR U_621B +ENCODING 25115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +3E80 +2F80 +2080 +3F80 +0900 +FFE0 +0480 +0720 +F8E0 +ENDCHAR +STARTCHAR U_621C +ENCODING 25116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +0100 +7920 +4920 +FD40 +1080 +7CA0 +1160 +FE20 +ENDCHAR +STARTCHAR U_621D +ENCODING 25117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7940 +4900 +79E0 +4F00 +7920 +4940 +7880 +01A0 +5660 +8820 +ENDCHAR +STARTCHAR U_621E +ENCODING 25118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +3F80 +2480 +2280 +FFE0 +8920 +0FC0 +F900 +0E40 +71C0 +ENDCHAR +STARTCHAR U_621F +ENCODING 25119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD20 +1100 +7FE0 +4900 +7940 +4940 +7880 +10A0 +FD60 +1220 +ENDCHAR +STARTCHAR U_6220 +ENCODING 25120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FD20 +4900 +3100 +FFE0 +0100 +7920 +48C0 +78A0 +4960 +7A20 +ENDCHAR +STARTCHAR U_6221 +ENCODING 25121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +FD20 +4900 +7FE0 +4920 +7920 +4940 +FE80 +A8A0 +C560 +FE20 +ENDCHAR +STARTCHAR U_6222 +ENCODING 25122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4920 +4900 +FFE0 +4500 +7D20 +4520 +7D40 +44A0 +FD60 +0620 +ENDCHAR +STARTCHAR U_6223 +ENCODING 25123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +3520 +EBE0 +4500 +8320 +7D20 +1140 +FC80 +28A0 +4560 +8220 +ENDCHAR +STARTCHAR U_6224 +ENCODING 25124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +4920 +5D00 +47E0 +7D00 +9120 +2940 +FE80 +AAA0 +AB60 +FE20 +ENDCHAR +STARTCHAR U_6225 +ENCODING 25125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +4520 +7D00 +47E0 +7D20 +5140 +7D40 +9080 +7CA0 +1160 +FE20 +ENDCHAR +STARTCHAR U_6226 +ENCODING 25126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +5980 +7D40 +55E0 +7F00 +5520 +7D40 +1080 +FDA0 +1260 +1420 +ENDCHAR +STARTCHAR U_6227 +ENCODING 25127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3940 +5520 +FF00 +47E0 +7D00 +4540 +7D40 +4080 +7CA0 +A560 +BE20 +ENDCHAR +STARTCHAR U_6228 +ENCODING 25128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +0520 +7500 +55E0 +FF00 +0520 +7540 +5480 +75A0 +1660 +0820 +ENDCHAR +STARTCHAR U_6229 +ENCODING 25129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +4920 +B500 +FFE0 +0100 +F940 +8940 +F880 +88A0 +F960 +8A20 +ENDCHAR +STARTCHAR U_622A +ENCODING 25130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +2900 +7D20 +C920 +7D40 +4880 +7DA0 +4260 +ENDCHAR +STARTCHAR U_622B +ENCODING 25131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +47E0 +7080 +D7A0 +75A0 +57A0 +70C0 +56A0 +5160 +5220 +ENDCHAR +STARTCHAR U_622C +ENCODING 25132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +A920 +6FE0 +2900 +FD40 +0140 +7D40 +4480 +7CA0 +4560 +7E20 +ENDCHAR +STARTCHAR U_622D +ENCODING 25133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FF20 +8300 +7DE0 +1300 +7D20 +5540 +7C80 +54A0 +7D60 +C620 +ENDCHAR +STARTCHAR U_622E +ENCODING 25134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +B520 +6D00 +B7E0 +3100 +4920 +A540 +5080 +29A0 +1260 +EC20 +ENDCHAR +STARTCHAR U_622F +ENCODING 25135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D40 +1120 +7D00 +57E0 +7D00 +5120 +4EC0 +5480 +76A0 +9560 +BE20 +ENDCHAR +STARTCHAR U_6230 +ENCODING 25136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEC0 +AAA0 +FE80 +54E0 +7F80 +54A0 +7CA0 +10C0 +FEA0 +1160 +1220 +ENDCHAR +STARTCHAR U_6231 +ENCODING 25137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +2140 +FD20 +A7E0 +F900 +A520 +9CC0 +AA80 +EEA0 +A960 +FE20 +ENDCHAR +STARTCHAR U_6232 +ENCODING 25138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1CC0 +10A0 +FE80 +93E0 +BC80 +92A0 +BEA0 +A4C0 +BCA0 +A960 +FE20 +ENDCHAR +STARTCHAR U_6233 +ENCODING 25139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +9AA0 +5680 +AAE0 +7F80 +48A0 +FEA0 +48C0 +7EA0 +4960 +7E20 +ENDCHAR +STARTCHAR U_6234 +ENCODING 25140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +5500 +7D40 +5540 +7D40 +2880 +FEA0 +4960 +8620 +ENDCHAR +STARTCHAR U_6235 +ENCODING 25141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +AAC0 +EEA0 +ABE0 +EE80 +28A0 +7EA0 +C8C0 +7EA0 +4960 +7E20 +ENDCHAR +STARTCHAR U_6236 +ENCODING 25142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +01C0 +3E00 +2000 +3FC0 +2040 +2040 +3FC0 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_6237 +ENCODING 25143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +0200 +3FC0 +2040 +2040 +3FC0 +2000 +2000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_6238 +ENCODING 25144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0000 +3FC0 +2040 +3FC0 +2000 +2000 +2000 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_6239 +ENCODING 25145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2000 +2FC0 +2080 +2300 +4420 +4820 +87E0 +ENDCHAR +STARTCHAR U_623A +ENCODING 25146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +09E0 +7D20 +4520 +4520 +7DE0 +4100 +4100 +4120 +8120 +80E0 +ENDCHAR +STARTCHAR U_623B +ENCODING 25147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FC0 +2040 +3FC0 +2200 +3FE0 +2200 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_623C +ENCODING 25148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +0A00 +7BC0 +4A40 +7BC0 +0A00 +0A00 +1200 +2200 +4200 +ENDCHAR +STARTCHAR U_623D +ENCODING 25149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2480 +2280 +2880 +24E0 +3F80 +4080 +8080 +ENDCHAR +STARTCHAR U_623E +ENCODING 25150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4500 +4480 +7FC0 +4600 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_623F +ENCODING 25151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2040 +3FC0 +2200 +3FE0 +2400 +27C0 +4440 +4840 +9180 +ENDCHAR +STARTCHAR U_6240 +ENCODING 25152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +6380 +4200 +7A00 +4BE0 +4A40 +7A40 +4240 +4240 +4440 +8840 +ENDCHAR +STARTCHAR U_6241 +ENCODING 25153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2000 +2FE0 +2AA0 +2FE0 +4AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_6242 +ENCODING 25154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2200 +23E0 +2200 +2FE0 +2820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_6243 +ENCODING 25155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4000 +5FE0 +5020 +57A0 +54A0 +97A0 +9060 +ENDCHAR +STARTCHAR U_6244 +ENCODING 25156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +7FE0 +4400 +5FE0 +5020 +57A0 +54A0 +97A0 +9060 +ENDCHAR +STARTCHAR U_6245 +ENCODING 25157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2400 +2780 +2D00 +23E0 +4E40 +4180 +9E00 +ENDCHAR +STARTCHAR U_6246 +ENCODING 25158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2020 +3FE0 +2200 +3FE0 +2220 +2540 +3C80 +4640 +8420 +ENDCHAR +STARTCHAR U_6247 +ENCODING 25159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4000 +7DE0 +4420 +54A0 +4C60 +54A0 +A960 +ENDCHAR +STARTCHAR U_6248 +ENCODING 25160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +7FE0 +4880 +5FC0 +5240 +5FC0 +5020 +9020 +8FE0 +ENDCHAR +STARTCHAR U_6249 +ENCODING 25161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +7FE0 +4500 +7DE0 +4500 +7DE0 +4500 +BDE0 +8500 +ENDCHAR +STARTCHAR U_624A +ENCODING 25162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +5280 +5700 +48E0 +7200 +4A80 +8500 +B8E0 +ENDCHAR +STARTCHAR U_624B +ENCODING 25163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_624C +ENCODING 25164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 1 -1 +BITMAP +20 +20 +20 +F8 +20 +30 +E0 +20 +20 +20 +60 +ENDCHAR +STARTCHAR U_624D +ENCODING 25165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +7FE0 +0300 +0500 +0900 +1100 +2100 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_624E +ENCODING 25166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +2200 +2A00 +3200 +6200 +A200 +2220 +2220 +E1E0 +ENDCHAR +STARTCHAR U_624F +ENCODING 25167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F200 +2F80 +2280 +3280 +6280 +A280 +24A0 +A4A0 +4860 +ENDCHAR +STARTCHAR U_6250 +ENCODING 25168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +2120 +2920 +3120 +6120 +A220 +2220 +A4A0 +4840 +ENDCHAR +STARTCHAR U_6251 +ENCODING 25169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FD00 +2180 +2940 +3120 +6100 +A100 +2100 +A100 +4100 +ENDCHAR +STARTCHAR U_6252 +ENCODING 25170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2080 +FA80 +2280 +2A80 +3280 +6240 +A440 +2440 +2820 +F020 +ENDCHAR +STARTCHAR U_6253 +ENCODING 25171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2080 +2880 +3080 +6080 +A080 +2080 +2080 +E380 +ENDCHAR +STARTCHAR U_6254 +ENCODING 25172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FA40 +2280 +2AE0 +3220 +6220 +A220 +2420 +2420 +E8C0 +ENDCHAR +STARTCHAR U_6255 +ENCODING 25173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2100 +F100 +2100 +2A00 +3280 +6240 +A440 +2FE0 +2420 +E000 +ENDCHAR +STARTCHAR U_6256 +ENCODING 25174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2400 +F200 +2200 +2A00 +3300 +6500 +A480 +2480 +2860 +F040 +ENDCHAR +STARTCHAR U_6257 +ENCODING 25175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F100 +2100 +27C0 +3100 +6100 +A100 +2100 +2FE0 +E000 +ENDCHAR +STARTCHAR U_6258 +ENCODING 25176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +29E0 +3700 +6100 +A100 +2120 +2120 +E0E0 +ENDCHAR +STARTCHAR U_6259 +ENCODING 25177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2080 +2480 +3480 +6280 +A100 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_625A +ENCODING 25178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2820 +3220 +6120 +A120 +2020 +2020 +E0C0 +ENDCHAR +STARTCHAR U_625B +ENCODING 25179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +2900 +3100 +6100 +A100 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_625C +ENCODING 25180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +2080 +27E0 +3080 +6080 +A080 +2080 +2280 +E100 +ENDCHAR +STARTCHAR U_625D +ENCODING 25181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +F000 +2FE0 +2200 +3400 +67C0 +A040 +2040 +2280 +E100 +ENDCHAR +STARTCHAR U_625E +ENCODING 25182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2100 +2100 +3FE0 +6100 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_625F +ENCODING 25183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2F80 +F480 +2480 +2480 +3F80 +6480 +A480 +24A0 +2460 +E420 +ENDCHAR +STARTCHAR U_6260 +ENCODING 25184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +24C0 +2C40 +3280 +6280 +A100 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_6261 +ENCODING 25185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +FDC0 +2740 +2D40 +3540 +6540 +A5C0 +2520 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6262 +ENCODING 25186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2400 +2BC0 +3080 +6100 +A200 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6263 +ENCODING 25187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2220 +2A20 +3220 +6220 +A220 +2220 +23E0 +E000 +ENDCHAR +STARTCHAR U_6264 +ENCODING 25188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA80 +2280 +2A80 +3280 +6280 +A280 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_6265 +ENCODING 25189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F1C0 +2700 +2100 +31E0 +6F00 +A100 +2100 +2120 +E0E0 +ENDCHAR +STARTCHAR U_6266 +ENCODING 25190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +2900 +37E0 +6100 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_6267 +ENCODING 25191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FF80 +2280 +2A80 +3680 +6280 +A7A0 +24A0 +A8A0 +5060 +ENDCHAR +STARTCHAR U_6268 +ENCODING 25192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +27C0 +F240 +2240 +2640 +3A40 +6240 +A240 +2440 +2540 +E880 +ENDCHAR +STARTCHAR U_6269 +ENCODING 25193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2400 +2C00 +3400 +6400 +A400 +2400 +2400 +6800 +ENDCHAR +STARTCHAR U_626A +ENCODING 25194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +22E0 +FC20 +2420 +2C20 +3420 +6420 +A420 +2420 +24A0 +E440 +ENDCHAR +STARTCHAR U_626B +ENCODING 25195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F820 +2020 +2820 +33E0 +6020 +A020 +2020 +27E0 +E000 +ENDCHAR +STARTCHAR U_626C +ENCODING 25196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +F900 +2200 +2FE0 +32A0 +62A0 +A520 +2920 +2220 +E4C0 +ENDCHAR +STARTCHAR U_626D +ENCODING 25197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA40 +2240 +2A40 +37C0 +6240 +A240 +2240 +2240 +EFE0 +ENDCHAR +STARTCHAR U_626E +ENCODING 25198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +2440 +2820 +37C0 +6240 +A240 +2240 +2440 +E980 +ENDCHAR +STARTCHAR U_626F +ENCODING 25199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +2280 +22E0 +3280 +6280 +A280 +2280 +2280 +EFE0 +ENDCHAR +STARTCHAR U_6270 +ENCODING 25200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +F920 +27E0 +2900 +3180 +6280 +A280 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_6271 +ENCODING 25201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FA40 +2280 +2AE0 +3220 +6220 +A540 +2480 +2940 +F620 +ENDCHAR +STARTCHAR U_6272 +ENCODING 25202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2920 +3080 +6FE0 +A040 +2080 +2100 +E200 +ENDCHAR +STARTCHAR U_6273 +ENCODING 25203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +27C0 +2440 +3640 +6540 +A480 +2980 +2A40 +F420 +ENDCHAR +STARTCHAR U_6274 +ENCODING 25204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +2460 +2A40 +3240 +6240 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6275 +ENCODING 25205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F200 +2500 +2880 +3460 +6300 +A100 +2400 +2300 +E100 +ENDCHAR +STARTCHAR U_6276 +ENCODING 25206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2100 +3FE0 +6100 +A280 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_6277 +ENCODING 25207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +2FE0 +3100 +6100 +A280 +2480 +2840 +F020 +ENDCHAR +STARTCHAR U_6278 +ENCODING 25208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA80 +23E0 +2A00 +3200 +63C0 +A240 +2440 +2440 +E840 +ENDCHAR +STARTCHAR U_6279 +ENCODING 25209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +24A0 +2FC0 +3480 +6480 +A480 +25A0 +26A0 +E460 +ENDCHAR +STARTCHAR U_627A +ENCODING 25210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +FC80 +2480 +2FE0 +3480 +6480 +A480 +24A0 +2660 +E420 +ENDCHAR +STARTCHAR U_627B +ENCODING 25211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2940 +3100 +6100 +A280 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_627C +ENCODING 25212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FDE0 +2520 +2D20 +3520 +6560 +A500 +2900 +2920 +F0E0 +ENDCHAR +STARTCHAR U_627D +ENCODING 25213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2D40 +3540 +6540 +A7C0 +2120 +2120 +E0E0 +ENDCHAR +STARTCHAR U_627E +ENCODING 25214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2200 +2A40 +3240 +6280 +A100 +2320 +24A0 +E860 +ENDCHAR +STARTCHAR U_627F +ENCODING 25215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +0200 +0420 +FFC0 +2480 +3F80 +2440 +7FC0 +4420 +8420 +1C00 +ENDCHAR +STARTCHAR U_6280 +ENCODING 25216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2FC0 +3440 +6440 +A280 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_6281 +ENCODING 25217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FC20 +27E0 +2A80 +3280 +6280 +A280 +24A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6282 +ENCODING 25218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2100 +2900 +37C0 +6100 +A100 +2100 +2FE0 +E000 +ENDCHAR +STARTCHAR U_6283 +ENCODING 25219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F800 +27E0 +2900 +3180 +6160 +A120 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_6284 +ENCODING 25220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FB40 +2520 +2900 +3120 +6140 +A080 +2100 +2200 +EC00 +ENDCHAR +STARTCHAR U_6285 +ENCODING 25221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F3E0 +2420 +2A20 +3220 +64A0 +AFE0 +2020 +20A0 +E040 +ENDCHAR +STARTCHAR U_6286 +ENCODING 25222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +2440 +3280 +E280 +2100 +2280 +2440 +6820 +ENDCHAR +STARTCHAR U_6287 +ENCODING 25223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +2220 +2BE0 +3220 +6220 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_6288 +ENCODING 25224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +23E0 +2A20 +3220 +63E0 +A220 +2220 +24A0 +E840 +ENDCHAR +STARTCHAR U_6289 +ENCODING 25225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBC0 +2140 +2940 +3140 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_628A +ENCODING 25226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FD40 +2540 +2D40 +37C0 +6400 +A400 +2420 +2420 +E7E0 +ENDCHAR +STARTCHAR U_628B +ENCODING 25227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F900 +2200 +2A40 +3220 +6620 +AA00 +2A00 +2220 +E1E0 +ENDCHAR +STARTCHAR U_628C +ENCODING 25228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +2940 +3100 +6100 +A300 +2520 +2920 +F0E0 +ENDCHAR +STARTCHAR U_628D +ENCODING 25229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2640 +F240 +2A40 +2240 +37E0 +6240 +A240 +2440 +2440 +E840 +ENDCHAR +STARTCHAR U_628E +ENCODING 25230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +F800 +2000 +2FE0 +3100 +6100 +A240 +2240 +2FA0 +E420 +ENDCHAR +STARTCHAR U_628F +ENCODING 25231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +2000 +2FE0 +3280 +6280 +A280 +22A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6290 +ENCODING 25232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2920 +2920 +3920 +6AA0 +AC60 +2820 +2820 +6860 +ENDCHAR +STARTCHAR U_6291 +ENCODING 25233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26E0 +FCA0 +24A0 +2CA0 +34A0 +65A0 +A6A0 +24E0 +2080 +E080 +ENDCHAR +STARTCHAR U_6292 +ENCODING 25234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA80 +2100 +2FE0 +3120 +6140 +A100 +2100 +2100 +E700 +ENDCHAR +STARTCHAR U_6293 +ENCODING 25235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +27C0 +FD40 +2540 +2D40 +3540 +6540 +A540 +2540 +2920 +F120 +ENDCHAR +STARTCHAR U_6294 +ENCODING 25236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F900 +2180 +2B40 +3520 +6920 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_6295 +ENCODING 25237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +2460 +2800 +37C0 +6440 +A280 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_6296 +ENCODING 25238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +F940 +2040 +2A40 +3140 +60E0 +AF40 +2040 +2040 +E040 +ENDCHAR +STARTCHAR U_6297 +ENCODING 25239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2000 +2780 +3480 +6480 +A480 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_6298 +ENCODING 25240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +FA00 +2200 +23E0 +3A40 +6240 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6299 +ENCODING 25241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +27C0 +2100 +3FE0 +6100 +A100 +2100 +2500 +E200 +ENDCHAR +STARTCHAR U_629A +ENCODING 25242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F900 +2100 +2FE0 +3280 +6280 +A280 +24A0 +28A0 +F060 +ENDCHAR +STARTCHAR U_629B +ENCODING 25243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2880 +F9E0 +2EA0 +2AA0 +3AA0 +6AA0 +AAA0 +2B40 +2A20 +F1E0 +ENDCHAR +STARTCHAR U_629C +ENCODING 25244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +2FE0 +2200 +33C0 +6440 +A640 +2980 +2A40 +F420 +ENDCHAR +STARTCHAR U_629D +ENCODING 25245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +22E0 +F220 +2420 +2F20 +3220 +6420 +A520 +2F20 +20A0 +E040 +ENDCHAR +STARTCHAR U_629E +ENCODING 25246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2220 +2BE0 +3280 +6280 +A280 +2440 +2440 +E820 +ENDCHAR +STARTCHAR U_629F +ENCODING 25247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2FE0 +3200 +67E0 +A040 +2380 +2080 +E040 +ENDCHAR +STARTCHAR U_62A0 +ENCODING 25248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC40 +2640 +2D40 +3480 +6480 +A540 +2640 +2400 +E7E0 +ENDCHAR +STARTCHAR U_62A1 +ENCODING 25249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2820 +2A00 +3240 +6280 +A300 +2220 +2220 +E1E0 +ENDCHAR +STARTCHAR U_62A2 +ENCODING 25250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2820 +2780 +3480 +6480 +A580 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_62A3 +ENCODING 25251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2A20 +3220 +60A0 +A120 +2620 +20A0 +E040 +ENDCHAR +STARTCHAR U_62A4 +ENCODING 25252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2420 +2420 +37E0 +6400 +A400 +2400 +2800 +F000 +ENDCHAR +STARTCHAR U_62A5 +ENCODING 25253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2580 +2C00 +37E0 +6540 +A540 +2480 +2540 +E620 +ENDCHAR +STARTCHAR U_62A6 +ENCODING 25254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F100 +2FE0 +2920 +3920 +6AA0 +AC60 +2820 +28A0 +E840 +ENDCHAR +STARTCHAR U_62A7 +ENCODING 25255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +2220 +2A20 +33E0 +6000 +A140 +2140 +2220 +E420 +ENDCHAR +STARTCHAR U_62A8 +ENCODING 25256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F900 +2520 +2B40 +3100 +6FE0 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62A9 +ENCODING 25257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2540 +2FC0 +3540 +6540 +AFE0 +2440 +2440 +E4C0 +ENDCHAR +STARTCHAR U_62AA +ENCODING 25258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +2280 +2FE0 +34A0 +6CA0 +A4A0 +24E0 +2080 +E080 +ENDCHAR +STARTCHAR U_62AB +ENCODING 25259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +24A0 +2C80 +37E0 +6540 +A540 +2480 +2940 +F620 +ENDCHAR +STARTCHAR U_62AC +ENCODING 25260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA40 +27A0 +2820 +3000 +67E0 +A420 +2420 +27E0 +E420 +ENDCHAR +STARTCHAR U_62AD +ENCODING 25261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2420 +2800 +3380 +6280 +A280 +24A0 +28A0 +F0E0 +ENDCHAR +STARTCHAR U_62AE +ENCODING 25262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2920 +3200 +6480 +A120 +2640 +2180 +EE00 +ENDCHAR +STARTCHAR U_62AF +ENCODING 25263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +2FC0 +3440 +6440 +A7C0 +2440 +2440 +FFE0 +ENDCHAR +STARTCHAR U_62B0 +ENCODING 25264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2540 +2D40 +3540 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_62B1 +ENCODING 25265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F820 +27A0 +24A0 +34A0 +67A0 +A4C0 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_62B2 +ENCODING 25266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F040 +2740 +2540 +3540 +6740 +A040 +2040 +2140 +E080 +ENDCHAR +STARTCHAR U_62B3 +ENCODING 25267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2C00 +3520 +6540 +A580 +2520 +2920 +F0E0 +ENDCHAR +STARTCHAR U_62B4 +ENCODING 25268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2540 +F540 +2FE0 +2540 +3540 +65C0 +A540 +2400 +2400 +E7E0 +ENDCHAR +STARTCHAR U_62B5 +ENCODING 25269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +FC80 +2480 +2FE0 +3480 +6480 +A480 +24A0 +2760 +E4A0 +ENDCHAR +STARTCHAR U_62B6 +ENCODING 25270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +2100 +37E0 +6100 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_62B7 +ENCODING 25271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F880 +2100 +2B80 +3540 +E920 +2100 +2100 +2000 +6FE0 +ENDCHAR +STARTCHAR U_62B8 +ENCODING 25272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +2080 +27E0 +3040 +6080 +A100 +2200 +2500 +E8E0 +ENDCHAR +STARTCHAR U_62B9 +ENCODING 25273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2100 +37C0 +6100 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_62BA +ENCODING 25274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2FE0 +3100 +6380 +A540 +2920 +2100 +E100 +ENDCHAR +STARTCHAR U_62BB +ENCODING 25275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +2FE0 +3520 +67E0 +A520 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62BC +ENCODING 25276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FCA0 +27E0 +2CA0 +34A0 +67E0 +A4A0 +2080 +2080 +E080 +ENDCHAR +STARTCHAR U_62BD +ENCODING 25277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +27E0 +2CA0 +34A0 +67E0 +A4A0 +24A0 +27E0 +E420 +ENDCHAR +STARTCHAR U_62BE +ENCODING 25278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +2100 +37E0 +6100 +A200 +2440 +2FA0 +E420 +ENDCHAR +STARTCHAR U_62BF +ENCODING 25279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2C80 +3480 +67E0 +A480 +24A0 +2560 +E620 +ENDCHAR +STARTCHAR U_62C0 +ENCODING 25280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F440 +2440 +27C0 +3280 +6280 +A280 +2480 +24A0 +E860 +ENDCHAR +STARTCHAR U_62C1 +ENCODING 25281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2800 +FEE0 +2AA0 +2AA0 +3AA0 +6AA0 +AAA0 +2AA0 +2AE0 +F600 +ENDCHAR +STARTCHAR U_62C2 +ENCODING 25282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +22A0 +2FE0 +3A80 +6FE0 +A2A0 +22A0 +24C0 +E880 +ENDCHAR +STARTCHAR U_62C3 +ENCODING 25283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2A00 +2200 +33C0 +6200 +A200 +23C0 +2200 +E200 +ENDCHAR +STARTCHAR U_62C4 +ENCODING 25284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2100 +2900 +3100 +67C0 +A100 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_62C5 +ENCODING 25285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +2FC0 +3440 +6440 +A7C0 +2440 +2000 +EFE0 +ENDCHAR +STARTCHAR U_62C6 +ENCODING 25286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F400 +27E0 +2480 +3580 +64C0 +A4A0 +2480 +A880 +4880 +ENDCHAR +STARTCHAR U_62C7 +ENCODING 25287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +2540 +2FE0 +3440 +6540 +A540 +27E0 +2040 +E180 +ENDCHAR +STARTCHAR U_62C8 +ENCODING 25288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F9E0 +2100 +2900 +3100 +67E0 +A420 +2420 +27E0 +E420 +ENDCHAR +STARTCHAR U_62C9 +ENCODING 25289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2000 +2040 +3440 +6240 +A280 +2080 +2100 +EFE0 +ENDCHAR +STARTCHAR U_62CA +ENCODING 25290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FC40 +25E0 +2C40 +3640 +E540 +2440 +2440 +A540 +4480 +ENDCHAR +STARTCHAR U_62CB +ENCODING 25291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +E9E0 +5EA0 +4AA0 +6AA0 +CAA0 +4AA0 +5360 +5200 +E1E0 +ENDCHAR +STARTCHAR U_62CC +ENCODING 25292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +F540 +2100 +27C0 +3100 +6100 +AFE0 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62CD +ENCODING 25293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +2220 +2A20 +33E0 +6220 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_62CE +ENCODING 25294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2A20 +2100 +37E0 +6040 +A080 +2300 +2080 +E040 +ENDCHAR +STARTCHAR U_62CF +ENCODING 25295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +4980 +2A60 +DF80 +0200 +3FC0 +0200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_62D0 +ENCODING 25296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2900 +3100 +67E0 +A120 +2220 +2520 +E8C0 +ENDCHAR +STARTCHAR U_62D1 +ENCODING 25297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +2240 +2A40 +33C0 +6240 +A240 +2240 +23C0 +E240 +ENDCHAR +STARTCHAR U_62D2 +ENCODING 25298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC00 +27C0 +2C40 +3440 +67C0 +A440 +2400 +2400 +E7E0 +ENDCHAR +STARTCHAR U_62D3 +ENCODING 25299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +2A00 +37E0 +6A20 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_62D4 +ENCODING 25300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2200 +2BC0 +3240 +6540 +A480 +2880 +2940 +E620 +ENDCHAR +STARTCHAR U_62D5 +ENCODING 25301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F440 +2800 +2200 +3240 +6280 +A300 +2220 +2220 +E1E0 +ENDCHAR +STARTCHAR U_62D6 +ENCODING 25302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +2100 +25C0 +3740 +6D40 +A5C0 +2520 +2420 +E3E0 +ENDCHAR +STARTCHAR U_62D7 +ENCODING 25303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +FC80 +2BE0 +2CA0 +36A0 +65A0 +AEA0 +28A0 +2120 +E260 +ENDCHAR +STARTCHAR U_62D8 +ENCODING 25304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2FA0 +34A0 +64A0 +A7A0 +24A0 +2120 +E0C0 +ENDCHAR +STARTCHAR U_62D9 +ENCODING 25305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FD40 +2540 +2FC0 +3100 +6920 +A920 +2920 +2FE0 +E820 +ENDCHAR +STARTCHAR U_62DA +ENCODING 25306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FFA0 +2000 +2A40 +3240 +6FE0 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_62DB +ENCODING 25307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +2120 +2A60 +3400 +63E0 +A220 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_62DC +ENCODING 25308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +2100 +F7C0 +2100 +27C0 +F900 +27C0 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_62DD +ENCODING 25309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F7C0 +2100 +27C0 +3100 +6FE0 +A100 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_62DE +ENCODING 25310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +20C0 +F700 +2400 +27E0 +3480 +6480 +A480 +2480 +2FE0 +E000 +ENDCHAR +STARTCHAR U_62DF +ENCODING 25311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +FD40 +2440 +2C40 +3440 +6540 +A640 +24C0 +2120 +E620 +ENDCHAR +STARTCHAR U_62E0 +ENCODING 25312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +51C0 +FD40 +5540 +5540 +5540 +ED40 +4540 +4A60 +4900 +D0E0 +ENDCHAR +STARTCHAR U_62E1 +ENCODING 25313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2480 +2480 +3480 +6500 +A540 +2A20 +2BE0 +F020 +ENDCHAR +STARTCHAR U_62E2 +ENCODING 25314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +F200 +2FE0 +2280 +32A0 +62C0 +A480 +25A0 +2AA0 +F0E0 +ENDCHAR +STARTCHAR U_62E3 +ENCODING 25315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA00 +2780 +2C80 +37E0 +6080 +A2C0 +24A0 +2AA0 +E100 +ENDCHAR +STARTCHAR U_62E4 +ENCODING 25316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F3C0 +2200 +2FE0 +3200 +6280 +A240 +2240 +2200 +E200 +ENDCHAR +STARTCHAR U_62E5 +ENCODING 25317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3920 +6FE0 +A920 +2920 +2920 +F060 +ENDCHAR +STARTCHAR U_62E6 +ENCODING 25318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +FA80 +27E0 +2000 +3000 +63C0 +A000 +2000 +2000 +EFE0 +ENDCHAR +STARTCHAR U_62E7 +ENCODING 25319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +F7E0 +2420 +2000 +37E0 +6080 +A080 +2080 +2280 +E100 +ENDCHAR +STARTCHAR U_62E8 +ENCODING 25320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FD20 +27E0 +2900 +33E0 +6240 +A540 +2880 +3140 +E620 +ENDCHAR +STARTCHAR U_62E9 +ENCODING 25321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +F980 +2240 +2C20 +3100 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_62EA +ENCODING 25322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2FE0 +2AA0 +3AA0 +6AE0 +AC20 +2820 +2FE0 +E820 +ENDCHAR +STARTCHAR U_62EB +ENCODING 25323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2C40 +37C0 +6520 +A540 +2480 +2540 +E620 +ENDCHAR +STARTCHAR U_62EC +ENCODING 25324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +2FE0 +3100 +67E0 +A420 +2420 +27E0 +E420 +ENDCHAR +STARTCHAR U_62ED +ENCODING 25325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +2080 +3780 +6280 +A2A0 +23A0 +2E60 +E020 +ENDCHAR +STARTCHAR U_62EE +ENCODING 25326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2FC0 +3000 +67C0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_62EF +ENCODING 25327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +F980 +2120 +2F40 +3580 +6540 +A920 +2720 +2000 +EFE0 +ENDCHAR +STARTCHAR U_62F0 +ENCODING 25328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +25C0 +FC80 +2480 +2C80 +37E0 +6480 +A480 +2480 +2480 +E7E0 +ENDCHAR +STARTCHAR U_62F1 +ENCODING 25329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA80 +27C0 +2A80 +3280 +6FE0 +A000 +2240 +2420 +E820 +ENDCHAR +STARTCHAR U_62F2 +ENCODING 25330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFE0 +1100 +2E80 +4440 +BFA0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_62F3 +ENCODING 25331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0800 +FFE0 +2080 +5F40 +8420 +3F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_62F4 +ENCODING 25332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2820 +27C0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_62F5 +ENCODING 25333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +27E0 +2C40 +3480 +E7E0 +2480 +2480 +2480 +6580 +ENDCHAR +STARTCHAR U_62F6 +ENCODING 25334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +2000 +2A00 +33E0 +6440 +AA40 +2180 +2300 +EC00 +ENDCHAR +STARTCHAR U_62F7 +ENCODING 25335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +27E0 +2900 +33E0 +6500 +ABE0 +2020 +2120 +E0C0 +ENDCHAR +STARTCHAR U_62F8 +ENCODING 25336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +FE40 +2280 +2B00 +31E0 +6220 +A540 +2080 +2300 +EC00 +ENDCHAR +STARTCHAR U_62F9 +ENCODING 25337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FA40 +2240 +2480 +3480 +6FE0 +AAA0 +2AA0 +2AA0 +E540 +ENDCHAR +STARTCHAR U_62FA +ENCODING 25338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +2D20 +3520 +6560 +A380 +2540 +2920 +E120 +ENDCHAR +STARTCHAR U_62FB +ENCODING 25339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +2500 +3520 +EB40 +2900 +3280 +2280 +A440 +4820 +ENDCHAR +STARTCHAR U_62FC +ENCODING 25340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +FFE0 +2240 +2240 +3FE0 +6240 +A240 +2440 +2440 +6840 +ENDCHAR +STARTCHAR U_62FD +ENCODING 25341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2D20 +37E0 +6140 +A180 +2120 +22A0 +EC60 +ENDCHAR +STARTCHAR U_62FE +ENCODING 25342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2BA0 +3000 +67C0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_62FF +ENCODING 25343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +1100 +3F80 +0400 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_6300 +ENCODING 25344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +F860 +2B80 +3AA0 +6AA0 +AA40 +2A40 +2A40 +AB20 +5220 +ENDCHAR +STARTCHAR U_6301 +ENCODING 25345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3080 +6FE0 +A480 +2280 +2080 +E180 +ENDCHAR +STARTCHAR U_6302 +ENCODING 25346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6303 +ENCODING 25347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FA00 +2440 +2FA0 +3120 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6304 +ENCODING 25348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +F540 +2380 +2FE0 +3280 +6280 +A280 +2480 +24A0 +E860 +ENDCHAR +STARTCHAR U_6305 +ENCODING 25349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +FAE0 +2420 +2560 +3900 +6FE0 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_6306 +ENCODING 25350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F440 +2440 +2960 +3100 +6FE0 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_6307 +ENCODING 25351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2260 +FB80 +2220 +2BE0 +3000 +63E0 +A220 +23E0 +2220 +E3E0 +ENDCHAR +STARTCHAR U_6308 +ENCODING 25352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F8A0 +20A0 +F920 +2240 +7F00 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_6309 +ENCODING 25353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2520 +2900 +37E0 +6240 +A640 +2180 +2280 +EC60 +ENDCHAR +STARTCHAR U_630A +ENCODING 25354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21C0 +F900 +27E0 +2800 +37E0 +6100 +A180 +2140 +2140 +E100 +ENDCHAR +STARTCHAR U_630B +ENCODING 25355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FC80 +27E0 +2C20 +3420 +67E0 +A480 +2480 +2480 +E7E0 +ENDCHAR +STARTCHAR U_630C +ENCODING 25356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FE40 +2180 +2A40 +3420 +6FC0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_630D +ENCODING 25357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F7E0 +2240 +24A0 +3A80 +6280 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_630E +ENCODING 25358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +2BA0 +3000 +6FC0 +A200 +27C0 +2040 +E180 +ENDCHAR +STARTCHAR U_630F +ENCODING 25359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FBA0 +2820 +2BA0 +3AA0 +6AA0 +ABA0 +2AA0 +2820 +E8E0 +ENDCHAR +STARTCHAR U_6310 +ENCODING 25360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A20 +F3E0 +2A20 +DF80 +0400 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_6311 +ENCODING 25361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +26C0 +2A80 +36C0 +6AA0 +A280 +22A0 +24A0 +E8E0 +ENDCHAR +STARTCHAR U_6312 +ENCODING 25362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +2420 +F4A0 +2EA0 +2AA0 +32A0 +6AA0 +A4A0 +2420 +28A0 +F040 +ENDCHAR +STARTCHAR U_6313 +ENCODING 25363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +24A0 +2B00 +3100 +61E0 +AF00 +2120 +2120 +E0E0 +ENDCHAR +STARTCHAR U_6314 +ENCODING 25364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2100 +2AA0 +36C0 +6A80 +A280 +22C0 +2320 +E620 +ENDCHAR +STARTCHAR U_6315 +ENCODING 25365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FA40 +23C0 +2A40 +3240 +63C0 +A240 +2260 +2FC0 +E040 +ENDCHAR +STARTCHAR U_6316 +ENCODING 25366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F420 +2240 +2420 +37E0 +6080 +A100 +2220 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6317 +ENCODING 25367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2120 +3FE0 +6900 +AFE0 +22A0 +2440 +E820 +ENDCHAR +STARTCHAR U_6318 +ENCODING 25368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +F520 +2940 +2180 +3100 +6200 +AFE0 +2220 +24A0 +E840 +ENDCHAR +STARTCHAR U_6319 +ENCODING 25369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +FFE0 +1100 +2EC0 +C420 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_631A +ENCODING 25370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2940 +F740 +2140 +7FA0 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_631B +ENCODING 25371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2940 +4920 +BFA0 +0400 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_631C +ENCODING 25372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2280 +2AA0 +36C0 +6280 +A280 +2280 +2FE0 +E000 +ENDCHAR +STARTCHAR U_631D +ENCODING 25373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2840 +F7E0 +2040 +2240 +3D40 +6440 +A540 +2480 +2400 +EBE0 +ENDCHAR +STARTCHAR U_631E +ENCODING 25374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2880 +F480 +23E0 +2C80 +3480 +6480 +A540 +2620 +2400 +EBE0 +ENDCHAR +STARTCHAR U_631F +ENCODING 25375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F920 +2540 +2B80 +3100 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6320 +ENCODING 25376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +FA80 +2120 +36E0 +6000 +AFE0 +2280 +22A0 +24A0 +E8E0 +ENDCHAR +STARTCHAR U_6321 +ENCODING 25377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FB40 +2100 +2FE0 +3020 +6020 +A7E0 +2020 +2020 +EFE0 +ENDCHAR +STARTCHAR U_6322 +ENCODING 25378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +27E0 +2A40 +3420 +6200 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6323 +ENCODING 25379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC80 +27C0 +2940 +3FE0 +6140 +A7C0 +2100 +2500 +E200 +ENDCHAR +STARTCHAR U_6324 +ENCODING 25380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +2180 +2E60 +3000 +6240 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6325 +ENCODING 25381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FA00 +27E0 +2A00 +3500 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_6326 +ENCODING 25382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +27C0 +3080 +6FE0 +A480 +2280 +2080 +E180 +ENDCHAR +STARTCHAR U_6327 +ENCODING 25383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F220 +2B20 +26A0 +3260 +66A0 +AB20 +2220 +2AA0 +E440 +ENDCHAR +STARTCHAR U_6328 +ENCODING 25384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +FFA0 +2400 +27C0 +3900 +E100 +2FE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6329 +ENCODING 25385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FC20 +27E0 +2C20 +3420 +67E0 +A280 +2280 +24A0 +E860 +ENDCHAR +STARTCHAR U_632A +ENCODING 25386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +EAA0 +5EA0 +4AC0 +6AA0 +5EA0 +CAA0 +4AE0 +4A80 +D680 +ENDCHAR +STARTCHAR U_632B +ENCODING 25387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FD40 +2540 +2BA0 +3120 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_632C +ENCODING 25388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +2C20 +37C0 +6080 +AFE0 +2100 +2100 +E300 +ENDCHAR +STARTCHAR U_632D +ENCODING 25389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2520 +2FE0 +3520 +67E0 +A520 +2200 +2580 +E860 +ENDCHAR +STARTCHAR U_632E +ENCODING 25390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2940 +27C0 +3500 +67E0 +A320 +25A0 +2940 +E100 +ENDCHAR +STARTCHAR U_632F +ENCODING 25391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FDC0 +2400 +2FE0 +3500 +65A0 +A540 +2540 +29A0 +E920 +ENDCHAR +STARTCHAR U_6330 +ENCODING 25392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2000 +37C0 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6331 +ENCODING 25393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2480 +F2C0 +2AA0 +26A0 +3280 +64A0 +A820 +2840 +2880 +EB00 +ENDCHAR +STARTCHAR U_6332 +ENCODING 25394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +A540 +5920 +E1C0 +5F00 +4200 +7FC0 +0200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_6333 +ENCODING 25395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +FAA0 +2540 +2AA0 +32A0 +6000 +A7E0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6334 +ENCODING 25396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +FC00 +27C0 +2D40 +3540 +6FE0 +A540 +2540 +27E0 +E040 +ENDCHAR +STARTCHAR U_6335 +ENCODING 25397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F7C0 +2100 +2FE0 +3240 +6FE0 +A240 +2240 +2440 +E840 +ENDCHAR +STARTCHAR U_6336 +ENCODING 25398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2400 +2FE0 +3420 +67A0 +A6A0 +2BA0 +2820 +F0C0 +ENDCHAR +STARTCHAR U_6337 +ENCODING 25399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +F4A0 +24A0 +2FC0 +34E0 +64A0 +AFA0 +24C0 +2880 +F080 +ENDCHAR +STARTCHAR U_6338 +ENCODING 25400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2FC0 +3440 +67C0 +A280 +22A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6339 +ENCODING 25401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2000 +27C0 +3540 +6540 +A7C0 +2420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_633A +ENCODING 25402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2FC0 +FA40 +2440 +2FE0 +3240 +6240 +AA40 +25E0 +2A00 +F1E0 +ENDCHAR +STARTCHAR U_633B +ENCODING 25403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +23C0 +FA40 +2440 +2E60 +3540 +E540 +2D40 +25E0 +AA00 +51E0 +ENDCHAR +STARTCHAR U_633C +ENCODING 25404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +27A0 +FD20 +2AC0 +2100 +3FE0 +6240 +A480 +2380 +2240 +EC20 +ENDCHAR +STARTCHAR U_633D +ENCODING 25405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +27E0 +2D20 +3520 +E7E0 +2280 +22A0 +A4A0 +48E0 +ENDCHAR +STARTCHAR U_633E +ENCODING 25406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2540 +2540 +3BA0 +6100 +A280 +2440 +2820 +F020 +ENDCHAR +STARTCHAR U_633F +ENCODING 25407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +2100 +3FE0 +6920 +AFE0 +2920 +2FE0 +E100 +ENDCHAR +STARTCHAR U_6340 +ENCODING 25408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2680 +F900 +26E0 +2900 +3FE0 +6100 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_6341 +ENCODING 25409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +FFC0 +2100 +2FE0 +3000 +67C0 +A440 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6342 +ENCODING 25410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F7C0 +2240 +2240 +3FE0 +6000 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6343 +ENCODING 25411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FFE0 +2240 +2FC0 +3200 +63E0 +A620 +2A20 +23E0 +E220 +ENDCHAR +STARTCHAR U_6344 +ENCODING 25412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +2920 +3540 +6380 +A540 +2920 +2520 +E200 +ENDCHAR +STARTCHAR U_6345 +ENCODING 25413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +F100 +2FE0 +2920 +3FE0 +6920 +AFE0 +2920 +2920 +E8E0 +ENDCHAR +STARTCHAR U_6346 +ENCODING 25414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3BA0 +6D60 +A920 +2920 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6347 +ENCODING 25415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3280 +6AC0 +AAA0 +22A0 +2480 +E980 +ENDCHAR +STARTCHAR U_6348 +ENCODING 25416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2FE0 +2100 +3100 +6FE0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_6349 +ENCODING 25417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2440 +2FC0 +3100 +6500 +A5E0 +2500 +2B00 +F1E0 +ENDCHAR +STARTCHAR U_634A +ENCODING 25418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +FD20 +2280 +2FE0 +3040 +6080 +AFE0 +2080 +2280 +E100 +ENDCHAR +STARTCHAR U_634B +ENCODING 25419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F920 +2440 +2A80 +3FE0 +6080 +A480 +2280 +2080 +E380 +ENDCHAR +STARTCHAR U_634C +ENCODING 25420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F20 +2920 +F920 +2F20 +24A0 +34A0 +6FA0 +A5A0 +2520 +2920 +F660 +ENDCHAR +STARTCHAR U_634D +ENCODING 25421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2FC0 +3000 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_634E +ENCODING 25422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FB40 +27E0 +2C20 +37E0 +6420 +A7E0 +2420 +2420 +E4E0 +ENDCHAR +STARTCHAR U_634F +ENCODING 25423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2FC0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6350 +ENCODING 25424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2000 +2FE0 +3420 +E7E0 +2420 +27E0 +2420 +6460 +ENDCHAR +STARTCHAR U_6351 +ENCODING 25425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FDE0 +2520 +2DE0 +3400 +67C0 +A080 +2FE0 +2240 +EC20 +ENDCHAR +STARTCHAR U_6352 +ENCODING 25426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2D40 +37C0 +6100 +A380 +2540 +2920 +E100 +ENDCHAR +STARTCHAR U_6353 +ENCODING 25427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FAA0 +2AA0 +2FC0 +32A0 +62A0 +A6A0 +2AC0 +3280 +E680 +ENDCHAR +STARTCHAR U_6354 +ENCODING 25428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +2520 +2FE0 +3520 +67E0 +A520 +2520 +2920 +F060 +ENDCHAR +STARTCHAR U_6355 +ENCODING 25429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +2FE0 +3920 +6FE0 +A920 +2FE0 +2920 +E960 +ENDCHAR +STARTCHAR U_6356 +ENCODING 25430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2420 +2BC0 +3000 +6FE0 +A280 +22A0 +24A0 +E860 +ENDCHAR +STARTCHAR U_6357 +ENCODING 25431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +25E0 +FD00 +2500 +2FE0 +3100 +6520 +A940 +2080 +2300 +EC00 +ENDCHAR +STARTCHAR U_6358 +ENCODING 25432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FFA0 +2240 +2D20 +33C0 +6640 +AA80 +2100 +2280 +EC60 +ENDCHAR +STARTCHAR U_6359 +ENCODING 25433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +27C0 +2D40 +37C0 +6540 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_635A +ENCODING 25434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +3100 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_635B +ENCODING 25435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +F240 +2240 +23C0 +3000 +67E0 +A420 +2420 +2420 +E7E0 +ENDCHAR +STARTCHAR U_635C +ENCODING 25436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2D20 +37E0 +6100 +A7E0 +2240 +2180 +6660 +ENDCHAR +STARTCHAR U_635D +ENCODING 25437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +FA80 +27C0 +2440 +37C0 +6280 +A280 +22A0 +24A0 +E8E0 +ENDCHAR +STARTCHAR U_635E +ENCODING 25438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +27E0 +2C20 +3100 +6FE0 +A220 +2220 +2520 +E8C0 +ENDCHAR +STARTCHAR U_635F +ENCODING 25439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2000 +2FE0 +3420 +6520 +A520 +2520 +2280 +EC60 +ENDCHAR +STARTCHAR U_6360 +ENCODING 25440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F400 +27E0 +2480 +3480 +6480 +AFE0 +2280 +2460 +E820 +ENDCHAR +STARTCHAR U_6361 +ENCODING 25441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2420 +2BC0 +3000 +6A40 +A540 +2480 +2080 +EFE0 +ENDCHAR +STARTCHAR U_6362 +ENCODING 25442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +27C0 +2D40 +3540 +6FE0 +A100 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6363 +ENCODING 25443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +2540 +2C80 +37E0 +6220 +AAA0 +2AA0 +2FA0 +E0C0 +ENDCHAR +STARTCHAR U_6364 +ENCODING 25444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2480 +2F00 +35C0 +6700 +A5E0 +2700 +2920 +F0E0 +ENDCHAR +STARTCHAR U_6365 +ENCODING 25445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2400 +26E0 +3AA0 +6AA0 +A6E0 +2280 +24A0 +F860 +ENDCHAR +STARTCHAR U_6366 +ENCODING 25446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F500 +2880 +2760 +3200 +6F80 +A200 +2A40 +2680 +EFC0 +ENDCHAR +STARTCHAR U_6367 +ENCODING 25447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +2900 +3FE0 +6540 +ABA0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_6368 +ENCODING 25448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +27E0 +2900 +3FE0 +6100 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6369 +ENCODING 25449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2940 +3920 +6FE0 +A900 +2A80 +2440 +E820 +ENDCHAR +STARTCHAR U_636A +ENCODING 25450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FD00 +27E0 +2D00 +36A0 +67E0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_636B +ENCODING 25451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3820 +6820 +A820 +2820 +28A0 +E840 +ENDCHAR +STARTCHAR U_636C +ENCODING 25452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +FA40 +2BE0 +3E40 +6B40 +AAC0 +2A40 +B240 +52C0 +ENDCHAR +STARTCHAR U_636D +ENCODING 25453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2D20 +37E0 +6280 +A480 +2FE0 +2080 +E080 +ENDCHAR +STARTCHAR U_636E +ENCODING 25454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2C80 +37E0 +6480 +A7E0 +2E20 +AA20 +53E0 +ENDCHAR +STARTCHAR U_636F +ENCODING 25455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2F20 +F4A0 +2AA0 +2FA0 +34A0 +EFA0 +24A0 +2420 +2720 +7860 +ENDCHAR +STARTCHAR U_6370 +ENCODING 25456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +2FC0 +3100 +6FE0 +A100 +2380 +2540 +E920 +ENDCHAR +STARTCHAR U_6371 +ENCODING 25457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC80 +27E0 +2C80 +37E0 +E400 +2480 +2BE0 +A880 +57E0 +ENDCHAR +STARTCHAR U_6372 +ENCODING 25458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2200 +2FE0 +3440 +6FA0 +A480 +25A0 +2420 +E3E0 +ENDCHAR +STARTCHAR U_6373 +ENCODING 25459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +FC00 +27E0 +2C80 +3480 +6FE0 +A100 +2920 +2920 +EFE0 +ENDCHAR +STARTCHAR U_6374 +ENCODING 25460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +F480 +2A40 +24A0 +3780 +6000 +A240 +25A0 +2CA0 +F380 +ENDCHAR +STARTCHAR U_6375 +ENCODING 25461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +2AA0 +2FE0 +3AA0 +6AA0 +AFE0 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_6376 +ENCODING 25462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F100 +2FE0 +2540 +3540 +6FE0 +A540 +2FE0 +2100 +E7C0 +ENDCHAR +STARTCHAR U_6377 +ENCODING 25463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FC0 +2140 +3FE0 +6140 +AFE0 +2900 +2D00 +F3E0 +ENDCHAR +STARTCHAR U_6378 +ENCODING 25464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F940 +27E0 +2940 +37C0 +6520 +A3C0 +2540 +2920 +F720 +ENDCHAR +STARTCHAR U_6379 +ENCODING 25465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2540 +2BA0 +3100 +6240 +AFE0 +2240 +2240 +E440 +ENDCHAR +STARTCHAR U_637A +ENCODING 25466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +2BA0 +3000 +6FC0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_637B +ENCODING 25467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2120 +2FC0 +3080 +6100 +A240 +2AA0 +2A60 +F1C0 +ENDCHAR +STARTCHAR U_637C +ENCODING 25468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2380 +2540 +3920 +6FE0 +A240 +2480 +2380 +DC60 +ENDCHAR +STARTCHAR U_637D +ENCODING 25469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2240 +2A40 +35A0 +6100 +AFE0 +2100 +2100 +E100 +ENDCHAR +STARTCHAR U_637E +ENCODING 25470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +23C0 +2A40 +33C0 +6200 +A3E0 +2220 +23E0 +E220 +ENDCHAR +STARTCHAR U_637F +ENCODING 25471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F280 +27E0 +2280 +3780 +6200 +AFE0 +2480 +2300 +ECC0 +ENDCHAR +STARTCHAR U_6380 +ENCODING 25472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C80 +F8E0 +2920 +2F40 +3A40 +6A40 +AA40 +2AA0 +2AA0 +F320 +ENDCHAR +STARTCHAR U_6381 +ENCODING 25473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FFC0 +2400 +27C0 +3400 +6FE0 +A520 +24C0 +2540 +E620 +ENDCHAR +STARTCHAR U_6382 +ENCODING 25474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2480 +2CE0 +3480 +6480 +A7E0 +2A20 +2A20 +F3E0 +ENDCHAR +STARTCHAR U_6383 +ENCODING 25475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +2FE0 +3920 +6FC0 +A540 +2540 +25C0 +E100 +ENDCHAR +STARTCHAR U_6384 +ENCODING 25476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +FBA0 +2000 +2FE0 +3AA0 +6AA0 +AFE0 +2AA0 +2AA0 +E860 +ENDCHAR +STARTCHAR U_6385 +ENCODING 25477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2100 +3FE0 +6440 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6386 +ENCODING 25478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2AA0 +FFE0 +2920 +3D60 +6D60 +AFE0 +2C60 +A8A0 +4840 +ENDCHAR +STARTCHAR U_6387 +ENCODING 25479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +F240 +25A0 +2900 +3FE0 +6AA0 +A4A0 +2240 +25A0 +E920 +ENDCHAR +STARTCHAR U_6388 +ENCODING 25480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2A20 +F540 +2800 +2FE0 +3820 +67C0 +A480 +2300 +2480 +F860 +ENDCHAR +STARTCHAR U_6389 +ENCODING 25481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +2C40 +37C0 +6440 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_638A +ENCODING 25482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +2A80 +37E0 +6000 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_638B +ENCODING 25483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F800 +2BE0 +2A80 +3A80 +EBE0 +2A80 +2AA0 +2B60 +72A0 +ENDCHAR +STARTCHAR U_638C +ENCODING 25484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +9120 +3F80 +0400 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_638D +ENCODING 25485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +64A0 +A7C0 +24A0 +25A0 +EE60 +ENDCHAR +STARTCHAR U_638E +ENCODING 25486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +27E0 +3040 +6740 +A540 +2740 +2040 +E1C0 +ENDCHAR +STARTCHAR U_638F +ENCODING 25487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F820 +27A0 +2220 +3FE0 +6220 +AAA0 +2FA0 +2020 +E0C0 +ENDCHAR +STARTCHAR U_6390 +ENCODING 25488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +F440 +2A80 +2CE0 +3820 +6820 +AEE0 +2820 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6391 +ENCODING 25489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +2440 +37C0 +6440 +AFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6392 +ENCODING 25490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FEE0 +2280 +2280 +3EE0 +6280 +A280 +2EE0 +2280 +E280 +ENDCHAR +STARTCHAR U_6393 +ENCODING 25491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2700 +F4E0 +24A0 +2FA0 +34A0 +6EA0 +B540 +2540 +24A0 +ED20 +ENDCHAR +STARTCHAR U_6394 +ENCODING 25492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +FA40 +8980 +FA60 +A400 +FF80 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_6395 +ENCODING 25493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +2480 +3A60 +6380 +A680 +2100 +A280 +4C60 +ENDCHAR +STARTCHAR U_6396 +ENCODING 25494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F480 +24E0 +2D20 +36A0 +6540 +A540 +2480 +2540 +E620 +ENDCHAR +STARTCHAR U_6397 +ENCODING 25495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +F280 +2EE0 +2820 +3820 +E820 +2EE0 +2280 +A280 +4FE0 +ENDCHAR +STARTCHAR U_6398 +ENCODING 25496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2880 +2AA0 +3BE0 +E880 +2AA0 +2AA0 +AAA0 +53E0 +ENDCHAR +STARTCHAR U_6399 +ENCODING 25497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2FA0 +FA40 +2500 +27C0 +3140 +EFE0 +2140 +27C0 +A100 +4700 +ENDCHAR +STARTCHAR U_639A +ENCODING 25498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F100 +2FE0 +2DA0 +3B60 +6B60 +ADA0 +2920 +29A0 +E940 +ENDCHAR +STARTCHAR U_639B +ENCODING 25499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FE80 +2480 +2FC0 +30A0 +64A0 +AF80 +2480 +2780 +F880 +ENDCHAR +STARTCHAR U_639C +ENCODING 25500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2E60 +F820 +2EE0 +2820 +3FE0 +EAA0 +2280 +22A0 +A4A0 +4860 +ENDCHAR +STARTCHAR U_639D +ENCODING 25501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +2E80 +3AA0 +EEA0 +20C0 +26A0 +B960 +4220 +ENDCHAR +STARTCHAR U_639E +ENCODING 25502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2540 +F580 +2A40 +2920 +3120 +6540 +A580 +2A40 +2420 +E820 +ENDCHAR +STARTCHAR U_639F +ENCODING 25503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2000 +2FE0 +3100 +6500 +A5E0 +2500 +2B00 +F1E0 +ENDCHAR +STARTCHAR U_63A0 +ENCODING 25504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +27C0 +2440 +3440 +67C0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_63A1 +ENCODING 25505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2FA0 +FA20 +2540 +2100 +3FE0 +6100 +A380 +2540 +2920 +F120 +ENDCHAR +STARTCHAR U_63A2 +ENCODING 25506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +F280 +2440 +2920 +3100 +6FE0 +A100 +2580 +2940 +F120 +ENDCHAR +STARTCHAR U_63A3 +ENCODING 25507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5020 +7EA0 +90A0 +FEA0 +5460 +5F80 +0200 +7FE0 +0200 +FFE0 +0600 +ENDCHAR +STARTCHAR U_63A4 +ENCODING 25508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2EE0 +2AA0 +3AA0 +6EE0 +AAA0 +2AA0 +2AA0 +F760 +ENDCHAR +STARTCHAR U_63A5 +ENCODING 25509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3100 +6FE0 +A240 +2680 +2140 +EE20 +ENDCHAR +STARTCHAR U_63A6 +ENCODING 25510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2C40 +27C0 +3200 +67E0 +AAA0 +24A0 +2120 +E2C0 +ENDCHAR +STARTCHAR U_63A7 +ENCODING 25511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2280 +2440 +3820 +67C0 +A100 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63A8 +ENCODING 25512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +F7E0 +2480 +2C80 +37E0 +6480 +A7E0 +2480 +2480 +E7E0 +ENDCHAR +STARTCHAR U_63A9 +ENCODING 25513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2540 +2FE0 +3540 +67C0 +A540 +27C0 +2120 +E0E0 +ENDCHAR +STARTCHAR U_63AA +ENCODING 25514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +F280 +2280 +2FE0 +3000 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63AB +ENCODING 25515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2BE0 +FAA0 +2EA0 +2AA0 +3EA0 +EAA0 +2BA0 +3E40 +A2A0 +6320 +ENDCHAR +STARTCHAR U_63AC +ENCODING 25516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F960 +25A0 +2320 +3FE0 +E120 +23A0 +2560 +A920 +61C0 +ENDCHAR +STARTCHAR U_63AD +ENCODING 25517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2280 +2440 +3920 +6540 +A5A0 +2960 +2500 +E200 +ENDCHAR +STARTCHAR U_63AE +ENCODING 25518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F420 +27E0 +2400 +37E0 +6420 +A7E0 +2A20 +2BE0 +F260 +ENDCHAR +STARTCHAR U_63AF +ENCODING 25519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22E0 +F280 +2FE0 +2000 +37E0 +6420 +A7E0 +2420 +27E0 +E460 +ENDCHAR +STARTCHAR U_63B0 +ENCODING 25520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +EDC0 +4A40 +53E0 +F040 +5E40 +EBE0 +4A40 +4A40 +5240 +E4C0 +ENDCHAR +STARTCHAR U_63B1 +ENCODING 25521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +3F80 +0400 +FFE0 +2480 +FFE0 +2080 +FBE0 +2080 +E380 +ENDCHAR +STARTCHAR U_63B2 +ENCODING 25522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2C40 +27C0 +3200 +67E0 +ACA0 +2520 +27A0 +E040 +ENDCHAR +STARTCHAR U_63B3 +ENCODING 25523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +F7E0 +2520 +27C0 +3520 +65E0 +A480 +27E0 +2A20 +F4C0 +ENDCHAR +STARTCHAR U_63B4 +ENCODING 25524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2920 +2920 +3BA0 +6920 +A960 +2FE0 +2820 +EFE0 +ENDCHAR +STARTCHAR U_63B5 +ENCODING 25525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +2440 +2BA0 +3000 +6EE0 +AAA0 +2AA0 +2EE0 +E080 +ENDCHAR +STARTCHAR U_63B6 +ENCODING 25526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +2FC0 +2940 +3FE0 +6940 +AFC0 +2900 +2A80 +F460 +ENDCHAR +STARTCHAR U_63B7 +ENCODING 25527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +24A0 +FFA0 +24C0 +24A0 +3FA0 +E4A0 +24E0 +2A80 +B180 +4080 +ENDCHAR +STARTCHAR U_63B8 +ENCODING 25528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2540 +27C0 +3540 +67C0 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_63B9 +ENCODING 25529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +F100 +2FE0 +2100 +3500 +6200 +AFE0 +2AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_63BA +ENCODING 25530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +FFA0 +2100 +2FE0 +3540 +6AA0 +A500 +2240 +2080 +E700 +ENDCHAR +STARTCHAR U_63BB +ENCODING 25531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2480 +F300 +2280 +2D60 +3100 +67C0 +A540 +27C0 +2140 +EFA0 +ENDCHAR +STARTCHAR U_63BC +ENCODING 25532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFE0 +2540 +27C0 +3000 +E7C0 +2540 +2540 +2280 +6C60 +ENDCHAR +STARTCHAR U_63BD +ENCODING 25533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F000 +27E0 +2280 +3AA0 +6AA0 +A6C0 +2280 +2280 +EFE0 +ENDCHAR +STARTCHAR U_63BE +ENCODING 25534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +F780 +2080 +2FE0 +3540 +6A80 +A5C0 +2AA0 +24A0 +EB00 +ENDCHAR +STARTCHAR U_63BF +ENCODING 25535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +F280 +2100 +2FE0 +3200 +67C0 +AC40 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63C0 +ENCODING 25536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2920 +3AA0 +6FE0 +A100 +2380 +2540 +F920 +ENDCHAR +STARTCHAR U_63C1 +ENCODING 25537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +23C0 +2200 +FFC0 +2840 +2FC0 +3840 +6FC0 +A840 +2FC0 +2480 +6840 +ENDCHAR +STARTCHAR U_63C2 +ENCODING 25538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +2FE0 +3AA0 +6CE0 +A820 +2FE0 +2820 +EFE0 +ENDCHAR +STARTCHAR U_63C3 +ENCODING 25539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2000 +2E20 +3AA0 +6EA0 +AAA0 +2EA0 +2A20 +EAE0 +ENDCHAR +STARTCHAR U_63C4 +ENCODING 25540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +FFA0 +2000 +2E20 +3AA0 +6EA0 +AAA0 +2EA0 +2A20 +EA60 +ENDCHAR +STARTCHAR U_63C5 +ENCODING 25541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2140 +3BE0 +6940 +BF40 +0200 +3FC0 +0200 +7FE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_63C6 +ENCODING 25542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2580 +F2A0 +2440 +2BA0 +3100 +6100 +AFE0 +2280 +2440 +F820 +ENDCHAR +STARTCHAR U_63C7 +ENCODING 25543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2AA0 +3920 +6FE0 +A920 +2FE0 +2920 +E860 +ENDCHAR +STARTCHAR U_63C8 +ENCODING 25544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FA20 +2FE0 +2020 +37A0 +6020 +A7A0 +24A0 +27A0 +E0C0 +ENDCHAR +STARTCHAR U_63C9 +ENCODING 25545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +FFE0 +2320 +2500 +3B00 +E100 +2FE0 +2380 +2540 +6920 +ENDCHAR +STARTCHAR U_63CA +ENCODING 25546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +F7C0 +2440 +27C0 +3000 +6FE0 +A920 +2FE0 +2920 +EFE0 +ENDCHAR +STARTCHAR U_63CB +ENCODING 25547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27C0 +3000 +6FE0 +A520 +24C0 +2540 +E620 +ENDCHAR +STARTCHAR U_63CC +ENCODING 25548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +3820 +6200 +A540 +2CA0 +24A0 +E380 +ENDCHAR +STARTCHAR U_63CD +ENCODING 25549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2200 +3FE0 +6B40 +A120 +2FE0 +2280 +EC60 +ENDCHAR +STARTCHAR U_63CE +ENCODING 25550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2000 +2FE0 +3440 +67C0 +A440 +27C0 +2000 +EFE0 +ENDCHAR +STARTCHAR U_63CF +ENCODING 25551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2000 +27E0 +3520 +6520 +A7E0 +2520 +27E0 +E420 +ENDCHAR +STARTCHAR U_63D0 +ENCODING 25552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +6FE0 +A500 +25E0 +2B00 +F1E0 +ENDCHAR +STARTCHAR U_63D1 +ENCODING 25553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26E0 +F420 +26E0 +2420 +37E0 +6000 +A7E0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63D2 +ENCODING 25554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +2100 +3560 +6920 +AD60 +2920 +2920 +EFE0 +ENDCHAR +STARTCHAR U_63D3 +ENCODING 25555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +45E0 +FE00 +5080 +5EE0 +77A0 +D6A0 +56E0 +5680 +5620 +ADE0 +ENDCHAR +STARTCHAR U_63D4 +ENCODING 25556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +26A0 +2520 +3AE0 +E000 +2240 +2D20 +3440 +63C0 +ENDCHAR +STARTCHAR U_63D5 +ENCODING 25557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F240 +23C0 +2A40 +33C0 +E240 +2FE0 +2540 +2620 +67E0 +ENDCHAR +STARTCHAR U_63D6 +ENCODING 25558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2000 +2FE0 +3440 +67C0 +A440 +24E0 +2F40 +E040 +ENDCHAR +STARTCHAR U_63D7 +ENCODING 25559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2880 +FFE0 +2880 +2BE0 +3A20 +6BE0 +AA20 +2BE0 +2A20 +F3E0 +ENDCHAR +STARTCHAR U_63D8 +ENCODING 25560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +27C0 +2440 +3FE0 +6100 +A7C0 +2100 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63D9 +ENCODING 25561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2800 +3FE0 +6AA0 +AFE0 +2AA0 +2AA0 +EA60 +ENDCHAR +STARTCHAR U_63DA +ENCODING 25562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +2FE0 +3200 +67E0 +AAA0 +24A0 +2920 +E2C0 +ENDCHAR +STARTCHAR U_63DB +ENCODING 25563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FE0 +2AA0 +3AA0 +6C60 +A100 +2FE0 +2280 +EC60 +ENDCHAR +STARTCHAR U_63DC +ENCODING 25564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F7C0 +2820 +27C0 +3440 +67C0 +A280 +2FE0 +2480 +E880 +ENDCHAR +STARTCHAR U_63DD +ENCODING 25565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +FAA0 +2A80 +2680 +39E0 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63DE +ENCODING 25566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3000 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63DF +ENCODING 25567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +FDC0 +2700 +28E0 +37C0 +6440 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_63E0 +ENCODING 25568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +FBC0 +2A40 +2BC0 +3900 +6FE0 +AA40 +2980 +2A40 +EFE0 +ENDCHAR +STARTCHAR U_63E1 +ENCODING 25569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2400 +27E0 +3540 +67E0 +A480 +27E0 +2880 +F7E0 +ENDCHAR +STARTCHAR U_63E2 +ENCODING 25570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +23C0 +2640 +3980 +6240 +AFE0 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63E3 +ENCODING 25571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +2FE0 +3200 +6FE0 +AAA0 +2AA0 +2AA0 +E860 +ENDCHAR +STARTCHAR U_63E4 +ENCODING 25572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +FAA0 +2EA0 +2AA0 +3EA0 +68A0 +AAA0 +2AE0 +2D80 +E880 +ENDCHAR +STARTCHAR U_63E5 +ENCODING 25573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3920 +67C0 +A540 +2540 +25C0 +E100 +ENDCHAR +STARTCHAR U_63E6 +ENCODING 25574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FA0 +F220 +2FA0 +2AA0 +3FA0 +6620 +AB20 +2AA0 +2220 +E260 +ENDCHAR +STARTCHAR U_63E7 +ENCODING 25575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +54A0 +7CA0 +5420 +9260 +3FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_63E8 +ENCODING 25576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F000 +27C0 +2440 +3FE0 +6820 +A7C0 +2100 +2100 +E300 +ENDCHAR +STARTCHAR U_63E9 +ENCODING 25577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +FFC0 +24A0 +2760 +3200 +67C0 +A440 +27C0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_63EA +ENCODING 25578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2480 +F4A0 +2FC0 +2580 +3680 +6D80 +A480 +2540 +2620 +6420 +ENDCHAR +STARTCHAR U_63EB +ENCODING 25579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +22A0 +FCC0 +2980 +6640 +A420 +7FC0 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_63EC +ENCODING 25580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F840 +2480 +2A40 +3280 +6FC0 +A200 +2500 +2480 +F860 +ENDCHAR +STARTCHAR U_63ED +ENCODING 25581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +27C0 +3400 +6FE0 +B920 +2AA0 +AFA0 +40C0 +ENDCHAR +STARTCHAR U_63EE +ENCODING 25582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2540 +27C0 +3540 +67C0 +A100 +2FE0 +A100 +4100 +ENDCHAR +STARTCHAR U_63EF +ENCODING 25583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2480 +F500 +25E0 +2720 +35A0 +E560 +25A0 +2560 +2440 +E5E0 +ENDCHAR +STARTCHAR U_63F0 +ENCODING 25584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2FE0 +27C0 +3540 +67C0 +A540 +2FE0 +2100 +EFE0 +ENDCHAR +STARTCHAR U_63F1 +ENCODING 25585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D620 +7D20 +4520 +7520 +5CE0 +4700 +0400 +3FC0 +0400 +7FE0 +0C00 +ENDCHAR +STARTCHAR U_63F2 +ENCODING 25586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F540 +25C0 +2C00 +37E0 +6100 +AFE0 +2380 +2540 +E920 +ENDCHAR +STARTCHAR U_63F3 +ENCODING 25587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2EA0 +F4A0 +2EA0 +24A0 +3FA0 +6540 +AFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_63F4 +ENCODING 25588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +F2C0 +2FE0 +2100 +3FE0 +6200 +A3E0 +2540 +2880 +D360 +ENDCHAR +STARTCHAR U_63F5 +ENCODING 25589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +23E0 +F2A0 +27E0 +2C80 +35E0 +6480 +B7E0 +2880 +AC80 +53E0 +ENDCHAR +STARTCHAR U_63F6 +ENCODING 25590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2AA0 +FAA0 +2EA0 +2AC0 +3AA0 +6EA0 +AAA0 +2BA0 +BEC0 +4280 +ENDCHAR +STARTCHAR U_63F7 +ENCODING 25591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +F100 +2FE0 +2100 +3D60 +E920 +2D60 +2920 +AFE0 +4100 +ENDCHAR +STARTCHAR U_63F8 +ENCODING 25592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +2920 +27C0 +3440 +67C0 +A440 +27C0 +A000 +4FE0 +ENDCHAR +STARTCHAR U_63F9 +ENCODING 25593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2EC0 +F2A0 +2EE0 +2000 +37C0 +6440 +A7C0 +2440 +A7C0 +44C0 +ENDCHAR +STARTCHAR U_63FA +ENCODING 25594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +F020 +2520 +2540 +3FE0 +E100 +2FE0 +2100 +A920 +4FE0 +ENDCHAR +STARTCHAR U_63FB +ENCODING 25595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4140 +FFE0 +5080 +5FA0 +74A0 +DFA0 +55A0 +5640 +56C0 +EB20 +ENDCHAR +STARTCHAR U_63FC +ENCODING 25596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4400 +EFC0 +5440 +4440 +67C0 +C120 +4D40 +4580 +4940 +D320 +ENDCHAR +STARTCHAR U_63FD +ENCODING 25597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +FB40 +2A20 +2000 +37C0 +6540 +A540 +2540 +22A0 +ECE0 +ENDCHAR +STARTCHAR U_63FE +ENCODING 25598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4880 +EF80 +4880 +4F80 +6000 +5FC0 +D540 +5540 +5540 +FFE0 +ENDCHAR +STARTCHAR U_63FF +ENCODING 25599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2E80 +F0E0 +2E20 +2440 +3F40 +6440 +A540 +2640 +ACA0 +4120 +ENDCHAR +STARTCHAR U_6400 +ENCODING 25600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F880 +2FC0 +2A40 +3FC0 +E4A0 +2B60 +3080 +A600 +4180 +ENDCHAR +STARTCHAR U_6401 +ENCODING 25601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4420 +F7E0 +54A0 +5320 +54A0 +FFE0 +54A0 +54A0 +57A0 +D060 +ENDCHAR +STARTCHAR U_6402 +ENCODING 25602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2540 +2920 +3100 +6FE0 +A240 +2680 +A180 +4E60 +ENDCHAR +STARTCHAR U_6403 +ENCODING 25603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7E0 +2420 +3420 +27E0 +6000 +A240 +3520 +B4A0 +43C0 +ENDCHAR +STARTCHAR U_6404 +ENCODING 25604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +E800 +5FC0 +5A40 +6BC0 +CA40 +4A40 +4BC0 +4800 +CFE0 +ENDCHAR +STARTCHAR U_6405 +ENCODING 25605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2540 +FFE0 +2820 +2FC0 +3440 +E540 +2540 +2300 +2520 +69E0 +ENDCHAR +STARTCHAR U_6406 +ENCODING 25606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2280 +3FE0 +6540 +A7C0 +2540 +2FE0 +E4C0 +ENDCHAR +STARTCHAR U_6407 +ENCODING 25607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +5CE0 +E200 +4FC0 +4080 +6300 +DFE0 +4200 +4D40 +5480 +C660 +ENDCHAR +STARTCHAR U_6408 +ENCODING 25608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F840 +2480 +2640 +3B00 +6480 +AFE0 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_6409 +ENCODING 25609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA20 +2480 +2FE0 +3480 +E7E0 +2480 +27E0 +2480 +67E0 +ENDCHAR +STARTCHAR U_640A +ENCODING 25610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +F520 +27E0 +2240 +37E0 +6860 +A560 +27E0 +2220 +ECC0 +ENDCHAR +STARTCHAR U_640B +ENCODING 25611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28E0 +F880 +2BE0 +2AA0 +3BC0 +6AA0 +ABE0 +2A40 +AA40 +5460 +ENDCHAR +STARTCHAR U_640C +ENCODING 25612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2540 +27E0 +3540 +67E0 +A6A0 +2A40 +AB40 +5220 +ENDCHAR +STARTCHAR U_640D +ENCODING 25613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2000 +27E0 +3420 +67E0 +A420 +27E0 +A280 +4C60 +ENDCHAR +STARTCHAR U_640E +ENCODING 25614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F40 +2280 +F540 +24A0 +2DC0 +34A0 +EFE0 +3480 +25C0 +B6A0 +4DA0 +ENDCHAR +STARTCHAR U_640F +ENCODING 25615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +F540 +27C0 +2D40 +37C0 +E540 +3FE0 +2480 +2280 +6180 +ENDCHAR +STARTCHAR U_6410 +ENCODING 25616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2140 +27E0 +3000 +E7E0 +2520 +27E0 +2520 +67E0 +ENDCHAR +STARTCHAR U_6411 +ENCODING 25617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2440 +37C0 +6440 +A7C0 +2460 +2FC0 +E040 +ENDCHAR +STARTCHAR U_6412 +ENCODING 25618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F280 +2FE0 +2920 +3FE0 +6200 +A3E0 +2220 +24A0 +F840 +ENDCHAR +STARTCHAR U_6413 +ENCODING 25619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +27C0 +3100 +6FE0 +A400 +2FC0 +2100 +EFE0 +ENDCHAR +STARTCHAR U_6414 +ENCODING 25620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +FA40 +2180 +2E60 +3100 +67E0 +A520 +27E0 +2140 +EFA0 +ENDCHAR +STARTCHAR U_6415 +ENCODING 25621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2200 +3440 +6FA0 +A000 +2FE0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_6416 +ENCODING 25622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +F540 +2A80 +2300 +3FC0 +E500 +2FE0 +3100 +2920 +6FE0 +ENDCHAR +STARTCHAR U_6417 +ENCODING 25623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +2C40 +37E0 +6400 +A7E0 +2AA0 +2FA0 +E0C0 +ENDCHAR +STARTCHAR U_6418 +ENCODING 25624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +2140 +FFE0 +2240 +27A0 +3A20 +67E0 +A420 +27E0 +2420 +E7E0 +ENDCHAR +STARTCHAR U_6419 +ENCODING 25625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FFE0 +2B40 +2A80 +3B60 +6880 +AFE0 +2A80 +2880 +F180 +ENDCHAR +STARTCHAR U_641A +ENCODING 25626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +FFE0 +24A0 +2920 +37E0 +6420 +A7E0 +2420 +27E0 +E460 +ENDCHAR +STARTCHAR U_641B +ENCODING 25627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2FE0 +F500 +2FC0 +2540 +3FE0 +6540 +AFC0 +2580 +2D40 +F520 +ENDCHAR +STARTCHAR U_641C +ENCODING 25628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2D60 +F920 +2D60 +2920 +3FE0 +6100 +AFC0 +2480 +2300 +ECE0 +ENDCHAR +STARTCHAR U_641D +ENCODING 25629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F840 +2FC0 +2840 +3FC0 +6280 +AFE0 +2200 +2580 +F860 +ENDCHAR +STARTCHAR U_641E +ENCODING 25630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +27C0 +2000 +3FE0 +6820 +ABA0 +2AA0 +2BA0 +E860 +ENDCHAR +STARTCHAR U_641F +ENCODING 25631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +5F40 +E440 +5F40 +55E0 +7F40 +D540 +5F40 +4440 +5F40 +C440 +ENDCHAR +STARTCHAR U_6420 +ENCODING 25632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +24A0 +FFA0 +22E0 +2AA0 +3AA0 +6FE0 +A2A0 +22A0 +2520 +EA60 +ENDCHAR +STARTCHAR U_6421 +ENCODING 25633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +F7E0 +2AA0 +2440 +3AA0 +6120 +AFE0 +2580 +2940 +F120 +ENDCHAR +STARTCHAR U_6422 +ENCODING 25634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FAA0 +26C0 +2280 +3FE0 +6440 +A7C0 +2440 +2440 +E7C0 +ENDCHAR +STARTCHAR U_6423 +ENCODING 25635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2880 +2F80 +3AA0 +6BA0 +AEC0 +2BA0 +2AE0 +F520 +ENDCHAR +STARTCHAR U_6424 +ENCODING 25636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F000 +2FE0 +2280 +3440 +6FE0 +A540 +2540 +2540 +FFE0 +ENDCHAR +STARTCHAR U_6425 +ENCODING 25637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +F520 +21E0 +2100 +3DE0 +6520 +A5E0 +2520 +2A00 +F1E0 +ENDCHAR +STARTCHAR U_6426 +ENCODING 25638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +FEE0 +2880 +2EE0 +3220 +EAA0 +2660 +3BA0 +A220 +6CC0 +ENDCHAR +STARTCHAR U_6427 +ENCODING 25639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2800 +3FE0 +6920 +ADA0 +2B60 +2DA0 +F360 +ENDCHAR +STARTCHAR U_6428 +ENCODING 25640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +6FE0 +AAA0 +2660 +2BA0 +E660 +ENDCHAR +STARTCHAR U_6429 +ENCODING 25641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +F940 +2FE0 +2240 +3D40 +6FE0 +A380 +2540 +2960 +E100 +ENDCHAR +STARTCHAR U_642A +ENCODING 25642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +2FC0 +2940 +3FE0 +6940 +AFC0 +2A40 +2A40 +F3C0 +ENDCHAR +STARTCHAR U_642B +ENCODING 25643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA60 +FFC0 +AA40 +8980 +3F40 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_642C +ENCODING 25644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +5DC0 +F540 +5D40 +5560 +7E00 +55C0 +DD40 +5480 +5540 +EE20 +ENDCHAR +STARTCHAR U_642D +ENCODING 25645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2100 +2280 +3440 +EBA0 +2000 +27C0 +A440 +47C0 +ENDCHAR +STARTCHAR U_642E +ENCODING 25646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3100 +6FE0 +A100 +2380 +2560 +F920 +ENDCHAR +STARTCHAR U_642F +ENCODING 25647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F520 +22C0 +2200 +3CE0 +6820 +AEE0 +2820 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6430 +ENCODING 25648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F740 +2FE0 +2820 +37C0 +6440 +A7C0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6431 +ENCODING 25649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +2480 +27E0 +3540 +67E0 +A480 +2BE0 +2880 +F080 +ENDCHAR +STARTCHAR U_6432 +ENCODING 25650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +FAC0 +2440 +29E0 +3E80 +6A80 +AA80 +2A40 +2BA0 +F2A0 +ENDCHAR +STARTCHAR U_6433 +ENCODING 25651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +2100 +37C0 +6100 +AFE0 +2440 +27C0 +E440 +ENDCHAR +STARTCHAR U_6434 +ENCODING 25652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +1FC0 +0900 +FFE0 +2240 +DFA0 +0200 +3FE0 +0200 +ENDCHAR +STARTCHAR U_6435 +ENCODING 25653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FEC0 +2440 +2FC0 +3000 +EFE0 +2AA0 +2AA0 +2AA0 +6FE0 +ENDCHAR +STARTCHAR U_6436 +ENCODING 25654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +28A0 +27C0 +3440 +67C0 +A440 +27E0 +2A20 +EBE0 +ENDCHAR +STARTCHAR U_6437 +ENCODING 25655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +3740 +65C0 +A440 +2FE0 +2280 +EC60 +ENDCHAR +STARTCHAR U_6438 +ENCODING 25656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +E200 +5FE0 +4480 +6F40 +D220 +4FC0 +4680 +4A40 +D220 +ENDCHAR +STARTCHAR U_6439 +ENCODING 25657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +F7C0 +2000 +2FE0 +3AA0 +6920 +AFE0 +2920 +2920 +E860 +ENDCHAR +STARTCHAR U_643A +ENCODING 25658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F480 +27E0 +2480 +37E0 +6480 +AFE0 +2240 +2420 +E8E0 +ENDCHAR +STARTCHAR U_643B +ENCODING 25659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +6EC0 +0000 +3F80 +2080 +3F80 +FBE0 +2080 +FBE0 +2080 +ENDCHAR +STARTCHAR U_643C +ENCODING 25660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F100 +2FE0 +2440 +3BA0 +6120 +A7C0 +2100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_643D +ENCODING 25661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2380 +2440 +3920 +67C0 +A100 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_643E +ENCODING 25662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2440 +2200 +37E0 +6A00 +A3C0 +2200 +23E0 +E200 +ENDCHAR +STARTCHAR U_643F +ENCODING 25663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12E0 +E640 +2940 +2FE0 +7040 +2F40 +29E0 +F940 +2F40 +4940 +80C0 +ENDCHAR +STARTCHAR U_6440 +ENCODING 25664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F440 +27C0 +2400 +37E0 +6400 +A7E0 +2520 +2AA0 +EAC0 +ENDCHAR +STARTCHAR U_6441 +ENCODING 25665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +2520 +2EA0 +37E0 +6100 +A2C0 +2A20 +2A60 +F1C0 +ENDCHAR +STARTCHAR U_6442 +ENCODING 25666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FBC0 +2240 +2FE0 +3040 +6820 +A6C0 +2000 +26C0 +E820 +ENDCHAR +STARTCHAR U_6443 +ENCODING 25667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +27C0 +3440 +67C0 +A440 +27C0 +2280 +EC60 +ENDCHAR +STARTCHAR U_6444 +ENCODING 25668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +FBC0 +2240 +2BC0 +3240 +6FE0 +AAA0 +2440 +2AA0 +F120 +ENDCHAR +STARTCHAR U_6445 +ENCODING 25669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +2920 +29C0 +3F20 +69E0 +AB40 +2AA0 +2E40 +F1C0 +ENDCHAR +STARTCHAR U_6446 +ENCODING 25670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +2100 +37C0 +6100 +AFE0 +2200 +2440 +EFE0 +ENDCHAR +STARTCHAR U_6447 +ENCODING 25671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +FA20 +2540 +27C0 +3900 +6FE0 +A100 +2920 +2FE0 +E820 +ENDCHAR +STARTCHAR U_6448 +ENCODING 25672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2780 +2400 +37C0 +6480 +AFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_6449 +ENCODING 25673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F020 +4480 +5A60 +6300 +DCE0 +4200 +5FC0 +4480 +CF00 +ENDCHAR +STARTCHAR U_644A +ENCODING 25674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2E40 +F3E0 +2B40 +25E0 +3540 +6540 +ABE0 +3340 +2140 +E1E0 +ENDCHAR +STARTCHAR U_644B +ENCODING 25675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55C0 +4940 +F540 +4A60 +49C0 +7E40 +C940 +5D40 +6A80 +4940 +CA20 +ENDCHAR +STARTCHAR U_644C +ENCODING 25676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2A80 +3BC0 +EC80 +2BC0 +2880 +A880 +57E0 +ENDCHAR +STARTCHAR U_644D +ENCODING 25677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27E0 +2480 +3DE0 +6520 +A5E0 +2520 +25E0 +E520 +ENDCHAR +STARTCHAR U_644E +ENCODING 25678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +F660 +2AA0 +2300 +3480 +6A60 +A500 +2240 +2480 +E300 +ENDCHAR +STARTCHAR U_644F +ENCODING 25679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +E200 +4FC0 +4200 +7FE0 +D5C0 +68A0 +4D80 +4880 +CF80 +ENDCHAR +STARTCHAR U_6450 +ENCODING 25680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +F940 +22A0 +2CA0 +3880 +6A80 +AAE0 +2A80 +2D80 +E8E0 +ENDCHAR +STARTCHAR U_6451 +ENCODING 25681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5160 +FFE0 +5120 +5D60 +75A0 +DD20 +52A0 +5C60 +D020 +5FE0 +ENDCHAR +STARTCHAR U_6452 +ENCODING 25682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2540 +2480 +37E0 +6540 +A7E0 +2540 +2540 +EA40 +ENDCHAR +STARTCHAR U_6453 +ENCODING 25683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +27E0 +F540 +2080 +2F60 +3480 +67E0 +A480 +27E0 +2A80 +F1E0 +ENDCHAR +STARTCHAR U_6454 +ENCODING 25684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2920 +2540 +37A0 +6940 +A100 +2FE0 +2100 +E100 +ENDCHAR +STARTCHAR U_6455 +ENCODING 25685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FE0 +5540 +F760 +4000 +7FE0 +D220 +4FC0 +4A40 +4AC0 +C200 +ENDCHAR +STARTCHAR U_6456 +ENCODING 25686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +5E20 +F2C0 +4C40 +4BA0 +7000 +C7C0 +4100 +4540 +4920 +C300 +ENDCHAR +STARTCHAR U_6457 +ENCODING 25687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +E4E0 +5F20 +5500 +7F40 +C440 +4E40 +5540 +64A0 +C520 +ENDCHAR +STARTCHAR U_6458 +ENCODING 25688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2920 +3FE0 +E920 +2BA0 +2AA0 +2BA0 +6860 +ENDCHAR +STARTCHAR U_6459 +ENCODING 25689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2480 +F3E0 +22A0 +23E0 +3AA0 +6BE0 +A880 +2BE0 +2C80 +F3E0 +ENDCHAR +STARTCHAR U_645A +ENCODING 25690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFE0 +2820 +27C0 +3440 +E7C0 +2100 +27C0 +A100 +4FE0 +ENDCHAR +STARTCHAR U_645B +ENCODING 25691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +26C0 +2540 +37C0 +E100 +2FE0 +2AA0 +ABA0 +6860 +ENDCHAR +STARTCHAR U_645C +ENCODING 25692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFE0 +2540 +27C0 +3C40 +E7C0 +2440 +27C0 +2440 +6820 +ENDCHAR +STARTCHAR U_645D +ENCODING 25693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2FE0 +2AA0 +3FE0 +E880 +2CA0 +2FC0 +B4A0 +66E0 +ENDCHAR +STARTCHAR U_645E +ENCODING 25694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +3240 +E780 +2240 +2FE0 +A540 +7B20 +ENDCHAR +STARTCHAR U_645F +ENCODING 25695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +2FE0 +2540 +3FE0 +E920 +2FE0 +2440 +2380 +6C60 +ENDCHAR +STARTCHAR U_6460 +ENCODING 25696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2AC0 +2D40 +3AC0 +EFC0 +2540 +24A0 +AC60 +73C0 +ENDCHAR +STARTCHAR U_6461 +ENCODING 25697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +F940 +2F40 +29E0 +3F40 +E840 +2A40 +2EC0 +A940 +4260 +ENDCHAR +STARTCHAR U_6462 +ENCODING 25698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4200 +FFE0 +5220 +5FC0 +7220 +DFE0 +5540 +5FE0 +5100 +A300 +ENDCHAR +STARTCHAR U_6463 +ENCODING 25699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4200 +FFE0 +5240 +5F80 +7220 +D7E0 +5440 +57C0 +5440 +AFE0 +ENDCHAR +STARTCHAR U_6464 +ENCODING 25700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2BA0 +2540 +3BA0 +EBA0 +2540 +2BA0 +A280 +4C60 +ENDCHAR +STARTCHAR U_6465 +ENCODING 25701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FC40 +27C0 +2440 +3FE0 +2400 +EFE0 +34A0 +A920 +66C0 +ENDCHAR +STARTCHAR U_6466 +ENCODING 25702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4AA0 +F6A0 +5EA0 +62A0 +7EA0 +D2A0 +5EA0 +42A0 +52E0 +CDA0 +ENDCHAR +STARTCHAR U_6467 +ENCODING 25703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +24A0 +F7E0 +2280 +37E0 +2C80 +F7C0 +2480 +27C0 +A480 +67E0 +ENDCHAR +STARTCHAR U_6468 +ENCODING 25704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2AA0 +29C0 +3EA0 +EA80 +2BC0 +2C80 +ABE0 +7080 +ENDCHAR +STARTCHAR U_6469 +ENCODING 25705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +4200 +7FE0 +4200 +8E00 +ENDCHAR +STARTCHAR U_646A +ENCODING 25706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +55E0 +F720 +5CC0 +6480 +C540 +7FE0 +5440 +5540 +5440 +A4C0 +ENDCHAR +STARTCHAR U_646B +ENCODING 25707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FFE0 +2520 +25E0 +2F20 +E5E0 +2440 +2AC0 +B140 +6660 +ENDCHAR +STARTCHAR U_646C +ENCODING 25708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F280 +2FE0 +2440 +37C0 +E440 +27C0 +22A0 +A4A0 +6860 +ENDCHAR +STARTCHAR U_646D +ENCODING 25709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2540 +2FE0 +3540 +E540 +25C0 +2400 +2AA0 +6AA0 +ENDCHAR +STARTCHAR U_646E +ENCODING 25710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1140 +FC80 +2760 +4400 +7FC0 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_646F +ENCODING 25711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FF80 +2280 +FEA0 +53A0 +FEE0 +0400 +7F80 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_6470 +ENCODING 25712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5940 +B7C0 +1120 +7FA0 +0400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_6471 +ENCODING 25713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +2FE0 +3AA0 +EFE0 +2440 +2280 +A100 +4EE0 +ENDCHAR +STARTCHAR U_6472 +ENCODING 25714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FC0 +F280 +2F80 +2AE0 +3FA0 +EAA0 +2FA0 +22A0 +AFA0 +6220 +ENDCHAR +STARTCHAR U_6473 +ENCODING 25715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FBC0 +2A40 +2BC0 +3800 +EEE0 +2AA0 +2EE0 +A800 +6FE0 +ENDCHAR +STARTCHAR U_6474 +ENCODING 25716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2AA0 +37C0 +E000 +2FE0 +2040 +A240 +6180 +ENDCHAR +STARTCHAR U_6475 +ENCODING 25717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2A80 +2B80 +3A80 +EFA0 +2A40 +2F40 +AAA0 +7720 +ENDCHAR +STARTCHAR U_6476 +ENCODING 25718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +27C0 +2540 +3FC0 +E120 +2FE0 +2480 +2280 +6100 +ENDCHAR +STARTCHAR U_6477 +ENCODING 25719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +F540 +27C0 +2540 +37C0 +E540 +2FE0 +2580 +2940 +7120 +ENDCHAR +STARTCHAR U_6478 +ENCODING 25720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +2440 +37C0 +E440 +3FE0 +2100 +A280 +6C60 +ENDCHAR +STARTCHAR U_6479 +ENCODING 25721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2080 +3F80 +2080 +FFE0 +2440 +DFA0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_647A +ENCODING 25722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +F660 +2AA0 +2320 +3100 +E7E0 +2420 +27E0 +2420 +67E0 +ENDCHAR +STARTCHAR U_647B +ENCODING 25723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7E0 +2AA0 +2F60 +3280 +E560 +2A80 +2120 +20C0 +6700 +ENDCHAR +STARTCHAR U_647C +ENCODING 25724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2AE0 +FF20 +29A0 +2F40 +3A40 +EFA0 +2100 +27C0 +2100 +6FE0 +ENDCHAR +STARTCHAR U_647D +ENCODING 25725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3000 +E7C0 +2000 +2FE0 +A540 +7B20 +ENDCHAR +STARTCHAR U_647E +ENCODING 25726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5DE0 +E520 +45E0 +5C80 +73E0 +DEA0 +47E0 +4480 +54A0 +CBE0 +ENDCHAR +STARTCHAR U_647F +ENCODING 25727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +2FE0 +2440 +3280 +EFE0 +2440 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_6480 +ENCODING 25728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1220 +7DC0 +5540 +7C80 +8160 +3FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_6481 +ENCODING 25729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +3AA0 +67C0 +A500 +27C0 +2900 +3FE0 +6100 +ENDCHAR +STARTCHAR U_6482 +ENCODING 25730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27E0 +3C40 +E380 +2440 +2FE0 +2440 +E7C0 +ENDCHAR +STARTCHAR U_6483 +ENCODING 25731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +5620 +7FE0 +5540 +FE80 +1160 +7FC0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_6484 +ENCODING 25732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FAA0 +2AA0 +2AA0 +3540 +E920 +2FE0 +2480 +A380 +6E60 +ENDCHAR +STARTCHAR U_6485 +ENCODING 25733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2D80 +FA80 +2FE0 +2A20 +3AC0 +EAC0 +2FC0 +2A40 +34A0 +E920 +ENDCHAR +STARTCHAR U_6486 +ENCODING 25734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +59E0 +FF20 +B4C0 +DCC0 +9520 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_6487 +ENCODING 25735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5580 +4E80 +E4E0 +5F20 +5520 +75A0 +DFA0 +55A0 +5540 +55A0 +D320 +ENDCHAR +STARTCHAR U_6488 +ENCODING 25736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +FA40 +2540 +28A0 +3FE0 +E920 +27C0 +2240 +2440 +68C0 +ENDCHAR +STARTCHAR U_6489 +ENCODING 25737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BE0 +FD40 +1140 +F880 +1F60 +1400 +7FC0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_648A +ENCODING 25738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +52A0 +FEE0 +52A0 +5EE0 +77A0 +D4A0 +57A0 +54A0 +57A0 +D4E0 +ENDCHAR +STARTCHAR U_648B +ENCODING 25739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3BA0 +E920 +2BA0 +2920 +ABA0 +4860 +ENDCHAR +STARTCHAR U_648C +ENCODING 25740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +2FE0 +2440 +37C0 +E440 +27C0 +2440 +27C0 +6C60 +ENDCHAR +STARTCHAR U_648D +ENCODING 25741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4A40 +EFE0 +46C0 +6B60 +5000 +CFC0 +4840 +4FC0 +C840 +4FC0 +ENDCHAR +STARTCHAR U_648E +ENCODING 25742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2820 +3FE0 +E440 +27C0 +2440 +2280 +6FE0 +ENDCHAR +STARTCHAR U_648F +ENCODING 25743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2040 +FFC0 +2040 +2FE0 +32A0 +EFE0 +2040 +3FE0 +A840 +65C0 +ENDCHAR +STARTCHAR U_6490 +ENCODING 25744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F4A0 +27A0 +2000 +3FE0 +E480 +2FE0 +2280 +A480 +6980 +ENDCHAR +STARTCHAR U_6491 +ENCODING 25745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F820 +2380 +3280 +67C0 +A100 +27C0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_6492 +ENCODING 25746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +EAE0 +3FA0 +2AA0 +6EA0 +AAA0 +2EA0 +2A40 +AAA0 +6F20 +ENDCHAR +STARTCHAR U_6493 +ENCODING 25747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2440 +3EE0 +E440 +2FE0 +2280 +A4A0 +7860 +ENDCHAR +STARTCHAR U_6494 +ENCODING 25748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F440 +2FE0 +2440 +37C0 +E100 +2540 +2920 +6300 +ENDCHAR +STARTCHAR U_6495 +ENCODING 25749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2AC0 +FF80 +2A80 +3EE0 +6AA0 +BEA0 +2AA0 +3FA0 +2AA0 +7120 +ENDCHAR +STARTCHAR U_6496 +ENCODING 25750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +24E0 +FFA0 +2AA0 +3FA0 +2AA0 +6EA0 +ABA0 +2E40 +BAA0 +6320 +ENDCHAR +STARTCHAR U_6497 +ENCODING 25751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2100 +37C0 +E540 +27C0 +2540 +27C0 +6C60 +ENDCHAR +STARTCHAR U_6498 +ENCODING 25752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26E0 +FA40 +2120 +2280 +3440 +EBA0 +2000 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_6499 +ENCODING 25753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2940 +2EC0 +3840 +EFC0 +2840 +3FE0 +A880 +6580 +ENDCHAR +STARTCHAR U_649A +ENCODING 25754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +FAA0 +2FE0 +2A80 +3540 +E540 +2A20 +2540 +AAA0 +6AA0 +ENDCHAR +STARTCHAR U_649B +ENCODING 25755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4680 +FFE0 +4680 +5A60 +6840 +CDE0 +5540 +4DE0 +4840 +D040 +ENDCHAR +STARTCHAR U_649C +ENCODING 25756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2BA0 +F6C0 +2440 +2BA0 +3000 +E7C0 +2440 +27C0 +A280 +6FE0 +ENDCHAR +STARTCHAR U_649D +ENCODING 25757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F40 +F540 +2780 +2480 +37C0 +E440 +2FE0 +3520 +2AA0 +6040 +ENDCHAR +STARTCHAR U_649E +ENCODING 25758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2100 +2FE0 +3540 +E7C0 +2540 +2FE0 +2100 +EFE0 +ENDCHAR +STARTCHAR U_649F +ENCODING 25759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +2BA0 +3280 +EFE0 +2AA0 +2BA0 +2820 +6860 +ENDCHAR +STARTCHAR U_64A0 +ENCODING 25760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +F4A0 +2EE0 +2B80 +3EA0 +EAA0 +2EC0 +24A0 +3F60 +6420 +ENDCHAR +STARTCHAR U_64A1 +ENCODING 25761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47C0 +F440 +5AA0 +6FE0 +4480 +C960 +5100 +45A0 +4940 +C300 +ENDCHAR +STARTCHAR U_64A2 +ENCODING 25762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3440 +E7C0 +2440 +2FE0 +2100 +6100 +ENDCHAR +STARTCHAR U_64A3 +ENCODING 25763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FFE0 +2540 +27C0 +3540 +E7C0 +2100 +2FE0 +2100 +6100 +ENDCHAR +STARTCHAR U_64A4 +ENCODING 25764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5F80 +EAE0 +5DA0 +52A0 +5EA0 +D2A0 +5EA0 +5240 +52A0 +D720 +ENDCHAR +STARTCHAR U_64A5 +ENCODING 25765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2AA0 +F440 +2FE0 +2340 +3E20 +E9E0 +2EA0 +22A0 +B2C0 +6D20 +ENDCHAR +STARTCHAR U_64A6 +ENCODING 25766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F240 +2520 +2FA0 +3140 +EFE0 +2440 +2FC0 +A440 +67C0 +ENDCHAR +STARTCHAR U_64A7 +ENCODING 25767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +49C0 +F240 +5FE0 +6AA0 +52A0 +DFE0 +4200 +6A20 +5620 +C1E0 +ENDCHAR +STARTCHAR U_64A8 +ENCODING 25768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +F7E0 +4900 +7FE0 +4900 +CFE0 +4900 +4FE0 +4D40 +D2A0 +ENDCHAR +STARTCHAR U_64A9 +ENCODING 25769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2C60 +37C0 +E440 +27C0 +2580 +A960 +7320 +ENDCHAR +STARTCHAR U_64AA +ENCODING 25770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47C0 +F100 +4FE0 +5540 +6FE0 +C540 +47C0 +4540 +4FE0 +C100 +ENDCHAR +STARTCHAR U_64AB +ENCODING 25771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FD40 +2540 +2FE0 +3540 +E540 +2FE0 +2540 +AAA0 +6AA0 +ENDCHAR +STARTCHAR U_64AC +ENCODING 25772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2700 +F1C0 +2F20 +24E0 +3880 +EDC0 +2880 +3FC0 +A8A0 +6EE0 +ENDCHAR +STARTCHAR U_64AD +ENCODING 25773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +F540 +2FE0 +2540 +3920 +EFE0 +2920 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_64AE +ENCODING 25774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +3FE0 +2A00 +EBE0 +2EA0 +2AA0 +3E40 +E3A0 +ENDCHAR +STARTCHAR U_64AF +ENCODING 25775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FE0 +F200 +47C0 +4200 +7FE0 +C400 +4FC0 +5540 +E6C0 +47C0 +ENDCHAR +STARTCHAR U_64B0 +ENCODING 25776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2880 +2EE0 +3280 +EFE0 +2280 +2FE0 +2280 +6C60 +ENDCHAR +STARTCHAR U_64B1 +ENCODING 25777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FB00 +2DE0 +2A80 +3BE0 +EB20 +2FE0 +2920 +A9E0 +6960 +ENDCHAR +STARTCHAR U_64B2 +ENCODING 25778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +2FE0 +3100 +E7C0 +2100 +2FE0 +A280 +6C60 +ENDCHAR +STARTCHAR U_64B3 +ENCODING 25779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2A80 +F1E0 +2F20 +2480 +3F80 +6480 +B580 +2EC0 +A520 +7E20 +ENDCHAR +STARTCHAR U_64B4 +ENCODING 25780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +E080 +5DE0 +5540 +7E40 +C540 +4880 +7C80 +4940 +DA20 +ENDCHAR +STARTCHAR U_64B5 +ENCODING 25781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2440 +FEE0 +2440 +3AA0 +2FE0 +E500 +27C0 +2100 +AFE0 +6100 +ENDCHAR +STARTCHAR U_64B6 +ENCODING 25782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +3540 +6FE0 +A540 +2FE0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_64B7 +ENCODING 25783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +3C80 +EBE0 +3E20 +22A0 +3EA0 +EAA0 +2AA0 +2EA0 +A140 +6220 +ENDCHAR +STARTCHAR U_64B8 +ENCODING 25784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFC0 +2540 +37C0 +2D40 +EFE0 +2440 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_64B9 +ENCODING 25785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4580 +FFE0 +5040 +4F80 +6A80 +CD80 +4A80 +4F80 +4520 +D8E0 +ENDCHAR +STARTCHAR U_64BA +ENCODING 25786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2540 +2FE0 +3540 +EFE0 +2920 +2FE0 +A920 +6100 +ENDCHAR +STARTCHAR U_64BB +ENCODING 25787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2480 +F3E0 +2140 +23E0 +3C80 +E7E0 +2480 +27E0 +AC80 +73E0 +ENDCHAR +STARTCHAR U_64BC +ENCODING 25788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +4FE0 +E880 +4EA0 +48C0 +6EA0 +CB60 +5620 +4D40 +54A0 +D3A0 +ENDCHAR +STARTCHAR U_64BD +ENCODING 25789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +FBE0 +2EA0 +3AA0 +EEA0 +24A0 +3FA0 +2A40 +AAA0 +7720 +ENDCHAR +STARTCHAR U_64BE +ENCODING 25790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2640 +F340 +22C0 +3FE0 +E820 +2BA0 +2AA0 +2BE0 +AC00 +73E0 +ENDCHAR +STARTCHAR U_64BF +ENCODING 25791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +2000 +3EE0 +EAA0 +2EE0 +2440 +AAA0 +5120 +ENDCHAR +STARTCHAR U_64C0 +ENCODING 25792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2F40 +F2A0 +2F00 +29E0 +3F40 +E940 +2FE0 +2240 +AFC0 +6240 +ENDCHAR +STARTCHAR U_64C1 +ENCODING 25793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +25E0 +2B40 +3DE0 +6B40 +BDE0 +2540 +2940 +71E0 +ENDCHAR +STARTCHAR U_64C2 +ENCODING 25794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2BA0 +3540 +EFE0 +2920 +2FE0 +2920 +CFE0 +ENDCHAR +STARTCHAR U_64C3 +ENCODING 25795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FAA0 +2FE0 +2AA0 +3FE0 +E800 +2FE0 +2CA0 +B540 +6620 +ENDCHAR +STARTCHAR U_64C4 +ENCODING 25796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FFE0 +2A20 +2FE0 +3AA0 +EBE0 +2AA0 +37E0 +A220 +6CC0 +ENDCHAR +STARTCHAR U_64C5 +ENCODING 25797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2BA0 +2820 +3FE0 +E440 +27C0 +2440 +A440 +6FE0 +ENDCHAR +STARTCHAR U_64C6 +ENCODING 25798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +3180 +6FE0 +A200 +27C0 +3D40 +2540 +67C0 +ENDCHAR +STARTCHAR U_64C7 +ENCODING 25799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2100 +2FE0 +3280 +E7C0 +2100 +2FE0 +A100 +6100 +ENDCHAR +STARTCHAR U_64C8 +ENCODING 25800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +37C0 +6100 +A7C0 +2100 +2FE0 +A380 +4D60 +ENDCHAR +STARTCHAR U_64C9 +ENCODING 25801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2400 +2FE0 +3A20 +EFA0 +2AA0 +2FA0 +A2A0 +6F40 +ENDCHAR +STARTCHAR U_64CA +ENCODING 25802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +F960 +ABC0 +FD40 +A980 +AB60 +FE00 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_64CB +ENCODING 25803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2AA0 +2B80 +3000 +EFE0 +2920 +2FE0 +A920 +6FE0 +ENDCHAR +STARTCHAR U_64CC +ENCODING 25804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EE0 +F540 +4200 +5FE0 +6A40 +CA40 +56A0 +4500 +4880 +D060 +ENDCHAR +STARTCHAR U_64CD +ENCODING 25805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2EE0 +2AA0 +3EE0 +E100 +3FE0 +2380 +2540 +6920 +ENDCHAR +STARTCHAR U_64CE +ENCODING 25806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +5480 +7560 +1FC0 +0400 +7FE0 +0400 +FFE0 +0C00 +ENDCHAR +STARTCHAR U_64CF +ENCODING 25807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3F80 +EAE0 +28A0 +2FA0 +32A0 +EEA0 +2AA0 +2E40 +A2A0 +6D20 +ENDCHAR +STARTCHAR U_64D0 +ENCODING 25808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2000 +2FE0 +3440 +E7C0 +2520 +2CC0 +B540 +6620 +ENDCHAR +STARTCHAR U_64D1 +ENCODING 25809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4EC0 +EAA0 +5FE0 +4A80 +6EA0 +CAA0 +4EC0 +4AA0 +5F60 +C220 +ENDCHAR +STARTCHAR U_64D2 +ENCODING 25810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2540 +FFE0 +2AA0 +2920 +3FE0 +E100 +2FE0 +2AA0 +2BA0 +E860 +ENDCHAR +STARTCHAR U_64D3 +ENCODING 25811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5A40 +57E0 +FA40 +57E0 +7240 +D7E0 +5A40 +5BE0 +5200 +DFE0 +ENDCHAR +STARTCHAR U_64D4 +ENCODING 25812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2AA0 +2FE0 +3800 +EBE0 +2800 +2BE0 +B220 +63E0 +ENDCHAR +STARTCHAR U_64D5 +ENCODING 25813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2FE0 +F900 +2FC0 +3900 +6FE0 +A000 +2EE0 +2AA0 +ABA0 +4860 +ENDCHAR +STARTCHAR U_64D6 +ENCODING 25814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFC0 +2440 +27C0 +3440 +EFE0 +2920 +2AA0 +AFA0 +60C0 +ENDCHAR +STARTCHAR U_64D7 +ENCODING 25815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2BE0 +FAA0 +2E40 +29E0 +3E40 +EA40 +2AE0 +2A40 +AE40 +6A40 +ENDCHAR +STARTCHAR U_64D8 +ENCODING 25816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7D40 +67E0 +BC80 +7FC0 +0200 +3FC0 +0200 +7FE0 +0600 +ENDCHAR +STARTCHAR U_64D9 +ENCODING 25817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FD40 +2A40 +2FC0 +3A40 +ED40 +2AC0 +3FE0 +A480 +7860 +ENDCHAR +STARTCHAR U_64DA +ENCODING 25818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4200 +FFE0 +52A0 +5300 +7FE0 +D540 +5A80 +55C0 +52A0 +E5A0 +ENDCHAR +STARTCHAR U_64DB +ENCODING 25819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F540 +2FE0 +25C0 +3400 +E7E0 +2100 +3FE0 +A540 +7920 +ENDCHAR +STARTCHAR U_64DC +ENCODING 25820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +E460 +5F40 +7BE0 +5540 +DF40 +5540 +5F40 +55A0 +D520 +ENDCHAR +STARTCHAR U_64DD +ENCODING 25821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2EA0 +FAE0 +2EA0 +3AE0 +6EA0 +A140 +2FE0 +2AA0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_64DE +ENCODING 25822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +2E80 +FFE0 +24A0 +3EA0 +65A0 +BFA0 +2AA0 +2E40 +25A0 +6920 +ENDCHAR +STARTCHAR U_64DF +ENCODING 25823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +E920 +5FE0 +4DA0 +6B60 +CDA0 +4DA0 +4B60 +4DA0 +C960 +ENDCHAR +STARTCHAR U_64E0 +ENCODING 25824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2540 +2D60 +3540 +E440 +27C0 +2440 +A7C0 +6840 +ENDCHAR +STARTCHAR U_64E1 +ENCODING 25825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2380 +2FE0 +3820 +67C0 +A280 +27C0 +A100 +4FE0 +ENDCHAR +STARTCHAR U_64E2 +ENCODING 25826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +F360 +2DA0 +27E0 +3500 +EFC0 +3500 +27C0 +A500 +67E0 +ENDCHAR +STARTCHAR U_64E3 +ENCODING 25827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +27E0 +2120 +37C0 +E000 +3FE0 +2A40 +AF40 +60C0 +ENDCHAR +STARTCHAR U_64E4 +ENCODING 25828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +2FE0 +3920 +EFE0 +2920 +2FE0 +A480 +6880 +ENDCHAR +STARTCHAR U_64E5 +ENCODING 25829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F480 +97E0 +A4A0 +FFE0 +0000 +7FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_64E6 +ENCODING 25830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +F4A0 +2BA0 +3440 +2BA0 +F000 +2FE0 +2540 +2920 +F320 +ENDCHAR +STARTCHAR U_64E7 +ENCODING 25831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +68C0 +4E40 +62C0 +4A40 +FFE0 +2080 +5F40 +8420 +7FC0 +0400 +0C00 +ENDCHAR +STARTCHAR U_64E8 +ENCODING 25832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FAA0 +2FC0 +2AC0 +3E40 +EBC0 +2840 +2F40 +B5A0 +6920 +ENDCHAR +STARTCHAR U_64E9 +ENCODING 25833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2380 +3540 +EFE0 +2100 +2FE0 +AAA0 +6860 +ENDCHAR +STARTCHAR U_64EA +ENCODING 25834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +54A0 +5FE0 +5480 +5D40 +5620 +5F80 +4200 +5FE0 +8200 +8600 +ENDCHAR +STARTCHAR U_64EB +ENCODING 25835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +FF60 +2940 +2FE0 +3940 +EF40 +2940 +2F40 +B9A0 +6B20 +ENDCHAR +STARTCHAR U_64EC +ENCODING 25836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2CA0 +F840 +2E40 +39E0 +2E40 +E560 +3F40 +2540 +AAC0 +7260 +ENDCHAR +STARTCHAR U_64ED +ENCODING 25837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +F480 +27E0 +2C80 +37C0 +E480 +2FE0 +2240 +A180 +6E60 +ENDCHAR +STARTCHAR U_64EE +ENCODING 25838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4EC0 +E4A0 +5FE0 +5A80 +6FA0 +DAA0 +6F40 +4AA0 +4F60 +C820 +ENDCHAR +STARTCHAR U_64EF +ENCODING 25839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +2940 +37C0 +EC40 +27C0 +2440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_64F0 +ENCODING 25840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2820 +3FE0 +EAA0 +2FE0 +2100 +A500 +6200 +ENDCHAR +STARTCHAR U_64F1 +ENCODING 25841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2FE0 +3AA0 +ED20 +2AA0 +2FE0 +AAA0 +6BE0 +ENDCHAR +STARTCHAR U_64F2 +ENCODING 25842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +2FA0 +F4A0 +2FA0 +2AC0 +3DA0 +EFA0 +24A0 +3FE0 +A480 +7B80 +ENDCHAR +STARTCHAR U_64F3 +ENCODING 25843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +F440 +2EE0 +2AA0 +3EA0 +EAA0 +2EA0 +2AA0 +AEE0 +7880 +ENDCHAR +STARTCHAR U_64F4 +ENCODING 25844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F940 +2FE0 +2940 +3FE0 +EAA0 +2BE0 +2AA0 +ABE0 +5620 +ENDCHAR +STARTCHAR U_64F5 +ENCODING 25845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F240 +5FE0 +56E0 +7B40 +D7C0 +5100 +5FE0 +5100 +E300 +ENDCHAR +STARTCHAR U_64F6 +ENCODING 25846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FD40 +2280 +3FE0 +6020 +AEA0 +2AA0 +2EA0 +2AA0 +6A60 +ENDCHAR +STARTCHAR U_64F7 +ENCODING 25847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2480 +FFE0 +2520 +2FE0 +3120 +EFE0 +2B20 +2BE0 +2EC0 +6120 +ENDCHAR +STARTCHAR U_64F8 +ENCODING 25848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +F540 +2FE0 +2AA0 +3FE0 +EB60 +2DA0 +2B60 +A920 +6DA0 +ENDCHAR +STARTCHAR U_64F9 +ENCODING 25849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +EAE0 +5F20 +5540 +7F40 +C440 +5F40 +44A0 +CAA0 +5120 +ENDCHAR +STARTCHAR U_64FA +ENCODING 25850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2AA0 +3DC0 +2A80 +EE60 +2AA0 +2EC0 +AAA0 +6AE0 +ENDCHAR +STARTCHAR U_64FB +ENCODING 25851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2F80 +FAE0 +3FA0 +2AA0 +3FA0 +EAA0 +3FA0 +2A40 +A6A0 +7920 +ENDCHAR +STARTCHAR U_64FC +ENCODING 25852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2920 +2FE0 +3920 +EFE0 +2AA0 +27C0 +A440 +67C0 +ENDCHAR +STARTCHAR U_64FD +ENCODING 25853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2BC0 +FAA0 +2FE0 +2A80 +3FE0 +E100 +2FE0 +2380 +A540 +6920 +ENDCHAR +STARTCHAR U_64FE +ENCODING 25854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +F3C0 +2240 +2FE0 +3AA0 +EA20 +27E0 +2A40 +A180 +6E60 +ENDCHAR +STARTCHAR U_64FF +ENCODING 25855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +57E0 +EA40 +4FE0 +6920 +FFE0 +5AA0 +5AA0 +5BA0 +D860 +6FE0 +ENDCHAR +STARTCHAR U_6500 +ENCODING 25856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +F5E0 +4A80 +F5C0 +4AA0 +FFE0 +1500 +3F80 +C460 +3F80 +0C00 +ENDCHAR +STARTCHAR U_6501 +ENCODING 25857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +2FE0 +2440 +3FE0 +E440 +27C0 +24A0 +A440 +6720 +ENDCHAR +STARTCHAR U_6502 +ENCODING 25858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +F7C0 +5540 +67C0 +4000 +DFE0 +52A0 +5FE0 +52A0 +DFE0 +ENDCHAR +STARTCHAR U_6503 +ENCODING 25859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +2940 +3680 +EBE0 +2000 +2FE0 +A540 +7B20 +ENDCHAR +STARTCHAR U_6504 +ENCODING 25860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +2920 +3FE0 +2D40 +EFC0 +2D40 +2FC0 +B6A0 +6BE0 +ENDCHAR +STARTCHAR U_6505 +ENCODING 25861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +3540 +6FE0 +A540 +26C0 +2540 +27C0 +6C60 +ENDCHAR +STARTCHAR U_6506 +ENCODING 25862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +FFE0 +2A40 +3120 +3FE0 +E540 +27C0 +2540 +AFE0 +6100 +ENDCHAR +STARTCHAR U_6507 +ENCODING 25863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +2100 +3FE0 +EAA0 +2FE0 +2540 +ACA0 +73A0 +ENDCHAR +STARTCHAR U_6508 +ENCODING 25864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F540 +5FC0 +5500 +77C0 +D520 +5FE0 +5700 +6A80 +D260 +ENDCHAR +STARTCHAR U_6509 +ENCODING 25865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFE0 +2AA0 +27E0 +3500 +EFC0 +3500 +27C0 +A500 +67E0 +ENDCHAR +STARTCHAR U_650A +ENCODING 25866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4B60 +EA40 +4FE0 +4AC0 +6F60 +4A40 +C880 +52E0 +5280 +EFE0 +ENDCHAR +STARTCHAR U_650B +ENCODING 25867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +E540 +5FE0 +5520 +7FE0 +CD20 +57E0 +6520 +45E0 +C4A0 +ENDCHAR +STARTCHAR U_650C +ENCODING 25868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2820 +2FE0 +3AA0 +EBA0 +2960 +2EA0 +AA60 +6FE0 +ENDCHAR +STARTCHAR U_650D +ENCODING 25869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F400 +27E0 +2440 +37C0 +EA60 +2FA0 +2AE0 +AF20 +6AA0 +ENDCHAR +STARTCHAR U_650E +ENCODING 25870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FFE0 +2A20 +2FE0 +3940 +EFC0 +2940 +3FE0 +AAA0 +6FE0 +ENDCHAR +STARTCHAR U_650F +ENCODING 25871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2F80 +FAE0 +2420 +2FE0 +3A80 +EEE0 +2A80 +2EE0 +AAA0 +6AE0 +ENDCHAR +STARTCHAR U_6510 +ENCODING 25872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2280 +3FE0 +E540 +2BA0 +22C0 +2E40 +6320 +ENDCHAR +STARTCHAR U_6511 +ENCODING 25873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2DE0 +2920 +FFE0 +2AA0 +3FE0 +2540 +6FE0 +B100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_6512 +ENCODING 25874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +2A40 +3560 +EFE0 +2920 +2920 +2280 +CC60 +ENDCHAR +STARTCHAR U_6513 +ENCODING 25875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +2280 +3FE0 +ECC0 +37A0 +25E0 +A500 +7BE0 +ENDCHAR +STARTCHAR U_6514 +ENCODING 25876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3920 +EFE0 +2AA0 +2FE0 +2BA0 +ED60 +ENDCHAR +STARTCHAR U_6515 +ENCODING 25877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +55A0 +FFE0 +4A80 +5B80 +6AA0 +DBA0 +4AC0 +5BA0 +CA60 +5F20 +ENDCHAR +STARTCHAR U_6516 +ENCODING 25878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2EE0 +3440 +EAA0 +2FE0 +2480 +A380 +6C60 +ENDCHAR +STARTCHAR U_6517 +ENCODING 25879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2FE0 +2AA0 +3CC0 +EBE0 +2D40 +3FE0 +A540 +6920 +ENDCHAR +STARTCHAR U_6518 +ENCODING 25880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +EAA0 +4EE0 +4480 +6FE0 +C480 +5FE0 +4D40 +5480 +C660 +ENDCHAR +STARTCHAR U_6519 +ENCODING 25881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +2420 +2FE0 +34A0 +E7E0 +2540 +27C0 +A120 +6EE0 +ENDCHAR +STARTCHAR U_651A +ENCODING 25882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +4EE0 +4440 +FAA0 +4FE0 +6820 +4780 +C480 +4FC0 +4840 +CFC0 +ENDCHAR +STARTCHAR U_651B +ENCODING 25883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +F4A0 +4EC0 +4840 +6FC0 +C940 +56C0 +5B40 +56C0 +DB20 +ENDCHAR +STARTCHAR U_651C +ENCODING 25884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +FFE0 +2500 +2FE0 +3500 +EFE0 +2AA0 +2FE0 +AAA0 +6BA0 +ENDCHAR +STARTCHAR U_651D +ENCODING 25885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +F7C0 +2440 +2FE0 +3040 +EFE0 +2AA0 +2EE0 +AAA0 +7FE0 +ENDCHAR +STARTCHAR U_651E +ENCODING 25886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +EFE0 +4A40 +77E0 +5A40 +CBE0 +5E40 +43E0 +6A40 +D7E0 +ENDCHAR +STARTCHAR U_651F +ENCODING 25887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F540 +5FC0 +54A0 +77E0 +D4A0 +57E0 +55A0 +D6E0 +67E0 +ENDCHAR +STARTCHAR U_6520 +ENCODING 25888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +2FE0 +2A40 +3FE0 +EA80 +2EE0 +2A80 +AEE0 +7280 +ENDCHAR +STARTCHAR U_6521 +ENCODING 25889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2580 +3F40 +F5E0 +2B40 +35E0 +FF40 +2940 +3FE0 +2B40 +ED40 +23E0 +ENDCHAR +STARTCHAR U_6522 +ENCODING 25890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +2AA0 +37C0 +E440 +27C0 +2440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_6523 +ENCODING 25891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FA0 +E040 +5FE0 +F940 +2FA0 +5200 +3FC0 +0200 +7FE0 +0600 +ENDCHAR +STARTCHAR U_6524 +ENCODING 25892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +5F40 +EBE0 +4540 +5FE0 +7540 +DF40 +45E0 +5F40 +4D40 +D3E0 +ENDCHAR +STARTCHAR U_6525 +ENCODING 25893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +3540 +F7C0 +2440 +37C0 +6440 +BFE0 +2AA0 +2FC0 +A540 +7B20 +ENDCHAR +STARTCHAR U_6526 +ENCODING 25894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2000 +FEE0 +2AA0 +2FE0 +3AA0 +EFE0 +2CA0 +2EC0 +B4A0 +66E0 +ENDCHAR +STARTCHAR U_6527 +ENCODING 25895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +5C80 +E9E0 +5D20 +55E0 +7D20 +55E0 +DD20 +55E0 +7EA0 +D520 +ENDCHAR +STARTCHAR U_6528 +ENCODING 25896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F4A0 +4FC0 +5A80 +6B40 +4AA0 +FFE0 +5540 +59A0 +D540 +ENDCHAR +STARTCHAR U_6529 +ENCODING 25897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +FAA0 +2280 +2FE0 +3AA0 +EFE0 +2100 +2FE0 +A540 +6AA0 +ENDCHAR +STARTCHAR U_652A +ENCODING 25898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2D60 +2AA0 +FD60 +2AA0 +3FE0 +2C60 +E7C0 +2440 +27C0 +A2A0 +7CE0 +ENDCHAR +STARTCHAR U_652B +ENCODING 25899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2EE0 +FAA0 +2FE0 +2900 +3FE0 +E900 +2FE0 +2440 +2380 +DC60 +ENDCHAR +STARTCHAR U_652C +ENCODING 25900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2B40 +FFE0 +2AA0 +2FE0 +3440 +E7C0 +2440 +27C0 +A2A0 +6CE0 +ENDCHAR +STARTCHAR U_652D +ENCODING 25901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +FFE0 +2540 +3B80 +2540 +FFE0 +2AA0 +3FE0 +AAA0 +7DE0 +ENDCHAR +STARTCHAR U_652E +ENCODING 25902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +2920 +3FE0 +2480 +EFC0 +2480 +3FE0 +ACA0 +7660 +ENDCHAR +STARTCHAR U_652F +ENCODING 25903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +3F80 +1100 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6530 +ENCODING 25904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2120 +F920 +8920 +4920 +5220 +22A0 +5440 +8FE0 +ENDCHAR +STARTCHAR U_6531 +ENCODING 25905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +0100 +97C0 +5440 +5440 +2280 +1900 +E280 +1C60 +ENDCHAR +STARTCHAR U_6532 +ENCODING 25906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +53E0 +8880 +FFE0 +0A20 +E940 +A940 +E880 +0940 +3A20 +ENDCHAR +STARTCHAR U_6533 +ENCODING 25907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2020 +FBE0 +2020 +FFE0 +52A0 +5FE0 +5440 +22C0 +5800 +87E0 +ENDCHAR +STARTCHAR U_6534 +ENCODING 25908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07C0 +0400 +0400 +7FC0 +1080 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6535 +ENCODING 25909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FC0 +2100 +2100 +5100 +8A00 +0400 +0A00 +1180 +E060 +ENDCHAR +STARTCHAR U_6536 +ENCODING 25910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +93E0 +9440 +9A40 +9240 +B280 +D100 +9180 +1240 +1420 +ENDCHAR +STARTCHAR U_6537 +ENCODING 25911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +43E0 +4440 +8A40 +F280 +1280 +1100 +1100 +A280 +4C60 +ENDCHAR +STARTCHAR U_6538 +ENCODING 25912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +21E0 +2A40 +6E40 +AA40 +2940 +2940 +2080 +2340 +2C20 +ENDCHAR +STARTCHAR U_6539 +ENCODING 25913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +0BE0 +0C40 +7A40 +4240 +4240 +4180 +5180 +6240 +4C20 +ENDCHAR +STARTCHAR U_653A +ENCODING 25914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9440 +F440 +8A80 +8100 +9100 +A280 +C440 +9820 +ENDCHAR +STARTCHAR U_653B +ENCODING 25915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +FA00 +27E0 +2440 +2C40 +2280 +3900 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_653C +ENCODING 25916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2240 +2440 +FA80 +2280 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_653D +ENCODING 25917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +4900 +4BE0 +8640 +7A40 +2940 +2940 +2880 +4940 +9A20 +ENDCHAR +STARTCHAR U_653E +ENCODING 25918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +2240 +2540 +3940 +2940 +2880 +4980 +4A40 +9420 +ENDCHAR +STARTCHAR U_653F +ENCODING 25919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +11E0 +1340 +5D40 +5140 +5140 +5080 +5C80 +E140 +0620 +ENDCHAR +STARTCHAR U_6540 +ENCODING 25920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +43E0 +F240 +9240 +9440 +FA40 +9280 +9100 +F280 +0440 +0820 +ENDCHAR +STARTCHAR U_6541 +ENCODING 25921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +3900 +2100 +27C0 +FA40 +8A40 +8940 +8880 +F940 +0620 +ENDCHAR +STARTCHAR U_6542 +ENCODING 25922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +7DE0 +8520 +7620 +5520 +5520 +7540 +0480 +1540 +0A20 +ENDCHAR +STARTCHAR U_6543 +ENCODING 25923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +89E0 +FB40 +9140 +FD40 +9140 +9140 +9480 +AD40 +C620 +ENDCHAR +STARTCHAR U_6544 +ENCODING 25924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +0900 +53E0 +2240 +FC40 +2A40 +6280 +A180 +2100 +2280 +6C60 +ENDCHAR +STARTCHAR U_6545 +ENCODING 25925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FDE0 +1140 +1240 +7D40 +4940 +4880 +4880 +7940 +4E20 +ENDCHAR +STARTCHAR U_6546 +ENCODING 25926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2880 +44E0 +8080 +3BE0 +0120 +7D20 +44C0 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_6547 +ENCODING 25927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +7D20 +5620 +5540 +5D40 +1080 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_6548 +ENCODING 25928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +2B40 +4540 +8940 +2940 +1080 +2880 +4140 +8620 +ENDCHAR +STARTCHAR U_6549 +ENCODING 25929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +71E0 +2340 +FD40 +2140 +7140 +6940 +A080 +2340 +2C20 +ENDCHAR +STARTCHAR U_654A +ENCODING 25930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1CE0 +1080 +FFE0 +1220 +1220 +5940 +5540 +9480 +1140 +3220 +ENDCHAR +STARTCHAR U_654B +ENCODING 25931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7A00 +8BE0 +5240 +2240 +5440 +8240 +7A80 +4900 +4A80 +7C60 +ENDCHAR +STARTCHAR U_654C +ENCODING 25932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +21E0 +FA40 +2540 +2140 +F940 +8880 +8880 +F940 +8E20 +ENDCHAR +STARTCHAR U_654D +ENCODING 25933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +51C0 +8900 +7100 +27C0 +FA40 +2280 +7100 +AA80 +6460 +ENDCHAR +STARTCHAR U_654E +ENCODING 25934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2100 +D900 +23E0 +FA40 +4440 +BA80 +1280 +F900 +1280 +3460 +ENDCHAR +STARTCHAR U_654F +ENCODING 25935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +81E0 +7F40 +5540 +FF40 +5540 +5540 +FE80 +0540 +1A20 +ENDCHAR +STARTCHAR U_6550 +ENCODING 25936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8100 +B9E0 +8240 +FE40 +A140 +B540 +A880 +A480 +B540 +A220 +ENDCHAR +STARTCHAR U_6551 +ENCODING 25937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +1500 +FDE0 +1240 +5540 +3940 +5540 +9480 +1080 +1140 +3220 +ENDCHAR +STARTCHAR U_6552 +ENCODING 25938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4880 +7EE0 +6B20 +FF20 +6AA0 +7EA0 +4840 +4840 +4840 +49A0 +ENDCHAR +STARTCHAR U_6553 +ENCODING 25939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2900 +7DE0 +4640 +4540 +7D40 +2940 +2940 +2A80 +4D40 +8A20 +ENDCHAR +STARTCHAR U_6554 +ENCODING 25940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +1100 +79E0 +2B40 +2940 +FD40 +0140 +7D40 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_6555 +ENCODING 25941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7E40 +5540 +7D40 +1140 +3940 +5480 +9140 +1220 +ENDCHAR +STARTCHAR U_6556 +ENCODING 25942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7E40 +1140 +FD40 +2140 +3D40 +2480 +4540 +9A20 +ENDCHAR +STARTCHAR U_6557 +ENCODING 25943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4500 +7DE0 +4740 +7D40 +4540 +7D40 +4540 +2880 +4540 +8620 +ENDCHAR +STARTCHAR U_6558 +ENCODING 25944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +BB40 +1140 +7D40 +1140 +5940 +5480 +9340 +3220 +ENDCHAR +STARTCHAR U_6559 +ENCODING 25945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +FD00 +29E0 +FF40 +1140 +7D40 +4940 +9D40 +7080 +1140 +7220 +ENDCHAR +STARTCHAR U_655A +ENCODING 25946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +FBE0 +8E40 +8A40 +FA80 +5280 +5100 +5A80 +5240 +8C20 +ENDCHAR +STARTCHAR U_655B +ENCODING 25947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +BB40 +0140 +2540 +9540 +4940 +4080 +1D40 +E220 +ENDCHAR +STARTCHAR U_655C +ENCODING 25948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +65E0 +9240 +7E40 +0940 +1140 +2880 +6280 +A540 +3E20 +ENDCHAR +STARTCHAR U_655D +ENCODING 25949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +6900 +21E0 +FD40 +A740 +B540 +ED40 +A540 +A480 +A540 +8E20 +ENDCHAR +STARTCHAR U_655E +ENCODING 25950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +5900 +11E0 +FD40 +8740 +BD40 +AD40 +AC80 +BC80 +8540 +8E20 +ENDCHAR +STARTCHAR U_655F +ENCODING 25951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2900 +FFE0 +AA40 +FE40 +AA40 +AB40 +FE80 +0080 +4540 +8220 +ENDCHAR +STARTCHAR U_6560 +ENCODING 25952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2480 +B4E0 +4880 +B480 +03E0 +FD20 +2540 +B480 +4940 +B620 +ENDCHAR +STARTCHAR U_6561 +ENCODING 25953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4480 +7CE0 +4480 +7FE0 +2220 +7D20 +AD40 +5480 +A540 +4E20 +ENDCHAR +STARTCHAR U_6562 +ENCODING 25954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +1100 +FDE0 +4B40 +7940 +4940 +7940 +4940 +5C80 +E940 +0A20 +ENDCHAR +STARTCHAR U_6563 +ENCODING 25955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7D00 +29E0 +FF40 +4940 +7940 +4940 +7940 +4880 +4940 +5A20 +ENDCHAR +STARTCHAR U_6564 +ENCODING 25956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A8E0 +F880 +ABE0 +FA20 +2220 +FD40 +3140 +6880 +A540 +2220 +ENDCHAR +STARTCHAR U_6565 +ENCODING 25957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +A8E0 +3080 +4BE0 +A620 +2220 +A940 +A940 +5080 +4940 +8620 +ENDCHAR +STARTCHAR U_6566 +ENCODING 25958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +49E0 +7B40 +0140 +FD40 +1140 +FD40 +1080 +5140 +2220 +ENDCHAR +STARTCHAR U_6567 +ENCODING 25959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FCE0 +3080 +4880 +FFE0 +0940 +E940 +A940 +E880 +0940 +3A20 +ENDCHAR +STARTCHAR U_6568 +ENCODING 25960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +4B40 +3140 +FD40 +0140 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_6569 +ENCODING 25961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +9500 +4900 +FEE0 +8240 +7D40 +0940 +FC80 +1080 +1140 +3220 +ENDCHAR +STARTCHAR U_656A +ENCODING 25962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +B480 +48E0 +B480 +03E0 +FD40 +2540 +B540 +4880 +B540 +2620 +ENDCHAR +STARTCHAR U_656B +ENCODING 25963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +45E0 +7F40 +4540 +7D40 +2140 +FF40 +2880 +4940 +9A20 +ENDCHAR +STARTCHAR U_656C +ENCODING 25964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FD00 +29E0 +4340 +7D40 +8540 +7540 +5540 +7480 +0540 +1A20 +ENDCHAR +STARTCHAR U_656D +ENCODING 25965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +99E0 +FA40 +0140 +FD40 +4140 +FC80 +5480 +A540 +4E20 +ENDCHAR +STARTCHAR U_656E +ENCODING 25966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +7080 +10E0 +FE80 +11E0 +5720 +92A0 +D6C0 +9240 +FEA0 +0120 +ENDCHAR +STARTCHAR U_656F +ENCODING 25967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +FCE0 +9080 +FFE0 +8940 +7D40 +4540 +7C80 +4540 +7E20 +ENDCHAR +STARTCHAR U_6570 +ENCODING 25968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +5900 +FDE0 +3340 +5940 +9540 +FD40 +2940 +6880 +1140 +EE20 +ENDCHAR +STARTCHAR U_6571 +ENCODING 25969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +F8E0 +0080 +F880 +03E0 +FA20 +8A40 +F940 +9080 +5940 +E620 +ENDCHAR +STARTCHAR U_6572 +ENCODING 25970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FEE0 +0080 +7880 +4BE0 +7940 +0140 +FF40 +AA80 +BB40 +8620 +ENDCHAR +STARTCHAR U_6573 +ENCODING 25971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +9500 +FDE0 +0340 +F940 +0140 +F940 +8940 +F880 +5140 +FA20 +ENDCHAR +STARTCHAR U_6574 +ENCODING 25972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +7C80 +3940 +5620 +7FC0 +0400 +2780 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6575 +ENCODING 25973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +29E0 +FF40 +9240 +FE40 +9240 +BB40 +AA80 +BB40 +8220 +ENDCHAR +STARTCHAR U_6576 +ENCODING 25974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BF80 +A4E0 +BF20 +D520 +BF20 +B5C0 +FE40 +8C40 +96A0 +A520 +ENDCHAR +STARTCHAR U_6577 +ENCODING 25975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +5100 +7FE0 +5240 +7E40 +5240 +FE40 +2140 +3C80 +2540 +CA20 +ENDCHAR +STARTCHAR U_6578 +ENCODING 25976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +55E0 +FF40 +5540 +FD40 +9540 +FF40 +2880 +1940 +E620 +ENDCHAR +STARTCHAR U_6579 +ENCODING 25977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +FDE0 +8740 +7D40 +9540 +5940 +FD40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_657A +ENCODING 25978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +80E0 +BC80 +A480 +BFE0 +8140 +EF40 +AB40 +EE80 +8140 +FE20 +ENDCHAR +STARTCHAR U_657B +ENCODING 25979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +FFE0 +4920 +7FE0 +2C40 +2340 +1F80 +6880 +0F00 +F0E0 +ENDCHAR +STARTCHAR U_657C +ENCODING 25980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +10E0 +FE80 +45E0 +7D40 +2940 +FF40 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_657D +ENCODING 25981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +2080 +FCE0 +4880 +FC80 +4BE0 +FD20 +D540 +F480 +8540 +8E20 +ENDCHAR +STARTCHAR U_657E +ENCODING 25982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +F9E0 +2240 +FE40 +2940 +FD40 +0080 +F880 +8940 +FA20 +ENDCHAR +STARTCHAR U_657F +ENCODING 25983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +1100 +FDE0 +2740 +7D40 +A540 +FF40 +AB40 +BA80 +8340 +8620 +ENDCHAR +STARTCHAR U_6580 +ENCODING 25984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FEE0 +2080 +7FE0 +A2A0 +FAA0 +AAA0 +FA40 +2AA0 +F520 +ENDCHAR +STARTCHAR U_6581 +ENCODING 25985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FFE0 +1140 +FF40 +2940 +FD40 +1140 +FE80 +1140 +1220 +ENDCHAR +STARTCHAR U_6582 +ENCODING 25986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +2500 +7DE0 +8340 +7D40 +5540 +7D40 +2940 +2880 +5540 +9220 +ENDCHAR +STARTCHAR U_6583 +ENCODING 25987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +55E0 +FF20 +BAC0 +D720 +9220 +FFE0 +4640 +AB80 +1220 +E1E0 +ENDCHAR +STARTCHAR U_6584 +ENCODING 25988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +1340 +FC80 +5540 +FFE0 +4200 +7FE0 +5240 +6FA0 +4A80 +B260 +ENDCHAR +STARTCHAR U_6585 +ENCODING 25989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6680 +5AE0 +6680 +5A80 +FFE0 +8220 +7940 +1080 +7D40 +1160 +3240 +ENDCHAR +STARTCHAR U_6586 +ENCODING 25990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6C80 +5480 +6DE0 +5520 +FF20 +82A0 +38A0 +1040 +7C40 +10A0 +3320 +ENDCHAR +STARTCHAR U_6587 +ENCODING 25991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +1100 +1100 +1100 +0A00 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6588 +ENCODING 25992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +DF60 +0200 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_6589 +ENCODING 25993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +E0E0 +3F80 +2080 +3F80 +2080 +4080 +ENDCHAR +STARTCHAR U_658A +ENCODING 25994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +FFE0 +2080 +3F80 +2080 +FFE0 +0080 +ENDCHAR +STARTCHAR U_658B +ENCODING 25995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +F1E0 +0000 +FFC0 +0400 +7FC0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_658C +ENCODING 25996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +27A0 +F080 +1FE0 +9280 +5280 +2B80 +3AA0 +4BA0 +9C60 +0020 +ENDCHAR +STARTCHAR U_658D +ENCODING 25997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3F80 +D160 +1F00 +1100 +1F00 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_658E +ENCODING 25998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3180 +DF60 +4040 +7FC0 +5540 +64C0 +8C40 +ENDCHAR +STARTCHAR U_658F +ENCODING 25999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFC0 +1440 +97C0 +5440 +27C0 +5520 +54C0 +8C80 +0660 +ENDCHAR +STARTCHAR U_6590 +ENCODING 26000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_6591 +ENCODING 26001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E9E0 +4440 +5F40 +4240 +EA40 +45E0 +4440 +4640 +6A40 +D040 +23E0 +ENDCHAR +STARTCHAR U_6592 +ENCODING 26002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +2820 +AFE0 +6800 +2FE0 +2AA0 +5FE0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_6593 +ENCODING 26003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2A20 +F920 +2FE0 +A920 +6FE0 +2AA0 +2FE0 +5920 +8BA0 +0D60 +ENDCHAR +STARTCHAR U_6594 +ENCODING 26004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FEE0 +54A0 +24A0 +DEE0 +24A0 +FFE0 +A8A0 +F940 +2A20 +F420 +ENDCHAR +STARTCHAR U_6595 +ENCODING 26005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FEE0 +2AA0 +A920 +6FE0 +2AA0 +2FE0 +5920 +8BA0 +0D60 +ENDCHAR +STARTCHAR U_6596 +ENCODING 26006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +F5E0 +5F40 +71C0 +5540 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_6597 +ENCODING 26007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0900 +0900 +2100 +1100 +1100 +01E0 +FF00 +0100 +0100 +0100 +ENDCHAR +STARTCHAR U_6598 +ENCODING 26008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +3D40 +4440 +4A40 +6940 +9860 +17C0 +2040 +4040 +8040 +ENDCHAR +STARTCHAR U_6599 +ENCODING 26009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AC80 +7280 +2080 +FC80 +2280 +30E0 +6F80 +A080 +2080 +2080 +ENDCHAR +STARTCHAR U_659A +ENCODING 26010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5140 +FBE0 +0000 +FFE0 +9220 +0A00 +6600 +13E0 +FE00 +0200 +ENDCHAR +STARTCHAR U_659B +ENCODING 26011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7A40 +5140 +FC40 +5640 +7D40 +5460 +7DC0 +5440 +5440 +8C40 +ENDCHAR +STARTCHAR U_659C +ENCODING 26012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +2940 +44C0 +B840 +1240 +7D40 +1060 +55C0 +5240 +9240 +3040 +ENDCHAR +STARTCHAR U_659D +ENCODING 26013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +FFC0 +9240 +4A00 +2200 +03C0 +FE00 +0200 +ENDCHAR +STARTCHAR U_659E +ENCODING 26014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +DD40 +94C0 +DC40 +9540 +FCC0 +1060 +2BC0 +2440 +4440 +8040 +ENDCHAR +STARTCHAR U_659F +ENCODING 26015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +FD40 +48C0 +7A40 +4940 +7940 +4860 +FFC0 +A840 +C440 +FE40 +ENDCHAR +STARTCHAR U_65A0 +ENCODING 26016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +FEC0 +2840 +7D40 +28C0 +FE40 +5460 +7DC0 +5440 +FE40 +4C40 +ENDCHAR +STARTCHAR U_65A1 +ENCODING 26017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FA40 +2420 +F940 +88C0 +FA40 +8940 +F860 +27C0 +F840 +2040 +ENDCHAR +STARTCHAR U_65A2 +ENCODING 26018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +FF40 +28C0 +FE40 +1140 +7CC0 +5460 +7DC0 +5440 +7C40 +C640 +ENDCHAR +STARTCHAR U_65A3 +ENCODING 26019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +AB40 +FEC0 +4140 +FEC0 +A3E0 +FA40 +AA40 +FA40 +2640 +FA40 +ENDCHAR +STARTCHAR U_65A4 +ENCODING 26020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3E00 +2000 +2000 +3FE0 +2100 +2100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_65A5 +ENCODING 26021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3E00 +2000 +2000 +3FE0 +2200 +2700 +2280 +2240 +4200 +8200 +ENDCHAR +STARTCHAR U_65A6 +ENCODING 26022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1860 +6180 +4100 +79E0 +5140 +5140 +5140 +5140 +5240 +9240 +9440 +ENDCHAR +STARTCHAR U_65A7 +ENCODING 26023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +6960 +0600 +1980 +E060 +1F80 +1000 +1FC0 +2100 +4100 +ENDCHAR +STARTCHAR U_65A8 +ENCODING 26024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4860 +4B80 +4A00 +7A00 +0BE0 +FA40 +4A40 +4A40 +4A40 +4A40 +8C40 +ENDCHAR +STARTCHAR U_65A9 +ENCODING 26025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +4200 +5200 +93E0 +FA40 +1240 +1A40 +F240 +1440 +1840 +ENDCHAR +STARTCHAR U_65AA +ENCODING 26026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7B80 +8A00 +0A00 +EBE0 +AA40 +AA40 +EA40 +0A40 +4A40 +3440 +ENDCHAR +STARTCHAR U_65AB +ENCODING 26027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +FBC0 +2200 +2200 +7BE0 +CA40 +4A40 +4A40 +7C40 +4840 +1040 +ENDCHAR +STARTCHAR U_65AC +ENCODING 26028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2200 +FA00 +ABE0 +FA40 +AA40 +FA40 +2240 +FA40 +2440 +ENDCHAR +STARTCHAR U_65AD +ENCODING 26029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +D580 +B900 +9100 +FDE0 +B140 +D940 +D540 +9140 +FA40 +0440 +ENDCHAR +STARTCHAR U_65AE +ENCODING 26030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +5380 +FE00 +5200 +FFE0 +0240 +7A40 +4A40 +7A40 +4A40 +7C40 +ENDCHAR +STARTCHAR U_65AF +ENCODING 26031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4860 +FD80 +4900 +7900 +49E0 +7940 +4940 +FD40 +2940 +4640 +8440 +ENDCHAR +STARTCHAR U_65B0 +ENCODING 26032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FD80 +4500 +2900 +FDE0 +1140 +FD40 +1140 +5540 +9240 +3440 +ENDCHAR +STARTCHAR U_65B1 +ENCODING 26033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2580 +F500 +2900 +FDE0 +2140 +7940 +C940 +7A40 +4A40 +7C40 +ENDCHAR +STARTCHAR U_65B2 +ENCODING 26034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE60 +AB80 +EF00 +29E0 +ED40 +8540 +ED40 +2940 +2940 +3E40 +C240 +ENDCHAR +STARTCHAR U_65B3 +ENCODING 26035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2820 +FFC0 +2900 +2900 +7DE0 +5540 +FF40 +1140 +7D40 +1240 +FC40 +ENDCHAR +STARTCHAR U_65B4 +ENCODING 26036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9220 +54C0 +FE80 +5480 +B2E0 +A2A0 +EFA0 +AAA0 +6FA0 +42A0 +8320 +ENDCHAR +STARTCHAR U_65B5 +ENCODING 26037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DE60 +AA80 +F280 +4480 +FCE0 +50A0 +DCA0 +84A0 +DD20 +5120 +7A20 +ENDCHAR +STARTCHAR U_65B6 +ENCODING 26038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +CAA0 +8FE0 +8400 +FFE0 +B220 +AFA0 +AAA0 +AFA0 +A2A0 +AF40 +ENDCHAR +STARTCHAR U_65B7 +ENCODING 26039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA40 +FD80 +9500 +AB00 +FFE0 +A940 +AB40 +FD40 +9540 +AB40 +FE40 +ENDCHAR +STARTCHAR U_65B8 +ENCODING 26040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +85C0 +FD00 +A9E0 +FD40 +9540 +FD40 +D540 +FD40 +9540 +FA40 +ENDCHAR +STARTCHAR U_65B9 +ENCODING 26041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0800 +0800 +0F80 +1080 +1080 +2080 +4080 +8700 +ENDCHAR +STARTCHAR U_65BA +ENCODING 26042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FD40 +2140 +3A20 +2940 +2940 +4940 +4A40 +AA40 +9440 +ENDCHAR +STARTCHAR U_65BB +ENCODING 26043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +4400 +7B80 +4A80 +4A80 +4A80 +4A80 +6AA0 +9460 +ENDCHAR +STARTCHAR U_65BC +ENCODING 26044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FD40 +2140 +3A20 +2C80 +2840 +2840 +4900 +4880 +9840 +ENDCHAR +STARTCHAR U_65BD +ENCODING 26045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2080 +3AE0 +2BA0 +2EA0 +2AE0 +2A80 +4A20 +91E0 +ENDCHAR +STARTCHAR U_65BE +ENCODING 26046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +FD00 +4900 +77E0 +5520 +5520 +5520 +55A0 +B540 +0100 +ENDCHAR +STARTCHAR U_65BF +ENCODING 26047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +23E0 +3840 +2880 +2FE0 +2880 +4880 +6A80 +9100 +ENDCHAR +STARTCHAR U_65C0 +ENCODING 26048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA40 +47E0 +7100 +5140 +5540 +5520 +5920 +9100 +B300 +ENDCHAR +STARTCHAR U_65C1 +ENCODING 26049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +1200 +FFC0 +8840 +0400 +FFC0 +1000 +1F80 +2080 +C300 +ENDCHAR +STARTCHAR U_65C2 +ENCODING 26050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2040 +3B80 +2A00 +2BE0 +2A40 +2A40 +4A40 +9440 +ENDCHAR +STARTCHAR U_65C3 +ENCODING 26051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +43C0 +7240 +5340 +52C0 +57E0 +5240 +9440 +A8C0 +ENDCHAR +STARTCHAR U_65C4 +ENCODING 26052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +20C0 +3B80 +28E0 +2B80 +28E0 +2F80 +48A0 +90E0 +ENDCHAR +STARTCHAR U_65C5 +ENCODING 26053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FE00 +24C0 +3B00 +2AA0 +2AC0 +2A80 +4A40 +4A40 +9B20 +ENDCHAR +STARTCHAR U_65C6 +ENCODING 26054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC80 +27E0 +3880 +2BE0 +2AA0 +2AA0 +2AA0 +4AE0 +9080 +ENDCHAR +STARTCHAR U_65C7 +ENCODING 26055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +F480 +4FE0 +44A0 +75C0 +5540 +5540 +5480 +9540 +BA20 +ENDCHAR +STARTCHAR U_65C8 +ENCODING 26056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +4240 +77E0 +5020 +5540 +5540 +5540 +9540 +A960 +ENDCHAR +STARTCHAR U_65C9 +ENCODING 26057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +4440 +7FC0 +4440 +7FC0 +54C0 +FFE0 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_65CA +ENCODING 26058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC00 +47E0 +4200 +7BC0 +4A40 +4B40 +4A40 +6B60 +9660 +ENDCHAR +STARTCHAR U_65CB +ENCODING 26059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC00 +47E0 +78A0 +4A80 +4AE0 +4A80 +4A80 +AD80 +90E0 +ENDCHAR +STARTCHAR U_65CC +ENCODING 26060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2280 +3BE0 +2C80 +2880 +2BE0 +2880 +4880 +97E0 +ENDCHAR +STARTCHAR U_65CD +ENCODING 26061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC80 +4140 +7A20 +4C80 +4FE0 +4840 +4A80 +A900 +9080 +ENDCHAR +STARTCHAR U_65CE +ENCODING 26062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FC00 +47E0 +7420 +57E0 +5520 +5540 +5580 +9520 +A8E0 +ENDCHAR +STARTCHAR U_65CF +ENCODING 26063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +2200 +3BE0 +2C80 +2880 +4FE0 +4880 +A940 +9620 +ENDCHAR +STARTCHAR U_65D0 +ENCODING 26064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FC00 +4280 +7AA0 +56C0 +5280 +56C0 +5AA0 +94A0 +A860 +ENDCHAR +STARTCHAR U_65D1 +ENCODING 26065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +4280 +77E0 +5040 +5740 +5540 +5740 +9040 +30C0 +ENDCHAR +STARTCHAR U_65D2 +ENCODING 26066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FD00 +47E0 +7240 +57A0 +5000 +5540 +5540 +9540 +A860 +ENDCHAR +STARTCHAR U_65D3 +ENCODING 26067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FEA0 +21C0 +3880 +2BE0 +2A20 +2BE0 +2A20 +4BE0 +B260 +ENDCHAR +STARTCHAR U_65D4 +ENCODING 26068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +F540 +47E0 +7540 +5BC0 +5500 +5500 +5FE0 +5500 +ABE0 +ENDCHAR +STARTCHAR U_65D5 +ENCODING 26069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F980 +2240 +7DA0 +4900 +9880 +0200 +7A40 +4B80 +7A20 +4BE0 +ENDCHAR +STARTCHAR U_65D6 +ENCODING 26070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +17E0 +F900 +47E0 +7280 +5FE0 +5040 +5740 +5540 +9740 +A0C0 +ENDCHAR +STARTCHAR U_65D7 +ENCODING 26071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FA40 +47E0 +7240 +5340 +52C0 +5240 +5FE0 +9240 +AC20 +ENDCHAR +STARTCHAR U_65D8 +ENCODING 26072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FC0 +EAA0 +5FE0 +7080 +57A0 +5540 +5740 +5540 +97A0 +A120 +ENDCHAR +STARTCHAR U_65D9 +ENCODING 26073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2F40 +F580 +4FE0 +4380 +7540 +57C0 +5540 +57C0 +9540 +A7C0 +ENDCHAR +STARTCHAR U_65DA +ENCODING 26074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FE80 +4FE0 +7AA0 +4AA0 +4FE0 +4800 +4FE0 +AAC0 +95A0 +ENDCHAR +STARTCHAR U_65DB +ENCODING 26075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FD40 +47E0 +7B40 +5520 +57C0 +5540 +57C0 +9540 +A7C0 +ENDCHAR +STARTCHAR U_65DC +ENCODING 26076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +27E0 +F500 +4FE0 +76C0 +5540 +57C0 +5000 +57C0 +D540 +2FE0 +ENDCHAR +STARTCHAR U_65DD +ENCODING 26077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FA80 +4440 +7FE0 +5AA0 +5FE0 +5240 +53C0 +9240 +A3C0 +ENDCHAR +STARTCHAR U_65DE +ENCODING 26078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +F940 +47E0 +72A0 +5D40 +56C0 +5560 +5740 +9480 +ABE0 +ENDCHAR +STARTCHAR U_65DF +ENCODING 26079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F900 +4FE0 +7920 +4FE0 +4AA0 +4AA0 +4FE0 +9280 +AC60 +ENDCHAR +STARTCHAR U_65E0 +ENCODING 26080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0A00 +0A00 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_65E1 +ENCODING 26081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0400 +4400 +4400 +FFC0 +0800 +0C00 +1400 +2440 +4440 +83C0 +ENDCHAR +STARTCHAR U_65E2 +ENCODING 26082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +9100 +9500 +F500 +9FC0 +F100 +A100 +9300 +AD40 +C940 +90C0 +ENDCHAR +STARTCHAR U_65E3 +ENCODING 26083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7C0 +9100 +F500 +97E0 +F100 +8300 +E300 +8520 +A520 +C8E0 +ENDCHAR +STARTCHAR U_65E4 +ENCODING 26084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4880 +6A80 +6A80 +FFE0 +8480 +F480 +D480 +F5A0 +86A0 +8CE0 +ENDCHAR +STARTCHAR U_65E5 +ENCODING 26085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +82 +82 +82 +FE +82 +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_65E6 +ENCODING 26086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +2080 +0000 +FFE0 +ENDCHAR +STARTCHAR U_65E7 +ENCODING 26087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +9F80 +9080 +9080 +9080 +9F80 +9080 +9080 +9080 +9080 +9F80 +ENDCHAR +STARTCHAR U_65E8 +ENCODING 26088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8300 +9C00 +E080 +8080 +7F80 +0000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_65E9 +ENCODING 26089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_65EA +ENCODING 26090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +0100 +F100 +9100 +9FE0 +F100 +9100 +9100 +F100 +9100 +0100 +ENDCHAR +STARTCHAR U_65EB +ENCODING 26091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 10 0 -1 +BITMAP +F7C0 +9240 +9240 +F240 +9240 +9240 +9240 +F240 +0540 +0880 +ENDCHAR +STARTCHAR U_65EC +ENCODING 26092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +2000 +3FC0 +4040 +BE40 +2240 +3E40 +2240 +3E40 +0140 +0080 +ENDCHAR +STARTCHAR U_65ED +ENCODING 26093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +2240 +FA40 +2BC0 +2A40 +2A40 +2BC0 +2800 +4820 +87E0 +ENDCHAR +STARTCHAR U_65EE +ENCODING 26094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +0900 +1120 +2120 +C0E0 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_65EF +ENCODING 26095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +1000 +FE00 +1200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_65F0 +ENCODING 26096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +9100 +F100 +9FE0 +9100 +F100 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_65F1 +ENCODING 26097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_65F2 +ENCODING 26098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_65F3 +ENCODING 26099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9420 +F820 +9220 +9120 +F120 +9020 +0120 +00C0 +ENDCHAR +STARTCHAR U_65F4 +ENCODING 26100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9100 +9100 +FFE0 +9100 +9100 +9100 +F900 +0500 +0200 +ENDCHAR +STARTCHAR U_65F5 +ENCODING 26101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +0400 +8440 +8440 +8440 +FFC0 +8040 +ENDCHAR +STARTCHAR U_65F6 +ENCODING 26102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +9FE0 +9080 +9480 +F280 +9280 +9080 +9080 +F080 +0380 +ENDCHAR +STARTCHAR U_65F7 +ENCODING 26103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9400 +F400 +9400 +9400 +F400 +9400 +0800 +1000 +ENDCHAR +STARTCHAR U_65F8 +ENCODING 26104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +0080 +F100 +97E0 +92A0 +F2A0 +9520 +9920 +F220 +0C20 +00C0 +ENDCHAR +STARTCHAR U_65F9 +ENCODING 26105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0000 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_65FA +ENCODING 26106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9100 +9100 +F100 +97C0 +9100 +9100 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_65FB +ENCODING 26107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1100 +0A00 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_65FC +ENCODING 26108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9440 +F440 +9280 +9280 +F100 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_65FD +ENCODING 26109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +F540 +9540 +97C0 +F100 +9120 +0120 +00E0 +ENDCHAR +STARTCHAR U_65FE +ENCODING 26110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +2480 +3FA0 +0420 +3FE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_65FF +ENCODING 26111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +F3E0 +9480 +9880 +F080 +9FE0 +9080 +F080 +9080 +0080 +ENDCHAR +STARTCHAR U_6600 +ENCODING 26112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +9420 +9A20 +F120 +9020 +91A0 +F620 +90A0 +0040 +ENDCHAR +STARTCHAR U_6601 +ENCODING 26113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +97E0 +F520 +9520 +9520 +F520 +95A0 +0540 +0100 +ENDCHAR +STARTCHAR U_6602 +ENCODING 26114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +1000 +E780 +8480 +9480 +E580 +0400 +ENDCHAR +STARTCHAR U_6603 +ENCODING 26115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +0000 +7FE0 +4200 +4500 +4880 +B060 +ENDCHAR +STARTCHAR U_6604 +ENCODING 26116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +9400 +F7E0 +9440 +9440 +F680 +9900 +0A80 +1460 +ENDCHAR +STARTCHAR U_6605 +ENCODING 26117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F240 +9240 +9280 +F2E0 +9240 +9240 +F540 +9880 +1140 +2620 +ENDCHAR +STARTCHAR U_6606 +ENCODING 26118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +0000 +8480 +F500 +8640 +B440 +C3C0 +ENDCHAR +STARTCHAR U_6607 +ENCODING 26119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +7900 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_6608 +ENCODING 26120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9420 +F420 +97E0 +9420 +F400 +9400 +0800 +1000 +ENDCHAR +STARTCHAR U_6609 +ENCODING 26121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9200 +F3C0 +9240 +9240 +F240 +9440 +0540 +1880 +ENDCHAR +STARTCHAR U_660A +ENCODING 26122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_660B +ENCODING 26123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0800 +FFE0 +1100 +2080 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_660C +ENCODING 26124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +7E +42 +7E +42 +7E +00 +FF +81 +FF +81 +FF +ENDCHAR +STARTCHAR U_660D +ENCODING 26125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +07C0 +F440 +9440 +9440 +F7C0 +9440 +9440 +9440 +F440 +97C0 +0440 +ENDCHAR +STARTCHAR U_660E +ENCODING 26126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F220 +9220 +93E0 +F220 +9220 +93E0 +F220 +0420 +08A0 +3040 +ENDCHAR +STARTCHAR U_660F +ENCODING 26127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +8800 +FFC0 +8400 +B240 +C1C0 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_6610 +ENCODING 26128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +9820 +F7C0 +9240 +9240 +F240 +9240 +0540 +1880 +ENDCHAR +STARTCHAR U_6611 +ENCODING 26129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +FA20 +9100 +97E0 +F040 +9080 +0080 +0100 +ENDCHAR +STARTCHAR U_6612 +ENCODING 26130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9AA0 +92A0 +F2A0 +94A0 +98A0 +F120 +9220 +0420 +08C0 +ENDCHAR +STARTCHAR U_6613 +ENCODING 26131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2000 +3FC0 +4A40 +9240 +2440 +4980 +ENDCHAR +STARTCHAR U_6614 +ENCODING 26132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FC0 +1100 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6615 +ENCODING 26133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +9400 +F7E0 +9480 +9480 +F480 +9480 +0880 +1080 +ENDCHAR +STARTCHAR U_6616 +ENCODING 26134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +9480 +9480 +F840 +9A40 +9220 +9200 +F480 +9FC0 +0440 +ENDCHAR +STARTCHAR U_6617 +ENCODING 26135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0000 +0900 +10C0 +6040 +ENDCHAR +STARTCHAR U_6618 +ENCODING 26136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1000 +1F80 +2080 +C380 +ENDCHAR +STARTCHAR U_6619 +ENCODING 26137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0000 +FFE0 +1080 +3FC0 +ENDCHAR +STARTCHAR U_661A +ENCODING 26138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4440 +2A80 +1100 +3F80 +D0E0 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_661B +ENCODING 26139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F400 +9400 +97C0 +F440 +9440 +97C0 +9400 +F400 +9400 +07E0 +ENDCHAR +STARTCHAR U_661C +ENCODING 26140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +1000 +3FC0 +4940 +9240 +2440 +0980 +ENDCHAR +STARTCHAR U_661D +ENCODING 26141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D00 +45C0 +A920 +1900 +3FE0 +D080 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_661E +ENCODING 26142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +9100 +97E0 +F520 +9520 +96A0 +9460 +F420 +9420 +0460 +ENDCHAR +STARTCHAR U_661F +ENCODING 26143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2400 +7FC0 +8400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_6620 +ENCODING 26144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9540 +F540 +9540 +9FE0 +F100 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_6621 +ENCODING 26145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +9FE0 +9100 +F240 +9680 +9100 +F100 +9240 +0FE0 +0420 +ENDCHAR +STARTCHAR U_6622 +ENCODING 26146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +9520 +9520 +F7E0 +9100 +9100 +9520 +F520 +9520 +07E0 +ENDCHAR +STARTCHAR U_6623 +ENCODING 26147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +F920 +9280 +9500 +9240 +F080 +9100 +0600 +ENDCHAR +STARTCHAR U_6624 +ENCODING 26148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +F920 +9080 +9FE0 +9040 +F280 +9100 +0080 +ENDCHAR +STARTCHAR U_6625 +ENCODING 26149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0800 +FFE0 +30C0 +DCA0 +1780 +1080 +1F80 +ENDCHAR +STARTCHAR U_6626 +ENCODING 26150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0800 +FFE0 +2080 +D160 +1100 +6100 +ENDCHAR +STARTCHAR U_6627 +ENCODING 26151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +9100 +F100 +9FE0 +9100 +F380 +9540 +0920 +0100 +ENDCHAR +STARTCHAR U_6628 +ENCODING 26152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +93E0 +9600 +FA00 +93C0 +9200 +F200 +93C0 +0200 +0200 +ENDCHAR +STARTCHAR U_6629 +ENCODING 26153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +F7C0 +9100 +9380 +9540 +F920 +9100 +0100 +ENDCHAR +STARTCHAR U_662A +ENCODING 26154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +1100 +7FC0 +1100 +FFE0 +2100 +4100 +ENDCHAR +STARTCHAR U_662B +ENCODING 26155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +9420 +9820 +F7A0 +94A0 +94A0 +F7A0 +94A0 +0020 +00C0 +ENDCHAR +STARTCHAR U_662C +ENCODING 26156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF00 +8100 +FF00 +8800 +FF80 +8240 +FFC0 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_662D +ENCODING 26157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F120 +9120 +9220 +F4C0 +9800 +93E0 +9220 +F220 +03E0 +0220 +ENDCHAR +STARTCHAR U_662E +ENCODING 26158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0100 +FFE0 +2120 +2120 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_662F +ENCODING 26159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +1080 +1F80 +0000 +FFE0 +2400 +2780 +5400 +8FE0 +ENDCHAR +STARTCHAR U_6630 +ENCODING 26160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +0400 +2780 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6631 +ENCODING 26161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +7FC0 +0100 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_6632 +ENCODING 26162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9FE0 +92A0 +FFE0 +9A80 +9FE0 +92A0 +F2E0 +9480 +0880 +ENDCHAR +STARTCHAR U_6633 +ENCODING 26163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F500 +97C0 +9900 +F100 +9FE0 +9100 +F100 +9280 +0440 +1820 +ENDCHAR +STARTCHAR U_6634 +ENCODING 26164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +C000 +9780 +B480 +D480 +2580 +C400 +ENDCHAR +STARTCHAR U_6635 +ENCODING 26165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +9440 +97C0 +F400 +9520 +9540 +F580 +9520 +0920 +10E0 +ENDCHAR +STARTCHAR U_6636 +ENCODING 26166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +09E0 +7920 +0B20 +EDE0 +2920 +2D20 +2BE0 +4900 +A880 +1060 +ENDCHAR +STARTCHAR U_6637 +ENCODING 26167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +7FC0 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_6638 +ENCODING 26168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +9440 +9A80 +F300 +9480 +9860 +9300 +F080 +9300 +0080 +ENDCHAR +STARTCHAR U_6639 +ENCODING 26169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +E080 +AF00 +A120 +FD40 +A580 +A500 +E980 +A940 +1520 +0200 +ENDCHAR +STARTCHAR U_663A +ENCODING 26170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +0400 +7FC0 +4440 +4A40 +5140 +40C0 +ENDCHAR +STARTCHAR U_663B +ENCODING 26171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +FBC0 +2240 +3A40 +C2C0 +0200 +ENDCHAR +STARTCHAR U_663C +ENCODING 26172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2100 +3F80 +60E0 +BF80 +2080 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_663D +ENCODING 26173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F220 +9200 +9FE0 +F280 +92A0 +92A0 +92C0 +F480 +95A0 +0AE0 +ENDCHAR +STARTCHAR U_663E +ENCODING 26174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0A00 +4A40 +2A40 +2A80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_663F +ENCODING 26175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +A800 +E900 +A900 +A900 +AA00 +EA40 +17E0 +2220 +ENDCHAR +STARTCHAR U_6640 +ENCODING 26176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +E500 +B540 +AD40 +E580 +AD80 +B540 +A540 +E500 +0520 +38E0 +ENDCHAR +STARTCHAR U_6641 +ENCODING 26177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +9480 +5500 +3600 +D580 +2440 +C3C0 +ENDCHAR +STARTCHAR U_6642 +ENCODING 26178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9100 +FFE0 +9080 +9FE0 +9480 +F280 +0080 +0380 +ENDCHAR +STARTCHAR U_6643 +ENCODING 26179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2480 +1500 +FFE0 +0A00 +1220 +61E0 +ENDCHAR +STARTCHAR U_6644 +ENCODING 26180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F240 +AA80 +A200 +FFE0 +A500 +A500 +A500 +E500 +0920 +30E0 +ENDCHAR +STARTCHAR U_6645 +ENCODING 26181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F000 +97C0 +9440 +F440 +97C0 +9440 +F440 +97C0 +0000 +1FE0 +ENDCHAR +STARTCHAR U_6646 +ENCODING 26182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9100 +FFE0 +9100 +9100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_6647 +ENCODING 26183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9240 +97A0 +F000 +9FE0 +9200 +F7C0 +9040 +0240 +0180 +ENDCHAR +STARTCHAR U_6648 +ENCODING 26184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9440 +F820 +9440 +9280 +9100 +F280 +0440 +1820 +ENDCHAR +STARTCHAR U_6649 +ENCODING 26185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +2A80 +7BC0 +0000 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_664A +ENCODING 26186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9200 +9440 +FFA0 +9120 +9100 +F7C0 +9100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_664B +ENCODING 26187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0A00 +4A40 +2A80 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_664C +ENCODING 26188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E200 +AFE0 +A820 +EBA0 +AAA0 +AAA0 +ABA0 +EAA0 +A820 +0860 +ENDCHAR +STARTCHAR U_664D +ENCODING 26189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +ABA0 +A820 +EBA0 +AAA0 +ABA0 +E820 +0820 +08A0 +0840 +ENDCHAR +STARTCHAR U_664E +ENCODING 26190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +A480 +AFC0 +E480 +A480 +BFE0 +E000 +0480 +0840 +3040 +ENDCHAR +STARTCHAR U_664F +ENCODING 26191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +3F00 +2100 +FFC0 +8840 +1000 +FFC0 +2200 +1E00 +F1C0 +ENDCHAR +STARTCHAR U_6650 +ENCODING 26192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9100 +F240 +9780 +9120 +9240 +F480 +9140 +0E20 +ENDCHAR +STARTCHAR U_6651 +ENCODING 26193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +1000 +FF80 +8080 +9C80 +9480 +9D80 +ENDCHAR +STARTCHAR U_6652 +ENCODING 26194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E280 +A280 +AFE0 +EAA0 +AAA0 +AAE0 +EC20 +A820 +0FE0 +0820 +ENDCHAR +STARTCHAR U_6653 +ENCODING 26195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +9E80 +9120 +F6E0 +9000 +9FE0 +F280 +92A0 +04A0 +18E0 +ENDCHAR +STARTCHAR U_6654 +ENCODING 26196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F2A0 +94C0 +9DA0 +F4A0 +9460 +9100 +FFE0 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_6655 +ENCODING 26197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2280 +FFE0 +8820 +7FC0 +2400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_6656 +ENCODING 26198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +9100 +9FE0 +F280 +97E0 +9080 +FFE0 +9080 +0080 +0080 +ENDCHAR +STARTCHAR U_6657 +ENCODING 26199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +9920 +F7C0 +9040 +9080 +F7C0 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_6658 +ENCODING 26200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9000 +97C0 +F100 +9FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_6659 +ENCODING 26201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +97E0 +9240 +F420 +9BE0 +9640 +FA80 +9180 +0240 +0C20 +ENDCHAR +STARTCHAR U_665A +ENCODING 26202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E780 +A900 +BFC0 +EA40 +AA40 +AFC0 +A300 +E520 +0920 +11E0 +ENDCHAR +STARTCHAR U_665B +ENCODING 26203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +9440 +97C0 +F280 +92A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_665C +ENCODING 26204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +1400 +FF80 +0900 +FFC0 +2840 +C980 +ENDCHAR +STARTCHAR U_665D +ENCODING 26205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_665E +ENCODING 26206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C60 +E380 +AC60 +A200 +FFE0 +A500 +AFE0 +F520 +A520 +0560 +0100 +ENDCHAR +STARTCHAR U_665F +ENCODING 26207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +0280 +7FE0 +4240 +7A80 +4920 +96E0 +ENDCHAR +STARTCHAR U_6660 +ENCODING 26208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E140 +AFE0 +A900 +E920 +AF20 +AAC0 +AA80 +EAA0 +1560 +2220 +ENDCHAR +STARTCHAR U_6661 +ENCODING 26209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +E120 +AFE0 +A100 +EFE0 +A920 +AFE0 +E920 +AFE0 +0920 +0960 +ENDCHAR +STARTCHAR U_6662 +ENCODING 26210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC00 +37E0 +E480 +2480 +6880 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6663 +ENCODING 26211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0460 +E580 +BF00 +A5E0 +E540 +A740 +AD40 +B540 +E540 +1640 +0840 +ENDCHAR +STARTCHAR U_6664 +ENCODING 26212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9240 +F240 +9FE0 +9000 +F7C0 +9440 +0440 +07C0 +ENDCHAR +STARTCHAR U_6665 +ENCODING 26213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9820 +F7C0 +9000 +9FE0 +F280 +92A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_6666 +ENCODING 26214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9800 +97C0 +F540 +9540 +9FE0 +F540 +9540 +07E0 +0180 +ENDCHAR +STARTCHAR U_6667 +ENCODING 26215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +97C0 +9900 +F100 +9FE0 +9000 +97C0 +F440 +0440 +07C0 +ENDCHAR +STARTCHAR U_6668 +ENCODING 26216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FE0 +4000 +5FC0 +4000 +7FE0 +5280 +99C0 +ENDCHAR +STARTCHAR U_6669 +ENCODING 26217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E780 +A900 +BFC0 +EA40 +AA40 +AFC0 +A500 +E500 +0920 +30E0 +ENDCHAR +STARTCHAR U_666A +ENCODING 26218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +AFE0 +AAA0 +EAA0 +AFE0 +AAA0 +EAA0 +BFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_666B +ENCODING 26219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F1E0 +9100 +97C0 +F440 +97C0 +9440 +97C0 +F100 +9FE0 +0100 +ENDCHAR +STARTCHAR U_666C +ENCODING 26220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9480 +F6C0 +9920 +9100 +FFE0 +9100 +0100 +0100 +ENDCHAR +STARTCHAR U_666D +ENCODING 26221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +ABA0 +A920 +EFE0 +A820 +ABA0 +AAA0 +EBA0 +1020 +20C0 +ENDCHAR +STARTCHAR U_666E +ENCODING 26222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +4A40 +2A80 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_666F +ENCODING 26223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +2080 +3F80 +2480 +4C40 +ENDCHAR +STARTCHAR U_6670 +ENCODING 26224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E460 +A580 +BF00 +E5E0 +AF40 +B540 +A540 +E540 +0540 +0640 +ENDCHAR +STARTCHAR U_6671 +ENCODING 26225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0120 +F540 +9580 +9A80 +F440 +9920 +9540 +F580 +9B00 +0480 +1860 +ENDCHAR +STARTCHAR U_6672 +ENCODING 26226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +ECE0 +A820 +AEE0 +E820 +AFE0 +AAA0 +E280 +A2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_6673 +ENCODING 26227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2200 +73E0 +AA80 +2480 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6674 +ENCODING 26228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +97C0 +F100 +9FE0 +9440 +F740 +95C0 +0440 +04C0 +ENDCHAR +STARTCHAR U_6675 +ENCODING 26229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BC0 +4C40 +7A80 +4100 +86E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6676 +ENCODING 26230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0000 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_6677 +ENCODING 26231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +6500 +99E0 +2500 +7FE0 +A080 +3F80 +ENDCHAR +STARTCHAR U_6678 +ENCODING 26232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0100 +F9E0 +1240 +5D40 +5180 +FE60 +ENDCHAR +STARTCHAR U_6679 +ENCODING 26233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9200 +97E0 +FAA0 +94A0 +0920 +06C0 +ENDCHAR +STARTCHAR U_667A +ENCODING 26234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4000 +7BC0 +A240 +FE40 +33C0 +4A40 +BF80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_667B +ENCODING 26235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +97C0 +FD60 +97C0 +9540 +F7C0 +9120 +0120 +00E0 +ENDCHAR +STARTCHAR U_667C +ENCODING 26236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +A400 +E7E0 +A8A0 +B5A0 +E2E0 +A480 +08A0 +10E0 +ENDCHAR +STARTCHAR U_667D +ENCODING 26237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E480 +BFE0 +A480 +EEC0 +ADA0 +B6A0 +A4A0 +E480 +0480 +0480 +ENDCHAR +STARTCHAR U_667E +ENCODING 26238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9000 +97C0 +F440 +97C0 +9100 +F380 +9540 +0920 +1320 +ENDCHAR +STARTCHAR U_667F +ENCODING 26239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A440 +E7C0 +A000 +AFE0 +E820 +0FE0 +0820 +0FE0 +ENDCHAR +STARTCHAR U_6680 +ENCODING 26240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F480 +9BE0 +9280 +F480 +9C80 +95C0 +F480 +9480 +0480 +07E0 +ENDCHAR +STARTCHAR U_6681 +ENCODING 26241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +AA80 +FFE0 +A880 +A880 +BFC0 +E500 +0920 +30E0 +ENDCHAR +STARTCHAR U_6682 +ENCODING 26242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +5200 +FBE0 +1280 +F480 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6683 +ENCODING 26243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +3F80 +0A00 +7BC0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_6684 +ENCODING 26244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9820 +9FE0 +F000 +97C0 +94C0 +F540 +97C0 +0000 +0FE0 +ENDCHAR +STARTCHAR U_6685 +ENCODING 26245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFE0 +A800 +ABC0 +EE40 +BBC0 +AA40 +ABC0 +E800 +0FE0 +0800 +ENDCHAR +STARTCHAR U_6686 +ENCODING 26246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +A880 +AE80 +EAE0 +ABA0 +AAA0 +EAA0 +AA80 +0A20 +15E0 +ENDCHAR +STARTCHAR U_6687 +ENCODING 26247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EA20 +AEE0 +A800 +E9E0 +AF40 +A940 +EF40 +A880 +0940 +0A20 +ENDCHAR +STARTCHAR U_6688 +ENCODING 26248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2680 +FFE0 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_6689 +ENCODING 26249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A100 +AFE0 +E540 +A7C0 +A540 +E7C0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_668A +ENCODING 26250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +97C0 +9440 +F7C0 +9440 +97C0 +F440 +97C0 +0280 +0C60 +ENDCHAR +STARTCHAR U_668B +ENCODING 26251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +89E0 +FB40 +9080 +FD40 +8A20 +FF80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_668C +ENCODING 26252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +F180 +96A0 +9240 +F420 +9BC0 +9100 +FFE0 +9280 +0440 +0820 +ENDCHAR +STARTCHAR U_668D +ENCODING 26253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9200 +97E0 +F8A0 +9560 +07A0 +00C0 +ENDCHAR +STARTCHAR U_668E +ENCODING 26254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A200 +EFC0 +AA40 +BFE0 +E200 +0500 +08E0 +3040 +ENDCHAR +STARTCHAR U_668F +ENCODING 26255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A240 +A280 +FFE0 +A400 +AFC0 +B440 +E7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_6690 +ENCODING 26256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9140 +9FE0 +F440 +97C0 +9100 +FFE0 +9500 +0FE0 +0100 +ENDCHAR +STARTCHAR U_6691 +ENCODING 26257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +0500 +FFE0 +0880 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_6692 +ENCODING 26258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E440 +A7C0 +A440 +E7C0 +A900 +AFC0 +B100 +E7C0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_6693 +ENCODING 26259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +2BE0 +FC40 +3240 +5180 +A260 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6694 +ENCODING 26260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +AAA0 +EAA0 +AFE0 +A920 +EFE0 +0920 +0860 +ENDCHAR +STARTCHAR U_6695 +ENCODING 26261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +AFE0 +EAA0 +A920 +AFE0 +E920 +A380 +0540 +0920 +ENDCHAR +STARTCHAR U_6696 +ENCODING 26262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FA20 +9540 +9FE0 +F200 +9FE0 +9200 +F7C0 +9A40 +1180 +2E60 +ENDCHAR +STARTCHAR U_6697 +ENCODING 26263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +9280 +FFE0 +9000 +97C0 +F440 +97C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_6698 +ENCODING 26264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +FFE0 +9200 +97E0 +FAA0 +9520 +0220 +0CC0 +ENDCHAR +STARTCHAR U_6699 +ENCODING 26265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9200 +97C0 +F200 +9FE0 +9440 +FFE0 +9440 +07C0 +0440 +ENDCHAR +STARTCHAR U_669A +ENCODING 26266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +A540 +A280 +E7E0 +A900 +AFE0 +B100 +E920 +0FE0 +0820 +ENDCHAR +STARTCHAR U_669B +ENCODING 26267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A200 +AFC0 +E200 +BFE0 +A400 +E7C0 +0900 +3100 +1FE0 +ENDCHAR +STARTCHAR U_669C +ENCODING 26268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4A40 +5140 +FFE0 +0000 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_669D +ENCODING 26269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A7C0 +A440 +E7C0 +A440 +A7C0 +E100 +AFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_669E +ENCODING 26270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A440 +A7C0 +A440 +E7C0 +A100 +BFE0 +E540 +0920 +1120 +ENDCHAR +STARTCHAR U_669F +ENCODING 26271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FFE0 +9000 +9FE0 +F000 +97C0 +9440 +F7C0 +9440 +0280 +0FE0 +ENDCHAR +STARTCHAR U_66A0 +ENCODING 26272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +1100 +7FC0 +4040 +5F40 +5140 +5FC0 +ENDCHAR +STARTCHAR U_66A1 +ENCODING 26273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FA40 +94A0 +9780 +F000 +9FE0 +92A0 +FA60 +96A0 +0B20 +0660 +ENDCHAR +STARTCHAR U_66A2 +ENCODING 26274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +FFE0 +AA00 +FFE0 +AAA0 +24A0 +2920 +22C0 +ENDCHAR +STARTCHAR U_66A3 +ENCODING 26275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFC0 +B200 +A100 +FFC0 +B540 +AE40 +BFC0 +EE40 +1540 +24A0 +ENDCHAR +STARTCHAR U_66A4 +ENCODING 26276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A840 +AFC0 +E840 +AFC0 +A200 +FFE0 +A540 +1BA0 +0100 +ENDCHAR +STARTCHAR U_66A5 +ENCODING 26277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +EA40 +A940 +AFC0 +E200 +AFC0 +AA40 +BFE0 +E480 +0300 +1CC0 +ENDCHAR +STARTCHAR U_66A6 +ENCODING 26278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7FE0 +4880 +5DC0 +6AA0 +5FC0 +5040 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_66A7 +ENCODING 26279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +EFA0 +A540 +AFE0 +E920 +A7E0 +A200 +E3C0 +A640 +0980 +1660 +ENDCHAR +STARTCHAR U_66A8 +ENCODING 26280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +9500 +FFC0 +9300 +F540 +99C0 +FF00 +2100 +3F00 +2100 +FFC0 +ENDCHAR +STARTCHAR U_66A9 +ENCODING 26281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F940 +9580 +9A40 +F420 +9BC0 +9000 +FFE0 +9540 +0920 +1320 +ENDCHAR +STARTCHAR U_66AA +ENCODING 26282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +A440 +A7C0 +E100 +AFE0 +A920 +EDA0 +AB60 +0DA0 +0960 +ENDCHAR +STARTCHAR U_66AB +ENCODING 26283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +55E0 +7D40 +5540 +FFC0 +1040 +1FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_66AC +ENCODING 26284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7BC0 +1140 +FD40 +4A40 +9560 +7F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_66AD +ENCODING 26285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9440 +97C0 +F440 +97C0 +9920 +9540 +F920 +9FE0 +0100 +ENDCHAR +STARTCHAR U_66AE +ENCODING 26286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +2080 +3F80 +2080 +FFE0 +2080 +7FC0 +A0A0 +3F80 +ENDCHAR +STARTCHAR U_66AF +ENCODING 26287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +97C0 +9440 +F7C0 +9440 +97C0 +F100 +9FE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_66B0 +ENCODING 26288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +E940 +B2A0 +A400 +E880 +B880 +AAE0 +EA80 +AA80 +0B80 +0C60 +ENDCHAR +STARTCHAR U_66B1 +ENCODING 26289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F540 +97E0 +9540 +F7E0 +9500 +95E0 +F720 +95E0 +0400 +07E0 +ENDCHAR +STARTCHAR U_66B2 +ENCODING 26290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9280 +9FE0 +F440 +97C0 +9440 +F7C0 +9100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_66B3 +ENCODING 26291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +E440 +BEE0 +A440 +FEE0 +A440 +AFC0 +A040 +EFC0 +0040 +0FC0 +ENDCHAR +STARTCHAR U_66B4 +ENCODING 26292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +1100 +FFE0 +5540 +8E20 +1500 +6CC0 +ENDCHAR +STARTCHAR U_66B5 +ENCODING 26293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +9100 +F7C0 +9540 +9FE0 +F100 +9FE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_66B6 +ENCODING 26294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E900 +BDE0 +AA00 +E9E0 +A880 +AE80 +AAE0 +EA80 +1380 +2460 +ENDCHAR +STARTCHAR U_66B7 +ENCODING 26295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9540 +97C0 +F540 +97C0 +90A0 +FFE0 +9480 +0280 +0100 +ENDCHAR +STARTCHAR U_66B8 +ENCODING 26296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +B4A0 +AFC0 +F460 +A7C0 +A440 +E7C0 +A540 +0920 +1320 +ENDCHAR +STARTCHAR U_66B9 +ENCODING 26297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +9F80 +5080 +1F80 +CA00 +5F80 +7200 +5F80 +5200 +BFE0 +ENDCHAR +STARTCHAR U_66BA +ENCODING 26298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AFE0 +A920 +EFE0 +A920 +AFE0 +E100 +AFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_66BB +ENCODING 26299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +97C0 +9440 +F7C0 +9100 +9FE0 +F440 +97C0 +0940 +1320 +ENDCHAR +STARTCHAR U_66BC +ENCODING 26300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FA40 +AD40 +F880 +AB60 +7F80 +4080 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_66BD +ENCODING 26301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +E540 +BFE0 +A580 +F960 +A940 +AFE0 +FB40 +A5E0 +0840 +3040 +ENDCHAR +STARTCHAR U_66BE +ENCODING 26302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AAE0 +AEA0 +E0A0 +BFA0 +A2A0 +E4A0 +BE40 +04A0 +0D20 +ENDCHAR +STARTCHAR U_66BF +ENCODING 26303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A200 +AFC0 +E840 +AFC0 +A480 +BFE0 +EFC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_66C0 +ENCODING 26304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +9FE0 +9820 +F7C0 +9000 +97C0 +F440 +97C0 +0280 +0FE0 +ENDCHAR +STARTCHAR U_66C1 +ENCODING 26305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +8A80 +FFE0 +8180 +B2A0 +C460 +3F80 +2880 +2480 +FFE0 +ENDCHAR +STARTCHAR U_66C2 +ENCODING 26306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFC0 +A480 +BFE0 +E100 +AFC0 +A940 +EFC0 +0940 +0FC0 +0480 +ENDCHAR +STARTCHAR U_66C3 +ENCODING 26307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +B140 +AFE0 +E140 +BBC0 +AD40 +EB80 +AD40 +0920 +17E0 +ENDCHAR +STARTCHAR U_66C4 +ENCODING 26308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +AFE0 +E540 +AFE0 +A540 +EFE0 +A100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_66C5 +ENCODING 26309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2440 +3FC0 +1100 +7FC0 +1500 +FFE0 +1500 +1500 +7FC0 +0400 +ENDCHAR +STARTCHAR U_66C6 +ENCODING 26310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5DC0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_66C7 +ENCODING 26311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +7FC0 +0400 +FFE0 +9520 +3F80 +0000 +FFE0 +1080 +3F40 +ENDCHAR +STARTCHAR U_66C8 +ENCODING 26312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A280 +A100 +FFE0 +A540 +A7C0 +E540 +AFE0 +0100 +1FE0 +ENDCHAR +STARTCHAR U_66C9 +ENCODING 26313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9FE0 +F440 +9EE0 +9440 +FFE0 +9480 +04A0 +1860 +ENDCHAR +STARTCHAR U_66CA +ENCODING 26314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +92A0 +9FC0 +F2A0 +9FE0 +9440 +F7C0 +9440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_66CB +ENCODING 26315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +9FE0 +9AA0 +FFE0 +9440 +97C0 +F440 +9FE0 +0100 +0100 +ENDCHAR +STARTCHAR U_66CC +ENCODING 26316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0440 +FFE0 +A0A0 +5F40 +0400 +FFE0 +ENDCHAR +STARTCHAR U_66CD +ENCODING 26317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +9540 +96C0 +F540 +97C0 +9540 +9920 +FFE0 +9100 +0100 +ENDCHAR +STARTCHAR U_66CE +ENCODING 26318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A100 +EFE0 +A100 +BFE0 +E440 +AFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_66CF +ENCODING 26319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2C40 +2340 +3FC0 +4AE0 +AEA0 +EAC0 +5EA0 +E8A0 +2AE0 +CD80 +ENDCHAR +STARTCHAR U_66D0 +ENCODING 26320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +AAA0 +FFE0 +2400 +3F80 +4400 +1F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_66D1 +ENCODING 26321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2900 +FFE0 +AAA0 +FFE0 +1200 +E9E0 +1400 +6900 +0200 +3C00 +ENDCHAR +STARTCHAR U_66D2 +ENCODING 26322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +AAE0 +AEA0 +EAA0 +BFA0 +A8A0 +EEA0 +AA40 +12A0 +2520 +ENDCHAR +STARTCHAR U_66D3 +ENCODING 26323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +4440 +7FC0 +0400 +FFE0 +2480 +DF60 +1500 +6EC0 +ENDCHAR +STARTCHAR U_66D4 +ENCODING 26324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +BF80 +AAE0 +A920 +EEA0 +B2A0 +AEA0 +AA40 +EE40 +02A0 +0D20 +ENDCHAR +STARTCHAR U_66D5 +ENCODING 26325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E880 +BFE0 +AA40 +EFE0 +A800 +AFC0 +A800 +EFC0 +1440 +27C0 +ENDCHAR +STARTCHAR U_66D6 +ENCODING 26326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E540 +AFE0 +A920 +E6C0 +ABA0 +A200 +E7C0 +AC80 +0300 +1CE0 +ENDCHAR +STARTCHAR U_66D7 +ENCODING 26327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +ECC0 +BFE0 +A480 +EFC0 +A200 +AFC0 +E200 +1FE0 +0A80 +3260 +ENDCHAR +STARTCHAR U_66D8 +ENCODING 26328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFE0 +A920 +EAA0 +BFE0 +A100 +EFE0 +AAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_66D9 +ENCODING 26329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A100 +E7A0 +A140 +AFE0 +E440 +0FC0 +1440 +07C0 +ENDCHAR +STARTCHAR U_66DA +ENCODING 26330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +AFE0 +E820 +AFC0 +AA40 +F580 +AAC0 +04A0 +0B20 +ENDCHAR +STARTCHAR U_66DB +ENCODING 26331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +BFE0 +AAA0 +E920 +AFE0 +A100 +EFE0 +A100 +1FE0 +12A0 +ENDCHAR +STARTCHAR U_66DC +ENCODING 26332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +A660 +AAA0 +E7E0 +AC80 +B7E0 +E480 +A7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_66DD +ENCODING 26333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +FFE0 +A280 +BFE0 +E540 +ABA0 +0540 +0B20 +ENDCHAR +STARTCHAR U_66DE +ENCODING 26334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +F280 +9FE0 +9280 +F7C0 +9540 +97C0 +F540 +9FE0 +0960 +0BA0 +ENDCHAR +STARTCHAR U_66DF +ENCODING 26335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +AAA0 +FFE0 +4000 +7F80 +4000 +7FE0 +5540 +98E0 +ENDCHAR +STARTCHAR U_66E0 +ENCODING 26336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +AFE0 +EA40 +AFE0 +AD40 +EFC0 +AD40 +17C0 +2C60 +ENDCHAR +STARTCHAR U_66E1 +ENCODING 26337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1500 +7FC0 +5540 +FFE0 +9120 +9F20 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_66E2 +ENCODING 26338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +AFE0 +E540 +AEE0 +A440 +E7C0 +A100 +0540 +0920 +ENDCHAR +STARTCHAR U_66E3 +ENCODING 26339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +A780 +E020 +BFC0 +A480 +E7A0 +BCE0 +0B20 +12A0 +ENDCHAR +STARTCHAR U_66E4 +ENCODING 26340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E100 +AFE0 +A920 +E7C0 +A500 +AFE0 +F500 +A7C0 +0500 +07E0 +ENDCHAR +STARTCHAR U_66E5 +ENCODING 26341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +AFE0 +AA20 +EF80 +AA40 +ABC0 +AA80 +EFC0 +1540 +3FE0 +ENDCHAR +STARTCHAR U_66E6 +ENCODING 26342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFC0 +A100 +BFE0 +E4A0 +BFE0 +A480 +FEC0 +AAA0 +0360 +0C20 +ENDCHAR +STARTCHAR U_66E7 +ENCODING 26343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2C40 +2340 +3FC0 +FC80 +4BE0 +FEA0 +D7E0 +FC80 +A4E0 +AB20 +ENDCHAR +STARTCHAR U_66E8 +ENCODING 26344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FF80 +AAE0 +A420 +FFE0 +AA80 +AEE0 +EA80 +AEE0 +0AA0 +0EE0 +ENDCHAR +STARTCHAR U_66E9 +ENCODING 26345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +FFE0 +4A40 +7BC0 +1100 +FFE0 +1100 +FFE0 +5140 +BCE0 +ENDCHAR +STARTCHAR U_66EA +ENCODING 26346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EAA0 +AFE0 +A940 +F5E0 +BA40 +ABE0 +F640 +03E0 +2A40 +2BE0 +ENDCHAR +STARTCHAR U_66EB +ENCODING 26347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +50A0 +EFC0 +5080 +EFE0 +5940 +BFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_66EC +ENCODING 26348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E000 +AFE0 +AAA0 +EFE0 +AAA0 +AFE0 +EC80 +B6E0 +2480 +0EE0 +ENDCHAR +STARTCHAR U_66ED +ENCODING 26349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +B4A0 +AFE0 +EAA0 +AFE0 +A100 +EFE0 +A100 +0FE0 +0AA0 +ENDCHAR +STARTCHAR U_66EE +ENCODING 26350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AFE0 +AA80 +EAE0 +AFA0 +A9A0 +EFA0 +A940 +1FA0 +2120 +ENDCHAR +STARTCHAR U_66EF +ENCODING 26351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +F040 +BFC0 +F500 +BFC0 +B240 +BFE0 +F2A0 +1FA0 +22A0 +5F60 +ENDCHAR +STARTCHAR U_66F0 +ENCODING 26352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8080 +8080 +8080 +FE80 +8080 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_66F1 +ENCODING 26353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8080 +FF80 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_66F2 +ENCODING 26354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +FFC0 +9240 +9240 +9240 +FFC0 +9240 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_66F3 +ENCODING 26355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0480 +0300 +0220 +1DA0 +E060 +ENDCHAR +STARTCHAR U_66F4 +ENCODING 26356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0200 +3FC0 +2240 +3FC0 +2240 +3FC0 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_66F5 +ENCODING 26357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +7FC0 +4440 +7FC0 +4440 +7FC0 +0500 +0220 +0DA0 +F060 +ENDCHAR +STARTCHAR U_66F6 +ENCODING 26358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +7F80 +9280 +2480 +4A80 +1100 +7F80 +4080 +7F80 +4080 +7F80 +ENDCHAR +STARTCHAR U_66F7 +ENCODING 26359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1040 +1FC0 +1040 +1FC0 +1000 +3FE0 +6520 +A8A0 +3F20 +00C0 +ENDCHAR +STARTCHAR U_66F8 +ENCODING 26360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_66F9 +ENCODING 26361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4940 +7FC0 +4940 +7FC0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_66FA +ENCODING 26362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +2880 +2480 +3F80 +ENDCHAR +STARTCHAR U_66FB +ENCODING 26363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2040 +3FC0 +4080 +7BC0 +8A80 +57E0 +2080 +C080 +ENDCHAR +STARTCHAR U_66FC +ENCODING 26364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2900 +2500 +FFC0 +9240 +FFC0 +0000 +3F00 +1200 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_66FD +ENCODING 26365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2100 +1200 +FF80 +8880 +FF80 +8880 +FF80 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_66FE +ENCODING 26366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2400 +FF80 +C980 +AA80 +FF80 +0000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_66FF +ENCODING 26367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +3180 +4A40 +BFA0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6700 +ENCODING 26368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +4800 +7FC0 +4A40 +7980 +C980 +0E60 +ENDCHAR +STARTCHAR U_6701 +ENCODING 26369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A280 +FBE0 +2180 +6AA0 +B4E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6702 +ENCODING 26370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2C80 +2680 +FFE0 +4900 +7900 +4FC0 +7940 +4940 +FA40 +0CC0 +ENDCHAR +STARTCHAR U_6703 +ENCODING 26371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2E80 +C060 +7FC0 +5540 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_6704 +ENCODING 26372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +AFE0 +FAA0 +A920 +FFE0 +A900 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_6705 +ENCODING 26373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +FA00 +27E0 +4CA0 +9560 +EFA0 +0040 +ENDCHAR +STARTCHAR U_6706 +ENCODING 26374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5200 +FBE0 +ACA0 +F8A0 +A960 +FA60 +48A0 +7920 +4AA0 +7840 +ENDCHAR +STARTCHAR U_6707 +ENCODING 26375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3080 +4BE0 +B6A0 +03E0 +FEA0 +97E0 +FC80 +4A80 +7FE0 +4880 +7880 +ENDCHAR +STARTCHAR U_6708 +ENCODING 26376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +2080 +2080 +4280 +8100 +ENDCHAR +STARTCHAR U_6709 +ENCODING 26377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1000 +1F80 +3080 +5F80 +9080 +1F80 +1080 +1080 +1180 +ENDCHAR +STARTCHAR U_670A +ENCODING 26378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5000 +5000 +7000 +5FE0 +5280 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_670B +ENCODING 26379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +4920 +79E0 +4920 +4920 +79E0 +4920 +4920 +4920 +9A60 +ENDCHAR +STARTCHAR U_670C +ENCODING 26380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7A80 +4A40 +7A40 +4C20 +4BC0 +7940 +4940 +4940 +4A40 +9480 +ENDCHAR +STARTCHAR U_670D +ENCODING 26381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7AE0 +4A00 +4BE0 +7A20 +4AC0 +4A40 +8AA0 +9B20 +ENDCHAR +STARTCHAR U_670E +ENCODING 26382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7100 +5280 +7440 +5A20 +5100 +77C0 +5040 +5280 +5100 +A100 +ENDCHAR +STARTCHAR U_670F +ENCODING 26383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5520 +5520 +7520 +57E0 +5100 +7100 +5520 +5520 +97E0 +B420 +ENDCHAR +STARTCHAR U_6710 +ENCODING 26384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +53E0 +7420 +5BA0 +52A0 +72A0 +53A0 +52A0 +9020 +B0C0 +ENDCHAR +STARTCHAR U_6711 +ENCODING 26385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +5540 +5540 +7540 +5FE0 +5540 +7540 +55C0 +5400 +57E0 +A000 +ENDCHAR +STARTCHAR U_6712 +ENCODING 26386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57E0 +7520 +56A0 +5560 +7520 +56A0 +5460 +9420 +B460 +ENDCHAR +STARTCHAR U_6713 +ENCODING 26387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5AA0 +76C0 +5280 +52C0 +76A0 +5A80 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_6714 +ENCODING 26388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2920 +7F20 +11E0 +5520 +5520 +7DE0 +1120 +1120 +2220 +C460 +ENDCHAR +STARTCHAR U_6715 +ENCODING 26389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5240 +5080 +77C0 +5100 +5100 +7FE0 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_6716 +ENCODING 26390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5440 +77C0 +5440 +57C0 +7620 +5540 +5480 +5540 +A620 +ENDCHAR +STARTCHAR U_6717 +ENCODING 26391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FA20 +8A20 +FBE0 +8A20 +FA20 +A3E0 +9220 +AA20 +CC60 +ENDCHAR +STARTCHAR U_6718 +ENCODING 26392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5240 +5FA0 +7440 +5A20 +53C0 +7640 +5280 +5100 +9280 +BC60 +ENDCHAR +STARTCHAR U_6719 +ENCODING 26393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +FD20 +B5E0 +CD20 +8520 +BDE0 +A520 +A520 +FD20 +02A0 +0C40 +ENDCHAR +STARTCHAR U_671A +ENCODING 26394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0000 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0440 +ENDCHAR +STARTCHAR U_671B +ENCODING 26395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +1240 +FBC0 +2240 +3BC0 +2440 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_671C +ENCODING 26396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5000 +73C0 +5240 +57C0 +7080 +5100 +5FE0 +5100 +B300 +ENDCHAR +STARTCHAR U_671D +ENCODING 26397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +7DE0 +4520 +7D20 +45E0 +7D20 +1120 +FD20 +1260 +ENDCHAR +STARTCHAR U_671E +ENCODING 26398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1900 +1500 +FFE0 +2080 +5F40 +9120 +1F00 +1100 +1300 +ENDCHAR +STARTCHAR U_671F +ENCODING 26399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FD20 +4920 +79E0 +4920 +7920 +49E0 +FD20 +0120 +4920 +8660 +ENDCHAR +STARTCHAR U_6720 +ENCODING 26400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5FE0 +5440 +7100 +57C0 +5540 +7540 +5FE0 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_6721 +ENCODING 26401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +4B60 +4AA0 +7BE0 +4940 +4E20 +79E0 +4B40 +4C80 +8940 +9E20 +ENDCHAR +STARTCHAR U_6722 +ENCODING 26402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +A120 +F9E0 +8920 +F9E0 +A220 +FFC0 +0400 +7F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_6723 +ENCODING 26403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7100 +5FE0 +5540 +77C0 +5540 +5FE0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_6724 +ENCODING 26404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +79E0 +4920 +9240 +79E0 +4920 +69A0 +5960 +69A0 +9240 +ENDCHAR +STARTCHAR U_6725 +ENCODING 26405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +56C0 +5360 +7240 +55A0 +5FE0 +7A20 +57C0 +5240 +5240 +A4C0 +ENDCHAR +STARTCHAR U_6726 +ENCODING 26406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7FE0 +5820 +5FE0 +7540 +5A80 +55C0 +9AA0 +B500 +ENDCHAR +STARTCHAR U_6727 +ENCODING 26407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA80 +A4E0 +FF20 +AAE0 +AA80 +EEE0 +AA80 +AEE0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_6728 +ENCODING 26408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0400 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0440 +0400 +ENDCHAR +STARTCHAR U_6729 +ENCODING 26409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +2500 +2480 +2480 +4440 +8440 +1400 +0800 +ENDCHAR +STARTCHAR U_672A +ENCODING 26410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_672B +ENCODING 26411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0400 +7FC0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_672C +ENCODING 26412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +0E00 +1500 +1500 +2480 +4440 +9F20 +0400 +0400 +ENDCHAR +STARTCHAR U_672D +ENCODING 26413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +1100 +1900 +3500 +5500 +9100 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_672E +ENCODING 26414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0440 +FFE0 +0400 +1480 +1480 +1480 +1480 +2480 +4460 +0400 +ENDCHAR +STARTCHAR U_672F +ENCODING 26415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +0400 +0E00 +1500 +2480 +4440 +8420 +0400 +ENDCHAR +STARTCHAR U_6730 +ENCODING 26416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0E00 +1500 +E4E0 +7F80 +0200 +0C00 +1040 +2040 +1FC0 +ENDCHAR +STARTCHAR U_6731 +ENCODING 26417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +3FC0 +4400 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6732 +ENCODING 26418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +FD00 +2100 +7100 +6A80 +AA80 +2440 +2860 +3040 +ENDCHAR +STARTCHAR U_6733 +ENCODING 26419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FE80 +2280 +3280 +6A80 +6A40 +A240 +2440 +2420 +2820 +ENDCHAR +STARTCHAR U_6734 +ENCODING 26420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +1180 +1940 +3520 +5520 +9100 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_6735 +ENCODING 26421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +20E0 +4400 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6736 +ENCODING 26422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1100 +13C0 +2040 +2140 +4480 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_6737 +ENCODING 26423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +F920 +2120 +7120 +6A20 +AA20 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_6738 +ENCODING 26424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2120 +3120 +6920 +6120 +A120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_6739 +ENCODING 26425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +2780 +3280 +6A80 +A280 +A480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_673A +ENCODING 26426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +2480 +FC80 +2480 +7480 +6C80 +A480 +A480 +28A0 +30E0 +ENDCHAR +STARTCHAR U_673B +ENCODING 26427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +1120 +FD20 +1120 +3120 +3920 +5560 +93A0 +1120 +1020 +1020 +ENDCHAR +STARTCHAR U_673C +ENCODING 26428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +1240 +FE40 +1280 +3B00 +5600 +9200 +1220 +1220 +11E0 +ENDCHAR +STARTCHAR U_673D +ENCODING 26429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1100 +FD00 +1200 +3BE0 +3420 +5020 +9020 +1020 +1140 +1080 +ENDCHAR +STARTCHAR U_673E +ENCODING 26430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +F880 +1080 +3080 +3880 +5480 +5080 +9080 +1080 +1380 +ENDCHAR +STARTCHAR U_673F +ENCODING 26431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +0400 +7F80 +4480 +4480 +4F80 +1500 +2480 +C440 +0400 +ENDCHAR +STARTCHAR U_6740 +ENCODING 26432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1900 +0600 +1900 +64C0 +0400 +FFE0 +1500 +2480 +C460 +0C00 +ENDCHAR +STARTCHAR U_6741 +ENCODING 26433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2200 +F900 +2100 +7100 +6A80 +A280 +A440 +2440 +2820 +2000 +ENDCHAR +STARTCHAR U_6742 +ENCODING 26434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F00 +0900 +1120 +64E0 +0400 +FFE0 +0400 +2480 +5440 +8820 +ENDCHAR +STARTCHAR U_6743 +ENCODING 26435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FC0 +F440 +2440 +2440 +7280 +6A80 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6744 +ENCODING 26436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +77E0 +6900 +A100 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6745 +ENCODING 26437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2080 +F880 +2080 +37E0 +6880 +A080 +A080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_6746 +ENCODING 26438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +2080 +3080 +6FE0 +6080 +A080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_6747 +ENCODING 26439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +27E0 +3100 +6A00 +63C0 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_6748 +ENCODING 26440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA40 +2340 +62C0 +7240 +A980 +A180 +2180 +2240 +2420 +ENDCHAR +STARTCHAR U_6749 +ENCODING 26441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1080 +FD00 +1220 +1840 +3480 +5300 +9020 +1040 +1080 +1300 +ENDCHAR +STARTCHAR U_674A +ENCODING 26442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2220 +FAA0 +22A0 +72A0 +6AA0 +A2A0 +A2A0 +24A0 +2420 +2820 +ENDCHAR +STARTCHAR U_674B +ENCODING 26443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2780 +FC80 +2480 +3680 +6D80 +A480 +A480 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_674C +ENCODING 26444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA80 +2280 +3280 +2A80 +6280 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_674D +ENCODING 26445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F840 +2080 +2080 +37E0 +6880 +A080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_674E +ENCODING 26446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +1F00 +0200 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_674F +ENCODING 26447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +0E00 +3580 +C460 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_6750 +ENCODING 26448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +2040 +FBE0 +2040 +70C0 +6940 +A240 +2440 +2140 +2080 +ENDCHAR +STARTCHAR U_6751 +ENCODING 26449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +FBE0 +2040 +7240 +6940 +A140 +2040 +2040 +2040 +21C0 +ENDCHAR +STARTCHAR U_6752 +ENCODING 26450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +F920 +2520 +2520 +7120 +6920 +AA20 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_6753 +ENCODING 26451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +3020 +2A20 +6120 +A120 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_6754 +ENCODING 26452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +2100 +7100 +6FE0 +A100 +2100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_6755 +ENCODING 26453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +27E0 +7100 +6900 +A100 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6756 +ENCODING 26454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2080 +2480 +3280 +6A80 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6757 +ENCODING 26455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +2000 +3FC0 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6758 +ENCODING 26456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2400 +2400 +3FC0 +2600 +4D00 +5480 +A460 +0400 +ENDCHAR +STARTCHAR U_6759 +ENCODING 26457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FA00 +23E0 +2600 +3200 +6A00 +A100 +2120 +20A0 +2060 +ENDCHAR +STARTCHAR U_675A +ENCODING 26458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2400 +23C0 +3080 +6900 +A200 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_675B +ENCODING 26459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F820 +23E0 +7200 +6BE0 +A020 +A020 +2020 +2140 +2080 +ENDCHAR +STARTCHAR U_675C +ENCODING 26460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +F900 +27C0 +7100 +6900 +A100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_675D +ENCODING 26461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FAA0 +23E0 +26A0 +32A0 +6AE0 +A280 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_675E +ENCODING 26462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +F820 +2020 +23E0 +3220 +6A00 +A200 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_675F +ENCODING 26463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +2480 +3F80 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6760 +ENCODING 26464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +2100 +2100 +3100 +6900 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6761 +ENCODING 26465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F80 +2900 +4600 +0A00 +3580 +C460 +3F80 +1500 +2480 +DC40 +ENDCHAR +STARTCHAR U_6762 +ENCODING 26466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +1500 +2480 +C060 +3F80 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_6763 +ENCODING 26467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F880 +24A0 +74A0 +6CA0 +A4A0 +A4A0 +24A0 +27E0 +2000 +ENDCHAR +STARTCHAR U_6764 +ENCODING 26468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FA00 +2200 +73C0 +6A40 +A240 +A440 +2440 +2940 +2880 +ENDCHAR +STARTCHAR U_6765 +ENCODING 26469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +1500 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6766 +ENCODING 26470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBC0 +2280 +7480 +6900 +A100 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6767 +ENCODING 26471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F900 +2FE0 +7200 +6A00 +A200 +A200 +2200 +23E0 +2000 +ENDCHAR +STARTCHAR U_6768 +ENCODING 26472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +F900 +2200 +77E0 +6AA0 +A2A0 +A4A0 +2920 +2220 +24C0 +ENDCHAR +STARTCHAR U_6769 +ENCODING 26473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA40 +2240 +7240 +6BE0 +A020 +A7A0 +2020 +2020 +20C0 +ENDCHAR +STARTCHAR U_676A +ENCODING 26474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +2540 +7520 +6900 +A120 +A040 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_676B +ENCODING 26475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +21C0 +7500 +6D00 +A500 +A500 +2500 +2FE0 +2000 +ENDCHAR +STARTCHAR U_676C +ENCODING 26476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +F800 +27E0 +6280 +7280 +AA80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_676D +ENCODING 26477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2000 +2380 +3280 +6A80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_676E +ENCODING 26478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +7520 +6D20 +A520 +A5A0 +2540 +2100 +2100 +ENDCHAR +STARTCHAR U_676F +ENCODING 26479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +2100 +3100 +2B40 +6520 +A920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6770 +ENCODING 26480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +FFE0 +1500 +2480 +4440 +8420 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_6771 +ENCODING 26481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6772 +ENCODING 26482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_6773 +ENCODING 26483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +4440 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_6774 +ENCODING 26484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2220 +6540 +7100 +A900 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6775 +ENCODING 26485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2480 +6080 +77E0 +A880 +A080 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_6776 +ENCODING 26486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +2540 +3540 +6FC0 +A100 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_6777 +ENCODING 26487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FD40 +2540 +6540 +77C0 +AC00 +A400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6778 +ENCODING 26488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FA40 +2240 +6420 +77C0 +AA40 +A240 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_6779 +ENCODING 26489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FCA0 +24A0 +6CC0 +7480 +AD80 +A680 +24A0 +24A0 +2460 +ENDCHAR +STARTCHAR U_677A +ENCODING 26490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FA80 +2200 +2200 +3640 +6A20 +A220 +2240 +2240 +21C0 +ENDCHAR +STARTCHAR U_677B +ENCODING 26491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +F940 +2140 +2140 +37C0 +6A40 +A240 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_677C +ENCODING 26492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +FA80 +2100 +6FE0 +7120 +A940 +A100 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_677D +ENCODING 26493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2780 +F880 +27E0 +2080 +7080 +6FE0 +A080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_677E +ENCODING 26494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +2440 +2420 +3120 +6900 +A200 +2240 +2440 +27A0 +ENDCHAR +STARTCHAR U_677F +ENCODING 26495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +2400 +27C0 +7440 +6E40 +A580 +2880 +2940 +3620 +ENDCHAR +STARTCHAR U_6780 +ENCODING 26496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +C860 +1100 +3F80 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6781 +ENCODING 26497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FA80 +22E0 +2220 +7220 +6D40 +A540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_6782 +ENCODING 26498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +FA20 +23E0 +7220 +6A20 +A3E0 +A220 +2220 +2420 +2860 +ENDCHAR +STARTCHAR U_6783 +ENCODING 26499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +2020 +6220 +7120 +A8A0 +A120 +2620 +20A0 +2040 +ENDCHAR +STARTCHAR U_6784 +ENCODING 26500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +2220 +7220 +6CA0 +A7A0 +20A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6785 +ENCODING 26501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +FA40 +2240 +27E0 +3240 +6A40 +A240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_6786 +ENCODING 26502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +2100 +21E0 +3700 +6900 +A1E0 +2720 +2120 +20E0 +ENDCHAR +STARTCHAR U_6787 +ENCODING 26503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +24A0 +27C0 +3480 +6C80 +A480 +25A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_6788 +ENCODING 26504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3AC0 +2300 +2A40 +31C0 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6789 +ENCODING 26505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +F900 +2100 +2100 +37C0 +6900 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_678A +ENCODING 26506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +25E0 +FD20 +2520 +7520 +6D20 +A520 +A7A0 +2540 +2100 +2100 +ENDCHAR +STARTCHAR U_678B +ENCODING 26507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2100 +61E0 +7120 +A920 +A220 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_678C +ENCODING 26508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA80 +2240 +7420 +6FE0 +A240 +A240 +2240 +2540 +2880 +ENDCHAR +STARTCHAR U_678D +ENCODING 26509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +FA40 +2420 +6FE0 +7200 +ABC0 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_678E +ENCODING 26510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7C0 +2100 +7100 +6FE0 +A100 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_678F +ENCODING 26511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F440 +2FE0 +7440 +6C40 +AFE0 +A440 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_6790 +ENCODING 26512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +2400 +27E0 +3480 +6C80 +A480 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_6791 +ENCODING 26513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +FA00 +23C0 +2240 +3440 +6C40 +A7C0 +2080 +2080 +2FE0 +ENDCHAR +STARTCHAR U_6792 +ENCODING 26514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +FA40 +2240 +67E0 +70C0 +A940 +A240 +2440 +2840 +20C0 +ENDCHAR +STARTCHAR U_6793 +ENCODING 26515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +F940 +2040 +2240 +3140 +6860 +A7C0 +2040 +2040 +2040 +ENDCHAR +STARTCHAR U_6794 +ENCODING 26516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2920 +3080 +67E0 +A040 +2040 +2080 +2100 +ENDCHAR +STARTCHAR U_6795 +ENCODING 26517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +3540 +6980 +A980 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6796 +ENCODING 26518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +F900 +27E0 +7100 +6900 +A280 +A280 +2440 +2820 +ENDCHAR +STARTCHAR U_6797 +ENCODING 26519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +7100 +6B80 +A540 +A920 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6798 +ENCODING 26520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +6520 +75A0 +AE60 +A420 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_6799 +ENCODING 26521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC00 +25E0 +2520 +3520 +6D60 +A500 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_679A +ENCODING 26522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2240 +2440 +7640 +6A80 +A180 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_679B +ENCODING 26523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2540 +7540 +6D40 +A540 +A540 +2520 +2920 +2100 +ENDCHAR +STARTCHAR U_679C +ENCODING 26524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_679D +ENCODING 26525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +F100 +27C0 +7240 +6A40 +A280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_679E +ENCODING 26526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FC80 +2480 +6480 +7680 +AD80 +A480 +2940 +3220 +2420 +ENDCHAR +STARTCHAR U_679F +ENCODING 26527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +F800 +2000 +67E0 +7100 +A900 +A200 +2240 +2FE0 +2420 +ENDCHAR +STARTCHAR U_67A0 +ENCODING 26528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2780 +FA80 +22A0 +74A0 +6A60 +A200 +AFE0 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_67A1 +ENCODING 26529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2640 +FA40 +2240 +7240 +6FE0 +A240 +A240 +2440 +2440 +3040 +ENDCHAR +STARTCHAR U_67A2 +ENCODING 26530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC20 +2620 +2540 +3480 +6D40 +A620 +2420 +2400 +27E0 +ENDCHAR +STARTCHAR U_67A3 +ENCODING 26531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +2E80 +1500 +6E80 +0160 +1C00 +0300 +ENDCHAR +STARTCHAR U_67A4 +ENCODING 26532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +F940 +27E0 +7100 +6900 +A280 +A280 +2440 +2440 +2820 +ENDCHAR +STARTCHAR U_67A5 +ENCODING 26533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC80 +2480 +27E0 +34A0 +6CA0 +A4A0 +2520 +2AA0 +3440 +ENDCHAR +STARTCHAR U_67A6 +ENCODING 26534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FBE0 +2220 +73E0 +6A00 +A200 +2200 +2400 +2400 +2800 +ENDCHAR +STARTCHAR U_67A7 +ENCODING 26535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +2540 +2540 +3540 +6D40 +A180 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_67A8 +ENCODING 26536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2260 +2240 +FA80 +2300 +2200 +37E0 +6A80 +A280 +22C0 +2320 +2220 +ENDCHAR +STARTCHAR U_67A9 +ENCODING 26537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +0000 +1100 +2480 +C860 +1100 +3F80 +ENDCHAR +STARTCHAR U_67AA +ENCODING 26538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2020 +27C0 +3440 +6C40 +A580 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_67AB +ENCODING 26539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +26C0 +2540 +3540 +6D40 +A6C0 +2440 +2820 +3020 +ENDCHAR +STARTCHAR U_67AC +ENCODING 26540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2640 +7540 +6FE0 +A440 +2440 +2840 +2940 +3080 +ENDCHAR +STARTCHAR U_67AD +ENCODING 26541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2880 +2580 +2000 +3FE0 +0420 +7FA0 +1560 +2480 +C460 +ENDCHAR +STARTCHAR U_67AE +ENCODING 26542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F9E0 +2100 +2100 +37E0 +6C20 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_67AF +ENCODING 26543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +2080 +2080 +33E0 +6A20 +A220 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_67B0 +ENCODING 26544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +F920 +2540 +2340 +3100 +6FE0 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_67B1 +ENCODING 26545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA00 +2440 +77E0 +6820 +67C0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_67B2 +ENCODING 26546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2080 +7FC0 +0040 +3F80 +2080 +3F80 +0400 +FFE0 +1580 +E460 +ENDCHAR +STARTCHAR U_67B3 +ENCODING 26547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +7440 +6FC0 +A000 +A000 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_67B4 +ENCODING 26548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +6000 +77E0 +A920 +A120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_67B5 +ENCODING 26549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2000 +6FE0 +7200 +ABC0 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_67B6 +ENCODING 26550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +2A20 +4BE0 +9220 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67B7 +ENCODING 26551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +48E0 +5EA0 +FAA0 +4AA0 +6AA0 +DAA0 +4AA0 +4AA0 +52E0 +64A0 +ENDCHAR +STARTCHAR U_67B8 +ENCODING 26552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2420 +23A0 +32A0 +6AA0 +A3A0 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_67B9 +ENCODING 26553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F820 +27A0 +24A0 +34A0 +6FA0 +A4C0 +2400 +2420 +23E0 +ENDCHAR +STARTCHAR U_67BA +ENCODING 26554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2100 +67C0 +7100 +AB80 +A540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_67BB +ENCODING 26555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2540 +F540 +2FE0 +6540 +7540 +AD40 +A5C0 +2400 +2400 +27E0 +ENDCHAR +STARTCHAR U_67BC +ENCODING 26556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFE0 +2900 +2F00 +2000 +3FC0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67BD +ENCODING 26557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +FFE0 +2080 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67BE +ENCODING 26558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2540 +7540 +6FC0 +A540 +2540 +2940 +2100 +2100 +ENDCHAR +STARTCHAR U_67BF +ENCODING 26559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F7E0 +2100 +7240 +6A40 +AFE0 +2240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_67C0 +ENCODING 26560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FFE0 +24A0 +2480 +37E0 +6D40 +A540 +2880 +3140 +2620 +ENDCHAR +STARTCHAR U_67C1 +ENCODING 26561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2420 +2200 +3240 +6B80 +A200 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_67C2 +ENCODING 26562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +FC80 +22A0 +22E0 +33A0 +6EA0 +A2E0 +2280 +2220 +21E0 +ENDCHAR +STARTCHAR U_67C3 +ENCODING 26563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +6920 +7080 +AFE0 +A040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_67C4 +ENCODING 26564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +F880 +27E0 +24A0 +34A0 +6DA0 +A660 +2420 +2420 +24E0 +ENDCHAR +STARTCHAR U_67C5 +ENCODING 26565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +2400 +3520 +6D40 +A580 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_67C6 +ENCODING 26566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2000 +2440 +3440 +6A40 +A240 +2080 +2080 +2FE0 +ENDCHAR +STARTCHAR U_67C7 +ENCODING 26567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +7100 +6B00 +A380 +2540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_67C8 +ENCODING 26568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2520 +FD40 +2100 +27C0 +3100 +6FE0 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_67C9 +ENCODING 26569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +2080 +27E0 +3040 +6880 +A300 +2400 +2A00 +31E0 +ENDCHAR +STARTCHAR U_67CA +ENCODING 26570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC40 +2280 +2100 +3280 +6C60 +A100 +20C0 +2300 +20C0 +ENDCHAR +STARTCHAR U_67CB +ENCODING 26571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +2480 +7FE0 +A200 +2120 +24E0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67CC +ENCODING 26572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +FFA0 +2020 +27A0 +34A0 +6CA0 +A7A0 +24A0 +2020 +20E0 +ENDCHAR +STARTCHAR U_67CD +ENCODING 26573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFC0 +2540 +2540 +3540 +6FE0 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_67CE +ENCODING 26574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FC40 +25E0 +2440 +3640 +6D40 +A440 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_67CF +ENCODING 26575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2100 +FBE0 +2220 +2220 +33E0 +6A20 +A220 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_67D0 +ENCODING 26576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +1100 +1F00 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67D1 +ENCODING 26577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +FFE0 +2240 +2240 +33C0 +6A40 +A240 +2240 +23C0 +2240 +ENDCHAR +STARTCHAR U_67D2 +ENCODING 26578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5260 +3380 +6E20 +21E0 +2400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_67D3 +ENCODING 26579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +AF80 +5480 +24A0 +C8E0 +5000 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67D4 +ENCODING 26580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0900 +7FE0 +1440 +2480 +4C00 +8400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67D5 +ENCODING 26581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +F880 +27E0 +30A0 +69C0 +6280 +A480 +3880 +2280 +2100 +ENDCHAR +STARTCHAR U_67D6 +ENCODING 26582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +FA20 +2220 +74A0 +6840 +A7E0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_67D7 +ENCODING 26583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2280 +FA80 +2240 +7440 +6820 +A7C0 +2440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_67D8 +ENCODING 26584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +7200 +6BE0 +A620 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_67D9 +ENCODING 26585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FCA0 +27E0 +24A0 +34A0 +6FE0 +A4A0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_67DA +ENCODING 26586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2920 +3920 +6FE0 +A920 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_67DB +ENCODING 26587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2520 +27E0 +3520 +6FE0 +A520 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_67DC +ENCODING 26588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FC00 +27C0 +2440 +7440 +6FC0 +A400 +A400 +2400 +27E0 +ENDCHAR +STARTCHAR U_67DD +ENCODING 26589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +2400 +27E0 +3480 +6D80 +A4C0 +24A0 +2880 +3080 +ENDCHAR +STARTCHAR U_67DE +ENCODING 26590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +2500 +2100 +31E0 +6900 +A100 +21E0 +2100 +2100 +ENDCHAR +STARTCHAR U_67DF +ENCODING 26591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +2540 +27C0 +3540 +6D40 +AFE0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_67E0 +ENCODING 26592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FC20 +2000 +27E0 +3080 +6880 +A080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_67E1 +ENCODING 26593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2000 +FFE0 +2100 +7100 +6DA0 +A540 +A940 +3120 +2300 +ENDCHAR +STARTCHAR U_67E2 +ENCODING 26594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +FC80 +2480 +27E0 +3480 +6C80 +A4A0 +2560 +2720 +24A0 +ENDCHAR +STARTCHAR U_67E3 +ENCODING 26595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +FFC0 +2900 +2100 +37E0 +6900 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_67E4 +ENCODING 26596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2440 +3440 +6C40 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_67E5 +ENCODING 26597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_67E6 +ENCODING 26598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2440 +67C0 +7440 +AC40 +A7C0 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_67E7 +ENCODING 26599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +FD40 +2540 +6540 +7540 +AD40 +A540 +2520 +2960 +31A0 +ENDCHAR +STARTCHAR U_67E8 +ENCODING 26600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FFE0 +2500 +77C0 +6D40 +B540 +A540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_67E9 +ENCODING 26601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FD00 +25C0 +2540 +3640 +6C40 +A4A0 +2520 +2400 +27E0 +ENDCHAR +STARTCHAR U_67EA +ENCODING 26602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +FDE0 +2AA0 +26A0 +34A0 +6EA0 +A9A0 +3EA0 +2120 +22C0 +ENDCHAR +STARTCHAR U_67EB +ENCODING 26603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +22A0 +6FE0 +7A80 +AFE0 +A2A0 +22A0 +24C0 +2880 +ENDCHAR +STARTCHAR U_67EC +ENCODING 26604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +5540 +4A40 +7FC0 +0E00 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67ED +ENCODING 26605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FFE0 +2200 +7200 +6BE0 +A240 +A540 +2480 +2940 +3620 +ENDCHAR +STARTCHAR U_67EE +ENCODING 26606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FD20 +2520 +27E0 +3100 +6D20 +A520 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_67EF +ENCODING 26607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2040 +F840 +2740 +2540 +3540 +6F40 +A540 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_67F0 +ENCODING 26608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +3F80 +0000 +FFE0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_67F1 +ENCODING 26609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2100 +7100 +6900 +A7C0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_67F2 +ENCODING 26610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2140 +FA40 +2240 +2240 +3680 +6AA0 +A320 +2240 +2640 +39C0 +ENDCHAR +STARTCHAR U_67F3 +ENCODING 26611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +FAA0 +2AA0 +2AA0 +3AA0 +6EA0 +AAA0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_67F4 +ENCODING 26612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1240 +5E80 +5320 +5220 +F9E0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_67F5 +ENCODING 26613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FAA0 +4AA0 +5FE0 +6AA0 +DAA0 +4AA0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_67F6 +ENCODING 26614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2AA0 +2AA0 +3AA0 +6CE0 +A820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_67F7 +ENCODING 26615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2440 +67C0 +7280 +AA80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_67F8 +ENCODING 26616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F900 +2180 +6340 +7520 +A920 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_67F9 +ENCODING 26617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F700 +2500 +7500 +6FE0 +AB20 +25A0 +3940 +2100 +2100 +ENDCHAR +STARTCHAR U_67FA +ENCODING 26618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FC20 +27E0 +7100 +6FE0 +A120 +A120 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_67FB +ENCODING 26619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +E4E0 +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_67FC +ENCODING 26620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +6080 +7280 +AA80 +A240 +2440 +2420 +2820 +ENDCHAR +STARTCHAR U_67FD +ENCODING 26621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2440 +FA40 +2180 +7240 +6D20 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_67FE +ENCODING 26622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F900 +2100 +3500 +6DC0 +6500 +A500 +2500 +2500 +2FE0 +ENDCHAR +STARTCHAR U_67FF +ENCODING 26623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2100 +27E0 +3520 +6D20 +A520 +2560 +2100 +2100 +ENDCHAR +STARTCHAR U_6800 +ENCODING 26624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2400 +FFE0 +2400 +75C0 +6D40 +A5C0 +A520 +2520 +29E0 +ENDCHAR +STARTCHAR U_6801 +ENCODING 26625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +F7A0 +25A0 +79A0 +6AA0 +B6A0 +A2E0 +2480 +2880 +3080 +ENDCHAR +STARTCHAR U_6802 +ENCODING 26626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +2640 +7540 +6FE0 +A640 +A940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_6803 +ENCODING 26627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F00 +2800 +FFE0 +2900 +69E0 +7920 +A920 +AA20 +2AA0 +3440 +ENDCHAR +STARTCHAR U_6804 +ENCODING 26628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +1500 +FFE0 +8420 +0400 +7FC0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6805 +ENCODING 26629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2AA0 +3FE0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +3560 +ENDCHAR +STARTCHAR U_6806 +ENCODING 26630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +0A00 +3180 +C460 +0A00 +0400 +ENDCHAR +STARTCHAR U_6807 +ENCODING 26631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2000 +F800 +2FE0 +2100 +7100 +6540 +A520 +2920 +2100 +2300 +ENDCHAR +STARTCHAR U_6808 +ENCODING 26632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2100 +31E0 +6F00 +6120 +A140 +20A0 +2360 +2C20 +ENDCHAR +STARTCHAR U_6809 +ENCODING 26633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2000 +2FE0 +3120 +6920 +A120 +2160 +2100 +2100 +ENDCHAR +STARTCHAR U_680A +ENCODING 26634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +F900 +27E0 +2280 +32A0 +6AA0 +A2C0 +2480 +29A0 +3260 +ENDCHAR +STARTCHAR U_680B +ENCODING 26635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2280 +7480 +6FE0 +A080 +A4C0 +24A0 +28A0 +2180 +ENDCHAR +STARTCHAR U_680C +ENCODING 26636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27E0 +7420 +6C20 +A7E0 +A400 +2400 +2800 +3000 +ENDCHAR +STARTCHAR U_680D +ENCODING 26637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +2500 +F7E0 +2900 +7100 +6FC0 +A100 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_680E +ENCODING 26638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +FC00 +2480 +2480 +37E0 +6880 +A2C0 +24A0 +28A0 +2180 +ENDCHAR +STARTCHAR U_680F +ENCODING 26639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +2240 +F000 +2FE0 +6000 +7000 +A7C0 +A000 +2000 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6810 +ENCODING 26640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2080 +FF00 +2120 +2F40 +7380 +6D40 +A540 +A920 +2100 +2300 +ENDCHAR +STARTCHAR U_6811 +ENCODING 26641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2E40 +F3E0 +2A40 +2A40 +7540 +A4C0 +2A40 +3140 +2040 +20C0 +ENDCHAR +STARTCHAR U_6812 +ENCODING 26642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +F7E0 +2820 +23A0 +32A0 +6BA0 +A2A0 +23A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_6813 +ENCODING 26643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2020 +27C0 +3100 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6814 +ENCODING 26644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1120 +7920 +1120 +FEC0 +1400 +FFE0 +1500 +2480 +4460 +8420 +ENDCHAR +STARTCHAR U_6815 +ENCODING 26645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2900 +FFC0 +2840 +3840 +6840 +AFC0 +2900 +2900 +2FE0 +ENDCHAR +STARTCHAR U_6816 +ENCODING 26646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +F280 +2FE0 +6AA0 +7AA0 +AAE0 +AC20 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6817 +ENCODING 26647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6818 +ENCODING 26648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +FA40 +2580 +2100 +36E0 +6920 +A6A0 +2040 +2080 +2700 +ENDCHAR +STARTCHAR U_6819 +ENCODING 26649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F680 +2100 +76E0 +6900 +AFC0 +2500 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_681A +ENCODING 26650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFC0 +2100 +2100 +37E0 +6900 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_681B +ENCODING 26651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2240 +7540 +6880 +BFE0 +AAA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_681C +ENCODING 26652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27E0 +7520 +6D20 +A560 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_681D +ENCODING 26653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F900 +27E0 +7100 +6900 +A7E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_681E +ENCODING 26654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1080 +1080 +7BE0 +2080 +4480 +FFE0 +0D00 +3480 +C460 +0400 +ENDCHAR +STARTCHAR U_681F +ENCODING 26655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +7280 +6FE0 +A280 +A280 +2280 +2480 +2880 +ENDCHAR +STARTCHAR U_6820 +ENCODING 26656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4F00 +C100 +5FE0 +4100 +4FC0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6821 +ENCODING 26657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +F000 +2280 +7440 +6AA0 +A280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6822 +ENCODING 26658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FA00 +27C0 +7440 +6C40 +A7C0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6823 +ENCODING 26659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2260 +F780 +2C80 +7480 +67E0 +A480 +2480 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_6824 +ENCODING 26660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5100 +E940 +4740 +6380 +CB80 +D540 +5520 +4920 +5500 +4200 +ENDCHAR +STARTCHAR U_6825 +ENCODING 26661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +1A40 +2300 +C480 +4840 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6826 +ENCODING 26662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22A0 +FAA0 +22A0 +77E0 +6AA0 +A2A0 +A2A0 +22A0 +24A0 +2820 +ENDCHAR +STARTCHAR U_6827 +ENCODING 26663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +27C0 +7540 +6FC0 +A140 +2180 +22A0 +2C60 +2020 +ENDCHAR +STARTCHAR U_6828 +ENCODING 26664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +F9E0 +2220 +20A0 +3280 +6A80 +AC80 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_6829 +ENCODING 26665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +25A0 +7360 +6920 +A360 +A5A0 +2120 +2120 +2360 +ENDCHAR +STARTCHAR U_682A +ENCODING 26666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +F7C0 +2900 +7100 +6FE0 +A100 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_682B +ENCODING 26667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F200 +25E0 +3440 +2C80 +77E0 +A480 +2480 +2480 +2580 +ENDCHAR +STARTCHAR U_682C +ENCODING 26668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +FFC0 +2540 +7540 +6FC0 +A400 +A420 +2420 +23E0 +ENDCHAR +STARTCHAR U_682D +ENCODING 26669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F200 +2FE0 +3AA0 +2AA0 +6AA0 +AAA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_682E +ENCODING 26670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +FC40 +27C0 +2440 +37C0 +6C40 +A440 +25E0 +2E40 +2040 +ENDCHAR +STARTCHAR U_682F +ENCODING 26671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2200 +23E0 +3620 +6BE0 +A220 +23E0 +2220 +22E0 +ENDCHAR +STARTCHAR U_6830 +ENCODING 26672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +22A0 +F480 +2FE0 +7480 +6CA0 +A4A0 +A4C0 +24A0 +2560 +2620 +ENDCHAR +STARTCHAR U_6831 +ENCODING 26673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA80 +27E0 +2280 +3280 +6FE0 +A000 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_6832 +ENCODING 26674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +2FE0 +2100 +33E0 +6D00 +A3E0 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_6833 +ENCODING 26675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27A0 +F920 +2140 +27E0 +3100 +6A40 +A780 +2A20 +2220 +21E0 +ENDCHAR +STARTCHAR U_6834 +ENCODING 26676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +27C0 +2540 +3540 +6FE0 +A440 +2440 +2940 +3080 +ENDCHAR +STARTCHAR U_6835 +ENCODING 26677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2420 +F4A0 +27A0 +28A0 +39A0 +66A0 +A2A0 +2420 +2820 +30E0 +ENDCHAR +STARTCHAR U_6836 +ENCODING 26678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F920 +2FE0 +6920 +7920 +AAA0 +AC60 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6837 +ENCODING 26679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +77C0 +6100 +A100 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6838 +ENCODING 26680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2100 +2240 +7780 +6920 +A240 +2480 +2140 +2E20 +ENDCHAR +STARTCHAR U_6839 +ENCODING 26681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3520 +6D40 +A480 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_683A +ENCODING 26682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2700 +FC20 +23E0 +2000 +37E0 +6C20 +A7E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_683B +ENCODING 26683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +7080 +6F80 +A480 +A4A0 +27A0 +3C60 +2020 +ENDCHAR +STARTCHAR U_683C +ENCODING 26684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F440 +2A80 +2100 +7280 +6C60 +A7C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_683D +ENCODING 26685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7D20 +1100 +FFE0 +1100 +FD20 +1140 +3880 +55A0 +9260 +1420 +ENDCHAR +STARTCHAR U_683E +ENCODING 26686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +C920 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_683F +ENCODING 26687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +24A0 +FFE0 +2480 +7480 +6C80 +A480 +2540 +2540 +2620 +ENDCHAR +STARTCHAR U_6840 +ENCODING 26688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FE0 +4880 +B280 +17E0 +2080 +4480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6841 +ENCODING 26689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +25E0 +F800 +2200 +75E0 +6C40 +A440 +A440 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_6842 +ENCODING 26690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2100 +2FE0 +3000 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6843 +ENCODING 26691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FAA0 +26C0 +2280 +36C0 +6AA0 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6844 +ENCODING 26692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FD40 +2100 +27E0 +3280 +6A80 +A280 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_6845 +ENCODING 26693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FE0 +2400 +35E0 +6D20 +A560 +2500 +2520 +28E0 +ENDCHAR +STARTCHAR U_6846 +ENCODING 26694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FFE0 +2480 +2480 +75C0 +6C80 +A480 +27E0 +2400 +27E0 +ENDCHAR +STARTCHAR U_6847 +ENCODING 26695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FBC0 +2A40 +6A40 +13C0 +6C00 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6848 +ENCODING 26696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8820 +FFE0 +1200 +0F00 +F8E0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6849 +ENCODING 26697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2520 +2100 +37E0 +6A40 +A240 +2180 +2340 +2C20 +ENDCHAR +STARTCHAR U_684A +ENCODING 26698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +2080 +4440 +BFA0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_684B +ENCODING 26699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F100 +2FC0 +2140 +37C0 +6500 +AFE0 +2160 +2280 +2C60 +ENDCHAR +STARTCHAR U_684C +ENCODING 26700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_684D +ENCODING 26701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +2440 +6BA0 +7000 +AFE0 +A200 +27C0 +2040 +2180 +ENDCHAR +STARTCHAR U_684E +ENCODING 26702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FA00 +2440 +2FA0 +3100 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_684F +ENCODING 26703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2EA0 +FCA0 +24A0 +24C0 +34A0 +6DA0 +A6A0 +3CE0 +2080 +2080 +ENDCHAR +STARTCHAR U_6850 +ENCODING 26704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FBA0 +2820 +6BA0 +7AA0 +AAA0 +ABA0 +2AA0 +2820 +2860 +ENDCHAR +STARTCHAR U_6851 +ENCODING 26705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1100 +0E00 +1100 +FBE0 +4A40 +3180 +4A40 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6852 +ENCODING 26706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +FFE0 +2080 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_6853 +ENCODING 26707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +F800 +27C0 +6440 +77C0 +AC40 +A7C0 +2440 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6854 +ENCODING 26708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +27C0 +3000 +6FC0 +A440 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6855 +ENCODING 26709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +F820 +2820 +2820 +3EE0 +6820 +A820 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6856 +ENCODING 26710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4800 +5FC0 +F540 +5540 +F540 +D540 +5540 +5540 +7FE0 +4000 +ENDCHAR +STARTCHAR U_6857 +ENCODING 26711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +FAE0 +2420 +78A0 +6240 +AFE0 +2700 +2A80 +3260 +2200 +ENDCHAR +STARTCHAR U_6858 +ENCODING 26712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2440 +FC40 +27C0 +7400 +67E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_6859 +ENCODING 26713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7C0 +2140 +3500 +67C0 +A900 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_685A +ENCODING 26714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +2A80 +F540 +2200 +77E0 +6440 +AA40 +2180 +2300 +2C00 +ENDCHAR +STARTCHAR U_685B +ENCODING 26715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FA00 +2FE0 +7000 +6FE0 +A200 +2300 +22C0 +2240 +2200 +ENDCHAR +STARTCHAR U_685C +ENCODING 26716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2560 +FD40 +3280 +6A00 +6FE0 +A240 +2680 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_685D +ENCODING 26717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +2840 +FFE0 +2A40 +7B40 +65E0 +A440 +2440 +2840 +2040 +ENDCHAR +STARTCHAR U_685E +ENCODING 26718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +2EA0 +FAA0 +2AC0 +76A0 +62A0 +A4E0 +2480 +2480 +2880 +ENDCHAR +STARTCHAR U_685F +ENCODING 26719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +FBC0 +2E00 +73C0 +6E00 +A3E0 +2E80 +2120 +2EA0 +2060 +ENDCHAR +STARTCHAR U_6860 +ENCODING 26720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2280 +72A0 +6AA0 +A6C0 +A280 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6861 +ENCODING 26721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FF40 +21A0 +2660 +3000 +6FE0 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6862 +ENCODING 26722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27E0 +2420 +3520 +6D20 +A520 +2520 +2280 +2C60 +ENDCHAR +STARTCHAR U_6863 +ENCODING 26723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +FB40 +2100 +27E0 +7020 +6820 +A7E0 +2020 +2020 +27E0 +ENDCHAR +STARTCHAR U_6864 +ENCODING 26724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +67E0 +7020 +AFE0 +A400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6865 +ENCODING 26725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F100 +2FE0 +6280 +7440 +AAA0 +A280 +2280 +2480 +2880 +ENDCHAR +STARTCHAR U_6866 +ENCODING 26726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22A0 +FCC0 +25A0 +74A0 +6C60 +A100 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_6867 +ENCODING 26727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +6FE0 +7000 +AFE0 +A200 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_6868 +ENCODING 26728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +33E0 +1440 +3280 +D700 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_6869 +ENCODING 26729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FC00 +2480 +2480 +37E0 +6C80 +A480 +2480 +2880 +37E0 +ENDCHAR +STARTCHAR U_686A +ENCODING 26730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +77C0 +6880 +AFE0 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_686B +ENCODING 26731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2280 +F8C0 +25A0 +7280 +6AA0 +A420 +AC40 +2480 +2500 +2600 +ENDCHAR +STARTCHAR U_686C +ENCODING 26732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +AA80 +4A40 +3280 +CF00 +5400 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_686D +ENCODING 26733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FDC0 +2400 +67E0 +7580 +ADA0 +A540 +2540 +29A0 +3120 +ENDCHAR +STARTCHAR U_686E +ENCODING 26734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +F980 +2340 +6520 +7100 +AFE0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_686F +ENCODING 26735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2000 +37E0 +6900 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6870 +ENCODING 26736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +FD00 +27E0 +6480 +75A0 +A660 +2000 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_6871 +ENCODING 26737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FD40 +2A80 +2540 +3540 +6FC0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6872 +ENCODING 26738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +2FE0 +6820 +77C0 +A880 +AFE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_6873 +ENCODING 26739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2440 +FFE0 +2100 +6FE0 +7280 +A540 +A920 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_6874 +ENCODING 26740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +FD40 +2280 +77C0 +6880 +A100 +AFE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_6875 +ENCODING 26741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +FD20 +22C0 +7100 +6FE0 +A140 +A240 +2280 +2140 +2620 +ENDCHAR +STARTCHAR U_6876 +ENCODING 26742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +F980 +27E0 +6520 +77E0 +AD20 +A7E0 +2520 +2520 +2460 +ENDCHAR +STARTCHAR U_6877 +ENCODING 26743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FE0 +6520 +77E0 +AD20 +A7E0 +2520 +2920 +3160 +ENDCHAR +STARTCHAR U_6878 +ENCODING 26744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +F660 +2900 +2FE0 +3480 +6FE0 +B4A0 +24A0 +24E0 +2080 +ENDCHAR +STARTCHAR U_6879 +ENCODING 26745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +6440 +77C0 +AD20 +A540 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_687A +ENCODING 26746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F280 +2EE0 +6AA0 +7AA0 +AEE0 +2280 +2280 +2480 +2880 +ENDCHAR +STARTCHAR U_687B +ENCODING 26747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2C40 +F380 +2C60 +7100 +6FE0 +A100 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_687C +ENCODING 26748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +CE60 +3580 +C4E0 +1500 +0E00 +3580 +CC60 +ENDCHAR +STARTCHAR U_687D +ENCODING 26749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C060 +2480 +5540 +8620 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_687E +ENCODING 26750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +FFE0 +2140 +77C0 +6A00 +A7C0 +AA40 +3240 +23C0 +2240 +ENDCHAR +STARTCHAR U_687F +ENCODING 26751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6800 +A7C0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6880 +ENCODING 26752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +6520 +77E0 +A900 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_6881 +ENCODING 26753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +A280 +4AC0 +2AA0 +D4A0 +4980 +5400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6882 +ENCODING 26754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +FFE0 +2120 +2940 +3580 +6B40 +A540 +2920 +2120 +2300 +ENDCHAR +STARTCHAR U_6883 +ENCODING 26755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +23C0 +FA40 +2440 +2FE0 +3240 +6A40 +ABE0 +2400 +2A00 +31E0 +ENDCHAR +STARTCHAR U_6884 +ENCODING 26756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6AA0 +7C60 +A820 +AFE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_6885 +ENCODING 26757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +27C0 +7540 +6FE0 +A540 +A540 +27E0 +2040 +2180 +ENDCHAR +STARTCHAR U_6886 +ENCODING 26758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +FFA0 +24A0 +6FC0 +74A0 +AFA0 +A4A0 +24E0 +2880 +3080 +ENDCHAR +STARTCHAR U_6887 +ENCODING 26759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFC0 +2100 +2FE0 +3240 +6FE0 +A240 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_6888 +ENCODING 26760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F800 +27C0 +7440 +6FC0 +A000 +AFC0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_6889 +ENCODING 26761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2A40 +FA40 +2E40 +23E0 +3240 +6E40 +AA40 +2A40 +2A40 +32E0 +ENDCHAR +STARTCHAR U_688A +ENCODING 26762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2400 +F7E0 +2480 +E880 +0480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_688B +ENCODING 26763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2000 +27E0 +3420 +6FE0 +A420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_688C +ENCODING 26764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2820 +27C0 +7100 +6FE0 +A100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_688D +ENCODING 26765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F840 +2FC0 +7840 +6FC0 +A200 +23E0 +2E00 +2220 +21E0 +ENDCHAR +STARTCHAR U_688E +ENCODING 26766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +7440 +6FC0 +A400 +24C0 +2720 +2420 +23E0 +ENDCHAR +STARTCHAR U_688F +ENCODING 26767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +F7E0 +2880 +77E0 +6800 +A7E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_6890 +ENCODING 26768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +FFC0 +2480 +75A0 +6E60 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6891 +ENCODING 26769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +2480 +F8A0 +25A0 +26C0 +3480 +6C80 +B480 +24C0 +3520 +2A20 +ENDCHAR +STARTCHAR U_6892 +ENCODING 26770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F280 +2D60 +67C0 +7080 +A100 +A7C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_6893 +ENCODING 26771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +7280 +6FE0 +A100 +A100 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_6894 +ENCODING 26772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +FC00 +27E0 +2400 +37C0 +6D40 +A7C0 +2400 +2C20 +33E0 +ENDCHAR +STARTCHAR U_6895 +ENCODING 26773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +2520 +7520 +6AA0 +A440 +2120 +2AA0 +2A40 +21C0 +ENDCHAR +STARTCHAR U_6896 +ENCODING 26774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +2440 +37C0 +6C40 +A7C0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6897 +ENCODING 26775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2520 +77E0 +6D20 +A7E0 +A100 +2500 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6898 +ENCODING 26776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6C40 +A7C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6899 +ENCODING 26777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +27C0 +7100 +6FE0 +A920 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_689A +ENCODING 26778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F480 +2FC0 +7540 +6D40 +A7C0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_689B +ENCODING 26779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4AA0 +EAA0 +5EA0 +4AC0 +6AA0 +DEA0 +4AA0 +4AE0 +5280 +6480 +ENDCHAR +STARTCHAR U_689C +ENCODING 26780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2540 +2540 +3BA0 +6920 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_689D +ENCODING 26781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5A40 +5180 +DE60 +5100 +5FE0 +5100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_689E +ENCODING 26782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2400 +7440 +6BC0 +A200 +2540 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_689F +ENCODING 26783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7FE0 +4000 +7FE0 +0420 +FFE0 +1520 +2480 +C460 +ENDCHAR +STARTCHAR U_68A0 +ENCODING 26784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +6000 +7000 +AFE0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_68A1 +ENCODING 26785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +23C0 +7000 +6FE0 +A280 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_68A2 +ENCODING 26786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +F900 +27E0 +6420 +77E0 +AC20 +A7E0 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_68A3 +ENCODING 26787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2520 +FFE0 +2100 +2280 +3540 +6920 +A7C0 +2040 +2080 +2100 +ENDCHAR +STARTCHAR U_68A4 +ENCODING 26788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +2520 +FFE0 +2280 +7440 +6FE0 +A240 +A240 +2540 +2880 +ENDCHAR +STARTCHAR U_68A5 +ENCODING 26789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2880 +5140 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68A6 +ENCODING 26790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FBE0 +1080 +39C0 +D6A0 +0800 +0FC0 +7080 +0D00 +0600 +7800 +ENDCHAR +STARTCHAR U_68A7 +ENCODING 26791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFC0 +2240 +6240 +77E0 +A800 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_68A8 +ENCODING 26792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F940 +1140 +FF40 +5540 +92C0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68A9 +ENCODING 26793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F540 +27C0 +7540 +6FC0 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_68AA +ENCODING 26794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +F800 +27C0 +7440 +6C40 +A7C0 +A000 +2440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_68AB +ENCODING 26795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FFC0 +2040 +6FE0 +7820 +A7C0 +A440 +2380 +2280 +2C60 +ENDCHAR +STARTCHAR U_68AC +ENCODING 26796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FD40 +27C0 +7540 +6FE0 +A200 +A7C0 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_68AD +ENCODING 26797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +FFE0 +2240 +7420 +6A00 +A3C0 +A640 +2980 +2240 +2C20 +ENDCHAR +STARTCHAR U_68AE +ENCODING 26798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2400 +77E0 +6C20 +A7A0 +A6A0 +2BA0 +2820 +30C0 +ENDCHAR +STARTCHAR U_68AF +ENCODING 26799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +27C0 +F940 +27C0 +7500 +6FE0 +A320 +2520 +29C0 +2100 +ENDCHAR +STARTCHAR U_68B0 +ENCODING 26800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +2AA0 +3AA0 +6FA0 +AAC0 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_68B1 +ENCODING 26801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +2920 +3920 +6BA0 +AD60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_68B2 +ENCODING 26802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +FFE0 +2440 +6440 +77C0 +AA80 +A280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_68B3 +ENCODING 26803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +2440 +77E0 +6800 +A540 +A540 +2540 +2960 +3020 +ENDCHAR +STARTCHAR U_68B4 +ENCODING 26804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C20 +45C0 +F840 +4960 +6D40 +5540 +C940 +5940 +4BE0 +5400 +63E0 +ENDCHAR +STARTCHAR U_68B5 +ENCODING 26805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +71C0 +AAA0 +2480 +1F00 +1100 +1920 +2520 +C0E0 +ENDCHAR +STARTCHAR U_68B6 +ENCODING 26806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2400 +67C0 +7500 +A7C0 +2500 +27E0 +2920 +28E0 +ENDCHAR +STARTCHAR U_68B7 +ENCODING 26807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3A20 +2140 +F880 +8940 +FA20 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68B8 +ENCODING 26808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +26A0 +FAA0 +2FA0 +72A0 +66A0 +ABA0 +32A0 +2220 +22A0 +2240 +ENDCHAR +STARTCHAR U_68B9 +ENCODING 26809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +F400 +27C0 +7480 +6480 +BFE0 +2000 +2480 +2860 +3020 +ENDCHAR +STARTCHAR U_68BA +ENCODING 26810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +7180 +6AC0 +A4A0 +FFE0 +0400 +0500 +04C0 +0440 +0400 +ENDCHAR +STARTCHAR U_68BB +ENCODING 26811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2680 +2A80 +FFE0 +2AA0 +6FE0 +7A80 +AFE0 +2AA0 +2AA0 +2AE0 +2C80 +ENDCHAR +STARTCHAR U_68BC +ENCODING 26812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27E0 +7100 +6FE0 +A240 +A7E0 +2940 +3040 +20C0 +ENDCHAR +STARTCHAR U_68BD +ENCODING 26813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FFE0 +2100 +77E0 +6800 +A200 +2540 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_68BE +ENCODING 26814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +F200 +2A80 +7700 +7FE0 +A200 +2700 +2A80 +3260 +2200 +ENDCHAR +STARTCHAR U_68BF +ENCODING 26815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F900 +2A80 +67E0 +7880 +A880 +2FE0 +2880 +2880 +37E0 +ENDCHAR +STARTCHAR U_68C0 +ENCODING 26816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2820 +27C0 +7000 +6920 +A4A0 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_68C1 +ENCODING 26817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2440 +7440 +6FC0 +A280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_68C2 +ENCODING 26818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +FBE0 +2020 +77E0 +6900 +A520 +A940 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_68C3 +ENCODING 26819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FEA0 +38A0 +5520 +9260 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68C4 +ENCODING 26820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +7FC0 +2480 +FFE0 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68C5 +ENCODING 26821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2200 +FFE0 +2240 +6FE0 +7240 +AFC0 +2700 +2A80 +3260 +2200 +ENDCHAR +STARTCHAR U_68C6 +ENCODING 26822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2BA0 +2000 +3FE0 +6AA0 +AFE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_68C7 +ENCODING 26823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FC40 +2520 +2100 +3240 +6FA0 +A140 +2AA0 +2A20 +33C0 +ENDCHAR +STARTCHAR U_68C8 +ENCODING 26824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +7100 +6FE0 +A440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_68C9 +ENCODING 26825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +7440 +6FC0 +A100 +AFE0 +2920 +2960 +2100 +ENDCHAR +STARTCHAR U_68CA +ENCODING 26826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +1F00 +1100 +FFE0 +2480 +7FC0 +9520 +2480 +4440 +ENDCHAR +STARTCHAR U_68CB +ENCODING 26827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +23C0 +2240 +33C0 +6A40 +AFE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_68CC +ENCODING 26828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +F920 +24C0 +2000 +3100 +6FE0 +A100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_68CD +ENCODING 26829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +3000 +6CA0 +A7C0 +24A0 +27A0 +2460 +ENDCHAR +STARTCHAR U_68CE +ENCODING 26830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FA40 +2420 +7100 +6FE0 +A100 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_68CF +ENCODING 26831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77E0 +6840 +AFE0 +A040 +2440 +2240 +20C0 +ENDCHAR +STARTCHAR U_68D0 +ENCODING 26832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +FBE0 +0A00 +FBE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68D1 +ENCODING 26833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FEE0 +2280 +7280 +6EE0 +A280 +A280 +2EE0 +2280 +2280 +ENDCHAR +STARTCHAR U_68D2 +ENCODING 26834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +7200 +6FE0 +A540 +ABA0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_68D3 +ENCODING 26835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +6280 +77E0 +A800 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_68D4 +ENCODING 26836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2480 +26A0 +3460 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_68D5 +ENCODING 26837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +2000 +37E0 +6900 +A540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_68D6 +ENCODING 26838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +FFC0 +2400 +27C0 +3400 +6FE0 +A540 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_68D7 +ENCODING 26839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +2E80 +1500 +2480 +FFE0 +2480 +2E80 +1500 +E4E0 +ENDCHAR +STARTCHAR U_68D8 +ENCODING 26840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +AAA0 +AAA0 +BAE0 +2080 +71C0 +AAA0 +2080 +ENDCHAR +STARTCHAR U_68D9 +ENCODING 26841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +27E0 +3500 +6D40 +67E0 +A500 +2980 +2A40 +3420 +ENDCHAR +STARTCHAR U_68DA +ENCODING 26842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +2EE0 +2AA0 +3AA0 +6EE0 +AAA0 +2AA0 +32A0 +2560 +ENDCHAR +STARTCHAR U_68DB +ENCODING 26843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F200 +2440 +6FE0 +7440 +AFC0 +2440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_68DC +ENCODING 26844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2440 +FEA0 +2520 +2E20 +3A80 +6A60 +AA20 +2A80 +3260 +2420 +ENDCHAR +STARTCHAR U_68DD +ENCODING 26845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F920 +2FE0 +3920 +6BA0 +AAA0 +ABA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_68DE +ENCODING 26846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28A0 +FB20 +2920 +3FE0 +6920 +ABA0 +AD60 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_68DF +ENCODING 26847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +2540 +37C0 +6D40 +A7C0 +2340 +2520 +2920 +ENDCHAR +STARTCHAR U_68E0 +ENCODING 26848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2480 +FFE0 +8020 +3F80 +2080 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_68E1 +ENCODING 26849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2920 +2FE0 +3920 +6D60 +AD60 +2FE0 +2820 +2860 +ENDCHAR +STARTCHAR U_68E2 +ENCODING 26850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FAA0 +2FE0 +7920 +6FE0 +AA20 +2A20 +2BE0 +2820 +2860 +ENDCHAR +STARTCHAR U_68E3 +ENCODING 26851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +2140 +37C0 +6920 +A540 +2380 +2540 +2B20 +ENDCHAR +STARTCHAR U_68E4 +ENCODING 26852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +2280 +6FE0 +7000 +AFC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_68E5 +ENCODING 26853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2A80 +F5E0 +2480 +6BC0 +7AA0 +A4A0 +2A80 +2280 +2080 +2080 +ENDCHAR +STARTCHAR U_68E6 +ENCODING 26854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F880 +27C0 +7140 +6FE0 +A140 +A7C0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_68E7 +ENCODING 26855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +F940 +21A0 +2660 +3280 +6BE0 +AE40 +22A0 +21A0 +2E60 +ENDCHAR +STARTCHAR U_68E8 +ENCODING 26856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +4620 +7D40 +4080 +8360 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68E9 +ENCODING 26857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +2AA0 +FAA0 +2EE0 +6820 +7FE0 +A820 +AEE0 +2AA0 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_68EA +ENCODING 26858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2540 +F580 +2980 +2240 +3520 +6D40 +A580 +2980 +2240 +2C20 +ENDCHAR +STARTCHAR U_68EB +ENCODING 26859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2080 +3EA0 +2AA0 +6EC0 +A080 +26A0 +3960 +2620 +ENDCHAR +STARTCHAR U_68EC +ENCODING 26860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2200 +2FE0 +3440 +6FA0 +B480 +25A0 +2420 +23E0 +ENDCHAR +STARTCHAR U_68ED +ENCODING 26861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F500 +25E0 +6920 +7AA0 +AE40 +A940 +2880 +2940 +2E20 +ENDCHAR +STARTCHAR U_68EE +ENCODING 26862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +1100 +FFE0 +3180 +5B40 +9520 +1100 +ENDCHAR +STARTCHAR U_68EF +ENCODING 26863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +28A0 +27C0 +3040 +6880 +A340 +2AA0 +2A40 +31C0 +ENDCHAR +STARTCHAR U_68F0 +ENCODING 26864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2540 +7540 +6FE0 +A540 +A540 +2FE0 +2100 +27C0 +ENDCHAR +STARTCHAR U_68F1 +ENCODING 26865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2440 +3A20 +6BC0 +A680 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_68F2 +ENCODING 26866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F140 +2FE0 +6140 +77C0 +A100 +AFE0 +2240 +2380 +2C60 +ENDCHAR +STARTCHAR U_68F3 +ENCODING 26867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +F440 +2AA0 +2100 +37E0 +6AA0 +A2A0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_68F4 +ENCODING 26868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAE0 +2E80 +6AE0 +7AA0 +AEA0 +AAA0 +2AC0 +2AC0 +36A0 +ENDCHAR +STARTCHAR U_68F5 +ENCODING 26869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +2520 +27E0 +3100 +6FE0 +A380 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_68F6 +ENCODING 26870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2540 +2540 +3BA0 +6900 +A380 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_68F7 +ENCODING 26871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2AE0 +FEA0 +2AA0 +2AA0 +3EA0 +6AA0 +ABA0 +3E40 +22A0 +2320 +ENDCHAR +STARTCHAR U_68F8 +ENCODING 26872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +7840 +4940 +7880 +4940 +FE20 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_68F9 +ENCODING 26873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +2440 +37C0 +6C40 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_68FA +ENCODING 26874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +2440 +37C0 +6C00 +A7E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_68FB +ENCODING 26875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +4940 +9320 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_68FC +ENCODING 26876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +3980 +56C0 +90A0 +1100 +2080 +7FC0 +88A0 +1080 +6300 +ENDCHAR +STARTCHAR U_68FD +ENCODING 26877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +3180 +5AC0 +94A0 +0A00 +1500 +E2E0 +1F80 +0100 +0200 +ENDCHAR +STARTCHAR U_68FE +ENCODING 26878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3B80 +D560 +1100 +FFE0 +8020 +1F00 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_68FF +ENCODING 26879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +24C0 +F440 +26C0 +7440 +6FC0 +A280 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_6900 +ENCODING 26880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2800 +6FC0 +6B40 +BB40 +A5C0 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_6901 +ENCODING 26881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F800 +23C0 +7240 +6BC0 +A080 +A100 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_6902 +ENCODING 26882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +77E0 +6900 +A560 +A380 +2540 +2960 +2300 +ENDCHAR +STARTCHAR U_6903 +ENCODING 26883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2200 +FFE0 +2A20 +7F80 +6A40 +6BC0 +A800 +2B80 +2AA0 +34E0 +ENDCHAR +STARTCHAR U_6904 +ENCODING 26884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +2280 +37E0 +6900 +AFE0 +2480 +2380 +3E60 +ENDCHAR +STARTCHAR U_6905 +ENCODING 26885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +2280 +77E0 +6840 +A740 +A540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_6906 +ENCODING 26886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFA0 +2520 +27E0 +3420 +6FA0 +A6A0 +27A0 +2820 +30E0 +ENDCHAR +STARTCHAR U_6907 +ENCODING 26887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +67C0 +7440 +AFC0 +A440 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_6908 +ENCODING 26888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +F7E0 +2D60 +23A0 +37E0 +6920 +A3A0 +2560 +2920 +20C0 +ENDCHAR +STARTCHAR U_6909 +ENCODING 26889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +3BE0 +6A80 +13E0 +6480 +FFE0 +0E00 +3580 +C460 +ENDCHAR +STARTCHAR U_690A +ENCODING 26890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2440 +7640 +69A0 +A100 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_690B +ENCODING 26891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F800 +27C0 +2440 +37C0 +6900 +A540 +2920 +3120 +2300 +ENDCHAR +STARTCHAR U_690C +ENCODING 26892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +2240 +2420 +3000 +6FC0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_690D +ENCODING 26893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +37C0 +6C40 +A740 +25C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_690E +ENCODING 26894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FC80 +2480 +27E0 +3480 +6C80 +A7E0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_690F +ENCODING 26895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FA80 +26E0 +2420 +3420 +6C20 +A6E0 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6910 +ENCODING 26896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +24A0 +2480 +37E0 +6C80 +A7E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_6911 +ENCODING 26897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +27E0 +2520 +37E0 +6A80 +A480 +2FE0 +2080 +2080 +ENDCHAR +STARTCHAR U_6912 +ENCODING 26898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +24A0 +F7A0 +24A0 +2FA0 +34A0 +66A0 +ADA0 +3440 +24A0 +2D20 +ENDCHAR +STARTCHAR U_6913 +ENCODING 26899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FA20 +2D40 +2680 +3480 +6DC0 +A2A0 +24A0 +2CA0 +2300 +ENDCHAR +STARTCHAR U_6914 +ENCODING 26900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22A0 +FD40 +22A0 +22A0 +37E0 +6D20 +A7E0 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_6915 +ENCODING 26901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2A40 +FAE0 +2140 +2F40 +3540 +6DE0 +A560 +2540 +2940 +3340 +ENDCHAR +STARTCHAR U_6916 +ENCODING 26902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FC20 +27E0 +7480 +6FE0 +A500 +25E0 +2920 +2A20 +3460 +ENDCHAR +STARTCHAR U_6917 +ENCODING 26903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +2820 +2FE0 +3100 +6D00 +A5E0 +2500 +2B00 +31E0 +ENDCHAR +STARTCHAR U_6918 +ENCODING 26904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +3B80 +5540 +9920 +0400 +7FC0 +0300 +0C00 +7000 +8FE0 +ENDCHAR +STARTCHAR U_6919 +ENCODING 26905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6800 +AFE0 +A820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_691A +ENCODING 26906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6EE0 +7820 +A820 +A820 +2820 +28A0 +2840 +ENDCHAR +STARTCHAR U_691B +ENCODING 26907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +3200 +6A80 +64A0 +ACC0 +3480 +25A0 +24A0 +2460 +ENDCHAR +STARTCHAR U_691C +ENCODING 26908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +33A0 +6900 +67C0 +A540 +27C0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_691D +ENCODING 26909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F440 +2540 +F540 +52A0 +8CE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_691E +ENCODING 26910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE00 +3BE0 +5680 +9280 +1480 +FFE0 +0E00 +3580 +C460 +0400 +ENDCHAR +STARTCHAR U_691F +ENCODING 26911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +2420 +3B00 +6500 +AFE0 +2100 +2240 +2C20 +ENDCHAR +STARTCHAR U_6920 +ENCODING 26912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +5200 +FBE0 +1280 +FC80 +1480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6921 +ENCODING 26913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +5F20 +E4A0 +4AA0 +5FA0 +E4A0 +DFA0 +44A0 +4420 +4720 +5860 +ENDCHAR +STARTCHAR U_6922 +ENCODING 26914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +F820 +2FE0 +7920 +6FE0 +A9A0 +2960 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6923 +ENCODING 26915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +2AA0 +7FE0 +6AA0 +AAA0 +3FE0 +2000 +2440 +2820 +ENDCHAR +STARTCHAR U_6924 +ENCODING 26916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +2100 +33E0 +6E40 +A140 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_6925 +ENCODING 26917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +24E0 +F7A0 +2AA0 +2FA0 +72A0 +6AA0 +A2A0 +25A0 +28E0 +3000 +ENDCHAR +STARTCHAR U_6926 +ENCODING 26918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFE0 +3200 +6FE0 +6480 +AA40 +37A0 +2280 +2480 +2980 +ENDCHAR +STARTCHAR U_6927 +ENCODING 26919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC60 +33C0 +6800 +6EE0 +AAA0 +2AA0 +2EE0 +2080 +2080 +ENDCHAR +STARTCHAR U_6928 +ENCODING 26920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +F900 +4A40 +6FE0 +DA40 +4B40 +4AC0 +4A40 +4A40 +52C0 +ENDCHAR +STARTCHAR U_6929 +ENCODING 26921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F900 +2FC0 +7940 +6FE0 +A940 +2FC0 +2900 +3280 +2460 +ENDCHAR +STARTCHAR U_692A +ENCODING 26922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +F280 +2FE0 +2280 +3AA0 +6AA0 +A6C0 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_692B +ENCODING 26923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +F7C0 +2540 +77C0 +6D40 +A7C0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_692C +ENCODING 26924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +7440 +6FC0 +A440 +A7C0 +2440 +2440 +3FE0 +ENDCHAR +STARTCHAR U_692D +ENCODING 26925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FA80 +2DE0 +2AA0 +3AE0 +6AA0 +AEE0 +28A0 +28A0 +28E0 +ENDCHAR +STARTCHAR U_692E +ENCODING 26926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4F80 +E200 +5FE0 +6500 +CA80 +D560 +C200 +4C80 +4300 +5C00 +ENDCHAR +STARTCHAR U_692F +ENCODING 26927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +2FE0 +3100 +6FE0 +AAA0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_6930 +ENCODING 26928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEA0 +2AA0 +2AC0 +3EA0 +6AA0 +AAA0 +2FE0 +2280 +2280 +ENDCHAR +STARTCHAR U_6931 +ENCODING 26929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +F800 +23C0 +7240 +6BC0 +A240 +23C0 +2640 +2980 +2660 +ENDCHAR +STARTCHAR U_6932 +ENCODING 26930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F240 +2FE0 +2440 +37C0 +6900 +AFE0 +2500 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6933 +ENCODING 26931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +2540 +27C0 +3000 +6FE0 +A520 +2540 +2680 +2C60 +ENDCHAR +STARTCHAR U_6934 +ENCODING 26932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +FF40 +2860 +29C0 +3F40 +6940 +A940 +3E80 +2940 +2A20 +ENDCHAR +STARTCHAR U_6935 +ENCODING 26933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A20 +FEE0 +2800 +2EE0 +38A0 +68A0 +AEA0 +2840 +28A0 +2920 +ENDCHAR +STARTCHAR U_6936 +ENCODING 26934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2920 +FAA0 +2FE0 +7440 +6A20 +B7E0 +2A40 +2180 +2280 +2C60 +ENDCHAR +STARTCHAR U_6937 +ENCODING 26935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2880 +2FA0 +38A0 +6EA0 +AAC0 +2EA0 +3160 +2220 +ENDCHAR +STARTCHAR U_6938 +ENCODING 26936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2500 +2FE0 +FA80 +2EA0 +3AE0 +6BA0 +AAE0 +2A80 +3220 +25E0 +ENDCHAR +STARTCHAR U_6939 +ENCODING 26937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +FA40 +23C0 +2240 +33C0 +6A40 +AFE0 +2540 +2620 +27E0 +ENDCHAR +STARTCHAR U_693A +ENCODING 26938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2BC0 +FA40 +2BC0 +3900 +6FE0 +6900 +AB80 +2D40 +2920 +2900 +ENDCHAR +STARTCHAR U_693B +ENCODING 26939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FDE0 +2520 +25E0 +3480 +6FE0 +A540 +24C0 +2520 +27E0 +ENDCHAR +STARTCHAR U_693C +ENCODING 26940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +2900 +F000 +26E0 +2940 +3940 +6940 +AE40 +2A40 +2A40 +2AC0 +ENDCHAR +STARTCHAR U_693D +ENCODING 26941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2280 +F780 +2080 +6FE0 +7520 +AAC0 +A580 +2AC0 +24A0 +2980 +ENDCHAR +STARTCHAR U_693E +ENCODING 26942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F000 +2E20 +7AA0 +6EA0 +6AA0 +AEA0 +2AA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_693F +ENCODING 26943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +3200 +6FE0 +6440 +AFE0 +2540 +24C0 +27C0 +ENDCHAR +STARTCHAR U_6940 +ENCODING 26944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +27C0 +3540 +2FC0 +6100 +AFE0 +29A0 +2F60 +2860 +ENDCHAR +STARTCHAR U_6941 +ENCODING 26945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA20 +23C0 +3240 +2D80 +6240 +AFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6942 +ENCODING 26946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD40 +2920 +37C0 +2C40 +67C0 +A440 +27C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6943 +ENCODING 26947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +FFC0 +6800 +7FC0 +AA80 +AFC0 +2900 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_6944 +ENCODING 26948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +3800 +2FE0 +6AA0 +AFE0 +2AA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_6945 +ENCODING 26949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +FBC0 +2240 +33C0 +2800 +67E0 +A520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_6946 +ENCODING 26950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +6FE0 +7100 +AFE0 +2240 +2680 +2140 +2E20 +ENDCHAR +STARTCHAR U_6947 +ENCODING 26951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FF40 +2540 +7FE0 +6820 +ABA0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_6948 +ENCODING 26952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +F5C0 +2D00 +37E0 +2C40 +67C0 +A440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_6949 +ENCODING 26953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2100 +37E0 +2A00 +67E0 +AA20 +3220 +23E0 +2220 +ENDCHAR +STARTCHAR U_694A +ENCODING 26954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +37E0 +2C00 +67E0 +AAA0 +22A0 +2520 +22C0 +ENDCHAR +STARTCHAR U_694B +ENCODING 26955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2F20 +F2A0 +2FA0 +2AA0 +3FA0 +62A0 +A6A0 +2B20 +32A0 +2260 +ENDCHAR +STARTCHAR U_694C +ENCODING 26956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +27E0 +3440 +2C80 +6720 +A4C0 +2720 +28C0 +3300 +ENDCHAR +STARTCHAR U_694D +ENCODING 26957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0E00 +1500 +E4E0 +0000 +EEE0 +AAA0 +AAA0 +AAA0 +EEE0 +ENDCHAR +STARTCHAR U_694E +ENCODING 26958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +F100 +2FE0 +3540 +2FC0 +6540 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_694F +ENCODING 26959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +2520 +33C0 +2900 +6FE0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6950 +ENCODING 26960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2A40 +FFC0 +2A40 +6FC0 +7300 +ACE0 +3480 +2480 +2480 +2880 +ENDCHAR +STARTCHAR U_6951 +ENCODING 26961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EA0 +2B40 +F680 +2240 +3420 +2FC0 +6100 +AFE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6952 +ENCODING 26962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +FFE0 +2520 +37E0 +2C20 +6100 +A2C0 +2A20 +3A60 +21C0 +ENDCHAR +STARTCHAR U_6953 +ENCODING 26963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +24C0 +FD40 +27C0 +3540 +2D40 +67C0 +A540 +2540 +2920 +33A0 +ENDCHAR +STARTCHAR U_6954 +ENCODING 26964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2EA0 +F4A0 +2EA0 +24A0 +3F20 +6440 +AFE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6955 +ENCODING 26965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F400 +37C0 +6900 +7FE0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6956 +ENCODING 26966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEA0 +2AA0 +2EA0 +3AA0 +68A0 +AAA0 +2AE0 +2D80 +2880 +ENDCHAR +STARTCHAR U_6957 +ENCODING 26967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +25E0 +F4A0 +2BE0 +3CA0 +27E0 +7480 +AFE0 +2480 +2A80 +31E0 +ENDCHAR +STARTCHAR U_6958 +ENCODING 26968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +3480 +5140 +B220 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6959 +ENCODING 26969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2A80 +F5E0 +2F80 +2580 +34C0 +6DA0 +B6A0 +2480 +2480 +2C80 +ENDCHAR +STARTCHAR U_695A +ENCODING 26970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +39C0 +56A0 +9080 +7FE0 +1220 +13C0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_695B +ENCODING 26971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +2100 +37E0 +2900 +67C0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_695C +ENCODING 26972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +FFA0 +24E0 +34A0 +6EA0 +AAE0 +2AA0 +2EA0 +2120 +2260 +ENDCHAR +STARTCHAR U_695D +ENCODING 26973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2AA0 +3920 +6FE0 +A100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_695E +ENCODING 26974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +7100 +6FE0 +A200 +A3E0 +2220 +24A0 +2840 +ENDCHAR +STARTCHAR U_695F +ENCODING 26975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +23C0 +6000 +77E0 +A820 +A7E0 +2080 +2080 +2180 +ENDCHAR +STARTCHAR U_6960 +ENCODING 26976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +2AA0 +3920 +6FE0 +A920 +2FE0 +2920 +2860 +ENDCHAR +STARTCHAR U_6961 +ENCODING 26977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +7000 +6EA0 +AAA0 +2F40 +2B40 +2EA0 +2AA0 +ENDCHAR +STARTCHAR U_6962 +ENCODING 26978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +2FE0 +3AA0 +6CE0 +A820 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6963 +ENCODING 26979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2800 +2BE0 +3A20 +6BE0 +AA20 +2BE0 +3220 +23E0 +ENDCHAR +STARTCHAR U_6964 +ENCODING 26980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +FAA0 +34A0 +2920 +62A0 +6440 +B240 +3520 +2460 +23C0 +ENDCHAR +STARTCHAR U_6965 +ENCODING 26981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +FCA0 +27E0 +2100 +37E0 +6A00 +A3E0 +2520 +28C0 +3320 +ENDCHAR +STARTCHAR U_6966 +ENCODING 26982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +2000 +37E0 +2A40 +63C0 +A240 +23C0 +2000 +2FE0 +ENDCHAR +STARTCHAR U_6967 +ENCODING 26983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2200 +2FC0 +7A40 +6A40 +BFE0 +2500 +2880 +3060 +ENDCHAR +STARTCHAR U_6968 +ENCODING 26984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +2440 +37C0 +6C40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6969 +ENCODING 26985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FBE0 +2AA0 +2BE0 +3AA0 +6BE0 +AA80 +2900 +2A80 +2C60 +ENDCHAR +STARTCHAR U_696A +ENCODING 26986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +27E0 +FD40 +25C0 +3400 +2FE0 +6100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_696B +ENCODING 26987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +2FE0 +2440 +37C0 +6C40 +A7C0 +2460 +2FC0 +2040 +ENDCHAR +STARTCHAR U_696C +ENCODING 26988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +37C0 +2A00 +67E0 +ACA0 +2560 +27A0 +20C0 +ENDCHAR +STARTCHAR U_696D +ENCODING 26989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_696E +ENCODING 26990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +F940 +2FE0 +3100 +2FC0 +6440 +AFC0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_696F +ENCODING 26991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2480 +FFE0 +2480 +35E0 +2D20 +65E0 +A520 +25E0 +2920 +31E0 +ENDCHAR +STARTCHAR U_6970 +ENCODING 26992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2D60 +F920 +2FE0 +2920 +3FE0 +6920 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6971 +ENCODING 26993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFC0 +2200 +37E0 +2C40 +6BA0 +A100 +27C0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6972 +ENCODING 26994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +40A0 +FFE0 +5680 +74A0 +DFA0 +54A0 +5AC0 +54A0 +6B60 +4220 +ENDCHAR +STARTCHAR U_6973 +ENCODING 26995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F440 +27C0 +7440 +6FC0 +A100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_6974 +ENCODING 26996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +3FE0 +2920 +67C0 +A540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_6975 +ENCODING 26997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4080 +E100 +5DE0 +7520 +55A0 +DD40 +55A0 +4120 +4200 +4FE0 +ENDCHAR +STARTCHAR U_6976 +ENCODING 26998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +D320 +4CC0 +3F80 +2080 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6977 +ENCODING 26999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26A0 +FCC0 +26A0 +64E0 +7900 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6978 +ENCODING 27000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2440 +F540 +2F60 +3540 +2640 +6D40 +B4A0 +24A0 +2520 +2620 +ENDCHAR +STARTCHAR U_6979 +ENCODING 27001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2480 +F5E0 +27A0 +74A0 +6B20 +B4C0 +A000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_697A +ENCODING 27002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +FFE0 +21A0 +32C0 +2D80 +6100 +AFE0 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_697B +ENCODING 27003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +7440 +6FE0 +A100 +A7C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_697C +ENCODING 27004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +F100 +2FE0 +7540 +6920 +A100 +2FE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_697D +ENCODING 27005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +9F20 +5140 +3F80 +5140 +9F20 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_697E +ENCODING 27006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +7440 +6FC0 +A100 +2D60 +2580 +2960 +2300 +ENDCHAR +STARTCHAR U_697F +ENCODING 27007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2380 +7D40 +6920 +A7C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6980 +ENCODING 27008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FC40 +27C0 +2000 +3EE0 +6AA0 +AAA0 +2AA0 +2EE0 +2AA0 +ENDCHAR +STARTCHAR U_6981 +ENCODING 27009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F820 +27C0 +7200 +6480 +AFC0 +2240 +2F80 +2200 +3FE0 +ENDCHAR +STARTCHAR U_6982 +ENCODING 27010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A40 +FE40 +2B40 +2FE0 +3A40 +6C40 +AAC0 +2D40 +2A40 +2460 +ENDCHAR +STARTCHAR U_6983 +ENCODING 27011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +71C0 +AAA0 +A4A0 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_6984 +ENCODING 27012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +FB40 +2A20 +27C0 +3440 +6D40 +A540 +25C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6985 +ENCODING 27013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F440 +47C0 +6440 +D7C0 +D000 +4FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6986 +ENCODING 27014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +FB60 +2000 +6E20 +7AA0 +AEA0 +AAA0 +2EA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_6987 +ENCODING 27015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2280 +2FE0 +3100 +6FC0 +A100 +2540 +2920 +3320 +ENDCHAR +STARTCHAR U_6988 +ENCODING 27016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2420 +F820 +2BA0 +6AA0 +7BA0 +A820 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6989 +ENCODING 27017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2280 +3540 +2920 +67C0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_698A +ENCODING 27018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4480 +FFE0 +6AA0 +5FE0 +DAA0 +6BE0 +4880 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_698B +ENCODING 27019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +2040 +77C0 +6800 +AEE0 +2220 +2EE0 +2220 +2EE0 +ENDCHAR +STARTCHAR U_698C +ENCODING 27020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2F40 +F180 +2540 +7AC0 +6A00 +BFA0 +2AC0 +2AA0 +2A40 +3220 +ENDCHAR +STARTCHAR U_698D +ENCODING 27021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2CA0 +2AC0 +3BE0 +6A20 +ABE0 +2A20 +2BE0 +3260 +ENDCHAR +STARTCHAR U_698E +ENCODING 27022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +FF40 +25C0 +3440 +2FC0 +6200 +A7E0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_698F +ENCODING 27023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2280 +7440 +6820 +AFE0 +AAA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6990 +ENCODING 27024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2540 +37E0 +2D40 +67E0 +AAA0 +2A40 +2B20 +3620 +ENDCHAR +STARTCHAR U_6991 +ENCODING 27025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +F540 +2FC0 +3540 +27C0 +6D40 +AFE0 +2440 +2240 +20C0 +ENDCHAR +STARTCHAR U_6992 +ENCODING 27026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +F220 +6EE0 +7880 +6EE0 +AAA0 +2660 +2AA0 +2220 +2440 +ENDCHAR +STARTCHAR U_6993 +ENCODING 27027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2280 +F740 +2A20 +3240 +2DC0 +6000 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6994 +ENCODING 27028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2EA0 +FAA0 +2EA0 +3AC0 +2EA0 +68A0 +AAA0 +2AE0 +3D80 +2080 +ENDCHAR +STARTCHAR U_6995 +ENCODING 27029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2440 +3380 +2C40 +6FE0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6996 +ENCODING 27030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA40 +8C20 +73C0 +2240 +FD40 +7080 +A940 +2620 +ENDCHAR +STARTCHAR U_6997 +ENCODING 27031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FAA0 +26C0 +2FE0 +3000 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6998 +ENCODING 27032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A00 +A3C0 +FA40 +23C0 +5200 +8BE0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6999 +ENCODING 27033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +2380 +3440 +2BA0 +6000 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_699A +ENCODING 27034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +37C0 +2900 +6FE0 +A000 +2540 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_699B +ENCODING 27035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +27C0 +7200 +6FE0 +A540 +2BA0 +2100 +2540 +2920 +ENDCHAR +STARTCHAR U_699C +ENCODING 27036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2920 +3080 +6FE0 +A200 +23C0 +2440 +39C0 +ENDCHAR +STARTCHAR U_699D +ENCODING 27037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55C0 +4940 +5540 +EA60 +5C00 +E9C0 +DD40 +5B40 +6880 +4940 +4A20 +ENDCHAR +STARTCHAR U_699E +ENCODING 27038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FDE0 +2520 +35E0 +2D20 +65E0 +A480 +29C0 +2AA0 +35A0 +ENDCHAR +STARTCHAR U_699F +ENCODING 27039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +3920 +6FC0 +6280 +6FE0 +A100 +27C0 +2100 +2100 +ENDCHAR +STARTCHAR U_69A0 +ENCODING 27040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFC0 +2440 +27C0 +3440 +6FC0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69A1 +ENCODING 27041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +F7C0 +2100 +2FE0 +3240 +6780 +A240 +2FA0 +2540 +3B20 +ENDCHAR +STARTCHAR U_69A2 +ENCODING 27042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F820 +37C0 +2A00 +6560 +6280 +ADC0 +22A0 +2C80 +2100 +ENDCHAR +STARTCHAR U_69A3 +ENCODING 27043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2700 +FD20 +22C0 +6400 +77E0 +A880 +AFE0 +2080 +24A0 +27E0 +ENDCHAR +STARTCHAR U_69A4 +ENCODING 27044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +F940 +25E0 +3240 +2D40 +6FE0 +A100 +2380 +2540 +3920 +ENDCHAR +STARTCHAR U_69A5 +ENCODING 27045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2420 +37E0 +2920 +6540 +AFE0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_69A6 +ENCODING 27046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +2140 +FE20 +8880 +FFE0 +8880 +F9C0 +22A0 +FCA0 +2080 +ENDCHAR +STARTCHAR U_69A7 +ENCODING 27047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +FD40 +2760 +3540 +2F60 +6540 +A760 +2540 +2540 +27E0 +ENDCHAR +STARTCHAR U_69A8 +ENCODING 27048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD20 +2240 +3520 +2BE0 +6500 +A9E0 +2100 +21E0 +2100 +ENDCHAR +STARTCHAR U_69A9 +ENCODING 27049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27E0 +3520 +2FE0 +6480 +A7E0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_69AA +ENCODING 27050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FFC0 +2480 +37C0 +2C80 +67E0 +A020 +2560 +2AA0 +2A60 +ENDCHAR +STARTCHAR U_69AB +ENCODING 27051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FC80 +27C0 +3480 +2FC0 +6480 +A7E0 +2080 +2FE0 +2080 +ENDCHAR +STARTCHAR U_69AC +ENCODING 27052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F900 +27E0 +3000 +2FC0 +6440 +A7C0 +26A0 +2A40 +2320 +ENDCHAR +STARTCHAR U_69AD +ENCODING 27053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2E40 +FBE0 +2E40 +3B40 +2EC0 +6A40 +BE40 +2A40 +3240 +26C0 +ENDCHAR +STARTCHAR U_69AE +ENCODING 27054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +54A0 +5AA0 +9080 +2940 +4620 +FFE0 +8420 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_69AF +ENCODING 27055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +FA80 +2BE0 +2E40 +3BE0 +6A40 +AF40 +2AC0 +2040 +20C0 +ENDCHAR +STARTCHAR U_69B0 +ENCODING 27056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +2140 +FFE0 +2240 +27A0 +3220 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_69B1 +ENCODING 27057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F800 +23C0 +3240 +2FE0 +6240 +A3C0 +26A0 +2B40 +2220 +ENDCHAR +STARTCHAR U_69B2 +ENCODING 27058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FEC0 +2440 +77C0 +6800 +AFE0 +AAA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_69B3 +ENCODING 27059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F800 +2EE0 +2A40 +3FE0 +6A40 +AA40 +2BE0 +3500 +28E0 +ENDCHAR +STARTCHAR U_69B4 +ENCODING 27060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +28A0 +FAA0 +2DA0 +3960 +2000 +6FE0 +A920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_69B5 +ENCODING 27061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +FA40 +2FE0 +3440 +2FC0 +6440 +A7C0 +2460 +2FC0 +2040 +ENDCHAR +STARTCHAR U_69B6 +ENCODING 27062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FD40 +27E0 +3540 +2FC0 +6500 +A7C0 +2A40 +2BC0 +3240 +ENDCHAR +STARTCHAR U_69B7 +ENCODING 27063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27E0 +3480 +2FC0 +7480 +A7C0 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_69B8 +ENCODING 27064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4BE0 +EAA0 +5FE0 +6AA0 +DAA0 +CBE0 +4880 +4FE0 +7080 +4FE0 +ENDCHAR +STARTCHAR U_69B9 +ENCODING 27065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +FCE0 +2480 +37E0 +2CA0 +67C0 +A4A0 +25E0 +2940 +3260 +ENDCHAR +STARTCHAR U_69BA +ENCODING 27066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5380 +5FE0 +7100 +5FE0 +5440 +7920 +57C0 +5380 +9540 +B920 +ENDCHAR +STARTCHAR U_69BB +ENCODING 27067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +77C0 +6800 +AEE0 +AAA0 +2660 +2AA0 +2660 +ENDCHAR +STARTCHAR U_69BC +ENCODING 27068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +3200 +2440 +6FA0 +A000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_69BD +ENCODING 27069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2520 +FAC0 +2240 +3780 +2940 +67A0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69BE +ENCODING 27070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F740 +2FE0 +6820 +77C0 +AC40 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_69BF +ENCODING 27071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +FFE0 +2000 +3FE0 +2800 +67C0 +A440 +27C0 +2280 +2FE0 +ENDCHAR +STARTCHAR U_69C0 +ENCODING 27072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +5140 +5F40 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_69C1 +ENCODING 27073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +27C0 +3000 +6FE0 +A820 +2BA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_69C2 +ENCODING 27074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C60 +4780 +F920 +4BC0 +48A0 +6FE0 +D880 +4AC0 +4AA0 +6CA0 +5980 +ENDCHAR +STARTCHAR U_69C3 +ENCODING 27075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +FA40 +AA60 +FC00 +ABE0 +A940 +9880 +0540 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69C4 +ENCODING 27076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +F820 +2540 +7200 +6CE0 +A420 +A6E0 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_69C5 +ENCODING 27077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +FFC0 +3000 +6FE0 +6CA0 +AAA0 +2FE0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_69C6 +ENCODING 27078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +3420 +2BA0 +62A0 +A3A0 +22A0 +23A0 +20C0 +ENDCHAR +STARTCHAR U_69C7 +ENCODING 27079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2400 +F7E0 +32C0 +2B40 +6AC0 +6BC0 +A800 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_69C8 +ENCODING 27080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2800 +FFE0 +2B40 +6A80 +7B60 +A840 +AFE0 +2A40 +2A40 +30C0 +ENDCHAR +STARTCHAR U_69C9 +ENCODING 27081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +F500 +2D00 +35E0 +2680 +6FE0 +B480 +2540 +2A20 +3420 +ENDCHAR +STARTCHAR U_69CA +ENCODING 27082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FD20 +11E0 +5520 +7DE0 +1220 +2460 +4400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69CB +ENCODING 27083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2FE0 +3480 +6FE0 +A940 +AFC0 +2940 +3FE0 +28C0 +ENDCHAR +STARTCHAR U_69CC +ENCODING 27084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +F520 +21E0 +3D00 +65E0 +A520 +25E0 +2520 +2A00 +31E0 +ENDCHAR +STARTCHAR U_69CD +ENCODING 27085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +2FE0 +3440 +27C0 +6440 +A7E0 +2C20 +3420 +27E0 +ENDCHAR +STARTCHAR U_69CE +ENCODING 27086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2100 +27C0 +3100 +6FE0 +A200 +27C0 +2880 +37E0 +ENDCHAR +STARTCHAR U_69CF +ENCODING 27087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F500 +2FC0 +2540 +3FE0 +6540 +AFC0 +2580 +2D40 +3520 +ENDCHAR +STARTCHAR U_69D0 +ENCODING 27088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2FC0 +3A40 +2FC0 +6240 +A3A0 +2560 +2920 +31E0 +ENDCHAR +STARTCHAR U_69D1 +ENCODING 27089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +1100 +FBE0 +3B80 +5540 +5920 +9100 +1100 +ENDCHAR +STARTCHAR U_69D2 +ENCODING 27090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2140 +77E0 +6800 +67E0 +A520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_69D3 +ENCODING 27091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +37C0 +6C40 +A7C0 +A440 +27C0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69D4 +ENCODING 27092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +2FC0 +2440 +3FE0 +6540 +A920 +37C0 +2100 +2100 +ENDCHAR +STARTCHAR U_69D5 +ENCODING 27093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +27C0 +7440 +6FC0 +A440 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_69D6 +ENCODING 27094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +8820 +3F80 +D080 +1080 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69D7 +ENCODING 27095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F400 +2FC0 +7440 +6FE0 +A820 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_69D8 +ENCODING 27096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +2FC0 +7100 +6FE0 +A100 +A540 +2380 +2D40 +2320 +ENDCHAR +STARTCHAR U_69D9 +ENCODING 27097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F900 +27C0 +3440 +2F40 +65C0 +A440 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_69DA +ENCODING 27098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +7FE0 +6800 +A7C0 +A540 +2540 +2280 +2C60 +ENDCHAR +STARTCHAR U_69DB +ENCODING 27099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2A80 +FAE0 +2A80 +2AC0 +3320 +6000 +AFE0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_69DC +ENCODING 27100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +27E0 +FC80 +37C0 +6C80 +67E0 +A400 +2FC0 +2260 +2420 +28C0 +ENDCHAR +STARTCHAR U_69DD +ENCODING 27101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F440 +27C0 +7440 +6FC0 +6400 +A7E0 +2AA0 +2FA0 +2060 +ENDCHAR +STARTCHAR U_69DE +ENCODING 27102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +7540 +6FC0 +A540 +27C0 +2100 +2120 +20E0 +ENDCHAR +STARTCHAR U_69DF +ENCODING 27103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +7400 +6FE0 +A480 +A480 +3FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_69E0 +ENCODING 27104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2BE0 +F4A0 +23E0 +6C80 +75E0 +A520 +A7E0 +2520 +21E0 +2120 +ENDCHAR +STARTCHAR U_69E1 +ENCODING 27105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2280 +F100 +2EE0 +7440 +6AA0 +A100 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_69E2 +ENCODING 27106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2220 +FAA0 +2660 +3AA0 +6920 +A7C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_69E3 +ENCODING 27107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +37C0 +2A80 +6440 +6FE0 +A540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_69E4 +ENCODING 27108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +27E0 +F2A0 +23E0 +2EA0 +37E0 +6C80 +A7E0 +2480 +2A80 +31E0 +ENDCHAR +STARTCHAR U_69E5 +ENCODING 27109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2440 +FEE0 +2440 +3EE0 +2440 +67E0 +A020 +27E0 +2020 +27E0 +ENDCHAR +STARTCHAR U_69E6 +ENCODING 27110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F940 +2FE0 +3940 +2FE0 +6D20 +AFE0 +2D20 +37E0 +2560 +ENDCHAR +STARTCHAR U_69E7 +ENCODING 27111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +5500 +7DE0 +5540 +FD40 +1240 +0400 +FFE0 +1480 +E460 +ENDCHAR +STARTCHAR U_69E8 +ENCODING 27112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2FA0 +FAA0 +2EC0 +30A0 +2FA0 +62A0 +A7A0 +3CE0 +2480 +2C80 +ENDCHAR +STARTCHAR U_69E9 +ENCODING 27113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +6A80 +5BE0 +7980 +52A0 +6CE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_69EA +ENCODING 27114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +FA40 +2E40 +7BE0 +6E40 +A840 +AEC0 +28C0 +2740 +2260 +ENDCHAR +STARTCHAR U_69EB +ENCODING 27115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +27C0 +7540 +6FC0 +A0A0 +AFE0 +2480 +2280 +2180 +ENDCHAR +STARTCHAR U_69EC +ENCODING 27116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +26A0 +FAA0 +2EA0 +22A0 +7EA0 +AAA0 +AEA0 +22A0 +32E0 +2DA0 +ENDCHAR +STARTCHAR U_69ED +ENCODING 27117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +FFE0 +2A80 +3B80 +6AA0 +AFA0 +2A40 +2F40 +2AA0 +3720 +ENDCHAR +STARTCHAR U_69EE +ENCODING 27118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +F7E0 +2AA0 +7FE0 +6A80 +A540 +AAA0 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_69EF +ENCODING 27119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +FFC0 +3280 +6FE0 +7C80 +A7C0 +2480 +27C0 +2480 +27E0 +ENDCHAR +STARTCHAR U_69F0 +ENCODING 27120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +F640 +2980 +7760 +7900 +ABC0 +2900 +2FE0 +2900 +37E0 +ENDCHAR +STARTCHAR U_69F1 +ENCODING 27121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +3CE0 +2820 +6FE0 +A820 +2FE0 +2540 +2AA0 +ENDCHAR +STARTCHAR U_69F2 +ENCODING 27122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +27A0 +FA60 +2FA0 +2AE0 +3FA0 +6AA0 +AFE0 +2AA0 +2AA0 +31A0 +ENDCHAR +STARTCHAR U_69F3 +ENCODING 27123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4B40 +7E80 +0940 +FFE0 +4940 +8A40 +FFE0 +1280 +2240 +C220 +ENDCHAR +STARTCHAR U_69F4 +ENCODING 27124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +2FE0 +2940 +3BE0 +6AA0 +ABE0 +2A00 +3220 +21E0 +ENDCHAR +STARTCHAR U_69F5 +ENCODING 27125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FA40 +2FC0 +2200 +6FC0 +6A40 +AFC0 +2220 +3540 +33C0 +ENDCHAR +STARTCHAR U_69F6 +ENCODING 27126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2960 +FFE0 +2920 +2EA0 +3AA0 +6EE0 +A8A0 +2F60 +2820 +2FE0 +ENDCHAR +STARTCHAR U_69F7 +ENCODING 27127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2140 +FF40 +69C0 +A540 +FA20 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69F8 +ENCODING 27128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +F5E0 +2FA0 +34A0 +6BA0 +A4E0 +AEA0 +24A0 +3F20 +2220 +ENDCHAR +STARTCHAR U_69F9 +ENCODING 27129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +F440 +27C0 +7440 +6FC0 +A540 +A380 +2540 +2FE0 +2100 +ENDCHAR +STARTCHAR U_69FA +ENCODING 27130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F940 +2FE0 +7940 +6FC0 +A900 +2D40 +2B80 +3560 +2B00 +ENDCHAR +STARTCHAR U_69FB +ENCODING 27131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FFE0 +2520 +6FE0 +7520 +ADE0 +A480 +2AA0 +31A0 +2260 +ENDCHAR +STARTCHAR U_69FC +ENCODING 27132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +FC40 +27C0 +5280 +8EE0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_69FD +ENCODING 27133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FAA0 +2FE0 +2AA0 +3FE0 +6440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_69FE +ENCODING 27134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +F7C0 +2440 +3FE0 +2AA0 +6AA0 +AFE0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_69FF +ENCODING 27135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2100 +27C0 +3540 +6FE0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A00 +ENCODING 27136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F240 +2FE0 +6920 +7FE0 +A920 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A01 +ENCODING 27137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +6280 +7440 +AEE0 +A440 +26C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6A02 +ENCODING 27138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6A03 +ENCODING 27139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2EE0 +FAA0 +2EA0 +7AE0 +6EA0 +A8E0 +2CA0 +2AA0 +2D20 +2260 +ENDCHAR +STARTCHAR U_6A04 +ENCODING 27140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FA80 +2DE0 +3AA0 +2BE0 +6AA0 +AFE0 +2880 +29C0 +2EA0 +ENDCHAR +STARTCHAR U_6A05 +ENCODING 27141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2940 +F6A0 +22A0 +3800 +2A80 +7AE0 +AA80 +2A80 +2D80 +28E0 +ENDCHAR +STARTCHAR U_6A06 +ENCODING 27142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +2AA0 +2FE0 +3100 +6FE0 +A920 +2AA0 +2F60 +2820 +ENDCHAR +STARTCHAR U_6A07 +ENCODING 27143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24E0 +F9A0 +2A40 +3AA0 +2AE0 +6AA0 +AAE0 +2AA0 +2AE0 +28A0 +ENDCHAR +STARTCHAR U_6A08 +ENCODING 27144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +6440 +77C0 +AC40 +A7C0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_6A09 +ENCODING 27145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2BA0 +3540 +2BA0 +6540 +AAA0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6A0A +ENCODING 27146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2440 +FBE0 +2A40 +74E0 +AB40 +2440 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_6A0B +ENCODING 27147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +2940 +F080 +63E0 +7AA0 +ABE0 +AAA0 +2BE0 +2AA0 +2800 +37E0 +ENDCHAR +STARTCHAR U_6A0C +ENCODING 27148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFE0 +2540 +77C0 +6C40 +A7C0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6A0D +ENCODING 27149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2100 +37E0 +6C40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A0E +ENCODING 27150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F420 +37C0 +6900 +7BC0 +6A40 +ABC0 +2A40 +2A40 +2BC0 +ENDCHAR +STARTCHAR U_6A0F +ENCODING 27151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +3FE0 +2240 +6F80 +A240 +2FA0 +2940 +3320 +ENDCHAR +STARTCHAR U_6A10 +ENCODING 27152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +F900 +2FE0 +6D60 +7AA0 +6D60 +AAA0 +2D60 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6A11 +ENCODING 27153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2540 +FB60 +2540 +7940 +6AC0 +A500 +AFE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_6A12 +ENCODING 27154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F940 +62A0 +7740 +6BC0 +AC00 +2100 +2940 +2940 +2FC0 +ENDCHAR +STARTCHAR U_6A13 +ENCODING 27155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2540 +FFE0 +2540 +3FE0 +6520 +AFE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_6A14 +ENCODING 27156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +F540 +27C0 +3540 +2FC0 +6540 +AFE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_6A15 +ENCODING 27157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F2A0 +2FA0 +2A40 +7FC0 +6A40 +A740 +2AC0 +32A0 +2320 +ENDCHAR +STARTCHAR U_6A16 +ENCODING 27158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +CE60 +3F80 +2080 +3FE0 +E040 +2740 +7540 +AF40 +20C0 +ENDCHAR +STARTCHAR U_6A17 +ENCODING 27159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +67C0 +7000 +AFE0 +A200 +27C0 +2040 +2180 +ENDCHAR +STARTCHAR U_6A18 +ENCODING 27160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2820 +27C0 +3440 +6FC0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A19 +ENCODING 27161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3000 +67C0 +A000 +2FE0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6A1A +ENCODING 27162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2FE0 +7AA0 +6FE0 +AA80 +ABE0 +2A80 +2AA0 +3360 +ENDCHAR +STARTCHAR U_6A1B +ENCODING 27163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +FB60 +25A0 +2320 +3CE0 +6640 +A180 +2620 +20C0 +2700 +ENDCHAR +STARTCHAR U_6A1C +ENCODING 27164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +6A40 +7FE0 +AA40 +AA40 +2BC0 +2800 +36A0 +2AA0 +ENDCHAR +STARTCHAR U_6A1D +ENCODING 27165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +2920 +2F80 +3920 +6BE0 +AA40 +2BC0 +2A40 +37E0 +ENDCHAR +STARTCHAR U_6A1E +ENCODING 27166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FBC0 +2A40 +2BC0 +3800 +6EE0 +AAA0 +2EE0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_6A1F +ENCODING 27167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F280 +2FE0 +3440 +6FC0 +A440 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A20 +ENCODING 27168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2380 +3100 +2FE0 +6920 +ADA0 +2B60 +2920 +2860 +ENDCHAR +STARTCHAR U_6A21 +ENCODING 27169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27C0 +3440 +6FC0 +6440 +AFE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_6A22 +ENCODING 27170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FC40 +27C0 +7440 +6FE0 +A400 +A7E0 +2020 +2AA0 +2AE0 +ENDCHAR +STARTCHAR U_6A23 +ENCODING 27171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +27C0 +7100 +6FE0 +A100 +AF20 +25C0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6A24 +ENCODING 27172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +49E0 +F340 +5480 +7560 +D680 +D5E0 +5480 +52C0 +54A0 +5180 +ENDCHAR +STARTCHAR U_6A25 +ENCODING 27173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +23C0 +6D40 +7380 +AD60 +A7C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A26 +ENCODING 27174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FC40 +2220 +2100 +37E0 +6900 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A27 +ENCODING 27175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2540 +FB40 +2560 +3600 +2FE0 +64A0 +AEA0 +3540 +24A0 +2520 +ENDCHAR +STARTCHAR U_6A28 +ENCODING 27176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +F7E0 +26A0 +35C0 +6EA0 +A480 +27E0 +2480 +2BE0 +3080 +ENDCHAR +STARTCHAR U_6A29 +ENCODING 27177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2900 +F7E0 +2200 +7480 +6FE0 +B480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_6A2A +ENCODING 27178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2100 +77C0 +6540 +A7C0 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A2B +ENCODING 27179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +54A0 +FEA0 +5240 +FE40 +D4A0 +DE20 +4100 +4FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6A2C +ENCODING 27180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +FD40 +25C0 +76C0 +6D40 +A7C0 +A240 +2520 +2C40 +33C0 +ENDCHAR +STARTCHAR U_6A2D +ENCODING 27181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2780 +7480 +6FE0 +A480 +A940 +37A0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A2E +ENCODING 27182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +FAA0 +2FE0 +7100 +6920 +A540 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_6A2F +ENCODING 27183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +2540 +3FE0 +6000 +AFE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6A30 +ENCODING 27184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +6D20 +7340 +6D20 +A7C0 +2040 +27C0 +2040 +27C0 +ENDCHAR +STARTCHAR U_6A31 +ENCODING 27185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FAA0 +2AA0 +2AA0 +3540 +6920 +AFE0 +2280 +2180 +2E60 +ENDCHAR +STARTCHAR U_6A32 +ENCODING 27186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2FE0 +F080 +2E80 +2080 +3F80 +6A80 +AE80 +2AA0 +2E60 +3B20 +ENDCHAR +STARTCHAR U_6A33 +ENCODING 27187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +F7C0 +7040 +6FE0 +64A0 +A6E0 +2840 +2FE0 +2240 +2080 +ENDCHAR +STARTCHAR U_6A34 +ENCODING 27188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +FAA0 +2480 +6FE0 +7080 +AEA0 +AAC0 +2EA0 +2B60 +2E20 +ENDCHAR +STARTCHAR U_6A35 +ENCODING 27189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FC80 +27E0 +7480 +6FE0 +A480 +A7E0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6A36 +ENCODING 27190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +FFC0 +2840 +3FE0 +6A00 +7EE0 +AAA0 +AB40 +3EA0 +2320 +ENDCHAR +STARTCHAR U_6A37 +ENCODING 27191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +71C0 +AAA0 +2080 +FFE0 +4800 +7BE0 +4940 +FDC0 +0A20 +ENDCHAR +STARTCHAR U_6A38 +ENCODING 27192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +67C0 +7100 +AFC0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6A39 +ENCODING 27193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FA0 +F220 +2FE0 +7020 +6F20 +A9A0 +AF60 +2920 +2620 +3F60 +ENDCHAR +STARTCHAR U_6A3A +ENCODING 27194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2540 +3FE0 +6540 +AFE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A3B +ENCODING 27195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F540 +2FE0 +2440 +37C0 +6C40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A3C +ENCODING 27196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FFE0 +2440 +37E0 +6C80 +A7E0 +2A40 +2FE0 +2A40 +36C0 +ENDCHAR +STARTCHAR U_6A3D +ENCODING 27197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F280 +2FE0 +6AA0 +7C60 +AFE0 +A040 +2FE0 +2440 +22C0 +ENDCHAR +STARTCHAR U_6A3E +ENCODING 27198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +4440 +FFE0 +4540 +5F40 +6560 +D740 +55A0 +5520 +6C00 +47E0 +ENDCHAR +STARTCHAR U_6A3F +ENCODING 27199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FFE0 +2540 +27C0 +3540 +6FC0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6A40 +ENCODING 27200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F240 +2FA0 +2540 +3540 +6960 +A000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6A41 +ENCODING 27201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F240 +27E0 +6820 +77A0 +A4A0 +A7A0 +24A0 +27A0 +2040 +ENDCHAR +STARTCHAR U_6A42 +ENCODING 27202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F280 +2FE0 +7AA0 +6C60 +AFE0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_6A43 +ENCODING 27203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +54A0 +E840 +7DE0 +4540 +DE60 +5000 +5DC0 +4540 +5480 +4940 +ENDCHAR +STARTCHAR U_6A44 +ENCODING 27204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2280 +FFE0 +2AA0 +2EA0 +3AA0 +6EA0 +AAA0 +2A40 +3EA0 +2320 +ENDCHAR +STARTCHAR U_6A45 +ENCODING 27205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +EFE0 +3540 +6FE0 +6540 +A540 +BFE0 +2000 +2D40 +32A0 +ENDCHAR +STARTCHAR U_6A46 +ENCODING 27206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +AA80 +FFE0 +2A80 +FFE0 +2080 +FBE0 +2080 +71C0 +AAA0 +ENDCHAR +STARTCHAR U_6A47 +ENCODING 27207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2100 +37E0 +2100 +6FE0 +A480 +2FE0 +24A0 +2FE0 +ENDCHAR +STARTCHAR U_6A48 +ENCODING 27208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +2FE0 +7440 +6FE0 +A440 +AFE0 +2280 +24A0 +2860 +ENDCHAR +STARTCHAR U_6A49 +ENCODING 27209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2540 +6920 +7440 +A7E0 +A940 +2BE0 +2440 +2840 +ENDCHAR +STARTCHAR U_6A4A +ENCODING 27210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FEE0 +2AA0 +6EE0 +7280 +AFE0 +2920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_6A4B +ENCODING 27211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +FFE0 +2480 +2FC0 +74A0 +AFE0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_6A4C +ENCODING 27212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FEE0 +4AA0 +6EE0 +DBA0 +CAA0 +4BA0 +4AA0 +4DA0 +4840 +ENDCHAR +STARTCHAR U_6A4D +ENCODING 27213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6EE0 +7BA0 +A920 +ABA0 +2920 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A4E +ENCODING 27214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2920 +F540 +2FE0 +3540 +6920 +A7C0 +2540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_6A4F +ENCODING 27215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +27C0 +3100 +6FE0 +A280 +2FE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6A50 +ENCODING 27216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4440 +FFE0 +8020 +BFE0 +5080 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_6A51 +ENCODING 27217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +27C0 +6C60 +77C0 +A440 +A7C0 +2100 +2940 +3320 +ENDCHAR +STARTCHAR U_6A52 +ENCODING 27218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2920 +7540 +6920 +A7C0 +2000 +2FE0 +2280 +27C0 +ENDCHAR +STARTCHAR U_6A53 +ENCODING 27219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F540 +2FE0 +6820 +7440 +AFE0 +B340 +2DE0 +2840 +3040 +ENDCHAR +STARTCHAR U_6A54 +ENCODING 27220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2F80 +FAE0 +2FA0 +70A0 +6EA0 +A4A0 +A6A0 +2C40 +24A0 +2D20 +ENDCHAR +STARTCHAR U_6A55 +ENCODING 27221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2AA0 +6380 +7000 +AFE0 +A480 +2FE0 +2280 +2D80 +ENDCHAR +STARTCHAR U_6A56 +ENCODING 27222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2820 +67C0 +7440 +AFC0 +A100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_6A57 +ENCODING 27223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2EE0 +6AA0 +7EE0 +AAA0 +AAE0 +2EA0 +2120 +2260 +ENDCHAR +STARTCHAR U_6A58 +ENCODING 27224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2520 +2940 +3FE0 +6AA0 +AC60 +2BA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_6A59 +ENCODING 27225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2AA0 +F440 +27C0 +3820 +27C0 +6440 +A7C0 +2440 +2280 +2FE0 +ENDCHAR +STARTCHAR U_6A5A +ENCODING 27226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F140 +2FE0 +6140 +7FC0 +A920 +AFE0 +2920 +2EE0 +32A0 +ENDCHAR +STARTCHAR U_6A5B +ENCODING 27227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2D80 +FA80 +2FE0 +2A20 +3AC0 +6FC0 +AA40 +2A40 +34A0 +2920 +ENDCHAR +STARTCHAR U_6A5C +ENCODING 27228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5480 +7FE0 +4AA0 +7E80 +4940 +5220 +7FE0 +4A80 +9240 +A220 +ENDCHAR +STARTCHAR U_6A5D +ENCODING 27229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3440 +6FC0 +A440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6A5E +ENCODING 27230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +27C0 +2540 +37C0 +6140 +AFA0 +2AC0 +2A20 +31C0 +ENDCHAR +STARTCHAR U_6A5F +ENCODING 27231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +29A0 +FF40 +2520 +6FE0 +7540 +AFE0 +A540 +26A0 +2960 +3220 +ENDCHAR +STARTCHAR U_6A60 +ENCODING 27232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2500 +7280 +6DE0 +A240 +AF80 +22A0 +2E40 +2320 +ENDCHAR +STARTCHAR U_6A61 +ENCODING 27233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FFE0 +24A0 +37E0 +2A40 +6D80 +A2C0 +2DA0 +22A0 +2D80 +ENDCHAR +STARTCHAR U_6A62 +ENCODING 27234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2BE0 +FA00 +2DE0 +6A80 +7BE0 +AB20 +AFE0 +2920 +29E0 +2920 +ENDCHAR +STARTCHAR U_6A63 +ENCODING 27235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FE0 +F940 +44A0 +6B80 +DFC0 +CA40 +4FC0 +4A40 +4FC0 +4A40 +ENDCHAR +STARTCHAR U_6A64 +ENCODING 27236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1600 +5140 +5F20 +2080 +5340 +CD20 +79E0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A65 +ENCODING 27237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57A0 +2140 +6FE0 +B440 +5FC0 +9440 +37C0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A66 +ENCODING 27238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F280 +2100 +37E0 +2D40 +67C0 +A540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A67 +ENCODING 27239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +2AA0 +2920 +3FE0 +6440 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_6A68 +ENCODING 27240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +2FE0 +6440 +77C0 +AC40 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A69 +ENCODING 27241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2F60 +F540 +2440 +2AA0 +3FE0 +6820 +A780 +24A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_6A6A +ENCODING 27242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +26A0 +F580 +2DE0 +7280 +6A80 +A540 +AA20 +2000 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6A6B +ENCODING 27243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +2100 +37C0 +6D40 +A7C0 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6A6C +ENCODING 27244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +5540 +FFE0 +4AC0 +6B60 +D000 +C7C0 +4440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6A6D +ENCODING 27245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +3FE0 +6280 +AFE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A6E +ENCODING 27246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +28A0 +FAA0 +2D60 +77C0 +6C40 +A7C0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6A6F +ENCODING 27247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2B60 +F2C0 +2520 +3FE0 +6820 +A200 +2FE0 +2220 +2520 +38C0 +ENDCHAR +STARTCHAR U_6A70 +ENCODING 27248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F440 +27C0 +7440 +67C0 +AD60 +2380 +2540 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6A71 +ENCODING 27249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +FFA0 +2820 +6BE0 +7AA0 +ABE0 +AAA0 +2920 +2FA0 +3060 +ENDCHAR +STARTCHAR U_6A72 +ENCODING 27250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F200 +2FC0 +7840 +6FC0 +A480 +3FE0 +2840 +2840 +2FC0 +ENDCHAR +STARTCHAR U_6A73 +ENCODING 27251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EA0 +55C0 +F7E0 +5C80 +77E0 +D540 +DEA0 +57C0 +5540 +6540 +4EC0 +ENDCHAR +STARTCHAR U_6A74 +ENCODING 27252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +56C0 +F4A0 +5EE0 +E240 +D580 +C240 +4FE0 +4100 +4D40 +5320 +ENDCHAR +STARTCHAR U_6A75 +ENCODING 27253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +5F40 +EAE0 +5FA0 +E0A0 +DEA0 +D2A0 +5E40 +5240 +5EA0 +5320 +ENDCHAR +STARTCHAR U_6A76 +ENCODING 27254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2FA0 +F480 +2FE0 +6A80 +7EA0 +AAA0 +AEA0 +2440 +2EE0 +2520 +ENDCHAR +STARTCHAR U_6A77 +ENCODING 27255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +4BC0 +FAE0 +4BC0 +DAC0 +EBE0 +C000 +4480 +44A0 +44A0 +58E0 +ENDCHAR +STARTCHAR U_6A78 +ENCODING 27256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +F7C0 +4440 +E7C0 +DEE0 +4AA0 +4EA0 +4AE0 +4AA0 +4EE0 +ENDCHAR +STARTCHAR U_6A79 +ENCODING 27257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFC0 +2540 +67C0 +7540 +AFE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6A7A +ENCODING 27258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6EE0 +7BA0 +AAA0 +ABA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A7B +ENCODING 27259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4240 +F7C0 +4240 +6240 +DFE0 +CAA0 +4AA0 +5FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6A7C +ENCODING 27260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2540 +F940 +2FE0 +3500 +6AA0 +ADC0 +A2A0 +25A0 +3A80 +2100 +ENDCHAR +STARTCHAR U_6A7D +ENCODING 27261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4BE0 +F080 +47E0 +D940 +EBE0 +C880 +4BE0 +4880 +4C80 +53E0 +ENDCHAR +STARTCHAR U_6A7E +ENCODING 27262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2000 +6EE0 +7AA0 +AEE0 +A100 +2FE0 +2540 +2920 +ENDCHAR +STARTCHAR U_6A7F +ENCODING 27263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFC0 +2540 +2FE0 +3000 +67C0 +A540 +27C0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_6A80 +ENCODING 27264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2AA0 +2BA0 +3820 +6FE0 +A440 +27C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_6A81 +ENCODING 27265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2BA0 +3820 +2FE0 +6380 +A100 +2FE0 +2540 +3920 +ENDCHAR +STARTCHAR U_6A82 +ENCODING 27266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +FAA0 +4FE0 +E000 +DFE0 +C800 +4FE0 +4AA0 +4A40 +5320 +ENDCHAR +STARTCHAR U_6A83 +ENCODING 27267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF80 +AA40 +AFC0 +C100 +AFE0 +A040 +EFC0 +8040 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A84 +ENCODING 27268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +F2E0 +5F20 +52A0 +FEA0 +C8A0 +5EA0 +4A40 +52A0 +6720 +ENDCHAR +STARTCHAR U_6A85 +ENCODING 27269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2500 +FFE0 +20A0 +2FE0 +3880 +6FA0 +AA40 +2F40 +3260 +2DA0 +ENDCHAR +STARTCHAR U_6A86 +ENCODING 27270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5760 +F440 +4640 +E940 +D4E0 +C5A0 +56A0 +54A0 +4AA0 +50E0 +ENDCHAR +STARTCHAR U_6A87 +ENCODING 27271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2FE0 +F900 +2FE0 +3900 +2FE0 +6900 +AFE0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6A88 +ENCODING 27272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +FFE0 +4000 +EFE0 +D840 +CFC0 +4520 +44C0 +5D40 +4620 +ENDCHAR +STARTCHAR U_6A89 +ENCODING 27273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2AE0 +FEA0 +2AA0 +2FE0 +3A00 +6FE0 +A100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6A8A +ENCODING 27274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +F4A0 +4EA0 +EAE0 +DE40 +CA40 +4FE0 +4440 +5E40 +4440 +ENDCHAR +STARTCHAR U_6A8B +ENCODING 27275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +E280 +4FE0 +6540 +5FE0 +C540 +47C0 +4540 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6A8C +ENCODING 27276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FAA0 +2FE0 +6280 +7EE0 +A280 +AEE0 +2280 +2EE0 +2280 +ENDCHAR +STARTCHAR U_6A8D +ENCODING 27277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +3440 +67C0 +A440 +27C0 +2D40 +34A0 +23A0 +ENDCHAR +STARTCHAR U_6A8E +ENCODING 27278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F540 +2FE0 +26C0 +3540 +6FC0 +A200 +2FE0 +2AA0 +2B60 +ENDCHAR +STARTCHAR U_6A8F +ENCODING 27279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4AA0 +EFE0 +4480 +6FE0 +5100 +CFC0 +4100 +5FE0 +4540 +5920 +ENDCHAR +STARTCHAR U_6A90 +ENCODING 27280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FFE0 +26A0 +27E0 +3400 +6DC0 +A400 +27E0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_6A91 +ENCODING 27281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +2BA0 +3540 +6FE0 +A920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_6A92 +ENCODING 27282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +6AC0 +A4A0 +7FC0 +4440 +5F40 +5540 +5F40 +8540 +BEA0 +ENDCHAR +STARTCHAR U_6A93 +ENCODING 27283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +29A0 +FFA0 +29A0 +6F00 +70E0 +AEA0 +A4A0 +2440 +26A0 +3920 +ENDCHAR +STARTCHAR U_6A94 +ENCODING 27284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +2AA0 +3380 +2800 +6FE0 +A920 +2FE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_6A95 +ENCODING 27285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +54A0 +7D20 +55E0 +FEA0 +5440 +7DA0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A96 +ENCODING 27286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2BE0 +F480 +2100 +7EA0 +65C0 +A6C0 +A5A0 +26A0 +2C80 +33E0 +ENDCHAR +STARTCHAR U_6A97 +ENCODING 27287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +F940 +87E0 +F880 +CFE0 +7880 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6A98 +ENCODING 27288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5E40 +F3E0 +52A0 +5EC0 +7040 +DFE0 +5A40 +5BE0 +6E40 +4040 +ENDCHAR +STARTCHAR U_6A99 +ENCODING 27289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4280 +EBA0 +4AA0 +4BA0 +6EE0 +C280 +5EE0 +4AA0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_6A9A +ENCODING 27290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F2C0 +2760 +2A40 +3FE0 +6520 +A500 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_6A9B +ENCODING 27291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FF40 +2540 +7FE0 +6820 +ABA0 +AAA0 +2BA0 +3420 +23E0 +ENDCHAR +STARTCHAR U_6A9C +ENCODING 27292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +27C0 +F820 +2FE0 +2AA0 +3920 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6A9D +ENCODING 27293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +4AA0 +EE80 +5FE0 +4A80 +6EA0 +CAA0 +4E40 +4B40 +5EA0 +4320 +ENDCHAR +STARTCHAR U_6A9E +ENCODING 27294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +52A0 +FFA0 +5540 +7540 +DFE0 +5540 +5FE0 +5540 +5540 +6340 +ENDCHAR +STARTCHAR U_6A9F +ENCODING 27295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +FFE0 +2AA0 +2FE0 +3440 +6F40 +A5C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6AA0 +ENCODING 27296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FFE0 +2940 +FD40 +5480 +5540 +7620 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6AA1 +ENCODING 27297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2100 +2FE0 +3280 +6FE0 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_6AA2 +ENCODING 27298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +F440 +2BA0 +6000 +7EE0 +AAA0 +AEE0 +2440 +2AC0 +3120 +ENDCHAR +STARTCHAR U_6AA3 +ENCODING 27299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F540 +2BA0 +2FE0 +3000 +6FE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6AA4 +ENCODING 27300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +27E0 +F480 +21E0 +3D20 +25A0 +6560 +A520 +25E0 +2A00 +31E0 +ENDCHAR +STARTCHAR U_6AA5 +ENCODING 27301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F900 +27C0 +3100 +2FE0 +62A0 +AFE0 +26C0 +2BA0 +2E60 +ENDCHAR +STARTCHAR U_6AA6 +ENCODING 27302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +4A20 +FFA0 +55A0 +5FA0 +E0A0 +5EA0 +40A0 +7F20 +5520 +6CE0 +ENDCHAR +STARTCHAR U_6AA7 +ENCODING 27303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +27E0 +6AA0 +76A0 +A960 +A200 +2540 +2C60 +33C0 +ENDCHAR +STARTCHAR U_6AA8 +ENCODING 27304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F100 +27C0 +7100 +6FE0 +A100 +ABE0 +24A0 +2D40 +2620 +ENDCHAR +STARTCHAR U_6AA9 +ENCODING 27305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2920 +7FE0 +6800 +A7C0 +A000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6AAA +ENCODING 27306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4BA0 +F6A0 +43C0 +6AA0 +5380 +C100 +5FE0 +4380 +4540 +5920 +ENDCHAR +STARTCHAR U_6AAB +ENCODING 27307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F520 +2740 +6AA0 +7440 +AFE0 +A000 +2FE0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6AAC +ENCODING 27308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +E280 +3FE0 +2820 +37C0 +6A40 +B580 +2B40 +2520 +2B00 +ENDCHAR +STARTCHAR U_6AAD +ENCODING 27309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2B20 +F1E0 +2F20 +65E0 +6F80 +B5A0 +AD40 +2740 +39A0 +2120 +ENDCHAR +STARTCHAR U_6AAE +ENCODING 27310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +2FE0 +3220 +2FC0 +6040 +AFE0 +2B40 +2EC0 +20C0 +ENDCHAR +STARTCHAR U_6AAF +ENCODING 27311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F100 +27C0 +2440 +7FE0 +6920 +A240 +27A0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6AB0 +ENCODING 27312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +49E0 +F520 +5DE0 +6920 +55E0 +DC80 +43E0 +56A0 +52E0 +4080 +ENDCHAR +STARTCHAR U_6AB1 +ENCODING 27313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4EE0 +F340 +4480 +6FE0 +5480 +C780 +4480 +5FE0 +4440 +4820 +ENDCHAR +STARTCHAR U_6AB2 +ENCODING 27314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5120 +FFE0 +55A0 +57A0 +7120 +DFE0 +54A0 +52A0 +5120 +5FE0 +ENDCHAR +STARTCHAR U_6AB3 +ENCODING 27315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +27C0 +3540 +2FC0 +6440 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6AB4 +ENCODING 27316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +2900 +3FE0 +6900 +AFE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_6AB5 +ENCODING 27317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4DA0 +EA40 +4FE0 +4800 +6FE0 +CA40 +4DA0 +4A40 +4B60 +4FE0 +ENDCHAR +STARTCHAR U_6AB6 +ENCODING 27318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F280 +2FE0 +2A40 +3BC0 +6800 +AEE0 +2AA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_6AB7 +ENCODING 27319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +FFE0 +2920 +6DA0 +7B60 +ADA0 +AB60 +2DA0 +2920 +2860 +ENDCHAR +STARTCHAR U_6AB8 +ENCODING 27320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +2CC0 +77A0 +6000 +AFE0 +AAA0 +2FE0 +2100 +2700 +ENDCHAR +STARTCHAR U_6AB9 +ENCODING 27321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +25E0 +FE80 +29E0 +7EA0 +6BE0 +AA20 +ABA0 +2AA0 +2BA0 +3660 +ENDCHAR +STARTCHAR U_6ABA +ENCODING 27322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F440 +2FE0 +3820 +27C0 +6500 +AAA0 +25C0 +2AA0 +25A0 +ENDCHAR +STARTCHAR U_6ABB +ENCODING 27323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2A40 +FF60 +2980 +2F40 +7A20 +AF00 +2000 +2FE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_6ABC +ENCODING 27324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F7E0 +2020 +77E0 +6820 +A7E0 +A240 +2D20 +3440 +23C0 +ENDCHAR +STARTCHAR U_6ABD +ENCODING 27325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2920 +7540 +6920 +AFE0 +A200 +2FE0 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_6ABE +ENCODING 27326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +5B80 +9100 +6A40 +FFE0 +8020 +1100 +FFE0 +3B80 +5540 +9920 +ENDCHAR +STARTCHAR U_6ABF +ENCODING 27327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +BCA0 +A5E0 +BC80 +A4C0 +A520 +8200 +BFE0 +8A80 +B260 +ENDCHAR +STARTCHAR U_6AC0 +ENCODING 27328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FE0 +7540 +6AA0 +B780 +A240 +2FE0 +2540 +3B20 +ENDCHAR +STARTCHAR U_6AC1 +ENCODING 27329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FAA0 +4500 +5660 +69C0 +D100 +47C0 +4540 +47C0 +5FE0 +ENDCHAR +STARTCHAR U_6AC2 +ENCODING 27330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +FB60 +25A0 +37E0 +2C80 +67E0 +A480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_6AC3 +ENCODING 27331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +FBE0 +2AA0 +3FE0 +2A40 +6BC0 +AA40 +2BC0 +2A60 +2FE0 +ENDCHAR +STARTCHAR U_6AC4 +ENCODING 27332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4200 +FFE0 +4A40 +4EC0 +6A40 +CFC0 +4200 +5FE0 +4940 +52A0 +ENDCHAR +STARTCHAR U_6AC5 +ENCODING 27333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F2A0 +2D40 +2560 +3540 +6FC0 +A440 +27C0 +2840 +3040 +ENDCHAR +STARTCHAR U_6AC6 +ENCODING 27334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +5F60 +F520 +5FA0 +5560 +7F20 +C4E0 +4520 +4EA0 +5520 +67E0 +ENDCHAR +STARTCHAR U_6AC7 +ENCODING 27335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +5E80 +75E0 +5520 +7FE0 +DB20 +D5E0 +5520 +5BE0 +6AC0 +7120 +ENDCHAR +STARTCHAR U_6AC8 +ENCODING 27336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +4AA0 +F7C0 +4C60 +57C0 +6280 +CFE0 +4000 +4780 +44A0 +48E0 +ENDCHAR +STARTCHAR U_6AC9 +ENCODING 27337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5240 +F740 +5240 +5FE0 +7740 +D5C0 +5740 +55C0 +5340 +6CC0 +ENDCHAR +STARTCHAR U_6ACA +ENCODING 27338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +52A0 +FEE0 +5020 +53A0 +74A0 +D320 +5FE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_6ACB +ENCODING 27339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +27C0 +3440 +2FE0 +6AA0 +A540 +2FE0 +2220 +2CC0 +ENDCHAR +STARTCHAR U_6ACC +ENCODING 27340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2440 +F740 +25C0 +3440 +2FE0 +6AA0 +A7C0 +2A40 +2180 +2E60 +ENDCHAR +STARTCHAR U_6ACD +ENCODING 27341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2880 +FFE0 +2AA0 +27C0 +3440 +6F40 +A5C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6ACE +ENCODING 27342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +2FC0 +7A80 +6FE0 +AD40 +2FC0 +2D40 +2FC0 +3280 +ENDCHAR +STARTCHAR U_6ACF +ENCODING 27343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2540 +F3E0 +22A0 +3FE0 +2940 +6BE0 +AD40 +29C0 +2D20 +33E0 +ENDCHAR +STARTCHAR U_6AD0 +ENCODING 27344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6AD1 +ENCODING 27345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +27C0 +3440 +6FE0 +AAA0 +2FE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_6AD2 +ENCODING 27346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +26E0 +6AA0 +7440 +ABA0 +2000 +2FE0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6AD3 +ENCODING 27347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2480 +FFE0 +2920 +2FE0 +3920 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_6AD4 +ENCODING 27348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +FFE0 +2940 +6BE0 +7AA0 +AFE0 +2CA0 +2FE0 +3420 +3460 +ENDCHAR +STARTCHAR U_6AD5 +ENCODING 27349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +F440 +2AA0 +77E0 +6460 +A7C0 +A440 +27C0 +2440 +2820 +ENDCHAR +STARTCHAR U_6AD6 +ENCODING 27350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2200 +FFE0 +2A40 +6FE0 +7AA0 +ABE0 +2AA0 +2BE0 +3540 +3BC0 +ENDCHAR +STARTCHAR U_6AD7 +ENCODING 27351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +6AA0 +7FE0 +A100 +2FE0 +2940 +2CA0 +3360 +ENDCHAR +STARTCHAR U_6AD8 +ENCODING 27352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +F480 +2FE0 +7480 +EFC0 +A240 +2FC0 +2D60 +3440 +23C0 +ENDCHAR +STARTCHAR U_6AD9 +ENCODING 27353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2FE0 +2A40 +3BC0 +6800 +AEE0 +2AA0 +2EE0 +2FE0 +ENDCHAR +STARTCHAR U_6ADA +ENCODING 27354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +6FE0 +7AA0 +ABA0 +A820 +2BA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_6ADB +ENCODING 27355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2FE0 +F440 +2EE0 +2AA0 +3EA0 +6AA0 +AEA0 +28E0 +2A80 +2D80 +ENDCHAR +STARTCHAR U_6ADC +ENCODING 27356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +FFE0 +A120 +7980 +2940 +FFE0 +1080 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6ADD +ENCODING 27357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +2FE0 +3440 +6F40 +A5C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6ADE +ENCODING 27358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +5540 +F540 +5BC0 +6900 +D6A0 +DDC0 +5680 +55C0 +6AA0 +41A0 +ENDCHAR +STARTCHAR U_6ADF +ENCODING 27359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2BC0 +FAA0 +2FE0 +2AA0 +3FE0 +6100 +BFE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_6AE0 +ENCODING 27360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEC0 +2A40 +2EE0 +3AA0 +6F00 +A9E0 +2EA0 +3240 +26A0 +ENDCHAR +STARTCHAR U_6AE1 +ENCODING 27361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FA40 +27A0 +2140 +3FE0 +6240 +A7C0 +2A40 +23C0 +2240 +ENDCHAR +STARTCHAR U_6AE2 +ENCODING 27362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FC0 +FA80 +2FE0 +6AA0 +7FA0 +A240 +3F40 +25A0 +22A0 +2D20 +ENDCHAR +STARTCHAR U_6AE3 +ENCODING 27363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +57E0 +EA40 +4100 +4FE0 +F540 +D7C0 +5540 +5FE0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6AE4 +ENCODING 27364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +FD40 +2A20 +6FE0 +7000 +AEA0 +2AA0 +2EA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_6AE5 +ENCODING 27365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +F920 +2FA0 +2960 +3FA0 +6AE0 +ABA0 +2AA0 +3D20 +27E0 +ENDCHAR +STARTCHAR U_6AE6 +ENCODING 27366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +F500 +5FC0 +7540 +DFC0 +D540 +5BA0 +5680 +5100 +6EC0 +ENDCHAR +STARTCHAR U_6AE7 +ENCODING 27367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +2FE0 +F0A0 +2DE0 +3080 +2DE0 +6320 +BDE0 +3520 +3DE0 +3520 +ENDCHAR +STARTCHAR U_6AE8 +ENCODING 27368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +FFE0 +2920 +3FC0 +2D20 +6BE0 +AAA0 +37E0 +2540 +2FE0 +ENDCHAR +STARTCHAR U_6AE9 +ENCODING 27369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2820 +6BA0 +7D20 +ABA0 +2AA0 +2AA0 +2BA0 +2840 +ENDCHAR +STARTCHAR U_6AEA +ENCODING 27370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2B60 +FA40 +2FE0 +3B40 +2EE0 +6A40 +A880 +2AE0 +3280 +2FE0 +ENDCHAR +STARTCHAR U_6AEB +ENCODING 27371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +27C0 +5940 +57E0 +BA40 +57C0 +9240 +27C0 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_6AEC +ENCODING 27372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2FA0 +F5E0 +22A0 +2FA0 +32E0 +6FA0 +A2E0 +2740 +2AC0 +2760 +ENDCHAR +STARTCHAR U_6AED +ENCODING 27373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5540 +FDE0 +5440 +7CC0 +D160 +DF80 +4880 +4F80 +4880 +5FE0 +ENDCHAR +STARTCHAR U_6AEE +ENCODING 27374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F540 +27C0 +2100 +3FE0 +6540 +A540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_6AEF +ENCODING 27375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4A40 +FFE0 +7540 +5540 +DFC0 +D560 +5560 +5F40 +5540 +6AC0 +ENDCHAR +STARTCHAR U_6AF0 +ENCODING 27376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +2FE0 +2540 +3380 +6D40 +A320 +3D40 +2480 +2660 +ENDCHAR +STARTCHAR U_6AF1 +ENCODING 27377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +FBE0 +4940 +CFE0 +7880 +4FE0 +7880 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6AF2 +ENCODING 27378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5CE0 +4540 +FBE0 +5EA0 +6BE0 +C900 +CAA0 +4940 +4AC0 +6960 +52A0 +ENDCHAR +STARTCHAR U_6AF3 +ENCODING 27379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2E80 +FAE0 +2E20 +20E0 +3E80 +6AE0 +AE80 +2AE0 +2EA0 +2AE0 +ENDCHAR +STARTCHAR U_6AF4 +ENCODING 27380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5EE0 +E540 +5FE0 +7520 +DFE0 +C5A0 +4F60 +55E0 +6540 +4620 +ENDCHAR +STARTCHAR U_6AF5 +ENCODING 27381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +2FC0 +6900 +7FC0 +A900 +2FC0 +2540 +2AA0 +32A0 +ENDCHAR +STARTCHAR U_6AF6 +ENCODING 27382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +27C0 +6100 +7FE0 +AAA0 +2FE0 +2540 +2CA0 +23A0 +ENDCHAR +STARTCHAR U_6AF7 +ENCODING 27383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +5FC0 +F040 +5DC0 +6500 +F5E0 +DD60 +75A0 +5DE0 +7500 +43E0 +ENDCHAR +STARTCHAR U_6AF8 +ENCODING 27384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +2920 +FFE0 +2AA0 +2AA0 +3FE0 +6940 +B7A0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_6AF9 +ENCODING 27385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F7E0 +2140 +37C0 +2D60 +6FE0 +A920 +2FE0 +2D60 +3560 +ENDCHAR +STARTCHAR U_6AFA +ENCODING 27386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +7FE0 +2920 +3BA0 +2440 +6FE0 +AAA0 +2AA0 +2FE0 +2AA0 +ENDCHAR +STARTCHAR U_6AFB +ENCODING 27387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +2920 +2FE0 +34A0 +6B40 +AFE0 +2480 +2380 +2C60 +ENDCHAR +STARTCHAR U_6AFC +ENCODING 27388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2560 +2AC0 +FFE0 +2540 +2DC0 +3560 +6DC0 +A540 +2DE0 +2520 +2FA0 +ENDCHAR +STARTCHAR U_6AFD +ENCODING 27389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5540 +67C0 +5040 +5FE0 +7540 +5BA0 +4400 +FFC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_6AFE +ENCODING 27390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +5480 +F900 +4FC0 +7500 +DFE0 +C4A0 +56C0 +57A0 +5EA0 +4180 +ENDCHAR +STARTCHAR U_6AFF +ENCODING 27391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2EE0 +F440 +2AA0 +6FE0 +7820 +A7C0 +2440 +2FE0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_6B00 +ENCODING 27392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +FB40 +2FC0 +7500 +6FC0 +A500 +3FE0 +24A0 +2D40 +3620 +ENDCHAR +STARTCHAR U_6B01 +ENCODING 27393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +5F40 +F5E0 +5F40 +7540 +DFC0 +D0E0 +5F60 +5A40 +6940 +6C80 +ENDCHAR +STARTCHAR U_6B02 +ENCODING 27394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F2A0 +2BE0 +76A0 +6BE0 +AAA0 +BFE0 +2A40 +2940 +28C0 +ENDCHAR +STARTCHAR U_6B03 +ENCODING 27395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2480 +FFE0 +2420 +27E0 +3C80 +67E0 +A4A0 +27E0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6B04 +ENCODING 27396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +3FE0 +6920 +AFE0 +AAA0 +2FE0 +2AA0 +2D60 +ENDCHAR +STARTCHAR U_6B05 +ENCODING 27397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5B60 +5220 +FF60 +5520 +7FE0 +C940 +D7A0 +6100 +4FC0 +4100 +4300 +ENDCHAR +STARTCHAR U_6B06 +ENCODING 27398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +27E0 +FD40 +27E0 +7540 +6FE0 +A000 +2780 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6B07 +ENCODING 27399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +F6C0 +2FE0 +7040 +7FE0 +AAA0 +2EE0 +2AA0 +3FE0 +2220 +ENDCHAR +STARTCHAR U_6B08 +ENCODING 27400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2FE0 +F500 +2FE0 +3500 +2FE0 +6500 +AFE0 +2AA0 +2EE0 +2BA0 +ENDCHAR +STARTCHAR U_6B09 +ENCODING 27401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +FFE0 +2280 +3FE0 +2100 +6FE0 +AAA0 +2E40 +2AA0 +3F20 +ENDCHAR +STARTCHAR U_6B0A +ENCODING 27402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +FEE0 +2AA0 +2FE0 +3480 +67E0 +BC80 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_6B0B +ENCODING 27403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +2FE0 +3900 +6FE0 +B900 +2FC0 +2900 +2FE0 +ENDCHAR +STARTCHAR U_6B0C +ENCODING 27404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +FA80 +57C0 +7480 +DFA0 +C4E0 +5FC0 +5540 +57A0 +4920 +ENDCHAR +STARTCHAR U_6B0D +ENCODING 27405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +F300 +2480 +77E0 +6C80 +A7E0 +2400 +2760 +2420 +27E0 +ENDCHAR +STARTCHAR U_6B0E +ENCODING 27406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +F5E0 +6AC0 +B5A0 +FFE0 +8020 +7C40 +47E0 +7D40 +5840 +64C0 +ENDCHAR +STARTCHAR U_6B0F +ENCODING 27407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +2940 +25E0 +7940 +AFE0 +2540 +3FE0 +2B40 +35E0 +ENDCHAR +STARTCHAR U_6B10 +ENCODING 27408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2000 +FEE0 +2AA0 +2FE0 +3AA0 +6FE0 +ACA0 +2FC0 +34A0 +27E0 +ENDCHAR +STARTCHAR U_6B11 +ENCODING 27409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +2540 +3FE0 +6440 +A7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_6B12 +ENCODING 27410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5FA0 +E0C0 +4E40 +A0A0 +EEE0 +4A40 +AAA0 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6B13 +ENCODING 27411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F4A0 +2FE0 +2AA0 +3FE0 +6100 +AFC0 +2100 +2FE0 +2AA0 +ENDCHAR +STARTCHAR U_6B14 +ENCODING 27412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +7FE0 +67C0 +AD00 +27C0 +2480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_6B15 +ENCODING 27413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +FFE0 +5680 +7280 +DFE0 +D5A0 +5740 +5540 +5FA0 +6120 +ENDCHAR +STARTCHAR U_6B16 +ENCODING 27414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2B40 +FFE0 +2AA0 +3FE0 +2440 +67C0 +A440 +27C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_6B17 +ENCODING 27415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2480 +FFE0 +2920 +2FE0 +3920 +6FE0 +AAA0 +2FE0 +2BA0 +2D60 +ENDCHAR +STARTCHAR U_6B18 +ENCODING 27416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +2940 +2FE0 +3AA0 +6FE0 +A920 +2BA0 +2960 +37E0 +ENDCHAR +STARTCHAR U_6B19 +ENCODING 27417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +F7C0 +2540 +2FE0 +3920 +6FE0 +A2A0 +2FC0 +2540 +2B20 +ENDCHAR +STARTCHAR U_6B1A +ENCODING 27418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +FFE0 +2540 +2B80 +2540 +7FE0 +AAA0 +3FE0 +2AA0 +3DE0 +ENDCHAR +STARTCHAR U_6B1B +ENCODING 27419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2920 +7540 +6AE0 +BFA0 +2AE0 +2EA0 +3EE0 +2520 +ENDCHAR +STARTCHAR U_6B1C +ENCODING 27420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +2A80 +3FE0 +7560 +7FC0 +A500 +2FE0 +2540 +2EA0 +3560 +ENDCHAR +STARTCHAR U_6B1D +ENCODING 27421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +F5E0 +6AC0 +D5A0 +7F80 +4A80 +7F80 +4880 +7FE0 +5280 +6D80 +ENDCHAR +STARTCHAR U_6B1E +ENCODING 27422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +FFE0 +2AA0 +3540 +2FE0 +6AA0 +AFE0 +2540 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_6B1F +ENCODING 27423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +5FA0 +EAE0 +5FA0 +75E0 +DFA0 +F4E0 +5E40 +54C0 +5EC0 +5160 +ENDCHAR +STARTCHAR U_6B20 +ENCODING 27424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +2000 +3FC0 +4040 +8880 +0800 +0800 +0C00 +1200 +2100 +C0C0 +ENDCHAR +STARTCHAR U_6B21 +ENCODING 27425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +27E0 +0440 +2900 +2100 +C100 +4280 +4280 +4440 +1820 +ENDCHAR +STARTCHAR U_6B22 +ENCODING 27426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +0A20 +8D40 +5100 +2100 +3100 +2A80 +4A80 +8440 +0820 +ENDCHAR +STARTCHAR U_6B23 +ENCODING 27427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7200 +43E0 +7E20 +5540 +5100 +5100 +5280 +5280 +9440 +9820 +ENDCHAR +STARTCHAR U_6B24 +ENCODING 27428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7DE0 +4120 +7AC0 +0880 +3880 +C880 +0940 +0940 +3220 +ENDCHAR +STARTCHAR U_6B25 +ENCODING 27429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9420 +F940 +9100 +9100 +9280 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_6B26 +ENCODING 27430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +33E0 +4C20 +A540 +1100 +F900 +0A80 +1280 +1440 +2820 +ENDCHAR +STARTCHAR U_6B27 +ENCODING 27431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD00 +81E0 +CA20 +AC80 +9080 +9080 +A880 +C940 +8240 +FC20 +ENDCHAR +STARTCHAR U_6B28 +ENCODING 27432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7DE0 +8520 +76C0 +5480 +5480 +7480 +0540 +1540 +0A20 +ENDCHAR +STARTCHAR U_6B29 +ENCODING 27433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +2BE0 +2A20 +4D40 +9100 +7900 +4A80 +4A80 +7A40 +0420 +ENDCHAR +STARTCHAR U_6B2A +ENCODING 27434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +ABE0 +AA20 +FD40 +2100 +A900 +AA80 +AA80 +FC40 +0820 +ENDCHAR +STARTCHAR U_6B2B +ENCODING 27435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +7BE0 +9420 +F940 +1100 +5D00 +5280 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_6B2C +ENCODING 27436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FDE0 +2220 +4880 +F080 +2480 +4940 +1140 +2A20 +C420 +ENDCHAR +STARTCHAR U_6B2D +ENCODING 27437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8500 +95E0 +FE20 +94A0 +9480 +AC80 +C480 +8480 +FD40 +8620 +ENDCHAR +STARTCHAR U_6B2E +ENCODING 27438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2900 +FFE0 +1220 +5540 +5500 +7D00 +1280 +1280 +2460 +C840 +ENDCHAR +STARTCHAR U_6B2F +ENCODING 27439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FDE0 +1220 +7AC0 +0480 +7880 +4880 +4940 +7940 +4A20 +ENDCHAR +STARTCHAR U_6B30 +ENCODING 27440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +FBE0 +AA20 +AD40 +A900 +A900 +AA80 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_6B31 +ENCODING 27441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +51E0 +4A20 +84C0 +7880 +0080 +7880 +4940 +4940 +7A20 +ENDCHAR +STARTCHAR U_6B32 +ENCODING 27442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +4500 +91E0 +3220 +4880 +8480 +7880 +4880 +4940 +7A20 +0420 +ENDCHAR +STARTCHAR U_6B33 +ENCODING 27443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1D00 +11E0 +FEA0 +AA80 +AA80 +FE80 +AA80 +AB40 +AA20 +8620 +ENDCHAR +STARTCHAR U_6B34 +ENCODING 27444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FBE0 +8C20 +F880 +8880 +F880 +9080 +9940 +EA20 +8C20 +ENDCHAR +STARTCHAR U_6B35 +ENCODING 27445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7200 +4BE0 +3A40 +4500 +7900 +9100 +F980 +3240 +4C60 +8840 +ENDCHAR +STARTCHAR U_6B36 +ENCODING 27446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7EA0 +54A0 +7C80 +1080 +3880 +5540 +9220 +1420 +ENDCHAR +STARTCHAR U_6B37 +ENCODING 27447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CD00 +3100 +CDE0 +1220 +FCA0 +5080 +FC80 +5480 +5540 +5E20 +1420 +ENDCHAR +STARTCHAR U_6B38 +ENCODING 27448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4500 +FDE0 +4220 +7CA0 +9080 +FC80 +1080 +2940 +4620 +8420 +ENDCHAR +STARTCHAR U_6B39 +ENCODING 27449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +51E0 +8A20 +FCA0 +0880 +E880 +A880 +E940 +0A20 +1C20 +ENDCHAR +STARTCHAR U_6B3A +ENCODING 27450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FD00 +49E0 +7A20 +48A0 +7880 +4880 +FE80 +2940 +4620 +8420 +ENDCHAR +STARTCHAR U_6B3B +ENCODING 27451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +5900 +51E0 +AA20 +52A0 +9480 +5880 +5080 +A940 +4620 +8420 +ENDCHAR +STARTCHAR U_6B3C +ENCODING 27452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +45E0 +AA20 +10A0 +EE80 +AA80 +4480 +2940 +5620 +A220 +ENDCHAR +STARTCHAR U_6B3D +ENCODING 27453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +F420 +2120 +F900 +2100 +A900 +7280 +2440 +F820 +ENDCHAR +STARTCHAR U_6B3E +ENCODING 27454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7A20 +00A0 +7880 +0080 +FC80 +5540 +9240 +7420 +ENDCHAR +STARTCHAR U_6B3F +ENCODING 27455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +45E0 +8A20 +20A0 +CE80 +8280 +EE80 +8280 +FF40 +8220 +ENDCHAR +STARTCHAR U_6B40 +ENCODING 27456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +39E0 +5620 +9280 +7C80 +0080 +FC80 +5940 +9560 +3240 +ENDCHAR +STARTCHAR U_6B41 +ENCODING 27457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FD00 +49E0 +7A20 +48A0 +7880 +4880 +FE80 +A880 +C540 +FE20 +ENDCHAR +STARTCHAR U_6B42 +ENCODING 27458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +9280 +FEE0 +0120 +FE40 +1040 +FE40 +AA40 +AA40 +AAA0 +8720 +ENDCHAR +STARTCHAR U_6B43 +ENCODING 27459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D00 +F100 +11E0 +FE20 +10A0 +F680 +9280 +FE80 +9280 +FF40 +8220 +ENDCHAR +STARTCHAR U_6B44 +ENCODING 27460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4500 +75E0 +5620 +FEC0 +8280 +BA80 +AB40 +BB40 +8A20 +8420 +ENDCHAR +STARTCHAR U_6B45 +ENCODING 27461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +2900 +FFE0 +AA20 +AAA0 +FE80 +1080 +7C80 +1140 +FE20 +4420 +ENDCHAR +STARTCHAR U_6B46 +ENCODING 27462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +49E0 +3220 +FCA0 +0080 +7880 +4940 +7940 +4A20 +7C20 +ENDCHAR +STARTCHAR U_6B47 +ENCODING 27463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +F9E0 +8A20 +F8A0 +2080 +7C80 +9480 +AD40 +F620 +0C20 +ENDCHAR +STARTCHAR U_6B48 +ENCODING 27464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +4500 +BBE0 +0020 +E2A0 +AA80 +EA80 +AA80 +EA80 +A340 +AE20 +ENDCHAR +STARTCHAR U_6B49 +ENCODING 27465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +FF00 +29E0 +FF20 +2AA0 +FF80 +2A80 +FE80 +6C80 +AB40 +AA20 +ENDCHAR +STARTCHAR U_6B4A +ENCODING 27466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +49E0 +7A20 +00A0 +FE80 +8280 +BA80 +AA80 +BB40 +8620 +ENDCHAR +STARTCHAR U_6B4B +ENCODING 27467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4F00 +49E0 +7E20 +48A0 +5C80 +4A80 +5E80 +5480 +5540 +A620 +ENDCHAR +STARTCHAR U_6B4C +ENCODING 27468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +0900 +E9E0 +AA20 +FE80 +0880 +E880 +A940 +E940 +0A20 +1C20 +ENDCHAR +STARTCHAR U_6B4D +ENCODING 27469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FA00 +8BE0 +FA20 +80A0 +FC80 +8080 +FC80 +5480 +AD40 +AA20 +ENDCHAR +STARTCHAR U_6B4E +ENCODING 27470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FD00 +51E0 +2220 +F880 +A880 +FC80 +2080 +FD80 +5240 +8C20 +ENDCHAR +STARTCHAR U_6B4F +ENCODING 27471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FF00 +49E0 +FE20 +A540 +FD00 +2100 +FA80 +2280 +3A40 +E460 +ENDCHAR +STARTCHAR U_6B50 +ENCODING 27472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8100 +BDE0 +A620 +BCA0 +8080 +EE80 +AA80 +EE80 +8140 +FE20 +ENDCHAR +STARTCHAR U_6B51 +ENCODING 27473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +2100 +FFE0 +9220 +FCA0 +9280 +FE80 +AA80 +FE80 +8940 +9A20 +ENDCHAR +STARTCHAR U_6B52 +ENCODING 27474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +28E0 +FF20 +92C0 +FE80 +9280 +BA80 +AB40 +BB40 +8620 +ENDCHAR +STARTCHAR U_6B53 +ENCODING 27475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +91E0 +7D20 +2A80 +7C80 +C880 +7D40 +4940 +7E20 +4420 +ENDCHAR +STARTCHAR U_6B54 +ENCODING 27476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +FFE0 +9220 +FCA0 +9280 +9E80 +AA80 +EE80 +A940 +FE20 +ENDCHAR +STARTCHAR U_6B55 +ENCODING 27477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +55E0 +FE20 +44A0 +7C80 +4480 +7C80 +4480 +7D40 +C620 +ENDCHAR +STARTCHAR U_6B56 +ENCODING 27478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +11E0 +FF20 +44A0 +7C80 +2880 +FE80 +4480 +7D40 +4620 +ENDCHAR +STARTCHAR U_6B57 +ENCODING 27479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C00 +1480 +FEE0 +1520 +7C80 +BA80 +D680 +FE80 +D6C0 +BB20 +9220 +ENDCHAR +STARTCHAR U_6B58 +ENCODING 27480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +3900 +11E0 +6A20 +4480 +D580 +6E80 +4480 +4B40 +A940 +9220 +ENDCHAR +STARTCHAR U_6B59 +ENCODING 27481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4900 +FDE0 +0220 +7CA0 +4480 +FE80 +AA80 +6680 +BB40 +6620 +ENDCHAR +STARTCHAR U_6B5A +ENCODING 27482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7D00 +11E0 +7E20 +10C0 +5480 +FE80 +0140 +7D40 +4620 +7C20 +ENDCHAR +STARTCHAR U_6B5B +ENCODING 27483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +FE20 +00A0 +EE80 +AA80 +EE80 +4540 +6D40 +9220 +ENDCHAR +STARTCHAR U_6B5C +ENCODING 27484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FEE0 +2120 +7EA0 +A280 +FA80 +AA80 +FA80 +2B40 +F420 +ENDCHAR +STARTCHAR U_6B5D +ENCODING 27485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +FEE0 +1120 +FE80 +2880 +FC80 +1140 +FD40 +1260 +1440 +ENDCHAR +STARTCHAR U_6B5E +ENCODING 27486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +8500 +FDE0 +8620 +FCA0 +5280 +FC80 +4A80 +FE80 +5540 +AA20 +ENDCHAR +STARTCHAR U_6B5F +ENCODING 27487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5680 +9A80 +92E0 +FF20 +AAA0 +EE80 +AA80 +AA80 +FEC0 +2920 +C620 +ENDCHAR +STARTCHAR U_6B60 +ENCODING 27488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +AA80 +44E0 +FF20 +AAA0 +4480 +AA80 +BA80 +EEC0 +8320 +FE20 +ENDCHAR +STARTCHAR U_6B61 +ENCODING 27489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +4480 +EEE0 +AB20 +EE80 +5080 +FE80 +4880 +7D40 +4940 +7E20 +ENDCHAR +STARTCHAR U_6B62 +ENCODING 27490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0400 +2400 +2780 +2400 +2400 +2400 +2400 +2400 +FFC0 +ENDCHAR +STARTCHAR U_6B63 +ENCODING 27491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0400 +2400 +27C0 +2400 +2400 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6B64 +ENCODING 27492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +1120 +5140 +5D80 +5100 +5100 +5100 +5120 +5D20 +E0E0 +ENDCHAR +STARTCHAR U_6B65 +ENCODING 27493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +2400 +FFE0 +0400 +1440 +2480 +4100 +0600 +F800 +ENDCHAR +STARTCHAR U_6B66 +ENCODING 27494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +3D40 +0100 +FFE0 +0900 +2900 +2D00 +2900 +28A0 +2EA0 +F060 +ENDCHAR +STARTCHAR U_6B67 +ENCODING 27495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +17E0 +5100 +5BC0 +5240 +5280 +5180 +7900 +C280 +0C60 +ENDCHAR +STARTCHAR U_6B68 +ENCODING 27496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +23C0 +2200 +2200 +FFE0 +0200 +2200 +23C0 +2200 +5A00 +87E0 +ENDCHAR +STARTCHAR U_6B69 +ENCODING 27497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +0480 +2440 +24A0 +4500 +0600 +0C00 +7000 +ENDCHAR +STARTCHAR U_6B6A +ENCODING 27498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +1D80 +E460 +0400 +7FE0 +0400 +27C0 +2400 +2400 +FFE0 +ENDCHAR +STARTCHAR U_6B6B +ENCODING 27499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +1200 +5200 +5BE0 +5220 +53E0 +5200 +5A00 +E200 +03E0 +ENDCHAR +STARTCHAR U_6B6C +ENCODING 27500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +0000 +3F80 +2480 +FFE0 +2880 +2480 +C180 +ENDCHAR +STARTCHAR U_6B6D +ENCODING 27501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +17C0 +5100 +5900 +57E0 +5040 +57E0 +5240 +5940 +E040 +41C0 +ENDCHAR +STARTCHAR U_6B6E +ENCODING 27502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +13C0 +1200 +1200 +FFE0 +1080 +18E0 +5280 +5280 +5280 +FFE0 +ENDCHAR +STARTCHAR U_6B6F +ENCODING 27503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +5540 +4E40 +7FC0 +4E40 +5540 +64C0 +7FC0 +ENDCHAR +STARTCHAR U_6B70 +ENCODING 27504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2940 +AD40 +6B40 +4A40 +9CC0 +1080 +5AC0 +5280 +7A80 +C7E0 +ENDCHAR +STARTCHAR U_6B71 +ENCODING 27505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FE0 +A100 +B7C0 +A540 +A7C0 +A100 +B7C0 +C100 +0FE0 +ENDCHAR +STARTCHAR U_6B72 +ENCODING 27506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2400 +FFE0 +0140 +7FE0 +4100 +7F40 +4B40 +54A0 +69A0 +9660 +ENDCHAR +STARTCHAR U_6B73 +ENCODING 27507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2400 +7FE0 +0240 +7FE0 +4200 +7D40 +4940 +5CA0 +AB60 +1A20 +ENDCHAR +STARTCHAR U_6B74 +ENCODING 27508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +7FE0 +5DC0 +5AA0 +6880 +4200 +5200 +53C0 +9200 +3FE0 +ENDCHAR +STARTCHAR U_6B75 +ENCODING 27509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +BFE0 +A000 +A7C0 +A540 +BEC0 +C540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_6B76 +ENCODING 27510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +5F80 +5220 +FBE0 +3F80 +2480 +3F80 +2480 +FFE0 +8520 +BF60 +ENDCHAR +STARTCHAR U_6B77 +ENCODING 27511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5980 +4880 +7FE0 +4880 +5DC0 +6AA0 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_6B78 +ENCODING 27512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +F040 +93C0 +F840 +8FE0 +FCA0 +2080 +BBE0 +A2A0 +BAE0 +E080 +ENDCHAR +STARTCHAR U_6B79 +ENCODING 27513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0800 +0FC0 +1080 +1080 +2900 +4500 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_6B7A +ENCODING 27514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +07E0 +1400 +1FC0 +2080 +5100 +0A00 +0400 +1800 +E000 +ENDCHAR +STARTCHAR U_6B7B +ENCODING 27515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1000 +1100 +1D20 +2540 +6580 +9500 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_6B7C +ENCODING 27516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +2380 +2080 +7880 +4FE0 +A880 +1080 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_6B7D +ENCODING 27517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +2300 +2200 +3A00 +4BE0 +B280 +1280 +2280 +2480 +4480 +8880 +ENDCHAR +STARTCHAR U_6B7E +ENCODING 27518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +3EA0 +4AA0 +4AA0 +AAA0 +14A0 +1120 +2220 +4420 +80C0 +ENDCHAR +STARTCHAR U_6B7F +ENCODING 27519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +21E0 +2120 +3A60 +4C00 +CBE0 +2A20 +1140 +1080 +2140 +C620 +ENDCHAR +STARTCHAR U_6B80 +ENCODING 27520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +2300 +2100 +7900 +4FE0 +A900 +1100 +1100 +2280 +4440 +8820 +ENDCHAR +STARTCHAR U_6B81 +ENCODING 27521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2240 +3A40 +2A60 +4C00 +ABE0 +1220 +1140 +2080 +4140 +8620 +ENDCHAR +STARTCHAR U_6B82 +ENCODING 27522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2240 +3BC0 +4A40 +AA40 +13C0 +1240 +2240 +4240 +8FE0 +ENDCHAR +STARTCHAR U_6B83 +ENCODING 27523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +47C0 +7540 +5540 +9540 +5FE0 +3100 +2280 +4440 +8820 +ENDCHAR +STARTCHAR U_6B84 +ENCODING 27524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FD80 +2240 +3AA0 +4D00 +AA40 +1080 +1120 +2240 +4080 +8300 +ENDCHAR +STARTCHAR U_6B85 +ENCODING 27525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7D00 +2500 +3FE0 +4900 +B100 +17C0 +2100 +4100 +8100 +1FE0 +ENDCHAR +STARTCHAR U_6B86 +ENCODING 27526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2080 +2100 +3920 +4BE0 +C800 +2BE0 +1220 +1220 +23E0 +C220 +ENDCHAR +STARTCHAR U_6B87 +ENCODING 27527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +2400 +3BC0 +4900 +6BE0 +9AA0 +14A0 +2920 +4220 +84C0 +ENDCHAR +STARTCHAR U_6B88 +ENCODING 27528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +2200 +2FE0 +3AA0 +4AA0 +AAA0 +1AA0 +2AA0 +4AA0 +8AA0 +1FE0 +ENDCHAR +STARTCHAR U_6B89 +ENCODING 27529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +2420 +3BA0 +4AA0 +CBA0 +2AA0 +13A0 +22A0 +4020 +80C0 +ENDCHAR +STARTCHAR U_6B8A +ENCODING 27530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2500 +27C0 +3900 +4900 +4FE0 +B100 +1380 +2540 +4920 +8100 +ENDCHAR +STARTCHAR U_6B8B +ENCODING 27531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +F940 +27E0 +2100 +7900 +4FE0 +A900 +1140 +10A0 +2160 +C620 +ENDCHAR +STARTCHAR U_6B8C +ENCODING 27532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +22A0 +3AA0 +4D40 +4AA0 +AAA0 +1FE0 +1100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_6B8D +ENCODING 27533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FBA0 +22A0 +2140 +7BE0 +4840 +A880 +17E0 +1080 +2080 +C180 +ENDCHAR +STARTCHAR U_6B8E +ENCODING 27534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +47E0 +4100 +7540 +5540 +DBA0 +3120 +1280 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_6B8F +ENCODING 27535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +27E0 +3900 +4D20 +AB40 +1180 +1340 +2540 +4920 +8300 +ENDCHAR +STARTCHAR U_6B90 +ENCODING 27536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4100 +77C0 +5540 +D7C0 +2300 +2580 +4940 +9120 +0100 +ENDCHAR +STARTCHAR U_6B91 +ENCODING 27537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +2100 +3BC0 +4A40 +AA40 +1BC0 +1280 +22A0 +44A0 +8860 +ENDCHAR +STARTCHAR U_6B92 +ENCODING 27538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2220 +23E0 +3800 +4BE0 +AA20 +1AA0 +12A0 +22A0 +4140 +8620 +ENDCHAR +STARTCHAR U_6B93 +ENCODING 27539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2280 +2440 +3820 +4FC0 +4A40 +A940 +1540 +2480 +4100 +9FE0 +ENDCHAR +STARTCHAR U_6B94 +ENCODING 27540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +2140 +3FE0 +4940 +CFE0 +3940 +1580 +2340 +4520 +9B20 +ENDCHAR +STARTCHAR U_6B95 +ENCODING 27541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +47E0 +7440 +5280 +5FE0 +B000 +17C0 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_6B96 +ENCODING 27542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +2100 +3FC0 +4C40 +AFC0 +1440 +1740 +25C0 +4440 +9FE0 +ENDCHAR +STARTCHAR U_6B97 +ENCODING 27543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +2280 +3540 +5FE0 +D540 +37C0 +1540 +27C0 +4120 +80E0 +ENDCHAR +STARTCHAR U_6B98 +ENCODING 27544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +2FE0 +2240 +39A0 +4B60 +4A80 +ABE0 +1E40 +2280 +4120 +8EE0 +ENDCHAR +STARTCHAR U_6B99 +ENCODING 27545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2480 +27E0 +3C80 +4F60 +4820 +AFC0 +1440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_6B9A +ENCODING 27546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +2280 +2FE0 +3920 +4FE0 +4920 +BFE0 +1100 +2FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_6B9B +ENCODING 27547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +2080 +2100 +7DE0 +5520 +55A0 +B540 +1DA0 +2320 +4000 +9FE0 +ENDCHAR +STARTCHAR U_6B9C +ENCODING 27548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +4540 +75C0 +5400 +97E0 +5100 +2FE0 +4380 +8540 +1920 +ENDCHAR +STARTCHAR U_6B9D +ENCODING 27549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +7100 +5FE0 +9440 +5BA0 +2100 +4FE0 +8540 +1920 +ENDCHAR +STARTCHAR U_6B9E +ENCODING 27550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +27E0 +3C20 +47E0 +A420 +2FE0 +1420 +27E0 +4280 +8C60 +ENDCHAR +STARTCHAR U_6B9F +ENCODING 27551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2440 +27C0 +7440 +57C0 +D000 +3FE0 +1AA0 +2AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_6BA0 +ENCODING 27552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +47C0 +4440 +77C0 +9440 +97C0 +5440 +2FE0 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_6BA1 +ENCODING 27553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4820 +4780 +7400 +97E0 +5480 +2480 +2FE0 +4440 +8820 +ENDCHAR +STARTCHAR U_6BA2 +ENCODING 27554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +4FE0 +7A80 +5BE0 +5000 +DFE0 +3920 +17C0 +2540 +45C0 +8100 +ENDCHAR +STARTCHAR U_6BA3 +ENCODING 27555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +4FE0 +4280 +7100 +57C0 +5540 +BFE0 +1100 +27C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_6BA4 +ENCODING 27556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +47E0 +4A40 +73C0 +5240 +9FE0 +5400 +17E0 +2AA0 +4520 +8240 +ENDCHAR +STARTCHAR U_6BA5 +ENCODING 27557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +2FE0 +2820 +37C0 +5100 +57C0 +B540 +17C0 +2540 +47C0 +8C60 +ENDCHAR +STARTCHAR U_6BA6 +ENCODING 27558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +47C0 +4440 +77C0 +5440 +D7E0 +3400 +17E0 +2AA0 +5560 +9540 +ENDCHAR +STARTCHAR U_6BA7 +ENCODING 27559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFC0 +40A0 +7FE0 +5A80 +DE80 +B480 +14C0 +2EC0 +5540 +8E60 +ENDCHAR +STARTCHAR U_6BA8 +ENCODING 27560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4540 +7FE0 +5440 +D7C0 +B440 +27C0 +2440 +47C0 +8820 +ENDCHAR +STARTCHAR U_6BA9 +ENCODING 27561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +44A0 +7E40 +5AA0 +D5A0 +BB40 +2FE0 +2380 +4540 +9920 +ENDCHAR +STARTCHAR U_6BAA +ENCODING 27562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +4FE0 +7820 +57C0 +D000 +37C0 +1440 +27C0 +4280 +8FE0 +ENDCHAR +STARTCHAR U_6BAB +ENCODING 27563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +4AA0 +4FE0 +7540 +57C0 +D540 +37C0 +1100 +2FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_6BAC +ENCODING 27564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2AA0 +2FE0 +7900 +4FE0 +AA80 +17C0 +1100 +2FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_6BAD +ENCODING 27565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4540 +47C0 +7540 +5FE0 +D000 +37C0 +1540 +27C0 +4540 +9FE0 +ENDCHAR +STARTCHAR U_6BAE +ENCODING 27566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4280 +4440 +7FE0 +5000 +5EE0 +B2A0 +1EE0 +2440 +4AA0 +9120 +ENDCHAR +STARTCHAR U_6BAF +ENCODING 27567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +4FE0 +4820 +77C0 +5540 +57C0 +BC40 +17C0 +2440 +47C0 +8C60 +ENDCHAR +STARTCHAR U_6BB0 +ENCODING 27568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +4FE0 +7AA0 +5FE0 +D440 +3740 +15C0 +2440 +47C0 +8C60 +ENDCHAR +STARTCHAR U_6BB1 +ENCODING 27569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FEC0 +44A0 +7FE0 +AA80 +7BA0 +2AA0 +3B80 +4AA0 +8F60 +3020 +ENDCHAR +STARTCHAR U_6BB2 +ENCODING 27570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAC0 +55A0 +5FE0 +6A80 +BB80 +AAA0 +7BA0 +2A40 +3B60 +4AA0 +9F20 +ENDCHAR +STARTCHAR U_6BB3 +ENCODING 27571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +1100 +20E0 +C000 +3F80 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_6BB4 +ENCODING 27572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8240 +8A60 +CC00 +B3E0 +9240 +AA40 +C980 +8180 +FE40 +0420 +ENDCHAR +STARTCHAR U_6BB5 +ENCODING 27573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +6280 +4280 +74E0 +4000 +77C0 +4440 +4280 +F100 +4280 +4C60 +ENDCHAR +STARTCHAR U_6BB6 +ENCODING 27574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +2460 +2000 +FFE0 +2240 +2140 +3980 +E240 +4420 +ENDCHAR +STARTCHAR U_6BB7 +ENCODING 27575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +4140 +7D40 +4660 +7C00 +47E0 +7D40 +4140 +7C80 +8540 +9A20 +ENDCHAR +STARTCHAR U_6BB8 +ENCODING 27576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +1140 +7D60 +0200 +7FE0 +5640 +7D40 +4080 +4140 +8620 +ENDCHAR +STARTCHAR U_6BB9 +ENCODING 27577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +A280 +BA80 +D2E0 +9400 +FBC0 +9240 +AA80 +C100 +FAE0 +0440 +ENDCHAR +STARTCHAR U_6BBA +ENCODING 27578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D9C0 +2140 +D940 +3220 +2800 +FBE0 +2140 +7140 +A880 +2940 +6220 +ENDCHAR +STARTCHAR U_6BBB +ENCODING 27579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +7260 +0400 +FBC0 +8A40 +7140 +5480 +5940 +9620 +ENDCHAR +STARTCHAR U_6BBC +ENCODING 27580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +1140 +FF60 +8400 +7BE0 +0140 +7940 +4A80 +4D40 +8220 +ENDCHAR +STARTCHAR U_6BBD +ENCODING 27581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CDC0 +3140 +4940 +FE60 +4000 +7BE0 +C940 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_6BBE +ENCODING 27582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +7680 +2A80 +FCE0 +1400 +7FC0 +CA40 +7A80 +4900 +4AE0 +7C40 +ENDCHAR +STARTCHAR U_6BBF +ENCODING 27583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8540 +FD40 +8260 +A800 +FFE0 +A940 +FD40 +9880 +A540 +C620 +ENDCHAR +STARTCHAR U_6BC0 +ENCODING 27584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +59C0 +8940 +D940 +8A60 +FC00 +23E0 +2140 +F940 +2080 +3940 +C620 +ENDCHAR +STARTCHAR U_6BC1 +ENCODING 27585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EDC0 +8540 +DD40 +8560 +FE00 +03C0 +FD40 +1140 +1080 +1D40 +E220 +ENDCHAR +STARTCHAR U_6BC2 +ENCODING 27586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FF60 +9200 +FFE0 +5140 +7D40 +1080 +FD40 +1220 +ENDCHAR +STARTCHAR U_6BC3 +ENCODING 27587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +4940 +7960 +0200 +FFE0 +8220 +BB40 +AA80 +BB40 +8E20 +ENDCHAR +STARTCHAR U_6BC4 +ENCODING 27588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +A940 +FB60 +A800 +FBE0 +2140 +FD40 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_6BC5 +ENCODING 27589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +2940 +FE60 +2000 +57E0 +A940 +5D40 +AA80 +4940 +9220 +ENDCHAR +STARTCHAR U_6BC6 +ENCODING 27590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8140 +B940 +AA60 +B800 +81E0 +EE40 +AB40 +EE80 +8140 +FE20 +ENDCHAR +STARTCHAR U_6BC7 +ENCODING 27591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4DC0 +8540 +ED40 +8760 +FC00 +93E0 +5540 +FF40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_6BC8 +ENCODING 27592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DEE0 +AAA0 +ABA0 +EA00 +AEE0 +ABA0 +AAA0 +EEA0 +2B40 +4AA0 +8B20 +ENDCHAR +STARTCHAR U_6BC9 +ENCODING 27593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9160 +FA00 +93C0 +A940 +FC80 +0140 +7FC0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_6BCA +ENCODING 27594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FE60 +13C0 +7D40 +5480 +7FC0 +5140 +9120 +7FC0 +5140 +5F40 +ENDCHAR +STARTCHAR U_6BCB +ENCODING 27595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +2480 +FFE0 +2480 +2480 +7FE0 +0880 +1080 +2300 +ENDCHAR +STARTCHAR U_6BCC +ENCODING 27596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +3F80 +2480 +2480 +2480 +FFE0 +4880 +4880 +4880 +7F80 +0080 +ENDCHAR +STARTCHAR U_6BCD +ENCODING 27597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2480 +2080 +FFE0 +2880 +2480 +2080 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_6BCE +ENCODING 27598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +2480 +FFE0 +2480 +4880 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_6BCF +ENCODING 27599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +9F80 +1480 +FFE0 +2480 +2280 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_6BD0 +ENCODING 27600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +2480 +2480 +FFE0 +4880 +7FE0 +1080 +6300 +ENDCHAR +STARTCHAR U_6BD1 +ENCODING 27601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +6AE0 +5FA0 +FAA0 +4AA0 +6AE0 +5A80 +7A20 +29E0 +1000 +ENDCHAR +STARTCHAR U_6BD2 +ENCODING 27602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +FFE0 +4480 +7FE0 +0300 +ENDCHAR +STARTCHAR U_6BD3 +ENCODING 27603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +8100 +FA40 +ABA0 +A800 +FEA0 +AAA0 +AAA0 +FAA0 +1420 +ENDCHAR +STARTCHAR U_6BD4 +ENCODING 27604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8400 +8400 +8480 +8500 +F600 +8400 +8400 +8400 +B440 +C440 +83C0 +ENDCHAR +STARTCHAR U_6BD5 +ENCODING 27605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4240 +7B80 +4220 +4A20 +71E0 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_6BD6 +ENCODING 27606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A80 +4320 +5A20 +E3E0 +0480 +5300 +5240 +94A0 +18A0 +EF80 +ENDCHAR +STARTCHAR U_6BD7 +ENCODING 27607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +AA80 +AAA0 +FBC0 +AA80 +AA80 +AA80 +FAA0 +8BA0 +02E0 +ENDCHAR +STARTCHAR U_6BD8 +ENCODING 27608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +4240 +7A80 +4320 +FA20 +43E0 +ENDCHAR +STARTCHAR U_6BD9 +ENCODING 27609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7B80 +4220 +FBE0 +0000 +FFE0 +2240 +7A80 +CB20 +3220 +E1E0 +ENDCHAR +STARTCHAR U_6BDA +ENCODING 27610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E00 +2400 +FF80 +4080 +7FA0 +4220 +7FE0 +2480 +7F80 +0CA0 +F3E0 +ENDCHAR +STARTCHAR U_6BDB +ENCODING 27611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +0780 +7C00 +0400 +07E0 +FC00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_6BDC +ENCODING 27612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +6080 +2080 +3880 +E1C0 +2AA0 +34A0 +E880 +22A0 +2120 +1FE0 +ENDCHAR +STARTCHAR U_6BDD +ENCODING 27613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E040 +2080 +3B40 +E080 +2320 +3840 +E080 +2F20 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BDE +ENCODING 27614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7B80 +4220 +79E0 +0380 +3C00 +0780 +7C00 +07A0 +FC20 +07E0 +ENDCHAR +STARTCHAR U_6BDF +ENCODING 27615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1500 +2480 +C560 +0600 +7C00 +0780 +3C00 +07C0 +7C20 +03E0 +ENDCHAR +STARTCHAR U_6BE0 +ENCODING 27616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2BE0 +4A20 +9FC0 +0400 +7FC0 +0400 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_6BE1 +ENCODING 27617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +2DE0 +F100 +27E0 +2C20 +F420 +27E0 +2420 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BE2 +ENCODING 27618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E280 +4FE0 +5AA0 +EAA0 +4CE0 +5820 +EFE0 +4820 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BE3 +ENCODING 27619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +18C0 +E940 +3F80 +0800 +7F80 +0800 +FFA0 +0820 +07E0 +ENDCHAR +STARTCHAR U_6BE4 +ENCODING 27620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +4700 +91C0 +2300 +49C0 +FF00 +0120 +2920 +28E0 +4820 +87E0 +ENDCHAR +STARTCHAR U_6BE5 +ENCODING 27621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A00 +E3E0 +2420 +3BA0 +E2A0 +23A0 +3AA0 +E3A0 +2040 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BE6 +ENCODING 27622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +4B80 +4900 +7900 +4BC0 +7900 +4900 +4BC0 +FD20 +0920 +08E0 +ENDCHAR +STARTCHAR U_6BE7 +ENCODING 27623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +30C0 +C0A0 +4FE0 +44A0 +F4C0 +4FA0 +44A0 +F560 +4A00 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BE8 +ENCODING 27624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +F280 +23E0 +2480 +FBE0 +2140 +2140 +FA60 +2400 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BE9 +ENCODING 27625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6540 +2380 +3900 +E7E0 +2100 +3B80 +E540 +2940 +2120 +1FE0 +ENDCHAR +STARTCHAR U_6BEA +ENCODING 27626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F240 +27A0 +2280 +FBC0 +2480 +27E0 +F880 +20A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BEB +ENCODING 27627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +8220 +3C00 +0780 +3C00 +07A0 +7C20 +07E0 +ENDCHAR +STARTCHAR U_6BEC +ENCODING 27628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E0A0 +27E0 +2080 +FCA0 +23C0 +22C0 +FCA0 +2180 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BED +ENCODING 27629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FB00 +0100 +79E0 +4B00 +49E0 +7B00 +4900 +2920 +3D20 +C0E0 +ENDCHAR +STARTCHAR U_6BEE +ENCODING 27630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2920 +F1A0 +2E80 +3700 +E1C0 +2700 +21C0 +AF20 +40E0 +ENDCHAR +STARTCHAR U_6BEF +ENCODING 27631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F2C0 +2480 +2140 +FAA0 +22E0 +2480 +F980 +2260 +2420 +1FE0 +ENDCHAR +STARTCHAR U_6BF0 +ENCODING 27632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F7E0 +2220 +2140 +FFE0 +2000 +23C0 +FA40 +23E0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BF1 +ENCODING 27633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +37C0 +CAC0 +4740 +7240 +CFC0 +7340 +C6C0 +4A40 +40A0 +3FE0 +ENDCHAR +STARTCHAR U_6BF2 +ENCODING 27634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +ABC0 +4480 +AA80 +ABE0 +FE80 +AA80 +ABE0 +4480 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_6BF3 +ENCODING 27635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +7FA0 +0820 +FFE0 +2100 +FFE0 +2100 +FFE0 +2120 +38E0 +ENDCHAR +STARTCHAR U_6BF4 +ENCODING 27636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +E280 +26E0 +3A80 +E6E0 +3A80 +E6E0 +2280 +22A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BF5 +ENCODING 27637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +4BC0 +FC80 +1080 +FFE0 +A480 +4880 +93E0 +6880 +10A0 +6060 +ENDCHAR +STARTCHAR U_6BF6 +ENCODING 27638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +C240 +47C0 +7100 +CFE0 +7240 +CCA0 +4740 +40A0 +4720 +3FE0 +ENDCHAR +STARTCHAR U_6BF7 +ENCODING 27639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +87C0 +FC80 +84E0 +FF80 +4880 +78E0 +4B80 +7880 +48A0 +7860 +ENDCHAR +STARTCHAR U_6BF8 +ENCODING 27640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E540 +47C0 +4540 +F7C0 +4100 +46A0 +FA20 +4BC0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BF9 +ENCODING 27641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39E0 +4480 +BA80 +01E0 +EA80 +AA80 +EBE0 +AA80 +EAA0 +A2A0 +A660 +ENDCHAR +STARTCHAR U_6BFA +ENCODING 27642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +C180 +4240 +75A0 +C800 +4EA0 +7AA0 +CEA0 +4A40 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6BFB +ENCODING 27643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FF80 +2080 +7C80 +93E0 +7C80 +4480 +7FE0 +4480 +7CA0 +4C60 +ENDCHAR +STARTCHAR U_6BFC +ENCODING 27644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +8B80 +F880 +88E0 +FB80 +4080 +FCE0 +A780 +D4A0 +F4A0 +1860 +ENDCHAR +STARTCHAR U_6BFD +ENCODING 27645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E4A0 +25E0 +2CA0 +F7E0 +2C80 +27E0 +F480 +2BE0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_6BFE +ENCODING 27646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4780 +7C80 +44E0 +7F80 +0080 +FCE0 +B780 +6CA0 +B4A0 +6C60 +ENDCHAR +STARTCHAR U_6BFF +ENCODING 27647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4860 +FF80 +4880 +B4E0 +DF80 +3080 +48E0 +A780 +54A0 +A8A0 +3060 +ENDCHAR +STARTCHAR U_6C00 +ENCODING 27648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7D80 +D680 +7CE0 +1380 +7C80 +54E0 +FF80 +2480 +38A0 +6460 +ENDCHAR +STARTCHAR U_6C01 +ENCODING 27649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +4280 +47C0 +F440 +47C0 +4440 +FFE0 +4280 +4460 +3FE0 +ENDCHAR +STARTCHAR U_6C02 +ENCODING 27650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +11E0 +FEA0 +5440 +92A0 +3FE0 +2300 +3E00 +2380 +5E20 +83E0 +ENDCHAR +STARTCHAR U_6C03 +ENCODING 27651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FF80 +2880 +10E0 +FF80 +5480 +7CE0 +5780 +FEA0 +10A0 +FE60 +ENDCHAR +STARTCHAR U_6C04 +ENCODING 27652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +2B80 +FC80 +54E0 +9380 +FC80 +B4E0 +CF80 +BCA0 +A4A0 +BC60 +ENDCHAR +STARTCHAR U_6C05 +ENCODING 27653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FFE0 +82A0 +BA40 +AAA0 +7FA0 +07C0 +7C00 +07C0 +7C20 +07E0 +ENDCHAR +STARTCHAR U_6C06 +ENCODING 27654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +4AA0 +46C0 +FFE0 +4440 +47C0 +F440 +47C0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6C07 +ENCODING 27655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +E480 +4FC0 +4540 +F7C0 +4D60 +47C0 +F440 +47C0 +4460 +3FE0 +ENDCHAR +STARTCHAR U_6C08 +ENCODING 27656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +FF80 +AA80 +BAE0 +8380 +FE80 +48E0 +7B80 +48A0 +48A0 +FC60 +ENDCHAR +STARTCHAR U_6C09 +ENCODING 27657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4880 +FCE0 +B780 +FC80 +10E0 +FF80 +38A0 +54A0 +9260 +ENDCHAR +STARTCHAR U_6C0A +ENCODING 27658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +DFE0 +4A40 +FBC0 +4840 +4FC0 +F480 +44A0 +4FE0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_6C0B +ENCODING 27659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2860 +FF80 +2880 +FEE0 +8380 +7C80 +A8E0 +5980 +2CA0 +CAA0 +3160 +ENDCHAR +STARTCHAR U_6C0C +ENCODING 27660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +E480 +4FC0 +4540 +77C0 +CAA0 +47C0 +7440 +C7C0 +4460 +3FE0 +ENDCHAR +STARTCHAR U_6C0D +ENCODING 27661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE60 +9380 +FE80 +92E0 +FF80 +2880 +7EE0 +C980 +7EA0 +48A0 +7E60 +ENDCHAR +STARTCHAR U_6C0E +ENCODING 27662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +5580 +FE80 +ABE0 +FE80 +2080 +FFE0 +A280 +7CA0 +28A0 +FE60 +ENDCHAR +STARTCHAR U_6C0F +ENCODING 27663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0300 +FC00 +8800 +8800 +FFC0 +8800 +8800 +8400 +A440 +C240 +81C0 +ENDCHAR +STARTCHAR U_6C10 +ENCODING 27664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0300 +FC00 +8800 +8800 +FFC0 +8400 +8400 +9200 +A240 +D140 +88C0 +ENDCHAR +STARTCHAR U_6C11 +ENCODING 27665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8080 +8080 +FF80 +8800 +8800 +FFC0 +8400 +9440 +A240 +C1C0 +ENDCHAR +STARTCHAR U_6C12 +ENCODING 27666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +4240 +7FE0 +4900 +50A0 +6460 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_6C13 +ENCODING 27667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +2420 +FFE0 +4480 +47E0 +4480 +4480 +7CA0 +0560 +0620 +ENDCHAR +STARTCHAR U_6C14 +ENCODING 27668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2000 +5F80 +8000 +3F00 +0100 +0120 +0120 +00A0 +0060 +ENDCHAR +STARTCHAR U_6C15 +ENCODING 27669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +5F80 +8000 +3F80 +0080 +08A0 +08A0 +1060 +6020 +ENDCHAR +STARTCHAR U_6C16 +ENCODING 27670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +4000 +BF80 +0080 +7E80 +1480 +16A0 +22A0 +4260 +8C20 +ENDCHAR +STARTCHAR U_6C17 +ENCODING 27671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2000 +5FC0 +8000 +7F80 +0280 +2480 +18A0 +2660 +4220 +ENDCHAR +STARTCHAR U_6C18 +ENCODING 27672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3FE0 +4000 +9F80 +0000 +3F80 +0080 +2480 +24A0 +2460 +4420 +ENDCHAR +STARTCHAR U_6C19 +ENCODING 27673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +0000 +7F80 +1080 +9280 +92A0 +FE60 +8220 +ENDCHAR +STARTCHAR U_6C1A +ENCODING 27674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +4000 +BF80 +0000 +7F80 +0080 +2A80 +2AA0 +2A60 +4220 +ENDCHAR +STARTCHAR U_6C1B +ENCODING 27675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +FF80 +1480 +2280 +4180 +BEA0 +12A0 +2260 +4C20 +ENDCHAR +STARTCHAR U_6C1C +ENCODING 27676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +0000 +FF80 +2280 +3E80 +22A0 +2260 +3E20 +ENDCHAR +STARTCHAR U_6C1D +ENCODING 27677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +8000 +FF80 +1080 +FE80 +9280 +9280 +AAA0 +C660 +8620 +ENDCHAR +STARTCHAR U_6C1E +ENCODING 27678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +8000 +FF80 +0080 +FE80 +1080 +FE80 +92A0 +AA60 +8620 +ENDCHAR +STARTCHAR U_6C1F +ENCODING 27679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +8000 +7F80 +2880 +7E80 +2A80 +FF80 +29A0 +4B60 +8820 +ENDCHAR +STARTCHAR U_6C20 +ENCODING 27680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +0880 +3E80 +2A80 +3EA0 +2AA0 +3E60 +0820 +ENDCHAR +STARTCHAR U_6C21 +ENCODING 27681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +2280 +5480 +0880 +F780 +08A0 +2460 +1820 +ENDCHAR +STARTCHAR U_6C22 +ENCODING 27682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4000 +BF80 +0080 +7E80 +0C80 +13A0 +FEA0 +0860 +7F20 +ENDCHAR +STARTCHAR U_6C23 +ENCODING 27683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4000 +BF80 +0080 +4980 +2A80 +FFA0 +1CA0 +2A60 +C920 +ENDCHAR +STARTCHAR U_6C24 +ENCODING 27684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FE80 +9280 +FE80 +9280 +AAA0 +FE60 +8220 +ENDCHAR +STARTCHAR U_6C25 +ENCODING 27685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FE80 +2880 +FE80 +AAA0 +EEA0 +8260 +FE20 +ENDCHAR +STARTCHAR U_6C26 +ENCODING 27686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +1080 +FE80 +2480 +7880 +1480 +68A0 +1460 +E320 +ENDCHAR +STARTCHAR U_6C27 +ENCODING 27687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +4480 +2880 +FE80 +1080 +7CA0 +10A0 +FE60 +1020 +ENDCHAR +STARTCHAR U_6C28 +ENCODING 27688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +1080 +FE80 +9280 +FF80 +2480 +38A0 +1660 +E120 +ENDCHAR +STARTCHAR U_6C29 +ENCODING 27689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +BF80 +0080 +FF80 +2880 +A980 +6A80 +28A0 +2860 +FF20 +ENDCHAR +STARTCHAR U_6C2A +ENCODING 27690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0880 +7E80 +0880 +3E80 +2280 +3EA0 +1560 +E720 +ENDCHAR +STARTCHAR U_6C2B +ENCODING 27691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FE80 +5480 +A880 +5480 +FEA0 +1060 +FF20 +ENDCHAR +STARTCHAR U_6C2C +ENCODING 27692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +FF80 +2880 +EE80 +8280 +EEA0 +2860 +FF20 +ENDCHAR +STARTCHAR U_6C2D +ENCODING 27693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +8000 +7F80 +2A80 +3E80 +2A80 +3E80 +1CA0 +2A60 +C920 +ENDCHAR +STARTCHAR U_6C2E +ENCODING 27694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +1280 +5480 +A880 +5480 +9280 +5480 +A8A0 +C660 +ENDCHAR +STARTCHAR U_6C2F +ENCODING 27695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +BF80 +0280 +3E80 +0280 +FF80 +4A80 +2CA0 +4A60 +9920 +ENDCHAR +STARTCHAR U_6C30 +ENCODING 27696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4000 +BF80 +1080 +7E80 +1080 +FF80 +42A0 +7AA0 +5E60 +4220 +ENDCHAR +STARTCHAR U_6C31 +ENCODING 27697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +8000 +FF80 +2480 +3C80 +2480 +7E80 +AAA0 +5260 +2420 +ENDCHAR +STARTCHAR U_6C32 +ENCODING 27698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +4000 +BF80 +0080 +7C80 +4480 +7C80 +4480 +FEA0 +AA60 +FF20 +ENDCHAR +STARTCHAR U_6C33 +ENCODING 27699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +BF80 +0080 +7C80 +5480 +5480 +6C80 +FEA0 +AA60 +FF20 +ENDCHAR +STARTCHAR U_6C34 +ENCODING 27700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0440 +F680 +1500 +1500 +2480 +2480 +4440 +9420 +0800 +ENDCHAR +STARTCHAR U_6C35 +ENCODING 27701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 11 0 -1 +BITMAP +40 +20 +00 +80 +50 +10 +20 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR U_6C36 +ENCODING 27702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0200 +0400 +04C0 +7500 +1600 +1500 +2500 +2480 +5460 +8800 +ENDCHAR +STARTCHAR U_6C37 +ENCODING 27703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4400 +2400 +04C0 +F500 +1600 +1500 +2480 +4460 +9440 +0800 +ENDCHAR +STARTCHAR U_6C38 +ENCODING 27704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3C40 +0480 +F500 +1600 +2500 +2480 +4460 +9400 +0800 +ENDCHAR +STARTCHAR U_6C39 +ENCODING 27705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +1120 +1D40 +2580 +2540 +4920 +9120 +8500 +8220 +7FE0 +ENDCHAR +STARTCHAR U_6C3A +ENCODING 27706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +0400 +4440 +2480 +2500 +1600 +2500 +C4C0 +0440 +1400 +0800 +ENDCHAR +STARTCHAR U_6C3B +ENCODING 27707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +1100 +97E0 +5120 +2120 +2120 +C220 +4420 +4920 +50C0 +ENDCHAR +STARTCHAR U_6C3C +ENCODING 27708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7580 +1600 +2500 +D480 +0860 +0400 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_6C3D +ENCODING 27709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +0900 +3080 +C260 +0200 +7B20 +0B40 +1280 +2240 +CA20 +0400 +ENDCHAR +STARTCHAR U_6C3E +ENCODING 27710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +0440 +8440 +4C40 +1440 +1580 +E400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_6C3F +ENCODING 27711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0F80 +9280 +5280 +2280 +2280 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C40 +ENCODING 27712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +2100 +8100 +4100 +2100 +2100 +C100 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_6C41 +ENCODING 27713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5100 +1FE0 +2100 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C42 +ENCODING 27714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +0440 +FFE0 +0400 +2480 +1500 +0E00 +1500 +2480 +C460 +0C00 +ENDCHAR +STARTCHAR U_6C43 +ENCODING 27715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2480 +8480 +5480 +1480 +2480 +2480 +C840 +4840 +5020 +5020 +ENDCHAR +STARTCHAR U_6C44 +ENCODING 27716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2200 +8200 +4200 +1200 +2500 +C500 +4880 +4860 +5040 +ENDCHAR +STARTCHAR U_6C45 +ENCODING 27717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8200 +4200 +5400 +27C0 +2040 +C040 +4040 +4280 +4100 +ENDCHAR +STARTCHAR U_6C46 +ENCODING 27718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +1200 +2580 +C460 +0440 +7E80 +1500 +1500 +2480 +5460 +8820 +ENDCHAR +STARTCHAR U_6C47 +ENCODING 27719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +8400 +5400 +1400 +2400 +2400 +C400 +4400 +4400 +47E0 +ENDCHAR +STARTCHAR U_6C48 +ENCODING 27720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +0020 +8020 +50A0 +2120 +2220 +CC20 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6C49 +ENCODING 27721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2FE0 +8440 +5440 +1440 +2280 +2280 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C4A +ENCODING 27722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2FE0 +8440 +5540 +1540 +2280 +2280 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6C4B +ENCODING 27723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +87E0 +5420 +1A20 +2120 +2120 +C020 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6C4C +ENCODING 27724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +22A0 +82A0 +52A0 +12A0 +22A0 +22A0 +C2A0 +44A0 +44A0 +4820 +ENDCHAR +STARTCHAR U_6C4D +ENCODING 27725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8F80 +5280 +1280 +2680 +2380 +C2A0 +44A0 +4860 +5020 +ENDCHAR +STARTCHAR U_6C4E +ENCODING 27726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8480 +4480 +1680 +2580 +2480 +C480 +44A0 +48A0 +50E0 +ENDCHAR +STARTCHAR U_6C4F +ENCODING 27727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5FE0 +1100 +2100 +2100 +C280 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6C50 +ENCODING 27728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +83E0 +5220 +1420 +2A40 +2140 +C080 +4100 +4600 +5800 +ENDCHAR +STARTCHAR U_6C51 +ENCODING 27729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8200 +4200 +03E0 +2E00 +2200 +C200 +4220 +4220 +41E0 +ENDCHAR +STARTCHAR U_6C52 +ENCODING 27730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5400 +1400 +2400 +2400 +C400 +4400 +4400 +47E0 +ENDCHAR +STARTCHAR U_6C53 +ENCODING 27731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +8080 +4100 +5100 +2FE0 +2100 +C100 +4100 +4500 +4200 +ENDCHAR +STARTCHAR U_6C54 +ENCODING 27732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +8400 +5800 +17C0 +2080 +2100 +C200 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6C55 +ENCODING 27733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +4920 +1920 +2920 +2920 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6C56 +ENCODING 27734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +0440 +7580 +1600 +2580 +C460 +1440 +0800 +ENDCHAR +STARTCHAR U_6C57 +ENCODING 27735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +8100 +5100 +1FE0 +2100 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C58 +ENCODING 27736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8200 +5200 +2200 +3FE0 +C200 +4200 +4200 +4200 +0200 +ENDCHAR +STARTCHAR U_6C59 +ENCODING 27737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +8100 +4100 +1FE0 +2100 +2100 +C100 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_6C5A +ENCODING 27738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8200 +4200 +5FE0 +2400 +27C0 +C040 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_6C5B +ENCODING 27739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2FC0 +8480 +5480 +1480 +2F80 +2480 +C4A0 +44A0 +4460 +4420 +ENDCHAR +STARTCHAR U_6C5C +ENCODING 27740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +5440 +17C0 +2440 +2400 +C400 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6C5D +ENCODING 27741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0200 +9FE0 +5480 +2480 +2880 +CD00 +4300 +44C0 +5820 +ENDCHAR +STARTCHAR U_6C5E +ENCODING 27742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +FFE0 +0400 +7C40 +1680 +1500 +2480 +5460 +8820 +ENDCHAR +STARTCHAR U_6C5F +ENCODING 27743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +8100 +5100 +1100 +2100 +2100 +C100 +4100 +5FE0 +4000 +ENDCHAR +STARTCHAR U_6C60 +ENCODING 27744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +8500 +55C0 +1740 +2D40 +2540 +C5C0 +4520 +4420 +43E0 +ENDCHAR +STARTCHAR U_6C61 +ENCODING 27745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2000 +8000 +5FE0 +1400 +2400 +27C0 +C040 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_6C62 +ENCODING 27746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0200 +9200 +5FC0 +2200 +4200 +C200 +4200 +5FE0 +4000 +ENDCHAR +STARTCHAR U_6C63 +ENCODING 27747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +07C0 +8440 +4840 +2080 +4080 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C64 +ENCODING 27748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2080 +8100 +5200 +17E0 +22A0 +24A0 +C920 +4220 +44A0 +4840 +ENDCHAR +STARTCHAR U_6C65 +ENCODING 27749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5100 +1FE0 +2440 +2280 +C100 +4380 +4460 +5820 +ENDCHAR +STARTCHAR U_6C66 +ENCODING 27750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +8900 +4900 +1FE0 +2900 +2900 +C920 +4AA0 +4C60 +4820 +ENDCHAR +STARTCHAR U_6C67 +ENCODING 27751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2480 +8480 +5480 +1FE0 +2480 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6C68 +ENCODING 27752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +8420 +5420 +17E0 +2420 +2420 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6C69 +ENCODING 27753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +8FE0 +4820 +0820 +2FA0 +2820 +C820 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6C6A +ENCODING 27754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +8100 +5100 +1100 +27C0 +2100 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6C6B +ENCODING 27755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +9FE0 +4480 +2480 +2FE0 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6C6C +ENCODING 27756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FC0 +0900 +FFE0 +1100 +6500 +0400 +76C0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6C6D +ENCODING 27757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0FE0 +9920 +5920 +2AA0 +2C60 +C820 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_6C6E +ENCODING 27758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07E0 +8820 +6420 +32A0 +2120 +C220 +4C20 +4020 +40C0 +ENDCHAR +STARTCHAR U_6C6F +ENCODING 27759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FE0 +5200 +1200 +2480 +2480 +C900 +4940 +5220 +67E0 +ENDCHAR +STARTCHAR U_6C70 +ENCODING 27760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5FE0 +1100 +2100 +2280 +C280 +4640 +4940 +5020 +ENDCHAR +STARTCHAR U_6C71 +ENCODING 27761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2280 +8240 +5FE0 +1200 +2200 +2200 +C500 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_6C72 +ENCODING 27762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +2440 +8480 +55C0 +1440 +2440 +2640 +C980 +4900 +5280 +6C60 +ENDCHAR +STARTCHAR U_6C73 +ENCODING 27763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2700 +8400 +5400 +17E0 +2420 +2640 +C940 +4880 +5140 +6620 +ENDCHAR +STARTCHAR U_6C74 +ENCODING 27764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5100 +1100 +2180 +2140 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C75 +ENCODING 27765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2500 +8880 +5260 +2100 +2FC0 +4080 +C100 +4100 +4200 +ENDCHAR +STARTCHAR U_6C76 +ENCODING 27766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5440 +1440 +2280 +2280 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C77 +ENCODING 27767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +03C0 +8440 +5440 +2A80 +4280 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6C78 +ENCODING 27768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5200 +13C0 +2240 +2240 +C440 +4440 +4940 +5080 +ENDCHAR +STARTCHAR U_6C79 +ENCODING 27769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +28A0 +8CA0 +5AA0 +1920 +2920 +2AA0 +CA60 +4C20 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6C7A +ENCODING 27770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FC0 +5240 +1240 +2FE0 +2200 +C300 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_6C7B +ENCODING 27771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8900 +5100 +1100 +2FE0 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C7C +ENCODING 27772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8900 +4FC0 +1100 +2100 +2FE0 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C7D +ENCODING 27773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8800 +57C0 +1000 +2F80 +2080 +C080 +40A0 +4060 +4020 +ENDCHAR +STARTCHAR U_6C7E +ENCODING 27774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8440 +4820 +17E0 +2240 +2240 +C240 +4440 +4540 +4880 +ENDCHAR +STARTCHAR U_6C7F +ENCODING 27775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +0280 +8100 +5FE0 +2120 +4100 +C100 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6C80 +ENCODING 27776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1020 +1540 +F880 +3BE0 +38A0 +5480 +5480 +9280 +1080 +3180 +ENDCHAR +STARTCHAR U_6C81 +ENCODING 27777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +8280 +5200 +1240 +2A20 +2A20 +D200 +4220 +4220 +41E0 +ENDCHAR +STARTCHAR U_6C82 +ENCODING 27778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +8400 +5400 +17E0 +2480 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6C83 +ENCODING 27779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2E00 +8200 +5200 +1FE0 +2200 +2200 +C500 +4500 +4880 +7060 +ENDCHAR +STARTCHAR U_6C84 +ENCODING 27780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +8000 +5000 +1000 +2FE0 +2200 +C200 +4440 +4FE0 +4420 +ENDCHAR +STARTCHAR U_6C85 +ENCODING 27781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +8000 +5FE0 +1280 +2280 +2280 +C280 +44A0 +44A0 +4860 +ENDCHAR +STARTCHAR U_6C86 +ENCODING 27782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5000 +1780 +2480 +2480 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C87 +ENCODING 27783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2480 +8840 +5FE0 +1020 +2480 +2480 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C88 +ENCODING 27784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FE0 +4A40 +1200 +2300 +2500 +C500 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6C89 +ENCODING 27785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8000 +5780 +1480 +2480 +2480 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6C8A +ENCODING 27786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F920 +AF40 +2380 +2540 +3540 +3920 +5300 +5020 +8FE0 +ENDCHAR +STARTCHAR U_6C8B +ENCODING 27787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FE0 +5200 +1300 +2300 +2500 +C500 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6C8C +ENCODING 27788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5100 +1920 +2920 +2FE0 +C100 +4120 +4120 +40E0 +ENDCHAR +STARTCHAR U_6C8D +ENCODING 27789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +8200 +43E0 +1440 +2440 +2440 +CFC0 +4080 +4080 +5FE0 +ENDCHAR +STARTCHAR U_6C8E +ENCODING 27790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +8920 +5920 +2940 +2980 +2900 +CB00 +4D20 +4920 +48E0 +ENDCHAR +STARTCHAR U_6C8F +ENCODING 27791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2BE0 +88A0 +5EA0 +28A0 +28A0 +2AA0 +DCA0 +4920 +42A0 +4440 +ENDCHAR +STARTCHAR U_6C90 +ENCODING 27792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5FE0 +1380 +2380 +2540 +C540 +4920 +5120 +4100 +ENDCHAR +STARTCHAR U_6C91 +ENCODING 27793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +8240 +4240 +5240 +2FC0 +2440 +C440 +4440 +4440 +5FE0 +ENDCHAR +STARTCHAR U_6C92 +ENCODING 27794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +8440 +5940 +1080 +27C0 +2440 +C280 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6C93 +ENCODING 27795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7580 +1600 +2500 +CCC0 +0000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_6C94 +ENCODING 27796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8100 +59E0 +1920 +2920 +2FE0 +C020 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6C95 +ENCODING 27797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +87E0 +4AA0 +12A0 +24A0 +2920 +D120 +4220 +4CA0 +4040 +ENDCHAR +STARTCHAR U_6C96 +ENCODING 27798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5920 +1920 +2FE0 +2920 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6C97 +ENCODING 27799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +2480 +E4E0 +1500 +0E00 +1500 +64C0 +0C40 +ENDCHAR +STARTCHAR U_6C98 +ENCODING 27800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2900 +8920 +4940 +1F80 +2900 +2900 +C900 +4B20 +4D20 +48E0 +ENDCHAR +STARTCHAR U_6C99 +ENCODING 27801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8540 +4520 +1520 +2900 +2120 +C040 +4080 +4300 +5C00 +ENDCHAR +STARTCHAR U_6C9A +ENCODING 27802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8100 +5500 +15E0 +2500 +2500 +C500 +4500 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6C9B +ENCODING 27803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1920 +2920 +2920 +C920 +4960 +4100 +4100 +ENDCHAR +STARTCHAR U_6C9C +ENCODING 27804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +8480 +57E0 +1400 +27C0 +2440 +C440 +4840 +4840 +5040 +ENDCHAR +STARTCHAR U_6C9D +ENCODING 27805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +10A0 +F7C0 +3980 +31C0 +5AC0 +56A0 +92A0 +14A0 +3180 +ENDCHAR +STARTCHAR U_6C9E +ENCODING 27806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2200 +8200 +4FC0 +1A40 +2A40 +4A40 +CA40 +4AC0 +4200 +4200 +ENDCHAR +STARTCHAR U_6C9F +ENCODING 27807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07E0 +9820 +5220 +2220 +2520 +CFA0 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6CA0 +ENCODING 27808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E80 +8A80 +4A80 +1A80 +2A80 +4A80 +CA40 +5240 +5220 +6220 +ENDCHAR +STARTCHAR U_6CA1 +ENCODING 27809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8480 +48E0 +1000 +2FC0 +2480 +4280 +C300 +4480 +5860 +ENDCHAR +STARTCHAR U_6CA2 +ENCODING 27810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FC0 +8840 +5840 +2FC0 +2A00 +4A00 +C900 +5100 +5080 +6060 +ENDCHAR +STARTCHAR U_6CA3 +ENCODING 27811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5100 +17C0 +2100 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6CA4 +ENCODING 27812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8840 +4A40 +1980 +2880 +2940 +CA20 +4C20 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6CA5 +ENCODING 27813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2480 +8480 +57E0 +14A0 +24A0 +24A0 +C920 +4920 +52A0 +6440 +ENDCHAR +STARTCHAR U_6CA6 +ENCODING 27814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2300 +8480 +5840 +1020 +2440 +2480 +C700 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6CA7 +ENCODING 27815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5820 +17C0 +2440 +2440 +C580 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6CA8 +ENCODING 27816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4FC0 +2840 +8CC0 +4AC0 +2940 +4940 +CAC0 +5440 +5020 +6020 +ENDCHAR +STARTCHAR U_6CA9 +ENCODING 27817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2500 +8100 +5FE0 +1120 +2120 +22A0 +C2A0 +4420 +4820 +50C0 +ENDCHAR +STARTCHAR U_6CAA +ENCODING 27818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +87E0 +5420 +1420 +27E0 +2400 +C400 +4400 +4800 +5000 +ENDCHAR +STARTCHAR U_6CAB +ENCODING 27819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +9FE0 +4200 +0FC0 +2200 +2700 +CA80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_6CAC +ENCODING 27820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FC0 +4200 +1FE0 +2200 +2700 +CA80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_6CAD +ENCODING 27821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +9FE0 +4200 +1700 +2700 +2A80 +D240 +6220 +4200 +4200 +ENDCHAR +STARTCHAR U_6CAE +ENCODING 27822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +5440 +17C0 +2440 +2440 +C7C0 +4440 +4440 +4FE0 +ENDCHAR +STARTCHAR U_6CAF +ENCODING 27823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +76C0 +1500 +2480 +CC60 +0000 +FFE0 +0800 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_6CB0 +ENCODING 27824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +8200 +5400 +27E0 +2C20 +5420 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CB1 +ENCODING 27825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5820 +1400 +24C0 +2700 +C400 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6CB2 +ENCODING 27826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +9000 +6200 +2BC0 +2E40 +3A40 +CAC0 +4A00 +4820 +47E0 +ENDCHAR +STARTCHAR U_6CB3 +ENCODING 27827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2040 +8040 +4F40 +0940 +2940 +2F40 +C040 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_6CB4 +ENCODING 27828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8500 +4880 +3260 +2500 +4A40 +C480 +4100 +4200 +4C00 +ENDCHAR +STARTCHAR U_6CB5 +ENCODING 27829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +0FE0 +8820 +5100 +2100 +4940 +D120 +4120 +4500 +4200 +ENDCHAR +STARTCHAR U_6CB6 +ENCODING 27830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +8000 +5FE0 +1100 +2580 +2540 +C920 +5120 +4100 +4300 +ENDCHAR +STARTCHAR U_6CB7 +ENCODING 27831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FE0 +5200 +13C0 +2240 +2640 +C580 +4980 +5240 +6420 +ENDCHAR +STARTCHAR U_6CB8 +ENCODING 27832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +9FC0 +4540 +3FC0 +5500 +5FE0 +C520 +4520 +49C0 +5100 +ENDCHAR +STARTCHAR U_6CB9 +ENCODING 27833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4920 +1920 +2920 +2FE0 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6CBA +ENCODING 27834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8920 +4920 +1FE0 +2920 +2920 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6CBB +ENCODING 27835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8200 +5440 +3FE0 +2020 +C7C0 +4440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6CBC +ENCODING 27836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2220 +8220 +5420 +18C0 +2000 +27E0 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CBD +ENCODING 27837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +9FE0 +4200 +1200 +2FC0 +2840 +C840 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_6CBE +ENCODING 27838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +83E0 +5200 +1200 +2FC0 +2840 +C840 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_6CBF +ENCODING 27839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8480 +5480 +1860 +2000 +2FC0 +C840 +4840 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6CC0 +ENCODING 27840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +87A0 +5020 +1720 +2520 +2520 +C720 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6CC1 +ENCODING 27841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8840 +5840 +1FC0 +2500 +2500 +C500 +4920 +4920 +50E0 +ENDCHAR +STARTCHAR U_6CC2 +ENCODING 27842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +4BA0 +1AA0 +2AA0 +2BA0 +C820 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_6CC3 +ENCODING 27843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +87E0 +4820 +17A0 +24A0 +24A0 +C7A0 +4020 +4020 +40C0 +ENDCHAR +STARTCHAR U_6CC4 +ENCODING 27844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2540 +8540 +5FE0 +1540 +2540 +2540 +C5C0 +4400 +4400 +47E0 +ENDCHAR +STARTCHAR U_6CC5 +ENCODING 27845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8920 +4920 +1920 +2920 +2AA0 +CC60 +4820 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6CC6 +ENCODING 27846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +87C0 +5900 +1100 +2FE0 +2100 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6CC7 +ENCODING 27847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2800 +9EE0 +4AA0 +1AA0 +2AA0 +2AA0 +CAA0 +4AA0 +5AE0 +64A0 +ENDCHAR +STARTCHAR U_6CC8 +ENCODING 27848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +0C80 +D500 +2300 +2480 +5A60 +C100 +4280 +4100 +4080 +ENDCHAR +STARTCHAR U_6CC9 +ENCODING 27849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2080 +3F80 +2080 +3F80 +04C0 +7700 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6CCA +ENCODING 27850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +87E0 +5420 +1420 +27E0 +2420 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CCB +ENCODING 27851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +8A80 +6880 +3FE0 +4880 +C880 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_6CCC +ENCODING 27852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +20A0 +8220 +5240 +1240 +2AA0 +2AA0 +D300 +4220 +4620 +49E0 +ENDCHAR +STARTCHAR U_6CCD +ENCODING 27853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5100 +1380 +2380 +2540 +C920 +57E0 +4100 +4100 +ENDCHAR +STARTCHAR U_6CCE +ENCODING 27854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +07E0 +8A00 +53C0 +2200 +2200 +C3E0 +4200 +4200 +4200 +ENDCHAR +STARTCHAR U_6CCF +ENCODING 27855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +8920 +4920 +0920 +2FE0 +2100 +C920 +4920 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6CD0 +ENCODING 27856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +2A80 +8BE0 +5CA0 +1AA0 +2AA0 +2AA0 +CEA0 +48A0 +4920 +4AC0 +ENDCHAR +STARTCHAR U_6CD1 +ENCODING 27857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +89E0 +5AA0 +1EA0 +24A0 +24A0 +CAA0 +5F20 +41A0 +4240 +ENDCHAR +STARTCHAR U_6CD2 +ENCODING 27858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +8A80 +5A80 +1A80 +2A80 +2A80 +CA40 +4AC0 +52A0 +5360 +ENDCHAR +STARTCHAR U_6CD3 +ENCODING 27859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +2240 +8240 +4E40 +0840 +2E80 +2280 +C2A0 +4320 +4BE0 +4420 +ENDCHAR +STARTCHAR U_6CD4 +ENCODING 27860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2440 +8FE0 +5440 +1440 +2440 +27C0 +C440 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_6CD5 +ENCODING 27861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07C0 +8100 +4100 +0FE0 +2100 +C200 +4440 +4FA0 +4420 +ENDCHAR +STARTCHAR U_6CD6 +ENCODING 27862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2CE0 +8AA0 +4AA0 +1AA0 +2AA0 +2AA0 +CEE0 +4280 +4480 +4880 +ENDCHAR +STARTCHAR U_6CD7 +ENCODING 27863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +8AA0 +5AA0 +1AA0 +2AA0 +2AE0 +CC20 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6CD8 +ENCODING 27864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +0200 +9240 +4A80 +3FE0 +4200 +C200 +4200 +4A00 +4400 +ENDCHAR +STARTCHAR U_6CD9 +ENCODING 27865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +8920 +4540 +0100 +3FE0 +2100 +C100 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6CDA +ENCODING 27866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8A80 +4BA0 +1AC0 +2A80 +2A80 +CA80 +4AA0 +4BA0 +5C60 +ENDCHAR +STARTCHAR U_6CDB +ENCODING 27867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2F00 +8200 +5100 +1FE0 +2080 +2100 +C200 +4400 +4A00 +51E0 +ENDCHAR +STARTCHAR U_6CDC +ENCODING 27868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +8900 +4900 +1FE0 +2900 +2900 +C880 +4AA0 +4D60 +4920 +ENDCHAR +STARTCHAR U_6CDD +ENCODING 27869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +8400 +47E0 +1480 +2480 +24C0 +C4A0 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_6CDE +ENCODING 27870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4820 +2000 +4FE0 +4100 +C100 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6CDF +ENCODING 27871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8100 +4100 +29E0 +2900 +4900 +C900 +4900 +4900 +5FE0 +ENDCHAR +STARTCHAR U_6CE0 +ENCODING 27872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8280 +4440 +1920 +2080 +2FE0 +C040 +4280 +4100 +4080 +ENDCHAR +STARTCHAR U_6CE1 +ENCODING 27873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2800 +8FC0 +5040 +2F40 +2940 +2F40 +C8C0 +4820 +4820 +47E0 +ENDCHAR +STARTCHAR U_6CE2 +ENCODING 27874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4920 +1900 +2FC0 +2840 +CA80 +4900 +5280 +6C60 +ENDCHAR +STARTCHAR U_6CE3 +ENCODING 27875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4000 +2080 +2880 +2480 +C480 +4500 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6CE4 +ENCODING 27876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2880 +0C80 +8A80 +4880 +2A80 +4C80 +C980 +4140 +4240 +4C20 +ENDCHAR +STARTCHAR U_6CE5 +ENCODING 27877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +4FE0 +1800 +2A00 +2A60 +CB80 +5220 +5220 +61E0 +ENDCHAR +STARTCHAR U_6CE6 +ENCODING 27878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8800 +5A00 +2F80 +2A80 +CAA0 +52A0 +54A0 +6860 +ENDCHAR +STARTCHAR U_6CE7 +ENCODING 27879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +8FE0 +5900 +1920 +2920 +2940 +CA80 +4CA0 +4960 +4220 +ENDCHAR +STARTCHAR U_6CE8 +ENCODING 27880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5100 +1100 +2100 +27C0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6CE9 +ENCODING 27881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +87E0 +5900 +1100 +2100 +27C0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6CEA +ENCODING 27882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +8420 +57E0 +1420 +2420 +27E0 +C420 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6CEB +ENCODING 27883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5100 +1200 +2440 +2F80 +C100 +4240 +4420 +4FE0 +ENDCHAR +STARTCHAR U_6CEC +ENCODING 27884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4820 +2080 +2280 +2280 +C440 +4440 +4820 +5020 +ENDCHAR +STARTCHAR U_6CED +ENCODING 27885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2440 +8840 +4BE0 +3840 +2A40 +2940 +C940 +4840 +4940 +4880 +ENDCHAR +STARTCHAR U_6CEE +ENCODING 27886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +8540 +5100 +17C0 +2100 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6CEF +ENCODING 27887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +4FE0 +1900 +2FE0 +2900 +C900 +48A0 +4AA0 +4C60 +ENDCHAR +STARTCHAR U_6CF0 +ENCODING 27888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0800 +FFE0 +2480 +5540 +8E20 +1500 +6CC0 +ENDCHAR +STARTCHAR U_6CF1 +ENCODING 27889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FC0 +4940 +2940 +2940 +3FE0 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6CF2 +ENCODING 27890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +8F00 +4900 +1900 +2FE0 +2320 +C520 +4960 +5100 +4100 +ENDCHAR +STARTCHAR U_6CF3 +ENCODING 27891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8600 +4240 +3A80 +2B00 +4A80 +D240 +6220 +4200 +4600 +ENDCHAR +STARTCHAR U_6CF4 +ENCODING 27892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7500 +1600 +2500 +C4C0 +0C00 +0000 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_6CF5 +ENCODING 27893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +DF80 +0480 +7500 +1600 +2500 +C4E0 +0C00 +ENDCHAR +STARTCHAR U_6CF6 +ENCODING 27894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +1500 +FFE0 +8420 +0400 +7440 +1680 +1500 +2480 +5460 +8820 +ENDCHAR +STARTCHAR U_6CF7 +ENCODING 27895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2440 +8FE0 +5500 +1500 +2540 +2540 +C980 +4920 +5320 +64E0 +ENDCHAR +STARTCHAR U_6CF8 +ENCODING 27896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +8100 +5FE0 +1820 +2FE0 +2800 +C800 +4800 +5000 +6000 +ENDCHAR +STARTCHAR U_6CF9 +ENCODING 27897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +4440 +17C0 +2440 +2440 +C7C0 +4000 +4000 +4FE0 +ENDCHAR +STARTCHAR U_6CFA +ENCODING 27898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +8900 +5900 +1FE0 +2100 +2100 +C940 +4920 +5120 +4300 +ENDCHAR +STARTCHAR U_6CFB +ENCODING 27899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8400 +57E0 +1400 +27E0 +2020 +DFA0 +4020 +40A0 +4040 +ENDCHAR +STARTCHAR U_6CFC +ENCODING 27900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2A80 +8A40 +5FE0 +1200 +27C0 +2440 +CA80 +4900 +5280 +6C60 +ENDCHAR +STARTCHAR U_6CFD +ENCODING 27901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2480 +0300 +8480 +5A60 +2200 +4FC0 +C200 +5FE0 +4200 +4200 +ENDCHAR +STARTCHAR U_6CFE +ENCODING 27902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2080 +8100 +5280 +1440 +2820 +27C0 +C100 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6CFF +ENCODING 27903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +5FC0 +2C00 +2A40 +C980 +4880 +4A40 +4C20 +ENDCHAR +STARTCHAR U_6D00 +ENCODING 27904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +8440 +4640 +1540 +2FE0 +4640 +C540 +4440 +4840 +50C0 +ENDCHAR +STARTCHAR U_6D01 +ENCODING 27905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5100 +17C0 +2000 +27C0 +C440 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_6D02 +ENCODING 27906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +8280 +5280 +2AC0 +2AA0 +D2A0 +4480 +4A80 +5100 +ENDCHAR +STARTCHAR U_6D03 +ENCODING 27907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +8FE0 +5400 +1500 +2520 +2B40 +C900 +5280 +6440 +4820 +ENDCHAR +STARTCHAR U_6D04 +ENCODING 27908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +5BA0 +1AA0 +2AA0 +2BA0 +C820 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D05 +ENCODING 27909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2200 +8FC0 +4A40 +0FC0 +2A40 +4A40 +DFE0 +4840 +4840 +48C0 +ENDCHAR +STARTCHAR U_6D06 +ENCODING 27910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9F80 +4100 +0200 +8240 +5B80 +0A80 +2A80 +D240 +6620 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6D07 +ENCODING 27911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8920 +5FE0 +1920 +2920 +2AA0 +CC60 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D08 +ENCODING 27912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2780 +8900 +4FE0 +1800 +2BC0 +2A40 +CA40 +4AC0 +5220 +63E0 +ENDCHAR +STARTCHAR U_6D09 +ENCODING 27913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8800 +4FE0 +1800 +2800 +2BE0 +CA20 +5220 +5220 +63E0 +ENDCHAR +STARTCHAR U_6D0A +ENCODING 27914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +8400 +4BE0 +1840 +2880 +2FE0 +C880 +4880 +4880 +4980 +ENDCHAR +STARTCHAR U_6D0B +ENCODING 27915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FE0 +4100 +1100 +27C0 +2100 +C100 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6D0C +ENCODING 27916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +2420 +84A0 +47A0 +09A0 +35A0 +22A0 +C2A0 +44A0 +4820 +5060 +ENDCHAR +STARTCHAR U_6D0D +ENCODING 27917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2900 +8900 +4BC0 +1A40 +2A40 +2BC0 +C900 +4900 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6D0E +ENCODING 27918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +87E0 +5420 +17E0 +2420 +2420 +C7E0 +4420 +4420 +47E0 +ENDCHAR +STARTCHAR U_6D0F +ENCODING 27919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8200 +5FE0 +1AA0 +2AA0 +2AA0 +CAA0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6D10 +ENCODING 27920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2800 +9400 +45E0 +0840 +3840 +2840 +C840 +4840 +4940 +4880 +ENDCHAR +STARTCHAR U_6D11 +ENCODING 27921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2540 +8920 +5FE0 +1900 +2900 +2900 +C980 +4A80 +4A40 +4C20 +ENDCHAR +STARTCHAR U_6D12 +ENCODING 27922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +8280 +5FE0 +1AA0 +2AA0 +2AE0 +CC20 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D13 +ENCODING 27923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +8FC0 +5A40 +2A40 +4AC0 +C700 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6D14 +ENCODING 27924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8200 +5FE0 +2080 +1FE0 +2880 +C480 +4080 +4280 +4100 +ENDCHAR +STARTCHAR U_6D15 +ENCODING 27925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +8880 +5FE0 +2880 +2F80 +4880 +CF80 +4880 +4880 +4980 +ENDCHAR +STARTCHAR U_6D16 +ENCODING 27926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +4000 +1FC0 +2200 +3FE0 +C200 +4500 +4880 +5060 +ENDCHAR +STARTCHAR U_6D17 +ENCODING 27927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +87C0 +4900 +2100 +3FE0 +4280 +C280 +44A0 +48A0 +50E0 +ENDCHAR +STARTCHAR U_6D18 +ENCODING 27928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27A0 +8140 +5FE0 +1200 +27E0 +2A00 +D3E0 +4020 +4020 +40C0 +ENDCHAR +STARTCHAR U_6D19 +ENCODING 27929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2900 +8FC0 +5100 +2100 +3FE0 +2300 +C580 +4940 +5120 +4100 +ENDCHAR +STARTCHAR U_6D1A +ENCODING 27930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8C80 +5300 +1CE0 +2100 +3FE0 +C900 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6D1B +ENCODING 27931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8440 +5A80 +1100 +2280 +2FE0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D1C +ENCODING 27932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2900 +0600 +1980 +F0E0 +1F80 +0400 +75C0 +1600 +2500 +CCE0 +ENDCHAR +STARTCHAR U_6D1D +ENCODING 27933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5100 +1FE0 +2240 +2440 +C280 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6D1E +ENCODING 27934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +5BA0 +1820 +2BA0 +2AA0 +CBA0 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_6D1F +ENCODING 27935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1120 +2FE0 +2900 +CFE0 +4120 +4280 +4C60 +ENDCHAR +STARTCHAR U_6D20 +ENCODING 27936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2480 +8FC0 +5100 +1500 +27C0 +2900 +DFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6D21 +ENCODING 27937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +8FC0 +6200 +2FE0 +4700 +CA80 +7240 +4220 +4200 +ENDCHAR +STARTCHAR U_6D22 +ENCODING 27938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +8940 +5BE0 +1940 +2940 +2BC0 +C900 +4900 +4A00 +4C00 +ENDCHAR +STARTCHAR U_6D23 +ENCODING 27939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5240 +0A40 +8A80 +5FE0 +2200 +2700 +CA80 +5240 +6220 +4200 +ENDCHAR +STARTCHAR U_6D24 +ENCODING 27940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0500 +8880 +57E0 +2200 +C200 +4F80 +4200 +4200 +5FC0 +ENDCHAR +STARTCHAR U_6D25 +ENCODING 27941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8240 +5FE0 +1240 +2FC0 +2200 +CFC0 +4200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_6D26 +ENCODING 27942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4200 +0400 +8FC0 +5840 +2840 +2FC0 +C840 +4840 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6D27 +ENCODING 27943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8200 +57C0 +1440 +2FC0 +3440 +C7C0 +4440 +4440 +44C0 +ENDCHAR +STARTCHAR U_6D28 +ENCODING 27944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +4080 +2440 +2860 +3480 +C300 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6D29 +ENCODING 27945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8A40 +4FC0 +1A40 +2FC0 +2240 +C280 +4120 +46A0 +5860 +ENDCHAR +STARTCHAR U_6D2A +ENCODING 27946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +8480 +5FE0 +0480 +2480 +3FE0 +C000 +4480 +4860 +5020 +ENDCHAR +STARTCHAR U_6D2B +ENCODING 27947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2200 +8FE0 +5AA0 +1AA0 +2AA0 +2AA0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6D2C +ENCODING 27948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5A40 +1BC0 +2D40 +2B40 +C940 +4940 +5220 +6420 +ENDCHAR +STARTCHAR U_6D2D +ENCODING 27949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8BE0 +5880 +1880 +29C0 +2880 +C880 +4BE0 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6D2E +ENCODING 27950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8AA0 +56C0 +1280 +26C0 +2AA0 +C280 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6D2F +ENCODING 27951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +2120 +FA20 +24C0 +FC00 +0440 +7680 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_6D30 +ENCODING 27952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8800 +5FC0 +1840 +2840 +2FC0 +C800 +4800 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6D31 +ENCODING 27953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +8440 +57C0 +1440 +27C0 +2440 +C5E0 +5E40 +4040 +4040 +ENDCHAR +STARTCHAR U_6D32 +ENCODING 27954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +8920 +5920 +0DA0 +2B60 +2920 +C920 +4920 +4920 +5020 +ENDCHAR +STARTCHAR U_6D33 +ENCODING 27955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +9FE0 +4AA0 +2AA0 +2AA0 +2AA0 +C4A0 +46A0 +4AE0 +5100 +ENDCHAR +STARTCHAR U_6D34 +ENCODING 27956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FE0 +5280 +1280 +2FE0 +2280 +C280 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6D35 +ENCODING 27957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8820 +57A0 +14A0 +27A0 +24A0 +C7A0 +44A0 +4120 +40C0 +ENDCHAR +STARTCHAR U_6D36 +ENCODING 27958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8820 +5520 +1AA0 +2AA0 +2DA0 +C8A0 +4FA0 +4120 +40C0 +ENDCHAR +STARTCHAR U_6D37 +ENCODING 27959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8200 +5440 +17E0 +2120 +2100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D38 +ENCODING 27960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +8540 +5100 +1FE0 +2280 +2280 +C280 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6D39 +ENCODING 27961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +8000 +57C0 +1440 +27C0 +2440 +C7C0 +4440 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6D3A +ENCODING 27962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +8440 +5A80 +1100 +2200 +27E0 +CA20 +4220 +43E0 +4220 +ENDCHAR +STARTCHAR U_6D3B +ENCODING 27963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +8100 +5FE0 +1100 +2100 +27C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D3C +ENCODING 27964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8100 +5100 +1FE0 +2000 +2100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D3D +ENCODING 27965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5820 +1780 +2000 +27C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D3E +ENCODING 27966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +0860 +8B80 +5A80 +2AA0 +2AC0 +CA80 +4A40 +4A40 +5320 +ENDCHAR +STARTCHAR U_6D3F +ENCODING 27967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8440 +5BA0 +1000 +2FE0 +2200 +C7C0 +4040 +4240 +4180 +ENDCHAR +STARTCHAR U_6D40 +ENCODING 27968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +8FE0 +5AA0 +1AA0 +2FE0 +2AA0 +CAA0 +4AA0 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D41 +ENCODING 27969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0400 +8880 +5FC0 +2040 +2A80 +CA80 +4AA0 +4AA0 +5260 +ENDCHAR +STARTCHAR U_6D42 +ENCODING 27970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +87E0 +5100 +1100 +2FE0 +2100 +C280 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6D43 +ENCODING 27971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5920 +1540 +2FE0 +2100 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D44 +ENCODING 27972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +67C0 +2880 +8FC0 +5140 +2FE0 +4140 +CFC0 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6D45 +ENCODING 27973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FC0 +5200 +1FE0 +2200 +2240 +C280 +4120 +46A0 +5860 +ENDCHAR +STARTCHAR U_6D46 +ENCODING 27974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2BE0 +0E40 +3980 +CE00 +0440 +7E80 +1500 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_6D47 +ENCODING 27975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +2F80 +8240 +53A0 +1CE0 +2000 +2FE0 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6D48 +ENCODING 27976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +8100 +57E0 +1420 +2520 +2520 +C520 +4280 +4460 +5820 +ENDCHAR +STARTCHAR U_6D49 +ENCODING 27977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4BE0 +2880 +ABE0 +6AA0 +2AA0 +2AA0 +CAE0 +4880 +5080 +6080 +ENDCHAR +STARTCHAR U_6D4A +ENCODING 27978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5920 +1920 +2920 +2FE0 +C100 +4140 +41E0 +5E20 +ENDCHAR +STARTCHAR U_6D4B +ENCODING 27979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BE20 +62A0 +2AA0 +AAA0 +6AA0 +2AA0 +2AA0 +C8A0 +5420 +6220 +40E0 +ENDCHAR +STARTCHAR U_6D4C +ENCODING 27980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2540 +0920 +9BE0 +6900 +2920 +4940 +C880 +49A0 +4A60 +4820 +ENDCHAR +STARTCHAR U_6D4D +ENCODING 27981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5820 +17C0 +2000 +2FE0 +C200 +4440 +4FA0 +4420 +ENDCHAR +STARTCHAR U_6D4E +ENCODING 27982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8480 +5300 +1480 +2860 +2480 +C480 +4480 +4880 +5080 +ENDCHAR +STARTCHAR U_6D4F +ENCODING 27983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +2420 +9EA0 +42A0 +0AA0 +24A0 +24A0 +CAA0 +5220 +6020 +4060 +ENDCHAR +STARTCHAR U_6D50 +ENCODING 27984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +0440 +9280 +6FE0 +2800 +4800 +C800 +5000 +5000 +6000 +ENDCHAR +STARTCHAR U_6D51 +ENCODING 27985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8200 +5FE0 +1500 +2FE0 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6D52 +ENCODING 27986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2500 +81E0 +4280 +3C80 +2BE0 +2880 +CA80 +4C80 +4880 +4080 +ENDCHAR +STARTCHAR U_6D53 +ENCODING 27987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4A20 +1200 +2520 +2540 +CC80 +5440 +4520 +4600 +ENDCHAR +STARTCHAR U_6D54 +ENCODING 27988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +87C0 +4040 +2FC0 +2080 +4FE0 +C880 +4480 +4080 +4180 +ENDCHAR +STARTCHAR U_6D55 +ENCODING 27989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8840 +4FC0 +0900 +2880 +5240 +D120 +6000 +4200 +4100 +ENDCHAR +STARTCHAR U_6D56 +ENCODING 27990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +0A40 +8540 +5080 +2FE0 +4480 +C280 +4080 +4280 +4100 +ENDCHAR +STARTCHAR U_6D57 +ENCODING 27991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +8FE0 +5200 +2AC0 +2700 +4A80 +F240 +4220 +4A00 +4400 +ENDCHAR +STARTCHAR U_6D58 +ENCODING 27992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8FE0 +5840 +1B80 +2900 +2FC0 +C900 +4FC0 +5120 +60E0 +ENDCHAR +STARTCHAR U_6D59 +ENCODING 27993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +25C0 +9F00 +5500 +17E0 +2D40 +3540 +C540 +4540 +5640 +4A40 +ENDCHAR +STARTCHAR U_6D5A +ENCODING 27994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2440 +8FA0 +5280 +1440 +2A20 +27C0 +CA80 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_6D5B +ENCODING 27995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4500 +0A80 +9260 +6FC0 +2100 +4200 +CFC0 +4840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_6D5C +ENCODING 27996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2780 +8400 +57E0 +1480 +2480 +2480 +CFE0 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6D5D +ENCODING 27997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4440 +1FE0 +8600 +5680 +2740 +4A80 +CB20 +4AC0 +5320 +6DE0 +ENDCHAR +STARTCHAR U_6D5E +ENCODING 27998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +57C0 +1100 +2100 +25E0 +C500 +4500 +4B00 +51E0 +ENDCHAR +STARTCHAR U_6D5F +ENCODING 27999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2900 +95E0 +5540 +1740 +3540 +3540 +D540 +5480 +5140 +5220 +ENDCHAR +STARTCHAR U_6D60 +ENCODING 28000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4CC0 +2300 +8CC0 +5200 +1FE0 +2500 +2FE0 +D520 +4520 +4560 +4100 +ENDCHAR +STARTCHAR U_6D61 +ENCODING 28001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1020 +27C0 +2080 +CFE0 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6D62 +ENCODING 28002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +87C0 +5440 +1440 +27C0 +2000 +C440 +4280 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D63 +ENCODING 28003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5380 +1000 +2FE0 +2280 +C280 +42A0 +44A0 +4860 +ENDCHAR +STARTCHAR U_6D64 +ENCODING 28004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5200 +1FE0 +2400 +2500 +C900 +5240 +6240 +47A0 +ENDCHAR +STARTCHAR U_6D65 +ENCODING 28005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5000 +1FE0 +2920 +2FE0 +C800 +4820 +4820 +47E0 +ENDCHAR +STARTCHAR U_6D66 +ENCODING 28006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +8FE0 +5100 +1FE0 +2920 +2FE0 +C920 +4FE0 +4920 +4960 +ENDCHAR +STARTCHAR U_6D67 +ENCODING 28007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +57C0 +1000 +2FE0 +2100 +C7C0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6D68 +ENCODING 28008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5100 +1FE0 +2100 +2380 +C340 +4540 +4920 +4100 +ENDCHAR +STARTCHAR U_6D69 +ENCODING 28009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +87C0 +5900 +1100 +2FE0 +2000 +C7C0 +4440 +4440 +47C0 +ENDCHAR +STARTCHAR U_6D6A +ENCODING 28010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8840 +4FC0 +1840 +2FC0 +2A20 +C940 +4980 +4A80 +4C60 +ENDCHAR +STARTCHAR U_6D6B +ENCODING 28011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5020 +0480 +8840 +4FC0 +2200 +2200 +DFE0 +4200 +4200 +4200 +ENDCHAR +STARTCHAR U_6D6C +ENCODING 28012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8FE0 +5920 +1FE0 +2920 +2100 +CFE0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6D6D +ENCODING 28013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +5920 +1FE0 +2920 +2FE0 +C500 +4200 +4580 +5860 +ENDCHAR +STARTCHAR U_6D6E +ENCODING 28014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +8A20 +5540 +17E0 +2080 +2100 +DFE0 +4100 +4500 +4200 +ENDCHAR +STARTCHAR U_6D6F +ENCODING 28015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FC0 +5240 +1240 +2FE0 +2000 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D70 +ENCODING 28016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +2C20 +84A0 +5FA0 +14A0 +26A0 +2DA0 +D4A0 +6420 +4420 +44E0 +ENDCHAR +STARTCHAR U_6D71 +ENCODING 28017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5000 +17C0 +9000 +5FE0 +3520 +5540 +D480 +5480 +6660 +4400 +ENDCHAR +STARTCHAR U_6D72 +ENCODING 28018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4FC0 +1880 +8700 +5AE0 +2F80 +4200 +CFC0 +4200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_6D73 +ENCODING 28019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +22E0 +0F00 +90A0 +6FE0 +2840 +4FC0 +C840 +4FC0 +4840 +48C0 +ENDCHAR +STARTCHAR U_6D74 +ENCODING 28020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2440 +8920 +5280 +1440 +2820 +37C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D75 +ENCODING 28021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +2940 +8D80 +4B20 +2940 +3F80 +2920 +C920 +4940 +5180 +6300 +ENDCHAR +STARTCHAR U_6D76 +ENCODING 28022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5500 +17C0 +2900 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6D77 +ENCODING 28023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8800 +57C0 +1540 +2FE0 +2940 +C940 +4FE0 +4040 +4180 +ENDCHAR +STARTCHAR U_6D78 +ENCODING 28024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +87C0 +5040 +1FE0 +2820 +27C0 +C280 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_6D79 +ENCODING 28025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +4100 +0540 +2540 +2BA0 +C280 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D7A +ENCODING 28026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2880 +8C80 +5BE0 +1AA0 +2AA0 +2BE0 +CAA0 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_6D7B +ENCODING 28027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +8AA0 +5C60 +1820 +2BA0 +2AA0 +CAA0 +4BA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6D7C +ENCODING 28028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8880 +5FC0 +0A40 +2A40 +2FC0 +C300 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6D7D +ENCODING 28029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +8920 +54A0 +1140 +2100 +2FE0 +C440 +4280 +4140 +4E20 +ENDCHAR +STARTCHAR U_6D7E +ENCODING 28030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +87C0 +5100 +1FE0 +2280 +2AC0 +CAA0 +52A0 +4480 +4980 +ENDCHAR +STARTCHAR U_6D7F +ENCODING 28031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +1440 +27C0 +2440 +C7C0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D80 +ENCODING 28032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5840 +1FC0 +2840 +2FC0 +C280 +42A0 +44A0 +4860 +ENDCHAR +STARTCHAR U_6D81 +ENCODING 28033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2440 +9E80 +4540 +2C40 +2E80 +5520 +E420 +4440 +4480 +4500 +ENDCHAR +STARTCHAR U_6D82 +ENCODING 28034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5BA0 +1100 +2FE0 +2100 +C580 +4940 +5120 +4300 +ENDCHAR +STARTCHAR U_6D83 +ENCODING 28035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8920 +5FE0 +1920 +2BA0 +2D60 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6D84 +ENCODING 28036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8540 +57C0 +1540 +2FE0 +2200 +C7C0 +4040 +4240 +4180 +ENDCHAR +STARTCHAR U_6D85 +ENCODING 28037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +17C0 +2000 +2100 +C7C0 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D86 +ENCODING 28038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2E40 +8A40 +5A40 +1FE0 +2A40 +2A40 +CA40 +4E40 +4A40 +4040 +ENDCHAR +STARTCHAR U_6D87 +ENCODING 28039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +8540 +5A80 +1540 +2540 +2FE0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6D88 +ENCODING 28040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +8100 +57E0 +1420 +27E0 +2420 +C7E0 +4420 +4420 +4460 +ENDCHAR +STARTCHAR U_6D89 +ENCODING 28041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +85E0 +5500 +1FE0 +2100 +2520 +C940 +5080 +4100 +4E00 +ENDCHAR +STARTCHAR U_6D8A +ENCODING 28042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +8520 +5520 +1B20 +24C0 +2100 +CAC0 +4A20 +5260 +43C0 +ENDCHAR +STARTCHAR U_6D8B +ENCODING 28043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5180 +1140 +2FE0 +2100 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6D8C +ENCODING 28044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0100 +8FE0 +4920 +1FE0 +2920 +CFE0 +4920 +4920 +4860 +ENDCHAR +STARTCHAR U_6D8D +ENCODING 28045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FA0 +8140 +5FE0 +1100 +2FE0 +2480 +CFE0 +4100 +4500 +4200 +ENDCHAR +STARTCHAR U_6D8E +ENCODING 28046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C20 +25C0 +8440 +4960 +1D40 +2540 +2540 +D5E0 +4800 +5600 +61E0 +ENDCHAR +STARTCHAR U_6D8F +ENCODING 28047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8060 +5D80 +0480 +8880 +5FE0 +2480 +4480 +DBE0 +4C00 +4A00 +51E0 +ENDCHAR +STARTCHAR U_6D90 +ENCODING 28048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2CC0 +84A0 +5FE0 +1480 +26A0 +2CA0 +D4A0 +4440 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6D91 +ENCODING 28049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +5FE0 +1920 +2FE0 +2100 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6D92 +ENCODING 28050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +8FE0 +5240 +1FC0 +2200 +27C0 +CC40 +5440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6D93 +ENCODING 28051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5000 +1FE0 +2820 +2FE0 +C820 +4FE0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6D94 +ENCODING 28052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +8FE0 +5100 +1280 +2540 +28A0 +CFC0 +4040 +4080 +4100 +ENDCHAR +STARTCHAR U_6D95 +ENCODING 28053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FC0 +5140 +1FC0 +2900 +2FE0 +C320 +4520 +4940 +5100 +ENDCHAR +STARTCHAR U_6D96 +ENCODING 28054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +4880 +17E0 +B000 +5440 +3240 +5240 +D280 +5080 +5FE0 +5000 +ENDCHAR +STARTCHAR U_6D97 +ENCODING 28055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +8840 +57E0 +1440 +2440 +27C0 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6D98 +ENCODING 28056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2440 +8FA0 +5400 +17E0 +2900 +2FE0 +C100 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6D99 +ENCODING 28057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +8840 +5FC0 +2900 +2FE0 +4900 +C900 +5280 +5460 +6840 +ENDCHAR +STARTCHAR U_6D9A +ENCODING 28058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +8FC0 +5840 +2840 +2FC0 +4500 +C520 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_6D9B +ENCODING 28059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +8200 +5FC0 +1200 +2FE0 +2440 +C7E0 +4A40 +5140 +4080 +ENDCHAR +STARTCHAR U_6D9C +ENCODING 28060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +47C0 +2000 +3FE0 +5020 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6D9D +ENCODING 28061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8280 +5FE0 +1820 +2200 +2FC0 +C240 +4240 +4540 +5880 +ENDCHAR +STARTCHAR U_6D9E +ENCODING 28062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8920 +5540 +1380 +2FE0 +2100 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6D9F +ENCODING 28063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2BE0 +8900 +5280 +17E0 +3880 +2BE0 +C880 +4880 +5400 +63E0 +ENDCHAR +STARTCHAR U_6DA0 +ENCODING 28064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8FE0 +5920 +1FA0 +2920 +2FE0 +C960 +49A0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6DA1 +ENCODING 28065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +8440 +57C0 +1100 +2FE0 +2920 +CAA0 +4C60 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DA2 +ENCODING 28066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5000 +2FC0 +2840 +4940 +C940 +4280 +4460 +5820 +ENDCHAR +STARTCHAR U_6DA3 +ENCODING 28067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +8480 +57C0 +1D40 +2540 +2540 +DFE0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6DA4 +ENCODING 28068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +8A40 +5180 +1E60 +2100 +2FE0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_6DA5 +ENCODING 28069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0000 +87C0 +5440 +27C0 +2000 +CFC0 +4080 +4100 +4300 +ENDCHAR +STARTCHAR U_6DA6 +ENCODING 28070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2220 +8820 +5BA0 +1920 +2BA0 +2920 +C920 +4FE0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DA7 +ENCODING 28071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2220 +8820 +5BA0 +1AA0 +2BA0 +2AA0 +CBA0 +4AA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DA8 +ENCODING 28072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +2520 +8540 +5D80 +1100 +33E0 +5D80 +C540 +4540 +45A0 +5920 +ENDCHAR +STARTCHAR U_6DA9 +ENCODING 28073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +8520 +5520 +12A0 +2C40 +2100 +C5C0 +4500 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6DAA +ENCODING 28074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8440 +5280 +1FE0 +2000 +27C0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6DAB +ENCODING 28075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +57C0 +1440 +27C0 +2400 +C7E0 +4420 +47E0 +4420 +ENDCHAR +STARTCHAR U_6DAC +ENCODING 28076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8100 +5FE0 +1440 +2280 +2FE0 +C100 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6DAD +ENCODING 28077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +81C0 +5E40 +0A80 +9FE0 +5020 +2FC0 +4440 +C280 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6DAE +ENCODING 28078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +31A0 +9FA0 +54A0 +14A0 +3FA0 +34A0 +D4A0 +55A0 +5420 +64E0 +ENDCHAR +STARTCHAR U_6DAF +ENCODING 28079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8880 +5BE0 +1880 +2FE0 +2880 +CBE0 +4880 +5080 +6FE0 +ENDCHAR +STARTCHAR U_6DB0 +ENCODING 28080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +0AA0 +8440 +6AA0 +2000 +4EE0 +CAA0 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_6DB1 +ENCODING 28081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2400 +2780 +8400 +5780 +2400 +7FE0 +C520 +4540 +4480 +4660 +ENDCHAR +STARTCHAR U_6DB2 +ENCODING 28082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8280 +52E0 +1520 +2DA0 +3640 +C540 +4480 +4540 +4620 +ENDCHAR +STARTCHAR U_6DB3 +ENCODING 28083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5280 +1440 +2820 +27C0 +C100 +4100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6DB4 +ENCODING 28084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5400 +1EE0 +2AA0 +36A0 +C2C0 +44A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6DB5 +ENCODING 28085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2040 +8080 +5100 +1D60 +2BA0 +2B20 +CDA0 +4960 +4A20 +4FE0 +ENDCHAR +STARTCHAR U_6DB6 +ENCODING 28086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +8200 +5FE0 +2A40 +3FE0 +4A40 +CA40 +5FE0 +4200 +4FC0 +ENDCHAR +STARTCHAR U_6DB7 +ENCODING 28087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8100 +57C0 +1540 +27C0 +2540 +C7C0 +4100 +4780 +5960 +ENDCHAR +STARTCHAR U_6DB8 +ENCODING 28088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8920 +5FE0 +1920 +2BA0 +2AA0 +CBA0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6DB9 +ENCODING 28089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4200 +1FE0 +8680 +5A60 +2200 +5FE0 +C480 +4900 +4700 +58C0 +ENDCHAR +STARTCHAR U_6DBA +ENCODING 28090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8FE0 +5880 +1FE0 +2880 +2BE0 +CA20 +4A20 +53E0 +6220 +ENDCHAR +STARTCHAR U_6DBB +ENCODING 28091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +8440 +5BA0 +1100 +2FE0 +2100 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6DBC +ENCODING 28092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +8FE0 +5000 +17C0 +2440 +27C0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_6DBD +ENCODING 28093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2F80 +8900 +5FE0 +1880 +2E60 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6DBE +ENCODING 28094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +2F40 +8380 +5540 +1920 +2300 +2FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6DBF +ENCODING 28095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2200 +8620 +5940 +1680 +24C0 +2BA0 +D2A0 +44A0 +5C80 +4300 +ENDCHAR +STARTCHAR U_6DC0 +ENCODING 28096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8820 +5000 +1FE0 +2100 +25E0 +C500 +4500 +4B00 +51E0 +ENDCHAR +STARTCHAR U_6DC1 +ENCODING 28097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0880 +8500 +5FE0 +2200 +5FE0 +C480 +4D00 +4300 +5CC0 +ENDCHAR +STARTCHAR U_6DC2 +ENCODING 28098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +17C0 +2000 +27E0 +C080 +5FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_6DC3 +ENCODING 28099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +4A80 +1FC0 +8200 +5FE0 +2480 +4FE0 +D480 +45A0 +4420 +43E0 +ENDCHAR +STARTCHAR U_6DC4 +ENCODING 28100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2540 +8A80 +5A80 +1540 +2540 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6DC5 +ENCODING 28101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +25C0 +8500 +5F00 +15E0 +2740 +2D40 +D540 +4540 +4540 +4640 +ENDCHAR +STARTCHAR U_6DC6 +ENCODING 28102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +2100 +86C0 +5FE0 +1200 +27C0 +2C40 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6DC7 +ENCODING 28103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +5780 +1480 +2780 +2480 +DFE0 +4480 +4860 +5020 +ENDCHAR +STARTCHAR U_6DC8 +ENCODING 28104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8FE0 +5880 +1AA0 +2AA0 +2BE0 +C880 +4AA0 +52A0 +73E0 +ENDCHAR +STARTCHAR U_6DC9 +ENCODING 28105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8FE0 +5920 +1FE0 +2100 +2FE0 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6DCA +ENCODING 28106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +8440 +5880 +1200 +2CE0 +2820 +CEE0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6DCB +ENCODING 28107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2880 +9FE0 +4880 +2880 +3DC0 +2AA0 +CAA0 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_6DCC +ENCODING 28108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +8100 +5FE0 +1820 +2BA0 +2AA0 +CBA0 +4AA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6DCD +ENCODING 28109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +8BA0 +5920 +1FE0 +2820 +2BA0 +CAA0 +4BA0 +5020 +60E0 +ENDCHAR +STARTCHAR U_6DCE +ENCODING 28110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0200 +9FC0 +6400 +3FE0 +4A80 +D7C0 +6220 +5FC0 +4200 +ENDCHAR +STARTCHAR U_6DCF +ENCODING 28111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +87C0 +5440 +17C0 +2000 +2FE0 +C100 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6DD0 +ENCODING 28112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2000 +2FE0 +C820 +4FE0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6DD1 +ENCODING 28113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +24E0 +07A0 +94A0 +5FA0 +24A0 +2EA0 +D5A0 +6540 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6DD2 +ENCODING 28114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0140 +9FE0 +5140 +27C0 +2100 +DFE0 +4480 +4380 +4E60 +ENDCHAR +STARTCHAR U_6DD3 +ENCODING 28115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +9100 +5FE0 +2200 +23C0 +C240 +4240 +4540 +5880 +ENDCHAR +STARTCHAR U_6DD4 +ENCODING 28116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +97C0 +5440 +27C0 +2440 +C740 +45C0 +4440 +5FE0 +ENDCHAR +STARTCHAR U_6DD5 +ENCODING 28117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +9FE0 +5480 +2440 +2920 +D100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6DD6 +ENCODING 28118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +0100 +97C0 +5440 +27C0 +2440 +C7C0 +4100 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6DD7 +ENCODING 28119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0A20 +8A60 +56A0 +22A0 +2FE0 +C320 +46A0 +4A60 +52C0 +ENDCHAR +STARTCHAR U_6DD8 +ENCODING 28120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0C20 +97A0 +5A20 +2FE0 +2220 +CAA0 +4FA0 +4020 +40C0 +ENDCHAR +STARTCHAR U_6DD9 +ENCODING 28121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +97C0 +5000 +2FE0 +2100 +C540 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_6DDA +ENCODING 28122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +8FE0 +5940 +2920 +2FE0 +C900 +4980 +5260 +6C20 +ENDCHAR +STARTCHAR U_6DDB +ENCODING 28123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +34A0 +1EA0 +94A0 +5FA0 +24A0 +3FA0 +D5A0 +5520 +5720 +4460 +ENDCHAR +STARTCHAR U_6DDC +ENCODING 28124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0AA0 +9EE0 +5AA0 +2AA0 +2EE0 +CAA0 +4AA0 +52A0 +6760 +ENDCHAR +STARTCHAR U_6DDD +ENCODING 28125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +32A0 +1EA0 +92A0 +53E0 +3E00 +3200 +D200 +5220 +5220 +6DE0 +ENDCHAR +STARTCHAR U_6DDE +ENCODING 28126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2940 +1D40 +8A20 +4AA0 +2C80 +3A80 +C940 +4920 +4FE0 +4A20 +ENDCHAR +STARTCHAR U_6DDF +ENCODING 28127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +0FE0 +9AA0 +5FE0 +2AA0 +2AA0 +DFE0 +4280 +4460 +5820 +ENDCHAR +STARTCHAR U_6DE0 +ENCODING 28128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8920 +5FE0 +2000 +3FE0 +C240 +4240 +4440 +4840 +ENDCHAR +STARTCHAR U_6DE1 +ENCODING 28129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +0980 +8280 +5440 +2920 +2540 +C580 +4900 +4280 +5C60 +ENDCHAR +STARTCHAR U_6DE2 +ENCODING 28130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +9080 +5E80 +2AA0 +2EA0 +C0C0 +46A0 +5960 +4620 +ENDCHAR +STARTCHAR U_6DE3 +ENCODING 28131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2CE0 +0820 +9EE0 +5820 +2FE0 +2280 +C280 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6DE4 +ENCODING 28132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2440 +1EA0 +8920 +5E00 +2A80 +2A60 +CA20 +4A80 +5260 +6620 +ENDCHAR +STARTCHAR U_6DE5 +ENCODING 28133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2880 +0F80 +9100 +5FE0 +2920 +2540 +C380 +4540 +5920 +4300 +ENDCHAR +STARTCHAR U_6DE6 +ENCODING 28134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0840 +97A0 +5100 +2100 +2FE0 +C100 +4920 +4540 +5FE0 +ENDCHAR +STARTCHAR U_6DE7 +ENCODING 28135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +8820 +5240 +2540 +5480 +D540 +4620 +4C40 +53C0 +ENDCHAR +STARTCHAR U_6DE8 +ENCODING 28136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F40 +0A40 +9480 +5FC0 +2240 +2FE0 +C240 +4FC0 +4200 +4600 +ENDCHAR +STARTCHAR U_6DE9 +ENCODING 28137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +9FE0 +5280 +2440 +2BE0 +C640 +4980 +4240 +4C20 +ENDCHAR +STARTCHAR U_6DEA +ENCODING 28138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0840 +97A0 +5000 +2FE0 +2AA0 +CFE0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6DEB +ENCODING 28139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +0920 +9540 +5060 +2F80 +2100 +DFE0 +4100 +4100 +4FC0 +ENDCHAR +STARTCHAR U_6DEC +ENCODING 28140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0240 +9240 +55A0 +2900 +2100 +CFE0 +4100 +4100 +4100 +ENDCHAR +STARTCHAR U_6DED +ENCODING 28141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +9FE0 +5900 +2FE0 +2900 +CB80 +5540 +5920 +6100 +ENDCHAR +STARTCHAR U_6DEE +ENCODING 28142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2480 +07E0 +9C80 +57E0 +2480 +2480 +C7E0 +4480 +4480 +47E0 +ENDCHAR +STARTCHAR U_6DEF +ENCODING 28143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0240 +97E0 +5000 +27C0 +2440 +C7C0 +4440 +47C0 +44C0 +ENDCHAR +STARTCHAR U_6DF0 +ENCODING 28144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0640 +9920 +57C0 +2040 +2280 +C500 +5540 +54A0 +63A0 +ENDCHAR +STARTCHAR U_6DF1 +ENCODING 28145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0480 +8940 +4100 +2FE0 +2100 +C380 +4540 +5920 +4100 +ENDCHAR +STARTCHAR U_6DF2 +ENCODING 28146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +0FE0 +9920 +5FC0 +2920 +2BE0 +CA80 +4A80 +52A0 +6460 +ENDCHAR +STARTCHAR U_6DF3 +ENCODING 28147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +97C0 +5000 +2FC0 +2080 +C100 +5FE0 +4100 +4700 +ENDCHAR +STARTCHAR U_6DF4 +ENCODING 28148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0AA0 +92A0 +5520 +2A20 +20C0 +D540 +54A0 +6440 +43C0 +ENDCHAR +STARTCHAR U_6DF5 +ENCODING 28149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +2AA0 +0AA0 +9EE0 +5820 +2FE0 +2820 +CEE0 +4AA0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_6DF6 +ENCODING 28150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0540 +9540 +5540 +2BA0 +2100 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6DF7 +ENCODING 28151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +5FC0 +2920 +2940 +CF80 +4920 +4B20 +4CE0 +ENDCHAR +STARTCHAR U_6DF8 +ENCODING 28152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +0200 +8FC0 +4200 +3FE0 +4A40 +CA40 +4FC0 +4840 +48C0 +ENDCHAR +STARTCHAR U_6DF9 +ENCODING 28153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0480 +8A40 +5FA0 +2A80 +2F80 +CA80 +4FA0 +4220 +41E0 +ENDCHAR +STARTCHAR U_6DFA +ENCODING 28154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9320 +5DE0 +2480 +23E0 +DE00 +42A0 +4320 +5CE0 +ENDCHAR +STARTCHAR U_6DFB +ENCODING 28155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +0200 +9FE0 +4880 +3260 +2200 +CB40 +4AA0 +52A0 +4600 +ENDCHAR +STARTCHAR U_6DFC +ENCODING 28156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04C0 +7500 +1600 +2580 +CC60 +10A0 +F7A0 +59C0 +56A0 +94A0 +31A0 +ENDCHAR +STARTCHAR U_6DFD +ENCODING 28157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +9480 +5100 +2500 +25C0 +C500 +4500 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6DFE +ENCODING 28158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F00 +2480 +DF60 +1500 +7FC0 +0400 +7CC0 +1700 +2480 +CC60 +ENDCHAR +STARTCHAR U_6DFF +ENCODING 28159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8440 +47C0 +1440 +27C0 +4100 +CFE0 +4920 +4960 +4100 +ENDCHAR +STARTCHAR U_6E00 +ENCODING 28160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0500 +8A80 +77E0 +2200 +4A80 +DFE0 +4880 +4880 +5080 +ENDCHAR +STARTCHAR U_6E01 +ENCODING 28161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5EC0 +0700 +8A80 +5640 +6200 +5EC0 +C700 +4A80 +5260 +4400 +ENDCHAR +STARTCHAR U_6E02 +ENCODING 28162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4840 +0FC0 +9840 +6FC0 +2100 +5FE0 +C480 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E03 +ENCODING 28163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +9200 +5FE0 +2200 +27C0 +CC40 +5440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E04 +ENCODING 28164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +2EE0 +8280 +4EE0 +2280 +4280 +DEE0 +4280 +4280 +4280 +ENDCHAR +STARTCHAR U_6E05 +ENCODING 28165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +97C0 +5100 +2FE0 +2440 +C740 +45C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6E06 +ENCODING 28166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9120 +4A20 +1FA0 +8AA0 +6AA0 +3FA0 +4AA0 +CAA0 +4A20 +4AA0 +5240 +ENDCHAR +STARTCHAR U_6E07 +ENCODING 28167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +5840 +2FC0 +2400 +CFE0 +5020 +4E20 +4920 +4F40 +ENDCHAR +STARTCHAR U_6E08 +ENCODING 28168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0480 +8300 +54E0 +2C40 +47C0 +C440 +47C0 +4840 +5040 +ENDCHAR +STARTCHAR U_6E09 +ENCODING 28169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2BC0 +8A00 +5FE0 +2200 +2A40 +4A20 +D280 +4100 +4600 +5800 +ENDCHAR +STARTCHAR U_6E0A +ENCODING 28170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2D60 +0BA0 +9920 +5FE0 +2920 +2BA0 +CD60 +4920 +4920 +5120 +ENDCHAR +STARTCHAR U_6E0B +ENCODING 28171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +05C0 +8500 +5FE0 +2000 +4840 +C480 +4000 +4480 +5840 +ENDCHAR +STARTCHAR U_6E0C +ENCODING 28172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +07C0 +9040 +5FE0 +2920 +2540 +C380 +5D40 +4920 +4720 +ENDCHAR +STARTCHAR U_6E0D +ENCODING 28173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +97C0 +5100 +2FE0 +2440 +C540 +4540 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E0E +ENCODING 28174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +9FE0 +54A0 +2A80 +2480 +CFE0 +4180 +4240 +4C20 +ENDCHAR +STARTCHAR U_6E0F +ENCODING 28175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0500 +8880 +5FE0 +2040 +4F40 +C940 +4F40 +4040 +40C0 +ENDCHAR +STARTCHAR U_6E10 +ENCODING 28176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4820 +3FC0 +0900 +9500 +55E0 +3F40 +2540 +C740 +5D40 +4540 +4640 +ENDCHAR +STARTCHAR U_6E11 +ENCODING 28177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9100 +5FE0 +2920 +2FE0 +C920 +4FE0 +4120 +40E0 +ENDCHAR +STARTCHAR U_6E12 +ENCODING 28178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0940 +8FC0 +5940 +1FC0 +2400 +C900 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6E13 +ENCODING 28179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E40 +8A40 +6580 +2200 +2FC0 +4200 +DFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E14 +ENCODING 28180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +0480 +8FE0 +5920 +2FE0 +2920 +CFE0 +4820 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6E15 +ENCODING 28181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +2A20 +84A0 +4EA0 +04A0 +24A0 +4EA0 +C4A0 +4A20 +4920 +5060 +ENDCHAR +STARTCHAR U_6E16 +ENCODING 28182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +9100 +5FE0 +2920 +2FE0 +C920 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6E17 +ENCODING 28183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2240 +07C0 +9120 +5FE0 +2940 +36A0 +C100 +4E40 +4180 +4E00 +ENDCHAR +STARTCHAR U_6E18 +ENCODING 28184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4500 +0200 +9FE0 +4640 +3A00 +4200 +DFE0 +4700 +5AE0 +4200 +ENDCHAR +STARTCHAR U_6E19 +ENCODING 28185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0880 +9FE0 +5AA0 +2C60 +2920 +DFE0 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6E1A +ENCODING 28186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FA0 +0240 +9FE0 +5200 +27C0 +2C40 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E1B +ENCODING 28187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +9880 +5E80 +28A0 +2EA0 +CAC0 +4EA0 +5160 +6620 +ENDCHAR +STARTCHAR U_6E1C +ENCODING 28188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +9AA0 +5AA0 +2A60 +2100 +DFE0 +4100 +4680 +5860 +ENDCHAR +STARTCHAR U_6E1D +ENCODING 28189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0B60 +9000 +5E20 +2AA0 +2EA0 +CAA0 +4EA0 +4A20 +4AE0 +ENDCHAR +STARTCHAR U_6E1E +ENCODING 28190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +4500 +1FE0 +8200 +5FC0 +2840 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6E1F +ENCODING 28191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +97C0 +5000 +2FE0 +2820 +C7C0 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_6E20 +ENCODING 28192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +8FC0 +5840 +AFC0 +4800 +4FE0 +4400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_6E21 +ENCODING 28193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0A80 +9FE0 +5A80 +2B80 +2800 +CFC0 +4A80 +5100 +6EE0 +ENDCHAR +STARTCHAR U_6E22 +ENCODING 28194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0F40 +9A40 +5FC0 +2AC0 +2FC0 +CA40 +4AC0 +5FA0 +6020 +ENDCHAR +STARTCHAR U_6E23 +ENCODING 28195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0540 +9920 +57C0 +2440 +27C0 +C440 +47C0 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6E24 +ENCODING 28196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2E80 +05E0 +9FA0 +52A0 +3EA0 +24A0 +DFA0 +44A0 +4520 +4A60 +ENDCHAR +STARTCHAR U_6E25 +ENCODING 28197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8800 +5FE0 +2A40 +2FA0 +C900 +4FC0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6E26 +ENCODING 28198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0740 +9540 +5FE0 +2820 +2BA0 +CAA0 +4BA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_6E27 +ENCODING 28199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +9280 +5FE0 +2920 +27C0 +C540 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_6E28 +ENCODING 28200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +0FC0 +8940 +5FC0 +2000 +3FE0 +C920 +4940 +4A80 +4C60 +ENDCHAR +STARTCHAR U_6E29 +ENCODING 28201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2000 +2FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6E2A +ENCODING 28202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4200 +0FC0 +8A40 +6FC0 +2200 +5FE0 +D220 +52A0 +5FA0 +5060 +ENDCHAR +STARTCHAR U_6E2B +ENCODING 28203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +0540 +95C0 +5400 +27E0 +2100 +DFE0 +4580 +4960 +5120 +ENDCHAR +STARTCHAR U_6E2C +ENCODING 28204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E20 +2AA0 +0AA0 +8EA0 +5AA0 +2EA0 +2AA0 +CAA0 +4E20 +4A20 +5160 +ENDCHAR +STARTCHAR U_6E2D +ENCODING 28205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +9920 +5FE0 +2440 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6E2E +ENCODING 28206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +9FE0 +5040 +2F40 +2940 +CF40 +4940 +4040 +40C0 +ENDCHAR +STARTCHAR U_6E2F +ENCODING 28207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +9FE0 +5480 +27C0 +2CA0 +D780 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_6E30 +ENCODING 28208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0FC0 +9020 +5FC0 +2840 +2FC0 +C480 +5FE0 +4480 +4880 +ENDCHAR +STARTCHAR U_6E31 +ENCODING 28209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +24E0 +1F40 +9540 +5540 +3F40 +3540 +C440 +4540 +7F40 +41E0 +ENDCHAR +STARTCHAR U_6E32 +ENCODING 28210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +97E0 +5000 +27C0 +2640 +C540 +47C0 +4000 +5FE0 +ENDCHAR +STARTCHAR U_6E33 +ENCODING 28211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2540 +0540 +9DC0 +5140 +31C0 +3D40 +C560 +47C0 +5440 +4840 +ENDCHAR +STARTCHAR U_6E34 +ENCODING 28212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2400 +2FE0 +D920 +4AA0 +4FA0 +4040 +ENDCHAR +STARTCHAR U_6E35 +ENCODING 28213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0FE0 +9480 +5FE0 +2920 +2920 +CFE0 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6E36 +ENCODING 28214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9100 +57C0 +2540 +2540 +CFE0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_6E37 +ENCODING 28215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0080 +8840 +5FE0 +2840 +4FC0 +C500 +4500 +4920 +50E0 +ENDCHAR +STARTCHAR U_6E38 +ENCODING 28216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +24E0 +1F00 +88E0 +5E20 +2A40 +2BE0 +CA40 +4A40 +5240 +66C0 +ENDCHAR +STARTCHAR U_6E39 +ENCODING 28217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +1220 +8FE0 +5020 +27A0 +2020 +CFA0 +48A0 +4FA0 +40C0 +ENDCHAR +STARTCHAR U_6E3A +ENCODING 28218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +3480 +15C0 +9EA0 +56A0 +3480 +3CA0 +D420 +5440 +5C80 +4300 +ENDCHAR +STARTCHAR U_6E3B +ENCODING 28219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2520 +0960 +9080 +47E0 +2420 +3FE0 +C420 +47E0 +4420 +47E0 +ENDCHAR +STARTCHAR U_6E3C +ENCODING 28220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +1FE0 +9100 +47C0 +2100 +2FE0 +C100 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E3D +ENCODING 28221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2EC0 +04A0 +9FE0 +4080 +2EA0 +2AA0 +CAC0 +4EA0 +4960 +4220 +ENDCHAR +STARTCHAR U_6E3E +ENCODING 28222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0100 +9FE0 +5540 +27C0 +2540 +C7C0 +4100 +5FE0 +4100 +ENDCHAR +STARTCHAR U_6E3F +ENCODING 28223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0380 +8540 +4920 +27C0 +2000 +DFE0 +4100 +4940 +5320 +ENDCHAR +STARTCHAR U_6E40 +ENCODING 28224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +2AA0 +0A40 +8440 +4BA0 +3100 +2100 +CFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E41 +ENCODING 28225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2940 +1E20 +8A20 +49C0 +2C00 +3BE0 +CA20 +4A20 +4BE0 +5A20 +ENDCHAR +STARTCHAR U_6E42 +ENCODING 28226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8000 +57C0 +2000 +4FE0 +C200 +43C0 +4040 +40C0 +ENDCHAR +STARTCHAR U_6E43 +ENCODING 28227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3DE0 +0440 +9FE0 +4440 +25E0 +3E40 +C5E0 +4440 +4840 +5040 +ENDCHAR +STARTCHAR U_6E44 +ENCODING 28228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8800 +4BE0 +2A20 +2BE0 +CA20 +4BE0 +5220 +63E0 +ENDCHAR +STARTCHAR U_6E45 +ENCODING 28229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +1100 +9FE0 +4D60 +2BA0 +2FE0 +C380 +4540 +4920 +5120 +ENDCHAR +STARTCHAR U_6E46 +ENCODING 28230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8280 +4FE0 +2000 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E47 +ENCODING 28231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4000 +27C0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E48 +ENCODING 28232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +8780 +5480 +2780 +4200 +DFE0 +4680 +5A60 +4200 +ENDCHAR +STARTCHAR U_6E49 +ENCODING 28233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +2580 +1480 +97E0 +5480 +2480 +25E0 +C520 +4520 +45E0 +4520 +ENDCHAR +STARTCHAR U_6E4A +ENCODING 28234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +07E0 +8100 +4FE0 +2440 +3BA0 +C100 +4FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6E4B +ENCODING 28235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0240 +8FE0 +4440 +27C0 +2100 +CFE0 +4500 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6E4C +ENCODING 28236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4500 +0A80 +9FE0 +6880 +2F80 +4880 +CF80 +4A80 +4900 +4CC0 +ENDCHAR +STARTCHAR U_6E4D +ENCODING 28237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +0FE0 +8000 +4FE0 +2100 +2FE0 +CAA0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6E4E +ENCODING 28238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0200 +9FE0 +5AA0 +2BA0 +2AA0 +CBA0 +4AA0 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6E4F +ENCODING 28239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4200 +0FC0 +9840 +6FC0 +2840 +4FC0 +C840 +4FC0 +4480 +5860 +ENDCHAR +STARTCHAR U_6E50 +ENCODING 28240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +4880 +1FE0 +8920 +6D20 +3BE0 +5920 +E920 +4920 +49E0 +4920 +ENDCHAR +STARTCHAR U_6E51 +ENCODING 28241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +05C0 +8500 +5FE0 +2440 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6E52 +ENCODING 28242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8000 +5FE0 +2440 +27C0 +C440 +47C0 +4460 +4FC0 +ENDCHAR +STARTCHAR U_6E53 +ENCODING 28243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2840 +17E0 +8240 +4440 +2980 +3000 +CFE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6E54 +ENCODING 28244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +1FE0 +8000 +4EA0 +2AA0 +2EA0 +CAA0 +4EA0 +4A20 +4AE0 +ENDCHAR +STARTCHAR U_6E55 +ENCODING 28245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +24A0 +0BE0 +9CA0 +47E0 +2480 +27E0 +D480 +4BE0 +5480 +63E0 +ENDCHAR +STARTCHAR U_6E56 +ENCODING 28246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +24A0 +1FA0 +94E0 +54A0 +2EA0 +2AE0 +CAA0 +4EA0 +4120 +4260 +ENDCHAR +STARTCHAR U_6E57 +ENCODING 28247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +4840 +1C40 +89E0 +7E40 +4940 +5EC0 +C840 +4E40 +7840 +40C0 +ENDCHAR +STARTCHAR U_6E58 +ENCODING 28248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2520 +0520 +9FE0 +4520 +2720 +2DE0 +D520 +4520 +45E0 +4520 +ENDCHAR +STARTCHAR U_6E59 +ENCODING 28249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0500 +9540 +6520 +2B00 +4200 +DFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6E5A +ENCODING 28250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3F40 +1540 +9EC0 +5040 +3740 +3540 +D740 +5540 +5740 +6560 +ENDCHAR +STARTCHAR U_6E5B +ENCODING 28251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +97C0 +5440 +27C0 +2440 +DFE0 +4A80 +4C40 +4FE0 +ENDCHAR +STARTCHAR U_6E5C +ENCODING 28252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8440 +47C0 +2000 +2FE0 +C500 +45E0 +4B00 +51E0 +ENDCHAR +STARTCHAR U_6E5D +ENCODING 28253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +2EC0 +0880 +9AA0 +5CE0 +2100 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E5E +ENCODING 28254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +07C0 +9440 +57C0 +2440 +27C0 +C440 +47C0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6E5F +ENCODING 28255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +0440 +97C0 +5440 +2FE0 +2100 +C100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E60 +ENCODING 28256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +0FE0 +8200 +5FE0 +2480 +26A0 +CAC0 +4C80 +5140 +6620 +ENDCHAR +STARTCHAR U_6E61 +ENCODING 28257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +07C0 +9540 +57C0 +2100 +2FE0 +C920 +4960 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6E62 +ENCODING 28258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +07C0 +9440 +57C0 +2000 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6E63 +ENCODING 28259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8900 +5FE0 +2880 +2FE0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E64 +ENCODING 28260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2900 +1FE0 +8880 +5EE0 +2BA0 +2AA0 +CAE0 +4A80 +5220 +4DE0 +ENDCHAR +STARTCHAR U_6E65 +ENCODING 28261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0AA0 +8440 +49A0 +2140 +2FE0 +C100 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6E66 +ENCODING 28262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +4FC0 +2500 +2FE0 +D100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E67 +ENCODING 28263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0FE0 +8920 +5FE0 +2920 +2FE0 +C200 +5FE0 +4420 +58C0 +ENDCHAR +STARTCHAR U_6E68 +ENCODING 28264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +17C0 +9440 +47C0 +2440 +27C0 +C140 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E69 +ENCODING 28265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2100 +0FE0 +8920 +4FE0 +2920 +2FE0 +C100 +4FE0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E6A +ENCODING 28266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +47C0 +0480 +9FE0 +4400 +3AC0 +4500 +DB80 +4540 +5920 +4200 +ENDCHAR +STARTCHAR U_6E6B +ENCODING 28267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3880 +0AA0 +9EC0 +4A80 +2C80 +3A80 +C880 +4880 +4940 +4A20 +ENDCHAR +STARTCHAR U_6E6C +ENCODING 28268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2540 +FB80 +7280 +AC60 +2400 +7580 +1600 +2580 +C460 +0C00 +ENDCHAR +STARTCHAR U_6E6D +ENCODING 28269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +8FE0 +5280 +1FE0 +2AA0 +4AA0 +CC60 +4FA0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6E6E +ENCODING 28270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +9AA0 +4AA0 +2FE0 +2100 +C7C0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6E6F +ENCODING 28271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +5FE0 +2400 +27E0 +CAA0 +52A0 +4520 +4AC0 +ENDCHAR +STARTCHAR U_6E70 +ENCODING 28272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5880 +0700 +98E0 +4780 +2A00 +4FC0 +D200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6E71 +ENCODING 28273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4100 +2FE0 +2200 +DFE0 +4A20 +5220 +43E0 +ENDCHAR +STARTCHAR U_6E72 +ENCODING 28274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2A20 +0540 +97E0 +5100 +2FE0 +2400 +C7E0 +4A40 +5180 +6660 +ENDCHAR +STARTCHAR U_6E73 +ENCODING 28275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8FE0 +4AA0 +2920 +2FE0 +C920 +4FE0 +4920 +4860 +ENDCHAR +STARTCHAR U_6E74 +ENCODING 28276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +07E0 +9280 +5280 +2AA0 +2AA0 +C6C0 +4280 +4280 +4FE0 +ENDCHAR +STARTCHAR U_6E75 +ENCODING 28277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4FC0 +0200 +8FC0 +4200 +3FE0 +4400 +C780 +4900 +4280 +4C60 +ENDCHAR +STARTCHAR U_6E76 +ENCODING 28278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4F80 +0880 +9F80 +6880 +2F80 +4240 +DB80 +4A80 +7260 +4600 +ENDCHAR +STARTCHAR U_6E77 +ENCODING 28279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4200 +3FE0 +2C40 +D7E0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6E78 +ENCODING 28280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0440 +87C0 +4000 +2FE0 +2820 +C380 +42A0 +44A0 +5860 +ENDCHAR +STARTCHAR U_6E79 +ENCODING 28281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BE0 +8AA0 +4BE0 +2AA0 +2BE0 +C880 +4BE0 +5080 +67E0 +ENDCHAR +STARTCHAR U_6E7A +ENCODING 28282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4BC0 +1240 +93C0 +7100 +37E0 +5380 +D540 +5540 +5920 +5100 +ENDCHAR +STARTCHAR U_6E7B +ENCODING 28283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4200 +1FE0 +8480 +5780 +2000 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6E7C +ENCODING 28284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2CC0 +8840 +4CC0 +0840 +2FC0 +4000 +CFC0 +4200 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6E7D +ENCODING 28285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8540 +4A80 +1FE0 +AA80 +4540 +5FC0 +5240 +DFC0 +5240 +5FC0 +5040 +ENDCHAR +STARTCHAR U_6E7E +ENCODING 28286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +06C0 +8AA0 +47C0 +2040 +27C0 +C400 +47E0 +4020 +40C0 +ENDCHAR +STARTCHAR U_6E7F +ENCODING 28287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2440 +2280 +CAA0 +46C0 +4280 +4FE0 +ENDCHAR +STARTCHAR U_6E80 +ENCODING 28288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0480 +BFE0 +6200 +3FE0 +5220 +DAA0 +5FA0 +50A0 +5040 +ENDCHAR +STARTCHAR U_6E81 +ENCODING 28289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0480 +9FE0 +5220 +2FC0 +4200 +C700 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6E82 +ENCODING 28290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8820 +7E20 +08A0 +BEA0 +6AA0 +3EA0 +48A0 +DCA0 +6A20 +48A0 +4840 +ENDCHAR +STARTCHAR U_6E83 +ENCODING 28291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0540 +9FE0 +4000 +27C0 +2440 +C540 +4540 +4280 +5C60 +ENDCHAR +STARTCHAR U_6E84 +ENCODING 28292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +5FC0 +0400 +8FC0 +5880 +2700 +5AE0 +CF80 +4200 +5FC0 +4200 +ENDCHAR +STARTCHAR U_6E85 +ENCODING 28293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEC0 +62A0 +2BE0 +AA80 +6BE0 +2A80 +6A80 +EAA0 +4C40 +52A0 +6120 +ENDCHAR +STARTCHAR U_6E86 +ENCODING 28294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4600 +29E0 +10A0 +8FA0 +44A0 +3FA0 +24A0 +CEA0 +5540 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6E87 +ENCODING 28295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +4A80 +1FE0 +8680 +5A60 +2200 +5FE0 +C480 +4900 +4700 +58C0 +ENDCHAR +STARTCHAR U_6E88 +ENCODING 28296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +2600 +1F80 +8480 +47C0 +2440 +2FE0 +D020 +6560 +4AA0 +4AC0 +ENDCHAR +STARTCHAR U_6E89 +ENCODING 28297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3480 +1C80 +9680 +57E0 +3C80 +30A0 +D5A0 +5AA0 +52A0 +4460 +ENDCHAR +STARTCHAR U_6E8A +ENCODING 28298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +3DC0 +1440 +9DC0 +5000 +3DC0 +5140 +DD40 +5080 +5140 +5620 +ENDCHAR +STARTCHAR U_6E8B +ENCODING 28299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +4480 +07C0 +8D40 +4B40 +3540 +4080 +DFC0 +5540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_6E8C +ENCODING 28300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +5D40 +1480 +8860 +5F80 +2500 +5FC0 +C500 +4500 +4920 +50E0 +ENDCHAR +STARTCHAR U_6E8D +ENCODING 28301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0AA0 +86C0 +4FE0 +2000 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6E8E +ENCODING 28302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +29E0 +1E80 +8880 +4DE0 +3A00 +2880 +CBE0 +4880 +4880 +4BE0 +ENDCHAR +STARTCHAR U_6E8F +ENCODING 28303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0940 +8FE0 +5940 +2FC0 +2900 +CFC0 +5440 +57C0 +6440 +ENDCHAR +STARTCHAR U_6E90 +ENCODING 28304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2880 +8BE0 +4A20 +1BE0 +2A20 +2BE0 +C880 +4AC0 +54A0 +69A0 +ENDCHAR +STARTCHAR U_6E91 +ENCODING 28305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2680 +8FC0 +4840 +1FC0 +2840 +2FC0 +C840 +4FC0 +4840 +5020 +ENDCHAR +STARTCHAR U_6E92 +ENCODING 28306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +8FE0 +4000 +27C0 +2440 +C7C0 +4CA0 +5540 +4620 +ENDCHAR +STARTCHAR U_6E93 +ENCODING 28307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +1FE0 +8540 +5FE0 +2540 +3FC0 +C500 +4D80 +5540 +6520 +ENDCHAR +STARTCHAR U_6E94 +ENCODING 28308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +9100 +57C0 +2100 +2FE0 +C000 +4540 +4AA0 +4AA0 +ENDCHAR +STARTCHAR U_6E95 +ENCODING 28309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5020 +0FC0 +8000 +5FE0 +2600 +4B60 +C580 +5B40 +4560 +5B00 +ENDCHAR +STARTCHAR U_6E96 +ENCODING 28310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +4FE0 +9900 +4FC0 +4900 +CFC0 +4900 +4FE0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_6E97 +ENCODING 28311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +1FE0 +8AA0 +5AC0 +2AA0 +3AE0 +C700 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_6E98 +ENCODING 28312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +8FE0 +4100 +2240 +27A0 +C000 +4FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6E99 +ENCODING 28313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4200 +2FE0 +2D40 +D360 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6E9A +ENCODING 28314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FC0 +0A80 +8500 +4880 +3760 +4000 +CF80 +4880 +4F80 +4880 +ENDCHAR +STARTCHAR U_6E9B +ENCODING 28315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +14A0 +8840 +5FA0 +2A40 +2A40 +CA40 +4A40 +4AA0 +53A0 +ENDCHAR +STARTCHAR U_6E9C +ENCODING 28316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2DE0 +08A0 +9AA0 +5F20 +2140 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6E9D +ENCODING 28317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0280 +8FE0 +4280 +3FE0 +2940 +CFC0 +4940 +5FE0 +48C0 +ENDCHAR +STARTCHAR U_6E9E +ENCODING 28318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +0280 +8180 +4E60 +2100 +2FE0 +C920 +4FE0 +4140 +5FA0 +ENDCHAR +STARTCHAR U_6E9F +ENCODING 28319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +07C0 +8440 +47C0 +2440 +27C0 +C100 +5FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6EA0 +ENCODING 28320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8100 +47E0 +2100 +2FE0 +C400 +4FC0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6EA1 +ENCODING 28321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +3DE0 +1480 +97E0 +5400 +3C40 +37E0 +D540 +5CC0 +4040 +41C0 +ENDCHAR +STARTCHAR U_6EA2 +ENCODING 28322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8280 +4440 +2820 +3FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6EA3 +ENCODING 28323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6280 +2440 +ABA0 +6000 +2FE0 +6AA0 +AFE0 +AAA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_6EA4 +ENCODING 28324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2900 +0FC0 +8900 +4FC0 +2900 +2FE0 +C020 +4AA0 +5560 +5560 +ENDCHAR +STARTCHAR U_6EA5 +ENCODING 28325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +3FE0 +0920 +8FE0 +4920 +2FE0 +2920 +C140 +5FE0 +4440 +42C0 +ENDCHAR +STARTCHAR U_6EA6 +ENCODING 28326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3540 +1F60 +80A0 +4FA0 +20A0 +2EA0 +CAA0 +4A40 +4BA0 +5120 +ENDCHAR +STARTCHAR U_6EA7 +ENCODING 28327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +8AA0 +4FE0 +2100 +2FE0 +C100 +4380 +4540 +4920 +ENDCHAR +STARTCHAR U_6EA8 +ENCODING 28328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5D20 +0900 +BFE0 +4900 +3F60 +4940 +DC80 +6AA0 +4960 +4E20 +ENDCHAR +STARTCHAR U_6EA9 +ENCODING 28329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0840 +9FC0 +6800 +2FE0 +4800 +CFE0 +4020 +5AA0 +6560 +ENDCHAR +STARTCHAR U_6EAA +ENCODING 28330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +04C0 +8240 +4780 +2240 +2FA0 +C100 +5FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_6EAB +ENCODING 28331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +06C0 +8440 +47C0 +2000 +2FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6EAC +ENCODING 28332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +0200 +8FC0 +6200 +3FE0 +4680 +C740 +4BC0 +4A20 +51E0 +ENDCHAR +STARTCHAR U_6EAD +ENCODING 28333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5240 +1FC0 +9240 +5FC0 +2880 +5440 +CFA0 +5500 +4200 +5DC0 +ENDCHAR +STARTCHAR U_6EAE +ENCODING 28334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2880 +1C80 +97E0 +5EA0 +32A0 +3EA0 +D6A0 +56E0 +5C80 +5080 +ENDCHAR +STARTCHAR U_6EAF +ENCODING 28335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +24A0 +1FA0 +84E0 +55A0 +15A0 +5FE0 +C4A0 +44A0 +4920 +5260 +ENDCHAR +STARTCHAR U_6EB0 +ENCODING 28336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +0FE0 +8000 +5FE0 +2000 +2FC0 +C840 +4FC0 +4480 +5FE0 +ENDCHAR +STARTCHAR U_6EB1 +ENCODING 28337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +87C0 +4200 +2FE0 +2940 +DFE0 +4380 +4540 +5920 +ENDCHAR +STARTCHAR U_6EB2 +ENCODING 28338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4DE0 +2920 +0FE0 +8920 +5FE0 +2100 +2FE0 +C440 +4280 +4100 +4EE0 +ENDCHAR +STARTCHAR U_6EB3 +ENCODING 28339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0FC0 +9840 +5FC0 +2840 +2FC0 +C840 +4FC0 +4480 +5860 +ENDCHAR +STARTCHAR U_6EB4 +ENCODING 28340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0440 +8740 +55C0 +2440 +27C0 +C140 +4FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6EB5 +ENCODING 28341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9DC0 +5140 +1D40 +9540 +5E20 +35C0 +5D40 +D280 +5C80 +6540 +4E20 +ENDCHAR +STARTCHAR U_6EB6 +ENCODING 28342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0AA0 +9540 +5AA0 +2440 +2820 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6EB7 +ENCODING 28343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8A20 +5EA0 +2920 +2BA0 +CD60 +4920 +4A20 +4FE0 +ENDCHAR +STARTCHAR U_6EB8 +ENCODING 28344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +0200 +8F80 +4200 +3FE0 +2B00 +C480 +5FC0 +5280 +5640 +ENDCHAR +STARTCHAR U_6EB9 +ENCODING 28345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8FE0 +4920 +2780 +2240 +CFA0 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6EBA +ENCODING 28346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2220 +1EE0 +9080 +5EE0 +3220 +2AA0 +C660 +5BA0 +4220 +4CC0 +ENDCHAR +STARTCHAR U_6EBB +ENCODING 28347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2000 +3FE0 +CAA0 +4660 +5AA0 +46E0 +ENDCHAR +STARTCHAR U_6EBC +ENCODING 28348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2880 +1540 +9DC0 +4880 +3540 +3DE0 +C100 +4FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6EBD +ENCODING 28349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BC0 +8800 +4FE0 +2AA0 +2A40 +CFE0 +4840 +5240 +60C0 +ENDCHAR +STARTCHAR U_6EBE +ENCODING 28350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0A40 +8FC0 +5A40 +2FC0 +2140 +C3A0 +4540 +4920 +50E0 +ENDCHAR +STARTCHAR U_6EBF +ENCODING 28351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +7EA0 +2BC0 +AA80 +7FE0 +2A80 +6BE0 +AA80 +BE80 +A280 +8080 +ENDCHAR +STARTCHAR U_6EC0 +ENCODING 28352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0480 +8F00 +4240 +2FE0 +2920 +CFE0 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6EC1 +ENCODING 28353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +3540 +1620 +99E0 +5480 +35E0 +3480 +DDC0 +52A0 +54A0 +5180 +ENDCHAR +STARTCHAR U_6EC2 +ENCODING 28354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4820 +2100 +2FE0 +C200 +43C0 +4440 +5980 +ENDCHAR +STARTCHAR U_6EC3 +ENCODING 28355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3A40 +04A0 +8FC0 +4000 +3FE0 +2AA0 +C660 +5BA0 +4220 +4660 +ENDCHAR +STARTCHAR U_6EC4 +ENCODING 28356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2240 +0520 +9FC0 +5440 +27C0 +2440 +C7E0 +4A20 +53E0 +6220 +ENDCHAR +STARTCHAR U_6EC5 +ENCODING 28357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +0FE0 +8880 +4FA0 +2AA0 +2FA0 +CA40 +5560 +68A0 +5120 +ENDCHAR +STARTCHAR U_6EC6 +ENCODING 28358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +07C0 +8000 +4FE0 +2AA0 +2920 +CFE0 +4920 +4920 +4860 +ENDCHAR +STARTCHAR U_6EC7 +ENCODING 28359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +87C0 +4440 +2740 +25C0 +C440 +5FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_6EC8 +ENCODING 28360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +87C0 +4000 +2FE0 +2820 +CBA0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6EC9 +ENCODING 28361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +0FC0 +8840 +4FC0 +2540 +3FE0 +C480 +44A0 +48A0 +5060 +ENDCHAR +STARTCHAR U_6ECA +ENCODING 28362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +1000 +8FC0 +5240 +2AC0 +2740 +DFC0 +4640 +4B20 +52A0 +ENDCHAR +STARTCHAR U_6ECB +ENCODING 28363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +1FE0 +8440 +4880 +2AA0 +3DC0 +C440 +48A0 +52A0 +5DE0 +ENDCHAR +STARTCHAR U_6ECC +ENCODING 28364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +29E0 +1740 +9480 +5760 +3480 +37E0 +D480 +55C0 +52A0 +54A0 +ENDCHAR +STARTCHAR U_6ECD +ENCODING 28365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +0FE0 +9100 +5FE0 +2100 +2FE0 +C920 +4FE0 +4120 +4FE0 +ENDCHAR +STARTCHAR U_6ECE +ENCODING 28366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +4620 +FFE0 +8420 +7EC0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6ECF +ENCODING 28367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +2A20 +1180 +8240 +4420 +2B80 +2100 +CFE0 +4920 +4540 +5FE0 +ENDCHAR +STARTCHAR U_6ED0 +ENCODING 28368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2FE0 +3340 +8DE0 +4840 +3140 +3FE0 +C380 +4540 +4920 +4100 +ENDCHAR +STARTCHAR U_6ED1 +ENCODING 28369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0740 +8540 +5FE0 +3460 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_6ED2 +ENCODING 28370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2740 +0540 +8740 +4040 +2FE0 +2040 +C740 +4540 +4740 +40C0 +ENDCHAR +STARTCHAR U_6ED3 +ENCODING 28371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0920 +8FE0 +4280 +2100 +3FE0 +C100 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6ED4 +ENCODING 28372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +27A0 +0A20 +8540 +4260 +2C20 +2820 +CEE0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6ED5 +ENCODING 28373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +AFE0 +E200 +AFE0 +A540 +ED60 +A380 +A540 +A920 +B320 +ENDCHAR +STARTCHAR U_6ED6 +ENCODING 28374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0000 +87C0 +5440 +2FE0 +2440 +C7C0 +4CA0 +7540 +4620 +ENDCHAR +STARTCHAR U_6ED7 +ENCODING 28375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +1540 +8020 +4F80 +2200 +3FC0 +C200 +5FE0 +4220 +41E0 +ENDCHAR +STARTCHAR U_6ED8 +ENCODING 28376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0440 +8BA0 +4100 +2FE0 +2000 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6ED9 +ENCODING 28377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2A80 +2BC0 +8E80 +4BC0 +2A80 +2BC0 +2A80 +EBC0 +2800 +2FE0 +ENDCHAR +STARTCHAR U_6EDA +ENCODING 28378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8920 +52A0 +2740 +2220 +C540 +5C80 +4540 +4620 +ENDCHAR +STARTCHAR U_6EDB +ENCODING 28379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2E00 +2220 +8920 +4540 +0FE0 +5100 +6FE0 +C100 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6EDC +ENCODING 28380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +0840 +8FC0 +4840 +2FC0 +2200 +DFE0 +5240 +6FA0 +4200 +ENDCHAR +STARTCHAR U_6EDD +ENCODING 28381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2F80 +2500 +9FC0 +4A80 +2A80 +2F80 +EA80 +2F80 +2220 +21E0 +ENDCHAR +STARTCHAR U_6EDE +ENCODING 28382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +3FE0 +0540 +9000 +5FE0 +2920 +27C0 +C540 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_6EDF +ENCODING 28383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +29E0 +1E40 +8BE0 +5EA0 +2AA0 +2BE0 +DE00 +4A20 +4A20 +49E0 +ENDCHAR +STARTCHAR U_6EE0 +ENCODING 28384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2440 +07C0 +8440 +5FE0 +2040 +3FE0 +D2A0 +4C40 +4AA0 +5120 +ENDCHAR +STARTCHAR U_6EE1 +ENCODING 28385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +1280 +9FE0 +4280 +2FE0 +2AA0 +CAA0 +4D60 +4920 +4860 +ENDCHAR +STARTCHAR U_6EE2 +ENCODING 28386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0280 +9FE0 +5020 +2FC0 +2100 +C7C0 +4140 +4120 +5FE0 +ENDCHAR +STARTCHAR U_6EE3 +ENCODING 28387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +2FC0 +8800 +4FE0 +2B40 +4A80 +CA60 +57C0 +5440 +67C0 +ENDCHAR +STARTCHAR U_6EE4 +ENCODING 28388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +0FE0 +8920 +4FC0 +2920 +29E0 +CB40 +4AA0 +5640 +69C0 +ENDCHAR +STARTCHAR U_6EE5 +ENCODING 28389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2A80 +0AE0 +8B40 +4A20 +2200 +2FE0 +CAA0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6EE6 +ENCODING 28390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0480 +8CC0 +54A0 +2100 +3FE0 +C300 +4580 +4960 +5120 +ENDCHAR +STARTCHAR U_6EE7 +ENCODING 28391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +7E80 +14E0 +9540 +2340 +5540 +4880 +C880 +4880 +5540 +6620 +ENDCHAR +STARTCHAR U_6EE8 +ENCODING 28392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +08A0 +9700 +5400 +27E0 +2480 +C480 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6EE9 +ENCODING 28393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +3D40 +05E0 +9740 +5540 +29E0 +2940 +CD40 +55E0 +6340 +41E0 +ENDCHAR +STARTCHAR U_6EEA +ENCODING 28394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BDE0 +4480 +1900 +8BE0 +7EA0 +2AA0 +4AA0 +CAA0 +4880 +6960 +5220 +ENDCHAR +STARTCHAR U_6EEB +ENCODING 28395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2720 +0AC0 +9B20 +4A00 +2BE0 +2B20 +CBE0 +4B20 +49E0 +4920 +ENDCHAR +STARTCHAR U_6EEC +ENCODING 28396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +8FE0 +4A40 +2FE0 +2D20 +CFE0 +4C00 +5420 +63E0 +ENDCHAR +STARTCHAR U_6EED +ENCODING 28397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8920 +5FE0 +2540 +2FE0 +C540 +4FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6EEE +ENCODING 28398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2220 +0FC0 +8A80 +4F20 +2AC0 +2B80 +D020 +5740 +5520 +69E0 +ENDCHAR +STARTCHAR U_6EEF +ENCODING 28399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +3FE0 +0540 +9760 +5800 +2FE0 +2920 +C7C0 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_6EF0 +ENCODING 28400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2F80 +2500 +9FE0 +4880 +2F80 +2880 +CF80 +4500 +4520 +58E0 +ENDCHAR +STARTCHAR U_6EF1 +ENCODING 28401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1020 +8E60 +4040 +3FE0 +2AA0 +CA40 +4AA0 +5320 +61E0 +ENDCHAR +STARTCHAR U_6EF2 +ENCODING 28402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +27A0 +1540 +8AA0 +4D60 +2280 +2D60 +C280 +4D60 +4080 +4700 +ENDCHAR +STARTCHAR U_6EF3 +ENCODING 28403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2440 +8280 +4FE0 +1AA0 +2C60 +EBA0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_6EF4 +ENCODING 28404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4920 +2FE0 +2920 +CBA0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6EF5 +ENCODING 28405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1120 +8CC0 +5520 +2640 +3BC0 +C920 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_6EF6 +ENCODING 28406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +04E0 +9FA0 +44A0 +3FA0 +28A0 +CEA0 +4A40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6EF7 +ENCODING 28407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +0100 +9FE0 +5820 +2D60 +2AA0 +CD60 +4AA0 +4D60 +4FE0 +ENDCHAR +STARTCHAR U_6EF8 +ENCODING 28408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +1EE0 +8140 +5E40 +21E0 +3E40 +C040 +5E40 +5240 +5E40 +ENDCHAR +STARTCHAR U_6EF9 +ENCODING 28409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +0FE0 +8920 +4FC0 +2920 +2FE0 +CD40 +57E0 +6100 +4300 +ENDCHAR +STARTCHAR U_6EFA +ENCODING 28410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2DE0 +1640 +B540 +5480 +1360 +2000 +CA40 +5AA0 +68A0 +4780 +ENDCHAR +STARTCHAR U_6EFB +ENCODING 28411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +9280 +5FE0 +2A80 +2BE0 +CC80 +4BC0 +4880 +57E0 +ENDCHAR +STARTCHAR U_6EFC +ENCODING 28412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +8FC0 +54A0 +2000 +2780 +C480 +46A0 +49A0 +5060 +ENDCHAR +STARTCHAR U_6EFD +ENCODING 28413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0940 +8FE0 +5940 +2FE0 +2D20 +CFE0 +5520 +57E0 +6520 +ENDCHAR +STARTCHAR U_6EFE +ENCODING 28414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +8FE0 +5440 +27C0 +2220 +C540 +5C80 +4640 +4420 +ENDCHAR +STARTCHAR U_6EFF +ENCODING 28415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +87C0 +4100 +2FE0 +2920 +CDA0 +4B60 +4DA0 +4960 +ENDCHAR +STARTCHAR U_6F00 +ENCODING 28416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1260 +FDC0 +5540 +7C80 +4360 +BA40 +0B80 +1280 +E660 +ENDCHAR +STARTCHAR U_6F01 +ENCODING 28417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +0880 +9FE0 +4920 +2FE0 +2920 +C920 +4FE0 +5540 +64A0 +ENDCHAR +STARTCHAR U_6F02 +ENCODING 28418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2280 +0FE0 +8AA0 +4FE0 +2000 +27C0 +C000 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F03 +ENCODING 28419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1420 +87E0 +44A0 +3FA0 +24A0 +CEA0 +5540 +64A0 +4D20 +ENDCHAR +STARTCHAR U_6F04 +ENCODING 28420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2540 +2FE0 +8900 +4BC0 +0900 +2FE0 +C900 +4BC0 +5100 +6FE0 +ENDCHAR +STARTCHAR U_6F05 +ENCODING 28421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2A80 +0540 +87C0 +4540 +27C0 +2540 +DFE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_6F06 +ENCODING 28422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0380 +8560 +4B80 +2560 +2D40 +C380 +4540 +5920 +4300 +ENDCHAR +STARTCHAR U_6F07 +ENCODING 28423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2880 +12E0 +8680 +4BE0 +3880 +2A80 +CAE0 +4A80 +4D80 +48E0 +ENDCHAR +STARTCHAR U_6F08 +ENCODING 28424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +27A0 +1540 +8A40 +57E0 +2800 +2FE0 +C100 +4580 +4960 +5320 +ENDCHAR +STARTCHAR U_6F09 +ENCODING 28425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0A80 +8FE0 +4AA0 +2FE0 +2C80 +CEE0 +5480 +56A0 +6460 +ENDCHAR +STARTCHAR U_6F0A +ENCODING 28426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0540 +9FE0 +5540 +2FE0 +2920 +DFE0 +4480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_6F0B +ENCODING 28427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +55C0 +1740 +9880 +5540 +37E0 +5A80 +D3C0 +5480 +51C0 +57E0 +ENDCHAR +STARTCHAR U_6F0C +ENCODING 28428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +8880 +5FC0 +1240 +3FC0 +4200 +DFC0 +4F80 +4200 +7FE0 +ENDCHAR +STARTCHAR U_6F0D +ENCODING 28429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +31A0 +1160 +9FE0 +5520 +3D60 +31A0 +DD20 +51E0 +5260 +5FE0 +ENDCHAR +STARTCHAR U_6F0E +ENCODING 28430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2940 +12A0 +8420 +4880 +3A80 +2AE0 +CA80 +4A80 +4D80 +48E0 +ENDCHAR +STARTCHAR U_6F0F +ENCODING 28431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +9800 +5FE0 +2900 +2FE0 +CDA0 +4B60 +5DA0 +4960 +ENDCHAR +STARTCHAR U_6F10 +ENCODING 28432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +FD40 +2340 +FAC0 +2420 +0400 +F6C0 +2500 +4480 +8C60 +ENDCHAR +STARTCHAR U_6F11 +ENCODING 28433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +5FE0 +1440 +9D40 +5540 +1DE0 +20C0 +D4C0 +5940 +5340 +4E60 +ENDCHAR +STARTCHAR U_6F12 +ENCODING 28434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +2A20 +0BE0 +9880 +53E0 +32A0 +3AA0 +CBE0 +4880 +68A0 +57E0 +ENDCHAR +STARTCHAR U_6F13 +ENCODING 28435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0AA0 +8920 +5AA0 +2FE0 +2100 +CFE0 +4AA0 +4FA0 +4860 +ENDCHAR +STARTCHAR U_6F14 +ENCODING 28436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +9FE0 +5100 +27C0 +2540 +C7C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6F15 +ENCODING 28437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0AA0 +8FE0 +5AA0 +2FE0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6F16 +ENCODING 28438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5C80 +0AE0 +BF40 +4940 +1D40 +6480 +DE80 +4540 +5540 +4A20 +ENDCHAR +STARTCHAR U_6F17 +ENCODING 28439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FC0 +2A40 +8B40 +4D40 +2AC0 +2FC0 +C240 +5520 +5440 +47C0 +ENDCHAR +STARTCHAR U_6F18 +ENCODING 28440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0FE0 +8AA0 +4E60 +2BE0 +2A20 +CBE0 +4A20 +53E0 +6220 +ENDCHAR +STARTCHAR U_6F19 +ENCODING 28441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +0A40 +8FC0 +4A40 +2FC0 +2220 +DFE0 +4880 +4480 +4180 +ENDCHAR +STARTCHAR U_6F1A +ENCODING 28442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +0BC0 +8A40 +5BC0 +2800 +2EE0 +CAA0 +4EE0 +4800 +4FE0 +ENDCHAR +STARTCHAR U_6F1B +ENCODING 28443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +1FC0 +0200 +BFE0 +4500 +2A80 +5A60 +E680 +4B80 +5240 +4400 +ENDCHAR +STARTCHAR U_6F1C +ENCODING 28444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +0880 +9DC0 +4AA0 +2880 +2100 +CFC0 +4100 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6F1D +ENCODING 28445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2220 +2AA0 +8660 +4AA0 +1100 +27E0 +E420 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_6F1E +ENCODING 28446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FA0 +2A20 +0540 +8FC0 +5840 +2F40 +2BC0 +C840 +4FC0 +44A0 +58E0 +ENDCHAR +STARTCHAR U_6F1F +ENCODING 28447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +0FE0 +9820 +47C0 +2440 +27C0 +C100 +47C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_6F20 +ENCODING 28448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +0480 +8FC0 +4840 +2FC0 +2840 +DFE0 +4300 +4480 +5860 +ENDCHAR +STARTCHAR U_6F21 +ENCODING 28449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0A40 +93C0 +5240 +2FE0 +2400 +CFE0 +52A0 +4520 +4AC0 +ENDCHAR +STARTCHAR U_6F22 +ENCODING 28450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2480 +0FC0 +8A40 +5FC0 +2200 +2FC0 +C200 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6F23 +ENCODING 28451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +2880 +0BE0 +82A0 +5BE0 +2AA0 +2BE0 +C880 +4BE0 +5480 +63E0 +ENDCHAR +STARTCHAR U_6F24 +ENCODING 28452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +0880 +9DC0 +6AA0 +2200 +3FE0 +C240 +4480 +4380 +5C60 +ENDCHAR +STARTCHAR U_6F25 +ENCODING 28453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1460 +8920 +47C0 +2100 +2FE0 +C100 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6F26 +ENCODING 28454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1120 +FEC0 +38C0 +D520 +7FE0 +4200 +7B60 +4A80 +B660 +ENDCHAR +STARTCHAR U_6F27 +ENCODING 28455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +04E0 +8F00 +5AE0 +2E20 +2A40 +CE80 +44A0 +5FA0 +44E0 +ENDCHAR +STARTCHAR U_6F28 +ENCODING 28456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +53C0 +1680 +8100 +5EE0 +4900 +4FC0 +4900 +CFC0 +5900 +67E0 +ENDCHAR +STARTCHAR U_6F29 +ENCODING 28457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +2500 +1FE0 +8A00 +4DE0 +3440 +3560 +D540 +5540 +56C0 +5460 +ENDCHAR +STARTCHAR U_6F2A +ENCODING 28458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +2BE0 +1940 +8A20 +4FE0 +2820 +2BA0 +DAA0 +6BA0 +4820 +5860 +ENDCHAR +STARTCHAR U_6F2B +ENCODING 28459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +5FE0 +2AA0 +2FE0 +C440 +4280 +4380 +4C60 +ENDCHAR +STARTCHAR U_6F2C +ENCODING 28460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +9FE0 +4100 +2FE0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6F2D +ENCODING 28461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0480 +8240 +4FE0 +2440 +2AA0 +DFE0 +4280 +4480 +4880 +ENDCHAR +STARTCHAR U_6F2E +ENCODING 28462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0940 +8FE0 +4940 +2FC0 +2920 +CD40 +4B80 +5540 +6B20 +ENDCHAR +STARTCHAR U_6F2F +ENCODING 28463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +0FC0 +8940 +5FC0 +2200 +2F80 +C240 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F30 +ENCODING 28464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2920 +0FE0 +9000 +5EE0 +2AA0 +2EE0 +CAA0 +4EE0 +52A0 +6760 +ENDCHAR +STARTCHAR U_6F31 +ENCODING 28465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +0480 +9FE0 +5520 +3F40 +2440 +CE40 +5540 +64A0 +4520 +ENDCHAR +STARTCHAR U_6F32 +ENCODING 28466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +2A00 +0BC0 +9A00 +53C0 +3200 +3FE0 +CAA0 +4AC0 +6B40 +5220 +ENDCHAR +STARTCHAR U_6F33 +ENCODING 28467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +9FE0 +5440 +27C0 +2440 +C7C0 +4100 +5FE0 +4100 +ENDCHAR +STARTCHAR U_6F34 +ENCODING 28468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +5FC0 +0200 +9FE0 +6020 +2F80 +4000 +DFE0 +4A80 +5240 +4600 +ENDCHAR +STARTCHAR U_6F35 +ENCODING 28469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +0AE0 +9FA0 +44A0 +3FA0 +24A0 +CEA0 +5540 +64A0 +4D20 +ENDCHAR +STARTCHAR U_6F36 +ENCODING 28470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +1540 +9FE0 +4920 +2FE0 +2100 +C240 +5520 +5440 +63C0 +ENDCHAR +STARTCHAR U_6F37 +ENCODING 28471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +3FE0 +0AA0 +8AA0 +4EC0 +20A0 +3EA0 +C4A0 +5EE0 +4480 +4C80 +ENDCHAR +STARTCHAR U_6F38 +ENCODING 28472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +3F00 +0500 +9FE0 +5540 +3F40 +3540 +DF40 +4540 +5F40 +4540 +ENDCHAR +STARTCHAR U_6F39 +ENCODING 28473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +05C0 +8500 +5FE0 +2400 +27C0 +C800 +4FE0 +4AA0 +5560 +ENDCHAR +STARTCHAR U_6F3A +ENCODING 28474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8BA0 +4540 +2BA0 +2540 +CBA0 +4280 +4440 +5820 +ENDCHAR +STARTCHAR U_6F3B +ENCODING 28475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +0660 +9AA0 +4300 +2480 +3A60 +C500 +4640 +4080 +4700 +ENDCHAR +STARTCHAR U_6F3C +ENCODING 28476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2FE0 +0500 +8500 +4FE0 +2900 +3FE0 +C900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6F3D +ENCODING 28477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5040 +1FC0 +9540 +7380 +3D40 +5500 +D7C0 +5900 +6FE0 +4100 +ENDCHAR +STARTCHAR U_6F3E +ENCODING 28478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +3FE0 +0100 +8FC0 +4100 +3FE0 +2220 +CF40 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6F3F +ENCODING 28479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +5680 +7940 +17E0 +F240 +55C0 +8400 +76C0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_6F40 +ENCODING 28480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +8000 +40E0 +2F00 +2540 +C540 +4BA0 +5120 +4100 +ENDCHAR +STARTCHAR U_6F41 +ENCODING 28481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +7080 +4BE0 +3A20 +17E0 +FA20 +33E0 +5A20 +57E0 +9140 +3620 +ENDCHAR +STARTCHAR U_6F42 +ENCODING 28482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5240 +1FC0 +C880 +2500 +3FE0 +4500 +D540 +4D80 +4500 +5FE0 +ENDCHAR +STARTCHAR U_6F43 +ENCODING 28483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +29E0 +1340 +8480 +4BE0 +3E40 +2BC0 +CA40 +4BC0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_6F44 +ENCODING 28484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +7E80 +0880 +BFE0 +6B40 +3F40 +5940 +DC80 +6A80 +4940 +4A20 +ENDCHAR +STARTCHAR U_6F45 +ENCODING 28485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5200 +2FE0 +8500 +6FE0 +1900 +6FC0 +C900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6F46 +ENCODING 28486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9FE0 +52A0 +2F00 +2240 +CFE0 +4500 +4940 +5320 +ENDCHAR +STARTCHAR U_6F47 +ENCODING 28487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +0480 +8FC0 +4140 +3FE0 +2140 +CFC0 +4920 +4BA0 +5560 +ENDCHAR +STARTCHAR U_6F48 +ENCODING 28488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +0AA0 +8FE0 +4200 +2D20 +4340 +CD80 +4340 +5D20 +4300 +ENDCHAR +STARTCHAR U_6F49 +ENCODING 28489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4940 +0FC0 +8840 +6FC0 +2840 +4FC0 +C920 +4DC0 +4920 +4CE0 +ENDCHAR +STARTCHAR U_6F4A +ENCODING 28490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4640 +0960 +9F40 +44E0 +1EA0 +24A0 +CE40 +5540 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6F4B +ENCODING 28491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2A80 +11E0 +8EA0 +40A0 +29A0 +35A0 +CAA0 +4340 +5CA0 +4120 +ENDCHAR +STARTCHAR U_6F4C +ENCODING 28492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +9520 +6880 +2FC0 +4480 +4FC0 +C200 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6F4D +ENCODING 28493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +29E0 +1740 +9D40 +49E0 +2B40 +2DE0 +C140 +4D40 +71E0 +4100 +ENDCHAR +STARTCHAR U_6F4E +ENCODING 28494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5580 +2E80 +04E0 +9FA0 +5520 +3520 +3F20 +D5A0 +5540 +55A0 +5320 +ENDCHAR +STARTCHAR U_6F4F +ENCODING 28495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0FE0 +84A0 +5980 +2FE0 +2AA0 +CFE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6F50 +ENCODING 28496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2FE0 +0900 +9FC0 +4900 +2FC0 +2900 +CFE0 +4940 +52A0 +52A0 +ENDCHAR +STARTCHAR U_6F51 +ENCODING 28497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +34A0 +0840 +9DE0 +4540 +3D60 +3000 +DFE0 +4540 +5480 +4B60 +ENDCHAR +STARTCHAR U_6F52 +ENCODING 28498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2480 +0FE0 +9920 +4FE0 +2220 +2D40 +C280 +4DC0 +42A0 +4D80 +ENDCHAR +STARTCHAR U_6F53 +ENCODING 28499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0920 +8FE0 +4920 +2FE0 +2140 +CFE0 +4540 +5460 +63C0 +ENDCHAR +STARTCHAR U_6F54 +ENCODING 28500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +24A0 +1EA0 +84A0 +5F60 +2480 +2F00 +C240 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F55 +ENCODING 28501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +5FE0 +3540 +9540 +5FE0 +3540 +3540 +DFE0 +4D40 +52A0 +52A0 +ENDCHAR +STARTCHAR U_6F56 +ENCODING 28502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +4440 +1EE0 +8440 +7EE0 +2000 +4FC0 +CA40 +4FC0 +4820 +47E0 +ENDCHAR +STARTCHAR U_6F57 +ENCODING 28503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +27E0 +0D00 +97C0 +4500 +27C0 +2500 +CFE0 +4380 +4540 +5920 +ENDCHAR +STARTCHAR U_6F58 +ENCODING 28504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +3E40 +0A80 +9FE0 +4A80 +3240 +3FE0 +CA40 +4FC0 +4A40 +4FC0 +ENDCHAR +STARTCHAR U_6F59 +ENCODING 28505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +81C0 +4E40 +0A80 +9F80 +6880 +2FC0 +4840 +CFE0 +4020 +5AA0 +5560 +ENDCHAR +STARTCHAR U_6F5A +ENCODING 28506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +0FE0 +8240 +5FC0 +36A0 +3EE0 +D220 +5EE0 +5AA0 +6AA0 +ENDCHAR +STARTCHAR U_6F5B +ENCODING 28507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3540 +1FE0 +8C40 +4EE0 +3540 +2FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6F5C +ENCODING 28508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5DC0 +0880 +BDE0 +4880 +1540 +2FA0 +C880 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_6F5D +ENCODING 28509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2840 +17E0 +8440 +47C0 +2000 +3FE0 +CAA0 +4660 +5BA0 +4660 +ENDCHAR +STARTCHAR U_6F5E +ENCODING 28510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +32E0 +1320 +9EC0 +44C0 +2520 +3620 +D5E0 +5520 +7720 +59E0 +ENDCHAR +STARTCHAR U_6F5F +ENCODING 28511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +2840 +0EC0 +8840 +4FC0 +2400 +2FE0 +D020 +4560 +4AA0 +4040 +ENDCHAR +STARTCHAR U_6F60 +ENCODING 28512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +3540 +1DC0 +9120 +5FE0 +2480 +2FC0 +C480 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6F61 +ENCODING 28513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +0AE0 +8AA0 +4FA0 +20A0 +3EA0 +C440 +5F40 +44A0 +4D20 +ENDCHAR +STARTCHAR U_6F62 +ENCODING 28514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +8FE0 +5100 +27C0 +2540 +C7C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6F63 +ENCODING 28515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2920 +2FE0 +CAA0 +4920 +4AA0 +4860 +ENDCHAR +STARTCHAR U_6F64 +ENCODING 28516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2BA0 +2920 +CBA0 +4920 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6F65 +ENCODING 28517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +4500 +1FC0 +9540 +5FC0 +2A40 +4680 +DFE0 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6F66 +ENCODING 28518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +14A0 +8FC0 +5460 +27C0 +2440 +C7C0 +4540 +4920 +4300 +ENDCHAR +STARTCHAR U_6F67 +ENCODING 28519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +8AA0 +4920 +2FE0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6F68 +ENCODING 28520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +1540 +9FC0 +40C0 +3F00 +4A40 +D780 +6A80 +5260 +6200 +ENDCHAR +STARTCHAR U_6F69 +ENCODING 28521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +8920 +4FE0 +2280 +2FE0 +C280 +5FE0 +4440 +4820 +ENDCHAR +STARTCHAR U_6F6A +ENCODING 28522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2EE0 +14A0 +8FA0 +44E0 +2A00 +37C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6F6B +ENCODING 28523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +0200 +8FE0 +4A40 +37A0 +2240 +CFE0 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6F6C +ENCODING 28524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0FE0 +8540 +47C0 +2540 +27C0 +C100 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6F6D +ENCODING 28525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2280 +0FE0 +8AA0 +4FE0 +2440 +27C0 +C440 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6F6E +ENCODING 28526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3EA0 +04A0 +9EE0 +52A0 +1EA0 +32E0 +DEA0 +44A0 +5EA0 +4560 +ENDCHAR +STARTCHAR U_6F6F +ENCODING 28527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +07C0 +8040 +4FE0 +24A0 +2EE0 +C040 +5FE0 +4840 +44C0 +ENDCHAR +STARTCHAR U_6F70 +ENCODING 28528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +0940 +9FE0 +4840 +2FC0 +2840 +CFC0 +4840 +4FC0 +5860 +ENDCHAR +STARTCHAR U_6F71 +ENCODING 28529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2200 +1FE0 +9020 +4FC0 +2000 +4FC0 +C840 +4FC0 +4480 +5FE0 +ENDCHAR +STARTCHAR U_6F72 +ENCODING 28530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +3DA0 +04C0 +9FE0 +4520 +2DE0 +2F20 +D5E0 +6520 +4520 +4560 +ENDCHAR +STARTCHAR U_6F73 +ENCODING 28531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8900 +4FE0 +2940 +2FE0 +CA20 +4FE0 +5220 +63E0 +ENDCHAR +STARTCHAR U_6F74 +ENCODING 28532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +35E0 +08A0 +97E0 +4480 +2DE0 +3520 +C7E0 +4520 +55E0 +4920 +ENDCHAR +STARTCHAR U_6F75 +ENCODING 28533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +7E80 +14E0 +BF40 +6140 +3F40 +5280 +DE80 +5280 +5F60 +5240 +ENDCHAR +STARTCHAR U_6F76 +ENCODING 28534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0920 +8FE0 +5100 +2FE0 +2100 +CFE0 +4000 +4AA0 +4AA0 +ENDCHAR +STARTCHAR U_6F77 +ENCODING 28535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5540 +2220 +9FC0 +4240 +3FE0 +2240 +DFE0 +4200 +7FE0 +4200 +ENDCHAR +STARTCHAR U_6F78 +ENCODING 28536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0440 +8EE0 +5540 +27C0 +2440 +C7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_6F79 +ENCODING 28537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +0700 +8A80 +5240 +0A80 +5FC0 +CD80 +5AC0 +6AA0 +4880 +ENDCHAR +STARTCHAR U_6F7A +ENCODING 28538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +8880 +4FE0 +2900 +2FE0 +CA40 +4FE0 +5240 +66C0 +ENDCHAR +STARTCHAR U_6F7B +ENCODING 28539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0FE0 +8540 +4920 +3380 +2D60 +C540 +4380 +4540 +5B20 +ENDCHAR +STARTCHAR U_6F7C +ENCODING 28540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8100 +5FE0 +2540 +27C0 +C540 +47C0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6F7D +ENCODING 28541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0AA0 +86C0 +5FE0 +2000 +27C0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6F7E +ENCODING 28542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +0FE0 +8540 +4920 +3040 +2FE0 +C940 +57E0 +4840 +5040 +ENDCHAR +STARTCHAR U_6F7F +ENCODING 28543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3220 +17A0 +92A0 +5FE0 +34A0 +3FE0 +D520 +57E0 +5120 +5FE0 +ENDCHAR +STARTCHAR U_6F80 +ENCODING 28544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +1BA0 +8AA0 +5320 +2440 +2440 +D760 +5540 +5D40 +73E0 +ENDCHAR +STARTCHAR U_6F81 +ENCODING 28545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4BC0 +0A00 +9FE0 +4000 +2440 +5760 +D540 +5F40 +71E0 +4000 +ENDCHAR +STARTCHAR U_6F82 +ENCODING 28546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3540 +1FE0 +80A0 +4EA0 +21A0 +3EA0 +C4A0 +4E40 +44A0 +5F20 +ENDCHAR +STARTCHAR U_6F83 +ENCODING 28547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +C540 +26C0 +D540 +27C0 +C440 +0820 +7580 +1600 +2500 +CCC0 +ENDCHAR +STARTCHAR U_6F84 +ENCODING 28548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +2AA0 +0440 +8FC0 +5020 +27C0 +2440 +C7C0 +4440 +4280 +4FE0 +ENDCHAR +STARTCHAR U_6F85 +ENCODING 28549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2140 +0FE0 +9140 +57C0 +2100 +3FE0 +C540 +47C0 +4540 +5FE0 +ENDCHAR +STARTCHAR U_6F86 +ENCODING 28550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +9FE0 +4440 +2EE0 +2440 +DFE0 +4480 +48A0 +5060 +ENDCHAR +STARTCHAR U_6F87 +ENCODING 28551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9540 +4EE0 +0440 +8AA0 +4FE0 +2A20 +2FC0 +C240 +4240 +4440 +58C0 +ENDCHAR +STARTCHAR U_6F88 +ENCODING 28552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +3F00 +15E0 +BD40 +4340 +3D40 +5540 +DC80 +5480 +5D40 +5620 +ENDCHAR +STARTCHAR U_6F89 +ENCODING 28553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2480 +1FE0 +8AA0 +4EA0 +2AA0 +2EA0 +CAA0 +5F40 +42A0 +4320 +ENDCHAR +STARTCHAR U_6F8A +ENCODING 28554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +0500 +9FC0 +5540 +38C0 +5740 +D0C0 +7FE0 +4480 +4180 +ENDCHAR +STARTCHAR U_6F8B +ENCODING 28555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +9440 +57C0 +2100 +2FE0 +C440 +47C0 +4940 +5320 +ENDCHAR +STARTCHAR U_6F8C +ENCODING 28556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +3F80 +0A80 +8EE0 +4AA0 +2EA0 +2AA0 +DFA0 +4AA0 +52A0 +6120 +ENDCHAR +STARTCHAR U_6F8D +ENCODING 28557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +3F20 +04E0 +9F20 +4020 +3F20 +32A0 +DEA0 +4A20 +44A0 +5E40 +ENDCHAR +STARTCHAR U_6F8E +ENCODING 28558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +3F20 +0440 +8E80 +4020 +0F40 +2980 +CF20 +4920 +4640 +5980 +ENDCHAR +STARTCHAR U_6F8F +ENCODING 28559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +8780 +4000 +3DE0 +5520 +5DE0 +C200 +5220 +5220 +5FE0 +ENDCHAR +STARTCHAR U_6F90 +ENCODING 28560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +8920 +52A0 +2FC0 +2000 +CFE0 +4280 +4440 +4FA0 +ENDCHAR +STARTCHAR U_6F91 +ENCODING 28561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +0EE0 +8AA0 +5EE0 +2280 +4FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6F92 +ENCODING 28562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2080 +1FE0 +8A20 +4BE0 +2A20 +2FE0 +DA20 +43E0 +4140 +4620 +ENDCHAR +STARTCHAR U_6F93 +ENCODING 28563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4600 +2BE0 +1240 +87C0 +4A40 +3BC0 +2900 +CBE0 +4D40 +4880 +4F60 +ENDCHAR +STARTCHAR U_6F94 +ENCODING 28564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2940 +1DE0 +9640 +57E0 +3C00 +35E0 +D520 +5D20 +55E0 +4120 +ENDCHAR +STARTCHAR U_6F95 +ENCODING 28565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +9FE0 +5540 +2FE0 +2540 +CFE0 +4100 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6F96 +ENCODING 28566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2920 +2FE0 +C920 +4BA0 +4D60 +4860 +ENDCHAR +STARTCHAR U_6F97 +ENCODING 28567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +8AA0 +4EE0 +2BA0 +2AA0 +CBA0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_6F98 +ENCODING 28568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +8DC0 +5AA0 +2A80 +2000 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6F99 +ENCODING 28569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +39C0 +1040 +9DC0 +5040 +3FC0 +4800 +DFE0 +4020 +55A0 +5540 +ENDCHAR +STARTCHAR U_6F9A +ENCODING 28570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +5FC0 +1AC0 +9FC0 +5740 +1AC0 +3FE0 +C400 +47C0 +4040 +40C0 +ENDCHAR +STARTCHAR U_6F9B +ENCODING 28571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8780 +5900 +0FC0 +CA40 +1FC0 +2A40 +3FE0 +C880 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_6F9C +ENCODING 28572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2520 +1FE0 +9120 +5FE0 +3560 +3FE0 +D120 +53A0 +5560 +5160 +ENDCHAR +STARTCHAR U_6F9D +ENCODING 28573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1240 +8CA0 +5380 +2FC0 +2A40 +CFC0 +4A40 +4FC0 +4A40 +ENDCHAR +STARTCHAR U_6F9E +ENCODING 28574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +0FE0 +8920 +4FC0 +2920 +2FE0 +CC40 +5FE0 +6280 +4C60 +ENDCHAR +STARTCHAR U_6F9F +ENCODING 28575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +1040 +9740 +1540 +5FC0 +4200 +DFE0 +4680 +5A60 +4200 +ENDCHAR +STARTCHAR U_6FA0 +ENCODING 28576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3540 +1DC0 +8500 +5DC0 +3540 +3DC0 +D540 +5DC0 +4520 +43E0 +ENDCHAR +STARTCHAR U_6FA1 +ENCODING 28577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +8000 +4EE0 +2AA0 +2EE0 +C100 +5FE0 +4540 +5920 +ENDCHAR +STARTCHAR U_6FA2 +ENCODING 28578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +1FE0 +94A0 +4780 +2000 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_6FA3 +ENCODING 28579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3EC0 +0520 +9E00 +53E0 +3E40 +33E0 +DE40 +4440 +5E40 +4440 +ENDCHAR +STARTCHAR U_6FA4 +ENCODING 28580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +8100 +47C0 +2100 +2FE0 +C280 +4100 +4FE0 +4100 +ENDCHAR +STARTCHAR U_6FA5 +ENCODING 28581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2EA0 +12A0 +9F20 +5540 +3FE0 +3540 +D5E0 +5F40 +5540 +6340 +ENDCHAR +STARTCHAR U_6FA6 +ENCODING 28582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3480 +09E0 +9F20 +4BE0 +2920 +29E0 +C920 +49E0 +6940 +5220 +ENDCHAR +STARTCHAR U_6FA7 +ENCODING 28583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0AA0 +8FE0 +4AA0 +3FE0 +2840 +CFC0 +4480 +4300 +5FE0 +ENDCHAR +STARTCHAR U_6FA8 +ENCODING 28584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2A40 +1120 +8000 +4FE0 +2940 +2940 +D5A0 +5520 +4100 +5FE0 +ENDCHAR +STARTCHAR U_6FA9 +ENCODING 28585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +4A40 +75C0 +4A40 +75C0 +4A40 +FFE0 +8220 +7B40 +1280 +E660 +ENDCHAR +STARTCHAR U_6FAA +ENCODING 28586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0FE0 +8920 +5540 +2AA0 +2540 +CFE0 +4080 +4300 +4080 +ENDCHAR +STARTCHAR U_6FAB +ENCODING 28587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +97C0 +5540 +27C0 +2D40 +CFE0 +4960 +4FA0 +4860 +ENDCHAR +STARTCHAR U_6FAC +ENCODING 28588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +25E0 +06A0 +8940 +4220 +27C0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FAD +ENCODING 28589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0940 +8BE0 +5540 +39E0 +2B40 +D5E0 +5D40 +49E0 +5100 +ENDCHAR +STARTCHAR U_6FAE +ENCODING 28590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2440 +0BA0 +9000 +5FE0 +2AA0 +2FE0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6FAF +ENCODING 28591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46E0 +24A0 +0E40 +92A0 +4D20 +2920 +3540 +DFE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_6FB0 +ENCODING 28592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2380 +0440 +9BA0 +5000 +2EE0 +2AA0 +CEE0 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_6FB1 +ENCODING 28593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEE0 +62A0 +3EA0 +AAA0 +7F00 +2AE0 +6AA0 +BFA0 +A040 +CAA0 +9120 +ENDCHAR +STARTCHAR U_6FB2 +ENCODING 28594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +26C0 +0FE0 +8280 +4FE0 +2100 +2FE0 +C100 +4FE0 +4540 +4920 +ENDCHAR +STARTCHAR U_6FB3 +ENCODING 28595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0D60 +8BA0 +4FE0 +2920 +2BA0 +CD60 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_6FB4 +ENCODING 28596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +9000 +5FE0 +2440 +27C0 +C520 +4CC0 +5540 +4620 +ENDCHAR +STARTCHAR U_6FB5 +ENCODING 28597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9020 +49C0 +3F00 +9500 +7FE0 +2940 +7F40 +CD40 +5B40 +6940 +4A40 +ENDCHAR +STARTCHAR U_6FB6 +ENCODING 28598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +0AA0 +8BA0 +4820 +2FE0 +2440 +C7C0 +4440 +4440 +5FE0 +ENDCHAR +STARTCHAR U_6FB7 +ENCODING 28599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4880 +0F80 +8880 +5FC0 +1540 +3FC0 +C200 +5FE0 +4480 +4980 +ENDCHAR +STARTCHAR U_6FB8 +ENCODING 28600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +2FE0 +8880 +4EA0 +2AA0 +2EC0 +5160 +E220 +5540 +5460 +63C0 +ENDCHAR +STARTCHAR U_6FB9 +ENCODING 28601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2480 +1FE0 +8AA0 +4FE0 +2800 +2BC0 +C800 +4FE0 +5420 +67E0 +ENDCHAR +STARTCHAR U_6FBA +ENCODING 28602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +8FE0 +4440 +27C0 +2440 +C7C0 +5540 +54A0 +63E0 +ENDCHAR +STARTCHAR U_6FBB +ENCODING 28603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +6280 +1FC0 +9200 +4540 +3380 +5D40 +D320 +5500 +7900 +47E0 +ENDCHAR +STARTCHAR U_6FBC +ENCODING 28604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +2BE0 +0AA0 +8E40 +49E0 +2E40 +2BE0 +DA40 +6A40 +4E40 +4A40 +ENDCHAR +STARTCHAR U_6FBD +ENCODING 28605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +0FE0 +8A80 +4B20 +2FE0 +2900 +CEA0 +49C0 +56A0 +6120 +ENDCHAR +STARTCHAR U_6FBE +ENCODING 28606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +1100 +97E0 +4280 +37C0 +5100 +D7E0 +5100 +5900 +67E0 +ENDCHAR +STARTCHAR U_6FBF +ENCODING 28607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0440 +8EE0 +5540 +2440 +2FC0 +C000 +5FE0 +4940 +5320 +ENDCHAR +STARTCHAR U_6FC0 +ENCODING 28608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3E80 +12E0 +9EA0 +53A0 +3EA0 +28A0 +DFA0 +4A40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6FC1 +ENCODING 28609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0FE0 +8400 +4FE0 +3220 +2FA0 +CAA0 +4FA0 +42A0 +4FE0 +ENDCHAR +STARTCHAR U_6FC2 +ENCODING 28610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0A40 +8FE0 +4AA0 +2FE0 +2AA0 +CFE0 +52C0 +66A0 +6AA0 +ENDCHAR +STARTCHAR U_6FC3 +ENCODING 28611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8AA0 +4FE0 +2AA0 +2FE0 +2800 +CFE0 +4D40 +5480 +6660 +ENDCHAR +STARTCHAR U_6FC4 +ENCODING 28612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A7C0 +5440 +1740 +8540 +7FE0 +2820 +2BA0 +CAA0 +4BA0 +5400 +63E0 +ENDCHAR +STARTCHAR U_6FC5 +ENCODING 28613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +20A0 +8F80 +4080 +3FE0 +2220 +CF80 +4500 +4200 +4DC0 +ENDCHAR +STARTCHAR U_6FC6 +ENCODING 28614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8540 +4FE0 +2440 +27C0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FC7 +ENCODING 28615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8540 +4BA0 +3FE0 +2820 +2BA0 +CAA0 +4BA0 +4820 +4FE0 +ENDCHAR +STARTCHAR U_6FC8 +ENCODING 28616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EC0 +2AA0 +8E80 +40E0 +3F80 +2AA0 +2EA0 +CA40 +4E40 +4A60 +5FA0 +ENDCHAR +STARTCHAR U_6FC9 +ENCODING 28617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +3D40 +95E0 +5F40 +1540 +15E0 +3D40 +D5E0 +5D40 +5540 +41E0 +ENDCHAR +STARTCHAR U_6FCA +ENCODING 28618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2500 +8FE0 +40A0 +2FE0 +2A80 +2AA0 +CEA0 +4B40 +52A0 +6520 +ENDCHAR +STARTCHAR U_6FCB +ENCODING 28619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +8440 +4EE0 +3540 +2440 +3FE0 +C920 +49C0 +5500 +63E0 +ENDCHAR +STARTCHAR U_6FCC +ENCODING 28620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +26A0 +F9C0 +AEA0 +F980 +A800 +FBE0 +2220 +FBE0 +2220 +FBE0 +ENDCHAR +STARTCHAR U_6FCD +ENCODING 28621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +4FE0 +2AA0 +3720 +2DA0 +C6C0 +5940 +68A0 +47A0 +ENDCHAR +STARTCHAR U_6FCE +ENCODING 28622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2AA0 +8BA0 +4AA0 +2BA0 +2AA0 +2FE0 +C280 +5EE0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_6FCF +ENCODING 28623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2440 +8EE0 +4440 +2EE0 +2100 +24C0 +D4A0 +5520 +6640 +5BC0 +ENDCHAR +STARTCHAR U_6FD0 +ENCODING 28624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4A40 +0FC0 +8220 +4FC0 +2280 +3FE0 +C440 +7FC0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6FD1 +ENCODING 28625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88E0 +7F40 +09E0 +BE20 +6AA0 +2AA0 +7EA0 +CAA0 +5EA0 +6B40 +4A20 +ENDCHAR +STARTCHAR U_6FD2 +ENCODING 28626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +2E80 +8BE0 +5E20 +2AA0 +2AA0 +3AA0 +CAA0 +4680 +4940 +5220 +ENDCHAR +STARTCHAR U_6FD3 +ENCODING 28627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0480 +9FE0 +5540 +3FE0 +5540 +DFC0 +5580 +6D60 +5500 +ENDCHAR +STARTCHAR U_6FD4 +ENCODING 28628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +8920 +4FE0 +2DA0 +2B60 +2DA0 +CB60 +4DA0 +4920 +4960 +ENDCHAR +STARTCHAR U_6FD5 +ENCODING 28629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +9FE0 +5820 +2FE0 +2540 +3EE0 +CAA0 +5FE0 +4D40 +52A0 +ENDCHAR +STARTCHAR U_6FD6 +ENCODING 28630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5540 +1FC0 +8220 +5FC0 +2280 +5FE0 +F880 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_6FD7 +ENCODING 28631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +5FE0 +0500 +8F80 +4A80 +3FE0 +2A80 +DFC0 +6AA0 +4B80 +4200 +ENDCHAR +STARTCHAR U_6FD8 +ENCODING 28632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8AA0 +4640 +2940 +2FE0 +2AA0 +DFE0 +4100 +4100 +4700 +ENDCHAR +STARTCHAR U_6FD9 +ENCODING 28633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +5DC0 +0880 +9540 +5FE0 +1020 +2A40 +CA80 +5300 +4480 +5860 +ENDCHAR +STARTCHAR U_6FDA +ENCODING 28634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FC0 +8480 +4B40 +1FE0 +3220 +2FC0 +C700 +4A80 +5260 +4200 +ENDCHAR +STARTCHAR U_6FDB +ENCODING 28635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8280 +4FE0 +2820 +2FE0 +2340 +DC80 +42C0 +5CA0 +4320 +ENDCHAR +STARTCHAR U_6FDC +ENCODING 28636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +8140 +4FE0 +2140 +3FE0 +2AA0 +CFE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6FDD +ENCODING 28637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +4780 +2480 +3FE0 +2A40 +D520 +4FC0 +4940 +5320 +ENDCHAR +STARTCHAR U_6FDE +ENCODING 28638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +9440 +5440 +2FE0 +2920 +2FE0 +C920 +5FE0 +4440 +4840 +ENDCHAR +STARTCHAR U_6FDF +ENCODING 28639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +8540 +5EA0 +2AA0 +2AA0 +3200 +CFC0 +4840 +4FC0 +5040 +ENDCHAR +STARTCHAR U_6FE0 +ENCODING 28640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8440 +5FE0 +3020 +2FC0 +2940 +D280 +4DC0 +42A0 +5D20 +ENDCHAR +STARTCHAR U_6FE1 +ENCODING 28641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +4920 +2BA0 +2540 +2FE0 +C100 +4FE0 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_6FE2 +ENCODING 28642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +8660 +4AA0 +2120 +3FC0 +2480 +CB40 +5FE0 +4100 +4100 +ENDCHAR +STARTCHAR U_6FE3 +ENCODING 28643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F40 +8420 +5F40 +32C0 +3F40 +32C0 +DE60 +45C0 +5E40 +4440 +ENDCHAR +STARTCHAR U_6FE4 +ENCODING 28644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +8200 +5FE0 +2220 +2FC0 +2040 +DFE0 +5540 +5D40 +40C0 +ENDCHAR +STARTCHAR U_6FE5 +ENCODING 28645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8780 +4D00 +0600 +BFE0 +5220 +2FC0 +2A40 +CFC0 +4A40 +4FC0 +4480 +ENDCHAR +STARTCHAR U_6FE6 +ENCODING 28646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +2920 +9FE0 +4200 +3FE0 +2040 +2FC0 +C040 +5FC0 +5920 +6FC0 +ENDCHAR +STARTCHAR U_6FE7 +ENCODING 28647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5B20 +2A20 +9F20 +4AE0 +2420 +3F20 +24A0 +DF60 +4420 +5F20 +4060 +ENDCHAR +STARTCHAR U_6FE8 +ENCODING 28648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +9FE0 +4440 +2AA0 +2440 +2AA0 +DEE0 +5540 +54A0 +63A0 +ENDCHAR +STARTCHAR U_6FE9 +ENCODING 28649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8480 +4FE0 +3480 +27E0 +2480 +CFE0 +4240 +4180 +4E60 +ENDCHAR +STARTCHAR U_6FEA +ENCODING 28650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5EE0 +0940 +9DE0 +6960 +3FA0 +55E0 +DD00 +5500 +5D20 +54E0 +ENDCHAR +STARTCHAR U_6FEB +ENCODING 28651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +3480 +1EE0 +9280 +5F40 +3420 +3E00 +C000 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_6FEC +ENCODING 28652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +1FE0 +94A0 +4B40 +2480 +2FE0 +C440 +47C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_6FED +ENCODING 28653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +0540 +8FC0 +4100 +2FE0 +2200 +C440 +4FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_6FEE +ENCODING 28654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2B60 +0FE0 +8940 +5FE0 +2880 +2BE0 +C880 +4FE0 +4940 +4A20 +ENDCHAR +STARTCHAR U_6FEF +ENCODING 28655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +0660 +8AA0 +6320 +2900 +2FE0 +D900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_6FF0 +ENCODING 28656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4980 +2940 +13E0 +9D40 +4940 +2BE0 +3F40 +C1E0 +5540 +6B40 +41E0 +ENDCHAR +STARTCHAR U_6FF1 +ENCODING 28657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1020 +8FC0 +4540 +3FC0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FF2 +ENCODING 28658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3FA0 +04A0 +9FA0 +5500 +3FE0 +24A0 +DEA0 +4440 +4EA0 +5520 +ENDCHAR +STARTCHAR U_6FF3 +ENCODING 28659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +5FE0 +2480 +9FE0 +4CA0 +3360 +4FC0 +C840 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_6FF4 +ENCODING 28660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2EE0 +1440 +8AA0 +5FE0 +3120 +2F20 +C540 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_6FF5 +ENCODING 28661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1020 +8FC0 +4A40 +2FC0 +2D40 +CEC0 +5540 +57C0 +6480 +ENDCHAR +STARTCHAR U_6FF6 +ENCODING 28662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9DE0 +5520 +1DE0 +9520 +7FE0 +5220 +DFE0 +5220 +57A0 +54A0 +57E0 +ENDCHAR +STARTCHAR U_6FF7 +ENCODING 28663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0640 +7D80 +14E0 +2C80 +DFE0 +0480 +DFE0 +39A0 +D560 +5B20 +5160 +ENDCHAR +STARTCHAR U_6FF8 +ENCODING 28664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +7FE0 +0A80 +8500 +4F80 +38E0 +2F80 +C880 +4FC0 +5840 +6FC0 +ENDCHAR +STARTCHAR U_6FF9 +ENCODING 28665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FC0 +3740 +1FC0 +8200 +4FC0 +2200 +3FE0 +EAA0 +4FC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_6FFA +ENCODING 28666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D40 +37E0 +1540 +9CA0 +5760 +3D40 +37E0 +D520 +5D40 +48A0 +5760 +ENDCHAR +STARTCHAR U_6FFB +ENCODING 28667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +37E0 +16A0 +9BE0 +5480 +37E0 +3620 +DFE0 +5220 +53E0 +5620 +ENDCHAR +STARTCHAR U_6FFC +ENCODING 28668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +2FA0 +1540 +8FA0 +5540 +3FE0 +2100 +DFE0 +4580 +4940 +5120 +ENDCHAR +STARTCHAR U_6FFD +ENCODING 28669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4EE0 +0440 +8FE0 +6AA0 +27C0 +2540 +C6C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_6FFE +ENCODING 28670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +0FE0 +8A20 +4FE0 +2920 +2FE0 +C920 +57E0 +6D40 +47A0 +ENDCHAR +STARTCHAR U_6FFF +ENCODING 28671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3280 +1FE0 +9280 +57C0 +3540 +37C0 +D540 +5FE0 +6920 +4BA0 +ENDCHAR +STARTCHAR U_7000 +ENCODING 28672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4440 +07C0 +8440 +5FE0 +2AA0 +57A0 +4400 +CFC0 +5300 +4CC0 +ENDCHAR +STARTCHAR U_7001 +ENCODING 28673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0100 +9FE0 +4840 +3FE0 +2840 +CFC0 +4A20 +4940 +4CE0 +ENDCHAR +STARTCHAR U_7002 +ENCODING 28674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8700 +4900 +1FC0 +9240 +5FC0 +3240 +5FC0 +E8A0 +4F80 +4880 +4F80 +ENDCHAR +STARTCHAR U_7003 +ENCODING 28675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +81E0 +5D20 +15E0 +9D20 +55E0 +1D00 +37E0 +DCA0 +4360 +54A0 +5360 +ENDCHAR +STARTCHAR U_7004 +ENCODING 28676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +1540 +8EE0 +4AA0 +2EA0 +2AA0 +CEA0 +4AE0 +4D80 +4880 +ENDCHAR +STARTCHAR U_7005 +ENCODING 28677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2F60 +1540 +8AA0 +4FE0 +2820 +2FE0 +C100 +47C0 +4140 +5FE0 +ENDCHAR +STARTCHAR U_7006 +ENCODING 28678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +8FE0 +4AA0 +2FE0 +2440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_7007 +ENCODING 28679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +1280 +9FE0 +5280 +3FE0 +3540 +D7C0 +5540 +57C0 +6C60 +ENDCHAR +STARTCHAR U_7008 +ENCODING 28680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9DC0 +5540 +0CC0 +9540 +7FE0 +2AA0 +2F80 +CA80 +5FE0 +4200 +4200 +ENDCHAR +STARTCHAR U_7009 +ENCODING 28681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +12A0 +8840 +4EC0 +2840 +2FC0 +C800 +5FE0 +6560 +4AA0 +ENDCHAR +STARTCHAR U_700A +ENCODING 28682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +3D40 +1620 +95E0 +5D40 +3480 +3760 +C000 +5FC0 +5540 +7FE0 +ENDCHAR +STARTCHAR U_700B +ENCODING 28683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +9960 +4580 +3FE0 +2940 +3FE0 +C940 +4FC0 +4940 +4FC0 +ENDCHAR +STARTCHAR U_700C +ENCODING 28684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +9280 +5FE0 +12A0 +3FE0 +3480 +D7E0 +5480 +57E0 +6AA0 +ENDCHAR +STARTCHAR U_700D +ENCODING 28685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8AA0 +4BE0 +2AA0 +2FE0 +2A40 +CCA0 +57E0 +5080 +6FE0 +ENDCHAR +STARTCHAR U_700E +ENCODING 28686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +8480 +4FE0 +1AA0 +2FE0 +2140 +CFE0 +48A0 +4D60 +5220 +ENDCHAR +STARTCHAR U_700F +ENCODING 28687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +34A0 +9DA0 +56A0 +09A0 +3FA0 +24A0 +DFA0 +55A0 +4F20 +7860 +ENDCHAR +STARTCHAR U_7010 +ENCODING 28688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5EC0 +04A0 +BFE0 +4A80 +3BA0 +4AA0 +DBC0 +4AA0 +4F60 +5220 +ENDCHAR +STARTCHAR U_7011 +ENCODING 28689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2840 +8FC0 +4840 +1FE0 +2480 +3FE0 +CD40 +53A0 +4540 +4B20 +ENDCHAR +STARTCHAR U_7012 +ENCODING 28690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1240 +9740 +6AA0 +5240 +7FE0 +D540 +5740 +5040 +5FC0 +ENDCHAR +STARTCHAR U_7013 +ENCODING 28691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5280 +2AE0 +8FA0 +50A0 +3720 +52A0 +D740 +5240 +5FA0 +5120 +ENDCHAR +STARTCHAR U_7014 +ENCODING 28692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3FA0 +84A0 +5FA0 +1000 +2FE0 +24A0 +DFA0 +4440 +4EA0 +5520 +ENDCHAR +STARTCHAR U_7015 +ENCODING 28693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +3680 +95E0 +5F20 +05E0 +2D20 +35E0 +D720 +45E0 +4940 +5220 +ENDCHAR +STARTCHAR U_7016 +ENCODING 28694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +4920 +07C0 +2900 +2FE0 +D900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_7017 +ENCODING 28695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +9120 +4FC0 +2100 +3FE0 +2AA0 +CFE0 +5140 +54A0 +67A0 +ENDCHAR +STARTCHAR U_7018 +ENCODING 28696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +8FE0 +4A20 +0FC0 +2A20 +2FE0 +C940 +4FE0 +5AA0 +6FE0 +ENDCHAR +STARTCHAR U_7019 +ENCODING 28697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +3F20 +8BE0 +4520 +1F20 +25E0 +3F20 +C5E0 +4EC0 +5540 +6E60 +ENDCHAR +STARTCHAR U_701A +ENCODING 28698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3F40 +8820 +5FE0 +12A0 +3FE0 +32A0 +DFE0 +48A0 +5EA0 +49E0 +ENDCHAR +STARTCHAR U_701B +ENCODING 28699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +8800 +4FE0 +0100 +3FE0 +36A0 +DDE0 +55A0 +56A0 +6D20 +ENDCHAR +STARTCHAR U_701C +ENCODING 28700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BE80 +5480 +1E80 +83E0 +7EA0 +36A0 +2BE0 +7E80 +AA80 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_701D +ENCODING 28701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2B60 +8A40 +4FE0 +0A40 +2FE0 +2A40 +D100 +55E0 +6500 +4FE0 +ENDCHAR +STARTCHAR U_701E +ENCODING 28702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +7FC0 +0A80 +9DE0 +48A0 +7FE0 +54A0 +DDE0 +5480 +5C80 +5580 +ENDCHAR +STARTCHAR U_701F +ENCODING 28703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +3FE0 +8A80 +5FC0 +0240 +3FE0 +32A0 +DEE0 +5220 +5EE0 +62A0 +ENDCHAR +STARTCHAR U_7020 +ENCODING 28704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3760 +9540 +4AA0 +1FE0 +3220 +2F00 +C440 +5FA0 +4A80 +7660 +ENDCHAR +STARTCHAR U_7021 +ENCODING 28705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +35E0 +9640 +5BE0 +14A0 +36E0 +3AA0 +D2E0 +52A0 +52A0 +55E0 +ENDCHAR +STARTCHAR U_7022 +ENCODING 28706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +2BE0 +8AA0 +47E0 +1A20 +2BE0 +2A20 +CBE0 +4940 +4A20 +57E0 +ENDCHAR +STARTCHAR U_7023 +ENCODING 28707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +28A0 +8FA0 +5240 +0CA0 +2A80 +3EE0 +C280 +4EE0 +4280 +5FE0 +ENDCHAR +STARTCHAR U_7024 +ENCODING 28708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +8AA0 +4FE0 +0520 +2380 +2D60 +C540 +4C80 +5640 +4C20 +ENDCHAR +STARTCHAR U_7025 +ENCODING 28709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0660 +8AA0 +7FE0 +2280 +4280 +CFE0 +4AA0 +4BA0 +4860 +ENDCHAR +STARTCHAR U_7026 +ENCODING 28710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +3FE0 +88A0 +53E0 +2C80 +19E0 +6B20 +D9E0 +6D20 +49E0 +5920 +ENDCHAR +STARTCHAR U_7027 +ENCODING 28711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3F80 +8AE0 +5F20 +0AE0 +2E80 +2AE0 +CE80 +4AE0 +4AA0 +4EE0 +ENDCHAR +STARTCHAR U_7028 +ENCODING 28712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3EA0 +85E0 +5F20 +15E0 +1520 +3FE0 +C520 +4FE0 +54C0 +6520 +ENDCHAR +STARTCHAR U_7029 +ENCODING 28713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2440 +9FE0 +44A0 +0EE0 +35A0 +2EE0 +CAA0 +4BE0 +52C0 +6120 +ENDCHAR +STARTCHAR U_702A +ENCODING 28714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +ABE0 +FF40 +A880 +FD60 +1200 +3F80 +20A0 +7FC0 +1500 +ECE0 +ENDCHAR +STARTCHAR U_702B +ENCODING 28715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +3FA0 +84A0 +5FA0 +1400 +2AE0 +3EA0 +CAA0 +5F40 +56A0 +6520 +ENDCHAR +STARTCHAR U_702C +ENCODING 28716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +89E0 +5E80 +09E0 +BF20 +6BE0 +3F20 +5DE0 +DB20 +69E0 +4920 +4A20 +ENDCHAR +STARTCHAR U_702D +ENCODING 28717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5D40 +0BE0 +BE00 +6BA0 +3EA0 +2BA0 +FEA0 +4BA0 +7EA0 +4AE0 +ENDCHAR +STARTCHAR U_702E +ENCODING 28718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4200 +1FE0 +BAA0 +6700 +2AE0 +4880 +FDE0 +5DC0 +6AA0 +4880 +ENDCHAR +STARTCHAR U_702F +ENCODING 28719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3660 +9440 +4AA0 +1FE0 +34A0 +2780 +C000 +4FC0 +4840 +4FC0 +ENDCHAR +STARTCHAR U_7030 +ENCODING 28720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +5540 +1920 +BFE0 +6920 +2D60 +3BA0 +4960 +CDA0 +4B60 +5920 +ENDCHAR +STARTCHAR U_7031 +ENCODING 28721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +8FE0 +4A00 +2F20 +2AA0 +2DA0 +CAA0 +57A0 +5220 +6D60 +ENDCHAR +STARTCHAR U_7032 +ENCODING 28722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +3280 +A1E0 +5EA0 +00A0 +7EA0 +6AA0 +BEA0 +9340 +ACA0 +8520 +ENDCHAR +STARTCHAR U_7033 +ENCODING 28723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +8540 +4FE0 +2AA0 +2FE0 +2A00 +CBE0 +4A00 +57E0 +6AA0 +ENDCHAR +STARTCHAR U_7034 +ENCODING 28724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +3520 +9DE0 +5520 +3DE0 +2840 +36A0 +DFE0 +4480 +4380 +5E60 +ENDCHAR +STARTCHAR U_7035 +ENCODING 28725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +2FE0 +9540 +5920 +2FC0 +2A40 +5FE0 +4480 +DFE0 +4480 +5860 +ENDCHAR +STARTCHAR U_7036 +ENCODING 28726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +7DE0 +2A00 +A9C0 +7D40 +25C0 +7C00 +6BE0 +AAA0 +BEA0 +83E0 +ENDCHAR +STARTCHAR U_7037 +ENCODING 28727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +8660 +4AA0 +2FE0 +2920 +2FE0 +C240 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_7038 +ENCODING 28728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +35A0 +9FE0 +4A80 +3BA0 +2AA0 +3BA0 +CA40 +7B60 +4A60 +5FA0 +ENDCHAR +STARTCHAR U_7039 +ENCODING 28729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +27C0 +8820 +5FE0 +2AA0 +2FE0 +2000 +CFE0 +4AA0 +4FE0 +4AA0 +ENDCHAR +STARTCHAR U_703A +ENCODING 28730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2900 +9FC0 +4840 +2FC0 +2880 +5FE0 +C940 +4FC0 +4520 +59E0 +ENDCHAR +STARTCHAR U_703B +ENCODING 28731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F60 +2440 +9FE0 +5540 +1F40 +3540 +5F40 +CA60 +5F40 +4AA0 +5120 +ENDCHAR +STARTCHAR U_703C +ENCODING 28732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +8AA0 +4EE0 +2280 +2FE0 +2280 +DFE0 +44A0 +5D40 +4620 +ENDCHAR +STARTCHAR U_703D +ENCODING 28733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +2520 +9FC0 +4500 +3FE0 +4880 +DFC0 +6220 +4B80 +77E0 +ENDCHAR +STARTCHAR U_703E +ENCODING 28734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +8EE0 +4AA0 +2EE0 +2920 +4FE0 +CAA0 +4FE0 +4BA0 +4D60 +ENDCHAR +STARTCHAR U_703F +ENCODING 28735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +35E0 +9FA0 +5540 +3FA0 +2100 +4F80 +C440 +5FC0 +4540 +5B20 +ENDCHAR +STARTCHAR U_7040 +ENCODING 28736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +8FE0 +4920 +22E0 +24A0 +5FE0 +C4A0 +4EE0 +55A0 +44E0 +ENDCHAR +STARTCHAR U_7041 +ENCODING 28737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +32A0 +9EE0 +52A0 +3FE0 +34A0 +57A0 +D4E0 +5FA0 +55A0 +5B60 +ENDCHAR +STARTCHAR U_7042 +ENCODING 28738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FA0 +2A40 +9FE0 +54A0 +3FE0 +3240 +5FE0 +D240 +5EC0 +5440 +5AC0 +ENDCHAR +STARTCHAR U_7043 +ENCODING 28739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +8AA0 +4FE0 +2AA0 +3FE0 +4840 +CFC0 +4880 +4500 +5FE0 +ENDCHAR +STARTCHAR U_7044 +ENCODING 28740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2440 +87C0 +4440 +3FE0 +2040 +4FE0 +CAA0 +4EE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_7045 +ENCODING 28741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2A40 +8FC0 +4A40 +3FE0 +2AA0 +3FE0 +EAA0 +7FE0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_7046 +ENCODING 28742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +8480 +5E80 +34E0 +3F40 +5220 +D400 +5FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_7047 +ENCODING 28743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +94A0 +4CC0 +1FE0 +8480 +7FE0 +2A00 +4EE0 +CAA0 +4E40 +4BA0 +5E20 +ENDCHAR +STARTCHAR U_7048 +ENCODING 28744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +8EE0 +4AA0 +2EE0 +2AA0 +4FE0 +D900 +4FC0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_7049 +ENCODING 28745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +6B40 +95E0 +4B40 +1FE0 +5140 +7F40 +A9E0 +BF40 +A340 +BFE0 +ENDCHAR +STARTCHAR U_704A +ENCODING 28746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3540 +9FE0 +5640 +24A0 +3FE0 +4440 +CFE0 +4AA0 +4FE0 +4920 +ENDCHAR +STARTCHAR U_704B +ENCODING 28747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1540 +9FC0 +5400 +57E0 +5AA0 +D200 +6FE0 +6480 +4FC0 +ENDCHAR +STARTCHAR U_704C +ENCODING 28748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +8EE0 +4AA0 +2EE0 +2500 +4FE0 +D900 +4FE0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_704D +ENCODING 28749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BDE0 +6520 +3DE0 +A520 +7FE0 +2960 +6AA0 +7EA0 +A960 +B220 +A060 +ENDCHAR +STARTCHAR U_704E +ENCODING 28750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +7FE0 +2A80 +BFE0 +6A80 +3F40 +57E0 +5EA0 +D6A0 +4AA0 +7FE0 +ENDCHAR +STARTCHAR U_704F +ENCODING 28751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3480 +9FE0 +5220 +5EA0 +6AA0 +5EA0 +92A0 +9EA0 +AD40 +CA20 +ENDCHAR +STARTCHAR U_7050 +ENCODING 28752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +94A0 +4FC0 +0CC0 +9320 +7FE0 +2520 +4F80 +F260 +4FC0 +4A80 +5FE0 +ENDCHAR +STARTCHAR U_7051 +ENCODING 28753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2000 +8FE0 +4AA0 +2FE0 +2AA0 +4FE0 +CC80 +56C0 +54A0 +66E0 +ENDCHAR +STARTCHAR U_7052 +ENCODING 28754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2FE0 +8240 +5FE0 +2960 +37C0 +4440 +C7C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_7053 +ENCODING 28755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +4440 +AEA0 +FBE0 +AEA0 +0400 +7680 +2500 +D4E0 +0800 +ENDCHAR +STARTCHAR U_7054 +ENCODING 28756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +7FE0 +2A40 +BFE0 +6AA0 +3FA0 +1EE0 +5280 +DE80 +4AA0 +5F60 +ENDCHAR +STARTCHAR U_7055 +ENCODING 28757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3E40 +95E0 +5B40 +3540 +3FE0 +5540 +D540 +5BE0 +5740 +51E0 +ENDCHAR +STARTCHAR U_7056 +ENCODING 28758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +9480 +5FE0 +35A0 +5EE0 +5280 +DEE0 +5280 +6EE0 +4280 +ENDCHAR +STARTCHAR U_7057 +ENCODING 28759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +4BE0 +3E20 +ABA0 +6AA0 +2BE0 +7FC0 +8940 +8DC0 +BB40 +83E0 +ENDCHAR +STARTCHAR U_7058 +ENCODING 28760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4B40 +3FE0 +8940 +4F40 +05E0 +3F40 +5540 +FFE0 +4940 +5540 +63E0 +ENDCHAR +STARTCHAR U_7059 +ENCODING 28761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5FE0 +54A0 +8FC0 +4A40 +2FC0 +2200 +CFC0 +4200 +5FE0 +52A0 +ENDCHAR +STARTCHAR U_705A +ENCODING 28762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2920 +8AA0 +4D60 +0AA0 +1FE0 +34A0 +C780 +4480 +47A0 +5CE0 +ENDCHAR +STARTCHAR U_705B +ENCODING 28763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2520 +3DE0 +A720 +7AE0 +2FA0 +6AA0 +AFA0 +A220 +AFA0 +A260 +ENDCHAR +STARTCHAR U_705C +ENCODING 28764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +3FE0 +0800 +8FC0 +4880 +3FC0 +5540 +DF40 +5540 +5F60 +6520 +ENDCHAR +STARTCHAR U_705D +ENCODING 28765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3280 +9FE0 +5120 +1FE0 +2520 +5FE0 +D120 +5FE0 +5C40 +6AA0 +ENDCHAR +STARTCHAR U_705E +ENCODING 28766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2100 +9FE0 +52A0 +1FE0 +2AA0 +5FE0 +D4A0 +7FE0 +44A0 +4560 +ENDCHAR +STARTCHAR U_705F +ENCODING 28767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +3020 +9FE0 +5540 +1FE0 +1AA0 +37E0 +DA20 +5FA0 +62A0 +4FE0 +ENDCHAR +STARTCHAR U_7060 +ENCODING 28768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +35E0 +9E80 +55E0 +3520 +2FE0 +2880 +CF80 +4880 +4FA0 +58E0 +ENDCHAR +STARTCHAR U_7061 +ENCODING 28769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2480 +8EE0 +4AA0 +1FE0 +2920 +4FE0 +CAA0 +4FE0 +4BA0 +4D60 +ENDCHAR +STARTCHAR U_7062 +ENCODING 28770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2940 +9FE0 +5540 +3DC0 +2480 +3FC0 +C480 +5FE0 +4CA0 +5660 +ENDCHAR +STARTCHAR U_7063 +ENCODING 28771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +3FE0 +8840 +5FA0 +2AC0 +36A0 +2FE0 +C800 +4FE0 +4020 +41C0 +ENDCHAR +STARTCHAR U_7064 +ENCODING 28772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2BC0 +9C60 +4BC0 +3EE0 +4BA0 +56C0 +C100 +5FE0 +4540 +5920 +ENDCHAR +STARTCHAR U_7065 +ENCODING 28773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +1500 +FFE0 +8A20 +FBE0 +2080 +AAA0 +71C0 +AEA0 +ENDCHAR +STARTCHAR U_7066 +ENCODING 28774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +3240 +9EE0 +52A0 +3EE0 +4AA0 +5FE0 +D4A0 +5FE0 +4AC0 +5520 +ENDCHAR +STARTCHAR U_7067 +ENCODING 28775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA80 +7EE0 +2B40 +BEE0 +6AA0 +3FA0 +52E0 +DE80 +5280 +4CA0 +7F60 +ENDCHAR +STARTCHAR U_7068 +ENCODING 28776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +3FE0 +8B40 +5EA0 +31E0 +3F20 +51E0 +DF20 +49E0 +7F40 +4A20 +ENDCHAR +STARTCHAR U_7069 +ENCODING 28777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +3F40 +95E0 +5F40 +15E0 +3FA0 +52E0 +DE00 +57E0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_706A +ENCODING 28778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +3FE0 +1240 +AFA0 +7FE0 +2420 +5BC0 +5520 +DFC0 +5420 +5FC0 +ENDCHAR +STARTCHAR U_706B +ENCODING 28779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +2440 +2480 +2500 +4400 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_706C +ENCODING 28780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 3 0 0 +BITMAP +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_706D +ENCODING 28781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +2440 +2440 +2480 +4A00 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_706E +ENCODING 28782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2440 +4580 +0A00 +3180 +C060 +1200 +1200 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_706F +ENCODING 28783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +17E0 +5480 +5880 +5080 +9080 +1080 +1080 +2880 +4480 +8180 +ENDCHAR +STARTCHAR U_7070 +ENCODING 28784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +0A00 +1200 +1240 +2A80 +4B00 +9200 +0500 +1880 +6060 +ENDCHAR +STARTCHAR U_7071 +ENCODING 28785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +A920 +B120 +A120 +2120 +2120 +3220 +2A20 +4520 +88C0 +ENDCHAR +STARTCHAR U_7072 +ENCODING 28786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +2040 +6A40 +6A40 +B240 +2240 +3240 +2A40 +4A40 +4140 +8080 +ENDCHAR +STARTCHAR U_7073 +ENCODING 28787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +3FC0 +4040 +8840 +2940 +2A40 +4840 +1440 +2240 +4040 +0180 +ENDCHAR +STARTCHAR U_7074 +ENCODING 28788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2900 +B100 +A100 +A100 +2100 +3100 +4900 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7075 +ENCODING 28789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +3F80 +0400 +1440 +2480 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7076 +ENCODING 28790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +A900 +B7C0 +A100 +2100 +2100 +5100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_7077 +ENCODING 28791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4B00 +1100 +60E0 +0900 +FFE0 +0900 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7078 +ENCODING 28792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +4500 +18E0 +E440 +1480 +6500 +0A00 +3100 +C0E0 +ENDCHAR +STARTCHAR U_7079 +ENCODING 28793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2A00 +6A00 +73E0 +AE00 +2200 +5200 +4A00 +4A20 +81E0 +ENDCHAR +STARTCHAR U_707A +ENCODING 28794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +22A0 +2AE0 +B3A0 +AEA0 +A2A0 +22E0 +3280 +2A20 +4220 +81E0 +ENDCHAR +STARTCHAR U_707B +ENCODING 28795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +0000 +0400 +2480 +4680 +0900 +30E0 +C040 +ENDCHAR +STARTCHAR U_707C +ENCODING 28796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2BE0 +B420 +AA20 +A120 +2120 +3020 +2820 +4120 +80C0 +ENDCHAR +STARTCHAR U_707D +ENCODING 28797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4900 +4900 +2480 +0400 +2480 +2500 +4A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_707E +ENCODING 28798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +0400 +2480 +2480 +4500 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_707F +ENCODING 28799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +2AA0 +B2A0 +A2A0 +A2A0 +22A0 +32A0 +4AA0 +4BE0 +8220 +ENDCHAR +STARTCHAR U_7080 +ENCODING 28800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2100 +2A00 +B400 +A7E0 +A2A0 +24A0 +3120 +4A20 +4D20 +80C0 +ENDCHAR +STARTCHAR U_7081 +ENCODING 28801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +4400 +7FC0 +0A00 +1220 +E1E0 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_7082 +ENCODING 28802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +2A40 +B440 +A520 +A900 +2100 +3200 +4A40 +47A0 +8220 +ENDCHAR +STARTCHAR U_7083 +ENCODING 28803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +2040 +5FA0 +0880 +1380 +6400 +2480 +2500 +4A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7084 +ENCODING 28804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +2A40 +B240 +A240 +A7C0 +2240 +3240 +4A40 +4240 +8FE0 +ENDCHAR +STARTCHAR U_7085 +ENCODING 28805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4080 +7F80 +4080 +7F80 +0880 +4900 +4A00 +9400 +2300 +C0C0 +ENDCHAR +STARTCHAR U_7086 +ENCODING 28806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B440 +A440 +A280 +2280 +3100 +4900 +4280 +8C60 +ENDCHAR +STARTCHAR U_7087 +ENCODING 28807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1100 +1500 +5BE0 +5240 +9640 +1280 +2900 +2980 +4240 +8420 +ENDCHAR +STARTCHAR U_7088 +ENCODING 28808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +2480 +6C80 +74E0 +A800 +2780 +2480 +5300 +4B00 +8480 +1860 +ENDCHAR +STARTCHAR U_7089 +ENCODING 28809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +2FE0 +B420 +A420 +A7E0 +2400 +5400 +5400 +4800 +9000 +ENDCHAR +STARTCHAR U_708A +ENCODING 28810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2BE0 +B220 +A540 +A100 +2100 +5100 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_708B +ENCODING 28811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2900 +7300 +6300 +A540 +2920 +5120 +4900 +8100 +0100 +ENDCHAR +STARTCHAR U_708C +ENCODING 28812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +6A80 +7460 +AA80 +2280 +2280 +5280 +4A80 +8480 +0880 +ENDCHAR +STARTCHAR U_708D +ENCODING 28813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2400 +6FC0 +7440 +A640 +2540 +3480 +4880 +4940 +9620 +ENDCHAR +STARTCHAR U_708E +ENCODING 28814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2500 +4A00 +3180 +C460 +2480 +2500 +4A00 +3180 +C060 +ENDCHAR +STARTCHAR U_708F +ENCODING 28815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +6A40 +7240 +AA80 +2A00 +2200 +5500 +4480 +8860 +1040 +ENDCHAR +STARTCHAR U_7090 +ENCODING 28816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2900 +2FE0 +7100 +67C0 +A100 +3100 +4FE0 +4100 +8100 +0100 +ENDCHAR +STARTCHAR U_7091 +ENCODING 28817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FE0 +B100 +A100 +A380 +2540 +3520 +4920 +4900 +8100 +ENDCHAR +STARTCHAR U_7092 +ENCODING 28818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2940 +B520 +A500 +A920 +2120 +3140 +4880 +4300 +8C00 +ENDCHAR +STARTCHAR U_7093 +ENCODING 28819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +2940 +B040 +A240 +A140 +2060 +37C0 +4840 +4840 +8040 +ENDCHAR +STARTCHAR U_7094 +ENCODING 28820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FC0 +B140 +A140 +AFE0 +2100 +3100 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_7095 +ENCODING 28821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B000 +A380 +A280 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_7096 +ENCODING 28822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2900 +B540 +A540 +A540 +27C0 +3100 +4920 +4920 +80E0 +ENDCHAR +STARTCHAR U_7097 +ENCODING 28823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +FFE0 +0900 +0F00 +0400 +1440 +2580 +0A00 +1100 +60E0 +ENDCHAR +STARTCHAR U_7098 +ENCODING 28824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +2A00 +B200 +A3E0 +A240 +2240 +3240 +4A40 +4C40 +9040 +ENDCHAR +STARTCHAR U_7099 +ENCODING 28825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +3100 +4A00 +2C00 +F480 +1500 +2A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_709A +ENCODING 28826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9520 +9540 +F580 +9900 +9100 +F100 +9280 +0440 +1820 +ENDCHAR +STARTCHAR U_709B +ENCODING 28827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +2480 +4B00 +1180 +2A60 +D200 +3280 +D300 +1E20 +1220 +11E0 +ENDCHAR +STARTCHAR U_709C +ENCODING 28828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2900 +B7E0 +A100 +AFE0 +2120 +3120 +4960 +4900 +8100 +ENDCHAR +STARTCHAR U_709D +ENCODING 28829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C40 +B020 +A3C0 +A240 +2240 +32C0 +4A20 +4A20 +81E0 +ENDCHAR +STARTCHAR U_709E +ENCODING 28830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2200 +2FE0 +6A00 +7200 +A280 +2240 +3240 +4A00 +4200 +8200 +ENDCHAR +STARTCHAR U_709F +ENCODING 28831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2C40 +B440 +A7C0 +A440 +2440 +37C0 +4C40 +4000 +8FE0 +ENDCHAR +STARTCHAR U_70A0 +ENCODING 28832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +2CA0 +77E0 +64A0 +A4A0 +27E0 +5080 +4880 +8080 +0080 +ENDCHAR +STARTCHAR U_70A1 +ENCODING 28833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2880 +B080 +A480 +A4E0 +2480 +3480 +4C80 +4480 +8FE0 +ENDCHAR +STARTCHAR U_70A2 +ENCODING 28834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2900 +B7E0 +A100 +2380 +3540 +4D20 +4920 +9100 +0100 +ENDCHAR +STARTCHAR U_70A3 +ENCODING 28835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2040 +6840 +7740 +A540 +2740 +5040 +5040 +4140 +8080 +ENDCHAR +STARTCHAR U_70A4 +ENCODING 28836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +2920 +B2A0 +A440 +A800 +23E0 +3220 +4A20 +43E0 +8220 +ENDCHAR +STARTCHAR U_70A5 +ENCODING 28837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +32A0 +BFE0 +AA80 +AFE0 +22A0 +52A0 +54E0 +8480 +0880 +ENDCHAR +STARTCHAR U_70A6 +ENCODING 28838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +2FE0 +AA00 +B3C0 +A240 +2240 +3580 +5500 +4AE0 +9440 +ENDCHAR +STARTCHAR U_70A7 +ENCODING 28839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C00 +6900 +75C0 +A740 +2D40 +2540 +5540 +54A0 +83E0 +ENDCHAR +STARTCHAR U_70A8 +ENCODING 28840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +A000 +AA00 +B240 +2380 +5200 +4A20 +8A20 +81E0 +ENDCHAR +STARTCHAR U_70A9 +ENCODING 28841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C40 +B120 +A080 +A7E0 +2040 +3080 +4B00 +4080 +8040 +ENDCHAR +STARTCHAR U_70AA +ENCODING 28842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2080 +24A0 +6CA0 +74A0 +A7E0 +2080 +24A0 +54A0 +4CA0 +87E0 +ENDCHAR +STARTCHAR U_70AB +ENCODING 28843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +2FE0 +B100 +A240 +A780 +2080 +3100 +4A40 +47E0 +8220 +ENDCHAR +STARTCHAR U_70AC +ENCODING 28844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2C00 +B7C0 +A440 +A440 +27C0 +3440 +4C00 +4400 +87E0 +ENDCHAR +STARTCHAR U_70AD +ENCODING 28845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +1000 +7FE0 +1200 +1A40 +2A80 +4500 +8880 +3060 +ENDCHAR +STARTCHAR U_70AE +ENCODING 28846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2C20 +B7A0 +ACA0 +A4A0 +27A0 +3420 +4CC0 +4420 +83E0 +ENDCHAR +STARTCHAR U_70AF +ENCODING 28847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2820 +BBA0 +AAA0 +AAA0 +2AA0 +2BA0 +5820 +4820 +88E0 +ENDCHAR +STARTCHAR U_70B0 +ENCODING 28848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4040 +BE40 +2240 +3E80 +2020 +2020 +1FE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_70B1 +ENCODING 28849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +2440 +4A80 +1180 +E060 +ENDCHAR +STARTCHAR U_70B2 +ENCODING 28850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AA80 +B440 +AFE0 +2020 +27C0 +5440 +4C40 +87C0 +8440 +ENDCHAR +STARTCHAR U_70B3 +ENCODING 28851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +B520 +A520 +A520 +25A0 +3660 +4C20 +4420 +84E0 +ENDCHAR +STARTCHAR U_70B4 +ENCODING 28852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2FC0 +B540 +A540 +A540 +2FE0 +3100 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_70B5 +ENCODING 28853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2E40 +B180 +A280 +AC60 +2100 +30C0 +4800 +4580 +8060 +ENDCHAR +STARTCHAR U_70B6 +ENCODING 28854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2900 +69E0 +7100 +A100 +27C0 +3440 +4C40 +4C40 +87C0 +ENDCHAR +STARTCHAR U_70B7 +ENCODING 28855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B100 +A100 +A100 +27C0 +2100 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_70B8 +ENCODING 28856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2BE0 +B500 +A900 +A1E0 +2100 +31E0 +4900 +4100 +8100 +ENDCHAR +STARTCHAR U_70B9 +ENCODING 28857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +07C0 +0400 +3F80 +2080 +2080 +3F80 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_70BA +ENCODING 28858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +1400 +7F80 +0480 +0FC0 +1040 +3FE0 +4020 +AAA0 +2AA0 +0040 +ENDCHAR +STARTCHAR U_70BB +ENCODING 28859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +A900 +B100 +A200 +27E0 +2A20 +3220 +4A20 +43E0 +8220 +ENDCHAR +STARTCHAR U_70BC +ENCODING 28860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2900 +B780 +A280 +A7E0 +2080 +32C0 +4CA0 +44A0 +8180 +ENDCHAR +STARTCHAR U_70BD +ENCODING 28861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2C40 +B440 +A440 +A7C0 +2000 +3280 +4A40 +4420 +8820 +ENDCHAR +STARTCHAR U_70BE +ENCODING 28862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2C40 +B440 +A7C0 +A280 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70BF +ENCODING 28863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +B640 +A540 +2FE0 +2440 +3440 +4C40 +4840 +90C0 +ENDCHAR +STARTCHAR U_70C0 +ENCODING 28864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +28A0 +B4A0 +A2C0 +AFE0 +2080 +2080 +5080 +4A80 +8100 +ENDCHAR +STARTCHAR U_70C1 +ENCODING 28865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2E00 +2900 +B900 +AFE0 +A100 +2100 +3540 +4920 +5120 +8300 +ENDCHAR +STARTCHAR U_70C2 +ENCODING 28866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2240 +2A80 +B7E0 +A000 +A000 +23C0 +3000 +4800 +4800 +87E0 +ENDCHAR +STARTCHAR U_70C3 +ENCODING 28867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +2900 +B280 +AC60 +A000 +27C0 +3100 +4900 +4100 +8FE0 +ENDCHAR +STARTCHAR U_70C4 +ENCODING 28868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +B280 +A440 +A8A0 +2480 +3300 +4B00 +4480 +8860 +ENDCHAR +STARTCHAR U_70C5 +ENCODING 28869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2200 +2FE0 +BAA0 +AAA0 +AAA0 +2AA0 +2AA0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_70C6 +ENCODING 28870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2400 +2800 +B3E0 +A440 +AC40 +2440 +3440 +4C40 +4440 +84C0 +ENDCHAR +STARTCHAR U_70C7 +ENCODING 28871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +B820 +A7C0 +A100 +27C0 +3100 +4900 +4100 +8FE0 +ENDCHAR +STARTCHAR U_70C8 +ENCODING 28872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2120 +3D20 +4920 +A920 +1120 +20E0 +C040 +1240 +4920 +8920 +ENDCHAR +STARTCHAR U_70C9 +ENCODING 28873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3F00 +4200 +FFC0 +4A40 +5140 +0400 +4440 +2A80 +3180 +C060 +ENDCHAR +STARTCHAR U_70CA +ENCODING 28874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +B100 +A100 +A7C0 +2100 +3100 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_70CB +ENCODING 28875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +3FE0 +6100 +A380 +2540 +2920 +2100 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_70CC +ENCODING 28876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +2880 +BBE0 +A880 +A9C0 +29C0 +5AA0 +4CA0 +8880 +0880 +ENDCHAR +STARTCHAR U_70CD +ENCODING 28877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +A7C0 +B900 +A100 +2FE0 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70CE +ENCODING 28878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +1100 +FFE0 +1100 +2100 +4500 +2440 +4480 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_70CF +ENCODING 28879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2000 +3FE0 +2000 +3FE0 +5520 +4AA0 +8040 +ENDCHAR +STARTCHAR U_70D0 +ENCODING 28880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +B640 +A540 +2FE0 +2440 +3640 +4D40 +4840 +90C0 +ENDCHAR +STARTCHAR U_70D1 +ENCODING 28881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2AA0 +B6C0 +A280 +A6C0 +2AA0 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70D2 +ENCODING 28882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +B080 +A080 +A780 +2280 +3280 +4BA0 +4C60 +8020 +ENDCHAR +STARTCHAR U_70D3 +ENCODING 28883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +B100 +AFE0 +2000 +2100 +27C0 +5100 +4900 +87E0 +ENDCHAR +STARTCHAR U_70D4 +ENCODING 28884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2BA0 +B820 +ABA0 +AAA0 +2AA0 +2BA0 +5820 +4820 +8860 +ENDCHAR +STARTCHAR U_70D5 +ENCODING 28885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +0240 +7FE0 +4200 +7E40 +4A40 +6E80 +5900 +4D00 +52A0 +A460 +ENDCHAR +STARTCHAR U_70D6 +ENCODING 28886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +7A40 +1200 +FFE0 +1200 +5640 +5940 +9180 +29A0 +4660 +8C20 +ENDCHAR +STARTCHAR U_70D7 +ENCODING 28887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2900 +B200 +A440 +A780 +2120 +3240 +4C80 +4160 +8620 +ENDCHAR +STARTCHAR U_70D8 +ENCODING 28888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2A80 +B7C0 +A280 +A280 +2FE0 +3000 +4A80 +4440 +8820 +ENDCHAR +STARTCHAR U_70D9 +ENCODING 28889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2A40 +B580 +A240 +AC20 +27C0 +3440 +4C40 +47C0 +8440 +ENDCHAR +STARTCHAR U_70DA +ENCODING 28890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2A80 +B440 +AFE0 +A000 +27C0 +3440 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_70DB +ENCODING 28891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +AFE0 +B520 +A520 +2520 +27E0 +2100 +5120 +4FE0 +8020 +ENDCHAR +STARTCHAR U_70DC +ENCODING 28892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +2FC0 +B440 +A440 +A7C0 +2440 +3440 +4FC0 +4000 +8FE0 +ENDCHAR +STARTCHAR U_70DD +ENCODING 28893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0200 +F4C0 +1700 +2500 +5480 +8860 +7FC0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_70DE +ENCODING 28894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2F80 +B280 +A6C0 +ABA0 +32A0 +2280 +5280 +4A80 +8280 +ENDCHAR +STARTCHAR U_70DF +ENCODING 28895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +2D20 +B7E0 +A520 +A520 +25A0 +3660 +4C20 +47E0 +8420 +ENDCHAR +STARTCHAR U_70E0 +ENCODING 28896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2A00 +B3C0 +A640 +ABC0 +2240 +23C0 +5240 +4A40 +82C0 +ENDCHAR +STARTCHAR U_70E1 +ENCODING 28897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +4B00 +1100 +E0E0 +0900 +7FE0 +0900 +FFE0 +1080 +E060 +ENDCHAR +STARTCHAR U_70E2 +ENCODING 28898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +A8C0 +B700 +A100 +21E0 +2F00 +5100 +4920 +80E0 +ENDCHAR +STARTCHAR U_70E3 +ENCODING 28899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +2FE0 +AA80 +B280 +A2A0 +25C0 +3480 +4940 +5240 +A420 +ENDCHAR +STARTCHAR U_70E4 +ENCODING 28900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27C0 +2A80 +B7E0 +A200 +A7E0 +2A00 +33C0 +4840 +4840 +8180 +ENDCHAR +STARTCHAR U_70E5 +ENCODING 28901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +2C80 +B7E0 +A420 +A420 +27E0 +3480 +4C80 +4480 +87E0 +ENDCHAR +STARTCHAR U_70E6 +ENCODING 28902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2A00 +B7C0 +A440 +A540 +2540 +2540 +5280 +5440 +8820 +ENDCHAR +STARTCHAR U_70E7 +ENCODING 28903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +22E0 +2F40 +B2A0 +A1A0 +AE60 +2000 +37E0 +4A80 +44A0 +8860 +ENDCHAR +STARTCHAR U_70E8 +ENCODING 28904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22A0 +2CC0 +B580 +A4A0 +A4E0 +2100 +37E0 +4900 +4100 +8100 +ENDCHAR +STARTCHAR U_70E9 +ENCODING 28905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2A80 +B440 +ABA0 +A000 +2FE0 +3100 +4A00 +4440 +8FE0 +ENDCHAR +STARTCHAR U_70EA +ENCODING 28906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2840 +2480 +2FC0 +AA00 +B200 +AFE0 +2200 +2500 +5480 +4840 +9020 +ENDCHAR +STARTCHAR U_70EB +ENCODING 28907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +2100 +9FE0 +24A0 +C920 +52C0 +0400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_70EC +ENCODING 28908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2440 +AFC0 +B480 +A440 +2920 +2880 +5200 +4980 +8080 +ENDCHAR +STARTCHAR U_70ED +ENCODING 28909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F780 +2280 +3280 +6680 +A380 +24A0 +6860 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_70EE +ENCODING 28910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +1140 +3D40 +4940 +3040 +C4C0 +0400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_70EF +ENCODING 28911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44C0 +4300 +5CC0 +E200 +DFE0 +C500 +4FE0 +5520 +6520 +9560 +8100 +ENDCHAR +STARTCHAR U_70F0 +ENCODING 28912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2D40 +B280 +A7C0 +A080 +2100 +2FE0 +5100 +4900 +8300 +ENDCHAR +STARTCHAR U_70F1 +ENCODING 28913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2820 +BAA0 +AC60 +ABA0 +2AA0 +2BA0 +5820 +4820 +8860 +ENDCHAR +STARTCHAR U_70F2 +ENCODING 28914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA00 +23E0 +F280 +2480 +6880 +0400 +2480 +4B00 +3180 +C060 +ENDCHAR +STARTCHAR U_70F3 +ENCODING 28915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +27E0 +A900 +B7E0 +A520 +27E0 +2520 +57E0 +4D20 +8560 +ENDCHAR +STARTCHAR U_70F4 +ENCODING 28916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +2AA0 +B540 +A2A0 +A000 +27E0 +3080 +4880 +4080 +8FE0 +ENDCHAR +STARTCHAR U_70F5 +ENCODING 28917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +AC00 +B7E0 +A820 +2320 +20A0 +5020 +4940 +8080 +ENDCHAR +STARTCHAR U_70F6 +ENCODING 28918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +22C0 +B440 +AE40 +A2E0 +2240 +2240 +2DE0 +5400 +4A00 +91E0 +ENDCHAR +STARTCHAR U_70F7 +ENCODING 28919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2C20 +B3C0 +A000 +AFE0 +2280 +3280 +4AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_70F8 +ENCODING 28920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2800 +B7C0 +A540 +AFE0 +2540 +3540 +4FC0 +4040 +8180 +ENDCHAR +STARTCHAR U_70F9 +ENCODING 28921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +7FC0 +0300 +0400 +1C00 +5240 +8920 +ENDCHAR +STARTCHAR U_70FA +ENCODING 28922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2C40 +B7C0 +A440 +A7C0 +2520 +3540 +4C80 +4640 +8420 +ENDCHAR +STARTCHAR U_70FB +ENCODING 28923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C60 +25C0 +B440 +A560 +A940 +A540 +2540 +2DE0 +5400 +4B00 +90E0 +ENDCHAR +STARTCHAR U_70FC +ENCODING 28924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2A00 +B520 +A940 +A280 +25C0 +2AA0 +54A0 +4A80 +8100 +ENDCHAR +STARTCHAR U_70FD +ENCODING 28925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2440 +AB80 +B560 +AB80 +2100 +27C0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_70FE +ENCODING 28926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2440 +4A80 +3580 +C460 +2A80 +1180 +E460 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_70FF +ENCODING 28927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +2540 +2D80 +B720 +A540 +AF80 +2500 +3520 +4D40 +4980 +9300 +ENDCHAR +STARTCHAR U_7100 +ENCODING 28928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2840 +2220 +B300 +A480 +2860 +2FC0 +2840 +5840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_7101 +ENCODING 28929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7BE0 +4D40 +7A80 +0460 +0800 +4440 +2480 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7102 +ENCODING 28930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5440 +DA80 +5100 +56E0 +0400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_7103 +ENCODING 28931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +AFE0 +B280 +AAC0 +2AA0 +32A0 +4A80 +4480 +8980 +ENDCHAR +STARTCHAR U_7104 +ENCODING 28932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0840 +FFE0 +0840 +7FC0 +1000 +3FC0 +D040 +1FC0 +5240 +8920 +ENDCHAR +STARTCHAR U_7105 +ENCODING 28933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +27E0 +B500 +A900 +AFE0 +2000 +27C0 +5440 +4C40 +87C0 +ENDCHAR +STARTCHAR U_7106 +ENCODING 28934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +A800 +B7E0 +A420 +27E0 +3420 +4FE0 +4420 +8460 +ENDCHAR +STARTCHAR U_7107 +ENCODING 28935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +2AC0 +B7E0 +A420 +A7E0 +2420 +37E0 +4C20 +4420 +8460 +ENDCHAR +STARTCHAR U_7108 +ENCODING 28936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BC0 +4A40 +7BC0 +4220 +41E0 +8400 +2440 +4A80 +3180 +C060 +ENDCHAR +STARTCHAR U_7109 +ENCODING 28937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +2780 +2400 +FFE0 +2000 +3FC0 +2000 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_710A +ENCODING 28938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A000 +27C0 +3100 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_710B +ENCODING 28939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +7900 +0FE0 +F900 +4BC0 +4800 +8400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_710C +ENCODING 28940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +2FE0 +B240 +A520 +A9C0 +2240 +3680 +4900 +4280 +9C60 +ENDCHAR +STARTCHAR U_710D +ENCODING 28941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +B120 +AFE0 +A900 +2FE0 +3320 +4D20 +4960 +9100 +ENDCHAR +STARTCHAR U_710E +ENCODING 28942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +7B00 +1600 +1BE0 +3240 +D240 +1440 +3840 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_710F +ENCODING 28943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0300 +75E0 +5420 +5540 +7480 +0540 +0E20 +0000 +4920 +8920 +ENDCHAR +STARTCHAR U_7110 +ENCODING 28944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +2FC0 +B240 +A240 +AFE0 +2000 +37C0 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_7111 +ENCODING 28945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2920 +2920 +7FE0 +ABA0 +2B60 +2D60 +5920 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7112 +ENCODING 28946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +2440 +6C40 +77C0 +A000 +2FE0 +5820 +4820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_7113 +ENCODING 28947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2640 +A920 +B7C0 +A080 +2100 +37C0 +4C40 +4C40 +87C0 +ENDCHAR +STARTCHAR U_7114 +ENCODING 28948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2200 +23C0 +2A40 +B480 +A900 +ABC0 +2A40 +2A40 +5BC0 +4A40 +8BC0 +ENDCHAR +STARTCHAR U_7115 +ENCODING 28949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2780 +2900 +B7C0 +A540 +A540 +2FE0 +3100 +4A80 +4440 +9820 +ENDCHAR +STARTCHAR U_7116 +ENCODING 28950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2420 +B920 +A8A0 +AA20 +2AA0 +2E60 +2A20 +59E0 +4820 +88E0 +ENDCHAR +STARTCHAR U_7117 +ENCODING 28951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +2FE0 +B800 +AFE0 +A820 +2BA0 +2AA0 +5BA0 +48A0 +9040 +ENDCHAR +STARTCHAR U_7118 +ENCODING 28952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1100 +3FC0 +4900 +8900 +0300 +5240 +8920 +ENDCHAR +STARTCHAR U_7119 +ENCODING 28953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2840 +B440 +A280 +AFE0 +2000 +37C0 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_711A +ENCODING 28954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2300 +7580 +A940 +2520 +0480 +2D00 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_711B +ENCODING 28955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +94A0 +A720 +8920 +B0A0 +8060 +ENDCHAR +STARTCHAR U_711C +ENCODING 28956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A000 +24A0 +37C0 +4C80 +46A0 +8460 +ENDCHAR +STARTCHAR U_711D +ENCODING 28957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +27E0 +AC80 +B640 +A420 +27C0 +3440 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_711E +ENCODING 28958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A800 +B7C0 +A440 +27C0 +2080 +37E0 +4900 +4100 +8300 +ENDCHAR +STARTCHAR U_711F +ENCODING 28959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2A80 +B280 +AFE0 +A000 +27C0 +3440 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_7120 +ENCODING 28960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2C40 +B440 +AAA0 +A100 +2FE0 +2100 +5100 +4900 +8100 +ENDCHAR +STARTCHAR U_7121 +ENCODING 28961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +AA80 +2A80 +FFE0 +2A80 +2A80 +FFE0 +1240 +4920 +8920 +ENDCHAR +STARTCHAR U_7122 +ENCODING 28962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B240 +A420 +A820 +27C0 +2100 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7123 +ENCODING 28963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BC0 +7A40 +4A40 +7980 +4D80 +FA40 +0C20 +5240 +8920 +8920 +ENDCHAR +STARTCHAR U_7124 +ENCODING 28964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4840 +5FE0 +6A40 +4940 +8480 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7125 +ENCODING 28965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2820 +B400 +A6E0 +AAA0 +2AA0 +26E0 +5280 +44A0 +88E0 +ENDCHAR +STARTCHAR U_7126 +ENCODING 28966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +2200 +7FE0 +A200 +3FC0 +2200 +3FC0 +2200 +3FE0 +5240 +8920 +ENDCHAR +STARTCHAR U_7127 +ENCODING 28967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2440 +BA60 +A480 +AFC0 +2020 +3240 +5520 +4C40 +8BC0 +ENDCHAR +STARTCHAR U_7128 +ENCODING 28968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +2DA0 +B420 +A3C0 +A240 +23C0 +2240 +53C0 +4A40 +82C0 +ENDCHAR +STARTCHAR U_7129 +ENCODING 28969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +BEE0 +AAA0 +AAA0 +2EE0 +5AA0 +4AA0 +9B20 +2660 +ENDCHAR +STARTCHAR U_712A +ENCODING 28970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +B440 +ABE0 +A040 +27C0 +2400 +57E0 +4820 +80C0 +ENDCHAR +STARTCHAR U_712B +ENCODING 28971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +B100 +AFE0 +A920 +2920 +29A0 +5A60 +4C20 +8860 +ENDCHAR +STARTCHAR U_712C +ENCODING 28972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A200 +27E0 +2AA0 +5520 +4AA0 +8440 +ENDCHAR +STARTCHAR U_712D +ENCODING 28973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5540 +2A80 +4440 +7FE0 +4040 +9E80 +1200 +1240 +2240 +41C0 +ENDCHAR +STARTCHAR U_712E +ENCODING 28974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2880 +2FE0 +BB20 +AA40 +AA40 +2A40 +3A40 +4A40 +4AA0 +9120 +ENDCHAR +STARTCHAR U_712F +ENCODING 28975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2900 +B7E0 +A420 +A7E0 +2420 +37E0 +4900 +4FE0 +8100 +ENDCHAR +STARTCHAR U_7130 +ENCODING 28976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +AA40 +B480 +A800 +26E0 +2420 +26E0 +5420 +4C20 +87E0 +ENDCHAR +STARTCHAR U_7131 +ENCODING 28977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4480 +0A00 +3180 +C060 +1500 +5B40 +9580 +1100 +2A80 +C460 +ENDCHAR +STARTCHAR U_7132 +ENCODING 28978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AA80 +B2E0 +A4A0 +ADA0 +3640 +2540 +5480 +4D40 +8620 +ENDCHAR +STARTCHAR U_7133 +ENCODING 28979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2480 +2FE0 +B900 +AFC0 +A900 +2FC0 +5900 +4900 +4FE0 +8800 +ENDCHAR +STARTCHAR U_7134 +ENCODING 28980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFC0 +B000 +A7C0 +2440 +37C0 +4C40 +47C0 +8440 +ENDCHAR +STARTCHAR U_7135 +ENCODING 28981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +4820 +DAA0 +EFE0 +C920 +4D60 +4D60 +6FE0 +9820 +8860 +ENDCHAR +STARTCHAR U_7136 +ENCODING 28982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2280 +3240 +4FE0 +B200 +5500 +2500 +4880 +9060 +5240 +8920 +ENDCHAR +STARTCHAR U_7137 +ENCODING 28983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +A940 +BFC0 +A940 +2FC0 +2200 +3500 +4FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_7138 +ENCODING 28984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +0400 +1440 +6680 +0900 +30E0 +C040 +ENDCHAR +STARTCHAR U_7139 +ENCODING 28985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2AA0 +BFE0 +A920 +AFE0 +2A20 +2BA0 +5820 +4820 +8860 +ENDCHAR +STARTCHAR U_713A +ENCODING 28986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +AFE0 +B420 +A7E0 +A140 +2640 +2240 +5FE0 +5240 +8440 +ENDCHAR +STARTCHAR U_713B +ENCODING 28987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +AC20 +B7E0 +A000 +27E0 +2420 +57E0 +4C20 +87E0 +ENDCHAR +STARTCHAR U_713C +ENCODING 28988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +B440 +AFE0 +A440 +2FE0 +2280 +5280 +44A0 +9860 +ENDCHAR +STARTCHAR U_713D +ENCODING 28989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7CC0 +0000 +2480 +4500 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_713E +ENCODING 28990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2300 +2680 +B940 +B7E0 +A080 +2100 +3480 +4D20 +5440 +83C0 +ENDCHAR +STARTCHAR U_713F +ENCODING 28991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +2900 +AFC0 +B940 +AFE0 +2940 +5FC0 +4900 +9280 +2C60 +ENDCHAR +STARTCHAR U_7140 +ENCODING 28992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +4FE0 +D880 +EAA0 +CAA0 +4BE0 +6880 +5AA0 +92A0 +A3E0 +ENDCHAR +STARTCHAR U_7141 +ENCODING 28993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +AA40 +B3C0 +A240 +A3C0 +2240 +2FE0 +5540 +5620 +87E0 +ENDCHAR +STARTCHAR U_7142 +ENCODING 28994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AA80 +B380 +A100 +A7C0 +2540 +27C0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_7143 +ENCODING 28995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +B540 +ABA0 +2100 +2FE0 +2100 +57C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7144 +ENCODING 28996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +AFE0 +B540 +A7C0 +A540 +27C0 +2100 +57C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7145 +ENCODING 28997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +28A0 +AEA0 +B920 +A800 +2EE0 +28A0 +2EA0 +5840 +48A0 +8920 +ENDCHAR +STARTCHAR U_7146 +ENCODING 28998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2520 +AD20 +B760 +A400 +27E0 +24A0 +27A0 +5440 +4CA0 +8520 +ENDCHAR +STARTCHAR U_7147 +ENCODING 28999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +2FE0 +B540 +A7C0 +2540 +27C0 +2100 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_7148 +ENCODING 29000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2940 +AF40 +BA40 +AFC0 +AAC0 +2FC0 +2A40 +53C0 +AC60 +4020 +ENDCHAR +STARTCHAR U_7149 +ENCODING 29001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +BFE0 +AAA0 +A920 +2FE0 +2380 +5540 +4920 +9120 +ENDCHAR +STARTCHAR U_714A +ENCODING 29002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B000 +AFE0 +A000 +27C0 +2440 +57C0 +5440 +8FE0 +ENDCHAR +STARTCHAR U_714B +ENCODING 29003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +A7C0 +A500 +27C0 +2900 +57C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_714C +ENCODING 29004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +AC40 +B7C0 +A440 +AFE0 +2100 +27C0 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_714D +ENCODING 29005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E40 +2440 +2540 +BF60 +A540 +AC40 +3640 +2540 +5440 +4CA0 +8520 +ENDCHAR +STARTCHAR U_714E +ENCODING 29006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0000 +3D40 +2540 +3D40 +2540 +3D40 +24C0 +5240 +8920 +ENDCHAR +STARTCHAR U_714F +ENCODING 29007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +AFC0 +B440 +A7C0 +2000 +2FE0 +5920 +5FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7150 +ENCODING 29008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +AA40 +B100 +A7C0 +A540 +2540 +2FE0 +5280 +4440 +8820 +ENDCHAR +STARTCHAR U_7151 +ENCODING 29009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0400 +FFE0 +1080 +FF80 +2080 +3FC0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7152 +ENCODING 29010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +AA40 +B7E0 +A440 +A7C0 +2080 +2FE0 +5480 +4FE0 +8080 +ENDCHAR +STARTCHAR U_7153 +ENCODING 29011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +AFE0 +B000 +AFE0 +2100 +2FE0 +2AA0 +5AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_7154 +ENCODING 29012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A480 +A8E0 +3080 +4880 +A7E0 +AA20 +7220 +3220 +4BE0 +8620 +ENDCHAR +STARTCHAR U_7155 +ENCODING 29013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8940 +AD40 +A5C0 +A500 +AD20 +8920 +FCE0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_7156 +ENCODING 29014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +AAC0 +B7E0 +A100 +AFE0 +2200 +23E0 +5540 +4880 +9360 +ENDCHAR +STARTCHAR U_7157 +ENCODING 29015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +2FE0 +AAA0 +BAA0 +AAA0 +2140 +2FE0 +5280 +4440 +9820 +ENDCHAR +STARTCHAR U_7158 +ENCODING 29016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +AFE0 +B880 +AFA0 +A8A0 +2EA0 +2AC0 +5EA0 +4960 +9220 +ENDCHAR +STARTCHAR U_7159 +ENCODING 29017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AAA0 +AFE0 +2100 +27C0 +5100 +4900 +8FE0 +ENDCHAR +STARTCHAR U_715A +ENCODING 29018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F7C0 +9440 +97C0 +F400 +07E0 +2440 +4A80 +1180 +E060 +ENDCHAR +STARTCHAR U_715B +ENCODING 29019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5AC0 +6B40 +5AC0 +6B40 +7BC0 +0400 +64C0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_715C +ENCODING 29020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +A7C0 +A100 +2FE0 +2440 +5280 +4900 +8FE0 +ENDCHAR +STARTCHAR U_715D +ENCODING 29021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +AFE0 +B800 +ABE0 +AA20 +2BE0 +2A20 +5BE0 +4A20 +93E0 +ENDCHAR +STARTCHAR U_715E +ENCODING 29022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D00 +49E0 +7E40 +8540 +7C80 +0540 +7E20 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_715F +ENCODING 29023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +AFE0 +B920 +AFE0 +2440 +27C0 +3440 +4FC0 +4440 +84C0 +ENDCHAR +STARTCHAR U_7160 +ENCODING 29024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +AD40 +B5C0 +A400 +A7E0 +2100 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_7161 +ENCODING 29025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C80 +25E0 +ACA0 +B7E0 +A8A0 +27E0 +2480 +2FE0 +5480 +4A80 +B1E0 +ENDCHAR +STARTCHAR U_7162 +ENCODING 29026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +FFE0 +8020 +3F80 +08A0 +7FA0 +0860 +0820 +ENDCHAR +STARTCHAR U_7163 +ENCODING 29027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2940 +B080 +A7E0 +A2A0 +2D80 +2100 +37E0 +4B80 +4540 +8920 +ENDCHAR +STARTCHAR U_7164 +ENCODING 29028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +B7C0 +A440 +27C0 +2100 +3FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_7165 +ENCODING 29029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +AC80 +B7E0 +A5A0 +A660 +2520 +2FE0 +5180 +5240 +8C20 +ENDCHAR +STARTCHAR U_7166 +ENCODING 29030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +77C0 +5840 +5740 +7540 +5740 +5040 +7140 +0080 +5220 +8920 +ENDCHAR +STARTCHAR U_7167 +ENCODING 29031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4A20 +7C40 +4BE0 +4A20 +7A20 +4BE0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_7168 +ENCODING 29032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A7C0 +A000 +2FE0 +2540 +5480 +4D40 +8620 +ENDCHAR +STARTCHAR U_7169 +ENCODING 29033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +27C0 +AC40 +B7C0 +A440 +27C0 +3440 +4FC0 +4440 +8820 +ENDCHAR +STARTCHAR U_716A +ENCODING 29034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +B280 +AFE0 +AAA0 +2CE0 +2820 +5FE0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_716B +ENCODING 29035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2500 +2FE0 +B200 +A440 +AA80 +2580 +5B40 +4560 +9900 +0200 +ENDCHAR +STARTCHAR U_716C +ENCODING 29036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +AFE0 +A400 +27E0 +2AA0 +5520 +4220 +8CC0 +ENDCHAR +STARTCHAR U_716D +ENCODING 29037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5440 +A940 +5540 +FD40 +2140 +3D40 +C840 +30C0 +C000 +5240 +8920 +ENDCHAR +STARTCHAR U_716E +ENCODING 29038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1080 +3F80 +D080 +1F80 +4240 +4920 +8920 +ENDCHAR +STARTCHAR U_716F +ENCODING 29039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EA0 +A8C0 +BCA0 +A8E0 +2200 +2FC0 +5840 +4FC0 +8840 +0FC0 +ENDCHAR +STARTCHAR U_7170 +ENCODING 29040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AC40 +B7C0 +A000 +AEE0 +2AA0 +2AA0 +5AA0 +4EE0 +8AA0 +ENDCHAR +STARTCHAR U_7171 +ENCODING 29041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2F40 +B540 +AFE0 +A820 +2BA0 +2AA0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_7172 +ENCODING 29042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2840 +4FC0 +C200 +5FE0 +4A80 +5240 +0400 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7173 +ENCODING 29043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +AEA0 +B4E0 +A4A0 +AEA0 +2AE0 +2AA0 +5EA0 +4120 +8260 +ENDCHAR +STARTCHAR U_7174 +ENCODING 29044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2FC0 +B440 +A7C0 +A000 +2FE0 +2AA0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_7175 +ENCODING 29045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2200 +BFE0 +AAA0 +ABA0 +2920 +5BA0 +4920 +8920 +0860 +ENDCHAR +STARTCHAR U_7176 +ENCODING 29046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +AA40 +B3C0 +A000 +2FE0 +2100 +55C0 +4700 +88E0 +ENDCHAR +STARTCHAR U_7177 +ENCODING 29047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2240 +ABC0 +B000 +AFE0 +2820 +2380 +5280 +42A0 +8C60 +ENDCHAR +STARTCHAR U_7178 +ENCODING 29048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +B820 +AFE0 +A800 +AFE0 +2AA0 +2FE0 +5AA0 +4AA0 +9060 +ENDCHAR +STARTCHAR U_7179 +ENCODING 29049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +5480 +FFE0 +C200 +4FC0 +4A40 +4FC0 +6A40 +9FE0 +8840 +ENDCHAR +STARTCHAR U_717A +ENCODING 29050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2520 +A5E0 +B120 +ADE0 +25A0 +2540 +2520 +55A0 +4A00 +91E0 +ENDCHAR +STARTCHAR U_717B +ENCODING 29051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A940 +BFE0 +A940 +2FC0 +2900 +2FC0 +5C40 +5440 +A7C0 +ENDCHAR +STARTCHAR U_717C +ENCODING 29052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +2AA0 +BFA0 +A2A0 +AC40 +2FE0 +5AA0 +4FA0 +82A0 +0C40 +ENDCHAR +STARTCHAR U_717D +ENCODING 29053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A820 +BFE0 +A800 +AFE0 +2920 +2DA0 +5B60 +4DA0 +9360 +ENDCHAR +STARTCHAR U_717E +ENCODING 29054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A6C0 +27C0 +2200 +3540 +4C20 +5440 +83C0 +ENDCHAR +STARTCHAR U_717F +ENCODING 29055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3FE0 +2A40 +AFC0 +BA40 +AFC0 +2A40 +2FE0 +5480 +5280 +8180 +ENDCHAR +STARTCHAR U_7180 +ENCODING 29056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +A7C0 +A920 +2540 +2FE0 +5280 +4CA0 +8860 +ENDCHAR +STARTCHAR U_7181 +ENCODING 29057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +A480 +BFE0 +AAA0 +B7E0 +2440 +27C0 +5440 +4FC0 +84C0 +ENDCHAR +STARTCHAR U_7182 +ENCODING 29058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +A800 +BFC0 +AAC0 +2740 +2FC0 +2240 +5740 +4AA0 +9220 +ENDCHAR +STARTCHAR U_7183 +ENCODING 29059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FC0 +1280 +FD60 +57C0 +9240 +2480 +2440 +1A80 +3100 +C0E0 +ENDCHAR +STARTCHAR U_7184 +ENCODING 29060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +AC40 +B7C0 +A440 +A7C0 +2440 +37C0 +4D40 +54A0 +83A0 +ENDCHAR +STARTCHAR U_7185 +ENCODING 29061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AEC0 +B440 +A7C0 +A000 +2FE0 +2AA0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_7186 +ENCODING 29062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +BFE0 +A240 +A7A0 +2000 +2FE0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_7187 +ENCODING 29063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA40 +B3C0 +A000 +A7E0 +2820 +2BA0 +5AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_7188 +ENCODING 29064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +54A0 +5EE0 +5280 +5E80 +54A0 +5E60 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_7189 +ENCODING 29065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +AFE0 +B420 +A7E0 +A420 +27E0 +2420 +57E0 +4A80 +8C60 +ENDCHAR +STARTCHAR U_718A +ENCODING 29066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +FB80 +0220 +7BE0 +4800 +7A40 +4B80 +7A20 +4BE0 +5240 +8920 +ENDCHAR +STARTCHAR U_718B +ENCODING 29067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49C0 +FD20 +48E0 +7900 +49C0 +7920 +4CE0 +2480 +4B00 +3100 +C0E0 +ENDCHAR +STARTCHAR U_718C +ENCODING 29068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +5EE0 +EAA0 +CEE0 +C920 +4AA0 +6C60 +5820 +88A0 +0840 +ENDCHAR +STARTCHAR U_718D +ENCODING 29069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +6FC0 +7440 +A7C0 +2000 +37C0 +4C40 +4440 +87C0 +ENDCHAR +STARTCHAR U_718E +ENCODING 29070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F00 +2A40 +B540 +A400 +A7C0 +2900 +37E0 +4900 +4540 +87C0 +ENDCHAR +STARTCHAR U_718F +ENCODING 29071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +5540 +7FC0 +0400 +7FC0 +0400 +FFE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_7190 +ENCODING 29072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +AC40 +B7C0 +A440 +27C0 +2100 +5FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_7191 +ENCODING 29073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7FE0 +4500 +DFC0 +E540 +DFE0 +4540 +5FC0 +AD80 +9540 +2520 +ENDCHAR +STARTCHAR U_7192 +ENCODING 29074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +FFE0 +8420 +2440 +2480 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7193 +ENCODING 29075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2C40 +B7C0 +A400 +A7E0 +2400 +57E0 +5020 +4AA0 +8040 +ENDCHAR +STARTCHAR U_7194 +ENCODING 29076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2820 +B440 +A920 +A280 +2C60 +27C0 +5440 +4FC0 +8440 +ENDCHAR +STARTCHAR U_7195 +ENCODING 29077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +27E0 +A800 +B7C0 +A440 +27C0 +3440 +4FC0 +4440 +8820 +ENDCHAR +STARTCHAR U_7196 +ENCODING 29078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2620 +2920 +7540 +6200 +A4E0 +2420 +36E0 +4C20 +47E0 +8420 +ENDCHAR +STARTCHAR U_7197 +ENCODING 29079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +AD40 +B7E0 +A440 +A7C0 +2440 +27C0 +5A40 +4A40 +93C0 +ENDCHAR +STARTCHAR U_7198 +ENCODING 29080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2DE0 +A8A0 +BAA0 +ACA0 +A140 +2FE0 +2920 +5FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7199 +ENCODING 29081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4920 +5D20 +55E0 +5D00 +4920 +4920 +7EE0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_719A +ENCODING 29082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A7C0 +A540 +2FE0 +2540 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_719B +ENCODING 29083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A000 +27C0 +3000 +4FE0 +4540 +8B20 +ENDCHAR +STARTCHAR U_719C +ENCODING 29084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +A920 +BBA0 +AD20 +AAA0 +2FE0 +2540 +54A0 +4C60 +93C0 +ENDCHAR +STARTCHAR U_719D +ENCODING 29085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +BFE0 +AAA0 +AFE0 +2A80 +2BA0 +5AC0 +4BA0 +92E0 +ENDCHAR +STARTCHAR U_719E +ENCODING 29086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFA0 +B940 +AFA0 +AAA0 +2F00 +2100 +57C0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_719F +ENCODING 29087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +4BC0 +7940 +0340 +7D40 +1140 +FAA0 +3420 +4940 +8920 +ENDCHAR +STARTCHAR U_71A0 +ENCODING 29088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +ADA0 +B360 +A5A0 +A100 +27E0 +2420 +57E0 +4C20 +87E0 +ENDCHAR +STARTCHAR U_71A1 +ENCODING 29089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFE0 +B540 +AFE0 +A920 +2FE0 +2240 +5480 +4B80 +8E60 +ENDCHAR +STARTCHAR U_71A2 +ENCODING 29090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +5680 +EB80 +C560 +D900 +4BC0 +6900 +9FE0 +8900 +17E0 +ENDCHAR +STARTCHAR U_71A3 +ENCODING 29091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +27E0 +B280 +A7E0 +AC80 +27E0 +3480 +4FE0 +4480 +87E0 +ENDCHAR +STARTCHAR U_71A4 +ENCODING 29092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +ADA0 +B360 +A5A0 +A220 +2100 +2FE0 +5440 +4A80 +8FE0 +ENDCHAR +STARTCHAR U_71A5 +ENCODING 29093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2540 +A880 +B3E0 +B2A0 +ABE0 +2AA0 +2BE0 +5AE0 +4E00 +91E0 +ENDCHAR +STARTCHAR U_71A6 +ENCODING 29094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2A60 +3380 +A500 +BFE0 +A900 +2FC0 +2900 +5FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_71A7 +ENCODING 29095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +46A0 +9900 +25E0 +6500 +ABE0 +3400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_71A8 +ENCODING 29096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +47E0 +7E40 +5140 +9440 +B2C0 +0400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_71A9 +ENCODING 29097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +AC20 +B7E0 +A540 +A7E0 +26A0 +27E0 +5A00 +4A20 +91E0 +ENDCHAR +STARTCHAR U_71AA +ENCODING 29098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2CE0 +A520 +BEA0 +A440 +A680 +2DE0 +3520 +54A0 +4C40 +8580 +ENDCHAR +STARTCHAR U_71AB +ENCODING 29099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2A40 +7A40 +6FE0 +AA40 +2BC0 +2800 +5540 +5AA0 +AAA0 +ENDCHAR +STARTCHAR U_71AC +ENCODING 29100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7D40 +1340 +FC80 +2540 +DA20 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_71AD +ENCODING 29101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7BE0 +1100 +FBE0 +1100 +7FC0 +0040 +7FC0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_71AE +ENCODING 29102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +2360 +ADA0 +B100 +A280 +2D60 +2280 +5140 +4080 +8700 +ENDCHAR +STARTCHAR U_71AF +ENCODING 29103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AA80 +B100 +A7C0 +A540 +27C0 +2100 +5FE0 +4A80 +8C60 +ENDCHAR +STARTCHAR U_71B0 +ENCODING 29104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +ABC0 +BA40 +ABC0 +A800 +2EE0 +2AA0 +5EE0 +4800 +8FE0 +ENDCHAR +STARTCHAR U_71B1 +ENCODING 29105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +23C0 +FD40 +5340 +A940 +FAE0 +2220 +FA40 +4920 +8920 +ENDCHAR +STARTCHAR U_71B2 +ENCODING 29106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +6880 +4BE0 +7A20 +27E0 +AA20 +B3E0 +A220 +33E0 +4940 +8620 +ENDCHAR +STARTCHAR U_71B3 +ENCODING 29107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +AFE0 +AAA0 +2FE0 +2440 +5280 +4900 +8EE0 +ENDCHAR +STARTCHAR U_71B4 +ENCODING 29108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +27E0 +AC40 +B7C0 +A440 +27C0 +24A0 +57C0 +4CA0 +86E0 +ENDCHAR +STARTCHAR U_71B5 +ENCODING 29109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA80 +BFE0 +AAA0 +AC60 +2BA0 +2AA0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_71B6 +ENCODING 29110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFC0 +B440 +AFE0 +2500 +27E0 +25A0 +5540 +4F40 +81A0 +ENDCHAR +STARTCHAR U_71B7 +ENCODING 29111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2920 +BB60 +AFE0 +A000 +27C0 +3440 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_71B8 +ENCODING 29112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AFE0 +B240 +A6C0 +AB60 +27C0 +2440 +57C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_71B9 +ENCODING 29113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +2080 +3F80 +0A00 +FFE0 +2080 +3F80 +5240 +8920 +ENDCHAR +STARTCHAR U_71BA +ENCODING 29114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +A440 +B7C0 +A280 +2FE0 +3000 +4FC0 +4440 +87C0 +ENDCHAR +STARTCHAR U_71BB +ENCODING 29115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2C60 +B7C0 +A440 +A7C0 +2000 +2EE0 +5AA0 +4660 +8AA0 +ENDCHAR +STARTCHAR U_71BC +ENCODING 29116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +AFC0 +B540 +A7C0 +2280 +2FE0 +2280 +5FE0 +4440 +8820 +ENDCHAR +STARTCHAR U_71BD +ENCODING 29117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A140 +BFE0 +A540 +2FE0 +2920 +2FE0 +5920 +4DE0 +95A0 +ENDCHAR +STARTCHAR U_71BE +ENCODING 29118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FC0 +BAA0 +A480 +BFE0 +A080 +2EA0 +2AC0 +5E40 +4AA0 +8F20 +ENDCHAR +STARTCHAR U_71BF +ENCODING 29119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B280 +AFE0 +A100 +A7C0 +2540 +27C0 +5540 +47C0 +8820 +ENDCHAR +STARTCHAR U_71C0 +ENCODING 29120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AFE0 +B540 +A7C0 +A540 +27C0 +2100 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_71C1 +ENCODING 29121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B280 +AFE0 +A540 +AFE0 +2540 +2FE0 +2100 +5FE0 +8100 +ENDCHAR +STARTCHAR U_71C2 +ENCODING 29122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A440 +27C0 +2440 +5FE0 +4900 +8100 +ENDCHAR +STARTCHAR U_71C3 +ENCODING 29123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2EC0 +AAA0 +B7E0 +AA80 +A540 +2A20 +2000 +5540 +4AA0 +8AA0 +ENDCHAR +STARTCHAR U_71C4 +ENCODING 29124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AA0 +4AC0 +9080 +2140 +DAA0 +8AA0 +DEC0 +8880 +F940 +8A20 +ENDCHAR +STARTCHAR U_71C5 +ENCODING 29125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10A0 +7EC0 +1280 +FD40 +2AA0 +4480 +91A0 +7EC0 +1080 +1D40 +E220 +ENDCHAR +STARTCHAR U_71C6 +ENCODING 29126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +AFE0 +B840 +A7A0 +A480 +2FE0 +2AA0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_71C7 +ENCODING 29127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +AA80 +B7E0 +A520 +26A0 +27E0 +2080 +5FE0 +4880 +8580 +ENDCHAR +STARTCHAR U_71C8 +ENCODING 29128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FA0 +2B40 +AC80 +B7C0 +A820 +37C0 +2440 +27C0 +5280 +4900 +8FE0 +ENDCHAR +STARTCHAR U_71C9 +ENCODING 29129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2F80 +AAE0 +BFA0 +A0A0 +2EA0 +22A0 +24A0 +5E40 +44A0 +8D20 +ENDCHAR +STARTCHAR U_71CA +ENCODING 29130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1700 +2400 +1B80 +2080 +BAE0 +A280 +5140 +8420 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_71CB +ENCODING 29131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +2FE0 +B500 +AFC0 +A500 +27C0 +2500 +37E0 +4D40 +8AA0 +ENDCHAR +STARTCHAR U_71CC +ENCODING 29132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2540 +AFE0 +B440 +A7C0 +2440 +37C0 +4C40 +47C0 +8C60 +ENDCHAR +STARTCHAR U_71CD +ENCODING 29133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5400 +7FE0 +5500 +DD00 +F5E0 +DD40 +5540 +5F40 +B540 +9240 +2440 +ENDCHAR +STARTCHAR U_71CE +ENCODING 29134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +B7C0 +AC60 +37C0 +2440 +27C0 +5540 +4920 +9320 +ENDCHAR +STARTCHAR U_71CF +ENCODING 29135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +AFE0 +B520 +A900 +AFE0 +2AA0 +2FE0 +5AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_71D0 +ENCODING 29136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +AFE0 +B940 +A520 +2F40 +2940 +25E0 +5340 +45E0 +8840 +ENDCHAR +STARTCHAR U_71D1 +ENCODING 29137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +2480 +BFE0 +AA40 +AA40 +2FC0 +3200 +4FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_71D2 +ENCODING 29138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +A900 +BFE0 +A440 +2EE0 +2440 +2FE0 +5180 +42A0 +8C60 +ENDCHAR +STARTCHAR U_71D3 +ENCODING 29139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2440 +FBE0 +7A40 +A4E0 +2B40 +0400 +64C0 +0B00 +3100 +C0E0 +ENDCHAR +STARTCHAR U_71D4 +ENCODING 29140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +A540 +BFE0 +A540 +A920 +27C0 +2540 +57C0 +4D40 +87C0 +ENDCHAR +STARTCHAR U_71D5 +ENCODING 29141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +2E80 +20A0 +EEC0 +2AA0 +EEE0 +0000 +5240 +8920 +ENDCHAR +STARTCHAR U_71D6 +ENCODING 29142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +A7C0 +B040 +AFE0 +A4A0 +2EE0 +2040 +5FE0 +4A40 +81C0 +ENDCHAR +STARTCHAR U_71D7 +ENCODING 29143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2EE0 +BAA0 +AFE0 +AAA0 +2BA0 +2AA0 +5BA0 +4CA0 +8860 +ENDCHAR +STARTCHAR U_71D8 +ENCODING 29144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2FE0 +2AA0 +5920 +4AA0 +8C60 +ENDCHAR +STARTCHAR U_71D9 +ENCODING 29145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +AA40 +4940 +2FE0 +D4A0 +4920 +4240 +1440 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_71DA +ENCODING 29146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55A0 +5AC0 +9080 +2D40 +D220 +1080 +55A0 +5AC0 +9080 +2940 +C620 +ENDCHAR +STARTCHAR U_71DB +ENCODING 29147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2A80 +FBE0 +8A20 +FBE0 +2A80 +FBE0 +2440 +2A80 +5100 +E0E0 +ENDCHAR +STARTCHAR U_71DC +ENCODING 29148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2A20 +2EE0 +5BA0 +4820 +8860 +ENDCHAR +STARTCHAR U_71DD +ENCODING 29149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +AC40 +B7C0 +A100 +2FE0 +2440 +57C0 +4540 +8B20 +ENDCHAR +STARTCHAR U_71DE +ENCODING 29150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7DE0 +D2A0 +7C80 +5080 +7D40 +5240 +7C20 +4000 +5240 +8920 +ENDCHAR +STARTCHAR U_71DF +ENCODING 29151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5AC0 +5480 +A940 +4620 +FFE0 +90A0 +1F80 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_71E0 +ENCODING 29152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +AD60 +BBA0 +A920 +AFE0 +2BA0 +2D60 +5FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_71E1 +ENCODING 29153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B100 +AFE0 +2280 +2100 +2FE0 +5100 +4FE0 +8100 +ENDCHAR +STARTCHAR U_71E2 +ENCODING 29154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +64C0 +4A40 +75C0 +4A40 +75C0 +4A40 +FFE0 +94A0 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_71E3 +ENCODING 29155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5540 +D740 +F040 +DFC0 +4200 +7FE0 +5700 +8A80 +1260 +ENDCHAR +STARTCHAR U_71E4 +ENCODING 29156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AA80 +B7C0 +A540 +A7C0 +2540 +2FE0 +2920 +5BA0 +8860 +ENDCHAR +STARTCHAR U_71E5 +ENCODING 29157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +AFE0 +BAA0 +AAA0 +AEE0 +2100 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_71E6 +ENCODING 29158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +24A0 +BF40 +AAA0 +A500 +A920 +2540 +2FE0 +5380 +4D40 +8920 +ENDCHAR +STARTCHAR U_71E7 +ENCODING 29159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2BE0 +A500 +B280 +A1A0 +BEC0 +25A0 +26A0 +5580 +4A00 +91E0 +ENDCHAR +STARTCHAR U_71E8 +ENCODING 29160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A900 +B7C0 +A100 +2FE0 +32A0 +2FE0 +52A0 +4A40 +86A0 +ENDCHAR +STARTCHAR U_71E9 +ENCODING 29161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2E80 +BAE0 +AEA0 +AB20 +2EA0 +2440 +3F40 +4A40 +4AA0 +9520 +ENDCHAR +STARTCHAR U_71EA +ENCODING 29162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +BFE0 +AAA0 +B7A0 +29A0 +2640 +5520 +5440 +83C0 +ENDCHAR +STARTCHAR U_71EB +ENCODING 29163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +5FE0 +5500 +FFC0 +D540 +DFE0 +5540 +7FC0 +9580 +AD40 +5520 +ENDCHAR +STARTCHAR U_71EC +ENCODING 29164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2B40 +B940 +AF20 +A900 +AFE0 +20A0 +2EA0 +5440 +46C0 +9920 +ENDCHAR +STARTCHAR U_71ED +ENCODING 29165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B400 +AFE0 +A220 +2FA0 +3AA0 +4FA0 +42A0 +8F40 +ENDCHAR +STARTCHAR U_71EE +ENCODING 29166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AF40 +B160 +AF40 +2040 +5EA0 +8B20 +7FC0 +0900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_71EF +ENCODING 29167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +2FE0 +B920 +A540 +A920 +2280 +2560 +5FC0 +5280 +8100 +ENDCHAR +STARTCHAR U_71F0 +ENCODING 29168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +AFE0 +BA20 +AD40 +A7A0 +2400 +27C0 +5C80 +4300 +8CE0 +ENDCHAR +STARTCHAR U_71F1 +ENCODING 29169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A280 +BFE0 +A440 +A7C0 +2440 +27C0 +5540 +4CA0 +9380 +ENDCHAR +STARTCHAR U_71F2 +ENCODING 29170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +A240 +BFE0 +AAA0 +AFE0 +2840 +2FC0 +5840 +4FC0 +9860 +ENDCHAR +STARTCHAR U_71F3 +ENCODING 29171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5DE0 +54A0 +F5A0 +DE40 +D5E0 +5520 +5DE0 +7000 +9540 +A4A0 +ENDCHAR +STARTCHAR U_71F4 +ENCODING 29172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +A7C0 +B820 +AFE0 +AAA0 +2FE0 +2440 +57C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_71F5 +ENCODING 29173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2BE0 +B480 +A7E0 +A140 +3BE0 +2880 +3BE0 +4880 +5480 +A3E0 +ENDCHAR +STARTCHAR U_71F6 +ENCODING 29174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +AAA0 +BFE0 +AAA0 +2FE0 +2800 +3FE0 +4D40 +5480 +A660 +ENDCHAR +STARTCHAR U_71F7 +ENCODING 29175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BBA0 +AFE0 +2000 +27C0 +3000 +4FE0 +4540 +8B20 +ENDCHAR +STARTCHAR U_71F8 +ENCODING 29176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +AFE0 +B920 +A280 +AFE0 +2200 +2FE0 +5AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_71F9 +ENCODING 29177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2900 +52A0 +B9C0 +56A0 +90A0 +3580 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_71FA +ENCODING 29178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2280 +AFE0 +BAA0 +ABA0 +2920 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_71FB +ENCODING 29179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +AFE0 +BAA0 +AFE0 +A100 +27C0 +2100 +5FE0 +4540 +8AA0 +ENDCHAR +STARTCHAR U_71FC +ENCODING 29180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FC0 +A140 +B7E0 +A140 +AFE0 +2540 +2AA0 +5FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_71FD +ENCODING 29181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +B900 +A7E0 +A120 +AFC0 +2020 +2FE0 +5B20 +4EA0 +8060 +ENDCHAR +STARTCHAR U_71FE +ENCODING 29182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FE0 +0420 +7FE0 +0080 +7FC0 +4A80 +7AC0 +8920 +ENDCHAR +STARTCHAR U_71FF +ENCODING 29183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +AB60 +B4A0 +A7E0 +A480 +2FC0 +2480 +57C0 +4C80 +87E0 +ENDCHAR +STARTCHAR U_7200 +ENCODING 29184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5DC0 +6880 +FFE0 +D540 +7740 +5560 +5760 +B540 +9540 +2EC0 +ENDCHAR +STARTCHAR U_7201 +ENCODING 29185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +2A40 +AF60 +B940 +AF40 +AAA0 +2F00 +2000 +57C0 +4540 +9FE0 +ENDCHAR +STARTCHAR U_7202 +ENCODING 29186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DF60 +9120 +DF60 +9120 +DF60 +9520 +FFE0 +A4A0 +4500 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7203 +ENCODING 29187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2B60 +AA40 +B5A0 +A920 +AFE0 +2920 +27C0 +5380 +4D40 +8920 +ENDCHAR +STARTCHAR U_7204 +ENCODING 29188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5280 +5FE0 +F540 +D7C0 +D540 +57C0 +7FE0 +5960 +AFE0 +4820 +ENDCHAR +STARTCHAR U_7205 +ENCODING 29189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +AFE0 +B100 +A7C0 +A100 +2FE0 +2AA0 +57C0 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7206 +ENCODING 29190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +B7C0 +A440 +AFE0 +A280 +3FE0 +2540 +5BA0 +4540 +8920 +ENDCHAR +STARTCHAR U_7207 +ENCODING 29191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +5140 +8B40 +F9C0 +2220 +FC20 +5240 +8920 +ENDCHAR +STARTCHAR U_7208 +ENCODING 29192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +2FE0 +A920 +BFC0 +A920 +2FE0 +2940 +5FC0 +4A60 +95C0 +ENDCHAR +STARTCHAR U_7209 +ENCODING 29193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +A540 +BFC0 +AD40 +2AC0 +2FC0 +2A80 +5F80 +4AA0 +8F60 +ENDCHAR +STARTCHAR U_720A +ENCODING 29194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BFE0 +AA80 +ABE0 +2A80 +2BE0 +5940 +4AA0 +92A0 +ENDCHAR +STARTCHAR U_720B +ENCODING 29195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2480 +AFE0 +B4A0 +AFA0 +24A0 +2FA0 +24A0 +5FA0 +4AA0 +9560 +ENDCHAR +STARTCHAR U_720C +ENCODING 29196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AA40 +BFE0 +AA40 +AFE0 +2AA0 +2BE0 +5AA0 +4BE0 +9620 +ENDCHAR +STARTCHAR U_720D +ENCODING 29197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2BC0 +A6A0 +BBC0 +AAA0 +AFE0 +2100 +2FE0 +5380 +4540 +8920 +ENDCHAR +STARTCHAR U_720E +ENCODING 29198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +5120 +DFE0 +EAA0 +C440 +4FE0 +6440 +57C0 +9540 +8B20 +ENDCHAR +STARTCHAR U_720F +ENCODING 29199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5240 +5D80 +F480 +DFE0 +D5C0 +5EA0 +7100 +95C0 +A500 +4FE0 +ENDCHAR +STARTCHAR U_7210 +ENCODING 29200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +B920 +AFE0 +AD40 +2FC0 +2D40 +4FE0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_7211 +ENCODING 29201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2340 +77E0 +6C80 +B7E0 +2480 +27E0 +5480 +4FE0 +8AA0 +ENDCHAR +STARTCHAR U_7212 +ENCODING 29202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +AAA0 +57C0 +6C60 +A7C0 +3440 +A7C0 +3540 +4920 +8300 +ENDCHAR +STARTCHAR U_7213 +ENCODING 29203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +A920 +AEE0 +2C60 +2EE0 +5C60 +4FE0 +8820 +ENDCHAR +STARTCHAR U_7214 +ENCODING 29204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +B100 +AFE0 +A480 +BFE0 +2E80 +34A0 +5E40 +42A0 +8F20 +ENDCHAR +STARTCHAR U_7215 +ENCODING 29205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AEA0 +B1C0 +2E80 +5B40 +8E20 +2480 +2500 +4A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7216 +ENCODING 29206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +5F00 +55E0 +FE20 +C1E0 +5D00 +55C0 +5D00 +75C0 +9D20 +94E0 +ENDCHAR +STARTCHAR U_7217 +ENCODING 29207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2640 +A540 +B7C0 +A280 +2FE0 +2540 +2FE0 +5540 +4FE0 +8100 +ENDCHAR +STARTCHAR U_7218 +ENCODING 29208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +24E0 +2EA0 +BA40 +A5A0 +BA40 +2FE0 +2540 +57C0 +44A0 +8660 +ENDCHAR +STARTCHAR U_7219 +ENCODING 29209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +BEE0 +A280 +AFE0 +2280 +2FE0 +56A0 +4A40 +8720 +ENDCHAR +STARTCHAR U_721A +ENCODING 29210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +A840 +B7A0 +A000 +A7C0 +2540 +2FE0 +5AA0 +4FE0 +8AA0 +ENDCHAR +STARTCHAR U_721B +ENCODING 29211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2FE0 +2AA0 +5FE0 +4BA0 +8D60 +ENDCHAR +STARTCHAR U_721C +ENCODING 29212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +26C0 +2FE0 +B280 +AFE0 +A200 +3FE0 +2AA0 +5E40 +4AC0 +9F20 +ENDCHAR +STARTCHAR U_721D +ENCODING 29213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2940 +AFE0 +BAA0 +AFE0 +A920 +2F20 +29E0 +5F20 +4AA0 +8EE0 +ENDCHAR +STARTCHAR U_721E +ENCODING 29214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +A520 +B7E0 +A140 +AFE0 +2AA0 +2AA0 +5FE0 +5280 +8FE0 +ENDCHAR +STARTCHAR U_721F +ENCODING 29215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +A480 +BEE0 +AAA0 +AEE0 +2FE0 +2900 +5FE0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7220 +ENCODING 29216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +AAA0 +AEE0 +2500 +2FE0 +3480 +4FC0 +4480 +87E0 +ENDCHAR +STARTCHAR U_7221 +ENCODING 29217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +A540 +B7C0 +A540 +2FE0 +2920 +2540 +57C0 +4140 +8FE0 +ENDCHAR +STARTCHAR U_7222 +ENCODING 29218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4AA0 +7DE0 +4500 +7DE0 +4500 +BDE0 +A4A0 +ENDCHAR +STARTCHAR U_7223 +ENCODING 29219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +AFE0 +BAA0 +AFE0 +AAA0 +2FE0 +2100 +5FE0 +4540 +8AA0 +ENDCHAR +STARTCHAR U_7224 +ENCODING 29220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2440 +AEE0 +BAA0 +AFE0 +2920 +2FE0 +5BA0 +4D60 +8920 +ENDCHAR +STARTCHAR U_7225 +ENCODING 29221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2FE0 +2D40 +7B80 +6D40 +AFE0 +2AA0 +3FE0 +4920 +97A0 +2040 +ENDCHAR +STARTCHAR U_7226 +ENCODING 29222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2AE0 +BFA0 +AAA0 +AFE0 +A440 +27C0 +2440 +57C0 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_7227 +ENCODING 29223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +AFE0 +B920 +A280 +AFE0 +2AA0 +2FE0 +5540 +4920 +9FE0 +ENDCHAR +STARTCHAR U_7228 +ENCODING 29224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6FC0 +4B40 +FFE0 +9120 +7FC0 +5540 +FFE0 +2480 +D560 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7229 +ENCODING 29225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +2B40 +BDE0 +AB40 +AFE0 +3560 +3B80 +3540 +5FA0 +5940 +8E80 +ENDCHAR +STARTCHAR U_722A +ENCODING 29226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +3F80 +2480 +2480 +2480 +2480 +2480 +2480 +4440 +4440 +8420 +ENDCHAR +STARTCHAR U_722B +ENCODING 29227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +00E0 +0700 +F840 +4840 +2480 +2500 +ENDCHAR +STARTCHAR U_722C +ENCODING 29228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +EAA0 +AAA0 +ABE0 +AA00 +AA20 +AA20 +A5E0 +A400 +A300 +A0E0 +ENDCHAR +STARTCHAR U_722D +ENCODING 29229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2440 +1280 +3FC0 +0440 +FFE0 +0440 +7FC0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_722E +ENCODING 29230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +1BC0 +EC40 +ABC0 +AAC0 +ABC0 +AA40 +AAA0 +ABE0 +A400 +A3E0 +ENDCHAR +STARTCHAR U_722F +ENCODING 29231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7E40 +1280 +3FC0 +2440 +3FC0 +2440 +FFE0 +2040 +2040 +20C0 +ENDCHAR +STARTCHAR U_7230 +ENCODING 29232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2440 +1280 +7FC0 +0800 +FFE0 +1000 +1F80 +2880 +4700 +B8E0 +ENDCHAR +STARTCHAR U_7231 +ENCODING 29233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F40 +2480 +FFE0 +8420 +7FC0 +0800 +1F80 +2900 +CE00 +31E0 +ENDCHAR +STARTCHAR U_7232 +ENCODING 29234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C80 +1500 +3F80 +2080 +3FC0 +2040 +3FE0 +4020 +B520 +4AC0 +ENDCHAR +STARTCHAR U_7233 +ENCODING 29235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +1500 +3F80 +2080 +7FE0 +AAA0 +7FC0 +0180 +0600 +1400 +0800 +ENDCHAR +STARTCHAR U_7234 +ENCODING 29236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00E0 +FF40 +9540 +FD40 +9540 +F540 +AD40 +ED40 +9540 +FD20 +0820 +ENDCHAR +STARTCHAR U_7235 +ENCODING 29237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +4900 +FF80 +A480 +FF80 +8880 +FFC0 +8A80 +FA80 +9080 +F980 +ENDCHAR +STARTCHAR U_7236 +ENCODING 29238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +4040 +9140 +1100 +1100 +0A00 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7237 +ENCODING 29239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +5140 +0E00 +3180 +C060 +3F80 +0880 +0A80 +0900 +0800 +ENDCHAR +STARTCHAR U_7238 +ENCODING 29240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3180 +4A40 +0400 +1B00 +E0E0 +3F80 +2480 +3FA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_7239 +ENCODING 29241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3180 +CA60 +0E00 +35E0 +CF00 +3A00 +0500 +0FC0 +3480 +0300 +7C00 +ENDCHAR +STARTCHAR U_723A +ENCODING 29242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3180 +4E40 +F1E0 +0000 +FBE0 +4A20 +7AC0 +4A20 +7B20 +4EC0 +FA00 +ENDCHAR +STARTCHAR U_723B +ENCODING 29243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +6100 +1A00 +0600 +1900 +E280 +2200 +1200 +0C00 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_723C +ENCODING 29244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BC0 +5240 +3240 +4BC0 +8240 +0A40 +4A40 +53C0 +3240 +4A40 +8FE0 +ENDCHAR +STARTCHAR U_723D +ENCODING 29245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +5540 +2480 +5540 +2480 +5540 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_723E +ENCODING 29246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +7FC0 +C460 +6EC0 +5540 +6EC0 +5540 +6EC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_723F +ENCODING 29247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +11 +11 +11 +1F +01 +FF +11 +11 +11 +21 +C1 +ENDCHAR +STARTCHAR U_7240 +ENCODING 29248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +5FE0 +7200 +1300 +F680 +5680 +5A40 +5260 +9200 +1200 +ENDCHAR +STARTCHAR U_7241 +ENCODING 29249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5040 +5040 +7740 +1540 +1540 +F740 +5540 +5040 +5140 +9080 +ENDCHAR +STARTCHAR U_7242 +ENCODING 29250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5440 +5280 +5FE0 +7100 +1100 +17C0 +F100 +5FE0 +5100 +5100 +9100 +ENDCHAR +STARTCHAR U_7243 +ENCODING 29251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +5FE0 +5540 +75C0 +1400 +F7E0 +5100 +5FE0 +5380 +9D60 +1100 +ENDCHAR +STARTCHAR U_7244 +ENCODING 29252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +5240 +5520 +7FC0 +1440 +F7C0 +5440 +57E0 +5620 +5BE0 +9220 +ENDCHAR +STARTCHAR U_7245 +ENCODING 29253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFE0 +A940 +EFE0 +2940 +EFC0 +AD40 +AFC0 +AD40 +37C0 +2540 +ENDCHAR +STARTCHAR U_7246 +ENCODING 29254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +AFE0 +A540 +EBA0 +2FE0 +E000 +AFE0 +AAA0 +ABA0 +A820 +AFE0 +ENDCHAR +STARTCHAR U_7247 +ENCODING 29255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +2100 +3FE0 +2000 +2000 +3F80 +2080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_7248 +ENCODING 29256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +5700 +5400 +7FE0 +4640 +4540 +7540 +5480 +5480 +9540 +9A20 +ENDCHAR +STARTCHAR U_7249 +ENCODING 29257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5520 +5340 +7900 +47E0 +7100 +5100 +5FE0 +5100 +5100 +9100 +ENDCHAR +STARTCHAR U_724A +ENCODING 29258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5120 +5120 +7920 +42E0 +4400 +7BE0 +4A20 +4A20 +4BE0 +8A20 +ENDCHAR +STARTCHAR U_724B +ENCODING 29259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +53E0 +5680 +7B20 +45E0 +4280 +73E0 +5E40 +5180 +5320 +9CE0 +ENDCHAR +STARTCHAR U_724C +ENCODING 29260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57E0 +5520 +7FE0 +4520 +77E0 +5280 +5FE0 +5080 +9080 +9080 +ENDCHAR +STARTCHAR U_724D +ENCODING 29261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57E0 +5100 +7FE0 +44A0 +4A80 +7480 +5FE0 +5100 +5280 +9C60 +ENDCHAR +STARTCHAR U_724E +ENCODING 29262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +A7C0 +A540 +AD40 +F2C0 +8D40 +E280 +A040 +AD20 +B440 +23C0 +ENDCHAR +STARTCHAR U_724F +ENCODING 29263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +A280 +A440 +FBA0 +8000 +8EA0 +EAA0 +AEA0 +AAA0 +AE20 +AA60 +ENDCHAR +STARTCHAR U_7250 +ENCODING 29264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +A700 +A100 +AFE0 +F100 +8300 +ED60 +A920 +AF60 +A920 +AFE0 +ENDCHAR +STARTCHAR U_7251 +ENCODING 29265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFC0 +A840 +EFC0 +8800 +EFE0 +AAA0 +AFE0 +AAA0 +B2A0 +2240 +ENDCHAR +STARTCHAR U_7252 +ENCODING 29266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A540 +AFE0 +A540 +F5C0 +8400 +87E0 +E100 +AFE0 +A540 +A920 +A920 +ENDCHAR +STARTCHAR U_7253 +ENCODING 29267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +AFE0 +A280 +FFE0 +8920 +EFE0 +A200 +A3C0 +A240 +A440 +A980 +ENDCHAR +STARTCHAR U_7254 +ENCODING 29268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5FE0 +5540 +77C0 +4540 +77C0 +5540 +5FE0 +5240 +5040 +9080 +ENDCHAR +STARTCHAR U_7255 +ENCODING 29269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +57C0 +5540 +76C0 +4540 +7640 +57C0 +5240 +5D20 +5440 +93C0 +ENDCHAR +STARTCHAR U_7256 +ENCODING 29270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A100 +AFE0 +A820 +FFE0 +8940 +EFE0 +A920 +AFE0 +A920 +AFE0 +B160 +ENDCHAR +STARTCHAR U_7257 +ENCODING 29271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A940 +EFE0 +8940 +EFE0 +AAA0 +ABE0 +AAA0 +ABE0 +32A0 +ENDCHAR +STARTCHAR U_7258 +ENCODING 29272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5FE0 +5100 +7FE0 +4AA0 +4FE0 +7440 +57C0 +5440 +57C0 +9C60 +ENDCHAR +STARTCHAR U_7259 +ENCODING 29273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0100 +1100 +2100 +7FE0 +0300 +0500 +0900 +1100 +E100 +0300 +ENDCHAR +STARTCHAR U_725A +ENCODING 29274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +A0A0 +3F80 +0000 +7FC0 +2100 +7FE0 +1100 +E700 +ENDCHAR +STARTCHAR U_725B +ENCODING 29275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +2400 +2400 +7F80 +8400 +0400 +FFC0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_725C +ENCODING 29276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 0 -1 +BITMAP +08 +48 +7E +48 +8A +0C +38 +E8 +48 +08 +08 +ENDCHAR +STARTCHAR U_725D +ENCODING 29277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +5120 +7D40 +9180 +1D00 +3100 +D100 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_725E +ENCODING 29278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5100 +53E0 +7D20 +9120 +1920 +3120 +D120 +1220 +1420 +18C0 +ENDCHAR +STARTCHAR U_725F +ENCODING 29279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +3FC0 +0200 +2200 +3FC0 +4200 +0200 +FFE0 +0200 +0200 +ENDCHAR +STARTCHAR U_7260 +ENCODING 29280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A2A0 +A2E0 +FBA0 +A6A0 +32A0 +62E0 +A280 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7261 +ENCODING 29281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +5080 +7880 +93E0 +1880 +3080 +D080 +1080 +17E0 +1000 +ENDCHAR +STARTCHAR U_7262 +ENCODING 29282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8440 +2400 +3F80 +4400 +8400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7263 +ENCODING 29283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5120 +5120 +7D20 +9520 +1D20 +3120 +5120 +1220 +1520 +18C0 +ENDCHAR +STARTCHAR U_7264 +ENCODING 29284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A100 +A100 +FFE0 +2400 +3400 +E400 +2400 +2400 +27C0 +2000 +ENDCHAR +STARTCHAR U_7265 +ENCODING 29285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +57E0 +7A00 +53C0 +9A40 +3240 +D440 +1440 +1940 +1080 +ENDCHAR +STARTCHAR U_7266 +ENCODING 29286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +5700 +5100 +79E0 +9700 +1900 +31E0 +5700 +1120 +1120 +10E0 +ENDCHAR +STARTCHAR U_7267 +ENCODING 29287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +53E0 +7A40 +9640 +1A40 +3140 +D140 +1080 +1140 +1620 +ENDCHAR +STARTCHAR U_7268 +ENCODING 29288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +57E0 +7800 +9380 +1A80 +3280 +D280 +12A0 +14A0 +1860 +ENDCHAR +STARTCHAR U_7269 +ENCODING 29289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A200 +A7E0 +FAA0 +A2A0 +32A0 +64A0 +A920 +2220 +2520 +28C0 +ENDCHAR +STARTCHAR U_726A +ENCODING 29290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5280 +5280 +7BE0 +9480 +1880 +37E0 +5080 +1080 +1080 +1080 +ENDCHAR +STARTCHAR U_726B +ENCODING 29291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5240 +52E0 +7F00 +9240 +1A40 +3140 +D180 +11A0 +1660 +1020 +ENDCHAR +STARTCHAR U_726C +ENCODING 29292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +51C0 +5700 +7D00 +97E0 +1920 +3120 +5320 +15C0 +1900 +1100 +ENDCHAR +STARTCHAR U_726D +ENCODING 29293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +6FE0 +6AA0 +7AA0 +AAA0 +3AA0 +EAE0 +2C20 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_726E +ENCODING 29294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2240 +7FE0 +A100 +22A0 +1260 +1F80 +2200 +FFE0 +0200 +0200 +ENDCHAR +STARTCHAR U_726F +ENCODING 29295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +5080 +7FE0 +9080 +1080 +1BE0 +7220 +1220 +13E0 +1220 +ENDCHAR +STARTCHAR U_7270 +ENCODING 29296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A080 +A7E0 +FCA0 +A4A0 +2CA0 +37E0 +E4A0 +24A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_7271 +ENCODING 29297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +A040 +F740 +A540 +B540 +6740 +A040 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_7272 +ENCODING 29298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A280 +A280 +FBE0 +A480 +3880 +63C0 +A080 +2080 +2080 +2FE0 +ENDCHAR +STARTCHAR U_7273 +ENCODING 29299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A540 +FD40 +AFE0 +3840 +6940 +A940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_7274 +ENCODING 29300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +A780 +A480 +FC80 +A7E0 +3480 +E480 +2480 +24A0 +2760 +2CA0 +ENDCHAR +STARTCHAR U_7275 +ENCODING 29301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +2080 +FFE0 +A420 +3FC0 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7276 +ENCODING 29302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +5440 +9FA0 +2400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7277 +ENCODING 29303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5280 +5440 +7C20 +9380 +1900 +3100 +57C0 +1100 +1100 +1FE0 +ENDCHAR +STARTCHAR U_7278 +ENCODING 29304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A820 +F7C0 +A080 +2100 +3FE0 +E100 +2100 +2500 +2200 +ENDCHAR +STARTCHAR U_7279 +ENCODING 29305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7C0 +F100 +A100 +AFE0 +3080 +6FE0 +A480 +2280 +2080 +2380 +ENDCHAR +STARTCHAR U_727A +ENCODING 29306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A280 +A280 +FFE0 +AAA0 +2AA0 +3AA0 +ECE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_727B +ENCODING 29307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2440 +AFE0 +F540 +A580 +2740 +35A0 +E740 +2980 +2920 +36E0 +ENDCHAR +STARTCHAR U_727C +ENCODING 29308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A540 +A540 +FA80 +AA80 +3540 +6540 +AFC0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_727D +ENCODING 29309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0A00 +FFE0 +8920 +BFA0 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_727E +ENCODING 29310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +AFC0 +F240 +AFE0 +2000 +37C0 +E440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_727F +ENCODING 29311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +A500 +AFC0 +F100 +AFE0 +3000 +67E0 +A420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7280 +ENCODING 29312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4040 +7FC0 +5280 +4B00 +72C0 +4A00 +5FC0 +4200 +BFE0 +8200 +ENDCHAR +STARTCHAR U_7281 +ENCODING 29313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +1120 +FD20 +1120 +3820 +54E0 +A200 +3FC0 +4200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_7282 +ENCODING 29314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +73E0 +12A0 +7CA0 +3920 +D6A0 +2240 +3FC0 +4200 +7FE0 +0200 +ENDCHAR +STARTCHAR U_7283 +ENCODING 29315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +57C0 +7840 +5440 +9280 +1FE0 +3000 +D7C0 +1440 +1440 +17C0 +ENDCHAR +STARTCHAR U_7284 +ENCODING 29316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A280 +F440 +AFE0 +3040 +6740 +A540 +2740 +2040 +21C0 +ENDCHAR +STARTCHAR U_7285 +ENCODING 29317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +A920 +FFE0 +A920 +2D60 +3D60 +EFE0 +2820 +2820 +2860 +ENDCHAR +STARTCHAR U_7286 +ENCODING 29318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7E0 +A100 +FFC0 +A440 +37C0 +6440 +A740 +25C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7287 +ENCODING 29319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FC0 +4400 +7FC0 +0400 +5280 +7BC0 +9480 +1BE0 +7080 +1080 +ENDCHAR +STARTCHAR U_7288 +ENCODING 29320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +A540 +AFE0 +F200 +AFE0 +2440 +3BE0 +E240 +22C0 +2220 +21E0 +ENDCHAR +STARTCHAR U_7289 +ENCODING 29321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +57E0 +5240 +7BC0 +9000 +17C0 +1880 +77E0 +1080 +1280 +1100 +ENDCHAR +STARTCHAR U_728A +ENCODING 29322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A7C0 +A100 +FFE0 +A4A0 +2280 +3480 +E280 +2FE0 +2240 +2C20 +ENDCHAR +STARTCHAR U_728B +ENCODING 29323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A7C0 +FC40 +A7C0 +2440 +37C0 +E440 +3FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_728C +ENCODING 29324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +AA20 +AA20 +FEE0 +A800 +2FE0 +38A0 +EFA0 +2840 +28A0 +2920 +ENDCHAR +STARTCHAR U_728D +ENCODING 29325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +AFE0 +A4A0 +FDE0 +A6A0 +23E0 +3A80 +EBE0 +2480 +2A80 +31E0 +ENDCHAR +STARTCHAR U_728E +ENCODING 29326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FBE0 +2040 +FA40 +2140 +FCC0 +2400 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_728F +ENCODING 29327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A820 +FFE0 +A800 +2FE0 +3AA0 +EFE0 +2AA0 +2AA0 +3860 +ENDCHAR +STARTCHAR U_7290 +ENCODING 29328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +AEA0 +A260 +FF20 +A2A0 +2360 +36A0 +EA20 +23E0 +2220 +2220 +ENDCHAR +STARTCHAR U_7291 +ENCODING 29329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A7C0 +FC40 +A7C0 +2440 +37C0 +E140 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7292 +ENCODING 29330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A000 +FBC0 +A240 +23C0 +3000 +6FE0 +AAA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_7293 +ENCODING 29331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A200 +A7E0 +F520 +AFE0 +2220 +3440 +67E0 +AD20 +27E0 +2120 +2640 +ENDCHAR +STARTCHAR U_7294 +ENCODING 29332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A800 +B780 +E000 +AFC0 +3AC0 +2740 +EFC0 +2740 +2AA0 +2220 +ENDCHAR +STARTCHAR U_7295 +ENCODING 29333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +A7E0 +F280 +AFE0 +2200 +37E0 +6D20 +A7E0 +2520 +27E0 +2560 +ENDCHAR +STARTCHAR U_7296 +ENCODING 29334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +5AC0 +9480 +2B40 +FFE0 +8020 +A420 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7297 +ENCODING 29335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A920 +F7C0 +A100 +27C0 +3100 +EFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7298 +ENCODING 29336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +4A80 +5FE0 +6200 +7FE0 +8200 +ENDCHAR +STARTCHAR U_7299 +ENCODING 29337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2480 +AFC0 +F4A0 +AFE0 +3280 +6540 +BAA0 +2140 +2080 +2700 +ENDCHAR +STARTCHAR U_729A +ENCODING 29338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +47E0 +7E40 +4940 +6A40 +58C0 +A400 +3F80 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_729B +ENCODING 29339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2140 +FC80 +A940 +7FE0 +5200 +5FC0 +4200 +7FE0 +8200 +ENDCHAR +STARTCHAR U_729C +ENCODING 29340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AE80 +A0E0 +FFA0 +AAA0 +2EA0 +32A0 +E440 +2E40 +24A0 +2D20 +ENDCHAR +STARTCHAR U_729D +ENCODING 29341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A280 +F100 +AFE0 +2540 +37C0 +E540 +2FE0 +2100 +3FE0 +ENDCHAR +STARTCHAR U_729E +ENCODING 29342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A200 +BFE0 +E480 +ACC0 +37A0 +2000 +EFE0 +2AA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_729F +ENCODING 29343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +0A40 +7FE0 +4520 +7FE0 +4940 +3520 +3FC0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_72A0 +ENCODING 29344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +A7E0 +A100 +FBC0 +A100 +2FE0 +34A0 +EFE0 +24C0 +3EA0 +2560 +ENDCHAR +STARTCHAR U_72A1 +ENCODING 29345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AA80 +AFE0 +FA80 +AFC0 +2940 +3FC0 +E940 +2FE0 +3960 +2BA0 +ENDCHAR +STARTCHAR U_72A2 +ENCODING 29346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +A100 +FFE0 +AAA0 +2FE0 +3440 +E7C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_72A3 +ENCODING 29347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AA80 +A540 +FFE0 +AAA0 +2FE0 +3DC0 +EB40 +2DC0 +2B60 +2DA0 +ENDCHAR +STARTCHAR U_72A4 +ENCODING 29348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +AFE0 +F240 +A560 +2F40 +3960 +EF40 +2960 +2F40 +2960 +ENDCHAR +STARTCHAR U_72A5 +ENCODING 29349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +AA80 +FFE0 +AAA0 +2FE0 +3CA0 +EEC0 +2CE0 +3740 +2AA0 +ENDCHAR +STARTCHAR U_72A6 +ENCODING 29350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A440 +A7C0 +F440 +AFE0 +3280 +2FE0 +E540 +2BA0 +2540 +2B20 +ENDCHAR +STARTCHAR U_72A7 +ENCODING 29351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +A100 +FFE0 +A100 +2FE0 +34A0 +EFE0 +2EC0 +2260 +2DA0 +ENDCHAR +STARTCHAR U_72A8 +ENCODING 29352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +7DE0 +D340 +7DE0 +5140 +7DE0 +1200 +1FC0 +2200 +7FE0 +0200 +ENDCHAR +STARTCHAR U_72A9 +ENCODING 29353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +27C0 +FD40 +27C0 +FD40 +57A0 +2CE0 +7F80 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_72AA +ENCODING 29354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +FA80 +ABE0 +AEA0 +3B80 +6A60 +B7C0 +2CA0 +2300 +3CE0 +ENDCHAR +STARTCHAR U_72AB +ENCODING 29355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FE0 +D540 +7FE0 +7BE0 +5F40 +7DE0 +7FC0 +8400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_72AC +ENCODING 29356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +0400 +FFE0 +0400 +0400 +0600 +0900 +1080 +2040 +C020 +ENDCHAR +STARTCHAR U_72AD +ENCODING 29357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +68 +10 +30 +48 +88 +18 +28 +48 +88 +28 +10 +ENDCHAR +STARTCHAR U_72AE +ENCODING 29358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0880 +FFE0 +0800 +0FC0 +1480 +1480 +2300 +2300 +4480 +9860 +ENDCHAR +STARTCHAR U_72AF +ENCODING 29359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +2440 +5440 +9440 +3580 +5400 +9400 +1420 +5420 +23E0 +ENDCHAR +STARTCHAR U_72B0 +ENCODING 29360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5200 +2200 +5F80 +9280 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72B1 +ENCODING 29361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5200 +2200 +5F80 +9280 +3680 +5280 +9580 +14A0 +5860 +2020 +ENDCHAR +STARTCHAR U_72B2 +ENCODING 29362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5080 +2080 +57E0 +9080 +3180 +5280 +9480 +1880 +5280 +2100 +ENDCHAR +STARTCHAR U_72B3 +ENCODING 29363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +5200 +23E0 +5420 +9020 +2920 +48A0 +88A0 +0820 +5140 +2080 +ENDCHAR +STARTCHAR U_72B4 +ENCODING 29364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5100 +2100 +5100 +9FE0 +3100 +5100 +9100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_72B5 +ENCODING 29365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +53E0 +2400 +5800 +97C0 +3080 +5100 +9200 +1420 +5420 +23E0 +ENDCHAR +STARTCHAR U_72B6 +ENCODING 29366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +9140 +5100 +5FE0 +1100 +1100 +3280 +D280 +1440 +1440 +1820 +ENDCHAR +STARTCHAR U_72B7 +ENCODING 29367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +57E0 +2400 +5400 +9400 +3400 +5400 +9400 +1400 +5400 +2800 +ENDCHAR +STARTCHAR U_72B8 +ENCODING 29368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5040 +2240 +5240 +9440 +37E0 +5020 +97A0 +1020 +5120 +20C0 +ENDCHAR +STARTCHAR U_72B9 +ENCODING 29369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5120 +2100 +5FE0 +9280 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72BA +ENCODING 29370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5100 +2FE0 +5000 +9380 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72BB +ENCODING 29371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +AFE0 +4100 +A7C0 +3540 +3540 +5540 +95C0 +1540 +5100 +2100 +ENDCHAR +STARTCHAR U_72BC +ENCODING 29372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +5F80 +2180 +6280 +9380 +3680 +5A80 +9280 +12A0 +5AA0 +2460 +ENDCHAR +STARTCHAR U_72BD +ENCODING 29373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87E0 +5080 +2280 +5480 +97E0 +3080 +5180 +9280 +1480 +5A80 +2100 +ENDCHAR +STARTCHAR U_72BE +ENCODING 29374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5280 +2240 +DFE0 +1200 +3300 +5500 +9480 +1480 +5860 +2040 +ENDCHAR +STARTCHAR U_72BF +ENCODING 29375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5100 +2000 +5FE0 +9100 +3100 +5180 +9140 +1120 +5100 +2100 +ENDCHAR +STARTCHAR U_72C0 +ENCODING 29376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5180 +5140 +5FE0 +7100 +1100 +F100 +5280 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_72C1 +ENCODING 29377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5240 +2420 +5FA0 +9000 +3280 +5280 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72C2 +ENCODING 29378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +2100 +5100 +9100 +37C0 +5100 +9100 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_72C3 +ENCODING 29379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5140 +2140 +5140 +9140 +37C0 +5240 +9240 +1240 +5240 +2FE0 +ENDCHAR +STARTCHAR U_72C4 +ENCODING 29380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +2520 +5540 +9580 +3900 +5100 +9280 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_72C5 +ENCODING 29381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +5700 +2100 +5100 +9100 +3FE0 +5100 +9100 +1100 +5100 +27C0 +ENDCHAR +STARTCHAR U_72C6 +ENCODING 29382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +27E0 +5520 +9520 +37E0 +5520 +9100 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_72C7 +ENCODING 29383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +9200 +6200 +6FE0 +A700 +2680 +6A80 +B240 +2260 +A200 +4200 +ENDCHAR +STARTCHAR U_72C8 +ENCODING 29384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5420 +24A0 +54A0 +94A0 +34A0 +54A0 +94A0 +1140 +5220 +2C20 +ENDCHAR +STARTCHAR U_72C9 +ENCODING 29385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57E0 +2100 +5100 +9140 +3320 +5520 +9100 +1100 +5000 +2FE0 +ENDCHAR +STARTCHAR U_72CA +ENCODING 29386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +0500 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_72CB +ENCODING 29387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5000 +2000 +5FE0 +9100 +3540 +5540 +9520 +1920 +5500 +2200 +ENDCHAR +STARTCHAR U_72CC +ENCODING 29388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5500 +2500 +57E0 +9900 +3100 +57C0 +9100 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_72CD +ENCODING 29389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +53E0 +2420 +5FA0 +94A0 +34A0 +57A0 +9460 +1400 +5420 +23E0 +ENDCHAR +STARTCHAR U_72CE +ENCODING 29390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +54A0 +24A0 +57E0 +94A0 +34A0 +57E0 +9080 +1080 +5080 +2080 +ENDCHAR +STARTCHAR U_72CF +ENCODING 29391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +57E0 +2800 +5500 +95C0 +3740 +5D40 +95C0 +1520 +5520 +23E0 +ENDCHAR +STARTCHAR U_72D0 +ENCODING 29392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +AF00 +4A80 +AA80 +2A80 +2A40 +6A40 +AA40 +2AA0 +2BA0 +D020 +ENDCHAR +STARTCHAR U_72D1 +ENCODING 29393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +2440 +5A20 +9100 +3FE0 +5040 +9480 +1300 +5100 +2080 +ENDCHAR +STARTCHAR U_72D2 +ENCODING 29394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5FE0 +22A0 +57E0 +9A80 +3A80 +5FE0 +92A0 +12E0 +5480 +2880 +ENDCHAR +STARTCHAR U_72D3 +ENCODING 29395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9100 +6FE0 +6920 +A940 +2FC0 +6A80 +AA80 +2900 +AA80 +5460 +ENDCHAR +STARTCHAR U_72D4 +ENCODING 29396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5420 +2420 +57E0 +9400 +3520 +5540 +9580 +1520 +5920 +20E0 +ENDCHAR +STARTCHAR U_72D5 +ENCODING 29397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A080 +6480 +6480 +ABE0 +3EA0 +64A0 +AAA0 +3EA0 +2120 +A2A0 +4440 +ENDCHAR +STARTCHAR U_72D6 +ENCODING 29398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5100 +2FE0 +5820 +9280 +3280 +5280 +9240 +1440 +5420 +2820 +ENDCHAR +STARTCHAR U_72D7 +ENCODING 29399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +5200 +27E0 +5420 +9BA0 +32A0 +52A0 +93A0 +1020 +5140 +2080 +ENDCHAR +STARTCHAR U_72D8 +ENCODING 29400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5120 +27E0 +5500 +9520 +3520 +5540 +9580 +16A0 +5560 +2220 +ENDCHAR +STARTCHAR U_72D9 +ENCODING 29401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +2440 +57C0 +9440 +3440 +5440 +97C0 +1440 +5440 +2FE0 +ENDCHAR +STARTCHAR U_72DA +ENCODING 29402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5440 +2440 +5440 +97C0 +3440 +5440 +97C0 +1440 +5000 +2FE0 +ENDCHAR +STARTCHAR U_72DB +ENCODING 29403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5200 +27E0 +5420 +9420 +37E0 +5420 +9420 +1420 +57E0 +2420 +ENDCHAR +STARTCHAR U_72DC +ENCODING 29404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +2FE0 +5100 +9100 +37C0 +5440 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72DD +ENCODING 29405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +57E0 +2820 +5140 +9500 +3580 +5940 +9920 +1120 +5500 +2200 +ENDCHAR +STARTCHAR U_72DE +ENCODING 29406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2420 +5000 +97E0 +3100 +5100 +9100 +1100 +5100 +2300 +ENDCHAR +STARTCHAR U_72DF +ENCODING 29407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57E0 +2000 +57C0 +9440 +37C0 +5440 +97C0 +1440 +5000 +2FE0 +ENDCHAR +STARTCHAR U_72E0 +ENCODING 29408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +27C0 +5440 +97C0 +3500 +5540 +9480 +1480 +5540 +2620 +ENDCHAR +STARTCHAR U_72E1 +ENCODING 29409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5100 +2FE0 +5280 +9440 +3AA0 +5280 +9280 +1100 +A280 +4C60 +ENDCHAR +STARTCHAR U_72E2 +ENCODING 29410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53C0 +2440 +5A80 +9100 +3680 +5860 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72E3 +ENCODING 29411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5280 +2AA0 +56C0 +9280 +36C0 +5AA0 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_72E4 +ENCODING 29412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +2FE0 +5100 +97C0 +3000 +57C0 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72E5 +ENCODING 29413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9400 +67E0 +2820 +57A0 +94A0 +37A0 +54A0 +97A0 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U_72E6 +ENCODING 29414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4AA0 +AAA0 +3FE0 +2AA0 +6AA0 +BFE0 +2AA0 +2AA0 +2AA0 +C860 +ENDCHAR +STARTCHAR U_72E7 +ENCODING 29415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +91C0 +5F00 +2100 +5FE0 +9100 +3100 +57C0 +9440 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72E8 +ENCODING 29416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +5120 +2FE0 +5500 +9520 +3F20 +5540 +9480 +14A0 +6960 +2220 +ENDCHAR +STARTCHAR U_72E9 +ENCODING 29417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2420 +5080 +9080 +3FE0 +5480 +9280 +1080 +5280 +2100 +ENDCHAR +STARTCHAR U_72EA +ENCODING 29418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4820 +ABA0 +2820 +2BA0 +6AA0 +AAA0 +2BA0 +2820 +28A0 +C840 +ENDCHAR +STARTCHAR U_72EB +ENCODING 29419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A20 +57A0 +2240 +5280 +9FE0 +3200 +5640 +9B80 +1220 +5220 +21E0 +ENDCHAR +STARTCHAR U_72EC +ENCODING 29420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5100 +27E0 +5520 +9520 +3520 +57E0 +9100 +1120 +5FE0 +2020 +ENDCHAR +STARTCHAR U_72ED +ENCODING 29421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2100 +5920 +9540 +3FE0 +5100 +9100 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_72EE +ENCODING 29422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A3E0 +4A80 +ABE0 +2AA0 +2AA0 +6AA0 +AAA0 +2AA0 +22E0 +A480 +4880 +ENDCHAR +STARTCHAR U_72EF +ENCODING 29423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +2440 +5820 +97A0 +3000 +5FE0 +9100 +1240 +5440 +2FA0 +ENDCHAR +STARTCHAR U_72F0 +ENCODING 29424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +53C0 +2480 +57C0 +9140 +3FE0 +5140 +97C0 +1100 +5100 +2300 +ENDCHAR +STARTCHAR U_72F1 +ENCODING 29425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8C0 +44A0 +A480 +3BE0 +2880 +6880 +A880 +2A80 +2D40 +2A20 +C420 +ENDCHAR +STARTCHAR U_72F2 +ENCODING 29426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AE80 +4280 +A480 +2480 +27C0 +6DA0 +B6A0 +2480 +2480 +B680 +4900 +ENDCHAR +STARTCHAR U_72F3 +ENCODING 29427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A300 +4480 +A840 +37E0 +2100 +6FE0 +A100 +2540 +2920 +2920 +C300 +ENDCHAR +STARTCHAR U_72F4 +ENCODING 29428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +4920 +AFC0 +2900 +2B20 +6CE0 +A100 +27C0 +2100 +2100 +DFE0 +ENDCHAR +STARTCHAR U_72F5 +ENCODING 29429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5280 +2240 +5FE0 +9540 +3580 +5540 +95A0 +1540 +59A0 +26E0 +ENDCHAR +STARTCHAR U_72F6 +ENCODING 29430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8B60 +5080 +2360 +5080 +9FE0 +3280 +57E0 +9AA0 +12A0 +52E0 +2080 +ENDCHAR +STARTCHAR U_72F7 +ENCODING 29431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +23C0 +5000 +97E0 +3420 +57E0 +9420 +17E0 +5420 +24E0 +ENDCHAR +STARTCHAR U_72F8 +ENCODING 29432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5520 +2520 +57E0 +9520 +37E0 +5100 +97C0 +1100 +5100 +2FE0 +ENDCHAR +STARTCHAR U_72F9 +ENCODING 29433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2100 +5540 +9540 +3BA0 +5100 +9100 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_72FA +ENCODING 29434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2000 +57C0 +9000 +37C0 +5000 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_72FB +ENCODING 29435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A00 +5440 +2FE0 +5280 +9440 +3A20 +53C0 +9680 +1900 +5280 +2C60 +ENDCHAR +STARTCHAR U_72FC +ENCODING 29436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2440 +57C0 +9440 +37C0 +5520 +9540 +1480 +5540 +2620 +ENDCHAR +STARTCHAR U_72FD +ENCODING 29437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5420 +27E0 +5420 +97E0 +3420 +57E0 +9000 +1240 +5220 +2C20 +ENDCHAR +STARTCHAR U_72FE +ENCODING 29438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +2500 +5F00 +95E0 +1740 +3540 +5D40 +9540 +1540 +1540 +6E40 +ENDCHAR +STARTCHAR U_72FF +ENCODING 29439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E20 +25C0 +6440 +A960 +2F40 +2540 +6540 +ADE0 +2400 +2A00 +D1E0 +ENDCHAR +STARTCHAR U_7300 +ENCODING 29440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +44C0 +B2A0 +2AA0 +6480 +A8A0 +3840 +2880 +AB00 +4C00 +ENDCHAR +STARTCHAR U_7301 +ENCODING 29441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E20 +24A0 +64A0 +BFA0 +24A0 +66A0 +ADA0 +34A0 +2420 +2420 +C4E0 +ENDCHAR +STARTCHAR U_7302 +ENCODING 29442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5440 +27C0 +5440 +17C0 +3000 +57C0 +9100 +1FE0 +5100 +2100 +ENDCHAR +STARTCHAR U_7303 +ENCODING 29443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +2440 +5820 +97C0 +3000 +5A40 +9540 +1540 +5080 +2FE0 +ENDCHAR +STARTCHAR U_7304 +ENCODING 29444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +4000 +A7C0 +2440 +57C0 +9100 +1540 +1920 +5520 +2200 +ENDCHAR +STARTCHAR U_7305 +ENCODING 29445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5280 +2EE0 +5280 +9EE0 +3280 +5280 +9EE0 +1280 +5280 +2280 +ENDCHAR +STARTCHAR U_7306 +ENCODING 29446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7BC0 +0A00 +7BC0 +0A00 +7BC0 +0E80 +7FE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7307 +ENCODING 29447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A1E0 +4100 +AFE0 +2920 +2FC0 +6920 +A9E0 +2800 +2B80 +32A0 +CC60 +ENDCHAR +STARTCHAR U_7308 +ENCODING 29448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +2520 +57E0 +9520 +37E0 +5280 +9FE0 +1080 +5080 +2080 +ENDCHAR +STARTCHAR U_7309 +ENCODING 29449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +97E0 +6240 +63C0 +9240 +33C0 +5240 +9FE0 +1240 +5420 +2820 +ENDCHAR +STARTCHAR U_730A +ENCODING 29450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5660 +2420 +56E0 +9420 +3420 +57E0 +9280 +12A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_730B +ENCODING 29451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +7FE0 +1100 +E0E0 +1040 +28A0 +FBE0 +2080 +5140 +8A20 +ENDCHAR +STARTCHAR U_730C +ENCODING 29452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FCC0 +10A0 +57E0 +5480 +BA80 +1080 +3880 +5540 +9220 +1420 +ENDCHAR +STARTCHAR U_730D +ENCODING 29453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9FE0 +6100 +6540 +9540 +3BA0 +5100 +9380 +1540 +5920 +2100 +ENDCHAR +STARTCHAR U_730E +ENCODING 29454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5280 +27C0 +5280 +9FE0 +3000 +57C0 +9440 +17C0 +5440 +27C0 +ENDCHAR +STARTCHAR U_730F +ENCODING 29455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +27E0 +6420 +97E0 +1400 +35E0 +5520 +95E0 +1520 +95E0 +6920 +ENDCHAR +STARTCHAR U_7310 +ENCODING 29456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +6FE0 +2200 +57C0 +9200 +3200 +5FE0 +9300 +1520 +5520 +28E0 +ENDCHAR +STARTCHAR U_7311 +ENCODING 29457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFC0 +4840 +AFC0 +2840 +2FC0 +6900 +AF20 +29C0 +2900 +AF20 +48E0 +ENDCHAR +STARTCHAR U_7312 +ENCODING 29458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +48C0 +78A0 +4BE0 +FC80 +8480 +FC80 +8480 +FD40 +8620 +8C20 +ENDCHAR +STARTCHAR U_7313 +ENCODING 29459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2540 +57C0 +9540 +17C0 +3100 +5FE0 +9100 +1380 +1540 +6920 +ENDCHAR +STARTCHAR U_7314 +ENCODING 29460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +4820 +A7C0 +2000 +6FE0 +A100 +2940 +2920 +B520 +4200 +ENDCHAR +STARTCHAR U_7315 +ENCODING 29461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5D00 +2500 +65E0 +AE20 +2880 +6DC0 +A5A0 +26A0 +24A0 +B480 +4980 +ENDCHAR +STARTCHAR U_7316 +ENCODING 29462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +23C0 +5240 +93C0 +3000 +57E0 +9420 +17E0 +5420 +27E0 +ENDCHAR +STARTCHAR U_7317 +ENCODING 29463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +2280 +5440 +9FE0 +3040 +5740 +9540 +1740 +5040 +21C0 +ENDCHAR +STARTCHAR U_7318 +ENCODING 29464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9A20 +6A20 +6FA0 +B220 +2FA0 +62A0 +AFA0 +2AA0 +2AA0 +ABA0 +4260 +ENDCHAR +STARTCHAR U_7319 +ENCODING 29465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5A20 +2540 +57C0 +9140 +3FE0 +5140 +97C0 +1100 +5500 +2200 +ENDCHAR +STARTCHAR U_731A +ENCODING 29466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +5240 +27E0 +5C80 +97E0 +3480 +57E0 +9480 +1480 +57E0 +2400 +ENDCHAR +STARTCHAR U_731B +ENCODING 29467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5080 +2100 +5FE0 +9100 +3500 +5200 +9FE0 +2AA0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_731C +ENCODING 29468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5FE0 +2100 +67C0 +A100 +2FE0 +6440 +A7C0 +2440 +27C0 +C440 +ENDCHAR +STARTCHAR U_731D +ENCODING 29469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2440 +5440 +9AA0 +3120 +5100 +9FE0 +1100 +5100 +2100 +ENDCHAR +STARTCHAR U_731E +ENCODING 29470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +2280 +5440 +9BA0 +1100 +3FE0 +5100 +97C0 +1440 +57C0 +2440 +ENDCHAR +STARTCHAR U_731F +ENCODING 29471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +A540 +4080 +AFC0 +2A40 +6FC0 +AA40 +2FC0 +AA40 +5260 +2020 +ENDCHAR +STARTCHAR U_7320 +ENCODING 29472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +A500 +5FC0 +B540 +3FC0 +7540 +B540 +3FE0 +2480 +A840 +5020 +ENDCHAR +STARTCHAR U_7321 +ENCODING 29473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +5AA0 +9FE0 +1200 +33E0 +5640 +9940 +1080 +5100 +2E00 +ENDCHAR +STARTCHAR U_7322 +ENCODING 29474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D4E0 +24A0 +7FA0 +A4E0 +24A0 +2EA0 +6AE0 +AAA0 +2EA0 +A120 +4260 +ENDCHAR +STARTCHAR U_7323 +ENCODING 29475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +4920 +AAA0 +2FE0 +2440 +6A20 +A3C0 +2680 +2900 +2280 +DC60 +ENDCHAR +STARTCHAR U_7324 +ENCODING 29476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AF40 +4AA0 +A440 +3BA0 +6100 +AFE0 +2280 +2280 +A440 +4820 +ENDCHAR +STARTCHAR U_7325 +ENCODING 29477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5540 +27C0 +5540 +97C0 +3000 +57E0 +9540 +1480 +5540 +2620 +ENDCHAR +STARTCHAR U_7326 +ENCODING 29478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2440 +57C0 +9540 +17C0 +3540 +57C0 +9540 +15A0 +9760 +6820 +ENDCHAR +STARTCHAR U_7327 +ENCODING 29479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +6440 +6740 +A540 +2FE0 +6820 +ABA0 +2AA0 +2BA0 +A820 +4860 +ENDCHAR +STARTCHAR U_7328 +ENCODING 29480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +AE40 +4A80 +AFC0 +2200 +3FE0 +6200 +A3C0 +2680 +A900 +56E0 +ENDCHAR +STARTCHAR U_7329 +ENCODING 29481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +27C0 +5440 +97C0 +3500 +57E0 +9900 +17C0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_732A +ENCODING 29482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8920 +57A0 +2140 +57E0 +9100 +33E0 +5620 +9BE0 +1220 +53E0 +2220 +ENDCHAR +STARTCHAR U_732B +ENCODING 29483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A40 +57E0 +2240 +5240 +97E0 +3520 +5520 +97E0 +1520 +57E0 +2420 +ENDCHAR +STARTCHAR U_732C +ENCODING 29484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5920 +2FE0 +5920 +9FE0 +3440 +57C0 +9440 +17C0 +5440 +24C0 +ENDCHAR +STARTCHAR U_732D +ENCODING 29485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93C0 +5480 +2780 +5100 +9FE0 +3220 +5540 +9A80 +15C0 +52A0 +2D80 +ENDCHAR +STARTCHAR U_732E +ENCODING 29486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FCC0 +10A0 +FFE0 +AC80 +9480 +FC80 +9480 +FD40 +9540 +8E20 +ENDCHAR +STARTCHAR U_732F +ENCODING 29487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A920 +4FE0 +A000 +3FE0 +2100 +6FE0 +AAA0 +2AA0 +AAA0 +4860 +ENDCHAR +STARTCHAR U_7330 +ENCODING 29488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +5FE0 +24A0 +5EA0 +94A0 +3F60 +5500 +9FE0 +1280 +5440 +2820 +ENDCHAR +STARTCHAR U_7331 +ENCODING 29489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5280 +2100 +5FE0 +9540 +3B00 +5100 +9FE0 +1380 +5540 +2920 +ENDCHAR +STARTCHAR U_7332 +ENCODING 29490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +2440 +57C0 +9440 +17C0 +3200 +57E0 +9CA0 +1560 +17A0 +60C0 +ENDCHAR +STARTCHAR U_7333 +ENCODING 29491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2A20 +6EE0 +A800 +28E0 +2EA0 +68A0 +AEA0 +2840 +28A0 +C920 +ENDCHAR +STARTCHAR U_7334 +ENCODING 29492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABC0 +4840 +AFE0 +3A00 +2BE0 +6C80 +A880 +2FE0 +2880 +A940 +4A20 +ENDCHAR +STARTCHAR U_7335 +ENCODING 29493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +6FE0 +6820 +AFE0 +2800 +6FE0 +AAA0 +2FE0 +2AA0 +BAA0 +4860 +ENDCHAR +STARTCHAR U_7336 +ENCODING 29494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +A280 +5FE0 +A280 +2FE0 +6AA0 +ACE0 +2820 +2FE0 +A820 +4FE0 +ENDCHAR +STARTCHAR U_7337 +ENCODING 29495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +28C0 +FEA0 +29E0 +FE80 +AA80 +CE80 +8280 +FE80 +8340 +FE20 +ENDCHAR +STARTCHAR U_7338 +ENCODING 29496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4920 +AFE0 +2800 +2BE0 +6A20 +ABE0 +2A20 +2BE0 +2A20 +D3E0 +ENDCHAR +STARTCHAR U_7339 +ENCODING 29497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2540 +5920 +97C0 +3440 +57C0 +9440 +17C0 +5000 +2FE0 +ENDCHAR +STARTCHAR U_733A +ENCODING 29498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5000 +2520 +5540 +9200 +33C0 +5500 +9FE0 +1100 +5520 +27E0 +ENDCHAR +STARTCHAR U_733B +ENCODING 29499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFC0 +4480 +A920 +2BC0 +2880 +6D20 +BBE0 +2880 +29C0 +AAA0 +5880 +ENDCHAR +STARTCHAR U_733C +ENCODING 29500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8940 +57E0 +2520 +57E0 +9520 +37E0 +5520 +9040 +1FE0 +5440 +22C0 +ENDCHAR +STARTCHAR U_733D +ENCODING 29501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A840 +4780 +A480 +2780 +2480 +6780 +A200 +3FE0 +A480 +4840 +ENDCHAR +STARTCHAR U_733E +ENCODING 29502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +5640 +2540 +6FE0 +A820 +37C0 +6440 +A7C0 +2440 +A7C0 +4440 +ENDCHAR +STARTCHAR U_733F +ENCODING 29503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2100 +5FE0 +9000 +37C0 +5440 +97C0 +16A0 +5A40 +2320 +ENDCHAR +STARTCHAR U_7340 +ENCODING 29504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5760 +2520 +5760 +9520 +37E0 +5100 +97E0 +1240 +5180 +2660 +ENDCHAR +STARTCHAR U_7341 +ENCODING 29505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A500 +47C0 +A500 +27C0 +2500 +57E0 +9020 +1B60 +AAA0 +4040 +ENDCHAR +STARTCHAR U_7342 +ENCODING 29506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +4880 +ABE0 +2A20 +2BE0 +6A20 +ABE0 +2880 +2AC0 +34A0 +C9A0 +ENDCHAR +STARTCHAR U_7343 +ENCODING 29507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8C0 +A8A0 +F880 +07E0 +F880 +0080 +F880 +8940 +F940 +5240 +FC20 +ENDCHAR +STARTCHAR U_7344 +ENCODING 29508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +2EC0 +60A0 +AFE0 +2080 +2E80 +6080 +AE80 +2B40 +AE20 +4A20 +ENDCHAR +STARTCHAR U_7345 +ENCODING 29509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +3080 +7BE0 +AAA0 +3AA0 +22A0 +7AA0 +AAA0 +2AE0 +BA80 +4080 +ENDCHAR +STARTCHAR U_7346 +ENCODING 29510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFC0 +4A40 +A940 +2FC0 +6200 +BFE0 +2500 +3AC0 +AF80 +4200 +ENDCHAR +STARTCHAR U_7347 +ENCODING 29511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFC0 +4200 +AFC0 +2200 +7FE0 +A680 +2740 +2BC0 +AA20 +51E0 +ENDCHAR +STARTCHAR U_7348 +ENCODING 29512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A840 +4480 +4FC0 +A480 +2840 +7FC0 +A540 +2540 +2540 +BFE0 +4000 +ENDCHAR +STARTCHAR U_7349 +ENCODING 29513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +2100 +57C0 +9200 +3FE0 +57C0 +9920 +1FE0 +5540 +2920 +ENDCHAR +STARTCHAR U_734A +ENCODING 29514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8980 +5240 +2520 +5FC0 +9440 +37C0 +5440 +97E0 +1620 +5BE0 +2220 +ENDCHAR +STARTCHAR U_734B +ENCODING 29515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A7C0 +4440 +A7C0 +2440 +67C0 +A920 +2540 +2920 +BFE0 +4100 +ENDCHAR +STARTCHAR U_734C +ENCODING 29516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5440 +27C0 +6440 +AFE0 +2AA0 +6FE0 +A440 +2280 +A100 +4EE0 +ENDCHAR +STARTCHAR U_734D +ENCODING 29517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +27C0 +5280 +9FE0 +1440 +37C0 +5440 +97C0 +1280 +12A0 +6C60 +ENDCHAR +STARTCHAR U_734E +ENCODING 29518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +5540 +7A80 +1140 +FFE0 +5440 +92C0 +0500 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_734F +ENCODING 29519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +A480 +4FC0 +A840 +2FC0 +6840 +AFC0 +2200 +3FE0 +A480 +4860 +ENDCHAR +STARTCHAR U_7350 +ENCODING 29520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +27C0 +5280 +9FE0 +1440 +37C0 +5440 +97C0 +1100 +1FE0 +6100 +ENDCHAR +STARTCHAR U_7351 +ENCODING 29521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D2E0 +2F80 +6280 +AFE0 +2AA0 +2FA0 +6AA0 +AFA0 +22A0 +AFA0 +42A0 +ENDCHAR +STARTCHAR U_7352 +ENCODING 29522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +1220 +FD40 +2880 +4940 +9A20 +0480 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7353 +ENCODING 29523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +5E80 +24E0 +6F40 +A540 +3F40 +6940 +AE80 +2A80 +AB40 +5620 +ENDCHAR +STARTCHAR U_7354 +ENCODING 29524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9200 +6F80 +6880 +AF80 +2880 +2F80 +6A80 +A700 +2A80 +BFE0 +4200 +ENDCHAR +STARTCHAR U_7355 +ENCODING 29525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9100 +5940 +2FC0 +6500 +AFC0 +3900 +6FC0 +A900 +2FC0 +A900 +4FE0 +ENDCHAR +STARTCHAR U_7356 +ENCODING 29526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +BFC0 +4A80 +BFE0 +2A80 +6980 +AC80 +2A80 +2F80 +A500 +4880 +ENDCHAR +STARTCHAR U_7357 +ENCODING 29527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +5480 +DFE0 +5520 +5540 +5540 +DF40 +5540 +54A0 +5520 +AA20 +ENDCHAR +STARTCHAR U_7358 +ENCODING 29528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9500 +59E0 +FD40 +9740 +BC80 +D540 +96A0 +0440 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7359 +ENCODING 29529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA80 +5C80 +A8E0 +3FA0 +2AA0 +7AA0 +AEA0 +2AA0 +2A40 +AAA0 +4B20 +ENDCHAR +STARTCHAR U_735A +ENCODING 29530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9280 +57E0 +2280 +5FE0 +9100 +37C0 +5540 +97C0 +1540 +57C0 +2820 +ENDCHAR +STARTCHAR U_735B +ENCODING 29531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AA0 +56C0 +2FE0 +5280 +9FE0 +3100 +57C0 +9100 +1FE0 +5280 +2C60 +ENDCHAR +STARTCHAR U_735C +ENCODING 29532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +A540 +4FE0 +A380 +2D60 +6840 +ADE0 +3540 +2FE0 +A840 +5040 +ENDCHAR +STARTCHAR U_735D +ENCODING 29533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97C0 +6280 +7FE0 +A520 +2900 +2FE0 +6AA0 +AFE0 +2AA0 +ABA0 +4860 +ENDCHAR +STARTCHAR U_735E +ENCODING 29534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2280 +5100 +9FE0 +3540 +57C0 +9540 +1FE0 +5100 +2FE0 +ENDCHAR +STARTCHAR U_735F +ENCODING 29535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2100 +5FE0 +9440 +3EE0 +5440 +9FE0 +1280 +54A0 +2860 +ENDCHAR +STARTCHAR U_7360 +ENCODING 29536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5FE0 +2AA0 +5440 +9FE0 +3440 +57C0 +9440 +17C0 +5540 +2B20 +ENDCHAR +STARTCHAR U_7361 +ENCODING 29537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +95C0 +5840 +2DC0 +6840 +AFC0 +2400 +67E0 +A820 +3AA0 +AAA0 +4040 +ENDCHAR +STARTCHAR U_7362 +ENCODING 29538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8040 +6F80 +4200 +BFE0 +2440 +7BA0 +A280 +2FE0 +2AA0 +ABA0 +4860 +ENDCHAR +STARTCHAR U_7363 +ENCODING 29539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +28C0 +7CA0 +57E0 +7C80 +5480 +FF40 +0140 +7D40 +4620 +7C20 +ENDCHAR +STARTCHAR U_7364 +ENCODING 29540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +5F40 +20E0 +6FA0 +AAA0 +2FA0 +62A0 +A440 +3F40 +A4A0 +4D20 +ENDCHAR +STARTCHAR U_7365 +ENCODING 29541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +5E80 +2AE0 +6FA0 +AAA0 +2EA0 +64A0 +BFA0 +2A40 +AAA0 +5720 +ENDCHAR +STARTCHAR U_7366 +ENCODING 29542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5280 +2FC0 +6840 +AFC0 +2840 +6FE0 +A920 +3AA0 +AFA0 +4040 +ENDCHAR +STARTCHAR U_7367 +ENCODING 29543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +6AA0 +6FE0 +A000 +3FE0 +6840 +AFC0 +2520 +2CC0 +B640 +4420 +ENDCHAR +STARTCHAR U_7368 +ENCODING 29544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +6AA0 +6FE0 +A400 +2FE0 +3220 +6FA0 +AAA0 +2FA0 +A2A0 +4F40 +ENDCHAR +STARTCHAR U_7369 +ENCODING 29545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +94E0 +6480 +2FE0 +68A0 +AFE0 +2880 +6FA0 +AAA0 +2FC0 +A960 +5620 +ENDCHAR +STARTCHAR U_736A +ENCODING 29546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +27C0 +6820 +AFE0 +2AA0 +6FE0 +A440 +27C0 +A440 +47C0 +ENDCHAR +STARTCHAR U_736B +ENCODING 29547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5280 +2440 +6BA0 +A000 +2EE0 +6AA0 +AEE0 +2440 +AAA0 +5120 +ENDCHAR +STARTCHAR U_736C +ENCODING 29548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ADE0 +54A0 +DFA0 +5560 +5F40 +55E0 +DF40 +55E0 +5540 +5540 +A340 +ENDCHAR +STARTCHAR U_736D +ENCODING 29549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +3F40 +6BE0 +BE20 +2AA0 +7EA0 +AAA0 +2AA0 +3C80 +2B40 +CA20 +ENDCHAR +STARTCHAR U_736E +ENCODING 29550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BFE0 +4540 +A920 +2FE0 +2920 +6DA0 +AB60 +2DA0 +2B60 +ADA0 +4960 +ENDCHAR +STARTCHAR U_736F +ENCODING 29551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +5100 +3FE0 +6AA0 +AFE0 +2100 +6FC0 +A100 +3FE0 +A540 +4AA0 +ENDCHAR +STARTCHAR U_7370 +ENCODING 29552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +3520 +6CC0 +A7A0 +2000 +6FE0 +AAA0 +3FE0 +A100 +4300 +ENDCHAR +STARTCHAR U_7371 +ENCODING 29553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFE0 +4820 +AFE0 +2540 +27C0 +7C40 +A7C0 +2440 +A7C0 +4C60 +ENDCHAR +STARTCHAR U_7372 +ENCODING 29554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +5FE0 +2540 +6FE0 +B900 +2FC0 +6900 +AFE0 +2480 +A300 +5CE0 +ENDCHAR +STARTCHAR U_7373 +ENCODING 29555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +2FE0 +6920 +A540 +2920 +6FE0 +A100 +2FE0 +AAA0 +4AE0 +ENDCHAR +STARTCHAR U_7374 +ENCODING 29556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFC0 +4480 +AFE0 +3020 +6FC0 +A640 +2B80 +2580 +A340 +4D20 +ENDCHAR +STARTCHAR U_7375 +ENCODING 29557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8520 +5A40 +2520 +6FE0 +AAA0 +2FE0 +6DC0 +AB40 +2DC0 +AB40 +4D20 +ENDCHAR +STARTCHAR U_7376 +ENCODING 29558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5440 +27C0 +6440 +AFE0 +2AA0 +6540 +A7C0 +2C80 +B300 +4CE0 +ENDCHAR +STARTCHAR U_7377 +ENCODING 29559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +5FE0 +2940 +6FE0 +A940 +2FE0 +6AA0 +ABE0 +2AA0 +ABE0 +5620 +ENDCHAR +STARTCHAR U_7378 +ENCODING 29560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEC0 +AAA0 +FE80 +57E0 +7C80 +5480 +FE80 +0080 +7D40 +4620 +7C20 +ENDCHAR +STARTCHAR U_7379 +ENCODING 29561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +A200 +4FE0 +A9A0 +2F40 +69C0 +AAA0 +2AA0 +2BE0 +AAA0 +57E0 +ENDCHAR +STARTCHAR U_737A +ENCODING 29562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +3F40 +29E0 +7F20 +ABE0 +3F20 +69E0 +AD20 +3BE0 +A940 +4A20 +ENDCHAR +STARTCHAR U_737B +ENCODING 29563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +20C0 +FEA0 +A3E0 +FC80 +A880 +FC80 +AD40 +FD40 +9620 +9420 +ENDCHAR +STARTCHAR U_737C +ENCODING 29564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +29C0 +6AA0 +BBE0 +22A0 +7BE0 +AAA0 +2BE0 +2AA0 +ABE0 +52A0 +ENDCHAR +STARTCHAR U_737D +ENCODING 29565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +2AA0 +6EE0 +A280 +2FE0 +6280 +AFE0 +24A0 +AC40 +5620 +ENDCHAR +STARTCHAR U_737E +ENCODING 29566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +2480 +6EE0 +AAA0 +2EE0 +7FE0 +A900 +2FC0 +A900 +4FE0 +ENDCHAR +STARTCHAR U_737F +ENCODING 29567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +37E0 +7CA0 +B7E0 +3480 +6FE0 +AA40 +34A0 +EB00 +5CE0 +ENDCHAR +STARTCHAR U_7380 +ENCODING 29568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5AA0 +2FE0 +6540 +A5E0 +2B40 +65E0 +AB40 +2FE0 +EB40 +55E0 +ENDCHAR +STARTCHAR U_7381 +ENCODING 29569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2AA0 +6FE0 +AA80 +2FE0 +2920 +6F20 +A9A0 +2F40 +A9A0 +4F20 +ENDCHAR +STARTCHAR U_7382 +ENCODING 29570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +6480 +BFE0 +2B00 +3FE0 +5540 +9F40 +1540 +FF40 +4540 +ENDCHAR +STARTCHAR U_7383 +ENCODING 29571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +5AA0 +2EE0 +6AA0 +AFE0 +3900 +6FE0 +A900 +2FE0 +A300 +5CE0 +ENDCHAR +STARTCHAR U_7384 +ENCODING 29572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0400 +0880 +1100 +3E00 +0400 +0900 +1080 +7FC0 +ENDCHAR +STARTCHAR U_7385 +ENCODING 29573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FEC0 +22A0 +4CA0 +7480 +20A0 +4840 +F480 +0300 +0C00 +ENDCHAR +STARTCHAR U_7386 +ENCODING 29574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1080 +FFE0 +2100 +4A40 +FFC0 +1080 +2100 +4A40 +F7A0 +0420 +ENDCHAR +STARTCHAR U_7387 +ENCODING 29575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8840 +5280 +0C00 +2A80 +DF40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7388 +ENCODING 29576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +13E0 +FA00 +24E0 +2B80 +5280 +F2A0 +22C0 +4A80 +FB40 +0A20 +ENDCHAR +STARTCHAR U_7389 +ENCODING 29577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +3F80 +0400 +0500 +0480 +0480 +0400 +FFE0 +ENDCHAR +STARTCHAR U_738A +ENCODING 29578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0400 +0500 +0480 +0400 +3FC0 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_738B +ENCODING 29579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +0400 +3F80 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_738C +ENCODING 29580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7A00 +2200 +2200 +2200 +7A00 +2200 +2200 +3A20 +E220 +01E0 +ENDCHAR +STARTCHAR U_738D +ENCODING 29581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1000 +1FC0 +2200 +4200 +8200 +1FC0 +0200 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_738E +ENCODING 29582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +2080 +2080 +7080 +2080 +2080 +3880 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_738F +ENCODING 29583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +2100 +27E0 +7920 +2120 +2220 +3A20 +C420 +0940 +1080 +ENDCHAR +STARTCHAR U_7390 +ENCODING 29584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7500 +2500 +2500 +7480 +2480 +2480 +3840 +C840 +1060 +2040 +ENDCHAR +STARTCHAR U_7391 +ENCODING 29585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +2480 +2480 +7480 +2480 +2480 +3480 +C4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7392 +ENCODING 29586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2100 +2100 +7100 +2100 +2100 +3900 +C100 +0100 +07E0 +ENDCHAR +STARTCHAR U_7393 +ENCODING 29587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2220 +2420 +7120 +20A0 +20A0 +3820 +C020 +0120 +00C0 +ENDCHAR +STARTCHAR U_7394 +ENCODING 29588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FAA0 +22A0 +22A0 +72A0 +22A0 +22A0 +3AA0 +C2A0 +0420 +0820 +ENDCHAR +STARTCHAR U_7395 +ENCODING 29589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F880 +2080 +2080 +77E0 +2080 +2080 +3880 +C080 +0080 +0080 +ENDCHAR +STARTCHAR U_7396 +ENCODING 29590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23C0 +2240 +7440 +2080 +2080 +3980 +E240 +4420 +0820 +ENDCHAR +STARTCHAR U_7397 +ENCODING 29591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F880 +2080 +2080 +77E0 +2080 +2080 +3880 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_7398 +ENCODING 29592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +2040 +2040 +F7C0 +2440 +2400 +2400 +3420 +C420 +03E0 +ENDCHAR +STARTCHAR U_7399 +ENCODING 29593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2200 +2200 +FBE0 +2020 +2020 +37A0 +C020 +0140 +0080 +ENDCHAR +STARTCHAR U_739A +ENCODING 29594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F080 +4100 +4200 +F7E0 +42A0 +42A0 +74A0 +C920 +02A0 +0440 +ENDCHAR +STARTCHAR U_739B +ENCODING 29595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F840 +2240 +2240 +7240 +23E0 +2020 +37A0 +C020 +0120 +00C0 +ENDCHAR +STARTCHAR U_739C +ENCODING 29596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +4480 +4480 +E840 +5260 +4200 +4200 +7480 +CFC0 +0040 +ENDCHAR +STARTCHAR U_739D +ENCODING 29597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2480 +7080 +2080 +27E0 +3080 +C080 +0080 +0080 +ENDCHAR +STARTCHAR U_739E +ENCODING 29598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2100 +2100 +FFE0 +2100 +2280 +3280 +C440 +0820 +ENDCHAR +STARTCHAR U_739F +ENCODING 29599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2240 +7240 +2240 +2280 +3900 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_73A0 +ENCODING 29600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2820 +7240 +2240 +2240 +3A40 +C240 +0440 +0840 +ENDCHAR +STARTCHAR U_73A1 +ENCODING 29601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2240 +2240 +F7E0 +20C0 +2140 +3240 +C440 +0840 +00C0 +ENDCHAR +STARTCHAR U_73A2 +ENCODING 29602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2440 +2820 +77C0 +2240 +2240 +3A40 +C440 +0540 +0880 +ENDCHAR +STARTCHAR U_73A3 +ENCODING 29603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +4FE0 +4200 +F300 +4280 +4240 +7240 +C200 +0200 +0200 +ENDCHAR +STARTCHAR U_73A4 +ENCODING 29604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2100 +77C0 +2100 +2100 +3FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_73A5 +ENCODING 29605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA20 +2220 +23E0 +7220 +2220 +23E0 +3A20 +E220 +44A0 +1840 +ENDCHAR +STARTCHAR U_73A6 +ENCODING 29606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2140 +7140 +2FE0 +2100 +3900 +E280 +4440 +1820 +ENDCHAR +STARTCHAR U_73A7 +ENCODING 29607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +2480 +2FC0 +F540 +2500 +2500 +3520 +C520 +08E0 +1000 +ENDCHAR +STARTCHAR U_73A8 +ENCODING 29608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2100 +7100 +27C0 +2100 +3900 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_73A9 +ENCODING 29609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F800 +2000 +2000 +77E0 +2280 +2280 +3A80 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_73AA +ENCODING 29610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +4500 +4480 +EA60 +5100 +4FC0 +4080 +7100 +C100 +0200 +ENDCHAR +STARTCHAR U_73AB +ENCODING 29611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2240 +7440 +2A80 +2280 +3900 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_73AC +ENCODING 29612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2340 +22C0 +7240 +2FE0 +2240 +3A40 +E440 +4940 +1080 +ENDCHAR +STARTCHAR U_73AD +ENCODING 29613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FC80 +2480 +27A0 +74C0 +2480 +2480 +3C80 +C5A0 +06A0 +0460 +ENDCHAR +STARTCHAR U_73AE +ENCODING 29614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +27C0 +7100 +2FE0 +2120 +3920 +C160 +0100 +0100 +ENDCHAR +STARTCHAR U_73AF +ENCODING 29615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2300 +7380 +2540 +2520 +3920 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_73B0 +ENCODING 29616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +2540 +2540 +F540 +2540 +2540 +3280 +C2A0 +04A0 +18E0 +ENDCHAR +STARTCHAR U_73B1 +ENCODING 29617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0300 +F480 +4440 +4FA0 +F480 +4480 +4680 +7500 +C440 +03C0 +ENDCHAR +STARTCHAR U_73B2 +ENCODING 29618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2A20 +7100 +2000 +27E0 +3840 +C280 +0100 +0080 +ENDCHAR +STARTCHAR U_73B3 +ENCODING 29619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FAC0 +24A0 +24E0 +7F80 +2480 +2480 +3CA0 +E4A0 +0460 +0420 +ENDCHAR +STARTCHAR U_73B4 +ENCODING 29620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FD40 +2540 +2FE0 +7540 +2540 +25C0 +3D40 +E400 +0400 +07E0 +ENDCHAR +STARTCHAR U_73B5 +ENCODING 29621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +27E0 +2240 +7240 +23C0 +2240 +3A40 +E240 +43C0 +0240 +ENDCHAR +STARTCHAR U_73B6 +ENCODING 29622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2520 +2340 +7100 +2FE0 +2100 +3900 +E100 +4100 +0100 +ENDCHAR +STARTCHAR U_73B7 +ENCODING 29623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +21E0 +2100 +7100 +27E0 +2420 +3C20 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_73B8 +ENCODING 29624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2420 +2BA0 +72A0 +22A0 +23A0 +3A40 +E200 +4220 +01E0 +ENDCHAR +STARTCHAR U_73B9 +ENCODING 29625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +27E0 +2100 +7240 +2780 +2100 +3A00 +C440 +0FA0 +0420 +ENDCHAR +STARTCHAR U_73BA +ENCODING 29626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4440 +1500 +2480 +4440 +7FC0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_73BB +ENCODING 29627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +24A0 +2480 +77C0 +2640 +2540 +3540 +C480 +0940 +1620 +ENDCHAR +STARTCHAR U_73BC +ENCODING 29628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2280 +2BA0 +7AC0 +2A80 +2A80 +3A80 +EAA0 +5FA0 +08E0 +ENDCHAR +STARTCHAR U_73BD +ENCODING 29629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +2820 +27A0 +F4A0 +24A0 +24A0 +37A0 +C020 +0140 +0080 +ENDCHAR +STARTCHAR U_73BE +ENCODING 29630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FCA0 +24A0 +27E0 +74A0 +24A0 +27E0 +3CA0 +E080 +4080 +0080 +ENDCHAR +STARTCHAR U_73BF +ENCODING 29631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F920 +2120 +22E0 +7440 +2800 +23E0 +3A20 +E220 +43E0 +0220 +ENDCHAR +STARTCHAR U_73C0 +ENCODING 29632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F900 +23E0 +2220 +7220 +23E0 +2220 +3A20 +C220 +03E0 +0220 +ENDCHAR +STARTCHAR U_73C1 +ENCODING 29633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F400 +2780 +2480 +F480 +2680 +2580 +3480 +E4A0 +06A0 +0860 +ENDCHAR +STARTCHAR U_73C2 +ENCODING 29634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2040 +2740 +7540 +2540 +2740 +3540 +E040 +0140 +0080 +ENDCHAR +STARTCHAR U_73C3 +ENCODING 29635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2540 +2540 +77C0 +2540 +2FE0 +3440 +E440 +0440 +04C0 +ENDCHAR +STARTCHAR U_73C4 +ENCODING 29636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +4500 +47C0 +4500 +E900 +57C0 +4100 +7100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_73C5 +ENCODING 29637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +24A0 +77E0 +24A0 +27E0 +3880 +E080 +0080 +0080 +ENDCHAR +STARTCHAR U_73C6 +ENCODING 29638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2200 +2440 +FFE0 +2020 +27C0 +2440 +3C40 +C7C0 +0440 +ENDCHAR +STARTCHAR U_73C7 +ENCODING 29639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +2440 +27C0 +7440 +2440 +2440 +3FC0 +C440 +0440 +1FE0 +ENDCHAR +STARTCHAR U_73C8 +ENCODING 29640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +E8E0 +5EA0 +4AA0 +FAA0 +4AA0 +4AA0 +6AA0 +D2A0 +2AE0 +44A0 +ENDCHAR +STARTCHAR U_73C9 +ENCODING 29641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2420 +27E0 +7480 +27E0 +2480 +3C80 +E5A0 +4660 +0420 +ENDCHAR +STARTCHAR U_73CA +ENCODING 29642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2AA0 +2AA0 +FFE0 +2AA0 +2AA0 +3AA0 +EAA0 +0AA0 +1560 +ENDCHAR +STARTCHAR U_73CB +ENCODING 29643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +F8E0 +2AA0 +2AA0 +FAA0 +2AA0 +2EA0 +3AE0 +E280 +0480 +0880 +ENDCHAR +STARTCHAR U_73CC +ENCODING 29644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +2040 +2240 +FA80 +2AC0 +2AA0 +2320 +3240 +C640 +19C0 +ENDCHAR +STARTCHAR U_73CD +ENCODING 29645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +2440 +28A0 +F100 +2240 +2480 +2120 +3640 +C080 +0700 +ENDCHAR +STARTCHAR U_73CE +ENCODING 29646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +27E0 +2920 +2100 +F900 +2540 +2520 +3920 +C100 +0300 +ENDCHAR +STARTCHAR U_73CF +ENCODING 29647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F900 +2100 +2100 +7100 +27C0 +2100 +3940 +E120 +4100 +0FE0 +ENDCHAR +STARTCHAR U_73D0 +ENCODING 29648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2100 +7100 +27E0 +2200 +3A80 +E440 +4FE0 +0020 +ENDCHAR +STARTCHAR U_73D1 +ENCODING 29649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F440 +2400 +2FE0 +F500 +2540 +2580 +3900 +CB20 +1520 +21E0 +ENDCHAR +STARTCHAR U_73D2 +ENCODING 29650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2140 +2FE0 +7140 +27C0 +2100 +37C0 +E100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_73D3 +ENCODING 29651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +27E0 +2440 +7820 +2440 +2280 +3900 +E280 +4440 +0820 +ENDCHAR +STARTCHAR U_73D4 +ENCODING 29652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2200 +25E0 +7440 +2C80 +27E0 +3C80 +E480 +4480 +0580 +ENDCHAR +STARTCHAR U_73D5 +ENCODING 29653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4240 +4540 +E880 +5FE0 +4AA0 +6AA0 +D320 +12A0 +2440 +ENDCHAR +STARTCHAR U_73D6 +ENCODING 29654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F520 +2340 +2100 +77E0 +2280 +2280 +3A80 +E4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_73D7 +ENCODING 29655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FD00 +27C0 +2900 +7100 +2FE0 +2280 +3A80 +E2A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_73D8 +ENCODING 29656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +2540 +F4C0 +2FE0 +2540 +34C0 +C440 +0840 +10C0 +ENDCHAR +STARTCHAR U_73D9 +ENCODING 29657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2280 +27C0 +7280 +2280 +27E0 +3800 +E280 +0240 +0440 +ENDCHAR +STARTCHAR U_73DA +ENCODING 29658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD20 +2520 +27E0 +7520 +2520 +25A0 +3E60 +E420 +07E0 +0420 +ENDCHAR +STARTCHAR U_73DB +ENCODING 29659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2200 +77E0 +2A20 +23E0 +3A20 +E3E0 +0220 +0260 +ENDCHAR +STARTCHAR U_73DC +ENCODING 29660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +2FE0 +2100 +7100 +27C0 +2100 +3FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_73DD +ENCODING 29661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F120 +29A0 +2560 +7120 +2360 +25A0 +3920 +E120 +45A0 +0240 +ENDCHAR +STARTCHAR U_73DE +ENCODING 29662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2640 +2980 +7240 +2420 +2FC0 +3440 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_73DF +ENCODING 29663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +4FC0 +4A40 +EBC0 +4CC0 +4B40 +6940 +9240 +2460 +4020 +ENDCHAR +STARTCHAR U_73E0 +ENCODING 29664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F500 +27C0 +2900 +F100 +2FE0 +2100 +3380 +C540 +0920 +0100 +ENDCHAR +STARTCHAR U_73E1 +ENCODING 29665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +7BC0 +2080 +2080 +FBE0 +0400 +0A00 +1100 +20E0 +4040 +ENDCHAR +STARTCHAR U_73E2 +ENCODING 29666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +F7C0 +2620 +2540 +3480 +C440 +0660 +0400 +ENDCHAR +STARTCHAR U_73E3 +ENCODING 29667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2820 +27A0 +74A0 +27A0 +24A0 +3FA0 +E4A0 +4020 +00C0 +ENDCHAR +STARTCHAR U_73E4 +ENCODING 29668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2500 +2900 +F900 +2FE0 +2100 +2520 +3520 +C520 +07E0 +ENDCHAR +STARTCHAR U_73E5 +ENCODING 29669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F240 +2240 +23C0 +F240 +23C0 +2240 +2240 +37E0 +C040 +0040 +ENDCHAR +STARTCHAR U_73E6 +ENCODING 29670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +4FE0 +4820 +FBA0 +4AA0 +4AA0 +7BA0 +C820 +08A0 +0840 +ENDCHAR +STARTCHAR U_73E7 +ENCODING 29671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FAA0 +2AA0 +26C0 +7280 +26C0 +2AA0 +3A80 +E2A0 +44A0 +0860 +ENDCHAR +STARTCHAR U_73E8 +ENCODING 29672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2820 +7380 +2000 +27C0 +3C40 +E440 +47C0 +0440 +ENDCHAR +STARTCHAR U_73E9 +ENCODING 29673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F5E0 +2800 +2200 +F5E0 +2C40 +2440 +2440 +3440 +C440 +04C0 +ENDCHAR +STARTCHAR U_73EA +ENCODING 29674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +2100 +7FE0 +2100 +2100 +37C0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_73EB +ENCODING 29675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2240 +77E0 +22A0 +2280 +3A80 +E4A0 +48A0 +1060 +ENDCHAR +STARTCHAR U_73EC +ENCODING 29676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F140 +4FE0 +4900 +E940 +4F40 +4940 +6880 +D140 +1660 +2020 +ENDCHAR +STARTCHAR U_73ED +ENCODING 29677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2280 +2A80 +FA80 +2BE0 +2A80 +2480 +3480 +C880 +13E0 +ENDCHAR +STARTCHAR U_73EE +ENCODING 29678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F840 +4FC0 +4A40 +EFC0 +4AC0 +4AC0 +6AC0 +CAC0 +1220 +2220 +ENDCHAR +STARTCHAR U_73EF +ENCODING 29679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F220 +4FA0 +4240 +FFE0 +4100 +4640 +6C80 +D700 +2420 +03E0 +ENDCHAR +STARTCHAR U_73F0 +ENCODING 29680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +2340 +2100 +27E0 +F020 +2020 +27E0 +3820 +C020 +07E0 +ENDCHAR +STARTCHAR U_73F1 +ENCODING 29681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F920 +2440 +2080 +F900 +2FE0 +2240 +3640 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_73F2 +ENCODING 29682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +2100 +27E0 +7280 +27E0 +2080 +37E0 +C080 +0080 +0080 +ENDCHAR +STARTCHAR U_73F3 +ENCODING 29683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +F420 +5F40 +4AA0 +EA40 +4AA0 +4440 +7680 +C900 +10E0 +6040 +ENDCHAR +STARTCHAR U_73F4 +ENCODING 29684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +FEC0 +22A0 +2FE0 +7280 +23A0 +26A0 +3AC0 +C260 +0AA0 +0520 +ENDCHAR +STARTCHAR U_73F5 +ENCODING 29685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2240 +23C0 +7000 +27E0 +2100 +37C0 +C100 +0100 +0FE0 +ENDCHAR +STARTCHAR U_73F6 +ENCODING 29686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2120 +77E0 +2500 +27E0 +3B20 +C520 +0960 +1100 +ENDCHAR +STARTCHAR U_73F7 +ENCODING 29687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +EEC0 +40A0 +5FE0 +E280 +4280 +4B80 +4A80 +6AA0 +CB60 +1C20 +ENDCHAR +STARTCHAR U_73F8 +ENCODING 29688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27C0 +2240 +7240 +27E0 +2000 +3BC0 +E240 +43C0 +0240 +ENDCHAR +STARTCHAR U_73F9 +ENCODING 29689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F140 +4FE0 +4900 +FF20 +4AA0 +4AC0 +4A80 +6AA0 +DB60 +2420 +ENDCHAR +STARTCHAR U_73FA +ENCODING 29690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F940 +2FE0 +2140 +77C0 +2200 +23E0 +3620 +CA20 +03E0 +0220 +ENDCHAR +STARTCHAR U_73FB +ENCODING 29691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +EFC0 +5000 +47C0 +F540 +5FE0 +4A40 +6A40 +CFE0 +0140 +0080 +ENDCHAR +STARTCHAR U_73FC +ENCODING 29692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +27E0 +2420 +7420 +27E0 +2420 +3FE0 +E240 +4420 +0820 +ENDCHAR +STARTCHAR U_73FD +ENCODING 29693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E20 +FBC0 +2240 +2440 +77E0 +2240 +2240 +3BE0 +C600 +0900 +10E0 +ENDCHAR +STARTCHAR U_73FE +ENCODING 29694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +27C0 +2440 +77C0 +2440 +27C0 +3A80 +C2A0 +04A0 +1860 +ENDCHAR +STARTCHAR U_73FF +ENCODING 29695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2420 +27E0 +7100 +2100 +25C0 +3D00 +C500 +0B00 +11E0 +ENDCHAR +STARTCHAR U_7400 +ENCODING 29696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F300 +4480 +4A60 +5780 +E100 +4200 +5FC0 +6840 +8FC0 +0840 +ENDCHAR +STARTCHAR U_7401 +ENCODING 29697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2400 +27E0 +70A0 +2280 +22E0 +3A80 +C280 +0580 +08E0 +ENDCHAR +STARTCHAR U_7402 +ENCODING 29698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +4FE0 +4000 +47C0 +F000 +47C0 +4000 +77C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_7403 +ENCODING 29699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +2FE0 +2100 +2520 +F340 +2180 +2340 +3520 +C920 +0300 +ENDCHAR +STARTCHAR U_7404 +ENCODING 29700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +23C0 +2000 +77E0 +2420 +27E0 +3C20 +C7E0 +0420 +04E0 +ENDCHAR +STARTCHAR U_7405 +ENCODING 29701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +27C0 +2440 +77C0 +2440 +27E0 +3D40 +C480 +0540 +0620 +ENDCHAR +STARTCHAR U_7406 +ENCODING 29702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2FE0 +2920 +2920 +FFE0 +2100 +27C0 +3100 +C100 +0FE0 +ENDCHAR +STARTCHAR U_7407 +ENCODING 29703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +2FE0 +2380 +7D60 +2000 +27C0 +3A40 +C2E0 +0420 +18C0 +ENDCHAR +STARTCHAR U_7408 +ENCODING 29704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +F7A0 +2520 +22C0 +77E0 +2040 +2080 +37E0 +C080 +0280 +0100 +ENDCHAR +STARTCHAR U_7409 +ENCODING 29705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4200 +4480 +4FC0 +E000 +4A80 +4A80 +6AA0 +CAA0 +12E0 +ENDCHAR +STARTCHAR U_740A +ENCODING 29706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E2A0 +4AA0 +4AA0 +FFC0 +42A0 +46A0 +6AA0 +D2E0 +2A80 +0480 +ENDCHAR +STARTCHAR U_740B +ENCODING 29707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F980 +2240 +2100 +F7E0 +2280 +27E0 +3AA0 +C2A0 +02E0 +0080 +ENDCHAR +STARTCHAR U_740C +ENCODING 29708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FD20 +27E0 +2100 +F280 +2640 +2920 +37C0 +C040 +0080 +0100 +ENDCHAR +STARTCHAR U_740D +ENCODING 29709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FC20 +24A0 +3FA0 +64A0 +26A0 +2DA0 +34A0 +E420 +04A0 +0440 +ENDCHAR +STARTCHAR U_740E +ENCODING 29710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +E240 +57E0 +4A40 +E240 +5FE0 +4A40 +4A40 +6A40 +CC40 +17E0 +ENDCHAR +STARTCHAR U_740F +ENCODING 29711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +2680 +2280 +7FE0 +2480 +27E0 +3C80 +C480 +0A00 +11E0 +ENDCHAR +STARTCHAR U_7410 +ENCODING 29712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04A0 +FAC0 +2080 +27E0 +7420 +24A0 +24A0 +3CA0 +C5A0 +0240 +0C20 +ENDCHAR +STARTCHAR U_7411 +ENCODING 29713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2100 +27C0 +F440 +27C0 +2440 +37C0 +C440 +0440 +04C0 +ENDCHAR +STARTCHAR U_7412 +ENCODING 29714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2C40 +2380 +E540 +2BA0 +2100 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_7413 +ENCODING 29715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +27C0 +F000 +2FE0 +2280 +3280 +C4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7414 +ENCODING 29716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +4820 +47C0 +4100 +E500 +45C0 +7500 +CD00 +0B00 +10E0 +ENDCHAR +STARTCHAR U_7415 +ENCODING 29717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFC0 +4A40 +4FC0 +EA40 +4FC0 +4500 +7FE0 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_7416 +ENCODING 29718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FC80 +27E0 +2280 +7320 +2CE0 +2480 +3FE0 +E280 +4320 +0CE0 +ENDCHAR +STARTCHAR U_7417 +ENCODING 29719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4480 +4480 +E480 +4B40 +4200 +7FE0 +8200 +0200 +0200 +ENDCHAR +STARTCHAR U_7418 +ENCODING 29720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +4A00 +4FC0 +EAA0 +4C60 +47C0 +6440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_7419 +ENCODING 29721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +E140 +5FE0 +4100 +5D20 +F520 +5D40 +4080 +6DA0 +9260 +0420 +ENDCHAR +STARTCHAR U_741A +ENCODING 29722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +2420 +27E0 +7480 +27E0 +2480 +37E0 +CA20 +13E0 +2220 +ENDCHAR +STARTCHAR U_741B +ENCODING 29723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2AA0 +2440 +F100 +2FE0 +2100 +3380 +E540 +0920 +1120 +ENDCHAR +STARTCHAR U_741C +ENCODING 29724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2540 +F540 +2BA0 +2100 +3380 +C540 +0920 +0100 +ENDCHAR +STARTCHAR U_741D +ENCODING 29725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +F7C0 +2100 +2FE0 +3480 +E300 +0480 +1860 +ENDCHAR +STARTCHAR U_741E +ENCODING 29726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7CC0 +0000 +7FE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_741F +ENCODING 29727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F480 +27E0 +2C80 +3480 +E7C0 +2480 +27C0 +3480 +C7E0 +0400 +ENDCHAR +STARTCHAR U_7420 +ENCODING 29728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +2FE0 +2AA0 +FAA0 +2FE0 +2AA0 +2AA0 +FFE0 +0480 +1860 +ENDCHAR +STARTCHAR U_7421 +ENCODING 29729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +F6A0 +44A0 +44A0 +5FA0 +E4A0 +4EA0 +55A0 +7440 +C4A0 +0D20 +ENDCHAR +STARTCHAR U_7422 +ENCODING 29730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +2220 +2640 +FB80 +2480 +2BC0 +32C0 +C4A0 +0CA0 +1320 +ENDCHAR +STARTCHAR U_7423 +ENCODING 29731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +2280 +77E0 +2000 +27E0 +3420 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_7424 +ENCODING 29732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +2480 +2FE0 +F120 +2FE0 +2120 +37E0 +C100 +0100 +0300 +ENDCHAR +STARTCHAR U_7425 +ENCODING 29733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +F100 +4FE0 +4920 +4F80 +E920 +49E0 +4800 +6B80 +D2A0 +2CE0 +ENDCHAR +STARTCHAR U_7426 +ENCODING 29734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +2280 +7FE0 +2040 +2740 +3540 +C740 +0040 +00C0 +ENDCHAR +STARTCHAR U_7427 +ENCODING 29735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_7428 +ENCODING 29736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +27E0 +2420 +77E0 +2480 +24A0 +3EC0 +E480 +46A0 +0CE0 +ENDCHAR +STARTCHAR U_7429 +ENCODING 29737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +23C0 +2240 +73C0 +2000 +27E0 +3420 +C7E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_742A +ENCODING 29738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2440 +27C0 +F440 +27C0 +2440 +3FE0 +C000 +0440 +0820 +ENDCHAR +STARTCHAR U_742B +ENCODING 29739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +F200 +2FE0 +2940 +37A0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_742C +ENCODING 29740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2400 +27E0 +F5A0 +2DA0 +32E0 +E480 +08A0 +1060 +ENDCHAR +STARTCHAR U_742D +ENCODING 29741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +27C0 +2040 +F7E0 +2920 +2540 +3380 +C540 +0920 +0300 +ENDCHAR +STARTCHAR U_742E +ENCODING 29742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2420 +23C0 +7000 +27E0 +2080 +3AC0 +C4A0 +0AA0 +0100 +ENDCHAR +STARTCHAR U_742F +ENCODING 29743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +27C0 +7440 +27C0 +2400 +37E0 +C420 +07E0 +0420 +ENDCHAR +STARTCHAR U_7430 +ENCODING 29744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD40 +2580 +2980 +7240 +2D20 +2140 +3D80 +E500 +4280 +1C60 +ENDCHAR +STARTCHAR U_7431 +ENCODING 29745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2BA0 +2920 +FFE0 +2820 +2BA0 +3AA0 +CBA0 +1020 +2060 +ENDCHAR +STARTCHAR U_7432 +ENCODING 29746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2EE0 +2280 +7280 +2EE0 +2280 +3280 +CEE0 +0280 +0280 +ENDCHAR +STARTCHAR U_7433 +ENCODING 29747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F480 +2FE0 +2480 +F480 +2EC0 +35A0 +26A0 +3480 +C480 +0480 +ENDCHAR +STARTCHAR U_7434 +ENCODING 29748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +0400 +1B00 +E4E0 +1F00 +0200 +0400 +ENDCHAR +STARTCHAR U_7435 +ENCODING 29749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +4200 +4240 +7B80 +4220 +5A20 +61E0 +ENDCHAR +STARTCHAR U_7436 +ENCODING 29750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +0000 +7F80 +4480 +7F80 +4020 +3FE0 +ENDCHAR +STARTCHAR U_7437 +ENCODING 29751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4200 +4FC0 +F200 +5FE0 +4500 +7500 +C520 +0920 +10E0 +ENDCHAR +STARTCHAR U_7438 +ENCODING 29752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F200 +4FC0 +4840 +EFC0 +4840 +4FC0 +7200 +9FE0 +0200 +0200 +ENDCHAR +STARTCHAR U_7439 +ENCODING 29753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1100 +7BC0 +1100 +FBE0 +0400 +7FC0 +0D00 +1480 +E460 +0400 +ENDCHAR +STARTCHAR U_743A +ENCODING 29754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F480 +23E0 +2880 +2480 +F3E0 +2480 +2480 +3920 +CBE0 +0920 +ENDCHAR +STARTCHAR U_743B +ENCODING 29755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E300 +4480 +5840 +EFA0 +4200 +4FC0 +4200 +6A40 +C680 +1FE0 +ENDCHAR +STARTCHAR U_743C +ENCODING 29756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2000 +27C0 +2440 +F440 +27C0 +2100 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_743D +ENCODING 29757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFA0 +4240 +5FE0 +E100 +47C0 +5C40 +47C0 +7440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_743E +ENCODING 29758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +EA40 +4FC0 +4A40 +EFC0 +4500 +4880 +74E0 +C480 +0480 +0880 +ENDCHAR +STARTCHAR U_743F +ENCODING 29759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +2FE0 +2100 +F7C0 +2540 +27C0 +3540 +CFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_7440 +ENCODING 29760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF00 +2100 +27C0 +7540 +27C0 +2100 +3FE0 +C960 +0FA0 +0860 +ENDCHAR +STARTCHAR U_7441 +ENCODING 29761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +25A0 +2420 +75A0 +2000 +27E0 +3C20 +C7E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_7442 +ENCODING 29762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD20 +27E0 +2400 +75E0 +2520 +25E0 +3D20 +C5E0 +0920 +11E0 +ENDCHAR +STARTCHAR U_7443 +ENCODING 29763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +4200 +5FC0 +E200 +5FE0 +4880 +58C0 +EFA0 +0880 +0F80 +ENDCHAR +STARTCHAR U_7444 +ENCODING 29764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +2FE0 +2820 +27C0 +F000 +27C0 +2440 +37C0 +C440 +0FE0 +ENDCHAR +STARTCHAR U_7445 +ENCODING 29765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F480 +4780 +4480 +F780 +5FE0 +4A00 +6B80 +CE00 +1300 +20E0 +ENDCHAR +STARTCHAR U_7446 +ENCODING 29766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC20 +27E0 +2420 +77E0 +2480 +27E0 +3880 +C3E0 +0080 +0FE0 +ENDCHAR +STARTCHAR U_7447 +ENCODING 29767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4100 +4FE0 +F7C0 +4540 +5FE0 +6A80 +CFE0 +0280 +0100 +ENDCHAR +STARTCHAR U_7448 +ENCODING 29768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F280 +4100 +4FE0 +F540 +4A00 +4100 +6FE0 +C380 +0540 +1920 +ENDCHAR +STARTCHAR U_7449 +ENCODING 29769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +4FC0 +4900 +EFE0 +4880 +4FE0 +6840 +CFC0 +0840 +0FC0 +ENDCHAR +STARTCHAR U_744A +ENCODING 29770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F0A0 +2FE0 +2880 +7E80 +28A0 +2EA0 +3AC0 +EEA0 +1160 +2220 +ENDCHAR +STARTCHAR U_744B +ENCODING 29771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2140 +27E0 +7240 +23C0 +2080 +37E0 +C280 +07E0 +0080 +ENDCHAR +STARTCHAR U_744C +ENCODING 29772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E200 +4FE0 +4AA0 +EAA0 +4AE0 +4100 +7FE0 +C280 +0440 +1820 +ENDCHAR +STARTCHAR U_744D +ENCODING 29773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F780 +2900 +27C0 +7540 +26C0 +2540 +3FE0 +E100 +4280 +0C60 +ENDCHAR +STARTCHAR U_744E +ENCODING 29774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F4A0 +27C0 +24A0 +76E0 +2100 +27E0 +3420 +C7E0 +0420 +07E0 +ENDCHAR +STARTCHAR U_744F +ENCODING 29775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +2440 +77E0 +2480 +2FE0 +3980 +C280 +0480 +0980 +ENDCHAR +STARTCHAR U_7450 +ENCODING 29776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2000 +7E20 +2AA0 +2EA0 +3AA0 +CEA0 +0A20 +0AE0 +ENDCHAR +STARTCHAR U_7451 +ENCODING 29777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2780 +2080 +77E0 +2340 +2580 +3A80 +C5C0 +02A0 +0DA0 +ENDCHAR +STARTCHAR U_7452 +ENCODING 29778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +27C0 +2440 +7FE0 +2200 +27E0 +3AA0 +C4A0 +0920 +0260 +ENDCHAR +STARTCHAR U_7453 +ENCODING 29779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +4200 +5FC0 +FAC0 +5740 +5FC0 +6700 +CA80 +3260 +0200 +ENDCHAR +STARTCHAR U_7454 +ENCODING 29780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2440 +27C0 +7440 +27C0 +2120 +3F40 +C580 +0940 +1320 +ENDCHAR +STARTCHAR U_7455 +ENCODING 29781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FA20 +2A20 +2EE0 +7800 +2EE0 +28A0 +3EA0 +C840 +08A0 +0B20 +ENDCHAR +STARTCHAR U_7456 +ENCODING 29782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EDC0 +4940 +4D60 +EA00 +4DE0 +4940 +6DC0 +D880 +0940 +0A60 +ENDCHAR +STARTCHAR U_7457 +ENCODING 29783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FA20 +2540 +27E0 +7200 +2FE0 +2200 +3BC0 +C640 +0980 +1660 +ENDCHAR +STARTCHAR U_7458 +ENCODING 29784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +EAE0 +4AA0 +4EA0 +EAC0 +4EA0 +4BA0 +6EE0 +DA80 +0280 +0280 +ENDCHAR +STARTCHAR U_7459 +ENCODING 29785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +2540 +22A0 +7100 +2FE0 +2AA0 +3920 +CAA0 +0FE0 +0820 +ENDCHAR +STARTCHAR U_745A +ENCODING 29786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +F4A0 +2FA0 +24E0 +74A0 +2EA0 +2AE0 +3AA0 +CEA0 +0120 +0260 +ENDCHAR +STARTCHAR U_745B +ENCODING 29787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2100 +77C0 +2540 +2540 +3FE0 +C280 +0440 +0820 +ENDCHAR +STARTCHAR U_745C +ENCODING 29788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +0480 +EB60 +4000 +4E20 +EAA0 +4EA0 +4AA0 +6EA0 +CA20 +0AE0 +ENDCHAR +STARTCHAR U_745D +ENCODING 29789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +4640 +4540 +F7C0 +4000 +47C0 +7100 +C7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_745E +ENCODING 29790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F920 +2FE0 +2000 +7FE0 +2200 +2FE0 +3AA0 +CAA0 +0AA0 +0860 +ENDCHAR +STARTCHAR U_745F +ENCODING 29791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +71C0 +2080 +FBE0 +0880 +5500 +5240 +94A0 +18A0 +EF80 +ENDCHAR +STARTCHAR U_7460 +ENCODING 29792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0300 +F4E0 +44A0 +45A0 +F6A0 +4140 +47E0 +5520 +67E0 +C520 +07E0 +ENDCHAR +STARTCHAR U_7461 +ENCODING 29793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +5480 +57E0 +FEA0 +52A0 +5EA0 +76A0 +D6E0 +1C80 +0080 +ENDCHAR +STARTCHAR U_7462 +ENCODING 29794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +2540 +7280 +2440 +2820 +3FC0 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_7463 +ENCODING 29795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +27E0 +2420 +F7E0 +2420 +27E0 +3C20 +C7E0 +0240 +0420 +ENDCHAR +STARTCHAR U_7464 +ENCODING 29796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +2440 +2A80 +7500 +27E0 +2900 +37E0 +C100 +0520 +07E0 +ENDCHAR +STARTCHAR U_7465 +ENCODING 29797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +F880 +4F80 +4880 +EF80 +4000 +5FC0 +5540 +7540 +D540 +3FE0 +ENDCHAR +STARTCHAR U_7466 +ENCODING 29798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EF80 +4880 +4F80 +EFE0 +4800 +4FC0 +6040 +DAC0 +1540 +0080 +ENDCHAR +STARTCHAR U_7467 +ENCODING 29799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FC0 +F200 +2FE0 +25C0 +3920 +EFE0 +4540 +0920 +ENDCHAR +STARTCHAR U_7468 +ENCODING 29800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +46C0 +4280 +EFE0 +4000 +57C0 +6440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_7469 +ENCODING 29801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +3180 +4A40 +FFE0 +8020 +7FC0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_746A +ENCODING 29802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD00 +27C0 +2500 +77C0 +2500 +27E0 +38A0 +C560 +0AA0 +12C0 +ENDCHAR +STARTCHAR U_746B +ENCODING 29803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +4920 +4540 +E400 +4300 +4CE0 +5820 +6EE0 +C820 +0FE0 +ENDCHAR +STARTCHAR U_746C +ENCODING 29804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +1FC0 +C880 +1FC0 +CAA0 +5260 +7FC0 +0400 +7FC0 +0500 +FFE0 +ENDCHAR +STARTCHAR U_746D +ENCODING 29805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2940 +2FE0 +F940 +2FC0 +2900 +3BE0 +CA20 +13E0 +2220 +ENDCHAR +STARTCHAR U_746E +ENCODING 29806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2FE0 +2AA0 +FFE0 +2100 +2FE0 +3380 +C540 +0920 +1120 +ENDCHAR +STARTCHAR U_746F +ENCODING 29807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FEA0 +2AA0 +2EA0 +FAC0 +2EA0 +28A0 +3CA0 +EAE0 +0D80 +0880 +ENDCHAR +STARTCHAR U_7470 +ENCODING 29808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2540 +27C0 +7540 +27C0 +2140 +3BA0 +C5E0 +0920 +10E0 +ENDCHAR +STARTCHAR U_7471 +ENCODING 29809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +27C0 +7440 +2740 +25C0 +3440 +CFE0 +0280 +1C60 +ENDCHAR +STARTCHAR U_7472 +ENCODING 29810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2540 +2FE0 +7440 +27C0 +2440 +3FE0 +E620 +4BE0 +1220 +ENDCHAR +STARTCHAR U_7473 +ENCODING 29811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +27E0 +2100 +77C0 +2100 +2FE0 +3200 +C7C0 +0880 +17E0 +ENDCHAR +STARTCHAR U_7474 +ENCODING 29812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FD40 +2140 +FE20 +8400 +FBE0 +2240 +7940 +2080 +3940 +C620 +ENDCHAR +STARTCHAR U_7475 +ENCODING 29813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F540 +2AC0 +2580 +7660 +2100 +27C0 +3540 +C7C0 +0140 +0FA0 +ENDCHAR +STARTCHAR U_7476 +ENCODING 29814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF20 +2A20 +2540 +7480 +27E0 +2900 +3FE0 +C100 +0920 +0FE0 +ENDCHAR +STARTCHAR U_7477 +ENCODING 29815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F720 +2540 +2FE0 +7920 +2FE0 +2200 +33C0 +C640 +0980 +1660 +ENDCHAR +STARTCHAR U_7478 +ENCODING 29816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4820 +4B80 +F400 +47C0 +4480 +7FE0 +C480 +0840 +1020 +ENDCHAR +STARTCHAR U_7479 +ENCODING 29817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +2280 +2380 +7440 +2BA0 +2100 +37E0 +C100 +0540 +0B20 +ENDCHAR +STARTCHAR U_747A +ENCODING 29818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +EA80 +5FE0 +54A0 +E780 +4200 +4FC0 +6A40 +CB40 +0A80 +0200 +ENDCHAR +STARTCHAR U_747B +ENCODING 29819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +4FE0 +4540 +F7C0 +4440 +47C0 +7440 +C7C0 +0440 +0820 +ENDCHAR +STARTCHAR U_747C +ENCODING 29820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +27C0 +7540 +27C0 +2120 +3FE0 +E440 +4240 +00C0 +ENDCHAR +STARTCHAR U_747D +ENCODING 29821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0340 +F540 +2940 +26A0 +7440 +2D40 +2560 +3540 +C540 +06C0 +0460 +ENDCHAR +STARTCHAR U_747E +ENCODING 29822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2100 +77C0 +2540 +2FE0 +3100 +C7C0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_747F +ENCODING 29823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A460 +FBC0 +9240 +FD80 +AA40 +FFC0 +0400 +3F80 +0480 +FFE0 +ENDCHAR +STARTCHAR U_7480 +ENCODING 29824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FD20 +27E0 +2500 +77E0 +2C80 +27E0 +3C80 +C7E0 +0480 +07E0 +ENDCHAR +STARTCHAR U_7481 +ENCODING 29825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7E0 +2520 +25E0 +76A0 +2560 +26A0 +37E0 +C540 +0CA0 +13E0 +ENDCHAR +STARTCHAR U_7482 +ENCODING 29826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFC0 +4480 +4780 +E480 +5FE0 +4680 +6A40 +57A0 +A200 +0FC0 +ENDCHAR +STARTCHAR U_7483 +ENCODING 29827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2280 +2920 +7AA0 +2FE0 +2100 +3FE0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_7484 +ENCODING 29828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4480 +5FE0 +E840 +4FC0 +4840 +4FC0 +6500 +8520 +18E0 +ENDCHAR +STARTCHAR U_7485 +ENCODING 29829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FA80 +2540 +27C0 +7540 +27C0 +2540 +3FE0 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_7486 +ENCODING 29830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2660 +2AA0 +7320 +2480 +2A60 +3500 +C240 +0080 +0F00 +ENDCHAR +STARTCHAR U_7487 +ENCODING 29831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +E900 +5DE0 +4A00 +FDE0 +5440 +5540 +7560 +D540 +1540 +2AE0 +ENDCHAR +STARTCHAR U_7488 +ENCODING 29832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +24E0 +2FA0 +74A0 +2FA0 +24A0 +3EA0 +CA40 +0AA0 +3520 +ENDCHAR +STARTCHAR U_7489 +ENCODING 29833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2AA0 +23E0 +7AA0 +2BE0 +2880 +3BE0 +C880 +1480 +23E0 +ENDCHAR +STARTCHAR U_748A +ENCODING 29834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2480 +2780 +7100 +2FE0 +2920 +3DA0 +CB60 +0DA0 +0960 +ENDCHAR +STARTCHAR U_748B +ENCODING 29835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2FE0 +7440 +27C0 +2440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_748C +ENCODING 29836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4BA0 +5100 +47C0 +E540 +47C0 +5540 +67C0 +C280 +0440 +ENDCHAR +STARTCHAR U_748D +ENCODING 29837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2FE0 +2540 +FFE0 +2540 +2FE0 +3100 +DFE0 +0100 +ENDCHAR +STARTCHAR U_748E +ENCODING 29838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +2AA0 +2AA0 +7AA0 +2540 +2AA0 +3FE0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_748F +ENCODING 29839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F380 +4280 +5FE0 +F480 +57A0 +5AC0 +7780 +D280 +15A0 +1860 +ENDCHAR +STARTCHAR U_7490 +ENCODING 29840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +FAE0 +4BA0 +4E40 +F4A0 +4720 +55E0 +5520 +7720 +DDE0 +0120 +ENDCHAR +STARTCHAR U_7491 +ENCODING 29841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +4D40 +5540 +FFE0 +5540 +5540 +7FE0 +D540 +12A0 +22A0 +ENDCHAR +STARTCHAR U_7492 +ENCODING 29842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +FBA0 +26C0 +2440 +7BA0 +2000 +27C0 +3C40 +C7C0 +0280 +1FE0 +ENDCHAR +STARTCHAR U_7493 +ENCODING 29843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +4280 +4FE0 +E540 +5920 +4FC0 +6240 +C220 +04A0 +1840 +ENDCHAR +STARTCHAR U_7494 +ENCODING 29844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2AA0 +2920 +7FE0 +2000 +27C0 +3440 +E7C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_7495 +ENCODING 29845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F040 +27C0 +2040 +7FE0 +24A0 +2EE0 +3080 +EFE0 +4480 +0380 +ENDCHAR +STARTCHAR U_7496 +ENCODING 29846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +F680 +2BE0 +2620 +FBE0 +2A80 +2FE0 +3100 +C380 +0540 +0920 +ENDCHAR +STARTCHAR U_7497 +ENCODING 29847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A840 +5FC0 +2840 +CFE0 +5520 +7FC0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_7498 +ENCODING 29848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2FE0 +2540 +7920 +2540 +2FE0 +3B40 +C7E0 +0440 +1840 +ENDCHAR +STARTCHAR U_7499 +ENCODING 29849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +27C0 +2C60 +F7C0 +2440 +27C0 +3100 +C940 +1320 +ENDCHAR +STARTCHAR U_749A +ENCODING 29850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F280 +2FE0 +2540 +7900 +2FE0 +2AA0 +3FE0 +CAA0 +0BA0 +0860 +ENDCHAR +STARTCHAR U_749B +ENCODING 29851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4240 +5FE0 +F740 +5AC0 +7240 +5FC0 +9AC0 +2740 +2240 +ENDCHAR +STARTCHAR U_749C +ENCODING 29852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7C0 +2280 +2FE0 +7100 +27C0 +2540 +37C0 +C540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_749D +ENCODING 29853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +4540 +5FE0 +E440 +47C0 +4440 +77C0 +C440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_749E +ENCODING 29854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F6C0 +2FE0 +2280 +7FE0 +2100 +27C0 +3100 +CFE0 +0280 +0C60 +ENDCHAR +STARTCHAR U_749F +ENCODING 29855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +7FE0 +2000 +27C0 +3440 +C7C0 +0540 +1B20 +ENDCHAR +STARTCHAR U_74A0 +ENCODING 29856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +FF20 +2540 +2FE0 +7580 +2940 +27E0 +3540 +C7C0 +0540 +07C0 +ENDCHAR +STARTCHAR U_74A1 +ENCODING 29857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +27E0 +2280 +7BC0 +2A80 +2BC0 +3A80 +CBE0 +0E00 +13E0 +ENDCHAR +STARTCHAR U_74A2 +ENCODING 29858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E280 +4EE0 +4AA0 +EEE0 +4280 +4FE0 +5920 +6FE0 +C920 +0FE0 +ENDCHAR +STARTCHAR U_74A3 +ENCODING 29859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +F2A0 +5FC0 +4AA0 +FFE0 +4540 +5FE0 +6540 +CAA0 +1160 +2620 +ENDCHAR +STARTCHAR U_74A4 +ENCODING 29860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +4A40 +4FC0 +EA40 +4FC0 +4280 +5FE0 +6540 +D460 +13C0 +ENDCHAR +STARTCHAR U_74A5 +ENCODING 29861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +FF80 +52E0 +48A0 +5F20 +F120 +5D20 +55A0 +5D40 +E1A0 +06A0 +ENDCHAR +STARTCHAR U_74A6 +ENCODING 29862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F720 +2540 +2FE0 +7AA0 +27C0 +2A20 +37E0 +CA40 +0180 +1E60 +ENDCHAR +STARTCHAR U_74A7 +ENCODING 29863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7D40 +4480 +7FE0 +8080 +7FC0 +0400 +3F80 +0500 +FFE0 +ENDCHAR +STARTCHAR U_74A8 +ENCODING 29864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2AA0 +2F40 +75A0 +2320 +2D40 +3580 +CFE0 +0540 +0920 +ENDCHAR +STARTCHAR U_74A9 +ENCODING 29865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F200 +2FE0 +2A20 +7FC0 +2A20 +2FE0 +3AA0 +CDC0 +12A0 +2520 +ENDCHAR +STARTCHAR U_74AA +ENCODING 29866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2000 +7EE0 +2AA0 +2EE0 +3100 +EFE0 +4540 +0920 +ENDCHAR +STARTCHAR U_74AB +ENCODING 29867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2FE0 +2820 +77C0 +2440 +2FE0 +3920 +CFE0 +0920 +0FE0 +ENDCHAR +STARTCHAR U_74AC +ENCODING 29868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EE80 +4A80 +4FE0 +EB40 +4F40 +4480 +6E80 +C540 +0A40 +1620 +ENDCHAR +STARTCHAR U_74AD +ENCODING 29869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +0920 +EFE0 +5540 +47C0 +FD40 +4FC0 +4900 +6FE0 +C900 +17E0 +ENDCHAR +STARTCHAR U_74AE +ENCODING 29870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4AA0 +4AA0 +EBA0 +4820 +4FE0 +4440 +67C0 +8440 +1FE0 +ENDCHAR +STARTCHAR U_74AF +ENCODING 29871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +F440 +2BA0 +2000 +7FE0 +2AA0 +2FE0 +3440 +E7C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_74B0 +ENCODING 29872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FE0 +2000 +7FE0 +2440 +27C0 +3280 +ECA0 +4540 +0620 +ENDCHAR +STARTCHAR U_74B1 +ENCODING 29873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +F440 +2EE0 +2440 +7EE0 +2100 +22C0 +3640 +EAA0 +4340 +1DC0 +ENDCHAR +STARTCHAR U_74B2 +ENCODING 29874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F140 +2FE0 +2920 +72C0 +2980 +2EC0 +39A0 +EEA0 +4900 +17E0 +ENDCHAR +STARTCHAR U_74B3 +ENCODING 29875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0A00 +EFC0 +5700 +5AC0 +EF80 +4A80 +4D80 +6A80 +CF80 +0880 +1040 +ENDCHAR +STARTCHAR U_74B4 +ENCODING 29876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +4EC0 +5560 +F440 +4FE0 +4120 +65C0 +8500 +0B00 +10E0 +ENDCHAR +STARTCHAR U_74B5 +ENCODING 29877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E60 +FBA0 +2A20 +2FE0 +78A0 +2EE0 +2AA0 +3FE0 +E480 +4840 +1020 +ENDCHAR +STARTCHAR U_74B6 +ENCODING 29878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F140 +2FE0 +2140 +7FE0 +2100 +2FE0 +3540 +CFE0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_74B7 +ENCODING 29879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FF80 +2AE0 +2FA0 +7AA0 +2FA0 +2AA0 +3FA0 +CA40 +0AA0 +1520 +ENDCHAR +STARTCHAR U_74B8 +ENCODING 29880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2420 +23C0 +7580 +23C0 +2E40 +33C0 +C240 +03C0 +0660 +ENDCHAR +STARTCHAR U_74B9 +ENCODING 29881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +4200 +5FE0 +F220 +4FC0 +4000 +7FE0 +9540 +1D40 +00C0 +ENDCHAR +STARTCHAR U_74BA +ENCODING 29882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +5140 +7FC0 +5540 +FFE0 +8020 +BFA0 +0400 +3F80 +0480 +FFE0 +ENDCHAR +STARTCHAR U_74BB +ENCODING 29883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F5A0 +2360 +25A0 +7100 +2FE0 +2440 +3AA0 +EFE0 +4100 +0100 +ENDCHAR +STARTCHAR U_74BC +ENCODING 29884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E80 +F480 +5EE0 +5280 +FF40 +5420 +5E00 +4000 +6FE0 +CAA0 +3FE0 +ENDCHAR +STARTCHAR U_74BD +ENCODING 29885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4440 +FFE0 +56C0 +6D40 +56C0 +FFE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_74BE +ENCODING 29886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4AA0 +5540 +F540 +4520 +4FC0 +6840 +CFC0 +0840 +1040 +ENDCHAR +STARTCHAR U_74BF +ENCODING 29887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +F100 +2FE0 +2AA0 +7540 +2AA0 +2FE0 +3440 +E7C0 +4440 +07C0 +ENDCHAR +STARTCHAR U_74C0 +ENCODING 29888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +2FE0 +2920 +7280 +2FE0 +2100 +3FE0 +EAA0 +4AA0 +0860 +ENDCHAR +STARTCHAR U_74C1 +ENCODING 29889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2540 +27E0 +7D00 +27C0 +2500 +3FE0 +C240 +0180 +0E60 +ENDCHAR +STARTCHAR U_74C2 +ENCODING 29890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2540 +27C0 +7100 +2FE0 +2440 +3FE0 +CAA0 +0AA0 +1FE0 +ENDCHAR +STARTCHAR U_74C3 +ENCODING 29891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F540 +27C0 +2540 +77C0 +2000 +2FE0 +3AA0 +EFE0 +4AA0 +0FE0 +ENDCHAR +STARTCHAR U_74C4 +ENCODING 29892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4100 +4FE0 +FAA0 +4FE0 +4540 +76C0 +C540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_74C5 +ENCODING 29893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FBC0 +36A0 +2BE0 +76A0 +2FE0 +2100 +3FE0 +E580 +4940 +1120 +ENDCHAR +STARTCHAR U_74C6 +ENCODING 29894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06C0 +F900 +5FE0 +5540 +E640 +4FC0 +4840 +6FC0 +8840 +0FC0 +1860 +ENDCHAR +STARTCHAR U_74C7 +ENCODING 29895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F440 +47C0 +4440 +FFE0 +5540 +4BA0 +6200 +C7C0 +0980 +0660 +ENDCHAR +STARTCHAR U_74C8 +ENCODING 29896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +E5E0 +5EA0 +4EA0 +F520 +4560 +4280 +6D60 +8380 +0D60 +0300 +ENDCHAR +STARTCHAR U_74C9 +ENCODING 29897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EEE0 +4440 +4FE0 +EAA0 +57C0 +4540 +76C0 +8540 +07C0 +0C60 +ENDCHAR +STARTCHAR U_74CA +ENCODING 29898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FFE0 +2AA0 +2FE0 +7440 +27C0 +2440 +37C0 +C480 +0300 +1CE0 +ENDCHAR +STARTCHAR U_74CB +ENCODING 29899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4280 +4FE0 +F920 +4FE0 +4920 +6BA0 +CAA0 +1AA0 +27E0 +ENDCHAR +STARTCHAR U_74CC +ENCODING 29900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +4000 +4FE0 +EAA0 +4FE0 +4540 +6B20 +86C0 +1A40 +0320 +ENDCHAR +STARTCHAR U_74CD +ENCODING 29901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +5500 +5BE0 +F480 +57E0 +5940 +75C0 +9540 +1740 +19E0 +ENDCHAR +STARTCHAR U_74CE +ENCODING 29902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FEE0 +4540 +5FE0 +F520 +5FE0 +4520 +6FE0 +9520 +25E0 +0720 +ENDCHAR +STARTCHAR U_74CF +ENCODING 29903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04E0 +FE80 +2AE0 +2420 +7EE0 +2A80 +2EE0 +3A80 +CEE0 +0AA0 +0AE0 +ENDCHAR +STARTCHAR U_74D0 +ENCODING 29904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +E200 +5FE0 +52A0 +5F00 +F240 +57C0 +5540 +6FE0 +AAA0 +5FE0 +ENDCHAR +STARTCHAR U_74D1 +ENCODING 29905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +56C0 +5240 +5FE0 +F6C0 +5B60 +5080 +7480 +D4E0 +2480 +4FE0 +ENDCHAR +STARTCHAR U_74D2 +ENCODING 29906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +1FE0 +E440 +5FE0 +4A40 +F2A0 +47C0 +4540 +7540 +C280 +0C60 +ENDCHAR +STARTCHAR U_74D3 +ENCODING 29907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +F2A0 +5EE0 +52A0 +FFE0 +5120 +57E0 +7560 +97E0 +13A0 +1560 +ENDCHAR +STARTCHAR U_74D4 +ENCODING 29908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2EE0 +2AA0 +7EE0 +2440 +2AA0 +3FE0 +E480 +4300 +1CE0 +ENDCHAR +STARTCHAR U_74D5 +ENCODING 29909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2540 +EFE0 +8B60 +EDA0 +2B60 +FFE0 +0400 +7FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_74D6 +ENCODING 29910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2AA0 +2EE0 +7280 +2FE0 +2280 +3FE0 +E4A0 +4D40 +1620 +ENDCHAR +STARTCHAR U_74D7 +ENCODING 29911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FFE0 +2500 +2FC0 +7900 +2FE0 +2AA0 +3FE0 +EAA0 +4BA0 +0860 +ENDCHAR +STARTCHAR U_74D8 +ENCODING 29912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2EE0 +7AA0 +2EE0 +27E0 +3C80 +E7E0 +4480 +07E0 +ENDCHAR +STARTCHAR U_74D9 +ENCODING 29913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +27E0 +2120 +7FE0 +2040 +2FE0 +3B40 +EEC0 +4540 +0AA0 +ENDCHAR +STARTCHAR U_74DA +ENCODING 29914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +F540 +2FE0 +2540 +7A60 +27C0 +2440 +37C0 +C440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_74DB +ENCODING 29915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0740 +E460 +5F40 +54E0 +FF40 +5540 +5740 +5A40 +FFA0 +2DA0 +4AA0 +ENDCHAR +STARTCHAR U_74DC +ENCODING 29916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +3F00 +2500 +2500 +2500 +2480 +2480 +2440 +4540 +47A0 +8CA0 +ENDCHAR +STARTCHAR U_74DD +ENCODING 29917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F9E0 +AA20 +AC20 +A920 +A8A0 +A8A0 +A420 +AAC0 +B900 +C8E0 +ENDCHAR +STARTCHAR U_74DE +ENCODING 29918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FA80 +ABE0 +AC80 +AFE0 +A880 +A940 +A620 +AA20 +BD80 +A460 +ENDCHAR +STARTCHAR U_74DF +ENCODING 29919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +EBE0 +AC20 +ABA0 +AAA0 +ABA0 +AA40 +AA20 +A5E0 +BA00 +A9E0 +ENDCHAR +STARTCHAR U_74E0 +ENCODING 29920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +5540 +8D40 +7540 +0540 +FD40 +4540 +F520 +1560 +69A0 +ENDCHAR +STARTCHAR U_74E1 +ENCODING 29921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +2540 +FD40 +5540 +2540 +FD20 +2520 +FD20 +25E0 +2920 +ENDCHAR +STARTCHAR U_74E2 +ENCODING 29922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE60 +2BA0 +FEA0 +AAA0 +FEA0 +02A0 +7AA0 +02A0 +FEA0 +5AE0 +B4A0 +ENDCHAR +STARTCHAR U_74E3 +ENCODING 29923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FDE0 +B5A0 +5540 +F5E0 +5540 +5540 +F5E0 +5540 +5740 +A140 +ENDCHAR +STARTCHAR U_74E4 +ENCODING 29924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFA0 +AAA0 +FAA0 +52A0 +FEA0 +52A0 +FEA0 +36A0 +6AA0 +A4E0 +ENDCHAR +STARTCHAR U_74E5 +ENCODING 29925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +E920 +AB40 +ADC0 +AAA0 +2480 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_74E6 +ENCODING 29926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1000 +1000 +1F00 +1100 +2900 +2500 +2520 +2120 +F920 +40E0 +ENDCHAR +STARTCHAR U_74E7 +ENCODING 29927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4100 +7900 +4FC0 +4900 +6900 +5900 +4900 +4920 +4820 +67E0 +ENDCHAR +STARTCHAR U_74E8 +ENCODING 29928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F200 +2200 +2780 +2480 +2680 +3580 +C480 +0580 +0EA0 +04E0 +ENDCHAR +STARTCHAR U_74E9 +ENCODING 29929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC60 +4380 +4080 +7C80 +47E0 +6480 +5480 +4480 +44A0 +7420 +C3E0 +ENDCHAR +STARTCHAR U_74EA +ENCODING 29930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FF80 +4200 +7BC0 +4A40 +4B40 +6A80 +4C80 +4960 +6A20 +47E0 +ENDCHAR +STARTCHAR U_74EB +ENCODING 29931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2180 +DF60 +0900 +1200 +7FE0 +1000 +1F00 +1900 +2520 +30E0 +ENDCHAR +STARTCHAR U_74EC +ENCODING 29932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2400 +FC00 +4780 +7480 +5680 +5580 +5480 +54A0 +96A0 +ACE0 +ENDCHAR +STARTCHAR U_74ED +ENCODING 29933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FA00 +AB80 +2280 +2280 +3580 +5480 +5C80 +56A0 +8460 +ENDCHAR +STARTCHAR U_74EE +ENCODING 29934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2480 +C960 +1E80 +0000 +FFE0 +2000 +3F00 +4920 +4520 +79E0 +ENDCHAR +STARTCHAR U_74EF +ENCODING 29935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8100 +A900 +ABC0 +9240 +9340 +AAC0 +AA40 +8AC0 +8740 +FA60 +ENDCHAR +STARTCHAR U_74F0 +ENCODING 29936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +4280 +7C40 +4BE0 +6940 +5940 +4A40 +4D40 +68A0 +4FE0 +ENDCHAR +STARTCHAR U_74F1 +ENCODING 29937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +4600 +7200 +5FC0 +5200 +5FC0 +B200 +9240 +91C0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_74F2 +ENCODING 29938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +4F80 +7200 +5A80 +5F80 +B200 +9240 +91C0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_74F3 +ENCODING 29939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2200 +FB80 +2280 +2280 +7580 +5480 +5480 +76A0 +0460 +ENDCHAR +STARTCHAR U_74F4 +ENCODING 29940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5200 +8A00 +23C0 +1440 +FE40 +0D40 +5440 +2540 +1660 +1460 +ENDCHAR +STARTCHAR U_74F5 +ENCODING 29941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +8A00 +FA00 +0380 +F480 +9680 +9580 +94A0 +F6A0 +9460 +ENDCHAR +STARTCHAR U_74F6 +ENCODING 29942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5100 +FD00 +51C0 +5240 +FF40 +52C0 +5240 +5240 +5360 +9660 +ENDCHAR +STARTCHAR U_74F7 +ENCODING 29943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +47E0 +2940 +C280 +4440 +FFE0 +1000 +1F00 +2920 +2520 +70E0 +ENDCHAR +STARTCHAR U_74F8 +ENCODING 29944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4100 +7BC0 +4A40 +4A40 +6BC0 +5A40 +8A40 +8BC0 +A820 +C7E0 +ENDCHAR +STARTCHAR U_74F9 +ENCODING 29945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9200 +F380 +0280 +F480 +9680 +F580 +9480 +F4A0 +96A0 +B460 +ENDCHAR +STARTCHAR U_74FA +ENCODING 29946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4200 +7B80 +4280 +7A80 +4280 +FD80 +2480 +54A0 +FEA0 +0460 +ENDCHAR +STARTCHAR U_74FB +ENCODING 29947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DBE0 +2100 +D900 +23C0 +FE40 +A240 +FB40 +AAC0 +AA40 +BA40 +2360 +ENDCHAR +STARTCHAR U_74FC +ENCODING 29948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4540 +77C0 +5540 +57C0 +7100 +57C0 +9100 +97C0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_74FD +ENCODING 29949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +FFE0 +90A0 +1F80 +0000 +FFE0 +1000 +1F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_74FE +ENCODING 29950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +F100 +2100 +FBC0 +7240 +AB40 +22C0 +FE40 +2A40 +33C0 +CA60 +ENDCHAR +STARTCHAR U_74FF +ENCODING 29951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +8900 +51C0 +FA40 +0340 +7AC0 +4A40 +4A40 +7B40 +4E60 +ENDCHAR +STARTCHAR U_7500 +ENCODING 29952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +1100 +FF00 +55C0 +FF40 +5540 +55C0 +FD40 +1240 +1B60 +E260 +ENDCHAR +STARTCHAR U_7501 +ENCODING 29953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +57E0 +F900 +5100 +53C0 +DE40 +5340 +52C0 +5480 +56A0 +9460 +ENDCHAR +STARTCHAR U_7502 +ENCODING 29954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +1100 +FD00 +83C0 +FE40 +8340 +FEC0 +AA40 +FE40 +AA40 +8760 +ENDCHAR +STARTCHAR U_7503 +ENCODING 29955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD20 +2540 +F980 +7240 +AC20 +FFE0 +1000 +3F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_7504 +ENCODING 29956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2880 +FE80 +AAE0 +AAA0 +FF20 +11A0 +7D60 +1120 +1DA0 +E120 +ENDCHAR +STARTCHAR U_7505 +ENCODING 29957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4400 +77C0 +9540 +97C0 +D500 +B7C0 +9500 +9BC0 +D020 +8FE0 +ENDCHAR +STARTCHAR U_7506 +ENCODING 29958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5280 +2940 +FBE0 +0000 +FFE0 +2000 +3F00 +4920 +74E0 +ENDCHAR +STARTCHAR U_7507 +ENCODING 29959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +B2C0 +A480 +5140 +8A20 +FFE0 +9020 +9F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_7508 +ENCODING 29960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7900 +4900 +7BC0 +4A40 +7B40 +12C0 +FE40 +3240 +5B40 +9660 +ENDCHAR +STARTCHAR U_7509 +ENCODING 29961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +5100 +FDC0 +5540 +FF40 +55C0 +FD40 +5940 +D540 +51A0 +ENDCHAR +STARTCHAR U_750A +ENCODING 29962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +5500 +FFC0 +5540 +7D40 +5540 +FEC0 +2A40 +3B60 +C660 +ENDCHAR +STARTCHAR U_750B +ENCODING 29963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FD00 +4500 +29C0 +FE40 +9340 +FEC0 +9240 +BA40 +AB40 +BA60 +ENDCHAR +STARTCHAR U_750C +ENCODING 29964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8100 +BD00 +A5C0 +BD40 +8140 +FDC0 +9540 +FD40 +81C0 +FF60 +ENDCHAR +STARTCHAR U_750D +ENCODING 29965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2940 +FFE0 +9020 +1F00 +2920 +2520 +71E0 +ENDCHAR +STARTCHAR U_750E +ENCODING 29966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +5500 +7DC0 +5540 +7D40 +15C0 +FF40 +4940 +69C0 +1160 +ENDCHAR +STARTCHAR U_750F +ENCODING 29967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEC0 +1100 +7C60 +4580 +7C60 +2980 +FFE0 +2000 +3F80 +24A0 +72E0 +ENDCHAR +STARTCHAR U_7510 +ENCODING 29968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +5480 +FE80 +55C0 +9340 +2540 +7FC0 +9540 +7F40 +45C0 +8560 +ENDCHAR +STARTCHAR U_7511 +ENCODING 29969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2900 +FD00 +ABC0 +9240 +FF40 +4AC0 +7A40 +4A40 +7B40 +4A60 +ENDCHAR +STARTCHAR U_7512 +ENCODING 29970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7E80 +D480 +55E0 +FF20 +55A0 +5560 +FF20 +5520 +ABA0 +AB20 +ENDCHAR +STARTCHAR U_7513 +ENCODING 29971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +4080 +BFE0 +2480 +FFE0 +1000 +3F00 +2920 +35E0 +ENDCHAR +STARTCHAR U_7514 +ENCODING 29972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +4480 +FE80 +6BE0 +7F20 +41A0 +5D60 +4120 +7D20 +A5A0 +BD20 +ENDCHAR +STARTCHAR U_7515 +ENCODING 29973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5480 +2FE0 +7480 +17E0 +2480 +FFE0 +2000 +3F20 +4920 +E5E0 +ENDCHAR +STARTCHAR U_7516 +ENCODING 29974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +2A80 +FFE0 +2000 +3F80 +4920 +E5E0 +ENDCHAR +STARTCHAR U_7517 +ENCODING 29975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2100 +FD00 +A3C0 +FE40 +AB40 +AAC0 +FE40 +D640 +FF40 +A660 +ENDCHAR +STARTCHAR U_7518 +ENCODING 29976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +2100 +FFC0 +2100 +2100 +2100 +3F00 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_7519 +ENCODING 29977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +0120 +FFE0 +0100 +4500 +FF00 +4500 +7CA0 +44A0 +7C60 +4420 +ENDCHAR +STARTCHAR U_751A +ENCODING 29978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +1100 +1F00 +1100 +FFE0 +2900 +3080 +3FC0 +ENDCHAR +STARTCHAR U_751B +ENCODING 29979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48C0 +4F00 +4900 +F900 +4FE0 +4900 +7BC0 +4A40 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_751C +ENCODING 29980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A40 +E240 +2240 +27E0 +FA40 +2240 +FBC0 +8A40 +8A40 +FBC0 +8A40 +ENDCHAR +STARTCHAR U_751D +ENCODING 29981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A40 +2240 +FFE0 +A240 +F240 +ABC0 +BA40 +83C0 +BA40 +A820 +CFE0 +ENDCHAR +STARTCHAR U_751E +ENCODING 29982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FE0 +9120 +1F00 +1100 +FFE0 +1100 +1F00 +1100 +1F00 +ENDCHAR +STARTCHAR U_751F +ENCODING 29983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +2200 +2200 +3FE0 +4200 +8200 +1FC0 +0200 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_7520 +ENCODING 29984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E100 +A900 +AFE0 +B100 +E100 +A7C0 +A100 +A100 +E100 +1FE0 +ENDCHAR +STARTCHAR U_7521 +ENCODING 29985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5280 +5280 +7FE0 +9480 +1080 +7BE0 +1080 +1C80 +F080 +47E0 +ENDCHAR +STARTCHAR U_7522 +ENCODING 29986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +0900 +7FE0 +5200 +5FC0 +6200 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7523 +ENCODING 29987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +1080 +0900 +7FC0 +4A00 +5FC0 +6200 +4FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_7524 +ENCODING 29988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7A80 +2280 +6BE0 +AC80 +53E0 +B880 +57E0 +9200 +51E0 +2040 +ENDCHAR +STARTCHAR U_7525 +ENCODING 29989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +54A0 +7FE0 +94A0 +97E0 +7900 +17E0 +1120 +1A20 +E420 +08C0 +ENDCHAR +STARTCHAR U_7526 +ENCODING 29990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2280 +FA80 +ABE0 +FC80 +ABE0 +F880 +A080 +67E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7527 +ENCODING 29991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7BC0 +9500 +7BC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_7528 +ENCODING 29992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4440 +4440 +7FC0 +4440 +4440 +7FC0 +4440 +4440 +8440 +84C0 +ENDCHAR +STARTCHAR U_7529 +ENCODING 29993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2440 +2440 +3FC0 +2440 +3FC0 +2440 +2440 +25C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_752A +ENCODING 29994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0800 +3FE0 +2220 +3FE0 +2220 +3FE0 +2220 +2220 +4220 +80E0 +ENDCHAR +STARTCHAR U_752B +ENCODING 29995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +0480 +FFE0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +44C0 +ENDCHAR +STARTCHAR U_752C +ENCODING 29996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +1100 +0A00 +7F80 +4880 +7F80 +4880 +7F80 +4880 +4A80 +4100 +ENDCHAR +STARTCHAR U_752D +ENCODING 29997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0800 +3580 +C440 +7F80 +4480 +7F80 +4480 +7F80 +4480 +8580 +ENDCHAR +STARTCHAR U_752E +ENCODING 29998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +7F80 +9480 +2900 +7F80 +4880 +7F80 +4880 +7F80 +4880 +4980 +ENDCHAR +STARTCHAR U_752F +ENCODING 29999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +94A0 +5140 +9F20 +3F80 +2480 +3F80 +2480 +3F80 +2480 +ENDCHAR +STARTCHAR U_7530 +ENCODING 30000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8880 +8880 +8880 +FF80 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_7531 +ENCODING 30001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +8880 +FF80 +8880 +8880 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_7532 +ENCODING 30002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8880 +8880 +FF80 +8880 +8880 +FF80 +8880 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_7533 +ENCODING 30003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +FF80 +8880 +8880 +FF80 +8880 +0800 +0800 +ENDCHAR +STARTCHAR U_7534 +ENCODING 30004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +8880 +8880 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_7535 +ENCODING 30005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +FF80 +8880 +8880 +FF80 +0840 +0840 +07C0 +ENDCHAR +STARTCHAR U_7536 +ENCODING 30006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +10 +20 +FF +91 +91 +91 +FF +91 +91 +FF +81 +ENDCHAR +STARTCHAR U_7537 +ENCODING 30007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +0800 +FFC0 +0840 +1040 +2240 +C180 +ENDCHAR +STARTCHAR U_7538 +ENCODING 30008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FE0 +2020 +7FA0 +A4A0 +3FA0 +24A0 +3FA0 +20A0 +0020 +01C0 +ENDCHAR +STARTCHAR U_7539 +ENCODING 30009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +7F80 +4480 +7F80 +4480 +FFC0 +2000 +7F80 +0080 +0880 +0700 +ENDCHAR +STARTCHAR U_753A +ENCODING 30010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +A880 +A880 +F880 +A880 +A880 +A880 +F880 +0080 +0380 +ENDCHAR +STARTCHAR U_753B +ENCODING 30011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +3F80 +A4A0 +A4A0 +BFA0 +A4A0 +A4A0 +BFA0 +8020 +FFE0 +ENDCHAR +STARTCHAR U_753C +ENCODING 30012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +FFE0 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_753D +ENCODING 30013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FAA0 +AAA0 +AAA0 +FAA0 +AAA0 +AAA0 +FAA0 +8AA0 +04A0 +0820 +ENDCHAR +STARTCHAR U_753E +ENCODING 30014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2480 +4900 +9200 +4900 +2480 +FF80 +8880 +FF80 +8880 +FF80 +8080 +ENDCHAR +STARTCHAR U_753F +ENCODING 30015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +AFE0 +AA00 +FA00 +AA00 +AA00 +FA00 +8A00 +03E0 +0200 +ENDCHAR +STARTCHAR U_7540 +ENCODING 30016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +0000 +FFC0 +2200 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_7541 +ENCODING 30017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +0000 +FFE0 +1100 +1100 +6100 +ENDCHAR +STARTCHAR U_7542 +ENCODING 30018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +A9C0 +AA40 +FC40 +A840 +A880 +F980 +0240 +0420 +1820 +ENDCHAR +STARTCHAR U_7543 +ENCODING 30019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AA20 +FC20 +A9A0 +F8A0 +2020 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_7544 +ENCODING 30020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +8C60 +6480 +2100 +7FC0 +4440 +4440 +7FC0 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7545 +ENCODING 30021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F880 +A900 +AA00 +FFE0 +AAA0 +AAA0 +FCA0 +A920 +2220 +24C0 +ENDCHAR +STARTCHAR U_7546 +ENCODING 30022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1080 +FE80 +0080 +F880 +A900 +F900 +AA40 +AA40 +FFE0 +8820 +ENDCHAR +STARTCHAR U_7547 +ENCODING 30023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +AA20 +AD20 +F8A0 +A820 +A8A0 +AB20 +F820 +8820 +00C0 +ENDCHAR +STARTCHAR U_7548 +ENCODING 30024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FB80 +AA00 +AA00 +FBE0 +AAA0 +AAA0 +FAA0 +8A40 +04A0 +0920 +ENDCHAR +STARTCHAR U_7549 +ENCODING 30025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AFC0 +A900 +F900 +AFE0 +A900 +FA80 +0480 +0840 +1020 +ENDCHAR +STARTCHAR U_754A +ENCODING 30026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +AFE0 +AA40 +FA40 +AFE0 +AA40 +FA40 +0240 +0440 +0840 +ENDCHAR +STARTCHAR U_754B +ENCODING 30027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +A9E0 +AB40 +FD40 +A940 +A940 +F940 +8880 +0340 +0C20 +ENDCHAR +STARTCHAR U_754C +ENCODING 30028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0A00 +3180 +D160 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_754D +ENCODING 30029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AA80 +AC60 +FA80 +AA80 +AA80 +FA80 +0280 +0480 +0880 +ENDCHAR +STARTCHAR U_754E +ENCODING 30030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +A900 +AFE0 +F900 +A900 +A900 +F900 +8A80 +0440 +0820 +ENDCHAR +STARTCHAR U_754F +ENCODING 30031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +0000 +FFE0 +2440 +2280 +2900 +30E0 +ENDCHAR +STARTCHAR U_7550 +ENCODING 30032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0000 +7F00 +4100 +7F00 +0000 +FF80 +8880 +FF80 +8880 +FF80 +ENDCHAR +STARTCHAR U_7551 +ENCODING 30033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +24A0 +6CA0 +74A0 +A7E0 +24A0 +34A0 +4CA0 +47E0 +8000 +ENDCHAR +STARTCHAR U_7552 +ENCODING 30034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FD00 +0100 +F900 +AA80 +FA80 +AA80 +FA40 +0460 +0840 +ENDCHAR +STARTCHAR U_7553 +ENCODING 30035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7500 +1600 +2580 +D460 +0800 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_7554 +ENCODING 30036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FCA0 +AAC0 +A880 +FBE0 +A880 +AFE0 +F880 +8880 +0080 +0080 +ENDCHAR +STARTCHAR U_7555 +ENCODING 30037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4900 +7F00 +4900 +7F00 +0000 +FF80 +8880 +FF80 +8880 +FF80 +ENDCHAR +STARTCHAR U_7556 +ENCODING 30038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +AE80 +AA80 +FA80 +AA80 +AA80 +FA40 +0B40 +0AC0 +1360 +2040 +ENDCHAR +STARTCHAR U_7557 +ENCODING 30039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +0000 +3F80 +2080 +7FC0 +4440 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7558 +ENCODING 30040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AFC0 +AD40 +FFC0 +AD40 +AFE0 +FC40 +0440 +0540 +0480 +ENDCHAR +STARTCHAR U_7559 +ENCODING 30041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3000 +C7C0 +9240 +B240 +D540 +8880 +7F80 +4880 +7F80 +4880 +7F80 +ENDCHAR +STARTCHAR U_755A +ENCODING 30042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0800 +FFE0 +2100 +FFE0 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_755B +ENCODING 30043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F980 +AA40 +ACA0 +F900 +AE40 +A980 +FE20 +8840 +0180 +0600 +ENDCHAR +STARTCHAR U_755C +ENCODING 30044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0880 +3F00 +0440 +7FE0 +2240 +3FC0 +2240 +3FC0 +2040 +ENDCHAR +STARTCHAR U_755D +ENCODING 30045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FFC0 +0240 +FC40 +A880 +A880 +F940 +AA40 +FC20 +8820 +ENDCHAR +STARTCHAR U_755E +ENCODING 30046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0500 +FDC0 +AD40 +FE40 +AC80 +AD40 +FE20 +0420 +0400 +ENDCHAR +STARTCHAR U_755F +ENCODING 30047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +2100 +D0C0 +3F00 +5200 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_7560 +ENCODING 30048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F00 +FF80 +8880 +FF80 +8880 +FF80 +ENDCHAR +STARTCHAR U_7561 +ENCODING 30049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A900 +AA40 +FFC0 +A880 +A920 +FA40 +0080 +0360 +0C20 +ENDCHAR +STARTCHAR U_7562 +ENCODING 30050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +2480 +FFE0 +2480 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_7563 +ENCODING 30051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2E80 +C060 +1F00 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7564 +ENCODING 30052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +A880 +AFE0 +F840 +A840 +AFE0 +FA40 +8940 +0040 +01C0 +ENDCHAR +STARTCHAR U_7565 +ENCODING 30053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +AE40 +A980 +FA40 +AC20 +ABC0 +AA40 +FA40 +8BC0 +0240 +ENDCHAR +STARTCHAR U_7566 +ENCODING 30054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +AFC0 +A900 +FFE0 +A900 +A900 +FFC0 +8900 +0100 +0FE0 +ENDCHAR +STARTCHAR U_7567 +ENCODING 30055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8880 +FF80 +3F00 +D200 +0C00 +FFC0 +2100 +3F00 +ENDCHAR +STARTCHAR U_7568 +ENCODING 30056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2500 +1600 +FFE0 +1500 +64E0 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_7569 +ENCODING 30057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +AFE0 +A900 +F920 +AAC0 +AE80 +FA80 +0240 +0320 +0200 +ENDCHAR +STARTCHAR U_756A +ENCODING 30058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +1500 +FFE0 +2480 +4440 +BFE0 +2440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_756B +ENCODING 30059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +7F80 +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_756C +ENCODING 30060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +0400 +FFE0 +2480 +FFE0 +2440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_756D +ENCODING 30061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +AC40 +ABA0 +F900 +AFE0 +A900 +FD40 +0920 +1520 +0200 +ENDCHAR +STARTCHAR U_756E +ENCODING 30062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +AC00 +ABE0 +FAA0 +AFE0 +AB20 +FAA0 +03E0 +0140 +0080 +ENDCHAR +STARTCHAR U_756F +ENCODING 30063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA40 +AFE0 +AA40 +FD20 +ABE0 +AA20 +FE40 +8980 +0240 +0420 +ENDCHAR +STARTCHAR U_7570 +ENCODING 30064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +1100 +FFC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7571 +ENCODING 30065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4A40 +7BC0 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7572 +ENCODING 30066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +0000 +FFE0 +2480 +7FE0 +A440 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_7573 +ENCODING 30067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +8020 +9F40 +1500 +1B00 +1500 +7FE0 +ENDCHAR +STARTCHAR U_7574 +ENCODING 30068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +A900 +AFC0 +F900 +AFE0 +AA40 +FFE0 +8A40 +1140 +0080 +ENDCHAR +STARTCHAR U_7575 +ENCODING 30069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0480 +FFE0 +0480 +3F80 +0400 +FFE0 +1500 +5F40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_7576 +ENCODING 30070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +8020 +9F20 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7577 +ENCODING 30071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FAA0 +AA40 +ACA0 +F900 +AFE0 +A920 +FDA0 +8A40 +0540 +08A0 +ENDCHAR +STARTCHAR U_7578 +ENCODING 30072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +AA80 +AC40 +FFE0 +A820 +ABA0 +FAA0 +8BA0 +0020 +00E0 +ENDCHAR +STARTCHAR U_7579 +ENCODING 30073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +AE20 +AA00 +FBE0 +ACA0 +AAA0 +F9E0 +8A80 +04A0 +18E0 +ENDCHAR +STARTCHAR U_757A +ENCODING 30074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2480 +3F80 +2480 +FFE0 +0000 +3F80 +2480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_757B +ENCODING 30075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FB40 +AFE0 +A900 +AFE0 +FA80 +AD40 +A920 +FFC0 +0100 +0FE0 +ENDCHAR +STARTCHAR U_757C +ENCODING 30076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +ABC0 +AA40 +AFE0 +F900 +ABE0 +AAA0 +FD60 +02A0 +0160 +ENDCHAR +STARTCHAR U_757D +ENCODING 30077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F880 +AFE0 +AAA0 +FBE0 +AAA0 +ABE0 +F880 +8BE0 +0080 +07E0 +ENDCHAR +STARTCHAR U_757E +ENCODING 30078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +0000 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_757F +ENCODING 30079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA80 +EB80 +5940 +AA80 +FFE0 +0400 +FA80 +AB00 +F920 +AAA0 +FC60 +ENDCHAR +STARTCHAR U_7580 +ENCODING 30080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5480 +ABE0 +54A0 +57E0 +F8A0 +ABE0 +F880 +AAE0 +FA80 +8DE0 +ENDCHAR +STARTCHAR U_7581 +ENCODING 30081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FDA0 +AB60 +ADA0 +F900 +AA80 +AD60 +AA80 +F940 +0080 +0700 +ENDCHAR +STARTCHAR U_7582 +ENCODING 30082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +3F80 +1100 +7FC0 +5540 +1B00 +1500 +FFE0 +ENDCHAR +STARTCHAR U_7583 +ENCODING 30083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +A940 +A880 +FFE0 +AAA0 +ABE0 +FAA0 +8FE0 +0080 +0FE0 +ENDCHAR +STARTCHAR U_7584 +ENCODING 30084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +FB40 +AFE0 +AB40 +FD20 +AA40 +AFE0 +F940 +8FE0 +0240 +0C40 +ENDCHAR +STARTCHAR U_7585 +ENCODING 30085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +02A0 +FBE0 +AAA0 +ABE0 +F800 +AFE0 +AAA0 +FBE0 +02A0 +07E0 +ENDCHAR +STARTCHAR U_7586 +ENCODING 30086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1540 +F7C0 +8540 +F7C0 +5000 +FFE0 +5540 +F7C0 +9540 +6FE0 +ENDCHAR +STARTCHAR U_7587 +ENCODING 30087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +A900 +AFE0 +F920 +AFE0 +A840 +FFE0 +8B40 +0E40 +00C0 +ENDCHAR +STARTCHAR U_7588 +ENCODING 30088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0200 +72E0 +5AA0 +76E0 +0200 +FBE0 +AAA0 +FBE0 +AAA0 +FDE0 +ENDCHAR +STARTCHAR U_7589 +ENCODING 30089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FFE0 +0800 +1F00 +0200 +FFE0 +ENDCHAR +STARTCHAR U_758A +ENCODING 30090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +7FC0 +5540 +7FC0 +5540 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_758B +ENCODING 30091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0220 +0240 +0200 +1200 +13E0 +1200 +1200 +2A00 +4600 +83E0 +ENDCHAR +STARTCHAR U_758C +ENCODING 30092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +0480 +FFE0 +0480 +3F80 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_758D +ENCODING 30093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0440 +2780 +3400 +4FE0 +8000 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_758E +ENCODING 30094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +1100 +27C0 +A540 +B7C0 +A300 +B380 +C540 +0920 +0100 +ENDCHAR +STARTCHAR U_758F +ENCODING 30095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +1100 +2240 +A7A0 +B820 +A540 +A540 +B540 +E940 +1160 +ENDCHAR +STARTCHAR U_7590 +ENCODING 30096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +3F80 +2480 +FFE0 +0420 +2780 +5400 +8FE0 +ENDCHAR +STARTCHAR U_7591 +ENCODING 30097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +6140 +4880 +7FE0 +40A0 +7A80 +A2E0 +FA80 +2280 +5580 +88E0 +ENDCHAR +STARTCHAR U_7592 +ENCODING 30098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5000 +3000 +5000 +9000 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_7593 +ENCODING 30099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2480 +65C0 +A440 +2440 +2840 +4940 +9080 +ENDCHAR +STARTCHAR U_7594 +ENCODING 30100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5FE0 +1100 +3100 +D100 +1100 +2900 +4500 +8200 +ENDCHAR +STARTCHAR U_7595 +ENCODING 30101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5400 +1440 +3480 +D700 +1400 +2420 +4420 +83E0 +ENDCHAR +STARTCHAR U_7596 +ENCODING 30102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2220 +2220 +6220 +A2E0 +2240 +4200 +8200 +ENDCHAR +STARTCHAR U_7597 +ENCODING 30103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2040 +6180 +A100 +2100 +2100 +4100 +8700 +ENDCHAR +STARTCHAR U_7598 +ENCODING 30104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5000 +17C0 +3100 +5100 +9100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7599 +ENCODING 30105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2800 +6780 +A100 +2200 +2420 +4820 +87E0 +ENDCHAR +STARTCHAR U_759A +ENCODING 30106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6400 +2780 +6880 +B080 +2100 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_759B +ENCODING 30107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6080 +2FE0 +6080 +AC80 +2280 +2080 +4280 +8100 +ENDCHAR +STARTCHAR U_759C +ENCODING 30108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AFE0 +6200 +2280 +6240 +A240 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_759D +ENCODING 30109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +2920 +6920 +A920 +2920 +2920 +4FE0 +8820 +ENDCHAR +STARTCHAR U_759E +ENCODING 30110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2000 +7FE0 +A400 +27C0 +4040 +4280 +8100 +ENDCHAR +STARTCHAR U_759F +ENCODING 30111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2400 +6400 +BFE0 +2400 +2400 +47E0 +8400 +ENDCHAR +STARTCHAR U_75A0 +ENCODING 30112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +1FE0 +9000 +5FE0 +1200 +33C0 +D240 +1240 +2440 +4940 +9080 +ENDCHAR +STARTCHAR U_75A1 +ENCODING 30113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F80 +2200 +6FE0 +A2A0 +24A0 +3920 +4220 +8CC0 +ENDCHAR +STARTCHAR U_75A2 +ENCODING 30114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6100 +2540 +6540 +A980 +2100 +2280 +4440 +8820 +ENDCHAR +STARTCHAR U_75A3 +ENCODING 30115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6240 +3FE0 +6200 +A200 +2500 +2520 +4920 +90E0 +ENDCHAR +STARTCHAR U_75A4 +ENCODING 30116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2940 +6940 +AFC0 +2800 +2820 +4820 +8FE0 +ENDCHAR +STARTCHAR U_75A5 +ENCODING 30117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2440 +7820 +A480 +2480 +2480 +4880 +9080 +ENDCHAR +STARTCHAR U_75A6 +ENCODING 30118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +A200 +6FC0 +2240 +6240 +BFE0 +2500 +4880 +5060 +A040 +ENDCHAR +STARTCHAR U_75A7 +ENCODING 30119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A0C0 +6F00 +2900 +2FE0 +6900 +A900 +28A0 +4E60 +9820 +ENDCHAR +STARTCHAR U_75A8 +ENCODING 30120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2500 +6900 +BFE0 +2500 +4900 +5500 +8200 +ENDCHAR +STARTCHAR U_75A9 +ENCODING 30121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +A200 +6F80 +24A0 +68E0 +A200 +3FE0 +4200 +4200 +8200 +ENDCHAR +STARTCHAR U_75AA +ENCODING 30122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6920 +2940 +6D80 +A900 +2900 +2B20 +4D20 +88E0 +ENDCHAR +STARTCHAR U_75AB +ENCODING 30123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6780 +2480 +68E0 +A000 +2FC0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_75AC +ENCODING 30124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2900 +6FE0 +A920 +2920 +2920 +4A20 +94C0 +ENDCHAR +STARTCHAR U_75AD +ENCODING 30125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6480 +2480 +6480 +AB40 +2940 +4A40 +5220 +A420 +ENDCHAR +STARTCHAR U_75AE +ENCODING 30126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6280 +2440 +6FA0 +B480 +2480 +2520 +4420 +83E0 +ENDCHAR +STARTCHAR U_75AF +ENCODING 30127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6D40 +AA40 +2940 +2AE0 +4C20 +9020 +ENDCHAR +STARTCHAR U_75B0 +ENCODING 30128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6100 +2FE0 +6100 +A100 +27C0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75B1 +ENCODING 30129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67C0 +2840 +7740 +A540 +2740 +25A0 +4420 +83E0 +ENDCHAR +STARTCHAR U_75B2 +ENCODING 30130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2940 +6900 +AFC0 +2A40 +2980 +4A40 +9420 +ENDCHAR +STARTCHAR U_75B3 +ENCODING 30131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6440 +3FE0 +6440 +A7C0 +2440 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_75B4 +ENCODING 30132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2040 +6F40 +A940 +2F40 +2940 +4040 +81C0 +ENDCHAR +STARTCHAR U_75B5 +ENCODING 30133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6280 +2AA0 +6BC0 +AA80 +2A80 +2AA0 +4BA0 +9CE0 +ENDCHAR +STARTCHAR U_75B6 +ENCODING 30134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA80 +6A80 +3FE0 +6A80 +AA80 +2B80 +2A80 +4800 +8FE0 +ENDCHAR +STARTCHAR U_75B7 +ENCODING 30135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +60C0 +2F00 +6900 +AFE0 +2900 +4900 +4AA0 +8D60 +ENDCHAR +STARTCHAR U_75B8 +ENCODING 30136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6FC0 +A840 +2FC0 +2840 +4000 +9FE0 +ENDCHAR +STARTCHAR U_75B9 +ENCODING 30137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +6300 +2480 +2960 +7200 +AC80 +2320 +2C40 +4080 +8F00 +ENDCHAR +STARTCHAR U_75BA +ENCODING 30138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +61C0 +3E00 +6200 +BFC0 +2100 +2200 +4C00 +93E0 +ENDCHAR +STARTCHAR U_75BB +ENCODING 30139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6840 +AFC0 +2840 +2480 +4840 +9020 +ENDCHAR +STARTCHAR U_75BC +ENCODING 30140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67C0 +2A80 +7100 +A680 +3960 +2080 +4200 +8180 +ENDCHAR +STARTCHAR U_75BD +ENCODING 30141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2440 +67C0 +A440 +27C0 +2440 +4440 +9FE0 +ENDCHAR +STARTCHAR U_75BE +ENCODING 30142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2900 +6100 +BFE0 +2100 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_75BF +ENCODING 30143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +7FC0 +2540 +7FC0 +B500 +3FE0 +2520 +49C0 +9100 +ENDCHAR +STARTCHAR U_75C0 +ENCODING 30144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2820 +77A0 +A4A0 +27A0 +24A0 +4020 +80C0 +ENDCHAR +STARTCHAR U_75C1 +ENCODING 30145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6200 +23E0 +6200 +AFC0 +2840 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_75C2 +ENCODING 30146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +68E0 +3EA0 +6AA0 +AAA0 +2AA0 +2AA0 +52E0 +A6A0 +ENDCHAR +STARTCHAR U_75C3 +ENCODING 30147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2200 +6440 +AF80 +2100 +2240 +4FA0 +8420 +ENDCHAR +STARTCHAR U_75C4 +ENCODING 30148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +67E0 +2A00 +73C0 +A200 +23C0 +2200 +4200 +8200 +ENDCHAR +STARTCHAR U_75C5 +ENCODING 30149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7FE0 +2100 +6FE0 +A920 +2AA0 +2C60 +4820 +88E0 +ENDCHAR +STARTCHAR U_75C6 +ENCODING 30150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6FC0 +A800 +2A60 +4B80 +5220 +A1E0 +ENDCHAR +STARTCHAR U_75C7 +ENCODING 30151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2100 +6100 +A9C0 +2900 +2900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_75C8 +ENCODING 30152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2920 +6FE0 +A920 +2920 +2FE0 +4920 +9160 +ENDCHAR +STARTCHAR U_75C9 +ENCODING 30153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7F80 +2100 +6680 +B860 +2FC0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75CA +ENCODING 30154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +6480 +2840 +77E0 +A100 +27C0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75CB +ENCODING 30155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6100 +2FC0 +6940 +AFC0 +2940 +2140 +5FA0 +8820 +ENDCHAR +STARTCHAR U_75CC +ENCODING 30156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2820 +6BA0 +A820 +2BA0 +2AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_75CD +ENCODING 30157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2140 +6FC0 +A900 +2FE0 +2160 +4280 +9C60 +ENDCHAR +STARTCHAR U_75CE +ENCODING 30158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2480 +6900 +AE40 +2280 +2D80 +4240 +9C20 +ENDCHAR +STARTCHAR U_75CF +ENCODING 30159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2400 +67C0 +AC40 +37C0 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_75D0 +ENCODING 30160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2820 +6BA0 +AAA0 +2BA0 +2820 +4FE0 +8820 +ENDCHAR +STARTCHAR U_75D1 +ENCODING 30161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6780 +2D00 +6280 +BDE0 +2240 +2D80 +4100 +9E00 +ENDCHAR +STARTCHAR U_75D2 +ENCODING 30162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6280 +2FE0 +6100 +A7C0 +2100 +2FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_75D3 +ENCODING 30163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +BFC0 +6200 +2480 +6FC0 +A200 +2FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_75D4 +ENCODING 30164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FC0 +2200 +7FE0 +A080 +3FE0 +2880 +4480 +8100 +ENDCHAR +STARTCHAR U_75D5 +ENCODING 30165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2840 +6FC0 +A840 +2FE0 +2940 +4A80 +8C60 +ENDCHAR +STARTCHAR U_75D6 +ENCODING 30166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2500 +7520 +B520 +2D40 +2500 +4500 +9FE0 +ENDCHAR +STARTCHAR U_75D7 +ENCODING 30167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +6FE0 +3540 +6540 +BFE0 +2940 +2FE0 +4040 +8180 +ENDCHAR +STARTCHAR U_75D8 +ENCODING 30168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2000 +67C0 +A440 +27C0 +2440 +4280 +9FE0 +ENDCHAR +STARTCHAR U_75D9 +ENCODING 30169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2540 +6A80 +A540 +2FE0 +2100 +4100 +9FE0 +ENDCHAR +STARTCHAR U_75DA +ENCODING 30170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AF40 +6280 +3FE0 +6200 +AFC0 +3080 +3FE0 +4100 +8300 +ENDCHAR +STARTCHAR U_75DB +ENCODING 30171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2280 +6FE0 +A920 +2FE0 +2920 +4FE0 +8920 +ENDCHAR +STARTCHAR U_75DC +ENCODING 30172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AF80 +6200 +3FE0 +6A80 +B260 +2F00 +4920 +90E0 +ENDCHAR +STARTCHAR U_75DD +ENCODING 30173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A900 +6880 +3FE0 +6D40 +AEA0 +2D40 +2EA0 +5520 +A3E0 +ENDCHAR +STARTCHAR U_75DE +ENCODING 30174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7FE0 +2300 +6540 +A920 +3FC0 +2840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_75DF +ENCODING 30175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A920 +6540 +2FC0 +6840 +AFC0 +2840 +2FC0 +4840 +88C0 +ENDCHAR +STARTCHAR U_75E0 +ENCODING 30176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +7FA0 +2480 +7A40 +A7A0 +2C80 +3480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_75E1 +ENCODING 30177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7FE0 +2100 +6FE0 +A920 +2FE0 +2920 +6FE0 +8920 +ENDCHAR +STARTCHAR U_75E2 +ENCODING 30178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6E20 +24A0 +7FA0 +A4A0 +2EA0 +35A0 +4420 +84E0 +ENDCHAR +STARTCHAR U_75E3 +ENCODING 30179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2100 +67C0 +A200 +2540 +2C20 +54A0 +8380 +ENDCHAR +STARTCHAR U_75E4 +ENCODING 30180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6A40 +2A40 +76A0 +A200 +3FC0 +2200 +4200 +BFE0 +ENDCHAR +STARTCHAR U_75E5 +ENCODING 30181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6500 +2FC0 +6840 +AFC0 +2500 +4500 +4920 +90E0 +ENDCHAR +STARTCHAR U_75E6 +ENCODING 30182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2200 +6FC0 +A440 +3FE0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_75E7 +ENCODING 30183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +74C0 +29A0 +6680 +A8A0 +3840 +2880 +4900 +8600 +ENDCHAR +STARTCHAR U_75E8 +ENCODING 30184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A280 +6FE0 +2280 +6FE0 +A920 +27C0 +2240 +4440 +9980 +ENDCHAR +STARTCHAR U_75E9 +ENCODING 30185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FE0 +2200 +AFC0 +6A40 +2FC0 +6A40 +AFC0 +2480 +4300 +9CC0 +ENDCHAR +STARTCHAR U_75EA +ENCODING 30186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6780 +2500 +6FC0 +B540 +2540 +3FE0 +4280 +8C60 +ENDCHAR +STARTCHAR U_75EB +ENCODING 30187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +6800 +25E0 +2920 +6FE0 +A920 +2BA0 +4D60 +4920 +8960 +ENDCHAR +STARTCHAR U_75EC +ENCODING 30188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +6F80 +2880 +6F80 +A400 +2FC0 +5540 +4B40 +8480 +ENDCHAR +STARTCHAR U_75ED +ENCODING 30189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6EE0 +2AA0 +6EE0 +AAA0 +2EE0 +2AA0 +52A0 +A760 +ENDCHAR +STARTCHAR U_75EE +ENCODING 30190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2400 +6780 +A400 +3FE0 +2940 +4880 +8C60 +ENDCHAR +STARTCHAR U_75EF +ENCODING 30191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2820 +67C0 +A440 +27E0 +2420 +47E0 +8420 +ENDCHAR +STARTCHAR U_75F0 +ENCODING 30192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A520 +69C0 +2280 +6D60 +A540 +2980 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_75F1 +ENCODING 30193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6480 +3CE0 +6480 +BCE0 +2480 +3CE0 +4480 +8480 +ENDCHAR +STARTCHAR U_75F2 +ENCODING 30194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7FE0 +2880 +6AA0 +AAA0 +2AA0 +2AA0 +4880 +8880 +ENDCHAR +STARTCHAR U_75F3 +ENCODING 30195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7FE0 +2880 +6CC0 +BAA0 +29A0 +2AA0 +4880 +8880 +ENDCHAR +STARTCHAR U_75F4 +ENCODING 30196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +6EE0 +34A0 +64A0 +BFA0 +24A0 +2AA0 +52E0 +A000 +ENDCHAR +STARTCHAR U_75F5 +ENCODING 30197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A380 +6100 +3FE0 +6940 +B7A0 +2100 +3FE0 +4100 +8700 +ENDCHAR +STARTCHAR U_75F6 +ENCODING 30198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6FE0 +2AA0 +6FE0 +AAA0 +2AA0 +3FE0 +4480 +9860 +ENDCHAR +STARTCHAR U_75F7 +ENCODING 30199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A80 +7FC0 +AAA0 +2F80 +2AA0 +6FA0 +81E0 +ENDCHAR +STARTCHAR U_75F8 +ENCODING 30200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B400 +7F20 +24A0 +7FA0 +A4A0 +3FA0 +35A0 +5720 +8460 +ENDCHAR +STARTCHAR U_75F9 +ENCODING 30201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2940 +6FC0 +A940 +3FE0 +2480 +4880 +9080 +ENDCHAR +STARTCHAR U_75FA +ENCODING 30202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FE0 +2920 +6FE0 +A920 +2FE0 +2500 +7FE0 +8100 +ENDCHAR +STARTCHAR U_75FB +ENCODING 30203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A040 +6F80 +2880 +6FE0 +B880 +2860 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_75FC +ENCODING 30204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +6FE0 +2920 +6FE0 +A920 +2AA0 +2BA0 +4820 +8FE0 +ENDCHAR +STARTCHAR U_75FD +ENCODING 30205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6FE0 +2900 +7FC0 +A900 +2FC0 +2900 +4FE0 +8800 +ENDCHAR +STARTCHAR U_75FE +ENCODING 30206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AFE0 +6A40 +2DC0 +6A40 +AA40 +2BC0 +4C40 +88C0 +ENDCHAR +STARTCHAR U_75FF +ENCODING 30207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A040 +6F80 +2100 +7FE0 +A940 +3FE0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_7600 +ENCODING 30208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +2400 +A440 +7EA0 +2920 +6E00 +AA40 +2A20 +2A80 +5240 +ENDCHAR +STARTCHAR U_7601 +ENCODING 30209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2440 +6AA0 +B100 +2100 +3FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_7602 +ENCODING 30210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +BFC0 +6500 +6DC0 +A840 +2DC0 +4500 +4500 +BFE0 +ENDCHAR +STARTCHAR U_7603 +ENCODING 30211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +7FE0 +2940 +7A80 +A580 +2AC0 +24A0 +48A0 +9300 +ENDCHAR +STARTCHAR U_7604 +ENCODING 30212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6FC0 +2480 +7FE0 +A000 +2FC0 +4940 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_7605 +ENCODING 30213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6280 +2FC0 +6940 +AFC0 +2940 +3FE0 +4100 +8100 +ENDCHAR +STARTCHAR U_7606 +ENCODING 30214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +5F80 +C400 +7FC0 +D480 +6A60 +4500 +4200 +9C00 +ENDCHAR +STARTCHAR U_7607 +ENCODING 30215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2000 +AFC0 +6200 +3FE0 +6A40 +AA40 +2FE0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7608 +ENCODING 30216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +7FE0 +24A0 +7F20 +A440 +3FE0 +2200 +4D80 +B060 +ENDCHAR +STARTCHAR U_7609 +ENCODING 30217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6440 +2BA0 +7E00 +B2A0 +3EA0 +32A0 +5E20 +92E0 +ENDCHAR +STARTCHAR U_760A +ENCODING 30218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A5C0 +6840 +2FE0 +7A00 +ABC0 +2C80 +2FE0 +4940 +8E20 +ENDCHAR +STARTCHAR U_760B +ENCODING 30219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FC0 +2A40 +6FC0 +AAC0 +2FC0 +2A60 +53A0 +AEA0 +ENDCHAR +STARTCHAR U_760C +ENCODING 30220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7E20 +28A0 +7EA0 +AAA0 +3EA0 +2CA0 +5A20 +A960 +ENDCHAR +STARTCHAR U_760D +ENCODING 30221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +67C0 +2440 +7FE0 +A400 +2FE0 +32A0 +4520 +8A60 +ENDCHAR +STARTCHAR U_760E +ENCODING 30222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +AFC0 +6480 +2780 +6480 +BFE0 +2A80 +4C40 +8FE0 +ENDCHAR +STARTCHAR U_760F +ENCODING 30223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FA0 +2240 +7FE0 +A440 +2FC0 +3440 +47C0 +8440 +ENDCHAR +STARTCHAR U_7610 +ENCODING 30224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6DE0 +2920 +6FE0 +A920 +2FE0 +2280 +4440 +9820 +ENDCHAR +STARTCHAR U_7611 +ENCODING 30225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +67C0 +2440 +6740 +AFE0 +2820 +2BA0 +4AA0 +8BA0 +ENDCHAR +STARTCHAR U_7612 +ENCODING 30226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +7FE0 +3220 +6FC0 +AA40 +2FC0 +2A40 +5FE0 +8200 +ENDCHAR +STARTCHAR U_7613 +ENCODING 30227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6900 +3FE0 +6AA0 +AC60 +2920 +3FE0 +4480 +9860 +ENDCHAR +STARTCHAR U_7614 +ENCODING 30228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2680 +7FE0 +A200 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_7615 +ENCODING 30229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +6EE0 +2A20 +6EE0 +A800 +2EE0 +28A0 +4E40 +88A0 +ENDCHAR +STARTCHAR U_7616 +ENCODING 30230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2280 +7FE0 +A440 +27C0 +2440 +47C0 +8440 +ENDCHAR +STARTCHAR U_7617 +ENCODING 30231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2540 +6FE0 +A280 +2D60 +27C0 +4100 +9FE0 +ENDCHAR +STARTCHAR U_7618 +ENCODING 30232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B240 +6A80 +3FE0 +6A80 +B240 +3FE0 +2480 +4380 +9C60 +ENDCHAR +STARTCHAR U_7619 +ENCODING 30233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +AA40 +6540 +2B80 +6540 +AFE0 +2940 +2FC0 +4140 +9FA0 +ENDCHAR +STARTCHAR U_761A +ENCODING 30234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA80 +6480 +3FE0 +6AA0 +AA80 +3E80 +2880 +5140 +A220 +ENDCHAR +STARTCHAR U_761B +ENCODING 30235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7FE0 +28A0 +7EA0 +A920 +2A60 +3540 +54A0 +A3A0 +ENDCHAR +STARTCHAR U_761C +ENCODING 30236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FC0 +2840 +6FC0 +A840 +2FC0 +3540 +54A0 +A3A0 +ENDCHAR +STARTCHAR U_761D +ENCODING 30237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2AA0 +6FE0 +A540 +2920 +2580 +4940 +9120 +ENDCHAR +STARTCHAR U_761E +ENCODING 30238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2A40 +75A0 +AA80 +3240 +3FC0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_761F +ENCODING 30239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6F80 +2880 +6F80 +A880 +3FC0 +3540 +5540 +BFE0 +ENDCHAR +STARTCHAR U_7620 +ENCODING 30240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B240 +6AC0 +3520 +6FE0 +B840 +2FC0 +2840 +4FC0 +88C0 +ENDCHAR +STARTCHAR U_7621 +ENCODING 30241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6A80 +3FE0 +6840 +AFC0 +2840 +2FE0 +5420 +A7E0 +ENDCHAR +STARTCHAR U_7622 +ENCODING 30242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A400 +6EE0 +2AA0 +6EA0 +AA00 +3FE0 +2AA0 +4E40 +93A0 +ENDCHAR +STARTCHAR U_7623 +ENCODING 30243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +6FC0 +2940 +6FC0 +A940 +2FC0 +25A0 +4940 +91E0 +ENDCHAR +STARTCHAR U_7624 +ENCODING 30244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +6FE0 +2AA0 +6B40 +AFE0 +2920 +2FE0 +4920 +8FE0 +ENDCHAR +STARTCHAR U_7625 +ENCODING 30245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +7FE0 +2200 +6FC0 +A200 +3FE0 +2900 +5100 +8FE0 +ENDCHAR +STARTCHAR U_7626 +ENCODING 30246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A920 +6FE0 +2920 +6FE0 +A100 +2FC0 +2480 +4300 +8CE0 +ENDCHAR +STARTCHAR U_7627 +ENCODING 30247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A3C0 +6200 +2FE0 +6A40 +AFE0 +2A00 +2FE0 +5200 +A3E0 +ENDCHAR +STARTCHAR U_7628 +ENCODING 30248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +7FE0 +2840 +6F40 +ABC0 +2840 +3FE0 +4480 +9860 +ENDCHAR +STARTCHAR U_7629 +ENCODING 30249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2200 +6480 +BB60 +2000 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_762A +ENCODING 30250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A400 +6FC0 +2840 +6FC0 +A840 +2FC0 +3920 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_762B +ENCODING 30251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7DE0 +2540 +77E0 +A940 +29E0 +3540 +5540 +A5E0 +ENDCHAR +STARTCHAR U_762C +ENCODING 30252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4000 +DDC0 +4500 +5DC0 +D100 +5FE0 +4540 +5520 +8980 +ENDCHAR +STARTCHAR U_762D +ENCODING 30253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A280 +6FE0 +2AA0 +6FE0 +A000 +3FE0 +2580 +4940 +9320 +ENDCHAR +STARTCHAR U_762E +ENCODING 30254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2480 +AFC0 +6AA0 +7FE0 +AA80 +3540 +22A0 +4100 +8E00 +ENDCHAR +STARTCHAR U_762F +ENCODING 30255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +BFE0 +6880 +3FE0 +2880 +6FE0 +AA40 +2BE0 +2A40 +4AA0 +9520 +ENDCHAR +STARTCHAR U_7630 +ENCODING 30256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A920 +6FE0 +2920 +6FE0 +A280 +2540 +2FA0 +4540 +9B20 +ENDCHAR +STARTCHAR U_7631 +ENCODING 30257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2200 +BFE0 +6A80 +3540 +E880 +3260 +2500 +54A0 +A380 +ENDCHAR +STARTCHAR U_7632 +ENCODING 30258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A540 +6940 +36A0 +6880 +BA80 +2AE0 +2A80 +4D80 +88E0 +ENDCHAR +STARTCHAR U_7633 +ENCODING 30259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +AAA0 +6660 +3AA0 +6320 +BCE0 +2100 +2E60 +4080 +8F00 +ENDCHAR +STARTCHAR U_7634 +ENCODING 30260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +2280 +6FE0 +A440 +27C0 +2440 +6FE0 +8100 +ENDCHAR +STARTCHAR U_7635 +ENCODING 30261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6BE0 +36A0 +6A40 +A7E0 +2800 +3FE0 +4940 +B320 +ENDCHAR +STARTCHAR U_7636 +ENCODING 30262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +FE80 +48E0 +7F20 +EA80 +7E80 +5D40 +6B60 +8A40 +ENDCHAR +STARTCHAR U_7637 +ENCODING 30263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +FE80 +48E0 +7F20 +EAA0 +7E40 +5C40 +AAA0 +4920 +ENDCHAR +STARTCHAR U_7638 +ENCODING 30264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A800 +7EE0 +2AA0 +72E0 +AFE0 +2AA0 +2D60 +4AA0 +8C60 +ENDCHAR +STARTCHAR U_7639 +ENCODING 30265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +D5E0 +7E20 +4920 +DEA0 +68A0 +5A20 +7EA0 +8040 +ENDCHAR +STARTCHAR U_763A +ENCODING 30266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A820 +6FE0 +2800 +6FE0 +A900 +2FE0 +2DA0 +5B60 +A960 +ENDCHAR +STARTCHAR U_763B +ENCODING 30267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2940 +BFE0 +6940 +2FC0 +6940 +BFE0 +2480 +4380 +8C40 +ENDCHAR +STARTCHAR U_763C +ENCODING 30268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2FC0 +6840 +AFC0 +2840 +3FE0 +4280 +9C60 +ENDCHAR +STARTCHAR U_763D +ENCODING 30269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FE0 +2480 +6780 +AFC0 +2A40 +5FE0 +4200 +9FE0 +ENDCHAR +STARTCHAR U_763E +ENCODING 30270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +B9C0 +6A40 +2FE0 +7020 +AFE0 +2820 +3FE0 +6540 +A9E0 +ENDCHAR +STARTCHAR U_763F +ENCODING 30271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A220 +6AA0 +2AA0 +6540 +B220 +3FE0 +2900 +4700 +B8E0 +ENDCHAR +STARTCHAR U_7640 +ENCODING 30272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +7FC0 +2480 +7FE0 +AA40 +2FC0 +2A40 +6FC0 +9860 +ENDCHAR +STARTCHAR U_7641 +ENCODING 30273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA00 +6BE0 +3640 +6BC0 +BA40 +2BC0 +2A40 +4980 +8E60 +ENDCHAR +STARTCHAR U_7642 +ENCODING 30274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +34A0 +6FC0 +B8A0 +2F80 +2580 +4940 +B320 +ENDCHAR +STARTCHAR U_7643 +ENCODING 30275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +6F40 +2AC0 +6D20 +AAE0 +2F40 +29E0 +4840 +8BE0 +ENDCHAR +STARTCHAR U_7644 +ENCODING 30276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +6FC0 +3900 +6FC0 +A900 +2FE0 +4800 +9540 +24A0 +ENDCHAR +STARTCHAR U_7645 +ENCODING 30277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +D540 +5DC0 +4500 +DFC0 +5240 +5FC0 +5240 +9FC0 +ENDCHAR +STARTCHAR U_7646 +ENCODING 30278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +6EE0 +3540 +6AA0 +AFE0 +2A20 +2FC0 +4440 +9980 +ENDCHAR +STARTCHAR U_7647 +ENCODING 30279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6EE0 +2BA0 +6EE0 +ABA0 +2AA0 +2BA0 +4AA0 +8AE0 +ENDCHAR +STARTCHAR U_7648 +ENCODING 30280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6440 +3DE0 +6540 +AE20 +29E0 +2CA0 +4440 +9DA0 +ENDCHAR +STARTCHAR U_7649 +ENCODING 30281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AAA0 +6FE0 +2540 +67C0 +A540 +27C0 +2100 +5FE0 +8100 +ENDCHAR +STARTCHAR U_764A +ENCODING 30282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5880 +D540 +5BE0 +5480 +D5C0 +5800 +57E0 +5140 +93E0 +ENDCHAR +STARTCHAR U_764B +ENCODING 30283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +DDC0 +5040 +5DC0 +C500 +7FE0 +4240 +AAA0 +2780 +ENDCHAR +STARTCHAR U_764C +ENCODING 30284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A000 +67C0 +2440 +6FE0 +AAA0 +2EE0 +2100 +4920 +8FE0 +ENDCHAR +STARTCHAR U_764D +ENCODING 30285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +FAE0 +5740 +5540 +FAE0 +5340 +5540 +9540 +B9E0 +ENDCHAR +STARTCHAR U_764E +ENCODING 30286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +DDC0 +5540 +5FC0 +D540 +5740 +5540 +9740 +90C0 +ENDCHAR +STARTCHAR U_764F +ENCODING 30287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +DFC0 +5540 +7FE0 +C880 +4F80 +4D40 +7480 +8660 +ENDCHAR +STARTCHAR U_7650 +ENCODING 30288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +6CC0 +3FE0 +6AA0 +AFE0 +2440 +27C0 +4440 +87C0 +ENDCHAR +STARTCHAR U_7651 +ENCODING 30289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A280 +6FE0 +2AA0 +6FE0 +A800 +2FE0 +5540 +A480 +4660 +ENDCHAR +STARTCHAR U_7652 +ENCODING 30290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A300 +7CE0 +2EA0 +6AA0 +AEA0 +2A60 +2620 +54C0 +A7A0 +ENDCHAR +STARTCHAR U_7653 +ENCODING 30291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5A80 +EFE0 +50A0 +77A0 +D0A0 +55A0 +5540 +55A0 +9920 +ENDCHAR +STARTCHAR U_7654 +ENCODING 30292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +2480 +7FE0 +A880 +2F80 +2540 +54A0 +93A0 +ENDCHAR +STARTCHAR U_7655 +ENCODING 30293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +FFE0 +5280 +6C80 +D7C0 +6C80 +57C0 +5480 +A7E0 +ENDCHAR +STARTCHAR U_7656 +ENCODING 30294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +2040 +AFE0 +6AA0 +2E40 +69E0 +AE40 +4AE0 +5A40 +AE40 +ENDCHAR +STARTCHAR U_7657 +ENCODING 30295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +3720 +6A80 +AFC0 +2A40 +2FC0 +4A40 +8FC0 +ENDCHAR +STARTCHAR U_7658 +ENCODING 30296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A480 +6FC0 +2480 +6FC0 +AA40 +3FE0 +3220 +5FA0 +9060 +ENDCHAR +STARTCHAR U_7659 +ENCODING 30297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A840 +6DC0 +2840 +6FC0 +A940 +2DC0 +2940 +4DC0 +8920 +ENDCHAR +STARTCHAR U_765A +ENCODING 30298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A780 +6900 +3FE0 +6D40 +AFE0 +2800 +2FC0 +5440 +A7C0 +ENDCHAR +STARTCHAR U_765B +ENCODING 30299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4200 +FFE0 +5540 +5740 +D040 +7FE0 +4A80 +5260 +8200 +ENDCHAR +STARTCHAR U_765C +ENCODING 30300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +A000 +7EE0 +32A0 +7E00 +ABE0 +2AA0 +3F40 +4AA0 +9120 +ENDCHAR +STARTCHAR U_765D +ENCODING 30301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5540 +D740 +5040 +5FC0 +C000 +7FE0 +4A80 +5240 +8600 +ENDCHAR +STARTCHAR U_765E +ENCODING 30302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A940 +7FE0 +2A20 +7EA0 +AAA0 +3EA0 +2AA0 +5D40 +AA20 +ENDCHAR +STARTCHAR U_765F +ENCODING 30303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A840 +6FC0 +2840 +6FC0 +A840 +3FE0 +3540 +5FC0 +9540 +ENDCHAR +STARTCHAR U_7660 +ENCODING 30304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A520 +7AC0 +3AC0 +6AA0 +AA40 +2FC0 +2840 +4FC0 +9040 +ENDCHAR +STARTCHAR U_7661 +ENCODING 30305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +3FE0 +AA00 +6DE0 +28A0 +6FE0 +B540 +3F40 +2560 +4AC0 +9160 +ENDCHAR +STARTCHAR U_7662 +ENCODING 30306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A500 +7FE0 +2200 +7FE0 +A8C0 +3FA0 +28A0 +4FC0 +9C60 +ENDCHAR +STARTCHAR U_7663 +ENCODING 30307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AB40 +7480 +3FE0 +6A80 +BFE0 +2A80 +3FE0 +4080 +9E80 +ENDCHAR +STARTCHAR U_7664 +ENCODING 30308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A880 +7540 +2FE0 +68A0 +AFA0 +28A0 +2FA0 +4AE0 +8D80 +ENDCHAR +STARTCHAR U_7665 +ENCODING 30309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +DA80 +6FE0 +54A0 +7FA0 +D4A0 +5FA0 +5440 +54A0 +9F20 +ENDCHAR +STARTCHAR U_7666 +ENCODING 30310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FC0 +4000 +DFC0 +5240 +5FC0 +C200 +5FC0 +5540 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7667 +ENCODING 30311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4000 +DFE0 +5440 +5FE0 +D6C0 +5D60 +51C0 +A500 +5FE0 +ENDCHAR +STARTCHAR U_7668 +ENCODING 30312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6FE0 +39A0 +6540 +AFC0 +3900 +4FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7669 +ENCODING 30313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7FE0 +2520 +7FE0 +B520 +3FE0 +2D20 +57E0 +A620 +ENDCHAR +STARTCHAR U_766A +ENCODING 30314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A080 +7FE0 +2880 +7FE0 +AA40 +2FC0 +3A40 +4BC0 +8E60 +ENDCHAR +STARTCHAR U_766B +ENCODING 30315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +FFE0 +5280 +5BE0 +D6A0 +52A0 +7EA0 +5540 +A220 +ENDCHAR +STARTCHAR U_766C +ENCODING 30316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A940 +7280 +3FE0 +6A80 +BFE0 +2A80 +3FE0 +5480 +AA80 +ENDCHAR +STARTCHAR U_766D +ENCODING 30317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AA40 +6FC0 +2A40 +6FC0 +AAA0 +3FE0 +2480 +4300 +9CE0 +ENDCHAR +STARTCHAR U_766E +ENCODING 30318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5D40 +D7E0 +5500 +5BE0 +D440 +57E0 +5D40 +56A0 +9BC0 +ENDCHAR +STARTCHAR U_766F +ENCODING 30319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +AEE0 +6AA0 +2EE0 +6500 +AFE0 +3900 +2FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_7670 +ENCODING 30320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +6940 +D540 +7DE0 +4540 +FDE0 +5540 +7DE0 +A340 +BFE0 +ENDCHAR +STARTCHAR U_7671 +ENCODING 30321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +D540 +7F40 +55E0 +7F40 +C9E0 +7F40 +49E0 +7F40 +95E0 +ENDCHAR +STARTCHAR U_7672 +ENCODING 30322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A440 +7FE0 +2AA0 +6EE0 +AAA0 +2EE0 +3FA0 +4A40 +91A0 +ENDCHAR +STARTCHAR U_7673 +ENCODING 30323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A80 +DFC0 +5540 +5FC0 +CA00 +4480 +4FC0 +4A80 +9240 +ENDCHAR +STARTCHAR U_7674 +ENCODING 30324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +EFA0 +5240 +6FA0 +C500 +5FC0 +4200 +7FE0 +8200 +ENDCHAR +STARTCHAR U_7675 +ENCODING 30325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A940 +77E0 +2940 +7FE0 +B2A0 +2FC0 +2D40 +4AC0 +8D40 +ENDCHAR +STARTCHAR U_7676 +ENCODING 30326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +0480 +7B00 +0A40 +4980 +3100 +2080 +C060 +ENDCHAR +STARTCHAR U_7677 +ENCODING 30327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7B00 +4940 +3080 +2040 +DF20 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7678 +ENCODING 30328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E80 +0920 +2940 +1080 +2F40 +4420 +8400 +7FE0 +0500 +0880 +7060 +ENDCHAR +STARTCHAR U_7679 +ENCODING 30329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E80 +0920 +2940 +1080 +2F40 +49A0 +9000 +3FC0 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_767A +ENCODING 30330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +0B20 +5240 +2180 +C060 +3F80 +0A00 +7FC0 +0A00 +1240 +61C0 +ENDCHAR +STARTCHAR U_767B +ENCODING 30331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4A80 +2940 +1080 +3FC0 +C020 +1F80 +1080 +1F80 +0900 +FFE0 +ENDCHAR +STARTCHAR U_767C +ENCODING 30332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +0B20 +5140 +20E0 +F3C0 +1240 +7420 +43C0 +3240 +9180 +7660 +ENDCHAR +STARTCHAR U_767D +ENCODING 30333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +10 +20 +FF +81 +81 +FF +81 +81 +81 +FF +81 +ENDCHAR +STARTCHAR U_767E +ENCODING 30334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0800 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_767F +ENCODING 30335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +F900 +8900 +8900 +F900 +8900 +8900 +8920 +F920 +88E0 +ENDCHAR +STARTCHAR U_7680 +ENCODING 30336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +20 +FE +82 +FE +82 +FE +00 +8E +F0 +81 +7F +ENDCHAR +STARTCHAR U_7681 +ENCODING 30337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7682 +ENCODING 30338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2040 +3FC0 +2040 +3FC0 +0800 +0FE0 +F800 +0820 +07E0 +ENDCHAR +STARTCHAR U_7683 +ENCODING 30339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1000 +7F00 +4100 +7F00 +4100 +7F00 +2400 +2440 +4440 +83C0 +ENDCHAR +STARTCHAR U_7684 +ENCODING 30340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +4200 +F7C0 +9840 +9040 +F440 +9240 +9240 +9040 +F040 +9180 +ENDCHAR +STARTCHAR U_7685 +ENCODING 30341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4540 +F540 +9540 +9540 +F7C0 +9400 +9400 +9420 +F420 +03E0 +ENDCHAR +STARTCHAR U_7686 +ENCODING 30342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8480 +F500 +8640 +B440 +CBC0 +1000 +7F00 +4100 +7F00 +4100 +7F00 +ENDCHAR +STARTCHAR U_7687 +ENCODING 30343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2880 +2480 +3F80 +0000 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7688 +ENCODING 30344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +4780 +F400 +97C0 +9440 +F640 +9540 +9480 +F480 +9940 +1220 +ENDCHAR +STARTCHAR U_7689 +ENCODING 30345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +4280 +EA80 +AAA0 +ABC0 +EA80 +AA80 +AAA0 +EBA0 +ACA0 +18E0 +ENDCHAR +STARTCHAR U_768A +ENCODING 30346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4280 +F440 +9920 +9080 +FFE0 +9040 +9280 +F100 +9080 +0080 +ENDCHAR +STARTCHAR U_768B +ENCODING 30347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +FFE0 +1500 +2480 +DF60 +0400 +0400 +ENDCHAR +STARTCHAR U_768C +ENCODING 30348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +FFE0 +A200 +A200 +EFC0 +A700 +AA80 +B240 +E220 +0200 +ENDCHAR +STARTCHAR U_768D +ENCODING 30349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F00 +8000 +F780 +8480 +E580 +0400 +ENDCHAR +STARTCHAR U_768E +ENCODING 30350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +FFE0 +9280 +9440 +F820 +9280 +9280 +F100 +9280 +0C60 +ENDCHAR +STARTCHAR U_768F +ENCODING 30351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +4140 +F7E0 +9240 +9240 +F7E0 +9240 +9240 +F240 +9440 +0840 +ENDCHAR +STARTCHAR U_7690 +ENCODING 30352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4040 +7FC0 +4040 +7FC0 +2480 +1500 +64C0 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7691 +ENCODING 30353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +4520 +F7E0 +9000 +97E0 +F020 +97E0 +9420 +F400 +9420 +07E0 +ENDCHAR +STARTCHAR U_7692 +ENCODING 30354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +4CC0 +F4A0 +9FE0 +9480 +F6A0 +9CC0 +9480 +F5A0 +9660 +0C20 +ENDCHAR +STARTCHAR U_7693 +ENCODING 30355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4500 +F7C0 +9900 +9100 +FFE0 +9000 +97C0 +F440 +9440 +07C0 +ENDCHAR +STARTCHAR U_7694 +ENCODING 30356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4440 +F7C0 +9440 +97C0 +F000 +97C0 +9100 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_7695 +ENCODING 30357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +4100 +FBE0 +8A20 +8A20 +FBE0 +8A20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_7696 +ENCODING 30358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4080 +F7E0 +9420 +93C0 +F000 +9FE0 +9280 +F2A0 +94A0 +18E0 +ENDCHAR +STARTCHAR U_7697 +ENCODING 30359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +8920 +EBA0 +A920 +AFE0 +E820 +ABA0 +AAA0 +EBA0 +10A0 +2040 +ENDCHAR +STARTCHAR U_7698 +ENCODING 30360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +F100 +97C0 +9100 +FFE0 +9440 +97C0 +F440 +07C0 +0440 +ENDCHAR +STARTCHAR U_7699 +ENCODING 30361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +2400 +77E0 +AC80 +2880 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_769A +ENCODING 30362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4920 +FFE0 +9000 +9FE0 +F000 +97C0 +9440 +F7C0 +9280 +1FE0 +ENDCHAR +STARTCHAR U_769B +ENCODING 30363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_769C +ENCODING 30364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4FE0 +E440 +A7C0 +A000 +AFE0 +E820 +ABA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_769D +ENCODING 30365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FD20 +8B40 +F900 +8FE0 +FA80 +2280 +FA80 +22A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_769E +ENCODING 30366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +F440 +97C0 +9440 +FFE0 +9440 +9920 +F7E0 +9100 +0100 +ENDCHAR +STARTCHAR U_769F +ENCODING 30367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +E100 +BFE0 +A440 +E7C0 +A440 +A7C0 +E440 +07C0 +0C60 +ENDCHAR +STARTCHAR U_76A0 +ENCODING 30368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +EFE0 +A500 +AFE0 +F900 +AFC0 +A900 +AFC0 +E900 +0FE0 +ENDCHAR +STARTCHAR U_76A1 +ENCODING 30369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4F80 +E880 +AF80 +A880 +EF80 +AA80 +B240 +FFE0 +0200 +0200 +ENDCHAR +STARTCHAR U_76A2 +ENCODING 30370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4FC0 +E200 +BFE0 +A880 +FDE0 +A000 +BFE0 +E480 +08A0 +1060 +ENDCHAR +STARTCHAR U_76A3 +ENCODING 30371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +E480 +BFC0 +AA40 +FFE0 +AA40 +BFE0 +E200 +1FE0 +0200 +ENDCHAR +STARTCHAR U_76A4 +ENCODING 30372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4920 +F540 +9FE0 +9540 +F920 +97E0 +9520 +F7E0 +9520 +07E0 +ENDCHAR +STARTCHAR U_76A5 +ENCODING 30373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4FC0 +E840 +AFC0 +A840 +EFC0 +A540 +A920 +FFE0 +0100 +0100 +ENDCHAR +STARTCHAR U_76A6 +ENCODING 30374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +5E80 +F2E0 +BFA0 +B2A0 +FFA0 +A8A0 +AEA0 +EA40 +AAA0 +1520 +ENDCHAR +STARTCHAR U_76A7 +ENCODING 30375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4E40 +EA80 +BFE0 +AD60 +F7C0 +A400 +A7C0 +EA80 +1380 +0C60 +ENDCHAR +STARTCHAR U_76A8 +ENCODING 30376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2480 +3F80 +FBE0 +AAA0 +FBE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_76A9 +ENCODING 30377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +97C0 +F440 +97C0 +F920 +2540 +FFE0 +2280 +32A0 +CCE0 +ENDCHAR +STARTCHAR U_76AA +ENCODING 30378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +5740 +FDE0 +AF40 +B540 +FFE0 +A100 +BFE0 +E580 +0940 +1120 +ENDCHAR +STARTCHAR U_76AB +ENCODING 30379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +EA80 +AFE0 +AAA0 +EFE0 +AA80 +ABE0 +EA80 +AB60 +1540 +ENDCHAR +STARTCHAR U_76AC +ENCODING 30380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +EFE0 +B5A0 +A640 +E900 +BFC0 +A900 +EFC0 +0900 +0FE0 +ENDCHAR +STARTCHAR U_76AD +ENCODING 30381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4540 +EFE0 +AAA0 +AFE0 +EA20 +AFE0 +AAA0 +EE60 +A920 +0E60 +ENDCHAR +STARTCHAR U_76AE +ENCODING 30382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +0200 +3FE0 +2240 +2200 +3F80 +2880 +2500 +2200 +4500 +98E0 +ENDCHAR +STARTCHAR U_76AF +ENCODING 30383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7C80 +5480 +5080 +7C80 +57E0 +5480 +5480 +4880 +9480 +A280 +ENDCHAR +STARTCHAR U_76B0 +ENCODING 30384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +AC20 +A3A0 +FAA0 +ABA0 +AA20 +92C0 +AA00 +C620 +81E0 +ENDCHAR +STARTCHAR U_76B1 +ENCODING 30385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +8AA0 +1280 +FBE0 +0A20 +FB20 +0AC0 +0A80 +FD40 +0A20 +ENDCHAR +STARTCHAR U_76B2 +ENCODING 30386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +8480 +23E0 +FEA0 +2280 +53E0 +FE40 +1340 +FE80 +1540 +1220 +ENDCHAR +STARTCHAR U_76B3 +ENCODING 30387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2880 +27E0 +FCA0 +2480 +ADC0 +7540 +6D40 +A480 +2940 +7620 +ENDCHAR +STARTCHAR U_76B4 +ENCODING 30388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4880 +F7E0 +4AA0 +A680 +3BE0 +6A40 +9340 +2A80 +4540 +8A20 +ENDCHAR +STARTCHAR U_76B5 +ENCODING 30389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +52A0 +FA80 +03E0 +F240 +9240 +F340 +9280 +F540 +9A20 +ENDCHAR +STARTCHAR U_76B6 +ENCODING 30390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +73E0 +AEA0 +7A80 +4BE0 +7B20 +4B40 +7A80 +E560 +0A40 +ENDCHAR +STARTCHAR U_76B7 +ENCODING 30391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +13E0 +7AA0 +0280 +7BC0 +4A40 +7B40 +5280 +3560 +CA40 +ENDCHAR +STARTCHAR U_76B8 +ENCODING 30392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +23E0 +FAA0 +AA80 +FBE0 +AB20 +FAA0 +2240 +FAA0 +2520 +ENDCHAR +STARTCHAR U_76B9 +ENCODING 30393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +7CA0 +57E0 +5080 +7BE0 +4AA0 +6BE0 +52A0 +6FE0 +4080 +8080 +ENDCHAR +STARTCHAR U_76BA +ENCODING 30394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +ABE0 +FAA0 +4AA0 +BA80 +43E0 +FE20 +AB40 +FA80 +4D40 +BA20 +ENDCHAR +STARTCHAR U_76BB +ENCODING 30395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3880 +2080 +FFE0 +AAA0 +FA80 +A3E0 +BE40 +AB40 +BA80 +AB40 +FE20 +ENDCHAR +STARTCHAR U_76BC +ENCODING 30396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +1080 +FFE0 +86A0 +7A80 +03C0 +7A40 +4B40 +7A80 +2D40 +FA20 +ENDCHAR +STARTCHAR U_76BD +ENCODING 30397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +BAA0 +8280 +FFE0 +4A20 +7A20 +4AA0 +7A40 +02A0 +FF20 +ENDCHAR +STARTCHAR U_76BE +ENCODING 30398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +13E0 +FEA0 +AE80 +FFE0 +4A40 +7B40 +4A80 +7B40 +CE20 +ENDCHAR +STARTCHAR U_76BF +ENCODING 30399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +7F80 +5280 +5280 +5280 +5280 +5280 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76C0 +ENCODING 30400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0500 +04C0 +0440 +0400 +0000 +3FC0 +2940 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C1 +ENCODING 30401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0880 +11C0 +1040 +2140 +C080 +3FC0 +2A40 +2A40 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_76C2 +ENCODING 30402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0200 +0200 +FFE0 +0200 +0A00 +0400 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C3 +ENCODING 30403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0400 +0A00 +3980 +C840 +0800 +7F80 +5280 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76C4 +ENCODING 30404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0880 +7F80 +4800 +FF80 +0880 +0980 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76C5 +ENCODING 30405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FC0 +2240 +2240 +3FC0 +0200 +0200 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C6 +ENCODING 30406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +1100 +2080 +DF60 +0900 +1500 +6200 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76C7 +ENCODING 30407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0A00 +1900 +2480 +C060 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76C8 +ENCODING 30408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +1080 +17E0 +1920 +2620 +4940 +BFC0 +2940 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76C9 +ENCODING 30409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +1500 +2480 +C060 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76CA +ENCODING 30410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +1100 +2080 +4040 +BFA0 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76CB +ENCODING 30411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0800 +1F80 +2880 +C700 +38E0 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76CC +ENCODING 30412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +4A40 +AAC0 +1220 +21E0 +C000 +3FC0 +2A40 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_76CD +ENCODING 30413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +1100 +7F80 +0040 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76CE +ENCODING 30414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2440 +FFE0 +0900 +3080 +C060 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76CF +ENCODING 30415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2400 +FF80 +1000 +FF80 +1140 +0E40 +F1C0 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76D0 +ENCODING 30416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +2200 +FB00 +22C0 +3A40 +E200 +0000 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76D1 +ENCODING 30417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +4A00 +4BE0 +4A00 +4C80 +4840 +0800 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76D2 +ENCODING 30418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1F00 +2080 +DF60 +1100 +1F00 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76D3 +ENCODING 30419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +4100 +2FE0 +4100 +C500 +4200 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76D4 +ENCODING 30420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +1A40 +2A80 +5500 +8880 +3060 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76D5 +ENCODING 30421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +1780 +4480 +1680 +25A0 +C8A0 +1060 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76D6 +ENCODING 30422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +0000 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_76D7 +ENCODING 30423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8800 +4FC0 +3240 +C200 +4500 +58C0 +0000 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76D8 +ENCODING 30424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1480 +1280 +7FE0 +1480 +2280 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76D9 +ENCODING 30425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +2480 +3F80 +2480 +3F80 +2480 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76DA +ENCODING 30426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0500 +FFC0 +2480 +1700 +1D00 +E480 +4C40 +7F80 +5280 +5280 +FFC0 +ENDCHAR +STARTCHAR U_76DB +ENCODING 30427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7FE0 +4200 +7A40 +4A80 +59A0 +8260 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76DC +ENCODING 30428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +17E0 +5920 +2140 +6280 +2440 +2820 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76DD +ENCODING 30429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0080 +3F80 +0080 +FFE0 +2540 +1480 +6460 +3FC0 +2940 +FFE0 +ENDCHAR +STARTCHAR U_76DE +ENCODING 30430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1400 +FF80 +1240 +FFC0 +0400 +FF80 +1240 +EFC0 +7F80 +5480 +FFC0 +ENDCHAR +STARTCHAR U_76DF +ENCODING 30431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +4BC0 +7A40 +04C0 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E0 +ENCODING 30432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +2100 +FFE0 +1480 +6B00 +1680 +6A60 +1600 +7FC0 +4940 +FFE0 +ENDCHAR +STARTCHAR U_76E1 +ENCODING 30433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0480 +FFE0 +0480 +FFE0 +5240 +8920 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E2 +ENCODING 30434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +AFE0 +F900 +A980 +FA40 +0420 +3FC0 +2A40 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_76E3 +ENCODING 30435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +F9E0 +8A00 +FA80 +A040 +FC00 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E4 +ENCODING 30436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +FA80 +AAE0 +AC00 +FBC0 +AA80 +A900 +1280 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E5 +ENCODING 30437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +C4C0 +9F40 +ECC0 +9640 +F5C0 +AC40 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E6 +ENCODING 30438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +64C0 +BF20 +0A00 +FFE0 +2A80 +3380 +2080 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E7 +ENCODING 30439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FC0 +5460 +5FC0 +5240 +5FC0 +9540 +FFE0 +ENDCHAR +STARTCHAR U_76E8 +ENCODING 30440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2200 +D7C0 +2540 +D6C0 +2540 +C7C0 +0820 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76E9 +ENCODING 30441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +13E0 +FE40 +2940 +FC80 +1140 +1220 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76EA +ENCODING 30442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +A880 +4F80 +2880 +CFE0 +5540 +6540 +0A80 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76EB +ENCODING 30443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +1100 +7FC0 +0A00 +3F80 +2A80 +7FC0 +4940 +FFE0 +ENDCHAR +STARTCHAR U_76EC +ENCODING 30444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F480 +9080 +F7E0 +A240 +FBC0 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76ED +ENCODING 30445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +A9E0 +FB40 +1140 +FD40 +2880 +FD40 +1220 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_76EE +ENCODING 30446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +FE +82 +82 +FE +82 +82 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_76EF +ENCODING 30447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F080 +9080 +F080 +9080 +9080 +F080 +9080 +F080 +9080 +0380 +ENDCHAR +STARTCHAR U_76F0 +ENCODING 30448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +F100 +9100 +9FE0 +F100 +9100 +F100 +9100 +0100 +ENDCHAR +STARTCHAR U_76F1 +ENCODING 30449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +9100 +F100 +9FE0 +9100 +F100 +9100 +F900 +9500 +0200 +ENDCHAR +STARTCHAR U_76F2 +ENCODING 30450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0000 +3F80 +2480 +3280 +2980 +2480 +3F80 +ENDCHAR +STARTCHAR U_76F3 +ENCODING 30451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +F400 +9400 +9400 +F400 +9400 +F400 +9400 +07C0 +ENDCHAR +STARTCHAR U_76F4 +ENCODING 30452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2080 +FFE0 +ENDCHAR +STARTCHAR U_76F5 +ENCODING 30453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F400 +97E0 +F800 +9780 +9080 +F100 +9200 +F420 +9420 +03E0 +ENDCHAR +STARTCHAR U_76F6 +ENCODING 30454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +F000 +9FE0 +9280 +F280 +9280 +9480 +F4A0 +8860 +1000 +ENDCHAR +STARTCHAR U_76F7 +ENCODING 30455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +F820 +9220 +9120 +F0A0 +9720 +F020 +9120 +00C0 +ENDCHAR +STARTCHAR U_76F8 +ENCODING 30456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7E20 +13E0 +1220 +3A20 +57E0 +9220 +1220 +13E0 +1220 +ENDCHAR +STARTCHAR U_76F9 +ENCODING 30457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +F100 +9520 +9520 +F7E0 +9100 +F120 +9120 +00E0 +ENDCHAR +STARTCHAR U_76FA +ENCODING 30458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +F780 +9400 +F400 +97E0 +9480 +F480 +9480 +F480 +9880 +1080 +ENDCHAR +STARTCHAR U_76FB +ENCODING 30459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9440 +F820 +9780 +9200 +F7C0 +9040 +F040 +9240 +0180 +ENDCHAR +STARTCHAR U_76FC +ENCODING 30460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F280 +9240 +F440 +9820 +97C0 +F240 +9240 +F240 +9440 +0980 +ENDCHAR +STARTCHAR U_76FD +ENCODING 30461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +E200 +AFC0 +E200 +A200 +BFE0 +E200 +0200 +0200 +ENDCHAR +STARTCHAR U_76FE +ENCODING 30462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2200 +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_76FF +ENCODING 30463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E200 +BFE0 +A880 +E880 +A500 +E500 +A200 +A500 +E8E0 +1040 +ENDCHAR +STARTCHAR U_7700 +ENCODING 30464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9220 +9220 +F3E0 +9220 +F220 +93E0 +9220 +F220 +04A0 +0840 +ENDCHAR +STARTCHAR U_7701 +ENCODING 30465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1480 +2560 +4620 +1F80 +3080 +DF80 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7702 +ENCODING 30466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +AF00 +A900 +E900 +AFE0 +E900 +A900 +A880 +EAA0 +AC60 +0820 +ENDCHAR +STARTCHAR U_7703 +ENCODING 30467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F000 +9000 +F000 +9FE0 +9100 +F100 +9200 +F440 +9FA0 +0420 +ENDCHAR +STARTCHAR U_7704 +ENCODING 30468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +9100 +F5E0 +9520 +9520 +F7E0 +9020 +F020 +9120 +00C0 +ENDCHAR +STARTCHAR U_7705 +ENCODING 30469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9400 +F7C0 +9540 +9540 +F540 +9540 +F480 +9940 +1220 +ENDCHAR +STARTCHAR U_7706 +ENCODING 30470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +BFE0 +A400 +E780 +A480 +E480 +A480 +A880 +EA80 +1100 +ENDCHAR +STARTCHAR U_7707 +ENCODING 30471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9540 +F520 +9520 +9900 +F120 +9040 +9080 +F300 +0C00 +ENDCHAR +STARTCHAR U_7708 +ENCODING 30472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97E0 +F520 +9520 +9180 +F180 +9280 +F4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7709 +ENCODING 30473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2220 +3FE0 +2000 +2FC0 +2840 +2FC0 +2840 +4FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_770A +ENCODING 30474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +91C0 +F700 +9100 +F1E0 +9700 +9120 +F120 +00E0 +ENDCHAR +STARTCHAR U_770B +ENCODING 30475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +7F80 +0800 +FFE0 +1080 +3F80 +5080 +9F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_770C +ENCODING 30476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +5080 +5F80 +5080 +5F80 +5080 +7FE0 +0400 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_770D +ENCODING 30477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F400 +9620 +F520 +94C0 +9440 +F4A0 +9520 +F600 +9400 +07E0 +ENDCHAR +STARTCHAR U_770E +ENCODING 30478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A000 +A000 +FFE0 +A100 +A100 +E940 +A920 +B120 +E500 +0200 +ENDCHAR +STARTCHAR U_770F +ENCODING 30479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AFC0 +EA40 +AA40 +FFE0 +A500 +A500 +E880 +1060 +2040 +ENDCHAR +STARTCHAR U_7710 +ENCODING 30480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F080 +9080 +F080 +9480 +94E0 +F480 +9480 +F480 +9480 +0FE0 +ENDCHAR +STARTCHAR U_7711 +ENCODING 30481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +9480 +FFE0 +92A0 +94A0 +F5A0 +9EA0 +F0A0 +9120 +0260 +ENDCHAR +STARTCHAR U_7712 +ENCODING 30482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F080 +97E0 +F4A0 +97E0 +94A0 +F7E0 +94A0 +F080 +9080 +0080 +ENDCHAR +STARTCHAR U_7713 +ENCODING 30483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F120 +97E0 +F500 +9540 +9540 +F540 +9480 +F6A0 +9560 +0220 +ENDCHAR +STARTCHAR U_7714 +ENCODING 30484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0000 +0600 +2480 +4440 +9500 +24C0 +4440 +0400 +ENDCHAR +STARTCHAR U_7715 +ENCODING 30485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +F820 +9100 +9680 +F100 +9640 +F080 +9100 +0600 +ENDCHAR +STARTCHAR U_7716 +ENCODING 30486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7C0 +9440 +F440 +9440 +F7C0 +9280 +9280 +F4A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_7717 +ENCODING 30487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F200 +97E0 +9820 +F7A0 +94A0 +F4A0 +97A0 +9020 +F0A0 +0040 +ENDCHAR +STARTCHAR U_7718 +ENCODING 30488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +5140 +3FC0 +D0A0 +1F80 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7719 +ENCODING 30489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +9440 +FFA0 +9020 +9000 +F7E0 +9420 +F420 +97E0 +0420 +ENDCHAR +STARTCHAR U_771A +ENCODING 30490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FC0 +4400 +3FC0 +0400 +FFE0 +1080 +1E80 +1780 +1080 +1F80 +ENDCHAR +STARTCHAR U_771B +ENCODING 30491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +97C0 +F100 +9FE0 +9100 +F380 +9540 +F920 +9120 +0100 +ENDCHAR +STARTCHAR U_771C +ENCODING 30492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +BFE0 +E200 +AFC0 +A700 +E680 +AA80 +B240 +E220 +0200 +ENDCHAR +STARTCHAR U_771D +ENCODING 30493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9420 +F000 +97E0 +9080 +F080 +9080 +F480 +9280 +0100 +ENDCHAR +STARTCHAR U_771E +ENCODING 30494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4040 +3FC0 +A100 +BF00 +A100 +BF00 +A100 +FFC0 +4100 +8080 +ENDCHAR +STARTCHAR U_771F +ENCODING 30495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +3F00 +2100 +3D00 +2F00 +2100 +FFC0 +1200 +6180 +ENDCHAR +STARTCHAR U_7720 +ENCODING 30496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +97E0 +F480 +9480 +97E0 +F480 +9480 +F4A0 +9660 +0420 +ENDCHAR +STARTCHAR U_7721 +ENCODING 30497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +EF00 +A900 +A900 +EFE0 +A900 +E900 +A880 +AAA0 +ED60 +08A0 +ENDCHAR +STARTCHAR U_7722 +ENCODING 30498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +CAC0 +3220 +7FE0 +A080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7723 +ENCODING 30499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F500 +97C0 +F900 +9100 +9FE0 +F100 +9100 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_7724 +ENCODING 30500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A840 +EFC0 +A800 +AA40 +EA80 +AB00 +AA20 +EA20 +11E0 +2000 +ENDCHAR +STARTCHAR U_7725 +ENCODING 30501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D60 +5180 +5520 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7726 +ENCODING 30502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +A280 +AAA0 +EBC0 +AA80 +AA80 +EA80 +AA80 +ABA0 +FEA0 +0860 +ENDCHAR +STARTCHAR U_7727 +ENCODING 30503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F120 +9120 +9220 +F4A0 +9840 +F7E0 +9420 +9420 +F420 +07E0 +ENDCHAR +STARTCHAR U_7728 +ENCODING 30504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +9100 +F080 +97E0 +9040 +F080 +9100 +F200 +9600 +09E0 +ENDCHAR +STARTCHAR U_7729 +ENCODING 30505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +9FE0 +F100 +9240 +97C0 +F080 +9100 +F240 +9FA0 +0420 +ENDCHAR +STARTCHAR U_772A +ENCODING 30506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +E920 +A920 +AAA0 +EA60 +AC20 +A820 +E8A0 +0840 +ENDCHAR +STARTCHAR U_772B +ENCODING 30507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +9540 +9FE0 +F100 +9100 +FFE0 +9100 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_772C +ENCODING 30508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E480 +A440 +BFE0 +E500 +A520 +E540 +A980 +A920 +EB20 +10E0 +ENDCHAR +STARTCHAR U_772D +ENCODING 30509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +F100 +9FE0 +9100 +F100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_772E +ENCODING 30510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +ABA0 +E820 +ABA0 +EAA0 +ABA0 +A820 +E820 +08A0 +0840 +ENDCHAR +STARTCHAR U_772F +ENCODING 30511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F520 +9540 +F100 +9FE0 +9100 +F380 +9540 +F920 +9120 +0100 +ENDCHAR +STARTCHAR U_7730 +ENCODING 30512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A200 +A280 +E440 +AFC0 +A100 +E100 +AFC0 +A100 +E100 +1FE0 +ENDCHAR +STARTCHAR U_7731 +ENCODING 30513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9100 +F7E0 +9120 +97E0 +F500 +97E0 +F120 +9280 +0C60 +ENDCHAR +STARTCHAR U_7732 +ENCODING 30514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +9240 +F3C0 +9240 +93C0 +F240 +92E0 +FF40 +9040 +0040 +ENDCHAR +STARTCHAR U_7733 +ENCODING 30515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +9440 +FA80 +9100 +9200 +F7E0 +9A20 +9220 +F3E0 +0220 +ENDCHAR +STARTCHAR U_7734 +ENCODING 30516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9820 +97A0 +F4A0 +97A0 +F4A0 +97A0 +9020 +F0A0 +0040 +ENDCHAR +STARTCHAR U_7735 +ENCODING 30517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +9440 +FA80 +9180 +9FE0 +F220 +9640 +9180 +F100 +0E00 +ENDCHAR +STARTCHAR U_7736 +ENCODING 30518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +97E0 +F480 +9480 +95C0 +F480 +9480 +97E0 +F400 +07E0 +ENDCHAR +STARTCHAR U_7737 +ENCODING 30519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +1080 +3FC0 +50A0 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7738 +ENCODING 30520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9240 +97E0 +F120 +9500 +97C0 +F900 +9100 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_7739 +ENCODING 30521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +9100 +F7C0 +9100 +9100 +FFE0 +9100 +9280 +F440 +0820 +ENDCHAR +STARTCHAR U_773A +ENCODING 30522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +9AA0 +F6C0 +9280 +96C0 +FAA0 +9280 +94A0 +F8A0 +1060 +ENDCHAR +STARTCHAR U_773B +ENCODING 30523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +9FE0 +F100 +9100 +97C0 +F100 +9100 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_773C +ENCODING 30524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9500 +F520 +9540 +9480 +F540 +0620 +ENDCHAR +STARTCHAR U_773D +ENCODING 30525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +ABE0 +EA80 +AAA0 +AAC0 +EA80 +AA80 +AAC0 +EB20 +1220 +ENDCHAR +STARTCHAR U_773E +ENCODING 30526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7FC0 +0180 +7E00 +2480 +2480 +5540 +8E20 +0400 +ENDCHAR +STARTCHAR U_773F +ENCODING 30527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EF00 +A100 +E140 +BD80 +E580 +A540 +A940 +F160 +A540 +0200 +ENDCHAR +STARTCHAR U_7740 +ENCODING 30528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0800 +FFE0 +1080 +3E80 +5780 +9080 +1F80 +ENDCHAR +STARTCHAR U_7741 +ENCODING 30529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9480 +F7C0 +9140 +9FE0 +F140 +97C0 +9100 +F500 +0200 +ENDCHAR +STARTCHAR U_7742 +ENCODING 30530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C40 +E340 +1C40 +E340 +3FE0 +2840 +2FC0 +2840 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_7743 +ENCODING 30531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9440 +9FE0 +F2A0 +9440 +FA20 +93C0 +9680 +F900 +0280 +0C60 +ENDCHAR +STARTCHAR U_7744 +ENCODING 30532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9520 +9540 +F7E0 +9420 +97E0 +F420 +97E0 +9420 +F420 +04E0 +ENDCHAR +STARTCHAR U_7745 +ENCODING 30533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9000 +F7C0 +9100 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_7746 +ENCODING 30534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9820 +F7C0 +9000 +9000 +FFE0 +9280 +92A0 +F4A0 +0860 +ENDCHAR +STARTCHAR U_7747 +ENCODING 30535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +9FE0 +F120 +97E0 +F500 +97E0 +9320 +F5E0 +9900 +0100 +ENDCHAR +STARTCHAR U_7748 +ENCODING 30536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E000 +AFE0 +A100 +E100 +A7C0 +A100 +E100 +1FE0 +ENDCHAR +STARTCHAR U_7749 +ENCODING 30537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E200 +AA80 +AA80 +EA80 +B740 +E200 +AFC0 +A200 +E200 +1FE0 +ENDCHAR +STARTCHAR U_774A +ENCODING 30538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F000 +97E0 +9420 +F7E0 +9420 +F7E0 +9420 +04E0 +ENDCHAR +STARTCHAR U_774B +ENCODING 30539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9EA0 +9280 +FFE0 +9280 +93A0 +F6A0 +9AC0 +F2A0 +9360 +0420 +ENDCHAR +STARTCHAR U_774C +ENCODING 30540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93C0 +9440 +FFE0 +9520 +9520 +F7E0 +9280 +F2A0 +94A0 +1860 +ENDCHAR +STARTCHAR U_774D +ENCODING 30541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9440 +F7C0 +9280 +F2A0 +94A0 +1860 +ENDCHAR +STARTCHAR U_774E +ENCODING 30542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F660 +9180 +9660 +F100 +9FE0 +9280 +FFE0 +94A0 +F4A0 +94E0 +0080 +ENDCHAR +STARTCHAR U_774F +ENCODING 30543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +A920 +EFE0 +A920 +ABA0 +ED60 +A920 +A920 +EFE0 +0820 +ENDCHAR +STARTCHAR U_7750 +ENCODING 30544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9100 +9540 +F380 +9FE0 +F100 +9380 +9540 +F920 +0100 +ENDCHAR +STARTCHAR U_7751 +ENCODING 30545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9280 +9440 +FBA0 +9000 +FA40 +9540 +9540 +F080 +0FE0 +ENDCHAR +STARTCHAR U_7752 +ENCODING 30546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9520 +9540 +FA80 +9540 +9920 +F540 +9980 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_7753 +ENCODING 30547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +E280 +AFE0 +EAA0 +AFE0 +EAA0 +AAA0 +BFE0 +E440 +0820 +1020 +ENDCHAR +STARTCHAR U_7754 +ENCODING 30548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E280 +A440 +EBA0 +A000 +AFE0 +EAA0 +AFE0 +EAA0 +AAA0 +0860 +ENDCHAR +STARTCHAR U_7755 +ENCODING 30549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A820 +E400 +A7E0 +A8A0 +F5A0 +A2E0 +E480 +A8A0 +1060 +ENDCHAR +STARTCHAR U_7756 +ENCODING 30550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +9440 +9A20 +F3C0 +9680 +F900 +9280 +1C60 +ENDCHAR +STARTCHAR U_7757 +ENCODING 30551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9200 +F7E0 +9AA0 +94A0 +F920 +0240 +ENDCHAR +STARTCHAR U_7758 +ENCODING 30552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +FFE0 +2080 +3F80 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_7759 +ENCODING 30553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +9420 +F7E0 +9540 +9520 +F7E0 +9500 +F900 +9280 +0C60 +ENDCHAR +STARTCHAR U_775A +ENCODING 30554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +9480 +F7E0 +9480 +97E0 +F480 +97E0 +F480 +0880 +17E0 +ENDCHAR +STARTCHAR U_775B +ENCODING 30555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +F7C0 +9100 +9FE0 +F440 +97C0 +F440 +97C0 +0440 +ENDCHAR +STARTCHAR U_775C +ENCODING 30556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9A20 +9540 +F7C0 +9140 +9FE0 +F140 +97C0 +9100 +F500 +0200 +ENDCHAR +STARTCHAR U_775D +ENCODING 30557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +7EA0 +3920 +D660 +0000 +3FC0 +24C0 +2940 +3240 +3FC0 +ENDCHAR +STARTCHAR U_775E +ENCODING 30558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9540 +F540 +9BA0 +9120 +F100 +9380 +F540 +9920 +1120 +ENDCHAR +STARTCHAR U_775F +ENCODING 30559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9440 +F6C0 +9AA0 +9AA0 +F100 +9FE0 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_7760 +ENCODING 30560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +AA80 +AFE0 +E200 +AFE0 +A840 +F7A0 +A480 +A5A0 +E420 +07E0 +ENDCHAR +STARTCHAR U_7761 +ENCODING 30561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9FE0 +F540 +9540 +9FE0 +F540 +9540 +9FE0 +F100 +07C0 +ENDCHAR +STARTCHAR U_7762 +ENCODING 30562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F500 +9480 +97E0 +FC80 +97E0 +9480 +F480 +97E0 +9480 +F480 +07E0 +ENDCHAR +STARTCHAR U_7763 +ENCODING 30563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +1120 +FD40 +5880 +5540 +B220 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7764 +ENCODING 30564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +97C0 +F540 +97C0 +9000 +FFE0 +9280 +9280 +F480 +0880 +ENDCHAR +STARTCHAR U_7765 +ENCODING 30565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9520 +F7E0 +9520 +97E0 +F280 +9480 +FFE0 +9080 +0080 +ENDCHAR +STARTCHAR U_7766 +ENCODING 30566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +9440 +9820 +F100 +97C0 +F100 +9100 +0FE0 +ENDCHAR +STARTCHAR U_7767 +ENCODING 30567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9480 +97E0 +F480 +9560 +9620 +F7E0 +9420 +F7E0 +9420 +07E0 +ENDCHAR +STARTCHAR U_7768 +ENCODING 30568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +ACE0 +A820 +EEE0 +A820 +AFE0 +E280 +A280 +A2A0 +E4A0 +1860 +ENDCHAR +STARTCHAR U_7769 +ENCODING 30569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +97C0 +F040 +9FE0 +9940 +F580 +9340 +F520 +9920 +0300 +ENDCHAR +STARTCHAR U_776A +ENCODING 30570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +1100 +7FC0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_776B +ENCODING 30571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9140 +FFE0 +9140 +97C0 +F100 +95E0 +F500 +9B00 +10E0 +ENDCHAR +STARTCHAR U_776C +ENCODING 30572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F720 +9920 +F4C0 +9100 +9FE0 +F100 +9380 +F540 +0920 +1120 +ENDCHAR +STARTCHAR U_776D +ENCODING 30573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A920 +ABA0 +E920 +AFE0 +A820 +EBA0 +AAA0 +ABA0 +E820 +10E0 +ENDCHAR +STARTCHAR U_776E +ENCODING 30574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +E440 +AFA0 +B000 +EEA0 +AAA0 +EEA0 +AAA0 +AEA0 +EA20 +0AE0 +ENDCHAR +STARTCHAR U_776F +ENCODING 30575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +89E0 +FB40 +9140 +FC80 +C960 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7770 +ENCODING 30576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +E200 +BFE0 +A200 +E7C0 +AC40 +B440 +E7C0 +0440 +ENDCHAR +STARTCHAR U_7771 +ENCODING 30577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AA20 +AA20 +EEE0 +A800 +EFE0 +A920 +AEA0 +E8C0 +0940 +0A20 +ENDCHAR +STARTCHAR U_7772 +ENCODING 30578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9500 +F7C0 +9900 +97C0 +F100 +0FE0 +ENDCHAR +STARTCHAR U_7773 +ENCODING 30579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A500 +AA80 +F7E0 +A200 +FFC0 +A200 +AF80 +E200 +1FE0 +ENDCHAR +STARTCHAR U_7774 +ENCODING 30580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +B220 +AFC0 +E200 +AFC0 +AA40 +EFC0 +AA40 +BFE0 +E200 +0200 +ENDCHAR +STARTCHAR U_7775 +ENCODING 30581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +E4C0 +BEA0 +A480 +FFE0 +A0A0 +EEA0 +AAC0 +AEA0 +E160 +0620 +ENDCHAR +STARTCHAR U_7776 +ENCODING 30582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +BFE0 +E480 +A840 +F7A0 +A480 +A780 +E480 +0780 +ENDCHAR +STARTCHAR U_7777 +ENCODING 30583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FD40 +A7E0 +E940 +B3C0 +BD00 +E7C0 +A900 +BBE0 +ED00 +13E0 +ENDCHAR +STARTCHAR U_7778 +ENCODING 30584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E920 +AFE0 +E800 +ABE0 +EA20 +ABE0 +AA20 +EBE0 +1220 +23E0 +ENDCHAR +STARTCHAR U_7779 +ENCODING 30585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +FF40 +9280 +9FE0 +F100 +97C0 +9C40 +F7C0 +9440 +F7C0 +0440 +ENDCHAR +STARTCHAR U_777A +ENCODING 30586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E780 +A880 +FFE0 +AA00 +ABC0 +EC80 +AFE0 +A980 +EA40 +0C20 +ENDCHAR +STARTCHAR U_777B +ENCODING 30587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFE0 +A820 +B7C0 +E000 +A7C0 +E440 +A7C0 +A440 +E7C0 +9FE0 +ENDCHAR +STARTCHAR U_777C +ENCODING 30588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9000 +FFE0 +9500 +95E0 +FB00 +11E0 +ENDCHAR +STARTCHAR U_777D +ENCODING 30589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +92A0 +9A40 +F440 +9BA0 +9100 +FFE0 +9100 +9280 +F440 +1820 +ENDCHAR +STARTCHAR U_777E +ENCODING 30590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +4940 +7FC0 +0400 +7FC0 +0400 +FFE0 +1100 +FFE0 +0400 +ENDCHAR +STARTCHAR U_777F +ENCODING 30591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +50A0 +AF40 +5080 +3FC0 +50A0 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7780 +ENCODING 30592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +3480 +5140 +9220 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7781 +ENCODING 30593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +9440 +F7C0 +9140 +9FE0 +F280 +0C60 +ENDCHAR +STARTCHAR U_7782 +ENCODING 30594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +9120 +FFE0 +9100 +B900 +A9C0 +BA40 +AB40 +BC80 +A940 +BA20 +ENDCHAR +STARTCHAR U_7783 +ENCODING 30595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A880 +AFE0 +E880 +ABE0 +AA20 +EBE0 +AA20 +ABE0 +EA20 +13E0 +ENDCHAR +STARTCHAR U_7784 +ENCODING 30596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +9FE0 +F240 +97E0 +9520 +F520 +97E0 +9520 +F520 +07E0 +ENDCHAR +STARTCHAR U_7785 +ENCODING 30597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE40 +A440 +A560 +FF40 +A540 +A640 +ED40 +B440 +E440 +A4A0 +0520 +ENDCHAR +STARTCHAR U_7786 +ENCODING 30598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +BFE0 +E000 +A7C0 +E440 +A540 +A540 +E280 +0C60 +ENDCHAR +STARTCHAR U_7787 +ENCODING 30599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2A0 +AAA0 +A9C0 +E080 +BFE0 +A880 +E9C0 +AAA0 +AC80 +E800 +17E0 +ENDCHAR +STARTCHAR U_7788 +ENCODING 30600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AA40 +B4A0 +EF40 +A000 +AEE0 +EAA0 +A660 +AAA0 +F320 +0660 +ENDCHAR +STARTCHAR U_7789 +ENCODING 30601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +FD40 +8540 +7A20 +03E0 +7940 +4940 +7880 +4940 +7A20 +ENDCHAR +STARTCHAR U_778A +ENCODING 30602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +ABC0 +E940 +AFE0 +E940 +ABC0 +A900 +F7C0 +9440 +27C0 +ENDCHAR +STARTCHAR U_778B +ENCODING 30603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +9440 +9740 +F5C0 +9440 +9FE0 +F280 +0C60 +ENDCHAR +STARTCHAR U_778C +ENCODING 30604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A100 +EFE0 +A440 +AFE0 +E000 +AFE0 +AAA0 +EAA0 +1FE0 +ENDCHAR +STARTCHAR U_778D +ENCODING 30605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +ADE0 +A920 +EFE0 +A920 +AFE0 +E100 +AFE0 +A480 +E300 +1CE0 +ENDCHAR +STARTCHAR U_778E +ENCODING 30606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A920 +E7C0 +A100 +A7C0 +E100 +AFE0 +A440 +E440 +07C0 +ENDCHAR +STARTCHAR U_778F +ENCODING 30607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +3F80 +0400 +FFE0 +2080 +3FA0 +5540 +98E0 +ENDCHAR +STARTCHAR U_7790 +ENCODING 30608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +6500 +5300 +4900 +7F00 +0000 +F780 +9480 +F780 +9480 +F780 +ENDCHAR +STARTCHAR U_7791 +ENCODING 30609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +AFE0 +E440 +A7C0 +A440 +E7C0 +A100 +AFE0 +E280 +0C60 +ENDCHAR +STARTCHAR U_7792 +ENCODING 30610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +A280 +EFE0 +A280 +AFE0 +EAA0 +AAA0 +AD60 +E820 +0860 +ENDCHAR +STARTCHAR U_7793 +ENCODING 30611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +FEA0 +A2A0 +FEA0 +A2A0 +FEA0 +B6A0 +BEA0 +E2A0 +0420 +0820 +ENDCHAR +STARTCHAR U_7794 +ENCODING 30612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFC0 +A100 +E7C0 +A100 +BFE0 +E540 +A6C0 +A540 +E7C0 +0C60 +ENDCHAR +STARTCHAR U_7795 +ENCODING 30613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9280 +F100 +9FE0 +9440 +F7C0 +9440 +9FE0 +F100 +0100 +ENDCHAR +STARTCHAR U_7796 +ENCODING 30614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +B940 +D220 +B9C0 +A880 +FB60 +1F00 +1500 +1B00 +1500 +1F00 +ENDCHAR +STARTCHAR U_7797 +ENCODING 30615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97C0 +9440 +F7C0 +9440 +F7E0 +9400 +97E0 +F520 +9AA0 +0AC0 +ENDCHAR +STARTCHAR U_7798 +ENCODING 30616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A800 +ABC0 +EA40 +ABC0 +A800 +EEE0 +AAA0 +AEE0 +E800 +0FE0 +ENDCHAR +STARTCHAR U_7799 +ENCODING 30617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +F7C0 +9440 +97C0 +F440 +9FE0 +F280 +9440 +0820 +ENDCHAR +STARTCHAR U_779A +ENCODING 30618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A820 +EBA0 +A100 +A7C0 +E540 +A7C0 +A540 +E7C0 +1860 +ENDCHAR +STARTCHAR U_779B +ENCODING 30619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +A940 +B2A0 +E4A0 +A800 +B880 +EA80 +AAE0 +AA80 +ED80 +08E0 +ENDCHAR +STARTCHAR U_779C +ENCODING 30620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +FFE0 +9540 +9FE0 +F920 +9FE0 +F480 +9300 +1CE0 +ENDCHAR +STARTCHAR U_779D +ENCODING 30621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +A540 +E6C0 +A540 +A7C0 +E100 +AFE0 +AAA0 +EFA0 +0860 +ENDCHAR +STARTCHAR U_779E +ENCODING 30622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +A440 +E7C0 +A100 +AFE0 +E920 +ADA0 +AB60 +EDA0 +0960 +ENDCHAR +STARTCHAR U_779F +ENCODING 30623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A000 +E7C0 +A000 +AFE0 +E540 +1B20 +ENDCHAR +STARTCHAR U_77A0 +ENCODING 30624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +F820 +97C0 +9440 +F7C0 +9100 +F7C0 +9100 +0FE0 +ENDCHAR +STARTCHAR U_77A1 +ENCODING 30625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EBC0 +AA40 +BFC0 +EA40 +ABC0 +BE40 +EA40 +AFC0 +A9A0 +F2A0 +2460 +ENDCHAR +STARTCHAR U_77A2 +ENCODING 30626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4940 +FFE0 +A0A0 +3E80 +2780 +2080 +3F80 +ENDCHAR +STARTCHAR U_77A3 +ENCODING 30627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +E7C0 +A540 +E7C0 +A100 +AFE0 +E920 +AFE0 +A540 +ECA0 +17A0 +ENDCHAR +STARTCHAR U_77A4 +ENCODING 30628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AFE0 +E920 +ABA0 +A920 +EFE0 +A820 +0860 +ENDCHAR +STARTCHAR U_77A5 +ENCODING 30629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FDE0 +9740 +BC80 +D540 +9620 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_77A6 +ENCODING 30630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +A100 +A7C0 +E440 +A7C0 +E280 +BFE0 +A440 +E440 +07C0 +ENDCHAR +STARTCHAR U_77A7 +ENCODING 30631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +A900 +BFE0 +E900 +AFC0 +A900 +EFC0 +A900 +AFE0 +E540 +0AA0 +ENDCHAR +STARTCHAR U_77A8 +ENCODING 30632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAA0 +A6C0 +AFE0 +E280 +AFE0 +A100 +E7C0 +A100 +AFE0 +E280 +0C60 +ENDCHAR +STARTCHAR U_77A9 +ENCODING 30633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +AFE0 +E900 +AFE0 +E920 +AFE0 +A900 +EFE0 +1960 +2BA0 +ENDCHAR +STARTCHAR U_77AA +ENCODING 30634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EF40 +AAA0 +A440 +EBA0 +B000 +A7C0 +E440 +A7C0 +A440 +E280 +1FE0 +ENDCHAR +STARTCHAR U_77AB +ENCODING 30635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +9FE0 +FAA0 +9FE0 +9440 +F7C0 +9440 +FFE0 +9100 +0100 +ENDCHAR +STARTCHAR U_77AC +ENCODING 30636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +AF20 +A540 +EFE0 +A820 +A440 +EFE0 +B240 +AFE0 +E840 +1040 +ENDCHAR +STARTCHAR U_77AD +ENCODING 30637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +9AA0 +F440 +97C0 +9C60 +F7C0 +9440 +97C0 +F540 +0B20 +ENDCHAR +STARTCHAR U_77AE +ENCODING 30638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AA80 +EFE0 +A120 +AEA0 +EAA0 +AE40 +AA40 +EEA0 +0B20 +ENDCHAR +STARTCHAR U_77AF +ENCODING 30639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AFE0 +EAA0 +ABA0 +AAA0 +EBA0 +ACA0 +0860 +ENDCHAR +STARTCHAR U_77B0 +ENCODING 30640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +A480 +BFE0 +EAA0 +AFA0 +AAA0 +EEA0 +AAA0 +BF40 +E2A0 +0320 +ENDCHAR +STARTCHAR U_77B1 +ENCODING 30641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +9FE0 +9480 +FFE0 +9540 +9FE0 +F540 +9FE0 +F100 +9FE0 +0100 +ENDCHAR +STARTCHAR U_77B2 +ENCODING 30642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A280 +AFE0 +E520 +A900 +AFE0 +EAA0 +AFE0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_77B3 +ENCODING 30643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A280 +E100 +BFE0 +A540 +E7C0 +A540 +AFE0 +E100 +1FE0 +ENDCHAR +STARTCHAR U_77B4 +ENCODING 30644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E800 +AFE0 +B540 +E540 +BFE0 +A540 +E540 +BFE0 +A540 +EAA0 +12A0 +ENDCHAR +STARTCHAR U_77B5 +ENCODING 30645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A540 +BFE0 +E540 +A920 +A540 +EFE0 +BB40 +A5E0 +E840 +1040 +ENDCHAR +STARTCHAR U_77B6 +ENCODING 30646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9540 +FFE0 +9440 +97C0 +F440 +97C0 +9440 +F7C0 +0C60 +ENDCHAR +STARTCHAR U_77B7 +ENCODING 30647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +ABA0 +EAA0 +ABA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_77B8 +ENCODING 30648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +A480 +EA80 +BFE0 +EA80 +AFC0 +A200 +FFE0 +0A80 +3260 +ENDCHAR +STARTCHAR U_77B9 +ENCODING 30649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +EE20 +A540 +FFE0 +AAC0 +F7A0 +A400 +A7C0 +EA80 +1300 +0CE0 +ENDCHAR +STARTCHAR U_77BA +ENCODING 30650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +BFC0 +E020 +AFE0 +AAA0 +EFE0 +A440 +A7C0 +E440 +07C0 +ENDCHAR +STARTCHAR U_77BB +ENCODING 30651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A480 +AFE0 +FAA0 +AFE0 +A800 +EBC0 +A800 +AFE0 +F420 +27E0 +ENDCHAR +STARTCHAR U_77BC +ENCODING 30652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +AFC0 +F020 +AEE0 +AAA0 +EEE0 +A000 +A440 +EAA0 +1120 +ENDCHAR +STARTCHAR U_77BD +ENCODING 30653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +F880 +8BC0 +F940 +50A0 +FF80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_77BE +ENCODING 30654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4E40 +FFE0 +90A0 +6FC0 +0400 +7FE0 +ENDCHAR +STARTCHAR U_77BF +ENCODING 30655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +2200 +7FE0 +A200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_77C0 +ENCODING 30656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FA80 +AF80 +F0E0 +AFA0 +E0A0 +AEA0 +AB40 +EAC0 +3120 +2220 +ENDCHAR +STARTCHAR U_77C1 +ENCODING 30657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E80 +E4A0 +BFC0 +AE80 +ED80 +B540 +E620 +A140 +A520 +F440 +13C0 +ENDCHAR +STARTCHAR U_77C2 +ENCODING 30658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E000 +AEE0 +AAA0 +EEE0 +A100 +AFE0 +E540 +1920 +ENDCHAR +STARTCHAR U_77C3 +ENCODING 30659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +AAA0 +B740 +EFE0 +AAA0 +FFE0 +A000 +AFE0 +E100 +0300 +ENDCHAR +STARTCHAR U_77C4 +ENCODING 30660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A100 +BFE0 +EAA0 +AFE0 +A100 +EFC0 +A100 +BFE0 +E540 +0AA0 +ENDCHAR +STARTCHAR U_77C5 +ENCODING 30661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +A660 +EAA0 +A7E0 +EC80 +B7C0 +A480 +E7C0 +0480 +07E0 +ENDCHAR +STARTCHAR U_77C6 +ENCODING 30662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EFE0 +A500 +EFE0 +B900 +EFC0 +A900 +AFE0 +E440 +0380 +0C60 +ENDCHAR +STARTCHAR U_77C7 +ENCODING 30663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AFE0 +A480 +EFE0 +A820 +AFE0 +EA40 +B580 +AB80 +E540 +0A20 +ENDCHAR +STARTCHAR U_77C8 +ENCODING 30664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E7C0 +A440 +E7C0 +A100 +AFE0 +F4A0 +AFE0 +A240 +E240 +04C0 +ENDCHAR +STARTCHAR U_77C9 +ENCODING 30665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A820 +E7C0 +A540 +A7C0 +FC40 +A7C0 +A440 +E7C0 +0C60 +ENDCHAR +STARTCHAR U_77CA +ENCODING 30666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +A5E0 +AB20 +FDE0 +AB20 +BDE0 +E280 +A7E0 +AAA0 +F6A0 +0080 +ENDCHAR +STARTCHAR U_77CB +ENCODING 30667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EA80 +AFE0 +EA80 +AFC0 +ED40 +AFC0 +AD40 +EFE0 +1920 +2BA0 +ENDCHAR +STARTCHAR U_77CC +ENCODING 30668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +AA40 +EFE0 +AA40 +AFE0 +ED40 +AFC0 +B540 +E7C0 +0C60 +ENDCHAR +STARTCHAR U_77CD +ENCODING 30669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7FC0 +2200 +7FC0 +A200 +3FC0 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_77CE +ENCODING 30670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A880 +BFE0 +EAA0 +AFE0 +A440 +E7C0 +A7C0 +AC80 +E300 +1CE0 +ENDCHAR +STARTCHAR U_77CF +ENCODING 30671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97C0 +9440 +F7C0 +9440 +9FE0 +F4A0 +9FE0 +F3C0 +9440 +08C0 +ENDCHAR +STARTCHAR U_77D0 +ENCODING 30672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A100 +AFE0 +E920 +AAA0 +A500 +EFE0 +B500 +A7C0 +E500 +07E0 +ENDCHAR +STARTCHAR U_77D1 +ENCODING 30673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +E100 +AFE0 +E920 +AB80 +E940 +AFC0 +F540 +9FE0 +2AA0 +5FE0 +ENDCHAR +STARTCHAR U_77D2 +ENCODING 30674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A280 +EFE0 +AAA0 +FFE0 +A7C0 +A440 +E7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_77D3 +ENCODING 30675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BF80 +AAE0 +E420 +BFE0 +AA80 +EEE0 +AA80 +AEE0 +EAA0 +0AE0 +ENDCHAR +STARTCHAR U_77D4 +ENCODING 30676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +9EE0 +FAA0 +9FE0 +9500 +FFE0 +9500 +F7C0 +9500 +07E0 +ENDCHAR +STARTCHAR U_77D5 +ENCODING 30677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F40 +A0A0 +4E40 +F0E0 +5F40 +AAA0 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_77D6 +ENCODING 30678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +E000 +AEE0 +EBA0 +AFE0 +EA80 +AFE0 +EAA0 +8FE0 +1480 +27E0 +ENDCHAR +STARTCHAR U_77D7 +ENCODING 30679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3280 +2980 +2480 +FFE0 +4A40 +6B40 +5AC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_77D8 +ENCODING 30680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AFE0 +AAA0 +EFE0 +AAA0 +AFE0 +E100 +AFE0 +A100 +EFE0 +0AA0 +ENDCHAR +STARTCHAR U_77D9 +ENCODING 30681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AAE0 +AF20 +EAE0 +AF60 +AAA0 +EF60 +0A60 +ENDCHAR +STARTCHAR U_77DA +ENCODING 30682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A820 +AFE0 +EA80 +AFE0 +AAA0 +EFE0 +AAA0 +ABE0 +F0A0 +27E0 +ENDCHAR +STARTCHAR U_77DB +ENCODING 30683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +0100 +1A00 +0400 +FFC0 +0C80 +1500 +2400 +4400 +8400 +1C00 +ENDCHAR +STARTCHAR U_77DC +ENCODING 30684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +2940 +1140 +FE20 +1500 +3080 +57E0 +9040 +1040 +1080 +7080 +ENDCHAR +STARTCHAR U_77DD +ENCODING 30685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +1100 +6280 +2640 +F920 +2FC0 +6040 +A480 +2300 +2100 +6100 +ENDCHAR +STARTCHAR U_77DE +ENCODING 30686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0500 +FFE0 +1240 +2200 +FFC0 +5140 +6EC0 +4A40 +4E40 +40C0 +ENDCHAR +STARTCHAR U_77DF +ENCODING 30687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +54A0 +22C0 +FFE0 +2420 +27E0 +6420 +A7E0 +2420 +2420 +6460 +ENDCHAR +STARTCHAR U_77E0 +ENCODING 30688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +5140 +27E0 +F940 +2FE0 +2800 +63E0 +A220 +23E0 +2220 +E3E0 +ENDCHAR +STARTCHAR U_77E1 +ENCODING 30689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +5EE0 +2500 +F7E0 +2900 +3FE0 +6900 +AFE0 +2240 +67E0 +ENDCHAR +STARTCHAR U_77E2 +ENCODING 30690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +7FC0 +4400 +8400 +FFE0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_77E3 +ENCODING 30691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +7E80 +2000 +3F80 +4400 +FFC0 +0400 +0A00 +31C0 +C080 +ENDCHAR +STARTCHAR U_77E4 +ENCODING 30692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1200 +17E0 +F900 +8100 +FFE0 +1100 +1280 +1280 +A440 +4820 +ENDCHAR +STARTCHAR U_77E5 +ENCODING 30693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2000 +7DE0 +9120 +1120 +FF20 +1120 +1120 +2920 +45E0 +8000 +ENDCHAR +STARTCHAR U_77E6 +ENCODING 30694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +C800 +5FC0 +6200 +7FE0 +4500 +8880 +B060 +ENDCHAR +STARTCHAR U_77E7 +ENCODING 30695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47A0 +40A0 +78A0 +A3A0 +2220 +FBA0 +20A0 +30A0 +28A0 +44A0 +8320 +ENDCHAR +STARTCHAR U_77E8 +ENCODING 30696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4380 +7880 +A080 +27E0 +F880 +2080 +3140 +2A40 +4420 +8820 +ENDCHAR +STARTCHAR U_77E9 +ENCODING 30697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43E0 +7E00 +9200 +13E0 +FE20 +1220 +2BE0 +2A00 +4A00 +83E0 +ENDCHAR +STARTCHAR U_77EA +ENCODING 30698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +7A40 +A340 +2240 +FFE0 +2340 +22C0 +5240 +4440 +88C0 +ENDCHAR +STARTCHAR U_77EB +ENCODING 30699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7100 +AFE0 +2240 +FC20 +2240 +2240 +5240 +5440 +8840 +ENDCHAR +STARTCHAR U_77EC +ENCODING 30700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7D40 +9540 +13A0 +F900 +1100 +17C0 +2900 +4500 +8FE0 +ENDCHAR +STARTCHAR U_77ED +ENCODING 30701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4000 +77C0 +A440 +2440 +F7C0 +2000 +2440 +5280 +4080 +8FE0 +ENDCHAR +STARTCHAR U_77EE +ENCODING 30702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +AFE0 +2540 +F920 +2100 +2FE0 +5240 +4980 +8660 +ENDCHAR +STARTCHAR U_77EF +ENCODING 30703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +7FE0 +A440 +2BA0 +F280 +2FE0 +2820 +3BA0 +4AA0 +8BE0 +ENDCHAR +STARTCHAR U_77F0 +ENCODING 30704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +4240 +7FE0 +AAA0 +2FE0 +F000 +27C0 +2440 +37C0 +4C40 +87C0 +ENDCHAR +STARTCHAR U_77F1 +ENCODING 30705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +A7E0 +2480 +FFE0 +2480 +27E0 +3240 +4980 +8660 +ENDCHAR +STARTCHAR U_77F2 +ENCODING 30706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +7FE0 +A480 +2AE0 +FE80 +2AE0 +2EA0 +2AC0 +5E80 +8AE0 +ENDCHAR +STARTCHAR U_77F3 +ENCODING 30707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0800 +1000 +3FC0 +5040 +9040 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_77F4 +ENCODING 30708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +2080 +4080 +7880 +C880 +4880 +4880 +7880 +4A80 +0100 +ENDCHAR +STARTCHAR U_77F5 +ENCODING 30709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0040 +F840 +2240 +2240 +7A40 +4A40 +CA40 +4A40 +7A40 +4940 +0080 +ENDCHAR +STARTCHAR U_77F6 +ENCODING 30710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2480 +2480 +7480 +D480 +5480 +5480 +74A0 +08A0 +30E0 +ENDCHAR +STARTCHAR U_77F7 +ENCODING 30711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2040 +2080 +2080 +7880 +CFE0 +4880 +4880 +7C80 +4A80 +0100 +ENDCHAR +STARTCHAR U_77F8 +ENCODING 30712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +2080 +4080 +7FE0 +C880 +4880 +4880 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_77F9 +ENCODING 30713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2280 +2280 +7A80 +4A80 +CA80 +4A80 +4A80 +7AA0 +04A0 +0860 +ENDCHAR +STARTCHAR U_77FA +ENCODING 30714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +2700 +2100 +2100 +79E0 +CF00 +4900 +4900 +7920 +4920 +00E0 +ENDCHAR +STARTCHAR U_77FB +ENCODING 30715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +4400 +7BC0 +C880 +4900 +4900 +7A20 +4A20 +01E0 +ENDCHAR +STARTCHAR U_77FC +ENCODING 30716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2080 +2080 +4080 +7880 +C880 +4880 +4880 +7880 +4880 +07E0 +ENDCHAR +STARTCHAR U_77FD +ENCODING 30717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +21E0 +4220 +7420 +DA40 +5140 +5080 +7080 +5100 +0600 +ENDCHAR +STARTCHAR U_77FE +ENCODING 30718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +2480 +2480 +7480 +5680 +D580 +5480 +5480 +74A0 +08A0 +1060 +ENDCHAR +STARTCHAR U_77FF +ENCODING 30719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +27E0 +2400 +7400 +5400 +D400 +5400 +5400 +7400 +0800 +1000 +ENDCHAR +STARTCHAR U_7800 +ENCODING 30720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +F080 +2100 +2200 +77E0 +D2A0 +52A0 +5520 +7920 +5220 +04C0 +ENDCHAR +STARTCHAR U_7801 +ENCODING 30721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +2240 +2240 +7A40 +CFE0 +4820 +4FA0 +7820 +4920 +00C0 +ENDCHAR +STARTCHAR U_7802 +ENCODING 30722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +22C0 +22A0 +7CA0 +CC80 +48A0 +4840 +7880 +4900 +0600 +ENDCHAR +STARTCHAR U_7803 +ENCODING 30723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2340 +22C0 +7A40 +CFE0 +4A40 +4A40 +7A40 +4D40 +0880 +ENDCHAR +STARTCHAR U_7804 +ENCODING 30724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2140 +7940 +CFE0 +4900 +4B80 +7A80 +4440 +0820 +ENDCHAR +STARTCHAR U_7805 +ENCODING 30725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2120 +2F40 +7380 +5540 +D540 +5540 +7540 +5920 +0320 +ENDCHAR +STARTCHAR U_7806 +ENCODING 30726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +2080 +7880 +4FE0 +C880 +4880 +7940 +4A20 +0420 +ENDCHAR +STARTCHAR U_7807 +ENCODING 30727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2FE0 +4440 +7A80 +CA80 +4900 +4A80 +7A80 +4440 +0820 +ENDCHAR +STARTCHAR U_7808 +ENCODING 30728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +2400 +45E0 +7520 +D520 +5560 +5500 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_7809 +ENCODING 30729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0400 +3FC0 +0400 +FFE0 +0400 +FFE0 +3040 +DFC0 +1040 +ENDCHAR +STARTCHAR U_780A +ENCODING 30730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +2FE0 +4000 +7780 +D480 +5480 +5480 +74A0 +54A0 +0860 +ENDCHAR +STARTCHAR U_780B +ENCODING 30731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +2080 +4280 +7AE0 +CA80 +4A80 +4A80 +7A80 +4A80 +07E0 +ENDCHAR +STARTCHAR U_780C +ENCODING 30732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FDE0 +24A0 +27A0 +7CA0 +D4A0 +55A0 +56A0 +7520 +5220 +0460 +ENDCHAR +STARTCHAR U_780D +ENCODING 30733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2420 +7940 +C900 +4900 +4900 +7A80 +4C40 +0820 +ENDCHAR +STARTCHAR U_780E +ENCODING 30734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2280 +2440 +7820 +CA40 +4A40 +4A40 +4A40 +7A40 +4440 +0840 +ENDCHAR +STARTCHAR U_780F +ENCODING 30735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2440 +2820 +7FC0 +CA40 +4A40 +4A40 +7A40 +4D40 +0880 +ENDCHAR +STARTCHAR U_7810 +ENCODING 30736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FA40 +2240 +2280 +7AE0 +CA20 +4A40 +4B40 +7C80 +4940 +1620 +ENDCHAR +STARTCHAR U_7811 +ENCODING 30737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2140 +2240 +7FE0 +C840 +48C0 +4940 +7A40 +4540 +0880 +ENDCHAR +STARTCHAR U_7812 +ENCODING 30738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F480 +2480 +24A0 +77C0 +D480 +5480 +5480 +75A0 +5620 +0460 +ENDCHAR +STARTCHAR U_7813 +ENCODING 30739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2240 +2260 +7C00 +CBE0 +4A40 +4940 +7880 +4940 +0620 +ENDCHAR +STARTCHAR U_7814 +ENCODING 30740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2240 +2240 +4240 +FFE0 +4A40 +4A40 +4A40 +7A40 +4C40 +0840 +ENDCHAR +STARTCHAR U_7815 +ENCODING 30741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2240 +4240 +7A40 +CD60 +4900 +4FE0 +7900 +4900 +0100 +ENDCHAR +STARTCHAR U_7816 +ENCODING 30742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +4FE0 +7200 +D200 +57C0 +5040 +7280 +0100 +0080 +ENDCHAR +STARTCHAR U_7817 +ENCODING 30743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2100 +2200 +7A80 +CBE0 +4880 +4FE0 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_7818 +ENCODING 30744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +2080 +22A0 +7AA0 +CAA0 +4BE0 +4880 +78A0 +48A0 +0060 +ENDCHAR +STARTCHAR U_7819 +ENCODING 30745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +2200 +4380 +7280 +D280 +5580 +5480 +7480 +55A0 +0660 +ENDCHAR +STARTCHAR U_781A +ENCODING 30746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +2540 +2540 +7D40 +CD40 +4D40 +4900 +79A0 +4AA0 +0C60 +ENDCHAR +STARTCHAR U_781B +ENCODING 30747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +7920 +C900 +4FC0 +4840 +7880 +4900 +0200 +ENDCHAR +STARTCHAR U_781C +ENCODING 30748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2440 +26C0 +7540 +5540 +D540 +56C0 +5440 +7440 +4860 +1020 +ENDCHAR +STARTCHAR U_781D +ENCODING 30749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27C0 +2100 +7900 +CFE0 +4900 +4900 +7A40 +4FA0 +0220 +ENDCHAR +STARTCHAR U_781E +ENCODING 30750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2100 +77C0 +D100 +5380 +5540 +7920 +5100 +0100 +ENDCHAR +STARTCHAR U_781F +ENCODING 30751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +2500 +79E0 +C900 +4900 +49E0 +7900 +4900 +0100 +ENDCHAR +STARTCHAR U_7820 +ENCODING 30752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +FA40 +2240 +23C0 +7A40 +CA40 +4BC0 +4A40 +7A40 +4A40 +0FE0 +ENDCHAR +STARTCHAR U_7821 +ENCODING 30753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +2100 +2100 +7FC0 +C900 +4900 +4940 +7920 +4900 +07E0 +ENDCHAR +STARTCHAR U_7822 +ENCODING 30754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F840 +2040 +2740 +7540 +D540 +5740 +5540 +7040 +5140 +0080 +ENDCHAR +STARTCHAR U_7823 +ENCODING 30755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2420 +7A00 +CA40 +4A80 +4B00 +7A20 +4A20 +01E0 +ENDCHAR +STARTCHAR U_7824 +ENCODING 30756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FC00 +27E0 +2900 +75C0 +D740 +5D40 +5500 +7520 +5420 +03E0 +ENDCHAR +STARTCHAR U_7825 +ENCODING 30757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FF80 +2480 +2480 +77E0 +D480 +5480 +5480 +74A0 +5760 +04A0 +ENDCHAR +STARTCHAR U_7826 +ENCODING 30758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1260 +5F80 +5220 +FBE0 +0000 +FFE0 +1000 +3FC0 +5040 +9FC0 +1040 +ENDCHAR +STARTCHAR U_7827 +ENCODING 30759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +20E0 +2080 +7880 +CBE0 +4A20 +4A20 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7828 +ENCODING 30760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2420 +77E0 +D400 +57C0 +5480 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_7829 +ENCODING 30761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +42A0 +4FE0 +7A80 +DFE0 +52A0 +52A0 +72E0 +5480 +0880 +ENDCHAR +STARTCHAR U_782A +ENCODING 30762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2540 +24C0 +4440 +7FE0 +D540 +54C0 +5440 +77E0 +5040 +0180 +ENDCHAR +STARTCHAR U_782B +ENCODING 30763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2080 +7880 +C880 +4BE0 +4880 +7880 +4880 +07E0 +ENDCHAR +STARTCHAR U_782C +ENCODING 30764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +27E0 +2000 +7C40 +CC40 +4A80 +4A80 +7A80 +4900 +07E0 +ENDCHAR +STARTCHAR U_782D +ENCODING 30765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FF80 +2100 +2080 +7FE0 +C840 +4880 +4900 +7A00 +4D00 +08E0 +ENDCHAR +STARTCHAR U_782E +ENCODING 30766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FD40 +4880 +3140 +4A20 +FFE0 +0800 +1FC0 +7040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_782F +ENCODING 30767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FA80 +20A0 +27C0 +7280 +D280 +52C0 +52A0 +74A0 +5AA0 +0100 +ENDCHAR +STARTCHAR U_7830 +ENCODING 30768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +24A0 +7AA0 +4AC0 +C880 +4FE0 +4880 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_7831 +ENCODING 30769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD80 +2180 +2240 +7D20 +C880 +4FE0 +4840 +4A80 +7900 +4880 +0040 +ENDCHAR +STARTCHAR U_7832 +ENCODING 30770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +2420 +2820 +77A0 +D4A0 +57A0 +5440 +7420 +5420 +03E0 +ENDCHAR +STARTCHAR U_7833 +ENCODING 30771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +2100 +4100 +F9E0 +4B20 +4D20 +4920 +7920 +49E0 +0120 +ENDCHAR +STARTCHAR U_7834 +ENCODING 30772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +24A0 +7480 +D7E0 +5520 +5540 +7480 +0940 +1620 +ENDCHAR +STARTCHAR U_7835 +ENCODING 30773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +27E0 +2100 +7380 +5540 +D920 +5100 +77C0 +5100 +0100 +ENDCHAR +STARTCHAR U_7836 +ENCODING 30774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FD00 +23E0 +2220 +7A20 +4BE0 +CA20 +4A20 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_7837 +ENCODING 30775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +23E0 +22A0 +7BE0 +4AA0 +CAA0 +4BE0 +7880 +4880 +0080 +ENDCHAR +STARTCHAR U_7838 +ENCODING 30776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2480 +2480 +77E0 +D6A0 +56A0 +56A0 +56E0 +7480 +4480 +07E0 +ENDCHAR +STARTCHAR U_7839 +ENCODING 30777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +4000 +7440 +D240 +5240 +5280 +7180 +5240 +0C20 +ENDCHAR +STARTCHAR U_783A +ENCODING 30778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC00 +2400 +47E0 +7500 +D5E0 +5520 +5520 +7520 +5AA0 +0440 +ENDCHAR +STARTCHAR U_783B +ENCODING 30779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0A80 +1320 +6DE0 +0000 +7FE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_783C +ENCODING 30780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2280 +2440 +7820 +D7C0 +5100 +5100 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_783D +ENCODING 30781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7E0 +2520 +4520 +77E0 +D520 +5520 +57E0 +7520 +4920 +1060 +ENDCHAR +STARTCHAR U_783E +ENCODING 30782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +2780 +2400 +4480 +7480 +DFE0 +5080 +52C0 +74A0 +58A0 +11A0 +ENDCHAR +STARTCHAR U_783F +ENCODING 30783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +47E0 +4400 +7480 +D480 +5500 +7540 +5A20 +0BE0 +1020 +ENDCHAR +STARTCHAR U_7840 +ENCODING 30784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +22A0 +22A0 +7BE0 +C880 +4AA0 +4AA0 +7AA0 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7841 +ENCODING 30785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +F7C0 +2080 +4100 +7280 +DC60 +57C0 +5100 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_7842 +ENCODING 30786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F980 +2240 +2420 +7BE0 +4900 +C900 +4BC0 +4900 +7900 +4FE0 +ENDCHAR +STARTCHAR U_7843 +ENCODING 30787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FD00 +27C0 +2900 +7100 +DFE0 +5100 +5380 +7540 +5920 +1120 +ENDCHAR +STARTCHAR U_7844 +ENCODING 30788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F920 +2540 +4340 +7FE0 +4A80 +CA80 +4A80 +7AA0 +44A0 +0860 +ENDCHAR +STARTCHAR U_7845 +ENCODING 30789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +4100 +7FE0 +D100 +5100 +57C0 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_7846 +ENCODING 30790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +2140 +2220 +45C0 +7800 +CBE0 +4A20 +4A20 +7BE0 +4220 +ENDCHAR +STARTCHAR U_7847 +ENCODING 30791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2420 +2660 +75A0 +D4A0 +5560 +5620 +7420 +57E0 +0420 +ENDCHAR +STARTCHAR U_7848 +ENCODING 30792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F880 +27E0 +2080 +7BE0 +C800 +4BE0 +4A20 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7849 +ENCODING 30793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2140 +27E0 +7140 +D7C0 +5100 +57C0 +7100 +5FE0 +0100 +ENDCHAR +STARTCHAR U_784A +ENCODING 30794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +2480 +27E0 +7C00 +D5C0 +5540 +55C0 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_784B +ENCODING 30795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2220 +7B40 +4880 +C920 +4A40 +7880 +4940 +0620 +ENDCHAR +STARTCHAR U_784C +ENCODING 30796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3E0 +2640 +2980 +7240 +D420 +53E0 +5220 +7220 +53E0 +0220 +ENDCHAR +STARTCHAR U_784D +ENCODING 30797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +77C0 +D540 +5520 +5540 +7480 +5540 +0620 +ENDCHAR +STARTCHAR U_784E +ENCODING 30798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F20 +FA20 +2AA0 +2AA0 +7FA0 +DAA0 +5AA0 +5AA0 +7A20 +5A20 +1260 +ENDCHAR +STARTCHAR U_784F +ENCODING 30799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +2440 +2440 +4440 +7EE0 +D440 +5440 +5440 +7840 +4840 +1040 +ENDCHAR +STARTCHAR U_7850 +ENCODING 30800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +4BA0 +4820 +EBA0 +AAA0 +ABA0 +AAA0 +E820 +A820 +0860 +ENDCHAR +STARTCHAR U_7851 +ENCODING 30801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FA40 +27E0 +4240 +7A40 +CFE0 +4A40 +4A40 +7C40 +4440 +0840 +ENDCHAR +STARTCHAR U_7852 +ENCODING 30802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +4280 +4FE0 +EAA0 +AAA0 +AAA0 +ACE0 +E820 +AFE0 +0820 +ENDCHAR +STARTCHAR U_7853 +ENCODING 30803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBA0 +2120 +2140 +7FE0 +4900 +CA40 +4EC0 +4B00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_7854 +ENCODING 30804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +2280 +4FE0 +7A80 +CA80 +4FE0 +4800 +7A80 +4460 +0820 +ENDCHAR +STARTCHAR U_7855 +ENCODING 30805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +23E0 +2220 +7AA0 +CAA0 +4AA0 +4AA0 +7AA0 +4940 +0620 +ENDCHAR +STARTCHAR U_7856 +ENCODING 30806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2920 +7540 +D100 +5FE0 +5100 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_7857 +ENCODING 30807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0260 +FF80 +22A0 +2120 +72E0 +D000 +5FC0 +5280 +72A0 +54A0 +0860 +ENDCHAR +STARTCHAR U_7858 +ENCODING 30808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2820 +2820 +4BA0 +FAA0 +5AA0 +5BA0 +5820 +7820 +4FE0 +0820 +ENDCHAR +STARTCHAR U_7859 +ENCODING 30809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +22A0 +23E0 +7800 +4BE0 +C820 +4BE0 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_785A +ENCODING 30810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +2100 +47E0 +7280 +D440 +5AA0 +5280 +7280 +5480 +0880 +ENDCHAR +STARTCHAR U_785B +ENCODING 30811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F900 +2FE0 +2280 +7280 +D6C0 +5AA0 +52A0 +7280 +5480 +0980 +ENDCHAR +STARTCHAR U_785C +ENCODING 30812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F000 +22A0 +2540 +7540 +D2A0 +5000 +57C0 +7100 +5100 +07E0 +ENDCHAR +STARTCHAR U_785D +ENCODING 30813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F4A0 +22C0 +2080 +77E0 +D420 +57E0 +5420 +77E0 +5420 +04E0 +ENDCHAR +STARTCHAR U_785E +ENCODING 30814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +23E0 +2480 +77E0 +D000 +53E0 +5220 +7220 +53E0 +0220 +ENDCHAR +STARTCHAR U_785F +ENCODING 30815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C60 +F7C0 +2540 +2560 +7D40 +5540 +D540 +57E0 +7400 +4B00 +10E0 +ENDCHAR +STARTCHAR U_7860 +ENCODING 30816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +27C0 +2440 +77C0 +D440 +57E0 +5540 +7480 +5540 +0620 +ENDCHAR +STARTCHAR U_7861 +ENCODING 30817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4920 +4100 +7FE0 +5200 +D280 +5500 +5A40 +77E0 +5220 +ENDCHAR +STARTCHAR U_7862 +ENCODING 30818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +2440 +2FE0 +7100 +DFE0 +5100 +5540 +7520 +5920 +0300 +ENDCHAR +STARTCHAR U_7863 +ENCODING 30819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBE0 +2140 +27E0 +7900 +CBC0 +4C80 +4BE0 +7880 +4880 +0180 +ENDCHAR +STARTCHAR U_7864 +ENCODING 30820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +2FE0 +2540 +7540 +DBA0 +5120 +5100 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_7865 +ENCODING 30821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F480 +2FE0 +2440 +7680 +D740 +56A0 +5740 +5AA0 +7B20 +15E0 +ENDCHAR +STARTCHAR U_7866 +ENCODING 30822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +27C0 +2100 +7FE0 +CA40 +4A40 +4FE0 +7A40 +4440 +0840 +ENDCHAR +STARTCHAR U_7867 +ENCODING 30823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2140 +23E0 +42A0 +7BE0 +CAA0 +4BE0 +4AA0 +7AA0 +4AA0 +0240 +ENDCHAR +STARTCHAR U_7868 +ENCODING 30824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7540 +D7C0 +5540 +57C0 +7100 +5FE0 +0100 +ENDCHAR +STARTCHAR U_7869 +ENCODING 30825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FF80 +2400 +37E0 +E480 +2880 +FFE0 +0800 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_786A +ENCODING 30826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FEC0 +22A0 +2FE0 +7280 +D2A0 +53A0 +5EC0 +72A0 +5360 +0620 +ENDCHAR +STARTCHAR U_786B +ENCODING 30827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +27C0 +7020 +D540 +5540 +5540 +7540 +5940 +1060 +ENDCHAR +STARTCHAR U_786C +ENCODING 30828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +27E0 +2520 +77E0 +D520 +57E0 +5900 +7500 +5300 +0CE0 +ENDCHAR +STARTCHAR U_786D +ENCODING 30829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F240 +27E0 +2240 +7080 +D7E0 +5200 +5200 +7200 +5200 +03E0 +ENDCHAR +STARTCHAR U_786E +ENCODING 30830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F3C0 +2480 +4FE0 +F520 +57E0 +5520 +57E0 +7520 +4520 +0860 +ENDCHAR +STARTCHAR U_786F +ENCODING 30831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +2440 +27C0 +7440 +D7C0 +5440 +57C0 +72A0 +54A0 +0860 +ENDCHAR +STARTCHAR U_7870 +ENCODING 30832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +A920 +5140 +CF80 +4000 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7871 +ENCODING 30833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +2520 +27E0 +7520 +D5A0 +5760 +5520 +7520 +57E0 +0420 +ENDCHAR +STARTCHAR U_7872 +ENCODING 30834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +2440 +2920 +4280 +7A40 +CC20 +4BC0 +4A40 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_7873 +ENCODING 30835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +4FE0 +7280 +D6C0 +5AA0 +72A0 +5480 +0A80 +1100 +ENDCHAR +STARTCHAR U_7874 +ENCODING 30836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +2100 +7A80 +CEA0 +4AC0 +4B80 +7AA0 +4AA0 +02E0 +ENDCHAR +STARTCHAR U_7875 +ENCODING 30837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F8E0 +2080 +23E0 +7A20 +4B60 +CAA0 +4B60 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7876 +ENCODING 30838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F520 +27E0 +2100 +7280 +5440 +D920 +57C0 +5040 +7080 +5100 +ENDCHAR +STARTCHAR U_7877 +ENCODING 30839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +7BA0 +D000 +5A40 +5540 +7440 +5080 +0FE0 +ENDCHAR +STARTCHAR U_7878 +ENCODING 30840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAA0 +23E0 +2000 +77E0 +D400 +55C0 +5480 +77E0 +4880 +1080 +ENDCHAR +STARTCHAR U_7879 +ENCODING 30841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E940 +4940 +5F40 +EA20 +AEA0 +B880 +A880 +A900 +E940 +A920 +0BE0 +ENDCHAR +STARTCHAR U_787A +ENCODING 30842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +2220 +4540 +7D80 +D2C0 +55A0 +52A0 +7580 +4880 +0300 +ENDCHAR +STARTCHAR U_787B +ENCODING 30843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A220 +F940 +A8C0 +F940 +A220 +FFE0 +0800 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_787C +ENCODING 30844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +4AA0 +4AA0 +EEE0 +AAA0 +AAA0 +AEE0 +AAA0 +EAA0 +B2A0 +2760 +ENDCHAR +STARTCHAR U_787D +ENCODING 30845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +2520 +7FC0 +5540 +D7C0 +5540 +77C0 +5120 +01E0 +ENDCHAR +STARTCHAR U_787E +ENCODING 30846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +2540 +7540 +DFE0 +5540 +5540 +7FE0 +5100 +07C0 +ENDCHAR +STARTCHAR U_787F +ENCODING 30847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2280 +7440 +D000 +57C0 +5100 +7100 +5100 +0FE0 +ENDCHAR +STARTCHAR U_7880 +ENCODING 30848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2480 +2100 +77C0 +D140 +5FE0 +5140 +77C0 +4100 +0300 +ENDCHAR +STARTCHAR U_7881 +ENCODING 30849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +1080 +1E80 +1780 +1080 +FFE0 +5040 +BFA0 +5080 +1F80 +ENDCHAR +STARTCHAR U_7882 +ENCODING 30850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2820 +27C0 +7800 +CFE0 +4900 +4B40 +7D20 +4920 +0300 +ENDCHAR +STARTCHAR U_7883 +ENCODING 30851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7100 +DFE0 +5440 +57C0 +7440 +57C0 +04C0 +ENDCHAR +STARTCHAR U_7884 +ENCODING 30852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F480 +2FE0 +2480 +76C0 +DDA0 +56A0 +54A0 +7480 +5480 +0480 +ENDCHAR +STARTCHAR U_7885 +ENCODING 30853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E8A0 +4B20 +4920 +EFE0 +A920 +ABA0 +AD60 +E920 +AFE0 +0820 +ENDCHAR +STARTCHAR U_7886 +ENCODING 30854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +2920 +CFC0 +4B00 +5480 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7887 +ENCODING 30855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2420 +2000 +77E0 +D080 +5480 +54E0 +7480 +5A80 +11E0 +ENDCHAR +STARTCHAR U_7888 +ENCODING 30856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA80 +23E0 +6280 +7B60 +CA20 +4BE0 +4A20 +7BE0 +4A20 +03E0 +ENDCHAR +STARTCHAR U_7889 +ENCODING 30857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F920 +4BA0 +4920 +EFE0 +A820 +ABA0 +AAA0 +EBA0 +B020 +2060 +ENDCHAR +STARTCHAR U_788A +ENCODING 30858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +2280 +4120 +7AA0 +CCC0 +4FE0 +4A80 +7900 +4AA0 +0460 +ENDCHAR +STARTCHAR U_788B +ENCODING 30859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F540 +27C0 +4000 +7FE0 +D040 +5740 +5540 +7740 +5040 +00C0 +ENDCHAR +STARTCHAR U_788C +ENCODING 30860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F840 +27C0 +2040 +7FE0 +D920 +5540 +5380 +7540 +5920 +0300 +ENDCHAR +STARTCHAR U_788D +ENCODING 30861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +77C0 +D000 +57E0 +5080 +7FE0 +5480 +0380 +ENDCHAR +STARTCHAR U_788E +ENCODING 30862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +2440 +7AA0 +D120 +5100 +5FE0 +7100 +5100 +0100 +ENDCHAR +STARTCHAR U_788F +ENCODING 30863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +2240 +27E0 +7800 +CBE0 +4A20 +4BE0 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_7890 +ENCODING 30864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +2200 +4FE0 +7480 +DA40 +57E0 +5480 +7300 +44E0 +1840 +ENDCHAR +STARTCHAR U_7891 +ENCODING 30865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2520 +27E0 +7520 +D7E0 +5280 +5FE0 +7080 +5080 +0080 +ENDCHAR +STARTCHAR U_7892 +ENCODING 30866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +2280 +2440 +7BA0 +5100 +DFC0 +5100 +5540 +7380 +4FE0 +ENDCHAR +STARTCHAR U_7893 +ENCODING 30867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +27E0 +2C80 +77E0 +D480 +5480 +57E0 +7480 +5480 +07E0 +ENDCHAR +STARTCHAR U_7894 +ENCODING 30868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +EEC0 +40A0 +5FE0 +E280 +AA80 +AB80 +AA80 +EAA0 +AF60 +1820 +ENDCHAR +STARTCHAR U_7895 +ENCODING 30869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2440 +7FE0 +D040 +5740 +5540 +7740 +5040 +01C0 +ENDCHAR +STARTCHAR U_7896 +ENCODING 30870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +F440 +4BA0 +4000 +EFE0 +AAA0 +AAA0 +AFE0 +EAA0 +AAA0 +0860 +ENDCHAR +STARTCHAR U_7897 +ENCODING 30871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A20 +27C0 +7540 +D540 +5340 +53C0 +7520 +5520 +08E0 +ENDCHAR +STARTCHAR U_7898 +ENCODING 30872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +2FE0 +2AA0 +7FE0 +DAA0 +5AA0 +5FE0 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_7899 +ENCODING 30873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F6A0 +2520 +27E0 +7520 +D560 +5560 +5560 +77E0 +5420 +0460 +ENDCHAR +STARTCHAR U_789A +ENCODING 30874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +2180 +77E0 +D000 +53E0 +5220 +7220 +53E0 +0220 +ENDCHAR +STARTCHAR U_789B +ENCODING 30875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7100 +DFE0 +5440 +5540 +7540 +5280 +0C60 +ENDCHAR +STARTCHAR U_789C +ENCODING 30876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +27A0 +2100 +7FE0 +D540 +5AA0 +5520 +7240 +5180 +0600 +ENDCHAR +STARTCHAR U_789D +ENCODING 30877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +4100 +4FE0 +8AA0 +EAA0 +AAA0 +AAA0 +A100 +EFE0 +8280 +0C60 +ENDCHAR +STARTCHAR U_789E +ENCODING 30878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +0000 +7BC0 +4A40 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_789F +ENCODING 30879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2540 +25C0 +7400 +D7E0 +5100 +5FE0 +7580 +5940 +1120 +ENDCHAR +STARTCHAR U_78A0 +ENCODING 30880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +27C0 +7000 +DFE0 +5820 +57C0 +7100 +5500 +0200 +ENDCHAR +STARTCHAR U_78A1 +ENCODING 30881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FE0 +7540 +D540 +5FE0 +5540 +77E0 +5040 +0180 +ENDCHAR +STARTCHAR U_78A2 +ENCODING 30882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +4740 +4540 +EFE0 +A820 +ABA0 +AAA0 +EBA0 +A820 +0860 +ENDCHAR +STARTCHAR U_78A3 +ENCODING 30883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +77C0 +D200 +57E0 +5D20 +76A0 +57A0 +00C0 +ENDCHAR +STARTCHAR U_78A4 +ENCODING 30884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2440 +2100 +77C0 +D540 +5540 +5FE0 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_78A5 +ENCODING 30885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4820 +4FE0 +E800 +AFE0 +AAA0 +AFE0 +EAA0 +BAA0 +0860 +ENDCHAR +STARTCHAR U_78A6 +ENCODING 30886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +4A20 +47C0 +7A40 +5180 +D640 +5820 +77C0 +5440 +07C0 +ENDCHAR +STARTCHAR U_78A7 +ENCODING 30887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +74A0 +2520 +FFE0 +0000 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_78A8 +ENCODING 30888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +27E0 +2520 +77E0 +D000 +5FE0 +5540 +7480 +5540 +0620 +ENDCHAR +STARTCHAR U_78A9 +ENCODING 30889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +F880 +23E0 +2220 +7BE0 +CA20 +4BE0 +4A20 +7BE0 +4940 +0620 +ENDCHAR +STARTCHAR U_78AA +ENCODING 30890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2240 +23C0 +7240 +D3C0 +5240 +5FE0 +7540 +5620 +07E0 +ENDCHAR +STARTCHAR U_78AB +ENCODING 30891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06E0 +F4A0 +24A0 +2720 +7400 +D7E0 +54A0 +55A0 +7E40 +54A0 +0520 +ENDCHAR +STARTCHAR U_78AC +ENCODING 30892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +2520 +27E0 +7400 +D7E0 +54A0 +54A0 +7740 +54A0 +0520 +ENDCHAR +STARTCHAR U_78AD +ENCODING 30893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +27C0 +2440 +7FE0 +D400 +57E0 +5AA0 +74A0 +5920 +0240 +ENDCHAR +STARTCHAR U_78AE +ENCODING 30894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +47C0 +4440 +F7C0 +5000 +5FE0 +5100 +75C0 +5700 +09E0 +ENDCHAR +STARTCHAR U_78AF +ENCODING 30895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +02A0 +F540 +22A0 +43E0 +7A20 +CB60 +4AA0 +4B60 +7A20 +4BE0 +0220 +ENDCHAR +STARTCHAR U_78B0 +ENCODING 30896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2280 +7AA0 +DAA0 +56C0 +56C0 +7280 +5280 +0FE0 +ENDCHAR +STARTCHAR U_78B1 +ENCODING 30897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F0A0 +4FE0 +4880 +EF80 +A880 +AEA0 +AAA0 +EEC0 +A960 +1220 +ENDCHAR +STARTCHAR U_78B2 +ENCODING 30898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2FE0 +7920 +D7C0 +5540 +5540 +7540 +55C0 +0100 +ENDCHAR +STARTCHAR U_78B3 +ENCODING 30899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +2FE0 +4200 +7FE0 +D280 +52A0 +52C0 +5580 +7880 +0140 +0620 +ENDCHAR +STARTCHAR U_78B4 +ENCODING 30900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +2920 +77C0 +D440 +57C0 +5440 +77C0 +5000 +0FE0 +ENDCHAR +STARTCHAR U_78B5 +ENCODING 30901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F9E0 +2100 +47C0 +7440 +D7C0 +5440 +57C0 +7440 +57C0 +0820 +ENDCHAR +STARTCHAR U_78B6 +ENCODING 30902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EFE0 +44A0 +4EA0 +74A0 +DFA0 +5500 +5FE0 +7100 +46C0 +0820 +ENDCHAR +STARTCHAR U_78B7 +ENCODING 30903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E880 +4FE0 +4880 +EBE0 +AA20 +ABE0 +AA20 +EBE0 +9220 +23E0 +ENDCHAR +STARTCHAR U_78B8 +ENCODING 30904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFC0 +5040 +5F40 +F440 +BF40 +B540 +BF40 +F440 +9F40 +2020 +ENDCHAR +STARTCHAR U_78B9 +ENCODING 30905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2000 +7FE0 +D440 +57C0 +5440 +77C0 +5000 +0FE0 +ENDCHAR +STARTCHAR U_78BA +ENCODING 30906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A20 +2280 +77E0 +D480 +5FE0 +5480 +77E0 +5480 +07E0 +ENDCHAR +STARTCHAR U_78BB +ENCODING 30907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2240 +23C0 +7800 +CFE0 +4820 +4BA0 +7AA0 +4BA0 +0860 +ENDCHAR +STARTCHAR U_78BC +ENCODING 30908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD00 +27C0 +2500 +77C0 +D500 +57E0 +5020 +7560 +5AA0 +0AE0 +ENDCHAR +STARTCHAR U_78BD +ENCODING 30909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F100 +2FE0 +4000 +F7C0 +5440 +57C0 +7440 +57C0 +0280 +0440 +ENDCHAR +STARTCHAR U_78BE +ENCODING 30910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F420 +27E0 +2540 +77E0 +D540 +57E0 +5540 +7560 +55A0 +0920 +ENDCHAR +STARTCHAR U_78BF +ENCODING 30911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F820 +4FE0 +4880 +EAA0 +ABE0 +AA20 +ABE0 +EA20 +8BE0 +1220 +ENDCHAR +STARTCHAR U_78C0 +ENCODING 30912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F140 +2BE0 +4480 +72A0 +DEA0 +57E0 +5480 +7500 +4600 +09E0 +ENDCHAR +STARTCHAR U_78C1 +ENCODING 30913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2480 +74A0 +DB20 +5FC0 +5240 +7480 +5B40 +1DA0 +ENDCHAR +STARTCHAR U_78C2 +ENCODING 30914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FDE0 +48A0 +4EA0 +7940 +D7C0 +5540 +57C0 +5540 +77C0 +0440 +ENDCHAR +STARTCHAR U_78C3 +ENCODING 30915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +F4E0 +2480 +27E0 +74A0 +D7C0 +54A0 +55E0 +7540 +5540 +0A60 +ENDCHAR +STARTCHAR U_78C4 +ENCODING 30916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +27C0 +2540 +77E0 +D540 +57C0 +5500 +77C0 +4A40 +13C0 +ENDCHAR +STARTCHAR U_78C5 +ENCODING 30917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2280 +2FE0 +7920 +DFE0 +5200 +53E0 +7220 +5420 +08C0 +ENDCHAR +STARTCHAR U_78C6 +ENCODING 30918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +4740 +4540 +77E0 +D820 +57C0 +5440 +77C0 +5440 +0440 +ENDCHAR +STARTCHAR U_78C7 +ENCODING 30919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2540 +26C0 +7540 +57C0 +D480 +56A0 +74C0 +56A0 +0440 +ENDCHAR +STARTCHAR U_78C8 +ENCODING 30920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2520 +27E0 +7520 +D7E0 +5140 +51A0 +73E0 +5520 +08E0 +ENDCHAR +STARTCHAR U_78C9 +ENCODING 30921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F280 +2140 +2280 +77E0 +D540 +52A0 +5500 +7FE0 +5540 +0920 +ENDCHAR +STARTCHAR U_78CA +ENCODING 30922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +DF80 +0000 +FBE0 +4100 +FBE0 +4920 +79E0 +ENDCHAR +STARTCHAR U_78CB +ENCODING 30923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +27E0 +2100 +73E0 +D100 +57E0 +5200 +77E0 +5880 +07E0 +ENDCHAR +STARTCHAR U_78CC +ENCODING 30924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +27C0 +7440 +D740 +55C0 +5440 +7FE0 +5280 +0C60 +ENDCHAR +STARTCHAR U_78CD +ENCODING 30925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2920 +27C0 +7100 +D7C0 +5100 +5FE0 +7440 +57C0 +0440 +ENDCHAR +STARTCHAR U_78CE +ENCODING 30926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +FA20 +2540 +2280 +7740 +D220 +5FE0 +5100 +7FE0 +5280 +0C60 +ENDCHAR +STARTCHAR U_78CF +ENCODING 30927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +2500 +2FC0 +7540 +DFE0 +5540 +5FC0 +7580 +5D40 +0520 +ENDCHAR +STARTCHAR U_78D0 +ENCODING 30928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D60 +57C0 +FD40 +5480 +4540 +7FE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_78D1 +ENCODING 30929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F520 +27E0 +2000 +7FE0 +D000 +57C0 +5440 +77C0 +5280 +0FE0 +ENDCHAR +STARTCHAR U_78D2 +ENCODING 30930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +07C0 +F440 +27C0 +4000 +77C0 +D440 +57C0 +5440 +77C0 +4280 +0440 +ENDCHAR +STARTCHAR U_78D3 +ENCODING 30931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F9E0 +2520 +21E0 +7D00 +D5E0 +5520 +55E0 +7520 +4600 +09E0 +ENDCHAR +STARTCHAR U_78D4 +ENCODING 30932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2940 +2540 +73E0 +D440 +5900 +5FE0 +7380 +5540 +0920 +ENDCHAR +STARTCHAR U_78D5 +ENCODING 30933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +2FE0 +7240 +D7E0 +5020 +57C0 +7540 +5540 +0FE0 +ENDCHAR +STARTCHAR U_78D6 +ENCODING 30934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2660 +2AA0 +7120 +D7C0 +5440 +57C0 +7440 +47C0 +0440 +ENDCHAR +STARTCHAR U_78D7 +ENCODING 30935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFC0 +2100 +27C0 +7540 +D7C0 +5540 +7080 +5FE0 +0480 +0180 +ENDCHAR +STARTCHAR U_78D8 +ENCODING 30936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F700 +44A0 +4240 +7400 +D7C0 +5900 +5FE0 +7100 +5540 +07C0 +ENDCHAR +STARTCHAR U_78D9 +ENCODING 30937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2280 +2540 +7220 +D7E0 +5280 +52A0 +7640 +5AA0 +0320 +ENDCHAR +STARTCHAR U_78DA +ENCODING 30938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +27C0 +7540 +D7E0 +5040 +5FE0 +7440 +5240 +00C0 +ENDCHAR +STARTCHAR U_78DB +ENCODING 30939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5500 +7DE0 +5540 +FD40 +1240 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_78DC +ENCODING 30940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E6E0 +49A0 +5640 +74A0 +DBC0 +5000 +5FE0 +7540 +4920 +0200 +ENDCHAR +STARTCHAR U_78DD +ENCODING 30941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +44E0 +5F20 +E9A0 +BEA0 +A8A0 +AEA0 +EA40 +B2A0 +2520 +ENDCHAR +STARTCHAR U_78DE +ENCODING 30942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +FFE0 +4000 +4EE0 +EAA0 +AEE0 +AAA0 +AEE0 +EAA0 +AAA0 +1760 +ENDCHAR +STARTCHAR U_78DF +ENCODING 30943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F5A0 +2360 +25A0 +7140 +DEA0 +5340 +5080 +7320 +5040 +0780 +ENDCHAR +STARTCHAR U_78E0 +ENCODING 30944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F1E0 +2100 +27E0 +7520 +D660 +54A0 +5760 +75A0 +5660 +07E0 +ENDCHAR +STARTCHAR U_78E1 +ENCODING 30945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +FF80 +4A80 +4FE0 +EAA0 +AEA0 +AAA0 +BFA0 +B2A0 +F5A0 +1F60 +ENDCHAR +STARTCHAR U_78E2 +ENCODING 30946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2BA0 +7540 +DBA0 +5540 +5BA0 +7280 +5440 +0820 +ENDCHAR +STARTCHAR U_78E3 +ENCODING 30947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F3C0 +2440 +2AA0 +7FE0 +D280 +5D60 +5280 +7520 +5240 +0F80 +ENDCHAR +STARTCHAR U_78E4 +ENCODING 30948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FEE0 +4AA0 +4FA0 +EA00 +AEE0 +A8A0 +AEA0 +EA40 +9240 +24A0 +ENDCHAR +STARTCHAR U_78E5 +ENCODING 30949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F520 +27E0 +2520 +77E0 +D240 +5580 +5220 +7FE0 +5540 +1920 +ENDCHAR +STARTCHAR U_78E6 +ENCODING 30950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +4FE0 +4AA0 +7FE0 +D000 +57C0 +5000 +7FE0 +4540 +0920 +ENDCHAR +STARTCHAR U_78E7 +ENCODING 30951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FE0 +7440 +D7C0 +5440 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_78E8 +ENCODING 30952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +7FE0 +4400 +5FC0 +6840 +8FC0 +ENDCHAR +STARTCHAR U_78E9 +ENCODING 30953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +FFE0 +2480 +2780 +74A0 +DFA0 +54A0 +56C0 +7CA0 +5560 +0E20 +ENDCHAR +STARTCHAR U_78EA +ENCODING 30954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +04A0 +FCA0 +27E0 +2480 +7FE0 +D480 +57C0 +5480 +77C0 +5480 +07E0 +ENDCHAR +STARTCHAR U_78EB +ENCODING 30955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +E940 +5140 +46A0 +EC00 +B880 +AAC0 +AA80 +EA80 +8B80 +0CE0 +ENDCHAR +STARTCHAR U_78EC +ENCODING 30956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1260 +7DC0 +5540 +7C80 +4140 +BFE0 +1000 +3FC0 +5040 +1FC0 +ENDCHAR +STARTCHAR U_78ED +ENCODING 30957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FC00 +27E0 +2540 +7520 +D7E0 +5620 +57E0 +7620 +5BE0 +0260 +ENDCHAR +STARTCHAR U_78EE +ENCODING 30958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +EFE0 +4380 +4440 +EBA0 +A000 +AFE0 +AAA0 +EFE0 +8AA0 +0820 +ENDCHAR +STARTCHAR U_78EF +ENCODING 30959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +F980 +2FE0 +2540 +7BE0 +DD40 +57E0 +5520 +76C0 +48A0 +1360 +ENDCHAR +STARTCHAR U_78F0 +ENCODING 30960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +EFE0 +4100 +47C0 +7100 +DFE0 +5280 +5FE0 +7440 +57C0 +0440 +ENDCHAR +STARTCHAR U_78F1 +ENCODING 30961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F360 +26C0 +4240 +75A0 +D7E0 +5920 +57C0 +7240 +5240 +0480 +ENDCHAR +STARTCHAR U_78F2 +ENCODING 30962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F500 +29E0 +2720 +7DE0 +D500 +55E0 +5100 +7FE0 +5540 +0920 +ENDCHAR +STARTCHAR U_78F3 +ENCODING 30963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F280 +2FE0 +2AA0 +7FE0 +D000 +57C0 +5440 +77C0 +5440 +07C0 +ENDCHAR +STARTCHAR U_78F4 +ENCODING 30964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0740 +F580 +22A0 +2240 +77A0 +D820 +57C0 +5440 +77C0 +5280 +0FE0 +ENDCHAR +STARTCHAR U_78F5 +ENCODING 30965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +4AA0 +4EE0 +EAA0 +AEE0 +ABA0 +AAA0 +ABA0 +EAA0 +8BA0 +0840 +ENDCHAR +STARTCHAR U_78F6 +ENCODING 30966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FEE0 +2420 +46E0 +7420 +D7E0 +5200 +57E0 +7AA0 +5520 +0040 +ENDCHAR +STARTCHAR U_78F7 +ENCODING 30967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +F340 +2FE0 +2340 +7520 +DA40 +57E0 +5940 +77E0 +5440 +0840 +ENDCHAR +STARTCHAR U_78F8 +ENCODING 30968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +4280 +4FE0 +EAA0 +AC60 +AFE0 +A100 +EFE0 +A280 +0C60 +ENDCHAR +STARTCHAR U_78F9 +ENCODING 30969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +2FE0 +2AA0 +7FE0 +D440 +57C0 +5440 +7FE0 +5100 +0100 +ENDCHAR +STARTCHAR U_78FA +ENCODING 30970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +2FE0 +7000 +D7C0 +5540 +57C0 +7540 +57C0 +0C60 +ENDCHAR +STARTCHAR U_78FB +ENCODING 30971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F520 +2340 +2FE0 +7340 +D520 +5FE0 +5520 +77E0 +5520 +07E0 +ENDCHAR +STARTCHAR U_78FC +ENCODING 30972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +F7E0 +2500 +2FC0 +7500 +D7E0 +5500 +5FE0 +7380 +5540 +0920 +ENDCHAR +STARTCHAR U_78FD +ENCODING 30973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +2FE0 +7440 +D6E0 +5440 +5FE0 +7280 +54A0 +0860 +ENDCHAR +STARTCHAR U_78FE +ENCODING 30974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +2EE0 +2540 +77C0 +D540 +57C0 +5100 +7FE0 +5100 +0100 +ENDCHAR +STARTCHAR U_78FF +ENCODING 30975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +58C0 +7BE0 +58C0 +75A0 +5280 +7FE0 +4800 +5FC0 +6840 +8FC0 +ENDCHAR +STARTCHAR U_7900 +ENCODING 30976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +4EE0 +4AA0 +EEE0 +ABA0 +AAA0 +ABA0 +EAA0 +8BA0 +0AA0 +ENDCHAR +STARTCHAR U_7901 +ENCODING 30977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +F7E0 +2C80 +27E0 +7480 +D7E0 +5480 +57E0 +7540 +5AA0 +0AA0 +ENDCHAR +STARTCHAR U_7902 +ENCODING 30978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +2FE0 +7440 +D7C0 +5280 +5FE0 +7440 +57C0 +0440 +ENDCHAR +STARTCHAR U_7903 +ENCODING 30979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +4820 +47C0 +7440 +D7C0 +5100 +57C0 +7100 +4FE0 +0100 +ENDCHAR +STARTCHAR U_7904 +ENCODING 30980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +F780 +2200 +2FE0 +7440 +DBA0 +5280 +5FE0 +7AA0 +5BA0 +0860 +ENDCHAR +STARTCHAR U_7905 +ENCODING 30981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +2AE0 +2EA0 +70A0 +DFA0 +52A0 +53A0 +7E40 +52A0 +0720 +ENDCHAR +STARTCHAR U_7906 +ENCODING 30982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +4440 +4BA0 +E000 +AEE0 +AAA0 +AEE0 +E440 +8AA0 +1120 +ENDCHAR +STARTCHAR U_7907 +ENCODING 30983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +4560 +47A0 +F7E0 +55A0 +5560 +5100 +7FE0 +4280 +0C60 +ENDCHAR +STARTCHAR U_7908 +ENCODING 30984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0220 +F140 +47E0 +5100 +EA80 +B960 +AAC0 +A940 +EAA0 +A900 +17E0 +ENDCHAR +STARTCHAR U_7909 +ENCODING 30985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FE80 +2AE0 +2EA0 +7AA0 +DFA0 +54A0 +57A0 +7540 +59A0 +1220 +ENDCHAR +STARTCHAR U_790A +ENCODING 30986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +5540 +7F60 +55C0 +7D40 +0080 +FFE0 +0F80 +3880 +0F80 +ENDCHAR +STARTCHAR U_790B +ENCODING 30987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +4FE0 +4100 +77C0 +D100 +5FE0 +5280 +77C0 +5100 +0100 +ENDCHAR +STARTCHAR U_790C +ENCODING 30988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +4100 +4FE0 +E920 +ABA0 +A540 +AFE0 +A920 +EFE0 +A920 +0FE0 +ENDCHAR +STARTCHAR U_790D +ENCODING 30989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +4280 +47C0 +7440 +D7C0 +5560 +54A0 +7D60 +47A0 +0040 +ENDCHAR +STARTCHAR U_790E +ENCODING 30990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +2440 +2EE0 +7540 +DFE0 +50A0 +5480 +74E0 +5A80 +11E0 +ENDCHAR +STARTCHAR U_790F +ENCODING 30991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FAA0 +46C0 +4FE0 +7280 +D7C0 +5100 +7FE0 +4580 +4940 +0100 +ENDCHAR +STARTCHAR U_7910 +ENCODING 30992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +8020 +7FC0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7911 +ENCODING 30993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +2AA0 +2380 +7000 +DFE0 +5920 +5FE0 +7920 +5FE0 +0820 +ENDCHAR +STARTCHAR U_7912 +ENCODING 30994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +2100 +2FE0 +7780 +D2A0 +5FE0 +52A0 +7F40 +52A0 +0660 +ENDCHAR +STARTCHAR U_7913 +ENCODING 30995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F540 +27C0 +2540 +7FE0 +D000 +57C0 +5540 +77C0 +5540 +0FE0 +ENDCHAR +STARTCHAR U_7914 +ENCODING 30996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0740 +FDE0 +2520 +27A0 +7440 +D7E0 +5540 +55E0 +7D40 +5740 +0040 +ENDCHAR +STARTCHAR U_7915 +ENCODING 30997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +4080 +BBE0 +A880 +7FE0 +0800 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7916 +ENCODING 30998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F760 +25A0 +4760 +75A0 +D6E0 +54A0 +57E0 +7240 +4420 +0820 +ENDCHAR +STARTCHAR U_7917 +ENCODING 30999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2820 +2FE0 +72A0 +D7C0 +5C40 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_7918 +ENCODING 31000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +47C0 +4440 +77C0 +DAA0 +5540 +5FE0 +5000 +7AA0 +0AA0 +ENDCHAR +STARTCHAR U_7919 +ENCODING 31001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +FCA0 +2940 +2FE0 +7060 +DE40 +5560 +5F40 +7540 +5B40 +04E0 +ENDCHAR +STARTCHAR U_791A +ENCODING 31002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4200 +4FC0 +E200 +A480 +AFC0 +A000 +EFE0 +AAA0 +1FE0 +ENDCHAR +STARTCHAR U_791B +ENCODING 31003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +FAE0 +2F80 +2940 +7F20 +DA20 +5F80 +5000 +77C0 +5540 +0FE0 +ENDCHAR +STARTCHAR U_791C +ENCODING 31004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +7FC0 +4A40 +FFE0 +1100 +3F80 +D060 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_791D +ENCODING 31005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +2FE0 +2920 +7280 +DFE0 +5100 +5FE0 +7AA0 +5AA0 +0860 +ENDCHAR +STARTCHAR U_791E +ENCODING 31006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2480 +2FE0 +7820 +DFE0 +5A40 +5580 +7B80 +5540 +0B20 +ENDCHAR +STARTCHAR U_791F +ENCODING 31007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +EAA0 +4FA0 +4A40 +EFA0 +AA00 +AFA0 +AAA0 +F540 +2940 +02A0 +ENDCHAR +STARTCHAR U_7920 +ENCODING 31008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2440 +4880 +7EE0 +5440 +DEE0 +5000 +52A0 +7620 +49C0 +ENDCHAR +STARTCHAR U_7921 +ENCODING 31009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F2A0 +2FE0 +26A0 +7BE0 +D6A0 +53E0 +5440 +7FE0 +5540 +04C0 +ENDCHAR +STARTCHAR U_7922 +ENCODING 31010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +F7E0 +4100 +47E0 +7280 +D7C0 +5C60 +77C0 +5500 +44C0 +0660 +ENDCHAR +STARTCHAR U_7923 +ENCODING 31011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2280 +2FE0 +7AA0 +DFE0 +5520 +5540 +76A0 +54A0 +0B60 +ENDCHAR +STARTCHAR U_7924 +ENCODING 31012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2480 +26E0 +7AA0 +D440 +5BA0 +5000 +7FE0 +5540 +0B20 +ENDCHAR +STARTCHAR U_7925 +ENCODING 31013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FAA0 +2FA0 +2940 +7AA0 +D7E0 +5440 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_7926 +ENCODING 31014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2540 +27E0 +7540 +D7E0 +54A0 +57E0 +74A0 +5FE0 +0C20 +ENDCHAR +STARTCHAR U_7927 +ENCODING 31015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +E540 +47C0 +8540 +E7C0 +A000 +AFE0 +AAA0 +AFE0 +EAA0 +0FE0 +ENDCHAR +STARTCHAR U_7928 +ENCODING 31016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_7929 +ENCODING 31017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F480 +27E0 +2540 +7940 +D7C0 +5440 +57C0 +7440 +57C0 +0C60 +ENDCHAR +STARTCHAR U_792A +ENCODING 31018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FA80 +4FE0 +4A80 +EFC0 +A940 +AFC0 +A940 +EFE0 +A960 +17A0 +ENDCHAR +STARTCHAR U_792B +ENCODING 31019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0520 +EBC0 +4EA0 +4BC0 +EAA0 +BFE0 +A100 +BFE0 +E580 +A940 +1120 +ENDCHAR +STARTCHAR U_792C +ENCODING 31020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +F5E0 +4A80 +E5C0 +4AA0 +FFE0 +2880 +D060 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_792D +ENCODING 31021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +4FE0 +4920 +EBA0 +A540 +AFE0 +B900 +EFE0 +A900 +0FE0 +ENDCHAR +STARTCHAR U_792E +ENCODING 31022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F40 +EBE0 +4A00 +4FA0 +EAA0 +AF00 +AAA0 +AFA0 +E940 +9540 +03A0 +ENDCHAR +STARTCHAR U_792F +ENCODING 31023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +FB60 +26C0 +2920 +7FE0 +DA20 +5780 +5240 +7FE0 +5940 +1320 +ENDCHAR +STARTCHAR U_7930 +ENCODING 31024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +EA40 +4FE0 +4A40 +EBC0 +AE60 +AA40 +A880 +EAE0 +9280 +27E0 +ENDCHAR +STARTCHAR U_7931 +ENCODING 31025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5200 +FFC0 +8A00 +FBC0 +8A20 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7932 +ENCODING 31026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +4A80 +4EE0 +E020 +AEE0 +AA80 +AEE0 +EA80 +AEA0 +0AE0 +ENDCHAR +STARTCHAR U_7933 +ENCODING 31027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +4A40 +4FE0 +EA40 +AFE0 +A900 +ABC0 +EE40 +ABC0 +1240 +ENDCHAR +STARTCHAR U_7934 +ENCODING 31028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F7E0 +4AA0 +47E0 +F2A0 +ABE0 +A6A0 +BFE0 +EA40 +A940 +0880 +ENDCHAR +STARTCHAR U_7935 +ENCODING 31029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F100 +2FE0 +2920 +7AA0 +DF60 +55E0 +5720 +7DE0 +5520 +05E0 +ENDCHAR +STARTCHAR U_7936 +ENCODING 31030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FFE0 +2AA0 +4EE0 +7480 +D7E0 +5C80 +57E0 +7480 +5480 +07E0 +ENDCHAR +STARTCHAR U_7937 +ENCODING 31031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +2280 +47C0 +7460 +D740 +5540 +55A0 +7FE0 +4AA0 +1FE0 +ENDCHAR +STARTCHAR U_7938 +ENCODING 31032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +5FE0 +4540 +FFE0 +AA60 +AFC0 +A840 +AFC0 +E840 +AFC0 +1860 +ENDCHAR +STARTCHAR U_7939 +ENCODING 31033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +5FE0 +5480 +FEE0 +AAA0 +AEA0 +AAC0 +EE40 +ABA0 +1EA0 +ENDCHAR +STARTCHAR U_793A +ENCODING 31034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +0000 +FFE0 +0400 +2480 +2440 +4420 +8420 +0C00 +ENDCHAR +STARTCHAR U_793B +ENCODING 31035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +40 +20 +F8 +08 +10 +30 +68 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR U_793C +ENCODING 31036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FA00 +0A00 +1200 +3200 +6A00 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_793D +ENCODING 31037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2240 +FA40 +0A80 +12E0 +3220 +6A20 +AA20 +2420 +2920 +30C0 +ENDCHAR +STARTCHAR U_793E +ENCODING 31038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +1100 +27C0 +3100 +6900 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_793F +ENCODING 31039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0C20 +1020 +3220 +6920 +A920 +2020 +2120 +20C0 +ENDCHAR +STARTCHAR U_7940 +ENCODING 31040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FA20 +0A20 +13E0 +3220 +6A00 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7941 +ENCODING 31041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +21E0 +F920 +0940 +1180 +3140 +6920 +A520 +21A0 +2140 +2100 +ENDCHAR +STARTCHAR U_7942 +ENCODING 31042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +22A0 +FAE0 +0BA0 +16A0 +32A0 +6AA0 +AA80 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7943 +ENCODING 31043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F240 +1240 +2240 +73E0 +A820 +2020 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_7944 +ENCODING 31044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2180 +FA40 +0C20 +1240 +3240 +6A40 +AA40 +2240 +2440 +2840 +ENDCHAR +STARTCHAR U_7945 +ENCODING 31045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +0900 +17E0 +3100 +6900 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7946 +ENCODING 31046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F900 +0900 +17E0 +3100 +6900 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7947 +ENCODING 31047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +F480 +1480 +27E0 +2480 +7480 +AC80 +24A0 +2560 +2620 +ENDCHAR +STARTCHAR U_7948 +ENCODING 31048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2380 +FA00 +0A00 +13E0 +3240 +6A40 +AA40 +2440 +2440 +2840 +ENDCHAR +STARTCHAR U_7949 +ENCODING 31049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F500 +1500 +25E0 +3500 +6D00 +A500 +2500 +2500 +3FE0 +ENDCHAR +STARTCHAR U_794A +ENCODING 31050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +0900 +11E0 +3120 +6920 +AA20 +2220 +2420 +28C0 +ENDCHAR +STARTCHAR U_794B +ENCODING 31051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +0C60 +1000 +37E0 +6A40 +A940 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_794C +ENCODING 31052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FBE0 +0AA0 +12A0 +32A0 +6BE0 +A880 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_794D +ENCODING 31053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +F100 +1100 +2100 +6FE0 +B100 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_794E +ENCODING 31054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +F200 +2FC0 +6200 +BFE0 +2220 +2220 +22A0 +2240 +2200 +ENDCHAR +STARTCHAR U_794F +ENCODING 31055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F900 +0900 +1200 +37E0 +6A20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7950 +ENCODING 31056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0900 +1200 +33E0 +6E20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7951 +ENCODING 31057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +F7C0 +1900 +2100 +37E0 +6900 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7952 +ENCODING 31058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2120 +F920 +0920 +12A0 +3440 +6BE0 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7953 +ENCODING 31059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +FFE0 +0A00 +13C0 +3240 +6A40 +A540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_7954 +ENCODING 31060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F440 +17E0 +2C40 +3640 +6D40 +A540 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_7955 +ENCODING 31061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +20A0 +F8A0 +0A20 +1240 +3640 +6AA0 +AB20 +2200 +2620 +39E0 +ENDCHAR +STARTCHAR U_7956 +ENCODING 31062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +17C0 +FC40 +1440 +27C0 +3440 +6C40 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7957 +ENCODING 31063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +FC80 +0C80 +17E0 +3480 +6C80 +ACA0 +25A0 +2760 +24A0 +ENDCHAR +STARTCHAR U_7958 +ENCODING 31064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +0000 +FBE0 +1080 +5280 +5AC0 +56A0 +94A0 +90A0 +5280 +2100 +ENDCHAR +STARTCHAR U_7959 +ENCODING 31065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7C0 +1100 +2FE0 +7100 +AB80 +2540 +2920 +2100 +2100 +ENDCHAR +STARTCHAR U_795A +ENCODING 31066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0D00 +1100 +31E0 +6900 +A9E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_795B +ENCODING 31067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +0900 +1100 +37E0 +6900 +AA00 +2240 +2440 +27A0 +ENDCHAR +STARTCHAR U_795C +ENCODING 31068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +0880 +1080 +33E0 +6A20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_795D +ENCODING 31069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +0C40 +17C0 +3280 +6A80 +AA80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_795E +ENCODING 31070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +27E0 +34A0 +6CA0 +A7E0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_795F +ENCODING 31071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +3F80 +4440 +7FC0 +0000 +3F80 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7960 +ENCODING 31072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2020 +F7A0 +1020 +27A0 +74A0 +ACA0 +27A0 +24A0 +2020 +20E0 +ENDCHAR +STARTCHAR U_7961 +ENCODING 31073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1220 +5A40 +53A0 +5220 +FBE0 +0000 +3F80 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7962 +ENCODING 31074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F3E0 +1520 +2940 +7100 +AD40 +2540 +2920 +2920 +2300 +ENDCHAR +STARTCHAR U_7963 +ENCODING 31075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC00 +10C0 +2700 +7520 +AD40 +2480 +2480 +2540 +2620 +ENDCHAR +STARTCHAR U_7964 +ENCODING 31076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +F220 +1AA0 +2660 +7220 +AA60 +26A0 +2B20 +2220 +2660 +ENDCHAR +STARTCHAR U_7965 +ENCODING 31077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +7100 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_7966 +ENCODING 31078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +17C0 +2000 +77C0 +A100 +2FE0 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_7967 +ENCODING 31079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FAA0 +16C0 +2280 +76C0 +AAA0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7968 +ENCODING 31080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +3F80 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7969 +ENCODING 31081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +F7C0 +1900 +2100 +7FE0 +A900 +2380 +2540 +2920 +3120 +ENDCHAR +STARTCHAR U_796A +ENCODING 31082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2480 +FFE0 +2800 +4BC0 +EA40 +5A40 +4AC0 +4A20 +5220 +61E0 +ENDCHAR +STARTCHAR U_796B +ENCODING 31083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F440 +1820 +27C0 +7000 +AFC0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_796C +ENCODING 31084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +17E0 +F900 +1240 +27E0 +7100 +A7C0 +2100 +2100 +2FE0 +2000 +ENDCHAR +STARTCHAR U_796D +ENCODING 31085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3E40 +4A80 +A900 +5080 +2F40 +4020 +BFC0 +1280 +2A40 +C420 +ENDCHAR +STARTCHAR U_796E +ENCODING 31086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +27C0 +7000 +AFC0 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_796F +ENCODING 31087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F900 +17E0 +2420 +7520 +AD20 +2520 +2520 +2280 +2C60 +ENDCHAR +STARTCHAR U_7970 +ENCODING 31088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +F7C0 +1900 +2FE0 +7000 +AFE0 +2420 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7971 +ENCODING 31089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2240 +FA80 +17C0 +2440 +77C0 +AA80 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7972 +ENCODING 31090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +F7C0 +1040 +27C0 +7000 +AFE0 +2AA0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7973 +ENCODING 31091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +FBC0 +1800 +2FE0 +3A80 +6AA0 +AA40 +2AC0 +3340 +2620 +ENDCHAR +STARTCHAR U_7974 +ENCODING 31092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +20A0 +FFE0 +1080 +2A80 +7AA0 +AFA0 +2AC0 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_7975 +ENCODING 31093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F920 +2FE0 +6920 +BBA0 +2D60 +2920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7976 +ENCODING 31094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +F7C0 +1140 +27C0 +7500 +A7E0 +2320 +2520 +2540 +2900 +ENDCHAR +STARTCHAR U_7977 +ENCODING 31095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F100 +17C0 +2200 +77E0 +AC40 +27E0 +2940 +3040 +21C0 +ENDCHAR +STARTCHAR U_7978 +ENCODING 31096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F440 +17C0 +2100 +7FE0 +A920 +2AA0 +2C60 +2820 +28E0 +ENDCHAR +STARTCHAR U_7979 +ENCODING 31097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +FC20 +17A0 +2A20 +77A0 +AA20 +2AA0 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_797A +ENCODING 31098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F7E0 +1240 +23C0 +7240 +ABC0 +2240 +2FE0 +2240 +2420 +ENDCHAR +STARTCHAR U_797B +ENCODING 31099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +F920 +1FE0 +2920 +7BA0 +AAA0 +2BA0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_797C +ENCODING 31100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +1540 +27C0 +7100 +AFE0 +2100 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_797D +ENCODING 31101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F000 +1240 +2240 +75A0 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_797E +ENCODING 31102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +2FE0 +3440 +6A60 +B380 +2680 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_797F +ENCODING 31103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +F7C0 +1080 +27E0 +7120 +AD40 +2380 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_7980 +ENCODING 31104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5F40 +4040 +7FC0 +0000 +3FC0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7981 +ENCODING 31105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +71C0 +AAA0 +2080 +7FC0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7982 +ENCODING 31106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2520 +F7A0 +1520 +27E0 +7420 +AFA0 +26A0 +27A0 +2820 +3060 +ENDCHAR +STARTCHAR U_7983 +ENCODING 31107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +17C0 +2440 +77C0 +AC40 +27C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7984 +ENCODING 31108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +F7C0 +1040 +2FE0 +7140 +AD80 +2340 +2520 +2920 +2300 +ENDCHAR +STARTCHAR U_7985 +ENCODING 31109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +F7C0 +1540 +27C0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7986 +ENCODING 31110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +FFE0 +2920 +6FE0 +BA20 +2FE0 +2500 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7987 +ENCODING 31111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FA0 +F240 +2FE0 +3100 +67C0 +AC40 +37C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7988 +ENCODING 31112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +F100 +1FE0 +2540 +77C0 +AD40 +27C0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_7989 +ENCODING 31113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +F280 +2FE0 +2AA0 +6EE0 +B820 +2FE0 +2820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_798A +ENCODING 31114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +F4A0 +1EA0 +24A0 +6F60 +B500 +2FE0 +2300 +2480 +3860 +ENDCHAR +STARTCHAR U_798B +ENCODING 31115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +FFE0 +1AA0 +2AA0 +6FE0 +B100 +27C0 +2100 +2100 +3FE0 +ENDCHAR +STARTCHAR U_798C +ENCODING 31116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +0220 +2440 +6AA0 +AEE0 +2240 +2480 +2920 +2FE0 +ENDCHAR +STARTCHAR U_798D +ENCODING 31117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F740 +1540 +2FE0 +2820 +7BA0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_798E +ENCODING 31118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F100 +17C0 +2440 +77C0 +AC40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_798F +ENCODING 31119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +07C0 +F440 +17C0 +2000 +3FE0 +6920 +AFE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_7990 +ENCODING 31120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +F540 +17E0 +2200 +6FE0 +B200 +27C0 +2A80 +3100 +2EE0 +ENDCHAR +STARTCHAR U_7991 +ENCODING 31121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +1540 +27C0 +7100 +AFE0 +2920 +2BA0 +28A0 +2840 +ENDCHAR +STARTCHAR U_7992 +ENCODING 31122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +F780 +1080 +2FE0 +7520 +AAC0 +2580 +22C0 +24A0 +2B20 +ENDCHAR +STARTCHAR U_7993 +ENCODING 31123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +2FE0 +6400 +B7E0 +2AA0 +22A0 +2D20 +22C0 +ENDCHAR +STARTCHAR U_7994 +ENCODING 31124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +27C0 +7000 +AFE0 +2100 +25C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_7995 +ENCODING 31125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F140 +17E0 +2240 +73C0 +A880 +27E0 +2480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_7996 +ENCODING 31126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +F440 +17C0 +2440 +77C0 +A900 +2FE0 +2580 +2940 +3120 +ENDCHAR +STARTCHAR U_7997 +ENCODING 31127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FFC0 +1540 +2540 +37C0 +6900 +A2C0 +2A20 +2A40 +31C0 +ENDCHAR +STARTCHAR U_7998 +ENCODING 31128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F280 +1100 +2FE0 +3920 +6FC0 +A540 +2540 +25C0 +2100 +ENDCHAR +STARTCHAR U_7999 +ENCODING 31129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +26E0 +F280 +16A0 +2040 +77C0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_799A +ENCODING 31130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +3100 +6900 +AFE0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_799B +ENCODING 31131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F900 +17C0 +2440 +3740 +6DC0 +A440 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_799C +ENCODING 31132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +3180 +4A40 +FFE0 +8020 +3F80 +0000 +FFC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_799D +ENCODING 31133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +F7C0 +2540 +47C0 +E280 +5440 +4BA0 +4680 +4100 +4EE0 +ENDCHAR +STARTCHAR U_799E +ENCODING 31134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F000 +27C0 +6440 +BFE0 +A820 +2BA0 +2AA0 +2BA0 +2840 +ENDCHAR +STARTCHAR U_799F +ENCODING 31135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +E900 +2FC0 +4940 +EBE0 +4940 +4FC0 +5440 +57C0 +4440 +ENDCHAR +STARTCHAR U_79A0 +ENCODING 31136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +F9E0 +1900 +2FE0 +6920 +BFC0 +2920 +2BE0 +3280 +2CE0 +ENDCHAR +STARTCHAR U_79A1 +ENCODING 31137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2500 +F7C0 +1500 +27C0 +7500 +AFE0 +2020 +2AA0 +3560 +2540 +ENDCHAR +STARTCHAR U_79A2 +ENCODING 31138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +27C0 +7000 +AFE0 +25A0 +2360 +2DA0 +26E0 +ENDCHAR +STARTCHAR U_79A3 +ENCODING 31139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +F100 +2FE0 +6920 +AFE0 +2920 +2080 +2FE0 +2480 +2180 +ENDCHAR +STARTCHAR U_79A4 +ENCODING 31140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +FFE0 +1000 +2FE0 +7220 +AAA0 +2660 +2AA0 +3320 +2660 +ENDCHAR +STARTCHAR U_79A5 +ENCODING 31141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4FC0 +F480 +2780 +4480 +6FE0 +C480 +4A40 +57A0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_79A6 +ENCODING 31142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +A4A0 +5FA0 +C4A0 +57E0 +5480 +3F80 +0000 +FFE0 +2280 +CE60 +ENDCHAR +STARTCHAR U_79A7 +ENCODING 31143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +1FE0 +2440 +37C0 +6A80 +AFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79A8 +ENCODING 31144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2BA0 +F540 +19A0 +2F60 +7540 +AFE0 +2540 +26A0 +2960 +3220 +ENDCHAR +STARTCHAR U_79A9 +ENCODING 31145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +0FE0 +F920 +2FE0 +6440 +AFE0 +2440 +3FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_79AA +ENCODING 31146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FFE0 +1540 +27C0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_79AB +ENCODING 31147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +FFE0 +1AA0 +2FE0 +7440 +AFC0 +2440 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_79AC +ENCODING 31148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F7C0 +1820 +2FE0 +7AA0 +AFE0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_79AD +ENCODING 31149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5440 +2A80 +FFE0 +1220 +3D40 +6A80 +ADC0 +2AA0 +2CA0 +2980 +37E0 +ENDCHAR +STARTCHAR U_79AE +ENCODING 31150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +FAA0 +1FE0 +2AA0 +7FE0 +A440 +27C0 +2280 +2100 +2FE0 +ENDCHAR +STARTCHAR U_79AF +ENCODING 31151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +EAA0 +2FE0 +3AA0 +6FE0 +A800 +2FE0 +2A80 +2B60 +3240 +ENDCHAR +STARTCHAR U_79B0 +ENCODING 31152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +F920 +1FE0 +2DA0 +7B60 +ADA0 +2B60 +2DA0 +2920 +2960 +ENDCHAR +STARTCHAR U_79B1 +ENCODING 31153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +1FE0 +2120 +2FC0 +7040 +AFE0 +2B40 +2E40 +20C0 +ENDCHAR +STARTCHAR U_79B2 +ENCODING 31154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5280 +FFE0 +3280 +57C0 +77C0 +D540 +5FE0 +4920 +4FE0 +4820 +ENDCHAR +STARTCHAR U_79B3 +ENCODING 31155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +1EE0 +2280 +7FE0 +A280 +2FE0 +24A0 +2D40 +3620 +ENDCHAR +STARTCHAR U_79B4 +ENCODING 31156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +FFC0 +1020 +2FE0 +7AA0 +AFE0 +2AA0 +2FE0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_79B5 +ENCODING 31157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E00 +4AE0 +EE40 +2AE0 +4EA0 +60E0 +DEA0 +44E0 +5640 +5CA0 +67E0 +ENDCHAR +STARTCHAR U_79B6 +ENCODING 31158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +F540 +1FE0 +2540 +77E0 +AC40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_79B7 +ENCODING 31159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +5C40 +3FE0 +E920 +5DE0 +6B20 +C9E0 +7F20 +49E0 +5540 +6220 +ENDCHAR +STARTCHAR U_79B8 +ENCODING 31160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +FF80 +8880 +9080 +9480 +A280 +FE80 +8080 +8080 +8180 +ENDCHAR +STARTCHAR U_79B9 +ENCODING 31161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0180 +FE00 +0800 +7F80 +4880 +7F80 +0800 +FFC0 +8A40 +BD40 +81C0 +ENDCHAR +STARTCHAR U_79BA +ENCODING 31162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4880 +7F80 +4880 +7F80 +0800 +FFC0 +8A40 +FD40 +8040 +81C0 +ENDCHAR +STARTCHAR U_79BB +ENCODING 31163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +2480 +2A80 +3F80 +0400 +7FC0 +4940 +5F40 +40C0 +ENDCHAR +STARTCHAR U_79BC +ENCODING 31164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0F00 +0800 +7F00 +5500 +4900 +7F00 +0800 +FF80 +9480 +BE80 +8180 +ENDCHAR +STARTCHAR U_79BD +ENCODING 31165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3580 +DF60 +2480 +2A80 +3F80 +0400 +7FC0 +4A40 +5F40 +40C0 +ENDCHAR +STARTCHAR U_79BE +ENCODING 31166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +7F00 +0400 +0400 +FFE0 +0400 +0E00 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_79BF +ENCODING 31167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +1500 +2480 +C060 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_79C0 +ENCODING 31168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +2480 +DF60 +0900 +0BC0 +1040 +2040 +C180 +ENDCHAR +STARTCHAR U_79C1 +ENCODING 31169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E100 +2100 +F900 +2200 +7200 +6A00 +A440 +2FE0 +2420 +2000 +ENDCHAR +STARTCHAR U_79C2 +ENCODING 31170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0E00 +1580 +E060 +0400 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_79C3 +ENCODING 31171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C00 +0400 +FFE0 +1500 +2480 +C060 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_79C4 +ENCODING 31172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7C0 +2040 +F880 +2100 +77E0 +6900 +A100 +A100 +2100 +2300 +ENDCHAR +STARTCHAR U_79C5 +ENCODING 31173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +E780 +2100 +2100 +F900 +27E0 +3100 +6900 +A120 +2120 +20E0 +ENDCHAR +STARTCHAR U_79C6 +ENCODING 31174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +2100 +F900 +2FE0 +3100 +6900 +A900 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_79C7 +ENCODING 31175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +E200 +2200 +2FC0 +F240 +2640 +7340 +AA40 +2240 +2420 +2820 +ENDCHAR +STARTCHAR U_79C8 +ENCODING 31176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E080 +2080 +FAA0 +22A0 +32A0 +6AA0 +AAA0 +22A0 +23E0 +2220 +ENDCHAR +STARTCHAR U_79C9 +ENCODING 31177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +0480 +FFE0 +0480 +7F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_79CA +ENCODING 31178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +2480 +C360 +3C00 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_79CB +ENCODING 31179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +2140 +FD40 +2580 +7500 +6900 +A280 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_79CC +ENCODING 31180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2900 +6FE0 +7100 +A380 +2380 +5540 +5540 +8920 +0100 +ENDCHAR +STARTCHAR U_79CD +ENCODING 31181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +27E0 +FD20 +2520 +3520 +6FE0 +A100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_79CE +ENCODING 31182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E280 +2240 +F440 +2820 +37C0 +6A40 +AA40 +2240 +2440 +2980 +ENDCHAR +STARTCHAR U_79CF +ENCODING 31183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +E700 +2100 +F9E0 +2700 +3100 +69E0 +AF00 +2120 +2120 +20E0 +ENDCHAR +STARTCHAR U_79D0 +ENCODING 31184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +63C0 +2000 +F800 +27E0 +7100 +6900 +A200 +2240 +27E0 +2240 +ENDCHAR +STARTCHAR U_79D1 +ENCODING 31185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1840 +E240 +2140 +F840 +2240 +3140 +6860 +A1C0 +2640 +2040 +2040 +ENDCHAR +STARTCHAR U_79D2 +ENCODING 31186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +2540 +F520 +2520 +7500 +6920 +A040 +2080 +2300 +2C00 +ENDCHAR +STARTCHAR U_79D3 +ENCODING 31187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6100 +27C0 +F900 +27C0 +7440 +6A80 +A280 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_79D4 +ENCODING 31188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E100 +2FE0 +F800 +2380 +7280 +6A80 +A280 +22A0 +2460 +2800 +ENDCHAR +STARTCHAR U_79D5 +ENCODING 31189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +E480 +2480 +FCA0 +27C0 +3480 +6C80 +A480 +25A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_79D6 +ENCODING 31190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E780 +2480 +FC80 +27E0 +3480 +6C80 +A480 +25A0 +2660 +2420 +ENDCHAR +STARTCHAR U_79D7 +ENCODING 31191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +6700 +2100 +F900 +27E0 +7100 +6A80 +A280 +2240 +2460 +2840 +ENDCHAR +STARTCHAR U_79D8 +ENCODING 31192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +E140 +2240 +FA40 +2280 +3680 +6AA0 +AB20 +2240 +2640 +39C0 +ENDCHAR +STARTCHAR U_79D9 +ENCODING 31193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6100 +27E0 +F900 +2100 +77C0 +6C40 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79DA +ENCODING 31194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +6540 +2380 +F100 +27C0 +7100 +6900 +AFE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_79DB +ENCODING 31195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +6080 +27E0 +FCA0 +25C0 +7540 +6D40 +A480 +2880 +2940 +3220 +ENDCHAR +STARTCHAR U_79DC +ENCODING 31196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E420 +2420 +FFE0 +2400 +3520 +6D40 +A580 +2520 +2920 +30E0 +ENDCHAR +STARTCHAR U_79DD +ENCODING 31197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +E700 +2100 +FFE0 +2100 +3180 +6B40 +A520 +A920 +2100 +2100 +ENDCHAR +STARTCHAR U_79DE +ENCODING 31198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E080 +2080 +FFE0 +24A0 +34A0 +6FE0 +A4A0 +24A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_79DF +ENCODING 31199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E240 +2240 +FA40 +23C0 +3240 +6A40 +ABC0 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_79E0 +ENCODING 31200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +E7E0 +2080 +F880 +2100 +3340 +6D20 +A920 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_79E1 +ENCODING 31201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +6240 +27E0 +FA00 +23C0 +7440 +6440 +AA80 +3100 +2280 +2460 +ENDCHAR +STARTCHAR U_79E2 +ENCODING 31202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +2280 +F460 +2900 +7080 +67C0 +A040 +2280 +2100 +2100 +ENDCHAR +STARTCHAR U_79E3 +ENCODING 31203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +2FE0 +F900 +27C0 +3100 +6B80 +A540 +2920 +3120 +2100 +ENDCHAR +STARTCHAR U_79E4 +ENCODING 31204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E080 +24A0 +FAA0 +22C0 +3080 +2FE0 +6880 +A080 +2080 +2080 +ENDCHAR +STARTCHAR U_79E5 +ENCODING 31205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +2100 +F9E0 +2100 +77C0 +6C40 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79E6 +ENCODING 31206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0800 +FFE0 +2C80 +C460 +7FC0 +1500 +64C0 +ENDCHAR +STARTCHAR U_79E7 +ENCODING 31207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +27C0 +FD40 +2540 +37E0 +2900 +6900 +A280 +2440 +2820 +ENDCHAR +STARTCHAR U_79E8 +ENCODING 31208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +6400 +27E0 +FA00 +2BC0 +7200 +6A00 +A3C0 +2200 +2200 +2200 +ENDCHAR +STARTCHAR U_79E9 +ENCODING 31209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E280 +23C0 +FC80 +2080 +37E0 +2880 +6880 +A140 +2220 +2C20 +ENDCHAR +STARTCHAR U_79EA +ENCODING 31210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +E780 +2480 +FC80 +27E0 +3480 +2C80 +64A0 +A5A0 +2760 +24A0 +ENDCHAR +STARTCHAR U_79EB +ENCODING 31211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1980 +E140 +27E0 +F900 +2380 +7380 +6D40 +A540 +A920 +2100 +2100 +ENDCHAR +STARTCHAR U_79EC +ENCODING 31212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E400 +2400 +FFC0 +2440 +3440 +2FC0 +6400 +A400 +2400 +27E0 +ENDCHAR +STARTCHAR U_79ED +ENCODING 31213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E0E0 +2780 +FC80 +2480 +37E0 +28A0 +69A0 +A2E0 +2480 +2880 +ENDCHAR +STARTCHAR U_79EE +ENCODING 31214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E100 +2240 +FFA0 +2020 +3000 +2BE0 +6220 +A220 +23E0 +2220 +ENDCHAR +STARTCHAR U_79EF +ENCODING 31215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E3E0 +2220 +FA20 +2220 +73E0 +6800 +A240 +A240 +2420 +2820 +ENDCHAR +STARTCHAR U_79F0 +ENCODING 31216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A00 +E200 +27E0 +F920 +2100 +7540 +6540 +A920 +3120 +2100 +2300 +ENDCHAR +STARTCHAR U_79F1 +ENCODING 31217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +67E0 +2420 +FFE0 +2420 +77A0 +6EA0 +A7A0 +2420 +24A0 +2440 +ENDCHAR +STARTCHAR U_79F2 +ENCODING 31218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +27C0 +F900 +27E0 +7080 +6FE0 +A480 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_79F3 +ENCODING 31219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +60C0 +2700 +F100 +2FE0 +7100 +6FC0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79F4 +ENCODING 31220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6100 +2280 +F440 +2BA0 +7000 +6FC0 +A440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_79F5 +ENCODING 31221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +67E0 +2520 +FD20 +27E0 +7520 +6EA0 +A460 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_79F6 +ENCODING 31222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +4FE0 +3240 +4500 +D8E0 +4000 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_79F7 +ENCODING 31223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E100 +2200 +FC40 +27A0 +3100 +2900 +67C0 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_79F8 +ENCODING 31224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E080 +27E0 +F880 +23E0 +3000 +2BE0 +6220 +A220 +23E0 +2220 +ENDCHAR +STARTCHAR U_79F9 +ENCODING 31225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +6260 +2580 +FC80 +2480 +77E0 +A480 +2480 +2480 +27E0 +2400 +ENDCHAR +STARTCHAR U_79FA +ENCODING 31226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2420 +F8C0 +2700 +3100 +29E0 +6700 +A120 +2120 +20E0 +ENDCHAR +STARTCHAR U_79FB +ENCODING 31227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E3E0 +2420 +FA40 +2180 +3680 +29E0 +6220 +A540 +2080 +2700 +ENDCHAR +STARTCHAR U_79FC +ENCODING 31228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6500 +27C0 +F900 +27E0 +7100 +6B80 +A340 +2520 +2900 +2100 +ENDCHAR +STARTCHAR U_79FD +ENCODING 31229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E4A0 +24A0 +27E0 +F900 +21E0 +3220 +6D40 +A080 +2300 +2C00 +ENDCHAR +STARTCHAR U_79FE +ENCODING 31230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2920 +2200 +FA00 +2540 +7540 +6C80 +A480 +2640 +2420 +ENDCHAR +STARTCHAR U_79FF +ENCODING 31231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +6FE0 +2100 +FFC0 +2540 +77C0 +6D40 +A7C0 +2540 +2540 +24C0 +ENDCHAR +STARTCHAR U_7A00 +ENCODING 31232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B60 +E080 +2360 +FC80 +27E0 +3280 +6FE0 +A6A0 +AAA0 +22E0 +2080 +ENDCHAR +STARTCHAR U_7A01 +ENCODING 31233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3F80 +2080 +FFE0 +8120 +3E00 +0400 +FFE0 +1500 +E4C0 +ENDCHAR +STARTCHAR U_7A02 +ENCODING 31234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2440 +FFC0 +2440 +37C0 +2D20 +6540 +A480 +2540 +2620 +ENDCHAR +STARTCHAR U_7A03 +ENCODING 31235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E720 +2540 +FA80 +27C0 +7080 +6900 +AFE0 +A100 +2100 +2300 +ENDCHAR +STARTCHAR U_7A04 +ENCODING 31236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E240 +27A0 +FA40 +2420 +33C0 +2A40 +6640 +A980 +2240 +2C20 +ENDCHAR +STARTCHAR U_7A05 +ENCODING 31237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E240 +2420 +FFC0 +2440 +7440 +6FC0 +A280 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7A06 +ENCODING 31238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +E220 +2220 +FBE0 +2000 +3000 +2FE0 +6420 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A07 +ENCODING 31239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +6FE0 +2920 +FFE0 +2920 +7BA0 +6D60 +A920 +2920 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7A08 +ENCODING 31240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E440 +27C0 +FC40 +27C0 +3000 +2FC0 +6100 +AFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7A09 +ENCODING 31241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +6100 +27C0 +FD40 +27C0 +7540 +6FC0 +A100 +2500 +2300 +2CE0 +ENDCHAR +STARTCHAR U_7A0A +ENCODING 31242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +E280 +27E0 +F920 +27E0 +3500 +2FE0 +6320 +A520 +2960 +2100 +ENDCHAR +STARTCHAR U_7A0B +ENCODING 31243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E440 +2440 +F7C0 +2000 +37C0 +6900 +67C0 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A0C +ENCODING 31244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E280 +2440 +FFE0 +2100 +37C0 +2900 +6540 +A920 +3120 +2300 +ENDCHAR +STARTCHAR U_7A0D +ENCODING 31245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1920 +E540 +2100 +FFC0 +2440 +77C0 +6C40 +A7C0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A0E +ENCODING 31246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +E280 +27C0 +FC40 +2440 +77C0 +6A80 +A280 +22A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_7A0F +ENCODING 31247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +EFE0 +2280 +FEE0 +2420 +7420 +6C20 +A6E0 +2280 +2280 +2FE0 +ENDCHAR +STARTCHAR U_7A10 +ENCODING 31248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E280 +2440 +FBA0 +2000 +3FE0 +2AA0 +6FE0 +AAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_7A11 +ENCODING 31249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2280 +3540 +2920 +67C0 +A100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A12 +ENCODING 31250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E520 +2520 +FFE0 +2520 +37A0 +2EA0 +67A0 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A13 +ENCODING 31251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +E7E0 +2240 +FA40 +27E0 +3000 +2BE0 +6220 +A3E0 +2220 +23E0 +ENDCHAR +STARTCHAR U_7A14 +ENCODING 31252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E280 +2540 +F8A0 +27C0 +3040 +2880 +62A0 +AA20 +2A40 +31C0 +ENDCHAR +STARTCHAR U_7A15 +ENCODING 31253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2240 +FBC0 +2000 +37C0 +2880 +6100 +AFE0 +2100 +2700 +ENDCHAR +STARTCHAR U_7A16 +ENCODING 31254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67C0 +2000 +F440 +2280 +77E0 +6800 +A7C0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A17 +ENCODING 31255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +24A0 +FFE0 +24A0 +37E0 +2AA0 +6480 +AFE0 +2080 +2080 +ENDCHAR +STARTCHAR U_7A18 +ENCODING 31256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +E7E0 +2240 +FBC0 +2240 +33C0 +2A40 +6FE0 +A000 +2240 +2420 +ENDCHAR +STARTCHAR U_7A19 +ENCODING 31257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2100 +FFC0 +2440 +37C0 +2C40 +6740 +A5C0 +2440 +2FE0 +ENDCHAR +STARTCHAR U_7A1A +ENCODING 31258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1300 +E280 +27E0 +FC80 +27C0 +3480 +2C80 +67C0 +A480 +2480 +27E0 +ENDCHAR +STARTCHAR U_7A1B +ENCODING 31259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E4A0 +2720 +FD20 +27E0 +3520 +2DA0 +6760 +A520 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A1C +ENCODING 31260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2240 +3520 +2BC0 +6540 +A880 +2340 +2C20 +ENDCHAR +STARTCHAR U_7A1D +ENCODING 31261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +6EE0 +2AA0 +FEE0 +2AA0 +7AA0 +AEE0 +2AA0 +2AA0 +2AA0 +3760 +ENDCHAR +STARTCHAR U_7A1E +ENCODING 31262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E540 +27C0 +FD40 +27C0 +3100 +2FE0 +6100 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_7A1F +ENCODING 31263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2F40 +2040 +3FC0 +0080 +3F00 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_7A20 +ENCODING 31264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E520 +27A0 +FD20 +27E0 +3420 +2FA0 +66A0 +A7A0 +2420 +2860 +ENDCHAR +STARTCHAR U_7A21 +ENCODING 31265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67E0 +2000 +FA40 +2240 +75A0 +6900 +A7E0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_7A22 +ENCODING 31266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E0A0 +2FE0 +F080 +2EA0 +3AA0 +6AA0 +AEC0 +A0A0 +2F60 +2220 +ENDCHAR +STARTCHAR U_7A23 +ENCODING 31267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9080 +FBE0 +A880 +F880 +A9C0 +AAA0 +FCA0 +0080 +F880 +ENDCHAR +STARTCHAR U_7A24 +ENCODING 31268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67E0 +2000 +FFC0 +2440 +77C0 +6900 +A380 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_7A25 +ENCODING 31269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +2480 +D660 +4940 +3FA0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7A26 +ENCODING 31270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2240 +FFE0 +2440 +37C0 +2880 +67E0 +A480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_7A27 +ENCODING 31271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +67E0 +22A0 +F7A0 +22A0 +7760 +6A80 +A7E0 +2100 +2280 +2460 +ENDCHAR +STARTCHAR U_7A28 +ENCODING 31272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2820 +FFE0 +2800 +3FE0 +6AA0 +AFE0 +2AA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_7A29 +ENCODING 31273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1FC0 +E540 +27C0 +FD40 +27C0 +7440 +6FC0 +A440 +27C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A2A +ENCODING 31274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +67E0 +2C40 +F7C0 +2440 +77C0 +6A00 +A7C0 +2280 +2100 +26E0 +ENDCHAR +STARTCHAR U_7A2B +ENCODING 31275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E000 +23C0 +F240 +23C0 +3000 +6FE0 +A520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_7A2C +ENCODING 31276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +67E0 +2100 +FFE0 +2AA0 +7AA0 +6900 +A7E0 +2100 +2280 +2460 +ENDCHAR +STARTCHAR U_7A2D +ENCODING 31277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +66A0 +24C0 +FEA0 +24E0 +7200 +6FC0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A2E +ENCODING 31278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +27E0 +FD40 +27C0 +3540 +2FC0 +6100 +A7C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A2F +ENCODING 31279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +16A0 +E520 +26A0 +FFE0 +2240 +3520 +2BC0 +6640 +A980 +2240 +2420 +ENDCHAR +STARTCHAR U_7A30 +ENCODING 31280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E120 +25C0 +F500 +2BE0 +3440 +2FC0 +6440 +A7C0 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A31 +ENCODING 31281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +E720 +2920 +F540 +27C0 +3540 +2FC0 +6540 +AFE0 +2440 +24C0 +ENDCHAR +STARTCHAR U_7A32 +ENCODING 31282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +67A0 +2520 +FAC0 +2000 +75E0 +6D20 +A520 +25E0 +2520 +25E0 +ENDCHAR +STARTCHAR U_7A33 +ENCODING 31283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +E3C0 +2480 +FFC0 +2040 +37C0 +2840 +67C0 +AD40 +3420 +23C0 +ENDCHAR +STARTCHAR U_7A34 +ENCODING 31284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +6FE0 +2280 +FFE0 +32A0 +6FE0 +62A0 +AFE0 +26C0 +2AA0 +2280 +ENDCHAR +STARTCHAR U_7A35 +ENCODING 31285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +6280 +2FE0 +FA40 +2480 +7B20 +6FC0 +A480 +2B20 +3FE0 +2120 +ENDCHAR +STARTCHAR U_7A36 +ENCODING 31286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +18C0 +60A0 +2FE0 +F080 +2EC0 +7BA0 +6AC0 +AFA0 +20C0 +2EA0 +2160 +ENDCHAR +STARTCHAR U_7A37 +ENCODING 31287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E520 +27E0 +FD20 +27E0 +3440 +2BE0 +6240 +A580 +2240 +2420 +ENDCHAR +STARTCHAR U_7A38 +ENCODING 31288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2200 +FC80 +2300 +7440 +6FE0 +A540 +27C0 +2540 +27C0 +ENDCHAR +STARTCHAR U_7A39 +ENCODING 31289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2100 +FFC0 +2440 +3740 +2DC0 +6440 +AFE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7A3A +ENCODING 31290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6420 +27E0 +FC80 +27E0 +7540 +6FE0 +A480 +2BE0 +2880 +3080 +ENDCHAR +STARTCHAR U_7A3B +ENCODING 31291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +E720 +2520 +FAC0 +2000 +36E0 +2C20 +6760 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7A3C +ENCODING 31292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2420 +FFE0 +2220 +3540 +2A80 +65C0 +AAA0 +24A0 +2B00 +ENDCHAR +STARTCHAR U_7A3D +ENCODING 31293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +2520 +F8E0 +27A0 +3420 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A3E +ENCODING 31294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +4940 +5F40 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7A3F +ENCODING 31295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E7E0 +2240 +FBC0 +2000 +3FE0 +2820 +6BA0 +AAA0 +2BA0 +2860 +ENDCHAR +STARTCHAR U_7A40 +ENCODING 31296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +8C00 +73E0 +2220 +F940 +2080 +7140 +AE20 +ENDCHAR +STARTCHAR U_7A41 +ENCODING 31297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A80 +6FE0 +2280 +FFE0 +2440 +77C0 +6C40 +A7C0 +2440 +2FE0 +2040 +ENDCHAR +STARTCHAR U_7A42 +ENCODING 31298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2100 +FFC0 +3540 +6FC0 +6540 +A7C0 +2220 +3540 +23C0 +ENDCHAR +STARTCHAR U_7A43 +ENCODING 31299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2820 +F440 +2920 +7280 +6C40 +BFE0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7A44 +ENCODING 31300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +E7E0 +29A0 +FE40 +2440 +3BA0 +2000 +6FE0 +A540 +2920 +3320 +ENDCHAR +STARTCHAR U_7A45 +ENCODING 31301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +CFE0 +4940 +FFE0 +4940 +6FC0 +D900 +CD40 +4B80 +5D60 +6300 +ENDCHAR +STARTCHAR U_7A46 +ENCODING 31302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7E0 +2420 +FFE0 +2520 +3340 +2DA0 +6040 +A7A0 +2040 +2780 +ENDCHAR +STARTCHAR U_7A47 +ENCODING 31303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +F7A0 +2440 +FAA0 +2FE0 +3280 +6540 +AAA0 +2540 +2280 +2F00 +ENDCHAR +STARTCHAR U_7A48 +ENCODING 31304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9080 +FFE0 +B5C0 +D2A0 +BF80 +8400 +FFE0 +9480 +E460 +ENDCHAR +STARTCHAR U_7A49 +ENCODING 31305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6820 +2FE0 +FAA0 +29C0 +7AA0 +6A80 +ABE0 +2C80 +2FE0 +3080 +ENDCHAR +STARTCHAR U_7A4A +ENCODING 31306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1EE0 +EA40 +2EC0 +FB40 +2FE0 +3A40 +2840 +6C40 +AAC0 +2D40 +2260 +ENDCHAR +STARTCHAR U_7A4B +ENCODING 31307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +E120 +25A0 +FB60 +2480 +3340 +2C60 +6180 +A640 +2180 +2600 +ENDCHAR +STARTCHAR U_7A4C +ENCODING 31308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7380 +9080 +F880 +AFE0 +F880 +A9C0 +AAA0 +FCA0 +5480 +A880 +ENDCHAR +STARTCHAR U_7A4D +ENCODING 31309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2100 +FFC0 +2100 +2FE0 +3440 +6FC0 +A440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A4E +ENCODING 31310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +6080 +4BE0 +3A20 +03E0 +FA20 +23E0 +FA20 +33E0 +6940 +A620 +ENDCHAR +STARTCHAR U_7A4F +ENCODING 31311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +6F40 +2580 +FFC0 +3040 +6FC0 +6040 +AFC0 +2240 +34A0 +3380 +ENDCHAR +STARTCHAR U_7A50 +ENCODING 31312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1B80 +6500 +27C0 +FD40 +37C0 +6D40 +67C0 +A540 +27C0 +2120 +20E0 +ENDCHAR +STARTCHAR U_7A51 +ENCODING 31313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2920 +2540 +FFE0 +2000 +7FE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_7A52 +ENCODING 31314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFC0 +3480 +7FC0 +A0A0 +3F80 +2080 +3FE0 +5540 +55C0 +ENDCHAR +STARTCHAR U_7A53 +ENCODING 31315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E940 +2FC0 +F940 +2FC0 +7480 +6FC0 +A480 +3FE0 +2480 +2840 +ENDCHAR +STARTCHAR U_7A54 +ENCODING 31316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +E7E0 +2280 +27E0 +F100 +27C0 +3540 +6FC0 +A540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A55 +ENCODING 31317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +6FE0 +3480 +FFC0 +3480 +6FE0 +6500 +AFE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_7A56 +ENCODING 31318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +E520 +2BC0 +2540 +FBE0 +2540 +7FE0 +A540 +26A0 +2960 +3220 +ENDCHAR +STARTCHAR U_7A57 +ENCODING 31319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2540 +F7C0 +2540 +37C0 +6140 +AFE0 +2540 +2CA0 +33A0 +ENDCHAR +STARTCHAR U_7A58 +ENCODING 31320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2440 +3EE0 +6440 +AFE0 +2280 +24A0 +3860 +ENDCHAR +STARTCHAR U_7A59 +ENCODING 31321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1AA0 +66C0 +2FE0 +F240 +6FE0 +7100 +6FC0 +A100 +2FE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7A5A +ENCODING 31322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +2FE0 +F240 +2FE0 +3240 +2FE0 +6820 +ABA0 +2AA0 +2BE0 +ENDCHAR +STARTCHAR U_7A5B +ENCODING 31323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3500 +E7E0 +2500 +FFC0 +2500 +37C0 +6D00 +A7E0 +2540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_7A5C +ENCODING 31324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2280 +F100 +2FE0 +3540 +67C0 +A540 +2FE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7A5D +ENCODING 31325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +6440 +27C0 +F440 +3FE0 +6A00 +6FE0 +AB20 +2EC0 +3AC0 +2320 +ENDCHAR +STARTCHAR U_7A5E +ENCODING 31326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E480 +27C0 +FD40 +27C0 +7540 +AFE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A5F +ENCODING 31327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +E980 +2FE0 +F120 +22C0 +3980 +6AC0 +A9A0 +2AA0 +2D00 +33E0 +ENDCHAR +STARTCHAR U_7A60 +ENCODING 31328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +EFE0 +2AA0 +FFE0 +2AA0 +3FE0 +6800 +AFE0 +2AA0 +2A40 +33A0 +ENDCHAR +STARTCHAR U_7A61 +ENCODING 31329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2540 +FBA0 +2FE0 +2000 +7FE0 +AAA0 +2BA0 +2820 +2FE0 +ENDCHAR +STARTCHAR U_7A62 +ENCODING 31330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +E500 +2FE0 +F0A0 +2FE0 +3A80 +6FA0 +AAC0 +32A0 +2560 +2A20 +ENDCHAR +STARTCHAR U_7A63 +ENCODING 31331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2440 +FAA0 +2FC0 +7280 +6FE0 +A340 +2680 +3B60 +2240 +ENDCHAR +STARTCHAR U_7A64 +ENCODING 31332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +6100 +2FE0 +FD60 +2380 +7560 +6FE0 +A200 +2FE0 +2AA0 +2AE0 +ENDCHAR +STARTCHAR U_7A65 +ENCODING 31333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +CDE0 +4920 +FDE0 +6AA0 +DEE0 +CAA0 +5FE0 +4440 +4820 +5020 +ENDCHAR +STARTCHAR U_7A66 +ENCODING 31334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6FE0 +2820 +FFC0 +3520 +6940 +67C0 +BD40 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A67 +ENCODING 31335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +26A0 +F540 +2D40 +3560 +6540 +A7C0 +A440 +27C0 +2840 +ENDCHAR +STARTCHAR U_7A68 +ENCODING 31336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +FD40 +27E0 +7240 +ABC0 +7240 +53C0 +5640 +5BC0 +9660 +ENDCHAR +STARTCHAR U_7A69 +ENCODING 31337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E540 +2FE0 +F100 +2FE0 +3040 +6FE0 +A040 +2FC0 +3520 +27A0 +ENDCHAR +STARTCHAR U_7A6A +ENCODING 31338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +6540 +2920 +FFE0 +2D60 +7BA0 +6D60 +AD60 +2BA0 +2D60 +2860 +ENDCHAR +STARTCHAR U_7A6B +ENCODING 31339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +EFE0 +2440 +FFE0 +2480 +37E0 +2C80 +67E0 +A240 +2180 +2E60 +ENDCHAR +STARTCHAR U_7A6C +ENCODING 31340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2940 +FFE0 +2940 +3FE0 +2D40 +6FC0 +AD40 +33C0 +2660 +ENDCHAR +STARTCHAR U_7A6D +ENCODING 31341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1700 +E7C0 +2D40 +FFC0 +2540 +37E0 +6D40 +A460 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7A6E +ENCODING 31342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2AA0 +FFE0 +2A80 +3BE0 +6A80 +ABE0 +2800 +3540 +2AA0 +ENDCHAR +STARTCHAR U_7A6F +ENCODING 31343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +EFE0 +2100 +FD60 +3100 +6FE0 +6820 +ABA0 +2AA0 +2BA0 +2FE0 +ENDCHAR +STARTCHAR U_7A70 +ENCODING 31344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +EFE0 +2AA0 +FEE0 +2480 +3FE0 +6480 +BFE0 +24A0 +2D40 +3620 +ENDCHAR +STARTCHAR U_7A71 +ENCODING 31345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +E940 +2FE0 +FAA0 +2FE0 +3A20 +6FE0 +AAA0 +2E60 +2A20 +2D60 +ENDCHAR +STARTCHAR U_7A72 +ENCODING 31346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +CAA0 +4AA0 +F100 +4FE0 +6AA0 +DFE0 +CC80 +56E0 +54A0 +6660 +ENDCHAR +STARTCHAR U_7A73 +ENCODING 31347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1540 +6FE0 +2440 +FFE0 +26C0 +7B60 +6FC0 +A540 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_7A74 +ENCODING 31348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0400 +FFC0 +8040 +9240 +1200 +1200 +2100 +2100 +40C0 +8040 +ENDCHAR +STARTCHAR U_7A75 +ENCODING 31349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +9240 +2100 +4080 +BC00 +0800 +1000 +2080 +4080 +3F80 +ENDCHAR +STARTCHAR U_7A76 +ENCODING 31350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +4840 +0800 +3F00 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_7A77 +ENCODING 31351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +2080 +4440 +8420 +7FC0 +0840 +1040 +2040 +C180 +ENDCHAR +STARTCHAR U_7A78 +ENCODING 31352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +2100 +C8C0 +0F80 +1080 +6900 +0600 +1C00 +E000 +ENDCHAR +STARTCHAR U_7A79 +ENCODING 31353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +7FC0 +0080 +3F80 +4000 +7FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_7A7A +ENCODING 31354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8900 +1080 +6040 +1F80 +0400 +0400 +0400 +7FE0 +ENDCHAR +STARTCHAR U_7A7B +ENCODING 31355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +A120 +4080 +BF40 +0400 +FFE0 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_7A7C +ENCODING 31356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4140 +1080 +2440 +7FC0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_7A7D +ENCODING 31357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +5140 +9120 +7F80 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7A7E +ENCODING 31358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +5F40 +0400 +FFE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7A7F +ENCODING 31359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +7F80 +2200 +7FC0 +0A00 +1200 +2200 +CE00 +ENDCHAR +STARTCHAR U_7A80 +ENCODING 31360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +FFE0 +0400 +2480 +2480 +3FA0 +0420 +03E0 +ENDCHAR +STARTCHAR U_7A81 +ENCODING 31361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +9080 +2540 +0480 +7FE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7A82 +ENCODING 31362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A120 +4480 +A460 +3F80 +4400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7A83 +ENCODING 31363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6080 +27E0 +2120 +F920 +2120 +2D20 +3220 +0CC0 +ENDCHAR +STARTCHAR U_7A84 +ENCODING 31364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +9240 +2100 +6080 +3FC0 +4800 +8F80 +0800 +0FC0 +0800 +ENDCHAR +STARTCHAR U_7A85 +ENCODING 31365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7FC0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7A86 +ENCODING 31366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4340 +7C00 +0400 +7F80 +0200 +0C00 +3000 +CFE0 +ENDCHAR +STARTCHAR U_7A87 +ENCODING 31367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +5040 +3F80 +4080 +9E80 +1280 +1FA0 +1020 +0FE0 +ENDCHAR +STARTCHAR U_7A88 +ENCODING 31368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2140 +4100 +9FE0 +E120 +5120 +8A20 +F520 +08C0 +ENDCHAR +STARTCHAR U_7A89 +ENCODING 31369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60C0 +3F80 +0400 +7FC0 +4440 +4A40 +5140 +40C0 +ENDCHAR +STARTCHAR U_7A8A +ENCODING 31370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +47C0 +3900 +2900 +2900 +4A80 +4D40 +8920 +ENDCHAR +STARTCHAR U_7A8B +ENCODING 31371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4440 +2480 +2480 +3F80 +0400 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7A8C +ENCODING 31372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +4840 +73C0 +4A40 +5A40 +6B40 +1280 +6200 +ENDCHAR +STARTCHAR U_7A8D +ENCODING 31373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +47E0 +F900 +23E0 +2020 +3820 +C120 +00C0 +ENDCHAR +STARTCHAR U_7A8E +ENCODING 31374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +4880 +BF40 +2900 +2500 +3FC0 +0040 +7E40 +00C0 +ENDCHAR +STARTCHAR U_7A8F +ENCODING 31375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +2FC0 +8100 +7FE0 +2100 +C100 +4500 +4200 +ENDCHAR +STARTCHAR U_7A90 +ENCODING 31376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4440 +3F80 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7A91 +ENCODING 31377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +5040 +3FC0 +0400 +FFE0 +0400 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7A92 +ENCODING 31378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A0A0 +7FC0 +1080 +3F40 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7A93 +ENCODING 31379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +FFE0 +8220 +2100 +C8C0 +1200 +3F00 +0800 +5440 +9120 +0F00 +ENDCHAR +STARTCHAR U_7A94 +ENCODING 31380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +FFE0 +1100 +20C0 +CA00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7A95 +ENCODING 31381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2040 +4A20 +2A80 +1B00 +2A80 +CA20 +1220 +61E0 +ENDCHAR +STARTCHAR U_7A96 +ENCODING 31382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +6440 +3F80 +4400 +FFE0 +0000 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7A97 +ENCODING 31383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +A140 +4880 +FFC0 +4880 +5F80 +7280 +4C80 +5280 +7F80 +ENDCHAR +STARTCHAR U_7A98 +ENCODING 31384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +0880 +FFE0 +0880 +7FC0 +3040 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7A99 +ENCODING 31385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9520 +BFA0 +0500 +7FE0 +0900 +1200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_7A9A +ENCODING 31386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2240 +C220 +7FE0 +4240 +7A40 +4980 +49A0 +9E60 +ENDCHAR +STARTCHAR U_7A9B +ENCODING 31387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +7C80 +03E0 +FD40 +2880 +2B60 +4820 +87E0 +ENDCHAR +STARTCHAR U_7A9C +ENCODING 31388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A4A0 +3FC0 +2480 +7FC0 +4440 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_7A9D +ENCODING 31389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +BFA0 +6140 +3F00 +0400 +7FC0 +4A40 +5140 +4080 +ENDCHAR +STARTCHAR U_7A9E +ENCODING 31390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4840 +9F20 +2200 +7BC0 +2040 +3BC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7A9F +ENCODING 31391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +6040 +3FC0 +2A80 +2F80 +3240 +5240 +9FC0 +ENDCHAR +STARTCHAR U_7AA0 +ENCODING 31392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7FC0 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7AA1 +ENCODING 31393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +A0A0 +7BC0 +1100 +6AC0 +0000 +7BC0 +4A40 +3180 +CA60 +ENDCHAR +STARTCHAR U_7AA2 +ENCODING 31394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +92A0 +6240 +FFC0 +0200 +7A40 +4A80 +7920 +02A0 +FC60 +ENDCHAR +STARTCHAR U_7AA3 +ENCODING 31395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A4A0 +7FC0 +1100 +2A80 +4440 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7AA4 +ENCODING 31396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +7FC0 +A4A0 +2880 +3F80 +2240 +3B80 +2240 +31C0 +ENDCHAR +STARTCHAR U_7AA5 +ENCODING 31397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +60A0 +27C0 +FC40 +2540 +FD40 +3180 +4AA0 +8CE0 +ENDCHAR +STARTCHAR U_7AA6 +ENCODING 31398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +5F40 +0400 +FFC0 +2A40 +1200 +FFE0 +0500 +78E0 +ENDCHAR +STARTCHAR U_7AA7 +ENCODING 31399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +A0A0 +4740 +8420 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7AA8 +ENCODING 31400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +2440 +7FC0 +0900 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7AA9 +ENCODING 31401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7F80 +A140 +3D00 +2500 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_7AAA +ENCODING 31402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +0240 +4FC0 +A200 +5FE0 +2200 +CFC0 +4200 +5FE0 +ENDCHAR +STARTCHAR U_7AAB +ENCODING 31403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7FC0 +1140 +7D40 +1440 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7AAC +ENCODING 31404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +64C0 +1B00 +FEE0 +4940 +7940 +4940 +7840 +49C0 +ENDCHAR +STARTCHAR U_7AAD +ENCODING 31405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +24A0 +5540 +7FC0 +1500 +2880 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_7AAE +ENCODING 31406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +7DE0 +4420 +7DE0 +4500 +FDE0 +2420 +CCC0 +ENDCHAR +STARTCHAR U_7AAF +ENCODING 31407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +4A80 +7FC0 +0400 +3F80 +0400 +FFE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_7AB0 +ENCODING 31408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4740 +B8A0 +2900 +7FC0 +0400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7AB1 +ENCODING 31409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +47C0 +5A80 +D100 +5280 +5FE0 +4540 +5B20 +ENDCHAR +STARTCHAR U_7AB2 +ENCODING 31410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +21A0 +AA40 +7140 +2240 +F940 +37E0 +6840 +A440 +ENDCHAR +STARTCHAR U_7AB3 +ENCODING 31411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +5FE0 +E540 +A540 +A540 +AD40 +B5A0 +A960 +ENDCHAR +STARTCHAR U_7AB4 +ENCODING 31412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2480 +7FC0 +2080 +3F80 +2080 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7AB5 +ENCODING 31413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4840 +3F80 +2080 +3FC0 +2000 +3FE0 +4A20 +9560 +ENDCHAR +STARTCHAR U_7AB6 +ENCODING 31414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +2480 +FFE0 +2480 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_7AB7 +ENCODING 31415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +2080 +F2E0 +AEA0 +EAA0 +AAA0 +EEE0 +A280 +E480 +ENDCHAR +STARTCHAR U_7AB8 +ENCODING 31416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +A3A0 +7C80 +1500 +FFC0 +2500 +54C0 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_7AB9 +ENCODING 31417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +4040 +97A0 +5200 +77C0 +1240 +7FE0 +5440 +97C0 +ENDCHAR +STARTCHAR U_7ABA +ENCODING 31418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +6080 +27C0 +FC40 +27C0 +FC40 +27C0 +52A0 +8CE0 +ENDCHAR +STARTCHAR U_7ABB +ENCODING 31419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +7FC0 +AAA0 +2E80 +3480 +3F80 +5440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_7ABC +ENCODING 31420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +B540 +4AA0 +BF80 +2480 +3F80 +2480 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_7ABD +ENCODING 31421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +6240 +BBE0 +2220 +3C80 +5080 +FC80 +2940 +4620 +ENDCHAR +STARTCHAR U_7ABE +ENCODING 31422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +7A80 +13E0 +7E20 +00C0 +7C80 +1080 +5940 +B620 +ENDCHAR +STARTCHAR U_7ABF +ENCODING 31423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +90A0 +E780 +AC80 +C300 +BCE0 +A900 +EFC0 +8100 +9FE0 +ENDCHAR +STARTCHAR U_7AC0 +ENCODING 31424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +4080 +FFE0 +2440 +BFC0 +A440 +BFC0 +E2A0 +0CE0 +ENDCHAR +STARTCHAR U_7AC1 +ENCODING 31425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A8A0 +4840 +FFA0 +0820 +FFE0 +2100 +FFE0 +2520 +3DE0 +ENDCHAR +STARTCHAR U_7AC2 +ENCODING 31426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +7FC0 +AAA0 +1F00 +3580 +D960 +1F00 +2500 +4C80 +ENDCHAR +STARTCHAR U_7AC3 +ENCODING 31427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +7FC0 +0400 +3F80 +2480 +7FC0 +4440 +7FC0 +07E0 +ENDCHAR +STARTCHAR U_7AC4 +ENCODING 31428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +59C0 +2040 +3DC0 +2040 +3FC0 +3680 +2DA0 +7660 +ENDCHAR +STARTCHAR U_7AC5 +ENCODING 31429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A120 +7A80 +4BE0 +7A40 +2540 +F940 +4880 +4940 +B620 +ENDCHAR +STARTCHAR U_7AC6 +ENCODING 31430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A0A0 +7BC0 +CA60 +7BC0 +4800 +FBC0 +2A40 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_7AC7 +ENCODING 31431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +FFE0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_7AC8 +ENCODING 31432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +A4A0 +5F40 +0400 +FFE0 +2A80 +7BC0 +4A40 +7BA0 +07E0 +ENDCHAR +STARTCHAR U_7AC9 +ENCODING 31433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +52A0 +FBC0 +2A00 +FFC0 +4840 +7BC0 +4A80 +7AA0 +4BE0 +ENDCHAR +STARTCHAR U_7ACA +ENCODING 31434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +61C0 +A900 +6FC0 +F540 +2FE0 +7AA0 +ABA0 +2860 +ENDCHAR +STARTCHAR U_7ACB +ENCODING 31435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +0000 +1080 +1080 +0900 +0900 +0A00 +0200 +FFE0 +ENDCHAR +STARTCHAR U_7ACC +ENCODING 31436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2380 +FA80 +1280 +5280 +5280 +2280 +3AA0 +C4A0 +04A0 +0860 +ENDCHAR +STARTCHAR U_7ACD +ENCODING 31437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1100 +FD00 +0900 +4FE0 +4900 +5100 +3900 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_7ACE +ENCODING 31438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1080 +FFE0 +0000 +1100 +FFE0 +1100 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7ACF +ENCODING 31439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +0100 +8900 +4FE0 +5100 +3900 +C100 +0100 +0100 +ENDCHAR +STARTCHAR U_7AD0 +ENCODING 31440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +0A20 +8C00 +53C0 +5240 +3980 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_7AD1 +ENCODING 31441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FBE0 +0100 +8A80 +8A80 +5480 +5500 +2540 +F920 +03E0 +ENDCHAR +STARTCHAR U_7AD2 +ENCODING 31442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +0080 +0280 +0100 +ENDCHAR +STARTCHAR U_7AD3 +ENCODING 31443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23C0 +F900 +0100 +97C0 +5100 +5100 +2FE0 +3100 +C120 +00E0 +ENDCHAR +STARTCHAR U_7AD4 +ENCODING 31444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2640 +FA40 +1240 +5FE0 +5240 +2240 +3A40 +C240 +0440 +0840 +ENDCHAR +STARTCHAR U_7AD5 +ENCODING 31445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +FA40 +1440 +9820 +57C0 +2240 +3240 +C440 +0940 +1080 +ENDCHAR +STARTCHAR U_7AD6 +ENCODING 31446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +5440 +5280 +5100 +5280 +1460 +0200 +7FC0 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_7AD7 +ENCODING 31447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +0540 +9920 +5140 +6140 +3880 +C100 +0600 +1800 +ENDCHAR +STARTCHAR U_7AD8 +ENCODING 31448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0420 +93A0 +52A0 +52A0 +23A0 +3820 +C120 +00C0 +ENDCHAR +STARTCHAR U_7AD9 +ENCODING 31449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F9E0 +0100 +9100 +57C0 +5440 +2440 +3440 +C440 +07C0 +ENDCHAR +STARTCHAR U_7ADA +ENCODING 31450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +1000 +9FE0 +5100 +6100 +3900 +C100 +0500 +0200 +ENDCHAR +STARTCHAR U_7ADB +ENCODING 31451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +0500 +F480 +9A60 +5200 +6FC0 +3080 +C500 +0200 +0100 +ENDCHAR +STARTCHAR U_7ADC +ENCODING 31452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +0420 +03E0 +ENDCHAR +STARTCHAR U_7ADD +ENCODING 31453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0000 +F7E0 +8000 +5440 +5240 +2280 +3080 +C100 +0FE0 +ENDCHAR +STARTCHAR U_7ADE +ENCODING 31454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F80 +1200 +FFC0 +0000 +3F00 +2100 +3F00 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_7ADF +ENCODING 31455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7AE0 +ENCODING 31456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7AE1 +ENCODING 31457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +FA00 +07C0 +9440 +9440 +67C0 +3C40 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_7AE2 +ENCODING 31458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2440 +FFE0 +0400 +97C0 +5900 +5100 +2FE0 +3100 +C280 +0C60 +ENDCHAR +STARTCHAR U_7AE3 +ENCODING 31459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2240 +F7A0 +1240 +9520 +53C0 +6640 +2A80 +F180 +0240 +0C20 +ENDCHAR +STARTCHAR U_7AE4 +ENCODING 31460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +27E0 +FD20 +0100 +97E0 +5280 +6280 +2280 +F520 +0920 +13E0 +ENDCHAR +STARTCHAR U_7AE5 +ENCODING 31461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7AE6 +ENCODING 31462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +07E0 +9520 +57E0 +5100 +2380 +F540 +0920 +1120 +ENDCHAR +STARTCHAR U_7AE7 +ENCODING 31463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +FC40 +97C0 +5440 +67C0 +3460 +CFC0 +0240 +1D40 +0080 +ENDCHAR +STARTCHAR U_7AE8 +ENCODING 31464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F900 +17C0 +9440 +57C0 +6440 +37C0 +C100 +0FE0 +0100 +ENDCHAR +STARTCHAR U_7AE9 +ENCODING 31465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4100 +27E0 +FC20 +13C0 +9240 +53C0 +6240 +3BC0 +C240 +0FE0 +ENDCHAR +STARTCHAR U_7AEA +ENCODING 31466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +53C0 +7A40 +4980 +7980 +5260 +7C00 +0400 +7FC0 +1100 +FFE0 +ENDCHAR +STARTCHAR U_7AEB +ENCODING 31467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +FC80 +07C0 +9140 +9FE0 +6140 +27C0 +3900 +C100 +0700 +ENDCHAR +STARTCHAR U_7AEC +ENCODING 31468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2100 +F7C0 +1540 +9FC0 +5100 +6FE0 +3960 +CFE0 +0820 +0860 +ENDCHAR +STARTCHAR U_7AED +ENCODING 31469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +0440 +97C0 +5200 +1FE0 +24A0 +3560 +C7A0 +00C0 +ENDCHAR +STARTCHAR U_7AEE +ENCODING 31470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FFE0 +0620 +9540 +57E0 +5540 +27E0 +3540 +CA40 +1440 +ENDCHAR +STARTCHAR U_7AEF +ENCODING 31471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4520 +F7E0 +0000 +AFE0 +A100 +AFE0 +4AA0 +6AA0 +8AA0 +0860 +ENDCHAR +STARTCHAR U_7AF0 +ENCODING 31472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2800 +FBE0 +0AA0 +9BE0 +9AA0 +6BE0 +3880 +CBE0 +1080 +27E0 +ENDCHAR +STARTCHAR U_7AF1 +ENCODING 31473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F540 +07C0 +9540 +9FE0 +20A0 +3FE0 +C480 +0280 +0100 +ENDCHAR +STARTCHAR U_7AF2 +ENCODING 31474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +4280 +2FE0 +FD60 +0BA0 +9FE0 +5000 +27C0 +3540 +C540 +07C0 +ENDCHAR +STARTCHAR U_7AF3 +ENCODING 31475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +4F40 +2AA0 +F440 +8BA0 +5000 +57C0 +2440 +37C0 +C280 +1FE0 +ENDCHAR +STARTCHAR U_7AF4 +ENCODING 31476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4FE0 +F280 +0FE0 +AAA0 +AFE0 +4820 +3FE0 +C240 +0240 +00C0 +ENDCHAR +STARTCHAR U_7AF5 +ENCODING 31477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2040 +FFE0 +0B40 +9FE0 +5040 +6FE0 +3AA0 +CFE0 +0920 +0960 +ENDCHAR +STARTCHAR U_7AF6 +ENCODING 31478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +5140 +FFE0 +0000 +FBE0 +8A20 +FBE0 +2180 +6AA0 +B4E0 +ENDCHAR +STARTCHAR U_7AF7 +ENCODING 31479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +5180 +FE40 +8BE0 +FA80 +8BE0 +FA20 +2640 +F980 +2660 +ENDCHAR +STARTCHAR U_7AF8 +ENCODING 31480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +5280 +FFE0 +4A40 +7BC0 +4A40 +7BC0 +5280 +5AA0 +9460 +ENDCHAR +STARTCHAR U_7AF9 +ENCODING 31481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +7BE0 +5280 +9480 +1080 +1080 +1080 +1080 +1080 +1380 +ENDCHAR +STARTCHAR U_7AFA +ENCODING 31482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3DE0 +5280 +8840 +0000 +3F80 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_7AFB +ENCODING 31483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8A40 +0400 +7FC0 +0440 +0440 +0840 +1240 +6180 +ENDCHAR +STARTCHAR U_7AFC +ENCODING 31484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +1F00 +1100 +1500 +1300 +1120 +2120 +40E0 +ENDCHAR +STARTCHAR U_7AFD +ENCODING 31485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1040 +3F80 +0400 +FFE0 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_7AFE +ENCODING 31486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5140 +8A40 +0400 +2780 +3C80 +E480 +25A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_7AFF +ENCODING 31487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +3F80 +0400 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7B00 +ENCODING 31488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3DE0 +5280 +8C40 +7FE0 +1000 +1000 +1000 +1000 +1FC0 +ENDCHAR +STARTCHAR U_7B01 +ENCODING 31489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +0000 +7FC0 +0400 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B02 +ENCODING 31490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5680 +9440 +3F00 +0900 +1900 +0D20 +0B20 +1120 +20E0 +ENDCHAR +STARTCHAR U_7B03 +ENCODING 31491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +9480 +7F00 +2100 +3FC0 +0040 +FF40 +0040 +0180 +ENDCHAR +STARTCHAR U_7B04 +ENCODING 31492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +9240 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7B05 +ENCODING 31493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +3B80 +0400 +1B00 +60C0 +1200 +0C00 +F3C0 +ENDCHAR +STARTCHAR U_7B06 +ENCODING 31494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +3FC0 +2240 +2240 +3FC0 +2020 +2020 +3FE0 +ENDCHAR +STARTCHAR U_7B07 +ENCODING 31495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5500 +8C80 +0400 +7FE0 +0400 +0700 +0480 +0480 +0400 +ENDCHAR +STARTCHAR U_7B08 +ENCODING 31496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +BF40 +1200 +13C0 +1880 +2500 +2200 +4500 +98E0 +ENDCHAR +STARTCHAR U_7B09 +ENCODING 31497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A840 +3FC0 +4840 +8440 +0040 +0640 +3840 +0180 +ENDCHAR +STARTCHAR U_7B0A +ENCODING 31498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +1080 +3F80 +2500 +2500 +2500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_7B0B +ENCODING 31499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +39E0 +5280 +BFC0 +0480 +FFE0 +0480 +3F80 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_7B0C +ENCODING 31500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +0200 +2200 +7FC0 +0A00 +1200 +E200 +0600 +ENDCHAR +STARTCHAR U_7B0D +ENCODING 31501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +0400 +7FC0 +4440 +4A40 +5140 +6040 +40C0 +ENDCHAR +STARTCHAR U_7B0E +ENCODING 31502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +39E0 +5280 +8C40 +3F80 +0000 +FFE0 +0900 +0920 +3120 +C0E0 +ENDCHAR +STARTCHAR U_7B0F +ENCODING 31503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4200 +7BC0 +9500 +2000 +3F80 +4A80 +9280 +2480 +4880 +1080 +2300 +ENDCHAR +STARTCHAR U_7B10 +ENCODING 31504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +0400 +FFE0 +0000 +1F00 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_7B11 +ENCODING 31505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1440 +0380 +3C00 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7B12 +ENCODING 31506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9280 +0E40 +3180 +C460 +0200 +3F80 +0100 +0200 +0400 +ENDCHAR +STARTCHAR U_7B13 +ENCODING 31507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +4200 +4240 +7A80 +4300 +4A20 +5220 +E1E0 +ENDCHAR +STARTCHAR U_7B14 +ENCODING 31508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8F40 +7800 +0F00 +7800 +0FC0 +F800 +0820 +07E0 +ENDCHAR +STARTCHAR U_7B15 +ENCODING 31509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +3F80 +2080 +2480 +2680 +0620 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_7B16 +ENCODING 31510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +2080 +2880 +2500 +2100 +3A80 +2440 +1820 +ENDCHAR +STARTCHAR U_7B17 +ENCODING 31511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +1F80 +E900 +0600 +1980 +E460 +0A00 +0400 +ENDCHAR +STARTCHAR U_7B18 +ENCODING 31512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8400 +07C0 +0400 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_7B19 +ENCODING 31513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0A40 +1200 +3FC0 +4200 +1F80 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_7B1A +ENCODING 31514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0840 +3FC0 +2440 +3FC0 +2440 +3FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_7B1B +ENCODING 31515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1440 +7FC0 +4440 +4440 +7FC0 +4440 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7B1C +ENCODING 31516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +5480 +8C00 +2480 +2480 +3F80 +0400 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7B1D +ENCODING 31517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +FFC0 +4040 +5F40 +4A40 +4440 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_7B1E +ENCODING 31518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0900 +1080 +3F40 +0000 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_7B1F +ENCODING 31519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7FE0 +5280 +CD40 +3E00 +2900 +2900 +2880 +4A80 +4E60 +9A40 +ENDCHAR +STARTCHAR U_7B20 +ENCODING 31520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +9480 +0400 +7FC0 +0100 +1100 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_7B21 +ENCODING 31521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +C880 +1F00 +1100 +1F00 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_7B22 +ENCODING 31522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +9080 +7FC0 +4040 +7FC0 +4400 +7FE0 +4220 +5920 +60E0 +ENDCHAR +STARTCHAR U_7B23 +ENCODING 31523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9280 +2840 +3FC0 +4040 +BE40 +2240 +3E80 +2020 +1FE0 +ENDCHAR +STARTCHAR U_7B24 +ENCODING 31524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +7FC0 +0440 +0940 +1080 +7FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_7B25 +ENCODING 31525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +8A80 +3FC0 +0040 +7F40 +0040 +3E40 +2240 +3E40 +00C0 +ENDCHAR +STARTCHAR U_7B26 +ENCODING 31526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8440 +1080 +2FE0 +6080 +A480 +2280 +2080 +2180 +ENDCHAR +STARTCHAR U_7B27 +ENCODING 31527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FBC0 +4A40 +4A40 +FFE0 +4A40 +4A40 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_7B28 +ENCODING 31528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +A680 +9440 +0400 +FFE0 +1500 +2480 +5F40 +8420 +0400 +ENDCHAR +STARTCHAR U_7B29 +ENCODING 31529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5080 +8D40 +1480 +27E0 +FC00 +2200 +2240 +2140 +2080 +ENDCHAR +STARTCHAR U_7B2A +ENCODING 31530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +0840 +1F80 +1080 +1F80 +1080 +1F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_7B2B +ENCODING 31531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +8A40 +2380 +3E00 +2200 +3FE0 +1220 +22C0 +C200 +ENDCHAR +STARTCHAR U_7B2C +ENCODING 31532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +BFC0 +0440 +7FC0 +4400 +7FE0 +1420 +24C0 +C400 +ENDCHAR +STARTCHAR U_7B2D +ENCODING 31533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +8A40 +1500 +2480 +7FC0 +0080 +0900 +0600 +0100 +ENDCHAR +STARTCHAR U_7B2E +ENCODING 31534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +1FE0 +2400 +47C0 +0400 +07C0 +0400 +0400 +ENDCHAR +STARTCHAR U_7B2F +ENCODING 31535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +2840 +FBE0 +5240 +5240 +5180 +2180 +5240 +8C20 +ENDCHAR +STARTCHAR U_7B30 +ENCODING 31536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9240 +0920 +7FC0 +0940 +7FC0 +4900 +7FE0 +0920 +3140 +ENDCHAR +STARTCHAR U_7B31 +ENCODING 31537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +2440 +3FC0 +4040 +9E40 +1240 +1E40 +0040 +0180 +ENDCHAR +STARTCHAR U_7B32 +ENCODING 31538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +1080 +3FC0 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7B33 +ENCODING 31539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +A040 +21E0 +7D20 +2520 +2520 +2520 +55E0 +8920 +ENDCHAR +STARTCHAR U_7B34 +ENCODING 31540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7FE0 +0080 +3C80 +2480 +3C80 +0280 +0100 +ENDCHAR +STARTCHAR U_7B35 +ENCODING 31541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A840 +17C0 +4C40 +3440 +1580 +6420 +2420 +23E0 +ENDCHAR +STARTCHAR U_7B36 +ENCODING 31542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5280 +A440 +3FC0 +4400 +3FE0 +0A00 +0900 +10E0 +6040 +ENDCHAR +STARTCHAR U_7B37 +ENCODING 31543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +4840 +93C0 +6A40 +4A40 +5B40 +6A80 +1200 +6200 +ENDCHAR +STARTCHAR U_7B38 +ENCODING 31544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8800 +3FC0 +2000 +2F80 +2880 +2F80 +2000 +3FE0 +ENDCHAR +STARTCHAR U_7B39 +ENCODING 31545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +2900 +C480 +1500 +FFE0 +1500 +1500 +1700 +1000 +1FC0 +ENDCHAR +STARTCHAR U_7B3A +ENCODING 31546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8940 +0FC0 +7C00 +07C0 +7C80 +0320 +0620 +79E0 +ENDCHAR +STARTCHAR U_7B3B +ENCODING 31547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0840 +7FC0 +1240 +1240 +1240 +1EC0 +E200 +0200 +ENDCHAR +STARTCHAR U_7B3C +ENCODING 31548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0A40 +0900 +FFE0 +0A80 +0A80 +1320 +2620 +49E0 +ENDCHAR +STARTCHAR U_7B3D +ENCODING 31549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3DE0 +5280 +8840 +0000 +3F80 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_7B3E +ENCODING 31550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9280 +4200 +2FC0 +E240 +2240 +2540 +28C0 +7000 +8FE0 +ENDCHAR +STARTCHAR U_7B3F +ENCODING 31551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BC0 +5500 +9F80 +2900 +4600 +0900 +10E0 +FF40 +1100 +1F00 +ENDCHAR +STARTCHAR U_7B40 +ENCODING 31552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +9480 +7FC0 +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B41 +ENCODING 31553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +A280 +1840 +0A00 +7FC0 +4A40 +7FC0 +4A40 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_7B42 +ENCODING 31554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +7FE0 +9480 +4900 +25C0 +4F40 +3540 +15C0 +6520 +23E0 +ENDCHAR +STARTCHAR U_7B43 +ENCODING 31555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7FE0 +9280 +7FC0 +4440 +5F40 +4440 +4A40 +5140 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7B44 +ENCODING 31556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +8A40 +4A80 +2B00 +1A80 +6A40 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7B45 +ENCODING 31557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +1440 +3FC0 +4400 +FFE0 +0900 +0920 +1120 +60E0 +ENDCHAR +STARTCHAR U_7B46 +ENCODING 31558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9440 +3F80 +0480 +FFE0 +0480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7B47 +ENCODING 31559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7DE0 +1120 +1140 +1140 +1D20 +61C0 +0100 +ENDCHAR +STARTCHAR U_7B48 +ENCODING 31560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A40 +8180 +3E00 +0200 +7FE0 +0200 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7B49 +ENCODING 31561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +0100 +7FC0 +1100 +0900 +0300 +ENDCHAR +STARTCHAR U_7B4A +ENCODING 31562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1240 +FFE0 +1080 +3140 +4A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7B4B +ENCODING 31563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8940 +7900 +4FE0 +7920 +4920 +7920 +4A20 +9CC0 +ENDCHAR +STARTCHAR U_7B4C +ENCODING 31564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +3300 +C0E0 +1F00 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B4D +ENCODING 31565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9440 +3FC0 +4040 +BE40 +2240 +3E40 +2240 +3E40 +0180 +ENDCHAR +STARTCHAR U_7B4E +ENCODING 31566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8C40 +11E0 +FD20 +2920 +4920 +3120 +49E0 +8520 +ENDCHAR +STARTCHAR U_7B4F +ENCODING 31567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +4C40 +9280 +1240 +23E0 +6E40 +A180 +2120 +22A0 +2C60 +ENDCHAR +STARTCHAR U_7B50 +ENCODING 31568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7FE0 +4200 +4F80 +4200 +5FC0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_7B51 +ENCODING 31569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0000 +F780 +2480 +2680 +2580 +3480 +C8A0 +10E0 +ENDCHAR +STARTCHAR U_7B52 +ENCODING 31570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +7FC0 +4040 +5F40 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_7B53 +ENCODING 31571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +8840 +7BC0 +1100 +1100 +FBE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7B54 +ENCODING 31572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5680 +8A40 +3180 +DF60 +0000 +1F80 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR U_7B55 +ENCODING 31573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9840 +23C0 +C800 +17E0 +3080 +D080 +1280 +1100 +ENDCHAR +STARTCHAR U_7B56 +ENCODING 31574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A280 +1440 +FFE0 +0400 +7FC0 +4E40 +5540 +2480 +C460 +ENDCHAR +STARTCHAR U_7B57 +ENCODING 31575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9940 +2100 +6FC0 +A940 +2940 +2FC0 +2100 +2100 +ENDCHAR +STARTCHAR U_7B58 +ENCODING 31576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +2000 +FBE0 +2220 +3A20 +E220 +23E0 +E220 +ENDCHAR +STARTCHAR U_7B59 +ENCODING 31577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BF40 +0400 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7B5A +ENCODING 31578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +4240 +7B80 +4220 +79E0 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7B5B +ENCODING 31579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0840 +AFE0 +A100 +AFE0 +A920 +2920 +4960 +8100 +ENDCHAR +STARTCHAR U_7B5C +ENCODING 31580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +8840 +2480 +1500 +7FC0 +0040 +3FC0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_7B5D +ENCODING 31581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3BE0 +5480 +9140 +7F80 +0480 +FFE0 +0480 +3F80 +0400 +1C00 +ENDCHAR +STARTCHAR U_7B5E +ENCODING 31582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7FE0 +8420 +7FE0 +0E00 +1580 +6460 +0400 +ENDCHAR +STARTCHAR U_7B5F +ENCODING 31583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +01E0 +7E40 +0A80 +3FC0 +0100 +FFE0 +0200 +0600 +ENDCHAR +STARTCHAR U_7B60 +ENCODING 31584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +A500 +0200 +27E0 +F820 +2720 +2020 +3920 +C620 +00C0 +ENDCHAR +STARTCHAR U_7B61 +ENCODING 31585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1440 +1B00 +E0E0 +1F00 +0400 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7B62 +ENCODING 31586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +27C0 +FD40 +2540 +37C0 +E420 +2420 +E3E0 +ENDCHAR +STARTCHAR U_7B63 +ENCODING 31587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7140 +1140 +FD40 +1940 +3540 +5240 +90C0 +ENDCHAR +STARTCHAR U_7B64 +ENCODING 31588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1440 +3F80 +2080 +3F80 +2080 +3FA0 +2140 +38E0 +ENDCHAR +STARTCHAR U_7B65 +ENCODING 31589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +3F80 +2080 +3F80 +0000 +7FC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_7B66 +ENCODING 31590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +A480 +7FE0 +4020 +1F80 +0000 +7FC0 +0900 +1120 +E0E0 +ENDCHAR +STARTCHAR U_7B67 +ENCODING 31591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5240 +BFA0 +2080 +3F80 +2080 +3F80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7B68 +ENCODING 31592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +3580 +DF60 +0200 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_7B69 +ENCODING 31593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7F80 +0A00 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +ENDCHAR +STARTCHAR U_7B6A +ENCODING 31594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7FE0 +5240 +5FC0 +5240 +5FC0 +4200 +7FE0 +ENDCHAR +STARTCHAR U_7B6B +ENCODING 31595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_7B6C +ENCODING 31596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +7FE0 +4200 +7A80 +4980 +4920 +52A0 +8460 +ENDCHAR +STARTCHAR U_7B6D +ENCODING 31597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +7FC0 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_7B6E +ENCODING 31598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +7FE0 +2480 +2480 +5540 +8E20 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B6F +ENCODING 31599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8940 +7900 +4BC0 +7940 +4940 +5A40 +E240 +0480 +ENDCHAR +STARTCHAR U_7B70 +ENCODING 31600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +4480 +9440 +27E0 +6A00 +A3C0 +2200 +23E0 +2200 +2200 +ENDCHAR +STARTCHAR U_7B71 +ENCODING 31601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9240 +2A00 +2BE0 +6E80 +AA80 +2900 +2280 +2C60 +ENDCHAR +STARTCHAR U_7B72 +ENCODING 31602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A440 +1480 +3FC0 +2040 +3FC0 +2040 +3FC0 +20C0 +ENDCHAR +STARTCHAR U_7B73 +ENCODING 31603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +F840 +1780 +2100 +37C0 +5100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7B74 +ENCODING 31604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +9440 +7FE0 +2480 +34C0 +4D20 +8A00 +3180 +C060 +ENDCHAR +STARTCHAR U_7B75 +ENCODING 31605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +EF80 +4100 +F5E0 +5500 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7B76 +ENCODING 31606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2440 +3FC0 +4400 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7B77 +ENCODING 31607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +A200 +2FC0 +B240 +A240 +BFE0 +2300 +2480 +3860 +ENDCHAR +STARTCHAR U_7B78 +ENCODING 31608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9440 +3F80 +2080 +3F80 +2080 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7B79 +ENCODING 31609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +0800 +3F80 +1000 +FFE0 +2100 +7FE0 +9100 +0B00 +ENDCHAR +STARTCHAR U_7B7A +ENCODING 31610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8860 +7FC0 +4200 +5FC0 +4280 +5FC0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_7B7B +ENCODING 31611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +1440 +FFE0 +4440 +7FC0 +4440 +7FC0 +1400 +0800 +F7E0 +ENDCHAR +STARTCHAR U_7B7C +ENCODING 31612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9F40 +1100 +3F80 +2480 +2480 +2A80 +1100 +60C0 +ENDCHAR +STARTCHAR U_7B7D +ENCODING 31613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2080 +3F80 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7B7E +ENCODING 31614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8440 +0A00 +3180 +DF60 +2480 +2500 +1100 +7FE0 +ENDCHAR +STARTCHAR U_7B7F +ENCODING 31615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1F80 +6900 +0600 +79E0 +0400 +FFE0 +2480 +4C40 +ENDCHAR +STARTCHAR U_7B80 +ENCODING 31616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +27C0 +5040 +4F40 +4940 +4F40 +4940 +4F40 +40C0 +ENDCHAR +STARTCHAR U_7B81 +ENCODING 31617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5280 +8440 +3F80 +1100 +FFC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7B82 +ENCODING 31618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1440 +7FE0 +2480 +5540 +8E20 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7B83 +ENCODING 31619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FC40 +4BE0 +7A40 +4A40 +7940 +4880 +F940 +0E20 +ENDCHAR +STARTCHAR U_7B84 +ENCODING 31620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +2440 +3FC0 +2440 +3FC0 +1200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_7B85 +ENCODING 31621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +BF80 +2480 +3F80 +2480 +FFE0 +1100 +1100 +6100 +ENDCHAR +STARTCHAR U_7B86 +ENCODING 31622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4440 +5B40 +0000 +4240 +7B80 +4220 +71E0 +ENDCHAR +STARTCHAR U_7B87 +ENCODING 31623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4200 +7BC0 +A500 +FFC0 +8840 +BF40 +8840 +9E40 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_7B88 +ENCODING 31624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +5040 +2280 +9440 +67A0 +2000 +C7C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_7B89 +ENCODING 31625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +27C0 +F440 +27C0 +3100 +EFE0 +2120 +2220 +6C60 +ENDCHAR +STARTCHAR U_7B8A +ENCODING 31626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +FD80 +2240 +3D20 +24C0 +2400 +5580 +8840 +ENDCHAR +STARTCHAR U_7B8B +ENCODING 31627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +0A40 +7F80 +0520 +7FE0 +0900 +7FC0 +04A0 +0520 +7BE0 +ENDCHAR +STARTCHAR U_7B8C +ENCODING 31628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +FE20 +2520 +7B20 +1120 +7D20 +1020 +FCE0 +ENDCHAR +STARTCHAR U_7B8D +ENCODING 31629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5280 +AA40 +2FE0 +F880 +2BE0 +3AA0 +EAA0 +2AE0 +2880 +EFE0 +ENDCHAR +STARTCHAR U_7B8E +ENCODING 31630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5480 +8FC0 +0400 +7FE0 +4420 +5F00 +4440 +4FC0 +4920 +B0E0 +ENDCHAR +STARTCHAR U_7B8F +ENCODING 31631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +2900 +7F80 +0480 +FFE0 +0480 +7F80 +0400 +0C00 +ENDCHAR +STARTCHAR U_7B90 +ENCODING 31632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_7B91 +ENCODING 31633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +0480 +FFE0 +0480 +3F80 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_7B92 +ENCODING 31634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +0080 +FFE0 +8420 +3F80 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_7B93 +ENCODING 31635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7F80 +0080 +FFE0 +2480 +1F00 +E480 +0860 +ENDCHAR +STARTCHAR U_7B94 +ENCODING 31636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A940 +47E0 +3420 +1420 +67E0 +2420 +2420 +27E0 +ENDCHAR +STARTCHAR U_7B95 +ENCODING 31637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9500 +7FE0 +1100 +1D00 +1700 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7B96 +ENCODING 31638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +2100 +FFE0 +3180 +6B40 +A520 +2920 +2100 +ENDCHAR +STARTCHAR U_7B97 +ENCODING 31639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5240 +BF80 +2080 +3F80 +2080 +3F80 +1100 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_7B98 +ENCODING 31640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4140 +5E40 +4440 +7FC0 +4E40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_7B99 +ENCODING 31641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +7BE0 +4A20 +7A40 +4BE0 +7AA0 +4A40 +9AA0 +ENDCHAR +STARTCHAR U_7B9A +ENCODING 31642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9840 +2540 +7D40 +8140 +7D40 +4540 +7C40 +44C0 +ENDCHAR +STARTCHAR U_7B9B +ENCODING 31643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +0840 +FFC0 +1540 +3D40 +E540 +2540 +25A0 +E920 +ENDCHAR +STARTCHAR U_7B9C +ENCODING 31644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +8A40 +FFE0 +9120 +2080 +5F40 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7B9D +ENCODING 31645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +A840 +2240 +FFE0 +2240 +3A40 +E3C0 +2240 +E3C0 +ENDCHAR +STARTCHAR U_7B9E +ENCODING 31646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AA40 +7FC0 +0800 +FFE0 +1280 +7660 +9080 +0F80 +ENDCHAR +STARTCHAR U_7B9F +ENCODING 31647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +3F80 +2080 +3F80 +2240 +3B80 +2220 +39E0 +ENDCHAR +STARTCHAR U_7BA0 +ENCODING 31648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3F80 +0400 +FFC0 +2480 +FFE0 +2480 +7FC0 +0400 +3F80 +ENDCHAR +STARTCHAR U_7BA1 +ENCODING 31649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +FFE0 +8020 +3F80 +2080 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7BA2 +ENCODING 31650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1240 +FFE0 +A020 +3FC0 +2A40 +5AC0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_7BA3 +ENCODING 31651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BC40 +1140 +7D40 +5540 +5540 +3940 +5440 +10C0 +ENDCHAR +STARTCHAR U_7BA4 +ENCODING 31652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1240 +7FC0 +2100 +5280 +8C40 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7BA5 +ENCODING 31653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A940 +2FE0 +C900 +2BC0 +AA40 +4980 +5260 +1440 +ENDCHAR +STARTCHAR U_7BA6 +ENCODING 31654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7BA7 +ENCODING 31655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9080 +7FE0 +4200 +5FC0 +4A80 +7FE0 +4500 +4880 +7FE0 +ENDCHAR +STARTCHAR U_7BA8 +ENCODING 31656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8FC0 +2240 +F780 +2160 +37C0 +E100 +2FE0 +E100 +ENDCHAR +STARTCHAR U_7BA9 +ENCODING 31657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +5240 +7FC0 +0800 +1F80 +6900 +0E00 +7000 +ENDCHAR +STARTCHAR U_7BAA +ENCODING 31658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8940 +3F80 +2480 +3F80 +2480 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7BAB +ENCODING 31659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0440 +FFE0 +0440 +7FC0 +5540 +64C0 +8440 +ENDCHAR +STARTCHAR U_7BAC +ENCODING 31660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1140 +FFE0 +1500 +FFE0 +1000 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_7BAD +ENCODING 31661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0A00 +FFE0 +4840 +7940 +4940 +7940 +4840 +59C0 +ENDCHAR +STARTCHAR U_7BAE +ENCODING 31662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_7BAF +ENCODING 31663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BE0 +5480 +9FE0 +2940 +2FC0 +6940 +AFC0 +2900 +2600 +39E0 +ENDCHAR +STARTCHAR U_7BB0 +ENCODING 31664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4A80 +BFE0 +2520 +2920 +7F60 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_7BB1 +ENCODING 31665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +9440 +7FC0 +1240 +3BC0 +5640 +93C0 +1240 +13C0 +ENDCHAR +STARTCHAR U_7BB2 +ENCODING 31666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AA40 +2FC0 +5200 +5FE0 +2500 +C500 +4920 +50E0 +ENDCHAR +STARTCHAR U_7BB3 +ENCODING 31667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4040 +7FC0 +5080 +7FC0 +4900 +BFC0 +9100 +ENDCHAR +STARTCHAR U_7BB4 +ENCODING 31668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1140 +7FE0 +4100 +5D40 +4140 +5CA0 +9560 +9E20 +ENDCHAR +STARTCHAR U_7BB5 +ENCODING 31669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9440 +0480 +1540 +6220 +1FC0 +F040 +1FC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_7BB6 +ENCODING 31670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8BC0 +2240 +7BC0 +2240 +7BC0 +4A40 +7A40 +0480 +ENDCHAR +STARTCHAR U_7BB7 +ENCODING 31671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +FBE0 +4500 +75C0 +5F40 +5540 +9420 +B3E0 +ENDCHAR +STARTCHAR U_7BB8 +ENCODING 31672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +8440 +3E80 +0500 +FFE0 +1080 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_7BB9 +ENCODING 31673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +AA40 +43E0 +F420 +2220 +4920 +F520 +5020 +A8C0 +ENDCHAR +STARTCHAR U_7BBA +ENCODING 31674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8C40 +7FC0 +0400 +FFE0 +3180 +5F40 +9120 +1F00 +ENDCHAR +STARTCHAR U_7BBB +ENCODING 31675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8FC0 +2240 +5FE0 +A240 +4FC0 +C200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_7BBC +ENCODING 31676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4040 +7FC0 +4900 +5F80 +4400 +8400 +BFE0 +ENDCHAR +STARTCHAR U_7BBD +ENCODING 31677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FC0 +4A80 +BF00 +0400 +FFE0 +2D80 +3680 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7BBE +ENCODING 31678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +5540 +7D40 +4540 +7D40 +4540 +7C40 +45C0 +ENDCHAR +STARTCHAR U_7BBF +ENCODING 31679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2080 +7FE0 +2080 +3F80 +20E0 +FF80 +0080 +ENDCHAR +STARTCHAR U_7BC0 +ENCODING 31680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +FDE0 +4520 +7D20 +4520 +7D20 +4920 +5560 +6500 +ENDCHAR +STARTCHAR U_7BC1 +ENCODING 31681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +5500 +BF80 +2080 +3F80 +2080 +7FC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7BC2 +ENCODING 31682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +3F80 +2080 +3F80 +2400 +7F80 +8400 +FFE0 +ENDCHAR +STARTCHAR U_7BC3 +ENCODING 31683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFC0 +4040 +7FC0 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_7BC4 +ENCODING 31684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5240 +FFE0 +5520 +7D20 +5520 +7D60 +1100 +FF20 +10E0 +ENDCHAR +STARTCHAR U_7BC5 +ENCODING 31685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +4840 +7FC0 +0000 +FFE0 +0400 +7FC0 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_7BC6 +ENCODING 31686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8F40 +1100 +FFE0 +2C80 +5700 +2A80 +1240 +6C20 +ENDCHAR +STARTCHAR U_7BC7 +ENCODING 31687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +2040 +3FC0 +2000 +3FE0 +3520 +5FE0 +9560 +ENDCHAR +STARTCHAR U_7BC8 +ENCODING 31688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +B840 +13E0 +FC40 +1240 +7D40 +1040 +1C40 +E080 +ENDCHAR +STARTCHAR U_7BC9 +ENCODING 31689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FF80 +24A0 +26A0 +F9E0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7BCA +ENCODING 31690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +8480 +5FE0 +A480 +5FE0 +C480 +4840 +5020 +ENDCHAR +STARTCHAR U_7BCB +ENCODING 31691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +4200 +7FE0 +5280 +6F40 +4500 +4880 +7FE0 +ENDCHAR +STARTCHAR U_7BCC +ENCODING 31692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +17C0 +2040 +6FE0 +A900 +3FE0 +2100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7BCD +ENCODING 31693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +CA80 +7540 +2100 +F540 +2580 +7100 +AA80 +2440 +2820 +ENDCHAR +STARTCHAR U_7BCE +ENCODING 31694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +8840 +F100 +9540 +F520 +9940 +F040 +9180 +F600 +ENDCHAR +STARTCHAR U_7BCF +ENCODING 31695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8A40 +4BE0 +FA40 +4D00 +7900 +4A80 +7A80 +0C60 +ENDCHAR +STARTCHAR U_7BD0 +ENCODING 31696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A840 +FFE0 +2880 +7BE0 +6AA0 +AAA0 +2880 +2FE0 +ENDCHAR +STARTCHAR U_7BD1 +ENCODING 31697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +9480 +3F80 +2480 +FFE0 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7BD2 +ENCODING 31698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +9A40 +6180 +BF60 +2100 +3F40 +2480 +2B00 +30C0 +ENDCHAR +STARTCHAR U_7BD3 +ENCODING 31699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9080 +2500 +FFE0 +2480 +4840 +FFE0 +1100 +0F00 +F0E0 +ENDCHAR +STARTCHAR U_7BD4 +ENCODING 31700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1F80 +1080 +3FC0 +2040 +3FC0 +2040 +3FC0 +E0E0 +ENDCHAR +STARTCHAR U_7BD5 +ENCODING 31701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +9FC0 +0400 +FFE0 +1100 +2080 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_7BD6 +ENCODING 31702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8840 +7FC0 +4480 +7FE0 +4480 +5F80 +9080 +9F80 +ENDCHAR +STARTCHAR U_7BD7 +ENCODING 31703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9280 +3FC0 +E400 +3F80 +2400 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_7BD8 +ENCODING 31704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3FC0 +5540 +1F40 +0440 +3FC0 +5540 +1F40 +0840 +71C0 +ENDCHAR +STARTCHAR U_7BD9 +ENCODING 31705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +1100 +1F00 +0000 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_7BDA +ENCODING 31706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +7FE0 +4500 +7DE0 +4500 +5DC0 +4500 +7DE0 +4500 +7FE0 +ENDCHAR +STARTCHAR U_7BDB +ENCODING 31707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +FBE0 +0820 +FBE0 +8200 +FBE0 +4920 +28A0 +F3C0 +ENDCHAR +STARTCHAR U_7BDC +ENCODING 31708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F20 +0540 +7480 +2440 +CC20 +3FC0 +5240 +8920 +ENDCHAR +STARTCHAR U_7BDD +ENCODING 31709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9540 +7FE0 +1100 +FFE0 +1500 +FFE0 +2480 +FFE0 +2180 +ENDCHAR +STARTCHAR U_7BDE +ENCODING 31710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +4FC0 +2440 +87C0 +5440 +27C0 +C100 +4FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_7BDF +ENCODING 31711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +1FE0 +2100 +2FC0 +6100 +BFE0 +2840 +2FC0 +2840 +28C0 +ENDCHAR +STARTCHAR U_7BE0 +ENCODING 31712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +23C0 +5680 +5900 +D6E0 +5100 +5FE0 +5540 +4B20 +ENDCHAR +STARTCHAR U_7BE1 +ENCODING 31713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3F80 +2080 +3F80 +2080 +FFE0 +2500 +4880 +9160 +3E80 +ENDCHAR +STARTCHAR U_7BE2 +ENCODING 31714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3FC0 +0400 +7FE0 +2040 +3FC0 +2040 +3FC0 +E0E0 +ENDCHAR +STARTCHAR U_7BE3 +ENCODING 31715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +1100 +FFE0 +8420 +7FC0 +0800 +0FC0 +3040 +C380 +ENDCHAR +STARTCHAR U_7BE4 +ENCODING 31716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +5480 +BFE0 +2200 +3FC0 +2200 +3FC0 +2200 +3FE0 +4A20 +9560 +ENDCHAR +STARTCHAR U_7BE5 +ENCODING 31717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +0A00 +7FC0 +4A40 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7BE6 +ENCODING 31718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4A40 +5540 +7FC0 +4280 +7B20 +4220 +79E0 +ENDCHAR +STARTCHAR U_7BE7 +ENCODING 31719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +0840 +FFE0 +9220 +3FC0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_7BE8 +ENCODING 31720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7DE0 +9240 +E700 +A8C0 +DFA0 +A200 +BFE0 +EA80 +9240 +A620 +ENDCHAR +STARTCHAR U_7BE9 +ENCODING 31721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +A7E0 +7880 +4BE0 +7AA0 +42A0 +7AA0 +4AE0 +7880 +ENDCHAR +STARTCHAR U_7BEA +ENCODING 31722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +4400 +5FE0 +5420 +5F80 +5440 +A7C0 +A520 +D9E0 +ENDCHAR +STARTCHAR U_7BEB +ENCODING 31723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FF80 +26A0 +FDE0 +0400 +7FC0 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_7BEC +ENCODING 31724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +8E40 +9180 +6460 +BF80 +3080 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_7BED +ENCODING 31725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +1100 +FFE0 +2480 +2480 +3F80 +0420 +03E0 +ENDCHAR +STARTCHAR U_7BEE +ENCODING 31726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +5480 +8A00 +53C0 +5280 +5440 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_7BEF +ENCODING 31727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +B940 +47C0 +F900 +27E0 +F940 +2140 +30A0 +2760 +ENDCHAR +STARTCHAR U_7BF0 +ENCODING 31728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21E0 +FD20 +4940 +FDC0 +0120 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_7BF1 +ENCODING 31729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +2A80 +2480 +3F80 +0400 +7FC0 +4940 +5F40 +ENDCHAR +STARTCHAR U_7BF2 +ENCODING 31730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +1080 +FBE0 +1080 +7F80 +0080 +7F80 +0080 +7F80 +ENDCHAR +STARTCHAR U_7BF3 +ENCODING 31731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4440 +7FC0 +1500 +FFE0 +1500 +7FC0 +0400 +ENDCHAR +STARTCHAR U_7BF4 +ENCODING 31732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +4FE0 +2620 +EB40 +2580 +2B40 +2520 +7200 +8FE0 +ENDCHAR +STARTCHAR U_7BF5 +ENCODING 31733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A440 +4A40 +B3A0 +4100 +C5C0 +4500 +4B00 +50E0 +ENDCHAR +STARTCHAR U_7BF6 +ENCODING 31734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +2200 +FFE0 +2000 +3FC0 +0040 +5540 +8AC0 +ENDCHAR +STARTCHAR U_7BF7 +ENCODING 31735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +5380 +0280 +5D60 +2100 +E7C0 +2100 +3FC0 +6100 +9FE0 +ENDCHAR +STARTCHAR U_7BF8 +ENCODING 31736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +AC80 +1100 +3F80 +4A40 +FFC0 +1200 +2980 +D460 +1900 +0600 +ENDCHAR +STARTCHAR U_7BF9 +ENCODING 31737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3FC0 +2040 +3FC0 +2040 +FFE0 +1080 +3F40 +D2A0 +1F80 +ENDCHAR +STARTCHAR U_7BFA +ENCODING 31738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AFC0 +2540 +FFC0 +2540 +37C0 +E280 +2FE0 +6080 +ENDCHAR +STARTCHAR U_7BFB +ENCODING 31739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7BFC +ENCODING 31740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +5280 +8400 +6F60 +4920 +4F20 +6960 +0F00 +3220 +C1E0 +ENDCHAR +STARTCHAR U_7BFD +ENCODING 31741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2840 +4FE0 +B4A0 +5FA0 +C4A0 +56E0 +5480 +5F80 +ENDCHAR +STARTCHAR U_7BFE +ENCODING 31742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4A40 +7FC0 +0480 +7FC0 +52A0 +4B20 +9CE0 +ENDCHAR +STARTCHAR U_7BFF +ENCODING 31743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +4440 +7FC0 +4440 +7FC0 +00A0 +FFE0 +1080 +0B80 +ENDCHAR +STARTCHAR U_7C00 +ENCODING 31744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_7C01 +ENCODING 31745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2100 +45C0 +9500 +2FE0 +6100 +A5E0 +2500 +3BE0 +ENDCHAR +STARTCHAR U_7C02 +ENCODING 31746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +42A0 +7FE0 +4A20 +7AA0 +4120 +7AA0 +4460 +7FE0 +ENDCHAR +STARTCHAR U_7C03 +ENCODING 31747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +9280 +F3C0 +2640 +F980 +23E0 +7440 +AA80 +A100 +2E00 +ENDCHAR +STARTCHAR U_7C04 +ENCODING 31748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5480 +BFC0 +2040 +3FC0 +2F80 +2A80 +2FA0 +4820 +87E0 +ENDCHAR +STARTCHAR U_7C05 +ENCODING 31749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +0900 +7FE0 +5200 +5FC0 +6200 +5FC0 +4200 +BFE0 +ENDCHAR +STARTCHAR U_7C06 +ENCODING 31750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +8120 +79E0 +0100 +FFC0 +5280 +5120 +52A0 +8FE0 +ENDCHAR +STARTCHAR U_7C07 +ENCODING 31751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9480 +2200 +FFE0 +4200 +73E0 +5500 +57E0 +5280 +AC60 +ENDCHAR +STARTCHAR U_7C08 +ENCODING 31752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +BFE0 +2020 +3FE0 +2440 +3EE0 +2440 +5EE0 +8840 +ENDCHAR +STARTCHAR U_7C09 +ENCODING 31753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0900 +8FC0 +5100 +EFE0 +2840 +2FC0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7C0A +ENCODING 31754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FC0 +1100 +1F00 +1100 +FFE0 +2480 +DF60 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7C0B +ENCODING 31755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +3F80 +2480 +3F80 +2280 +21E0 +7F80 +5280 +FFE0 +ENDCHAR +STARTCHAR U_7C0C +ENCODING 31756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +1100 +FFE0 +5420 +7C80 +1080 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_7C0D +ENCODING 31757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +E4E0 +3F80 +2480 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_7C0E +ENCODING 31758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9440 +2280 +F7E0 +2280 +3FE0 +E440 +27C0 +2440 +67C0 +ENDCHAR +STARTCHAR U_7C0F +ENCODING 31759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +4A40 +7FC0 +4000 +5100 +5DA0 +9120 +9DE0 +ENDCHAR +STARTCHAR U_7C10 +ENCODING 31760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7D00 +55E0 +7E20 +5480 +7C80 +1080 +FD40 +1220 +ENDCHAR +STARTCHAR U_7C11 +ENCODING 31761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +2080 +FFE0 +2080 +3FA0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_7C12 +ENCODING 31762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5280 +BFC0 +3480 +2A80 +3F80 +0800 +FFE0 +5540 +AFA0 +ENDCHAR +STARTCHAR U_7C13 +ENCODING 31763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4880 +FE40 +7A80 +5220 +7A40 +4280 +7A20 +AA40 +BF80 +ENDCHAR +STARTCHAR U_7C14 +ENCODING 31764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5500 +FFE0 +1100 +7FC0 +1100 +FFE0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_7C15 +ENCODING 31765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FD40 +27E0 +3D20 +1120 +7D20 +5520 +FDA0 +1240 +ENDCHAR +STARTCHAR U_7C16 +ENCODING 31766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +D5C0 +B900 +91E0 +FD40 +B940 +D540 +9240 +FC40 +ENDCHAR +STARTCHAR U_7C17 +ENCODING 31767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AF80 +52C0 +0AA0 +7580 +2E00 +FFE0 +1480 +E460 +ENDCHAR +STARTCHAR U_7C18 +ENCODING 31768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +3FC0 +0440 +FFE0 +5540 +7FC0 +4E40 +5540 +A4C0 +ENDCHAR +STARTCHAR U_7C19 +ENCODING 31769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +4FE0 +4100 +FFE0 +4920 +4FE0 +4920 +5FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_7C1A +ENCODING 31770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +BF80 +2A80 +FFE0 +1100 +7D40 +54A0 +5CA0 +1360 +ENDCHAR +STARTCHAR U_7C1B +ENCODING 31771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6480 +FDC0 +2500 +3DE0 +3D40 +2540 +FF40 +2540 +C240 +ENDCHAR +STARTCHAR U_7C1C +ENCODING 31772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +47C0 +2440 +97C0 +6440 +2FE0 +D4A0 +4920 +42C0 +ENDCHAR +STARTCHAR U_7C1D +ENCODING 31773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFC0 +5240 +3F80 +60C0 +BFA0 +2080 +3F80 +2500 +CCE0 +ENDCHAR +STARTCHAR U_7C1E +ENCODING 31774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7BC0 +4A40 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7C1F +ENCODING 31775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +4A40 +7FC0 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7C20 +ENCODING 31776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +2480 +3F80 +2480 +3F80 +2480 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_7C21 +ENCODING 31777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +FBE0 +8A20 +FBE0 +9F20 +F1E0 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_7C22 +ENCODING 31778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9480 +7BE0 +4A20 +7BE0 +4A20 +7FE0 +4920 +4620 +59E0 +ENDCHAR +STARTCHAR U_7C23 +ENCODING 31779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +4440 +FFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_7C24 +ENCODING 31780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2A40 +3FC0 +1080 +1F80 +1080 +1F80 +30C0 +ENDCHAR +STARTCHAR U_7C25 +ENCODING 31781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +3F80 +0800 +7FC0 +2080 +5F40 +9120 +7FC0 +5140 +5F40 +ENDCHAR +STARTCHAR U_7C26 +ENCODING 31782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7900 +5240 +3F80 +4040 +9FA0 +1080 +1F80 +0900 +FFE0 +ENDCHAR +STARTCHAR U_7C27 +ENCODING 31783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9500 +FFE0 +1100 +FFE0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_7C28 +ENCODING 31784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +9480 +7BC0 +4A40 +7BC0 +4220 +7FE0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7C29 +ENCODING 31785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +5EE0 +5280 +2940 +FFE0 +8820 +3FC0 +0840 +F380 +ENDCHAR +STARTCHAR U_7C2A +ENCODING 31786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FBE0 +A280 +FBE0 +5100 +DFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7C2B +ENCODING 31787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +0480 +FFE0 +5540 +75C0 +7FC0 +5540 +9540 +ENDCHAR +STARTCHAR U_7C2C +ENCODING 31788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7BC0 +4A40 +7D80 +2240 +A7E0 +BA40 +A240 +FBC0 +ENDCHAR +STARTCHAR U_7C2D +ENCODING 31789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +2480 +5540 +FFE0 +2080 +5FC0 +90A0 +1F80 +ENDCHAR +STARTCHAR U_7C2E +ENCODING 31790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FBC0 +2100 +FFE0 +5240 +9FA0 +1480 +1280 +1F80 +ENDCHAR +STARTCHAR U_7C2F +ENCODING 31791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AA40 +27E0 +FA40 +23C0 +7240 +6FE0 +A240 +2420 +ENDCHAR +STARTCHAR U_7C30 +ENCODING 31792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +8A80 +57E0 +5520 +7FE0 +4520 +77E0 +5280 +57E0 +9080 +ENDCHAR +STARTCHAR U_7C31 +ENCODING 31793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5280 +AA40 +17E0 +FA40 +23C0 +3A40 +2FE0 +4A40 +9420 +ENDCHAR +STARTCHAR U_7C32 +ENCODING 31794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5280 +F7C0 +5540 +77C0 +5540 +77C0 +5500 +5FE0 +B100 +ENDCHAR +STARTCHAR U_7C33 +ENCODING 31795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FD80 +2240 +FC20 +8BC0 +F880 +23E0 +FC80 +2080 +ENDCHAR +STARTCHAR U_7C34 +ENCODING 31796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FE0 +4820 +7F80 +4820 +47E0 +5540 +BFE0 +8840 +ENDCHAR +STARTCHAR U_7C35 +ENCODING 31797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5500 +FDC0 +5740 +7C80 +5560 +7FC0 +1140 +FD40 +11C0 +ENDCHAR +STARTCHAR U_7C36 +ENCODING 31798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FC0 +5500 +A7C0 +1040 +FFE0 +1100 +2540 +7380 +A540 +2B20 +ENDCHAR +STARTCHAR U_7C37 +ENCODING 31799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9E80 +2240 +7FE0 +AA40 +37A0 +2000 +4FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_7C38 +ENCODING 31800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +5080 +FFE0 +52A0 +73E0 +5340 +FE80 +5540 +8A20 +ENDCHAR +STARTCHAR U_7C39 +ENCODING 31801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A480 +1500 +FFE0 +9120 +3F80 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_7C3A +ENCODING 31802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +7FE0 +4920 +1F80 +FFE0 +2480 +DF60 +0400 +7FC0 +ENDCHAR +STARTCHAR U_7C3B +ENCODING 31803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +D280 +47C0 +2440 +E740 +2FE0 +2AA0 +2BA0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_7C3C +ENCODING 31804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +4A80 +2280 +FFE0 +2280 +3FE0 +E540 +2FE0 +2440 +64C0 +ENDCHAR +STARTCHAR U_7C3D +ENCODING 31805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +0C40 +3300 +CCC0 +7BC0 +4A40 +7BC0 +2A80 +C460 +ENDCHAR +STARTCHAR U_7C3E +ENCODING 31806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +4A00 +7FC0 +4A40 +7FE0 +4A40 +BFC0 +2A80 +CA60 +ENDCHAR +STARTCHAR U_7C3F +ENCODING 31807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +5FE0 +2920 +9FE0 +6920 +4FE0 +C8A0 +5FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_7C40 +ENCODING 31808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +27E0 +2AA0 +FCA0 +2920 +3FE0 +E920 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_7C41 +ENCODING 31809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +21C0 +FA40 +23E0 +FA20 +AAA0 +FAA0 +22A0 +7140 +AA20 +ENDCHAR +STARTCHAR U_7C42 +ENCODING 31810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +ABE0 +7C80 +CBE0 +7AA0 +4AA0 +7AA0 +52E0 +6880 +ENDCHAR +STARTCHAR U_7C43 +ENCODING 31811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7D00 +59E0 +4A80 +7840 +5040 +7F80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_7C44 +ENCODING 31812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5240 +EFA0 +4A80 +7FE0 +4C80 +4A80 +4F80 +58C0 +7FE0 +ENDCHAR +STARTCHAR U_7C45 +ENCODING 31813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +6EC0 +4840 +6EC0 +4240 +6AC0 +4A40 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7C46 +ENCODING 31814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +4A40 +9FA0 +3200 +DFC0 +1200 +1FC0 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_7C47 +ENCODING 31815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +2100 +FFE0 +B4A0 +0D00 +7600 +0D00 +74E0 +ENDCHAR +STARTCHAR U_7C48 +ENCODING 31816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9240 +7FE0 +2880 +FEE0 +AB20 +FFA0 +1160 +FF20 +11E0 +FF20 +ENDCHAR +STARTCHAR U_7C49 +ENCODING 31817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +7FC0 +1100 +FFE0 +8020 +7F80 +1100 +7F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7C4A +ENCODING 31818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +14A0 +3C60 +15A0 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_7C4B +ENCODING 31819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +BFC0 +2480 +FFE0 +6D40 +4440 +6EC0 +5540 +6EC0 +ENDCHAR +STARTCHAR U_7C4C +ENCODING 31820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +7FC0 +0400 +FFE0 +0420 +FFE0 +5080 +5FE0 +7580 +ENDCHAR +STARTCHAR U_7C4D +ENCODING 31821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +2140 +FBE0 +2140 +FFE0 +2220 +FBE0 +6A20 +A7E0 +ENDCHAR +STARTCHAR U_7C4E +ENCODING 31822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A3C0 +3D40 +2080 +3FE0 +52A0 +BAC0 +1580 +6C60 +ENDCHAR +STARTCHAR U_7C4F +ENCODING 31823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5280 +ABC0 +17E0 +FA40 +23C0 +3A40 +2FE0 +4A40 +9420 +ENDCHAR +STARTCHAR U_7C50 +ENCODING 31824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +E540 +AFE0 +E200 +AFE0 +F540 +ABA0 +A540 +A920 +ENDCHAR +STARTCHAR U_7C51 +ENCODING 31825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5440 +BFA0 +2A80 +FFE0 +3580 +DF60 +1500 +1280 +19C0 +ENDCHAR +STARTCHAR U_7C52 +ENCODING 31826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6480 +AFE0 +F280 +2EE0 +3AA0 +EEE0 +2FE0 +2920 +6FE0 +ENDCHAR +STARTCHAR U_7C53 +ENCODING 31827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +4FC0 +2540 +8FE0 +6540 +27C0 +CD60 +47C0 +4540 +47C0 +ENDCHAR +STARTCHAR U_7C54 +ENCODING 31828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +7D00 +55E0 +FEA0 +54A0 +FEA0 +2840 +10A0 +6D20 +ENDCHAR +STARTCHAR U_7C55 +ENCODING 31829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5280 +A5E0 +FEA0 +2540 +77E0 +6D20 +A7E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_7C56 +ENCODING 31830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +5240 +BD20 +1100 +FFE0 +6D40 +2940 +6DA0 +2AA0 +FC60 +ENDCHAR +STARTCHAR U_7C57 +ENCODING 31831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +FFE0 +D520 +A4A0 +7FC0 +A400 +3FC0 +2400 +3FE0 +ENDCHAR +STARTCHAR U_7C58 +ENCODING 31832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +FFA0 +5100 +7FE0 +5540 +7AA0 +5780 +5540 +BB20 +ENDCHAR +STARTCHAR U_7C59 +ENCODING 31833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9280 +71C0 +8840 +77E0 +24A0 +FAC0 +A9A0 +76A0 +F980 +ENDCHAR +STARTCHAR U_7C5A +ENCODING 31834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9240 +7FE0 +4220 +7FC0 +5260 +5FC0 +5240 +7FE0 +A520 +BFE0 +ENDCHAR +STARTCHAR U_7C5B +ENCODING 31835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +AC80 +5240 +8FE0 +F900 +26E0 +FA80 +AFE0 +7140 +21A0 +FEE0 +ENDCHAR +STARTCHAR U_7C5C +ENCODING 31836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +2840 +FFE0 +2AA0 +2FE0 +3280 +E7C0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_7C5D +ENCODING 31837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7FE0 +9480 +FFE0 +2000 +7FC0 +5B40 +75C0 +5B40 +5540 +BA60 +ENDCHAR +STARTCHAR U_7C5E +ENCODING 31838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +4480 +BFE0 +46A0 +D4E0 +5F80 +0000 +7FE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7C5F +ENCODING 31839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +21C0 +FA40 +27E0 +FA20 +ABE0 +FA20 +6BE0 +A660 +ENDCHAR +STARTCHAR U_7C60 +ENCODING 31840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9340 +FDE0 +2900 +FFE0 +4820 +7BE0 +4A00 +7BC0 +4A20 +5BE0 +ENDCHAR +STARTCHAR U_7C61 +ENCODING 31841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +AB80 +2440 +FBA0 +2EE0 +3AA0 +EEE0 +2440 +6AA0 +ENDCHAR +STARTCHAR U_7C62 +ENCODING 31842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A880 +7DE0 +8340 +7D40 +5540 +7C80 +2940 +D620 +ENDCHAR +STARTCHAR U_7C63 +ENCODING 31843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +7BE0 +4A20 +7BE0 +4A20 +7FE0 +6AA0 +7FA0 +5520 +64A0 +ENDCHAR +STARTCHAR U_7C64 +ENCODING 31844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A540 +3540 +4B20 +FFE0 +2900 +EF40 +2880 +EEA0 +2960 +FE20 +ENDCHAR +STARTCHAR U_7C65 +ENCODING 31845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +9440 +FFE0 +4A40 +7FC0 +0000 +7FC0 +4A40 +7FC0 +4AC0 +ENDCHAR +STARTCHAR U_7C66 +ENCODING 31846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A480 +53C0 +8880 +FBE0 +22A0 +FBE0 +AAA0 +77E0 +2080 +FFE0 +ENDCHAR +STARTCHAR U_7C67 +ENCODING 31847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5480 +9FE0 +5220 +DFE0 +5500 +5B40 +6580 +4B40 +A520 +9FE0 +ENDCHAR +STARTCHAR U_7C68 +ENCODING 31848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +A880 +7DE0 +8220 +7C80 +5480 +7C80 +2940 +D620 +ENDCHAR +STARTCHAR U_7C69 +ENCODING 31849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +5480 +8440 +47C0 +2440 +EFE0 +2A20 +2FC0 +2280 +5480 +8FE0 +ENDCHAR +STARTCHAR U_7C6A +ENCODING 31850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +8A80 +A9E0 +D500 +A900 +FFE0 +D540 +AB40 +9540 +FE40 +ENDCHAR +STARTCHAR U_7C6B +ENCODING 31851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +A540 +FBE0 +2A80 +44A0 +BFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_7C6C +ENCODING 31852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9280 +FE80 +6D40 +57E0 +7D40 +11E0 +FD40 +A5E0 +B540 +8DE0 +ENDCHAR +STARTCHAR U_7C6D +ENCODING 31853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFE0 +6B40 +4A40 +7FC0 +4940 +5DE0 +5120 +9CE0 +ENDCHAR +STARTCHAR U_7C6E +ENCODING 31854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7FE0 +C940 +7FC0 +2480 +5480 +E7E0 +5480 +FFE0 +5480 +AFE0 +ENDCHAR +STARTCHAR U_7C6F +ENCODING 31855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +FFE0 +4000 +7FC0 +2080 +7FC0 +5140 +7FC0 +5540 +AA60 +ENDCHAR +STARTCHAR U_7C70 +ENCODING 31856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FE0 +5480 +FFE0 +4AA0 +7FE0 +3200 +5F80 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_7C71 +ENCODING 31857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5480 +FFE0 +94A0 +2940 +7BE0 +D680 +7BC0 +5280 +7BE0 +ENDCHAR +STARTCHAR U_7C72 +ENCODING 31858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +9240 +29E0 +FEA0 +AAE0 +FEA0 +AAE0 +FEA0 +AAE0 +87A0 +ENDCHAR +STARTCHAR U_7C73 +ENCODING 31859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +2480 +1500 +FFE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_7C74 +ENCODING 31860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +0600 +0900 +1080 +6460 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7C75 +ENCODING 31861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +7080 +23E0 +F880 +2080 +7080 +A880 +A880 +2080 +2080 +ENDCHAR +STARTCHAR U_7C76 +ENCODING 31862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A780 +7480 +2480 +FC80 +2480 +7480 +6C80 +A4A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7C77 +ENCODING 31863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +A8C0 +7700 +2100 +F900 +27E0 +7100 +6900 +A120 +2120 +20E0 +ENDCHAR +STARTCHAR U_7C78 +ENCODING 31864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFC0 +7240 +2240 +FA40 +27C0 +7240 +AA40 +AA40 +2260 +2220 +ENDCHAR +STARTCHAR U_7C79 +ENCODING 31865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7100 +27E0 +FA40 +2280 +7480 +AB00 +A980 +2240 +2C20 +ENDCHAR +STARTCHAR U_7C7A +ENCODING 31866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +73E0 +2400 +FBC0 +2040 +7080 +A900 +AA20 +2220 +21E0 +ENDCHAR +STARTCHAR U_7C7B +ENCODING 31867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +2480 +4040 +0400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7C7C +ENCODING 31868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +7080 +22A0 +FAA0 +22A0 +72A0 +AAA0 +AAA0 +23E0 +2220 +ENDCHAR +STARTCHAR U_7C7D +ENCODING 31869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +A840 +7080 +2080 +F880 +27E0 +7080 +A880 +AC80 +2280 +2100 +ENDCHAR +STARTCHAR U_7C7E +ENCODING 31870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABE0 +7120 +2520 +F520 +2520 +7120 +6A20 +A220 +24A0 +2440 +ENDCHAR +STARTCHAR U_7C7F +ENCODING 31871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +A840 +7040 +27E0 +F840 +2240 +7140 +A940 +AA40 +2140 +2080 +ENDCHAR +STARTCHAR U_7C80 +ENCODING 31872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A880 +77E0 +2080 +FA80 +2280 +7280 +AA80 +A900 +2280 +2C60 +ENDCHAR +STARTCHAR U_7C81 +ENCODING 31873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +AB80 +7080 +2080 +FFE0 +2080 +7080 +A880 +A880 +2080 +2080 +ENDCHAR +STARTCHAR U_7C82 +ENCODING 31874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +0400 +1B00 +E4E0 +1500 +FFE0 +1500 +E4E0 +0400 +ENDCHAR +STARTCHAR U_7C83 +ENCODING 31875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AC80 +74A0 +27C0 +FC80 +2480 +7480 +6C80 +A5A0 +26A0 +2460 +ENDCHAR +STARTCHAR U_7C84 +ENCODING 31876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +AF00 +7400 +2400 +FFC0 +2540 +7540 +AD40 +A480 +2940 +3620 +ENDCHAR +STARTCHAR U_7C85 +ENCODING 31877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +73E0 +26A0 +FAA0 +22A0 +72A0 +ACA0 +A920 +2220 +20C0 +ENDCHAR +STARTCHAR U_7C86 +ENCODING 31878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7180 +2540 +FD20 +2520 +7140 +6880 +A100 +2200 +2C00 +ENDCHAR +STARTCHAR U_7C87 +ENCODING 31879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A900 +77E0 +2000 +FB80 +2280 +7280 +6A80 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7C88 +ENCODING 31880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFC0 +7240 +2240 +FA40 +27C0 +7240 +AA40 +AA40 +2240 +2FE0 +ENDCHAR +STARTCHAR U_7C89 +ENCODING 31881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AA80 +7240 +2420 +F800 +27C0 +7240 +6A40 +A240 +2440 +2980 +ENDCHAR +STARTCHAR U_7C8A +ENCODING 31882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A80 +4320 +7A20 +C1E0 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7C8B +ENCODING 31883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AA00 +7780 +FA80 +22A0 +74A0 +6960 +A100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_7C8C +ENCODING 31884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +A8A0 +70A0 +23A0 +FC20 +27A0 +70A0 +A8A0 +A8A0 +24A0 +2320 +ENDCHAR +STARTCHAR U_7C8D +ENCODING 31885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +AF00 +7100 +21C0 +FF00 +2100 +71E0 +AF00 +A920 +2120 +20E0 +ENDCHAR +STARTCHAR U_7C8E +ENCODING 31886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABC0 +7240 +FA40 +63C0 +7280 +AA80 +2280 +2440 +2440 +2820 +ENDCHAR +STARTCHAR U_7C8F +ENCODING 31887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7100 +27E0 +F900 +3280 +6A80 +6440 +A640 +2920 +3120 +ENDCHAR +STARTCHAR U_7C90 +ENCODING 31888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +73E0 +2220 +FA20 +23E0 +7200 +6A00 +A200 +2400 +2400 +ENDCHAR +STARTCHAR U_7C91 +ENCODING 31889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +ABE0 +72A0 +22A0 +FAA0 +23E0 +7200 +AA00 +A220 +2220 +21E0 +ENDCHAR +STARTCHAR U_7C92 +ENCODING 31890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2000 +FA40 +2240 +7140 +A980 +A880 +2080 +2FE0 +ENDCHAR +STARTCHAR U_7C93 +ENCODING 31891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +AA40 +7240 +27E0 +FA40 +2240 +73C0 +6A40 +A240 +A240 +23C0 +ENDCHAR +STARTCHAR U_7C94 +ENCODING 31892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA00 +7200 +23E0 +FA20 +2220 +73E0 +AA00 +AA00 +2200 +23E0 +ENDCHAR +STARTCHAR U_7C95 +ENCODING 31893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +A900 +73E0 +2220 +FA20 +23E0 +7220 +6A20 +A220 +23E0 +2220 +ENDCHAR +STARTCHAR U_7C96 +ENCODING 31894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +77E0 +2100 +F900 +27C0 +7100 +AB80 +A540 +2920 +2100 +ENDCHAR +STARTCHAR U_7C97 +ENCODING 31895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +7240 +23C0 +FA40 +2240 +73C0 +6A40 +A240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_7C98 +ENCODING 31896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +71E0 +2100 +F900 +27E0 +7420 +AC20 +A420 +27E0 +2420 +ENDCHAR +STARTCHAR U_7C99 +ENCODING 31897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +A880 +73E0 +22A0 +FAA0 +23E0 +72A0 +6AA0 +A2A0 +23E0 +ENDCHAR +STARTCHAR U_7C9A +ENCODING 31898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +ABE0 +7400 +2900 +F5E0 +2720 +6D20 +7560 +AD00 +2420 +27E0 +ENDCHAR +STARTCHAR U_7C9B +ENCODING 31899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +1500 +4E40 +7FC0 +4E40 +9540 +ENDCHAR +STARTCHAR U_7C9C +ENCODING 31900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +3F80 +4440 +4440 +7FC0 +2480 +1500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7C9D +ENCODING 31901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC00 +7400 +27E0 +FD00 +25E0 +7520 +AD20 +A520 +2AA0 +3440 +ENDCHAR +STARTCHAR U_7C9E +ENCODING 31902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AA80 +7280 +2FE0 +FAA0 +2AA0 +7AE0 +AC20 +A820 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7C9F +ENCODING 31903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CA0 +ENCODING 31904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AA40 +7240 +27E0 +FA40 +2240 +7240 +77E0 +A000 +2240 +2420 +ENDCHAR +STARTCHAR U_7CA1 +ENCODING 31905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A820 +7BA0 +2820 +FBA0 +2AA0 +3AA0 +6BA0 +AAA0 +2820 +28E0 +ENDCHAR +STARTCHAR U_7CA2 +ENCODING 31906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +57E0 +6A20 +C500 +58E0 +2480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CA3 +ENCODING 31907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +AAA0 +7AA0 +2AA0 +FFE0 +2AA0 +3AA0 +6AA0 +AAA0 +2AA0 +3560 +ENDCHAR +STARTCHAR U_7CA4 +ENCODING 31908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +5540 +7FC0 +4E40 +5540 +FFE0 +0800 +3FC0 +0040 +0380 +ENDCHAR +STARTCHAR U_7CA5 +ENCODING 31909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +2420 +3520 +EEE0 +8580 +9F80 +E4E0 +2E20 +3520 +2520 +C4C0 +ENDCHAR +STARTCHAR U_7CA6 +ENCODING 31910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +E4E0 +1080 +3BE0 +4A80 +ABE0 +1080 +E080 +ENDCHAR +STARTCHAR U_7CA7 +ENCODING 31911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2400 +FC80 +2480 +77E0 +AC80 +A480 +2880 +2BE0 +ENDCHAR +STARTCHAR U_7CA8 +ENCODING 31912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +7100 +23E0 +FA20 +2220 +73E0 +AA20 +AA20 +23E0 +2220 +ENDCHAR +STARTCHAR U_7CA9 +ENCODING 31913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +77A0 +F940 +27E0 +7080 +6B00 +A6C0 +2B00 +2220 +21E0 +ENDCHAR +STARTCHAR U_7CAA +ENCODING 31914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +1500 +2480 +D160 +7FC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7CAB +ENCODING 31915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A900 +7200 +2FE0 +FAA0 +2AA0 +7AA0 +6AA0 +AAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_7CAC +ENCODING 31916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AA80 +7280 +FFE0 +2AA0 +3AA0 +6FE0 +AAA0 +2AA0 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7CAD +ENCODING 31917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A900 +7280 +2440 +FBA0 +2000 +77C0 +6C40 +A440 +2440 +27C0 +ENDCHAR +STARTCHAR U_7CAE +ENCODING 31918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A900 +77C0 +2440 +FFC0 +2440 +77E0 +AD40 +A480 +2540 +2620 +ENDCHAR +STARTCHAR U_7CAF +ENCODING 31919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FC40 +27C0 +7440 +AFC0 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_7CB0 +ENCODING 31920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +AB80 +72A0 +2120 +FBC0 +2040 +3080 +6BE0 +A080 +2080 +2180 +ENDCHAR +STARTCHAR U_7CB1 +ENCODING 31921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +A280 +6AC0 +D4A0 +4B80 +6480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CB2 +ENCODING 31922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C00 +23E0 +7A40 +C980 +3260 +C480 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_7CB3 +ENCODING 31923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A900 +77E0 +2520 +FFE0 +2520 +77E0 +AD00 +A500 +2300 +2CE0 +ENDCHAR +STARTCHAR U_7CB4 +ENCODING 31924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +ACA0 +74A0 +27E0 +FCA0 +27E0 +7080 +A880 +ABE0 +2080 +2FE0 +ENDCHAR +STARTCHAR U_7CB5 +ENCODING 31925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FC0 +5540 +7FC0 +5540 +64C0 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_7CB6 +ENCODING 31926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A840 +77C0 +F840 +2FE0 +7120 +6D40 +A380 +2540 +2920 +2200 +ENDCHAR +STARTCHAR U_7CB7 +ENCODING 31927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +ABE0 +7420 +FD60 +23A0 +77E0 +6D20 +A3A0 +2360 +2520 +20C0 +ENDCHAR +STARTCHAR U_7CB8 +ENCODING 31928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +AFE0 +7240 +23C0 +FA40 +23C0 +7240 +6A40 +AFE0 +2240 +2420 +ENDCHAR +STARTCHAR U_7CB9 +ENCODING 31929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7240 +2240 +FDA0 +2520 +7100 +6FE0 +A100 +2100 +2100 +ENDCHAR +STARTCHAR U_7CBA +ENCODING 31930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7520 +27E0 +FD20 +27E0 +75A0 +AA80 +AFE0 +2080 +2080 +ENDCHAR +STARTCHAR U_7CBB +ENCODING 31931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +AA00 +73C0 +2200 +FBC0 +2200 +77E0 +AAA0 +AAC0 +2340 +2620 +ENDCHAR +STARTCHAR U_7CBC +ENCODING 31932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92A0 +54A0 +FEA0 +5540 +9340 +2540 +7D40 +94A0 +7EA0 +24A0 +C4A0 +ENDCHAR +STARTCHAR U_7CBD +ENCODING 31933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7420 +23C0 +F800 +27E0 +7100 +AD40 +A520 +2920 +2300 +ENDCHAR +STARTCHAR U_7CBE +ENCODING 31934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +27C0 +F100 +2FE0 +7440 +6FC0 +A440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7CBF +ENCODING 31935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AD40 +77C0 +2540 +FFC0 +2100 +77E0 +A900 +AB80 +2540 +2920 +ENDCHAR +STARTCHAR U_7CC0 +ENCODING 31936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFE0 +7480 +2280 +FAA0 +24C0 +7480 +6D80 +A6A0 +24A0 +2460 +ENDCHAR +STARTCHAR U_7CC1 +ENCODING 31937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +AFE0 +7100 +27E0 +FA80 +2540 +72A0 +AD00 +AA40 +2180 +2600 +ENDCHAR +STARTCHAR U_7CC2 +ENCODING 31938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AFE0 +7440 +27C0 +FC40 +27C0 +7440 +6FE0 +A680 +2440 +27E0 +ENDCHAR +STARTCHAR U_7CC3 +ENCODING 31939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +AA40 +73C0 +2240 +FFE0 +2200 +77E0 +6AA0 +A520 +22A0 +2440 +ENDCHAR +STARTCHAR U_7CC4 +ENCODING 31940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7820 +2FE0 +F800 +2FE0 +7AA0 +6FE0 +AAA0 +3AA0 +2860 +ENDCHAR +STARTCHAR U_7CC5 +ENCODING 31941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +A940 +7080 +27E0 +FAA0 +2580 +7100 +AFE0 +AB80 +2540 +2920 +ENDCHAR +STARTCHAR U_7CC6 +ENCODING 31942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A900 +7200 +2FE0 +FAA0 +2BA0 +7AA0 +6BA0 +AAA0 +2FE0 +2820 +ENDCHAR +STARTCHAR U_7CC7 +ENCODING 31943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77E0 +2500 +FDE0 +2680 +77E0 +AC80 +A480 +2540 +2620 +ENDCHAR +STARTCHAR U_7CC8 +ENCODING 31944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A920 +75C0 +2700 +F9E0 +2220 +73E0 +AA20 +ABE0 +2220 +2260 +ENDCHAR +STARTCHAR U_7CC9 +ENCODING 31945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AD20 +76A0 +27E0 +F280 +2D60 +73C0 +6A40 +A580 +2240 +2420 +ENDCHAR +STARTCHAR U_7CCA +ENCODING 31946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +A4A0 +7EA0 +24E0 +FEA0 +2AA0 +3AE0 +6AA0 +AEA0 +2120 +2260 +ENDCHAR +STARTCHAR U_7CCB +ENCODING 31947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +A280 +7FE0 +2000 +FE20 +2AA0 +3EA0 +6AA0 +AEA0 +2A20 +2A60 +ENDCHAR +STARTCHAR U_7CCC +ENCODING 31948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AF40 +7560 +2240 +FD00 +24E0 +73C0 +AA40 +ABC0 +2240 +23C0 +ENDCHAR +STARTCHAR U_7CCD +ENCODING 31949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AA80 +77E0 +2240 +FA40 +25A0 +77E0 +AA40 +A240 +25A0 +2FE0 +ENDCHAR +STARTCHAR U_7CCE +ENCODING 31950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC00 +77E0 +26A0 +FFE0 +26A0 +77E0 +AC80 +A7E0 +2880 +37E0 +ENDCHAR +STARTCHAR U_7CCF +ENCODING 31951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A820 +7FE0 +2AA0 +F9C0 +2BE0 +6A20 +7BE0 +AA20 +2BE0 +3220 +ENDCHAR +STARTCHAR U_7CD0 +ENCODING 31952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +AFE0 +7520 +27E0 +FD20 +27E0 +7520 +A840 +AFE0 +2240 +21C0 +ENDCHAR +STARTCHAR U_7CD1 +ENCODING 31953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A920 +7760 +2880 +FFE0 +2120 +75A0 +AB60 +ADA0 +2120 +26C0 +ENDCHAR +STARTCHAR U_7CD2 +ENCODING 31954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +27E0 +FA00 +23E0 +72A0 +ABE0 +AAA0 +27E0 +2AA0 +ENDCHAR +STARTCHAR U_7CD3 +ENCODING 31955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1380 +7A80 +1280 +FCE0 +8400 +7DC0 +5540 +FD40 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_7CD4 +ENCODING 31956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AD40 +7280 +2360 +FD00 +27E0 +7520 +AFE0 +A900 +2140 +27A0 +ENDCHAR +STARTCHAR U_7CD5 +ENCODING 31957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +AA80 +77E0 +2100 +F900 +27C0 +7100 +AFE0 +A540 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_7CD6 +ENCODING 31958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7940 +2FE0 +F940 +2FC0 +7900 +ABC0 +AA40 +2A40 +33C0 +ENDCHAR +STARTCHAR U_7CD7 +ENCODING 31959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFC0 +7440 +2740 +FDC0 +2440 +77C0 +A140 +AFE0 +2280 +2C60 +ENDCHAR +STARTCHAR U_7CD8 +ENCODING 31960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +AFE0 +7820 +27C0 +F920 +2340 +7580 +6AC0 +A5A0 +22A0 +2500 +ENDCHAR +STARTCHAR U_7CD9 +ENCODING 31961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +AE80 +73E0 +2480 +FFE0 +2400 +75E0 +AD20 +A5E0 +2A00 +33E0 +ENDCHAR +STARTCHAR U_7CDA +ENCODING 31962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +AFE0 +7480 +2240 +FA40 +2EE0 +7240 +6E40 +AA40 +33E0 +2200 +ENDCHAR +STARTCHAR U_7CDB +ENCODING 31963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +AB40 +77E0 +2420 +FBC0 +2240 +73C0 +6900 +A3C0 +2100 +27E0 +ENDCHAR +STARTCHAR U_7CDC +ENCODING 31964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9100 +FFE0 +BB40 +D560 +A480 +9500 +FFE0 +9500 +E4E0 +ENDCHAR +STARTCHAR U_7CDD +ENCODING 31965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +ABA0 +74A0 +27E0 +F880 +2760 +7280 +AD20 +A240 +2080 +2700 +ENDCHAR +STARTCHAR U_7CDE +ENCODING 31966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +1500 +7FC0 +A4A0 +3F80 +7FC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7CDF +ENCODING 31967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7AA0 +2AA0 +FFE0 +2AA0 +3FE0 +6440 +A7C0 +A440 +27C0 +ENDCHAR +STARTCHAR U_7CE0 +ENCODING 31968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +27E0 +FD40 +27C0 +7520 +AFC0 +AB40 +3520 +2B20 +ENDCHAR +STARTCHAR U_7CE1 +ENCODING 31969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7280 +27E0 +F800 +27C0 +7540 +6CC0 +A7C0 +22A0 +2CE0 +ENDCHAR +STARTCHAR U_7CE2 +ENCODING 31970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +27C0 +FC40 +27C0 +3440 +6FE0 +A100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7CE3 +ENCODING 31971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A240 +7B40 +2FE0 +F6C0 +2B60 +77C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7CE4 +ENCODING 31972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +BF80 +6A80 +FFE0 +21A0 +6EA0 +7AA0 +AE40 +AA40 +2EA0 +2B20 +ENDCHAR +STARTCHAR U_7CE5 +ENCODING 31973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +7FE0 +2AA0 +FAA0 +2FE0 +7100 +6FE0 +AAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_7CE6 +ENCODING 31974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +27C0 +FC40 +27C0 +7280 +6FE0 +A440 +27C0 +2440 +ENDCHAR +STARTCHAR U_7CE7 +ENCODING 31975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FFE0 +2540 +37C0 +6D40 +AFE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_7CE8 +ENCODING 31976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AA20 +73E0 +2C80 +FBE0 +2EA0 +77E0 +AEA0 +A480 +34A0 +2BE0 +ENDCHAR +STARTCHAR U_7CE9 +ENCODING 31977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AA80 +7440 +2FE0 +FD60 +2BA0 +6FE0 +7440 +A7C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_7CEA +ENCODING 31978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +43E0 +7C80 +A5E0 +BE80 +0A80 +7FE0 +1280 +E260 +ENDCHAR +STARTCHAR U_7CEB +ENCODING 31979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +7FE0 +2000 +FFE0 +2440 +77C0 +6220 +A540 +2C80 +2660 +ENDCHAR +STARTCHAR U_7CEC +ENCODING 31980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +AAA0 +7FE0 +2100 +FFA0 +2140 +77E0 +AA20 +A7E0 +2A20 +23E0 +ENDCHAR +STARTCHAR U_7CED +ENCODING 31981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +AEC0 +7540 +27C0 +F440 +2A20 +73C0 +6E80 +A100 +2280 +2C60 +ENDCHAR +STARTCHAR U_7CEE +ENCODING 31982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +AA40 +7F60 +29C0 +FF20 +2A20 +7F80 +A800 +AFE0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_7CEF +ENCODING 31983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A100 +7FE0 +2920 +FBA0 +2540 +3FE0 +6200 +AFE0 +2AA0 +2AA0 +ENDCHAR +STARTCHAR U_7CF0 +ENCODING 31984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A920 +7FE0 +2D60 +FFE0 +2D60 +3FE0 +68A0 +AFE0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_7CF1 +ENCODING 31985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A880 +FBE0 +F140 +93E0 +F880 +8BE0 +F880 +1500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7CF2 +ENCODING 31986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +A940 +7FE0 +2940 +FBE0 +2AA0 +3FE0 +6CA0 +AFE0 +3420 +2460 +ENDCHAR +STARTCHAR U_7CF3 +ENCODING 31987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55C0 +FF40 +1160 +D700 +92C0 +FEC0 +1520 +7FC0 +0D00 +3480 +C460 +ENDCHAR +STARTCHAR U_7CF4 +ENCODING 31988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +25A0 +5360 +8DA0 +23E0 +AE80 +73E0 +FA80 +23E0 +7280 +ABE0 +ENDCHAR +STARTCHAR U_7CF5 +ENCODING 31989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A80 +7FE0 +4940 +7BE0 +4C80 +FFE0 +1500 +2480 +4440 +ENDCHAR +STARTCHAR U_7CF6 +ENCODING 31990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +FDA0 +AB60 +FDA0 +23E0 +AA80 +77E0 +FA80 +23E0 +7280 +ABE0 +ENDCHAR +STARTCHAR U_7CF7 +ENCODING 31991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFE0 +7280 +2EE0 +FAA0 +2EE0 +3FE0 +6AA0 +AFE0 +2BA0 +2D60 +ENDCHAR +STARTCHAR U_7CF8 +ENCODING 31992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +1100 +2200 +7C00 +1100 +FE80 +4480 +2500 +2480 +4440 +9C40 +ENDCHAR +STARTCHAR U_7CF9 +ENCODING 31993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +20 +20 +48 +F0 +20 +48 +FC +00 +A8 +A8 +80 +ENDCHAR +STARTCHAR U_7CFA +ENCODING 31994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2200 +4A00 +F200 +2200 +4A00 +FA00 +0200 +AA20 +AA20 +81E0 +ENDCHAR +STARTCHAR U_7CFB +ENCODING 31995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0380 +FC00 +1100 +7E00 +0800 +1100 +FF80 +0880 +2A00 +4900 +9880 +ENDCHAR +STARTCHAR U_7CFC +ENCODING 31996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2100 +2100 +4900 +F3C0 +2140 +4940 +FA40 +0240 +AA40 +AD40 +8880 +ENDCHAR +STARTCHAR U_7CFD +ENCODING 31997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4080 +8880 +F080 +2080 +4880 +F480 +5080 +AA80 +A900 +ENDCHAR +STARTCHAR U_7CFE +ENCODING 31998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2120 +4920 +F120 +2120 +4960 +FBA0 +0520 +5020 +A820 +A820 +ENDCHAR +STARTCHAR U_7CFF +ENCODING 31999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4920 +F120 +2120 +4920 +F920 +0120 +AA20 +AAA0 +8440 +ENDCHAR +STARTCHAR U_7D00 +ENCODING 32000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +4040 +F040 +2040 +4BC0 +FA00 +0200 +AA20 +AA20 +81E0 +ENDCHAR +STARTCHAR U_7D01 +ENCODING 32001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4C40 +F540 +2280 +5280 +E900 +0500 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D02 +ENCODING 32002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +4040 +F7E0 +2040 +5240 +E940 +0040 +5240 +A940 +A880 +ENDCHAR +STARTCHAR U_7D03 +ENCODING 32003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22A0 +42A0 +F2A0 +22A0 +52A0 +EAA0 +02A0 +52A0 +ACA0 +A820 +ENDCHAR +STARTCHAR U_7D04 +ENCODING 32004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +43E0 +F420 +2020 +5220 +E920 +0120 +5020 +A920 +A8C0 +ENDCHAR +STARTCHAR U_7D05 +ENCODING 32005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4100 +F100 +2100 +5100 +E900 +0100 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D06 +ENCODING 32006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4080 +F080 +27E0 +5080 +E880 +0080 +5080 +AA80 +A900 +ENDCHAR +STARTCHAR U_7D07 +ENCODING 32007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +57E0 +F800 +27C0 +5080 +E900 +0200 +5220 +AC20 +ABE0 +ENDCHAR +STARTCHAR U_7D08 +ENCODING 32008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FC0 +F140 +2540 +5340 +E940 +02C0 +5240 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D09 +ENCODING 32009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +4120 +F120 +2320 +5520 +E920 +0120 +5120 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_7D0A +ENCODING 32010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3580 +C960 +3E00 +0880 +3F40 +2280 +C660 +ENDCHAR +STARTCHAR U_7D0B +ENCODING 32011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F240 +2240 +5240 +EA40 +0180 +5180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7D0C +ENCODING 32012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +57E0 +F100 +2100 +5180 +E980 +0180 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D0D +ENCODING 32013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F520 +2520 +5520 +EDA0 +0660 +5420 +AC20 +A4E0 +ENDCHAR +STARTCHAR U_7D0E +ENCODING 32014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +5100 +F7E0 +2100 +5100 +E900 +0100 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D0F +ENCODING 32015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +5140 +F040 +2240 +5140 +E840 +00E0 +5740 +A840 +A840 +ENDCHAR +STARTCHAR U_7D10 +ENCODING 32016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +5240 +F240 +2240 +57C0 +EA40 +0240 +5240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_7D11 +ENCODING 32017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +5080 +F100 +2340 +5520 +E920 +0100 +5100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D12 +ENCODING 32018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +2240 +5240 +EA40 +0240 +5240 +AC40 +A840 +ENDCHAR +STARTCHAR U_7D13 +ENCODING 32019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +5140 +F080 +2FE0 +50A0 +E8C0 +0080 +5480 +AA80 +A900 +ENDCHAR +STARTCHAR U_7D14 +ENCODING 32020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F100 +2540 +5540 +EFC0 +0540 +5120 +A920 +A8E0 +ENDCHAR +STARTCHAR U_7D15 +ENCODING 32021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5480 +F4A0 +27C0 +5480 +EC80 +0480 +55A0 +AEA0 +AC60 +ENDCHAR +STARTCHAR U_7D16 +ENCODING 32022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +20A0 +50A0 +F7A0 +2420 +57A0 +E8A0 +00A0 +50A0 +ACA0 +AB20 +ENDCHAR +STARTCHAR U_7D17 +ENCODING 32023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +52C0 +F2A0 +24A0 +5080 +E8A0 +0040 +5080 +A900 +AE00 +ENDCHAR +STARTCHAR U_7D18 +ENCODING 32024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F100 +2140 +5240 +EA80 +0280 +5540 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D19 +ENCODING 32025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +5480 +F480 +27E0 +5480 +EC80 +04A0 +55A0 +AE60 +AC20 +ENDCHAR +STARTCHAR U_7D1A +ENCODING 32026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +5240 +F280 +22E0 +5220 +EA40 +0540 +5480 +A940 +AA20 +ENDCHAR +STARTCHAR U_7D1B +ENCODING 32027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +5240 +F420 +2820 +57C0 +EA40 +0240 +5240 +AD40 +A880 +ENDCHAR +STARTCHAR U_7D1C +ENCODING 32028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23C0 +5000 +F000 +27E0 +5100 +E900 +0200 +5240 +AFA0 +A820 +ENDCHAR +STARTCHAR U_7D1D +ENCODING 32029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +5080 +F080 +2080 +57E0 +E880 +0080 +5080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D1E +ENCODING 32030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F520 +2520 +5180 +E980 +0180 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D1F +ENCODING 32031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F920 +2080 +5000 +EFE0 +0040 +5040 +A880 +A880 +ENDCHAR +STARTCHAR U_7D20 +ENCODING 32032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +FFE0 +0900 +3F80 +0840 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D21 +ENCODING 32033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +4FE0 +F100 +21E0 +5120 +E920 +0120 +5220 +AD20 +A8C0 +ENDCHAR +STARTCHAR U_7D22 +ENCODING 32034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +9120 +3E00 +0880 +7FC0 +0440 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D23 +ENCODING 32035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +47C0 +8240 +F240 +2440 +4960 +F900 +07E0 +A900 +A900 +8100 +ENDCHAR +STARTCHAR U_7D24 +ENCODING 32036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +2380 +4A00 +FA00 +23E0 +4A40 +FA40 +0240 +AA40 +AA40 +8440 +ENDCHAR +STARTCHAR U_7D25 +ENCODING 32037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +3120 +D4E0 +2900 +3F00 +0840 +3FC0 +0500 +54C0 +8800 +ENDCHAR +STARTCHAR U_7D26 +ENCODING 32038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47C0 +9540 +F540 +2540 +57C0 +FC00 +0400 +AC20 +A420 +03E0 +ENDCHAR +STARTCHAR U_7D27 +ENCODING 32039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2FC0 +A480 +A300 +ACC0 +1100 +3E00 +1100 +7F00 +2A80 +4900 +9880 +ENDCHAR +STARTCHAR U_7D28 +ENCODING 32040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +5440 +F5E0 +2E40 +5540 +ED40 +0440 +5440 +AD40 +AC80 +ENDCHAR +STARTCHAR U_7D29 +ENCODING 32041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +53E0 +F280 +2480 +57E0 +E880 +0480 +5140 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7D2A +ENCODING 32042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +4280 +AAA0 +EBA0 +4AC0 +FA80 +0A80 +ABA0 +AEA0 +8860 +ENDCHAR +STARTCHAR U_7D2B +ENCODING 32043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5140 +5D80 +5120 +FDE0 +0880 +3F00 +0880 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D2C +ENCODING 32044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +57E0 +F4A0 +24A0 +54A0 +EFE0 +04A0 +54A0 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D2D +ENCODING 32045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +4640 +9240 +F640 +4480 +9680 +FA80 +0280 +AB20 +ABE0 +8420 +ENDCHAR +STARTCHAR U_7D2E +ENCODING 32046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +3120 +6920 +A4E0 +0800 +3E00 +0880 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D2F +ENCODING 32047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0900 +3E00 +1080 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7D30 +ENCODING 32048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +5520 +F520 +2520 +57E0 +ED20 +0520 +5520 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D31 +ENCODING 32049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +57E0 +F100 +2100 +51C0 +EA40 +0340 +5480 +A940 +AA20 +ENDCHAR +STARTCHAR U_7D32 +ENCODING 32050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +5540 +FFE0 +2540 +5540 +ED40 +05C0 +5400 +AC00 +AFE0 +ENDCHAR +STARTCHAR U_7D33 +ENCODING 32051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +57E0 +F4A0 +27E0 +54A0 +EFE0 +04A0 +5080 +A880 +A880 +ENDCHAR +STARTCHAR U_7D34 +ENCODING 32052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4100 +97E0 +F520 +4540 +97C0 +F640 +0580 +AD80 +AA40 +9420 +ENDCHAR +STARTCHAR U_7D35 +ENCODING 32053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F420 +2000 +57E0 +E880 +0480 +5080 +AA80 +A900 +ENDCHAR +STARTCHAR U_7D36 +ENCODING 32054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57C0 +F100 +2100 +57E0 +E900 +0100 +5240 +AFA0 +A820 +ENDCHAR +STARTCHAR U_7D37 +ENCODING 32055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2100 +4280 +F240 +2520 +5100 +FFC0 +0040 +AA80 +A900 +8100 +ENDCHAR +STARTCHAR U_7D38 +ENCODING 32056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F080 +2080 +5080 +EBE0 +0080 +5080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D39 +ENCODING 32057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +5120 +F220 +24C0 +5000 +EBE0 +0220 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7D3A +ENCODING 32058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +57E0 +F240 +2240 +5240 +EBC0 +0240 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_7D3B +ENCODING 32059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57C0 +F540 +2540 +5FE0 +E900 +0100 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_7D3C +ENCODING 32060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +57E0 +F2A0 +27E0 +5A80 +EFE0 +02A0 +52E0 +AC80 +A880 +ENDCHAR +STARTCHAR U_7D3D +ENCODING 32061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F420 +2200 +5240 +EA80 +0300 +5220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7D3E +ENCODING 32062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +2100 +5600 +E880 +0300 +5040 +A980 +AE00 +ENDCHAR +STARTCHAR U_7D3F +ENCODING 32063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5240 +F460 +27A0 +5000 +EBE0 +0220 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7D40 +ENCODING 32064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +54A0 +F4A0 +27E0 +54A0 +E880 +04A0 +54A0 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D41 +ENCODING 32065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5480 +FA80 +22E0 +53A0 +EEA0 +02E0 +5280 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7D42 +ENCODING 32066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5440 +F280 +2100 +5280 +EC60 +0100 +5080 +AB00 +80C0 +ENDCHAR +STARTCHAR U_7D43 +ENCODING 32067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F100 +2240 +5780 +E880 +0100 +5240 +AFA0 +A820 +ENDCHAR +STARTCHAR U_7D44 +ENCODING 32068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5240 +F3C0 +2240 +5240 +EA40 +03C0 +5240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_7D45 +ENCODING 32069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +5820 +FBA0 +2AA0 +5AA0 +EBA0 +0AA0 +5820 +A820 +A860 +ENDCHAR +STARTCHAR U_7D46 +ENCODING 32070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +5540 +F100 +27C0 +5100 +E900 +0FE0 +5100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D47 +ENCODING 32071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +53E0 +F420 +2BA0 +52A0 +EAA0 +03A0 +5020 +A820 +A8C0 +ENDCHAR +STARTCHAR U_7D48 +ENCODING 32072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4100 +8BE0 +F220 +2220 +4BE0 +FA20 +0220 +AA20 +ABE0 +8220 +ENDCHAR +STARTCHAR U_7D49 +ENCODING 32073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +4920 +F7E0 +2100 +4B80 +FB40 +0540 +AD20 +A920 +8100 +ENDCHAR +STARTCHAR U_7D4A +ENCODING 32074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5FE0 +F100 +2380 +5540 +E920 +07C0 +5100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D4B +ENCODING 32075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +4FE0 +F400 +2480 +4480 +FD00 +0540 +AE60 +ABA0 +8820 +ENDCHAR +STARTCHAR U_7D4C +ENCODING 32076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4440 +F280 +2380 +4440 +F920 +07C0 +A900 +A900 +87E0 +ENDCHAR +STARTCHAR U_7D4D +ENCODING 32077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2160 +43C0 +F640 +2A40 +53E0 +FA40 +0240 +AA40 +AA40 +03E0 +ENDCHAR +STARTCHAR U_7D4E +ENCODING 32078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2400 +5800 +F200 +25E0 +5C40 +EC40 +0440 +5440 +AC40 +A4C0 +ENDCHAR +STARTCHAR U_7D4F +ENCODING 32079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5520 +F7E0 +2520 +57E0 +E900 +0140 +50A0 +A960 +AE20 +ENDCHAR +STARTCHAR U_7D50 +ENCODING 32080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +57E0 +F080 +23E0 +5000 +EBE0 +0220 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7D51 +ENCODING 32081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +57C0 +F900 +2100 +5FE0 +E900 +0380 +5540 +A920 +A920 +ENDCHAR +STARTCHAR U_7D52 +ENCODING 32082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22A0 +52A0 +F6A0 +2BE0 +52A0 +EAA0 +02A0 +52A0 +ACA0 +A820 +ENDCHAR +STARTCHAR U_7D53 +ENCODING 32083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +F100 +2FE0 +5100 +E900 +07C0 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D54 +ENCODING 32084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2080 +5100 +F7E0 +2420 +5420 +EFE0 +0420 +5420 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D55 +ENCODING 32085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +5480 +FFC0 +2540 +5540 +EFC0 +0400 +5420 +AC20 +ABE0 +ENDCHAR +STARTCHAR U_7D56 +ENCODING 32086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +5540 +F100 +2FE0 +5280 +EA80 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D57 +ENCODING 32087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +4C20 +F5E0 +2560 +4560 +FD60 +05E0 +AC20 +AFE0 +0420 +ENDCHAR +STARTCHAR U_7D58 +ENCODING 32088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2500 +55E0 +F220 +20A0 +5480 +EC80 +0480 +5540 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7D59 +ENCODING 32089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +4BC0 +F240 +1240 +23C0 +4A40 +FE40 +03C0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_7D5A +ENCODING 32090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +4A00 +F3C0 +1240 +23C0 +4A40 +FD40 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D5B +ENCODING 32091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5640 +5180 +DE60 +5100 +5780 +5240 +5FA0 +4940 +7320 +ENDCHAR +STARTCHAR U_7D5C +ENCODING 32092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +10A0 +7CA0 +1120 +FEC0 +0A00 +1480 +7F40 +1500 +2480 +DC60 +ENDCHAR +STARTCHAR U_7D5D +ENCODING 32093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4A80 +F440 +1BA0 +2000 +4FE0 +FA00 +03C0 +A840 +A8C0 +ENDCHAR +STARTCHAR U_7D5E +ENCODING 32094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +5FE0 +F240 +2420 +5240 +EA40 +0240 +5180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7D5F +ENCODING 32095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +27C0 +5100 +E900 +07C0 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D60 +ENCODING 32096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +F200 +17C0 +2A40 +4BC0 +FA40 +03C0 +AA40 +AAC0 +ENDCHAR +STARTCHAR U_7D61 +ENCODING 32097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5680 +F900 +2280 +5440 +EFE0 +0440 +5440 +AFC0 +AC40 +ENDCHAR +STARTCHAR U_7D62 +ENCODING 32098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5420 +FFA0 +24A0 +57A0 +ECA0 +07A0 +5020 +A820 +A8C0 +ENDCHAR +STARTCHAR U_7D63 +ENCODING 32099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +57E0 +F280 +2280 +5FE0 +EA80 +0280 +5280 +AC80 +A880 +ENDCHAR +STARTCHAR U_7D64 +ENCODING 32100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4280 +FFE0 +2AA0 +2AA0 +4AE0 +FC20 +0820 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D65 +ENCODING 32101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +2540 +4920 +FFE0 +2900 +2900 +4900 +FA80 +0A80 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7D66 +ENCODING 32102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +F820 +27C0 +5000 +F7C0 +0440 +5440 +AFC0 +8440 +ENDCHAR +STARTCHAR U_7D67 +ENCODING 32103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4820 +FBA0 +2820 +4BA0 +FAA0 +0BA0 +5AA0 +A820 +A8E0 +ENDCHAR +STARTCHAR U_7D68 +ENCODING 32104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +57E0 +F280 +22A0 +57A0 +EAC0 +0280 +52A0 +AD60 +AA20 +ENDCHAR +STARTCHAR U_7D69 +ENCODING 32105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AA0 +56A0 +F2C0 +2280 +56C0 +EAA0 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D6A +ENCODING 32106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +5520 +F7E0 +2520 +5520 +EDA0 +0660 +5420 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D6B +ENCODING 32107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +5140 +FBE0 +0900 +3E00 +0880 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7D6C +ENCODING 32108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +4900 +F7E0 +1100 +27C0 +4440 +FC40 +0440 +AFC0 +A440 +ENDCHAR +STARTCHAR U_7D6D +ENCODING 32109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +7FC0 +1000 +FFE0 +2880 +5E40 +8920 +3F80 +0400 +3580 +CC60 +ENDCHAR +STARTCHAR U_7D6E +ENCODING 32110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FDE0 +2920 +69E0 +1520 +6900 +3E00 +0840 +7FA0 +1280 +EE60 +ENDCHAR +STARTCHAR U_7D6F +ENCODING 32111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F240 +2780 +5120 +EA40 +0480 +5140 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7D70 +ENCODING 32112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +5100 +F240 +27A0 +50A0 +E880 +03E0 +5080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_7D71 +ENCODING 32113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F100 +2240 +57A0 +E800 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D72 +ENCODING 32114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5240 +F780 +2140 +57E0 +E880 +02C0 +54A0 +A8A0 +A980 +ENDCHAR +STARTCHAR U_7D73 +ENCODING 32115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5240 +F580 +2260 +5080 +EFE0 +0480 +57E0 +A880 +A880 +ENDCHAR +STARTCHAR U_7D74 +ENCODING 32116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +F100 +17C0 +2100 +4900 +FFE0 +0100 +A900 +A900 +ENDCHAR +STARTCHAR U_7D75 +ENCODING 32117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4A80 +FC60 +1380 +2000 +4FE0 +F100 +0240 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D76 +ENCODING 32118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +4A40 +F7E0 +1AA0 +22A0 +4BE0 +FA00 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7D77 +ENCODING 32119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +F3C0 +2160 +6A20 +3F00 +0480 +7FE0 +1280 +E660 +ENDCHAR +STARTCHAR U_7D78 +ENCODING 32120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +F440 +17C0 +2440 +4FC0 +FA80 +02A0 +ACA0 +A8E0 +ENDCHAR +STARTCHAR U_7D79 +ENCODING 32121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +53E0 +F000 +23E0 +5220 +EBE0 +0220 +53E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_7D7A +ENCODING 32122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2660 +2180 +5240 +F520 +27E0 +5280 +EFE0 +02A0 +52A0 +AAE0 +A880 +ENDCHAR +STARTCHAR U_7D7B +ENCODING 32123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5480 +FFE0 +2520 +5520 +EFE0 +0180 +5280 +ACA0 +A8E0 +ENDCHAR +STARTCHAR U_7D7C +ENCODING 32124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2740 +5220 +F2C0 +2140 +56A0 +E960 +06A0 +5120 +AEA0 +A840 +ENDCHAR +STARTCHAR U_7D7D +ENCODING 32125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +5440 +F7C0 +2000 +5000 +EFE0 +0420 +5420 +AFE0 +8420 +ENDCHAR +STARTCHAR U_7D7E +ENCODING 32126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +4FE0 +F500 +1740 +2540 +4540 +FF40 +05A0 +AD60 +AA20 +ENDCHAR +STARTCHAR U_7D7F +ENCODING 32127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +57E0 +F480 +22A0 +52A0 +E9C0 +02A0 +54A0 +AAA0 +A900 +ENDCHAR +STARTCHAR U_7D80 +ENCODING 32128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +FFE0 +2920 +5FE0 +E920 +0380 +5540 +A920 +A920 +ENDCHAR +STARTCHAR U_7D81 +ENCODING 32129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +22A0 +5FA0 +F2A0 +22C0 +57A0 +EAA0 +07A0 +52E0 +AC80 +A880 +ENDCHAR +STARTCHAR U_7D82 +ENCODING 32130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +F000 +17C0 +2440 +4FC0 +FA80 +02A0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7D83 +ENCODING 32131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +22C0 +5080 +F7E0 +2420 +57E0 +EC20 +07E0 +5420 +AC20 +ACE0 +ENDCHAR +STARTCHAR U_7D84 +ENCODING 32132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +57E0 +F420 +23C0 +5000 +EFE0 +0280 +52A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7D85 +ENCODING 32133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +57C0 +F040 +27C0 +5000 +EFE0 +0AA0 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7D86 +ENCODING 32134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +57E0 +F4A0 +27E0 +54A0 +EFE0 +0280 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7D87 +ENCODING 32135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4280 +FFE0 +2AA0 +2CE0 +4820 +FFE0 +0820 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7D88 +ENCODING 32136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +57E0 +F120 +27E0 +5500 +EFE0 +0120 +53E0 +AD40 +A900 +ENDCHAR +STARTCHAR U_7D89 +ENCODING 32137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2700 +4100 +FFE0 +1540 +2920 +47C0 +FA40 +02E0 +AA20 +ACC0 +ENDCHAR +STARTCHAR U_7D8A +ENCODING 32138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +F100 +1540 +2BA0 +4100 +F900 +0280 +AA40 +AC60 +ENDCHAR +STARTCHAR U_7D8B +ENCODING 32139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +47E0 +F520 +1100 +27E0 +4900 +FA80 +0280 +AD20 +ABE0 +ENDCHAR +STARTCHAR U_7D8C +ENCODING 32140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +5920 +F280 +2440 +5820 +EBC0 +0240 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_7D8D +ENCODING 32141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2820 +57C0 +E880 +07E0 +5100 +A900 +AB00 +ENDCHAR +STARTCHAR U_7D8E +ENCODING 32142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +22C0 +5240 +F440 +26E0 +5240 +EA40 +06E0 +5200 +AD00 +A8E0 +ENDCHAR +STARTCHAR U_7D8F +ENCODING 32143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +5940 +F480 +2100 +5FE0 +EA40 +0480 +5380 +A940 +AE20 +ENDCHAR +STARTCHAR U_7D90 +ENCODING 32144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FC0 +F440 +1440 +27C0 +4A80 +FA80 +02A0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7D91 +ENCODING 32145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +5520 +F7E0 +2520 +55A0 +EF60 +0520 +5520 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7D92 +ENCODING 32146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +5540 +F280 +27E0 +5080 +E900 +07E0 +5100 +AD00 +AB00 +ENDCHAR +STARTCHAR U_7D93 +ENCODING 32147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +5540 +FA80 +2540 +5540 +E800 +07C0 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7D94 +ENCODING 32148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +5100 +8BC0 +7520 +03E0 +F880 +21C0 +7AA0 +0CA0 +7180 +ENDCHAR +STARTCHAR U_7D95 +ENCODING 32149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +F100 +1100 +27C0 +4800 +FAA0 +06A0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7D96 +ENCODING 32150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2FC0 +5240 +F440 +2760 +5340 +EB40 +05E0 +5400 +AA00 +A9E0 +ENDCHAR +STARTCHAR U_7D97 +ENCODING 32151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4AA0 +FC60 +2820 +2BA0 +4AA0 +FAA0 +0BA0 +A820 +A860 +ENDCHAR +STARTCHAR U_7D98 +ENCODING 32152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +4640 +FD80 +1240 +27E0 +4900 +FFE0 +0100 +AFE0 +A900 +ENDCHAR +STARTCHAR U_7D99 +ENCODING 32153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2100 +2900 +4D40 +FB80 +1900 +2FC0 +4900 +FB80 +0D40 +A900 +AFC0 +ENDCHAR +STARTCHAR U_7D9A +ENCODING 32154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +F7C0 +1000 +2FE0 +4820 +FA80 +0280 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7D9B +ENCODING 32155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +4D20 +F520 +1260 +2420 +4900 +FAA0 +06A0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7D9C +ENCODING 32156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F3C0 +2000 +57E0 +E880 +02C0 +54A0 +AAA0 +A900 +ENDCHAR +STARTCHAR U_7D9D +ENCODING 32157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2440 +5FE0 +F440 +26C0 +5560 +ED60 +0540 +5440 +AC40 +A440 +ENDCHAR +STARTCHAR U_7D9E +ENCODING 32158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +5100 +FFE0 +2540 +5540 +EFE0 +0540 +5FE0 +A900 +A7C0 +ENDCHAR +STARTCHAR U_7D9F +ENCODING 32159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F7E0 +24C0 +54A0 +EFE0 +0480 +5540 +AA20 +AC20 +ENDCHAR +STARTCHAR U_7DA0 +ENCODING 32160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5780 +F080 +2FE0 +5120 +ED40 +0380 +5540 +A920 +AF20 +ENDCHAR +STARTCHAR U_7DA1 +ENCODING 32161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5000 +F3E0 +2220 +53E0 +E880 +02C0 +54A0 +AAA0 +A900 +ENDCHAR +STARTCHAR U_7DA2 +ENCODING 32162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +4BA0 +F920 +2FE0 +5820 +FBA0 +0AA0 +5BA0 +A820 +A8E0 +ENDCHAR +STARTCHAR U_7DA3 +ENCODING 32163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +5FE0 +F200 +2FE0 +5240 +EFA0 +0280 +53A0 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_7DA4 +ENCODING 32164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1540 +2580 +FD40 +2540 +3D00 +0600 +1880 +77C0 +2480 +4C40 +ENDCHAR +STARTCHAR U_7DA5 +ENCODING 32165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +F540 +17C0 +2000 +4FE0 +FA80 +0280 +AA80 +AC80 +ENDCHAR +STARTCHAR U_7DA6 +ENCODING 32166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +1080 +1F80 +1080 +FFE0 +4A40 +94A0 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_7DA7 +ENCODING 32167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5240 +F3C0 +2000 +57E0 +E880 +0100 +57E0 +A900 +AB00 +ENDCHAR +STARTCHAR U_7DA8 +ENCODING 32168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +47E0 +F280 +1380 +2280 +4B80 +FA80 +07E0 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DA9 +ENCODING 32169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5820 +F400 +27E0 +54A0 +EDA0 +02E0 +5280 +ACA0 +A860 +ENDCHAR +STARTCHAR U_7DAA +ENCODING 32170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7C0 +2100 +5FE0 +EC40 +07C0 +5440 +AFC0 +ACC0 +ENDCHAR +STARTCHAR U_7DAB +ENCODING 32171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +4FE0 +F280 +1120 +26E0 +4240 +FFE0 +0240 +A9A0 +AE60 +ENDCHAR +STARTCHAR U_7DAC +ENCODING 32172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +5540 +F280 +27E0 +5420 +EBC0 +0240 +5180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_7DAD +ENCODING 32173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2480 +57E0 +FC80 +27E0 +5480 +EC80 +07E0 +5480 +AFE0 +AC00 +ENDCHAR +STARTCHAR U_7DAE +ENCODING 32174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4A40 +7D80 +4640 +4520 +9F00 +0880 +3F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7DAF +ENCODING 32175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2FE0 +4420 +F7A0 +2A20 +5FA0 +F220 +0AA0 +5FA0 +A820 +A8C0 +ENDCHAR +STARTCHAR U_7DB0 +ENCODING 32176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F3C0 +2240 +53C0 +EA00 +03E0 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7DB1 +ENCODING 32177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +5560 +F4A0 +27E0 +54A0 +EEA0 +06A0 +57E0 +AC20 +A460 +ENDCHAR +STARTCHAR U_7DB2 +ENCODING 32178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +5560 +F4A0 +27E0 +54A0 +EFE0 +0520 +55E0 +AC20 +AC60 +ENDCHAR +STARTCHAR U_7DB3 +ENCODING 32179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4AA0 +FEE0 +2AA0 +2EE0 +4AA0 +FAA0 +0AA0 +AB60 +B620 +ENDCHAR +STARTCHAR U_7DB4 +ENCODING 32180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2120 +56C0 +F240 +25A0 +57E0 +E920 +06C0 +5240 +ADA0 +A920 +ENDCHAR +STARTCHAR U_7DB5 +ENCODING 32181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +5520 +F2C0 +2100 +57E0 +E900 +0380 +5540 +A920 +A920 +ENDCHAR +STARTCHAR U_7DB6 +ENCODING 32182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +4FC0 +F540 +17C0 +2100 +4FE0 +F900 +0380 +AD40 +A920 +ENDCHAR +STARTCHAR U_7DB7 +ENCODING 32183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5240 +F240 +25A0 +5420 +E880 +07E0 +5080 +A880 +A880 +ENDCHAR +STARTCHAR U_7DB8 +ENCODING 32184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +4BA0 +F000 +2FE0 +5AA0 +FAA0 +0FE0 +5AA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_7DB9 +ENCODING 32185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2740 +5560 +FD40 +2240 +55E0 +E800 +03E0 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7DBA +ENCODING 32186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5280 +F440 +2FE0 +5040 +EF40 +0540 +5740 +A840 +A8C0 +ENDCHAR +STARTCHAR U_7DBB +ENCODING 32187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F000 +27E0 +5080 +EA80 +02E0 +5280 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_7DBC +ENCODING 32188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5520 +F7E0 +2520 +57E0 +EA80 +07E0 +5080 +A880 +A880 +ENDCHAR +STARTCHAR U_7DBD +ENCODING 32189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +57C0 +F440 +27C0 +5440 +EFC0 +0100 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7DBE +ENCODING 32190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2440 +5A20 +EBC0 +0680 +5900 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DBF +ENCODING 32191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +F3C0 +2240 +53C0 +E900 +07E0 +5520 +AD60 +A900 +ENDCHAR +STARTCHAR U_7DC0 +ENCODING 32192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5140 +F7E0 +2140 +57C0 +E900 +07E0 +5240 +A980 +AE60 +ENDCHAR +STARTCHAR U_7DC1 +ENCODING 32193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +57C0 +F140 +2FE0 +5140 +EFC0 +0500 +55E0 +AB00 +A9E0 +ENDCHAR +STARTCHAR U_7DC2 +ENCODING 32194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22C0 +5480 +F140 +22A0 +5080 +EAA0 +04C0 +5080 +A940 +AE20 +ENDCHAR +STARTCHAR U_7DC3 +ENCODING 32195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5680 +E940 +2A20 +5500 +F5C0 +0500 +A500 +A700 +98E0 +ENDCHAR +STARTCHAR U_7DC4 +ENCODING 32196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5480 +ECA0 +07C0 +5480 +ADA0 +AE60 +ENDCHAR +STARTCHAR U_7DC5 +ENCODING 32197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +4A00 +9FE0 +EAA0 +2AA0 +5EA0 +FAA0 +0B40 +5EA0 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_7DC6 +ENCODING 32198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5200 +EFE0 +02A0 +5520 +AA20 +ACC0 +ENDCHAR +STARTCHAR U_7DC7 +ENCODING 32199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +5A80 +F540 +2540 +57E0 +ED20 +07E0 +5520 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_7DC8 +ENCODING 32200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +EFE0 +2280 +47C0 +F100 +0FE0 +A100 +A900 +8100 +ENDCHAR +STARTCHAR U_7DC9 +ENCODING 32201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4100 +FFE0 +2920 +5DA0 +FB60 +0DA0 +5920 +A920 +A860 +ENDCHAR +STARTCHAR U_7DCA +ENCODING 32202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A280 +F900 +A280 +FC40 +1100 +3E00 +1080 +7F80 +2500 +DCC0 +ENDCHAR +STARTCHAR U_7DCB +ENCODING 32203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +5EE0 +F280 +2EE0 +5280 +EA80 +0EE0 +5280 +AA80 +AA80 +ENDCHAR +STARTCHAR U_7DCC +ENCODING 32204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +5900 +FFE0 +2540 +5920 +EFE0 +0240 +5680 +A980 +AE60 +ENDCHAR +STARTCHAR U_7DCD +ENCODING 32205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2600 +5480 +F7E0 +2480 +5460 +F7C0 +0440 +57C0 +AC40 +AFC0 +ENDCHAR +STARTCHAR U_7DCE +ENCODING 32206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +4FE0 +F080 +2E80 +5AA0 +FEA0 +00C0 +56A0 +A960 +AA20 +ENDCHAR +STARTCHAR U_7DCF +ENCODING 32207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2480 +4440 +5520 +EA40 +27C0 +4000 +F440 +0AA0 +AA60 +A3C0 +ENDCHAR +STARTCHAR U_7DD0 +ENCODING 32208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +7B80 +8100 +7FC0 +5480 +FFE0 +4480 +55C0 +7EA0 +04A0 +1900 +ENDCHAR +STARTCHAR U_7DD1 +ENCODING 32209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4040 +97C0 +E040 +2FE0 +4920 +E540 +0380 +A540 +A920 +8300 +ENDCHAR +STARTCHAR U_7DD2 +ENCODING 32210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +5140 +FFE0 +2100 +53E0 +EE20 +03E0 +5220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_7DD3 +ENCODING 32211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +5280 +D100 +67C0 +5540 +F540 +0FE0 +0100 +A280 +AC60 +ENDCHAR +STARTCHAR U_7DD4 +ENCODING 32212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2520 +4540 +4100 +EFE0 +4820 +EBA0 +0AA0 +4AA0 +4BA0 +8860 +ENDCHAR +STARTCHAR U_7DD5 +ENCODING 32213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4280 +F100 +2EE0 +4440 +F7C0 +0440 +A7C0 +8440 +0840 +ENDCHAR +STARTCHAR U_7DD6 +ENCODING 32214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2240 +57C0 +F280 +2FE0 +F240 +07E0 +AC40 +B7C0 +8440 +07C0 +ENDCHAR +STARTCHAR U_7DD7 +ENCODING 32215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +25E0 +5F20 +F520 +25E0 +5720 +EDE0 +0520 +5520 +ADE0 +AD20 +ENDCHAR +STARTCHAR U_7DD8 +ENCODING 32216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +57E0 +F480 +2780 +54A0 +EFA0 +0540 +57A0 +A960 +AA20 +ENDCHAR +STARTCHAR U_7DD9 +ENCODING 32217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +5280 +F380 +2100 +57C0 +ED40 +07C0 +5900 +AFE0 +0100 +ENDCHAR +STARTCHAR U_7DDA +ENCODING 32218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5440 +F7C0 +2440 +57C0 +E920 +0740 +5380 +AD40 +AB20 +ENDCHAR +STARTCHAR U_7DDB +ENCODING 32219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +FAA0 +2AA0 +5AE0 +F100 +0FE0 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DDC +ENCODING 32220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF00 +8900 +FBC0 +8900 +FA40 +27E0 +F880 +AAC0 +B4A0 +2100 +ENDCHAR +STARTCHAR U_7DDD +ENCODING 32221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +53C0 +F000 +27E0 +5240 +EBC0 +0240 +53C0 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_7DDE +ENCODING 32222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26E0 +24A0 +54A0 +F700 +24E0 +57A0 +ECA0 +07A0 +5440 +ACA0 +AD20 +ENDCHAR +STARTCHAR U_7DDF +ENCODING 32223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +5FE0 +F540 +27C0 +5540 +EFC0 +0100 +57C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7DE0 +ENCODING 32224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5280 +FFE0 +2920 +57C0 +ED40 +0540 +5540 +ADC0 +A900 +ENDCHAR +STARTCHAR U_7DE1 +ENCODING 32225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F480 +27E0 +5440 +EFE0 +0240 +53C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_7DE2 +ENCODING 32226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +5FE0 +F240 +27E0 +54A0 +F4A0 +07E0 +54A0 +AFE0 +0420 +ENDCHAR +STARTCHAR U_7DE3 +ENCODING 32227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5780 +F080 +2FE0 +5520 +EAC0 +0580 +52C0 +ACA0 +0300 +ENDCHAR +STARTCHAR U_7DE4 +ENCODING 32228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +4540 +F5C0 +2400 +57E0 +F100 +0FE0 +5380 +B540 +0920 +ENDCHAR +STARTCHAR U_7DE5 +ENCODING 32229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +4A40 +5BC0 +E900 +2FE0 +5900 +FB80 +0D40 +5920 +A900 +ENDCHAR +STARTCHAR U_7DE6 +ENCODING 32230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +5520 +F7E0 +2520 +57E0 +E900 +02C0 +5620 +AA60 +A9C0 +ENDCHAR +STARTCHAR U_7DE7 +ENCODING 32231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +5FE0 +E280 +2FE0 +5AA0 +FCE0 +0820 +5FE0 +A820 +AFE0 +ENDCHAR +STARTCHAR U_7DE8 +ENCODING 32232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5820 +FFE0 +2800 +5FE0 +EAA0 +0FE0 +5AA0 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_7DE9 +ENCODING 32233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +5280 +F7E0 +2100 +5FE0 +EA00 +03E0 +5540 +A880 +AB60 +ENDCHAR +STARTCHAR U_7DEA +ENCODING 32234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +5480 +EEE0 +2520 +55A0 +F560 +06A0 +5440 +AC40 +07E0 +ENDCHAR +STARTCHAR U_7DEB +ENCODING 32235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5AA0 +E6A0 +2D20 +52E0 +F000 +0A40 +5520 +AC40 +13C0 +ENDCHAR +STARTCHAR U_7DEC +ENCODING 32236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2200 +5FE0 +EAA0 +2AA0 +5BA0 +FAA0 +0BA0 +5AA0 +AFE0 +A820 +ENDCHAR +STARTCHAR U_7DED +ENCODING 32237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +57E0 +F520 +27E0 +5240 +FBC0 +0240 +53C0 +AA40 +02C0 +ENDCHAR +STARTCHAR U_7DEE +ENCODING 32238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5400 +FBC0 +2240 +53C0 +EA40 +07C0 +5A40 +A980 +0660 +ENDCHAR +STARTCHAR U_7DEF +ENCODING 32239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5240 +FFE0 +2440 +57C0 +E880 +07E0 +5480 +AFE0 +A880 +ENDCHAR +STARTCHAR U_7DF0 +ENCODING 32240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +4BA0 +F000 +2EA0 +5AA0 +FEA0 +0AA0 +5EA0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_7DF1 +ENCODING 32241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2440 +57E0 +ED00 +25E0 +5680 +FC80 +07E0 +5480 +AD40 +A620 +ENDCHAR +STARTCHAR U_7DF2 +ENCODING 32242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +4A80 +5EC0 +EAA0 +2B80 +5EA0 +EAA0 +0A40 +5E80 +A900 +AA00 +ENDCHAR +STARTCHAR U_7DF3 +ENCODING 32243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5000 +7DE0 +50A0 +7D60 +5500 +4A80 +7FC0 +8A80 +B660 +ENDCHAR +STARTCHAR U_7DF4 +ENCODING 32244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7E0 +26A0 +5520 +EFE0 +0180 +5340 +AD20 +A920 +ENDCHAR +STARTCHAR U_7DF5 +ENCODING 32245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2AA0 +4920 +5AA0 +EFE0 +2440 +5A20 +F3C0 +0640 +5180 +AE60 +ENDCHAR +STARTCHAR U_7DF6 +ENCODING 32246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4880 +9BE0 +EAA0 +2BE0 +4AA0 +FBE0 +0A80 +5900 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7DF7 +ENCODING 32247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +5FE0 +E540 +27C0 +5540 +EFC0 +0100 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7DF8 +ENCODING 32248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +4280 +5FE0 +EAA0 +2FE0 +5100 +F7C0 +0100 +5100 +AFE0 +ENDCHAR +STARTCHAR U_7DF9 +ENCODING 32249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5000 +EFE0 +0480 +54E0 +AA80 +A9E0 +ENDCHAR +STARTCHAR U_7DFA +ENCODING 32250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +5740 +E540 +2FE0 +5820 +FBA0 +0AA0 +5BA0 +A820 +A860 +ENDCHAR +STARTCHAR U_7DFB +ENCODING 32251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +4480 +9AE0 +EFA0 +44A0 +94A0 +FEA0 +04A0 +5440 +AEA0 +A920 +ENDCHAR +STARTCHAR U_7DFC +ENCODING 32252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +E440 +27C0 +5000 +FFE0 +0AA0 +AAA0 +AAA0 +1FE0 +ENDCHAR +STARTCHAR U_7DFD +ENCODING 32253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +47E0 +F420 +27E0 +5420 +F7E0 +0420 +57E0 +5240 +8420 +ENDCHAR +STARTCHAR U_7DFE +ENCODING 32254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +5BE0 +EAA0 +2BE0 +5AA0 +FBE0 +0880 +ABE0 +A880 +13E0 +ENDCHAR +STARTCHAR U_7DFF +ENCODING 32255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +57C0 +F000 +27C0 +5440 +F7C0 +0200 +5560 +9440 +03C0 +ENDCHAR +STARTCHAR U_7E00 +ENCODING 32256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +2520 +4520 +5760 +E400 +27E0 +54A0 +FEA0 +0440 +54A0 +AD20 +ENDCHAR +STARTCHAR U_7E01 +ENCODING 32257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +57C0 +E040 +2FE0 +5300 +FDA0 +02C0 +ADC0 +D2A0 +0D80 +ENDCHAR +STARTCHAR U_7E02 +ENCODING 32258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +47C0 +5440 +E440 +27C0 +5200 +F540 +0C20 +5440 +ABC0 +ENDCHAR +STARTCHAR U_7E03 +ENCODING 32259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2920 +55C0 +F700 +29E0 +5240 +FBC0 +0240 +ABC0 +AA40 +02C0 +ENDCHAR +STARTCHAR U_7E04 +ENCODING 32260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +47E0 +5520 +E7E0 +2520 +57E0 +FD20 +07E0 +5100 +A8E0 +ENDCHAR +STARTCHAR U_7E05 +ENCODING 32261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +2FE0 +4880 +5FA0 +EAA0 +2FA0 +4AA0 +FD40 +0A40 +ADA0 +5120 +ENDCHAR +STARTCHAR U_7E06 +ENCODING 32262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +4800 +FBC0 +2E40 +4BC0 +FA40 +0BC0 +A800 +AFE0 +0800 +ENDCHAR +STARTCHAR U_7E07 +ENCODING 32263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4100 +4FE0 +A820 +E7C0 +4000 +97C0 +FC40 +07C0 +5440 +AFE0 +ENDCHAR +STARTCHAR U_7E08 +ENCODING 32264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5AE0 +9480 +2940 +FFE0 +8520 +3E00 +1080 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7E09 +ENCODING 32265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +5AA0 +F6C0 +2FE0 +5000 +EFC0 +0440 +57C0 +AC40 +AFC0 +ENDCHAR +STARTCHAR U_7E0A +ENCODING 32266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +57E0 +F280 +2440 +5820 +EFC0 +0540 +5540 +AD40 +AFE0 +ENDCHAR +STARTCHAR U_7E0B +ENCODING 32267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +5520 +F1E0 +2500 +55E0 +ED20 +0520 +55E0 +AA00 +A9E0 +ENDCHAR +STARTCHAR U_7E0C +ENCODING 32268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5220 +4940 +8BE0 +E080 +3AA0 +4AA0 +EBE0 +0880 +5880 +A500 +ABE0 +ENDCHAR +STARTCHAR U_7E0D +ENCODING 32269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +8240 +FFE0 +2920 +5FE0 +F200 +03C0 +5240 +AC40 +A980 +ENDCHAR +STARTCHAR U_7E0E +ENCODING 32270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +5740 +F540 +2FE0 +5440 +EFC0 +0440 +57C0 +AC40 +ACC0 +ENDCHAR +STARTCHAR U_7E0F +ENCODING 32271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA60 +AFC0 +FA40 +A980 +AA60 +3F00 +1480 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_7E10 +ENCODING 32272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +56A0 +F3E0 +22A0 +53C0 +ED20 +0560 +57E0 +A920 +AE40 +ENDCHAR +STARTCHAR U_7E11 +ENCODING 32273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5FE0 +9500 +EFC0 +2540 +5FE0 +F540 +0FC0 +5580 +AD40 +B520 +ENDCHAR +STARTCHAR U_7E12 +ENCODING 32274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +5FE0 +F100 +27C0 +5100 +EFE0 +0200 +57C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7E13 +ENCODING 32275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +4BE0 +FA20 +2BE0 +5A20 +FBE0 +0880 +59C0 +AAA0 +ADA0 +ENDCHAR +STARTCHAR U_7E14 +ENCODING 32276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +5180 +FEE0 +2AA0 +5440 +EAA0 +0FE0 +5100 +AD40 +A920 +ENDCHAR +STARTCHAR U_7E15 +ENCODING 32277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +5540 +F6C0 +27C0 +5000 +FFE0 +0AA0 +5AA0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_7E16 +ENCODING 32278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +FFE0 +2100 +57C0 +F100 +0FE0 +5440 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_7E17 +ENCODING 32279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5000 +F3C0 +2240 +57E0 +EA40 +03C0 +56A0 +AB40 +AA20 +ENDCHAR +STARTCHAR U_7E18 +ENCODING 32280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2E40 +4A80 +5500 +EFC0 +4400 +EFC0 +0200 +BFE0 +8480 +1860 +ENDCHAR +STARTCHAR U_7E19 +ENCODING 32281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +4FE0 +F440 +27C0 +5440 +F7C0 +0440 +AFE0 +A040 +ENDCHAR +STARTCHAR U_7E1A +ENCODING 32282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +5520 +F2C0 +2200 +54E0 +EC20 +0760 +5420 +AC20 +AFE0 +ENDCHAR +STARTCHAR U_7E1B +ENCODING 32283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +4FE0 +5520 +E7E0 +2520 +57E0 +F520 +0040 +5FE0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7E1C +ENCODING 32284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +4FE0 +F420 +27E0 +5420 +FFE0 +0420 +57E0 +A940 +AE20 +ENDCHAR +STARTCHAR U_7E1D +ENCODING 32285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5440 +F7C0 +2440 +5740 +EDC0 +0440 +57E0 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7E1E +ENCODING 32286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5240 +F3C0 +2000 +5FE0 +E820 +0BA0 +5AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_7E1F +ENCODING 32287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +F800 +2FE0 +5AA0 +FB40 +2840 +57E0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_7E20 +ENCODING 32288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FE60 +AA00 +73E0 +1540 +7F40 +1080 +5540 +9220 +ENDCHAR +STARTCHAR U_7E21 +ENCODING 32289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +FFE0 +2440 +5280 +FFE0 +0100 +57C0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E22 +ENCODING 32290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +AA80 +BFE0 +E400 +BFE0 +AAC0 +F520 +AFE0 +A580 +A940 +B320 +ENDCHAR +STARTCHAR U_7E23 +ENCODING 32291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +7920 +4BC0 +7880 +4920 +FFE0 +1080 +5AC0 +94A0 +3180 +ENDCHAR +STARTCHAR U_7E24 +ENCODING 32292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +47C0 +F100 +2FE0 +4280 +FD40 +07A0 +5140 +AD20 +AB20 +ENDCHAR +STARTCHAR U_7E25 +ENCODING 32293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +FFE0 +2440 +4FA0 +F100 +07E0 +AB80 +A540 +0920 +ENDCHAR +STARTCHAR U_7E26 +ENCODING 32294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2620 +2520 +4840 +F3E0 +4480 +AA80 +FAE0 +0A80 +AA80 +AD80 +8C60 +ENDCHAR +STARTCHAR U_7E27 +ENCODING 32295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +25E0 +5540 +EA80 +2B40 +5AA0 +FBE0 +0880 +AAC0 +AAA0 +8DA0 +ENDCHAR +STARTCHAR U_7E28 +ENCODING 32296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +5540 +F380 +0FE0 +B280 +A4A0 +08E0 +ENDCHAR +STARTCHAR U_7E29 +ENCODING 32297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +49A0 +F640 +2420 +5BC0 +F000 +0FE0 +A100 +A540 +0B20 +ENDCHAR +STARTCHAR U_7E2A +ENCODING 32298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +47C0 +F540 +27C0 +5540 +FFE0 +0540 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E2B +ENCODING 32299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +25E0 +5140 +E280 +2D40 +57E0 +FC80 +07E0 +5480 +AC80 +ABE0 +ENDCHAR +STARTCHAR U_7E2C +ENCODING 32300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +4FE0 +FA80 +2B80 +4AA0 +FFA0 +0AC0 +AFA0 +AA60 +9420 +ENDCHAR +STARTCHAR U_7E2D +ENCODING 32301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5280 +E920 +2AA0 +5FE0 +F100 +0FE0 +5AA0 +AFA0 +A860 +ENDCHAR +STARTCHAR U_7E2E +ENCODING 32302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4420 +FBE0 +2480 +5DE0 +F520 +05E0 +5520 +ADE0 +A520 +ENDCHAR +STARTCHAR U_7E2F +ENCODING 32303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +F7E0 +2100 +57C0 +ED40 +07C0 +5540 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E30 +ENCODING 32304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4A80 +92E0 +F680 +23E0 +5880 +FA80 +2AE0 +5A80 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_7E31 +ENCODING 32305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +4940 +96A0 +E800 +2880 +4A80 +FAE0 +2A80 +5A80 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_7E32 +ENCODING 32306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +57E0 +E4A0 +27E0 +4140 +F2A0 +0FE0 +5100 +AD40 +AB20 +ENDCHAR +STARTCHAR U_7E33 +ENCODING 32307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5540 +F7C0 +2540 +57C0 +E920 +07E0 +5480 +AA80 +A900 +ENDCHAR +STARTCHAR U_7E34 +ENCODING 32308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4280 +FFE0 +2AA0 +57C0 +F500 +07C0 +5900 +AFE0 +A900 +ENDCHAR +STARTCHAR U_7E35 +ENCODING 32309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +F440 +2FE0 +5AA0 +FFE0 +0440 +5280 +A900 +AEE0 +ENDCHAR +STARTCHAR U_7E36 +ENCODING 32310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5140 +FB40 +22E0 +FD20 +2A00 +1480 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_7E37 +ENCODING 32311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4540 +FFE0 +2540 +5FE0 +F920 +0FE0 +5480 +AB80 +AE60 +ENDCHAR +STARTCHAR U_7E38 +ENCODING 32312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4280 +F7C0 +2440 +57C0 +F440 +0FE0 +5100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_7E39 +ENCODING 32313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +FAA0 +2FE0 +4000 +F7C0 +0000 +5FE0 +A540 +AB20 +ENDCHAR +STARTCHAR U_7E3A +ENCODING 32314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +4FE0 +82A0 +FBE0 +2AA0 +4BE0 +F880 +0BE0 +5880 +A880 +A7E0 +ENDCHAR +STARTCHAR U_7E3B +ENCODING 32315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +4A80 +4540 +5FA0 +4A80 +B660 +ENDCHAR +STARTCHAR U_7E3C +ENCODING 32316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +4900 +BDE0 +D200 +5DE0 +B440 +F540 +1560 +D540 +B6C0 +AE60 +ENDCHAR +STARTCHAR U_7E3D +ENCODING 32317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5560 +F6A0 +2520 +56A0 +EFE0 +0140 +56A0 +AA60 +A9C0 +ENDCHAR +STARTCHAR U_7E3E +ENCODING 32318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7C0 +2100 +5FE0 +EC40 +07C0 +5440 +A7C0 +AC60 +ENDCHAR +STARTCHAR U_7E3F +ENCODING 32319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +5440 +EAA0 +2FE0 +5240 +FD20 +0280 +A940 +A880 +0300 +ENDCHAR +STARTCHAR U_7E40 +ENCODING 32320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +24A0 +57E0 +F280 +27E0 +5480 +EFE0 +0480 +57E0 +AC80 +A7E0 +ENDCHAR +STARTCHAR U_7E41 +ENCODING 32321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +D540 +7E80 +5540 +7A20 +1F00 +0880 +7F40 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E42 +ENCODING 32322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4920 +F6C0 +2300 +5540 +FBA0 +0100 +57E0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E43 +ENCODING 32323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2920 +4FE0 +F000 +2EE0 +5AA0 +FEE0 +0AA0 +5EE0 +AAA0 +B760 +ENDCHAR +STARTCHAR U_7E44 +ENCODING 32324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9140 +FA20 +93E0 +A940 +FC80 +0B60 +1480 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E45 +ENCODING 32325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +5540 +F7C0 +2540 +57C0 +ED40 +0FE0 +5380 +AD40 +A920 +ENDCHAR +STARTCHAR U_7E46 +ENCODING 32326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +4360 +FDA0 +2120 +46C0 +FAA0 +0500 +5240 +A880 +AF00 +ENDCHAR +STARTCHAR U_7E47 +ENCODING 32327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C60 +E780 +A880 +5140 +4380 +7D40 +93E0 +FC80 +55C0 +56A0 +7D80 +ENDCHAR +STARTCHAR U_7E48 +ENCODING 32328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +4520 +A7E0 +DC80 +53E0 +BEA0 +F6A0 +07E0 +D480 +B4A0 +8BE0 +ENDCHAR +STARTCHAR U_7E49 +ENCODING 32329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +F440 +27C0 +52A0 +EEC0 +0280 +56C0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_7E4A +ENCODING 32330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EC0 +44A0 +FFE0 +2A80 +4AA0 +FBA0 +0AC0 +ABA0 +BD60 +0220 +ENDCHAR +STARTCHAR U_7E4B +ENCODING 32331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +AC20 +FBC0 +AA40 +FD80 +2A60 +1500 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E4C +ENCODING 32332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4D60 +F4A0 +27E0 +5240 +FD20 +03C0 +5540 +A880 +AF60 +ENDCHAR +STARTCHAR U_7E4D +ENCODING 32333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5140 +FFE0 +2540 +57E0 +F560 +05A0 +AFE0 +A5A0 +8960 +ENDCHAR +STARTCHAR U_7E4E +ENCODING 32334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +4AA0 +FFE0 +2A80 +5680 +F540 +0A20 +A000 +AAA0 +12A0 +ENDCHAR +STARTCHAR U_7E4F +ENCODING 32335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +E880 +2EE0 +5480 +FFC0 +0480 +AFE0 +A480 +0860 +ENDCHAR +STARTCHAR U_7E50 +ENCODING 32336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4540 +F7C0 +2540 +57C0 +F140 +0FA0 +5240 +AEA0 +AB80 +ENDCHAR +STARTCHAR U_7E51 +ENCODING 32337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2100 +4FE0 +F440 +2BA0 +5280 +FFE0 +0AA0 +5BA0 +A820 +A860 +ENDCHAR +STARTCHAR U_7E52 +ENCODING 32338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +FAA0 +2FE0 +5820 +F7C0 +0440 +57C0 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_7E53 +ENCODING 32339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +F440 +2FE0 +5A00 +FEE0 +0AA0 +5EA0 +AB40 +AEA0 +ENDCHAR +STARTCHAR U_7E54 +ENCODING 32340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +2FA0 +4A80 +EFE0 +2080 +5EA0 +FAA0 +0EC0 +5A40 +AEE0 +A120 +ENDCHAR +STARTCHAR U_7E55 +ENCODING 32341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4100 +F7C0 +2100 +5FE0 +F280 +0FE0 +B440 +AC40 +07C0 +ENDCHAR +STARTCHAR U_7E56 +ENCODING 32342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5F80 +8AE0 +FFA0 +40A0 +AEA0 +FAA0 +0EA0 +AA40 +AEA0 +0B20 +ENDCHAR +STARTCHAR U_7E57 +ENCODING 32343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4FE0 +F540 +2920 +5440 +F7E0 +0A40 +5740 +A5E0 +A840 +ENDCHAR +STARTCHAR U_7E58 +ENCODING 32344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +4FE0 +F540 +2900 +5FE0 +FAA0 +2FE0 +5AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_7E59 +ENCODING 32345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +5540 +EFE0 +2540 +4920 +FFE0 +0520 +B7E0 +AD20 +07E0 +ENDCHAR +STARTCHAR U_7E5A +ENCODING 32346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5FE0 +8AA0 +F7C0 +2C60 +57C0 +F440 +07C0 +5540 +A920 +AB20 +ENDCHAR +STARTCHAR U_7E5B +ENCODING 32347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7CE0 +1080 +FFE0 +2A20 +73E0 +2A20 +FFE0 +5480 +93E0 +3080 +ENDCHAR +STARTCHAR U_7E5C +ENCODING 32348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +5FE0 +EAA0 +2FE0 +5820 +FFE0 +0040 +AFE0 +A440 +02C0 +ENDCHAR +STARTCHAR U_7E5D +ENCODING 32349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EE0 +FAA0 +2FE0 +5AA0 +FBA0 +0AA0 +ABA0 +ACA0 +0860 +ENDCHAR +STARTCHAR U_7E5E +ENCODING 32350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +EFE0 +2440 +5EE0 +F440 +07E0 +5280 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_7E5F +ENCODING 32351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4FE0 +F540 +27C0 +5540 +F7C0 +0100 +B7E0 +A900 +0100 +ENDCHAR +STARTCHAR U_7E60 +ENCODING 32352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5480 +5140 +9F00 +52A0 +CE40 +79C0 +0A00 +1480 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E61 +ENCODING 32353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +5140 +E7E0 +2140 +57C0 +FD20 +07E0 +AD20 +B7E0 +8920 +ENDCHAR +STARTCHAR U_7E62 +ENCODING 32354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +47C0 +9540 +EFE0 +2440 +57C0 +EC40 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E63 +ENCODING 32355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +4FE0 +F140 +27E0 +5100 +FFE0 +2540 +57C0 +A540 +AFE0 +ENDCHAR +STARTCHAR U_7E64 +ENCODING 32356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +FFE0 +2A80 +D560 +3F80 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E65 +ENCODING 32357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4100 +97C0 +E440 +57C0 +F280 +0FE0 +A7C0 +A440 +07C0 +ENDCHAR +STARTCHAR U_7E66 +ENCODING 32358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3DE0 +4520 +BDE0 +D080 +5FE0 +A6A0 +E7E0 +0480 +B4A0 +ABE0 +ENDCHAR +STARTCHAR U_7E67 +ENCODING 32359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4FE0 +5920 +E540 +2920 +57C0 +F000 +0FE0 +B240 +AFE0 +ENDCHAR +STARTCHAR U_7E68 +ENCODING 32360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25C0 +5480 +F3E0 +2D40 +5480 +F7E0 +0480 +57E0 +AC80 +ABE0 +ENDCHAR +STARTCHAR U_7E69 +ENCODING 32361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4EE0 +F280 +2EE0 +5AA0 +FEE0 +0AA0 +5EE0 +AA80 +A9E0 +ENDCHAR +STARTCHAR U_7E6A +ENCODING 32362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +47C0 +F820 +2FE0 +4AA0 +FFE0 +0440 +57C0 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_7E6B +ENCODING 32363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +5460 +FFC0 +5540 +7C80 +1260 +2480 +7F40 +2280 +CE60 +ENDCHAR +STARTCHAR U_7E6C +ENCODING 32364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5540 +FBA0 +2FE0 +5000 +F7E0 +0420 +57A0 +96A0 +07E0 +ENDCHAR +STARTCHAR U_7E6D +ENCODING 32365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFE0 +9520 +A7E0 +FD60 +97E0 +A520 +FD60 +AFA0 +D420 +ENDCHAR +STARTCHAR U_7E6E +ENCODING 32366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +47C0 +F540 +27C0 +5000 +FFE0 +0540 +A7C0 +A540 +0FE0 +ENDCHAR +STARTCHAR U_7E6F +ENCODING 32367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +5FE0 +F000 +2FE0 +5440 +EFC0 +02A0 +56C0 +AA40 +AB20 +ENDCHAR +STARTCHAR U_7E70 +ENCODING 32368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4440 +FFE0 +2AA0 +5EE0 +F100 +0FE0 +5580 +A940 +A920 +ENDCHAR +STARTCHAR U_7E71 +ENCODING 32369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +2480 +57C0 +FAC0 +2540 +4240 +F580 +0E40 +ACA0 +B380 +ENDCHAR +STARTCHAR U_7E72 +ENCODING 32370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4EA0 +9520 +FF40 +5540 +9FE0 +F540 +1FE0 +5540 +B540 +A340 +ENDCHAR +STARTCHAR U_7E73 +ENCODING 32371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4E80 +AAE0 +EFA0 +4AA0 +AFA0 +F4A0 +1F40 +AA40 +AAA0 +16A0 +ENDCHAR +STARTCHAR U_7E74 +ENCODING 32372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +43E0 +7880 +ABE0 +3E80 +1500 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E75 +ENCODING 32373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9B40 +E840 +2FC0 +5000 +F7C0 +0440 +57C0 +AC40 +AFE0 +ENDCHAR +STARTCHAR U_7E76 +ENCODING 32374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4280 +FFE0 +2440 +57C0 +F440 +07C0 +5540 +AAA0 +ABA0 +ENDCHAR +STARTCHAR U_7E77 +ENCODING 32375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +4AA0 +FFE0 +2AA0 +4FE0 +F800 +0FE0 +5AA0 +AA40 +AB20 +ENDCHAR +STARTCHAR U_7E78 +ENCODING 32376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2BE0 +5480 +E5A0 +22A0 +4DC0 +F6A0 +05A0 +5680 +AD80 +ABE0 +ENDCHAR +STARTCHAR U_7E79 +ENCODING 32377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +8FE0 +F100 +27C0 +4100 +FFE0 +0280 +5FE0 +A900 +A900 +ENDCHAR +STARTCHAR U_7E7A +ENCODING 32378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +4E80 +94E0 +EFA0 +42A0 +AF40 +F2C0 +0F20 +5000 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_7E7B +ENCODING 32379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +8FE0 +FBA0 +2540 +5FE0 +F100 +0FE0 +5AA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_7E7C +ENCODING 32380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4DA0 +8A40 +FDA0 +2800 +4FE0 +FA40 +0DA0 +5A40 +ADA0 +AFE0 +ENDCHAR +STARTCHAR U_7E7D +ENCODING 32381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +8820 +F780 +2540 +5BC0 +FC40 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E7E +ENCODING 32382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +4BE0 +92A0 +E7E0 +3D40 +5540 +F5E0 +0520 +55E0 +AA00 +A9E0 +ENDCHAR +STARTCHAR U_7E7F +ENCODING 32383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +2540 +4760 +9540 +E7A0 +4720 +F000 +0FE0 +AAA0 +AAA0 +1FE0 +ENDCHAR +STARTCHAR U_7E80 +ENCODING 32384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4560 +4B40 +9FE0 +E940 +2BE0 +4880 +FBC0 +0880 +5FE0 +A940 +AE20 +ENDCHAR +STARTCHAR U_7E81 +ENCODING 32385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +9FE0 +EAA0 +2FE0 +5100 +F7C0 +0100 +5FE0 +A540 +AAA0 +ENDCHAR +STARTCHAR U_7E82 +ENCODING 32386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9480 +3F80 +2480 +FFE0 +4A40 +9520 +7FC0 +2480 +4C40 +ENDCHAR +STARTCHAR U_7E83 +ENCODING 32387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5280 +FD60 +2540 +4960 +F440 +07C0 +A440 +A7C0 +0840 +ENDCHAR +STARTCHAR U_7E84 +ENCODING 32388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +5FE0 +A480 +E7C0 +5280 +A900 +FEE0 +0900 +AFE0 +A900 +97E0 +ENDCHAR +STARTCHAR U_7E85 +ENCODING 32389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4BA0 +AAE0 +E7C0 +4AA0 +AFE0 +E100 +0FE0 +A540 +A520 +8920 +ENDCHAR +STARTCHAR U_7E86 +ENCODING 32390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +9FE0 +E100 +27C0 +5100 +FFE0 +0AA0 +5FE0 +A100 +AFE0 +ENDCHAR +STARTCHAR U_7E87 +ENCODING 32391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +95E0 +5880 +FFE0 +5520 +93E0 +7920 +25E0 +FF20 +11E0 +5540 +B620 +ENDCHAR +STARTCHAR U_7E88 +ENCODING 32392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4480 +9FE0 +E520 +2FE0 +5120 +FFE0 +2B20 +5BE0 +AE40 +A0A0 +ENDCHAR +STARTCHAR U_7E89 +ENCODING 32393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +4FE0 +E440 +3FE0 +4AA0 +A7C0 +F440 +07C0 +A440 +A7C0 +0C60 +ENDCHAR +STARTCHAR U_7E8A +ENCODING 32394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9A40 +EFE0 +2A40 +5FE0 +F940 +0FC0 +5940 +A7C0 +AC60 +ENDCHAR +STARTCHAR U_7E8B +ENCODING 32395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4440 +97C0 +E440 +4FE0 +9B20 +F640 +0BA0 +5640 +A980 +AE60 +ENDCHAR +STARTCHAR U_7E8C +ENCODING 32396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9100 +EFE0 +2AA0 +5FE0 +F440 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E8D +ENCODING 32397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +1480 +7FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_7E8E +ENCODING 32398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24C0 +5EA0 +8480 +FFE0 +4540 +ADC0 +E560 +0DE0 +A540 +AEA0 +0120 +ENDCHAR +STARTCHAR U_7E8F +ENCODING 32399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9940 +EFC0 +4940 +8FE0 +FA40 +2D20 +57E0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_7E90 +ENCODING 32400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +5E80 +8DE0 +F320 +55E0 +9520 +E9E0 +0920 +B5E0 +A2A0 +0120 +ENDCHAR +STARTCHAR U_7E91 +ENCODING 32401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +9FE0 +E920 +2FC0 +5920 +EBE0 +0AA0 +5FE0 +A540 +AFE0 +ENDCHAR +STARTCHAR U_7E92 +ENCODING 32402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4800 +8BE0 +EAA0 +2BE0 +4AA0 +EBE0 +0940 +ABE0 +A880 +13E0 +ENDCHAR +STARTCHAR U_7E93 +ENCODING 32403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +9EE0 +EAA0 +4EE0 +AA40 +F1A0 +07E0 +AA40 +A980 +0660 +ENDCHAR +STARTCHAR U_7E94 +ENCODING 32404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4880 +5FC0 +E840 +2FC0 +5920 +F7E0 +0940 +BFC0 +A520 +09E0 +ENDCHAR +STARTCHAR U_7E95 +ENCODING 32405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +9AA0 +EEE0 +2480 +5FE0 +E480 +0FE0 +5CA0 +A640 +A420 +ENDCHAR +STARTCHAR U_7E96 +ENCODING 32406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +45A0 +9FE0 +EA80 +5BA0 +8AA0 +FBC0 +2A80 +4AA0 +BF60 +A020 +ENDCHAR +STARTCHAR U_7E97 +ENCODING 32407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4FE0 +9900 +EFE0 +2900 +5FE0 +E900 +0FE0 +5AA0 +AEE0 +ABA0 +ENDCHAR +STARTCHAR U_7E98 +ENCODING 32408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +4FE0 +9A40 +EFE0 +4960 +97C0 +F440 +07C0 +5440 +AFC0 +AC60 +ENDCHAR +STARTCHAR U_7E99 +ENCODING 32409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +AFE0 +E540 +4BE0 +A540 +FBE0 +0F40 +A1E0 +AB40 +81E0 +ENDCHAR +STARTCHAR U_7E9A +ENCODING 32410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4000 +8FE0 +FAA0 +2FE0 +5AA0 +FFE0 +0480 +57C0 +AC80 +A6E0 +ENDCHAR +STARTCHAR U_7E9B +ENCODING 32411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2480 +FFE0 +2480 +FFC0 +6940 +5BE0 +FDC0 +AAA0 +ENDCHAR +STARTCHAR U_7E9C +ENCODING 32412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2AE0 +5F40 +EAE0 +2FE0 +5440 +F7C0 +0440 +57C0 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_7E9D +ENCODING 32413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4540 +87C0 +ED60 +4AA0 +8FE0 +E100 +07C0 +A280 +AFE0 +0540 +ENDCHAR +STARTCHAR U_7E9E +ENCODING 32414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +4BC0 +9C60 +EBA0 +5C20 +93E0 +F6A0 +03A0 +AA00 +AAA0 +11C0 +ENDCHAR +STARTCHAR U_7E9F +ENCODING 32415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 4 10 0 0 +BITMAP +20 +20 +40 +F0 +20 +40 +F0 +00 +30 +C0 +ENDCHAR +STARTCHAR U_7EA0 +ENCODING 32416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2040 +2240 +4A40 +5240 +E240 +2240 +42C0 +F340 +0A40 +3040 +C040 +ENDCHAR +STARTCHAR U_7EA1 +ENCODING 32417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4080 +F080 +2FE0 +4080 +F080 +0080 +3080 +C080 +0380 +ENDCHAR +STARTCHAR U_7EA2 +ENCODING 32418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4100 +5100 +E100 +2100 +4100 +F100 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_7EA3 +ENCODING 32419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2040 +4840 +F7E0 +2040 +4440 +F240 +0240 +3040 +C040 +00C0 +ENDCHAR +STARTCHAR U_7EA4 +ENCODING 32420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +4900 +5100 +E100 +2FE0 +4100 +F100 +0900 +3100 +C100 +ENDCHAR +STARTCHAR U_7EA5 +ENCODING 32421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4BE0 +5400 +E3C0 +2040 +4080 +F100 +0A20 +3220 +C1E0 +ENDCHAR +STARTCHAR U_7EA6 +ENCODING 32422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4BE0 +5420 +E020 +2220 +4120 +F120 +0820 +3120 +C0C0 +ENDCHAR +STARTCHAR U_7EA7 +ENCODING 32423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2240 +4A40 +5280 +E2E0 +2220 +4220 +F540 +0C80 +3540 +CA20 +ENDCHAR +STARTCHAR U_7EA8 +ENCODING 32424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +47C0 +5140 +E540 +2340 +4140 +F2C0 +0A40 +3460 +C820 +ENDCHAR +STARTCHAR U_7EA9 +ENCODING 32425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +4FE0 +5400 +E400 +2400 +4400 +F400 +0400 +3400 +C800 +ENDCHAR +STARTCHAR U_7EAA +ENCODING 32426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4040 +F040 +2040 +47C0 +F400 +0400 +3420 +C420 +03E0 +ENDCHAR +STARTCHAR U_7EAB +ENCODING 32427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +20A0 +48A0 +52A0 +E2A0 +24A0 +40A0 +F0A0 +0920 +32A0 +C440 +ENDCHAR +STARTCHAR U_7EAC +ENCODING 32428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4900 +57C0 +E100 +2FE0 +4120 +F120 +0960 +3100 +C100 +ENDCHAR +STARTCHAR U_7EAD +ENCODING 32429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +4800 +5000 +EFE0 +2100 +4100 +F200 +0C40 +37A0 +C420 +ENDCHAR +STARTCHAR U_7EAE +ENCODING 32430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4100 +57E0 +E200 +2280 +4480 +F500 +0940 +2A20 +D3E0 +ENDCHAR +STARTCHAR U_7EAF +ENCODING 32431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +5100 +E540 +2540 +47C0 +F100 +0920 +3120 +C0E0 +ENDCHAR +STARTCHAR U_7EB0 +ENCODING 32432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4C80 +54A0 +E7C0 +2480 +4480 +F480 +0DA0 +36A0 +C460 +ENDCHAR +STARTCHAR U_7EB1 +ENCODING 32433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4540 +5520 +E520 +2900 +4120 +F040 +0080 +3300 +CC00 +ENDCHAR +STARTCHAR U_7EB2 +ENCODING 32434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +4E60 +5560 +E4A0 +24A0 +4560 +F620 +0C20 +3420 +C460 +ENDCHAR +STARTCHAR U_7EB3 +ENCODING 32435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5520 +E520 +25A0 +4560 +F620 +0C20 +3420 +C4E0 +ENDCHAR +STARTCHAR U_7EB4 +ENCODING 32436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +20C0 +4700 +5100 +E100 +2FE0 +4100 +F100 +0100 +3100 +C7C0 +ENDCHAR +STARTCHAR U_7EB5 +ENCODING 32437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +4480 +5480 +E480 +2680 +4580 +F880 +0940 +3220 +C420 +ENDCHAR +STARTCHAR U_7EB6 +ENCODING 32438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +4C40 +5020 +E200 +2240 +4280 +F300 +0A20 +3220 +C1E0 +ENDCHAR +STARTCHAR U_7EB7 +ENCODING 32439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +4240 +5440 +E820 +27C0 +4240 +E240 +0A40 +3440 +C8C0 +ENDCHAR +STARTCHAR U_7EB8 +ENCODING 32440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +4C80 +5480 +E7E0 +2480 +4480 +F4A0 +0DA0 +3660 +C420 +ENDCHAR +STARTCHAR U_7EB9 +ENCODING 32441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5440 +E440 +2280 +4280 +F100 +0A80 +3440 +C820 +ENDCHAR +STARTCHAR U_7EBA +ENCODING 32442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5200 +E3C0 +2240 +4240 +F240 +0A40 +3540 +C880 +ENDCHAR +STARTCHAR U_7EBB +ENCODING 32443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +47E0 +5420 +E840 +2000 +4000 +F000 +0000 +3000 +C7E0 +ENDCHAR +STARTCHAR U_7EBC +ENCODING 32444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27A0 +20A0 +40A0 +57A0 +E420 +2420 +47A0 +F0A0 +00A0 +3520 +C220 +ENDCHAR +STARTCHAR U_7EBD +ENCODING 32445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4A40 +5240 +E240 +27C0 +4240 +F240 +0A40 +3240 +CFE0 +ENDCHAR +STARTCHAR U_7EBE +ENCODING 32446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2240 +4980 +5080 +EFE0 +20A0 +40C0 +F080 +0880 +3080 +C380 +ENDCHAR +STARTCHAR U_7EBF +ENCODING 32447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +43C0 +4E00 +E3E0 +2E00 +4240 +F280 +0920 +32A0 +CC60 +ENDCHAR +STARTCHAR U_7EC0 +ENCODING 32448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +4FE0 +5240 +E240 +23C0 +4240 +F240 +0A40 +33C0 +C240 +ENDCHAR +STARTCHAR U_7EC1 +ENCODING 32449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2540 +4540 +5FE0 +E540 +2540 +45C0 +F540 +0C00 +3400 +C7E0 +ENDCHAR +STARTCHAR U_7EC2 +ENCODING 32450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +4FE0 +5200 +E3E0 +2240 +4240 +F540 +0880 +3140 +C620 +ENDCHAR +STARTCHAR U_7EC3 +ENCODING 32451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4A00 +5780 +E480 +27E0 +4080 +F2C0 +0CA0 +34A0 +C180 +ENDCHAR +STARTCHAR U_7EC4 +ENCODING 32452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +4440 +5440 +E7C0 +2440 +4440 +F7C0 +0440 +3440 +CFE0 +ENDCHAR +STARTCHAR U_7EC5 +ENCODING 32453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +47E0 +5520 +E7E0 +2520 +4520 +F7E0 +0900 +3100 +C100 +ENDCHAR +STARTCHAR U_7EC6 +ENCODING 32454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +44A0 +54A0 +E4A0 +27E0 +44A0 +F4A0 +04A0 +37E0 +C420 +ENDCHAR +STARTCHAR U_7EC7 +ENCODING 32455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4C40 +5440 +E440 +27C0 +4000 +F280 +0240 +3420 +C820 +ENDCHAR +STARTCHAR U_7EC8 +ENCODING 32456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +5440 +EA80 +2100 +4280 +EC60 +0100 +30C0 +C300 +00C0 +ENDCHAR +STARTCHAR U_7EC9 +ENCODING 32457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4480 +5100 +E7E0 +2020 +43E0 +F020 +0020 +37E0 +C020 +ENDCHAR +STARTCHAR U_7ECA +ENCODING 32458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2920 +4540 +5100 +E7C0 +2100 +5100 +EFE0 +0100 +3100 +C100 +ENDCHAR +STARTCHAR U_7ECB +ENCODING 32459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +4FE0 +52A0 +EFE0 +2A80 +4FE0 +F2A0 +0AE0 +3480 +C880 +ENDCHAR +STARTCHAR U_7ECC +ENCODING 32460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +4540 +5540 +E7C0 +2540 +4100 +F520 +0D20 +37E0 +C420 +ENDCHAR +STARTCHAR U_7ECD +ENCODING 32461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +4920 +5220 +E2A0 +2440 +4BE0 +F220 +0A20 +33E0 +C220 +ENDCHAR +STARTCHAR U_7ECE +ENCODING 32462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2280 +4100 +5280 +EC60 +2100 +47C0 +F100 +0FE0 +3100 +C100 +ENDCHAR +STARTCHAR U_7ECF +ENCODING 32463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2080 +4900 +5280 +E440 +2820 +47C0 +F100 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_7ED0 +ENCODING 32464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4A00 +5440 +EFA0 +2000 +47C0 +F440 +0C40 +37C0 +C440 +ENDCHAR +STARTCHAR U_7ED1 +ENCODING 32465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +4FA0 +54C0 +EEA0 +24A0 +4FA0 +F4E0 +0480 +3880 +C080 +ENDCHAR +STARTCHAR U_7ED2 +ENCODING 32466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2120 +4FE0 +5500 +E520 +2F20 +4540 +F480 +04A0 +3560 +CA20 +ENDCHAR +STARTCHAR U_7ED3 +ENCODING 32467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5100 +E7C0 +2000 +47C0 +F440 +0C40 +37C0 +C440 +ENDCHAR +STARTCHAR U_7ED4 +ENCODING 32468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4FE0 +5280 +E7C0 +2820 +57E0 +F200 +03C0 +3040 +C180 +ENDCHAR +STARTCHAR U_7ED5 +ENCODING 32469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +4FE0 +5240 +E380 +2EA0 +5060 +E7C0 +0280 +32A0 +CCE0 +ENDCHAR +STARTCHAR U_7ED6 +ENCODING 32470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4200 +5440 +EFE0 +2120 +4100 +F7C0 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_7ED7 +ENCODING 32471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2400 +4800 +5200 +E5E0 +2C40 +4440 +F440 +0440 +3440 +C4C0 +ENDCHAR +STARTCHAR U_7ED8 +ENCODING 32472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4280 +5440 +EBA0 +2000 +57E0 +E100 +1240 +2440 +C7A0 +ENDCHAR +STARTCHAR U_7ED9 +ENCODING 32473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +4280 +5440 +E820 +27C0 +4000 +F7C0 +0C40 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7EDA +ENCODING 32474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +47E0 +5020 +E7A0 +24A0 +47A0 +F4A0 +0FA0 +3020 +C0C0 +ENDCHAR +STARTCHAR U_7EDB +ENCODING 32475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +4C40 +F380 +2D60 +4100 +EFE0 +0900 +3FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_7EDC +ENCODING 32476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4440 +5680 +E900 +2280 +4C60 +F7C0 +0440 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7EDD +ENCODING 32477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4480 +57E0 +ECA0 +24A0 +47E0 +F400 +0420 +3420 +C3E0 +ENDCHAR +STARTCHAR U_7EDE +ENCODING 32478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +5440 +E820 +2480 +4280 +F100 +0A80 +3440 +C820 +ENDCHAR +STARTCHAR U_7EDF +ENCODING 32479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4200 +5440 +EFE0 +22A0 +4280 +F280 +02A0 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_7EE0 +ENCODING 32480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +4FE0 +54A0 +E7E0 +24A0 +47E0 +F280 +0900 +3280 +CC60 +ENDCHAR +STARTCHAR U_7EE1 +ENCODING 32481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +22C0 +4880 +57E0 +E420 +27E0 +4420 +F7E0 +0C20 +3420 +C4E0 +ENDCHAR +STARTCHAR U_7EE2 +ENCODING 32482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5000 +E7E0 +2420 +47E0 +F420 +0FE0 +3420 +C460 +ENDCHAR +STARTCHAR U_7EE3 +ENCODING 32483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +4900 +57E0 +E540 +2920 +4780 +F280 +0AE0 +3420 +C8C0 +ENDCHAR +STARTCHAR U_7EE4 +ENCODING 32484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2420 +4920 +5100 +E280 +2440 +4820 +F7C0 +0440 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7EE5 +ENCODING 32485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2F20 +4A20 +5540 +E100 +2200 +4FE0 +F240 +0480 +3380 +CC60 +ENDCHAR +STARTCHAR U_7EE6 +ENCODING 32486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +4E40 +5180 +E660 +2100 +47E0 +F100 +0D40 +3120 +C320 +ENDCHAR +STARTCHAR U_7EE7 +ENCODING 32487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26A0 +45C0 +5480 +E7E0 +2480 +45C0 +F6A0 +0480 +3480 +C7E0 +ENDCHAR +STARTCHAR U_7EE8 +ENCODING 32488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +5120 +E7E0 +2500 +47E0 +F120 +0BE0 +3540 +C900 +ENDCHAR +STARTCHAR U_7EE9 +ENCODING 32489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4900 +57C0 +E100 +2FE0 +4440 +F540 +0D40 +3280 +CC60 +ENDCHAR +STARTCHAR U_7EEA +ENCODING 32490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27A0 +4940 +57E0 +E100 +23E0 +4620 +F3E0 +0A20 +33E0 +C220 +ENDCHAR +STARTCHAR U_7EEB +ENCODING 32491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4900 +57E0 +E240 +2520 +43C0 +F640 +0980 +3240 +C420 +ENDCHAR +STARTCHAR U_7EEC +ENCODING 32492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +4240 +5100 +E7C0 +2540 +4540 +F7E0 +0100 +3280 +CC60 +ENDCHAR +STARTCHAR U_7EED +ENCODING 32493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4100 +57E0 +E4A0 +2A80 +4480 +EFE0 +0100 +32C0 +CC20 +ENDCHAR +STARTCHAR U_7EEE +ENCODING 32494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4A80 +5440 +EFE0 +2040 +4740 +F540 +0F40 +3040 +C1C0 +ENDCHAR +STARTCHAR U_7EEF +ENCODING 32495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +4EE0 +5280 +E280 +2EE0 +4280 +F280 +0EE0 +3280 +C280 +ENDCHAR +STARTCHAR U_7EF0 +ENCODING 32496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +4900 +57C0 +E440 +27C0 +4440 +F7C0 +0100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_7EF1 +ENCODING 32497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4900 +5FE0 +E820 +2BA0 +4AA0 +FAA0 +0BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_7EF2 +ENCODING 32498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5440 +E7C0 +2080 +44A0 +F7C0 +0C80 +35A0 +C6E0 +ENDCHAR +STARTCHAR U_7EF3 +ENCODING 32499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5100 +EFC0 +2940 +4FC0 +F940 +0FC0 +3120 +C0E0 +ENDCHAR +STARTCHAR U_7EF4 +ENCODING 32500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +2480 +4FE0 +5480 +E7C0 +2480 +4480 +F7C0 +0C80 +3480 +C7E0 +ENDCHAR +STARTCHAR U_7EF5 +ENCODING 32501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4C40 +57C0 +E440 +27C0 +4100 +F7E0 +0D20 +3560 +C100 +ENDCHAR +STARTCHAR U_7EF6 +ENCODING 32502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +4A20 +5540 +EFE0 +2820 +47C0 +F240 +0980 +3240 +CC20 +ENDCHAR +STARTCHAR U_7EF7 +ENCODING 32503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4AA0 +5EE0 +EAA0 +2AA0 +4EE0 +FAA0 +0AA0 +2AA0 +D760 +ENDCHAR +STARTCHAR U_7EF8 +ENCODING 32504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +4BA0 +5920 +EFE0 +2820 +4BA0 +FAA0 +0BA0 +2820 +D0E0 +ENDCHAR +STARTCHAR U_7EF9 +ENCODING 32505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2FE0 +4420 +57A0 +EA20 +2FA0 +4220 +FAA0 +0FA0 +3020 +C0C0 +ENDCHAR +STARTCHAR U_7EFA +ENCODING 32506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2740 +4D60 +5540 +E240 +25E0 +4800 +F7E0 +0C20 +3420 +C7E0 +ENDCHAR +STARTCHAR U_7EFB +ENCODING 32507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4FC0 +5200 +E7E0 +2440 +4FA0 +F480 +0DA0 +3420 +C3E0 +ENDCHAR +STARTCHAR U_7EFC +ENCODING 32508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +57C0 +E000 +27E0 +4100 +F540 +0540 +3920 +C320 +ENDCHAR +STARTCHAR U_7EFD +ENCODING 32509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4C20 +5000 +E7E0 +2080 +4280 +F2E0 +0A80 +3580 +C8E0 +ENDCHAR +STARTCHAR U_7EFE +ENCODING 32510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +4C20 +53C0 +E240 +23C0 +4200 +F3E0 +0A20 +33E0 +C220 +ENDCHAR +STARTCHAR U_7EFF +ENCODING 32511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +43C0 +F040 +2FE0 +4120 +F540 +0380 +3540 +C920 +0300 +ENDCHAR +STARTCHAR U_7F00 +ENCODING 32512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2220 +4CC0 +5440 +EAA0 +2000 +4EE0 +EAA0 +0440 +36C0 +C920 +ENDCHAR +STARTCHAR U_7F01 +ENCODING 32513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +22A0 +4D40 +52A0 +E2A0 +2000 +47E0 +F520 +0FE0 +3520 +C7E0 +ENDCHAR +STARTCHAR U_7F02 +ENCODING 32514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +4240 +53C0 +E100 +27E0 +4520 +F7E0 +0100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_7F03 +ENCODING 32515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +4F20 +55E0 +E520 +2F20 +55E0 +E520 +0520 +35E0 +C520 +ENDCHAR +STARTCHAR U_7F04 +ENCODING 32516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +4FE0 +5880 +EF80 +28A0 +4EA0 +FAA0 +0E40 +28A0 +D320 +ENDCHAR +STARTCHAR U_7F05 +ENCODING 32517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +4200 +5FE0 +EAA0 +2BA0 +4AA0 +FBA0 +0AA0 +3FE0 +C820 +ENDCHAR +STARTCHAR U_7F06 +ENCODING 32518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2AE0 +4B40 +5A20 +E7C0 +2440 +4540 +F540 +0900 +3320 +CDE0 +ENDCHAR +STARTCHAR U_7F07 +ENCODING 32519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2000 +4FE0 +F280 +02E0 +3580 +C8E0 +ENDCHAR +STARTCHAR U_7F08 +ENCODING 32520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +2A80 +4AC0 +5FA0 +EA80 +2EA0 +4AA0 +FA40 +0E80 +3100 +C600 +ENDCHAR +STARTCHAR U_7F09 +ENCODING 32521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5000 +EFE0 +2440 +47C0 +F440 +0460 +3FC0 +C040 +ENDCHAR +STARTCHAR U_7F0A +ENCODING 32522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +47C0 +5440 +E7C0 +2000 +4FE0 +FAA0 +0AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_7F0B +ENCODING 32523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4D40 +5FE0 +E000 +27C0 +4540 +F540 +0D40 +3280 +CC60 +ENDCHAR +STARTCHAR U_7F0C +ENCODING 32524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +4FE0 +5520 +E520 +27E0 +4140 +F2A0 +0E20 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_7F0D +ENCODING 32525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +4900 +5FE0 +E540 +27E0 +4540 +FFE0 +0900 +3100 +C7C0 +ENDCHAR +STARTCHAR U_7F0E +ENCODING 32526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +24A0 +4CA0 +5700 +E4E0 +27A0 +44A0 +F7A0 +0C40 +34A0 +C520 +ENDCHAR +STARTCHAR U_7F0F +ENCODING 32527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +4BE0 +5AA0 +EBE0 +2AA0 +4BE0 +FA80 +0980 +3A40 +CC20 +ENDCHAR +STARTCHAR U_7F10 +ENCODING 32528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +4440 +57C0 +E440 +27C0 +4120 +EDC0 +0540 +3920 +C300 +ENDCHAR +STARTCHAR U_7F11 +ENCODING 32529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +2440 +4BE0 +5800 +EA00 +2BE0 +4880 +FBE0 +0880 +3940 +CA20 +ENDCHAR +STARTCHAR U_7F12 +ENCODING 32530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +25E0 +4520 +51E0 +ED00 +25E0 +4520 +F520 +05E0 +3600 +C9E0 +ENDCHAR +STARTCHAR U_7F13 +ENCODING 32531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A20 +4540 +5FE0 +E200 +2FE0 +4200 +F3C0 +0640 +3980 +C660 +ENDCHAR +STARTCHAR U_7F14 +ENCODING 32532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4A80 +5FE0 +E920 +27C0 +4540 +F540 +0D40 +35C0 +C100 +ENDCHAR +STARTCHAR U_7F15 +ENCODING 32533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4FE0 +5380 +E540 +2920 +4FE0 +F240 +0C40 +3380 +CE60 +ENDCHAR +STARTCHAR U_7F16 +ENCODING 32534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +5FE0 +E800 +2FE0 +4AA0 +FFE0 +0AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_7F17 +ENCODING 32535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5500 +E7E0 +2440 +47E0 +F440 +0FC0 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7F18 +ENCODING 32536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4F80 +5080 +EFE0 +2520 +4B40 +F580 +0AC0 +34A0 +C300 +ENDCHAR +STARTCHAR U_7F19 +ENCODING 32537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4EC0 +5280 +EFE0 +2000 +47C0 +F440 +0FC0 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7F1A +ENCODING 32538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2FE0 +4D20 +57E0 +E520 +27E0 +4520 +FFE0 +0440 +3240 +C1C0 +ENDCHAR +STARTCHAR U_7F1B +ENCODING 32539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2800 +4BC0 +5800 +EFE0 +2AA0 +4B40 +FFE0 +0A40 +2940 +D0C0 +ENDCHAR +STARTCHAR U_7F1C +ENCODING 32540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4100 +57C0 +E440 +27C0 +4440 +F7C0 +0440 +3FE0 +C440 +ENDCHAR +STARTCHAR U_7F1D +ENCODING 32541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2A40 +4D80 +5240 +EFE0 +2480 +47E0 +F480 +07E0 +3C80 +C3E0 +ENDCHAR +STARTCHAR U_7F1E +ENCODING 32542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +4000 +57C0 +E440 +2FE0 +4440 +F7C0 +0540 +3C80 +C760 +ENDCHAR +STARTCHAR U_7F1F +ENCODING 32543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4A40 +53C0 +E000 +2FE0 +4820 +FBA0 +0AA0 +3BA0 +C860 +ENDCHAR +STARTCHAR U_7F20 +ENCODING 32544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4800 +5BE0 +EAA0 +2AA0 +4BE0 +F880 +0FE0 +2880 +D7E0 +ENDCHAR +STARTCHAR U_7F21 +ENCODING 32545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4D40 +56C0 +E540 +27C0 +4100 +FFE0 +0AA0 +3FE0 +C860 +ENDCHAR +STARTCHAR U_7F22 +ENCODING 32546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +5280 +E440 +2820 +47C0 +F540 +0540 +3540 +CFE0 +ENDCHAR +STARTCHAR U_7F23 +ENCODING 32547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +52A0 +EFE0 +22A0 +4FE0 +F280 +0EC0 +3AA0 +C2A0 +ENDCHAR +STARTCHAR U_7F24 +ENCODING 32548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4820 +5780 +E400 +27E0 +4480 +F480 +0FE0 +3480 +C860 +ENDCHAR +STARTCHAR U_7F25 +ENCODING 32549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +4FE0 +5AA0 +EFE0 +2000 +47C0 +F000 +0FE0 +3540 +CB20 +ENDCHAR +STARTCHAR U_7F26 +ENCODING 32550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4FC0 +5440 +EFE0 +2AA0 +4FE0 +F440 +0A80 +3100 +CEE0 +ENDCHAR +STARTCHAR U_7F27 +ENCODING 32551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +4FE0 +5520 +E7E0 +2240 +4F80 +F220 +0FE0 +3540 +CB20 +ENDCHAR +STARTCHAR U_7F28 +ENCODING 32552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +4AA0 +5AA0 +EAA0 +2540 +4A20 +FFE0 +0A80 +3180 +CE60 +ENDCHAR +STARTCHAR U_7F29 +ENCODING 32553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4A20 +55E0 +E480 +2DE0 +4520 +F5E0 +0D20 +35E0 +C520 +ENDCHAR +STARTCHAR U_7F2A +ENCODING 32554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4660 +5AA0 +E300 +2480 +4A60 +F500 +0240 +3080 +C700 +ENDCHAR +STARTCHAR U_7F2B +ENCODING 32555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2280 +4D40 +57C0 +E540 +27C0 +4540 +FFE0 +0B80 +3540 +C920 +ENDCHAR +STARTCHAR U_7F2C +ENCODING 32556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4880 +7FE0 +8A20 +EAA0 +5EA0 +82A0 +FEA0 +16A0 +3D40 +C220 +ENDCHAR +STARTCHAR U_7F2D +ENCODING 32557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +4AA0 +5440 +EFE0 +2440 +47C0 +F440 +0FC0 +3540 +CB20 +ENDCHAR +STARTCHAR U_7F2E +ENCODING 32558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +4100 +F7C0 +2100 +4FE0 +F540 +0FE0 +3440 +C440 +07C0 +ENDCHAR +STARTCHAR U_7F2F +ENCODING 32559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +4FE0 +5AA0 +EFE0 +2000 +47C0 +F440 +0FC0 +3440 +C7C0 +ENDCHAR +STARTCHAR U_7F30 +ENCODING 32560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2540 +4FC0 +5540 +EFE0 +2000 +47C0 +F540 +0FC0 +3540 +CFE0 +ENDCHAR +STARTCHAR U_7F31 +ENCODING 32561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +4AA0 +57E0 +E120 +2D20 +45E0 +F500 +05E0 +3520 +CBE0 +ENDCHAR +STARTCHAR U_7F32 +ENCODING 32562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +4440 +5FE0 +EAA0 +2EE0 +4100 +FFE0 +0B80 +3540 +C920 +ENDCHAR +STARTCHAR U_7F33 +ENCODING 32563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +4FE0 +5000 +EFE0 +2440 +47C0 +F520 +0CC0 +3540 +C620 +ENDCHAR +STARTCHAR U_7F34 +ENCODING 32564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +5E80 +9280 +FFE0 +52A0 +9FA0 +E8A0 +1EA0 +2A40 +CAA0 +1720 +ENDCHAR +STARTCHAR U_7F35 +ENCODING 32565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +4240 +5FE0 +E540 +2FE0 +4440 +F540 +0D40 +3280 +CC60 +ENDCHAR +STARTCHAR U_7F36 +ENCODING 32566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1FC0 +2400 +4400 +0400 +FFE0 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_7F37 +ENCODING 32567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +5120 +9120 +7D20 +1120 +5520 +55A0 +5540 +7D00 +0100 +ENDCHAR +STARTCHAR U_7F38 +ENCODING 32568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43E0 +7880 +A080 +2080 +FC80 +2080 +A880 +A880 +A880 +FBE0 +ENDCHAR +STARTCHAR U_7F39 +ENCODING 32569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FC0 +4400 +FFE0 +0400 +4440 +7FC0 +0000 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_7F3A +ENCODING 32570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7BC0 +A140 +2140 +FFE0 +2100 +A900 +AA80 +FA40 +0420 +ENDCHAR +STARTCHAR U_7F3B +ENCODING 32571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +A200 +23C0 +2240 +FA40 +2340 +AAC0 +AA40 +FA40 +8B60 +ENDCHAR +STARTCHAR U_7F3C +ENCODING 32572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +A3E0 +2520 +F940 +2100 +A900 +AA80 +FA80 +0440 +0820 +ENDCHAR +STARTCHAR U_7F3D +ENCODING 32573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +A080 +2180 +FAC0 +24A0 +A880 +ABE0 +F880 +8880 +ENDCHAR +STARTCHAR U_7F3E +ENCODING 32574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +7FE0 +A140 +2140 +FFE0 +2140 +A940 +A940 +FA40 +8C40 +ENDCHAR +STARTCHAR U_7F3F +ENCODING 32575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7A00 +A3E0 +2200 +FA00 +22E0 +AAA0 +AAA0 +FAE0 +8CA0 +ENDCHAR +STARTCHAR U_7F40 +ENCODING 32576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +AAA0 +26C0 +FA80 +22C0 +AEA0 +AA80 +BAA0 +E4A0 +0860 +ENDCHAR +STARTCHAR U_7F41 +ENCODING 32577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4A60 +79A0 +AFE0 +F920 +2D60 +AD60 +AFE0 +F820 +08A0 +0840 +ENDCHAR +STARTCHAR U_7F42 +ENCODING 32578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AAA0 +AA80 +5140 +9FA0 +2200 +FFE0 +2240 +2240 +3FC0 +ENDCHAR +STARTCHAR U_7F43 +ENCODING 32579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +B2C0 +5140 +8A20 +FFE0 +A020 +3F80 +4400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F44 +ENCODING 32580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1140 +7E20 +57C0 +7C80 +5360 +9FC0 +2400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F45 +ENCODING 32581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +7FE0 +A520 +27C0 +FD20 +27E0 +AD40 +AFE0 +FC80 +8980 +ENDCHAR +STARTCHAR U_7F46 +ENCODING 32582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7540 +AFE0 +2540 +FFC0 +2440 +A7C0 +A440 +FFC0 +8440 +0820 +ENDCHAR +STARTCHAR U_7F47 +ENCODING 32583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +A140 +27E0 +FDA0 +2660 +AFE0 +A880 +AFE0 +FA80 +0180 +ENDCHAR +STARTCHAR U_7F48 +ENCODING 32584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +7FE0 +AAA0 +2FE0 +F440 +27C0 +AC40 +AFE0 +F900 +8900 +ENDCHAR +STARTCHAR U_7F49 +ENCODING 32585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7340 +AFE0 +2820 +FB80 +2280 +AFC0 +A900 +AFE0 +F900 +0300 +ENDCHAR +STARTCHAR U_7F4A +ENCODING 32586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +FA60 +AFC0 +F880 +A960 +FFC0 +4400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F4B +ENCODING 32587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +47E0 +7480 +2FE0 +7480 +1FE0 +2400 +7FE0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_7F4C +ENCODING 32588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +7BC0 +5540 +9FA0 +2400 +FFE0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_7F4D +ENCODING 32589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +2400 +FFE0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F4E +ENCODING 32590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7640 +A540 +2FE0 +F920 +2540 +AFC0 +A800 +AFE0 +FA40 +07C0 +ENDCHAR +STARTCHAR U_7F4F +ENCODING 32591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4100 +7FE0 +A520 +27E0 +FD40 +27C0 +AD40 +AFE0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_7F50 +ENCODING 32592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47E0 +7A80 +AEE0 +2AA0 +FEE0 +27E0 +AC80 +AFE0 +FC80 +87E0 +ENDCHAR +STARTCHAR U_7F51 +ENCODING 32593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +9140 +D540 +A240 +9240 +AD40 +C540 +8840 +8040 +81C0 +ENDCHAR +STARTCHAR U_7F52 +ENCODING 32594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +FFE0 +9120 +9120 +FFE0 +ENDCHAR +STARTCHAR U_7F53 +ENCODING 32595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 4 1 6 +BITMAP +FF80 +9280 +8C80 +B280 +ENDCHAR +STARTCHAR U_7F54 +ENCODING 32596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +A240 +9440 +BF40 +8840 +BF40 +9040 +9040 +9F40 +8040 +81C0 +ENDCHAR +STARTCHAR U_7F55 +ENCODING 32597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +3080 +4040 +3F80 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_7F56 +ENCODING 32598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5240 +5240 +7FC0 +0400 +0600 +0900 +3080 +C860 +0400 +0400 +ENDCHAR +STARTCHAR U_7F57 +ENCODING 32599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +9240 +FFC0 +1000 +1F80 +2100 +5200 +0C00 +1800 +E000 +ENDCHAR +STARTCHAR U_7F58 +ENCODING 32600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4920 +7FE0 +0000 +7FE0 +0400 +0C80 +3460 +C420 +0400 +ENDCHAR +STARTCHAR U_7F59 +ENCODING 32601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +2080 +C440 +0400 +FFC0 +1500 +2480 +C460 +0400 +0400 +ENDCHAR +STARTCHAR U_7F5A +ENCODING 32602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +9240 +FFC0 +2000 +1240 +E240 +2240 +2A40 +3040 +21C0 +ENDCHAR +STARTCHAR U_7F5B +ENCODING 32603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +9240 +FFC0 +0080 +7F80 +4880 +4880 +4A80 +4F40 +8920 +ENDCHAR +STARTCHAR U_7F5C +ENCODING 32604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4920 +7FE0 +0400 +7FC0 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7F5D +ENCODING 32605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +4020 +1F80 +1080 +1F80 +1080 +1F80 +1080 +FFE0 +ENDCHAR +STARTCHAR U_7F5E +ENCODING 32606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +7FC0 +0880 +0500 +FFE0 +1220 +2240 +C600 +ENDCHAR +STARTCHAR U_7F5F +ENCODING 32607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +4920 +7FE0 +0400 +FFE0 +0400 +3FC0 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_7F60 +ENCODING 32608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +0000 +7F80 +4080 +7F80 +4400 +7FC0 +4240 +71C0 +ENDCHAR +STARTCHAR U_7F61 +ENCODING 32609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0000 +7FE0 +0200 +0200 +13C0 +1200 +1200 +FFE0 +ENDCHAR +STARTCHAR U_7F62 +ENCODING 32610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0400 +7FC0 +0400 +FFE0 +0800 +1080 +7FC0 +2040 +ENDCHAR +STARTCHAR U_7F63 +ENCODING 32611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +3F80 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7F64 +ENCODING 32612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +0A00 +7FC0 +0440 +7FC0 +4400 +7FE0 +1420 +E4C0 +ENDCHAR +STARTCHAR U_7F65 +ENCODING 32613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +2100 +7F80 +4080 +7F80 +4080 +7F80 +4080 +4380 +ENDCHAR +STARTCHAR U_7F66 +ENCODING 32614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0100 +7E80 +1500 +7FC0 +0200 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_7F67 +ENCODING 32615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +1080 +1080 +7FE0 +1080 +39C0 +56A0 +94A0 +1080 +ENDCHAR +STARTCHAR U_7F68 +ENCODING 32616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0800 +FFE0 +2480 +7FC0 +A4A0 +3F80 +0420 +03E0 +ENDCHAR +STARTCHAR U_7F69 +ENCODING 32617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0400 +3FE0 +2080 +3F80 +2080 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F6A +ENCODING 32618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +1200 +F3C0 +1200 +F3C0 +1200 +F3C0 +1200 +1200 +ENDCHAR +STARTCHAR U_7F6B +ENCODING 32619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +1080 +7C80 +1080 +FEC0 +10A0 +7CA0 +1080 +FE80 +ENDCHAR +STARTCHAR U_7F6C +ENCODING 32620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0000 +7BC0 +5280 +2940 +7BC0 +4A40 +3180 +CA60 +ENDCHAR +STARTCHAR U_7F6D +ENCODING 32621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0280 +FFE0 +0200 +7A40 +4A80 +7900 +02A0 +F460 +ENDCHAR +STARTCHAR U_7F6E +ENCODING 32622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_7F6F +ENCODING 32623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +7FC0 +0A00 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7F70 +ENCODING 32624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9120 +FFE0 +1000 +FD20 +0120 +7920 +0120 +7D20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_7F71 +ENCODING 32625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +FFE0 +0400 +7FC0 +4A40 +5F40 +4440 +5F40 +4440 +44C0 +ENDCHAR +STARTCHAR U_7F72 +ENCODING 32626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0440 +3F80 +0500 +FFE0 +3080 +DF80 +1080 +1F80 +ENDCHAR +STARTCHAR U_7F73 +ENCODING 32627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2480 +3F80 +2480 +3F80 +0000 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_7F74 +ENCODING 32628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +0400 +7FC0 +0400 +FFE0 +1080 +3FC0 +5240 +8920 +ENDCHAR +STARTCHAR U_7F75 +ENCODING 32629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0000 +7FC0 +4400 +7F80 +4400 +7FE0 +4A20 +9540 +ENDCHAR +STARTCHAR U_7F76 +ENCODING 32630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +9480 +FF80 +1000 +EF80 +9480 +FF80 +4880 +7F80 +4880 +7F80 +ENDCHAR +STARTCHAR U_7F77 +ENCODING 32631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9240 +FFC0 +4400 +9700 +FC40 +93C0 +F480 +9700 +F440 +B3C0 +ENDCHAR +STARTCHAR U_7F78 +ENCODING 32632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +1080 +FFE0 +0480 +7A80 +0080 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_7F79 +ENCODING 32633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2280 +A7E0 +BC80 +A7E0 +2480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_7F7A +ENCODING 32634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2480 +3F80 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_7F7B +ENCODING 32635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +4240 +7E40 +41E0 +5C40 +4140 +7EC0 +AA40 +C9C0 +ENDCHAR +STARTCHAR U_7F7C +ENCODING 32636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9220 +FFE0 +2480 +3F80 +2480 +FFE0 +1500 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F7D +ENCODING 32637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +4800 +6AA0 +54A0 +62A0 +48A0 +6AA0 +5420 +A260 +ENDCHAR +STARTCHAR U_7F7E +ENCODING 32638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +2080 +FFE0 +9520 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_7F7F +ENCODING 32639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9220 +FFE0 +1100 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_7F80 +ENCODING 32640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +FFE0 +0A00 +7BC0 +4A40 +7BC0 +0A00 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_7F81 +ENCODING 32641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFC0 +5000 +FFC0 +AA40 +FBE0 +2020 +FBA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_7F82 +ENCODING 32642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +2240 +4BE0 +F220 +4BE0 +FE20 +03E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_7F83 +ENCODING 32643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +FFE0 +2080 +3F80 +2080 +FFE0 +1500 +FFE0 +2480 +2580 +ENDCHAR +STARTCHAR U_7F84 +ENCODING 32644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +2100 +51E0 +E7C0 +5440 +FFC0 +0100 +57E0 +A900 +ENDCHAR +STARTCHAR U_7F85 +ENCODING 32645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2480 +4FE0 +F480 +27E0 +5480 +FFE0 +5480 +AFE0 +ENDCHAR +STARTCHAR U_7F86 +ENCODING 32646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2A80 +7F20 +4BE0 +7A00 +4BC0 +7A20 +4BE0 +8520 +ENDCHAR +STARTCHAR U_7F87 +ENCODING 32647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +D900 +57E0 +FA80 +AFE0 +FD40 +2740 +F840 +20C0 +ENDCHAR +STARTCHAR U_7F88 +ENCODING 32648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FFE0 +5280 +FBE0 +AA80 +FBE0 +2280 +FBE0 +22A0 +2540 +ENDCHAR +STARTCHAR U_7F89 +ENCODING 32649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4940 +7FC0 +2440 +4EA0 +A1E0 +CE80 +50A0 +FFE0 +5B40 +AEA0 +ENDCHAR +STARTCHAR U_7F8A +ENCODING 32650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F8B +ENCODING 32651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +F5E0 +1500 +0000 +0400 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7F8C +ENCODING 32652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +0400 +3F80 +0400 +FFE0 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_7F8D +ENCODING 32653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3180 +CA60 +3F80 +0400 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7F8E +ENCODING 32654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +0400 +7FC0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7F8F +ENCODING 32655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2840 +7C80 +1120 +7C40 +1080 +1120 +FC20 +1040 +2080 +4300 +ENDCHAR +STARTCHAR U_7F90 +ENCODING 32656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1500 +7F80 +0400 +FFE0 +1000 +1F80 +6200 +0D00 +F0E0 +ENDCHAR +STARTCHAR U_7F91 +ENCODING 32657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0800 +1F00 +6200 +0D00 +F0E0 +ENDCHAR +STARTCHAR U_7F92 +ENCODING 32658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +5280 +FA40 +2420 +2020 +FBC0 +2140 +F940 +2240 +4440 +9880 +ENDCHAR +STARTCHAR U_7F93 +ENCODING 32659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +57C0 +FD40 +2540 +7D40 +27C0 +FC00 +2420 +2420 +43E0 +8000 +ENDCHAR +STARTCHAR U_7F94 +ENCODING 32660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +FFE0 +5240 +8920 +8920 +ENDCHAR +STARTCHAR U_7F95 +ENCODING 32661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0440 +FC80 +1700 +2480 +CC60 +ENDCHAR +STARTCHAR U_7F96 +ENCODING 32662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +FA40 +2460 +2000 +FFC0 +2240 +FA80 +2100 +4280 +8C60 +ENDCHAR +STARTCHAR U_7F97 +ENCODING 32663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +7FC0 +0400 +3F80 +0400 +FFE0 +0D40 +15E0 +2420 +C3E0 +ENDCHAR +STARTCHAR U_7F98 +ENCODING 32664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7280 +5FE0 +7100 +5FC0 +7100 +5100 +5FE0 +5100 +5100 +B100 +ENDCHAR +STARTCHAR U_7F99 +ENCODING 32665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +0400 +2440 +4A80 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7F9A +ENCODING 32666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +FA80 +2440 +2120 +F880 +27E0 +F840 +2380 +4080 +8040 +ENDCHAR +STARTCHAR U_7F9B +ENCODING 32667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFC0 +0400 +FFE0 +0940 +FFC0 +4900 +7FC0 +1140 +E1C0 +ENDCHAR +STARTCHAR U_7F9C +ENCODING 32668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +FC20 +2000 +27E0 +F880 +2080 +F880 +2080 +4280 +8100 +ENDCHAR +STARTCHAR U_7F9D +ENCODING 32669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8860 +5780 +FC80 +2480 +27E0 +FC80 +2480 +FCA0 +2560 +46A0 +84A0 +ENDCHAR +STARTCHAR U_7F9E +ENCODING 32670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +5F80 +8480 +7FE0 +ENDCHAR +STARTCHAR U_7F9F +ENCODING 32671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +5040 +F840 +2080 +7140 +2620 +FBE0 +2080 +2080 +4080 +87E0 +ENDCHAR +STARTCHAR U_7FA0 +ENCODING 32672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +F900 +27C0 +7140 +27C0 +FD00 +27E0 +2160 +4280 +8C60 +ENDCHAR +STARTCHAR U_7FA1 +ENCODING 32673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +4800 +2FE0 +3240 +C580 +5860 +ENDCHAR +STARTCHAR U_7FA2 +ENCODING 32674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2280 +72A0 +27A0 +FAA0 +22C0 +22A0 +4560 +8A20 +ENDCHAR +STARTCHAR U_7FA3 +ENCODING 32675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1080 +FFE0 +1F80 +3080 +5F80 +0A00 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7FA4 +ENCODING 32676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +2940 +FFE0 +2880 +7BE0 +2080 +7880 +AFE0 +2880 +2880 +3880 +ENDCHAR +STARTCHAR U_7FA5 +ENCODING 32677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5000 +FAA0 +2540 +7540 +22A0 +F800 +23E0 +2080 +4080 +8FE0 +ENDCHAR +STARTCHAR U_7FA6 +ENCODING 32678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5080 +FFE0 +2420 +73C0 +2000 +FFE0 +2280 +22A0 +44A0 +9860 +ENDCHAR +STARTCHAR U_7FA7 +ENCODING 32679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5240 +FFE0 +2240 +7520 +23C0 +FA40 +2640 +2980 +4240 +8C20 +ENDCHAR +STARTCHAR U_7FA8 +ENCODING 32680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +4400 +B7E0 +2940 +C280 +5C60 +ENDCHAR +STARTCHAR U_7FA9 +ENCODING 32681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F80 +0400 +FFE0 +1240 +FFE0 +3940 +D1A0 +3660 +ENDCHAR +STARTCHAR U_7FAA +ENCODING 32682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +FC40 +27C0 +2440 +7FC0 +2520 +FD40 +2480 +4540 +8620 +ENDCHAR +STARTCHAR U_7FAB +ENCODING 32683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5080 +FFE0 +2420 +7240 +2420 +FFC0 +2100 +2100 +4100 +8FE0 +ENDCHAR +STARTCHAR U_7FAC +ENCODING 32684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2480 +77A0 +24A0 +FFA0 +2540 +2760 +48A0 +9320 +ENDCHAR +STARTCHAR U_7FAD +ENCODING 32685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8B80 +5440 +FBA0 +2000 +7E20 +2AA0 +FEA0 +2AA0 +2EA0 +4A20 +8AE0 +ENDCHAR +STARTCHAR U_7FAE +ENCODING 32686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +FFE0 +2940 +44A0 +FFE0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7FAF +ENCODING 32687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BC0 +5240 +FBC0 +2240 +73C0 +2200 +FFE0 +24A0 +2560 +47A0 +80C0 +ENDCHAR +STARTCHAR U_7FB0 +ENCODING 32688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +54A0 +FFE0 +2100 +77E0 +2280 +FAA0 +25C0 +2480 +4940 +9220 +ENDCHAR +STARTCHAR U_7FB1 +ENCODING 32689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5480 +FDE0 +2520 +75E0 +2520 +FDE0 +2480 +25C0 +4AA0 +95A0 +ENDCHAR +STARTCHAR U_7FB2 +ENCODING 32690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +0400 +3F80 +0400 +FFE0 +1140 +FFE0 +3940 +4CA0 +3560 +ENDCHAR +STARTCHAR U_7FB3 +ENCODING 32691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +5720 +FD40 +27E0 +7340 +2520 +FFC0 +2540 +27C0 +4540 +87C0 +ENDCHAR +STARTCHAR U_7FB4 +ENCODING 32692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +3F80 +0400 +7FE0 +2A40 +FFE0 +1080 +7BC0 +1080 +FFE0 +1080 +ENDCHAR +STARTCHAR U_7FB5 +ENCODING 32693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +F540 +2FE0 +7440 +27C0 +FC40 +27C0 +2440 +47C0 +8C60 +ENDCHAR +STARTCHAR U_7FB6 +ENCODING 32694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +FDA0 +2420 +77E0 +2000 +FBC0 +2240 +23C0 +4240 +8FE0 +ENDCHAR +STARTCHAR U_7FB7 +ENCODING 32695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5280 +FC40 +2BA0 +7000 +2EE0 +FAA0 +2EE0 +2480 +4D40 +9220 +ENDCHAR +STARTCHAR U_7FB8 +ENCODING 32696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3F80 +70C0 +5F40 +7540 +5FC0 +7540 +9F40 +9560 +ENDCHAR +STARTCHAR U_7FB9 +ENCODING 32697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +0900 +7FC0 +0400 +FFE0 +4940 +FFE0 +0400 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_7FBA +ENCODING 32698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5100 +FFE0 +2920 +7A80 +2FE0 +F100 +2FE0 +2AA0 +4AA0 +8860 +ENDCHAR +STARTCHAR U_7FBB +ENCODING 32699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57E0 +FD40 +27E0 +74A0 +2740 +FD20 +25E0 +2B40 +5480 +A760 +ENDCHAR +STARTCHAR U_7FBC +ENCODING 32700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4480 +5FC0 +4200 +7FE0 +6540 +5080 +BFE0 +9080 +ENDCHAR +STARTCHAR U_7FBD +ENCODING 32701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +4920 +28A0 +0860 +18A0 +2920 +4A20 +8820 +28A0 +1040 +ENDCHAR +STARTCHAR U_7FBE +ENCODING 32702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +27E0 +B480 +6C80 +2480 +6C80 +B480 +A480 +2480 +2480 +6FE0 +ENDCHAR +STARTCHAR U_7FBF +ENCODING 32703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +2940 +18C0 +2940 +4A40 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_7FC0 +ENCODING 32704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2480 +A7E0 +76A0 +2EA0 +26A0 +6FE0 +B6A0 +2480 +2480 +6C80 +ENDCHAR +STARTCHAR U_7FC1 +ENCODING 32705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2500 +4A80 +BF60 +0000 +FBC0 +4A40 +2940 +18C0 +EB40 +5AC0 +ENDCHAR +STARTCHAR U_7FC2 +ENCODING 32706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +2540 +2540 +B620 +6C00 +27E0 +6D20 +B520 +2520 +2620 +6CC0 +ENDCHAR +STARTCHAR U_7FC3 +ENCODING 32707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +FDA0 +2360 +2920 +4B60 +55A0 +9120 +A120 +2920 +7B60 +ENDCHAR +STARTCHAR U_7FC4 +ENCODING 32708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2480 +B480 +6FE0 +2620 +6D40 +B480 +2540 +B520 +4A20 +ENDCHAR +STARTCHAR U_7FC5 +ENCODING 32709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +25A0 +F360 +9360 +55A0 +5120 +2360 +5000 +8FE0 +ENDCHAR +STARTCHAR U_7FC6 +ENCODING 32710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4A40 +2940 +4A40 +8C40 +7F00 +1120 +25E0 +4400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_7FC7 +ENCODING 32711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +4A40 +2940 +39C0 +CA40 +0900 +FFE0 +1080 +2900 +4600 +B9E0 +ENDCHAR +STARTCHAR U_7FC8 +ENCODING 32712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A920 +ADA0 +FB60 +A920 +AB60 +FDA0 +2120 +2120 +25A0 +2240 +ENDCHAR +STARTCHAR U_7FC9 +ENCODING 32713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +FDA0 +2360 +3120 +6920 +A360 +25A0 +F920 +2120 +2360 +ENDCHAR +STARTCHAR U_7FCA +ENCODING 32714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2120 +FDA0 +0360 +9120 +5320 +5560 +21A0 +3920 +E120 +0360 +ENDCHAR +STARTCHAR U_7FCB +ENCODING 32715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2480 +B7E0 +6C00 +2440 +6E40 +B540 +2540 +2540 +2480 +6FE0 +ENDCHAR +STARTCHAR U_7FCC +ENCODING 32716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +18C0 +2940 +4A40 +0400 +7FE0 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_7FCD +ENCODING 32717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +25E0 +B560 +6D40 +25E0 +6D20 +B5A0 +25A0 +2640 +24A0 +6D20 +ENDCHAR +STARTCHAR U_7FCE +ENCODING 32718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1760 +2920 +45A0 +A360 +1120 +7B20 +0D60 +51A0 +2120 +1120 +1360 +ENDCHAR +STARTCHAR U_7FCF +ENCODING 32719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +2940 +18C0 +EF40 +1100 +ECE0 +0200 +1C80 +0100 +FE00 +ENDCHAR +STARTCHAR U_7FD0 +ENCODING 32720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2680 +B7E0 +6E80 +2480 +27E0 +6C80 +B480 +2480 +2540 +6E20 +ENDCHAR +STARTCHAR U_7FD1 +ENCODING 32721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +25E0 +B620 +6C20 +27A0 +26A0 +6FA0 +B6A0 +2420 +24A0 +6C40 +ENDCHAR +STARTCHAR U_7FD2 +ENCODING 32722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +5960 +28A0 +CD20 +0800 +3FC0 +2040 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_7FD3 +ENCODING 32723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +25A0 +7360 +0120 +F360 +95A0 +9120 +F5A0 +9240 +ENDCHAR +STARTCHAR U_7FD4 +ENCODING 32724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5120 +F920 +25A0 +7360 +2120 +FB60 +25A0 +2120 +4120 +8360 +ENDCHAR +STARTCHAR U_7FD5 +ENCODING 32725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +0000 +3F80 +2080 +FFE0 +4920 +38E0 +CB20 +1860 +ENDCHAR +STARTCHAR U_7FD6 +ENCODING 32726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +5120 +8DA0 +7360 +0120 +7360 +55A0 +5120 +75A0 +5240 +ENDCHAR +STARTCHAR U_7FD7 +ENCODING 32727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3920 +4DA0 +AB60 +1120 +6120 +3B60 +4DA0 +A920 +1120 +E360 +ENDCHAR +STARTCHAR U_7FD8 +ENCODING 32728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F120 +55A0 +2B60 +D920 +0360 +FDA0 +5120 +5660 +5020 +8FE0 +ENDCHAR +STARTCHAR U_7FD9 +ENCODING 32729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +AFE0 +A920 +FDA0 +2360 +7920 +4B60 +ADA0 +1120 +25A0 +C240 +ENDCHAR +STARTCHAR U_7FDA +ENCODING 32730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +4A40 +FFE0 +8820 +7FC0 +1200 +3FC0 +0200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_7FDB +ENCODING 32731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5540 +5080 +D760 +5000 +5FE0 +55A0 +5360 +4DA0 +4360 +ENDCHAR +STARTCHAR U_7FDC +ENCODING 32732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +CB20 +0400 +FFE0 +2480 +5B40 +8A20 +1100 +E0E0 +ENDCHAR +STARTCHAR U_7FDD +ENCODING 32733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +A920 +25A0 +FB60 +2120 +5360 +55A0 +A920 +79A0 +0360 +ENDCHAR +STARTCHAR U_7FDE +ENCODING 32734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +27E0 +B400 +6DE0 +2520 +25E0 +6C80 +B5C0 +26A0 +24A0 +6D80 +ENDCHAR +STARTCHAR U_7FDF +ENCODING 32735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2940 +18C0 +EB40 +1400 +1200 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_7FE0 +ENCODING 32736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2940 +18C0 +6B40 +0840 +7FC0 +1100 +2A80 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7FE1 +ENCODING 32737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +FBE0 +4920 +38E0 +CB20 +ENDCHAR +STARTCHAR U_7FE2 +ENCODING 32738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A920 +FDA0 +AB60 +F920 +8920 +BB60 +ADA0 +B920 +8920 +9B60 +ENDCHAR +STARTCHAR U_7FE3 +ENCODING 32739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +4920 +7FC0 +0900 +FFE0 +0400 +FFE0 +0900 +F6E0 +ENDCHAR +STARTCHAR U_7FE4 +ENCODING 32740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9120 +95A0 +F360 +0120 +FB60 +ADA0 +F920 +A920 +ADA0 +9A40 +ENDCHAR +STARTCHAR U_7FE5 +ENCODING 32741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1480 +1280 +FFC0 +2940 +18C0 +6B40 +18C0 +ENDCHAR +STARTCHAR U_7FE6 +ENCODING 32742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4840 +7940 +4940 +7940 +4840 +FFE0 +4A20 +29A0 +DA60 +ENDCHAR +STARTCHAR U_7FE7 +ENCODING 32743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +8920 +75A0 +0360 +7120 +5360 +55A0 +7120 +05A0 +FA40 +ENDCHAR +STARTCHAR U_7FE8 +ENCODING 32744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +CB20 +3F80 +2080 +FFE0 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_7FE9 +ENCODING 32745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +8920 +FDA0 +8360 +F920 +AB60 +FDA0 +A920 +A920 +8B60 +ENDCHAR +STARTCHAR U_7FEA +ENCODING 32746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +26A0 +B760 +6FE0 +2540 +2620 +6DC0 +B740 +2480 +2540 +6E20 +ENDCHAR +STARTCHAR U_7FEB +ENCODING 32747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2400 +B400 +6FE0 +B540 +1540 +7D40 +4540 +7D40 +4540 +7E60 +ENDCHAR +STARTCHAR U_7FEC +ENCODING 32748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +4A40 +39C0 +4A40 +FFE0 +A4A0 +3F80 +2480 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_7FED +ENCODING 32749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FCC0 +2540 +B640 +6FE0 +2500 +25E0 +6D40 +B5E0 +2540 +25A0 +6D20 +ENDCHAR +STARTCHAR U_7FEE +ENCODING 32750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4920 +7DA0 +0360 +FD20 +D760 +FDA0 +A520 +FD20 +A520 +8F60 +ENDCHAR +STARTCHAR U_7FEF +ENCODING 32751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4920 +38E0 +4920 +FFE0 +1080 +1F80 +0000 +7FE0 +5120 +5F60 +ENDCHAR +STARTCHAR U_7FF0 +ENCODING 32752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FA40 +2420 +F000 +97E0 +F920 +95A0 +F360 +25A0 +F920 +2360 +ENDCHAR +STARTCHAR U_7FF1 +ENCODING 32753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +8DA0 +FB60 +8920 +F920 +2360 +FDA0 +A920 +F520 +2260 +ENDCHAR +STARTCHAR U_7FF2 +ENCODING 32754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2920 +FDA0 +AB60 +FD20 +0120 +7B60 +05A0 +FD20 +5520 +B360 +ENDCHAR +STARTCHAR U_7FF3 +ENCODING 32755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +FC60 +93C0 +A980 +C660 +FBC0 +4A40 +39C0 +CA40 +18C0 +ENDCHAR +STARTCHAR U_7FF4 +ENCODING 32756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2C80 +ABE0 +7AA0 +2FE0 +2AA0 +7BE0 +AA80 +2BE0 +2A80 +7DE0 +ENDCHAR +STARTCHAR U_7FF5 +ENCODING 32757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2BC0 +AA40 +7BC0 +2A40 +2BE0 +7A00 +ABE0 +2820 +2AA0 +7D60 +ENDCHAR +STARTCHAR U_7FF6 +ENCODING 32758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +8920 +FDA0 +8B60 +F920 +AB60 +75A0 +A920 +FDA0 +2240 +ENDCHAR +STARTCHAR U_7FF7 +ENCODING 32759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +54A0 +FEA0 +55E0 +90A0 +48A0 +7DE0 +AAA0 +7EA0 +48A0 +89E0 +ENDCHAR +STARTCHAR U_7FF8 +ENCODING 32760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +6DA0 +FB60 +4920 +7920 +4B60 +7DA0 +4920 +7920 +CF60 +ENDCHAR +STARTCHAR U_7FF9 +ENCODING 32761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F8A0 +22E0 +F9A0 +48A0 +FDE0 +4AA0 +FCA0 +29E0 +4820 +87E0 +ENDCHAR +STARTCHAR U_7FFA +ENCODING 32762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +FFE0 +A920 +DDA0 +AB60 +F920 +AB60 +75A0 +A920 +F9E0 +2340 +ENDCHAR +STARTCHAR U_7FFB +ENCODING 32763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7E0 +A920 +FDA0 +7360 +A920 +FB60 +ADA0 +F920 +A920 +FB60 +ENDCHAR +STARTCHAR U_7FFC +ENCODING 32764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4920 +38E0 +4920 +7FC0 +2480 +7FC0 +0900 +FFE0 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_7FFD +ENCODING 32765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5120 +FDA0 +0B60 +FD20 +8920 +FB60 +ADA0 +E920 +B520 +C260 +ENDCHAR +STARTCHAR U_7FFE +ENCODING 32766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A920 +FDA0 +0360 +FD20 +4920 +7B60 +25A0 +D920 +5920 +6760 +ENDCHAR +STARTCHAR U_7FFF +ENCODING 32767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +10A0 +FEE0 +11A0 +7CA0 +04A0 +FDE0 +A6A0 +BCA0 +E4A0 +0DE0 +ENDCHAR +STARTCHAR U_8000 +ENCODING 32768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +ADA0 +7360 +27E0 +FC80 +57E0 +5480 +57E0 +9C80 +97E0 +ENDCHAR +STARTCHAR U_8001 +ENCODING 32769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0440 +3F80 +0500 +FFE0 +0800 +1980 +2E00 +C840 +0840 +07C0 +ENDCHAR +STARTCHAR U_8002 +ENCODING 32770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7F40 +0840 +0880 +FFE0 +0200 +0400 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_8003 +ENCODING 32771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +7F80 +0900 +FFE0 +0400 +0FC0 +3400 +CF80 +0080 +0080 +0700 +ENDCHAR +STARTCHAR U_8004 +ENCODING 32772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +7F00 +0A00 +FFC0 +2820 +C7E0 +0300 +7C00 +07C0 +FC20 +03E0 +ENDCHAR +STARTCHAR U_8005 +ENCODING 32773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F40 +0480 +0500 +FFE0 +0800 +3F80 +D080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8006 +ENCODING 32774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +7E80 +0500 +FFC0 +1200 +F420 +1FE0 +1040 +1FC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_8007 +ENCODING 32775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +7F80 +0900 +FFE0 +0800 +1FC0 +2040 +5E40 +1240 +1E40 +0180 +ENDCHAR +STARTCHAR U_8008 +ENCODING 32776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F40 +0480 +7FE0 +0840 +37C0 +C800 +1FC0 +6940 +0F40 +00C0 +ENDCHAR +STARTCHAR U_8009 +ENCODING 32777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F40 +0480 +FFE0 +0800 +3FC0 +C800 +1FC0 +1240 +1240 +1EC0 +ENDCHAR +STARTCHAR U_800A +ENCODING 32778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F40 +0480 +FFE0 +0600 +3900 +DF80 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_800B +ENCODING 32779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0840 +7F80 +0A00 +FFE0 +3200 +5420 +FFE0 +1100 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_800C +ENCODING 32780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0800 +7FE0 +4920 +4920 +4920 +4920 +4920 +4920 +40E0 +ENDCHAR +STARTCHAR U_800D +ENCODING 32781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4A40 +4A40 +08C0 +FFE0 +1100 +1A00 +0700 +78E0 +ENDCHAR +STARTCHAR U_800E +ENCODING 32782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +4A40 +4A40 +44C0 +0400 +7FE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_800F +ENCODING 32783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +1080 +2100 +FE20 +AA40 +AA80 +AB20 +AA20 +AA40 +AA80 +8700 +ENDCHAR +STARTCHAR U_8010 +ENCODING 32784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +1040 +21E0 +FE40 +AA40 +AB40 +AAC0 +AA40 +AA40 +A240 +86C0 +ENDCHAR +STARTCHAR U_8011 +ENCODING 32785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0000 +FFE0 +0400 +7FC0 +4A40 +4A40 +4A40 +40C0 +ENDCHAR +STARTCHAR U_8012 +ENCODING 32786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8013 +ENCODING 32787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2080 +7080 +2080 +F880 +2080 +7080 +A880 +2080 +2180 +ENDCHAR +STARTCHAR U_8014 +ENCODING 32788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2040 +F880 +2080 +FBE0 +2080 +7080 +A880 +2080 +2180 +ENDCHAR +STARTCHAR U_8015 +ENCODING 32789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FA40 +27E0 +FA40 +2240 +FFE0 +2240 +3240 +6A40 +A440 +2840 +ENDCHAR +STARTCHAR U_8016 +ENCODING 32790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8C0 +22A0 +FAA0 +2480 +FCA0 +20A0 +7040 +A880 +A100 +2E00 +ENDCHAR +STARTCHAR U_8017 +ENCODING 32791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +2100 +F9C0 +2700 +F960 +2780 +7100 +A920 +2120 +20E0 +ENDCHAR +STARTCHAR U_8018 +ENCODING 32792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +F800 +2000 +F800 +27E0 +F900 +2100 +7200 +AA40 +A460 +27A0 +ENDCHAR +STARTCHAR U_8019 +ENCODING 32793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +22A0 +FAA0 +22A0 +FBE0 +2200 +7200 +AA20 +A220 +21E0 +ENDCHAR +STARTCHAR U_801A +ENCODING 32794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +27E0 +FCA0 +2480 +FFE0 +2520 +7540 +AC80 +2540 +2A20 +ENDCHAR +STARTCHAR U_801B +ENCODING 32795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2240 +FA60 +27A0 +F800 +23E0 +7220 +AA20 +ABE0 +2220 +ENDCHAR +STARTCHAR U_801C +ENCODING 32796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FBC0 +2240 +FA00 +23E0 +7220 +AA20 +ABE0 +2220 +ENDCHAR +STARTCHAR U_801D +ENCODING 32797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2240 +7240 +23C0 +FA40 +3240 +6BC0 +A640 +2240 +27E0 +ENDCHAR +STARTCHAR U_801E +ENCODING 32798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +FEE0 +2AA0 +FAA0 +2AA0 +FAA0 +2AA0 +7AA0 +AAA0 +AAE0 +34A0 +ENDCHAR +STARTCHAR U_801F +ENCODING 32799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +2200 +FBE0 +2220 +FA20 +23E0 +7220 +AA00 +AA00 +23E0 +ENDCHAR +STARTCHAR U_8020 +ENCODING 32800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F980 +2240 +FC20 +25C0 +F800 +23E0 +7220 +AA20 +ABE0 +2220 +ENDCHAR +STARTCHAR U_8021 +ENCODING 32801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +FA80 +4BE0 +FEA0 +4AA0 +FAA0 +4EA0 +6AA0 +DAA0 +5F20 +4260 +ENDCHAR +STARTCHAR U_8022 +ENCODING 32802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F7E0 +2140 +FFE0 +2420 +F900 +27E0 +7120 +A920 +AA20 +24C0 +ENDCHAR +STARTCHAR U_8023 +ENCODING 32803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +7BA0 +2000 +FFE0 +2AA0 +7FE0 +AAA0 +2AA0 +2840 +ENDCHAR +STARTCHAR U_8024 +ENCODING 32804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +2000 +FBC0 +2240 +73C0 +AA40 +ABC0 +2240 +ENDCHAR +STARTCHAR U_8025 +ENCODING 32805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +F520 +2340 +FFE0 +2820 +FBA0 +2AA0 +7BA0 +AAA0 +2820 +2860 +ENDCHAR +STARTCHAR U_8026 +ENCODING 32806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +FD40 +27C0 +F900 +27E0 +7560 +AFA0 +A420 +2460 +ENDCHAR +STARTCHAR U_8027 +ENCODING 32807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FB40 +27E0 +FB80 +2540 +F920 +2100 +77E0 +AA40 +2180 +2660 +ENDCHAR +STARTCHAR U_8028 +ENCODING 32808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +4BC0 +F800 +4FE0 +FAA0 +4B40 +6840 +DFE0 +5440 +62C0 +ENDCHAR +STARTCHAR U_8029 +ENCODING 32809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +2240 +FFE0 +2540 +77C0 +AD40 +AFE0 +24C0 +ENDCHAR +STARTCHAR U_802A +ENCODING 32810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2280 +FFE0 +2520 +FFE0 +2200 +73C0 +AA40 +A440 +2880 +ENDCHAR +STARTCHAR U_802B +ENCODING 32811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +77C0 +2100 +FFE0 +3440 +6FC0 +A440 +27C0 +2820 +ENDCHAR +STARTCHAR U_802C +ENCODING 32812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2540 +FFE0 +2540 +FFE0 +2520 +77E0 +AA40 +A180 +2E60 +ENDCHAR +STARTCHAR U_802D +ENCODING 32813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2340 +FD40 +27A0 +7340 +25A0 +FFE0 +34A0 +6EC0 +A4A0 +2960 +3220 +ENDCHAR +STARTCHAR U_802E +ENCODING 32814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +75A0 +2FE0 +F820 +2100 +77E0 +A920 +2220 +2460 +ENDCHAR +STARTCHAR U_802F +ENCODING 32815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FFE0 +2280 +77E0 +2480 +FFC0 +3480 +6FE0 +A480 +2300 +2CE0 +ENDCHAR +STARTCHAR U_8030 +ENCODING 32816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA40 +23C0 +7240 +2FE0 +FAA0 +23C0 +7660 +A980 +AA40 +2420 +ENDCHAR +STARTCHAR U_8031 +ENCODING 32817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2A40 +FFE0 +2A40 +FF60 +2AC0 +7A40 +AFE0 +AA20 +33E0 +ENDCHAR +STARTCHAR U_8032 +ENCODING 32818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2540 +77C0 +2540 +FB80 +3540 +6A20 +A540 +2C80 +3660 +ENDCHAR +STARTCHAR U_8033 +ENCODING 32819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +2100 +2100 +3F00 +2100 +3F00 +2100 +21C0 +FF00 +0100 +0100 +ENDCHAR +STARTCHAR U_8034 +ENCODING 32820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4900 +4900 +7900 +4900 +7900 +4900 +4D00 +F920 +0920 +08E0 +ENDCHAR +STARTCHAR U_8035 +ENCODING 32821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +4BE0 +4880 +7880 +4880 +7880 +4880 +4C80 +F880 +0A80 +0900 +ENDCHAR +STARTCHAR U_8036 +ENCODING 32822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +4920 +4920 +7940 +4940 +7920 +4920 +4D20 +F9A0 +0940 +0900 +ENDCHAR +STARTCHAR U_8037 +ENCODING 32823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +FFE0 +2100 +3F00 +2100 +3F00 +21E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8038 +ENCODING 32824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2A80 +4440 +FFE0 +2100 +3F00 +2100 +3F00 +2100 +FFE0 +0100 +ENDCHAR +STARTCHAR U_8039 +ENCODING 32825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4980 +4A40 +7D20 +4880 +7800 +4FE0 +4840 +FC80 +0880 +0900 +ENDCHAR +STARTCHAR U_803A +ENCODING 32826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBC0 +5000 +7000 +57E0 +7100 +5100 +5A40 +77E0 +D240 +1000 +ENDCHAR +STARTCHAR U_803B +ENCODING 32827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4880 +4880 +7A80 +4AE0 +7A80 +4A80 +4E80 +FA80 +0A80 +0FE0 +ENDCHAR +STARTCHAR U_803C +ENCODING 32828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +5240 +77E0 +5240 +7240 +57E0 +5A40 +F240 +1240 +12C0 +ENDCHAR +STARTCHAR U_803D +ENCODING 32829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +57E0 +7520 +5100 +7280 +5280 +5280 +FAA0 +14A0 +1860 +ENDCHAR +STARTCHAR U_803E +ENCODING 32830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4900 +4FE0 +7900 +4940 +7940 +4A40 +4A80 +FCA0 +0920 +09E0 +ENDCHAR +STARTCHAR U_803F +ENCODING 32831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4880 +4880 +7AA0 +4AC0 +7C80 +4880 +4880 +FD40 +0A20 +0C20 +ENDCHAR +STARTCHAR U_8040 +ENCODING 32832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD40 +5120 +77E0 +5100 +7140 +5140 +5880 +70A0 +D160 +1220 +ENDCHAR +STARTCHAR U_8041 +ENCODING 32833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FA80 +5280 +7440 +5820 +77C0 +5240 +5A40 +7240 +D540 +1880 +ENDCHAR +STARTCHAR U_8042 +ENCODING 32834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +3F00 +2100 +FFE0 +0100 +FFC0 +4A40 +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_8043 +ENCODING 32835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +57C0 +7540 +57C0 +7540 +5540 +5FE0 +F440 +1440 +14C0 +ENDCHAR +STARTCHAR U_8044 +ENCODING 32836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +5280 +7C60 +5100 +7640 +5080 +5920 +7640 +D080 +1700 +ENDCHAR +STARTCHAR U_8045 +ENCODING 32837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +57C0 +7500 +5900 +77E0 +5100 +5A80 +7280 +D440 +1820 +ENDCHAR +STARTCHAR U_8046 +ENCODING 32838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4980 +4A40 +7D20 +4880 +7800 +4FE0 +4840 +F980 +0880 +0840 +ENDCHAR +STARTCHAR U_8047 +ENCODING 32839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4880 +4880 +7880 +4A80 +7AE0 +4A80 +4E80 +FA80 +0A80 +0FE0 +ENDCHAR +STARTCHAR U_8048 +ENCODING 32840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +5480 +5880 +7BE0 +5EA0 +74A0 +54A0 +5AA0 +FEA0 +11A0 +1240 +ENDCHAR +STARTCHAR U_8049 +ENCODING 32841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FC80 +52A0 +72A0 +52A0 +73E0 +5080 +5AA0 +72A0 +D2A0 +13E0 +ENDCHAR +STARTCHAR U_804A +ENCODING 32842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +ACE0 +AAA0 +EAA0 +AAA0 +EAA0 +AAA0 +AEA0 +F2E0 +2480 +2880 +ENDCHAR +STARTCHAR U_804B +ENCODING 32843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +1480 +2520 +DFE0 +0000 +FFE0 +2100 +3F00 +2100 +FFE0 +ENDCHAR +STARTCHAR U_804C +ENCODING 32844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A20 +4A20 +7A20 +4A20 +7BE0 +4800 +4D40 +F940 +0A20 +0C20 +ENDCHAR +STARTCHAR U_804D +ENCODING 32845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4BE0 +4A20 +7800 +4FE0 +7880 +4880 +4C80 +F880 +0A80 +0900 +ENDCHAR +STARTCHAR U_804E +ENCODING 32846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +52A0 +76C0 +5280 +72C0 +56A0 +5A80 +72A0 +D2A0 +1460 +ENDCHAR +STARTCHAR U_804F +ENCODING 32847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A100 +A200 +EFE0 +AAA0 +EAA0 +AAA0 +AAA0 +FAA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_8050 +ENCODING 32848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +4880 +4FE0 +7880 +4BE0 +7800 +4BE0 +5E20 +EA20 +0BE0 +0A20 +ENDCHAR +STARTCHAR U_8051 +ENCODING 32849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +4A40 +7BC0 +4A40 +7BC0 +4A40 +4E60 +FBC0 +0840 +0840 +ENDCHAR +STARTCHAR U_8052 +ENCODING 32850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +5380 +5080 +77E0 +5080 +7080 +53E0 +5220 +FA20 +13E0 +1220 +ENDCHAR +STARTCHAR U_8053 +ENCODING 32851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +22A0 +3BA0 +E2E0 +0400 +7FC0 +1100 +1F00 +11E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8054 +ENCODING 32852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +5280 +57E0 +7100 +5100 +7FE0 +5100 +5100 +FA80 +1440 +1820 +ENDCHAR +STARTCHAR U_8055 +ENCODING 32853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FA80 +53E0 +7480 +57E0 +7000 +53E0 +5A20 +7220 +D3E0 +1220 +ENDCHAR +STARTCHAR U_8056 +ENCODING 32854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +49E0 +7920 +4920 +FDE0 +0800 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8057 +ENCODING 32855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +57E0 +7540 +5540 +7BA0 +5100 +5A80 +7280 +D440 +1820 +ENDCHAR +STARTCHAR U_8058 +ENCODING 32856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +52A0 +73E0 +52A0 +77E0 +5100 +5BE0 +F020 +1020 +11C0 +ENDCHAR +STARTCHAR U_8059 +ENCODING 32857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +5100 +77C0 +5100 +7FE0 +5440 +5FC0 +7440 +D7C0 +1440 +ENDCHAR +STARTCHAR U_805A +ENCODING 32858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4520 +7CC0 +44C0 +FF20 +05C0 +7E40 +0A80 +7700 +0A80 +7260 +ENDCHAR +STARTCHAR U_805B +ENCODING 32859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5520 +77E0 +5520 +77E0 +5280 +5C80 +77E0 +D080 +1080 +ENDCHAR +STARTCHAR U_805C +ENCODING 32860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5420 +7240 +5420 +7800 +57C0 +5900 +F100 +1100 +1FE0 +ENDCHAR +STARTCHAR U_805D +ENCODING 32861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +50A0 +57E0 +7080 +5780 +75A0 +57A0 +50C0 +F960 +16A0 +1120 +ENDCHAR +STARTCHAR U_805E +ENCODING 32862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +FFC0 +9240 +9E40 +9240 +9FC0 +F240 +82C0 +ENDCHAR +STARTCHAR U_805F +ENCODING 32863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3BC0 +5240 +FFC0 +2800 +7FC0 +9100 +1F00 +11E0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8060 +ENCODING 32864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FA40 +5240 +77E0 +5240 +7240 +57E0 +5A40 +7240 +D240 +1440 +ENDCHAR +STARTCHAR U_8061 +ENCODING 32865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FA80 +5540 +7920 +5240 +77C0 +5200 +5D40 +7520 +DC60 +13C0 +ENDCHAR +STARTCHAR U_8062 +ENCODING 32866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +57E0 +7420 +53C0 +7500 +55C0 +5D00 +7500 +D700 +18E0 +ENDCHAR +STARTCHAR U_8063 +ENCODING 32867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FEC0 +5440 +76C0 +5440 +77C0 +5280 +5A80 +7280 +D2A0 +1460 +ENDCHAR +STARTCHAR U_8064 +ENCODING 32868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +73C0 +5000 +77E0 +5420 +53C0 +F880 +1280 +1100 +ENDCHAR +STARTCHAR U_8065 +ENCODING 32869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F900 +57C0 +7540 +57C0 +7100 +57E0 +5D20 +77E0 +D4A0 +1440 +ENDCHAR +STARTCHAR U_8066 +ENCODING 32870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBE0 +5560 +72A0 +55A0 +7160 +5200 +5D40 +7520 +DC60 +13C0 +ENDCHAR +STARTCHAR U_8067 +ENCODING 32871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +55A0 +52C0 +7440 +5420 +7BC0 +5100 +57E0 +F900 +1280 +1460 +ENDCHAR +STARTCHAR U_8068 +ENCODING 32872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FDA0 +56E0 +7240 +55A0 +76E0 +5240 +5FE0 +7240 +D240 +1440 +ENDCHAR +STARTCHAR U_8069 +ENCODING 32873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +5540 +7FE0 +5000 +77C0 +5440 +5540 +FD40 +1280 +1C60 +ENDCHAR +STARTCHAR U_806A +ENCODING 32874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FA80 +57C0 +5440 +7440 +57C0 +7100 +5AA0 +F6A0 +1A40 +11C0 +ENDCHAR +STARTCHAR U_806B +ENCODING 32875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +55A0 +76C0 +5240 +75A0 +56E0 +5100 +7FE0 +D280 +1460 +ENDCHAR +STARTCHAR U_806C +ENCODING 32876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5240 +5520 +7240 +57E0 +7000 +57E0 +55A0 +FB60 +15A0 +1360 +ENDCHAR +STARTCHAR U_806D +ENCODING 32877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA00 +57C0 +7540 +57C0 +7540 +57C0 +5940 +73E0 +D520 +18E0 +ENDCHAR +STARTCHAR U_806E +ENCODING 32878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +FA40 +55A0 +76E0 +5240 +75A0 +56E0 +5800 +7540 +DAA0 +12A0 +ENDCHAR +STARTCHAR U_806F +ENCODING 32879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +A440 +AAA0 +E440 +AAA0 +A660 +EAA0 +AAA0 +AEE0 +F280 +2C80 +ENDCHAR +STARTCHAR U_8070 +ENCODING 32880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +56A0 +7520 +56A0 +77E0 +5100 +52C0 +FE20 +1260 +11C0 +ENDCHAR +STARTCHAR U_8071 +ENCODING 32881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +2340 +FC80 +4940 +FFE0 +2080 +3F80 +2080 +FFE0 +0080 +ENDCHAR +STARTCHAR U_8072 +ENCODING 32882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FD40 +5620 +57C0 +7C80 +8140 +FFE0 +1080 +1F80 +1080 +FFE0 +ENDCHAR +STARTCHAR U_8073 +ENCODING 32883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AB40 +5220 +C9C0 +4D00 +53E0 +FF00 +2100 +3F00 +2100 +FFE0 +ENDCHAR +STARTCHAR U_8074 +ENCODING 32884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5100 +77E0 +55A0 +77E0 +5200 +5D40 +7520 +DC40 +13C0 +ENDCHAR +STARTCHAR U_8075 +ENCODING 32885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +5540 +7FE0 +5440 +77C0 +5440 +5FC0 +F440 +17C0 +1C60 +ENDCHAR +STARTCHAR U_8076 +ENCODING 32886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0880 +0F80 +0880 +7FE0 +0080 +7FE0 +4A40 +7BC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8077 +ENCODING 32887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +AFC0 +AAA0 +E480 +BFE0 +A080 +EEA0 +AAC0 +AEA0 +FB60 +2E20 +ENDCHAR +STARTCHAR U_8078 +ENCODING 32888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +57E0 +5D40 +76A0 +57E0 +7400 +55E0 +5400 +FDE0 +1520 +19E0 +ENDCHAR +STARTCHAR U_8079 +ENCODING 32889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +AD60 +E7C0 +A820 +EFE0 +AAA0 +AFE0 +F100 +2100 +2300 +ENDCHAR +STARTCHAR U_807A +ENCODING 32890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5420 +77E0 +5AA0 +7540 +5820 +5FE0 +7100 +D540 +1B20 +ENDCHAR +STARTCHAR U_807B +ENCODING 32891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +3F00 +A9E0 +7F40 +8940 +FFE0 +1100 +1F00 +1100 +FFE0 +0100 +ENDCHAR +STARTCHAR U_807C +ENCODING 32892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +17E0 +F900 +5FE0 +7AA0 +5FE0 +7000 +5FE0 +7540 +DCA0 +1380 +ENDCHAR +STARTCHAR U_807D +ENCODING 32893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +5FE0 +7100 +5FE0 +FAA0 +1FE0 +F000 +5FE0 +F6A0 +5A40 +F1C0 +ENDCHAR +STARTCHAR U_807E +ENCODING 32894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2900 +FFE0 +4500 +7DC0 +4520 +FFE0 +1080 +1F80 +1080 +7FE0 +ENDCHAR +STARTCHAR U_807F +ENCODING 32895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +FFE0 +0480 +3F80 +0400 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8080 +ENCODING 32896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +0440 +FFE0 +0440 +3FC0 +0440 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_8081 +ENCODING 32897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4400 +5F80 +4480 +5FC0 +4480 +BFC0 +8400 +ENDCHAR +STARTCHAR U_8082 +ENCODING 32898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2140 +3FE0 +4940 +B7C0 +1100 +27C0 +4100 +8FE0 +0100 +ENDCHAR +STARTCHAR U_8083 +ENCODING 32899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +FFE0 +0440 +7FC0 +0400 +5640 +5540 +6540 +8440 +ENDCHAR +STARTCHAR U_8084 +ENCODING 32900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +67C0 +4940 +7FE0 +8140 +F7C0 +A100 +FFC0 +2100 +5FE0 +8900 +ENDCHAR +STARTCHAR U_8085 +ENCODING 32901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0440 +7FE0 +0440 +7FC0 +5540 +7FC0 +4440 +75C0 +9540 +ENDCHAR +STARTCHAR U_8086 +ENCODING 32902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +77C0 +4140 +77E0 +4140 +77C0 +4100 +F7C0 +5100 +FFE0 +0100 +ENDCHAR +STARTCHAR U_8087 +ENCODING 32903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4940 +7CC0 +8520 +7FE0 +0480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8088 +ENCODING 32904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +7FE0 +4940 +7880 +4560 +BF80 +0480 +7FE0 +0480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8089 +ENCODING 32905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +9480 +E280 +8880 +8880 +9480 +E280 +8080 +8180 +ENDCHAR +STARTCHAR U_808A +ENCODING 32906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4FC0 +4840 +7840 +4880 +4880 +7900 +4900 +4A20 +8A20 +99E0 +ENDCHAR +STARTCHAR U_808B +ENCODING 32907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7FE0 +4920 +4920 +7920 +4920 +4A20 +8D20 +98C0 +ENDCHAR +STARTCHAR U_808C +ENCODING 32908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +9480 +9480 +F480 +9480 +9480 +F480 +9480 +94A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_808D +ENCODING 32909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +5780 +7280 +5280 +5280 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_808E +ENCODING 32910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +8040 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_808F +ENCODING 32911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +0A00 +3180 +C460 +7FC0 +4440 +4A40 +5540 +4A40 +5140 +61C0 +ENDCHAR +STARTCHAR U_8090 +ENCODING 32912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7C00 +4BC0 +4840 +7880 +4900 +4A20 +8A20 +99E0 +ENDCHAR +STARTCHAR U_8091 +ENCODING 32913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +53E0 +7420 +5820 +5220 +7120 +5120 +5020 +90A0 +B040 +ENDCHAR +STARTCHAR U_8092 +ENCODING 32914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +5F80 +7280 +5680 +5280 +7380 +5280 +54A0 +98A0 +B060 +ENDCHAR +STARTCHAR U_8093 +ENCODING 32915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8094 +ENCODING 32916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5500 +7FC0 +5540 +5540 +7540 +55C0 +5520 +9420 +B3E0 +ENDCHAR +STARTCHAR U_8095 +ENCODING 32917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5120 +5120 +7120 +5520 +5520 +7920 +5120 +5220 +92A0 +B440 +ENDCHAR +STARTCHAR U_8096 +ENCODING 32918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +8880 +4900 +2A00 +7F00 +4100 +7F00 +4100 +7F00 +4100 +4100 +4300 +ENDCHAR +STARTCHAR U_8097 +ENCODING 32919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +5100 +7FE0 +5240 +5240 +7440 +5280 +5100 +9280 +B440 +ENDCHAR +STARTCHAR U_8098 +ENCODING 32920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +4840 +4840 +7FE0 +4840 +4A40 +7940 +4940 +4840 +8940 +9880 +ENDCHAR +STARTCHAR U_8099 +ENCODING 32921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +7E +42 +7E +00 +FF +81 +FF +81 +FF +81 +87 +ENDCHAR +STARTCHAR U_809A +ENCODING 32922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7900 +4FC0 +4900 +7900 +4900 +4900 +8900 +9FE0 +ENDCHAR +STARTCHAR U_809B +ENCODING 32923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BE0 +4880 +7880 +4880 +4880 +7880 +4880 +4880 +8FE0 +9800 +ENDCHAR +STARTCHAR U_809C +ENCODING 32924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +4880 +4900 +7A60 +4840 +4880 +7900 +4A60 +4840 +8880 +9B00 +ENDCHAR +STARTCHAR U_809D +ENCODING 32925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4880 +7880 +4880 +4FE0 +7880 +4880 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_809E +ENCODING 32926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5540 +7540 +5280 +5280 +7100 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_809F +ENCODING 32927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4800 +4800 +7FE0 +4A00 +4FE0 +7820 +4820 +4820 +8920 +98C0 +ENDCHAR +STARTCHAR U_80A0 +ENCODING 32928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4880 +4900 +7A00 +4FE0 +4AA0 +7CA0 +4920 +4A20 +8D20 +98C0 +ENDCHAR +STARTCHAR U_80A1 +ENCODING 32929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7C60 +4800 +4BE0 +7A20 +4940 +4880 +8940 +9E20 +ENDCHAR +STARTCHAR U_80A2 +ENCODING 32930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4FE0 +7880 +4BE0 +4A20 +7A20 +4940 +4880 +8940 +9E20 +ENDCHAR +STARTCHAR U_80A3 +ENCODING 32931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4A80 +4C40 +7920 +4880 +4800 +7FE0 +4820 +4840 +8880 +9900 +ENDCHAR +STARTCHAR U_80A4 +ENCODING 32932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FC0 +7900 +4900 +4FE0 +7900 +4900 +4A80 +8C40 +9820 +ENDCHAR +STARTCHAR U_80A5 +ENCODING 32933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +4AA0 +7AA0 +4BE0 +4A20 +7A00 +4A00 +4A20 +8A20 +99E0 +ENDCHAR +STARTCHAR U_80A6 +ENCODING 32934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5280 +7440 +5820 +57C0 +7240 +5240 +5240 +9540 +B880 +ENDCHAR +STARTCHAR U_80A7 +ENCODING 32935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5100 +7300 +5300 +5540 +7520 +5920 +5100 +9100 +B100 +ENDCHAR +STARTCHAR U_80A8 +ENCODING 32936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57C0 +7100 +5100 +57C0 +7100 +5FE0 +5100 +9100 +B100 +ENDCHAR +STARTCHAR U_80A9 +ENCODING 32937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +0400 +3FC0 +2040 +3FC0 +2000 +2FC0 +2840 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_80AA +ENCODING 32938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7900 +49E0 +4920 +7920 +4920 +4A20 +8A20 +9CC0 +ENDCHAR +STARTCHAR U_80AB +ENCODING 32939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4FE0 +7880 +4AA0 +4AA0 +7BE0 +4880 +48A0 +88A0 +9860 +ENDCHAR +STARTCHAR U_80AC +ENCODING 32940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7280 +5240 +57E0 +7280 +5280 +7280 +5480 +54A0 +54A0 +B8E0 +ENDCHAR +STARTCHAR U_80AD +ENCODING 32941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4BE0 +7AA0 +4AA0 +4AA0 +7B60 +4A20 +4A20 +8A20 +9A60 +ENDCHAR +STARTCHAR U_80AE +ENCODING 32942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7000 +5780 +5480 +7480 +5480 +5480 +94A0 +B860 +ENDCHAR +STARTCHAR U_80AF +ENCODING 32943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_80B0 +ENCODING 32944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5140 +5120 +7FE0 +5100 +5100 +7100 +5280 +5240 +D440 +B820 +ENDCHAR +STARTCHAR U_80B1 +ENCODING 32945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FE0 +7900 +4940 +4A40 +7A80 +4A80 +4D40 +8FA0 +9820 +ENDCHAR +STARTCHAR U_80B2 +ENCODING 32946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +7FC0 +0040 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_80B3 +ENCODING 32947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5200 +53E0 +7560 +5560 +5AA0 +72A0 +54A0 +5120 +9260 +B440 +ENDCHAR +STARTCHAR U_80B4 +ENCODING 32948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71C0 +0E00 +71C0 +0400 +FFE0 +1080 +3F80 +5080 +9F80 +1080 +1380 +ENDCHAR +STARTCHAR U_80B5 +ENCODING 32949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4A00 +7A00 +4BE0 +4A40 +7A40 +4A40 +4A40 +8C40 +9840 +ENDCHAR +STARTCHAR U_80B6 +ENCODING 32950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +7480 +5480 +54A0 +77C0 +5480 +7480 +5480 +55A0 +96A0 +B4E0 +ENDCHAR +STARTCHAR U_80B7 +ENCODING 32951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7C20 +4880 +4880 +7880 +4880 +4940 +8A20 +9C20 +ENDCHAR +STARTCHAR U_80B8 +ENCODING 32952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +4A80 +4C40 +7920 +4900 +4900 +7FE0 +4900 +4900 +8900 +9900 +ENDCHAR +STARTCHAR U_80B9 +ENCODING 32953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5440 +7440 +5FA0 +5200 +77C0 +5040 +5040 +9140 +B080 +ENDCHAR +STARTCHAR U_80BA +ENCODING 32954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +7100 +57E0 +5520 +7520 +5520 +5560 +9100 +B100 +ENDCHAR +STARTCHAR U_80BB +ENCODING 32955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4020 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_80BC +ENCODING 32956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4A40 +4FE0 +7A40 +4A40 +4FE0 +7A40 +4A40 +4A40 +8C40 +9840 +ENDCHAR +STARTCHAR U_80BD +ENCODING 32957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7FE0 +4900 +4900 +7900 +4980 +4A40 +8D60 +9920 +ENDCHAR +STARTCHAR U_80BE +ENCODING 32958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +9280 +9100 +96E0 +3F80 +2080 +3F80 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_80BF +ENCODING 32959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4BE0 +7AA0 +4AA0 +4AA0 +7BE0 +4AA0 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_80C0 +ENCODING 32960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +4A40 +4A80 +7B00 +4A00 +4FE0 +7A80 +4A80 +4A80 +8B40 +9A20 +ENDCHAR +STARTCHAR U_80C1 +ENCODING 32961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +9FC0 +F140 +9540 +9540 +FA60 +9240 +9440 +9A40 +B180 +ENDCHAR +STARTCHAR U_80C2 +ENCODING 32962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5080 +57E0 +74A0 +57E0 +54A0 +77E0 +54A0 +5080 +9080 +B080 +ENDCHAR +STARTCHAR U_80C3 +ENCODING 32963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +8880 +FF80 +8880 +FF80 +4100 +7F00 +4100 +7F00 +4100 +4700 +ENDCHAR +STARTCHAR U_80C4 +ENCODING 32964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +FF80 +8880 +FF80 +8880 +FF80 +4100 +7F00 +4100 +7F00 +4100 +ENDCHAR +STARTCHAR U_80C5 +ENCODING 32965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5500 +57C0 +7900 +5100 +5FE0 +7100 +5280 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_80C6 +ENCODING 32966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +4BC0 +4A40 +7A40 +4BC0 +4A40 +7A40 +4BC0 +4800 +8800 +9FE0 +ENDCHAR +STARTCHAR U_80C7 +ENCODING 32967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +52A0 +77E0 +5A80 +5FE0 +72A0 +52A0 +52E0 +5480 +B880 +ENDCHAR +STARTCHAR U_80C8 +ENCODING 32968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4920 +4FE0 +7900 +49C0 +4940 +7940 +4A80 +4AC0 +8D20 +9A20 +ENDCHAR +STARTCHAR U_80C9 +ENCODING 32969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4900 +4BE0 +7A20 +4A20 +4BE0 +7A20 +4A20 +4A20 +8BE0 +9A20 +ENDCHAR +STARTCHAR U_80CA +ENCODING 32970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7C20 +4BA0 +4AA0 +7AA0 +4BA0 +4820 +8920 +98C0 +ENDCHAR +STARTCHAR U_80CB +ENCODING 32971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +51E0 +7100 +5100 +57E0 +7420 +5420 +5420 +97E0 +B420 +ENDCHAR +STARTCHAR U_80CC +ENCODING 32972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +F380 +1220 +33E0 +C000 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_80CD +ENCODING 32973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7060 +57C0 +5540 +7540 +5540 +5540 +7540 +5540 +5540 +95E0 +9940 +ENDCHAR +STARTCHAR U_80CE +ENCODING 32974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4A40 +7FE0 +4820 +4BC0 +7A40 +4A40 +4A40 +8BC0 +9A40 +ENDCHAR +STARTCHAR U_80CF +ENCODING 32975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +48A0 +4BC0 +7A80 +4C80 +4FE0 +79A0 +4AA0 +4CE0 +8880 +9880 +ENDCHAR +STARTCHAR U_80D0 +ENCODING 32976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5520 +5520 +7520 +57E0 +5100 +7520 +5520 +5520 +97E0 +B420 +ENDCHAR +STARTCHAR U_80D1 +ENCODING 32977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7A20 +4A20 +4BE0 +7800 +4800 +4A40 +8A20 +9C20 +ENDCHAR +STARTCHAR U_80D2 +ENCODING 32978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7400 +5500 +5540 +7580 +5500 +5500 +9520 +B8E0 +ENDCHAR +STARTCHAR U_80D3 +ENCODING 32979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5540 +7540 +5580 +7FE0 +5100 +5100 +5100 +9100 +B100 +ENDCHAR +STARTCHAR U_80D4 +ENCODING 32980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D80 +5120 +FDE0 +0400 +7FC0 +4440 +4B40 +5440 +4A40 +51C0 +ENDCHAR +STARTCHAR U_80D5 +ENCODING 32981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5240 +5440 +75E0 +5C40 +5640 +7540 +5540 +5440 +9540 +B480 +ENDCHAR +STARTCHAR U_80D6 +ENCODING 32982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5520 +5540 +7100 +57C0 +5100 +7FE0 +5100 +5100 +9100 +9100 +ENDCHAR +STARTCHAR U_80D7 +ENCODING 32983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4A80 +4C40 +7920 +4A80 +4920 +7A40 +4880 +4900 +8A00 +9C00 +ENDCHAR +STARTCHAR U_80D8 +ENCODING 32984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7900 +4A40 +4F80 +7880 +4940 +4A20 +8FE0 +9820 +ENDCHAR +STARTCHAR U_80D9 +ENCODING 32985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A00 +4BE0 +7D00 +49E0 +4900 +7900 +49E0 +4900 +8900 +9900 +ENDCHAR +STARTCHAR U_80DA +ENCODING 32986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +4900 +7900 +4B40 +4D20 +7920 +4900 +4900 +8800 +9FE0 +ENDCHAR +STARTCHAR U_80DB +ENCODING 32987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +4AA0 +7BE0 +4AA0 +4AA0 +7BE0 +4880 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_80DC +ENCODING 32988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5500 +5500 +77E0 +5900 +5100 +77C0 +5100 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_80DD +ENCODING 32989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7040 +5780 +5480 +7480 +57E0 +5480 +7480 +5580 +56A0 +9560 +B4A0 +ENDCHAR +STARTCHAR U_80DE +ENCODING 32990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53E0 +5420 +7FA0 +54A0 +54A0 +77A0 +54C0 +5420 +9420 +B3E0 +ENDCHAR +STARTCHAR U_80DF +ENCODING 32991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5540 +7540 +5FE0 +5440 +7540 +5540 +57E0 +9040 +B180 +ENDCHAR +STARTCHAR U_80E0 +ENCODING 32992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FC0 +7900 +4900 +4FE0 +7900 +4900 +4A40 +8C60 +9FA0 +ENDCHAR +STARTCHAR U_80E1 +ENCODING 32993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +FE20 +13E0 +1220 +7A20 +4BE0 +4A20 +7A20 +4C20 +08E0 +ENDCHAR +STARTCHAR U_80E2 +ENCODING 32994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5040 +5740 +7540 +5540 +5540 +7740 +5540 +5040 +9140 +B080 +ENDCHAR +STARTCHAR U_80E3 +ENCODING 32995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BE0 +4C80 +7AA0 +4AE0 +4FA0 +7AA0 +4AE0 +4A80 +8A20 +99E0 +ENDCHAR +STARTCHAR U_80E4 +ENCODING 32996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +5C80 +4A80 +5F80 +4080 +5E80 +5280 +5E80 +52A0 +9EA0 +9260 +ENDCHAR +STARTCHAR U_80E5 +ENCODING 32997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2440 +2780 +5400 +BFE0 +2080 +3F80 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_80E6 +ENCODING 32998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5100 +57C0 +7540 +5540 +5FE0 +7100 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_80E7 +ENCODING 32999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5240 +5FE0 +7280 +52A0 +52A0 +72C0 +5480 +55A0 +9AA0 +B0E0 +ENDCHAR +STARTCHAR U_80E8 +ENCODING 33000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4900 +7A80 +4A80 +4FE0 +7880 +4AC0 +4AA0 +8CA0 +9980 +ENDCHAR +STARTCHAR U_80E9 +ENCODING 33001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +49E0 +7900 +4FE0 +4900 +7980 +4940 +4920 +8920 +9900 +ENDCHAR +STARTCHAR U_80EA +ENCODING 33002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +48E0 +4880 +7BE0 +4A20 +4A20 +7BE0 +4A00 +4A00 +8A00 +9C00 +ENDCHAR +STARTCHAR U_80EB +ENCODING 33003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5040 +5080 +7140 +5620 +5000 +77C0 +5100 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_80EC +ENCODING 33004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F940 +5080 +3B60 +C400 +7FC0 +4A40 +5540 +4440 +4A40 +5140 +ENDCHAR +STARTCHAR U_80ED +ENCODING 33005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +5520 +77E0 +5520 +5520 +75A0 +5660 +5420 +97E0 +9420 +ENDCHAR +STARTCHAR U_80EE +ENCODING 33006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4A20 +4940 +7880 +4B40 +4CA0 +7BE0 +4A80 +4FE0 +4880 +9880 +ENDCHAR +STARTCHAR U_80EF +ENCODING 33007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7BA0 +5000 +5FE0 +7200 +57C0 +5040 +9040 +B180 +ENDCHAR +STARTCHAR U_80F0 +ENCODING 33008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77E0 +5120 +57E0 +7500 +57E0 +5160 +9280 +B460 +ENDCHAR +STARTCHAR U_80F1 +ENCODING 33009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5920 +5540 +7100 +5FE0 +5280 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_80F2 +ENCODING 33010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +5100 +5FE0 +7240 +5480 +5720 +7240 +5480 +5140 +9220 +B420 +ENDCHAR +STARTCHAR U_80F3 +ENCODING 33011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5680 +7900 +5280 +5440 +7BE0 +5240 +5240 +93C0 +B240 +ENDCHAR +STARTCHAR U_80F4 +ENCODING 33012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +55E0 +7420 +55E0 +5560 +7560 +55E0 +5420 +9420 +B460 +ENDCHAR +STARTCHAR U_80F5 +ENCODING 33013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5200 +7440 +57A0 +5100 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_80F6 +ENCODING 33014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5280 +7440 +5820 +7480 +5280 +5100 +5280 +B440 +8820 +ENDCHAR +STARTCHAR U_80F7 +ENCODING 33015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A20 +A4A0 +2AA0 +3FC0 +2080 +3F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_80F8 +ENCODING 33016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53E0 +5420 +7920 +56A0 +55A0 +76A0 +54A0 +57A0 +9020 +B0C0 +ENDCHAR +STARTCHAR U_80F9 +ENCODING 33017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +A200 +EFE0 +AAA0 +AAA0 +EAA0 +AAA0 +AAA0 +AAA0 +A860 +ENDCHAR +STARTCHAR U_80FA +ENCODING 33018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5420 +7100 +57E0 +5240 +7240 +5680 +5180 +9240 +B420 +ENDCHAR +STARTCHAR U_80FB +ENCODING 33019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72E0 +5400 +5800 +7200 +55E0 +5440 +7C40 +5440 +5440 +9540 +B480 +ENDCHAR +STARTCHAR U_80FC +ENCODING 33020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5280 +5FE0 +7280 +5280 +5FE0 +7280 +5280 +5280 +9480 +B880 +ENDCHAR +STARTCHAR U_80FD +ENCODING 33021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4940 +FD80 +0120 +7DE0 +4400 +7D40 +4580 +7D20 +4520 +4DE0 +ENDCHAR +STARTCHAR U_80FE +ENCODING 33022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD40 +1120 +FFE0 +1100 +FD20 +9520 +AD40 +D4A0 +AD60 +CE20 +ENDCHAR +STARTCHAR U_80FF +ENCODING 33023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4900 +7900 +4FE0 +4900 +7900 +4FC0 +4900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_8100 +ENCODING 33024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0120 +7640 +1480 +2C40 +7FA0 +A080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8101 +ENCODING 33025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5AA0 +56C0 +7280 +5280 +56C0 +7AA0 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_8102 +ENCODING 33026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4A60 +4B80 +7A20 +49E0 +4800 +7BE0 +4A20 +4BE0 +8A20 +9BE0 +ENDCHAR +STARTCHAR U_8103 +ENCODING 33027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4C40 +7BE0 +4AA0 +4AA0 +7BE0 +4A00 +4A00 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8104 +ENCODING 33028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4900 +7900 +4A80 +4AA0 +7DC0 +4A80 +4940 +4A20 +9C20 +ENDCHAR +STARTCHAR U_8105 +ENCODING 33029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +2080 +FBE0 +4920 +BFE0 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_8106 +ENCODING 33030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5480 +5FE0 +7400 +55C0 +5540 +7540 +55C0 +5520 +9520 +B8E0 +ENDCHAR +STARTCHAR U_8107 +ENCODING 33031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +4940 +7A40 +4C40 +4A80 +7FE0 +4AA0 +4AA0 +4AA0 +9D60 +ENDCHAR +STARTCHAR U_8108 +ENCODING 33032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0E0 +AF00 +A860 +EB80 +AA80 +AAA0 +EAC0 +AA80 +AAC0 +AB40 +B220 +ENDCHAR +STARTCHAR U_8109 +ENCODING 33033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5080 +5700 +7120 +5D40 +5580 +7540 +5540 +5920 +9120 +B300 +ENDCHAR +STARTCHAR U_810A +ENCODING 33034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +C8C0 +2D00 +D2C0 +2100 +7F80 +A140 +3F00 +2100 +3F00 +2100 +2700 +ENDCHAR +STARTCHAR U_810B +ENCODING 33035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0880 +1100 +FFE0 +2520 +FFC0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_810C +ENCODING 33036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4C80 +7880 +4BE0 +4A80 +7A80 +4FE0 +4880 +4880 +9880 +ENDCHAR +STARTCHAR U_810D +ENCODING 33037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5280 +5440 +7820 +53C0 +5000 +77E0 +5100 +5200 +9440 +B7A0 +ENDCHAR +STARTCHAR U_810E +ENCODING 33038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E60 +4980 +4A40 +7CA0 +4880 +4FE0 +7880 +4AC0 +4CA0 +88A0 +B980 +ENDCHAR +STARTCHAR U_810F +ENCODING 33039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +57E0 +5400 +7480 +5480 +57E0 +7480 +5480 +5480 +9880 +B3E0 +ENDCHAR +STARTCHAR U_8110 +ENCODING 33040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5240 +7180 +5240 +5C20 +7240 +5240 +5240 +9440 +B840 +ENDCHAR +STARTCHAR U_8111 +ENCODING 33041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5080 +57E0 +7000 +54A0 +56A0 +7520 +56A0 +5420 +97E0 +B420 +ENDCHAR +STARTCHAR U_8112 +ENCODING 33042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4D20 +4B40 +7900 +4FE0 +4900 +7980 +4B40 +4D20 +8920 +B900 +ENDCHAR +STARTCHAR U_8113 +ENCODING 33043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5920 +7100 +52A0 +56C0 +7A80 +5280 +52C0 +9320 +B220 +ENDCHAR +STARTCHAR U_8114 +ENCODING 33044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2A80 +4A40 +8A20 +FFC0 +8A40 +9540 +A4C0 +8A40 +91C0 +ENDCHAR +STARTCHAR U_8115 +ENCODING 33045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +53C0 +5480 +7FE0 +5520 +5520 +77E0 +5280 +52A0 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_8116 +ENCODING 33046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5100 +7FE0 +5820 +57C0 +7080 +5FE0 +5100 +9100 +B300 +ENDCHAR +STARTCHAR U_8117 +ENCODING 33047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BE0 +4D60 +7AA0 +4CA0 +4920 +7A40 +4BE0 +4A20 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_8118 +ENCODING 33048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7C20 +4BC0 +4800 +7FE0 +4A80 +4AA0 +8CA0 +9860 +ENDCHAR +STARTCHAR U_8119 +ENCODING 33049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7180 +5140 +5FE0 +7100 +5920 +5540 +7380 +5540 +5920 +9120 +B300 +ENDCHAR +STARTCHAR U_811A +ENCODING 33050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +74E0 +54A0 +5FA0 +74A0 +54A0 +5FA0 +74A0 +5AA0 +5FE0 +9080 +B080 +ENDCHAR +STARTCHAR U_811B +ENCODING 33051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5540 +5540 +7A80 +5540 +5540 +7000 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_811C +ENCODING 33052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4900 +7BE0 +4A20 +4BE0 +7A20 +4BE0 +4A20 +AA20 +93E0 +ENDCHAR +STARTCHAR U_811D +ENCODING 33053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4A40 +7BC0 +4800 +4FE0 +7840 +4880 +4880 +8880 +9980 +ENDCHAR +STARTCHAR U_811E +ENCODING 33054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5540 +5540 +7540 +5BA0 +5920 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_811F +ENCODING 33055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4BA0 +4D20 +7AC0 +4840 +4FE0 +7840 +4A40 +4940 +8840 +99C0 +ENDCHAR +STARTCHAR U_8120 +ENCODING 33056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7060 +5DC0 +5440 +7440 +5960 +5540 +7540 +5D40 +57E0 +5400 +9BE0 +ENDCHAR +STARTCHAR U_8121 +ENCODING 33057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7020 +5EC0 +5240 +7440 +57E0 +5240 +7A40 +57E0 +5200 +9500 +B8E0 +ENDCHAR +STARTCHAR U_8122 +ENCODING 33058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57E0 +5800 +77C0 +5540 +5FE0 +7540 +5540 +57E0 +9040 +B180 +ENDCHAR +STARTCHAR U_8123 +ENCODING 33059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4000 +7FE0 +5280 +51E0 +5FC0 +9040 +9FC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_8124 +ENCODING 33060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5400 +57C0 +7400 +57E0 +5540 +7540 +5560 +5540 +95A0 +9920 +ENDCHAR +STARTCHAR U_8125 +ENCODING 33061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +7540 +5540 +5BA0 +7120 +5100 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_8126 +ENCODING 33062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +50A0 +5FE0 +7080 +5480 +5280 +7580 +54A0 +5DA0 +9360 +B020 +ENDCHAR +STARTCHAR U_8127 +ENCODING 33063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5240 +57A0 +7240 +5520 +53C0 +7240 +5640 +5980 +9240 +B420 +ENDCHAR +STARTCHAR U_8128 +ENCODING 33064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77E0 +5520 +57E0 +7100 +5380 +5540 +9920 +B100 +ENDCHAR +STARTCHAR U_8129 +ENCODING 33065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +4A40 +5180 +D7C0 +5C60 +57C0 +5440 +57C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_812A +ENCODING 33066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4880 +4B60 +7900 +4FE0 +4A80 +7FE0 +4AA0 +4AA0 +4AA0 +8880 +ENDCHAR +STARTCHAR U_812B +ENCODING 33067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5440 +5FE0 +7440 +5440 +57C0 +7280 +5280 +52A0 +94A0 +B860 +ENDCHAR +STARTCHAR U_812C +ENCODING 33068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5F20 +5A20 +7540 +5FC0 +5080 +7100 +5FE0 +5100 +9100 +B300 +ENDCHAR +STARTCHAR U_812D +ENCODING 33069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +5440 +77C0 +5000 +5FE0 +7100 +57C0 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_812E +ENCODING 33070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78E0 +4FA0 +4AA0 +7AC0 +4900 +4FE0 +7940 +4A40 +4980 +4980 +9E60 +ENDCHAR +STARTCHAR U_812F +ENCODING 33071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E140 +A120 +AFE0 +E100 +AFE0 +A920 +EFE0 +A920 +AFE0 +A920 +A960 +ENDCHAR +STARTCHAR U_8130 +ENCODING 33072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4800 +4BC0 +7A40 +4A40 +4BC0 +7A40 +4800 +4A40 +8980 +9FE0 +ENDCHAR +STARTCHAR U_8131 +ENCODING 33073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7440 +5280 +57C0 +7440 +5440 +57C0 +7280 +5280 +52A0 +94A0 +B8E0 +ENDCHAR +STARTCHAR U_8132 +ENCODING 33074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7480 +54A0 +56A0 +75C0 +55A0 +56A0 +94A0 +B980 +ENDCHAR +STARTCHAR U_8133 +ENCODING 33075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D20 +4AA0 +4AC0 +7800 +4A20 +4B60 +7AA0 +4B60 +4A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8134 +ENCODING 33076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4880 +4900 +7B80 +4D40 +4920 +7900 +4BC0 +4A40 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_8135 +ENCODING 33077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7000 +57C0 +5100 +7FE0 +5100 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_8136 +ENCODING 33078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +5240 +73C0 +5100 +57E0 +7520 +5520 +56A0 +9460 +9460 +ENDCHAR +STARTCHAR U_8137 +ENCODING 33079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B20 +4E20 +4A20 +7FA0 +4AA0 +4AA0 +7BA0 +4EA0 +4A20 +4A20 +9A60 +ENDCHAR +STARTCHAR U_8138 +ENCODING 33080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4940 +7A20 +4FC0 +4920 +7CA0 +4AA0 +4A40 +8840 +9FE0 +ENDCHAR +STARTCHAR U_8139 +ENCODING 33081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A00 +4BC0 +7A00 +4BC0 +4A00 +7FE0 +4AA0 +4A40 +8AA0 +9B20 +ENDCHAR +STARTCHAR U_813A +ENCODING 33082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +4FE0 +7A40 +4B40 +4CA0 +7880 +4FE0 +4880 +8880 +9880 +ENDCHAR +STARTCHAR U_813B +ENCODING 33083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4900 +7FC0 +4940 +4FE0 +7940 +4FC0 +4900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_813C +ENCODING 33084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5100 +77E0 +5520 +57A0 +7560 +57A0 +5520 +5520 +B560 +ENDCHAR +STARTCHAR U_813D +ENCODING 33085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5280 +57E0 +7480 +5FE0 +5480 +77E0 +5480 +5480 +97E0 +B400 +ENDCHAR +STARTCHAR U_813E +ENCODING 33086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5520 +77E0 +5520 +57E0 +7100 +5280 +57E0 +9080 +B080 +ENDCHAR +STARTCHAR U_813F +ENCODING 33087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4900 +7FC0 +4900 +4FE0 +7900 +4B20 +4EC0 +4A40 +9B20 +ENDCHAR +STARTCHAR U_8140 +ENCODING 33088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4980 +4A40 +7FE0 +4800 +4FE0 +7AA0 +4FE0 +4AA0 +4AA0 +9860 +ENDCHAR +STARTCHAR U_8141 +ENCODING 33089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7220 +5440 +5EE0 +7440 +5440 +5440 +7EE0 +5440 +5440 +5440 +B840 +ENDCHAR +STARTCHAR U_8142 +ENCODING 33090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +4BE0 +7AA0 +4BE0 +4880 +7FE0 +49C0 +4AA0 +4AA0 +9CA0 +ENDCHAR +STARTCHAR U_8143 +ENCODING 33091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +5680 +5FE0 +7200 +5FE0 +5440 +7FA0 +5480 +55A0 +9420 +B3E0 +ENDCHAR +STARTCHAR U_8144 +ENCODING 33092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +7540 +5540 +5FE0 +7540 +5540 +5FE0 +9100 +B7C0 +ENDCHAR +STARTCHAR U_8145 +ENCODING 33093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +4AA0 +4880 +7940 +4A20 +4C80 +7AA0 +49C0 +4880 +4940 +9A20 +ENDCHAR +STARTCHAR U_8146 +ENCODING 33094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +A280 +AFE0 +EAA0 +AAA0 +AFE0 +EAA0 +AAA0 +BFE0 +A280 +AC60 +ENDCHAR +STARTCHAR U_8147 +ENCODING 33095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +7380 +5540 +5920 +7FE0 +5280 +5680 +9180 +BE60 +ENDCHAR +STARTCHAR U_8148 +ENCODING 33096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5100 +5FE0 +7440 +57C0 +5440 +97C0 +B4C0 +ENDCHAR +STARTCHAR U_8149 +ENCODING 33097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4AE0 +4A20 +7B60 +4A20 +4BE0 +7940 +4940 +4940 +4A40 +9460 +ENDCHAR +STARTCHAR U_814A +ENCODING 33098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +57C0 +7280 +5FE0 +5000 +77C0 +5440 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_814B +ENCODING 33099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +74E0 +5D20 +56A0 +7560 +5540 +5480 +9540 +B620 +ENDCHAR +STARTCHAR U_814C +ENCODING 33100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7540 +5FE0 +5540 +77C0 +5540 +57C0 +9120 +B0E0 +ENDCHAR +STARTCHAR U_814D +ENCODING 33101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7380 +5440 +5A20 +7100 +5FC0 +5040 +7180 +5340 +56A0 +9A40 +B1C0 +ENDCHAR +STARTCHAR U_814E +ENCODING 33102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +F980 +FA40 +9420 +FF80 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_814F +ENCODING 33103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5120 +56C0 +7240 +55A0 +5FE0 +7220 +54A0 +5240 +95C0 +B920 +ENDCHAR +STARTCHAR U_8150 +ENCODING 33104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4840 +5FE0 +6A40 +4940 +5FE0 +5220 +5520 +5AA0 +9560 +ENDCHAR +STARTCHAR U_8151 +ENCODING 33105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5480 +7520 +57E0 +5520 +75A0 +5560 +5520 +9520 +B960 +ENDCHAR +STARTCHAR U_8152 +ENCODING 33106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7480 +57E0 +5480 +75E0 +5520 +5520 +95E0 +B920 +ENDCHAR +STARTCHAR U_8153 +ENCODING 33107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5280 +5EE0 +7280 +5280 +5EE0 +7280 +5280 +5EE0 +9280 +B280 +ENDCHAR +STARTCHAR U_8154 +ENCODING 33108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +7280 +5440 +5820 +77C0 +5100 +5100 +9100 +BFE0 +ENDCHAR +STARTCHAR U_8155 +ENCODING 33109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +7200 +57E0 +58A0 +75A0 +52E0 +5280 +94A0 +B860 +ENDCHAR +STARTCHAR U_8156 +ENCODING 33110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +4880 +7BE0 +4AA0 +4BE0 +7AA0 +4BE0 +49C0 +AAA0 +94A0 +ENDCHAR +STARTCHAR U_8157 +ENCODING 33111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5540 +77C0 +5540 +57C0 +7000 +5FE0 +5240 +5240 +B440 +ENDCHAR +STARTCHAR U_8158 +ENCODING 33112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7520 +57E0 +55A0 +7560 +57E0 +5420 +57E0 +B420 +ENDCHAR +STARTCHAR U_8159 +ENCODING 33113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5420 +73C0 +5000 +57E0 +7080 +52C0 +54A0 +94A0 +B180 +ENDCHAR +STARTCHAR U_815A +ENCODING 33114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5420 +77E0 +5100 +5500 +75E0 +5500 +5500 +9B00 +B1E0 +ENDCHAR +STARTCHAR U_815B +ENCODING 33115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5420 +57E0 +7400 +57E0 +5540 +77E0 +5480 +57E0 +9480 +BBE0 +ENDCHAR +STARTCHAR U_815C +ENCODING 33116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4FE0 +4A40 +7BC0 +4A40 +4BC0 +7880 +4FE0 +4980 +8AC0 +9CA0 +ENDCHAR +STARTCHAR U_815D +ENCODING 33117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5200 +5FE0 +7AA0 +5AA0 +5260 +7FE0 +5300 +5280 +5460 +B840 +ENDCHAR +STARTCHAR U_815E +ENCODING 33118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +5240 +57C0 +7080 +5FE0 +5520 +72C0 +5580 +52C0 +94A0 +B320 +ENDCHAR +STARTCHAR U_815F +ENCODING 33119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +7FE0 +5240 +5FE0 +7100 +57C0 +5100 +5100 +BFE0 +ENDCHAR +STARTCHAR U_8160 +ENCODING 33120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5200 +77C0 +5200 +5FE0 +77C0 +5920 +5FE0 +9280 +9C60 +ENDCHAR +STARTCHAR U_8161 +ENCODING 33121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A740 +E540 +AFE0 +A820 +EBA0 +AAA0 +ABA0 +A820 +A860 +ENDCHAR +STARTCHAR U_8162 +ENCODING 33122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5540 +57C0 +7540 +57C0 +5100 +77E0 +5560 +57A0 +9420 +B460 +ENDCHAR +STARTCHAR U_8163 +ENCODING 33123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5920 +77C0 +5540 +5540 +55C0 +B100 +ENDCHAR +STARTCHAR U_8164 +ENCODING 33124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5000 +77C0 +5440 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_8165 +ENCODING 33125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4BE0 +7A20 +4BE0 +4A80 +7BE0 +4C80 +4BE0 +8880 +9FE0 +ENDCHAR +STARTCHAR U_8166 +ENCODING 33126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +72A0 +5540 +52A0 +7200 +57E0 +5420 +76A0 +5520 +56A0 +97E0 +B420 +ENDCHAR +STARTCHAR U_8167 +ENCODING 33127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A280 +A440 +EBA0 +B000 +AEA0 +EAA0 +AEA0 +AAA0 +AE20 +AAE0 +ENDCHAR +STARTCHAR U_8168 +ENCODING 33128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5540 +5540 +77C0 +5000 +5FE0 +7000 +5FE0 +5AA0 +5AA0 +B860 +ENDCHAR +STARTCHAR U_8169 +ENCODING 33129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A100 +EFE0 +AAA0 +AFE0 +E920 +AFE0 +A920 +A920 +A860 +ENDCHAR +STARTCHAR U_816A +ENCODING 33130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5920 +57C0 +7100 +57C0 +5540 +77C0 +5540 +5FE0 +5100 +B100 +ENDCHAR +STARTCHAR U_816B +ENCODING 33131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +7540 +57C0 +5540 +77C0 +5100 +57C0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_816C +ENCODING 33132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5280 +5100 +7FE0 +5540 +5B00 +7100 +5FE0 +5540 +5920 +B100 +ENDCHAR +STARTCHAR U_816D +ENCODING 33133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +5AA0 +5EE0 +7000 +57C0 +5000 +7FE0 +5200 +57C0 +9040 +B380 +ENDCHAR +STARTCHAR U_816E +ENCODING 33134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +57E0 +7520 +57E0 +5420 +7140 +56A0 +5A20 +9240 +B1C0 +ENDCHAR +STARTCHAR U_816F +ENCODING 33135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5480 +57E0 +7480 +55E0 +5520 +75E0 +5520 +55E0 +9520 +B9E0 +ENDCHAR +STARTCHAR U_8170 +ENCODING 33136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A100 +EFE0 +A240 +A680 +A1C0 +AE20 +ENDCHAR +STARTCHAR U_8171 +ENCODING 33137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +5FE0 +54A0 +75E0 +54A0 +5FE0 +7280 +5BE0 +5480 +9680 +B9E0 +ENDCHAR +STARTCHAR U_8172 +ENCODING 33138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5520 +57E0 +7520 +57E0 +5000 +7FE0 +54A0 +54C0 +9540 +B620 +ENDCHAR +STARTCHAR U_8173 +ENCODING 33139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAE0 +AAA0 +B1A0 +E4A0 +AAA0 +B1A0 +E0A0 +AEA0 +AAE0 +AA80 +AE80 +ENDCHAR +STARTCHAR U_8174 +ENCODING 33140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AD60 +A920 +EFE0 +A920 +AFE0 +E920 +A100 +A280 +A440 +A820 +ENDCHAR +STARTCHAR U_8175 +ENCODING 33141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7760 +5520 +5520 +7760 +5400 +57E0 +74A0 +57A0 +5440 +54A0 +B520 +ENDCHAR +STARTCHAR U_8176 +ENCODING 33142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +76E0 +54A0 +54A0 +7720 +5400 +57E0 +74A0 +57A0 +5C40 +94A0 +B520 +ENDCHAR +STARTCHAR U_8177 +ENCODING 33143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5000 +53C0 +7240 +53C0 +5000 +77E0 +54A0 +57E0 +94A0 +B7E0 +ENDCHAR +STARTCHAR U_8178 +ENCODING 33144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5440 +57C0 +7440 +5FE0 +5400 +77E0 +5AA0 +52A0 +9520 +BAC0 +ENDCHAR +STARTCHAR U_8179 +ENCODING 33145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5C40 +77C0 +5440 +57C0 +7200 +57C0 +5A40 +9180 +B660 +ENDCHAR +STARTCHAR U_817A +ENCODING 33146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57C0 +5440 +77C0 +5440 +57C0 +7100 +5FA0 +5540 +9920 +B300 +ENDCHAR +STARTCHAR U_817B +ENCODING 33147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0A0 +BFE0 +A080 +EE80 +A080 +AF80 +EA80 +AA80 +AAA0 +A560 +A8A0 +ENDCHAR +STARTCHAR U_817C +ENCODING 33148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +EAA0 +ABA0 +AAA0 +EAA0 +ABA0 +AAA0 +AFE0 +A820 +ENDCHAR +STARTCHAR U_817D +ENCODING 33149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E440 +A7C0 +A000 +EFE0 +AAA0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_817E +ENCODING 33150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5200 +7FE0 +5440 +5FA0 +7480 +57E0 +5020 +97A0 +B040 +ENDCHAR +STARTCHAR U_817F +ENCODING 33151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71E0 +5920 +55E0 +7120 +5DE0 +5500 +75A0 +5540 +5520 +9580 +BBE0 +ENDCHAR +STARTCHAR U_8180 +ENCODING 33152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5920 +7FE0 +5200 +53E0 +9420 +B9C0 +ENDCHAR +STARTCHAR U_8181 +ENCODING 33153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +5FC0 +5500 +7FC0 +5540 +5FE0 +7540 +5FC0 +5580 +5D40 +B520 +ENDCHAR +STARTCHAR U_8182 +ENCODING 33154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFE0 +2B20 +4AC0 +9240 +3FA0 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_8183 +ENCODING 33155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A540 +A6C0 +E440 +A7C0 +A000 +EFE0 +AAA0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_8184 +ENCODING 33156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7760 +5520 +5760 +7520 +57E0 +5100 +77E0 +5240 +5180 +5280 +BC60 +ENDCHAR +STARTCHAR U_8185 +ENCODING 33157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5500 +77C0 +5540 +57E0 +7500 +5500 +57C0 +5A40 +BBC0 +ENDCHAR +STARTCHAR U_8186 +ENCODING 33158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5100 +77C0 +5100 +5FE0 +7280 +5540 +5FA0 +9540 +BB20 +ENDCHAR +STARTCHAR U_8187 +ENCODING 33159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +59E0 +5520 +71E0 +5D00 +55E0 +7520 +55E0 +5520 +9400 +BBE0 +ENDCHAR +STARTCHAR U_8188 +ENCODING 33160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A000 +A7C0 +E440 +A7C0 +A000 +EFE0 +AAA0 +AFE0 +A920 +B960 +ENDCHAR +STARTCHAR U_8189 +ENCODING 33161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +A280 +AFE0 +E280 +A440 +A820 +EFE0 +AAA0 +AAA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_818A +ENCODING 33162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7140 +5FE0 +5520 +77E0 +5520 +57E0 +7520 +5FE0 +5440 +9240 +B0C0 +ENDCHAR +STARTCHAR U_818B +ENCODING 33163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +52A0 +94A0 +2940 +4620 +FFE0 +A0A0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_818C +ENCODING 33164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +5580 +5340 +7EA0 +5440 +5FE0 +7440 +57C0 +5440 +97C0 +B4C0 +ENDCHAR +STARTCHAR U_818D +ENCODING 33165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +56A0 +7520 +56A0 +57E0 +7480 +57A0 +54C0 +97A0 +B460 +ENDCHAR +STARTCHAR U_818E +ENCODING 33166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5F40 +5540 +7280 +5500 +57C0 +7140 +5FE0 +5280 +5460 +B840 +ENDCHAR +STARTCHAR U_818F +ENCODING 33167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +FFE0 +9120 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8190 +ENCODING 33168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA40 +2580 +3AA0 +4B60 +FFA0 +2480 +2A80 +2480 +2A80 +2180 +ENDCHAR +STARTCHAR U_8191 +ENCODING 33169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +57E0 +5420 +7380 +5200 +53E0 +7280 +5280 +57E0 +9240 +B420 +ENDCHAR +STARTCHAR U_8192 +ENCODING 33170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5400 +55C0 +7540 +55C0 +5400 +77E0 +56A0 +57E0 +5400 +B7E0 +ENDCHAR +STARTCHAR U_8193 +ENCODING 33171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +57E0 +5C40 +77C0 +5440 +5FE0 +7400 +57E0 +5AA0 +5520 +B2C0 +ENDCHAR +STARTCHAR U_8194 +ENCODING 33172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AA80 +EFE0 +AAA0 +AFE0 +EA80 +ABA0 +AAC0 +B3A0 +B2E0 +ENDCHAR +STARTCHAR U_8195 +ENCODING 33173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A960 +AFE0 +E920 +AF20 +AB60 +EEA0 +A9E0 +AE60 +A820 +AFE0 +ENDCHAR +STARTCHAR U_8196 +ENCODING 33174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5BE0 +5540 +7480 +5F60 +7480 +57E0 +5480 +57E0 +5480 +BFE0 +ENDCHAR +STARTCHAR U_8197 +ENCODING 33175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7520 +5520 +57E0 +7280 +57E0 +5480 +7FE0 +5480 +57E0 +9480 +B7E0 +ENDCHAR +STARTCHAR U_8198 +ENCODING 33176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +EAA0 +AFE0 +A000 +E7C0 +A000 +AFE0 +A540 +BB20 +ENDCHAR +STARTCHAR U_8199 +ENCODING 33177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5520 +55E0 +7480 +5BE0 +5AA0 +7EA0 +57E0 +5480 +94A0 +BBE0 +ENDCHAR +STARTCHAR U_819A +ENCODING 33178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +5240 +5FC0 +5240 +5FC0 +5080 +5F80 +9080 +9180 +ENDCHAR +STARTCHAR U_819B +ENCODING 33179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +5FE0 +7820 +57C0 +5440 +77C0 +5100 +57C0 +5100 +BFE0 +ENDCHAR +STARTCHAR U_819C +ENCODING 33180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +77C0 +5440 +57C0 +7440 +5FE0 +5100 +9280 +BC60 +ENDCHAR +STARTCHAR U_819D +ENCODING 33181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5540 +7920 +5380 +5540 +7D60 +5380 +5540 +9920 +B300 +ENDCHAR +STARTCHAR U_819E +ENCODING 33182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5540 +77C0 +5540 +57C0 +7520 +5FE0 +5480 +9280 +B100 +ENDCHAR +STARTCHAR U_819F +ENCODING 33183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57E0 +5920 +7740 +5140 +56A0 +7BC0 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_81A0 +ENCODING 33184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5AA0 +5660 +7AA0 +5100 +56C0 +7AA0 +5500 +5240 +9480 +B300 +ENDCHAR +STARTCHAR U_81A1 +ENCODING 33185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +57C0 +5100 +7FE0 +5280 +7440 +5FE0 +5440 +57C0 +5440 +B7C0 +ENDCHAR +STARTCHAR U_81A2 +ENCODING 33186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5D60 +77C0 +5540 +57C0 +7540 +5FE0 +5240 +9180 +BE60 +ENDCHAR +STARTCHAR U_81A3 +ENCODING 33187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5AA0 +7440 +5FE0 +5440 +7FE0 +5100 +57C0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_81A4 +ENCODING 33188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +5100 +5FE0 +7920 +5540 +7100 +57C0 +5040 +57C0 +9040 +B7C0 +ENDCHAR +STARTCHAR U_81A5 +ENCODING 33189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +FFE0 +2480 +FFA0 +7540 +AAA0 +7FC0 +4A40 +5540 +4A40 +51C0 +ENDCHAR +STARTCHAR U_81A6 +ENCODING 33190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +5FE0 +7540 +5920 +5440 +77E0 +5D40 +53E0 +9440 +B840 +ENDCHAR +STARTCHAR U_81A7 +ENCODING 33191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5440 +7280 +5FE0 +5540 +77C0 +5540 +5FE0 +9100 +BFE0 +ENDCHAR +STARTCHAR U_81A8 +ENCODING 33192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7220 +5FA0 +5240 +7780 +5020 +5740 +7580 +5700 +5520 +9240 +BF80 +ENDCHAR +STARTCHAR U_81A9 +ENCODING 33193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70A0 +5FE0 +5080 +7F80 +5480 +5780 +7480 +57A0 +55A0 +9760 +BDA0 +ENDCHAR +STARTCHAR U_81AA +ENCODING 33194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7FE0 +5920 +57C0 +7540 +5540 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_81AB +ENCODING 33195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5AA0 +77C0 +5C60 +57C0 +7440 +57C0 +5580 +9940 +B320 +ENDCHAR +STARTCHAR U_81AC +ENCODING 33196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +57C0 +7100 +57C0 +5120 +7FE0 +5480 +5FE0 +94A0 +B360 +ENDCHAR +STARTCHAR U_81AD +ENCODING 33197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5540 +7FE0 +5440 +77C0 +5440 +57C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_81AE +ENCODING 33198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +57C0 +5100 +7FE0 +5440 +5EE0 +7440 +5FE0 +5280 +94A0 +B860 +ENDCHAR +STARTCHAR U_81AF +ENCODING 33199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7740 +52A0 +56C0 +7440 +5BA0 +5000 +77C0 +5440 +57C0 +5280 +B7E0 +ENDCHAR +STARTCHAR U_81B0 +ENCODING 33200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +70C0 +5F20 +5540 +7FE0 +5540 +5920 +77C0 +5540 +57C0 +9540 +B7C0 +ENDCHAR +STARTCHAR U_81B1 +ENCODING 33201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BFC0 +AAA0 +FFE0 +A080 +AEA0 +EAC0 +AE80 +AAA0 +AF60 +A220 +ENDCHAR +STARTCHAR U_81B2 +ENCODING 33202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7480 +57E0 +5480 +7FE0 +5480 +57E0 +5480 +77E0 +5540 +9AA0 +B2A0 +ENDCHAR +STARTCHAR U_81B3 +ENCODING 33203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5100 +77C0 +5100 +5FE0 +7280 +5FE0 +5440 +97C0 +B440 +ENDCHAR +STARTCHAR U_81B4 +ENCODING 33204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7400 +5FE0 +5540 +7540 +5FE0 +5540 +7540 +5FE0 +5000 +9540 +BAA0 +ENDCHAR +STARTCHAR U_81B5 +ENCODING 33205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7FE0 +5240 +5480 +7B40 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_81B6 +ENCODING 33206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +ABA0 +E920 +ABA0 +A920 +ABA0 +A860 +ENDCHAR +STARTCHAR U_81B7 +ENCODING 33207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAE0 +ABA0 +B2A0 +FFC0 +AAC0 +ABA0 +FEA0 +A6A0 +AAC0 +AB80 +A880 +ENDCHAR +STARTCHAR U_81B8 +ENCODING 33208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +A100 +E3E0 +BC80 +ABE0 +E940 +A9C0 +A940 +AD40 +B3E0 +ENDCHAR +STARTCHAR U_81B9 +ENCODING 33209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5540 +7FE0 +5440 +57C0 +7440 +57C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_81BA +ENCODING 33210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5480 +77E0 +5C80 +57E0 +5480 +5FE0 +5040 +DFC0 +90C0 +ENDCHAR +STARTCHAR U_81BB +ENCODING 33211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +AB40 +E840 +AFC0 +A000 +E7C0 +A440 +A7C0 +A440 +AFE0 +ENDCHAR +STARTCHAR U_81BC +ENCODING 33212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +AA40 +AB40 +E7E0 +BC20 +AFA0 +EEA0 +AFA0 +AC20 +AC60 +B3E0 +ENDCHAR +STARTCHAR U_81BD +ENCODING 33213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +AFE0 +BA40 +ECA0 +ABE0 +A800 +EBC0 +A800 +ABE0 +AA20 +B3E0 +ENDCHAR +STARTCHAR U_81BE +ENCODING 33214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5480 +5FC0 +7020 +5FE0 +5AA0 +7FE0 +5440 +57C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_81BF +ENCODING 33215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +AAA0 +EFE0 +AAA0 +AFE0 +E800 +AFE0 +AAA0 +AA40 +B320 +ENDCHAR +STARTCHAR U_81C0 +ENCODING 33216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8540 +FE20 +A9C0 +FC80 +AB60 +7F80 +2080 +3F80 +2080 +2180 +ENDCHAR +STARTCHAR U_81C1 +ENCODING 33217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AA80 +EFE0 +AAA0 +AFE0 +EAA0 +AFE0 +AA80 +B6C0 +AAA0 +ENDCHAR +STARTCHAR U_81C2 +ENCODING 33218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +4BE0 +4880 +BF80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_81C3 +ENCODING 33219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +54C0 +7B40 +5DE0 +5740 +79E0 +5F40 +53E0 +9540 +B9E0 +ENDCHAR +STARTCHAR U_81C4 +ENCODING 33220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +71E0 +5100 +57E0 +7520 +57C0 +5520 +77E0 +5540 +5680 +99C0 +B6A0 +ENDCHAR +STARTCHAR U_81C5 +ENCODING 33221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AFE0 +E400 +A7E0 +BA20 +EFA0 +AAA0 +AFA0 +A2A0 +AF40 +ENDCHAR +STARTCHAR U_81C6 +ENCODING 33222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5280 +7FE0 +5440 +57C0 +7440 +57C0 +5340 +96A0 +BBA0 +ENDCHAR +STARTCHAR U_81C7 +ENCODING 33223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +AFE0 +A900 +FFE0 +A900 +AFE0 +E900 +AEE0 +AAA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_81C8 +ENCODING 33224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5FE0 +5240 +57C0 +7640 +5540 +57E0 +7920 +56A0 +97A0 +B060 +ENDCHAR +STARTCHAR U_81C9 +ENCODING 33225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7300 +5480 +5840 +77A0 +5000 +5EE0 +7AA0 +5EE0 +5440 +9AC0 +B120 +ENDCHAR +STARTCHAR U_81CA +ENCODING 33226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7C0 +A440 +A7C0 +E000 +AEE0 +AAA0 +EEE0 +A100 +AFE0 +A540 +B920 +ENDCHAR +STARTCHAR U_81CB +ENCODING 33227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +4540 +7E20 +51C0 +7C80 +A960 +7FC0 +4A40 +5540 +4A40 +5140 +ENDCHAR +STARTCHAR U_81CC +ENCODING 33228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +BF40 +A4E0 +FF40 +A0E0 +AEA0 +EAA0 +AEA0 +AA40 +A4A0 +BF20 +ENDCHAR +STARTCHAR U_81CD +ENCODING 33229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +AAA0 +ED40 +B560 +A540 +EFC0 +A840 +AFC0 +A840 +B040 +ENDCHAR +STARTCHAR U_81CE +ENCODING 33230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EE0 +5AA0 +5660 +7AA0 +5FE0 +5440 +7AA0 +5100 +5FE0 +9100 +B100 +ENDCHAR +STARTCHAR U_81CF +ENCODING 33231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5820 +77C0 +5540 +5FC0 +7440 +57C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_81D0 +ENCODING 33232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +5100 +5FE0 +76A0 +5520 +57E0 +7100 +5FC0 +5100 +9FE0 +BAA0 +ENDCHAR +STARTCHAR U_81D1 +ENCODING 33233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +AFE0 +E920 +A7C0 +A920 +EFE0 +A100 +AFE0 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_81D2 +ENCODING 33234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +5FE0 +5480 +7FE0 +5480 +57E0 +7480 +57E0 +5240 +9180 +B660 +ENDCHAR +STARTCHAR U_81D3 +ENCODING 33235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0240 +77E0 +50A0 +57E0 +7540 +57A0 +54C0 +77A0 +5540 +97E0 +A920 +ENDCHAR +STARTCHAR U_81D4 +ENCODING 33236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +54A0 +5740 +75A0 +57E0 +5440 +77C0 +5440 +57C0 +5440 +B820 +ENDCHAR +STARTCHAR U_81D5 +ENCODING 33237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AAA0 +EFE0 +AA40 +ABE0 +EA40 +AB60 +A800 +AD40 +B2A0 +ENDCHAR +STARTCHAR U_81D6 +ENCODING 33238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4A40 +6EC0 +4A40 +6EC0 +FFE0 +2080 +7FC0 +A0A0 +3F80 +2080 +ENDCHAR +STARTCHAR U_81D7 +ENCODING 33239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +5FE0 +5AA0 +7FE0 +5280 +57C0 +7540 +5540 +57C0 +92A0 +BCE0 +ENDCHAR +STARTCHAR U_81D8 +ENCODING 33240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5A80 +5540 +7FE0 +5AA0 +5FE0 +77C0 +5540 +57C0 +9540 +B7A0 +ENDCHAR +STARTCHAR U_81D9 +ENCODING 33241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +5FE0 +5280 +7380 +5440 +5F60 +7540 +5540 +5F60 +9540 +BAA0 +ENDCHAR +STARTCHAR U_81DA +ENCODING 33242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E3C0 +A200 +AFE0 +EA20 +AFE0 +A940 +EFC0 +A940 +B7E0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_81DB +ENCODING 33243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A100 +AFE0 +E920 +A540 +A920 +EFE0 +B900 +AFE0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_81DC +ENCODING 33244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5FE0 +5540 +7FE0 +5AA0 +77C0 +5440 +5540 +5540 +D280 +AC60 +ENDCHAR +STARTCHAR U_81DD +ENCODING 33245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4000 +7F80 +2080 +FFC0 +A540 +FF40 +A5C0 +FF40 +AD40 +B660 +ENDCHAR +STARTCHAR U_81DE +ENCODING 33246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +AEE0 +A500 +EFE0 +A900 +BFE0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_81DF +ENCODING 33247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BFE0 +A4A0 +FFE0 +BA80 +AFA0 +F960 +BF40 +AA40 +AFA0 +B120 +ENDCHAR +STARTCHAR U_81E0 +ENCODING 33248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +4040 +AEA0 +C0E0 +5E40 +AAA0 +7FC0 +4A40 +5540 +4AC0 +ENDCHAR +STARTCHAR U_81E1 +ENCODING 33249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FBE0 +5680 +FBE0 +AA80 +FBE0 +5480 +FFE0 +4A40 +5540 +4AC0 +ENDCHAR +STARTCHAR U_81E2 +ENCODING 33250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D540 +BFE0 +A540 +FFE0 +AAA0 +B7E0 +E440 +A7C0 +A440 +A7C0 +A820 +ENDCHAR +STARTCHAR U_81E3 +ENCODING 33251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 2 -1 +BITMAP +FF00 +8800 +8800 +FF00 +8100 +8100 +FF00 +8800 +8800 +FF80 +ENDCHAR +STARTCHAR U_81E4 +ENCODING 33252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FBC0 +9240 +9240 +FA40 +8940 +F980 +9080 +9180 +FE40 +0420 +ENDCHAR +STARTCHAR U_81E5 +ENCODING 33253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +9080 +9080 +FC80 +8480 +8480 +FC80 +9140 +9140 +FA20 +0420 +ENDCHAR +STARTCHAR U_81E6 +ENCODING 33254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2A80 +2A80 +FBE0 +8A20 +8A20 +FBE0 +AAA0 +2A80 +2A80 +FBE0 +ENDCHAR +STARTCHAR U_81E7 +ENCODING 33255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00A0 +5FE0 +5080 +5F80 +74A0 +1EA0 +F2C0 +5E80 +54A0 +9F60 +2220 +ENDCHAR +STARTCHAR U_81E8 +ENCODING 33256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +A7E0 +A800 +F3C0 +9240 +93C0 +F000 +AEE0 +AAA0 +AAA0 +FEE0 +ENDCHAR +STARTCHAR U_81E9 +ENCODING 33257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2A80 +FBE0 +8A20 +FBE0 +2A80 +FFE0 +1100 +2980 +C960 +3100 +ENDCHAR +STARTCHAR U_81EA +ENCODING 33258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +20 +FE +82 +82 +FE +82 +FE +82 +82 +FE +82 +ENDCHAR +STARTCHAR U_81EB +ENCODING 33259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4400 +4400 +F400 +9400 +F400 +9400 +F400 +9400 +9400 +F440 +93C0 +ENDCHAR +STARTCHAR U_81EC +ENCODING 33260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_81ED +ENCODING 33261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +0480 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_81EE +ENCODING 33262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +01C0 +7E00 +2480 +5540 +8E20 +ENDCHAR +STARTCHAR U_81EF +ENCODING 33263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3F80 +2480 +1500 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_81F0 +ENCODING 33264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +FFE0 +2200 +3A40 +EB80 +1220 +E1E0 +ENDCHAR +STARTCHAR U_81F1 +ENCODING 33265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2880 +2480 +FFE0 +A4A0 +5F40 +0800 +0F80 +1080 +6380 +ENDCHAR +STARTCHAR U_81F2 +ENCODING 33266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3C0 +9480 +FFE0 +9400 +F5C0 +2540 +FD40 +25C0 +7520 +A9E0 +ENDCHAR +STARTCHAR U_81F3 +ENCODING 33267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +1100 +2080 +7FC0 +0400 +0400 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_81F4 +ENCODING 33268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2100 +29E0 +4A40 +7540 +1140 +7D40 +1140 +1080 +1D40 +E220 +ENDCHAR +STARTCHAR U_81F5 +ENCODING 33269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2240 +4D80 +F980 +2240 +77E0 +2240 +3A40 +E3C0 +4240 +ENDCHAR +STARTCHAR U_81F6 +ENCODING 33270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2400 +57E0 +FC40 +2480 +FFE0 +2480 +2480 +3C80 +C580 +ENDCHAR +STARTCHAR U_81F7 +ENCODING 33271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1120 +FFE0 +0100 +FD40 +2940 +7D40 +10A0 +7CA0 +1160 +FE20 +ENDCHAR +STARTCHAR U_81F8 +ENCODING 33272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2100 +4900 +F640 +23A0 +2080 +F880 +23E0 +2080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_81F9 +ENCODING 33273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +40A0 +AFE0 +F880 +48A0 +4EA0 +FAC0 +4A80 +4EA0 +F960 +1220 +ENDCHAR +STARTCHAR U_81FA +ENCODING 33274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3FC0 +1080 +FFE0 +8920 +1480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_81FB +ENCODING 33275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +57C0 +F100 +2FE0 +F540 +2FE0 +2380 +3540 +C920 +ENDCHAR +STARTCHAR U_81FC +ENCODING 33276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +E3C0 +8040 +8040 +8040 +FBC0 +8040 +8040 +8040 +FFC0 +8040 +ENDCHAR +STARTCHAR U_81FD +ENCODING 33277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +3FC0 +4080 +8100 +0800 +71C0 +4040 +79C0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_81FE +ENCODING 33278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +65C0 +4440 +75C0 +4440 +4440 +7FC0 +4440 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_81FF +ENCODING 33279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +0400 +FFE0 +1400 +65C0 +4440 +75C0 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8200 +ENCODING 33280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +00C0 +FF00 +4840 +2480 +2500 +73C0 +4040 +7BC0 +4040 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8201 +ENCODING 33281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73C0 +4040 +7BC0 +4040 +7FC0 +4040 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_8202 +ENCODING 33282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0800 +FFE0 +2080 +5BC0 +A0A0 +3B80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8203 +ENCODING 33283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +73C0 +4040 +7DC0 +4040 +7FC0 +2000 +3FE0 +0020 +6AA0 +9560 +ENDCHAR +STARTCHAR U_8204 +ENCODING 33284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4040 +79C0 +4040 +7FC0 +1000 +3FE0 +C020 +2AA0 +4AA0 +0040 +ENDCHAR +STARTCHAR U_8205 +ENCODING 33285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +8080 +F380 +8080 +FF80 +4900 +7F00 +4900 +FFC0 +1040 +E180 +ENDCHAR +STARTCHAR U_8206 +ENCODING 33286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +6EC0 +4840 +74C0 +5E40 +4440 +6EC0 +4440 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8207 +ENCODING 33287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +6EC0 +4840 +7FC0 +4240 +4A40 +7BC0 +4A40 +FFE0 +2080 +C060 +ENDCHAR +STARTCHAR U_8208 +ENCODING 33288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +71C0 +5F40 +71C0 +5D40 +75C0 +5D40 +5140 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8209 +ENCODING 33289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +6EC0 +62C0 +4A40 +FFE0 +2480 +7FC0 +8420 +7FC0 +0400 +ENDCHAR +STARTCHAR U_820A +ENCODING 33290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0A80 +3FE0 +6200 +BFC0 +2200 +3FE0 +2040 +3DC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_820B +ENCODING 33291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +5140 +5F40 +7FC0 +5540 +5540 +FFE0 +A0A0 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_820C +ENCODING 33292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0380 +7C00 +0400 +FFC0 +0400 +0400 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_820D +ENCODING 33293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +3F80 +C460 +3F80 +0400 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_820E +ENCODING 33294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +64C0 +9F20 +0400 +7FE0 +0000 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_820F +ENCODING 33295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +7D20 +1120 +FD20 +1120 +7D60 +45A0 +4520 +4420 +7C20 +4420 +ENDCHAR +STARTCHAR U_8210 +ENCODING 33296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0820 +F3C0 +2280 +FA80 +23E0 +2280 +7A80 +4AA0 +4AA0 +7B60 +4A20 +ENDCHAR +STARTCHAR U_8211 +ENCODING 33297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +4540 +47C0 +F540 +4540 +FFE0 +9440 +9440 +F440 +94C0 +ENDCHAR +STARTCHAR U_8212 +ENCODING 33298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2840 +4580 +B880 +13E0 +FCA0 +10C0 +7C80 +4480 +4480 +7D80 +ENDCHAR +STARTCHAR U_8213 +ENCODING 33299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +6240 +23C0 +FA40 +23C0 +7A00 +4BE0 +4D60 +4AA0 +7920 +4A40 +ENDCHAR +STARTCHAR U_8214 +ENCODING 33300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +E100 +2FE0 +2280 +F540 +2920 +F540 +95A0 +9560 +F900 +9300 +ENDCHAR +STARTCHAR U_8215 +ENCODING 33301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1520 +E540 +4900 +4180 +FA40 +4520 +F140 +9580 +9A80 +F440 +9820 +ENDCHAR +STARTCHAR U_8216 +ENCODING 33302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5120 +8FE0 +F900 +27E0 +FD20 +27E0 +F520 +97E0 +F520 +9560 +ENDCHAR +STARTCHAR U_8217 +ENCODING 33303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +50A0 +ABE0 +F880 +23E0 +FAA0 +03E0 +FAA0 +8BE0 +FAA0 +8A60 +ENDCHAR +STARTCHAR U_8218 +ENCODING 33304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +FBC0 +2240 +FBC0 +2200 +FBE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_8219 +ENCODING 33305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +2080 +3F80 +0000 +FBE0 +2080 +FFE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_821A +ENCODING 33306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33C0 +C480 +47E0 +F540 +47E0 +F400 +97E0 +9400 +95E0 +F520 +99E0 +ENDCHAR +STARTCHAR U_821B +ENCODING 33307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +3BE0 +4880 +4A80 +BA80 +0FE0 +1080 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_821C +ENCODING 33308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E40 +2480 +FFE0 +A0A0 +3BE0 +4A80 +AA80 +17E0 +2080 +C080 +ENDCHAR +STARTCHAR U_821D +ENCODING 33309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +1080 +FFE0 +4900 +FFE0 +9120 +7FC0 +2400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_821E +ENCODING 33310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +AA80 +FFE0 +2A80 +FFE0 +2080 +3BE0 +CA80 +37E0 +C080 +ENDCHAR +STARTCHAR U_821F +ENCODING 33311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1F80 +1080 +1480 +1280 +FFE0 +1480 +1280 +2280 +4080 +8380 +ENDCHAR +STARTCHAR U_8220 +ENCODING 33312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7FE0 +4920 +6920 +5920 +4920 +F920 +6920 +5920 +4AA0 +9C40 +ENDCHAR +STARTCHAR U_8221 +ENCODING 33313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4880 +6880 +5880 +4880 +F880 +6880 +5880 +4880 +9FE0 +ENDCHAR +STARTCHAR U_8222 +ENCODING 33314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +4880 +6AA0 +5AA0 +4AA0 +FAA0 +6AA0 +5AA0 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8223 +ENCODING 33315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7540 +5540 +7440 +5440 +F280 +5280 +7100 +5280 +5440 +B820 +ENDCHAR +STARTCHAR U_8224 +ENCODING 33316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7780 +5480 +7480 +5680 +F580 +5480 +7480 +54A0 +54A0 +B860 +ENDCHAR +STARTCHAR U_8225 +ENCODING 33317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4AA0 +6AA0 +5AA0 +4BE0 +FA20 +6A00 +5A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8226 +ENCODING 33318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5100 +7FE0 +5100 +F100 +5280 +7280 +5240 +5540 +B820 +ENDCHAR +STARTCHAR U_8227 +ENCODING 33319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7780 +5480 +7480 +5480 +F680 +5580 +7480 +54A0 +54A0 +B860 +ENDCHAR +STARTCHAR U_8228 +ENCODING 33320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +7BC0 +4A00 +6BE0 +5AA0 +4AA0 +FAA0 +6AA0 +5A40 +4CA0 +9920 +ENDCHAR +STARTCHAR U_8229 +ENCODING 33321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7280 +5280 +7280 +5440 +F540 +5920 +7200 +5440 +5FE0 +B440 +ENDCHAR +STARTCHAR U_822A +ENCODING 33322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6800 +5B80 +FA80 +4A80 +6A80 +5AA0 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_822B +ENCODING 33323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6900 +59E0 +F920 +4920 +6920 +5A20 +4AA0 +9C40 +ENDCHAR +STARTCHAR U_822C +ENCODING 33324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +7A40 +4A40 +6A60 +5C00 +FBE0 +4A20 +6940 +5880 +4940 +9A20 +ENDCHAR +STARTCHAR U_822D +ENCODING 33325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7A80 +4A80 +6AA0 +5BC0 +4A80 +FA80 +6A80 +5AA0 +4BA0 +9AE0 +ENDCHAR +STARTCHAR U_822E +ENCODING 33326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4BE0 +7A20 +4A20 +FBE0 +4A20 +7A00 +4A00 +6C00 +9400 +ENDCHAR +STARTCHAR U_822F +ENCODING 33327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +4BE0 +6AA0 +5AA0 +4AA0 +FBE0 +6AA0 +5880 +4880 +9880 +ENDCHAR +STARTCHAR U_8230 +ENCODING 33328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77C0 +5440 +7540 +5540 +F540 +5540 +7540 +52A0 +52A0 +BC60 +ENDCHAR +STARTCHAR U_8231 +ENCODING 33329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7940 +4A20 +6C00 +5BC0 +4A40 +FA40 +6AC0 +5A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8232 +ENCODING 33330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7100 +5280 +7640 +5920 +F100 +5FE0 +7040 +5280 +5100 +B080 +ENDCHAR +STARTCHAR U_8233 +ENCODING 33331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +4BE0 +6AA0 +5AA0 +4BE0 +FAA0 +6AA0 +5AA0 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8234 +ENCODING 33332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4BE0 +6D00 +5900 +49E0 +F900 +69E0 +5900 +4900 +9900 +ENDCHAR +STARTCHAR U_8235 +ENCODING 33333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6C20 +5920 +4940 +F980 +6900 +5920 +4920 +98E0 +ENDCHAR +STARTCHAR U_8236 +ENCODING 33334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7900 +4BE0 +6A20 +5A20 +4BE0 +FA20 +6A20 +5A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8237 +ENCODING 33335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7880 +4FE0 +6900 +5A40 +FFC0 +4880 +6900 +5A40 +4FE0 +9820 +ENDCHAR +STARTCHAR U_8238 +ENCODING 33336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +7040 +5040 +7740 +5540 +F540 +5740 +7540 +5040 +5040 +B0C0 +ENDCHAR +STARTCHAR U_8239 +ENCODING 33337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4A40 +6A40 +5A60 +4C00 +FBE0 +6A20 +5A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_823A +ENCODING 33338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7AA0 +4AA0 +6BE0 +5AA0 +4AA0 +FBE0 +6AA0 +5880 +4880 +9880 +ENDCHAR +STARTCHAR U_823B +ENCODING 33339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +78E0 +4880 +6BE0 +5A20 +4A20 +FBE0 +6A20 +5A00 +4C00 +9800 +ENDCHAR +STARTCHAR U_823C +ENCODING 33340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7A40 +4A40 +6FE0 +5A40 +4A40 +FFE0 +6800 +5A40 +4C20 +9820 +ENDCHAR +STARTCHAR U_823D +ENCODING 33341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BC0 +4E40 +6980 +5A40 +4CA0 +FFE0 +6C80 +5FE0 +4880 +9880 +ENDCHAR +STARTCHAR U_823E +ENCODING 33342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7140 +5140 +77E0 +5560 +F560 +5560 +7660 +5420 +57E0 +B420 +ENDCHAR +STARTCHAR U_823F +ENCODING 33343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4A80 +6C40 +5BA0 +4800 +FFE0 +6900 +5BE0 +4820 +99C0 +ENDCHAR +STARTCHAR U_8240 +ENCODING 33344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +7F80 +4AA0 +6940 +5BE0 +4840 +F880 +6FE0 +5880 +4880 +9980 +ENDCHAR +STARTCHAR U_8241 +ENCODING 33345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7A80 +4BE0 +7A80 +4C80 +FFE0 +4800 +7BE0 +4A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8242 +ENCODING 33346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A40 +4D80 +6A40 +5CA0 +4BE0 +F880 +6BE0 +5880 +4FE0 +9880 +ENDCHAR +STARTCHAR U_8243 +ENCODING 33347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7AA0 +4AA0 +7BE0 +4AA0 +FBE0 +6880 +5BE0 +4880 +4880 +9FE0 +ENDCHAR +STARTCHAR U_8244 +ENCODING 33348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7AA0 +49C0 +6BE0 +5A20 +4BE0 +FA20 +6BE0 +5A20 +4A20 +9A60 +ENDCHAR +STARTCHAR U_8245 +ENCODING 33349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7940 +4A20 +6DC0 +5880 +4FE0 +F880 +6AC0 +5AA0 +4CA0 +9980 +ENDCHAR +STARTCHAR U_8246 +ENCODING 33350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +FBC0 +4A20 +6B40 +5A80 +4A40 +9B20 +ENDCHAR +STARTCHAR U_8247 +ENCODING 33351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7EE0 +5240 +7440 +5E40 +F2E0 +5A40 +7640 +52E0 +5500 +B8E0 +ENDCHAR +STARTCHAR U_8248 +ENCODING 33352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5200 +7440 +5FE0 +F000 +5540 +7540 +5540 +5540 +B960 +ENDCHAR +STARTCHAR U_8249 +ENCODING 33353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7420 +57E0 +7400 +57E0 +F480 +57E0 +7480 +57E0 +54A0 +B8E0 +ENDCHAR +STARTCHAR U_824A +ENCODING 33354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +4A20 +7BE0 +4A20 +FBE0 +4880 +6BE0 +5AA0 +4AE0 +9880 +ENDCHAR +STARTCHAR U_824B +ENCODING 33355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7840 +4880 +6FE0 +5880 +4980 +F800 +6FE0 +5AA0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_824C +ENCODING 33356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7280 +5640 +7920 +57C0 +F080 +5100 +7640 +5D20 +9440 +B3C0 +ENDCHAR +STARTCHAR U_824D +ENCODING 33357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +5420 +77E0 +5480 +F7E0 +5480 +75E0 +5520 +7520 +9DE0 +ENDCHAR +STARTCHAR U_824E +ENCODING 33358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +4A20 +6BE0 +5A20 +4FE0 +F880 +6880 +5BE0 +4880 +9FE0 +ENDCHAR +STARTCHAR U_824F +ENCODING 33359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +7940 +4BE0 +6880 +5BE0 +4A20 +FBE0 +6A20 +5BE0 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_8250 +ENCODING 33360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7D20 +4EA0 +6FE0 +5A40 +4A20 +FD20 +6BC0 +5E40 +4980 +9E60 +ENDCHAR +STARTCHAR U_8251 +ENCODING 33361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BE0 +4A20 +6BE0 +5A00 +4BE0 +FAA0 +6BE0 +5EA0 +4AA0 +9A60 +ENDCHAR +STARTCHAR U_8252 +ENCODING 33362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7C20 +4FE0 +6C20 +5FE0 +4A40 +FBC0 +6A40 +5BC0 +4A40 +9BC0 +ENDCHAR +STARTCHAR U_8253 +ENCODING 33363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +7FE0 +5540 +75C0 +5400 +F7E0 +5100 +7FE0 +5380 +9540 +B920 +ENDCHAR +STARTCHAR U_8254 +ENCODING 33364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +77E0 +5540 +77E0 +5540 +F5C0 +5400 +77E0 +5540 +5480 +BB60 +ENDCHAR +STARTCHAR U_8255 +ENCODING 33365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4A80 +6FE0 +5D20 +4880 +FFE0 +6A00 +5BE0 +4A20 +9CC0 +ENDCHAR +STARTCHAR U_8256 +ENCODING 33366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7FE0 +4880 +6BE0 +5880 +4FE0 +FA00 +6BE0 +5C80 +4880 +9FE0 +ENDCHAR +STARTCHAR U_8257 +ENCODING 33367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +9000 +D7E0 +B240 +9420 +FFC0 +D540 +B540 +9540 +BFE0 +ENDCHAR +STARTCHAR U_8258 +ENCODING 33368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +74E0 +54A0 +76E0 +54A0 +F7E0 +5080 +77E0 +5240 +5180 +B660 +ENDCHAR +STARTCHAR U_8259 +ENCODING 33369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +7540 +5FE0 +7440 +57C0 +F440 +57C0 +7400 +57C0 +5A40 +B3C0 +ENDCHAR +STARTCHAR U_825A +ENCODING 33370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5280 +7FE0 +5AA0 +FFE0 +5440 +77C0 +5440 +57C0 +B440 +ENDCHAR +STARTCHAR U_825B +ENCODING 33371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77C0 +5540 +7FE0 +5540 +F7C0 +5540 +7FE0 +5480 +5380 +BC60 +ENDCHAR +STARTCHAR U_825C +ENCODING 33372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +7FE0 +5540 +7DE0 +5000 +FFE0 +5920 +77C0 +5540 +55C0 +B100 +ENDCHAR +STARTCHAR U_825D +ENCODING 33373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7100 +5FE0 +7560 +5540 +F000 +57C0 +7040 +57C0 +5040 +B7C0 +ENDCHAR +STARTCHAR U_825E +ENCODING 33374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +77E0 +5A40 +7280 +5AA0 +F6C0 +5280 +76C0 +5AA0 +52A0 +B4E0 +ENDCHAR +STARTCHAR U_825F +ENCODING 33375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5280 +7FE0 +5540 +F540 +57C0 +7540 +5FE0 +5100 +BFE0 +ENDCHAR +STARTCHAR U_8260 +ENCODING 33376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +7AA0 +5640 +77E0 +5800 +F7C0 +5440 +77C0 +5440 +5280 +BFE0 +ENDCHAR +STARTCHAR U_8261 +ENCODING 33377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +7540 +5FE0 +7820 +53C0 +F240 +57E0 +7520 +57E0 +5520 +B7E0 +ENDCHAR +STARTCHAR U_8262 +ENCODING 33378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5540 +7FE0 +5000 +F7E0 +5420 +75A0 +55A0 +9420 +B7E0 +ENDCHAR +STARTCHAR U_8263 +ENCODING 33379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +7100 +57E0 +7520 +57C0 +F520 +57E0 +7540 +57E0 +5A20 +B4E0 +ENDCHAR +STARTCHAR U_8264 +ENCODING 33380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5100 +77C0 +5100 +FFE0 +54A0 +7FE0 +54C0 +5EA0 +B560 +ENDCHAR +STARTCHAR U_8265 +ENCODING 33381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +7560 +5740 +7040 +5FE0 +F540 +5740 +7560 +5540 +9FC0 +B120 +ENDCHAR +STARTCHAR U_8266 +ENCODING 33382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +7A40 +4F60 +6980 +5F40 +4A20 +FF00 +6800 +5FE0 +4AA0 +9FE0 +ENDCHAR +STARTCHAR U_8267 +ENCODING 33383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7FE0 +5240 +77E0 +5C80 +F7E0 +5480 +7FE0 +5240 +9180 +B660 +ENDCHAR +STARTCHAR U_8268 +ENCODING 33384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5280 +7FE0 +5820 +F7C0 +5000 +7FE0 +5540 +9BC0 +B520 +ENDCHAR +STARTCHAR U_8269 +ENCODING 33385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +5AA0 +7540 +5D60 +F540 +57C0 +5440 +77C0 +9440 +B840 +ENDCHAR +STARTCHAR U_826A +ENCODING 33386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +7500 +5FC0 +7540 +57C0 +F540 +57C0 +7AA0 +57C0 +9540 +B7C0 +ENDCHAR +STARTCHAR U_826B +ENCODING 33387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7100 +57E0 +7520 +57E0 +F4A0 +57E0 +74A0 +57E0 +5AA0 +B7E0 +ENDCHAR +STARTCHAR U_826C +ENCODING 33388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7880 +57C0 +7440 +57C0 +F4A0 +5FE0 +7540 +57C0 +92A0 +BCE0 +ENDCHAR +STARTCHAR U_826D +ENCODING 33389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FFE0 +9540 +DFE0 +B540 +FFE0 +9000 +D7E0 +B240 +9180 +9660 +ENDCHAR +STARTCHAR U_826E +ENCODING 33390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FE00 +8200 +FE00 +8200 +FE00 +9080 +9100 +8A00 +9400 +A380 +C100 +ENDCHAR +STARTCHAR U_826F +ENCODING 33391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +1000 +FE00 +8200 +FE00 +8200 +FE00 +9100 +8A00 +8400 +A200 +C180 +ENDCHAR +STARTCHAR U_8270 +ENCODING 33392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +FC40 +17C0 +9440 +57C0 +2520 +1540 +3480 +4C80 +8540 +0620 +ENDCHAR +STARTCHAR U_8271 +ENCODING 33393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +53E0 +2220 +FBE0 +AA80 +FEA0 +22A0 +FE40 +5340 +8A20 +ENDCHAR +STARTCHAR U_8272 +ENCODING 33394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +2200 +7FC0 +A440 +2440 +3FC0 +2000 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_8273 +ENCODING 33395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +FC80 +27E0 +FD20 +2520 +FFE0 +2400 +2420 +2420 +23E0 +ENDCHAR +STARTCHAR U_8274 +ENCODING 33396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +51C0 +FE40 +57E0 +FEA0 +D2A0 +FFE0 +5600 +5E20 +5220 +91E0 +ENDCHAR +STARTCHAR U_8275 +ENCODING 33397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +51C0 +FA40 +57E0 +52A0 +FAA0 +53E0 +5200 +5220 +5220 +91E0 +ENDCHAR +STARTCHAR U_8276 +ENCODING 33398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFE0 +AA40 +FFE0 +02A0 +FEA0 +03E0 +7A00 +4A20 +3220 +FDE0 +ENDCHAR +STARTCHAR U_8277 +ENCODING 33399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +AA40 +FFE0 +AAA0 +FEA0 +4BE0 +7A00 +4A20 +3220 +FDE0 +ENDCHAR +STARTCHAR U_8278 +ENCODING 33400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +AAA0 +AAA0 +AAA0 +AAA0 +FBE0 +AAA0 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_8279 +ENCODING 33401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +1100 +1100 +FFE0 +1100 +1100 +ENDCHAR +STARTCHAR U_827A +ENCODING 33402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0900 +3F80 +0100 +0600 +1800 +2020 +2020 +1FE0 +ENDCHAR +STARTCHAR U_827B +ENCODING 33403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0440 +0440 +0840 +1040 +2140 +4080 +ENDCHAR +STARTCHAR U_827C +ENCODING 33404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +FFC0 +0400 +0400 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_827D +ENCODING 33405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +7F00 +0900 +0900 +0900 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_827E +ENCODING 33406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +2200 +2200 +1400 +1400 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_827F +ENCODING 33407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FE00 +1200 +1380 +1080 +2080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_8280 +ENCODING 33408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +FF80 +1080 +1080 +1080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_8281 +ENCODING 33409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +1E00 +1200 +1200 +1200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_8282 +ENCODING 33410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7F80 +0880 +0880 +0880 +0B80 +0800 +0800 +ENDCHAR +STARTCHAR U_8283 +ENCODING 33411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0000 +1F00 +1100 +1900 +1500 +2120 +4120 +80E0 +ENDCHAR +STARTCHAR U_8284 +ENCODING 33412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0800 +FF00 +0900 +3900 +0900 +1540 +2140 +C0C0 +ENDCHAR +STARTCHAR U_8285 +ENCODING 33413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0900 +0880 +0FC0 +F800 +0800 +0440 +0240 +01C0 +ENDCHAR +STARTCHAR U_8286 +ENCODING 33414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7F80 +2480 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8287 +ENCODING 33415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +2480 +2480 +2480 +2580 +0400 +0400 +ENDCHAR +STARTCHAR U_8288 +ENCODING 33416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +1500 +F5E0 +1500 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_8289 +ENCODING 33417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +0400 +0400 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_828A +ENCODING 33418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +0400 +FFE0 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_828B +ENCODING 33419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +7F80 +0400 +FFC0 +0400 +0400 +0400 +1C00 +ENDCHAR +STARTCHAR U_828C +ENCODING 33420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0000 +FFE0 +1000 +3F80 +0080 +0080 +0300 +ENDCHAR +STARTCHAR U_828D +ENCODING 33421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2000 +3FC0 +4040 +8840 +0440 +0440 +0040 +0180 +ENDCHAR +STARTCHAR U_828E +ENCODING 33422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0080 +1F80 +2000 +3FC0 +0040 +0240 +0180 +ENDCHAR +STARTCHAR U_828F +ENCODING 33423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +0400 +0400 +7FC0 +0400 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8290 +ENCODING 33424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +0400 +0600 +0580 +0480 +0400 +0400 +ENDCHAR +STARTCHAR U_8291 +ENCODING 33425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0080 +0080 +3F80 +2000 +2020 +2020 +3FE0 +ENDCHAR +STARTCHAR U_8292 +ENCODING 33426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0200 +FFE0 +2000 +2000 +2000 +2000 +3FC0 +ENDCHAR +STARTCHAR U_8293 +ENCODING 33427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +3F80 +0200 +0400 +FFE0 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_8294 +ENCODING 33428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +2480 +2480 +3F80 +0400 +2080 +AAA0 +AAA0 +FBE0 +2080 +C080 +ENDCHAR +STARTCHAR U_8295 +ENCODING 33429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +0FC0 +1080 +2900 +0600 +0400 +1800 +6000 +ENDCHAR +STARTCHAR U_8296 +ENCODING 33430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0400 +7FC0 +0400 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_8297 +ENCODING 33431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1100 +7E00 +0840 +1080 +7F00 +0200 +0C00 +F000 +ENDCHAR +STARTCHAR U_8298 +ENCODING 33432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +4240 +7A80 +4300 +4200 +4220 +5220 +61E0 +ENDCHAR +STARTCHAR U_8299 +ENCODING 33433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0400 +FFE0 +0400 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_829A +ENCODING 33434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2480 +2480 +3F80 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_829B +ENCODING 33435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +7F00 +1100 +FFC0 +1100 +7F00 +1000 +2000 +C000 +ENDCHAR +STARTCHAR U_829C +ENCODING 33436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +0400 +FFE0 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_829D +ENCODING 33437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0800 +0400 +FF00 +0200 +0C00 +1000 +6000 +9FC0 +ENDCHAR +STARTCHAR U_829E +ENCODING 33438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +7FC0 +8000 +3F00 +0000 +7F00 +0140 +00C0 +0040 +ENDCHAR +STARTCHAR U_829F +ENCODING 33439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +3E00 +2200 +C1C0 +7F00 +1200 +0C00 +3300 +C0C0 +ENDCHAR +STARTCHAR U_82A0 +ENCODING 33440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +0400 +FFE0 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_82A1 +ENCODING 33441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +2000 +3F80 +4900 +8800 +1400 +2200 +41C0 +8080 +ENDCHAR +STARTCHAR U_82A2 +ENCODING 33442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +1000 +1000 +27C0 +6000 +A000 +2000 +2FE0 +2000 +ENDCHAR +STARTCHAR U_82A3 +ENCODING 33443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +0800 +1800 +2A00 +4980 +8880 +0800 +0800 +ENDCHAR +STARTCHAR U_82A4 +ENCODING 33444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7D00 +0900 +1100 +1D00 +F100 +1120 +1120 +30E0 +ENDCHAR +STARTCHAR U_82A5 +ENCODING 33445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0600 +0900 +30E0 +C940 +0900 +0900 +1100 +6100 +ENDCHAR +STARTCHAR U_82A6 +ENCODING 33446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0D00 +0200 +3FC0 +2040 +3FC0 +2040 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_82A7 +ENCODING 33447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +0900 +0600 +FFE0 +0240 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_82A8 +ENCODING 33448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F00 +1100 +13C0 +1840 +1480 +2300 +4500 +98E0 +ENDCHAR +STARTCHAR U_82A9 +ENCODING 33449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0C00 +3300 +C8C0 +0400 +7F00 +0200 +0400 +0800 +ENDCHAR +STARTCHAR U_82AA +ENCODING 33450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +3C00 +2400 +3FC0 +2200 +2100 +28A0 +3060 +ENDCHAR +STARTCHAR U_82AB +ENCODING 33451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +3F80 +0000 +FFE0 +1200 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_82AC +ENCODING 33452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +1100 +2080 +5FC0 +88A0 +0880 +3480 +C300 +ENDCHAR +STARTCHAR U_82AD +ENCODING 33453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +7F80 +4480 +4480 +7F80 +4000 +4040 +4040 +3FC0 +ENDCHAR +STARTCHAR U_82AE +ENCODING 33454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0400 +7FC0 +4440 +4A40 +4940 +5140 +4040 +41C0 +ENDCHAR +STARTCHAR U_82AF +ENCODING 33455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0000 +0800 +1480 +5440 +5040 +5100 +9100 +0F00 +ENDCHAR +STARTCHAR U_82B0 +ENCODING 33456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0400 +3F80 +1100 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_82B1 +ENCODING 33457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1240 +2280 +6300 +A600 +3A20 +2220 +21E0 +ENDCHAR +STARTCHAR U_82B2 +ENCODING 33458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +1100 +2080 +D360 +1C00 +7080 +1080 +0F80 +ENDCHAR +STARTCHAR U_82B3 +ENCODING 33459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0400 +FFC0 +1000 +1F80 +1080 +1080 +2080 +C300 +ENDCHAR +STARTCHAR U_82B4 +ENCODING 33460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +3FC0 +4A40 +9240 +2440 +4840 +1240 +2180 +ENDCHAR +STARTCHAR U_82B5 +ENCODING 33461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0480 +7FE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_82B6 +ENCODING 33462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3FC0 +4840 +9040 +2240 +3F40 +0040 +0180 +ENDCHAR +STARTCHAR U_82B7 +ENCODING 33463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0200 +0200 +1200 +13C0 +1200 +1200 +1200 +FFE0 +ENDCHAR +STARTCHAR U_82B8 +ENCODING 33464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +3F80 +0000 +FFE0 +0800 +1080 +2040 +3FC0 +ENDCHAR +STARTCHAR U_82B9 +ENCODING 33465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +2000 +3FE0 +2100 +2100 +2100 +4100 +8100 +ENDCHAR +STARTCHAR U_82BA +ENCODING 33466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +0400 +FFE0 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_82BB +ENCODING 33467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +5520 +9F20 +08C0 +3000 +3FE0 +D520 +1F20 +0820 +70C0 +ENDCHAR +STARTCHAR U_82BC +ENCODING 33468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0380 +3C00 +0400 +7FC0 +0400 +FFC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_82BD +ENCODING 33469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1100 +2100 +7FE0 +0500 +0900 +3100 +C300 +ENDCHAR +STARTCHAR U_82BE +ENCODING 33470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2480 +FFE0 +0400 +7FC0 +4440 +4440 +4440 +45C0 +0400 +ENDCHAR +STARTCHAR U_82BF +ENCODING 33471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1FC0 +2240 +6280 +A2E0 +2220 +2420 +24A0 +2840 +ENDCHAR +STARTCHAR U_82C0 +ENCODING 33472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0000 +1F00 +1100 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_82C1 +ENCODING 33473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +2100 +2100 +2100 +3100 +2A80 +4440 +8820 +ENDCHAR +STARTCHAR U_82C2 +ENCODING 33474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +2440 +2480 +4500 +0A00 +1100 +20E0 +C040 +ENDCHAR +STARTCHAR U_82C3 +ENCODING 33475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +FFE0 +0800 +1F00 +2900 +4600 +9980 +6060 +ENDCHAR +STARTCHAR U_82C4 +ENCODING 33476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0200 +FFE0 +0400 +0700 +04C0 +0440 +0400 +0400 +ENDCHAR +STARTCHAR U_82C5 +ENCODING 33477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0040 +4840 +2940 +1140 +2940 +4540 +8440 +00C0 +ENDCHAR +STARTCHAR U_82C6 +ENCODING 33478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +27C0 +F940 +2140 +2140 +3240 +2440 +08C0 +ENDCHAR +STARTCHAR U_82C7 +ENCODING 33479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0400 +7FC0 +0400 +FFE0 +0420 +04E0 +0400 +ENDCHAR +STARTCHAR U_82C8 +ENCODING 33480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +4400 +7FC0 +4440 +4440 +4440 +8840 +B180 +ENDCHAR +STARTCHAR U_82C9 +ENCODING 33481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +4A00 +4A00 +5240 +61C0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_82CA +ENCODING 33482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +4000 +4F80 +4880 +4880 +4B20 +4820 +87E0 +ENDCHAR +STARTCHAR U_82CB +ENCODING 33483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +2480 +2480 +2680 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_82CC +ENCODING 33484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1080 +1300 +1C00 +FFE0 +1200 +1100 +1480 +1860 +ENDCHAR +STARTCHAR U_82CD +ENCODING 33485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +C060 +1F00 +1100 +1240 +1040 +0FC0 +ENDCHAR +STARTCHAR U_82CE +ENCODING 33486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +8020 +0000 +0000 +0000 +FFE0 +ENDCHAR +STARTCHAR U_82CF +ENCODING 33487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +7F80 +0880 +48C0 +48A0 +90A0 +2080 +C300 +ENDCHAR +STARTCHAR U_82D0 +ENCODING 33488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0440 +7FC0 +4400 +7FC0 +1440 +2540 +C480 +ENDCHAR +STARTCHAR U_82D1 +ENCODING 33489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +3FC0 +2640 +6A40 +9A80 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_82D2 +ENCODING 33490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2440 +3FC0 +2440 +FFE0 +2040 +2040 +20C0 +ENDCHAR +STARTCHAR U_82D3 +ENCODING 33491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +1100 +2480 +C260 +3F80 +0100 +0A00 +0400 +ENDCHAR +STARTCHAR U_82D4 +ENCODING 33492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82D5 +ENCODING 33493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FF80 +1080 +2280 +C100 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82D6 +ENCODING 33494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +4440 +7FC0 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_82D7 +ENCODING 33495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +4440 +7FC0 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_82D8 +ENCODING 33496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +5F40 +5140 +5F40 +5140 +4040 +41C0 +ENDCHAR +STARTCHAR U_82D9 +ENCODING 33497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0200 +7FC0 +1080 +1080 +0900 +0900 +0200 +FFE0 +ENDCHAR +STARTCHAR U_82DA +ENCODING 33498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +4440 +4440 +84C0 +ENDCHAR +STARTCHAR U_82DB +ENCODING 33499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0080 +3C80 +2480 +3C80 +2480 +0080 +0180 +ENDCHAR +STARTCHAR U_82DC +ENCODING 33500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82DD +ENCODING 33501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +1200 +F260 +1380 +1200 +3200 +D220 +11E0 +ENDCHAR +STARTCHAR U_82DE +ENCODING 33502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4040 +BE40 +2240 +3E40 +20A0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_82DF +ENCODING 33503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +4040 +9E40 +1240 +1E40 +1240 +0040 +0180 +ENDCHAR +STARTCHAR U_82E0 +ENCODING 33504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +4080 +7F80 +4200 +7FE0 +4200 +5920 +E0E0 +ENDCHAR +STARTCHAR U_82E1 +ENCODING 33505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +4900 +4500 +4500 +4100 +5100 +6280 +C440 +1840 +ENDCHAR +STARTCHAR U_82E2 +ENCODING 33506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2040 +3FC0 +2000 +3FC0 +2040 +2040 +3FC0 +ENDCHAR +STARTCHAR U_82E3 +ENCODING 33507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4000 +7F80 +4080 +7F80 +4000 +4000 +7FC0 +ENDCHAR +STARTCHAR U_82E4 +ENCODING 33508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +0D00 +14C0 +6440 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_82E5 +ENCODING 33509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1100 +FFC0 +1100 +0800 +FFC0 +1000 +3F80 +5080 +9080 +1F80 +1080 +ENDCHAR +STARTCHAR U_82E6 +ENCODING 33510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +0400 +FFE0 +0400 +3F80 +2080 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82E7 +ENCODING 33511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +7FC0 +0200 +0200 +0200 +0200 +0E00 +ENDCHAR +STARTCHAR U_82E8 +ENCODING 33512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2040 +3FC0 +2840 +2980 +2E20 +4820 +87E0 +ENDCHAR +STARTCHAR U_82E9 +ENCODING 33513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +3F80 +2080 +2080 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_82EA +ENCODING 33514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +4640 +4940 +50C0 +6040 +41C0 +ENDCHAR +STARTCHAR U_82EB +ENCODING 33515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1500 +07C0 +0400 +3FC0 +2040 +2040 +3FC0 +2040 +ENDCHAR +STARTCHAR U_82EC +ENCODING 33516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +4440 +4640 +4940 +50C0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_82ED +ENCODING 33517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +47E0 +F120 +2120 +4920 +F620 +44A0 +0840 +ENDCHAR +STARTCHAR U_82EE +ENCODING 33518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +2200 +6A40 +AA40 +2A40 +2A40 +2FC0 +2000 +ENDCHAR +STARTCHAR U_82EF +ENCODING 33519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0400 +1500 +2480 +5F40 +8420 +0400 +ENDCHAR +STARTCHAR U_82F0 +ENCODING 33520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7880 +0880 +7900 +4100 +7A00 +0A40 +4FA0 +3220 +ENDCHAR +STARTCHAR U_82F1 +ENCODING 33521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +2480 +2480 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_82F2 +ENCODING 33522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +1FE0 +2400 +47C0 +0400 +07E0 +0400 +0400 +ENDCHAR +STARTCHAR U_82F3 +ENCODING 33523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0F80 +1900 +6600 +1980 +E660 +0100 +0C00 +0200 +ENDCHAR +STARTCHAR U_82F4 +ENCODING 33524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +3F80 +2080 +3F80 +2080 +3F80 +2080 +FFE0 +ENDCHAR +STARTCHAR U_82F5 +ENCODING 33525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +3FC0 +4400 +0400 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_82F6 +ENCODING 33526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3180 +C460 +0400 +2480 +4440 +0C00 +ENDCHAR +STARTCHAR U_82F7 +ENCODING 33527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +2080 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_82F8 +ENCODING 33528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +1500 +FFE0 +0400 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_82F9 +ENCODING 33529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +1480 +1500 +FFE0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_82FA +ENCODING 33530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2880 +2480 +FFE0 +4480 +7FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_82FB +ENCODING 33531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +2FE0 +6080 +A880 +2480 +2480 +2080 +2180 +ENDCHAR +STARTCHAR U_82FC +ENCODING 33532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1100 +2400 +2400 +3FC0 +4400 +9F80 +0400 +0400 +7FE0 +ENDCHAR +STARTCHAR U_82FD +ENCODING 33533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +3D00 +2500 +2480 +2480 +2540 +46A0 +8480 +ENDCHAR +STARTCHAR U_82FE +ENCODING 33534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0480 +1280 +5100 +5240 +5420 +98A0 +1080 +6F80 +ENDCHAR +STARTCHAR U_82FF +ENCODING 33535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +3F80 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8300 +ENCODING 33536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1280 +7FC0 +1240 +7FC0 +5200 +7FC0 +1240 +22C0 +4200 +ENDCHAR +STARTCHAR U_8301 +ENCODING 33537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +2480 +3F80 +0400 +4440 +4440 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8302 +ENCODING 33538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1080 +0440 +3FE0 +2400 +2480 +2500 +2220 +4520 +98E0 +ENDCHAR +STARTCHAR U_8303 +ENCODING 33539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +27C0 +9440 +5440 +2440 +E580 +4420 +4420 +43E0 +ENDCHAR +STARTCHAR U_8304 +ENCODING 33540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +FDE0 +2520 +2520 +2520 +2520 +45E0 +9920 +ENDCHAR +STARTCHAR U_8305 +ENCODING 33541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7F80 +0900 +0600 +FFE0 +0A20 +1240 +2200 +CE00 +ENDCHAR +STARTCHAR U_8306 +ENCODING 33542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0800 +71E0 +4920 +4920 +5920 +69E0 +1100 +6100 +ENDCHAR +STARTCHAR U_8307 +ENCODING 33543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0880 +FFE0 +0800 +0F80 +1500 +2200 +4D80 +B060 +ENDCHAR +STARTCHAR U_8308 +ENCODING 33544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +5120 +5D40 +5180 +5100 +5D20 +F120 +40E0 +ENDCHAR +STARTCHAR U_8309 +ENCODING 33545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +0400 +7FC0 +0E00 +1500 +24E0 +C440 +ENDCHAR +STARTCHAR U_830A +ENCODING 33546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0000 +03C0 +3C00 +2000 +3FC0 +2200 +2200 +FFE0 +ENDCHAR +STARTCHAR U_830B +ENCODING 33547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +03C0 +7C00 +4200 +7FC0 +4200 +5100 +58A0 +6460 +ENDCHAR +STARTCHAR U_830C +ENCODING 33548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1100 +1100 +2FE0 +6100 +A100 +2100 +2100 +27C0 +ENDCHAR +STARTCHAR U_830D +ENCODING 33549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +F3C0 +1200 +4000 +7F80 +8080 +3C80 +2480 +3C80 +0080 +0700 +ENDCHAR +STARTCHAR U_830E +ENCODING 33550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F00 +0600 +1980 +E060 +3F80 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_830F +ENCODING 33551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0900 +FFE0 +0A00 +0A40 +0A80 +1320 +2220 +CDE0 +ENDCHAR +STARTCHAR U_8310 +ENCODING 33552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +1FC0 +3540 +4940 +1640 +6540 +0940 +3080 +ENDCHAR +STARTCHAR U_8311 +ENCODING 33553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2880 +2580 +2000 +3FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_8312 +ENCODING 33554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +23C0 +3A40 +4A80 +AA40 +1220 +22A0 +4240 +0200 +ENDCHAR +STARTCHAR U_8313 +ENCODING 33555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FE0 +4040 +0A00 +0A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_8314 +ENCODING 33556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +7FE0 +4020 +8240 +0200 +3FC0 +0200 +0200 +7FE0 +ENDCHAR +STARTCHAR U_8315 +ENCODING 33557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +7F80 +0880 +7E80 +08A0 +0860 +0820 +ENDCHAR +STARTCHAR U_8316 +ENCODING 33558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0F80 +1900 +6600 +1980 +6060 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8317 +ENCODING 33559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +1F00 +3200 +CC00 +1FC0 +F040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_8318 +ENCODING 33560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +0880 +1080 +7BC0 +2940 +2940 +6B40 +9480 +ENDCHAR +STARTCHAR U_8319 +ENCODING 33561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +0480 +FFC0 +2400 +FC80 +2500 +2240 +4540 +98C0 +ENDCHAR +STARTCHAR U_831A +ENCODING 33562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BE0 +4220 +7A20 +4220 +4220 +5AE0 +E240 +4200 +ENDCHAR +STARTCHAR U_831B +ENCODING 33563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3FC0 +2280 +2900 +30E0 +ENDCHAR +STARTCHAR U_831C +ENCODING 33564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0A00 +7FC0 +4A40 +5240 +63C0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_831D +ENCODING 33565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FC0 +4200 +5F80 +5080 +5F80 +4200 +4200 +7FE0 +ENDCHAR +STARTCHAR U_831E +ENCODING 33566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4400 +7F80 +4080 +7F80 +4480 +4400 +7FE0 +ENDCHAR +STARTCHAR U_831F +ENCODING 33567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0480 +FFE0 +0480 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8320 +ENCODING 33568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +1100 +2FE0 +2100 +6300 +A580 +2940 +3120 +2100 +ENDCHAR +STARTCHAR U_8321 +ENCODING 33569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1500 +7FE0 +8040 +1F00 +0200 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_8322 +ENCODING 33570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FC40 +2240 +7A40 +4A40 +AA40 +1240 +2040 +C1C0 +ENDCHAR +STARTCHAR U_8323 +ENCODING 33571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +7FC0 +0400 +7FC0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8324 +ENCODING 33572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0F80 +3100 +0E00 +13C0 +6C80 +1500 +0200 +7C00 +ENDCHAR +STARTCHAR U_8325 +ENCODING 33573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8326 +ENCODING 33574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +4440 +4EC0 +1500 +24E0 +C440 +ENDCHAR +STARTCHAR U_8327 +ENCODING 33575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +7FC0 +4440 +4440 +7FC0 +0480 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8328 +ENCODING 33576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +8400 +57C0 +2840 +3280 +C200 +4500 +4880 +7040 +ENDCHAR +STARTCHAR U_8329 +ENCODING 33577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +3F80 +2000 +3FE0 +2000 +2FC0 +2840 +4FC0 +8840 +ENDCHAR +STARTCHAR U_832A +ENCODING 33578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0440 +2480 +1500 +FFE0 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_832B +ENCODING 33579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2200 +9100 +5FE0 +2400 +2400 +C400 +4400 +47E0 +ENDCHAR +STARTCHAR U_832C +ENCODING 33580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +FFE0 +1100 +3100 +57C0 +9100 +1100 +1FE0 +ENDCHAR +STARTCHAR U_832D +ENCODING 33581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2080 +5140 +8A20 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_832E +ENCODING 33582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0780 +0400 +FFE0 +0400 +2480 +2440 +4C40 +ENDCHAR +STARTCHAR U_832F +ENCODING 33583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0180 +2140 +2FE0 +6100 +A100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_8330 +ENCODING 33584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4440 +7FC0 +4440 +7FC0 +2400 +1C00 +E3E0 +ENDCHAR +STARTCHAR U_8331 +ENCODING 33585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1000 +2400 +3FC0 +4400 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_8332 +ENCODING 33586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1080 +2100 +4A40 +F380 +2100 +4A40 +FFE0 +0420 +ENDCHAR +STARTCHAR U_8333 +ENCODING 33587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2000 +97C0 +5100 +2100 +2100 +C100 +4100 +4FE0 +ENDCHAR +STARTCHAR U_8334 +ENCODING 33588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +5F40 +5140 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8335 +ENCODING 33589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +4440 +5F40 +4440 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_8336 +ENCODING 33590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3580 +C460 +3F80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_8337 +ENCODING 33591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1280 +1240 +13E0 +2E00 +6240 +A280 +2120 +22A0 +2C60 +ENDCHAR +STARTCHAR U_8338 +ENCODING 33592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +2100 +3F00 +2100 +3F00 +21C0 +FF00 +0100 +ENDCHAR +STARTCHAR U_8339 +ENCODING 33593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1000 +FDE0 +2920 +2920 +4920 +3120 +19E0 +E520 +ENDCHAR +STARTCHAR U_833A +ENCODING 33594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0800 +1080 +3F40 +0900 +0920 +1120 +E0E0 +ENDCHAR +STARTCHAR U_833B +ENCODING 33595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +AAA0 +FBE0 +2080 +C000 +2080 +AAA0 +AAA0 +FBE0 +2080 +C080 +ENDCHAR +STARTCHAR U_833C +ENCODING 33596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4040 +5F40 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_833D +ENCODING 33597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3100 +2FE0 +6920 +A920 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_833E +ENCODING 33598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +7FC0 +1100 +1100 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_833F +ENCODING 33599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FF80 +2480 +2680 +2580 +3C80 +E4A0 +48A0 +1060 +ENDCHAR +STARTCHAR U_8340 +ENCODING 33600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +8040 +3E40 +2240 +3E40 +2240 +3E40 +0180 +ENDCHAR +STARTCHAR U_8341 +ENCODING 33601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +FFE0 +1080 +1F80 +1080 +1F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_8342 +ENCODING 33602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1500 +2080 +DF60 +0800 +1F80 +0080 +0300 +ENDCHAR +STARTCHAR U_8343 +ENCODING 33603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +1100 +2080 +DF60 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8344 +ENCODING 33604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +3E00 +0480 +1900 +6200 +0D80 +7060 +ENDCHAR +STARTCHAR U_8345 +ENCODING 33605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0000 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_8346 +ENCODING 33606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +FF20 +24A0 +00A0 +7EA0 +24A0 +FFA0 +24A0 +2420 +4420 +84E0 +ENDCHAR +STARTCHAR U_8347 +ENCODING 33607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +23C0 +4000 +9000 +2FE0 +6080 +A080 +2080 +2180 +ENDCHAR +STARTCHAR U_8348 +ENCODING 33608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +3FE0 +4880 +AA80 +13E0 +2080 +4080 +8080 +ENDCHAR +STARTCHAR U_8349 +ENCODING 33609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_834A +ENCODING 33610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0020 +7EA0 +14A0 +14A0 +FFA0 +14A0 +2420 +44E0 +ENDCHAR +STARTCHAR U_834B +ENCODING 33611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0400 +7FC0 +4A40 +4A40 +4A40 +4A40 +40C0 +ENDCHAR +STARTCHAR U_834C +ENCODING 33612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8820 +0800 +FFE0 +1100 +3200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_834D +ENCODING 33613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +4BE0 +4A40 +4D40 +5940 +E880 +4940 +0A20 +ENDCHAR +STARTCHAR U_834E +ENCODING 33614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0800 +1080 +3F40 +0400 +3FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_834F +ENCODING 33615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +11C0 +1F00 +2100 +7FE0 +A100 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8350 +ENCODING 33616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1000 +27C0 +6080 +BFE0 +2100 +2100 +2300 +ENDCHAR +STARTCHAR U_8351 +ENCODING 33617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0480 +7F80 +4400 +7FC0 +04C0 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8352 +ENCODING 33618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2000 +3FC0 +0000 +2480 +2480 +44A0 +8460 +ENDCHAR +STARTCHAR U_8353 +ENCODING 33619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2080 +1100 +7FC0 +1100 +FFE0 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_8354 +ENCODING 33620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0880 +F700 +2080 +FBE0 +2920 +4A20 +B4C0 +ENDCHAR +STARTCHAR U_8355 +ENCODING 33621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4FC0 +7A40 +4A40 +7A40 +4A40 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_8356 +ENCODING 33622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F40 +0480 +FFE0 +0C00 +1980 +EE20 +0820 +07E0 +ENDCHAR +STARTCHAR U_8357 +ENCODING 33623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0440 +7FE0 +4400 +4240 +6280 +5120 +82A0 +8C60 +ENDCHAR +STARTCHAR U_8358 +ENCODING 33624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0000 +9100 +5100 +1FE0 +3100 +5100 +9100 +17C0 +ENDCHAR +STARTCHAR U_8359 +ENCODING 33625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +2100 +0100 +EFE0 +2100 +2280 +2440 +5820 +8FE0 +ENDCHAR +STARTCHAR U_835A +ENCODING 33626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2480 +1500 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_835B +ENCODING 33627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0500 +3B40 +00C0 +FFE0 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_835C +ENCODING 33628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4240 +7B80 +4220 +73E0 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_835D +ENCODING 33629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +4540 +5540 +5540 +5540 +5540 +2840 +C4C0 +ENDCHAR +STARTCHAR U_835E +ENCODING 33630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0800 +FFE0 +2080 +D160 +1100 +1100 +E100 +ENDCHAR +STARTCHAR U_835F +ENCODING 33631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0000 +7FC0 +1100 +2080 +7FC0 +ENDCHAR +STARTCHAR U_8360 +ENCODING 33632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +1100 +0E00 +F1E0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_8361 +ENCODING 33633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2780 +8A00 +57E0 +12A0 +24A0 +E920 +2220 +24C0 +ENDCHAR +STARTCHAR U_8362 +ENCODING 33634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +8020 +3F80 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_8363 +ENCODING 33635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +0400 +FFE0 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8364 +ENCODING 33636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8820 +7FC0 +1400 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8365 +ENCODING 33637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +0440 +F680 +1500 +2480 +4460 +8C20 +ENDCHAR +STARTCHAR U_8366 +ENCODING 33638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +2400 +3FC0 +4400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8367 +ENCODING 33639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +8420 +2440 +2480 +4500 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_8368 +ENCODING 33640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0040 +7FC0 +0040 +FFE0 +2100 +1100 +0300 +ENDCHAR +STARTCHAR U_8369 +ENCODING 33641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +2040 +3FC0 +2100 +4C80 +8260 +1C00 +0300 +ENDCHAR +STARTCHAR U_836A +ENCODING 33642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F880 +1080 +2080 +3AC0 +E2A0 +24A0 +2080 +6180 +ENDCHAR +STARTCHAR U_836B +ENCODING 33643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +5240 +63C0 +5240 +4BC0 +6A40 +5440 +48C0 +ENDCHAR +STARTCHAR U_836C +ENCODING 33644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +1240 +4A00 +2200 +FFE0 +0200 +0D80 +F060 +ENDCHAR +STARTCHAR U_836D +ENCODING 33645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +97C0 +E100 +4100 +F100 +0100 +F100 +4FE0 +ENDCHAR +STARTCHAR U_836E +ENCODING 33646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +57E0 +E080 +4480 +F280 +0080 +3080 +C180 +ENDCHAR +STARTCHAR U_836F +ENCODING 33647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +47C0 +E440 +4A40 +A140 +C040 +3040 +C180 +ENDCHAR +STARTCHAR U_8370 +ENCODING 33648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +2000 +F900 +27C0 +7100 +6900 +A100 +2FE0 +ENDCHAR +STARTCHAR U_8371 +ENCODING 33649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FC0 +4040 +7FC0 +4700 +5C00 +4780 +5C20 +83E0 +ENDCHAR +STARTCHAR U_8372 +ENCODING 33650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8373 +ENCODING 33651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0000 +3F80 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8374 +ENCODING 33652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFC0 +2100 +3100 +EFE0 +2280 +2440 +E820 +ENDCHAR +STARTCHAR U_8375 +ENCODING 33653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +2440 +0840 +7180 +0400 +5240 +90A0 +0F80 +ENDCHAR +STARTCHAR U_8376 +ENCODING 33654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0100 +F280 +9440 +9920 +97C0 +F040 +0080 +0100 +ENDCHAR +STARTCHAR U_8377 +ENCODING 33655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2040 +6F40 +A940 +2940 +2F40 +2040 +21C0 +ENDCHAR +STARTCHAR U_8378 +ENCODING 33656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +8220 +0400 +FFE0 +0400 +0C00 +ENDCHAR +STARTCHAR U_8379 +ENCODING 33657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27C0 +2400 +FFE0 +0400 +2440 +4580 +0600 +F800 +ENDCHAR +STARTCHAR U_837A +ENCODING 33658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2400 +27E0 +FC20 +2120 +20A0 +38A0 +E720 +40C0 +ENDCHAR +STARTCHAR U_837B +ENCODING 33659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +5100 +2100 +5520 +B940 +5100 +9280 +1440 +6820 +ENDCHAR +STARTCHAR U_837C +ENCODING 33660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0400 +7FC0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_837D +ENCODING 33661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7E40 +4880 +2500 +FFE0 +1100 +3200 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_837E +ENCODING 33662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +7FC0 +2080 +DF60 +3100 +4A00 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_837F +ENCODING 33663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +0240 +7FE0 +4200 +7A40 +4A80 +4920 +5AA0 +8460 +ENDCHAR +STARTCHAR U_8380 +ENCODING 33664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4000 +5F80 +4000 +7FE0 +5240 +5580 +98E0 +ENDCHAR +STARTCHAR U_8381 +ENCODING 33665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +2480 +2480 +5540 +9640 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8382 +ENCODING 33666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7840 +4940 +7940 +2140 +FD40 +2540 +4440 +8CC0 +ENDCHAR +STARTCHAR U_8383 +ENCODING 33667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3580 +FFE0 +1400 +3FC0 +E440 +24C0 +0400 +ENDCHAR +STARTCHAR U_8384 +ENCODING 33668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2480 +3F80 +2480 +3F80 +2400 +1800 +E7E0 +ENDCHAR +STARTCHAR U_8385 +ENCODING 33669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +1100 +2FE0 +2000 +6440 +A240 +2280 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8386 +ENCODING 33670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +FFE0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +44C0 +ENDCHAR +STARTCHAR U_8387 +ENCODING 33671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7900 +4FE0 +7920 +4920 +7920 +4A20 +FC20 +08C0 +ENDCHAR +STARTCHAR U_8388 +ENCODING 33672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4780 +2480 +8480 +6860 +2FC0 +C480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_8389 +ENCODING 33673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0C20 +7120 +1120 +FD20 +1120 +3920 +5420 +92E0 +ENDCHAR +STARTCHAR U_838A +ENCODING 33674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4880 +4880 +7FE0 +0880 +F880 +4880 +4880 +8BE0 +ENDCHAR +STARTCHAR U_838B +ENCODING 33675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1400 +27E0 +6A00 +B3C0 +2200 +23E0 +2200 +2200 +ENDCHAR +STARTCHAR U_838C +ENCODING 33676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +3F80 +2080 +2080 +3F80 +0A20 +3220 +C1E0 +ENDCHAR +STARTCHAR U_838D +ENCODING 33677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +0420 +FFE0 +2440 +1680 +0D00 +3500 +C4E0 +1C40 +ENDCHAR +STARTCHAR U_838E +ENCODING 33678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +A540 +4520 +2920 +C940 +4080 +4300 +4C00 +ENDCHAR +STARTCHAR U_838F +ENCODING 33679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FB40 +2520 +3920 +E940 +2080 +2300 +EC00 +ENDCHAR +STARTCHAR U_8390 +ENCODING 33680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +2FE0 +9920 +5180 +2280 +E2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8391 +ENCODING 33681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F80 +7100 +1F00 +E4E0 +3F80 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8392 +ENCODING 33682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0000 +7FC0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8393 +ENCODING 33683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +7FC0 +A880 +2480 +FFE0 +2480 +3FE0 +0080 +0300 +ENDCHAR +STARTCHAR U_8394 +ENCODING 33684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +5140 +60C0 +5F40 +5140 +5140 +7FC0 +ENDCHAR +STARTCHAR U_8395 +ENCODING 33685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1500 +2480 +C460 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_8396 +ENCODING 33686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +4900 +2480 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8397 +ENCODING 33687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8398 +ENCODING 33688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +ENDCHAR +STARTCHAR U_8399 +ENCODING 33689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0880 +FFE0 +1080 +7F80 +3080 +D080 +1F80 +ENDCHAR +STARTCHAR U_839A +ENCODING 33690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +2100 +71E0 +1500 +9500 +67E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_839B +ENCODING 33691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F0C0 +2700 +7100 +17C0 +5100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_839C +ENCODING 33692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +53E0 +D440 +5A40 +5140 +5080 +4140 +4620 +ENDCHAR +STARTCHAR U_839D +ENCODING 33693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +2480 +5540 +8420 +7FC0 +0400 +0400 +FFE0 +ENDCHAR +STARTCHAR U_839E +ENCODING 33694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +3F80 +0000 +FFE0 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_839F +ENCODING 33695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3580 +DF60 +0200 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_83A0 +ENCODING 33696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0400 +FFE0 +2480 +DF60 +09C0 +3040 +C380 +ENDCHAR +STARTCHAR U_83A1 +ENCODING 33697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0400 +27C0 +2400 +5C00 +83E0 +ENDCHAR +STARTCHAR U_83A2 +ENCODING 33698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2480 +2480 +5540 +8A20 +3180 +C060 +ENDCHAR +STARTCHAR U_83A3 +ENCODING 33699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +FFE0 +2000 +3FC0 +0440 +5220 +9080 +0F80 +ENDCHAR +STARTCHAR U_83A4 +ENCODING 33700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0A00 +7FC0 +4A40 +51C0 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_83A5 +ENCODING 33701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +57C0 +2240 +5240 +B7C0 +5240 +9240 +1240 +6FE0 +ENDCHAR +STARTCHAR U_83A6 +ENCODING 33702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +2480 +1500 +3F80 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_83A7 +ENCODING 33703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_83A8 +ENCODING 33704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2080 +3F80 +2080 +3FA0 +2240 +2980 +7060 +ENDCHAR +STARTCHAR U_83A9 +ENCODING 33705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1480 +7F80 +0200 +FFE0 +0400 +0400 +0C00 +ENDCHAR +STARTCHAR U_83AA +ENCODING 33706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A80 +1240 +FFE0 +1240 +1E80 +F120 +12A0 +3460 +ENDCHAR +STARTCHAR U_83AB +ENCODING 33707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_83AC +ENCODING 33708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +3F80 +4200 +FFC0 +4440 +7FC0 +0C00 +3420 +C3E0 +ENDCHAR +STARTCHAR U_83AD +ENCODING 33709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7A40 +4A40 +7A40 +5340 +6A80 +4600 +ENDCHAR +STARTCHAR U_83AE +ENCODING 33710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FC0 +2440 +3FC0 +2440 +7FE0 +0420 +1820 +E1C0 +ENDCHAR +STARTCHAR U_83AF +ENCODING 33711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +2100 +8FE0 +6100 +2380 +C540 +4920 +4100 +ENDCHAR +STARTCHAR U_83B0 +ENCODING 33712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +23E0 +FC20 +2140 +3900 +E280 +4440 +1820 +ENDCHAR +STARTCHAR U_83B1 +ENCODING 33713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +2480 +1500 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_83B2 +ENCODING 33714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +5FC0 +0500 +EFC0 +2100 +3FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_83B3 +ENCODING 33715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F080 +97E0 +9080 +F480 +9280 +9280 +F080 +0180 +ENDCHAR +STARTCHAR U_83B4 +ENCODING 33716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +0400 +7FC0 +4A40 +5140 +4080 +ENDCHAR +STARTCHAR U_83B5 +ENCODING 33717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0800 +3FC0 +2440 +3FC0 +0A80 +0A60 +3220 +C1E0 +ENDCHAR +STARTCHAR U_83B6 +ENCODING 33718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0080 +4900 +2500 +1200 +FFE0 +ENDCHAR +STARTCHAR U_83B7 +ENCODING 33719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5180 +2140 +57E0 +9100 +3100 +5280 +1440 +6820 +ENDCHAR +STARTCHAR U_83B8 +ENCODING 33720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5180 +2940 +57E0 +B100 +5280 +92A0 +14A0 +6860 +ENDCHAR +STARTCHAR U_83B9 +ENCODING 33721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +3FC0 +0400 +3F80 +0500 +0480 +FFE0 +ENDCHAR +STARTCHAR U_83BA +ENCODING 33722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8820 +3F80 +2500 +3FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_83BB +ENCODING 33723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7F80 +09C0 +1040 +21C0 +7A00 +4BC0 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_83BC +ENCODING 33724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +9FE0 +E100 +2540 +57C0 +E100 +3120 +C0E0 +ENDCHAR +STARTCHAR U_83BD +ENCODING 33725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0880 +FFE0 +2080 +C960 +0900 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_83BE +ENCODING 33726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +DF60 +0400 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_83BF +ENCODING 33727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +1140 +7D40 +5540 +5D40 +3140 +5840 +95C0 +ENDCHAR +STARTCHAR U_83C0 +ENCODING 33728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +A020 +3FC0 +4640 +AA40 +12A0 +2220 +C1E0 +ENDCHAR +STARTCHAR U_83C1 +ENCODING 33729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_83C2 +ENCODING 33730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +8C20 +8A20 +F920 +8920 +F820 +88C0 +ENDCHAR +STARTCHAR U_83C3 +ENCODING 33731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +27E0 +8400 +47C0 +1440 +27C0 +C400 +47E0 +ENDCHAR +STARTCHAR U_83C4 +ENCODING 33732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +3F80 +2480 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_83C5 +ENCODING 33733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +FFC0 +2A00 +FFC0 +8040 +3F00 +2100 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_83C6 +ENCODING 33734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FC00 +4BC0 +7940 +4940 +7940 +4880 +FD40 +0A20 +ENDCHAR +STARTCHAR U_83C7 +ENCODING 33735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +2100 +FFC0 +5100 +57C0 +D440 +2440 +57C0 +8440 +ENDCHAR +STARTCHAR U_83C8 +ENCODING 33736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +F7E0 +2000 +3440 +E240 +2280 +2100 +6FE0 +ENDCHAR +STARTCHAR U_83C9 +ENCODING 33737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0080 +FFE0 +4440 +2E80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_83CA +ENCODING 33738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +3FE0 +4420 +94A0 +0D20 +7FA0 +1620 +2520 +C4C0 +ENDCHAR +STARTCHAR U_83CB +ENCODING 33739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0100 +F7C0 +9100 +9FE0 +9100 +F380 +9540 +0920 +ENDCHAR +STARTCHAR U_83CC +ENCODING 33740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4140 +5E40 +4440 +7FC0 +5540 +64C0 +7FC0 +ENDCHAR +STARTCHAR U_83CD +ENCODING 33741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +3180 +C460 +1F00 +0200 +54A0 +90A0 +0F00 +ENDCHAR +STARTCHAR U_83CE +ENCODING 33742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +3F80 +2080 +3F80 +2080 +3FA0 +2140 +3D80 +2120 +3CE0 +ENDCHAR +STARTCHAR U_83CF +ENCODING 33743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +2040 +8740 +6540 +2540 +C740 +4040 +41C0 +ENDCHAR +STARTCHAR U_83D0 +ENCODING 33744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +1100 +7FE0 +0400 +3F80 +0400 +7FE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_83D1 +ENCODING 33745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +4900 +2480 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_83D2 +ENCODING 33746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +2480 +2280 +3F80 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_83D3 +ENCODING 33747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_83D4 +ENCODING 33748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7BC0 +4A40 +7A80 +4BE0 +7B40 +4A80 +4B40 +9A20 +ENDCHAR +STARTCHAR U_83D5 +ENCODING 33749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1B00 +2080 +DF60 +0000 +7FC0 +4A40 +7FC0 +4AC0 +ENDCHAR +STARTCHAR U_83D6 +ENCODING 33750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +2880 +2480 +7FC0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_83D7 +ENCODING 33751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2100 +FFE0 +2520 +3D20 +E7E0 +2520 +27E0 +E420 +ENDCHAR +STARTCHAR U_83D8 +ENCODING 33752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +2100 +FD00 +2500 +3A80 +6A40 +A400 +2880 +2F40 +ENDCHAR +STARTCHAR U_83D9 +ENCODING 33753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +FFE0 +2480 +FFE0 +2480 +FFE0 +0400 +7FC0 +ENDCHAR +STARTCHAR U_83DA +ENCODING 33754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FE0 +0900 +0600 +1940 +7FC0 +0900 +0640 +79C0 +ENDCHAR +STARTCHAR U_83DB +ENCODING 33755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4040 +4140 +4080 +ENDCHAR +STARTCHAR U_83DC +ENCODING 33756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +01C0 +7E80 +2880 +1500 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_83DD +ENCODING 33757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2240 +FFE0 +2200 +3BC0 +E340 +2480 +2940 +D620 +ENDCHAR +STARTCHAR U_83DE +ENCODING 33758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7900 +11E0 +FEA0 +10A0 +3920 +5520 +92A0 +1440 +ENDCHAR +STARTCHAR U_83DF +ENCODING 33759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +2200 +FFC0 +2240 +3FC0 +0A20 +32A0 +C1E0 +ENDCHAR +STARTCHAR U_83E0 +ENCODING 33760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +27E0 +9520 +57C0 +2540 +E480 +2940 +3620 +ENDCHAR +STARTCHAR U_83E1 +ENCODING 33761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +0200 +55A0 +4E20 +5520 +6CE0 +4020 +7FE0 +ENDCHAR +STARTCHAR U_83E2 +ENCODING 33762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2400 +F7C0 +2840 +3740 +E540 +27A0 +2420 +63E0 +ENDCHAR +STARTCHAR U_83E3 +ENCODING 33763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FE0 +5220 +7E20 +4540 +4540 +7C80 +5140 +7E20 +ENDCHAR +STARTCHAR U_83E4 +ENCODING 33764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +FFE0 +2080 +DF60 +1100 +1240 +0FC0 +ENDCHAR +STARTCHAR U_83E5 +ENCODING 33765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +FA00 +23E0 +3240 +6A40 +A240 +2440 +2840 +ENDCHAR +STARTCHAR U_83E6 +ENCODING 33766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +4040 +2780 +6400 +27E0 +2900 +2900 +5100 +8FE0 +ENDCHAR +STARTCHAR U_83E7 +ENCODING 33767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4080 +5F00 +5100 +5FE0 +5100 +54A0 +9A60 +ENDCHAR +STARTCHAR U_83E8 +ENCODING 33768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +7FC0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_83E9 +ENCODING 33769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +0000 +3F80 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_83EA +ENCODING 33770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +FFE0 +0800 +1FC0 +3040 +DFC0 +1040 +ENDCHAR +STARTCHAR U_83EB +ENCODING 33771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2480 +2480 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_83EC +ENCODING 33772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4FE0 +2220 +9540 +5880 +27E0 +C420 +47E0 +4420 +ENDCHAR +STARTCHAR U_83ED +ENCODING 33773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4200 +2440 +8FE0 +6020 +2FC0 +C840 +4FC0 +4840 +ENDCHAR +STARTCHAR U_83EE +ENCODING 33774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4440 +7FC0 +4460 +5FC0 +4600 +4900 +B0E0 +ENDCHAR +STARTCHAR U_83EF +ENCODING 33775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +FFE0 +2480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_83F0 +ENCODING 33776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F860 +17C0 +2540 +3D40 +E540 +2520 +25A0 +E9A0 +ENDCHAR +STARTCHAR U_83F1 +ENCODING 33777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +2880 +DF60 +2900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_83F2 +ENCODING 33778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +7BC0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +0A00 +ENDCHAR +STARTCHAR U_83F3 +ENCODING 33779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0E00 +3180 +DF60 +0400 +7FC0 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_83F4 +ENCODING 33780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1500 +3F80 +E4E0 +3F80 +24A0 +3FA0 +03E0 +ENDCHAR +STARTCHAR U_83F5 +ENCODING 33781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FC0 +4440 +7FC0 +5040 +5F40 +40C0 +ENDCHAR +STARTCHAR U_83F6 +ENCODING 33782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +7FC0 +2480 +DF60 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_83F7 +ENCODING 33783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +3F80 +0080 +FFE0 +8420 +BF80 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_83F8 +ENCODING 33784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +FA80 +2440 +3920 +28C0 +4A00 +4900 +B0C0 +ENDCHAR +STARTCHAR U_83F9 +ENCODING 33785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +9440 +57C0 +2440 +27C0 +C440 +4440 +5FE0 +ENDCHAR +STARTCHAR U_83FA +ENCODING 33786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2040 +3FC0 +2840 +2FC0 +2840 +4FC0 +88C0 +ENDCHAR +STARTCHAR U_83FB +ENCODING 33787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1080 +FFE0 +1080 +3980 +56C0 +94A0 +18A0 +1080 +ENDCHAR +STARTCHAR U_83FC +ENCODING 33788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +2440 +4A80 +1180 +6440 +14A0 +6B00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_83FD +ENCODING 33789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +13E0 +1D40 +1140 +FF40 +5540 +5280 +9140 +3620 +ENDCHAR +STARTCHAR U_83FE +ENCODING 33790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0800 +FFE0 +2440 +C6A0 +1540 +64A0 +0C00 +ENDCHAR +STARTCHAR U_83FF +ENCODING 33791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FE20 +24A0 +7AA0 +10A0 +7CA0 +10A0 +1E20 +F0E0 +ENDCHAR +STARTCHAR U_8400 +ENCODING 33792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4840 +7F00 +4880 +4F80 +4900 +8920 +B0E0 +ENDCHAR +STARTCHAR U_8401 +ENCODING 33793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1100 +1D00 +1700 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8402 +ENCODING 33794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7C00 +13C0 +7E40 +1240 +3A40 +57C0 +9240 +1000 +ENDCHAR +STARTCHAR U_8403 +ENCODING 33795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2100 +5280 +8C40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8404 +ENCODING 33796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FE0 +5020 +BF20 +0820 +FFA0 +4920 +7F20 +00C0 +ENDCHAR +STARTCHAR U_8405 +ENCODING 33797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFC0 +4480 +7F80 +0420 +03E0 +3FC0 +2440 +3FC0 +ENDCHAR +STARTCHAR U_8406 +ENCODING 33798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +FFC0 +2A00 +7F80 +4880 +7F80 +4880 +7F80 +2400 +FFC0 +0400 +ENDCHAR +STARTCHAR U_8407 +ENCODING 33799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1FC0 +1000 +1F80 +1000 +FFE0 +1280 +1500 +18E0 +ENDCHAR +STARTCHAR U_8408 +ENCODING 33800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +3F80 +2080 +3F80 +2080 +3F80 +0A80 +1220 +61E0 +ENDCHAR +STARTCHAR U_8409 +ENCODING 33801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +77C0 +5540 +7540 +5540 +77C0 +5420 +5420 +B3E0 +ENDCHAR +STARTCHAR U_840A +ENCODING 33802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +5540 +8E20 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_840B +ENCODING 33803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0480 +FFE0 +0480 +7FE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_840C +ENCODING 33804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +0440 +08C0 +ENDCHAR +STARTCHAR U_840D +ENCODING 33805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2FE0 +9920 +5540 +2540 +2FE0 +C100 +4100 +4100 +ENDCHAR +STARTCHAR U_840E +ENCODING 33806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3F80 +0400 +FFE0 +2480 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_840F +ENCODING 33807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +1E00 +2400 +5780 +C080 +7780 +4080 +7F80 +4080 +ENDCHAR +STARTCHAR U_8410 +ENCODING 33808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0480 +7FE0 +0480 +3F80 +27E0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8411 +ENCODING 33809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_8412 +ENCODING 33810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2100 +4880 +9240 +3F00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_8413 +ENCODING 33811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2200 +FFC0 +2A00 +FFC0 +8040 +BF40 +2100 +3D00 +2F00 +2100 +FFC0 +ENDCHAR +STARTCHAR U_8414 +ENCODING 33812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +2000 +F7C0 +2240 +3240 +E480 +27C0 +2440 +67C0 +ENDCHAR +STARTCHAR U_8415 +ENCODING 33813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +1100 +0E00 +3180 +DFE0 +1080 +1F80 +2080 +ENDCHAR +STARTCHAR U_8416 +ENCODING 33814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3780 +2080 +3B80 +2080 +3F80 +1200 +2220 +C1E0 +ENDCHAR +STARTCHAR U_8417 +ENCODING 33815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +3F80 +0000 +FFE0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_8418 +ENCODING 33816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +2E80 +C060 +7FC0 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_8419 +ENCODING 33817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +27E0 +FD20 +2100 +7180 +AAA0 +22A0 +24E0 +ENDCHAR +STARTCHAR U_841A +ENCODING 33818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +F440 +2380 +3D60 +E7C0 +2100 +2FE0 +6100 +ENDCHAR +STARTCHAR U_841B +ENCODING 33819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +3280 +2980 +3F80 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_841C +ENCODING 33820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +F8E0 +A880 +ABE0 +AA20 +B220 +23E0 +2220 +ENDCHAR +STARTCHAR U_841D +ENCODING 33821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FC0 +1000 +3F80 +5100 +0E00 +F800 +ENDCHAR +STARTCHAR U_841E +ENCODING 33822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7FC0 +4440 +4A40 +0000 +4AC0 +7320 +4220 +71E0 +ENDCHAR +STARTCHAR U_841F +ENCODING 33823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +2780 +FA80 +2680 +73A0 +A2A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8420 +ENCODING 33824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +4A40 +9480 +ENDCHAR +STARTCHAR U_8421 +ENCODING 33825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +4200 +27C0 +8440 +57C0 +2440 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_8422 +ENCODING 33826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4400 +27C0 +0840 +6740 +1540 +6740 +24A0 +23E0 +ENDCHAR +STARTCHAR U_8423 +ENCODING 33827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0200 +FFE0 +8020 +3F80 +1200 +13C0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_8424 +ENCODING 33828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +7FC0 +4440 +7FC0 +0480 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8425 +ENCODING 33829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +FFC0 +8040 +BF00 +2100 +7F80 +4080 +4080 +7F80 +ENDCHAR +STARTCHAR U_8426 +ENCODING 33830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9120 +3E00 +0880 +7FC0 +2480 +4440 +8C20 +ENDCHAR +STARTCHAR U_8427 +ENCODING 33831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0480 +FFE0 +0480 +3F80 +5540 +64C0 +8440 +ENDCHAR +STARTCHAR U_8428 +ENCODING 33832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +A440 +C280 +A7E0 +9400 +E400 +8800 +9000 +ENDCHAR +STARTCHAR U_8429 +ENCODING 33833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F100 +2540 +F540 +2580 +7100 +AA80 +2440 +2820 +ENDCHAR +STARTCHAR U_842A +ENCODING 33834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7A40 +1140 +7A40 +1160 +39C0 +5640 +9040 +1040 +ENDCHAR +STARTCHAR U_842B +ENCODING 33835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7F80 +0400 +FFE0 +1480 +3FC0 +D0A0 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_842C +ENCODING 33836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +FFC0 +8540 +9F40 +80C0 +ENDCHAR +STARTCHAR U_842D +ENCODING 33837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7F80 +0400 +3F80 +2480 +7FC0 +4540 +5F40 +40C0 +ENDCHAR +STARTCHAR U_842E +ENCODING 33838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1A00 +2D80 +C060 +7D40 +4540 +7D40 +4440 +4C80 +ENDCHAR +STARTCHAR U_842F +ENCODING 33839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +2200 +7F80 +A080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8430 +ENCODING 33840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0400 +7FC0 +5540 +7FC0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_8431 +ENCODING 33841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8020 +7FC0 +2080 +3F80 +2080 +3F80 +FFE0 +ENDCHAR +STARTCHAR U_8432 +ENCODING 33842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FC0 +2480 +7FE0 +0800 +FFE0 +2900 +4600 +B9E0 +ENDCHAR +STARTCHAR U_8433 +ENCODING 33843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0400 +7FC0 +4A40 +5F40 +4440 +7FC0 +4440 +ENDCHAR +STARTCHAR U_8434 +ENCODING 33844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +4540 +7D40 +4540 +7D40 +4540 +7C40 +C6C0 +ENDCHAR +STARTCHAR U_8435 +ENCODING 33845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3C80 +2480 +FFE0 +9120 +9120 +9F60 +ENDCHAR +STARTCHAR U_8436 +ENCODING 33846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0800 +FFE0 +1F80 +30C0 +DFA0 +1080 +1F80 +ENDCHAR +STARTCHAR U_8437 +ENCODING 33847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9220 +54A0 +7EA0 +42A0 +7EA0 +42A0 +7E20 +46E0 +ENDCHAR +STARTCHAR U_8438 +ENCODING 33848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +65C0 +4440 +75C0 +4440 +7FC0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_8439 +ENCODING 33849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4040 +7FC0 +4000 +5FC0 +5540 +5FC0 +9540 +ENDCHAR +STARTCHAR U_843A +ENCODING 33850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +5F40 +4040 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_843B +ENCODING 33851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_843C +ENCODING 33852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +4A40 +FFE0 +1000 +3F80 +0080 +0700 +ENDCHAR +STARTCHAR U_843D +ENCODING 33853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4780 +2C80 +8300 +5480 +2860 +C780 +4480 +4780 +ENDCHAR +STARTCHAR U_843E +ENCODING 33854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7F80 +1AC0 +2440 +CAC0 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_843F +ENCODING 33855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +27C0 +9100 +5FE0 +2100 +E7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_8440 +ENCODING 33856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +20C0 +FF00 +2100 +37E0 +E100 +27C0 +2440 +67C0 +ENDCHAR +STARTCHAR U_8441 +ENCODING 33857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +FFE0 +0400 +7FC0 +0400 +FFE0 +1100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_8442 +ENCODING 33858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7880 +53E0 +FCA0 +54A0 +7D20 +2AC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_8443 +ENCODING 33859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4BE0 +4D00 +79E0 +4900 +49E0 +7900 +0100 +ENDCHAR +STARTCHAR U_8444 +ENCODING 33860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4BE0 +7D00 +49C0 +7900 +49E0 +4900 +9900 +ENDCHAR +STARTCHAR U_8445 +ENCODING 33861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +2440 +57C0 +A440 +27C0 +5440 +8440 +0FE0 +ENDCHAR +STARTCHAR U_8446 +ENCODING 33862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +17C0 +2440 +27C0 +6100 +BFE0 +2540 +2940 +3120 +ENDCHAR +STARTCHAR U_8447 +ENCODING 33863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0A00 +FFE0 +1440 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8448 +ENCODING 33864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +7FC0 +2080 +3F80 +0400 +FFE0 +2480 +C460 +ENDCHAR +STARTCHAR U_8449 +ENCODING 33865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +FFE0 +2900 +2F00 +3FC0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_844A +ENCODING 33866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +3F80 +D160 +1F00 +1100 +FFE0 +1100 +2100 +ENDCHAR +STARTCHAR U_844B +ENCODING 33867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7A00 +4BE0 +7C20 +4BA0 +7AA0 +4BA0 +4820 +98C0 +ENDCHAR +STARTCHAR U_844C +ENCODING 33868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +1080 +0F00 +78C0 +2100 +FFE0 +4A40 +3180 +CE60 +ENDCHAR +STARTCHAR U_844D +ENCODING 33869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +3F80 +2080 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_844E +ENCODING 33870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FC0 +4140 +8FE0 +2140 +6FE0 +A100 +3FE0 +2100 +ENDCHAR +STARTCHAR U_844F +ENCODING 33871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +4FC0 +A240 +5FE0 +2240 +2FC0 +C200 +5FE0 +4200 +ENDCHAR +STARTCHAR U_8450 +ENCODING 33872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +DF60 +0900 +1200 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_8451 +ENCODING 33873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2040 +F840 +23E0 +FC40 +2240 +F940 +2040 +FDC0 +ENDCHAR +STARTCHAR U_8452 +ENCODING 33874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2000 +57C0 +E100 +4900 +F500 +5100 +A900 +AFE0 +ENDCHAR +STARTCHAR U_8453 +ENCODING 33875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2480 +8FE0 +2480 +2480 +DFE0 +4480 +4840 +5020 +ENDCHAR +STARTCHAR U_8454 +ENCODING 33876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +2F80 +2080 +5FE0 +C800 +4FC0 +5200 +5FE0 +4500 +58C0 +ENDCHAR +STARTCHAR U_8455 +ENCODING 33877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +24E0 +5200 +A9E0 +6240 +A440 +2C40 +2440 +20C0 +ENDCHAR +STARTCHAR U_8456 +ENCODING 33878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9120 +64C0 +0500 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_8457 +ENCODING 33879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +7F80 +0500 +FFE0 +1F80 +3080 +DF80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8458 +ENCODING 33880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1240 +2480 +FFE0 +1240 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_8459 +ENCODING 33881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +13E0 +FE20 +13E0 +3220 +5BE0 +9620 +13E0 +1220 +ENDCHAR +STARTCHAR U_845A +ENCODING 33882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +1100 +1F00 +1100 +FFE0 +2900 +3080 +3FC0 +ENDCHAR +STARTCHAR U_845B +ENCODING 33883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3FE0 +6420 +AA20 +3F60 +ENDCHAR +STARTCHAR U_845C +ENCODING 33884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +F940 +2140 +FA40 +2480 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_845D +ENCODING 33885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FD00 +57E0 +A920 +5520 +FD20 +2120 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_845E +ENCODING 33886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +1240 +73C0 +8240 +F3C0 +1240 +17E0 +6040 +ENDCHAR +STARTCHAR U_845F +ENCODING 33887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +3F80 +2080 +3F80 +2080 +7FC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8460 +ENCODING 33888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FC0 +4040 +4FC0 +C040 +5FE0 +54A0 +4300 +5CE0 +ENDCHAR +STARTCHAR U_8461 +ENCODING 33889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FE0 +4A20 +BFA0 +2920 +3F20 +2920 +3F20 +2940 +ENDCHAR +STARTCHAR U_8462 +ENCODING 33890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0A00 +3580 +C260 +3F80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_8463 +ENCODING 33891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +3F80 +0400 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8464 +ENCODING 33892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2940 +4040 +F7E0 +2840 +FA40 +0140 +A840 +A940 +8080 +ENDCHAR +STARTCHAR U_8465 +ENCODING 33893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +4440 +7D40 +4540 +7D40 +4540 +5440 +49C0 +ENDCHAR +STARTCHAR U_8466 +ENCODING 33894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0880 +FFE0 +1080 +3FC0 +2200 +7FE0 +0200 +ENDCHAR +STARTCHAR U_8467 +ENCODING 33895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7D00 +13E0 +FD20 +8D20 +1120 +FD20 +12A0 +7440 +ENDCHAR +STARTCHAR U_8468 +ENCODING 33896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +2480 +FFE0 +2280 +2900 +70E0 +ENDCHAR +STARTCHAR U_8469 +ENCODING 33897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4000 +F7C0 +9540 +9540 +F7C0 +9420 +F420 +03E0 +ENDCHAR +STARTCHAR U_846A +ENCODING 33898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A00 +3C40 +4940 +FD40 +5540 +7D40 +5540 +7C40 +94C0 +ENDCHAR +STARTCHAR U_846B +ENCODING 33899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +FA40 +23C0 +7A40 +4BC0 +7A40 +0440 +08C0 +ENDCHAR +STARTCHAR U_846C +ENCODING 33900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2A80 +D320 +21E0 +5100 +FFE0 +1100 +E100 +ENDCHAR +STARTCHAR U_846D +ENCODING 33901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4840 +7BC0 +4000 +7BC0 +4240 +7980 +4660 +ENDCHAR +STARTCHAR U_846E +ENCODING 33902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7B80 +4280 +74E0 +4000 +7FC0 +4280 +F900 +4EE0 +ENDCHAR +STARTCHAR U_846F +ENCODING 33903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +93E0 +E420 +4920 +F4A0 +5020 +A920 +A8C0 +ENDCHAR +STARTCHAR U_8470 +ENCODING 33904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +2840 +3FA0 +6480 +AA40 +37A0 +2C80 +2300 +3CE0 +ENDCHAR +STARTCHAR U_8471 +ENCODING 33905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +7FC0 +9240 +1C40 +6640 +1B80 +4A40 +48A0 +87A0 +ENDCHAR +STARTCHAR U_8472 +ENCODING 33906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0800 +3F80 +2480 +3F80 +0440 +7580 +2480 +CC60 +ENDCHAR +STARTCHAR U_8473 +ENCODING 33907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +4100 +7F20 +4940 +7F40 +5580 +4CA0 +B360 +ENDCHAR +STARTCHAR U_8474 +ENCODING 33908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +4100 +5D20 +4140 +5D80 +5520 +5EA0 +8460 +ENDCHAR +STARTCHAR U_8475 +ENCODING 33909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FE80 +5340 +2180 +5E80 +8460 +7F80 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_8476 +ENCODING 33910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +FFE0 +8020 +3F80 +0400 +1400 +0800 +ENDCHAR +STARTCHAR U_8477 +ENCODING 33911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8420 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8478 +ENCODING 33912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +7FC0 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_8479 +ENCODING 33913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +7BE0 +2480 +3AE0 +2BA0 +2EE0 +2A80 +4A20 +B1E0 +ENDCHAR +STARTCHAR U_847A +ENCODING 33914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FFC0 +1200 +3F00 +2100 +FFC0 +2100 +3F00 +2100 +FF80 +0100 +ENDCHAR +STARTCHAR U_847B +ENCODING 33915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +5F40 +5540 +5F40 +4540 +5FA0 +80A0 +ENDCHAR +STARTCHAR U_847C +ENCODING 33916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4E40 +5140 +7FC0 +2880 +DF60 +2900 +4600 +39C0 +ENDCHAR +STARTCHAR U_847D +ENCODING 33917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +4A40 +7FC0 +0800 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_847E +ENCODING 33918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3BC0 +4A40 +AAC0 +1220 +E1E0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_847F +ENCODING 33919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +3FC0 +2240 +3FC0 +2940 +2A40 +2CC0 +4940 +8FC0 +ENDCHAR +STARTCHAR U_8480 +ENCODING 33920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +1F80 +1080 +1F80 +1080 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_8481 +ENCODING 33921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4240 +3FE0 +E700 +2A80 +3240 +2220 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8482 +ENCODING 33922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +8420 +3F80 +2480 +2580 +0400 +ENDCHAR +STARTCHAR U_8483 +ENCODING 33923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +0F80 +1100 +FFE0 +1480 +6B00 +1680 +0A60 +3600 +ENDCHAR +STARTCHAR U_8484 +ENCODING 33924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +80A0 +7BC0 +0480 +FA80 +2A80 +4920 +87E0 +ENDCHAR +STARTCHAR U_8485 +ENCODING 33925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +4200 +1780 +62A0 +2460 +7FC0 +0E00 +3580 +C460 +ENDCHAR +STARTCHAR U_8486 +ENCODING 33926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +77C0 +2540 +F860 +0400 +FFE0 +0900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_8487 +ENCODING 33927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +7FE0 +4100 +5F20 +5120 +5540 +54A0 +4B60 +B220 +ENDCHAR +STARTCHAR U_8488 +ENCODING 33928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5240 +7B80 +4220 +71E0 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8489 +ENCODING 33929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2480 +FFE0 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_848A +ENCODING 33930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFC0 +1200 +32C0 +6700 +BA20 +21E0 +0200 +7B80 +4A20 +79E0 +ENDCHAR +STARTCHAR U_848B +ENCODING 33931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27C0 +AC80 +6300 +2480 +7FE0 +A480 +2280 +2180 +ENDCHAR +STARTCHAR U_848C +ENCODING 33932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5140 +2480 +FFE0 +2480 +4C40 +FFE0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_848D +ENCODING 33933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5500 +2800 +FF80 +0900 +0FC0 +1080 +7FE0 +9520 +2AE0 +ENDCHAR +STARTCHAR U_848E +ENCODING 33934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +2FC0 +8840 +4B80 +2AA0 +2AC0 +CA80 +4B40 +5620 +ENDCHAR +STARTCHAR U_848F +ENCODING 33935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8A20 +7FC0 +4A40 +5340 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8490 +ENCODING 33936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2440 +3FC0 +2440 +3FC0 +0B60 +12A0 +E1E0 +ENDCHAR +STARTCHAR U_8491 +ENCODING 33937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7C20 +4BC0 +7D40 +4540 +4480 +9B60 +ENDCHAR +STARTCHAR U_8492 +ENCODING 33938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +77E0 +5100 +77C0 +4540 +7540 +5540 +7540 +0100 +ENDCHAR +STARTCHAR U_8493 +ENCODING 33939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +2100 +57C0 +7100 +2D40 +7FC0 +0100 +A920 +A8E0 +ENDCHAR +STARTCHAR U_8494 +ENCODING 33940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7C0 +9100 +9FE0 +F080 +9FE0 +9480 +F280 +0100 +ENDCHAR +STARTCHAR U_8495 +ENCODING 33941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +2A80 +3180 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8496 +ENCODING 33942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +3F80 +2A80 +3580 +2A80 +FFE0 +2080 +ENDCHAR +STARTCHAR U_8497 +ENCODING 33943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +2F80 +8880 +5F80 +2880 +CFA0 +4940 +4EE0 +ENDCHAR +STARTCHAR U_8498 +ENCODING 33944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +FBC0 +5240 +33C0 +C800 +3F80 +0400 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_8499 +ENCODING 33945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8020 +7FC0 +D440 +2680 +CB00 +1280 +EC60 +ENDCHAR +STARTCHAR U_849A +ENCODING 33946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +1100 +1F00 +0000 +7FC0 +4A40 +7FC0 +4440 +ENDCHAR +STARTCHAR U_849B +ENCODING 33947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +FBC0 +2140 +F940 +AFE0 +A980 +FA40 +0420 +ENDCHAR +STARTCHAR U_849C +ENCODING 33948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +0000 +FBE0 +2080 +72C0 +AAA0 +24A0 +6180 +ENDCHAR +STARTCHAR U_849D +ENCODING 33949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +5040 +5FC0 +5040 +5FC0 +4A80 +9240 +A620 +ENDCHAR +STARTCHAR U_849E +ENCODING 33950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4480 +2FE0 +A800 +7A40 +2940 +C940 +4880 +4FE0 +ENDCHAR +STARTCHAR U_849F +ENCODING 33951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +0420 +53A0 +52A0 +2BA0 +F020 +00C0 +ENDCHAR +STARTCHAR U_84A0 +ENCODING 33952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2080 +3F80 +2080 +3F80 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_84A1 +ENCODING 33953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FE0 +0900 +FFE0 +8420 +FFE0 +0800 +1FC0 +2040 +C380 +ENDCHAR +STARTCHAR U_84A2 +ENCODING 33954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F100 +9280 +AFE0 +9100 +DFE0 +A540 +8920 +9320 +ENDCHAR +STARTCHAR U_84A3 +ENCODING 33955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1080 +2300 +54C0 +ABA0 +6100 +AFE0 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_84A4 +ENCODING 33956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4300 +2480 +9FC0 +7120 +2FC0 +C580 +4940 +5720 +ENDCHAR +STARTCHAR U_84A5 +ENCODING 33957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +1900 +63C0 +5140 +6AC0 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_84A6 +ENCODING 33958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2200 +7FC0 +A200 +3F80 +2200 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_84A7 +ENCODING 33959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +4900 +4D40 +4940 +5CC0 +54A0 +9D60 +8220 +ENDCHAR +STARTCHAR U_84A8 +ENCODING 33960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +2100 +7FE0 +A440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_84A9 +ENCODING 33961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +1240 +FBC0 +3240 +5BC0 +9640 +1240 +1FE0 +ENDCHAR +STARTCHAR U_84AA +ENCODING 33962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +3F80 +2480 +0100 +FFE0 +2100 +1300 +ENDCHAR +STARTCHAR U_84AB +ENCODING 33963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +0400 +3F80 +0400 +FFE0 +2200 +4200 +BFE0 +ENDCHAR +STARTCHAR U_84AC +ENCODING 33964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A220 +7FC0 +A440 +3FC0 +0A00 +12A0 +E1E0 +ENDCHAR +STARTCHAR U_84AD +ENCODING 33965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +3FC0 +5540 +9F40 +2840 +3FC0 +D540 +1F40 +08C0 +ENDCHAR +STARTCHAR U_84AE +ENCODING 33966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8A20 +1200 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_84AF +ENCODING 33967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2420 +FF20 +24A0 +EEA0 +AAA0 +EEA0 +AAA0 +EEA0 +AA20 +AA20 +B6E0 +ENDCHAR +STARTCHAR U_84B0 +ENCODING 33968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7DC0 +5540 +5660 +FC00 +57E0 +5540 +4480 +9F60 +ENDCHAR +STARTCHAR U_84B1 +ENCODING 33969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +2140 +FFE0 +2540 +37C0 +E540 +27C0 +2540 +65C0 +ENDCHAR +STARTCHAR U_84B2 +ENCODING 33970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +5FE0 +2920 +8FE0 +6920 +2FE0 +C920 +4920 +4960 +ENDCHAR +STARTCHAR U_84B3 +ENCODING 33971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +2100 +57C0 +7540 +2D40 +FEC0 +0440 +AC40 +ACC0 +ENDCHAR +STARTCHAR U_84B4 +ENCODING 33972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +29E0 +FF20 +55E0 +5520 +7DE0 +1120 +2220 +C460 +ENDCHAR +STARTCHAR U_84B5 +ENCODING 33973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +1480 +0900 +7FC0 +0400 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_84B6 +ENCODING 33974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +2240 +5420 +FBE0 +2140 +5140 +F940 +5240 +ACC0 +ENDCHAR +STARTCHAR U_84B7 +ENCODING 33975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +1100 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_84B8 +ENCODING 33976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +0240 +F580 +2480 +4460 +BF80 +5240 +8920 +ENDCHAR +STARTCHAR U_84B9 +ENCODING 33977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +7FE0 +0A40 +7FE0 +0A40 +3FC0 +1A80 +2A40 +CA20 +ENDCHAR +STARTCHAR U_84BA +ENCODING 33978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +BFE0 +6800 +2FC0 +6200 +BFE0 +2500 +4880 +B060 +ENDCHAR +STARTCHAR U_84BB +ENCODING 33979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +0820 +79E0 +8200 +FBE0 +4920 +28A0 +D340 +ENDCHAR +STARTCHAR U_84BC +ENCODING 33980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1480 +3FC0 +D0A0 +1F80 +1080 +1FC0 +2840 +CFC0 +ENDCHAR +STARTCHAR U_84BD +ENCODING 33981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3FC0 +2240 +2FC0 +2540 +3FC0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_84BE +ENCODING 33982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4200 +0A40 +E680 +3FE0 +2680 +2A40 +5200 +8FE0 +ENDCHAR +STARTCHAR U_84BF +ENCODING 33983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +1F00 +0000 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_84C0 +ENCODING 33984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1240 +2780 +3940 +E7E0 +2080 +24C0 +69A0 +ENDCHAR +STARTCHAR U_84C1 +ENCODING 33985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0800 +FFE0 +2E80 +C460 +3F80 +1500 +E4E0 +ENDCHAR +STARTCHAR U_84C2 +ENCODING 33986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +A0A0 +3F80 +2080 +FFE0 +0000 +2080 +4040 +ENDCHAR +STARTCHAR U_84C3 +ENCODING 33987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +75C0 +4440 +75C0 +4440 +7FC0 +1100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_84C4 +ENCODING 33988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1200 +2480 +7FC0 +2480 +3F80 +2480 +3F80 +ENDCHAR +STARTCHAR U_84C5 +ENCODING 33989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +A440 +5FA0 +2000 +2A80 +CA80 +52A0 +6260 +ENDCHAR +STARTCHAR U_84C6 +ENCODING 33990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4880 +7FE0 +4880 +5FC0 +5240 +52C0 +8200 +ENDCHAR +STARTCHAR U_84C7 +ENCODING 33991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +FFE0 +A0A0 +BF80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_84C8 +ENCODING 33992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2100 +7BC0 +4A40 +7A80 +4A40 +7A40 +5340 +6A80 +4A00 +ENDCHAR +STARTCHAR U_84C9 +ENCODING 33993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9120 +6AC0 +1100 +3F80 +D160 +1100 +1F00 +ENDCHAR +STARTCHAR U_84CA +ENCODING 33994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1480 +2940 +DFA0 +0000 +FBE0 +4920 +28A0 +DB60 +ENDCHAR +STARTCHAR U_84CB +ENCODING 33995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7F80 +0400 +FFE0 +1080 +3FC0 +2940 +2940 +FFE0 +ENDCHAR +STARTCHAR U_84CC +ENCODING 33996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2480 +5540 +BFA0 +0400 +FFE0 +5100 +8E00 +F1E0 +ENDCHAR +STARTCHAR U_84CD +ENCODING 33997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1540 +7F80 +0500 +FFE0 +3040 +DFC0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_84CE +ENCODING 33998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FE0 +4240 +7FE0 +4240 +5FC0 +4200 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_84CF +ENCODING 33999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0880 +0CE0 +7740 +5540 +5540 +5540 +5540 +5DA0 +9520 +ENDCHAR +STARTCHAR U_84D0 +ENCODING 34000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4000 +7FE0 +5540 +5880 +7FE0 +5080 +8B80 +ENDCHAR +STARTCHAR U_84D1 +ENCODING 34001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +FFE0 +2080 +3FA0 +1140 +3480 +D860 +ENDCHAR +STARTCHAR U_84D2 +ENCODING 34002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5480 +7C80 +57E0 +7C80 +1080 +FE80 +1080 +ENDCHAR +STARTCHAR U_84D3 +ENCODING 34003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2480 +3FE0 +6000 +A7C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_84D4 +ENCODING 34004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +FFC0 +0400 +7F80 +0400 +FFE0 +4A40 +8920 +ENDCHAR +STARTCHAR U_84D5 +ENCODING 34005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +2100 +F7C0 +2100 +77E0 +6900 +A7C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_84D6 +ENCODING 34006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +5540 +4A40 +7FC0 +4200 +7BC0 +4220 +79E0 +ENDCHAR +STARTCHAR U_84D7 +ENCODING 34007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +47C0 +9100 +2FE0 +6500 +A5C0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_84D8 +ENCODING 34008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1500 +2A80 +7F40 +0A00 +3140 +D080 +1860 +ENDCHAR +STARTCHAR U_84D9 +ENCODING 34009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +5480 +5480 +6D40 +4400 +5F80 +8400 +BFC0 +ENDCHAR +STARTCHAR U_84DA +ENCODING 34010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +25C0 +6A40 +A9A0 +2E40 +2980 +2A40 +2180 +2600 +ENDCHAR +STARTCHAR U_84DB +ENCODING 34011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +FFE0 +2340 +F940 +A940 +3080 +6940 +A620 +ENDCHAR +STARTCHAR U_84DC +ENCODING 34012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +FBC0 +5040 +F840 +ABC0 +AA00 +DA20 +8A20 +F9E0 +ENDCHAR +STARTCHAR U_84DD +ENCODING 34013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5200 +53C0 +5500 +1080 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_84DE +ENCODING 34014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +7FC0 +2880 +1500 +73C0 +4040 +7BC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_84DF +ENCODING 34015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +30A0 +7CA0 +D4A0 +7CA0 +54A0 +7CA0 +0020 +7CE0 +ENDCHAR +STARTCHAR U_84E0 +ENCODING 34016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2A80 +2480 +2A80 +7FC0 +4A40 +5F40 +41C0 +ENDCHAR +STARTCHAR U_84E1 +ENCODING 34017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2040 +9FE0 +5020 +2F80 +C480 +4300 +5CE0 +ENDCHAR +STARTCHAR U_84E2 +ENCODING 34018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +5240 +5A40 +6CC0 +ENDCHAR +STARTCHAR U_84E3 +ENCODING 34019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +5100 +23E0 +FA20 +2AA0 +22A0 +2140 +E620 +ENDCHAR +STARTCHAR U_84E4 +ENCODING 34020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1280 +4FC0 +2200 +1FE0 +2A40 +D7A0 +4C80 +4300 +5CE0 +ENDCHAR +STARTCHAR U_84E5 +ENCODING 34021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8A20 +1100 +3F80 +C460 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_84E6 +ENCODING 34022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +FFE0 +3140 +DFE0 +0040 +7E40 +0180 +ENDCHAR +STARTCHAR U_84E7 +ENCODING 34023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27C0 +4A80 +D180 +5660 +5100 +5FE0 +4940 +5720 +ENDCHAR +STARTCHAR U_84E8 +ENCODING 34024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23E0 +5640 +5980 +D660 +57C0 +5440 +57C0 +44C0 +ENDCHAR +STARTCHAR U_84E9 +ENCODING 34025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +5640 +F980 +2E60 +6100 +A7E0 +2220 +6CC0 +ENDCHAR +STARTCHAR U_84EA +ENCODING 34026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9100 +4FC0 +0280 +EFC0 +2940 +2FC0 +2940 +58C0 +8FE0 +ENDCHAR +STARTCHAR U_84EB +ENCODING 34027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5FE0 +2520 +FAC0 +2580 +3AC0 +24A0 +5900 +8FE0 +ENDCHAR +STARTCHAR U_84EC +ENCODING 34028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1380 +4480 +2380 +0D60 +E380 +2100 +27C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_84ED +ENCODING 34029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1280 +7FE0 +4200 +7FC0 +4A80 +5FE0 +6A80 +8FA0 +81E0 +ENDCHAR +STARTCHAR U_84EE +ENCODING 34030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9FE0 +4940 +EFC0 +2940 +3FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_84EF +ENCODING 34031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2440 +4440 +9BA0 +2100 +65E0 +A500 +2B00 +31E0 +ENDCHAR +STARTCHAR U_84F0 +ENCODING 34032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2100 +45C0 +A500 +7FE0 +A500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_84F1 +ENCODING 34033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4440 +2280 +9FE0 +6480 +2FE0 +C480 +4880 +5080 +ENDCHAR +STARTCHAR U_84F2 +ENCODING 34034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4900 +4900 +5FC0 +5540 +5DC0 +4000 +7FE0 +ENDCHAR +STARTCHAR U_84F3 +ENCODING 34035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +0A00 +0A00 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_84F4 +ENCODING 34036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFC0 +2440 +3FC0 +2440 +7FC0 +0120 +FFE0 +1300 +ENDCHAR +STARTCHAR U_84F5 +ENCODING 34037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +F140 +27E0 +3140 +67C0 +A580 +2700 +69E0 +ENDCHAR +STARTCHAR U_84F6 +ENCODING 34038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7280 +57E0 +5C80 +57E0 +5480 +77E0 +5480 +07E0 +ENDCHAR +STARTCHAR U_84F7 +ENCODING 34039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2280 +FFE0 +2480 +3FE0 +E480 +27E0 +2480 +67E0 +ENDCHAR +STARTCHAR U_84F8 +ENCODING 34040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2A80 +FFE0 +4A40 +7FC0 +4A40 +7FC0 +2480 +2280 +3F80 +ENDCHAR +STARTCHAR U_84F9 +ENCODING 34041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +48E0 +AFA0 +44A0 +DFA0 +44A0 +57E0 +5480 +5F80 +ENDCHAR +STARTCHAR U_84FA +ENCODING 34042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F900 +23C0 +FD40 +4B40 +A5C0 +F940 +2220 +FC20 +ENDCHAR +STARTCHAR U_84FB +ENCODING 34043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFC0 +2140 +FF40 +5140 +FDC0 +2140 +FE20 +2420 +ENDCHAR +STARTCHAR U_84FC +ENCODING 34044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +2940 +18C0 +2E40 +F1E0 +1E00 +00C0 +1F00 +ENDCHAR +STARTCHAR U_84FD +ENCODING 34045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4440 +7FC0 +2480 +FFE0 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_84FE +ENCODING 34046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +07C0 +0400 +7FC0 +4A40 +5540 +4A40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_84FF +ENCODING 34047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +87E0 +2100 +67C0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8500 +ENCODING 34048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +4520 +2940 +FF40 +0120 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_8501 +ENCODING 34049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +2080 +3F80 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8502 +ENCODING 34050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4440 +7FC0 +4440 +7FC0 +0A00 +1480 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8503 +ENCODING 34051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +E780 +2480 +E780 +8FC0 +E940 +2FC0 +2140 +CFE0 +ENDCHAR +STARTCHAR U_8504 +ENCODING 34052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8505 +ENCODING 34053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4440 +5F40 +4A40 +4440 +5AC0 +ENDCHAR +STARTCHAR U_8506 +ENCODING 34054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +A100 +5FE0 +2A40 +D3A0 +4C80 +4300 +4CE0 +ENDCHAR +STARTCHAR U_8507 +ENCODING 34055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7E0 +9280 +F480 +97E0 +F080 +91A0 +9AA0 +EC60 +ENDCHAR +STARTCHAR U_8508 +ENCODING 34056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +4A40 +4A40 +7FC0 +0000 +7FE0 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8509 +ENCODING 34057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +DF60 +1100 +1F40 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_850A +ENCODING 34058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +2C40 +B7C0 +A440 +AFE0 +2100 +5FE0 +8900 +ENDCHAR +STARTCHAR U_850B +ENCODING 34059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +44E0 +A6A0 +44A0 +3EA0 +C4A0 +4E40 +55A0 +4D20 +ENDCHAR +STARTCHAR U_850C +ENCODING 34060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FD00 +11E0 +7E20 +5480 +7C80 +3880 +5540 +9220 +ENDCHAR +STARTCHAR U_850D +ENCODING 34061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4940 +7FC0 +5100 +5D40 +5180 +5520 +98E0 +ENDCHAR +STARTCHAR U_850E +ENCODING 34062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2380 +FA80 +02E0 +F400 +07C0 +F280 +9100 +FEE0 +ENDCHAR +STARTCHAR U_850F +ENCODING 34063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +1100 +7FC0 +4940 +5FC0 +4940 +4F40 +40C0 +ENDCHAR +STARTCHAR U_8510 +ENCODING 34064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +7FC0 +4440 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8511 +ENCODING 34065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FE0 +4200 +7240 +4A80 +8320 +9CE0 +ENDCHAR +STARTCHAR U_8512 +ENCODING 34066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +0880 +7FE0 +1080 +3FC0 +D040 +5FC0 +8920 +ENDCHAR +STARTCHAR U_8513 +ENCODING 34067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +7FC0 +4A40 +7FC0 +0900 +0600 +79E0 +ENDCHAR +STARTCHAR U_8514 +ENCODING 34068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +3FE0 +5220 +BF20 +2920 +3F20 +2920 +3F20 +00C0 +ENDCHAR +STARTCHAR U_8515 +ENCODING 34069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A80 +FFE0 +2A80 +44E0 +FFE0 +8420 +3F80 +2480 +2580 +ENDCHAR +STARTCHAR U_8516 +ENCODING 34070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1780 +0400 +7FE0 +4420 +5FE0 +5040 +5FC0 +9040 +BFE0 +ENDCHAR +STARTCHAR U_8517 +ENCODING 34071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4900 +7FE0 +4900 +4F00 +5540 +94A0 +A4A0 +ENDCHAR +STARTCHAR U_8518 +ENCODING 34072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2940 +FBC0 +2C80 +D260 +0C80 +3300 +0C00 +ENDCHAR +STARTCHAR U_8519 +ENCODING 34073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +4400 +77E0 +52A0 +52E0 +9580 +A8E0 +ENDCHAR +STARTCHAR U_851A +ENCODING 34074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C40 +45E0 +7C40 +4140 +7EC0 +4840 +AC40 +DAC0 +ENDCHAR +STARTCHAR U_851B +ENCODING 34075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +7A40 +9140 +7E40 +5540 +7C60 +57C0 +7C40 +9440 +ENDCHAR +STARTCHAR U_851C +ENCODING 34076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FD00 +11E0 +7F40 +1140 +FD40 +2880 +4940 +9620 +ENDCHAR +STARTCHAR U_851D +ENCODING 34077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1920 +F540 +9100 +FFE0 +9100 +F380 +9540 +F920 +0100 +ENDCHAR +STARTCHAR U_851E +ENCODING 34078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +E4E0 +3F80 +4440 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_851F +ENCODING 34079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2200 +FBE0 +4500 +73E0 +5480 +57E0 +9140 +B620 +ENDCHAR +STARTCHAR U_8520 +ENCODING 34080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +4A80 +F100 +22C0 +5520 +F0C0 +5300 +A8C0 +ENDCHAR +STARTCHAR U_8521 +ENCODING 34081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3FE0 +4940 +BE80 +2060 +DF80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_8522 +ENCODING 34082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5200 +8FC0 +2A40 +CF80 +4900 +5680 +FFE0 +1200 +7F80 +ENDCHAR +STARTCHAR U_8523 +ENCODING 34083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +57C0 +5A80 +7500 +1280 +FFE0 +5480 +5280 +9100 +ENDCHAR +STARTCHAR U_8524 +ENCODING 34084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +8920 +5640 +5CA0 +EFA0 +2440 +2440 +3FC0 +ENDCHAR +STARTCHAR U_8525 +ENCODING 34085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2580 +2A80 +2480 +3F80 +1440 +52A0 +8F80 +ENDCHAR +STARTCHAR U_8526 +ENCODING 34086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +7FE0 +92A0 +ENDCHAR +STARTCHAR U_8527 +ENCODING 34087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +1100 +FFE0 +3FC0 +0040 +3FC0 +0040 +3FC0 +ENDCHAR +STARTCHAR U_8528 +ENCODING 34088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +5540 +7FC0 +5140 +7EC0 +5040 +5140 +7FC0 +ENDCHAR +STARTCHAR U_8529 +ENCODING 34089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8420 +7FC0 +2480 +3F80 +2480 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_852A +ENCODING 34090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5500 +7DE0 +5540 +7D40 +1140 +FE40 +1440 +ENDCHAR +STARTCHAR U_852B +ENCODING 34091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1200 +FFE0 +2000 +3FE0 +0020 +5520 +8AC0 +ENDCHAR +STARTCHAR U_852C +ENCODING 34092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +1240 +27E0 +A000 +B540 +A540 +B540 +E960 +ENDCHAR +STARTCHAR U_852D +ENCODING 34093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1380 +F540 +ABA0 +C080 +A7C0 +9000 +EFE0 +8440 +8FA0 +ENDCHAR +STARTCHAR U_852E +ENCODING 34094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4540 +7FC0 +5440 +72C0 +4940 +52C0 +7FC0 +ENDCHAR +STARTCHAR U_852F +ENCODING 34095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +9540 +A7C0 +9540 +97C0 +E380 +8540 +8920 +ENDCHAR +STARTCHAR U_8530 +ENCODING 34096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FC0 +4040 +7FC0 +4880 +5FC0 +5240 +5FC0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_8531 +ENCODING 34097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4BC0 +3240 +CA40 +2420 +FBC0 +2240 +7180 +AE60 +ENDCHAR +STARTCHAR U_8532 +ENCODING 34098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8120 +7BC0 +0680 +FA80 +5120 +52A0 +8FE0 +ENDCHAR +STARTCHAR U_8533 +ENCODING 34099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2100 +8FE0 +6440 +27C0 +C440 +47C0 +4440 +ENDCHAR +STARTCHAR U_8534 +ENCODING 34100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4900 +7FC0 +4900 +5D80 +6B40 +4D20 +8900 +ENDCHAR +STARTCHAR U_8535 +ENCODING 34101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +7FE0 +5100 +7D40 +4540 +7D40 +50A0 +7D60 +8220 +ENDCHAR +STARTCHAR U_8536 +ENCODING 34102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +0400 +7FC0 +2880 +2480 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8537 +ENCODING 34103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +2480 +1500 +FFE0 +2940 +2F40 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8538 +ENCODING 34104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +EEE0 +8A20 +9E20 +EAE0 +0E00 +1100 +1120 +E1E0 +ENDCHAR +STARTCHAR U_8539 +ENCODING 34105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3900 +45E0 +FA40 +2540 +A940 +4880 +5140 +FA20 +ENDCHAR +STARTCHAR U_853A +ENCODING 34106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +17E0 +4A20 +5220 +5FA0 +7220 +5FA0 +5220 +5FE0 +ENDCHAR +STARTCHAR U_853B +ENCODING 34107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +8120 +79C0 +0100 +FFC0 +2A80 +2920 +4AA0 +87E0 +ENDCHAR +STARTCHAR U_853C +ENCODING 34108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +2440 +E7C0 +2440 +2FE0 +2920 +3AA0 +2FA0 +ENDCHAR +STARTCHAR U_853D +ENCODING 34109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +9280 +55E0 +FEA0 +92A0 +9AA0 +B640 +D2A0 +9520 +ENDCHAR +STARTCHAR U_853E +ENCODING 34110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +73E0 +FD20 +3A20 +54C0 +9400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_853F +ENCODING 34111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +2480 +3F00 +2100 +3F80 +2080 +3FC0 +2140 +D4C0 +ENDCHAR +STARTCHAR U_8540 +ENCODING 34112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +2080 +FBE0 +AAA0 +BAE0 +2180 +72C0 +ACA0 +ENDCHAR +STARTCHAR U_8541 +ENCODING 34113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +3FC0 +0040 +3FC0 +0040 +7FC0 +1240 +FFE0 +1080 +0B80 +ENDCHAR +STARTCHAR U_8542 +ENCODING 34114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7540 +57C0 +7100 +5FE0 +5540 +7BE0 +5140 +5240 +B4C0 +ENDCHAR +STARTCHAR U_8543 +ENCODING 34115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7F80 +1500 +FFE0 +2480 +7FC0 +A4A0 +3F80 +2080 +ENDCHAR +STARTCHAR U_8544 +ENCODING 34116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +79E0 +4920 +79E0 +4920 +79E0 +4CA0 +5B60 +6F60 +ENDCHAR +STARTCHAR U_8545 +ENCODING 34117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +2940 +9FC0 +6940 +3FE0 +D160 +57A0 +5060 +ENDCHAR +STARTCHAR U_8546 +ENCODING 34118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +FFE0 +A500 +BD20 +A540 +BD40 +A4A0 +BD60 +E620 +ENDCHAR +STARTCHAR U_8547 +ENCODING 34119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8548 +ENCODING 34120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8549 +ENCODING 34121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3FC0 +2400 +7FC0 +A400 +3FC0 +2400 +7FE0 +8920 +ENDCHAR +STARTCHAR U_854A +ENCODING 34122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +5240 +50A0 +8FA0 +2080 +5180 +CB20 +5540 +71C0 +ENDCHAR +STARTCHAR U_854B +ENCODING 34123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2500 +1780 +1400 +7FC0 +1080 +1080 +5AE0 +5280 +FFE0 +ENDCHAR +STARTCHAR U_854C +ENCODING 34124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +3F80 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_854D +ENCODING 34125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +4300 +2CC0 +9FA0 +52A0 +3EA0 +D2A0 +5E20 +5660 +ENDCHAR +STARTCHAR U_854E +ENCODING 34126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2080 +5F40 +9120 +7FC0 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_854F +ENCODING 34127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5100 +27A0 +D140 +3FE0 +5440 +9FC0 +1440 +77C0 +ENDCHAR +STARTCHAR U_8550 +ENCODING 34128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +5540 +2480 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8551 +ENCODING 34129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4A20 +7BE0 +4F20 +79E0 +4F20 +4920 +4F20 +4920 +5360 +ENDCHAR +STARTCHAR U_8552 +ENCODING 34130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8553 +ENCODING 34131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +FFE0 +9520 +2480 +FFE0 +1080 +3F40 +ENDCHAR +STARTCHAR U_8554 +ENCODING 34132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +1240 +FEC0 +2A00 +FFE0 +1340 +FE80 +1360 +ENDCHAR +STARTCHAR U_8555 +ENCODING 34133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +AFE0 +4280 +AFE0 +2AA0 +6CE0 +AFE0 +2820 +CFE0 +ENDCHAR +STARTCHAR U_8556 +ENCODING 34134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +AFC0 +5400 +27C0 +E7C0 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8557 +ENCODING 34135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +8E40 +F980 +2240 +BFE0 +A240 +A3C0 +FA40 +ENDCHAR +STARTCHAR U_8558 +ENCODING 34136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +2080 +FBC0 +2080 +FFE0 +0900 +1120 +E0E0 +ENDCHAR +STARTCHAR U_8559 +ENCODING 34137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2440 +3FC0 +2440 +FFA0 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_855A +ENCODING 34138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +1200 +3F00 +2100 +7F80 +5280 +FFC0 +1000 +3F80 +0080 +0380 +ENDCHAR +STARTCHAR U_855B +ENCODING 34139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +7A80 +27E0 +F920 +27E0 +3500 +6FE0 +A520 +2960 +ENDCHAR +STARTCHAR U_855C +ENCODING 34140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +7BC0 +0A00 +7BC0 +0400 +5240 +50A0 +8F80 +ENDCHAR +STARTCHAR U_855D +ENCODING 34141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +21C0 +4A40 +F7E0 +4AA0 +FBE0 +5200 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_855E +ENCODING 34142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3F80 +2080 +3F80 +2080 +FFE0 +4A40 +7A40 +4980 +FE60 +ENDCHAR +STARTCHAR U_855F +ENCODING 34143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0100 +7A40 +2980 +2BE0 +FA80 +44C0 +7380 +1100 +36C0 +ENDCHAR +STARTCHAR U_8560 +ENCODING 34144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +5240 +33C0 +CA00 +1480 +7F40 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8561 +ENCODING 34145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +2480 +7FE0 +2040 +3FC0 +2040 +3FC0 +E060 +ENDCHAR +STARTCHAR U_8562 +ENCODING 34146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +F0E0 +ENDCHAR +STARTCHAR U_8563 +ENCODING 34147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +FFE0 +A0A0 +3BE0 +6A80 +33E0 +C080 +ENDCHAR +STARTCHAR U_8564 +ENCODING 34148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +2680 +EBE0 +3480 +5BE0 +B480 +5080 +67E0 +ENDCHAR +STARTCHAR U_8565 +ENCODING 34149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +53E0 +5480 +FFE0 +3480 +57E0 +9480 +37E0 +ENDCHAR +STARTCHAR U_8566 +ENCODING 34150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +4100 +97C0 +2440 +47C0 +9440 +27C0 +CC60 +ENDCHAR +STARTCHAR U_8567 +ENCODING 34151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27E0 +4C40 +A7C0 +6440 +A7C0 +2A40 +3180 +2E60 +ENDCHAR +STARTCHAR U_8568 +ENCODING 34152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9500 +FFE0 +8820 +AA80 +BE80 +8940 +B620 +ENDCHAR +STARTCHAR U_8569 +ENCODING 34153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +27C0 +9440 +57C0 +2440 +2FE0 +D2A0 +4520 +42C0 +ENDCHAR +STARTCHAR U_856A +ENCODING 34154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +7FE0 +AA80 +2A80 +FFE0 +2A80 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_856B +ENCODING 34155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +7FC0 +1100 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_856C +ENCODING 34156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2080 +4920 +F3C0 +4920 +FBE0 +5080 +AAC0 +ADA0 +ENDCHAR +STARTCHAR U_856D +ENCODING 34157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0440 +FFE0 +5540 +7FC0 +4440 +B5C0 +9540 +ENDCHAR +STARTCHAR U_856E +ENCODING 34158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +39C0 +2040 +39C0 +2040 +7FE0 +9520 +2AA0 +4A40 +ENDCHAR +STARTCHAR U_856F +ENCODING 34159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0200 +77C0 +5100 +6EE0 +57C0 +5100 +77C0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_8570 +ENCODING 34160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4F80 +A880 +4F80 +4880 +3FC0 +D540 +5540 +7FE0 +ENDCHAR +STARTCHAR U_8571 +ENCODING 34161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1520 +F340 +27E0 +FC20 +27E0 +3420 +6FE0 +A420 +2460 +ENDCHAR +STARTCHAR U_8572 +ENCODING 34162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5480 +29E0 +7D00 +5500 +7DE0 +5540 +FF40 +1240 +1440 +ENDCHAR +STARTCHAR U_8573 +ENCODING 34163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7FC0 +5140 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8574 +ENCODING 34164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +5440 +E7C0 +2440 +4FE0 +EAA0 +2AA0 +DFE0 +ENDCHAR +STARTCHAR U_8575 +ENCODING 34165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1380 +4540 +7FE0 +5440 +B7C0 +1440 +27E0 +44C0 +8620 +ENDCHAR +STARTCHAR U_8576 +ENCODING 34166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +94A0 +2440 +1B00 +E0E0 +3F80 +0900 +0600 +ENDCHAR +STARTCHAR U_8577 +ENCODING 34167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +5100 +23C0 +FA40 +2BC0 +2240 +23C0 +6E60 +ENDCHAR +STARTCHAR U_8578 +ENCODING 34168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +2EE0 +0A20 +EEE0 +2800 +2EE0 +2840 +58A0 +8FE0 +ENDCHAR +STARTCHAR U_8579 +ENCODING 34169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2500 +5480 +EFE0 +5480 +F7E0 +2480 +47E0 +ENDCHAR +STARTCHAR U_857A +ENCODING 34170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7940 +4920 +FDE0 +4B20 +7940 +48A0 +FD60 +0A20 +ENDCHAR +STARTCHAR U_857B +ENCODING 34171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7940 +4140 +7BE0 +4140 +F940 +27E0 +5140 +EE20 +ENDCHAR +STARTCHAR U_857C +ENCODING 34172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +40A0 +7BE0 +40A0 +FFE0 +2080 +4FE0 +F880 +ENDCHAR +STARTCHAR U_857D +ENCODING 34173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0A00 +3F80 +2A80 +2A80 +7FC0 +4000 +7FC0 +5280 +99E0 +ENDCHAR +STARTCHAR U_857E +ENCODING 34174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +0400 +FFE0 +94A0 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_857F +ENCODING 34175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1140 +2F80 +B500 +AFC0 +A200 +2FC0 +2280 +5500 +8AC0 +ENDCHAR +STARTCHAR U_8580 +ENCODING 34176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +27C0 +9540 +66C0 +2440 +CFE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_8581 +ENCODING 34177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +5540 +7FC0 +4E40 +5540 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_8582 +ENCODING 34178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0880 +7D00 +45E0 +7EA0 +44A0 +FEA0 +2440 +24A0 +D920 +ENDCHAR +STARTCHAR U_8583 +ENCODING 34179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +2FE0 +9440 +67C0 +2000 +DFE0 +54A0 +57A0 +5060 +ENDCHAR +STARTCHAR U_8584 +ENCODING 34180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9280 +5FC0 +9240 +7FC0 +3240 +D280 +7FE0 +4880 +4180 +ENDCHAR +STARTCHAR U_8585 +ENCODING 34181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +E800 +4FE0 +AAA0 +AB40 +6FE0 +6A80 +9180 +ENDCHAR +STARTCHAR U_8586 +ENCODING 34182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +2480 +FFE0 +B4A0 +1F80 +3100 +0E00 +F1E0 +ENDCHAR +STARTCHAR U_8587 +ENCODING 34183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0900 +6A80 +BE80 +42E0 +DF40 +4140 +5C80 +5540 +6220 +ENDCHAR +STARTCHAR U_8588 +ENCODING 34184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1B00 +64C0 +FFE0 +5540 +7FC0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8589 +ENCODING 34185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1780 +2400 +FFE0 +0100 +7FE0 +4940 +5AA0 +6D60 +9620 +ENDCHAR +STARTCHAR U_858A +ENCODING 34186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +3820 +7EA0 +AAA0 +3EA0 +2AA0 +7EA0 +6A20 +9560 +ENDCHAR +STARTCHAR U_858B +ENCODING 34187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +C7E0 +2A20 +C580 +68C0 +3FA0 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_858C +ENCODING 34188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +5EE0 +52A0 +FEC0 +52A0 +5EA0 +F4E0 +5680 +9A80 +ENDCHAR +STARTCHAR U_858D +ENCODING 34189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FA80 +5480 +7E80 +1480 +FE80 +AAA0 +92A0 +EEE0 +ENDCHAR +STARTCHAR U_858E +ENCODING 34190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +5140 +FFE0 +92A0 +63C0 +AE40 +21A0 +2EE0 +ENDCHAR +STARTCHAR U_858F +ENCODING 34191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +1100 +FFE0 +2080 +3F80 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_8590 +ENCODING 34192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F7C0 +2100 +FFE0 +2440 +73E0 +AE40 +2180 +2E60 +ENDCHAR +STARTCHAR U_8591 +ENCODING 34193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2480 +2480 +FFE0 +2480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_8592 +ENCODING 34194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +53C0 +7880 +9340 +2C80 +D500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8593 +ENCODING 34195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +4780 +2080 +9FE0 +5120 +0FC0 +4540 +C7C0 +4280 +4FC0 +ENDCHAR +STARTCHAR U_8594 +ENCODING 34196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2480 +5540 +FFE0 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8595 +ENCODING 34197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1500 +3FE0 +2540 +3FE0 +2540 +3FC0 +2D80 +5540 +A520 +ENDCHAR +STARTCHAR U_8596 +ENCODING 34198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4F80 +2880 +CE80 +5FC0 +5540 +5740 +B040 +9FE0 +ENDCHAR +STARTCHAR U_8597 +ENCODING 34199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4440 +5F40 +4440 +7FC0 +4940 +5E40 +4940 +7FC0 +ENDCHAR +STARTCHAR U_8598 +ENCODING 34200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +97C0 +4100 +0FC0 +E480 +2FE0 +2100 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8599 +ENCODING 34201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4280 +FFE0 +A480 +FFE0 +2480 +27E0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_859A +ENCODING 34202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1440 +F7C0 +4440 +7FE0 +9400 +D7E0 +2AA0 +4520 +8AC0 +ENDCHAR +STARTCHAR U_859B +ENCODING 34203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4100 +F7C0 +9280 +FFE0 +8100 +F7E0 +9100 +F100 +ENDCHAR +STARTCHAR U_859C +ENCODING 34204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7FE0 +4540 +7C80 +43E0 +7C80 +67E0 +A480 +BC80 +ENDCHAR +STARTCHAR U_859D +ENCODING 34205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +D480 +6240 +5FC0 +4000 +5FC0 +5040 +9FC0 +ENDCHAR +STARTCHAR U_859E +ENCODING 34206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FA80 +4540 +7FE0 +5440 +D7E0 +2540 +4480 +8660 +ENDCHAR +STARTCHAR U_859F +ENCODING 34207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0A00 +3180 +CE60 +7BC0 +4A40 +7BC0 +2080 +DB60 +ENDCHAR +STARTCHAR U_85A0 +ENCODING 34208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2900 +B7C0 +A440 +27C0 +2440 +57C0 +8C60 +ENDCHAR +STARTCHAR U_85A1 +ENCODING 34209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5F40 +5140 +5F40 +7FC0 +0A00 +FBE0 +4A40 +8A40 +ENDCHAR +STARTCHAR U_85A2 +ENCODING 34210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +77E0 +9120 +FE60 +AA80 +FBE0 +AC80 +FFE0 +A880 +ENDCHAR +STARTCHAR U_85A3 +ENCODING 34211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +1080 +FFE0 +4940 +7940 +5080 +2140 +FA20 +ENDCHAR +STARTCHAR U_85A4 +ENCODING 34212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F280 +4EE0 +7280 +9EE0 +5280 +2EE0 +4280 +9FE0 +ENDCHAR +STARTCHAR U_85A5 +ENCODING 34213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +7FE0 +2420 +5F20 +9520 +1FA0 +3CE0 +ENDCHAR +STARTCHAR U_85A6 +ENCODING 34214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4A40 +7FC0 +4A40 +5FE0 +5000 +5FE0 +AAA0 +ENDCHAR +STARTCHAR U_85A7 +ENCODING 34215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +2080 +FFE0 +A220 +3A80 +6B20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_85A8 +ENCODING 34216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4A40 +FFE0 +A220 +3A40 +6B80 +1A20 +F1E0 +ENDCHAR +STARTCHAR U_85A9 +ENCODING 34217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +A280 +CFE0 +ABE0 +AD00 +CBC0 +9100 +AFE0 +ENDCHAR +STARTCHAR U_85AA +ENCODING 34218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FDE0 +2900 +FFE0 +1140 +FD40 +5940 +9540 +3240 +ENDCHAR +STARTCHAR U_85AB +ENCODING 34219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +3F80 +0400 +FFE0 +2480 +7FC0 +0400 +FFE0 +4A40 +ENDCHAR +STARTCHAR U_85AC +ENCODING 34220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +1480 +4E40 +3B80 +2E80 +4A40 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_85AD +ENCODING 34221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +0A00 +F7C0 +2540 +FFC0 +2540 +77C0 +A900 +3FE0 +2100 +ENDCHAR +STARTCHAR U_85AE +ENCODING 34222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5500 +3900 +FDE0 +3A20 +5540 +FD40 +2880 +1140 +EE20 +ENDCHAR +STARTCHAR U_85AF +ENCODING 34223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4A40 +7FC0 +0480 +FFE0 +0840 +3FC0 +D040 +1FC0 +ENDCHAR +STARTCHAR U_85B0 +ENCODING 34224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5540 +7FC0 +0400 +7FC0 +0400 +FFE0 +8920 +ENDCHAR +STARTCHAR U_85B1 +ENCODING 34225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5440 +FFE0 +2840 +FE40 +1140 +7D40 +1040 +FDC0 +ENDCHAR +STARTCHAR U_85B2 +ENCODING 34226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1080 +7FE0 +4AA0 +1300 +1F80 +7080 +1680 +1080 +1F80 +30C0 +ENDCHAR +STARTCHAR U_85B3 +ENCODING 34227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1200 +4F80 +2200 +1FE0 +E480 +27A0 +2AC0 +5260 +8FE0 +ENDCHAR +STARTCHAR U_85B4 +ENCODING 34228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9420 +52C0 +BFA0 +2A80 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_85B5 +ENCODING 34229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +0400 +FFE0 +04A0 +7FC0 +5480 +7280 +0100 +ENDCHAR +STARTCHAR U_85B6 +ENCODING 34230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +DD40 +27C0 +D540 +5FE0 +B100 +5100 +B7E0 +ENDCHAR +STARTCHAR U_85B7 +ENCODING 34231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +4A40 +5140 +FFE0 +0800 +7FE0 +4920 +4960 +ENDCHAR +STARTCHAR U_85B8 +ENCODING 34232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4100 +3FE0 +8AA0 +5AA0 +2FE0 +2000 +CFE0 +4540 +5920 +ENDCHAR +STARTCHAR U_85B9 +ENCODING 34233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +0400 +7FC0 +2080 +FFE0 +9120 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_85BA +ENCODING 34234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +5B40 +5520 +A480 +3F80 +2080 +3F80 +C080 +ENDCHAR +STARTCHAR U_85BB +ENCODING 34235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +27C0 +8540 +57C0 +1540 +27C0 +E100 +4FE0 +4540 +ENDCHAR +STARTCHAR U_85BC +ENCODING 34236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +4A80 +7F80 +59C0 +5500 +5FC0 +4400 +BFE0 +ENDCHAR +STARTCHAR U_85BD +ENCODING 34237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +FDE0 +2880 +FFE0 +A920 +FFA0 +1160 +7D20 +11A0 +FD20 +ENDCHAR +STARTCHAR U_85BE +ENCODING 34238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +2440 +FFE0 +6EC0 +5540 +6EC0 +5540 +6EC0 +ENDCHAR +STARTCHAR U_85BF +ENCODING 34239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +73E0 +4540 +7FE0 +90A0 +FE80 +22E0 +5280 +8DE0 +ENDCHAR +STARTCHAR U_85C0 +ENCODING 34240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5AC0 +5280 +2940 +FFE0 +94A0 +2500 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_85C1 +ENCODING 34241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +1100 +7FC0 +5140 +5F40 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_85C2 +ENCODING 34242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +4940 +7880 +4B40 +FC20 +2680 +1500 +E4E0 +ENDCHAR +STARTCHAR U_85C3 +ENCODING 34243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FF00 +29E0 +FE20 +8280 +BA80 +AA80 +BB40 +8620 +ENDCHAR +STARTCHAR U_85C4 +ENCODING 34244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +1100 +FFE0 +4A40 +94A0 +7F80 +2500 +CCE0 +ENDCHAR +STARTCHAR U_85C5 +ENCODING 34245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7FE0 +4920 +7FE0 +1020 +FF20 +3920 +7D20 +4420 +7CE0 +ENDCHAR +STARTCHAR U_85C6 +ENCODING 34246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9120 +7FC0 +1500 +EEE0 +0400 +7FC0 +0C00 +ENDCHAR +STARTCHAR U_85C7 +ENCODING 34247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6EC0 +4840 +6EC0 +4A40 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_85C8 +ENCODING 34248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +E680 +AAA0 +E440 +ABA0 +E100 +AFE0 +E280 +1C60 +ENDCHAR +STARTCHAR U_85C9 +ENCODING 34249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +2140 +FFE0 +2240 +FBC0 +6A40 +A7C0 +2240 +ENDCHAR +STARTCHAR U_85CA +ENCODING 34250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +77C0 +2440 +FFC0 +3400 +67E0 +A6A0 +2BE0 +2AA0 +ENDCHAR +STARTCHAR U_85CB +ENCODING 34251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFC0 +4A40 +39C0 +4A40 +3FC0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_85CC +ENCODING 34252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +5240 +EFC0 +3F80 +D480 +1F80 +0440 +7FC0 +ENDCHAR +STARTCHAR U_85CD +ENCODING 34253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9100 +F9E0 +8A80 +FC40 +9000 +FFC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_85CE +ENCODING 34254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +3FC0 +0440 +FFE0 +0440 +7FE0 +4920 +3FC0 +2A40 +FFE0 +ENDCHAR +STARTCHAR U_85CF +ENCODING 34255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +BFE0 +AA80 +EFA0 +28A0 +EFC0 +AAA0 +AFA0 +4160 +ENDCHAR +STARTCHAR U_85D0 +ENCODING 34256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +47C0 +AC40 +57C0 +E440 +57C0 +B2A0 +52A0 +B460 +ENDCHAR +STARTCHAR U_85D1 +ENCODING 34257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +4940 +7FC0 +2480 +3F80 +1880 +2700 +F8E0 +ENDCHAR +STARTCHAR U_85D2 +ENCODING 34258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +F7C0 +2440 +FFC0 +2240 +77E0 +ACA0 +2560 +27A0 +ENDCHAR +STARTCHAR U_85D3 +ENCODING 34259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1120 +7140 +7FC0 +D480 +7FC0 +5480 +7FE0 +0080 +FC80 +ENDCHAR +STARTCHAR U_85D4 +ENCODING 34260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +8420 +7FE0 +34C0 +D2A0 +1F80 +1280 +6E60 +ENDCHAR +STARTCHAR U_85D5 +ENCODING 34261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +22A0 +73E0 +22A0 +FFE0 +24A0 +77E0 +AC60 +ENDCHAR +STARTCHAR U_85D6 +ENCODING 34262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +5680 +7900 +56E0 +7F80 +2A80 +3F80 +60C0 +ENDCHAR +STARTCHAR U_85D7 +ENCODING 34263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0880 +9F80 +44E0 +1FC0 +D540 +5F40 +4EA0 +5520 +BFE0 +ENDCHAR +STARTCHAR U_85D8 +ENCODING 34264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +8420 +BF80 +8420 +BFE0 +A440 +BFC0 +AAA0 +CFA0 +ENDCHAR +STARTCHAR U_85D9 +ENCODING 34265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FB80 +52E0 +FC00 +ABC0 +5240 +3D80 +D240 +3420 +ENDCHAR +STARTCHAR U_85DA +ENCODING 34266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_85DB +ENCODING 34267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +A0A0 +3B80 +2080 +3FE0 +5520 +2AA0 +4AC0 +ENDCHAR +STARTCHAR U_85DC +ENCODING 34268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +79E0 +12A0 +FCA0 +5660 +8900 +3580 +C660 +1D00 +E4E0 +ENDCHAR +STARTCHAR U_85DD +ENCODING 34269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FFC0 +5140 +F940 +22A0 +FFC0 +0000 +FFE0 +1080 +3F40 +ENDCHAR +STARTCHAR U_85DE +ENCODING 34270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +3080 +DF80 +1080 +FFE0 +4B20 +FDE0 +4920 +ENDCHAR +STARTCHAR U_85DF +ENCODING 34271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4440 +7FC0 +4440 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_85E0 +ENCODING 34272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +2480 +3F80 +4080 +FBE0 +CB20 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_85E1 +ENCODING 34273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +9FE0 +4480 +1FE0 +E920 +2FE0 +2920 +2BA0 +7AA0 +8FE0 +ENDCHAR +STARTCHAR U_85E2 +ENCODING 34274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1900 +2A80 +5FE0 +94A0 +6FA0 +A4A0 +3F40 +24A0 +3F20 +ENDCHAR +STARTCHAR U_85E3 +ENCODING 34275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4A40 +7FC0 +2A40 +FEA0 +4BE0 +7A40 +4B80 +7A20 +4BE0 +ENDCHAR +STARTCHAR U_85E4 +ENCODING 34276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +F280 +9FE0 +F200 +9FE0 +F540 +9B60 +9580 +B960 +ENDCHAR +STARTCHAR U_85E5 +ENCODING 34277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +AAA0 +4E40 +AAA0 +EEE0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_85E6 +ENCODING 34278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +9080 +FFE0 +BAC0 +D4A0 +BF80 +8200 +FFE0 +8E00 +ENDCHAR +STARTCHAR U_85E7 +ENCODING 34279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +2A00 +27E0 +5540 +77C0 +2100 +5FE0 +7640 +5980 +9660 +ENDCHAR +STARTCHAR U_85E8 +ENCODING 34280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +9240 +FFC0 +A200 +BBC0 +A220 +BDE0 +A4A0 +ENDCHAR +STARTCHAR U_85E9 +ENCODING 34281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4B20 +2540 +1FE0 +6540 +2FE0 +D940 +4FC0 +4940 +4FC0 +ENDCHAR +STARTCHAR U_85EA +ENCODING 34282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C80 +54E0 +FFA0 +54A0 +FEA0 +2440 +38A0 +C720 +ENDCHAR +STARTCHAR U_85EB +ENCODING 34283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9480 +5FE0 +14A0 +9FE0 +6840 +2FC0 +C840 +5FE0 +4200 +ENDCHAR +STARTCHAR U_85EC +ENCODING 34284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +F7C0 +A540 +CFE0 +A440 +97C0 +D440 +A7C0 +8C60 +ENDCHAR +STARTCHAR U_85ED +ENCODING 34285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +A0A0 +7BC0 +C8A0 +7B80 +4A00 +FBC0 +2840 +C980 +ENDCHAR +STARTCHAR U_85EE +ENCODING 34286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +27E0 +FC80 +27C0 +7480 +6FC0 +A480 +27E0 +2AA0 +ENDCHAR +STARTCHAR U_85EF +ENCODING 34287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +7C40 +47E0 +7D40 +ACC0 +5AC0 +1440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_85F0 +ENCODING 34288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +CE20 +AAA0 +D2A0 +6EA0 +12A0 +FEA0 +5420 +FEE0 +ENDCHAR +STARTCHAR U_85F1 +ENCODING 34289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +BFE0 +6A80 +2F80 +6A80 +AFC0 +26A0 +4A60 +B3E0 +ENDCHAR +STARTCHAR U_85F2 +ENCODING 34290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +F800 +29C0 +3940 +6BE0 +AAA0 +2AA0 +2FE0 +ENDCHAR +STARTCHAR U_85F3 +ENCODING 34291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +0A00 +7FC0 +5F40 +0400 +FFE0 +1500 +E4C0 +ENDCHAR +STARTCHAR U_85F4 +ENCODING 34292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3100 +47C0 +9540 +E7C0 +5000 +EFE0 +0AA0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_85F5 +ENCODING 34293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +1200 +17C0 +2440 +7FE0 +A540 +2920 +7FE0 +2940 +CCE0 +ENDCHAR +STARTCHAR U_85F6 +ENCODING 34294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9080 +FFE0 +B9C0 +D6A0 +83C0 +9200 +FFE0 +ENDCHAR +STARTCHAR U_85F7 +ENCODING 34295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1120 +F7A0 +0140 +FFE0 +0240 +F7C0 +9A40 +F3C0 +9240 +ENDCHAR +STARTCHAR U_85F8 +ENCODING 34296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFA0 +4940 +B7E0 +6240 +B7C0 +6A40 +A3C0 +6240 +ENDCHAR +STARTCHAR U_85F9 +ENCODING 34297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +F7C0 +0440 +F7C0 +0240 +FFE0 +94A0 +F560 +97A0 +ENDCHAR +STARTCHAR U_85FA +ENCODING 34298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4920 +79E0 +4920 +7BE0 +5FA0 +5220 +5FA0 +5220 +5FE0 +ENDCHAR +STARTCHAR U_85FB +ENCODING 34299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +27C0 +9440 +6FE0 +2AA0 +3FE0 +C540 +4520 +5920 +ENDCHAR +STARTCHAR U_85FC +ENCODING 34300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +FFE0 +8420 +3F80 +0400 +3F80 +2A80 +3F80 +5540 +8F20 +ENDCHAR +STARTCHAR U_85FD +ENCODING 34301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +FBE0 +5220 +FFA0 +22E0 +FE20 +73E0 +A940 +6660 +ENDCHAR +STARTCHAR U_85FE +ENCODING 34302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F9C0 +2240 +FBE0 +AA20 +FBE0 +7220 +ABE0 +2620 +ENDCHAR +STARTCHAR U_85FF +ENCODING 34303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +1480 +FFE0 +94A0 +3FC0 +6400 +BFC0 +2400 +3FE0 +ENDCHAR +STARTCHAR U_8600 +ENCODING 34304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +FAA0 +2FE0 +3100 +E7C0 +2280 +2FE0 +6100 +ENDCHAR +STARTCHAR U_8601 +ENCODING 34305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +5540 +5540 +FFE0 +0400 +75C0 +5540 +FFE0 +ENDCHAR +STARTCHAR U_8602 +ENCODING 34306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7FE0 +0A00 +5540 +8F20 +26A0 +BBE0 +0400 +FFE0 +1480 +6460 +ENDCHAR +STARTCHAR U_8603 +ENCODING 34307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +1080 +5AE0 +5280 +FFE0 +0400 +FFE0 +3500 +C4E0 +ENDCHAR +STARTCHAR U_8604 +ENCODING 34308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +AB00 +FFE0 +5540 +7D40 +5540 +FF40 +1240 +ENDCHAR +STARTCHAR U_8605 +ENCODING 34309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4EE0 +9200 +75E0 +5F40 +D540 +7FC0 +4A40 +71C0 +ENDCHAR +STARTCHAR U_8606 +ENCODING 34310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4420 +5FE0 +4A80 +5FC0 +5540 +9540 +FFE0 +ENDCHAR +STARTCHAR U_8607 +ENCODING 34311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +73C0 +7C80 +D7E0 +7C80 +55C0 +7EA0 +5480 +AA80 +ENDCHAR +STARTCHAR U_8608 +ENCODING 34312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BE0 +2080 +FBE0 +7220 +AAA0 +73E0 +5940 +9220 +ENDCHAR +STARTCHAR U_8609 +ENCODING 34313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FFE0 +4A40 +FFE0 +A0A0 +4780 +C080 +5FC0 +5540 +4700 +58C0 +ENDCHAR +STARTCHAR U_860A +ENCODING 34314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +47C0 +5540 +E5C0 +4640 +FFE0 +0AA0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_860B +ENCODING 34315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +53E0 +5D00 +53E0 +FE20 +53E0 +9A20 +13E0 +E620 +ENDCHAR +STARTCHAR U_860C +ENCODING 34316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5100 +AFE0 +44A0 +D6E0 +5F80 +4000 +FFE0 +2500 +CCE0 +ENDCHAR +STARTCHAR U_860D +ENCODING 34317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7C80 +1080 +FDE0 +54A0 +7CA0 +10A0 +FD20 +AA40 +ENDCHAR +STARTCHAR U_860E +ENCODING 34318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FE0 +9540 +7BE0 +4AA0 +7AA0 +4BE0 +7A00 +89E0 +ENDCHAR +STARTCHAR U_860F +ENCODING 34319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +43E0 +7900 +43E0 +7A20 +02A0 +FBE0 +7140 +AA20 +ENDCHAR +STARTCHAR U_8610 +ENCODING 34320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FE0 +F540 +0FE0 +F200 +0FE0 +F540 +9480 +F960 +ENDCHAR +STARTCHAR U_8611 +ENCODING 34321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFE0 +0A80 +7FE0 +4880 +7FE0 +6AA0 +7FE0 +4840 +7840 +8FC0 +ENDCHAR +STARTCHAR U_8612 +ENCODING 34322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +77C0 +2880 +FFC0 +3540 +6FC0 +6540 +A7E0 +21E0 +ENDCHAR +STARTCHAR U_8613 +ENCODING 34323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +2480 +FFC0 +3540 +6FC0 +6540 +A7C0 +2AA0 +ENDCHAR +STARTCHAR U_8614 +ENCODING 34324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +F3E0 +8900 +7BE0 +0220 +FAA0 +23E0 +FD40 +AA20 +ENDCHAR +STARTCHAR U_8615 +ENCODING 34325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +29E0 +5340 +FC80 +2760 +5480 +F7E0 +0480 +ABE0 +ENDCHAR +STARTCHAR U_8616 +ENCODING 34326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4900 +F7E0 +9280 +FFE0 +8900 +FFE0 +0500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8617 +ENCODING 34327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7BE0 +4940 +7FE0 +C480 +7FE0 +0480 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_8618 +ENCODING 34328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +4A40 +7BC0 +1100 +FFE0 +3120 +5540 +98E0 +ENDCHAR +STARTCHAR U_8619 +ENCODING 34329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9380 +FAE0 +9340 +FC80 +AB60 +FFC0 +4A40 +39C0 +5AC0 +ENDCHAR +STARTCHAR U_861A +ENCODING 34330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0940 +7080 +FFE0 +5480 +7FC0 +5480 +7FE0 +5480 +AA80 +ENDCHAR +STARTCHAR U_861B +ENCODING 34331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +53E0 +F940 +53E0 +7220 +53E0 +FE20 +ABE0 +FE60 +ENDCHAR +STARTCHAR U_861C +ENCODING 34332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5500 +FFE0 +5160 +FDA0 +AB20 +FFE0 +21A0 +FB60 +2540 +ENDCHAR +STARTCHAR U_861D +ENCODING 34333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +29E0 +D640 +0080 +EE80 +AA80 +EE80 +4540 +AA20 +ENDCHAR +STARTCHAR U_861E +ENCODING 34334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +6D00 +B9E0 +0340 +FD40 +9580 +FC80 +4940 +B620 +ENDCHAR +STARTCHAR U_861F +ENCODING 34335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +EFE0 +A540 +CFE0 +A040 +AFE0 +E540 +8CA0 +97A0 +ENDCHAR +STARTCHAR U_8620 +ENCODING 34336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +AFE0 +A540 +EBA0 +3FE0 +EAA0 +ABA0 +A820 +AFE0 +ENDCHAR +STARTCHAR U_8621 +ENCODING 34337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +FFE0 +1100 +0E00 +F9E0 +ENDCHAR +STARTCHAR U_8622 +ENCODING 34338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FDE0 +2BC0 +FC40 +45C0 +7D00 +45C0 +7D20 +4DE0 +ENDCHAR +STARTCHAR U_8623 +ENCODING 34339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +7C80 +2BE0 +FE80 +5480 +7FE0 +5480 +7C80 +C7E0 +ENDCHAR +STARTCHAR U_8624 +ENCODING 34340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4FC0 +EA40 +A580 +AFC0 +E240 +AFE0 +B560 +EAA0 +ENDCHAR +STARTCHAR U_8625 +ENCODING 34341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +3F80 +4040 +F7E0 +5540 +7FC0 +4A40 +7FC0 +4A40 +ENDCHAR +STARTCHAR U_8626 +ENCODING 34342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +9520 +2480 +EEE0 +AAA0 +AAA0 +EEE0 +AAA0 +ENDCHAR +STARTCHAR U_8627 +ENCODING 34343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +8200 +4FE0 +0A20 +EFE0 +2A20 +2DC0 +32A0 +65A0 +9FE0 +ENDCHAR +STARTCHAR U_8628 +ENCODING 34344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +5100 +FBC0 +2080 +FBE0 +2080 +AAA0 +F900 +ENDCHAR +STARTCHAR U_8629 +ENCODING 34345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4900 +FD00 +55E0 +7F20 +54C0 +7D20 +1200 +3FE0 +1280 +EE60 +ENDCHAR +STARTCHAR U_862A +ENCODING 34346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFC0 +9240 +FFC0 +A9A0 +BBE0 +9500 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_862B +ENCODING 34347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9E80 +54E0 +9E80 +54C0 +1520 +DFC0 +9540 +BFE0 +ENDCHAR +STARTCHAR U_862C +ENCODING 34348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +F7C0 +9040 +FFC0 +8840 +FFE0 +2520 +BFC0 +A540 +FDC0 +ENDCHAR +STARTCHAR U_862D +ENCODING 34349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +8A20 +FBE0 +FFE0 +AAA0 +BFA0 +9520 +A4E0 +ENDCHAR +STARTCHAR U_862E +ENCODING 34350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4940 +FFE0 +B440 +D940 +A540 +B540 +D940 +A4C0 +ENDCHAR +STARTCHAR U_862F +ENCODING 34351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1100 +57C0 +2540 +8FE0 +1520 +4AE0 +BF80 +2A80 +7FE0 +ENDCHAR +STARTCHAR U_8630 +ENCODING 34352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +27C0 +4540 +EFE0 +4AA0 +FFE0 +0440 +AB80 +8C60 +ENDCHAR +STARTCHAR U_8631 +ENCODING 34353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +A100 +6BE0 +FC80 +23E0 +7220 +ABE0 +FE20 +53E0 +8E60 +ENDCHAR +STARTCHAR U_8632 +ENCODING 34354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FBE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8633 +ENCODING 34355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FC80 +53E0 +FC80 +ABE0 +F880 +ABE0 +F880 +CFE0 +ENDCHAR +STARTCHAR U_8634 +ENCODING 34356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +5540 +7FC0 +5540 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_8635 +ENCODING 34357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +F4C0 +BFA0 +EA80 +BFE0 +EAA0 +AEC0 +AA80 +FF60 +2220 +ENDCHAR +STARTCHAR U_8636 +ENCODING 34358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0880 +73E0 +12A0 +FFE0 +5AA0 +97E0 +FCA0 +29C0 +1AA0 +64E0 +ENDCHAR +STARTCHAR U_8637 +ENCODING 34359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FFE0 +24A0 +BEE0 +AA80 +FFE0 +2900 +C600 +39E0 +ENDCHAR +STARTCHAR U_8638 +ENCODING 34360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +FDE0 +2940 +FDE0 +AF40 +EDE0 +8540 +FDE0 +5240 +8920 +ENDCHAR +STARTCHAR U_8639 +ENCODING 34361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +BAA0 +AFE0 +A380 +2540 +3D20 +28C0 +2E60 +ENDCHAR +STARTCHAR U_863A +ENCODING 34362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FA80 +DBE0 +AA80 +FBE0 +2280 +FBE0 +CA80 +FBE0 +8A00 +ENDCHAR +STARTCHAR U_863B +ENCODING 34363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +FDC0 +A940 +FBE0 +AA40 +FD80 +AA60 +FFC0 +2520 +CCE0 +ENDCHAR +STARTCHAR U_863C +ENCODING 34364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +9080 +FFE0 +B9C0 +D6A0 +BDE0 +8500 +FDE0 +8500 +ENDCHAR +STARTCHAR U_863D +ENCODING 34365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2480 +7FC0 +56C0 +6D40 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_863E +ENCODING 34366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +2FE0 +2AA0 +FFE0 +2380 +2C60 +3940 +CE80 +0860 +ENDCHAR +STARTCHAR U_863F +ENCODING 34367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7FE0 +4920 +7FE0 +2A80 +57E0 +FA80 +43E0 +FA80 +ABE0 +ENDCHAR +STARTCHAR U_8640 +ENCODING 34368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1500 +FFE0 +5A80 +5540 +A520 +FBE0 +0A00 +FBE0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8641 +ENCODING 34369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +24A0 +BEE0 +EA80 +3FE0 +D100 +0E00 +71C0 +ENDCHAR +STARTCHAR U_8642 +ENCODING 34370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7FC0 +0400 +FFE0 +D4A0 +7300 +B7C0 +ACA0 +F780 +ENDCHAR +STARTCHAR U_8643 +ENCODING 34371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +8AC0 +55A0 +3FE0 +8A80 +7BA0 +2AA0 +DB40 +4A60 +5F20 +ENDCHAR +STARTCHAR U_8644 +ENCODING 34372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +23C0 +FE80 +AB80 +AD60 +F900 +27C0 +3900 +EFE0 +ENDCHAR +STARTCHAR U_8645 +ENCODING 34373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +77C0 +5280 +77C0 +5AA0 +73C0 +5280 +53E0 +9AA0 +ENDCHAR +STARTCHAR U_8646 +ENCODING 34374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1200 +7FC0 +4440 +FFE0 +AAA0 +FBE0 +1480 +FFC0 +2500 +CCE0 +ENDCHAR +STARTCHAR U_8647 +ENCODING 34375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +17E0 +E240 +2FE0 +EAA0 +87E0 +EC80 +37E0 +2480 +C7E0 +ENDCHAR +STARTCHAR U_8648 +ENCODING 34376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0900 +FFE0 +A4A0 +EEE0 +0A00 +EEE0 +AAA0 +EEE0 +1B00 +ENDCHAR +STARTCHAR U_8649 +ENCODING 34377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFC0 +1280 +FBC0 +5240 +73C0 +0240 +FBE0 +AA00 +FFE0 +AAA0 +ENDCHAR +STARTCHAR U_864A +ENCODING 34378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFC0 +1200 +4480 +AD40 +E1C0 +4C80 +A140 +FFE0 +1500 +64C0 +ENDCHAR +STARTCHAR U_864B +ENCODING 34379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +52C0 +5240 +FFE0 +AAA0 +2A80 +3580 +7F80 +9160 +6700 +ENDCHAR +STARTCHAR U_864C +ENCODING 34380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1200 +ABE0 +FD40 +A880 +FBE0 +8A40 +FBC0 +8BC0 +FA20 +0FE0 +ENDCHAR +STARTCHAR U_864D +ENCODING 34381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +7FE0 +4440 +4780 +7C40 +47C0 +4000 +4000 +8000 +ENDCHAR +STARTCHAR U_864E +ENCODING 34382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4840 +7F80 +4820 +4FE0 +4000 +4F00 +4920 +B0E0 +ENDCHAR +STARTCHAR U_864F +ENCODING 34383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4840 +7F80 +4820 +4FE0 +4400 +5FC0 +8440 +B980 +ENDCHAR +STARTCHAR U_8650 +ENCODING 34384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5F80 +4420 +4FE0 +4800 +7FE0 +4800 +8FC0 +ENDCHAR +STARTCHAR U_8651 +ENCODING 34385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5F80 +4420 +47E0 +4A00 +5940 +A8A0 +87A0 +ENDCHAR +STARTCHAR U_8652 +ENCODING 34386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +7F80 +4200 +5FE0 +5220 +5F80 +5220 +57E0 +9480 +A4A0 +D8E0 +ENDCHAR +STARTCHAR U_8653 +ENCODING 34387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +4100 +F7E0 +5520 +57C0 +5500 +5520 +5DE0 +5540 +4540 +8A60 +ENDCHAR +STARTCHAR U_8654 +ENCODING 34388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4500 +5E20 +43E0 +4200 +7FE0 +4480 +4300 +BCE0 +ENDCHAR +STARTCHAR U_8655 +ENCODING 34389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4540 +5E20 +57E0 +5C00 +55C0 +7560 +4E00 +B1E0 +ENDCHAR +STARTCHAR U_8656 +ENCODING 34390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5F80 +4420 +5FE0 +4A80 +7FE0 +4200 +8E00 +ENDCHAR +STARTCHAR U_8657 +ENCODING 34391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4440 +5F80 +4440 +4FC0 +4800 +4FC0 +4880 +BFE0 +ENDCHAR +STARTCHAR U_8658 +ENCODING 34392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4400 +7F80 +4420 +5FC0 +5080 +5480 +5280 +BFE0 +ENDCHAR +STARTCHAR U_8659 +ENCODING 34393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +7FC0 +4420 +47E0 +5900 +6A40 +8C20 +B7C0 +ENDCHAR +STARTCHAR U_865A +ENCODING 34394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +7F80 +4420 +47E0 +6940 +5980 +8900 +FFE0 +ENDCHAR +STARTCHAR U_865B +ENCODING 34395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4420 +7F80 +4420 +57E0 +5540 +5DC0 +8500 +FFE0 +ENDCHAR +STARTCHAR U_865C +ENCODING 34396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FE0 +5240 +7FE0 +5240 +7FE0 +4420 +B9C0 +ENDCHAR +STARTCHAR U_865D +ENCODING 34397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +1100 +7DE0 +5AA0 +7560 +5D60 +42A0 +5CA0 +5520 +9440 +A7E0 +ENDCHAR +STARTCHAR U_865E +ENCODING 34398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4820 +5FE0 +6880 +7FC0 +4240 +7FE0 +4500 +B8E0 +ENDCHAR +STARTCHAR U_865F +ENCODING 34399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +9100 +F7E0 +0520 +FFC0 +4520 +F5E0 +1400 +1780 +9AA0 +64E0 +ENDCHAR +STARTCHAR U_8660 +ENCODING 34400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +FFE0 +5500 +8FC0 +5520 +55E0 +2400 +55C0 +4540 +8A60 +ENDCHAR +STARTCHAR U_8661 +ENCODING 34401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4440 +5FE0 +5540 +4D80 +4500 +7FE0 +4500 +B8E0 +ENDCHAR +STARTCHAR U_8662 +ENCODING 34402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F100 +4FE0 +B520 +57C0 +FD20 +15E0 +9400 +55C0 +1940 +6260 +ENDCHAR +STARTCHAR U_8663 +ENCODING 34403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +EC80 +0BE0 +FEA0 +2BE0 +AAA0 +BAE0 +AE00 +ABC0 +F540 +0A60 +ENDCHAR +STARTCHAR U_8664 +ENCODING 34404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38E0 +2080 +FBE0 +AAA0 +F3C0 +AAA0 +BAE0 +8200 +F3C0 +D540 +9A60 +ENDCHAR +STARTCHAR U_8665 +ENCODING 34405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A40 +23E0 +FE80 +A9A0 +F260 +AE80 +BA40 +87E0 +F280 +D1A0 +9E60 +ENDCHAR +STARTCHAR U_8666 +ENCODING 34406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +61C0 +5100 +FFE0 +5500 +27C0 +5520 +ADE0 +F400 +2DC0 +3540 +DE60 +ENDCHAR +STARTCHAR U_8667 +ENCODING 34407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1E00 +11E0 +FE00 +9200 +FFE0 +A880 +FEE0 +A820 +BE20 +A920 +BEC0 +ENDCHAR +STARTCHAR U_8668 +ENCODING 34408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1E40 +1080 +7E00 +5260 +7E40 +5480 +7E20 +5420 +BF40 +D580 +ENDCHAR +STARTCHAR U_8669 +ENCODING 34409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A8E0 +7080 +23E0 +FAA0 +8BC0 +FAA0 +8AE0 +FA00 +75C0 +AD40 +6260 +ENDCHAR +STARTCHAR U_866A +ENCODING 34410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31E0 +2B20 +FEC0 +AB20 +FBE0 +AAA0 +BBE0 +8A80 +FBE0 +D940 +9AA0 +ENDCHAR +STARTCHAR U_866B +ENCODING 34411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +4440 +4440 +7FC0 +0400 +0480 +0440 +07E0 +F820 +ENDCHAR +STARTCHAR U_866C +ENCODING 34412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FA00 +AA00 +AA00 +AA00 +FA00 +2200 +2A20 +3A20 +C5E0 +ENDCHAR +STARTCHAR U_866D +ENCODING 34413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F920 +A920 +A920 +A920 +F920 +2120 +2A20 +3CA0 +E840 +ENDCHAR +STARTCHAR U_866E +ENCODING 34414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2280 +FA80 +AA80 +AA80 +AA80 +FA80 +2280 +2AA0 +3AA0 +EC60 +ENDCHAR +STARTCHAR U_866F +ENCODING 34415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +2220 +FA20 +AA20 +AA20 +AA20 +FAE0 +2320 +2A20 +3820 +E820 +ENDCHAR +STARTCHAR U_8670 +ENCODING 34416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F880 +A880 +A880 +A880 +F880 +2080 +2C80 +3A80 +E900 +ENDCHAR +STARTCHAR U_8671 +ENCODING 34417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +0080 +0C80 +F080 +1080 +FE80 +9280 +FEA0 +10A0 +1260 +FD20 +ENDCHAR +STARTCHAR U_8672 +ENCODING 34418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7D00 +5580 +5540 +7D60 +5140 +1500 +1D00 +F500 +0100 +ENDCHAR +STARTCHAR U_8673 +ENCODING 34419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AC20 +A820 +AA20 +F920 +2120 +2820 +3920 +E8C0 +ENDCHAR +STARTCHAR U_8674 +ENCODING 34420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2780 +F900 +A900 +A900 +A9E0 +FF00 +2100 +2920 +3920 +E8E0 +ENDCHAR +STARTCHAR U_8675 +ENCODING 34421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +2280 +FAE0 +ABA0 +AEA0 +FAA0 +22E0 +3A80 +EA20 +01E0 +ENDCHAR +STARTCHAR U_8676 +ENCODING 34422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F900 +A900 +AFE0 +F900 +2100 +2900 +3900 +C900 +0300 +ENDCHAR +STARTCHAR U_8677 +ENCODING 34423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +F880 +A880 +A880 +AFE0 +F880 +2080 +2880 +3880 +E880 +ENDCHAR +STARTCHAR U_8678 +ENCODING 34424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F880 +A900 +AFE0 +F900 +A100 +2900 +3900 +C900 +0200 +ENDCHAR +STARTCHAR U_8679 +ENCODING 34425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +F880 +A880 +A880 +A880 +F880 +2080 +2880 +3880 +EFE0 +ENDCHAR +STARTCHAR U_867A +ENCODING 34426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +57C0 +5540 +5540 +57C0 +5140 +51C0 +5620 +9020 +8FE0 +ENDCHAR +STARTCHAR U_867B +ENCODING 34427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +AA00 +AA00 +AA00 +FA00 +2200 +2A00 +3A40 +EBE0 +ENDCHAR +STARTCHAR U_867C +ENCODING 34428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +FBE0 +AC00 +ABC0 +A840 +F880 +2100 +2A20 +3A20 +E9E0 +ENDCHAR +STARTCHAR U_867D +ENCODING 34429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2480 +0400 +7FC0 +4440 +7FC0 +0400 +0440 +FFE0 +ENDCHAR +STARTCHAR U_867E +ENCODING 34430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +A900 +A980 +A940 +F920 +2100 +2900 +3900 +C500 +ENDCHAR +STARTCHAR U_867F +ENCODING 34431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0FC0 +0840 +3180 +C400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8680 +ENCODING 34432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +4D20 +9520 +27E0 +2520 +2100 +2940 +31E0 +2620 +ENDCHAR +STARTCHAR U_8681 +ENCODING 34433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +22A0 +22A0 +FA20 +AA20 +A940 +F940 +2080 +2940 +3A40 +CC20 +ENDCHAR +STARTCHAR U_8682 +ENCODING 34434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2040 +FA40 +AA40 +AA40 +ABE0 +F820 +27A0 +2820 +3920 +C8C0 +ENDCHAR +STARTCHAR U_8683 +ENCODING 34435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1080 +7F00 +0240 +3F80 +0400 +7FC0 +4440 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_8684 +ENCODING 34436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +2FE0 +FA00 +AA00 +ABC0 +FA40 +2240 +2A40 +3C40 +C8C0 +ENDCHAR +STARTCHAR U_8685 +ENCODING 34437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +2400 +FDE0 +AD20 +AD20 +FD60 +2500 +2520 +3920 +C8E0 +ENDCHAR +STARTCHAR U_8686 +ENCODING 34438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +FAA0 +AAA0 +ABE0 +AA20 +FA00 +2200 +2A20 +3A20 +E9E0 +ENDCHAR +STARTCHAR U_8687 +ENCODING 34439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +2220 +FA20 +ABE0 +AAA0 +FA80 +2240 +2A40 +3C20 +C820 +ENDCHAR +STARTCHAR U_8688 +ENCODING 34440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +2000 +27C0 +2280 +FA80 +AFC0 +AA80 +FA80 +2280 +2280 +3C80 +CC80 +ENDCHAR +STARTCHAR U_8689 +ENCODING 34441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +3580 +C460 +3F80 +2480 +3F80 +0440 +7FE0 +ENDCHAR +STARTCHAR U_868A +ENCODING 34442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +AA40 +AA40 +AA40 +F940 +2080 +2980 +3A40 +EC20 +ENDCHAR +STARTCHAR U_868B +ENCODING 34443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +FBE0 +AAA0 +AAA0 +AAA0 +FB60 +2220 +2A20 +3A20 +EA60 +ENDCHAR +STARTCHAR U_868C +ENCODING 34444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2080 +F880 +ABE0 +A880 +F880 +27E0 +2080 +3880 +C880 +ENDCHAR +STARTCHAR U_868D +ENCODING 34445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FA80 +AAA0 +ABC0 +AA80 +FA80 +2280 +2AA0 +3BA0 +EA60 +ENDCHAR +STARTCHAR U_868E +ENCODING 34446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA20 +AA20 +AA20 +ABE0 +FA20 +2220 +2A20 +3BE0 +EA20 +ENDCHAR +STARTCHAR U_868F +ENCODING 34447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2220 +FA20 +ABE0 +AA20 +FBE0 +2220 +2A20 +3AA0 +CC40 +ENDCHAR +STARTCHAR U_8690 +ENCODING 34448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +A920 +A8A0 +F8E0 +2320 +2C20 +3920 +C8C0 +ENDCHAR +STARTCHAR U_8691 +ENCODING 34449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F880 +A880 +ABE0 +F940 +2140 +2880 +3940 +CE20 +ENDCHAR +STARTCHAR U_8692 +ENCODING 34450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2340 +FAC0 +AA40 +AFE0 +FA40 +2240 +2A40 +3B40 +CC80 +ENDCHAR +STARTCHAR U_8693 +ENCODING 34451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23A0 +20A0 +20A0 +FBA0 +AA20 +ABA0 +F8A0 +20A0 +28A0 +38A0 +CB20 +ENDCHAR +STARTCHAR U_8694 +ENCODING 34452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2280 +FA80 +ABE0 +AA80 +FA80 +22A0 +2AA0 +3B60 +CA20 +ENDCHAR +STARTCHAR U_8695 +ENCODING 34453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0800 +0800 +FFE0 +1480 +2440 +FFA0 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8696 +ENCODING 34454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2000 +2000 +F800 +AFE0 +AA80 +FA80 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_8697 +ENCODING 34455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +23C0 +F940 +A940 +AFE0 +F900 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_8698 +ENCODING 34456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2140 +2120 +FFE0 +A900 +A980 +F980 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_8699 +ENCODING 34457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +FD20 +A880 +A800 +FFE0 +2040 +2880 +3880 +C900 +ENDCHAR +STARTCHAR U_869A +ENCODING 34458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +23C0 +2200 +FA00 +ABE0 +AA40 +FA40 +2240 +2A40 +3A40 +CC40 +ENDCHAR +STARTCHAR U_869B +ENCODING 34459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +23E0 +FAA0 +AAA0 +AAA0 +FBE0 +2080 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_869C +ENCODING 34460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +2140 +FA40 +AFE0 +A840 +F8C0 +2140 +2A40 +3D40 +C880 +ENDCHAR +STARTCHAR U_869D +ENCODING 34461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +F9E0 +AF00 +A900 +F9E0 +2700 +2920 +3920 +C8E0 +ENDCHAR +STARTCHAR U_869E +ENCODING 34462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F900 +A900 +A980 +FB40 +2540 +2920 +3920 +C900 +ENDCHAR +STARTCHAR U_869F +ENCODING 34463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2100 +F900 +A900 +AFC0 +F900 +2500 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_86A0 +ENCODING 34464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +3F40 +C920 +1300 +2400 +7FC0 +4440 +7FC0 +0400 +7FC0 +ENDCHAR +STARTCHAR U_86A1 +ENCODING 34465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2240 +FC20 +A800 +ABE0 +F920 +2120 +2920 +3AA0 +CC40 +ENDCHAR +STARTCHAR U_86A2 +ENCODING 34466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F800 +AB80 +AA80 +FA80 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86A3 +ENCODING 34467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2280 +2240 +FA40 +AC20 +A900 +F900 +2200 +2A40 +3CE0 +CB20 +ENDCHAR +STARTCHAR U_86A4 +ENCODING 34468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2880 +1500 +0E00 +3180 +C460 +3FC0 +2440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_86A5 +ENCODING 34469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2220 +2220 +FC00 +A940 +A940 +F940 +2140 +2880 +3940 +CA20 +ENDCHAR +STARTCHAR U_86A6 +ENCODING 34470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FFE0 +AA40 +AA40 +FFE0 +2240 +2A40 +3A40 +CAC0 +ENDCHAR +STARTCHAR U_86A7 +ENCODING 34471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +FC20 +AA40 +AA40 +FA40 +2240 +2A40 +3C40 +C840 +ENDCHAR +STARTCHAR U_86A8 +ENCODING 34472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +F900 +A900 +AFE0 +F900 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_86A9 +ENCODING 34473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0800 +FFE0 +0400 +3F80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86AA +ENCODING 34474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2240 +2140 +F940 +AA40 +A940 +F940 +20E0 +2F40 +3840 +C840 +ENDCHAR +STARTCHAR U_86AB +ENCODING 34475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2420 +FBA0 +AAA0 +AAA0 +FBA0 +2260 +2A00 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_86AC +ENCODING 34476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +2540 +FD40 +AD40 +AD40 +FDC0 +2580 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86AD +ENCODING 34477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2220 +FBE0 +AA00 +AAA0 +FAC0 +2280 +2AA0 +3AA0 +CCE0 +ENDCHAR +STARTCHAR U_86AE +ENCODING 34478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22C0 +22A0 +FA80 +AEE0 +AB80 +FA80 +22A0 +2AA0 +3A60 +CA20 +ENDCHAR +STARTCHAR U_86AF +ENCODING 34479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2200 +FA00 +ABE0 +AA40 +FA40 +2240 +2A40 +3A40 +CFE0 +ENDCHAR +STARTCHAR U_86B0 +ENCODING 34480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +23E0 +FAA0 +AAA0 +AAA0 +FBE0 +22A0 +2AA0 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86B1 +ENCODING 34481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FD00 +A900 +A9E0 +F900 +21E0 +2900 +3900 +C900 +ENDCHAR +STARTCHAR U_86B2 +ENCODING 34482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2080 +FAA0 +A9C0 +AFE0 +F880 +2080 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_86B3 +ENCODING 34483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +2280 +FA80 +ABE0 +AA80 +FA80 +22A0 +2AA0 +3B60 +CAA0 +ENDCHAR +STARTCHAR U_86B4 +ENCODING 34484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +2480 +FFE0 +AAA0 +AAA0 +FCA0 +27A0 +2920 +3A20 +CCC0 +ENDCHAR +STARTCHAR U_86B5 +ENCODING 34485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2040 +FBC0 +AAC0 +AAC0 +FBC0 +2240 +2840 +3940 +C880 +ENDCHAR +STARTCHAR U_86B6 +ENCODING 34486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +2240 +FFE0 +AA40 +AA40 +FBC0 +2240 +2A40 +3BC0 +CA40 +ENDCHAR +STARTCHAR U_86B7 +ENCODING 34487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +2200 +FBC0 +AA40 +AA40 +FBC0 +2240 +2A00 +3A00 +CBE0 +ENDCHAR +STARTCHAR U_86B8 +ENCODING 34488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +23C0 +2200 +FBE0 +AA80 +AA80 +FB80 +22E0 +2AA0 +3C80 +C880 +ENDCHAR +STARTCHAR U_86B9 +ENCODING 34489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2240 +2240 +FDE0 +AC40 +AE40 +FD40 +2540 +2C40 +3D40 +CC80 +ENDCHAR +STARTCHAR U_86BA +ENCODING 34490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27C0 +FD40 +AD40 +AFC0 +FD40 +27E0 +2C40 +3C40 +CCC0 +ENDCHAR +STARTCHAR U_86BB +ENCODING 34491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +1100 +3920 +54E0 +9400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86BC +ENCODING 34492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +23E0 +FC20 +ABA0 +AAA0 +FAA0 +23A0 +2820 +3920 +C8C0 +ENDCHAR +STARTCHAR U_86BD +ENCODING 34493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +F980 +AAC0 +ACA0 +F8A0 +2080 +2880 +3800 +CFE0 +ENDCHAR +STARTCHAR U_86BE +ENCODING 34494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +23E0 +FAA0 +AA80 +ABE0 +FAA0 +22A0 +2A40 +3CA0 +C920 +ENDCHAR +STARTCHAR U_86BF +ENCODING 34495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F900 +AA40 +AFC0 +F880 +2100 +2A40 +3FE0 +CA20 +ENDCHAR +STARTCHAR U_86C0 +ENCODING 34496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +27E0 +F900 +A900 +A900 +FFC0 +2100 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_86C1 +ENCODING 34497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +2120 +F920 +AAE0 +AC40 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86C2 +ENCODING 34498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2220 +27E0 +FA00 +ABC0 +AA40 +FB40 +2280 +2C80 +3940 +CA20 +ENDCHAR +STARTCHAR U_86C3 +ENCODING 34499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2080 +FBE0 +AAA0 +AAA0 +FB60 +2220 +2A20 +3A20 +CA60 +ENDCHAR +STARTCHAR U_86C4 +ENCODING 34500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F880 +A880 +ABE0 +FA20 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86C5 +ENCODING 34501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +20E0 +F880 +A880 +ABE0 +FA20 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86C6 +ENCODING 34502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FA40 +ABC0 +AA40 +FA40 +23C0 +2A40 +3A40 +CFE0 +ENDCHAR +STARTCHAR U_86C7 +ENCODING 34503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FC20 +AA00 +AA40 +FB80 +2200 +2A20 +3A20 +C9E0 +ENDCHAR +STARTCHAR U_86C8 +ENCODING 34504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2500 +27C0 +F900 +A900 +AFE0 +F900 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_86C9 +ENCODING 34505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F920 +A880 +AFE0 +F840 +2280 +2900 +3880 +C880 +ENDCHAR +STARTCHAR U_86CA +ENCODING 34506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +0480 +FFE0 +0020 +7FC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_86CB +ENCODING 34507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0440 +2780 +3400 +4FE0 +8400 +3FC0 +2440 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_86CC +ENCODING 34508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +23E0 +22A0 +FAA0 +AAA0 +AAA0 +FAA0 +22A0 +2AA0 +3CE0 +C8A0 +ENDCHAR +STARTCHAR U_86CD +ENCODING 34509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +1240 +1280 +7FE0 +8440 +3F80 +2480 +3F80 +0440 +07C0 +7840 +ENDCHAR +STARTCHAR U_86CE +ENCODING 34510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2200 +23E0 +FA80 +AA80 +AAE0 +FAA0 +22A0 +2AA0 +3D20 +CAC0 +ENDCHAR +STARTCHAR U_86CF +ENCODING 34511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2220 +2140 +F880 +A940 +AE20 +F880 +23E0 +2880 +3880 +CFE0 +ENDCHAR +STARTCHAR U_86D0 +ENCODING 34512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +AAA0 +AAA0 +AFE0 +FAA0 +2AA0 +2AA0 +3FE0 +E820 +ENDCHAR +STARTCHAR U_86D1 +ENCODING 34513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2240 +27A0 +F820 +AA80 +AFE0 +F880 +27E0 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_86D2 +ENCODING 34514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +2520 +F940 +A880 +A940 +FE20 +23E0 +2A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_86D3 +ENCODING 34515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +FD40 +2100 +FFE0 +2100 +F920 +A940 +F980 +28A0 +3560 +C220 +ENDCHAR +STARTCHAR U_86D4 +ENCODING 34516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +23A0 +FAA0 +AAA0 +AAA0 +FBA0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86D5 +ENCODING 34517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FA00 +AFE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_86D6 +ENCODING 34518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +27E0 +FA40 +ABA0 +AB40 +FDA0 +2540 +2DA0 +3920 +C8E0 +ENDCHAR +STARTCHAR U_86D7 +ENCODING 34519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3FC0 +2040 +3FC0 +2440 +2440 +3FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_86D8 +ENCODING 34520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +23E0 +F880 +A880 +ABE0 +F880 +2080 +2FE0 +3880 +C880 +ENDCHAR +STARTCHAR U_86D9 +ENCODING 34521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +F900 +AFE0 +A800 +F900 +27C0 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_86DA +ENCODING 34522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +2420 +24A0 +FFA0 +ADA0 +ADA0 +FBA0 +21A0 +2A20 +3C20 +C8E0 +ENDCHAR +STARTCHAR U_86DB +ENCODING 34523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +23E0 +FC80 +A880 +AFE0 +F880 +21C0 +2AA0 +3CA0 +C880 +ENDCHAR +STARTCHAR U_86DC +ENCODING 34524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27C0 +2540 +FFE0 +AD40 +AD40 +FFC0 +2500 +2D00 +3E00 +CC00 +ENDCHAR +STARTCHAR U_86DD +ENCODING 34525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +2240 +FBC0 +AA40 +ABC0 +FAA0 +22C0 +2A80 +3B60 +CE20 +ENDCHAR +STARTCHAR U_86DE +ENCODING 34526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2380 +2080 +F880 +AFE0 +A880 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86DF +ENCODING 34527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +FA40 +AC20 +AA40 +FA40 +2140 +2880 +3940 +CE20 +ENDCHAR +STARTCHAR U_86E0 +ENCODING 34528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2240 +FA40 +AC40 +AA80 +FFE0 +22A0 +2AA0 +3AA0 +CD60 +ENDCHAR +STARTCHAR U_86E1 +ENCODING 34529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25A0 +FB60 +A920 +AB20 +FD60 +21A0 +2920 +3920 +CF60 +ENDCHAR +STARTCHAR U_86E2 +ENCODING 34530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +27E0 +F940 +A940 +AFE0 +F940 +2140 +2940 +3A40 +CC40 +ENDCHAR +STARTCHAR U_86E3 +ENCODING 34531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +27E0 +F880 +ABE0 +A800 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86E4 +ENCODING 34532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2180 +2240 +FC20 +ABC0 +A800 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86E5 +ENCODING 34533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2220 +2540 +F880 +A900 +ABE0 +FD20 +2220 +2940 +3880 +CF00 +ENDCHAR +STARTCHAR U_86E6 +ENCODING 34534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2080 +FBE0 +A8A0 +AFE0 +FC80 +27E0 +28A0 +3940 +CE20 +ENDCHAR +STARTCHAR U_86E7 +ENCODING 34535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +26A0 +FD20 +AD60 +AEA0 +FCA0 +2560 +2620 +3C20 +CC60 +ENDCHAR +STARTCHAR U_86E8 +ENCODING 34536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2100 +FBE0 +AA20 +AA20 +FBE0 +2220 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_86E9 +ENCODING 34537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +FC80 +2680 +25A0 +FCE0 +0400 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86EA +ENCODING 34538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +2240 +FA40 +2240 +FD40 +2880 +7F80 +4880 +7F80 +0880 +FF40 +ENDCHAR +STARTCHAR U_86EB +ENCODING 34539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2240 +FFE0 +AA00 +AAE0 +FAA0 +22E0 +2A80 +3CA0 +C8E0 +ENDCHAR +STARTCHAR U_86EC +ENCODING 34540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FE0 +1100 +FFE0 +2100 +64C0 +BFA0 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86ED +ENCODING 34541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +2200 +FA40 +AFA0 +A880 +F880 +23E0 +2880 +3880 +CFE0 +ENDCHAR +STARTCHAR U_86EE +ENCODING 34542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +3180 +5540 +8420 +3F80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86EF +ENCODING 34543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2140 +FFE0 +A880 +A900 +FA40 +2780 +2A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_86F0 +ENCODING 34544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7C0 +2140 +F340 +22C0 +6420 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_86F1 +ENCODING 34545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +AD20 +AB40 +FFE0 +2100 +2900 +3A80 +C440 +0820 +ENDCHAR +STARTCHAR U_86F2 +ENCODING 34546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27E0 +2140 +F9A0 +AA60 +AC20 +FFE0 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86F3 +ENCODING 34547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2880 +2880 +FBE0 +AAA0 +AAA0 +FAA0 +2AA0 +2AE0 +3880 +D080 +ENDCHAR +STARTCHAR U_86F4 +ENCODING 34548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +F980 +AE60 +A800 +FA40 +2240 +2A40 +3C40 +C840 +ENDCHAR +STARTCHAR U_86F5 +ENCODING 34549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +22A0 +22A0 +FD40 +AAA0 +AAA0 +F800 +27E0 +2880 +3880 +CFE0 +ENDCHAR +STARTCHAR U_86F6 +ENCODING 34550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +2780 +2520 +FAC0 +A840 +AFE0 +F840 +2240 +2940 +3840 +C9C0 +ENDCHAR +STARTCHAR U_86F7 +ENCODING 34551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2140 +27E0 +F920 +ADC0 +AB80 +F940 +2340 +2D20 +3920 +CB00 +ENDCHAR +STARTCHAR U_86F8 +ENCODING 34552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +22C0 +2080 +FBE0 +AA20 +ABE0 +FA20 +23E0 +2A20 +3A20 +CA60 +ENDCHAR +STARTCHAR U_86F9 +ENCODING 34553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +23E0 +FAA0 +ABE0 +AAA0 +FAA0 +23E0 +2AA0 +3AA0 +CAE0 +ENDCHAR +STARTCHAR U_86FA +ENCODING 34554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +27E0 +F940 +AB40 +AD40 +FBA0 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_86FB +ENCODING 34555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2C40 +27E0 +FC40 +AC40 +AFC0 +FA80 +2280 +2AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_86FC +ENCODING 34556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2080 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_86FD +ENCODING 34557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2220 +FBE0 +AA20 +ABE0 +FA20 +23E0 +2940 +3A20 +CC20 +ENDCHAR +STARTCHAR U_86FE +ENCODING 34558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +26C0 +22A0 +FFE0 +AA80 +AA80 +FBA0 +26C0 +2AA0 +3B60 +CE20 +ENDCHAR +STARTCHAR U_86FF +ENCODING 34559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +F920 +AFC0 +A880 +F900 +23C0 +2A40 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_8700 +ENCODING 34560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +1000 +3FE0 +4420 +BFA0 +24A0 +3FA0 +04A0 +3F40 +ENDCHAR +STARTCHAR U_8701 +ENCODING 34561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2400 +FFE0 +A8A0 +A8C0 +FA80 +22E0 +2A80 +3D80 +C8E0 +ENDCHAR +STARTCHAR U_8702 +ENCODING 34562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2480 +FB60 +A880 +AFE0 +F880 +23E0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_8703 +ENCODING 34563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5FC0 +4000 +7FE0 +5180 +5260 +7FC0 +6240 +7FC0 +4240 +BFA0 +ENDCHAR +STARTCHAR U_8704 +ENCODING 34564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2400 +25C0 +FC00 +AFE0 +AD40 +FD40 +2560 +2D40 +39A0 +CB20 +ENDCHAR +STARTCHAR U_8705 +ENCODING 34565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +27E0 +F880 +ABE0 +AAA0 +FBE0 +22A0 +2BE0 +3AA0 +CAE0 +ENDCHAR +STARTCHAR U_8706 +ENCODING 34566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +FA40 +AA40 +ABC0 +FA40 +23C0 +29A0 +3AA0 +CCE0 +ENDCHAR +STARTCHAR U_8707 +ENCODING 34567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2200 +3FE0 +E480 +2480 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8708 +ENCODING 34568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +A800 +ABC0 +A900 +FFE0 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_8709 +ENCODING 34569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +27A0 +2520 +FAC0 +AFE0 +A840 +F880 +27E0 +2880 +3880 +C980 +ENDCHAR +STARTCHAR U_870A +ENCODING 34570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +2620 +22A0 +FAA0 +AFA0 +AAA0 +FBA0 +26A0 +2A20 +3A20 +CAE0 +ENDCHAR +STARTCHAR U_870B +ENCODING 34571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +2220 +FBE0 +AA20 +ABE0 +FA80 +22A0 +2A40 +3AA0 +CB20 +ENDCHAR +STARTCHAR U_870C +ENCODING 34572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +27C0 +F4A0 +94A0 +9660 +F100 +27C0 +2900 +3900 +CFE0 +ENDCHAR +STARTCHAR U_870D +ENCODING 34573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +FBE0 +A900 +AFE0 +F900 +2380 +2540 +3920 +C900 +ENDCHAR +STARTCHAR U_870E +ENCODING 34574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +23E0 +F800 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_870F +ENCODING 34575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +2100 +FFE0 +AB80 +AD40 +FBA0 +2280 +2AE0 +3A20 +CC60 +ENDCHAR +STARTCHAR U_8710 +ENCODING 34576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2780 +2280 +FBE0 +AAA0 +AFA0 +FAA0 +24A0 +27A0 +38A0 +C960 +ENDCHAR +STARTCHAR U_8711 +ENCODING 34577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +2100 +45E0 +A500 +5FE0 +8400 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8712 +ENCODING 34578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +26C0 +2240 +FA40 +AF60 +AB40 +FB40 +2540 +2DE0 +3A00 +C9E0 +ENDCHAR +STARTCHAR U_8713 +ENCODING 34579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +21C0 +F940 +AA40 +ABE0 +F940 +2540 +2A40 +3AE0 +C500 +08E0 +ENDCHAR +STARTCHAR U_8714 +ENCODING 34580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2420 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +2820 +38A0 +C840 +ENDCHAR +STARTCHAR U_8715 +ENCODING 34581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +27E0 +FC20 +AC20 +AFE0 +FA80 +2280 +2AA0 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_8716 +ENCODING 34582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2AA0 +FAA0 +ABA0 +AAA0 +FAA0 +2BA0 +2AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_8717 +ENCODING 34583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +2220 +FBE0 +A880 +ABE0 +FAA0 +22A0 +2B60 +3A20 +CA60 +ENDCHAR +STARTCHAR U_8718 +ENCODING 34584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +FAA0 +AAA0 +AAA0 +FFA0 +22A0 +2AA0 +3BE0 +CCA0 +ENDCHAR +STARTCHAR U_8719 +ENCODING 34585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +22C0 +27A0 +FA20 +AB40 +AE40 +FA40 +2240 +2AA0 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_871A +ENCODING 34586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +1200 +F3C0 +1200 +F3E0 +1600 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_871B +ENCODING 34587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +23E0 +FA80 +ABE0 +AA80 +FA80 +23E0 +2D20 +3920 +C9E0 +ENDCHAR +STARTCHAR U_871C +ENCODING 34588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +5540 +9F20 +6400 +BF80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_871D +ENCODING 34589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1900 +1500 +FFE0 +2480 +7FC0 +A4A0 +3F80 +0480 +7FC0 +ENDCHAR +STARTCHAR U_871E +ENCODING 34590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +FBC0 +AA40 +ABC0 +FA40 +27E0 +2940 +3A20 +CC20 +ENDCHAR +STARTCHAR U_871F +ENCODING 34591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FFE0 +A800 +ABC0 +FA40 +23C0 +2A40 +3BC0 +CA40 +ENDCHAR +STARTCHAR U_8720 +ENCODING 34592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2460 +27A0 +FCA0 +AFE0 +ACA0 +FDE0 +26A0 +2CA0 +3FE0 +CC20 +ENDCHAR +STARTCHAR U_8721 +ENCODING 34593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +FA40 +AFE0 +A800 +FBE0 +2220 +2BE0 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8722 +ENCODING 34594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2080 +FFE0 +A880 +A880 +FFE0 +2560 +2D60 +3D60 +CFE0 +ENDCHAR +STARTCHAR U_8723 +ENCODING 34595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +27E0 +F880 +ABE0 +A880 +FFE0 +2180 +2980 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_8724 +ENCODING 34596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE00 +23E0 +7240 +AC40 +0400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8725 +ENCODING 34597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +22C0 +2280 +FF80 +AAE0 +ABA0 +FEA0 +22A0 +2AA0 +3B20 +CA20 +ENDCHAR +STARTCHAR U_8726 +ENCODING 34598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +2240 +FC20 +ABC0 +A800 +AFE0 +FAA0 +2AA0 +2FE0 +3AA0 +E860 +ENDCHAR +STARTCHAR U_8727 +ENCODING 34599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2220 +FBE0 +AAC0 +AAA0 +FBE0 +2280 +2C80 +3940 +CA20 +ENDCHAR +STARTCHAR U_8728 +ENCODING 34600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2140 +FFE0 +A940 +AFC0 +F900 +25E0 +2D00 +3B00 +C9E0 +ENDCHAR +STARTCHAR U_8729 +ENCODING 34601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2520 +27E0 +FD20 +AFE0 +AC20 +FDE0 +2560 +2DE0 +3C20 +C8E0 +ENDCHAR +STARTCHAR U_872A +ENCODING 34602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2620 +FBA0 +A920 +AFE0 +F920 +2560 +2FE0 +3820 +C8C0 +ENDCHAR +STARTCHAR U_872B +ENCODING 34603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +AFC0 +AC80 +FCA0 +27C0 +2480 +3EA0 +C4E0 +ENDCHAR +STARTCHAR U_872C +ENCODING 34604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2040 +2080 +FCA0 +AEE0 +ADA0 +FDA0 +26E0 +2CA0 +3D20 +CFE0 +ENDCHAR +STARTCHAR U_872D +ENCODING 34605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +21E0 +2240 +FC80 +A960 +AE20 +FC20 +2760 +2C20 +3FE0 +CC20 +ENDCHAR +STARTCHAR U_872E +ENCODING 34606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +27E0 +F880 +ABA0 +AAA0 +FBA0 +2040 +2FE0 +38A0 +C920 +ENDCHAR +STARTCHAR U_872F +ENCODING 34607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFE0 +AA00 +AFE0 +F940 +23A0 +2900 +3FE0 +C900 +ENDCHAR +STARTCHAR U_8730 +ENCODING 34608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +7BE0 +4A20 +7BE0 +9400 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8731 +ENCODING 34609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2520 +FFE0 +AD20 +AFE0 +FA80 +27E0 +2880 +3880 +C880 +ENDCHAR +STARTCHAR U_8732 +ENCODING 34610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +2380 +2100 +FFE0 +AB40 +AD20 +FFE0 +2240 +2B80 +3940 +CE20 +ENDCHAR +STARTCHAR U_8733 +ENCODING 34611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FBC0 +A800 +ABC0 +F840 +2080 +2FE0 +3880 +C980 +ENDCHAR +STARTCHAR U_8734 +ENCODING 34612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +AFC0 +AA00 +FFE0 +22A0 +2CA0 +3920 +CAC0 +ENDCHAR +STARTCHAR U_8735 +ENCODING 34613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +2AA0 +2AA0 +FEE0 +A820 +AFE0 +F820 +2EE0 +2AA0 +3AA0 +D2A0 +ENDCHAR +STARTCHAR U_8736 +ENCODING 34614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FA40 +AEA0 +A900 +F900 +27E0 +2900 +3900 +C900 +ENDCHAR +STARTCHAR U_8737 +ENCODING 34615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +FFE0 +A900 +AFE0 +AA40 +FFA0 +2280 +2BA0 +3A20 +E9E0 +ENDCHAR +STARTCHAR U_8738 +ENCODING 34616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5140 +7D40 +4480 +7F40 +5420 +7F80 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8739 +ENCODING 34617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2240 +F880 +AFE0 +FCA0 +24A0 +2560 +3E20 +CCA0 +0440 +ENDCHAR +STARTCHAR U_873A +ENCODING 34618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26E0 +2420 +FF60 +AC20 +AFE0 +FA80 +2280 +2AA0 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_873B +ENCODING 34619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27C0 +F900 +AFE0 +AA40 +FBC0 +2240 +2BC0 +3A40 +CAC0 +ENDCHAR +STARTCHAR U_873C +ENCODING 34620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +23E0 +FE80 +ABE0 +AA80 +FA80 +23E0 +2A80 +3A80 +CBE0 +ENDCHAR +STARTCHAR U_873D +ENCODING 34621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2100 +FFE0 +A920 +FDA0 +2DA0 +2B60 +3920 +D920 +0960 +ENDCHAR +STARTCHAR U_873E +ENCODING 34622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +23E0 +FAA0 +ABE0 +A880 +FFE0 +2080 +29C0 +3AA0 +CCA0 +ENDCHAR +STARTCHAR U_873F +ENCODING 34623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +FAE0 +ABA0 +ACA0 +FAA0 +21E0 +2A80 +3CA0 +C8E0 +ENDCHAR +STARTCHAR U_8740 +ENCODING 34624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFC0 +AD40 +AFC0 +FD40 +27C0 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_8741 +ENCODING 34625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +2480 +3F80 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8742 +ENCODING 34626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +2AC0 +FA80 +AFE0 +A8A0 +AFA0 +FAA0 +2AA0 +2B40 +3AA0 +E920 +ENDCHAR +STARTCHAR U_8743 +ENCODING 34627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25A0 +FA40 +ADA0 +AFE0 +FAA0 +26A0 +2A40 +3DA0 +C8A0 +ENDCHAR +STARTCHAR U_8744 +ENCODING 34628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +FAA0 +AFE0 +A920 +FFE0 +2A20 +2BA0 +3820 +C8A0 +0840 +ENDCHAR +STARTCHAR U_8745 +ENCODING 34629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +1080 +FFE0 +2940 +4620 +BF80 +2480 +3F80 +0480 +07C0 +7840 +ENDCHAR +STARTCHAR U_8746 +ENCODING 34630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2560 +FD40 +A900 +AFC0 +F900 +27E0 +2900 +3900 +C900 +ENDCHAR +STARTCHAR U_8747 +ENCODING 34631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +F900 +AFE0 +AD20 +FFE0 +2520 +2FE0 +3920 +C9E0 +ENDCHAR +STARTCHAR U_8748 +ENCODING 34632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +F520 +97E0 +9520 +F5A0 +27E0 +2420 +37E0 +D420 +ENDCHAR +STARTCHAR U_8749 +ENCODING 34633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2140 +23E0 +FAA0 +ABE0 +AAA0 +FBE0 +2080 +2FE0 +3880 +C880 +ENDCHAR +STARTCHAR U_874A +ENCODING 34634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +F800 +AFC0 +A900 +FD00 +25E0 +2D00 +3B00 +C9E0 +ENDCHAR +STARTCHAR U_874B +ENCODING 34635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2540 +2580 +FFC0 +AA40 +AFC0 +FA40 +2FC0 +3A60 +CA60 +1220 +ENDCHAR +STARTCHAR U_874C +ENCODING 34636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +2640 +22C0 +FF40 +AA40 +ABC0 +FE40 +2260 +2BC0 +3A40 +CA40 +ENDCHAR +STARTCHAR U_874D +ENCODING 34637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +2AA0 +FEA0 +AAA0 +AEA0 +F8A0 +2AA0 +2EE0 +3A80 +C080 +ENDCHAR +STARTCHAR U_874E +ENCODING 34638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +FA40 +ABC0 +AA00 +FFE0 +22A0 +2B60 +3BA0 +C840 +ENDCHAR +STARTCHAR U_874F +ENCODING 34639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FBC0 +A800 +AFE0 +FC20 +23C0 +2880 +3A80 +C900 +ENDCHAR +STARTCHAR U_8750 +ENCODING 34640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +25A0 +FC20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8751 +ENCODING 34641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25C0 +FB00 +AFE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +CA60 +ENDCHAR +STARTCHAR U_8752 +ENCODING 34642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +2100 +FFE0 +AAA0 +ABA0 +FAA0 +23A0 +2AA0 +3FE0 +C820 +ENDCHAR +STARTCHAR U_8753 +ENCODING 34643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2440 +FBA0 +A800 +AEA0 +FAA0 +2EA0 +2AA0 +3E20 +CAE0 +ENDCHAR +STARTCHAR U_8754 +ENCODING 34644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +24A0 +27C0 +FCA0 +AFE0 +A900 +FBE0 +2220 +2BE0 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8755 +ENCODING 34645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +ABE0 +7AA0 +4AA0 +7AA0 +4BE0 +7880 +50A0 +78E0 +CBA0 +ENDCHAR +STARTCHAR U_8756 +ENCODING 34646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +F800 +AFE0 +AA40 +FBC0 +2240 +2BC0 +3800 +CFE0 +ENDCHAR +STARTCHAR U_8757 +ENCODING 34647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +2220 +FBE0 +AA20 +AFE0 +F880 +2080 +2BE0 +3880 +CFE0 +ENDCHAR +STARTCHAR U_8758 +ENCODING 34648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2540 +25C0 +FD40 +ADC0 +AC80 +FFE0 +2540 +2C80 +3D40 +CFE0 +ENDCHAR +STARTCHAR U_8759 +ENCODING 34649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F820 +AFE0 +A800 +AFE0 +FAA0 +AFE0 +2AA0 +3AA0 +E860 +ENDCHAR +STARTCHAR U_875A +ENCODING 34650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2140 +2080 +FFE0 +A9A0 +AE80 +F900 +27E0 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_875B +ENCODING 34651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +2FE0 +F880 +AF80 +AAA0 +FFA0 +2AC0 +2940 +3AA0 +D520 +ENDCHAR +STARTCHAR U_875C +ENCODING 34652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2240 +27E0 +FA20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3940 +CE20 +ENDCHAR +STARTCHAR U_875D +ENCODING 34653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +F880 +AFE0 +AAA0 +FDC0 +2280 +2DC0 +3AA0 +CDA0 +ENDCHAR +STARTCHAR U_875E +ENCODING 34654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2920 +FFE0 +A800 +ABE0 +AA20 +FBE0 +2A20 +2BE0 +3A20 +EBE0 +ENDCHAR +STARTCHAR U_875F +ENCODING 34655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FFE0 +ACA0 +AFE0 +AA20 +FBE0 +2220 +2BE0 +3A20 +EAE0 +ENDCHAR +STARTCHAR U_8760 +ENCODING 34656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +23E0 +FA20 +ABE0 +A800 +FBE0 +22A0 +2BE0 +3AA0 +CBE0 +ENDCHAR +STARTCHAR U_8761 +ENCODING 34657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FFE0 +AAA0 +AAA0 +AAA0 +F900 +27E0 +2900 +3A80 +EC60 +ENDCHAR +STARTCHAR U_8762 +ENCODING 34658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +23E0 +FA20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3940 +CE20 +ENDCHAR +STARTCHAR U_8763 +ENCODING 34659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +22E0 +FF00 +AAE0 +AF20 +AD40 +FDE0 +2540 +2D40 +3940 +EAC0 +ENDCHAR +STARTCHAR U_8764 +ENCODING 34660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +FFE0 +AA80 +AFE0 +ADA0 +FEE0 +2420 +2FE0 +3C20 +EFE0 +ENDCHAR +STARTCHAR U_8765 +ENCODING 34661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +FD40 +6980 +AE60 +6400 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8766 +ENCODING 34662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2A20 +FA20 +AEE0 +A800 +AFE0 +F8A0 +2EA0 +2840 +38A0 +E920 +ENDCHAR +STARTCHAR U_8767 +ENCODING 34663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +F900 +AFC0 +AD40 +FFE0 +2100 +2A80 +3C40 +C820 +ENDCHAR +STARTCHAR U_8768 +ENCODING 34664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0880 +0880 +7EA0 +0860 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_8769 +ENCODING 34665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2080 +27E0 +FAA0 +ABE0 +AAA0 +FBE0 +2080 +2BE0 +3880 +CFE0 +ENDCHAR +STARTCHAR U_876A +ENCODING 34666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +27C0 +FC40 +AFE0 +AA00 +FFE0 +22A0 +2AA0 +3D20 +CAC0 +ENDCHAR +STARTCHAR U_876B +ENCODING 34667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27A0 +2140 +FFE0 +A900 +ABE0 +FE20 +23E0 +2A20 +3BE0 +CA20 +ENDCHAR +STARTCHAR U_876C +ENCODING 34668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26A0 +2520 +26A0 +FFE0 +AA40 +AD20 +FBC0 +2640 +2980 +3A40 +CC20 +ENDCHAR +STARTCHAR U_876D +ENCODING 34669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +23C0 +FA40 +ABC0 +A800 +FFE0 +2280 +2AE0 +3D80 +C8E0 +ENDCHAR +STARTCHAR U_876E +ENCODING 34670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2620 +FBE0 +AA20 +ABE0 +F900 +23E0 +2E40 +3980 +CE60 +ENDCHAR +STARTCHAR U_876F +ENCODING 34671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +22C0 +FFE0 +A900 +AFE0 +F920 +21A0 +2A40 +3CA0 +CB20 +ENDCHAR +STARTCHAR U_8770 +ENCODING 34672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FD20 +ABC0 +A900 +FFE0 +2100 +2BC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_8771 +ENCODING 34673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +1080 +7FE0 +56A0 +7FE0 +1080 +1CE0 +E720 +ENDCHAR +STARTCHAR U_8772 +ENCODING 34674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +2FA0 +FAA0 +AFA0 +AAA0 +FFA0 +22A0 +2720 +3AA0 +CA20 +0260 +ENDCHAR +STARTCHAR U_8773 +ENCODING 34675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FBC0 +A900 +AFE0 +FAA0 +27E0 +2AA0 +3BE0 +C840 +ENDCHAR +STARTCHAR U_8774 +ENCODING 34676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +24A0 +2FA0 +F4E0 +AEA0 +AAA0 +FAE0 +2AA0 +2EA0 +3920 +CA60 +ENDCHAR +STARTCHAR U_8775 +ENCODING 34677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +2540 +FD80 +3580 +6A40 +A420 +3FC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8776 +ENCODING 34678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2540 +FDC0 +AC00 +AFE0 +F900 +27E0 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_8777 +ENCODING 34679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2FE0 +FA20 +A940 +ABE0 +A880 +FAA0 +22A0 +2BE0 +3900 +EE00 +ENDCHAR +STARTCHAR U_8778 +ENCODING 34680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FF40 +AD40 +AFE0 +A820 +FBA0 +2AA0 +2BA0 +3820 +E8E0 +ENDCHAR +STARTCHAR U_8779 +ENCODING 34681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +ABC0 +A800 +FFC0 +2540 +2D40 +3D40 +EFE0 +ENDCHAR +STARTCHAR U_877A +ENCODING 34682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +23E0 +FAA0 +ABE0 +A880 +FFE0 +24A0 +2FE0 +3C20 +CC60 +ENDCHAR +STARTCHAR U_877B +ENCODING 34683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +FFE0 +AAA0 +A920 +FFE0 +2920 +2FE0 +3920 +C960 +ENDCHAR +STARTCHAR U_877C +ENCODING 34684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +2100 +FFE0 +AB40 +AD20 +F900 +27E0 +2A40 +3980 +CE60 +ENDCHAR +STARTCHAR U_877D +ENCODING 34685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27E0 +FA00 +AFE0 +AC40 +FBE0 +2240 +2BC0 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_877E +ENCODING 34686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +2240 +FFE0 +AC20 +A900 +FFE0 +2100 +2B80 +3D40 +C920 +ENDCHAR +STARTCHAR U_877F +ENCODING 34687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +27C0 +FD40 +AFE0 +A920 +FFE0 +2920 +2FE0 +3920 +C8E0 +ENDCHAR +STARTCHAR U_8780 +ENCODING 34688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93C0 +5680 +1980 +3FE0 +D480 +1280 +3F80 +2480 +3F80 +0440 +7FC0 +ENDCHAR +STARTCHAR U_8781 +ENCODING 34689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2520 +FBE0 +A920 +ADE0 +AD40 +FD60 +2540 +2DA0 +3C00 +EBE0 +ENDCHAR +STARTCHAR U_8782 +ENCODING 34690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +24E0 +FEA0 +AAA0 +AEC0 +AAA0 +FEA0 +28A0 +2AE0 +3E80 +E980 +ENDCHAR +STARTCHAR U_8783 +ENCODING 34691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA80 +AFE0 +ACA0 +AFE0 +FA00 +23E0 +2A20 +3C20 +E8C0 +ENDCHAR +STARTCHAR U_8784 +ENCODING 34692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2480 +FE80 +ABE0 +AEA0 +AAA0 +FEA0 +2AA0 +2AE0 +3E80 +E880 +ENDCHAR +STARTCHAR U_8785 +ENCODING 34693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23E0 +2220 +FBE0 +AA20 +ABE0 +FA20 +23E0 +2B40 +3D20 +C9C0 +ENDCHAR +STARTCHAR U_8786 +ENCODING 34694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +FA40 +AA40 +ADA0 +FEC0 +2440 +2AA0 +3FE0 +C920 +ENDCHAR +STARTCHAR U_8787 +ENCODING 34695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2720 +2540 +FA40 +AF80 +A940 +FFE0 +2120 +2FE0 +3A80 +CC60 +ENDCHAR +STARTCHAR U_8788 +ENCODING 34696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +25E0 +FD20 +ADE0 +AD20 +FDE0 +2480 +29C0 +3AA0 +CDA0 +ENDCHAR +STARTCHAR U_8789 +ENCODING 34697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2520 +FA40 +AFA0 +A800 +AFE0 +F920 +25A0 +2B60 +3DA0 +EB60 +ENDCHAR +STARTCHAR U_878A +ENCODING 34698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +2280 +FFE0 +AAA0 +AFE0 +FAA0 +27E0 +2EC0 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_878B +ENCODING 34699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +26E0 +24A0 +FEE0 +ACA0 +AFE0 +F880 +27E0 +2A40 +3980 +CE60 +ENDCHAR +STARTCHAR U_878C +ENCODING 34700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +7940 +6A60 +FFC0 +4980 +9660 +3FC0 +2480 +3F80 +0440 +7FC0 +ENDCHAR +STARTCHAR U_878D +ENCODING 34701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +0080 +7BE0 +4AA0 +7AA0 +02A0 +FFE0 +D480 +FCA0 +A4E0 +AF20 +ENDCHAR +STARTCHAR U_878E +ENCODING 34702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2000 +23C0 +FA40 +ABC0 +A800 +FFE0 +26A0 +27E0 +3D20 +C560 +ENDCHAR +STARTCHAR U_878F +ENCODING 34703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +2400 +FD00 +ADE0 +AE80 +FC80 +27E0 +2C80 +3940 +CA20 +ENDCHAR +STARTCHAR U_8790 +ENCODING 34704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +AC00 +AFE0 +FC00 +27E0 +2AA0 +3D60 +CD40 +ENDCHAR +STARTCHAR U_8791 +ENCODING 34705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FFC0 +AC40 +AFC0 +F920 +27E0 +2900 +3A80 +CC60 +ENDCHAR +STARTCHAR U_8792 +ENCODING 34706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +2220 +FC80 +8BE0 +FAA0 +8AA0 +FBE0 +2080 +F8A0 +27E0 +ENDCHAR +STARTCHAR U_8793 +ENCODING 34707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27C0 +FA00 +AFE0 +AA40 +FFA0 +2100 +2FE0 +3D40 +C920 +ENDCHAR +STARTCHAR U_8794 +ENCODING 34708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +28E0 +F880 +ABE0 +AAA0 +ABC0 +FAA0 +22E0 +2D40 +3940 +EA60 +ENDCHAR +STARTCHAR U_8795 +ENCODING 34709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FC0 +FAC0 +A940 +AAC0 +FFC0 +2900 +2DC0 +3900 +CD20 +08E0 +ENDCHAR +STARTCHAR U_8796 +ENCODING 34710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FB40 +AFE0 +AC20 +ABC0 +FA40 +23C0 +2A40 +3BC0 +EA40 +ENDCHAR +STARTCHAR U_8797 +ENCODING 34711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2480 +F7E0 +94A0 +97E0 +F480 +27E0 +2A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_8798 +ENCODING 34712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +27E0 +2000 +FFE0 +A800 +ABE0 +FA20 +23E0 +2940 +3880 +CFE0 +ENDCHAR +STARTCHAR U_8799 +ENCODING 34713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0E00 +1580 +6460 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_879A +ENCODING 34714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +4A20 +FBE0 +4A40 +7B80 +4A20 +7FE0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_879B +ENCODING 34715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +FCA0 +AFE0 +A880 +FBE0 +2080 +2FE0 +3A20 +CA20 +03E0 +ENDCHAR +STARTCHAR U_879C +ENCODING 34716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2660 +FBC0 +8A40 +7180 +0660 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_879D +ENCODING 34717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +F920 +AFE0 +A920 +FFE0 +2340 +2BA0 +3D60 +C920 +11E0 +ENDCHAR +STARTCHAR U_879E +ENCODING 34718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2280 +FBE0 +AA80 +ABE0 +FA80 +23E0 +2820 +3AA0 +CAA0 +0060 +ENDCHAR +STARTCHAR U_879F +ENCODING 34719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +FBC0 +AA40 +ABC0 +FA40 +23C0 +2900 +3FE0 +CA40 +0420 +ENDCHAR +STARTCHAR U_87A0 +ENCODING 34720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2280 +2FE0 +FA80 +AC40 +A820 +FFC0 +2540 +3D40 +E540 +0FE0 +ENDCHAR +STARTCHAR U_87A1 +ENCODING 34721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0E00 +F1E0 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FBE0 +ENDCHAR +STARTCHAR U_87A2 +ENCODING 34722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +59C0 +9140 +2A20 +FFE0 +8420 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87A3 +ENCODING 34723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA40 +A680 +BFE0 +E400 +BFE0 +AA40 +FFA0 +AA80 +AF80 +A240 +BFE0 +ENDCHAR +STARTCHAR U_87A4 +ENCODING 34724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +53E0 +22A0 +53E0 +AAA0 +FBE0 +A880 +F940 +2A20 +F420 +ENDCHAR +STARTCHAR U_87A5 +ENCODING 34725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2540 +FFE0 +A540 +A540 +FFC0 +2400 +27C0 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_87A6 +ENCODING 34726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2100 +FFC0 +A900 +AFE0 +FA40 +2780 +2D60 +3D40 +CB20 +ENDCHAR +STARTCHAR U_87A7 +ENCODING 34727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +27C0 +F940 +AFE0 +AA00 +FFC0 +2220 +2BE0 +3A40 +CA40 +03C0 +ENDCHAR +STARTCHAR U_87A8 +ENCODING 34728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +2280 +FFE0 +AA80 +AFE0 +FAA0 +2BA0 +2CE0 +3920 +C860 +ENDCHAR +STARTCHAR U_87A9 +ENCODING 34729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +25E0 +2B40 +FA80 +AB60 +AA80 +FBE0 +2A80 +3BC0 +6AA0 +8880 +ENDCHAR +STARTCHAR U_87AA +ENCODING 34730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FC40 +AA80 +AFE0 +AAA0 +FC60 +2BA0 +2AA0 +3BA0 +E860 +ENDCHAR +STARTCHAR U_87AB +ENCODING 34731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1140 +FE80 +6D40 +AA20 +7FC0 +2440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_87AC +ENCODING 34732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2280 +FFE0 +AAA0 +AFE0 +AAA0 +FFE0 +2240 +2BC0 +3A40 +EBC0 +ENDCHAR +STARTCHAR U_87AD +ENCODING 34733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +A920 +AAA0 +AFE0 +F900 +AFE0 +2AA0 +3BA0 +E860 +ENDCHAR +STARTCHAR U_87AE +ENCODING 34734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +A800 +FFE0 +2920 +27C0 +3540 +CDC0 +0100 +ENDCHAR +STARTCHAR U_87AF +ENCODING 34735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +2540 +4A20 +BFC0 +2440 +3FC0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_87B0 +ENCODING 34736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA80 +AFE0 +AAA0 +AFE0 +FA80 +2AA0 +2BC0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_87B1 +ENCODING 34737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +47E0 +7D40 +5440 +D2C0 +0400 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87B2 +ENCODING 34738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2AA0 +F440 +AFE0 +A240 +FFA0 +2100 +2FC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_87B3 +ENCODING 34739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2340 +27E0 +FC20 +ABC0 +AA40 +FBC0 +2100 +2BC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_87B4 +ENCODING 34740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +C540 +A7C0 +E540 +8920 +BFE0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_87B5 +ENCODING 34741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +2FE0 +FAA0 +AFE0 +A800 +FBC0 +2000 +2FE0 +3D40 +CB20 +ENDCHAR +STARTCHAR U_87B6 +ENCODING 34742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +7F80 +4080 +7F80 +4000 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87B7 +ENCODING 34743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +5240 +5FC0 +4900 +7FE0 +5240 +5FC0 +8240 +BFE0 +ENDCHAR +STARTCHAR U_87B8 +ENCODING 34744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +B5E0 +4AA0 +FC80 +4940 +4A20 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87B9 +ENCODING 34745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +2F80 +F280 +AFE0 +AAA0 +AFA0 +FAA0 +2FA0 +2AA0 +3FA0 +EB20 +ENDCHAR +STARTCHAR U_87BA +ENCODING 34746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +27E0 +FCA0 +AFE0 +A940 +FF80 +2120 +2FE0 +3AC0 +CDA0 +ENDCHAR +STARTCHAR U_87BB +ENCODING 34747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +23E0 +26A0 +FBE0 +AAA0 +AFE0 +FCA0 +27E0 +2A40 +3980 +CE60 +ENDCHAR +STARTCHAR U_87BC +ENCODING 34748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2280 +F900 +AFC0 +AD40 +FFE0 +2100 +2FC0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_87BD +ENCODING 34749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +7900 +0F00 +F2E0 +0900 +2480 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87BE +ENCODING 34750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2420 +FFE0 +A880 +ABE0 +FAA0 +23E0 +2AA0 +3BE0 +CC20 +ENDCHAR +STARTCHAR U_87BF +ENCODING 34751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +7A80 +1480 +FFE0 +5480 +9280 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_87C0 +ENCODING 34752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2120 +FEC0 +AB00 +ACC0 +FBA0 +2100 +2FE0 +3900 +C900 +ENDCHAR +STARTCHAR U_87C1 +ENCODING 34753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +7FE0 +4200 +71C0 +2080 +FBE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_87C2 +ENCODING 34754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +2440 +FFC0 +AC40 +AFE0 +F920 +27E0 +2BA0 +3540 +C920 +ENDCHAR +STARTCHAR U_87C3 +ENCODING 34755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +AA40 +AFE0 +AAA0 +FFE0 +2440 +2A80 +3900 +EEE0 +ENDCHAR +STARTCHAR U_87C4 +ENCODING 34756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +FD40 +5340 +FAE0 +2420 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87C5 +ENCODING 34757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +AFE0 +AA40 +AA40 +FBC0 +2800 +2D40 +3AA0 +EAA0 +ENDCHAR +STARTCHAR U_87C6 +ENCODING 34758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2280 +FBC0 +AA40 +ABC0 +FA40 +27E0 +2980 +3A40 +CC20 +ENDCHAR +STARTCHAR U_87C7 +ENCODING 34759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2A80 +2480 +FFE0 +1500 +3FC0 +E4A0 +3F80 +0440 +7FE0 +ENDCHAR +STARTCHAR U_87C8 +ENCODING 34760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2960 +FFE0 +A8A0 +AEA0 +AAE0 +FEA0 +28A0 +2F60 +38A0 +EFE0 +ENDCHAR +STARTCHAR U_87C9 +ENCODING 34761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +25A0 +FB60 +ADA0 +AB80 +FD60 +2280 +2920 +3840 +CF80 +ENDCHAR +STARTCHAR U_87CA +ENCODING 34762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0500 +FFE0 +0A40 +7280 +2680 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87CB +ENCODING 34763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2720 +2520 +FB40 +AFE0 +AB40 +FD20 +2340 +2EA0 +3A60 +C9C0 +ENDCHAR +STARTCHAR U_87CC +ENCODING 34764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F920 +AAE0 +ADA0 +AAA0 +FFE0 +2340 +2AA0 +3E60 +E9C0 +ENDCHAR +STARTCHAR U_87CD +ENCODING 34765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2720 +2220 +27A0 +FB20 +AEA0 +AA60 +F900 +27E0 +2B80 +3540 +C920 +ENDCHAR +STARTCHAR U_87CE +ENCODING 34766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +27E0 +2440 +FFC0 +A900 +AFE0 +F920 +25A0 +2B60 +3DA0 +C960 +ENDCHAR +STARTCHAR U_87CF +ENCODING 34767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +2540 +FFC0 +A940 +AFE0 +F940 +27C0 +2940 +3FC0 +C940 +ENDCHAR +STARTCHAR U_87D0 +ENCODING 34768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +2FE0 +FAA0 +AB80 +A900 +FFC0 +2540 +2540 +3DC0 +C100 +ENDCHAR +STARTCHAR U_87D1 +ENCODING 34769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2240 +FFE0 +AA40 +ABC0 +FA40 +23C0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_87D2 +ENCODING 34770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +2280 +F940 +AFE0 +AA40 +FCA0 +2280 +2FE0 +3A80 +CC80 +ENDCHAR +STARTCHAR U_87D3 +ENCODING 34771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +ACA0 +AFE0 +AA20 +FDC0 +2280 +29C0 +3EA0 +E920 +ENDCHAR +STARTCHAR U_87D4 +ENCODING 34772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +22A0 +23E0 +FAA0 +ABE0 +A880 +FBE0 +2080 +2FE0 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_87D5 +ENCODING 34773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2BE0 +2A80 +FEE0 +AB80 +AA80 +FFC0 +2540 +2FC0 +7540 +85C0 +ENDCHAR +STARTCHAR U_87D6 +ENCODING 34774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A60 +2A80 +2F80 +FAE0 +AEA0 +AAA0 +FEA0 +2AA0 +2FA0 +7AA0 +9120 +ENDCHAR +STARTCHAR U_87D7 +ENCODING 34775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4440 +FFE0 +A4A0 +3F80 +4440 +7FC0 +0400 +7F80 +44C0 +FFA0 +ENDCHAR +STARTCHAR U_87D8 +ENCODING 34776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +22E0 +FF80 +AA40 +ABE0 +AA40 +FB40 +23C0 +2A40 +3BC0 +EC60 +ENDCHAR +STARTCHAR U_87D9 +ENCODING 34777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FC0 +F5A0 +B280 +BFE0 +B080 +FEA0 +2AC0 +2EA0 +3B60 +EE20 +ENDCHAR +STARTCHAR U_87DA +ENCODING 34778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FF20 +44C0 +7D20 +44C0 +2900 +FFC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87DB +ENCODING 34779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FA0 +FA40 +AF80 +A820 +AF40 +F980 +2700 +2D20 +3A40 +EF80 +ENDCHAR +STARTCHAR U_87DC +ENCODING 34780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2100 +FFE0 +AA40 +AE60 +ABC0 +F800 +2FE0 +2AA0 +3BA0 +E860 +ENDCHAR +STARTCHAR U_87DD +ENCODING 34781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2280 +FDE0 +AAA0 +AEE0 +AA80 +FAE0 +2080 +2FE0 +3AC0 +ECA0 +ENDCHAR +STARTCHAR U_87DE +ENCODING 34782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FDE0 +A740 +B480 +ED40 +AA20 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87DF +ENCODING 34783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FD20 +ABC0 +AE60 +ABC0 +FA40 +23C0 +2880 +3AC0 +EDA0 +ENDCHAR +STARTCHAR U_87E0 +ENCODING 34784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +27A0 +FAA0 +AFE0 +A9C0 +AAA0 +FFE0 +22A0 +2BE0 +3AA0 +EBE0 +ENDCHAR +STARTCHAR U_87E1 +ENCODING 34785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2F20 +F940 +AFC0 +A840 +FFC0 +2840 +2FE0 +3AA0 +CD20 +1060 +ENDCHAR +STARTCHAR U_87E2 +ENCODING 34786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +F900 +ABC0 +AA40 +FBC0 +2240 +2980 +3FE0 +CA40 +03C0 +ENDCHAR +STARTCHAR U_87E3 +ENCODING 34787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2BA0 +2540 +FFE0 +A940 +AFE0 +FCA0 +24C0 +2AA0 +3960 +CA20 +ENDCHAR +STARTCHAR U_87E4 +ENCODING 34788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +A880 +AEE0 +AA80 +FFE0 +2280 +2FE0 +3A80 +EC60 +ENDCHAR +STARTCHAR U_87E5 +ENCODING 34789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +2140 +FFE0 +A880 +ABE0 +FAA0 +23E0 +2AA0 +3BE0 +CE20 +ENDCHAR +STARTCHAR U_87E6 +ENCODING 34790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +2540 +FFE0 +AC40 +AFC0 +FC40 +27C0 +2C40 +3FC0 +CC60 +ENDCHAR +STARTCHAR U_87E7 +ENCODING 34791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +25E0 +2540 +FAA0 +A800 +AFE0 +F920 +27C0 +2940 +3A40 +CCC0 +ENDCHAR +STARTCHAR U_87E8 +ENCODING 34792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +FDE0 +D6A0 +FC80 +9140 +BFA0 +A480 +BF80 +8440 +FFE0 +ENDCHAR +STARTCHAR U_87E9 +ENCODING 34793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2840 +FDE0 +AAA0 +AFC0 +FA40 +2FC0 +2A40 +7AA0 +9520 +ENDCHAR +STARTCHAR U_87EA +ENCODING 34794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +22A0 +FBE0 +AAA0 +ABE0 +F8A0 +27E0 +2B40 +3D20 +C9E0 +ENDCHAR +STARTCHAR U_87EB +ENCODING 34795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2280 +FFE0 +AAA0 +AFE0 +FA40 +23C0 +2A40 +3FE0 +C100 +0100 +ENDCHAR +STARTCHAR U_87EC +ENCODING 34796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +27E0 +FBE0 +AAA0 +ABE0 +FAA0 +23E0 +2880 +3FE0 +C880 +ENDCHAR +STARTCHAR U_87ED +ENCODING 34797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +23E0 +FE80 +ABE0 +AA80 +FBE0 +2280 +2BE0 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_87EE +ENCODING 34798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +27E0 +2080 +FBE0 +A880 +AFE0 +FAA0 +27E0 +2A40 +3A40 +CBC0 +ENDCHAR +STARTCHAR U_87EF +ENCODING 34799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2100 +FFE0 +AA40 +AFE0 +FA40 +27E0 +2A80 +3AA0 +CC60 +ENDCHAR +STARTCHAR U_87F0 +ENCODING 34800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2140 +FFE0 +A940 +AFC0 +FAA0 +2920 +2FE0 +7AA0 +92A0 +ENDCHAR +STARTCHAR U_87F1 +ENCODING 34801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2400 +27E0 +FAA0 +AAA0 +AFE0 +FAA0 +2FE0 +2540 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_87F2 +ENCODING 34802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0480 +7F40 +2080 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_87F3 +ENCODING 34803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2020 +FFE0 +A820 +AFE0 +FAA0 +27E0 +2840 +3FE0 +C440 +02C0 +ENDCHAR +STARTCHAR U_87F4 +ENCODING 34804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4A00 +7BE0 +4A40 +FE40 +4440 +3FC0 +2440 +3FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_87F5 +ENCODING 34805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +2840 +FE40 +A9E0 +AE40 +FB40 +2EC0 +2A40 +7F40 +90C0 +ENDCHAR +STARTCHAR U_87F6 +ENCODING 34806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2AE0 +FEA0 +AAA0 +AEE0 +AF00 +FFC0 +2100 +27C0 +3100 +EFE0 +ENDCHAR +STARTCHAR U_87F7 +ENCODING 34807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +FFE0 +AAA0 +AB80 +A800 +FBE0 +22A0 +2BE0 +3AA0 +EBE0 +ENDCHAR +STARTCHAR U_87F8 +ENCODING 34808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2880 +D900 +2E00 +D5C0 +2C80 +FBE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_87F9 +ENCODING 34809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +4920 +FD60 +5480 +7FE0 +5480 +BFE0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_87FA +ENCODING 34810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AAA0 +AFE0 +AA40 +FBC0 +2240 +2BC0 +3800 +EFE0 +ENDCHAR +STARTCHAR U_87FB +ENCODING 34811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +F900 +AFE0 +A900 +AFE0 +FCA0 +27E0 +2EA0 +34C0 +ED20 +ENDCHAR +STARTCHAR U_87FC +ENCODING 34812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +7F40 +D480 +7540 +0A20 +3FC0 +2240 +3FC0 +0240 +7FA0 +ENDCHAR +STARTCHAR U_87FD +ENCODING 34813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +25E0 +2280 +FBE0 +A940 +AE80 +FBE0 +2280 +2BE0 +3A80 +CDE0 +ENDCHAR +STARTCHAR U_87FE +ENCODING 34814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +FFE0 +AAA0 +AFE0 +A800 +FFE0 +2800 +2BE0 +3A20 +EBE0 +ENDCHAR +STARTCHAR U_87FF +ENCODING 34815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +A940 +FA60 +A9C0 +FC80 +AD40 +FFC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8800 +ENCODING 34816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +25E0 +FAA0 +AC80 +A940 +FFC0 +2540 +26C0 +3D40 +C7C0 +0C60 +ENDCHAR +STARTCHAR U_8801 +ENCODING 34817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +AAA0 +5EC0 +EAA0 +2EE0 +CA80 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8802 +ENCODING 34818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +F540 +AFE0 +A540 +FFE0 +2100 +2FE0 +3380 +D540 +0920 +ENDCHAR +STARTCHAR U_8803 +ENCODING 34819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4000 +7F80 +2080 +FFC0 +A540 +FF40 +B5C0 +FF40 +A540 +AE60 +ENDCHAR +STARTCHAR U_8804 +ENCODING 34820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +2540 +FFE0 +AD40 +F6C0 +2FE0 +2920 +3AA0 +CFA0 +0860 +ENDCHAR +STARTCHAR U_8805 +ENCODING 34821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FEE0 +AA80 +AEE0 +FAA0 +2EE0 +2AA0 +3EE0 +CA80 +03E0 +ENDCHAR +STARTCHAR U_8806 +ENCODING 34822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +7FC0 +4440 +FFE0 +8420 +FFE0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8807 +ENCODING 34823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F900 +AFC0 +AD40 +FFC0 +2540 +2FE0 +3AA0 +CFA0 +0860 +ENDCHAR +STARTCHAR U_8808 +ENCODING 34824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9FE0 +F4A0 +9FC0 +F4A0 +5560 +BFC0 +2440 +3FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_8809 +ENCODING 34825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +A800 +AFE0 +FC40 +27C0 +2280 +36A0 +DA40 +0320 +ENDCHAR +STARTCHAR U_880A +ENCODING 34826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FA40 +AFE0 +AAA0 +FFE0 +2AA0 +2FE0 +3A80 +CEC0 +12A0 +ENDCHAR +STARTCHAR U_880B +ENCODING 34827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +2FE0 +FA00 +AFE0 +A920 +FFE0 +2560 +2FE0 +3920 +CFE0 +ENDCHAR +STARTCHAR U_880C +ENCODING 34828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2AA0 +FFE0 +A900 +AFE0 +FA80 +2100 +2FC0 +3100 +CFE0 +0100 +ENDCHAR +STARTCHAR U_880D +ENCODING 34829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2980 +FFE0 +A920 +AF40 +A440 +FF40 +2B40 +2940 +3DA0 +CB20 +ENDCHAR +STARTCHAR U_880E +ENCODING 34830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +2FE0 +2100 +FFE0 +AA80 +FD40 +2BA0 +2540 +3FE0 +C440 +0840 +ENDCHAR +STARTCHAR U_880F +ENCODING 34831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +4FE0 +F2A0 +DF60 +D540 +FFE0 +5540 +5FE0 +7540 +9540 +2340 +ENDCHAR +STARTCHAR U_8810 +ENCODING 34832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AB40 +AD60 +F900 +2440 +27C0 +3440 +C7C0 +0840 +ENDCHAR +STARTCHAR U_8811 +ENCODING 34833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2560 +FD40 +AB40 +ACA0 +FFE0 +2120 +2FE0 +3B80 +C540 +0920 +ENDCHAR +STARTCHAR U_8812 +ENCODING 34834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +FFE0 +6EC0 +5540 +6EC0 +3F80 +2480 +3F80 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8813 +ENCODING 34835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA80 +AFE0 +A820 +AFE0 +FAA0 +25C0 +2AA0 +39A0 +EE80 +ENDCHAR +STARTCHAR U_8814 +ENCODING 34836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FA40 +AFE0 +A820 +AFC0 +FD20 +22C0 +2D80 +3AC0 +ED20 +ENDCHAR +STARTCHAR U_8815 +ENCODING 34837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +27E0 +FD20 +AB40 +AD20 +FFE0 +2100 +2FE0 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_8816 +ENCODING 34838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +AA80 +ABE0 +FA80 +27E0 +2A40 +3980 +EE60 +ENDCHAR +STARTCHAR U_8817 +ENCODING 34839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +25A0 +FB60 +ADA0 +AFE0 +AC80 +FFE0 +2480 +27E0 +3C80 +E7E0 +ENDCHAR +STARTCHAR U_8818 +ENCODING 34840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27C0 +FAA0 +AFE0 +AA80 +FFA0 +2AA0 +2FC0 +3AA0 +CF60 +0820 +ENDCHAR +STARTCHAR U_8819 +ENCODING 34841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +FC20 +ABE0 +AC80 +ABC0 +FE40 +23C0 +2A40 +3BC0 +EE60 +ENDCHAR +STARTCHAR U_881A +ENCODING 34842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +FFE0 +3080 +D080 +7FE0 +56A0 +7FE0 +14A0 +FFE0 +ENDCHAR +STARTCHAR U_881B +ENCODING 34843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +27E0 +FA80 +AFE0 +AAA0 +AFE0 +F940 +27E0 +24A0 +3640 +C9A0 +ENDCHAR +STARTCHAR U_881C +ENCODING 34844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +F5E0 +4A40 +E4E0 +5B40 +4440 +FFE0 +64C0 +BFA0 +0440 +7FA0 +ENDCHAR +STARTCHAR U_881D +ENCODING 34845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +FFC0 +AD40 +AFC0 +A800 +FFE0 +2AA0 +2FE0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_881E +ENCODING 34846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +79E0 +4920 +7960 +5500 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_881F +ENCODING 34847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +AFE0 +AAA0 +AFE0 +FD20 +2BA0 +2D60 +3BA0 +ED20 +ENDCHAR +STARTCHAR U_8820 +ENCODING 34848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +7FC0 +5140 +5F40 +7FC0 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8821 +ENCODING 34849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +1100 +FFE0 +1500 +EAE0 +3680 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8822 +ENCODING 34850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +3180 +DF60 +1100 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8823 +ENCODING 34851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +FFE0 +A940 +AFC0 +A940 +FFE0 +2D20 +3DA0 +D760 +2420 +ENDCHAR +STARTCHAR U_8824 +ENCODING 34852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +4A40 +71C0 +5F40 +4040 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8825 +ENCODING 34853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AFE0 +FA80 +57E0 +D100 +7FC0 +4900 +7FC0 +4440 +7FC0 +0440 +FFE0 +ENDCHAR +STARTCHAR U_8826 +ENCODING 34854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2100 +FFE0 +A920 +AFC0 +A920 +FFE0 +2940 +2FE0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_8827 +ENCODING 34855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +FFE0 +9020 +7F80 +2080 +FFC0 +AD40 +FFC0 +2520 +FFE0 +ENDCHAR +STARTCHAR U_8828 +ENCODING 34856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +FA80 +AFE0 +A940 +AFC0 +FAA0 +2FE0 +28A0 +2EE0 +FAA0 +ENDCHAR +STARTCHAR U_8829 +ENCODING 34857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +2FE0 +F0A0 +BFE0 +B040 +BE80 +F1E0 +2EA0 +2AE0 +3EA0 +EAE0 +ENDCHAR +STARTCHAR U_882A +ENCODING 34858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +2A00 +FFE0 +4A00 +7BE0 +4A20 +7FE0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_882B +ENCODING 34859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1840 +6D40 +F940 +5540 +A540 +48C0 +FBE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_882C +ENCODING 34860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2F80 +FAE0 +BF20 +B0E0 +BE80 +FAE0 +2E80 +2AE0 +3EA0 +EAE0 +ENDCHAR +STARTCHAR U_882D +ENCODING 34861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +D880 +4700 +5AC0 +4F80 +A200 +FFC0 +AD40 +FFC0 +2920 +FFE0 +ENDCHAR +STARTCHAR U_882E +ENCODING 34862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +28A0 +FFE0 +AAA0 +AF40 +A9A0 +FFE0 +25A0 +2B60 +3DA0 +EB60 +ENDCHAR +STARTCHAR U_882F +ENCODING 34863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A440 +BFC0 +A440 +FFE0 +9080 +FFE0 +D6A0 +FFE0 +94A0 +FBE0 +ENDCHAR +STARTCHAR U_8830 +ENCODING 34864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +FAA0 +AEE0 +AA80 +AFE0 +FA80 +2FE0 +26A0 +3A40 +EB20 +ENDCHAR +STARTCHAR U_8831 +ENCODING 34865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +0440 +FFE0 +AAA0 +FBE0 +28A0 +FFE0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8832 +ENCODING 34866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2AA0 +FFE0 +2900 +53E0 +88A0 +FBE0 +AAA0 +ABE0 +FCA0 +03E0 +ENDCHAR +STARTCHAR U_8833 +ENCODING 34867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +AAA0 +AEE0 +AA40 +FCA0 +2FE0 +2940 +3980 +EE60 +ENDCHAR +STARTCHAR U_8834 +ENCODING 34868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2FE0 +2480 +FFE0 +AAA0 +FFE0 +2940 +3FE0 +C540 +1CC0 +07C0 +ENDCHAR +STARTCHAR U_8835 +ENCODING 34869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +2520 +FFE0 +A900 +AFE0 +A900 +FFE0 +2AA0 +2FE0 +3AA0 +EBA0 +ENDCHAR +STARTCHAR U_8836 +ENCODING 34870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A280 +FBE0 +5140 +BFE0 +2040 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_8837 +ENCODING 34871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +AAA0 +AEE0 +A900 +FFE0 +2900 +2FE0 +3900 +EFE0 +ENDCHAR +STARTCHAR U_8838 +ENCODING 34872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2240 +FEE0 +AAA0 +AFE0 +A480 +FFE0 +2480 +27E0 +3C80 +C7E0 +ENDCHAR +STARTCHAR U_8839 +ENCODING 34873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +FFE0 +90A0 +BFA0 +5080 +FFE0 +AAA0 +FBE0 +28A0 +F7E0 +ENDCHAR +STARTCHAR U_883A +ENCODING 34874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2080 +FFE0 +4940 +BFA0 +2480 +FBE0 +AAA0 +FBE0 +24A0 +FFE0 +ENDCHAR +STARTCHAR U_883B +ENCODING 34875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +EEE0 +4040 +EEE0 +5AA0 +AF40 +7FC0 +4440 +7FC0 +0440 +FFA0 +ENDCHAR +STARTCHAR U_883C +ENCODING 34876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FAA0 +AFE0 +A480 +FFE0 +2880 +2FE0 +3240 +C980 +0660 +ENDCHAR +STARTCHAR U_883D +ENCODING 34877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6940 +A520 +3FE0 +D140 +7C80 +5160 +FFE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_883E +ENCODING 34878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +FFE0 +AD40 +AFE0 +FAA0 +2BE0 +2D20 +3BA0 +C920 +17E0 +ENDCHAR +STARTCHAR U_883F +ENCODING 34879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5520 +2AA0 +FFE0 +2AA0 +5520 +2AA0 +FFE0 +AAA0 +FBE0 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_8840 +ENCODING 34880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1000 +7FC0 +4A40 +4A40 +4A40 +4A40 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8841 +ENCODING 34881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +2000 +2000 +3FC0 +0400 +7FC0 +4A40 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_8842 +ENCODING 34882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +47E0 +F920 +A920 +AB20 +AD20 +A920 +BD20 +C220 +02A0 +0440 +ENDCHAR +STARTCHAR U_8843 +ENCODING 34883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4080 +F880 +A880 +A9C0 +AAA0 +ACA0 +A880 +BC80 +C080 +0080 +ENDCHAR +STARTCHAR U_8844 +ENCODING 34884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4140 +F940 +A940 +A940 +ABC0 +A940 +A940 +BD40 +C140 +07E0 +ENDCHAR +STARTCHAR U_8845 +ENCODING 34885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +44A0 +FAC0 +A880 +ABE0 +A880 +ABE0 +A880 +BC80 +C080 +0080 +ENDCHAR +STARTCHAR U_8846 +ENCODING 34886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3FC0 +2A40 +FFE0 +0380 +7C40 +2680 +5500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_8847 +ENCODING 34887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +4700 +FCC0 +AD00 +AD40 +AD60 +AD40 +BD40 +C5A0 +0920 +1000 +ENDCHAR +STARTCHAR U_8848 +ENCODING 34888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +4240 +FA40 +ABC0 +AA40 +ABC0 +AA40 +AA60 +BFC0 +C040 +0040 +ENDCHAR +STARTCHAR U_8849 +ENCODING 34889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4200 +FBC0 +AE40 +A980 +A980 +AA40 +AFE0 +BA40 +C3C0 +0240 +ENDCHAR +STARTCHAR U_884A +ENCODING 34890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +47E0 +FA80 +AFE0 +AAA0 +AFE0 +A940 +AFE0 +AD40 +FAA0 +0B60 +ENDCHAR +STARTCHAR U_884B +ENCODING 34891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +7FE0 +0440 +FFE0 +2480 +5540 +75C0 +5540 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_884C +ENCODING 34892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4000 +8000 +1000 +2FE0 +6080 +A080 +2080 +2080 +2080 +2380 +ENDCHAR +STARTCHAR U_884D +ENCODING 34893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +25E0 +4000 +9000 +2BE0 +6240 +A440 +2C40 +2440 +2440 +25C0 +ENDCHAR +STARTCHAR U_884E +ENCODING 34894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +4E00 +8400 +1400 +3EE0 +6440 +A440 +2440 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_884F +ENCODING 34895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +4000 +A000 +5EE0 +CA40 +4A40 +4A40 +5340 +6240 +40C0 +ENDCHAR +STARTCHAR U_8850 +ENCODING 34896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +4800 +A9E0 +4E40 +CA40 +4A40 +4E40 +4840 +4E40 +40C0 +ENDCHAR +STARTCHAR U_8851 +ENCODING 34897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +29E0 +5400 +B3E0 +4840 +DE40 +4240 +5440 +4840 +4540 +4080 +ENDCHAR +STARTCHAR U_8852 +ENCODING 34898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +2200 +4F00 +A4E0 +2940 +5E40 +C240 +4440 +4940 +5F40 +40C0 +ENDCHAR +STARTCHAR U_8853 +ENCODING 34899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +4DE0 +8A00 +3E00 +49E0 +DC40 +5A40 +6A40 +4840 +4840 +49C0 +ENDCHAR +STARTCHAR U_8854 +ENCODING 34900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +4E00 +B000 +2EE0 +4440 +DF40 +4440 +4440 +4640 +4440 +40C0 +ENDCHAR +STARTCHAR U_8855 +ENCODING 34901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +5F00 +9100 +3DE0 +5140 +DD40 +5540 +5540 +5D40 +5140 +52C0 +ENDCHAR +STARTCHAR U_8856 +ENCODING 34902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AE0 +4A00 +9F00 +2AE0 +4A40 +CA40 +5F40 +4040 +4A40 +5140 +6080 +ENDCHAR +STARTCHAR U_8857 +ENCODING 34903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5E00 +8400 +3F00 +44E0 +C440 +5F40 +4440 +4740 +5C40 +40C0 +ENDCHAR +STARTCHAR U_8858 +ENCODING 34904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2EE0 +5400 +A400 +5EE0 +C440 +5740 +5440 +5740 +7840 +40C0 +ENDCHAR +STARTCHAR U_8859 +ENCODING 34905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +4400 +9E00 +2AE0 +4A40 +DF40 +4040 +5E40 +5240 +5E40 +52C0 +ENDCHAR +STARTCHAR U_885A +ENCODING 34906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +5500 +9500 +3FE0 +5540 +FD40 +6F40 +6D40 +7D40 +4540 +4BC0 +ENDCHAR +STARTCHAR U_885B +ENCODING 34907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28E0 +5E00 +8A00 +3FE0 +5240 +DE40 +4440 +5F40 +5440 +7F40 +44C0 +ENDCHAR +STARTCHAR U_885C +ENCODING 34908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +4CE0 +BE00 +49E0 +DE40 +5A40 +5640 +5A40 +5640 +5F40 +4080 +ENDCHAR +STARTCHAR U_885D +ENCODING 34909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +4400 +9F00 +35E0 +5F40 +D540 +5F40 +4440 +4E40 +4440 +5FC0 +ENDCHAR +STARTCHAR U_885E +ENCODING 34910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FE0 +4500 +BFE0 +5140 +DF40 +4440 +5F40 +5540 +5540 +44C0 +ENDCHAR +STARTCHAR U_885F +ENCODING 34911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A00 +34E0 +4A00 +A000 +5FE0 +C840 +5E40 +5240 +5E40 +5240 +5EC0 +ENDCHAR +STARTCHAR U_8860 +ENCODING 34912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3EE0 +4800 +BFE0 +5240 +DE40 +5240 +5E40 +5240 +7F40 +52C0 +ENDCHAR +STARTCHAR U_8861 +ENCODING 34913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5400 +9F00 +35E0 +5F40 +D540 +5F40 +4440 +5F40 +4A40 +51C0 +ENDCHAR +STARTCHAR U_8862 +ENCODING 34914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +5500 +9F00 +35E0 +5F40 +5240 +FF40 +5240 +5F40 +5240 +5FC0 +ENDCHAR +STARTCHAR U_8863 +ENCODING 34915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +FFE0 +0400 +0A40 +1280 +3100 +5100 +9480 +1840 +1020 +ENDCHAR +STARTCHAR U_8864 +ENCODING 34916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +40 +20 +F8 +10 +28 +70 +A8 +28 +20 +20 +20 +ENDCHAR +STARTCHAR U_8865 +ENCODING 34917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +1100 +2980 +7160 +A920 +2900 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_8866 +ENCODING 34918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +F900 +1100 +2900 +77E0 +A900 +2900 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_8867 +ENCODING 34919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2080 +F880 +1080 +2FE0 +7080 +A880 +2880 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_8868 +ENCODING 34920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +0A40 +1280 +3100 +D480 +1860 +ENDCHAR +STARTCHAR U_8869 +ENCODING 34921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2FE0 +FD40 +1540 +2A40 +7280 +AA80 +2900 +2280 +2460 +2820 +ENDCHAR +STARTCHAR U_886A +ENCODING 34922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +FAA0 +12E0 +2FA0 +72A0 +AAA0 +2AC0 +2280 +2220 +21E0 +ENDCHAR +STARTCHAR U_886B +ENCODING 34923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2080 +FB00 +1020 +2840 +7080 +AB00 +2820 +2040 +2180 +2600 +ENDCHAR +STARTCHAR U_886C +ENCODING 34924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +FFE0 +1040 +2A40 +7140 +A940 +2840 +2040 +2040 +21C0 +ENDCHAR +STARTCHAR U_886D +ENCODING 34925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +1100 +2900 +77E0 +A900 +2900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_886E +ENCODING 34926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +2440 +48A0 +3F00 +0C40 +3280 +D100 +14E0 +1840 +ENDCHAR +STARTCHAR U_886F +ENCODING 34927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +F440 +1440 +2820 +77C0 +A940 +2940 +2240 +2440 +2980 +ENDCHAR +STARTCHAR U_8870 +ENCODING 34928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3F80 +2080 +FFE0 +2080 +3FA0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8871 +ENCODING 34929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2240 +FA80 +12E0 +2A40 +7240 +AA40 +2B40 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_8872 +ENCODING 34930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1520 +2D20 +75A0 +B660 +2C20 +2420 +2420 +2460 +ENDCHAR +STARTCHAR U_8873 +ENCODING 34931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +F280 +1440 +2540 +2920 +7200 +AA00 +2440 +2FE0 +2420 +ENDCHAR +STARTCHAR U_8874 +ENCODING 34932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1520 +2900 +7180 +A980 +2A80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8875 +ENCODING 34933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23E0 +FA20 +1220 +2A20 +73E0 +AA20 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_8876 +ENCODING 34934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +2CA0 +74A0 +AFE0 +24A0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_8877 +ENCODING 34935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4440 +7FC0 +0A20 +1140 +3080 +D440 +1820 +ENDCHAR +STARTCHAR U_8878 +ENCODING 34936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F280 +1240 +2420 +6A40 +B240 +2A40 +2A40 +2240 +2440 +ENDCHAR +STARTCHAR U_8879 +ENCODING 34937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +27C0 +FC80 +1480 +2FE0 +7480 +AC80 +2C80 +24A0 +2560 +2620 +ENDCHAR +STARTCHAR U_887A +ENCODING 34938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +7FC0 +4200 +7FC0 +1240 +E680 +1B00 +6880 +0E60 +ENDCHAR +STARTCHAR U_887B +ENCODING 34939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +1440 +2FE0 +7440 +AFE0 +2C40 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_887C +ENCODING 34940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +1080 +2880 +73E0 +A940 +2940 +2080 +2140 +2620 +ENDCHAR +STARTCHAR U_887D +ENCODING 34941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +27C0 +F900 +1100 +2900 +77E0 +A900 +2900 +2100 +2100 +27E0 +ENDCHAR +STARTCHAR U_887E +ENCODING 34942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1500 +2480 +DF60 +0900 +0600 +FFE0 +1440 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_887F +ENCODING 34943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +1640 +2920 +7000 +AFE0 +2840 +2080 +2080 +2100 +ENDCHAR +STARTCHAR U_8880 +ENCODING 34944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +1420 +2120 +28A0 +7020 +A8A0 +2320 +2020 +20C0 +ENDCHAR +STARTCHAR U_8881 +ENCODING 34945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +2080 +3F80 +0C40 +1280 +3100 +D480 +1860 +ENDCHAR +STARTCHAR U_8882 +ENCODING 34946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +1140 +2140 +2FE0 +7100 +A900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_8883 +ENCODING 34947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F920 +4120 +5A20 +6460 +0400 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8884 +ENCODING 34948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +1100 +27E0 +2900 +7100 +A900 +2280 +2460 +2820 +ENDCHAR +STARTCHAR U_8885 +ENCODING 34949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F80 +4880 +4500 +7FE0 +0440 +FFE0 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8886 +ENCODING 34950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +17C0 +2900 +77E0 +A920 +2920 +21A0 +2140 +2100 +ENDCHAR +STARTCHAR U_8887 +ENCODING 34951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +F640 +1540 +2D40 +77E0 +AC40 +2440 +2440 +2440 +28C0 +ENDCHAR +STARTCHAR U_8888 +ENCODING 34952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2A40 +4BC0 +9400 +0200 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_8889 +ENCODING 34953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +1420 +2200 +2A40 +7380 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_888A +ENCODING 34954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F280 +1440 +2920 +7100 +AFE0 +2040 +2280 +2100 +2080 +ENDCHAR +STARTCHAR U_888B +ENCODING 34955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2240 +7FE0 +A100 +24A0 +2260 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_888C +ENCODING 34956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3F80 +4280 +BE80 +2120 +3FE0 +3240 +D580 +18E0 +ENDCHAR +STARTCHAR U_888D +ENCODING 34957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC20 +13A0 +22A0 +2AA0 +73A0 +AA40 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_888E +ENCODING 34958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2480 +F5E0 +14A0 +2AA0 +2EA0 +74A0 +AAA0 +2FA0 +2120 +22C0 +ENDCHAR +STARTCHAR U_888F +ENCODING 34959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7E0 +1100 +2200 +2BE0 +7480 +A880 +3080 +27E0 +2000 +ENDCHAR +STARTCHAR U_8890 +ENCODING 34960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F2A0 +1220 +2A40 +6A80 +B340 +2A20 +2640 +2A40 +33C0 +ENDCHAR +STARTCHAR U_8891 +ENCODING 34961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2120 +F920 +1220 +24E0 +2840 +77E0 +AC20 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_8892 +ENCODING 34962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +1240 +2BC0 +7240 +AA40 +2BC0 +2240 +2000 +2FE0 +ENDCHAR +STARTCHAR U_8893 +ENCODING 34963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FA40 +1240 +2BC0 +7240 +AA40 +2BC0 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_8894 +ENCODING 34964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F040 +1040 +2740 +2D40 +7540 +AF40 +2840 +2040 +20C0 +ENDCHAR +STARTCHAR U_8895 +ENCODING 34965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +1420 +2880 +7280 +AA80 +2A40 +2440 +2420 +2820 +ENDCHAR +STARTCHAR U_8896 +ENCODING 34966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +17E0 +2D20 +7520 +AFE0 +2D20 +2520 +27E0 +2420 +ENDCHAR +STARTCHAR U_8897 +ENCODING 34967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +FC40 +1120 +2A00 +7480 +A920 +2A40 +2080 +2100 +2600 +ENDCHAR +STARTCHAR U_8898 +ENCODING 34968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC80 +12A0 +2AE0 +77A0 +AAA0 +2AC0 +22A0 +2220 +21E0 +ENDCHAR +STARTCHAR U_8899 +ENCODING 34969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2100 +FBE0 +1220 +2A20 +7220 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_889A +ENCODING 34970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2240 +FFE0 +1200 +2A00 +73C0 +AA40 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_889B +ENCODING 34971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4460 +2780 +FC80 +1480 +2FE0 +7480 +AC80 +2CA0 +2560 +2720 +24A0 +ENDCHAR +STARTCHAR U_889C +ENCODING 34972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2FC0 +7100 +A980 +2B40 +2520 +2920 +3100 +ENDCHAR +STARTCHAR U_889D +ENCODING 34973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F440 +17E0 +2440 +6E40 +B540 +2D40 +2440 +2540 +2480 +ENDCHAR +STARTCHAR U_889E +ENCODING 34974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +7FC0 +A0A0 +3F80 +0C40 +3280 +D100 +1480 +1860 +ENDCHAR +STARTCHAR U_889F +ENCODING 34975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +FFC0 +1100 +2900 +77E0 +A900 +2900 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_88A0 +ENCODING 34976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2400 +3F80 +4400 +FFE0 +2080 +CC60 +1A80 +E980 +0C60 +ENDCHAR +STARTCHAR U_88A1 +ENCODING 34977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +1540 +2FC0 +7540 +AFE0 +2C40 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_88A2 +ENCODING 34978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +FB40 +1100 +2FE0 +7100 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_88A3 +ENCODING 34979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2540 +F540 +1FE0 +2540 +6D40 +B540 +2DC0 +2400 +27E0 +2000 +ENDCHAR +STARTCHAR U_88A4 +ENCODING 34980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0A00 +7FC0 +0A40 +F200 +0640 +1980 +E880 +0C60 +ENDCHAR +STARTCHAR U_88A5 +ENCODING 34981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F200 +1200 +2400 +6FC0 +B440 +2C40 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_88A6 +ENCODING 34982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F520 +1520 +27E0 +7100 +A900 +2520 +2520 +2520 +27E0 +ENDCHAR +STARTCHAR U_88A7 +ENCODING 34983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FC20 +1020 +2BA0 +72A0 +AAA0 +2BA0 +2020 +20A0 +2040 +ENDCHAR +STARTCHAR U_88A8 +ENCODING 34984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2100 +FFE0 +1100 +2A40 +7780 +A880 +2900 +2240 +2FA0 +2420 +ENDCHAR +STARTCHAR U_88A9 +ENCODING 34985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F1E0 +1100 +2900 +77C0 +AC40 +2440 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_88AA +ENCODING 34986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2900 +77E0 +A900 +2A00 +2440 +2FA0 +2420 +ENDCHAR +STARTCHAR U_88AB +ENCODING 34987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +2C80 +77E0 +AD40 +2540 +2480 +2940 +3620 +ENDCHAR +STARTCHAR U_88AC +ENCODING 34988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +7FC0 +0040 +3F80 +2080 +3F80 +1240 +3580 +D8E0 +ENDCHAR +STARTCHAR U_88AD +ENCODING 34989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +FFE0 +0A80 +1320 +6DE0 +0400 +FFE0 +1240 +3280 +D900 +10E0 +ENDCHAR +STARTCHAR U_88AE +ENCODING 34990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +F7E0 +1400 +2900 +7100 +AD40 +2520 +2920 +2100 +2300 +ENDCHAR +STARTCHAR U_88AF +ENCODING 34991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +F520 +17E0 +2900 +73C0 +AA40 +2540 +2480 +2940 +2220 +ENDCHAR +STARTCHAR U_88B0 +ENCODING 34992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2440 +FFE0 +2240 +3FE0 +0440 +FFE0 +0A80 +3100 +D4E0 +1840 +ENDCHAR +STARTCHAR U_88B1 +ENCODING 34993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +22C0 +F4A0 +1480 +27E0 +6C80 +B480 +2C80 +2540 +2540 +2620 +ENDCHAR +STARTCHAR U_88B2 +ENCODING 34994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3100 +0E00 +77C0 +1880 +0500 +7E40 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_88B3 +ENCODING 34995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23E0 +F220 +1540 +2880 +73E0 +AD20 +2AA0 +2040 +2180 +2600 +ENDCHAR +STARTCHAR U_88B4 +ENCODING 34996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F280 +17C0 +2820 +77C0 +AA00 +23C0 +2040 +2140 +2080 +ENDCHAR +STARTCHAR U_88B5 +ENCODING 34997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2260 +F380 +1480 +2C80 +77E0 +AC80 +2480 +2480 +2480 +27E0 +ENDCHAR +STARTCHAR U_88B6 +ENCODING 34998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FE40 +1180 +2E60 +7080 +AFE0 +2C80 +27E0 +2080 +2080 +ENDCHAR +STARTCHAR U_88B7 +ENCODING 34999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2180 +FA40 +1420 +2BC0 +7000 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_88B8 +ENCODING 35000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27E0 +FA00 +13E0 +2A40 +7480 +AFE0 +2480 +2480 +2480 +2580 +ENDCHAR +STARTCHAR U_88B9 +ENCODING 35001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2080 +F900 +13E0 +2A20 +7220 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_88BA +ENCODING 35002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +1080 +2BE0 +7000 +ABE0 +2A20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_88BB +ENCODING 35003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +F200 +1FE0 +2AA0 +7AA0 +AAA0 +3AA0 +2AA0 +2860 +2000 +ENDCHAR +STARTCHAR U_88BC +ENCODING 35004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +F440 +1A40 +2980 +7240 +AC20 +2BC0 +2240 +2240 +23C0 +ENDCHAR +STARTCHAR U_88BD +ENCODING 35005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +24E0 +FFA0 +1AA0 +2AA0 +2AA0 +7AA0 +AAA0 +24A0 +2AE0 +31A0 +ENDCHAR +STARTCHAR U_88BE +ENCODING 35006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +FFC0 +1500 +2900 +77E0 +A900 +2B80 +2540 +2920 +2100 +ENDCHAR +STARTCHAR U_88BF +ENCODING 35007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7C0 +1100 +2FE0 +7100 +A900 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_88C0 +ENCODING 35008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FD20 +17E0 +2D20 +7520 +ADA0 +2660 +2420 +27E0 +2420 +ENDCHAR +STARTCHAR U_88C1 +ENCODING 35009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +1100 +FF20 +2540 +7880 +A5A0 +3260 +2420 +ENDCHAR +STARTCHAR U_88C2 +ENCODING 35010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2120 +7D20 +A920 +10E0 +2400 +FFE0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_88C3 +ENCODING 35011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F200 +17E0 +2800 +77E0 +AA00 +2280 +2240 +2240 +2200 +ENDCHAR +STARTCHAR U_88C4 +ENCODING 35012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +22E0 +F400 +1A00 +25E0 +2C40 +7440 +AC40 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_88C5 +ENCODING 35013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +9FE0 +5100 +3100 +D7C0 +1200 +FFE0 +0C40 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_88C6 +ENCODING 35014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +FD40 +1100 +2FE0 +7020 +A820 +2FE0 +2020 +27E0 +2020 +ENDCHAR +STARTCHAR U_88C7 +ENCODING 35015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +FFE0 +1AA0 +2AA0 +7AA0 +AAA0 +3AA0 +2AA0 +3FE0 +2000 +ENDCHAR +STARTCHAR U_88C8 +ENCODING 35016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F900 +17C0 +2B00 +7500 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_88C9 +ENCODING 35017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7500 +AD20 +24C0 +2480 +2640 +2420 +ENDCHAR +STARTCHAR U_88CA +ENCODING 35018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +3F00 +2100 +3F00 +2100 +3FE0 +0820 +FFE0 +3500 +D200 +19C0 +ENDCHAR +STARTCHAR U_88CB +ENCODING 35019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F800 +13C0 +2A40 +7240 +ABC0 +2000 +2240 +2080 +2FE0 +ENDCHAR +STARTCHAR U_88CC +ENCODING 35020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +1100 +2D40 +7540 +ABA0 +2100 +2280 +2440 +2820 +ENDCHAR +STARTCHAR U_88CD +ENCODING 35021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FCA0 +17E0 +2CA0 +74E0 +ADA0 +26A0 +24A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_88CE +ENCODING 35022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +17C0 +2800 +77E0 +A900 +27C0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_88CF +ENCODING 35023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_88D0 +ENCODING 35024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +F7E0 +1000 +2FE0 +7420 +AFE0 +2420 +27E0 +2420 +2460 +ENDCHAR +STARTCHAR U_88D1 +ENCODING 35025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +FC40 +17C0 +2440 +6FE0 +B440 +2FC0 +2140 +2240 +2CC0 +ENDCHAR +STARTCHAR U_88D2 +ENCODING 35026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +3BC0 +2040 +3BC0 +2040 +3FC0 +1940 +2880 +CC60 +ENDCHAR +STARTCHAR U_88D3 +ENCODING 35027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +20A0 +FFE0 +1080 +2AA0 +7FA0 +AAC0 +3A80 +2AA0 +3160 +2220 +ENDCHAR +STARTCHAR U_88D4 +ENCODING 35028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1240 +F580 +1860 +7FC0 +4A40 +71C0 +4E40 +4A40 +4EC0 +ENDCHAR +STARTCHAR U_88D5 +ENCODING 35029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2240 +F420 +1180 +2A40 +7420 +ABC0 +2240 +2240 +23C0 +2240 +ENDCHAR +STARTCHAR U_88D6 +ENCODING 35030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +F7C0 +1400 +2FE0 +7680 +AEA0 +26C0 +2A80 +2B40 +3220 +ENDCHAR +STARTCHAR U_88D7 +ENCODING 35031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F200 +1440 +2FE0 +7020 +AD40 +2540 +2540 +2540 +2960 +ENDCHAR +STARTCHAR U_88D8 +ENCODING 35032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +2480 +1700 +3580 +CC40 +0420 +FFE0 +3240 +D580 +1860 +ENDCHAR +STARTCHAR U_88D9 +ENCODING 35033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2240 +FFE0 +1240 +2FC0 +7400 +AFC0 +2440 +2C40 +37C0 +2440 +ENDCHAR +STARTCHAR U_88DA +ENCODING 35034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC00 +27E0 +F480 +2480 +4480 +FFE0 +1240 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_88DB +ENCODING 35035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +7FC0 +4440 +7FC0 +4020 +7FE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_88DC +ENCODING 35036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +27E0 +F900 +17E0 +2D20 +77E0 +AD20 +27E0 +2520 +2520 +2560 +ENDCHAR +STARTCHAR U_88DD +ENCODING 35037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7FE0 +1100 +F100 +57C0 +8400 +FFE0 +1480 +3300 +D580 +1860 +ENDCHAR +STARTCHAR U_88DE +ENCODING 35038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFC0 +1440 +2C40 +77C0 +AA80 +2A80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_88DF +ENCODING 35039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +8920 +2140 +C080 +5F00 +0400 +FFE0 +1A40 +E980 +0C60 +ENDCHAR +STARTCHAR U_88E0 +ENCODING 35040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0880 +FFE0 +1080 +7F80 +3080 +DF80 +0400 +FFE0 +3280 +D9E0 +ENDCHAR +STARTCHAR U_88E1 +ENCODING 35041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FD40 +17C0 +2D40 +77C0 +A900 +2FC0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_88E2 +ENCODING 35042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +4880 +E3E0 +3900 +4A80 +5BE0 +E880 +5BE0 +4880 +5480 +63E0 +ENDCHAR +STARTCHAR U_88E3 +ENCODING 35043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F280 +1440 +2BA0 +6800 +B240 +2D40 +2240 +2280 +2FE0 +ENDCHAR +STARTCHAR U_88E4 +ENCODING 35044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F900 +2FE0 +4900 +DA80 +6BE0 +5880 +4FE0 +5080 +5080 +ENDCHAR +STARTCHAR U_88E5 +ENCODING 35045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8800 +45E0 +E820 +2BA0 +5AA0 +6BA0 +DAA0 +4BA0 +4820 +4820 +4860 +ENDCHAR +STARTCHAR U_88E6 +ENCODING 35046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3280 +4100 +6FE0 +4540 +6B00 +1480 +3300 +D4E0 +1840 +ENDCHAR +STARTCHAR U_88E7 +ENCODING 35047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4520 +F540 +2980 +4240 +5D20 +E120 +5540 +4980 +4240 +4C20 +ENDCHAR +STARTCHAR U_88E8 +ENCODING 35048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +FD20 +17E0 +2520 +2FE0 +7100 +AA80 +2FE0 +2080 +2080 +ENDCHAR +STARTCHAR U_88E9 +ENCODING 35049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +1440 +2FC0 +7000 +AC80 +26E0 +2480 +26A0 +24E0 +ENDCHAR +STARTCHAR U_88EA +ENCODING 35050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FE0 +F420 +17A0 +2A20 +77E0 +AA20 +2AA0 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_88EB +ENCODING 35051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AA0 +4AA0 +FAA0 +2EE0 +5820 +6FE0 +D820 +4EE0 +4AA0 +4AA0 +52A0 +ENDCHAR +STARTCHAR U_88EC +ENCODING 35052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +17E0 +2A40 +7520 +ABC0 +2A40 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_88ED +ENCODING 35053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +FFE0 +1520 +2FC0 +7520 +ADE0 +2400 +25C0 +2940 +3260 +ENDCHAR +STARTCHAR U_88EE +ENCODING 35054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FBC0 +1240 +2BC0 +7000 +AFE0 +2C20 +27E0 +2420 +27E0 +ENDCHAR +STARTCHAR U_88EF +ENCODING 35055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4920 +FBA0 +2920 +4BA0 +5820 +EBA0 +5AA0 +4BA0 +4820 +50E0 +ENDCHAR +STARTCHAR U_88F0 +ENCODING 35056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +29A0 +F540 +12A0 +2D20 +7000 +AFE0 +2AA0 +2440 +2AA0 +3120 +ENDCHAR +STARTCHAR U_88F1 +ENCODING 35057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F100 +17C0 +2100 +2FE0 +7320 +ACC0 +3480 +2640 +2420 +ENDCHAR +STARTCHAR U_88F2 +ENCODING 35058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +F100 +1FE0 +2920 +7DA0 +AB60 +3DA0 +2920 +2920 +2860 +ENDCHAR +STARTCHAR U_88F3 +ENCODING 35059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FE0 +50A0 +1F80 +0400 +FFE0 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_88F4 +ENCODING 35060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0400 +FFE0 +0920 +3940 +CA80 +0C60 +ENDCHAR +STARTCHAR U_88F5 +ENCODING 35061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A00 +7BC0 +0A00 +7BC0 +0400 +1AC0 +2900 +CCE0 +0840 +ENDCHAR +STARTCHAR U_88F6 +ENCODING 35062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FEE0 +1280 +2EE0 +7280 +AA80 +2EE0 +2280 +2280 +2280 +ENDCHAR +STARTCHAR U_88F7 +ENCODING 35063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +1200 +2FE0 +7440 +AFA0 +2480 +25A0 +2420 +23E0 +ENDCHAR +STARTCHAR U_88F8 +ENCODING 35064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FFC0 +1540 +2FC0 +7100 +AFE0 +2900 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_88F9 +ENCODING 35065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +2480 +CD60 +3200 +D900 +10E0 +ENDCHAR +STARTCHAR U_88FA +ENCODING 35066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +FA80 +1540 +2FE0 +7540 +AFC0 +2540 +27C0 +2120 +20E0 +ENDCHAR +STARTCHAR U_88FB +ENCODING 35067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +13E0 +FD40 +5880 +9540 +2620 +FFE0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_88FC +ENCODING 35068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7200 +AFE0 +2AA0 +2D20 +2220 +24C0 +ENDCHAR +STARTCHAR U_88FD +ENCODING 35069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5020 +7D20 +9120 +FD20 +1120 +7C60 +5400 +FFE0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_88FE +ENCODING 35070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +FFE0 +1480 +2FE0 +7480 +AC80 +27E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_88FF +ENCODING 35071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F900 +1280 +2FE0 +7040 +A740 +3540 +2740 +2040 +20C0 +ENDCHAR +STARTCHAR U_8900 +ENCODING 35072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +27E0 +FA40 +13C0 +2A40 +73C0 +AA40 +2FE0 +2000 +2240 +2420 +ENDCHAR +STARTCHAR U_8901 +ENCODING 35073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +1500 +E4E0 +1A80 +3100 +D480 +1860 +ENDCHAR +STARTCHAR U_8902 +ENCODING 35074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2F80 +F280 +12C0 +2FA0 +72A0 +AF80 +2A80 +2280 +2380 +2C80 +ENDCHAR +STARTCHAR U_8903 +ENCODING 35075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +25C0 +F500 +1FE0 +2800 +77C0 +AC40 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_8904 +ENCODING 35076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F140 +17E0 +2940 +77C0 +A900 +2FE0 +2240 +2180 +2660 +ENDCHAR +STARTCHAR U_8905 +ENCODING 35077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F440 +2280 +4FE0 +5920 +E7C0 +5540 +4540 +45C0 +4100 +ENDCHAR +STARTCHAR U_8906 +ENCODING 35078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7000 +AFE0 +2500 +25E0 +2B00 +31E0 +ENDCHAR +STARTCHAR U_8907 +ENCODING 35079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F800 +17C0 +2C40 +77C0 +AC40 +27C0 +2C40 +3380 +2C60 +ENDCHAR +STARTCHAR U_8908 +ENCODING 35080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +1100 +2FC0 +7540 +AFC0 +2540 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8909 +ENCODING 35081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4FE0 +F4A0 +2EA0 +44A0 +5F60 +E500 +5FE0 +4100 +4280 +4C60 +ENDCHAR +STARTCHAR U_890A +ENCODING 35082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F820 +2FE0 +4800 +5FE0 +EAA0 +5FE0 +4AA0 +5AA0 +6860 +ENDCHAR +STARTCHAR U_890B +ENCODING 35083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +27E0 +FD40 +15C0 +2C00 +77E0 +A900 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_890C +ENCODING 35084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +F7C0 +1100 +2FC0 +7540 +AFC0 +2540 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_890D +ENCODING 35085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +FD40 +17C0 +3000 +6FE0 +B200 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_890E +ENCODING 35086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2100 +47E0 +7380 +4540 +7D20 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_890F +ENCODING 35087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +3100 +47C0 +7540 +4540 +77C0 +1C80 +3300 +D8E0 +1040 +ENDCHAR +STARTCHAR U_8910 +ENCODING 35088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7200 +AFE0 +2CA0 +2560 +27A0 +2040 +ENDCHAR +STARTCHAR U_8911 +ENCODING 35089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80C0 +4F20 +F540 +2FE0 +5200 +6FE0 +D400 +47C0 +4A40 +5180 +4660 +ENDCHAR +STARTCHAR U_8912 +ENCODING 35090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1440 +27C0 +7100 +AFE0 +2540 +0920 +3480 +D300 +18E0 +ENDCHAR +STARTCHAR U_8913 +ENCODING 35091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +F540 +1DC0 +2480 +6FE0 +B480 +2DC0 +26A0 +2480 +2480 +ENDCHAR +STARTCHAR U_8914 +ENCODING 35092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2000 +FBC0 +1240 +2BC0 +7000 +AFE0 +2520 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_8915 +ENCODING 35093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8380 +4440 +FBA0 +2000 +4EA0 +5AA0 +EEA0 +5AA0 +4EA0 +4A20 +4A60 +ENDCHAR +STARTCHAR U_8916 +ENCODING 35094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83C0 +4440 +F780 +2080 +5FE0 +6220 +DD40 +4280 +4DC0 +42A0 +4D80 +ENDCHAR +STARTCHAR U_8917 +ENCODING 35095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4A40 +FBC0 +2A40 +4BC0 +5900 +EFE0 +5A40 +4980 +4A40 +4FE0 +ENDCHAR +STARTCHAR U_8918 +ENCODING 35096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F940 +17E0 +2240 +2BC0 +7080 +AFE0 +2480 +2FE0 +2080 +ENDCHAR +STARTCHAR U_8919 +ENCODING 35097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +2EC0 +F280 +16E0 +2800 +77C0 +AC40 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_891A +ENCODING 35098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2120 +F7C0 +1140 +2FE0 +7100 +ABC0 +2640 +3BC0 +2240 +23C0 +ENDCHAR +STARTCHAR U_891B +ENCODING 35099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +1380 +2D40 +7120 +AFE0 +2240 +2680 +2140 +2620 +ENDCHAR +STARTCHAR U_891C +ENCODING 35100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +57C0 +7D40 +5740 +74A0 +9BE0 +0400 +FFE0 +3240 +D580 +1860 +ENDCHAR +STARTCHAR U_891D +ENCODING 35101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A20 +2540 +F7C0 +1540 +2FC0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_891E +ENCODING 35102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7000 +AFE0 +2AA0 +2AA0 +2AA0 +3FE0 +ENDCHAR +STARTCHAR U_891F +ENCODING 35103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7000 +AFE0 +2AA0 +2660 +2AA0 +2660 +ENDCHAR +STARTCHAR U_8920 +ENCODING 35104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +17E0 +2280 +6FE0 +B540 +2FC0 +2540 +3FE0 +2440 +ENDCHAR +STARTCHAR U_8921 +ENCODING 35105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +1100 +2A80 +7440 +ABA0 +2000 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8922 +ENCODING 35106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +3FC0 +1220 +EDE0 +1A80 +E900 +0CE0 +ENDCHAR +STARTCHAR U_8923 +ENCODING 35107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +FAA0 +1440 +29A0 +7240 +AC20 +2FC0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_8924 +ENCODING 35108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F100 +1FE0 +2000 +77C0 +A440 +37E0 +2D40 +3680 +2460 +ENDCHAR +STARTCHAR U_8925 +ENCODING 35109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +25C0 +FC00 +17E0 +2DA0 +7540 +AD20 +2FE0 +2640 +2940 +3080 +ENDCHAR +STARTCHAR U_8926 +ENCODING 35110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +84A0 +4AC0 +FF80 +20A0 +4EE0 +5A00 +EEA0 +5AC0 +4E80 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_8927 +ENCODING 35111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +4AA0 +7AC0 +4C80 +7940 +4A20 +FFE0 +1220 +3140 +D680 +1860 +ENDCHAR +STARTCHAR U_8928 +ENCODING 35112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +7100 +AFE0 +3200 +27C0 +2900 +37E0 +ENDCHAR +STARTCHAR U_8929 +ENCODING 35113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4C20 +4BC0 +FE40 +4980 +8A40 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_892A +ENCODING 35114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93C0 +4A40 +E3C0 +3A40 +4BC0 +DA80 +6AA0 +5A40 +4B20 +5400 +63E0 +ENDCHAR +STARTCHAR U_892B +ENCODING 35115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80E0 +4F80 +F880 +2BE0 +4AA0 +5BC0 +EAA0 +5AE0 +4B40 +5540 +6A60 +ENDCHAR +STARTCHAR U_892C +ENCODING 35116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4240 +F180 +2EE0 +5AA0 +6440 +DAA0 +4100 +4FE0 +4540 +4920 +ENDCHAR +STARTCHAR U_892D +ENCODING 35117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4400 +7F80 +4400 +7FC0 +5540 +8AC0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_892E +ENCODING 35118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +4200 +FFE0 +8420 +7FC0 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_892F +ENCODING 35119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +FA40 +2FE0 +4A40 +5BC0 +E880 +5BE0 +4AA0 +4AE0 +5080 +ENDCHAR +STARTCHAR U_8930 +ENCODING 35120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8920 +7FC0 +0900 +FFE0 +2480 +7F40 +9AA0 +2900 +4CE0 +ENDCHAR +STARTCHAR U_8931 +ENCODING 35121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +7FC0 +2480 +1500 +6CC0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_8932 +ENCODING 35122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F880 +2FE0 +4AA0 +5BE0 +EAA0 +5BE0 +4880 +4FE0 +5080 +ENDCHAR +STARTCHAR U_8933 +ENCODING 35123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +57E0 +EAA0 +23E0 +5EA0 +57E0 +E480 +57E0 +4480 +4480 +4BE0 +ENDCHAR +STARTCHAR U_8934 +ENCODING 35124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4A80 +EAE0 +2B00 +4A40 +5220 +E000 +5FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_8935 +ENCODING 35125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +FA80 +1520 +2EA0 +77E0 +A900 +2FE0 +2AA0 +2FE0 +2820 +ENDCHAR +STARTCHAR U_8936 +ENCODING 35126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +4220 +FAA0 +2660 +4AA0 +5100 +E7E0 +5420 +47E0 +4420 +47E0 +ENDCHAR +STARTCHAR U_8937 +ENCODING 35127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4880 +F2E0 +2280 +4FE0 +5880 +EA80 +5AE0 +4A80 +4A80 +4DE0 +ENDCHAR +STARTCHAR U_8938 +ENCODING 35128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +F540 +2FE0 +5540 +6FE0 +D920 +4FE0 +4440 +4380 +4C60 +ENDCHAR +STARTCHAR U_8939 +ENCODING 35129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5D00 +EBC0 +3D40 +5540 +EB40 +5D40 +49C0 +4E60 +5260 +4420 +ENDCHAR +STARTCHAR U_893A +ENCODING 35130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7780 +2280 +FEA0 +52A0 +FD60 +2400 +FFC0 +3280 +D100 +18E0 +ENDCHAR +STARTCHAR U_893B +ENCODING 35131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2100 +FBC0 +5140 +ABC0 +2560 +FA20 +1940 +2A80 +CC60 +ENDCHAR +STARTCHAR U_893C +ENCODING 35132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +FFE0 +2AA0 +4FE0 +5440 +EFA0 +5480 +57A0 +4420 +43E0 +ENDCHAR +STARTCHAR U_893D +ENCODING 35133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4440 +7FE0 +4240 +BD40 +54C0 +FFE0 +0A20 +1940 +EA80 +0C60 +ENDCHAR +STARTCHAR U_893E +ENCODING 35134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4280 +FFE0 +2AA0 +4FE0 +5000 +E7C0 +5000 +4FE0 +4540 +5B20 +ENDCHAR +STARTCHAR U_893F +ENCODING 35135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +F280 +1FE0 +2AA0 +7AA0 +AFE0 +3440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8940 +ENCODING 35136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +2FC0 +7100 +AFE0 +2540 +26C0 +2540 +27C0 +2C60 +ENDCHAR +STARTCHAR U_8941 +ENCODING 35137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8DE0 +4520 +F5E0 +2C80 +4BE0 +5AA0 +EEA0 +57E0 +4480 +44A0 +5BE0 +ENDCHAR +STARTCHAR U_8942 +ENCODING 35138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +47C0 +F440 +2AA0 +4FE0 +5280 +E560 +5A80 +4540 +4280 +4700 +ENDCHAR +STARTCHAR U_8943 +ENCODING 35139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2440 +47C0 +7100 +47E0 +6B40 +1560 +3280 +D900 +10C0 +ENDCHAR +STARTCHAR U_8944 +ENCODING 35140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4A40 +7BC0 +1100 +7FC0 +1100 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_8945 +ENCODING 35141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +FFE0 +1920 +2FE0 +7540 +AFE0 +2540 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_8946 +ENCODING 35142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AA0 +46C0 +FFE0 +2280 +4FE0 +5100 +E7C0 +5100 +4FE0 +4280 +4C60 +ENDCHAR +STARTCHAR U_8947 +ENCODING 35143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FEE0 +2AA0 +3FE0 +6AA0 +BBA0 +2AA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_8948 +ENCODING 35144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2B40 +FFC0 +1920 +2FE0 +7280 +AFE0 +2280 +2FE0 +2440 +2820 +ENDCHAR +STARTCHAR U_8949 +ENCODING 35145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +4AA0 +EEE0 +2AA0 +4FE0 +5AA0 +EBA0 +5AA0 +4BA0 +4AA0 +4DE0 +ENDCHAR +STARTCHAR U_894A +ENCODING 35146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F7C0 +2440 +5FE0 +DA00 +6FE0 +5B20 +4EC0 +5AC0 +4320 +ENDCHAR +STARTCHAR U_894B +ENCODING 35147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5FE0 +E480 +3FE0 +55A0 +55A0 +F5E0 +4EC0 +55A0 +66A0 +4480 +ENDCHAR +STARTCHAR U_894C +ENCODING 35148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +FFE0 +1540 +2FC0 +7540 +AFC0 +2100 +2FE0 +2100 +2100 +ENDCHAR +STARTCHAR U_894D +ENCODING 35149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +27C0 +FD00 +17C0 +2D00 +77C0 +AD00 +2FE0 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_894E +ENCODING 35150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F40 +FA80 +2FC0 +3680 +6A60 +AFC0 +2A40 +2FC0 +2A40 +2FC0 +ENDCHAR +STARTCHAR U_894F +ENCODING 35151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F40 +4A80 +E4A0 +2840 +5DC0 +5560 +EC00 +5BC0 +4D40 +4480 +5B60 +ENDCHAR +STARTCHAR U_8950 +ENCODING 35152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83C0 +4480 +FFE0 +2920 +4FE0 +5220 +ED40 +5280 +4DC0 +42A0 +4D20 +ENDCHAR +STARTCHAR U_8951 +ENCODING 35153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4040 +F7C0 +2040 +4FE0 +5520 +EFE0 +5080 +4FE0 +4880 +4580 +ENDCHAR +STARTCHAR U_8952 +ENCODING 35154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9540 +4E40 +E440 +3F60 +55A0 +7520 +DFA0 +7540 +5540 +55A0 +5120 +ENDCHAR +STARTCHAR U_8953 +ENCODING 35155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +E100 +2FE0 +4440 +5EE0 +E440 +5FE0 +4280 +44A0 +5860 +ENDCHAR +STARTCHAR U_8954 +ENCODING 35156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +F240 +23C0 +3100 +6FE0 +B920 +2DA0 +2B60 +2920 +2960 +ENDCHAR +STARTCHAR U_8955 +ENCODING 35157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +23E0 +F920 +1FE0 +2920 +7FE0 +AD60 +2FE0 +2BA0 +2D60 +2920 +ENDCHAR +STARTCHAR U_8956 +ENCODING 35158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +ED40 +2B40 +4FC0 +5B40 +EDC0 +5940 +4FE0 +4280 +5C60 +ENDCHAR +STARTCHAR U_8957 +ENCODING 35159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +FFE0 +17C0 +3100 +6FE0 +B280 +2FE0 +2100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_8958 +ENCODING 35160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2440 +FBA0 +1000 +2FE0 +7AA0 +AFE0 +3440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_8959 +ENCODING 35161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4440 +F7C0 +2000 +4EE0 +5AA0 +EEE0 +5100 +4FE0 +4540 +4920 +ENDCHAR +STARTCHAR U_895A +ENCODING 35162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9440 +4A80 +E7E0 +2120 +52C0 +5D80 +EAC0 +4DA0 +4AA0 +5500 +63E0 +ENDCHAR +STARTCHAR U_895B +ENCODING 35163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4FE0 +EAA0 +2FE0 +4AA0 +5FE0 +E800 +5FE0 +4AA0 +4A40 +5720 +ENDCHAR +STARTCHAR U_895C +ENCODING 35164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +F7E0 +1D40 +27E0 +6C00 +B7E0 +2C00 +27E0 +2A20 +33E0 +ENDCHAR +STARTCHAR U_895D +ENCODING 35165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8300 +4480 +E840 +37A0 +4000 +5EE0 +EAA0 +5EE0 +4440 +4AA0 +5120 +ENDCHAR +STARTCHAR U_895E +ENCODING 35166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +4080 +7BE0 +A880 +FFE0 +0A40 +3180 +D480 +1860 +ENDCHAR +STARTCHAR U_895F +ENCODING 35167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +4FE0 +E440 +2EE0 +5540 +57C0 +E000 +5FE0 +4580 +4940 +5320 +ENDCHAR +STARTCHAR U_8960 +ENCODING 35168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +1AA0 +2380 +6800 +B7E0 +2D20 +27E0 +2520 +27E0 +ENDCHAR +STARTCHAR U_8961 +ENCODING 35169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5540 +FFC0 +2400 +47E0 +5A20 +EFA0 +5AA0 +4FA0 +42A0 +4FC0 +ENDCHAR +STARTCHAR U_8962 +ENCODING 35170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +FBA0 +2820 +4FE0 +5000 +E7C0 +5440 +47C0 +4440 +5FE0 +ENDCHAR +STARTCHAR U_8963 +ENCODING 35171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +F440 +2FE0 +4920 +5FE0 +E920 +5FE0 +5240 +4440 +4840 +ENDCHAR +STARTCHAR U_8964 +ENCODING 35172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4A80 +FEE0 +2980 +4F40 +5A20 +EA00 +5FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_8965 +ENCODING 35173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +2EC0 +EFE0 +3A80 +5FC0 +E900 +5BC0 +4900 +4FE0 +4A80 +4C60 +ENDCHAR +STARTCHAR U_8966 +ENCODING 35174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4100 +EFE0 +2920 +4540 +5920 +EFE0 +5200 +4FE0 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_8967 +ENCODING 35175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +F920 +2FE0 +5D60 +EBA0 +5D60 +4BA0 +4D60 +4920 +4860 +ENDCHAR +STARTCHAR U_8968 +ENCODING 35176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAA0 +5B20 +EA20 +3FE0 +4A20 +DFA0 +6460 +5F20 +4420 +47A0 +5840 +ENDCHAR +STARTCHAR U_8969 +ENCODING 35177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F100 +2FE0 +4AA0 +5FE0 +E440 +57C0 +4440 +47C0 +4C60 +ENDCHAR +STARTCHAR U_896A +ENCODING 35178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4FE0 +F280 +2FE0 +4AA0 +5FE0 +E140 +5FE0 +4D40 +4AA0 +5360 +ENDCHAR +STARTCHAR U_896B +ENCODING 35179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +F540 +2FE0 +4920 +5FE0 +E920 +5FE0 +4280 +4440 +4820 +ENDCHAR +STARTCHAR U_896C +ENCODING 35180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +FFE0 +24A0 +4AC0 +5FA0 +EAE0 +5EA0 +4AC0 +4EA0 +4AE0 +ENDCHAR +STARTCHAR U_896D +ENCODING 35181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +4E80 +F5E0 +2520 +4FE0 +5120 +EFE0 +5B20 +4BE0 +4EC0 +4920 +ENDCHAR +STARTCHAR U_896E +ENCODING 35182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4440 +F7C0 +2440 +4FE0 +5280 +EFE0 +5540 +5BA0 +4540 +4B20 +ENDCHAR +STARTCHAR U_896F +ENCODING 35183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +85E0 +4F20 +EBE0 +2520 +5FE0 +5520 +EFE0 +5440 +4EC0 +5540 +6E60 +ENDCHAR +STARTCHAR U_8970 +ENCODING 35184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +5EE0 +E540 +3FE0 +55A0 +FFE0 +44A0 +4EE0 +55A0 +64E0 +44A0 +ENDCHAR +STARTCHAR U_8971 +ENCODING 35185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +84E0 +4E80 +FAE0 +2420 +4EE0 +5A80 +EEE0 +5A80 +4EE0 +4AA0 +4AE0 +ENDCHAR +STARTCHAR U_8972 +ENCODING 35186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +53E0 +FC20 +4BE0 +7A00 +4A20 +FFE0 +3140 +DC80 +1060 +ENDCHAR +STARTCHAR U_8973 +ENCODING 35187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +55A0 +FFE0 +2A80 +5B80 +4AA0 +FBA0 +4AA0 +5BC0 +4AA0 +5F60 +ENDCHAR +STARTCHAR U_8974 +ENCODING 35188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8EE0 +4AA0 +EEE0 +2AA0 +4EE0 +5920 +EFE0 +5AA0 +4FE0 +4BA0 +4D60 +ENDCHAR +STARTCHAR U_8975 +ENCODING 35189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +22C0 +F340 +1FE0 +2040 +7FE0 +AAA0 +2EE0 +2AA0 +3FE0 +2220 +ENDCHAR +STARTCHAR U_8976 +ENCODING 35190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +22A0 +FFE0 +2A80 +4F80 +DAA0 +6FA0 +5AC0 +4FA0 +4AE0 +5120 +ENDCHAR +STARTCHAR U_8977 +ENCODING 35191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4600 +2B60 +FA20 +1D60 +2920 +7FE0 +A540 +2FE0 +3100 +2FE0 +2100 +ENDCHAR +STARTCHAR U_8978 +ENCODING 35192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +F540 +2FE0 +5AA0 +E7C0 +5540 +46C0 +4540 +47C0 +4C60 +ENDCHAR +STARTCHAR U_8979 +ENCODING 35193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4000 +FFE0 +2AA0 +5FE0 +54A0 +FFE0 +5480 +56E0 +5480 +6EE0 +ENDCHAR +STARTCHAR U_897A +ENCODING 35194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8280 +4FE0 +F280 +2FE0 +4B20 +5DE0 +EB20 +5DE0 +4F60 +4DE0 +4B20 +ENDCHAR +STARTCHAR U_897B +ENCODING 35195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +5D60 +EAC0 +3D60 +4AC0 +5FE0 +E540 +5FE0 +4100 +5FE0 +4300 +ENDCHAR +STARTCHAR U_897C +ENCODING 35196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4480 +FFE0 +24A0 +4FA0 +5560 +EFA0 +5000 +5FE0 +4240 +4FA0 +ENDCHAR +STARTCHAR U_897D +ENCODING 35197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +FAA0 +1EE0 +2AA0 +7FE0 +AD60 +2FE0 +2BA0 +2D60 +2920 +ENDCHAR +STARTCHAR U_897E +ENCODING 35198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +0900 +7FE0 +4920 +4920 +4920 +4F20 +4920 +4020 +4020 +ENDCHAR +STARTCHAR U_897F +ENCODING 35199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +4A40 +5240 +61C0 +4040 +7FC0 +4040 +ENDCHAR +STARTCHAR U_8980 +ENCODING 35200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 5 0 4 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_8981 +ENCODING 35201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0800 +FFE0 +1100 +3A00 +0F00 +70C0 +ENDCHAR +STARTCHAR U_8982 +ENCODING 35202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0080 +7F00 +0400 +7F80 +1800 +E7E0 +ENDCHAR +STARTCHAR U_8983 +ENCODING 35203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8984 +ENCODING 35204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +1500 +2480 +7FE0 +A600 +2980 +3060 +ENDCHAR +STARTCHAR U_8985 +ENCODING 35205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +2900 +FFE0 +AAA0 +FEA0 +2120 +FE60 +4460 +28A0 +1920 +E6C0 +ENDCHAR +STARTCHAR U_8986 +ENCODING 35206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FE0 +CD40 +3540 +E7C0 +2A80 +3100 +2EE0 +ENDCHAR +STARTCHAR U_8987 +ENCODING 35207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +2800 +FFC0 +2A40 +7FC0 +5640 +FFC0 +1240 +14C0 +ENDCHAR +STARTCHAR U_8988 +ENCODING 35208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +2100 +7BE0 +4D40 +7940 +2080 +FC80 +4940 +9A20 +ENDCHAR +STARTCHAR U_8989 +ENCODING 35209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +2900 +FFE0 +2A80 +7FE0 +5740 +7D40 +FF40 +10C0 +ENDCHAR +STARTCHAR U_898A +ENCODING 35210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4A40 +7FC0 +5000 +FFC0 +5480 +FFC0 +AC80 +FFE0 +FAA0 +2560 +ENDCHAR +STARTCHAR U_898B +ENCODING 35211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_898C +ENCODING 35212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +17C0 +9440 +57C0 +2440 +57C0 +4A80 +8280 +04A0 +0860 +ENDCHAR +STARTCHAR U_898D +ENCODING 35213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +4440 +BFA0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +1220 +E1E0 +ENDCHAR +STARTCHAR U_898E +ENCODING 35214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8840 +F880 +8880 +FBE0 +8880 +F880 +5280 +5120 +5020 +8FC0 +ENDCHAR +STARTCHAR U_898F +ENCODING 35215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +2440 +27C0 +FC40 +27C0 +3280 +2AA0 +44A0 +8860 +ENDCHAR +STARTCHAR U_8990 +ENCODING 35216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4540 +7C80 +4540 +7E20 +4540 +7C80 +2940 +2A20 +47E0 +8000 +ENDCHAR +STARTCHAR U_8991 +ENCODING 35217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +5440 +57C0 +7C40 +47C0 +7440 +57C0 +5280 +5280 +94A0 +0860 +ENDCHAR +STARTCHAR U_8992 +ENCODING 35218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +E440 +3FC0 +E440 +3FC0 +E440 +27C0 +2280 +3280 +24A0 +0860 +ENDCHAR +STARTCHAR U_8993 +ENCODING 35219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +FE40 +4480 +3F80 +2080 +3E80 +2F80 +2080 +3FA0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_8994 +ENCODING 35220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0E00 +3580 +C460 +3F80 +2A80 +3480 +3F80 +0A00 +1220 +61E0 +ENDCHAR +STARTCHAR U_8995 +ENCODING 35221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +1A20 +2BE0 +2A20 +ABE0 +AE20 +B3E0 +2540 +2540 +5940 +8660 +ENDCHAR +STARTCHAR U_8996 +ENCODING 35222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +27C0 +7440 +AFC0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_8997 +ENCODING 35223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A20 +EBE0 +0A20 +EA20 +ABE0 +AA20 +EBE0 +0940 +3940 +1660 +ENDCHAR +STARTCHAR U_8998 +ENCODING 35224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7FC0 +4440 +47C0 +F440 +97C0 +9280 +F280 +94A0 +0860 +ENDCHAR +STARTCHAR U_8999 +ENCODING 35225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7E40 +4BC0 +9240 +13C0 +5A40 +97C0 +1280 +1280 +54A0 +2860 +ENDCHAR +STARTCHAR U_899A +ENCODING 35226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +7FE0 +8020 +3F80 +2580 +2A80 +3480 +3F80 +1220 +61E0 +ENDCHAR +STARTCHAR U_899B +ENCODING 35227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E220 +8BE0 +B220 +A3E0 +B620 +AA20 +ABE0 +A540 +B140 +A660 +ENDCHAR +STARTCHAR U_899C +ENCODING 35228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +AA20 +6FE0 +2A20 +2BE0 +6E20 +AA20 +2BE0 +2D40 +4940 +8260 +ENDCHAR +STARTCHAR U_899D +ENCODING 35229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +FFE0 +2220 +23E0 +0220 +A7E0 +A880 +3180 +4AA0 +84E0 +ENDCHAR +STARTCHAR U_899E +ENCODING 35230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8A20 +FBE0 +5080 +54A0 +59A0 +96E0 +ENDCHAR +STARTCHAR U_899F +ENCODING 35231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +FFE0 +1220 +7FE0 +1220 +2BE0 +A680 +A880 +39A0 +06E0 +ENDCHAR +STARTCHAR U_89A0 +ENCODING 35232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +2A40 +FFC0 +2A40 +7BC0 +2240 +7BC0 +AA80 +2AA0 +3CA0 +0860 +ENDCHAR +STARTCHAR U_89A1 +ENCODING 35233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +1120 +55E0 +5520 +55E0 +BB20 +1120 +11E0 +1CC0 +E140 +4260 +ENDCHAR +STARTCHAR U_89A2 +ENCODING 35234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +B240 +A3C0 +5240 +ABC0 +2240 +2BC0 +B080 +A1A0 +52A0 +8C60 +ENDCHAR +STARTCHAR U_89A3 +ENCODING 35235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +FBC0 +2240 +73C0 +AA40 +23C0 +FC80 +49A0 +32A0 +CC60 +ENDCHAR +STARTCHAR U_89A4 +ENCODING 35236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +1120 +7DE0 +5520 +79E0 +5520 +5DE0 +4040 +B8C0 +AD40 +4A60 +ENDCHAR +STARTCHAR U_89A5 +ENCODING 35237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +2A40 +FFC0 +AA40 +FFC0 +AA40 +FFC0 +0180 +52A0 +4AA0 +8460 +ENDCHAR +STARTCHAR U_89A6 +ENCODING 35238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31E0 +4920 +B5E0 +0120 +E5E0 +AD20 +EDE0 +AC40 +E4C0 +A540 +AE60 +ENDCHAR +STARTCHAR U_89A7 +ENCODING 35239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FA00 +A3C0 +F200 +9500 +FE80 +A200 +FE00 +2200 +3E00 +1480 +E780 +ENDCHAR +STARTCHAR U_89A8 +ENCODING 35240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +B640 +FFC0 +0240 +7BC0 +0240 +FFC0 +2180 +3980 +0AA0 +34E0 +ENDCHAR +STARTCHAR U_89A9 +ENCODING 35241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7E40 +2BC0 +FE40 +23C0 +7A40 +CBC0 +7980 +4AA0 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_89AA +ENCODING 35242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FE20 +4BE0 +2A20 +FFE0 +1220 +7FE0 +1080 +39A0 +56A0 +B460 +ENDCHAR +STARTCHAR U_89AB +ENCODING 35243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +7E40 +2BC0 +FE40 +93C0 +7E40 +23C0 +3980 +2A80 +6AA0 +9460 +ENDCHAR +STARTCHAR U_89AC +ENCODING 35244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +FA20 +03E0 +FA20 +03E0 +FA20 +8BE0 +F940 +8940 +5240 +FC60 +ENDCHAR +STARTCHAR U_89AD +ENCODING 35245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8620 +7BE0 +4A20 +7BE0 +4A20 +7BE0 +20C0 +FD40 +5240 +8C60 +ENDCHAR +STARTCHAR U_89AE +ENCODING 35246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +1080 +2940 +FFE0 +A0A0 +3F80 +2080 +3F80 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_89AF +ENCODING 35247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +53E0 +FE20 +53E0 +FE20 +ABE0 +F940 +A940 +FE40 +8C60 +ENDCHAR +STARTCHAR U_89B0 +ENCODING 35248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C00 +13C0 +7E40 +53C0 +7E40 +57C0 +7A40 +6BC0 +7980 +AAA0 +7C60 +ENDCHAR +STARTCHAR U_89B1 +ENCODING 35249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +ABE0 +FA40 +AA40 +FFC0 +2080 +3F80 +2080 +3FA0 +E1E0 +ENDCHAR +STARTCHAR U_89B2 +ENCODING 35250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +53E0 +2220 +FBE0 +AA20 +FBE0 +2080 +F980 +22A0 +FCE0 +ENDCHAR +STARTCHAR U_89B3 +ENCODING 35251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9240 +FFC0 +2240 +4BC0 +FE40 +4BC0 +7D80 +4AA0 +7CE0 +ENDCHAR +STARTCHAR U_89B4 +ENCODING 35252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EBC0 +AE40 +47C0 +BA40 +03C0 +7A40 +4BC0 +7A80 +4A80 +34A0 +C860 +ENDCHAR +STARTCHAR U_89B5 +ENCODING 35253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEE0 +AAA0 +FEE0 +AAA0 +BAE0 +AA40 +BAC0 +CB40 +8660 +ENDCHAR +STARTCHAR U_89B6 +ENCODING 35254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F520 +A9E0 +FD20 +51E0 +FD20 +A5E0 +F440 +D4C0 +A540 +D660 +ENDCHAR +STARTCHAR U_89B7 +ENCODING 35255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +39E0 +2120 +FDE0 +A520 +F9E0 +A520 +BDE0 +A840 +ECC0 +A940 +FE60 +ENDCHAR +STARTCHAR U_89B8 +ENCODING 35256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +EEE0 +AAA0 +FEE0 +AAA0 +BAE0 +AA40 +BAC0 +8340 +8660 +ENDCHAR +STARTCHAR U_89B9 +ENCODING 35257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +BA80 +EFE0 +B8A0 +EFA0 +A8A0 +EFA0 +4DA0 +5D40 +E9A0 +48A0 +ENDCHAR +STARTCHAR U_89BA +ENCODING 35258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +4440 +FFE0 +A0A0 +3E80 +2F80 +20A0 +3FA0 +F1E0 +ENDCHAR +STARTCHAR U_89BB +ENCODING 35259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1240 +7FC0 +5240 +7BC0 +5640 +7FC0 +6980 +7AA0 +92A0 +BC60 +ENDCHAR +STARTCHAR U_89BC +ENCODING 35260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +54A0 +92E0 +FEA0 +D6E0 +BAA0 +D6E0 +BA40 +D6C0 +9340 +9660 +ENDCHAR +STARTCHAR U_89BD +ENCODING 35261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE00 +A3E0 +FC80 +ABE0 +FFA0 +20E0 +3F80 +2080 +3FA0 +1220 +E3E0 +ENDCHAR +STARTCHAR U_89BE +ENCODING 35262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +55E0 +FF20 +55E0 +9320 +7DE0 +5440 +7CC0 +5540 +7E60 +ENDCHAR +STARTCHAR U_89BF +ENCODING 35263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +11E0 +FF20 +ABE0 +FF20 +45E0 +7C40 +44C0 +7D40 +C660 +ENDCHAR +STARTCHAR U_89C0 +ENCODING 35264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2A20 +EFE0 +AA20 +EFE0 +5220 +7FE0 +D140 +7D40 +5140 +7E60 +ENDCHAR +STARTCHAR U_89C1 +ENCODING 35265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2480 +2480 +2480 +2480 +2480 +0A00 +1220 +2220 +C1E0 +ENDCHAR +STARTCHAR U_89C2 +ENCODING 35266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F440 +1540 +9540 +5540 +2540 +2540 +5180 +52A0 +84A0 +1860 +ENDCHAR +STARTCHAR U_89C3 +ENCODING 35267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5480 +57E0 +5480 +5480 +3080 +2A80 +4920 +4820 +87E0 +ENDCHAR +STARTCHAR U_89C4 +ENCODING 35268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FD40 +2540 +2540 +FD40 +2540 +3180 +2AA0 +44A0 +9860 +ENDCHAR +STARTCHAR U_89C5 +ENCODING 35269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C40 +2480 +1500 +3F80 +2080 +2480 +2680 +26A0 +0A20 +F1E0 +ENDCHAR +STARTCHAR U_89C6 +ENCODING 35270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F540 +1540 +2540 +7540 +A540 +2100 +2320 +2520 +28E0 +ENDCHAR +STARTCHAR U_89C7 +ENCODING 35271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7540 +4540 +4540 +F540 +9540 +9180 +F2A0 +94A0 +0860 +ENDCHAR +STARTCHAR U_89C8 +ENCODING 35272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +53E0 +5480 +5040 +3F80 +2080 +2480 +2480 +24A0 +1A20 +E3E0 +ENDCHAR +STARTCHAR U_89C9 +ENCODING 35273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +1280 +7FE0 +4020 +9F80 +1080 +1480 +1480 +14A0 +0A20 +73E0 +ENDCHAR +STARTCHAR U_89CA +ENCODING 35274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +AA20 +FAA0 +02A0 +FAA0 +0AA0 +7AA0 +4080 +51A0 +62A0 +44E0 +ENDCHAR +STARTCHAR U_89CB +ENCODING 35275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1220 +56A0 +56A0 +5AA0 +B2A0 +92A0 +1280 +1DA0 +E2A0 +4460 +ENDCHAR +STARTCHAR U_89CC +ENCODING 35276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FE20 +12A0 +FEA0 +56A0 +B2A0 +52A0 +F880 +11A0 +2AA0 +C4E0 +ENDCHAR +STARTCHAR U_89CD +ENCODING 35277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +2BE0 +FE20 +AAA0 +FEA0 +AAA0 +FEA0 +0180 +4980 +86A0 +0460 +ENDCHAR +STARTCHAR U_89CE +ENCODING 35278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +4620 +BAA0 +02A0 +EAA0 +AAA0 +EAA0 +AA80 +EBA0 +A2A0 +A6E0 +ENDCHAR +STARTCHAR U_89CF +ENCODING 35279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +52A0 +FAA0 +52A0 +FEA0 +AAA0 +F880 +A9A0 +FEA0 +98E0 +ENDCHAR +STARTCHAR U_89D0 +ENCODING 35280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FE20 +52A0 +22A0 +FAA0 +AAA0 +FAA0 +2080 +F8A0 +21A0 +FEE0 +ENDCHAR +STARTCHAR U_89D1 +ENCODING 35281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2220 +FEA0 +A2A0 +FAA0 +A6A0 +BAA0 +AC80 +E9A0 +BAA0 +E4E0 +ENDCHAR +STARTCHAR U_89D2 +ENCODING 35282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +2440 +4540 +8080 +ENDCHAR +STARTCHAR U_89D3 +ENCODING 35283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7920 +5120 +FD20 +5520 +7D20 +5560 +7FA0 +5520 +5420 +9420 +ENDCHAR +STARTCHAR U_89D4 +ENCODING 35284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3C80 +4880 +FFE0 +54A0 +7CA0 +54A0 +7CA0 +54A0 +5520 +9E60 +ENDCHAR +STARTCHAR U_89D5 +ENCODING 35285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +A3C0 +A480 +FFE0 +A4A0 +37E0 +64A0 +A7E0 +24A0 +24A0 +28E0 +ENDCHAR +STARTCHAR U_89D6 +ENCODING 35286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +53C0 +FD40 +5540 +7FE0 +5500 +7D80 +5540 +5620 +8C20 +ENDCHAR +STARTCHAR U_89D7 +ENCODING 35287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9280 +FA80 +ABE0 +FA80 +AA80 +FA80 +AAA0 +AB60 +9220 +ENDCHAR +STARTCHAR U_89D8 +ENCODING 35288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9140 +FB20 +AB20 +FD40 +A940 +F880 +A900 +AA00 +9400 +ENDCHAR +STARTCHAR U_89D9 +ENCODING 35289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7920 +5140 +FD40 +5560 +7D20 +5520 +7DA0 +5640 +54A0 +9520 +ENDCHAR +STARTCHAR U_89DA +ENCODING 35290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7FC0 +5540 +FD40 +5540 +7D40 +5540 +7D40 +55A0 +55E0 +9540 +ENDCHAR +STARTCHAR U_89DB +ENCODING 35291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +5220 +FE20 +57E0 +7E20 +5620 +7FE0 +5400 +5400 +9FE0 +ENDCHAR +STARTCHAR U_89DC +ENCODING 35292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +5F80 +5220 +FFE0 +1100 +3FC0 +2440 +3FC0 +2440 +7FC0 +84C0 +ENDCHAR +STARTCHAR U_89DD +ENCODING 35293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8020 +F3C0 +A280 +FA80 +ABE0 +FA80 +AA80 +FAA0 +AB60 +AAA0 +9CA0 +ENDCHAR +STARTCHAR U_89DE +ENCODING 35294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +F3E0 +A400 +FBC0 +A880 +FBE0 +A960 +FAA0 +AD20 +AA20 +9CC0 +ENDCHAR +STARTCHAR U_89DF +ENCODING 35295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +53E0 +FC80 +57E0 +7C80 +5480 +7FE0 +5480 +5480 +8FE0 +ENDCHAR +STARTCHAR U_89E0 +ENCODING 35296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7FE0 +0800 +FFE0 +5240 +BFE0 +6440 +3FC0 +2440 +7FC0 +84C0 +ENDCHAR +STARTCHAR U_89E1 +ENCODING 35297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +5120 +FEC0 +5540 +7E20 +55E0 +7D20 +5520 +55E0 +8D20 +ENDCHAR +STARTCHAR U_89E2 +ENCODING 35298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +2220 +FEC0 +2900 +3FC0 +6440 +3FC0 +2440 +3FC0 +C4C0 +ENDCHAR +STARTCHAR U_89E3 +ENCODING 35299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7920 +5220 +FCC0 +5680 +7FE0 +5480 +7FE0 +5480 +5480 +8C80 +ENDCHAR +STARTCHAR U_89E4 +ENCODING 35300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +5240 +FFE0 +5400 +7DE0 +5520 +7D60 +5500 +5520 +8CE0 +ENDCHAR +STARTCHAR U_89E5 +ENCODING 35301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +7AA0 +52C0 +FC80 +57E0 +7D40 +5540 +7D40 +5540 +5640 +9460 +ENDCHAR +STARTCHAR U_89E6 +ENCODING 35302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9080 +FBE0 +AAA0 +FAA0 +ABE0 +F880 +A8A0 +A8E0 +9BA0 +ENDCHAR +STARTCHAR U_89E7 +ENCODING 35303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3D40 +4BE0 +FC80 +55C0 +7C80 +5480 +7FE0 +5480 +5480 +8C80 +ENDCHAR +STARTCHAR U_89E8 +ENCODING 35304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4880 +FC80 +57E0 +7C80 +57A0 +7DC0 +56A0 +54A0 +8D80 +ENDCHAR +STARTCHAR U_89E9 +ENCODING 35305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +38A0 +53E0 +FC80 +56A0 +7DA0 +54C0 +7DC0 +56A0 +54A0 +8D80 +ENDCHAR +STARTCHAR U_89EA +ENCODING 35306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3FE0 +4A20 +FD40 +57E0 +7C80 +5480 +7FE0 +5480 +5480 +8C80 +ENDCHAR +STARTCHAR U_89EB +ENCODING 35307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3BE0 +5080 +FFE0 +54A0 +7FE0 +5480 +7DC0 +56A0 +54A0 +8C80 +ENDCHAR +STARTCHAR U_89EC +ENCODING 35308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3A60 +5220 +FF60 +5620 +7E20 +57E0 +7D40 +5540 +5540 +8E60 +ENDCHAR +STARTCHAR U_89ED +ENCODING 35309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9140 +FA20 +AFE0 +F820 +ABA0 +FAA0 +ABA0 +A820 +A860 +ENDCHAR +STARTCHAR U_89EE +ENCODING 35310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +F900 +AD40 +FB80 +AD40 +A920 +9B00 +ENDCHAR +STARTCHAR U_89EF +ENCODING 35311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +53E0 +FEA0 +57E0 +7EA0 +57E0 +7E80 +57E0 +5480 +8C80 +ENDCHAR +STARTCHAR U_89F0 +ENCODING 35312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +7BE0 +50A0 +FFE0 +5480 +7DE0 +5720 +7DE0 +5520 +55E0 +8D20 +ENDCHAR +STARTCHAR U_89F1 +ENCODING 35313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +7FE0 +5500 +5D40 +41A0 +9EE0 +2420 +FFC0 +2240 +3FC0 +C2C0 +ENDCHAR +STARTCHAR U_89F2 +ENCODING 35314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +5080 +FDE0 +5480 +7DE0 +5680 +7FE0 +5680 +57E0 +8C80 +ENDCHAR +STARTCHAR U_89F3 +ENCODING 35315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +FD40 +8660 +F800 +49C0 +7D40 +D540 +7C80 +5540 +8E20 +ENDCHAR +STARTCHAR U_89F4 +ENCODING 35316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +73E0 +A640 +FBC0 +AA40 +FFE0 +AA00 +FFE0 +AAA0 +AD20 +9AC0 +ENDCHAR +STARTCHAR U_89F5 +ENCODING 35317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +9140 +FFE0 +A880 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +9620 +ENDCHAR +STARTCHAR U_89F6 +ENCODING 35318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F5A0 +A7E0 +FAA0 +ABE0 +FAA0 +ABE0 +F880 +AFE0 +A880 +9880 +ENDCHAR +STARTCHAR U_89F7 +ENCODING 35319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +FFE0 +9220 +3FC0 +6440 +3FC0 +2440 +3FC0 +44C0 +ENDCHAR +STARTCHAR U_89F8 +ENCODING 35320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +7D40 +AFC0 +F200 +AFE0 +F920 +AFE0 +FD60 +AFE0 +A920 +9FE0 +ENDCHAR +STARTCHAR U_89F9 +ENCODING 35321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3BE0 +5480 +FFE0 +5480 +7FE0 +5400 +7F60 +55A0 +5420 +9460 +ENDCHAR +STARTCHAR U_89FA +ENCODING 35322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +73E0 +4940 +7FE0 +A280 +FAE0 +5780 +8960 +7FC0 +2440 +3FC0 +C440 +ENDCHAR +STARTCHAR U_89FB +ENCODING 35323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7BC0 +AEA0 +FBC0 +AEA0 +FBE0 +A900 +FFE0 +AB80 +AD40 +9920 +ENDCHAR +STARTCHAR U_89FC +ENCODING 35324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +77E0 +A6A0 +FFE0 +AA40 +FBC0 +AA40 +FBE0 +AE40 +A980 +AE60 +ENDCHAR +STARTCHAR U_89FD +ENCODING 35325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +5BE0 +9280 +27E0 +FA80 +ABE0 +F800 +AB60 +FAA0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_89FE +ENCODING 35326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +A240 +FBC0 +A800 +FFE0 +A940 +FFE0 +AD40 +AAA0 +9AA0 +ENDCHAR +STARTCHAR U_89FF +ENCODING 35327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +77E0 +A280 +FBE0 +AE80 +FBE0 +AA80 +FFE0 +AE60 +ADA0 +9DA0 +ENDCHAR +STARTCHAR U_8A00 +ENCODING 35328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A01 +ENCODING 35329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +20 +10 +FC +00 +78 +00 +78 +00 +78 +48 +78 +ENDCHAR +STARTCHAR U_8A02 +ENCODING 35330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +0080 +F080 +0080 +F080 +0080 +F080 +9080 +F080 +9380 +ENDCHAR +STARTCHAR U_8A03 +ENCODING 35331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FD00 +0100 +7900 +0180 +7940 +0120 +7920 +4900 +7900 +4900 +ENDCHAR +STARTCHAR U_8A04 +ENCODING 35332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +27E0 +F800 +2BC0 +2800 +2BC0 +2A40 +2BC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_8A05 +ENCODING 35333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FA00 +0780 +7280 +0280 +7280 +0280 +7280 +54A0 +7860 +ENDCHAR +STARTCHAR U_8A06 +ENCODING 35334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +2120 +FD20 +0120 +7920 +0120 +79E0 +0120 +7820 +4820 +7820 +ENDCHAR +STARTCHAR U_8A07 +ENCODING 35335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4820 +8420 +3F20 +0020 +3F20 +0020 +3F20 +2120 +3FC0 +ENDCHAR +STARTCHAR U_8A08 +ENCODING 35336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1080 +FC80 +0080 +7FE0 +0080 +7880 +0080 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8A09 +ENCODING 35337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2380 +FE80 +0280 +7A80 +0380 +7A80 +0280 +7AA0 +4AA0 +7C60 +ENDCHAR +STARTCHAR U_8A0A +ENCODING 35338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F240 +0240 +F240 +0240 +FFC0 +0240 +F240 +9260 +F260 +9220 +ENDCHAR +STARTCHAR U_8A0B +ENCODING 35339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FBE0 +0420 +7820 +0220 +7920 +0120 +7820 +4820 +78C0 +ENDCHAR +STARTCHAR U_8A0C +ENCODING 35340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +0100 +F100 +0100 +F100 +0100 +F100 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A0D +ENCODING 35341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FA20 +0320 +7AA0 +0140 +7940 +0080 +7980 +4A40 +7C20 +ENDCHAR +STARTCHAR U_8A0E +ENCODING 35342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +1040 +FC40 +03E0 +7840 +0240 +7940 +0040 +7840 +4840 +78C0 +ENDCHAR +STARTCHAR U_8A0F +ENCODING 35343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1080 +F880 +0080 +7FE0 +0080 +7880 +0080 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_8A10 +ENCODING 35344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2080 +F880 +0080 +7FE0 +0080 +7880 +0080 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8A11 +ENCODING 35345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F2A0 +02E0 +F3A0 +0EA0 +F2A0 +02E0 +F280 +9220 +F220 +91E0 +ENDCHAR +STARTCHAR U_8A12 +ENCODING 35346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F0A0 +00A0 +F2A0 +02A0 +F2A0 +04A0 +F120 +9120 +F2E0 +9440 +ENDCHAR +STARTCHAR U_8A13 +ENCODING 35347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F2A0 +02A0 +F2A0 +02A0 +F2A0 +02A0 +F2A0 +92A0 +F420 +9820 +ENDCHAR +STARTCHAR U_8A14 +ENCODING 35348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +4440 +7FC0 +0400 +FFE0 +0000 +7FC0 +0000 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_8A15 +ENCODING 35349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F080 +0080 +F4A0 +04A0 +F4A0 +04A0 +F4A0 +94A0 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8A16 +ENCODING 35350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3E0 +0400 +F800 +07C0 +F080 +0100 +F200 +9420 +F420 +93E0 +ENDCHAR +STARTCHAR U_8A17 +ENCODING 35351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +0100 +F100 +01E0 +F700 +0100 +F100 +9120 +F120 +90E0 +ENDCHAR +STARTCHAR U_8A18 +ENCODING 35352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7C0 +0040 +F040 +07C0 +F440 +0400 +F400 +9420 +F420 +93E0 +ENDCHAR +STARTCHAR U_8A19 +ENCODING 35353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FF80 +0280 +7A80 +0680 +7B80 +0280 +7AA0 +4C60 +7820 +ENDCHAR +STARTCHAR U_8A1A +ENCODING 35354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +BF80 +0880 +BE80 +8080 +BE80 +8080 +BE80 +8080 +BE80 +A280 +BF80 +ENDCHAR +STARTCHAR U_8A1B +ENCODING 35355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F280 +04A0 +F4A0 +0CC0 +F480 +0580 +F680 +94A0 +F4A0 +9460 +ENDCHAR +STARTCHAR U_8A1C +ENCODING 35356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +FA40 +0440 +F820 +07C0 +F240 +0240 +F240 +9440 +F8C0 +ENDCHAR +STARTCHAR U_8A1D +ENCODING 35357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F040 +0240 +F240 +07E0 +F0C0 +0140 +F240 +9440 +F940 +9080 +ENDCHAR +STARTCHAR U_8A1E +ENCODING 35358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +F780 +0100 +F100 +0FE0 +F100 +0100 +F280 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A1F +ENCODING 35359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F280 +0280 +F440 +0440 +F920 +0100 +F200 +9240 +F440 +9FE0 +ENDCHAR +STARTCHAR U_8A20 +ENCODING 35360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4720 +2120 +F920 +0720 +7420 +0420 +7720 +0120 +7120 +5520 +7220 +ENDCHAR +STARTCHAR U_8A21 +ENCODING 35361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0440 +7920 +0080 +77E0 +0040 +7080 +5080 +7100 +ENDCHAR +STARTCHAR U_8A22 +ENCODING 35362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +F780 +0400 +F400 +07E0 +F480 +0480 +F480 +9480 +F880 +9080 +ENDCHAR +STARTCHAR U_8A23 +ENCODING 35363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +07C0 +F140 +0140 +F7E0 +0100 +F100 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A24 +ENCODING 35364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +F900 +0280 +7460 +0000 +7C40 +0280 +7100 +5280 +7C60 +ENDCHAR +STARTCHAR U_8A25 +ENCODING 35365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +07E0 +F520 +0520 +F5A0 +0560 +F620 +9420 +F420 +94E0 +ENDCHAR +STARTCHAR U_8A26 +ENCODING 35366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0920 +7100 +0280 +7280 +0280 +74A0 +54A0 +78E0 +ENDCHAR +STARTCHAR U_8A27 +ENCODING 35367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F120 +0100 +FFE0 +0100 +F180 +0180 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8A28 +ENCODING 35368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +0500 +7500 +05E0 +7500 +0500 +7500 +5500 +7FE0 +ENDCHAR +STARTCHAR U_8A29 +ENCODING 35369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2420 +FC60 +06A0 +7520 +0520 +76A0 +0460 +7420 +57E0 +7420 +ENDCHAR +STARTCHAR U_8A2A +ENCODING 35370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F080 +0FE0 +F200 +0200 +F3C0 +0240 +F240 +9240 +F540 +9880 +ENDCHAR +STARTCHAR U_8A2B +ENCODING 35371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2100 +F880 +0080 +7200 +0240 +7620 +0A20 +7240 +5240 +71C0 +ENDCHAR +STARTCHAR U_8A2C +ENCODING 35372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F080 +02C0 +F2A0 +04A0 +F480 +00A0 +F040 +9080 +F300 +9C00 +ENDCHAR +STARTCHAR U_8A2D +ENCODING 35373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +F480 +0480 +F4E0 +0800 +F7C0 +0440 +F280 +9100 +F280 +9C60 +ENDCHAR +STARTCHAR U_8A2E +ENCODING 35374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2240 +FA40 +0FE0 +7240 +0240 +7240 +0240 +7240 +5440 +7840 +ENDCHAR +STARTCHAR U_8A2F +ENCODING 35375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FA20 +0240 +7A80 +02E0 +7B20 +02A0 +7A40 +4CA0 +7D20 +ENDCHAR +STARTCHAR U_8A30 +ENCODING 35376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0FE0 +F100 +0540 +F540 +07C0 +F100 +9120 +F120 +90E0 +ENDCHAR +STARTCHAR U_8A31 +ENCODING 35377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F200 +03E0 +F480 +0080 +F7E0 +0080 +F080 +9080 +F080 +9080 +ENDCHAR +STARTCHAR U_8A32 +ENCODING 35378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +4100 +2100 +F900 +07C0 +7540 +0540 +77C0 +0100 +7100 +5100 +7100 +ENDCHAR +STARTCHAR U_8A33 +ENCODING 35379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +0440 +F7C0 +0500 +F500 +0480 +F480 +9440 +F820 +ENDCHAR +STARTCHAR U_8A34 +ENCODING 35380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +F700 +0400 +F400 +07E0 +F480 +0480 +F4C0 +94A0 +F480 +9880 +ENDCHAR +STARTCHAR U_8A35 +ENCODING 35381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +EAA0 +0AA0 +EAA0 +0AA0 +EAA0 +0AA0 +EC60 +A820 +EFE0 +ENDCHAR +STARTCHAR U_8A36 +ENCODING 35382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F040 +0040 +F740 +0540 +F540 +0740 +F540 +9040 +F140 +9080 +ENDCHAR +STARTCHAR U_8A37 +ENCODING 35383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +07E0 +7520 +07E0 +7520 +07E0 +7100 +5100 +7100 +ENDCHAR +STARTCHAR U_8A38 +ENCODING 35384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +F900 +0100 +7FE0 +0380 +7380 +0540 +7540 +5920 +7100 +ENDCHAR +STARTCHAR U_8A39 +ENCODING 35385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F120 +0FE0 +F100 +0380 +F380 +0540 +F540 +9920 +F100 +9100 +ENDCHAR +STARTCHAR U_8A3A +ENCODING 35386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +F920 +0200 +F480 +0120 +F640 +9080 +F100 +9600 +ENDCHAR +STARTCHAR U_8A3B +ENCODING 35387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +0FE0 +F100 +0100 +F100 +07C0 +F100 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A3C +ENCODING 35388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +0100 +F100 +0500 +F5E0 +0500 +F500 +9500 +F500 +9FE0 +ENDCHAR +STARTCHAR U_8A3D +ENCODING 35389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +FA20 +0420 +73A0 +02A0 +72A0 +02A0 +73A0 +5020 +70E0 +ENDCHAR +STARTCHAR U_8A3E +ENCODING 35390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +5320 +FFE0 +0400 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A3F +ENCODING 35391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F280 +0280 +FAA0 +0BC0 +FA80 +0A80 +FA80 +9BA0 +FEA0 +9060 +ENDCHAR +STARTCHAR U_8A40 +ENCODING 35392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +00E0 +7880 +0080 +7BE0 +0220 +7A20 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_8A41 +ENCODING 35393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0100 +FFE0 +0100 +F100 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A42 +ENCODING 35394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2240 +F440 +0DE0 +7440 +0540 +74C0 +0440 +7440 +5440 +74C0 +ENDCHAR +STARTCHAR U_8A43 +ENCODING 35395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +F7E0 +0100 +7200 +0440 +7780 +0100 +7240 +5420 +77E0 +ENDCHAR +STARTCHAR U_8A44 +ENCODING 35396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07C0 +F900 +0100 +FFE0 +0100 +F100 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A45 +ENCODING 35397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0280 +F440 +0920 +F080 +07E0 +F040 +9280 +F100 +9080 +ENDCHAR +STARTCHAR U_8A46 +ENCODING 35398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +F780 +0480 +F480 +07E0 +F480 +0480 +F480 +95A0 +F760 +94A0 +ENDCHAR +STARTCHAR U_8A47 +ENCODING 35399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +0540 +7540 +0540 +7FE0 +0100 +7280 +5440 +7820 +ENDCHAR +STARTCHAR U_8A48 +ENCODING 35400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +7FC0 +0400 +FFE0 +0000 +3FC0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8A49 +ENCODING 35401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +25C0 +FF40 +0540 +7540 +0540 +7540 +0580 +7280 +5540 +7A20 +ENDCHAR +STARTCHAR U_8A4A +ENCODING 35402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +F540 +0100 +F7C0 +0100 +F100 +0FE0 +F100 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A4B +ENCODING 35403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +0440 +7440 +07C0 +7280 +0280 +7280 +54A0 +78E0 +ENDCHAR +STARTCHAR U_8A4C +ENCODING 35404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F240 +07E0 +F240 +0240 +F240 +03C0 +F240 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8A4D +ENCODING 35405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +F540 +0540 +FFE0 +0540 +F540 +0540 +F5C0 +9400 +F400 +97E0 +ENDCHAR +STARTCHAR U_8A4E +ENCODING 35406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +0400 +F7C0 +0440 +F440 +07C0 +F440 +9400 +F400 +97E0 +ENDCHAR +STARTCHAR U_8A4F +ENCODING 35407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +F280 +0480 +F9E0 +0EA0 +F4A0 +0AA0 +FFA0 +9120 +F220 +94C0 +ENDCHAR +STARTCHAR U_8A50 +ENCODING 35408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F200 +03E0 +F500 +09E0 +F100 +0100 +F1E0 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A51 +ENCODING 35409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +0FE0 +F820 +0200 +F240 +0280 +F300 +9220 +F220 +91E0 +ENDCHAR +STARTCHAR U_8A52 +ENCODING 35410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0200 +F440 +0FE0 +F000 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A53 +ENCODING 35411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFC0 +0100 +7100 +0FE0 +7100 +0100 +7240 +5420 +77E0 +ENDCHAR +STARTCHAR U_8A54 +ENCODING 35412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F120 +0120 +F220 +04E0 +F040 +03E0 +F220 +9220 +F3E0 +9220 +ENDCHAR +STARTCHAR U_8A55 +ENCODING 35413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F100 +0520 +F340 +0100 +FFE0 +0100 +F100 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A56 +ENCODING 35414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +07E0 +F520 +0500 +F7E0 +0640 +F540 +9480 +F940 +9620 +ENDCHAR +STARTCHAR U_8A57 +ENCODING 35415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F820 +0820 +FBA0 +0AA0 +FAA0 +0BA0 +FAA0 +9820 +F820 +98E0 +ENDCHAR +STARTCHAR U_8A58 +ENCODING 35416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F080 +04A0 +F4A0 +07E0 +F080 +04A0 +F4A0 +94A0 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8A59 +ENCODING 35417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F240 +0FE0 +F200 +0200 +F3C0 +0240 +F540 +9480 +F940 +9220 +ENDCHAR +STARTCHAR U_8A5A +ENCODING 35418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +23C0 +FA40 +0240 +73C0 +0240 +7240 +03C0 +7240 +5000 +77E0 +ENDCHAR +STARTCHAR U_8A5B +ENCODING 35419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +F240 +0240 +F240 +03C0 +F240 +0240 +F3C0 +9240 +F240 +9FE0 +ENDCHAR +STARTCHAR U_8A5C +ENCODING 35420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +FD40 +07C0 +7100 +07C0 +7440 +0280 +7100 +5280 +7C60 +ENDCHAR +STARTCHAR U_8A5D +ENCODING 35421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FFE0 +0420 +7000 +07E0 +7080 +0080 +7080 +5080 +7380 +ENDCHAR +STARTCHAR U_8A5E +ENCODING 35422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F020 +07A0 +F020 +07A0 +F4A0 +04A0 +F7A0 +94A0 +F020 +9060 +ENDCHAR +STARTCHAR U_8A5F +ENCODING 35423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +7FE0 +0A80 +1320 +25E0 +C200 +7FC0 +0000 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_8A60 +ENCODING 35424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +F700 +0120 +FF40 +0380 +F580 +0540 +F940 +9120 +F300 +ENDCHAR +STARTCHAR U_8A61 +ENCODING 35425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F120 +05A0 +F360 +0120 +F160 +03A0 +F520 +9120 +F120 +9360 +ENDCHAR +STARTCHAR U_8A62 +ENCODING 35426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0820 +F7A0 +04A0 +F7A0 +04A0 +F4A0 +97A0 +F020 +9060 +ENDCHAR +STARTCHAR U_8A63 +ENCODING 35427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F480 +0720 +F420 +03E0 +F000 +07E0 +F420 +97E0 +F420 +97E0 +ENDCHAR +STARTCHAR U_8A64 +ENCODING 35428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +FD40 +0400 +77E0 +0000 +7540 +0540 +7540 +5540 +7960 +ENDCHAR +STARTCHAR U_8A65 +ENCODING 35429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0440 +7820 +07C0 +7000 +07C0 +7440 +5440 +77C0 +ENDCHAR +STARTCHAR U_8A66 +ENCODING 35430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F0A0 +0FE0 +F080 +0780 +F280 +0280 +F280 +93A0 +FC60 +9020 +ENDCHAR +STARTCHAR U_8A67 +ENCODING 35431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4A40 +A940 +5480 +2F40 +4020 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A68 +ENCODING 35432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +FFE0 +0240 +F420 +0A40 +F240 +0180 +F180 +9240 +FC20 +ENDCHAR +STARTCHAR U_8A69 +ENCODING 35433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +F7E0 +0040 +F040 +07E0 +F240 +9140 +F040 +90C0 +ENDCHAR +STARTCHAR U_8A6A +ENCODING 35434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +FC40 +07C0 +7440 +07C0 +7520 +0540 +7480 +5540 +7620 +ENDCHAR +STARTCHAR U_8A6B +ENCODING 35435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +0420 +F0C0 +0700 +F100 +01E0 +F700 +9120 +F120 +90E0 +ENDCHAR +STARTCHAR U_8A6C +ENCODING 35436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +F700 +0400 +F7E0 +0400 +F400 +05E0 +F520 +9520 +F5E0 +9920 +ENDCHAR +STARTCHAR U_8A6D +ENCODING 35437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3C0 +0480 +FFE0 +0400 +F5C0 +0540 +F5C0 +9520 +F520 +98E0 +ENDCHAR +STARTCHAR U_8A6E +ENCODING 35438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +F820 +07C0 +F100 +0100 +F7C0 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A6F +ENCODING 35439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0220 +7BE0 +0220 +7A20 +03E0 +7A20 +4A20 +7BE0 +ENDCHAR +STARTCHAR U_8A70 +ENCODING 35440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0FE0 +F100 +07C0 +F000 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A71 +ENCODING 35441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +0100 +FFE0 +0100 +F100 +07C0 +F440 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A72 +ENCODING 35442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0200 +F440 +0E80 +F120 +0240 +FC80 +9180 +F260 +9C20 +ENDCHAR +STARTCHAR U_8A73 +ENCODING 35443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +0FE0 +F100 +07C0 +F100 +0100 +FFE0 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8A74 +ENCODING 35444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +0200 +F3E0 +0620 +FBE0 +0220 +F3E0 +9220 +F220 +9260 +ENDCHAR +STARTCHAR U_8A75 +ENCODING 35445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07E0 +F900 +0100 +FFE0 +0280 +F280 +92A0 +F2A0 +9460 +ENDCHAR +STARTCHAR U_8A76 +ENCODING 35446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F2A0 +02A0 +F2A0 +07E0 +FAA0 +02A0 +F2A0 +92A0 +F4A0 +98A0 +ENDCHAR +STARTCHAR U_8A77 +ENCODING 35447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F820 +0BA0 +F820 +0BA0 +FAA0 +0AA0 +FBA0 +9820 +F820 +9860 +ENDCHAR +STARTCHAR U_8A78 +ENCODING 35448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2540 +FB80 +0100 +FFE0 +0100 +F380 +0380 +F540 +9920 +F100 +ENDCHAR +STARTCHAR U_8A79 +ENCODING 35449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +1100 +3FE0 +6A40 +BFE0 +2000 +2FC0 +2000 +2FC0 +4840 +8FC0 +ENDCHAR +STARTCHAR U_8A7A +ENCODING 35450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F1E0 +0220 +F540 +0080 +F100 +07E0 +F220 +9220 +F3E0 +9220 +ENDCHAR +STARTCHAR U_8A7B +ENCODING 35451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3C0 +0640 +F980 +0180 +F240 +07E0 +F240 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8A7C +ENCODING 35452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F200 +0FE0 +F280 +0280 +F2A0 +05C0 +F480 +9940 +F240 +9420 +ENDCHAR +STARTCHAR U_8A7D +ENCODING 35453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +F440 +0440 +7EE0 +0440 +7440 +0440 +7440 +5440 +7840 +ENDCHAR +STARTCHAR U_8A7E +ENCODING 35454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +FDE0 +0020 +7660 +05A0 +75A0 +0660 +77E0 +5020 +7060 +ENDCHAR +STARTCHAR U_8A7F +ENCODING 35455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +F100 +0FE0 +F100 +0100 +F7C0 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A80 +ENCODING 35456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +FA40 +03C0 +7A40 +0240 +7BC0 +0240 +7BE0 +4E40 +7840 +ENDCHAR +STARTCHAR U_8A81 +ENCODING 35457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +0FE0 +F280 +0280 +FFE0 +0280 +F280 +9280 +F480 +9880 +ENDCHAR +STARTCHAR U_8A82 +ENCODING 35458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F2A0 +0AC0 +F680 +0280 +F6C0 +0AA0 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8A83 +ENCODING 35459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F3E0 +0540 +F080 +0180 +F6E0 +0120 +F6A0 +9040 +F180 +9600 +ENDCHAR +STARTCHAR U_8A84 +ENCODING 35460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0100 +F380 +9540 +F920 +9120 +ENDCHAR +STARTCHAR U_8A85 +ENCODING 35461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07C0 +F900 +0100 +FFE0 +0100 +F380 +9540 +F920 +9100 +ENDCHAR +STARTCHAR U_8A86 +ENCODING 35462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +0BE0 +F880 +0880 +FBE0 +0880 +F880 +9BE0 +F800 +9FE0 +ENDCHAR +STARTCHAR U_8A87 +ENCODING 35463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +F440 +0BA0 +F000 +0FE0 +F200 +97C0 +F040 +9380 +ENDCHAR +STARTCHAR U_8A88 +ENCODING 35464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27E0 +F900 +0240 +77E0 +0100 +7100 +07E0 +7100 +5100 +77E0 +ENDCHAR +STARTCHAR U_8A89 +ENCODING 35465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +1500 +FFE0 +2500 +7FC0 +8020 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A8A +ENCODING 35466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +7FC0 +0800 +FFE0 +2480 +DF60 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A8B +ENCODING 35467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F040 +07C0 +F400 +0420 +F3E0 +0100 +F2C0 +9620 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8A8C +ENCODING 35468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +0FE0 +F100 +07C0 +F100 +0080 +F220 +9620 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8A8D +ENCODING 35469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F920 +0520 +F520 +02E0 +F440 +0300 +F2A0 +9620 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8A8E +ENCODING 35470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0100 +77C0 +0540 +77C0 +0100 +7380 +5540 +7920 +ENDCHAR +STARTCHAR U_8A8F +ENCODING 35471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0440 +F7C0 +0440 +F7C0 +0520 +F540 +9480 +F540 +9620 +ENDCHAR +STARTCHAR U_8A90 +ENCODING 35472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +26C0 +FAA0 +0FE0 +7280 +03A0 +76A0 +0AC0 +7280 +5AC0 +7520 +ENDCHAR +STARTCHAR U_8A91 +ENCODING 35473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +F640 +0440 +FA40 +0240 +F7E0 +0A40 +F240 +9240 +F240 +9DE0 +ENDCHAR +STARTCHAR U_8A92 +ENCODING 35474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F200 +0440 +FFA0 +0400 +F7E0 +0900 +FFE0 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8A93 +ENCODING 35475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2400 +F7E0 +2880 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8A94 +ENCODING 35476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2E60 +FB80 +0280 +75E0 +0E80 +7280 +0A80 +77E0 +5400 +7BE0 +ENDCHAR +STARTCHAR U_8A95 +ENCODING 35477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +FDC0 +0440 +F540 +0960 +F540 +0540 +F7E0 +9C00 +F600 +99E0 +ENDCHAR +STARTCHAR U_8A96 +ENCODING 35478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +FFE0 +0820 +F7C0 +0080 +FFE0 +9100 +F100 +9300 +ENDCHAR +STARTCHAR U_8A97 +ENCODING 35479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8320 +5CA0 +E4A0 +1FA0 +E4A0 +0EA0 +EDA0 +14A0 +E420 +A420 +E460 +ENDCHAR +STARTCHAR U_8A98 +ENCODING 35480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F700 +0100 +FFE0 +0540 +F920 +07C0 +F280 +92E0 +F420 +98C0 +ENDCHAR +STARTCHAR U_8A99 +ENCODING 35481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F000 +0540 +FA80 +0540 +F000 +0FE0 +F100 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8A9A +ENCODING 35482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +F540 +0100 +F7E0 +0420 +F7E0 +0420 +F7E0 +9420 +F420 +94E0 +ENDCHAR +STARTCHAR U_8A9B +ENCODING 35483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +FBC0 +0040 +7FE0 +0820 +77C0 +0440 +7280 +5100 +7EE0 +ENDCHAR +STARTCHAR U_8A9C +ENCODING 35484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2240 +F7E0 +0280 +7440 +0A20 +73C0 +0640 +7980 +5180 +7660 +ENDCHAR +STARTCHAR U_8A9D +ENCODING 35485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FA80 +0540 +7BA0 +0080 +7100 +07C0 +7440 +57C0 +7440 +ENDCHAR +STARTCHAR U_8A9E +ENCODING 35486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F100 +07C0 +F240 +0240 +F7E0 +0000 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8A9F +ENCODING 35487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +27A0 +F940 +07E0 +7100 +03C0 +7440 +0880 +77E0 +5080 +7180 +ENDCHAR +STARTCHAR U_8AA0 +ENCODING 35488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F0A0 +0FE0 +F880 +0880 +FEA0 +0AA0 +FAC0 +9A80 +FD60 +9220 +ENDCHAR +STARTCHAR U_8AA1 +ENCODING 35489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F0A0 +0FE0 +F080 +0A80 +FAA0 +0FA0 +FAC0 +9AA0 +F160 +9220 +ENDCHAR +STARTCHAR U_8AA2 +ENCODING 35490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +0440 +77C0 +0440 +77C0 +0280 +72A0 +54A0 +7860 +ENDCHAR +STARTCHAR U_8AA3 +ENCODING 35491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +0540 +F540 +0540 +F540 +0BA0 +F920 +9100 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8AA4 +ENCODING 35492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +0440 +F7C0 +0000 +F7C0 +0100 +FFE0 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8AA5 +ENCODING 35493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F500 +07C0 +F900 +0100 +F7E0 +0000 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8AA6 +ENCODING 35494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F240 +0180 +F7E0 +04A0 +F7E0 +04A0 +F7E0 +94A0 +F4A0 +9460 +ENDCHAR +STARTCHAR U_8AA7 +ENCODING 35495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F7E0 +0100 +F7E0 +0520 +F7E0 +0520 +F7E0 +9520 +F520 +9560 +ENDCHAR +STARTCHAR U_8AA8 +ENCODING 35496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0800 +F7C0 +0540 +FFE0 +0540 +F540 +97E0 +F040 +9180 +ENDCHAR +STARTCHAR U_8AA9 +ENCODING 35497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2080 +FBE0 +0000 +7BC0 +0000 +7BC0 +0000 +7BC0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_8AAA +ENCODING 35498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F280 +0440 +FFE0 +0440 +F440 +07C0 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8AAB +ENCODING 35499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +0BC0 +F800 +0FE0 +FA80 +0AA0 +FAC0 +9A80 +F340 +9220 +ENDCHAR +STARTCHAR U_8AAC +ENCODING 35500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFC0 +0440 +7440 +07C0 +7280 +0280 +72A0 +54A0 +7860 +ENDCHAR +STARTCHAR U_8AAD +ENCODING 35501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F900 +0380 +7000 +0FE0 +7820 +0280 +7280 +54A0 +78E0 +ENDCHAR +STARTCHAR U_8AAE +ENCODING 35502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FFE0 +0280 +7400 +0CA0 +74C0 +0580 +7480 +54A0 +74E0 +ENDCHAR +STARTCHAR U_8AAF +ENCODING 35503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +FBC0 +0240 +73C0 +0000 +77E0 +0420 +77E0 +5420 +77E0 +ENDCHAR +STARTCHAR U_8AB0 +ENCODING 35504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +F480 +07E0 +F480 +0FE0 +F480 +0480 +F7E0 +9480 +F7E0 +9400 +ENDCHAR +STARTCHAR U_8AB1 +ENCODING 35505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +F900 +07C0 +7140 +07E0 +7140 +07C0 +7500 +5700 +7DE0 +ENDCHAR +STARTCHAR U_8AB2 +ENCODING 35506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F520 +07E0 +F520 +07E0 +F100 +0FE0 +F100 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8AB3 +ENCODING 35507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2220 +FFE0 +0280 +7AA0 +03E0 +7A80 +02A0 +7AA0 +4AA0 +7FE0 +ENDCHAR +STARTCHAR U_8AB4 +ENCODING 35508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +07C0 +7000 +07C0 +7100 +0380 +7540 +5920 +7300 +ENDCHAR +STARTCHAR U_8AB5 +ENCODING 35509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2180 +FA40 +0100 +77E0 +0220 +77E0 +0A20 +73E0 +5220 +7220 +ENDCHAR +STARTCHAR U_8AB6 +ENCODING 35510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F440 +0AA0 +F920 +0100 +FFE0 +9100 +F100 +9100 +ENDCHAR +STARTCHAR U_8AB7 +ENCODING 35511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2660 +FDA0 +07E0 +74A0 +07E0 +7520 +0520 +75E0 +5420 +7460 +ENDCHAR +STARTCHAR U_8AB8 +ENCODING 35512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +F240 +03E0 +FE40 +0880 +FFA0 +0240 +F240 +92A0 +FFE0 +9420 +ENDCHAR +STARTCHAR U_8AB9 +ENCODING 35513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F280 +0EE0 +F280 +0EE0 +F280 +0280 +FEE0 +9280 +F280 +9280 +ENDCHAR +STARTCHAR U_8ABA +ENCODING 35514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F540 +0540 +FBA0 +0120 +F380 +9540 +F920 +9120 +ENDCHAR +STARTCHAR U_8ABB +ENCODING 35515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +FF40 +0580 +F540 +0920 +F7C0 +0440 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8ABC +ENCODING 35516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +07E0 +F420 +03C0 +F240 +03C0 +F240 +93C0 +F240 +9FE0 +ENDCHAR +STARTCHAR U_8ABD +ENCODING 35517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FCE0 +0820 +FEE0 +0820 +FFE0 +0280 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8ABE +ENCODING 35518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8020 +9F20 +8020 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_8ABF +ENCODING 35519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +0520 +F7A0 +0520 +F7E0 +0420 +F7A0 +96A0 +F7A0 +9860 +ENDCHAR +STARTCHAR U_8AC0 +ENCODING 35520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +0520 +F7E0 +0520 +F7E0 +0280 +FFE0 +9080 +F080 +9080 +ENDCHAR +STARTCHAR U_8AC1 +ENCODING 35521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2EE0 +FAA0 +0440 +7AA0 +0000 +7EE0 +0AA0 +7AA0 +5440 +7AA0 +ENDCHAR +STARTCHAR U_8AC2 +ENCODING 35522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F3E0 +0240 +F480 +0900 +F660 +0420 +F6E0 +9420 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8AC3 +ENCODING 35523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F480 +0FE0 +F480 +0480 +FEC0 +0DA0 +F6A0 +9480 +F480 +9480 +ENDCHAR +STARTCHAR U_8AC4 +ENCODING 35524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F7C0 +0000 +F7C0 +0080 +F100 +9FE0 +F100 +9300 +ENDCHAR +STARTCHAR U_8AC5 +ENCODING 35525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +1300 +FFE0 +2480 +DF60 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8AC6 +ENCODING 35526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +0240 +F3C0 +0240 +F3C0 +0240 +FFE0 +9000 +F240 +9420 +ENDCHAR +STARTCHAR U_8AC7 +ENCODING 35527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +F540 +0580 +F980 +0240 +F520 +0520 +F540 +9A80 +F440 +9820 +ENDCHAR +STARTCHAR U_8AC8 +ENCODING 35528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF00 +0100 +FFE0 +0540 +FFE0 +0540 +FFE0 +9100 +F100 +97C0 +ENDCHAR +STARTCHAR U_8AC9 +ENCODING 35529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +F700 +0100 +FFE0 +0540 +F920 +0FE0 +F240 +9480 +F380 +9C60 +ENDCHAR +STARTCHAR U_8ACA +ENCODING 35530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +F920 +0560 +F3A0 +07E0 +F120 +03A0 +F560 +9920 +F160 +ENDCHAR +STARTCHAR U_8ACB +ENCODING 35531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0440 +F7C0 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8ACC +ENCODING 35532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +07C0 +F540 +07C0 +F540 +07C0 +F380 +9540 +F920 +ENDCHAR +STARTCHAR U_8ACD +ENCODING 35533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +F480 +0900 +F7C0 +0140 +FFE0 +0140 +F7C0 +9100 +F100 +9300 +ENDCHAR +STARTCHAR U_8ACE +ENCODING 35534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +27C0 +FA80 +0280 +FFE0 +0000 +F7C0 +0440 +F7C0 +9440 +F7C0 +ENDCHAR +STARTCHAR U_8ACF +ENCODING 35535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +EAE0 +0AA0 +EEA0 +0AA0 +EEA0 +0AA0 +EB40 +AE40 +FAA0 +A320 +ENDCHAR +STARTCHAR U_8AD0 +ENCODING 35536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +5040 +DFC0 +4A80 +4AA0 +5260 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8AD1 +ENCODING 35537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F200 +0500 +F920 +0AC0 +F480 +0580 +F2C0 +94A0 +F8A0 +9300 +ENDCHAR +STARTCHAR U_8AD2 +ENCODING 35538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0000 +F7C0 +0440 +F7C0 +0100 +F540 +9520 +F920 +9300 +ENDCHAR +STARTCHAR U_8AD3 +ENCODING 35539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0240 +F1A0 +0660 +F280 +0240 +FFE0 +9240 +F1A0 +9660 +ENDCHAR +STARTCHAR U_8AD4 +ENCODING 35540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F4E0 +07A0 +F4A0 +0FA0 +F4A0 +0EA0 +F5A0 +9440 +F4A0 +9D20 +ENDCHAR +STARTCHAR U_8AD5 +ENCODING 35541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +F100 +07E0 +F520 +07C0 +F520 +05E0 +F400 +95C0 +F940 +9660 +ENDCHAR +STARTCHAR U_8AD6 +ENCODING 35542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E280 +0440 +EBA0 +0000 +EFE0 +0AA0 +EFE0 +AAA0 +EAA0 +A860 +ENDCHAR +STARTCHAR U_8AD7 +ENCODING 35543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +F920 +07C0 +F080 +0100 +F2A0 +96A0 +FA40 +91C0 +ENDCHAR +STARTCHAR U_8AD8 +ENCODING 35544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0220 +F540 +9C80 +F540 +9620 +ENDCHAR +STARTCHAR U_8AD9 +ENCODING 35545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F480 +07E0 +F480 +0740 +F020 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8ADA +ENCODING 35546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F820 +07C0 +7100 +0500 +75E0 +0500 +7700 +5500 +78E0 +ENDCHAR +STARTCHAR U_8ADB +ENCODING 35547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F560 +0920 +FFE0 +0920 +FFE0 +0100 +F280 +9280 +F440 +9820 +ENDCHAR +STARTCHAR U_8ADC +ENCODING 35548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FFE0 +0540 +F5C0 +0400 +F7E0 +0100 +FFE0 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8ADD +ENCODING 35549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F520 +05C0 +F500 +0BE0 +F7C0 +0440 +F7C0 +9440 +F7C0 +94C0 +ENDCHAR +STARTCHAR U_8ADE +ENCODING 35550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +FFE0 +0820 +FFE0 +0800 +FFE0 +0AA0 +FFE0 +9AA0 +FAA0 +9A60 +ENDCHAR +STARTCHAR U_8ADF +ENCODING 35551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F000 +0FE0 +F100 +95E0 +FB00 +91E0 +ENDCHAR +STARTCHAR U_8AE0 +ENCODING 35552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +F100 +0FE0 +F820 +0FE0 +F440 +07C0 +F440 +97C0 +F000 +9FE0 +ENDCHAR +STARTCHAR U_8AE1 +ENCODING 35553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F440 +0BA0 +F100 +07C0 +F040 +0380 +F000 +9FE0 +FAA0 +9FE0 +ENDCHAR +STARTCHAR U_8AE2 +ENCODING 35554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +0FE0 +F540 +07C0 +F540 +07C0 +F100 +9FE0 +F100 +9100 +ENDCHAR +STARTCHAR U_8AE3 +ENCODING 35555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +4440 +F740 +0540 +EFE0 +0820 +EBA0 +0AA0 +EBA0 +A820 +E860 +ENDCHAR +STARTCHAR U_8AE4 +ENCODING 35556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +F000 +07C0 +F000 +0FE0 +F200 +97E0 +F020 +91C0 +ENDCHAR +STARTCHAR U_8AE5 +ENCODING 35557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +FFE0 +0540 +77C0 +0540 +77C0 +0100 +77C0 +5100 +7FE0 +ENDCHAR +STARTCHAR U_8AE6 +ENCODING 35558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0920 +F7C0 +0540 +F540 +9540 +F5C0 +9100 +ENDCHAR +STARTCHAR U_8AE7 +ENCODING 35559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F4A0 +07C0 +F4A0 +06E0 +F100 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8AE8 +ENCODING 35560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F000 +03C0 +F240 +03C0 +F000 +07E0 +F520 +97E0 +F520 +97E0 +ENDCHAR +STARTCHAR U_8AE9 +ENCODING 35561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +0280 +7280 +0AA0 +76C0 +0280 +7280 +5280 +7FE0 +ENDCHAR +STARTCHAR U_8AEA +ENCODING 35562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F800 +0380 +7280 +0FE0 +7820 +07C0 +7100 +5100 +7300 +ENDCHAR +STARTCHAR U_8AEB +ENCODING 35563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +EFE0 +0D60 +FBA0 +0FE0 +F100 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8AEC +ENCODING 35564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +27E0 +FA80 +72A0 +AC60 +0400 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8AED +ENCODING 35565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +F440 +0BA0 +F000 +0E20 +FAA0 +0EA0 +FAA0 +9EA0 +FA20 +9AE0 +ENDCHAR +STARTCHAR U_8AEE +ENCODING 35566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +F5E0 +0220 +F480 +0C80 +F540 +0620 +F7E0 +9420 +F7E0 +9420 +ENDCHAR +STARTCHAR U_8AEF +ENCODING 35567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +F520 +07E0 +F000 +0FE0 +F100 +0FE0 +FAA0 +9AA0 +FAA0 +9860 +ENDCHAR +STARTCHAR U_8AF0 +ENCODING 35568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F520 +0520 +F7E0 +0520 +F7E0 +0100 +F280 +9620 +FA60 +93C0 +ENDCHAR +STARTCHAR U_8AF1 +ENCODING 35569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0240 +FFE0 +0440 +F7C0 +0080 +FFE0 +9480 +F7E0 +9080 +ENDCHAR +STARTCHAR U_8AF2 +ENCODING 35570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0FE0 +FAA0 +0AA0 +FFE0 +0100 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8AF3 +ENCODING 35571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F280 +0FE0 +F000 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8AF4 +ENCODING 35572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +E0A0 +0FE0 +E880 +0F80 +E8A0 +0EA0 +EAA0 +AEC0 +E8A0 +B320 +ENDCHAR +STARTCHAR U_8AF5 +ENCODING 35573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0100 +EFE0 +0AA0 +E920 +0FE0 +E920 +AFE0 +A920 +E960 +ENDCHAR +STARTCHAR U_8AF6 +ENCODING 35574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +0240 +F3C0 +0240 +F3C0 +0240 +FFE0 +9540 +F620 +97E0 +ENDCHAR +STARTCHAR U_8AF7 +ENCODING 35575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F540 +07C0 +F540 +0540 +F7C0 +9540 +F560 +9BA0 +ENDCHAR +STARTCHAR U_8AF8 +ENCODING 35576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F7A0 +0240 +FFE0 +0100 +F3C0 +0640 +FBC0 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8AF9 +ENCODING 35577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +F3C0 +0240 +FFE0 +0200 +F7E0 +0AA0 +F4A0 +9120 +F660 +ENDCHAR +STARTCHAR U_8AFA +ENCODING 35578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0840 +FB80 +0840 +FBA0 +9840 +F180 +9E00 +ENDCHAR +STARTCHAR U_8AFB +ENCODING 35579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0440 +F7C0 +0440 +FFE0 +0100 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8AFC +ENCODING 35580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F520 +0240 +F7E0 +0100 +FFE0 +0200 +F3E0 +9540 +F880 +9360 +ENDCHAR +STARTCHAR U_8AFD +ENCODING 35581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +FA80 +0380 +7100 +07C0 +7540 +07C0 +7100 +5FE0 +7100 +ENDCHAR +STARTCHAR U_8AFE +ENCODING 35582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FFE0 +0480 +F200 +0FE0 +F200 +07C0 +FC40 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_8AFF +ENCODING 35583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F000 +0FE0 +F540 +04C0 +F640 +9540 +FFE0 +9040 +ENDCHAR +STARTCHAR U_8B00 +ENCODING 35584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +27E0 +FA40 +03C0 +7240 +03C0 +7100 +07E0 +7380 +5540 +7920 +ENDCHAR +STARTCHAR U_8B01 +ENCODING 35585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F200 +07E0 +FCA0 +9560 +F7A0 +90C0 +ENDCHAR +STARTCHAR U_8B02 +ENCODING 35586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +0FE0 +F920 +0FE0 +F440 +07C0 +F440 +97C0 +F440 +94C0 +ENDCHAR +STARTCHAR U_8B03 +ENCODING 35587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2220 +FBE0 +0220 +73E0 +0480 +7BE0 +0080 +73E0 +5080 +77E0 +ENDCHAR +STARTCHAR U_8B04 +ENCODING 35588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +9200 +FFE0 +9440 +9920 +F7C0 +9000 +97C0 +9440 +B7C0 +ENDCHAR +STARTCHAR U_8B05 +ENCODING 35589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0D20 +F7E0 +0120 +F640 +0BE0 +F520 +97E0 +F220 +9CC0 +ENDCHAR +STARTCHAR U_8B06 +ENCODING 35590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0820 +FFE0 +0800 +FFE0 +0DA0 +FB60 +9DA0 +F920 +9360 +ENDCHAR +STARTCHAR U_8B07 +ENCODING 35591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +3F80 +1100 +FFE0 +2480 +DF60 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B08 +ENCODING 35592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +1100 +FFE0 +1100 +FFE0 +2480 +DF60 +1100 +1F00 +ENDCHAR +STARTCHAR U_8B09 +ENCODING 35593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2FC0 +FA40 +0FC0 +FA40 +0FC0 +F280 +0340 +F5E0 +9520 +F9E0 +ENDCHAR +STARTCHAR U_8B0A +ENCODING 35594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FFE0 +0540 +FFE0 +0400 +F7C0 +0000 +F540 +9540 +F540 +9960 +ENDCHAR +STARTCHAR U_8B0B +ENCODING 35595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F7E0 +0D40 +F3E0 +0440 +F940 +0FE0 +F100 +9380 +F540 +9920 +ENDCHAR +STARTCHAR U_8B0C +ENCODING 35596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2040 +F740 +0540 +7740 +0000 +77E0 +0540 +7740 +5040 +70C0 +ENDCHAR +STARTCHAR U_8B0D +ENCODING 35597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +1080 +2940 +FFE0 +8420 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B0E +ENCODING 35598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48A0 +F6A0 +01C0 +F080 +0FE0 +F480 +05C0 +F6A0 +94A0 +FA00 +91E0 +ENDCHAR +STARTCHAR U_8B0F +ENCODING 35599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +F5E0 +0520 +F7E0 +0520 +F7E0 +0100 +F7E0 +9240 +F180 +9660 +ENDCHAR +STARTCHAR U_8B10 +ENCODING 35600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +F240 +0AA0 +FB20 +05C0 +F800 +07C0 +F540 +9540 +F540 +9FE0 +ENDCHAR +STARTCHAR U_8B11 +ENCODING 35601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +FE20 +0540 +F280 +0500 +F240 +07E0 +F100 +9FE0 +F280 +9C60 +ENDCHAR +STARTCHAR U_8B12 +ENCODING 35602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +F540 +0FE0 +F440 +07C0 +F440 +07C0 +F400 +97C0 +FA40 +93C0 +ENDCHAR +STARTCHAR U_8B13 +ENCODING 35603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0200 +F7C0 +0440 +F7C0 +0440 +F7C0 +9440 +FFE0 +9440 +ENDCHAR +STARTCHAR U_8B14 +ENCODING 35604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +F100 +07E0 +F520 +07C0 +F520 +05E0 +F500 +97E0 +F500 +99E0 +ENDCHAR +STARTCHAR U_8B15 +ENCODING 35605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +EF00 +09C0 +E900 +0FE0 +E920 +0FC0 +E920 +ABE0 +EA80 +B4E0 +ENDCHAR +STARTCHAR U_8B16 +ENCODING 35606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F920 +0FE0 +F920 +0FE0 +F440 +0A20 +F7C0 +9A40 +F180 +9E60 +ENDCHAR +STARTCHAR U_8B17 +ENCODING 35607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0920 +FFE0 +0200 +F3C0 +9240 +F540 +9880 +ENDCHAR +STARTCHAR U_8B18 +ENCODING 35608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +07E0 +F480 +07E0 +F540 +07E0 +F480 +97E0 +F480 +9880 +ENDCHAR +STARTCHAR U_8B19 +ENCODING 35609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0280 +F7E0 +02A0 +FFE0 +02A0 +F7E0 +9280 +F6C0 +9AA0 +ENDCHAR +STARTCHAR U_8B1A +ENCODING 35610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +0100 +FFE0 +0440 +F820 +0FC0 +F540 +9540 +F540 +9FE0 +ENDCHAR +STARTCHAR U_8B1B +ENCODING 35611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +07C0 +F280 +0FE0 +F540 +07C0 +F540 +9FE0 +F440 +94C0 +ENDCHAR +STARTCHAR U_8B1C +ENCODING 35612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F900 +0BE0 +FA20 +0BE0 +FA20 +0BE0 +F880 +99C0 +FAA0 +95A0 +ENDCHAR +STARTCHAR U_8B1D +ENCODING 35613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FE40 +0A40 +FFE0 +0A40 +FF40 +0AC0 +FE40 +9640 +FA40 +96C0 +ENDCHAR +STARTCHAR U_8B1E +ENCODING 35614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0240 +F3C0 +0000 +FFE0 +0820 +FBA0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B1F +ENCODING 35615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2720 +F520 +02C0 +F100 +0660 +F420 +0760 +F420 +9420 +F7E0 +ENDCHAR +STARTCHAR U_8B20 +ENCODING 35616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F3E0 +0D40 +F580 +0E00 +F3E0 +0480 +F7E0 +9080 +F4A0 +97E0 +ENDCHAR +STARTCHAR U_8B21 +ENCODING 35617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2620 +F940 +0540 +7400 +0BE0 +7080 +07E0 +7080 +54A0 +77E0 +ENDCHAR +STARTCHAR U_8B22 +ENCODING 35618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F7E0 +0C80 +F7E0 +0480 +F7E0 +0480 +FFE0 +9240 +F180 +9E60 +ENDCHAR +STARTCHAR U_8B23 +ENCODING 35619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F100 +0FE0 +FAA0 +07C0 +F000 +0FE0 +F200 +97C0 +F040 +9380 +ENDCHAR +STARTCHAR U_8B24 +ENCODING 35620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0FE0 +FAA0 +0FE0 +F000 +07C0 +F000 +9FE0 +F540 +9B20 +ENDCHAR +STARTCHAR U_8B25 +ENCODING 35621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +FFE0 +0920 +FAE0 +0920 +FAA0 +0FE0 +F100 +96A0 +FA60 +91C0 +ENDCHAR +STARTCHAR U_8B26 +ENCODING 35622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +7E20 +57C0 +7D40 +8480 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B27 +ENCODING 35623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0540 +F6C0 +07C0 +F100 +0FE0 +F920 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B28 +ENCODING 35624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F7C0 +0440 +F7C0 +0440 +FFE0 +9100 +F280 +9C60 +ENDCHAR +STARTCHAR U_8B29 +ENCODING 35625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +7FE0 +0900 +3F80 +2480 +FFE0 +1900 +2480 +DF60 +1100 +1F00 +ENDCHAR +STARTCHAR U_8B2A +ENCODING 35626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +F280 +0FE0 +FAA0 +0C60 +FBA0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B2B +ENCODING 35627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0280 +FFE0 +0920 +FFE0 +0920 +FBA0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B2C +ENCODING 35628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0660 +FAA0 +0300 +F480 +0B60 +F000 +9740 +F080 +9700 +ENDCHAR +STARTCHAR U_8B2D +ENCODING 35629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +5FE0 +EA20 +0EA0 +EAA0 +0E60 +E000 +0FE0 +E220 +A4A0 +E840 +ENDCHAR +STARTCHAR U_8B2E +ENCODING 35630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +F7C0 +0100 +FFE0 +0440 +F7C0 +9440 +F7C0 +9C60 +ENDCHAR +STARTCHAR U_8B2F +ENCODING 35631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +F100 +0FE0 +F920 +0FC0 +F920 +0BE0 +FA40 +9BC0 +FA40 +97E0 +ENDCHAR +STARTCHAR U_8B30 +ENCODING 35632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +E880 +0BE0 +E2A0 +1BE0 +EAA0 +0BE0 +E880 +ABE0 +F480 +A3E0 +ENDCHAR +STARTCHAR U_8B31 +ENCODING 35633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0540 +FFE0 +0540 +FFE0 +0920 +FFE0 +9480 +F380 +9C60 +ENDCHAR +STARTCHAR U_8B32 +ENCODING 35634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +FFC0 +0540 +7FE0 +02A0 +7540 +0AA0 +7140 +5080 +7700 +ENDCHAR +STARTCHAR U_8B33 +ENCODING 35635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F800 +0BC0 +FA40 +0BC0 +F800 +0EE0 +FAA0 +9EE0 +F800 +9FE0 +ENDCHAR +STARTCHAR U_8B34 +ENCODING 35636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F540 +0FE0 +7540 +07C0 +7000 +07C0 +7540 +56C0 +77C0 +0C60 +ENDCHAR +STARTCHAR U_8B35 +ENCODING 35637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +F220 +0AA0 +F660 +0AA0 +F100 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B36 +ENCODING 35638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F7E0 +0400 +F540 +07E0 +F540 +05C0 +F400 +9940 +F2A0 +92A0 +ENDCHAR +STARTCHAR U_8B37 +ENCODING 35639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +2760 +4800 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B38 +ENCODING 35640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EE80 +0480 +EFE0 +0540 +FF40 +0940 +EE80 +AA80 +EB40 +B520 +ENDCHAR +STARTCHAR U_8B39 +ENCODING 35641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F100 +07C0 +F540 +0FE0 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_8B3A +ENCODING 35642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27C0 +F940 +5340 +FAC0 +2420 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B3B +ENCODING 35643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FCE0 +0520 +FEC0 +0480 +F760 +0CA0 +F520 +96C0 +F480 +9700 +ENDCHAR +STARTCHAR U_8B3C +ENCODING 35644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +F100 +0FE0 +F920 +0FC0 +F920 +0FE0 +FAA0 +9FE0 +F880 +9180 +ENDCHAR +STARTCHAR U_8B3D +ENCODING 35645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +F7E0 +8520 +F7E0 +1520 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B3E +ENCODING 35646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +0FE0 +FAA0 +0FE0 +F440 +9280 +F100 +9EE0 +ENDCHAR +STARTCHAR U_8B3F +ENCODING 35647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2EE0 +F4A0 +0EE0 +7AA0 +0EA0 +74E0 +0EA0 +74A0 +5520 +7660 +ENDCHAR +STARTCHAR U_8B40 +ENCODING 35648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D00 +F500 +0FE0 +FAA0 +0EA0 +FAA0 +0AA0 +FEA0 +9B40 +FEA0 +9320 +ENDCHAR +STARTCHAR U_8B41 +ENCODING 35649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +FFE0 +0540 +FFE0 +0540 +FFE0 +9100 +F7C0 +9100 +ENDCHAR +STARTCHAR U_8B42 +ENCODING 35650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0FE0 +F540 +07C0 +F540 +07C0 +F100 +9FE0 +F100 +9100 +ENDCHAR +STARTCHAR U_8B43 +ENCODING 35651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +2100 +FFE0 +0520 +77C0 +0520 +74E0 +0540 +7760 +5940 +77E0 +ENDCHAR +STARTCHAR U_8B44 +ENCODING 35652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FFE0 +0D60 +7BA0 +0FE0 +7000 +07C0 +7440 +57C0 +7440 +57C0 +ENDCHAR +STARTCHAR U_8B45 +ENCODING 35653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +EAA0 +1BA0 +E2A0 +0D40 +E440 +0440 +F760 +9540 +F540 +9FE0 +ENDCHAR +STARTCHAR U_8B46 +ENCODING 35654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +FFE0 +0440 +F7C0 +0280 +FFE0 +9440 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B47 +ENCODING 35655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0540 +FBA0 +0140 +FFE0 +0240 +F7C0 +9A40 +F3C0 +9240 +ENDCHAR +STARTCHAR U_8B48 +ENCODING 35656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FE80 +0BE0 +FEA0 +00A0 +FEA0 +02A0 +F4A0 +9E40 +F4A0 +9D20 +ENDCHAR +STARTCHAR U_8B49 +ENCODING 35657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +F580 +02A0 +F240 +07C0 +F820 +07C0 +F440 +97C0 +F280 +9FE0 +ENDCHAR +STARTCHAR U_8B4A +ENCODING 35658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +0100 +FFE0 +0440 +FEE0 +0440 +FFE0 +9280 +F4A0 +9860 +ENDCHAR +STARTCHAR U_8B4B +ENCODING 35659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +FAA0 +0FE0 +FAA0 +0BA0 +FAA0 +9BA0 +FAA0 +9DE0 +ENDCHAR +STARTCHAR U_8B4C +ENCODING 35660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +EFC0 +0540 +EFC0 +0880 +EFC0 +0840 +EFE0 +A820 +EAA0 +B540 +ENDCHAR +STARTCHAR U_8B4D +ENCODING 35661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4A80 +57E0 +7C80 +57E0 +5480 +7FE0 +4840 +4840 +8FC0 +ENDCHAR +STARTCHAR U_8B4E +ENCODING 35662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F280 +0FE0 +F540 +0900 +FFE0 +0AA0 +FFE0 +9AA0 +FBA0 +9860 +ENDCHAR +STARTCHAR U_8B4F +ENCODING 35663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +F5A0 +0B40 +FDE0 +0340 +FFE0 +0500 +F540 +96A0 +F960 +9220 +ENDCHAR +STARTCHAR U_8B50 +ENCODING 35664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +FFE0 +0AA0 +FCE0 +0BA0 +F8A0 +9FE0 +F480 +9380 +ENDCHAR +STARTCHAR U_8B51 +ENCODING 35665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +F200 +0FE0 +FCC0 +07A0 +F000 +0FE0 +F820 +9BA0 +FAA0 +9BE0 +ENDCHAR +STARTCHAR U_8B52 +ENCODING 35666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF20 +0540 +FFE0 +0380 +F540 +0FE0 +F540 +97C0 +F540 +97C0 +ENDCHAR +STARTCHAR U_8B53 +ENCODING 35667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0540 +F7C0 +0540 +F7C0 +0140 +FFA0 +9540 +FC60 +97C0 +ENDCHAR +STARTCHAR U_8B54 +ENCODING 35668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +F880 +0EE0 +F240 +07E0 +F240 +9FE0 +F240 +9C20 +ENDCHAR +STARTCHAR U_8B55 +ENCODING 35669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +F7E0 +0D40 +F540 +0FE0 +F540 +0540 +FFE0 +9540 +FAA0 +92A0 +ENDCHAR +STARTCHAR U_8B56 +ENCODING 35670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +F540 +1FE0 +ECC0 +1760 +E000 +07C0 +E440 +A7C0 +E440 +A7C0 +ENDCHAR +STARTCHAR U_8B57 +ENCODING 35671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F7E0 +0A40 +F120 +0280 +F440 +0BA0 +F000 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B58 +ENCODING 35672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EFC0 +0AA0 +E480 +0FE0 +E080 +0EA0 +EAC0 +AEA0 +EB60 +AE20 +ENDCHAR +STARTCHAR U_8B59 +ENCODING 35673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +F7E0 +0C80 +F7C0 +0480 +F7C0 +0480 +F7E0 +9540 +FAA0 +92A0 +ENDCHAR +STARTCHAR U_8B5A +ENCODING 35674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0FE0 +FAA0 +0FE0 +F440 +07C0 +F440 +9FE0 +F100 +9100 +ENDCHAR +STARTCHAR U_8B5B +ENCODING 35675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2EE0 +F440 +0FE0 +76C0 +0920 +77C0 +0440 +77C0 +5440 +77C0 +ENDCHAR +STARTCHAR U_8B5C +ENCODING 35676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FFE0 +0AA0 +F6C0 +0FE0 +F000 +07C0 +F440 +97C0 +F440 +97C0 +ENDCHAR +STARTCHAR U_8B5D +ENCODING 35677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +FAA0 +0EE0 +F280 +0EE0 +FAA0 +0EE0 +FAA0 +9EE0 +F2A0 +93E0 +ENDCHAR +STARTCHAR U_8B5E +ENCODING 35678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +FFE0 +0000 +77C0 +0440 +77C0 +0320 +76C0 +5A40 +7320 +ENDCHAR +STARTCHAR U_8B5F +ENCODING 35679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F000 +0EE0 +FAA0 +0EE0 +F100 +9FE0 +F540 +9920 +ENDCHAR +STARTCHAR U_8B60 +ENCODING 35680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0BA0 +F820 +0FE0 +F440 +07C0 +F440 +97C0 +F000 +9FE0 +ENDCHAR +STARTCHAR U_8B61 +ENCODING 35681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +FFE0 +0820 +7380 +0280 +77E0 +0520 +77E0 +5520 +77E0 +ENDCHAR +STARTCHAR U_8B62 +ENCODING 35682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +F7E0 +0900 +E2A0 +1DC0 +EA80 +0DC0 +EAA0 +A880 +ED00 +B3E0 +ENDCHAR +STARTCHAR U_8B63 +ENCODING 35683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +FBA0 +0000 +FEE0 +0AA0 +FEE0 +9440 +FAA0 +9120 +ENDCHAR +STARTCHAR U_8B64 +ENCODING 35684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4E80 +FA80 +0EE0 +EB20 +0F20 +E4A0 +1F40 +E440 +AAA0 +F520 +ENDCHAR +STARTCHAR U_8B65 +ENCODING 35685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +A940 +FC80 +5140 +8A20 +FFE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B66 +ENCODING 35686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +49E0 +FE80 +5540 +FFE0 +0000 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B67 +ENCODING 35687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0A80 +EFE0 +0AA0 +EFE0 +0AA0 +EFE0 +AA80 +EEC0 +B2A0 +ENDCHAR +STARTCHAR U_8B68 +ENCODING 35688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0AA0 +FFE0 +0AA0 +FFE0 +0800 +FFE0 +9AA0 +FA40 +9720 +ENDCHAR +STARTCHAR U_8B69 +ENCODING 35689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F240 +0FE0 +7440 +07C0 +7440 +07C0 +7520 +5A40 +73C0 +ENDCHAR +STARTCHAR U_8B6A +ENCODING 35690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FFE0 +0440 +F7C0 +0440 +F7E0 +0520 +FEA0 +9460 +F7A0 +9040 +ENDCHAR +STARTCHAR U_8B6B +ENCODING 35691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +E480 +0FE0 +EA40 +0DA0 +E800 +0BC0 +E800 +ABC0 +EA40 +B3C0 +ENDCHAR +STARTCHAR U_8B6C +ENCODING 35692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8A80 +FFC0 +9100 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B6D +ENCODING 35693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AE0 +F2A0 +1EA0 +F2A0 +1F00 +E0E0 +1FA0 +E4A0 +A440 +E6A0 +B920 +ENDCHAR +STARTCHAR U_8B6E +ENCODING 35694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +F440 +0FE0 +7D60 +0BA0 +7FE0 +0440 +77C0 +5440 +77C0 +ENDCHAR +STARTCHAR U_8B6F +ENCODING 35695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +FAA0 +0FE0 +F7C0 +0100 +FFE0 +0280 +FFE0 +9100 +FFE0 +9100 +ENDCHAR +STARTCHAR U_8B70 +ENCODING 35696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0100 +F7C0 +0100 +FFE0 +04A0 +FFE0 +94A0 +FE40 +95A0 +ENDCHAR +STARTCHAR U_8B71 +ENCODING 35697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +7FC0 +0400 +FFE0 +2480 +FFE0 +75C0 +5540 +75C0 +ENDCHAR +STARTCHAR U_8B72 +ENCODING 35698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0440 +EAA0 +0FC0 +E280 +1FE0 +E540 +AC80 +F640 +0420 +ENDCHAR +STARTCHAR U_8B73 +ENCODING 35699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4100 +FFE0 +0BA0 +E540 +0FE0 +E200 +0FE0 +EAA0 +AAA0 +E860 +ENDCHAR +STARTCHAR U_8B74 +ENCODING 35700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +EBE0 +06A0 +F2A0 +0FE0 +F520 +05E0 +F500 +95E0 +F520 +9BE0 +ENDCHAR +STARTCHAR U_8B75 +ENCODING 35701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A20 +EAA0 +1B20 +FFE0 +0A20 +EEA0 +0460 +EE20 +A420 +E6A0 +1840 +ENDCHAR +STARTCHAR U_8B76 +ENCODING 35702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0000 +3F80 +2080 +3F80 +2100 +FFE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_8B77 +ENCODING 35703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F240 +0480 +F7E0 +0C80 +F7E0 +0480 +F7E0 +9240 +F180 +9E60 +ENDCHAR +STARTCHAR U_8B78 +ENCODING 35704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +0100 +EFE0 +0120 +EFC0 +0040 +EFE0 +AB40 +EEC0 +A0C0 +ENDCHAR +STARTCHAR U_8B79 +ENCODING 35705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0440 +FFE0 +0820 +FFE0 +0520 +FAC0 +9580 +FAC0 +9520 +ENDCHAR +STARTCHAR U_8B7A +ENCODING 35706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +F8A0 +1240 +FFE0 +0860 +FF40 +0940 +FF60 +A940 +F540 +A2E0 +ENDCHAR +STARTCHAR U_8B7B +ENCODING 35707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +FFE0 +0000 +7FC0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B7C +ENCODING 35708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5500 +7BE0 +52A0 +7FE0 +0400 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B7D +ENCODING 35709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +7FC0 +4A40 +FFE0 +4040 +BFA0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B7E +ENCODING 35710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +0A20 +FEA0 +0AA0 +FA60 +0FE0 +FAA0 +9660 +FBA0 +9660 +ENDCHAR +STARTCHAR U_8B7F +ENCODING 35711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +E440 +0EE0 +E440 +0EE0 +E7C0 +0040 +EFC0 +A520 +ECA0 +B7C0 +ENDCHAR +STARTCHAR U_8B80 +ENCODING 35712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +FFE0 +0AA0 +FFE0 +0440 +F7C0 +9440 +F7C0 +9C60 +ENDCHAR +STARTCHAR U_8B81 +ENCODING 35713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +F7E0 +0940 +E3E0 +1AA0 +EBE0 +0AA0 +EBE0 +AB60 +EAA0 +17E0 +ENDCHAR +STARTCHAR U_8B82 +ENCODING 35714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +F480 +0FE0 +FAA0 +07C0 +F640 +0540 +F7C0 +9C40 +F380 +9C60 +ENDCHAR +STARTCHAR U_8B83 +ENCODING 35715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FFE0 +0440 +7FE0 +0AA0 +77C0 +0540 +76C0 +5540 +77C0 +0C60 +ENDCHAR +STARTCHAR U_8B84 +ENCODING 35716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F540 +07C0 +F540 +07C0 +F000 +0FE0 +FAA0 +9FE0 +FAA0 +9FE0 +ENDCHAR +STARTCHAR U_8B85 +ENCODING 35717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0920 +F540 +0FE0 +F540 +0FE0 +F540 +97C0 +F540 +97C0 +ENDCHAR +STARTCHAR U_8B86 +ENCODING 35718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +4A00 +BFE0 +6A40 +3F40 +22C0 +7FE0 +0000 +3FC0 +2040 +3FC0 +ENDCHAR +STARTCHAR U_8B87 +ENCODING 35719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +EAA0 +0EE0 +EAA0 +0FE0 +E920 +0AA0 +EAA0 +AAA0 +EBA0 +0860 +ENDCHAR +STARTCHAR U_8B88 +ENCODING 35720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +FEC0 +0A40 +FFE0 +0A40 +FFE0 +0A40 +F880 +92E0 +F280 +9FE0 +ENDCHAR +STARTCHAR U_8B89 +ENCODING 35721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E7C0 +1540 +EFE0 +0240 +FBC0 +0A40 +EBC0 +AA40 +EC20 +17E0 +ENDCHAR +STARTCHAR U_8B8A +ENCODING 35722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +4040 +AEA0 +EAE0 +5E40 +A0A0 +1FC0 +6900 +0600 +79E0 +ENDCHAR +STARTCHAR U_8B8B +ENCODING 35723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5200 +FBE0 +4A00 +7BC0 +4A20 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B8C +ENCODING 35724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F380 +0440 +FFE0 +0440 +FFE0 +9540 +FAA0 +92A0 +ENDCHAR +STARTCHAR U_8B8D +ENCODING 35725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +E200 +0EE0 +EAA0 +0EE0 +E200 +1FE0 +EAA0 +AEE0 +E200 +BFE0 +ENDCHAR +STARTCHAR U_8B8E +ENCODING 35726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AF40 +F1E0 +AF40 +A140 +FFE0 +A140 +FFE0 +A940 +AF40 +F1E0 +ENDCHAR +STARTCHAR U_8B8F +ENCODING 35727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +4F60 +A500 +5FE0 +C540 +4940 +FFE0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B90 +ENCODING 35728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +7BE0 +D680 +5280 +7BE0 +0400 +7FC0 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_8B91 +ENCODING 35729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +E280 +0440 +EFE0 +0AA0 +EFE0 +0000 +EFE0 +AAA0 +EFE0 +AAA0 +ENDCHAR +STARTCHAR U_8B92 +ENCODING 35730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +FFC0 +0440 +F7C0 +0480 +F7A0 +0FE0 +F540 +97C0 +F2A0 +9CE0 +ENDCHAR +STARTCHAR U_8B93 +ENCODING 35731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0AA0 +FEE0 +0280 +FFE0 +0280 +FFE0 +96A0 +FA40 +9320 +ENDCHAR +STARTCHAR U_8B94 +ENCODING 35732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +FAA0 +0BE0 +FC20 +0BE0 +FA20 +0BE0 +FC80 +9B20 +FD40 +99C0 +ENDCHAR +STARTCHAR U_8B95 +ENCODING 35733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +FAA0 +0EE0 +FAA0 +0EE0 +FFE0 +0AA0 +FFE0 +9BA0 +FD60 +9960 +ENDCHAR +STARTCHAR U_8B96 +ENCODING 35734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AC0 +F5A0 +1FE0 +EA80 +1B80 +EAA0 +1BA0 +EAC0 +AAA0 +FF60 +A220 +ENDCHAR +STARTCHAR U_8B97 +ENCODING 35735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +EFE0 +0900 +EFC0 +1900 +EFE0 +0000 +EFE0 +AAA0 +EBA0 +A860 +ENDCHAR +STARTCHAR U_8B98 +ENCODING 35736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F440 +07C0 +F440 +0FE0 +F040 +0FE0 +FAA0 +9EE0 +FAA0 +9FE0 +ENDCHAR +STARTCHAR U_8B99 +ENCODING 35737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +F280 +0EE0 +FAA0 +0EE0 +F480 +0FE0 +F480 +97E0 +F480 +97E0 +ENDCHAR +STARTCHAR U_8B9A +ENCODING 35738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +EFE0 +0240 +EFE0 +0540 +EFE0 +0440 +E7C0 +A440 +E7C0 +AC60 +ENDCHAR +STARTCHAR U_8B9B +ENCODING 35739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EFE0 +0480 +EFE0 +0AA0 +E5A0 +0EE0 +E000 +AFE0 +E280 +A7C0 +ENDCHAR +STARTCHAR U_8B9C +ENCODING 35740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +EFE0 +0AA0 +EFE0 +0AA0 +EFE0 +0100 +E7C0 +A100 +EFE0 +AAA0 +ENDCHAR +STARTCHAR U_8B9D +ENCODING 35741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +EAA0 +0FE0 +E940 +0940 +EFE0 +0AA0 +EBA0 +AAA0 +EFC0 +90A0 +ENDCHAR +STARTCHAR U_8B9E +ENCODING 35742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +E460 +1F40 +F5E0 +1F40 +F040 +1740 +F540 +9F40 +F5A0 +9520 +ENDCHAR +STARTCHAR U_8B9F +ENCODING 35743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +FFE0 +0400 +FFE0 +1500 +FFE0 +0A00 +EEE0 +AAA0 +EEE0 +BBA0 +ENDCHAR +STARTCHAR U_8BA0 +ENCODING 35744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 10 0 0 +BITMAP +40 +20 +20 +00 +E0 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR U_8BA1 +ENCODING 35745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0FE0 +E100 +2100 +2100 +2900 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BA2 +ENCODING 35746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +0080 +0080 +E080 +2080 +2080 +2080 +2880 +3080 +2380 +ENDCHAR +STARTCHAR U_8BA3 +ENCODING 35747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0100 +E180 +2140 +2120 +2920 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BA4 +ENCODING 35748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0100 +E100 +2100 +2280 +2A80 +3440 +2840 +1020 +ENDCHAR +STARTCHAR U_8BA5 +ENCODING 35749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0480 +0480 +E480 +2480 +2480 +2C80 +34A0 +28A0 +1060 +ENDCHAR +STARTCHAR U_8BA6 +ENCODING 35750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +0100 +0100 +EFE0 +2100 +2100 +2100 +2900 +3100 +2100 +ENDCHAR +STARTCHAR U_8BA7 +ENCODING 35751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4000 +2FE0 +0100 +0100 +E100 +2100 +2100 +2900 +3100 +2FE0 +ENDCHAR +STARTCHAR U_8BA8 +ENCODING 35752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2040 +0040 +E7E0 +2040 +2240 +2140 +2140 +2840 +3040 +21C0 +ENDCHAR +STARTCHAR U_8BA9 +ENCODING 35753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2100 +0100 +E1E0 +2100 +2100 +2100 +2900 +3100 +2FE0 +ENDCHAR +STARTCHAR U_8BAA +ENCODING 35754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0100 +0520 +E520 +2520 +2520 +2D20 +3520 +27E0 +0420 +ENDCHAR +STARTCHAR U_8BAB +ENCODING 35755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +0400 +0800 +E7C0 +2080 +2100 +2A00 +3420 +2420 +03E0 +ENDCHAR +STARTCHAR U_8BAC +ENCODING 35756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +41C0 +4E00 +0200 +E200 +23C0 +2E00 +2200 +2220 +3220 +21E0 +ENDCHAR +STARTCHAR U_8BAD +ENCODING 35757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +2520 +0520 +E520 +2520 +2520 +2520 +2D20 +3520 +2420 +0820 +ENDCHAR +STARTCHAR U_8BAE +ENCODING 35758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2140 +0540 +0440 +E440 +2280 +2280 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8BAF +ENCODING 35759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9F80 +4480 +4480 +0480 +C480 +5F80 +4480 +54A0 +64A0 +4460 +0420 +ENDCHAR +STARTCHAR U_8BB0 +ENCODING 35760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +27C0 +0040 +0040 +E040 +27C0 +2400 +2400 +2C20 +3420 +23E0 +ENDCHAR +STARTCHAR U_8BB1 +ENCODING 35761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +4FE0 +2120 +0120 +E520 +2520 +2920 +2220 +2220 +3540 +2880 +ENDCHAR +STARTCHAR U_8BB2 +ENCODING 35762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8480 +4480 +1FE0 +C480 +4480 +5FE0 +4480 +5480 +6480 +4880 +1080 +ENDCHAR +STARTCHAR U_8BB3 +ENCODING 35763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +07C0 +E100 +2FE0 +2120 +2920 +31A0 +2140 +0100 +ENDCHAR +STARTCHAR U_8BB4 +ENCODING 35764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +0440 +0640 +E540 +2480 +2480 +2D40 +3640 +2400 +07E0 +ENDCHAR +STARTCHAR U_8BB5 +ENCODING 35765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +0400 +E7C0 +2440 +2440 +27C0 +2C40 +3400 +2400 +07E0 +ENDCHAR +STARTCHAR U_8BB6 +ENCODING 35766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2080 +0480 +C480 +4FE0 +4080 +4180 +5280 +6480 +4A80 +1100 +ENDCHAR +STARTCHAR U_8BB7 +ENCODING 35767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07E0 +0520 +E520 +25A0 +2660 +2C20 +3420 +2420 +0460 +ENDCHAR +STARTCHAR U_8BB8 +ENCODING 35768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +07C0 +0900 +E100 +2FE0 +2100 +2900 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BB9 +ENCODING 35769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +4500 +0920 +C940 +5980 +4900 +4B00 +5900 +6920 +4920 +09E0 +ENDCHAR +STARTCHAR U_8BBA +ENCODING 35770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +0280 +0440 +E820 +2240 +2280 +2300 +2A20 +3220 +23E0 +ENDCHAR +STARTCHAR U_8BBB +ENCODING 35771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +4440 +4AA0 +0AA0 +C920 +4920 +4AA0 +5C60 +6820 +4FE0 +0820 +ENDCHAR +STARTCHAR U_8BBC +ENCODING 35772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2280 +0240 +0440 +E420 +2900 +2100 +2A40 +3240 +27A0 +0420 +ENDCHAR +STARTCHAR U_8BBD +ENCODING 35773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +04C0 +E6C0 +2540 +2540 +2540 +2EC0 +3440 +2820 +1020 +ENDCHAR +STARTCHAR U_8BBE +ENCODING 35774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2480 +0480 +08E0 +E000 +2FC0 +2440 +2280 +3100 +2280 +1C60 +ENDCHAR +STARTCHAR U_8BBF +ENCODING 35775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +0200 +E3C0 +2240 +2240 +2A40 +3240 +2440 +0980 +ENDCHAR +STARTCHAR U_8BC0 +ENCODING 35776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +07C0 +0140 +E140 +2FE0 +2100 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8BC1 +ENCODING 35777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2FE0 +2100 +0100 +E500 +25C0 +2500 +2D00 +3500 +2500 +1FE0 +ENDCHAR +STARTCHAR U_8BC2 +ENCODING 35778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8200 +4200 +1FE0 +C200 +4200 +4FC0 +4840 +5840 +6FC0 +4840 +ENDCHAR +STARTCHAR U_8BC3 +ENCODING 35779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2040 +0040 +E740 +2540 +2540 +2740 +2D40 +3040 +2140 +0080 +ENDCHAR +STARTCHAR U_8BC4 +ENCODING 35780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0920 +0540 +E100 +2FE0 +2100 +2900 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BC5 +ENCODING 35781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0440 +0440 +E7C0 +2440 +2440 +2FC0 +3440 +6440 +0FE0 +ENDCHAR +STARTCHAR U_8BC6 +ENCODING 35782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +0420 +0420 +E420 +27E0 +2420 +2A80 +3240 +2420 +0820 +ENDCHAR +STARTCHAR U_8BC7 +ENCODING 35783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4820 +0820 +CBA0 +4AA0 +4AA0 +4AA0 +4BA0 +6820 +48A0 +0840 +ENDCHAR +STARTCHAR U_8BC8 +ENCODING 35784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +03E0 +0500 +E900 +21E0 +2100 +2100 +29E0 +3100 +2100 +ENDCHAR +STARTCHAR U_8BC9 +ENCODING 35785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0400 +07E0 +E480 +2580 +24C0 +2CA0 +34A0 +2480 +0880 +ENDCHAR +STARTCHAR U_8BCA +ENCODING 35786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +0920 +E200 +2480 +2120 +2A40 +3080 +6100 +0600 +ENDCHAR +STARTCHAR U_8BCB +ENCODING 35787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +0480 +E480 +27E0 +2480 +2480 +2CA0 +35A0 +2660 +0520 +ENDCHAR +STARTCHAR U_8BCC +ENCODING 35788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23E0 +0440 +0FE0 +E020 +2020 +27E0 +2820 +3020 +27E0 +0020 +ENDCHAR +STARTCHAR U_8BCD +ENCODING 35789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2020 +0FA0 +E020 +2720 +2520 +2520 +2720 +3020 +20A0 +0040 +ENDCHAR +STARTCHAR U_8BCE +ENCODING 35790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2520 +0520 +0520 +E7E0 +2100 +2520 +2D20 +3520 +27E0 +0420 +ENDCHAR +STARTCHAR U_8BCF +ENCODING 35791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +2120 +0220 +E4A0 +2840 +27E0 +2420 +3420 +27E0 +0420 +ENDCHAR +STARTCHAR U_8BD0 +ENCODING 35792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +0FE0 +C920 +4900 +4FE0 +4A40 +4980 +6980 +5240 +2420 +ENDCHAR +STARTCHAR U_8BD1 +ENCODING 35793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0280 +0380 +EC60 +2100 +27C0 +2100 +37E0 +2100 +0100 +ENDCHAR +STARTCHAR U_8BD2 +ENCODING 35794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +0440 +0FE0 +E020 +2000 +27C0 +2C40 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BD3 +ENCODING 35795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2400 +07E0 +0480 +E480 +25C0 +2480 +2480 +37E0 +2400 +07E0 +ENDCHAR +STARTCHAR U_8BD4 +ENCODING 35796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +07C0 +E100 +2FE0 +2100 +2B80 +3540 +6920 +1120 +ENDCHAR +STARTCHAR U_8BD5 +ENCODING 35797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +1FE0 +0100 +EF00 +2500 +2500 +24A0 +26A0 +3860 +2020 +ENDCHAR +STARTCHAR U_8BD6 +ENCODING 35798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +E100 +2FE0 +2000 +2100 +2FC0 +3100 +2100 +0FE0 +ENDCHAR +STARTCHAR U_8BD7 +ENCODING 35799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +0100 +DFE0 +4080 +4FE0 +4080 +5480 +6280 +4080 +0180 +ENDCHAR +STARTCHAR U_8BD8 +ENCODING 35800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +0100 +E7C0 +2000 +27C0 +2440 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BD9 +ENCODING 35801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +0200 +0280 +E4A0 +2AA0 +22C0 +2880 +3140 +6220 +0420 +ENDCHAR +STARTCHAR U_8BDA +ENCODING 35802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +1FE0 +D100 +5100 +5D40 +5540 +5480 +74A0 +5960 +2220 +ENDCHAR +STARTCHAR U_8BDB +ENCODING 35803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +07E0 +C900 +4100 +5FE0 +4100 +5380 +6540 +4920 +0100 +ENDCHAR +STARTCHAR U_8BDC +ENCODING 35804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +07C0 +0900 +E100 +2FE0 +2280 +2280 +32A0 +24A0 +0860 +ENDCHAR +STARTCHAR U_8BDD +ENCODING 35805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +EFE0 +2100 +2100 +27C0 +2440 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BDE +ENCODING 35806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8060 +5B80 +0880 +C880 +52E0 +4A80 +4A80 +5A80 +6BE0 +5400 +23E0 +ENDCHAR +STARTCHAR U_8BDF +ENCODING 35807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +0400 +07E0 +E400 +2400 +25E0 +2D20 +3520 +29E0 +1120 +ENDCHAR +STARTCHAR U_8BE0 +ENCODING 35808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +0820 +E7C0 +2100 +2100 +2FC0 +3100 +6100 +0FE0 +ENDCHAR +STARTCHAR U_8BE1 +ENCODING 35809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4780 +0900 +1FE0 +C800 +4BC0 +4A40 +5AC0 +6A20 +5220 +23E0 +ENDCHAR +STARTCHAR U_8BE2 +ENCODING 35810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0820 +F7A0 +24A0 +27A0 +24A0 +24A0 +37A0 +2020 +00C0 +ENDCHAR +STARTCHAR U_8BE3 +ENCODING 35811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +24C0 +0700 +E420 +23E0 +2000 +27E0 +2C20 +37E0 +6420 +07E0 +ENDCHAR +STARTCHAR U_8BE4 +ENCODING 35812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +2480 +0FC0 +E140 +2FE0 +2140 +27C0 +3100 +2100 +0300 +ENDCHAR +STARTCHAR U_8BE5 +ENCODING 35813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +E100 +2240 +2780 +2120 +2A40 +3480 +2140 +0620 +ENDCHAR +STARTCHAR U_8BE6 +ENCODING 35814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +0FE0 +E100 +27C0 +2100 +2100 +2FE0 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8BE7 +ENCODING 35815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1020 +0180 +EE00 +2260 +2380 +2E00 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_8BE8 +ENCODING 35816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0200 +EFE0 +2200 +2500 +2FC0 +2100 +3FE0 +2100 +0100 +ENDCHAR +STARTCHAR U_8BE9 +ENCODING 35817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2120 +25A0 +0360 +E120 +2360 +25A0 +2920 +3120 +25A0 +0240 +ENDCHAR +STARTCHAR U_8BEA +ENCODING 35818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +0200 +CFC0 +4200 +5FE0 +4440 +4FE0 +6A40 +5140 +2080 +ENDCHAR +STARTCHAR U_8BEB +ENCODING 35819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +80C0 +40A0 +1FE0 +CA80 +4A80 +5FA0 +4AC0 +5A80 +6AA0 +4960 +1220 +ENDCHAR +STARTCHAR U_8BEC +ENCODING 35820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +0540 +E540 +2540 +2540 +2BA0 +2920 +3100 +2100 +0FE0 +ENDCHAR +STARTCHAR U_8BED +ENCODING 35821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +07C0 +E240 +2240 +2FE0 +2000 +2FC0 +3440 +2440 +07C0 +ENDCHAR +STARTCHAR U_8BEE +ENCODING 35822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +0100 +07E0 +E420 +27E0 +2420 +2FE0 +3420 +2420 +0460 +ENDCHAR +STARTCHAR U_8BEF +ENCODING 35823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +0440 +07C0 +E000 +27C0 +2100 +2FE0 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8BF0 +ENCODING 35824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +27C0 +0900 +F100 +2FE0 +2000 +2FC0 +3440 +2440 +07C0 +ENDCHAR +STARTCHAR U_8BF1 +ENCODING 35825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +0100 +EFE0 +2540 +2920 +27C0 +2A80 +32E0 +2420 +08C0 +ENDCHAR +STARTCHAR U_8BF2 +ENCODING 35826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +0800 +E7C0 +2540 +2FE0 +2540 +2D40 +37E0 +2040 +0180 +ENDCHAR +STARTCHAR U_8BF3 +ENCODING 35827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +4880 +1480 +0480 +E480 +2FE0 +3480 +2C80 +3480 +2480 +0FE0 +ENDCHAR +STARTCHAR U_8BF4 +ENCODING 35828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +07C0 +0440 +E440 +27C0 +2280 +2A80 +32A0 +24A0 +08E0 +ENDCHAR +STARTCHAR U_8BF5 +ENCODING 35829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2240 +0180 +EFE0 +2920 +2FE0 +2920 +2FE0 +3920 +2920 +0860 +ENDCHAR +STARTCHAR U_8BF6 +ENCODING 35830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +4440 +2FC0 +2400 +07C0 +E900 +2100 +2FE0 +3280 +2440 +1820 +ENDCHAR +STARTCHAR U_8BF7 +ENCODING 35831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2100 +07C0 +E100 +2FE0 +2440 +27C0 +2440 +37C0 +2440 +ENDCHAR +STARTCHAR U_8BF8 +ENCODING 35832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27A0 +0240 +EFE0 +2200 +27C0 +2440 +2FC0 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8BF9 +ENCODING 35833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +2A00 +0BE0 +EEA0 +2AA0 +2EA0 +2AA0 +2BA0 +3E40 +62A0 +0320 +ENDCHAR +STARTCHAR U_8BFA +ENCODING 35834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +0100 +EFE0 +2200 +23E0 +2E20 +3220 +23E0 +0220 +ENDCHAR +STARTCHAR U_8BFB +ENCODING 35835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +0100 +EFE0 +22A0 +2580 +2280 +2FE0 +3180 +2240 +0C20 +ENDCHAR +STARTCHAR U_8BFC +ENCODING 35836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +0420 +0A40 +FB80 +2580 +2D40 +2B40 +3520 +6920 +0600 +ENDCHAR +STARTCHAR U_8BFD +ENCODING 35837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +0EE0 +E280 +2EE0 +2280 +2280 +2EE0 +3280 +2280 +0280 +ENDCHAR +STARTCHAR U_8BFE +ENCODING 35838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2940 +0FC0 +C940 +4FC0 +4100 +5FE0 +4300 +6580 +4940 +1120 +ENDCHAR +STARTCHAR U_8BFF +ENCODING 35839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +0100 +0FE0 +E540 +2920 +2200 +2FE0 +3480 +2300 +0CE0 +ENDCHAR +STARTCHAR U_8C00 +ENCODING 35840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2D60 +0920 +EFE0 +2920 +2FE0 +2100 +2280 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_8C01 +ENCODING 35841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2480 +0FE0 +F480 +27E0 +2480 +27E0 +2C80 +3480 +27E0 +0400 +ENDCHAR +STARTCHAR U_8C02 +ENCODING 35842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +0440 +0920 +F7C0 +2080 +2100 +2AA0 +36A0 +2A40 +01C0 +ENDCHAR +STARTCHAR U_8C03 +ENCODING 35843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0BA0 +E920 +2FE0 +2820 +2BA0 +2AA0 +3BA0 +2820 +10E0 +ENDCHAR +STARTCHAR U_8C04 +ENCODING 35844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +23C0 +0480 +0900 +E6E0 +2820 +2820 +2EE0 +3820 +2FE0 +0820 +ENDCHAR +STARTCHAR U_8C05 +ENCODING 35845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0000 +E7C0 +2440 +27C0 +2100 +2100 +3540 +2920 +0300 +ENDCHAR +STARTCHAR U_8C06 +ENCODING 35846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +E7C0 +2000 +2FC0 +2080 +2100 +3FE0 +2100 +0300 +ENDCHAR +STARTCHAR U_8C07 +ENCODING 35847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0440 +0440 +E6A0 +2920 +2100 +2FE0 +3100 +2100 +0100 +ENDCHAR +STARTCHAR U_8C08 +ENCODING 35848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +2540 +2980 +0240 +EC20 +2100 +2520 +3540 +2980 +2240 +0C20 +ENDCHAR +STARTCHAR U_8C09 +ENCODING 35849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FE0 +1220 +CFC0 +4A40 +4FC0 +4A40 +4FC0 +6200 +4200 +0200 +ENDCHAR +STARTCHAR U_8C0A +ENCODING 35850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +E7C0 +2440 +2440 +27C0 +2C40 +37C0 +2440 +1FE0 +ENDCHAR +STARTCHAR U_8C0B +ENCODING 35851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0440 +E7C0 +2440 +27C0 +2100 +2FE0 +3380 +2540 +0920 +ENDCHAR +STARTCHAR U_8C0C +ENCODING 35852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +03C0 +E240 +23C0 +2240 +2FE0 +3540 +2620 +07E0 +ENDCHAR +STARTCHAR U_8C0D +ENCODING 35853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2FE0 +0540 +E5C0 +2400 +27E0 +2100 +2FE0 +3380 +2540 +0920 +ENDCHAR +STARTCHAR U_8C0E +ENCODING 35854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +0240 +EFE0 +2400 +27E0 +2000 +2D40 +3540 +2540 +0960 +ENDCHAR +STARTCHAR U_8C0F +ENCODING 35855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0100 +EFE0 +2AA0 +2920 +2FE0 +2900 +3380 +2540 +1920 +ENDCHAR +STARTCHAR U_8C10 +ENCODING 35856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +24A0 +07C0 +E4A0 +2E60 +2100 +27C0 +2C40 +37C0 +2440 +07C0 +ENDCHAR +STARTCHAR U_8C11 +ENCODING 35857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +07E0 +E520 +27C0 +2520 +25E0 +2D00 +37E0 +2900 +11E0 +ENDCHAR +STARTCHAR U_8C12 +ENCODING 35858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +0440 +E7C0 +2200 +27E0 +2CA0 +3560 +27A0 +0040 +ENDCHAR +STARTCHAR U_8C13 +ENCODING 35859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +0FE0 +E920 +2FE0 +2440 +27C0 +2C40 +37C0 +2440 +04C0 +ENDCHAR +STARTCHAR U_8C14 +ENCODING 35860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +0EE0 +0000 +E7C0 +2000 +2FE0 +2A00 +33C0 +2040 +0380 +ENDCHAR +STARTCHAR U_8C15 +ENCODING 35861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +2440 +0BA0 +E000 +2E20 +2AA0 +2EA0 +2AA0 +3EA0 +6A20 +0A60 +ENDCHAR +STARTCHAR U_8C16 +ENCODING 35862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +0540 +EFE0 +2200 +2FE0 +2200 +2FC0 +3640 +2980 +0660 +ENDCHAR +STARTCHAR U_8C17 +ENCODING 35863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +2900 +1FC0 +0A40 +EFC0 +22A0 +24E0 +2B00 +3080 +2600 +0180 +ENDCHAR +STARTCHAR U_8C18 +ENCODING 35864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +25E0 +0220 +EC80 +2540 +2620 +2000 +2FC0 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8C19 +ENCODING 35865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +0FE0 +E000 +27C0 +2440 +2FC0 +3440 +27C0 +0440 +ENDCHAR +STARTCHAR U_8C1A +ENCODING 35866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0240 +07E0 +E440 +2480 +2760 +2C80 +3720 +2840 +1380 +ENDCHAR +STARTCHAR U_8C1B +ENCODING 35867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +0FE0 +E920 +27C0 +2540 +2D40 +3540 +25C0 +0100 +ENDCHAR +STARTCHAR U_8C1C +ENCODING 35868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2AA0 +05C0 +E080 +3FE0 +2480 +25C0 +2EA0 +3480 +2A00 +11E0 +ENDCHAR +STARTCHAR U_8C1D +ENCODING 35869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +EFE0 +2800 +2FE0 +2AA0 +2FE0 +3AA0 +2AA0 +1060 +ENDCHAR +STARTCHAR U_8C1E +ENCODING 35870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4520 +05C0 +CB00 +57E0 +4440 +47C0 +5440 +67C0 +4440 +04C0 +ENDCHAR +STARTCHAR U_8C1F +ENCODING 35871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +E7C0 +2440 +27C0 +2440 +2FE0 +3100 +6280 +0C60 +ENDCHAR +STARTCHAR U_8C20 +ENCODING 35872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9240 +4A80 +5FE0 +1020 +CF80 +4880 +4880 +5F80 +6520 +4920 +10E0 +ENDCHAR +STARTCHAR U_8C21 +ENCODING 35873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +07C0 +0540 +E7C0 +2440 +2A20 +23C0 +3640 +2180 +0E60 +ENDCHAR +STARTCHAR U_8C22 +ENCODING 35874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8840 +5E40 +1240 +DFE0 +5240 +5F40 +52C0 +5E40 +6A40 +5240 +26C0 +ENDCHAR +STARTCHAR U_8C23 +ENCODING 35875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F20 +0A20 +0540 +E7C0 +2900 +2FE0 +2100 +2520 +3520 +27E0 +ENDCHAR +STARTCHAR U_8C24 +ENCODING 35876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +0FE0 +E920 +2FE0 +2200 +2BC0 +3240 +2440 +1980 +ENDCHAR +STARTCHAR U_8C25 +ENCODING 35877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +0FE0 +0280 +E440 +2820 +2FE0 +2AA0 +3AA0 +2AA0 +1FE0 +ENDCHAR +STARTCHAR U_8C26 +ENCODING 35878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5FE0 +0500 +CFC0 +4540 +5FE0 +4540 +5FC0 +6D80 +5540 +2520 +ENDCHAR +STARTCHAR U_8C27 +ENCODING 35879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8320 +4A40 +0AA0 +CB60 +55C0 +4000 +4FE0 +5AA0 +6AA0 +CAA0 +1FE0 +ENDCHAR +STARTCHAR U_8C28 +ENCODING 35880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +0280 +E100 +27C0 +2540 +2FE0 +2900 +37C0 +2100 +0FE0 +ENDCHAR +STARTCHAR U_8C29 +ENCODING 35881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +07C0 +E440 +2FE0 +2AA0 +2FE0 +2C40 +3280 +6100 +0EE0 +ENDCHAR +STARTCHAR U_8C2A +ENCODING 35882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0280 +EFE0 +2920 +2FE0 +2920 +2BA0 +3AA0 +6BA0 +0860 +ENDCHAR +STARTCHAR U_8C2B +ENCODING 35883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2FE0 +0A20 +EEA0 +2AA0 +2EA0 +2A60 +2FE0 +3120 +6220 +0CC0 +ENDCHAR +STARTCHAR U_8C2C +ENCODING 35884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +0660 +EAA0 +2300 +2480 +3A60 +2500 +3240 +2180 +0E00 +ENDCHAR +STARTCHAR U_8C2D +ENCODING 35885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +0FE0 +EAA0 +2FE0 +2440 +27C0 +3440 +2FE0 +2100 +0100 +ENDCHAR +STARTCHAR U_8C2E +ENCODING 35886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5540 +1FE0 +0CC0 +D760 +4000 +4FC0 +4840 +6FC0 +4840 +0FC0 +ENDCHAR +STARTCHAR U_8C2F +ENCODING 35887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +27E0 +0480 +0FC0 +E480 +27C0 +2480 +2FE0 +3540 +2AA0 +0AA0 +ENDCHAR +STARTCHAR U_8C30 +ENCODING 35888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +2520 +0FE0 +0920 +EFE0 +2AA0 +2FE0 +2920 +3BA0 +6D60 +0860 +ENDCHAR +STARTCHAR U_8C31 +ENCODING 35889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2FE0 +0AA0 +06C0 +EFE0 +2000 +27C0 +2C40 +37C0 +2440 +07C0 +ENDCHAR +STARTCHAR U_8C32 +ENCODING 35890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +0FE0 +E520 +2900 +2FE0 +2AA0 +2C60 +3BA0 +2AA0 +0BE0 +ENDCHAR +STARTCHAR U_8C33 +ENCODING 35891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8440 +5F60 +0440 +DFE0 +5B40 +5540 +5F40 +5540 +7F40 +D5A0 +1320 +ENDCHAR +STARTCHAR U_8C34 +ENCODING 35892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +2BE0 +0AA0 +E7E0 +3A40 +2A40 +2BE0 +2A20 +3BE0 +2C00 +13E0 +ENDCHAR +STARTCHAR U_8C35 +ENCODING 35893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +0FE0 +06A0 +E7E0 +2400 +25E0 +2C00 +35E0 +2520 +09E0 +ENDCHAR +STARTCHAR U_8C36 +ENCODING 35894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8AC0 +55A0 +1FE0 +CA80 +5B80 +4AA0 +5BA0 +4A40 +7BE0 +CAA0 +1F20 +ENDCHAR +STARTCHAR U_8C37 +ENCODING 35895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +1080 +2440 +4620 +0900 +1080 +3FC0 +D0A0 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_8C38 +ENCODING 35896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E240 +2420 +2120 +FA80 +2440 +2FE0 +2440 +4440 +47C0 +8440 +ENDCHAR +STARTCHAR U_8C39 +ENCODING 35897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4900 +87E0 +3100 +4940 +8640 +7A80 +4A80 +4D20 +7BE0 +4920 +ENDCHAR +STARTCHAR U_8C3A +ENCODING 35898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +8840 +2240 +57E0 +88C0 +7140 +5140 +5240 +7440 +0940 +0080 +ENDCHAR +STARTCHAR U_8C3B +ENCODING 35899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +8940 +1140 +33C0 +4940 +8940 +7BC0 +4940 +4940 +7920 +4920 +ENDCHAR +STARTCHAR U_8C3C +ENCODING 35900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +4940 +83E0 +3140 +4940 +8540 +7BE0 +4800 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_8C3D +ENCODING 35901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +4A40 +8520 +3080 +4BE0 +8440 +7880 +4BE0 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_8C3E +ENCODING 35902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +4FE0 +8420 +3140 +4A20 +8400 +7BE0 +4880 +4880 +7880 +4FE0 +ENDCHAR +STARTCHAR U_8C3F +ENCODING 35903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +9520 +5200 +28C0 +5520 +7E00 +11E0 +FD20 +1120 +29E0 +C520 +ENDCHAR +STARTCHAR U_8C40 +ENCODING 35904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +5520 +8AC0 +A100 +5240 +8FE0 +7100 +5FE0 +5280 +7440 +5820 +ENDCHAR +STARTCHAR U_8C41 +ENCODING 35905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD20 +9600 +78C0 +1120 +7A00 +11E0 +FD20 +4920 +49E0 +7920 +ENDCHAR +STARTCHAR U_8C42 +ENCODING 35906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4DA0 +8360 +35A0 +4B00 +8480 +7A60 +4D00 +4A40 +7880 +4F00 +ENDCHAR +STARTCHAR U_8C43 +ENCODING 35907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6E80 +9480 +2FE0 +5AA0 +8EA0 +0AA0 +EEA0 +AAA0 +BF40 +E2A0 +A320 +ENDCHAR +STARTCHAR U_8C44 +ENCODING 35908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +4FE0 +A100 +2FE0 +5AA0 +8FE0 +7440 +57C0 +5440 +77C0 +5820 +ENDCHAR +STARTCHAR U_8C45 +ENCODING 35909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +64E0 +9E80 +0AE0 +6F20 +90E0 +0E80 +EAE0 +AE80 +AAE0 +EE80 +AAE0 +ENDCHAR +STARTCHAR U_8C46 +ENCODING 35910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +7FC0 +0000 +3F80 +2080 +3F80 +2080 +1100 +0900 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8C47 +ENCODING 35911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +03E0 +0080 +7C80 +4480 +7C80 +0080 +4480 +2880 +1C80 +E3E0 +ENDCHAR +STARTCHAR U_8C48 +ENCODING 35912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +FFE0 +0000 +3F80 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_8C49 +ENCODING 35913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +03E0 +F880 +8880 +8BE0 +FA20 +0140 +8940 +5080 +3940 +C620 +ENDCHAR +STARTCHAR U_8C4A +ENCODING 35914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +7FC0 +4A40 +7FC0 +4A40 +FFE0 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8C4B +ENCODING 35915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3DE0 +4540 +A880 +5FC0 +2020 +DF80 +1080 +1F80 +0900 +FFE0 +ENDCHAR +STARTCHAR U_8C4C +ENCODING 35916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +07E0 +F420 +9200 +93E0 +F4A0 +02A0 +91E0 +6280 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_8C4D +ENCODING 35917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +07E0 +F520 +97E0 +9520 +F7E0 +1280 +9FE0 +6080 +3880 +C080 +ENDCHAR +STARTCHAR U_8C4E +ENCODING 35918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +FA40 +8980 +FA40 +A420 +FFE0 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_8C4F +ENCODING 35919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +F500 +0FE0 +F540 +9FE0 +9540 +FFC0 +9500 +6D80 +3540 +C520 +ENDCHAR +STARTCHAR U_8C50 +ENCODING 35920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +7FC0 +5540 +7FC0 +5540 +FFE0 +2080 +3F80 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_8C51 +ENCODING 35921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FBE0 +A8A0 +FBE0 +0280 +FFE0 +49A0 +7AA0 +4AE0 +3480 +F880 +ENDCHAR +STARTCHAR U_8C52 +ENCODING 35922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A940 +FFE0 +A8A0 +FBE0 +0280 +FFE0 +48A0 +79A0 +4EE0 +3080 +F880 +ENDCHAR +STARTCHAR U_8C53 +ENCODING 35923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +A900 +FA80 +0540 +F8A0 +57C0 +7540 +5540 +2540 +FFE0 +ENDCHAR +STARTCHAR U_8C54 +ENCODING 35924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D480 +FFE0 +D480 +FFE0 +D540 +FFE0 +4800 +7BE0 +4AA0 +32A0 +FFE0 +ENDCHAR +STARTCHAR U_8C55 +ENCODING 35925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0840 +1880 +6500 +0A00 +1300 +6680 +0A40 +7220 +0C00 +ENDCHAR +STARTCHAR U_8C56 +ENCODING 35926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0840 +1480 +7700 +0A00 +1B00 +6680 +0A60 +7200 +0C00 +ENDCHAR +STARTCHAR U_8C57 +ENCODING 35927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5120 +5340 +5580 +52C0 +55A0 +52A0 +5480 +5320 +5020 +8FE0 +ENDCHAR +STARTCHAR U_8C58 +ENCODING 35928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +27E0 +2900 +D540 +3540 +D7C0 +3900 +D520 +5120 +20E0 +ENDCHAR +STARTCHAR U_8C59 +ENCODING 35929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +FFE0 +1080 +6900 +1600 +6D00 +14E0 +6440 +0800 +ENDCHAR +STARTCHAR U_8C5A +ENCODING 35930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5100 +5220 +7C40 +5380 +5580 +7940 +5340 +5520 +9920 +B600 +ENDCHAR +STARTCHAR U_8C5B +ENCODING 35931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2240 +D460 +2800 +DBC0 +2E40 +C980 +0980 +5260 +2440 +ENDCHAR +STARTCHAR U_8C5C +ENCODING 35932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2140 +6540 +9940 +37E0 +5940 +B540 +5140 +9140 +1240 +6440 +ENDCHAR +STARTCHAR U_8C5D +ENCODING 35933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +22A0 +66A0 +AAA0 +33E0 +5A20 +B600 +5200 +9220 +5220 +21E0 +ENDCHAR +STARTCHAR U_8C5E +ENCODING 35934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FA00 +23E0 +D420 +3BA0 +D2A0 +3AA0 +D7A0 +1020 +50A0 +2040 +ENDCHAR +STARTCHAR U_8C5F +ENCODING 35935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +6620 +ABE0 +3200 +5BE0 +B640 +5280 +9520 +7520 +29E0 +ENDCHAR +STARTCHAR U_8C60 +ENCODING 35936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +2BC0 +6A40 +B240 +5BC0 +B640 +5240 +9240 +5FE0 +2000 +ENDCHAR +STARTCHAR U_8C61 +ENCODING 35937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +A440 +3FC0 +1440 +6E80 +1300 +6680 +1A60 +E600 +ENDCHAR +STARTCHAR U_8C62 +ENCODING 35938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0800 +FFE0 +2040 +DFA0 +0880 +7500 +0A80 +7240 +0C20 +ENDCHAR +STARTCHAR U_8C63 +ENCODING 35939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F6E0 +4240 +4A40 +AA40 +56E0 +B240 +5A40 +9640 +1240 +5440 +2840 +ENDCHAR +STARTCHAR U_8C64 +ENCODING 35940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2240 +67C0 +AA40 +33C0 +5A80 +B6A0 +5240 +9240 +5320 +2200 +ENDCHAR +STARTCHAR U_8C65 +ENCODING 35941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +6480 +A920 +33C0 +5880 +B520 +5240 +9080 +5140 +2620 +ENDCHAR +STARTCHAR U_8C66 +ENCODING 35942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +7F80 +4420 +7FE0 +4A40 +7580 +8940 +B620 +ENDCHAR +STARTCHAR U_8C67 +ENCODING 35943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +F920 +27E0 +6100 +BFE0 +5520 +B7E0 +5D20 +97E0 +5520 +2560 +ENDCHAR +STARTCHAR U_8C68 +ENCODING 35944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +21C0 +6620 +A900 +37E0 +5A80 +B7E0 +52A0 +92A0 +52E0 +2080 +ENDCHAR +STARTCHAR U_8C69 +ENCODING 35945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +6320 +AD40 +3180 +5AC0 +B5A0 +52A0 +9480 +5380 +2100 +ENDCHAR +STARTCHAR U_8C6A +ENCODING 35946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +FFE0 +8020 +3F80 +1400 +6A80 +1700 +0A80 +7460 +ENDCHAR +STARTCHAR U_8C6B +ENCODING 35947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +1480 +AFE0 +4920 +FFE0 +5220 +4540 +5B80 +4540 +5920 +C600 +ENDCHAR +STARTCHAR U_8C6C +ENCODING 35948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7A0 +2140 +6FE0 +B100 +5BC0 +B640 +5BC0 +9240 +13C0 +6240 +ENDCHAR +STARTCHAR U_8C6D +ENCODING 35949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +2520 +6520 +AF60 +3400 +5FE0 +B4A0 +57A0 +9440 +54A0 +2520 +ENDCHAR +STARTCHAR U_8C6E +ENCODING 35950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2540 +6FE0 +AC40 +57C0 +B440 +5D40 +9540 +5280 +2460 +ENDCHAR +STARTCHAR U_8C6F +ENCODING 35951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2520 +62C0 +A900 +3340 +58A0 +B7E0 +5100 +9FE0 +7280 +2C60 +ENDCHAR +STARTCHAR U_8C70 +ENCODING 35952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +1140 +FD40 +8660 +FC00 +27E0 +5940 +9140 +3880 +D540 +3220 +ENDCHAR +STARTCHAR U_8C71 +ENCODING 35953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2440 +6FC0 +B440 +27C0 +7000 +AFE0 +6AA0 +AAA0 +2AA0 +DFE0 +ENDCHAR +STARTCHAR U_8C72 +ENCODING 35954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +65E0 +AD20 +35E0 +5D20 +B5E0 +5480 +95C0 +76A0 +29A0 +ENDCHAR +STARTCHAR U_8C73 +ENCODING 35955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +A520 +EF60 +B5A0 +D6A0 +BDE0 +D6A0 +94A0 +B5A0 +FFE0 +8020 +ENDCHAR +STARTCHAR U_8C74 +ENCODING 35956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFE0 +4240 +4FE0 +B920 +6FE0 +A920 +7BA0 +AAA0 +2BA0 +6860 +ENDCHAR +STARTCHAR U_8C75 +ENCODING 35957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +4940 +D6A0 +2A20 +6880 +B880 +2A80 +6AE0 +AA80 +2D80 +C8E0 +ENDCHAR +STARTCHAR U_8C76 +ENCODING 35958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +6D40 +AFE0 +3440 +5FC0 +B440 +57C0 +9440 +77C0 +2C60 +ENDCHAR +STARTCHAR U_8C77 +ENCODING 35959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2100 +67E0 +AC20 +37E0 +5800 +B7C0 +5440 +97C0 +7280 +2FE0 +ENDCHAR +STARTCHAR U_8C78 +ENCODING 35960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +0E +30 +CB +2C +36 +CA +36 +CA +32 +C2 +0C +ENDCHAR +STARTCHAR U_8C79 +ENCODING 35961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D100 +59E0 +6220 +D520 +28A0 +58A0 +A820 +4820 +A920 +10C0 +ENDCHAR +STARTCHAR U_8C7A +ENCODING 35962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3040 +D040 +5840 +67E0 +D040 +28C0 +5940 +AA40 +4C40 +A940 +1080 +ENDCHAR +STARTCHAR U_8C7B +ENCODING 35963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +D080 +5880 +6080 +D080 +2FE0 +5880 +A880 +4880 +A880 +1080 +ENDCHAR +STARTCHAR U_8C7C +ENCODING 35964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +E480 +5C80 +24E0 +D780 +3480 +D480 +3480 +D6A0 +54E0 +2000 +ENDCHAR +STARTCHAR U_8C7D +ENCODING 35965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +E880 +5FE0 +24A0 +D4A0 +34A0 +5560 +B620 +5420 +9420 +2460 +ENDCHAR +STARTCHAR U_8C7E +ENCODING 35966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3000 +E7E0 +5080 +2100 +D380 +2D40 +D920 +2900 +C900 +2FE0 +1000 +ENDCHAR +STARTCHAR U_8C7F +ENCODING 35967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +F100 +4BE0 +3420 +D3A0 +2AA0 +DAA0 +2BA0 +C820 +28A0 +1040 +ENDCHAR +STARTCHAR U_8C80 +ENCODING 35968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3080 +D2A0 +5AA0 +62A0 +D3E0 +2880 +5AA0 +AAA0 +4AA0 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C81 +ENCODING 35969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +E100 +5FE0 +6820 +A280 +3280 +D280 +3280 +D440 +1440 +6820 +ENDCHAR +STARTCHAR U_8C82 +ENCODING 35970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +D120 +5920 +62E0 +D440 +2800 +5BE0 +AA20 +4A20 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C83 +ENCODING 35971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1880 +F100 +4BE0 +3220 +D220 +2BE0 +DA20 +2A20 +CA20 +2BE0 +1000 +ENDCHAR +STARTCHAR U_8C84 +ENCODING 35972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7C0 +5940 +67E0 +D140 +2FC0 +5900 +AFC0 +4900 +AFE0 +1100 +ENDCHAR +STARTCHAR U_8C85 +ENCODING 35973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +A480 +47E0 +AC80 +54C0 +B5C0 +56A0 +94A0 +1480 +6480 +ENDCHAR +STARTCHAR U_8C86 +ENCODING 35974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +D000 +5800 +63C0 +D240 +2BC0 +5A40 +ABC0 +4A40 +A800 +17E0 +ENDCHAR +STARTCHAR U_8C87 +ENCODING 35975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BC0 +E240 +5FC0 +3240 +D3C0 +2A20 +DB40 +2A80 +CA40 +2B60 +1200 +ENDCHAR +STARTCHAR U_8C88 +ENCODING 35976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +F3C0 +4A40 +3340 +D240 +2FE0 +DA40 +2B40 +CA40 +2A40 +14C0 +ENDCHAR +STARTCHAR U_8C89 +ENCODING 35977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +D3C0 +5D40 +6080 +D140 +2A20 +5BC0 +AA40 +4A40 +ABC0 +1240 +ENDCHAR +STARTCHAR U_8C8A +ENCODING 35978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +D080 +5900 +63E0 +D220 +2A20 +5BE0 +AA20 +4A20 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C8B +ENCODING 35979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +E440 +5FC0 +2440 +D7C0 +2800 +DFC0 +2900 +CFE0 +2900 +1100 +ENDCHAR +STARTCHAR U_8C8C +ENCODING 35980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7E0 +5C20 +67E0 +D420 +2FE0 +5A80 +AA80 +4A80 +AAA0 +1460 +ENDCHAR +STARTCHAR U_8C8D +ENCODING 35981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +33E0 +D2A0 +5AA0 +63E0 +D2A0 +2BE0 +5880 +ABE0 +4880 +A880 +17E0 +ENDCHAR +STARTCHAR U_8C8E +ENCODING 35982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3A00 +E4C0 +5C40 +26C0 +D440 +37C0 +D280 +3280 +D2A0 +54A0 +2860 +ENDCHAR +STARTCHAR U_8C8F +ENCODING 35983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7E0 +5D20 +67E0 +D520 +2FE0 +5A80 +AFE0 +4880 +A880 +1080 +ENDCHAR +STARTCHAR U_8C90 +ENCODING 35984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +E440 +5BA0 +2000 +CE20 +2AA0 +6EA0 +AAA0 +6EA0 +AA20 +6A60 +ENDCHAR +STARTCHAR U_8C91 +ENCODING 35985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +E520 +5D20 +2760 +D400 +36E0 +54A0 +B4A0 +5740 +94A0 +6520 +ENDCHAR +STARTCHAR U_8C92 +ENCODING 35986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3520 +D520 +5FE0 +6000 +DFE0 +2200 +5FE0 +AAA0 +4AA0 +AAA0 +1060 +ENDCHAR +STARTCHAR U_8C93 +ENCODING 35987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +D240 +5FE0 +6240 +D3E0 +2AA0 +5AA0 +ABE0 +4AA0 +ABE0 +1220 +ENDCHAR +STARTCHAR U_8C94 +ENCODING 35988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7E0 +5D20 +66A0 +D520 +2FE0 +5AA0 +ABC0 +4A80 +ABA0 +12E0 +ENDCHAR +STARTCHAR U_8C95 +ENCODING 35989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +D4A0 +5D40 +6380 +D140 +2FE0 +5900 +AFE0 +4900 +AA80 +1460 +ENDCHAR +STARTCHAR U_8C96 +ENCODING 35990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3440 +E240 +5080 +2FE0 +D440 +3820 +D7C0 +3540 +D540 +5FE0 +2000 +ENDCHAR +STARTCHAR U_8C97 +ENCODING 35991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +D7C0 +5D40 +67E0 +D540 +2FE0 +5920 +AFE0 +4C80 +AB80 +1460 +ENDCHAR +STARTCHAR U_8C98 +ENCODING 35992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +A280 +47C0 +A440 +57C0 +B440 +5FE0 +9100 +1280 +6C60 +ENDCHAR +STARTCHAR U_8C99 +ENCODING 35993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +6800 +DBC0 +2A40 +DBC0 +2800 +DFE0 +2920 +CFE0 +3800 +17E0 +ENDCHAR +STARTCHAR U_8C9A +ENCODING 35994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3EE0 +6AA0 +9FE0 +6540 +D7C0 +2D40 +5FC0 +A900 +4FE0 +A900 +1100 +ENDCHAR +STARTCHAR U_8C9B +ENCODING 35995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1A40 +E7E0 +5A40 +2EE0 +DAA0 +3EE0 +D7E0 +3C80 +D7C0 +5480 +27E0 +ENDCHAR +STARTCHAR U_8C9C +ENCODING 35996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +EAA0 +5AA0 +2FE0 +D480 +3FE0 +5480 +B7E0 +5240 +9180 +2660 +ENDCHAR +STARTCHAR U_8C9D +ENCODING 35997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +7F00 +4100 +7F00 +4100 +4100 +7F00 +2200 +4100 +8080 +ENDCHAR +STARTCHAR U_8C9E +ENCODING 35998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0FC0 +0800 +7F00 +4100 +7F00 +4100 +7F00 +4100 +7F00 +C180 +ENDCHAR +STARTCHAR U_8C9F +ENCODING 35999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +4100 +FF80 +0000 +7F00 +4100 +7F00 +4100 +7F00 +2200 +C180 +ENDCHAR +STARTCHAR U_8CA0 +ENCODING 36000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1F00 +2200 +FF80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8CA1 +ENCODING 36001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +7840 +4FE0 +7840 +48C0 +7940 +4A40 +7C40 +0040 +4940 +8480 +ENDCHAR +STARTCHAR U_8CA2 +ENCODING 36002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2080 +4040 +ENDCHAR +STARTCHAR U_8CA3 +ENCODING 36003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0BE0 +FC00 +0320 +00E0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CA4 +ENCODING 36004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4A80 +7AE0 +4BA0 +7EA0 +4AA0 +7AE0 +4A80 +3220 +4A20 +81E0 +ENDCHAR +STARTCHAR U_8CA5 +ENCODING 36005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +FFE0 +9000 +F380 +9280 +9280 +F280 +02A0 +94A0 +8860 +ENDCHAR +STARTCHAR U_8CA6 +ENCODING 36006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4800 +7800 +4FE0 +7A80 +4A80 +7A80 +02A0 +4AA0 +8460 +0800 +ENDCHAR +STARTCHAR U_8CA7 +ENCODING 36007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +FFE0 +1100 +FF80 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8CA8 +ENCODING 36008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2280 +6320 +ADE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CA9 +ENCODING 36009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9700 +F400 +9400 +F7E0 +9420 +9640 +F540 +0480 +A940 +9220 +ENDCHAR +STARTCHAR U_8CAA +ENCODING 36010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3580 +DF60 +0200 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CAB +ENCODING 36011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2480 +3F80 +2080 +3F80 +2080 +3F80 +1100 +2080 +ENDCHAR +STARTCHAR U_8CAC +ENCODING 36012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CAD +ENCODING 36013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4200 +7FE0 +4200 +5FC0 +5040 +5FC0 +5040 +5FC0 +4880 +9040 +ENDCHAR +STARTCHAR U_8CAE +ENCODING 36014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7A40 +0200 +FFE0 +4A00 +7A00 +4900 +7900 +4880 +78A0 +8460 +ENDCHAR +STARTCHAR U_8CAF +ENCODING 36015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +F420 +9000 +F7E0 +9080 +9080 +F080 +0080 +A080 +9180 +ENDCHAR +STARTCHAR U_8CB0 +ENCODING 36016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +FFE0 +2500 +2700 +2000 +3FC0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB1 +ENCODING 36017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +77E0 +54A0 +7480 +57E0 +7620 +5540 +7540 +0480 +5540 +8A20 +ENDCHAR +STARTCHAR U_8CB2 +ENCODING 36018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D80 +5120 +5DE0 +E000 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8CB3 +ENCODING 36019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFE0 +0100 +7D00 +0100 +FF00 +4500 +7D20 +44A0 +7C60 +C620 +ENDCHAR +STARTCHAR U_8CB4 +ENCODING 36020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CB5 +ENCODING 36021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3F80 +0800 +FFE0 +2080 +7EC0 +AFA0 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB6 +ENCODING 36022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F020 +97C0 +F100 +9080 +F7E0 +9040 +9080 +F100 +0200 +5500 +88E0 +ENDCHAR +STARTCHAR U_8CB7 +ENCODING 36023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB8 +ENCODING 36024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2240 +7FE0 +A100 +20E0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CB9 +ENCODING 36025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +F3E0 +9480 +F880 +9080 +93E0 +F080 +2080 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8CBA +ENCODING 36026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +F420 +9420 +F7E0 +9280 +9280 +F280 +22A0 +54A0 +9860 +ENDCHAR +STARTCHAR U_8CBB +ENCODING 36027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7FC0 +1240 +FFE0 +2220 +FFE0 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CBC +ENCODING 36028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +48E0 +7880 +4880 +7BE0 +4A20 +7A20 +3220 +4BE0 +8620 +ENDCHAR +STARTCHAR U_8CBD +ENCODING 36029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +F240 +9420 +FFE0 +9000 +97C0 +F440 +0440 +57C0 +8C40 +ENDCHAR +STARTCHAR U_8CBE +ENCODING 36030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9780 +F480 +9480 +F7E0 +9480 +9480 +F480 +0540 +A740 +94A0 +ENDCHAR +STARTCHAR U_8CBF +ENCODING 36031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +EF80 +8480 +A480 +D880 +7F00 +4100 +7F00 +4100 +7F00 +2200 +C180 +ENDCHAR +STARTCHAR U_8CC0 +ENCODING 36032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +2A20 +4BE0 +9000 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CC1 +ENCODING 36033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1500 +FFE0 +1100 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CC2 +ENCODING 36034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9440 +FA80 +9100 +F280 +9C60 +F7C0 +0440 +A440 +97C0 +ENDCHAR +STARTCHAR U_8CC3 +ENCODING 36035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +2200 +7FE0 +A200 +3FE0 +2080 +3C80 +2780 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CC4 +ENCODING 36036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F200 +93E0 +F620 +9BE0 +9220 +F3E0 +0220 +A220 +9260 +ENDCHAR +STARTCHAR U_8CC5 +ENCODING 36037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F240 +9780 +F120 +9240 +F480 +0140 +6220 +9420 +ENDCHAR +STARTCHAR U_8CC6 +ENCODING 36038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +8940 +FFE0 +8A40 +FA40 +8A40 +FFE0 +0240 +5240 +8A40 +8C40 +ENDCHAR +STARTCHAR U_8CC7 +ENCODING 36039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8800 +5FC0 +2240 +FF00 +61C0 +3F00 +2100 +3F00 +2100 +3F00 +E1C0 +ENDCHAR +STARTCHAR U_8CC8 +ENCODING 36040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2080 +3C80 +2780 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CC9 +ENCODING 36041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F200 +97C0 +F540 +9540 +F540 +9540 +F540 +0540 +6540 +9FE0 +ENDCHAR +STARTCHAR U_8CCA +ENCODING 36042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +90A0 +FFE0 +9280 +F2A0 +9FA0 +92C0 +F2A0 +2260 +54A0 +8920 +ENDCHAR +STARTCHAR U_8CCB +ENCODING 36043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8880 +FFE0 +8A40 +FC20 +8A40 +FA40 +0180 +5180 +8A40 +8C20 +ENDCHAR +STARTCHAR U_8CCC +ENCODING 36044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1200 +3C80 +0B80 +1C40 +E080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CCD +ENCODING 36045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +FA80 +8A80 +FA80 +8BE0 +FA80 +8A80 +5280 +4C80 +8BE0 +ENDCHAR +STARTCHAR U_8CCE +ENCODING 36046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +93C0 +FE00 +93C0 +9E00 +F3C0 +9E00 +F240 +5180 +56A0 +8860 +ENDCHAR +STARTCHAR U_8CCF +ENCODING 36047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +8A20 +FBE0 +8A20 +FBE0 +8A20 +8A20 +FBE0 +5140 +8E20 +ENDCHAR +STARTCHAR U_8CD0 +ENCODING 36048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F240 +97E0 +F240 +9520 +F1C0 +9240 +F640 +0140 +6180 +9660 +ENDCHAR +STARTCHAR U_8CD1 +ENCODING 36049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +95C0 +F400 +97E0 +F540 +9540 +F560 +2540 +55A0 +8920 +ENDCHAR +STARTCHAR U_8CD2 +ENCODING 36050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +9820 +F380 +9000 +FFE0 +9100 +F540 +2940 +5120 +8B20 +ENDCHAR +STARTCHAR U_8CD3 +ENCODING 36051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2500 +FF80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CD4 +ENCODING 36052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +7FC0 +4440 +7FC0 +5040 +5FC0 +5040 +5FC0 +8880 +ENDCHAR +STARTCHAR U_8CD5 +ENCODING 36053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8920 +8FE0 +F900 +8D40 +FB80 +8B40 +FD40 +2920 +5720 +8A00 +ENDCHAR +STARTCHAR U_8CD6 +ENCODING 36054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8940 +FE20 +8BC0 +F880 +8FE0 +F880 +8AC0 +54A0 +4880 +8580 +ENDCHAR +STARTCHAR U_8CD7 +ENCODING 36055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +F4A0 +97E0 +9080 +F7E0 +94A0 +F7E0 +24A0 +5080 +8880 +ENDCHAR +STARTCHAR U_8CD8 +ENCODING 36056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +E100 +AFE0 +E900 +A900 +EFC0 +A900 +E940 +4920 +5100 +AFE0 +ENDCHAR +STARTCHAR U_8CD9 +ENCODING 36057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9520 +F7E0 +9520 +F7E0 +9420 +97A0 +F6A0 +27A0 +5420 +9860 +ENDCHAR +STARTCHAR U_8CDA +ENCODING 36058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5F40 +E4E0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CDB +ENCODING 36059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BC0 +2080 +7BC0 +2080 +DB60 +3F80 +2280 +2C80 +3F80 +71C0 +ENDCHAR +STARTCHAR U_8CDC +ENCODING 36060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +F440 +97C0 +F200 +97E0 +FAA0 +24A0 +5120 +8AC0 +ENDCHAR +STARTCHAR U_8CDD +ENCODING 36061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9820 +9280 +F440 +9900 +FFE0 +9100 +F380 +2540 +5920 +8920 +ENDCHAR +STARTCHAR U_8CDE +ENCODING 36062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +9120 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CDF +ENCODING 36063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +EAA0 +AAA0 +EFE0 +AAA0 +AAA0 +EFE0 +2280 +5440 +8820 +ENDCHAR +STARTCHAR U_8CE0 +ENCODING 36064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F440 +9280 +FFE0 +9000 +F3C0 +9240 +2240 +53C0 +8A40 +ENDCHAR +STARTCHAR U_8CE1 +ENCODING 36065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4440 +7FE0 +4840 +7FC0 +5080 +7FC0 +50A0 +9F80 +70E0 +ENDCHAR +STARTCHAR U_8CE2 +ENCODING 36066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A240 +F980 +8A40 +FC20 +FF80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CE3 +ENCODING 36067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +4A40 +7FC0 +2080 +3F80 +2080 +3F80 +F0E0 +ENDCHAR +STARTCHAR U_8CE4 +ENCODING 36068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +F140 +90A0 +F760 +9280 +9240 +FFE0 +2140 +50A0 +9F60 +ENDCHAR +STARTCHAR U_8CE5 +ENCODING 36069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F440 +9440 +FAA0 +9120 +9100 +FFE0 +2100 +5100 +9100 +ENDCHAR +STARTCHAR U_8CE6 +ENCODING 36070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9EC0 +F0A0 +9FE0 +F280 +9280 +9B80 +FAA0 +2AA0 +5F60 +9020 +ENDCHAR +STARTCHAR U_8CE7 +ENCODING 36071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9540 +F980 +9140 +F220 +9D00 +9520 +F540 +2980 +5240 +8C20 +ENDCHAR +STARTCHAR U_8CE8 +ENCODING 36072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +FFE0 +2480 +7FC0 +A0A0 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CE9 +ENCODING 36073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7A20 +49C0 +4800 +7BE0 +4880 +49C0 +7AA0 +4880 +8580 +ENDCHAR +STARTCHAR U_8CEA +ENCODING 36074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4200 +7FE0 +5280 +9480 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CEB +ENCODING 36075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +5540 +FFE0 +A0A0 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8CEC +ENCODING 36076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +F7C0 +9400 +F7C0 +9400 +9FE0 +F540 +2480 +5540 +8E20 +ENDCHAR +STARTCHAR U_8CED +ENCODING 36077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9120 +F7A0 +9140 +FFE0 +9200 +97C0 +FA40 +23C0 +5240 +8BC0 +ENDCHAR +STARTCHAR U_8CEE +ENCODING 36078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0880 +FFE0 +5240 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CEF +ENCODING 36079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7E0 +9AA0 +F3A0 +92A0 +F3A0 +97C0 +F080 +0FE0 +5100 +9300 +ENDCHAR +STARTCHAR U_8CF0 +ENCODING 36080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F100 +97C0 +F200 +9FE0 +9660 +FBC0 +2240 +53C0 +9A40 +ENDCHAR +STARTCHAR U_8CF1 +ENCODING 36081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9920 +FFE0 +9540 +F7C0 +9540 +97C0 +F100 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_8CF2 +ENCODING 36082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1780 +2480 +EFE0 +2380 +2540 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8CF3 +ENCODING 36083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +94C0 +FEA0 +9480 +FFE0 +9080 +9EA0 +FAA0 +2EC0 +5120 +8A20 +ENDCHAR +STARTCHAR U_8CF4 +ENCODING 36084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA40 +27E0 +FA20 +ABE0 +AA20 +FBE0 +2220 +73E0 +A940 +2620 +ENDCHAR +STARTCHAR U_8CF5 +ENCODING 36085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +F5A0 +9420 +F3C0 +9240 +93C0 +F240 +23C0 +5240 +9BC0 +ENDCHAR +STARTCHAR U_8CF6 +ENCODING 36086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F280 +9440 +F920 +97E0 +F520 +94A0 +F7E0 +0540 +5540 +99C0 +ENDCHAR +STARTCHAR U_8CF7 +ENCODING 36087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5540 +FFE0 +8020 +3F80 +2080 +3F80 +2080 +3F80 +C060 +ENDCHAR +STARTCHAR U_8CF8 +ENCODING 36088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7920 +5540 +5FE0 +7200 +5FE0 +5440 +7F60 +55C0 +5440 +97C0 +BC60 +ENDCHAR +STARTCHAR U_8CF9 +ENCODING 36089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +F7E0 +9280 +F440 +9820 +97C0 +F540 +2540 +5540 +9FE0 +ENDCHAR +STARTCHAR U_8CFA +ENCODING 36090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +F280 +9FE0 +F2A0 +9FE0 +92A0 +FFE0 +0280 +56C0 +8AA0 +ENDCHAR +STARTCHAR U_8CFB +ENCODING 36091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9FE0 +F520 +97E0 +F520 +97E0 +9040 +FFE0 +2240 +5140 +9880 +ENDCHAR +STARTCHAR U_8CFC +ENCODING 36092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +F280 +97C0 +9280 +FFE0 +9540 +97C0 +F540 +6FE0 +9440 +ENDCHAR +STARTCHAR U_8CFD +ENCODING 36093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8A20 +7FC0 +1200 +FFC0 +2080 +7FC0 +A0A0 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8CFE +ENCODING 36094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +A100 +F7C0 +D100 +D7E0 +F440 +A7C0 +A440 +FFC0 +0C60 +ENDCHAR +STARTCHAR U_8CFF +ENCODING 36095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +95A0 +F360 +95A0 +F240 +9D20 +9280 +F120 +0640 +6080 +9700 +ENDCHAR +STARTCHAR U_8D00 +ENCODING 36096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9360 +F940 +9080 +F960 +3F80 +2080 +3F80 +2080 +3F80 +60C0 +ENDCHAR +STARTCHAR U_8D01 +ENCODING 36097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +79E0 +4940 +7A40 +9140 +7940 +4880 +7880 +5140 +8A20 +ENDCHAR +STARTCHAR U_8D02 +ENCODING 36098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +97A0 +F540 +97E0 +9180 +F660 +9140 +F6A0 +2120 +5040 +8B80 +ENDCHAR +STARTCHAR U_8D03 +ENCODING 36099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9540 +F7C0 +9100 +F7E0 +9520 +F7E0 +0140 +66A0 +9BC0 +ENDCHAR +STARTCHAR U_8D04 +ENCODING 36100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5140 +FB40 +22A0 +3F80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D05 +ENCODING 36101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FDE0 +1340 +FC80 +4940 +BFA0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D06 +ENCODING 36102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9FE0 +F100 +9280 +9C60 +F280 +95A0 +FFE0 +2480 +5B40 +8920 +ENDCHAR +STARTCHAR U_8D07 +ENCODING 36103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +46C0 +F0A0 +AFE0 +4A80 +ABE0 +3FA0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D08 +ENCODING 36104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +FFE0 +9AA0 +9FE0 +F000 +97C0 +F440 +27C0 +5440 +8FC0 +ENDCHAR +STARTCHAR U_8D09 +ENCODING 36105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +FFE0 +9AA0 +9FE0 +F440 +97C0 +F440 +2FE0 +5100 +8900 +ENDCHAR +STARTCHAR U_8D0A +ENCODING 36106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +FFC0 +A500 +FFE0 +5A80 +BFE0 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D0B +ENCODING 36107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5480 +7FE0 +5480 +57E0 +5400 +4FC0 +4840 +4FC0 +4480 +9860 +ENDCHAR +STARTCHAR U_8D0C +ENCODING 36108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AA0 +F6C0 +9FE0 +F280 +97C0 +F100 +97C0 +F100 +0FE0 +5280 +8C60 +ENDCHAR +STARTCHAR U_8D0D +ENCODING 36109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9480 +F7E0 +9CA0 +97E0 +F400 +97C0 +F400 +2BC0 +5240 +93C0 +ENDCHAR +STARTCHAR U_8D0E +ENCODING 36110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +9280 +F7C0 +9540 +F7C0 +9540 +FFE0 +0920 +6BA0 +9860 +ENDCHAR +STARTCHAR U_8D0F +ENCODING 36111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +2080 +7FC0 +4940 +7F40 +49C0 +7F40 +8A60 +ENDCHAR +STARTCHAR U_8D10 +ENCODING 36112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +F160 +97C0 +9140 +FFE0 +9280 +F540 +2FE0 +5AA0 +8FE0 +ENDCHAR +STARTCHAR U_8D11 +ENCODING 36113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +5080 +FFE0 +8A40 +FBC0 +8A40 +FBC0 +2240 +FBC0 +2420 +ENDCHAR +STARTCHAR U_8D12 +ENCODING 36114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A2A0 +FBE0 +8920 +FFE0 +2080 +3F80 +2080 +3F80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8D13 +ENCODING 36115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E0C0 +A0A0 +EFE0 +BA80 +AF80 +F9A0 +AFA0 +EAC0 +4F60 +A8A0 +B120 +ENDCHAR +STARTCHAR U_8D14 +ENCODING 36116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +7BC0 +CA60 +7BC0 +4A40 +7BC0 +CE60 +ENDCHAR +STARTCHAR U_8D15 +ENCODING 36117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +AFE0 +A880 +BFE0 +EAA0 +AFE0 +AA40 +EBC0 +2240 +63C0 +A660 +ENDCHAR +STARTCHAR U_8D16 +ENCODING 36118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +F100 +9FE0 +9AA0 +FFE0 +9440 +F7C0 +2440 +57C0 +8C60 +ENDCHAR +STARTCHAR U_8D17 +ENCODING 36119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AFC0 +E840 +AFE0 +AAA0 +BFE0 +9040 +9FC0 +9040 +9FC0 +B060 +ENDCHAR +STARTCHAR U_8D18 +ENCODING 36120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +FFE0 +9AA0 +F7C0 +9540 +F4C0 +9640 +F540 +07C0 +5280 +9440 +ENDCHAR +STARTCHAR U_8D19 +ENCODING 36121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1CE0 +1080 +FFE0 +92A0 +BFE0 +A940 +3FE0 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_8D1A +ENCODING 36122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +EEE0 +AA80 +FFE0 +A020 +EEE0 +AA80 +EEE0 +0A80 +AEA0 +AAE0 +ENDCHAR +STARTCHAR U_8D1B +ENCODING 36123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +5540 +FFE0 +4880 +7FE0 +4A40 +7BC0 +2240 +FBC0 +2420 +ENDCHAR +STARTCHAR U_8D1C +ENCODING 36124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +EFE0 +A080 +E7E0 +B480 +FFA0 +A5A0 +FFC0 +1540 +B7C0 +A8A0 +ENDCHAR +STARTCHAR U_8D1D +ENCODING 36125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 1 -1 +BITMAP +7F +41 +49 +49 +49 +49 +49 +49 +14 +23 +C1 +ENDCHAR +STARTCHAR U_8D1E +ENCODING 36126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +07E0 +0400 +3F80 +2080 +2480 +2480 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D1F +ENCODING 36127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +1000 +1F00 +2200 +7F80 +A080 +2480 +2480 +2480 +2480 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_8D20 +ENCODING 36128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +2000 +3200 +4100 +FF80 +0100 +7F00 +4900 +4900 +5500 +2200 +C180 +ENDCHAR +STARTCHAR U_8D21 +ENCODING 36129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0000 +3F80 +2080 +2480 +2480 +2A80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8D22 +ENCODING 36130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +AFE0 +A880 +A980 +A980 +AA80 +2280 +5480 +4880 +8180 +ENDCHAR +STARTCHAR U_8D23 +ENCODING 36131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +7FC0 +0400 +FFE0 +2080 +2480 +2480 +0900 +F0E0 +ENDCHAR +STARTCHAR U_8D24 +ENCODING 36132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +9240 +9180 +9240 +3FA0 +2080 +2480 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D25 +ENCODING 36133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +A9E0 +A940 +AB40 +AD40 +A940 +2140 +5080 +4940 +8A20 +ENDCHAR +STARTCHAR U_8D26 +ENCODING 36134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +8A40 +AA80 +AB00 +AA00 +AFE0 +AA80 +2280 +5240 +4B40 +8A20 +ENDCHAR +STARTCHAR U_8D27 +ENCODING 36135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2380 +6E20 +A1E0 +0000 +3F80 +2080 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D28 +ENCODING 36136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +4200 +7FE0 +4200 +5FC0 +5040 +5240 +5240 +8500 +B8E0 +ENDCHAR +STARTCHAR U_8D29 +ENCODING 36137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F820 +8BC0 +AA00 +ABE0 +AAA0 +AAA0 +AAA0 +22A0 +5240 +4CA0 +8920 +ENDCHAR +STARTCHAR U_8D2A +ENCODING 36138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +3580 +DF60 +0100 +3F80 +2480 +2480 +2A80 +1100 +60C0 +ENDCHAR +STARTCHAR U_8D2B +ENCODING 36139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2080 +DFE0 +0880 +1100 +7F80 +2080 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D2C +ENCODING 36140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +8F80 +A900 +A880 +AFE0 +A840 +A880 +A900 +5200 +4D00 +88E0 +ENDCHAR +STARTCHAR U_8D2D +ENCODING 36141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8A00 +ABE0 +AC20 +A920 +AA20 +AAA0 +2760 +5020 +4820 +88C0 +ENDCHAR +STARTCHAR U_8D2E +ENCODING 36142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8880 +ABE0 +AA20 +AA20 +A800 +A800 +2000 +5000 +4BE0 +8800 +ENDCHAR +STARTCHAR U_8D2F +ENCODING 36143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2480 +3F80 +0000 +3F80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D30 +ENCODING 36144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +0140 +FFE0 +0100 +7D00 +0100 +7D00 +5520 +54A0 +2860 +C620 +ENDCHAR +STARTCHAR U_8D31 +ENCODING 36145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +8A40 +AFC0 +AA00 +AA60 +AF80 +A920 +2140 +50A0 +4960 +8620 +ENDCHAR +STARTCHAR U_8D32 +ENCODING 36146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1500 +FFE0 +1100 +3F80 +2080 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D33 +ENCODING 36147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +2480 +2780 +2000 +3FE0 +2080 +2480 +2480 +0B00 +70C0 +ENDCHAR +STARTCHAR U_8D34 +ENCODING 36148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8880 +A8E0 +A880 +A880 +ABE0 +AA20 +AA20 +2220 +53E0 +8A20 +ENDCHAR +STARTCHAR U_8D35 +ENCODING 36149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +2480 +3F80 +0400 +FFE0 +2080 +2480 +2480 +0B00 +F0E0 +ENDCHAR +STARTCHAR U_8D36 +ENCODING 36150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AA20 +AA20 +AA20 +ABE0 +A940 +A940 +3140 +4A40 +8460 +ENDCHAR +STARTCHAR U_8D37 +ENCODING 36151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +24E0 +6F00 +A120 +20E0 +3F80 +2080 +2480 +2480 +1900 +E0E0 +ENDCHAR +STARTCHAR U_8D38 +ENCODING 36152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +4120 +5120 +FAC0 +0800 +3F80 +2080 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D39 +ENCODING 36153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +FF80 +1280 +FF80 +9200 +FFC0 +4140 +4900 +4900 +1600 +E180 +ENDCHAR +STARTCHAR U_8D3A +ENCODING 36154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +25E0 +4400 +9FC0 +1040 +1240 +1240 +1240 +0D80 +7060 +ENDCHAR +STARTCHAR U_8D3B +ENCODING 36155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8900 +AA40 +AFE0 +A820 +A800 +ABE0 +2220 +5220 +4BE0 +8A20 +ENDCHAR +STARTCHAR U_8D3C +ENCODING 36156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +88A0 +AFE0 +AA80 +AAA0 +AFA0 +AAC0 +A280 +54A0 +4960 +9220 +ENDCHAR +STARTCHAR U_8D3D +ENCODING 36157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FF80 +2280 +F780 +22A0 +6460 +3F80 +2080 +2480 +0B00 +70C0 +ENDCHAR +STARTCHAR U_8D3E +ENCODING 36158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0000 +3F80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D3F +ENCODING 36159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +A900 +ABE0 +AA20 +AFE0 +AA20 +23E0 +5220 +4A20 +8A60 +ENDCHAR +STARTCHAR U_8D40 +ENCODING 36160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +BA80 +A320 +FBE0 +0000 +3F80 +2080 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_8D41 +ENCODING 36161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4200 +DFE0 +4200 +4FC0 +0000 +3F80 +2480 +2480 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_8D42 +ENCODING 36162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8BE0 +AA40 +AD80 +AA40 +AC20 +ABC0 +2240 +5240 +4BC0 +8A40 +ENDCHAR +STARTCHAR U_8D43 +ENCODING 36163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BE0 +AA00 +AA80 +AA80 +ABE0 +AA80 +2280 +5480 +4880 +8BE0 +ENDCHAR +STARTCHAR U_8D44 +ENCODING 36164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2FE0 +D240 +4500 +48C0 +3F80 +2080 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D45 +ENCODING 36165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8FE0 +A900 +AA40 +ABC0 +A880 +A920 +2640 +5080 +4940 +8E20 +ENDCHAR +STARTCHAR U_8D46 +ENCODING 36166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AA20 +ABE0 +AA40 +AA20 +AA80 +2460 +5580 +4840 +8820 +ENDCHAR +STARTCHAR U_8D47 +ENCODING 36167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +88A0 +AFE0 +A880 +ACA0 +AAC0 +A9C0 +22A0 +54A0 +4AA0 +8900 +ENDCHAR +STARTCHAR U_8D48 +ENCODING 36168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +ABE0 +A800 +AFE0 +AA80 +AAA0 +AA40 +2A40 +5AA0 +8B20 +ENDCHAR +STARTCHAR U_8D49 +ENCODING 36169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1480 +FFE0 +2480 +7FC0 +A0A0 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D4A +ENCODING 36170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8940 +AA20 +ADC0 +A800 +AFE0 +A880 +22C0 +54A0 +4CA0 +8980 +ENDCHAR +STARTCHAR U_8D4B +ENCODING 36171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8EC0 +A8A0 +AFE0 +AA80 +AA80 +AB80 +AAA0 +2AA0 +5B60 +8C20 +ENDCHAR +STARTCHAR U_8D4C +ENCODING 36172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FA0 +A940 +AFE0 +A900 +ABC0 +AA40 +27C0 +5240 +4A40 +8BC0 +ENDCHAR +STARTCHAR U_8D4D +ENCODING 36173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5540 +FFE0 +8020 +3F80 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D4E +ENCODING 36174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +A900 +AFE0 +AAA0 +AD80 +AA80 +A7E0 +3100 +4A80 +8C60 +ENDCHAR +STARTCHAR U_8D4F +ENCODING 36175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +1500 +FFE0 +9120 +1F00 +0000 +3F80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D50 +ENCODING 36176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +ABC0 +AA40 +ABC0 +AA00 +AFE0 +A2A0 +24A0 +5120 +8AC0 +ENDCHAR +STARTCHAR U_8D51 +ENCODING 36177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +2480 +0A00 +1100 +FBE0 +AAA0 +AAA0 +2080 +5140 +8A20 +ENDCHAR +STARTCHAR U_8D52 +ENCODING 36178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +AAA0 +ABE0 +AAA0 +ABE0 +AA20 +ABA0 +52A0 +4BA0 +8460 +ENDCHAR +STARTCHAR U_8D53 +ENCODING 36179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4240 +7FE0 +4240 +5FC0 +4880 +5AC0 +6AA0 +8500 +98E0 +ENDCHAR +STARTCHAR U_8D54 +ENCODING 36180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F880 +8FE0 +AA40 +A980 +AFE0 +A800 +23C0 +5240 +4A40 +8BC0 +ENDCHAR +STARTCHAR U_8D55 +ENCODING 36181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +8AC0 +AC80 +A940 +AAA0 +AC80 +AAA0 +22C0 +5580 +4A40 +8C20 +ENDCHAR +STARTCHAR U_8D56 +ENCODING 36182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +2240 +FFE0 +AA20 +AAA0 +FAA0 +22A0 +7080 +A940 +2620 +ENDCHAR +STARTCHAR U_8D57 +ENCODING 36183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +AAA0 +AA20 +AAA0 +A800 +ABE0 +22A0 +5360 +4AA0 +8BE0 +ENDCHAR +STARTCHAR U_8D58 +ENCODING 36184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FF40 +2480 +4960 +BF80 +2080 +2480 +2480 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_8D59 +ENCODING 36185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +8FE0 +AAA0 +ABE0 +AAA0 +ABE0 +AAA0 +2040 +57E0 +4A40 +89C0 +ENDCHAR +STARTCHAR U_8D5A +ENCODING 36186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +FFE0 +8A80 +AFE0 +AAA0 +AFE0 +AAA0 +2FE0 +5280 +56C0 +8AA0 +ENDCHAR +STARTCHAR U_8D5B +ENCODING 36187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +7FC0 +1200 +FFE0 +3180 +D560 +1500 +0B00 +70C0 +ENDCHAR +STARTCHAR U_8D5C +ENCODING 36188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +97E0 +9080 +BBE0 +A880 +ABE0 +BA20 +92A0 +92A0 +9140 +FE20 +ENDCHAR +STARTCHAR U_8D5D +ENCODING 36189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +EFC0 +A900 +AFC0 +A900 +BFC0 +9040 +9240 +8500 +F8E0 +ENDCHAR +STARTCHAR U_8D5E +ENCODING 36190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +7BC0 +9480 +FFE0 +35A0 +5AE0 +BF80 +2480 +2480 +0A00 +71C0 +ENDCHAR +STARTCHAR U_8D5F +ENCODING 36191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26C0 +F880 +57E0 +2280 +5B40 +8A40 +3FA0 +2480 +2480 +0A00 +3180 +ENDCHAR +STARTCHAR U_8D60 +ENCODING 36192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +8FE0 +A920 +ADA0 +AFE0 +A800 +A7C0 +2440 +57C0 +5440 +87C0 +ENDCHAR +STARTCHAR U_8D61 +ENCODING 36193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +AFE0 +AA40 +ABE0 +AA00 +AAE0 +A200 +35E0 +4D20 +89E0 +ENDCHAR +STARTCHAR U_8D62 +ENCODING 36194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2000 +3FC0 +1080 +7FC0 +5140 +7540 +55C0 +7540 +9A60 +ENDCHAR +STARTCHAR U_8D63 +ENCODING 36195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +FA80 +5140 +FFE0 +9080 +F7E0 +9220 +F2A0 +22A0 +F940 +2620 +ENDCHAR +STARTCHAR U_8D64 +ENCODING 36196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +3FC0 +0400 +FFE0 +0900 +2940 +2920 +4920 +1500 +6200 +ENDCHAR +STARTCHAR U_8D65 +ENCODING 36197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +2420 +F940 +5100 +5900 +D680 +5280 +9440 +B820 +ENDCHAR +STARTCHAR U_8D66 +ENCODING 36198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +11E0 +1340 +FD40 +2940 +6D40 +AB40 +2A80 +4940 +9A20 +ENDCHAR +STARTCHAR U_8D67 +ENCODING 36199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1160 +1100 +FFE0 +2920 +6D20 +ABA0 +A940 +49A0 +9920 +ENDCHAR +STARTCHAR U_8D68 +ENCODING 36200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7C80 +13E0 +FEA0 +2AA0 +6EA0 +ABE0 +AA80 +28A0 +48A0 +9BE0 +ENDCHAR +STARTCHAR U_8D69 +ENCODING 36201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DC0 +1280 +FFE0 +2AA0 +2AA0 +6FE0 +AA00 +2A20 +4A20 +99E0 +ENDCHAR +STARTCHAR U_8D6A +ENCODING 36202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8E0 +2080 +FFE0 +5220 +5AA0 +D6A0 +52A0 +52A0 +9140 +B220 +ENDCHAR +STARTCHAR U_8D6B +ENCODING 36203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +1080 +FFE0 +2940 +6D40 +AB60 +AD60 +2940 +4A40 +98C0 +ENDCHAR +STARTCHAR U_8D6C +ENCODING 36204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +7C80 +13E0 +FE20 +2BE0 +2A20 +6FE0 +AA20 +2BE0 +4940 +9A20 +ENDCHAR +STARTCHAR U_8D6D +ENCODING 36205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1120 +7FA0 +1140 +13E0 +FD00 +2BE0 +6E20 +ABE0 +2A20 +4BE0 +9A20 +ENDCHAR +STARTCHAR U_8D6E +ENCODING 36206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +FD20 +2520 +FF60 +5400 +57E0 +DCA0 +57A0 +5440 +94A0 +3520 +ENDCHAR +STARTCHAR U_8D6F +ENCODING 36207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FE0 +12A0 +13E0 +FEA0 +2BE0 +6E80 +ABE0 +2A20 +4FE0 +9A20 +ENDCHAR +STARTCHAR U_8D70 +ENCODING 36208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +0400 +FFE0 +0400 +2400 +27C0 +2400 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8D71 +ENCODING 36209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +7FC0 +0400 +FFE0 +2080 +1100 +0600 +1800 +E600 +41E0 +ENDCHAR +STARTCHAR U_8D72 +ENCODING 36210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7FE0 +1120 +FD20 +1120 +5D20 +5220 +54C0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D73 +ENCODING 36211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1140 +7D40 +1140 +FF40 +11C0 +5F40 +5040 +7040 +9840 +87E0 +ENDCHAR +STARTCHAR U_8D74 +ENCODING 36212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7C80 +10C0 +FEA0 +10A0 +5E80 +5080 +7080 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D75 +ENCODING 36213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1240 +7D40 +1080 +FE80 +1080 +5D40 +5140 +7240 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D76 +ENCODING 36214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +7C80 +1080 +FFE0 +1080 +5C80 +5080 +5080 +7080 +8FE0 +ENDCHAR +STARTCHAR U_8D77 +ENCODING 36215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13C0 +7C40 +1040 +FFC0 +1200 +5220 +5E20 +53E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D78 +ENCODING 36216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7EA0 +12A0 +FEA0 +12A0 +5EA0 +53E0 +7220 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D79 +ENCODING 36217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11E0 +7E20 +1120 +FCA0 +1060 +5FA0 +5120 +70C0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D7A +ENCODING 36218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +2080 +F940 +2220 +FCA0 +5080 +5BE0 +5040 +5080 +B100 +8FE0 +ENDCHAR +STARTCHAR U_8D7B +ENCODING 36219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +10C0 +7DA0 +12A0 +FC80 +10A0 +5C40 +5080 +7300 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D7C +ENCODING 36220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +7BE0 +1420 +F940 +1100 +5E80 +5240 +5460 +7440 +8FE0 +ENDCHAR +STARTCHAR U_8D7D +ENCODING 36221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +7D40 +1140 +FD40 +13E0 +5D00 +5280 +7460 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D7E +ENCODING 36222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +7980 +1100 +11E0 +FF40 +1140 +5D40 +5240 +5240 +7400 +8FE0 +ENDCHAR +STARTCHAR U_8D7F +ENCODING 36223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +1380 +7A80 +1280 +FFE0 +1280 +5A80 +52A0 +5360 +7220 +8FC0 +ENDCHAR +STARTCHAR U_8D80 +ENCODING 36224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +13E0 +7E80 +1280 +FFE0 +10A0 +5DA0 +52E0 +7480 +9880 +87E0 +ENDCHAR +STARTCHAR U_8D81 +ENCODING 36225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1140 +7E20 +1080 +FD20 +1240 +5C80 +5120 +7040 +9880 +87E0 +ENDCHAR +STARTCHAR U_8D82 +ENCODING 36226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7A00 +17E0 +14A0 +FC80 +12C0 +5AA0 +54A0 +5280 +7100 +8FE0 +ENDCHAR +STARTCHAR U_8D83 +ENCODING 36227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7880 +1280 +13C0 +FC80 +57E0 +5080 +5D40 +5140 +7220 +8FE0 +ENDCHAR +STARTCHAR U_8D84 +ENCODING 36228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7E40 +13C0 +FE40 +13C0 +5E40 +5240 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D85 +ENCODING 36229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +1140 +7D40 +12C0 +FC00 +13C0 +5E40 +5240 +73C0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D86 +ENCODING 36230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +F780 +2480 +2480 +FFE0 +2480 +BCA0 +A560 +E6A0 +9040 +8FE0 +ENDCHAR +STARTCHAR U_8D87 +ENCODING 36231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F080 +27E0 +2000 +FA40 +2140 +B940 +A080 +E7E0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8D88 +ENCODING 36232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F100 +21E0 +2100 +FFC0 +2440 +BC40 +A440 +E7C0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8D89 +ENCODING 36233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +12A0 +7EA0 +13E0 +FC80 +12A0 +5EA0 +53E0 +7220 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8A +ENCODING 36234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +10A0 +7FE0 +1280 +FEA0 +12A0 +5E40 +52A0 +7120 +9A00 +87E0 +ENDCHAR +STARTCHAR U_8D8B +ENCODING 36235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11C0 +7E40 +1080 +FFE0 +1020 +5DE0 +5020 +73E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8C +ENCODING 36236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1080 +7FE0 +1080 +FDC0 +1000 +5FE0 +5220 +73E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8D +ENCODING 36237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +11C0 +7A40 +1580 +FD00 +12E0 +5D20 +5340 +7480 +9100 +8FE0 +ENDCHAR +STARTCHAR U_8D8E +ENCODING 36238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1280 +7FE0 +1080 +FFE0 +1080 +5DC0 +52A0 +74A0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D8F +ENCODING 36239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +13C0 +7C80 +13E0 +FC80 +13E0 +5E20 +5220 +73E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D90 +ENCODING 36240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2120 +FDA0 +2360 +F920 +2360 +BDA0 +A120 +E360 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D91 +ENCODING 36241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +1180 +7CE0 +11A0 +FE40 +1240 +5E40 +52A0 +7120 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D92 +ENCODING 36242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +1140 +7D60 +1340 +FD40 +1360 +5D40 +5240 +7060 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D93 +ENCODING 36243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7E40 +1260 +FC80 +13E0 +5D80 +52C0 +74A0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D94 +ENCODING 36244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F20 +22A0 +FBA0 +24A0 +FEA0 +29A0 +BAA0 +A420 +E8E0 +B000 +8FE0 +ENDCHAR +STARTCHAR U_8D95 +ENCODING 36245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1220 +7FE0 +1220 +FFE0 +1000 +5FE0 +5080 +77E0 +9880 +87E0 +ENDCHAR +STARTCHAR U_8D96 +ENCODING 36246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1540 +7D40 +17A0 +F920 +1100 +5FC0 +5100 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D97 +ENCODING 36247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FA20 +1220 +13E0 +FC80 +12E0 +5A80 +5380 +74E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D98 +ENCODING 36248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +2480 +FF00 +25C0 +BF00 +A5C0 +E720 +98E0 +8FE0 +ENDCHAR +STARTCHAR U_8D99 +ENCODING 36249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +11C0 +7C80 +13E0 +FE20 +13E0 +5E20 +53E0 +7220 +9A20 +87E0 +ENDCHAR +STARTCHAR U_8D9A +ENCODING 36250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7C0 +2100 +27C0 +FD40 +27C0 +BB80 +A540 +E540 +9120 +8FE0 +ENDCHAR +STARTCHAR U_8D9B +ENCODING 36251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +1140 +7E20 +11C0 +FC80 +13E0 +5CA0 +52C0 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8D9C +ENCODING 36252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +13E0 +7D60 +13A0 +F920 +17E0 +59A0 +5360 +7520 +9840 +87E0 +ENDCHAR +STARTCHAR U_8D9D +ENCODING 36253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F280 +2D60 +2380 +F880 +2140 +BAA0 +AA40 +E1C0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8D9E +ENCODING 36254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +F7C0 +2280 +2FE0 +F800 +27C0 +BC40 +A7C0 +E440 +97C0 +8FE0 +ENDCHAR +STARTCHAR U_8D9F +ENCODING 36255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +F100 +2FE0 +F820 +2BA0 +BAA0 +ABA0 +E860 +9800 +87E0 +ENDCHAR +STARTCHAR U_8DA0 +ENCODING 36256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +1080 +7FE0 +1220 +FFE0 +1220 +5FE0 +5080 +77E0 +9880 +87E0 +ENDCHAR +STARTCHAR U_8DA1 +ENCODING 36257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1300 +1280 +7FE0 +1280 +FFE0 +1280 +5FE0 +5280 +73E0 +9A00 +87E0 +ENDCHAR +STARTCHAR U_8DA2 +ENCODING 36258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +F840 +23C0 +2040 +FBE0 +2080 +BAA0 +A1C0 +E2A0 +94A0 +8FE0 +ENDCHAR +STARTCHAR U_8DA3 +ENCODING 36259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2500 +F7E0 +2520 +F720 +25A0 +B540 +AF40 +E1A0 +B100 +8FE0 +ENDCHAR +STARTCHAR U_8DA4 +ENCODING 36260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7E0 +2420 +23C0 +F900 +23E0 +B620 +AA20 +E3E0 +9220 +8FE0 +ENDCHAR +STARTCHAR U_8DA5 +ENCODING 36261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +13E0 +7D40 +17E0 +FD60 +1620 +5FE0 +5420 +77E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8DA6 +ENCODING 36262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +F5E0 +22A0 +2480 +F940 +2220 +BBE0 +A220 +E3E0 +9000 +8FE0 +ENDCHAR +STARTCHAR U_8DA7 +ENCODING 36263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +1240 +7FC0 +1240 +FFE0 +1080 +5EE0 +5280 +75E0 +9800 +87E0 +ENDCHAR +STARTCHAR U_8DA8 +ENCODING 36264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +12A0 +7FE0 +11A0 +FD40 +13E0 +5EA0 +53E0 +70A0 +9940 +87E0 +ENDCHAR +STARTCHAR U_8DA9 +ENCODING 36265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +2540 +FFC0 +2280 +BFE0 +A280 +EFE0 +9440 +8FE0 +ENDCHAR +STARTCHAR U_8DAA +ENCODING 36266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +FA40 +27E0 +FAA0 +23E0 +BAA0 +A3E0 +E140 +B220 +8FE0 +ENDCHAR +STARTCHAR U_8DAB +ENCODING 36267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2100 +FFE0 +2440 +FBA0 +2280 +BFE0 +AAA0 +EBA0 +A820 +9FE0 +ENDCHAR +STARTCHAR U_8DAC +ENCODING 36268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +F100 +27E0 +FA40 +27E0 +B240 +AFE0 +E280 +B460 +8FE0 +ENDCHAR +STARTCHAR U_8DAD +ENCODING 36269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +23E0 +FE80 +23E0 +FE80 +23E0 +BA80 +A7E0 +E540 +AAA0 +9FE0 +ENDCHAR +STARTCHAR U_8DAE +ENCODING 36270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +FBC0 +2EE0 +FAA0 +2EE0 +A100 +BFE0 +E540 +A920 +9FE0 +ENDCHAR +STARTCHAR U_8DAF +ENCODING 36271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +25A0 +FB60 +25A0 +FFE0 +2480 +BFE0 +A480 +E7E0 +B480 +8FE0 +ENDCHAR +STARTCHAR U_8DB0 +ENCODING 36272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F540 +2920 +FFE0 +2920 +ABA0 +BD60 +ABA0 +ED60 +B920 +8FE0 +ENDCHAR +STARTCHAR U_8DB1 +ENCODING 36273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +FAA0 +27E0 +A520 +B5A0 +E240 +B420 +8FE0 +ENDCHAR +STARTCHAR U_8DB2 +ENCODING 36274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A40 +2FE0 +F240 +2FE0 +F520 +27C0 +A640 +BD40 +E7C0 +A820 +9FE0 +ENDCHAR +STARTCHAR U_8DB3 +ENCODING 36275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +2080 +3F80 +0400 +2400 +27C0 +2400 +5400 +4C00 +83E0 +ENDCHAR +STARTCHAR U_8DB4 +ENCODING 36276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9280 +9280 +F280 +2280 +BA80 +A280 +A440 +B440 +C820 +1020 +ENDCHAR +STARTCHAR U_8DB5 +ENCODING 36277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7A00 +4BE0 +4C20 +7820 +1220 +5920 +5120 +5020 +5820 +E0C0 +ENDCHAR +STARTCHAR U_8DB6 +ENCODING 36278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4880 +7880 +17E0 +5080 +5880 +5080 +5880 +E280 +0100 +ENDCHAR +STARTCHAR U_8DB7 +ENCODING 36279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7BE0 +4C00 +4800 +7BC0 +1080 +5900 +5200 +5420 +5C20 +E3E0 +ENDCHAR +STARTCHAR U_8DB8 +ENCODING 36280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +0F80 +1080 +3FC0 +E040 +3FC0 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8DB9 +ENCODING 36281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +4FC0 +4940 +7940 +17E0 +5900 +5100 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_8DBA +ENCODING 36282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4FC0 +7900 +1100 +5FE0 +5100 +5280 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_8DBB +ENCODING 36283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7900 +4A80 +4C40 +7A20 +1100 +5FE0 +5040 +5880 +E080 +0100 +ENDCHAR +STARTCHAR U_8DBC +ENCODING 36284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A40 +4A40 +7A40 +1240 +5FE0 +5240 +5240 +5A40 +E440 +0840 +ENDCHAR +STARTCHAR U_8DBD +ENCODING 36285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7880 +4FE0 +4900 +7900 +11E0 +5920 +5120 +5220 +5A20 +E4C0 +ENDCHAR +STARTCHAR U_8DBE +ENCODING 36286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4880 +4A80 +7AE0 +1280 +5A80 +5280 +5280 +5A80 +E7E0 +ENDCHAR +STARTCHAR U_8DBF +ENCODING 36287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A40 +4A40 +7A80 +12E0 +5A20 +5220 +5340 +5C80 +E540 +0A20 +ENDCHAR +STARTCHAR U_8DC0 +ENCODING 36288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A20 +4A20 +7BE0 +1220 +5A20 +53E0 +5220 +5A20 +E420 +0860 +ENDCHAR +STARTCHAR U_8DC1 +ENCODING 36289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +7AA0 +4AA0 +4AA0 +7BE0 +1220 +5A00 +5200 +5220 +5A20 +E1E0 +ENDCHAR +STARTCHAR U_8DC2 +ENCODING 36290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4FE0 +4880 +7880 +17E0 +5A20 +5240 +5180 +5A40 +E420 +ENDCHAR +STARTCHAR U_8DC3 +ENCODING 36291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +4F00 +4900 +7900 +17E0 +5100 +5900 +5280 +5A80 +E440 +0820 +ENDCHAR +STARTCHAR U_8DC4 +ENCODING 36292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7A80 +4C40 +4820 +7BC0 +1240 +5A40 +52C0 +5220 +5E20 +E3E0 +ENDCHAR +STARTCHAR U_8DC5 +ENCODING 36293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +4A00 +7BE0 +1240 +5240 +5AC0 +5260 +5A40 +E440 +0840 +ENDCHAR +STARTCHAR U_8DC6 +ENCODING 36294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4940 +4A20 +7BE0 +1000 +5BE0 +5220 +5220 +5A20 +E3E0 +ENDCHAR +STARTCHAR U_8DC7 +ENCODING 36295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +7D40 +4D40 +4FE0 +7D40 +1540 +5DC0 +5540 +5400 +5C00 +E7E0 +ENDCHAR +STARTCHAR U_8DC8 +ENCODING 36296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7A80 +4C40 +48A0 +7900 +1240 +5880 +5320 +5040 +5980 +E600 +ENDCHAR +STARTCHAR U_8DC9 +ENCODING 36297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4A80 +7C40 +1120 +5880 +57E0 +5040 +5A80 +E100 +0080 +ENDCHAR +STARTCHAR U_8DCA +ENCODING 36298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FC0 +4900 +7900 +17E0 +5100 +5B80 +5540 +5920 +E100 +0100 +ENDCHAR +STARTCHAR U_8DCB +ENCODING 36299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +7A40 +4FE0 +4A00 +7BC0 +1240 +5B40 +5540 +5480 +5940 +E620 +ENDCHAR +STARTCHAR U_8DCC +ENCODING 36300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7A80 +4BE0 +4C80 +7880 +17E0 +5880 +5140 +5140 +5A20 +E420 +ENDCHAR +STARTCHAR U_8DCD +ENCODING 36301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +4FE0 +7880 +1080 +5BE0 +5220 +5220 +5A20 +E3E0 +0220 +ENDCHAR +STARTCHAR U_8DCE +ENCODING 36302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +4C20 +7800 +1200 +5240 +5B80 +5200 +5A20 +E220 +01E0 +ENDCHAR +STARTCHAR U_8DCF +ENCODING 36303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +94E0 +9FA0 +F4A0 +24A0 +A4A0 +B4A0 +A4A0 +B4A0 +CAE0 +1120 +ENDCHAR +STARTCHAR U_8DD0 +ENCODING 36304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9280 +9280 +F2A0 +2BC0 +AA80 +BA80 +AA80 +ABA0 +BEA0 +E460 +ENDCHAR +STARTCHAR U_8DD1 +ENCODING 36305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +F7C0 +9840 +9740 +F540 +2540 +B740 +A4A0 +A420 +B420 +C3E0 +ENDCHAR +STARTCHAR U_8DD2 +ENCODING 36306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +7820 +4BA0 +4AA0 +7AA0 +12A0 +5AA0 +53A0 +5020 +5820 +E0E0 +ENDCHAR +STARTCHAR U_8DD3 +ENCODING 36307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7880 +4FE0 +4880 +7880 +1080 +5BE0 +5080 +5080 +5880 +E7E0 +ENDCHAR +STARTCHAR U_8DD4 +ENCODING 36308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +4BE0 +4C20 +7BA0 +12A0 +52A0 +5AA0 +53A0 +5820 +E0A0 +0040 +ENDCHAR +STARTCHAR U_8DD5 +ENCODING 36309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +48E0 +7880 +1080 +5BE0 +5220 +5220 +5A20 +E3E0 +0220 +ENDCHAR +STARTCHAR U_8DD6 +ENCODING 36310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +4900 +7A00 +13E0 +5620 +5A20 +5220 +5A20 +E3E0 +0220 +ENDCHAR +STARTCHAR U_8DD7 +ENCODING 36311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +9440 +FDE0 +2440 +A640 +B540 +A440 +A440 +B440 +C4C0 +ENDCHAR +STARTCHAR U_8DD8 +ENCODING 36312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4CA0 +4AC0 +7880 +13E0 +5880 +5080 +57E0 +5880 +E080 +0080 +ENDCHAR +STARTCHAR U_8DD9 +ENCODING 36313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +1240 +5240 +5A40 +53C0 +5A40 +E240 +07E0 +ENDCHAR +STARTCHAR U_8DDA +ENCODING 36314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +9AA0 +9AA0 +FAA0 +2AA0 +AFE0 +BAA0 +AAA0 +BAA0 +CAA0 +1560 +ENDCHAR +STARTCHAR U_8DDB +ENCODING 36315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +94A0 +F480 +27E0 +A640 +B540 +A540 +B480 +C940 +1220 +ENDCHAR +STARTCHAR U_8DDC +ENCODING 36316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +9420 +97E0 +F400 +2520 +BD40 +A580 +A520 +B920 +C8E0 +ENDCHAR +STARTCHAR U_8DDD +ENCODING 36317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4A00 +4A00 +7BE0 +1220 +5220 +5A20 +53E0 +5200 +5E00 +E3E0 +ENDCHAR +STARTCHAR U_8DDE +ENCODING 36318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0E0 +9700 +9480 +9480 +F7E0 +2080 +B2C0 +A2A0 +B4A0 +C080 +0180 +ENDCHAR +STARTCHAR U_8DDF +ENCODING 36319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2500 +B520 +A4C0 +A480 +B540 +C620 +ENDCHAR +STARTCHAR U_8DE0 +ENCODING 36320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2140 +A7C0 +B500 +A7E0 +A120 +B280 +CC60 +ENDCHAR +STARTCHAR U_8DE1 +ENCODING 36321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F100 +9FE0 +9280 +F280 +26C0 +BAA0 +A2A0 +B280 +C480 +0980 +ENDCHAR +STARTCHAR U_8DE2 +ENCODING 36322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9440 +9A80 +F100 +2680 +B1E0 +A620 +A140 +B180 +CE00 +ENDCHAR +STARTCHAR U_8DE3 +ENCODING 36323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +7D00 +4FE0 +4900 +7900 +17E0 +5A80 +5280 +52A0 +5CA0 +E460 +ENDCHAR +STARTCHAR U_8DE4 +ENCODING 36324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7900 +4FE0 +4A40 +7C20 +1240 +5A40 +5180 +5180 +5A40 +E420 +ENDCHAR +STARTCHAR U_8DE5 +ENCODING 36325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +8A40 +8A60 +FA20 +2560 +2100 +BFE0 +A380 +A540 +B540 +C920 +ENDCHAR +STARTCHAR U_8DE6 +ENCODING 36326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F500 +9500 +97E0 +F900 +2100 +AFE0 +B100 +A380 +B540 +C920 +0100 +ENDCHAR +STARTCHAR U_8DE7 +ENCODING 36327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +9820 +F7C0 +2100 +B100 +A7C0 +A100 +B100 +CFE0 +ENDCHAR +STARTCHAR U_8DE8 +ENCODING 36328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9280 +F440 +2BA0 +B000 +AFE0 +A200 +B7C0 +C040 +0180 +ENDCHAR +STARTCHAR U_8DE9 +ENCODING 36329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7FE0 +4D20 +4FE0 +7D20 +17E0 +5920 +5140 +50A0 +5960 +E620 +ENDCHAR +STARTCHAR U_8DEA +ENCODING 36330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9240 +9FE0 +9400 +F5E0 +2520 +BD20 +A560 +A500 +BD20 +E0E0 +ENDCHAR +STARTCHAR U_8DEB +ENCODING 36331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +2280 +3BA0 +C4E0 +3F80 +2080 +3F80 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8DEC +ENCODING 36332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7880 +4BE0 +4880 +7880 +17E0 +5880 +53E0 +5080 +5880 +E7E0 +ENDCHAR +STARTCHAR U_8DED +ENCODING 36333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8C40 +8A80 +F900 +26E0 +2080 +BFE0 +A280 +A7E0 +B880 +C080 +ENDCHAR +STARTCHAR U_8DEE +ENCODING 36334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9100 +9100 +9240 +F7A0 +2120 +B900 +A7C0 +A100 +B900 +EFE0 +ENDCHAR +STARTCHAR U_8DEF +ENCODING 36335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +9440 +9A80 +F100 +2280 +B440 +AFE0 +A440 +B440 +C7C0 +ENDCHAR +STARTCHAR U_8DF0 +ENCODING 36336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F420 +9240 +97E0 +9240 +F240 +27E0 +BA40 +A240 +A240 +BC40 +E840 +ENDCHAR +STARTCHAR U_8DF1 +ENCODING 36337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +9100 +F7E0 +2040 +BFE0 +A240 +A140 +B840 +E1C0 +ENDCHAR +STARTCHAR U_8DF2 +ENCODING 36338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +9820 +F7C0 +2000 +BBC0 +A240 +A240 +BBC0 +E240 +ENDCHAR +STARTCHAR U_8DF3 +ENCODING 36339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9AA0 +96C0 +F280 +2280 +26C0 +BAA0 +A280 +BAA0 +C4A0 +0860 +ENDCHAR +STARTCHAR U_8DF4 +ENCODING 36340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +9280 +9FE0 +FAA0 +2AA0 +BAE0 +AC20 +A820 +BFE0 +E820 +ENDCHAR +STARTCHAR U_8DF5 +ENCODING 36341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9240 +9FE0 +F200 +2FE0 +A220 +B240 +A140 +B0A0 +C360 +0C20 +ENDCHAR +STARTCHAR U_8DF6 +ENCODING 36342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +9480 +93E0 +FC80 +2480 +2480 +B540 +A540 +B620 +CA00 +11E0 +ENDCHAR +STARTCHAR U_8DF7 +ENCODING 36343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +9240 +9180 +F2A0 +2460 +BFE0 +A280 +A2A0 +BCA0 +E860 +ENDCHAR +STARTCHAR U_8DF8 +ENCODING 36344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +94A0 +97C0 +9480 +F5A0 +26E0 +B880 +A7E0 +A080 +B880 +E080 +ENDCHAR +STARTCHAR U_8DF9 +ENCODING 36345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F020 +99C0 +9480 +9080 +FC80 +27E0 +BC80 +A480 +A480 +BA00 +E9E0 +ENDCHAR +STARTCHAR U_8DFA +ENCODING 36346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9280 +9280 +94E0 +F100 +27E0 +B900 +A380 +A540 +B920 +E100 +ENDCHAR +STARTCHAR U_8DFB +ENCODING 36347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9240 +9180 +F660 +2000 +BA40 +A240 +A240 +B440 +E840 +ENDCHAR +STARTCHAR U_8DFC +ENCODING 36348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +9400 +F7E0 +2420 +BDE0 +A560 +A5E0 +B820 +E0C0 +ENDCHAR +STARTCHAR U_8DFD +ENCODING 36349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +97C0 +9400 +F420 +27E0 +B940 +A2A0 +A620 +BA40 +E3C0 +ENDCHAR +STARTCHAR U_8DFE +ENCODING 36350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5A40 +D180 +5260 +7F80 +2080 +3F80 +2400 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8DFF +ENCODING 36351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +9100 +F7E0 +2100 +BDE0 +A500 +A500 +BB00 +E1E0 +ENDCHAR +STARTCHAR U_8E00 +ENCODING 36352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +9440 +F7C0 +2100 +A500 +B5E0 +A500 +B700 +E900 +90E0 +ENDCHAR +STARTCHAR U_8E01 +ENCODING 36353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8800 +8AA0 +FD40 +22A0 +22A0 +B800 +A3E0 +A080 +B880 +C7E0 +ENDCHAR +STARTCHAR U_8E02 +ENCODING 36354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9540 +9740 +F540 +2540 +A740 +BD40 +A5C0 +AF40 +B160 +E160 +ENDCHAR +STARTCHAR U_8E03 +ENCODING 36355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9340 +9100 +97E0 +F420 +27E0 +BC20 +A7E0 +A420 +BC20 +E4E0 +ENDCHAR +STARTCHAR U_8E04 +ENCODING 36356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +92E0 +9280 +9280 +F7E0 +2080 +BAA0 +A4A0 +A040 +B980 +E600 +ENDCHAR +STARTCHAR U_8E05 +ENCODING 36357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC00 +27E0 +F480 +2880 +3F80 +2080 +3F80 +23C0 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8E06 +ENCODING 36358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9240 +97C0 +9120 +F240 +2520 +BBC0 +A640 +A180 +BA40 +E420 +ENDCHAR +STARTCHAR U_8E07 +ENCODING 36359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +9800 +97C0 +F540 +2540 +BFE0 +A540 +A7E0 +B840 +E180 +ENDCHAR +STARTCHAR U_8E08 +ENCODING 36360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8FE0 +8900 +FFC0 +2540 +27C0 +BB80 +A540 +A540 +B920 +C120 +ENDCHAR +STARTCHAR U_8E09 +ENCODING 36361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9440 +97C0 +F440 +27C0 +BD20 +A4C0 +A480 +BD40 +E620 +ENDCHAR +STARTCHAR U_8E0A +ENCODING 36362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9280 +9100 +97E0 +F520 +27E0 +BD20 +A7E0 +A520 +BD20 +E560 +ENDCHAR +STARTCHAR U_8E0B +ENCODING 36363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +94E0 +9FA0 +F4A0 +24A0 +A4A0 +BFE0 +A4A0 +AA80 +BF80 +E080 +ENDCHAR +STARTCHAR U_8E0C +ENCODING 36364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2200 +AFE0 +B440 +A7E0 +AA40 +B940 +E080 +ENDCHAR +STARTCHAR U_8E0D +ENCODING 36365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +97A0 +9140 +97E0 +F100 +23E0 +BA40 +A7E0 +A080 +BA80 +E100 +ENDCHAR +STARTCHAR U_8E0E +ENCODING 36366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8880 +8900 +FB40 +2520 +2120 +B900 +A7E0 +A420 +BC20 +C7E0 +ENDCHAR +STARTCHAR U_8E0F +ENCODING 36367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +9F40 +9380 +9540 +F920 +27C0 +BC40 +A7C0 +A440 +BFC0 +E440 +ENDCHAR +STARTCHAR U_8E10 +ENCODING 36368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +97E0 +92A0 +91A0 +F660 +2280 +BFE0 +A240 +A2A0 +B9A0 +E660 +ENDCHAR +STARTCHAR U_8E11 +ENCODING 36369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +97E0 +9240 +93C0 +F240 +2240 +BBC0 +A240 +A7E0 +BA40 +E420 +ENDCHAR +STARTCHAR U_8E12 +ENCODING 36370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9080 +97E0 +92C0 +F4A0 +2100 +BFE0 +A240 +A240 +B980 +E660 +ENDCHAR +STARTCHAR U_8E13 +ENCODING 36371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9280 +93E0 +9680 +FBE0 +2280 +BA80 +A3E0 +A280 +BBE0 +E200 +ENDCHAR +STARTCHAR U_8E14 +ENCODING 36372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +9100 +97C0 +9440 +F7C0 +2440 +BFC0 +A100 +AFE0 +B900 +E100 +ENDCHAR +STARTCHAR U_8E15 +ENCODING 36373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +97C0 +9140 +F7E0 +2140 +BFC0 +A500 +A5E0 +BB00 +E9E0 +ENDCHAR +STARTCHAR U_8E16 +ENCODING 36374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +97E0 +9240 +F7E0 +2000 +BBE0 +A220 +A3E0 +BA20 +E3E0 +ENDCHAR +STARTCHAR U_8E17 +ENCODING 36375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9540 +98A0 +F7C0 +2080 +B900 +A2A0 +A620 +BA40 +E1C0 +ENDCHAR +STARTCHAR U_8E18 +ENCODING 36376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +9960 +95A0 +F320 +2FE0 +B920 +A3A0 +A560 +B920 +E0C0 +ENDCHAR +STARTCHAR U_8E19 +ENCODING 36377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +9BE0 +9AA0 +FEA0 +2AA0 +AEA0 +BAA0 +AAA0 +AF40 +B2A0 +E320 +ENDCHAR +STARTCHAR U_8E1A +ENCODING 36378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +9440 +9BA0 +F000 +2FE0 +BAA0 +AFE0 +AAA0 +BAA0 +E860 +ENDCHAR +STARTCHAR U_8E1B +ENCODING 36379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +9FE0 +F280 +2440 +B920 +A7C0 +A100 +B900 +EFE0 +ENDCHAR +STARTCHAR U_8E1C +ENCODING 36380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +2240 +A520 +BBC0 +A440 +BA80 +C180 +0E60 +ENDCHAR +STARTCHAR U_8E1D +ENCODING 36381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +97C0 +9540 +F7C0 +2100 +BFE0 +A100 +A380 +B540 +E920 +ENDCHAR +STARTCHAR U_8E1E +ENCODING 36382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +9480 +F480 +27E0 +BC80 +A7E0 +A620 +BBE0 +E220 +ENDCHAR +STARTCHAR U_8E1F +ENCODING 36383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +94E0 +97A0 +FAA0 +22A0 +AFA0 +B2A0 +A2A0 +B5E0 +E8A0 +1000 +ENDCHAR +STARTCHAR U_8E20 +ENCODING 36384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9820 +9400 +F7E0 +24A0 +BAA0 +A1E0 +A280 +BCA0 +E0E0 +ENDCHAR +STARTCHAR U_8E21 +ENCODING 36385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +9100 +FFE0 +2440 +BBA0 +A280 +A3A0 +BA20 +E1E0 +ENDCHAR +STARTCHAR U_8E22 +ENCODING 36386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2200 +BFE0 +A2A0 +A520 +BA20 +E4C0 +ENDCHAR +STARTCHAR U_8E23 +ENCODING 36387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9440 +9280 +F7E0 +2000 +BBE0 +A220 +A220 +BBE0 +E220 +ENDCHAR +STARTCHAR U_8E24 +ENCODING 36388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9240 +9240 +F5A0 +2900 +B900 +AFE0 +A100 +B900 +E100 +ENDCHAR +STARTCHAR U_8E25 +ENCODING 36389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9440 +9280 +F7E0 +2100 +BFE0 +A240 +A680 +B940 +E620 +ENDCHAR +STARTCHAR U_8E26 +ENCODING 36390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9280 +9440 +FFE0 +2040 +BF40 +A540 +A740 +B840 +E1C0 +ENDCHAR +STARTCHAR U_8E27 +ENCODING 36391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +92A0 +92A0 +FFA0 +22A0 +B7A0 +AAA0 +A240 +BAA0 +E720 +ENDCHAR +STARTCHAR U_8E28 +ENCODING 36392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9440 +9AA0 +F120 +2100 +2500 +BD00 +A5C0 +A500 +BB00 +C9E0 +ENDCHAR +STARTCHAR U_8E29 +ENCODING 36393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9F20 +9540 +F280 +2100 +BFE0 +A100 +A380 +B540 +E920 +8100 +ENDCHAR +STARTCHAR U_8E2A +ENCODING 36394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +9420 +9380 +F000 +27C0 +B900 +A540 +A520 +B920 +E300 +ENDCHAR +STARTCHAR U_8E2B +ENCODING 36395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +97E0 +9280 +F280 +2AA0 +BAA0 +A6C0 +A280 +BA80 +EFE0 +ENDCHAR +STARTCHAR U_8E2C +ENCODING 36396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +8F80 +8880 +FFE0 +2880 +ABE0 +BA20 +AAA0 +AAA0 +B940 +CA20 +ENDCHAR +STARTCHAR U_8E2D +ENCODING 36397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9480 +FFC0 +2140 +AFE0 +B140 +AFC0 +B100 +C100 +0300 +ENDCHAR +STARTCHAR U_8E2E +ENCODING 36398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F080 +97E0 +9480 +F4E0 +2480 +A480 +B7E0 +AA20 +AA20 +F3E0 +ENDCHAR +STARTCHAR U_8E2F +ENCODING 36399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F5E0 +92A0 +9FA0 +F2A0 +2FC0 +22A0 +BAA0 +A2A0 +A5E0 +B880 +C080 +ENDCHAR +STARTCHAR U_8E30 +ENCODING 36400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +9BA0 +F000 +2E20 +AAA0 +BEA0 +AAA0 +AEA0 +BA20 +CAE0 +ENDCHAR +STARTCHAR U_8E31 +ENCODING 36401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +F080 +97C0 +9540 +F7C0 +2540 +A5C0 +BC00 +A7C0 +A540 +B880 +CB40 +ENDCHAR +STARTCHAR U_8E32 +ENCODING 36402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9480 +97E0 +F480 +25E0 +A520 +BDE0 +A520 +A5E0 +BD20 +E9E0 +ENDCHAR +STARTCHAR U_8E33 +ENCODING 36403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2200 +AFE0 +B440 +AC60 +A7C0 +BC40 +C7C0 +ENDCHAR +STARTCHAR U_8E34 +ENCODING 36404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9140 +97E0 +94A0 +F7E0 +24A0 +BFE0 +A100 +A7E0 +BA20 +E4C0 +ENDCHAR +STARTCHAR U_8E35 +ENCODING 36405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9FE0 +9540 +F7C0 +2540 +BFC0 +A100 +A7C0 +B900 +EFE0 +ENDCHAR +STARTCHAR U_8E36 +ENCODING 36406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2000 +BFE0 +A500 +A5E0 +BB00 +E1E0 +ENDCHAR +STARTCHAR U_8E37 +ENCODING 36407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +97E0 +9140 +FFE0 +2100 +BBC0 +A640 +ABC0 +A240 +BA40 +C3C0 +ENDCHAR +STARTCHAR U_8E38 +ENCODING 36408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +97E0 +9240 +93C0 +F240 +23C0 +BA40 +A7E0 +A540 +BE20 +E7E0 +ENDCHAR +STARTCHAR U_8E39 +ENCODING 36409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9520 +97E0 +9000 +FFE0 +2100 +BFE0 +AAA0 +AAA0 +BAA0 +C820 +ENDCHAR +STARTCHAR U_8E3A +ENCODING 36410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +93E0 +92A0 +95E0 +FEA0 +23E0 +B280 +ABE0 +A480 +BA80 +C1E0 +ENDCHAR +STARTCHAR U_8E3B +ENCODING 36411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +9740 +F540 +2FE0 +A820 +BBA0 +AAA0 +ABA0 +B820 +E860 +ENDCHAR +STARTCHAR U_8E3C +ENCODING 36412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7E0 +2200 +BFE0 +AAA0 +A2A0 +B520 +CAC0 +ENDCHAR +STARTCHAR U_8E3D +ENCODING 36413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +97C0 +9540 +F7C0 +2100 +BFE0 +A520 +A560 +BFA0 +E460 +ENDCHAR +STARTCHAR U_8E3E +ENCODING 36414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9000 +93C0 +9240 +F3C0 +2000 +BFE0 +A520 +A7E0 +BD20 +E7E0 +ENDCHAR +STARTCHAR U_8E3F +ENCODING 36415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9C40 +9540 +FF60 +2540 +A440 +BE40 +A540 +A4A0 +B520 +C620 +ENDCHAR +STARTCHAR U_8E40 +ENCODING 36416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +9540 +F5C0 +2400 +A7E0 +B100 +AFE0 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_8E41 +ENCODING 36417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +9FE0 +9820 +FFE0 +2800 +AFE0 +BAA0 +AFE0 +AAA0 +BAA0 +C860 +ENDCHAR +STARTCHAR U_8E42 +ENCODING 36418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9280 +9FE0 +F2A0 +2D80 +A100 +BFE0 +A100 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_8E43 +ENCODING 36419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9280 +F100 +2FE0 +A200 +B7C0 +AA40 +A240 +BBC0 +E240 +ENDCHAR +STARTCHAR U_8E44 +ENCODING 36420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9280 +FFE0 +2920 +A7C0 +B540 +A540 +A540 +BDC0 +C100 +ENDCHAR +STARTCHAR U_8E45 +ENCODING 36421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9380 +F540 +2FE0 +A440 +B7C0 +A440 +A7C0 +B000 +CFE0 +ENDCHAR +STARTCHAR U_8E46 +ENCODING 36422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +9520 +95E0 +FD20 +25E0 +A540 +B560 +A540 +A5A0 +BA00 +E9E0 +ENDCHAR +STARTCHAR U_8E47 +ENCODING 36423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +3140 +DF20 +2480 +3500 +CFE0 +ENDCHAR +STARTCHAR U_8E48 +ENCODING 36424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9F20 +9520 +9040 +F6E0 +2420 +BC20 +A6E0 +A420 +BFE0 +E420 +ENDCHAR +STARTCHAR U_8E49 +ENCODING 36425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +9140 +97E0 +F080 +23E0 +A080 +BFE0 +A200 +A7C0 +B880 +C7E0 +ENDCHAR +STARTCHAR U_8E4A +ENCODING 36426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +9FA0 +9940 +F500 +22C0 +A520 +BFE0 +A100 +AFE0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E4B +ENCODING 36427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +9440 +F7C0 +2000 +BFE0 +AAA0 +A660 +BAA0 +E660 +ENDCHAR +STARTCHAR U_8E4C +ENCODING 36428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +9920 +F7C0 +2440 +A7C0 +BC40 +A7E0 +AA20 +BBE0 +C220 +ENDCHAR +STARTCHAR U_8E4D +ENCODING 36429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +97E0 +F540 +27E0 +A540 +BFE0 +A540 +A560 +BDC0 +C920 +ENDCHAR +STARTCHAR U_8E4E +ENCODING 36430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2440 +A740 +B5C0 +A440 +AFE0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E4F +ENCODING 36431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9500 +97E0 +F520 +27C0 +3500 +A5E0 +A400 +B5C0 +E940 +1260 +ENDCHAR +STARTCHAR U_8E50 +ENCODING 36432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9380 +9540 +FAA0 +2440 +AFE0 +B440 +A7C0 +A440 +B7C0 +C440 +ENDCHAR +STARTCHAR U_8E51 +ENCODING 36433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9240 +93C0 +F240 +27E0 +A040 +BFE0 +A5A0 +A240 +BDA0 +C520 +ENDCHAR +STARTCHAR U_8E52 +ENCODING 36434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9280 +9FE0 +F280 +2FE0 +BAA0 +ABA0 +ACE0 +B920 +C8E0 +ENDCHAR +STARTCHAR U_8E53 +ENCODING 36435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F6E0 +94A0 +96A0 +95A0 +F6A0 +2540 +B7E0 +A520 +A7E0 +B520 +C7E0 +ENDCHAR +STARTCHAR U_8E54 +ENCODING 36436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +55E0 +7D40 +5540 +FFC0 +1080 +1F80 +13E0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_8E55 +ENCODING 36437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9920 +9FE0 +9920 +FFE0 +2540 +BFE0 +A540 +BFE0 +C100 +0100 +ENDCHAR +STARTCHAR U_8E56 +ENCODING 36438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +97C0 +F200 +2FE0 +A440 +BEE0 +A440 +A6C0 +B440 +C7C0 +ENDCHAR +STARTCHAR U_8E57 +ENCODING 36439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9A80 +FFE0 +2AA0 +AFE0 +BAA0 +ABC0 +AA80 +BBA0 +CAE0 +ENDCHAR +STARTCHAR U_8E58 +ENCODING 36440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +A660 +EAA0 +2300 +3480 +AA60 +A540 +B280 +E100 +8E00 +ENDCHAR +STARTCHAR U_8E59 +ENCODING 36441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0140 +FFE0 +9100 +FF40 +94A0 +BFA0 +A0E0 +3F80 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8E5A +ENCODING 36442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +9820 +FFC0 +2440 +A7C0 +B900 +A7C0 +B100 +CFE0 +ENDCHAR +STARTCHAR U_8E5B +ENCODING 36443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9280 +FFE0 +2000 +2FE0 +B920 +A7C0 +B540 +C5C0 +0100 +ENDCHAR +STARTCHAR U_8E5C +ENCODING 36444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9820 +97E0 +F480 +25E0 +BD20 +A5E0 +A520 +BDE0 +E520 +ENDCHAR +STARTCHAR U_8E5D +ENCODING 36445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +9A80 +92E0 +F680 +2BE0 +A880 +BAE0 +AA80 +AA80 +BD80 +C8E0 +ENDCHAR +STARTCHAR U_8E5E +ENCODING 36446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9480 +95E0 +F720 +25E0 +BD20 +A5E0 +A720 +B5E0 +C140 +0220 +ENDCHAR +STARTCHAR U_8E5F +ENCODING 36447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +F7C0 +2100 +B7E0 +A440 +A7C0 +B440 +C7C0 +0820 +ENDCHAR +STARTCHAR U_8E60 +ENCODING 36448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +97E0 +9400 +F540 +27E0 +A540 +BDC0 +A400 +AD40 +BAA0 +CAA0 +ENDCHAR +STARTCHAR U_8E61 +ENCODING 36449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2E0 +92A0 +9360 +FEA0 +2240 +BEA0 +ABE0 +AAA0 +BA60 +CA20 +1260 +ENDCHAR +STARTCHAR U_8E62 +ENCODING 36450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9280 +FFE0 +2920 +AFE0 +B920 +ABA0 +AAA0 +BBA0 +C860 +ENDCHAR +STARTCHAR U_8E63 +ENCODING 36451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9FE0 +9240 +F3C0 +2100 +AFE0 +B920 +ADA0 +AB60 +BDA0 +C960 +ENDCHAR +STARTCHAR U_8E64 +ENCODING 36452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9940 +96A0 +FA80 +2880 +AA80 +BAE0 +AA80 +AA80 +BD80 +C8E0 +ENDCHAR +STARTCHAR U_8E65 +ENCODING 36453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9BE0 +9480 +F3E0 +2AA0 +ABE0 +BAA0 +AFE0 +B880 +CC80 +13E0 +ENDCHAR +STARTCHAR U_8E66 +ENCODING 36454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E920 +A920 +AFE0 +E000 +2EE0 +AAA0 +BEE0 +AAA0 +AEE0 +BAA0 +C760 +ENDCHAR +STARTCHAR U_8E67 +ENCODING 36455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +9AA0 +FFE0 +2AA0 +AFE0 +BC40 +A7C0 +A440 +BFC0 +C440 +ENDCHAR +STARTCHAR U_8E68 +ENCODING 36456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08A0 +FE80 +8BE0 +F680 +2A80 +A540 +B540 +AA20 +A000 +BAA0 +CAA0 +ENDCHAR +STARTCHAR U_8E69 +ENCODING 36457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FBE0 +AE40 +F980 +BFE0 +2080 +3F80 +0400 +2780 +3400 +CFE0 +ENDCHAR +STARTCHAR U_8E6A +ENCODING 36458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9540 +FFE0 +2440 +A7C0 +B440 +A7C0 +B440 +C7C0 +0820 +ENDCHAR +STARTCHAR U_8E6B +ENCODING 36459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9280 +9FE0 +F340 +2500 +AFE0 +BAA0 +AFE0 +AAA0 +BBA0 +C860 +ENDCHAR +STARTCHAR U_8E6C +ENCODING 36460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F740 +95A0 +9240 +F7A0 +2800 +A7C0 +BC40 +A7C0 +A440 +B280 +CFE0 +ENDCHAR +STARTCHAR U_8E6D +ENCODING 36461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +9AA0 +F920 +2FE0 +A000 +B7C0 +A440 +B7C0 +C440 +07C0 +ENDCHAR +STARTCHAR U_8E6E +ENCODING 36462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F280 +9FE0 +FAA0 +2FE0 +2100 +BFE0 +A440 +BFA0 +C440 +07C0 +ENDCHAR +STARTCHAR U_8E6F +ENCODING 36463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9F20 +9540 +FFE0 +2540 +A920 +BFE0 +A520 +A7E0 +B520 +C7E0 +ENDCHAR +STARTCHAR U_8E70 +ENCODING 36464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9800 +9F40 +F840 +2FE0 +AD40 +BFC0 +AD40 +AA40 +BA40 +C7C0 +ENDCHAR +STARTCHAR U_8E71 +ENCODING 36465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9440 +F280 +2FE0 +2540 +B7C0 +A540 +A7C0 +B100 +CFE0 +ENDCHAR +STARTCHAR U_8E72 +ENCODING 36466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +A280 +EFE0 +2AA0 +ABE0 +BFE0 +A080 +AFE0 +B480 +C380 +ENDCHAR +STARTCHAR U_8E73 +ENCODING 36467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +95A0 +9240 +FDE0 +2540 +AE60 +B9C0 +AF40 +A280 +B340 +CC20 +ENDCHAR +STARTCHAR U_8E74 +ENCODING 36468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9F60 +9040 +FFE0 +2940 +AF40 +BA40 +A740 +AAC0 +B340 +C660 +ENDCHAR +STARTCHAR U_8E75 +ENCODING 36469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FEA0 +45E0 +7C80 +5540 +B260 +1F80 +1080 +1FC0 +1200 +6FE0 +ENDCHAR +STARTCHAR U_8E76 +ENCODING 36470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +96C0 +9540 +F7E0 +2520 +A540 +BFC0 +A940 +A940 +BAA0 +C520 +ENDCHAR +STARTCHAR U_8E77 +ENCODING 36471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A80 +7EE0 +5540 +5C40 +4FA0 +4880 +4F80 +43C0 +8A00 +B7E0 +ENDCHAR +STARTCHAR U_8E78 +ENCODING 36472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +9FE0 +F540 +2920 +A440 +B7E0 +AD40 +A3E0 +B240 +CC40 +ENDCHAR +STARTCHAR U_8E79 +ENCODING 36473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +8C40 +FBA0 +2000 +B7C0 +A440 +A7E0 +BAA0 +E660 +0AA0 +ENDCHAR +STARTCHAR U_8E7A +ENCODING 36474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +9100 +FFE0 +2440 +AEE0 +B440 +AFE0 +A280 +B4A0 +C8E0 +ENDCHAR +STARTCHAR U_8E7B +ENCODING 36475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +9FE0 +F440 +2BA0 +A280 +BFE0 +AAA0 +ABA0 +B820 +C860 +ENDCHAR +STARTCHAR U_8E7C +ENCODING 36476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +96C0 +9FE0 +F280 +2FE0 +A100 +B7C0 +A100 +AFE0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E7D +ENCODING 36477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9540 +F280 +27C0 +AC60 +B7C0 +A440 +B7C0 +C540 +0B20 +ENDCHAR +STARTCHAR U_8E7E +ENCODING 36478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FF80 +AA80 +AEE0 +E140 +2F40 +B540 +AE80 +B480 +C540 +8E20 +ENDCHAR +STARTCHAR U_8E7F +ENCODING 36479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9AA0 +F540 +2FE0 +A540 +BFE0 +A920 +AFE0 +B920 +C100 +ENDCHAR +STARTCHAR U_8E80 +ENCODING 36480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +9FE0 +F540 +27C0 +2440 +B7C0 +A440 +A7C0 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E81 +ENCODING 36481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +97C0 +FEE0 +2AA0 +AEE0 +B100 +AFE0 +A380 +B540 +C920 +ENDCHAR +STARTCHAR U_8E82 +ENCODING 36482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +95E0 +9080 +F3E0 +2D40 +A7E0 +BC80 +A7E0 +A480 +BA80 +D1E0 +ENDCHAR +STARTCHAR U_8E83 +ENCODING 36483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F040 +97E0 +95A0 +F540 +27E0 +BC40 +A740 +A5E0 +BD40 +CF40 +1540 +ENDCHAR +STARTCHAR U_8E84 +ENCODING 36484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4540 +7FE0 +6880 +BFE0 +1040 +1FC0 +1200 +13E0 +2A00 +C7E0 +ENDCHAR +STARTCHAR U_8E85 +ENCODING 36485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9540 +9FC0 +F400 +2FE0 +AA20 +BFA0 +AAA0 +AFA0 +B2A0 +CF40 +ENDCHAR +STARTCHAR U_8E86 +ENCODING 36486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1E0 +9100 +9FE0 +F920 +2FE0 +AA00 +BD60 +AA80 +A9C0 +BEA0 +C920 +ENDCHAR +STARTCHAR U_8E87 +ENCODING 36487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +9540 +FFA0 +2140 +AFE0 +B180 +A240 +AFC0 +B240 +C3C0 +ENDCHAR +STARTCHAR U_8E88 +ENCODING 36488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +AE80 +AAE0 +EFA0 +2AA0 +BEA0 +A4A0 +BFA0 +AA40 +AAC0 +D520 +ENDCHAR +STARTCHAR U_8E89 +ENCODING 36489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2480 +FFE0 +A4A0 +BFA0 +A0A0 +3F80 +27C0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8E8A +ENCODING 36490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9100 +FFE0 +2120 +AFC0 +B040 +AFE0 +AB40 +BEC0 +C0C0 +ENDCHAR +STARTCHAR U_8E8B +ENCODING 36491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +92A0 +FD40 +25A0 +A520 +BFC0 +A440 +A7C0 +B440 +C840 +ENDCHAR +STARTCHAR U_8E8C +ENCODING 36492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +9AA0 +F7E0 +22A0 +A7E0 +B440 +AFE0 +A540 +BBE0 +C440 +ENDCHAR +STARTCHAR U_8E8D +ENCODING 36493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9AA0 +9660 +FAA0 +27E0 +AC80 +B7E0 +A480 +A7E0 +BC80 +C7E0 +ENDCHAR +STARTCHAR U_8E8E +ENCODING 36494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A540 +A920 +EFE0 +2920 +ADA0 +BB60 +ADA0 +AB60 +BDA0 +C960 +ENDCHAR +STARTCHAR U_8E8F +ENCODING 36495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9FE0 +9240 +F9E0 +24A0 +AAA0 +BFE0 +AAA0 +ABE0 +BAA0 +CBE0 +ENDCHAR +STARTCHAR U_8E90 +ENCODING 36496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2A0 +9540 +92A0 +FFE0 +2AA0 +AFE0 +BDA0 +AB60 +ADA0 +BB60 +CDA0 +ENDCHAR +STARTCHAR U_8E91 +ENCODING 36497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EAE0 +BFA0 +A4A0 +EFA0 +2AC0 +ADA0 +BAA0 +AFA0 +A2E0 +B680 +C980 +ENDCHAR +STARTCHAR U_8E92 +ENCODING 36498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9BC0 +96A0 +FBA0 +2AC0 +AFE0 +B100 +AFE0 +A380 +BD40 +C920 +ENDCHAR +STARTCHAR U_8E93 +ENCODING 36499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +A880 +AFE0 +EAA0 +2AA0 +A7C0 +BC40 +A7C0 +A440 +B7C0 +CC60 +ENDCHAR +STARTCHAR U_8E94 +ENCODING 36500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +9AA0 +FBE0 +2AA0 +AFE0 +B940 +AAA0 +AFE0 +B880 +DFE0 +ENDCHAR +STARTCHAR U_8E95 +ENCODING 36501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +AA20 +EF20 +2AE0 +AF20 +B9A0 +AF60 +BD20 +CA20 +1760 +ENDCHAR +STARTCHAR U_8E96 +ENCODING 36502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB60 +94A0 +9B60 +F4A0 +2FE0 +A4A0 +BB60 +A4A0 +AB60 +B4A0 +CFE0 +ENDCHAR +STARTCHAR U_8E97 +ENCODING 36503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +8A00 +7FE0 +D440 +5F40 +44C0 +3F80 +2080 +3F80 +3400 +CFE0 +ENDCHAR +STARTCHAR U_8E98 +ENCODING 36504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BF80 +AAE0 +FF20 +2AE0 +AE80 +BAE0 +AE80 +AAE0 +BAA0 +CEE0 +ENDCHAR +STARTCHAR U_8E99 +ENCODING 36505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +EAA0 +AEE0 +EAA0 +2EE0 +B920 +AFE0 +AAA0 +BBE0 +CAA0 +0BE0 +ENDCHAR +STARTCHAR U_8E9A +ENCODING 36506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A940 +A7E0 +E560 +3FE0 +A940 +BFE0 +AA40 +AA20 +A9E0 +D7E0 +ENDCHAR +STARTCHAR U_8E9B +ENCODING 36507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5E00 +AAE0 +7F40 +D540 +44C0 +3F80 +2080 +3F80 +2400 +DFE0 +ENDCHAR +STARTCHAR U_8E9C +ENCODING 36508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +9FE0 +9240 +FFE0 +2540 +AFE0 +B440 +A540 +A540 +B280 +CC60 +ENDCHAR +STARTCHAR U_8E9D +ENCODING 36509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +2FE0 +A920 +BFE0 +AAA0 +AFE0 +BBA0 +CD60 +ENDCHAR +STARTCHAR U_8E9E +ENCODING 36510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +97C0 +9C60 +F7C0 +2440 +ABA0 +B280 +AFE0 +A240 +B980 +C660 +ENDCHAR +STARTCHAR U_8E9F +ENCODING 36511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +BFE0 +AAA0 +EEE0 +2280 +AFE0 +B280 +AFE0 +A4A0 +BD40 +C620 +ENDCHAR +STARTCHAR U_8EA0 +ENCODING 36512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2900 +7BE0 +4940 +7FE0 +4880 +7F80 +2480 +3FC0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_8EA1 +ENCODING 36513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9240 +93C0 +F240 +27E0 +A040 +BFE0 +A540 +A7C0 +B540 +CFE0 +ENDCHAR +STARTCHAR U_8EA2 +ENCODING 36514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +FAA0 +9EE0 +FBA0 +2EE0 +BBA0 +A820 +AEE0 +BAA0 +EE60 +0AA0 +ENDCHAR +STARTCHAR U_8EA3 +ENCODING 36515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +2EE0 +A480 +BFE0 +A480 +A7E0 +BC80 +C7E0 +ENDCHAR +STARTCHAR U_8EA4 +ENCODING 36516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9FE0 +92A0 +FFE0 +24A0 +BFE0 +A400 +BFE0 +A4A0 +AEA0 +D5E0 +ENDCHAR +STARTCHAR U_8EA5 +ENCODING 36517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AAA0 +AEC0 +E840 +2EC0 +A840 +BFC0 +AD40 +ABC0 +BD40 +CFA0 +ENDCHAR +STARTCHAR U_8EA6 +ENCODING 36518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +9FE0 +9540 +FFE0 +2540 +AFE0 +B440 +A7C0 +A440 +B7C0 +CC60 +ENDCHAR +STARTCHAR U_8EA7 +ENCODING 36519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +06E0 +F000 +96E0 +F4A0 +2100 +BFE0 +AAA0 +AFE0 +BA80 +EAA0 +13E0 +ENDCHAR +STARTCHAR U_8EA8 +ENCODING 36520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A900 +ABE0 +EEA0 +2B80 +AEE0 +B240 +A7A0 +AA80 +B380 +CC60 +ENDCHAR +STARTCHAR U_8EA9 +ENCODING 36521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +AEE0 +EAA0 +2FE0 +A7C0 +BC80 +A7E0 +A440 +B380 +CC60 +ENDCHAR +STARTCHAR U_8EAA +ENCODING 36522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +AFE0 +AAA0 +EEE0 +2AA0 +AEE0 +BAA0 +AFE0 +AAA0 +BBE0 +CA60 +ENDCHAR +STARTCHAR U_8EAB +ENCODING 36523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +3F00 +2100 +3F00 +2140 +3F80 +2100 +FF00 +0900 +3500 +C200 +ENDCHAR +STARTCHAR U_8EAC +ENCODING 36524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7C20 +4420 +7DE0 +4500 +7D00 +45E0 +FC20 +1420 +2520 +DCC0 +ENDCHAR +STARTCHAR U_8EAD +ENCODING 36525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4FE0 +7D20 +4900 +7980 +4980 +FA80 +2A80 +4AA0 +9CE0 +ENDCHAR +STARTCHAR U_8EAE +ENCODING 36526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7A80 +4A40 +7A40 +4C20 +7BC0 +4940 +F940 +2A40 +4A40 +9480 +ENDCHAR +STARTCHAR U_8EAF +ENCODING 36527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +9440 +F640 +9540 +F480 +9480 +F540 +3620 +5400 +B7E0 +ENDCHAR +STARTCHAR U_8EB0 +ENCODING 36528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4FE0 +7900 +4B80 +7B80 +4D40 +FD40 +2BA0 +4900 +9900 +ENDCHAR +STARTCHAR U_8EB1 +ENCODING 36529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BC0 +4940 +7960 +4A20 +7880 +4BE0 +F880 +29C0 +4AA0 +9080 +ENDCHAR +STARTCHAR U_8EB2 +ENCODING 36530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4A40 +7C60 +4880 +7FE0 +4880 +F980 +2AC0 +4CA0 +9880 +ENDCHAR +STARTCHAR U_8EB3 +ENCODING 36531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BE0 +4A20 +7A20 +4BE0 +7800 +4BE0 +FA20 +2A20 +4A20 +9BE0 +ENDCHAR +STARTCHAR U_8EB4 +ENCODING 36532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7BC0 +4B20 +FAC0 +2A80 +4A40 +9B20 +ENDCHAR +STARTCHAR U_8EB5 +ENCODING 36533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4940 +7D40 +4B40 +7C80 +4800 +F940 +2AA0 +4E40 +99C0 +ENDCHAR +STARTCHAR U_8EB6 +ENCODING 36534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7540 +57C0 +7540 +57C0 +7100 +5FE0 +F380 +3540 +5920 +B100 +ENDCHAR +STARTCHAR U_8EB7 +ENCODING 36535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7900 +4FE0 +7B40 +4D20 +7900 +4FE0 +FA40 +2B80 +4940 +9A20 +ENDCHAR +STARTCHAR U_8EB8 +ENCODING 36536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4900 +7A80 +4C40 +7FE0 +4840 +FF40 +2D40 +4F40 +98C0 +ENDCHAR +STARTCHAR U_8EB9 +ENCODING 36537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7BE0 +4C20 +7D60 +4BA0 +7FE0 +4BA0 +FD60 +2920 +49A0 +9840 +ENDCHAR +STARTCHAR U_8EBA +ENCODING 36538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +7540 +5100 +77E0 +5420 +77A0 +56A0 +F7A0 +3420 +5420 +B460 +ENDCHAR +STARTCHAR U_8EBB +ENCODING 36539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +4C20 +7A80 +4C40 +7820 +4FC0 +F900 +2900 +4900 +9FE0 +ENDCHAR +STARTCHAR U_8EBC +ENCODING 36540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BC0 +4A00 +7BC0 +4A00 +7FE0 +4B00 +FAA0 +2A40 +4B20 +9A00 +ENDCHAR +STARTCHAR U_8EBD +ENCODING 36541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F520 +95E0 +F520 +95E0 +F480 +97E0 +F540 +3480 +5540 +B7E0 +ENDCHAR +STARTCHAR U_8EBE +ENCODING 36542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +7FE0 +4900 +7BC0 +4900 +7FE0 +4900 +FFE0 +2980 +4A40 +9C20 +ENDCHAR +STARTCHAR U_8EBF +ENCODING 36543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5540 +77E0 +5540 +77C0 +5540 +F740 +5580 +9F60 +3100 +ENDCHAR +STARTCHAR U_8EC0 +ENCODING 36544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F400 +95C0 +F540 +95C0 +F400 +97E0 +F6A0 +37E0 +5400 +B7E0 +ENDCHAR +STARTCHAR U_8EC1 +ENCODING 36545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7540 +5FE0 +7540 +57C0 +7540 +57C0 +F100 +5FE0 +9280 +2D60 +ENDCHAR +STARTCHAR U_8EC2 +ENCODING 36546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +EBE0 +B240 +E5A0 +AFE0 +E820 +A100 +E7C0 +2240 +6440 +A980 +ENDCHAR +STARTCHAR U_8EC3 +ENCODING 36547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +7AA0 +5EE0 +7000 +57C0 +7540 +57C0 +F540 +5FE0 +9100 +3100 +ENDCHAR +STARTCHAR U_8EC4 +ENCODING 36548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7EC0 +5AA0 +7FE0 +5080 +7EA0 +5AA0 +FEC0 +3AA0 +5F60 +B220 +ENDCHAR +STARTCHAR U_8EC5 +ENCODING 36549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +EFE0 +AD40 +ED40 +AFE0 +ED40 +ADE0 +ED40 +6DE0 +AD40 +75E0 +ENDCHAR +STARTCHAR U_8EC6 +ENCODING 36550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +5AA0 +7FE0 +5AA0 +7FE0 +5240 +F3C0 +3240 +5180 +B7E0 +ENDCHAR +STARTCHAR U_8EC7 +ENCODING 36551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77E0 +5100 +7FE0 +5120 +77E0 +5040 +FFE0 +3540 +5740 +B0C0 +ENDCHAR +STARTCHAR U_8EC8 +ENCODING 36552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +EFE0 +A940 +EDE0 +AF40 +EDE0 +AD40 +EDE0 +6940 +B660 +69C0 +ENDCHAR +STARTCHAR U_8EC9 +ENCODING 36553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +B520 +EFE0 +A540 +EFE0 +A440 +E7C0 +6440 +A7C0 +6C60 +ENDCHAR +STARTCHAR U_8ECA +ENCODING 36554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8ECB +ENCODING 36555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FF00 +1100 +7D00 +5500 +7D00 +5500 +7D00 +1120 +FF20 +10E0 +ENDCHAR +STARTCHAR U_8ECC +ENCODING 36556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +2780 +FA80 +AA80 +FA80 +AA80 +FA80 +22A0 +FCA0 +2860 +ENDCHAR +STARTCHAR U_8ECD +ENCODING 36557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8ECE +ENCODING 36558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +2080 +2080 +3F80 +ENDCHAR +STARTCHAR U_8ECF +ENCODING 36559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2280 +FA80 +AA80 +FA80 +AA80 +FA80 +22A0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_8ED0 +ENCODING 36560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FF80 +2280 +FA80 +AA80 +FF80 +AA80 +FA80 +22A0 +FA60 +2220 +ENDCHAR +STARTCHAR U_8ED1 +ENCODING 36561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2100 +FFE0 +A900 +F900 +A900 +FA80 +2280 +F440 +2820 +ENDCHAR +STARTCHAR U_8ED2 +ENCODING 36562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +2080 +F880 +A880 +FBE0 +A880 +F880 +2080 +F880 +2080 +ENDCHAR +STARTCHAR U_8ED3 +ENCODING 36563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA40 +AB40 +FAC0 +AA40 +FA40 +2240 +FC40 +2860 +ENDCHAR +STARTCHAR U_8ED4 +ENCODING 36564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +20A0 +F8A0 +AAA0 +FAA0 +ACA0 +F8A0 +2120 +FA20 +24C0 +ENDCHAR +STARTCHAR U_8ED5 +ENCODING 36565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +2080 +FAA0 +AAA0 +FAA0 +AAA0 +FAA0 +22A0 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8ED6 +ENCODING 36566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +F900 +A900 +FBC0 +A900 +F900 +2100 +FFE0 +2000 +ENDCHAR +STARTCHAR U_8ED7 +ENCODING 36567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +AC00 +FFC0 +AA40 +FA40 +2180 +FA40 +2420 +ENDCHAR +STARTCHAR U_8ED8 +ENCODING 36568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +AAA0 +FAA0 +ABE0 +F880 +20A0 +F8A0 +2060 +ENDCHAR +STARTCHAR U_8ED9 +ENCODING 36569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F8E0 +2080 +F880 +AFE0 +FA20 +AA20 +F940 +2080 +F940 +2220 +ENDCHAR +STARTCHAR U_8EDA +ENCODING 36570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +27E0 +F900 +A900 +F900 +AA80 +FA80 +2640 +F540 +2920 +ENDCHAR +STARTCHAR U_8EDB +ENCODING 36571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +2200 +FAE0 +AAA0 +FAA0 +AAE0 +FA80 +22A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8EDC +ENCODING 36572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +FAA0 +AAA0 +FAA0 +AB60 +FA20 +2220 +FA20 +2260 +ENDCHAR +STARTCHAR U_8EDD +ENCODING 36573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +2280 +FA80 +ABE0 +FA80 +AA80 +FA80 +22A0 +FB60 +2220 +ENDCHAR +STARTCHAR U_8EDE +ENCODING 36574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +2100 +F900 +AFE0 +F900 +A900 +FFE0 +2100 +F920 +20E0 +ENDCHAR +STARTCHAR U_8EDF +ENCODING 36575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FD20 +A940 +F900 +A900 +F980 +2280 +FA40 +2420 +ENDCHAR +STARTCHAR U_8EE0 +ENCODING 36576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2080 +F880 +A880 +FFE0 +A880 +F880 +2080 +F880 +23E0 +ENDCHAR +STARTCHAR U_8EE1 +ENCODING 36577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2280 +FC40 +A920 +F880 +AFE0 +F840 +2080 +F880 +2100 +ENDCHAR +STARTCHAR U_8EE2 +ENCODING 36578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +2000 +F800 +AFE0 +F900 +AA00 +FA40 +2420 +FFE0 +2020 +ENDCHAR +STARTCHAR U_8EE3 +ENCODING 36579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +FFE0 +2480 +1100 +60C0 +ENDCHAR +STARTCHAR U_8EE4 +ENCODING 36580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +2080 +FAA0 +A9C0 +F880 +AFE0 +F880 +2080 +F880 +2180 +ENDCHAR +STARTCHAR U_8EE5 +ENCODING 36581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +23E0 +FC20 +ABA0 +FAA0 +AAA0 +FBA0 +22A0 +F820 +20C0 +ENDCHAR +STARTCHAR U_8EE6 +ENCODING 36582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +2440 +FC40 +AC40 +FFC0 +AA80 +FA80 +22A0 +FCA0 +28E0 +ENDCHAR +STARTCHAR U_8EE7 +ENCODING 36583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +FBC0 +2280 +FA80 +ABE0 +FA80 +AA80 +FA80 +22A0 +FB60 +22A0 +ENDCHAR +STARTCHAR U_8EE8 +ENCODING 36584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F980 +2240 +FC20 +A900 +F880 +AFE0 +F840 +2180 +F880 +2040 +ENDCHAR +STARTCHAR U_8EE9 +ENCODING 36585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2240 +FA20 +AFE0 +F800 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EEA +ENCODING 36586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA80 +2480 +FFE0 +AAA0 +FAA0 +ADA0 +FFA0 +2120 +FAA0 +2440 +ENDCHAR +STARTCHAR U_8EEB +ENCODING 36587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +2220 +FC80 +A900 +FA40 +AC80 +F920 +2240 +F880 +2300 +ENDCHAR +STARTCHAR U_8EEC +ENCODING 36588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FC0 +0400 +FFE0 +2480 +7FC0 +A4A0 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8EED +ENCODING 36589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2400 +FFC0 +AC80 +FDC0 +AC80 +FC80 +27E0 +FC00 +27E0 +ENDCHAR +STARTCHAR U_8EEE +ENCODING 36590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +FAA0 +AAA0 +FAA0 +AFE0 +F880 +2140 +FA20 +2420 +ENDCHAR +STARTCHAR U_8EEF +ENCODING 36591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +24A0 +FAA0 +AAC0 +F880 +AFE0 +F880 +2080 +F880 +2080 +ENDCHAR +STARTCHAR U_8EF0 +ENCODING 36592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A40 +7B80 +0A20 +79E0 +0400 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8EF1 +ENCODING 36593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FFC0 +2540 +FD40 +AD40 +FD40 +AD40 +FD40 +2520 +FDE0 +2940 +ENDCHAR +STARTCHAR U_8EF2 +ENCODING 36594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +F880 +A880 +FBE0 +AA20 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EF3 +ENCODING 36595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2420 +FBA0 +AAA0 +FBA0 +AAA0 +FA40 +2220 +FA20 +21E0 +ENDCHAR +STARTCHAR U_8EF4 +ENCODING 36596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +F880 +A880 +F880 +ABE0 +F880 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_8EF5 +ENCODING 36597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F940 +2240 +FFE0 +AA40 +FB40 +AAC0 +FA40 +2240 +FA40 +22C0 +ENDCHAR +STARTCHAR U_8EF6 +ENCODING 36598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2220 +FBE0 +AA00 +FBE0 +AA40 +FA80 +22A0 +FD20 +25E0 +ENDCHAR +STARTCHAR U_8EF7 +ENCODING 36599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F920 +27E0 +F900 +A900 +F9E0 +A920 +FAA0 +2240 +FCA0 +2320 +ENDCHAR +STARTCHAR U_8EF8 +ENCODING 36600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +23E0 +FAA0 +AAA0 +FAA0 +ABE0 +FAA0 +22A0 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EF9 +ENCODING 36601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +2220 +FA20 +AA20 +FBE0 +A800 +F940 +2140 +FA20 +2420 +ENDCHAR +STARTCHAR U_8EFA +ENCODING 36602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +2120 +F920 +AAE0 +FC40 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8EFB +ENCODING 36603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC20 +2020 +FBA0 +AAA0 +FAA0 +ABA0 +F820 +2020 +FC20 +2060 +ENDCHAR +STARTCHAR U_8EFC +ENCODING 36604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FA80 +2280 +FBE0 +AC80 +F880 +AFE0 +F880 +2080 +F940 +2620 +ENDCHAR +STARTCHAR U_8EFD +ENCODING 36605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFC0 +2240 +F980 +AA80 +FD60 +A900 +FFC0 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_8EFE +ENCODING 36606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +27E0 +F880 +AF80 +FA80 +AA80 +FAA0 +23A0 +FE60 +2020 +ENDCHAR +STARTCHAR U_8EFF +ENCODING 36607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +F940 +27E0 +F940 +A940 +F940 +AFE0 +F940 +2140 +FA40 +2440 +ENDCHAR +STARTCHAR U_8F00 +ENCODING 36608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +FA00 +AFE0 +FAA0 +AAA0 +FAA0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_8F01 +ENCODING 36609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FA40 +27E0 +FA40 +AA40 +FA40 +AFE0 +F800 +2240 +FC20 +2420 +ENDCHAR +STARTCHAR U_8F02 +ENCODING 36610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +2480 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F03 +ENCODING 36611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +27E0 +FA40 +AC20 +FA40 +AA40 +F980 +2180 +FA40 +2420 +ENDCHAR +STARTCHAR U_8F04 +ENCODING 36612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F920 +2540 +FB80 +A900 +FFE0 +AA80 +FA80 +22A0 +FCA0 +2860 +ENDCHAR +STARTCHAR U_8F05 +ENCODING 36613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +2140 +FA80 +A940 +FA20 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8F06 +ENCODING 36614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +F920 +AB40 +F880 +A920 +FA40 +2080 +FD40 +2220 +ENDCHAR +STARTCHAR U_8F07 +ENCODING 36615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +F820 +AFC0 +F900 +A900 +FFC0 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_8F08 +ENCODING 36616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2220 +FB20 +AAA0 +FFE0 +AA20 +FB20 +22A0 +FC20 +20E0 +ENDCHAR +STARTCHAR U_8F09 +ENCODING 36617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +7D40 +1100 +FFE0 +1100 +FF20 +5540 +7C80 +54A0 +FF60 +1220 +ENDCHAR +STARTCHAR U_8F0A +ENCODING 36618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +FA40 +AFA0 +F820 +A880 +FBE0 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_8F0B +ENCODING 36619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0800 +FFE0 +4440 +BFA0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F0C +ENCODING 36620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +FFE0 +A920 +FD60 +AD60 +FFE0 +2820 +F8A0 +2840 +ENDCHAR +STARTCHAR U_8F0D +ENCODING 36621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FA20 +2080 +F940 +AA20 +F800 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8F0E +ENCODING 36622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +FAC0 +2080 +FBE0 +AA20 +FBE0 +AA20 +FBE0 +2220 +FA20 +2260 +ENDCHAR +STARTCHAR U_8F0F +ENCODING 36623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2180 +FFE0 +ADA0 +FDA0 +AEE0 +FC20 +27E0 +FC20 +27E0 +ENDCHAR +STARTCHAR U_8F10 +ENCODING 36624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2420 +FBC0 +A800 +FFE0 +AA80 +FA80 +22A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8F11 +ENCODING 36625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F940 +27E0 +F940 +AFC0 +F940 +AA00 +FFE0 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_8F12 +ENCODING 36626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FD40 +2540 +FF40 +AD40 +FF40 +AD40 +FD40 +27C0 +F940 +2160 +ENDCHAR +STARTCHAR U_8F13 +ENCODING 36627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9C0 +2240 +FFE0 +AAA0 +FAA0 +ABE0 +F880 +21A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8F14 +ENCODING 36628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +23E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +23E0 +FAA0 +22E0 +ENDCHAR +STARTCHAR U_8F15 +ENCODING 36629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F800 +22A0 +FD40 +AD40 +FAA0 +A800 +FBC0 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_8F16 +ENCODING 36630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FD20 +27A0 +FD20 +AFE0 +FC20 +AFA0 +FEA0 +27A0 +FC20 +2460 +ENDCHAR +STARTCHAR U_8F17 +ENCODING 36631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FEE0 +2420 +FEE0 +AC20 +FC20 +AFE0 +FA80 +22A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_8F18 +ENCODING 36632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FFE0 +A940 +FA20 +ADC0 +FB40 +2480 +F940 +2620 +ENDCHAR +STARTCHAR U_8F19 +ENCODING 36633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FF80 +2500 +FDE0 +A720 +FDA0 +A740 +FD40 +27A0 +F920 +2100 +ENDCHAR +STARTCHAR U_8F1A +ENCODING 36634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA40 +27E0 +F940 +A9A0 +FE60 +AA80 +FFE0 +2280 +F9A0 +2660 +ENDCHAR +STARTCHAR U_8F1B +ENCODING 36635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +2100 +FFE0 +A920 +FDA0 +AB60 +FDA0 +2920 +F920 +2960 +ENDCHAR +STARTCHAR U_8F1C +ENCODING 36636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +2540 +FAA0 +AAA0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_8F1D +ENCODING 36637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +ACA0 +73C0 +2080 +FBE0 +52A0 +53E0 +52A0 +57E0 +5880 +9080 +ENDCHAR +STARTCHAR U_8F1E +ENCODING 36638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +26A0 +FFE0 +AD20 +FFE0 +AD20 +FD20 +25E0 +FC20 +2460 +ENDCHAR +STARTCHAR U_8F1F +ENCODING 36639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +23C0 +FAA0 +AD00 +FFE0 +A920 +FDA0 +2240 +FAA0 +25A0 +ENDCHAR +STARTCHAR U_8F20 +ENCODING 36640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +23E0 +FAA0 +ABE0 +F880 +AFE0 +F880 +21C0 +FAA0 +2480 +ENDCHAR +STARTCHAR U_8F21 +ENCODING 36641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +2120 +FA40 +A900 +FAE0 +AA20 +FB60 +2220 +FA20 +23E0 +ENDCHAR +STARTCHAR U_8F22 +ENCODING 36642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2100 +FA80 +AFE0 +F840 +AF40 +FD40 +2740 +F840 +20C0 +ENDCHAR +STARTCHAR U_8F23 +ENCODING 36643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +FAA0 +2AA0 +FEE0 +AAA0 +FAA0 +AEE0 +FAA0 +2AA0 +FAA0 +2B60 +ENDCHAR +STARTCHAR U_8F24 +ENCODING 36644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +2080 +FBE0 +A880 +FFE0 +AA20 +FBE0 +2220 +FBE0 +2260 +ENDCHAR +STARTCHAR U_8F25 +ENCODING 36645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +23E0 +FA20 +ABE0 +FA80 +AAA0 +FBC0 +22A0 +FBA0 +22E0 +ENDCHAR +STARTCHAR U_8F26 +ENCODING 36646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +5540 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F27 +ENCODING 36647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +FA40 +27E0 +FA40 +AA40 +FFE0 +AA40 +FA40 +2240 +FA40 +2440 +ENDCHAR +STARTCHAR U_8F28 +ENCODING 36648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2420 +FBC0 +AA40 +FBC0 +AA00 +FBC0 +2240 +FA40 +23C0 +ENDCHAR +STARTCHAR U_8F29 +ENCODING 36649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +F1E0 +1100 +F1E0 +1500 +FFE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F2A +ENCODING 36650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +FBA0 +A800 +FFE0 +AAA0 +FFE0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_8F2B +ENCODING 36651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA80 +2EE0 +FA80 +AEE0 +FA80 +AA80 +FEE0 +2280 +FA80 +2280 +ENDCHAR +STARTCHAR U_8F2C +ENCODING 36652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2000 +FBE0 +AA20 +FA20 +ABE0 +F880 +22C0 +FAA0 +25A0 +ENDCHAR +STARTCHAR U_8F2D +ENCODING 36653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F900 +27E0 +FAA0 +AAA0 +FAA0 +A900 +FFE0 +2280 +FC60 +2840 +ENDCHAR +STARTCHAR U_8F2E +ENCODING 36654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +FD40 +AFC0 +F800 +AFE0 +FAA0 +2FE0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F2F +ENCODING 36655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +F800 +AFE0 +FA40 +ABC0 +FA40 +22E0 +FF40 +2040 +ENDCHAR +STARTCHAR U_8F30 +ENCODING 36656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +AFE0 +FA00 +AFE0 +FAA0 +2520 +FAA0 +2440 +ENDCHAR +STARTCHAR U_8F31 +ENCODING 36657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +27E0 +FC80 +AFA0 +FCA0 +AFA0 +FD40 +2760 +F4A0 +2920 +ENDCHAR +STARTCHAR U_8F32 +ENCODING 36658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +FD40 +27C0 +F800 +AFE0 +F900 +AFE0 +FAA0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_8F33 +ENCODING 36659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +27C0 +F900 +AFE0 +FA40 +AFA0 +F900 +27C0 +FA80 +2460 +ENDCHAR +STARTCHAR U_8F34 +ENCODING 36660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC80 +27E0 +FC80 +ADE0 +FD20 +ADE0 +FD20 +25E0 +FD20 +21E0 +ENDCHAR +STARTCHAR U_8F35 +ENCODING 36661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +27C0 +FC40 +AFC0 +FA00 +ABE0 +FCA0 +2560 +FFA0 +20C0 +ENDCHAR +STARTCHAR U_8F36 +ENCODING 36662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FA80 +27E0 +FA80 +AFE0 +FAA0 +ACE0 +F820 +2FE0 +F820 +2FE0 +ENDCHAR +STARTCHAR U_8F37 +ENCODING 36663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2520 +FFE0 +A820 +FBA0 +A820 +FBA0 +22A0 +FBA0 +2040 +ENDCHAR +STARTCHAR U_8F38 +ENCODING 36664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2460 +FB80 +AE20 +FAA0 +AEA0 +FAA0 +2EA0 +FA20 +2A60 +ENDCHAR +STARTCHAR U_8F39 +ENCODING 36665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2640 +FBC0 +AA40 +FBC0 +A900 +FBE0 +2640 +F980 +2660 +ENDCHAR +STARTCHAR U_8F3A +ENCODING 36666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +2540 +FFE0 +AD40 +FAA0 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_8F3B +ENCODING 36667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F800 +21C0 +F940 +A9C0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_8F3C +ENCODING 36668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +23C0 +FA40 +ABC0 +F800 +AFE0 +FAA0 +2AA0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F3D +ENCODING 36669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFC0 +2100 +FFE0 +AA80 +FC40 +AFE0 +FD40 +27C0 +FD40 +27C0 +ENDCHAR +STARTCHAR U_8F3E +ENCODING 36670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +27E0 +FD40 +AFE0 +FD40 +AFE0 +FD00 +25A0 +FD40 +25A0 +ENDCHAR +STARTCHAR U_8F3F +ENCODING 36671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +64C0 +5F40 +64C0 +5F40 +75C0 +5540 +7FC0 +4440 +FFE0 +2080 +C060 +ENDCHAR +STARTCHAR U_8F40 +ENCODING 36672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +22A0 +FB60 +ABE0 +F800 +AFE0 +FAA0 +2AA0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F41 +ENCODING 36673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +FF20 +2520 +FAC0 +A900 +FE60 +AC20 +FEE0 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_8F42 +ENCODING 36674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +FF40 +1140 +FF60 +9200 +FDE0 +5620 +7D40 +5480 +FD40 +1220 +ENDCHAR +STARTCHAR U_8F43 +ENCODING 36675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +FFE0 +AA40 +FFA0 +A900 +FFE0 +2380 +FD40 +2920 +ENDCHAR +STARTCHAR U_8F44 +ENCODING 36676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2520 +FFC0 +A900 +FFC0 +A900 +FFE0 +2440 +FC40 +27C0 +ENDCHAR +STARTCHAR U_8F45 +ENCODING 36677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2100 +FFE0 +A800 +FBC0 +AA40 +FBC0 +26A0 +FA40 +2720 +ENDCHAR +STARTCHAR U_8F46 +ENCODING 36678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2A80 +FFE0 +AAA0 +FFE0 +A800 +FAA0 +2BC0 +FAA0 +37E0 +ENDCHAR +STARTCHAR U_8F47 +ENCODING 36679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F920 +25A0 +FB60 +ADA0 +FA80 +AD40 +FAA0 +2140 +F880 +2700 +ENDCHAR +STARTCHAR U_8F48 +ENCODING 36680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FD40 +22A0 +FBE0 +AAA0 +FBE0 +AAA0 +FFE0 +2180 +FAC0 +24A0 +ENDCHAR +STARTCHAR U_8F49 +ENCODING 36681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2540 +FFC0 +AD40 +FFC0 +A960 +FFE0 +2440 +FA40 +20C0 +ENDCHAR +STARTCHAR U_8F4A +ENCODING 36682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +2240 +FFE0 +AA40 +FA40 +AFE0 +F820 +27E0 +F820 +27E0 +ENDCHAR +STARTCHAR U_8F4B +ENCODING 36683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +22A0 +FBE0 +AEA0 +FFE0 +AC80 +FFE0 +2480 +FC00 +23E0 +ENDCHAR +STARTCHAR U_8F4C +ENCODING 36684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +27E0 +FD20 +AB40 +FD20 +AFE0 +F820 +27E0 +F820 +27E0 +ENDCHAR +STARTCHAR U_8F4D +ENCODING 36685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FF80 +2AE0 +FFA0 +A9A0 +FEA0 +AAA0 +FEA0 +2A40 +FEA0 +2B20 +ENDCHAR +STARTCHAR U_8F4E +ENCODING 36686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F900 +27E0 +FA40 +AFE0 +FA40 +AFE0 +FAA0 +2BA0 +F820 +2860 +ENDCHAR +STARTCHAR U_8F4F +ENCODING 36687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F820 +2FE0 +F900 +AFC0 +F900 +AFE0 +FA40 +2FE0 +FA40 +26C0 +ENDCHAR +STARTCHAR U_8F50 +ENCODING 36688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26A0 +FAC0 +2FE0 +FA80 +AFE0 +F900 +AFC0 +F900 +27E0 +FA80 +2C60 +ENDCHAR +STARTCHAR U_8F51 +ENCODING 36689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7E0 +25A0 +FBC0 +AE60 +FBC0 +AA40 +FBC0 +2580 +F940 +2320 +ENDCHAR +STARTCHAR U_8F52 +ENCODING 36690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +22A0 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +2240 +FBC0 +2660 +ENDCHAR +STARTCHAR U_8F53 +ENCODING 36691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F920 +2540 +FFE0 +A940 +FFE0 +AD40 +FFC0 +2540 +FFC0 +2440 +ENDCHAR +STARTCHAR U_8F54 +ENCODING 36692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FB40 +27E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +25E0 +FA40 +2440 +ENDCHAR +STARTCHAR U_8F55 +ENCODING 36693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA80 +23C0 +FA40 +ABC0 +FA40 +AFE0 +FCA0 +2560 +FFA0 +2040 +ENDCHAR +STARTCHAR U_8F56 +ENCODING 36694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2540 +FFC0 +A920 +FFE0 +ADA0 +FDA0 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_8F57 +ENCODING 36695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +FFE0 +2880 +FFA0 +A8A0 +FEC0 +AA60 +FE80 +22A0 +F660 +2BC0 +ENDCHAR +STARTCHAR U_8F58 +ENCODING 36696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FAA0 +2FE0 +F800 +AFE0 +FA40 +ABC0 +FA80 +26A0 +FB40 +2220 +ENDCHAR +STARTCHAR U_8F59 +ENCODING 36697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FFC0 +2100 +FFE0 +AAC0 +FAA0 +AFE0 +FAA0 +2740 +FAE0 +2720 +ENDCHAR +STARTCHAR U_8F5A +ENCODING 36698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +AA60 +FFC0 +A940 +FC80 +7FE0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F5B +ENCODING 36699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +F720 +2720 +F9E0 +AA20 +FF20 +AAA0 +FF60 +2220 +FB20 +26E0 +ENDCHAR +STARTCHAR U_8F5C +ENCODING 36700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F900 +27E0 +FD60 +AB80 +FD40 +AFE0 +FA00 +27E0 +FD20 +2560 +ENDCHAR +STARTCHAR U_8F5D +ENCODING 36701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6DC0 +4E40 +4A40 +FFE0 +2480 +7FC0 +A4A0 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F5E +ENCODING 36702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +FA40 +2F60 +F940 +AF40 +FAA0 +AFA0 +F000 +2FE0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F5F +ENCODING 36703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2480 +3F80 +2480 +FFE0 +5540 +7FC0 +5540 +FFE0 +1080 +ENDCHAR +STARTCHAR U_8F60 +ENCODING 36704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +27C0 +FD40 +AFC0 +F800 +AFE0 +FAA0 +2FE0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_8F61 +ENCODING 36705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +B5A0 +5F40 +F5E0 +5F40 +A4A0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8F62 +ENCODING 36706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FBA0 +26C0 +FBA0 +AAC0 +FFE0 +A900 +FFE0 +2380 +F540 +2920 +ENDCHAR +STARTCHAR U_8F63 +ENCODING 36707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FEC0 +2A40 +FFE0 +AA40 +FEE0 +AA40 +F880 +2AE0 +FA80 +2FE0 +ENDCHAR +STARTCHAR U_8F64 +ENCODING 36708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +F100 +2FE0 +F920 +AFE0 +FD40 +AFC0 +FD40 +2FE0 +FAA0 +27E0 +ENDCHAR +STARTCHAR U_8F65 +ENCODING 36709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FFE0 +2AA0 +FEE0 +AAA0 +FEE0 +AAA0 +FFE0 +2AA0 +FBE0 +2A60 +ENDCHAR +STARTCHAR U_8F66 +ENCODING 36710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +0800 +7FC0 +1000 +2400 +3F80 +0400 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_8F67 +ENCODING 36711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FD00 +2100 +5100 +7D00 +1100 +1D00 +F120 +1120 +10E0 +ENDCHAR +STARTCHAR U_8F68 +ENCODING 36712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +F280 +4FC0 +A280 +F280 +2280 +34A0 +E4A0 +28A0 +3060 +ENDCHAR +STARTCHAR U_8F69 +ENCODING 36713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +F100 +4100 +AFE0 +F100 +2100 +3100 +E100 +2100 +2100 +ENDCHAR +STARTCHAR U_8F6A +ENCODING 36714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +4100 +67C0 +A100 +F900 +2280 +3A80 +E240 +2460 +2840 +ENDCHAR +STARTCHAR U_8F6B +ENCODING 36715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +40A0 +62A0 +A2A0 +FD20 +2120 +3920 +E220 +22A0 +2440 +ENDCHAR +STARTCHAR U_8F6C +ENCODING 36716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F7C0 +4100 +6FE0 +A200 +F7C0 +2040 +3A80 +E100 +2080 +2080 +ENDCHAR +STARTCHAR U_8F6D +ENCODING 36717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC00 +4400 +65E0 +A520 +FD20 +2560 +3D00 +E500 +2520 +28E0 +ENDCHAR +STARTCHAR U_8F6E +ENCODING 36718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F980 +4240 +6420 +A000 +FA40 +2280 +3B00 +E220 +2220 +21E0 +ENDCHAR +STARTCHAR U_8F6F +ENCODING 36719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +FBE0 +4220 +A540 +F900 +2100 +3A80 +E280 +2440 +2820 +ENDCHAR +STARTCHAR U_8F70 +ENCODING 36720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FC0 +2400 +3F80 +0400 +FFE0 +0400 +FBC0 +4A40 +3180 +CE60 +ENDCHAR +STARTCHAR U_8F71 +ENCODING 36721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +47E0 +6080 +A080 +FBE0 +2220 +3A20 +E220 +23E0 +2220 +ENDCHAR +STARTCHAR U_8F72 +ENCODING 36722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F840 +4040 +6740 +A540 +FD40 +2740 +3840 +E040 +2140 +2080 +ENDCHAR +STARTCHAR U_8F73 +ENCODING 36723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +4100 +67E0 +A420 +FC20 +27E0 +3C00 +E400 +2400 +2800 +ENDCHAR +STARTCHAR U_8F74 +ENCODING 36724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +47E0 +64A0 +A4A0 +FCA0 +27E0 +3CA0 +E4A0 +27E0 +2420 +ENDCHAR +STARTCHAR U_8F75 +ENCODING 36725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +4220 +6220 +A220 +FBE0 +2220 +3940 +E240 +2420 +2820 +ENDCHAR +STARTCHAR U_8F76 +ENCODING 36726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA80 +43E0 +6480 +A080 +FFE0 +2080 +3880 +E140 +2220 +2420 +ENDCHAR +STARTCHAR U_8F77 +ENCODING 36727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FB80 +44A0 +62A0 +A2C0 +F880 +27E0 +2080 +F880 +2080 +2180 +ENDCHAR +STARTCHAR U_8F78 +ENCODING 36728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F980 +4240 +64A0 +A100 +FA40 +2080 +3920 +E040 +2180 +2600 +ENDCHAR +STARTCHAR U_8F79 +ENCODING 36729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +FB80 +4200 +6280 +A280 +FFE0 +2080 +3AC0 +E2A0 +24A0 +2180 +ENDCHAR +STARTCHAR U_8F7A +ENCODING 36730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +4120 +6120 +A2A0 +FC40 +23E0 +3A20 +E220 +23E0 +2220 +ENDCHAR +STARTCHAR U_8F7B +ENCODING 36731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +F840 +4080 +6140 +A620 +F800 +23E0 +3880 +E080 +2080 +27E0 +ENDCHAR +STARTCHAR U_8F7C +ENCODING 36732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +47E0 +6080 +A780 +FA80 +2280 +3AA0 +E3A0 +2C60 +2020 +ENDCHAR +STARTCHAR U_8F7D +ENCODING 36733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +2100 +FD20 +5140 +7C80 +10A0 +FD60 +1220 +ENDCHAR +STARTCHAR U_8F7E +ENCODING 36734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +4100 +6240 +A7E0 +F920 +2100 +3FC0 +E100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8F7F +ENCODING 36735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +FF00 +4100 +67E0 +A240 +FC20 +2240 +3A40 +E240 +2440 +2840 +ENDCHAR +STARTCHAR U_8F80 +ENCODING 36736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +4640 +A540 +FFE0 +2440 +3640 +6540 +A440 +28C0 +ENDCHAR +STARTCHAR U_8F81 +ENCODING 36737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +4440 +6020 +A7C0 +F900 +2100 +3FC0 +E100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_8F82 +ENCODING 36738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBC0 +4640 +6240 +A180 +FA40 +27E0 +3A40 +E240 +23C0 +2240 +ENDCHAR +STARTCHAR U_8F83 +ENCODING 36739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F880 +47E0 +6240 +A420 +FA40 +2240 +3980 +E080 +2140 +2620 +ENDCHAR +STARTCHAR U_8F84 +ENCODING 36740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +4A00 +FA80 +4E80 +AA80 +FE80 +2A80 +3B80 +EEA0 +22A0 +22E0 +ENDCHAR +STARTCHAR U_8F85 +ENCODING 36741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +FFE0 +4100 +67E0 +A520 +FFE0 +2520 +3FE0 +E520 +2520 +2560 +ENDCHAR +STARTCHAR U_8F86 +ENCODING 36742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA80 +4280 +6FE0 +AAA0 +FAA0 +2BE0 +3CA0 +E920 +2820 +2860 +ENDCHAR +STARTCHAR U_8F87 +ENCODING 36743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2080 +FBE0 +4B40 +BFE0 +1400 +3FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_8F88 +ENCODING 36744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +FBE0 +0A00 +7FC0 +1400 +3FC0 +0400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_8F89 +ENCODING 36745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +AC20 +7100 +27E0 +FA00 +5480 +57C0 +5080 +5FE0 +5080 +8080 +ENDCHAR +STARTCHAR U_8F8A +ENCODING 36746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FC20 +47E0 +6420 +A7E0 +F880 +24A0 +3FC0 +E480 +25A0 +2660 +ENDCHAR +STARTCHAR U_8F8B +ENCODING 36747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +F820 +4AA0 +6920 +AFE0 +F920 +2FE0 +3A20 +EBA0 +2820 +2860 +ENDCHAR +STARTCHAR U_8F8C +ENCODING 36748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +FFE0 +4000 +A7C0 +F440 +27C0 +3100 +6540 +A920 +2300 +ENDCHAR +STARTCHAR U_8F8D +ENCODING 36749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FDA0 +4240 +65A0 +A500 +FFE0 +2120 +3DA0 +E240 +25A0 +2920 +ENDCHAR +STARTCHAR U_8F8E +ENCODING 36750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +FAA0 +4540 +62A0 +A2A0 +FFE0 +2520 +3FE0 +E520 +27E0 +2420 +ENDCHAR +STARTCHAR U_8F8F +ENCODING 36751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +47C0 +6100 +A7E0 +FC40 +23A0 +3900 +E7E0 +2280 +2C60 +ENDCHAR +STARTCHAR U_8F90 +ENCODING 36752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4000 +F3C0 +4240 +A3C0 +F800 +27E0 +3CA0 +E7E0 +24A0 +27E0 +ENDCHAR +STARTCHAR U_8F91 +ENCODING 36753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +43C0 +6000 +A7E0 +FA40 +2340 +3AC0 +E260 +2FC0 +2040 +ENDCHAR +STARTCHAR U_8F92 +ENCODING 36754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +FFC0 +4440 +A7C0 +F000 +27C0 +3540 +6540 +A540 +2FE0 +ENDCHAR +STARTCHAR U_8F93 +ENCODING 36755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +F440 +4BA0 +A000 +FE20 +2AA0 +3EA0 +EAA0 +2EA0 +2A60 +ENDCHAR +STARTCHAR U_8F94 +ENCODING 36756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +9E80 +F5E0 +3E40 +E5E0 +3F20 +C4C0 +3F80 +2080 +3F80 +2080 +ENDCHAR +STARTCHAR U_8F95 +ENCODING 36757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4100 +67E0 +A000 +FFC0 +2440 +3FC0 +E6A0 +2A40 +2320 +ENDCHAR +STARTCHAR U_8F96 +ENCODING 36758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +4920 +67C0 +A100 +F7C0 +2900 +3FE0 +E440 +27C0 +2440 +ENDCHAR +STARTCHAR U_8F97 +ENCODING 36759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +FFE0 +4940 +AFE0 +F940 +2FE0 +3AA0 +EA40 +2B20 +3220 +ENDCHAR +STARTCHAR U_8F98 +ENCODING 36760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +FA80 +4FE0 +AAA0 +FFE0 +2AA0 +3BC0 +EA80 +2BA0 +32E0 +ENDCHAR +STARTCHAR U_8F99 +ENCODING 36761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4F80 +FAE0 +4FA0 +A0A0 +FEA0 +2AA0 +3EA0 +EA40 +2EA0 +2B20 +ENDCHAR +STARTCHAR U_8F9A +ENCODING 36762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FB40 +47E0 +6340 +A520 +FC40 +27E0 +3D40 +E3E0 +2240 +2440 +ENDCHAR +STARTCHAR U_8F9B +ENCODING 36763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +2080 +1900 +0A00 +FFE0 +0400 +7FC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_8F9C +ENCODING 36764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0400 +7FC0 +0A00 +FFE0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8F9D +ENCODING 36765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +4FE0 +9440 +FA80 +0FE0 +F100 +97C0 +9100 +F100 +0100 +ENDCHAR +STARTCHAR U_8F9E +ENCODING 36766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +E7E0 +2220 +F940 +27E0 +2080 +F880 +8BE0 +8880 +F880 +8880 +ENDCHAR +STARTCHAR U_8F9F +ENCODING 36767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C80 +27E0 +2620 +3D40 +2080 +3FE0 +5480 +57E0 +5480 +9C80 +0080 +ENDCHAR +STARTCHAR U_8FA0 +ENCODING 36768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +7FC0 +1100 +FFE0 +0400 +7FC0 +0400 +ENDCHAR +STARTCHAR U_8FA1 +ENCODING 36769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +1080 +7BE0 +2940 +1080 +FBE0 +1080 +7BE0 +1080 +2080 +4080 +ENDCHAR +STARTCHAR U_8FA2 +ENCODING 36770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2080 +FFE0 +2140 +F880 +AFE0 +F880 +23E0 +7080 +A880 +2080 +ENDCHAR +STARTCHAR U_8FA3 +ENCODING 36771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +57E0 +2520 +FFE0 +2100 +FB80 +2540 +4920 +8100 +ENDCHAR +STARTCHAR U_8FA4 +ENCODING 36772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +C080 +AFE0 +5140 +F880 +8FE0 +7080 +13E0 +6080 +5080 +8880 +ENDCHAR +STARTCHAR U_8FA5 +ENCODING 36773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +FFE0 +5140 +F880 +4FE0 +7880 +43E0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8FA6 +ENCODING 36774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +F5E0 +54A0 +2F40 +F5E0 +2540 +2540 +F5E0 +2540 +4940 +9240 +ENDCHAR +STARTCHAR U_8FA7 +ENCODING 36775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8080 +4040 +FFE0 +AAA0 +4A40 +FBE0 +4A40 +EAE0 +4A40 +5240 +A640 +ENDCHAR +STARTCHAR U_8FA8 +ENCODING 36776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FBE0 +52A0 +2A40 +FBE0 +2A40 +3A40 +E3E0 +2440 +4840 +9040 +ENDCHAR +STARTCHAR U_8FA9 +ENCODING 36777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +FBE0 +52A0 +2C40 +F5E0 +2440 +3C40 +E5E0 +2640 +4440 +8040 +ENDCHAR +STARTCHAR U_8FAA +ENCODING 36778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5C80 +53E0 +5140 +FC80 +4BE0 +7880 +43E0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_8FAB +ENCODING 36779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FCE0 +55A0 +2640 +FBE0 +2440 +3E40 +E1E0 +2640 +4840 +8040 +ENDCHAR +STARTCHAR U_8FAC +ENCODING 36780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +4440 +F5E0 +A0A0 +4F40 +F1E0 +4A40 +E5E0 +4A40 +5040 +8040 +ENDCHAR +STARTCHAR U_8FAD +ENCODING 36781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F7E0 +5540 +7C80 +2BE0 +FE80 +AA80 +BBE0 +AA80 +9280 +AE80 +ENDCHAR +STARTCHAR U_8FAE +ENCODING 36782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +F9E0 +5EA0 +2440 +FBE0 +2E40 +3440 +E5E0 +2E40 +5540 +8C40 +ENDCHAR +STARTCHAR U_8FAF +ENCODING 36783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +50A0 +2740 +F8E0 +2740 +2040 +FFE0 +2540 +4740 +8540 +ENDCHAR +STARTCHAR U_8FB0 +ENCODING 36784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2000 +3FE0 +2A00 +2A40 +2980 +4880 +4A40 +8C20 +ENDCHAR +STARTCHAR U_8FB1 +ENCODING 36785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4000 +5F80 +4000 +7FE0 +5240 +9980 +9140 +FFE0 +1100 +0B00 +ENDCHAR +STARTCHAR U_8FB2 +ENCODING 36786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +3FC0 +2940 +3FC0 +2940 +3FE0 +2000 +3FE0 +2A80 +4900 +8EE0 +ENDCHAR +STARTCHAR U_8FB3 +ENCODING 36787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +5540 +9120 +7FE0 +4000 +5F80 +4000 +7FE0 +5280 +99C0 +ENDCHAR +STARTCHAR U_8FB4 +ENCODING 36788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AA00 +FAC0 +AA00 +FBE0 +AA80 +FAA0 +22C0 +FA40 +26A0 +2B20 +ENDCHAR +STARTCHAR U_8FB5 +ENCODING 36789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +7C00 +03C0 +3C00 +03C0 +7C00 +0400 +27C0 +2400 +5C00 +83E0 +ENDCHAR +STARTCHAR U_8FB6 +ENCODING 36790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +2000 +0000 +E000 +2000 +2000 +2000 +2000 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FB7 +ENCODING 36791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +4000 +4000 +0000 +EFC0 +2000 +2000 +2000 +5000 +4FE0 +8000 +ENDCHAR +STARTCHAR U_8FB8 +ENCODING 36792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +5FC0 +4480 +0500 +E5E0 +2420 +2820 +2940 +3080 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FB9 +ENCODING 36793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0120 +E120 +2120 +2220 +2420 +28C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBA +ENCODING 36794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +4FC0 +4240 +0240 +E240 +2440 +2440 +2940 +3080 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBB +ENCODING 36795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +4100 +0FE0 +E100 +2100 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBC +ENCODING 36796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8400 +4200 +4100 +0100 +E280 +2280 +2460 +2840 +5000 +4FE0 +8000 +ENDCHAR +STARTCHAR U_8FBD +ENCODING 36797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2040 +2080 +0100 +E100 +2100 +2100 +2500 +2200 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBE +ENCODING 36798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2100 +0FE0 +E100 +2100 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FBF +ENCODING 36799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2520 +0520 +E520 +2520 +2520 +27E0 +2420 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC0 +ENCODING 36800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +2100 +0100 +EFE0 +2100 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC1 +ENCODING 36801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +2100 +0100 +EFE0 +2100 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC2 +ENCODING 36802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +2100 +0100 +EFE0 +2100 +2100 +2100 +2500 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FC3 +ENCODING 36803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8000 +4FC0 +4000 +1FE0 +E400 +2FC0 +2040 +2040 +2140 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FC4 +ENCODING 36804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2800 +07C0 +E080 +2100 +2220 +2420 +23E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC5 +ENCODING 36805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +2280 +2280 +0280 +EF80 +2280 +22A0 +2260 +2220 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC6 +ENCODING 36806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +2560 +07A0 +ED20 +25A0 +2540 +2420 +23E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC7 +ENCODING 36807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +2FE0 +0080 +E480 +2280 +2080 +2080 +2180 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC8 +ENCODING 36808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2200 +2200 +03C0 +E240 +2240 +2440 +2540 +2880 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FC9 +ENCODING 36809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +2420 +07E0 +E420 +2400 +2400 +2400 +2800 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCA +ENCODING 36810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +2100 +0FE0 +E920 +2920 +2920 +2960 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCB +ENCODING 36811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +2100 +0100 +E7C0 +2100 +2100 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCC +ENCODING 36812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +2440 +07C0 +E440 +2440 +27C0 +2440 +2940 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FCD +ENCODING 36813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2100 +0940 +E940 +2FC0 +2120 +2120 +20E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCE +ENCODING 36814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2DE0 +2920 +0920 +E920 +2920 +2B20 +2D60 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FCF +ENCODING 36815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2200 +1FE0 +E200 +2500 +2480 +2A40 +3120 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD0 +ENCODING 36816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +2000 +0FE0 +E200 +2280 +2440 +2FA0 +2420 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD1 +ENCODING 36817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2700 +2400 +07E0 +E480 +2480 +2480 +2480 +2880 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD2 +ENCODING 36818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2000 +0780 +E480 +2480 +24A0 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD3 +ENCODING 36819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2080 +2480 +0480 +EFE0 +2280 +2480 +2880 +2280 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FD4 +ENCODING 36820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2780 +2400 +07E0 +E620 +2540 +2480 +2940 +2620 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD5 +ENCODING 36821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +2900 +0100 +E100 +2FE0 +2100 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD6 +ENCODING 36822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2140 +2100 +0FE0 +E100 +2100 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD7 +ENCODING 36823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +2100 +0100 +EFE0 +2100 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD8 +ENCODING 36824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2080 +2100 +0100 +E340 +2520 +2920 +2100 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FD9 +ENCODING 36825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +0FE0 +E080 +2480 +2280 +2100 +2280 +2C40 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FDA +ENCODING 36826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4100 +4FE0 +0920 +E920 +2FE0 +2100 +2100 +5100 +4FE0 +8000 +ENDCHAR +STARTCHAR U_8FDB +ENCODING 36827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +2FC0 +0480 +E480 +3FE0 +2480 +2480 +2880 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FDC +ENCODING 36828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2000 +2000 +0FE0 +E280 +2280 +22A0 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FDD +ENCODING 36829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2100 +07C0 +E100 +2FE0 +2120 +21A0 +2140 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FDE +ENCODING 36830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +2200 +0500 +EFC0 +2100 +2FE0 +2100 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FDF +ENCODING 36831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +2440 +07C0 +E400 +2500 +2480 +2840 +2840 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE0 +ENCODING 36832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +21E0 +0100 +E100 +27E0 +2420 +27E0 +2420 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE1 +ENCODING 36833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +27E0 +0400 +E520 +2540 +25A0 +2520 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE2 +ENCODING 36834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2220 +2220 +04A0 +E840 +37E0 +2420 +2420 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE3 +ENCODING 36835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2540 +2540 +0FE0 +E540 +2540 +25C0 +2400 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE4 +ENCODING 36836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2900 +15C0 +EF40 +2540 +25C0 +2420 +23E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE5 +ENCODING 36837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2820 +0BA0 +EAA0 +2AA0 +2BA0 +2820 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE6 +ENCODING 36838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +2800 +3EE0 +0AA0 +EAA0 +2AA0 +2AA0 +32A0 +26E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE7 +ENCODING 36839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2200 +2FC0 +0A40 +EFC0 +2A40 +2FC0 +2200 +2200 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FE8 +ENCODING 36840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +2440 +0FE0 +E020 +27C0 +2440 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FE9 +ENCODING 36841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2820 +0940 +E100 +2540 +2520 +2920 +2500 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FEA +ENCODING 36842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0920 +E920 +2FE0 +2920 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FEB +ENCODING 36843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2200 +27C0 +0440 +E440 +27C0 +2440 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FEC +ENCODING 36844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4100 +4FE0 +0100 +E100 +27C0 +2100 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FED +ENCODING 36845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +27C0 +0900 +E100 +2FE0 +2280 +2440 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FEE +ENCODING 36846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2400 +27E0 +0A00 +E3C0 +2200 +2200 +23E0 +2200 +5200 +8FE0 +ENDCHAR +STARTCHAR U_8FEF +ENCODING 36847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +2480 +2880 +0EC0 +EAA0 +36A0 +2480 +2480 +2880 +5080 +8FE0 +ENDCHAR +STARTCHAR U_8FF0 +ENCODING 36848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2120 +2FE0 +0100 +E380 +2540 +2540 +2920 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF1 +ENCODING 36849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FC0 +5040 +2880 +C9C0 +4E00 +4840 +4840 +47C0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_8FF2 +ENCODING 36850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8200 +4FC0 +0200 +DFE0 +4200 +4480 +4440 +4FE0 +A040 +9FE0 +ENDCHAR +STARTCHAR U_8FF3 +ENCODING 36851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2080 +2180 +0240 +EC20 +27C0 +2100 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF4 +ENCODING 36852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2BA0 +0AA0 +EAA0 +2BA0 +2820 +2FE0 +2820 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF5 +ENCODING 36853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2BA0 +0820 +EBA0 +2AA0 +2BA0 +2820 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF6 +ENCODING 36854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FE0 +2200 +07C0 +E440 +2FC0 +3440 +27C0 +2440 +5440 +8FE0 +ENDCHAR +STARTCHAR U_8FF7 +ENCODING 36855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2920 +2540 +0100 +EFE0 +2100 +2380 +2540 +2920 +5100 +8FE0 +ENDCHAR +STARTCHAR U_8FF8 +ENCODING 36856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0280 +E280 +2FE0 +2280 +2480 +2880 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FF9 +ENCODING 36857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0280 +EAC0 +2AA0 +32A0 +2480 +2980 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFA +ENCODING 36858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +2280 +0FE0 +EAA0 +2AE0 +2C20 +2820 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFB +ENCODING 36859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +2880 +0500 +E200 +2FE0 +2440 +2A80 +2100 +5600 +8FE0 +ENDCHAR +STARTCHAR U_8FFC +ENCODING 36860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +2FE0 +0100 +E7C0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFD +ENCODING 36861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +2440 +07C0 +E400 +27E0 +2420 +2420 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFE +ENCODING 36862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +24A0 +24A0 +07A0 +E9A0 +36A0 +2220 +24A0 +2840 +5000 +8FE0 +ENDCHAR +STARTCHAR U_8FFF +ENCODING 36863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +2820 +17A0 +E4A0 +27A0 +24A0 +27A0 +20A0 +5040 +8FE0 +ENDCHAR +STARTCHAR U_9000 +ENCODING 36864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FC0 +4840 +4FC0 +0840 +CFC0 +4800 +4B40 +4880 +4E40 +B000 +8FE0 +ENDCHAR +STARTCHAR U_9001 +ENCODING 36865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +27C0 +0100 +E100 +2FE0 +2100 +2280 +2440 +5820 +8FE0 +ENDCHAR +STARTCHAR U_9002 +ENCODING 36866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +2100 +0FE0 +E100 +27C0 +2440 +27C0 +2440 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9003 +ENCODING 36867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +22A0 +2AC0 +0680 +E2C0 +26A0 +2A80 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9004 +ENCODING 36868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +27C0 +2C40 +0380 +EC60 +2100 +27C0 +2900 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9005 +ENCODING 36869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +2F00 +2800 +0FE0 +E800 +2BC0 +2A40 +2A40 +2BC0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9006 +ENCODING 36870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0100 +E920 +2920 +2FE0 +2100 +2200 +5400 +8FE0 +ENDCHAR +STARTCHAR U_9007 +ENCODING 36871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +8880 +5EE0 +0BA0 +CEA0 +4AA0 +4A80 +4E20 +53E0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_9008 +ENCODING 36872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8400 +5FC0 +1040 +D740 +5540 +5740 +5040 +5140 +A080 +9FE0 +ENDCHAR +STARTCHAR U_9009 +ENCODING 36873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2500 +27C0 +0900 +EFE0 +2280 +22A0 +24A0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_900A +ENCODING 36874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2280 +2480 +05C0 +E6A0 +3CA0 +2480 +2480 +3D80 +5000 +8FE0 +ENDCHAR +STARTCHAR U_900B +ENCODING 36875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +2FE0 +2100 +0FE0 +E920 +2FE0 +2920 +2FE0 +2920 +5060 +8FE0 +ENDCHAR +STARTCHAR U_900C +ENCODING 36876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +2FE0 +0820 +EFA0 +28A0 +2FA0 +2820 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_900D +ENCODING 36877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +27C0 +0440 +E7C0 +2440 +27C0 +2440 +25C0 +5800 +87E0 +ENDCHAR +STARTCHAR U_900E +ENCODING 36878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +8500 +5FC0 +1540 +DDC0 +5040 +5FC0 +5040 +5FC0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_900F +ENCODING 36879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2100 +3FE0 +0540 +EFA0 +3280 +22C0 +2440 +2940 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9010 +ENCODING 36880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +2200 +0D20 +E2C0 +2D80 +22C0 +2CA0 +2300 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9011 +ENCODING 36881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +2140 +3FE0 +0920 +E540 +2380 +2540 +3920 +2300 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9012 +ENCODING 36882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0120 +E7E0 +2900 +2FE0 +2320 +2560 +5900 +8FE0 +ENDCHAR +STARTCHAR U_9013 +ENCODING 36883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +8900 +4FC0 +0900 +CFE0 +4900 +57C0 +5540 +5540 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9014 +ENCODING 36884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +2440 +0BA0 +E100 +2FE0 +2540 +2920 +3520 +5200 +8FE0 +ENDCHAR +STARTCHAR U_9015 +ENCODING 36885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2540 +2540 +0A80 +E540 +2000 +2FE0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9016 +ENCODING 36886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +2C80 +2DA0 +15C0 +E680 +2C80 +34C0 +2520 +2E20 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9017 +ENCODING 36887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +27C0 +0440 +E7C0 +2000 +2440 +2280 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9018 +ENCODING 36888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8440 +4FC0 +0400 +CFE0 +5100 +4FE0 +4100 +4280 +A440 +9FE0 +ENDCHAR +STARTCHAR U_9019 +ENCODING 36889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2100 +2FE0 +0000 +E7C0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901A +ENCODING 36890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +2FE0 +0920 +EFE0 +2920 +2FE0 +2920 +2960 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901B +ENCODING 36891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +2C80 +2C80 +1480 +E5E0 +2C80 +3480 +2480 +2BE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901C +ENCODING 36892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +27C0 +0240 +EFE0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901D +ENCODING 36893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +25C0 +3F00 +05E0 +E740 +2D40 +3540 +2540 +2E40 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901E +ENCODING 36894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0000 +EFC0 +2100 +27C0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_901F +ENCODING 36895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2100 +0FE0 +E920 +2FE0 +2380 +2540 +2920 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9020 +ENCODING 36896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2500 +27C0 +0900 +EFE0 +2000 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9021 +ENCODING 36897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2440 +2FE0 +0440 +E920 +23C0 +2640 +2980 +2240 +5420 +8FE0 +ENDCHAR +STARTCHAR U_9022 +ENCODING 36898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2480 +2B00 +0FE0 +E100 +27C0 +2100 +2FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9023 +ENCODING 36899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2540 +07C0 +E540 +27C0 +2100 +2FE0 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9024 +ENCODING 36900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9080 +48C0 +42A0 +1AA0 +CC80 +50A0 +7040 +5080 +5300 +A000 +9FE0 +ENDCHAR +STARTCHAR U_9025 +ENCODING 36901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +9FC0 +5540 +1740 +D540 +5740 +5540 +5FC0 +5040 +A000 +9FE0 +ENDCHAR +STARTCHAR U_9026 +ENCODING 36902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +2FE0 +0920 +EDA0 +2B60 +2920 +2920 +2B60 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9027 +ENCODING 36903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +8440 +4820 +1300 +C480 +4840 +5FE0 +4840 +4FC0 +A840 +9FE0 +ENDCHAR +STARTCHAR U_9028 +ENCODING 36904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FC0 +4A80 +0A80 +D740 +6220 +4700 +4A80 +5260 +A200 +9FE0 +ENDCHAR +STARTCHAR U_9029 +ENCODING 36905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2280 +0540 +EBA0 +2100 +2440 +3FE0 +2440 +5840 +8FE0 +ENDCHAR +STARTCHAR U_902A +ENCODING 36906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +8FC0 +4480 +1FE0 +C000 +4FC0 +4AC0 +4D40 +4FC0 +A000 +9FE0 +ENDCHAR +STARTCHAR U_902B +ENCODING 36907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +9320 +4CC0 +1320 +C000 +5FE0 +5320 +4CC0 +5320 +A000 +9FE0 +ENDCHAR +STARTCHAR U_902C +ENCODING 36908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +8880 +5DE0 +0880 +C880 +5DE0 +4880 +4880 +5080 +A080 +9FE0 +ENDCHAR +STARTCHAR U_902D +ENCODING 36909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2820 +0780 +E480 +27C0 +2440 +27C0 +2440 +5000 +8FE0 +ENDCHAR +STARTCHAR U_902E +ENCODING 36910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2140 +0FE0 +E140 +27C0 +2920 +2540 +2B20 +5000 +8FE0 +ENDCHAR +STARTCHAR U_902F +ENCODING 36911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2040 +27C0 +0040 +EFE0 +2920 +2540 +2380 +2540 +5920 +8FE0 +ENDCHAR +STARTCHAR U_9030 +ENCODING 36912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +89E0 +5E00 +0BC0 +CC40 +5880 +4BE0 +4880 +5A80 +A900 +9FE0 +ENDCHAR +STARTCHAR U_9031 +ENCODING 36913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +2BA0 +0920 +EBA0 +2820 +2BA0 +2AA0 +2BA0 +5060 +8FE0 +ENDCHAR +STARTCHAR U_9032 +ENCODING 36914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +27E0 +0C80 +F7E0 +2480 +27E0 +2480 +27E0 +5400 +8FE0 +ENDCHAR +STARTCHAR U_9033 +ENCODING 36915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8FC0 +4480 +1FE0 +C000 +4FC0 +4840 +4FC0 +4840 +A880 +9FE0 +ENDCHAR +STARTCHAR U_9034 +ENCODING 36916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +27C0 +0440 +E7C0 +2440 +27C0 +2100 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9035 +ENCODING 36917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +2100 +0FE0 +E440 +2920 +27C0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9036 +ENCODING 36918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +2F80 +2100 +0FE0 +E540 +2920 +2FE0 +2280 +2340 +5420 +8FE0 +ENDCHAR +STARTCHAR U_9037 +ENCODING 36919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +8880 +4F80 +0880 +CF80 +4800 +5FC0 +6540 +4A40 +A480 +9FE0 +ENDCHAR +STARTCHAR U_9038 +ENCODING 36920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +2780 +2900 +1FC0 +EA40 +2FC0 +2540 +2520 +29E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9039 +ENCODING 36921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8F80 +4200 +1FC0 +C500 +5FC0 +4200 +5FC0 +4200 +A200 +9FE0 +ENDCHAR +STARTCHAR U_903A +ENCODING 36922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8F80 +4200 +1FC0 +C480 +4F40 +4280 +4540 +5C80 +A640 +9FE0 +ENDCHAR +STARTCHAR U_903B +ENCODING 36923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0200 +E7C0 +2840 +2480 +2300 +2C00 +5000 +8FE0 +ENDCHAR +STARTCHAR U_903C +ENCODING 36924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2440 +27C0 +0000 +EFE0 +2920 +2FE0 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_903D +ENCODING 36925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3FE0 +2480 +0200 +EFE0 +2400 +2FC0 +3440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_903E +ENCODING 36926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2280 +2440 +1BA0 +EE00 +2AA0 +2EA0 +2AA0 +2EA0 +5A40 +8FE0 +ENDCHAR +STARTCHAR U_903F +ENCODING 36927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0440 +EFE0 +2400 +27E0 +2AA0 +2520 +5A40 +8FE0 +ENDCHAR +STARTCHAR U_9040 +ENCODING 36928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +8FC0 +4400 +0FC0 +D100 +4FE0 +4440 +47C0 +4440 +A440 +9FE0 +ENDCHAR +STARTCHAR U_9041 +ENCODING 36929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2F80 +2880 +0FE0 +EA20 +2BE0 +2A20 +2BE0 +2A20 +53E0 +8FE0 +ENDCHAR +STARTCHAR U_9042 +ENCODING 36930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +3FE0 +0620 +E940 +2280 +2DC0 +22A0 +2CA0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9043 +ENCODING 36931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +8FE0 +4280 +0FE0 +C900 +4AA0 +4D20 +4A40 +5480 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9044 +ENCODING 36932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2FE0 +2000 +1FE0 +E200 +2FE0 +2AA0 +2AA0 +2AE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9045 +ENCODING 36933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +8840 +4FC0 +0A80 +CFE0 +4900 +57C0 +5100 +6FE0 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9046 +ENCODING 36934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +8FE0 +4280 +1FE0 +D120 +4FE0 +4920 +4920 +4960 +A100 +9FE0 +ENDCHAR +STARTCHAR U_9047 +ENCODING 36935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +8A40 +4FC0 +0A40 +CFC0 +4200 +5FE0 +52A0 +57A0 +B040 +9FE0 +ENDCHAR +STARTCHAR U_9048 +ENCODING 36936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F80 +8880 +4F80 +0880 +DFC0 +4200 +4B80 +4E00 +53C0 +6000 +9FE0 +ENDCHAR +STARTCHAR U_9049 +ENCODING 36937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +2100 +27C0 +0440 +E7C0 +2440 +27C0 +2440 +27C0 +5C60 +8FE0 +ENDCHAR +STARTCHAR U_904A +ENCODING 36938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +24E0 +3F00 +08E0 +EE40 +2BE0 +2A40 +2A40 +36C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_904B +ENCODING 36939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2920 +2FE0 +0540 +E7C0 +2540 +27C0 +2100 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_904C +ENCODING 36940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0EE0 +CAA0 +4EE0 +0000 +C7C0 +4000 +4FE0 +4200 +4380 +6080 +9FE0 +ENDCHAR +STARTCHAR U_904D +ENCODING 36941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2820 +0FE0 +E800 +2FE0 +3AA0 +2FE0 +2AA0 +5820 +8FE0 +ENDCHAR +STARTCHAR U_904E +ENCODING 36942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +2740 +0540 +EFE0 +2820 +2BA0 +2AA0 +2BA0 +5860 +8FE0 +ENDCHAR +STARTCHAR U_904F +ENCODING 36943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0440 +E7E0 +2920 +3AA0 +2820 +2FA0 +5040 +8FE0 +ENDCHAR +STARTCHAR U_9050 +ENCODING 36944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2A20 +2EE0 +0800 +EEE0 +28A0 +2F40 +28A0 +2920 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9051 +ENCODING 36945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2440 +07C0 +E440 +2FE0 +2100 +27C0 +2100 +57E0 +8FE0 +ENDCHAR +STARTCHAR U_9052 +ENCODING 36946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +2280 +0FE0 +EAA0 +2CE0 +2BA0 +2820 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9053 +ENCODING 36947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +2FE0 +0100 +E7C0 +2440 +27C0 +2440 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9054 +ENCODING 36948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2100 +0FE0 +E280 +2FE0 +2100 +2FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9055 +ENCODING 36949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2240 +2FE0 +0440 +E7C0 +2100 +27E0 +2500 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9056 +ENCODING 36950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +9FE0 +4400 +1FC0 +D540 +5FC0 +5240 +5FC0 +5240 +72C0 +9FE0 +ENDCHAR +STARTCHAR U_9057 +ENCODING 36951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +2940 +1FE0 +E000 +2FC0 +2940 +2940 +2280 +5440 +8FE0 +ENDCHAR +STARTCHAR U_9058 +ENCODING 36952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +2280 +0FE0 +E540 +27C0 +2540 +2FE0 +2440 +54C0 +8FE0 +ENDCHAR +STARTCHAR U_9059 +ENCODING 36953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2440 +2A80 +0500 +EFE0 +2500 +2FE0 +2540 +27C0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_905A +ENCODING 36954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0AC0 +5240 +5AC0 +1240 +DFC0 +4200 +5F80 +4500 +4200 +6D80 +9FE0 +ENDCHAR +STARTCHAR U_905B +ENCODING 36955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +28A0 +2AA0 +0D60 +EFE0 +2920 +2FE0 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_905C +ENCODING 36956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E80 +2540 +26A0 +09C0 +EAA0 +3FE0 +2880 +2AC0 +3CA0 +6100 +9FE0 +ENDCHAR +STARTCHAR U_905D +ENCODING 36957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0100 +E540 +2920 +2580 +2940 +2120 +5100 +8FE0 +ENDCHAR +STARTCHAR U_905E +ENCODING 36958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2880 +2BE0 +0AA0 +EBC0 +2AA0 +2AE0 +3540 +2940 +5220 +8FE0 +ENDCHAR +STARTCHAR U_905F +ENCODING 36959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +4840 +0FC0 +C900 +4FC0 +4A80 +57E0 +5100 +57C0 +6100 +9FE0 +ENDCHAR +STARTCHAR U_9060 +ENCODING 36960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2100 +0FE0 +E440 +27C0 +2320 +26C0 +2A40 +5220 +8FE0 +ENDCHAR +STARTCHAR U_9061 +ENCODING 36961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A2E0 +54A0 +7EE0 +08A0 +EAE0 +6AA0 +7EA0 +48A0 +5140 +7000 +9FE0 +ENDCHAR +STARTCHAR U_9062 +ENCODING 36962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +27C0 +0440 +EFE0 +2AA0 +2660 +2AA0 +3320 +5660 +8FE0 +ENDCHAR +STARTCHAR U_9063 +ENCODING 36963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2540 +1FE0 +E7C0 +2440 +27E0 +2420 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9064 +ENCODING 36964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2900 +0FC0 +0900 +EFC0 +2900 +2FE0 +2AA0 +2D60 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9065 +ENCODING 36965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +2F20 +2540 +07E0 +E900 +3FE0 +2100 +2920 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9066 +ENCODING 36966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +CA40 +5FE0 +0A40 +CFC0 +4000 +4FC0 +4940 +4FC0 +6480 +9FE0 +ENDCHAR +STARTCHAR U_9067 +ENCODING 36967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FC0 +2280 +0100 +EFE0 +2440 +27C0 +2440 +2FE0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9068 +ENCODING 36968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +2480 +2EE0 +04A0 +FFA0 +28A0 +2EA0 +2A40 +2AA0 +5320 +8FE0 +ENDCHAR +STARTCHAR U_9069 +ENCODING 36969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2280 +0FE0 +E920 +2FE0 +2AA0 +2BA0 +2860 +5000 +8FE0 +ENDCHAR +STARTCHAR U_906A +ENCODING 36970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +8FC0 +4480 +0B40 +DFE0 +4A80 +5560 +4A80 +4500 +6200 +9FE0 +ENDCHAR +STARTCHAR U_906B +ENCODING 36971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +3F80 +24E0 +1FA0 +F5A0 +3FA0 +24A0 +2E40 +34A0 +5520 +8FE0 +ENDCHAR +STARTCHAR U_906C +ENCODING 36972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +9E80 +44E0 +5F20 +1540 +FF40 +2440 +2C40 +36A0 +6520 +9FE0 +ENDCHAR +STARTCHAR U_906D +ENCODING 36973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8500 +7FE0 +5540 +1FC0 +D540 +5FC0 +4880 +4F80 +4880 +AF80 +9FE0 +ENDCHAR +STARTCHAR U_906E +ENCODING 36974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2A40 +0FE0 +EA40 +2BC0 +2800 +3540 +2AA0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_906F +ENCODING 36975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +5480 +5520 +1EC0 +D580 +5680 +5DC0 +56A0 +57A0 +AD00 +9FE0 +ENDCHAR +STARTCHAR U_9070 +ENCODING 36976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +3FE0 +2AA0 +13A0 +EFE0 +2920 +27C0 +2540 +25C0 +5100 +8FE0 +ENDCHAR +STARTCHAR U_9071 +ENCODING 36977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +4FC0 +4A40 +1FE0 +0A40 +CFC0 +4200 +5FE0 +4480 +6300 +9FE0 +ENDCHAR +STARTCHAR U_9072 +ENCODING 36978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +2FE0 +0AA0 +E9C0 +2AA0 +2BE0 +2A80 +37E0 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9073 +ENCODING 36979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +3FE0 +2440 +0540 +EBA0 +2100 +27C0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9074 +ENCODING 36980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +2540 +2FE0 +0540 +E920 +26E0 +2B40 +35E0 +2840 +5040 +8FE0 +ENDCHAR +STARTCHAR U_9075 +ENCODING 36981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +2FE0 +2280 +0FE0 +EAA0 +2FE0 +28A0 +3FE0 +2280 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9076 +ENCODING 36982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2100 +0FE0 +E440 +2FE0 +2440 +2FE0 +2280 +54E0 +8FE0 +ENDCHAR +STARTCHAR U_9077 +ENCODING 36983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +2FE0 +0AA0 +FFE0 +2440 +2FA0 +24A0 +27E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9078 +ENCODING 36984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +0880 +EAA0 +2FE0 +2280 +2FE0 +2240 +5420 +8FE0 +ENDCHAR +STARTCHAR U_9079 +ENCODING 36985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2280 +2FE0 +02A0 +E480 +2FE0 +2AA0 +2C60 +2BA0 +5AA0 +87E0 +ENDCHAR +STARTCHAR U_907A +ENCODING 36986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +2540 +0FE0 +E440 +27C0 +2440 +27C0 +2280 +5440 +8FE0 +ENDCHAR +STARTCHAR U_907B +ENCODING 36987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2AA0 +2EE0 +0280 +EFE0 +2540 +2540 +27C0 +2200 +5400 +8FE0 +ENDCHAR +STARTCHAR U_907C +ENCODING 36988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2AA0 +07C0 +EC60 +37C0 +2440 +27C0 +2940 +5320 +8FE0 +ENDCHAR +STARTCHAR U_907D +ENCODING 36989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +2FE0 +0A20 +EFE0 +2D40 +2A80 +2DC0 +32A0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_907E +ENCODING 36990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2EE0 +3540 +0FE0 +E100 +2540 +2BA0 +2100 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_907F +ENCODING 36991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9C80 +57E0 +1540 +1C80 +D3E0 +5C80 +77E0 +5480 +5C80 +A080 +9FE0 +ENDCHAR +STARTCHAR U_9080 +ENCODING 36992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +5E80 +52E0 +1FA0 +D2A0 +7FA0 +48A0 +4E40 +52A0 +A520 +9FE0 +ENDCHAR +STARTCHAR U_9081 +ENCODING 36993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +2540 +07C0 +E540 +2FE0 +2960 +2FE0 +2820 +5060 +8FE0 +ENDCHAR +STARTCHAR U_9082 +ENCODING 36994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +4AA0 +5FA0 +1540 +DF40 +55E0 +5F40 +55E0 +5540 +B340 +8FE0 +ENDCHAR +STARTCHAR U_9083 +ENCODING 36995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2AA0 +0440 +EFE0 +2500 +2AA0 +25C0 +2AA0 +5500 +8FE0 +ENDCHAR +STARTCHAR U_9084 +ENCODING 36996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FC0 +5540 +5FC0 +0000 +FFE0 +2880 +2FA0 +2740 +2A80 +5240 +8FE0 +ENDCHAR +STARTCHAR U_9085 +ENCODING 36997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FE0 +4BA0 +0820 +EFE0 +2440 +27C0 +2440 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9086 +ENCODING 36998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +2AA0 +27C0 +0820 +E7C0 +2440 +27C0 +2280 +2FE0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_9087 +ENCODING 36999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4540 +4FE0 +1920 +EDA0 +2B60 +2DA0 +2B60 +2DA0 +5920 +8FE0 +ENDCHAR +STARTCHAR U_9088 +ENCODING 37000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +35E0 +2B20 +0DE0 +F720 +2BE0 +3680 +2AA0 +3360 +5400 +8FE0 +ENDCHAR +STARTCHAR U_9089 +ENCODING 37001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +CFC0 +4840 +0FC0 +C840 +5FE0 +54A0 +4FC0 +54A0 +6480 +9FE0 +ENDCHAR +STARTCHAR U_908A +ENCODING 37002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FC0 +2840 +1FE0 +F4A0 +2940 +3FE0 +2200 +27C0 +58C0 +8FE0 +ENDCHAR +STARTCHAR U_908B +ENCODING 37003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +2A80 +2540 +0FE0 +EAA0 +2FE0 +2DC0 +2B40 +2DC0 +5320 +8FE0 +ENDCHAR +STARTCHAR U_908C +ENCODING 37004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9E80 +44E0 +5F60 +0EA0 +D520 +4740 +4A80 +7AE0 +4700 +6A80 +9FE0 +ENDCHAR +STARTCHAR U_908D +ENCODING 37005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87C0 +5C80 +47C0 +1D60 +E7C0 +2040 +3FE0 +2540 +2380 +5540 +8FE0 +ENDCHAR +STARTCHAR U_908E +ENCODING 37006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8860 +4D80 +5480 +0940 +DF80 +6120 +5FE0 +5480 +5DC0 +62A0 +9FE0 +ENDCHAR +STARTCHAR U_908F +ENCODING 37007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0440 +EBE0 +3D40 +25E0 +2940 +2FE0 +5500 +8FE0 +ENDCHAR +STARTCHAR U_9090 +ENCODING 37008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +2000 +2EE0 +0AA0 +EFE0 +2AA0 +2FE0 +2C80 +27E0 +5480 +8FE0 +ENDCHAR +STARTCHAR U_9091 +ENCODING 37009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7E00 +4200 +7E00 +0000 +FF00 +8900 +FF00 +8000 +8080 +8080 +7F80 +ENDCHAR +STARTCHAR U_9092 +ENCODING 37010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1220 +1240 +1280 +1280 +1240 +1220 +1220 +12A0 +5240 +2200 +ENDCHAR +STARTCHAR U_9093 +ENCODING 37011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03E0 +FA20 +0A40 +8A40 +4A80 +3240 +1220 +2A20 +4AA0 +8240 +0200 +ENDCHAR +STARTCHAR U_9094 +ENCODING 37012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FBC0 +0A40 +0A80 +0A80 +FB00 +8280 +8240 +8A40 +9340 +A280 +C200 +ENDCHAR +STARTCHAR U_9095 +ENCODING 37013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2480 +4900 +2480 +7F00 +4100 +FF80 +8880 +FF80 +8040 +8040 +7FC0 +ENDCHAR +STARTCHAR U_9096 +ENCODING 37014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +2240 +AA80 +AA80 +AA40 +AA20 +AA20 +FAA0 +0240 +0200 +ENDCHAR +STARTCHAR U_9097 +ENCODING 37015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1120 +1140 +1140 +FF80 +1140 +1120 +1120 +11A0 +1140 +1100 +ENDCHAR +STARTCHAR U_9098 +ENCODING 37016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1120 +1140 +1140 +FD80 +1140 +1120 +1120 +11A0 +5140 +2100 +ENDCHAR +STARTCHAR U_9099 +ENCODING 37017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +FF40 +4140 +4180 +4140 +4120 +4120 +41A0 +7D40 +0100 +ENDCHAR +STARTCHAR U_909A +ENCODING 37018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +FF20 +2540 +2580 +4540 +2920 +1120 +19A0 +2540 +C100 +ENDCHAR +STARTCHAR U_909B +ENCODING 37019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +2240 +2240 +2280 +2240 +2220 +3A20 +E2A0 +0240 +0200 +ENDCHAR +STARTCHAR U_909C +ENCODING 37020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +23E0 +3E40 +4A80 +6A80 +9A40 +1220 +1220 +22A0 +4240 +8200 +ENDCHAR +STARTCHAR U_909D +ENCODING 37021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +7F40 +4140 +4180 +4140 +4120 +4120 +41A0 +8140 +8100 +ENDCHAR +STARTCHAR U_909E +ENCODING 37022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +7D40 +1140 +1180 +7F40 +1120 +1920 +25A0 +4540 +8100 +ENDCHAR +STARTCHAR U_909F +ENCODING 37023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +0140 +3D40 +2580 +2540 +2520 +2520 +27A0 +4540 +8100 +ENDCHAR +STARTCHAR U_90A0 +ENCODING 37024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2520 +4340 +8140 +7D80 +1540 +1520 +1520 +25A0 +5540 +8900 +ENDCHAR +STARTCHAR U_90A1 +ENCODING 37025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +FF40 +2140 +3D80 +2540 +2520 +2520 +45A0 +5540 +8900 +ENDCHAR +STARTCHAR U_90A2 +ENCODING 37026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2920 +2940 +2940 +FF80 +2940 +2920 +2920 +29E0 +4940 +8900 +ENDCHAR +STARTCHAR U_90A3 +ENCODING 37027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2540 +FD40 +2540 +2520 +FD20 +25A0 +2540 +4500 +8D00 +ENDCHAR +STARTCHAR U_90A4 +ENCODING 37028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +63E0 +4240 +7E80 +4A80 +4A40 +4A20 +4A20 +4AA0 +8A40 +8A00 +ENDCHAR +STARTCHAR U_90A5 +ENCODING 37029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +7F40 +5540 +1180 +1940 +2920 +2920 +2BA0 +4D40 +8900 +ENDCHAR +STARTCHAR U_90A6 +ENCODING 37030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1140 +1140 +7D80 +1140 +FF20 +1120 +11A0 +2140 +C100 +ENDCHAR +STARTCHAR U_90A7 +ENCODING 37031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +0120 +0140 +FF40 +2980 +2940 +2920 +2B20 +2DE0 +4940 +8100 +ENDCHAR +STARTCHAR U_90A8 +ENCODING 37032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +11E0 +FF20 +1140 +5580 +5540 +7D20 +11A0 +1540 +1900 +0100 +ENDCHAR +STARTCHAR U_90A9 +ENCODING 37033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +13E0 +1240 +5680 +5A80 +9240 +1220 +2AA0 +2640 +4200 +8200 +ENDCHAR +STARTCHAR U_90AA +ENCODING 37034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +0920 +2940 +4940 +7D80 +0940 +1920 +2920 +49A0 +A940 +1100 +ENDCHAR +STARTCHAR U_90AB +ENCODING 37035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +FC40 +27C0 +7800 +27C0 +FD40 +27C0 +2400 +4420 +83E0 +ENDCHAR +STARTCHAR U_90AC +ENCODING 37036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7D20 +4540 +4540 +5980 +4140 +7D20 +0520 +35A0 +C540 +1900 +ENDCHAR +STARTCHAR U_90AD +ENCODING 37037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7DE0 +8540 +7580 +5540 +5520 +7520 +05A0 +3540 +0900 +0100 +ENDCHAR +STARTCHAR U_90AE +ENCODING 37038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2220 +FA40 +AA40 +AA80 +FA40 +AA20 +AA20 +FAA0 +8A40 +0200 +ENDCHAR +STARTCHAR U_90AF +ENCODING 37039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FF40 +2540 +2580 +3D40 +2520 +2520 +25A0 +3D40 +2500 +ENDCHAR +STARTCHAR U_90B0 +ENCODING 37040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +2120 +4540 +FB40 +0180 +7D40 +4520 +4520 +45E0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90B1 +ENCODING 37041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +7120 +4140 +4140 +7F80 +4940 +4920 +4920 +5FA0 +E140 +0100 +ENDCHAR +STARTCHAR U_90B2 +ENCODING 37042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0D20 +0540 +2540 +2580 +6540 +6B20 +AB20 +35E0 +2540 +DD00 +0100 +ENDCHAR +STARTCHAR U_90B3 +ENCODING 37043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01E0 +FD20 +1140 +1940 +3580 +5540 +9120 +1120 +1DA0 +E140 +4100 +ENDCHAR +STARTCHAR U_90B4 +ENCODING 37044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2120 +2140 +FD40 +A580 +A540 +B520 +CD20 +85E0 +8540 +8D00 +ENDCHAR +STARTCHAR U_90B5 +ENCODING 37045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +2540 +2540 +5580 +8940 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90B6 +ENCODING 37046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2920 +2940 +EB40 +2D80 +2940 +2920 +2B20 +EDA0 +2940 +2100 +ENDCHAR +STARTCHAR U_90B7 +ENCODING 37047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2120 +3940 +4980 +6940 +5920 +4920 +49A0 +6B40 +4700 +0100 +ENDCHAR +STARTCHAR U_90B8 +ENCODING 37048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F120 +9140 +9140 +FD80 +9140 +9120 +B520 +CDE0 +A540 +1100 +ENDCHAR +STARTCHAR U_90B9 +ENCODING 37049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +3D20 +4940 +BD40 +0580 +0540 +7D20 +0520 +05A0 +7D40 +0100 +ENDCHAR +STARTCHAR U_90BA +ENCODING 37050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +2920 +A940 +AB40 +6D80 +2940 +2920 +2920 +2FA0 +F140 +4100 +ENDCHAR +STARTCHAR U_90BB +ENCODING 37051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1920 +2540 +5340 +8980 +0140 +7F20 +0520 +29E0 +1140 +0900 +ENDCHAR +STARTCHAR U_90BC +ENCODING 37052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +8120 +FD40 +9180 +FD40 +9120 +FD20 +81A0 +FD40 +0100 +0100 +ENDCHAR +STARTCHAR U_90BD +ENCODING 37053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1140 +1140 +FF80 +1140 +7D20 +1120 +1FE0 +F140 +4100 +ENDCHAR +STARTCHAR U_90BE +ENCODING 37054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51E0 +5120 +7D20 +9140 +FF20 +1120 +3920 +55A0 +9340 +1100 +1100 +ENDCHAR +STARTCHAR U_90BF +ENCODING 37055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1120 +FF40 +0980 +FF40 +8920 +4920 +09A0 +2940 +1100 +ENDCHAR +STARTCHAR U_90C0 +ENCODING 37056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7F20 +2920 +4540 +BB80 +0140 +FF20 +2120 +3DA0 +0540 +1900 +ENDCHAR +STARTCHAR U_90C1 +ENCODING 37057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +2120 +3D40 +6580 +BD40 +2520 +3D20 +25A0 +2540 +2D00 +ENDCHAR +STARTCHAR U_90C2 +ENCODING 37058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD20 +2120 +4940 +7980 +1140 +2920 +D120 +29A0 +C540 +0100 +ENDCHAR +STARTCHAR U_90C3 +ENCODING 37059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +2920 +4520 +8340 +7D80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90C4 +ENCODING 37060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +1920 +1520 +6340 +1180 +7F40 +2120 +2920 +51A0 +A540 +3F00 +ENDCHAR +STARTCHAR U_90C5 +ENCODING 37061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2120 +4920 +FD40 +1580 +1140 +7D20 +1120 +1DA0 +F140 +4100 +ENDCHAR +STARTCHAR U_90C6 +ENCODING 37062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +1120 +FF20 +1140 +7D80 +0140 +7D20 +4520 +45A0 +7D40 +0100 +ENDCHAR +STARTCHAR U_90C7 +ENCODING 37063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7D20 +8520 +7540 +5580 +7540 +5520 +7520 +55A0 +0540 +1900 +ENDCHAR +STARTCHAR U_90C8 +ENCODING 37064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F120 +8120 +FD40 +8180 +BD40 +A520 +A520 +A5A0 +BD40 +A500 +ENDCHAR +STARTCHAR U_90C9 +ENCODING 37065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EDE0 +4920 +4920 +4940 +FF80 +4940 +4920 +4920 +49A0 +8940 +8900 +ENDCHAR +STARTCHAR U_90CA +ENCODING 37066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +FF20 +2540 +4380 +A540 +1920 +0920 +15A0 +2340 +C100 +ENDCHAR +STARTCHAR U_90CB +ENCODING 37067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +23C0 +4240 +FA40 +8A80 +FB00 +8A80 +8A40 +FA40 +8B40 +FA80 +8A00 +ENDCHAR +STARTCHAR U_90CC +ENCODING 37068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F440 +27C0 +F800 +27C0 +2540 +F540 +27C0 +3400 +C420 +03E0 +ENDCHAR +STARTCHAR U_90CD +ENCODING 37069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +3D20 +2520 +3540 +2D80 +FF40 +2520 +3520 +2DA0 +4540 +8D00 +ENDCHAR +STARTCHAR U_90CE +ENCODING 37070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +23C0 +FA40 +8A40 +FA80 +8A80 +FA40 +A240 +9240 +AB40 +CA80 +0200 +ENDCHAR +STARTCHAR U_90CF +ENCODING 37071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +9340 +5580 +FF40 +1120 +1120 +29A0 +4540 +8300 +ENDCHAR +STARTCHAR U_90D0 +ENCODING 37072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +2920 +4520 +BB40 +0180 +FD40 +2120 +2120 +49A0 +FD40 +0300 +ENDCHAR +STARTCHAR U_90D1 +ENCODING 37073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +29E0 +7D20 +1140 +1180 +FD40 +1120 +2920 +25A0 +4540 +8100 +ENDCHAR +STARTCHAR U_90D2 +ENCODING 37074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F440 +97C0 +F000 +97C0 +F540 +8540 +A7C0 +B400 +D420 +83E0 +ENDCHAR +STARTCHAR U_90D3 +ENCODING 37075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +8520 +2120 +FD40 +5180 +FD40 +1120 +1D20 +F1A0 +1140 +1100 +ENDCHAR +STARTCHAR U_90D4 +ENCODING 37076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +C3E0 +5D20 +4520 +8540 +D780 +5540 +5520 +D520 +5FA0 +A140 +9F00 +ENDCHAR +STARTCHAR U_90D5 +ENCODING 37077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +0B20 +FF20 +8940 +E980 +A940 +AB20 +AD20 +E9A0 +9540 +A300 +ENDCHAR +STARTCHAR U_90D6 +ENCODING 37078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0120 +7D20 +4540 +4580 +7D40 +0520 +4920 +2DA0 +F140 +4100 +ENDCHAR +STARTCHAR U_90D7 +ENCODING 37079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CDE0 +3120 +CD20 +2140 +FF80 +5140 +7D20 +D520 +55A0 +5D40 +1100 +ENDCHAR +STARTCHAR U_90D8 +ENCODING 37080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79E0 +4920 +4920 +7940 +0180 +0140 +FD20 +8520 +85A0 +FD40 +8500 +ENDCHAR +STARTCHAR U_90D9 +ENCODING 37081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +15E0 +FF20 +1120 +FD40 +9580 +FD40 +9520 +FD20 +95A0 +9540 +9D00 +ENDCHAR +STARTCHAR U_90DA +ENCODING 37082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1120 +7D20 +2540 +FF80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90DB +ENCODING 37083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +09E0 +F520 +A520 +5940 +FD80 +0940 +1D20 +F120 +11A0 +5140 +2100 +ENDCHAR +STARTCHAR U_90DC +ENCODING 37084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51E0 +7D20 +9120 +1140 +FF80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90DD +ENCODING 37085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1120 +FF40 +2980 +AD40 +AB20 +A920 +29A0 +4940 +9900 +ENDCHAR +STARTCHAR U_90DE +ENCODING 37086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +8A20 +FA40 +8A80 +FA40 +AA20 +9220 +AB20 +CAC0 +0200 +ENDCHAR +STARTCHAR U_90DF +ENCODING 37087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +5540 +5580 +BB40 +9120 +1120 +29A0 +4540 +8300 +ENDCHAR +STARTCHAR U_90E0 +ENCODING 37088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +1120 +FD20 +9540 +FD80 +9540 +FD20 +5120 +21A0 +5140 +8D00 +ENDCHAR +STARTCHAR U_90E1 +ENCODING 37089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2520 +FF20 +2540 +7D80 +2140 +3D20 +6520 +A5A0 +3D40 +2500 +ENDCHAR +STARTCHAR U_90E2 +ENCODING 37090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8920 +8920 +F940 +0180 +F940 +2120 +F920 +21A0 +3940 +C100 +ENDCHAR +STARTCHAR U_90E3 +ENCODING 37091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +1120 +FF40 +8380 +7D40 +0920 +FD20 +11A0 +1140 +3100 +ENDCHAR +STARTCHAR U_90E4 +ENCODING 37092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +4520 +8320 +1140 +2980 +4540 +FF20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90E5 +ENCODING 37093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +4520 +7D40 +4580 +7D40 +4520 +7D20 +29A0 +4540 +8300 +ENDCHAR +STARTCHAR U_90E6 +ENCODING 37094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +00A0 +FEA0 +92A0 +92C0 +DAA0 +B6A0 +92A0 +92E0 +9280 +B680 +ENDCHAR +STARTCHAR U_90E7 +ENCODING 37095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D20 +0140 +7D80 +4540 +5520 +5520 +55A0 +2940 +C700 +ENDCHAR +STARTCHAR U_90E8 +ENCODING 37096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +4520 +2940 +FF80 +0140 +7D20 +4520 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90E9 +ENCODING 37097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +3120 +4920 +FF40 +2180 +7D40 +C520 +7D20 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90EA +ENCODING 37098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FF20 +2520 +FF40 +2580 +FD40 +2120 +FF20 +49A0 +3140 +CD00 +ENDCHAR +STARTCHAR U_90EB +ENCODING 37099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +FD20 +9520 +FD40 +9580 +FD40 +2920 +4920 +FFA0 +0940 +0900 +ENDCHAR +STARTCHAR U_90EC +ENCODING 37100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +7D40 +1180 +FF40 +4520 +7D20 +45A0 +7D40 +4500 +ENDCHAR +STARTCHAR U_90ED +ENCODING 37101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +4520 +7D40 +0180 +7D40 +0920 +1F20 +F120 +11C0 +3100 +ENDCHAR +STARTCHAR U_90EE +ENCODING 37102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +92A0 +FEA0 +92A0 +FEC0 +82A0 +BAA0 +AAA0 +BAE0 +8280 +8680 +ENDCHAR +STARTCHAR U_90EF +ENCODING 37103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5320 +9520 +1140 +2980 +C740 +1120 +5520 +95A0 +2940 +C700 +ENDCHAR +STARTCHAR U_90F0 +ENCODING 37104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +50A0 +5FA0 +71C0 +55A0 +72A0 +56A0 +FDA0 +18E0 +1080 +1080 +ENDCHAR +STARTCHAR U_90F1 +ENCODING 37105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2920 +7D20 +2940 +2980 +FF40 +2920 +2920 +29A0 +4940 +8900 +ENDCHAR +STARTCHAR U_90F2 +ENCODING 37106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +1120 +5540 +5580 +BB40 +1120 +3920 +55A0 +9340 +1100 +ENDCHAR +STARTCHAR U_90F3 +ENCODING 37107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +9D20 +8520 +DD40 +8580 +FD40 +5120 +5120 +55A0 +5940 +9100 +ENDCHAR +STARTCHAR U_90F4 +ENCODING 37108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +2520 +FF20 +2540 +3780 +6D40 +B520 +A520 +25A0 +2540 +2500 +ENDCHAR +STARTCHAR U_90F5 +ENCODING 37109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +7920 +1120 +FF40 +5580 +FF40 +5520 +FF20 +11A0 +1D40 +E100 +ENDCHAR +STARTCHAR U_90F6 +ENCODING 37110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +4BE0 +5000 +FBE0 +02A0 +7AA0 +4BE0 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_90F7 +ENCODING 37111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +4EA0 +9AC0 +EAA0 +4EA0 +98A0 +EAA0 +2DE0 +4880 +8080 +ENDCHAR +STARTCHAR U_90F8 +ENCODING 37112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +2920 +7D20 +5540 +7D80 +5540 +7D20 +1120 +FFA0 +1140 +1100 +ENDCHAR +STARTCHAR U_90F9 +ENCODING 37113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D20 +4540 +7D80 +4540 +7D20 +1520 +FFA0 +2940 +C700 +ENDCHAR +STARTCHAR U_90FA +ENCODING 37114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +3D40 +4AA0 +D7C0 +2440 +57E0 +BD20 +4FE0 +3400 +2420 +C3E0 +ENDCHAR +STARTCHAR U_90FB +ENCODING 37115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3DE0 +A520 +BD20 +A540 +BD80 +A540 +FF20 +5520 +A9A0 +A940 +5500 +ENDCHAR +STARTCHAR U_90FC +ENCODING 37116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +2520 +FF40 +4580 +7D40 +1120 +FD20 +51A0 +7F40 +1100 +ENDCHAR +STARTCHAR U_90FD +ENCODING 37117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7D20 +1540 +FF80 +2140 +3D20 +6520 +BD20 +25A0 +3D40 +2500 +ENDCHAR +STARTCHAR U_90FE +ENCODING 37118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +BD20 +A540 +BD80 +9140 +FF20 +A520 +99A0 +A540 +FF00 +ENDCHAR +STARTCHAR U_90FF +ENCODING 37119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5520 +7D20 +4140 +5D80 +5540 +5D20 +5520 +5DA0 +5540 +9D00 +ENDCHAR +STARTCHAR U_9100 +ENCODING 37120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +FF20 +2520 +1140 +FF80 +2140 +7D20 +A520 +25A0 +3D40 +0100 +ENDCHAR +STARTCHAR U_9101 +ENCODING 37121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +ED20 +2920 +EF40 +0180 +7D40 +4520 +7D20 +45A0 +7D40 +4D00 +ENDCHAR +STARTCHAR U_9102 +ENCODING 37122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +AB20 +EF20 +0140 +7D80 +0140 +FF20 +2120 +3DA0 +0540 +3900 +ENDCHAR +STARTCHAR U_9103 +ENCODING 37123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +28A0 +44A0 +BAA0 +00C0 +E2A0 +AAA0 +EAA0 +AAA0 +EAC0 +A680 +ENDCHAR +STARTCHAR U_9104 +ENCODING 37124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2920 +FF20 +AB40 +AB80 +FF40 +1120 +7D20 +11A0 +1D40 +E100 +ENDCHAR +STARTCHAR U_9105 +ENCODING 37125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F120 +1120 +FD40 +9580 +FD40 +1120 +FD20 +95A0 +FD40 +8D00 +ENDCHAR +STARTCHAR U_9106 +ENCODING 37126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +82A0 +10A0 +FEA0 +54C0 +7CA0 +54A0 +7CA0 +10E0 +FE80 +1080 +ENDCHAR +STARTCHAR U_9107 +ENCODING 37127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +22A0 +42A0 +5FA0 +C8C0 +5EA0 +44A0 +5FA0 +44A0 +4AE0 +5180 +ENDCHAR +STARTCHAR U_9108 +ENCODING 37128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAE0 +95A0 +66A0 +42A0 +BDC0 +10A0 +FEA0 +10A0 +18A0 +24E0 +C280 +ENDCHAR +STARTCHAR U_9109 +ENCODING 37129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2EE0 +4AA0 +9EA0 +EAC0 +4EA0 +9CA0 +EAA0 +2DE0 +4880 +8080 +ENDCHAR +STARTCHAR U_910A +ENCODING 37130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +5FE0 +9AA0 +EEC0 +4AA0 +9EA0 +EBA0 +2EA0 +52C0 +8280 +0280 +ENDCHAR +STARTCHAR U_910B +ENCODING 37131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +31E0 +DD20 +9520 +FD40 +9580 +FD40 +1120 +FD20 +49A0 +3140 +CD00 +ENDCHAR +STARTCHAR U_910C +ENCODING 37132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7F20 +5120 +7D40 +5580 +7F40 +5520 +7D20 +65A0 +A540 +3D00 +ENDCHAR +STARTCHAR U_910D +ENCODING 37133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8320 +7D20 +4540 +7D80 +4540 +7D20 +1120 +FFA0 +2940 +C700 +ENDCHAR +STARTCHAR U_910E +ENCODING 37134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +4520 +7D40 +4580 +7D40 +4520 +7D20 +2BA0 +6540 +BD00 +ENDCHAR +STARTCHAR U_910F +ENCODING 37135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +80A0 +BCA0 +80A0 +FEC0 +AAA0 +B4A0 +A6A0 +FEE0 +A480 +9C80 +ENDCHAR +STARTCHAR U_9110 +ENCODING 37136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +2920 +5540 +FB80 +0140 +7D20 +5520 +7DA0 +5540 +7D00 +ENDCHAR +STARTCHAR U_9111 +ENCODING 37137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2920 +6D20 +2940 +FF80 +0140 +7D20 +4520 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_9112 +ENCODING 37138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7D20 +D520 +7D40 +2580 +4940 +3D20 +D520 +7DA0 +2540 +C900 +ENDCHAR +STARTCHAR U_9113 +ENCODING 37139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +4520 +7D40 +4580 +7D40 +1520 +FF20 +11A0 +2940 +C500 +ENDCHAR +STARTCHAR U_9114 +ENCODING 37140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +F920 +8920 +F940 +8180 +FD40 +8120 +FD20 +55A0 +AD40 +0900 +ENDCHAR +STARTCHAR U_9115 +ENCODING 37141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +4EA0 +AAA0 +EEC0 +4AC0 +AEA0 +E8A0 +2EA0 +48E0 +4680 +8080 +ENDCHAR +STARTCHAR U_9116 +ENCODING 37142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FBC0 +8A40 +FA40 +0280 +FB00 +8A80 +FA40 +8A40 +FB40 +5280 +8A00 +ENDCHAR +STARTCHAR U_9117 +ENCODING 37143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10E0 +FEA0 +24A0 +3CA0 +00C0 +FEA0 +82A0 +BAA0 +AAE0 +BA80 +8680 +ENDCHAR +STARTCHAR U_9118 +ENCODING 37144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +FFA0 +8AA0 +FFA0 +8AC0 +FEA0 +AAA0 +BEA0 +AAE0 +BE80 +AE80 +ENDCHAR +STARTCHAR U_9119 +ENCODING 37145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CE0 +44A0 +7CA0 +10C0 +FEA0 +10A0 +FEA0 +AAA0 +BAE0 +8280 +FE80 +ENDCHAR +STARTCHAR U_911A +ENCODING 37146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2920 +7D40 +4580 +7D40 +4520 +FF20 +11A0 +2940 +C500 +ENDCHAR +STARTCHAR U_911B +ENCODING 37147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +55E0 +A920 +5520 +7D40 +5580 +7D40 +5520 +FF20 +39A0 +5540 +9300 +ENDCHAR +STARTCHAR U_911C +ENCODING 37148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +7FA0 +54A0 +7F80 +54C0 +7FA0 +54A0 +5FA0 +54E0 +5D80 +9680 +ENDCHAR +STARTCHAR U_911D +ENCODING 37149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2520 +B540 +6D40 +B580 +5540 +AB20 +5520 +29E0 +1140 +E100 +ENDCHAR +STARTCHAR U_911E +ENCODING 37150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2920 +1140 +7D80 +5540 +7D20 +1120 +7DA0 +1140 +FD00 +ENDCHAR +STARTCHAR U_911F +ENCODING 37151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF20 +9520 +FD40 +9580 +FD40 +1520 +FF20 +49A0 +2940 +1900 +ENDCHAR +STARTCHAR U_9120 +ENCODING 37152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +1120 +FF40 +B540 +7D80 +0140 +FF20 +1120 +3DE0 +0540 +1900 +ENDCHAR +STARTCHAR U_9121 +ENCODING 37153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D40 +4540 +7F80 +4140 +7F20 +1120 +FFA0 +5540 +9300 +ENDCHAR +STARTCHAR U_9122 +ENCODING 37154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +10A0 +5EA0 +50A0 +FFC0 +40A0 +7EA0 +40A0 +7EE0 +5280 +AE80 +ENDCHAR +STARTCHAR U_9123 +ENCODING 37155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +2940 +FF40 +4580 +7D40 +4520 +7D20 +11A0 +FF40 +1100 +ENDCHAR +STARTCHAR U_9124 +ENCODING 37156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D40 +4540 +FF80 +AB40 +AB20 +FF20 +25A0 +1940 +E700 +ENDCHAR +STARTCHAR U_9125 +ENCODING 37157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7D20 +4520 +7D40 +4580 +7F40 +4120 +7DA0 +0540 +A500 +0D00 +ENDCHAR +STARTCHAR U_9126 +ENCODING 37158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7F20 +D540 +5540 +FF80 +5540 +5520 +FF20 +01A0 +AB40 +A900 +ENDCHAR +STARTCHAR U_9127 +ENCODING 37159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +5320 +2D20 +4540 +BB80 +0140 +7D20 +4520 +7DA0 +2940 +FF00 +ENDCHAR +STARTCHAR U_9128 +ENCODING 37160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +FFE0 +B540 +EC80 +BF60 +2100 +7F80 +4480 +7FA0 +4020 +3FE0 +ENDCHAR +STARTCHAR U_9129 +ENCODING 37161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +0520 +7D20 +0540 +FD80 +5540 +FD20 +0520 +FFA0 +4540 +2D00 +ENDCHAR +STARTCHAR U_912A +ENCODING 37162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28E0 +FEA0 +AAA0 +FFA0 +49C0 +FFA0 +42A0 +7EA0 +42E0 +7E80 +C380 +ENDCHAR +STARTCHAR U_912B +ENCODING 37163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +28A0 +FEA0 +AAA0 +FEC0 +00A0 +7CA0 +44A0 +7CE0 +4480 +7C80 +ENDCHAR +STARTCHAR U_912C +ENCODING 37164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1DE0 +E520 +A920 +F940 +8980 +FD40 +8520 +FF20 +83A0 +AB40 +0D00 +ENDCHAR +STARTCHAR U_912D +ENCODING 37165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +FFA0 +28A0 +7EA0 +5AC0 +66A0 +5AA0 +42A0 +FFE0 +2480 +C380 +ENDCHAR +STARTCHAR U_912E +ENCODING 37166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +DEA0 +AAA0 +D2A0 +04C0 +7CA0 +44A0 +7CA0 +44E0 +7C80 +C680 +ENDCHAR +STARTCHAR U_912F +ENCODING 37167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +1140 +7D40 +1180 +FF40 +2920 +FF20 +45A0 +4540 +7D00 +ENDCHAR +STARTCHAR U_9130 +ENCODING 37168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +5520 +FF20 +5540 +9380 +4540 +7F20 +5520 +BFA0 +4540 +8500 +ENDCHAR +STARTCHAR U_9131 +ENCODING 37169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0DE0 +F320 +5540 +FF40 +5580 +9340 +7D20 +5520 +7DA0 +5540 +7D00 +ENDCHAR +STARTCHAR U_9132 +ENCODING 37170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EEE0 +AAA0 +FEA0 +54A0 +7CC0 +54A0 +7CA0 +10A0 +FEE0 +1080 +1080 +ENDCHAR +STARTCHAR U_9133 +ENCODING 37171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +AAA0 +EEA0 +28A0 +EEC0 +AAA0 +EEA0 +AAA0 +EEE0 +2880 +1F80 +ENDCHAR +STARTCHAR U_9134 +ENCODING 37172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +6D20 +FF20 +4940 +FF80 +1140 +FD20 +1120 +FFA0 +5540 +9300 +ENDCHAR +STARTCHAR U_9135 +ENCODING 37173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4520 +7D40 +0140 +EF80 +AB40 +EF20 +1120 +FFA0 +5540 +9300 +ENDCHAR +STARTCHAR U_9136 +ENCODING 37174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +2920 +7D40 +8340 +FF80 +AB40 +FF20 +4520 +7DA0 +4540 +7D00 +ENDCHAR +STARTCHAR U_9137 +ENCODING 37175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +AB20 +FF40 +A980 +FF40 +4520 +7D20 +49A0 +2D40 +F100 +ENDCHAR +STARTCHAR U_9138 +ENCODING 37176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2920 +FF40 +AB80 +FF40 +A320 +3D20 +69A0 +1140 +E100 +ENDCHAR +STARTCHAR U_9139 +ENCODING 37177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +5720 +7B20 +5540 +FB80 +1140 +FF20 +5520 +B9A0 +5540 +9300 +ENDCHAR +STARTCHAR U_913A +ENCODING 37178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +08E0 +7FA0 +54A0 +7FA0 +54C0 +7FA0 +4AA0 +7EA0 +4AE0 +7E80 +A280 +ENDCHAR +STARTCHAR U_913B +ENCODING 37179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +44A0 +EFA0 +44A0 +AAC0 +FFA0 +4AA0 +7EA0 +5AE0 +FF80 +0880 +ENDCHAR +STARTCHAR U_913C +ENCODING 37180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FD20 +2920 +FF40 +5580 +FF40 +5520 +55A0 +7D40 +4500 +8300 +ENDCHAR +STARTCHAR U_913D +ENCODING 37181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7FE0 +6AA0 +7EA0 +48C0 +7FA0 +52A0 +6AE0 +5D80 +8880 +3E80 +ENDCHAR +STARTCHAR U_913E +ENCODING 37182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +44A0 +7CA0 +44A0 +FFC0 +A5A0 +52A0 +FEA0 +68E0 +1080 +EE80 +ENDCHAR +STARTCHAR U_913F +ENCODING 37183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29E0 +FF20 +2940 +EF40 +AB80 +FF40 +5520 +7D20 +55A0 +FF40 +1100 +ENDCHAR +STARTCHAR U_9140 +ENCODING 37184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +FFA0 +24A0 +3CA0 +45C0 +DEA0 +54A0 +DCA0 +47E0 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9141 +ENCODING 37185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CE0 +88A0 +7EA0 +42A0 +7EC0 +49A0 +7FA0 +D2A0 +7EE0 +2A80 +CF80 +ENDCHAR +STARTCHAR U_9142 +ENCODING 37186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A800 +FFE0 +2920 +FF40 +5580 +AB40 +7D20 +45A0 +5560 +2900 +C500 +ENDCHAR +STARTCHAR U_9143 +ENCODING 37187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +10A0 +FEA0 +92A0 +54C0 +92A0 +00A0 +FEA0 +AAE0 +AA80 +FE80 +ENDCHAR +STARTCHAR U_9144 +ENCODING 37188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +28A0 +EEA0 +AAA0 +EEC0 +48A0 +FFA0 +48A0 +7EE0 +4880 +7F80 +ENDCHAR +STARTCHAR U_9145 +ENCODING 37189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +92E0 +FEA0 +48A0 +FEA0 +48C0 +FEA0 +AAA0 +FEA0 +AAE0 +BA80 +8680 +ENDCHAR +STARTCHAR U_9146 +ENCODING 37190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAE0 +FEA0 +AAA0 +FEA0 +AAC0 +FFA0 +44A0 +7CA0 +44E0 +2880 +FE80 +ENDCHAR +STARTCHAR U_9147 +ENCODING 37191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A4E0 +FFA0 +24A0 +FFA0 +4AC0 +FFA0 +42A0 +7EA0 +42E0 +7E80 +8180 +ENDCHAR +STARTCHAR U_9148 +ENCODING 37192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +AAA0 +EEA0 +AAA0 +FEC0 +AAA0 +FEA0 +AAA0 +BCE0 +A880 +BE80 +ENDCHAR +STARTCHAR U_9149 +ENCODING 37193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +0A00 +7FC0 +4A40 +4A40 +71C0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_914A +ENCODING 37194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2840 +2840 +FE40 +AA40 +CE40 +8240 +FE40 +8240 +FE40 +82C0 +ENDCHAR +STARTCHAR U_914B +ENCODING 37195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +0A00 +FFE0 +0A00 +7FC0 +4A40 +73C0 +4040 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_914C +ENCODING 37196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +2900 +29E0 +FE20 +AA20 +CF20 +82A0 +FEA0 +8220 +FE20 +82C0 +ENDCHAR +STARTCHAR U_914D +ENCODING 37197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5020 +5020 +F820 +ABE0 +DA00 +8A00 +FA00 +8A20 +FA20 +8BE0 +ENDCHAR +STARTCHAR U_914E +ENCODING 37198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +5040 +53E0 +FC40 +B640 +DD40 +8540 +FC40 +8440 +FD40 +8480 +ENDCHAR +STARTCHAR U_914F +ENCODING 37199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5280 +52A0 +FAE0 +AFA0 +DAA0 +8AE0 +FA80 +8A20 +FA20 +89E0 +ENDCHAR +STARTCHAR U_9150 +ENCODING 37200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +5080 +F880 +A880 +DFE0 +8880 +F880 +8880 +F880 +8880 +ENDCHAR +STARTCHAR U_9151 +ENCODING 37201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +F880 +A880 +AFE0 +D880 +8880 +F880 +8880 +F880 +0180 +ENDCHAR +STARTCHAR U_9152 +ENCODING 37202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2280 +8280 +5FE0 +2AA0 +2CE0 +2820 +CFE0 +4820 +4FE0 +4820 +ENDCHAR +STARTCHAR U_9153 +ENCODING 37203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1900 +2480 +DF60 +0200 +FFE0 +0A00 +7FC0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_9154 +ENCODING 37204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FF80 +5280 +FAA0 +AAA0 +FD60 +8900 +FFE0 +8900 +F900 +8900 +ENDCHAR +STARTCHAR U_9155 +ENCODING 37205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8E0 +5700 +5100 +F900 +AFE0 +D900 +8900 +FFE0 +8900 +F920 +88E0 +ENDCHAR +STARTCHAR U_9156 +ENCODING 37206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +53E0 +FAA0 +AC80 +D880 +8980 +F980 +8AA0 +FAA0 +8C60 +ENDCHAR +STARTCHAR U_9157 +ENCODING 37207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +5140 +52A0 +FAA0 +AAA0 +DAA0 +8B60 +FB20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9158 +ENCODING 37208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +5240 +FA60 +AC00 +DFC0 +8A40 +F940 +8880 +F940 +8E20 +ENDCHAR +STARTCHAR U_9159 +ENCODING 37209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +2240 +F940 +A840 +AA40 +D940 +8840 +FFE0 +8840 +8840 +F840 +ENDCHAR +STARTCHAR U_915A +ENCODING 37210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5280 +5240 +FA40 +AC20 +DBC0 +8940 +F940 +8A40 +FD40 +8880 +ENDCHAR +STARTCHAR U_915B +ENCODING 37211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5000 +5000 +FFE0 +AA80 +FA80 +8A80 +FA80 +8AA0 +FCA0 +8860 +ENDCHAR +STARTCHAR U_915C +ENCODING 37212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +FFC0 +A900 +A900 +DFE0 +8900 +FA80 +8A80 +FC40 +8820 +ENDCHAR +STARTCHAR U_915D +ENCODING 37213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F800 +53E0 +5000 +F800 +AFE0 +D900 +8900 +F940 +8A20 +FFE0 +8820 +ENDCHAR +STARTCHAR U_915E +ENCODING 37214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5100 +5100 +FFE0 +A900 +D900 +8900 +FA80 +8A80 +8D40 +F820 +ENDCHAR +STARTCHAR U_915F +ENCODING 37215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +50E0 +F880 +A880 +DBE0 +8A20 +FA20 +8A20 +8BE0 +FA20 +ENDCHAR +STARTCHAR U_9160 +ENCODING 37216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5020 +5020 +FBA0 +AAA0 +DAA0 +8BA0 +F820 +8820 +8820 +F860 +ENDCHAR +STARTCHAR U_9161 +ENCODING 37217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +5220 +F900 +A920 +A940 +D980 +8900 +F920 +8920 +F8E0 +ENDCHAR +STARTCHAR U_9162 +ENCODING 37218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5100 +51E0 +FB00 +ADE0 +A900 +D900 +89E0 +F900 +8900 +F900 +ENDCHAR +STARTCHAR U_9163 +ENCODING 37219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +5240 +5240 +FFE0 +AA40 +DA40 +8BC0 +8A40 +FA40 +8A40 +FBC0 +ENDCHAR +STARTCHAR U_9164 +ENCODING 37220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5080 +53E0 +F880 +A880 +DBE0 +8A20 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9165 +ENCODING 37221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +5380 +5080 +F880 +AFE0 +D880 +89C0 +FAC0 +8CA0 +F8A0 +8880 +ENDCHAR +STARTCHAR U_9166 +ENCODING 37222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FAC0 +52A0 +FFE0 +A900 +A9E0 +DB20 +8D40 +F880 +8940 +FE20 +ENDCHAR +STARTCHAR U_9167 +ENCODING 37223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +5420 +F840 +AFE0 +F840 +8A40 +F940 +8840 +F840 +88C0 +ENDCHAR +STARTCHAR U_9168 +ENCODING 37224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +10A0 +FFE0 +2880 +FEA0 +AAA0 +EEA0 +8240 +FE40 +83A0 +FE20 +ENDCHAR +STARTCHAR U_9169 +ENCODING 37225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +51E0 +5220 +FD40 +A880 +D900 +8BE0 +FD20 +8920 +F9E0 +8920 +ENDCHAR +STARTCHAR U_916A +ENCODING 37226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +51E0 +5340 +FC80 +A940 +DA20 +8FE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_916B +ENCODING 37227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F900 +5280 +FC40 +AFE0 +A900 +D900 +8BC0 +F900 +8900 +FFE0 +ENDCHAR +STARTCHAR U_916C +ENCODING 37228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +52A0 +52A0 +FAA0 +ABE0 +DEA0 +8AA0 +FAA0 +8AA0 +FAA0 +8C20 +ENDCHAR +STARTCHAR U_916D +ENCODING 37229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5100 +FBE0 +AE20 +ABE0 +DA20 +8BE0 +FA20 +8A20 +FA60 +ENDCHAR +STARTCHAR U_916E +ENCODING 37230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +53E0 +FA20 +ABA0 +DAA0 +8AA0 +FBA0 +8A20 +FA20 +8A60 +ENDCHAR +STARTCHAR U_916F +ENCODING 37231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +5260 +5380 +FA20 +A9E0 +D800 +8BE0 +FA20 +8BE0 +FA20 +8BE0 +ENDCHAR +STARTCHAR U_9170 +ENCODING 37232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5280 +53E0 +FC80 +A880 +DFE0 +8940 +F940 +8940 +FA40 +8C60 +ENDCHAR +STARTCHAR U_9171 +ENCODING 37233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +37C0 +DC80 +1300 +FFE0 +0A00 +7FC0 +4A40 +7FC0 +4040 +7FC0 +ENDCHAR +STARTCHAR U_9172 +ENCODING 37234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +5220 +FBE0 +A800 +ABE0 +D880 +8BE0 +F880 +8880 +FFE0 +ENDCHAR +STARTCHAR U_9173 +ENCODING 37235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5140 +5280 +F920 +ABE0 +D800 +8BE0 +FA20 +8BE0 +FA20 +8A60 +ENDCHAR +STARTCHAR U_9174 +ENCODING 37236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +5240 +5420 +FBE0 +A880 +DFE0 +8880 +FAC0 +8CA0 +F880 +8980 +ENDCHAR +STARTCHAR U_9175 +ENCODING 37237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57A0 +5140 +FFE0 +A900 +DFE0 +8A40 +FC80 +8FE0 +F880 +8980 +ENDCHAR +STARTCHAR U_9176 +ENCODING 37238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +5400 +FFC0 +AD40 +DFE0 +8D40 +FD40 +8FE0 +F840 +8980 +ENDCHAR +STARTCHAR U_9177 +ENCODING 37239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +5280 +53E0 +FC80 +A880 +DBE0 +8800 +FBE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9178 +ENCODING 37240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +5240 +57A0 +FA40 +AC20 +D9C0 +8940 +FB40 +8C80 +F940 +8A20 +ENDCHAR +STARTCHAR U_9179 +ENCODING 37241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F840 +57A0 +5520 +FAC0 +A840 +DFE0 +8A40 +F940 +8840 +F940 +8880 +ENDCHAR +STARTCHAR U_917A +ENCODING 37242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +53E0 +5080 +FBE0 +AAA0 +DBE0 +8AA0 +FBE0 +8AA0 +FAA0 +8AE0 +ENDCHAR +STARTCHAR U_917B +ENCODING 37243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0060 +FBA0 +2520 +FAC0 +A800 +ABC0 +D880 +8FE0 +F880 +8880 +F980 +ENDCHAR +STARTCHAR U_917C +ENCODING 37244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2100 +FA40 +AFE0 +A820 +DD40 +8D40 +FD40 +8D40 +F960 +ENDCHAR +STARTCHAR U_917D +ENCODING 37245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5540 +5360 +F940 +ABE0 +DA00 +8A00 +FA00 +8A00 +FA00 +8C00 +ENDCHAR +STARTCHAR U_917E +ENCODING 37246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5000 +53E0 +FAA0 +AAA0 +DBA0 +8AE0 +FAA0 +8AA0 +FAA0 +8AE0 +ENDCHAR +STARTCHAR U_917F +ENCODING 37247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +53C0 +5240 +FBC0 +AA40 +DBC0 +8AA0 +FAC0 +8A40 +FAA0 +8B20 +ENDCHAR +STARTCHAR U_9180 +ENCODING 37248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5240 +57E0 +FA80 +ABE0 +DA80 +8A80 +FBE0 +8A80 +FBE0 +8A00 +ENDCHAR +STARTCHAR U_9181 +ENCODING 37249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5040 +53C0 +F840 +AFE0 +DCA0 +8AC0 +F980 +8AC0 +FCA0 +8980 +ENDCHAR +STARTCHAR U_9182 +ENCODING 37250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +5240 +57E0 +FA40 +AA40 +DB40 +8EE0 +FB60 +8A40 +FA40 +8A40 +ENDCHAR +STARTCHAR U_9183 +ENCODING 37251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5280 +FD40 +AFE0 +DD40 +8FC0 +FD40 +8FC0 +F920 +88E0 +ENDCHAR +STARTCHAR U_9184 +ENCODING 37252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +5420 +FBA0 +AD20 +DFE0 +8920 +FD60 +8FE0 +F820 +88C0 +ENDCHAR +STARTCHAR U_9185 +ENCODING 37253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +57E0 +5220 +F940 +AFE0 +D800 +8BE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9186 +ENCODING 37254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +5240 +57C0 +F940 +A9A0 +DE60 +8A80 +FFE0 +8940 +F9A0 +8E60 +ENDCHAR +STARTCHAR U_9187 +ENCODING 37255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FBC0 +A800 +DBE0 +8840 +FFE0 +8880 +F880 +8B80 +ENDCHAR +STARTCHAR U_9188 +ENCODING 37256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FD40 +2380 +FA80 +AC60 +A900 +DD40 +8B80 +F980 +8A60 +FC40 +ENDCHAR +STARTCHAR U_9189 +ENCODING 37257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FA40 +ADA0 +D880 +8880 +FFE0 +8880 +F880 +8880 +ENDCHAR +STARTCHAR U_918A +ENCODING 37258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +55A0 +5240 +FDA0 +A800 +DFE0 +8DA0 +FDA0 +8A40 +FA40 +8DA0 +ENDCHAR +STARTCHAR U_918B +ENCODING 37259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +5140 +57E0 +F940 +AFE0 +D800 +8BE0 +FA20 +8BE0 +FA20 +8BE0 +ENDCHAR +STARTCHAR U_918C +ENCODING 37260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +53E0 +FA20 +ABE0 +DA80 +8BA0 +FAC0 +8A80 +FBA0 +8AE0 +ENDCHAR +STARTCHAR U_918D +ENCODING 37261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5240 +53C0 +FA40 +ABC0 +D800 +8FE0 +F880 +8AE0 +FD80 +88E0 +ENDCHAR +STARTCHAR U_918E +ENCODING 37262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +00C0 +F8A0 +27E0 +F880 +AF80 +A8A0 +DFA0 +89C0 +FFC0 +88A0 +F920 +ENDCHAR +STARTCHAR U_918F +ENCODING 37263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +53E0 +5140 +FFE0 +A900 +DBE0 +8E20 +FBE0 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9190 +ENCODING 37264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAE0 +52A0 +57A0 +FAE0 +AAA0 +DFA0 +8CE0 +FCA0 +8FA0 +F920 +8A60 +ENDCHAR +STARTCHAR U_9191 +ENCODING 37265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5120 +55C0 +FD00 +ABE0 +DA40 +8BC0 +FA40 +8BC0 +FA40 +8AC0 +ENDCHAR +STARTCHAR U_9192 +ENCODING 37266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5220 +53E0 +FA20 +ABE0 +DA80 +8BE0 +FC80 +8BE0 +F880 +8FE0 +ENDCHAR +STARTCHAR U_9193 +ENCODING 37267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +57E0 +5520 +F980 +AAA0 +DCE0 +8800 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_9194 +ENCODING 37268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +1380 +7D00 +3A80 +5440 +FFE0 +0A00 +7FC0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_9195 +ENCODING 37269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FBE0 +2000 +F9C0 +A940 +A940 +DBE0 +8A20 +FBE0 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_9196 +ENCODING 37270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +2240 +FBC0 +AA40 +ABC0 +D800 +8FE0 +FAA0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_9197 +ENCODING 37271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7A0 +2540 +FA40 +AC20 +AFC0 +DA80 +8FC0 +FA80 +8AA0 +FC60 +ENDCHAR +STARTCHAR U_9198 +ENCODING 37272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2100 +FFE0 +AA40 +AFE0 +D800 +8FE0 +FAA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_9199 +ENCODING 37273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +56E0 +54A0 +FFE0 +ACA0 +DFE0 +8880 +FFE0 +8A40 +F980 +8E60 +ENDCHAR +STARTCHAR U_919A +ENCODING 37274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +55A0 +52C0 +FE80 +ABE0 +DA80 +8AC0 +FBA0 +8A80 +FA80 +8DE0 +ENDCHAR +STARTCHAR U_919B +ENCODING 37275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +57E0 +5240 +F980 +AA40 +DC20 +8BE0 +F880 +8BE0 +F880 +8FE0 +ENDCHAR +STARTCHAR U_919C +ENCODING 37276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5520 +FFE0 +AD20 +DFE0 +8940 +F9A0 +8AE0 +FAA0 +8CE0 +ENDCHAR +STARTCHAR U_919D +ENCODING 37277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +53E0 +5080 +FBE0 +A880 +DFE0 +8900 +FBE0 +8C80 +F880 +8FE0 +ENDCHAR +STARTCHAR U_919E +ENCODING 37278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +52A0 +52A0 +FB60 +ABE0 +A800 +DFE0 +8AA0 +FAA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_919F +ENCODING 37279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +2980 +4640 +FFE0 +8A20 +7FC0 +5240 +61C0 +4E40 +7FC0 +ENDCHAR +STARTCHAR U_91A0 +ENCODING 37280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +52A0 +FFE0 +A880 +D940 +8A20 +FFE0 +8AA0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_91A1 +ENCODING 37281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +55A0 +FA40 +ABE0 +DD00 +89E0 +F900 +89E0 +F900 +8900 +ENDCHAR +STARTCHAR U_91A2 +ENCODING 37282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5100 +FBC0 +AE40 +ABC0 +D800 +8FE0 +FAA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_91A3 +ENCODING 37283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5540 +FFE0 +AD40 +DFC0 +8D00 +FFC0 +8A40 +FBC0 +8A40 +ENDCHAR +STARTCHAR U_91A4 +ENCODING 37284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5540 +3FE0 +D240 +11C0 +7FE0 +0A00 +7FC0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_91A5 +ENCODING 37285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5280 +57E0 +FAA0 +AFE0 +A800 +DBC0 +8800 +FFE0 +8AC0 +FDA0 +ENDCHAR +STARTCHAR U_91A6 +ENCODING 37286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +27C0 +FA40 +ADA0 +AFE0 +DA40 +8D20 +FA80 +8940 +F880 +8B00 +ENDCHAR +STARTCHAR U_91A7 +ENCODING 37287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5200 +53C0 +FA40 +ABC0 +DA00 +8BE0 +FAA0 +8BE0 +FA00 +8BE0 +ENDCHAR +STARTCHAR U_91A8 +ENCODING 37288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +53E0 +5360 +FAA0 +AB60 +DBE0 +8880 +FBE0 +8AA0 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_91A9 +ENCODING 37289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FA80 +2FE0 +FAA0 +AFE0 +AAA0 +DFE0 +8A40 +FBC0 +8A40 +FBC0 +ENDCHAR +STARTCHAR U_91AA +ENCODING 37290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +55A0 +5360 +FCA0 +A980 +DA40 +8D20 +FA80 +8940 +F880 +8F00 +ENDCHAR +STARTCHAR U_91AB +ENCODING 37291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +9140 +FFE0 +9940 +A480 +FFE0 +4A40 +71C0 +4E40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_91AC +ENCODING 37292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +7540 +1D40 +F7E0 +5240 +FFE0 +4A40 +73C0 +5E40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_91AD +ENCODING 37293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEA0 +52C0 +57E0 +FA40 +AFE0 +D900 +8FE0 +F900 +8FE0 +FA40 +8C20 +ENDCHAR +STARTCHAR U_91AE +ENCODING 37294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +53E0 +5680 +FBE0 +AA80 +DBE0 +8A80 +FBE0 +8D40 +FAA0 +8AA0 +ENDCHAR +STARTCHAR U_91AF +ENCODING 37295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FFE0 +AB40 +DB40 +8D60 +F800 +8FE0 +FAA0 +8FE0 +ENDCHAR +STARTCHAR U_91B0 +ENCODING 37296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5280 +5FE0 +FAA0 +AFE0 +DA40 +8BC0 +FA40 +8FE0 +F880 +8880 +ENDCHAR +STARTCHAR U_91B1 +ENCODING 37297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +55A0 +52C0 +FC40 +AEE0 +D920 +8FE0 +FCA0 +8E40 +FAA0 +8D20 +ENDCHAR +STARTCHAR U_91B2 +ENCODING 37298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +52A0 +FFE0 +AAA0 +DFE0 +8800 +FFE0 +8AA0 +FA40 +8B20 +ENDCHAR +STARTCHAR U_91B3 +ENCODING 37299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +52A0 +56A0 +FFE0 +A880 +DFE0 +8A40 +FFE0 +8880 +FFE0 +8880 +ENDCHAR +STARTCHAR U_91B4 +ENCODING 37300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +52A0 +FFE0 +AAA0 +DFE0 +8A40 +FBC0 +8A40 +F980 +8FE0 +ENDCHAR +STARTCHAR U_91B5 +ENCODING 37301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +5100 +57E0 +FD20 +AFC0 +DD20 +8FE0 +FD00 +8EA0 +FDC0 +8AA0 +ENDCHAR +STARTCHAR U_91B6 +ENCODING 37302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +FA40 +2420 +FBC0 +A800 +AFE0 +DDA0 +8FE0 +FA40 +8A40 +FDA0 +ENDCHAR +STARTCHAR U_91B7 +ENCODING 37303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +5240 +FFE0 +AA40 +DBC0 +8A40 +FBC0 +8AA0 +FE40 +89C0 +ENDCHAR +STARTCHAR U_91B8 +ENCODING 37304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2440 +FAA0 +AFC0 +DA80 +8FE0 +FA80 +8EA0 +FB40 +8A20 +ENDCHAR +STARTCHAR U_91B9 +ENCODING 37305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +57E0 +FD20 +ABA0 +DD40 +8FE0 +F900 +8FE0 +FAA0 +8AA0 +ENDCHAR +STARTCHAR U_91BA +ENCODING 37306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5100 +57E0 +FAA0 +AFE0 +D880 +8BE0 +F880 +8FE0 +F940 +8AA0 +ENDCHAR +STARTCHAR U_91BB +ENCODING 37307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2100 +FFE0 +A940 +D900 +8FE0 +F840 +8FE0 +FA40 +88C0 +ENDCHAR +STARTCHAR U_91BC +ENCODING 37308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +5280 +FB80 +AA40 +DFE0 +8A40 +FFE0 +8800 +FAA0 +8AA0 +ENDCHAR +STARTCHAR U_91BD +ENCODING 37309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5100 +57E0 +FD20 +AB40 +DD20 +8FE0 +FAA0 +8AA0 +8AA0 +FFE0 +ENDCHAR +STARTCHAR U_91BE +ENCODING 37310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +57E0 +5540 +FFE0 +AD40 +DFE0 +8EA0 +FDC0 +8FE0 +F9C0 +8AA0 +ENDCHAR +STARTCHAR U_91BF +ENCODING 37311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +2A40 +FFE0 +AAC0 +DD20 +8BC0 +FA40 +8FE0 +F540 +1920 +ENDCHAR +STARTCHAR U_91C0 +ENCODING 37312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57E0 +55A0 +FFE0 +AA80 +DFE0 +8A80 +FFE0 +8AA0 +FE40 +8B20 +ENDCHAR +STARTCHAR U_91C1 +ENCODING 37313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5140 +7FC0 +5540 +FFE0 +AAA0 +3F80 +1080 +3F80 +C960 +3300 +ENDCHAR +STARTCHAR U_91C2 +ENCODING 37314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +52A0 +57E0 +FAA0 +AFE0 +D920 +8FE0 +F920 +8FA0 +FA20 +8D60 +ENDCHAR +STARTCHAR U_91C3 +ENCODING 37315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5000 +57E0 +FD20 +AFE0 +DAA0 +8FE0 +FAA0 +8BC0 +FAA0 +8BE0 +ENDCHAR +STARTCHAR U_91C4 +ENCODING 37316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +F7E0 +2540 +F7E0 +B540 +B760 +D400 +9760 +F540 +9760 +F940 +ENDCHAR +STARTCHAR U_91C5 +ENCODING 37317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +5AA0 +5FE0 +FA80 +AFE0 +D920 +8F20 +F9A0 +8F40 +F940 +89A0 +ENDCHAR +STARTCHAR U_91C6 +ENCODING 37318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0380 +7C40 +2480 +1500 +7FE0 +0400 +0E00 +1500 +2480 +C460 +0400 +ENDCHAR +STARTCHAR U_91C7 +ENCODING 37319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +7840 +2480 +1100 +0400 +FFE0 +0E00 +1500 +2480 +4460 +8420 +ENDCHAR +STARTCHAR U_91C8 +ENCODING 37320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +EBC0 +AA40 +7240 +FBC0 +2300 +7280 +AA80 +A440 +2460 +2840 +ENDCHAR +STARTCHAR U_91C9 +ENCODING 37321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E100 +A900 +77E0 +FD20 +6520 +77E0 +AD20 +A520 +27E0 +2420 +ENDCHAR +STARTCHAR U_91CA +ENCODING 37322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +E280 +A900 +7280 +FD60 +3100 +6FC0 +A100 +AFE0 +2100 +2100 +ENDCHAR +STARTCHAR U_91CB +ENCODING 37323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2AA0 +AFE0 +7100 +FFE0 +2280 +77E0 +6900 +A7E0 +A100 +2100 +ENDCHAR +STARTCHAR U_91CC +ENCODING 37324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +4440 +7FC0 +4440 +4440 +7FC0 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_91CD +ENCODING 37325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +2480 +3F80 +2480 +3F80 +0400 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_91CE +ENCODING 37326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A840 +F980 +A880 +AFE0 +F8A0 +2080 +F880 +2080 +3880 +C380 +ENDCHAR +STARTCHAR U_91CF +ENCODING 37327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_91D0 +ENCODING 37328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FC80 +A940 +FFE0 +5240 +5FC0 +5240 +5FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_91D1 +ENCODING 37329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +2080 +DF60 +0400 +7FC0 +0400 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_91D2 +ENCODING 37330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 11 0 -1 +BITMAP +10 +28 +44 +FE +10 +7C +10 +54 +38 +1C +E0 +ENDCHAR +STARTCHAR U_91D3 +ENCODING 37331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8900 +7900 +2100 +F900 +2100 +A900 +7120 +3920 +C0E0 +ENDCHAR +STARTCHAR U_91D4 +ENCODING 37332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5020 +8840 +F840 +2080 +F880 +2100 +A900 +7220 +3A20 +C1E0 +ENDCHAR +STARTCHAR U_91D5 +ENCODING 37333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5040 +8880 +7880 +2080 +F880 +2080 +A880 +7080 +3A80 +C100 +ENDCHAR +STARTCHAR U_91D6 +ENCODING 37334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BE0 +44A0 +BCA0 +10A0 +7CA0 +1120 +5520 +3A20 +1AA0 +6440 +ENDCHAR +STARTCHAR U_91D7 +ENCODING 37335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +2820 +4520 +BD20 +1120 +7D20 +1120 +5520 +3920 +1C20 +E060 +ENDCHAR +STARTCHAR U_91D8 +ENCODING 37336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8880 +7880 +2080 +F880 +2080 +A880 +7080 +3880 +C380 +ENDCHAR +STARTCHAR U_91D9 +ENCODING 37337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8900 +FD80 +2140 +F920 +2120 +A900 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_91DA +ENCODING 37338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8F80 +FA80 +2280 +FA80 +2280 +AA80 +72A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_91DB +ENCODING 37339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +4500 +BBE0 +1120 +7920 +1520 +5920 +3220 +1AA0 +6440 +ENDCHAR +STARTCHAR U_91DC +ENCODING 37340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3180 +5240 +0C00 +1300 +E0E0 +3F80 +0400 +7FC0 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_91DD +ENCODING 37341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8880 +7880 +27E0 +F880 +2080 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_91DE +ENCODING 37342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4900 +F100 +2100 +F900 +2280 +AA80 +7240 +3460 +C840 +ENDCHAR +STARTCHAR U_91DF +ENCODING 37343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3280 +4A80 +F680 +2280 +FE80 +2280 +AA80 +7440 +3440 +C820 +ENDCHAR +STARTCHAR U_91E0 +ENCODING 37344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1380 +2A80 +4680 +FA80 +1280 +7A80 +1680 +5AA0 +34A0 +C860 +ENDCHAR +STARTCHAR U_91E1 +ENCODING 37345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +64C0 +0A40 +1100 +2080 +DF60 +0400 +1F00 +2480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_91E2 +ENCODING 37346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5240 +8A40 +7A80 +22E0 +FA20 +2220 +AA20 +7220 +3CA0 +E840 +ENDCHAR +STARTCHAR U_91E3 +ENCODING 37347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +89E0 +7A20 +2420 +F920 +20A0 +A8A0 +7020 +3820 +C0C0 +ENDCHAR +STARTCHAR U_91E4 +ENCODING 37348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5080 +8900 +7A20 +2040 +F880 +2300 +A820 +7040 +3880 +C300 +ENDCHAR +STARTCHAR U_91E5 +ENCODING 37349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +F880 +22C0 +FAA0 +24A0 +A8A0 +7080 +3A80 +C100 +ENDCHAR +STARTCHAR U_91E6 +ENCODING 37350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4A20 +FA20 +2220 +FA20 +2220 +AA20 +7220 +3BE0 +C220 +ENDCHAR +STARTCHAR U_91E7 +ENCODING 37351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +52A0 +8AA0 +7AA0 +22A0 +FAA0 +22A0 +AAA0 +72A0 +3C20 +E020 +ENDCHAR +STARTCHAR U_91E8 +ENCODING 37352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3040 +4880 +F880 +2080 +FFE0 +2080 +A880 +7080 +3880 +C380 +ENDCHAR +STARTCHAR U_91E9 +ENCODING 37353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +3480 +4C80 +FC80 +2680 +FD80 +2480 +AC80 +74A0 +38A0 +D060 +ENDCHAR +STARTCHAR U_91EA +ENCODING 37354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3080 +4880 +F880 +27E0 +F880 +2080 +A880 +7080 +3A80 +C100 +ENDCHAR +STARTCHAR U_91EB +ENCODING 37355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3000 +4800 +FFE0 +2200 +FA00 +23E0 +A820 +7020 +3820 +C0C0 +ENDCHAR +STARTCHAR U_91EC +ENCODING 37356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4880 +F880 +2080 +FFE0 +2080 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_91ED +ENCODING 37357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4880 +F880 +2080 +FC80 +2080 +A880 +7080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_91EE +ENCODING 37358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3040 +4840 +FFE0 +2040 +FCC0 +2140 +AA40 +7440 +3940 +C080 +ENDCHAR +STARTCHAR U_91EF +ENCODING 37359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3080 +4FE0 +F200 +2200 +FA00 +2200 +AA00 +7200 +3A00 +C3E0 +ENDCHAR +STARTCHAR U_91F0 +ENCODING 37360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +48A0 +F0A0 +22A0 +FAA0 +2120 +A920 +7220 +3AA0 +C440 +ENDCHAR +STARTCHAR U_91F1 +ENCODING 37361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +FBE0 +2080 +F880 +2080 +A880 +7140 +3A20 +E420 +ENDCHAR +STARTCHAR U_91F2 +ENCODING 37362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4A40 +FA40 +2240 +FBC0 +2200 +AA00 +7220 +3A20 +C1E0 +ENDCHAR +STARTCHAR U_91F3 +ENCODING 37363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31E0 +4A00 +FC00 +23C0 +F880 +2100 +A900 +7220 +3A20 +C1E0 +ENDCHAR +STARTCHAR U_91F4 +ENCODING 37364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5140 +8920 +7BE0 +2100 +FD00 +2100 +A8A0 +70A0 +3860 +C020 +ENDCHAR +STARTCHAR U_91F5 +ENCODING 37365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8A20 +7B20 +22A0 +F940 +2140 +A880 +7140 +3A40 +C420 +ENDCHAR +STARTCHAR U_91F6 +ENCODING 37366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4D00 +FFC0 +2540 +FD40 +2540 +ADC0 +7500 +3C20 +C3E0 +ENDCHAR +STARTCHAR U_91F7 +ENCODING 37367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8880 +7880 +23E0 +FC80 +2080 +A880 +7080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_91F8 +ENCODING 37368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +49E0 +F920 +2220 +FD40 +2140 +A880 +7100 +3A00 +C400 +ENDCHAR +STARTCHAR U_91F9 +ENCODING 37369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8900 +7BE0 +2140 +FA40 +2240 +A940 +7080 +3940 +C620 +ENDCHAR +STARTCHAR U_91FA +ENCODING 37370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3300 +4900 +F100 +27E0 +F900 +2100 +A900 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_91FB +ENCODING 37371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4A00 +F780 +2280 +FA80 +2680 +AA80 +73A0 +3CA0 +C060 +ENDCHAR +STARTCHAR U_91FC +ENCODING 37372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4A40 +F240 +2640 +FA40 +2340 +AAC0 +7460 +3D40 +C080 +ENDCHAR +STARTCHAR U_91FD +ENCODING 37373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +5740 +8D40 +7D40 +2540 +FD40 +2540 +AD40 +7520 +3920 +C920 +ENDCHAR +STARTCHAR U_91FE +ENCODING 37374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4A80 +F480 +27E0 +F980 +2280 +AA80 +7480 +3A80 +C100 +ENDCHAR +STARTCHAR U_91FF +ENCODING 37375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5380 +8A00 +7A00 +23E0 +FA40 +2240 +AA40 +7240 +3440 +C840 +ENDCHAR +STARTCHAR U_9200 +ENCODING 37376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4D40 +F540 +2540 +FFC0 +2400 +AC00 +7420 +3C20 +C3E0 +ENDCHAR +STARTCHAR U_9201 +ENCODING 37377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A00 +2200 +FBE0 +2220 +AA20 +7220 +3C20 +C8C0 +ENDCHAR +STARTCHAR U_9202 +ENCODING 37378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8FE0 +7D20 +2100 +F980 +2180 +AA80 +72A0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_9203 +ENCODING 37379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3240 +4A40 +FA40 +27E0 +FA40 +2240 +AA40 +7240 +3C40 +C840 +ENDCHAR +STARTCHAR U_9204 +ENCODING 37380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +3240 +4940 +F840 +2240 +F940 +20E0 +AF40 +7040 +3840 +C040 +ENDCHAR +STARTCHAR U_9205 +ENCODING 37381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2220 +FA20 +23E0 +AA20 +7220 +3420 +C860 +ENDCHAR +STARTCHAR U_9206 +ENCODING 37382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5280 +8A40 +7A40 +2420 +F900 +2100 +AA00 +7240 +3C40 +C7E0 +ENDCHAR +STARTCHAR U_9207 +ENCODING 37383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +F880 +2080 +FFE0 +2080 +A940 +7140 +3A40 +C420 +ENDCHAR +STARTCHAR U_9208 +ENCODING 37384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4900 +F100 +2380 +FB40 +2520 +A920 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_9209 +ENCODING 37385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +57E0 +F520 +2520 +FD20 +25A0 +AE60 +7420 +3C20 +C460 +ENDCHAR +STARTCHAR U_920A +ENCODING 37386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8880 +7200 +2240 +F220 +2A20 +BA00 +6A40 +3240 +C1C0 +ENDCHAR +STARTCHAR U_920B +ENCODING 37387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3280 +4A80 +F2A0 +26A0 +FAC0 +2280 +AB80 +72A0 +3AA0 +C260 +ENDCHAR +STARTCHAR U_920C +ENCODING 37388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FC0 +F940 +2140 +FFE0 +2100 +A900 +7280 +3440 +C820 +ENDCHAR +STARTCHAR U_920D +ENCODING 37389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4880 +FAA0 +22A0 +FAA0 +23E0 +A880 +70A0 +38A0 +C060 +ENDCHAR +STARTCHAR U_920E +ENCODING 37390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +49E0 +F620 +2120 +F920 +22A0 +ABA0 +7020 +38A0 +C040 +ENDCHAR +STARTCHAR U_920F +ENCODING 37391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23A0 +30A0 +48A0 +FBA0 +2220 +FBA0 +20A0 +A8A0 +70A0 +3AA0 +C120 +ENDCHAR +STARTCHAR U_9210 +ENCODING 37392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4940 +FA20 +2480 +F840 +23E0 +A840 +7040 +3880 +C080 +ENDCHAR +STARTCHAR U_9211 +ENCODING 37393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4A00 +FA00 +23E0 +FA20 +2220 +AB40 +7280 +3540 +CA20 +ENDCHAR +STARTCHAR U_9212 +ENCODING 37394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3240 +4A40 +FA80 +22E0 +FA20 +2220 +AB40 +7280 +3540 +CA20 +ENDCHAR +STARTCHAR U_9213 +ENCODING 37395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3700 +4900 +F100 +2100 +FFE0 +2100 +A900 +7100 +3900 +C7C0 +ENDCHAR +STARTCHAR U_9214 +ENCODING 37396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +FAC0 +22A0 +FC80 +20A0 +A840 +7080 +3900 +C600 +ENDCHAR +STARTCHAR U_9215 +ENCODING 37397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3140 +4940 +F940 +2140 +FFC0 +2240 +AA40 +7240 +3A40 +C7E0 +ENDCHAR +STARTCHAR U_9216 +ENCODING 37398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3280 +4A40 +FA40 +2420 +FBC0 +2140 +A940 +7140 +3A40 +C4C0 +ENDCHAR +STARTCHAR U_9217 +ENCODING 37399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A40 +FFE0 +2000 +FA80 +2280 +AA80 +72A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_9218 +ENCODING 37400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FE0 +F100 +2100 +FFC0 +2440 +AA80 +7100 +3AE0 +C440 +ENDCHAR +STARTCHAR U_9219 +ENCODING 37401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +49E0 +F900 +27C0 +FA40 +2240 +AA80 +7100 +3A80 +C460 +ENDCHAR +STARTCHAR U_921A +ENCODING 37402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2480 +5480 +F4A0 +27C0 +FC80 +2480 +AC80 +75A0 +36A0 +C460 +ENDCHAR +STARTCHAR U_921B +ENCODING 37403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3280 +4A40 +F7E0 +2200 +FA40 +2140 +A980 +71A0 +3A60 +C420 +ENDCHAR +STARTCHAR U_921C +ENCODING 37404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +FFE0 +2200 +FA80 +2280 +AD00 +7540 +3A20 +C7E0 +ENDCHAR +STARTCHAR U_921D +ENCODING 37405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3500 +4D00 +F7C0 +2100 +F900 +27E0 +A900 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_921E +ENCODING 37406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4BE0 +FC20 +2220 +F920 +20A0 +A920 +7620 +3820 +C0C0 +ENDCHAR +STARTCHAR U_921F +ENCODING 37407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37C0 +4940 +F140 +27C0 +FD00 +27E0 +A920 +71A0 +3940 +C100 +ENDCHAR +STARTCHAR U_9220 +ENCODING 37408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3240 +4A40 +F240 +2420 +FBC0 +2240 +A980 +7180 +3A40 +C420 +ENDCHAR +STARTCHAR U_9221 +ENCODING 37409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +F7E0 +24A0 +FCA0 +27E0 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_9222 +ENCODING 37410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +F7E0 +2100 +FB80 +2340 +AD20 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_9223 +ENCODING 37411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3080 +4880 +FAE0 +2280 +FA80 +23E0 +A820 +7020 +3820 +C0C0 +ENDCHAR +STARTCHAR U_9224 +ENCODING 37412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +4A20 +FA20 +2220 +FBE0 +2220 +AA20 +7220 +3BE0 +C220 +ENDCHAR +STARTCHAR U_9225 +ENCODING 37413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4AA0 +FAA0 +22C0 +F880 +2080 +A940 +7140 +3A20 +C420 +ENDCHAR +STARTCHAR U_9226 +ENCODING 37414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +FFE0 +2100 +F900 +2280 +AA80 +7540 +3540 +C820 +ENDCHAR +STARTCHAR U_9227 +ENCODING 37415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F800 +2380 +FA80 +2280 +AA80 +72A0 +34A0 +C8E0 +ENDCHAR +STARTCHAR U_9228 +ENCODING 37416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4800 +F000 +27C0 +FA80 +2280 +AA80 +7280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_9229 +ENCODING 37417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3080 +4BE0 +F220 +23E0 +FA00 +2200 +AA00 +7200 +3C00 +C000 +ENDCHAR +STARTCHAR U_922A +ENCODING 37418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4C00 +F5C0 +2540 +FD40 +25C0 +AD00 +7520 +3D20 +C0E0 +ENDCHAR +STARTCHAR U_922B +ENCODING 37419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F440 +2440 +FA80 +2280 +A900 +7100 +3A80 +C460 +ENDCHAR +STARTCHAR U_922C +ENCODING 37420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4A40 +F240 +23C0 +FA00 +2300 +B280 +6280 +3440 +C820 +ENDCHAR +STARTCHAR U_922D +ENCODING 37421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1160 +5D80 +5120 +59E0 +E600 +1980 +6F60 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_922E +ENCODING 37422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3220 +4A20 +FBE0 +2200 +FA80 +22A0 +AAC0 +72A0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_922F +ENCODING 37423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4AA0 +F2A0 +22A0 +FBE0 +2080 +ACA0 +74A0 +3CA0 +C7E0 +ENDCHAR +STARTCHAR U_9230 +ENCODING 37424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FE0 +F900 +27E0 +FD20 +2520 +AD20 +7520 +3D60 +C100 +ENDCHAR +STARTCHAR U_9231 +ENCODING 37425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3420 +4FE0 +FC80 +2480 +FFE0 +2480 +AC80 +74A0 +3E60 +C420 +ENDCHAR +STARTCHAR U_9232 +ENCODING 37426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +3740 +4D40 +FD40 +2540 +FD40 +2540 +AD40 +7540 +35A0 +C960 +ENDCHAR +STARTCHAR U_9233 +ENCODING 37427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3040 +4840 +FF40 +2540 +FD40 +2740 +A840 +7040 +3940 +C080 +ENDCHAR +STARTCHAR U_9234 +ENCODING 37428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4940 +FB20 +24A0 +F800 +23E0 +A840 +7180 +3880 +C040 +ENDCHAR +STARTCHAR U_9235 +ENCODING 37429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4900 +F7E0 +2520 +FD20 +26A0 +AE60 +7420 +3CA0 +C440 +ENDCHAR +STARTCHAR U_9236 +ENCODING 37430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +5240 +FA20 +27E0 +F800 +23E0 +AA20 +7220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9237 +ENCODING 37431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4880 +FBE0 +2080 +F880 +23E0 +AA20 +7220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9238 +ENCODING 37432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3240 +4FE0 +FA00 +2200 +FBC0 +2240 +AB40 +7480 +3540 +CA20 +ENDCHAR +STARTCHAR U_9239 +ENCODING 37433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4FE0 +FCA0 +2480 +FFE0 +2520 +AD40 +7480 +3940 +CA20 +ENDCHAR +STARTCHAR U_923A +ENCODING 37434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4900 +F900 +2100 +FFC0 +2100 +A940 +7120 +3900 +CFE0 +ENDCHAR +STARTCHAR U_923B +ENCODING 37435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33C0 +4A40 +F240 +23C0 +FA00 +23E0 +AA20 +7220 +3BE0 +C220 +ENDCHAR +STARTCHAR U_923C +ENCODING 37436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4FE0 +F200 +23C0 +FA00 +2200 +ABE0 +7200 +3A00 +C200 +ENDCHAR +STARTCHAR U_923D +ENCODING 37437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4900 +FA80 +27E0 +FAA0 +22A0 +AAA0 +72A0 +3AE0 +C080 +ENDCHAR +STARTCHAR U_923E +ENCODING 37438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4BE0 +FAA0 +22A0 +FAA0 +23E0 +AAA0 +72A0 +3BE0 +C220 +ENDCHAR +STARTCHAR U_923F +ENCODING 37439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +8AA0 +7AA0 +22A0 +FBE0 +22A0 +AAA0 +72A0 +3BE0 +C220 +ENDCHAR +STARTCHAR U_9240 +ENCODING 37440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +52A0 +8AA0 +7BE0 +22A0 +FAA0 +23E0 +AAA0 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_9241 +ENCODING 37441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F4C0 +2120 +FE80 +2100 +AE40 +7080 +3900 +C600 +ENDCHAR +STARTCHAR U_9242 +ENCODING 37442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FC0 +F540 +2540 +FFC0 +2500 +AB00 +7100 +3A80 +CC60 +ENDCHAR +STARTCHAR U_9243 +ENCODING 37443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4BC0 +F500 +2100 +FFE0 +2100 +AA80 +7280 +3C40 +C820 +ENDCHAR +STARTCHAR U_9244 +ENCODING 37444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3280 +4A80 +F7E0 +2080 +FFE0 +2080 +A940 +7140 +3A20 +C420 +ENDCHAR +STARTCHAR U_9245 +ENCODING 37445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5200 +8A00 +7BE0 +2220 +FA20 +23E0 +AA20 +7200 +3A00 +E3E0 +ENDCHAR +STARTCHAR U_9246 +ENCODING 37446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +88E0 +7880 +2080 +FBE0 +2220 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9247 +ENCODING 37447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +37E0 +4C00 +F100 +25C0 +FF40 +2540 +AD40 +7580 +3C20 +C3E0 +ENDCHAR +STARTCHAR U_9248 +ENCODING 37448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7C20 +2200 +FA40 +2280 +AB00 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_9249 +ENCODING 37449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7900 +2240 +FB80 +2080 +A900 +7240 +3FA0 +E220 +ENDCHAR +STARTCHAR U_924A +ENCODING 37450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5120 +8920 +7920 +22E0 +FC40 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_924B +ENCODING 37451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C20 +7BA0 +22A0 +FAA0 +23A0 +AA40 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_924C +ENCODING 37452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +8880 +7BE0 +2080 +F980 +22C0 +ACA0 +70A0 +3880 +E080 +ENDCHAR +STARTCHAR U_924D +ENCODING 37453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +50A0 +8A20 +7A40 +2640 +FAC0 +22A0 +AB20 +7240 +3A40 +E5C0 +ENDCHAR +STARTCHAR U_924E +ENCODING 37454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5280 +8A80 +7BE0 +2480 +F880 +23E0 +A880 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_924F +ENCODING 37455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8A40 +7A40 +23C0 +FA40 +2240 +ABC0 +7240 +3A40 +E7E0 +ENDCHAR +STARTCHAR U_9250 +ENCODING 37456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8880 +7900 +2100 +FBE0 +2520 +A920 +7120 +39E0 +E120 +ENDCHAR +STARTCHAR U_9251 +ENCODING 37457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5100 +8BE0 +7A20 +2220 +FBE0 +2220 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9252 +ENCODING 37458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8BE0 +7880 +2080 +F880 +23E0 +A880 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_9253 +ENCODING 37459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +7C80 +23E0 +FAA0 +22A0 +AAA0 +72E0 +3880 +E080 +ENDCHAR +STARTCHAR U_9254 +ENCODING 37460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5400 +8C80 +77E0 +26A0 +FEA0 +26A0 +AEE0 +7480 +3C80 +E7E0 +ENDCHAR +STARTCHAR U_9255 +ENCODING 37461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4C00 +F5C0 +2540 +FD40 +2540 +ADC0 +7400 +3C00 +C7E0 +ENDCHAR +STARTCHAR U_9256 +ENCODING 37462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +8B40 +7C80 +2140 +FA20 +2520 +A880 +7040 +3B00 +E0C0 +ENDCHAR +STARTCHAR U_9257 +ENCODING 37463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5240 +8A40 +7FE0 +2240 +FA40 +23C0 +AA40 +7240 +3BC0 +E240 +ENDCHAR +STARTCHAR U_9258 +ENCODING 37464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3280 +4FE0 +F2A0 +27E0 +FE80 +27E0 +AAA0 +72A0 +3AE0 +C480 +ENDCHAR +STARTCHAR U_9259 +ENCODING 37465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +33E0 +4A20 +F220 +2220 +FBE0 +2000 +A940 +7120 +3A20 +C420 +ENDCHAR +STARTCHAR U_925A +ENCODING 37466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5AE0 +8AA0 +7AA0 +2AA0 +FAA0 +2EA0 +B2A0 +62E0 +3480 +C880 +ENDCHAR +STARTCHAR U_925B +ENCODING 37467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8A40 +7A40 +2460 +F800 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_925C +ENCODING 37468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3240 +4A40 +F7E0 +2440 +FE40 +2540 +AD40 +7440 +3D40 +C480 +ENDCHAR +STARTCHAR U_925D +ENCODING 37469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3100 +4880 +F7E0 +2000 +FA20 +2120 +A940 +7140 +3800 +C7E0 +ENDCHAR +STARTCHAR U_925E +ENCODING 37470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +7C80 +24A0 +FCA0 +24A0 +ACC0 +76A0 +3D60 +E220 +ENDCHAR +STARTCHAR U_925F +ENCODING 37471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4880 +F500 +2100 +FB80 +2540 +A920 +7100 +3900 +C7E0 +ENDCHAR +STARTCHAR U_9260 +ENCODING 37472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8BE0 +7AA0 +22A0 +FAA0 +27E0 +A880 +7140 +3A20 +E420 +ENDCHAR +STARTCHAR U_9261 +ENCODING 37473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +89C0 +7880 +23E0 +F880 +23E0 +A880 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_9262 +ENCODING 37474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +F7C0 +2100 +FB80 +2540 +A940 +73A0 +3900 +C100 +ENDCHAR +STARTCHAR U_9263 +ENCODING 37475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8FE0 +7880 +2080 +FFE0 +2100 +A900 +7240 +3FA0 +E420 +ENDCHAR +STARTCHAR U_9264 +ENCODING 37476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +8BE0 +7C20 +23A0 +FAA0 +22A0 +ABA0 +7020 +3920 +E0C0 +ENDCHAR +STARTCHAR U_9265 +ENCODING 37477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3120 +4FE0 +F900 +2380 +FB80 +2540 +AD40 +7520 +3900 +E100 +ENDCHAR +STARTCHAR U_9266 +ENCODING 37478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +57E0 +8880 +7880 +2280 +FAE0 +2280 +AA80 +7280 +3A80 +E7E0 +ENDCHAR +STARTCHAR U_9267 +ENCODING 37479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8D40 +7D40 +27E0 +FC40 +2540 +AD40 +77E0 +3840 +E180 +ENDCHAR +STARTCHAR U_9268 +ENCODING 37480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3200 +4BE0 +F440 +2100 +F540 +2540 +A920 +7120 +3900 +C300 +ENDCHAR +STARTCHAR U_9269 +ENCODING 37481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F460 +2100 +F540 +2540 +A920 +7120 +3900 +C300 +ENDCHAR +STARTCHAR U_926A +ENCODING 37482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3540 +4D40 +F540 +2FE0 +F540 +2540 +ADC0 +7400 +3C00 +C7E0 +ENDCHAR +STARTCHAR U_926B +ENCODING 37483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3400 +4CE0 +FFA0 +25A0 +F5A0 +25A0 +ADA0 +75A0 +39E0 +CB00 +ENDCHAR +STARTCHAR U_926C +ENCODING 37484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2220 +FA20 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_926D +ENCODING 37485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +8A20 +7A20 +23E0 +FA20 +2220 +ABE0 +7220 +3800 +E7E0 +ENDCHAR +STARTCHAR U_926E +ENCODING 37486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3080 +4FE0 +F4A0 +27E0 +FCA0 +27E0 +A880 +7080 +3880 +C080 +ENDCHAR +STARTCHAR U_926F +ENCODING 37487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5440 +8D40 +7CC0 +2440 +FC40 +2540 +AE40 +74C0 +3920 +E220 +ENDCHAR +STARTCHAR U_9270 +ENCODING 37488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5020 +8BA0 +7820 +23A0 +FAA0 +22A0 +ABA0 +7020 +3820 +E0E0 +ENDCHAR +STARTCHAR U_9271 +ENCODING 37489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3080 +4FE0 +F400 +2480 +FC80 +2480 +AD00 +7540 +3BE0 +C820 +ENDCHAR +STARTCHAR U_9272 +ENCODING 37490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +89E0 +7900 +27E0 +F900 +2100 +A980 +7140 +3920 +E100 +ENDCHAR +STARTCHAR U_9273 +ENCODING 37491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3280 +4A80 +F6E0 +2280 +FA80 +2280 +AA80 +7680 +3AA0 +C260 +ENDCHAR +STARTCHAR U_9274 +ENCODING 37492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +93E0 +9500 +9480 +0A00 +3180 +DF60 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9275 +ENCODING 37493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4900 +F7C0 +2540 +FD40 +27C0 +A900 +7140 +39E0 +C620 +ENDCHAR +STARTCHAR U_9276 +ENCODING 37494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F20 +5A20 +8AA0 +FAA0 +4FA0 +FAA0 +4AA0 +5AA0 +EA20 +4A20 +F260 +ENDCHAR +STARTCHAR U_9277 +ENCODING 37495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3240 +4A40 +F7E0 +2240 +FA40 +27E0 +A800 +7240 +3A20 +C420 +ENDCHAR +STARTCHAR U_9278 +ENCODING 37496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A40 +2420 +FA40 +2140 +A880 +7180 +3A40 +E420 +ENDCHAR +STARTCHAR U_9279 +ENCODING 37497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +8A20 +7940 +2080 +FB80 +20E0 +AB20 +70A0 +3C40 +E380 +ENDCHAR +STARTCHAR U_927A +ENCODING 37498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8A40 +7BC0 +2240 +FBC0 +2240 +AA60 +77C0 +3840 +E040 +ENDCHAR +STARTCHAR U_927B +ENCODING 37499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53C0 +8C40 +7A80 +2180 +FA40 +27E0 +AA40 +7240 +3BC0 +E240 +ENDCHAR +STARTCHAR U_927C +ENCODING 37500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +5140 +8FE0 +7940 +2140 +F940 +27E0 +A940 +7140 +3A40 +E440 +ENDCHAR +STARTCHAR U_927D +ENCODING 37501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +7880 +2780 +FA80 +2280 +AAA0 +73A0 +3C60 +E020 +ENDCHAR +STARTCHAR U_927E +ENCODING 37502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5240 +8FA0 +7820 +2280 +FBE0 +2480 +AFE0 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_927F +ENCODING 37503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5140 +8A20 +7C00 +23E0 +F800 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9280 +ENCODING 37504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FD00 +2520 +AD40 +7480 +3D40 +E620 +ENDCHAR +STARTCHAR U_9281 +ENCODING 37505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +33E0 +4C20 +F3A0 +22A0 +FBA0 +22A0 +ABA0 +7020 +3CA0 +C040 +ENDCHAR +STARTCHAR U_9282 +ENCODING 37506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +52A0 +8AA0 +7AA0 +27E0 +FAA0 +22A0 +AAA0 +72A0 +3CA0 +E0A0 +ENDCHAR +STARTCHAR U_9283 +ENCODING 37507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7A40 +27A0 +F800 +2280 +AA80 +72A0 +3AA0 +E460 +ENDCHAR +STARTCHAR U_9284 +ENCODING 37508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3200 +4FE0 +F420 +25E0 +FD60 +2560 +ADE0 +7420 +3C20 +C460 +ENDCHAR +STARTCHAR U_9285 +ENCODING 37509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +8FA0 +7C20 +27A0 +FEA0 +26A0 +AFA0 +7420 +3C20 +E460 +ENDCHAR +STARTCHAR U_9286 +ENCODING 37510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8900 +7BE0 +2220 +FA20 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9287 +ENCODING 37511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8880 +7BE0 +2080 +FFE0 +2080 +A9C0 +72A0 +3CA0 +E080 +ENDCHAR +STARTCHAR U_9288 +ENCODING 37512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8FC0 +7900 +27E0 +F900 +2100 +AFC0 +7100 +3900 +E7E0 +ENDCHAR +STARTCHAR U_9289 +ENCODING 37513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33C0 +4940 +F7E0 +2140 +FBC0 +2100 +ABC0 +7100 +3BE0 +C100 +ENDCHAR +STARTCHAR U_928A +ENCODING 37514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +7C80 +24A0 +FEA0 +24C0 +AC80 +74A0 +3D60 +E220 +ENDCHAR +STARTCHAR U_928B +ENCODING 37515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5220 +8DC0 +7C80 +2480 +FFE0 +2480 +AC80 +7480 +3C80 +E7E0 +ENDCHAR +STARTCHAR U_928C +ENCODING 37516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7AE0 +2220 +FA40 +23E0 +AA40 +7240 +3A40 +E2C0 +ENDCHAR +STARTCHAR U_928D +ENCODING 37517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5100 +8900 +7A40 +27A0 +F920 +2100 +AFC0 +7100 +3900 +E7E0 +ENDCHAR +STARTCHAR U_928E +ENCODING 37518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +2480 +3EA0 +E5A0 +06E0 +3180 +DF60 +0400 +7FC0 +2480 +FFE0 +ENDCHAR +STARTCHAR U_928F +ENCODING 37519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2EE0 +5AA0 +FAA0 +2AA0 +FFE0 +2AA0 +BAA0 +6AA0 +3AA0 +D760 +ENDCHAR +STARTCHAR U_9290 +ENCODING 37520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE40 +2140 +7940 +A940 +3440 +CAC0 +3F80 +C460 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9291 +ENCODING 37521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5500 +8FC0 +7900 +2100 +FFE0 +2280 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_9292 +ENCODING 37522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +36E0 +4C40 +F440 +2EE0 +FC40 +2440 +A440 +7440 +3C40 +C840 +ENDCHAR +STARTCHAR U_9293 +ENCODING 37523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3280 +4C40 +F820 +27C0 +F900 +2100 +B7C0 +6100 +3900 +C7E0 +ENDCHAR +STARTCHAR U_9294 +ENCODING 37524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +89C0 +7AA0 +24A0 +F800 +2080 +B7E0 +6080 +3880 +C080 +ENDCHAR +STARTCHAR U_9295 +ENCODING 37525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2120 +FFE0 +2500 +AFE0 +7160 +3A80 +EC60 +ENDCHAR +STARTCHAR U_9296 +ENCODING 37526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8BE0 +7C80 +2080 +FFE0 +2180 +AAC0 +74A0 +38A0 +E080 +ENDCHAR +STARTCHAR U_9297 +ENCODING 37527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +8A00 +7BE0 +2200 +FA00 +23E0 +AB20 +7520 +3DE0 +E120 +ENDCHAR +STARTCHAR U_9298 +ENCODING 37528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +8A20 +7D40 +2080 +F900 +23E0 +AE20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9299 +ENCODING 37529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +7DA0 +2000 +FBE0 +2100 +ABE0 +7020 +3920 +E0C0 +ENDCHAR +STARTCHAR U_929A +ENCODING 37530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +52A0 +8EA0 +7AC0 +2280 +FAC0 +26A0 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_929B +ENCODING 37531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5380 +8880 +7BE0 +2080 +F880 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_929C +ENCODING 37532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +4A00 +9F00 +24E0 +5F40 +4440 +D540 +4E40 +4440 +4740 +58C0 +ENDCHAR +STARTCHAR U_929D +ENCODING 37533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8C80 +7FE0 +2480 +FC80 +25C0 +AEA0 +74A0 +3C80 +E480 +ENDCHAR +STARTCHAR U_929E +ENCODING 37534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +6140 +BF40 +2140 +3F40 +0AC0 +1F00 +E4E0 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_929F +ENCODING 37535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +32A0 +4AA0 +F3E0 +2080 +FBE0 +22A0 +AAA0 +72A0 +3AE0 +C080 +ENDCHAR +STARTCHAR U_92A0 +ENCODING 37536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57A0 +8940 +7980 +27E0 +FA00 +2240 +AF80 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_92A1 +ENCODING 37537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8FE0 +7880 +23E0 +F800 +23E0 +AA20 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92A2 +ENCODING 37538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5000 +8FE0 +7800 +20A0 +FFC0 +2280 +AAC0 +74A0 +3AA0 +E100 +ENDCHAR +STARTCHAR U_92A3 +ENCODING 37539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +64E0 +9FA0 +EAA0 +4AA0 +FAA0 +4AA0 +E4A0 +46A0 +75E0 +88A0 +ENDCHAR +STARTCHAR U_92A4 +ENCODING 37540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +89C0 +7880 +27E0 +F880 +21C0 +AAA0 +74A0 +3880 +E080 +ENDCHAR +STARTCHAR U_92A5 +ENCODING 37541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7880 +21A0 +FAC0 +2680 +AA40 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_92A6 +ENCODING 37542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +8CA0 +7FE0 +24A0 +FCA0 +24A0 +AD60 +7620 +3FE0 +E420 +ENDCHAR +STARTCHAR U_92A7 +ENCODING 37543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5520 +8B40 +7900 +27E0 +FA80 +2280 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_92A8 +ENCODING 37544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7D20 +2100 +FFE0 +2240 +AA40 +7180 +3940 +E620 +ENDCHAR +STARTCHAR U_92A9 +ENCODING 37545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +5780 +8880 +7BE0 +2080 +FFE0 +2080 +A900 +7240 +3CE0 +E720 +ENDCHAR +STARTCHAR U_92AA +ENCODING 37546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +8FE0 +7A00 +23E0 +FE20 +23E0 +AA20 +73E0 +3A20 +E260 +ENDCHAR +STARTCHAR U_92AB +ENCODING 37547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53C0 +8A80 +7FE0 +22A0 +FAA0 +23E0 +AA00 +7220 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_92AC +ENCODING 37548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53A0 +8940 +7FE0 +2100 +FBE0 +2500 +A9E0 +7020 +3920 +E0C0 +ENDCHAR +STARTCHAR U_92AD +ENCODING 37549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3240 +4BE0 +F600 +23E0 +F600 +23E0 +AE80 +7120 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92AE +ENCODING 37550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +2940 +4620 +0900 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92AF +ENCODING 37551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A40 +F7C0 +2100 +FA40 +27E0 +A920 +7540 +3520 +CB20 +ENDCHAR +STARTCHAR U_92B0 +ENCODING 37552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +3240 +4FE0 +F240 +2000 +FA40 +2240 +A940 +7080 +3940 +C620 +ENDCHAR +STARTCHAR U_92B1 +ENCODING 37553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4C40 +F7C0 +2100 +FFE0 +2520 +AD20 +7520 +3D60 +C100 +ENDCHAR +STARTCHAR U_92B2 +ENCODING 37554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8BE0 +7A20 +23E0 +F800 +23E0 +A880 +77E0 +3880 +E080 +ENDCHAR +STARTCHAR U_92B3 +ENCODING 37555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5440 +8FE0 +7C40 +2440 +FFC0 +2280 +AA80 +72A0 +3AA0 +E460 +ENDCHAR +STARTCHAR U_92B4 +ENCODING 37556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +23E0 +F280 +2480 +6A80 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92B5 +ENCODING 37557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53E0 +8A20 +7BE0 +2220 +FBE0 +2220 +AFE0 +7120 +3A20 +E4E0 +ENDCHAR +STARTCHAR U_92B6 +ENCODING 37558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5120 +8FE0 +7900 +2520 +FB40 +2180 +AB40 +7540 +3920 +E320 +ENDCHAR +STARTCHAR U_92B7 +ENCODING 37559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +89C0 +7880 +23E0 +FA20 +23E0 +AA20 +73E0 +3A20 +E260 +ENDCHAR +STARTCHAR U_92B8 +ENCODING 37560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4A00 +FA80 +2E80 +FA80 +2E80 +BB80 +6EA0 +32A0 +C2E0 +ENDCHAR +STARTCHAR U_92B9 +ENCODING 37561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5100 +8FE0 +7980 +2340 +FD20 +27C0 +AA40 +72E0 +3A20 +E4C0 +ENDCHAR +STARTCHAR U_92BA +ENCODING 37562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2900 +7FE0 +0900 +7BC0 +2C00 +DF00 +24E0 +DF80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_92BB +ENCODING 37563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +7920 +27E0 +FD00 +27E0 +A920 +7360 +3D00 +E100 +ENDCHAR +STARTCHAR U_92BC +ENCODING 37564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5540 +8D40 +7D40 +23A0 +F920 +2100 +AFC0 +7100 +3900 +EFE0 +ENDCHAR +STARTCHAR U_92BD +ENCODING 37565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3780 +4C80 +F7E0 +2480 +FE60 +2020 +AFC0 +7440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_92BE +ENCODING 37566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4FE0 +F000 +2100 +F740 +2380 +AB40 +7520 +3900 +C300 +ENDCHAR +STARTCHAR U_92BF +ENCODING 37567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3280 +4900 +F7E0 +2520 +FFE0 +2520 +AFE0 +7520 +3D20 +C440 +ENDCHAR +STARTCHAR U_92C0 +ENCODING 37568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5000 +8BC0 +7A40 +2240 +FBC0 +2000 +AA20 +7140 +3880 +E7E0 +ENDCHAR +STARTCHAR U_92C1 +ENCODING 37569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2000 +F800 +27E0 +AC20 +7420 +3FE0 +E420 +ENDCHAR +STARTCHAR U_92C2 +ENCODING 37570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C00 +7BE0 +22A0 +FFE0 +22A0 +AAA0 +77E0 +3820 +E0C0 +ENDCHAR +STARTCHAR U_92C3 +ENCODING 37571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +8A20 +7BE0 +2220 +FBE0 +2280 +AAA0 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_92C4 +ENCODING 37572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8AA0 +7CC0 +2180 +FA40 +2420 +ABE0 +7240 +3980 +E660 +ENDCHAR +STARTCHAR U_92C5 +ENCODING 37573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A20 +2140 +FFE0 +2080 +ABE0 +7080 +3880 +E080 +ENDCHAR +STARTCHAR U_92C6 +ENCODING 37574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2520 +20A0 +F720 +0A40 +7FE0 +0400 +3FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92C7 +ENCODING 37575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8A20 +7BE0 +2220 +FBE0 +2220 +ABE0 +7080 +3940 +E620 +ENDCHAR +STARTCHAR U_92C8 +ENCODING 37576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A200 +5FE0 +C500 +58E0 +4A00 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92C9 +ENCODING 37577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2520 +FFE0 +2520 +A900 +7380 +3D40 +E520 +ENDCHAR +STARTCHAR U_92CA +ENCODING 37578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5240 +8C20 +7980 +2240 +FC20 +23C0 +AA40 +7240 +3BC0 +E240 +ENDCHAR +STARTCHAR U_92CB +ENCODING 37579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +52C0 +8A40 +7440 +2F60 +F340 +2540 +AD40 +75E0 +2A00 +F1E0 +ENDCHAR +STARTCHAR U_92CC +ENCODING 37580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +53C0 +8A40 +FA40 +27E0 +FA40 +2240 +AFE0 +7200 +2500 +F8E0 +ENDCHAR +STARTCHAR U_92CD +ENCODING 37581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2820 +FBC0 +2040 +AFE0 +7080 +3A80 +E100 +ENDCHAR +STARTCHAR U_92CE +ENCODING 37582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7BC0 +2000 +FFE0 +2280 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_92CF +ENCODING 37583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8940 +7D40 +2540 +FBA0 +2100 +A900 +7180 +3A40 +E420 +ENDCHAR +STARTCHAR U_92D0 +ENCODING 37584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7900 +27E0 +F900 +2140 +AA40 +7280 +3D20 +E3E0 +ENDCHAR +STARTCHAR U_92D1 +ENCODING 37585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5240 +8FE0 +7940 +2220 +F900 +23C0 +AD40 +7080 +3940 +E620 +ENDCHAR +STARTCHAR U_92D2 +ENCODING 37586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5340 +8C80 +7B60 +2080 +FFE0 +2080 +ABE0 +7080 +3FE0 +E080 +ENDCHAR +STARTCHAR U_92D3 +ENCODING 37587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2120 +5620 +8AA0 +7AA0 +27A0 +FAA0 +27A0 +AAA0 +7220 +3A20 +E260 +ENDCHAR +STARTCHAR U_92D4 +ENCODING 37588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +33C0 +4C80 +F7E0 +2520 +FFE0 +2280 +AA80 +72A0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_92D5 +ENCODING 37589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +8FE0 +7880 +2080 +FBE0 +2080 +A940 +7320 +3D40 +E1C0 +ENDCHAR +STARTCHAR U_92D6 +ENCODING 37590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +4AC0 +F100 +2100 +FFE0 +2240 +AC40 +7280 +3900 +C6E0 +ENDCHAR +STARTCHAR U_92D7 +ENCODING 37591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7800 +27E0 +FC20 +27E0 +AC20 +77E0 +3C20 +E460 +ENDCHAR +STARTCHAR U_92D8 +ENCODING 37592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8A40 +7BC0 +2000 +FBC0 +2100 +AFE0 +7100 +3A80 +E460 +ENDCHAR +STARTCHAR U_92D9 +ENCODING 37593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8BC0 +7940 +2140 +FFE0 +2000 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92DA +ENCODING 37594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +5640 +D980 +5660 +5900 +EEE0 +0400 +3F80 +1500 +FFC0 +ENDCHAR +STARTCHAR U_92DB +ENCODING 37595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4D40 +F7C0 +2100 +FFE0 +2520 +AD20 +77E0 +3900 +C100 +ENDCHAR +STARTCHAR U_92DC +ENCODING 37596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4C40 +F7C0 +2100 +F900 +25C0 +AD00 +7500 +3B00 +C8E0 +ENDCHAR +STARTCHAR U_92DD +ENCODING 37597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +57A0 +8D20 +7AC0 +2040 +FFE0 +2440 +AA40 +7240 +3940 +E080 +ENDCHAR +STARTCHAR U_92DE +ENCODING 37598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +52A0 +8AA0 +7D40 +22A0 +FAA0 +2000 +ABE0 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_92DF +ENCODING 37599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5040 +8BC0 +7840 +27E0 +FC20 +23C0 +AA40 +7180 +3A40 +E420 +ENDCHAR +STARTCHAR U_92E0 +ENCODING 37600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5400 +8DC0 +7C00 +27E0 +FD00 +25A0 +AD40 +7540 +3DA0 +E520 +ENDCHAR +STARTCHAR U_92E1 +ENCODING 37601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +8D40 +78A0 +27C0 +F840 +2080 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92E2 +ENCODING 37602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3720 +4D40 +F280 +27C0 +F880 +2100 +AFE0 +7100 +3900 +C300 +ENDCHAR +STARTCHAR U_92E3 +ENCODING 37603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +52A0 +FAA0 +2FC0 +F2A0 +2AA0 +B6A0 +6AC0 +2A80 +D680 +ENDCHAR +STARTCHAR U_92E4 +ENCODING 37604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +5A80 +8A80 +7FE0 +2AA0 +FEA0 +2AA0 +ABA0 +7EA0 +3920 +E240 +ENDCHAR +STARTCHAR U_92E5 +ENCODING 37605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4C40 +F7C0 +2000 +F7C0 +2100 +B7C0 +6100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_92E6 +ENCODING 37606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C00 +27E0 +FC20 +27A0 +AEA0 +77A0 +3C20 +E0C0 +ENDCHAR +STARTCHAR U_92E7 +ENCODING 37607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FC40 +27C0 +AA80 +72A0 +3AA0 +E460 +ENDCHAR +STARTCHAR U_92E8 +ENCODING 37608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +56C0 +8AA0 +7FE0 +2280 +FAA0 +23A0 +AEC0 +72A0 +3B60 +E620 +ENDCHAR +STARTCHAR U_92E9 +ENCODING 37609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7900 +2080 +FFE0 +2200 +AA00 +7200 +3A00 +E3E0 +ENDCHAR +STARTCHAR U_92EA +ENCODING 37610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +5120 +8FE0 +7900 +27E0 +FD20 +27E0 +AD20 +77E0 +3D20 +E560 +ENDCHAR +STARTCHAR U_92EB +ENCODING 37611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +1140 +FD40 +3940 +D4C0 +3B00 +CEE0 +0400 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92EC +ENCODING 37612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +F400 +27C0 +F540 +2480 +6B60 +1E80 +E460 +3F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_92ED +ENCODING 37613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FC0 +F440 +2440 +FFC0 +2280 +B280 +62A0 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92EE +ENCODING 37614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +20A0 +5FE0 +F880 +2880 +FEA0 +2AA0 +BAC0 +6AA0 +3D60 +D220 +ENDCHAR +STARTCHAR U_92EF +ENCODING 37615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8BE0 +7C80 +2080 +FFE0 +2000 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_92F0 +ENCODING 37616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +52A0 +8AA0 +7BE0 +22A0 +FBE0 +2080 +ABE0 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_92F1 +ENCODING 37617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +5040 +8FE0 +7A40 +2140 +FA40 +22C0 +AA40 +7640 +3AA0 +E3A0 +ENDCHAR +STARTCHAR U_92F2 +ENCODING 37618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +3700 +4C00 +F400 +27C0 +FC80 +2480 +AFE0 +7280 +3440 +C820 +ENDCHAR +STARTCHAR U_92F3 +ENCODING 37619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +F7C0 +2200 +FFE0 +2280 +AFE0 +7480 +3A80 +C100 +ENDCHAR +STARTCHAR U_92F4 +ENCODING 37620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +F7C0 +2440 +FFC0 +2280 +AA80 +7280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92F5 +ENCODING 37621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3700 +4900 +F7E0 +2380 +F540 +2920 +B780 +64A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_92F6 +ENCODING 37622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F200 +2480 +FFC0 +2A80 +BA80 +6AA0 +32A0 +D060 +ENDCHAR +STARTCHAR U_92F7 +ENCODING 37623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +AA00 +1FE0 +FAA0 +4AA0 +FEA0 +4AA0 +5BA0 +EE40 +42A0 +F320 +ENDCHAR +STARTCHAR U_92F8 +ENCODING 37624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +8FE0 +7C80 +2480 +FFE0 +2480 +B7E0 +6A20 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_92F9 +ENCODING 37625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5200 +8BC0 +7A00 +23C0 +FA00 +27E0 +AAA0 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_92FA +ENCODING 37626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +8FE0 +7A20 +27C0 +FD40 +2740 +B9C0 +6280 +3AA0 +C460 +ENDCHAR +STARTCHAR U_92FB +ENCODING 37627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A240 +F940 +8880 +FD60 +AA00 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_92FC +ENCODING 37628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8920 +FFE0 +2920 +FD60 +2D60 +BFE0 +6820 +2820 +F860 +ENDCHAR +STARTCHAR U_92FD +ENCODING 37629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +31C0 +4900 +F7C0 +2440 +F7C0 +2440 +B7C0 +6100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_92FE +ENCODING 37630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C20 +7A20 +23E0 +FD20 +27E0 +AD60 +77E0 +3820 +E0C0 +ENDCHAR +STARTCHAR U_92FF +ENCODING 37631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +52C0 +8880 +7FE0 +2420 +FDE0 +2560 +ADE0 +7420 +3C20 +E460 +ENDCHAR +STARTCHAR U_9300 +ENCODING 37632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +5440 +FBA0 +2000 +FFE0 +2AA0 +BFE0 +6AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_9301 +ENCODING 37633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +8FE0 +7CA0 +27E0 +F880 +27E0 +A880 +71C0 +3AA0 +E4A0 +ENDCHAR +STARTCHAR U_9302 +ENCODING 37634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +77E0 +2240 +F520 +23C0 +AE40 +7180 +3180 +C660 +ENDCHAR +STARTCHAR U_9303 +ENCODING 37635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +17E0 +44A0 +17C0 +6540 +2C80 +1B40 +E4E0 +3F80 +1500 +7FE0 +ENDCHAR +STARTCHAR U_9304 +ENCODING 37636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7840 +27E0 +F880 +22A0 +A9C0 +72A0 +3CA0 +E180 +ENDCHAR +STARTCHAR U_9305 +ENCODING 37637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FEA0 +38A0 +5520 +9B60 +3E80 +C460 +3F80 +1500 +7FE0 +ENDCHAR +STARTCHAR U_9306 +ENCODING 37638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FC0 +2100 +FFE0 +2440 +AFC0 +7440 +3FC0 +E4C0 +ENDCHAR +STARTCHAR U_9307 +ENCODING 37639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F440 +2280 +FFE0 +2000 +AFC0 +7440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9308 +ENCODING 37640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +5340 +8FE0 +7900 +27E0 +FA40 +27E0 +AA40 +72C0 +3A20 +E1E0 +ENDCHAR +STARTCHAR U_9309 +ENCODING 37641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5480 +8FE0 +7C80 +2540 +FE20 +23E0 +AA20 +73E0 +3A20 +E3E0 +ENDCHAR +STARTCHAR U_930A +ENCODING 37642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3100 +4FE0 +F440 +2440 +FAA0 +2100 +AFE0 +7100 +3900 +C100 +ENDCHAR +STARTCHAR U_930B +ENCODING 37643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8AA0 +FEE0 +2AA0 +FAA0 +2EE0 +BAA0 +6AA0 +2AA0 +F560 +ENDCHAR +STARTCHAR U_930C +ENCODING 37644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +8BE0 +7800 +27E0 +FC00 +25C0 +AC80 +77E0 +3C80 +E480 +ENDCHAR +STARTCHAR U_930D +ENCODING 37645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8CA0 +7FE0 +24A0 +FFE0 +2280 +AC80 +77E0 +3880 +E080 +ENDCHAR +STARTCHAR U_930E +ENCODING 37646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8C40 +7880 +2360 +FC20 +2420 +AF60 +7420 +3FE0 +E420 +ENDCHAR +STARTCHAR U_930F +ENCODING 37647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5280 +8A80 +7EE0 +2420 +FC20 +2420 +AEE0 +7280 +3A80 +EFE0 +ENDCHAR +STARTCHAR U_9310 +ENCODING 37648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +8FE0 +7A80 +23E0 +FA80 +2280 +ABE0 +7280 +3A80 +E3E0 +ENDCHAR +STARTCHAR U_9311 +ENCODING 37649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4C20 +F7E0 +2540 +FD20 +27E0 +B500 +6900 +2A80 +D460 +ENDCHAR +STARTCHAR U_9312 +ENCODING 37650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5A20 +8A20 +7DE0 +2B60 +FB60 +2B60 +ADE0 +7820 +3820 +E860 +ENDCHAR +STARTCHAR U_9313 +ENCODING 37651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +7900 +27E0 +F900 +27E0 +AA80 +72A0 +3CA0 +E060 +ENDCHAR +STARTCHAR U_9314 +ENCODING 37652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57A0 +8AC0 +7AA0 +24A0 +FBE0 +2220 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9315 +ENCODING 37653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FC80 +24A0 +AFC0 +74A0 +3DA0 +E6E0 +ENDCHAR +STARTCHAR U_9316 +ENCODING 37654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2120 +FCC0 +6940 +AE20 +3100 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9317 +ENCODING 37655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4FE0 +F380 +2540 +F920 +27E0 +AA40 +7680 +3980 +C660 +ENDCHAR +STARTCHAR U_9318 +ENCODING 37656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5780 +8900 +7FE0 +2540 +FFE0 +2540 +AD40 +77E0 +3900 +E7C0 +ENDCHAR +STARTCHAR U_9319 +ENCODING 37657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +52A0 +8D40 +7AA0 +22A0 +FFE0 +24A0 +AFE0 +74A0 +3FE0 +E420 +ENDCHAR +STARTCHAR U_931A +ENCODING 37658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53C0 +8480 +77C0 +2140 +FFE0 +2140 +B7C0 +6100 +3900 +C300 +ENDCHAR +STARTCHAR U_931B +ENCODING 37659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +7D20 +27C0 +F900 +2240 +AFE0 +7240 +3A40 +E440 +ENDCHAR +STARTCHAR U_931C +ENCODING 37660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F560 +2080 +F7C0 +2080 +A940 +7220 +3640 +C9C0 +ENDCHAR +STARTCHAR U_931D +ENCODING 37661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7BC0 +2000 +FFE0 +2100 +AB40 +7520 +3920 +E300 +ENDCHAR +STARTCHAR U_931E +ENCODING 37662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +7BC0 +2000 +FFE0 +2040 +A880 +77E0 +3880 +E180 +ENDCHAR +STARTCHAR U_931F +ENCODING 37663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +52C0 +8C80 +7940 +22A0 +FC80 +22A0 +AAC0 +7480 +3940 +E620 +ENDCHAR +STARTCHAR U_9320 +ENCODING 37664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7800 +27E0 +F880 +2280 +AAE0 +7280 +3D80 +E0E0 +ENDCHAR +STARTCHAR U_9321 +ENCODING 37665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +7C40 +27E0 +F840 +2740 +AD40 +7740 +3840 +E1C0 +ENDCHAR +STARTCHAR U_9322 +ENCODING 37666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3240 +4FC0 +F940 +21A0 +FE60 +2A40 +B7E0 +6140 +39A0 +C660 +ENDCHAR +STARTCHAR U_9323 +ENCODING 37667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8AC0 +7A40 +25A0 +FFE0 +2120 +ADA0 +7240 +3DA0 +E120 +ENDCHAR +STARTCHAR U_9324 +ENCODING 37668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5240 +8FE0 +7A40 +23C0 +FA40 +23C0 +AA40 +77E0 +3A40 +E420 +ENDCHAR +STARTCHAR U_9325 +ENCODING 37669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8940 +7BE0 +2000 +FBC0 +2240 +B3C0 +6240 +3BC0 +C240 +ENDCHAR +STARTCHAR U_9326 +ENCODING 37670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +8A20 +7BE0 +2220 +FBE0 +2080 +AFE0 +74A0 +3CE0 +E080 +ENDCHAR +STARTCHAR U_9327 +ENCODING 37671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +7BC0 +2240 +FBC0 +2200 +ABE0 +7220 +3BE0 +E220 +ENDCHAR +STARTCHAR U_9328 +ENCODING 37672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5240 +8FE0 +7A40 +27E0 +FCA0 +24A0 +AFE0 +74A0 +3FE0 +E420 +ENDCHAR +STARTCHAR U_9329 +ENCODING 37673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7A40 +23C0 +F800 +27E0 +AC20 +77E0 +3C20 +E7E0 +ENDCHAR +STARTCHAR U_932A +ENCODING 37674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5280 +8FE0 +FAA0 +2FE0 +FAA0 +2AA0 +BFE0 +6280 +3440 +C820 +ENDCHAR +STARTCHAR U_932B +ENCODING 37675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7C40 +27C0 +FA00 +27E0 +AAA0 +74A0 +3920 +E240 +ENDCHAR +STARTCHAR U_932C +ENCODING 37676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +F7C0 +2540 +FFC0 +2540 +B7C0 +6380 +3540 +C920 +ENDCHAR +STARTCHAR U_932D +ENCODING 37677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8FA0 +7D20 +27E0 +FC20 +27A0 +AEA0 +77A0 +3C20 +E060 +ENDCHAR +STARTCHAR U_932E +ENCODING 37678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5820 +8920 +FFE0 +2920 +FBA0 +2AA0 +BBA0 +6820 +2FE0 +F820 +ENDCHAR +STARTCHAR U_932F +ENCODING 37679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7A40 +27E0 +F800 +23E0 +AA20 +73E0 +3A20 +E3E0 +ENDCHAR +STARTCHAR U_9330 +ENCODING 37680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4FE0 +F100 +2380 +FD40 +2920 +B100 +6540 +3AA0 +CAA0 +ENDCHAR +STARTCHAR U_9331 +ENCODING 37681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +EEE0 +1500 +7FC0 +0000 +FBC0 +2100 +7BC0 +2100 +FBE0 +ENDCHAR +STARTCHAR U_9332 +ENCODING 37682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4BC0 +F040 +2FE0 +F120 +2540 +B380 +6540 +3520 +CB00 +ENDCHAR +STARTCHAR U_9333 +ENCODING 37683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5040 +8880 +7FE0 +2080 +FB80 +2100 +AFE0 +7AA0 +3AA0 +EFE0 +ENDCHAR +STARTCHAR U_9334 +ENCODING 37684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +53E0 +8880 +7FE0 +2140 +FA20 +2480 +ABE0 +7080 +3880 +E7E0 +ENDCHAR +STARTCHAR U_9335 +ENCODING 37685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7800 +2280 +FAA0 +26C0 +AB80 +72A0 +3AA0 +E260 +ENDCHAR +STARTCHAR U_9336 +ENCODING 37686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FC0 +2100 +FFE0 +22A0 +AE40 +7240 +3AA0 +E320 +ENDCHAR +STARTCHAR U_9337 +ENCODING 37687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5F40 +A440 +FF40 +5540 +FF40 +5540 +7F40 +C440 +6F40 +8460 +ENDCHAR +STARTCHAR U_9338 +ENCODING 37688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +F540 +2540 +FBA0 +2100 +B380 +6540 +2920 +F100 +ENDCHAR +STARTCHAR U_9339 +ENCODING 37689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +5280 +8FE0 +7800 +23E0 +FA20 +23E0 +AA20 +73E0 +3A20 +E260 +ENDCHAR +STARTCHAR U_933A +ENCODING 37690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37E0 +4A80 +F100 +2FE0 +F200 +23C0 +AA40 +7240 +3540 +C880 +ENDCHAR +STARTCHAR U_933B +ENCODING 37691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +36C0 +48A0 +FFE0 +2280 +F380 +2A80 +BAA0 +6BA0 +2C60 +C020 +ENDCHAR +STARTCHAR U_933C +ENCODING 37692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +7C40 +23A0 +F800 +27E0 +A900 +7540 +3920 +E320 +ENDCHAR +STARTCHAR U_933D +ENCODING 37693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +37E0 +4940 +F580 +2240 +F420 +23C0 +B440 +6A80 +3100 +CEE0 +ENDCHAR +STARTCHAR U_933E +ENCODING 37694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A200 +FBE0 +2240 +F640 +1980 +EF60 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_933F +ENCODING 37695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3100 +4FE0 +FA40 +2F80 +FA40 +2BC0 +B800 +6BA0 +2AA0 +D460 +ENDCHAR +STARTCHAR U_9340 +ENCODING 37696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4FC0 +F440 +27C0 +F800 +27C0 +B080 +6FE0 +3280 +C180 +ENDCHAR +STARTCHAR U_9341 +ENCODING 37697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3C80 +48E0 +F920 +2F00 +FA80 +2A80 +BA80 +6A80 +2B40 +D220 +ENDCHAR +STARTCHAR U_9342 +ENCODING 37698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3100 +4A80 +F460 +27C0 +F900 +27C0 +B100 +6540 +3B80 +C7E0 +ENDCHAR +STARTCHAR U_9343 +ENCODING 37699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +33E0 +4AA0 +F560 +22A0 +F160 +2000 +B240 +65A0 +34A0 +C380 +ENDCHAR +STARTCHAR U_9344 +ENCODING 37700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2FE0 +5000 +F7C0 +2440 +F7C0 +2100 +B580 +6540 +2920 +C300 +ENDCHAR +STARTCHAR U_9345 +ENCODING 37701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +3280 +4880 +F5C0 +2480 +F3E0 +2480 +B500 +6D40 +37E0 +C520 +ENDCHAR +STARTCHAR U_9346 +ENCODING 37702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +6AA0 +9EE0 +FAA0 +2EE0 +F820 +2820 +B820 +6820 +2820 +F8E0 +ENDCHAR +STARTCHAR U_9347 +ENCODING 37703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +54A0 +8EC0 +7DA0 +26E0 +F900 +27C0 +AC40 +77C0 +3C40 +E7C0 +ENDCHAR +STARTCHAR U_9348 +ENCODING 37704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FE0 +4440 +F100 +27C0 +FD40 +2540 +BFE0 +6280 +3440 +C820 +ENDCHAR +STARTCHAR U_9349 +ENCODING 37705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5220 +8BE0 +7A20 +23E0 +F800 +27E0 +AA80 +72E0 +3D80 +E0E0 +ENDCHAR +STARTCHAR U_934A +ENCODING 37706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2AA0 +F920 +2FE0 +B100 +6380 +3D40 +C920 +ENDCHAR +STARTCHAR U_934B +ENCODING 37707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8B40 +7B40 +27E0 +FC20 +27A0 +B6A0 +67A0 +3C20 +C460 +ENDCHAR +STARTCHAR U_934C +ENCODING 37708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +B7C0 +4900 +EFE0 +4500 +58E0 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_934D +ENCODING 37709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8D40 +7FE0 +2540 +FDC0 +2400 +AFE0 +7540 +3C80 +E360 +ENDCHAR +STARTCHAR U_934E +ENCODING 37710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5480 +8FE0 +7C80 +25E0 +FD20 +25E0 +AD20 +75E0 +3D20 +E5E0 +ENDCHAR +STARTCHAR U_934F +ENCODING 37711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +8940 +7FE0 +2240 +FBC0 +2080 +AFE0 +7280 +3FE0 +E080 +ENDCHAR +STARTCHAR U_9350 +ENCODING 37712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +26A0 +5520 +8EA0 +7FE0 +2240 +FC20 +23C0 +AA40 +7580 +3A40 +E420 +ENDCHAR +STARTCHAR U_9351 +ENCODING 37713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8E40 +7BC0 +2240 +FBC0 +2200 +ABC0 +7640 +3980 +E660 +ENDCHAR +STARTCHAR U_9352 +ENCODING 37714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5140 +8FE0 +7AA0 +24C0 +FB80 +2100 +AFE0 +7380 +3D40 +E120 +ENDCHAR +STARTCHAR U_9353 +ENCODING 37715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3240 +4BC0 +F000 +27E0 +FA40 +23C0 +B240 +62E0 +3740 +C040 +ENDCHAR +STARTCHAR U_9354 +ENCODING 37716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +7800 +23C0 +F800 +27E0 +A900 +73E0 +3820 +E1C0 +ENDCHAR +STARTCHAR U_9355 +ENCODING 37717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8FE0 +7D40 +27C0 +FD40 +27C0 +A900 +77E0 +3900 +E100 +ENDCHAR +STARTCHAR U_9356 +ENCODING 37718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7BC0 +2240 +FBC0 +2240 +AFE0 +7540 +3E20 +E7E0 +ENDCHAR +STARTCHAR U_9357 +ENCODING 37719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +7FE0 +2520 +FFC0 +2540 +AD40 +7540 +3DC0 +E100 +ENDCHAR +STARTCHAR U_9358 +ENCODING 37720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +5A20 +8EA0 +FAA0 +2EA0 +FAA0 +2AA0 +AEA0 +7020 +2A20 +F160 +ENDCHAR +STARTCHAR U_9359 +ENCODING 37721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +AFE0 +4480 +DFE0 +4680 +4940 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_935A +ENCODING 37722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7A40 +27E0 +FA00 +27E0 +AAA0 +74A0 +3920 +E6C0 +ENDCHAR +STARTCHAR U_935B +ENCODING 37723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5540 +8F40 +7C20 +25E0 +FF40 +2540 +AF40 +7480 +3D40 +E620 +ENDCHAR +STARTCHAR U_935C +ENCODING 37724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8D20 +7FE0 +2400 +FFE0 +24A0 +AFA0 +7440 +3CA0 +E520 +ENDCHAR +STARTCHAR U_935D +ENCODING 37725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3540 +4FC0 +F540 +27C0 +F900 +27E0 +AD60 +77E0 +3C20 +C460 +ENDCHAR +STARTCHAR U_935E +ENCODING 37726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FC0 +7C40 +27C0 +FC40 +27C0 +AC40 +77C0 +3A80 +EC60 +ENDCHAR +STARTCHAR U_935F +ENCODING 37727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4FC0 +F440 +27C0 +F500 +27E0 +B900 +67C0 +3100 +CFE0 +ENDCHAR +STARTCHAR U_9360 +ENCODING 37728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +8A40 +7BC0 +2240 +FFE0 +2100 +A900 +73C0 +3900 +E7E0 +ENDCHAR +STARTCHAR U_9361 +ENCODING 37729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +52A0 +8BE0 +7AA0 +23E0 +F800 +27E0 +AAA0 +7240 +3B40 +E220 +ENDCHAR +STARTCHAR U_9362 +ENCODING 37730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3000 +4BC0 +F240 +23C0 +F800 +27E0 +B520 +67E0 +3520 +C7E0 +ENDCHAR +STARTCHAR U_9363 +ENCODING 37731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +7FE0 +2120 +FAA0 +2440 +AFE0 +7420 +3FE0 +E420 +ENDCHAR +STARTCHAR U_9364 +ENCODING 37732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +5700 +8900 +7FE0 +2100 +FF60 +2520 +AFE0 +7520 +3FE0 +E420 +ENDCHAR +STARTCHAR U_9365 +ENCODING 37733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +5FE0 +84A0 +FEA0 +24A0 +FF20 +2540 +AFE0 +7280 +2440 +F820 +ENDCHAR +STARTCHAR U_9366 +ENCODING 37734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2900 +55E0 +FE80 +28A0 +FEE0 +2BA0 +BAE0 +6A80 +2AA0 +D660 +ENDCHAR +STARTCHAR U_9367 +ENCODING 37735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +8D20 +7FE0 +2020 +FBA0 +2020 +ABA0 +72A0 +3BA0 +E0C0 +ENDCHAR +STARTCHAR U_9368 +ENCODING 37736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3680 +4AA0 +F440 +2820 +F7E0 +2100 +B7E0 +6100 +3A80 +C460 +ENDCHAR +STARTCHAR U_9369 +ENCODING 37737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +37E0 +4C40 +F100 +27E0 +F900 +23C0 +B640 +6A40 +33C0 +C240 +ENDCHAR +STARTCHAR U_936A +ENCODING 37738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +2FE0 +FA80 +5180 +9E40 +3100 +FFE0 +0400 +7F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_936B +ENCODING 37739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +6520 +2540 +FA80 +7440 +AB20 +3E80 +C460 +3F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_936C +ENCODING 37740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +5480 +85A0 +FEC0 +2480 +F680 +2D80 +A480 +7540 +2620 +F420 +ENDCHAR +STARTCHAR U_936D +ENCODING 37741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5440 +8FE0 +7D00 +25E0 +FE80 +27E0 +AC80 +7480 +3D40 +E620 +ENDCHAR +STARTCHAR U_936E +ENCODING 37742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3280 +4C40 +F7A0 +2000 +FEA0 +2AA0 +BEA0 +6AA0 +3E20 +CAE0 +ENDCHAR +STARTCHAR U_936F +ENCODING 37743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5AA0 +F7A0 +2520 +FAC0 +2140 +B2A0 +6620 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_9370 +ENCODING 37744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20E0 +2740 +5280 +FFE0 +2100 +F7E0 +2200 +B3C0 +6640 +3980 +C660 +ENDCHAR +STARTCHAR U_9371 +ENCODING 37745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +57E0 +8AA0 +FAE0 +2200 +FBE0 +2080 +AFE0 +7180 +22C0 +FCA0 +ENDCHAR +STARTCHAR U_9372 +ENCODING 37746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +7D00 +27E0 +FC80 +27E0 +AC60 +77C0 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9373 +ENCODING 37747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7D00 +5080 +7E80 +0900 +3F80 +C460 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_9374 +ENCODING 37748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2540 +5540 +FFC0 +2000 +FFE0 +2200 +BFE0 +6AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_9375 +ENCODING 37749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2C80 +25E0 +54A0 +FBE0 +2CA0 +F7E0 +2480 +B7E0 +6C80 +3480 +CBE0 +ENDCHAR +STARTCHAR U_9376 +ENCODING 37750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5D20 +8520 +FFE0 +2520 +FFE0 +2140 +AAA0 +7620 +2A40 +F1C0 +ENDCHAR +STARTCHAR U_9377 +ENCODING 37751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +FD20 +27C0 +F900 +27E0 +A900 +77C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_9378 +ENCODING 37752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +34E0 +4CA0 +FFA0 +24E0 +FCA0 +2EE0 +BAA0 +7EA0 +C120 +0260 +ENDCHAR +STARTCHAR U_9379 +ENCODING 37753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +F000 +27E0 +FA40 +23C0 +AA40 +73C0 +2000 +FFE0 +ENDCHAR +STARTCHAR U_937A +ENCODING 37754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53A0 +8940 +FFE0 +2100 +FBE0 +2220 +AFE0 +7220 +23E0 +FA20 +ENDCHAR +STARTCHAR U_937B +ENCODING 37755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +FC40 +23C0 +FA00 +27E0 +AD20 +76A0 +27A0 +F840 +ENDCHAR +STARTCHAR U_937C +ENCODING 37756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +F880 +2F80 +F8A0 +2EA0 +AAC0 +7EA0 +2960 +F220 +ENDCHAR +STARTCHAR U_937D +ENCODING 37757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4C40 +FFC0 +2400 +FFE0 +2EA0 +B7E0 +7AA0 +CAA0 +1260 +ENDCHAR +STARTCHAR U_937E +ENCODING 37758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5100 +8FE0 +FD40 +27C0 +FD40 +27C0 +A900 +77C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_937F +ENCODING 37759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +22A0 +57E0 +FAA0 +2140 +F7E0 +2520 +AFE0 +7520 +3FE0 +C420 +ENDCHAR +STARTCHAR U_9380 +ENCODING 37760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +54E0 +88A0 +FB40 +2AA0 +FB40 +2AA0 +AA40 +7AA0 +2A40 +F980 +ENDCHAR +STARTCHAR U_9381 +ENCODING 37761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +5AA0 +FEA0 +2AC0 +FEA0 +2AA0 +BEE0 +6A80 +F280 +0280 +ENDCHAR +STARTCHAR U_9382 +ENCODING 37762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +F900 +27C0 +F900 +27E0 +A900 +77E0 +2280 +FC60 +ENDCHAR +STARTCHAR U_9383 +ENCODING 37763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28C0 +5700 +8420 +75C0 +2D40 +F560 +2540 +B540 +6520 +39A0 +C920 +ENDCHAR +STARTCHAR U_9384 +ENCODING 37764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4800 +F7C0 +2440 +F7C0 +2280 +B2A0 +7640 +CB20 +0200 +ENDCHAR +STARTCHAR U_9385 +ENCODING 37765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2540 +57C0 +FD40 +27C0 +F280 +2C60 +B280 +7280 +C280 +0480 +ENDCHAR +STARTCHAR U_9386 +ENCODING 37766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FE0 +F020 +2EA0 +FAA0 +2EA0 +BAA0 +6EA0 +FA20 +0A60 +ENDCHAR +STARTCHAR U_9387 +ENCODING 37767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3520 +4FE0 +FC00 +27E0 +FE20 +2FE0 +B620 +7BE0 +CA20 +13E0 +ENDCHAR +STARTCHAR U_9388 +ENCODING 37768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +5140 +8BE0 +F880 +23E0 +FC80 +23E0 +AA00 +77E0 +2880 +F7E0 +ENDCHAR +STARTCHAR U_9389 +ENCODING 37769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +8FC0 +FC40 +27C0 +F800 +27E0 +ADA0 +7360 +25A0 +FA60 +ENDCHAR +STARTCHAR U_938A +ENCODING 37770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +77E0 +2920 +F7E0 +2100 +B1E0 +6220 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_938B +ENCODING 37771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D20 +FBC0 +2100 +FBC0 +2100 +AFE0 +73C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_938C +ENCODING 37772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +FAA0 +27E0 +FAA0 +27E0 +AA80 +76C0 +2AA0 +F2A0 +ENDCHAR +STARTCHAR U_938D +ENCODING 37773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8100 +FFE0 +2AA0 +F700 +2140 +AFE0 +7380 +2540 +FB20 +ENDCHAR +STARTCHAR U_938E +ENCODING 37774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +57E0 +8800 +FFC0 +2AC0 +F740 +2240 +AFC0 +7240 +2720 +FAA0 +ENDCHAR +STARTCHAR U_938F +ENCODING 37775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +6480 +CFC0 +4AA0 +56E0 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9390 +ENCODING 37776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3640 +4D40 +FA80 +23C0 +FD00 +27E0 +B100 +6540 +3D40 +C7C0 +ENDCHAR +STARTCHAR U_9391 +ENCODING 37777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +FFE0 +2480 +FFC0 +2040 +AFE0 +7AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_9392 +ENCODING 37778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5800 +8FE0 +FAA0 +2A40 +FB20 +2A40 +AFE0 +7A40 +2940 +F880 +ENDCHAR +STARTCHAR U_9393 +ENCODING 37779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +3540 +4AA0 +F7C0 +2000 +FEE0 +2AA0 +B660 +6AA0 +3AA0 +C440 +ENDCHAR +STARTCHAR U_9394 +ENCODING 37780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8C20 +FA40 +2520 +FA40 +27E0 +AA40 +7240 +23C0 +FA40 +ENDCHAR +STARTCHAR U_9395 +ENCODING 37781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8D40 +FFE0 +2540 +FFC0 +2500 +AFE0 +7620 +2BE0 +FA20 +ENDCHAR +STARTCHAR U_9396 +ENCODING 37782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +52C0 +8BE0 +FA20 +23E0 +FA20 +23E0 +AA20 +73E0 +2140 +FE20 +ENDCHAR +STARTCHAR U_9397 +ENCODING 37783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +5240 +8D20 +FFC0 +2440 +FFC0 +2440 +AFE0 +7620 +23E0 +FA20 +ENDCHAR +STARTCHAR U_9398 +ENCODING 37784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5240 +8BC0 +F000 +27E0 +FEA0 +2520 +AFE0 +7520 +2520 +FC60 +ENDCHAR +STARTCHAR U_9399 +ENCODING 37785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +52A0 +8FA0 +F2E0 +2BA0 +FBA0 +2FE0 +AAA0 +72A0 +24A0 +F960 +ENDCHAR +STARTCHAR U_939A +ENCODING 37786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +52E0 +8AA0 +F8E0 +2680 +FAE0 +22A0 +AAA0 +72E0 +2500 +F8E0 +ENDCHAR +STARTCHAR U_939B +ENCODING 37787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +57E0 +8AA0 +FBE0 +22A0 +FBE0 +22A0 +AFE0 +7240 +2140 +F880 +ENDCHAR +STARTCHAR U_939C +ENCODING 37788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +4C60 +FBC0 +6E80 +9140 +2E80 +C460 +1F00 +1500 +7FC0 +ENDCHAR +STARTCHAR U_939D +ENCODING 37789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +FB80 +2440 +FBA0 +2000 +AFC0 +7440 +27C0 +FC40 +ENDCHAR +STARTCHAR U_939E +ENCODING 37790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8EA0 +FD20 +26A0 +FFE0 +2480 +AFA0 +74C0 +27A0 +FCE0 +ENDCHAR +STARTCHAR U_939F +ENCODING 37791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5280 +8140 +FFE0 +25A0 +F240 +25A0 +AFE0 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_93A0 +ENCODING 37792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +5AA0 +8FE0 +F000 +2FE0 +F100 +2DC0 +B500 +7500 +CFE0 +ENDCHAR +STARTCHAR U_93A1 +ENCODING 37793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +FA40 +2240 +FCA0 +27E0 +AA40 +74A0 +27E0 +F920 +ENDCHAR +STARTCHAR U_93A2 +ENCODING 37794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8C40 +FFC0 +2400 +FFE0 +2400 +AFE0 +7560 +2AA0 +FAC0 +ENDCHAR +STARTCHAR U_93A3 +ENCODING 37795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +B580 +4A40 +FFE0 +8420 +0A00 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93A4 +ENCODING 37796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +8FE0 +FC20 +27E0 +FD20 +2340 +AFE0 +7180 +22A0 +FCE0 +ENDCHAR +STARTCHAR U_93A5 +ENCODING 37797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5A80 +D540 +5FE0 +5540 +0A20 +7FE0 +0400 +7FC0 +1480 +FFE0 +ENDCHAR +STARTCHAR U_93A6 +ENCODING 37798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +58A0 +8AA0 +FAA0 +2D20 +F240 +27E0 +AD20 +77E0 +2520 +FFE0 +ENDCHAR +STARTCHAR U_93A7 +ENCODING 37799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +57E0 +8800 +FFE0 +2000 +FFC0 +2440 +AFC0 +7440 +2280 +FFE0 +ENDCHAR +STARTCHAR U_93A8 +ENCODING 37800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8C80 +FFE0 +2480 +FFE0 +2480 +AFE0 +7100 +2FE0 +F900 +ENDCHAR +STARTCHAR U_93A9 +ENCODING 37801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +52A0 +8DA0 +FAA0 +2700 +FAE0 +23A0 +AEA0 +7240 +22A0 +FB20 +ENDCHAR +STARTCHAR U_93AA +ENCODING 37802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +55E0 +8D20 +FFE0 +2520 +FFE0 +2100 +AFE0 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_93AB +ENCODING 37803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4D60 +FCA0 +2340 +FC20 +23C0 +AA40 +7580 +3980 +C660 +ENDCHAR +STARTCHAR U_93AC +ENCODING 37804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A40 +FBC0 +2000 +FFE0 +2420 +AFA0 +76A0 +27A0 +FC60 +ENDCHAR +STARTCHAR U_93AD +ENCODING 37805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +2300 +53E0 +8800 +75C0 +2540 +F5C0 +2540 +B7E0 +7A40 +C420 +ENDCHAR +STARTCHAR U_93AE +ENCODING 37806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +FFC0 +2440 +FF40 +25C0 +AC40 +7FE0 +2280 +FC60 +ENDCHAR +STARTCHAR U_93AF +ENCODING 37807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5EA0 +8AA0 +FAA0 +2EC0 +FAA0 +2EA0 +A8A0 +7AE0 +2D80 +F880 +ENDCHAR +STARTCHAR U_93B0 +ENCODING 37808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +F280 +2440 +F820 +2FE0 +AAA0 +7AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_93B1 +ENCODING 37809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +FFE0 +2000 +FFC0 +2440 +AFC0 +72A0 +2640 +FB20 +ENDCHAR +STARTCHAR U_93B2 +ENCODING 37810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +5540 +8FE0 +F820 +27C0 +FC40 +27C0 +AA80 +72A0 +24A0 +F860 +ENDCHAR +STARTCHAR U_93B3 +ENCODING 37811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8C40 +FFC0 +2440 +FFC0 +2100 +AFE0 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_93B4 +ENCODING 37812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8C40 +FFC0 +2440 +FFC0 +2440 +AFC0 +7280 +2660 +FBC0 +ENDCHAR +STARTCHAR U_93B5 +ENCODING 37813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +F7C0 +2220 +FD40 +2280 +AD80 +72C0 +24A0 +FB20 +ENDCHAR +STARTCHAR U_93B6 +ENCODING 37814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3040 +4F40 +F540 +2FE0 +F040 +2F40 +B540 +7F40 +C140 +0080 +ENDCHAR +STARTCHAR U_93B7 +ENCODING 37815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5480 +8FE0 +FC80 +27E0 +FC80 +27E0 +A820 +7560 +2AA0 +FAE0 +ENDCHAR +STARTCHAR U_93B8 +ENCODING 37816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37E0 +4C80 +FFC0 +2480 +FFE0 +2000 +AFC0 +72E0 +3A20 +C460 +ENDCHAR +STARTCHAR U_93B9 +ENCODING 37817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3220 +4940 +8BE0 +F480 +23E0 +FC80 +3540 +A620 +7600 +C9E0 +ENDCHAR +STARTCHAR U_93BA +ENCODING 37818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +65C0 +9D40 +E5C0 +4940 +ED40 +5BC0 +E940 +6940 +CBE0 +0800 +ENDCHAR +STARTCHAR U_93BB +ENCODING 37819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +3540 +4AA0 +FFC0 +2540 +FCC0 +2E40 +B540 +7FC0 +C440 +0820 +ENDCHAR +STARTCHAR U_93BC +ENCODING 37820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +3100 +4FE0 +FD20 +27E0 +FD20 +25E0 +B480 +67E0 +3880 +C980 +ENDCHAR +STARTCHAR U_93BD +ENCODING 37821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +37C0 +4A00 +F7C0 +2280 +F560 +2900 +A380 +7100 +3FC0 +C100 +ENDCHAR +STARTCHAR U_93BE +ENCODING 37822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2440 +57C0 +8C40 +FFC0 +2000 +FFE0 +3AA0 +AAA0 +7AA0 +CFE0 +ENDCHAR +STARTCHAR U_93BF +ENCODING 37823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +3240 +4FE0 +FA40 +23C0 +F880 +23C0 +A880 +77E0 +3880 +C180 +ENDCHAR +STARTCHAR U_93C0 +ENCODING 37824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FE0 +F920 +2D60 +FAA0 +2D60 +AAA0 +7D60 +28A0 +FFE0 +ENDCHAR +STARTCHAR U_93C1 +ENCODING 37825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2A80 +5540 +FFC0 +2540 +FFC0 +2540 +BFE0 +6380 +3540 +C920 +ENDCHAR +STARTCHAR U_93C2 +ENCODING 37826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5800 +8BC0 +FA40 +2BC0 +F800 +2BE0 +AAA0 +7BE0 +2800 +FFE0 +ENDCHAR +STARTCHAR U_93C3 +ENCODING 37827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5FE0 +8440 +F4E0 +2F40 +F540 +25E0 +A540 +7540 +29A0 +F320 +ENDCHAR +STARTCHAR U_93C4 +ENCODING 37828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8D40 +FFC0 +2540 +FFC0 +2120 +AFE0 +7440 +2240 +F9C0 +ENDCHAR +STARTCHAR U_93C5 +ENCODING 37829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +35E0 +4940 +F880 +2F60 +FDC0 +2D40 +BDC0 +6D40 +39C0 +C940 +ENDCHAR +STARTCHAR U_93C6 +ENCODING 37830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3540 +4FE0 +F540 +27C0 +F800 +2FC0 +B540 +76C0 +C7C0 +0C60 +ENDCHAR +STARTCHAR U_93C7 +ENCODING 37831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5EE0 +8900 +F9E0 +2EA0 +FA80 +2AE0 +AA80 +7A80 +2B80 +F4E0 +ENDCHAR +STARTCHAR U_93C8 +ENCODING 37832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +57E0 +8AA0 +FBE0 +26A0 +FFE0 +2480 +AFE0 +7480 +2480 +FBE0 +ENDCHAR +STARTCHAR U_93C9 +ENCODING 37833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4480 +AE80 +F5E0 +5F20 +F580 +5F80 +E480 +6F40 +9540 +0620 +ENDCHAR +STARTCHAR U_93CA +ENCODING 37834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +11E0 +FF40 +2880 +4F60 +9100 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93CB +ENCODING 37835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +5240 +8BC0 +7100 +2FE0 +F920 +2DA0 +BB60 +7920 +C860 +ENDCHAR +STARTCHAR U_93CC +ENCODING 37836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8A40 +FFC0 +2440 +FFC0 +2440 +AFE0 +7100 +2280 +FC60 +ENDCHAR +STARTCHAR U_93CD +ENCODING 37837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +8FE0 +FD20 +27E0 +FA40 +2780 +A920 +77E0 +2540 +FB20 +ENDCHAR +STARTCHAR U_93CE +ENCODING 37838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +87E0 +F520 +27E0 +F540 +2FE0 +A540 +7FE0 +2100 +F100 +ENDCHAR +STARTCHAR U_93CF +ENCODING 37839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8FE0 +FA40 +27E0 +FA40 +23E0 +A820 +77E0 +2020 +FBE0 +ENDCHAR +STARTCHAR U_93D0 +ENCODING 37840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +55A0 +8B60 +FDA0 +2120 +FA80 +2560 +AA80 +7140 +2080 +FF00 +ENDCHAR +STARTCHAR U_93D1 +ENCODING 37841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8280 +FFE0 +2920 +FBA0 +2920 +ABA0 +7AA0 +2BA0 +F860 +ENDCHAR +STARTCHAR U_93D2 +ENCODING 37842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57A0 +84A0 +FFE0 +2300 +F480 +2AC0 +A520 +7240 +2080 +F700 +ENDCHAR +STARTCHAR U_93D3 +ENCODING 37843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +27C0 +5540 +8DC0 +76C0 +2540 +F7C0 +2A00 +B540 +7C60 +CBC0 +ENDCHAR +STARTCHAR U_93D4 +ENCODING 37844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +FFE0 +2100 +FFC0 +2540 +AFC0 +7540 +27C0 +F820 +ENDCHAR +STARTCHAR U_93D5 +ENCODING 37845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8A80 +FFE0 +2AA0 +FFE0 +2A80 +BBA0 +6AC0 +3BA0 +D2E0 +ENDCHAR +STARTCHAR U_93D6 +ENCODING 37846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +4920 +4920 +5FC0 +6220 +5FC0 +8A80 +BFE0 +ENDCHAR +STARTCHAR U_93D7 +ENCODING 37847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FA0 +F9A0 +2F40 +FAA0 +2F20 +A900 +77C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_93D8 +ENCODING 37848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5AE0 +8B20 +FEA0 +2240 +F2A0 +2FE0 +AB20 +7AA0 +2A20 +F2E0 +ENDCHAR +STARTCHAR U_93D9 +ENCODING 37849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24A0 +54A0 +8FE0 +FA80 +23E0 +FE80 +23E0 +AA80 +73E0 +2280 +FBE0 +ENDCHAR +STARTCHAR U_93DA +ENCODING 37850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +8FE0 +FA80 +2B80 +FA80 +2FA0 +AAA0 +7F40 +2AE0 +F720 +ENDCHAR +STARTCHAR U_93DB +ENCODING 37851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +37E0 +4C20 +F3C0 +2240 +FBC0 +2100 +AFE0 +7520 +3D60 +C100 +ENDCHAR +STARTCHAR U_93DC +ENCODING 37852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +5340 +8FE0 +FC20 +23C0 +FA40 +23C0 +A900 +73C0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_93DD +ENCODING 37853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +87C0 +F440 +2FE0 +FAA0 +2FE0 +AA40 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_93DE +ENCODING 37854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8940 +FFE0 +2940 +FFE0 +2D20 +AFE0 +7520 +27E0 +F560 +ENDCHAR +STARTCHAR U_93DF +ENCODING 37855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8940 +FFE0 +2400 +FE80 +27E0 +AC80 +75E0 +2480 +FBE0 +ENDCHAR +STARTCHAR U_93E0 +ENCODING 37856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +33E0 +4A40 +F580 +2240 +FCA0 +25C0 +AC80 +77E0 +3C80 +CBE0 +ENDCHAR +STARTCHAR U_93E1 +ENCODING 37857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8A80 +FFE0 +2440 +FFC0 +2440 +AFC0 +7280 +22A0 +FC60 +ENDCHAR +STARTCHAR U_93E2 +ENCODING 37858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5280 +8FE0 +FAA0 +2FE0 +F000 +27C0 +A000 +77E0 +2940 +F320 +ENDCHAR +STARTCHAR U_93E3 +ENCODING 37859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +8D40 +FFE0 +2540 +FD40 +25C0 +AC00 +7540 +26A0 +FAA0 +ENDCHAR +STARTCHAR U_93E4 +ENCODING 37860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8540 +FFE0 +2540 +FFE0 +2920 +AFE0 +7240 +2380 +FC60 +ENDCHAR +STARTCHAR U_93E5 +ENCODING 37861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3FE0 +4A20 +F3E0 +2480 +FDE0 +2520 +ADE0 +7520 +3D20 +C5E0 +ENDCHAR +STARTCHAR U_93E6 +ENCODING 37862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5940 +81C0 +F220 +2C80 +F880 +2A80 +AAE0 +7A80 +2D80 +F8E0 +ENDCHAR +STARTCHAR U_93E7 +ENCODING 37863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1160 +7E00 +55C0 +7E80 +8940 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93E8 +ENCODING 37864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +AA00 +FBE0 +AA80 +FE80 +2900 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_93E9 +ENCODING 37865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2F60 +5280 +FF80 +2AE0 +FFA0 +2AA0 +BFA0 +62A0 +3FA0 +C2A0 +ENDCHAR +STARTCHAR U_93EA +ENCODING 37866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37E0 +4A80 +FFE0 +2AA0 +FFE0 +2AA0 +BFE0 +6540 +3CC0 +C7C0 +ENDCHAR +STARTCHAR U_93EB +ENCODING 37867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E20 +34A0 +4FA0 +F6A0 +2DA0 +F560 +2FE0 +A900 +7380 +3D40 +C920 +ENDCHAR +STARTCHAR U_93EC +ENCODING 37868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FE0 +F920 +2FC0 +F920 +2FE0 +AAA0 +7FE0 +2880 +F980 +ENDCHAR +STARTCHAR U_93ED +ENCODING 37869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3520 +4B40 +F7E0 +2380 +FD40 +2220 +A940 +72A0 +36A0 +CB80 +ENDCHAR +STARTCHAR U_93EE +ENCODING 37870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8900 +FFC0 +2940 +FFE0 +2940 +BFC0 +6B20 +3D40 +D320 +ENDCHAR +STARTCHAR U_93EF +ENCODING 37871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4900 +FBA0 +2540 +FBA0 +2540 +ABA0 +7100 +3A80 +C460 +ENDCHAR +STARTCHAR U_93F0 +ENCODING 37872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3520 +4FE0 +F000 +2EE0 +FAA0 +2EE0 +BAA0 +6EE0 +3AA0 +D560 +ENDCHAR +STARTCHAR U_93F1 +ENCODING 37873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4A80 +FFE0 +2440 +FFC0 +2440 +AFC0 +7100 +3FE0 +C100 +ENDCHAR +STARTCHAR U_93F2 +ENCODING 37874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4A00 +FFE0 +2AA0 +FBC0 +2280 +ABC0 +7480 +37E0 +C080 +ENDCHAR +STARTCHAR U_93F3 +ENCODING 37875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3280 +4FE0 +F660 +25A0 +FFE0 +2240 +AA40 +73C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_93F4 +ENCODING 37876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E80 +6AE0 +9BA0 +EEA0 +4440 +E5A0 +5600 +D4E0 +74A0 +56A0 +F8E0 +ENDCHAR +STARTCHAR U_93F5 +ENCODING 37877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +8280 +FFE0 +2540 +FFE0 +2540 +AFE0 +7100 +27C0 +F900 +ENDCHAR +STARTCHAR U_93F6 +ENCODING 37878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8C80 +FFE0 +2480 +FFE0 +2480 +B7E0 +6180 +3AC0 +C4A0 +ENDCHAR +STARTCHAR U_93F7 +ENCODING 37879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +56C0 +8FE0 +F280 +2FE0 +F100 +27C0 +A900 +77E0 +2280 +FC60 +ENDCHAR +STARTCHAR U_93F8 +ENCODING 37880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8540 +F7C0 +2540 +F7C0 +2940 +AFA0 +76A0 +2A40 +F3C0 +ENDCHAR +STARTCHAR U_93F9 +ENCODING 37881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2DE0 +5520 +85E0 +FC80 +2BE0 +FAA0 +2EA0 +ABE0 +7280 +22A0 +FDE0 +ENDCHAR +STARTCHAR U_93FA +ENCODING 37882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +55A0 +8240 +FDE0 +2540 +FE60 +29C0 +AE40 +7280 +2340 +FC20 +ENDCHAR +STARTCHAR U_93FB +ENCODING 37883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +5340 +8FE0 +FB40 +2520 +FA40 +27E0 +A940 +75E0 +2240 +FC40 +ENDCHAR +STARTCHAR U_93FC +ENCODING 37884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +27E0 +5940 +F7E0 +2100 +F7E0 +2520 +B560 +6380 +3540 +C920 +ENDCHAR +STARTCHAR U_93FD +ENCODING 37885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5140 +8FE0 +F140 +27C0 +FBA0 +2D60 +ABA0 +7D60 +2BA0 +F120 +ENDCHAR +STARTCHAR U_93FE +ENCODING 37886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +5F80 +8AE0 +FAA0 +2FA0 +FAA0 +2EA0 +AAA0 +7E40 +2AA0 +FB20 +ENDCHAR +STARTCHAR U_93FF +ENCODING 37887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +8820 +F7C0 +2440 +F7C0 +2100 +AFE0 +7580 +2940 +F120 +ENDCHAR +STARTCHAR U_9400 +ENCODING 37888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37C0 +4D40 +F7C0 +2000 +FFE0 +2540 +B4C0 +67C0 +3280 +CC60 +ENDCHAR +STARTCHAR U_9401 +ENCODING 37889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A00 +5F20 +AAC0 +EE80 +4A80 +EEE0 +4AA0 +6AA0 +DFA0 +6AA0 +D120 +ENDCHAR +STARTCHAR U_9402 +ENCODING 37890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +3280 +4EE0 +FAA0 +2EE0 +F280 +2FE0 +B920 +6FE0 +3920 +CFE0 +ENDCHAR +STARTCHAR U_9403 +ENCODING 37891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8900 +FFE0 +2440 +FEE0 +2440 +AFE0 +7280 +22A0 +FC60 +ENDCHAR +STARTCHAR U_9404 +ENCODING 37892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37C0 +4A80 +FFE0 +2100 +FFC0 +2540 +AFC0 +7540 +37C0 +CC60 +ENDCHAR +STARTCHAR U_9405 +ENCODING 37893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +AA00 +73C0 +FC40 +AA80 +FD00 +AAC0 +3F00 +C4C0 +3F80 +1500 +FFC0 +ENDCHAR +STARTCHAR U_9406 +ENCODING 37894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E440 +AFE0 +C540 +AB80 +E540 +8A20 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9407 +ENCODING 37895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5920 +8540 +FFE0 +2540 +F920 +27C0 +AD40 +77C0 +2540 +FFC0 +ENDCHAR +STARTCHAR U_9408 +ENCODING 37896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3100 +4FE0 +F280 +27C0 +FAA0 +2FE0 +B820 +6BA0 +3AA0 +CBE0 +ENDCHAR +STARTCHAR U_9409 +ENCODING 37897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +8FE0 +FC80 +27E0 +FA40 +27E0 +AA40 +77E0 +2240 +FC20 +ENDCHAR +STARTCHAR U_940A +ENCODING 37898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +5B40 +8BC0 +FB40 +2DE0 +FA80 +2BE0 +ADA0 +7EA0 +2920 +F860 +ENDCHAR +STARTCHAR U_940B +ENCODING 37899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +5640 +87C0 +FA40 +27E0 +F900 +2BE0 +AD60 +7AA0 +2D20 +FAC0 +ENDCHAR +STARTCHAR U_940C +ENCODING 37900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +5480 +8FE0 +FD20 +27E0 +FA40 +2580 +AA80 +75C0 +22A0 +FD80 +ENDCHAR +STARTCHAR U_940D +ENCODING 37901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5140 +8FE0 +F2A0 +2480 +FFE0 +2AA0 +AC60 +7BA0 +2AA0 +FBE0 +ENDCHAR +STARTCHAR U_940E +ENCODING 37902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +57E0 +8C80 +FFE0 +2480 +FFE0 +2480 +AFE0 +7540 +2AA0 +FAA0 +ENDCHAR +STARTCHAR U_940F +ENCODING 37903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8280 +FFE0 +2AA0 +FC60 +2FE0 +A040 +7FE0 +2440 +F2C0 +ENDCHAR +STARTCHAR U_9410 +ENCODING 37904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +F440 +27E0 +FC40 +27C0 +AC40 +77C0 +2540 +FB20 +ENDCHAR +STARTCHAR U_9411 +ENCODING 37905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5440 +89E0 +FA40 +2DE0 +F400 +2AE0 +AFA0 +74A0 +2BE0 +FAA0 +ENDCHAR +STARTCHAR U_9412 +ENCODING 37906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +F5C0 +2920 +FFE0 +2220 +AFC0 +7240 +2540 +F880 +ENDCHAR +STARTCHAR U_9413 +ENCODING 37907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +5F80 +8AE0 +FEA0 +21A0 +FEA0 +22A0 +A440 +7E40 +24A0 +FD20 +ENDCHAR +STARTCHAR U_9414 +ENCODING 37908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5280 +8FE0 +FAA0 +2FE0 +F440 +27C0 +AC40 +7FE0 +2100 +F900 +ENDCHAR +STARTCHAR U_9415 +ENCODING 37909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5540 +8FE0 +FA40 +26C0 +FB60 +27C0 +AC40 +77C0 +2440 +FFC0 +ENDCHAR +STARTCHAR U_9416 +ENCODING 37910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2320 +5540 +8FE0 +F540 +2FE0 +F900 +27E0 +ACA0 +7640 +24A0 +FB20 +ENDCHAR +STARTCHAR U_9417 +ENCODING 37911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +3AA0 +4EE0 +FAA0 +2EE0 +FBA0 +2AA0 +BBA0 +6AA0 +3DA0 +C860 +ENDCHAR +STARTCHAR U_9418 +ENCODING 37912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8C40 +FA80 +27E0 +FD40 +27C0 +B540 +6FE0 +3100 +CFE0 +ENDCHAR +STARTCHAR U_9419 +ENCODING 37913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2740 +55A0 +8A40 +FBA0 +2420 +FFC0 +2440 +AFC0 +7440 +2280 +FFE0 +ENDCHAR +STARTCHAR U_941A +ENCODING 37914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3280 +4EE0 +F420 +26E0 +FA80 +27E0 +A940 +7620 +3A60 +C1C0 +ENDCHAR +STARTCHAR U_941B +ENCODING 37915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +3440 +4FC0 +F440 +2FE0 +F800 +27C0 +AC40 +77C0 +3540 +CB20 +ENDCHAR +STARTCHAR U_941C +ENCODING 37916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +2640 +7D40 +0880 +7560 +1F00 +3480 +DF60 +1500 +7FE0 +ENDCHAR +STARTCHAR U_941D +ENCODING 37917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +3FE0 +4D40 +FA40 +2FE0 +FAA0 +2FC0 +BA40 +6A40 +3AA0 +D520 +ENDCHAR +STARTCHAR U_941E +ENCODING 37918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4BC0 +F040 +27E0 +FAA0 +27E0 +A840 +77E0 +3A40 +C0C0 +ENDCHAR +STARTCHAR U_941F +ENCODING 37919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +5440 +FEE0 +2440 +FAA0 +27C0 +AC40 +77C0 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9420 +ENCODING 37920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +8FE0 +FAA0 +26C0 +FA80 +2FE0 +AC40 +77C0 +2440 +FFC0 +ENDCHAR +STARTCHAR U_9421 +ENCODING 37921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +2EC0 +54A0 +FFE0 +2080 +FEA0 +2AC0 +BE80 +6AA0 +3560 +CE20 +ENDCHAR +STARTCHAR U_9422 +ENCODING 37922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +F5E0 +2880 +75C0 +6AA0 +A4A0 +3B80 +C4E0 +1F80 +1500 +7FC0 +ENDCHAR +STARTCHAR U_9423 +ENCODING 37923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +3540 +4FE0 +FAA0 +2380 +F900 +27C0 +A900 +77E0 +3900 +C300 +ENDCHAR +STARTCHAR U_9424 +ENCODING 37924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +3280 +4BA0 +FAA0 +2BA0 +F820 +2EE0 +A280 +7EE0 +2AA0 +D2A0 +ENDCHAR +STARTCHAR U_9425 +ENCODING 37925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +37C0 +4900 +F7C0 +2100 +FFE0 +2540 +AFE0 +7440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9426 +ENCODING 37926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +3AA0 +4EE0 +FAA0 +2FE0 +FAA0 +2FE0 +BAA0 +6AA0 +3CA0 +C860 +ENDCHAR +STARTCHAR U_9427 +ENCODING 37927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +5EE0 +FAA0 +2FE0 +FAA0 +2BA0 +BAA0 +6BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_9428 +ENCODING 37928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8A80 +FFE0 +24A0 +FFE0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_9429 +ENCODING 37929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A20 +5540 +8BE0 +F920 +26C0 +FD80 +26C0 +ADA0 +76A0 +2500 +FBE0 +ENDCHAR +STARTCHAR U_942A +ENCODING 37930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +FD20 +27E0 +FD40 +27E0 +AD40 +77E0 +2520 +FA40 +ENDCHAR +STARTCHAR U_942B +ENCODING 37931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +57E0 +8C80 +F7E0 +2480 +F7E0 +2400 +AEE0 +7BA0 +2820 +F860 +ENDCHAR +STARTCHAR U_942C +ENCODING 37932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25C0 +5500 +8FE0 +F0A0 +2FE0 +F880 +2FA0 +AAA0 +7F40 +2AA0 +F520 +ENDCHAR +STARTCHAR U_942D +ENCODING 37933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +37E0 +4DA0 +F7E0 +27A0 +FD60 +2100 +B7E0 +6100 +3A80 +C460 +ENDCHAR +STARTCHAR U_942E +ENCODING 37934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8A80 +FFE0 +2AA0 +FFE0 +2AA0 +AFE0 +7A80 +2EC0 +F2A0 +ENDCHAR +STARTCHAR U_942F +ENCODING 37935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +37E0 +4A40 +F100 +27E0 +F900 +27E0 +B240 +67C0 +3A40 +C3C0 +ENDCHAR +STARTCHAR U_9430 +ENCODING 37936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +83C0 +F800 +2EE0 +FAA0 +2EE0 +A100 +7FE0 +2540 +F920 +ENDCHAR +STARTCHAR U_9431 +ENCODING 37937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +8440 +FBA0 +2000 +FEE0 +2AA0 +AEE0 +7440 +2AA0 +F120 +ENDCHAR +STARTCHAR U_9432 +ENCODING 37938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F400 +27E0 +F920 +27E0 +AD60 +77E0 +2120 +F7C0 +ENDCHAR +STARTCHAR U_9433 +ENCODING 37939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5100 +8FE0 +F920 +2BA0 +FD60 +27C0 +AD40 +77C0 +2540 +FFC0 +ENDCHAR +STARTCHAR U_9434 +ENCODING 37940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4D00 +F5A0 +2740 +FCE0 +2740 +ADE0 +7540 +3F40 +C840 +ENDCHAR +STARTCHAR U_9435 +ENCODING 37941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +54A0 +8FE0 +FA80 +2E80 +F0A0 +2FA0 +A4C0 +7EA0 +2560 +FE20 +ENDCHAR +STARTCHAR U_9436 +ENCODING 37942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F000 +2FE0 +FC40 +27C0 +A920 +76C0 +2240 +F320 +ENDCHAR +STARTCHAR U_9437 +ENCODING 37943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +FFE0 +2540 +FDC0 +27E0 +A900 +77E0 +2540 +F920 +ENDCHAR +STARTCHAR U_9438 +ENCODING 37944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F900 +27E0 +FA80 +27C0 +A900 +77E0 +2100 +F900 +ENDCHAR +STARTCHAR U_9439 +ENCODING 37945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BC0 +3640 +4B40 +F7E0 +2420 +FFA0 +26A0 +B7A0 +6460 +3800 +C7E0 +ENDCHAR +STARTCHAR U_943A +ENCODING 37946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +5540 +8FE0 +FAA0 +2380 +F800 +27E0 +AD20 +77E0 +2520 +FFE0 +ENDCHAR +STARTCHAR U_943B +ENCODING 37947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +FD20 +27E0 +FD00 +26A0 +ADC0 +7680 +25C0 +FAA0 +ENDCHAR +STARTCHAR U_943C +ENCODING 37948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8D40 +FFE0 +2440 +FFC0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_943D +ENCODING 37949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +57E0 +8880 +FBE0 +2540 +FFE0 +2480 +AFE0 +7480 +2C80 +F3E0 +ENDCHAR +STARTCHAR U_943E +ENCODING 37950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7940 +CBE0 +7C80 +0A80 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_943F +ENCODING 37951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +8A80 +FFE0 +2440 +FFC0 +2440 +AFC0 +72A0 +2660 +F9C0 +ENDCHAR +STARTCHAR U_9440 +ENCODING 37952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +5540 +8FE0 +F520 +2C40 +F7A0 +2200 +A7C0 +7C80 +2300 +FCE0 +ENDCHAR +STARTCHAR U_9441 +ENCODING 37953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +26A0 +5560 +FCA0 +27E0 +FA40 +23A0 +B4A0 +6300 +3980 +C660 +ENDCHAR +STARTCHAR U_9442 +ENCODING 37954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +2700 +5100 +FFE0 +2540 +FEC0 +27C0 +B100 +67E0 +3D40 +CAA0 +ENDCHAR +STARTCHAR U_9443 +ENCODING 37955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2760 +25A0 +5360 +FCA0 +27E0 +FC80 +27E0 +B480 +67E0 +3C80 +C7E0 +ENDCHAR +STARTCHAR U_9444 +ENCODING 37956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8100 +FFE0 +2120 +FFC0 +2040 +AFE0 +7B40 +2EC0 +F0C0 +ENDCHAR +STARTCHAR U_9445 +ENCODING 37957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5EE0 +8540 +FAA0 +2FE0 +F920 +2FE0 +A900 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_9446 +ENCODING 37958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2B40 +5A40 +8F40 +FAE0 +2440 +FF40 +24C0 +AF40 +7440 +2740 +FCC0 +ENDCHAR +STARTCHAR U_9447 +ENCODING 37959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +82A0 +FD40 +2560 +FD40 +27C0 +AC40 +77C0 +2840 +F040 +ENDCHAR +STARTCHAR U_9448 +ENCODING 37960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5540 +8FE0 +F920 +2DA0 +FB60 +2DA0 +AB60 +7DA0 +2920 +F960 +ENDCHAR +STARTCHAR U_9449 +ENCODING 37961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5FE0 +8540 +FFE0 +2100 +FFE0 +2440 +BFE0 +6AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_944A +ENCODING 37962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +8240 +FFE0 +2480 +FFE0 +2480 +AFE0 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_944B +ENCODING 37963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A940 +FAA0 +A940 +FFE0 +2A80 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_944C +ENCODING 37964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8820 +FFE0 +2540 +F7C0 +2C40 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_944D +ENCODING 37965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +AAA0 +AAA0 +FBE0 +5540 +8A20 +3F80 +C460 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_944E +ENCODING 37966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2480 +55C0 +FD40 +27E0 +FD40 +25C0 +B540 +6480 +3D40 +C7E0 +ENDCHAR +STARTCHAR U_944F +ENCODING 37967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +F5E0 +2000 +FFE0 +2AA0 +AFE0 +77C0 +2100 +F300 +ENDCHAR +STARTCHAR U_9450 +ENCODING 37968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5100 +8FE0 +F920 +2BA0 +FD60 +2FE0 +A100 +7FE0 +2AA0 +FAE0 +ENDCHAR +STARTCHAR U_9451 +ENCODING 37969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F40 +5A40 +8F60 +F940 +2FA0 +FA20 +2A00 +AFE0 +7AA0 +2AA0 +FFE0 +ENDCHAR +STARTCHAR U_9452 +ENCODING 37970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +FD00 +8880 +FFE0 +AAA0 +FFE0 +0400 +7FC0 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9453 +ENCODING 37971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BE0 +52A0 +FFE0 +2A40 +FA80 +2BE0 +BA20 +6BE0 +3800 +D7E0 +ENDCHAR +STARTCHAR U_9454 +ENCODING 37972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27E0 +5420 +FFE0 +2540 +FB80 +2440 +BFE0 +6100 +3540 +CB20 +ENDCHAR +STARTCHAR U_9455 +ENCODING 37973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5880 +8FE0 +FAA0 +2AA0 +FFC0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_9456 +ENCODING 37974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +27E0 +5240 +FFE0 +2520 +FFE0 +2140 +BFE0 +6540 +3EA0 +C960 +ENDCHAR +STARTCHAR U_9457 +ENCODING 37975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2E80 +54E0 +8FA0 +F4A0 +2FA0 +F440 +2920 +AD40 +7380 +2D40 +F320 +ENDCHAR +STARTCHAR U_9458 +ENCODING 37976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27C0 +5540 +FFC0 +2540 +FFE0 +2AA0 +BFE0 +6AA0 +3FE0 +C820 +ENDCHAR +STARTCHAR U_9459 +ENCODING 37977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2CA0 +55E0 +FE80 +25A0 +FD40 +27E0 +B420 +67E0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_945A +ENCODING 37978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +5440 +FFE0 +2AA0 +FFE0 +2440 +B7C0 +6440 +37C0 +CC60 +ENDCHAR +STARTCHAR U_945B +ENCODING 37979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +27E0 +5540 +FFE0 +2540 +FFE0 +2540 +B7C0 +6540 +3BC0 +CA20 +ENDCHAR +STARTCHAR U_945C +ENCODING 37980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +5AA0 +F380 +2000 +FFC0 +2540 +B540 +67C0 +3A80 +C440 +ENDCHAR +STARTCHAR U_945D +ENCODING 37981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +F9E0 +2540 +FCA0 +27E0 +AC80 +77E0 +2A80 +F1E0 +ENDCHAR +STARTCHAR U_945E +ENCODING 37982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +5540 +8AA0 +FFE0 +2AA0 +FFE0 +2540 +AFC0 +7540 +25C0 +FF20 +ENDCHAR +STARTCHAR U_945F +ENCODING 37983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2AA0 +FFE0 +2540 +B540 +67C0 +3A80 +C440 +ENDCHAR +STARTCHAR U_9460 +ENCODING 37984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +5BC0 +86A0 +FBA0 +2AC0 +FFA0 +2100 +AFE0 +7380 +2540 +F920 +ENDCHAR +STARTCHAR U_9461 +ENCODING 37985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +25E0 +5500 +FFE0 +2000 +FFE0 +2AA0 +BFE0 +6AA0 +3920 +CFE0 +ENDCHAR +STARTCHAR U_9462 +ENCODING 37986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5100 +8FE0 +FD20 +27E0 +FD40 +27C0 +AD40 +77C0 +2AA0 +F5C0 +ENDCHAR +STARTCHAR U_9463 +ENCODING 37987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +FFE0 +2A00 +FAA0 +2BC0 +AAA0 +7BE0 +2540 +FAA0 +ENDCHAR +STARTCHAR U_9464 +ENCODING 37988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +87C0 +F440 +2FE0 +F280 +2FE0 +A540 +7BA0 +2540 +FB20 +ENDCHAR +STARTCHAR U_9465 +ENCODING 37989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2480 +57E0 +FCA0 +27E0 +FCA0 +27E0 +BC20 +67E0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_9466 +ENCODING 37990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F00 +2AE0 +5FA0 +EA40 +2FA0 +F000 +27C0 +B540 +67C0 +3A80 +C440 +ENDCHAR +STARTCHAR U_9467 +ENCODING 37991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5AA0 +F7C0 +2280 +F7C0 +2640 +B540 +67C0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_9468 +ENCODING 37992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +24E0 +5F80 +8AE0 +F420 +2FE0 +FA80 +2EE0 +AA80 +7EE0 +2A80 +FAE0 +ENDCHAR +STARTCHAR U_9469 +ENCODING 37993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5100 +8FE0 +FBA0 +2FE0 +F100 +2FE0 +ABA0 +7FE0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_946A +ENCODING 37994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +5100 +8FE0 +FD20 +27E0 +FD40 +27C0 +AD40 +77E0 +24A0 +FFE0 +ENDCHAR +STARTCHAR U_946B +ENCODING 37995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1500 +7FC0 +1500 +FFE0 +2080 +5140 +AAA0 +FFE0 +AAA0 +FFE0 +ENDCHAR +STARTCHAR U_946C +ENCODING 37996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2F80 +2AE0 +5F40 +EA20 +2FC0 +F540 +26C0 +B540 +67C0 +3AA0 +C4E0 +ENDCHAR +STARTCHAR U_946D +ENCODING 37997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +FAA0 +2FE0 +F920 +2FE0 +AAA0 +7FE0 +2BA0 +FD60 +ENDCHAR +STARTCHAR U_946E +ENCODING 37998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +8A40 +F7E0 +2AA0 +F7E0 +2AA0 +AC40 +77E0 +2540 +F4C0 +ENDCHAR +STARTCHAR U_946F +ENCODING 37999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +55A0 +8FE0 +FA80 +2BA0 +FAA0 +2BC0 +AA80 +7AA0 +2B60 +FE20 +ENDCHAR +STARTCHAR U_9470 +ENCODING 38000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +5440 +8BA0 +F000 +2FE0 +FAA0 +2FE0 +AAA0 +7FE0 +2AA0 +FAA0 +ENDCHAR +STARTCHAR U_9471 +ENCODING 38001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +57C0 +8C40 +F7C0 +24C0 +F4A0 +27E0 +AD40 +77C0 +22A0 +FCE0 +ENDCHAR +STARTCHAR U_9472 +ENCODING 38002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +FEE0 +2280 +FFE0 +2280 +AFE0 +72A0 +2640 +FB20 +ENDCHAR +STARTCHAR U_9473 +ENCODING 38003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +8AA0 +F7C0 +2280 +FFE0 +2440 +AFC0 +75E0 +2500 +FBE0 +ENDCHAR +STARTCHAR U_9474 +ENCODING 38004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +57E0 +8D00 +FFE0 +2480 +F7E0 +2480 +AFE0 +7BA0 +2EE0 +FBA0 +ENDCHAR +STARTCHAR U_9475 +ENCODING 38005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +8280 +FEE0 +2AA0 +FFE0 +2480 +AFE0 +7480 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9476 +ENCODING 38006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +57E0 +8AA0 +F7E0 +5440 +FFC0 +4540 +DFE0 +7540 +57C0 +ECA0 +ENDCHAR +STARTCHAR U_9477 +ENCODING 38007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +8BC0 +FA60 +27C0 +F840 +27E0 +AD40 +77C0 +2540 +FFC0 +ENDCHAR +STARTCHAR U_9478 +ENCODING 38008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5540 +87C0 +F540 +2FE0 +FAA0 +2FE0 +AAA0 +7FE0 +2100 +FFE0 +ENDCHAR +STARTCHAR U_9479 +ENCODING 38009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5AA0 +F540 +2C60 +F7C0 +2540 +B7C0 +6540 +3FC0 +C560 +ENDCHAR +STARTCHAR U_947A +ENCODING 38010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +5EE0 +EAA0 +2EE0 +F500 +2FE0 +B900 +6FE0 +3900 +CFE0 +ENDCHAR +STARTCHAR U_947B +ENCODING 38011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2EE0 +5540 +FEE0 +2540 +F7C0 +2540 +B920 +67C0 +3100 +C300 +ENDCHAR +STARTCHAR U_947C +ENCODING 38012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +8FE0 +F540 +2BE0 +FF40 +25E0 +A940 +7FE0 +2B40 +F5E0 +ENDCHAR +STARTCHAR U_947D +ENCODING 38013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +8440 +FFE0 +2A40 +FFE0 +2440 +AFC0 +7440 +27C0 +FC60 +ENDCHAR +STARTCHAR U_947E +ENCODING 38014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +A0A0 +4E40 +E0E0 +4E40 +AAA0 +1F00 +E4E0 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_947F +ENCODING 38015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +29C0 +FD40 +2A60 +FDC0 +A480 +FF40 +1520 +E4E0 +3F80 +1500 +FFE0 +ENDCHAR +STARTCHAR U_9480 +ENCODING 38016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +A460 +1F40 +F5E0 +5F40 +F040 +5E40 +DA40 +FF40 +55A0 +F520 +ENDCHAR +STARTCHAR U_9481 +ENCODING 38017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +8EE0 +FAA0 +2FE0 +F7E0 +2480 +AFE0 +7240 +2180 +FE60 +ENDCHAR +STARTCHAR U_9482 +ENCODING 38018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +84A0 +FFE0 +2AA0 +FFE0 +2100 +AFC0 +7100 +2FE0 +FAA0 +ENDCHAR +STARTCHAR U_9483 +ENCODING 38019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5820 +8FE0 +F900 +2FE0 +FAA0 +2FE0 +AD60 +7FA0 +2920 +FFC0 +ENDCHAR +STARTCHAR U_9484 +ENCODING 38020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +2FE0 +5440 +FEE0 +2AA0 +FEE0 +2AA0 +BFE0 +6920 +3BA0 +CD60 +ENDCHAR +STARTCHAR U_9485 +ENCODING 38021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +20 +20 +7C +80 +78 +20 +FC +20 +28 +30 +20 +ENDCHAR +STARTCHAR U_9486 +ENCODING 38022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7A00 +8200 +FA00 +2200 +FA00 +2200 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_9487 +ENCODING 38023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +43C0 +7840 +8080 +F880 +2100 +F900 +2200 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_9488 +ENCODING 38024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7880 +8080 +FBE0 +2080 +F880 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_9489 +ENCODING 38025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7880 +8080 +F880 +2080 +F880 +2080 +2880 +3080 +2380 +ENDCHAR +STARTCHAR U_948A +ENCODING 38026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +4020 +7920 +8120 +F920 +2120 +F920 +2120 +2820 +3020 +20E0 +ENDCHAR +STARTCHAR U_948B +ENCODING 38027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7900 +8100 +F980 +2140 +F920 +2120 +2900 +3100 +2100 +ENDCHAR +STARTCHAR U_948C +ENCODING 38028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4020 +7840 +8080 +F880 +2080 +F880 +2080 +2C80 +3280 +2100 +ENDCHAR +STARTCHAR U_948D +ENCODING 38029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7880 +8080 +FBE0 +2080 +F880 +2080 +2880 +3080 +27E0 +ENDCHAR +STARTCHAR U_948E +ENCODING 38030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7880 +8080 +F880 +27E0 +F880 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_948F +ENCODING 38031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4220 +7AA0 +82A0 +FAA0 +22A0 +FAA0 +22A0 +2AA0 +34A0 +2820 +ENDCHAR +STARTCHAR U_9490 +ENCODING 38032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4080 +7900 +8220 +F840 +2080 +F920 +2040 +2880 +3100 +2600 +ENDCHAR +STARTCHAR U_9491 +ENCODING 38033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7A40 +4240 +FA80 +22E0 +2240 +FB40 +2280 +2C80 +3540 +2A20 +ENDCHAR +STARTCHAR U_9492 +ENCODING 38034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +8240 +FB40 +22C0 +FA40 +2240 +2A40 +3440 +2860 +ENDCHAR +STARTCHAR U_9493 +ENCODING 38035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8420 +F820 +2220 +F920 +2120 +2820 +3120 +20C0 +ENDCHAR +STARTCHAR U_9494 +ENCODING 38036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +42E0 +7820 +8420 +FC20 +2420 +FC20 +2420 +2C20 +3420 +2460 +ENDCHAR +STARTCHAR U_9495 +ENCODING 38037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7900 +87E0 +FA40 +2240 +FC40 +2280 +2980 +3140 +2620 +ENDCHAR +STARTCHAR U_9496 +ENCODING 38038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7880 +4100 +FA00 +27E0 +22A0 +FCA0 +2120 +2A20 +34A0 +2040 +ENDCHAR +STARTCHAR U_9497 +ENCODING 38039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7AA0 +82A0 +FA40 +2240 +F940 +2080 +2980 +3240 +2420 +ENDCHAR +STARTCHAR U_9498 +ENCODING 38040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7A40 +4240 +FA40 +2FE0 +2240 +FA40 +2240 +2A40 +3440 +2840 +ENDCHAR +STARTCHAR U_9499 +ENCODING 38041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4080 +7A80 +82E0 +FC80 +27E0 +F820 +2020 +2820 +3120 +20C0 +ENDCHAR +STARTCHAR U_949A +ENCODING 38042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7880 +8080 +F9C0 +22A0 +FCA0 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_949B +ENCODING 38043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7900 +87E0 +F900 +2100 +F900 +2180 +2A40 +3560 +2920 +ENDCHAR +STARTCHAR U_949C +ENCODING 38044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4200 +7A00 +83E0 +FA20 +2220 +FBE0 +2220 +2A00 +3200 +23E0 +ENDCHAR +STARTCHAR U_949D +ENCODING 38045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8540 +FD40 +2540 +FFC0 +2100 +2920 +3120 +20E0 +ENDCHAR +STARTCHAR U_949E +ENCODING 38046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7AC0 +82A0 +FAA0 +2480 +F8A0 +2020 +2840 +3180 +2600 +ENDCHAR +STARTCHAR U_949F +ENCODING 38047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +8520 +7520 +2520 +FFE0 +2100 +2900 +3100 +2100 +ENDCHAR +STARTCHAR U_94A0 +ENCODING 38048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +84A0 +FCA0 +24A0 +FD60 +2620 +2C20 +3420 +2460 +ENDCHAR +STARTCHAR U_94A1 +ENCODING 38049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7D40 +8540 +FD40 +2540 +FD40 +2540 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_94A2 +ENCODING 38050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7CA0 +86A0 +FD20 +2520 +FDA0 +2660 +2C20 +3420 +24E0 +ENDCHAR +STARTCHAR U_94A3 +ENCODING 38051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4380 +7A00 +83E0 +FA20 +2220 +FB40 +22C0 +2A80 +3540 +2A20 +ENDCHAR +STARTCHAR U_94A4 +ENCODING 38052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +7C40 +8120 +F880 +2000 +FFC0 +2080 +2880 +3100 +2100 +ENDCHAR +STARTCHAR U_94A5 +ENCODING 38053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +FA20 +2220 +FBE0 +2220 +2A20 +34A0 +2840 +ENDCHAR +STARTCHAR U_94A6 +ENCODING 38054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8220 +FD40 +2100 +F900 +2280 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_94A7 +ENCODING 38055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8420 +F920 +20A0 +F8A0 +2720 +2A20 +3020 +20C0 +ENDCHAR +STARTCHAR U_94A8 +ENCODING 38056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +8440 +FD80 +2400 +FFE0 +2020 +2FA0 +3020 +20C0 +ENDCHAR +STARTCHAR U_94A9 +ENCODING 38057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +8420 +F920 +2120 +FAA0 +27E0 +2820 +3020 +20C0 +ENDCHAR +STARTCHAR U_94AA +ENCODING 38058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +8000 +FB80 +2280 +FA80 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94AB +ENCODING 38059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +8100 +F9E0 +2120 +F920 +2120 +2A20 +34E0 +2840 +ENDCHAR +STARTCHAR U_94AC +ENCODING 38060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7AA0 +82A0 +FAC0 +2480 +F880 +2080 +2980 +3240 +2420 +ENDCHAR +STARTCHAR U_94AD +ENCODING 38061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4240 +7940 +8040 +FA40 +2140 +F8E0 +2740 +2840 +3040 +2040 +ENDCHAR +STARTCHAR U_94AE +ENCODING 38062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47C0 +7940 +8140 +F940 +27C0 +FA40 +2240 +2A40 +3240 +2FE0 +ENDCHAR +STARTCHAR U_94AF +ENCODING 38063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7CA0 +84A0 +FCA0 +27E0 +FC00 +2400 +2C20 +3420 +23E0 +ENDCHAR +STARTCHAR U_94B0 +ENCODING 38064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7900 +8100 +F900 +27C0 +F900 +2140 +2920 +3100 +2FE0 +ENDCHAR +STARTCHAR U_94B1 +ENCODING 38065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4240 +72E0 +8700 +F260 +2780 +F240 +2280 +2120 +32A0 +2C60 +ENDCHAR +STARTCHAR U_94B2 +ENCODING 38066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4080 +7880 +8080 +FA80 +22E0 +FA80 +2280 +2A80 +3280 +2FE0 +ENDCHAR +STARTCHAR U_94B3 +ENCODING 38067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4240 +7FE0 +8240 +FA40 +23C0 +FA40 +2240 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_94B4 +ENCODING 38068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +8080 +F880 +23E0 +FA20 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94B5 +ENCODING 38069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +8100 +FB80 +2540 +F920 +2100 +2FC0 +3100 +2100 +ENDCHAR +STARTCHAR U_94B6 +ENCODING 38070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4040 +7840 +8740 +FD40 +2540 +FF40 +2540 +2840 +3140 +2080 +ENDCHAR +STARTCHAR U_94B7 +ENCODING 38071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4400 +7C00 +85C0 +FD40 +2540 +FDC0 +2540 +2C00 +3400 +27E0 +ENDCHAR +STARTCHAR U_94B8 +ENCODING 38072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43E0 +7900 +8280 +FBE0 +26A0 +FAA0 +22A0 +2AA0 +32E0 +2080 +ENDCHAR +STARTCHAR U_94B9 +ENCODING 38073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4240 +7FE0 +8200 +FBC0 +2240 +FA40 +2340 +2C80 +3940 +2620 +ENDCHAR +STARTCHAR U_94BA +ENCODING 38074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +7FE0 +8480 +FCA0 +24A0 +FCA0 +24C0 +2EA0 +3560 +2220 +ENDCHAR +STARTCHAR U_94BB +ENCODING 38075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +79E0 +8100 +F900 +27E0 +FC20 +2420 +2C20 +37E0 +2420 +ENDCHAR +STARTCHAR U_94BC +ENCODING 38076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +FA20 +2220 +FBE0 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94BD +ENCODING 38077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +8240 +FBC0 +2240 +FA40 +23C0 +2A40 +3000 +27E0 +ENDCHAR +STARTCHAR U_94BE +ENCODING 38078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +44A0 +7CA0 +87E0 +FCA0 +24A0 +FFE0 +2080 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_94BF +ENCODING 38079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7CA0 +84A0 +FCA0 +27E0 +FCA0 +24A0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_94C0 +ENCODING 38080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4080 +7FE0 +84A0 +FCA0 +24A0 +FFE0 +24A0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_94C1 +ENCODING 38081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +7500 +47C0 +7900 +A100 +2FE0 +F100 +2280 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_94C2 +ENCODING 38082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4100 +7BE0 +8220 +FA20 +23E0 +FA20 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94C3 +ENCODING 38083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4180 +7A40 +8520 +F880 +2000 +FBE0 +2040 +2A80 +3100 +2080 +ENDCHAR +STARTCHAR U_94C4 +ENCODING 38084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7A00 +8280 +FA80 +27E0 +F880 +22C0 +2AA0 +34A0 +2980 +ENDCHAR +STARTCHAR U_94C5 +ENCODING 38085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +8240 +FC60 +2000 +FBE0 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94C6 +ENCODING 38086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4CE0 +78A0 +8AA0 +FAA0 +2AA0 +FEA0 +2AA0 +2AE0 +3480 +2880 +ENDCHAR +STARTCHAR U_94C7 +ENCODING 38087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2200 +77C0 +8840 +7740 +2540 +F740 +24C0 +2420 +3420 +23E0 +ENDCHAR +STARTCHAR U_94C8 +ENCODING 38088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7880 +83E0 +FAA0 +22A0 +FAA0 +22A0 +2AA0 +32E0 +2080 +ENDCHAR +STARTCHAR U_94C9 +ENCODING 38089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +8100 +FA20 +27C0 +F880 +2100 +2A40 +37A0 +2020 +ENDCHAR +STARTCHAR U_94CA +ENCODING 38090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7C20 +8000 +FA00 +2240 +FA80 +2300 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_94CB +ENCODING 38091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +40A0 +78A0 +8140 +F940 +2560 +FDA0 +2100 +2B20 +3520 +28E0 +ENDCHAR +STARTCHAR U_94CC +ENCODING 38092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7C20 +87E0 +FC00 +2520 +FD40 +2580 +2D20 +3520 +28E0 +ENDCHAR +STARTCHAR U_94CD +ENCODING 38093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +43E0 +7AA0 +8280 +FA80 +23E0 +FA40 +2340 +2A80 +3540 +2A20 +ENDCHAR +STARTCHAR U_94CE +ENCODING 38094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4240 +7980 +8660 +F880 +2080 +FBE0 +2080 +2FE0 +3080 +2080 +ENDCHAR +STARTCHAR U_94CF +ENCODING 38095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +5F20 +6AA0 +8AA0 +FFA0 +4AA0 +EAA0 +4AA0 +4A20 +6A20 +5260 +ENDCHAR +STARTCHAR U_94D0 +ENCODING 38096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +47A0 +7940 +87E0 +F900 +23E0 +FD00 +23E0 +2820 +3120 +20C0 +ENDCHAR +STARTCHAR U_94D1 +ENCODING 38097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4120 +7FA0 +8140 +FFE0 +2100 +FA40 +2680 +2B20 +3220 +21E0 +ENDCHAR +STARTCHAR U_94D2 +ENCODING 38098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4240 +7A40 +83C0 +FA40 +23C0 +FA40 +2260 +2FC0 +3040 +2040 +ENDCHAR +STARTCHAR U_94D3 +ENCODING 38099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +7240 +8240 +7100 +2FE0 +F200 +2200 +2200 +3200 +23C0 +ENDCHAR +STARTCHAR U_94D4 +ENCODING 38100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +7280 +8280 +7AA0 +26A0 +F6C0 +2280 +2A80 +37E0 +2000 +ENDCHAR +STARTCHAR U_94D5 +ENCODING 38101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +83E0 +FA20 +27E0 +FA20 +23E0 +2A20 +3220 +2260 +ENDCHAR +STARTCHAR U_94D6 +ENCODING 38102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +40A0 +7FE0 +8880 +FE80 +4AA0 +FAA0 +4A40 +5EC0 +6960 +5220 +ENDCHAR +STARTCHAR U_94D7 +ENCODING 38103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8520 +FB40 +2100 +FFE0 +2100 +2980 +3240 +2C20 +ENDCHAR +STARTCHAR U_94D8 +ENCODING 38104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +42A0 +7AA0 +8AC0 +FFA0 +22A0 +FAA0 +26A0 +2AE0 +3280 +2680 +ENDCHAR +STARTCHAR U_94D9 +ENCODING 38105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47E0 +7A80 +8120 +FAA0 +2440 +FFE0 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94DA +ENCODING 38106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +7100 +8240 +F7E0 +4100 +F100 +47C0 +5100 +6100 +4FE0 +ENDCHAR +STARTCHAR U_94DB +ENCODING 38107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +42A0 +7AC0 +8080 +FBE0 +2020 +F820 +23E0 +2820 +37E0 +2020 +ENDCHAR +STARTCHAR U_94DC +ENCODING 38108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +7820 +8BA0 +F820 +4BA0 +FAA0 +4BA0 +5820 +6820 +48E0 +ENDCHAR +STARTCHAR U_94DD +ENCODING 38109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +83C0 +FA40 +2000 +FFE0 +2420 +2C20 +37E0 +2420 +ENDCHAR +STARTCHAR U_94DE +ENCODING 38110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +F880 +27E0 +FCA0 +24A0 +2CA0 +34E0 +2080 +ENDCHAR +STARTCHAR U_94DF +ENCODING 38111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +7920 +8FE0 +F920 +4920 +F9A0 +4A60 +5C20 +6FE0 +4820 +ENDCHAR +STARTCHAR U_94E0 +ENCODING 38112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +44A0 +7FE0 +8000 +FFE0 +2020 +FBE0 +2200 +2A20 +3220 +21E0 +ENDCHAR +STARTCHAR U_94E1 +ENCODING 38113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F20 +5120 +7520 +95A0 +F5A0 +55A0 +F5A0 +5520 +4420 +6A20 +5160 +ENDCHAR +STARTCHAR U_94E2 +ENCODING 38114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +77E0 +8900 +F100 +2FE0 +F100 +2380 +2540 +3920 +2100 +ENDCHAR +STARTCHAR U_94E3 +ENCODING 38115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4500 +7FE0 +8500 +F900 +27E0 +FA80 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94E4 +ENCODING 38116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E20 +43C0 +7240 +8440 +FFE0 +2240 +FA40 +25E0 +2A00 +3500 +28E0 +ENDCHAR +STARTCHAR U_94E5 +ENCODING 38117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +43C0 +7880 +83E0 +F880 +27E0 +F880 +2100 +2A40 +37A0 +2220 +ENDCHAR +STARTCHAR U_94E6 +ENCODING 38118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7700 +8100 +7100 +2FE0 +2100 +F7C0 +2440 +2440 +37C0 +2440 +ENDCHAR +STARTCHAR U_94E7 +ENCODING 38119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +42A0 +7EC0 +8380 +FAA0 +22E0 +F880 +27E0 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_94E8 +ENCODING 38120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +7C40 +8020 +FFC0 +2100 +F900 +27C0 +2900 +3100 +27E0 +ENDCHAR +STARTCHAR U_94E9 +ENCODING 38121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +4240 +7980 +8660 +F880 +27E0 +F880 +22C0 +2AA0 +34A0 +2180 +ENDCHAR +STARTCHAR U_94EA +ENCODING 38122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4180 +7240 +8420 +FBC0 +2000 +FBC0 +2240 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_94EB +ENCODING 38123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +7AA0 +86C0 +FA80 +22C0 +FEA0 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94EC +ENCODING 38124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +7A40 +8580 +FA40 +2420 +FBE0 +2240 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_94ED +ENCODING 38125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +41E0 +7A20 +8540 +F880 +2100 +FBE0 +2620 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_94EE +ENCODING 38126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4380 +7500 +8FC0 +F140 +2FE0 +F140 +27C0 +2100 +3100 +2300 +ENDCHAR +STARTCHAR U_94EF +ENCODING 38127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +7A80 +87E0 +FAA0 +22A0 +FBE0 +2220 +2A00 +3220 +21E0 +ENDCHAR +STARTCHAR U_94F0 +ENCODING 38128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +8240 +FC20 +2040 +FA40 +2180 +2980 +3240 +2420 +ENDCHAR +STARTCHAR U_94F1 +ENCODING 38129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +8100 +FA80 +26A0 +FAC0 +2280 +2A40 +3320 +2620 +ENDCHAR +STARTCHAR U_94F2 +ENCODING 38130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7A20 +8140 +FFE0 +2400 +FC00 +2400 +2C00 +3400 +2800 +ENDCHAR +STARTCHAR U_94F3 +ENCODING 38131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8240 +FFA0 +2000 +FA80 +2280 +2AA0 +34A0 +2860 +ENDCHAR +STARTCHAR U_94F4 +ENCODING 38132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +4440 +7080 +8900 +F7E0 +42A0 +F520 +4E60 +54A0 +6520 +46C0 +ENDCHAR +STARTCHAR U_94F5 +ENCODING 38133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7C20 +8100 +FFE0 +2140 +F940 +2240 +2A80 +3140 +2620 +ENDCHAR +STARTCHAR U_94F6 +ENCODING 38134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7C40 +87C0 +FC40 +27C0 +FD20 +2540 +2C80 +3540 +2620 +ENDCHAR +STARTCHAR U_94F7 +ENCODING 38135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4400 +7FE0 +8AA0 +FAA0 +2AA0 +FAA0 +2AA0 +26A0 +35E0 +28A0 +ENDCHAR +STARTCHAR U_94F8 +ENCODING 38136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7100 +87E0 +F200 +2FE0 +F440 +27E0 +2C40 +3240 +20C0 +ENDCHAR +STARTCHAR U_94F9 +ENCODING 38137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +8FE0 +F820 +2100 +FFE0 +2120 +2920 +32E0 +2C40 +ENDCHAR +STARTCHAR U_94FA +ENCODING 38138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +4140 +7FE0 +8100 +FFE0 +2520 +FFE0 +2520 +2FE0 +3520 +2560 +ENDCHAR +STARTCHAR U_94FB +ENCODING 38139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +77C0 +8140 +7140 +27E0 +F000 +23C0 +2A40 +3240 +23C0 +ENDCHAR +STARTCHAR U_94FC +ENCODING 38140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8540 +FB80 +27E0 +F900 +2380 +2B40 +3520 +2100 +ENDCHAR +STARTCHAR U_94FD +ENCODING 38141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +70A0 +8FE0 +F280 +2580 +2680 +FD80 +24A0 +2DA0 +3760 +2020 +ENDCHAR +STARTCHAR U_94FE +ENCODING 38142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4BE0 +7500 +8280 +FFE0 +2480 +FFE0 +2480 +2480 +3A00 +29E0 +ENDCHAR +STARTCHAR U_94FF +ENCODING 38143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4AE0 +7AA0 +8AA0 +FA40 +22A0 +F120 +2100 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_9500 +ENCODING 38144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4520 +7B40 +87E0 +FC20 +27E0 +FC20 +27E0 +2C20 +3420 +24E0 +ENDCHAR +STARTCHAR U_9501 +ENCODING 38145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +4100 +77C0 +8440 +7540 +2540 +F540 +2540 +3280 +2C60 +ENDCHAR +STARTCHAR U_9502 +ENCODING 38146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +42A0 +7AA0 +83E0 +FAA0 +23E0 +F880 +23E0 +2880 +3080 +27E0 +ENDCHAR +STARTCHAR U_9503 +ENCODING 38147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +4220 +7A20 +83E0 +F800 +27E0 +F880 +23E0 +2880 +3080 +27E0 +ENDCHAR +STARTCHAR U_9504 +ENCODING 38148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4E80 +7BE0 +8EA0 +FAA0 +4AA0 +FEA0 +4AA0 +5AA0 +6F20 +42C0 +ENDCHAR +STARTCHAR U_9505 +ENCODING 38149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7A40 +83C0 +F900 +27E0 +FD20 +25A0 +2E60 +3420 +2460 +ENDCHAR +STARTCHAR U_9506 +ENCODING 38150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4280 +7BE0 +8480 +F880 +27E0 +F800 +23E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_9507 +ENCODING 38151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +46C0 +7AA0 +87E0 +FA80 +23A0 +FEA0 +22C0 +2A80 +3360 +2620 +ENDCHAR +STARTCHAR U_9508 +ENCODING 38152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7100 +8FE0 +F540 +2920 +F7C0 +2280 +22E0 +2A20 +3420 +28C0 +ENDCHAR +STARTCHAR U_9509 +ENCODING 38153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7D40 +8540 +FBA0 +2120 +F900 +27C0 +2900 +3100 +2FE0 +ENDCHAR +STARTCHAR U_950A +ENCODING 38154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +47A0 +7D20 +82C0 +F840 +27E0 +F840 +2240 +2940 +3040 +20C0 +ENDCHAR +STARTCHAR U_950B +ENCODING 38155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4640 +7980 +8660 +F900 +27E0 +F900 +23C0 +2900 +37E0 +2100 +ENDCHAR +STARTCHAR U_950C +ENCODING 38156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +37E0 +4220 +F940 +27E0 +F880 +2080 +23E0 +2880 +3080 +2080 +ENDCHAR +STARTCHAR U_950D +ENCODING 38157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8240 +FFA0 +2000 +FD40 +2540 +2D40 +3540 +2960 +ENDCHAR +STARTCHAR U_950E +ENCODING 38158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +4220 +7820 +8FE0 +FAA0 +4FE0 +FAA0 +4AA0 +5AA0 +6CA0 +4860 +ENDCHAR +STARTCHAR U_950F +ENCODING 38159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +4220 +7820 +8BA0 +FAA0 +4BA0 +FAA0 +4BA0 +5820 +6820 +4860 +ENDCHAR +STARTCHAR U_9510 +ENCODING 38160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +77C0 +8440 +F440 +27C0 +F280 +2280 +2AA0 +34A0 +28E0 +ENDCHAR +STARTCHAR U_9511 +ENCODING 38161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4280 +7FE0 +8120 +FFE0 +2500 +FFE0 +2120 +2B20 +3560 +2900 +ENDCHAR +STARTCHAR U_9512 +ENCODING 38162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +87C0 +FC40 +27C0 +FD20 +2540 +2C80 +3540 +2620 +ENDCHAR +STARTCHAR U_9513 +ENCODING 38163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4040 +7BC0 +8040 +FFE0 +2420 +FBC0 +2240 +2980 +3180 +2660 +ENDCHAR +STARTCHAR U_9514 +ENCODING 38164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7FE0 +8400 +FFE0 +2420 +FFA0 +26A0 +2FA0 +3420 +28C0 +ENDCHAR +STARTCHAR U_9515 +ENCODING 38165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +5440 +7440 +99C0 +F540 +5540 +F5C0 +5C40 +5040 +7040 +50C0 +ENDCHAR +STARTCHAR U_9516 +ENCODING 38166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +77C0 +8100 +FFE0 +2240 +FBC0 +2240 +2BC0 +3240 +22C0 +ENDCHAR +STARTCHAR U_9517 +ENCODING 38167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47A0 +7940 +87E0 +F900 +23C0 +FE40 +23C0 +2A40 +33C0 +2240 +ENDCHAR +STARTCHAR U_9518 +ENCODING 38168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +8100 +FFE0 +2100 +FBE0 +2620 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_9519 +ENCODING 38169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +8280 +EFE0 +4000 +F7C0 +4440 +47C0 +5440 +67C0 +ENDCHAR +STARTCHAR U_951A +ENCODING 38170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +8000 +FFE0 +24A0 +FCA0 +27E0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_951B +ENCODING 38171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8540 +FFE0 +2100 +F240 +2FE0 +2240 +3440 +2840 +ENDCHAR +STARTCHAR U_951C +ENCODING 38172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +4280 +F440 +2FE0 +F040 +2F40 +2540 +3740 +2140 +0080 +ENDCHAR +STARTCHAR U_951D +ENCODING 38173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4240 +7BC0 +8240 +FBC0 +2000 +FBE0 +2040 +2FE0 +3240 +21C0 +ENDCHAR +STARTCHAR U_951E +ENCODING 38174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +7FC0 +8540 +FFC0 +2100 +FFE0 +2180 +2B40 +3520 +2920 +ENDCHAR +STARTCHAR U_951F +ENCODING 38175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7FE0 +8420 +FFE0 +2480 +FCA0 +27C0 +2C80 +35A0 +2660 +ENDCHAR +STARTCHAR U_9520 +ENCODING 38176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +3BC0 +4240 +FBC0 +2000 +FFE0 +2420 +27E0 +3420 +27E0 +ENDCHAR +STARTCHAR U_9521 +ENCODING 38177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +77C0 +8440 +FFC0 +2400 +F7E0 +2AA0 +22A0 +3520 +22C0 +ENDCHAR +STARTCHAR U_9522 +ENCODING 38178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4820 +7920 +8FE0 +F920 +4BA0 +FAA0 +4BA0 +5820 +6FE0 +4820 +ENDCHAR +STARTCHAR U_9523 +ENCODING 38179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +7AA0 +8FE0 +F900 +21E0 +F220 +2540 +2880 +3300 +2C00 +ENDCHAR +STARTCHAR U_9524 +ENCODING 38180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7100 +8FE0 +F540 +2FE0 +F540 +2540 +2FE0 +3100 +27C0 +ENDCHAR +STARTCHAR U_9525 +ENCODING 38181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4480 +7FE0 +8480 +FFE0 +2480 +FFE0 +2480 +2C80 +37E0 +2400 +ENDCHAR +STARTCHAR U_9526 +ENCODING 38182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +87C0 +FC40 +27C0 +F900 +2FE0 +2920 +3960 +2100 +ENDCHAR +STARTCHAR U_9527 +ENCODING 38183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6880 +8FE0 +E880 +4BE0 +EA20 +4AA0 +4AA0 +6AA0 +5140 +2220 +ENDCHAR +STARTCHAR U_9528 +ENCODING 38184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4C80 +78E0 +8920 +FE80 +4A80 +FA80 +4A80 +5A80 +6B40 +5220 +ENDCHAR +STARTCHAR U_9529 +ENCODING 38185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +7FE0 +8100 +FFE0 +2240 +FFE0 +2240 +2AC0 +3220 +21E0 +ENDCHAR +STARTCHAR U_952A +ENCODING 38186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47E0 +7AA0 +84A0 +F920 +22C0 +F900 +22C0 +2A20 +3660 +29C0 +ENDCHAR +STARTCHAR U_952B +ENCODING 38187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7A20 +8140 +FFE0 +2000 +FBE0 +2220 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_952C +ENCODING 38188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +42C0 +7A80 +8540 +FAA0 +2080 +FAA0 +22C0 +2C80 +3140 +2620 +ENDCHAR +STARTCHAR U_952D +ENCODING 38189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7C20 +8000 +FFE0 +2080 +FAE0 +2280 +2A80 +3580 +28E0 +ENDCHAR +STARTCHAR U_952E +ENCODING 38190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +47E0 +68A0 +8BE0 +FCA0 +47E0 +E480 +57E0 +4880 +6C80 +53E0 +ENDCHAR +STARTCHAR U_952F +ENCODING 38191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7C20 +87E0 +FC80 +27E0 +FC80 +27E0 +2A20 +33E0 +2220 +ENDCHAR +STARTCHAR U_9530 +ENCODING 38192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4080 +7100 +8FE0 +F100 +4300 +F000 +4FE0 +5AA0 +6AA0 +5FE0 +ENDCHAR +STARTCHAR U_9531 +ENCODING 38193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +42A0 +7D40 +82A0 +FAA0 +27E0 +FCA0 +27E0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_9532 +ENCODING 38194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +4FE0 +74A0 +8EA0 +F4A0 +4EA0 +F540 +4FE0 +5100 +6280 +4C60 +ENDCHAR +STARTCHAR U_9533 +ENCODING 38195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +7280 +4100 +F7C0 +2540 +F540 +2FE0 +2280 +3440 +2820 +ENDCHAR +STARTCHAR U_9534 +ENCODING 38196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +44A0 +7FC0 +84A0 +FEE0 +2080 +FBE0 +2220 +2BE0 +3220 +23E0 +ENDCHAR +STARTCHAR U_9535 +ENCODING 38197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +42E0 +7B20 +86A0 +FA40 +22C0 +FBE0 +2740 +2AC0 +3240 +22C0 +ENDCHAR +STARTCHAR U_9536 +ENCODING 38198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +44A0 +7CA0 +87E0 +FCA0 +27E0 +F900 +22C0 +2A20 +3640 +29C0 +ENDCHAR +STARTCHAR U_9537 +ENCODING 38199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +7EE0 +8000 +F7C0 +2000 +FFE0 +2200 +27C0 +3040 +2180 +ENDCHAR +STARTCHAR U_9538 +ENCODING 38200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +4380 +7080 +87E0 +F880 +22E0 +FCA0 +27E0 +2CA0 +37E0 +2420 +ENDCHAR +STARTCHAR U_9539 +ENCODING 38201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4C40 +7540 +8F60 +F540 +2640 +F540 +2C40 +2CA0 +3520 +2620 +ENDCHAR +STARTCHAR U_953A +ENCODING 38202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4100 +7FE0 +8540 +FFC0 +2540 +FFC0 +2100 +2FC0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_953B +ENCODING 38203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7D40 +4940 +8E60 +F800 +4FE0 +F940 +4F40 +5880 +6940 +4A20 +ENDCHAR +STARTCHAR U_953C +ENCODING 38204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4D60 +7920 +8FE0 +F920 +4FE0 +F100 +47E0 +5240 +6180 +4E60 +ENDCHAR +STARTCHAR U_953D +ENCODING 38205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47C0 +7440 +87C0 +7440 +27C0 +F900 +2100 +27C0 +3100 +2FE0 +ENDCHAR +STARTCHAR U_953E +ENCODING 38206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4520 +7AC0 +87E0 +F900 +27E0 +FA00 +23E0 +2D40 +3880 +2360 +ENDCHAR +STARTCHAR U_953F +ENCODING 38207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7800 +83C0 +FA40 +23C0 +F900 +22A0 +2E40 +3320 +2220 +ENDCHAR +STARTCHAR U_9540 +ENCODING 38208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7D40 +87E0 +FD40 +25C0 +FC00 +27E0 +2D40 +3480 +2B60 +ENDCHAR +STARTCHAR U_9541 +ENCODING 38209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +7100 +87C0 +F900 +27E0 +F900 +27E0 +2980 +3240 +2C20 +ENDCHAR +STARTCHAR U_9542 +ENCODING 38210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44A0 +42C0 +77E0 +8080 +F9C0 +26A0 +F900 +27E0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_9543 +ENCODING 38211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +4480 +7FE0 +8440 +E880 +4AA0 +FFE0 +4440 +4AA0 +7FE0 +4220 +ENDCHAR +STARTCHAR U_9544 +ENCODING 38212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47E0 +72A0 +87C0 +FAA0 +24A0 +FFE0 +2540 +2D40 +3280 +2460 +ENDCHAR +STARTCHAR U_9545 +ENCODING 38213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +44A0 +77E0 +8400 +FDE0 +2520 +FDE0 +2520 +2DE0 +3520 +29E0 +ENDCHAR +STARTCHAR U_9546 +ENCODING 38214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7280 +87C0 +FC40 +27C0 +FC40 +27E0 +2900 +3280 +2C60 +ENDCHAR +STARTCHAR U_9547 +ENCODING 38215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7100 +87C0 +FC40 +2740 +FDC0 +2440 +2FE0 +3280 +2C60 +ENDCHAR +STARTCHAR U_9548 +ENCODING 38216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7FE0 +8540 +F7C0 +4540 +F7C0 +4540 +5FE0 +6240 +4340 +0080 +ENDCHAR +STARTCHAR U_9549 +ENCODING 38217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4000 +73C0 +8240 +FA40 +27E0 +FD60 +24A0 +2FE0 +34A0 +24E0 +ENDCHAR +STARTCHAR U_954A +ENCODING 38218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4240 +73C0 +8240 +FFE0 +4040 +FEE0 +4AA0 +5440 +6AA0 +5120 +ENDCHAR +STARTCHAR U_954B +ENCODING 38219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4540 +7FE0 +9020 +E780 +4480 +E780 +4300 +5520 +6520 +48E0 +ENDCHAR +STARTCHAR U_954C +ENCODING 38220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +4480 +7FE0 +8480 +FFE0 +2480 +FFE0 +2280 +2AE0 +3420 +28E0 +ENDCHAR +STARTCHAR U_954D +ENCODING 38221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7C40 +87C0 +FC40 +27C0 +F900 +27E0 +2B80 +3540 +2920 +ENDCHAR +STARTCHAR U_954E +ENCODING 38222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +46C0 +79A0 +87C0 +F440 +27C0 +F900 +27C0 +2900 +37E0 +2300 +ENDCHAR +STARTCHAR U_954F +ENCODING 38223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +45E0 +74A0 +86A0 +FDE0 +2240 +FFE0 +2520 +2FE0 +3520 +27E0 +ENDCHAR +STARTCHAR U_9550 +ENCODING 38224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +4FE0 +7240 +83C0 +F000 +4FE0 +F820 +4BA0 +5AA0 +6BA0 +4860 +ENDCHAR +STARTCHAR U_9551 +ENCODING 38225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7280 +8FE0 +F920 +2FE0 +FA00 +23C0 +2A40 +3440 +2980 +ENDCHAR +STARTCHAR U_9552 +ENCODING 38226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4A80 +77E0 +8800 +F280 +4440 +F820 +4FE0 +5AA0 +6AA0 +4FE0 +ENDCHAR +STARTCHAR U_9553 +ENCODING 38227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +8FE0 +F220 +4D40 +F280 +4D40 +52A0 +6CA0 +4300 +ENDCHAR +STARTCHAR U_9554 +ENCODING 38228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +47E0 +7420 +81C0 +FA00 +23E0 +FA40 +27E0 +2A80 +3440 +2820 +ENDCHAR +STARTCHAR U_9555 +ENCODING 38229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +8440 +7920 +2280 +F440 +2FE0 +2440 +37C0 +2440 +ENDCHAR +STARTCHAR U_9556 +ENCODING 38230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +7FE0 +8AA0 +FFE0 +4000 +F7C0 +4000 +5FE0 +6940 +5320 +ENDCHAR +STARTCHAR U_9557 +ENCODING 38231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4920 +4540 +7FE0 +8820 +F7C0 +4440 +F7C0 +4100 +57C0 +6100 +4FE0 +ENDCHAR +STARTCHAR U_9558 +ENCODING 38232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +77C0 +8440 +FFE0 +4AA0 +FFE0 +4440 +5280 +6100 +4EE0 +ENDCHAR +STARTCHAR U_9559 +ENCODING 38233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4520 +77E0 +8520 +F7E0 +4240 +F780 +4240 +5FE0 +6540 +4B20 +ENDCHAR +STARTCHAR U_955A +ENCODING 38234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4920 +6FE0 +8000 +EEE0 +4AA0 +EEE0 +4AA0 +4EE0 +6AA0 +5360 +ENDCHAR +STARTCHAR U_955B +ENCODING 38235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7940 +8FE0 +F940 +4FE0 +F920 +4FE0 +5920 +6FE0 +4920 +ENDCHAR +STARTCHAR U_955C +ENCODING 38236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8FE0 +F440 +27C0 +F440 +27C0 +2A80 +32A0 +2C60 +ENDCHAR +STARTCHAR U_955D +ENCODING 38237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8FE0 +F920 +4FE0 +F920 +4BA0 +5AA0 +6BA0 +4AE0 +ENDCHAR +STARTCHAR U_955E +ENCODING 38238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +44E0 +7F00 +8880 +FEE0 +4B40 +FBE0 +4A40 +5A40 +6EA0 +5520 +ENDCHAR +STARTCHAR U_955F +ENCODING 38239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +44E0 +7F00 +89E0 +FC60 +5540 +F560 +5540 +5540 +76C0 +5C60 +ENDCHAR +STARTCHAR U_9560 +ENCODING 38240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +4AA0 +7660 +8AA0 +7100 +2280 +FD60 +2280 +2140 +3080 +2700 +ENDCHAR +STARTCHAR U_9561 +ENCODING 38241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4280 +7FE0 +8AA0 +FFE0 +4440 +F7C0 +4440 +5FE0 +6100 +4100 +ENDCHAR +STARTCHAR U_9562 +ENCODING 38242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4D40 +7A40 +8FE0 +FAA0 +4AC0 +FFC0 +4A40 +5A40 +6CA0 +4920 +ENDCHAR +STARTCHAR U_9563 +ENCODING 38243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7B40 +8480 +FFE0 +2440 +FFC0 +2440 +2FC0 +3540 +2B20 +ENDCHAR +STARTCHAR U_9564 +ENCODING 38244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +46C0 +7FE0 +8280 +FFE0 +2100 +F7C0 +2100 +2FE0 +3280 +2C60 +ENDCHAR +STARTCHAR U_9565 +ENCODING 38245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +7FC0 +8540 +FFC0 +2540 +FFE0 +2440 +27C0 +2C40 +37C0 +ENDCHAR +STARTCHAR U_9566 +ENCODING 38246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +4F80 +7AE0 +8EA0 +F0A0 +4FA0 +F2A0 +44A0 +5E40 +64A0 +4D20 +ENDCHAR +STARTCHAR U_9567 +ENCODING 38247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +4420 +7920 +8FE0 +F920 +4FE0 +FAA0 +4FE0 +5920 +6BA0 +4D60 +ENDCHAR +STARTCHAR U_9568 +ENCODING 38248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4FE0 +7AA0 +86C0 +FFE0 +2000 +F7C0 +2440 +2FC0 +3440 +27C0 +ENDCHAR +STARTCHAR U_9569 +ENCODING 38249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7AA0 +8540 +F7C0 +4540 +FFE0 +4920 +5FE0 +6100 +4100 +ENDCHAR +STARTCHAR U_956A +ENCODING 38250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4DE0 +4520 +7DE0 +8880 +FBE0 +2EA0 +F2A0 +23E0 +2A80 +32A0 +2DE0 +ENDCHAR +STARTCHAR U_956B +ENCODING 38251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F40 +4AA0 +7440 +87A0 +F800 +47C0 +F440 +47C0 +5440 +6280 +4FE0 +ENDCHAR +STARTCHAR U_956C +ENCODING 38252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +7240 +87E0 +FC80 +27E0 +FC80 +27E0 +2A40 +3180 +2660 +ENDCHAR +STARTCHAR U_956D +ENCODING 38253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +7FE0 +8920 +FBA0 +2540 +FFE0 +2520 +2FE0 +3520 +27E0 +ENDCHAR +STARTCHAR U_956E +ENCODING 38254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +77C0 +8000 +FFE0 +4000 +F7C0 +4440 +47C0 +6C80 +5660 +ENDCHAR +STARTCHAR U_956F +ENCODING 38255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4AA0 +7FE0 +8400 +FBE0 +4220 +FFA0 +4AA0 +5FA0 +62A0 +4FC0 +ENDCHAR +STARTCHAR U_9570 +ENCODING 38256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7A80 +8FE0 +FAA0 +4FE0 +FAA0 +4FE0 +5A80 +66C0 +4AA0 +ENDCHAR +STARTCHAR U_9571 +ENCODING 38257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7280 +8FE0 +F440 +47C0 +F440 +47C0 +52A0 +6660 +49C0 +ENDCHAR +STARTCHAR U_9572 +ENCODING 38258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7820 +87E0 +FAA0 +4A40 +F7E0 +4800 +5FE0 +6540 +4B20 +ENDCHAR +STARTCHAR U_9573 +ENCODING 38259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7A80 +8FE0 +FAA0 +4FE0 +FA80 +4BA0 +5BE0 +6D40 +4AA0 +ENDCHAR +STARTCHAR U_9574 +ENCODING 38260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +4A80 +7540 +8FC0 +FAC0 +4F40 +FAC0 +4F40 +4AC0 +6F60 +4A20 +ENDCHAR +STARTCHAR U_9575 +ENCODING 38261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4FC0 +7440 +87C0 +F6C0 +44A0 +F7E0 +4D40 +47C0 +62A0 +4CE0 +ENDCHAR +STARTCHAR U_9576 +ENCODING 38262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7AA0 +8EE0 +F280 +4FE0 +F280 +4FE0 +54A0 +6D40 +4620 +ENDCHAR +STARTCHAR U_9577 +ENCODING 38263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2000 +3F00 +2000 +3F00 +2000 +FFC0 +2480 +2300 +2900 +30C0 +ENDCHAR +STARTCHAR U_9578 +ENCODING 38264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FC0 +1000 +1F80 +1000 +1FC0 +1000 +FFE0 +0800 +1080 +3FC0 +0040 +ENDCHAR +STARTCHAR U_9579 +ENCODING 38265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +4100 +79C0 +4240 +7C40 +4080 +FC80 +2140 +4940 +FE20 +0420 +ENDCHAR +STARTCHAR U_957A +ENCODING 38266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4380 +7880 +4080 +7BE0 +4080 +FC80 +2880 +4540 +FA20 +0420 +ENDCHAR +STARTCHAR U_957B +ENCODING 38267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4280 +7BE0 +4480 +7880 +43E0 +FC80 +2880 +4540 +FA20 +0420 +ENDCHAR +STARTCHAR U_957C +ENCODING 38268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +F7E0 +8480 +F6A0 +86A0 +FFE0 +4480 +96A0 +FFE0 +0A20 +ENDCHAR +STARTCHAR U_957D +ENCODING 38269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +47E0 +7CA0 +43C0 +7E60 +43C0 +FA40 +23C0 +4B40 +F520 +0B20 +ENDCHAR +STARTCHAR U_957E +ENCODING 38270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +4540 +7920 +4FE0 +7BA0 +4D60 +FBA0 +2D60 +5BA0 +F920 +0840 +ENDCHAR +STARTCHAR U_957F +ENCODING 38271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +2200 +2400 +2800 +3000 +FFC0 +2800 +2400 +2200 +2900 +30C0 +ENDCHAR +STARTCHAR U_9580 +ENCODING 38272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_9581 +ENCODING 38273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8920 +F9E0 +8920 +F9E0 +8020 +8220 +8220 +8420 +88A0 +8040 +ENDCHAR +STARTCHAR U_9582 +ENCODING 38274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8040 +8040 +BF40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_9583 +ENCODING 38275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +8840 +8840 +8840 +9440 +A340 +80C0 +ENDCHAR +STARTCHAR U_9584 +ENCODING 38276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +AA80 +EE80 +AA80 +EE80 +8280 +8280 +8280 +8340 +8240 +8620 +ENDCHAR +STARTCHAR U_9585 +ENCODING 38277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +8920 +F9E0 +8920 +F9E0 +8020 +BFA0 +8420 +9420 +88A0 +8040 +ENDCHAR +STARTCHAR U_9586 +ENCODING 38278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BF20 +8020 +9E20 +8020 +BF60 +ENDCHAR +STARTCHAR U_9587 +ENCODING 38279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BFA0 +8820 +8A20 +8920 +8860 +ENDCHAR +STARTCHAR U_9588 +ENCODING 38280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +9F20 +8420 +BFA0 +8420 +8460 +ENDCHAR +STARTCHAR U_9589 +ENCODING 38281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8220 +BFA0 +8A20 +9220 +A220 +86E0 +ENDCHAR +STARTCHAR U_958A +ENCODING 38282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +9520 +9520 +9F20 +80A0 +8040 +ENDCHAR +STARTCHAR U_958B +ENCODING 38283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +9F20 +8A20 +BFA0 +8A20 +92E0 +ENDCHAR +STARTCHAR U_958C +ENCODING 38284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8020 +9E20 +92A0 +A3E0 +ENDCHAR +STARTCHAR U_958D +ENCODING 38285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8820 +8F20 +9120 +A660 +ENDCHAR +STARTCHAR U_958E +ENCODING 38286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8A20 +9420 +A920 +8EE0 +ENDCHAR +STARTCHAR U_958F +ENCODING 38287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BFA0 +8420 +9F20 +8420 +BFE0 +ENDCHAR +STARTCHAR U_9590 +ENCODING 38288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8820 +BF20 +8820 +BF20 +88A0 +8FA0 +ENDCHAR +STARTCHAR U_9591 +ENCODING 38289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8420 +8E20 +9520 +A4E0 +ENDCHAR +STARTCHAR U_9592 +ENCODING 38290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +9F20 +9120 +A360 +ENDCHAR +STARTCHAR U_9593 +ENCODING 38291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +9F20 +9120 +9F20 +80E0 +ENDCHAR +STARTCHAR U_9594 +ENCODING 38292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +8A20 +8420 +8A20 +B160 +ENDCHAR +STARTCHAR U_9595 +ENCODING 38293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8F20 +9220 +9F20 +8620 +8A20 +9640 +ENDCHAR +STARTCHAR U_9596 +ENCODING 38294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +84A0 +B520 +9620 +9520 +A4A0 +8860 +ENDCHAR +STARTCHAR U_9597 +ENCODING 38295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8A20 +9620 +8A20 +BFA0 +8220 +8240 +ENDCHAR +STARTCHAR U_9598 +ENCODING 38296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9520 +9F20 +9520 +9F20 +8420 +8460 +ENDCHAR +STARTCHAR U_9599 +ENCODING 38297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8420 +BFE0 +8420 +BFA0 +A4A0 +A4A0 +A5A0 +8460 +ENDCHAR +STARTCHAR U_959A +ENCODING 38298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FBC0 +8A40 +FBC0 +8A40 +FBC0 +8440 +BF40 +9140 +8A40 +BF40 +80C0 +ENDCHAR +STARTCHAR U_959B +ENCODING 38299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +BFA0 +A4A0 +9520 +BFA0 +8420 +8460 +ENDCHAR +STARTCHAR U_959C +ENCODING 38300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +BFA0 +8120 +9D20 +9520 +9D20 +8360 +ENDCHAR +STARTCHAR U_959D +ENCODING 38301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F5E0 +8A20 +9520 +EEE0 +8220 +8C20 +8440 +ENDCHAR +STARTCHAR U_959E +ENCODING 38302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +9F20 +9220 +BFA0 +9220 +A260 +ENDCHAR +STARTCHAR U_959F +ENCODING 38303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8D20 +AAA0 +AC60 +8920 +B720 +8060 +ENDCHAR +STARTCHAR U_95A0 +ENCODING 38304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +8420 +9F20 +8520 +BFA0 +8040 +ENDCHAR +STARTCHAR U_95A1 +ENCODING 38305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +9520 +8A20 +9520 +8960 +ENDCHAR +STARTCHAR U_95A2 +ENCODING 38306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +FBE0 +8A20 +FBE0 +9120 +BFA0 +8420 +BFA0 +8A20 +B1A0 +8040 +ENDCHAR +STARTCHAR U_95A3 +ENCODING 38307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F3C0 +9240 +F3C0 +9240 +F3C0 +9E40 +9440 +8A40 +BF40 +9240 +9EC0 +ENDCHAR +STARTCHAR U_95A4 +ENCODING 38308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8E20 +9520 +E0E0 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_95A5 +ENCODING 38309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9520 +BFA0 +D520 +92A0 +95A0 +98E0 +ENDCHAR +STARTCHAR U_95A6 +ENCODING 38310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BBA0 +9220 +9220 +ADA0 +8040 +ENDCHAR +STARTCHAR U_95A7 +ENCODING 38311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +8A20 +9F20 +8A20 +BFA0 +9120 +A0E0 +ENDCHAR +STARTCHAR U_95A8 +ENCODING 38312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +BFA0 +8420 +9F20 +8420 +BFE0 +ENDCHAR +STARTCHAR U_95A9 +ENCODING 38313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +BFA0 +A4A0 +BFA0 +8520 +BEE0 +ENDCHAR +STARTCHAR U_95AA +ENCODING 38314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +9F20 +8A20 +BFA0 +AAA0 +BFA0 +8040 +ENDCHAR +STARTCHAR U_95AB +ENCODING 38315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +A4A0 +BFA0 +A4A0 +AEA0 +B5A0 +BFE0 +ENDCHAR +STARTCHAR U_95AC +ENCODING 38316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +9F20 +92A0 +99E0 +ENDCHAR +STARTCHAR U_95AD +ENCODING 38317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +BFA0 +A0A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_95AE +ENCODING 38318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +9BA0 +A920 +97A0 +A820 +C7E0 +ENDCHAR +STARTCHAR U_95AF +ENCODING 38319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +A220 +DAA0 +AA60 +9120 +E220 +AC40 +ENDCHAR +STARTCHAR U_95B0 +ENCODING 38320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8820 +B3A0 +A0A0 +BBA0 +A0A0 +BFE0 +ENDCHAR +STARTCHAR U_95B1 +ENCODING 38321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +BFA0 +9120 +9F20 +8AA0 +B3E0 +ENDCHAR +STARTCHAR U_95B2 +ENCODING 38322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +9F20 +8AA0 +B3A0 +8060 +ENDCHAR +STARTCHAR U_95B3 +ENCODING 38323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F5E0 +BFA0 +9520 +9F20 +9520 +BFA0 +8440 +ENDCHAR +STARTCHAR U_95B4 +ENCODING 38324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +9F20 +8A20 +9140 +ENDCHAR +STARTCHAR U_95B5 +ENCODING 38325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9220 +BFA0 +D220 +9FA0 +9220 +9FE0 +ENDCHAR +STARTCHAR U_95B6 +ENCODING 38326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +BFA0 +A4A0 +BFA0 +ENDCHAR +STARTCHAR U_95B7 +ENCODING 38327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AEE0 +4AA0 +AEE0 +5AA0 +4EE0 +F920 +4920 +E9A0 +5A60 +4C20 +4860 +ENDCHAR +STARTCHAR U_95B8 +ENCODING 38328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F1E0 +BFA0 +8A20 +9120 +8A20 +BFA0 +8040 +ENDCHAR +STARTCHAR U_95B9 +ENCODING 38329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9520 +BFA0 +D560 +9F20 +84A0 +83A0 +ENDCHAR +STARTCHAR U_95BA +ENCODING 38330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +F1E0 +9F20 +9120 +FFA0 +9220 +8C20 +B360 +ENDCHAR +STARTCHAR U_95BB +ENCODING 38331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +BB20 +9120 +9B20 +9120 +9F60 +ENDCHAR +STARTCHAR U_95BC +ENCODING 38332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9120 +FEA0 +9160 +9CA0 +A520 +CCE0 +ENDCHAR +STARTCHAR U_95BD +ENCODING 38333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9220 +9FA0 +9120 +9FA0 +9120 +9F60 +ENDCHAR +STARTCHAR U_95BE +ENCODING 38334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8520 +BFA0 +AB20 +BAA0 +83A0 +BCE0 +ENDCHAR +STARTCHAR U_95BF +ENCODING 38335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +94A0 +8B20 +BFA0 +AAA0 +8620 +B9A0 +ENDCHAR +STARTCHAR U_95C0 +ENCODING 38336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +FFA0 +AAA0 +CE60 +88A0 +87E0 +ENDCHAR +STARTCHAR U_95C1 +ENCODING 38337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8020 +BBA0 +AAA0 +BBA0 +A0A0 +8060 +ENDCHAR +STARTCHAR U_95C2 +ENCODING 38338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9520 +BFA0 +8420 +FFE0 +99A0 +AF60 +ENDCHAR +STARTCHAR U_95C3 +ENCODING 38339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_95C4 +ENCODING 38340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9F20 +9520 +BFA0 +8A20 +8420 +9B60 +ENDCHAR +STARTCHAR U_95C5 +ENCODING 38341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +9520 +9FA0 +8420 +BFA0 +8920 +8620 +B9A0 +ENDCHAR +STARTCHAR U_95C6 +ENCODING 38342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +8020 +BBA0 +AAA0 +BBE0 +ENDCHAR +STARTCHAR U_95C7 +ENCODING 38343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +BFA0 +9120 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_95C8 +ENCODING 38344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +8920 +BFA0 +9120 +BFA0 +9420 +BFA0 +8460 +ENDCHAR +STARTCHAR U_95C9 +ENCODING 38345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BFA0 +AAA0 +B1A0 +BFA0 +8420 +9F20 +8420 +BFA0 +ENDCHAR +STARTCHAR U_95CA +ENCODING 38346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9220 +AFA0 +9220 +B7A0 +94A0 +97E0 +ENDCHAR +STARTCHAR U_95CB +ENCODING 38347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +AAA0 +AF20 +94A0 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_95CC +ENCODING 38348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +8420 +FFE0 +AAA0 +BFA0 +9520 +E4E0 +ENDCHAR +STARTCHAR U_95CD +ENCODING 38349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8A20 +BFA0 +9920 +AF20 +8920 +8F60 +ENDCHAR +STARTCHAR U_95CE +ENCODING 38350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +F780 +9480 +F780 +9480 +FF80 +AA80 +BE80 +8B80 +EC80 +AA80 +D900 +ENDCHAR +STARTCHAR U_95CF +ENCODING 38351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8020 +BFA0 +A4A0 +BFA0 +B5A0 +BFA0 +A4A0 +DF60 +ENDCHAR +STARTCHAR U_95D0 +ENCODING 38352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BFA0 +9120 +9D20 +9720 +9120 +BFA0 +8A20 +B1A0 +ENDCHAR +STARTCHAR U_95D1 +ENCODING 38353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9120 +9F20 +9120 +BFA0 +9520 +E4E0 +ENDCHAR +STARTCHAR U_95D2 +ENCODING 38354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +F1E0 +9F20 +9120 +BFA0 +AAA0 +99A0 +AAE0 +ENDCHAR +STARTCHAR U_95D3 +ENCODING 38355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +A4A0 +BFA0 +9120 +9F20 +8A20 +BFA0 +ENDCHAR +STARTCHAR U_95D4 +ENCODING 38356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +8420 +BFA0 +9120 +BFA0 +AAA0 +BFA0 +ENDCHAR +STARTCHAR U_95D5 +ENCODING 38357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +AA20 +FFE0 +9560 +FD20 +92A0 +A460 +ENDCHAR +STARTCHAR U_95D6 +ENCODING 38358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +9420 +9F20 +9420 +9FA0 +AAA0 +D560 +ENDCHAR +STARTCHAR U_95D7 +ENCODING 38359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +88A0 +9120 +BBE0 +9120 +A260 +BBA0 +AAA0 +D560 +ENDCHAR +STARTCHAR U_95D8 +ENCODING 38360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8020 +BCA0 +83E0 +BCA0 +A7A0 +BCA0 +95A0 +BE60 +ENDCHAR +STARTCHAR U_95D9 +ENCODING 38361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9220 +BBA0 +AEA0 +B920 +A2A0 +DF60 +9120 +9F60 +ENDCHAR +STARTCHAR U_95DA +ENCODING 38362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FFE0 +94A0 +BFA0 +94A0 +FFA0 +AAA0 +C4E0 +ENDCHAR +STARTCHAR U_95DB +ENCODING 38363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9520 +BFA0 +A0A0 +9F20 +9120 +BFA0 +8420 +FFE0 +ENDCHAR +STARTCHAR U_95DC +ENCODING 38364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +F5E0 +AAA0 +BBA0 +AAA0 +BBA0 +8A20 +B260 +ENDCHAR +STARTCHAR U_95DD +ENCODING 38365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +AA20 +BBA0 +AEA0 +B920 +92A0 +AC60 +ENDCHAR +STARTCHAR U_95DE +ENCODING 38366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9220 +FFA0 +AAA0 +B920 +AAA0 +FC60 +ENDCHAR +STARTCHAR U_95DF +ENCODING 38367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FFE0 +9120 +BFA0 +D160 +9F20 +BFA0 +AAA0 +99A0 +AAE0 +ENDCHAR +STARTCHAR U_95E0 +ENCODING 38368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +9F20 +9520 +BFA0 +9120 +9F20 +9120 +9F20 +F1E0 +ENDCHAR +STARTCHAR U_95E1 +ENCODING 38369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BBA0 +AAA0 +BFA0 +A4A0 +BFA0 +A4A0 +FFE0 +8420 +ENDCHAR +STARTCHAR U_95E2 +ENCODING 38370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8120 +BBA0 +AAA0 +B920 +EFE0 +A920 +ABA0 +B960 +ENDCHAR +STARTCHAR U_95E3 +ENCODING 38371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +A4A0 +9520 +BFA0 +AAA0 +8A20 +9F20 +9520 +9F60 +ENDCHAR +STARTCHAR U_95E4 +ENCODING 38372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +BFA0 +AAA0 +BFA0 +9120 +9F20 +8AA0 +B920 +8CE0 +ENDCHAR +STARTCHAR U_95E5 +ENCODING 38373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8220 +AFA0 +9520 +FFA0 +9220 +9FA0 +9220 +AFA0 +ENDCHAR +STARTCHAR U_95E6 +ENCODING 38374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +BFA0 +AAA0 +FFE0 +9120 +9F20 +8A20 +BF60 +ENDCHAR +STARTCHAR U_95E7 +ENCODING 38375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8720 +A220 +9FA0 +B2A0 +9720 +9AA0 +AFA0 +8060 +ENDCHAR +STARTCHAR U_95E8 +ENCODING 38376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95E9 +ENCODING 38377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +8040 +8040 +BF40 +8040 +8040 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95EA +ENCODING 38378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8840 +8840 +8840 +8C40 +9240 +A140 +C040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95EB +ENCODING 38379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +5FC0 +2040 +8040 +BF40 +8040 +8040 +9E40 +8040 +8040 +BF40 +80C0 +ENDCHAR +STARTCHAR U_95EC +ENCODING 38380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +4000 +2F80 +8080 +BE80 +8880 +8880 +BE80 +8880 +8880 +8880 +8180 +ENDCHAR +STARTCHAR U_95ED +ENCODING 38381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2020 +8220 +8220 +BFA0 +8620 +8A20 +9220 +A220 +8620 +80E0 +ENDCHAR +STARTCHAR U_95EE +ENCODING 38382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +9E40 +9240 +9240 +9240 +9E40 +8040 +8040 +81C0 +ENDCHAR +STARTCHAR U_95EF +ENCODING 38383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8FC0 +4040 +BE40 +9240 +9240 +9F40 +8140 +BD40 +8140 +8640 +80C0 +ENDCHAR +STARTCHAR U_95F0 +ENCODING 38384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +8020 +9F20 +8420 +8420 +9F20 +8420 +8420 +BFA0 +80E0 +ENDCHAR +STARTCHAR U_95F1 +ENCODING 38385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +BFA0 +8420 +9F20 +8420 +BFA0 +84A0 +85A0 +80E0 +ENDCHAR +STARTCHAR U_95F2 +ENCODING 38386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +8420 +BFA0 +8420 +8E20 +9520 +A4A0 +8420 +80E0 +ENDCHAR +STARTCHAR U_95F3 +ENCODING 38387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +8420 +BFA0 +8A20 +9220 +A520 +8FA0 +80A0 +8060 +ENDCHAR +STARTCHAR U_95F4 +ENCODING 38388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8040 +9E40 +9240 +9E40 +9240 +9240 +9E40 +8040 +81C0 +ENDCHAR +STARTCHAR U_95F5 +ENCODING 38389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +8420 +BFA0 +8220 +8A20 +8420 +8A20 +9120 +A120 +8060 +ENDCHAR +STARTCHAR U_95F6 +ENCODING 38390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +BFA0 +8020 +8E20 +8A20 +8AA0 +92A0 +A1A0 +8060 +ENDCHAR +STARTCHAR U_95F7 +ENCODING 38391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +1020 +8420 +8A20 +8820 +A920 +A8A0 +C920 +8720 +8020 +80E0 +ENDCHAR +STARTCHAR U_95F8 +ENCODING 38392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +BF40 +A940 +BF40 +A940 +BF40 +A940 +8840 +8840 +80C0 +ENDCHAR +STARTCHAR U_95F9 +ENCODING 38393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +BFA0 +8420 +BFA0 +A4A0 +A4A0 +A5A0 +8420 +8060 +ENDCHAR +STARTCHAR U_95FA +ENCODING 38394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8420 +9F20 +8420 +BFA0 +8420 +9F20 +8420 +BFA0 +8060 +ENDCHAR +STARTCHAR U_95FB +ENCODING 38395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +BF40 +9240 +9E40 +9240 +9E40 +9340 +BE40 +8240 +80C0 +ENDCHAR +STARTCHAR U_95FC +ENCODING 38396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +C240 +AF40 +8240 +F240 +9540 +98C0 +A840 +C740 +80C0 +ENDCHAR +STARTCHAR U_95FD +ENCODING 38397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +8840 +BF40 +A940 +A940 +BF40 +8840 +8940 +BF40 +80C0 +ENDCHAR +STARTCHAR U_95FE +ENCODING 38398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +2040 +9E40 +9240 +9E40 +8040 +BF40 +A140 +BF40 +8040 +80C0 +ENDCHAR +STARTCHAR U_95FF +ENCODING 38399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +BF80 +0080 +AA80 +BE80 +8080 +BC80 +8480 +BC80 +A280 +9E80 +8180 +ENDCHAR +STARTCHAR U_9600 +ENCODING 38400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8D20 +94A0 +9FE0 +B420 +D520 +92A0 +95A0 +98A0 +8060 +ENDCHAR +STARTCHAR U_9601 +ENCODING 38401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4820 +0F20 +9920 +A620 +8920 +BFA0 +9120 +9F20 +9120 +8060 +ENDCHAR +STARTCHAR U_9602 +ENCODING 38402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8420 +BFA0 +8920 +9E20 +84A0 +9920 +8620 +99A0 +8060 +ENDCHAR +STARTCHAR U_9603 +ENCODING 38403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +BFA0 +A4A0 +BFA0 +A4A0 +AEA0 +B5A0 +A4A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_9604 +ENCODING 38404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +A040 +9C40 +A440 +FE40 +AA40 +BE40 +AA40 +BE40 +8940 +87C0 +ENDCHAR +STARTCHAR U_9605 +ENCODING 38405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +9120 +8A20 +9F20 +9120 +9F20 +8A20 +8AA0 +B1A0 +8060 +ENDCHAR +STARTCHAR U_9606 +ENCODING 38406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +5FC0 +2040 +8840 +BE40 +A240 +BE40 +A240 +BE40 +A940 +B640 +81C0 +ENDCHAR +STARTCHAR U_9607 +ENCODING 38407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +44A0 +9FA0 +8520 +BFE0 +8820 +9F20 +A920 +8F20 +8920 +8F60 +ENDCHAR +STARTCHAR U_9608 +ENCODING 38408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1120 +82A0 +BFE0 +8220 +BAA0 +AAA0 +B920 +8120 +BAA0 +8460 +ENDCHAR +STARTCHAR U_9609 +ENCODING 38409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1420 +FFA0 +8920 +BFA0 +D560 +9F20 +9520 +9F20 +84A0 +83E0 +ENDCHAR +STARTCHAR U_960A +ENCODING 38410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +9120 +9F20 +9120 +BFA0 +A0A0 +BFA0 +A0A0 +BFE0 +ENDCHAR +STARTCHAR U_960B +ENCODING 38411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +8820 +B3A0 +A0A0 +BBA0 +A0A0 +BFA0 +8A20 +8AA0 +B1E0 +ENDCHAR +STARTCHAR U_960C +ENCODING 38412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9FA0 +A4A0 +9520 +BFA0 +A0A0 +9F20 +9220 +8C20 +B360 +ENDCHAR +STARTCHAR U_960D +ENCODING 38413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +20A0 +9F20 +9220 +9FA0 +9120 +9FA0 +9120 +9F20 +9120 +9F60 +ENDCHAR +STARTCHAR U_960E +ENCODING 38414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9020 +8820 +9F20 +A220 +9BA0 +A0A0 +BBA0 +A0A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_960F +ENCODING 38415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1020 +8920 +BDA0 +9260 +9D20 +94A0 +9420 +9520 +A4A0 +C860 +ENDCHAR +STARTCHAR U_9610 +ENCODING 38416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +9120 +BFA0 +A4A0 +BFA0 +A4A0 +BFA0 +8420 +BFA0 +8420 +8060 +ENDCHAR +STARTCHAR U_9611 +ENCODING 38417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2420 +BFA0 +8420 +BFA0 +AAA0 +BFA0 +8E20 +9520 +A4A0 +8060 +ENDCHAR +STARTCHAR U_9612 +ENCODING 38418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +9120 +9F20 +9120 +9F20 +8520 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_9613 +ENCODING 38419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4420 +1F20 +9520 +FFE0 +8020 +9F20 +9520 +9520 +8A20 +B160 +ENDCHAR +STARTCHAR U_9614 +ENCODING 38420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +A1A0 +9620 +C220 +AFA0 +9220 +AFA0 +E8A0 +AFA0 +A060 +ENDCHAR +STARTCHAR U_9615 +ENCODING 38421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +AAA0 +9120 +9EA0 +A460 +BFA0 +8420 +8A20 +9160 +ENDCHAR +STARTCHAR U_9616 +ENCODING 38422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +9420 +9F20 +8420 +BFA0 +8920 +9FA0 +8020 +BFA0 +AAA0 +BFE0 +ENDCHAR +STARTCHAR U_9617 +ENCODING 38423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +9420 +BFA0 +8420 +9F20 +9120 +9F20 +9120 +BFA0 +8A20 +B1E0 +ENDCHAR +STARTCHAR U_9618 +ENCODING 38424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +9F20 +9520 +9F20 +8020 +BFA0 +96A0 +8DA0 +96A0 +ADE0 +ENDCHAR +STARTCHAR U_9619 +ENCODING 38425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +AA20 +9220 +FFE0 +9560 +D520 +FD20 +92A0 +A4A0 +C060 +ENDCHAR +STARTCHAR U_961A +ENCODING 38426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2020 +BA20 +8A20 +BFE0 +AAA0 +BAA0 +AAA0 +B920 +AAA0 +FC60 +ENDCHAR +STARTCHAR U_961B +ENCODING 38427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9FE0 +4020 +BFA0 +AAA0 +FFE0 +9120 +9F20 +8D20 +9A20 +EDA0 +8860 +ENDCHAR +STARTCHAR U_961C +ENCODING 38428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7F80 +4000 +7FC0 +4040 +7FC0 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_961D +ENCODING 38429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +F8 +88 +90 +A0 +90 +88 +88 +C8 +B0 +80 +80 +ENDCHAR +STARTCHAR U_961E +ENCODING 38430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +AFE0 +C120 +A120 +9120 +9120 +D220 +A220 +84A0 +9840 +ENDCHAR +STARTCHAR U_961F +ENCODING 38431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A100 +C100 +A100 +9100 +9100 +D280 +A280 +8440 +9820 +ENDCHAR +STARTCHAR U_9620 +ENCODING 38432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +9280 +A280 +C280 +A280 +9F80 +9280 +F2A0 +A2A0 +8260 +8220 +ENDCHAR +STARTCHAR U_9621 +ENCODING 38433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +9700 +A100 +C100 +AFE0 +9100 +9100 +F100 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_9622 +ENCODING 38434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9280 +A280 +C280 +A280 +9280 +9280 +F280 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_9623 +ENCODING 38435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +9400 +A7E0 +C800 +A780 +9080 +9100 +F200 +A420 +8420 +83E0 +ENDCHAR +STARTCHAR U_9624 +ENCODING 38436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9520 +A560 +C5A0 +A720 +9D20 +9560 +F500 +A420 +8420 +83E0 +ENDCHAR +STARTCHAR U_9625 +ENCODING 38437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A200 +A240 +DB80 +AB00 +AA80 +AA80 +CA40 +9220 +A200 +8600 +ENDCHAR +STARTCHAR U_9626 +ENCODING 38438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +A240 +CA80 +AB00 +9200 +D200 +A500 +8500 +8880 +9060 +ENDCHAR +STARTCHAR U_9627 +ENCODING 38439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9480 +A280 +C880 +A480 +94E0 +D380 +AC80 +8080 +8080 +8080 +ENDCHAR +STARTCHAR U_9628 +ENCODING 38440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9400 +A5E0 +C520 +A520 +9520 +9560 +F500 +A520 +8920 +90E0 +ENDCHAR +STARTCHAR U_9629 +ENCODING 38441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9C80 +A480 +C480 +AFE0 +9480 +D480 +A480 +8480 +8880 +9080 +ENDCHAR +STARTCHAR U_962A +ENCODING 38442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +9780 +A400 +C7E0 +A540 +9540 +9540 +F540 +A480 +8940 +9220 +ENDCHAR +STARTCHAR U_962B +ENCODING 38443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +9FE0 +A080 +A100 +9300 +D580 +A960 +9120 +8100 +8100 +8100 +ENDCHAR +STARTCHAR U_962C +ENCODING 38444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C000 +A780 +9480 +9480 +F480 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_962D +ENCODING 38445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9200 +A440 +CFA0 +A020 +9480 +9480 +F480 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_962E +ENCODING 38446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +A000 +CFE0 +A280 +9280 +9280 +F280 +A2A0 +84A0 +9860 +ENDCHAR +STARTCHAR U_962F +ENCODING 38447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +9080 +A080 +C480 +A4E0 +9480 +9480 +F480 +A480 +8480 +9FE0 +ENDCHAR +STARTCHAR U_9630 +ENCODING 38448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +9480 +A480 +C4A0 +A7C0 +9480 +9480 +F480 +A5A0 +86A0 +8C60 +ENDCHAR +STARTCHAR U_9631 +ENCODING 38449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +A7E0 +C240 +A240 +9240 +9FE0 +F240 +A240 +8440 +8840 +ENDCHAR +STARTCHAR U_9632 +ENCODING 38450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C200 +A3C0 +9240 +9240 +D240 +A440 +8840 +9180 +ENDCHAR +STARTCHAR U_9633 +ENCODING 38451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A420 +C420 +A7E0 +9420 +9420 +D420 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_9634 +ENCODING 38452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +9220 +A220 +C3E0 +A220 +9220 +93E0 +D220 +A220 +8420 +88E0 +ENDCHAR +STARTCHAR U_9635 +ENCODING 38453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +A400 +C500 +AFC0 +9100 +9100 +DFE0 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_9636 +ENCODING 38454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A280 +C440 +A820 +9240 +9240 +D240 +A240 +8440 +8840 +ENDCHAR +STARTCHAR U_9637 +ENCODING 38455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A100 +A100 +C100 +A9C0 +A900 +A900 +C900 +8900 +BFE0 +8000 +ENDCHAR +STARTCHAR U_9638 +ENCODING 38456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFC0 +A840 +CFC0 +A800 +AFC0 +A880 +C900 +9220 +9420 +A3E0 +ENDCHAR +STARTCHAR U_9639 +ENCODING 38457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7C0 +C100 +A100 +9FE0 +9200 +F200 +A440 +8FA0 +8420 +ENDCHAR +STARTCHAR U_963A +ENCODING 38458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +9780 +A480 +C480 +A7E0 +9480 +9480 +F4A0 +A560 +8EA0 +84A0 +ENDCHAR +STARTCHAR U_963B +ENCODING 38459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A440 +C7C0 +A440 +9440 +9440 +D7C0 +A440 +8440 +9FE0 +ENDCHAR +STARTCHAR U_963C +ENCODING 38460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9200 +A3E0 +C500 +A9E0 +9100 +9100 +F1E0 +A100 +8100 +8100 +ENDCHAR +STARTCHAR U_963D +ENCODING 38461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A1E0 +C100 +A100 +97E0 +9420 +F420 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_963E +ENCODING 38462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A200 +A500 +C880 +B260 +A200 +AFC0 +C080 +8500 +8200 +8100 +ENDCHAR +STARTCHAR U_963F +ENCODING 38463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9040 +A040 +A740 +A540 +9540 +9540 +D740 +A040 +8040 +80C0 +ENDCHAR +STARTCHAR U_9640 +ENCODING 38464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C820 +A200 +9240 +9280 +D300 +A220 +8220 +81E0 +ENDCHAR +STARTCHAR U_9641 +ENCODING 38465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E800 +AFE0 +B000 +C240 +ABC0 +AE40 +BB40 +AA80 +CA20 +8820 +87E0 +ENDCHAR +STARTCHAR U_9642 +ENCODING 38466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7E0 +C520 +A500 +97C0 +9540 +F540 +A480 +8940 +9620 +ENDCHAR +STARTCHAR U_9643 +ENCODING 38467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9100 +A100 +C7E0 +A520 +95A0 +9560 +F620 +A420 +8420 +84E0 +ENDCHAR +STARTCHAR U_9644 +ENCODING 38468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9240 +A440 +C7E0 +AC40 +9540 +94C0 +D440 +A440 +8440 +84C0 +ENDCHAR +STARTCHAR U_9645 +ENCODING 38469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +A000 +CFE0 +A100 +9540 +9540 +D520 +A920 +8100 +8300 +ENDCHAR +STARTCHAR U_9646 +ENCODING 38470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +C100 +AFE0 +9100 +9520 +F520 +A520 +87E0 +8420 +ENDCHAR +STARTCHAR U_9647 +ENCODING 38471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9240 +AFE0 +C200 +A300 +9540 +9540 +D580 +A920 +8B20 +94E0 +ENDCHAR +STARTCHAR U_9648 +ENCODING 38472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +A400 +C500 +AFE0 +9100 +9580 +F540 +A920 +9520 +8200 +ENDCHAR +STARTCHAR U_9649 +ENCODING 38473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9040 +A080 +C140 +A620 +9000 +97C0 +F100 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_964A +ENCODING 38474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93E0 +A440 +CA80 +A100 +9700 +91E0 +F640 +A180 +8100 +8E00 +ENDCHAR +STARTCHAR U_964B +ENCODING 38475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7E0 +A080 +A3E0 +AAA0 +CAA0 +AB60 +AA20 +AA20 +EA60 +8800 +8FE0 +ENDCHAR +STARTCHAR U_964C +ENCODING 38476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9080 +A100 +C7E0 +A420 +9420 +97E0 +F420 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_964D +ENCODING 38477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +A640 +C180 +A660 +9100 +97E0 +D500 +AFE0 +8100 +8100 +ENDCHAR +STARTCHAR U_964E +ENCODING 38478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F500 +9500 +A7C0 +C900 +A100 +9FE0 +9100 +F380 +A540 +8920 +9120 +ENDCHAR +STARTCHAR U_964F +ENCODING 38479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A200 +C3E0 +A620 +9BE0 +9220 +F3E0 +A220 +8220 +8260 +ENDCHAR +STARTCHAR U_9650 +ENCODING 38480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C440 +A7C0 +9500 +9520 +D540 +A480 +8540 +8620 +ENDCHAR +STARTCHAR U_9651 +ENCODING 38481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +A200 +CFE0 +AAA0 +9AA0 +9AA0 +FAA0 +AAA0 +8A20 +8860 +ENDCHAR +STARTCHAR U_9652 +ENCODING 38482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A3C0 +C480 +BFE0 +A800 +AFC0 +EA40 +8AC0 +8A00 +9220 +A1E0 +ENDCHAR +STARTCHAR U_9653 +ENCODING 38483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +A480 +CB40 +A020 +9FE0 +9200 +F7C0 +A040 +8240 +8180 +ENDCHAR +STARTCHAR U_9654 +ENCODING 38484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9100 +AFE0 +C200 +A440 +9780 +9120 +F240 +AC80 +8160 +8E20 +ENDCHAR +STARTCHAR U_9655 +ENCODING 38485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A920 +C540 +A580 +9FE0 +D100 +A280 +8280 +8440 +8820 +ENDCHAR +STARTCHAR U_9656 +ENCODING 38486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A480 +CFC0 +A480 +AA40 +B3A0 +E480 +8A80 +8100 +8280 +8C60 +ENDCHAR +STARTCHAR U_9657 +ENCODING 38487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +AA40 +A680 +CFC0 +A840 +AFC0 +A840 +EFC0 +8840 +8940 +8880 +ENDCHAR +STARTCHAR U_9658 +ENCODING 38488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9540 +A540 +CA80 +A540 +9540 +97C0 +F100 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_9659 +ENCODING 38489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A800 +ABC0 +C800 +AFE0 +AA80 +AAA0 +EA40 +8A40 +9340 +A220 +ENDCHAR +STARTCHAR U_965A +ENCODING 38490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +AEC0 +C0A0 +BFE0 +A280 +AB80 +AA80 +EA80 +8BA0 +9C60 +8020 +ENDCHAR +STARTCHAR U_965B +ENCODING 38491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +94A0 +A7C0 +C480 +A5A0 +96E0 +9100 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_965C +ENCODING 38492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +C540 +A540 +9BA0 +9100 +F100 +A280 +8440 +8820 +ENDCHAR +STARTCHAR U_965D +ENCODING 38493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +C980 +A540 +9BA0 +9100 +F100 +A280 +8440 +8820 +ENDCHAR +STARTCHAR U_965E +ENCODING 38494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F140 +9640 +A240 +CFE0 +A240 +9440 +9100 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_965F +ENCODING 38495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +95E0 +A500 +C500 +AFE0 +9100 +9520 +F540 +A880 +8300 +8C00 +ENDCHAR +STARTCHAR U_9660 +ENCODING 38496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E280 +BFE0 +C200 +AFC0 +AA40 +AFC0 +AA40 +EFC0 +8A40 +8A40 +8AC0 +ENDCHAR +STARTCHAR U_9661 +ENCODING 38497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9100 +A7C0 +C100 +AFE0 +9100 +95E0 +F500 +A500 +8B00 +91E0 +ENDCHAR +STARTCHAR U_9662 +ENCODING 38498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9100 +AFE0 +C820 +A7C0 +9000 +9FE0 +D480 +A4A0 +88A0 +9060 +ENDCHAR +STARTCHAR U_9663 +ENCODING 38499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +C7E0 +A520 +97E0 +9520 +F7E0 +A100 +8FE0 +8100 +ENDCHAR +STARTCHAR U_9664 +ENCODING 38500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +A440 +CBA0 +A100 +9FE0 +9100 +E540 +8920 +9120 +8300 +ENDCHAR +STARTCHAR U_9665 +ENCODING 38501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +91E0 +A240 +C480 +A000 +95E0 +D520 +A5E0 +8520 +85E0 +8520 +ENDCHAR +STARTCHAR U_9666 +ENCODING 38502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFE0 +C200 +A7C0 +A200 +BFE0 +C440 +8FE0 +9240 +A140 +8080 +ENDCHAR +STARTCHAR U_9667 +ENCODING 38503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A7E0 +C420 +A7E0 +9420 +9100 +F7E0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_9668 +ENCODING 38504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C000 +A7E0 +9420 +9520 +D520 +A520 +8280 +8C60 +ENDCHAR +STARTCHAR U_9669 +ENCODING 38505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9280 +A440 +C820 +A7C0 +9000 +9A40 +D540 +A540 +8080 +8FE0 +ENDCHAR +STARTCHAR U_966A +ENCODING 38506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +C280 +AFE0 +A000 +A7C0 +C440 +8440 +87C0 +8440 +ENDCHAR +STARTCHAR U_966B +ENCODING 38507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +9EE0 +A280 +C280 +AEE0 +9280 +9280 +FEE0 +A280 +8280 +8280 +ENDCHAR +STARTCHAR U_966C +ENCODING 38508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +ABE0 +AEA0 +AAA0 +CAA0 +AEA0 +AAA0 +AAA0 +EF40 +9AA0 +8320 +ENDCHAR +STARTCHAR U_966D +ENCODING 38509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A280 +C440 +AFE0 +9040 +9740 +F540 +A740 +8040 +81C0 +ENDCHAR +STARTCHAR U_966E +ENCODING 38510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E500 +A480 +AFE0 +C900 +BFC0 +A900 +AFC0 +E900 +8900 +8FE0 +8800 +ENDCHAR +STARTCHAR U_966F +ENCODING 38511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +A840 +B7A0 +C000 +AFE0 +AAA0 +AFE0 +EAA0 +8AA0 +8860 +ENDCHAR +STARTCHAR U_9670 +ENCODING 38512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9480 +AA40 +D120 +A780 +9100 +9FE0 +F000 +AFE0 +8440 +8FA0 +ENDCHAR +STARTCHAR U_9671 +ENCODING 38513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97E0 +A920 +C560 +A3A0 +97E0 +9320 +F5A0 +A960 +9120 +80C0 +ENDCHAR +STARTCHAR U_9672 +ENCODING 38514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9100 +AFE0 +C540 +A540 +9FE0 +9540 +F540 +AFE0 +8100 +87C0 +ENDCHAR +STARTCHAR U_9673 +ENCODING 38515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A100 +CFE0 +A920 +9FE0 +9920 +FFE0 +A540 +8920 +9120 +ENDCHAR +STARTCHAR U_9674 +ENCODING 38516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97E0 +A520 +C7E0 +A520 +97E0 +9280 +F480 +AFE0 +8080 +8080 +ENDCHAR +STARTCHAR U_9675 +ENCODING 38517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A440 +9A20 +9380 +D480 +AB00 +8280 +8C60 +ENDCHAR +STARTCHAR U_9676 +ENCODING 38518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +A7E0 +A820 +D7A0 +AA20 +AFA0 +A220 +EAA0 +8FA0 +8020 +80C0 +ENDCHAR +STARTCHAR U_9677 +ENCODING 38519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +A440 +C880 +A200 +94E0 +9420 +D6E0 +A420 +87E0 +8420 +ENDCHAR +STARTCHAR U_9678 +ENCODING 38520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A240 +9420 +9900 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_9679 +ENCODING 38521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +A480 +DFE0 +A480 +A480 +A880 +EFC0 +8840 +8FC0 +8840 +8FC0 +ENDCHAR +STARTCHAR U_967A +ENCODING 38522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +A500 +A880 +DFE0 +A200 +AF80 +AA80 +CF80 +8200 +8500 +98C0 +ENDCHAR +STARTCHAR U_967B +ENCODING 38523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A280 +AFE0 +CAA0 +AAA0 +AFE0 +A100 +E7C0 +8100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_967C +ENCODING 38524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97A0 +9120 +A140 +AFE0 +9100 +93E0 +F620 +ABE0 +8220 +83E0 +ENDCHAR +STARTCHAR U_967D +ENCODING 38525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C440 +AFE0 +9400 +97E0 +FAA0 +A4A0 +8920 +86C0 +ENDCHAR +STARTCHAR U_967E +ENCODING 38526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9200 +AFE0 +CAA0 +AAA0 +9860 +9100 +FFE0 +A100 +8280 +8C60 +ENDCHAR +STARTCHAR U_967F +ENCODING 38527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +B100 +BFE0 +D540 +B540 +BBA0 +B100 +D280 +9440 +9820 +9FE0 +ENDCHAR +STARTCHAR U_9680 +ENCODING 38528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9100 +AFE0 +C540 +A7C0 +9540 +97C0 +F100 +A7C0 +8100 +8FE0 +ENDCHAR +STARTCHAR U_9681 +ENCODING 38529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9440 +B7C0 +D440 +B7C0 +9100 +9FC0 +F280 +9100 +9280 +9FE0 +ENDCHAR +STARTCHAR U_9682 +ENCODING 38530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E300 +A480 +AFE0 +D400 +A780 +A400 +A780 +E400 +9FE0 +8480 +8FC0 +ENDCHAR +STARTCHAR U_9683 +ENCODING 38531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F380 +9440 +ABA0 +C000 +AE20 +9AA0 +9EA0 +FAA0 +AEA0 +8A20 +8AE0 +ENDCHAR +STARTCHAR U_9684 +ENCODING 38532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C440 +A7C0 +9000 +9FE0 +F500 +A5E0 +8B00 +91E0 +ENDCHAR +STARTCHAR U_9685 +ENCODING 38533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +A7C0 +C540 +A7C0 +9100 +9FE0 +D960 +AFE0 +8820 +8860 +ENDCHAR +STARTCHAR U_9686 +ENCODING 38534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +AC40 +C380 +AC60 +9500 +97E0 +F900 +A7C0 +8100 +9FE0 +ENDCHAR +STARTCHAR U_9687 +ENCODING 38535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0A0 +9FE0 +A880 +CF80 +AAA0 +AFA0 +ADA0 +ADC0 +EAA0 +9560 +A920 +ENDCHAR +STARTCHAR U_9688 +ENCODING 38536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9540 +A7C0 +C540 +A7C0 +9000 +9FE0 +F520 +A4C0 +8540 +8E20 +ENDCHAR +STARTCHAR U_9689 +ENCODING 38537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9CE0 +A820 +CEE0 +A820 +9FE0 +9000 +D7C0 +A100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_968A +ENCODING 38538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +AFE0 +C620 +A940 +9380 +9580 +FB40 +A540 +8920 +8620 +ENDCHAR +STARTCHAR U_968B +ENCODING 38539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97E0 +A200 +C3E0 +A480 +9BE0 +9220 +D3E0 +A220 +83E0 +8220 +ENDCHAR +STARTCHAR U_968C +ENCODING 38540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A440 +C280 +BFE0 +A000 +A7C0 +E440 +87C0 +8440 +87C0 +ENDCHAR +STARTCHAR U_968D +ENCODING 38541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +97C0 +A440 +A7C0 +C440 +AFE0 +9100 +97C0 +E100 +8100 +8FE0 +ENDCHAR +STARTCHAR U_968E +ENCODING 38542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +98A0 +AEC0 +C8A0 +AEE0 +9200 +97C0 +F440 +A7C0 +8440 +87C0 +ENDCHAR +STARTCHAR U_968F +ENCODING 38543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +B7E0 +AA00 +C7C0 +A240 +BBC0 +AA40 +CBC0 +8A40 +8C00 +93E0 +ENDCHAR +STARTCHAR U_9690 +ENCODING 38544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +9480 +AFC0 +D040 +A7C0 +9040 +97C0 +D200 +AD40 +94A0 +8780 +ENDCHAR +STARTCHAR U_9691 +ENCODING 38545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +9520 +A7E0 +C000 +AFE0 +9000 +97C0 +F440 +A7C0 +8280 +9FE0 +ENDCHAR +STARTCHAR U_9692 +ENCODING 38546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9FE0 +A280 +CFE0 +A2A0 +9FE0 +92A0 +FFE0 +A680 +8AC0 +92A0 +ENDCHAR +STARTCHAR U_9693 +ENCODING 38547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9200 +A5C0 +C880 +A7E0 +9200 +9FE0 +F200 +A7C0 +8880 +97E0 +ENDCHAR +STARTCHAR U_9694 +ENCODING 38548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A440 +A7C0 +C000 +AFE0 +AAA0 +A920 +AFE0 +E920 +8920 +8860 +ENDCHAR +STARTCHAR U_9695 +ENCODING 38549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9440 +A7C0 +C000 +A7C0 +9440 +9740 +F5C0 +A440 +87C0 +8C60 +ENDCHAR +STARTCHAR U_9696 +ENCODING 38550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E400 +AFC0 +A840 +CFC0 +A800 +AFE0 +A800 +EFE0 +8AA0 +9560 +8060 +ENDCHAR +STARTCHAR U_9697 +ENCODING 38551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A540 +C7C0 +A540 +97C0 +9140 +F1A0 +A3E0 +8520 +98E0 +ENDCHAR +STARTCHAR U_9698 +ENCODING 38552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E880 +A500 +BFE0 +C500 +A880 +9040 +BFE0 +D540 +9540 +9540 +BFE0 +ENDCHAR +STARTCHAR U_9699 +ENCODING 38553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9540 +A920 +D7C0 +A440 +97C0 +9440 +F7C0 +A540 +8920 +9320 +ENDCHAR +STARTCHAR U_969A +ENCODING 38554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +A700 +DFE0 +D020 +AF80 +A880 +AF80 +C200 +9FC0 +8200 +BFE0 +ENDCHAR +STARTCHAR U_969B +ENCODING 38555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +95A0 +AAC0 +C440 +ABA0 +9000 +9FE0 +D100 +A540 +8920 +9320 +ENDCHAR +STARTCHAR U_969C +ENCODING 38556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A480 +CFE0 +A440 +97C0 +9440 +F7C0 +A100 +8FE0 +8100 +ENDCHAR +STARTCHAR U_969D +ENCODING 38557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +EF80 +A880 +CF80 +A880 +AFE0 +E800 +8FC0 +8040 +9540 +8080 +ENDCHAR +STARTCHAR U_969E +ENCODING 38558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E480 +BF80 +A4E0 +CEA0 +A4A0 +BFA0 +A8A0 +EEA0 +8A40 +92A0 +A520 +ENDCHAR +STARTCHAR U_969F +ENCODING 38559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AA80 +A540 +CFC0 +AA40 +AFC0 +AA40 +DFE0 +8700 +8A80 +B260 +ENDCHAR +STARTCHAR U_96A0 +ENCODING 38560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E1C0 +AE40 +AA80 +CFC0 +A040 +AFC0 +A040 +DFC0 +8540 +94A0 +9380 +ENDCHAR +STARTCHAR U_96A1 +ENCODING 38561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9FE0 +A240 +C180 +AFE0 +9A80 +9BE0 +FC80 +ABE0 +9080 +A7E0 +ENDCHAR +STARTCHAR U_96A2 +ENCODING 38562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A440 +9EE0 +9440 +FFE0 +A280 +84A0 +9860 +ENDCHAR +STARTCHAR U_96A3 +ENCODING 38563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A80 +E700 +BFE0 +C700 +AAC0 +B240 +DFE0 +9540 +B5E0 +8840 +B040 +ENDCHAR +STARTCHAR U_96A4 +ENCODING 38564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A540 +CFE0 +A440 +97C0 +9440 +F7C0 +A440 +87C0 +8C60 +ENDCHAR +STARTCHAR U_96A5 +ENCODING 38565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +B540 +A880 +D740 +A020 +AF80 +A880 +CF80 +8880 +8500 +BFE0 +ENDCHAR +STARTCHAR U_96A6 +ENCODING 38566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE40 +ABE0 +AA20 +CEA0 +A840 +AFE0 +BA40 +DBE0 +AA40 +8E40 +8040 +ENDCHAR +STARTCHAR U_96A7 +ENCODING 38567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +9FE0 +A500 +C2A0 +ADC0 +96C0 +95A0 +F6A0 +A580 +8A00 +91E0 +ENDCHAR +STARTCHAR U_96A8 +ENCODING 38568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +9BE0 +A480 +C7E0 +A140 +9DC0 +9540 +F5C0 +A540 +8A40 +91E0 +ENDCHAR +STARTCHAR U_96A9 +ENCODING 38569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +9FE0 +AD60 +CBA0 +AFE0 +9920 +9BA0 +F560 +AFE0 +8280 +8C60 +ENDCHAR +STARTCHAR U_96AA +ENCODING 38570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +9480 +A840 +C7A0 +A000 +9EE0 +9AA0 +FEE0 +A440 +8AA0 +9120 +ENDCHAR +STARTCHAR U_96AB +ENCODING 38571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A540 +DFE0 +A440 +A7C0 +A540 +C6C0 +8540 +87C0 +8820 +ENDCHAR +STARTCHAR U_96AC +ENCODING 38572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +A540 +A920 +BFE0 +C920 +ADA0 +AB60 +ADA0 +EB60 +8DA0 +8960 +ENDCHAR +STARTCHAR U_96AD +ENCODING 38573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFC0 +A200 +DFE0 +D2A0 +AB00 +B280 +AFC0 +C400 +9FC0 +9540 +95C0 +ENDCHAR +STARTCHAR U_96AE +ENCODING 38574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +AFE0 +A2A0 +AD40 +D560 +A540 +A440 +A7C0 +E440 +87C0 +9840 +ENDCHAR +STARTCHAR U_96AF +ENCODING 38575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +EFC0 +A200 +DFE0 +A220 +BFE0 +A040 +DFE0 +9540 +9D40 +80C0 +ENDCHAR +STARTCHAR U_96B0 +ENCODING 38576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9420 +A7E0 +C420 +A7E0 +9240 +95A0 +F2A0 +A7E0 +8540 +8AA0 +ENDCHAR +STARTCHAR U_96B1 +ENCODING 38577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9540 +9FE0 +A100 +CFE0 +A040 +9FC0 +9200 +F540 +ACA0 +93A0 +ENDCHAR +STARTCHAR U_96B2 +ENCODING 38578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AAC0 +B300 +CFE0 +B900 +AFC0 +A900 +CFE0 +8020 +95A0 +8060 +ENDCHAR +STARTCHAR U_96B3 +ENCODING 38579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +AFE0 +A500 +CFE0 +A440 +E7C0 +8C40 +BB00 +C8E0 +2A80 +5940 +ENDCHAR +STARTCHAR U_96B4 +ENCODING 38580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E4E0 +BF80 +AAE0 +C420 +BFE0 +AA80 +AEE0 +EA80 +8EE0 +8AA0 +8AE0 +ENDCHAR +STARTCHAR U_96B5 +ENCODING 38581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E780 +A4C0 +DFA0 +D4E0 +BF80 +B4A0 +DFA0 +9AA0 +9E40 +AAC0 +DF20 +ENDCHAR +STARTCHAR U_96B6 +ENCODING 38582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0480 +7FE0 +0480 +7F80 +2640 +1D80 +1480 +E460 +0C20 +ENDCHAR +STARTCHAR U_96B7 +ENCODING 38583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2140 +77E0 +0140 +77C0 +2540 +FB80 +7540 +A960 +6300 +ENDCHAR +STARTCHAR U_96B8 +ENCODING 38584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +77E0 +A940 +77C0 +0120 +FDC0 +2B40 +A520 +6320 +ENDCHAR +STARTCHAR U_96B9 +ENCODING 38585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1100 +3FE0 +2200 +7FC0 +A200 +2200 +3FC0 +2200 +3FE0 +2000 +ENDCHAR +STARTCHAR U_96BA +ENCODING 38586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4840 +1200 +3FC0 +E200 +3F80 +2200 +3F80 +2200 +3FC0 +ENDCHAR +STARTCHAR U_96BB +ENCODING 38587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3FE0 +2200 +7FE0 +A200 +3FE0 +2200 +7FE0 +10C0 +0F00 +F1E0 +ENDCHAR +STARTCHAR U_96BC +ENCODING 38588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +0200 +FFE0 +0200 +ENDCHAR +STARTCHAR U_96BD +ENCODING 38589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +2200 +3FE0 +6200 +BFC0 +2200 +7FE0 +0880 +09E0 +3020 +C0C0 +ENDCHAR +STARTCHAR U_96BE +ENCODING 38590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +F280 +17E0 +9C80 +5480 +27E0 +2480 +57E0 +5480 +8480 +07E0 +ENDCHAR +STARTCHAR U_96BF +ENCODING 38591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6300 +5480 +47E0 +7C80 +C480 +47E0 +4480 +57E0 +5480 +37E0 +1400 +ENDCHAR +STARTCHAR U_96C0 +ENCODING 38592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +2560 +4620 +8500 +1FE0 +3200 +DFC0 +1200 +1FC0 +1200 +1FE0 +ENDCHAR +STARTCHAR U_96C1 +ENCODING 38593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A00 +4A80 +53E0 +5680 +7BC0 +5280 +53C0 +5280 +93E0 +9200 +ENDCHAR +STARTCHAR U_96C2 +ENCODING 38594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +3280 +6BE0 +9680 +03E0 +FA80 +0BE0 +1280 +13E0 +2200 +ENDCHAR +STARTCHAR U_96C3 +ENCODING 38595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +5280 +53E0 +5680 +53E0 +FE80 +53E0 +5280 +5280 +53E0 +9200 +ENDCHAR +STARTCHAR U_96C4 +ENCODING 38596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1280 +FFE0 +2280 +2680 +53E0 +5280 +93E0 +A280 +2A80 +7BE0 +ENDCHAR +STARTCHAR U_96C5 +ENCODING 38597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +1280 +53E0 +5680 +FBE0 +1280 +3280 +53E0 +9280 +1280 +73E0 +ENDCHAR +STARTCHAR U_96C6 +ENCODING 38598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +2200 +7FE0 +A400 +3FC0 +2400 +3FC0 +2400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_96C7 +ENCODING 38599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4040 +7FC0 +4A00 +4900 +5FE0 +6900 +4FC0 +4900 +8FE0 +ENDCHAR +STARTCHAR U_96C8 +ENCODING 38600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F9E0 +0900 +1200 +3FE0 +6200 +BFC0 +2200 +3FC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_96C9 +ENCODING 38601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +4280 +7BE0 +A680 +2280 +FBE0 +2280 +23E0 +3280 +4A80 +83E0 +ENDCHAR +STARTCHAR U_96CA +ENCODING 38602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +4280 +7BE0 +8E80 +EA80 +ABE0 +AA80 +EBE0 +0A80 +0BE0 +3200 +ENDCHAR +STARTCHAR U_96CB +ENCODING 38603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3FE0 +2200 +7FC0 +A200 +3FE0 +2000 +79E0 +4920 +4F20 +4060 +ENDCHAR +STARTCHAR U_96CC +ENCODING 38604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2A80 +2BE0 +BE80 +ABE0 +AA80 +ABE0 +AA80 +BE80 +CBE0 +0200 +ENDCHAR +STARTCHAR U_96CD +ENCODING 38605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +57E0 +E480 +2FC0 +4C80 +F7C0 +1480 +27E0 +C400 +ENDCHAR +STARTCHAR U_96CE +ENCODING 38606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B00 +4A80 +4BE0 +7E80 +4BE0 +4A80 +7BE0 +4E80 +FA80 +43E0 +0200 +ENDCHAR +STARTCHAR U_96CF +ENCODING 38607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +7A80 +4BE0 +9680 +FA80 +0BE0 +0A80 +7BE0 +0A80 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_96D0 +ENCODING 38608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +7FE0 +4420 +5F00 +5440 +5FC0 +7200 +5FC0 +9200 +9FC0 +ENDCHAR +STARTCHAR U_96D1 +ENCODING 38609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7A80 +2BE0 +2A80 +4E80 +13C0 +FE80 +13C0 +5A80 +97E0 +3200 +ENDCHAR +STARTCHAR U_96D2 +ENCODING 38610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +7280 +93E0 +6680 +2BE0 +5280 +F280 +53E0 +5280 +73E0 +5200 +ENDCHAR +STARTCHAR U_96D3 +ENCODING 38611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +5480 +8FE0 +7480 +2480 +FFE0 +2480 +77E0 +AC80 +27E0 +6400 +ENDCHAR +STARTCHAR U_96D4 +ENCODING 38612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6100 +9280 +FFE0 +9280 +9280 +FFE0 +9280 +FFE0 +9280 +FFE0 +8200 +ENDCHAR +STARTCHAR U_96D5 +ENCODING 38613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +AA40 +FBE0 +AE40 +FBE0 +8A40 +FA40 +DBE0 +FA40 +8A40 +9BE0 +ENDCHAR +STARTCHAR U_96D6 +ENCODING 38614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8A80 +FBE0 +2680 +FBE0 +AA80 +AA80 +FBE0 +2A80 +3A80 +C7E0 +ENDCHAR +STARTCHAR U_96D7 +ENCODING 38615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2480 +FA40 +8BE0 +FE80 +8BE0 +FA80 +23E0 +FA80 +23E0 +ENDCHAR +STARTCHAR U_96D8 +ENCODING 38616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +4FE0 +6A40 +5FE0 +4A80 +FBE0 +4A80 +4FE0 +4A40 +8980 +9E60 +ENDCHAR +STARTCHAR U_96D9 +ENCODING 38617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +3FE0 +6A80 +BFC0 +2A80 +3FE0 +0000 +3FC0 +0880 +0700 +78E0 +ENDCHAR +STARTCHAR U_96DA +ENCODING 38618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7BC0 +4A40 +7BC0 +2200 +3FE0 +6200 +BFC0 +2200 +3FE0 +ENDCHAR +STARTCHAR U_96DB +ENCODING 38619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FA80 +ABE0 +FE80 +2A80 +CBE0 +7A80 +ABE0 +FA80 +2BE0 +D200 +ENDCHAR +STARTCHAR U_96DC +ENCODING 38620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FE80 +4BE0 +4A80 +B7E0 +1280 +FE80 +13E0 +3A80 +5680 +93E0 +ENDCHAR +STARTCHAR U_96DD +ENCODING 38621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5580 +AA80 +57E0 +FE80 +8BE0 +FA80 +AA80 +ABE0 +FA80 +87E0 +7E00 +ENDCHAR +STARTCHAR U_96DE +ENCODING 38622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1980 +EA80 +A7E0 +5280 +23E0 +CA80 +7280 +23E0 +FA80 +5280 +8BE0 +ENDCHAR +STARTCHAR U_96DF +ENCODING 38623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FE0 +1200 +3FC0 +6200 +BFC0 +2200 +7FE0 +59A0 +6F60 +4060 +ENDCHAR +STARTCHAR U_96E0 +ENCODING 38624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A940 +F5E0 +A140 +AD40 +F5E0 +A540 +A540 +F5E0 +A740 +A540 +F1E0 +ENDCHAR +STARTCHAR U_96E1 +ENCODING 38625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +B540 +6FE0 +B540 +25E0 +3940 +4540 +93E0 +6940 +1140 +61E0 +ENDCHAR +STARTCHAR U_96E2 +ENCODING 38626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +FD40 +55E0 +6F40 +55E0 +7D40 +2140 +FDE0 +AD40 +B540 +8DE0 +ENDCHAR +STARTCHAR U_96E3 +ENCODING 38627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FE80 +53E0 +2680 +FBC0 +AA80 +FA80 +23C0 +FE80 +5280 +8BE0 +ENDCHAR +STARTCHAR U_96E4 +ENCODING 38628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AC0 +4440 +7BC0 +4440 +FFE0 +A420 +7FC0 +C400 +7FC0 +4400 +7FC0 +ENDCHAR +STARTCHAR U_96E5 +ENCODING 38629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +6200 +BFC0 +2200 +3FE0 +5280 +7FE0 +D280 +7BC0 +5280 +7FE0 +ENDCHAR +STARTCHAR U_96E6 +ENCODING 38630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +CCC0 +AAA0 +FFE0 +AAA0 +FFE0 +AAA0 +FFE0 +AAA0 +AAA0 +FFE0 +8880 +ENDCHAR +STARTCHAR U_96E7 +ENCODING 38631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +3F80 +1200 +7FC0 +5280 +FFC0 +5280 +FFE0 +0E00 +1500 +64C0 +ENDCHAR +STARTCHAR U_96E8 +ENCODING 38632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +0400 +7FC0 +4440 +5540 +4CC0 +6640 +5540 +4440 +44C0 +ENDCHAR +STARTCHAR U_96E9 +ENCODING 38633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +0000 +FFE0 +1000 +3F80 +0080 +0300 +ENDCHAR +STARTCHAR U_96EA +ENCODING 38634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +B5A0 +0000 +7FC0 +0040 +3FC0 +0040 +7FC0 +ENDCHAR +STARTCHAR U_96EB +ENCODING 38635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2480 +FFE0 +0600 +0580 +0480 +0400 +ENDCHAR +STARTCHAR U_96EC +ENCODING 38636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2080 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_96ED +ENCODING 38637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +7F80 +1100 +1380 +2900 +4600 +99C0 +ENDCHAR +STARTCHAR U_96EE +ENCODING 38638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2480 +0780 +7C00 +07C0 +7C20 +03E0 +ENDCHAR +STARTCHAR U_96EF +ENCODING 38639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +B5A0 +0400 +FFE0 +1100 +0A00 +1F00 +E0E0 +ENDCHAR +STARTCHAR U_96F0 +ENCODING 38640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +1100 +2080 +7FC0 +88A0 +1080 +6300 +ENDCHAR +STARTCHAR U_96F1 +ENCODING 38641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +0400 +FFE0 +0800 +0FC0 +3040 +C380 +ENDCHAR +STARTCHAR U_96F2 +ENCODING 38642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7F80 +0000 +FFE0 +1100 +FF80 +6040 +ENDCHAR +STARTCHAR U_96F3 +ENCODING 38643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7FC0 +4200 +5FC0 +4440 +4840 +B180 +ENDCHAR +STARTCHAR U_96F4 +ENCODING 38644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0400 +FFE0 +A4A0 +1500 +2880 +0400 +7FC0 +1100 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_96F5 +ENCODING 38645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7FC0 +4440 +FFE0 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_96F6 +ENCODING 38646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +0E00 +3180 +C460 +3F80 +0100 +0E00 +0300 +ENDCHAR +STARTCHAR U_96F7 +ENCODING 38647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +B5A0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_96F8 +ENCODING 38648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +1080 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_96F9 +ENCODING 38649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3FC0 +4040 +BE40 +2240 +3EA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_96FA +ENCODING 38650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7F80 +0900 +FFE0 +0A40 +1200 +6E00 +ENDCHAR +STARTCHAR U_96FB +ENCODING 38651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +7FC0 +4440 +7FC0 +4440 +7FC0 +0420 +07E0 +ENDCHAR +STARTCHAR U_96FC +ENCODING 38652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +2080 +FFE0 +0800 +1F80 +F080 +1F80 +ENDCHAR +STARTCHAR U_96FD +ENCODING 38653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +01C0 +7E80 +2500 +FFE0 +0400 +1C00 +ENDCHAR +STARTCHAR U_96FE +ENCODING 38654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3F80 +5200 +1F00 +E4E0 +3F80 +0880 +7300 +ENDCHAR +STARTCHAR U_96FF +ENCODING 38655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +2A40 +1A80 +3B00 +CAA0 +1220 +E1E0 +ENDCHAR +STARTCHAR U_9700 +ENCODING 38656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +B5A0 +0400 +FFE0 +0800 +7FC0 +4A40 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_9701 +ENCODING 38657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +7FC0 +1100 +0E00 +F1E0 +1100 +6100 +ENDCHAR +STARTCHAR U_9702 +ENCODING 38658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +9100 +6FC0 +2300 +C580 +4940 +5120 +ENDCHAR +STARTCHAR U_9703 +ENCODING 38659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +9520 +2480 +0200 +2FC0 +4A40 +1200 +6540 +29C0 +ENDCHAR +STARTCHAR U_9704 +ENCODING 38660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +3F80 +2080 +3F80 +2080 +3F80 +2180 +ENDCHAR +STARTCHAR U_9705 +ENCODING 38661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +FFE0 +0000 +3F80 +0000 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9706 +ENCODING 38662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +F7C0 +2100 +77C0 +1100 +5FE0 +2000 +DFE0 +ENDCHAR +STARTCHAR U_9707 +ENCODING 38663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +94A0 +7FC0 +4000 +7FC0 +5280 +9100 +98E0 +ENDCHAR +STARTCHAR U_9708 +ENCODING 38664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +4200 +BFE0 +6200 +2FC0 +CA40 +4AC0 +4200 +ENDCHAR +STARTCHAR U_9709 +ENCODING 38665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9520 +7FE0 +2880 +FFE0 +2480 +3FE0 +0100 +ENDCHAR +STARTCHAR U_970A +ENCODING 38666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +7FC0 +0000 +7FC0 +4A40 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_970B +ENCODING 38667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFC0 +0480 +7FC0 +0480 +FFE0 +1200 +FDC0 +ENDCHAR +STARTCHAR U_970C +ENCODING 38668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +5540 +7FC0 +4440 +5F40 +4E40 +4A40 +8EC0 +ENDCHAR +STARTCHAR U_970D +ENCODING 38669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +3FE0 +1200 +3FC0 +5200 +9FC0 +1200 +1FE0 +ENDCHAR +STARTCHAR U_970E +ENCODING 38670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +0900 +FFE0 +0400 +7FC0 +1200 +FDC0 +ENDCHAR +STARTCHAR U_970F +ENCODING 38671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +0A00 +FBE0 +0A00 +7BC0 +0A00 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_9710 +ENCODING 38672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +AE40 +4280 +BE80 +5080 +DD00 +4520 +4DE0 +ENDCHAR +STARTCHAR U_9711 +ENCODING 38673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +4100 +A9E0 +5100 +E7C0 +4440 +47C0 +ENDCHAR +STARTCHAR U_9712 +ENCODING 38674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FF40 +9220 +6C80 +3840 +03E0 +FC20 +2840 +FC40 +4480 +ENDCHAR +STARTCHAR U_9713 +ENCODING 38675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +73C0 +4040 +7BC0 +4040 +7FC0 +1220 +E3E0 +ENDCHAR +STARTCHAR U_9714 +ENCODING 38676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +A4A0 +5540 +4100 +2FE0 +8100 +2FC0 +4100 +5FE0 +ENDCHAR +STARTCHAR U_9715 +ENCODING 38677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +2100 +FFE0 +A900 +7540 +AD40 +FD40 +07C0 +F920 +5120 +F8E0 +ENDCHAR +STARTCHAR U_9716 +ENCODING 38678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +1100 +FBE0 +1100 +3B80 +5540 +9120 +ENDCHAR +STARTCHAR U_9717 +ENCODING 38679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +94A0 +2500 +4280 +2D40 +87E0 +2080 +4300 +4100 +ENDCHAR +STARTCHAR U_9718 +ENCODING 38680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +4FE0 +2820 +ABA0 +4820 +CBA0 +4AA0 +4BA0 +ENDCHAR +STARTCHAR U_9719 +ENCODING 38681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +1100 +3F80 +2480 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_971A +ENCODING 38682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +9520 +2480 +7A00 +13E0 +7A40 +3580 +5180 +B660 +ENDCHAR +STARTCHAR U_971B +ENCODING 38683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +6EC0 +2240 +4480 +66C0 +2240 +66C0 +ENDCHAR +STARTCHAR U_971C +ENCODING 38684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +23C0 +FA40 +23C0 +3240 +6BC0 +AA40 +23C0 +ENDCHAR +STARTCHAR U_971D +ENCODING 38685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A0A0 +0000 +EEE0 +AAA0 +AAA0 +EEE0 +AAA0 +ENDCHAR +STARTCHAR U_971E +ENCODING 38686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FBC0 +4840 +7FC0 +4240 +7A40 +4180 +4E60 +ENDCHAR +STARTCHAR U_971F +ENCODING 38687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +4480 +2FC0 +A480 +4480 +DFE0 +4480 +5860 +ENDCHAR +STARTCHAR U_9720 +ENCODING 38688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2500 +1280 +FD40 +9120 +57C0 +2080 +F100 +ENDCHAR +STARTCHAR U_9721 +ENCODING 38689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +2540 +7300 +5140 +7D80 +5580 +7960 +9340 +ENDCHAR +STARTCHAR U_9722 +ENCODING 38690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +F7C0 +9440 +F580 +9540 +F580 +9540 +B920 +ENDCHAR +STARTCHAR U_9723 +ENCODING 38691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3F80 +2080 +7FC0 +4040 +7FC0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_9724 +ENCODING 38692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +73C0 +4940 +7540 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_9725 +ENCODING 38693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +8020 +7FC0 +1480 +6F00 +1500 +6CE0 +ENDCHAR +STARTCHAR U_9726 +ENCODING 38694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2440 +FE80 +2520 +6E40 +B5A0 +2440 +2580 +ENDCHAR +STARTCHAR U_9727 +ENCODING 38695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FBE0 +5540 +FC80 +2940 +6FE0 +A120 +6260 +ENDCHAR +STARTCHAR U_9728 +ENCODING 38696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7C40 +47E0 +7C40 +4240 +7D40 +5840 +B4C0 +ENDCHAR +STARTCHAR U_9729 +ENCODING 38697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FDE0 +4920 +7D40 +0940 +FD20 +11A0 +7140 +ENDCHAR +STARTCHAR U_972A +ENCODING 38698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +4FE0 +AA40 +47C0 +6100 +DFE0 +4100 +4FE0 +ENDCHAR +STARTCHAR U_972B +ENCODING 38699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +1540 +0CC0 +7540 +3FC0 +2240 +3FC0 +ENDCHAR +STARTCHAR U_972C +ENCODING 38700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +4440 +7FC0 +1100 +7FC0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_972D +ENCODING 38701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +27C0 +1540 +E440 +27E0 +2D20 +36A0 +27C0 +ENDCHAR +STARTCHAR U_972E +ENCODING 38702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +9FE0 +4480 +A780 +4480 +DFE0 +4A80 +4FE0 +ENDCHAR +STARTCHAR U_972F +ENCODING 38703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7A80 +5120 +3FC0 +60A0 +BF80 +1200 +FFC0 +ENDCHAR +STARTCHAR U_9730 +ENCODING 38704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FDE0 +5140 +FF40 +4940 +7880 +4940 +5A20 +ENDCHAR +STARTCHAR U_9731 +ENCODING 38705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +FFC0 +1480 +FFC0 +5B40 +6EC0 +40C0 +ENDCHAR +STARTCHAR U_9732 +ENCODING 38706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F3C0 +9640 +F180 +2660 +BBC0 +A240 +F3C0 +ENDCHAR +STARTCHAR U_9733 +ENCODING 38707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7380 +5280 +6D60 +5500 +67C0 +4900 +4FE0 +ENDCHAR +STARTCHAR U_9734 +ENCODING 38708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23C0 +FD40 +AFE0 +7140 +AFE0 +F540 +0380 +FD60 +5140 +FB00 +ENDCHAR +STARTCHAR U_9735 +ENCODING 38709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FCA0 +4940 +FD20 +8BE0 +F940 +88A0 +FD60 +ENDCHAR +STARTCHAR U_9736 +ENCODING 38710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +1500 +4FE0 +8280 +2FE0 +CA20 +43C0 +4C40 +ENDCHAR +STARTCHAR U_9737 +ENCODING 38711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +94A0 +2500 +77C0 +5540 +7FE0 +5400 +57E0 +7AA0 +ENDCHAR +STARTCHAR U_9738 +ENCODING 38712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFC0 +4A40 +FBC0 +AA40 +FFC0 +2240 +24C0 +ENDCHAR +STARTCHAR U_9739 +ENCODING 38713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7BE0 +4940 +7880 +47E0 +7880 +ABE0 +3880 +ENDCHAR +STARTCHAR U_973A +ENCODING 38714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +6AE0 +BFA0 +40A0 +FEA0 +5440 +54A0 +6720 +ENDCHAR +STARTCHAR U_973B +ENCODING 38715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +4A40 +FFE0 +2080 +3F80 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_973C +ENCODING 38716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FC00 +ABC0 +7000 +AFC0 +7AC0 +0740 +FFC0 +5720 +FAA0 +ENDCHAR +STARTCHAR U_973D +ENCODING 38717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +5A80 +94C0 +3FA0 +2080 +3F80 +4080 +ENDCHAR +STARTCHAR U_973E +ENCODING 38718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +57C0 +A540 +57C0 +B540 +57C0 +9100 +2FE0 +ENDCHAR +STARTCHAR U_973F +ENCODING 38719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F9C0 +5280 +FFE0 +6A40 +A3C0 +2240 +63C0 +ENDCHAR +STARTCHAR U_9740 +ENCODING 38720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +5540 +7FC0 +1100 +FFE0 +2D00 +D600 +2DC0 +ENDCHAR +STARTCHAR U_9741 +ENCODING 38721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_9742 +ENCODING 38722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +9080 +FBC0 +D4A0 +97C0 +A400 +FFE0 +ENDCHAR +STARTCHAR U_9743 +ENCODING 38723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +A280 +FFE0 +A280 +FBC0 +A280 +FBE0 +ENDCHAR +STARTCHAR U_9744 +ENCODING 38724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F7C0 +0440 +F3E0 +0CA0 +F560 +9720 +F0C0 +ENDCHAR +STARTCHAR U_9745 +ENCODING 38725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +27E0 +FAA0 +AFE0 +72A0 +ACE0 +77C0 +0340 +FAC0 +53C0 +FE60 +ENDCHAR +STARTCHAR U_9746 +ENCODING 38726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23E0 +F8A0 +ABE0 +FCA0 +AFE0 +76A0 +05C0 +FEA0 +4D80 +FBE0 +ENDCHAR +STARTCHAR U_9747 +ENCODING 38727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FBE0 +5200 +FBC0 +8840 +FBC0 +8A20 +9BE0 +ENDCHAR +STARTCHAR U_9748 +ENCODING 38728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +EEE0 +AAA0 +FFE0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_9749 +ENCODING 38729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +22A0 +FFE0 +AAA0 +FAC0 +8D20 +73C0 +0640 +F980 +5240 +FC20 +ENDCHAR +STARTCHAR U_974A +ENCODING 38730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +7FC0 +5540 +FFE0 +2040 +3FC0 +0900 +FFE0 +ENDCHAR +STARTCHAR U_974B +ENCODING 38731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +9FC0 +5480 +BFE0 +54A0 +D5C0 +6900 +9FE0 +ENDCHAR +STARTCHAR U_974C +ENCODING 38732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A4A0 +7FC0 +5540 +1540 +3F80 +2A80 +3F80 +1100 +ENDCHAR +STARTCHAR U_974D +ENCODING 38733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +A520 +3BE0 +52A0 +FBE0 +5200 +7BE0 +52A0 +7D60 +ENDCHAR +STARTCHAR U_974E +ENCODING 38734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +0400 +FFE0 +9520 +2BE0 +7EA0 +93E0 +7E00 +57E0 +3AA0 +F960 +ENDCHAR +STARTCHAR U_974F +ENCODING 38735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +FFE0 +A6A0 +7BE0 +D200 +7BE0 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9750 +ENCODING 38736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +8420 +3F80 +2480 +FFE0 +2080 +FBE0 +AAA0 +FBE0 +ENDCHAR +STARTCHAR U_9751 +ENCODING 38737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +7FC0 +0400 +FFE0 +2480 +3F80 +2080 +2280 +2100 +ENDCHAR +STARTCHAR U_9752 +ENCODING 38738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +1080 +1F80 +1080 +1F80 +1080 +ENDCHAR +STARTCHAR U_9753 +ENCODING 38739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +2540 +FD40 +2540 +FD40 +5540 +7280 +52A0 +74A0 +58E0 +ENDCHAR +STARTCHAR U_9754 +ENCODING 38740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2400 +FBC0 +2000 +FFC0 +4840 +7840 +4840 +7820 +4820 +ENDCHAR +STARTCHAR U_9755 +ENCODING 38741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +2100 +27C0 +2100 +BFE0 +A440 +A7C0 +B440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_9756 +ENCODING 38742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +07C0 +9100 +5FE0 +5440 +27C0 +3440 +C7C0 +0440 +ENDCHAR +STARTCHAR U_9757 +ENCODING 38743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F140 +2540 +F380 +27E0 +FA80 +5280 +7280 +52A0 +74A0 +5860 +ENDCHAR +STARTCHAR U_9758 +ENCODING 38744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9C0 +2280 +FBE0 +26A0 +FAA0 +8BE0 +FA00 +8A20 +FA20 +99E0 +ENDCHAR +STARTCHAR U_9759 +ENCODING 38745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDC0 +2280 +7BC0 +2140 +FFE0 +4940 +6BC0 +5900 +4900 +5B00 +ENDCHAR +STARTCHAR U_975A +ENCODING 38746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2220 +FBE0 +2220 +FFE0 +4A20 +7BE0 +4940 +7940 +4A40 +5C60 +ENDCHAR +STARTCHAR U_975B +ENCODING 38747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBE0 +2220 +7800 +23E0 +FC80 +4A80 +7AE0 +4A80 +7B80 +4CE0 +ENDCHAR +STARTCHAR U_975C +ENCODING 38748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +2520 +FAC0 +27C0 +F940 +97E0 +F140 +97C0 +F100 +9500 +B200 +ENDCHAR +STARTCHAR U_975D +ENCODING 38749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +F7E0 +2800 +F780 +2000 +FFC0 +5AC0 +7740 +5FC0 +7760 +5AA0 +ENDCHAR +STARTCHAR U_975E +ENCODING 38750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +0A00 +FBE0 +0A00 +0A00 +7BC0 +0A00 +0A00 +FBE0 +0A00 +0A00 +ENDCHAR +STARTCHAR U_975F +ENCODING 38751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0A00 +FBE0 +0A00 +7BE0 +0A00 +03C0 +7C00 +0400 +7FA0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9760 +ENCODING 38752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +3FC0 +4400 +FFE0 +2080 +3F80 +0A00 +FBE0 +0A00 +FBE0 +0A00 +ENDCHAR +STARTCHAR U_9761 +ENCODING 38753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +9080 +FFE0 +B9C0 +D6A0 +FBE0 +8A00 +BBC0 +8A00 +FBE0 +ENDCHAR +STARTCHAR U_9762 +ENCODING 38754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0800 +1000 +FFC0 +9240 +9E40 +9240 +9E40 +9240 +FFC0 +8040 +ENDCHAR +STARTCHAR U_9763 +ENCODING 38755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +FFE0 +0400 +0800 +7FC0 +4040 +5F40 +5140 +5F40 +4040 +7FC0 +ENDCHAR +STARTCHAR U_9764 +ENCODING 38756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FDE0 +2220 +FDA0 +A6A0 +B5A0 +A520 +B560 +A500 +A520 +FDE0 +ENDCHAR +STARTCHAR U_9765 +ENCODING 38757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4280 +7FE0 +4500 +7FE0 +4200 +5FE0 +5520 +5720 +9520 +9FE0 +ENDCHAR +STARTCHAR U_9766 +ENCODING 38758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2120 +FFE0 +AB20 +BBE0 +AB20 +BBE0 +AA40 +AAC0 +FF40 +8260 +ENDCHAR +STARTCHAR U_9767 +ENCODING 38759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +4540 +FFE0 +A800 +BBC0 +AB40 +BAC0 +AB40 +FBC0 +0660 +ENDCHAR +STARTCHAR U_9768 +ENCODING 38760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4C0 +BCA0 +A7E0 +BC80 +A540 +FFE0 +2940 +2F40 +2940 +3FC0 +ENDCHAR +STARTCHAR U_9769 +ENCODING 38761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0400 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_976A +ENCODING 38762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +FC40 +2840 +3840 +1040 +7C40 +5440 +7C40 +1240 +FD40 +1080 +ENDCHAR +STARTCHAR U_976B +ENCODING 38763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFC0 +5440 +7640 +2540 +FA80 +AA80 +F900 +2280 +FC60 +2840 +ENDCHAR +STARTCHAR U_976C +ENCODING 38764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +FC80 +2880 +3880 +1080 +7FE0 +5480 +7C80 +1080 +FC80 +1080 +ENDCHAR +STARTCHAR U_976D +ENCODING 38765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2800 +FDE0 +28A0 +38A0 +11A0 +7EA0 +54A0 +7D20 +1120 +FEA0 +1440 +ENDCHAR +STARTCHAR U_976E +ENCODING 38766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +53E0 +7420 +2120 +F8A0 +A8A0 +F820 +2020 +F920 +20C0 +ENDCHAR +STARTCHAR U_976F +ENCODING 38767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5100 +7100 +27C0 +F900 +A900 +F900 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_9770 +ENCODING 38768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FA80 +5280 +7280 +2280 +FA80 +AA80 +FA80 +22A0 +FAA0 +24E0 +ENDCHAR +STARTCHAR U_9771 +ENCODING 38769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5140 +7140 +2540 +FB40 +A940 +FAC0 +2260 +FD40 +2080 +ENDCHAR +STARTCHAR U_9772 +ENCODING 38770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F980 +5240 +7520 +2080 +F800 +ABE0 +F840 +2040 +F880 +2080 +ENDCHAR +STARTCHAR U_9773 +ENCODING 38771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2860 +FF80 +2900 +3900 +11E0 +7D40 +5540 +7D40 +1140 +FE40 +1440 +ENDCHAR +STARTCHAR U_9774 +ENCODING 38772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FA80 +5280 +76A0 +22C0 +FA80 +AB80 +FA80 +26A0 +FAA0 +2260 +ENDCHAR +STARTCHAR U_9775 +ENCODING 38773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5140 +7140 +23C0 +F940 +A940 +F940 +2140 +FFE0 +2000 +ENDCHAR +STARTCHAR U_9776 +ENCODING 38774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFE0 +52A0 +72A0 +22A0 +FBE0 +AA00 +FA00 +2220 +FE20 +23E0 +ENDCHAR +STARTCHAR U_9777 +ENCODING 38775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53A0 +F8A0 +50A0 +73A0 +2220 +FBA0 +A8A0 +F8A0 +20A0 +FCA0 +2320 +ENDCHAR +STARTCHAR U_9778 +ENCODING 38776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57C0 +FA40 +5240 +7280 +22E0 +FA20 +AA40 +FB40 +2480 +F940 +2A20 +ENDCHAR +STARTCHAR U_9779 +ENCODING 38777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +5080 +73E0 +22A0 +FAA0 +AB60 +FA20 +2220 +FA20 +2260 +ENDCHAR +STARTCHAR U_977A +ENCODING 38778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +5080 +7080 +23E0 +F880 +A880 +F9C0 +22A0 +FCA0 +2080 +ENDCHAR +STARTCHAR U_977B +ENCODING 38779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +5240 +7240 +23C0 +FA40 +AA40 +FBC0 +2240 +FA40 +27E0 +ENDCHAR +STARTCHAR U_977C +ENCODING 38780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FBC0 +5240 +7240 +23C0 +FA40 +AA40 +FBC0 +2240 +F800 +27E0 +ENDCHAR +STARTCHAR U_977D +ENCODING 38781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FEA0 +51C0 +7080 +23E0 +F880 +A880 +FFE0 +2080 +FC80 +2080 +ENDCHAR +STARTCHAR U_977E +ENCODING 38782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52A0 +FAA0 +52A0 +77E0 +22A0 +FAA0 +AAA0 +FAE0 +2200 +FA00 +23E0 +ENDCHAR +STARTCHAR U_977F +ENCODING 38783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FA80 +5480 +75E0 +22A0 +FAA0 +AAA0 +FDA0 +26A0 +F920 +2240 +ENDCHAR +STARTCHAR U_9780 +ENCODING 38784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F920 +5120 +7120 +22E0 +FC40 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_9781 +ENCODING 38785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FBE0 +52A0 +7280 +23E0 +FA40 +AA40 +FB40 +2280 +FD40 +2A20 +ENDCHAR +STARTCHAR U_9782 +ENCODING 38786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5060 +FB80 +5080 +77E0 +2080 +F880 +A9C0 +FAA0 +24A0 +F880 +2080 +ENDCHAR +STARTCHAR U_9783 +ENCODING 38787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5740 +F940 +5140 +7740 +2440 +FE40 +AA80 +FAA0 +22A0 +FAA0 +25E0 +ENDCHAR +STARTCHAR U_9784 +ENCODING 38788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBE0 +5420 +73A0 +22A0 +FAA0 +ABA0 +FA60 +2200 +FA20 +21E0 +ENDCHAR +STARTCHAR U_9785 +ENCODING 38789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +53E0 +72A0 +22A0 +FAA0 +AFE0 +F880 +2140 +FA20 +2420 +ENDCHAR +STARTCHAR U_9786 +ENCODING 38790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFE0 +5100 +77C0 +2540 +FD40 +AEC0 +FC40 +2440 +FC40 +24C0 +ENDCHAR +STARTCHAR U_9787 +ENCODING 38791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5000 +FFE0 +5520 +77E0 +2520 +FD20 +ADA0 +FE60 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_9788 +ENCODING 38792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F980 +5240 +7420 +23C0 +F800 +ABC0 +FA40 +2240 +FBC0 +2240 +ENDCHAR +STARTCHAR U_9789 +ENCODING 38793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FA80 +52A0 +7AC0 +2680 +FAC0 +AAA0 +FE80 +22A0 +FCA0 +2860 +ENDCHAR +STARTCHAR U_978A +ENCODING 38794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +57E0 +7080 +23E0 +F800 +ABE0 +FA20 +2220 +FBE0 +2220 +ENDCHAR +STARTCHAR U_978B +ENCODING 38795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +53E0 +7080 +27E0 +F880 +A880 +FBE0 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_978C +ENCODING 38796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +1F00 +6A80 +3FC0 +0A00 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_978D +ENCODING 38797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5420 +7100 +2100 +FFE0 +A940 +FA40 +2180 +F940 +2620 +ENDCHAR +STARTCHAR U_978E +ENCODING 38798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7220 +23E0 +FA80 +AAA0 +FAC0 +2240 +FAA0 +2320 +ENDCHAR +STARTCHAR U_978F +ENCODING 38799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +24A0 +3EA0 +E5E0 +1100 +FFE0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9790 +ENCODING 38800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FDC0 +5100 +77E0 +2000 +FFE0 +A900 +F940 +2120 +F900 +2100 +ENDCHAR +STARTCHAR U_9791 +ENCODING 38801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FC80 +5280 +71E0 +2E80 +FA80 +AAC0 +FB20 +2200 +FD00 +28E0 +ENDCHAR +STARTCHAR U_9792 +ENCODING 38802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5040 +FB80 +5100 +77E0 +2140 +FE20 +AA40 +FA40 +2240 +FA40 +2440 +ENDCHAR +STARTCHAR U_9793 +ENCODING 38803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +53C0 +7000 +27C0 +F900 +A900 +FFC0 +2100 +F900 +27E0 +ENDCHAR +STARTCHAR U_9794 +ENCODING 38804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F9C0 +5240 +77E0 +22A0 +FAA0 +ABE0 +F880 +21A0 +FAA0 +2460 +ENDCHAR +STARTCHAR U_9795 +ENCODING 38805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F900 +57C0 +7540 +27C0 +FD40 +AFC0 +FD00 +2300 +FA80 +2460 +ENDCHAR +STARTCHAR U_9796 +ENCODING 38806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +FF40 +5540 +7280 +2100 +FFE0 +A940 +FA40 +2180 +FA40 +2420 +ENDCHAR +STARTCHAR U_9797 +ENCODING 38807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +5A40 +5180 +D240 +5FE0 +5280 +57C0 +5540 +4FE0 +4100 +ENDCHAR +STARTCHAR U_9798 +ENCODING 38808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FAA0 +51C0 +7080 +23E0 +FA20 +ABE0 +FA20 +23E0 +FA20 +2260 +ENDCHAR +STARTCHAR U_9799 +ENCODING 38809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7000 +23E0 +FA20 +ABE0 +FA20 +23E0 +FA20 +2260 +ENDCHAR +STARTCHAR U_979A +ENCODING 38810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5420 +7140 +2220 +F800 +ABC0 +F880 +2080 +F880 +27E0 +ENDCHAR +STARTCHAR U_979B +ENCODING 38811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5040 +7240 +2180 +FFE0 +A800 +FBC0 +2240 +FBC0 +2240 +ENDCHAR +STARTCHAR U_979C +ENCODING 38812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F8A0 +57C0 +72A0 +24A0 +F980 +ABE0 +FA20 +23E0 +FA20 +23E0 +ENDCHAR +STARTCHAR U_979D +ENCODING 38813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5520 +FB40 +5100 +7FE0 +2820 +FBA0 +AAA0 +FAA0 +2BA0 +F820 +2860 +ENDCHAR +STARTCHAR U_979E +ENCODING 38814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFE0 +5520 +77E0 +2520 +FFE0 +A980 +FA80 +27E0 +F880 +2080 +ENDCHAR +STARTCHAR U_979F +ENCODING 38815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5000 +73C0 +2240 +FBC0 +A880 +FBE0 +2080 +FA80 +2100 +ENDCHAR +STARTCHAR U_97A0 +ENCODING 38816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBE0 +5560 +75A0 +2320 +FFE0 +A920 +FBA0 +2560 +F920 +21C0 +ENDCHAR +STARTCHAR U_97A1 +ENCODING 38817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FA40 +57E0 +7200 +2220 +FBA0 +AEA0 +FAA0 +2240 +FA40 +27E0 +ENDCHAR +STARTCHAR U_97A2 +ENCODING 38818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +FFE0 +5540 +75C0 +2400 +FFE0 +A900 +FFE0 +2380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97A3 +ENCODING 38819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +F940 +57E0 +72A0 +2580 +F900 +AFE0 +F900 +2380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97A4 +ENCODING 38820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FBE0 +2140 +F8C0 +2900 +FFC0 +0900 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97A5 +ENCODING 38821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FA40 +55A0 +7000 +23C0 +FA40 +ABC0 +FA40 +27E0 +FA40 +2440 +ENDCHAR +STARTCHAR U_97A6 +ENCODING 38822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FE40 +5240 +72C0 +2F60 +FA40 +AB40 +FEC0 +2240 +FAA0 +2320 +ENDCHAR +STARTCHAR U_97A7 +ENCODING 38823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5280 +77E0 +26A0 +FEE0 +AC20 +FFE0 +2420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_97A8 +ENCODING 38824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7220 +23E0 +F900 +AFE0 +FAA0 +2360 +FFA0 +2040 +ENDCHAR +STARTCHAR U_97A9 +ENCODING 38825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5220 +FAA0 +5720 +7F60 +2960 +FF60 +A960 +FF60 +2920 +F920 +2B60 +ENDCHAR +STARTCHAR U_97AA +ENCODING 38826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +F940 +6880 +A940 +FFE0 +0900 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97AB +ENCODING 38827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBE0 +5520 +77E0 +2020 +FBA0 +A820 +FBA0 +22A0 +FBA0 +2040 +ENDCHAR +STARTCHAR U_97AC +ENCODING 38828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FAA0 +53E0 +74A0 +27E0 +FA80 +ABE0 +FA80 +27E0 +FA80 +29E0 +ENDCHAR +STARTCHAR U_97AD +ENCODING 38829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA80 +53E0 +76A0 +27E0 +FEA0 +AFE0 +FC80 +2580 +FD40 +2620 +ENDCHAR +STARTCHAR U_97AE +ENCODING 38830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FA20 +53E0 +7220 +23E0 +F800 +AFE0 +FA80 +22E0 +FD80 +24E0 +ENDCHAR +STARTCHAR U_97AF +ENCODING 38831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FFE0 +5140 +77E0 +2100 +FAE0 +AE40 +FBE0 +2240 +FA40 +22C0 +ENDCHAR +STARTCHAR U_97B0 +ENCODING 38832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +FA40 +53C0 +7240 +23C0 +F800 +AFE0 +FAA0 +2AA0 +FAA0 +2FE0 +ENDCHAR +STARTCHAR U_97B1 +ENCODING 38833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +50E0 +FF20 +52A0 +7140 +2100 +FA60 +AA20 +FB60 +2220 +FFE0 +2220 +ENDCHAR +STARTCHAR U_97B2 +ENCODING 38834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5280 +77C0 +2280 +FFE0 +AD40 +FFC0 +2540 +FFE0 +24C0 +ENDCHAR +STARTCHAR U_97B3 +ENCODING 38835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FBE0 +5240 +7180 +2240 +FDA0 +A800 +FBC0 +2240 +FBC0 +2240 +ENDCHAR +STARTCHAR U_97B4 +ENCODING 38836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FBE0 +5140 +77E0 +2200 +FBE0 +AEA0 +FBE0 +22A0 +FBE0 +22A0 +ENDCHAR +STARTCHAR U_97B5 +ENCODING 38837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +51C0 +FE40 +5540 +7280 +2780 +F940 +AFC0 +F900 +27E0 +FA80 +2460 +ENDCHAR +STARTCHAR U_97B6 +ENCODING 38838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE60 +AB80 +F900 +AA80 +7FE0 +0900 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97B7 +ENCODING 38839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +7FC0 +4A40 +4440 +FFE0 +1100 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_97B8 +ENCODING 38840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FAA0 +53E0 +72A0 +23E0 +FAA0 +AFE0 +FAA0 +27E0 +F880 +2080 +ENDCHAR +STARTCHAR U_97B9 +ENCODING 38841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +52E0 +FFA0 +55A0 +77C0 +20A0 +FFA0 +AAA0 +FAA0 +27E0 +FA80 +2680 +ENDCHAR +STARTCHAR U_97BA +ENCODING 38842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +FB80 +57E0 +7820 +2380 +FA80 +AB80 +F900 +27C0 +F900 +27E0 +ENDCHAR +STARTCHAR U_97BB +ENCODING 38843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5540 +77E0 +2540 +FFE0 +A920 +FFE0 +2240 +F980 +2660 +ENDCHAR +STARTCHAR U_97BC +ENCODING 38844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5540 +77E0 +2000 +FBC0 +AB40 +FAC0 +2340 +FBC0 +2660 +ENDCHAR +STARTCHAR U_97BD +ENCODING 38845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53C0 +F900 +5FE0 +7280 +27E0 +FA80 +AFE0 +FEA0 +27A0 +FC20 +2460 +ENDCHAR +STARTCHAR U_97BE +ENCODING 38846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5240 +77E0 +2540 +FFE0 +AD40 +FFE0 +2100 +FFE0 +2100 +ENDCHAR +STARTCHAR U_97BF +ENCODING 38847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5540 +F5A0 +5FC0 +7540 +2FE0 +F920 +AFE0 +FB40 +22A0 +FD60 +2220 +ENDCHAR +STARTCHAR U_97C0 +ENCODING 38848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5540 +77E0 +2560 +FFE0 +AD00 +FDE0 +2500 +FDE0 +2AA0 +ENDCHAR +STARTCHAR U_97C1 +ENCODING 38849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FAA0 +53E0 +72A0 +27E0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +27E0 +ENDCHAR +STARTCHAR U_97C2 +ENCODING 38850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5200 +FBC0 +5480 +77E0 +2540 +FEA0 +ADC0 +FC00 +25C0 +F940 +29C0 +ENDCHAR +STARTCHAR U_97C3 +ENCODING 38851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FDC0 +5280 +71E0 +2740 +FBE0 +AA80 +FBE0 +2280 +FA80 +25E0 +ENDCHAR +STARTCHAR U_97C4 +ENCODING 38852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5140 +FFE0 +5140 +73E0 +2680 +FBE0 +AA80 +FBE0 +2240 +F980 +2660 +ENDCHAR +STARTCHAR U_97C5 +ENCODING 38853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FC20 +57E0 +7420 +27E0 +FA40 +ADA0 +FA40 +27E0 +F540 +2AA0 +ENDCHAR +STARTCHAR U_97C6 +ENCODING 38854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FA80 +57E0 +7EA0 +27E0 +F940 +AFE0 +FD40 +2520 +FDE0 +2BE0 +ENDCHAR +STARTCHAR U_97C7 +ENCODING 38855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFE0 +5080 +7FE0 +2AA0 +FFE0 +AA40 +FBC0 +2240 +FBC0 +2660 +ENDCHAR +STARTCHAR U_97C8 +ENCODING 38856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5240 +FFE0 +5280 +FFE0 +AAA0 +FFE0 +24A0 +FEA0 +24C0 +2760 +2820 +ENDCHAR +STARTCHAR U_97C9 +ENCODING 38857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +FA40 +5FE0 +7AA0 +2FE0 +FA00 +ABE0 +FA00 +2BE0 +FAA0 +2D60 +ENDCHAR +STARTCHAR U_97CA +ENCODING 38858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5280 +FFE0 +5AA0 +7EE0 +2AA0 +FFE0 +A920 +FFE0 +2D60 +FBA0 +2D60 +ENDCHAR +STARTCHAR U_97CB +ENCODING 38859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +3F80 +0880 +FFE0 +2080 +3F80 +0400 +7FC0 +2400 +7FE0 +0400 +ENDCHAR +STARTCHAR U_97CC +ENCODING 38860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +F7E0 +50A0 +FAA0 +52A0 +74A0 +20A0 +F920 +A120 +FA20 +24C0 +ENDCHAR +STARTCHAR U_97CD +ENCODING 38861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +F140 +57E0 +F900 +91C0 +F240 +2340 +FAC0 +A280 +FD40 +2A20 +ENDCHAR +STARTCHAR U_97CE +ENCODING 38862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7880 +2BE0 +FC80 +4880 +7BE0 +1080 +FDC0 +52A0 +FCA0 +1080 +ENDCHAR +STARTCHAR U_97CF +ENCODING 38863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7FE0 +0800 +FFE0 +4940 +BFA0 +1100 +7FC0 +2200 +7FC0 +0200 +ENDCHAR +STARTCHAR U_97D0 +ENCODING 38864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7940 +2A20 +FE20 +49C0 +7800 +13E0 +FE20 +5220 +FFE0 +1220 +ENDCHAR +STARTCHAR U_97D1 +ENCODING 38865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +A940 +77E0 +FA40 +53C0 +5FE0 +5280 +53C0 +50A0 +8FE0 +ENDCHAR +STARTCHAR U_97D2 +ENCODING 38866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7AA0 +29C0 +FFE0 +4A20 +7BE0 +1220 +FBE0 +5220 +7E20 +1260 +ENDCHAR +STARTCHAR U_97D3 +ENCODING 38867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2140 +FFE0 +8A40 +FBC0 +8880 +FFE0 +2280 +FFE0 +2080 +ENDCHAR +STARTCHAR U_97D4 +ENCODING 38868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A00 +2BC0 +FE00 +4BC0 +7A00 +13E0 +FE80 +52A0 +FE40 +1320 +ENDCHAR +STARTCHAR U_97D5 +ENCODING 38869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7FE0 +2A40 +FFC0 +4800 +7BE0 +1040 +FC80 +53E0 +FC80 +1180 +ENDCHAR +STARTCHAR U_97D6 +ENCODING 38870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F140 +57E0 +FAA0 +9480 +F100 +27E0 +F900 +A380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97D7 +ENCODING 38871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +5080 +FFE0 +92A0 +F3E0 +22A0 +FBE0 +A080 +FFE0 +2080 +ENDCHAR +STARTCHAR U_97D8 +ENCODING 38872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +FFE0 +5540 +FDC0 +9400 +F7E0 +2100 +FFE0 +A380 +FD40 +2920 +ENDCHAR +STARTCHAR U_97D9 +ENCODING 38873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4940 +7FE0 +4A40 +7BC0 +0080 +FFE0 +5280 +5FE0 +B080 +9FE0 +ENDCHAR +STARTCHAR U_97DA +ENCODING 38874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7BE0 +2940 +F9C0 +4880 +7BE0 +12A0 +FBE0 +5080 +7FE0 +1080 +ENDCHAR +STARTCHAR U_97DB +ENCODING 38875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +7BE0 +2940 +FFE0 +4900 +7BE0 +16A0 +FFE0 +52A0 +7BE0 +12A0 +ENDCHAR +STARTCHAR U_97DC +ENCODING 38876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +F7A0 +5520 +FAC0 +9000 +F660 +2420 +FF60 +A420 +FFE0 +2420 +ENDCHAR +STARTCHAR U_97DD +ENCODING 38877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +F7E0 +5280 +FFE0 +9280 +FFE0 +2540 +FFC0 +A540 +FFE0 +24C0 +ENDCHAR +STARTCHAR U_97DE +ENCODING 38878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7A40 +2BC0 +FE40 +4BC0 +7800 +13E0 +FEA0 +52A0 +FEA0 +17E0 +ENDCHAR +STARTCHAR U_97DF +ENCODING 38879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +5440 +FFC0 +9440 +F7C0 +2100 +FFE0 +A540 +FBA0 +2100 +ENDCHAR +STARTCHAR U_97E0 +ENCODING 38880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F540 +57C0 +FD40 +97C0 +F540 +2FE0 +F540 +AFE0 +F100 +2100 +ENDCHAR +STARTCHAR U_97E1 +ENCODING 38881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +5280 +FFE0 +9540 +FFE0 +2540 +FFE0 +A100 +FFC0 +2100 +ENDCHAR +STARTCHAR U_97E2 +ENCODING 38882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +5100 +FFC0 +9540 +F7C0 +2560 +FFE0 +A540 +FA60 +23C0 +ENDCHAR +STARTCHAR U_97E3 +ENCODING 38883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +FAA0 +4FE0 +F200 +93E0 +F520 +27E0 +FD60 +A7E0 +F920 +27C0 +ENDCHAR +STARTCHAR U_97E4 +ENCODING 38884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +5240 +FFE0 +9AA0 +FFE0 +2140 +F7E0 +A540 +F6A0 +2960 +ENDCHAR +STARTCHAR U_97E5 +ENCODING 38885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +5100 +FFE0 +9AA0 +FFE0 +2240 +FBC0 +A240 +FBC0 +2E60 +ENDCHAR +STARTCHAR U_97E6 +ENCODING 38886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +0800 +7F80 +0800 +0800 +FFC0 +0840 +0840 +0980 +0800 +ENDCHAR +STARTCHAR U_97E7 +ENCODING 38887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBE0 +20A0 +FAA0 +22A0 +FCA0 +28A0 +2920 +3920 +2220 +24C0 +ENDCHAR +STARTCHAR U_97E8 +ENCODING 38888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FA40 +27E0 +7A00 +23C0 +FA40 +2A40 +2D80 +3980 +2260 +2440 +ENDCHAR +STARTCHAR U_97E9 +ENCODING 38889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2100 +FFC0 +8900 +F900 +8FE0 +F920 +2120 +F960 +2100 +ENDCHAR +STARTCHAR U_97EA +ENCODING 38890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +7880 +4BE0 +7880 +03E0 +FCA0 +50E0 +5C80 +7000 +9FE0 +ENDCHAR +STARTCHAR U_97EB +ENCODING 38891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +47C0 +F440 +47C0 +F000 +5FE0 +5AA0 +7AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_97EC +ENCODING 38892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +FF20 +4520 +F2C0 +4000 +F760 +5420 +5760 +7420 +47E0 +4420 +ENDCHAR +STARTCHAR U_97ED +ENCODING 38893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1200 +1200 +F3C0 +1200 +1200 +7380 +1200 +F3C0 +1200 +1200 +FFC0 +ENDCHAR +STARTCHAR U_97EE +ENCODING 38894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0A00 +7BC0 +0A00 +7BC0 +0A00 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_97EF +ENCODING 38895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D40 +1120 +FFE0 +2900 +6D20 +2920 +6CC0 +28A0 +3D60 +E220 +ENDCHAR +STARTCHAR U_97F0 +ENCODING 38896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1FE0 +1140 +3C80 +E940 +3220 +EA00 +7BC0 +0A00 +7BE0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_97F1 +ENCODING 38897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +7520 +9500 +FFE0 +2900 +EF20 +2940 +EE80 +28A0 +FD60 +0220 +ENDCHAR +STARTCHAR U_97F2 +ENCODING 38898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0A40 +F580 +5540 +9520 +7BC0 +0A00 +7BC0 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_97F3 +ENCODING 38899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +1100 +0A00 +FFE0 +0000 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_97F4 +ENCODING 38900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +4880 +33E0 +FEA0 +02A0 +7AA0 +4AE0 +7880 +4880 +7880 +ENDCHAR +STARTCHAR U_97F5 +ENCODING 38901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FA00 +8BE0 +5420 +FA20 +0120 +F820 +89A0 +FE20 +8820 +F8C0 +ENDCHAR +STARTCHAR U_97F6 +ENCODING 38902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F920 +8920 +51E0 +FA40 +0400 +FBE0 +8A20 +FA20 +8BE0 +FA20 +ENDCHAR +STARTCHAR U_97F7 +ENCODING 38903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +5520 +2520 +FD20 +07E0 +7100 +5520 +7520 +57E0 +7420 +ENDCHAR +STARTCHAR U_97F8 +ENCODING 38904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +8E40 +5180 +FB40 +07E0 +F900 +8FC0 +F900 +8FE0 +F900 +ENDCHAR +STARTCHAR U_97F9 +ENCODING 38905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDE0 +4520 +29E0 +FD20 +03E0 +7880 +4880 +7BE0 +4880 +7FE0 +ENDCHAR +STARTCHAR U_97FA +ENCODING 38906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +8A40 +5080 +FFE0 +02A0 +7FE0 +4880 +7940 +4A20 +7C20 +ENDCHAR +STARTCHAR U_97FB +ENCODING 38907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +8BC0 +5000 +F7C0 +0440 +F7C0 +9440 +F7C0 +9280 +FC60 +ENDCHAR +STARTCHAR U_97FC +ENCODING 38908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F9E0 +5740 +2480 +FB60 +0C80 +75C0 +5480 +77E0 +5480 +7BE0 +ENDCHAR +STARTCHAR U_97FD +ENCODING 38909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +ABE0 +7540 +1080 +FFE0 +5000 +FDE0 +9520 +FDE0 +8520 +FDE0 +ENDCHAR +STARTCHAR U_97FE +ENCODING 38910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1220 +FDC0 +5540 +7FE0 +8900 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_97FF +ENCODING 38911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +AEA0 +4AC0 +EEA0 +2AC0 +FFE0 +0900 +FFE0 +1480 +1280 +1F80 +ENDCHAR +STARTCHAR U_9800 +ENCODING 38912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +FFE0 +5280 +27C0 +FC80 +07C0 +7480 +57C0 +7280 +5100 +76C0 +ENDCHAR +STARTCHAR U_9801 +ENCODING 38913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +0900 +70E0 +ENDCHAR +STARTCHAR U_9802 +ENCODING 38914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +27E0 +2420 +27E0 +2420 +27E0 +A280 +4C60 +ENDCHAR +STARTCHAR U_9803 +ENCODING 38915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4100 +47C0 +7440 +47C0 +4440 +47C0 +5440 +67C0 +C280 +0C60 +ENDCHAR +STARTCHAR U_9804 +ENCODING 38916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4100 +F3E0 +5220 +53E0 +5220 +53E0 +5620 +5BE0 +5140 +8620 +ENDCHAR +STARTCHAR U_9805 +ENCODING 38917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +27E0 +2420 +3FE0 +C420 +07E0 +0240 +0C20 +ENDCHAR +STARTCHAR U_9806 +ENCODING 38918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +5480 +55E0 +5520 +55E0 +5520 +55E0 +5520 +45E0 +8540 +8620 +ENDCHAR +STARTCHAR U_9807 +ENCODING 38919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +23E0 +2220 +FBE0 +2220 +23E0 +2220 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_9808 +ENCODING 38920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +2100 +47C0 +9440 +27C0 +4440 +97C0 +1440 +27C0 +4280 +9C60 +ENDCHAR +STARTCHAR U_9809 +ENCODING 38921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1100 +53C0 +5E40 +53C0 +5240 +53C0 +5E40 +E3C0 +0240 +0420 +ENDCHAR +STARTCHAR U_980A +ENCODING 38922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +77E0 +2420 +27E0 +3C20 +E7E0 +4240 +0420 +ENDCHAR +STARTCHAR U_980B +ENCODING 38923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8100 +FBC0 +AA40 +ABC0 +BA40 +ABC0 +A240 +B3C0 +A240 +0420 +ENDCHAR +STARTCHAR U_980C +ENCODING 38924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5100 +4BE0 +8A20 +23E0 +2220 +43E0 +4A20 +FBE0 +0240 +0C20 +ENDCHAR +STARTCHAR U_980D +ENCODING 38925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +FFE0 +1220 +FFE0 +4A20 +2BE0 +1220 +33E0 +4940 +8620 +ENDCHAR +STARTCHAR U_980E +ENCODING 38926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +7080 +43E0 +7A20 +53E0 +5220 +53E0 +5220 +53E0 +5140 +9620 +ENDCHAR +STARTCHAR U_980F +ENCODING 38927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2100 +FFE0 +0220 +73E0 +5220 +53E0 +5620 +5BE0 +5240 +8C20 +ENDCHAR +STARTCHAR U_9810 +ENCODING 38928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9100 +67C0 +2440 +FFC0 +2440 +27C0 +2440 +27C0 +2280 +EC60 +ENDCHAR +STARTCHAR U_9811 +ENCODING 38929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +0080 +03E0 +FA20 +53E0 +5220 +53E0 +5620 +5BE0 +9240 +8C20 +ENDCHAR +STARTCHAR U_9812 +ENCODING 38930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5080 +8BE0 +8A20 +03E0 +F220 +53E0 +5220 +53E0 +9240 +2C20 +ENDCHAR +STARTCHAR U_9813 +ENCODING 38931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +23E0 +AA20 +ABE0 +AA20 +FBE0 +2220 +2BE0 +3240 +2420 +ENDCHAR +STARTCHAR U_9814 +ENCODING 38932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +AA40 +ABC0 +FA40 +ABC0 +AA40 +FBC0 +8A40 +0420 +ENDCHAR +STARTCHAR U_9815 +ENCODING 38933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4200 +77C0 +4440 +47C0 +F440 +97C0 +9440 +F7C0 +9440 +0820 +ENDCHAR +STARTCHAR U_9816 +ENCODING 38934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A880 +73E0 +2220 +FBE0 +2220 +23E0 +FA20 +23E0 +4240 +8420 +ENDCHAR +STARTCHAR U_9817 +ENCODING 38935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +FBE0 +AA20 +A3E0 +FA20 +ABE0 +AA20 +93E0 +AA40 +C420 +ENDCHAR +STARTCHAR U_9818 +ENCODING 38936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +3080 +4BE0 +A620 +13E0 +FA20 +0BE0 +5220 +23E0 +1240 +1420 +ENDCHAR +STARTCHAR U_9819 +ENCODING 38937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +13C0 +1240 +5BC0 +5240 +53C0 +5E40 +E3C0 +0240 +0420 +ENDCHAR +STARTCHAR U_981A +ENCODING 38938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4900 +33C0 +4A40 +87C0 +2240 +7BC0 +2240 +3BC0 +C240 +0420 +ENDCHAR +STARTCHAR U_981B +ENCODING 38939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2080 +FBE0 +2220 +FBE0 +2220 +FBE0 +2220 +73E0 +AA40 +2420 +ENDCHAR +STARTCHAR U_981C +ENCODING 38940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8BE0 +7220 +03E0 +7A20 +4BE0 +4A20 +7BE0 +4A40 +0420 +ENDCHAR +STARTCHAR U_981D +ENCODING 38941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +1080 +FFE0 +4A20 +87E0 +2A20 +2BE0 +1220 +33E0 +4A40 +8420 +ENDCHAR +STARTCHAR U_981E +ENCODING 38942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +FC80 +87E0 +2220 +FFE0 +2A20 +4BE0 +4A20 +33E0 +4A40 +8420 +ENDCHAR +STARTCHAR U_981F +ENCODING 38943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3900 +4BC0 +B240 +33C0 +4A40 +FFC0 +4A40 +4BC0 +7A40 +4C20 +ENDCHAR +STARTCHAR U_9820 +ENCODING 38944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +93E0 +FE20 +83E0 +BA20 +ABE0 +BA20 +A3E0 +BA40 +A420 +ENDCHAR +STARTCHAR U_9821 +ENCODING 38945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +23E0 +2220 +FBE0 +0220 +7BE0 +4A20 +7BE0 +4A40 +0420 +ENDCHAR +STARTCHAR U_9822 +ENCODING 38946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +E100 +23C0 +FA40 +23C0 +2240 +FBC0 +8A40 +8BC0 +F940 +8A20 +ENDCHAR +STARTCHAR U_9823 +ENCODING 38947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A100 +A7C0 +F440 +97C0 +F440 +A7C0 +A440 +A7C0 +FC40 +0820 +ENDCHAR +STARTCHAR U_9824 +ENCODING 38948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9080 +93E0 +BA20 +ABE0 +AA20 +BBE0 +9220 +93E0 +FA40 +0420 +ENDCHAR +STARTCHAR U_9825 +ENCODING 38949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +87E0 +BD00 +ABC0 +AA40 +BFC0 +A640 +BFC0 +AA40 +ABC0 +BA40 +8420 +ENDCHAR +STARTCHAR U_9826 +ENCODING 38950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +1080 +FFE0 +2620 +7BE0 +1220 +27E0 +4A20 +1BE0 +2940 +C620 +ENDCHAR +STARTCHAR U_9827 +ENCODING 38951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +4FC0 +F100 +97C0 +9440 +F7C0 +8440 +F7C0 +9440 +97C0 +F480 +8840 +ENDCHAR +STARTCHAR U_9828 +ENCODING 38952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2480 +B5E0 +6D20 +25E0 +2520 +6DE0 +B520 +25E0 +2540 +4E20 +ENDCHAR +STARTCHAR U_9829 +ENCODING 38953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8FE0 +5080 +FFE0 +2A20 +2BE0 +FE20 +2BE0 +2A20 +4BE0 +4940 +8E20 +ENDCHAR +STARTCHAR U_982A +ENCODING 38954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +A900 +6BC0 +3240 +FBC0 +2240 +73C0 +6A40 +A3C0 +2240 +2420 +ENDCHAR +STARTCHAR U_982B +ENCODING 38955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2880 +ABE0 +6E20 +2BE0 +6E20 +ABE0 +2A20 +2FE0 +4A40 +8420 +ENDCHAR +STARTCHAR U_982C +ENCODING 38956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2100 +FBC0 +AA40 +73C0 +FE40 +23C0 +3240 +4BC0 +8240 +0420 +ENDCHAR +STARTCHAR U_982D +ENCODING 38957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0080 +7BE0 +4A20 +4BE0 +7A20 +8BE0 +5220 +3BE0 +C140 +0220 +ENDCHAR +STARTCHAR U_982E +ENCODING 38958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +D500 +5BC0 +9640 +33C0 +4A40 +4BC0 +FE40 +4BC0 +4A40 +8C20 +ENDCHAR +STARTCHAR U_982F +ENCODING 38959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +3880 +EBE0 +5A20 +23E0 +EA20 +2BE0 +FE20 +2BE0 +4940 +8A20 +ENDCHAR +STARTCHAR U_9830 +ENCODING 38960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +13E0 +5620 +5BE0 +B620 +93E0 +2A20 +27E0 +4140 +8620 +ENDCHAR +STARTCHAR U_9831 +ENCODING 38961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E900 +ABC0 +5240 +13C0 +FA40 +93C0 +5240 +13C0 +5240 +2420 +ENDCHAR +STARTCHAR U_9832 +ENCODING 38962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E5E0 +3880 +29E0 +4920 +FFE0 +2920 +A9E0 +7F20 +41E0 +A140 +9E20 +ENDCHAR +STARTCHAR U_9833 +ENCODING 38963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7900 +13C0 +FE40 +2BC0 +AA40 +AFC0 +2A40 +4BC0 +AA40 +1420 +ENDCHAR +STARTCHAR U_9834 +ENCODING 38964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7100 +43C0 +3A40 +03C0 +7A40 +03C0 +FE40 +23C0 +AA40 +A420 +ENDCHAR +STARTCHAR U_9835 +ENCODING 38965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +2880 +FFE0 +2A20 +7BE0 +2220 +7BE0 +AA20 +2BE0 +3940 +2E20 +ENDCHAR +STARTCHAR U_9836 +ENCODING 38966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5100 +7BC0 +9240 +FFC0 +0240 +7BC0 +4A40 +4BC0 +7A40 +0420 +ENDCHAR +STARTCHAR U_9837 +ENCODING 38967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +ABE0 +1220 +FBE0 +1220 +7BE0 +4A20 +4BE0 +7A40 +4C20 +ENDCHAR +STARTCHAR U_9838 +ENCODING 38968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5480 +ABE0 +AA20 +57E0 +5220 +FBE0 +2220 +3FE0 +E240 +4420 +ENDCHAR +STARTCHAR U_9839 +ENCODING 38969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +F080 +13E0 +FE20 +5BE0 +9620 +2BE0 +2A20 +2FE0 +4A40 +8420 +ENDCHAR +STARTCHAR U_983A +ENCODING 38970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2100 +FBC0 +7240 +AFC0 +FA40 +53C0 +5A40 +4BC0 +6A40 +9420 +ENDCHAR +STARTCHAR U_983B +ENCODING 38971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5080 +5FE0 +5220 +FFE0 +1220 +57E0 +5A20 +93E0 +2140 +C620 +ENDCHAR +STARTCHAR U_983C +ENCODING 38972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +23C0 +FA40 +ABC0 +FA40 +63C0 +7240 +ABC0 +A240 +2420 +ENDCHAR +STARTCHAR U_983D +ENCODING 38973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +1100 +FFC0 +3A40 +57C0 +9240 +3BC0 +2A40 +2FC0 +4A40 +8420 +ENDCHAR +STARTCHAR U_983E +ENCODING 38974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37C0 +C200 +37C0 +C540 +37C0 +C280 +1640 +5A40 +5380 +5A20 +E1E0 +ENDCHAR +STARTCHAR U_983F +ENCODING 38975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +E100 +1BC0 +E240 +1BC0 +EA40 +2FC0 +BA40 +AFC0 +BA40 +E420 +ENDCHAR +STARTCHAR U_9840 +ENCODING 38976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5100 +7BC0 +D240 +7BC0 +5240 +7BC0 +5240 +53C0 +7A40 +0420 +ENDCHAR +STARTCHAR U_9841 +ENCODING 38977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +87E0 +0220 +FFE0 +1220 +5FE0 +5220 +53E0 +B140 +8E20 +ENDCHAR +STARTCHAR U_9842 +ENCODING 38978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +23C0 +6A40 +6BC0 +B640 +23C0 +7240 +AFC0 +2240 +2420 +ENDCHAR +STARTCHAR U_9843 +ENCODING 38979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5880 +53E0 +AA20 +47E0 +9220 +57E0 +5A20 +93E0 +2940 +C620 +ENDCHAR +STARTCHAR U_9844 +ENCODING 38980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +0880 +11E0 +9520 +DDE0 +B520 +DDE0 +9520 +A5E0 +FD40 +0220 +ENDCHAR +STARTCHAR U_9845 +ENCODING 38981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +85E0 +FD20 +81E0 +BD20 +A5E0 +BD20 +A5E0 +BD40 +A620 +ENDCHAR +STARTCHAR U_9846 +ENCODING 38982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FBE0 +2220 +FBE0 +2220 +73E0 +A940 +A620 +ENDCHAR +STARTCHAR U_9847 +ENCODING 38983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +53C0 +5240 +ABC0 +2240 +FFC0 +2240 +23C0 +2240 +2420 +ENDCHAR +STARTCHAR U_9848 +ENCODING 38984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83E0 +F080 +83E0 +FA20 +4BE0 +F220 +4BE0 +FA20 +27E0 +7140 +AA20 +ENDCHAR +STARTCHAR U_9849 +ENCODING 38985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +5080 +8BE0 +FA20 +23E0 +FA20 +ABE0 +7220 +3BE0 +E140 +4620 +ENDCHAR +STARTCHAR U_984A +ENCODING 38986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F080 +93E0 +FA20 +8BE0 +FA20 +23E0 +FE20 +23E0 +2140 +2620 +ENDCHAR +STARTCHAR U_984B +ENCODING 38987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A900 +FBC0 +AA40 +FBC0 +4240 +2BC0 +D640 +CBC0 +4A40 +7420 +ENDCHAR +STARTCHAR U_984C +ENCODING 38988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +4A20 +7BE0 +0220 +FFE0 +5220 +5FE0 +B140 +8FE0 +ENDCHAR +STARTCHAR U_984D +ENCODING 38989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +A7E0 +3A20 +4BE0 +B220 +4BE0 +FE20 +4BE0 +7940 +4E20 +ENDCHAR +STARTCHAR U_984E +ENCODING 38990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +0220 +7BE0 +0220 +FBE0 +2220 +7BE0 +0940 +3620 +ENDCHAR +STARTCHAR U_984F +ENCODING 38991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +53E0 +2220 +FBE0 +9220 +EBE0 +9220 +EBE0 +9140 +E620 +ENDCHAR +STARTCHAR U_9850 +ENCODING 38992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +FFE0 +AA20 +FBE0 +AA20 +FBE0 +2220 +FFE0 +2140 +2620 +ENDCHAR +STARTCHAR U_9851 +ENCODING 38993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1BE0 +1480 +FFE0 +9220 +F3E0 +9620 +EBE0 +AA20 +EFE0 +9140 +A620 +ENDCHAR +STARTCHAR U_9852 +ENCODING 38994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FBE0 +2220 +FBE0 +AA20 +BBE0 +C940 +8E20 +ENDCHAR +STARTCHAR U_9853 +ENCODING 38995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +A880 +FBE0 +0220 +FBE0 +2220 +FBE0 +AA20 +ABE0 +A940 +8E20 +ENDCHAR +STARTCHAR U_9854 +ENCODING 38996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7900 +4BC0 +3240 +7FC0 +5240 +6BC0 +5240 +6BC0 +9240 +E420 +ENDCHAR +STARTCHAR U_9855 +ENCODING 38997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8900 +FBC0 +8A40 +FBC0 +5240 +DBC0 +5240 +7FC0 +C240 +0420 +ENDCHAR +STARTCHAR U_9856 +ENCODING 38998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F900 +DBC0 +AA40 +DBC0 +FA40 +03C0 +2A40 +47C0 +CA40 +3C20 +ENDCHAR +STARTCHAR U_9857 +ENCODING 38999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +A880 +FBE0 +0220 +FBE0 +4A20 +7BE0 +0A20 +53E0 +3940 +E620 +ENDCHAR +STARTCHAR U_9858 +ENCODING 39000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +9080 +BDE0 +A520 +BDE0 +A520 +BDE0 +8920 +ADE0 +CB40 +9A20 +ENDCHAR +STARTCHAR U_9859 +ENCODING 39001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +23E0 +DA20 +4BE0 +DA20 +A7E0 +FA20 +23E0 +7140 +AE20 +ENDCHAR +STARTCHAR U_985A +ENCODING 39002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +4100 +7BC0 +0240 +BBC0 +AA40 +BBC0 +AA40 +FFC0 +5240 +8C20 +ENDCHAR +STARTCHAR U_985B +ENCODING 39003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +23E0 +FA20 +8BE0 +EA20 +BBE0 +8A20 +FFE0 +5140 +8E20 +ENDCHAR +STARTCHAR U_985C +ENCODING 39004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +FC80 +53E0 +FA20 +53E0 +FE20 +ABE0 +FA20 +ABE0 +FD40 +9A20 +ENDCHAR +STARTCHAR U_985D +ENCODING 39005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +6BE0 +FE20 +87E0 +7A20 +4BE0 +7A20 +4BE0 +7940 +5E20 +ENDCHAR +STARTCHAR U_985E +ENCODING 39006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +7080 +23E0 +FA20 +73E0 +AA20 +23E0 +FA20 +23E0 +5140 +8E20 +ENDCHAR +STARTCHAR U_985F +ENCODING 39007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +B480 +6DE0 +B520 +35E0 +4920 +A5E0 +5120 +29E0 +1140 +E220 +ENDCHAR +STARTCHAR U_9860 +ENCODING 39008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2880 +FFE0 +AB20 +FFE0 +0120 +79E0 +0120 +FDE0 +5540 +B220 +ENDCHAR +STARTCHAR U_9861 +ENCODING 39009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F900 +53C0 +FE40 +23C0 +5A40 +B3C0 +5A40 +B7C0 +5240 +B420 +ENDCHAR +STARTCHAR U_9862 +ENCODING 39010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +49E0 +FC80 +49E0 +7920 +21E0 +FD20 +A5E0 +F520 +ADE0 +F540 +AE20 +ENDCHAR +STARTCHAR U_9863 +ENCODING 39011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +05E0 +FE80 +A5E0 +BD20 +A5E0 +FD20 +A5E0 +B720 +EDE0 +A540 +BA20 +ENDCHAR +STARTCHAR U_9864 +ENCODING 39012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7C80 +13E0 +FE20 +4BE0 +FE20 +4BE0 +FE20 +2BE0 +4940 +8E20 +ENDCHAR +STARTCHAR U_9865 +ENCODING 39013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4480 +7DE0 +4520 +7DE0 +1120 +FFE0 +4520 +7DE0 +5540 +B220 +ENDCHAR +STARTCHAR U_9866 +ENCODING 39014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5100 +7FC0 +D240 +7FC0 +5240 +7FC0 +5240 +7FC0 +AA40 +D420 +ENDCHAR +STARTCHAR U_9867 +ENCODING 39015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +87E0 +FE20 +ABE0 +AA20 +FFE0 +AA20 +BFE0 +A940 +BE20 +ENDCHAR +STARTCHAR U_9868 +ENCODING 39016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2100 +7BC0 +6B40 +5AC0 +7BC0 +4A40 +FFE0 +1100 +2100 +4100 +ENDCHAR +STARTCHAR U_9869 +ENCODING 39017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +4480 +B9E0 +0120 +EFE0 +AB20 +EFE0 +4520 +45E0 +AD40 +9220 +ENDCHAR +STARTCHAR U_986A +ENCODING 39018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5080 +FFE0 +1220 +FFE0 +8A20 +FBE0 +AE20 +FBE0 +AD40 +D620 +ENDCHAR +STARTCHAR U_986B +ENCODING 39019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +B5E0 +8520 +FDE0 +4920 +79E0 +4920 +79E0 +0140 +FE20 +ENDCHAR +STARTCHAR U_986C +ENCODING 39020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +1100 +FFC0 +D640 +3BC0 +5640 +FFC0 +2240 +FFC0 +AA40 +AA20 +ENDCHAR +STARTCHAR U_986D +ENCODING 39021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +FD00 +4BC0 +FE40 +ABC0 +FE40 +A7C0 +3A40 +6BC0 +1240 +6420 +ENDCHAR +STARTCHAR U_986E +ENCODING 39022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FD00 +87C0 +7A40 +ABC0 +7A40 +EBC0 +5A40 +6BC0 +7A40 +8C20 +ENDCHAR +STARTCHAR U_986F +ENCODING 39023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4480 +7DE0 +4520 +7DE0 +4B20 +35E0 +5520 +6FE0 +5540 +AA20 +ENDCHAR +STARTCHAR U_9870 +ENCODING 39024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5240 +FE40 +57C0 +AA40 +7FE0 +2440 +3FC0 +0A00 +FFE0 +0200 +ENDCHAR +STARTCHAR U_9871 +ENCODING 39025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +2080 +FBE0 +AA20 +FFE0 +AA20 +FBE0 +AA20 +FFE0 +9540 +FE20 +ENDCHAR +STARTCHAR U_9872 +ENCODING 39026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DE0 +9080 +29E0 +DF20 +51E0 +A920 +45E0 +FF20 +BBE0 +82C0 +FF20 +ENDCHAR +STARTCHAR U_9873 +ENCODING 39027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +4880 +79E0 +4920 +FDE0 +0920 +FFE0 +A520 +FDE0 +A540 +FE20 +ENDCHAR +STARTCHAR U_9874 +ENCODING 39028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2880 +EFE0 +AB20 +EFE0 +4920 +FFE0 +4920 +7DE0 +4940 +7E20 +ENDCHAR +STARTCHAR U_9875 +ENCODING 39029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0400 +3F80 +2080 +2480 +2480 +2480 +2680 +0900 +10C0 +6040 +ENDCHAR +STARTCHAR U_9876 +ENCODING 39030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +2520 +2520 +2520 +2520 +2180 +6240 +0C20 +ENDCHAR +STARTCHAR U_9877 +ENCODING 39031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +9FC0 +8200 +8F80 +E880 +8A80 +8A80 +8A80 +AA80 +C200 +8580 +1840 +ENDCHAR +STARTCHAR U_9878 +ENCODING 39032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2080 +23E0 +2220 +FEA0 +22A0 +22A0 +22A0 +2180 +2240 +2C20 +ENDCHAR +STARTCHAR U_9879 +ENCODING 39033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +2520 +2520 +2520 +3D20 +C180 +0240 +0C20 +ENDCHAR +STARTCHAR U_987A +ENCODING 39034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8BE0 +A880 +ABE0 +AA20 +AAA0 +AAA0 +AAA0 +AAA0 +A880 +8940 +8A20 +ENDCHAR +STARTCHAR U_987B +ENCODING 39035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +4100 +87C0 +1440 +2540 +4540 +8540 +1540 +2180 +4240 +8C20 +ENDCHAR +STARTCHAR U_987C +ENCODING 39036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F900 +27E0 +2420 +74A0 +24A0 +24A0 +3CA0 +E180 +4240 +0C20 +ENDCHAR +STARTCHAR U_987D +ENCODING 39037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77E0 +0080 +0100 +FFE0 +5220 +52A0 +52A0 +56A0 +5AA0 +5140 +8620 +ENDCHAR +STARTCHAR U_987E +ENCODING 39038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8100 +BBE0 +AA20 +AAA0 +AAA0 +BAA0 +A2A0 +A880 +B360 +AC20 +ENDCHAR +STARTCHAR U_987F +ENCODING 39039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FBE0 +2220 +AAA0 +AAA0 +FAA0 +22A0 +2880 +3140 +0620 +ENDCHAR +STARTCHAR U_9880 +ENCODING 39040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +7080 +43E0 +7E20 +52A0 +52A0 +52A0 +52A0 +52A0 +5140 +8620 +ENDCHAR +STARTCHAR U_9881 +ENCODING 39041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +5080 +4BE0 +8620 +7AA0 +2AA0 +2AA0 +2AA0 +2AA0 +4940 +9620 +ENDCHAR +STARTCHAR U_9882 +ENCODING 39042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5080 +4900 +8BE0 +A220 +22A0 +42A0 +52A0 +FAA0 +0940 +0620 +ENDCHAR +STARTCHAR U_9883 +ENCODING 39043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +03E0 +7220 +52A0 +52A0 +52A0 +52A0 +56A0 +9940 +8620 +ENDCHAR +STARTCHAR U_9884 +ENCODING 39044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1080 +63E0 +2220 +FAA0 +2AA0 +22A0 +22A0 +22A0 +2140 +6620 +ENDCHAR +STARTCHAR U_9885 +ENCODING 39045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +3880 +23E0 +7E20 +46A0 +7EA0 +42A0 +42A0 +42A0 +8140 +8620 +ENDCHAR +STARTCHAR U_9886 +ENCODING 39046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +1080 +2900 +67E0 +9220 +02A0 +7AA0 +0AA0 +1080 +2140 +1220 +ENDCHAR +STARTCHAR U_9887 +ENCODING 39047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +7C80 +57E0 +5220 +7AA0 +4AA0 +6AA0 +52A0 +5880 +6540 +8220 +ENDCHAR +STARTCHAR U_9888 +ENCODING 39048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +1080 +3100 +4BE0 +8620 +FAA0 +22A0 +22A0 +3A80 +E140 +4620 +ENDCHAR +STARTCHAR U_9889 +ENCODING 39049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +2080 +FBE0 +2220 +7AA0 +02A0 +7AA0 +4AA0 +4AA0 +7940 +4E20 +ENDCHAR +STARTCHAR U_988A +ENCODING 39050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FC80 +13E0 +9620 +5AA0 +FEA0 +12A0 +12A0 +2AA0 +4540 +8220 +ENDCHAR +STARTCHAR U_988B +ENCODING 39051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F880 +2BE0 +4A20 +FEA0 +2AA0 +AAA0 +7EA0 +22A0 +5140 +8E20 +ENDCHAR +STARTCHAR U_988C +ENCODING 39052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +2880 +47E0 +8220 +7AA0 +02A0 +7AA0 +4AA0 +4AA0 +7940 +4E20 +ENDCHAR +STARTCHAR U_988D +ENCODING 39053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4BE0 +5080 +67E0 +4220 +7EA0 +12A0 +F6A0 +3AA0 +5EA0 +9140 +3220 +ENDCHAR +STARTCHAR U_988E +ENCODING 39054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +97E0 +E100 +97C0 +7440 +0540 +2540 +AD40 +B540 +2100 +5280 +8C40 +ENDCHAR +STARTCHAR U_988F +ENCODING 39055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +2080 +FBE0 +4220 +92A0 +E2A0 +2AA0 +4AA0 +9280 +2940 +C620 +ENDCHAR +STARTCHAR U_9890 +ENCODING 39056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9080 +93E0 +BA20 +AAA0 +AAA0 +BAA0 +92A0 +92A0 +FD40 +0220 +ENDCHAR +STARTCHAR U_9891 +ENCODING 39057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5080 +5FE0 +5220 +FEA0 +12A0 +56A0 +5AA0 +92A0 +2140 +C620 +ENDCHAR +STARTCHAR U_9892 +ENCODING 39058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +D7E0 +5880 +97E0 +3220 +4AA0 +4AA0 +FEA0 +4AA0 +4940 +8A20 +ENDCHAR +STARTCHAR U_9893 +ENCODING 39059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +2080 +FBE0 +3220 +6AA0 +A2A0 +72A0 +52A0 +56A0 +5940 +8620 +ENDCHAR +STARTCHAR U_9894 +ENCODING 39060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +37E0 +4900 +A7E0 +1220 +7AA0 +0AA0 +12A0 +7AA0 +4AA0 +7940 +4A20 +ENDCHAR +STARTCHAR U_9895 +ENCODING 39061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +6100 +47C0 +7440 +0540 +7540 +0540 +FD40 +7100 +AAC0 +2440 +ENDCHAR +STARTCHAR U_9896 +ENCODING 39062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +93E0 +E080 +8BE0 +FA20 +0AA0 +F2A0 +22A0 +FEA0 +32A0 +6940 +A620 +ENDCHAR +STARTCHAR U_9897 +ENCODING 39063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FAA0 +22A0 +FAA0 +22A0 +72A0 +A940 +2620 +ENDCHAR +STARTCHAR U_9898 +ENCODING 39064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +4A20 +7AA0 +02A0 +FEA0 +5280 +5D40 +B220 +8FE0 +ENDCHAR +STARTCHAR U_9899 +ENCODING 39065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +AA20 +FA20 +22A0 +FEA0 +A6A0 +FEA0 +8540 +8E20 +ENDCHAR +STARTCHAR U_989A +ENCODING 39066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FBE0 +0220 +7AA0 +02A0 +FAA0 +22A0 +7AA0 +0940 +3220 +ENDCHAR +STARTCHAR U_989B +ENCODING 39067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +A880 +FBE0 +0220 +FAA0 +22A0 +FAA0 +AAA0 +AAA0 +A940 +8A20 +ENDCHAR +STARTCHAR U_989C +ENCODING 39068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F880 +53E0 +FA20 +8AA0 +92A0 +EAA0 +92A0 +EAA0 +9140 +E620 +ENDCHAR +STARTCHAR U_989D +ENCODING 39069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +87E0 +7A20 +CAA0 +32A0 +4AA0 +FEA0 +4AA0 +7940 +4E20 +ENDCHAR +STARTCHAR U_989E +ENCODING 39070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4880 +7BE0 +4A20 +FEA0 +0AA0 +FEA0 +B6A0 +6AA0 +9540 +2620 +ENDCHAR +STARTCHAR U_989F +ENCODING 39071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +FC80 +2BE0 +FE20 +52A0 +FAA0 +BAA0 +AAA0 +D880 +A940 +8A20 +ENDCHAR +STARTCHAR U_98A0 +ENCODING 39072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FC80 +23E0 +FA20 +8AA0 +EAA0 +BAA0 +8AA0 +FE80 +4940 +8620 +ENDCHAR +STARTCHAR U_98A1 +ENCODING 39073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +5080 +23E0 +FE20 +4AA0 +B6A0 +FAA0 +22A0 +72A0 +A940 +2620 +ENDCHAR +STARTCHAR U_98A2 +ENCODING 39074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +7BE0 +4A20 +7AA0 +22A0 +FEA0 +4AA0 +7AA0 +5540 +B620 +ENDCHAR +STARTCHAR U_98A3 +ENCODING 39075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +3880 +FFE0 +3A20 +56A0 +2AA0 +16A0 +7EA0 +52A0 +9540 +3220 +ENDCHAR +STARTCHAR U_98A4 +ENCODING 39076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FD00 +BBE0 +8A20 +FAA0 +4AA0 +7AA0 +4AA0 +7A80 +0140 +FE20 +ENDCHAR +STARTCHAR U_98A5 +ENCODING 39077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +AA20 +FAA0 +AAA0 +FEA0 +22A0 +FA80 +A940 +AE20 +ENDCHAR +STARTCHAR U_98A6 +ENCODING 39078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +5080 +FFE0 +6AA0 +A940 +7FE0 +2440 +3FC0 +2A40 +FFE0 +0200 +ENDCHAR +STARTCHAR U_98A7 +ENCODING 39079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDE0 +2900 +EFE0 +AA20 +EEA0 +52A0 +FEA0 +52A0 +7EA0 +5140 +7E20 +ENDCHAR +STARTCHAR U_98A8 +ENCODING 39080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2140 +2E40 +2440 +3F40 +3540 +3F40 +2540 +2760 +5CA0 +8820 +ENDCHAR +STARTCHAR U_98A9 +ENCODING 39081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +4C80 +7520 +5440 +7C80 +5520 +7C40 +5480 +5520 +5620 +B9E0 +ENDCHAR +STARTCHAR U_98AA +ENCODING 39082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0500 +0480 +7FC0 +4040 +7FC0 +5540 +5F40 +4560 +7F60 +80A0 +ENDCHAR +STARTCHAR U_98AB +ENCODING 39083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4480 +7FC0 +5480 +7FE0 +5480 +7D40 +5620 +5400 +7A20 +81E0 +ENDCHAR +STARTCHAR U_98AC +ENCODING 39084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +4C40 +7540 +57E0 +7C40 +54C0 +7D40 +5640 +54C0 +5220 +BDE0 +ENDCHAR +STARTCHAR U_98AD +ENCODING 39085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +4C80 +74E0 +5480 +7DE0 +5520 +7D20 +55E0 +5520 +5220 +BDE0 +ENDCHAR +STARTCHAR U_98AE +ENCODING 39086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +9BE0 +EC20 +ABA0 +FAA0 +ABC0 +FA20 +ABE0 +A800 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98AF +ENCODING 39087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +24C0 +FF40 +1540 +97C0 +5540 +57C0 +2940 +F940 +57A0 +2020 +ENDCHAR +STARTCHAR U_98B0 +ENCODING 39088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +4520 +7FE0 +5500 +7DC0 +5540 +7E80 +5540 +5620 +7E20 +81E0 +ENDCHAR +STARTCHAR U_98B1 +ENCODING 39089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +9880 +E920 +ABE0 +F800 +A9E0 +F920 +A920 +A9E0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98B2 +ENCODING 39090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFA0 +9A20 +EBA0 +AAA0 +FDA0 +A8A0 +F920 +AA60 +A800 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98B3 +ENCODING 39091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C20 +4DC0 +7480 +55E0 +7C80 +55E0 +7D20 +55E0 +5400 +5220 +BDE0 +ENDCHAR +STARTCHAR U_98B4 +ENCODING 39092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +45E0 +7E00 +57E0 +7CA0 +54C0 +7E80 +5780 +7C60 +4200 +81E0 +ENDCHAR +STARTCHAR U_98B5 +ENCODING 39093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +89C0 +FBE0 +AA20 +FBE0 +AA20 +FBE0 +AA20 +AA60 +F400 +8BE0 +ENDCHAR +STARTCHAR U_98B6 +ENCODING 39094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9A40 +EB40 +AAC0 +FA40 +ABC0 +FA40 +AFE0 +A940 +A620 +FBE0 +ENDCHAR +STARTCHAR U_98B7 +ENCODING 39095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EA0 +45C0 +7D40 +5620 +7EA0 +55C0 +7C80 +5540 +5620 +7A20 +81E0 +ENDCHAR +STARTCHAR U_98B8 +ENCODING 39096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9AA0 +EBE0 +AAA0 +FBE0 +A940 +FB20 +AD40 +A9C0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98B9 +ENCODING 39097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BC0 +F940 +AFE0 +FA40 +ABC0 +FFE0 +AA80 +ABE0 +F880 +87E0 +ENDCHAR +STARTCHAR U_98BA +ENCODING 39098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9A40 +EBC0 +AA40 +FFE0 +A900 +FFE0 +AAA0 +AD40 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98BB +ENCODING 39099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BE0 +C260 +ABA0 +52A0 +43E0 +7AA0 +A3E0 +FAA0 +22A0 +ABE0 +FC20 +ENDCHAR +STARTCHAR U_98BC +ENCODING 39100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9E0 +9AA0 +EBE0 +AAA0 +FBE0 +A880 +FBE0 +A940 +A880 +F660 +83E0 +ENDCHAR +STARTCHAR U_98BD +ENCODING 39101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +FA60 +03A0 +FAA0 +03E0 +FAA0 +8BE0 +FAA0 +8CA0 +57E0 +F420 +ENDCHAR +STARTCHAR U_98BE +ENCODING 39102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +9AA0 +E9C0 +AAA0 +FBE0 +AAA0 +FBE0 +A880 +ABE0 +B420 +EBE0 +ENDCHAR +STARTCHAR U_98BF +ENCODING 39103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A460 +F7A0 +A4A0 +F7E0 +A6A0 +FFE0 +5CA0 +ACA0 +AFE0 +1020 +ENDCHAR +STARTCHAR U_98C0 +ENCODING 39104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB00 +9AE0 +EBA0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98C1 +ENCODING 39105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA60 +67A0 +AAA0 +13E0 +7AA0 +4BE0 +7AA0 +4AA0 +7BE0 +4C20 +ENDCHAR +STARTCHAR U_98C2 +ENCODING 39106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9DA0 +EB60 +ADA0 +F940 +AAA0 +FD20 +AA40 +A880 +A520 +FBE0 +ENDCHAR +STARTCHAR U_98C3 +ENCODING 39107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8940 +FBE0 +AAA0 +FBE0 +A800 +FBE0 +A8C0 +AAA0 +F4A0 +83E0 +ENDCHAR +STARTCHAR U_98C4 +ENCODING 39108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2A60 +FFA0 +AAA0 +FFE0 +02A0 +7BE0 +02A0 +FEA0 +57E0 +B420 +ENDCHAR +STARTCHAR U_98C5 +ENCODING 39109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8940 +FB60 +AA20 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +FC00 +83E0 +ENDCHAR +STARTCHAR U_98C6 +ENCODING 39110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2BE0 +2660 +FFA0 +32A0 +CBE0 +6EA0 +4BE0 +FEA0 +4AA0 +B7E0 +A420 +ENDCHAR +STARTCHAR U_98C7 +ENCODING 39111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +8FE0 +F980 +AE60 +FA40 +AFE0 +FA40 +ADA0 +A800 +FC20 +83E0 +ENDCHAR +STARTCHAR U_98C8 +ENCODING 39112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7EA0 +45C0 +7C80 +5540 +7E20 +5540 +7FE0 +5540 +56A0 +BE00 +81E0 +ENDCHAR +STARTCHAR U_98C9 +ENCODING 39113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +9BE0 +ED40 +ABE0 +FE40 +ABC0 +F880 +AAC0 +ADA0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98CA +ENCODING 39114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +B440 +27C0 +5540 +8FC0 +5540 +FFC0 +5540 +AFC0 +4860 +1020 +ENDCHAR +STARTCHAR U_98CB +ENCODING 39115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9A40 +EFE0 +AA40 +FFE0 +AB40 +FDA0 +A920 +ABC0 +A420 +FBE0 +ENDCHAR +STARTCHAR U_98CC +ENCODING 39116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5260 +EFA0 +AAA0 +EFE0 +52A0 +FFE0 +52A0 +7EA0 +53E0 +7C20 +ENDCHAR +STARTCHAR U_98CD +ENCODING 39117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +5F40 +84A0 +7FC0 +4440 +7FC0 +5540 +7FC0 +D520 +7BE0 +ENDCHAR +STARTCHAR U_98CE +ENCODING 39118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +4080 +4280 +5280 +4C80 +4480 +4C80 +5280 +62A0 +8060 +8020 +ENDCHAR +STARTCHAR U_98CF +ENCODING 39119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4880 +4900 +4BC0 +6940 +5AC0 +6D40 +4A40 +48C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_98D0 +ENCODING 39120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +7C80 +44E0 +4480 +6C80 +55C0 +5540 +6D40 +45C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_98D1 +ENCODING 39121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +8BE0 +DC20 +ABA0 +AAA0 +ABC0 +DA20 +8BE0 +8800 +8420 +83E0 +ENDCHAR +STARTCHAR U_98D2 +ENCODING 39122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +16C0 +9540 +5540 +66C0 +3C40 +C440 +0820 +1020 +ENDCHAR +STARTCHAR U_98D3 +ENCODING 39123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +8A40 +DB40 +AAC0 +AA40 +ABC0 +DA40 +8FE0 +8940 +8620 +83E0 +ENDCHAR +STARTCHAR U_98D4 +ENCODING 39124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8AA0 +8BE0 +DAA0 +ABE0 +A940 +DAA0 +8E40 +89C0 +8420 +83E0 +ENDCHAR +STARTCHAR U_98D5 +ENCODING 39125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F960 +8AA0 +DBE0 +AAA0 +ABE0 +A880 +DBE0 +8940 +8880 +8560 +83E0 +ENDCHAR +STARTCHAR U_98D6 +ENCODING 39126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1800 +E7C0 +A440 +5C40 +FEC0 +2540 +FD40 +26C0 +AC40 +AC60 +F820 +ENDCHAR +STARTCHAR U_98D7 +ENCODING 39127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8AE0 +FBA0 +AAA0 +FBE0 +AAA0 +FBE0 +AAA0 +ABE0 +F420 +8BE0 +ENDCHAR +STARTCHAR U_98D8 +ENCODING 39128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +2A20 +FE20 +AB60 +FEA0 +02A0 +7BA0 +0260 +FE20 +5420 +B420 +ENDCHAR +STARTCHAR U_98D9 +ENCODING 39129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +FC40 +2440 +56C0 +8D40 +5540 +FD40 +56C0 +5440 +6C40 +A860 +ENDCHAR +STARTCHAR U_98DA +ENCODING 39130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FAA0 +8AC0 +9940 +EE20 +AA40 +AFE0 +DA40 +8A40 +8DA0 +8420 +83E0 +ENDCHAR +STARTCHAR U_98DB +ENCODING 39131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF00 +0140 +1580 +6540 +24A0 +FF60 +2540 +2580 +2540 +44A0 +8460 +ENDCHAR +STARTCHAR U_98DC +ENCODING 39132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +AA60 +7540 +FD60 +7540 +AFC0 +FD60 +AD40 +FD60 +AD40 +F920 +ENDCHAR +STARTCHAR U_98DD +ENCODING 39133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F40 +1580 +FF60 +2540 +44C0 +FFE0 +AB40 +FFE0 +AB40 +AB40 +2520 +ENDCHAR +STARTCHAR U_98DE +ENCODING 39134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC00 +0440 +0480 +0500 +0700 +0480 +0440 +0200 +0220 +0120 +00E0 +ENDCHAR +STARTCHAR U_98DF +ENCODING 39135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1500 +3FE0 +D080 +1F80 +1080 +1F80 +1240 +1580 +1860 +ENDCHAR +STARTCHAR U_98E0 +ENCODING 39136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +10 +30 +48 +A0 +78 +48 +78 +48 +78 +50 +78 +ENDCHAR +STARTCHAR U_98E1 +ENCODING 39137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +8280 +4540 +2FE0 +2440 +17C0 +2440 +C7C0 +4520 +44C0 +0760 +ENDCHAR +STARTCHAR U_98E2 +ENCODING 39138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +5280 +AA80 +FA80 +8A80 +FA80 +8A80 +FA80 +92A0 +ACA0 +C860 +ENDCHAR +STARTCHAR U_98E3 +ENCODING 39139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +53E0 +A880 +F880 +8880 +F880 +8880 +F880 +9480 +AA80 +C900 +ENDCHAR +STARTCHAR U_98E4 +ENCODING 39140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +5500 +F900 +4900 +7900 +4A80 +7A80 +5240 +6C60 +4440 +ENDCHAR +STARTCHAR U_98E5 +ENCODING 39141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +5780 +A900 +F900 +8960 +FF80 +8900 +F900 +9120 +A920 +C8E0 +ENDCHAR +STARTCHAR U_98E6 +ENCODING 39142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BC0 +5500 +F900 +4900 +7FE0 +4900 +7900 +5100 +6900 +4100 +ENDCHAR +STARTCHAR U_98E7 +ENCODING 39143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +4440 +7920 +57C0 +5440 +B7C0 +1440 +27C0 +24A0 +4540 +8620 +ENDCHAR +STARTCHAR U_98E8 +ENCODING 39144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2440 +5920 +E7C0 +2440 +57C0 +F440 +17C0 +24A0 +4640 +8420 +ENDCHAR +STARTCHAR U_98E9 +ENCODING 39145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FAA0 +8AA0 +FAA0 +8BE0 +F880 +90A0 +A8A0 +C860 +ENDCHAR +STARTCHAR U_98EA +ENCODING 39146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +A880 +F880 +8880 +FFE0 +8880 +F880 +9080 +A880 +CBE0 +ENDCHAR +STARTCHAR U_98EB +ENCODING 39147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +A880 +F880 +8BE0 +F880 +8880 +F880 +9140 +AA20 +CC20 +ENDCHAR +STARTCHAR U_98EC +ENCODING 39148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0800 +FFE0 +1100 +3F80 +D160 +1F00 +1480 +1300 +18C0 +ENDCHAR +STARTCHAR U_98ED +ENCODING 39149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +AA00 +FD00 +8900 +FBE0 +8920 +F920 +9220 +ACA0 +C840 +ENDCHAR +STARTCHAR U_98EE +ENCODING 39150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +53E0 +FA40 +4D00 +7900 +4900 +7A80 +4280 +7A40 +4420 +ENDCHAR +STARTCHAR U_98EF +ENCODING 39151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2060 +3380 +4A00 +FFE0 +4A20 +7A20 +4B40 +7AC0 +5280 +6D40 +4620 +ENDCHAR +STARTCHAR U_98F0 +ENCODING 39152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2900 +57E0 +F900 +4900 +7980 +4960 +7920 +5100 +5900 +6900 +ENDCHAR +STARTCHAR U_98F1 +ENCODING 39153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +4540 +4FE0 +7440 +97C0 +5440 +27C0 +2540 +4680 +8460 +ENDCHAR +STARTCHAR U_98F2 +ENCODING 39154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5100 +ABE0 +FC20 +88A0 +F880 +8880 +F880 +9140 +AA20 +CC20 +ENDCHAR +STARTCHAR U_98F3 +ENCODING 39155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2900 +57E0 +F900 +4900 +7900 +4BC0 +7900 +5100 +5900 +6FE0 +ENDCHAR +STARTCHAR U_98F4 +ENCODING 39156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5080 +A900 +F940 +8BA0 +F800 +8BE0 +FA20 +9220 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_98F5 +ENCODING 39157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2A00 +53E0 +FD00 +4900 +79E0 +4900 +79E0 +5100 +5900 +6900 +ENDCHAR +STARTCHAR U_98F6 +ENCODING 39158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +50A0 +AA20 +FA40 +8A40 +FEA0 +8AA0 +FB00 +9220 +AE20 +C9E0 +ENDCHAR +STARTCHAR U_98F7 +ENCODING 39159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2BC0 +5640 +FA40 +4BC0 +7A40 +4A40 +7BC0 +5240 +5A40 +6FE0 +ENDCHAR +STARTCHAR U_98F8 +ENCODING 39160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7A80 +4D40 +7BE0 +0240 +FFC0 +2240 +7BE0 +0B40 +2A80 +1360 +ENDCHAR +STARTCHAR U_98F9 +ENCODING 39161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5CE0 +AAA0 +7AA0 +4AA0 +7AA0 +4AA0 +7EA0 +52E0 +7480 +4880 +ENDCHAR +STARTCHAR U_98FA +ENCODING 39162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5DC0 +5120 +FDE0 +0400 +3B80 +E4E0 +3F80 +2080 +3FA0 +2240 +39E0 +ENDCHAR +STARTCHAR U_98FB +ENCODING 39163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +5280 +FC60 +4900 +7A80 +4900 +7A40 +5080 +5900 +6E00 +ENDCHAR +STARTCHAR U_98FC +ENCODING 39164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5020 +ABA0 +F820 +8BA0 +FAA0 +8AA0 +FBA0 +92A0 +A820 +C8E0 +ENDCHAR +STARTCHAR U_98FD +ENCODING 39165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +ABE0 +FC20 +8BA0 +FAA0 +8BA0 +FA40 +9220 +AA20 +C9E0 +ENDCHAR +STARTCHAR U_98FE +ENCODING 39166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +5200 +ABE0 +FC80 +8BE0 +FAA0 +8AA0 +FAA0 +92A0 +AAE0 +C880 +ENDCHAR +STARTCHAR U_98FF +ENCODING 39167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2AA0 +56A0 +FAA0 +4BE0 +7880 +4AA0 +7AA0 +52A0 +5AA0 +6BE0 +ENDCHAR +STARTCHAR U_9900 +ENCODING 39168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2A80 +57E0 +FA80 +4800 +7C40 +4A40 +7A80 +5100 +5A80 +6C60 +ENDCHAR +STARTCHAR U_9901 +ENCODING 39169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2A60 +5780 +FA80 +4E80 +7BE0 +4A80 +7A80 +5280 +5BE0 +6A00 +ENDCHAR +STARTCHAR U_9902 +ENCODING 39170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +A880 +FBE0 +8880 +F880 +8BE0 +FA20 +9220 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_9903 +ENCODING 39171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5080 +AFE0 +FA40 +8C20 +FA40 +8940 +F880 +9180 +AA40 +CC20 +ENDCHAR +STARTCHAR U_9904 +ENCODING 39172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2980 +5640 +FC20 +4BC0 +7800 +4BC0 +7A40 +5240 +5BC0 +6A40 +ENDCHAR +STARTCHAR U_9905 +ENCODING 39173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +FA40 +8A40 +FFE0 +8A40 +FA40 +9240 +AC40 +C840 +ENDCHAR +STARTCHAR U_9906 +ENCODING 39174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2A80 +56A0 +FAC0 +4E80 +7AC0 +4EA0 +7A80 +5280 +5AA0 +6C60 +ENDCHAR +STARTCHAR U_9907 +ENCODING 39175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5420 +ADE0 +F420 +95E0 +F560 +9560 +F5E0 +8420 +A420 +D460 +ENDCHAR +STARTCHAR U_9908 +ENCODING 39176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +37E0 +E940 +46E0 +1F00 +E4E0 +3F80 +2080 +3FA0 +2140 +38E0 +ENDCHAR +STARTCHAR U_9909 +ENCODING 39177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5200 +AFE0 +F820 +8BA0 +FAA0 +8AA0 +FBA0 +9820 +A820 +C860 +ENDCHAR +STARTCHAR U_990A +ENCODING 39178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +0400 +FFE0 +1500 +62C0 +BFA0 +2080 +3FA0 +2240 +39E0 +ENDCHAR +STARTCHAR U_990B +ENCODING 39179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +7FC0 +0400 +FFE0 +2A80 +D560 +3F80 +D160 +1F40 +1280 +19E0 +ENDCHAR +STARTCHAR U_990C +ENCODING 39180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5240 +AA40 +FBC0 +8A40 +FBC0 +8A40 +FA60 +97C0 +A840 +C840 +ENDCHAR +STARTCHAR U_990D +ENCODING 39181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8500 +BFE0 +9280 +AF40 +90E0 +FF80 +9080 +9FA0 +9140 +9CE0 +ENDCHAR +STARTCHAR U_990E +ENCODING 39182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +55E0 +FE20 +4940 +7880 +4940 +7FE0 +5240 +5A40 +6BC0 +ENDCHAR +STARTCHAR U_990F +ENCODING 39183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2880 +57E0 +F900 +4A00 +7EA0 +4AC0 +7A80 +5240 +5B40 +6A20 +ENDCHAR +STARTCHAR U_9910 +ENCODING 39184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2240 +7580 +AA40 +5FC0 +B0A0 +5F80 +1080 +1FA0 +1540 +18E0 +ENDCHAR +STARTCHAR U_9911 +ENCODING 39185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FFE0 +8C20 +FBE0 +8840 +FFE0 +9080 +A880 +C980 +ENDCHAR +STARTCHAR U_9912 +ENCODING 39186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +5720 +ACA0 +FA40 +8900 +FFE0 +8940 +FA40 +9180 +A940 +CE20 +ENDCHAR +STARTCHAR U_9913 +ENCODING 39187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +56C0 +AAA0 +FA80 +8FE0 +FA80 +8BA0 +FEA0 +9240 +AAE0 +CF20 +ENDCHAR +STARTCHAR U_9914 +ENCODING 39188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +50A0 +AFE0 +F880 +8BE0 +FAA0 +8BE0 +FAA0 +93E0 +AAA0 +CA60 +ENDCHAR +STARTCHAR U_9915 +ENCODING 39189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5240 +AFA0 +F940 +8A20 +F900 +8BC0 +FD40 +9080 +A940 +CE20 +ENDCHAR +STARTCHAR U_9916 +ENCODING 39190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5000 +ABC0 +FA40 +8A40 +FBC0 +8A40 +FC20 +9240 +AA80 +CFE0 +ENDCHAR +STARTCHAR U_9917 +ENCODING 39191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FBE0 +8AA0 +FBE0 +8880 +F9C0 +92A0 +ACA0 +C880 +ENDCHAR +STARTCHAR U_9918 +ENCODING 39192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5280 +AC40 +F820 +8FC0 +F900 +8FE0 +F900 +9540 +B920 +CB00 +ENDCHAR +STARTCHAR U_9919 +ENCODING 39193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2980 +5660 +F880 +4FE0 +7980 +4BE0 +7EA0 +52A0 +5AE0 +6880 +ENDCHAR +STARTCHAR U_991A +ENCODING 39194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2360 +5080 +AB60 +F900 +8FE0 +FA20 +8BE0 +FE20 +93E0 +AA20 +CA60 +ENDCHAR +STARTCHAR U_991B +ENCODING 39195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5440 +AFC0 +FC40 +8FC0 +FC80 +8CA0 +FFC0 +94A0 +ADA0 +CEE0 +ENDCHAR +STARTCHAR U_991C +ENCODING 39196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2AA0 +57E0 +FAA0 +4BE0 +7880 +4FE0 +7980 +52C0 +5CA0 +6880 +ENDCHAR +STARTCHAR U_991D +ENCODING 39197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +2FE0 +5280 +F900 +4880 +7FE0 +4900 +79C0 +5240 +5A40 +6CC0 +ENDCHAR +STARTCHAR U_991E +ENCODING 39198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5240 +AFE0 +FA40 +89A0 +FE60 +8A40 +FFE0 +9280 +AB20 +CCE0 +ENDCHAR +STARTCHAR U_991F +ENCODING 39199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5520 +AAA0 +FB40 +8CA0 +F900 +8FE0 +FD20 +92A0 +AD40 +C9A0 +ENDCHAR +STARTCHAR U_9920 +ENCODING 39200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1120 +2A40 +57E0 +FA40 +4A40 +7FE0 +4A40 +7A40 +5240 +5A40 +6C40 +ENDCHAR +STARTCHAR U_9921 +ENCODING 39201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +51E0 +AA40 +FC00 +8960 +FA20 +8A20 +FB60 +9220 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_9922 +ENCODING 39202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +2900 +57E0 +FA40 +4A80 +7FE0 +4800 +7BC0 +5240 +5A40 +6BC0 +ENDCHAR +STARTCHAR U_9923 +ENCODING 39203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2FE0 +5140 +FEA0 +4BE0 +7AA0 +4BE0 +7AA0 +53E0 +5880 +68E0 +ENDCHAR +STARTCHAR U_9924 +ENCODING 39204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +52A0 +AAC0 +FC80 +8940 +FEA0 +8AA0 +FAC0 +9080 +A940 +CA20 +ENDCHAR +STARTCHAR U_9925 +ENCODING 39205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0A00 +7BC0 +0A00 +FFE0 +1580 +7F60 +A100 +3F40 +2280 +79C0 +ENDCHAR +STARTCHAR U_9926 +ENCODING 39206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2A00 +57C0 +FA00 +4BC0 +7A00 +4FE0 +7B40 +5280 +5A40 +6B20 +ENDCHAR +STARTCHAR U_9927 +ENCODING 39207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5080 +AFE0 +FAC0 +8CA0 +F900 +8FE0 +FA40 +9180 +A940 +CE20 +ENDCHAR +STARTCHAR U_9928 +ENCODING 39208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +AC20 +FBC0 +8A40 +FBC0 +8A00 +FBC0 +9240 +ABC0 +CA40 +ENDCHAR +STARTCHAR U_9929 +ENCODING 39209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +5220 +AC80 +FBE0 +8900 +FA40 +8B80 +F920 +9240 +A8A0 +CB20 +ENDCHAR +STARTCHAR U_992A +ENCODING 39210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5100 +AFE0 +FAA0 +8AA0 +FAA0 +8900 +FFE0 +9100 +AA80 +CC60 +ENDCHAR +STARTCHAR U_992B +ENCODING 39211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +54A0 +AFE0 +FAA0 +8BE0 +FAA0 +8BE0 +F880 +97E0 +A880 +C880 +ENDCHAR +STARTCHAR U_992C +ENCODING 39212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +52A0 +AFA0 +F2E0 +92A0 +F7A0 +95E0 +F7A0 +94A0 +A920 +CA60 +ENDCHAR +STARTCHAR U_992D +ENCODING 39213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +53C0 +AA40 +FBC0 +8A40 +FFE0 +8880 +F880 +93E0 +A880 +CFE0 +ENDCHAR +STARTCHAR U_992E +ENCODING 39214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FB80 +4540 +72A0 +9540 +3B00 +6480 +FF60 +2100 +3F40 +2280 +79C0 +ENDCHAR +STARTCHAR U_992F +ENCODING 39215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +F880 +8FE0 +FA00 +8DA0 +FAC0 +95A0 +AEA0 +C900 +ENDCHAR +STARTCHAR U_9930 +ENCODING 39216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +74E0 +8800 +2200 +F6E0 +9D20 +F520 +9520 +F720 +A520 +F5E0 +9540 +ENDCHAR +STARTCHAR U_9931 +ENCODING 39217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +AFE0 +FA00 +8BE0 +FA40 +8BE0 +FA40 +9240 +AAA0 +CB20 +ENDCHAR +STARTCHAR U_9932 +ENCODING 39218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +FA40 +8BC0 +F900 +8BE0 +FCA0 +9560 +AFA0 +C840 +ENDCHAR +STARTCHAR U_9933 +ENCODING 39219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +FA40 +8FE0 +FC00 +8FE0 +FAA0 +92A0 +AD20 +CA40 +ENDCHAR +STARTCHAR U_9934 +ENCODING 39220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2BE0 +5540 +FAA0 +4BC0 +7880 +4AA0 +7FE0 +5220 +5A20 +6C20 +ENDCHAR +STARTCHAR U_9935 +ENCODING 39221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +5540 +AFC0 +F540 +97C0 +F000 +9FE0 +F500 +8540 +A480 +D660 +ENDCHAR +STARTCHAR U_9936 +ENCODING 39222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2A40 +53C0 +FAC0 +4FE0 +7C20 +4BC0 +7A40 +53C0 +5A40 +6EC0 +ENDCHAR +STARTCHAR U_9937 +ENCODING 39223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2FE0 +5380 +FD40 +4BE0 +7A40 +4BC0 +7A40 +53C0 +5800 +6FE0 +ENDCHAR +STARTCHAR U_9938 +ENCODING 39224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1220 +2940 +5600 +FBE0 +4880 +7FE0 +4A80 +7A80 +5340 +5A20 +6DE0 +ENDCHAR +STARTCHAR U_9939 +ENCODING 39225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +2BE0 +5680 +FBE0 +4AA0 +7BE0 +4BE0 +7A80 +53E0 +5D20 +69E0 +ENDCHAR +STARTCHAR U_993A +ENCODING 39226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20A0 +57E0 +AAA0 +FBE0 +8AA0 +FBE0 +8AA0 +F840 +97E0 +AA40 +C9C0 +ENDCHAR +STARTCHAR U_993B +ENCODING 39227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +2A80 +57E0 +F900 +4BC0 +7900 +4FE0 +7800 +5540 +5AA0 +6AA0 +ENDCHAR +STARTCHAR U_993C +ENCODING 39228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +53E0 +AC00 +FBE0 +8D60 +FBA0 +8920 +FFE0 +93A0 +AD60 +C920 +ENDCHAR +STARTCHAR U_993D +ENCODING 39229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +AD20 +FFE0 +8D20 +FFE0 +8940 +F980 +93E0 +AD20 +C8E0 +ENDCHAR +STARTCHAR U_993E +ENCODING 39230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22E0 +54A0 +ACA0 +FDA0 +8E40 +FBE0 +8AA0 +FBE0 +92A0 +ABE0 +CA20 +ENDCHAR +STARTCHAR U_993F +ENCODING 39231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +51E0 +AAA0 +FBE0 +8AA0 +FBE0 +8880 +FFE0 +9240 +A980 +CE60 +ENDCHAR +STARTCHAR U_9940 +ENCODING 39232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +2B00 +54A0 +FAA0 +4940 +7AE0 +4A20 +7B60 +5220 +5A20 +6BE0 +ENDCHAR +STARTCHAR U_9941 +ENCODING 39233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +A900 +F7E0 +9240 +F7A0 +9000 +FFE0 +AAA0 +BAA0 +DFE0 +ENDCHAR +STARTCHAR U_9942 +ENCODING 39234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +2A40 +57C0 +FA40 +4BC0 +7800 +4BE0 +7AA0 +52A0 +5AA0 +6FE0 +ENDCHAR +STARTCHAR U_9943 +ENCODING 39235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +57E0 +AA40 +F7C0 +9440 +F7C0 +9440 +FFE0 +9100 +B280 +CC60 +ENDCHAR +STARTCHAR U_9944 +ENCODING 39236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1520 +2B40 +57E0 +FC20 +4BC0 +7A40 +4BC0 +7880 +53C0 +5880 +6FE0 +ENDCHAR +STARTCHAR U_9945 +ENCODING 39237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +ABC0 +F240 +9FE0 +FAA0 +9FE0 +F440 +A280 +F100 +8EE0 +ENDCHAR +STARTCHAR U_9946 +ENCODING 39238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +2AA0 +57E0 +FAA0 +4BE0 +7AA0 +4FE0 +7AA0 +57E0 +5880 +6880 +ENDCHAR +STARTCHAR U_9947 +ENCODING 39239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5800 +ABC0 +FA40 +8BC0 +F800 +8BE0 +FAA0 +ABE0 +A800 +DFE0 +ENDCHAR +STARTCHAR U_9948 +ENCODING 39240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +5280 +AFE0 +F880 +8FE0 +FA00 +8BE0 +FCA0 +93E0 +A8A0 +CFE0 +ENDCHAR +STARTCHAR U_9949 +ENCODING 39241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +57E0 +A940 +F880 +8BE0 +FAA0 +8FE0 +F880 +93E0 +A880 +CFE0 +ENDCHAR +STARTCHAR U_994A +ENCODING 39242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FC0 +A540 +FFE0 +9020 +F7A0 +9540 +F740 +A540 +B7A0 +D520 +ENDCHAR +STARTCHAR U_994B +ENCODING 39243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +AD40 +FFE0 +8A40 +FBC0 +8A40 +FBC0 +9240 +ABC0 +CE60 +ENDCHAR +STARTCHAR U_994C +ENCODING 39244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +5AA0 +AEE0 +F880 +9EE0 +F280 +97C0 +F280 +97E0 +BA80 +CC60 +ENDCHAR +STARTCHAR U_994D +ENCODING 39245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +2FE0 +5100 +FFC0 +4900 +7FE0 +4D40 +7B80 +57E0 +5A40 +6BC0 +ENDCHAR +STARTCHAR U_994E +ENCODING 39246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +A880 +FFE0 +8A40 +FBC0 +8A80 +FFE0 +9240 +ABC0 +CA40 +ENDCHAR +STARTCHAR U_994F +ENCODING 39247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +0900 +FFE0 +2A40 +FD80 +0A60 +3F80 +D560 +1F00 +1200 +1980 +ENDCHAR +STARTCHAR U_9950 +ENCODING 39248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +A900 +FFE0 +8C20 +FFE0 +8A40 +FBC0 +9140 +A880 +CFE0 +ENDCHAR +STARTCHAR U_9951 +ENCODING 39249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5BA0 +AD40 +F520 +9FE0 +F140 +9FE0 +F4A0 +A4C0 +FAA0 +9360 +ENDCHAR +STARTCHAR U_9952 +ENCODING 39250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57C0 +A900 +FFE0 +8A40 +FFE0 +8A40 +FFE0 +9280 +ACA0 +C860 +ENDCHAR +STARTCHAR U_9953 +ENCODING 39251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +57E0 +AC20 +FBC0 +8A40 +FBC0 +8900 +FFE0 +9380 +AD40 +C920 +ENDCHAR +STARTCHAR U_9954 +ENCODING 39252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +5500 +5FC0 +F500 +2FE0 +D200 +3FE0 +E100 +3F00 +2480 +7BC0 +ENDCHAR +STARTCHAR U_9955 +ENCODING 39253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1C0 +9100 +FFE0 +4520 +7DC0 +1560 +7FC0 +A100 +3F40 +2280 +39E0 +ENDCHAR +STARTCHAR U_9956 +ENCODING 39254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +5500 +AFE0 +F8A0 +8FE0 +F880 +8FA0 +FAA0 +9F40 +AAA0 +CD20 +ENDCHAR +STARTCHAR U_9957 +ENCODING 39255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +48E0 +BEA0 +52C0 +BEA0 +54E0 +8E80 +3F80 +E160 +3F40 +2680 +39C0 +ENDCHAR +STARTCHAR U_9958 +ENCODING 39256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +ABA0 +F820 +9FE0 +F440 +97C0 +F440 +97C0 +B000 +CFE0 +ENDCHAR +STARTCHAR U_9959 +ENCODING 39257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +57E0 +AAA0 +FFE0 +8A20 +FBC0 +8A40 +FBC0 +9240 +ABC0 +CE60 +ENDCHAR +STARTCHAR U_995A +ENCODING 39258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +2FE0 +5540 +FFE0 +4900 +7FE0 +4A40 +7BE0 +52A0 +5AA0 +6FE0 +ENDCHAR +STARTCHAR U_995B +ENCODING 39259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +5FE0 +A280 +FFE0 +9820 +F7E0 +9540 +FB80 +A5C0 +FAA0 +9520 +ENDCHAR +STARTCHAR U_995C +ENCODING 39260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4C0 +BCA0 +A7E0 +BC80 +AB40 +9FC0 +F0A0 +9FA0 +9240 +99E0 +ENDCHAR +STARTCHAR U_995D +ENCODING 39261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +AFE0 +DA40 +EFE0 +AAC0 +EF60 +AFE0 +EA00 +CFC0 +AA40 +D3C0 +ENDCHAR +STARTCHAR U_995E +ENCODING 39262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +5480 +AFE0 +F420 +97E0 +F480 +9FE0 +F540 +A7C0 +F2A0 +8CE0 +ENDCHAR +STARTCHAR U_995F +ENCODING 39263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +AAA0 +FEE0 +9240 +FFE0 +9240 +FFE0 +A2A0 +F640 +8B20 +ENDCHAR +STARTCHAR U_9960 +ENCODING 39264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +5AA0 +AFE0 +7480 +55E0 +7B40 +55E0 +7940 +6FE0 +5540 +6BE0 +ENDCHAR +STARTCHAR U_9961 +ENCODING 39265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +5FE0 +A540 +FFE0 +9540 +FFE0 +9440 +F7C0 +A440 +B7C0 +CC60 +ENDCHAR +STARTCHAR U_9962 +ENCODING 39266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +5FE0 +A540 +7FE0 +5560 +7FC0 +5540 +7FE0 +6540 +5D80 +6660 +ENDCHAR +STARTCHAR U_9963 +ENCODING 39267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 0 -1 +BITMAP +40 +40 +7C +48 +80 +20 +20 +20 +28 +30 +20 +ENDCHAR +STARTCHAR U_9964 +ENCODING 39268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +47E0 +7880 +4880 +B080 +2080 +2080 +2080 +2880 +3280 +2100 +ENDCHAR +STARTCHAR U_9965 +ENCODING 39269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +4480 +7C80 +4C80 +A480 +2480 +2480 +2C80 +34A0 +28A0 +1060 +ENDCHAR +STARTCHAR U_9966 +ENCODING 39270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +4600 +7A00 +5200 +83E0 +2E00 +2200 +2200 +2A00 +3220 +21E0 +ENDCHAR +STARTCHAR U_9967 +ENCODING 39271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F80 +4100 +7A00 +9400 +87E0 +22A0 +22A0 +24A0 +2920 +3220 +04C0 +ENDCHAR +STARTCHAR U_9968 +ENCODING 39272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7FE0 +8900 +A520 +2520 +27E0 +2900 +3120 +2120 +00E0 +ENDCHAR +STARTCHAR U_9969 +ENCODING 39273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43E0 +7C00 +93C0 +8000 +2780 +2080 +2880 +30A0 +2060 +0020 +ENDCHAR +STARTCHAR U_996A +ENCODING 39274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +5100 +8100 +27E0 +2100 +2100 +2900 +3100 +27E0 +ENDCHAR +STARTCHAR U_996B +ENCODING 39275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7900 +9100 +A7E0 +2100 +2100 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_996C +ENCODING 39276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +4D00 +A100 +27E0 +2120 +2120 +3220 +2420 +08C0 +ENDCHAR +STARTCHAR U_996D +ENCODING 39277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +4700 +7C00 +4FC0 +A440 +2640 +2540 +2D40 +3480 +2940 +1620 +ENDCHAR +STARTCHAR U_996E +ENCODING 39278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4200 +7BE0 +4A20 +A540 +2100 +2100 +2100 +2280 +3440 +2820 +ENDCHAR +STARTCHAR U_996F +ENCODING 39279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +4240 +7BE0 +4E00 +A2E0 +2F00 +2120 +2940 +30A0 +2360 +0C20 +ENDCHAR +STARTCHAR U_9970 +ENCODING 39280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43E0 +7C80 +4880 +A7E0 +24A0 +24A0 +2CA0 +34A0 +24E0 +0080 +ENDCHAR +STARTCHAR U_9971 +ENCODING 39281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +47C0 +7C40 +9740 +AD40 +2540 +2740 +24C0 +2C20 +3420 +23E0 +ENDCHAR +STARTCHAR U_9972 +ENCODING 39282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4020 +7BA0 +8820 +A3A0 +22A0 +22A0 +23A0 +2AA0 +3020 +2060 +ENDCHAR +STARTCHAR U_9973 +ENCODING 39283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7540 +9540 +6540 +47C0 +4100 +4920 +5920 +6FE0 +4820 +ENDCHAR +STARTCHAR U_9974 +ENCODING 39284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7A40 +97A0 +8020 +2000 +23E0 +2A20 +3220 +23E0 +0220 +ENDCHAR +STARTCHAR U_9975 +ENCODING 39285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4240 +7A40 +8BC0 +A240 +23C0 +2240 +2A60 +37C0 +2040 +0040 +ENDCHAR +STARTCHAR U_9976 +ENCODING 39286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +47E0 +7A80 +9120 +AEE0 +2000 +27E0 +2A80 +32A0 +24A0 +0860 +ENDCHAR +STARTCHAR U_9977 +ENCODING 39287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4200 +7FE0 +9820 +0BA0 +4AA0 +4BA0 +4AA0 +6820 +4820 +08E0 +ENDCHAR +STARTCHAR U_9978 +ENCODING 39288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7A80 +5440 +A820 +2780 +2000 +27C0 +2C40 +3440 +27C0 +ENDCHAR +STARTCHAR U_9979 +ENCODING 39289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43C0 +7C40 +9280 +6900 +4280 +4C60 +47C0 +5440 +6440 +47C0 +ENDCHAR +STARTCHAR U_997A +ENCODING 39290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4080 +7FE0 +4A40 +A420 +2A80 +2280 +2900 +3280 +2440 +0820 +ENDCHAR +STARTCHAR U_997B +ENCODING 39291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4100 +7FE0 +9200 +4600 +4540 +4D40 +5480 +4480 +6640 +4420 +ENDCHAR +STARTCHAR U_997C +ENCODING 39292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4140 +7FE0 +8940 +A140 +27E0 +2140 +2940 +3240 +2440 +0840 +ENDCHAR +STARTCHAR U_997D +ENCODING 39293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7900 +8FE0 +A420 +23C0 +2080 +2FE0 +3100 +2500 +0200 +ENDCHAR +STARTCHAR U_997E +ENCODING 39294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +4FE0 +7000 +97C0 +6440 +4440 +47C0 +4440 +5240 +6280 +4FE0 +ENDCHAR +STARTCHAR U_997F +ENCODING 39295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4180 +46C0 +7AA0 +8FE0 +A280 +22A0 +27A0 +2AC0 +22A0 +3360 +2620 +ENDCHAR +STARTCHAR U_9980 +ENCODING 39296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4280 +7440 +5820 +A7C0 +2100 +2FE0 +2900 +3540 +2920 +1320 +ENDCHAR +STARTCHAR U_9981 +ENCODING 39297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +4780 +7D20 +4AA0 +A140 +2FE0 +2140 +2A40 +3180 +2340 +0C20 +ENDCHAR +STARTCHAR U_9982 +ENCODING 39298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4100 +7240 +97E0 +6440 +4A20 +47C0 +4A40 +4180 +6180 +4660 +ENDCHAR +STARTCHAR U_9983 +ENCODING 39299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4540 +7FC0 +9540 +67C0 +4100 +4FE0 +4380 +6540 +4920 +0100 +ENDCHAR +STARTCHAR U_9984 +ENCODING 39300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +4420 +7FE0 +9420 +A7E0 +2480 +24A0 +2FC0 +34A0 +25A0 +0660 +ENDCHAR +STARTCHAR U_9985 +ENCODING 39301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +43E0 +7A40 +9480 +A200 +24E0 +2420 +2760 +2C20 +37E0 +2420 +ENDCHAR +STARTCHAR U_9986 +ENCODING 39302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47E0 +7C20 +53C0 +A240 +23C0 +2200 +2BE0 +3220 +23E0 +0220 +ENDCHAR +STARTCHAR U_9987 +ENCODING 39303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4FE0 +7540 +5920 +87C0 +2440 +27C0 +2C40 +37C0 +2000 +0FE0 +ENDCHAR +STARTCHAR U_9988 +ENCODING 39304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7540 +9FE0 +A000 +27C0 +2440 +2D40 +3540 +2280 +0C60 +ENDCHAR +STARTCHAR U_9989 +ENCODING 39305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +7740 +9540 +6FE0 +4820 +47C0 +4440 +57C0 +6440 +44C0 +ENDCHAR +STARTCHAR U_998A +ENCODING 39306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +4760 +7D20 +4F60 +A520 +27E0 +2100 +2FE0 +3240 +2180 +0E60 +ENDCHAR +STARTCHAR U_998B +ENCODING 39307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +4480 +7FE0 +5520 +A7E0 +2280 +24E0 +2900 +2080 +3300 +20C0 +ENDCHAR +STARTCHAR U_998C +ENCODING 39308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +7100 +9FE0 +6240 +4FE0 +4000 +47C0 +5540 +6540 +4FE0 +ENDCHAR +STARTCHAR U_998D +ENCODING 39309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +47E0 +7A80 +57C0 +A440 +27C0 +2440 +2FE0 +3100 +2280 +0C60 +ENDCHAR +STARTCHAR U_998E +ENCODING 39310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +4FE0 +7540 +57C0 +A540 +47C0 +4540 +5FE0 +4440 +6240 +40C0 +ENDCHAR +STARTCHAR U_998F +ENCODING 39311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +4DE0 +7AA0 +5AA0 +8D20 +4240 +47E0 +4520 +57E0 +6520 +47E0 +ENDCHAR +STARTCHAR U_9990 +ENCODING 39312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +4140 +7FE0 +5100 +8FE0 +2100 +27E0 +2D40 +33C0 +2140 +0FE0 +ENDCHAR +STARTCHAR U_9991 +ENCODING 39313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +47E0 +7A40 +4BC0 +A7E0 +2520 +27E0 +2900 +37C0 +2100 +0FE0 +ENDCHAR +STARTCHAR U_9992 +ENCODING 39314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +4440 +77C0 +5440 +AFE0 +2AA0 +2FE0 +2C40 +3280 +2100 +0EE0 +ENDCHAR +STARTCHAR U_9993 +ENCODING 39315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8A80 +9F80 +EAE0 +BFA0 +8AA0 +4EA0 +4AA0 +5EA0 +6A40 +4AA0 +0D20 +ENDCHAR +STARTCHAR U_9994 +ENCODING 39316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4920 +7FE0 +5880 +AFE0 +2240 +27E0 +2240 +3FE0 +2440 +0820 +ENDCHAR +STARTCHAR U_9995 +ENCODING 39317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +4540 +7FE0 +AB40 +4FC0 +4280 +4FE0 +5280 +6FE0 +4D40 +06E0 +ENDCHAR +STARTCHAR U_9996 +ENCODING 39318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +0800 +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9997 +ENCODING 39319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +4FE0 +4100 +F7C0 +5440 +5740 +55C0 +5440 +57E0 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9998 +ENCODING 39320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +88C0 +50A0 +FFE0 +2080 +FEA0 +9AA0 +FEA0 +90C0 +FEA0 +9160 +F220 +ENDCHAR +STARTCHAR U_9999 +ENCODING 39321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0180 +7E00 +0400 +FFE0 +1500 +2480 +FFE0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_999A +ENCODING 39322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +2280 +FA40 +7440 +A820 +27C0 +7A40 +4A40 +7A40 +4B40 +7C80 +ENDCHAR +STARTCHAR U_999B +ENCODING 39323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +2120 +FFE0 +7100 +A900 +21C0 +7240 +5340 +7480 +5540 +7A20 +ENDCHAR +STARTCHAR U_999C +ENCODING 39324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0BE0 +F220 +1220 +FFE0 +5A80 +96A0 +7AC0 +4A80 +7AA0 +4AA0 +7CE0 +ENDCHAR +STARTCHAR U_999D +ENCODING 39325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7240 +2140 +FE80 +2A80 +66C0 +A2A0 +7AA0 +4A80 +7B40 +4A40 +7DC0 +ENDCHAR +STARTCHAR U_999E +ENCODING 39326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +67E0 +2080 +FFE0 +3420 +6BC0 +F840 +4FE0 +7880 +4880 +7980 +ENDCHAR +STARTCHAR U_999F +ENCODING 39327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +2720 +FAA0 +7140 +ABC0 +2080 +7080 +57E0 +7080 +5280 +7100 +ENDCHAR +STARTCHAR U_99A0 +ENCODING 39328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2280 +FA40 +7520 +ABC0 +2080 +7100 +57C0 +7440 +57C0 +7440 +ENDCHAR +STARTCHAR U_99A1 +ENCODING 39329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +6280 +26E0 +FA80 +3280 +6EE0 +FA80 +4A80 +7EE0 +4A80 +7A80 +ENDCHAR +STARTCHAR U_99A2 +ENCODING 39330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7280 +2240 +FFC0 +7140 +A8A0 +2360 +7A80 +4FC0 +7940 +48A0 +7B60 +ENDCHAR +STARTCHAR U_99A3 +ENCODING 39331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +67E0 +2280 +FD40 +37E0 +6D40 +FFC0 +4D40 +7FC0 +4920 +78E0 +ENDCHAR +STARTCHAR U_99A4 +ENCODING 39332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +77C0 +2540 +FCC0 +77C0 +AC00 +77E0 +5920 +7520 +56A0 +77A0 +0060 +ENDCHAR +STARTCHAR U_99A5 +ENCODING 39333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +63E0 +2620 +FBE0 +3220 +6BE0 +F900 +4BE0 +7D40 +4880 +7B60 +ENDCHAR +STARTCHAR U_99A6 +ENCODING 39334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +6280 +27E0 +FAA0 +37E0 +6AA0 +FFE0 +4A80 +7EC0 +4AA0 +7AA0 +ENDCHAR +STARTCHAR U_99A7 +ENCODING 39335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +6240 +23C0 +FA40 +33C0 +6800 +FFE0 +4AA0 +7AA0 +4AA0 +7FE0 +ENDCHAR +STARTCHAR U_99A8 +ENCODING 39336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +1140 +7FE0 +5540 +7C80 +8540 +FFE0 +1480 +7FE0 +1080 +1F80 +ENDCHAR +STARTCHAR U_99A9 +ENCODING 39337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +27E0 +FA40 +77E0 +AA40 +7BC0 +4B40 +7AC0 +4B40 +7BC0 +0660 +ENDCHAR +STARTCHAR U_99AA +ENCODING 39338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +27E0 +F820 +77E0 +AD40 +7BC0 +4E40 +7BC0 +4A40 +7BC0 +4E60 +ENDCHAR +STARTCHAR U_99AB +ENCODING 39339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +FFE0 +2480 +FFE0 +2080 +3F80 +FBE0 +2AC0 +FFE0 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_99AC +ENCODING 39340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2400 +3F80 +2400 +3F80 +2400 +3FE0 +0020 +5520 +4AA0 +8AC0 +ENDCHAR +STARTCHAR U_99AD +ENCODING 39341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5120 +7D20 +5120 +7D40 +5140 +7CC0 +5480 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99AE +ENCODING 39342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2500 +17C0 +1500 +27C0 +2500 +C7E0 +4020 +4560 +4AA0 +0AC0 +ENDCHAR +STARTCHAR U_99AF +ENCODING 39343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5080 +7880 +5080 +7BE0 +5080 +7C80 +5480 +AC80 +A480 +1880 +ENDCHAR +STARTCHAR U_99B0 +ENCODING 39344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5100 +7FE0 +5220 +7C20 +5120 +7CA0 +54A0 +AC20 +A520 +18C0 +ENDCHAR +STARTCHAR U_99B1 +ENCODING 39345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5080 +7880 +53E0 +7880 +5080 +7C80 +5480 +AD40 +A620 +1820 +ENDCHAR +STARTCHAR U_99B2 +ENCODING 39346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5380 +7900 +5100 +7960 +5380 +7D00 +5500 +AD20 +A520 +18E0 +ENDCHAR +STARTCHAR U_99B3 +ENCODING 39347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A2A0 +FAE0 +A3A0 +FEA0 +A2A0 +FAE0 +5A80 +AA20 +AA20 +11E0 +ENDCHAR +STARTCHAR U_99B4 +ENCODING 39348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA20 +A2A0 +F2A0 +A2A0 +F2A0 +A2A0 +FAA0 +5AA0 +AAA0 +AA20 +1420 +ENDCHAR +STARTCHAR U_99B5 +ENCODING 39349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2400 +3FC0 +2400 +3FE0 +2A20 +5540 +1100 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_99B6 +ENCODING 39350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FE0 +5100 +7BC0 +5240 +7A40 +0980 +D900 +AAE0 +1C40 +ENDCHAR +STARTCHAR U_99B7 +ENCODING 39351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +53E0 +7880 +53E0 +7AA0 +52A0 +7AA0 +0AA0 +DAE0 +A880 +1880 +ENDCHAR +STARTCHAR U_99B8 +ENCODING 39352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5380 +7A00 +5200 +7BE0 +5240 +7A40 +0A40 +DA40 +AC40 +1440 +ENDCHAR +STARTCHAR U_99B9 +ENCODING 39353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5220 +7A20 +5220 +7BE0 +5220 +7E20 +5620 +AE20 +A7E0 +1A20 +ENDCHAR +STARTCHAR U_99BA +ENCODING 39354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5120 +7920 +5140 +7960 +5120 +7D20 +5540 +AE80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99BB +ENCODING 39355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +F240 +A420 +F7E0 +A280 +FA80 +5A80 +AAA0 +AAA0 +3460 +ENDCHAR +STARTCHAR U_99BC +ENCODING 39356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5080 +7FE0 +5040 +7A40 +5240 +7980 +0980 +D980 +AA40 +1420 +ENDCHAR +STARTCHAR U_99BD +ENCODING 39357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +7FC0 +4400 +7F80 +4400 +7FC0 +4A40 +A540 +7FC0 +4440 +7FC0 +0400 +ENDCHAR +STARTCHAR U_99BE +ENCODING 39358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FE0 +5520 +7940 +5100 +7980 +0A80 +5AA0 +ACA0 +1860 +ENDCHAR +STARTCHAR U_99BF +ENCODING 39359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5080 +7BE0 +5220 +7BE0 +5200 +7A00 +0A00 +DA00 +AC00 +1400 +ENDCHAR +STARTCHAR U_99C0 +ENCODING 39360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +5240 +7A00 +57E0 +7A80 +5280 +7A80 +0A80 +DAA0 +ACA0 +1860 +ENDCHAR +STARTCHAR U_99C1 +ENCODING 39361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E20 +5140 +7C80 +5140 +7E20 +5040 +7E40 +5580 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99C2 +ENCODING 39362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +83E0 +9280 +E280 +8BE0 +7A80 +23E0 +FE80 +23E0 +22A0 +2560 +2940 +ENDCHAR +STARTCHAR U_99C3 +ENCODING 39363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A100 +FBC0 +A140 +F940 +A140 +FFE0 +5900 +AA80 +AC40 +1020 +ENDCHAR +STARTCHAR U_99C4 +ENCODING 39364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7900 +57E0 +7900 +5100 +7A80 +0A80 +DD40 +A960 +1000 +ENDCHAR +STARTCHAR U_99C5 +ENCODING 39365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7A40 +5240 +7BC0 +5300 +7B00 +0A80 +DA80 +AC60 +1840 +ENDCHAR +STARTCHAR U_99C6 +ENCODING 39366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5200 +7A00 +5320 +7AC0 +5240 +7EA0 +0720 +AE00 +D7E0 +0800 +ENDCHAR +STARTCHAR U_99C7 +ENCODING 39367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5100 +79E0 +5140 +7B40 +5140 +7D40 +5540 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99C8 +ENCODING 39368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5380 +7A00 +5200 +7BE0 +5240 +7A40 +0A40 +DA40 +AFE0 +1000 +ENDCHAR +STARTCHAR U_99C9 +ENCODING 39369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A420 +F420 +A7A0 +F6A0 +A6A0 +FFA0 +5EA0 +AC20 +AC20 +3460 +ENDCHAR +STARTCHAR U_99CA +ENCODING 39370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FE0 +5540 +7D00 +57C0 +7E40 +0580 +AD80 +D640 +0820 +ENDCHAR +STARTCHAR U_99CB +ENCODING 39371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5120 +7920 +5120 +7AE0 +5440 +7DE0 +5520 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_99CC +ENCODING 39372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7E40 +CAC0 +3220 +3FE0 +C400 +7F80 +4400 +7FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_99CD +ENCODING 39373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5080 +7AA0 +51C0 +7880 +5080 +7FE0 +5480 +AC80 +A480 +1880 +ENDCHAR +STARTCHAR U_99CE +ENCODING 39374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A080 +FBE0 +A2A0 +FAA0 +A3E0 +FAA0 +5AA0 +AAA0 +ABE0 +1220 +ENDCHAR +STARTCHAR U_99CF +ENCODING 39375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5100 +7D00 +51E0 +7D20 +5120 +7DE0 +5500 +AD00 +A500 +19E0 +ENDCHAR +STARTCHAR U_99D0 +ENCODING 39376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5080 +7BE0 +5080 +7880 +5080 +7FE0 +5480 +AC80 +A480 +1BE0 +ENDCHAR +STARTCHAR U_99D1 +ENCODING 39377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFC0 +4A40 +3180 +3FE0 +E400 +3F80 +2400 +3FE0 +6A20 +95C0 +ENDCHAR +STARTCHAR U_99D2 +ENCODING 39378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +FC20 +A3A0 +FAA0 +A2A0 +FBA0 +5AA0 +A820 +A920 +30C0 +ENDCHAR +STARTCHAR U_99D3 +ENCODING 39379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5080 +7880 +5080 +79C0 +52A0 +7CA0 +0480 +5480 +AC00 +1BE0 +ENDCHAR +STARTCHAR U_99D4 +ENCODING 39380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +A240 +F240 +A240 +F3C0 +A240 +FA40 +2BC0 +5A40 +AA40 +B7E0 +ENDCHAR +STARTCHAR U_99D5 +ENCODING 39381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2BC0 +5000 +BFC0 +2400 +3F80 +2400 +3FE0 +6A20 +95C0 +ENDCHAR +STARTCHAR U_99D6 +ENCODING 39382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5180 +7A40 +5520 +7880 +53E0 +7C40 +0480 +5500 +AC80 +1840 +ENDCHAR +STARTCHAR U_99D7 +ENCODING 39383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5140 +7E20 +5080 +7D20 +5040 +7C80 +0520 +5440 +AC80 +BB00 +ENDCHAR +STARTCHAR U_99D8 +ENCODING 39384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5100 +7940 +5220 +7BE0 +5000 +7DE0 +0520 +5520 +ADE0 +AD20 +ENDCHAR +STARTCHAR U_99D9 +ENCODING 39385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +A240 +F240 +A7E0 +FA40 +A340 +FAC0 +5A40 +AA40 +AA40 +32C0 +ENDCHAR +STARTCHAR U_99DA +ENCODING 39386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5100 +7FC0 +5540 +7D40 +5540 +7FE0 +0900 +DA80 +AA40 +1420 +ENDCHAR +STARTCHAR U_99DB +ENCODING 39387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A080 +FBE0 +A2A0 +FAA0 +A3E0 +F880 +5A80 +A900 +AA80 +3460 +ENDCHAR +STARTCHAR U_99DC +ENCODING 39388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +A0A0 +FA40 +A240 +FAA0 +A6A0 +FA80 +5B00 +AA20 +AA20 +35E0 +ENDCHAR +STARTCHAR U_99DD +ENCODING 39389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5080 +7BE0 +5220 +7900 +5140 +7D80 +5500 +AD20 +A520 +18E0 +ENDCHAR +STARTCHAR U_99DE +ENCODING 39390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7A00 +5480 +7A80 +57E0 +7AA0 +0AE0 +DA80 +AA20 +11E0 +ENDCHAR +STARTCHAR U_99DF +ENCODING 39391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +AFE0 +FAA0 +AAA0 +FAA0 +AAA0 +FAE0 +5C20 +A820 +AFE0 +3820 +ENDCHAR +STARTCHAR U_99E0 +ENCODING 39392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +ACE0 +FAA0 +AAA0 +FAA0 +AEA0 +FAE0 +1280 +B280 +D280 +3480 +ENDCHAR +STARTCHAR U_99E1 +ENCODING 39393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +3FC0 +2400 +3F80 +2400 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_99E2 +ENCODING 39394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +5140 +7FE0 +5140 +7940 +53E0 +7D40 +5540 +AD40 +A540 +1A40 +ENDCHAR +STARTCHAR U_99E3 +ENCODING 39395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +A2A0 +FAC0 +A680 +FA80 +A6C0 +FAA0 +5A80 +AAA0 +AAA0 +3460 +ENDCHAR +STARTCHAR U_99E4 +ENCODING 39396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5080 +7940 +53E0 +7820 +5080 +7C80 +57E0 +AC80 +A480 +1BE0 +ENDCHAR +STARTCHAR U_99E5 +ENCODING 39397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +A0A0 +FFE0 +A080 +FAA0 +A7A0 +FAA0 +5AC0 +AAA0 +AD60 +3220 +ENDCHAR +STARTCHAR U_99E6 +ENCODING 39398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1500 +3F80 +0800 +FFE0 +2080 +FF60 +2400 +3F00 +2400 +3FC0 +5540 +ENDCHAR +STARTCHAR U_99E7 +ENCODING 39399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A820 +F820 +ABA0 +F820 +ABA0 +FAA0 +4AA0 +ABA0 +A820 +1860 +ENDCHAR +STARTCHAR U_99E8 +ENCODING 39400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7C20 +53A0 +7AA0 +53A0 +7EA0 +07A0 +AC20 +D4A0 +0840 +ENDCHAR +STARTCHAR U_99E9 +ENCODING 39401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D80 +5240 +7C20 +53C0 +7C80 +5080 +7FE0 +5480 +AC80 +A480 +1BE0 +ENDCHAR +STARTCHAR U_99EA +ENCODING 39402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A500 +FFC0 +A500 +F900 +AFE0 +FA80 +5A80 +AAA0 +ACA0 +3060 +ENDCHAR +STARTCHAR U_99EB +ENCODING 39403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5140 +7D40 +5380 +7FE0 +5280 +7A80 +0A80 +DAA0 +ACA0 +1860 +ENDCHAR +STARTCHAR U_99EC +ENCODING 39404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A240 +F240 +A3C0 +F240 +A3C0 +FA40 +5A60 +AFC0 +A840 +3040 +ENDCHAR +STARTCHAR U_99ED +ENCODING 39405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7880 +5120 +7BC0 +5040 +7CA0 +5540 +AEC0 +A520 +1A20 +ENDCHAR +STARTCHAR U_99EE +ENCODING 39406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7D40 +5220 +7D40 +5140 +7D40 +5540 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99EF +ENCODING 39407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5500 +7FC0 +5100 +7FE0 +5100 +7B80 +0B40 +DD60 +A900 +1100 +ENDCHAR +STARTCHAR U_99F0 +ENCODING 39408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F520 +A7E0 +F520 +A520 +FDA0 +5660 +AC20 +A7E0 +0C20 +ENDCHAR +STARTCHAR U_99F1 +ENCODING 39409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +53E0 +7E20 +5140 +7C80 +5340 +7DE0 +5520 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_99F2 +ENCODING 39410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +52A0 +7AA0 +52A0 +7FA0 +52E0 +7AA0 +0AA0 +DAA0 +ACA0 +1820 +ENDCHAR +STARTCHAR U_99F3 +ENCODING 39411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F060 +ADC0 +F440 +A440 +F960 +AD40 +F540 +1540 +BDE0 +D600 +29E0 +ENDCHAR +STARTCHAR U_99F4 +ENCODING 39412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F860 +A040 +FFE0 +A040 +FD40 +A7C0 +FD60 +5540 +A540 +A4A0 +3920 +ENDCHAR +STARTCHAR U_99F5 +ENCODING 39413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A280 +FEE0 +AAA0 +FAA0 +AAA0 +FEE0 +0A80 +DA80 +AA80 +1480 +ENDCHAR +STARTCHAR U_99F6 +ENCODING 39414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A420 +F7E0 +A400 +F7E0 +A420 +FFA0 +56A0 +ABA0 +A820 +30C0 +ENDCHAR +STARTCHAR U_99F7 +ENCODING 39415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7880 +53E0 +7AA0 +53E0 +7C80 +55C0 +AEA0 +A4A0 +1880 +ENDCHAR +STARTCHAR U_99F8 +ENCODING 39416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5040 +7BC0 +5040 +7FE0 +5220 +7DC0 +5540 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_99F9 +ENCODING 39417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A120 +FFE0 +A2A0 +FAC0 +A2A0 +FAC0 +4AA0 +AAC0 +ABA0 +34E0 +ENDCHAR +STARTCHAR U_99FA +ENCODING 39418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7A20 +53E0 +7A20 +53E0 +7AA0 +5AC0 +AA80 +AA40 +3320 +ENDCHAR +STARTCHAR U_99FB +ENCODING 39419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A220 +FBE0 +A220 +FBE0 +A000 +FBE0 +5880 +AFE0 +A880 +3080 +ENDCHAR +STARTCHAR U_99FC +ENCODING 39420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F980 +A240 +FC20 +A7C0 +F900 +A7E0 +F900 +5B40 +AD20 +A920 +3300 +ENDCHAR +STARTCHAR U_99FD +ENCODING 39421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +5120 +79E0 +5000 +79E0 +5120 +7DE0 +5520 +ADE0 +A520 +1960 +ENDCHAR +STARTCHAR U_99FE +ENCODING 39422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +A280 +FFC0 +A440 +FC40 +A7C0 +FA80 +5A80 +AAA0 +AAA0 +3460 +ENDCHAR +STARTCHAR U_99FF +ENCODING 39423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5240 +7FE0 +5240 +7C20 +5200 +7BC0 +4E80 +A980 +A940 +1620 +ENDCHAR +STARTCHAR U_9A00 +ENCODING 39424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F180 +A6C0 +F2A0 +AFE0 +F280 +A3A0 +FEC0 +0A80 +ABA0 +5E60 +2220 +ENDCHAR +STARTCHAR U_9A01 +ENCODING 39425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7AA0 +53E0 +7AA0 +53E0 +7D00 +55E0 +AC20 +A520 +18C0 +ENDCHAR +STARTCHAR U_9A02 +ENCODING 39426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5080 +7BE0 +5220 +7940 +53E0 +7C80 +57E0 +AC80 +A480 +1880 +ENDCHAR +STARTCHAR U_9A03 +ENCODING 39427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +5240 +7FE0 +5020 +7A00 +53C0 +7C80 +57E0 +AC80 +A540 +1A20 +ENDCHAR +STARTCHAR U_9A04 +ENCODING 39428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DC0 +5040 +7BC0 +5040 +7BE0 +50A0 +7EC0 +55C0 +AEA0 +A4A0 +1980 +ENDCHAR +STARTCHAR U_9A05 +ENCODING 39429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A280 +F3E0 +A680 +F3E0 +A280 +FA80 +5BE0 +AA80 +AA80 +33E0 +ENDCHAR +STARTCHAR U_9A06 +ENCODING 39430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F7E0 +A520 +F7E0 +A420 +FFA0 +5EA0 +AAA0 +ABA0 +3060 +ENDCHAR +STARTCHAR U_9A07 +ENCODING 39431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +5140 +7A20 +57E0 +7880 +53E0 +7C80 +55E0 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_9A08 +ENCODING 39432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F120 +A240 +F7E0 +A240 +F240 +A240 +FFE0 +0A40 +DA40 +AA40 +1440 +ENDCHAR +STARTCHAR U_9A09 +ENCODING 39433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A220 +F3E0 +A220 +F3E0 +A280 +FAA0 +5BC0 +AA80 +ABA0 +36E0 +ENDCHAR +STARTCHAR U_9A0A +ENCODING 39434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7D20 +55E0 +7AA0 +53E0 +78A0 +5AA0 +ABE0 +A820 +10C0 +ENDCHAR +STARTCHAR U_9A0B +ENCODING 39435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F100 +A540 +F740 +A9A0 +F980 +4B40 +AD20 +A920 +3100 +ENDCHAR +STARTCHAR U_9A0C +ENCODING 39436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +A7E0 +F420 +A3C0 +F000 +A7E0 +F880 +0AC0 +DAA0 +ACA0 +1100 +ENDCHAR +STARTCHAR U_9A0D +ENCODING 39437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F7E0 +A520 +F7E0 +A100 +FFE0 +5980 +AB40 +AD20 +1120 +ENDCHAR +STARTCHAR U_9A0E +ENCODING 39438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +57E0 +7980 +5240 +7FE0 +5020 +7BA0 +5AA0 +ABA0 +A820 +10E0 +ENDCHAR +STARTCHAR U_9A0F +ENCODING 39439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A40 +5240 +7FE0 +5240 +7BC0 +5240 +7BC0 +5A40 +AFE0 +AA40 +1420 +ENDCHAR +STARTCHAR U_9A10 +ENCODING 39440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A100 +F280 +AD60 +F3C0 +A080 +F900 +0940 +DEA0 +AA40 +11C0 +ENDCHAR +STARTCHAR U_9A11 +ENCODING 39441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +56E0 +7A80 +5280 +7EE0 +5280 +7A80 +5EE0 +AA80 +AA80 +1280 +ENDCHAR +STARTCHAR U_9A12 +ENCODING 39442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A240 +F180 +A280 +FD60 +A7C0 +FD40 +0FC0 +D940 +A9E0 +1620 +ENDCHAR +STARTCHAR U_9A13 +ENCODING 39443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A280 +F440 +ABA0 +F100 +A7C0 +FD40 +0FC0 +D900 +AA80 +1440 +ENDCHAR +STARTCHAR U_9A14 +ENCODING 39444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7BC0 +5240 +7BC0 +5100 +7BE0 +5EA0 +AB60 +ABA0 +1040 +ENDCHAR +STARTCHAR U_9A15 +ENCODING 39445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5280 +7FE0 +52A0 +7FE0 +5100 +7FE0 +5A40 +AA80 +A940 +1620 +ENDCHAR +STARTCHAR U_9A16 +ENCODING 39446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +53E0 +FD40 +5480 +9160 +7FC0 +4400 +7F80 +4400 +7FC0 +AAC0 +ENDCHAR +STARTCHAR U_9A17 +ENCODING 39447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A80 +4BC0 +7A80 +43C0 +7E80 +57E0 +7C20 +5560 +D6A0 +4C40 +ENDCHAR +STARTCHAR U_9A18 +ENCODING 39448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +A3E0 +F560 +A3A0 +FDA0 +A260 +F800 +0B40 +DCA0 +AA40 +11C0 +ENDCHAR +STARTCHAR U_9A19 +ENCODING 39449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F420 +A7E0 +F400 +A7E0 +FAA0 +5BE0 +AAA0 +AAA0 +1260 +ENDCHAR +STARTCHAR U_9A1A +ENCODING 39450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +A280 +F7E0 +A020 +FEA0 +AAA0 +FEA0 +5AA0 +AEA0 +AA20 +3A60 +ENDCHAR +STARTCHAR U_9A1B +ENCODING 39451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F780 +A0A0 +FEC0 +A5A0 +F540 +AFE0 +F560 +5540 +B560 +9540 +2920 +ENDCHAR +STARTCHAR U_9A1C +ENCODING 39452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +53C0 +7A40 +53C0 +7A40 +57E0 +7880 +5880 +ABE0 +A880 +17E0 +ENDCHAR +STARTCHAR U_9A1D +ENCODING 39453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52A0 +7BE0 +54A0 +7FE0 +5280 +7BE0 +5A80 +AFE0 +AA80 +15E0 +ENDCHAR +STARTCHAR U_9A1E +ENCODING 39454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A080 +F3E0 +A080 +F7E0 +A080 +FFE0 +5A00 +AFE0 +AA20 +13E0 +ENDCHAR +STARTCHAR U_9A1F +ENCODING 39455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A280 +F440 +ABA0 +F000 +A720 +F5A0 +17A0 +B5A0 +D7A0 +2560 +ENDCHAR +STARTCHAR U_9A20 +ENCODING 39456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +5240 +7BC0 +5240 +7BC0 +5000 +7FE0 +5A80 +AAE0 +AD80 +14E0 +ENDCHAR +STARTCHAR U_9A21 +ENCODING 39457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +A7C0 +F440 +A7C0 +F440 +A7C0 +F900 +0F40 +DB80 +AD40 +1A20 +ENDCHAR +STARTCHAR U_9A22 +ENCODING 39458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F760 +A520 +F520 +A760 +F400 +A4E0 +F720 +54A0 +B740 +94A0 +2520 +ENDCHAR +STARTCHAR U_9A23 +ENCODING 39459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B60 +52A0 +7B60 +53E0 +7940 +5620 +79E0 +5B40 +A880 +A940 +1620 +ENDCHAR +STARTCHAR U_9A24 +ENCODING 39460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F40 +5580 +7AA0 +5440 +7BE0 +5080 +7FE0 +5880 +A940 +AA20 +1420 +ENDCHAR +STARTCHAR U_9A25 +ENCODING 39461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5140 +7FE0 +52A0 +7CC0 +5180 +7900 +5FE0 +AB80 +AD40 +1120 +ENDCHAR +STARTCHAR U_9A26 +ENCODING 39462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +52A0 +7BE0 +52A0 +7AA0 +53E0 +7880 +0AA0 +DD20 +A940 +19C0 +ENDCHAR +STARTCHAR U_9A27 +ENCODING 39463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A440 +F740 +A540 +FFE0 +A820 +FBA0 +5AA0 +ABA0 +8AA0 +3060 +ENDCHAR +STARTCHAR U_9A28 +ENCODING 39464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D20 +52C0 +7BE0 +52A0 +7BE0 +52A0 +7BE0 +0880 +DFE0 +A880 +1080 +ENDCHAR +STARTCHAR U_9A29 +ENCODING 39465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +57E0 +7D20 +57E0 +7D20 +57E0 +7940 +59A0 +ABE0 +AD20 +11E0 +ENDCHAR +STARTCHAR U_9A2A +ENCODING 39466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7980 +52E0 +7AA0 +53E0 +7AA0 +53E0 +7880 +5BE0 +A940 +A880 +1760 +ENDCHAR +STARTCHAR U_9A2B +ENCODING 39467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9220 +7F80 +1200 +7FE0 +2480 +7F40 +A420 +3FC0 +5540 +ENDCHAR +STARTCHAR U_9A2C +ENCODING 39468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A100 +FFE0 +A540 +FD60 +A540 +FD60 +5100 +B380 +9540 +2920 +ENDCHAR +STARTCHAR U_9A2D +ENCODING 39469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F5C0 +A500 +DFE0 +A540 +A980 +FFC0 +4400 +7F80 +4400 +7FE0 +92A0 +ENDCHAR +STARTCHAR U_9A2E +ENCODING 39470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A8A0 +FAA0 +AEA0 +F140 +A7E0 +F520 +57E0 +B520 +97E0 +2420 +ENDCHAR +STARTCHAR U_9A2F +ENCODING 39471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7E0 +F240 +A280 +FFE0 +A920 +F7C0 +1200 +B3C0 +9240 +34C0 +ENDCHAR +STARTCHAR U_9A30 +ENCODING 39472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E540 +AFE0 +A200 +EFE0 +A540 +AFE0 +F500 +A7C0 +A500 +A7E0 +AAA0 +ENDCHAR +STARTCHAR U_9A31 +ENCODING 39473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +57A0 +7AA0 +5340 +7AA0 +53E0 +7880 +5FE0 +A880 +A940 +1620 +ENDCHAR +STARTCHAR U_9A32 +ENCODING 39474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +53E0 +7940 +53E0 +7A20 +53E0 +7A20 +5BE0 +A880 +ABE0 +1080 +ENDCHAR +STARTCHAR U_9A33 +ENCODING 39475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A280 +FBE0 +A280 +FBE0 +A280 +FBE0 +0820 +AAE0 +8A20 +30C0 +ENDCHAR +STARTCHAR U_9A34 +ENCODING 39476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +5220 +7BE0 +5220 +7FE0 +5420 +7900 +5FE0 +A940 +A880 +1760 +ENDCHAR +STARTCHAR U_9A35 +ENCODING 39477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A480 +F5E0 +A520 +F5E0 +A520 +FDE0 +5480 +ADC0 +AEA0 +11A0 +ENDCHAR +STARTCHAR U_9A36 +ENCODING 39478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A00 +53E0 +7EA0 +53E0 +78A0 +5140 +7FE0 +5AA0 +ABE0 +A920 +1640 +ENDCHAR +STARTCHAR U_9A37 +ENCODING 39479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +52A0 +7940 +5180 +7A40 +54A0 +7BE0 +5AA0 +ABE0 +A8A0 +17E0 +ENDCHAR +STARTCHAR U_9A38 +ENCODING 39480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +53E0 +7A20 +53E0 +7A00 +53E0 +7AA0 +5BE0 +AAA0 +ABE0 +14A0 +ENDCHAR +STARTCHAR U_9A39 +ENCODING 39481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +57E0 +7940 +53E0 +7AA0 +52A0 +7BE0 +5880 +ABE0 +A880 +17E0 +ENDCHAR +STARTCHAR U_9A3A +ENCODING 39482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +5140 +FBC0 +2240 +FFE0 +4400 +7F80 +4400 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9A3B +ENCODING 39483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +57E0 +7BA0 +5540 +7BA0 +53A0 +7D40 +0BA0 +5980 +AA60 +1C40 +ENDCHAR +STARTCHAR U_9A3C +ENCODING 39484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +AFE0 +FA80 +AFE0 +FAA0 +AFE0 +FA80 +0BE0 +DA80 +ABA0 +1260 +ENDCHAR +STARTCHAR U_9A3D +ENCODING 39485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5120 +7DA0 +5360 +7DA0 +5080 +7BE0 +5A20 +ABE0 +AA20 +13E0 +ENDCHAR +STARTCHAR U_9A3E +ENCODING 39486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +52A0 +7BE0 +52A0 +7BE0 +5120 +7BC0 +5A20 +AFE0 +AAC0 +15A0 +ENDCHAR +STARTCHAR U_9A3F +ENCODING 39487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +53E0 +7940 +57E0 +7A20 +53E0 +7A20 +5BE0 +A880 +ABE0 +1080 +ENDCHAR +STARTCHAR U_9A40 +ENCODING 39488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +3F80 +2080 +FFE0 +2480 +7FC0 +A420 +3FE0 +4AA0 +ENDCHAR +STARTCHAR U_9A41 +ENCODING 39489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +2140 +FC80 +4940 +FFC0 +4400 +7F80 +4400 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9A42 +ENCODING 39490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +A7C0 +F440 +AAA0 +FFE0 +A240 +F520 +5280 +B340 +9080 +2700 +ENDCHAR +STARTCHAR U_9A43 +ENCODING 39491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A280 +FFE0 +AAA0 +FFE0 +A000 +F7C0 +5000 +BFE0 +92C0 +2DA0 +ENDCHAR +STARTCHAR U_9A44 +ENCODING 39492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7E0 +F560 +A6A0 +F5A0 +A660 +F7E0 +5340 +B6A0 +9A40 +21C0 +ENDCHAR +STARTCHAR U_9A45 +ENCODING 39493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5400 +7DC0 +5540 +7DC0 +5400 +7FE0 +5EA0 +AFE0 +AC00 +17E0 +ENDCHAR +STARTCHAR U_9A46 +ENCODING 39494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A540 +F7C0 +A540 +F7C0 +A540 +FFE0 +5540 +BFE0 +9100 +2100 +ENDCHAR +STARTCHAR U_9A47 +ENCODING 39495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +A940 +F760 +22A0 +FFE0 +2400 +3FC0 +2400 +3FE0 +52A0 +ENDCHAR +STARTCHAR U_9A48 +ENCODING 39496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +A280 +F7E0 +A2A0 +F480 +AFE0 +FAA0 +5FE0 +AAA0 +ABA0 +3820 +ENDCHAR +STARTCHAR U_9A49 +ENCODING 39497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +A100 +F7E0 +A520 +F7C0 +A520 +F5E0 +5540 +B760 +9540 +2BE0 +ENDCHAR +STARTCHAR U_9A4A +ENCODING 39498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +A7E0 +FA80 +A7E0 +FD40 +A7E0 +FD40 +57E0 +B100 +97C0 +2100 +ENDCHAR +STARTCHAR U_9A4B +ENCODING 39499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F6A0 +A2C0 +F6A0 +A440 +F820 +A6E0 +FAA0 +0C00 +DAE0 +AA40 +16A0 +ENDCHAR +STARTCHAR U_9A4C +ENCODING 39500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +A7C0 +F140 +A7E0 +F140 +A7E0 +F9A0 +5FE0 +A920 +AFE0 +39A0 +ENDCHAR +STARTCHAR U_9A4D +ENCODING 39501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +53E0 +7880 +53E0 +7A40 +57E0 +7A40 +5FE0 +AA80 +AAA0 +1460 +ENDCHAR +STARTCHAR U_9A4E +ENCODING 39502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CA0 +52C0 +7FE0 +52C0 +7CA0 +5240 +7BE0 +5D40 +ABE0 +AA40 +1440 +ENDCHAR +STARTCHAR U_9A4F +ENCODING 39503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A420 +F7E0 +A480 +F7E0 +A480 +FFE0 +5A40 +AFE0 +AA40 +36C0 +ENDCHAR +STARTCHAR U_9A50 +ENCODING 39504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F480 +AF80 +FAE0 +AEA0 +F0A0 +AEA0 +F2A0 +54A0 +BE40 +94A0 +2520 +ENDCHAR +STARTCHAR U_9A51 +ENCODING 39505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A280 +FEE0 +AAA0 +FEE0 +A280 +F7E0 +1520 +B7E0 +5520 +27E0 +ENDCHAR +STARTCHAR U_9A52 +ENCODING 39506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +52A0 +7BE0 +5000 +7BE0 +52A0 +7BE0 +5AA0 +AFE0 +A880 +1080 +ENDCHAR +STARTCHAR U_9A53 +ENCODING 39507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F280 +AFE0 +F920 +ABA0 +FFE0 +A000 +FBC0 +0A40 +ABC0 +8A40 +33C0 +ENDCHAR +STARTCHAR U_9A54 +ENCODING 39508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A280 +FFE0 +AAA0 +FFE0 +A440 +F7C0 +5440 +BFE0 +9100 +2100 +ENDCHAR +STARTCHAR U_9A55 +ENCODING 39509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +A100 +F7E0 +A240 +FFE0 +A240 +FFE0 +5820 +ABA0 +AAA0 +3BE0 +ENDCHAR +STARTCHAR U_9A56 +ENCODING 39510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +52A0 +7FE0 +5580 +7FA0 +50A0 +7FA0 +5AC0 +AF40 +AAA0 +1720 +ENDCHAR +STARTCHAR U_9A57 +ENCODING 39511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +5280 +7C40 +53A0 +7800 +57E0 +7D20 +5FE0 +AA40 +ADA0 +1120 +ENDCHAR +STARTCHAR U_9A58 +ENCODING 39512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1000 +3FC0 +2040 +7FC0 +5540 +7F40 +55C0 +7F40 +9560 +ENDCHAR +STARTCHAR U_9A59 +ENCODING 39513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +AFE0 +FBA0 +A820 +FFE0 +A440 +F7C0 +5440 +B7C0 +9000 +2FE0 +ENDCHAR +STARTCHAR U_9A5A +ENCODING 39514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +53E0 +FD40 +56A0 +7FE0 +2400 +3FC0 +2400 +3FE0 +4A20 +9540 +ENDCHAR +STARTCHAR U_9A5B +ENCODING 39515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AAA0 +FFE0 +A100 +F7E0 +A100 +FFE0 +4A80 +AFE0 +A900 +1100 +ENDCHAR +STARTCHAR U_9A5C +ENCODING 39516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D40 +5360 +7FE0 +5140 +7FE0 +5080 +7BE0 +0880 +DFE0 +AAC0 +14A0 +ENDCHAR +STARTCHAR U_9A5D +ENCODING 39517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +57C0 +7900 +57E0 +7A20 +57C0 +7A40 +0FE0 +DB80 +AD40 +1120 +ENDCHAR +STARTCHAR U_9A5E +ENCODING 39518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +57E0 +7C20 +53E0 +7AA0 +53C0 +7E40 +5BC0 +AA40 +ABC0 +1660 +ENDCHAR +STARTCHAR U_9A5F +ENCODING 39519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A520 +F740 +A5A0 +F740 +A1A0 +F340 +5580 +BB40 +9520 +2920 +ENDCHAR +STARTCHAR U_9A60 +ENCODING 39520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +AFE0 +F240 +A3C0 +F440 +ADE0 +F540 +1DE0 +B000 +9540 +3AA0 +ENDCHAR +STARTCHAR U_9A61 +ENCODING 39521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +7E00 +2BC0 +FC40 +57C0 +6EA0 +55E0 +3F80 +2400 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9A62 +ENCODING 39522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F1C0 +A100 +F7E0 +A540 +F7E0 +A540 +F7C0 +5540 +B7E0 +9AA0 +27E0 +ENDCHAR +STARTCHAR U_9A63 +ENCODING 39523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F540 +A7C0 +F200 +AFE0 +F440 +AFE0 +FA80 +0BC0 +DA80 +ABE0 +1520 +ENDCHAR +STARTCHAR U_9A64 +ENCODING 39524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +57E0 +7DA0 +57E0 +7940 +53E0 +7940 +5BE0 +AEA0 +AA40 +1320 +ENDCHAR +STARTCHAR U_9A65 +ENCODING 39525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F2A0 +AEC0 +F280 +AFE0 +F540 +A7C0 +F540 +5FE0 +B280 +9FE0 +2440 +ENDCHAR +STARTCHAR U_9A66 +ENCODING 39526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +A100 +FFE0 +A920 +F2E0 +AFA0 +F2E0 +53A0 +B6E0 +9AA0 +22E0 +ENDCHAR +STARTCHAR U_9A67 +ENCODING 39527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +AF80 +FAE0 +AEA0 +F5E0 +AEA0 +FBE0 +5EA0 +B5E0 +9EA0 +2440 +ENDCHAR +STARTCHAR U_9A68 +ENCODING 39528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F520 +A7E0 +F280 +A7E0 +FC80 +A7E0 +FC80 +5FE0 +ABA0 +AEE0 +1BA0 +ENDCHAR +STARTCHAR U_9A69 +ENCODING 39529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5240 +7FE0 +55A0 +7FE0 +5280 +7BE0 +5E80 +ABE0 +AA80 +13E0 +ENDCHAR +STARTCHAR U_9A6A +ENCODING 39530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +A000 +FEE0 +AAA0 +FFE0 +AAA0 +FFE0 +5AA0 +ABC0 +AAA0 +13E0 +ENDCHAR +STARTCHAR U_9A6B +ENCODING 39531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2400 +3F80 +2400 +3FC0 +5540 +FBE0 +A280 +FBE0 +5520 +AAE0 +ENDCHAR +STARTCHAR U_9A6C +ENCODING 39532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +0080 +1080 +1100 +2100 +3FE0 +0020 +0020 +FF20 +0020 +00C0 +ENDCHAR +STARTCHAR U_9A6D +ENCODING 39533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1220 +5220 +5220 +5240 +7940 +0940 +E880 +0980 +0A40 +3420 +ENDCHAR +STARTCHAR U_9A6E +ENCODING 39534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +5100 +57E0 +5100 +7900 +0900 +E900 +0A80 +0A40 +3420 +ENDCHAR +STARTCHAR U_9A6F +ENCODING 39535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +12A0 +52A0 +52A0 +52A0 +7AA0 +0AA0 +EAA0 +0AA0 +0A20 +3420 +ENDCHAR +STARTCHAR U_9A70 +ENCODING 39536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +12A0 +52E0 +53A0 +56A0 +7AA0 +0AC0 +EA80 +0A20 +0A20 +31E0 +ENDCHAR +STARTCHAR U_9A71 +ENCODING 39537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +1200 +5220 +5320 +52A0 +7A40 +0A40 +EAA0 +0B20 +0A00 +33E0 +ENDCHAR +STARTCHAR U_9A72 +ENCODING 39538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +1220 +5220 +5220 +5220 +7BE0 +0A20 +EA20 +0A20 +0BE0 +3220 +ENDCHAR +STARTCHAR U_9A73 +ENCODING 39539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +1280 +5100 +5280 +5440 +7820 +0C40 +EA80 +0980 +0A40 +3420 +ENDCHAR +STARTCHAR U_9A74 +ENCODING 39540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +53E0 +5220 +5220 +7BE0 +0A00 +EA00 +0A00 +0C00 +3000 +ENDCHAR +STARTCHAR U_9A75 +ENCODING 39541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +1240 +5240 +53C0 +5240 +7A40 +0A40 +EBC0 +0A40 +0A40 +37E0 +ENDCHAR +STARTCHAR U_9A76 +ENCODING 39542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +1080 +57E0 +54A0 +54A0 +7FE0 +08A0 +EA80 +0900 +0A80 +3460 +ENDCHAR +STARTCHAR U_9A77 +ENCODING 39543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E000 +27E0 +A520 +A520 +A520 +F520 +16E0 +F420 +1420 +17E0 +6020 +ENDCHAR +STARTCHAR U_9A78 +ENCODING 39544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +1240 +5240 +57E0 +5240 +7B40 +0AC0 +EA40 +0A40 +0A40 +32C0 +ENDCHAR +STARTCHAR U_9A79 +ENCODING 39545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +1200 +53E0 +5420 +53A0 +7AA0 +0AA0 +EBA0 +0AA0 +0820 +30C0 +ENDCHAR +STARTCHAR U_9A7A +ENCODING 39546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +11E0 +5240 +5480 +57E0 +7820 +0820 +EBE0 +0820 +0BE0 +3020 +ENDCHAR +STARTCHAR U_9A7B +ENCODING 39547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1080 +57E0 +5080 +5080 +7880 +0BE0 +E880 +0880 +0880 +37E0 +ENDCHAR +STARTCHAR U_9A7C +ENCODING 39548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +5420 +5000 +5220 +7A40 +0B80 +EA00 +0A20 +0A20 +31E0 +ENDCHAR +STARTCHAR U_9A7D +ENCODING 39549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +5180 +3140 +4A20 +FF80 +1100 +3FC0 +0040 +7E40 +0080 +ENDCHAR +STARTCHAR U_9A7E +ENCODING 39550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FDE0 +2520 +5DE0 +8000 +7F80 +1080 +1FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9A7F +ENCODING 39551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1280 +5100 +5280 +5560 +7900 +0BC0 +2900 +CFE0 +0900 +3100 +ENDCHAR +STARTCHAR U_9A80 +ENCODING 39552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1140 +5220 +57E0 +5000 +7BE0 +0A20 +EA20 +0A20 +0BE0 +3220 +ENDCHAR +STARTCHAR U_9A81 +ENCODING 39553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +17E0 +5240 +51A0 +5660 +7820 +0FE0 +EA80 +0AA0 +0CA0 +3060 +ENDCHAR +STARTCHAR U_9A82 +ENCODING 39554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0000 +7F80 +1080 +1FE0 +0020 +FFA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_9A83 +ENCODING 39555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3E0 +52A0 +52A0 +53E0 +52A0 +7AA0 +0AA0 +2B60 +CA20 +2BE0 +1220 +ENDCHAR +STARTCHAR U_9A84 +ENCODING 39556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F0C0 +1700 +5100 +57E0 +5240 +7C20 +0A40 +EA40 +0A40 +0A40 +3440 +ENDCHAR +STARTCHAR U_9A85 +ENCODING 39557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F180 +12A0 +56C0 +53A0 +52A0 +7A60 +0880 +EFE0 +0880 +0880 +3080 +ENDCHAR +STARTCHAR U_9A86 +ENCODING 39558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +13C0 +5640 +5180 +5240 +7C20 +0BC0 +EA40 +0A40 +0BC0 +3240 +ENDCHAR +STARTCHAR U_9A87 +ENCODING 39559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +5100 +5240 +5780 +78A0 +0920 +EA40 +0C80 +0940 +3220 +ENDCHAR +STARTCHAR U_9A88 +ENCODING 39560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F220 +1140 +57E0 +5140 +5140 +7FE0 +0940 +E940 +0940 +0A40 +3440 +ENDCHAR +STARTCHAR U_9A89 +ENCODING 39561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1080 +1FC0 +0040 +FE80 +73C0 +5240 +7BE0 +0820 +EBA0 +1860 +ENDCHAR +STARTCHAR U_9A8A +ENCODING 39562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2000 +AEE0 +AAA0 +AAA0 +EAA0 +2EE0 +6AA0 +AAA0 +2AA0 +6AA0 +ENDCHAR +STARTCHAR U_9A8B +ENCODING 39563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +13E0 +52A0 +53E0 +52A0 +7FE0 +0900 +EBE0 +0820 +0920 +30C0 +ENDCHAR +STARTCHAR U_9A8C +ENCODING 39564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1100 +5280 +5C60 +5380 +7800 +0A40 +3D40 +CA80 +0900 +37E0 +ENDCHAR +STARTCHAR U_9A8D +ENCODING 39565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +5440 +5280 +57E0 +7900 +0900 +EFC0 +0900 +0900 +3100 +ENDCHAR +STARTCHAR U_9A8E +ENCODING 39566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +5040 +53C0 +5040 +57E0 +7C20 +0BC0 +2A40 +C980 +2980 +1660 +ENDCHAR +STARTCHAR U_9A8F +ENCODING 39567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1240 +57E0 +5240 +5420 +7900 +0BE0 +ED40 +0880 +0940 +3620 +ENDCHAR +STARTCHAR U_9A90 +ENCODING 39568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +17E0 +5240 +53C0 +5240 +7BC0 +0A40 +EFE0 +0A80 +0C40 +3020 +ENDCHAR +STARTCHAR U_9A91 +ENCODING 39569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +5140 +5220 +57E0 +7820 +0BA0 +EAA0 +0BA0 +0820 +3060 +ENDCHAR +STARTCHAR U_9A92 +ENCODING 39570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1540 +57C0 +5540 +57C0 +7900 +0FE0 +E900 +0B80 +0D40 +3120 +ENDCHAR +STARTCHAR U_9A93 +ENCODING 39571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F300 +1280 +53E0 +5680 +53C0 +7A80 +0A80 +EBC0 +0A80 +0A80 +33E0 +ENDCHAR +STARTCHAR U_9A94 +ENCODING 39572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +1FE0 +5820 +57C0 +5000 +7FC0 +0900 +E940 +0D20 +0920 +3300 +ENDCHAR +STARTCHAR U_9A95 +ENCODING 39573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E100 +A7C0 +A140 +AFE0 +A140 +F7C0 +1540 +57C0 +9540 +5540 +2940 +ENDCHAR +STARTCHAR U_9A96 +ENCODING 39574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F240 +17A0 +5100 +57E0 +5140 +7AA0 +0D40 +EA80 +0920 +0840 +3180 +ENDCHAR +STARTCHAR U_9A97 +ENCODING 39575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +5420 +57E0 +5400 +7FE0 +0AA0 +EFE0 +0AA0 +0AA0 +3060 +ENDCHAR +STARTCHAR U_9A98 +ENCODING 39576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +75C0 +5500 +6FE0 +5540 +7980 +7F80 +2100 +3FC0 +0040 +FF40 +0180 +ENDCHAR +STARTCHAR U_9A99 +ENCODING 39577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF40 +15A0 +5240 +5420 +5BC0 +7900 +0FE0 +2900 +CA80 +2C40 +1020 +ENDCHAR +STARTCHAR U_9A9A +ENCODING 39578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1540 +5280 +5180 +5760 +7900 +0FE0 +E920 +0FE0 +0940 +37E0 +ENDCHAR +STARTCHAR U_9A9B +ENCODING 39579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +57E0 +FA40 +6980 +A660 +7F80 +1100 +3FC0 +0040 +FE40 +0180 +ENDCHAR +STARTCHAR U_9A9C +ENCODING 39580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7DE0 +1340 +FC80 +4940 +BFA0 +1100 +3FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_9A9D +ENCODING 39581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E200 +2DE0 +A8A0 +AAA0 +ACA0 +F140 +17E0 +3520 +D7E0 +1520 +67E0 +ENDCHAR +STARTCHAR U_9A9E +ENCODING 39582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +3080 +DFE0 +0040 +7E40 +0180 +ENDCHAR +STARTCHAR U_9A9F +ENCODING 39583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E080 +27E0 +A420 +A7E0 +A400 +F7E0 +14A0 +F6E0 +15A0 +1AE0 +61A0 +ENDCHAR +STARTCHAR U_9AA0 +ENCODING 39584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EFE0 +2280 +AFE0 +AAA0 +AFE0 +F000 +17C0 +F000 +1FE0 +1540 +6B20 +ENDCHAR +STARTCHAR U_9AA1 +ENCODING 39585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +14A0 +57E0 +54A0 +57E0 +7900 +0FC0 +EA20 +0FE0 +0940 +3320 +ENDCHAR +STARTCHAR U_9AA2 +ENCODING 39586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +17E0 +5520 +56A0 +5560 +7E20 +0FE0 +EB40 +0EA0 +0A40 +31C0 +ENDCHAR +STARTCHAR U_9AA3 +ENCODING 39587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1420 +57E0 +5480 +57E0 +7C80 +0FE0 +EA40 +0FE0 +0A40 +36C0 +ENDCHAR +STARTCHAR U_9AA4 +ENCODING 39588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +1520 +57A0 +5540 +57A0 +79C0 +0B20 +ED40 +0B80 +0D40 +3120 +ENDCHAR +STARTCHAR U_9AA5 +ENCODING 39589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F760 +1140 +5760 +5000 +53E0 +7AA0 +0BE0 +E940 +0FE0 +0940 +3220 +ENDCHAR +STARTCHAR U_9AA6 +ENCODING 39590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +1100 +5FE0 +5D60 +5380 +7D40 +0AE0 +2FA0 +CAE0 +57A0 +2AE0 +ENDCHAR +STARTCHAR U_9AA7 +ENCODING 39591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F080 +17E0 +55A0 +57E0 +5140 +7FE0 +0940 +EFE0 +0AA0 +0E40 +3320 +ENDCHAR +STARTCHAR U_9AA8 +ENCODING 39592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3C80 +2480 +FFE0 +A0A0 +BFA0 +2080 +3F80 +2080 +2380 +ENDCHAR +STARTCHAR U_9AA9 +ENCODING 39593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6900 +5900 +FFC0 +8540 +7940 +4940 +7940 +4940 +7A60 +4C60 +ENDCHAR +STARTCHAR U_9AAA +ENCODING 39594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7B80 +6A80 +5A80 +FE80 +8680 +7B80 +4A80 +7A80 +4AA0 +7CA0 +48E0 +ENDCHAR +STARTCHAR U_9AAB +ENCODING 39595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +6BC0 +FD40 +8540 +7B40 +49C0 +7940 +4940 +7A20 +4C20 +ENDCHAR +STARTCHAR U_9AAC +ENCODING 39596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7800 +6BC0 +5880 +FC80 +87E0 +7880 +4880 +7880 +4880 +7A80 +4900 +ENDCHAR +STARTCHAR U_9AAD +ENCODING 39597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +6880 +FC80 +87E0 +7880 +4880 +7880 +4880 +7880 +4880 +ENDCHAR +STARTCHAR U_9AAE +ENCODING 39598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6980 +5940 +FDE0 +8700 +7900 +4900 +7880 +48A0 +7860 +4820 +ENDCHAR +STARTCHAR U_9AAF +ENCODING 39599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4880 +6BE0 +FC00 +85C0 +7940 +4940 +7940 +4940 +7A40 +4C60 +ENDCHAR +STARTCHAR U_9AB0 +ENCODING 39600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +4940 +6940 +FD60 +8600 +79C0 +4940 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_9AB1 +ENCODING 39601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4940 +6A20 +FC00 +8540 +7940 +4940 +7940 +4940 +7A40 +4840 +ENDCHAR +STARTCHAR U_9AB2 +ENCODING 39602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +6900 +5BE0 +FC20 +87A0 +7AA0 +4BA0 +7A40 +4A00 +7A20 +49E0 +ENDCHAR +STARTCHAR U_9AB3 +ENCODING 39603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FEA0 +8680 +7BE0 +4A40 +7B40 +4A80 +7D40 +4A20 +ENDCHAR +STARTCHAR U_9AB4 +ENCODING 39604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4940 +6940 +FD60 +85C0 +7D40 +4D40 +7D40 +4D40 +7FC0 +4860 +ENDCHAR +STARTCHAR U_9AB5 +ENCODING 39605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6880 +5BE0 +FC80 +81C0 +79C0 +4AA0 +7FE0 +4880 +7880 +4880 +ENDCHAR +STARTCHAR U_9AB6 +ENCODING 39606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +6A80 +FE80 +87E0 +7A80 +4A80 +7A80 +4AA0 +7B60 +4AA0 +ENDCHAR +STARTCHAR U_9AB7 +ENCODING 39607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4880 +6BE0 +FC80 +8480 +7BE0 +4A20 +7A20 +4A20 +7BE0 +4A20 +ENDCHAR +STARTCHAR U_9AB8 +ENCODING 39608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6900 +FD40 +8780 +7920 +4A40 +7C80 +4940 +7A20 +4820 +ENDCHAR +STARTCHAR U_9AB9 +ENCODING 39609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6940 +FE20 +8540 +7940 +4940 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_9ABA +ENCODING 39610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +4B80 +6A00 +FFE0 +8600 +7AE0 +4AA0 +7AA0 +4AA0 +7AE0 +4CA0 +ENDCHAR +STARTCHAR U_9ABB +ENCODING 39611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6940 +FE20 +85C0 +7800 +4FE0 +7900 +4BE0 +7820 +49C0 +ENDCHAR +STARTCHAR U_9ABC +ENCODING 39612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +49C0 +6B40 +FC80 +8540 +7A20 +4FC0 +7A40 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_9ABD +ENCODING 39613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +6B20 +5940 +FE80 +8500 +7900 +4FE0 +7940 +4A80 +7940 +4E20 +ENDCHAR +STARTCHAR U_9ABE +ENCODING 39614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +6BE0 +FEA0 +87E0 +7AA0 +4BE0 +7A80 +4900 +7A80 +4C60 +ENDCHAR +STARTCHAR U_9ABF +ENCODING 39615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +4940 +6BE0 +FD40 +8540 +7BE0 +4940 +7940 +4940 +7A40 +4C40 +ENDCHAR +STARTCHAR U_9AC0 +ENCODING 39616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FFE0 +86A0 +7BE0 +4AA0 +7940 +4FE0 +7840 +4840 +ENDCHAR +STARTCHAR U_9AC1 +ENCODING 39617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +6BE0 +FEA0 +87E0 +7880 +4BE0 +7880 +49C0 +7AA0 +4CA0 +ENDCHAR +STARTCHAR U_9AC2 +ENCODING 39618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6B20 +FDE0 +8640 +7980 +4A60 +7FC0 +4A40 +7BC0 +4A40 +ENDCHAR +STARTCHAR U_9AC3 +ENCODING 39619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +6AA0 +5BE0 +FEA0 +87E0 +7880 +4BE0 +7AA0 +4BE0 +7A20 +4A60 +ENDCHAR +STARTCHAR U_9AC4 +ENCODING 39620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5900 +FFC0 +8540 +71C0 +5D40 +75C0 +5540 +7600 +59E0 +ENDCHAR +STARTCHAR U_9AC5 +ENCODING 39621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7AA0 +49C0 +6BE0 +FC80 +85C0 +7AA0 +4FE0 +7940 +4940 +7880 +4B60 +ENDCHAR +STARTCHAR U_9AC6 +ENCODING 39622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78A0 +4FE0 +6AA0 +FFE0 +86A0 +7BE0 +4AA0 +7FE0 +4A40 +7940 +4880 +ENDCHAR +STARTCHAR U_9AC7 +ENCODING 39623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4FE0 +6940 +FDC0 +8400 +77E0 +5420 +75A0 +55A0 +7420 +5460 +ENDCHAR +STARTCHAR U_9AC8 +ENCODING 39624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5A40 +FD80 +87E0 +7CA0 +4FC0 +7900 +49C0 +7A40 +4C80 +ENDCHAR +STARTCHAR U_9AC9 +ENCODING 39625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +6BE0 +5D20 +FA80 +87E0 +7A80 +4BC0 +7A80 +4BC0 +7A80 +4BE0 +ENDCHAR +STARTCHAR U_9ACA +ENCODING 39626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A20 +4940 +6BE0 +FC80 +85E0 +7880 +4FE0 +7A00 +4FC0 +7880 +4FE0 +ENDCHAR +STARTCHAR U_9ACB +ENCODING 39627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FFE0 +8540 +7BE0 +4A20 +7AA0 +4A80 +79A0 +4AE0 +ENDCHAR +STARTCHAR U_9ACC +ENCODING 39628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4FE0 +6820 +FFC0 +8600 +7BE0 +4A40 +7FE0 +4800 +7A40 +4C20 +ENDCHAR +STARTCHAR U_9ACD +ENCODING 39629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4FE0 +6A40 +FFE0 +8640 +7A40 +4F60 +7AE0 +4A40 +7A40 +4A40 +ENDCHAR +STARTCHAR U_9ACE +ENCODING 39630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +6DA0 +5B60 +FDA0 +8580 +7A40 +4D20 +7A80 +4940 +7880 +4B00 +ENDCHAR +STARTCHAR U_9ACF +ENCODING 39631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6AA0 +FFE0 +86A0 +7BE0 +4AA0 +7FE0 +4940 +78C0 +4B20 +ENDCHAR +STARTCHAR U_9AD0 +ENCODING 39632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6880 +FFE0 +8640 +7BE0 +4A40 +7FE0 +4A80 +7AA0 +4C60 +ENDCHAR +STARTCHAR U_9AD1 +ENCODING 39633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4AA0 +6BE0 +FE00 +87E0 +78A0 +4BE0 +7AA0 +4BE0 +78A0 +4FC0 +ENDCHAR +STARTCHAR U_9AD2 +ENCODING 39634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +4FE0 +6940 +FBE0 +86C0 +7D60 +4A60 +7940 +4FE0 +7940 +4A40 +ENDCHAR +STARTCHAR U_9AD3 +ENCODING 39635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6A40 +FDE0 +80A0 +7EE0 +4AA0 +7AE0 +4AA0 +7AA0 +4DE0 +ENDCHAR +STARTCHAR U_9AD4 +ENCODING 39636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7940 +6BE0 +5AA0 +FFE0 +86A0 +7FE0 +4A40 +7BC0 +4A40 +7980 +4FE0 +ENDCHAR +STARTCHAR U_9AD5 +ENCODING 39637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +4BE0 +6A20 +FFE0 +82A0 +7FC0 +4A40 +7BC0 +4A40 +7BC0 +4E60 +ENDCHAR +STARTCHAR U_9AD6 +ENCODING 39638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4EA0 +6BC0 +FE80 +87E0 +7A40 +4BC0 +7A40 +4BC0 +7AA0 +4CE0 +ENDCHAR +STARTCHAR U_9AD7 +ENCODING 39639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +79C0 +6900 +5FE0 +FD20 +87E0 +7D20 +4EC0 +7D40 +4FE0 +7AA0 +4FE0 +ENDCHAR +STARTCHAR U_9AD8 +ENCODING 39640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0000 +1F00 +1100 +7FC0 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_9AD9 +ENCODING 39641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +1F00 +1100 +7FC0 +4040 +5F40 +5140 +5F40 +40C0 +ENDCHAR +STARTCHAR U_9ADA +ENCODING 39642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F900 +57E0 +5000 +FB80 +8A80 +EA80 +AA80 +EAA0 +8AA0 +9C60 +ENDCHAR +STARTCHAR U_9ADB +ENCODING 39643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +0440 +77C0 +5500 +FD00 +8FC0 +ED40 +A940 +EA40 +9C60 +ENDCHAR +STARTCHAR U_9ADC +ENCODING 39644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA20 +53E0 +7220 +03E0 +F940 +8E40 +EA40 +AFE0 +EA40 +9C40 +ENDCHAR +STARTCHAR U_9ADD +ENCODING 39645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FAE0 +0740 +7340 +54A0 +FFE0 +8920 +EFC0 +A940 +EA40 +9CC0 +ENDCHAR +STARTCHAR U_9ADE +ENCODING 39646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +03C0 +77E0 +55A0 +FFE0 +8900 +EFE0 +AB80 +ED40 +9920 +ENDCHAR +STARTCHAR U_9ADF +ENCODING 39647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7E40 +4080 +7D00 +4020 +7C40 +4080 +FF00 +2820 +4840 +F480 +0300 +ENDCHAR +STARTCHAR U_9AE0 +ENCODING 39648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +60C0 +FB00 +48C0 +FF00 +1000 +7F00 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_9AE1 +ENCODING 39649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FFE0 +0900 +0920 +3120 +C0E0 +ENDCHAR +STARTCHAR U_9AE2 +ENCODING 39650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +5300 +68C0 +FF00 +48C0 +FF00 +25C0 +FE40 +24C0 +2420 +1FE0 +ENDCHAR +STARTCHAR U_9AE3 +ENCODING 39651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +0800 +0FC0 +3040 +C380 +ENDCHAR +STARTCHAR U_9AE4 +ENCODING 39652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FF00 +48C0 +FF00 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_9AE5 +ENCODING 39653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FB00 +48C0 +7F80 +2080 +7FC0 +2080 +7FC0 +2080 +ENDCHAR +STARTCHAR U_9AE6 +ENCODING 39654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2B80 +7C00 +07C0 +7C20 +0420 +03E0 +ENDCHAR +STARTCHAR U_9AE7 +ENCODING 39655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +8A20 +0A00 +1220 +E1E0 +ENDCHAR +STARTCHAR U_9AE8 +ENCODING 39656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FB00 +4CC0 +FB00 +0000 +7FC0 +1100 +2120 +40E0 +ENDCHAR +STARTCHAR U_9AE9 +ENCODING 39657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +78C0 +5300 +68C0 +FB00 +48C0 +FFE0 +0400 +27C0 +2440 +3FC0 +0040 +ENDCHAR +STARTCHAR U_9AEA +ENCODING 39658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +5300 +68C0 +FF00 +48C0 +FFE0 +0800 +1F80 +2900 +C600 +39C0 +ENDCHAR +STARTCHAR U_9AEB +ENCODING 39659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7CC0 +4300 +78C0 +4300 +FCC0 +2900 +FF80 +2100 +FF80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9AEC +ENCODING 39660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +4400 +FFE0 +1500 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9AED +ENCODING 39661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +F240 +5E80 +5320 +5E20 +E1E0 +ENDCHAR +STARTCHAR U_9AEE +ENCODING 39662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4A80 +FFE0 +1000 +2F80 +4500 +BAE0 +ENDCHAR +STARTCHAR U_9AEF +ENCODING 39663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4980 +5060 +FD80 +4860 +3F80 +2480 +3F80 +2480 +FFE0 +2080 +ENDCHAR +STARTCHAR U_9AF0 +ENCODING 39664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +6880 +FB40 +5080 +FB00 +2500 +FFE0 +2500 +2700 +3FC0 +ENDCHAR +STARTCHAR U_9AF1 +ENCODING 39665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +78C0 +4300 +FCC0 +2900 +7FC0 +A240 +3EA0 +2020 +1FE0 +ENDCHAR +STARTCHAR U_9AF2 +ENCODING 39666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3C60 +2180 +FC60 +29A0 +4440 +3FE0 +2220 +3FC0 +2480 +2300 +5CE0 +ENDCHAR +STARTCHAR U_9AF3 +ENCODING 39667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FC0 +0500 +FFE0 +1240 +E600 +ENDCHAR +STARTCHAR U_9AF4 +ENCODING 39668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +6880 +FB40 +4A80 +7FC0 +0A40 +7FE0 +0A20 +1260 +2200 +ENDCHAR +STARTCHAR U_9AF5 +ENCODING 39669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +6820 +FDC0 +2800 +FFE0 +0400 +7FC0 +4A40 +4A40 +4AC0 +ENDCHAR +STARTCHAR U_9AF6 +ENCODING 39670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +1100 +1F00 +1100 +FFE0 +ENDCHAR +STARTCHAR U_9AF7 +ENCODING 39671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FC0 +4A40 +7FC0 +4A40 +7FC0 +ENDCHAR +STARTCHAR U_9AF8 +ENCODING 39672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +6840 +FDA0 +4840 +FD80 +1100 +7FC0 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_9AF9 +ENCODING 39673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7900 +6FE0 +A380 +2540 +2920 +ENDCHAR +STARTCHAR U_9AFA +ENCODING 39674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FFE0 +0400 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9AFB +ENCODING 39675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4580 +FFE0 +0400 +7FC0 +2080 +3F80 +ENDCHAR +STARTCHAR U_9AFC +ENCODING 39676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +2980 +4660 +3D00 +E4E0 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9AFD +ENCODING 39677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FC80 +5540 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_9AFE +ENCODING 39678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FC0 +4040 +7FC0 +4040 +41C0 +ENDCHAR +STARTCHAR U_9AFF +ENCODING 39679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +6840 +FDA0 +4840 +F980 +2540 +8920 +2160 +C180 +4E00 +ENDCHAR +STARTCHAR U_9B00 +ENCODING 39680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5180 +FC40 +4980 +FFC0 +0440 +7FC0 +4400 +7FE0 +14A0 +6440 +ENDCHAR +STARTCHAR U_9B01 +ENCODING 39681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7C40 +1140 +FF40 +5540 +92C0 +ENDCHAR +STARTCHAR U_9B02 +ENCODING 39682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7840 +51A0 +6840 +FDA0 +4840 +FF80 +1000 +1F80 +1100 +FFE0 +2080 +ENDCHAR +STARTCHAR U_9B03 +ENCODING 39683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +7FE0 +4020 +3FC0 +2480 +CC60 +ENDCHAR +STARTCHAR U_9B04 +ENCODING 39684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FFE0 +4080 +FF80 +1080 +7FC0 +1240 +6CC0 +ENDCHAR +STARTCHAR U_9B05 +ENCODING 39685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FFE0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +9CC0 +ENDCHAR +STARTCHAR U_9B06 +ENCODING 39686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +FA80 +2440 +F920 +7240 +ABC0 +ENDCHAR +STARTCHAR U_9B07 +ENCODING 39687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +51A0 +6840 +FDA0 +4840 +FF80 +1100 +3F80 +44E0 +3F80 +0400 +ENDCHAR +STARTCHAR U_9B08 +ENCODING 39688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +7FC0 +1000 +FFE0 +52C0 +9FA0 +ENDCHAR +STARTCHAR U_9B09 +ENCODING 39689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5380 +6840 +FF80 +4840 +FF80 +4A40 +7FC0 +5140 +AE20 +3180 +ENDCHAR +STARTCHAR U_9B0A +ENCODING 39690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +2980 +4460 +FF80 +1100 +FFE0 +5F40 +9120 +1F00 +ENDCHAR +STARTCHAR U_9B0B +ENCODING 39691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +29A0 +4440 +FFE0 +4440 +7D40 +4540 +7D40 +4CC0 +ENDCHAR +STARTCHAR U_9B0C +ENCODING 39692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4980 +F460 +3FC0 +4400 +BFE0 +9040 +1FC0 +10C0 +ENDCHAR +STARTCHAR U_9B0D +ENCODING 39693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +41A0 +FC40 +4BE0 +FE20 +13E0 +7A20 +4BE0 +7A60 +ENDCHAR +STARTCHAR U_9B0E +ENCODING 39694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FE20 +54A0 +7CA0 +3820 +D6E0 +ENDCHAR +STARTCHAR U_9B0F +ENCODING 39695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +4980 +72A0 +FAC0 +2080 +7140 +AE20 +ENDCHAR +STARTCHAR U_9B10 +ENCODING 39696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4180 +FC60 +2980 +FFE0 +2420 +7FE0 +A080 +3F80 +ENDCHAR +STARTCHAR U_9B11 +ENCODING 39697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +C980 +3FC0 +0A80 +FFE0 +0A80 +7F80 +2A80 +CA60 +ENDCHAR +STARTCHAR U_9B12 +ENCODING 39698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +FC60 +2980 +4460 +FFC0 +2100 +3F00 +2100 +FFE0 +6180 +ENDCHAR +STARTCHAR U_9B13 +ENCODING 39699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +4180 +7860 +4980 +FC60 +4580 +FFE0 +A120 +FFE0 +1100 +60C0 +ENDCHAR +STARTCHAR U_9B14 +ENCODING 39700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +6880 +FB40 +4480 +2FC0 +7380 +2D60 +27C0 +3100 +4FE0 +ENDCHAR +STARTCHAR U_9B15 +ENCODING 39701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +4B00 +FFE0 +0A00 +3F80 +2080 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_9B16 +ENCODING 39702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +4B00 +7F80 +2940 +7FE0 +1500 +6AE0 +0500 +7E00 +ENDCHAR +STARTCHAR U_9B17 +ENCODING 39703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +4840 +FFE0 +1100 +7FC0 +5540 +6EC0 +45C0 +ENDCHAR +STARTCHAR U_9B18 +ENCODING 39704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +2B00 +7F80 +2080 +7FC0 +5240 +3F80 +0900 +76E0 +ENDCHAR +STARTCHAR U_9B19 +ENCODING 39705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +2B00 +7FC0 +5540 +7FC0 +2080 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9B1A +ENCODING 39706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +4840 +7FE0 +2440 +57C0 +2440 +17C0 +EC60 +ENDCHAR +STARTCHAR U_9B1B +ENCODING 39707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C40 +5580 +6840 +FDA0 +4840 +FF80 +2A80 +3F80 +3680 +2DA0 +3760 +ENDCHAR +STARTCHAR U_9B1C +ENCODING 39708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C60 +5180 +FC60 +4980 +FFE0 +AAA0 +FFE0 +9520 +9B20 +95A0 +A340 +ENDCHAR +STARTCHAR U_9B1D +ENCODING 39709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7880 +5340 +FCA0 +4B40 +FBE0 +AAA0 +FFE0 +9920 +9520 +9FA0 +8040 +ENDCHAR +STARTCHAR U_9B1E +ENCODING 39710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +4B20 +7FC0 +4A40 +7FE0 +4000 +7FE0 +5140 +98E0 +ENDCHAR +STARTCHAR U_9B1F +ENCODING 39711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +7FC0 +4A40 +FFE0 +2080 +3F80 +E280 +39E0 +ENDCHAR +STARTCHAR U_9B20 +ENCODING 39712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +7CC0 +1B00 +FFE0 +5540 +7FC0 +2080 +3F80 +ENDCHAR +STARTCHAR U_9B21 +ENCODING 39713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7860 +5380 +FC60 +4B80 +FA00 +FFE0 +AAA0 +3F80 +2A80 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9B22 +ENCODING 39714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCC0 +2B20 +4840 +FFE0 +9520 +7F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_9B23 +ENCODING 39715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +2B00 +7FC0 +5240 +7FC0 +4480 +7680 +45A0 +7E60 +ENDCHAR +STARTCHAR U_9B24 +ENCODING 39716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7CC0 +4300 +FCE0 +4700 +FFE0 +4A40 +FFE0 +1100 +FFE0 +5140 +B8E0 +ENDCHAR +STARTCHAR U_9B25 +ENCODING 39717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8020 +8020 +8020 +8020 +8020 +8060 +ENDCHAR +STARTCHAR U_9B26 +ENCODING 39718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8A20 +A620 +9220 +BFA0 +82A0 +8240 +ENDCHAR +STARTCHAR U_9B27 +ENCODING 39719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BFA0 +8420 +BFA0 +8420 +BFA0 +A5A0 +8460 +ENDCHAR +STARTCHAR U_9B28 +ENCODING 39720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8A20 +BFA0 +8A20 +BFA0 +8A20 +9160 +ENDCHAR +STARTCHAR U_9B29 +ENCODING 39721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +9120 +9B20 +9120 +9F20 +8AA0 +B3E0 +ENDCHAR +STARTCHAR U_9B2A +ENCODING 39722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +80A0 +FFE0 +A8A0 +BAA0 +A8A0 +FDE0 +ENDCHAR +STARTCHAR U_9B2B +ENCODING 39723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +8A20 +FFA0 +AAA0 +B920 +AAA0 +FCE0 +ENDCHAR +STARTCHAR U_9B2C +ENCODING 39724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +BBA0 +AA20 +93E0 +AAA0 +AAA0 +92A0 +BCE0 +ENDCHAR +STARTCHAR U_9B2D +ENCODING 39725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9120 +FFA0 +AA20 +EFE0 +AAA0 +EEA0 +AAA0 +FCE0 +ENDCHAR +STARTCHAR U_9B2E +ENCODING 39726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BBA0 +9120 +BBA0 +9220 +BFA0 +AAA0 +BBA0 +BAA0 +8BA0 +B8A0 +8FE0 +ENDCHAR +STARTCHAR U_9B2F +ENCODING 39727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +AA80 +D480 +AD80 +BA80 +C480 +FF80 +4000 +4700 +7880 +4080 +3F80 +ENDCHAR +STARTCHAR U_9B30 +ENCODING 39728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +F5E0 +6AC0 +A4A0 +FFE0 +A840 +5580 +7C40 +21A0 +2C40 +3380 +ENDCHAR +STARTCHAR U_9B31 +ENCODING 39729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4E40 +F5E0 +6EC0 +D540 +FFE0 +A820 +5640 +6AA0 +7F40 +40A0 +7E40 +ENDCHAR +STARTCHAR U_9B32 +ENCODING 39730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0000 +3F80 +2080 +3F80 +0000 +7FC0 +4A40 +5F40 +4440 +44C0 +ENDCHAR +STARTCHAR U_9B33 +ENCODING 39731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4240 +7FE0 +4840 +7FE0 +6520 +6FA0 +A220 +A260 +ENDCHAR +STARTCHAR U_9B34 +ENCODING 39732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8A0 +03E0 +7080 +53E0 +72A0 +03E0 +FAA0 +DBE0 +FAA0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9B35 +ENCODING 39733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FF80 +A500 +FFC0 +6340 +B540 +FFC0 +4100 +FF80 +A280 +FF80 +8B80 +ENDCHAR +STARTCHAR U_9B36 +ENCODING 39734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +7540 +2540 +F2A0 +54E0 +FFE0 +1080 +7FE0 +4920 +7FA0 +4460 +ENDCHAR +STARTCHAR U_9B37 +ENCODING 39735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF60 +02A0 +7B60 +4A20 +79E0 +0140 +FEA0 +D5E0 +FF40 +A480 +A760 +ENDCHAR +STARTCHAR U_9B38 +ENCODING 39736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +76A0 +55A0 +76A0 +0560 +F800 +DBE0 +FAA0 +ABE0 +AAA0 +9BE0 +ENDCHAR +STARTCHAR U_9B39 +ENCODING 39737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FAC0 +2340 +FBE0 +5260 +FFC0 +1100 +7FC0 +4A40 +5F40 +44C0 +ENDCHAR +STARTCHAR U_9B3A +ENCODING 39738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +07E0 +7A40 +4BC0 +7A40 +03E0 +FEA0 +D520 +FE60 +A4A0 +AD40 +ENDCHAR +STARTCHAR U_9B3B +ENCODING 39739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D560 +4E20 +DF60 +6E20 +D560 +FFE0 +2080 +7FC0 +4A40 +7FC0 +4440 +ENDCHAR +STARTCHAR U_9B3C +ENCODING 39740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7F80 +4880 +7F80 +4880 +7F80 +1480 +1540 +25C0 +4420 +83E0 +ENDCHAR +STARTCHAR U_9B3D +ENCODING 39741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7C40 +5480 +7F20 +5440 +7D80 +2420 +2A40 +5F80 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9B3E +ENCODING 39742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +ABE0 +F880 +ABE0 +A940 +F940 +2880 +3D60 +5220 +9FE0 +ENDCHAR +STARTCHAR U_9B3F +ENCODING 39743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +F9C0 +A900 +F9E0 +A940 +F940 +2940 +3540 +2D60 +5220 +9FE0 +ENDCHAR +STARTCHAR U_9B40 +ENCODING 39744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +A980 +FA40 +AC20 +F940 +2540 +2B40 +5D40 +5260 +8FE0 +ENDCHAR +STARTCHAR U_9B41 +ENCODING 39745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +FA40 +A940 +FA40 +A940 +F860 +2BC0 +3440 +2C60 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B42 +ENCODING 39746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +77C0 +0540 +07C0 +FD40 +27C0 +5200 +7B40 +C5E0 +0520 +09E0 +ENDCHAR +STARTCHAR U_9B43 +ENCODING 39747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +F920 +ABE0 +F900 +A9E0 +F920 +2AA0 +3440 +3CA0 +5120 +9FE0 +ENDCHAR +STARTCHAR U_9B44 +ENCODING 39748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +47C0 +F540 +97C0 +9540 +F7C0 +9200 +9340 +F5E0 +0520 +09E0 +ENDCHAR +STARTCHAR U_9B45 +ENCODING 39749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F880 +ABE0 +F880 +ABE0 +F880 +29C0 +36A0 +2C80 +50A0 +9FE0 +ENDCHAR +STARTCHAR U_9B46 +ENCODING 39750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +ABE0 +FAA0 +AAA0 +FA40 +2A40 +36A0 +2F20 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B47 +ENCODING 39751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8500 +FFE0 +9480 +FFE0 +9480 +9F80 +9480 +9FA0 +8AA0 +F3E0 +ENDCHAR +STARTCHAR U_9B48 +ENCODING 39752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +F9C0 +A880 +FBE0 +AA20 +FBE0 +2A20 +37E0 +2A20 +5060 +9FE0 +ENDCHAR +STARTCHAR U_9B49 +ENCODING 39753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F940 +AFE0 +FD60 +AD60 +FEA0 +2D60 +3620 +2840 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B4A +ENCODING 39754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +F8A0 +AFE0 +F880 +AEA0 +FAA0 +3640 +28A0 +3B20 +6020 +BFE0 +ENDCHAR +STARTCHAR U_9B4B +ENCODING 39755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2300 +FA80 +ABE0 +FE80 +ABC0 +FA80 +2BC0 +3680 +2FE0 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B4C +ENCODING 39756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +2A40 +37E0 +2940 +5220 +9FE0 +ENDCHAR +STARTCHAR U_9B4D +ENCODING 39757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FEA0 +AD20 +FFE0 +AD20 +FFE0 +2D20 +35A0 +2C60 +5420 +9FE0 +ENDCHAR +STARTCHAR U_9B4E +ENCODING 39758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +F880 +AFE0 +FCA0 +AEE0 +FDA0 +2EE0 +34A0 +2CA0 +5020 +9FE0 +ENDCHAR +STARTCHAR U_9B4F +ENCODING 39759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +27C0 +FD40 +67C0 +B540 +27C0 +F900 +4940 +53C0 +2520 +49E0 +ENDCHAR +STARTCHAR U_9B50 +ENCODING 39760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +FFE0 +AA80 +FFE0 +AAA0 +FFE0 +2AA0 +37E0 +7EC0 +6AA0 +9FE0 +ENDCHAR +STARTCHAR U_9B51 +ENCODING 39761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +AAA0 +FB60 +ABE0 +F880 +2FE0 +3560 +2FE0 +5420 +9FE0 +ENDCHAR +STARTCHAR U_9B52 +ENCODING 39762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +FA80 +AFE0 +FAA0 +AFE0 +F800 +2FE0 +35C0 +2AA0 +50A0 +9FE0 +ENDCHAR +STARTCHAR U_9B53 +ENCODING 39763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FAA0 +ABE0 +FAA0 +AFE0 +FAA0 +27E0 +2A80 +5FE0 +5080 +8FE0 +ENDCHAR +STARTCHAR U_9B54 +ENCODING 39764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +5240 +5FC0 +8AA0 +B3E0 +ENDCHAR +STARTCHAR U_9B55 +ENCODING 39765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +FBA0 +AD40 +FBA0 +AD40 +FFE0 +2D20 +34C0 +2EC0 +5520 +9FE0 +ENDCHAR +STARTCHAR U_9B56 +ENCODING 39766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +F100 +D7E0 +B520 +D7C0 +F540 +5760 +6D40 +57E0 +A820 +9FE0 +ENDCHAR +STARTCHAR U_9B57 +ENCODING 39767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FFC0 +2540 +FFC0 +2540 +FFC0 +0940 +FDA0 +AAE0 +EA80 +1C60 +ENDCHAR +STARTCHAR U_9B58 +ENCODING 39768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4C0 +BCA0 +A7E0 +BD40 +A620 +9FC0 +9240 +9FC0 +8AA0 +F3E0 +ENDCHAR +STARTCHAR U_9B59 +ENCODING 39769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +BF00 +55E0 +3F40 +C540 +7F80 +2A80 +2480 +3F80 +1540 +E7E0 +ENDCHAR +STARTCHAR U_9B5A +ENCODING 39770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +5240 +4920 +8920 +ENDCHAR +STARTCHAR U_9B5B +ENCODING 39771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +9120 +F920 +A920 +F920 +A920 +F920 +0220 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9B5C +ENCODING 39772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9100 +F900 +A900 +FA80 +AA80 +FA80 +0240 +AA60 +AC40 +ENDCHAR +STARTCHAR U_9B5D +ENCODING 39773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +3C20 +48A0 +FCA0 +54A0 +7CA0 +54A0 +7CA0 +0020 +AAA0 +AA40 +ENDCHAR +STARTCHAR U_9B5E +ENCODING 39774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7B00 +9080 +F880 +A880 +F880 +A880 +F940 +0140 +AA20 +AC20 +ENDCHAR +STARTCHAR U_9B5F +ENCODING 39775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9080 +F880 +A880 +F880 +A880 +F880 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9B60 +ENCODING 39776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7F00 +9100 +F900 +A9E0 +FF00 +A900 +F900 +0100 +A920 +A8E0 +ENDCHAR +STARTCHAR U_9B61 +ENCODING 39777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FC20 +A820 +FA20 +A920 +F920 +0020 +A8A0 +A840 +ENDCHAR +STARTCHAR U_9B62 +ENCODING 39778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9040 +F840 +A840 +FBC0 +AA00 +FA00 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B63 +ENCODING 39779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9280 +F900 +AFE0 +F920 +A940 +F900 +0100 +A900 +AB00 +ENDCHAR +STARTCHAR U_9B64 +ENCODING 39780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +92A0 +FAA0 +AEC0 +FA80 +AB80 +FA80 +02A0 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_9B65 +ENCODING 39781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9240 +FA80 +AB00 +FAC0 +AA40 +FB40 +0280 +A540 +AA20 +ENDCHAR +STARTCHAR U_9B66 +ENCODING 39782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +90C0 +FAA0 +AAA0 +FC80 +A8A0 +F840 +0080 +A900 +AE00 +ENDCHAR +STARTCHAR U_9B67 +ENCODING 39783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +F800 +AB80 +FA80 +AA80 +FA80 +02A0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B68 +ENCODING 39784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +AAA0 +FAA0 +ABE0 +F880 +00A0 +A8A0 +A860 +ENDCHAR +STARTCHAR U_9B69 +ENCODING 39785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FD20 +A960 +FAA0 +A8A0 +F920 +0120 +AAA0 +A840 +ENDCHAR +STARTCHAR U_9B6A +ENCODING 39786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9280 +FC40 +AAA0 +FA80 +AA80 +FA80 +0280 +AA80 +AC80 +ENDCHAR +STARTCHAR U_9B6B +ENCODING 39787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +FD20 +A940 +F980 +A980 +FA80 +02A0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B6C +ENCODING 39788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9200 +FA00 +ABE0 +FA20 +AB20 +FAC0 +0280 +AD40 +AA20 +ENDCHAR +STARTCHAR U_9B6D +ENCODING 39789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9000 +F800 +AFE0 +FA80 +AA80 +FA80 +0280 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B6E +ENCODING 39790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +9280 +FA80 +ABA0 +FAC0 +AA80 +FA80 +02A0 +ABA0 +AA60 +ENDCHAR +STARTCHAR U_9B6F +ENCODING 39791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +C440 +7FC0 +4440 +7FC0 +A0A0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_9B70 +ENCODING 39792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FA40 +AA40 +FA40 +A980 +F900 +0180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_9B71 +ENCODING 39793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +9100 +FBC0 +AA40 +FA40 +AA40 +FBC0 +0040 +A840 +AFE0 +ENDCHAR +STARTCHAR U_9B72 +ENCODING 39794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +93E0 +FA20 +AA20 +FBE0 +AA00 +FA00 +0200 +AA00 +AC00 +ENDCHAR +STARTCHAR U_9B73 +ENCODING 39795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9080 +FBE0 +AAA0 +FAA0 +AAA0 +FAA0 +02E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9B74 +ENCODING 39796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +F900 +A9E0 +F920 +A920 +F920 +0220 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9B75 +ENCODING 39797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +9240 +FC40 +A820 +FFC0 +A940 +F940 +0140 +AA40 +AC80 +ENDCHAR +STARTCHAR U_9B76 +ENCODING 39798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +FAA0 +AAA0 +FAA0 +AB60 +FA20 +0220 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9B77 +ENCODING 39799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7940 +9120 +FFE0 +A900 +F980 +A980 +FA80 +02A0 +AAA0 +AC60 +ENDCHAR +STARTCHAR U_9B78 +ENCODING 39800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7A40 +9240 +FBE0 +AA00 +FA00 +ABC0 +FA40 +0240 +AA40 +AC40 +ENDCHAR +STARTCHAR U_9B79 +ENCODING 39801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +78C0 +9700 +F900 +A9E0 +FF00 +A9E0 +FF00 +0120 +A920 +A8E0 +ENDCHAR +STARTCHAR U_9B7A +ENCODING 39802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77E0 +9020 +FBA0 +AAA0 +FAA0 +ABA0 +F820 +0020 +A820 +A8E0 +ENDCHAR +STARTCHAR U_9B7B +ENCODING 39803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FAA0 +ABE0 +F880 +0080 +A880 +A880 +ENDCHAR +STARTCHAR U_9B7C +ENCODING 39804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +A880 +FFE0 +A880 +F900 +0140 +AA20 +AFE0 +ENDCHAR +STARTCHAR U_9B7D +ENCODING 39805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A40 +9240 +FFE0 +AA40 +FA40 +ABC0 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9B7E +ENCODING 39806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +9080 +F980 +AAC0 +FCA0 +A8A0 +F880 +0080 +A800 +AFE0 +ENDCHAR +STARTCHAR U_9B7F +ENCODING 39807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9280 +FC40 +AA20 +F900 +AFE0 +F840 +0280 +A900 +A880 +ENDCHAR +STARTCHAR U_9B80 +ENCODING 39808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FC20 +AA00 +FA40 +AA80 +FB00 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B81 +ENCODING 39809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A40 +9200 +FFE0 +AA00 +FBC0 +AA40 +FD40 +0480 +A940 +AA20 +ENDCHAR +STARTCHAR U_9B82 +ENCODING 39810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9220 +FAA0 +AAA0 +FAA0 +AAA0 +FB60 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B83 +ENCODING 39811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77E0 +9100 +FD40 +AB80 +F900 +AFE0 +F900 +0100 +AD00 +A900 +ENDCHAR +STARTCHAR U_9B84 +ENCODING 39812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +97E0 +FAA0 +AFE0 +FA80 +AFE0 +FAA0 +02E0 +AC80 +A880 +ENDCHAR +STARTCHAR U_9B85 +ENCODING 39813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +78C0 +9240 +FA40 +AE80 +FAA0 +AB20 +FA00 +0620 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B86 +ENCODING 39814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +5F80 +5220 +FFE0 +1200 +3F80 +E480 +3F80 +2480 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9B87 +ENCODING 39815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +A880 +FFE0 +A880 +F9C0 +02A0 +ACA0 +A880 +ENDCHAR +STARTCHAR U_9B88 +ENCODING 39816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FC20 +ABA0 +FAA0 +AAA0 +FBA0 +0020 +A8A0 +A840 +ENDCHAR +STARTCHAR U_9B89 +ENCODING 39817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9120 +F920 +AAA0 +FC40 +ABE0 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B8A +ENCODING 39818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7900 +93E0 +FA20 +AA20 +FBE0 +AA20 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B8B +ENCODING 39819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9080 +FBE0 +AAA0 +FAA0 +ABE0 +FAA0 +02A0 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B8C +ENCODING 39820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7900 +97E0 +F900 +AA40 +FFC0 +A880 +F900 +0240 +AFE0 +AA20 +ENDCHAR +STARTCHAR U_9B8D +ENCODING 39821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +FAA0 +AAC0 +FA80 +ABE0 +FA20 +0540 +A480 +AB60 +ENDCHAR +STARTCHAR U_9B8E +ENCODING 39822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9100 +F9E0 +A900 +F900 +ABC0 +FA40 +0240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9B8F +ENCODING 39823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9280 +FBE0 +AC80 +F880 +ABE0 +F880 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9B90 +ENCODING 39824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9200 +FA40 +AFE0 +F800 +ABC0 +FA40 +0240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9B91 +ENCODING 39825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FC20 +ABA0 +FAA0 +ABA0 +FA40 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9B92 +ENCODING 39826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7940 +9240 +FFE0 +AA40 +FB40 +AAC0 +FA40 +0240 +AA40 +AAC0 +ENDCHAR +STARTCHAR U_9B93 +ENCODING 39827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A00 +93E0 +FD00 +A9C0 +F900 +A900 +F9C0 +0100 +A900 +A900 +ENDCHAR +STARTCHAR U_9B94 +ENCODING 39828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9200 +FA00 +ABC0 +FA40 +AA40 +FBC0 +0200 +AA00 +ABE0 +ENDCHAR +STARTCHAR U_9B95 +ENCODING 39829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +A880 +FBE0 +AA20 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B96 +ENCODING 39830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77E0 +9100 +F900 +AA00 +FBC0 +AE40 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9B97 +ENCODING 39831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BC0 +9440 +FA80 +A900 +FA80 +AC60 +F900 +0080 +A900 +A880 +ENDCHAR +STARTCHAR U_9B98 +ENCODING 39832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AC0 +92A0 +FA80 +ABE0 +FE80 +AA80 +FA80 +02A0 +AA60 +AA20 +ENDCHAR +STARTCHAR U_9B99 +ENCODING 39833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7F60 +9120 +FDA0 +AB60 +F920 +AB60 +FDA0 +0120 +AD20 +AB60 +ENDCHAR +STARTCHAR U_9B9A +ENCODING 39834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +ABE0 +F800 +ABE0 +FA20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9B9B +ENCODING 39835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +90E0 +F880 +AFE0 +F880 +AAC0 +FAA0 +04A0 +A880 +A980 +ENDCHAR +STARTCHAR U_9B9C +ENCODING 39836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7B80 +9200 +FBE0 +AA00 +FA00 +ABE0 +FD20 +0520 +A5E0 +A920 +ENDCHAR +STARTCHAR U_9B9D +ENCODING 39837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1480 +7FC0 +0400 +FFE0 +2080 +DF60 +2200 +7F80 +2480 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9B9E +ENCODING 39838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +9100 +FFE0 +AAA0 +FAA0 +AAA0 +FAA0 +0AA0 +DA20 +A860 +ENDCHAR +STARTCHAR U_9B9F +ENCODING 39839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7900 +97E0 +FC20 +A900 +FFE0 +AA40 +FE80 +0100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_9BA0 +ENCODING 39840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +FBE0 +AA00 +FAE0 +AAA0 +FAE0 +0280 +ACA0 +A8E0 +ENDCHAR +STARTCHAR U_9BA1 +ENCODING 39841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AA0 +96A0 +FAC0 +AA80 +FEC0 +AAA0 +FA80 +02A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_9BA2 +ENCODING 39842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FC80 +A880 +FFE0 +A880 +F9C0 +02A0 +ACA0 +A880 +ENDCHAR +STARTCHAR U_9BA3 +ENCODING 39843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7AE0 +92A0 +FAA0 +ABA0 +FAA0 +AAA0 +FBA0 +06E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9BA4 +ENCODING 39844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F20 +10A0 +1EA0 +64A0 +1820 +EF60 +1200 +7FC0 +2440 +3FC0 +D220 +ENDCHAR +STARTCHAR U_9BA5 +ENCODING 39845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9240 +FD40 +A980 +FA40 +AFE0 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9BA6 +ENCODING 39846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7820 +ABA0 +F820 +ABA0 +FAA0 +AAA0 +FBA0 +0820 +D820 +A860 +ENDCHAR +STARTCHAR U_9BA7 +ENCODING 39847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9080 +FBE0 +A8A0 +FBE0 +AA80 +FBE0 +00A0 +A940 +AA20 +ENDCHAR +STARTCHAR U_9BA8 +ENCODING 39848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7A60 +9380 +FA20 +A9E0 +F800 +ABE0 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BA9 +ENCODING 39849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4420 +7A40 +97E0 +FA40 +AA40 +FFE0 +AA40 +FA40 +0240 +A440 +A840 +ENDCHAR +STARTCHAR U_9BAA +ENCODING 39850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +FA00 +ABC0 +FE40 +ABC0 +FA40 +03C0 +AA40 +AAC0 +ENDCHAR +STARTCHAR U_9BAB +ENCODING 39851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FA40 +AC20 +FA40 +AA40 +F980 +0180 +AA40 +AC20 +ENDCHAR +STARTCHAR U_9BAC +ENCODING 39852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9240 +FDA0 +A800 +FFE0 +A900 +FBC0 +0040 +A940 +A880 +ENDCHAR +STARTCHAR U_9BAD +ENCODING 39853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +ABE0 +F880 +A880 +FBE0 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BAE +ENCODING 39854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +93E0 +F880 +ABE0 +F880 +A880 +FBE0 +0080 +A880 +A880 +ENDCHAR +STARTCHAR U_9BAF +ENCODING 39855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7980 +9240 +FC20 +ABC0 +F800 +ABC0 +FA40 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9BB0 +ENCODING 39856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9220 +FA20 +ABA0 +FAA0 +AAA0 +FBA0 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9BB1 +ENCODING 39857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +9120 +F940 +AFE0 +F900 +AA40 +FF80 +0220 +AA20 +A9E0 +ENDCHAR +STARTCHAR U_9BB2 +ENCODING 39858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AC0 +92A0 +FA80 +ABE0 +FE80 +AA80 +FA80 +0340 +AB40 +AA20 +ENDCHAR +STARTCHAR U_9BB3 +ENCODING 39859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9140 +FFE0 +A900 +FBC0 +AE00 +FBC0 +0040 +A940 +A880 +ENDCHAR +STARTCHAR U_9BB4 +ENCODING 39860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +9280 +FBE0 +AA80 +FEC0 +AAA0 +FBA0 +0280 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9BB5 +ENCODING 39861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +93E0 +FA20 +AA20 +FBE0 +A940 +F940 +0140 +AA40 +AC60 +ENDCHAR +STARTCHAR U_9BB6 +ENCODING 39862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7940 +97E0 +F940 +ABC0 +F900 +ABE0 +FE20 +0220 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9BB7 +ENCODING 39863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77C0 +9140 +FFC0 +AD00 +FFE0 +A920 +FB20 +05A0 +A940 +A900 +ENDCHAR +STARTCHAR U_9BB8 +ENCODING 39864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +39E0 +5240 +FC80 +ABE0 +FAA0 +ABE0 +F980 +0180 +AAA0 +A4E0 +ENDCHAR +STARTCHAR U_9BB9 +ENCODING 39865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AA0 +91C0 +FBE0 +AA20 +FBE0 +AA20 +FBE0 +0220 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9BBA +ENCODING 39866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3F80 +0400 +FFE0 +1800 +2F00 +D200 +3FC0 +5240 +1FC0 +6520 +ENDCHAR +STARTCHAR U_9BBB +ENCODING 39867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A40 +97E0 +FA40 +AD20 +FBE0 +AA40 +FD40 +0080 +A940 +AE20 +ENDCHAR +STARTCHAR U_9BBC +ENCODING 39868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +FC20 +ABC0 +F940 +0140 +A880 +AB60 +ENDCHAR +STARTCHAR U_9BBD +ENCODING 39869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7940 +9220 +FFE0 +A880 +FBE0 +A880 +F9C0 +02A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9BBE +ENCODING 39870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7E00 +94A0 +FAA0 +A940 +FFE0 +AA40 +FA80 +0100 +AA80 +AC60 +ENDCHAR +STARTCHAR U_9BBF +ENCODING 39871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7540 +9540 +FF40 +AD40 +FF40 +AD40 +FD40 +07C0 +A940 +A960 +ENDCHAR +STARTCHAR U_9BC0 +ENCODING 39872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7F80 +9100 +FA40 +AB80 +F920 +AFE0 +F880 +02C0 +ACA0 +A9A0 +ENDCHAR +STARTCHAR U_9BC1 +ENCODING 39873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +93E0 +FAA0 +ABE0 +FAA0 +ABE0 +FA80 +0180 +A980 +AE60 +ENDCHAR +STARTCHAR U_9BC2 +ENCODING 39874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +9080 +FBE0 +AAA0 +FB60 +AA20 +FBE0 +0220 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BC3 +ENCODING 39875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +97C0 +FA40 +AA40 +FFE0 +A800 +FBC0 +0240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9BC4 +ENCODING 39876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7920 +97E0 +F900 +AD20 +FB40 +A980 +FB40 +0520 +A920 +AB00 +ENDCHAR +STARTCHAR U_9BC5 +ENCODING 39877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4660 +7BC0 +9240 +FA40 +AC60 +FB40 +AB40 +FB40 +05E0 +A400 +ABE0 +ENDCHAR +STARTCHAR U_9BC6 +ENCODING 39878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +70A0 +97E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +03E0 +AAA0 +AA60 +ENDCHAR +STARTCHAR U_9BC7 +ENCODING 39879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A800 +FFE0 +AA80 +FA80 +02A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_9BC8 +ENCODING 39880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +4640 +5980 +D660 +53C0 +5480 +5FE0 +5520 +47E0 +4AA0 +ENDCHAR +STARTCHAR U_9BC9 +ENCODING 39881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FBE0 +A880 +FBE0 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BCA +ENCODING 39882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +A920 +4180 +DE00 +5100 +3FC0 +6440 +3FC0 +2440 +3FC0 +C920 +ENDCHAR +STARTCHAR U_9BCB +ENCODING 39883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +7480 +90C0 +F9A0 +ADA0 +FA80 +AAA0 +FC40 +0480 +A900 +AA00 +ENDCHAR +STARTCHAR U_9BCC +ENCODING 39884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7A80 +93E0 +FC80 +A880 +FFE0 +A800 +FBE0 +0220 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BCD +ENCODING 39885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7900 +97E0 +F900 +AA40 +FFE0 +A800 +FD40 +0540 +A540 +A960 +ENDCHAR +STARTCHAR U_9BCE +ENCODING 39886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +78C0 +90A0 +FFE0 +A880 +FEA0 +AAA0 +FAC0 +0EA0 +A960 +B220 +ENDCHAR +STARTCHAR U_9BCF +ENCODING 39887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4320 +7620 +92A0 +FFA0 +AAA0 +FBA0 +AEA0 +FAA0 +0220 +AAA0 +AA40 +ENDCHAR +STARTCHAR U_9BD0 +ENCODING 39888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93C0 +F900 +A900 +FFE0 +A900 +F9C0 +0500 +A700 +A8E0 +ENDCHAR +STARTCHAR U_9BD1 +ENCODING 39889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7880 +9360 +F880 +AFE0 +F900 +ABE0 +FEA0 +02A0 +AAE0 +A880 +ENDCHAR +STARTCHAR U_9BD2 +ENCODING 39890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7940 +9080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +02A0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9BD3 +ENCODING 39891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA40 +FBC0 +AA60 +FFC0 +0140 +AA40 +ACC0 +ENDCHAR +STARTCHAR U_9BD4 +ENCODING 39892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7AA0 +9540 +FAA0 +AAA0 +F800 +ABE0 +FAA0 +03E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9BD5 +ENCODING 39893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7A40 +97E0 +FA40 +ABC0 +FA40 +ABC0 +FA40 +07E0 +AA40 +AC20 +ENDCHAR +STARTCHAR U_9BD6 +ENCODING 39894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9100 +FBC0 +A900 +FFE0 +AA40 +FBC0 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9BD7 +ENCODING 39895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +FFE0 +2880 +4F40 +9220 +7FC0 +2440 +3FC0 +C920 +ENDCHAR +STARTCHAR U_9BD8 +ENCODING 39896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7B00 +9100 +FFE0 +AB80 +FD40 +A920 +FFE0 +0240 +A980 +AE60 +ENDCHAR +STARTCHAR U_9BD9 +ENCODING 39897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9240 +FBC0 +A800 +FBE0 +A840 +F880 +07E0 +A880 +A980 +ENDCHAR +STARTCHAR U_9BDA +ENCODING 39898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +97E0 +F9C0 +AAA0 +FC80 +ABE0 +F880 +07E0 +A880 +A980 +ENDCHAR +STARTCHAR U_9BDB +ENCODING 39899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +ABA0 +F920 +AFE0 +F820 +ABA0 +FAA0 +0BA0 +A820 +B060 +ENDCHAR +STARTCHAR U_9BDC +ENCODING 39900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9220 +F940 +AFE0 +F880 +AFE0 +F940 +0240 +A980 +AE60 +ENDCHAR +STARTCHAR U_9BDD +ENCODING 39901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +94A0 +FFE0 +ACA0 +FDE0 +AD60 +FDE0 +0420 +AFE0 +AC20 +ENDCHAR +STARTCHAR U_9BDE +ENCODING 39902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +FCA0 +ABE0 +FAA0 +02A0 +AAE0 +A880 +ENDCHAR +STARTCHAR U_9BDF +ENCODING 39903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +01C0 +AAA0 +ACA0 +ENDCHAR +STARTCHAR U_9BE0 +ENCODING 39904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +FAA0 +AAC0 +FDA0 +A8A0 +F980 +02C0 +ACA0 +A8A0 +ENDCHAR +STARTCHAR U_9BE1 +ENCODING 39905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +96E0 +FA80 +AA80 +FEE0 +AA80 +FA80 +06E0 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9BE2 +ENCODING 39906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7EE0 +9420 +FC20 +AEE0 +FC20 +AFE0 +FA80 +02A0 +ACA0 +A860 +ENDCHAR +STARTCHAR U_9BE3 +ENCODING 39907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7C40 +97C0 +FC40 +AFC0 +FA00 +AFE0 +FAA0 +0520 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9BE4 +ENCODING 39908 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +FA20 +ABE0 +F800 +AAA0 +FBC0 +02A0 +ABA0 +AAE0 +ENDCHAR +STARTCHAR U_9BE5 +ENCODING 39909 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9080 +FFE0 +A940 +FA20 +AC80 +FBE0 +0080 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BE6 +ENCODING 39910 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7740 +9560 +FD40 +AA40 +FDE0 +A800 +FFC0 +0440 +AC40 +AFC0 +ENDCHAR +STARTCHAR U_9BE7 +ENCODING 39911 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FC20 +07E0 +AC20 +A7E0 +ENDCHAR +STARTCHAR U_9BE8 +ENCODING 39912 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9000 +FBE0 +AA20 +FBE0 +A880 +FAC0 +02A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9BE9 +ENCODING 39913 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9140 +FA20 +ADC0 +F800 +ABE0 +FAA0 +03E0 +AAA0 +AAA0 +ENDCHAR +STARTCHAR U_9BEA +ENCODING 39914 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FC0 +9100 +FFE0 +AA40 +FD20 +A9C0 +FB40 +0480 +A940 +AE20 +ENDCHAR +STARTCHAR U_9BEB +ENCODING 39915 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +6A00 +ABE0 +FEA0 +AAA0 +FAA0 +AEA0 +FB40 +0E40 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_9BEC +ENCODING 39916 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +21E0 +FEA0 +6920 +A440 +1F80 +2100 +FFC0 +2440 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9BED +ENCODING 39917 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +9080 +FFE0 +A880 +FA80 +A900 +FBE0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9BEE +ENCODING 39918 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9420 +FBC0 +A800 +FFE0 +A880 +FAC0 +02A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9BEF +ENCODING 39919 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7220 +97A0 +FA20 +AFA0 +FA20 +AFA0 +FAA0 +0AA0 +ABA0 +AA60 +ENDCHAR +STARTCHAR U_9BF0 +ENCODING 39920 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7980 +9340 +FCA0 +AFE0 +F840 +A980 +FA80 +0620 +AA60 +A9C0 +ENDCHAR +STARTCHAR U_9BF1 +ENCODING 39921 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7900 +97E0 +FD20 +AFC0 +FD20 +ACE0 +FC00 +05C0 +A940 +AA60 +ENDCHAR +STARTCHAR U_9BF2 +ENCODING 39922 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7A40 +90A0 +FF00 +AA40 +FA20 +AB80 +FA80 +02C0 +AAA0 +AD20 +ENDCHAR +STARTCHAR U_9BF3 +ENCODING 39923 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9200 +FA60 +AB80 +FA80 +ABE0 +FA80 +02A0 +AB60 +ACA0 +ENDCHAR +STARTCHAR U_9BF4 +ENCODING 39924 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +77C0 +9040 +FFC0 +A940 +FFC0 +A940 +FFC0 +0140 +A9E0 +AE20 +ENDCHAR +STARTCHAR U_9BF5 +ENCODING 39925 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77C0 +9100 +FFE0 +AA80 +FD60 +AA80 +FD40 +0280 +A900 +AE00 +ENDCHAR +STARTCHAR U_9BF6 +ENCODING 39926 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7CA0 +97E0 +F880 +ABE0 +FAA0 +ABE0 +FAA0 +07E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9BF7 +ENCODING 39927 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FA80 +02E0 +AD80 +A8E0 +ENDCHAR +STARTCHAR U_9BF8 +ENCODING 39928 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +97E0 +FD00 +ADE0 +FE80 +AC80 +FFE0 +0480 +AD40 +A620 +ENDCHAR +STARTCHAR U_9BF9 +ENCODING 39929 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +FA20 +ABE0 +FA80 +ABE0 +FC80 +03E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9BFA +ENCODING 39930 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +F940 +AFE0 +F900 +ABE0 +FE20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9BFB +ENCODING 39931 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7FA0 +9220 +FFA0 +AAA0 +FFA0 +AAA0 +FBA0 +06A0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9BFC +ENCODING 39932 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +74A0 +9760 +FC20 +AFE0 +FA80 +AD60 +FBC0 +0540 +A880 +AB60 +ENDCHAR +STARTCHAR U_9BFD +ENCODING 39933 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +7AA0 +AAA0 +FEA0 +AAA0 +FEA0 +A8A0 +FCA0 +0AC0 +AD80 +A880 +ENDCHAR +STARTCHAR U_9BFE +ENCODING 39934 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7A80 +93E0 +FAA0 +AFE0 +FAA0 +ABE0 +FA80 +0380 +AA80 +AB60 +ENDCHAR +STARTCHAR U_9BFF +ENCODING 39935 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9820 +FFE0 +A800 +FFE0 +AAA0 +FFE0 +0AA0 +AAA0 +B260 +ENDCHAR +STARTCHAR U_9C00 +ENCODING 39936 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7F20 +9540 +FBE0 +A880 +FFE0 +A900 +F9E0 +02A0 +AA40 +ADA0 +ENDCHAR +STARTCHAR U_9C01 +ENCODING 39937 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FBE0 +A880 +FBA0 +01C0 +AAA0 +ADA0 +ENDCHAR +STARTCHAR U_9C02 +ENCODING 39938 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7E20 +9AA0 +FEA0 +AAA0 +FEA0 +AAA0 +FAA0 +0E20 +A420 +AA60 +ENDCHAR +STARTCHAR U_9C03 +ENCODING 39939 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +AFE0 +FAA0 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_9C04 +ENCODING 39940 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +70A0 +AFE0 +F880 +AA80 +FFA0 +AAA0 +FD40 +0A40 +AD60 +B0A0 +ENDCHAR +STARTCHAR U_9C05 +ENCODING 39941 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F880 +AFE0 +FCA0 +07E0 +AC20 +A460 +ENDCHAR +STARTCHAR U_9C06 +ENCODING 39942 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +93C0 +F900 +AFE0 +FA40 +AFE0 +FA40 +03C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C07 +ENCODING 39943 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7A80 +97E0 +FAA0 +AC80 +F900 +AFE0 +F900 +0380 +AD40 +A920 +ENDCHAR +STARTCHAR U_9C08 +ENCODING 39944 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7FE0 +92A0 +FAE0 +AA00 +FBE0 +A880 +FFE0 +01C0 +AAA0 +ACA0 +ENDCHAR +STARTCHAR U_9C09 +ENCODING 39945 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FFE0 +A880 +F880 +03E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9C0A +ENCODING 39946 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9100 +FFE0 +AD60 +FBA0 +AFE0 +F980 +0340 +AD20 +A900 +ENDCHAR +STARTCHAR U_9C0B +ENCODING 39947 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7D40 +95C0 +FD40 +ADC0 +FC80 +AFE0 +FD40 +0480 +AD40 +A7E0 +ENDCHAR +STARTCHAR U_9C0C +ENCODING 39948 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +97E0 +F880 +ABE0 +FAA0 +AB60 +FA20 +03E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C0D +ENCODING 39949 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7E40 +9240 +FF40 +AAE0 +FB40 +AEC0 +FA40 +0240 +AAA0 +AB20 +ENDCHAR +STARTCHAR U_9C0E +ENCODING 39950 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4680 +7BE0 +92A0 +FDE0 +AEA0 +FBE0 +AA80 +FFE0 +0280 +AE00 +A9E0 +ENDCHAR +STARTCHAR U_9C0F +ENCODING 39951 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7800 +91C0 +F940 +A9C0 +F800 +ABE0 +FAA0 +03E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C10 +ENCODING 39952 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +75A0 +97E0 +F800 +ABC0 +F800 +AFE0 +F900 +03C0 +A840 +A980 +ENDCHAR +STARTCHAR U_9C11 +ENCODING 39953 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +AFE0 +FA00 +ABE0 +FAA0 +0520 +AAA0 +AC40 +ENDCHAR +STARTCHAR U_9C12 +ENCODING 39954 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9640 +FBC0 +AA40 +FBC0 +A900 +FBE0 +0640 +A980 +AE60 +ENDCHAR +STARTCHAR U_9C13 +ENCODING 39955 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +A940 +FAA0 +5620 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_9C14 +ENCODING 39956 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +78A0 +97E0 +FC80 +AF80 +FCA0 +AFA0 +FD40 +07A0 +AD60 +AA20 +ENDCHAR +STARTCHAR U_9C15 +ENCODING 39957 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +7A20 +AA20 +FEE0 +A800 +FEE0 +A8A0 +F8A0 +0E40 +A8A0 +A920 +ENDCHAR +STARTCHAR U_9C16 +ENCODING 39958 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9200 +FBC0 +AC80 +FFE0 +AA40 +FBC0 +0240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9C17 +ENCODING 39959 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42E0 +7AA0 +97A0 +FAE0 +AFA0 +FDA0 +ADE0 +FFA0 +00A0 +A8A0 +A960 +ENDCHAR +STARTCHAR U_9C18 +ENCODING 39960 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A900 +FA40 +ABC0 +F900 +03C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_9C19 +ENCODING 39961 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +97E0 +FA80 +A900 +FFE0 +AA00 +FBC0 +0640 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C1A +ENCODING 39962 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A800 +FBC0 +AA40 +FBC0 +0240 +ABC0 +AFE0 +ENDCHAR +STARTCHAR U_9C1B +ENCODING 39963 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +ABE0 +FAA0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C1C +ENCODING 39964 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FE0 +9280 +FFE0 +AAA0 +FFE0 +AAA0 +FFE0 +0280 +AEC0 +AAA0 +ENDCHAR +STARTCHAR U_9C1D +ENCODING 39965 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9240 +FBC0 +A800 +FFE0 +A820 +FBA0 +5AA0 +ABA0 +A860 +ENDCHAR +STARTCHAR U_9C1E +ENCODING 39966 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA00 +FBE0 +AA00 +FBE0 +02A0 +AD60 +A860 +ENDCHAR +STARTCHAR U_9C1F +ENCODING 39967 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9280 +FFE0 +A920 +FFC0 +AA00 +FBC0 +0240 +A540 +A880 +ENDCHAR +STARTCHAR U_9C20 +ENCODING 39968 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7D40 +9280 +F900 +AEE0 +F900 +AFC0 +FD40 +07C0 +A920 +AFE0 +ENDCHAR +STARTCHAR U_9C21 +ENCODING 39969 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7AE0 +93A0 +FAA0 +AB60 +F800 +ABE0 +FAA0 +53E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C22 +ENCODING 39970 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A80 +93C0 +FA80 +ABC0 +FA80 +ABE0 +FAA0 +0560 +A8A0 +A840 +ENDCHAR +STARTCHAR U_9C23 +ENCODING 39971 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9A80 +FBE0 +AE40 +FBE0 +AA40 +FB40 +0EC0 +5040 +A8C0 +ENDCHAR +STARTCHAR U_9C24 +ENCODING 39972 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +7E80 +9A80 +FBE0 +AEA0 +FAA0 +AEA0 +FAA0 +5AE0 +AE80 +A080 +ENDCHAR +STARTCHAR U_9C25 +ENCODING 39973 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +9FE0 +F900 +AB40 +FD20 +A900 +FB40 +5520 +A920 +A900 +ENDCHAR +STARTCHAR U_9C26 +ENCODING 39974 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7A80 +9000 +FFE0 +AA40 +FC80 +AFE0 +FA40 +04A0 +AFE0 +A920 +ENDCHAR +STARTCHAR U_9C27 +ENCODING 39975 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EA80 +AFC0 +A200 +FFE0 +A880 +B760 +E900 +AF80 +AA80 +AF80 +B540 +ENDCHAR +STARTCHAR U_9C28 +ENCODING 39976 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FDA0 +5360 +ADA0 +AA60 +ENDCHAR +STARTCHAR U_9C29 +ENCODING 39977 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7BA0 +92A0 +F940 +AA00 +FBE0 +AC80 +FFE0 +5080 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C2A +ENCODING 39978 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +9100 +FFE0 +AA40 +FFE0 +A820 +FBE0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C2B +ENCODING 39979 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FA40 +ADA0 +FA40 +AC20 +FBC0 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9C2C +ENCODING 39980 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7880 +93E0 +FAA0 +ABE0 +FA80 +ABE0 +FB40 +5540 +AC80 +AB60 +ENDCHAR +STARTCHAR U_9C2D +ENCODING 39981 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FA0 +9140 +FFE0 +AA80 +FF20 +ABE0 +FA20 +53E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C2E +ENCODING 39982 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +9360 +FA20 +ABE0 +F800 +ABE0 +FAA0 +02A0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C2F +ENCODING 39983 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +9120 +FBE0 +AA80 +FBE0 +A920 +FDA0 +0360 +ADA0 +AB60 +ENDCHAR +STARTCHAR U_9C30 +ENCODING 39984 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7280 +9FE0 +FAA0 +ABE0 +FEA0 +ABE0 +FA80 +0280 +AA80 +AA80 +ENDCHAR +STARTCHAR U_9C31 +ENCODING 39985 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +96A0 +FBE0 +AEA0 +FBE0 +AA80 +FBE0 +5280 +AA80 +ADE0 +ENDCHAR +STARTCHAR U_9C32 +ENCODING 39986 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +21E0 +FF40 +4880 +9340 +3FE0 +6240 +BFC0 +2440 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9C33 +ENCODING 39987 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +7F80 +9480 +FFE0 +AAA0 +FFA0 +AAA0 +FFA0 +52A0 +AF20 +AA60 +ENDCHAR +STARTCHAR U_9C34 +ENCODING 39988 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6A80 +BE80 +00E0 +7EA0 +D2A0 +7EA0 +6AA0 +7EA0 +6A40 +7EA0 +5520 +ENDCHAR +STARTCHAR U_9C35 +ENCODING 39989 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3D00 +55E0 +FE40 +5580 +7E60 +1700 +0A00 +3F80 +1480 +1F80 +6AC0 +ENDCHAR +STARTCHAR U_9C36 +ENCODING 39990 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +96A0 +FD40 +AA20 +FDC0 +A800 +FFE0 +5080 +AAC0 +ADA0 +ENDCHAR +STARTCHAR U_9C37 +ENCODING 39991 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +75E0 +9B40 +FAC0 +AB20 +FA80 +ABE0 +FA80 +59C0 +AAA0 +ADA0 +ENDCHAR +STARTCHAR U_9C38 +ENCODING 39992 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7400 +95C0 +FD40 +ADC0 +FC00 +AFE0 +FEA0 +07E0 +A400 +A7E0 +ENDCHAR +STARTCHAR U_9C39 +ENCODING 39993 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6FE0 +AAA0 +FFA0 +A9A0 +FF40 +AA40 +FFA0 +0920 +57C0 +A900 +AFE0 +ENDCHAR +STARTCHAR U_9C3A +ENCODING 39994 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7FC0 +9240 +FCA0 +AFE0 +FA40 +AD20 +FA80 +0140 +A880 +AF00 +ENDCHAR +STARTCHAR U_9C3B +ENCODING 39995 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +AFE0 +FAA0 +AFE0 +FA40 +5180 +A980 +AE60 +ENDCHAR +STARTCHAR U_9C3C +ENCODING 39996 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7920 +95A0 +FB60 +ADA0 +F900 +ABE0 +FA20 +53E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C3D +ENCODING 39997 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77E0 +9280 +FFE0 +AAA0 +FFE0 +AA40 +FBC0 +5240 +ABC0 +AA40 +ENDCHAR +STARTCHAR U_9C3E +ENCODING 39998 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7280 +9FE0 +FAA0 +AFE0 +F800 +AFC0 +F800 +57E0 +AD40 +AB20 +ENDCHAR +STARTCHAR U_9C3F +ENCODING 39999 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9080 +FBE0 +A880 +FFE0 +AA40 +FBC0 +5240 +ABC0 +AE60 +ENDCHAR +STARTCHAR U_9C40 +ENCODING 40000 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +9100 +F7E0 +9120 +EDE0 +1FC0 +6440 +BFC0 +2440 +7FC0 +9120 +ENDCHAR +STARTCHAR U_9C41 +ENCODING 40001 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +45E0 +7A80 +92A0 +F940 +AEC0 +FB40 +AAE0 +FB40 +5240 +AA80 +ADE0 +ENDCHAR +STARTCHAR U_9C42 +ENCODING 40002 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +72E0 +AB20 +FAC0 +AE80 +FB40 +AFE0 +FA40 +0B40 +AA40 +B2C0 +ENDCHAR +STARTCHAR U_9C43 +ENCODING 40003 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9100 +FFC0 +A900 +FFE0 +ABC0 +FD40 +07C0 +A940 +A7E0 +ENDCHAR +STARTCHAR U_9C44 +ENCODING 40004 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9540 +FFC0 +AD40 +FFC0 +A920 +FFE0 +5440 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_9C45 +ENCODING 40005 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +92A0 +FBE0 +AAA0 +FBE0 +AA80 +FBE0 +06A0 +A7E0 +AAA0 +ENDCHAR +STARTCHAR U_9C46 +ENCODING 40006 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9140 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +5080 +AFE0 +A880 +ENDCHAR +STARTCHAR U_9C47 +ENCODING 40007 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9280 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +02A0 +A5C0 +AAA0 +ENDCHAR +STARTCHAR U_9C48 +ENCODING 40008 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +97E0 +FD20 +AB40 +FD20 +AFE0 +F820 +53E0 +A820 +ABE0 +ENDCHAR +STARTCHAR U_9C49 +ENCODING 40009 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +FDE0 +B740 +DC80 +8960 +1FC0 +6240 +BFC0 +2240 +3FC0 +4920 +ENDCHAR +STARTCHAR U_9C4A +ENCODING 40010 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7140 +97E0 +FAA0 +AC80 +FFE0 +AAA0 +FC60 +5BA0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C4B +ENCODING 40011 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7900 +97E0 +FD20 +AFC0 +FD20 +ADE0 +FD40 +5760 +A940 +AFE0 +ENDCHAR +STARTCHAR U_9C4C +ENCODING 40012 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41C0 +7240 +97E0 +FAA0 +ABE0 +F900 +AAA0 +FD40 +52E0 +A960 +AAC0 +ENDCHAR +STARTCHAR U_9C4D +ENCODING 40013 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4740 +75A0 +9240 +FFE0 +A940 +FB60 +AA80 +FBE0 +51A0 +A940 +AEA0 +ENDCHAR +STARTCHAR U_9C4E +ENCODING 40014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7900 +97E0 +FA40 +AFA0 +FA80 +AFE0 +F820 +5BA0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C4F +ENCODING 40015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7280 +AFE0 +F2A0 +BFE0 +D640 +B540 +F7C0 +0100 +DFE0 +A100 +ENDCHAR +STARTCHAR U_9C50 +ENCODING 40016 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7940 +97E0 +F940 +AFE0 +F920 +AFE0 +F920 +57E0 +A920 +A920 +ENDCHAR +STARTCHAR U_9C51 +ENCODING 40017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7BE0 +9140 +FFE0 +A880 +FBE0 +AAA0 +FBE0 +02A0 +ABE0 +AA20 +ENDCHAR +STARTCHAR U_9C52 +ENCODING 40018 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +77E0 +9140 +FBE0 +AAA0 +FB60 +ABE0 +F840 +57E0 +AA40 +A9C0 +ENDCHAR +STARTCHAR U_9C53 +ENCODING 40019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +F800 +ABE0 +FAA0 +ABE0 +FAA0 +07E0 +A880 +A880 +ENDCHAR +STARTCHAR U_9C54 +ENCODING 40020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9080 +FBE0 +A880 +FFE0 +A940 +FFE0 +5240 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C55 +ENCODING 40021 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +91C0 +FFE0 +AAC0 +FCA0 +ABE0 +FAA0 +53E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C56 +ENCODING 40022 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6D40 +AA40 +FFE0 +AAA0 +FAC0 +AFC0 +FA40 +5A40 +AAA0 +B520 +ENDCHAR +STARTCHAR U_9C57 +ENCODING 40023 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7340 +97E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +53E0 +AA40 +AC40 +ENDCHAR +STARTCHAR U_9C58 +ENCODING 40024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7840 +93C0 +F840 +AFE0 +FAA0 +AFE0 +F840 +57E0 +A940 +A8C0 +ENDCHAR +STARTCHAR U_9C59 +ENCODING 40025 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +9100 +FFE0 +AA40 +FFE0 +AA40 +FFE0 +5280 +AAA0 +ACE0 +ENDCHAR +STARTCHAR U_9C5A +ENCODING 40026 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9080 +FFE0 +AA20 +FBE0 +AA20 +F940 +07E0 +AA20 +ABE0 +ENDCHAR +STARTCHAR U_9C5B +ENCODING 40027 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +77E0 +96A0 +FDA0 +AFE0 +F800 +ABC0 +FA40 +03C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C5C +ENCODING 40028 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +7780 +AAE0 +FBA0 +AEA0 +FBC0 +AAA0 +FEA0 +07E0 +AA80 +B080 +ENDCHAR +STARTCHAR U_9C5D +ENCODING 40029 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9540 +FFE0 +AA40 +FBC0 +AA40 +FBC0 +0240 +ABC0 +AE60 +ENDCHAR +STARTCHAR U_9C5E +ENCODING 40030 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6AA0 +BFE0 +F800 +AFE0 +FA40 +ABC0 +F920 +56C0 +AA40 +AB20 +ENDCHAR +STARTCHAR U_9C5F +ENCODING 40031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +4440 +6AC0 +FFE0 +9220 +3FC0 +6440 +3FC0 +2440 +7FC0 +8920 +ENDCHAR +STARTCHAR U_9C60 +ENCODING 40032 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4380 +7440 +9BA0 +F800 +AFE0 +FAA0 +AFE0 +FC40 +57C0 +AC40 +A7C0 +ENDCHAR +STARTCHAR U_9C61 +ENCODING 40033 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +6E60 +AA40 +FFE0 +AA40 +FF40 +ABE0 +FF40 +0540 +AAA0 +A120 +ENDCHAR +STARTCHAR U_9C62 +ENCODING 40034 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7240 +9240 +FFE0 +AAA0 +FEE0 +A900 +FFE0 +5380 +AD40 +A920 +ENDCHAR +STARTCHAR U_9C63 +ENCODING 40035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +95A0 +FC20 +AFE0 +FA40 +ABC0 +FA40 +53C0 +A800 +AFE0 +ENDCHAR +STARTCHAR U_9C64 +ENCODING 40036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7BE0 +9240 +FBC0 +AA60 +FBC0 +AAC0 +FBA0 +0280 +A560 +AAC0 +ENDCHAR +STARTCHAR U_9C65 +ENCODING 40037 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7AE0 +9280 +FFE0 +A880 +FFE0 +ACA0 +FF40 +0540 +ABA0 +AD20 +ENDCHAR +STARTCHAR U_9C66 +ENCODING 40038 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AA0 +9FE0 +F280 +AEE0 +FAA0 +AEE0 +FAA0 +56E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C67 +ENCODING 40039 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +6FE0 +AAA0 +FFE0 +AAA0 +FFE0 +AA40 +FBC0 +5240 +A980 +AFE0 +ENDCHAR +STARTCHAR U_9C68 +ENCODING 40040 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4540 +6FE0 +AAA0 +FBA0 +AA80 +FB20 +ABE0 +FA40 +53C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C69 +ENCODING 40041 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +97E0 +FCA0 +AAC0 +FCA0 +ABE0 +FAA0 +03E0 +AAA0 +ABE0 +ENDCHAR +STARTCHAR U_9C6A +ENCODING 40042 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +F900 +AFE0 +F940 +AFE0 +FA40 +07C0 +AA40 +ABC0 +ENDCHAR +STARTCHAR U_9C6B +ENCODING 40043 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40E0 +7F20 +9540 +FFE0 +ACA0 +FBC0 +AD20 +FBC0 +0680 +A900 +AEE0 +ENDCHAR +STARTCHAR U_9C6C +ENCODING 40044 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7100 +AFE0 +F920 +AB80 +FD40 +AFE0 +F900 +0FE0 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9C6D +ENCODING 40045 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +92A0 +FD40 +AB60 +FD40 +A940 +FFC0 +5440 +A7C0 +A840 +ENDCHAR +STARTCHAR U_9C6E +ENCODING 40046 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4D60 +69A0 +AD60 +F9A0 +AAA0 +FEE0 +AAA0 +FFE0 +5280 +AC40 +A820 +ENDCHAR +STARTCHAR U_9C6F +ENCODING 40047 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FBE0 +AA80 +FFE0 +AA80 +FBE0 +0140 +A880 +AB60 +ENDCHAR +STARTCHAR U_9C70 +ENCODING 40048 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7CA0 +97E0 +F900 +AFE0 +F940 +AFE0 +FA40 +07C0 +AE40 +ABC0 +ENDCHAR +STARTCHAR U_9C71 +ENCODING 40049 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +6A80 +AFE0 +FA80 +AFC0 +F940 +AFE0 +F920 +59E0 +AF20 +A860 +ENDCHAR +STARTCHAR U_9C72 +ENCODING 40050 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7D40 +92A0 +F800 +ABE0 +FAA0 +ABE0 +FAC0 +03A0 +AAE0 +ABA0 +ENDCHAR +STARTCHAR U_9C73 +ENCODING 40051 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +6BC0 +AEA0 +FBE0 +AAC0 +FFE0 +A900 +FFE0 +5380 +AD40 +A920 +ENDCHAR +STARTCHAR U_9C74 +ENCODING 40052 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FFE0 +AAA0 +FFE0 +A8A0 +FFE0 +54C0 +AEA0 +A960 +ENDCHAR +STARTCHAR U_9C75 +ENCODING 40053 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +77E0 +9AA0 +FFE0 +A880 +FFA0 +A8A0 +FEA0 +5A40 +AEC0 +B120 +ENDCHAR +STARTCHAR U_9C76 +ENCODING 40054 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +77E0 +9100 +FBE0 +A900 +FFE0 +AA40 +FFE0 +0640 +ABC0 +AA60 +ENDCHAR +STARTCHAR U_9C77 +ENCODING 40055 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +93E0 +FAA0 +AFE0 +F880 +ABE0 +FAA0 +53E0 +A880 +AFE0 +ENDCHAR +STARTCHAR U_9C78 +ENCODING 40056 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +41E0 +7100 +97E0 +FD20 +AFE0 +FD40 +AFC0 +FD40 +57E0 +AAA0 +AFE0 +ENDCHAR +STARTCHAR U_9C79 +ENCODING 40057 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7940 +97E0 +FD20 +AFE0 +FA80 +AFE0 +FA80 +53E0 +AA80 +ABE0 +ENDCHAR +STARTCHAR U_9C7A +ENCODING 40058 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4EE0 +6000 +AFE0 +FAA0 +AFE0 +FAA0 +AFE0 +FCA0 +5FC0 +A4A0 +A7E0 +ENDCHAR +STARTCHAR U_9C7B +ENCODING 40059 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +1200 +3F80 +5480 +1FC0 +65A0 +A280 +FBE0 +AAA0 +FBE0 +A520 +ENDCHAR +STARTCHAR U_9C7C +ENCODING 40060 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F00 +2200 +7FC0 +A240 +3FC0 +2240 +3FC0 +2040 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9C7D +ENCODING 40061 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9120 +F920 +A920 +F920 +A920 +F920 +0220 +1AA0 +E440 +ENDCHAR +STARTCHAR U_9C7E +ENCODING 40062 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BC0 +9040 +F840 +ABC0 +FA00 +AA00 +FA00 +0220 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_9C7F +ENCODING 40063 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7920 +9100 +FFE0 +A900 +F900 +A980 +F980 +02A0 +34A0 +C860 +ENDCHAR +STARTCHAR U_9C80 +ENCODING 40064 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +AAA0 +FAA0 +ABE0 +F880 +00A0 +18A0 +E060 +ENDCHAR +STARTCHAR U_9C81 +ENCODING 40065 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +FFE0 +1080 +1F80 +1080 +1F80 +ENDCHAR +STARTCHAR U_9C82 +ENCODING 40066 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +F900 +A9E0 +F920 +A920 +F920 +0220 +3A20 +C4C0 +ENDCHAR +STARTCHAR U_9C83 +ENCODING 40067 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +92A0 +FAA0 +AAA0 +FBE0 +AA00 +FA00 +0220 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_9C84 +ENCODING 40068 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7BE0 +9040 +F840 +AF40 +FD40 +AF40 +F840 +0040 +3940 +C080 +ENDCHAR +STARTCHAR U_9C85 +ENCODING 40069 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A40 +9200 +FFE0 +AA00 +FBC0 +AA40 +FB40 +0480 +3940 +CA20 +ENDCHAR +STARTCHAR U_9C86 +ENCODING 40070 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7880 +94A0 +FAA0 +AAC0 +F880 +AFE0 +F880 +0080 +3880 +C080 +ENDCHAR +STARTCHAR U_9C87 +ENCODING 40071 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +90E0 +F880 +A880 +FBE0 +AA20 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C88 +ENCODING 40072 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +79E0 +9100 +FBE0 +AA20 +FA20 +ABE0 +FA00 +0200 +3400 +C800 +ENDCHAR +STARTCHAR U_9C89 +ENCODING 40073 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +9080 +FBE0 +AAA0 +FAA0 +ABE0 +FAA0 +02A0 +3AA0 +C3E0 +ENDCHAR +STARTCHAR U_9C8A +ENCODING 40074 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +93E0 +FD00 +A900 +F9E0 +A900 +F9E0 +0100 +1900 +E100 +ENDCHAR +STARTCHAR U_9C8B +ENCODING 40075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7940 +9240 +FBE0 +AE40 +FB40 +AAC0 +FA40 +0240 +3A40 +C2C0 +ENDCHAR +STARTCHAR U_9C8C +ENCODING 40076 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7900 +93E0 +FA20 +AA20 +FA20 +ABE0 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C8D +ENCODING 40077 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9420 +FBA0 +AAA0 +FAA0 +ABA0 +FA60 +0200 +1A20 +E1E0 +ENDCHAR +STARTCHAR U_9C8E +ENCODING 40078 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +1280 +FFE0 +9120 +3F80 +6480 +BF80 +2480 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9C8F +ENCODING 40079 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +FAA0 +AA80 +FBE0 +AA20 +FB40 +0280 +3AC0 +C520 +ENDCHAR +STARTCHAR U_9C90 +ENCODING 40080 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +9240 +FA20 +AFE0 +F800 +ABE0 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C91 +ENCODING 40081 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +93E0 +F880 +AFE0 +F880 +A880 +FBE0 +0080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_9C92 +ENCODING 40082 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7880 +97E0 +F880 +ABE0 +F800 +ABE0 +FA20 +0220 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9C93 +ENCODING 40083 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9140 +FFE0 +A900 +FBE0 +AD00 +F9E0 +0020 +38A0 +C040 +ENDCHAR +STARTCHAR U_9C94 +ENCODING 40084 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7900 +97E0 +FA00 +AFC0 +FA40 +ABC0 +FA40 +03C0 +3A40 +C2C0 +ENDCHAR +STARTCHAR U_9C95 +ENCODING 40085 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7900 +9200 +FFE0 +AAA0 +FAA0 +AAA0 +FAA0 +0AA0 +3AA0 +C860 +ENDCHAR +STARTCHAR U_9C96 +ENCODING 40086 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93A0 +FA20 +ABA0 +FAA0 +ABA0 +FA20 +0220 +3A20 +C260 +ENDCHAR +STARTCHAR U_9C97 +ENCODING 40087 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4020 +7FA0 +98A0 +FAA0 +AAA0 +FAA0 +AAA0 +FA20 +0220 +3520 +C860 +ENDCHAR +STARTCHAR U_9C98 +ENCODING 40088 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +7B00 +9400 +FC00 +AFE0 +FC00 +AFE0 +FE20 +0620 +3A20 +CBE0 +ENDCHAR +STARTCHAR U_9C99 +ENCODING 40089 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7980 +9240 +FC20 +ABC0 +F800 +AFE0 +F900 +0200 +1C40 +E7E0 +ENDCHAR +STARTCHAR U_9C9A +ENCODING 40090 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9240 +F980 +A980 +FE60 +AA40 +FA40 +0240 +3A40 +C440 +ENDCHAR +STARTCHAR U_9C9B +ENCODING 40091 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7880 +97E0 +FA40 +AC20 +FA40 +AA40 +F980 +0180 +1A40 +E420 +ENDCHAR +STARTCHAR U_9C9C +ENCODING 40092 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +7940 +97E0 +F880 +ABE0 +F880 +A880 +FFE0 +0080 +3880 +C080 +ENDCHAR +STARTCHAR U_9C9D +ENCODING 40093 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +3F00 +0800 +FFE0 +2900 +5200 +BF80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9C9E +ENCODING 40094 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FC0 +0800 +FFE0 +2A80 +52C0 +BFA0 +2480 +3F80 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9C9F +ENCODING 40095 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7820 +93E0 +F820 +ABE0 +F840 +AFE0 +FA40 +0140 +3840 +C0C0 +ENDCHAR +STARTCHAR U_9CA0 +ENCODING 40096 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7880 +93E0 +FAA0 +ABE0 +FAA0 +ABE0 +FA80 +0180 +3A40 +C420 +ENDCHAR +STARTCHAR U_9CA1 +ENCODING 40097 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7800 +93E0 +FAA0 +AAA0 +FBA0 +AAE0 +FAA0 +02A0 +3AA0 +C2A0 +ENDCHAR +STARTCHAR U_9CA2 +ENCODING 40098 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7DE0 +9280 +F940 +AFE0 +FA40 +ABE0 +FA40 +0240 +3B40 +C4E0 +ENDCHAR +STARTCHAR U_9CA3 +ENCODING 40099 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7AE0 +AAA0 +FAA0 +AA40 +FAA0 +A900 +F7C0 +0100 +3100 +CFE0 +ENDCHAR +STARTCHAR U_9CA4 +ENCODING 40100 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +92A0 +FBE0 +AAA0 +FBE0 +A880 +FBE0 +0080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_9CA5 +ENCODING 40101 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4040 +7E40 +9A40 +FBE0 +AE40 +FB40 +AAC0 +FA40 +0E40 +3040 +C0C0 +ENDCHAR +STARTCHAR U_9CA6 +ENCODING 40102 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9540 +F880 +AB60 +F880 +AFE0 +F880 +02C0 +3CA0 +C180 +ENDCHAR +STARTCHAR U_9CA7 +ENCODING 40103 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +7F80 +9100 +FA40 +AF80 +F940 +AFA0 +F880 +02C0 +34A0 +C9A0 +ENDCHAR +STARTCHAR U_9CA8 +ENCODING 40104 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A540 +5920 +2FC0 +D200 +7FC0 +2440 +7FC0 +2440 +3FC0 +0000 +FFE0 +ENDCHAR +STARTCHAR U_9CA9 +ENCODING 40105 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9420 +FBC0 +A800 +FFE0 +AA80 +FA80 +0280 +34A0 +C860 +ENDCHAR +STARTCHAR U_9CAA +ENCODING 40106 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FC0 +9140 +FFE0 +A940 +FFC0 +AA00 +FFC0 +0240 +1A40 +E3C0 +ENDCHAR +STARTCHAR U_9CAB +ENCODING 40107 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +6EE0 +AAA0 +FEA0 +AAA0 +FEA0 +A8A0 +FAA0 +0DE0 +3880 +C080 +ENDCHAR +STARTCHAR U_9CAC +ENCODING 40108 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7940 +9080 +FBE0 +AAA0 +FBE0 +AAA0 +FBE0 +02A0 +1AA0 +E260 +ENDCHAR +STARTCHAR U_9CAD +ENCODING 40109 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9100 +FFC0 +A900 +FFE0 +AA40 +FBC0 +0240 +3BC0 +C240 +ENDCHAR +STARTCHAR U_9CAE +ENCODING 40110 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FC0 +9100 +FFE0 +AA40 +FC20 +ABC0 +FE40 +0180 +3980 +C660 +ENDCHAR +STARTCHAR U_9CAF +ENCODING 40111 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FBC0 +AA40 +FBC0 +AA40 +FFE0 +0000 +3A40 +C420 +ENDCHAR +STARTCHAR U_9CB0 +ENCODING 40112 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F00 +6A00 +ABE0 +FEA0 +AAA0 +FAA0 +AEA0 +FA40 +0F40 +32A0 +C320 +ENDCHAR +STARTCHAR U_9CB1 +ENCODING 40113 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7A80 +96E0 +FA80 +AA80 +FEE0 +AA80 +FA80 +06E0 +3A80 +C280 +ENDCHAR +STARTCHAR U_9CB2 +ENCODING 40114 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7A20 +93E0 +FA20 +ABE0 +FA80 +AAA0 +FBC0 +02A0 +3BA0 +C2E0 +ENDCHAR +STARTCHAR U_9CB3 +ENCODING 40115 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FC20 +07E0 +3C20 +C7E0 +ENDCHAR +STARTCHAR U_9CB4 +ENCODING 40116 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +A920 +FFE0 +A920 +FBA0 +AAA0 +FAA0 +0BA0 +3820 +CFE0 +ENDCHAR +STARTCHAR U_9CB5 +ENCODING 40117 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7EE0 +9420 +FEE0 +AC20 +FFE0 +AA80 +FA80 +0480 +34A0 +C860 +ENDCHAR +STARTCHAR U_9CB6 +ENCODING 40118 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7940 +9320 +FC80 +ABE0 +F840 +A880 +FB40 +06A0 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_9CB7 +ENCODING 40119 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7920 +ABA0 +F920 +AFE0 +F820 +ABA0 +FAA0 +0BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_9CB8 +ENCODING 40120 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7FE0 +9000 +FBE0 +AA20 +FBE0 +A880 +FAC0 +02A0 +3CA0 +C180 +ENDCHAR +STARTCHAR U_9CB9 +ENCODING 40121 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7A40 +97C0 +F900 +AFE0 +FA40 +AD20 +FA80 +0140 +3880 +C700 +ENDCHAR +STARTCHAR U_9CBA +ENCODING 40122 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +7840 +97C0 +F940 +AFC0 +FD40 +AFC0 +F940 +0140 +39A0 +C620 +ENDCHAR +STARTCHAR U_9CBB +ENCODING 40123 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7AA0 +9540 +FD40 +AAA0 +F800 +AFE0 +FD20 +07E0 +3D20 +C7E0 +ENDCHAR +STARTCHAR U_9CBC +ENCODING 40124 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BE0 +9140 +FFE0 +A940 +FBE0 +AAA0 +FAA0 +02A0 +3940 +C620 +ENDCHAR +STARTCHAR U_9CBD +ENCODING 40125 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +42A0 +7FE0 +92A0 +FAE0 +AA00 +FBE0 +A880 +FFE0 +01C0 +3AA0 +C4A0 +ENDCHAR +STARTCHAR U_9CBE +ENCODING 40126 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7800 +93C0 +FA40 +ABC0 +F800 +AFE0 +FD20 +07E0 +1D20 +E7E0 +ENDCHAR +STARTCHAR U_9CBF +ENCODING 40127 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D20 +9340 +FFE0 +AC20 +FBC0 +A800 +FFE0 +0100 +1A40 +E7E0 +ENDCHAR +STARTCHAR U_9CC0 +ENCODING 40128 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +F900 +05C0 +3500 +CBE0 +ENDCHAR +STARTCHAR U_9CC1 +ENCODING 40129 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FAA0 +0AA0 +3AA0 +CFE0 +ENDCHAR +STARTCHAR U_9CC2 +ENCODING 40130 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +AFE0 +FAA0 +0240 +1B40 +E220 +ENDCHAR +STARTCHAR U_9CC3 +ENCODING 40131 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +7AA0 +93E0 +FAA0 +ABE0 +F800 +A900 +FAC0 +0620 +3A40 +C1C0 +ENDCHAR +STARTCHAR U_9CC4 +ENCODING 40132 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7DA0 +97E0 +F800 +ABC0 +F800 +AFE0 +F900 +03E0 +3820 +C1C0 +ENDCHAR +STARTCHAR U_9CC5 +ENCODING 40133 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +7E40 +9240 +FFE0 +AA40 +FF40 +AAC0 +FA40 +0240 +3AA0 +C320 +ENDCHAR +STARTCHAR U_9CC6 +ENCODING 40134 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +9640 +FBC0 +AA40 +FBC0 +AA00 +FBC0 +0640 +3980 +C660 +ENDCHAR +STARTCHAR U_9CC7 +ENCODING 40135 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FFE0 +A880 +FBE0 +0080 +3880 +C7E0 +ENDCHAR +STARTCHAR U_9CC8 +ENCODING 40136 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BE0 +9220 +FBE0 +AA20 +FBE0 +A880 +FEA0 +02C0 +3AA0 +C5A0 +ENDCHAR +STARTCHAR U_9CC9 +ENCODING 40137 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7AE0 +93A0 +FF40 +AAA0 +FBE0 +AE20 +FAA0 +02A0 +1A20 +E260 +ENDCHAR +STARTCHAR U_9CCA +ENCODING 40138 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +9820 +FFE0 +A800 +FFE0 +AAA0 +FFE0 +0AA0 +3AA0 +D060 +ENDCHAR +STARTCHAR U_9CCB +ENCODING 40139 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7D40 +9280 +F980 +AE60 +F900 +AFC0 +FD40 +07C0 +3120 +CFE0 +ENDCHAR +STARTCHAR U_9CCC +ENCODING 40140 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +21E0 +FA40 +2180 +7940 +8A20 +3F80 +6480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9CCD +ENCODING 40141 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4120 +7FA0 +9140 +FFE0 +AA40 +FEA0 +ABE0 +FA20 +03E0 +3A20 +C3E0 +ENDCHAR +STARTCHAR U_9CCE +ENCODING 40142 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +ABC0 +F800 +AFE0 +FDA0 +0360 +3DA0 +C360 +ENDCHAR +STARTCHAR U_9CCF +ENCODING 40143 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7AA0 +97E0 +F800 +A900 +FB40 +AD20 +FB40 +0520 +3920 +C100 +ENDCHAR +STARTCHAR U_9CD0 +ENCODING 40144 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40C0 +7F20 +9520 +FAC0 +AA00 +FBE0 +AC80 +FFE0 +0080 +3CA0 +C7E0 +ENDCHAR +STARTCHAR U_9CD1 +ENCODING 40145 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9240 +FFE0 +A920 +F880 +AFE0 +F900 +01E0 +3A20 +C460 +ENDCHAR +STARTCHAR U_9CD2 +ENCODING 40146 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FE0 +9280 +FFE0 +AAA0 +FFE0 +AAA0 +FFE0 +0280 +36C0 +CAA0 +ENDCHAR +STARTCHAR U_9CD3 +ENCODING 40147 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A80 +7F80 +AA80 +EFE0 +A4A0 +FFA0 +A4A0 +FFA0 +04A0 +3FA0 +C540 +ENDCHAR +STARTCHAR U_9CD4 +ENCODING 40148 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7280 +AFE0 +FAA0 +AFE0 +F800 +ABC0 +F800 +07E0 +3940 +CB20 +ENDCHAR +STARTCHAR U_9CD5 +ENCODING 40149 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7100 +9FE0 +F920 +ABA0 +FD40 +AFE0 +F820 +03E0 +3020 +C7E0 +ENDCHAR +STARTCHAR U_9CD6 +ENCODING 40150 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +69E0 +FF40 +B540 +EC80 +A560 +7F80 +A480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9CD7 +ENCODING 40151 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +7A40 +93C0 +FA40 +AFE0 +FAA0 +AFE0 +FC20 +0240 +3980 +C660 +ENDCHAR +STARTCHAR U_9CD8 +ENCODING 40152 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7DE0 +AB40 +FC80 +A940 +FE20 +7F80 +A480 +3F80 +2480 +FFE0 +ENDCHAR +STARTCHAR U_9CD9 +ENCODING 40153 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77E0 +9540 +FFE0 +AD40 +FFE0 +AD20 +FFE0 +0D20 +37E0 +D520 +ENDCHAR +STARTCHAR U_9CDA +ENCODING 40154 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4F20 +7920 +9F20 +F8E0 +AF20 +F8A0 +AF60 +FA20 +0F20 +3AA0 +D660 +ENDCHAR +STARTCHAR U_9CDB +ENCODING 40155 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +7DA0 +9360 +FDA0 +A920 +FA00 +AFE0 +FC20 +07E0 +1C20 +E7E0 +ENDCHAR +STARTCHAR U_9CDC +ENCODING 40156 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +7AC0 +9940 +FFE0 +A920 +F940 +AD40 +FFC0 +0940 +32A0 +C520 +ENDCHAR +STARTCHAR U_9CDD +ENCODING 40157 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9100 +FFE0 +A900 +FFE0 +AD40 +FFE0 +0440 +3C40 +C7C0 +ENDCHAR +STARTCHAR U_9CDE +ENCODING 40158 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7B40 +97E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +0BE0 +3240 +C440 +ENDCHAR +STARTCHAR U_9CDF +ENCODING 40159 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9280 +FFE0 +AAA0 +FCE0 +AFE0 +F840 +07E0 +1A40 +E1C0 +ENDCHAR +STARTCHAR U_9CE0 +ENCODING 40160 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7FE0 +9240 +FBE0 +AE40 +FBE0 +AA40 +FBE0 +0240 +1980 +E660 +ENDCHAR +STARTCHAR U_9CE1 +ENCODING 40161 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +40A0 +7FE0 +9480 +FF80 +ACA0 +FFA0 +AD40 +FAA0 +0540 +3A60 +CBC0 +ENDCHAR +STARTCHAR U_9CE2 +ENCODING 40162 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +7FE0 +9AA0 +FFE0 +AAA0 +FFE0 +AA40 +FBC0 +0440 +3280 +CFE0 +ENDCHAR +STARTCHAR U_9CE3 +ENCODING 40163 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FE0 +92A0 +FAA0 +ABA0 +F820 +AFE0 +FA40 +03C0 +3A40 +C7E0 +ENDCHAR +STARTCHAR U_9CE4 +ENCODING 40164 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +7BE0 +96C0 +F920 +AFE0 +FC20 +ABC0 +FA40 +03E0 +1A20 +E3E0 +ENDCHAR +STARTCHAR U_9CE5 +ENCODING 40165 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +2000 +3FE0 +5520 +4AA0 +8040 +ENDCHAR +STARTCHAR U_9CE6 +ENCODING 40166 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +8840 +F840 +8880 +FC80 +8100 +FD00 +0620 +AE20 +A9E0 +ENDCHAR +STARTCHAR U_9CE7 +ENCODING 40167 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3F80 +2080 +3FE0 +52A0 +9F40 +1100 +2120 +C0E0 +ENDCHAR +STARTCHAR U_9CE8 +ENCODING 40168 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4900 +7BE0 +4920 +7D20 +4120 +7D20 +0520 +D6A0 +AA40 +ENDCHAR +STARTCHAR U_9CE9 +ENCODING 40169 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +57C0 +5440 +57E0 +5400 +5FE0 +5560 +8AA0 +0040 +ENDCHAR +STARTCHAR U_9CEA +ENCODING 40170 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +8200 +8F80 +8880 +CF80 +A880 +8FC0 +8800 +8FC0 +9540 +AAC0 +8080 +ENDCHAR +STARTCHAR U_9CEB +ENCODING 40171 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2200 +2FC0 +2840 +2FC0 +2840 +2FE0 +2800 +4FE0 +4AA0 +9560 +ENDCHAR +STARTCHAR U_9CEC +ENCODING 40172 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +7F00 +4100 +7F80 +4000 +7F80 +2480 +2440 +C3C0 +ENDCHAR +STARTCHAR U_9CED +ENCODING 40173 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +4A40 +4BC0 +4A40 +4BE0 +4A00 +4BE0 +4AA0 +6D60 +9040 +ENDCHAR +STARTCHAR U_9CEE +ENCODING 40174 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +F7C0 +1440 +97C0 +5440 +27E0 +2400 +57E0 +9020 +0AA0 +0D40 +ENDCHAR +STARTCHAR U_9CEF +ENCODING 40175 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4840 +5E40 +5240 +5E40 +5240 +5F40 +5040 +5F40 +5560 +AB20 +ENDCHAR +STARTCHAR U_9CF0 +ENCODING 40176 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +47C0 +2440 +27C0 +2440 +57E0 +5400 +4FE0 +8820 +82A0 +0540 +ENDCHAR +STARTCHAR U_9CF1 +ENCODING 40177 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2440 +27C0 +FC40 +27E0 +2400 +27E0 +2AA0 +2DA0 +2040 +ENDCHAR +STARTCHAR U_9CF2 +ENCODING 40178 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +4BC0 +7A40 +43E0 +4200 +43E0 +42A0 +8560 +8040 +ENDCHAR +STARTCHAR U_9CF3 +ENCODING 40179 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FF80 +8880 +BE80 +A280 +BE80 +A280 +BF80 +A0A0 +BFA0 +D560 +AB20 +ENDCHAR +STARTCHAR U_9CF4 +ENCODING 40180 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +97C0 +9440 +97E0 +F400 +07E0 +0AA0 +1560 +0040 +ENDCHAR +STARTCHAR U_9CF5 +ENCODING 40181 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +53C0 +5240 +53C0 +F240 +53E0 +5600 +53E0 +52A0 +4D60 +4840 +ENDCHAR +STARTCHAR U_9CF6 +ENCODING 40182 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0400 +0A20 +3FE0 +2100 +3F00 +2100 +3FC0 +5540 +8AC0 +ENDCHAR +STARTCHAR U_9CF7 +ENCODING 40183 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1240 +13C0 +FE40 +4BE0 +4A00 +2BE0 +12A0 +2D60 +C540 +ENDCHAR +STARTCHAR U_9CF8 +ENCODING 40184 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4020 +7FE0 +4400 +5FC0 +5240 +5FE0 +5000 +9FE0 +AAA0 +ENDCHAR +STARTCHAR U_9CF9 +ENCODING 40185 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +8BC0 +2640 +13E0 +FA00 +0BE0 +12A0 +1560 +2040 +ENDCHAR +STARTCHAR U_9CFA +ENCODING 40186 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +2240 +FFE0 +2200 +33E0 +2AA0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9CFB +ENCODING 40187 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +4A40 +8BC0 +0640 +FBE0 +2A00 +2BE0 +2AA0 +6D60 +9040 +ENDCHAR +STARTCHAR U_9CFC +ENCODING 40188 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FE40 +0BC0 +4A40 +2BE0 +1200 +13E0 +2AA0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9CFD +ENCODING 40189 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +5240 +53C0 +5240 +FBE0 +5200 +53E0 +5AA0 +5560 +9040 +ENDCHAR +STARTCHAR U_9CFE +ENCODING 40190 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +FBC0 +AA40 +ABE0 +AA00 +ABE0 +B820 +26A0 +2540 +ENDCHAR +STARTCHAR U_9CFF +ENCODING 40191 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +23C0 +2240 +FBE0 +2200 +23E0 +3AA0 +C560 +0040 +ENDCHAR +STARTCHAR U_9D00 +ENCODING 40192 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFC0 +1440 +27C0 +2440 +77E0 +6C00 +A7E0 +2520 +2AA0 +2040 +ENDCHAR +STARTCHAR U_9D01 +ENCODING 40193 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +2240 +23C0 +FA40 +23E0 +2200 +53E0 +4820 +82A0 +0540 +ENDCHAR +STARTCHAR U_9D02 +ENCODING 40194 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +2BC0 +2A40 +FFE0 +2200 +33E0 +4820 +46A0 +8540 +ENDCHAR +STARTCHAR U_9D03 +ENCODING 40195 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F100 +93C0 +F140 +9140 +FFE0 +8100 +F900 +5A80 +AA40 +9420 +ENDCHAR +STARTCHAR U_9D04 +ENCODING 40196 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +AA40 +ABC0 +AA40 +ABE0 +AA00 +CFE0 +82A0 +FD60 +0040 +ENDCHAR +STARTCHAR U_9D05 +ENCODING 40197 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +5BC0 +4A40 +FFE0 +4A00 +4BE0 +4AA0 +4D60 +9840 +ENDCHAR +STARTCHAR U_9D06 +ENCODING 40198 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +ABC0 +2240 +33E0 +3200 +37E0 +3AA0 +5560 +8040 +ENDCHAR +STARTCHAR U_9D07 +ENCODING 40199 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +53C0 +6240 +4BC0 +7A40 +23E0 +FA00 +23E0 +22A0 +2560 +2040 +ENDCHAR +STARTCHAR U_9D08 +ENCODING 40200 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +4BC0 +5240 +53C0 +7240 +53E0 +5200 +53E0 +92A0 +9560 +ENDCHAR +STARTCHAR U_9D09 +ENCODING 40201 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +5240 +93C0 +FE40 +33E0 +3200 +53E0 +92A0 +5560 +2040 +ENDCHAR +STARTCHAR U_9D0A +ENCODING 40202 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FC0 +1440 +57C0 +5C40 +57E0 +5400 +57E0 +5820 +E6A0 +0540 +ENDCHAR +STARTCHAR U_9D0B +ENCODING 40203 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +FC40 +47C0 +7440 +57E0 +5400 +57E0 +5020 +9AA0 +3540 +ENDCHAR +STARTCHAR U_9D0C +ENCODING 40204 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +2880 +FFE0 +2880 +2480 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_9D0D +ENCODING 40205 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1100 +0E00 +F1E0 +0800 +3F80 +2480 +2280 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D0E +ENCODING 40206 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +8A40 +CBC0 +B240 +93E0 +AA00 +CBE0 +F820 +06A0 +0540 +ENDCHAR +STARTCHAR U_9D0F +ENCODING 40207 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22C0 +7AA0 +4A80 +7FE0 +4A80 +7E80 +4280 +7AA0 +0AA0 +AA60 +5A20 +ENDCHAR +STARTCHAR U_9D10 +ENCODING 40208 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7DE0 +2520 +49E0 +BF80 +2080 +3F80 +2080 +3FE0 +5520 +92A0 +ENDCHAR +STARTCHAR U_9D11 +ENCODING 40209 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FBC0 +5240 +3180 +CA60 +3F80 +2480 +3FE0 +2000 +3FE0 +D560 +ENDCHAR +STARTCHAR U_9D12 +ENCODING 40210 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +4BC0 +A640 +13E0 +FE00 +0BE0 +52A0 +2560 +1040 +ENDCHAR +STARTCHAR U_9D13 +ENCODING 40211 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2BC0 +4A40 +4BC0 +5240 +D7E0 +E600 +63E0 +4820 +BAA0 +0560 +ENDCHAR +STARTCHAR U_9D14 +ENCODING 40212 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +F3C0 +2240 +13C0 +FA40 +0BE0 +1200 +23E0 +4020 +A2A0 +1D60 +ENDCHAR +STARTCHAR U_9D15 +ENCODING 40213 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +4A20 +7800 +4900 +7D20 +4140 +7D80 +5520 +AD20 +08E0 +ENDCHAR +STARTCHAR U_9D16 +ENCODING 40214 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +8A40 +FBC0 +A240 +FBE0 +A200 +A3E0 +A820 +DAA0 +8D40 +ENDCHAR +STARTCHAR U_9D17 +ENCODING 40215 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +03C0 +4A40 +4BE0 +3200 +23E0 +1AA0 +E560 +0060 +ENDCHAR +STARTCHAR U_9D18 +ENCODING 40216 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +4A40 +FFC0 +5240 +53E0 +FE00 +53E0 +52A0 +5560 +9040 +ENDCHAR +STARTCHAR U_9D19 +ENCODING 40217 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +7A40 +A3C0 +2240 +FBE0 +2200 +23E0 +32A0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9D1A +ENCODING 40218 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +7BE0 +4820 +7BA0 +4AA0 +7EA0 +43A0 +7C20 +0420 +D420 +AC60 +ENDCHAR +STARTCHAR U_9D1B +ENCODING 40219 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +D2A0 +2A60 +7F80 +A080 +3F80 +2080 +3FE0 +5520 +8AC0 +ENDCHAR +STARTCHAR U_9D1C +ENCODING 40220 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5BC0 +5220 +F9E0 +0800 +3F80 +2480 +3FC0 +2000 +3FC0 +5540 +ENDCHAR +STARTCHAR U_9D1D +ENCODING 40221 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +43C0 +FA40 +0BC0 +EA40 +ABE0 +AA00 +EBE0 +0AA0 +2D60 +1040 +ENDCHAR +STARTCHAR U_9D1E +ENCODING 40222 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +93C0 +9240 +F3C0 +0240 +FBE0 +4200 +73E0 +12A0 +5560 +2040 +ENDCHAR +STARTCHAR U_9D1F +ENCODING 40223 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +F3C0 +9240 +93C0 +FE40 +93E0 +9200 +93E0 +AAA0 +ED60 +9440 +ENDCHAR +STARTCHAR U_9D20 +ENCODING 40224 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +4BC0 +7A40 +4BE0 +7A00 +03E0 +1AA0 +E560 +0040 +ENDCHAR +STARTCHAR U_9D21 +ENCODING 40225 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +4A00 +4BE0 +5C20 +E2A0 +0560 +ENDCHAR +STARTCHAR U_9D22 +ENCODING 40226 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57C0 +7C40 +97C0 +B440 +F7E0 +5400 +97E0 +F420 +26A0 +4D60 +ENDCHAR +STARTCHAR U_9D23 +ENCODING 40227 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +FA40 +23C0 +2240 +FBE0 +8A00 +8BE0 +FAA0 +0560 +0060 +ENDCHAR +STARTCHAR U_9D24 +ENCODING 40228 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +4A20 +7D40 +4880 +7D40 +4220 +7C80 +0440 +5480 +AC40 +ENDCHAR +STARTCHAR U_9D25 +ENCODING 40229 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +FBE0 +8A20 +F800 +8940 +FD40 +8140 +F940 +5A20 +AA20 +1C20 +ENDCHAR +STARTCHAR U_9D26 +ENCODING 40230 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2880 +7FC0 +A0A0 +3F80 +2080 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_9D27 +ENCODING 40231 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +03C0 +7240 +53E0 +5200 +57E0 +5820 +92A0 +0560 +ENDCHAR +STARTCHAR U_9D28 +ENCODING 40232 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AA40 +FBC0 +AA40 +FBE0 +2200 +23E0 +22A0 +2560 +2040 +ENDCHAR +STARTCHAR U_9D29 +ENCODING 40233 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A3C0 +A240 +FBC0 +2240 +23E0 +FE00 +23E0 +32A0 +4D60 +8040 +ENDCHAR +STARTCHAR U_9D2A +ENCODING 40234 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +8BC0 +0240 +53E0 +4A00 +4BE0 +8020 +8AA0 +0540 +ENDCHAR +STARTCHAR U_9D2B +ENCODING 40235 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AA40 +ABC0 +FA40 +ABE0 +AA00 +FBE0 +0020 +06A0 +0540 +ENDCHAR +STARTCHAR U_9D2C +ENCODING 40236 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2500 +FFE0 +8840 +3F80 +2480 +3FC0 +2000 +3FC0 +5540 +8AC0 +ENDCHAR +STARTCHAR U_9D2D +ENCODING 40237 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7C0 +9440 +97C0 +F440 +87E0 +F400 +97E0 +9020 +FAA0 +0540 +ENDCHAR +STARTCHAR U_9D2E +ENCODING 40238 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4A40 +FFC0 +0240 +FFE0 +2200 +7BE0 +0AA0 +2D60 +1040 +ENDCHAR +STARTCHAR U_9D2F +ENCODING 40239 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +2240 +FFC0 +AA40 +ABE0 +AA00 +ABE0 +AAA0 +AD60 +9840 +ENDCHAR +STARTCHAR U_9D30 +ENCODING 40240 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E3C0 +2240 +FFC0 +2240 +23E0 +FA00 +8BE0 +8AA0 +FD60 +8840 +ENDCHAR +STARTCHAR U_9D31 +ENCODING 40241 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFC0 +2A40 +03C0 +0240 +4BE0 +2A00 +13E0 +2AA0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D32 +ENCODING 40242 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +B7C0 +C440 +97C0 +7440 +07E0 +F400 +97E0 +F020 +92A0 +F540 +ENDCHAR +STARTCHAR U_9D33 +ENCODING 40243 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +ABC0 +2240 +FBE0 +4A00 +4BE0 +32A0 +2D60 +C040 +ENDCHAR +STARTCHAR U_9D34 +ENCODING 40244 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5BC0 +8240 +7FC0 +4A40 +CBE0 +4A00 +4BE0 +4820 +6AA0 +5540 +ENDCHAR +STARTCHAR U_9D35 +ENCODING 40245 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2BC0 +AE40 +6BC0 +2A40 +6FE0 +AA00 +2BE0 +2820 +4EA0 +8540 +ENDCHAR +STARTCHAR U_9D36 +ENCODING 40246 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +FE40 +13C0 +7E40 +03E0 +7A00 +4BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D37 +ENCODING 40247 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC40 +2140 +3D40 +C940 +3440 +FFC0 +2080 +3F80 +2080 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9D38 +ENCODING 40248 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53C0 +7A40 +93C0 +1240 +FFE0 +1200 +3BE0 +56A0 +9560 +1040 +ENDCHAR +STARTCHAR U_9D39 +ENCODING 40249 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FBC0 +2240 +7BC0 +2240 +FBE0 +2200 +23E0 +42A0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D3A +ENCODING 40250 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2240 +FBC0 +2A40 +FBE0 +A200 +FBE0 +2820 +52A0 +8D60 +ENDCHAR +STARTCHAR U_9D3B +ENCODING 40251 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5FC0 +0A40 +ABC0 +6A40 +2BE0 +2E00 +DBE0 +42A0 +4560 +4040 +ENDCHAR +STARTCHAR U_9D3C +ENCODING 40252 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79C0 +4E40 +7980 +4A40 +7C20 +43C0 +7A40 +0A40 +AA40 +5BC0 +ENDCHAR +STARTCHAR U_9D3D +ENCODING 40253 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFC0 +4A40 +33C0 +CC00 +3F80 +2080 +3F80 +2080 +3FE0 +CAA0 +ENDCHAR +STARTCHAR U_9D3E +ENCODING 40254 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +FE40 +13C0 +5240 +7FE0 +9200 +FFE0 +12A0 +1560 +1040 +ENDCHAR +STARTCHAR U_9D3F +ENCODING 40255 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +23C0 +5240 +8BC0 +7240 +03E0 +7A00 +4BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D40 +ENCODING 40256 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FC0 +4200 +DFE0 +4200 +4FC0 +1000 +3F80 +2480 +2280 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9D41 +ENCODING 40257 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +2BC0 +4640 +ABE0 +2A00 +13E0 +2AA0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D42 +ENCODING 40258 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +2BC0 +4A40 +5FC0 +CA40 +4FE0 +5A00 +6BE0 +4AA0 +4D60 +4D40 +ENDCHAR +STARTCHAR U_9D43 +ENCODING 40259 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7BC0 +4A40 +6BC0 +5A40 +FBE0 +4A00 +6BE0 +5AA0 +4D60 +5D40 +ENDCHAR +STARTCHAR U_9D44 +ENCODING 40260 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +53C0 +FA40 +23E0 +FA00 +23E0 +3820 +C6A0 +0540 +ENDCHAR +STARTCHAR U_9D45 +ENCODING 40261 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +4A40 +ABC0 +3240 +4BE0 +FA00 +4BE0 +4AA0 +7D60 +4D40 +ENDCHAR +STARTCHAR U_9D46 +ENCODING 40262 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +2EC0 +4A00 +AFE0 +2A40 +4F40 +C840 +4F40 +4140 +5540 +6BC0 +ENDCHAR +STARTCHAR U_9D47 +ENCODING 40263 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +5240 +93C0 +7A40 +53E0 +5200 +FBE0 +1020 +12A0 +1540 +ENDCHAR +STARTCHAR U_9D48 +ENCODING 40264 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFC0 +4A40 +7BC0 +4A40 +7BE0 +4A00 +4FE0 +F820 +0AA0 +0D40 +ENDCHAR +STARTCHAR U_9D49 +ENCODING 40265 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +5280 +9A40 +7F80 +4480 +7FC0 +4000 +7FC0 +AA40 +9540 +ENDCHAR +STARTCHAR U_9D4A +ENCODING 40266 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1240 +57C0 +5A40 +B7E0 +1200 +13E0 +2AA0 +4560 +8040 +ENDCHAR +STARTCHAR U_9D4B +ENCODING 40267 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +0A40 +7BC0 +4640 +7FE0 +1200 +2BE0 +6420 +AAA0 +1D40 +ENDCHAR +STARTCHAR U_9D4C +ENCODING 40268 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +F940 +8A20 +FDC0 +8880 +FFE0 +8080 +FDC0 +56A0 +ACA0 +A980 +ENDCHAR +STARTCHAR U_9D4D +ENCODING 40269 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +73C0 +0240 +FFE0 +5200 +53E0 +5820 +5560 +82A0 +ENDCHAR +STARTCHAR U_9D4E +ENCODING 40270 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +E7C0 +AA40 +53C0 +1240 +FFE0 +2A00 +6BE0 +1020 +2D60 +C2A0 +ENDCHAR +STARTCHAR U_9D4F +ENCODING 40271 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +2BC0 +FA40 +23C0 +FA40 +ABE0 +FA00 +ABE0 +FAA0 +AD60 +B940 +ENDCHAR +STARTCHAR U_9D50 +ENCODING 40272 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +6BC0 +6A40 +6BE0 +B600 +23E0 +3820 +E560 +02A0 +ENDCHAR +STARTCHAR U_9D51 +ENCODING 40273 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +03C0 +FA40 +8BE0 +FA00 +8BE0 +FAA0 +8D60 +9840 +ENDCHAR +STARTCHAR U_9D52 +ENCODING 40274 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +8640 +23C0 +4A40 +87E0 +7A00 +4BE0 +4AA0 +7D60 +4D40 +ENDCHAR +STARTCHAR U_9D53 +ENCODING 40275 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FBC0 +8A40 +FBE0 +1200 +23E0 +FAA0 +2560 +6060 +ENDCHAR +STARTCHAR U_9D54 +ENCODING 40276 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7A40 +4FA0 +7940 +4A20 +7D00 +43C0 +7D40 +5480 +AD40 +AA20 +ENDCHAR +STARTCHAR U_9D55 +ENCODING 40277 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +FE40 +4BC0 +A640 +7BE0 +4A00 +ABE0 +1020 +2D60 +CAA0 +ENDCHAR +STARTCHAR U_9D56 +ENCODING 40278 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +F7C0 +9440 +F7E0 +8400 +A7E0 +B2A0 +D5A0 +8060 +ENDCHAR +STARTCHAR U_9D57 +ENCODING 40279 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +33C0 +4A40 +23C0 +FE40 +53E0 +7E00 +D7E0 +5420 +5EA0 +1560 +ENDCHAR +STARTCHAR U_9D58 +ENCODING 40280 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +2BC0 +FE40 +2BC0 +7A40 +23E0 +7A00 +CBE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D59 +ENCODING 40281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +4A40 +7BC0 +4A40 +7BE0 +4A00 +7BE0 +22A0 +5560 +8D40 +ENDCHAR +STARTCHAR U_9D5A +ENCODING 40282 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13C0 +FE40 +33C0 +5A40 +97E0 +7A00 +4BE0 +4AA0 +4D60 +8540 +ENDCHAR +STARTCHAR U_9D5B +ENCODING 40283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +57C0 +AA40 +ABC0 +5640 +03E0 +FA00 +23E0 +22A0 +3D60 +C040 +ENDCHAR +STARTCHAR U_9D5C +ENCODING 40284 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +53C0 +FA40 +2BC0 +FA40 +A3E0 +FA00 +2BE0 +6AA0 +BD60 +2540 +ENDCHAR +STARTCHAR U_9D5D +ENCODING 40285 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +DBC0 +5640 +FFC0 +5240 +73E0 +D600 +5BE0 +52A0 +6D60 +C540 +ENDCHAR +STARTCHAR U_9D5E +ENCODING 40286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7A80 +1240 +FFE0 +1140 +F4A0 +3FA0 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D5F +ENCODING 40287 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +57E0 +3100 +5FC0 +3100 +D5E0 +3F80 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9D60 +ENCODING 40288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +7A40 +93C0 +FE40 +03E0 +7A00 +4BE0 +4AA0 +7D60 +0040 +ENDCHAR +STARTCHAR U_9D61 +ENCODING 40289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +EFC0 +0A40 +FFC0 +2A40 +2BE0 +BA00 +ABE0 +AAA0 +A560 +F540 +ENDCHAR +STARTCHAR U_9D62 +ENCODING 40290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7FE0 +4A00 +FBE0 +2820 +CD60 +1AA0 +ENDCHAR +STARTCHAR U_9D63 +ENCODING 40291 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +1240 +7FC0 +5640 +7FE0 +1200 +3BE0 +5420 +9560 +12A0 +ENDCHAR +STARTCHAR U_9D64 +ENCODING 40292 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +A820 +AD60 +9AA0 +ENDCHAR +STARTCHAR U_9D65 +ENCODING 40293 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5420 +FEA0 +10A0 +FE20 +2860 +7F80 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D66 +ENCODING 40294 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4780 +F080 +9780 +F080 +9FE0 +F100 +8540 +FB80 +0D40 +D920 +AB00 +ENDCHAR +STARTCHAR U_9D67 +ENCODING 40295 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +53C0 +FE40 +53C0 +5240 +FFE0 +5200 +53E0 +52A0 +5560 +9040 +ENDCHAR +STARTCHAR U_9D68 +ENCODING 40296 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4BC0 +8640 +7BC0 +1240 +FFE0 +1200 +7BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D69 +ENCODING 40297 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +AA40 +FBC0 +A240 +BFE0 +E600 +BBE0 +AAA0 +B560 +A440 +ENDCHAR +STARTCHAR U_9D6A +ENCODING 40298 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +2A40 +47C0 +FA40 +ABE0 +FA00 +ABE0 +FAA0 +2D60 +3040 +ENDCHAR +STARTCHAR U_9D6B +ENCODING 40299 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +2240 +FBC0 +8A40 +FBE0 +8A00 +FBE0 +22A0 +FD60 +2040 +ENDCHAR +STARTCHAR U_9D6C +ENCODING 40300 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +AA40 +FBC0 +AA40 +FBE0 +AA00 +ABE0 +AAA0 +AD60 +5840 +ENDCHAR +STARTCHAR U_9D6D +ENCODING 40301 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +2A40 +7FC0 +9240 +7FE0 +1600 +5BE0 +3020 +1D60 +E2A0 +ENDCHAR +STARTCHAR U_9D6E +ENCODING 40302 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +9240 +43C0 +9A40 +8BE0 +DA00 +8BE0 +8820 +FD60 +02A0 +ENDCHAR +STARTCHAR U_9D6F +ENCODING 40303 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +AA40 +FBC0 +AA40 +FBE0 +2200 +53E0 +FEA0 +1560 +1040 +ENDCHAR +STARTCHAR U_9D70 +ENCODING 40304 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +8BE0 +BA00 +ABE0 +BAA0 +8D60 +9840 +ENDCHAR +STARTCHAR U_9D71 +ENCODING 40305 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1240 +FFC0 +2A40 +47E0 +9200 +7BE0 +12A0 +1D60 +E040 +ENDCHAR +STARTCHAR U_9D72 +ENCODING 40306 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5240 +FFC0 +0240 +7BE0 +4A00 +7BE0 +4AA0 +7D60 +4840 +ENDCHAR +STARTCHAR U_9D73 +ENCODING 40307 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +FBC0 +8240 +BBE0 +AA00 +BBE0 +AAA0 +BD60 +A840 +ENDCHAR +STARTCHAR U_9D74 +ENCODING 40308 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +AA40 +7BC0 +2A40 +FBE0 +2A00 +7BE0 +AAA0 +2D60 +1040 +ENDCHAR +STARTCHAR U_9D75 +ENCODING 40309 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +9240 +FBC0 +AA40 +FBE0 +3200 +3BE0 +36A0 +5D60 +9040 +ENDCHAR +STARTCHAR U_9D76 +ENCODING 40310 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +5240 +53C0 +DA40 +8BE0 +DA00 +53E0 +5820 +E560 +02A0 +ENDCHAR +STARTCHAR U_9D77 +ENCODING 40311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +8640 +43C0 +7E40 +97E0 +5600 +3FE0 +32A0 +5D60 +9040 +ENDCHAR +STARTCHAR U_9D78 +ENCODING 40312 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +3240 +4BC0 +FE40 +0BE0 +EA00 +ABE0 +EAA0 +0D60 +1840 +ENDCHAR +STARTCHAR U_9D79 +ENCODING 40313 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +21E0 +FEA0 +6920 +BFC0 +2080 +3F80 +2080 +3FE0 +5520 +94C0 +ENDCHAR +STARTCHAR U_9D7A +ENCODING 40314 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +13C0 +FE40 +53C0 +5E40 +67E0 +DE00 +4BE0 +5420 +6560 +42A0 +ENDCHAR +STARTCHAR U_9D7B +ENCODING 40315 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +7940 +49E0 +7B40 +49E0 +7D40 +4140 +7DE0 +5540 +AD40 +A9E0 +ENDCHAR +STARTCHAR U_9D7C +ENCODING 40316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +23C0 +FA40 +8BC0 +5240 +8BE0 +7200 +23E0 +2820 +3560 +E2A0 +ENDCHAR +STARTCHAR U_9D7D +ENCODING 40317 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +A7C0 +5640 +ABC0 +9640 +03E0 +FE00 +27E0 +B820 +4AA0 +B560 +ENDCHAR +STARTCHAR U_9D7E +ENCODING 40318 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8BC0 +FA40 +93E0 +FE00 +93E0 +B020 +DD60 +92A0 +ENDCHAR +STARTCHAR U_9D7F +ENCODING 40319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +7A20 +4BE0 +7A20 +4BE0 +7F40 +4140 +7FE0 +5540 +AD40 +AA40 +ENDCHAR +STARTCHAR U_9D80 +ENCODING 40320 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +F240 +97E0 +F240 +93C0 +FA40 +83C0 +FA40 +0FE0 +AA40 +5C20 +ENDCHAR +STARTCHAR U_9D81 +ENCODING 40321 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +0240 +73C0 +5240 +73E0 +2200 +73E0 +AAA0 +2560 +6040 +ENDCHAR +STARTCHAR U_9D82 +ENCODING 40322 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +DBC0 +8A40 +8BC0 +DA40 +8BE0 +FA00 +53E0 +5560 +5AA0 +92C0 +ENDCHAR +STARTCHAR U_9D83 +ENCODING 40323 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F660 +9420 +F6E0 +9420 +F7E0 +8280 +FA80 +0AA0 +DAA0 +AC60 +ENDCHAR +STARTCHAR U_9D84 +ENCODING 40324 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +23C0 +FA40 +23C0 +FE40 +4BE0 +7A00 +4BE0 +7D60 +4AA0 +5840 +ENDCHAR +STARTCHAR U_9D85 +ENCODING 40325 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +57C0 +AA40 +ABC0 +5640 +03E0 +FA00 +ABE0 +F960 +AAA0 +F840 +ENDCHAR +STARTCHAR U_9D86 +ENCODING 40326 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFC0 +1240 +57C0 +5A40 +B7E0 +1200 +3BE0 +5560 +92A0 +1060 +ENDCHAR +STARTCHAR U_9D87 +ENCODING 40327 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +2240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +2160 +72A0 +AAC0 +ENDCHAR +STARTCHAR U_9D88 +ENCODING 40328 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +2A40 +FFC0 +2A40 +FBE0 +2A00 +FFE0 +5160 +32A0 +CAC0 +ENDCHAR +STARTCHAR U_9D89 +ENCODING 40329 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +4A40 +7BC0 +0240 +7BE0 +0A00 +13E0 +FAA0 +1560 +7540 +ENDCHAR +STARTCHAR U_9D8A +ENCODING 40330 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +A240 +FBC0 +AE40 +FBE0 +AA00 +FBE0 +A2A0 +B560 +CD40 +ENDCHAR +STARTCHAR U_9D8B +ENCODING 40331 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BC0 +FA40 +93C0 +FE40 +93E0 +9200 +BBE0 +AAA0 +AD60 +B860 +ENDCHAR +STARTCHAR U_9D8C +ENCODING 40332 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +8BC0 +FA40 +A3C0 +AA40 +ABE0 +FA00 +A3E0 +AAA0 +AD60 +F840 +ENDCHAR +STARTCHAR U_9D8D +ENCODING 40333 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8BC0 +FA40 +43E0 +FA00 +5BE0 +A820 +4D60 +12A0 +ENDCHAR +STARTCHAR U_9D8E +ENCODING 40334 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +73C0 +0240 +FFE0 +2200 +73E0 +A820 +2D60 +62A0 +ENDCHAR +STARTCHAR U_9D8F +ENCODING 40335 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +EBC0 +AA40 +53C0 +FA40 +23E0 +FE00 +23E0 +2020 +5560 +8AA0 +ENDCHAR +STARTCHAR U_9D90 +ENCODING 40336 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8C80 +4BC0 +3F40 +09C0 +C940 +5FE0 +6B00 +49E0 +4820 +4AA0 +BD40 +ENDCHAR +STARTCHAR U_9D91 +ENCODING 40337 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +14A0 +5AC0 +5280 +2940 +C620 +3F80 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9D92 +ENCODING 40338 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BC0 +FE40 +2BC0 +FA40 +ABE0 +FA00 +2BE0 +7AA0 +AB60 +3660 +ENDCHAR +STARTCHAR U_9D93 +ENCODING 40339 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +53C0 +FA40 +ABE0 +AA00 +FBE0 +A820 +AD60 +FAA0 +ENDCHAR +STARTCHAR U_9D94 +ENCODING 40340 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +2BC0 +FE40 +37C0 +5240 +B3E0 +1200 +FFE0 +3AA0 +5560 +9260 +ENDCHAR +STARTCHAR U_9D95 +ENCODING 40341 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +4640 +2BC0 +FE40 +03E0 +7A00 +4BE0 +7820 +4D60 +7AA0 +ENDCHAR +STARTCHAR U_9D96 +ENCODING 40342 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7100 +2540 +FD80 +7280 +AC60 +3F80 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9D97 +ENCODING 40343 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +7A40 +03E0 +FA00 +A3E0 +BAA0 +E540 +BFE0 +ENDCHAR +STARTCHAR U_9D98 +ENCODING 40344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5C80 +55C0 +F540 +5DC0 +5540 +F5E0 +9500 +9DE0 +F560 +16A0 +2C60 +ENDCHAR +STARTCHAR U_9D99 +ENCODING 40345 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +5240 +FFC0 +A640 +FBE0 +AA00 +ABE0 +AAA0 +BD60 +2060 +ENDCHAR +STARTCHAR U_9D9A +ENCODING 40346 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABC0 +FA40 +03C0 +FA40 +03E0 +FE00 +23E0 +7AA0 +0D60 +3040 +ENDCHAR +STARTCHAR U_9D9B +ENCODING 40347 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +9480 +FBC0 +9240 +DFC0 +2240 +FBE0 +8A00 +FBE0 +8AA0 +FD60 +0040 +ENDCHAR +STARTCHAR U_9D9C +ENCODING 40348 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +FFC0 +2A40 +FFC0 +2A40 +13E0 +FE00 +37E0 +52A0 +95A0 +3060 +ENDCHAR +STARTCHAR U_9D9D +ENCODING 40349 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +03C0 +7A40 +4BC0 +7A40 +03E0 +FA00 +ABE0 +FAA0 +AD60 +F940 +ENDCHAR +STARTCHAR U_9D9E +ENCODING 40350 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +93C0 +FA40 +93C0 +BA40 +ABE0 +BA00 +ABE0 +BAA0 +AD60 +B840 +ENDCHAR +STARTCHAR U_9D9F +ENCODING 40351 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +8640 +2BC0 +4640 +ABE0 +2600 +FFE0 +22A0 +5560 +8D20 +ENDCHAR +STARTCHAR U_9DA0 +ENCODING 40352 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +BA40 +ABC0 +BA40 +93E0 +FE00 +ABE0 +9AA0 +A560 +FD20 +ENDCHAR +STARTCHAR U_9DA1 +ENCODING 40353 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +7A40 +23E0 +7E00 +D7E0 +6EA0 +7560 +0860 +ENDCHAR +STARTCHAR U_9DA2 +ENCODING 40354 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E7C0 +AA40 +FBC0 +2240 +FFE0 +2200 +7BE0 +CAA0 +3560 +CC60 +ENDCHAR +STARTCHAR U_9DA3 +ENCODING 40355 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +8A40 +8BC0 +FA40 +83E0 +FE00 +ABE0 +FEA0 +AB60 +8460 +ENDCHAR +STARTCHAR U_9DA4 +ENCODING 40356 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +A7C0 +FE40 +ABC0 +FA40 +ABE0 +FA00 +23E0 +FAA0 +2560 +2060 +ENDCHAR +STARTCHAR U_9DA5 +ENCODING 40357 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +57C0 +7E40 +43C0 +7A40 +6BE0 +7A00 +ABE0 +B820 +AD60 +BAA0 +ENDCHAR +STARTCHAR U_9DA6 +ENCODING 40358 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE40 +23C0 +7A40 +4CC0 +7F00 +2100 +3F00 +2100 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DA7 +ENCODING 40359 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +23C0 +FA40 +ABE0 +FE00 +23E0 +32A0 +4D60 +8520 +ENDCHAR +STARTCHAR U_9DA8 +ENCODING 40360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +0BC0 +FE40 +53E0 +B600 +5BE0 +B6A0 +5560 +A520 +ENDCHAR +STARTCHAR U_9DA9 +ENCODING 40361 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +29E0 +FF40 +5480 +9140 +3FA0 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DAA +ENCODING 40362 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +7A40 +4BE0 +7A00 +2BE0 +FC20 +52A0 +8D60 +ENDCHAR +STARTCHAR U_9DAB +ENCODING 40363 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2240 +FBC0 +AA40 +ABE0 +FA00 +23E0 +7020 +AD60 +22A0 +ENDCHAR +STARTCHAR U_9DAC +ENCODING 40364 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +6BC0 +9640 +7BC0 +4A40 +7BE0 +4A00 +7BE0 +6AA0 +AD60 +3860 +ENDCHAR +STARTCHAR U_9DAD +ENCODING 40365 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +DFE0 +2100 +FBE0 +5420 +BFC0 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DAE +ENCODING 40366 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +0240 +73C0 +5240 +FBE0 +8A00 +EBE0 +A820 +ED60 +9AA0 +ENDCHAR +STARTCHAR U_9DAF +ENCODING 40367 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AD40 +2100 +5280 +7FE0 +8840 +BF80 +2080 +3F80 +2080 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9DB0 +ENCODING 40368 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +03C0 +FA40 +8BE0 +FA00 +8BE0 +F820 +5560 +8AA0 +ENDCHAR +STARTCHAR U_9DB1 +ENCODING 40369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +2840 +7FA0 +A480 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DB2 +ENCODING 40370 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2900 +47C0 +AA40 +7FC0 +0240 +EFE0 +2600 +B7E0 +6C20 +B6A0 +6D60 +ENDCHAR +STARTCHAR U_9DB3 +ENCODING 40371 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4800 +FFE0 +9480 +F7E0 +96A0 +FEA0 +92A0 +FEA0 +56E0 +B480 +3C80 +ENDCHAR +STARTCHAR U_9DB4 +ENCODING 40372 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +AA40 +53C0 +FA40 +53E0 +7A00 +53E0 +7C20 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9DB5 +ENCODING 40373 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +7BC0 +AA40 +FBC0 +2A40 +53E0 +FA00 +ABE0 +FAA0 +2D60 +D540 +ENDCHAR +STARTCHAR U_9DB6 +ENCODING 40374 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFC0 +AA40 +FFC0 +AA40 +FBE0 +A200 +FBE0 +CAA0 +FD60 +8D40 +ENDCHAR +STARTCHAR U_9DB7 +ENCODING 40375 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +AA40 +FBC0 +2240 +FBE0 +2200 +FFE0 +8820 +8AA0 +FD60 +ENDCHAR +STARTCHAR U_9DB8 +ENCODING 40376 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EC80 +25C0 +ED40 +89C0 +ED40 +25E0 +B500 +6DE0 +B420 +26A0 +6D60 +ENDCHAR +STARTCHAR U_9DB9 +ENCODING 40377 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +BBC0 +AA40 +EBC0 +AA40 +53E0 +FA00 +ABE0 +F820 +AAA0 +FD40 +ENDCHAR +STARTCHAR U_9DBA +ENCODING 40378 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73C0 +AA40 +53C0 +FE40 +4BE0 +7A00 +4BE0 +7AA0 +4D60 +5D40 +ENDCHAR +STARTCHAR U_9DBB +ENCODING 40379 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +FFC0 +CA40 +7BE0 +4A00 +7BE0 +4D20 +4AA0 +5840 +ENDCHAR +STARTCHAR U_9DBC +ENCODING 40380 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +FFC0 +5240 +FBC0 +5A40 +FFE0 +5A00 +FBE0 +52A0 +DD60 +5540 +ENDCHAR +STARTCHAR U_9DBD +ENCODING 40381 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7BC0 +D240 +7BC0 +5240 +7BE0 +1200 +FFE0 +1020 +12A0 +1560 +ENDCHAR +STARTCHAR U_9DBE +ENCODING 40382 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBE0 +2500 +FBC0 +9240 +F3E0 +9240 +F3E0 +22A0 +FD60 +2520 +ENDCHAR +STARTCHAR U_9DBF +ENCODING 40383 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +2940 +7380 +2940 +FFE0 +2080 +3F80 +2080 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9DC0 +ENCODING 40384 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2BC0 +FE40 +4BC0 +9240 +FFE0 +4A00 +4BE0 +B420 +FEA0 +0560 +ENDCHAR +STARTCHAR U_9DC1 +ENCODING 40385 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2BC0 +FE40 +2BC0 +4640 +83E0 +7E00 +57E0 +5420 +56A0 +FD60 +ENDCHAR +STARTCHAR U_9DC2 +ENCODING 40386 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +EBC0 +AA40 +53C0 +7A40 +A3E0 +FA00 +23E0 +AAA0 +AD60 +F840 +ENDCHAR +STARTCHAR U_9DC3 +ENCODING 40387 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +FE40 +8BE0 +2200 +FFE0 +5020 +22A0 +DD40 +ENDCHAR +STARTCHAR U_9DC4 +ENCODING 40388 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1D00 +EBC0 +5A40 +23C0 +5240 +2BE0 +7E00 +13E0 +FC20 +2AA0 +C540 +ENDCHAR +STARTCHAR U_9DC5 +ENCODING 40389 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2BC0 +FE40 +ABC0 +FE40 +13E0 +FE00 +33E0 +5820 +56A0 +9560 +ENDCHAR +STARTCHAR U_9DC6 +ENCODING 40390 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +63C0 +4A40 +7BC0 +AA40 +BBE0 +AA00 +BBE0 +A820 +FAA0 +4D60 +ENDCHAR +STARTCHAR U_9DC7 +ENCODING 40391 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FF60 +9200 +7DC0 +4540 +7D40 +4480 +7F40 +AA20 +ENDCHAR +STARTCHAR U_9DC8 +ENCODING 40392 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F480 +94E0 +F480 +97E0 +FCA0 +87C0 +FCA0 +0DE0 +A940 +5A60 +ENDCHAR +STARTCHAR U_9DC9 +ENCODING 40393 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1C80 +F3C0 +9E40 +93C0 +FE40 +93E0 +FE00 +93E0 +9420 +BAA0 +AD40 +ENDCHAR +STARTCHAR U_9DCA +ENCODING 40394 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +03C0 +7240 +53C0 +7240 +03E0 +FA00 +DBE0 +AAA0 +FD60 +A940 +ENDCHAR +STARTCHAR U_9DCB +ENCODING 40395 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FFC0 +4A40 +33C0 +4A40 +FFE0 +1200 +FFE0 +1020 +5AA0 +B540 +ENDCHAR +STARTCHAR U_9DCC +ENCODING 40396 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43E0 +F280 +93C0 +F280 +93C0 +FA80 +83E0 +F820 +5AA0 +AD60 +A940 +ENDCHAR +STARTCHAR U_9DCD +ENCODING 40397 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +1200 +FFE0 +3820 +56A0 +9560 +ENDCHAR +STARTCHAR U_9DCE +ENCODING 40398 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +CA40 +ABC0 +FA40 +23E0 +FA00 +53E0 +A820 +76A0 +2560 +ENDCHAR +STARTCHAR U_9DCF +ENCODING 40399 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2240 +7BC0 +4A40 +6BE0 +5A00 +4BE0 +FC20 +4AA0 +8560 +ENDCHAR +STARTCHAR U_9DD0 +ENCODING 40400 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4BC0 +FE40 +83E0 +FE00 +83E0 +FC20 +AAA0 +B560 +ENDCHAR +STARTCHAR U_9DD1 +ENCODING 40401 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +4BC0 +7E40 +ABC0 +2640 +13E0 +FE00 +4BE0 +2820 +12A0 +FD40 +ENDCHAR +STARTCHAR U_9DD2 +ENCODING 40402 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +AA40 +FBC0 +AA40 +FFE0 +1200 +FFE0 +5020 +12A0 +3540 +ENDCHAR +STARTCHAR U_9DD3 +ENCODING 40403 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +AA40 +ABC0 +FE40 +ABE0 +BA00 +83E0 +AAA0 +D560 +9540 +ENDCHAR +STARTCHAR U_9DD4 +ENCODING 40404 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FBE0 +2640 +F980 +5260 +BF80 +2080 +3F80 +2080 +3FE0 +5520 +ENDCHAR +STARTCHAR U_9DD5 +ENCODING 40405 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0500 +EFE0 +B900 +EFC0 +0900 +3FE0 +2480 +3FC0 +2000 +3FC0 +D540 +ENDCHAR +STARTCHAR U_9DD6 +ENCODING 40406 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +9240 +FFE0 +9240 +A980 +FE60 +0800 +3F80 +2480 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9DD7 +ENCODING 40407 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +83C0 +BA40 +ABC0 +BA40 +83E0 +FA00 +ABE0 +FAA0 +8560 +FD40 +ENDCHAR +STARTCHAR U_9DD8 +ENCODING 40408 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FDE0 +AB40 +F880 +6940 +BFA0 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DD9 +ENCODING 40409 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5540 +FA40 +2520 +3F80 +2080 +3F80 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DDA +ENCODING 40410 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +B7C0 +6E40 +B7C0 +3240 +4BE0 +A600 +53E0 +2820 +12A0 +6540 +ENDCHAR +STARTCHAR U_9DDB +ENCODING 40411 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +7FC0 +5540 +7FC0 +5540 +7DE0 +5500 +7DE0 +5420 +7EA0 +9560 +ENDCHAR +STARTCHAR U_9DDC +ENCODING 40412 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +AA40 +FFC0 +AA40 +FBE0 +AA00 +FFE0 +4820 +32A0 +CD40 +ENDCHAR +STARTCHAR U_9DDD +ENCODING 40413 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +ABE0 +FE00 +ABE0 +FC20 +22A0 +2540 +ENDCHAR +STARTCHAR U_9DDE +ENCODING 40414 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDC0 +1140 +BBC0 +5540 +BBE0 +5500 +BBE0 +3020 +4AA0 +8560 +ENDCHAR +STARTCHAR U_9DDF +ENCODING 40415 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FD00 +43E0 +7480 +57E0 +9240 +3FA0 +2480 +2280 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9DE0 +ENCODING 40416 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +9240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +0020 +AAA0 +AD40 +ENDCHAR +STARTCHAR U_9DE1 +ENCODING 40417 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7FC0 +AA40 +ABC0 +FE40 +ABE0 +AA00 +FFE0 +0020 +56A0 +AD40 +ENDCHAR +STARTCHAR U_9DE2 +ENCODING 40418 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +7DE0 +56A0 +FD40 +A220 +3F80 +2880 +2480 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DE3 +ENCODING 40419 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +2BC0 +FE40 +ABC0 +FE40 +4BE0 +7A00 +4BE0 +FC20 +12A0 +1540 +ENDCHAR +STARTCHAR U_9DE4 +ENCODING 40420 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +03C0 +FA40 +ABE0 +FA00 +ABE0 +FC20 +22A0 +2560 +ENDCHAR +STARTCHAR U_9DE5 +ENCODING 40421 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +75C0 +2940 +FBE0 +AAA0 +3F80 +2080 +3F80 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9DE6 +ENCODING 40422 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +7FC0 +D240 +7FC0 +5240 +7FE0 +5200 +7FE0 +5020 +AAA0 +AD40 +ENDCHAR +STARTCHAR U_9DE7 +ENCODING 40423 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FFC0 +8640 +7BE0 +4A00 +7BE0 +5020 +3D60 +C2A0 +ENDCHAR +STARTCHAR U_9DE8 +ENCODING 40424 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FFC0 +2940 +FFC0 +5540 +FFE0 +5500 +FFE0 +1160 +FEA0 +12A0 +ENDCHAR +STARTCHAR U_9DE9 +ENCODING 40425 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A500 +69E0 +FF40 +A480 +ED40 +BF20 +2100 +3F00 +2100 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DEA +ENCODING 40426 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +0400 +FFE0 +8820 +3F80 +2480 +3FE0 +6A40 +95C0 +ENDCHAR +STARTCHAR U_9DEB +ENCODING 40427 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDC0 +1540 +FFC0 +9540 +FDE0 +9500 +FDE0 +9560 +DEA0 +D4A0 +ENDCHAR +STARTCHAR U_9DEC +ENCODING 40428 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +FFC0 +2240 +FBE0 +AA00 +FBE0 +AAA0 +FD60 +8860 +ENDCHAR +STARTCHAR U_9DED +ENCODING 40429 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A7C0 +6A40 +FFC0 +6A40 +A7E0 +FA00 +ABE0 +F820 +AAA0 +FD60 +ENDCHAR +STARTCHAR U_9DEE +ENCODING 40430 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23C0 +FE40 +4BC0 +BE40 +2BE0 +FE00 +87E0 +BEA0 +A560 +BD20 +ENDCHAR +STARTCHAR U_9DEF +ENCODING 40431 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFC0 +AB40 +7DC0 +C740 +7DE0 +4500 +7DE0 +5820 +96A0 +3540 +ENDCHAR +STARTCHAR U_9DF0 +ENCODING 40432 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +1100 +1F00 +EAE0 +2E80 +E8E0 +1000 +3F80 +2480 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DF1 +ENCODING 40433 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +3A00 +57E0 +FC20 +12A0 +1560 +ENDCHAR +STARTCHAR U_9DF2 +ENCODING 40434 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD20 +4BE0 +7A80 +54E0 +BF00 +2100 +3F00 +2100 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9DF3 +ENCODING 40435 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +EE40 +ABC0 +EE40 +BBE0 +AA00 +BBE0 +AA20 +BAA0 +CB60 +ENDCHAR +STARTCHAR U_9DF4 +ENCODING 40436 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ED00 +ABC0 +EE40 +ABC0 +EE40 +93E0 +FE00 +93E0 +BA20 +D6A0 +9360 +ENDCHAR +STARTCHAR U_9DF5 +ENCODING 40437 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +97C0 +FE40 +93E0 +FE00 +ABE0 +F820 +AAA0 +BD40 +ENDCHAR +STARTCHAR U_9DF6 +ENCODING 40438 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +FE40 +4BC0 +7A40 +4BE0 +7A00 +4BE0 +7820 +4AA0 +8560 +ENDCHAR +STARTCHAR U_9DF7 +ENCODING 40439 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FFC0 +5240 +FBC0 +AA40 +DBE0 +8A00 +FBE0 +9020 +52A0 +3540 +ENDCHAR +STARTCHAR U_9DF8 +ENCODING 40440 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +29C0 +FD40 +55C0 +9140 +FFE0 +AB00 +FFE0 +AA20 +BAA0 +8760 +ENDCHAR +STARTCHAR U_9DF9 +ENCODING 40441 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5500 +5FE0 +7500 +5FE0 +5040 +5FC0 +5040 +9FE0 +6AA0 +ENDCHAR +STARTCHAR U_9DFA +ENCODING 40442 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9680 +F140 +27E0 +AA40 +FFC0 +4480 +7FE0 +4000 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_9DFB +ENCODING 40443 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EF80 +AAE0 +EEA0 +A0A0 +FFA0 +82A0 +FBA0 +4E40 +BAA0 +AF20 +ENDCHAR +STARTCHAR U_9DFC +ENCODING 40444 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABC0 +FA40 +ABC0 +FA40 +ABE0 +BA00 +ABE0 +B820 +8AA0 +8D60 +ENDCHAR +STARTCHAR U_9DFD +ENCODING 40445 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +75C0 +4A40 +75C0 +4A40 +FFE0 +A520 +3FC0 +2000 +3FE0 +5520 +94C0 +ENDCHAR +STARTCHAR U_9DFE +ENCODING 40446 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5240 +FFC0 +4A40 +7BE0 +4A00 +7BE0 +3020 +6AA0 +BD40 +ENDCHAR +STARTCHAR U_9DFF +ENCODING 40447 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +47E0 +7D40 +67E0 +A480 +3FC0 +2040 +3FC0 +2040 +3FE0 +CAA0 +ENDCHAR +STARTCHAR U_9E00 +ENCODING 40448 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +43C0 +FA40 +2BE0 +FA00 +ABE0 +F820 +2AA0 +D560 +ENDCHAR +STARTCHAR U_9E01 +ENCODING 40449 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +4000 +7FC0 +2080 +FF80 +95E0 +FEA0 +90E0 +FFA0 +95A0 +BAA0 +ENDCHAR +STARTCHAR U_9E02 +ENCODING 40450 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4C80 +35C0 +8940 +4FC0 +2540 +3FE0 +2900 +FFE0 +4960 +56A0 +6440 +ENDCHAR +STARTCHAR U_9E03 +ENCODING 40451 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F7E0 +9080 +F7E0 +9100 +FAA0 +87E0 +FAA0 +0FC0 +5AA0 +AF60 +ENDCHAR +STARTCHAR U_9E04 +ENCODING 40452 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +79E0 +4B40 +FC80 +4940 +9FA0 +2480 +3FE0 +2000 +3FE0 +D2A0 +ENDCHAR +STARTCHAR U_9E05 +ENCODING 40453 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABC0 +FA40 +23C0 +FE40 +23E0 +FA00 +53E0 +FC20 +22A0 +2560 +ENDCHAR +STARTCHAR U_9E06 +ENCODING 40454 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +23C0 +FE40 +A7C0 +FA40 +A7E0 +BE00 +93E0 +FEA0 +A960 +C420 +ENDCHAR +STARTCHAR U_9E07 +ENCODING 40455 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FDC0 +A540 +95C0 +FD40 +49E0 +7900 +49E0 +7AA0 +0560 +FC20 +ENDCHAR +STARTCHAR U_9E08 +ENCODING 40456 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AD00 +6BC0 +FE40 +2BC0 +7A40 +13E0 +7A00 +13E0 +FC20 +3AA0 +5560 +ENDCHAR +STARTCHAR U_9E09 +ENCODING 40457 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FC40 +37E0 +6AA0 +BFC0 +2080 +3F80 +2080 +3FE0 +5520 +92C0 +ENDCHAR +STARTCHAR U_9E0A +ENCODING 40458 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0880 +FFC0 +A240 +B7C0 +EA40 +9FE0 +EA00 +BFE0 +A820 +EAA0 +8D40 +ENDCHAR +STARTCHAR U_9E0B +ENCODING 40459 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +AA40 +57C0 +FE40 +ABE0 +FE00 +03E0 +FAA0 +1560 +3520 +ENDCHAR +STARTCHAR U_9E0C +ENCODING 40460 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4240 +FFE0 +9280 +F7E0 +9480 +FFC0 +8480 +FFE0 +0A40 +D980 +AE60 +ENDCHAR +STARTCHAR U_9E0D +ENCODING 40461 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +57C0 +9240 +FFC0 +DA40 +B7E0 +DA00 +B7E0 +DA20 +92A0 +8760 +ENDCHAR +STARTCHAR U_9E0E +ENCODING 40462 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7BC0 +4A40 +BFA0 +2080 +3F80 +2080 +3FE0 +5520 +8AE0 +ENDCHAR +STARTCHAR U_9E0F +ENCODING 40463 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +FBC0 +8A40 +FBE0 +5600 +BBE0 +5AA0 +9560 +2520 +ENDCHAR +STARTCHAR U_9E10 +ENCODING 40464 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4BC0 +EA40 +5BC0 +EA40 +93E0 +FA00 +93E0 +FAA0 +9560 +FD20 +ENDCHAR +STARTCHAR U_9E11 +ENCODING 40465 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A4C0 +5EA0 +A1E0 +3E80 +6340 +BFA0 +2080 +3FE0 +2080 +3FE0 +D520 +ENDCHAR +STARTCHAR U_9E12 +ENCODING 40466 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6EC0 +4840 +6EC0 +4A40 +FFE0 +4840 +BFA0 +2480 +2280 +7FE0 +92A0 +ENDCHAR +STARTCHAR U_9E13 +ENCODING 40467 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +55C0 +7D40 +55C0 +7D40 +01E0 +FF00 +ABE0 +FE20 +AAA0 +FF60 +ENDCHAR +STARTCHAR U_9E14 +ENCODING 40468 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +F420 +97E0 +F240 +97E0 +FA40 +87E0 +FD40 +5BA0 +AD40 +AB20 +ENDCHAR +STARTCHAR U_9E15 +ENCODING 40469 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3900 +23C0 +FE40 +A7C0 +FA40 +ABE0 +FA00 +ABE0 +FEA0 +9560 +FD20 +ENDCHAR +STARTCHAR U_9E16 +ENCODING 40470 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +13C0 +FE40 +D7C0 +3A40 +57E0 +7A00 +D3E0 +7820 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9E17 +ENCODING 40471 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE00 +53C0 +FC40 +4BC0 +4A20 +3FE0 +2080 +3F80 +2080 +3FE0 +4AA0 +ENDCHAR +STARTCHAR U_9E18 +ENCODING 40472 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +23C0 +FE40 +ABC0 +7240 +ABE0 +5E00 +F7E0 +5C20 +F560 +5EA0 +ENDCHAR +STARTCHAR U_9E19 +ENCODING 40473 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +4BC0 +B640 +FFC0 +AA40 +FFE0 +0200 +FFE0 +AB60 +FEA0 +AA40 +ENDCHAR +STARTCHAR U_9E1A +ENCODING 40474 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +53E0 +AA00 +FBE0 +5020 +26A0 +D960 +ENDCHAR +STARTCHAR U_9E1B +ENCODING 40475 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BC0 +FA40 +ABC0 +FA40 +53E0 +7E00 +D3E0 +7C20 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9E1C +ENCODING 40476 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +ABC0 +FA40 +ABC0 +FA40 +53E0 +FA00 +53E0 +7820 +52A0 +7D60 +ENDCHAR +STARTCHAR U_9E1D +ENCODING 40477 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +01C0 +EF40 +ABC0 +FD40 +95E0 +FF00 +95E0 +FE20 +A960 +BEA0 +ENDCHAR +STARTCHAR U_9E1E +ENCODING 40478 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +50E0 +EE40 +4AE0 +BFA0 +2080 +3FE0 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_9E1F +ENCODING 40479 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +7F00 +4100 +5100 +4900 +4200 +7FC0 +0040 +FF40 +0040 +0380 +ENDCHAR +STARTCHAR U_9E20 +ENCODING 40480 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +47C0 +F440 +5540 +5540 +5480 +57E0 +5020 +5FA0 +9020 +80C0 +ENDCHAR +STARTCHAR U_9E21 +ENCODING 40481 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +1440 +9540 +5540 +2480 +27E0 +5020 +4FA0 +8020 +00C0 +ENDCHAR +STARTCHAR U_9E22 +ENCODING 40482 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0480 +FFE0 +1200 +3FA0 +2960 +2500 +2200 +3FC0 +0040 +FF40 +00C0 +ENDCHAR +STARTCHAR U_9E23 +ENCODING 40483 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7C0 +9440 +9540 +9540 +9480 +F7E0 +0020 +0FA0 +0020 +00C0 +ENDCHAR +STARTCHAR U_9E24 +ENCODING 40484 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +4B40 +7AC0 +4200 +43E0 +4020 +47A0 +80A0 +8040 +ENDCHAR +STARTCHAR U_9E25 +ENCODING 40485 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +87C0 +9440 +D540 +A540 +A480 +D7E0 +9020 +87A0 +F820 +00C0 +ENDCHAR +STARTCHAR U_9E26 +ENCODING 40486 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +5440 +9540 +FD40 +3480 +37E0 +5020 +57A0 +9020 +3060 +ENDCHAR +STARTCHAR U_9E27 +ENCODING 40487 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +2A40 +46C0 +FA40 +4BE0 +5820 +47A0 +4820 +38A0 +0040 +ENDCHAR +STARTCHAR U_9E28 +ENCODING 40488 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +77C0 +4440 +5540 +7540 +2480 +FFE0 +2020 +27A0 +2020 +20C0 +ENDCHAR +STARTCHAR U_9E29 +ENCODING 40489 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +FC40 +AD40 +2540 +3480 +37E0 +3020 +5FA0 +5020 +80C0 +ENDCHAR +STARTCHAR U_9E2A +ENCODING 40490 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2440 +FD40 +2540 +2480 +FFE0 +8820 +8FA0 +F820 +00C0 +ENDCHAR +STARTCHAR U_9E2B +ENCODING 40491 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2440 +5540 +9540 +FC80 +17E0 +5820 +97A0 +1020 +30C0 +ENDCHAR +STARTCHAR U_9E2C +ENCODING 40492 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3BC0 +2240 +FB40 +8AC0 +8A00 +FBE0 +8020 +87A0 +8020 +80C0 +ENDCHAR +STARTCHAR U_9E2D +ENCODING 40493 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +AA40 +FB40 +AAC0 +AA00 +FBE0 +2020 +2FA0 +2020 +20C0 +ENDCHAR +STARTCHAR U_9E2E +ENCODING 40494 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +7BC0 +4A40 +7AC0 +0240 +FBE0 +2020 +3BA0 +0820 +28A0 +1040 +ENDCHAR +STARTCHAR U_9E2F +ENCODING 40495 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +2480 +DF60 +1900 +1500 +1FC0 +0040 +7F40 +0080 +ENDCHAR +STARTCHAR U_9E30 +ENCODING 40496 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +13C0 +2A40 +5740 +92C0 +7A00 +0BE0 +5020 +27A0 +10A0 +0040 +ENDCHAR +STARTCHAR U_9E31 +ENCODING 40497 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F3C0 +9240 +9340 +FAC0 +9200 +93E0 +9020 +8FA0 +A8A0 +D440 +ENDCHAR +STARTCHAR U_9E32 +ENCODING 40498 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +8A40 +0B40 +EAC0 +AA00 +ABE0 +E820 +0FA0 +2820 +10C0 +ENDCHAR +STARTCHAR U_9E33 +ENCODING 40499 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3BC0 +4A40 +B2A0 +25E0 +7F80 +A880 +2480 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E34 +ENCODING 40500 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4840 +2480 +FFE0 +9040 +3F80 +2880 +2480 +3FC0 +0040 +FF40 +0080 +ENDCHAR +STARTCHAR U_9E35 +ENCODING 40501 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F7E0 +9420 +D000 +B200 +8240 +FA80 +0B00 +EA20 +0A20 +31E0 +ENDCHAR +STARTCHAR U_9E36 +ENCODING 40502 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2940 +5280 +FBE0 +0000 +FFE0 +2900 +2500 +3FC0 +0040 +FF40 +00C0 +ENDCHAR +STARTCHAR U_9E37 +ENCODING 40503 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +F780 +2A80 +F4A0 +2A60 +7F80 +2480 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E38 +ENCODING 40504 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +23C0 +4240 +FB40 +AAC0 +AA00 +ABE0 +A820 +AFA0 +A820 +98C0 +ENDCHAR +STARTCHAR U_9E39 +ENCODING 40505 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1900 +E7C0 +2440 +FD40 +2540 +2480 +FFE0 +8820 +8FA0 +F820 +88C0 +ENDCHAR +STARTCHAR U_9E3A +ENCODING 40506 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +2BE0 +4A20 +5EA0 +CAA0 +4E40 +5BE0 +6820 +4BA0 +4820 +48C0 +ENDCHAR +STARTCHAR U_9E3B +ENCODING 40507 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +5BC0 +8240 +4340 +7EC0 +CA00 +4BE0 +4820 +4FA0 +48A0 +5840 +ENDCHAR +STARTCHAR U_9E3C +ENCODING 40508 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7BC0 +4A40 +6B40 +5A40 +FFE0 +4820 +6FE0 +5820 +48A0 +9840 +ENDCHAR +STARTCHAR U_9E3D +ENCODING 40509 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5440 +8D40 +F540 +0480 +F7E0 +9020 +97A0 +F020 +00C0 +ENDCHAR +STARTCHAR U_9E3E +ENCODING 40510 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +4940 +8920 +3F80 +2880 +2480 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E3F +ENCODING 40511 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FC0 +8A40 +4B40 +2AC0 +2A80 +2FE0 +D820 +47A0 +4020 +40C0 +ENDCHAR +STARTCHAR U_9E40 +ENCODING 40512 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +2240 +2B40 +6AC0 +6BE0 +B420 +27E0 +2020 +F8A0 +0040 +ENDCHAR +STARTCHAR U_9E41 +ENCODING 40513 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +2240 +FB40 +8AC0 +FA00 +13E0 +2020 +FFA0 +2020 +6060 +ENDCHAR +STARTCHAR U_9E42 +ENCODING 40514 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FBC0 +0240 +FB40 +AAC0 +AA00 +FBE0 +A820 +AFA0 +A820 +A8C0 +ENDCHAR +STARTCHAR U_9E43 +ENCODING 40515 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +F440 +0540 +F540 +9480 +F7E0 +9020 +FFA0 +9020 +B0C0 +ENDCHAR +STARTCHAR U_9E44 +ENCODING 40516 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +53C0 +7E40 +9340 +12C0 +FE00 +03E0 +7C20 +47A0 +7C20 +44C0 +ENDCHAR +STARTCHAR U_9E45 +ENCODING 40517 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3100 +DBC0 +5640 +FF40 +52C0 +7200 +D7E0 +5420 +4BA0 +5620 +E2C0 +ENDCHAR +STARTCHAR U_9E46 +ENCODING 40518 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +4BC0 +8640 +3340 +4AC0 +8600 +7BE0 +4820 +4FA0 +7820 +48C0 +ENDCHAR +STARTCHAR U_9E47 +ENCODING 40519 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +5BC0 +8A40 +AB40 +FAC0 +AA00 +BBE0 +E820 +AFA0 +A820 +98C0 +ENDCHAR +STARTCHAR U_9E48 +ENCODING 40520 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +23C0 +FA40 +2B40 +FAC0 +A200 +FBE0 +6820 +6FA0 +B820 +A0C0 +ENDCHAR +STARTCHAR U_9E49 +ENCODING 40521 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +EFC0 +0A40 +FF40 +2AC0 +BA00 +ABE0 +A820 +ABA0 +B420 +C260 +ENDCHAR +STARTCHAR U_9E4A +ENCODING 40522 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +53C0 +FA40 +5340 +FAC0 +0200 +7BE0 +4820 +7FA0 +4820 +78C0 +ENDCHAR +STARTCHAR U_9E4B +ENCODING 40523 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +FBC0 +5240 +0340 +FAC0 +AA00 +FBE0 +A820 +AFA0 +F820 +88C0 +ENDCHAR +STARTCHAR U_9E4C +ENCODING 40524 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +5240 +AB40 +FEC0 +AA80 +FBE0 +A820 +FFA0 +2020 +30C0 +ENDCHAR +STARTCHAR U_9E4D +ENCODING 40525 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +8BC0 +FA40 +8B40 +FAC0 +9200 +FFE0 +9020 +97A0 +D820 +9060 +ENDCHAR +STARTCHAR U_9E4E +ENCODING 40526 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FBC0 +AA40 +FB40 +AAC0 +FA80 +23E0 +5020 +FFA0 +1020 +10C0 +ENDCHAR +STARTCHAR U_9E4F +ENCODING 40527 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +EFC0 +AA40 +EF40 +AAC0 +AA00 +EFE0 +AA20 +ABA0 +AA20 +B6C0 +ENDCHAR +STARTCHAR U_9E50 +ENCODING 40528 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7BC0 +4A40 +9340 +42C0 +9A00 +8BE0 +D820 +8BA0 +F820 +0060 +ENDCHAR +STARTCHAR U_9E51 +ENCODING 40529 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +4A40 +7B40 +02C0 +7A00 +13E0 +1020 +FBA0 +1020 +30C0 +ENDCHAR +STARTCHAR U_9E52 +ENCODING 40530 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +A240 +FB40 +AAC0 +FE00 +ABE0 +F820 +A7A0 +D020 +8860 +ENDCHAR +STARTCHAR U_9E53 +ENCODING 40531 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +8640 +7F40 +5AC0 +9A00 +6FE0 +2820 +4BA0 +4C20 +8860 +ENDCHAR +STARTCHAR U_9E54 +ENCODING 40532 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2A40 +FF40 +2AC0 +FA00 +ABE0 +F820 +AFA0 +A820 +A860 +ENDCHAR +STARTCHAR U_9E55 +ENCODING 40533 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +5DC0 +5540 +F5C0 +5D40 +F500 +9DE0 +9420 +F7A0 +2420 +4C60 +ENDCHAR +STARTCHAR U_9E56 +ENCODING 40534 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +7A40 +4B40 +7A40 +23E0 +7C20 +D7E0 +6C20 +74A0 +0840 +ENDCHAR +STARTCHAR U_9E57 +ENCODING 40535 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +EE40 +0340 +7AC0 +0200 +FFE0 +2020 +7BA0 +0820 +30C0 +ENDCHAR +STARTCHAR U_9E58 +ENCODING 40536 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4BC0 +6A40 +5B40 +FEC0 +8600 +7BE0 +4820 +7FA0 +4820 +58C0 +ENDCHAR +STARTCHAR U_9E59 +ENCODING 40537 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7080 +22A0 +FC80 +7140 +AA20 +3F80 +2480 +3FE0 +0020 +FF20 +0060 +ENDCHAR +STARTCHAR U_9E5A +ENCODING 40538 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4500 +2BC0 +FE40 +4B40 +4AC0 +B600 +4BE0 +4820 +B7A0 +FC20 +00C0 +ENDCHAR +STARTCHAR U_9E5B +ENCODING 40539 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +97C0 +FE40 +8340 +BEC0 +A600 +BFE0 +A420 +BFA0 +A420 +BCC0 +ENDCHAR +STARTCHAR U_9E5C +ENCODING 40540 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +2BE0 +FC80 +3540 +5FA0 +9480 +1280 +1FE0 +0020 +7F20 +00C0 +ENDCHAR +STARTCHAR U_9E5D +ENCODING 40541 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFC0 +5240 +7340 +02C0 +FA00 +DBE0 +F820 +AFA0 +A820 +A860 +ENDCHAR +STARTCHAR U_9E5E +ENCODING 40542 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C80 +F5E0 +A520 +59A0 +7D60 +9100 +FDE0 +1020 +57A0 +5420 +7C60 +ENDCHAR +STARTCHAR U_9E5F +ENCODING 40543 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +AFC0 +5240 +FB40 +02C0 +FFE0 +2420 +B7A0 +6C20 +B4A0 +6C40 +ENDCHAR +STARTCHAR U_9E60 +ENCODING 40544 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +DDC0 +9540 +D5C0 +AD40 +01E0 +FC20 +A7A0 +FC20 +A4A0 +FC40 +ENDCHAR +STARTCHAR U_9E61 +ENCODING 40545 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +3BC0 +D640 +2B40 +4680 +FBE0 +4820 +7FA0 +4820 +78A0 +4840 +ENDCHAR +STARTCHAR U_9E62 +ENCODING 40546 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +4BC0 +3240 +FF40 +4AC0 +8600 +7FE0 +5420 +5FA0 +F020 +0060 +ENDCHAR +STARTCHAR U_9E63 +ENCODING 40547 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8880 +51C0 +FF40 +55C0 +FF40 +5500 +FDE0 +5020 +DBE0 +5420 +5060 +ENDCHAR +STARTCHAR U_9E64 +ENCODING 40548 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +A640 +5340 +7EC0 +D280 +7BE0 +5020 +7BE0 +5020 +7C60 +ENDCHAR +STARTCHAR U_9E65 +ENCODING 40549 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FDC0 +8140 +FBE0 +A880 +FF60 +0800 +3F80 +2480 +3FC0 +0040 +FF40 +ENDCHAR +STARTCHAR U_9E66 +ENCODING 40550 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +EE80 +ABC0 +AA40 +AB40 +44C0 +AA00 +13E0 +FC20 +2BA0 +1020 +6C60 +ENDCHAR +STARTCHAR U_9E67 +ENCODING 40551 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +8120 +A9A0 +FF60 +A900 +B9E0 +8020 +ABA0 +D420 +8060 +ENDCHAR +STARTCHAR U_9E68 +ENCODING 40552 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC80 +25E0 +B520 +6DA0 +9560 +2900 +D5E0 +2020 +4BE0 +1020 +60C0 +ENDCHAR +STARTCHAR U_9E69 +ENCODING 40553 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFC0 +5640 +7B40 +CEC0 +7A00 +4BE0 +7820 +5BA0 +9420 +3060 +ENDCHAR +STARTCHAR U_9E6A +ENCODING 40554 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +7DC0 +5140 +FDC0 +5140 +7D00 +51E0 +7C20 +55E0 +AA20 +AA60 +ENDCHAR +STARTCHAR U_9E6B +ENCODING 40555 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FFE0 +4900 +79A0 +56E0 +BF00 +2500 +3FC0 +0040 +FF40 +0080 +ENDCHAR +STARTCHAR U_9E6C +ENCODING 40556 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +29C0 +FD40 +35C0 +5140 +FF00 +ABE0 +C620 +BBE0 +AA20 +BA60 +ENDCHAR +STARTCHAR U_9E6D +ENCODING 40557 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4D40 +7BC0 +A660 +BBC0 +FF00 +2900 +3FE0 +0020 +FF20 +00C0 +ENDCHAR +STARTCHAR U_9E6E +ENCODING 40558 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +ABC0 +FE40 +0340 +FE80 +4BE0 +7820 +67E0 +D820 +48A0 +6440 +ENDCHAR +STARTCHAR U_9E6F +ENCODING 40559 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFC0 +AB40 +BAC0 +8240 +FFE0 +4820 +7BE0 +4820 +FCA0 +0040 +ENDCHAR +STARTCHAR U_9E70 +ENCODING 40560 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +5500 +7FC0 +5500 +5FE0 +5280 +5FE0 +4020 +BF20 +80C0 +ENDCHAR +STARTCHAR U_9E71 +ENCODING 40561 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +F7E0 +9140 +D7E0 +B280 +83E0 +FA80 +0BE0 +E940 +0880 +3360 +ENDCHAR +STARTCHAR U_9E72 +ENCODING 40562 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4900 +FFC0 +4A40 +FF40 +86C0 +7A40 +67E0 +B820 +5BA0 +9420 +30C0 +ENDCHAR +STARTCHAR U_9E73 +ENCODING 40563 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +4BC0 +EE40 +AB40 +EEC0 +5200 +7FE0 +D020 +7FA0 +5020 +7E60 +ENDCHAR +STARTCHAR U_9E74 +ENCODING 40564 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +13C0 +FF40 +D6C0 +3A40 +57E0 +FC20 +57E0 +7C20 +D4A0 +5C40 +ENDCHAR +STARTCHAR U_9E75 +ENCODING 40565 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0FC0 +0800 +FF80 +C980 +A280 +D480 +AD80 +8C80 +9A80 +A580 +FF80 +ENDCHAR +STARTCHAR U_9E76 +ENCODING 40566 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3D00 +2280 +FC40 +A920 +D880 +ABC0 +A840 +D880 +A880 +F900 +ENDCHAR +STARTCHAR U_9E77 +ENCODING 40567 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3C80 +2140 +FF20 +AC80 +D400 +BFE0 +D440 +AD80 +D480 +FC40 +ENDCHAR +STARTCHAR U_9E78 +ENCODING 40568 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3940 +2220 +FDC0 +A880 +DBE0 +AAA0 +DBE0 +A880 +F940 +0620 +ENDCHAR +STARTCHAR U_9E79 +ENCODING 40569 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +20C0 +30A0 +2FE0 +F880 +AE80 +D8A0 +AEA0 +DAC0 +AEA0 +D960 +FA20 +ENDCHAR +STARTCHAR U_9E7A +ENCODING 40570 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3FE0 +2080 +FBE0 +A880 +DFE0 +A900 +DBE0 +AC80 +8880 +FBE0 +ENDCHAR +STARTCHAR U_9E7B +ENCODING 40571 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2440 +3FE0 +2280 +FFE0 +AAA0 +DFE0 +AAA0 +FFE0 +AAC0 +DEA0 +FA80 +ENDCHAR +STARTCHAR U_9E7C +ENCODING 40572 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2180 +3A40 +25A0 +F800 +ABE0 +DAA0 +ABE0 +D940 +A940 +8AA0 +FCA0 +ENDCHAR +STARTCHAR U_9E7D +ENCODING 40573 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7E0 +AD00 +F7E0 +9540 +F6C0 +A540 +F7C0 +0000 +7FC0 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_9E7E +ENCODING 40574 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +3940 +23E0 +F880 +89C0 +D880 +AFE0 +A900 +DBC0 +8C80 +FBE0 +ENDCHAR +STARTCHAR U_9E7F +ENCODING 40575 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4920 +7FE0 +5120 +5D40 +51A0 +9D20 +90E0 +ENDCHAR +STARTCHAR U_9E80 +ENCODING 40576 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +7FE0 +5540 +59A0 +5DE0 +5000 +5F20 +5020 +8FE0 +ENDCHAR +STARTCHAR U_9E81 +ENCODING 40577 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0F00 +3200 +0C00 +7FE0 +4A40 +7FC0 +5200 +5AC0 +5300 +5A20 +91E0 +ENDCHAR +STARTCHAR U_9E82 +ENCODING 40578 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5100 +5DC0 +5120 +5FE0 +5100 +9120 +A0E0 +ENDCHAR +STARTCHAR U_9E83 +ENCODING 40579 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4900 +7FE0 +4920 +7FE0 +5140 +5DA0 +5120 +9DE0 +A940 +ENDCHAR +STARTCHAR U_9E84 +ENCODING 40580 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +3E80 +CA60 +1200 +7FE0 +5240 +7FC0 +5240 +5B80 +5220 +99E0 +ENDCHAR +STARTCHAR U_9E85 +ENCODING 40581 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5280 +5B20 +51E0 +5F80 +7280 +5220 +8FE0 +ENDCHAR +STARTCHAR U_9E86 +ENCODING 40582 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5500 +5920 +5FE0 +5080 +5F80 +9080 +7FE0 +ENDCHAR +STARTCHAR U_9E87 +ENCODING 40583 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5540 +59A0 +5FE0 +4200 +7FE0 +8A80 +B260 +ENDCHAR +STARTCHAR U_9E88 +ENCODING 40584 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5540 +59A0 +7FE0 +4200 +5FC0 +8200 +FFE0 +ENDCHAR +STARTCHAR U_9E89 +ENCODING 40585 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +2480 +7FE0 +4A40 +7FC0 +6240 +7BA0 +A220 +B9E0 +ENDCHAR +STARTCHAR U_9E8A +ENCODING 40586 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +7FE0 +1500 +2480 +7FE0 +4A40 +7FC0 +5140 +5D80 +9120 +9CE0 +ENDCHAR +STARTCHAR U_9E8B +ENCODING 40587 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5120 +5DE0 +6480 +5500 +7FE0 +9500 +A4C0 +ENDCHAR +STARTCHAR U_9E8C +ENCODING 40588 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +4920 +7FE0 +5100 +7FC0 +4400 +BFE0 +9080 +ENDCHAR +STARTCHAR U_9E8D +ENCODING 40589 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5100 +5520 +7FE0 +4840 +7F80 +9520 +A5E0 +ENDCHAR +STARTCHAR U_9E8E +ENCODING 40590 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +4920 +5FE0 +5000 +5FE0 +5940 +A880 +AC60 +ENDCHAR +STARTCHAR U_9E8F +ENCODING 40591 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +4440 +7FE0 +4440 +7FC0 +5880 +A880 +CF80 +ENDCHAR +STARTCHAR U_9E90 +ENCODING 40592 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5240 +7FC0 +5220 +5BE0 +4200 +5FC0 +4700 +B8E0 +8F80 +ENDCHAR +STARTCHAR U_9E91 +ENCODING 40593 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9240 +FFC0 +AA40 +B2A0 +BBE0 +A040 +BFC0 +8A20 +33E0 +ENDCHAR +STARTCHAR U_9E92 +ENCODING 40594 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +FD40 +ABE0 +FD40 +A9C0 +FD40 +A9C0 +BD40 +ABE0 +B940 +AE20 +ENDCHAR +STARTCHAR U_9E93 +ENCODING 40595 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +6AC0 +A4A0 +7FE0 +4A40 +7FC0 +6240 +7FA0 +A220 +BBE0 +ENDCHAR +STARTCHAR U_9E94 +ENCODING 40596 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9920 +FFE0 +AA80 +B320 +FFE0 +AA80 +D240 +BFE0 +A080 +BF80 +ENDCHAR +STARTCHAR U_9E95 +ENCODING 40597 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +4920 +5FE0 +5240 +5FC0 +5740 +9AC0 +1FC0 +ENDCHAR +STARTCHAR U_9E96 +ENCODING 40598 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4940 +7FC0 +4920 +4DE0 +7FC0 +4880 +4F80 +8A80 +1240 +ENDCHAR +STARTCHAR U_9E97 +ENCODING 40599 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4A40 +6B40 +5AC0 +7FE0 +4A40 +7FC0 +6240 +BFA0 +A220 +BBE0 +ENDCHAR +STARTCHAR U_9E98 +ENCODING 40600 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +4920 +5FE0 +4200 +7FE0 +4F80 +7AE0 +8F80 +ENDCHAR +STARTCHAR U_9E99 +ENCODING 40601 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +FFC0 +A220 +BBE0 +A280 +FFE0 +8240 +BD80 +A520 +BEE0 +ENDCHAR +STARTCHAR U_9E9A +ENCODING 40602 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +FFC0 +A280 +BB20 +A3E0 +B840 +ABC0 +BA40 +A180 +BE60 +ENDCHAR +STARTCHAR U_9E9B +ENCODING 40603 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9240 +FFC0 +AA80 +B320 +FFE0 +8A40 +FBC0 +8A40 +B7E0 +ENDCHAR +STARTCHAR U_9E9C +ENCODING 40604 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +9240 +FFC0 +A200 +BBC0 +A200 +FFE0 +AA40 +FFE0 +8E00 +F5C0 +ENDCHAR +STARTCHAR U_9E9D +ENCODING 40605 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5220 +5FE0 +5440 +57E0 +7E40 +9540 +ACC0 +ENDCHAR +STARTCHAR U_9E9E +ENCODING 40606 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4940 +7FC0 +5220 +5FE0 +4880 +4F80 +4880 +7FE0 +8200 +ENDCHAR +STARTCHAR U_9E9F +ENCODING 40607 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +FDC0 +ABE0 +FCC0 +ADA0 +FD40 +ABE0 +BD40 +ABE0 +BA40 +2C40 +ENDCHAR +STARTCHAR U_9EA0 +ENCODING 40608 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4920 +7FE0 +5540 +5980 +7FE0 +5240 +7FE0 +9240 +FFE0 +ENDCHAR +STARTCHAR U_9EA1 +ENCODING 40609 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4A40 +7FC0 +5680 +5B20 +7FE0 +4A80 +5540 +5480 +9F80 +A080 +ENDCHAR +STARTCHAR U_9EA2 +ENCODING 40610 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4A40 +7FC0 +5220 +5FE0 +6AA0 +5740 +5FC0 +5540 +9FC0 +ENDCHAR +STARTCHAR U_9EA3 +ENCODING 40611 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FD40 +AFE0 +F840 +AF40 +FA60 +AFA0 +BD20 +EB40 +BFA0 +0920 +ENDCHAR +STARTCHAR U_9EA4 +ENCODING 40612 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4A80 +7FC0 +5200 +5F80 +9220 +FBE0 +AAA0 +FBE0 +AB40 +BD60 +ENDCHAR +STARTCHAR U_9EA5 +ENCODING 40613 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +5F40 +9520 +2880 +CF60 +1100 +6E00 +0500 +78C0 +ENDCHAR +STARTCHAR U_9EA6 +ENCODING 40614 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +0800 +1F80 +6900 +0600 +79E0 +ENDCHAR +STARTCHAR U_9EA7 +ENCODING 40615 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +55E0 +BA00 +3BE0 +5440 +BA80 +2900 +5220 +2A20 +C1E0 +ENDCHAR +STARTCHAR U_9EA8 +ENCODING 40616 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +5500 +5540 +AB20 +4520 +B940 +4880 +B100 +3200 +CC00 +ENDCHAR +STARTCHAR U_9EA9 +ENCODING 40617 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FE80 +55E0 +7A80 +9080 +3BE0 +5480 +BC80 +6940 +1240 +6C20 +ENDCHAR +STARTCHAR U_9EAA +ENCODING 40618 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +5480 +5480 +AAE0 +46A0 +BBE0 +6820 +9020 +28A0 +C040 +ENDCHAR +STARTCHAR U_9EAB +ENCODING 40619 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +FFE0 +5480 +56E0 +AA80 +47E0 +B820 +6820 +9020 +28A0 +C040 +ENDCHAR +STARTCHAR U_9EAC +ENCODING 40620 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +57E0 +56A0 +BA80 +4BC0 +A740 +3A80 +5480 +2540 +DA20 +ENDCHAR +STARTCHAR U_9EAD +ENCODING 40621 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FFE0 +5420 +BBA0 +12A0 +3AA0 +57A0 +BE60 +6A00 +1220 +69E0 +ENDCHAR +STARTCHAR U_9EAE +ENCODING 40622 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +55E0 +5480 +BA80 +3BE0 +5480 +BC80 +6900 +1220 +6BE0 +ENDCHAR +STARTCHAR U_9EAF +ENCODING 40623 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +5480 +57E0 +BAA0 +4AA0 +A7E0 +7AA0 +D2A0 +22A0 +D3E0 +ENDCHAR +STARTCHAR U_9EB0 +ENCODING 40624 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FC80 +5520 +7BE0 +9280 +3BE0 +5480 +BFE0 +6880 +1080 +6880 +ENDCHAR +STARTCHAR U_9EB1 +ENCODING 40625 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +10C0 +FCA0 +57E0 +5480 +BBE0 +4AA0 +A7E0 +3AA0 +6BE0 +12A0 +EA60 +ENDCHAR +STARTCHAR U_9EB2 +ENCODING 40626 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FA40 +57C0 +5640 +BBC0 +4A40 +A7C0 +7A80 +D280 +24A0 +D860 +ENDCHAR +STARTCHAR U_9EB3 +ENCODING 40627 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFE0 +AD40 +AD40 +73A0 +5100 +8B80 +7340 +D560 +2900 +D100 +ENDCHAR +STARTCHAR U_9EB4 +ENCODING 40628 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +FBE0 +5520 +7D60 +93A0 +2FE0 +D5A0 +3B60 +6D20 +1120 +6860 +ENDCHAR +STARTCHAR U_9EB5 +ENCODING 40629 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +FD00 +57E0 +7AA0 +92A0 +3BA0 +56A0 +BFA0 +6AA0 +12A0 +6BE0 +ENDCHAR +STARTCHAR U_9EB6 +ENCODING 40630 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FFE0 +AB60 +FAA0 +27E0 +7080 +AFE0 +7CA0 +D560 +27E0 +D420 +ENDCHAR +STARTCHAR U_9EB7 +ENCODING 40631 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2AA0 +FFE0 +AAA0 +FFE0 +2AA0 +7AA0 +AFE0 +7A60 +D3E0 +3140 +CFE0 +ENDCHAR +STARTCHAR U_9EB8 +ENCODING 40632 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +27E0 +F900 +2100 +FFE0 +2100 +3A80 +D280 +2440 +D820 +ENDCHAR +STARTCHAR U_9EB9 +ENCODING 40633 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +FE00 +23E0 +7D20 +2560 +FBA0 +27E0 +7BA0 +D560 +21A0 +D040 +ENDCHAR +STARTCHAR U_9EBA +ENCODING 40634 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +FFE0 +2100 +7200 +2FE0 +FAA0 +4BA0 +7AA0 +DBA0 +2AA0 +DFE0 +ENDCHAR +STARTCHAR U_9EBB +ENCODING 40635 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +4880 +7FE0 +4880 +5DC0 +6AC0 +4CA0 +8880 +8880 +ENDCHAR +STARTCHAR U_9EBC +ENCODING 40636 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4DC0 +5AA0 +6AA0 +4480 +4F00 +8240 +9FE0 +ENDCHAR +STARTCHAR U_9EBD +ENCODING 40637 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +5080 +7FE0 +5180 +7AC0 +54A0 +4A00 +5400 +A880 +9FC0 +ENDCHAR +STARTCHAR U_9EBE +ENCODING 40638 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +5F80 +4400 +7FC0 +8420 +83E0 +ENDCHAR +STARTCHAR U_9EBF +ENCODING 40639 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +5DC0 +6AA0 +4F80 +4880 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_9EC0 +ENCODING 40640 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8880 +FFE0 +ADC0 +CAA0 +FFE0 +A540 +BC80 +A540 +FE20 +ENDCHAR +STARTCHAR U_9EC1 +ENCODING 40641 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FC0 +5DC0 +6AA0 +5FC0 +4A80 +7FE0 +8880 +8F80 +ENDCHAR +STARTCHAR U_9EC2 +ENCODING 40642 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4880 +7FE0 +4A80 +7FE0 +5080 +5F80 +5080 +9F80 +B0C0 +ENDCHAR +STARTCHAR U_9EC3 +ENCODING 40643 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1F00 +0000 +FFE0 +2480 +3F80 +2480 +3F80 +C060 +ENDCHAR +STARTCHAR U_9EC4 +ENCODING 40644 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +1100 +FFE0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +60C0 +ENDCHAR +STARTCHAR U_9EC5 +ENCODING 40645 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5280 +FA40 +2520 +F880 +ABC0 +F840 +A880 +F880 +8500 +ENDCHAR +STARTCHAR U_9EC6 +ENCODING 40646 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +57E0 +FD20 +2140 +F900 +A980 +F980 +AA80 +FAA0 +8C60 +ENDCHAR +STARTCHAR U_9EC7 +ENCODING 40647 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +51E0 +FD00 +2100 +FBC0 +AA40 +FA40 +AA40 +FA40 +8FC0 +ENDCHAR +STARTCHAR U_9EC8 +ENCODING 40648 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F880 +53E0 +F880 +2080 +F880 +ABE0 +F880 +A880 +F880 +8FE0 +ENDCHAR +STARTCHAR U_9EC9 +ENCODING 40649 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +9220 +7F80 +1200 +FFE0 +2480 +3F80 +2480 +3F80 +C060 +ENDCHAR +STARTCHAR U_9ECA +ENCODING 40650 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5080 +F880 +53E0 +F880 +27E0 +F880 +A880 +FBE0 +A880 +F880 +8FE0 +ENDCHAR +STARTCHAR U_9ECB +ENCODING 40651 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +AFC0 +7280 +27E0 +FD40 +57C0 +5540 +57C0 +5440 +5820 +8FE0 +ENDCHAR +STARTCHAR U_9ECC +ENCODING 40652 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +6AC0 +75C0 +4A40 +FFE0 +9120 +FFE0 +4440 +7FC0 +4440 +7FC0 +C060 +ENDCHAR +STARTCHAR U_9ECD +ENCODING 40653 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +1500 +2480 +CE60 +1500 +74E0 +0F00 +3480 +CC60 +ENDCHAR +STARTCHAR U_9ECE +ENCODING 40654 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +23E0 +FCA0 +70A0 +AD20 +2AC0 +1500 +F5E0 +0E00 +75C0 +0C00 +ENDCHAR +STARTCHAR U_9ECF +ENCODING 40655 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7C80 +1080 +FEE0 +5480 +9280 +29E0 +D720 +5520 +3920 +5520 +B3E0 +ENDCHAR +STARTCHAR U_9ED0 +ENCODING 40656 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +27E0 +FEA0 +7520 +AEA0 +77E0 +A900 +AFE0 +7560 +AFA0 +6460 +ENDCHAR +STARTCHAR U_9ED1 +ENCODING 40657 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +5540 +4E40 +7FC0 +0400 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_9ED2 +ENCODING 40658 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0400 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_9ED3 +ENCODING 40659 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F940 +A920 +F900 +AFE0 +F900 +2100 +F900 +20A0 +F8A0 +D460 +A820 +ENDCHAR +STARTCHAR U_9ED4 +ENCODING 40660 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +FA80 +AC40 +F920 +2080 +FBE0 +2040 +FC80 +6880 +9500 +ENDCHAR +STARTCHAR U_9ED5 +ENCODING 40661 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +FBE0 +AAA0 +FAA0 +2080 +F880 +2080 +F9A0 +56A0 +9460 +ENDCHAR +STARTCHAR U_9ED6 +ENCODING 40662 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A880 +FA80 +AA80 +FFE0 +2080 +F880 +2180 +FAA0 +54A0 +9460 +ENDCHAR +STARTCHAR U_9ED7 +ENCODING 40663 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A900 +FFE0 +A900 +FD40 +2540 +F7C0 +2100 +F900 +5120 +A8E0 +ENDCHAR +STARTCHAR U_9ED8 +ENCODING 40664 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A980 +F940 +AFE0 +F900 +2100 +F900 +2280 +FA80 +5440 +A820 +ENDCHAR +STARTCHAR U_9ED9 +ENCODING 40665 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A940 +F920 +AFE0 +F900 +2280 +F280 +2460 +F800 +5240 +8920 +ENDCHAR +STARTCHAR U_9EDA +ENCODING 40666 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +AA40 +FFE0 +AA40 +FA40 +23C0 +FA40 +2240 +FA40 +6A40 +97C0 +ENDCHAR +STARTCHAR U_9EDB +ENCODING 40667 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +5FE0 +C120 +7FE0 +2A80 +3F80 +0400 +3F80 +0400 +FFE0 +4A40 +ENDCHAR +STARTCHAR U_9EDC +ENCODING 40668 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AAA0 +FAA0 +AAA0 +FBE0 +2080 +F880 +22A0 +FAA0 +52A0 +ABE0 +ENDCHAR +STARTCHAR U_9EDD +ENCODING 40669 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +AA80 +FC80 +ADE0 +FAA0 +22A0 +FDA0 +27A0 +F8A0 +5120 +AAC0 +ENDCHAR +STARTCHAR U_9EDE +ENCODING 40670 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +F8E0 +A880 +F880 +23E0 +FA20 +2220 +FA20 +5220 +ABE0 +ENDCHAR +STARTCHAR U_9EDF +ENCODING 40671 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +A9E0 +FA20 +A940 +F880 +23E0 +F920 +22A0 +F840 +5080 +AB00 +ENDCHAR +STARTCHAR U_9EE0 +ENCODING 40672 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A880 +FFE0 +A880 +FBE0 +2000 +FBE0 +2220 +FA20 +5220 +ABE0 +ENDCHAR +STARTCHAR U_9EE1 +ENCODING 40673 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4240 +7FE0 +4880 +7FE0 +5AC0 +5740 +5FC0 +4200 +BFE0 +94A0 +ENDCHAR +STARTCHAR U_9EE2 +ENCODING 40674 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AA40 +FFE0 +A940 +FA20 +2500 +F9E0 +2340 +FC80 +5140 +AE20 +ENDCHAR +STARTCHAR U_9EE3 +ENCODING 40675 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +ABE0 +FC00 +AFC0 +FD40 +27E0 +FC40 +2540 +FFE0 +A940 +A880 +ENDCHAR +STARTCHAR U_9EE4 +ENCODING 40676 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AFE0 +F940 +AAA0 +FFE0 +22A0 +FBE0 +22A0 +FBE0 +50A0 +A8E0 +ENDCHAR +STARTCHAR U_9EE5 +ENCODING 40677 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +F800 +ABE0 +FA20 +23E0 +F880 +22C0 +FAA0 +54A0 +A980 +ENDCHAR +STARTCHAR U_9EE6 +ENCODING 40678 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +FC20 +AA00 +FBE0 +22A0 +FCA0 +22E0 +F980 +52A0 +ACE0 +ENDCHAR +STARTCHAR U_9EE7 +ENCODING 40679 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FD20 +6A20 +A440 +7FC0 +5540 +7FC0 +0400 +FFC0 +8920 +ENDCHAR +STARTCHAR U_9EE8 +ENCODING 40680 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +FFE0 +A0A0 +7FC0 +4A40 +7FC0 +0400 +7FC0 +0400 +FFE0 +9220 +ENDCHAR +STARTCHAR U_9EE9 +ENCODING 40681 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +ABE0 +F880 +AFE0 +FA20 +2580 +FA80 +27E0 +F880 +5140 +AE20 +ENDCHAR +STARTCHAR U_9EEA +ENCODING 40682 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AA40 +FFE0 +A880 +FFE0 +2280 +FD40 +22A0 +FD40 +5280 +A900 +ENDCHAR +STARTCHAR U_9EEB +ENCODING 40683 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +AA80 +FFE0 +AAA0 +FAA0 +22A0 +FFE0 +2080 +FBE0 +5080 +AFE0 +ENDCHAR +STARTCHAR U_9EEC +ENCODING 40684 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F8C0 +A8A0 +FFE0 +AC80 +FF80 +24A0 +FFA0 +2540 +FFC0 +D560 +AA20 +ENDCHAR +STARTCHAR U_9EED +ENCODING 40685 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A940 +FBE0 +AC00 +FBE0 +2220 +FBE0 +2240 +FFE0 +5240 +AC40 +ENDCHAR +STARTCHAR U_9EEE +ENCODING 40686 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA40 +AFE0 +FA40 +ABC0 +FA40 +23C0 +FA40 +27E0 +FD40 +5620 +AFE0 +ENDCHAR +STARTCHAR U_9EEF +ENCODING 40687 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +FA20 +A940 +FFE0 +2000 +FBE0 +2220 +FBE0 +0220 +ABE0 +ENDCHAR +STARTCHAR U_9EF0 +ENCODING 40688 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +AFE0 +F900 +ABC0 +FA40 +23C0 +FA40 +23C0 +FA40 +57E0 +AA40 +ENDCHAR +STARTCHAR U_9EF1 +ENCODING 40689 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0540 +77C0 +5100 +5FE0 +7440 +5FE0 +7540 +57C0 +5100 +9FE0 +2AA0 +ENDCHAR +STARTCHAR U_9EF2 +ENCODING 40690 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +A940 +FBE0 +AAA0 +FFE0 +2240 +FD20 +22A0 +F940 +5080 +AB00 +ENDCHAR +STARTCHAR U_9EF3 +ENCODING 40691 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9260 +FFC0 +A940 +FFE0 +5540 +7FC0 +0400 +FFE0 +5240 +8920 +ENDCHAR +STARTCHAR U_9EF4 +ENCODING 40692 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3580 +5F80 +80E0 +3FA0 +55A0 +DFA0 +44A0 +5FA0 +4440 +5FA0 +5520 +ENDCHAR +STARTCHAR U_9EF5 +ENCODING 40693 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +ABE0 +FEA0 +AB40 +FBE0 +2200 +FBE0 +2200 +FDE0 +5120 +A9E0 +ENDCHAR +STARTCHAR U_9EF6 +ENCODING 40694 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +A4A0 +BFE0 +B480 +AD40 +BFE0 +AAA0 +BFE0 +8200 +FFE0 +A920 +ENDCHAR +STARTCHAR U_9EF7 +ENCODING 40695 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F880 +AFE0 +F880 +AFE0 +FAA0 +2FE0 +FA40 +23C0 +FA40 +53C0 +AC20 +ENDCHAR +STARTCHAR U_9EF8 +ENCODING 40696 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F9C0 +A900 +FFE0 +AD40 +FF80 +2520 +FCE0 +26A0 +FFE0 +AAA0 +B7E0 +ENDCHAR +STARTCHAR U_9EF9 +ENCODING 40697 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4A40 +2A80 +FFE0 +2480 +1500 +7FC0 +4640 +4D40 +54C0 +6440 +44C0 +ENDCHAR +STARTCHAR U_9EFA +ENCODING 40698 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AA40 +6D40 +2920 +FE20 +5400 +FFE0 +9520 +B520 +DD20 +95A0 +9640 +ENDCHAR +STARTCHAR U_9EFB +ENCODING 40699 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A940 +6D20 +2BE0 +FD00 +5500 +FDC0 +9540 +B740 +DE80 +9540 +9620 +ENDCHAR +STARTCHAR U_9EFC +ENCODING 40700 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +AAC0 +6CA0 +29E0 +FE80 +55E0 +FEA0 +93E0 +BAA0 +D7E0 +92A0 +96E0 +ENDCHAR +STARTCHAR U_9EFD +ENCODING 40701 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFC0 +9240 +F3C0 +1200 +F3C0 +9240 +F3C0 +9240 +F3C0 +1220 +0FE0 +ENDCHAR +STARTCHAR U_9EFE +ENCODING 40702 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F00 +4100 +7F00 +0800 +FF80 +8880 +FF80 +8880 +FF80 +0840 +07C0 +ENDCHAR +STARTCHAR U_9EFF +ENCODING 40703 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +FFC0 +1220 +FFE0 +4A40 +FBC0 +8A40 +FBC0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F00 +ENCODING 40704 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +4040 +BFA0 +2A80 +7BC0 +4A40 +7BC0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F01 +ENCODING 40705 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +1100 +7FC0 +4A40 +FBC0 +8A40 +FBC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_9F02 +ENCODING 40706 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +FFE0 +0000 +3F80 +2A80 +FBE0 +AAA0 +FBE0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F03 +ENCODING 40707 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0400 +FFE0 +0000 +FFE0 +4A40 +FBE0 +AAA0 +FBE0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F04 +ENCODING 40708 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +4400 +FFE0 +2480 +7FC0 +AAA0 +7BC0 +4A40 +7BC0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F05 +ENCODING 40709 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9120 +FFE0 +4400 +BF80 +2A80 +7BC0 +4A40 +7BC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_9F06 +ENCODING 40710 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +86A0 +7BE0 +4880 +7BE0 +4AA0 +7BE0 +12A0 +FFE0 +28A0 +44E0 +ENDCHAR +STARTCHAR U_9F07 +ENCODING 40711 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA00 +23E0 +FD40 +4880 +FFE0 +4A80 +FBC0 +8A40 +FBC0 +0A20 +0FE0 +ENDCHAR +STARTCHAR U_9F08 +ENCODING 40712 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +A900 +73E0 +FD40 +A880 +A960 +3F80 +2A80 +7BC0 +4A40 +7BA0 +07E0 +ENDCHAR +STARTCHAR U_9F09 +ENCODING 40713 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FFE0 +4440 +FFE0 +4A40 +FFC0 +8A40 +8BC0 +FA20 +0FE0 +ENDCHAR +STARTCHAR U_9F0A +ENCODING 40714 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4940 +7FE0 +A480 +7FC0 +4A40 +FBE0 +8A20 +FBE0 +0A20 +07E0 +ENDCHAR +STARTCHAR U_9F0B +ENCODING 40715 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +0000 +7FC0 +2220 +FFE0 +2080 +7FC0 +4440 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9F0C +ENCODING 40716 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2500 +FFE0 +2080 +7FC0 +4440 +7FC0 +4440 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9F0D +ENCODING 40717 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +7FC0 +2480 +FFE0 +2100 +7FC0 +4440 +7FC0 +0420 +03E0 +ENDCHAR +STARTCHAR U_9F0E +ENCODING 40718 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +1080 +1F80 +50A0 +5FA0 +50A0 +7FE0 +0900 +F9E0 +4920 +8920 +ENDCHAR +STARTCHAR U_9F0F +ENCODING 40719 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8020 +1F00 +5140 +5F40 +5140 +7FC0 +0A00 +FBE0 +4A40 +8A40 +ENDCHAR +STARTCHAR U_9F10 +ENCODING 40720 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7F80 +11E0 +2020 +DF60 +1100 +5F40 +5140 +7FC0 +0A00 +7BE0 +8A20 +ENDCHAR +STARTCHAR U_9F11 +ENCODING 40721 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0780 +0400 +5F40 +5540 +5B40 +5540 +7FC0 +0900 +F9E0 +4920 +8920 +ENDCHAR +STARTCHAR U_9F12 +ENCODING 40722 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +0A00 +7F00 +1100 +5F40 +5140 +7FC0 +0A00 +7BE0 +8A40 +ENDCHAR +STARTCHAR U_9F13 +ENCODING 40723 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FC80 +23E0 +7880 +03E0 +7A20 +4940 +7940 +4880 +3D40 +C620 +ENDCHAR +STARTCHAR U_9F14 +ENCODING 40724 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FD00 +11E0 +7900 +07E0 +7C40 +4A40 +7980 +2980 +3260 +CC40 +ENDCHAR +STARTCHAR U_9F15 +ENCODING 40725 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBC0 +8940 +FE80 +5140 +FE20 +1100 +E4E0 +0A00 +0400 +ENDCHAR +STARTCHAR U_9F16 +ENCODING 40726 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +1500 +FFE0 +2080 +FFE0 +2080 +FBE0 +8940 +F880 +5140 +FA20 +ENDCHAR +STARTCHAR U_9F17 +ENCODING 40727 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2A80 +5B40 +F9E0 +2080 +FFE0 +2080 +FBE0 +8940 +F880 +5140 +FA20 +ENDCHAR +STARTCHAR U_9F18 +ENCODING 40728 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5360 +FA40 +7FC0 +4040 +7BC0 +8A40 +ENDCHAR +STARTCHAR U_9F19 +ENCODING 40729 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F8C0 +FFA0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_9F1A +ENCODING 40730 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5160 +FF80 +2000 +FFE0 +2280 +39E0 +ENDCHAR +STARTCHAR U_9F1B +ENCODING 40731 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5760 +F980 +5140 +3FE0 +E080 +3F80 +ENDCHAR +STARTCHAR U_9F1C +ENCODING 40732 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +F880 +5360 +FF80 +2A00 +7FC0 +A4A0 +FFC0 +ENDCHAR +STARTCHAR U_9F1D +ENCODING 40733 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4AA0 +AEE0 +4820 +CEE0 +52A0 +FFE0 +2900 +3BC0 +2A40 +1980 +E660 +ENDCHAR +STARTCHAR U_9F1E +ENCODING 40734 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +8940 +FC80 +5540 +FFE0 +9120 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_9F1F +ENCODING 40735 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +2A80 +3900 +2A80 +FE80 +2940 +3F80 +D160 +0E00 +7FC0 +ENDCHAR +STARTCHAR U_9F20 +ENCODING 40736 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F780 +8080 +F780 +8080 +FF80 +0000 +CD00 +AB00 +CD40 +AAC0 +EE40 +ENDCHAR +STARTCHAR U_9F21 +ENCODING 40737 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2480 +0100 +3FC0 +2440 +3FC0 +2440 +3FC0 +2440 +4440 +8420 +ENDCHAR +STARTCHAR U_9F22 +ENCODING 40738 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8940 +D940 +8A20 +FC20 +ABE0 +F920 +A920 +FA20 +A4A0 +F240 +ENDCHAR +STARTCHAR U_9F23 +ENCODING 40739 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +88C0 +D8A0 +8880 +FFE0 +A880 +F880 +A940 +F940 +A620 +F220 +ENDCHAR +STARTCHAR U_9F24 +ENCODING 40740 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8880 +DFE0 +8A40 +FA40 +AA40 +F980 +A880 +F940 +A640 +F220 +ENDCHAR +STARTCHAR U_9F25 +ENCODING 40741 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5940 +8920 +DFE0 +8900 +F900 +A9E0 +FA20 +AD40 +F880 +A540 +F220 +ENDCHAR +STARTCHAR U_9F26 +ENCODING 40742 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8920 +D920 +8920 +FAC0 +AC00 +F9E0 +A920 +F920 +AD20 +E5E0 +ENDCHAR +STARTCHAR U_9F27 +ENCODING 40743 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8880 +DFE0 +8C20 +FA00 +AA40 +FB80 +AA00 +FA20 +AE20 +F5E0 +ENDCHAR +STARTCHAR U_9F28 +ENCODING 40744 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5900 +8900 +D9E0 +8A20 +FD40 +A880 +F940 +AEA0 +F840 +A480 +F240 +ENDCHAR +STARTCHAR U_9F29 +ENCODING 40745 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5A00 +8A00 +DBE0 +8C20 +FBA0 +AAA0 +FBA0 +A820 +F820 +AAA0 +F640 +ENDCHAR +STARTCHAR U_9F2A +ENCODING 40746 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8A80 +DBE0 +8C80 +F880 +A880 +FBE0 +A880 +F880 +A880 +F7E0 +ENDCHAR +STARTCHAR U_9F2B +ENCODING 40747 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8880 +D880 +8900 +F9E0 +AB20 +FD20 +A920 +FD20 +AD20 +F5E0 +ENDCHAR +STARTCHAR U_9F2C +ENCODING 40748 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8880 +DBE0 +8AA0 +FAA0 +AAA0 +FBE0 +AAA0 +FEA0 +AEA0 +F7E0 +ENDCHAR +STARTCHAR U_9F2D +ENCODING 40749 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8BE0 +D880 +8FE0 +F840 +AFE0 +F840 +AA40 +F940 +AC40 +F4C0 +ENDCHAR +STARTCHAR U_9F2E +ENCODING 40750 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5E00 +8AE0 +DA40 +8A40 +FCE0 +AA40 +FA40 +AE40 +FAE0 +AB00 +F4E0 +ENDCHAR +STARTCHAR U_9F2F +ENCODING 40751 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +8900 +DBC0 +8940 +F940 +AFE0 +F800 +ABC0 +FA40 +AA40 +F7C0 +ENDCHAR +STARTCHAR U_9F30 +ENCODING 40752 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8A20 +DA20 +8BE0 +FA20 +ABE0 +FA20 +AA20 +FBE0 +A940 +F620 +ENDCHAR +STARTCHAR U_9F31 +ENCODING 40753 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8BE0 +D880 +8BE0 +F880 +AFE0 +FA20 +ABE0 +FA20 +ABE0 +F620 +ENDCHAR +STARTCHAR U_9F32 +ENCODING 40754 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8CA0 +DBE0 +8AA0 +FBE0 +AAA0 +FBE0 +A880 +FFE0 +A880 +F480 +ENDCHAR +STARTCHAR U_9F33 +ENCODING 40755 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8A20 +DBE0 +8A20 +FBE0 +A940 +F920 +AFE0 +F900 +AA80 +F460 +ENDCHAR +STARTCHAR U_9F34 +ENCODING 40756 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8AA0 +DAE0 +8AA0 +FAE0 +AA40 +FBE0 +AAA0 +FA40 +AAA0 +F7E0 +ENDCHAR +STARTCHAR U_9F35 +ENCODING 40757 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5880 +8FE0 +DC20 +8A40 +FD20 +A940 +FFE0 +A900 +F980 +AA40 +F420 +ENDCHAR +STARTCHAR U_9F36 +ENCODING 40758 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8A80 +DAE0 +8A80 +FBE0 +AAA0 +FBE0 +AA80 +FBE0 +AB40 +F560 +ENDCHAR +STARTCHAR U_9F37 +ENCODING 40759 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +58C0 +8F20 +DAA0 +8940 +FB80 +A940 +FFE0 +A880 +FBE0 +A940 +F620 +ENDCHAR +STARTCHAR U_9F38 +ENCODING 40760 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5A40 +8FE0 +DA80 +8FE0 +FAA0 +AFE0 +FAA0 +AFE0 +FE80 +AAC0 +F6A0 +ENDCHAR +STARTCHAR U_9F39 +ENCODING 40761 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BC0 +8A40 +DBC0 +8A40 +FFE0 +AD20 +FBE0 +A940 +FA40 +A980 +F660 +ENDCHAR +STARTCHAR U_9F3A +ENCODING 40762 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5BE0 +8AA0 +DBE0 +8AA0 +FBE0 +A800 +FFE0 +AAA0 +FFE0 +AAA0 +E7E0 +ENDCHAR +STARTCHAR U_9F3B +ENCODING 40763 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2480 +2280 +7FC0 +4440 +7FC0 +4440 +FFE0 +1100 +6100 +ENDCHAR +STARTCHAR U_9F3C +ENCODING 40764 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +3C20 +24A0 +7EA0 +52A0 +7EA0 +52E0 +FEA0 +2420 +2420 +4420 +ENDCHAR +STARTCHAR U_9F3D +ENCODING 40765 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7900 +4900 +7BC0 +4940 +F940 +A940 +D940 +FE40 +5240 +9460 +ENDCHAR +STARTCHAR U_9F3E +ENCODING 40766 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7BE0 +4880 +7880 +4880 +FFE0 +D480 +AC80 +FE80 +4880 +8880 +ENDCHAR +STARTCHAR U_9F3F +ENCODING 40767 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +77E0 +5280 +5280 +FA80 +AA80 +FA80 +AAA0 +FAA0 +54A0 +98E0 +ENDCHAR +STARTCHAR U_9F40 +ENCODING 40768 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7100 +5100 +5380 +FA80 +AB80 +FA80 +AA80 +FEA0 +52A0 +9360 +ENDCHAR +STARTCHAR U_9F41 +ENCODING 40769 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +7200 +53E0 +5420 +FBA0 +AAA0 +FAA0 +ABA0 +F820 +50A0 +9040 +ENDCHAR +STARTCHAR U_9F42 +ENCODING 40770 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +77C0 +5140 +57E0 +F940 +AFC0 +F900 +AD40 +FB80 +5560 +9300 +ENDCHAR +STARTCHAR U_9F43 +ENCODING 40771 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +7240 +53C0 +5240 +FBC0 +A900 +FBE0 +ADA0 +FA60 +53A0 +9060 +ENDCHAR +STARTCHAR U_9F44 +ENCODING 40772 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +73E0 +51C0 +52A0 +FFE0 +AA20 +FBE0 +AA20 +FBE0 +5000 +93E0 +ENDCHAR +STARTCHAR U_9F45 +ENCODING 40773 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BE0 +4A20 +7BE0 +4A20 +FFE0 +A4A0 +97E0 +FC80 +4940 +8A20 +ENDCHAR +STARTCHAR U_9F46 +ENCODING 40774 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +7D40 +4AA0 +7BC0 +4A40 +FBE0 +AAA0 +DBE0 +FE00 +4A20 +89E0 +ENDCHAR +STARTCHAR U_9F47 +ENCODING 40775 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +7100 +57E0 +7520 +57C0 +FD20 +DFE0 +AA40 +FBC0 +5240 +97E0 +ENDCHAR +STARTCHAR U_9F48 +ENCODING 40776 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +7FE0 +4AA0 +7FE0 +4AA0 +FFE0 +A800 +DFE0 +FAA0 +4A40 +8B20 +ENDCHAR +STARTCHAR U_9F49 +ENCODING 40777 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +7240 +57E0 +75A0 +5240 +FFE0 +DA40 +AFE0 +FAA0 +5640 +9B20 +ENDCHAR +STARTCHAR U_9F4A +ENCODING 40778 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A40 +F580 +5540 +95A0 +2080 +3F80 +2080 +3F80 +C080 +ENDCHAR +STARTCHAR U_9F4B +ENCODING 40779 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +A020 +3FC0 +2040 +3FC0 +5540 +A4C0 +ENDCHAR +STARTCHAR U_9F4C +ENCODING 40780 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +B5A0 +4040 +7FC0 +5540 +4A40 +9140 +ENDCHAR +STARTCHAR U_9F4D +ENCODING 40781 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +A520 +7FC0 +4040 +FFC0 +5540 +FFE0 +ENDCHAR +STARTCHAR U_9F4E +ENCODING 40782 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +FFE0 +4040 +7FC0 +5540 +5F40 +B1C0 +ENDCHAR +STARTCHAR U_9F4F +ENCODING 40783 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0A20 +F5C0 +5540 +B5A0 +7FC0 +4A40 +7BC0 +4A40 +BFC0 +ENDCHAR +STARTCHAR U_9F50 +ENCODING 40784 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1080 +0900 +0600 +1980 +E060 +0900 +0900 +1100 +6100 +ENDCHAR +STARTCHAR U_9F51 +ENCODING 40785 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0900 +0600 +F9E0 +4A40 +7BC0 +4A40 +7BC0 +4A40 +BFC0 +ENDCHAR +STARTCHAR U_9F52 +ENCODING 40786 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +5140 +6AC0 +4440 +7FC0 +5140 +6AC0 +7FC0 +ENDCHAR +STARTCHAR U_9F53 +ENCODING 40787 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +5100 +FF00 +0100 +AD00 +D500 +FD00 +AD00 +D520 +FCE0 +ENDCHAR +STARTCHAR U_9F54 +ENCODING 40788 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +5100 +FD20 +D540 +AD80 +FD00 +8500 +D520 +AD20 +FCE0 +ENDCHAR +STARTCHAR U_9F55 +ENCODING 40789 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +BD00 +A1E0 +FE00 +85E0 +D440 +AC80 +FD00 +D520 +AE20 +FDE0 +ENDCHAR +STARTCHAR U_9F56 +ENCODING 40790 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BC40 +A140 +FD40 +87E0 +D440 +ACC0 +FD40 +D640 +AC40 +FCC0 +ENDCHAR +STARTCHAR U_9F57 +ENCODING 40791 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1060 +5D80 +5100 +FD00 +85E0 +D540 +AD40 +FD40 +D540 +AE40 +FE40 +ENDCHAR +STARTCHAR U_9F58 +ENCODING 40792 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5140 +FE20 +8540 +D540 +AD40 +FD40 +D540 +AD40 +FE40 +ENDCHAR +STARTCHAR U_9F59 +ENCODING 40793 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5FE0 +5420 +FFA0 +84A0 +D4A0 +AFA0 +FC20 +D4C0 +AC20 +FFE0 +ENDCHAR +STARTCHAR U_9F5A +ENCODING 40794 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5900 +53E0 +FD00 +0100 +ADE0 +D500 +FDE0 +AD00 +D500 +FD00 +ENDCHAR +STARTCHAR U_9F5B +ENCODING 40795 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D40 +5540 +FFE0 +8540 +D540 +AD40 +FD40 +D5C0 +AC00 +FFE0 +ENDCHAR +STARTCHAR U_9F5C +ENCODING 40796 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5D40 +5140 +FD60 +85C0 +D540 +AD40 +FD40 +D540 +ADC0 +FE60 +ENDCHAR +STARTCHAR U_9F5D +ENCODING 40797 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5080 +FD20 +87E0 +AC00 +D5E0 +FD20 +D520 +AD20 +FDE0 +ENDCHAR +STARTCHAR U_9F5E +ENCODING 40798 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +5D20 +5120 +FD20 +8520 +ADE0 +D400 +FC00 +D540 +AD20 +FE20 +ENDCHAR +STARTCHAR U_9F5F +ENCODING 40799 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +5D40 +5140 +FF40 +85C0 +AD40 +D540 +FDC0 +D540 +AD40 +FFE0 +ENDCHAR +STARTCHAR U_9F60 +ENCODING 40800 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5D20 +5120 +FD20 +86C0 +AC00 +D5E0 +FD20 +D520 +AD20 +FDE0 +ENDCHAR +STARTCHAR U_9F61 +ENCODING 40801 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5140 +FE20 +8500 +D480 +AFE0 +FC40 +D580 +AC40 +FC40 +ENDCHAR +STARTCHAR U_9F62 +ENCODING 40802 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5980 +5240 +FD20 +0080 +D800 +AFE0 +F840 +AA80 +D900 +F880 +ENDCHAR +STARTCHAR U_9F63 +ENCODING 40803 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +51E0 +FE20 +8420 +AFA0 +D6A0 +FEA0 +D7A0 +AC20 +FCC0 +ENDCHAR +STARTCHAR U_9F64 +ENCODING 40804 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2500 +7FC0 +0800 +FFE0 +5240 +FFA0 +5540 +7FC0 +4A40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_9F65 +ENCODING 40805 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BFE0 +A2A0 +FFE0 +D6A0 +AFE0 +A480 +FCA0 +D440 +ACA0 +FD20 +ENDCHAR +STARTCHAR U_9F66 +ENCODING 40806 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +BD20 +A120 +FDE0 +D520 +ADE0 +A5A0 +FD40 +D540 +ADA0 +FD20 +ENDCHAR +STARTCHAR U_9F67 +ENCODING 40807 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2120 +FE40 +2400 +FFE0 +0A00 +5540 +7FC0 +4A40 +5540 +7FC0 +ENDCHAR +STARTCHAR U_9F68 +ENCODING 40808 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5A60 +5220 +FE20 +0220 +AB60 +DA20 +FA20 +AA20 +DBE0 +FA20 +ENDCHAR +STARTCHAR U_9F69 +ENCODING 40809 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5BE0 +5140 +FE20 +0140 +AD40 +D540 +FC80 +AC80 +D540 +FE20 +ENDCHAR +STARTCHAR U_9F6A +ENCODING 40810 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +BD20 +A120 +FFE0 +D440 +AD40 +A560 +FD40 +D540 +AD40 +FEE0 +ENDCHAR +STARTCHAR U_9F6B +ENCODING 40811 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +BC20 +A4A0 +FFE0 +84A0 +D5E0 +AEA0 +FCA0 +D4A0 +AC20 +FFE0 +ENDCHAR +STARTCHAR U_9F6C +ENCODING 40812 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BC80 +A3E0 +FD20 +87E0 +D400 +ADE0 +FD20 +D520 +ADE0 +FD20 +ENDCHAR +STARTCHAR U_9F6D +ENCODING 40813 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1120 +5AC0 +5280 +FBE0 +02A0 +ABA0 +DAA0 +FAA0 +AAA0 +DAA0 +FD20 +ENDCHAR +STARTCHAR U_9F6E +ENCODING 40814 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BBE0 +A080 +FD40 +87E0 +D420 +AFA0 +FEA0 +D7A0 +AC20 +FC60 +ENDCHAR +STARTCHAR U_9F6F +ENCODING 40815 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BB60 +A220 +FF60 +D620 +AE20 +A7E0 +FD40 +D540 +AD40 +FE60 +ENDCHAR +STARTCHAR U_9F70 +ENCODING 40816 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1140 +5BE0 +5140 +FFE0 +8400 +D5E0 +AD20 +FDE0 +D520 +ADE0 +FD20 +ENDCHAR +STARTCHAR U_9F71 +ENCODING 40817 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2780 +BD00 +A5E0 +FF20 +8520 +D5A0 +AFA0 +FD40 +D740 +ADA0 +FD20 +ENDCHAR +STARTCHAR U_9F72 +ENCODING 40818 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +B880 +A3E0 +FAA0 +03E0 +A880 +DBE0 +FAA0 +ABE0 +DA20 +FA60 +ENDCHAR +STARTCHAR U_9F73 +ENCODING 40819 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +5CA0 +57E0 +F880 +03E0 +AAA0 +DBE0 +FAA0 +AFE0 +D880 +F880 +ENDCHAR +STARTCHAR U_9F74 +ENCODING 40820 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +BBE0 +A140 +FBE0 +8A20 +AA40 +DAA0 +FA40 +AAA0 +DA40 +FD80 +ENDCHAR +STARTCHAR U_9F75 +ENCODING 40821 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BAA0 +A3E0 +FEA0 +03E0 +A880 +DBE0 +FAA0 +ABE0 +DA20 +FA60 +ENDCHAR +STARTCHAR U_9F76 +ENCODING 40822 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BAA0 +A3E0 +FC00 +01E0 +D400 +AFE0 +FC80 +D5E0 +AC20 +FCC0 +ENDCHAR +STARTCHAR U_9F77 +ENCODING 40823 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +BC20 +A7E0 +FC00 +07E0 +D540 +AFE0 +FC80 +D7E0 +AC80 +FFE0 +ENDCHAR +STARTCHAR U_9F78 +ENCODING 40824 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2220 +B940 +A3E0 +FC00 +0140 +D620 +AFE0 +FCA0 +D4A0 +ACA0 +FFE0 +ENDCHAR +STARTCHAR U_9F79 +ENCODING 40825 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7FC0 +0400 +FFE0 +1200 +FFC0 +2400 +FFE0 +5140 +6AC0 +7FC0 +ENDCHAR +STARTCHAR U_9F7A +ENCODING 40826 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5BE0 +52A0 +FFE0 +84A0 +D740 +ADE0 +FEA0 +D7E0 +ACA0 +FD40 +ENDCHAR +STARTCHAR U_9F7B +ENCODING 40827 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5DE0 +5080 +FDE0 +D520 +ADE0 +8520 +FDE0 +D520 +AFE0 +FD20 +ENDCHAR +STARTCHAR U_9F7C +ENCODING 40828 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1280 +5FE0 +5280 +FFC0 +02A0 +AFE0 +D880 +FAC0 +AA80 +DB80 +FCE0 +ENDCHAR +STARTCHAR U_9F7D +ENCODING 40829 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2240 +B7E0 +A2C0 +FF60 +0240 +ABE0 +D800 +FFE0 +A9C0 +DAA0 +F980 +ENDCHAR +STARTCHAR U_9F7E +ENCODING 40830 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +38C0 +FCA0 +A7E0 +FC80 +AD40 +9620 +FFE0 +4940 +7FC0 +5240 +7FC0 +ENDCHAR +STARTCHAR U_9F7F +ENCODING 40831 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +27C0 +2400 +FFE0 +0000 +4440 +4440 +4A40 +5140 +4040 +7FC0 +ENDCHAR +STARTCHAR U_9F80 +ENCODING 40832 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5D00 +5120 +FD40 +0180 +9500 +9700 +AD00 +C520 +8520 +FCE0 +ENDCHAR +STARTCHAR U_9F81 +ENCODING 40833 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +5DE0 +5200 +FC00 +01C0 +A440 +A480 +B500 +CD20 +8620 +FDE0 +ENDCHAR +STARTCHAR U_9F82 +ENCODING 40834 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +5D80 +5100 +FDE0 +0140 +5540 +5540 +6D40 +4540 +7D40 +0240 +ENDCHAR +STARTCHAR U_9F83 +ENCODING 40835 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +5D40 +5140 +FFC0 +0140 +9540 +95C0 +AD40 +C540 +8540 +FFE0 +ENDCHAR +STARTCHAR U_9F84 +ENCODING 40836 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +5C80 +5140 +FD20 +02A0 +9480 +97E0 +AC40 +C580 +9C80 +E440 +ENDCHAR +STARTCHAR U_9F85 +ENCODING 40837 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +5A00 +53E0 +FC20 +03A0 +AAA0 +ABA0 +DA60 +8A00 +8A20 +F9E0 +ENDCHAR +STARTCHAR U_9F86 +ENCODING 40838 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5920 +5120 +FA20 +04C0 +A800 +ABE0 +AA20 +DA20 +8A20 +FBE0 +ENDCHAR +STARTCHAR U_9F87 +ENCODING 40839 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +5940 +5540 +FD40 +05E0 +A540 +A540 +DD40 +85C0 +FF40 +8460 +ENDCHAR +STARTCHAR U_9F88 +ENCODING 40840 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5A20 +53E0 +FA20 +03E0 +AA80 +AAA0 +AAC0 +DA40 +8AA0 +FB20 +ENDCHAR +STARTCHAR U_9F89 +ENCODING 40841 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +B900 +A3C0 +F940 +07E0 +A800 +ABE0 +DA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_9F8A +ENCODING 40842 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5A20 +5220 +FFE0 +0080 +AA80 +AAE0 +AA80 +DA80 +8D80 +F8E0 +ENDCHAR +STARTCHAR U_9F8B +ENCODING 40843 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5880 +53E0 +FAA0 +03E0 +A880 +ABE0 +AAA0 +DBE0 +8A20 +FA60 +ENDCHAR +STARTCHAR U_9F8C +ENCODING 40844 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +BA20 +A3E0 +FA00 +03E0 +AB40 +ABE0 +DA80 +8DE0 +8880 +FBE0 +ENDCHAR +STARTCHAR U_9F8D +ENCODING 40845 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FD00 +29E0 +FE20 +01E0 +7D00 +45E0 +7D00 +45E0 +7D20 +45E0 +ENDCHAR +STARTCHAR U_9F8E +ENCODING 40846 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4900 +7FC0 +5500 +7FC0 +5440 +5DC0 +5500 +5DC0 +5520 +95E0 +ENDCHAR +STARTCHAR U_9F8F +ENCODING 40847 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +7FC0 +2A00 +FFC0 +2840 +3BC0 +2A20 +2BE0 +1100 +FFE0 +2100 +ENDCHAR +STARTCHAR U_9F90 +ENCODING 40848 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9100 +FFE0 +A900 +FFE0 +A420 +BDE0 +A500 +BD20 +A5E0 +ENDCHAR +STARTCHAR U_9F91 +ENCODING 40849 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +53C0 +FC40 +53C0 +5220 +7FE0 +0400 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_9F92 +ENCODING 40850 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13C0 +FE00 +4BC0 +FC40 +6BC0 +5A20 +7FE0 +0000 +FFE0 +2480 +CC60 +ENDCHAR +STARTCHAR U_9F93 +ENCODING 40851 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +44E0 +FF80 +8AE0 +FF20 +AAE0 +EE80 +AAE0 +EE80 +AAA0 +AAE0 +ENDCHAR +STARTCHAR U_9F94 +ENCODING 40852 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FE00 +53C0 +FC40 +5BC0 +6A20 +7FE0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_9F95 +ENCODING 40853 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +D160 +1F00 +2200 +FBE0 +5200 +FFC0 +4840 +7BC0 +4A20 +5BE0 +ENDCHAR +STARTCHAR U_9F96 +ENCODING 40854 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4940 +EFE0 +AAC0 +EFE0 +0420 +FF60 +B540 +FF60 +B540 +FF40 +AD60 +ENDCHAR +STARTCHAR U_9F97 +ENCODING 40855 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F80 +0400 +FFE0 +AAA0 +3BC0 +1100 +7DC0 +2840 +FDC0 +6920 +59E0 +ENDCHAR +STARTCHAR U_9F98 +ENCODING 40856 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBC0 +5040 +FFC0 +6A20 +5BE0 +E780 +BAE0 +E780 +BAE0 +E380 +BAE0 +ENDCHAR +STARTCHAR U_9F99 +ENCODING 40857 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0880 +0800 +FFE0 +0A00 +0A40 +1280 +1300 +2220 +4620 +99E0 +ENDCHAR +STARTCHAR U_9F9A +ENCODING 40858 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +0A80 +3320 +CDE0 +0900 +7FC0 +0900 +FFE0 +0900 +70E0 +ENDCHAR +STARTCHAR U_9F9B +ENCODING 40859 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1B00 +E0E0 +3F80 +2080 +3F80 +0900 +FFE0 +1280 +2320 +DDE0 +ENDCHAR +STARTCHAR U_9F9C +ENCODING 40860 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FC0 +4040 +7FC0 +2A40 +FB40 +2AC0 +FB40 +2BC0 +6A20 +07E0 +ENDCHAR +STARTCHAR U_9F9D +ENCODING 40861 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3200 +CFC0 +4840 +FEC0 +4280 +FAE0 +CEE0 +5AA0 +4AE0 +4EA0 +59E0 +ENDCHAR +STARTCHAR U_9F9E +ENCODING 40862 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5500 +3BE0 +FE40 +B580 +D640 +1FE0 +7540 +1540 +FDE0 +1520 +73E0 +ENDCHAR +STARTCHAR U_9F9F +ENCODING 40863 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +1F00 +2200 +7FC0 +A440 +3FC0 +2440 +3FC0 +0400 +0420 +03E0 +ENDCHAR +STARTCHAR U_9FA0 +ENCODING 40864 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +3180 +DF60 +EEE0 +AAA0 +EEE0 +0000 +FFE0 +9120 +FFE0 +9120 +ENDCHAR +STARTCHAR U_9FA1 +ENCODING 40865 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +2900 +45E0 +FE20 +AAC0 +FE80 +0080 +FE80 +AA80 +FF40 +AA20 +ENDCHAR +STARTCHAR U_9FA2 +ENCODING 40866 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3840 +4580 +BA80 +01E0 +FE80 +AA80 +FFC0 +AAA0 +FEA0 +AA80 +AE80 +ENDCHAR +STARTCHAR U_9FA3 +ENCODING 40867 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +3040 +4BC0 +FC40 +ABE0 +F8A0 +02C0 +F980 +AAC0 +FCA0 +A900 +ENDCHAR +STARTCHAR U_9FA4 +ENCODING 40868 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +32A0 +4BC0 +B6A0 +FBE0 +A880 +F900 +03E0 +FA20 +ABE0 +FA20 +ABE0 +ENDCHAR +STARTCHAR U_9FA5 +ENCODING 40869 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5080 +8BC0 +FE40 +ABC0 +FA40 +03C0 +FA40 +ABC0 +F980 +AE60 +ENDCHAR +STARTCHAR U_9FA6 +ENCODING 40870 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +2820 +B7C0 +A440 +27C0 +2100 +27E0 +5520 +5560 +8100 +ENDCHAR +STARTCHAR U_9FA7 +ENCODING 40871 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E940 +AFC0 +A240 +EFE0 +A280 +BFE0 +A440 +EFC0 +1440 +07C0 +ENDCHAR +STARTCHAR U_9FA8 +ENCODING 40872 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9400 +BF80 +A400 +FF80 +A400 +BF80 +A400 +BF80 +A000 +FFC0 +ENDCHAR +STARTCHAR U_9FA9 +ENCODING 40873 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1080 +FFE0 +5080 +FC60 +5380 +FA00 +ABE0 +FA40 +2240 +FC40 +2440 +ENDCHAR +STARTCHAR U_9FAA +ENCODING 40874 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +F900 +2100 +F900 +2280 +3A80 +A440 +A820 +E000 +9FE0 +ENDCHAR +STARTCHAR U_9FAB +ENCODING 40875 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +F900 +2280 +FC40 +ABA0 +F900 +A900 +FFE0 +2100 +F900 +2100 +ENDCHAR +STARTCHAR U_9FAC +ENCODING 40876 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +2FE0 +5AA0 +F920 +2FE0 +F920 +2FE0 +BA20 +6BA0 +3820 +C860 +ENDCHAR +STARTCHAR U_9FAD +ENCODING 40877 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +A2A0 +F3E0 +A2A0 +F3E0 +A140 +FBE0 +0940 +ABE0 +8940 +3220 +ENDCHAR +STARTCHAR U_9FAE +ENCODING 40878 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +AAA0 +F660 +AAA0 +F7C0 +A540 +FFC0 +0A80 +AFE0 +8A80 +3440 +ENDCHAR +STARTCHAR U_9FAF +ENCODING 40879 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2140 +3120 +4FE0 +F500 +2520 +FD20 +2CC0 +B480 +64A0 +3560 +CA20 +ENDCHAR +STARTCHAR U_9FB0 +ENCODING 40880 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 -1 +BITMAP +0400 +0400 +0400 +0780 +2400 +2400 +3400 +4C00 +83E0 +ENDCHAR +STARTCHAR U_9FB1 +ENCODING 40881 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 0 -1 +BITMAP +FFC0 +8040 +A140 +9140 +8A40 +8440 +8A40 +9140 +A140 +8040 +FFC0 +ENDCHAR +STARTCHAR U_9FB2 +ENCODING 40882 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5880 +FFE0 +2AA0 +FBE0 +2AA0 +BBE0 +6880 +3FE0 +D080 +ENDCHAR +STARTCHAR U_9FB3 +ENCODING 40883 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +7BC0 +2080 +FBE0 +5140 +AAA0 +2080 +FBE0 +2080 +2080 +FBE0 +ENDCHAR +STARTCHAR U_9FB4 +ENCODING 40884 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 6 1 1 +BITMAP +FF80 +0100 +0A00 +0400 +0200 +0200 +ENDCHAR +STARTCHAR U_9FB5 +ENCODING 40885 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 1 +BITMAP +0380 +3C00 +0400 +7FC0 +0800 +FFE0 +1000 +2000 +C000 +ENDCHAR +STARTCHAR U_9FB6 +ENCODING 40886 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +0400 +0400 +7FC0 +0400 +3F80 +0400 +FFE0 +ENDCHAR +STARTCHAR U_9FB7 +ENCODING 40887 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +1100 +7FC0 +1100 +FFE0 +ENDCHAR +STARTCHAR U_9FB8 +ENCODING 40888 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +0400 +2480 +1500 +7FE0 +4040 +8000 +ENDCHAR +STARTCHAR U_9FB9 +ENCODING 40889 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 9 0 1 +BITMAP +2480 +1500 +7FC0 +0400 +0800 +FFE0 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_9FBA +ENCODING 40890 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 5 11 0 -1 +BITMAP +20 +F8 +20 +F8 +88 +F8 +88 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR U_9FBB +ENCODING 40891 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 8 0 2 +BITMAP +2440 +4E80 +F1E0 +4E80 +F1E0 +0E00 +AAA0 +AEA0 +ENDCHAR +STARTCHAR U_9FBC +ENCODING 40892 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +2FE0 +F540 +2AA0 +2440 +2FE0 +3440 +C7C0 +0440 +07C0 +ENDCHAR +STARTCHAR U_9FBD +ENCODING 40893 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23C0 +2480 +AFE0 +B4A0 +A7E0 +24A0 +37E0 +4800 +46A0 +8AA0 +ENDCHAR +STARTCHAR U_9FBE +ENCODING 40894 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1200 +1200 +7FE0 +5520 +5360 +79A0 +4FE0 +6BA0 +5560 +A920 +C060 +ENDCHAR +STARTCHAR U_9FBF +ENCODING 40895 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +1100 +27C0 +6100 +AFE0 +2100 +27C0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_9FC0 +ENCODING 40896 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7EC0 +4960 +7E80 +5540 +FFE0 +4A40 +5140 +7FC0 +ENDCHAR +STARTCHAR U_9FC1 +ENCODING 40897 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2280 +FFE0 +0280 +F280 +0280 +FFE0 +0000 +F440 +9420 +F820 +ENDCHAR +STARTCHAR U_9FC2 +ENCODING 40898 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FBC0 +2240 +FBC0 +AA40 +FBE0 +AA00 +FBE0 +2020 +FAA0 +2560 +ENDCHAR +STARTCHAR U_9FC3 +ENCODING 40899 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F100 +9FE0 +9100 +F980 +9540 +FBA0 +9100 +9280 +F440 +0820 +ENDCHAR +STARTCHAR U_9FC4 +ENCODING 40900 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +A240 +4E40 +2340 +C440 +4980 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_9FC5 +ENCODING 40901 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2100 +FFE0 +1120 +27C0 +7100 +A280 +2FE0 +2080 +2300 +2080 +ENDCHAR +STARTCHAR U_9FC6 +ENCODING 40902 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F7E0 +1100 +2200 +73C0 +A240 +2540 +2480 +2940 +3220 +ENDCHAR +STARTCHAR U_9FC7 +ENCODING 40903 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +1780 +2900 +6FC0 +A240 +3FE0 +2240 +2FC0 +2200 +2200 +2600 +ENDCHAR +STARTCHAR U_9FC8 +ENCODING 40904 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17C0 +2440 +4440 +9440 +27C0 +6500 +A500 +2480 +2880 +2840 +3020 +ENDCHAR +STARTCHAR U_9FC9 +ENCODING 40905 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +2FE0 +4100 +9100 +2100 +67C0 +A240 +2240 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_9FCA +ENCODING 40906 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +4000 +2100 +8500 +55E0 +2500 +C500 +4500 +4FE0 +ENDCHAR +STARTCHAR U_9FCB +ENCODING 40907 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +F100 +2FE0 +3440 +67C0 +B280 +2FE0 +2440 +2440 +27C0 +ENDCHAR +STARTCHAR U_EEFF +ENCODING 61183 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 5 2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_F6B1 +ENCODING 63153 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4440 +8C20 +8420 +8420 +8420 +8420 +4E40 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B2 +ENCODING 63154 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8120 +8220 +8420 +8920 +4F40 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B3 +ENCODING 63155 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8120 +8220 +8120 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B4 +ENCODING 63156 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4240 +8620 +8A20 +9220 +9F20 +8220 +4740 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B5 +ENCODING 63157 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4E40 +8820 +8820 +8620 +8120 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B6 +ENCODING 63158 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8820 +8E20 +8920 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B7 +ENCODING 63159 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4F40 +8920 +8220 +8220 +8420 +8420 +4440 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B8 +ENCODING 63160 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8920 +8620 +8920 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6B9 +ENCODING 63161 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +4640 +8920 +8920 +8720 +8120 +8920 +4640 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6BA +ENCODING 63162 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2080 +5140 +B2A0 +92A0 +92A0 +92A0 +92A0 +7140 +2080 +1F00 +ENDCHAR +STARTCHAR U_F6BB +ENCODING 63163 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4440 +8C20 +8420 +8420 +8420 +8420 +8420 +8420 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6BC +ENCODING 63164 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9120 +8120 +8220 +8420 +8820 +9120 +5F40 +2080 +ENDCHAR +STARTCHAR U_F6BD +ENCODING 63165 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +8120 +8220 +8620 +8120 +8120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6BE +ENCODING 63166 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4240 +8620 +8620 +8A20 +8A20 +9220 +9F20 +8220 +4740 +2080 +ENDCHAR +STARTCHAR U_F6BF +ENCODING 63167 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F40 +9020 +9020 +9020 +9E20 +8120 +8120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C0 +ENCODING 63168 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9020 +9020 +9620 +9920 +9120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C1 +ENCODING 63169 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5F40 +9120 +8120 +8220 +8220 +8420 +8420 +8420 +4440 +2080 +ENDCHAR +STARTCHAR U_F6C2 +ENCODING 63170 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9120 +9120 +8E20 +9120 +9120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C3 +ENCODING 63171 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +4E40 +9120 +9120 +9120 +8F20 +8120 +8120 +9120 +4E40 +2080 +ENDCHAR +STARTCHAR U_F6C4 +ENCODING 63172 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5240 +B520 +9520 +9520 +9520 +9520 +9520 +9520 +7A40 +2080 +ENDCHAR +STARTCHAR U_F6C5 +ENCODING 63173 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 5 0 +BITMAP +40 +00 +00 +40 +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F6C6 +ENCODING 63174 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +44 +00 +00 +44 +CC +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_F6C7 +ENCODING 63175 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +4900 +0000 +0000 +4900 +DB00 +4900 +4900 +4900 +4900 +FF80 +ENDCHAR +STARTCHAR U_F6C8 +ENCODING 63176 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +4000 +0000 +0000 +5DC0 +C880 +4880 +4500 +4500 +4200 +E200 +ENDCHAR +STARTCHAR U_F6C9 +ENCODING 63177 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 0 +BITMAP +EE +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR U_F6CA +ENCODING 63178 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0080 +0000 +0000 +EE80 +4580 +4480 +2880 +2880 +1080 +11C0 +ENDCHAR +STARTCHAR U_F6CB +ENCODING 63179 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0480 +0000 +0000 +A480 +AD80 +A480 +A480 +4480 +4480 +4FC0 +ENDCHAR +STARTCHAR U_F6CC +ENCODING 63180 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0540 +0000 +0000 +A540 +AFC0 +A540 +A540 +4540 +4540 +4FE0 +ENDCHAR +STARTCHAR U_F6CD +ENCODING 63181 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +4000 +0000 +0000 +4EE0 +C440 +4280 +4100 +4280 +4440 +EEE0 +ENDCHAR +STARTCHAR U_F6CE +ENCODING 63182 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 0 +BITMAP +EE +44 +28 +10 +28 +44 +EE +ENDCHAR +STARTCHAR U_F6CF +ENCODING 63183 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 4 4 3 +BITMAP +80 +40 +20 +20 +ENDCHAR +STARTCHAR U_F6D0 +ENCODING 63184 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 11 3 -1 +BITMAP +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_F6D1 +ENCODING 63185 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 11 4 -1 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +40 +ENDCHAR +STARTCHAR U_F6D2 +ENCODING 63186 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 4 +BITMAP +0400 +0200 +0040 +FFE0 +ENDCHAR +STARTCHAR U_F6D3 +ENCODING 63187 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +8380 +8100 +ENDCHAR +STARTCHAR U_F6D4 +ENCODING 63188 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 5 +BITMAP +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_F6D5 +ENCODING 63189 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 10 1 0 +BITMAP +80 +40 +40 +10 +20 +20 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR U_F6D6 +ENCODING 63190 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +0040 +0040 +0040 +0040 +0440 +0380 +0100 +ENDCHAR +STARTCHAR U_F6D7 +ENCODING 63191 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 12 0 -1 +BITMAP +0040 +FFE0 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4000 +4040 +7FE0 +ENDCHAR +STARTCHAR U_F6D8 +ENCODING 63192 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +84 +FE +84 +84 +84 +84 +9C +88 +80 +80 +80 +ENDCHAR +STARTCHAR U_F6D9 +ENCODING 63193 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0400 +0800 +0800 +1000 +1000 +2100 +2080 +47C0 +F820 +4020 +ENDCHAR +STARTCHAR U_F6DA +ENCODING 63194 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +2900 +2F80 +1100 +3100 +5200 +8C00 +0C00 +1200 +21C0 +C080 +ENDCHAR +STARTCHAR U_F6DB +ENCODING 63195 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 5 0 5 +BITMAP +0800 +0400 +7FE0 +4040 +8080 +ENDCHAR +STARTCHAR U_F6DC +ENCODING 63196 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +2220 +2220 +4440 +4440 +8880 +8880 +4440 +4440 +2220 +2220 +ENDCHAR +STARTCHAR U_F6DD +ENCODING 63197 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0800 +1100 +1200 +2400 +7C00 +0800 +1100 +2780 +F840 +4040 +ENDCHAR +STARTCHAR U_F6DE +ENCODING 63198 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +7FE0 +4000 +4000 +4000 +4000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR U_F6DF +ENCODING 63199 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F000 +1000 +2000 +2000 +7800 +0800 +4800 +5000 +2000 +5060 +8FC0 +ENDCHAR +STARTCHAR U_F6E0 +ENCODING 63200 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +0040 +7FE0 +0040 +0040 +0040 +3FC0 +0040 +0040 +0040 +FFE0 +ENDCHAR +STARTCHAR U_F6E1 +ENCODING 63201 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +18 +10 +26 +44 +88 +13 +22 +44 +08 +10 +60 +ENDCHAR +STARTCHAR U_F6E2 +ENCODING 63202 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0FC0 +0800 +0800 +7F80 +2100 +1100 +0E00 +0400 +1B00 +E0C0 +ENDCHAR +STARTCHAR U_F6E3 +ENCODING 63203 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +0400 +0400 +FFE0 +0A00 +0A00 +1200 +2220 +4220 +81E0 +ENDCHAR +STARTCHAR U_F6E4 +ENCODING 63204 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0200 +3FE0 +A000 +6000 +2000 +6000 +A000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_F6E5 +ENCODING 63205 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 6 0 4 +BITMAP +FC80 +4B20 +3140 +2080 +4040 +8020 +ENDCHAR +STARTCHAR U_F6E6 +ENCODING 63206 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0600 +1980 +6600 +18C0 +0700 +7A00 +2200 +23C0 +3200 +4E00 +83E0 +ENDCHAR +STARTCHAR U_F6E7 +ENCODING 63207 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7F80 +0480 +FFE0 +0480 +7F80 +2680 +1D00 +1480 +E440 +5C20 +ENDCHAR +STARTCHAR U_F6E8 +ENCODING 63208 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 1 4 7 +BITMAP +90 +ENDCHAR +STARTCHAR U_F6E9 +ENCODING 63209 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 2 3 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR U_F6EA +ENCODING 63210 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 7 3 1 +BITMAP +80 +40 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR U_F6EB +ENCODING 63211 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +02 +89 +44 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR U_F6EC +ENCODING 63212 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 0 +BITMAP +80 +40 +20 +10 +08 +04 +03 +1C +ENDCHAR +STARTCHAR U_F6ED +ENCODING 63213 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0500 +8280 +4000 +2000 +1000 +0800 +0400 +0300 +0C00 +ENDCHAR +STARTCHAR U_F6EE +ENCODING 63214 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 2 +BITMAP +22 +22 +22 +22 +22 +44 +88 +ENDCHAR +STARTCHAR U_F6EF +ENCODING 63215 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 1 1 +BITMAP +0800 +1400 +2200 +C180 +3E00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR U_F6F0 +ENCODING 63216 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +10 +20 +7F +82 +04 +18 +04 +04 +ENDCHAR +STARTCHAR U_F6F1 +ENCODING 63217 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +01 +01 +32 +4A +84 +8C +92 +61 +ENDCHAR +STARTCHAR U_F6F2 +ENCODING 63218 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +3C +42 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR U_F6F3 +ENCODING 63219 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 1 1 4 +BITMAP +FFC0 +ENDCHAR +STARTCHAR U_F6F4 +ENCODING 63220 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 5 0 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR U_F6F5 +ENCODING 63221 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 5 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR U_F6F6 +ENCODING 63222 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +10 +92 +54 +38 +54 +92 +10 +ENDCHAR +STARTCHAR U_F6F7 +ENCODING 63223 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +10 +A8 +70 +3C +6A +B2 +A4 +D8 +ENDCHAR +STARTCHAR U_F6F8 +ENCODING 63224 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 12 2 -1 +BITMAP +1000 +0800 +0A00 +7C00 +1000 +1E00 +3580 +5880 +9880 +9880 +E100 +0E00 +ENDCHAR +STARTCHAR U_F6F9 +ENCODING 63225 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 3 2 +BITMAP +88 +84 +82 +86 +C0 +40 +ENDCHAR +STARTCHAR U_F6FA +ENCODING 63226 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +8000 +8200 +8100 +8080 +8080 +C180 +C000 +4000 +ENDCHAR +STARTCHAR U_F6FB +ENCODING 63227 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 6 4 2 +BITMAP +60 +20 +D0 +10 +10 +20 +ENDCHAR +STARTCHAR U_F6FC +ENCODING 63228 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 11 3 0 +BITMAP +40 +38 +20 +00 +B8 +C4 +04 +04 +08 +08 +10 +ENDCHAR +STARTCHAR U_F6FD +ENCODING 63229 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 6 3 2 +BITMAP +38 +10 +70 +30 +50 +9C +ENDCHAR +STARTCHAR U_F6FE +ENCODING 63230 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +40 +38 +00 +18 +F0 +20 +30 +D0 +90 +0E +ENDCHAR +STARTCHAR U_F6FF +ENCODING 63231 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 3 2 +BITMAP +40 +44 +E8 +48 +74 +D4 +58 +ENDCHAR +STARTCHAR U_F700 +ENCODING 63232 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +2000 +2980 +F000 +2700 +3880 +6880 +A880 +E700 +ENDCHAR +STARTCHAR U_F701 +ENCODING 63233 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1000 +1000 +FD00 +2480 +6580 +4400 +8800 +9800 +ENDCHAR +STARTCHAR U_F702 +ENCODING 63234 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0180 +1100 +1000 +1900 +E480 +2480 +4400 +8800 +9800 +ENDCHAR +STARTCHAR U_F703 +ENCODING 63235 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +20 +14 +F8 +14 +F8 +08 +7C +80 +80 +7C +ENDCHAR +STARTCHAR U_F704 +ENCODING 63236 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +0100 +3280 +1500 +F800 +0E00 +F800 +0400 +7C00 +8000 +8000 +7C00 +ENDCHAR +STARTCHAR U_F705 +ENCODING 63237 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 3 0 +BITMAP +08 +08 +10 +20 +C0 +80 +60 +10 +08 +08 +ENDCHAR +STARTCHAR U_F706 +ENCODING 63238 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +08 +09 +12 +21 +C0 +40 +20 +10 +08 +08 +ENDCHAR +STARTCHAR U_F707 +ENCODING 63239 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +8200 +4200 +4380 +8E00 +8200 +8200 +C200 +C200 +4400 +0400 +ENDCHAR +STARTCHAR U_F708 +ENCODING 63240 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +0080 +8300 +4280 +4280 +9F00 +8200 +8200 +C200 +C200 +4400 +0400 +ENDCHAR +STARTCHAR U_F709 +ENCODING 63241 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 1 +BITMAP +7E +08 +00 +00 +00 +80 +80 +7E +ENDCHAR +STARTCHAR U_F70A +ENCODING 63242 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +01 +7F +08 +10 +00 +00 +80 +80 +80 +7E +ENDCHAR +STARTCHAR U_F70B +ENCODING 63243 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +20 +24 +18 +F0 +08 +3C +C0 +80 +80 +7C +ENDCHAR +STARTCHAR U_F70C +ENCODING 63244 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 0 +BITMAP +02 +06 +20 +2C +10 +F0 +08 +7C +80 +80 +78 +ENDCHAR +STARTCHAR U_F70D +ENCODING 63245 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 9 3 1 +BITMAP +80 +80 +80 +80 +80 +80 +84 +8C +70 +ENDCHAR +STARTCHAR U_F70E +ENCODING 63246 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +04 +8C +82 +80 +80 +80 +80 +84 +8C +70 +ENDCHAR +STARTCHAR U_F70F +ENCODING 63247 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +0FC0 +F400 +0C00 +1400 +1400 +0C00 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F710 +ENCODING 63248 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 12 1 -1 +BITMAP +00C0 +0480 +0400 +07C0 +FC00 +0C00 +1400 +1400 +0C00 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F711 +ENCODING 63249 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 2 0 +BITMAP +0200 +2200 +23C0 +3E00 +E200 +2600 +2000 +2000 +1F00 +ENDCHAR +STARTCHAR U_F712 +ENCODING 63250 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +0140 +1100 +11C0 +1F00 +F100 +1300 +1000 +1000 +0F80 +ENDCHAR +STARTCHAR U_F713 +ENCODING 63251 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +04 +3C +08 +33 +7C +88 +10 +10 +10 +0E +ENDCHAR +STARTCHAR U_F714 +ENCODING 63252 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0680 +3D40 +0800 +1100 +3E00 +C800 +1000 +1000 +1000 +0E00 +ENDCHAR +STARTCHAR U_F715 +ENCODING 63253 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +1000 +1000 +2C00 +F700 +2980 +4000 +4000 +5000 +9000 +8F80 +ENDCHAR +STARTCHAR U_F716 +ENCODING 63254 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +2080 +1140 +1080 +1800 +EF80 +4200 +4000 +4000 +9000 +8F00 +ENDCHAR +STARTCHAR U_F717 +ENCODING 63255 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +20 +2C +38 +C0 +4C +72 +C2 +02 +04 +18 +ENDCHAR +STARTCHAR U_F718 +ENCODING 63256 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 12 2 -1 +BITMAP +0100 +0080 +1000 +1400 +E800 +2000 +2E00 +7100 +0100 +0100 +0600 +3800 +ENDCHAR +STARTCHAR U_F719 +ENCODING 63257 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 6 2 2 +BITMAP +0E +71 +81 +01 +02 +0C +ENDCHAR +STARTCHAR U_F71A +ENCODING 63258 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 7 1 1 +BITMAP +0F80 +B040 +4040 +0040 +0040 +0080 +0700 +ENDCHAR +STARTCHAR U_F71B +ENCODING 63259 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +0020 +0040 +0720 +1880 +E040 +0040 +0040 +0080 +0300 +0400 +ENDCHAR +STARTCHAR U_F71C +ENCODING 63260 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1F80 +E400 +0800 +1000 +1000 +1000 +1800 +0E00 +ENDCHAR +STARTCHAR U_F71D +ENCODING 63261 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1F80 +E480 +0900 +1080 +1000 +1000 +1800 +0E00 +ENDCHAR +STARTCHAR U_F71E +ENCODING 63262 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +40 +20 +20 +20 +2E +30 +C0 +80 +80 +7E +ENDCHAR +STARTCHAR U_F71F +ENCODING 63263 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0100 +2280 +2100 +2000 +2600 +3800 +4000 +8000 +8000 +7E00 +ENDCHAR +STARTCHAR U_F720 +ENCODING 63264 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +10 +10 +78 +21 +26 +44 +44 +9C +27 +1C +ENDCHAR +STARTCHAR U_F721 +ENCODING 63265 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +4000 +4E00 +8000 +8000 +8000 +C000 +9000 +8F80 +ENDCHAR +STARTCHAR U_F722 +ENCODING 63266 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +8800 +4E00 +7900 +5080 +5080 +A080 +B780 +C780 +ENDCHAR +STARTCHAR U_F723 +ENCODING 63267 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +2000 +2000 +3300 +FC80 +3080 +2080 +6080 +AF80 +A980 +2640 +ENDCHAR +STARTCHAR U_F724 +ENCODING 63268 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +3F00 +4880 +9080 +9080 +9080 +A080 +4100 +0600 +ENDCHAR +STARTCHAR U_F725 +ENCODING 63269 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +4200 +4280 +4F00 +8200 +8200 +C200 +8F00 +9280 +8C00 +ENDCHAR +STARTCHAR U_F726 +ENCODING 63270 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +0080 +0040 +4200 +4200 +4380 +8E00 +8200 +8200 +CE00 +9380 +0E00 +ENDCHAR +STARTCHAR U_F727 +ENCODING 63271 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +42C0 +4200 +4380 +8E00 +8200 +8200 +CE00 +9380 +8E00 +ENDCHAR +STARTCHAR U_F728 +ENCODING 63272 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 2 1 +BITMAP +1300 +F100 +2100 +4180 +4140 +4100 +4200 +6200 +3C00 +ENDCHAR +STARTCHAR U_F729 +ENCODING 63273 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0040 +00A0 +3240 +D100 +2100 +4180 +4140 +4100 +4200 +6200 +3C00 +ENDCHAR +STARTCHAR U_F72A +ENCODING 63274 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +00C0 +10A0 +F340 +2100 +4180 +4140 +4100 +4200 +6200 +3C00 +ENDCHAR +STARTCHAR U_F72B +ENCODING 63275 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +0800 +0400 +1800 +1000 +0F00 +3480 +C480 +BC00 +ENDCHAR +STARTCHAR U_F72C +ENCODING 63276 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +0080 +0960 +0CA0 +1000 +1000 +0E00 +3980 +C480 +C580 +3C00 +ENDCHAR +STARTCHAR U_F72D +ENCODING 63277 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +0880 +0D40 +10C0 +1000 +0F00 +3880 +C480 +C500 +3C00 +ENDCHAR +STARTCHAR U_F72E +ENCODING 63278 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 6 1 2 +BITMAP +1800 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F72F +ENCODING 63279 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +0180 +0140 +1880 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F730 +ENCODING 63280 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 2 1 +BITMAP +0180 +0280 +1100 +6800 +4400 +8200 +0180 +00C0 +ENDCHAR +STARTCHAR U_F731 +ENCODING 63281 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +4F00 +4200 +8F80 +8200 +8200 +CE00 +9380 +9E00 +ENDCHAR +STARTCHAR U_F732 +ENCODING 63282 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 1 1 +BITMAP +4FE0 +4240 +8F80 +8200 +8200 +CE00 +9380 +9E40 +ENDCHAR +STARTCHAR U_F733 +ENCODING 63283 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 1 +BITMAP +0020 +0040 +4F60 +4200 +9F80 +8200 +8200 +CE00 +9380 +8C00 +ENDCHAR +STARTCHAR U_F734 +ENCODING 63284 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +10 +10 +16 +F8 +14 +78 +10 +78 +96 +60 +ENDCHAR +STARTCHAR U_F735 +ENCODING 63285 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +0400 +3C00 +0800 +0900 +1100 +7D00 +A300 +C2C0 +8400 +1800 +ENDCHAR +STARTCHAR U_F736 +ENCODING 63286 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +2000 +1000 +9880 +6140 +31C0 +E100 +6100 +6100 +4100 +3E00 +ENDCHAR +STARTCHAR U_F737 +ENCODING 63287 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0400 +4400 +4E00 +7900 +4880 +B080 +B080 +B080 +C100 +0E00 +ENDCHAR +STARTCHAR U_F738 +ENCODING 63288 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +10 +10 +20 +78 +A0 +C0 +78 +42 +42 +3C +ENDCHAR +STARTCHAR U_F739 +ENCODING 63289 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 6 3 2 +BITMAP +7E +21 +EE +10 +10 +10 +ENDCHAR +STARTCHAR U_F73A +ENCODING 63290 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0800 +6B00 +5C80 +3080 +E880 +1700 +1000 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_F73B +ENCODING 63291 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +18 +5E +96 +B5 +D5 +56 +0C +10 +ENDCHAR +STARTCHAR U_F73C +ENCODING 63292 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0C00 +5200 +5F00 +B280 +D280 +D280 +D280 +4F00 +0800 +1000 +ENDCHAR +STARTCHAR U_F73D +ENCODING 63293 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +20 +10 +1C +10 +10 +78 +94 +60 +ENDCHAR +STARTCHAR U_F73E +ENCODING 63294 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +08 +08 +08 +0E +08 +08 +08 +7E +8B +78 +ENDCHAR +STARTCHAR U_F73F +ENCODING 63295 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +38 +38 +40 +40 +9C +A2 +C2 +02 +04 +78 +ENDCHAR +STARTCHAR U_F740 +ENCODING 63296 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +40 +58 +64 +C4 +C4 +C4 +C4 +44 +08 +10 +ENDCHAR +STARTCHAR U_F741 +ENCODING 63297 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +08 +78 +10 +20 +5C +E2 +82 +32 +4C +38 +ENDCHAR +STARTCHAR U_F742 +ENCODING 63298 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +2000 +4000 +5000 +7600 +FA00 +4200 +4200 +C240 +4380 +4000 +ENDCHAR +STARTCHAR U_F743 +ENCODING 63299 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +04 +3C +08 +10 +2E +71 +C1 +81 +02 +0C +ENDCHAR +STARTCHAR U_F744 +ENCODING 63300 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +20 +20 +FC +22 +62 +E2 +2C +ENDCHAR +STARTCHAR U_F745 +ENCODING 63301 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +2000 +2000 +2000 +3600 +F980 +2080 +6080 +A080 +A100 +6300 +2C00 +ENDCHAR +STARTCHAR U_F746 +ENCODING 63302 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0C00 +3800 +0800 +1600 +1980 +6080 +A080 +A480 +CB00 +4600 +ENDCHAR +STARTCHAR U_F747 +ENCODING 63303 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0400 +3C00 +1E00 +3100 +5900 +2A00 +1C00 +3700 +C880 +8980 +ENDCHAR +STARTCHAR U_F748 +ENCODING 63304 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 3 0 +BITMAP +10 +2C +F0 +40 +79 +8E +98 +68 +40 +3E +ENDCHAR +STARTCHAR U_F749 +ENCODING 63305 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +1000 +0800 +1000 +1000 +2000 +5C00 +6400 +4480 +8480 +8700 +ENDCHAR +STARTCHAR U_F74A +ENCODING 63306 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 4 3 +BITMAP +F8 +30 +20 +40 +40 +ENDCHAR +STARTCHAR U_F74B +ENCODING 63307 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +9F +61 +0E +08 +08 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F74C +ENCODING 63308 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 6 4 2 +BITMAP +10 +20 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR U_F74D +ENCODING 63309 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 3 0 +BITMAP +08 +08 +10 +30 +30 +D0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U_F74E +ENCODING 63310 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 7 4 1 +BITMAP +20 +F8 +88 +90 +10 +20 +40 +ENDCHAR +STARTCHAR U_F74F +ENCODING 63311 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +10 +10 +1E +E2 +82 +84 +04 +08 +10 +20 +ENDCHAR +STARTCHAR U_F750 +ENCODING 63312 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 5 3 3 +BITMAP +0C +30 +10 +10 +FE +ENDCHAR +STARTCHAR U_F751 +ENCODING 63313 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +7F00 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR U_F752 +ENCODING 63314 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 2 2 +BITMAP +08 +7E +08 +18 +28 +D8 +ENDCHAR +STARTCHAR U_F753 +ENCODING 63315 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0800 +0400 +0400 +7F80 +0C00 +1400 +2400 +4400 +8C00 +0400 +ENDCHAR +STARTCHAR U_F754 +ENCODING 63316 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +10 +20 +FC +24 +24 +44 +48 +88 +ENDCHAR +STARTCHAR U_F755 +ENCODING 63317 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 3 1 +BITMAP +03 +12 +20 +FC +24 +24 +44 +48 +88 +ENDCHAR +STARTCHAR U_F756 +ENCODING 63318 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +1000 +0800 +0F00 +7800 +0F80 +F800 +0800 +0400 +0400 +ENDCHAR +STARTCHAR U_F757 +ENCODING 63319 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +2380 +1000 +1600 +F800 +1000 +1F00 +E800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_F758 +ENCODING 63320 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +10 +12 +3E +44 +04 +08 +10 +20 +C0 +ENDCHAR +STARTCHAR U_F759 +ENCODING 63321 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +0180 +1200 +3E00 +4400 +0400 +0800 +1800 +2000 +C000 +ENDCHAR +STARTCHAR U_F75A +ENCODING 63322 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +20 +7F +88 +88 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F75B +ENCODING 63323 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 3 0 +BITMAP +02 +05 +22 +20 +7F +88 +88 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F75C +ENCODING 63324 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 3 2 +BITMAP +FE +02 +02 +04 +04 +FE +ENDCHAR +STARTCHAR U_F75D +ENCODING 63325 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 2 +BITMAP +0080 +0100 +0080 +FF00 +0200 +0200 +0200 +0200 +FE00 +ENDCHAR +STARTCHAR U_F75E +ENCODING 63326 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0400 +2400 +2400 +FF80 +2400 +2400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F75F +ENCODING 63327 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 0 +BITMAP +0100 +0A80 +2500 +2400 +3F00 +E400 +2400 +2400 +0800 +0800 +1000 +ENDCHAR +STARTCHAR U_F760 +ENCODING 63328 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +20 +00 +C1 +01 +02 +04 +18 +60 +ENDCHAR +STARTCHAR U_F761 +ENCODING 63329 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0180 +6100 +0000 +8100 +4100 +0200 +0C00 +1000 +6000 +ENDCHAR +STARTCHAR U_F762 +ENCODING 63330 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +04 +7C +08 +08 +10 +3C +42 +82 +ENDCHAR +STARTCHAR U_F763 +ENCODING 63331 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +01 +02 +05 +7C +04 +08 +08 +14 +22 +C0 +ENDCHAR +STARTCHAR U_F764 +ENCODING 63332 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +20 +20 +23 +3E +E4 +20 +20 +1E +ENDCHAR +STARTCHAR U_F765 +ENCODING 63333 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0180 +0100 +1000 +1100 +1F00 +F200 +1000 +1000 +1000 +0F00 +ENDCHAR +STARTCHAR U_F766 +ENCODING 63334 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +04 +82 +44 +04 +04 +08 +10 +20 +C0 +ENDCHAR +STARTCHAR U_F767 +ENCODING 63335 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0180 +0140 +0080 +C100 +2100 +2200 +0200 +0400 +0400 +0800 +3000 +ENDCHAR +STARTCHAR U_F768 +ENCODING 63336 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +10 +2E +44 +74 +08 +18 +20 +40 +80 +ENDCHAR +STARTCHAR U_F769 +ENCODING 63337 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +1100 +1E80 +2200 +3400 +4C00 +0C00 +1400 +2000 +C000 +ENDCHAR +STARTCHAR U_F76A +ENCODING 63338 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0200 +0C00 +7400 +0780 +FC00 +0400 +0800 +0800 +1000 +ENDCHAR +STARTCHAR U_F76B +ENCODING 63339 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 1 1 +BITMAP +03E0 +7C40 +0400 +FF80 +0400 +0400 +0800 +1000 +ENDCHAR +STARTCHAR U_F76C +ENCODING 63340 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 5 4 2 +BITMAP +A4 +08 +08 +10 +20 +ENDCHAR +STARTCHAR U_F76D +ENCODING 63341 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 7 2 1 +BITMAP +91 +49 +42 +02 +04 +08 +10 +ENDCHAR +STARTCHAR U_F76E +ENCODING 63342 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0180 +2100 +9100 +4200 +0200 +0400 +0400 +1800 +2000 +ENDCHAR +STARTCHAR U_F76F +ENCODING 63343 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 3 0 +BITMAP +7C +00 +3F +D0 +10 +10 +20 +20 +C0 +ENDCHAR +STARTCHAR U_F770 +ENCODING 63344 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +7F00 +0000 +0F00 +F800 +0800 +0800 +1000 +2000 +4000 +ENDCHAR +STARTCHAR U_F771 +ENCODING 63345 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 9 5 0 +BITMAP +80 +80 +80 +E0 +90 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_F772 +ENCODING 63346 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +08 +90 +88 +80 +E0 +90 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_F773 +ENCODING 63347 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +1000 +0800 +0800 +FF80 +0800 +0800 +1000 +1000 +2000 +4000 +ENDCHAR +STARTCHAR U_F774 +ENCODING 63348 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +4E00 +3000 +0000 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR U_F775 +ENCODING 63349 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +0C +7C +08 +48 +30 +28 +44 +80 +ENDCHAR +STARTCHAR U_F776 +ENCODING 63350 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +18 +00 +5E +24 +08 +1A +29 +C9 +08 +08 +ENDCHAR +STARTCHAR U_F777 +ENCODING 63351 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +08 +04 +08 +08 +10 +30 +60 +80 +ENDCHAR +STARTCHAR U_F778 +ENCODING 63352 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 6 2 2 +BITMAP +1200 +1100 +2080 +2040 +4040 +8000 +ENDCHAR +STARTCHAR U_F779 +ENCODING 63353 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +00C0 +0080 +1200 +1100 +2080 +2040 +4040 +8000 +ENDCHAR +STARTCHAR U_F77A +ENCODING 63354 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 2 2 +BITMAP +0080 +0140 +4080 +2200 +4100 +4080 +8080 +0080 +ENDCHAR +STARTCHAR U_F77B +ENCODING 63355 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +80 +84 +8C +B0 +C0 +80 +80 +7E +ENDCHAR +STARTCHAR U_F77C +ENCODING 63356 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 3 0 +BITMAP +03 +06 +80 +84 +98 +E0 +80 +80 +80 +7C +ENDCHAR +STARTCHAR U_F77D +ENCODING 63357 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +0180 +8280 +4100 +4600 +4800 +7000 +4000 +4000 +3E00 +ENDCHAR +STARTCHAR U_F77E +ENCODING 63358 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 0 +BITMAP +FE +04 +04 +04 +08 +10 +20 +40 +ENDCHAR +STARTCHAR U_F77F +ENCODING 63359 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0080 +0100 +FE80 +0200 +0400 +0400 +0800 +1800 +2000 +4000 +ENDCHAR +STARTCHAR U_F780 +ENCODING 63360 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +0180 +0140 +FE80 +0600 +0400 +0400 +0800 +1000 +2000 +4000 +ENDCHAR +STARTCHAR U_F781 +ENCODING 63361 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 6 1 2 +BITMAP +1800 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F782 +ENCODING 63362 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 2 +BITMAP +0180 +0140 +1880 +2400 +4200 +C100 +0080 +0040 +ENDCHAR +STARTCHAR U_F783 +ENCODING 63363 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 1 2 +BITMAP +0080 +0140 +1880 +2400 +4200 +C100 +0080 +0060 +ENDCHAR +STARTCHAR U_F784 +ENCODING 63364 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +08 +08 +08 +FF +08 +0A +49 +88 +08 +ENDCHAR +STARTCHAR U_F785 +ENCODING 63365 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0180 +0900 +0800 +1F00 +E800 +0800 +4A00 +C900 +9800 +0800 +ENDCHAR +STARTCHAR U_F786 +ENCODING 63366 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 2 0 +BITMAP +0080 +1140 +0980 +0800 +1F00 +E800 +0800 +4A00 +8900 +9800 +0800 +ENDCHAR +STARTCHAR U_F787 +ENCODING 63367 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +0F80 +F100 +0200 +1400 +0800 +0800 +ENDCHAR +STARTCHAR U_F788 +ENCODING 63368 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 4 1 +BITMAP +70 +00 +00 +F0 +00 +00 +E0 +18 +ENDCHAR +STARTCHAR U_F789 +ENCODING 63369 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +08 +08 +10 +20 +22 +41 +FF +81 +ENDCHAR +STARTCHAR U_F78A +ENCODING 63370 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +04 +06 +24 +18 +0C +14 +20 +C0 +ENDCHAR +STARTCHAR U_F78B +ENCODING 63371 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +0300 +3C00 +0800 +0F80 +F800 +0800 +0800 +0F80 +ENDCHAR +STARTCHAR U_F78C +ENCODING 63372 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 6 3 2 +BITMAP +20 +2E +F4 +20 +10 +10 +ENDCHAR +STARTCHAR U_F78D +ENCODING 63373 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +1000 +1000 +1F80 +F100 +1200 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_F78E +ENCODING 63374 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 4 3 3 +BITMAP +38 +08 +08 +FE +ENDCHAR +STARTCHAR U_F78F +ENCODING 63375 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +3E00 +0200 +0200 +0400 +0400 +FF80 +ENDCHAR +STARTCHAR U_F790 +ENCODING 63376 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 6 4 2 +BITMAP +30 +D0 +30 +D0 +10 +F0 +ENDCHAR +STARTCHAR U_F791 +ENCODING 63377 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 3 1 +BITMAP +FC +04 +04 +FC +04 +08 +FC +ENDCHAR +STARTCHAR U_F792 +ENCODING 63378 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 0 +BITMAP +9C +60 +00 +FE +02 +04 +04 +08 +10 +20 +40 +ENDCHAR +STARTCHAR U_F793 +ENCODING 63379 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +10 +88 +88 +88 +88 +88 +10 +10 +20 +40 +ENDCHAR +STARTCHAR U_F794 +ENCODING 63380 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +4000 +2800 +2800 +2800 +2800 +4980 +4E00 +8000 +ENDCHAR +STARTCHAR U_F795 +ENCODING 63381 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +80 +80 +80 +82 +84 +98 +E0 +80 +ENDCHAR +STARTCHAR U_F796 +ENCODING 63382 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +0E +F2 +84 +84 +84 +FC +C0 +ENDCHAR +STARTCHAR U_F797 +ENCODING 63383 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 6 3 2 +BITMAP +80 +7C +48 +48 +08 +10 +ENDCHAR +STARTCHAR U_F798 +ENCODING 63384 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +80 +7F +42 +42 +02 +04 +04 +08 +30 +ENDCHAR +STARTCHAR U_F799 +ENCODING 63385 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +0400 +0400 +0400 +7F00 +2400 +3F80 +C400 +0400 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_F79A +ENCODING 63386 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 2 +BITMAP +3F00 +0200 +0C00 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR U_F79B +ENCODING 63387 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +FA +04 +FE +04 +08 +10 +20 +ENDCHAR +STARTCHAR U_F79C +ENCODING 63388 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +80 +40 +02 +04 +04 +08 +30 +C0 +ENDCHAR +STARTCHAR U_F79D +ENCODING 63389 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +0100 +1280 +1100 +FE00 +8200 +8400 +0400 +0800 +1000 +2000 +ENDCHAR +STARTCHAR U_F79E +ENCODING 63390 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 4 1 +BITMAP +10 +9C +64 +24 +24 +58 +88 +ENDCHAR +STARTCHAR U_F79F +ENCODING 63391 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 1 +BITMAP +20 +7E +88 +90 +10 +20 +40 +ENDCHAR +STARTCHAR U_F7A0 +ENCODING 63392 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +1400 +1400 +2200 +3E00 +2200 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_F7A1 +ENCODING 63393 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FC +44 +40 +40 +78 +44 +42 +42 +44 +F8 +ENDCHAR +STARTCHAR U_F7A2 +ENCODING 63394 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +FC +42 +42 +44 +7C +42 +42 +42 +FC +ENDCHAR +STARTCHAR U_F7A3 +ENCODING 63395 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +42 +42 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7A4 +ENCODING 63396 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +7F +22 +22 +22 +22 +42 +42 +42 +42 +FF +81 +ENDCHAR +STARTCHAR U_F7A5 +ENCODING 63397 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +FE +42 +40 +48 +78 +48 +40 +40 +42 +FE +ENDCHAR +STARTCHAR U_F7A6 +ENCODING 63398 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +44 +00 +FE +42 +40 +48 +78 +48 +40 +42 +FE +ENDCHAR +STARTCHAR U_F7A7 +ENCODING 63399 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8E20 +4440 +4440 +2480 +2480 +1F00 +2480 +2480 +4440 +4440 +8E20 +ENDCHAR +STARTCHAR U_F7A8 +ENCODING 63400 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +B8 +C4 +84 +04 +38 +04 +84 +84 +48 +30 +ENDCHAR +STARTCHAR U_F7A9 +ENCODING 63401 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +E7 +43 +45 +45 +49 +51 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7AA +ENCODING 63402 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 0 +BITMAP +3C +E7 +43 +45 +45 +49 +51 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7AB +ENCODING 63403 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 2 0 +BITMAP +02 +E5 +44 +44 +48 +78 +44 +44 +44 +44 +E2 +ENDCHAR +STARTCHAR U_F7AC +ENCODING 63404 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +7F00 +2100 +2100 +2100 +2100 +2100 +2100 +2100 +A100 +4380 +ENDCHAR +STARTCHAR U_F7AD +ENCODING 63405 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +C0C0 +4180 +6280 +6280 +5280 +5480 +5480 +4C80 +4880 +E1C0 +ENDCHAR +STARTCHAR U_F7AE +ENCODING 63406 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +E380 +4100 +4100 +4100 +7F00 +4100 +4100 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_F7AF +ENCODING 63407 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +18 +24 +42 +81 +81 +81 +81 +42 +24 +18 +ENDCHAR +STARTCHAR U_F7B0 +ENCODING 63408 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +FE +44 +44 +44 +44 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_F7B1 +ENCODING 63409 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 1 +BITMAP +FC +42 +42 +42 +7C +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7B2 +ENCODING 63410 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +38 +46 +82 +80 +80 +80 +80 +82 +64 +18 +ENDCHAR +STARTCHAR U_F7B3 +ENCODING 63411 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +FF00 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR U_F7B4 +ENCODING 63412 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +E380 +4200 +2200 +2400 +1400 +1800 +1000 +1000 +6000 +ENDCHAR +STARTCHAR U_F7B5 +ENCODING 63413 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +1C00 +0800 +3E00 +4900 +8880 +8880 +4900 +3E00 +0800 +1C00 +ENDCHAR +STARTCHAR U_F7B6 +ENCODING 63414 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +E700 +6200 +2400 +1800 +1800 +1800 +2400 +2400 +4200 +E780 +ENDCHAR +STARTCHAR U_F7B7 +ENCODING 63415 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +EE +44 +44 +44 +44 +44 +44 +44 +44 +FE +ENDCHAR +STARTCHAR U_F7B8 +ENCODING 63416 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +CC +84 +84 +84 +8C +74 +04 +04 +04 +0C +ENDCHAR +STARTCHAR U_F7B9 +ENCODING 63417 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +EDC0 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +FFC0 +ENDCHAR +STARTCHAR U_F7BA +ENCODING 63418 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 -1 +BITMAP +EDC0 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +4480 +FFE0 +0020 +ENDCHAR +STARTCHAR U_F7BB +ENCODING 63419 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 2 0 +BITMAP +7800 +9000 +9000 +1000 +1E00 +1100 +1080 +1080 +1100 +3E00 +ENDCHAR +STARTCHAR U_F7BC +ENCODING 63420 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +61C0 +4080 +4080 +4080 +7880 +4480 +4280 +4280 +4480 +F9C0 +ENDCHAR +STARTCHAR U_F7BD +ENCODING 63421 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +E0 +40 +40 +40 +78 +44 +42 +42 +44 +F8 +ENDCHAR +STARTCHAR U_F7BE +ENCODING 63422 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +38 +C4 +04 +02 +3E +02 +82 +84 +44 +38 +ENDCHAR +STARTCHAR U_F7BF +ENCODING 63423 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 0 +BITMAP +0200 +E580 +4880 +5040 +5040 +7040 +5040 +5040 +4880 +4880 +E700 +ENDCHAR +STARTCHAR U_F7C0 +ENCODING 63424 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 3 0 +BITMAP +7E +84 +84 +44 +3C +44 +44 +44 +44 +8E +ENDCHAR +STARTCHAR U_F7C1 +ENCODING 63425 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 3 0 +BITMAP +30 +48 +08 +18 +68 +88 +88 +70 +ENDCHAR +STARTCHAR U_F7C2 +ENCODING 63426 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +08 +30 +60 +D0 +88 +88 +88 +88 +50 +20 +ENDCHAR +STARTCHAR U_F7C3 +ENCODING 63427 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +F8 +44 +44 +78 +44 +42 +42 +FC +ENDCHAR +STARTCHAR U_F7C4 +ENCODING 63428 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +FC +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7C5 +ENCODING 63429 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 0 +BITMAP +7E +44 +44 +44 +44 +44 +84 +7E +82 +ENDCHAR +STARTCHAR U_F7C6 +ENCODING 63430 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 4 0 +BITMAP +20 +50 +88 +F8 +80 +80 +C8 +30 +ENDCHAR +STARTCHAR U_F7C7 +ENCODING 63431 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 9 4 0 +BITMAP +48 +20 +50 +88 +F8 +80 +80 +C8 +30 +ENDCHAR +STARTCHAR U_F7C8 +ENCODING 63432 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +9C80 +4900 +4900 +3E00 +4900 +4900 +4900 +9C80 +ENDCHAR +STARTCHAR U_F7C9 +ENCODING 63433 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +78 +44 +04 +18 +04 +C4 +84 +78 +ENDCHAR +STARTCHAR U_F7CA +ENCODING 63434 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +E7 +43 +45 +49 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7CB +ENCODING 63435 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +3C +E7 +43 +45 +49 +51 +61 +41 +E7 +ENDCHAR +STARTCHAR U_F7CC +ENCODING 63436 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +CC +48 +50 +70 +48 +48 +48 +CC +ENDCHAR +STARTCHAR U_F7CD +ENCODING 63437 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +7E +22 +22 +22 +22 +22 +A2 +C7 +ENDCHAR +STARTCHAR U_F7CE +ENCODING 63438 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +C180 +C100 +A700 +A500 +B500 +9900 +9900 +C380 +ENDCHAR +STARTCHAR U_F7CF +ENCODING 63439 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +E7 +42 +42 +7E +42 +42 +42 +E7 +ENDCHAR +STARTCHAR U_F7D0 +ENCODING 63440 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +38 +44 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_F7D1 +ENCODING 63441 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +FE +44 +44 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_F7D2 +ENCODING 63442 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 9 3 0 +BITMAP +70 +4C +44 +44 +78 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7D3 +ENCODING 63443 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 8 3 0 +BITMAP +28 +58 +80 +80 +80 +80 +48 +30 +ENDCHAR +STARTCHAR U_F7D4 +ENCODING 63444 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +FE +10 +10 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR U_F7D5 +ENCODING 63445 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 3 1 +BITMAP +E7 +44 +24 +28 +18 +10 +20 +60 +ENDCHAR +STARTCHAR U_F7D6 +ENCODING 63446 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +08 +18 +08 +6E +99 +89 +89 +89 +89 +7E +08 +1C +ENDCHAR +STARTCHAR U_F7D7 +ENCODING 63447 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +E7 +24 +28 +10 +18 +24 +44 +E7 +ENDCHAR +STARTCHAR U_F7D8 +ENCODING 63448 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +EC +44 +44 +44 +44 +44 +44 +FC +ENDCHAR +STARTCHAR U_F7D9 +ENCODING 63449 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +8C +88 +88 +88 +F8 +08 +08 +1C +ENDCHAR +STARTCHAR U_F7DA +ENCODING 63450 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +ED80 +4900 +4900 +4900 +4900 +4900 +4900 +FF80 +ENDCHAR +STARTCHAR U_F7DB +ENCODING 63451 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 2 0 +BITMAP +ED80 +4880 +4880 +4880 +4880 +4880 +4880 +C880 +3740 +ENDCHAR +STARTCHAR U_F7DC +ENCODING 63452 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +F0 +20 +20 +38 +26 +22 +22 +7C +ENDCHAR +STARTCHAR U_F7DD +ENCODING 63453 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E380 +4100 +4100 +7100 +4D00 +4500 +4500 +FB80 +ENDCHAR +STARTCHAR U_F7DE +ENCODING 63454 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 3 1 +BITMAP +E0 +40 +40 +70 +4C +44 +44 +F8 +ENDCHAR +STARTCHAR U_F7DF +ENCODING 63455 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 8 4 1 +BITMAP +B0 +C8 +04 +3C +04 +84 +88 +70 +ENDCHAR +STARTCHAR U_F7E0 +ENCODING 63456 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E600 +5900 +5080 +7080 +5080 +5080 +4900 +E600 +ENDCHAR +STARTCHAR U_F7E1 +ENCODING 63457 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +3E +44 +44 +3C +44 +44 +44 +CE +ENDCHAR +STARTCHAR U_F7E2 +ENCODING 63458 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +0400 +0A00 +1100 +2080 +4040 +F9E0 +0900 +0900 +0900 +0900 +0F00 +ENDCHAR +STARTCHAR U_F7E3 +ENCODING 63459 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 9 1 1 +BITMAP +FFE0 +0000 +7000 +6000 +5000 +0800 +0400 +0200 +0100 +ENDCHAR +STARTCHAR U_F7E4 +ENCODING 63460 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +9000 +B000 +FFC0 +B000 +9000 +0120 +01A0 +7FE0 +01A0 +0120 +ENDCHAR +STARTCHAR U_F7E5 +ENCODING 63461 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 4 0 +BITMAP +80 +80 +80 +40 +40 +40 +20 +20 +10 +0C +ENDCHAR +STARTCHAR U_F7E6 +ENCODING 63462 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FF +01 +01 +01 +01 +01 +01 +01 +01 +06 +ENDCHAR +STARTCHAR U_F7E7 +ENCODING 63463 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 4 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +88 +88 +78 +ENDCHAR +STARTCHAR U_F7E8 +ENCODING 63464 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +1000 +1000 +1F80 +2100 +4100 +8200 +0200 +0400 +0800 +1000 +6000 +ENDCHAR +STARTCHAR U_F7E9 +ENCODING 63465 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 11 4 -1 +BITMAP +10 +90 +90 +90 +90 +90 +90 +90 +90 +10 +70 +ENDCHAR +STARTCHAR U_F7EA +ENCODING 63466 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 4 1 6 +BITMAP +2100 +2200 +1400 +FFC0 +ENDCHAR +STARTCHAR U_F7EB +ENCODING 63467 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 8 1 -1 +BITMAP +0400 +0400 +2400 +2780 +2400 +2400 +5400 +8FC0 +ENDCHAR +STARTCHAR U_F7EC +ENCODING 63468 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 2 -1 +BITMAP +FF80 +8080 +8280 +A480 +A480 +9880 +8880 +9480 +A380 +8080 +8180 +ENDCHAR +STARTCHAR U_F7ED +ENCODING 63469 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +8040 +A240 +A240 +9440 +8840 +9440 +A240 +8140 +FFC0 +8040 +ENDCHAR +STARTCHAR U_F7EE +ENCODING 63470 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 8 0 -1 +BITMAP +0400 +0C00 +1240 +2280 +E100 +2080 +2840 +3020 +ENDCHAR +STARTCHAR U_F7EF +ENCODING 63471 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +40 +C0 +40 +40 +4F +40 +40 +E0 +ENDCHAR +STARTCHAR U_F7F0 +ENCODING 63472 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 0 +BITMAP +E0 +82 +85 +E5 +12 +15 +15 +92 +60 +ENDCHAR +STARTCHAR U_F7F1 +ENCODING 63473 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +04 +6A +A6 +22 +4E +24 +2A +A4 +4A +04 +ENDCHAR +STARTCHAR U_F7F2 +ENCODING 63474 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +6000 +9000 +1000 +6000 +1780 +1000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7F3 +ENCODING 63475 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +46 +A2 +14 +24 +66 +14 +14 +94 +64 +04 +06 +ENDCHAR +STARTCHAR U_F7F4 +ENCODING 63476 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 9 1 0 +BITMAP +1000 +1000 +3000 +3000 +53C0 +5000 +F800 +1000 +3800 +ENDCHAR +STARTCHAR U_F7F5 +ENCODING 63477 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E000 +8000 +8000 +E000 +9780 +1000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7F6 +ENCODING 63478 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +5000 +8000 +8000 +E000 +9780 +9000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7F7 +ENCODING 63479 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 2 1 +BITMAP +20 +D6 +92 +92 +62 +D2 +92 +96 +60 +ENDCHAR +STARTCHAR U_F7F8 +ENCODING 63480 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +F000 +A000 +2000 +4000 +4780 +4000 +4000 +4000 +ENDCHAR +STARTCHAR U_F7F9 +ENCODING 63481 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +D000 +9000 +9000 +6000 +7780 +9000 +9000 +6000 +ENDCHAR +STARTCHAR U_F7FA +ENCODING 63482 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +E000 +9000 +9000 +9000 +7780 +1000 +A000 +E000 +ENDCHAR +STARTCHAR U_F7FB +ENCODING 63483 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +06 +F6 +A6 +26 +40 +42 +46 +46 +46 +06 +ENDCHAR +STARTCHAR U_F7FC +ENCODING 63484 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +22 +55 +85 +85 +E2 +97 +96 +92 +62 +02 +ENDCHAR +STARTCHAR U_F7FD +ENCODING 63485 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +06 +E2 +94 +94 +96 +74 +14 +A4 +E4 +04 +06 +ENDCHAR +STARTCHAR U_F7FE +ENCODING 63486 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 3 1 +BITMAP +EC +A4 +94 +94 +94 +94 +A6 +60 +ENDCHAR +STARTCHAR U_F7FF +ENCODING 63487 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +0E +CA +44 +48 +4E +44 +44 +44 +E4 +04 +04 +ENDCHAR +STARTCHAR U_F800 +ENCODING 63488 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +10 +16 +32 +52 +52 +92 +72 +13 +30 +ENDCHAR +STARTCHAR U_F801 +ENCODING 63489 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 1 +BITMAP +2000 +D000 +9000 +9000 +2000 +4780 +4000 +8000 +F000 +ENDCHAR +STARTCHAR U_F802 +ENCODING 63490 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +06 +E6 +84 +84 +E6 +12 +12 +92 +62 +02 +06 +ENDCHAR +STARTCHAR U_F803 +ENCODING 63491 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 1 +BITMAP +F2 +A6 +22 +42 +42 +42 +46 +40 +ENDCHAR +STARTCHAR U_F804 +ENCODING 63492 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +02 +15 +15 +33 +51 +56 +90 +76 +12 +36 +06 +02 +ENDCHAR +STARTCHAR U_F805 +ENCODING 63493 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +26 +D2 +94 +14 +26 +42 +42 +82 +F2 +02 +06 +ENDCHAR +STARTCHAR U_F806 +ENCODING 63494 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +02 +25 +D5 +93 +11 +26 +42 +46 +84 +F6 +06 +02 +ENDCHAR +STARTCHAR U_F807 +ENCODING 63495 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +26 +52 +84 +84 +E6 +92 +92 +92 +62 +02 +06 +ENDCHAR +STARTCHAR U_F808 +ENCODING 63496 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +04 +CA +4A +4A +44 +44 +4A +44 +EA +0A +04 +ENDCHAR +STARTCHAR U_F809 +ENCODING 63497 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 12 3 -1 +BITMAP +04 +0A +C8 +4E +4A +44 +44 +4A +44 +E2 +0A +04 +ENDCHAR +STARTCHAR U_F80A +ENCODING 63498 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +26 +D4 +92 +16 +26 +46 +46 +84 +F2 +06 +ENDCHAR +STARTCHAR U_F80B +ENCODING 63499 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 0 +BITMAP +02 +44 +B4 +96 +26 +60 +10 +16 +92 +62 +06 +ENDCHAR +STARTCHAR U_F80C +ENCODING 63500 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 12 2 -1 +BITMAP +02 +14 +16 +35 +55 +52 +96 +72 +14 +33 +05 +02 +ENDCHAR +STARTCHAR U_F80D +ENCODING 63501 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +02 +E4 +86 +86 +E6 +10 +16 +92 +62 +06 +ENDCHAR +STARTCHAR U_F80E +ENCODING 63502 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +24 +54 +86 +86 +E6 +90 +96 +92 +62 +06 +ENDCHAR +STARTCHAR U_F80F +ENCODING 63503 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 0 +BITMAP +06 +F4 +A6 +26 +42 +44 +46 +44 +42 +06 +ENDCHAR +STARTCHAR U_F810 +ENCODING 63504 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +20 +D3 +95 +94 +67 +75 +95 +93 +60 +ENDCHAR +STARTCHAR U_F811 +ENCODING 63505 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 0 +BITMAP +02 +04 +E4 +96 +96 +96 +76 +14 +24 +E2 +06 +ENDCHAR +STARTCHAR U_F812 +ENCODING 63506 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 3 -1 +BITMAP +0C +E8 +AE +9A +94 +94 +96 +A4 +62 +0A +04 +ENDCHAR +STARTCHAR U_F813 +ENCODING 63507 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 9 2 1 +BITMAP +20 +D3 +95 +95 +62 +D5 +95 +93 +60 +ENDCHAR +STARTCHAR U_F814 +ENCODING 63508 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 11 2 -1 +BITMAP +06 +6A +9A +96 +92 +74 +16 +94 +6A +0A +04 +ENDCHAR +STARTCHAR U_F815 +ENCODING 63509 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 8 2 1 +BITMAP +60 +92 +95 +92 +95 +95 +92 +60 +ENDCHAR +STARTCHAR U_F816 +ENCODING 63510 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 8 2 1 +BITMAP +6000 +9000 +9000 +9000 +9780 +9000 +9000 +6000 +ENDCHAR +STARTCHAR U_F817 +ENCODING 63511 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 3 2 6 +BITMAP +FF +01 +01 +ENDCHAR +STARTCHAR U_F818 +ENCODING 63512 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 10 6 -1 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_F819 +ENCODING 63513 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 5 6 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_F81A +ENCODING 63514 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 4 4 7 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR U_F81B +ENCODING 63515 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4140 +5540 +9520 +FFE0 +9120 +BFE0 +D120 +93A0 +9560 +5940 +4140 +ENDCHAR +STARTCHAR U_F81C +ENCODING 63516 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 9 0 0 +BITMAP +CE00 +4400 +6400 +54C0 +5520 +4D20 +4520 +E6C0 +0010 +ENDCHAR +STARTCHAR U_F81D +ENCODING 63517 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +F820 +A860 +2020 +2320 +24A0 +24A0 +27A0 +2420 +24A0 +7320 +ENDCHAR +STARTCHAR U_F900 +ENCODING 63744 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +0000 +FFE0 +0000 +3F80 +2080 +3F80 +1100 +FFE0 +ENDCHAR +STARTCHAR U_F901 +ENCODING 63745 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +0200 +3FC0 +2240 +3FC0 +2240 +3FC0 +0A00 +0400 +1B00 +E0E0 +ENDCHAR +STARTCHAR U_F902 +ENCODING 63746 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +3F80 +2480 +3F80 +2480 +3F80 +0400 +FFE0 +0400 +ENDCHAR +STARTCHAR U_F903 +ENCODING 63747 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +2080 +3C80 +2780 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_F904 +ENCODING 63748 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +05C0 +8540 +5FE0 +3460 +27C0 +C440 +47C0 +4440 +44C0 +ENDCHAR +STARTCHAR U_F905 +ENCODING 63749 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +4440 +7FC0 +0400 +FFE0 +8420 +FFE0 +8420 +0400 +0400 +ENDCHAR +STARTCHAR U_F906 +ENCODING 63750 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3FC0 +4040 +8040 +7C40 +4440 +4440 +7C40 +4440 +0040 +0180 +ENDCHAR +STARTCHAR U_F907 +ENCODING 63751 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2100 +FFC0 +4A40 +7BC0 +FAC0 +2B40 +FAC0 +2BE0 +FA20 +07E0 +ENDCHAR +STARTCHAR U_F908 +ENCODING 63752 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F00 +2100 +FFC0 +4A40 +7BC0 +FAC0 +2B40 +FAC0 +2BE0 +FA20 +07E0 +ENDCHAR +STARTCHAR U_F909 +ENCODING 63753 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1000 +7FE0 +1120 +7D20 +1220 +7CC0 +1400 +FFE0 +0A00 +1100 +E0E0 +ENDCHAR +STARTCHAR U_F90A +ENCODING 63754 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +0A00 +1100 +20E0 +DF40 +0400 +7FC0 +2480 +1480 +1500 +FFE0 +ENDCHAR +STARTCHAR U_F90B +ENCODING 63755 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +FF20 +A4A0 +BFA0 +B5A0 +B5A0 +FFA0 +A4A0 +0E20 +1520 +24E0 +ENDCHAR +STARTCHAR U_F90C +ENCODING 63756 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +0A00 +3180 +CE60 +0000 +7FC0 +0400 +2480 +4460 +8C20 +ENDCHAR +STARTCHAR U_F90D +ENCODING 63757 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +28E0 +3F40 +A9E0 +BEA0 +AAE0 +AAA0 +3EE0 +28A0 +3CE0 +2AC0 +2920 +ENDCHAR +STARTCHAR U_F90E +ENCODING 63758 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A140 +7FE0 +2520 +7FE0 +B520 +3FE0 +2D20 +57E0 +A620 +ENDCHAR +STARTCHAR U_F90F +ENCODING 63759 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2480 +4FE0 +F480 +47C0 +9480 +F7C0 +5480 +AFE0 +ENDCHAR +STARTCHAR U_F910 +ENCODING 63760 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0900 +7FE0 +4920 +7FE0 +2A80 +57E0 +FA80 +43E0 +FA80 +ABE0 +ENDCHAR +STARTCHAR U_F911 +ENCODING 63761 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +24A0 +FFE0 +ACA0 +AFE0 +A940 +FF80 +2120 +2FE0 +3AC0 +EDA0 +ENDCHAR +STARTCHAR U_F912 +ENCODING 63762 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FFC0 +1540 +2FC0 +7100 +AFE0 +2900 +2380 +2540 +2920 +ENDCHAR +STARTCHAR U_F913 +ENCODING 63763 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2AA0 +2FE0 +0440 +EBE0 +3D40 +25E0 +2940 +2FE0 +5500 +8FE0 +ENDCHAR +STARTCHAR U_F914 +ENCODING 63764 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F915 +ENCODING 63765 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27C0 +8440 +5A80 +1100 +2280 +2FE0 +C440 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_F916 +ENCODING 63766 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +23E0 +2A40 +B580 +A240 +AC20 +27C0 +3440 +4C40 +47C0 +8440 +ENDCHAR +STARTCHAR U_F917 +ENCODING 63767 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +2640 +2980 +7240 +2420 +27C0 +3C40 +E440 +47C0 +0440 +ENDCHAR +STARTCHAR U_F918 +ENCODING 63768 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4900 +27C0 +8480 +5B80 +1440 +2FE0 +E440 +27C0 +2440 +ENDCHAR +STARTCHAR U_F919 +ENCODING 63769 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +51E0 +5340 +FC80 +A940 +DA20 +8FE0 +FA20 +8A20 +FBE0 +8A20 +ENDCHAR +STARTCHAR U_F91A +ENCODING 63770 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7D00 +53E0 +7E20 +5140 +7C80 +5340 +7DE0 +5520 +AD20 +A5E0 +1920 +ENDCHAR +STARTCHAR U_F91B +ENCODING 63771 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD00 +5500 +FD00 +2900 +FD00 +A500 +FD00 +AD00 +9520 +AD20 +84E0 +ENDCHAR +STARTCHAR U_F91C +ENCODING 63772 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1800 +E7C0 +9440 +D440 +B540 +94C0 +9440 +F440 +1540 +2480 +C400 +ENDCHAR +STARTCHAR U_F91D +ENCODING 63773 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +FEE0 +2AA0 +3FE0 +6920 +AFE0 +AAA0 +2FE0 +2AA0 +2D60 +ENDCHAR +STARTCHAR U_F91E +ENCODING 63774 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2EE0 +2AA0 +AEE0 +BAA0 +AEE0 +A920 +2FE0 +2AA0 +5FE0 +4BA0 +8D60 +ENDCHAR +STARTCHAR U_F91F +ENCODING 63775 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBE0 +8A20 +FBE0 +FFE0 +AAA0 +BFA0 +9520 +A4E0 +ENDCHAR +STARTCHAR U_F920 +ENCODING 63776 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +50E0 +EE40 +4AE0 +BFA0 +2080 +3FE0 +2080 +3FE0 +D4A0 +ENDCHAR +STARTCHAR U_F921 +ENCODING 63777 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +4440 +7FC0 +4140 +5E40 +4440 +5F40 +5540 +5F40 +4560 +BEA0 +ENDCHAR +STARTCHAR U_F922 +ENCODING 63778 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +3480 +1EE0 +9300 +5E40 +3420 +5F00 +C000 +4FE0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_F923 +ENCODING 63779 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +9100 +F9E0 +8A80 +FC40 +9000 +FFC0 +4A40 +4A40 +FFE0 +ENDCHAR +STARTCHAR U_F924 +ENCODING 63780 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8F80 +4A80 +FFE0 +2900 +4F40 +5A20 +EF00 +5FE0 +4AA0 +4AA0 +5FE0 +ENDCHAR +STARTCHAR U_F925 +ENCODING 63781 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2100 +F800 +27E0 +2C40 +3440 +E280 +2280 +2280 +A100 +6FE0 +ENDCHAR +STARTCHAR U_F926 +ENCODING 63782 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7540 +5A80 +5540 +7FE0 +5AA0 +5FE0 +77C0 +5540 +57C0 +9540 +B7A0 +ENDCHAR +STARTCHAR U_F927 +ENCODING 63783 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +22A0 +2540 +FAA0 +AFE0 +AAA0 +AFE0 +FD20 +2BA0 +2D60 +3BA0 +ED20 +ENDCHAR +STARTCHAR U_F928 +ENCODING 63784 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +5EE0 +52A0 +5EA0 +52C0 +5EA0 +54E0 +9A80 +8080 +ENDCHAR +STARTCHAR U_F929 +ENCODING 63785 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21E0 +1120 +7D20 +45E0 +7D20 +4520 +7DE0 +5120 +4920 +F620 +4460 +ENDCHAR +STARTCHAR U_F92A +ENCODING 63786 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27C0 +8440 +57C0 +1440 +27C0 +2520 +C540 +4580 +4640 +4420 +ENDCHAR +STARTCHAR U_F92B +ENCODING 63787 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +57C0 +2440 +57C0 +9440 +37C0 +5520 +9540 +1480 +7540 +2620 +ENDCHAR +STARTCHAR U_F92C +ENCODING 63788 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +7D20 +4540 +7D40 +4580 +7D40 +4120 +4920 +55E0 +E540 +4100 +ENDCHAR +STARTCHAR U_F92D +ENCODING 63789 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +0400 +2480 +2480 +5540 +8E20 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_F92E +ENCODING 63790 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8300 +4480 +0840 +3220 +2100 +4FC0 +C040 +4080 +4700 +4100 +0080 +ENDCHAR +STARTCHAR U_F92F +ENCODING 63791 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2100 +B580 +A500 +5280 +8C40 +FFC0 +8840 +7F80 +1080 +2480 +C300 +ENDCHAR +STARTCHAR U_F930 +ENCODING 63792 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2200 +FFE0 +2A20 +2FE0 +3AA0 +EBE0 +2AA0 +37E0 +A220 +6CC0 +ENDCHAR +STARTCHAR U_F931 +ENCODING 63793 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2380 +2480 +FFE0 +2920 +2FE0 +3920 +6FE0 +A440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_F932 +ENCODING 63794 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +21C0 +2100 +AFE0 +B920 +AFE0 +AD40 +2FC0 +2D40 +4FE0 +5AA0 +AFE0 +ENDCHAR +STARTCHAR U_F933 +ENCODING 63795 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FC0 +5460 +5FC0 +5240 +5FC0 +9540 +FFE0 +ENDCHAR +STARTCHAR U_F934 +ENCODING 63796 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +0880 +7E80 +0900 +FFC0 +0800 +1180 +3600 +D840 +1040 +0FC0 +ENDCHAR +STARTCHAR U_F935 +ENCODING 63797 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FE0 +4420 +5FE0 +4A80 +5FC0 +5540 +9540 +FFE0 +ENDCHAR +STARTCHAR U_F936 +ENCODING 63798 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +0400 +7FE0 +4420 +5FE0 +5240 +7FE0 +5240 +7FE0 +4420 +B9C0 +ENDCHAR +STARTCHAR U_F937 +ENCODING 63799 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9240 +9640 +F180 +2240 +BFE0 +A240 +A240 +BBC0 +E240 +ENDCHAR +STARTCHAR U_F938 +ENCODING 63800 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +F3C0 +9640 +F180 +2660 +BA40 +A3C0 +F240 +ENDCHAR +STARTCHAR U_F939 +ENCODING 63801 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1F00 +2200 +7FC0 +C440 +7FC0 +4440 +7FC0 +A0A0 +3F80 +2080 +3F80 +ENDCHAR +STARTCHAR U_F93A +ENCODING 63802 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F3C0 +9680 +F140 +27E0 +AA40 +FFC0 +4080 +7FC0 +4080 +7FE0 +94A0 +ENDCHAR +STARTCHAR U_F93B +ENCODING 63803 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +03C0 +F280 +2780 +2080 +7FE0 +D520 +51C0 +5340 +7520 +5920 +0300 +ENDCHAR +STARTCHAR U_F93C +ENCODING 63804 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2240 +F7C0 +1080 +27E0 +7120 +AD40 +2380 +2540 +2920 +2300 +ENDCHAR +STARTCHAR U_F93D +ENCODING 63805 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +2240 +5780 +F080 +2FE0 +5120 +ED40 +0380 +5540 +A920 +AF20 +ENDCHAR +STARTCHAR U_F93E +ENCODING 63806 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0F00 +1100 +FFE0 +2440 +1680 +1D00 +2480 +CC60 +ENDCHAR +STARTCHAR U_F93F +ENCODING 63807 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +5240 +8BC0 +7840 +27E0 +F880 +22A0 +A9C0 +72A0 +3CA0 +E180 +ENDCHAR +STARTCHAR U_F940 +ENCODING 63808 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4900 +7FE0 +4920 +7FE0 +5120 +5D40 +51A0 +9D20 +90E0 +ENDCHAR +STARTCHAR U_F941 +ENCODING 63809 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +F280 +0440 +FBA0 +0000 +FFE0 +0AA0 +FFE0 +9AA0 +FAA0 +9860 +ENDCHAR +STARTCHAR U_F942 +ENCODING 63810 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FA00 +53E0 +FC20 +8BE0 +EA00 +BBE0 +8A20 +7FE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F943 +ENCODING 63811 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +3F80 +0400 +FFE0 +1100 +FFE0 +1100 +1100 +2100 +C100 +ENDCHAR +STARTCHAR U_F944 +ENCODING 63812 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +9340 +FDE0 +2900 +FFE0 +4820 +7BE0 +4A00 +7BC0 +4A20 +5BE0 +ENDCHAR +STARTCHAR U_F945 +ENCODING 63813 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7DE0 +2900 +FFE0 +4500 +7DC0 +4520 +FFE0 +1080 +1F80 +1080 +7FE0 +ENDCHAR +STARTCHAR U_F946 +ENCODING 63814 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +8440 +2400 +3F80 +4400 +8400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_F947 +ENCODING 63815 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0800 +1F80 +3080 +DF80 +0000 +FBE0 +4100 +FBE0 +4920 +79E0 +ENDCHAR +STARTCHAR U_F948 +ENCODING 63816 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93C0 +9680 +F100 +9280 +F460 +9FC0 +F440 +0440 +67C0 +9440 +ENDCHAR +STARTCHAR U_F949 +ENCODING 63817 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +A4A0 +0400 +7FC0 +4440 +7FC0 +4440 +7FC0 +ENDCHAR +STARTCHAR U_F94A +ENCODING 63818 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2480 +3F80 +2480 +FFE0 +AAA0 +FBE0 +AAA0 +FFE0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F94B +ENCODING 63819 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4A80 +7FE0 +4A40 +7FE0 +4480 +4880 +8700 +BCE0 +ENDCHAR +STARTCHAR U_F94C +ENCODING 63820 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +2540 +FFE0 +2540 +3FE0 +6520 +AFE0 +2240 +2180 +2E60 +ENDCHAR +STARTCHAR U_F94D +ENCODING 63821 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +0820 +8FE0 +5940 +2920 +2FE0 +C900 +4980 +5260 +6C20 +ENDCHAR +STARTCHAR U_F94E +ENCODING 63822 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +0FE0 +9800 +5FE0 +2900 +2FE0 +CDA0 +4B60 +5DA0 +4960 +ENDCHAR +STARTCHAR U_F94F +ENCODING 63823 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +0900 +3E00 +1080 +7F40 +1500 +ECE0 +ENDCHAR +STARTCHAR U_F950 +ENCODING 63824 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +4540 +FFE0 +2540 +5FE0 +F920 +0FE0 +5480 +AB80 +AE60 +ENDCHAR +STARTCHAR U_F951 +ENCODING 63825 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +E7E0 +A080 +A3E0 +AAA0 +CAA0 +AB60 +AA20 +AA20 +EA60 +8800 +8FE0 +ENDCHAR +STARTCHAR U_F952 +ENCODING 63826 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +F900 +5100 +73E0 +2120 +F920 +A920 +F920 +2220 +FCA0 +2440 +ENDCHAR +STARTCHAR U_F953 +ENCODING 63827 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7900 +4900 +4900 +7FE0 +4920 +4920 +7920 +4920 +4A20 +8D20 +98C0 +ENDCHAR +STARTCHAR U_F954 +ENCODING 63828 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +7FE0 +5540 +1740 +1040 +3FC0 +C200 +7FE0 +4A80 +5240 +6220 +ENDCHAR +STARTCHAR U_F955 +ENCODING 63829 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8200 +5FC0 +4200 +1FE0 +2880 +5440 +CFA0 +5480 +4300 +4480 +7860 +ENDCHAR +STARTCHAR U_F956 +ENCODING 63830 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +E7C0 +2100 +FFE0 +2240 +3520 +2BC0 +6540 +A880 +2340 +2C20 +ENDCHAR +STARTCHAR U_F957 +ENCODING 63831 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +27C0 +5100 +FFE0 +2440 +5A20 +EBC0 +0680 +5900 +AA80 +AC60 +ENDCHAR +STARTCHAR U_F958 +ENCODING 63832 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1500 +7FC0 +0400 +FFE0 +2880 +DF60 +2900 +0600 +F9E0 +ENDCHAR +STARTCHAR U_F959 +ENCODING 63833 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A440 +9A20 +97C0 +FC80 +A300 +8480 +9860 +ENDCHAR +STARTCHAR U_F95A +ENCODING 63834 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0100 +FFE0 +0AA0 +FFE0 +0440 +F7C0 +9440 +F7C0 +9C60 +ENDCHAR +STARTCHAR U_F95B +ENCODING 63835 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +FE40 +4980 +2A60 +DF80 +0200 +3FC0 +0200 +FFE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_F95C +ENCODING 63836 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F95D +ENCODING 63837 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +FFE0 +0480 +F200 +0FE0 +F200 +07C0 +FC40 +9440 +F7C0 +9440 +ENDCHAR +STARTCHAR U_F95E +ENCODING 63838 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F00 +2100 +2900 +2500 +2100 +FFC0 +2100 +2100 +2100 +4700 +8200 +ENDCHAR +STARTCHAR U_F95F +ENCODING 63839 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8AA0 +AA60 +5F80 +0000 +3F80 +2A80 +FFE0 +0200 +1E00 +ENDCHAR +STARTCHAR U_F960 +ENCODING 63840 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +FA40 +4A40 +4A80 +3180 +2E60 +C000 +1440 +5220 +50A0 +8F80 +ENDCHAR +STARTCHAR U_F961 +ENCODING 63841 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8840 +5280 +0C00 +2A80 +DF40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_F962 +ENCODING 63842 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +4440 +7FC0 +4440 +7FC0 +1100 +FFC0 +1100 +FFE0 +1100 +E0E0 +ENDCHAR +STARTCHAR U_F963 +ENCODING 63843 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +0900 +0920 +7940 +0980 +0900 +0900 +0900 +1920 +E920 +48E0 +ENDCHAR +STARTCHAR U_F964 +ENCODING 63844 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07C0 +F520 +2340 +2FE0 +7340 +D520 +5FE0 +5520 +77E0 +5520 +07E0 +ENDCHAR +STARTCHAR U_F965 +ENCODING 63845 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2100 +2FE0 +2920 +6FE0 +A920 +2FE0 +2500 +2200 +2500 +28E0 +ENDCHAR +STARTCHAR U_F966 +ENCODING 63846 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1400 +27E0 +4C40 +97C0 +2440 +67C0 +A200 +27E0 +2A40 +2180 +2660 +ENDCHAR +STARTCHAR U_F967 +ENCODING 63847 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0040 +FFE0 +0200 +0400 +0D00 +1480 +2460 +4420 +8400 +0400 +0400 +ENDCHAR +STARTCHAR U_F968 +ENCODING 63848 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +20A0 +8220 +5240 +1240 +2AA0 +2AA0 +D300 +4240 +4640 +49C0 +ENDCHAR +STARTCHAR U_F969 +ENCODING 63849 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +7D00 +55E0 +FF40 +5540 +FD40 +9540 +FF40 +2880 +1940 +E620 +ENDCHAR +STARTCHAR U_F96A +ENCODING 63850 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FC0 +0400 +FFE0 +8920 +3E00 +0840 +7FC0 +1520 +2480 +CC60 +ENDCHAR +STARTCHAR U_F96B +ENCODING 63851 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1100 +3E80 +5140 +FFC0 +2080 +CC60 +3300 +0C80 +0300 +7C00 +ENDCHAR +STARTCHAR U_F96C +ENCODING 63852 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +9120 +7FC0 +1100 +FFE0 +1100 +2480 +5F40 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F96D +ENCODING 63853 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +1480 +2560 +C620 +1FC0 +3040 +DFC0 +1040 +1FC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_F96E +ENCODING 63854 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +2900 +FFE0 +2900 +2F00 +3FC0 +0400 +FFE0 +1500 +E4E0 +ENDCHAR +STARTCHAR U_F96F +ENCODING 63855 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +07C0 +F440 +0440 +F7C0 +0280 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_F970 +ENCODING 63856 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +D9C0 +2140 +D940 +3260 +2800 +FBE0 +2140 +3140 +6880 +A540 +2220 +ENDCHAR +STARTCHAR U_F971 +ENCODING 63857 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2000 +2FC0 +2000 +3FE0 +2A20 +2A40 +2980 +4880 +4A40 +8C20 +ENDCHAR +STARTCHAR U_F972 +ENCODING 63858 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +8FE0 +5920 +1140 +2100 +2100 +C100 +4320 +4520 +58E0 +ENDCHAR +STARTCHAR U_F973 +ENCODING 63859 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2100 +FA80 +2440 +2BA0 +3000 +E7C0 +2440 +2440 +A7C0 +6440 +ENDCHAR +STARTCHAR U_F974 +ENCODING 63860 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1100 +FFC0 +1100 +0000 +FFC0 +1000 +3F80 +5080 +9080 +1F80 +1080 +ENDCHAR +STARTCHAR U_F975 +ENCODING 63861 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +F000 +27C0 +2440 +37C0 +E540 +2100 +2540 +A920 +7320 +ENDCHAR +STARTCHAR U_F976 +ENCODING 63862 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FBC0 +AE40 +A980 +FA40 +AC20 +ABC0 +AA40 +FA40 +8BC0 +0240 +ENDCHAR +STARTCHAR U_F977 +ENCODING 63863 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2080 +3F80 +0000 +FFE0 +8020 +1F00 +1120 +2120 +C0E0 +ENDCHAR +STARTCHAR U_F978 +ENCODING 63864 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +0400 +7FC0 +4440 +5540 +5540 +5540 +6EC0 +4440 +4440 +40C0 +ENDCHAR +STARTCHAR U_F979 +ENCODING 63865 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8100 +4FE0 +4000 +07C0 +2440 +2440 +27C0 +C100 +4540 +4920 +5320 +ENDCHAR +STARTCHAR U_F97A +ENCODING 63866 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5F80 +A280 +4AC0 +2AA0 +D4A0 +4980 +5400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F97B +ENCODING 63867 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +AC40 +77C0 +2440 +FFE0 +2540 +37C0 +6D40 +AFE0 +2100 +2FE0 +ENDCHAR +STARTCHAR U_F97C +ENCODING 63868 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +7F80 +4080 +7F80 +4080 +7FA0 +4440 +4280 +4100 +4C80 +F060 +ENDCHAR +STARTCHAR U_F97D +ENCODING 63869 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +FFE0 +0000 +F7C0 +0440 +F7C0 +0100 +F540 +9540 +F920 +9320 +ENDCHAR +STARTCHAR U_F97E +ENCODING 63870 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_F97F +ENCODING 63871 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE80 +9480 +BE80 +ABE0 +BEA0 +AAA0 +FEA0 +CAA0 +FEA0 +C320 +C640 +ENDCHAR +STARTCHAR U_F980 +ENCODING 63872 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +7F00 +4100 +4100 +7F00 +4900 +1000 +FF80 +8080 +8080 +FF80 +8080 +ENDCHAR +STARTCHAR U_F981 +ENCODING 63873 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1000 +1000 +1000 +FFC0 +1200 +2200 +2200 +1400 +0E00 +1100 +6080 +ENDCHAR +STARTCHAR U_F982 +ENCODING 63874 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4200 +5FE0 +5240 +52A0 +57E0 +5540 +6FE0 +AAA0 +9FE0 +ENDCHAR +STARTCHAR U_F983 +ENCODING 63875 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +1200 +FBE0 +4440 +7B80 +4AA0 +4AC0 +4A80 +4A80 +6B40 +9220 +ENDCHAR +STARTCHAR U_F984 +ENCODING 63876 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +43C0 +2200 +0FE0 +8A20 +4FE0 +2920 +2FE0 +C920 +57E0 +6D40 +47A0 +ENDCHAR +STARTCHAR U_F985 +ENCODING 63877 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +FA80 +4FE0 +4A80 +EFC0 +A940 +AFC0 +A940 +EFE0 +A960 +17A0 +ENDCHAR +STARTCHAR U_F986 +ENCODING 63878 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +8A20 +FBE0 +8A20 +FBE0 +9F20 +9120 +BFA0 +A0A0 +BFA0 +8060 +ENDCHAR +STARTCHAR U_F987 +ENCODING 63879 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FEE0 +A000 +FEE0 +AAA0 +FFE0 +AAA0 +FFE0 +5AA0 +ABC0 +AAA0 +13E0 +ENDCHAR +STARTCHAR U_F988 +ENCODING 63880 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +4A40 +6B40 +5AC0 +7FE0 +4A40 +7FC0 +6240 +BFA0 +A220 +BBE0 +ENDCHAR +STARTCHAR U_F989 +ENCODING 63881 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +23E0 +FCA0 +20A0 +7520 +AAC0 +1500 +E5E0 +1E00 +3580 +CC60 +ENDCHAR +STARTCHAR U_F98A +ENCODING 63882 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +0800 +0800 +0800 +FF80 +0880 +0880 +1080 +1080 +2080 +4480 +8300 +ENDCHAR +STARTCHAR U_F98B +ENCODING 63883 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +5DC0 +4880 +7FE0 +5DC0 +6AA0 +5FC0 +5040 +5FC0 +9040 +9FC0 +ENDCHAR +STARTCHAR U_F98C +ENCODING 63884 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4440 +5980 +4880 +7FE0 +4880 +5DC0 +6AA0 +53C0 +9200 +BFE0 +ENDCHAR +STARTCHAR U_F98D +ENCODING 63885 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2520 +FBA0 +26C0 +FBA0 +AAC0 +FFE0 +A900 +FFE0 +2380 +F540 +2920 +ENDCHAR +STARTCHAR U_F98E +ENCODING 63886 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +7FE0 +4200 +8200 +3FC0 +2200 +2200 +FFE0 +0200 +0200 +0200 +ENDCHAR +STARTCHAR U_F98F +ENCODING 63887 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3240 +2A80 +BFE0 +AA80 +B260 +A840 +2FE0 +3140 +2BE0 +2440 +3840 +ENDCHAR +STARTCHAR U_F990 +ENCODING 63888 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +AEA0 +E0C0 +4FA0 +E0C0 +4F40 +AAA0 +0E00 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_F991 +ENCODING 63889 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2480 +26C0 +FAA0 +2FE0 +2A80 +3540 +E540 +2A20 +2540 +AAA0 +6AA0 +ENDCHAR +STARTCHAR U_F992 +ENCODING 63890 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +53E0 +2880 +0BE0 +82A0 +5BE0 +2AA0 +2BE0 +C880 +4BE0 +5480 +63E0 +ENDCHAR +STARTCHAR U_F993 +ENCODING 63891 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +2100 +BFE0 +AAA0 +A920 +2FE0 +2300 +5580 +4940 +9120 +ENDCHAR +STARTCHAR U_F994 +ENCODING 63892 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0080 +FFE0 +2AA0 +23E0 +7AA0 +2BE0 +2880 +3BE0 +E880 +5480 +23E0 +ENDCHAR +STARTCHAR U_F995 +ENCODING 63893 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +01C0 +7E00 +0400 +FFE0 +2480 +C560 +1E00 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_F996 +ENCODING 63894 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7E0 +26A0 +5520 +EFE0 +0180 +5340 +AD20 +A920 +ENDCHAR +STARTCHAR U_F997 +ENCODING 63895 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +A440 +AAA0 +E440 +AAA0 +A660 +EAA0 +AAA0 +AEE0 +F280 +2C80 +ENDCHAR +STARTCHAR U_F998 +ENCODING 63896 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +2080 +FBE0 +5540 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_F999 +ENCODING 63897 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +9FE0 +4940 +EFC0 +2940 +3FE0 +2100 +5100 +8FE0 +ENDCHAR +STARTCHAR U_F99A +ENCODING 63898 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +2540 +07C0 +E540 +27C0 +2100 +2FE0 +2100 +5000 +8FE0 +ENDCHAR +STARTCHAR U_F99B +ENCODING 63899 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +8900 +7FE0 +2AA0 +FFE0 +2100 +AB80 +7540 +3920 +E100 +ENDCHAR +STARTCHAR U_F99C +ENCODING 63900 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FC40 +2140 +2140 +3D40 +4540 +C540 +2940 +1140 +2040 +4040 +81C0 +ENDCHAR +STARTCHAR U_F99D +ENCODING 63901 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +2500 +4480 +8140 +1E00 +E400 +3FC0 +0440 +0840 +1240 +E180 +ENDCHAR +STARTCHAR U_F99E +ENCODING 63902 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FE0 +E820 +A920 +AFE0 +A920 +A920 +A9A0 +EA60 +AC20 +0FE0 +0820 +ENDCHAR +STARTCHAR U_F99F +ENCODING 63903 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FE20 +2120 +3D20 +4920 +A920 +1120 +20E0 +C040 +1240 +4920 +8920 +ENDCHAR +STARTCHAR U_F9A0 +ENCODING 63904 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FC20 +2120 +7D20 +A920 +10E0 +2400 +FFE0 +1220 +3140 +D480 +1860 +ENDCHAR +STARTCHAR U_F9A1 +ENCODING 63905 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +F280 +07C0 +F440 +0440 +F7C0 +0280 +F280 +92A0 +F4A0 +9860 +ENDCHAR +STARTCHAR U_F9A2 +ENCODING 63906 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4500 +5FE0 +4540 +7FE0 +4540 +5FC0 +4D80 +9540 +A520 +ENDCHAR +STARTCHAR U_F9A3 +ENCODING 63907 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0E00 +1100 +2480 +C260 +3F80 +0100 +0200 +1440 +52A0 +50A0 +8F80 +ENDCHAR +STARTCHAR U_F9A4 +ENCODING 63908 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +FC40 +2120 +2FC0 +3080 +E100 +2240 +2AA0 +AA60 +71C0 +ENDCHAR +STARTCHAR U_F9A5 +ENCODING 63909 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F900 +4280 +4440 +7FE0 +5000 +5EE0 +B2A0 +1EE0 +2440 +4AA0 +9120 +ENDCHAR +STARTCHAR U_F9A6 +ENCODING 63910 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +9480 +7FE0 +4A00 +7FC0 +4A40 +7FE0 +4A40 +BFC0 +2A80 +CA60 +ENDCHAR +STARTCHAR U_F9A7 +ENCODING 63911 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8520 +5A40 +2520 +6FE0 +AAA0 +2FE0 +6DC0 +AB40 +2DC0 +EB40 +4D20 +ENDCHAR +STARTCHAR U_F9A8 +ENCODING 63912 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0C00 +1200 +2100 +4880 +8440 +7F80 +0100 +0200 +1C00 +0400 +0200 +ENDCHAR +STARTCHAR U_F9A9 +ENCODING 63913 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +8420 +8A20 +9520 +E4E0 +9FA0 +8920 +8620 +8220 +FFE0 +8020 +ENDCHAR +STARTCHAR U_F9AA +ENCODING 63914 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +FFE0 +8AA0 +AA60 +5F80 +0000 +3F80 +2A80 +FFE0 +0200 +1E00 +ENDCHAR +STARTCHAR U_F9AB +ENCODING 63915 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8420 +FFE0 +2100 +57C0 +AC40 +27C0 +FC40 +17C0 +A440 +47C0 +2820 +ENDCHAR +STARTCHAR U_F9AC +ENCODING 63916 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2280 +A440 +B920 +A080 +AFE0 +2040 +2280 +2100 +2080 +2080 +ENDCHAR +STARTCHAR U_F9AD +ENCODING 63917 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FA80 +2440 +2A20 +7100 +2000 +27E0 +3840 +E280 +4100 +0080 +ENDCHAR +STARTCHAR U_F9AE +ENCODING 63918 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +56A0 +5AC0 +3180 +4A40 +FFE0 +8020 +7FC0 +0400 +3FC0 +0480 +FFE0 +ENDCHAR +STARTCHAR U_F9AF +ENCODING 63919 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8900 +5100 +FA80 +2440 +2120 +F880 +27E0 +F840 +2380 +4080 +8040 +ENDCHAR +STARTCHAR U_F9B0 +ENCODING 63920 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD80 +4A40 +4A40 +7D20 +48A0 +7800 +4FE0 +4840 +F980 +0880 +0840 +ENDCHAR +STARTCHAR U_F9B1 +ENCODING 63921 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +5140 +8A20 +7D00 +2080 +F800 +23E0 +A820 +7140 +3880 +E040 +ENDCHAR +STARTCHAR U_F9B2 +ENCODING 63922 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +0E00 +3180 +C460 +3F80 +0100 +0E00 +0300 +ENDCHAR +STARTCHAR U_F9B3 +ENCODING 63923 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +0400 +FFE0 +9520 +2480 +EEE0 +AAA0 +FFE0 +2480 +5540 +FFE0 +ENDCHAR +STARTCHAR U_F9B4 +ENCODING 63924 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +3080 +4BE0 +A620 +13E0 +FA20 +0BE0 +5220 +23E0 +1240 +1420 +ENDCHAR +STARTCHAR U_F9B5 +ENCODING 63925 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F20 +2420 +24A0 +2EA0 +72A0 +AAA0 +26A0 +22A0 +2420 +2820 +30E0 +ENDCHAR +STARTCHAR U_F9B6 +ENCODING 63926 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +2FE0 +FAA0 +1FE0 +2AA0 +7FE0 +A440 +27C0 +2280 +2100 +2FE0 +ENDCHAR +STARTCHAR U_F9B7 +ENCODING 63927 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FA80 +57E0 +52A0 +FFE0 +AAA0 +DFE0 +8A40 +FBC0 +8A40 +F980 +8FE0 +ENDCHAR +STARTCHAR U_F9B8 +ENCODING 63928 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FFC0 +2140 +77E0 +A940 +77C0 +0120 +FDC0 +2B40 +A520 +6320 +ENDCHAR +STARTCHAR U_F9B9 +ENCODING 63929 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7BC0 +4040 +7BC0 +0A00 +FFE0 +1400 +5240 +50A0 +8FA0 +ENDCHAR +STARTCHAR U_F9BA +ENCODING 63930 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FF80 +0100 +0200 +0400 +0400 +0400 +0400 +0400 +2400 +1C00 +0800 +ENDCHAR +STARTCHAR U_F9BB +ENCODING 63931 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +3FE0 +5540 +4F80 +D8C0 +6F80 +4880 +4F80 +4A80 +5240 +6620 +ENDCHAR +STARTCHAR U_F9BC +ENCODING 63932 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8420 +FFE0 +5240 +3F80 +E0E0 +3F80 +1500 +2480 +CC60 +ENDCHAR +STARTCHAR U_F9BD +ENCODING 63933 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FC0 +2040 +3FC0 +2200 +2260 +3F40 +2680 +2A80 +5240 +AE20 +0400 +ENDCHAR +STARTCHAR U_F9BE +ENCODING 63934 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2040 +AA40 +7140 +2040 +FA40 +2140 +3060 +6BC0 +A040 +2040 +2040 +ENDCHAR +STARTCHAR U_F9BF +ENCODING 63935 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +5E40 +92A0 +FFE0 +5240 +FFE0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F9C0 +ENCODING 63936 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +AAA0 +B7C0 +AC60 +37C0 +2440 +27C0 +5540 +4920 +9320 +ENDCHAR +STARTCHAR U_F9C1 +ENCODING 63937 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A200 +7FE0 +34A0 +6FC0 +B8A0 +2F80 +2580 +4940 +B320 +ENDCHAR +STARTCHAR U_F9C2 +ENCODING 63938 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +FBC0 +2940 +18C0 +2E40 +F1E0 +1E00 +00C0 +1F00 +ENDCHAR +STARTCHAR U_F9C3 +ENCODING 63939 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +3FE0 +2AA0 +07C0 +EC60 +37C0 +2440 +27C0 +2940 +5320 +8FE0 +ENDCHAR +STARTCHAR U_F9C4 +ENCODING 63940 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11E0 +FF00 +45E0 +2820 +FFE0 +4500 +7DE0 +4500 +7DE0 +4520 +4DE0 +ENDCHAR +STARTCHAR U_F9C5 +ENCODING 63941 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2880 +2680 +FFE0 +8420 +7FC0 +2480 +3F80 +2480 +FFE0 +0400 +ENDCHAR +STARTCHAR U_F9C6 +ENCODING 63942 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F7C0 +9000 +A000 +CFE0 +A280 +9280 +9280 +F280 +A2A0 +84A0 +9860 +ENDCHAR +STARTCHAR U_F9C7 +ENCODING 63943 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +DE20 +8A20 +AAA0 +D6A0 +28A0 +FEA0 +10A0 +FEA0 +9220 +5420 +FEE0 +ENDCHAR +STARTCHAR U_F9C8 +ENCODING 63944 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2140 +F940 +2140 +2140 +37C0 +6A40 +A240 +2240 +2240 +2FE0 +ENDCHAR +STARTCHAR U_F9C9 +ENCODING 63945 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +2CE0 +FAA0 +2AA0 +2AA0 +3AA0 +6EA0 +AAA0 +22E0 +2480 +2880 +ENDCHAR +STARTCHAR U_F9CA +ENCODING 63946 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2FE0 +8200 +5440 +1FA0 +2000 +2540 +C540 +4540 +4940 +5160 +ENDCHAR +STARTCHAR U_F9CB +ENCODING 63947 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2DE0 +08A0 +9AA0 +5F20 +2140 +2FE0 +C920 +4FE0 +4920 +4FE0 +ENDCHAR +STARTCHAR U_F9CC +ENCODING 63948 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2900 +2240 +77A0 +2020 +2540 +3D40 +E540 +4540 +1960 +ENDCHAR +STARTCHAR U_F9CD +ENCODING 63949 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +F7C0 +8240 +9240 +EDC0 +0880 +7F80 +4880 +7F80 +4880 +7F80 +4080 +ENDCHAR +STARTCHAR U_F9CE +ENCODING 63950 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2240 +27C0 +7020 +D540 +5540 +5540 +7540 +5940 +1060 +ENDCHAR +STARTCHAR U_F9CF +ENCODING 63951 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +2240 +5240 +F240 +2240 +57C0 +EA40 +0240 +5240 +AA40 +AFE0 +ENDCHAR +STARTCHAR U_F9D0 +ENCODING 63952 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +ABE0 +7080 +23E0 +FA20 +73E0 +AA20 +23E0 +FA20 +23E0 +5140 +8E20 +ENDCHAR +STARTCHAR U_F9D1 +ENCODING 63953 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0800 +0400 +0400 +FFC0 +0000 +1200 +1100 +2080 +4040 +8040 +ENDCHAR +STARTCHAR U_F9D2 +ENCODING 63954 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FD40 +B520 +6D00 +B7E0 +3100 +4D20 +A140 +5480 +29A0 +1260 +EC20 +ENDCHAR +STARTCHAR U_F9D3 +ENCODING 63955 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F100 +97C0 +A100 +CFE0 +A240 +9420 +9900 +F7C0 +A100 +8100 +9FE0 +ENDCHAR +STARTCHAR U_F9D4 +ENCODING 63956 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1380 +1440 +2BA0 +2000 +6FE0 +AAA0 +2AA0 +2FE0 +2AA0 +2AA0 +2860 +ENDCHAR +STARTCHAR U_F9D5 +ENCODING 63957 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +7FC0 +0400 +1B00 +EEE0 +0000 +7FC0 +4A40 +7FC0 +4A40 +40C0 +ENDCHAR +STARTCHAR U_F9D6 +ENCODING 63958 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4300 +2480 +0840 +97A0 +5000 +2FE0 +2AA0 +CFE0 +4AA0 +4AA0 +4860 +ENDCHAR +STARTCHAR U_F9D7 +ENCODING 63959 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +FA80 +2440 +FBA0 +A800 +FFE0 +AAA0 +FFE0 +2AA0 +FAA0 +2860 +ENDCHAR +STARTCHAR U_F9D8 +ENCODING 63960 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2200 +4FC0 +8240 +3FE0 +4240 +CFC0 +4200 +4FC0 +4200 +7FE0 +4200 +ENDCHAR +STARTCHAR U_F9D9 +ENCODING 63961 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2280 +AFE0 +BAA0 +AFE0 +A100 +2FE0 +2100 +2380 +2560 +3920 +ENDCHAR +STARTCHAR U_F9DA +ENCODING 63962 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FFE0 +0A00 +7FC0 +4A40 +7FC0 +0400 +FFE0 +1500 +2480 +4440 +8420 +ENDCHAR +STARTCHAR U_F9DB +ENCODING 63963 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8840 +5280 +0C00 +2A80 +DF40 +0400 +FFE0 +0400 +0400 +ENDCHAR +STARTCHAR U_F9DC +ENCODING 63964 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +97C0 +AC40 +C380 +AC60 +9500 +97E0 +F900 +A7C0 +8100 +9FE0 +ENDCHAR +STARTCHAR U_F9DD +ENCODING 63965 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C20 +F0A0 +10A0 +FEA0 +10A0 +38A0 +54A0 +92A0 +1020 +1020 +10E0 +ENDCHAR +STARTCHAR U_F9DE +ENCODING 63966 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +FFC0 +0400 +7F80 +4480 +7F80 +4480 +1400 +0800 +3600 +C1C0 +ENDCHAR +STARTCHAR U_F9DF +ENCODING 63967 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3FE0 +2020 +3FE0 +2520 +29E0 +3520 +2BE0 +3A40 +4D80 +4940 +8E20 +ENDCHAR +STARTCHAR U_F9E0 +ENCODING 63968 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2000 +3FC0 +D240 +2240 +C440 +1980 +ENDCHAR +STARTCHAR U_F9E1 +ENCODING 63969 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +1500 +2480 +C460 +1F80 +0100 +0240 +7FE0 +0200 +0E00 +ENDCHAR +STARTCHAR U_F9E2 +ENCODING 63970 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +F940 +1140 +FF40 +5540 +92C0 +0400 +FFE0 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F9E3 +ENCODING 63971 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47E0 +2420 +8420 +57E0 +1400 +2520 +2540 +C580 +4520 +4920 +50E0 +ENDCHAR +STARTCHAR U_F9E4 +ENCODING 63972 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +FD20 +2520 +27E0 +7520 +27E0 +2520 +3900 +E7C0 +4100 +0FE0 +ENDCHAR +STARTCHAR U_F9E5 +ENCODING 63973 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +3FE0 +A100 +6E20 +24A0 +7FA0 +A4A0 +2EA0 +35A0 +4420 +84E0 +ENDCHAR +STARTCHAR U_F9E6 +ENCODING 63974 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +2280 +A7E0 +BC80 +A7E0 +2480 +27E0 +2480 +27E0 +ENDCHAR +STARTCHAR U_F9E7 +ENCODING 63975 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +2480 +3F80 +2480 +7FC0 +0400 +FFE0 +3280 +D500 +18E0 +ENDCHAR +STARTCHAR U_F9E8 +ENCODING 63976 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2540 +FD40 +17C0 +2D40 +77C0 +A900 +2FC0 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_F9E9 +ENCODING 63977 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +7F80 +4480 +4480 +7F80 +4480 +7F80 +4480 +0400 +7F80 +0400 +FFC0 +ENDCHAR +STARTCHAR U_F9EA +ENCODING 63978 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1180 +FD40 +55E0 +6F40 +55E0 +7D40 +2140 +FDE0 +AD40 +B540 +8DE0 +ENDCHAR +STARTCHAR U_F9EB +ENCODING 63979 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +FFC0 +9200 +FF80 +9200 +FFC0 +8800 +9F00 +B100 +DF00 +8000 +FFC0 +ENDCHAR +STARTCHAR U_F9EC +ENCODING 63980 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5EE0 +2220 +1EE0 +9080 +5EE0 +3220 +2AA0 +C660 +5BA0 +4220 +4CC0 +ENDCHAR +STARTCHAR U_F9ED +ENCODING 63981 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +FFC0 +2100 +1200 +0C00 +1200 +FFC0 +2100 +2100 +3F00 +2100 +ENDCHAR +STARTCHAR U_F9EE +ENCODING 63982 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2920 +2540 +AFE0 +B940 +A520 +2F40 +2940 +25E0 +5340 +45E0 +8840 +ENDCHAR +STARTCHAR U_F9EF +ENCODING 63983 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0920 +F540 +2FE0 +2540 +7920 +2540 +2FE0 +3B40 +E7E0 +4440 +1840 +ENDCHAR +STARTCHAR U_F9F0 +ENCODING 63984 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0900 +FFE0 +4920 +79E0 +4920 +7BE0 +5FA0 +5220 +5FA0 +5220 +5FE0 +ENDCHAR +STARTCHAR U_F9F1 +ENCODING 63985 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F920 +9540 +AFE0 +C540 +A920 +9440 +97E0 +F940 +ABE0 +8440 +9840 +ENDCHAR +STARTCHAR U_F9F2 +ENCODING 63986 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4520 +7340 +97E0 +FB40 +AD20 +FA40 +ABE0 +FD40 +53E0 +AA40 +AC40 +ENDCHAR +STARTCHAR U_F9F3 +ENCODING 63987 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +12A0 +FDC0 +ABE0 +FCC0 +ADA0 +FD40 +ABE0 +BD40 +ABE0 +BA40 +2C40 +ENDCHAR +STARTCHAR U_F9F4 +ENCODING 63988 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +FBE0 +1100 +1100 +3B80 +5540 +9520 +1920 +1100 +1100 +ENDCHAR +STARTCHAR U_F9F5 +ENCODING 63989 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4880 +2880 +9FE0 +4880 +2D80 +3AC0 +2AA0 +CAA0 +4880 +4880 +4880 +ENDCHAR +STARTCHAR U_F9F6 +ENCODING 63990 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F400 +A7E0 +A800 +F3C0 +9240 +93C0 +F000 +AEE0 +AAA0 +AAA0 +FEE0 +ENDCHAR +STARTCHAR U_F9F7 +ENCODING 63991 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0C00 +0400 +7FC0 +0000 +2080 +2080 +1100 +1100 +1200 +0200 +FFE0 +ENDCHAR +STARTCHAR U_F9F8 +ENCODING 63992 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +7BE0 +A500 +9480 +0400 +7FC0 +0100 +1100 +0A00 +0A00 +FFE0 +ENDCHAR +STARTCHAR U_F9F9 +ENCODING 63993 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +A880 +77E0 +2000 +FA40 +2240 +7140 +A980 +A880 +2080 +2FE0 +ENDCHAR +STARTCHAR U_F9FA +ENCODING 63994 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5100 +5180 +5140 +5FE0 +7100 +1100 +F100 +5100 +5280 +5440 +9820 +ENDCHAR +STARTCHAR U_F9FB +ENCODING 63995 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +1F80 +3100 +4A00 +2C00 +F480 +1500 +2A00 +1100 +2080 +C060 +ENDCHAR +STARTCHAR U_F9FC +ENCODING 63996 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4480 +EFC0 +0AA0 +E480 +0FE0 +E080 +0EA0 +EAC0 +AEA0 +EB60 +AE20 +ENDCHAR +STARTCHAR U_F9FD +ENCODING 63997 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +1100 +2100 +2100 +6FE0 +A100 +2100 +2100 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_F9FE +ENCODING 63998 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +0400 +0A00 +3580 +C460 +3F80 +1500 +2480 +C460 +ENDCHAR +STARTCHAR U_F9FF +ENCODING 63999 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1020 +FEA0 +10A0 +FEA0 +92A0 +92A0 +96A0 +10A0 +3420 +5220 +9160 +ENDCHAR +STARTCHAR U_FA00 +ENCODING 64000 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +2120 +3920 +E120 +2120 +2920 +3220 +2220 +04A0 +0840 +ENDCHAR +STARTCHAR U_FA01 +ENCODING 64001 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4880 +7FE0 +4880 +4F80 +4000 +5FC0 +4880 +8700 +B8E0 +ENDCHAR +STARTCHAR U_FA02 +ENCODING 64002 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2000 +27E0 +F900 +2100 +2A00 +37E0 +EA20 +2220 +2220 +A3E0 +6220 +ENDCHAR +STARTCHAR U_FA03 +ENCODING 64003 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7540 +27E0 +FD40 +27C0 +7500 +AFE0 +A620 +2BE0 +3220 +ENDCHAR +STARTCHAR U_FA04 +ENCODING 64004 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4020 +8340 +3C00 +04C0 +0700 +7C00 +0420 +0420 +03E0 +ENDCHAR +STARTCHAR U_FA05 +ENCODING 64005 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2820 +8820 +5BA0 +1820 +2BA0 +2AA0 +CBA0 +4AA0 +4820 +48E0 +ENDCHAR +STARTCHAR U_FA06 +ENCODING 64006 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +1100 +FFE0 +5540 +8E20 +1500 +6CC0 +ENDCHAR +STARTCHAR U_FA07 +ENCODING 64007 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23E0 +F800 +21C0 +F940 +A9C0 +F800 +ABE0 +FAA0 +23E0 +FAA0 +23E0 +ENDCHAR +STARTCHAR U_FA08 +ENCODING 64008 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +4000 +8000 +1000 +2FE0 +6080 +A080 +2080 +2480 +2380 +2100 +ENDCHAR +STARTCHAR U_FA09 +ENCODING 64009 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F200 +93E0 +A640 +C180 +A660 +9080 +97E0 +F480 +AFE0 +8080 +8080 +ENDCHAR +STARTCHAR U_FA0A +ENCODING 64010 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +3F80 +2080 +3F80 +2A80 +0A20 +1220 +E1E0 +ENDCHAR +STARTCHAR U_FA0B +ENCODING 64011 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0200 +7FE0 +4800 +7FE0 +52A0 +52C0 +7EA0 +48A0 +7EE0 +8880 +9880 +ENDCHAR +STARTCHAR U_FA0C +ENCODING 64012 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0080 +FFC0 +1200 +1200 +1200 +1200 +1200 +2200 +2240 +4240 +81C0 +ENDCHAR +STARTCHAR U_FA0D +ENCODING 64013 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +11C0 +7D40 +1140 +FD40 +8660 +FFC0 +0140 +7940 +4880 +7940 +4A20 +ENDCHAR +STARTCHAR U_FA0E +ENCODING 64014 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1240 +FBE0 +4A40 +37E0 +2A40 +C3E0 +0000 +7FC0 +1080 +0F00 +70E0 +ENDCHAR +STARTCHAR U_FA0F +ENCODING 64015 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2440 +2100 +F280 +2440 +2820 +27C0 +3440 +C440 +07C0 +0440 +ENDCHAR +STARTCHAR U_FA10 +ENCODING 64016 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2820 +27C0 +F200 +2520 +2EC0 +3480 +CBC0 +06A0 +1880 +0300 +ENDCHAR +STARTCHAR U_FA11 +ENCODING 64017 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +2FE0 +2440 +AA80 +AFE0 +A840 +AF40 +BD40 +C740 +0040 +00C0 +ENDCHAR +STARTCHAR U_FA12 +ENCODING 64018 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +FFE0 +9100 +97C0 +F100 +9FE0 +9440 +F7C0 +9440 +07C0 +04C0 +ENDCHAR +STARTCHAR U_FA13 +ENCODING 64019 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +F280 +2240 +75E0 +6C40 +A540 +24C0 +2440 +2440 +24C0 +ENDCHAR +STARTCHAR U_FA14 +ENCODING 64020 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2540 +2FE0 +F280 +2440 +6BA0 +7100 +A7C0 +2100 +2FE0 +2100 +2300 +ENDCHAR +STARTCHAR U_FA15 +ENCODING 64021 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +BEE0 +64A0 +24A0 +6EA0 +AAE0 +AE80 +A480 +A4A0 +BEE0 +4A40 +9120 +ENDCHAR +STARTCHAR U_FA16 +ENCODING 64022 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +8920 +57A0 +2140 +57E0 +9100 +33E0 +5620 +9BE0 +1220 +73E0 +2220 +ENDCHAR +STARTCHAR U_FA17 +ENCODING 64023 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +1100 +FFE0 +1100 +2080 +4040 +BFA0 +2A80 +2A80 +2A80 +FFE0 +ENDCHAR +STARTCHAR U_FA18 +ENCODING 64024 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7200 +0200 +FA00 +2200 +2A00 +6A00 +6A00 +AA00 +2220 +2220 +21E0 +ENDCHAR +STARTCHAR U_FA19 +ENCODING 64025 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4080 +2080 +FFE0 +14A0 +27E0 +34A0 +6FE0 +A4A0 +2080 +2080 +2080 +ENDCHAR +STARTCHAR U_FA1A +ENCODING 64026 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4440 +2280 +FFE0 +1100 +27C0 +7100 +A900 +2FE0 +2100 +2100 +2100 +ENDCHAR +STARTCHAR U_FA1B +ENCODING 64027 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FE0 +2000 +07C0 +F440 +17C0 +2000 +3FE0 +6920 +AFE0 +2920 +2FE0 +ENDCHAR +STARTCHAR U_FA1C +ENCODING 64028 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +27E0 +F900 +07C0 +9100 +5FE0 +5440 +3FC0 +E440 +47C0 +04C0 +ENDCHAR +STARTCHAR U_FA1D +ENCODING 64029 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +AFE0 +7100 +23C0 +F900 +27E0 +3440 +6FC0 +A440 +27C0 +24C0 +ENDCHAR +STARTCHAR U_FA1E +ENCODING 64030 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +FBE0 +0820 +4920 +28A0 +0860 +18A0 +EB20 +4920 +0820 +79E0 +1040 +ENDCHAR +STARTCHAR U_FA1F +ENCODING 64031 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1100 +7BC0 +4A40 +7BC0 +4A40 +7BE0 +4E20 +8BA0 +9860 +ENDCHAR +STARTCHAR U_FA22 +ENCODING 64034 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4220 +F7A0 +0240 +FFE0 +0100 +F3C0 +0640 +FBC0 +9240 +F3C0 +9240 +ENDCHAR +STARTCHAR U_FA23 +ENCODING 64035 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1040 +1140 +7CC0 +1240 +FD40 +1040 +5CE0 +5340 +5040 +7040 +8FE0 +ENDCHAR +STARTCHAR U_FA24 +ENCODING 64036 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4FC0 +2440 +2480 +05E0 +E420 +2540 +2480 +2940 +2A20 +5000 +8FE0 +ENDCHAR +STARTCHAR U_FA25 +ENCODING 64037 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2780 +2900 +1FC0 +EA40 +2FC0 +2340 +2520 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_FA26 +ENCODING 64038 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +25E0 +FD20 +2940 +FF40 +2180 +7D40 +C520 +7D20 +45E0 +7D40 +4500 +ENDCHAR +STARTCHAR U_FA2A +ENCODING 64042 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2020 +53C0 +AA00 +FBE0 +8A20 +FA20 +8B20 +FAC0 +9240 +ACA0 +CD20 +ENDCHAR +STARTCHAR U_FA2B +ENCODING 64043 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +5020 +ABA0 +F820 +8BA0 +FAA0 +8AA0 +FBA0 +92A0 +A820 +C8E0 +ENDCHAR +STARTCHAR U_FA2C +ENCODING 64044 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +57E0 +AC20 +FBC0 +8A40 +FBC0 +8A00 +FBC0 +9240 +ABC0 +CA40 +ENDCHAR +STARTCHAR U_FA2D +ENCODING 64045 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +FBC0 +AA40 +53C0 +FA40 +53E0 +7A00 +53E0 +7AA0 +5560 +7D40 +ENDCHAR +STARTCHAR U_FA30 +ENCODING 64048 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +17E0 +1800 +27E0 +2520 +64A0 +AFE0 +2520 +24A0 +2FE0 +2020 +20C0 +ENDCHAR +STARTCHAR U_FA31 +ENCODING 64049 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1440 +1280 +2FE0 +2AA0 +6920 +AFE0 +2440 +27C0 +2440 +27C0 +2440 +ENDCHAR +STARTCHAR U_FA32 +ENCODING 64050 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +2000 +3E00 +4400 +7F80 +C880 +4880 +7F80 +0C00 +1440 +2440 +C3C0 +ENDCHAR +STARTCHAR U_FA33 +ENCODING 64051 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2080 +3880 +4BE0 +7CA0 +D4A0 +54A0 +7D20 +2A20 +2CC0 +4820 +87E0 +ENDCHAR +STARTCHAR U_FA34 +ENCODING 64052 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2880 +FE80 +2880 +7FE0 +54A0 +54A0 +FEA0 +10A0 +7D20 +12A0 +FC40 +ENDCHAR +STARTCHAR U_FA35 +ENCODING 64053 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0800 +7F80 +4480 +7F80 +4480 +7F80 +1400 +FFC0 +0400 +0400 +0400 +ENDCHAR +STARTCHAR U_FA36 +ENCODING 64054 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0FC0 +E840 +AFC0 +A840 +AFC0 +A400 +EFE0 +1920 +0AA0 +0F20 +00C0 +ENDCHAR +STARTCHAR U_FA37 +ENCODING 64055 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0280 +FFE0 +A280 +A7C0 +A540 +AFE0 +E100 +AFE0 +0100 +0680 +1860 +ENDCHAR +STARTCHAR U_FA38 +ENCODING 64056 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BC0 +4A40 +4A40 +7BC0 +0880 +FFE0 +4080 +FBE0 +4A40 +4A40 +7BC0 +ENDCHAR +STARTCHAR U_FA39 +ENCODING 64057 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27E0 +2420 +27E0 +FE20 +2540 +27E0 +2540 +3FE0 +E940 +4A40 +1440 +ENDCHAR +STARTCHAR U_FA3A +ENCODING 64058 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FC0 +5540 +7FC0 +0400 +3F80 +0400 +FFE0 +5540 +BFA0 +0400 +FFE0 +ENDCHAR +STARTCHAR U_FA3B +ENCODING 64059 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4020 +7FE0 +4480 +5FC0 +5540 +5FC0 +4880 +4F80 +4880 +8F80 +ENDCHAR +STARTCHAR U_FA3C +ENCODING 64060 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +0400 +0400 +4440 +4440 +4440 +7FC0 +4440 +0400 +0800 +3000 +C000 +ENDCHAR +STARTCHAR U_FA3D +ENCODING 64061 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +B000 +AFC0 +A540 +A540 +3FE0 +2940 +2FE0 +2040 +2180 +ENDCHAR +STARTCHAR U_FA3E +ENCODING 64062 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2A40 +AA40 +BF40 +ABE0 +AA40 +2E40 +2AC0 +2D40 +2A40 +2460 +ENDCHAR +STARTCHAR U_FA3F +ENCODING 64063 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2280 +2FE0 +A920 +BAA0 +AFE0 +A000 +27C0 +2440 +27C0 +2440 +27C0 +ENDCHAR +STARTCHAR U_FA40 +ENCODING 64064 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3500 +5FE0 +84A0 +3FA0 +64A0 +BE40 +24A0 +3F00 +5440 +52A0 +8FA0 +ENDCHAR +STARTCHAR U_FA41 +ENCODING 64065 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +7D00 +81E0 +7F40 +5540 +FF40 +5540 +5540 +FE80 +0540 +1A20 +ENDCHAR +STARTCHAR U_FA42 +ENCODING 64066 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7BE0 +4880 +4A80 +7A80 +4FE0 +7880 +5080 +4980 +56A0 +E4A0 +4860 +ENDCHAR +STARTCHAR U_FA43 +ENCODING 64067 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +3F80 +2080 +3F80 +2080 +7FC0 +0500 +FFE0 +0880 +3F80 +D080 +1F80 +ENDCHAR +STARTCHAR U_FA44 +ENCODING 64068 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2400 +27E0 +F800 +27C0 +2540 +3540 +6FE0 +A540 +2540 +2FE0 +20C0 +ENDCHAR +STARTCHAR U_FA45 +ENCODING 64069 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4400 +27E0 +8800 +5FC0 +1940 +2FE0 +2A40 +C940 +4FE0 +4040 +4180 +ENDCHAR +STARTCHAR U_FA46 +ENCODING 64070 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2FA0 +0240 +9FE0 +5200 +27C0 +2C40 +D7C0 +4440 +47C0 +4440 +ENDCHAR +STARTCHAR U_FA47 +ENCODING 64071 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5FE0 +2480 +0FC0 +8A40 +5FC0 +2200 +2FC0 +C200 +5FE0 +4480 +5860 +ENDCHAR +STARTCHAR U_FA48 +ENCODING 64072 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0440 +3F80 +0500 +FFE0 +1080 +3F80 +D080 +1F80 +4240 +4920 +8920 +ENDCHAR +STARTCHAR U_FA49 +ENCODING 64073 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +0380 +FC00 +4980 +2500 +2200 +ENDCHAR +STARTCHAR U_FA4A +ENCODING 64074 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +07E0 +F100 +2220 +2640 +FB80 +2480 +2BC0 +22C0 +F4A0 +4CA0 +1320 +ENDCHAR +STARTCHAR U_FA4B +ENCODING 64075 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0100 +F7E0 +2520 +27E0 +7520 +D7E0 +5280 +5FE0 +7080 +5080 +0080 +ENDCHAR +STARTCHAR U_FA4C +ENCODING 64076 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F900 +0900 +17C0 +3100 +6900 +A900 +2100 +2100 +2FE0 +ENDCHAR +STARTCHAR U_FA4D +ENCODING 64077 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +F500 +1500 +25E0 +3500 +6D00 +A500 +2500 +2500 +3FE0 +ENDCHAR +STARTCHAR U_FA4E +ENCODING 64078 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4060 +2380 +FA00 +0A00 +13E0 +3240 +6A40 +AA40 +2440 +2440 +2840 +ENDCHAR +STARTCHAR U_FA4F +ENCODING 64079 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +2100 +FFE0 +0900 +1200 +33E0 +6E20 +AA20 +2220 +23E0 +2220 +ENDCHAR +STARTCHAR U_FA50 +ENCODING 64080 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +27C0 +1440 +FC40 +1440 +27C0 +3440 +6C40 +A7C0 +2440 +2440 +2FE0 +ENDCHAR +STARTCHAR U_FA51 +ENCODING 64081 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FC40 +0C40 +17C0 +3280 +6A80 +AA80 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_FA52 +ENCODING 64082 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +F5C0 +1540 +2FE0 +2820 +7BA0 +AAA0 +2BA0 +2820 +2860 +ENDCHAR +STARTCHAR U_FA53 +ENCODING 64083 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4100 +21E0 +F100 +17C0 +2440 +77C0 +AC40 +27C0 +2440 +27C0 +2C60 +ENDCHAR +STARTCHAR U_FA54 +ENCODING 64084 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +23C0 +FA40 +2240 +FA60 +8C00 +73E0 +2220 +F940 +2080 +7140 +AE20 +ENDCHAR +STARTCHAR U_FA55 +ENCODING 64085 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +7FE0 +4920 +9080 +2540 +0480 +7FE0 +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_FA56 +ENCODING 64086 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +3DE0 +5280 +FDE0 +4520 +7D20 +4520 +7D20 +4920 +5560 +6500 +ENDCHAR +STARTCHAR U_FA57 +ENCODING 64087 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +2FE0 +5100 +F7E0 +26A0 +5520 +EFE0 +0180 +5340 +AD20 +A920 +ENDCHAR +STARTCHAR U_FA58 +ENCODING 64088 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2FE0 +2000 +5440 +FAA0 +2EE0 +5000 +EFE0 +0420 +57E0 +AC20 +AFE0 +ENDCHAR +STARTCHAR U_FA59 +ENCODING 64089 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +2100 +7FE0 +D540 +7E80 +5540 +7A20 +1F00 +0880 +7F40 +2480 +CC60 +ENDCHAR +STARTCHAR U_FA5A +ENCODING 64090 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +7FE0 +4920 +7FE0 +0440 +3F80 +0500 +FFE0 +3040 +DFC0 +1040 +1FC0 +ENDCHAR +STARTCHAR U_FA5B +ENCODING 64091 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0420 +7F40 +0480 +FFE0 +0400 +1FC0 +3040 +DFC0 +1040 +1FC0 +1040 +ENDCHAR +STARTCHAR U_FA5C +ENCODING 64092 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0800 +3F80 +2080 +3E80 +2F80 +2080 +3F80 +0480 +FFE0 +0A00 +F1E0 +ENDCHAR +STARTCHAR U_FA5D +ENCODING 64093 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 4 1 3 +BITMAP +1200 +FFC0 +1200 +1200 +ENDCHAR +STARTCHAR U_FA5E +ENCODING 64094 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 4 1 3 +BITMAP +1200 +FFC0 +1200 +1200 +ENDCHAR +STARTCHAR U_FA5F +ENCODING 64095 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +1100 +FFE0 +1540 +7F80 +0500 +FFE0 +0880 +1F80 +7080 +1F80 +1080 +ENDCHAR +STARTCHAR U_FA60 +ENCODING 64096 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +2FC0 +7200 +AFE0 +2CA0 +2560 +27A0 +2040 +ENDCHAR +STARTCHAR U_FA61 +ENCODING 64097 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +2440 +FFC0 +1440 +27C0 +7440 +AFC0 +2280 +22A0 +24A0 +2860 +ENDCHAR +STARTCHAR U_FA62 +ENCODING 64098 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +47C0 +F440 +07C0 +F440 +07C0 +F200 +07E0 +FCA0 +9560 +F7A0 +90C0 +ENDCHAR +STARTCHAR U_FA63 +ENCODING 64099 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4280 +FFE0 +0280 +F100 +07C0 +F540 +0FE0 +F100 +97C0 +F100 +9FE0 +ENDCHAR +STARTCHAR U_FA64 +ENCODING 64100 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0400 +FFE0 +8020 +3F80 +2500 +FF80 +2080 +3F80 +2080 +3F80 +E0E0 +ENDCHAR +STARTCHAR U_FA65 +ENCODING 64101 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +F440 +9280 +FFE0 +9AA0 +9FE0 +F000 +97C0 +F440 +27C0 +5440 +8FC0 +ENDCHAR +STARTCHAR U_FA66 +ENCODING 64102 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4000 +2000 +2000 +0000 +E000 +2000 +2000 +2000 +2000 +5020 +8FC0 +ENDCHAR +STARTCHAR U_FA67 +ENCODING 64103 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +4200 +2780 +2900 +1FC0 +EA40 +2FC0 +2340 +2520 +28E0 +5000 +8FE0 +ENDCHAR +STARTCHAR U_FA68 +ENCODING 64104 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +5180 +FE80 +53E0 +2680 +FBC0 +AA80 +FA80 +23C0 +FE80 +5280 +8BE0 +ENDCHAR +STARTCHAR U_FA69 +ENCODING 64105 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +44E0 +AEA0 +4AC0 +EEA0 +2AC0 +FFE0 +0900 +FFE0 +1480 +1280 +1F80 +ENDCHAR +STARTCHAR U_FA6A +ENCODING 64106 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +13E0 +5080 +5FE0 +5220 +FFE0 +1220 +57E0 +5A20 +93E0 +2140 +C620 +ENDCHAR +STARTCHAR ff +ENCODING 64256 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +48 +40 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +48 +48 +F8 +48 +48 +48 +ENDCHAR +STARTCHAR ffi +ENCODING 64259 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +A8 +A0 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR ffl +ENCODING 64260 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +A8 +A8 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uniFB05 +ENCODING 64261 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +78 +D0 +50 +50 +48 +ENDCHAR +STARTCHAR uniFB06 +ENCODING 64262 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +30 +50 +78 +90 +50 +50 +88 +ENDCHAR +STARTCHAR uniFE20 +ENCODING 65056 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 1 8 +BITMAP +38 +C0 +ENDCHAR +STARTCHAR uniFE21 +ENCODING 65057 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +E0 +18 +ENDCHAR +STARTCHAR uniFE22 +ENCODING 65058 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 6 2 0 8 +BITMAP +7C +80 +ENDCHAR +STARTCHAR uniFE23 +ENCODING 65059 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +08 +F0 +ENDCHAR +STARTCHAR U_FE30 +ENCODING 65072 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 7 5 1 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR U_FE31 +ENCODING 65073 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 10 6 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_FE33 +ENCODING 65075 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 1 11 5 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_FE34 +ENCODING 65076 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 12 10 -1 +BITMAP +80 +40 +40 +80 +80 +40 +40 +80 +80 +40 +40 +80 +ENDCHAR +STARTCHAR U_FE35 +ENCODING 65077 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 1 +BITMAP +1F00 +60C0 +8020 +ENDCHAR +STARTCHAR U_FE36 +ENCODING 65078 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +8020 +60C0 +1F00 +ENDCHAR +STARTCHAR U_FE37 +ENCODING 65079 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 1 +BITMAP +0400 +0A00 +71C0 +8020 +ENDCHAR +STARTCHAR U_FE38 +ENCODING 65080 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 5 +BITMAP +8020 +71C0 +0A00 +0400 +ENDCHAR +STARTCHAR U_FE39 +ENCODING 65081 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 1 +BITMAP +3F80 +4040 +8020 +ENDCHAR +STARTCHAR U_FE3A +ENCODING 65082 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +8020 +4040 +3F80 +ENDCHAR +STARTCHAR U_FE3B +ENCODING 65083 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 0 +BITMAP +FFE0 +E0E0 +C060 +8020 +ENDCHAR +STARTCHAR U_FE3C +ENCODING 65084 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 6 +BITMAP +8020 +C060 +E0E0 +FFE0 +ENDCHAR +STARTCHAR U_FE3D +ENCODING 65085 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 7 0 -1 +BITMAP +0400 +0A00 +3180 +C460 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_FE3E +ENCODING 65086 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 7 0 3 +BITMAP +C060 +3180 +0A00 +C460 +3180 +0A00 +0400 +ENDCHAR +STARTCHAR U_FE3F +ENCODING 65087 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 1 +BITMAP +0E00 +3180 +C060 +ENDCHAR +STARTCHAR U_FE40 +ENCODING 65088 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 6 +BITMAP +C060 +3180 +0E00 +ENDCHAR +STARTCHAR U_FE41 +ENCODING 65089 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 5 2 -1 +BITMAP +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR U_FE42 +ENCODING 65090 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 5 1 5 +BITMAP +8000 +8000 +8000 +8000 +FF80 +ENDCHAR +STARTCHAR U_FE43 +ENCODING 65091 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 2 -1 +BITMAP +FF80 +8080 +FE80 +0280 +0280 +0380 +ENDCHAR +STARTCHAR U_FE44 +ENCODING 65092 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 6 1 4 +BITMAP +E000 +A000 +A000 +BF80 +8080 +FF80 +ENDCHAR +STARTCHAR U_FE49 +ENCODING 65097 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 1 1 9 +BITMAP +CCC0 +ENDCHAR +STARTCHAR U_FE4A +ENCODING 65098 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 1 0 9 +BITMAP +E4E0 +ENDCHAR +STARTCHAR U_FE4B +ENCODING 65099 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 7 +BITMAP +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_FE4C +ENCODING 65100 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 3 0 7 +BITMAP +3180 +4A40 +8420 +ENDCHAR +STARTCHAR U_FE4D +ENCODING 65101 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 1 1 -1 +BITMAP +CCC0 +ENDCHAR +STARTCHAR U_FE4E +ENCODING 65102 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 1 0 -1 +BITMAP +E4E0 +ENDCHAR +STARTCHAR U_FE4F +ENCODING 65103 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 2 0 8 +BITMAP +6640 +99A0 +ENDCHAR +STARTCHAR U_FE50 +ENCODING 65104 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 8 0 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FE51 +ENCODING 65105 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 3 7 0 +BITMAP +80 +60 +20 +ENDCHAR +STARTCHAR U_FE52 +ENCODING 65106 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 2 8 1 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR U_FE54 +ENCODING 65108 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 8 5 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FE55 +ENCODING 65109 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 7 5 1 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR U_FE56 +ENCODING 65110 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 10 4 0 +BITMAP +70 +88 +88 +08 +10 +10 +20 +00 +20 +20 +ENDCHAR +STARTCHAR U_FE57 +ENCODING 65111 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 10 6 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR U_FE59 +ENCODING 65113 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 8 7 1 +BITMAP +20 +40 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR U_FE5A +ENCODING 65114 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 8 3 1 +BITMAP +80 +40 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_FE5B +ENCODING 65115 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 9 7 0 +BITMAP +20 +40 +40 +40 +80 +40 +40 +40 +20 +ENDCHAR +STARTCHAR U_FE5C +ENCODING 65116 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 9 3 0 +BITMAP +80 +40 +40 +40 +20 +40 +40 +40 +80 +ENDCHAR +STARTCHAR U_FE5D +ENCODING 65117 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 8 0 +BITMAP +20 +40 +80 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR U_FE5E +ENCODING 65118 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 3 0 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR U_FE5F +ENCODING 65119 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 3 -1 +BITMAP +50 +50 +50 +F8 +50 +50 +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR U_FE60 +ENCODING 65120 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 0 +BITMAP +20 +50 +50 +20 +5C +A8 +A8 +90 +48 +34 +ENDCHAR +STARTCHAR U_FE61 +ENCODING 65121 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 3 2 +BITMAP +A8 +70 +20 +70 +A8 +ENDCHAR +STARTCHAR U_FE62 +ENCODING 65122 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 3 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR U_FE63 +ENCODING 65123 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 1 4 4 +BITMAP +F0 +ENDCHAR +STARTCHAR U_FE64 +ENCODING 65124 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 4 2 +BITMAP +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR U_FE65 +ENCODING 65125 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 5 4 2 +BITMAP +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR U_FE66 +ENCODING 65126 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 4 4 3 +BITMAP +F8 +00 +00 +F8 +ENDCHAR +STARTCHAR U_FE68 +ENCODING 65128 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 12 3 -1 +BITMAP +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +02 +ENDCHAR +STARTCHAR U_FE69 +ENCODING 65129 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 4 0 +BITMAP +20 +70 +A8 +A8 +A0 +70 +28 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR U_FE6A +ENCODING 65130 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 3 1 +BITMAP +42 +A4 +A8 +A8 +54 +2A +2A +4A +44 +ENDCHAR +STARTCHAR U_FE6B +ENCODING 65131 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 0 +BITMAP +3C +42 +42 +95 +AD +A5 +AA +54 +42 +3C +ENDCHAR +STARTCHAR U_FF01 +ENCODING 65281 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 11 3 -1 +BITMAP +40 +E0 +E0 +E0 +E0 +40 +40 +40 +00 +40 +40 +ENDCHAR +STARTCHAR U_FF02 +ENCODING 65282 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 4 1 7 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR U_FF03 +ENCODING 65283 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 11 2 -1 +BITMAP +12 +12 +12 +7F +24 +24 +24 +FF +48 +48 +48 +ENDCHAR +STARTCHAR U_FF04 +ENCODING 65284 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 11 3 -1 +BITMAP +7C +D2 +92 +90 +50 +3E +11 +D1 +93 +7C +10 +ENDCHAR +STARTCHAR U_FF05 +ENCODING 65285 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 12 1 -1 +BITMAP +7000 +8820 +8840 +8880 +7100 +0200 +0400 +09C0 +1220 +2220 +4220 +81C0 +ENDCHAR +STARTCHAR U_FF06 +ENCODING 65286 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +3800 +4400 +4400 +4400 +2800 +3380 +5100 +8A00 +8440 +8A40 +7180 +ENDCHAR +STARTCHAR U_FF07 +ENCODING 65287 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 2 7 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FF08 +ENCODING 65288 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 7 -1 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR U_FF09 +ENCODING 65289 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 3 12 3 -1 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR U_FF0A +ENCODING 65290 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 7 0 1 +BITMAP +10 +10 +D6 +38 +28 +44 +44 +ENDCHAR +STARTCHAR U_FF0B +ENCODING 65291 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 2 0 +BITMAP +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR U_FF0C +ENCODING 65292 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 4 3 0 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FF0D +ENCODING 65293 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 1 2 4 +BITMAP +FF80 +ENDCHAR +STARTCHAR U_FF0E +ENCODING 65294 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 2 3 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR U_FF0F +ENCODING 65295 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 11 0 -1 +BITMAP +0020 +0040 +0080 +0100 +0200 +0400 +0800 +1000 +2000 +4000 +8000 +ENDCHAR +STARTCHAR U_FF10 +ENCODING 65296 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +82 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF11 +ENCODING 65297 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 10 3 -1 +BITMAP +20 +20 +E0 +20 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR U_FF12 +ENCODING 65298 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +78 +84 +84 +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR U_FF13 +ENCODING 65299 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +70 +88 +04 +08 +30 +08 +04 +04 +88 +70 +ENDCHAR +STARTCHAR U_FF14 +ENCODING 65300 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +08 +18 +28 +28 +48 +48 +88 +FE +08 +1C +ENDCHAR +STARTCHAR U_FF15 +ENCODING 65301 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +FC +80 +80 +B0 +C8 +84 +04 +04 +88 +70 +ENDCHAR +STARTCHAR U_FF16 +ENCODING 65302 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +80 +80 +B8 +C4 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF17 +ENCODING 65303 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 3 -1 +BITMAP +FC +84 +84 +08 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR U_FF18 +ENCODING 65304 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +82 +44 +38 +44 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF19 +ENCODING 65305 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +38 +44 +82 +82 +46 +3A +02 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF1A +ENCODING 65306 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 7 6 1 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR U_FF1B +ENCODING 65307 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 2 8 6 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR U_FF1C +ENCODING 65308 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +0180 +0600 +1800 +6000 +8000 +6000 +1800 +0600 +0180 +ENDCHAR +STARTCHAR U_FF1D +ENCODING 65309 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 4 1 2 +BITMAP +FF80 +0000 +0000 +FF80 +ENDCHAR +STARTCHAR U_FF1E +ENCODING 65310 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 9 1 0 +BITMAP +C000 +3000 +0C00 +0300 +0080 +0300 +0C00 +3000 +C000 +ENDCHAR +STARTCHAR U_FF1F +ENCODING 65311 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 11 4 -1 +BITMAP +78 +CC +CC +0C +18 +30 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR U_FF20 +ENCODING 65312 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 2 0 +BITMAP +1E00 +2100 +4C80 +9240 +A240 +A240 +A680 +5B00 +2080 +1F00 +ENDCHAR +STARTCHAR U_FF21 +ENCODING 65313 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +0800 +0800 +1400 +1400 +2200 +2200 +3E00 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_FF22 +ENCODING 65314 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +F8 +44 +42 +44 +78 +44 +42 +42 +44 +F8 +ENDCHAR +STARTCHAR U_FF23 +ENCODING 65315 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +1D +23 +41 +80 +80 +80 +80 +41 +22 +1C +ENDCHAR +STARTCHAR U_FF24 +ENCODING 65316 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FC +42 +41 +41 +41 +41 +41 +41 +42 +FC +ENDCHAR +STARTCHAR U_FF25 +ENCODING 65317 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FE +41 +40 +44 +7C +44 +40 +41 +41 +FE +ENDCHAR +STARTCHAR U_FF26 +ENCODING 65318 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +FE +41 +40 +44 +7C +44 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF27 +ENCODING 65319 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +3D00 +4300 +8100 +8000 +8000 +8F80 +8100 +8100 +4300 +3D00 +ENDCHAR +STARTCHAR U_FF28 +ENCODING 65320 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +4100 +4100 +7F00 +4100 +4100 +4100 +4100 +E380 +ENDCHAR +STARTCHAR U_FF29 +ENCODING 65321 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 4 -1 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF2A +ENCODING 65322 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 11 2 -1 +BITMAP +1C +08 +08 +08 +08 +08 +08 +08 +08 +90 +60 +ENDCHAR +STARTCHAR U_FF2B +ENCODING 65323 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +EE +44 +48 +50 +60 +50 +48 +44 +42 +E7 +ENDCHAR +STARTCHAR U_FF2C +ENCODING 65324 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +41 +42 +FE +ENDCHAR +STARTCHAR U_FF2D +ENCODING 65325 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +C060 +4040 +60C0 +60C0 +5140 +5140 +4A40 +4A40 +4440 +E4E0 +ENDCHAR +STARTCHAR U_FF2E +ENCODING 65326 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 10 2 -1 +BITMAP +C7 +62 +52 +52 +4A +4A +46 +46 +42 +E2 +ENDCHAR +STARTCHAR U_FF2F +ENCODING 65327 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +1C00 +2200 +4100 +8080 +8080 +8080 +8080 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_FF30 +ENCODING 65328 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +F8 +44 +42 +42 +44 +78 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF31 +ENCODING 65329 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 11 1 -1 +BITMAP +1C00 +2200 +4100 +8080 +8080 +8080 +9880 +4500 +2200 +1D40 +00C0 +ENDCHAR +STARTCHAR U_FF32 +ENCODING 65330 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 11 1 -1 +BITMAP +FC00 +4200 +4100 +4200 +7C00 +4400 +4200 +4200 +4200 +E280 +0100 +ENDCHAR +STARTCHAR U_FF33 +ENCODING 65331 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +7A +86 +82 +40 +30 +08 +04 +82 +C2 +BC +ENDCHAR +STARTCHAR U_FF34 +ENCODING 65332 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +FF80 +8880 +8880 +0800 +0800 +0800 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR U_FF35 +ENCODING 65333 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +4100 +4100 +4100 +4100 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR U_FF36 +ENCODING 65334 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +4100 +2200 +2200 +2200 +1400 +1400 +0800 +0800 +ENDCHAR +STARTCHAR U_FF37 +ENCODING 65335 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 10 0 -1 +BITMAP +EEE0 +4440 +4440 +4440 +2A80 +2A80 +2A80 +1100 +1100 +1100 +ENDCHAR +STARTCHAR U_FF38 +ENCODING 65336 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +2200 +1400 +0800 +0800 +1400 +2200 +4100 +E380 +ENDCHAR +STARTCHAR U_FF39 +ENCODING 65337 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +E380 +4100 +2200 +1400 +0800 +0800 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR U_FF3A +ENCODING 65338 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 -1 +BITMAP +3F80 +2100 +4200 +0400 +0800 +0800 +1000 +2080 +4080 +FF80 +ENDCHAR +STARTCHAR U_FF3B +ENCODING 65339 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 12 6 -1 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR U_FF3C +ENCODING 65340 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +8000 +4000 +2000 +1000 +0800 +0400 +0200 +0100 +0080 +0040 +0020 +0010 +ENDCHAR +STARTCHAR U_FF3D +ENCODING 65341 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 4 12 2 -1 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR U_FF3E +ENCODING 65342 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 4 0 0 +BITMAP +0400 +0A00 +3180 +C060 +ENDCHAR +STARTCHAR U_FF3F +ENCODING 65343 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 1 0 -1 +BITMAP +FFF0 +ENDCHAR +STARTCHAR U_FF40 +ENCODING 65344 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 2 4 8 7 +BITMAP +40 +80 +C0 +C0 +ENDCHAR +STARTCHAR U_FF41 +ENCODING 65345 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 3 0 +BITMAP +70 +88 +38 +48 +88 +9A +64 +ENDCHAR +STARTCHAR U_FF42 +ENCODING 65346 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +C0 +40 +40 +58 +64 +42 +42 +42 +64 +58 +ENDCHAR +STARTCHAR U_FF43 +ENCODING 65347 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 2 -1 +BITMAP +38 +44 +80 +80 +80 +44 +38 +ENDCHAR +STARTCHAR U_FF44 +ENCODING 65348 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +0C +04 +04 +34 +4C +84 +84 +84 +4C +36 +ENDCHAR +STARTCHAR U_FF45 +ENCODING 65349 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 2 -1 +BITMAP +30 +48 +84 +FC +80 +44 +38 +ENDCHAR +STARTCHAR U_FF46 +ENCODING 65350 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 2 -1 +BITMAP +18 +24 +20 +F8 +20 +20 +20 +20 +20 +70 +ENDCHAR +STARTCHAR U_FF47 +ENCODING 65351 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 -1 +BITMAP +3A +44 +44 +38 +20 +7C +82 +7C +ENDCHAR +STARTCHAR U_FF48 +ENCODING 65352 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +C0 +40 +40 +58 +64 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_FF49 +ENCODING 65353 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 4 -1 +BITMAP +C0 +C0 +00 +C0 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF4A +ENCODING 65354 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 11 2 -1 +BITMAP +18 +08 +00 +18 +08 +08 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR U_FF4B +ENCODING 65355 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 10 2 -1 +BITMAP +C0 +40 +40 +5C +48 +50 +70 +48 +44 +EE +ENDCHAR +STARTCHAR U_FF4C +ENCODING 65356 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 10 4 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF4D +ENCODING 65357 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 7 1 -1 +BITMAP +B300 +4C80 +4880 +4880 +4880 +4880 +DDC0 +ENDCHAR +STARTCHAR U_FF4E +ENCODING 65358 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +D8 +64 +44 +44 +44 +44 +EE +ENDCHAR +STARTCHAR U_FF4F +ENCODING 65359 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR U_FF50 +ENCODING 65360 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 6 8 2 -1 +BITMAP +F8 +44 +44 +44 +44 +78 +40 +E0 +ENDCHAR +STARTCHAR U_FF51 +ENCODING 65361 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 8 2 -1 +BITMAP +36 +4C +84 +84 +4C +34 +04 +0E +ENDCHAR +STARTCHAR U_FF52 +ENCODING 65362 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 7 3 -1 +BITMAP +D8 +64 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR U_FF53 +ENCODING 65363 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 5 7 3 -1 +BITMAP +70 +88 +80 +70 +08 +88 +70 +ENDCHAR +STARTCHAR U_FF54 +ENCODING 65364 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 6 10 2 -1 +BITMAP +20 +20 +20 +F8 +20 +20 +20 +20 +24 +18 +ENDCHAR +STARTCHAR U_FF55 +ENCODING 65365 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +EE +44 +44 +44 +44 +44 +3A +ENDCHAR +STARTCHAR U_FF56 +ENCODING 65366 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 8 7 1 -1 +BITMAP +E7 +42 +22 +24 +14 +18 +08 +ENDCHAR +STARTCHAR U_FF57 +ENCODING 65367 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 11 7 0 -1 +BITMAP +EEE0 +4440 +4440 +2A80 +2A80 +1100 +1100 +ENDCHAR +STARTCHAR U_FF58 +ENCODING 65368 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +EE +44 +28 +10 +28 +44 +EE +ENDCHAR +STARTCHAR U_FF59 +ENCODING 65369 +SWIDTH 1000 0 +DWIDTH 12 0 +BBX 7 8 2 -1 +BITMAP +EE +44 +28 +28 +10 +10 +10 +60 +ENDCHAR +STARTCHAR U_FF5A +ENCODING 65370 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 7 2 -1 +BITMAP +7C +88 +10 +10 +22 +44 +FC +ENDCHAR +STARTCHAR U_FF5B +ENCODING 65371 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 12 7 -1 +BITMAP +20 +40 +40 +40 +40 +80 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR U_FF5C +ENCODING 65372 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 1 11 6 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR U_FF5D +ENCODING 65373 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 3 12 2 -1 +BITMAP +80 +40 +40 +40 +40 +20 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR U_FF5E +ENCODING 65374 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 3 0 3 +BITMAP +1C00 +6310 +80E0 +ENDCHAR +STARTCHAR U_FFE0 +ENCODING 65504 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 7 9 2 0 +BITMAP +04 +3C +4A +88 +90 +90 +A2 +64 +58 +ENDCHAR +STARTCHAR U_FFE1 +ENCODING 65505 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +0600 +0900 +0800 +0800 +0800 +FE00 +0800 +7040 +9C80 +6300 +ENDCHAR +STARTCHAR U_FFE3 +ENCODING 65507 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 12 1 0 10 +BITMAP +FFF0 +ENDCHAR +STARTCHAR U_FFE5 +ENCODING 65509 +SWIDTH 0 0 +DWIDTH 12 0 +BBX 9 10 1 0 +BITMAP +E380 +4100 +2200 +7F00 +1400 +7F00 +0800 +0800 +0800 +1C00 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 480 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/marlin-6x9.bdf b/buildroot/share/fonts/marlin-6x9.bdf new file mode 100644 index 00000000..0b268347 --- /dev/null +++ b/buildroot/share/fonts/marlin-6x9.bdf @@ -0,0 +1,16606 @@ +STARTFONT 2.1 +FONT -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1 +SIZE 9 75 75 +FONTBOUNDINGBOX 6 9 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +STARTPROPERTIES 24 +FONTNAME_REGISTRY "" +FOUNDRY "Misc" +FAMILY_NAME "Fixed" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 9 +POINT_SIZE 90 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +COPYRIGHT "Public domain font. Share and enjoy." +_XMBDFED_INFO "Edited with xmbdfed 4.5." +CAP_HEIGHT 6 +X_HEIGHT 4 +WEIGHT 10 +QUAD_WIDTH 6 +DEFAULT_CHAR 0 +FONT_DESCENT 2 +FONT_ASCENT 7 +ENDPROPERTIES +CHARS 1305 +STARTCHAR char0 +ENCODING 0 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +80 +10 +80 +10 +A0 +ENDCHAR +STARTCHAR uni0001 +ENCODING 1 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +40 +F0 +C8 +88 +98 +78 +10 +ENDCHAR +STARTCHAR uni0002 +ENCODING 2 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +C0 +F8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni0003 +ENCODING 3 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni0004 +ENCODING 4 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +20 +70 +F8 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni0005 +ENCODING 5 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +B8 +88 +70 +20 +ENDCHAR +STARTCHAR uni0006 +ENCODING 6 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 6 5 0 0 +BITMAP +B0 +D8 +6C +D8 +B0 +ENDCHAR +STARTCHAR uni0007 +ENCODING 7 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 8 0 -1 +BITMAP +F8 +A8 +88 +88 +88 +88 +A8 +F8 +ENDCHAR +STARTCHAR uni0008 +ENCODING 8 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 5 9 0 -2 +BITMAP +20 +50 +50 +50 +50 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0009 +ENCODING 9 +SWIDTH 1000 0 +DWIDTH 0 0 +BBX 3 3 0 3 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +50 +50 +F8 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +20 +70 +A8 +A0 +70 +28 +A8 +70 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +40 +A8 +48 +10 +20 +48 +54 +08 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +60 +90 +90 +60 +98 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 2 3 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +40 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +80 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +F8 +50 +88 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +C0 +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +20 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +30 +50 +90 +F8 +10 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +10 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +C0 +00 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +10 +60 +40 +00 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +90 +A8 +B0 +80 +70 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +D0 +B0 +90 +90 +90 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +60 +90 +90 +D0 +B0 +60 +10 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +90 +90 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +40 +20 +90 +60 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +90 +F0 +60 +60 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +40 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 -2 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 4 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +90 +90 +70 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +80 +80 +70 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +40 +E0 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +20 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +C0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D0 +A8 +A8 +88 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +E0 +90 +90 +90 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +90 +90 +70 +10 +10 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +90 +90 +70 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +90 +60 +60 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +40 +80 +40 +40 +20 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +40 +40 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 3 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR space +ENCODING 160 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +30 +48 +40 +F0 +40 +40 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A8 +50 +88 +50 +A8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 2 -1 +BITMAP +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +70 +80 +60 +90 +60 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 5 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +94 +A4 +94 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +60 +A0 +60 +00 +E0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 0 +BITMAP +F0 +10 +10 +ENDCHAR +STARTCHAR hyphen +ENCODING 173 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 5 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 2 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 4 +BITMAP +40 +80 +ENDCHAR +STARTCHAR mu +ENCODING 181 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 -1 +BITMAP +90 +90 +B0 +D0 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +E8 +E8 +68 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 2 +BITMAP +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +40 +00 +E0 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +C0 +40 +50 +70 +30 +78 +10 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +C0 +40 +50 +68 +08 +10 +38 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C0 +20 +40 +30 +F0 +30 +78 +10 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +20 +60 +80 +90 +60 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +28 +50 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +A0 +F0 +A0 +A0 +B8 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +80 +80 +90 +60 +20 +40 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +40 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +90 +D0 +B0 +90 +90 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +10 +70 +B0 +B0 +D0 +D0 +E0 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +E0 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +A0 +A0 +90 +A0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +20 +70 +90 +90 +70 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +A8 +B0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +80 +80 +70 +20 +40 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +80 +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +30 +60 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +B0 +D0 +E0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +50 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +40 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +80 +80 +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +50 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +00 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +70 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +90 +60 +20 +50 +70 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +50 +88 +F8 +88 +88 +10 +08 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +90 +90 +70 +20 +10 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +60 +90 +80 +90 +60 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +70 +80 +80 +70 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +E0 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +50 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +48 +E8 +48 +48 +70 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +10 +38 +70 +90 +90 +70 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +F0 +80 +E0 +80 +80 +F0 +40 +20 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +60 +B0 +C0 +70 +40 +20 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +50 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +90 +60 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +80 +B0 +90 +60 +20 +40 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +40 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +90 +F0 +90 +90 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +A8 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +50 +70 +50 +50 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +E0 +70 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +70 +20 +20 +20 +70 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +60 +20 +20 +70 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +70 +20 +20 +70 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +60 +20 +20 +70 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +E0 +40 +40 +40 +40 +E0 +40 +20 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +40 +00 +C0 +40 +40 +E0 +40 +20 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B8 +88 +88 +88 +A8 +90 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +00 +98 +88 +88 +88 +28 +10 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +28 +38 +10 +10 +90 +60 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +50 +00 +60 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +A0 +C0 +A0 +90 +90 +40 +80 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +80 +80 +A0 +C0 +A0 +90 +40 +80 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +B0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +80 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +20 +40 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +C0 +40 +40 +40 +40 +E0 +40 +80 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +40 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +A0 +80 +80 +F0 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +C0 +40 +50 +40 +40 +E0 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +40 +60 +C0 +40 +78 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +C0 +40 +60 +C0 +40 +E0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +90 +D0 +B0 +90 +90 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +D0 +B0 +90 +90 +90 +40 +80 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +90 +40 +80 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +90 +D0 +B0 +90 +90 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +40 +00 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +40 +B0 +28 +28 +28 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +D0 +B0 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +90 +10 +20 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +70 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +A0 +B0 +A0 +A0 +78 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +A8 +B0 +58 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +E0 +90 +E0 +A0 +90 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +E0 +90 +90 +E0 +90 +90 +40 +80 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +A0 +D0 +80 +80 +40 +80 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +40 +E0 +90 +E0 +A0 +90 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +A0 +40 +00 +A0 +D0 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +50 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +40 +20 +90 +60 +20 +40 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +C0 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +40 +40 +E0 +40 +50 +20 +20 +40 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +70 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +40 +E0 +E0 +50 +20 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +90 +90 +90 +60 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +A0 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +00 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +90 +90 +90 +60 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +60 +90 +60 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +00 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +90 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +90 +90 +90 +90 +90 +60 +40 +20 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +90 +90 +90 +70 +40 +20 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +00 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +50 +00 +88 +50 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +20 +50 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +F0 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +F0 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +00 +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +F0 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +F0 +20 +40 +F0 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +F0 +90 +60 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +50 +40 +E0 +40 +40 +40 +80 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +64 +94 +98 +90 +90 +60 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 1 0 +BITMAP +68 +90 +90 +60 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 1 0 +BITMAP +A8 +A8 +B0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 1 0 +BITMAP +A8 +B0 +A0 +60 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +F0 +40 +80 +F0 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +F0 +40 +F0 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +00 +60 +90 +90 +60 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +20 +70 +80 +B0 +90 +60 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +50 +20 +00 +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +20 +40 +A0 +40 +A0 +E0 +A0 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +50 +70 +90 +90 +70 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +78 +A0 +F0 +A0 +B8 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +70 +A8 +B0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +70 +B0 +D0 +D0 +E0 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +70 +B0 +D0 +E0 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +40 +20 +90 +60 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +70 +C0 +30 +E0 +20 +40 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 538 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +10 +20 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 539 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +40 +40 +E0 +40 +50 +20 +20 +40 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +D0 +30 +E0 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +E0 +30 +D0 +60 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR macron +ENCODING 713 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 5 +BITMAP +E0 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 5 +BITMAP +90 +60 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 5 +BITMAP +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 5 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +48 +90 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 1 5 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 5 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni0304 +ENCODING 772 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +E0 +ENDCHAR +STARTCHAR uni0305 +ENCODING 773 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 6 +BITMAP +F8 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 6 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 6 +BITMAP +A0 +ENDCHAR +STARTCHAR hookabovecomb +ENCODING 777 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +C0 +20 +40 +ENDCHAR +STARTCHAR uni030A +ENCODING 778 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 4 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uni030B +ENCODING 779 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni030D +ENCODING 781 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 2 2 5 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni030E +ENCODING 782 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 2 1 5 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR uni030F +ENCODING 783 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +90 +48 +ENDCHAR +STARTCHAR uni0310 +ENCODING 784 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +A8 +70 +ENDCHAR +STARTCHAR uni0311 +ENCODING 785 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni0312 +ENCODING 786 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR uni0313 +ENCODING 787 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni0314 +ENCODING 788 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 4 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR dotbelowcomb +ENCODING 803 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 -2 +BITMAP +80 +ENDCHAR +STARTCHAR uni0324 +ENCODING 804 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 -2 +BITMAP +A0 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 5 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +C0 +00 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 2 2 5 +BITMAP +80 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +20 +A8 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B0 +48 +48 +78 +48 +48 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 2 +BITMAP +80 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B8 +20 +30 +20 +20 +38 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +A8 +28 +38 +28 +28 +28 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B8 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B0 +48 +48 +48 +48 +30 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +A8 +28 +28 +10 +10 +10 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +B0 +48 +48 +48 +30 +78 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +00 +20 +20 +20 +10 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +20 +40 +80 +F0 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +D0 +B0 +90 +90 +90 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +60 +00 +00 +F0 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +40 +40 +80 +F0 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +00 +70 +90 +90 +70 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +00 +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +20 +00 +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +40 +80 +00 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +A8 +00 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +90 +90 +70 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +60 +90 +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +80 +70 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +B0 +C0 +70 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +20 +40 +40 +30 +08 +30 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +B0 +C8 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +80 +80 +A0 +40 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +A0 +C0 +B0 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +08 +68 +98 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +50 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +70 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +50 +50 +50 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +88 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +78 +90 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +40 +50 +20 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +90 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +50 +88 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +A0 +00 +40 +40 +50 +20 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +50 +88 +A8 +50 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +90 +90 +F0 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +38 +D0 +50 +20 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +90 +A8 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D0 +28 +60 +A0 +20 +20 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +A0 +00 +90 +A8 +40 +40 +40 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +88 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +20 +00 +88 +48 +70 +88 +08 +30 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -2 +BITMAP +08 +70 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +F0 +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +88 +98 +A8 +C8 +08 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +40 +80 +F8 +08 +10 +20 +20 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +50 +98 +A8 +A8 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +10 +30 +48 +18 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +A8 +A8 +A8 +A8 +78 +08 +F0 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +A8 +A8 +78 +08 +F0 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +48 +A8 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +50 +90 +70 +10 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +80 +80 +B0 +C8 +88 +08 +F0 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +48 +08 +F0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +08 +70 +80 +78 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +70 +80 +78 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +A8 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +A8 +20 +50 +70 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +70 +80 +F0 +88 +70 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +70 +80 +D8 +70 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +20 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +30 +20 +F8 +A0 +20 +60 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +48 +70 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +80 +78 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +90 +90 +60 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +E0 +80 +70 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +50 +00 +F0 +80 +E0 +80 +F0 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +30 +28 +28 +28 +08 +10 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +E0 +80 +88 +70 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +40 +20 +90 +60 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +A0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +30 +28 +28 +28 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +88 +98 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +48 +30 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +80 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +30 +50 +50 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +80 +E0 +80 +80 +F0 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +30 +08 +88 +70 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +B0 +D0 +90 +90 +90 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +90 +60 +90 +B0 +D0 +90 +90 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +80 +80 +90 +60 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +90 +90 +90 +90 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +E8 +98 +98 +E8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +38 +08 +88 +70 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +90 +A8 +E8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +70 +90 +90 +70 +90 +90 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +90 +90 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +C0 +A0 +D0 +E0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +30 +50 +50 +F8 +88 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +60 +90 +E0 +70 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +70 +70 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +50 +30 +E0 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +98 +A8 +C8 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +C8 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +A0 +E0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +38 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +D8 +A8 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +F8 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +80 +78 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +90 +60 +60 +90 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +90 +90 +90 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +78 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +A8 +A8 +A8 +F8 +08 +10 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +C0 +70 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +E8 +98 +E8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +80 +E0 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +E0 +50 +30 +E0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +E8 +E8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 0 0 +BITMAP +70 +90 +70 +90 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +20 +00 +60 +90 +E0 +70 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +A0 +00 +60 +90 +E0 +70 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +40 +E0 +40 +70 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +A0 +C0 +70 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +10 +00 +30 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +60 +B0 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A0 +F0 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +40 +00 +90 +A0 +E0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +C8 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +48 +30 +00 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +40 +E0 +70 +48 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +A8 +D8 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +90 +B0 +E0 +40 +40 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +80 +B0 +60 +40 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +10 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +78 +40 +E0 +40 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +A8 +70 +70 +A8 +04 +04 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +90 +A0 +C0 +A0 +90 +90 +08 +08 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +90 +A0 +E0 +90 +08 +08 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +88 +88 +50 +F8 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +50 +20 +20 +50 +88 +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 1 -2 +BITMAP +90 +60 +60 +90 +08 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +90 +10 +F0 +90 +60 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +E0 +30 +D0 +60 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 0 +BITMAP +E0 +00 +E0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +00 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +60 +F0 +90 +60 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +F0 +00 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +00 +90 +90 +90 +70 +ENDCHAR +STARTCHAR afii57664 +ENCODING 1488 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +48 +B0 +88 +ENDCHAR +STARTCHAR afii57665 +ENCODING 1489 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F0 +10 +10 +F8 +ENDCHAR +STARTCHAR afii57666 +ENCODING 1490 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 0 +BITMAP +80 +40 +60 +A0 +ENDCHAR +STARTCHAR afii57667 +ENCODING 1491 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +10 +10 +10 +ENDCHAR +STARTCHAR afii57668 +ENCODING 1492 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +08 +88 +88 +ENDCHAR +STARTCHAR afii57669 +ENCODING 1493 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 4 2 0 +BITMAP +C0 +40 +40 +40 +ENDCHAR +STARTCHAR afii57670 +ENCODING 1494 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +20 +10 +10 +ENDCHAR +STARTCHAR afii57671 +ENCODING 1495 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +48 +48 +ENDCHAR +STARTCHAR afii57672 +ENCODING 1496 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +98 +A8 +88 +F8 +ENDCHAR +STARTCHAR afii57673 +ENCODING 1497 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +C0 +40 +ENDCHAR +STARTCHAR afii57674 +ENCODING 1498 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii57675 +ENCODING 1499 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57676 +ENCODING 1500 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F8 +08 +10 +60 +ENDCHAR +STARTCHAR afii57677 +ENCODING 1501 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +48 +78 +ENDCHAR +STARTCHAR afii57678 +ENCODING 1502 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +A8 +48 +98 +ENDCHAR +STARTCHAR afii57679 +ENCODING 1503 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57680 +ENCODING 1504 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +30 +10 +10 +F0 +ENDCHAR +STARTCHAR afii57681 +ENCODING 1505 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +F0 +50 +50 +60 +ENDCHAR +STARTCHAR afii57682 +ENCODING 1506 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D8 +48 +50 +E0 +ENDCHAR +STARTCHAR afii57683 +ENCODING 1507 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +48 +48 +08 +08 +08 +ENDCHAR +STARTCHAR afii57684 +ENCODING 1508 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +08 +F0 +ENDCHAR +STARTCHAR afii57685 +ENCODING 1509 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +90 +48 +50 +60 +40 +40 +ENDCHAR +STARTCHAR afii57686 +ENCODING 1510 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +90 +48 +30 +F8 +ENDCHAR +STARTCHAR afii57687 +ENCODING 1511 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +88 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57688 +ENCODING 1512 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F0 +08 +08 +08 +ENDCHAR +STARTCHAR afii57689 +ENCODING 1513 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +A8 +E8 +88 +F0 +ENDCHAR +STARTCHAR afii57690 +ENCODING 1514 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +F8 +48 +48 +C8 +ENDCHAR +STARTCHAR afii57716 +ENCODING 1520 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D8 +48 +48 +48 +ENDCHAR +STARTCHAR afii57717 +ENCODING 1521 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +D8 +48 +08 +08 +ENDCHAR +STARTCHAR afii57718 +ENCODING 1522 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +48 +ENDCHAR +STARTCHAR uni05F3 +ENCODING 1523 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 2 2 2 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni05F4 +ENCODING 1524 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +48 +90 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +E0 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +10 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +F0 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +20 +50 +E0 +40 +40 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +88 +D8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +00 +D0 +A8 +A8 +88 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +E0 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +40 +00 +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +20 +00 +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +00 +70 +C0 +30 +E0 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +40 +E0 +40 +50 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +20 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +20 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 1 -2 +BITMAP +40 +20 +00 +90 +90 +90 +70 +90 +60 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 1 1 2 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 2 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +40 +80 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +48 +90 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 0 +BITMAP +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 1 2 2 +BITMAP +C0 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +40 +A8 +48 +10 +20 +68 +D4 +28 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +48 +48 +90 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 3 2 3 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +A0 +A0 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 5 +BITMAP +FC +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR zerosuperior +ENCODING 8304 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +00 +C0 +40 +E0 +ENDCHAR +STARTCHAR foursuperior +ENCODING 8308 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +A0 +E0 +20 +20 +ENDCHAR +STARTCHAR fivesuperior +ENCODING 8309 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixsuperior +ENCODING 8310 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR sevensuperior +ENCODING 8311 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightsuperior +ENCODING 8312 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR ninesuperior +ENCODING 8313 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftsuperior +ENCODING 8317 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 1 1 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightsuperior +ENCODING 8318 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +C0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR zeroinferior +ENCODING 8320 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR oneinferior +ENCODING 8321 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +C0 +40 +40 +E0 +ENDCHAR +STARTCHAR twoinferior +ENCODING 8322 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +20 +40 +E0 +ENDCHAR +STARTCHAR threeinferior +ENCODING 8323 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +20 +40 +20 +C0 +ENDCHAR +STARTCHAR fourinferior +ENCODING 8324 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +A0 +A0 +E0 +20 +20 +ENDCHAR +STARTCHAR fiveinferior +ENCODING 8325 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +80 +C0 +20 +C0 +ENDCHAR +STARTCHAR sixinferior +ENCODING 8326 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +80 +C0 +A0 +40 +ENDCHAR +STARTCHAR seveninferior +ENCODING 8327 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +E0 +20 +40 +40 +40 +ENDCHAR +STARTCHAR eightinferior +ENCODING 8328 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +40 +A0 +40 +ENDCHAR +STARTCHAR nineinferior +ENCODING 8329 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +40 +A0 +60 +20 +40 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 -1 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -2 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR parenleftinferior +ENCODING 8333 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 1 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR parenrightinferior +ENCODING 8334 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 5 2 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +80 +E8 +B0 +A0 +A0 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +30 +48 +E0 +40 +E0 +40 +F8 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +50 +F8 +50 +60 +40 +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +10 +38 +70 +90 +90 +70 +00 +F0 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +40 +F0 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +E0 +50 +48 +48 +E8 +D0 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +40 +F8 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 5 +BITMAP +10 +F8 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 6 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +B0 +C8 +E0 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +68 +98 +38 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +40 +F8 +40 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +10 +F8 +10 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A0 +A0 +A8 +70 +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +80 +40 +10 +28 +10 +ENDCHAR +STARTCHAR afii61289 +ENCODING 8467 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +50 +60 +40 +B0 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +E8 +E8 +D8 +D8 +C8 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +90 +D0 +D0 +B8 +B4 +98 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +A8 +A8 +A8 +A8 +70 +18 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +A8 +A8 +B0 +A8 +A8 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +FC +5C +54 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +28 +50 +50 +A0 +F8 +ENDCHAR +STARTCHAR Omega +ENCODING 8486 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR estimated +ENCODING 8494 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +F8 +C0 +70 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +C0 +40 +50 +68 +10 +28 +10 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +C0 +20 +40 +30 +E8 +10 +28 +10 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +E0 +80 +C0 +30 +E8 +10 +28 +10 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +E0 +20 +40 +50 +68 +10 +28 +10 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +48 +FC +48 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +48 +F8 +48 +20 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +A8 +20 +20 +70 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +90 +F8 +90 +20 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +78 +80 +78 +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +D8 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +F0 +08 +F0 +20 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +78 +84 +78 +30 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +70 +D8 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +F8 +88 +50 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +40 +A0 +80 +80 +80 +A0 +40 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +60 +10 +70 +90 +90 +60 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +10 +70 +10 +10 +F0 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +F0 +50 +70 +50 +50 +F0 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +98 +A8 +A8 +C8 +F0 +ENDCHAR +STARTCHAR Delta +ENCODING 8710 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +70 +80 +F0 +80 +70 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +20 +70 +A0 +F0 +A0 +70 +20 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +E0 +10 +F0 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +40 +E0 +50 +F0 +50 +E0 +40 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F8 +50 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +50 +50 +50 +50 +50 +50 +50 +F8 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +40 +20 +20 +40 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR fraction +ENCODING 8725 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +10 +20 +40 +80 +80 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR periodcentered +ENCODING 8729 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +0C +08 +08 +08 +10 +D0 +30 +30 +10 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +50 +A0 +A0 +50 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -1 +BITMAP +50 +20 +50 +90 +F8 +10 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +40 +40 +60 +C0 +40 +40 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +58 +70 +D0 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +20 +50 +50 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +50 +50 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +28 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +10 +28 +20 +70 +A8 +70 +20 +A0 +40 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +20 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 4 0 1 +BITMAP +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 4 2 1 +BITMAP +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +90 +00 +00 +90 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +00 +E0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +20 +00 +50 +A0 +00 +40 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 1 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 2 1 1 +BITMAP +A0 +50 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 0 +BITMAP +50 +A0 +00 +F0 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 -1 +BITMAP +50 +A0 +00 +F0 +00 +F0 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +40 +A8 +50 +A8 +10 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +50 +A8 +70 +A8 +50 +40 +ENDCHAR +STARTCHAR uni2259 +ENCODING 8793 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +50 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni225F +ENCODING 8799 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +60 +10 +20 +00 +20 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +18 +60 +80 +60 +98 +60 +18 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +C0 +30 +08 +30 +C8 +30 +C0 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +70 +80 +80 +70 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +70 +A0 +A0 +70 +20 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +40 +E0 +50 +50 +E0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +70 +80 +80 +70 +00 +F0 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +10 +10 +E0 +00 +F0 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +20 +70 +A0 +A0 +70 +20 +F0 +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 8 1 -1 +BITMAP +40 +E0 +50 +50 +E0 +40 +F0 +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +70 +80 +80 +70 +20 +F0 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 7 1 -1 +BITMAP +E0 +10 +10 +E0 +20 +F0 +40 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +F8 +88 +70 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +98 +A8 +C8 +70 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +08 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +80 +E0 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 0 +BITMAP +80 +E0 +80 +E0 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +F8 +80 +F8 +80 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 2 2 +BITMAP +80 +ENDCHAR +STARTCHAR uni22EE +ENCODING 8942 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 2 -1 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni22EF +ENCODING 8943 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +A8 +ENDCHAR +STARTCHAR uni22F0 +ENCODING 8944 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +00 +20 +00 +00 +80 +ENDCHAR +STARTCHAR uni22F1 +ENCODING 8945 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +80 +00 +00 +20 +00 +00 +08 +ENDCHAR +STARTCHAR uni2300 +ENCODING 8960 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +78 +98 +A8 +C8 +F0 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2308 +ENCODING 8968 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2309 +ENCODING 8969 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni230A +ENCODING 8970 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR uni230B +ENCODING 8971 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 0 +BITMAP +F0 +80 +80 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 3 -2 +BITMAP +40 +A0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 8 1 -1 +BITMAP +20 +20 +20 +20 +20 +20 +A0 +40 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 0 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +A0 +E0 +A0 +00 +38 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +80 +80 +80 +C0 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +A0 +A0 +40 +40 +38 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +80 +C0 +80 +38 +20 +30 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +60 +80 +60 +00 +30 +28 +30 +28 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +D0 +B0 +90 +20 +20 +20 +38 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 2 0 2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 9 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 -2 +BITMAP +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 2 +BITMAP +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 3 -2 +BITMAP +80 +80 +80 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +10 +F0 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +10 +10 +10 +10 +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +10 +10 +10 +10 +FC +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 1 0 2 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 2 0 2 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 8 3 -1 +BITMAP +80 +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 8 2 -1 +BITMAP +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 3 0 1 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 2 -2 +BITMAP +F0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 2 -2 +BITMAP +F0 +80 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +F0 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F8 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F8 +08 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 3 1 +BITMAP +80 +80 +80 +E0 +80 +E0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 2 2 +BITMAP +A0 +A0 +A0 +A0 +F0 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 2 1 +BITMAP +A0 +A0 +A0 +B0 +80 +F0 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 0 1 +BITMAP +10 +10 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +28 +28 +28 +E8 +08 +F8 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 3 -2 +BITMAP +80 +80 +80 +E0 +80 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 2 -2 +BITMAP +A0 +A0 +A0 +A0 +B0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 2 -2 +BITMAP +A0 +A0 +A0 +B0 +80 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +10 +10 +10 +F0 +10 +F0 +10 +10 +10 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +28 +28 +28 +28 +E8 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +28 +28 +28 +E8 +08 +E8 +28 +28 +28 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +00 +FC +10 +10 +10 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +00 +EC +28 +28 +28 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +10 +10 +10 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +28 +28 +28 +28 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +28 +28 +28 +EC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +10 +10 +10 +FC +10 +FC +10 +10 +10 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +28 +28 +28 +28 +FC +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +28 +28 +28 +EC +00 +EC +28 +28 +28 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 -2 +BITMAP +20 +40 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 -2 +BITMAP +C0 +20 +10 +10 +10 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 5 0 2 +BITMAP +10 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 2 +BITMAP +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +04 +04 +08 +10 +10 +20 +40 +40 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +80 +80 +40 +20 +20 +10 +08 +08 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +84 +84 +48 +30 +30 +30 +48 +48 +84 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 4 0 3 +BITMAP +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 -2 +BITMAP +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 9 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 9 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 9 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 9 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +A8 +00 +54 +00 +A8 +00 +54 +00 +A8 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +A8 +FC +54 +FC +A8 +FC +54 +FC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 9 5 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 0 3 +BITMAP +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 3 3 +BITMAP +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +1C +1C +1C +1C +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +F8 +88 +A8 +88 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +F0 +90 +90 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +78 +F8 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +78 +88 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +40 +40 +E0 +E0 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +40 +40 +A0 +E0 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +F0 +F8 +F0 +C0 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +C0 +F0 +C0 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +C0 +B0 +C0 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +E0 +F8 +E0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +E0 +98 +E0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +E0 +E0 +40 +40 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 4 1 1 +BITMAP +E0 +A0 +40 +40 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +18 +78 +F8 +78 +18 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +18 +68 +88 +68 +18 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +30 +F0 +30 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 3 1 1 +BITMAP +30 +D0 +30 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +F8 +38 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 3 0 1 +BITMAP +38 +C8 +38 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +78 +FC +78 +30 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +CC +84 +84 +CC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +CC +B4 +B4 +CC +FC +FC +FC +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 4 1 1 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +A8 +70 +F8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +78 +84 +CC +84 +B4 +CC +84 +78 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +78 +84 +CC +84 +CC +B4 +84 +78 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 8 0 -1 +BITMAP +78 +FC +B4 +FC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +88 +70 +88 +88 +70 +20 +F8 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +70 +88 +88 +70 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +F8 +20 +70 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +1C +0C +14 +70 +88 +88 +70 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +A8 +88 +88 +50 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +A8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +20 +70 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +F8 +F8 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 6 1 0 +BITMAP +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +28 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +58 +48 +C8 +D8 +18 +ENDCHAR +STARTCHAR uni27E8 +ENCODING 10216 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +40 +40 +80 +80 +80 +40 +40 +ENDCHAR +STARTCHAR uni27E9 +ENCODING 10217 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +80 +80 +40 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2800 +ENCODING 10240 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2801 +ENCODING 10241 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 5 +BITMAP +80 +ENDCHAR +STARTCHAR uni2802 +ENCODING 10242 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni2803 +ENCODING 10243 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 1 3 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2804 +ENCODING 10244 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2805 +ENCODING 10245 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2806 +ENCODING 10246 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 1 1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2807 +ENCODING 10247 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2808 +ENCODING 10248 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 5 +BITMAP +80 +ENDCHAR +STARTCHAR uni2809 +ENCODING 10249 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 5 +BITMAP +A0 +ENDCHAR +STARTCHAR uni280A +ENCODING 10250 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +20 +00 +80 +ENDCHAR +STARTCHAR uni280B +ENCODING 10251 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +00 +80 +ENDCHAR +STARTCHAR uni280C +ENCODING 10252 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni280D +ENCODING 10253 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni280E +ENCODING 10254 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni280F +ENCODING 10255 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2810 +ENCODING 10256 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 3 +BITMAP +80 +ENDCHAR +STARTCHAR uni2811 +ENCODING 10257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +80 +00 +20 +ENDCHAR +STARTCHAR uni2812 +ENCODING 10258 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 3 +BITMAP +A0 +ENDCHAR +STARTCHAR uni2813 +ENCODING 10259 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +80 +00 +A0 +ENDCHAR +STARTCHAR uni2814 +ENCODING 10260 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +20 +00 +80 +ENDCHAR +STARTCHAR uni2815 +ENCODING 10261 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2816 +ENCODING 10262 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +A0 +00 +80 +ENDCHAR +STARTCHAR uni2817 +ENCODING 10263 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2818 +ENCODING 10264 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 3 3 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2819 +ENCODING 10265 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +00 +20 +ENDCHAR +STARTCHAR uni281A +ENCODING 10266 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +20 +00 +A0 +ENDCHAR +STARTCHAR uni281B +ENCODING 10267 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +A0 +00 +A0 +ENDCHAR +STARTCHAR uni281C +ENCODING 10268 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni281D +ENCODING 10269 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni281E +ENCODING 10270 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni281F +ENCODING 10271 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2820 +ENCODING 10272 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2821 +ENCODING 10273 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2822 +ENCODING 10274 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +80 +00 +20 +ENDCHAR +STARTCHAR uni2823 +ENCODING 10275 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2824 +ENCODING 10276 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 1 +BITMAP +A0 +ENDCHAR +STARTCHAR uni2825 +ENCODING 10277 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni2826 +ENCODING 10278 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +80 +00 +A0 +ENDCHAR +STARTCHAR uni2827 +ENCODING 10279 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni2828 +ENCODING 10280 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2829 +ENCODING 10281 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni282A +ENCODING 10282 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni282B +ENCODING 10283 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni282C +ENCODING 10284 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni282D +ENCODING 10285 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni282E +ENCODING 10286 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni282F +ENCODING 10287 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni2830 +ENCODING 10288 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 3 1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2831 +ENCODING 10289 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni2832 +ENCODING 10290 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +A0 +00 +20 +ENDCHAR +STARTCHAR uni2833 +ENCODING 10291 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni2834 +ENCODING 10292 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +20 +00 +A0 +ENDCHAR +STARTCHAR uni2835 +ENCODING 10293 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni2836 +ENCODING 10294 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 1 +BITMAP +A0 +00 +A0 +ENDCHAR +STARTCHAR uni2837 +ENCODING 10295 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni2838 +ENCODING 10296 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2839 +ENCODING 10297 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni283A +ENCODING 10298 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni283B +ENCODING 10299 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni283C +ENCODING 10300 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni283D +ENCODING 10301 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni283E +ENCODING 10302 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni283F +ENCODING 10303 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni2840 +ENCODING 10304 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 1 -1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2841 +ENCODING 10305 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2842 +ENCODING 10306 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 -1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2843 +ENCODING 10307 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2844 +ENCODING 10308 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 1 -1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni2845 +ENCODING 10309 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2846 +ENCODING 10310 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 1 -1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2847 +ENCODING 10311 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 1 -1 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2848 +ENCODING 10312 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2849 +ENCODING 10313 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni284A +ENCODING 10314 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni284B +ENCODING 10315 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni284C +ENCODING 10316 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni284D +ENCODING 10317 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni284E +ENCODING 10318 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni284F +ENCODING 10319 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2850 +ENCODING 10320 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2851 +ENCODING 10321 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2852 +ENCODING 10322 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2853 +ENCODING 10323 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2854 +ENCODING 10324 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2855 +ENCODING 10325 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2856 +ENCODING 10326 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2857 +ENCODING 10327 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2858 +ENCODING 10328 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2859 +ENCODING 10329 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni285A +ENCODING 10330 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni285B +ENCODING 10331 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni285C +ENCODING 10332 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni285D +ENCODING 10333 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni285E +ENCODING 10334 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni285F +ENCODING 10335 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2860 +ENCODING 10336 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +20 +00 +80 +ENDCHAR +STARTCHAR uni2861 +ENCODING 10337 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2862 +ENCODING 10338 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2863 +ENCODING 10339 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2864 +ENCODING 10340 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +A0 +00 +80 +ENDCHAR +STARTCHAR uni2865 +ENCODING 10341 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2866 +ENCODING 10342 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2867 +ENCODING 10343 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2868 +ENCODING 10344 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2869 +ENCODING 10345 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni286A +ENCODING 10346 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni286B +ENCODING 10347 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni286C +ENCODING 10348 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni286D +ENCODING 10349 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni286E +ENCODING 10350 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni286F +ENCODING 10351 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2870 +ENCODING 10352 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2871 +ENCODING 10353 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2872 +ENCODING 10354 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2873 +ENCODING 10355 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2874 +ENCODING 10356 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2875 +ENCODING 10357 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2876 +ENCODING 10358 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2877 +ENCODING 10359 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2878 +ENCODING 10360 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni2879 +ENCODING 10361 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni287A +ENCODING 10362 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni287B +ENCODING 10363 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +00 +80 +ENDCHAR +STARTCHAR uni287C +ENCODING 10364 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni287D +ENCODING 10365 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni287E +ENCODING 10366 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni287F +ENCODING 10367 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +00 +80 +ENDCHAR +STARTCHAR uni2880 +ENCODING 10368 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 1 3 -1 +BITMAP +80 +ENDCHAR +STARTCHAR uni2881 +ENCODING 10369 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2882 +ENCODING 10370 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2883 +ENCODING 10371 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2884 +ENCODING 10372 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +80 +00 +20 +ENDCHAR +STARTCHAR uni2885 +ENCODING 10373 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2886 +ENCODING 10374 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2887 +ENCODING 10375 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2888 +ENCODING 10376 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2889 +ENCODING 10377 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni288A +ENCODING 10378 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni288B +ENCODING 10379 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni288C +ENCODING 10380 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni288D +ENCODING 10381 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni288E +ENCODING 10382 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni288F +ENCODING 10383 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2890 +ENCODING 10384 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 -1 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2891 +ENCODING 10385 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2892 +ENCODING 10386 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2893 +ENCODING 10387 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2894 +ENCODING 10388 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2895 +ENCODING 10389 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2896 +ENCODING 10390 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2897 +ENCODING 10391 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni2898 +ENCODING 10392 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2899 +ENCODING 10393 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni289A +ENCODING 10394 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni289B +ENCODING 10395 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni289C +ENCODING 10396 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni289D +ENCODING 10397 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni289E +ENCODING 10398 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni289F +ENCODING 10399 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +00 +20 +ENDCHAR +STARTCHAR uni28A0 +ENCODING 10400 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 3 3 -1 +BITMAP +80 +00 +80 +ENDCHAR +STARTCHAR uni28A1 +ENCODING 10401 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28A2 +ENCODING 10402 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28A3 +ENCODING 10403 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28A4 +ENCODING 10404 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A5 +ENCODING 10405 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A6 +ENCODING 10406 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A7 +ENCODING 10407 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28A8 +ENCODING 10408 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +00 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni28A9 +ENCODING 10409 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28AA +ENCODING 10410 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28AB +ENCODING 10411 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28AC +ENCODING 10412 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28AD +ENCODING 10413 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28AE +ENCODING 10414 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28AF +ENCODING 10415 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B0 +ENCODING 10416 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 5 3 -1 +BITMAP +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni28B1 +ENCODING 10417 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28B2 +ENCODING 10418 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28B3 +ENCODING 10419 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28B4 +ENCODING 10420 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B5 +ENCODING 10421 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B6 +ENCODING 10422 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B7 +ENCODING 10423 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28B8 +ENCODING 10424 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 1 7 3 -1 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni28B9 +ENCODING 10425 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28BA +ENCODING 10426 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28BB +ENCODING 10427 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni28BC +ENCODING 10428 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28BD +ENCODING 10429 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28BE +ENCODING 10430 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28BF +ENCODING 10431 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +00 +20 +ENDCHAR +STARTCHAR uni28C0 +ENCODING 10432 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 1 1 -1 +BITMAP +A0 +ENDCHAR +STARTCHAR uni28C1 +ENCODING 10433 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C2 +ENCODING 10434 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C3 +ENCODING 10435 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C4 +ENCODING 10436 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C5 +ENCODING 10437 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C6 +ENCODING 10438 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C7 +ENCODING 10439 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28C8 +ENCODING 10440 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28C9 +ENCODING 10441 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28CA +ENCODING 10442 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28CB +ENCODING 10443 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28CC +ENCODING 10444 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28CD +ENCODING 10445 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28CE +ENCODING 10446 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28CF +ENCODING 10447 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D0 +ENCODING 10448 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D1 +ENCODING 10449 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D2 +ENCODING 10450 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D3 +ENCODING 10451 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D4 +ENCODING 10452 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D5 +ENCODING 10453 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D6 +ENCODING 10454 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D7 +ENCODING 10455 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28D8 +ENCODING 10456 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28D9 +ENCODING 10457 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28DA +ENCODING 10458 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28DB +ENCODING 10459 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +00 +00 +A0 +ENDCHAR +STARTCHAR uni28DC +ENCODING 10460 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28DD +ENCODING 10461 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28DE +ENCODING 10462 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28DF +ENCODING 10463 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +80 +00 +A0 +ENDCHAR +STARTCHAR uni28E0 +ENCODING 10464 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E1 +ENCODING 10465 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E2 +ENCODING 10466 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E3 +ENCODING 10467 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E4 +ENCODING 10468 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E5 +ENCODING 10469 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +00 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E6 +ENCODING 10470 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E7 +ENCODING 10471 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28E8 +ENCODING 10472 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28E9 +ENCODING 10473 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28EA +ENCODING 10474 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28EB +ENCODING 10475 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28EC +ENCODING 10476 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +00 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28ED +ENCODING 10477 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +00 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28EE +ENCODING 10478 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28EF +ENCODING 10479 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +80 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F0 +ENCODING 10480 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F1 +ENCODING 10481 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F2 +ENCODING 10482 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F3 +ENCODING 10483 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F4 +ENCODING 10484 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F5 +ENCODING 10485 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F6 +ENCODING 10486 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 5 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F7 +ENCODING 10487 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +80 +00 +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28F8 +ENCODING 10488 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28F9 +ENCODING 10489 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28FA +ENCODING 10490 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28FB +ENCODING 10491 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +20 +00 +A0 +ENDCHAR +STARTCHAR uni28FC +ENCODING 10492 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28FD +ENCODING 10493 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +20 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28FE +ENCODING 10494 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +20 +00 +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR uni28FF +ENCODING 10495 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 3 7 1 -1 +BITMAP +A0 +00 +A0 +00 +A0 +00 +A0 +ENDCHAR +STARTCHAR fi +ENCODING 64257 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +20 +50 +40 +F0 +50 +50 +ENDCHAR +STARTCHAR fl +ENCODING 64258 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +30 +50 +50 +F0 +50 +50 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 640 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +70 +D8 +A8 +E8 +D8 +D8 +F8 +D8 +70 +ENDCHAR +ENDFONT diff --git a/buildroot/share/fonts/u8glib-bdf2u8g.patch b/buildroot/share/fonts/u8glib-bdf2u8g.patch new file mode 100644 index 00000000..1201e998 --- /dev/null +++ b/buildroot/share/fonts/u8glib-bdf2u8g.patch @@ -0,0 +1,32 @@ +178c178 +< fprintf(out_fp, "%d", data_buf[i]); +--- +> fprintf(out_fp, "0x%02x", data_buf[i]); +180c180 +< fprintf(out_fp, "%3d", data_buf[i]); +--- +> fprintf(out_fp, "0x%02x", data_buf[i]); +487c487,488 +< int bdf_delta_x; /* DWIDTH arg 1 */ +--- +> int bdf_delta_x_default = -1; +> int bdf_delta_x = -1; /* DWIDTH arg 1 */ +1097a1099,1114 +> else if ( strcmp(p_buf, "CHARS") == 0 ) +> { +> if (bdf_delta_x < 0) { +> bdf_delta_x = 0; +> } +> if (bdf_delta_x_default < 0) { +> bdf_delta_x_default = bdf_delta_x; +> } +> } +> else if ( strcmp(p_buf, "STARTCHAR") == 0 ) +> { +> if (bdf_delta_x_default < 0) { +> bdf_delta_x_default = 0; +> } +> bdf_delta_x = bdf_delta_x_default; +> } +1293d1309 +< fprintf(out_fp, "#include \"u8g.h\"\n"); diff --git a/buildroot/share/fonts/uxggenpages.md b/buildroot/share/fonts/uxggenpages.md new file mode 100644 index 00000000..5e40c392 --- /dev/null +++ b/buildroot/share/fonts/uxggenpages.md @@ -0,0 +1,110 @@ +## Language engine and tools + +### Supported hardware + +Marlin supports HD44780 character LCD and 128x64 graphical LCD via U8GLIB. Because of the limitation of HD44780 hardwares, Marlin can only support three character sets for that hardware: Japanese (kana_utf8), Russian/Cyrillic (ru), or Western (Roman characters) + +For the graphical LCD modules, there's far less limitation. Users and language maintainers can easily change the language translation strings when saved with UTF-8 encoding. The only extra step is to regenerate the font data from an existing BDF font file. + +### How to support a new language? + +1. Prepare the translation source file + +You need to add a language header file `language_xx.h`, replacing xx with the language/country code. (e.g., "en" for English). You can start with a existing language file by copying it to a new location: + +```bash +cp language_zh_CN.h language_zh_TW.h +``` + +Then simply replace the strings inside the `_UxGT()` macros. + +Make sure the file is saved as UTF-8 encoded. + +2. Generate the font data file + +This step gathers the glyphs used in the language file from a 9pt bitmap font and saves the data in a language_data_xx.h file. So the font used for conversion should contain all the characters in your language file. + +The default bitmap font is WQY's 9pt bitmap font. + +Download from [here](http://wenq.org/daily/wqy-bitmapfont-bdf-gb18030-nightly_build.tar.gz), or to install in a Debian/Ubuntu system: + +``` +sudo apt-get install xfonts-wqy +``` + +You also need to compile the `bdf2u8g` binary to convert BDF font files into U8glib data structures: + +```bash +cd marlin-git/buildroot/share/fonts/ +./get-bdf2u8g.sh +``` + +The `genallfont.sh` script generates font data for all language translation files. + +You may specify a list of languages to process. For example: + +```bash +MARLIN_LANGS="zh_CN zh_TW" +``` + +and run the script to generate the font data (`language_data_xx.h`): + +```bash +cd marlin-git/Marlin/ +MARLIN_LANGS="zh_CN zh_TW" ../buildroot/share/fonts/genallfont.sh +``` + +3. Change the language settings + +To compile Marlin with your language, choose a language in `Configuration.h`. For Chinese (Taiwan) you would use: + +```cpp +#define LCD_LANGUAGE zh_TW +``` + +4. Compile and Upload the firmware + +Open `Marlin.ino` in your IDE and compile the firmware. Once the build succeeds, upload it to your board. + +### Update the language translation + +Whenever language files are changed, you need to run the script `genallfont.sh` again to update the font data file. + +### Use a cool font + +You may need to use a different font to support your own language, because the default 9pt font is not complete. (You may also support them by adding the missing glyphs to the font.) + +After you've prepared your font, specify the font file path as an argument to `genallfont.sh`, so that the font used for your language is your new font. For example, if your font is named `newfont.bdf` run the following command: + +```bash +cd Marlin/ +../buildroot/share/fonts/genallfont.sh ./newfont.bdf +``` + +...or to regenerate the language font data for a specific language: + +```bash +MARLIN_LANGS="zh_TW" ../buildroot/share/fonts/genallfont.sh ./newfont.bdf +``` + +### Suggestions for Maintainers + +The tool and the language engine can be easily updated. Since it uses common bitmap font files and UTF-8 text, the maintainer needs to confirm that the font contains the glyphs in the language files. + +At this time, the font file `marlin-6x12-3.bdf` is used to generate the font data. It combines all of Marlin's ISO10646-1 fonts and the WQY 9pt bitmap font. + +### Related resources + +#### Fonts + +- [WQY](http://wenq.org/) +- [WQY 9pt bitmap font](http://wenq.org/daily/wqy-bitmapfont-bdf-gb18030-nightly_build.tar.gz) +- [unifont (16x8 or 16x16)](https://unifoundry.com/unifont.html) + +Documents related to the old version of the language engine: + +- [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) +- [Standalone test project for the Marlin UTF-8 language engine](https://github.com/yhfudev/marlin-fontutf8.git) diff --git a/buildroot/share/fonts/uxggenpages.sh b/buildroot/share/fonts/uxggenpages.sh new file mode 100644 index 00000000..a99fd990 --- /dev/null +++ b/buildroot/share/fonts/uxggenpages.sh @@ -0,0 +1,176 @@ +#!/usr/bin/env bash + +##################################################################### +# genpages.sh for u8g +# +# This script will generate u8g c files for specified fonts +# +# Copyright 2015-2018 Yunhui Fu +# License: GPL/BSD +##################################################################### + +my_getpath() { + local PARAM_DN="$1" + shift + + #readlink -f + local DN="${PARAM_DN}" + local FN= + if [ ! -d "${DN}" ]; then + FN=$(basename "${DN}") + DN=$(dirname "${DN}") + fi + cd "${DN}" > /dev/null 2>&1 + DN=$(pwd) + cd - > /dev/null 2>&1 + echo -n "${DN}" + [[ -z "$FN" ]] || echo -n "/${FN}" +} +#DN_EXEC=`echo "$0" | ${EXEC_AWK} -F/ '{b=$1; for (i=2; i < NF; i ++) {b=b "/" $(i)}; print b}'` +DN_EXEC=$(dirname $(my_getpath "$0") ) + +##################################################################### + +EXEC_GENPAGES=${DN_EXEC}/genpages +[ -x "${EXEC_GENPAGES}" ] || EXEC_GENPAGES="$(my_getpath ${DN_EXEC}/../../../genpages)" +[ -x "${EXEC_GENPAGES}" ] || EXEC_GENPAGES=$(which genpages) +[ -x "${EXEC_GENPAGES}" ] || { echo "Error: genpages not found!" ; exit 1; } +#echo "EXEC_GENPAGES=${EXEC_GENPAGES}" + +EXEC_BDF2U8G=${DN_EXEC}/bdf2u8g +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G="${DN_EXEC}/../../../bdf2u8g" +[ -x "${EXEC_BDF2U8G}" ] || EXEC_BDF2U8G=$(which bdf2u8g) +[ -x "${EXEC_BDF2U8G}" ] || { echo "Error: bdf2u8g not found!" ; echo "Please compile u8glib/tools/font/bdf2u8g/bdf2u8g and link to it from here!"; exit 1; } + +DN_CUR=$(pwd) +DN_DATA=$(pwd)/datatmp +mkdir -p "${DN_DATA}" + +##################################################################### + +FONTHOME=/usr/share/fonts + +FN_FONT_BASE="marlin-6x12-3" +#FN_FONT_BASE=unifont +#FN_FONT_BASE=wenquanyi_12pt +#FN_FONT_BASE=wenquanyi_9pt + +FN_FONT="${1:-}" +DN_FONT0=`dirname ${FN_FONT}` +DN_FONT="$(my_getpath ${DN_FONT0})" +FN_FONT="$(my_getpath "${DN_FONT}")/"`basename ${FN_FONT}` +[ -z "${FN_FONT}" ] && FN_FONT=${DN_DATA}/../${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT=${DN_EXEC}/${FN_FONT_BASE}.bdf +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/wenquanyi/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/X11/misc/${FN_FONT_BASE}.bdf" +[ -f "${FN_FONT}" ] || FN_FONT="$FONTHOME/misc/${FN_FONT_BASE}.bdf" +#echo "uxggenpages.sh: FN_FONT=${FN_FONT}" + +if [ ! -f "${FN_FONT}" ]; then + FN_FONT_PCF="$FONTHOME/X11/misc/${FN_FONT_BASE}.pcf" + [ -f "${FN_FONT_PCF}" ] || FN_FONT_PCF="$FONTHOME/misc/${FN_FONT_BASE}.pcf" + [ -f "${FN_FONT_PCF}" ] || FN_FONT_PCF="$FONTHOME/wenquanyi/${FN_FONT_BASE}.pcf" + if [ -f "${FN_FONT_PCF}" ]; then + EXEC_PCF2BDF=$(which pcf2bdf) + if [ ! -x "${EXEC_PCF2BDF}" ]; then + echo "Error: not found pcf2bdf!" + echo " Please install pcf2bdf." + exit 1 + fi + FN_FONT="./${FN_FONT_BASE}.bdf" + echo ${EXEC_PCF2BDF} -o "${FN_FONT}" "${FN_FONT_PCF}" + ${EXEC_PCF2BDF} -o "${FN_FONT}" "${FN_FONT_PCF}" + fi +fi + +[ -f "${FN_FONT}" ] || { echo "Error: can't find font ${FN_FONT}!" ; exit 1; } + +##################################################################### + +#(cd ${DN_EXEC}; gcc -o genpages genpages.c getline.c) + +rm -f tmpa tmpb +touch tmpa tmpb +#rm -f ${DN_EXEC}/fontpage_*.h +rm -f fontpage_*.h + +cat << EOF >"proc.awk" +BEGIN { + cur_page=0; + val_begin=0; + val_pre=0; + utf8_pre=""; + utf8_begin=""; +}{ + page=\$1; + val_real=\$2; + utf8=\$3; + # assert (val_real < 128); + val=val_real + 128; + if (cur_page != page) { + if (cur_page != 0) { + if (val_begin != 0) { + print cur_page " " val_begin " " val_pre " " utf8_begin " " utf8_pre; + } + } + cur_page=page; + val_begin=val; + val_pre=val; + utf8_begin=utf8; + utf8_pre=utf8; + } else { + if (val_pre + 1 != val) { + if (cur_page != 0) { + print cur_page " " val_begin " " val_pre " " utf8_begin " " utf8_pre; + } + val_begin=val; + val_pre=val; + utf8_begin=utf8; + utf8_pre=utf8; + } else { + val_pre = val; + utf8_pre=utf8; + } + } +} END { + if (cur_page != 0) { + print cur_page " " val_begin " " val_pre " " utf8_begin " " utf8_pre; + } +} +EOF + +AWK=$(which gawk || which awk) + +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 \ + | "$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 ; + fi ; \ + grep -A 10000000000 u8g_fntpgm_uint8_t ${DN_DATA}/fontpage_${PAGE}_${BEGIN}_${END}.h >> tmpa ; \ + echo " FONTDATA_ITEM(${PAGE}, ${BEGIN}, ${END}, fontpage_${PAGE}_${BEGIN}_${END}), // '${UTF8BEGIN}' -- '${UTF8END}'" >> tmpb ;\ + done + +TMPA=$(cat tmpa) +TMPB=$(cat tmpb) + +EOL=$'\n' +[[ ! "$TMPA" == "" ]] && TMPA="$EOL$TMPA$EOL" +[[ ! "$TMPB" == "" ]] && TMPB="$EOL$TMPB$EOL" + +rm -f tmpa tmpb "proc.awk" + +cat <fontutf8-data.h +/** + * 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 +$TMPA +#define FONTDATA_ITEM(page, begin, end, data) { page, begin, end, COUNT(data), data } +static const uxg_fontinfo_t g_fontinfo[] PROGMEM = {$TMPB}; +EOF diff --git a/buildroot/share/git/README.md b/buildroot/share/git/README.md new file mode 100644 index 00000000..4dcd7c15 --- /dev/null +++ b/buildroot/share/git/README.md @@ -0,0 +1,60 @@ +## Marlin Github Helper Scripts + +### Introduction + +A Pull Request is often just the start of a longer process of patching and refining the code until it's ready to merge. In that process it's common to accumulate a lot of commits, some of which are non-functional. Before merging any PR, excess commits need to be "squashed" and sometimes rearranged or reworked to produce a well-packaged set of changes and keep the commit history relatively clean. + +In addition, while a PR is being worked on other commits may be merged, leading to conflicts that need resolution. For this reason, it's a best practice to periodically refresh the PR so the working copy closely reflects the final merge into upstream `MarlinFirmware`. + +#### Merge vs Rebase + +If you plan to create PRs and work on them after submission I recommend not using Github Desktop to sync and merge. Use the command line instead. Github Desktop provides a "merge" option, but I've found that "`git rebase`" is much cleaner and easier to manage. Merge applies new work _after_ your commits, which buries them deeper in the commit history and makes it hard to bring them together as a final packaged unit. Rebase helpfully moves your commits to the tip of the branch, ensuring that your commits are adapted to the current code. This makes it easier to keep revising the commits in-place. + +### The Scripts + +The following scripts can be used on any system with a GNU environment to speed up the process of working with Marlin branches and submitting changes to the project. + +#### Remotes + +File|Description +----|----------- +mfadd [user]|Add and Fetch Remote - Add and fetch another user's Marlin fork. Optionally, check out one of their branches. +mfinit|Init Working Copy - Create a remote named '`upstream`' (for use by the other scripts) pointing to the '`MarlinFirmware`' fork. This only needs to be used once. Newer versions of Github Desktop may create `upstream` on your behalf. + +#### Branches + +File|Description +----|----------- +mfnew [branch]|New Branch - Creates a new branch based on `upstream/[PR-target]`. All new work should start with this command. +mffp|Fast Push - Push the HEAD or a commit ID to `upstream` immediately. Requires privileged access to the MarlinFirmware repo. +firstpush|Push the current branch to 'origin' -your fork on Github- and set it to track '`origin`'. The branch needs to reside on Github before you can use it to make a PR. + +#### Making / Amending PRs + +File|Description +----|----------- +mfpr|Pull Request - Open the Compare / Pull Request page on Github for the current branch. +mfrb|Do a `git rebase` then `git rebase -i` of the current branch onto `upstream/[PR-target]`. Use this to edit your commits anytime. +mfqp|Quick Patch - Commit all current changes as "patch", then do `mfrb`, followed by `git push -f` if no conflicts need resolution. + +#### Documentation + +File|Description +----|----------- +mfdoc|Build the documentation with Jekyll and preview it locally. +mfpub|Build and publish the documentation to marlinfw.org. + +#### Utilities + +File|Description +----|----------- +ghtp -[h/s]|Set the protocol to use for all remotes. -h for HTTPS, -s for SSL. +ghpc [-f]|Push current branch to 'origin' or to the remote indicated by the error. +mfinfo|This utility script is used by the other scripts to get:
- The upstream project ('`MarlinFirmware`')
- the '`origin`' project (i.e., your Github username),
- the repository name ('`Marlin`'),
- the PR target branch ('`bugfix-1.1.x`'), and
- the current branch (or the first command-line argument).

By itself, `mfinfo` simply prints these values to the console. +mfclean     |Prune your merged and remotely-deleted branches. + +--- + +### Examples + +For a demonstration of these scripts see the video [Marlin Live - May 9 2019](https://youtu.be/rwT4G0uVTIY). There is also an old write-up at [#3193](https://github.com/MarlinFirmware/Marlin/issues/3193). diff --git a/buildroot/share/git/firstpush b/buildroot/share/git/firstpush new file mode 100644 index 00000000..9a68fc5a --- /dev/null +++ b/buildroot/share/git/firstpush @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# +# firstpush +# +# Push a branch to 'origin' and open the +# commit log to watch Travis CI progress. +# + +[[ $# == 0 ]] || { echo "usage: `basename $0`" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo) || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +FORK=${INFO[1]} +REPO=${INFO[2]} +BRANCH=${INFO[5]} + +git push --set-upstream origin HEAD:$BRANCH + +OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') +URL="https://github.com/$FORK/$REPO/commits/$BRANCH" + +if [ -z "$OPEN" ]; then + echo "Can't find a tool to open the URL:" + echo $URL +else + echo "Viewing commits on $BRANCH..." + "$OPEN" "$URL" +fi diff --git a/buildroot/share/git/ghpc b/buildroot/share/git/ghpc new file mode 100644 index 00000000..a3def15e --- /dev/null +++ b/buildroot/share/git/ghpc @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# +# ghpc (GitHub Push Current) +# +# - Push current branch to its remote. Try the following until it works: +# - Plain 'git push' +# - 'git push -f' +# - Try the 'git push' command from the 'git push' error message +# - Try adding '-f' to that command +# + +yay() { echo "SUCCESS" ; } +boo() { echo "FAIL" ; } + +FORCE=$([[ "$1" == "--force" || "$1" == "-f" ]] && echo 1) + +if [[ ! $FORCE ]]; then + echo -n "trying 'git push' ...... " + git push >/dev/null 2>&1 && { yay ; exit ; } + boo +fi + +echo -n "trying 'git push -f' ... " + +# Get the error output from the failed push +# and get the recommended 'git push' line +git push -f 2>&1 | { + CMD="" + + ltrim() { + [[ "$1" =~ [^[:space:]].* ]] + printf "%s" "$BASH_REMATCH" + } + + while IFS= read -r line + do + #echo "$line" + if [[ -z "$CMD" && $line =~ "git push" ]]; then + CMD=$(ltrim "$line") + fi + done + + # if a command was found try it + if [[ -n "$CMD" ]]; then + + boo + + if [[ ! $FORCE ]]; then + echo -n "trying '$CMD' ...... " + $CMD >/dev/null 2>&1 && { yay ; exit ; } + boo + fi + + fCMD=${CMD/ push / push -f } + echo -n "trying '$fCMD' ... " + $fCMD >/dev/null 2>&1 && { yay ; exit ; } + boo + + exit 1 + + else + + yay + + fi +} + +[[ ${PIPESTATUS[1]} == 1 ]] && echo "Sorry! Failed to push current branch." diff --git a/buildroot/share/git/ghtp b/buildroot/share/git/ghtp new file mode 100644 index 00000000..14afd8a2 --- /dev/null +++ b/buildroot/share/git/ghtp @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# ghtp (GitHub Transport Protocol) +# +# 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@" ; 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 + echo -e " \e[0;92m-s\e[0m to switch to SSH" 1>&2 + exit 1 + ;; +esac + +AWK=$(which gawk || which awk) + +# 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/") + +[[ -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: " +echo "$REMOTES" | "$AWK" '{printf "%s ", $1}' +echo diff --git a/buildroot/share/git/mfadd b/buildroot/share/git/mfadd new file mode 100644 index 00000000..30be1ec0 --- /dev/null +++ b/buildroot/share/git/mfadd @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# +# mfadd user[:branch] [copyname] +# +# Add a remote and fetch it. Optionally copy a branch. +# +# Examples: +# mfadd thefork +# mfadd thefork:patch-1 +# mfadd thefork:patch-1 the_patch_12345 +# + +[[ $# > 0 && $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` user[:branch] [copyname]" 1>&2 ; exit 1; } + +# If a colon or slash is included, split the parts +if [[ $1 =~ ":" || $1 =~ "/" ]]; then + [[ $1 =~ ":" ]] && IFS=':' || IFS="/" + read -a DATA <<< "$1" + USER=${DATA[0]} + BRANCH=${DATA[1]} + NAME=${2:-$BRANCH} +else + USER=$1 +fi + +MFINFO=$(mfinfo) || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +REPO=${INFO[2]} + +set -e + +echo "Adding and fetching $USER..." +git remote add "$USER" "git@github.com:$USER/$REPO.git" >/dev/null 2>&1 || echo "Remote exists." +git fetch "$USER" + +[[ ! -z "$BRANCH" && ! -z "$NAME" ]] && git checkout -b "$NAME" --track "$USER/$BRANCH" diff --git a/buildroot/share/git/mfclean b/buildroot/share/git/mfclean new file mode 100644 index 00000000..fd131c42 --- /dev/null +++ b/buildroot/share/git/mfclean @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +# +# mfclean +# +# Prune all your merged branches and any branches whose remotes are gone +# Great way to clean up your branches after messing around a lot +# + +AWK=$(which gawk || which awk) + +KEEP="RC|RCBugFix|dev|master|bugfix-1|bugfix-2" + +echo "Fetching latest upstream and origin..." +git fetch upstream +git fetch origin +echo + +echo "Pruning Merged Branches..." +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]' | "$AWK" '{print $1}' | xargs -n 1 git branch -D +echo + +# List fork branches that don't match local branches +echo "You may want to remove (or checkout) these refs..." +comm -23 \ + <(git branch --all | sed 's/^[\* ] //' | grep origin/ | grep -v "\->" | awk '{ print $1; }' | sed 's/remotes\/origin\///') \ + <(git branch --all | sed 's/^[\* ] //' | grep -v remotes/ | awk '{ print $1; }') \ + | awk '{ print "git branch -d -r origin/" $1; print "git checkout origin/" $1 " -b " $1; print ""; }' +echo diff --git a/buildroot/share/git/mfdoc b/buildroot/share/git/mfdoc new file mode 100644 index 00000000..ce214190 --- /dev/null +++ b/buildroot/share/git/mfdoc @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# +# mfdoc +# +# Start Jekyll in watch mode to work on Marlin Documentation and preview locally +# + +[[ $# == 0 ]] || { echo "Usage: `basename $0`" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +ORG=${INFO[0]} +REPO=${INFO[2]} +BRANCH=${INFO[5]} + +[[ $ORG == "MarlinFirmware" && $REPO == "MarlinDocumentation" ]] || { echo "Wrong repository." 1>&2; exit 1; } + +opensite() { + URL="http://127.0.0.1:4000/" + OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') + if [ -z "$OPEN" ]; then + echo "Can't find a tool to open the URL:" + echo $URL + else + echo "Opening preview site in the browser..." + "$OPEN" "$URL" + fi +} + +echo "Previewing MarlinDocumentation..." + +bundle exec jekyll serve --watch --incremental | { + while IFS= read -r line + do + [[ $line =~ "Server running" ]] && opensite + echo "$line" + done +} diff --git a/buildroot/share/git/mffp b/buildroot/share/git/mffp new file mode 100644 index 00000000..2663a4a1 --- /dev/null +++ b/buildroot/share/git/mffp @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# +# mffp [1|2|3] [commit-id] +# +# Push the given commit (or HEAD) upstream immediately. +# By default: `git push upstream HEAD:bugfix-1.1.x` +# + +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2|3] [commit-id]" 1>&2 ; exit 1; } + +if [[ $1 == '1' || $1 == '2' || $1 == '3' ]]; then + MFINFO=$(mfinfo "$1") || exit 1 + REF=${2:-HEAD} +else + MFINFO=$(mfinfo) || exit 1 + REF=${1:-HEAD} +fi + +IFS=' ' read -a INFO <<< "$MFINFO" +ORG=${INFO[0]} +TARG=${INFO[3]} + +if [[ $ORG == "MarlinFirmware" ]]; then + git push upstream $REF:$TARG +else + echo "Not a MarlinFirmware working copy."; exit 1 +fi diff --git a/buildroot/share/git/mfhelp b/buildroot/share/git/mfhelp new file mode 100644 index 00000000..1afc4c68 --- /dev/null +++ b/buildroot/share/git/mfhelp @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# +# mfhelp +# + +cat </dev/null | grep ^* | sed 's/\* //g') +[[ -z $CURR ]] && { echo "No git repository here!" 1>&2 ; exit 1; } +[[ $CURR == "(no"* ]] && { echo "Git is busy with merge, rebase, etc." 1>&2 ; exit 1; } + +REPO=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') +[[ -z $REPO ]] && { echo "`basename $0`: No 'upstream' remote found. (Did you run mfinit?)" 1>&2 ; exit 1; } + +ORG=$(git remote get-url upstream 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') +[[ $ORG == MarlinFirmware ]] || { echo "`basename $0`: Not a Marlin repository." 1>&2 ; exit 1; } + +FORK=$(git remote get-url origin 2>/dev/null | sed -E 's/.*[\/:](.*)\/.*$/\1/') + +# Defaults if no arguments given +BRANCH=$CURR +INDEX=1 + +while [[ $# -gt 0 ]]; do + opt="$1" ; shift ; val="$1" + + IFS='=' read -a PARTS <<<"$opt" + [[ "${PARTS[1]}" != "" ]] && { EQUALS=1 ; opt="${PARTS[0]}" ; val="${PARTS[1]}" ; } + + GOODVAL=1 + if [[ "$val" =~ ^-{1,2}.* || ! "$opt" =~ ^-{1,2}.* ]]; then + GOODVAL=0 + val="" + fi + + case "$opt" in + -*|--*) MORE="$MORE$opt " ; [[ $EQUALS == 1 ]] && MORE="$MORE=$val" ;; + 1|2|3) INDEX=$opt ;; + *) BRANCH="$opt" ;; + esac + +done + +case "$REPO" in + Marlin ) TARG=bugfix-2.0.x ; [[ $INDEX == 1 ]] && TARG=bugfix-1.1.x ; [[ $INDEX == 3 ]] && TARG=dev-2.1.x ;; + Configurations ) TARG=import-2.0.x ;; + MarlinDocumentation ) TARG=master ;; +esac + +[[ $BRANCH =~ ^[123]$ ]] && USAGE=1 + +[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3] [branch]" 1>&2 ; exit 1 ; } + +echo "$ORG $FORK $REPO $TARG $BRANCH $CURR $MORE" diff --git a/buildroot/share/git/mfinit b/buildroot/share/git/mfinit new file mode 100644 index 00000000..bc2495ad --- /dev/null +++ b/buildroot/share/git/mfinit @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# mfinit +# +# Create the upstream remote for a forked repository +# + +[[ $# == 0 ]] || { echo "usage: `basename $0`" 1>&2 ; exit 1; } + +[[ -z $(git branch 2>/dev/null | grep ^* | sed 's/\* //g') ]] && { echo "No git repository here!" 1>&2 ; exit 1; } + +REPO=$(git remote get-url origin 2>/dev/null | sed -E 's/.*\/(.*)\.git/\1/') +[[ -z $REPO ]] && { echo "`basename $0`: No 'origin' remote found." 1>&2 ; exit 1; } + +echo "Adding 'upstream' remote for convenience." +git remote add upstream "git@github.com:MarlinFirmware/$REPO.git" +git fetch upstream diff --git a/buildroot/share/git/mfnew b/buildroot/share/git/mfnew new file mode 100644 index 00000000..e491fea1 --- /dev/null +++ b/buildroot/share/git/mfnew @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# +# mfnew +# +# Create a new branch from the default target with the given name +# + +usage() { + echo "usage: `basename $0` [1|2|3] [name]" 1>&2 +} + +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { usage; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +TARG=${INFO[3]} +BRANCH=pr_for_$TARG-$(date +"%G-%m-%d_%H.%M.%S") + +# BRANCH can be given as the last argument +case "$#" in + 1 ) case "$1" in + 1|2|3) ;; + *) BRANCH=$1 ;; + esac + ;; + 2 ) case "$1" in + 1|2|3) BRANCH=$2 ;; + *) usage ; exit 1 ;; + esac + ;; +esac + +git fetch upstream +git checkout --no-track upstream/$TARG -b $BRANCH diff --git a/buildroot/share/git/mfpr b/buildroot/share/git/mfpr new file mode 100644 index 00000000..b853c692 --- /dev/null +++ b/buildroot/share/git/mfpr @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# +# mfpr [1|2|3] +# +# Make a PR against bugfix-1.1.x or bugfix-2.0.x +# + +[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2|3] [branch]" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +ORG=${INFO[0]} +FORK=${INFO[1]} +REPO=${INFO[2]} +TARG=${INFO[3]} +BRANCH=${INFO[4]} +OLDBRANCH=${INFO[5]} + +[[ $BRANCH == $TARG ]] && { echo "Can't create a PR from the PR Target ($BRANCH). Make a copy first." 1>&2 ; exit 1; } + +[[ $BRANCH != $OLDBRANCH ]] && { git checkout $BRANCH || exit 1; } + +# See if it's been pushed yet +if [ -z "$(git branch -vv | grep ^\* | grep \\[origin)" ]; then firstpush; fi + +OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') +URL="https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" + +if [ -z "$OPEN" ]; then + echo "Can't find a tool to open the URL:" + echo $URL +else + echo "Opening a New PR Form..." + "$OPEN" "$URL" +fi + +[[ $BRANCH != $OLDBRANCH ]] && git checkout $OLDBRANCH diff --git a/buildroot/share/git/mfpub b/buildroot/share/git/mfpub new file mode 100644 index 00000000..6a912e55 --- /dev/null +++ b/buildroot/share/git/mfpub @@ -0,0 +1,138 @@ +#!/usr/bin/env bash +# +# mfpub +# +# Use Jekyll to generate Marlin Documentation, which is then +# git-pushed to Github to publish it to the live site. +# This publishes the current branch, and doesn't force +# changes to be pushed to the 'master' branch. Be sure to +# push any permanent changes to 'master'. +# + +[[ $# < 2 && $1 != "-h" && $1 != "--help" ]] || { echo "Usage: `basename $0` [branch]" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +ORG=${INFO[0]} +FORK=${INFO[1]} +REPO=${INFO[2]} +TARG=${INFO[3]} +BRANCH=${INFO[4]} +CURR=${INFO[5]} + +if [[ $ORG != "MarlinFirmware" || $REPO != "MarlinDocumentation" ]]; then + echo "Wrong repository." + exit +fi + +if [[ $BRANCH == "gh-pages" ]]; then + echo "Can't build from 'gh-pages.' Only the Jekyll branches (based on 'master')." + exit +fi + +# Check out the named branch (or stay in current) + +if [[ $BRANCH != $CURR ]]; then + echo "Stashing any changes to files..." + [[ $(git stash) != "No local "* ]] && HAS_STASH=1 + git checkout $BRANCH +fi + +COMMIT=$( git log --format="%H" -n 1 ) + +# Clean out changes and other junk in the branch +git clean -d -f + +opensite() { + URL="$1" + OPEN=$(echo $(which gnome-open xdg-open open) | awk '{ print $1 }') + if [ -z "$OPEN" ]; then + echo "Can't find a tool to open the URL:" + echo $URL + else + echo "Opening the site in the browser..." + "$OPEN" "$URL" + fi +} + +# Push 'master' to the fork and make a proper PR... +if [[ $BRANCH == $TARG ]]; then + + # Don't lose upstream changes! + git fetch upstream + + # Rebase onto latest master + if git rebase upstream/$TARG; then + + # Allow working directly with the main fork + echo + echo -n "Pushing to origin/$TARG... " + git push origin HEAD:$TARG + + echo + echo -n "Pushing to upstream/$TARG... " + git push upstream HEAD:$TARG + + else + + echo "Merge conflicts? Stopping here." + exit + + fi + +else + + if [ -z "$(git branch -vv | grep ^\* | grep \\\[origin)" ]; then + firstpush + else + echo + echo -n "Pushing to origin/$BRANCH... " + git push -f origin + fi + + opensite "https://github.com/$ORG/$REPO/compare/$TARG...$FORK:$BRANCH?expand=1" + +fi + +# Uncomment to compress the final html files +# mv ./_plugins/jekyll-press.rb-disabled ./_plugins/jekyll-press.rb +# bundle install + +echo +echo "Generating MarlinDocumentation..." + +rm -rf build + +# build the site statically and proof it +bundle exec jekyll build --profile --trace --no-watch +bundle exec htmlproofer ./build --only-4xx --allow-hash-href --check-favicon --check-html --url-swap ".*marlinfw.org/:/" + +# Sync the built site into a temporary folder +TMPFOLDER=$( mktemp -d ) +rsync -av build/ ${TMPFOLDER}/ + +# Clean out changes and other junk in the branch +git reset --hard +git clean -d -f + +# Copy built-site into the gh-pages branch +git checkout gh-pages || { echo "Something went wrong!"; exit 1; } +rsync -av ${TMPFOLDER}/ ./ + +# Commit and push the new live site directly +git add --all +git commit --message "Built from ${COMMIT}" +git push -f origin +git push -f upstream | { + while IFS= read -r line + do + [[ $line =~ "gh-pages -> gh-pages" ]] && opensite "https://marlinfw.org/" + echo "$line" + done +} + +# remove the temporary folder +rm -rf ${TMPFOLDER} + +# Go back to the branch we started from +git checkout $CURR && [[ $HAS_STASH == 1 ]] && git stash pop diff --git a/buildroot/share/git/mfqp b/buildroot/share/git/mfqp new file mode 100644 index 00000000..5650d082 --- /dev/null +++ b/buildroot/share/git/mfqp @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# +# mfqp [1|2|3] +# +# - git add . +# - git commit --amend +# - ghpc +# + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +REPO=${INFO[2]} +TARG=${INFO[3]} +CURR=${INFO[5]} + +IND=6 +while [ $IND -lt ${#INFO[@]} ]; do + ARG=${INFO[$IND]} + case "$ARG" in + -h|--help ) USAGE=1 ;; + * ) USAGE=1 ; echo "unknown option: $ARG" ;; + esac + let IND+=1 +done + +[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } + +[[ $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } + +git add . && git commit --amend && git push -f diff --git a/buildroot/share/git/mfrb b/buildroot/share/git/mfrb new file mode 100644 index 00000000..071b0b3d --- /dev/null +++ b/buildroot/share/git/mfrb @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# +# mfrb +# +# Do "git rebase -i" against the "target" branch (bugfix-1.1.x, bugfix-2.0.x, dev-2.1.x, or master) +# + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +TARG=${INFO[3]} +CURR=${INFO[5]} + +IND=6 +while [ $IND -lt ${#INFO[@]} ]; do + ARG=${INFO[$IND]} + case "$ARG" in + -q|--quick ) QUICK=1 ;; + -h|--help ) USAGE=1 ;; + * ) USAGE=1 ; echo "unknown option: $ARG" ;; + esac + let IND+=1 +done + +[[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } + +[[ $QUICK ]] || git fetch upstream +git rebase upstream/$TARG && git rebase -i upstream/$TARG diff --git a/buildroot/share/git/mftest b/buildroot/share/git/mftest new file mode 100644 index 00000000..cfb5dd05 --- /dev/null +++ b/buildroot/share/git/mftest @@ -0,0 +1,236 @@ +#!/usr/bin/env bash +# +# mftest Select a test to apply and build +# mftest -b [#] Build the auto-detected environment +# mftest -u [#] Upload the auto-detected environment +# mftest [name] [index] [-y] Set config options and optionally build a test +# + +MFINFO=$(mfinfo) || exit 1 +[[ -d Marlin/src ]] || { echo "Please 'cd' up to repo root." ; exit 1 ; } + +TESTPATH=buildroot/tests + +STATE_FILE=$( echo ./.pio/.mftestrc ) +SED=$(which gsed || which sed) + +shopt -s extglob nocasematch + +# Matching patterns +ISNUM='^[0-9]+$' +ISCMD='^(restore|opt|exec|use|pins|env)_' +ISEXEC='^exec_' +ISCONT='\\ *$' + +# Get the environment and test number from the command +TESTENV=${1:-'-'} +CHOICE=${2:-0} +AUTOENV=0 + +# Allow shorthand for test name +case $TESTENV in + tree) pio run -d . -e include_tree ; exit 1 ;; + due) TESTENV='DUE' ;; + esp) TESTENV='esp32' ;; + lin*) TESTENV='linux_native' ;; + lpc?(8)) TESTENV='LPC1768' ;; + lpc9) TESTENV='LPC1769' ;; + m128) TESTENV='mega1280' ;; + m256) TESTENV='mega2560' ;; + mega) TESTENV='mega2560' ;; + stm) TESTENV='STM32F103RE' ;; + f1) TESTENV='STM32F103RE' ;; + f4) TESTENV='STM32F4' ;; + f7) TESTENV='STM32F7' ;; + s6) TESTENV='FYSETC_S6' ;; + teensy) TESTENV='teensy31' ;; + t31) TESTENV='teensy31' ;; + t32) TESTENV='teensy31' ;; + t35) TESTENV='teensy35' ;; + t36) TESTENV='teensy35' ;; + t40) TESTENV='teensy41' ;; + t41) TESTENV='teensy41' ;; + +-h|--help) echo -e "$(basename $0) : Marlin Firmware test, build, and upload\n" + echo "Usage: $(basename $0) ................. Select env and test to apply / run" + echo " $(basename $0) [-y] env ........ Select a test for env to apply / run" + echo " $(basename $0) [-y] env test ... Apply / run the specified env test" + echo " $(basename $0) -b [variant] .... Auto-build the specified variant" + echo " $(basename $0) -u [variant] .... Auto-build and upload the specified variant" + echo + echo "env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41" + exit + ;; + + # Build with the last-built env + -r) [[ -f "$STATE_FILE" ]] || { echo "No previous (-r) build state found." ; exit 1 ; } + read TESTENV <"$STATE_FILE" + pio run -d . -e $TESTENV + exit + ;; + + -[bu]) MB=$( grep -E "^\s*#define MOTHERBOARD" Marlin/Configuration.h | awk '{ print $3 }' | $SED 's/BOARD_//' ) + [[ -z $MB ]] && { echo "Error - Can't read MOTHERBOARD setting." ; exit 1 ; } + BLINE=$( grep -E "define\s+BOARD_$MB\b" Marlin/src/core/boards.h ) + BNUM=$( $SED -E 's/^.+BOARD_[^ ]+ +([0-9]+).+$/\1/' <<<"$BLINE" ) + BDESC=$( $SED -E 's/^.+\/\/ *(.+)$/\1/' <<<"$BLINE" ) + [[ -z $BNUM ]] && { echo "Error - Can't find $MB in boards list." ; exit 1 ; } + readarray -t ENVS <<< $( grep -EA1 "MB\(.*\b$MB\b.*\)" Marlin/src/pins/pins.h | grep -E '#include.+//.+env:.+' | grep -oE 'env:[^ ]+' | $SED -E 's/env://' ) + [[ -z $ENVS ]] && { echo "Error - Can't find target(s) for $MB ($BNUM)." ; exit 1 ; } + ECOUNT=${#ENVS[*]} + + if [[ $ECOUNT == 1 ]]; then + TARGET=$ENVS + else + if [[ $CHOICE == 0 ]]; then + # + # List env names and numbers. Get selection. + # + echo "Available targets for \"$BDESC\" | $MB ($BNUM):" + + IND=0 ; for ENV in "${ENVS[@]}"; do let IND++ ; echo " $IND) $ENV" ; done + + if [[ $ECOUNT > 1 ]]; then + for (( ; ; )) + do + read -p "Select a target for '$MB' (1-$ECOUNT) : " CHOICE + [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } + [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= ECOUNT)) && break + echo ">>> Invalid environment choice '$CHOICE'." + done + echo + fi + else + echo "Detected \"$BDESC\" | $MB ($BNUM)." + [[ $CHOICE > $ECOUNT ]] && { echo "Environment selection out of range." ; exit 1 ; } + fi + TARGET="${ENVS[$CHOICE-1]}" + echo "Selected $TARGET" + fi + + echo "$TARGET" >"$STATE_FILE" + + if [[ $TESTENV == "-u" ]]; then + echo "Build/Uploading environment $TARGET for board $MB ($BNUM)..." ; echo + pio run -t upload -e $TARGET + else + echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo + pio run -e $TARGET + fi + exit + ;; + + # The -y flag may come first + -y) TESTENV=${2:-'-'} ; CHOICE=${3:-0} ;; + + -[a-z]) echo "Unknown flag $TESTENV" ; exit 1 ;; + -) ;; +esac + +# +# List available tests and ask for selection +# + +if [[ $TESTENV == '-' ]]; then + IND=0 + NAMES=() + for FILE in $( ls -1 $TESTPATH/*-tests ) + do + let IND++ + TNAME=${FILE/-tests/} + TNAME=${TNAME/$TESTPATH\//} + NAMES+=($TNAME) + (( IND < 10 )) && echo -n " " + echo " $IND) $TNAME" + done + + echo + for (( ; ; )) + do + read -p "Select a test to apply (1-$IND) : " NAMEIND + [[ -z "$NAMEIND" ]] && { echo '(canceled)' ; exit 1 ; } + [[ $NAMEIND =~ $ISNUM ]] && ((NAMEIND >= 1 && NAMEIND <= IND)) && { TESTENV=${NAMES[$NAMEIND-1]} ; echo ; break ; } + echo "Invalid selection." + done +fi + +# Get the contents of the test file +OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { echo "Can't find test '$TESTENV'." ; exit 1 ; } + +# Count up the number of tests +TESTCOUNT=$( awk "/$ISEXEC/{a++}END{print a}" <<<"$OUT" ) + +# User entered a number? +(( CHOICE && CHOICE > TESTCOUNT )) && { echo "Invalid test selection '$CHOICE' (1-$TESTCOUNT)." ; exit 1 ; } + +if [[ $CHOICE == 0 ]]; then + # + # List test descriptions with numbers and get selection + # + echo "Available '$TESTENV' tests:" ; echo "$OUT" | { + IND=0 + while IFS= read -r LINE + do + if [[ $LINE =~ $ISEXEC ]]; then + DESC=$( "$SED" -E 's/^.+"(.*)".*$/\1/g' <<<"$LINE" ) + (( ++IND < 10 )) && echo -n " " + echo " $IND) $DESC" + fi + done + } + CHOICE=1 + if [[ $TESTCOUNT > 1 ]]; then + for (( ; ; )) + do + read -p "Select a '$TESTENV' test (1-$TESTCOUNT) : " CHOICE + [[ -z "$CHOICE" ]] && { echo '(canceled)' ; exit 1 ; } + [[ $CHOICE =~ $ISNUM ]] && ((CHOICE >= 1 && CHOICE <= TESTCOUNT)) && break + echo ">>> Invalid test selection '$CHOICE'." + done + fi +fi + +# +# Run the specified test lines +# +echo "$OUT" | { + IND=0 + GOTX=0 + CMD="" + while IFS= read -r LINE + do + if [[ $LINE =~ $ISCMD || $GOTX == 1 ]]; then + ((!IND)) && let IND++ + if [[ $LINE =~ $ISEXEC ]]; then + ((IND++ > CHOICE)) && break + else + ((!HEADER)) && { + HEADER=1 + echo -e "\n#\n# Test $TESTENV ($CHOICE) $DESC\n#" + } + ((IND == CHOICE)) && { + GOTX=1 + [[ $CMD == "" ]] && CMD="$LINE" || CMD=$( echo -e "$CMD$LINE" | $SED -e 's/\\//g' ) + [[ $LINE =~ $ISCONT ]] || { echo $CMD ; eval "$CMD" ; CMD="" ; } + } + fi + fi + done +} + +# Make clear it's a TEST +opt_set CUSTOM_MACHINE_NAME "\"$TESTENV-tests ($CHOICE)\"" + +# Get a -y parameter the lazy way +[[ "$2" == "-y" || "$3" == "-y" ]] && BUILD_YES='Y' + +# Build the test too? +if [[ $BUILD_YES != 'Y' ]]; then + echo + read -p "Build $TESTENV test #$CHOICE (y/N) ? " BUILD_YES +fi + +[[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { + pio run -d . -e $TESTENV + echo "$TESTENV" >"$STATE_FILE" +} diff --git a/buildroot/share/git/mfup b/buildroot/share/git/mfup new file mode 100644 index 00000000..691259e2 --- /dev/null +++ b/buildroot/share/git/mfup @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# +# mfup +# +# - Fetch latest upstream and replace the PR Target branch with +# - Rebase the (current or specified) branch on the PR Target +# - Force-push the branch to 'origin' +# + +[[ $# < 3 && $1 != "-h" && $1 != "--help" ]] || { echo "usage: `basename $0` [1|2] [branch]" 1>&2 ; exit 1; } + +MFINFO=$(mfinfo "$@") || exit 1 +IFS=' ' read -a INFO <<< "$MFINFO" +ORG=${INFO[0]} +FORK=${INFO[1]} +REPO=${INFO[2]} +TARG=${INFO[3]} +BRANCH=${INFO[4]} +CURR=${INFO[5]} + +set -e + +# Prevent accidental loss of current changes +[[ $(git stash) != "No local "* ]] && HAS_STASH=1 + +echo "Fetching upstream ($ORG/$REPO)..." +git fetch upstream + +if [[ $BRANCH != $TARG ]]; then + echo ; echo "Rebasing $BRANCH on $TARG..." + if [[ $BRANCH == $CURR ]] || git checkout $BRANCH; then + if git rebase upstream/$TARG; then + git push -f + else + echo "Looks like merge conflicts. Stopping here." + exit + fi + else + echo "No such branch!" + fi +else + git reset --hard upstream/$TARG +fi + +echo +[[ $BRANCH != $CURR ]] && git checkout $CURR + +[[ $HAS_STASH == 1 ]] && git stash pop diff --git a/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino b/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino new file mode 100644 index 00000000..6dcfb67c --- /dev/null +++ b/buildroot/share/pin_interrupt_test/pin_interrupt_test.ino @@ -0,0 +1,32 @@ +// Search pins usable for endstop-interrupts +// Compile with the same build settings you'd use for Marlin. + +#if defined(ARDUINO_AVR_MEGA2560) || defined(ARDUINO_AVR_MEGA) + #undef digitalPinToPCICR + #define digitalPinToPCICR(p) ( ((p) >= 10 && (p) <= 15) || \ + ((p) >= 50 && (p) <= 53) || \ + ((p) >= 62 && (p) <= 69) ? (&PCICR) : nullptr) +#endif + +void setup() { + Serial.begin(9600); + Serial.println("PINs causing interrupts are:"); + for (int i = 2; i < NUM_DIGITAL_PINS; i++) { + if (digitalPinToPCICR(i) || (int)digitalPinToInterrupt(i) != -1) { + for (int j = 0; j < NUM_ANALOG_INPUTS; j++) { + if (analogInputToDigitalPin(j) == i) { + Serial.print('A'); + Serial.print(j); + Serial.print(" = "); + } + } + Serial.print('D'); + Serial.println(i); + } + } + Serial.println("Arduino pin numbering!"); +} + +void loop() { + // put your main code here, to run repeatedly: +} diff --git a/buildroot/share/pixmaps/MarlinIcons.psd b/buildroot/share/pixmaps/MarlinIcons.psd new file mode 100644 index 00000000..4575236d Binary files /dev/null and b/buildroot/share/pixmaps/MarlinIcons.psd differ diff --git a/buildroot/share/pixmaps/logo/marlin-1080.png b/buildroot/share/pixmaps/logo/marlin-1080.png new file mode 100644 index 00000000..b21d0ca8 Binary files /dev/null and b/buildroot/share/pixmaps/logo/marlin-1080.png differ diff --git a/buildroot/share/pixmaps/logo/marlin-250.png b/buildroot/share/pixmaps/logo/marlin-250.png new file mode 100644 index 00000000..90576d87 Binary files /dev/null and b/buildroot/share/pixmaps/logo/marlin-250.png differ diff --git a/buildroot/share/pixmaps/logo/marlin-old-250.png b/buildroot/share/pixmaps/logo/marlin-old-250.png new file mode 100644 index 00000000..64f9902f Binary files /dev/null and b/buildroot/share/pixmaps/logo/marlin-old-250.png differ diff --git a/buildroot/share/pixmaps/logo/marlin-old-627.png b/buildroot/share/pixmaps/logo/marlin-old-627.png new file mode 100644 index 00000000..2f486319 Binary files /dev/null and b/buildroot/share/pixmaps/logo/marlin-old-627.png differ diff --git a/buildroot/share/pixmaps/logo/marlin-old.svg b/buildroot/share/pixmaps/logo/marlin-old.svg new file mode 100644 index 00000000..d621d3ab --- /dev/null +++ b/buildroot/share/pixmaps/logo/marlin-old.svg @@ -0,0 +1,106 @@ + + + + + Marlin Firmware + + + + + + image/svg+xml + + Marlin Firmware + + + Ahmet Cem TURAN + + + + + MarlinFirmware + + + + + João Brázio + + + marlin-logo-old + + + + + + + + + + + + + + diff --git a/buildroot/share/pixmaps/logo/marlin.svg b/buildroot/share/pixmaps/logo/marlin.svg new file mode 100644 index 00000000..e608a7ee --- /dev/null +++ b/buildroot/share/pixmaps/logo/marlin.svg @@ -0,0 +1,131 @@ + + + +Marlin Firmware image/svg+xmlMarlin Firmware Ahmet Cem TURANJoão BrázioMarlinFirmwaremarlin-logo-new \ No newline at end of file diff --git a/buildroot/share/scripts/MarlinMesh.scad b/buildroot/share/scripts/MarlinMesh.scad new file mode 100644 index 00000000..6d78bb96 --- /dev/null +++ b/buildroot/share/scripts/MarlinMesh.scad @@ -0,0 +1,304 @@ + /**************************************\ + * * + * OpenSCAD Mesh Display * + * by Thinkyhead - April 2017 * + * * + * Copy the grid output from Marlin, * + * paste below as shown, and use * + * OpenSCAD to see a visualization * + * of your mesh. * + * * + \**************************************/ + +$t = 0.15; // comment out during animation! +X = 0; Y = 1; +L = 0; R = 1; F = 2; B = 3; + +// +// Sample Mesh - Replace with your own +// +measured_z = [ + [ -1.20, -1.13, -1.09, -1.03, -1.19 ], + [ -1.16, -1.25, -1.27, -1.25, -1.08 ], + [ -1.13, -1.26, -1.39, -1.31, -1.18 ], + [ -1.09, -1.20, -1.26, -1.21, -1.18 ], + [ -1.13, -0.99, -1.03, -1.06, -1.32 ] +]; + +// +// An offset to add to all points in the mesh +// +zadjust = 0; + +// +// Mesh characteristics +// +bed_size = [ 200, 200 ]; + +mesh_inset = [ 10, 10, 10, 10 ]; // L, F, R, B + +mesh_bounds = [ + [ mesh_inset[L], mesh_inset[F] ], + [ bed_size[X] - mesh_inset[R], bed_size[Y] - mesh_inset[B] ] +]; + +mesh_size = mesh_bounds[1] - mesh_bounds[0]; + + // NOTE: Marlin meshes already subtract the probe offset +NAN = 0; // Z to use for un-measured points + +// +// Geometry +// + +max_z_scale = 100; // Scale at Time 0.5 +min_z_scale = 10; // Scale at Time 0.0 and 1.0 +thickness = 0.5; // thickness of the mesh triangles +tesselation = 1; // levels of tesselation from 0-2 +alternation = 2; // direction change modulus (try it) + +// +// Appearance +// + +show_plane = true; +show_labels = true; +show_coords = true; +arrow_length = 5; + +label_font_lg = "Arial"; +label_font_sm = "Arial"; +mesh_color = [1,1,1,0.5]; +plane_color = [0.4,0.6,0.9,0.6]; + +//================================================ Derive useful values + +big_z = max_2D(measured_z,0); +lil_z = min_2D(measured_z,0); + +mean_value = (big_z + lil_z) / 2.0; + +mesh_points_y = len(measured_z); +mesh_points_x = len(measured_z[0]); + +xspace = mesh_size[X] / (mesh_points_x - 1); +yspace = mesh_size[Y] / (mesh_points_y - 1); + +// At $t=0 and $t=1 scale will be 100% +z_scale_factor = min_z_scale + (($t > 0.5) ? 1.0 - $t : $t) * (max_z_scale - min_z_scale) * 2; + +// +// Min and max recursive functions for 1D and 2D arrays +// Return the smallest or largest value in the array +// +function some_1D(b,i) = (i//" +# ... or similar path leading to this file. +# +# Warning: The program modifies files in place, so be sure to back them up first if needed. +# Can be run multiple times if needed. Only modifies files which don't have +# correct #define CONFIG_EXAMPLES_DIR line. +# +# Invocation: +#------------- +# 1. Change directory to your MarlinFirmware/Configurations working copy +# 2. python3 config-labels.py +# +#----------------------------------- +# 2020-05-10 GMW original +# 2020-06-05 SRL style tweaks +#----------------------------------- +# +import sys +import os +from pathlib import Path +from distutils.dir_util import copy_tree # for copy_tree, because shutil.copytree can't handle existing files, dirs + +# Modify input_examples_dir and output_examples_dir for your installation +# No trailing slash +# Setting output_examples_dir = input_examples_dir causes the program to insert into the existing files. + +input_examples_dir = r'config/examples' +# output_examples_dir = input_examples_dir +output_examples_dir = r'config/examples' + +#------------------------------------- + +files_to_mod = ['Configuration.h', 'Configuration_adv.h', '_Bootscreen.h', '_Statusscreen.h'] + +macro_name = 'CONFIG_EXAMPLES_DIR' +def_macro_name = '#define ' + macro_name + +filenum = 0 +different_out_dir = not (output_examples_dir == input_examples_dir) + +#---------------------------------------------- +def process_file(subdir: str, filename: str): +#---------------------------------------------- + global filenum + filenum += 1 + + print(str(filenum) + ' ' + filename + ': ' + subdir) + + def_line = (def_macro_name + ' "' + subdir.replace('\\', '/') + '"') + + #------------------------ + # Read file + #------------------------ + lines = [] + infilepath = os.path.join(input_examples_dir, subdir, filename) + try: + # UTF-8 because some files contain unicode chars + with open(infilepath, 'rt', encoding="utf-8") as infile: + lines = infile.readlines() + + except Exception as e: + print('Failed to read file: ' + str(e) ) + raise Exception + + lines = [line.rstrip('\r\n') for line in lines] + + #------------------------ + # Process lines + #------------------------ + file_modified = False + + # region state machine + # -1 = before pragma once; + # 0 = region to place define; + # 1 = past region to place define + region = -1 + + outlines = [] + for line in lines: + outline = line + + if (region == -1) and (def_macro_name in line): + outline = None + file_modified = True + + elif (region == -1) and ('pragma once' in line): + region = 0 + + elif (region == 0): + if (line.strip() == ''): + pass + elif (def_macro_name in line): + region = 1 + if line == def_line: # leave it as is + pass + else: + outline = def_line + file_modified = True + else: # some other string + outlines.append(def_line) + outlines.append('') + region = 1 + file_modified = True + + elif (region == 1): + if (def_macro_name in line): + outline = None + file_modified = True + else: + pass + + # end if + if outline is not None: + outlines.append(outline) + # end for + + #------------------------- + # Output file + #------------------------- + outdir = os.path.join(output_examples_dir, subdir) + outfilepath = os.path.join(outdir, filename) + + if file_modified: + # Note: no need to create output dirs, as the initial copy_tree + # will do that. + + print(' writing ' + str(outfilepath)) + try: + # Preserve unicode chars; Avoid CR-LF on Windows. + with open(outfilepath, "w", encoding="utf-8", newline='\n') as outfile: + outfile.write("\n".join(outlines)) + outfile.write("\n") + + except Exception as e: + print('Failed to write file: ' + str(e) ) + raise Exception + else: + print(' no change for ' + str(outfilepath)) + +#---------- +def main(): +#---------- + global filenum + global input_examples_dir + global output_examples_dir + filenum = 0 + + #-------------------------------- + # Check for requirements + #-------------------------------- + input_examples_dir = input_examples_dir.strip() + input_examples_dir = input_examples_dir.rstrip('\\/') + output_examples_dir = output_examples_dir.strip() + output_examples_dir = output_examples_dir.rstrip('\\/') + + for dir in [input_examples_dir, output_examples_dir]: + if not (os.path.exists(dir)): + print('Directory not found: ' + dir) + sys.exit(1) + + #-------------------------------- + # Copy tree if necessary. + #-------------------------------- + # This includes files that are not otherwise included in the + # insertion of the define statement. + # + if different_out_dir: + print('Copying files to new directory: ' + output_examples_dir) + try: + copy_tree(input_examples_dir, output_examples_dir) + except Exception as e: + print('Failed to copy directory: ' + str(e) ) + raise Exception + + #----------------------------- + # Find and process files + #----------------------------- + len_input_examples_dir = len(input_examples_dir); + len_input_examples_dir += 1 + + for filename in files_to_mod: + input_path = Path(input_examples_dir) + filepathlist = input_path.rglob(filename) + + for filepath in filepathlist: + fulldirpath = str(filepath.parent) + subdir = fulldirpath[len_input_examples_dir:] + + process_file(subdir, filename) + +#============== +print('--- Starting config-labels ---') +main() +print('--- Done ---') diff --git a/buildroot/share/scripts/createSpeedLookupTable.py b/buildroot/share/scripts/createSpeedLookupTable.py new file mode 100644 index 00000000..da24c7c8 --- /dev/null +++ b/buildroot/share/scripts/createSpeedLookupTable.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +from __future__ import print_function +from __future__ import division + +""" Generate the stepper delay lookup table for Marlin firmware. """ + +import argparse + +__author__ = "Ben Gamari " +__copyright__ = "Copyright 2012, Ben Gamari" +__license__ = "GPL" + +parser = argparse.ArgumentParser(description=__doc__) +parser.add_argument('-f', '--cpu-freq', type=int, default=16, help='CPU clockrate in MHz (default=16)') +parser.add_argument('-d', '--divider', type=int, default=8, help='Timer/counter pre-scale divider (default=8)') +args = parser.parse_args() + +cpu_freq = args.cpu_freq * 1000000 +timer_freq = cpu_freq / args.divider + +print("#ifndef SPEED_LOOKUPTABLE_H") +print("#define SPEED_LOOKUPTABLE_H") +print() +print('#include "MarlinCore.h"') +print() + +print("const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {") +a = [ timer_freq / ((i*256)+(args.cpu_freq*2)) for i in range(256) ] +b = [ a[i] - a[i+1] for i in range(255) ] +b.append(b[-1]) +for i in range(32): + print(" ", end=' ') + for j in range(8): + print("{%d, %d}," % (a[8*i+j], b[8*i+j]), end=' ') + print() +print("};") +print() + +print("const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {") +a = [ timer_freq / ((i*8)+(args.cpu_freq*2)) for i in range(256) ] +b = [ a[i] - a[i+1] for i in range(255) ] +b.append(b[-1]) +for i in range(32): + print(" ", end=' ') + for j in range(8): + print("{%d, %d}," % (a[8*i+j], b[8*i+j]), end=' ') + print() +print("};") +print() + +print("#endif") + diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py new file mode 100644 index 00000000..b2d8964f --- /dev/null +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python +"""Thermistor Value Lookup Table Generator + +Generates lookup to temperature values for use in a microcontroller in C format based on: +https://en.wikipedia.org/wiki/Steinhart-Hart_equation + +The main use is for Arduino programs that read data from the circuit board described here: +https://reprap.org/wiki/Temperature_Sensor_v2.0 + +Usage: python createTemperatureLookupMarlin.py [options] + +Options: + -h, --help show this help + --rp=... pull-up resistor + --t1=ttt:rrr low temperature temperature:resistance point (around 25 degC) + --t2=ttt:rrr middle temperature temperature:resistance point (around 150 degC) + --t3=ttt:rrr high temperature temperature:resistance point (around 250 degC) + --num-temps=... the number of temperature points to calculate (default: 36) +""" + +from __future__ import print_function +from __future__ import division + +from math import * +import sys +import getopt + +"Constants" +ZERO = 273.15 # zero point of Kelvin scale +VADC = 5 # ADC voltage +VCC = 5 # supply voltage +ARES = pow(2,10) # 10 Bit ADC resolution +VSTEP = VADC / ARES # ADC voltage resolution +TMIN = 0 # lowest temperature in table +TMAX = 350 # highest temperature in table + +class Thermistor: + "Class to do the thermistor maths" + def __init__(self, rp, t1, r1, t2, r2, t3, r3): + l1 = log(r1) + l2 = log(r2) + l3 = log(r3) + y1 = 1.0 / (t1 + ZERO) # adjust scale + y2 = 1.0 / (t2 + ZERO) + y3 = 1.0 / (t3 + ZERO) + x = (y2 - y1) / (l2 - l1) + y = (y3 - y1) / (l3 - l1) + c = (y - x) / ((l3 - l2) * (l1 + l2 + l3)) + b = x - c * (l1**2 + l2**2 + l1*l2) + a = y1 - (b + l1**2 *c)*l1 + + if c < 0: + print("//////////////////////////////////////////////////////////////////////////////////////") + print("// WARNING: negative coefficient 'c'! Something may be wrong with the measurements! //") + print("//////////////////////////////////////////////////////////////////////////////////////") + c = -c + self.c1 = a # Steinhart-Hart coefficients + self.c2 = b + self.c3 = c + self.rp = rp # pull-up resistance + + def resol(self, adc): + "Convert ADC reading into a resolution" + res = self.temp(adc)-self.temp(adc+1) + return res + + def voltage(self, adc): + "Convert ADC reading into a Voltage" + return adc * VSTEP # convert the 10 bit ADC value to a voltage + + def resist(self, adc): + "Convert ADC reading into a resistance in Ohms" + r = self.rp * self.voltage(adc) / (VCC - self.voltage(adc)) # resistance of thermistor + return r + + def temp(self, adc): + "Convert ADC reading into a temperature in Celcius" + l = log(self.resist(adc)) + Tinv = self.c1 + self.c2*l + self.c3* l**3 # inverse temperature + return (1/Tinv) - ZERO # temperature + + def adc(self, temp): + "Convert temperature into a ADC reading" + x = (self.c1 - (1.0 / (temp+ZERO))) / (2*self.c3) + y = sqrt((self.c2 / (3*self.c3))**3 + x**2) + r = exp((y-x)**(1.0/3) - (y+x)**(1.0/3)) + return (r / (self.rp + r)) * ARES + +def main(argv): + "Default values" + t1 = 25 # low temperature in Kelvin (25 degC) + r1 = 100000 # resistance at low temperature (10 kOhm) + t2 = 150 # middle temperature in Kelvin (150 degC) + r2 = 1641.9 # resistance at middle temperature (1.6 KOhm) + t3 = 250 # high temperature in Kelvin (250 degC) + r3 = 226.15 # resistance at high temperature (226.15 Ohm) + rp = 4700; # pull-up resistor (4.7 kOhm) + num_temps = 36; # number of entries for look-up table + + try: + opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="]) + except getopt.GetoptError as err: + print(str(err)) + usage() + sys.exit(2) + + for opt, arg in opts: + if opt in ("-h", "--help"): + usage() + sys.exit() + elif opt == "--rp": + rp = int(arg) + elif opt == "--t1": + arg = arg.split(':') + t1 = float(arg[0]) + r1 = float(arg[1]) + elif opt == "--t2": + arg = arg.split(':') + t2 = float(arg[0]) + r2 = float(arg[1]) + elif opt == "--t3": + arg = arg.split(':') + t3 = float(arg[0]) + r3 = float(arg[1]) + elif opt == "--num-temps": + num_temps = int(arg) + + t = Thermistor(rp, t1, r1, t2, r2, t3, r3) + increment = int((ARES-1)/(num_temps-1)); + step = (TMIN-TMAX) / (num_temps-1) + low_bound = t.temp(ARES-1); + up_bound = t.temp(1); + min_temp = int(TMIN if TMIN > low_bound else low_bound) + max_temp = int(TMAX if TMAX < up_bound else up_bound) + temps = list(range(max_temp, TMIN+step, step)); + + print("// Thermistor lookup table for Marlin") + print("// ./createTemperatureLookupMarlin.py --rp=%s --t1=%s:%s --t2=%s:%s --t3=%s:%s --num-temps=%s" % (rp, t1, r1, t2, r2, t3, r3, num_temps)) + print("// Steinhart-Hart Coefficients: a=%.15g, b=%.15g, c=%.15g " % (t.c1, t.c2, t.c3)) + print("// Theoretical limits of thermistor: %.2f to %.2f degC" % (low_bound, up_bound)) + print() + print("const short temptable[][2] PROGMEM = {") + + for temp in temps: + adc = t.adc(temp) + print(" { OV(%7.2f), %4s }%s // v=%.3f\tr=%.3f\tres=%.3f degC/count" % (adc , temp, \ + ',' if temp != temps[-1] else ' ', \ + t.voltage(adc), \ + t.resist( adc), \ + t.resol( adc) \ + )) + print("};") + +def usage(): + print(__doc__) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh new file mode 100644 index 00000000..0cf77366 --- /dev/null +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# +# findMissingTranslations.sh +# +# Locate all language strings needing an update based on English +# +# Usage: findMissingTranslations.sh [language codes] +# +# If no language codes are specified then all languages will be checked +# + +LANGHOME="Marlin/src/lcd/language" + +[ -d $LANGHOME ] && cd $LANGHOME + +FILES=$(ls language_*.h | grep -v -E "(_en|_test)\.h" | sed -E 's/language_([^\.]+)\.h/\1/') +declare -A STRING_MAP + +# Get files matching the given arguments +TEST_LANGS=$FILES +if [[ -n $@ ]]; then + TEST_LANGS="" + for K in "$@"; do + for F in $FILES; do + [[ "$F" != "${F%$K*}" ]] && TEST_LANGS="$TEST_LANGS $F" + done + done +fi + +echo -n "Building list of missing strings..." + +for i in $(awk '/Language_Str/{print $3}' language_en.h); do + [[ $i == "MSG_CUBED" ]] && continue + LANG_LIST="" + for j in $TEST_LANGS; do + [[ $(grep -c " ${i} " language_${j}.h) -eq 0 ]] && LANG_LIST="$LANG_LIST $j" + done + [[ -z $LANG_LIST ]] && continue + STRING_MAP[$i]=$LANG_LIST +done + +echo + +for K in $( printf "%s\n" "${!STRING_MAP[@]}" | sort ); do + case "$#" in + 1 ) echo $K ;; + * ) printf "%-35s :%s\n" "$K" "${STRING_MAP[$K]}" ;; + esac +done diff --git a/buildroot/share/scripts/g29_auto.py b/buildroot/share/scripts/g29_auto.py new file mode 100644 index 00000000..ffcb0d9f --- /dev/null +++ b/buildroot/share/scripts/g29_auto.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python + +# This file is for preprocessing gcode and the new G29 Autobedleveling from Marlin +# It will analyse the first 2 Layer and return the maximum size for this part +# After this it will replace with g29_keyword = ';MarlinG29Script' with the new G29 LRFB +# the new file will be created in the same folder. + +from __future__ import print_function + +# your gcode-file/folder +folder = './' +my_file = 'test.gcode' + +# this is the minimum of G1 instructions which should be between 2 different heights +min_g1 = 3 + +# maximum number of lines to parse, I don't want to parse the complete file +# only the first plane is we are interested in +max_g1 = 100000000 + +# g29 keyword +g29_keyword = 'g29' +g29_keyword = g29_keyword.upper() + +# output filename +output_file = folder + 'g29_' + my_file +# input filename +input_file = folder + my_file + +# minimum scan size +min_size = 40 +probing_points = 3 # points x points + +# other stuff +min_x = 500 +min_y = min_x +max_x = -500 +max_y = max_x +last_z = 0.001 + +layer = 0 +lines_of_g1 = 0 + +gcode = [] + + +# return only g1-lines +def has_g1(line): + return line[:2].upper() == "G1" + + +# find position in g1 (x,y,z) +def find_axis(line, axis): + found = False + number = "" + for char in line: + if found: + if char == ".": + number += char + elif char == "-": + number += char + else: + try: + int(char) + number += char + except ValueError: + break + else: + found = char.upper() == axis.upper() + try: + return float(number) + except ValueError: + return None + + +# save the min or max-values for each axis +def set_mima(line): + global min_x, max_x, min_y, max_y, last_z + + current_x = find_axis(line, 'x') + current_y = find_axis(line, 'y') + + if current_x is not None: + min_x = min(current_x, min_x) + max_x = max(current_x, max_x) + if current_y is not None: + min_y = min(current_y, min_y) + max_y = max(current_y, max_y) + + return min_x, max_x, min_y, max_y + + +# find z in the code and return it +def find_z(gcode, start_at_line=0): + for i in range(start_at_line, len(gcode)): + my_z = find_axis(gcode[i], 'Z') + if my_z is not None: + return my_z, i + + +def z_parse(gcode, start_at_line=0, end_at_line=0): + i = start_at_line + all_z = [] + line_between_z = [] + z_at_line = [] + # last_z = 0 + last_i = -1 + + while len(gcode) > i: + try: + z, i = find_z(gcode, i + 1) + except TypeError: + break + + all_z.append(z) + z_at_line.append(i) + temp_line = i - last_i -1 + line_between_z.append(i - last_i - 1) + # last_z = z + last_i = i + if 0 < end_at_line <= i or temp_line >= min_g1: + # print('break at line {} at heigth {}'.format(i, z)) + break + + line_between_z = line_between_z[1:] + return all_z, line_between_z, z_at_line + + +# get the lines which should be the first layer +def get_lines(gcode, minimum): + i = 0 + all_z, line_between_z, z_at_line = z_parse(gcode, end_at_line=max_g1) + for count in line_between_z: + i += 1 + if count > minimum: + # print('layer: {}:{}'.format(z_at_line[i-1], z_at_line[i])) + return z_at_line[i - 1], z_at_line[i] + + +with open(input_file, 'r') as file: + lines = 0 + for line in file: + lines += 1 + if lines > 1000: + break + if has_g1(line): + gcode.append(line) +file.close() + +start, end = get_lines(gcode, min_g1) +for i in range(start, end): + set_mima(gcode[i]) + +print('x_min:{} x_max:{}\ny_min:{} y_max:{}'.format(min_x, max_x, min_y, max_y)) + +# resize min/max - values for minimum scan +if max_x - min_x < min_size: + offset_x = int((min_size - (max_x - min_x)) / 2 + 0.5) # int round up + # print('min_x! with {}'.format(int(max_x - min_x))) + min_x = int(min_x) - offset_x + max_x = int(max_x) + offset_x +if max_y - min_y < min_size: + offset_y = int((min_size - (max_y - min_y)) / 2 + 0.5) # int round up + # print('min_y! with {}'.format(int(max_y - min_y))) + min_y = int(min_y) - offset_y + max_y = int(max_y) + offset_y + + +new_command = 'G29 L{0} R{1} F{2} B{3} P{4}\n'.format(min_x, + max_x, + min_y, + max_y, + probing_points) + +out_file = open(output_file, 'w') +in_file = open(input_file, 'r') + +for line in in_file: + if line[:len(g29_keyword)].upper() == g29_keyword: + out_file.write(new_command) + print('write G29') + else: + out_file.write(line) + +file.close() +out_file.close() + +print('auto G29 finished') diff --git a/buildroot/share/scripts/pinsformat.js b/buildroot/share/scripts/pinsformat.js new file mode 100644 index 00000000..a82c2f26 --- /dev/null +++ b/buildroot/share/scripts/pinsformat.js @@ -0,0 +1,170 @@ +#!/usr/bin/env node + +// +// Formatter script for pins_MYPINS.h files +// +// Usage: mffmt [infile] [outfile] +// +// With no parameters convert STDIN to STDOUT +// + +const fs = require("fs"); + +// String lpad / rpad +String.prototype.lpad = function(len, chr) { + if (!len) return this; + if (chr === undefined) chr = ' '; + var s = this+'', need = len - s.length; + if (need > 0) s = new Array(need+1).join(chr) + s; + return s; +}; + +String.prototype.rpad = function(len, chr) { + if (!len) return this; + if (chr === undefined) chr = ' '; + var s = this+'', need = len - s.length; + if (need > 0) s += new Array(need+1).join(chr); + return s; +}; + +const mpatt = [ '-?\\d+', 'P[A-I]\\d+', 'P\\d_\\d+' ], + definePatt = new RegExp(`^\\s*(//)?#define\\s+[A-Z_][A-Z0-9_]+\\s+(${mpatt[0]}|${mpatt[1]}|${mpatt[2]})\\s*(//.*)?$`, 'gm'), + ppad = [ 3, 4, 5 ], + col_comment = 50, + col_value_rj = col_comment - 3; + +var mexpr = []; +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, do_log = false; +if (argc > 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 +const filtered = process_text(fs.readFileSync(src_file).toString()); +if (dst_file) + fs.writeFileSync(dst_file, filtered); +else + console.log(filtered); + +// Find the pin pattern so non-pin defines can be skipped +function get_pin_pattern(txt) { + var r, m = 0, match_count = [ 0, 0, 0 ]; + definePatt.lastIndex = 0; + while ((r = definePatt.exec(txt)) !== null) { + let ind = -1; + if (mexpr.some((p) => { + ind++; + const didmatch = r[2].match(p); + return r[2].match(p); + }) ) { + const m = ++match_count[ind]; + if (m >= 10) { + return { match: mpatt[ind], pad:ppad[ind] }; + } + } + } + return null; +} + +function process_text(txt) { + if (!txt.length) return '(no text)'; + const patt = get_pin_pattern(txt); + if (!patt) return txt; + const pindefPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(${patt.match})\\s*(//.*)?$`), + noPinPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(-1)\\s*(//.*)?$`), + skipPatt = new RegExp('^(\\s*(//)?#define)\\s+(AT90USB|USBCON|BOARD_.+|.+_MACHINE_NAME|.+_SERIAL)\\s+(.+)\\s*(//.*)?$'), + 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*(//.*)?$'), + 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; + var r, out = '', check_comment_next = false; + txt.split('\n').forEach((line) => { + if (check_comment_next) + check_comment_next = ((r = commPatt.exec(line)) !== null); + + if (check_comment_next) + // Comments in column 45 + line = ''.rpad(col_comment) + r[1]; + + else if ((r = pindefPatt.exec(line)) !== null) { + // + // #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; + if (r[5]) line = line.rpad(col_comment) + r[5]; + } + else if ((r = noPinPatt.exec(line)) !== null) { + // + // #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) { + // + // #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; + } + out += line + '\n'; + }); + return out.replace(/\n\n+/g, '\n\n').replace(/\n\n$/g, '\n'); +} diff --git a/buildroot/share/sublime/MarlinFirmware.sublime-project b/buildroot/share/sublime/MarlinFirmware.sublime-project new file mode 100644 index 00000000..9b5234f7 --- /dev/null +++ b/buildroot/share/sublime/MarlinFirmware.sublime-project @@ -0,0 +1,34 @@ +{ + "folders": + [ + { + "folder_exclude_patterns": + [ + ".pio*", + "MarlinFirmware/lib", + "Marlin/lib", + "datatmp", + ".vscode" + ], + "binary_file_patterns": + [ "*.psd", "*.png", "*.jpg", "*.jpeg", "*.bdf", "*.patch", "avrdude_5.*", "*.svg" ], + "file_exclude_patterns": + [ + "Marlin/platformio.ini", + "Marlin/.travis.yml", + "Marlin/.gitignore", + "Marlin/*/platformio.ini", + "Marlin/*/.travis.yml", + "Marlin/*/.gitignore" + ], + "path": "../../.." + } + ], + "settings": + { + "ensure_newline_at_eof_on_save": true, + "tab_size": 2, + "translate_tabs_to_spaces": true, + "trim_trailing_white_space_on_save": true + } +} diff --git a/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax b/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax new file mode 100644 index 00000000..d1571e3a --- /dev/null +++ b/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax @@ -0,0 +1,225 @@ +%YAML 1.2 +--- +# +# G-Code (RepRap, not ISO-6983) +# Author: @thinkyhead +# +# RapRap G-Code is very simple. +# +# TODO: Lines that start with N get a different context, accepting a checksum. +# +name: G-Code (RepRap) +file_extensions: + - [ g, gco, gcode ] +scope: source.gcode +variables: + decimal: '[+-]?\d+(\.\d*)?' + +contexts: + prototype: + - match: \s+ + + - include: mixin_comment + + - match: $ + pop: true + + main: + - meta_scope: line.gcode + + - match: '([Nn]\s*(\d+))' + captures: + 1: entity.nword.gcode + 2: constant.numeric.line-number.gcode + + - match: () + set: gcode_command + + # G, M, or T command + gcode_command: + - meta_content_scope: ctx.command.gcode + + # M20 S2 P/path/to/file/name.gco + - match: ([Mm](20))\s*((S)(2)\s*(P)) + captures: + 1: entity.command.gcode markup.bold.gcode + 2: constant.numeric.command.gcode + 3: ctx.params.gcode + 4: keyword.param.gcode + 5: constant.numeric.param.gcode + 6: keyword.param.gcode + set: gcode_string_arg + + # M117 or M118 - Commands taking a string + - match: ([Mm]\s*(11[78]))\b + captures: + 1: entity.command.gcode markup.bold.gcode + 2: constant.numeric.command.gcode + set: gcode_string_arg + + # Other commands, followed by data + - match: ([GMTgmt]\s*(\d+)((\.)(\d+))?) + captures: + 1: entity.command.gcode markup.bold.gcode + 2: constant.numeric.command.gcode + 4: entity.separator.subcode + 5: constant.numeric.subcode + set: gcode_params + + - match: () + set: syntax_error + + # Parameters of a command + gcode_params: + - meta_content_scope: ctx.params.gcode + + # M32 [S] [P] !/path/file.gco# + - match: \! + scope: punctuation.string.path.open.gcode + push: gcode_path_arg + + # asterisk starts a checksum + - match: \* + scope: punctuation.marker.checksum.gcode + set: gcode_checksum + + # parameter and single-quoted value + - match: ([A-Za-z])\s*(') + captures: + 1: keyword.param.gcode + 2: punctuation.quote.single.open.gcode + push: gcode_string_arg_quoted_single + + # parameter and double-quoted value + - match: ([A-Za-z])\s*(") + captures: + 1: keyword.param.gcode + 2: punctuation.quote.double.open.gcode + push: gcode_string_arg_quoted_double + + # parameter and list of values + - match: ([Ee])\s*(({{decimal}}\s*:\s*)+{{decimal}}) + captures: + 1: keyword.param.gcode + 2: constant.numeric.param.gcode + + # parameter and numeric value + - match: ([A-Za-z])\s*({{decimal}}) + captures: + 1: keyword.param.gcode + 2: constant.numeric.param.gcode + + # parameter with no value + - match: '[A-Za-z]' + scope: keyword.param.gcode + set: gcode_params + + - match: () + set: syntax_error + + gcode_string_arg_quoted_single: + - meta_content_scope: string.quoted.single.gcode + + - match: ([^'\\]+) + + - match: (\\) + scope: punctuation.string.escape.gcode + push: escape_char + + - match: (') + scope: punctuation.quote.single.close.gcode + pop: true + + - match: () + set: syntax_error + + gcode_string_arg_quoted_double: + - meta_content_scope: string.quoted.double.gcode + + - match: ([^"\\]+) + + - match: (\\) + scope: punctuation.string.escape.gcode + push: escape_char + + - match: (") + scope: punctuation.quote.double.close.gcode + pop: true + + - match: () + set: syntax_error + + gcode_string_arg: + - meta_content_scope: ctx.string.gcode + + - match: ([^;]+) + scope: string.unquoted.gcode + + escape_char: + - meta_scope: string.escape.gcode punctuation.string.escape.gcode + + - match: '.' + pop: true + + gcode_path_arg: + - meta_content_scope: string.unquoted.path.gcode + + - match: (#) + scope: punctuation.string.path.close.gcode + pop: true + + gcode_checksum: + - meta_content_scope: constant.numeric.checksum.gcode + - meta_include_prototype: false + + - match: \d+ + + - match: ( *)$ + pop: true + + - include: mixin_comment + + - match: () + set: syntax_error + + # Done interpreting to the end of the line + gcode_line_done: + - match: \s*$ + pop: true + + # Comments begin with a ';' and finish at the end of the line. + mixin_comment: + - match: ^\s*; + scope: punctuation.comment.line.start + set: gcode_comment + - match: \s*; + scope: punctuation.comment.eol.start + set: gcode_comment + - match: \s*\( + scope: punctuation.paren.comment.open + push: gcode_comment_paren + + # Comment to end of line. + gcode_comment: + - meta_content_scope: comment.gcode + - match: \s*$ + pop: true + + gcode_comment_paren: + - meta_content_scope: paren.comment.gcode + + - match: '[^)]+' + + - match: '[)]' + scope: punctuation.paren.comment.close + pop: true + + - match: \s*$ + pop: true + + # Everything after this point is broken by a syntax error + syntax_error: + - meta_scope: invalid.error.syntax.gcode + + - match: .*$ + pop: true diff --git a/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode b/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode new file mode 100644 index 00000000..643f271f --- /dev/null +++ b/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode @@ -0,0 +1,106 @@ +; SYNTAX TEST "G-code.sublime-syntax" + +; This is a G-code comment +;^comment + +G1 X100 Y100 ; Move to 100,100 +;^entity.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^comment + +T0 (This is a comment) S12 +;^entity.command.gcode +; ^punctuation.paren.comment.open +; ^paren.comment.gcode +; ^punctuation.paren.comment.close +; ^keyword.param.gcode +; ^constant.numeric.param.gcode + +M20 P'/path/to/macro/macro.g' R12 +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^punctuation.quote.single.open.gcode +; ^string.quoted.single.gcode +; ^punctuation.quote.single.close.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode + +M117 This is a message ; and comment +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^string.unquoted.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode + +M118 This is a message ; and comment +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^string.unquoted.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode + +M98 P'/path/to/macro/macro.g' R12 +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^punctuation.quote.single.open.gcode +; ^string.quoted.single.gcode +; ^punctuation.quote.single.close.gcode + +M98 P"/path/to/macro/macro.g" R12 +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^punctuation.quote.double.open.gcode +; ^string.quoted.double.gcode +; ^punctuation.quote.double.close.gcode + +M32 S100 P0 !/path/file.gco# +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.string.path.open.gcode +; ^string.unquoted.path.gcode +; ^punctuation.string.path.close.gcode + +G28 ; Home All +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode + +N123 G1 X5 Y0 *64 ; EOL Comment +;<-entity.nword.gcode +;^constant.numeric.line-number.gcode +; ^entity.command.gcode +; ^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.marker.checksum.gcode +; ^constant.numeric.checksum.gcode + +N234 G1 X-5 Y+2 *64 error +;<-entity.nword.gcode +;^constant.numeric.line-number.gcode +; ^entity.command.gcode +; ^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.marker.checksum.gcode +; ^constant.numeric.checksum.gcode +; ^invalid.error.syntax.gcode + +N234 M107 *64 +; ^-invalid.error.syntax.gcode + +M92 E304.5:304.5:420:420:420:420 ; EOL Comment +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode diff --git a/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt b/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt new file mode 100644 index 00000000..58539779 --- /dev/null +++ b/buildroot/share/sublime/auto_build_sublime_menu/000_read_me.txt @@ -0,0 +1,40 @@ +Overview: +1) Install Sublime +2) Install Deviot (?optional?) +3) Install WebDevShell (this will execute the auto-build script) +4) Copy the menu configuration to the proper Sublime directory +5) Add platformio to your path (usually not needed) + + +Sublime with autobuild + Tools + Install Package Control + Tools + Command Palette + Package Control: Install Package + type in deviot and click on it + Tools + Command Palette + Package Control: Install Package + type in WebDevShell and click on it + + in Sublime, open Marlin directory with "platformio.ini" in it + + starting in the top level directory, go to the folder "Buildroot/shared/Sublime" + copy the folder "auto_build_sublime_menu" and contents to: + Windows + \Users\your_user_name\AppData\Roaming\Sublime Text 3\Packages + Linux + /home/your_user_name/.config/sublime-text-3/Packages/User + macOS (Click on the Finder's 'Go' menu and hold down Option to open...) + ~/Library/Application Support/Sublime Text 3/Packages/User + +The menu should now be visible + +If you get an error message that says "file not found" and "subprocess.Popen(['platformio' ... " +then you'll need to add platformio to your path. + macOS + sudo nano /etc/paths + add these to the bottom + /Users/bob/.platformio + /Users/bob/.platformio/penv/bin diff --git a/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu new file mode 100644 index 00000000..60939d12 --- /dev/null +++ b/buildroot/share/sublime/auto_build_sublime_menu/Main.sublime-menu @@ -0,0 +1,66 @@ +[ + + { + "caption": "Auto Build", + "children": [ + { + "caption": "PIO Build", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py build" + } + }, + { + "caption": "PIO Clean", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py clean" + } + }, + { + "caption": "PIO Upload", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py upload" + } + }, + { + "caption": "PIO Upload (traceback)", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py traceback" + } + }, + { + "caption": "PIO Upload using Programmer", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py program" + } + }, + { + "caption": "PIO Test", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py test" + } + }, + { + "caption": "PIO Debug", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py debug" + } + }, + { + "caption": "PIO Remote", + "command": "webdevshell", + "args": { + "command": "python buildroot/share/vscode/auto_build.py remote" + } + } + ], + "id": "AutoBuild", + "mnemonic": "A" + } +] diff --git a/buildroot/share/vscode/auto_build.py b/buildroot/share/vscode/auto_build.py new file mode 100644 index 00000000..5dd2d0d8 --- /dev/null +++ b/buildroot/share/vscode/auto_build.py @@ -0,0 +1,1303 @@ +#!/usr/bin/env python +####################################### +# +# 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 . +# +####################################### + +####################################### +# +# Revision: 2.1.0 +# +# Description: script to automate PlatformIO builds +# CLI: python auto_build.py build_option +# build_option (required) +# build executes -> platformio run -e target_env +# clean executes -> platformio run --target clean -e target_env +# upload executes -> platformio run --target upload -e target_env +# traceback executes -> platformio run --target upload -e target_env +# program executes -> platformio run --target program -e target_env +# test executes -> platformio test upload -e target_env +# remote executes -> platformio remote run --target upload -e target_env +# debug executes -> platformio debug -e target_env +# +# 'traceback' just uses the debug variant of the target environment if one exists +# +####################################### + +####################################### +# +# General program flow +# +# 1. Scans Configuration.h for the motherboard name and Marlin version. +# 2. Scans pins.h for the motherboard. +# returns the CPU(s) and platformio environment(s) used by the motherboard +# 3. If further info is needed then a popup gets it from the user. +# 4. The OUTPUT_WINDOW class creates a window to display the output of the PlatformIO program. +# 5. A thread is created by the OUTPUT_WINDOW class in order to execute the RUN_PIO function. +# 6. The RUN_PIO function uses a subprocess to run the CLI version of PlatformIO. +# 7. The "iter(pio_subprocess.stdout.readline, '')" function is used to stream the output of +# PlatformIO back to the RUN_PIO function. +# 8. Each line returned from PlatformIO is formatted to match the color coding seen in the +# PlatformIO GUI. +# 9. If there is a color change within a line then the line is broken at each color change +# and sent separately. +# 10. Each formatted segment (could be a full line or a split line) is put into the queue +# IO_queue as it arrives from the platformio subprocess. +# 11. The OUTPUT_WINDOW class periodically samples IO_queue. If data is available then it +# is written to the window. +# 12. The window stays open until the user closes it. +# 13. The OUTPUT_WINDOW class continues to execute as long as the window is open. This allows +# copying, saving, scrolling of the window. A right click popup is available. +# +####################################### + +from __future__ import print_function +from __future__ import division + +import sys +import os + +pwd = os.getcwd() # make sure we're executing from the correct directory level +pwd = pwd.replace('\\', '/') +if 0 <= pwd.find('buildroot/share/atom'): + pwd = pwd[:pwd.find('buildroot/share/atom')] + os.chdir(pwd) +print('pwd: ', pwd) + +num_args = len(sys.argv) +if num_args > 1: + build_type = str(sys.argv[1]) +else: + print('Please specify build type') + exit() + +print('build_type: ', build_type) + +print('\nWorking\n') + +python_ver = sys.version_info[0] # major version - 2 or 3 + +print("python version " + str(sys.version_info[0]) + "." + str(sys.version_info[1]) + "." + str(sys.version_info[2])) + +import platform +current_OS = platform.system() + +#globals +target_env = '' +board_name = '' + +from datetime import datetime, date, time + +######### +# Python 2 error messages: +# Can't find a usable init.tcl in the following directories ... +# error "invalid command name "tcl_findLibrary"" +# +# Fix for the above errors on my Win10 system: +# search all init.tcl files for the line "package require -exact Tcl" that has the highest 8.5.x number +# copy it into the first directory listed in the error messages +# set the environmental variables TCLLIBPATH and TCL_LIBRARY to the directory where you found the init.tcl file +# reboot +######### + +########################################################################################## +# +# popup to get input from user +# +########################################################################################## + +def get_answer(board_name, cpu_label_txt, cpu_a_txt, cpu_b_txt): + + if python_ver == 2: + import Tkinter as tk + else: + import tkinter as tk + + def CPU_exit_3(): # forward declare functions + CPU_exit_3_() + + def got_answer(): + got_answer_() + + def kill_session(): + kill_session_() + + root_get_answer = tk.Tk() + root_get_answer.title('') + #root_get_answer.withdraw() + #root_get_answer.deiconify() + root_get_answer.attributes("-topmost", True) + + def disable_event(): + pass + + root_get_answer.protocol("WM_DELETE_WINDOW", disable_event) + root_get_answer.resizable(False, False) + + root_get_answer.radio_state = 1 # declare variables used by TK and enable + + global get_answer_val + get_answer_val = 2 # return get_answer_val, set default to match radio_state default + + radio_state = tk.IntVar() + radio_state.set(get_answer_val) + + l1 = tk.Label(text=board_name, fg="light green", bg="dark green", + font="default 14 bold").grid(row=0, columnspan=2, sticky='EW', ipadx=2, ipady=2) + + l2 = tk.Label(text=cpu_label_txt).grid(row=1, pady=4, columnspan=2, sticky='EW') + + b4 = tk.Radiobutton( + text=cpu_a_txt, + fg="black", + bg="lightgray", + relief=tk.SUNKEN, + selectcolor="green", + variable=radio_state, + value=1, + indicatoron=0, + command=CPU_exit_3 + ).grid(row=2, pady=1, ipady=2, ipadx=10, columnspan=2) + + b5 = tk.Radiobutton( + text=cpu_b_txt, + fg="black", + bg="lightgray", + relief=tk.SUNKEN, + selectcolor="green", + variable=radio_state, + value=2, + indicatoron=0, + command=CPU_exit_3 + ).grid(row=3, pady=1, ipady=2, ipadx=10, columnspan=2) # use same variable but inverted so they will track + + b6 = tk.Button(text="Cancel", fg="red", command=kill_session).grid(row=4, column=0, padx=4, pady=4, ipadx=2, ipady=2) + + b7 = tk.Button(text="Continue", fg="green", command=got_answer).grid(row=4, column=1, padx=4, pady=4, ipadx=2, ipady=2) + + def got_answer_(): + root_get_answer.destroy() + + def CPU_exit_3_(): + global get_answer_val + get_answer_val = radio_state.get() + + def kill_session_(): + raise SystemExit(0) # kill everything + + root_get_answer.mainloop() + +# end - get answer + + +# +# move custom board definitions from project folder to PlatformIO +# +def resolve_path(path): + import os + + # turn the selection into a partial path + + if 0 <= path.find('"'): + path = path[path.find('"'):] + if 0 <= path.find(', line '): + path = path.replace(', line ', ':') + path = path.replace('"', '') + + # get line and column numbers + line_num = 1 + column_num = 1 + line_start = path.find(':', 2) # use 2 here so don't eat Windows full path + column_start = path.find(':', line_start + 1) + if column_start == -1: + column_start = len(path) + column_end = path.find(':', column_start + 1) + if column_end == -1: + column_end = len(path) + if 0 <= line_start: + line_num = path[line_start + 1:column_start] + if line_num == '': + line_num = 1 + if column_start != column_end: + column_num = path[column_start + 1:column_end] + if column_num == '': + column_num = 0 + + index_end = path.find(',') + if 0 <= index_end: + path = path[:index_end] # delete comma and anything after + index_end = path.find(':', 2) + if 0 <= index_end: + path = path[:path.find(':', 2)] # delete the line number and anything after + + path = path.replace('\\', '/') + + if 1 == path.find(':') and current_OS == 'Windows': + return path, line_num, column_num # found a full path - no need for further processing + elif 0 == path.find('/') and (current_OS == 'Linux' or current_OS == 'Darwin'): + return path, line_num, column_num # found a full path - no need for further processing + + else: + + # resolve as many '../' as we can + while 0 <= path.find('../'): + end = path.find('../') - 1 + start = path.find('/') + while 0 <= path.find('/', start) and end > path.find('/', start): + start = path.find('/', start) + 1 + path = path[0:start] + path[end + 4:] + + # this is an alternative to the above - it just deletes the '../' section + # start_temp = path.find('../') + # while 0 <= path.find('../',start_temp): + # start = path.find('../',start_temp) + # start_temp = start + 1 + # if 0 <= start: + # path = path[start + 2 : ] + + start = path.find('/') + if start != 0: # make sure path starts with '/' + while 0 == path.find(' '): # eat any spaces at the beginning + path = path[1:] + path = '/' + path + + if current_OS == 'Windows': + search_path = path.replace('/', '\\') # os.walk uses '\' in Windows + else: + search_path = path + + start_path = os.path.abspath('') + + # search project directory for the selection + found = False + full_path = '' + for root, directories, filenames in os.walk(start_path): + for filename in filenames: + if 0 <= root.find('.git'): # don't bother looking in this directory + break + full_path = os.path.join(root, filename) + if 0 <= full_path.find(search_path): + found = True + break + if found: + break + + return full_path, line_num, column_num + +# end - resolve_path + + +# +# Open the file in the preferred editor at the line & column number +# If the preferred editor isn't already running then it tries the next. +# If none are open then the system default is used. +# +# Editor order: +# 1. Notepad++ (Windows only) +# 2. Sublime Text +# 3. Atom +# 4. System default (opens at line 1, column 1 only) +# +def open_file(path): + import subprocess + file_path, line_num, column_num = resolve_path(path) + + if file_path == '': + return + + if current_OS == 'Windows': + + editor_note = subprocess.check_output('wmic process where "name=' + "'notepad++.exe'" + '" get ExecutablePath') + editor_sublime = subprocess.check_output('wmic process where "name=' + "'sublime_text.exe'" + '" get ExecutablePath') + editor_atom = subprocess.check_output('wmic process where "name=' + "'atom.exe'" + '" get ExecutablePath') + + if 0 <= editor_note.find('notepad++.exe'): + start = editor_note.find('\n') + 1 + end = editor_note.find('\n', start + 5) - 4 + editor_note = editor_note[start:end] + command = file_path, ' -n' + str(line_num), ' -c' + str(column_num) + subprocess.Popen([editor_note, command]) + + elif 0 <= editor_sublime.find('sublime_text.exe'): + start = editor_sublime.find('\n') + 1 + end = editor_sublime.find('\n', start + 5) - 4 + editor_sublime = editor_sublime[start:end] + command = file_path + ':' + line_num + ':' + column_num + subprocess.Popen([editor_sublime, command]) + + elif 0 <= editor_atom.find('atom.exe'): + start = editor_atom.find('\n') + 1 + end = editor_atom.find('\n', start + 5) - 4 + editor_atom = editor_atom[start:end] + command = file_path + ':' + str(line_num) + ':' + str(column_num) + subprocess.Popen([editor_atom, command]) + + else: + os.startfile(resolve_path(path)) # open file with default app + + elif current_OS == 'Linux': + + command = file_path + ':' + str(line_num) + ':' + str(column_num) + index_end = command.find(',') + if 0 <= index_end: + command = command[:index_end] # sometimes a comma magically appears, don't want it + running_apps = subprocess.Popen('ps ax -o cmd', stdout=subprocess.PIPE, shell=True) + (output, err) = running_apps.communicate() + temp = output.split('\n') + + def find_editor_linux(name, search_obj): + for line in search_obj: + if 0 <= line.find(name): + path = line + return True, path + return False, '' + + (success_sublime, editor_path_sublime) = find_editor_linux('sublime_text', temp) + (success_atom, editor_path_atom) = find_editor_linux('atom', temp) + + if success_sublime: + subprocess.Popen([editor_path_sublime, command]) + + elif success_atom: + subprocess.Popen([editor_path_atom, command]) + + else: + os.system('xdg-open ' + file_path) + + elif current_OS == 'Darwin': # MAC + + command = file_path + ':' + str(line_num) + ':' + str(column_num) + index_end = command.find(',') + if 0 <= index_end: + command = command[:index_end] # sometimes a comma magically appears, don't want it + running_apps = subprocess.Popen('ps axwww -o command', stdout=subprocess.PIPE, shell=True) + (output, err) = running_apps.communicate() + temp = output.split('\n') + + def find_editor_mac(name, search_obj): + for line in search_obj: + if 0 <= line.find(name): + path = line + if 0 <= path.find('-psn'): + path = path[:path.find('-psn') - 1] + return True, path + return False, '' + + (success_sublime, editor_path_sublime) = find_editor_mac('Sublime', temp) + (success_atom, editor_path_atom) = find_editor_mac('Atom', temp) + + if success_sublime: + subprocess.Popen([editor_path_sublime, command]) + + elif success_atom: + subprocess.Popen([editor_path_atom, command]) + + else: + os.system('open ' + file_path) + +# end - open_file + + +# Get the last build environment +def get_build_last(): + env_last = '' + DIR_PWD = os.listdir('.') + if '.pio' in DIR_PWD: + date_last = 0.0 + DIR__pioenvs = os.listdir('.pio') + for name in DIR__pioenvs: + if 0 <= name.find('.') or 0 <= name.find('-'): # skip files in listing + continue + DIR_temp = os.listdir('.pio/build/' + name) + for names_temp in DIR_temp: + + if 0 == names_temp.find('firmware.'): + date_temp = os.path.getmtime('.pio/build/' + name + '/' + names_temp) + if date_temp > date_last: + date_last = date_temp + env_last = name + return env_last + + +# Get the board being built from the Configuration.h file +# return: board name, major version of Marlin being used (1 or 2) +def get_board_name(): + board_name = '' + # get board name + + with open('Marlin/Configuration.h', 'r') as myfile: + Configuration_h = myfile.read() + + Configuration_h = Configuration_h.split('\n') + Marlin_ver = 0 # set version to invalid number + for lines in Configuration_h: + if 0 == lines.find('#define CONFIGURATION_H_VERSION 01'): + Marlin_ver = 1 + if 0 == lines.find('#define CONFIGURATION_H_VERSION 02'): + Marlin_ver = 2 + board = lines.find(' BOARD_') + 1 + motherboard = lines.find(' MOTHERBOARD ') + 1 + define = lines.find('#define ') + comment = lines.find('//') + if (comment == -1 or comment > board) and \ + board > motherboard and \ + motherboard > define and \ + define >= 0 : + spaces = lines.find(' ', board) # find the end of the board substring + if spaces == -1: + board_name = lines[board:] + else: + board_name = lines[board:spaces] + break + + return board_name, Marlin_ver + + +# extract first environment name found after the start position +# return: environment name and position to start the next search from +def get_env_from_line(line, start_position): + env = '' + next_position = -1 + env_position = line.find('env:', start_position) + if 0 < env_position: + next_position = line.find(' ', env_position + 4) + if 0 < next_position: + env = line[env_position + 4:next_position] + else: + env = line[env_position + 4:] # at the end of the line + return env, next_position + + +# scan pins.h for board name and return the environment(s) found +def get_starting_env(board_name_full, version): + # get environment starting point + + if version == 1: + path = 'Marlin/pins.h' + if version == 2: + path = 'Marlin/src/pins/pins.h' + with open(path, 'r') as myfile: + pins_h = myfile.read() + + env_A = '' + env_B = '' + env_C = '' + + board_name = board_name_full[6:] # only use the part after "BOARD_" since we're searching the pins.h file + pins_h = pins_h.split('\n') + environment = '' + board_line = '' + cpu_A = '' + cpu_B = '' + i = 0 + list_start_found = False + for lines in pins_h: + i = i + 1 # i is always one ahead of the index into pins_h + if 0 < lines.find("Unknown MOTHERBOARD value set in Configuration.h"): + break # no more + if 0 < lines.find('1280'): + list_start_found = True + if list_start_found == False: # skip lines until find start of CPU list + continue + board = lines.find(board_name) + comment_start = lines.find('// ') + cpu_A_loc = comment_start + cpu_B_loc = 0 + if board > 0: # need to look at the next line for environment info + cpu_line = pins_h[i] + comment_start = cpu_line.find('// ') + env_A, next_position = get_env_from_line(cpu_line, comment_start) # get name of environment & start of search for next + env_B, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists + env_C, next_position = get_env_from_line(cpu_line, next_position) # get next environment, if it exists + break + return env_A, env_B, env_C + + +# Scan input string for CPUs that users may need to select from +# return: CPU name +def get_CPU_name(environment): + CPU_list = ('1280', '2560', '644', '1284', 'LPC1768', 'DUE') + CPU_name = '' + for CPU in CPU_list: + if 0 < environment.find(CPU): + return CPU + + +# get environment to be used for the build +# return: environment +def get_env(board_name, ver_Marlin): + + def no_environment(): + print('ERROR - no environment for this board') + print(board_name) + raise SystemExit(0) # no environment so quit + + def invalid_board(): + print('ERROR - invalid board') + print(board_name) + raise SystemExit(0) # quit if unable to find board + + CPU_question = (('1280', '2560', '1280 or 2560 CPU?'), ('644', '1284', '644 or 1284 CPU?')) + + if 0 < board_name.find('MELZI'): + get_answer( + board_name, " Which flavor of Melzi? ", "Melzi (Optiboot bootloader)", "Melzi " + ) + if 1 == get_answer_val: + target_env = 'melzi_optiboot' + else: + target_env = 'melzi' + else: + env_A, env_B, env_C = get_starting_env(board_name, ver_Marlin) + + if env_A == '': + no_environment() + if env_B == '': + return env_A # only one environment so finished + + CPU_A = get_CPU_name(env_A) + CPU_B = get_CPU_name(env_B) + + for item in CPU_question: + if CPU_A == item[0]: + get_answer(board_name, item[2], item[0], item[1]) + if 2 == get_answer_val: + target_env = env_B + else: + target_env = env_A + return target_env + + if env_A == 'LPC1768': + if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'LPC1768_debug_and_upload'): + target_env = 'LPC1768_debug_and_upload' + else: + target_env = 'LPC1768' + elif env_A == 'DUE': + target_env = 'DUE' + if build_type == 'traceback' or (build_type == 'clean' and get_build_last() == 'DUE_debug'): + target_env = 'DUE_debug' + elif env_B == 'DUE_USB': + get_answer(board_name, 'DUE Download Port?', '(Native) USB port', 'Programming port') + if 1 == get_answer_val: + target_env = 'DUE_USB' + else: + target_env = 'DUE' + elif env_A == 'STM32F103RC_btt' or env_A == 'STM32F103RE_btt': + if env_A == 'STM32F103RE_btt': + get_answer(board_name, 'MCU Type?', 'STM32F103RC', 'STM32F103RE') + if 1 == get_answer_val: + env_A = 'STM32F103RC_btt' + target_env = env_A + if env_A == 'STM32F103RC_btt': + get_answer(board_name, 'RCT6 Flash Size?', '512K', '256K') + if 1 == get_answer_val: + target_env += '_512K' + get_answer(board_name, 'USB Support?', 'USB', 'No USB') + if 1 == get_answer_val: + target_env += '_USB' + else: + invalid_board() + + if build_type == 'traceback' and target_env != 'LPC1768_debug_and_upload' and target_env != 'DUE_debug' and Marlin_ver == 2: + print("ERROR - this board isn't setup for traceback") + print('board_name: ', board_name) + print('target_env: ', target_env) + raise SystemExit(0) + + return target_env + +# end - get_env + + +# puts screen text into queue so that the parent thread can fetch the data from this thread +if python_ver == 2: + import Queue as queue +else: + import queue as queue +IO_queue = queue.Queue() + + +#PIO_queue = queue.Queue() not used! +def write_to_screen_queue(text, format_tag='normal'): + double_in = [text, format_tag] + IO_queue.put(double_in, block=False) + + +# +# send one line to the terminal screen with syntax highlighting +# +# input: unformatted text, flags from previous run +# return: formatted text ready to go to the terminal, flags from this run +# +# This routine remembers the status from call to call because previous +# lines can affect how the current line is highlighted +# + +# 'static' variables - init here and then keep updating them from within print_line +warning = False +warning_FROM = False +error = False +standard = True +prev_line_COM = False +next_line_warning = False +warning_continue = False +line_counter = 0 + + +def line_print(line_input): + + global warning + global warning_FROM + global error + global standard + global prev_line_COM + global next_line_warning + global warning_continue + global line_counter + + # all '0' elements must precede all '1' elements or they'll be skipped + platformio_highlights = [ + ['Environment', 0, 'highlight_blue'], ['[SKIP]', 1, 'warning'], ['[IGNORED]', 1, 'warning'], ['[ERROR]', 1, 'error'], + ['[FAILED]', 1, 'error'], ['[SUCCESS]', 1, 'highlight_green'] + ] + + def write_to_screen_with_replace(text, highlights): # search for highlights & split line accordingly + did_something = False + for highlight in highlights: + found = text.find(highlight[0]) + if did_something == True: + break + if found >= 0: + did_something = True + if 0 == highlight[1]: + found_1 = text.find(' ') + found_tab = text.find('\t') + if found_1 < 0 or found_1 > found_tab: + found_1 = found_tab + write_to_screen_queue(text[:found_1 + 1]) + for highlight_2 in highlights: + if highlight[0] == highlight_2[0]: + continue + found = text.find(highlight_2[0]) + if found >= 0: + found_space = text.find(' ', found_1 + 1) + found_tab = text.find('\t', found_1 + 1) + if found_space < 0 or found_space > found_tab: + found_space = found_tab + found_right = text.find(']', found + 1) + write_to_screen_queue(text[found_1 + 1:found_space + 1], highlight[2]) + write_to_screen_queue(text[found_space + 1:found + 1]) + write_to_screen_queue(text[found + 1:found_right], highlight_2[2]) + write_to_screen_queue(text[found_right:] + '\n') + break + break + if 1 == highlight[1]: + found_right = text.find(']', found + 1) + write_to_screen_queue(text[:found + 1]) + write_to_screen_queue(text[found + 1:found_right], highlight[2]) + write_to_screen_queue(text[found_right:] + '\n' + '\n') + break + if did_something == False: + r_loc = text.find('\r') + 1 + if r_loc > 0 and r_loc < len(text): # need to split this line + text = text.split('\r') + for line in text: + if line != '': + write_to_screen_queue(line + '\n') + else: + write_to_screen_queue(text + '\n') + + # end - write_to_screen_with_replace + +# scan the line + line_counter = line_counter + 1 + max_search = len(line_input) + if max_search > 3: + max_search = 3 + beginning = line_input[:max_search] + + # set flags + if 0 < line_input.find(': warning: '): # start of warning block + warning = True + warning_FROM = False + error = False + standard = False + prev_line_COM = False + prev_line_COM = False + warning_continue = True + if 0 < line_input.find('Thank you') or 0 < line_input.find('SUMMARY'): + warning = False #standard line found + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + elif beginning == 'War' or \ + beginning == '#er' or \ + beginning == 'In ' or \ + (beginning != 'Com' and prev_line_COM == True and not(beginning == 'Arc' or beginning == 'Lin' or beginning == 'Ind') or \ + next_line_warning == True): + warning = True #warning found + warning_FROM = False + error = False + standard = False + prev_line_COM = False + elif beginning == 'Com' or \ + beginning == 'Ver' or \ + beginning == ' [E' or \ + beginning == 'Rem' or \ + beginning == 'Bui' or \ + beginning == 'Ind' or \ + beginning == 'PLA': + warning = False #standard line found + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + elif beginning == '***': + warning = False # error found + warning_FROM = False + error = True + standard = False + prev_line_COM = False + elif 0 < line_input.find(': error:') or \ + 0 < line_input.find(': fatal error:'): # start of warning /error block + warning = False # error found + warning_FROM = False + error = True + standard = False + prev_line_COM = False + warning_continue = True + elif beginning == 'fro' and warning == True or \ + beginning == '.pi' : # start of warning /error block + warning_FROM = True + prev_line_COM = False + warning_continue = True + elif warning_continue == True: + warning = True + warning_FROM = False # keep the warning status going until find a standard line or an error + error = False + standard = False + prev_line_COM = False + warning_continue = True + + else: + warning = False # unknown so assume standard line + warning_FROM = False + error = False + standard = True + prev_line_COM = False + warning_continue = False + + if beginning == 'Com': + prev_line_COM = True + +# print based on flags + if standard == True: + write_to_screen_with_replace(line_input, platformio_highlights) #print white on black with substitutions + if warning == True: + write_to_screen_queue(line_input + '\n', 'warning') + if error == True: + write_to_screen_queue(line_input + '\n', 'error') + +# end - line_print + + +########################################################################## +# # +# run Platformio # +# # +########################################################################## + +# build platformio run -e target_env +# clean platformio run --target clean -e target_env +# upload platformio run --target upload -e target_env +# traceback platformio run --target upload -e target_env +# program platformio run --target program -e target_env +# test platformio test upload -e target_env +# remote platformio remote run --target upload -e target_env +# debug platformio debug -e target_env + + +def sys_PIO(): + + ########################################################################## + # # + # run Platformio inside the same shell as this Python script # + # # + ########################################################################## + + global build_type + global target_env + + import os + + print('build_type: ', build_type) + print('starting platformio') + + if build_type == 'build': + # pio_result = os.system("echo -en '\033c'") + pio_result = os.system('platformio run -e ' + target_env) + elif build_type == 'clean': + pio_result = os.system('platformio run --target clean -e ' + target_env) + elif build_type == 'upload': + pio_result = os.system('platformio run --target upload -e ' + target_env) + elif build_type == 'traceback': + pio_result = os.system('platformio run --target upload -e ' + target_env) + elif build_type == 'program': + pio_result = os.system('platformio run --target program -e ' + target_env) + elif build_type == 'test': + pio_result = os.system('platformio test upload -e ' + target_env) + elif build_type == 'remote': + pio_result = os.system('platformio remote run --target program -e ' + target_env) + elif build_type == 'debug': + pio_result = os.system('platformio debug -e ' + target_env) + else: + print('ERROR - unknown build type: ', build_type) + raise SystemExit(0) # kill everything + + # stream output from subprocess and split it into lines + #for line in iter(pio_subprocess.stdout.readline, ''): + # line_print(line.replace('\n', '')) + + # append info used to run PlatformIO + # write_to_screen_queue('\nBoard name: ' + board_name + '\n') # put build info at the bottom of the screen + # write_to_screen_queue('Build type: ' + build_type + '\n') + # write_to_screen_queue('Environment used: ' + target_env + '\n') + # write_to_screen_queue(str(datetime.now()) + '\n') + +# end - sys_PIO + + +def run_PIO(dummy): + + global build_type + global target_env + global board_name + print('build_type: ', build_type) + + import subprocess + import sys + + print('starting platformio') + + if build_type == 'build': + # platformio run -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'run', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + elif build_type == 'clean': + # platformio run --target clean -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'run', '--target', 'clean', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + elif build_type == 'upload': + # platformio run --target upload -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + elif build_type == 'traceback': + # platformio run --target upload -e target_env - select the debug environment if there is one + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'run', '--target', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + elif build_type == 'program': + # platformio run --target program -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'run', '--target', 'program', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + elif build_type == 'test': + #platformio test upload -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'test', 'upload', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + elif build_type == 'remote': + # platformio remote run --target upload -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'remote', 'run', '--target', 'program', '-e', target_env], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT + ) + + elif build_type == 'debug': + # platformio debug -e target_env + # combine stdout & stderr so all compile messages are included + pio_subprocess = subprocess.Popen( + ['platformio', 'debug', '-e', target_env], stdout=subprocess.PIPE, stderr=subprocess.STDOUT + ) + + else: + print('ERROR - unknown build type: ', build_type) + raise SystemExit(0) # kill everything + +# stream output from subprocess and split it into lines + if python_ver == 2: + for line in iter(pio_subprocess.stdout.readline, ''): + line_print(line.replace('\n', '')) + else: + for line in iter(pio_subprocess.stdout.readline, b''): + line = line.decode('utf-8') + line_print(line.replace('\n', '')) + +# append info used to run PlatformIO + write_to_screen_queue('\nBoard name: ' + board_name + '\n') # put build info at the bottom of the screen + write_to_screen_queue('Build type: ' + build_type + '\n') + write_to_screen_queue('Environment used: ' + target_env + '\n') + write_to_screen_queue(str(datetime.now()) + '\n') + +# end - run_PIO + +######################################################################## + +import time +import threading +if python_ver == 2: + import Tkinter as tk + import Queue as queue + import ttk + from Tkinter import Tk, Frame, Text, Scrollbar, Menu + #from tkMessageBox import askokcancel this is not used: removed + import tkFileDialog as fileDialog +else: + import tkinter as tk + import queue as queue + from tkinter import ttk, Tk, Frame, Text, Menu +import subprocess +import sys +que = queue.Queue() +#IO_queue = queue.Queue() + + +class output_window(Text): + # based on Super Text + global continue_updates + continue_updates = True + + global search_position + search_position = '' # start with invalid search position + + global error_found + error_found = False # are there any errors? + + def __init__(self): + + self.root = tk.Tk() + self.root.attributes("-topmost", True) + self.frame = tk.Frame(self.root) + self.frame.pack(fill='both', expand=True) + + # text widget + #self.text = tk.Text(self.frame, borderwidth=3, relief="sunken") + Text.__init__(self, self.frame, borderwidth=3, relief="sunken") + self.config(tabs=(400, )) # configure Text widget tab stops + self.config(background='black', foreground='white', font=("consolas", 12), wrap='word', undo='True') + #self.config(background = 'black', foreground = 'white', font= ("consolas", 12), wrap = 'none', undo = 'True') + self.config(height=24, width=100) + self.config(insertbackground='pale green') # keyboard insertion point + self.pack(side='left', fill='both', expand=True) + + self.tag_config('normal', foreground='white') + self.tag_config('warning', foreground='yellow') + self.tag_config('error', foreground='red') + self.tag_config('highlight_green', foreground='green') + self.tag_config('highlight_blue', foreground='cyan') + self.tag_config('error_highlight_inactive', background='dim gray') + self.tag_config('error_highlight_active', background='light grey') + + self.bind_class("Text", "", self.select_all) # required in windows, works in others + self.bind_all("", self.scroll_errors) + self.bind_class("", self.rebuild) + + # scrollbar + + scrb = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) + self.config(yscrollcommand=scrb.set) + scrb.pack(side='right', fill='y') + + #self.scrb_Y = tk.Scrollbar(self.frame, orient='vertical', command=self.yview) + #self.scrb_Y.config(yscrollcommand=self.scrb_Y.set) + #self.scrb_Y.pack(side='right', fill='y') + + #self.scrb_X = tk.Scrollbar(self.frame, orient='horizontal', command=self.xview) + #self.scrb_X.config(xscrollcommand=self.scrb_X.set) + #self.scrb_X.pack(side='bottom', fill='x') + + #scrb_X = tk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.xview) # tk.HORIZONTAL now have a horizsontal scroll bar BUT... shrinks it to a postage stamp and hides far right behind the vertical scroll bar + #self.config(xscrollcommand=scrb_X.set) + #scrb_X.pack(side='bottom', fill='x') + + #scrb= tk.Scrollbar(self, orient='vertical', command=self.yview) + #self.config(yscrollcommand=scrb.set) + #scrb.pack(side='right', fill='y') + + #self.config(height = 240, width = 1000) # didn't get the size baCK TO NORMAL + #self.pack(side='left', fill='both', expand=True) # didn't get the size baCK TO NORMAL + + # pop-up menu + self.popup = tk.Menu(self, tearoff=0) + + self.popup.add_command(label='Copy', command=self._copy) + self.popup.add_command(label='Paste', command=self._paste) + self.popup.add_separator() + self.popup.add_command(label='Cut', command=self._cut) + self.popup.add_separator() + self.popup.add_command(label='Select All', command=self._select_all) + self.popup.add_command(label='Clear All', command=self._clear_all) + self.popup.add_separator() + self.popup.add_command(label='Save As', command=self._file_save_as) + self.popup.add_separator() + #self.popup.add_command(label='Repeat Build(CTL-shift-r)', command=self._rebuild) + self.popup.add_command(label='Repeat Build', command=self._rebuild) + self.popup.add_separator() + self.popup.add_command(label='Scroll Errors (CTL-shift-e)', command=self._scroll_errors) + self.popup.add_separator() + self.popup.add_command(label='Open File at Cursor', command=self._open_selected_file) + + if current_OS == 'Darwin': # MAC + self.bind('', self._show_popup) # macOS only + else: + self.bind('', self._show_popup) # Windows & Linux + +# threading & subprocess section + + def start_thread(self, ): + global continue_updates + # create then start a secondary thread to run an arbitrary function + # must have at least one argument + self.secondary_thread = threading.Thread(target=lambda q, arg1: q.put(run_PIO(arg1)), args=(que, '')) + self.secondary_thread.start() + continue_updates = True + # check the Queue in 50ms + self.root.after(50, self.check_thread) + self.root.after(50, self.update) + + def check_thread(self): # wait for user to kill the window + global continue_updates + if continue_updates == True: + self.root.after(10, self.check_thread) + + def update(self): + global continue_updates + if continue_updates == True: + self.root.after(10, self.update) #method is called every 50ms + temp_text = ['0', '0'] + if IO_queue.empty(): + if not (self.secondary_thread.is_alive()): + continue_updates = False # queue is exhausted and thread is dead so no need for further updates + else: + try: + temp_text = IO_queue.get(block=False) + except Queue.Empty: + continue_updates = False # queue is exhausted so no need for further updates + else: + self.insert('end', temp_text[0], temp_text[1]) + self.see("end") # make the last line visible (scroll text off the top) + +# text editing section + + def _scroll_errors(self): + global search_position + global error_found + if search_position == '': # first time so highlight all errors + countVar = tk.IntVar() + search_position = '1.0' + search_count = 0 + while search_position != '' and search_count < 100: + search_position = self.search("error", search_position, stopindex="end", count=countVar, nocase=1) + search_count = search_count + 1 + if search_position != '': + error_found = True + end_pos = '{}+{}c'.format(search_position, 5) + self.tag_add("error_highlight_inactive", search_position, end_pos) + search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search + else: + break + + if error_found: + if search_position == '': + search_position = self.search("error", '1.0', stopindex="end", nocase=1) # new search + else: # remove active highlight + end_pos = '{}+{}c'.format(search_position, 5) + start_pos = '{}+{}c'.format(search_position, -1) + self.tag_remove("error_highlight_active", start_pos, end_pos) + search_position = self.search( + "error", search_position, stopindex="end", nocase=1 + ) # finds first occurrence AGAIN on the first time through + if search_position == "": # wrap around + search_position = self.search("error", '1.0', stopindex="end", nocase=1) + end_pos = '{}+{}c'.format(search_position, 5) + self.tag_add("error_highlight_active", search_position, end_pos) # add active highlight + self.see(search_position) + search_position = '{}+{}c'.format(search_position, 1) # point to the next character for new search + + def scroll_errors(self, event): + self._scroll_errors() + + def _rebuild(self): + #global board_name + #global Marlin_ver + #global target_env + #board_name, Marlin_ver = get_board_name() + #target_env = get_env(board_name, Marlin_ver) + self.start_thread() + + def rebuild(self, event): + print("event happened") + self._rebuild() + + def _open_selected_file(self): + current_line = self.index('insert') + line_start = current_line[:current_line.find('.')] + '.0' + line_end = current_line[:current_line.find('.')] + '.200' + self.mark_set("path_start", line_start) + self.mark_set("path_end", line_end) + path = self.get("path_start", "path_end") + from_loc = path.find('from ') + colon_loc = path.find(': ') + if 0 <= from_loc and ((colon_loc == -1) or (from_loc < colon_loc)): + path = path[from_loc + 5:] + if 0 <= colon_loc: + path = path[:colon_loc] + if 0 <= path.find('\\') or 0 <= path.find('/'): # make sure it really contains a path + open_file(path) + + def _file_save_as(self): + self.filename = fileDialog.asksaveasfilename(defaultextension='.txt') + f = open(self.filename, 'w') + f.write(self.get('1.0', 'end')) + f.close() + + def copy(self, event): + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + except TypeError: + pass + + def cut(self, event): + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + self.delete(*self.tag_ranges('sel')) + except TypeError: + pass + + def _show_popup(self, event): + '''right-click popup menu''' + + if self.root.focus_get() != self: + self.root.focus_set() + + try: + self.popup.tk_popup(event.x_root, event.y_root, 0) + finally: + self.popup.grab_release() + + def _cut(self): + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + self.delete(*self.tag_ranges('sel')) + except TypeError: + pass + + def cut(self, event): + self._cut() + + def _copy(self): + + try: + selection = self.get(*self.tag_ranges('sel')) + self.clipboard_clear() + self.clipboard_append(selection) + except TypeError: + pass + + def copy(self, event): + self._copy() + + def _paste(self): + self.insert('insert', self.selection_get(selection='CLIPBOARD')) + + def _select_all(self): + self.tag_add('sel', '1.0', 'end') + + def select_all(self, event): + self.tag_add('sel', '1.0', 'end') + + def _clear_all(self): + #'''erases all text''' + # + #isok = askokcancel('Clear All', 'Erase all text?', frame=self, + # default='ok') + #if isok: + # self.delete('1.0', 'end') + self.delete('1.0', 'end') + +# end - output_window + + +def main(): + + ########################################################################## + # # + # main program # + # # + ########################################################################## + + global build_type + global target_env + global board_name + + board_name, Marlin_ver = get_board_name() + + target_env = get_env(board_name, Marlin_ver) + + # Re-use the VSCode terminal, if possible + if os.environ.get('PLATFORMIO_CALLER', '') == 'vscode': + sys_PIO() + else: + auto_build = output_window() + auto_build.start_thread() # executes the "run_PIO" function + + auto_build.root.mainloop() + + +if __name__ == '__main__': + + main() diff --git a/buildroot/share/vscode/avrdude.conf b/buildroot/share/vscode/avrdude.conf new file mode 100644 index 00000000..991d2557 --- /dev/null +++ b/buildroot/share/vscode/avrdude.conf @@ -0,0 +1,15478 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# 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 page 2 at: +# +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf +# +# INSTRUCTION FORMATS +# +# 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: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "lpt1"; +default_serial = "com1"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, https://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + +# Parallel port programmers. + +programmer + id = "bsd"; + desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; + type = par; + vcc = 2, 3, 4, 5; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; +; + +programmer + id = "stk200"; + desc = "STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; +; + +# The programming dongle used by the popular Ponyprog +# utility. It is almost similar to the STK200 one, +# except that there is a LED indicating that the +# programming is currently in progress. + +programmer + id = "pony-stk200"; + desc = "Pony Prog STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +programmer + id = "dt006"; + desc = "Dontronics DT006"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "bascom"; + desc = "Bascom SAMPLE programming cable"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "alf"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + type = par; + vcc = 2, 3, 4, 5; + buff = 6; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; + errled = 1; + rdyled = 14; + pgmled = 16; + vfyled = 17; +; + +programmer + id = "sp12"; + desc = "Steve Bolt's Programmer"; + type = par; + vcc = 4,5,6,7,8; + reset = 3; + sck = 2; + mosi = 9; + miso = 11; +; + +programmer + id = "picoweb"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + type = par; + reset = 2; + sck = 3; + mosi = 4; + miso = 13; +; + +programmer + id = "abcmini"; + desc = "ABCmini Board, aka Dick Smith HOTCHIP"; + type = par; + reset = 4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "futurlec"; + desc = "Futurlec.com programming cable."; + type = par; + reset = 3; + sck = 2; + mosi = 1; + miso = 10; +; + + +# From the contributor of the "xil" jtag cable: +# The "vcc" definition isn't really vcc (the cable gets its power from +# the programming circuit) but is necessary to switch one of the +# buffer lines (trying to add it to the "buff" lines doesn't work). +# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK +# to SCK (plus vcc/gnd of course) +programmer + id = "xil"; + desc = "Xilinx JTAG cable"; + type = par; + mosi = 2; + sck = 3; + reset = 4; + buff = 5; + miso = 13; + vcc = 6; +; + + +programmer + id = "dapa"; + desc = "Direct AVR Parallel Access cable"; + type = par; + vcc = 3; + reset = 16; + sck = 1; + mosi = 2; + miso = 11; +; + +programmer + id = "atisp"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + type = par; + reset = ~6; + sck = ~8; + mosi = ~7; + miso = ~10; +; + +programmer + id = "ere-isp-avr"; + desc = "ERE ISP-AVR "; + type = par; + reset = ~4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "blaster"; + desc = "Altera ByteBlaster"; + type = par; + sck = 2; + miso = 11; + reset = 3; + mosi = 8; + buff = 14; +; + +# It is almost same as pony-stk200, except vcc on pin 5 to auto +# disconnect port download on http://www.electropol.fr +programmer + id = "frank-stk200"; + desc = "Frank STK200"; + type = par; + vcc = 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +# The AT98ISP Cable is a simple parallel dongle for AT89 family. +# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 +programmer +id = "89isp"; +desc = "Atmel at89isp cable"; +type = par; +reset = 17; +sck = 1; +mosi = 2; +miso = 10; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/vscode/avrdude_5.10_linux b/buildroot/share/vscode/avrdude_5.10_linux new file mode 100644 index 00000000..0b7f3fda Binary files /dev/null and b/buildroot/share/vscode/avrdude_5.10_linux differ diff --git a/buildroot/share/vscode/avrdude_5.10_macOS b/buildroot/share/vscode/avrdude_5.10_macOS new file mode 100644 index 00000000..dbcfc997 Binary files /dev/null and b/buildroot/share/vscode/avrdude_5.10_macOS differ diff --git a/buildroot/share/vscode/avrdude_linux.conf b/buildroot/share/vscode/avrdude_linux.conf new file mode 100644 index 00000000..ff429a02 --- /dev/null +++ b/buildroot/share/vscode/avrdude_linux.conf @@ -0,0 +1,15478 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# 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 page 2 at: +# +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf +# +# INSTRUCTION FORMATS +# +# 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: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "/dev/parport0"; +default_serial = "/dev/ttyS0"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, https://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + +# Parallel port programmers. + +programmer + id = "bsd"; + desc = "Brian Dean's Programmer, https://savannah.nongnu.org/projects/avrdude"; + type = par; + vcc = 2, 3, 4, 5; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; +; + +programmer + id = "stk200"; + desc = "STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; +; + +# The programming dongle used by the popular Ponyprog +# utility. It is almost similar to the STK200 one, +# except that there is a LED indicating that the +# programming is currently in progress. + +programmer + id = "pony-stk200"; + desc = "Pony Prog STK200"; + type = par; + buff = 4, 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +programmer + id = "dt006"; + desc = "Dontronics DT006"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "bascom"; + desc = "Bascom SAMPLE programming cable"; + type = par; + reset = 4; + sck = 5; + mosi = 2; + miso = 11; +; + +programmer + id = "alf"; + desc = "Nightshade ALF-PgmAVR, http://nightshade.homeip.net/"; + type = par; + vcc = 2, 3, 4, 5; + buff = 6; + reset = 7; + sck = 8; + mosi = 9; + miso = 10; + errled = 1; + rdyled = 14; + pgmled = 16; + vfyled = 17; +; + +programmer + id = "sp12"; + desc = "Steve Bolt's Programmer"; + type = par; + vcc = 4,5,6,7,8; + reset = 3; + sck = 2; + mosi = 9; + miso = 11; +; + +programmer + id = "picoweb"; + desc = "Picoweb Programming Cable, http://www.picoweb.net/"; + type = par; + reset = 2; + sck = 3; + mosi = 4; + miso = 13; +; + +programmer + id = "abcmini"; + desc = "ABCmini Board, aka Dick Smith HOTCHIP"; + type = par; + reset = 4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "futurlec"; + desc = "Futurlec.com programming cable."; + type = par; + reset = 3; + sck = 2; + mosi = 1; + miso = 10; +; + + +# From the contributor of the "xil" jtag cable: +# The "vcc" definition isn't really vcc (the cable gets its power from +# the programming circuit) but is necessary to switch one of the +# buffer lines (trying to add it to the "buff" lines doesn't work). +# With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK +# to SCK (plus vcc/gnd of course) +programmer + id = "xil"; + desc = "Xilinx JTAG cable"; + type = par; + mosi = 2; + sck = 3; + reset = 4; + buff = 5; + miso = 13; + vcc = 6; +; + + +programmer + id = "dapa"; + desc = "Direct AVR Parallel Access cable"; + type = par; + vcc = 3; + reset = 16; + sck = 1; + mosi = 2; + miso = 11; +; + +programmer + id = "atisp"; + desc = "AT-ISP V1.1 programming cable for AVR-SDK1 from micro-research.co.th"; + type = par; + reset = ~6; + sck = ~8; + mosi = ~7; + miso = ~10; +; + +programmer + id = "ere-isp-avr"; + desc = "ERE ISP-AVR "; + type = par; + reset = ~4; + sck = 3; + mosi = 2; + miso = 10; +; + +programmer + id = "blaster"; + desc = "Altera ByteBlaster"; + type = par; + sck = 2; + miso = 11; + reset = 3; + mosi = 8; + buff = 14; +; + +# It is almost same as pony-stk200, except vcc on pin 5 to auto +# disconnect port download on http://www.electropol.fr +programmer + id = "frank-stk200"; + desc = "Frank STK200"; + type = par; + vcc = 5; + sck = 6; + mosi = 7; + reset = 9; + miso = 10; + pgmled = 8; +; + +# The AT98ISP Cable is a simple parallel dongle for AT89 family. +# https://www.microchip.com/wwwAppNotes/AppNotes.aspx?appnote=en592141 +programmer +id = "89isp"; +desc = "Atmel at89isp cable"; +type = par; +reset = 17; +sck = 1; +mosi = 2; +miso = 10; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/vscode/avrdude_macOS.conf b/buildroot/share/vscode/avrdude_macOS.conf new file mode 100644 index 00000000..6147a225 --- /dev/null +++ b/buildroot/share/vscode/avrdude_macOS.conf @@ -0,0 +1,15272 @@ +# $Id: avrdude.conf.in 916 2010-01-15 16:36:13Z joerg_wunsch $ +# +# AVRDUDE Configuration File +# +# This file contains configuration data used by AVRDUDE which describes +# the programming hardware pinouts and also provides part definitions. +# AVRDUDE's "-C" command line option specifies the location of the +# configuration file. The "-c" option names the programmer configuration +# which must match one of the entry's "id" parameter. The "-p" option +# identifies which part AVRDUDE is going to be programming and must match +# one of the parts' "id" parameter. +# +# Possible entry formats are: +# +# programmer +# id = [, [, ] ...] ; # are quoted strings +# desc = ; # quoted string +# type = par | stk500 | stk500v2 | stk500pp | stk500hvsp | stk500generic | +# stk600 | stk600pp | stk600hvsp | +# avr910 | butterfly | usbasp | +# jtagmki | jtagmkii | jtagmkii_isp | jtagmkii_dw | +# jtagmkII_avr32 | jtagmkii_pdi | +# dragon_dw | dragon_jtag | dragon_isp | dragon_pp | +# dragon_hvsp | dragon_pdi | arduino; # programmer type +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# ; +# +# part +# id = ; # quoted string +# desc = ; # quoted string +# has_jtag = ; # part has JTAG i/f +# has_debugwire = ; # part has debugWire i/f +# has_pdi = ; # part has PDI i/f +# has_tpi = ; # part has TPI i/f +# devicecode = ; # deprecated, use stk500_devcode +# stk500_devcode = ; # numeric +# avr910_devcode = ; # numeric +# signature = ; # signature bytes +# chip_erase_delay = ; # micro-seconds +# reset = dedicated | io; +# retry_pulse = reset | sck; +# pgm_enable = ; +# chip_erase = ; +# chip_erase_delay = ; # chip erase delay (us) +# # STK500 parameters (parallel programming IO lines) +# pagel = ; # pin name in hex, i.e., 0xD7 +# bs2 = ; # pin name in hex, i.e., 0xA0 +# serial = ; # can use serial downloading +# parallel = ; # can use par. programming +# # STK500v2 parameters, to be taken from Atmel's XML files +# timeout = ; +# stabdelay = ; +# cmdexedelay = ; +# synchloops = ; +# bytedelay = ; +# pollvalue = ; +# pollindex = ; +# predelay = ; +# postdelay = ; +# pollmethod = ; +# mode = ; +# delay = ; +# blocksize = ; +# readsize = ; +# hvspcmdexedelay = ; +# # STK500v2 HV programming parameters, from XML +# pp_controlstack = , , ...; # PP only +# hvsp_controlstack = , , ...; # HVSP only +# hventerstabdelay = ; +# progmodedelay = ; # PP only +# latchcycles = ; +# togglevtg = ; +# poweroffdelay = ; +# resetdelayms = ; +# resetdelayus = ; +# hvleavestabdelay = ; +# resetdelay = ; +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only +# chiperasepolltimeout = ; +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only +# programfusepolltimeout = ; +# programlockpulsewidth = ; # PP only +# programlockpolltimeout = ; +# # JTAG ICE mkII parameters, also from XML files +# allowfullpagebitstream = ; +# enablepageprogramming = ; +# idr = ; # IO addr of IDR (OCD) reg. +# rampz = ; # IO addr of RAMPZ reg. +# spmcr = ; # mem addr of SPMC[S]R reg. +# eecr = ; # mem addr of EECR reg. +# # (only when != 0x3c) +# is_avr32 = ; # AVR32 part +# +# memory +# paged = ; # yes / no +# size = ; # bytes +# page_size = ; # bytes +# num_pages = ; # numeric +# min_write_delay = ; # micro-seconds +# max_write_delay = ; # micro-seconds +# readback_p1 = ; # byte value +# readback_p2 = ; # byte value +# pwroff_after_write = ; # yes / no +# read = ; +# write = ; +# read_lo = ; +# read_hi = ; +# write_lo = ; +# write_hi = ; +# loadpage_lo = ; +# loadpage_hi = ; +# writepage = ; +# ; +# ; +# +# If any of the above parameters are not specified, the default value +# of 0 is used for numerics or the empty string ("") for string +# values. If a required parameter is left empty, AVRDUDE will +# complain. +# +# NOTES: +# * 'devicecode' is the device code used by the STK500 (see codes +# listed below) +# * Not all memory types will implement all instructions. +# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Example memory types are: +# "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high +# fuse), "signature", "calibration", "lock" +# * The memory type specified on the avrdude command line must match +# one of the memory types defined for the specified chip. +# * The pwroff_after_write flag causes avrdude to attempt to +# power the device off and back on after an unsuccessful write to +# the affected memory area if VCC programmer pins are defined. If +# 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 page 2 at: +# +# https://ww1.microchip.com/downloads/en/AppNotes/doc2574.pdf +# +# INSTRUCTION FORMATS +# +# 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: +# +# '1' = the bit is always set on input as well as output +# +# '0' = the bit is always clear on input as well as output +# +# 'x' = the bit is ignored on input and output +# +# 'a' = the bit is an address bit, the bit-number matches this bit +# specifier's position within the current instruction byte +# +# 'aN' = the bit is the Nth address bit, bit-number = N, i.e., a12 +# is address bit 12 on input, a0 is address bit 0. +# +# 'i' = the bit is an input data bit +# +# 'o' = the bit is an output data bit +# +# Each instruction must be composed of 32 bit specifiers. The +# instruction specification closely follows the instruction data +# provided in Atmel's data sheets for their parts. +# +# See below for some examples. +# +# +# The following are STK500 part device codes to use for the +# "devicecode" field of the part. These came from Atmel's software +# section avr061.zip which accompanies the application note +# AVR061 available from: +# +# http://www.atmel.com/atmel/acrobat/doc2525.pdf +# + +#define ATTINY10 0x10 /* the _old_ one that never existed! */ +#define ATTINY11 0x11 +#define ATTINY12 0x12 +#define ATTINY15 0x13 +#define ATTINY13 0x14 + +#define ATTINY22 0x20 +#define ATTINY26 0x21 +#define ATTINY28 0x22 +#define ATTINY2313 0x23 + +#define AT90S1200 0x33 + +#define AT90S2313 0x40 +#define AT90S2323 0x41 +#define AT90S2333 0x42 +#define AT90S2343 0x43 + +#define AT90S4414 0x50 +#define AT90S4433 0x51 +#define AT90S4434 0x52 +#define ATMEGA48 0x59 + +#define AT90S8515 0x60 +#define AT90S8535 0x61 +#define AT90C8534 0x62 +#define ATMEGA8515 0x63 +#define ATMEGA8535 0x64 + +#define ATMEGA8 0x70 +#define ATMEGA88 0x73 +#define ATMEGA168 0x86 + +#define ATMEGA161 0x80 +#define ATMEGA163 0x81 +#define ATMEGA16 0x82 +#define ATMEGA162 0x83 +#define ATMEGA169 0x84 + +#define ATMEGA323 0x90 +#define ATMEGA32 0x91 + +#define ATMEGA64 0xA0 + +#define ATMEGA103 0xB1 +#define ATMEGA128 0xB2 +#define AT90CAN128 0xB3 +#define AT90CAN64 0xB3 +#define AT90CAN32 0xB3 + +#define AT86RF401 0xD0 + +#define AT89START 0xE0 +#define AT89S51 0xE0 +#define AT89S52 0xE1 + +# The following table lists the devices in the original AVR910 +# appnote: +# |Device |Signature | Code | +# +-------+----------+------+ +# |tiny12 | 1E 90 05 | 0x55 | +# |tiny15 | 1E 90 06 | 0x56 | +# | | | | +# | S1200 | 1E 90 01 | 0x13 | +# | | | | +# | S2313 | 1E 91 01 | 0x20 | +# | S2323 | 1E 91 02 | 0x48 | +# | S2333 | 1E 91 05 | 0x34 | +# | S2343 | 1E 91 03 | 0x4C | +# | | | | +# | S4414 | 1E 92 01 | 0x28 | +# | S4433 | 1E 92 03 | 0x30 | +# | S4434 | 1E 92 02 | 0x6C | +# | | | | +# | S8515 | 1E 93 01 | 0x38 | +# | S8535 | 1E 93 03 | 0x68 | +# | | | | +# |mega32 | 1E 95 01 | 0x72 | +# |mega83 | 1E 93 05 | 0x65 | +# |mega103| 1E 97 01 | 0x41 | +# |mega161| 1E 94 01 | 0x60 | +# |mega163| 1E 94 02 | 0x64 | + +# Appnote AVR109 also has a table of AVR910 device codes, which +# lists: +# dev avr910 signature +# ATmega8 0x77 0x1E 0x93 0x07 +# ATmega8515 0x3B 0x1E 0x93 0x06 +# ATmega8535 0x6A 0x1E 0x93 0x08 +# ATmega16 0x75 0x1E 0x94 0x03 +# ATmega162 0x63 0x1E 0x94 0x04 +# ATmega163 0x66 0x1E 0x94 0x02 +# ATmega169 0x79 0x1E 0x94 0x05 +# ATmega32 0x7F 0x1E 0x95 0x02 +# ATmega323 0x73 0x1E 0x95 0x01 +# ATmega64 0x46 0x1E 0x96 0x02 +# ATmega128 0x44 0x1E 0x97 0x02 +# +# These codes refer to "BOOT" device codes which are apparently +# different than standard device codes, for whatever reasons +# (often one above the standard code). + +# There are several extended versions of AVR910 implementations around +# in the Internet. These add the following codes (only devices that +# actually exist are listed): + +# ATmega8515 0x3A +# ATmega128 0x43 +# ATmega64 0x45 +# ATtiny26 0x5E +# ATmega8535 0x69 +# ATmega32 0x72 +# ATmega16 0x74 +# ATmega8 0x76 +# ATmega169 0x78 + +# +# Overall avrdude defaults +# +default_parallel = "unknown"; +default_serial = "unknown"; + + +# +# PROGRAMMER DEFINITIONS +# + +programmer + id = "arduino"; + desc = "Arduino"; + type = arduino; +; + +programmer + id = "avrisp"; + desc = "Atmel AVR ISP"; + type = stk500; +; + +programmer + id = "avrispv2"; + desc = "Atmel AVR ISP V2"; + type = stk500v2; +; + +programmer + id = "avrispmkII"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "avrisp2"; + desc = "Atmel AVR ISP mkII"; + type = stk500v2; +; + +programmer + id = "buspirate"; + desc = "The Bus Pirate"; + type = buspirate; +; + +# This is supposed to be the "default" STK500 entry. +# Attempts to select the correct firmware version +# by probing for it. Better use one of the entries +# below instead. +programmer + id = "stk500"; + desc = "Atmel STK500"; + type = stk500generic; +; + +programmer + id = "stk500v1"; + desc = "Atmel STK500 Version 1.x firmware"; + type = stk500; +; + +programmer + id = "mib510"; + desc = "Crossbow MIB510 programming board"; + type = stk500; +; + +programmer + id = "stk500v2"; + desc = "Atmel STK500 Version 2.x firmware"; + type = stk500v2; +; + +programmer + id = "stk500pp"; + desc = "Atmel STK500 V2 in parallel programming mode"; + type = stk500pp; +; + +programmer + id = "stk500hvsp"; + desc = "Atmel STK500 V2 in high-voltage serial programming mode"; + type = stk500hvsp; +; + +programmer + id = "stk600"; + desc = "Atmel STK600"; + type = stk600; +; + +programmer + id = "stk600pp"; + desc = "Atmel STK600 in parallel programming mode"; + type = stk600pp; +; + +programmer + id = "stk600hvsp"; + desc = "Atmel STK600 in high-voltage serial programming mode"; + type = stk600hvsp; +; + +programmer + id = "avr910"; + desc = "Atmel Low Cost Serial Programmer"; + type = avr910; +; + +programmer + id = "usbasp"; + desc = "USBasp, https://www.fischl.de/usbasp/"; + type = usbasp; +; + +programmer + id = "usbtiny"; + desc = "USBtiny simple USB programmer, https://learn.adafruit.com/usbtinyisp"; + type = usbtiny; +; + +programmer + id = "butterfly"; + desc = "Atmel Butterfly Development Board"; + type = butterfly; +; + +programmer + id = "avr109"; + desc = "Atmel AppNote AVR109 Boot Loader"; + type = butterfly; +; + +programmer + id = "avr911"; + desc = "Atmel AppNote AVR911 AVROSP"; + type = butterfly; +; + +programmer + id = "jtagmkI"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 115200; # default is 115200 + type = jtagmki; +; + +# easier to type +programmer + id = "jtag1slow"; + desc = "Atmel JTAG ICE (mkI)"; + baudrate = 19200; + type = jtagmki; +; + +programmer + id = "jtagmkII"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# easier to type +programmer + id = "jtag2slow"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 19200; # default is 19200 + type = jtagmkii; +; + +# JTAG ICE mkII @ 115200 Bd +programmer + id = "jtag2fast"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# make the fast one the default, people will love that +programmer + id = "jtag2"; + desc = "Atmel JTAG ICE mkII"; + baudrate = 115200; + type = jtagmkii; +; + +# JTAG ICE mkII in ISP mode +programmer + id = "jtag2isp"; + desc = "Atmel JTAG ICE mkII in ISP mode"; + baudrate = 115200; + type = jtagmkii_isp; +; + +# JTAG ICE mkII in debugWire mode +programmer + id = "jtag2dw"; + desc = "Atmel JTAG ICE mkII in debugWire mode"; + baudrate = 115200; + type = jtagmkii_dw; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtagmkII_avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in AVR32 mode +programmer + id = "jtag2avr32"; + desc = "Atmel JTAG ICE mkII im AVR32 mode"; + baudrate = 115200; + type = jtagmkii_avr32; +; + +# JTAG ICE mkII in PDI mode +programmer + id = "jtag2pdi"; + desc = "Atmel JTAG ICE mkII PDI mode"; + baudrate = 115200; + type = jtagmkii_pdi; +; + +# AVR Dragon in JTAG mode +programmer + id = "dragon_jtag"; + desc = "Atmel AVR Dragon in JTAG mode"; + baudrate = 115200; + type = dragon_jtag; +; + +# AVR Dragon in ISP mode +programmer + id = "dragon_isp"; + desc = "Atmel AVR Dragon in ISP mode"; + baudrate = 115200; + type = dragon_isp; +; + +# AVR Dragon in PP mode +programmer + id = "dragon_pp"; + desc = "Atmel AVR Dragon in PP mode"; + baudrate = 115200; + type = dragon_pp; +; + +# AVR Dragon in HVSP mode +programmer + id = "dragon_hvsp"; + desc = "Atmel AVR Dragon in HVSP mode"; + baudrate = 115200; + type = dragon_hvsp; +; + +# AVR Dragon in debugWire mode +programmer + id = "dragon_dw"; + desc = "Atmel AVR Dragon in debugWire mode"; + baudrate = 115200; + type = dragon_dw; +; + +# AVR Dragon in PDI mode +programmer + id = "dragon_pdi"; + desc = "Atmel AVR Dragon in PDI mode"; + baudrate = 115200; + type = dragon_pdi; +; + +programmer + id = "pavr"; + desc = "Jason Kyle's pAVR Serial Programmer"; + type = avr910; +; + + +# +# some ultra cheap programmers use bitbanging on the +# serialport. +# +# PC - DB9 - Pins for RS232: +# +# GND 5 -- |O +# | O| <- 9 RI +# DTR 4 <- |O | +# | O| <- 8 CTS +# TXD 3 <- |O | +# | O| -> 7 RTS +# RXD 2 -> |O | +# | O| <- 6 DSR +# DCD 1 -> |O +# +# Using RXD is currently not supported. +# Using RI is not supported under Win32 but is supported under Posix. + +# serial ponyprog design (dasa2 in uisp) +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "ponyser"; + desc = "design ponyprog serial, reset=!txd sck=rts mosi=dtr miso=cts"; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# Same as above, different name +# reset=!txd sck=rts mosi=dtr miso=cts + +programmer + id = "siprog"; + desc = "Lancos SI-Prog "; + type = serbb; + reset = ~3; + sck = 7; + mosi = 4; + miso = 8; +; + +# unknown (dasa in uisp) +# reset=rts sck=dtr mosi=txd miso=cts + +programmer + id = "dasa"; + desc = "serial port banging, reset=rts sck=dtr mosi=txd miso=cts"; + type = serbb; + reset = 7; + sck = 4; + mosi = 3; + miso = 8; +; + +# unknown (dasa3 in uisp) +# reset=!dtr sck=rts mosi=txd miso=cts + +programmer + id = "dasa3"; + desc = "serial port banging, reset=!dtr sck=rts mosi=txd miso=cts"; + type = serbb; + reset = ~4; + sck = 7; + mosi = 3; + miso = 8; +; + +# C2N232i (jumper configuration "auto") +# reset=dtr sck=!rts mosi=!txd miso=!cts + +programmer + id = "c2n232i"; + desc = "serial port banging, reset=dtr sck=!rts mosi=!txd miso=!cts"; + type = serbb; + reset = 4; + sck = ~7; + mosi = ~3; + miso = ~8; +; + +# +# PART DEFINITIONS +# + +#------------------------------------------------------------ +# ATtiny11 +#------------------------------------------------------------ + +# This is an HVSP-only device. + +part + id = "t11"; + desc = "ATtiny11"; + stk500_devcode = 0x11; + signature = 0x1e 0x90 0x04; + chip_erase_delay = 20000; + + timeout = 200; + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + blocksize = 64; + readsize = 256; + delay = 5; + ; + + memory "flash" + size = 1024; + blocksize = 128; + readsize = 256; + delay = 3; + ; + + memory "signature" + size = 3; + ; + + memory "lock" + size = 1; + ; + + memory "calibration" + size = 1; + ; + + memory "fuse" + size = 1; + ; +; + +#------------------------------------------------------------ +# ATtiny12 +#------------------------------------------------------------ + +part + id = "t12"; + desc = "ATtiny12"; + stk500_devcode = 0x12; + avr910_devcode = 0x55; + signature = 0x1e 0x90 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 8; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4500; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# ATtiny13 +#------------------------------------------------------------ + +part + id = "t13"; + desc = "ATtiny13"; + has_debugwire = yes; + flash_instr = 0xB4, 0x0E, 0x1E; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x0E, 0xB4, 0x0E, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; + signature = 0x1e 0x90 0x07; + chip_erase_delay = 4000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 90; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 1024; + page_size = 32; + num_pages = 32; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 0 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny15 +#------------------------------------------------------------ + +part + id = "t15"; + desc = "ATtiny15"; + stk500_devcode = 0x13; + avr910_devcode = 0x56; + signature = 0x1e 0x90 0x06; + chip_erase_delay = 8200; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 5; + synchcycles = 6; + latchcycles = 16; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 64; + min_write_delay = 8200; + max_write_delay = 8200; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + size = 1024; + min_write_delay = 4100; + max_write_delay = 4100; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x o o o o x x o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x i i i i 1 1 i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +; + +#------------------------------------------------------------ +# AT90s1200 +#------------------------------------------------------------ + +part + id = "1200"; + desc = "AT90S1200"; + stk500_devcode = 0x33; + avr910_devcode = 0x13; + signature = 0x1e 0x90 0x01; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 1; + bytedelay = 0; + pollindex = 0; + pollvalue = 0xFF; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 64; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 32; + readsize = 256; + ; + memory "flash" + size = 1024; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x02; + delay = 15; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4414 +#------------------------------------------------------------ + +part + id = "4414"; + desc = "AT90S4414"; + stk500_devcode = 0x50; + avr910_devcode = 0x28; + signature = 0x1e 0x92 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2313 +#------------------------------------------------------------ + +part + id = "2313"; + desc = "AT90S2313"; + stk500_devcode = 0x40; + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x i i x", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s2333 +#------------------------------------------------------------ + +part + id = "2333"; +##### WARNING: No XML file for device 'AT90S2333'! ##### + desc = "AT90S2333"; + stk500_devcode = 0x42; + avr910_devcode = 0x34; + signature = 0x1e 0x91 0x05; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s2343 (also AT90s2323 and ATtiny22) +#------------------------------------------------------------ + +part + id = "2343"; + desc = "AT90S2343"; + stk500_devcode = 0x43; + avr910_devcode = 0x4c; + signature = 0x1e 0x91 0x03; + chip_erase_delay = 18000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x00, + 0x68, 0x78, 0x68, 0x68, 0x00, 0x00, 0x68, 0x78, + 0x78, 0x00, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 0; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 50; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + memory "flash" + size = 2048; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 128; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o o x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + + +#------------------------------------------------------------ +# AT90s4433 +#------------------------------------------------------------ + +part + id = "4433"; + desc = "AT90S4433"; + stk500_devcode = 0x51; + avr910_devcode = 0x30; + signature = 0x1e 0x92 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + pwroff_after_write = yes; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s4434 +#------------------------------------------------------------ + +part + id = "4434"; +##### WARNING: No XML file for device 'AT90S4434'! ##### + desc = "AT90S4434"; + stk500_devcode = 0x52; + avr910_devcode = 0x6c; + signature = 0x1e 0x92 0x02; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + memory "eeprom" + size = 256; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + ; + memory "flash" + size = 4096; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 i i i i i", + "x x x x x x x x x x x x x x x x"; + ; + memory "lock" + size = 1; + min_write_delay = 9000; + max_write_delay = 20000; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + ; + ; + +#------------------------------------------------------------ +# AT90s8515 +#------------------------------------------------------------ + +part + id = "8515"; + desc = "AT90S8515"; + stk500_devcode = 0x60; + avr910_devcode = 0x38; + signature = 0x1e 0x93 0x01; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x7f; + readback_p2 = 0x7f; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# AT90s8535 +#------------------------------------------------------------ + +part + id = "8535"; + desc = "AT90S8535"; + stk500_devcode = 0x61; + avr910_devcode = 0x68; + signature = 0x1e 0x93 0x03; + chip_erase_delay = 20000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 1; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0x00; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "flash" + size = 8192; + min_write_delay = 9000; + max_write_delay = 20000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write_lo = " 0 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + write_hi = " 0 1 0 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 128; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "fuse" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x x o"; + write = "1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x o o x x x x x x"; + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + ; + +#------------------------------------------------------------ +# ATmega103 +#------------------------------------------------------------ + +part + id = "m103"; + desc = "ATMEGA103"; + stk500_devcode = 0xB1; + avr910_devcode = 0x41; + signature = 0x1e 0x97 0x01; + chip_erase_delay = 112000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x8E, 0x9E, 0x2E, 0x3E, 0xAE, 0xBE, + 0x4E, 0x5E, 0xCE, 0xDE, 0x6E, 0x7E, 0xEE, 0xDE, + 0x66, 0x76, 0xE6, 0xF6, 0x6A, 0x7A, 0xEA, 0x7A, + 0x7F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 15; + chiperasepolltimeout = 0; + programfusepulsewidth = 2; + programfusepolltimeout = 0; + programlockpulsewidth = 0; + programlockpolltimeout = 10; + + memory "eeprom" + size = 4096; + min_write_delay = 4000; + max_write_delay = 9000; + readback_p1 = 0x80; + readback_p2 = 0x7f; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 22000; + max_write_delay = 56000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 70; + blocksize = 256; + readsize = 256; + ; + + memory "fuse" + size = 1; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x x o x o 1 o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 1 i 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x o o x"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 i i 1", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega64 +#------------------------------------------------------------ + +part + id = "m64"; + desc = "ATMEGA64"; + has_jtag = yes; + stk500_devcode = 0xA0; + avr910_devcode = 0x45; + signature = 0x1e 0x96 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega128 +#------------------------------------------------------------ + +part + id = "m128"; + desc = "ATMEGA128"; + has_jtag = yes; + stk500_devcode = 0xB2; + avr910_devcode = 0x43; + signature = 0x1e 0x97 0x02; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x22; + spmcr = 0x68; + rampz = 0x3b; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 12; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN128 +#------------------------------------------------------------ + +part + id = "c128"; + desc = "AT90CAN128"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x97 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN64 +#------------------------------------------------------------ + +part + id = "c64"; + desc = "AT90CAN64"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x96 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90CAN32 +#------------------------------------------------------------ + +part + id = "c32"; + desc = "AT90CAN32"; + has_jtag = yes; + stk500_devcode = 0xB3; +# avr910_devcode = 0x43; + signature = 0x1e 0x95 0x81; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + eecr = 0x3f; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 256; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega16 +#------------------------------------------------------------ + +part + id = "m16"; + desc = "ATMEGA16"; + has_jtag = yes; + stk500_devcode = 0x82; + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x03; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 100; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "calibration" + size = 4; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega164P +#------------------------------------------------------------ + +# close to ATmega16 + +part + id = "m164p"; + desc = "ATMEGA164P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x94 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega324P +#------------------------------------------------------------ + +# similar to ATmega164P + +part + id = "m324p"; + desc = "ATMEGA324P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x95 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega644 +#------------------------------------------------------------ + +# similar to ATmega164 + +part + id = "m644"; + desc = "ATMEGA644"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x09; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega644P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m644p"; + desc = "ATMEGA644P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x96 0x0a; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega1284P +#------------------------------------------------------------ + +# similar to ATmega164p + +part + id = "m1284p"; + desc = "ATMEGA1284P"; + has_jtag = yes; + stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one + avr910_devcode = 0x74; + signature = 0x1e 0x97 0x05; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega162 +#------------------------------------------------------------ + +part + id = "m162"; + desc = "ATMEGA162"; + has_jtag = yes; + stk500_devcode = 0x83; + avr910_devcode = 0x63; + signature = 0x1e 0x94 0x04; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + + idr = 0x04; + spmcr = 0x57; + allowfullpagebitstream = yes; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + + ; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 16000; + max_write_delay = 16000; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; +; + + + +#------------------------------------------------------------ +# ATmega163 +#------------------------------------------------------------ + +part + id = "m163"; + desc = "ATMEGA163"; + stk500_devcode = 0x81; + avr910_devcode = 0x64; + signature = 0x1e 0x94 0x02; + chip_erase_delay = 32000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + + memory "eeprom" + size = 512; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 16000; + max_write_delay = 16000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x11; + delay = 20; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o x x o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i 1 1 i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x 1 o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x 1 1 1 1 1 i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x 0 x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega169 +#------------------------------------------------------------ + +part + id = "m169"; + desc = "ATMEGA169"; + has_jtag = yes; + stk500_devcode = 0x85; + avr910_devcode = 0x78; + signature = 0x1e 0x94 0x05; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329 +#------------------------------------------------------------ + +part + id = "m329"; + desc = "ATMEGA329"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega329P +#------------------------------------------------------------ +# Identical to ATmega329 except of the signature + +part + id = "m329p"; + desc = "ATMEGA329P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0b; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290 +#------------------------------------------------------------ + +# identical to ATmega329 + +part + id = "m3290"; + desc = "ATMEGA3290"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3290P +#------------------------------------------------------------ + +# identical to ATmega3290 except of the signature + +part + id = "m3290p"; + desc = "ATMEGA3290P"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x95 0x0c; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a3 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega649 +#------------------------------------------------------------ + +part + id = "m649"; + desc = "ATMEGA649"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x03; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6490 +#------------------------------------------------------------ + +# identical to ATmega649 + +part + id = "m6490"; + desc = "ATMEGA6490"; + has_jtag = yes; +# stk500_devcode = 0x85; # no STK500 support, only STK500v2 +# avr910_devcode = 0x?; # try the ATmega169 one: + avr910_devcode = 0x75; + signature = 0x1e 0x96 0x04; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32 +#------------------------------------------------------------ + +part + id = "m32"; + desc = "ATMEGA32"; + has_jtag = yes; + stk500_devcode = 0x91; + avr910_devcode = 0x72; + signature = 0x1e 0x95 0x02; + chip_erase_delay = 9000; + pagel = 0xd7; + bs2 = 0xa0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = yes; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega161 +#------------------------------------------------------------ + +part + id = "m161"; + desc = "ATMEGA161"; + stk500_devcode = 0x80; + avr910_devcode = 0x60; + signature = 0x1e 0x94 0x01; + chip_erase_delay = 28000; + pagel = 0xd7; + bs2 = 0xa0; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 0; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 30; + programfusepulsewidth = 0; + programfusepolltimeout = 2; + programlockpulsewidth = 0; + programlockpolltimeout = 2; + + memory "eeprom" + size = 512; + min_write_delay = 3400; + max_write_delay = 3400; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 5; + blocksize = 128; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 14000; + max_write_delay = 14000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 16; + blocksize = 128; + readsize = 256; + ; + + memory "fuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 x x x x x x x x", + "x x x x x x x x x o x o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 x x x x x", + "x x x x x x x x 1 i 1 i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega8 +#------------------------------------------------------------ + +part + id = "m8"; + desc = "ATMEGA8"; + stk500_devcode = 0x70; + avr910_devcode = 0x76; + signature = 0x1e 0x93 0x07; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 10000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + page_size = 4; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 20; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + +#------------------------------------------------------------ +# ATmega8515 +#------------------------------------------------------------ + +part + id = "m8515"; + desc = "ATMEGA8515"; + stk500_devcode = 0x63; + avr910_devcode = 0x3A; + signature = 0x1e 0x93 0x06; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + + + +#------------------------------------------------------------ +# ATmega8535 +#------------------------------------------------------------ + +part + id = "m8535"; + desc = "ATMEGA8535"; + stk500_devcode = 0x64; + avr910_devcode = 0x69; + signature = 0x1e 0x93 0x08; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 6; + togglevtg = 0; + poweroffdelay = 0; + resetdelayms = 0; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 128; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 2000; + max_write_delay = 2000; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 0 0 x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATtiny26 +#------------------------------------------------------------ + +part + id = "t26"; + desc = "ATTINY26"; + stk500_devcode = 0x21; + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x09; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + mode = 0x04; + delay = 10; + blocksize = 64; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x21; + delay = 6; + blocksize = 16; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x x x x i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 4; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny261 +#------------------------------------------------------------ +# Close to ATtiny26 + +part + id = "t261"; + desc = "ATTINY261"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0c; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 128; + page_size = 4; + num_pages = 32; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = "1 0 1 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 x x x x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x x a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny461 +#------------------------------------------------------------ +# Close to ATtiny261 + +part + id = "t461"; + desc = "ATTINY461"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x92 0x08; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 256; + page_size = 4; + num_pages = 64; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATtiny861 +#------------------------------------------------------------ +# Close to ATtiny461 + +part + id = "t861"; + desc = "ATTINY861"; + has_debugwire = yes; + flash_instr = 0xB4, 0x00, 0x10; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x00, 0xB4, 0x00, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +# stk500_devcode = 0x21; +# avr910_devcode = 0x5e; + signature = 0x1e 0x93 0x0d; + pagel = 0xb3; + bs2 = 0xb2; + chip_erase_delay = 4000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 0; + + pp_controlstack = + 0xC4, 0xE4, 0xC4, 0xE4, 0xCC, 0xEC, 0xCC, 0xEC, + 0xD4, 0xF4, 0xD4, 0xF4, 0xDC, 0xFC, 0xDC, 0xFC, + 0xC8, 0xE8, 0xD8, 0xF8, 0x4C, 0x6C, 0x5C, 0x7C, + 0xEC, 0xBC, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 2; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + size = 512; + num_pages = 128; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4000; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read = " 1 0 1 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0 x x x x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + + read_lo = " 0 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 x x x x x x x x", + "x x x x x x x x x x x x x x o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 1 1 1 i i", + "x x x x x x x x x x x x x x x x"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + min_write_delay = 4500; + max_write_delay = 4500; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + +; + + +#------------------------------------------------------------ +# ATmega48 +#------------------------------------------------------------ + +part + id = "m48"; + desc = "ATMEGA48"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x59; +# avr910_devcode = 0x; + signature = 0x1e 0x92 0x05; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 45000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 256; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x x x o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# ATmega88 +#------------------------------------------------------------ + +part + id = "m88"; + desc = "ATMEGA88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x0a; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega168 +#------------------------------------------------------------ + +part + id = "m168"; + desc = "ATMEGA168"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x94 0x06; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 512; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny88 +#------------------------------------------------------------ + +part + id = "t88"; + desc = "attiny88"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x73; +# avr910_devcode = 0x; + signature = 0x1e 0x93 0x11; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 64; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 64; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega328P +#------------------------------------------------------------ + +part + id = "m328p"; + desc = "ATMEGA328P"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x86; + # avr910_devcode = 0x; + signature = 0x1e 0x95 0x0F; + pagel = 0xd7; + bs2 = 0xc2; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + resetdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; + page_size = 4; + size = 1024; + min_write_delay = 3600; + max_write_delay = 3600; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 x x x a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 5; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + + ; + + memory "lfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "hfuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + ; + + memory "efuse" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x x x x x x o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + ; + + memory "lock" + size = 1; + min_write_delay = 4500; + max_write_delay = 4500; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; +; + +#------------------------------------------------------------ +# ATtiny2313 +#------------------------------------------------------------ + +part + id = "t2313"; + desc = "ATtiny2313"; + has_debugwire = yes; + flash_instr = 0xB2, 0x0F, 0x1F; + eeprom_instr = 0xBB, 0xFE, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBA, 0x0F, 0xB2, 0x0F, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x23; +## Use the ATtiny26 devcode: + avr910_devcode = 0x5e; + signature = 0x1e 0x91 0x0a; + pagel = 0xD4; + bs2 = 0xD6; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0E, 0x1E, 0x2E, 0x3E, 0x2E, 0x3E, + 0x4E, 0x5E, 0x4E, 0x5E, 0x6E, 0x7E, 0x6E, 0x7E, + 0x26, 0x36, 0x66, 0x76, 0x2A, 0x3A, 0x6A, 0x7A, + 0x2E, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + +# The information in the data sheet of April/2004 is wrong, this works: + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny2313 has Signature Bytes: 0x1E 0x91 0x0A. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; +# The Tiny2313 has calibration data for both 4 MHz and 8 MHz. +# The information in the data sheet of April/2004 is wrong, this works: + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2 +#------------------------------------------------------------ + +part + id = "pwm2"; + desc = "AT90PWM2"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3 +#------------------------------------------------------------ + +# Completely identical to AT90PWM2 (including the signature!) + +part + id = "pwm3"; + desc = "AT90PWM3"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x81; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; +# AT90PWM2 has Signature Bytes: 0x1E 0x93 0x81. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM2B +#------------------------------------------------------------ +# Same as AT90PWM2 but different signature. + +part + id = "pwm2b"; + desc = "AT90PWM2B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90PWM3B +#------------------------------------------------------------ + +# Completely identical to AT90PWM2B (including the signature!) + +part + id = "pwm3b"; + desc = "AT90PWM3B"; + has_debugwire = yes; + flash_instr = 0xB6, 0x01, 0x11; + eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00, + 0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF, + 0x99, 0xF9, 0xBB, 0xAF; + stk500_devcode = 0x65; +## avr910_devcode = ?; + signature = 0x1e 0x93 0x83; + pagel = 0xD8; + bs2 = 0xE2; + reset = io; + chip_erase_delay = 9000; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 64; + readsize = 256; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny25 +#------------------------------------------------------------ + +part + id = "t25"; + desc = "ATtiny25"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x08; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny25 has Signature Bytes: 0x1E 0x91 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny45 +#------------------------------------------------------------ + +part + id = "t45"; + desc = "ATtiny45"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x06; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny45 has Signature Bytes: 0x1E 0x92 0x08. (Data sheet 2586C-AVR-06/05 (doc2586.pdf) indicates otherwise!) + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny85 +#------------------------------------------------------------ + +part + id = "t85"; + desc = "ATtiny85"; + has_debugwire = yes; + flash_instr = 0xB4, 0x02, 0x12; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x02, 0xB4, 0x02, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x00; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny85 has Signature Bytes: 0x1E 0x93 0x08. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 2; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega640 +#------------------------------------------------------------ +# Almost same as ATmega1280, except for different memory sizes + +part + id = "m640"; + desc = "ATMEGA640"; + signature = 0x1e 0x96 0x08; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1280 +#------------------------------------------------------------ + +part + id = "m1280"; + desc = "ATMEGA1280"; + signature = 0x1e 0x97 0x03; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega1281 +#------------------------------------------------------------ +# Identical to ATmega1280 + +part + id = "m1281"; + desc = "ATMEGA1281"; + signature = 0x1e 0x97 0x04; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2560 +#------------------------------------------------------------ + +part + id = "m2560"; + desc = "ATMEGA2560"; + signature = 0x1e 0x98 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega2561 +#------------------------------------------------------------ + +part + id = "m2561"; + desc = "ATMEGA2561"; + signature = 0x1e 0x98 0x02; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 262144; + page_size = 256; + num_pages = 1024; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + load_ext_addr = " 0 1 0 0 1 1 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 a16", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega128RFA1 +#------------------------------------------------------------ +# Identical to ATmega2561 but half the ROM + +part + id = "m128rfa1"; + desc = "ATMEGA128RFA1"; + signature = 0x1e 0xa7 0x01; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xE2; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny24 +#------------------------------------------------------------ + +part + id = "t24"; + desc = "ATtiny24"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x91 0x0b; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 128; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "x a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 2048; + page_size = 32; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x x a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny24 has Signature Bytes: 0x1E 0x91 0x0B. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny44 +#------------------------------------------------------------ + +part + id = "t44"; + desc = "ATtiny44"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x92 0x07; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 256; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x x", + "a7 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 4096; + page_size = 64; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny44 has Signature Bytes: 0x1E 0x92 0x07. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATtiny84 +#------------------------------------------------------------ + +part + id = "t84"; + desc = "ATtiny84"; + has_debugwire = yes; + flash_instr = 0xB4, 0x07, 0x17; + eeprom_instr = 0xBB, 0xFF, 0xBB, 0xEE, 0xBB, 0xCC, 0xB2, 0x0D, + 0xBC, 0x07, 0xB4, 0x07, 0xBA, 0x0D, 0xBB, 0xBC, + 0x99, 0xE1, 0xBB, 0xAC; +## no STK500 devcode in XML file, use the ATtiny45 one + stk500_devcode = 0x14; +## avr910_devcode = ?; +## Try the AT90S2313 devcode: + avr910_devcode = 0x20; + signature = 0x1e 0x93 0x0c; + reset = io; + chip_erase_delay = 4500; + + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + hvsp_controlstack = + 0x4C, 0x0C, 0x1C, 0x2C, 0x3C, 0x64, 0x74, 0x66, + 0x68, 0x78, 0x68, 0x68, 0x7A, 0x6A, 0x68, 0x78, + 0x78, 0x7D, 0x6D, 0x0C, 0x80, 0x40, 0x20, 0x10, + 0x11, 0x08, 0x04, 0x02, 0x03, 0x08, 0x04, 0x0F; + hventerstabdelay = 100; + hvspcmdexedelay = 0; + synchcycles = 6; + latchcycles = 1; + togglevtg = 1; + poweroffdelay = 25; + resetdelayms = 0; + resetdelayus = 70; + hvleavestabdelay = 100; + resetdelay = 25; + chiperasepolltimeout = 40; + chiperasetime = 0; + programfusepolltimeout = 25; + programlockpolltimeout = 25; + + memory "eeprom" + size = 512; + paged = no; + page_size = 4; + min_write_delay = 4000; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = "1 0 1 0 0 0 0 0 0 0 0 x x x x a8", + "a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + + write = "1 1 0 0 0 0 0 0 0 0 0 x x x x a8", + "a8 a6 a5 a4 a3 a2 a1 a0 i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x x x x", + " x a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 4; + readsize = 256; + ; + memory "flash" + paged = yes; + size = 8192; + page_size = 64; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 x x x x x", + " x x x a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 32; + readsize = 256; + ; +# ATtiny84 has Signature Bytes: 0x1E 0x93 0x0C. + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + + memory "lock" + size = 1; + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x x x x x x x i i"; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x x x x i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega32u4 +#------------------------------------------------------------ + +part + id = "m32u4"; + desc = "ATmega32U4"; + signature = 0x1e 0x95 0x87; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB646 +#------------------------------------------------------------ + +part + id = "usb646"; + desc = "AT90USB646"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB647 +#------------------------------------------------------------ +# identical to AT90USB646 + +part + id = "usb647"; + desc = "AT90USB647"; + signature = 0x1e 0x96 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x x a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1286 +#------------------------------------------------------------ + +part + id = "usb1286"; + desc = "AT90USB1286"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB1287 +#------------------------------------------------------------ +# identical to AT90USB1286 + +part + id = "usb1287"; + desc = "AT90USB1287"; + signature = 0x1e 0x97 0x82; + has_jtag = yes; +# stk500_devcode = 0xB2; +# avr910_devcode = 0x43; + chip_erase_delay = 9000; + pagel = 0xD7; + bs2 = 0xA0; + reset = dedicated; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "x x x x x x x x x x x x x x x x"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + rampz = 0x3b; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 4096; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " x x x x a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 x x x a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 131072; + page_size = 256; + num_pages = 512; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 x x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 256; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x x x x x i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 x x x x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 x x x x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + + +#------------------------------------------------------------ +# AT90USB162 +#------------------------------------------------------------ + +part + id = "usb162"; + desc = "AT90USB162"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x94 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 16384; + page_size = 128; + num_pages = 128; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# AT90USB82 +#------------------------------------------------------------ +# Changes against AT90USB162 (beside IDs) +# memory "flash" +# size = 8192; +# num_pages = 64; + +part + id = "usb82"; + desc = "AT90USB82"; + has_jtag = no; + has_debugwire = yes; + signature = 0x1e 0x93 0x82; + chip_erase_delay = 9000; + reset = io; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "x x x x x x x x x x x x x x x x"; + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", + "x x x x x x x x x x x x x x x x"; + pagel = 0xD7; + bs2 = 0xC6; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 512; + num_pages = 128; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0x00; + readback_p2 = 0x00; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 20; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 8192; + page_size = 128; + num_pages = 64; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0x00; + readback_p2 = 0x00; + read_lo = " 0 0 1 0 0 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " x x x x x x x x", + " x x a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + "a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 x x x x x x", + " x x x x x x x x"; + + mode = 0x41; + delay = 6; + blocksize = 128; + readsize = 256; + ; + + memory "lfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "x x x x x x x x i i i i i i i i"; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "x x x x x x x x o o o o o o o o"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", + "x x x x x x x x 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "calibration" + size = 1; + read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 x x x x x", + "x x x x x x a1 a0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega325 +#------------------------------------------------------------ + +part + id = "m325"; + desc = "ATMEGA325"; + signature = 0x1e 0x95 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega645 +#------------------------------------------------------------ + +part + id = "m645"; + desc = "ATMEGA645"; + signature = 0x1E 0x96 0x05; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 8; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega3250 +#------------------------------------------------------------ + +part + id = "m3250"; + desc = "ATMEGA3250"; + signature = 0x1E 0x95 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 4; /* for parallel programming */ + size = 1024; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 0 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 0 a9 a8", + " a7 a6 a5 a4 a3 a2 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 32768; + page_size = 128; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " 0 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATmega6450 +#------------------------------------------------------------ + +part + id = "m6450"; + desc = "ATMEGA6450"; + signature = 0x1E 0x96 0x06; + has_jtag = yes; +# stk500_devcode = 0x??; # No STK500v1 support? +# avr910_devcode = 0x??; # Try the ATmega16 one + avr910_devcode = 0x74; + pagel = 0xd7; + bs2 = 0xa0; + chip_erase_delay = 9000; + pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + chip_erase = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"; + + timeout = 200; + stabdelay = 100; + cmdexedelay = 25; + synchloops = 32; + bytedelay = 0; + pollindex = 3; + pollvalue = 0x53; + predelay = 1; + postdelay = 1; + pollmethod = 1; + + pp_controlstack = + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, + 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00; + hventerstabdelay = 100; + progmodedelay = 0; + latchcycles = 5; + togglevtg = 1; + poweroffdelay = 15; + resetdelayms = 1; + resetdelayus = 0; + hvleavestabdelay = 15; + chiperasepulsewidth = 0; + chiperasepolltimeout = 10; + programfusepulsewidth = 0; + programfusepolltimeout = 5; + programlockpulsewidth = 0; + programlockpolltimeout = 5; + + idr = 0x31; + spmcr = 0x57; + allowfullpagebitstream = no; + + memory "eeprom" + paged = no; /* leave this "no" */ + page_size = 8; /* for parallel programming */ + size = 2048; + min_write_delay = 9000; + max_write_delay = 9000; + readback_p1 = 0xff; + readback_p2 = 0xff; + read = " 1 0 1 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + write = " 1 1 0 0 0 0 0 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_lo = " 1 1 0 0 0 0 0 1", + " 0 0 0 0 0 0 0 0", + " 0 0 0 0 0 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 1 1 0 0 0 0 1 0", + " 0 0 0 0 0 a10 a9 a8", + " a7 a6 a5 a4 a3 0 0 0", + " x x x x x x x x"; + + mode = 0x41; + delay = 10; + blocksize = 4; + readsize = 256; + ; + + memory "flash" + paged = yes; + size = 65536; + page_size = 256; + num_pages = 256; + min_write_delay = 4500; + max_write_delay = 4500; + readback_p1 = 0xff; + readback_p2 = 0xff; + read_lo = " 0 0 1 0 0 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + read_hi = " 0 0 1 0 1 0 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " o o o o o o o o"; + + loadpage_lo = " 0 1 0 0 0 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + loadpage_hi = " 0 1 0 0 1 0 0 0", + " 0 0 0 0 0 0 0 0", + " a7 a6 a5 a4 a3 a2 a1 a0", + " i i i i i i i i"; + + writepage = " 0 1 0 0 1 1 0 0", + " a15 a14 a13 a12 a11 a10 a9 a8", + " a7 a6 a5 a4 a3 a2 a1 a0", + " 0 0 0 0 0 0 0 0"; + + mode = 0x41; + delay = 10; + blocksize = 128; + readsize = 256; + ; + + memory "lock" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", + "x x x x x x x x x x o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 1 1 i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "lfuse" + size = 1; + read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "hfuse" + size = 1; + read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", + "0 0 0 0 0 0 0 0 i i i i i i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "efuse" + size = 1; + + read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + + write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", + "0 0 0 0 0 0 0 0 1 1 1 1 1 i i i"; + min_write_delay = 9000; + max_write_delay = 9000; + ; + + memory "signature" + size = 3; + read = "0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 a1 a0 o o o o o o o o"; + ; + + memory "calibration" + size = 1; + + read = "0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0", + "0 0 0 0 0 0 0 0 o o o o o o o o"; + ; + ; + +#------------------------------------------------------------ +# ATXMEGA64A1 +#------------------------------------------------------------ + +part + id = "x64a1"; + desc = "ATXMEGA64A1"; + signature = 0x1e 0x96 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1 +#------------------------------------------------------------ + +part + id = "x128a1"; + desc = "ATXMEGA128A1"; + signature = 0x1e 0x97 0x4c; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A1REVD +#------------------------------------------------------------ + +part + id = "x128a1d"; + desc = "ATXMEGA128A1REVD"; + signature = 0x1e 0x97 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A1 +#------------------------------------------------------------ + +part + id = "x192a1"; + desc = "ATXMEGA192A1"; + signature = 0x1e 0x97 0x4e; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A1 +#------------------------------------------------------------ + +part + id = "x256a1"; + desc = "ATXMEGA256A1"; + signature = 0x1e 0x98 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A3 +#------------------------------------------------------------ + +part + id = "x64a3"; + desc = "ATXMEGA64A3"; + signature = 0x1e 0x96 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A3 +#------------------------------------------------------------ + +part + id = "x128a3"; + desc = "ATXMEGA128A3"; + signature = 0x1e 0x97 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA192A3 +#------------------------------------------------------------ + +part + id = "x192a3"; + desc = "ATXMEGA192A3"; + signature = 0x1e 0x97 0x44; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00030000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0082e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00830000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00032000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3 +#------------------------------------------------------------ + +part + id = "x256a3"; + desc = "ATXMEGA256A3"; + signature = 0x1e 0x98 0x42; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA256A3B +#------------------------------------------------------------ + +part + id = "x256a3b"; + desc = "ATXMEGA256A3B"; + signature = 0x1e 0x98 0x43; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x1000; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00040000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0083e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00840000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00042000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA16A4 +#------------------------------------------------------------ + +part + id = "x16a4"; + desc = "ATXMEGA16A4"; + signature = 0x1e 0x94 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00004000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00803000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00804000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00005000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA32A4 +#------------------------------------------------------------ + +part + id = "x32a4"; + desc = "ATXMEGA32A4"; + signature = 0x1e 0x95 0x41; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0400; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00008000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x00807000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00808000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00009000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA64A4 +#------------------------------------------------------------ + +part + id = "x64a4"; + desc = "ATXMEGA64A4"; + signature = 0x1e 0x96 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00010000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00001000; + offset = 0x0080f000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00001000; + offset = 0x00810000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00011000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + +#------------------------------------------------------------ +# ATXMEGA128A4 +#------------------------------------------------------------ + +part + id = "x128a4"; + desc = "ATXMEGA128A4"; + signature = 0x1e 0x97 0x46; + has_jtag = yes; + has_pdi = yes; + nvm_base = 0x01c0; + + memory "eeprom" + size = 0x0800; + offset = 0x08c0000; + page_size = 0x20; + readsize = 0x100; + ; + + memory "application" + size = 0x00020000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "apptable" + size = 0x00002000; + offset = 0x0081e000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "boot" + size = 0x00002000; + offset = 0x00820000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "flash" + size = 0x00022000; + offset = 0x0800000; + page_size = 0x100; + readsize = 0x100; + ; + + memory "prodsig" + size = 0x200; + offset = 0x8e0200; + page_size = 0x100; + readsize = 0x100; + ; + + memory "usersig" + size = 0x200; + offset = 0x8e0400; + page_size = 0x100; + readsize = 0x100; + ; + + memory "signature" + size = 3; + offset = 0x1000090; + ; + + memory "fuse0" + size = 1; + offset = 0x8f0020; + ; + + memory "fuse1" + size = 1; + offset = 0x8f0021; + ; + + memory "fuse2" + size = 1; + offset = 0x8f0022; + ; + + memory "fuse4" + size = 1; + offset = 0x8f0024; + ; + + memory "fuse5" + size = 1; + offset = 0x8f0025; + ; + + memory "lock" + size = 1; + offset = 0x8f0027; + ; +; + + +#------------------------------------------------------------ +# AVR32UC3A0512 +#------------------------------------------------------------ + +part + id = "ucr2"; + desc = "32UC3A0512"; + signature = 0xED 0xC0 0x3F; + has_jtag = yes; + is_avr32 = yes; + + memory "flash" + paged = yes; + page_size = 512; # bytes + readsize = 512; # bytes + num_pages = 1024; # could be set dynamicly + size = 0x00080000; # could be set dynamicly + offset = 0x80000000; + ; +; + +#------------------------------------------------------------ +# ATtiny4 +#------------------------------------------------------------ + +part + id = "t4"; + desc = "ATtiny4"; + signature = 0x1e 0x8f 0x0a; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny5 +#------------------------------------------------------------ + +part + id = "t5"; + desc = "ATtiny5"; + signature = 0x1e 0x8f 0x09; + has_tpi = yes; + + memory "flash" + size = 512; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny9 +#------------------------------------------------------------ + +part + id = "t8"; + desc = "ATtiny9"; + signature = 0x1e 0x90 0x08; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + +#------------------------------------------------------------ +# ATtiny10 +#------------------------------------------------------------ + +part + id = "t10"; + desc = "ATtiny10"; + signature = 0x1e 0x90 0x03; + has_tpi = yes; + + memory "flash" + size = 1024; + offset = 0x4000; + page_size = 16; + blocksize = 128; + ; + + memory "signature" + size = 3; + offset = 0x3fc0; + ; + + memory "fuse" + size = 1; + offset = 0x3f40; + blocksize = 4; + ; + + memory "calibration" + size = 1; + offset = 0x3f80; + ; + + memory "lockbits" + size = 1; + offset = 0x3f00; + ; +; + + diff --git a/buildroot/share/vscode/create_custom_upload_command_CDC.py b/buildroot/share/vscode/create_custom_upload_command_CDC.py new file mode 100644 index 00000000..acfd1787 --- /dev/null +++ b/buildroot/share/vscode/create_custom_upload_command_CDC.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python +# +# Builds custom upload command +# 1) Run platformio as a subprocess to find a COM port +# 2) Build the upload command +# 3) Exit and let upload tool do the work +# +# This script runs between completion of the library/dependencies installation and compilation. +# +# Will continue on if a COM port isn't found so that the compilation can be done. +# + +from __future__ import print_function +from __future__ import division + +import subprocess +import os +import sys +from SCons.Script import DefaultEnvironment +import platform +current_OS = platform.system() + +env = DefaultEnvironment() + +build_type = os.environ.get("BUILD_TYPE", 'Not Set') + + +if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : + env.Replace(UPLOAD_PROTOCOL = 'teensy-gui') # run normal Teensy2 scripts +else: + com_first = '' + com_last = '' + com_CDC = '' + description_first = '' + description_last = '' + description_CDC = '' + + # + # grab the first com port that pops up unless we find one we know for sure + # is a CDC device + # + def get_com_port(com_search_text, descr_search_text, start): + + global com_first + global com_last + global com_CDC + global description_first + global description_last + global description_CDC + + + print('\nLooking for Serial Port\n') + + # stream output from subprocess and split it into lines + pio_subprocess = subprocess.Popen(['platformio', 'device', 'list'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + looking_for_description = False + for line in iter(pio_subprocess.stdout.readline, ''): + if 0 <= line.find(com_search_text): + looking_for_description = True + com_last = line.replace('\n', '') + if com_first == '': + com_first = com_last + if 0 <= line.find(descr_search_text) and looking_for_description: + looking_for_description = False + description_last = line[ start : ] + if description_first == '': + description_first = description_last + if 0 <= description_last.find('CDC'): + com_CDC = com_last + description_CDC = description_last + + if com_CDC == '' and com_first != '': + com_CDC = com_first + description_CDC = description_first + elif com_CDC == '': + com_CDC = 'COM_PORT_NOT_FOUND' + + while 0 <= com_CDC.find('\n'): + com_CDC = com_CDC.replace('\n', '') + while 0 <= com_CDC.find('\r'): + com_CDC = com_CDC.replace('\r', '') + + if com_CDC == 'COM_PORT_NOT_FOUND': + print(com_CDC, '\n') + else: + print('FOUND: ', com_CDC) + print('DESCRIPTION: ', description_CDC, '\n') + + if current_OS == 'Windows': + + get_com_port('COM', 'Hardware ID:', 13) + + # avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' + avrdude_conf_path = 'buildroot\\share\\atom\\avrdude.conf' + + avrdude_exe_path = 'buildroot\\share\\atom\\avrdude_5.10.exe' + + # source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' + source_path = '.pio\\build\\' + env.get("PIOENV") + '\\firmware.hex' + + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + + + if current_OS == 'Darwin': # MAC + + get_com_port('usbmodem', 'Description:', 13) + +# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' + avrdude_conf_path = 'buildroot/share/vscode/avrdude_macOS.conf' + + + avrdude_exe_path = 'buildroot/share/vscode/avrdude_5.10_macOS' + +# source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pio/build/' + env.get("PIOENV") + '/firmware.hex' + + +# upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + print('upload_string: ', upload_string) + + + + if current_OS == 'Linux': + + get_com_port('/dev/tty', 'Description:', 13) + +# avrdude_conf_path = env.get("PIOHOME_DIR") + '/packages/toolchain-atmelavr/etc/avrdude.conf' + avrdude_conf_path = 'buildroot/share/vscode/avrdude_linux.conf' + + + avrdude_exe_path = 'buildroot/share/vscode/avrdude_5.10_linux' +# source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + source_path = '.pio/build/' + env.get("PIOENV") + '/firmware.hex' + +# upload_string = 'avrdude -p usb1286 -c avr109 -P ' + com_CDC + ' -U flash:w:' + source_path + ':i' + upload_string = avrdude_exe_path + ' -p usb1286 -c avr109 -P ' + com_CDC + ' -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + + + env.Replace( + UPLOADCMD = upload_string, + MAXIMUM_RAM_SIZE = 8192, + MAXIMUM_SIZE = 130048 + ) diff --git a/buildroot/share/vscode/create_custom_upload_command_DFU.py b/buildroot/share/vscode/create_custom_upload_command_DFU.py new file mode 100644 index 00000000..9082699b --- /dev/null +++ b/buildroot/share/vscode/create_custom_upload_command_DFU.py @@ -0,0 +1,42 @@ +# +# Builds custom upload command +# 1) Run platformio as a subprocess to find a COM port +# 2) Build the upload command +# 3) Exit and let upload tool do the work +# +# This script runs between completion of the library/dependencies installation and compilation. +# +# Will continue on if a COM port isn't found so that the compilation can be done. +# + +import os +import sys +from SCons.Script import DefaultEnvironment +import platform +current_OS = platform.system() + +env = DefaultEnvironment() + +build_type = os.environ.get("BUILD_TYPE", 'Not Set') +if not(build_type == 'upload' or build_type == 'traceback' or build_type == 'Not Set') : + env.Replace(UPLOAD_PROTOCOL = 'teensy-gui') # run normal Teensy2 scripts +else: + + if current_OS == 'Windows': + avrdude_conf_path = env.get("PIOHOME_DIR") + '\\packages\\toolchain-atmelavr\\etc\\avrdude.conf' + + source_path = env.get("PROJECTBUILD_DIR") + '\\' + env.get("PIOENV") + '\\firmware.hex' + + upload_string = 'avrdude -p usb1286 -c flip1 -C ' + avrdude_conf_path + ' -U flash:w:' + source_path + ':i' + + else: + source_path = env.get("PROJECTBUILD_DIR") + '/' + env.get("PIOENV") + '/firmware.hex' + + upload_string = 'avrdude -p usb1286 -c flip1 -U flash:w:' + source_path + ':i' + + + env.Replace( + UPLOADCMD = upload_string, + MAXIMUM_RAM_SIZE = 8192, + MAXIMUM_SIZE = 130048 + ) diff --git a/buildroot/tests/.gitattributes b/buildroot/tests/.gitattributes new file mode 100644 index 00000000..6313b56c --- /dev/null +++ b/buildroot/tests/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED-tests new file mode 100644 index 00000000..e5959a43 --- /dev/null +++ b/buildroot/tests/ARMED-tests @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F1 ARMED +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +use_example_configs ArmEd +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2208 +exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" + +# clean up +restore_configs diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests new file mode 100644 index 00000000..64e6322e --- /dev/null +++ b/buildroot/tests/BIGTREE_BTT002-tests @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F407VGT6 BigTreeTech BTT002 V1.0 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 +opt_set SERIAL_PORT 1 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2130 +exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" + +# clean up +restore_configs diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests new file mode 100644 index 00000000..e8d47562 --- /dev/null +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# +# Build tests for BigTreeTech GTR 1.0 +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 +opt_set SERIAL_PORT -1 +opt_set EXTRUDERS 8 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 1 +opt_set TEMP_SENSOR_3 1 +opt_set TEMP_SENSOR_4 1 +opt_set TEMP_SENSOR_5 1 +opt_set TEMP_SENSOR_6 1 +opt_set TEMP_SENSOR_7 1 +# Not necessary to enable auto-fan for all extruders to hit problematic code paths +opt_set E0_AUTO_FAN_PIN PC10 +opt_set E1_AUTO_FAN_PIN PC11 +opt_set E2_AUTO_FAN_PIN PC12 +opt_set X_DRIVER_TYPE TMC2208 +opt_set Y_DRIVER_TYPE TMC2130 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan and Mixed TMC Drivers" + +restore_configs +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 +opt_set SERIAL_PORT -1 +opt_set EXTRUDERS 6 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 1 +opt_set TEMP_SENSOR_3 1 +opt_set TEMP_SENSOR_4 1 +opt_set TEMP_SENSOR_5 1 +opt_set NUM_Z_STEPPER_DRIVERS 3 +opt_set DEFAULT_Kp_LIST "{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }" +opt_set DEFAULT_Ki_LIST "{ 1.08 }" +opt_set DEFAULT_Kd_LIST "{ 114.0, 112.0, 110.0, 108.0 }" +opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND +exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" + +# clean up +restore_configs diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests new file mode 100644 index 00000000..1295f585 --- /dev/null +++ b/buildroot/tests/BIGTREE_SKR_PRO-tests @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F407ZG BigTreeTech SKR Pro +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 +opt_set SERIAL_PORT 1 +exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" + +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 +opt_set SERIAL_PORT -1 +opt_set EXTRUDERS 3 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 1 +opt_set E0_AUTO_FAN_PIN PC10 +opt_set E1_AUTO_FAN_PIN PC11 +opt_set E2_AUTO_FAN_PIN PC12 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2130 +opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING +exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" + +# clean up +restore_configs diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests new file mode 100644 index 00000000..7f488f61 --- /dev/null +++ b/buildroot/tests/DUE-tests @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# +# Build tests for DUE (Atmel SAM3X8E ARM Cortex-M3) +# + +# exit on first failure +set -e + +restore_configs +opt_set LCD_LANGUAGE bg +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB +opt_set TEMP_SENSOR_0 -2 +opt_set TEMP_SENSOR_BED 2 +opt_set GRID_MAX_POINTS_X 16 +opt_set FANMUX0_PIN 53 +opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING ASSISTED_TRAMMING \ + EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ + BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ + NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ + NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \ + AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \ + BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ + FWRETRACT ARC_SUPPORT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ + PSU_CONTROL AUTO_POWER_CONTROL \ + PIDTEMPBED SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ + PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL \ + EXTENSIBLE_UI +opt_add EXTUI_EXAMPLE +opt_set E0_AUTO_FAN_PIN 8 +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), ExtUI, S-Curve, many options." + +restore_configs +opt_set MOTHERBOARD BOARD_RADDS +opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ + Z_MULTI_ENDSTOPS Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS \ + Z_SAFE_HOMING + #TOUCH_UI_FTDI_EVE LCD_ALEPHOBJECTS_CLCD_UI OTHER_PIN_LAYOUT +opt_set NUM_Z_STEPPER_DRIVERS 3 +opt_add Z2_MAX_ENDSTOP_INVERTING false +opt_add Z3_MAX_ENDSTOP_INVERTING false +opt_add Z2_MAX_PIN 2 +opt_add Z3_MAX_PIN 3 +pins_set ramps/RAMPS X_MAX_PIN -1 +pins_set ramps/RAMPS Y_MAX_PIN -1 +exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" + +# +# Test SWITCHING_EXTRUDER +# +restore_configs +opt_set LCD_LANGUAGE fi +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF +opt_set EXTRUDERS 2 +opt_set NUM_SERVOS 1 +opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY +exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests new file mode 100644 index 00000000..f1a65da6 --- /dev/null +++ b/buildroot/tests/FLYF407ZG-tests @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# Build tests for FLYF407ZG +# + +# exit on first failure +set -e + +# Build examples +restore_configs +opt_set MOTHERBOARD BOARD_FLYF407ZG +opt_set SERIAL_PORT -1 +opt_set X_DRIVER_TYPE TMC2208 +opt_set Y_DRIVER_TYPE TMC2130 +exec_test $1 $2 "FLYF407ZG Default Config with mixed TMC Drivers" + +# cleanup +restore_configs diff --git a/buildroot/tests/FYSETC_F6_13-tests b/buildroot/tests/FYSETC_F6_13-tests new file mode 100644 index 00000000..631a1177 --- /dev/null +++ b/buildroot/tests/FYSETC_F6_13-tests @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# Build tests for AVR ATmega FYSETC F6 1.3 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +opt_enable DGUS_LCD_UI_FYSETC +exec_test $1 $2 "FYSETC F6 1.3 with DGUS" + +# clean up +restore_configs diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests new file mode 100644 index 00000000..c7562915 --- /dev/null +++ b/buildroot/tests/FYSETC_S6-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for FYSETC_S6 +# + +# exit on first failure +set -e + +# Build examples +restore_configs +use_example_configs FYSETC/S6 +opt_set Y_DRIVER_TYPE TMC2209 +opt_set Z_DRIVER_TYPE TMC2130 +exec_test $1 $2 "FYSETC S6 Example" + +# cleanup +restore_configs diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests new file mode 100644 index 00000000..c2d72e0d --- /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/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests new file mode 100644 index 00000000..2f206f02 --- /dev/null +++ b/buildroot/tests/LPC1768-tests @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# +# Build tests for LPC1768 (NXP ARM Cortex-M3) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +#restore_configs +#opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB +#exec_test $1 $2 "Default Configuration" + +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB +opt_enable VIKI2 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 NEOPIXEL_LED +opt_set NEOPIXEL_PIN P1_16 +exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" + +#restore_configs +#use_example_configs Mks/Sbase +#exec_test $1 $2 "MKS SBASE Example Config" + +restore_configs +opt_set MOTHERBOARD BOARD_MKS_SBASE +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 1 +opt_set NUM_SERVOS 2 +opt_set SERVO_DELAY "{ 300, 300 }" +opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER +exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" + +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 -1 +opt_set TEMP_SENSOR_BED 5 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ + FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING \ + NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ + Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ + HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ + LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER +opt_set GRID_MAX_POINTS_X 16 +opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" +exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." + +# clean up +restore_configs diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests new file mode 100644 index 00000000..4314b0d5 --- /dev/null +++ b/buildroot/tests/LPC1769-tests @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# +# Build tests for LPC1769 (NXP ARM Cortex-M3) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +use_example_configs Azteeg/X5GT +exec_test $1 $2 "Azteeg X5GT Example Configuration" + +restore_configs +opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 -1 +opt_set TEMP_SENSOR_BED 5 +opt_enable VIKI2 SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ + FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ + Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ + LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Smoothieboard with many features" + +restore_configs +opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 -1 +opt_set TEMP_SENSOR_BED 5 +opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ + FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ + Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ + LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI" + +#restore_configs +#opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI +#opt_enable COREYX USE_XMAX_PLUG DAC_MOTOR_CURRENT_DEFAULT \ +# REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING \ +# AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS \ +# FILAMENT_LCD_DISPLAY FILAMENT_WIDTH_SENSOR FAN_SOFT_PWM \ +# SHOW_TEMP_ADC_VALUES HOME_Y_BEFORE_X EMERGENCY_PARSER FAN_KICKSTART_TIME \ +# SD_ABORT_ON_ENDSTOP_HIT ADVANCED_OK GCODE_MACROS \ +# VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS \ +# EXTRA_FAN_SPEED FWRETRACT MENU_ADDAUTOSTART SDCARD_SORT_ALPHA +#opt_set FAN_MIN_PWM 50 +#opt_set FAN_KICKSTART_TIME 100 +#opt_set XY_FREQUENCY_LIMIT 15 +#exec_test $1 $2 "Azteeg X5 MINI WIFI Many less common options" + +restore_configs +use_example_configs delta/generic +opt_set MOTHERBOARD BOARD_COHESION3D_REMIX +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set Z_DRIVER_TYPE TMC2130 +opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL_GANTRY_CALIBRATION \ + TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \ + SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ + EXPERIMENTAL_I2CBUS +opt_disable PSU_CONTROL +exec_test $1 $2 "Cohesion3D Remix DELTA + ABL Bilinear + EEPROM + SENSORLESS_PROBING" + +# clean up +restore_configs diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests new file mode 100644 index 00000000..fbaf5fb7 --- /dev/null +++ b/buildroot/tests/SAMD51_grandcentral_m4-tests @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# Build tests for Adafruit Grand Central M4 (ATMEL ARM Cortex-M4) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_AGCM4_RAMPS_144 +opt_set TEMP_SENSOR_0 11 +opt_set TEMP_SENSOR_BED 11 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2209 +opt_set Z_DRIVER_TYPE TMC2209 +opt_set Z2_DRIVER_TYPE TMC2209 +opt_set E0_DRIVER_TYPE TMC2209 +opt_set RESTORE_LEVELING_AFTER_G28 false +opt_set LCD_LANGUAGE it +opt_set NUM_Z_STEPPER_DRIVERS 2 +opt_set HOMING_BUMP_MM "{ 0, 0, 0 }" +opt_set SDCARD_CONNECTION LCD +opt_enable ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION BLTOUCH Z_MIN_PROBE_REPEATABILITY_TEST \ + FILAMENT_RUNOUT_SENSOR G26_MESH_VALIDATION MESH_EDIT_GFX_OVERLAY Z_SAFE_HOMING \ + EEPROM_SETTINGS NOZZLE_PARK_FEATURE SDSUPPORT SD_CHECK_AND_RETRY \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER Z_STEPPER_AUTO_ALIGN ADAPTIVE_STEP_SMOOTHING \ + STATUS_MESSAGE_SCROLLING LCD_SET_PROGRESS_MANUALLY SHOW_REMAINING_TIME USE_M73_REMAINING_TIME \ + LONG_FILENAME_HOST_SUPPORT SCROLL_LONG_FILENAMES BABYSTEPPING DOUBLECLICK_FOR_Z_BABYSTEPPING \ + MOVE_Z_WHEN_IDLE BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ + LIN_ADVANCE ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE MONITOR_DRIVER_STATUS SENSORLESS_HOMING \ + SQUARE_WAVE_STEPPING TMC_DEBUG EXPERIMENTAL_SCURVE +exec_test $1 $2 "Build Grand Central M4 Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests new file mode 100644 index 00000000..20bd111f --- /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/buildroot/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan-tests new file mode 100644 index 00000000..58237a70 --- /dev/null +++ b/buildroot/tests/STM32F070RB_malyan-tests @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F070RB 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/buildroot/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan-tests new file mode 100644 index 00000000..e594cb43 --- /dev/null +++ b/buildroot/tests/STM32F103CB_malyan-tests @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103CB Malyan M200 +# + +# exit on first failure +set -e + +use_example_configs Malyan/M200 +exec_test $1 $2 "Malyan M200" + +# cleanup +restore_configs diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests new file mode 100644 index 00000000..ad15ee72 --- /dev/null +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RC BigTreeTech (SKR Mini E3) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 +opt_set SERIAL_PORT 1 +opt_set SERIAL_PORT_2 -1 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2209 +opt_set Z_DRIVER_TYPE TMC2209 +opt_set E0_DRIVER_TYPE TMC2209 +opt_set X_SLAVE_ADDRESS 0 +opt_set Y_SLAVE_ADDRESS 1 +opt_set Z_SLAVE_ADDRESS 2 +opt_set E0_SLAVE_ADDRESS 3 + +exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests new file mode 100644 index 00000000..8f7fff0b --- /dev/null +++ b/buildroot/tests/STM32F103RC_btt_USB-tests @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RC BigTreeTech (SKR Mini v1.1) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 +opt_set SERIAL_PORT 1 +opt_set SERIAL_PORT_2 -1 +exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc-tests new file mode 100644 index 00000000..dfa85d9b --- /dev/null +++ b/buildroot/tests/STM32F103RC_fysetc-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RC FYSETC +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +use_example_configs "Creality/Ender-3/FYSETC Cheetah 1.2/base" +exec_test $1 $2 "Cheetah 1.2 Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests new file mode 100644 index 00000000..74e770d3 --- /dev/null +++ b/buildroot/tests/STM32F103RC_meeb-tests @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RC MEEB_3DP (ccrobot-online.com) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_CCROBOT_MEEB_3DP +opt_set SERIAL_PORT 1 +opt_set SERIAL_PORT_2 -1 +opt_set X_DRIVER_TYPE TMC2208 +opt_set Y_DRIVER_TYPE TMC2208 +opt_set Z_DRIVER_TYPE TMC2208 +opt_set E0_DRIVER_TYPE TMC2208 +exec_test $1 $2 "MEEB_3DP - Basic Config with TMC2208 SW Serial" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE-tests new file mode 100644 index 00000000..63fe5ba3 --- /dev/null +++ b/buildroot/tests/STM32F103RE-tests @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RE +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_STM32F103RE +opt_set EXTRUDERS 2 +opt_set SERIAL_PORT -1 +opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ + PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ + BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE +exec_test $1 $2 "STM32F1R EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT PAREN_COMMENTS GCODE_MOTION_MODES" + +# cleanup +restore_configs diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests new file mode 100644 index 00000000..ca723c7a --- /dev/null +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RET6_creality +# + +# exit on first failure +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 diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests new file mode 100644 index 00000000..9a829a55 --- /dev/null +++ b/buildroot/tests/STM32F103RE_btt-tests @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RE BigTreeTech (SKR E3 DIP v1.0) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP +opt_set SERIAL_PORT 1 +opt_set SERIAL_PORT_2 -1 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2130 +exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Config with mixed TMC Drivers" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests new file mode 100644 index 00000000..77751d77 --- /dev/null +++ b/buildroot/tests/STM32F103RE_btt_USB-tests @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RE BigTreeTech (SKR E3 DIP v1.0) +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP +opt_set SERIAL_PORT 1 +opt_set SERIAL_PORT_2 -1 +exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer-tests new file mode 100644 index 00000000..85b22c12 --- /dev/null +++ b/buildroot/tests/STM32F103VE_longer-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103VET6 +# + +# exit on first failure +set -e + +use_example_configs Alfawise/U20 +opt_set MOTHERBOARD BOARD_LONGER3D_LK +opt_set SERIAL_PORT 1 +opt_enable BAUD_RATE_GCODE +exec_test $1 $2 "Full-featured U20 config" + +# cleanup +restore_configs diff --git a/buildroot/tests/STM32F4-tests b/buildroot/tests/STM32F4-tests new file mode 100644 index 00000000..b5beb736 --- /dev/null +++ b/buildroot/tests/STM32F4-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F4 disco_f407vg +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +use_example_configs STM32/STM32F4 +exec_test $1 $2 "STM32F4 Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests new file mode 100644 index 00000000..2811014c --- /dev/null +++ b/buildroot/tests/STM32F401VE_STEVAL-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F401VE_STEVAL +# + +# exit on first failure +set -e + +# Build examples +restore_configs +opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 +opt_set SERIAL_PORT -1 +exec_test $1 $2 "STM32F401VE_STEVAL Default Config" + +# cleanup +restore_configs diff --git a/buildroot/tests/STM32F407VE_black-tests b/buildroot/tests/STM32F407VE_black-tests new file mode 100644 index 00000000..908382ec --- /dev/null +++ b/buildroot/tests/STM32F407VE_black-tests @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F407VET6 +# + +# exit on first failure +set -e + +restore_configs +use_example_configs STM32/Black_STM32F407VET6 +opt_enable BAUD_RATE_GCODE +exec_test $1 $2 "Full-featured Sample Black STM32F407VET6 config" + +# cleanup +restore_configs diff --git a/buildroot/tests/STM32F7-tests b/buildroot/tests/STM32F7-tests new file mode 100644 index 00000000..281222f1 --- /dev/null +++ b/buildroot/tests/STM32F7-tests @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F7 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_REMRAM_V1 +opt_set SERIAL_PORT 1 +exec_test $1 $2 "Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc-tests new file mode 100644 index 00000000..812e2ebc --- /dev/null +++ b/buildroot/tests/at90usb1286_cdc-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for AT90USB1286 ARMED +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_BRAINWAVE_PRO +exec_test $1 $2 "Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu-tests new file mode 100644 index 00000000..7571994e --- /dev/null +++ b/buildroot/tests/at90usb1286_dfu-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for AT90USB1286 ARMED +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_PRINTRBOARD +exec_test $1 $2 "Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests new file mode 100644 index 00000000..204e7aa7 --- /dev/null +++ b/buildroot/tests/esp32-tests @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# +# Build tests for ESP32 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 +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 +exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" + +# +# Build with TMC drivers using hardware serial +# +restore_configs +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2208 +opt_set Z_DRIVER_TYPE TMC2209 +opt_set E0_DRIVER_TYPE TMC2209 +opt_set X_HARDWARE_SERIAL Serial1 +opt_set Y_HARDWARE_SERIAL Serial1 +opt_set Z_HARDWARE_SERIAL Serial1 +opt_set E0_HARDWARE_SERIAL Serial1 +opt_set X_SLAVE_ADDRESS 0 +opt_set Y_SLAVE_ADDRESS 1 +opt_set Z_SLAVE_ADDRESS 2 +opt_set E0_SLAVE_ADDRESS 3 +opt_enable HOTEND_IDLE_TIMEOUT +exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" + +# cleanup +restore_configs diff --git a/buildroot/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1-tests new file mode 100644 index 00000000..c6cc9e3f --- /dev/null +++ b/buildroot/tests/jgaurora_a5s_a1-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103ZE JGAurora A5S A1 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +use_example_configs JGAurora/A5S +exec_test $1 $2 "JGAurora/A5S Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native-tests new file mode 100644 index 00000000..38f531da --- /dev/null +++ b/buildroot/tests/linux_native-tests @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Build tests for Linux x86_64 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_LINUX_RAMPS +opt_set TEMP_SENSOR_BED 1 +opt_enable PIDTEMPBED EEPROM_SETTINGS BAUD_RATE_GCODE +exec_test $1 $2 "Linux with EEPROM" + +# cleanup +restore_configs diff --git a/buildroot/tests/malyan_M300-tests b/buildroot/tests/malyan_M300-tests new file mode 100644 index 00000000..1955acca --- /dev/null +++ b/buildroot/tests/malyan_M300-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F070CB Malyan M300 +# + +# exit on first failure +set -e + +restore_configs +use_example_configs "delta/Malyan M300" +opt_disable AUTO_BED_LEVELING_3POINT +opt_set LCD_SERIAL_PORT 1 +exec_test $1 $2 "Malyan M300 (delta)" + +# cleanup +restore_configs diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests new file mode 100644 index 00000000..ce13d4a6 --- /dev/null +++ b/buildroot/tests/mega1280-tests @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +# +# Build tests for AVR ATmega1280 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +#restore_configs +#exec_test $1 $2 "Default Configuration" + +# +# Test MESH_BED_LEVELING feature, with LCD +# +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 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, Power Monitor, and LCD" + +# +# Test DUAL_X_CARRIAGE +# +restore_configs +opt_set MOTHERBOARD BOARD_TT_OSCAR +opt_set LCD_LANGUAGE pt +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 1 +opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD +opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 +exec_test $1 $2 "TT Oscar | DUAL_X_CARRIAGE" + +# +# Delta Config (generic) + Probeless +# +use_example_configs delta/generic +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_AUTO_CALIBRATION DELTA_CALIBRATION_MENU +exec_test $1 $2 "RAMPS | DELTA | RRD LCD | DELTA_AUTO_CALIBRATION | DELTA_CALIBRATION_MENU" + +# +# Delta Config (generic) + ABL bilinear + BLTOUCH +use_example_configs delta/generic +opt_set LCD_LANGUAGE cz +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_CALIBRATION_MENU AUTO_BED_LEVELING_BILINEAR BLTOUCH +exec_test $1 $2 "DELTA | RRD LCD | ABL Bilinear | BLTOUCH" + +# clean up +restore_configs diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests new file mode 100644 index 00000000..d3fd5c01 --- /dev/null +++ b/buildroot/tests/mega2560-tests @@ -0,0 +1,327 @@ +#!/usr/bin/env bash +# +# Build tests for AVR ATmega2560 +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +#restore_configs +#exec_test $1 $2 "Default Configuration" + +# +# Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders +# +use_example_configs AnimationExample +opt_set SHOW_CUSTOM_BOOTSCREEN +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_set LCD_LANGUAGE fr +opt_set EXTRUDERS 5 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 5 +opt_set TEMP_SENSOR_3 20 +opt_set TEMP_SENSOR_4 1000 +opt_set TEMP_SENSOR_BED 1 +opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ + SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS \ + EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ + MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ + LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ + BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL +exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." + +# +# Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language +# +use_example_configs AnimationExample +opt_set SHOW_CUSTOM_BOOTSCREEN +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO +opt_set LCD_LANGUAGE fr +opt_set EXTRUDERS 5 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 5 +opt_set TEMP_SENSOR_3 20 +opt_set TEMP_SENSOR_4 1000 +opt_set TEMP_SENSOR_BED 1 +opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ + SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS \ + EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ + MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ + LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ + BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ + Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE +opt_set LCD_LANGUAGE jp_kana +opt_disable SEGMENT_LEVELED_MOVES +opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL +exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." + +# +# Test a Servo Probe +# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES +# +restore_configs +opt_set LCD_LANGUAGE zh_CN +opt_set EXTRUDERS 5 +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 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 ..." + +# +# Test MINIRAMBO with PWM_MOTOR_CURRENT and many features +# +restore_configs +opt_set MOTHERBOARD BOARD_MEGACONTROLLER +opt_set LCD_LANGUAGE de +opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT \ + MINIPANEL SDSUPPORT PCA9632 LCD_INFO_MENU \ + AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ + LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ + INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \ + NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \ + ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \ + PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL \ + USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE +opt_set CONTROLLERFAN_SPEED_IDLE 128 +opt_add M100_FREE_MEMORY_DUMPER +opt_add M100_FREE_MEMORY_CORRUPTOR +opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" +opt_set I2C_SLAVE_ADDRESS 63 +exec_test $1 $2 "MEGACONTROLLER | Minipanel | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." + +# +# Mixing Extruder with 5 steppers, Greek +# +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 \ + 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" + +# +# Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER +# +#restore_configs +#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D +#opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 +#opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 +#opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER + +# +# Enable COREXY +# +#restore_configs +#opt_enable COREXY +#exec_test $1 $2 "Stuff" + +# +# Test many less common options +# +restore_configs +opt_set MOTHERBOARD BOARD_MIGHTYBOARD_REVE +opt_set TEMP_SENSOR_0 -2 +opt_set DIGIPOT_I2C_NUM_CHANNELS 5 +opt_set LCD_LANGUAGE it +opt_set MIXING_STEPPERS 2 +opt_set SERVO_DELAY "{ 300, 300, 300 }" +opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ + BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ + ENDSTOP_NOISE_THRESHOLD FAN_SOFT_PWM \ + FIX_MOUNTED_PROBE AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE FILAMENT_WIDTH_SENSOR PROBE_OFFSET_WIZARD \ + 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 \ + 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 +opt_add FILWIDTH_PIN 5 +exec_test $1 $2 "Mightyboard Rev. E | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." + +######## Other Standard LCD/Panels ############## +# +# ULTRA_LCD +# +#restore_configs +#opt_enable ULTRA_LCD +#exec_test $1 $2 "Stuff" +# +# DOGLCD +# +#restore_configs +#opt_enable DOGLCD +#exec_test $1 $2 "Stuff" +# +# MAKRPANEL +# Needs to use Melzi and Sanguino hardware +# +#restore_configs +#opt_enable MAKRPANEL +#exec_test $1 $2 "Stuff" +# +# REPRAP_DISCOUNT_SMART_CONTROLLER, SDSUPPORT, BABYSTEPPING, RIGIDBOARD_V2, and DAC_MOTOR_CURRENT_DEFAULT +# +#restore_configs +#opt_set MOTHERBOARD BOARD_RIGIDBOARD_V2 +#opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING DAC_MOTOR_CURRENT_DEFAULT +#exec_test $1 $2 "Stuff" +# # +# G3D_PANEL with SDCARD_SORT_ALPHA and STATUS_MESSAGE_SCROLLING +# +#restore_configs +#opt_enable G3D_PANEL SDSUPPORT SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES +#opt_set SDSORT_GCODE true +#opt_set SDSORT_USES_RAM true +#opt_set SDSORT_USES_STACK true +#opt_set SDSORT_CACHE_NAMES true +#exec_test $1 $2 "Stuff" +# +# REPRAPWORLD_KEYPAD +# +# Cant find configuration details to get it to compile +#restore_configs +#opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP +#exec_test $1 $2 "Stuff" +# +# RA_CONTROL_PANEL +# +#restore_configs +#opt_enable RA_CONTROL_PANEL PINS_DEBUGGING +#exec_test $1 $2 "Stuff" + +######## I2C LCD/PANELS ############## +# +# !!!ATTENTION!!! +# Most I2C configurations are failing at the moment because they require +# a different Liquid Crystal library "LiquidTWI2". +# +# LCD_SAINSMART_I2C_1602 +# +#restore_configs +#opt_enable LCD_SAINSMART_I2C_1602 +#exec_test $1 $2 "Stuff" +# +# LCD_I2C_PANELOLU2 +# +#restore_configs +#opt_enable LCD_I2C_PANELOLU2 +#exec_test $1 $2 "Stuff" +# +# LCD_I2C_VIKI +# +#restore_configs +#opt_enable LCD_I2C_VIKI +#exec_test $1 $2 "Stuff" +# +# LCM1602 +# +#restore_configs +#opt_enable LCM1602 +#exec_test $1 $2 "Stuff" + +# +# Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +# +#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 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 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 ############## +# +# Test a full-featured CR-10S config +# +use_example_configs Creality/CR-10S +exec_test $1 $2 "Full-featured CR-10S config" + +# +# BQ Hephestos 2 +#restore_configs +#use_example_configs Hephestos_2 +#exec_test $1 $2 "Stuff" + +# +# Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 +# +use_example_configs delta/generic +opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ + Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ + OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU +opt_set LCD_LANGUAGE ko_KR +opt_set X_DRIVER_TYPE L6470 +opt_set Y_DRIVER_TYPE L6470 +opt_set Z_DRIVER_TYPE L6470 +opt_add L6470_CHAIN_SCK_PIN 53 +opt_add L6470_CHAIN_MISO_PIN 49 +opt_add L6470_CHAIN_MOSI_PIN 40 +opt_add L6470_CHAIN_SS_PIN 42 +opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" +exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." + +# +# Delta Config (FLSUN AC because it's complex) +# +use_example_configs delta/FLSUN/auto_calibrate +exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" + +# +# Makibox Config need to check board type for Teensy++ 2.0 +# +#use_example_configs makibox +#exec_test $1 $2 "Stuff" + +# +# Test mixed TMC config +# +restore_configs +opt_set LCD_LANGUAGE vi +opt_set X_DRIVER_TYPE TMC2160 +opt_set Y_DRIVER_TYPE TMC5160 +opt_set Z_DRIVER_TYPE TMC2208_STANDALONE +opt_set E0_DRIVER_TYPE TMC2130 +opt_set X_MIN_ENDSTOP_INVERTING true +opt_set Y_MIN_ENDSTOP_INVERTING true +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ + MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ + MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ + USE_ZMIN_PLUG SENSORLESS_HOMING TMC_DEBUG M114_DETAIL +exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" + +# +# SCARA with Mixed TMC +# +use_example_configs SCARA/Morgan +opt_set LCD_LANGUAGE es +opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ + MKS_12864OLED EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL Z_SAFE_HOMING \ + STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING +opt_set X_MAX_ENDSTOP_INVERTING false +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set Z_DRIVER_TYPE TMC2130_STANDALONE +opt_set E0_DRIVER_TYPE TMC2660 +exec_test $1 $2 "RAMPS | SCARA | Mixed TMC | EEPROM" + +# +# tvrrug Config need to check board type for sanguino atmega644p +# +#use_example_configs tvrrug/Round2 +#exec_test $1 $2 "Stuff" + +# clean up +restore_configs diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin-tests new file mode 100644 index 00000000..d6350622 --- /dev/null +++ b/buildroot/tests/mks_robin-tests @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin +# (STM32F1 genericSTM32F103ZE) +# + +# exit on first failure +set -e + +use_example_configs Mks/Robin +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_lite-tests b/buildroot/tests/mks_robin_lite-tests new file mode 100644 index 00000000..34809641 --- /dev/null +++ b/buildroot/tests/mks_robin_lite-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F1 genericSTM32F103RC +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE +opt_set SERIAL_PORT -1 +opt_enable EEPROM_SETTINGS +opt_enable SDSUPPORT +exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" + +# cleanup +restore_configs diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests new file mode 100644 index 00000000..1c40ea45 --- /dev/null +++ b/buildroot/tests/mks_robin_mini-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin mini +# (STM32F1 genericSTM32F103VE) +# + +# exit on first failure +set -e + +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 "MKS Robin mini" + +# cleanup +restore_configs diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests new file mode 100644 index 00000000..92c97be7 --- /dev/null +++ b/buildroot/tests/mks_robin_nano35-tests @@ -0,0 +1,46 @@ +#!/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" + +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 diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests new file mode 100644 index 00000000..7ae4670f --- /dev/null +++ b/buildroot/tests/mks_robin_pro-tests @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Build tests for MKS Robin Pro +# + +# exit on first failure +set -e + +use_example_configs Mks/Robin_Pro +opt_enable EMERGENCY_PARSER +opt_set SDCARD_CONNECTION LCD +opt_set X_DRIVER_TYPE TMC2209 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set TEMP_SENSOR_BED 1 +opt_disable THERMAL_PROTECTION_HOTENDS +exec_test $1 $2 "MKS Robin Pro with TMC Drivers, hotend thermal protection disabled" + +# cleanup +#restore_configs diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32-tests new file mode 100644 index 00000000..4aa146fa --- /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/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests new file mode 100644 index 00000000..ec8af16c --- /dev/null +++ b/buildroot/tests/rambo-tests @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# +# Build tests for AVR ATmega2560 RAMBo +# + +# exit on first failure +set -e + +# +# Lots of options - Formerly the first Mega2560 test +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMBO +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 -2 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_BED 2 +opt_set TEMP_SENSOR_PROBE 1 +opt_add TEMP_PROBE_PIN 12 +opt_set TEMP_SENSOR_CHAMBER 3 +opt_add TEMP_CHAMBER_PIN 3 +opt_add HEATER_CHAMBER_PIN 45 +opt_set GRID_MAX_POINTS_X 16 +opt_set FANMUX0_PIN 53 +opt_disable USE_WATCHDOG +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ + PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ + EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ + BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ + NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ + PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU LCD_SHOW_E_TOTAL \ + 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 \ + FWRETRACT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ + 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 ..." + +# +# Full size Rambo Dual Endstop CNC +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMBO +opt_set EXTRUDERS 0 +opt_set TEMP_SENSOR_0 999 +opt_set DUMMY_THERMISTOR_999_VALUE 170 +opt_set DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' +opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ + S_CURVE_ACCELERATION X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS \ + ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES +opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS +exec_test $1 $2 "Rambo CNC Configuration" + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_EINSY_RAMBO +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set Z_DRIVER_TYPE TMC2130 +opt_set E0_DRIVER_TYPE TMC2130 +exec_test $1 $2 "Einsy RAMBo with TMC2130" + +# clean up +restore_configs diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32-tests new file mode 100644 index 00000000..42f9beb9 --- /dev/null +++ b/buildroot/tests/rumba32-tests @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# +# Build tests for rumba32 +# + +# exit on first failure +set -e + +# Build examples +restore_configs +opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 +opt_set SERIAL_PORT -1 +opt_disable PIDTEMP +opt_enable PIDTEMPBED +opt_set TEMP_SENSOR_BED 1 +opt_disable THERMAL_PROTECTION_BED +opt_set X_DRIVER_TYPE TMC2130 +exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" + +# Build examples +restore_configs +opt_set MOTHERBOARD BOARD_RUMBA32_V1_1 +opt_set SERIAL_PORT -1 +opt_enable PIDTEMPBED EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_set TEMP_SENSOR_BED 1 +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2208 +exec_test $1 $2 "RUMBA32 V1.1 with TMC2130, TMC2208, PID Bed, EEPROM settings, and graphic LCD controller" + +# Build examples +restore_configs +opt_set MOTHERBOARD BOARD_RUMBA32_MKS +opt_set SERIAL_PORT -1 +opt_set X_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2208 +exec_test $1 $2 "RUMBA32 MKS Default Config with Mixed TMC Drivers" + +# cleanup +restore_configs diff --git a/buildroot/tests/run_tests b/buildroot/tests/run_tests new file mode 100644 index 00000000..d01107f4 --- /dev/null +++ b/buildroot/tests/run_tests @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# +# run_tests +# +export PATH="$PATH:$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" +export PATH="$PATH:./buildroot/bin" + +# exit on first failure +set -e + +exec_test () { + printf "\n\033[0;32m[Test $2] \033[0m$3...\n" + if platformio run --project-dir $1 -e $2 --silent; then + printf "\033[0;32mPassed\033[0m\n" + return 0 + else + git reset --hard HEAD + printf "\033[0;31mFailed!\033[0m\n" + return 1 + fi +} +export -f exec_test + +printf "Running \033[0;32m$2\033[0m Tests\n" + +if [[ $2 = "ALL" ]]; then + dir_list=("$(dirname "${BASH_SOURCE[0]}")"/*) + declare -a tests=(${dir_list[@]/*run_tests/}) + for f in "${tests[@]}"; do + testenv=$(basename $f | cut -d"-" -f1) + printf "Running \033[0;32m$f\033[0m Tests\n" + exec_test $1 "$testenv --target clean" "Setup Build Environment" + $f $1 $testenv + git reset --hard HEAD + done +else + exec_test $1 "$2 --target clean" "Setup Build Environment" + $2-tests $1 $2 + git reset --hard HEAD +fi +printf "\033[0;32mAll tests completed successfully\033[0m\n" diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests new file mode 100644 index 00000000..7181f961 --- /dev/null +++ b/buildroot/tests/sanguino1284p-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for AVR ATmega 1284p +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 +exec_test $1 $2 "Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/sanguino644p-tests b/buildroot/tests/sanguino644p-tests new file mode 100644 index 00000000..41626b23 --- /dev/null +++ b/buildroot/tests/sanguino644p-tests @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for AVR ATmega 644p +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 +exec_test $1 $2 "Default Configuration" + +# clean up +restore_configs diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests new file mode 100644 index 00000000..be377b15 --- /dev/null +++ b/buildroot/tests/teensy31-tests @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# +# Build tests for Teensy 3.1/3.2 (ARM Cortex-M4) +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY31_32 +exec_test $1 $2 "Teensy3.1 with default config" + +# +# Test many features together +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY31_32 +opt_set TEMP_SENSOR_0 1 +opt_set TEMP_SENSOR_BED 1 +opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCODE \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR DEBUG_LEVELING_FEATURE Z_MIN_PROBE_REPEATABILITY_TEST \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET PRINTCOUNTER SLOW_PWM_HEATERS PIDTEMPBED \ + INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ + NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE PARK_HEAD_ON_PAUSE \ + ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ + PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ + HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT +opt_set I2C_SLAVE_ADDRESS 63 +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Teensy3.1 with many features" diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests new file mode 100644 index 00000000..c729f212 --- /dev/null +++ b/buildroot/tests/teensy35-tests @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +# +# Build tests for Teensy 3.5/3.6 (ARM Cortex-M4) +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +exec_test $1 $2 "Teensy3.5 with default config" + +# +# Test as many features together as possible +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 1 +opt_set TEMP_SENSOR_1 5 +opt_set TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ + FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT M100_FREE_MEMORY_WATCHER \ + ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ + PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ + HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT +opt_set I2C_SLAVE_ADDRESS 63 +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Teensy3.5 with many features" + +# +# Test a Sled Z Probe with Linear leveling +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS +exec_test $1 $2 "Sled Z Probe with Linear leveling" + +# +# Test a Servo Probe +# +# restore_configs +# opt_set MOTHERBOARD BOARD_TEENSY35_36 +# opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ +# AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS +# opt_set NUM_SERVOS 1 +# exec_test $1 $2 "Servo Probe" +# +# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES +# +# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS \ +# EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES +# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" + +# +# Test MAGNETIC_PARKING_EXTRUDER with LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 1 +opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER +exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" + +# +# Mixing Extruder +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_set MIXING_STEPPERS 2 +exec_test $1 $2 "Mixing Extruder" + +# +# Test SWITCHING_EXTRUDER +# +# restore_configs +# opt_set MOTHERBOARD BOARD_TEENSY35_36 +# opt_set EXTRUDERS 2 +# opt_set NUM_SERVOS 1 +# opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER +# exec_test $1 $2 "SWITCHING_EXTRUDER" + +# +# Enable COREXY +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_enable COREXY +opt_set X_DRIVER_TYPE TMC5160 +opt_set Y_DRIVER_TYPE TMC5160 +opt_set X_MIN_ENDSTOP_INVERTING true +opt_set Y_MIN_ENDSTOP_INVERTING true +opt_add X_CS_PIN 46 +opt_add Y_CS_PIN 47 +opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +exec_test $1 $2 "Teensy 3.5/3.6 COREXY" + +# +# Enable COREXZ +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_enable COREXZ +exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" + +# +# Enable Dual Z with Dual Z endstops +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_enable Z_MULTI_ENDSTOPS +opt_set NUM_Z_STEPPER_DRIVERS 2 +pins_set ramps/RAMPS X_MAX_PIN -1 +opt_add Z2_MAX_PIN 2 +opt_enable USE_XMAX_PLUG +exec_test $1 $2 "Dual Z with Dual Z endstops" + +# Clean up +restore_configs diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests new file mode 100644 index 00000000..8d32d131 --- /dev/null +++ b/buildroot/tests/teensy41-tests @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +# +# Build tests for Teensy 4.0/4.1 (ARM Cortex-M7) +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +exec_test $1 $2 "Teensy4.1 with default config" + +# +# Test as many features together as possible +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_0 1 +opt_set TEMP_SENSOR_1 5 +opt_set TEMP_SENSOR_BED 1 +opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ + FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ + FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET \ + PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ + ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ + PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ + HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT +opt_add EXTUI_EXAMPLE +opt_set I2C_SLAVE_ADDRESS 63 +opt_set GRID_MAX_POINTS_X 16 +exec_test $1 $2 "Teensy4.1 with many features" + +# +# Test a Sled Z Probe with Linear leveling +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable EEPROM_SETTINGS Z_PROBE_SLED Z_SAFE_HOMING AUTO_BED_LEVELING_LINEAR DEBUG_LEVELING_FEATURE GCODE_MACROS +exec_test $1 $2 "Sled Z Probe with Linear leveling" + +# +# Test a Servo Probe +# +# restore_configs +# opt_set MOTHERBOARD BOARD_TEENSY41 +# opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ +# AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS +# opt_set NUM_SERVOS 1 +# exec_test $1 $2 "Servo Probe" +# +# ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES +# +# opt_enable AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS \ +# EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES +# exec_test $1 $2 "...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES" + +# +# Test MAGNETIC_PARKING_EXTRUDER with LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set EXTRUDERS 2 +opt_set TEMP_SENSOR_1 1 +opt_enable MAGNETIC_PARKING_EXTRUDER +exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" + +# +# Mixing Extruder +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL +opt_set MIXING_STEPPERS 2 +exec_test $1 $2 "Mixing Extruder" + +# +# Test SWITCHING_EXTRUDER +# +# restore_configs +# opt_set MOTHERBOARD BOARD_TEENSY41 +# opt_set EXTRUDERS 2 +# opt_set NUM_SERVOS 1 +# opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER +# exec_test $1 $2 "SWITCHING_EXTRUDER" + +# +# Enable COREXY +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable COREXY +opt_set X_DRIVER_TYPE TMC5160 +opt_set Y_DRIVER_TYPE TMC5160 +opt_set X_MIN_ENDSTOP_INVERTING true +opt_set Y_MIN_ENDSTOP_INVERTING true +opt_add X_CS_PIN 46 +opt_add Y_CS_PIN 47 +opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +exec_test $1 $2 "Teensy 4.0/4.1 COREXY" + +# +# Enable COREXZ +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable COREXZ +exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" + +# +# Enable Dual Z with Dual Z endstops +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY41 +opt_enable Z_MULTI_ENDSTOPS +opt_set NUM_Z_STEPPER_DRIVERS 2 +pins_set ramps/RAMPS X_MAX_PIN -1 +opt_add Z2_MAX_PIN 2 +opt_enable USE_XMAX_PLUG +exec_test $1 $2 "Dual Z with Dual Z endstops" + +# Clean up +restore_configs diff --git a/config/README.md b/config/README.md new file mode 100644 index 00000000..68cbe1a7 --- /dev/null +++ b/config/README.md @@ -0,0 +1,3 @@ +# Where have all the configurations gone? + +## https://github.com/MarlinFirmware/Configurations/archive/release-2.0.7.2.zip diff --git a/data/www/index.html b/data/www/index.html new file mode 100644 index 00000000..d3291de8 --- /dev/null +++ b/data/www/index.html @@ -0,0 +1,37 @@ + + + + + Marlin + + + + + + +
+ + + +
+
+
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + #controls +
    +
    +
    + + diff --git a/data/www/marlin-logo.png b/data/www/marlin-logo.png new file mode 100644 index 00000000..d0ce7901 Binary files /dev/null and b/data/www/marlin-logo.png differ diff --git a/data/www/marlin.css b/data/www/marlin.css new file mode 100644 index 00000000..b29ec2e2 --- /dev/null +++ b/data/www/marlin.css @@ -0,0 +1,166 @@ +/* CSS reset */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + font-family: Impact, Charcoal, sans-serif; + } +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; + } +body { line-height: 1; } +ol, ul { list-style: none; } +blockquote, q { quotes: none; } +blockquote:before, blockquote:after, +q:before, q:after { content: ''; content: none; } +table { + border-collapse: collapse; + border-spacing: 0; + } + +/* Custom */ + +/* Tabs */ +* { box-sizing: border-box; } +body { + display: flex; + justify-content: center; + padding: 0px; + background: #1e1e1e; + color: #efefef; + } +h1 { + margin: 0; + font-size: 2em; + } +.tabs { + display: flex; + width: 100%; + flex-wrap: wrap; + background: #e5e5e5; + } +.input { + position: absolute; + opacity: 0; + } +.label { + width: 100%; + padding: 18px 28px; + background: #e5e5e5; + cursor: pointer; + font-weight: bold; + font-size: 18px; + color: #7f7f7f; + transition: background 0.1s, color 0.1s; + border-style: solid; + border-width: 0 0 4px 0; + border-color: #acacac; + } +.label:hover { + background: #d8d8d8; + } +.label:active { + background: #ccc; + } +.input:focus + .label { + z-index: 1; + } +.input:checked + .label { + background: #1e1e1e; + color: #efefef; + border-width: 4px 0 0 0; + border-color: #65a57d; + } +.panel { + display: none; + width: 100%; + padding: 20px 30px 30px; + background: #1e1e1e; + color: #e5e5e5; + } +.panel .panel-content { + width: 100%; + max-width: 800px; + } + +@media (min-width: 600px) { + .label { width: auto; } + .panel { order: 99; } +} + +.input:checked + .label + .panel { display: block; } + +#logo { + width: 130px; + height: 58px; + margin-right: 20px; + background: url(marlin-logo.png) no-repeat center center; + } + +input[type="text"], textarea { + background-color: #2c2c2c; + border: solid 2px #314b3b; + color: #e5e5e5; + outline: none; + } + +input[type="text"]:focus, textarea:focus { + border-color: #4d7a5e; + } + +ul#serial-output { + width: 100%; + height: 300px; + overflow-y: scroll; + background-color: #2c2c2c; + border: solid 2px #314b3b; + } + +ul#serial-output li { + padding: 4px; + font-family: "Lucida Console", Monaco, monospace; + font-size: 0.8em; + } + +ul#serial-output li:nth-child(odd) { + background-color: #3c3c3c; + } + +div.form-wrapper { + display: flex; + width: 100%; + margin: 6px 0; + } + +div.form-wrapper input { + font-size: 1.2em; + padding: 4px 6px; + } + +div.form-wrapper input[type="text"] { + flex: 1 1 auto; + } + +div.form-wrapper input[type="submit"], +div.form-wrapper button { + border: solid 2px #314b3b; + background-color: #4d7a5e; + color: #e5e5e5; + } diff --git a/data/www/marlin.js b/data/www/marlin.js new file mode 100644 index 00000000..0a95045a --- /dev/null +++ b/data/www/marlin.js @@ -0,0 +1,24 @@ +document.addEventListener('DOMContentLoaded', () => { + const ws = new WebSocket(`ws://${location.host}/ws`); + + ws.onmessage = (e) => { + if (typeof e.data === 'string') { + let node = document.createElement('li'); + let text = document.createTextNode(e.data); + node.appendChild(text); + document.getElementById('serial-output').appendChild(node); + } + }; + + document.getElementById('serial-command-form').addEventListener('submit', (e) => { + e.preventDefault(); + + let value = document.getElementById('serial-command').value.trim(); + + if (!value) return; + + ws.send(`${value}\n`); + + document.getElementById('serial-command').value = ''; + }); +}); diff --git a/docs/Bresenham.md b/docs/Bresenham.md new file mode 100644 index 00000000..59a21509 --- /dev/null +++ b/docs/Bresenham.md @@ -0,0 +1,269 @@ +On the Bresenham algorithm as implemented by Marlin: +(Taken from (https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html) + +The basic Bresenham algorithm: + +Consider drawing a line on a raster grid where we restrict the allowable slopes of the line to the range 0 <= m <= 1 + +If we further restrict the line-drawing routine so that it always increments x as it plots, it becomes clear that, having plotted a point at (x,y), the routine has a severely limited range of options as to where it may put the next point on the line: + +- It may plot the point (x+1,y), or: +- It may plot the point (x+1,y+1). + +So, working in the first positive octant of the plane, line drawing becomes a matter of deciding between two possibilities at each step. + +We can draw a diagram of the situation which the plotting program finds itself in having plotted (x,y). + +``` + y+1 +--------------* + | / + | / + | / + | / + | y+e+m*--------+- + | /| ^ | + | / | |m | + | / | | | + | / | v | + | y+e*----|----- |m+ε + | /| | ^ | + | / | | |ε | + | / | | | | + |/ | | v v + y *----+----+----------+-- + x x+1 +``` + +In plotting (x,y) the line drawing routine will, in general, be making a compromise between what it would like to draw and what the resolution of the stepper motors actually allows it to draw. Usually the plotted point (x,y) will be in error, the actual, mathematical point on the line will not be addressable on the pixel grid. So we associate an error, ε, with each y ordinate, the real value of y should be y+ε . This error will range from -0.5 to just under +0.5. + +In moving from x to x+1 we increase the value of the true (mathematical) y-ordinate by an amount equal to the slope of the line, m. We will choose to plot (x+1,y) if the difference between this new value and y is less than 0.5 + +``` +y + ε + m < y + 0.5 +``` + +Otherwise we will plot (x+1,y+1). It should be clear that by so doing we minimize the total error between the mathematical line segment and what actually gets drawn on the display. + +The error resulting from this new point can now be written back into ε, this will allow us to repeat the whole process for the next point along the line, at x+2. + +The new value of error can adopt one of two possible values, depending on what new point is plotted. If (x+1,y) is chosen, the new value of error is given by: + +``` +ε[new] = (y + ε + m) - y +``` + +Otherwise, it is: + +``` +ε[new] = (y + ε + m) - (y + 1) +``` + +This gives an algorithm for a DDA which avoids rounding operations, instead using the error variable ε to control plotting: + +``` + ε = 0, y = y[1] + for x = x1 to x2 do + Plot point at (x,y) + if (ε + m < 0.5) + ε = ε + m + else + y = y + 1, ε = ε + m - 1 + endif + endfor +``` + +This still employs floating point values. Consider, however, what happens if we multiply across both sides of the plotting test by Δx and then by 2: + +``` + ε + m < 0.5 + ε + Δy/Δx < 0.5 +2.ε.Δx + 2.Δy < Δx +``` + +All quantities in this inequality are now integral. + +Substitute ε' for ε.Δx . The test becomes: + +``` +2.(ε' + Δy) < Δx +``` + +This gives an integer-only test for deciding which point to plot. + +The update rules for the error on each step may also be cast into ε' form. Consider the floating-point versions of the update rules: + +``` +ε = ε + m +ε = ε + m - 1 +``` + + Multiplying through by Δx yields: + +``` +ε.Δx = ε.Δx + Δy +ε.Δx = ε.Δx + Δy - Δx +``` + +Which is in ε' form: + +``` +ε' = ε' + Δy +ε' = ε' + Δy - Δx +``` + +Using this new ``error'' value, ε' with the new test and update equations gives Bresenham's integer-only line drawing algorithm: + +``` +ε' = 0, y = y[1] +for x = x1 to x2 do + Plot point at (x,y) + if (2.(ε' + Δy) < Δx) + ε' = ε' + Δy + else + y = y + 1, ε' = ε' + Δy - Δx + endif +endfor +``` + +It is a Integer only algorithm - hence efficient (fast). And the Multiplication by 2 can be implemented by left-shift. 0 <= m <= 1 + +### Oversampling Bresenham algorithm: + +Even if Bresenham does NOT lose steps at all, and also does NOT accumulate error, there is a concept i would call "time resolution" - If the quotient between major axis and minor axis (major axis means, in this context, the axis that must create more step pulses compared with the other ones, including the extruder) + +Well, if the quotient result is not an integer, then Bresenham, at some points in the movement of the major axis, must decide that it has to move the minor axis. It is done in such way that after the full major axis movement has executed, it also has executed the full movements of the minor axis. And the minor axis steps were properly distributed evenly along the major axis movement. So good so far. + +But, as said, Bresenham has "discrete" decision points: It can only decide to move (or not to move) minor axis exactly at the moment the major axis moves. And that is not the ideal point (in time) usually. + +With slow movements that are composed of a similar, but not equal number of steps in all axes, the problem worsens, as the decision points are distributed very sparsely, and there are large delays between those decision points. + +It is nearly trivial to extend Bresenham to "oversample" in that situation: Let's do it: + +Assume that we want to use Bresenham to calculate when to step (move in Y direction), but we want to do it, not for integer increments of the X axis, rather than, for fractional increments. + +Let's call 'r' the count of subdivisions we want to split an integer increment of the X axis: + +``` +m = Δy/Δx = increment of y due to the increment of x1 +``` + +Every time we move `1/r` in the X axis, then the Y axis should move `m.1/r` + +But, as stated previously, due to the resolution of the screen, there are 2 choices: + +- It may plot the point `(x+(1/r),y)`, or: +- It may plot the point `(x+(1/r),y+1)`. + +That decision must be made keeping the error as small as possible: + +``` +-0.5 < ε < 0.5 +``` + +So, the proper condition for that decision is (`m/r` is the increment of y due to the fractional `1/r` increment of `x`): + +``` +y + ε + m/r < y + 0.5 +ε + m/r < 0.5 [1] +``` + +Once we did the decision, then the error update conditions are: + +Decision A: +``` +ε[new] = y + ε + m/r - y +ε[new] = ε + m/r [2] +``` + +Decision B: +``` +ε[new] = y + ε + m/r - (y+1) +ε[new] = ε + m/r - 1 [3] +``` + +We replace m in the decision inequality [1] by its definition: + +``` +ε + m/r < 0.5 +ε + ΔY/(ΔX*r) < 0.5 +``` + +Then, we multiply it by `2.Δx.r`: + +``` +ε + ΔY/(ΔX*r) < 0.5 +2.ΔX.ε.r + 2.ΔY < ΔX.r +``` + +If we define `ε' = 2.ε.ΔX.r` then it becomes: + +``` +ε' + 2.ΔY < ΔX.r [4] +``` + +Now, for the update rules, we multiply by 2.r.ΔX + +``` +ε[new] = ε + m/r +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.r.ΔX.ΔY/ΔX/r +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.ΔY +ε'[new] = ε' + 2.ΔY [6] +``` + +``` +ε[new] = ε + m/r - 1 +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.r.ΔX.ΔY/ΔX/r - 1 . 2.r.ΔX +2.r.ΔX.ε[new] = 2.r.ΔX.ε + 2.ΔY - 2.ΔX.r +ε'[new] = ε' + 2.ΔY - 2.ΔX.r [7] +``` + +All expressions, the decision inequality [4], and the update equations [5] and [6] are integer valued. There is no need for floating point arithmetic at all. + +Summarizing: + +``` +Condition equation: + + ε' + 2.ΔY < ΔX.r [4] + +Error update equations: + + ε'[new] = ε' + 2.ΔY [6] + + ε'[new] = ε' + 2.ΔY - 2.ΔX.r [7] +``` + +This can be implemented in C as: + +```cpp + class OversampledBresenham { + private: + long divisor, // stepsX + dividend, // stepsY + advanceDivisor, // advanceX + advanceDividend; // advanceY + int errorAccumulator; // Error accumulator + + public: + unsigned int ticker; + + OversampledBresenhan(const long& inDividend, const long& inDivisor, int rate) { + ticker = 0; + divisor = inDivisor; + dividend = inDividend; + advanceDivisor = divisor * 2 * rate; + advanceDividend = dividend * 2; + errorAccumulator = -divisor * rate; + } + + bool tick() { + errorAccumulator += advanceDividend; + const bool over = errorAccumulator >= 0; + if (over) { + ticker++; + errorAccumulator -= advanceDivisor; + } + return over; + } + }; +``` diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 00000000..7bec6d1c --- /dev/null +++ b/platformio.ini @@ -0,0 +1,1401 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# +# For detailed documentation with EXAMPLES: +# +# https://docs.platformio.org/en/latest/projectconf/index.html +# + +# Automatic targets - enable auto-uploading +#targets = upload + +# +# By default platformio build will abort after 5 errors. +# Remove '-fmax-errors=5' from build_flags below to see all. +# + +[platformio] +src_dir = Marlin +boards_dir = buildroot/share/PlatformIO/boards +default_envs = artillery_ruby +include_dir = Marlin + +# +# The 'common' values are used for most Marlin builds +# +[common] +default_src_filter = + - - + + - - - - - - + - - + - + - - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - - + - - + - + - + - + - + - + - + - - + - - + - - + - - + - - + - + - - + - - + - + - - + - - + - - + - + - + - + - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - - + - + - + - - + - - + - + - - + - + - - + - - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - - + - + - + - - + - + - + - + - + - - + - +extra_scripts = + pre:buildroot/share/PlatformIO/scripts/common-dependencies.py + pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py + post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py +build_flags = -fmax-errors=5 -g -D__MARLIN_FIRMWARE__ -fmerge-all-constants +lib_deps = + +# +# Feature Dependencies +# +[features] +HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip + src_filter=+ + extra_scripts=download_mks_assets.py +HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 + src_filter=+ + + + + +HAS_STEALTHCHOP = src_filter=+ +SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +HAS_MOTOR_CURRENT_I2C = 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 +USES_LIQUIDCRYSTAL = LiquidCrystal@1.5.0 +USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 +HAS_WIRED_LCD = src_filter=+ +HAS_MARLINUI_HD44780 = src_filter=+ +HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 + src_filter=+ +HAS_(FSMC|SPI)_TFT = src_filter=+ + + +HAS_FSMC_TFT = src_filter=+ + +HAS_SPI_TFT = src_filter=+ + +HAS_GRAPHICAL_TFT = src_filter=+ +DWIN_CREALITY_LCD = src_filter=+ +IS_TFTGLCD_PANEL = src_filter=+ +HAS_TOUCH_XPT2046 = src_filter=+ +HAS_LCD_MENU = 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_PASSWORD = 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_CHIRON = src_filter=+ + +ANYCUBIC_LCD_I3MEGA = src_filter=+ + +HAS_DGUS_LCD = src_filter=+ + +TOUCH_UI_FTDI_EVE = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ +USB_FLASH_DRIVE_SUPPORT = 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=+ +HAS_MOTOR_CURRENT_DAC = src_filter=+ +DIRECT_STEPPING = src_filter=+ + +EMERGENCY_PARSER = src_filter=+ - +I2C_POSITION_ENCODERS = src_filter=+ +IIC_BL24CXX_EEPROM = src_filter=+ +HAS_SPI_FLASH = 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=+ + +PASSWORD_FEATURE = 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=+ + +MECHANICAL_GANTRY_CAL.+ = 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=+ +DIRECT_PIN_CONTROL = 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=+ +PIDTEMP = src_filter=+ +PREVENT_COLD_EXTRUSION = src_filter=+ +PIDTEMPBED = src_filter=+ +HAS_USER_THERMISTORS = src_filter=+ +SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ +BAUD_RATE_GCODE = src_filter=+ +HAS_SMART_EFF_MOD = 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_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=+ + +AUTO_REPORT_TEMPERATURES = 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 + lib_ignore=ESPAsyncTCP + +# +# 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 +monitor_flags = + --quiet + --echo + --eol + LF + --filter + colorize + --filter + time + +################################# +# # +# Unique Core Architectures # +# # +# Add a new "env" below if no # +# entry has values suitable to # +# build for a given board. # +# # +################################# + +################################# +# # +# AVR Architecture # +# # +################################# + +# +# AVR (8-bit) Common Environment values +# +[common_avr8] +board_build.f_cpu = 16000000L +src_filter = ${common.default_src_filter} + + +# +# ATmega2560 +# +[env:mega2560] +platform = atmelavr +extends = common_avr8 +board = megaatmega2560 + +# +# ATmega2560 with extended pins 70-85 defined +# BOARD_BQ_ZUM_MEGA_3D +# BOARD_ULTIMAIN_2 +# BOARD_MIGHTYBOARD_REVE +# BOARD_EINSTART_S +# +[env:mega2560ext] +platform = atmelavr +extends = env:mega2560 +board = megaatmega2560 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + +# +# ATmega1280 +# +[env:mega1280] +platform = atmelavr +extends = common_avr8 +board = megaatmega1280 + +# +# MightyBoard ATmega2560 (MegaCore 100 pin boards variants) +# +[env:MightyBoard1280] +platform = atmelavr +extends = common_avr8 +board = ATmega1280 +upload_speed = 57600 + +# +# MightyBoard ATmega2560 (MegaCore 100 pin boards variants) +# +[env:MightyBoard2560] +platform = atmelavr +extends = common_avr8 +board = ATmega2560 +upload_protocol = wiring +upload_speed = 57600 +board_upload.maximum_size = 253952 + +# +# RAMBo +# +[env:rambo] +platform = atmelavr +extends = common_avr8 +board = reprap_rambo + +# +# FYSETC F6 V1.3 +# +[env:FYSETC_F6_13] +platform = atmelavr +extends = common_avr8 +board = fysetc_f6_13 + +# +# FYSETC F6 V1.4 +# +[env:FYSETC_F6_14] +platform = atmelavr +extends = common_avr8 +board = fysetc_f6_14 + +# +# Sanguinololu (ATmega644p) +# +[env:sanguino644p] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega644p + +# +# Sanguinololu (ATmega1284p) +# +[env:sanguino1284p] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +board_upload.maximum_size = 126976 + +# +# Melzi and clones (ATmega1284p) +# +[env:melzi] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +upload_speed = 57600 +board_upload.maximum_size = 126976 + +# +# Melzi and clones (Optiboot bootloader) +# +[env:melzi_optiboot] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +upload_speed = 115200 + +# +# Melzi and clones (Zonestar Melzi2 with tuned flags) +# +[env:melzi_optimized] +platform = atmelavr +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 + +# +# AT90USB1286 boards using CDC bootloader +# - BRAINWAVE +# - BRAINWAVE_PRO +# - SAV_MKI +# - TEENSYLU +# +[env:at90usb1286_cdc] +platform = teensy +extends = common_avr8 +board = at90usb1286 +lib_ignore = ${env:common_avr8.lib_ignore} Teensy_ADC + +# +# AT90USB1286 boards using DFU bootloader +# - PrintrBoard +# - PrintrBoard Rev.F +# - ? 5DPRINT ? +# +[env:at90usb1286_dfu] +platform = teensy +extends = env:at90usb1286_cdc + +################################# +# # +# DUE Architecture # +# # +################################# + +# +# Due (Atmel SAM3X8E ARM Cortex-M3) +# +# - RAMPS4DUE +# - RADDS +# +[env:DUE] +platform = atmelsam +board = due +src_filter = ${common.default_src_filter} + + + +[env:DUE_USB] +platform = atmelsam +extends = env:DUE +board = dueUSB + +[env:DUE_debug] +# Used when WATCHDOG_RESET_MANUAL is enabled +platform = atmelsam +extends = env:DUE +build_flags = ${common.build_flags} + -funwind-tables + -mpoke-function-name + +# +# Archim SAM +# +[common_DUE_archim] +platform = atmelsam +extends = env:DUE +board = archim +build_flags = ${common.build_flags} + -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON +board_build.variants_dir = buildroot/share/PlatformIO/variants/ +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/DUE/upload_extra_script.py + +[env:DUE_archim] +platform = ${common_DUE_archim.platform} +extends = common_DUE_archim + +# Used when WATCHDOG_RESET_MANUAL is enabled +[env:DUE_archim_debug] +platform = ${common_DUE_archim.platform} +extends = common_DUE_archim +build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function-name + +################################# +# # +# SAMD51 Architecture # +# # +################################# + +# +# Adafruit Grand Central M4 (Atmel SAMD51P20A ARM Cortex-M4) +# +[env:SAMD51_grandcentral_m4] +platform = atmelsam +board = adafruit_grandcentral_m4 +build_flags = ${common.build_flags} -std=gnu++17 +build_unflags = -std=gnu++11 +src_filter = ${common.default_src_filter} + +lib_deps = ${common.lib_deps} + SoftwareSerialM + Adafruit SPIFlash +custom_marlin.SDSUPPORT = SdFat - Adafruit Fork +debug_tool = jlink + +################################# +# # +# LPC176x Architecture # +# # +################################# + +# +# NXP LPC176x ARM Cortex-M3 +# +[common_LPC] +platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip +platform_packages = framework-arduino-lpc176x@^0.2.5 +board = nxp_lpc1768 +lib_ldf_mode = off +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 = ${common.lib_deps} + Servo +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 + #-mpoke-function-name + +# +# NXP LPC176x ARM Cortex-M3 +# +[env:LPC1768] +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1768 + +[env:LPC1769] +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1769 + +################################# +# # +# STM32 Architecture # +# # +################################# + +# +# HAL/STM32 Base Environment values +# +[common_stm32] +platform = ststm32@~8.0 +build_flags = ${common.build_flags} + -std=gnu++14 + -DUSBCON -DUSBD_USE_CDC + -DTIM_IRQ_PRIO=13 +build_unflags = -std=gnu++11 +src_filter = ${common.default_src_filter} + + + +# +# HAL/STM32F1 Common Environment values +# +[common_stm32f1] +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 +src_filter = ${common.default_src_filter} + +lib_ignore = SPI +lib_deps = ${common.lib_deps} + SoftwareSerialM + +# +# STM32F103RC +# +[env:STM32F103RC] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +platform_packages = tool-stm32duino +monitor_speed = 115200 + +# +# MEEB_3DP (STM32F103RCT6 with 512K) +# +[env:STM32F103RC_meeb] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = MEEB_3DP +platform_packages = tool-stm32duino +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 + -DSS_TIMER=4 + -DSTM32_FLASH_SIZE=512 + -DHSE_VALUE=12000000U + -DUSE_USB_COMPOSITE + -DVECT_TAB_OFFSET=0x2000 + -DGENERIC_BOOTLOADER +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} + SoftwareSerialM + USBComposite for STM32F1@0.91 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use +debug_tool = stlink +upload_protocol = dfu + +# +# STM32F103RC_fysetc +# +[env:STM32F103RC_fysetc] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC +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 +upload_protocol = serial + +# +# BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3) +# +# STM32F103RC_btt ............. RCT6 with 256K +# STM32F103RC_btt_USB ......... RCT6 with 256K (USB mass storage) +# STM32F103RC_btt_512K ........ RCT6 with 512K +# STM32F103RC_btt_512K_USB .... RCT6 with 512K (USB mass storage) +# +# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP +# and experience a printer freeze, re-flash Marlin using the regular (non-512K) +# build option. 256K chips may be re-branded 512K chips, but this means the +# upper 256K is sketchy, and failure is very likely. +# + +[env:STM32F103RC_btt] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC +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 + +[env:STM32F103RC_btt_USB] +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 + +[env:STM32F103RC_btt_512K] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt +board_upload.maximum_size=524288 +build_flags = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512 + +[env:STM32F103RC_btt_512K_USB] +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 + +# +# STM32F103RE +# +[env:STM32F103RE] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RE +platform_packages = tool-stm32duino +monitor_speed = 115200 + +# +# STM32F103RE_btt ............. RET6 +# STM32F103RE_btt_USB ......... RET6 (USB mass storage) +# +[env:STM32F103RE_btt] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RE +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 + +[env:STM32F103RE_btt_USB] +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 + +# +# STM32F4 with STM32GENERIC +# +[env:STM32F4] +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 +src_filter = ${common.default_src_filter} + - + +# +# STM32F7 with STM32GENERIC +# +[env:STM32F7] +platform = ${common_stm32.platform} +board = remram_v1 +build_flags = ${common.build_flags} -DUSE_STM32GENERIC -DSTM32GENERIC -DSTM32F7 -DMENU_USB_SERIAL -DMENU_SERIAL=SerialUSB -DHAL_IWDG_MODULE_ENABLED +src_filter = ${common.default_src_filter} + - + +# +# ST NUCLEO-F767ZI Development Board +# This environment is for testing purposes prior to control boards +# being readily available based on STM32F7 MCUs +# +[env:NUCLEO_F767ZI] +platform = ${common_stm32.platform} +extends = common_stm32 +board = nucleo_f767zi +build_flags = ${common_stm32.build_flags} -DTIMER_SERIAL=TIM9 + +# +# ARMED (STM32) +# +[env:ARMED] +platform = ${common_stm32.platform} +extends = common_stm32 +board = armed_v1 +build_flags = ${common_stm32.build_flags} + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing + +# +# Geeetech GTM32 (STM32F103VET6) +# +[env:STM32F103VE_GTM32] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +build_flags = ${common_stm32f1.build_flags} + -ffunction-sections -fdata-sections -nostdlib -MMD + -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 + +# +# Longer 3D board in Alfawise U20 (STM32F103VET6) +# +[env:STM32F103VE_longer] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +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} + -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 +lib_ignore = ${common_stm32f1.lib_ignore} + +# +# MKS Robin Mini (STM32F103VET6) +# +[env:mks_robin_mini] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_mini.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE + +# +# MKS Robin Nano (STM32F103VET6) +# +[env:mks_robin_nano35] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + +# +# MKS Robin (STM32F103ZET6) +# +[env:mks_robin] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103ZE +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin.py +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) +# +[env:mks_robin_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_pro.py + + +# +# TRIGORILLA PRO (STM32F103ZET6) +# +[env:trigorilla_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin +extra_scripts = ${common.extra_scripts} + +# +# MKS Robin E3D (STM32F103RCT6) and +# MKS Robin E3 with TMC2209 +# +[env:mks_robin_e3] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +platform_packages = tool-stm32duino +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 + +# +# MKS Robin E3p (STM32F103VET6) +# - LVGL UI +# +[env:mks_robin_e3p] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + +# +# MKS Robin Lite/Lite2 (STM32F103RCT6) +# +[env:mks_robin_lite] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite.py + + +# +# MKS ROBIN LITE3 (STM32F103RCT6) +# +[env:mks_robin_lite3] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite3.py + +# +# JGAurora A5S A1 (STM32F103ZET6) +# +[env:jgaurora_a5s_a1] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103ZE +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 + +# +# Malyan M200 (STM32F103CB) +# +[env:STM32F103CB_malyan] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = malyanM200 +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} + SoftwareSerialM + +# +# Malyan M200 v2 (STM32F070RB) +# +[env:STM32F070RB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanM200v2 +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing + -DCUSTOM_STARTUP_FILE + +# +# 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 = ${common_stm32.platform} +extends = common_stm32 +board = malyanm300_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED +src_filter = ${common.default_src_filter} + + +# +# Chitu boards like Tronxy X5s (STM32F103ZET6) +# +[env:chitu_f103] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = CHITU_F103 +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} + -DSTM32F1xx -DSTM32_XL_DENSITY +build_unflags = ${common_stm32f1.build_unflags} + -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 + +# +# Some Chitu V5 boards have a problem with GPIO init. +# Use this target if G28 or G29 are always failing. +# +[env:chitu_v5_gpio_init] +platform = ${common_stm32f1.platform} +extends = env:chitu_f103 +build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX + +# +# Creality (STM32F103RET6) +# +[env:STM32F103RET6_creality] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RE +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 +upload_protocol = jlink +monitor_speed = 115200 + +# +# STM32F401VE +# 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html +# +[env:STM32F401VE_STEVAL] +platform = ${common_stm32.platform} +extends = common_stm32 +board = STEVAL_STM32F401VE +build_flags = ${common_stm32.build_flags} + -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 + +# +# FLYF407ZG +# +[env:FLYF407ZG] +platform = ${common_stm32.platform} +extends = common_stm32 +board = FLYF407ZG +build_flags = ${common_stm32.build_flags} + -DVECT_TAB_OFFSET=0x8000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# FLY MINI(stm32f103rct6) +# +[env:FLY_MINI] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/fly_mini.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 + +# +# FYSETC S6 (STM32F446VET6 ARM Cortex-M4) +# +[env:FYSETC_S6] +platform = ${common_stm32.platform} +extends = common_stm32 +platform_packages = tool-stm32duino +board = marlin_fysetc_s6 +build_flags = ${common_stm32.build_flags} + -DVECT_TAB_OFFSET=0x10000 + -DHAL_PCD_MODULE_ENABLED +extra_scripts = ${common.extra_scripts} + 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" + +# +# STM32F407VET6 with RAMPS-like shield +# 'Black' STM32F407VET6 board - https://wiki.stm32duino.com/index.php?title=STM32F407 +# Shield - https://github.com/jmz52/Hardware +# +[env:STM32F407VE_black] +platform = ${common_stm32.platform} +extends = common_stm32 +board = blackSTM32F407VET6 +build_flags = ${common_stm32.build_flags} + -DARDUINO_BLACK_F407VE + -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) +# +[env:BIGTREE_SKR_PRO] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_SKR_Pro +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 +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 +debug_init_break = + +# +# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) +# +[env:BIGTREE_GTR_V1_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} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + +# +# BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) +# +[env:BIGTREE_BTT002] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_Btt002 +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 + -DHAVE_HWSERIAL2 + -DHAVE_HWSERIAL3 + -DPIN_SERIAL2_RX=PD_6 + -DPIN_SERIAL2_TX=PD_5 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# Lerdge base +# +[lerdge_common] +platform = ${common_stm32.platform} +extends = common_stm32 +board = LERDGE +board_build.offset = 0x10000 +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} + -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 + -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE + -DTRANSFER_CLOCK_DIV=8 -DHAL_SRAM_MODULE_ENABLED +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 +# +[env:rumba32] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} + -Os + -DHAL_PCD_MODULE_ENABLED + -DDISABLE_GENERIC_SERIALUSB + -DHAL_UART_MODULE_ENABLED + -DTIMER_SERIAL=TIM9 +board = rumba32_f446ve +upload_protocol = dfu +monitor_speed = 500000 + +################################# +# # +# Other Architectures # +# # +################################# + +# +# Espressif ESP32 +# +[env:esp32] +platform = espressif32@1.11.2 +board = esp32dev +build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 +src_filter = ${common.default_src_filter} + +upload_speed = 115200 +#upload_port = marlinesp.local +#board_build.flash_mode = qio + +# +# Teensy 3.1 / 3.2 (ARM Cortex-M4) +# +[env:teensy31] +platform = teensy +board = teensy31 +src_filter = ${common.default_src_filter} + + +# +# Teensy 3.5 / 3.6 (ARM Cortex-M4) +# +[env:teensy35] +platform = teensy +board = teensy35 +src_filter = ${common.default_src_filter} + + +[env:teensy36] +platform = teensy +board = teensy36 +src_filter = ${common.default_src_filter} + + +# +# Teensy 4.0 / 4.1 (ARM Cortex-M7) +# +[env:teensy41] +platform = teensy +board = teensy41 +src_filter = ${common.default_src_filter} + + +# +# Native +# No supported Arduino libraries, base Marlin only +# +[env:linux_native] +platform = native +framework = +build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined +src_build_flags = -Wall -IMarlin/src/HAL/LINUX/include +build_unflags = -Wall +lib_ldf_mode = off +lib_deps = +src_filter = ${common.default_src_filter} + + +# +# Just print the dependency tree +# +[env:include_tree] +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 = + + +# +# Artillery Ruby +# +[env:artillery_ruby] +platform = ${common_stm32.platform} +extends = common_stm32 +board = Artillery_Ruby +build_flags = ${common_stm32.build_flags} + -DTARGET_STM32F4 + -DARDUINO_ARCH_STM32 + -DSTM32F401xC + -DDISABLE_GENERIC_SERIALUSB + -DUSBD_USE_CDC_COMPOSITE + -DUSE_USB_FS + -DUSB_PRODUCT=\"Artillery_3D_Printer\" + -DFLASH_DATA_SECTOR=1U + -DFLASH_BASE_ADDRESS=0x08004000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + post:buildroot/share/PlatformIO/scripts/generate_hex.py diff --git a/process-palette.json b/process-palette.json new file mode 100644 index 00000000..b3b05b99 --- /dev/null +++ b/process-palette.json @@ -0,0 +1,357 @@ +{ + "patterns": { + "P1": { + "expression": "(path):(line)" + }, + "P2": { + "expression": "(path)\\s+(line)", + "path": "(?:\\/[\\w\\.\\-]+)+" + } + }, + "commands": [ + { + "namespace": "process-palette", + "action": "PIO Build", + "command": "python buildroot/share/vscode/auto_build.py build", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": true, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": "", + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Clean", + "command": "python buildroot/share/vscode/auto_build.py clean", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Upload", + "command": "python buildroot/share/vscode/auto_build.py upload", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Upload (traceback)", + "command": "python buildroot/share/vscode/auto_build.py traceback", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Upload using Programmer", + "command": "python buildroot/share/vscode/auto_build.py program", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Test", + "command": "python buildroot/share/vscode/auto_build.py test", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Debug", + "command": "python buildroot/share/vscode/auto_build.py debug", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + }, + { + "namespace": "process-palette", + "action": "PIO Remote", + "command": "python buildroot/share/vscode/auto_build.py remote", + "arguments": [], + "cwd": "{projectPath}", + "inputDialogs": [], + "env": {}, + "keystroke": null, + "stream": true, + "outputTarget": "panel", + "outputBufferSize": 80000, + "maxCompleted": 3, + "autoShowOutput": true, + "autoHideOutput": false, + "scrollLockEnabled": false, + "singular": false, + "promptToSave": true, + "saveOption": "none", + "patterns": [ + "default" + ], + "successOutput": "{stdout}", + "errorOutput": "{stdout}\n{stderr}", + "fatalOutput": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "startMessage": null, + "successMessage": "Executed : {fullCommand}", + "errorMessage": "Executed : {fullCommand}\nReturned with code {exitStatus}\n{stderr}", + "fatalMessage": "Failed to execute : {fullCommand}\n{stdout}\n{stderr}", + "menus": [ + "Auto Build" + ], + "startScript": null, + "successScript": null, + "errorScript": null, + "scriptOnStart": false, + "scriptOnSuccess": false, + "scriptOnError": false, + "notifyOnStart": false, + "notifyOnSuccess": true, + "notifyOnError": true, + "input": null + } + ] +}